From 64ba3f394c830ec48a1c31b53dcae312c56f1604 Mon Sep 17 00:00:00 2001 From: Marc Fiuczynski Date: Mon, 2 Apr 2007 21:21:36 +0000 Subject: [PATCH] linux 2.6.16.38 w/ vs2.0.3-rc1 --- .gitignore | 11 - CREDITS | 74 +- Documentation/BUG-HUNTING | 113 - Documentation/Changes | 33 +- Documentation/CodingStyle | 100 +- Documentation/DMA-API.txt | 49 +- Documentation/DMA-mapping.txt | 36 +- Documentation/DocBook/Makefile | 15 +- Documentation/DocBook/deviceiobook.tmpl | 19 + Documentation/DocBook/kernel-api.tmpl | 66 +- Documentation/DocBook/kernel-locking.tmpl | 2 +- Documentation/DocBook/libata.tmpl | 137 +- Documentation/DocBook/mtdnand.tmpl | 17 +- Documentation/DocBook/videobook.tmpl | 2 +- Documentation/HOWTO | 3 +- Documentation/IPMI.txt | 4 +- Documentation/RCU/checklist.txt | 44 +- Documentation/RCU/torture.txt | 34 +- Documentation/RCU/whatisRCU.txt | 24 +- Documentation/README.DAC960 | 6 +- Documentation/SubmittingPatches | 12 +- Documentation/acpi-hotkey.txt | 2 +- Documentation/aoe/mkdevs.sh | 2 - Documentation/aoe/udev.txt | 1 - Documentation/arm/Booting | 2 +- Documentation/arm/IXP4xx | 2 +- Documentation/arm/README | 2 +- Documentation/arm/SA1100/Assabet | 2 +- Documentation/arm/SA1100/LART | 2 +- .../arm/Samsung-S3C24XX/Overview.txt | 71 +- Documentation/arm/Setup | 2 +- Documentation/atomic_ops.txt | 28 +- Documentation/block/biodoc.txt | 14 +- Documentation/cachetlb.txt | 21 - Documentation/cciss.txt | 1 - Documentation/connector/connector.txt | 5 +- Documentation/cpu-freq/index.txt | 2 +- Documentation/cpu-freq/user-guide.txt | 5 +- Documentation/cpu-hotplug.txt | 16 +- Documentation/cpusets.txt | 82 +- Documentation/cputopology.txt | 4 +- Documentation/devices.txt | 153 +- Documentation/digiepca.txt | 2 +- Documentation/dontdiff | 1 - Documentation/driver-model/overview.txt | 2 +- Documentation/drivers/edac/edac.txt | 168 +- Documentation/dvb/avermedia.txt | 10 +- Documentation/dvb/bt8xx.txt | 140 +- Documentation/dvb/get_dvb_firmware | 2 +- Documentation/dvb/readme.txt | 32 +- Documentation/fb/fbcon.txt | 180 +- Documentation/filesystems/00-INDEX | 54 +- Documentation/filesystems/Locking | 9 +- .../filesystems/automount-support.txt | 2 +- .../filesystems/configfs/configfs_example.c | 19 +- Documentation/filesystems/ext3.txt | 8 - Documentation/filesystems/fuse.txt | 118 +- Documentation/filesystems/inotify.txt | 130 +- Documentation/filesystems/isofs.txt | 4 +- Documentation/filesystems/jfs.txt | 2 +- Documentation/filesystems/ntfs.txt | 5 - Documentation/filesystems/porting | 7 +- Documentation/filesystems/proc.txt | 6 +- .../filesystems/ramfs-rootfs-initramfs.txt | 146 +- Documentation/filesystems/sysfs.txt | 5 - Documentation/filesystems/udf.txt | 14 - Documentation/filesystems/vfat.txt | 6 +- Documentation/filesystems/vfs.txt | 235 +- Documentation/firmware_class/README | 17 + .../firmware_class/firmware_sample_driver.c | 14 +- .../firmware_sample_firmware_class.c | 1 + Documentation/fujitsu/frv/kernel-ABI.txt | 192 +- Documentation/hwmon/lm83 | 17 +- Documentation/hwmon/sysfs-interface | 274 +- Documentation/hwmon/userspace-tools | 17 +- Documentation/hwmon/w83627hf | 4 - Documentation/hwmon/w83781d | 24 - Documentation/i2c/busses/i2c-i801 | 3 +- Documentation/i2c/busses/i2c-nforce2 | 2 - Documentation/i2c/busses/i2c-parport | 16 +- Documentation/i2c/busses/i2c-piix4 | 42 +- Documentation/i2c/busses/i2c-sis96x | 4 +- Documentation/i2c/busses/i2c-viapro | 7 +- 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-parport.txt | 11 +- Documentation/input/joystick.txt | 1 + Documentation/ioctl-number.txt | 5 +- Documentation/kbuild/makefiles.txt | 194 +- Documentation/kbuild/modules.txt | 100 +- Documentation/kdump/gdbmacros.txt | 2 +- Documentation/kdump/kdump.txt | 420 +- Documentation/kernel-parameters.txt | 127 +- Documentation/keys-request-key.txt | 54 +- Documentation/keys.txt | 89 +- Documentation/kobject.txt | 2 +- Documentation/laptop-mode.txt | 10 +- Documentation/m68k/README.buddha | 2 +- Documentation/md.txt | 67 - Documentation/mips/time.README | 10 +- Documentation/mtrr.txt | 23 +- Documentation/networking/00-INDEX | 2 + Documentation/networking/README.ipw2100 | 12 +- Documentation/networking/README.ipw2200 | 54 +- Documentation/networking/bonding.txt | 323 +- Documentation/networking/e100.txt | 158 +- Documentation/networking/e1000.txt | 620 +- Documentation/networking/ifenslave.c | 2 +- Documentation/networking/ip-sysctl.txt | 74 +- Documentation/networking/netdevices.txt | 8 +- Documentation/networking/packet_mmap.txt | 10 +- Documentation/networking/pktgen.txt | 22 +- Documentation/networking/ray_cs.txt | 2 +- Documentation/networking/tuntap.txt | 13 +- Documentation/networking/vortex.txt | 81 +- Documentation/nfsroot.txt | 284 +- Documentation/pci.txt | 30 +- Documentation/pcmcia/devicetable.txt | 36 +- Documentation/pcmcia/driver-changes.txt | 6 - Documentation/pnp.txt | 3 - Documentation/power/devices.txt | 90 + Documentation/power/swsusp.txt | 103 +- Documentation/power/video.txt | 80 +- Documentation/powerpc/booting-without-of.txt | 93 +- .../powerpc/eeh-pci-error-recovery.txt | 15 +- Documentation/powerpc/hvcs.txt | 4 +- Documentation/ramdisk.txt | 12 +- Documentation/rpc-cache.txt | 121 +- Documentation/rtc.txt | 7 +- Documentation/s390/driver-model.txt | 15 +- Documentation/scsi/00-INDEX | 2 + Documentation/scsi/ChangeLog.megaraid | 148 - Documentation/scsi/ChangeLog.megaraid_sas | 29 - Documentation/scsi/aacraid.txt | 8 +- Documentation/scsi/ppa.txt | 2 + Documentation/scsi/scsi_eh.txt | 14 +- Documentation/scsi/scsi_mid_low_api.txt | 19 + Documentation/scsi/tmscsim.txt | 2 +- Documentation/serial-console.txt | 11 +- Documentation/serial/driver | 31 +- Documentation/smart-config.txt | 4 + .../sound/alsa/ALSA-Configuration.txt | 181 +- .../alsa/DocBook/writing-an-alsa-driver.tmpl | 82 +- Documentation/sound/oss/Introduction | 2 +- Documentation/sound/oss/cs46xx | 16 +- Documentation/sparc/sbus_drivers.txt | 95 +- Documentation/sparse.txt | 36 +- Documentation/spi/spi-summary | 34 +- Documentation/spinlocks.txt | 2 +- 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/ibmcam.txt | 4 +- Documentation/usb/ov511.txt | 4 +- Documentation/usb/proc_usb_info.txt | 2 +- Documentation/usb/sn9c102.txt | 99 +- Documentation/usb/usb-help.txt | 3 +- Documentation/usb/usb-serial.txt | 4 +- Documentation/usb/usbmon.txt | 32 +- Documentation/usb/w9968cf.txt | 30 +- Documentation/video4linux/CARDLIST.bttv | 4 +- Documentation/video4linux/CARDLIST.cx88 | 12 +- Documentation/video4linux/CARDLIST.em28xx | 1 - Documentation/video4linux/CARDLIST.saa7134 | 1 - Documentation/video4linux/CARDLIST.tuner | 9 +- Documentation/video4linux/CQcam.txt | 241 +- Documentation/video4linux/README.cpia | 4 +- Documentation/video4linux/Zoran | 131 +- Documentation/video4linux/bttv/CONTRIBUTORS | 8 +- Documentation/video4linux/bttv/ICs | 4 +- Documentation/video4linux/bttv/PROBLEMS | 16 +- Documentation/video4linux/bttv/README.quirks | 4 +- Documentation/video4linux/bttv/THANKS | 4 +- Documentation/video4linux/radiotrack.txt | 16 +- Documentation/video4linux/w9966.txt | 2 +- Documentation/video4linux/zr36120.txt | 4 +- Documentation/vm/hugetlbpage.txt | 31 +- Documentation/vm/page_migration | 114 +- Documentation/w1/w1.generic | 18 +- Documentation/watchdog/pcwd-watchdog.txt | 75 +- Documentation/watchdog/watchdog-api.txt | 53 +- Documentation/watchdog/watchdog.txt | 23 +- Documentation/x86_64/boot-options.txt | 33 - Kbuild | 2 +- MAINTAINERS | 445 +- Makefile | 521 +- README | 25 +- arch/alpha/Kconfig | 13 - arch/alpha/boot/bootp.c | 2 +- arch/alpha/boot/bootpz.c | 2 +- arch/alpha/boot/main.c | 2 +- arch/alpha/kernel/alpha_ksyms.c | 18 +- arch/alpha/kernel/console.c | 1 + arch/alpha/kernel/core_marvel.c | 2 +- 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 | 13 +- arch/alpha/kernel/pci.c | 5 +- arch/alpha/kernel/process.c | 10 +- arch/alpha/kernel/proto.h | 1 + arch/alpha/kernel/setup.c | 87 +- arch/alpha/kernel/signal.c | 2 +- arch/alpha/kernel/smc37c93x.c | 1 + arch/alpha/kernel/smp.c | 14 +- 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 | 19 +- arch/alpha/kernel/sys_wildfire.c | 6 +- arch/alpha/kernel/systbls.S | 9 +- arch/alpha/kernel/time.c | 6 +- arch/alpha/kernel/traps.c | 1 + arch/alpha/kernel/vmlinux.lds.S | 1 + arch/alpha/lib/callback_srm.S | 1 + arch/alpha/lib/ev6-memchr.S | 2 +- arch/alpha/lib/fpreg.c | 8 +- arch/alpha/lib/udelay.c | 1 + arch/alpha/mm/extable.c | 1 + arch/alpha/mm/fault.c | 1 + arch/alpha/mm/init.c | 3 +- arch/alpha/mm/numa.c | 5 +- arch/alpha/oprofile/common.c | 2 +- arch/arm/Kconfig | 184 +- arch/arm/Kconfig.debug | 2 +- arch/arm/Makefile | 28 +- arch/arm/boot/Makefile | 5 +- arch/arm/boot/bootp/Makefile | 5 +- arch/arm/boot/compressed/Makefile | 4 + 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 | 1 + arch/arm/boot/compressed/head-xscale.S | 1 + arch/arm/boot/compressed/head.S | 200 +- arch/arm/boot/compressed/ll_char_wr.S | 6 +- arch/arm/boot/compressed/misc.c | 41 +- arch/arm/boot/compressed/vmlinux.lds.in | 1 - arch/arm/common/Makefile | 2 - arch/arm/common/dmabounce.c | 73 +- arch/arm/common/gic.c | 21 +- arch/arm/common/locomo.c | 115 +- arch/arm/common/rtctime.c | 109 +- arch/arm/common/sa1111.c | 67 +- arch/arm/common/scoop.c | 18 +- arch/arm/common/sharpsl_pm.c | 40 +- arch/arm/common/time-acorn.c | 3 +- arch/arm/common/via82c505.c | 1 + arch/arm/common/vic.c | 52 +- arch/arm/configs/at91rm9200dk_defconfig | 3 +- arch/arm/configs/at91rm9200ek_defconfig | 3 +- arch/arm/configs/collie_defconfig | 430 +- arch/arm/configs/csb337_defconfig | 38 +- arch/arm/configs/csb637_defconfig | 1 - arch/arm/configs/enp2611_defconfig | 303 +- arch/arm/configs/ixdp2400_defconfig | 305 +- arch/arm/configs/ixdp2401_defconfig | 305 +- arch/arm/configs/ixdp2800_defconfig | 303 +- arch/arm/configs/ixdp2801_defconfig | 305 +- arch/arm/configs/lpd7a400_defconfig | 135 +- arch/arm/configs/lpd7a404_defconfig | 430 +- arch/arm/configs/omap_h2_1610_defconfig | 129 +- arch/arm/configs/s3c2410_defconfig | 213 +- arch/arm/configs/versatile_defconfig | 390 +- arch/arm/kernel/Makefile | 10 +- arch/arm/kernel/apm.c | 5 +- arch/arm/kernel/armksyms.c | 27 +- arch/arm/kernel/asm-offsets.c | 12 - arch/arm/kernel/bios32.c | 23 +- arch/arm/kernel/calls.S | 13 - arch/arm/kernel/compat.c | 1 + arch/arm/kernel/debug.S | 2 + arch/arm/kernel/dma-isa.c | 23 +- arch/arm/kernel/ecard.c | 14 +- arch/arm/kernel/entry-armv.S | 60 +- arch/arm/kernel/entry-common.S | 5 +- arch/arm/kernel/entry-header.S | 19 + arch/arm/kernel/fiq.c | 1 - arch/arm/kernel/head.S | 235 +- arch/arm/kernel/irq.c | 954 +- arch/arm/kernel/isa.c | 63 +- arch/arm/kernel/iwmmxt.S | 27 +- arch/arm/kernel/module.c | 1 + arch/arm/kernel/process.c | 128 +- arch/arm/kernel/ptrace.c | 37 +- arch/arm/kernel/setup.c | 72 +- arch/arm/kernel/signal.c | 266 +- arch/arm/kernel/signal.h | 2 +- arch/arm/kernel/smp.c | 4 + arch/arm/kernel/sys_arm.c | 5 - arch/arm/kernel/time.c | 25 +- arch/arm/kernel/traps.c | 17 +- arch/arm/kernel/vmlinux.lds.S | 9 +- arch/arm/lib/Makefile | 15 +- arch/arm/lib/backtrace.S | 18 +- arch/arm/lib/bitops.h | 1 + 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_template.S | 2 +- arch/arm/lib/copy_to_user.S | 4 +- arch/arm/lib/csumipv6.S | 2 +- arch/arm/lib/delay.S | 38 +- arch/arm/lib/div64.S | 4 +- arch/arm/lib/ecard.S | 4 +- arch/arm/lib/findbit.S | 10 +- arch/arm/lib/io-acorn.S | 1 + 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/aaed2000.c | 7 +- arch/arm/mach-aaec2000/core.c | 8 +- arch/arm/mach-aaec2000/core.h | 1 - arch/arm/mach-at91rm9200/Kconfig | 88 +- arch/arm/mach-at91rm9200/Makefile | 38 +- arch/arm/mach-at91rm9200/board-csb337.c | 43 +- arch/arm/mach-at91rm9200/board-csb637.c | 34 +- arch/arm/mach-at91rm9200/board-dk.c | 68 +- arch/arm/mach-at91rm9200/board-ek.c | 58 +- arch/arm/mach-at91rm9200/clock.c | 211 +- arch/arm/mach-at91rm9200/devices.c | 553 +- arch/arm/mach-at91rm9200/generic.h | 15 +- arch/arm/mach-at91rm9200/gpio.c | 105 +- arch/arm/mach-at91rm9200/irq.c | 110 +- arch/arm/mach-at91rm9200/time.c | 4 +- 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-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 | 15 +- 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-footbridge/time.c | 17 +- 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 | 564 +- arch/arm/mach-imx/generic.c | 63 +- arch/arm/mach-imx/irq.c | 8 +- arch/arm/mach-imx/mx1ads.c | 94 +- arch/arm/mach-imx/time.c | 4 +- arch/arm/mach-integrator/core.c | 49 +- arch/arm/mach-integrator/impd1.c | 7 +- arch/arm/mach-integrator/integrator_ap.c | 7 +- arch/arm/mach-integrator/integrator_cp.c | 14 +- arch/arm/mach-integrator/pci_v3.c | 3 +- arch/arm/mach-integrator/time.c | 18 +- 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 | 5 +- arch/arm/mach-iop3xx/iop331-time.c | 2 +- arch/arm/mach-iop3xx/iq31244-pci.c | 4 +- arch/arm/mach-iop3xx/iq80321-pci.c | 4 +- arch/arm/mach-iop3xx/iq80331-pci.c | 4 +- arch/arm/mach-iop3xx/iq80332-pci.c | 4 +- arch/arm/mach-ixp2000/Kconfig | 9 +- arch/arm/mach-ixp2000/Makefile | 2 +- arch/arm/mach-ixp2000/core.c | 23 +- 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 | 101 +- arch/arm/mach-ixp4xx/Kconfig | 14 +- arch/arm/mach-ixp4xx/Makefile | 25 +- arch/arm/mach-ixp4xx/common-pci.c | 5 +- arch/arm/mach-ixp4xx/common.c | 10 +- arch/arm/mach-ixp4xx/coyote-pci.c | 1 - arch/arm/mach-ixp4xx/gtwx5715-setup.c | 7 +- arch/arm/mach-ixp4xx/ixdp425-pci.c | 2 +- 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 | 2 - arch/arm/mach-lh7a40x/irq-kev7a400.c | 4 +- arch/arm/mach-lh7a40x/irq-lh7a400.c | 8 +- arch/arm/mach-lh7a40x/irq-lh7a404.c | 32 +- arch/arm/mach-lh7a40x/irq-lpd7a40x.c | 4 +- arch/arm/mach-lh7a40x/time.c | 8 +- arch/arm/mach-omap1/Kconfig | 27 +- arch/arm/mach-omap1/Makefile | 12 +- arch/arm/mach-omap1/board-generic.c | 2 +- arch/arm/mach-omap1/board-h2.c | 200 +- arch/arm/mach-omap1/board-h3.c | 278 +- arch/arm/mach-omap1/board-innovator.c | 131 +- arch/arm/mach-omap1/board-osk.c | 150 +- arch/arm/mach-omap1/board-palmte.c | 12 +- arch/arm/mach-omap1/board-perseus2.c | 123 +- arch/arm/mach-omap1/board-voiceblue.c | 6 +- arch/arm/mach-omap1/clock.c | 27 +- arch/arm/mach-omap1/clock.h | 91 +- arch/arm/mach-omap1/devices.c | 46 +- arch/arm/mach-omap1/fpga.c | 9 +- arch/arm/mach-omap1/id.c | 1 + arch/arm/mach-omap1/io.c | 5 +- arch/arm/mach-omap1/irq.c | 22 +- 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 | 31 +- arch/arm/mach-omap1/serial.c | 10 +- arch/arm/mach-omap1/time.c | 204 +- arch/arm/mach-omap2/Kconfig | 4 - arch/arm/mach-omap2/Makefile | 7 +- arch/arm/mach-omap2/board-h4.c | 174 +- arch/arm/mach-omap2/clock.c | 117 +- arch/arm/mach-omap2/clock.h | 39 +- arch/arm/mach-omap2/devices.c | 93 +- arch/arm/mach-omap2/id.c | 1 + arch/arm/mach-omap2/io.c | 24 +- arch/arm/mach-omap2/irq.c | 4 +- arch/arm/mach-omap2/mux.c | 72 +- arch/arm/mach-omap2/serial.c | 2 +- arch/arm/mach-omap2/sram-fn.S | 5 +- arch/arm/mach-omap2/timer-gp.c | 86 +- arch/arm/mach-pxa/Kconfig | 25 - arch/arm/mach-pxa/Makefile | 7 +- arch/arm/mach-pxa/corgi.c | 39 +- arch/arm/mach-pxa/corgi_pm.c | 23 +- arch/arm/mach-pxa/corgi_ssp.c | 65 +- arch/arm/mach-pxa/dma.c | 17 +- arch/arm/mach-pxa/generic.c | 6 - 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/lubbock.c | 89 +- arch/arm/mach-pxa/mainstone.c | 15 +- arch/arm/mach-pxa/pm.c | 1 + arch/arm/mach-pxa/poodle.c | 115 +- arch/arm/mach-pxa/pxa25x.c | 1 + arch/arm/mach-pxa/pxa27x.c | 1 + arch/arm/mach-pxa/sharpsl_pm.c | 17 +- arch/arm/mach-pxa/sleep.S | 3 +- arch/arm/mach-pxa/spitz.c | 42 +- 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 | 3 +- arch/arm/mach-pxa/tosa.c | 38 +- arch/arm/mach-realview/core.c | 31 +- arch/arm/mach-realview/realview_eb.c | 6 +- arch/arm/mach-rpc/dma.c | 2 +- arch/arm/mach-s3c2410/Kconfig | 78 +- arch/arm/mach-s3c2410/Makefile | 46 +- arch/arm/mach-s3c2410/bast-irq.c | 6 +- arch/arm/mach-s3c2410/clock.c | 357 +- arch/arm/mach-s3c2410/clock.h | 21 +- arch/arm/mach-s3c2410/cpu.c | 116 +- 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 | 105 +- arch/arm/mach-s3c2410/mach-bast.c | 27 +- arch/arm/mach-s3c2410/mach-h1940.c | 19 +- arch/arm/mach-s3c2410/mach-nexcoder.c | 2 +- arch/arm/mach-s3c2410/mach-otom.c | 2 +- arch/arm/mach-s3c2410/mach-rx3715.c | 44 +- arch/arm/mach-s3c2410/mach-smdk2410.c | 15 +- arch/arm/mach-s3c2410/mach-smdk2440.c | 19 +- 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 | 93 +- arch/arm/mach-s3c2410/s3c2440-irq.c | 80 +- arch/arm/mach-s3c2410/s3c2440.c | 234 +- arch/arm/mach-s3c2410/sleep.S | 11 +- arch/arm/mach-s3c2410/time.c | 12 +- arch/arm/mach-s3c2410/usb-simtec.c | 4 +- arch/arm/mach-sa1100/Kconfig | 2 +- arch/arm/mach-sa1100/Makefile | 2 +- arch/arm/mach-sa1100/assabet.c | 2 +- arch/arm/mach-sa1100/cerf.c | 2 +- arch/arm/mach-sa1100/collie.c | 103 +- arch/arm/mach-sa1100/cpu-sa1100.c | 2 +- arch/arm/mach-sa1100/cpu-sa1110.c | 131 +- arch/arm/mach-sa1100/dma.c | 2 +- arch/arm/mach-sa1100/generic.c | 7 +- arch/arm/mach-sa1100/h3600.c | 5 +- arch/arm/mach-sa1100/irq.c | 28 +- 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/neponset.c | 8 - 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 | 3 +- 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 | 24 +- 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 | 109 +- arch/arm/mm/Makefile | 12 +- arch/arm/mm/alignment.c | 1 + arch/arm/mm/cache-v4wb.S | 27 +- arch/arm/mm/consistent.c | 21 +- arch/arm/mm/copypage-v3.S | 2 +- arch/arm/mm/fault.c | 1 + arch/arm/mm/flush.c | 26 - arch/arm/mm/init.c | 13 +- arch/arm/mm/ioremap.c | 272 +- arch/arm/mm/mm-armv.c | 56 +- arch/arm/mm/mmap.c | 1 + arch/arm/mm/proc-arm1020.S | 33 +- arch/arm/mm/proc-arm1020e.S | 53 +- arch/arm/mm/proc-arm1022.S | 52 +- arch/arm/mm/proc-arm1026.S | 52 +- arch/arm/mm/proc-arm6_7.S | 32 - arch/arm/mm/proc-arm720.S | 39 +- arch/arm/mm/proc-arm920.S | 45 +- arch/arm/mm/proc-arm922.S | 45 +- arch/arm/mm/proc-arm925.S | 53 +- arch/arm/mm/proc-arm926.S | 50 +- arch/arm/mm/proc-macros.S | 10 - arch/arm/mm/proc-sa110.S | 58 +- arch/arm/mm/proc-sa1100.S | 70 +- arch/arm/mm/proc-syms.c | 8 - arch/arm/mm/proc-v6.S | 73 +- arch/arm/mm/proc-xscale.S | 95 +- 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/common.c | 34 +- arch/arm/oprofile/op_counter.h | 2 +- arch/arm/oprofile/op_model_xscale.c | 2 +- arch/arm/plat-omap/Kconfig | 6 +- arch/arm/plat-omap/Makefile | 6 +- arch/arm/plat-omap/clock.c | 73 +- arch/arm/plat-omap/common.c | 1 + arch/arm/plat-omap/cpu-omap.c | 18 +- arch/arm/plat-omap/devices.c | 168 +- arch/arm/plat-omap/dma.c | 94 +- arch/arm/plat-omap/dmtimer.c | 426 +- arch/arm/plat-omap/gpio.c | 183 +- arch/arm/plat-omap/mcbsp.c | 345 +- arch/arm/plat-omap/mux.c | 1 + arch/arm/plat-omap/ocpi.c | 4 + arch/arm/plat-omap/pm.c | 3 +- arch/arm/plat-omap/sram-fn.S | 1 + arch/arm/plat-omap/sram.c | 153 +- arch/arm/plat-omap/usb.c | 1 + arch/arm/tools/mach-types | 142 +- arch/arm/vfp/Makefile | 5 +- arch/arm/vfp/entry.S | 2 - arch/arm/vfp/vfp.h | 18 +- arch/arm/vfp/vfpdouble.c | 75 +- arch/arm/vfp/vfphw.S | 18 +- arch/arm/vfp/vfpmodule.c | 80 +- arch/arm/vfp/vfpsingle.c | 66 +- arch/arm26/Kconfig | 10 +- arch/arm26/Makefile | 7 +- arch/arm26/boot/Makefile | 5 +- arch/arm26/boot/compressed/head.S | 1 + arch/arm26/kernel/armksyms.c | 4 + 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 | 17 +- arch/arm26/kernel/process.c | 1 + arch/arm26/kernel/ptrace.c | 1 + 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 | 13 +- 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 | 10 +- arch/arm26/nwfpe/fpmodule.c | 1 + arch/arm26/nwfpe/fpmodule.h | 1 + arch/cris/Kconfig | 12 - 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 | 4 +- 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 | 2 + arch/cris/kernel/irq.c | 15 +- arch/cris/kernel/process.c | 3 +- arch/cris/kernel/setup.c | 8 +- arch/cris/mm/init.c | 2 +- arch/frv/Kconfig | 8 - arch/frv/kernel/asm-offsets.c | 116 +- arch/frv/kernel/break.S | 35 +- arch/frv/kernel/cmode.S | 1 + arch/frv/kernel/debug-stub.c | 13 +- arch/frv/kernel/entry-table.S | 1 + arch/frv/kernel/entry.S | 30 +- arch/frv/kernel/frv_ksyms.c | 21 + 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 | 2 +- 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 | 29 +- arch/frv/kernel/local.h | 3 - arch/frv/kernel/pm-mb93093.c | 1 + arch/frv/kernel/pm.c | 46 +- arch/frv/kernel/process.c | 18 +- arch/frv/kernel/ptrace.c | 1 + arch/frv/kernel/semaphore.c | 1 + arch/frv/kernel/setup.c | 5 +- arch/frv/kernel/signal.c | 22 +- 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 | 84 +- arch/frv/kernel/traps.c | 26 +- arch/frv/kernel/uaccess.c | 6 +- arch/frv/mb93090-mb00/pci-frv.c | 4 +- arch/frv/mb93090-mb00/pci-irq.c | 11 +- arch/frv/mb93090-mb00/pci-vdk.c | 12 +- arch/frv/mm/dma-alloc.c | 5 +- arch/frv/mm/extable.c | 1 + arch/frv/mm/init.c | 7 +- arch/frv/mm/kmap.c | 7 +- arch/frv/mm/mmu-context.c | 7 +- arch/frv/mm/tlb-flush.S | 1 + arch/frv/mm/tlb-miss.S | 1 + arch/frv/mm/unaligned.c | 1 + arch/h8300/Kconfig | 8 - arch/h8300/kernel/gpio.c | 1 + arch/h8300/kernel/h8300_ksyms.c | 3 + arch/h8300/kernel/ints.c | 4 +- arch/h8300/kernel/process.c | 5 +- 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 | 5 +- 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 | 4 +- arch/h8300/platform/h8s/ints_h8s.c | 1 + arch/i386/Kconfig | 315 +- arch/i386/Kconfig.cpu | 6 +- arch/i386/Kconfig.debug | 18 +- arch/i386/Makefile | 40 +- arch/i386/Makefile.cpu | 6 +- arch/i386/boot/Makefile | 41 +- arch/i386/boot/compressed/misc.c | 36 +- arch/i386/boot/edd.S | 2 - arch/i386/boot/setup.S | 3 +- arch/i386/boot/video.S | 30 +- arch/i386/crypto/aes-i586-asm.S | 29 +- arch/i386/crypto/aes.c | 20 +- arch/i386/defconfig | 117 +- arch/i386/kernel/Makefile | 36 +- arch/i386/kernel/acpi/Makefile | 4 - arch/i386/kernel/acpi/boot.c | 25 +- arch/i386/kernel/acpi/earlyquirk.c | 23 +- arch/i386/kernel/acpi/processor.c | 2 +- arch/i386/kernel/acpi/sleep.c | 19 +- arch/i386/kernel/acpi/wakeup.S | 16 +- arch/i386/kernel/apic.c | 77 +- arch/i386/kernel/apm.c | 73 +- arch/i386/kernel/asm-offsets.c | 14 +- arch/i386/kernel/bootflag.c | 1 + arch/i386/kernel/cpu/Makefile | 5 - arch/i386/kernel/cpu/amd.c | 24 +- arch/i386/kernel/cpu/centaur.c | 1 - arch/i386/kernel/cpu/common.c | 89 +- arch/i386/kernel/cpu/cpufreq/Kconfig | 24 +- arch/i386/kernel/cpu/cpufreq/acpi-cpufreq.c | 315 +- .../i386/kernel/cpu/cpufreq/cpufreq-nforce2.c | 75 +- arch/i386/kernel/cpu/cpufreq/elanfreq.c | 109 +- arch/i386/kernel/cpu/cpufreq/gx-suspmod.c | 183 +- arch/i386/kernel/cpu/cpufreq/longhaul.c | 241 +- arch/i386/kernel/cpu/cpufreq/longhaul.h | 4 +- arch/i386/kernel/cpu/cpufreq/longrun.c | 1 + arch/i386/kernel/cpu/cpufreq/p4-clockmod.c | 25 +- arch/i386/kernel/cpu/cpufreq/powernow-k6.c | 16 +- arch/i386/kernel/cpu/cpufreq/powernow-k7.c | 19 +- arch/i386/kernel/cpu/cpufreq/powernow-k8.c | 407 +- arch/i386/kernel/cpu/cpufreq/powernow-k8.h | 52 +- .../kernel/cpu/cpufreq/speedstep-centrino.c | 285 +- arch/i386/kernel/cpu/cpufreq/speedstep-lib.c | 42 +- arch/i386/kernel/cpu/cpufreq/speedstep-lib.h | 20 +- arch/i386/kernel/cpu/cpufreq/speedstep-smi.c | 52 +- arch/i386/kernel/cpu/cyrix.c | 11 +- arch/i386/kernel/cpu/intel.c | 19 +- arch/i386/kernel/cpu/intel_cacheinfo.c | 200 +- arch/i386/kernel/cpu/mcheck/k7.c | 1 + arch/i386/kernel/cpu/mcheck/mce.c | 5 +- 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/mtrr/Makefile | 7 - arch/i386/kernel/cpu/mtrr/main.c | 13 +- arch/i386/kernel/cpu/proc.c | 14 +- arch/i386/kernel/cpuid.c | 11 +- arch/i386/kernel/crash.c | 18 +- arch/i386/kernel/dmi_scan.c | 526 +- arch/i386/kernel/doublefault.c | 3 +- arch/i386/kernel/efi.c | 34 +- arch/i386/kernel/efi_stub.S | 1 + arch/i386/kernel/entry.S | 361 +- arch/i386/kernel/head.S | 20 +- arch/i386/kernel/i386_ksyms.c | 2 + arch/i386/kernel/i387.c | 3 +- arch/i386/kernel/i8259.c | 13 +- arch/i386/kernel/io_apic.c | 134 +- arch/i386/kernel/ioport.c | 1 - arch/i386/kernel/irq.c | 38 +- arch/i386/kernel/kprobes.c | 335 +- arch/i386/kernel/machine_kexec.c | 17 +- arch/i386/kernel/mca.c | 1 + arch/i386/kernel/microcode.c | 111 +- arch/i386/kernel/module.c | 32 +- arch/i386/kernel/mpparse.c | 63 +- arch/i386/kernel/msr.c | 12 +- arch/i386/kernel/nmi.c | 87 +- arch/i386/kernel/numaq.c | 11 +- arch/i386/kernel/process.c | 144 +- arch/i386/kernel/ptrace.c | 16 +- arch/i386/kernel/quirks.c | 1 + arch/i386/kernel/reboot.c | 1 + arch/i386/kernel/reboot_fixups.c | 2 + arch/i386/kernel/scx200.c | 67 +- arch/i386/kernel/semaphore.c | 9 +- arch/i386/kernel/setup.c | 242 +- arch/i386/kernel/signal.c | 11 +- arch/i386/kernel/smp.c | 41 +- arch/i386/kernel/smpboot.c | 171 +- arch/i386/kernel/srat.c | 20 +- arch/i386/kernel/sys_i386.c | 25 +- arch/i386/kernel/syscall_table.S | 17 +- arch/i386/kernel/sysenter.c | 151 +- arch/i386/kernel/time.c | 165 +- arch/i386/kernel/time_hpet.c | 1 + arch/i386/kernel/timers/timer_hpet.c | 2 +- arch/i386/kernel/timers/timer_pm.c | 104 +- arch/i386/kernel/timers/timer_tsc.c | 6 +- arch/i386/kernel/topology.c | 37 +- arch/i386/kernel/traps.c | 432 +- arch/i386/kernel/vm86.c | 15 +- arch/i386/kernel/vmlinux.lds.S | 51 +- arch/i386/kernel/vsyscall-sigreturn.S | 2 +- arch/i386/kernel/vsyscall-sysenter.S | 7 +- 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-es7000/es7000.h | 5 +- arch/i386/mach-es7000/es7000plat.c | 6 +- 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 | 17 +- arch/i386/mach-generic/summit.c | 1 + arch/i386/mach-visws/mpparse.c | 1 + arch/i386/mach-visws/reboot.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 | 12 +- arch/i386/mach-voyager/voyager_smp.c | 13 +- arch/i386/mach-voyager/voyager_thread.c | 2 + arch/i386/mm/Makefile | 8 - arch/i386/mm/boot_ioremap.c | 8 +- arch/i386/mm/discontig.c | 15 +- arch/i386/mm/extable.c | 1 + arch/i386/mm/fault.c | 267 +- arch/i386/mm/hugetlbpage.c | 13 + arch/i386/mm/init.c | 92 +- arch/i386/mm/mmap.c | 6 +- arch/i386/mm/pageattr.c | 43 +- arch/i386/mm/pgtable.c | 17 +- arch/i386/oprofile/Makefile | 4 - arch/i386/oprofile/nmi_int.c | 25 +- 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/Makefile | 11 +- arch/i386/pci/common.c | 37 +- arch/i386/pci/direct.c | 28 +- arch/i386/pci/i386.c | 17 +- arch/i386/pci/irq.c | 26 +- arch/i386/pci/mmconfig.c | 81 +- arch/i386/pci/pcbios.c | 10 +- arch/i386/pci/pci.h | 6 +- arch/i386/pci/visws.c | 1 + arch/i386/power/Makefile | 4 +- arch/i386/power/cpu.c | 5 +- arch/ia64/Kconfig | 122 +- arch/ia64/Makefile | 23 +- arch/ia64/configs/gensparse_defconfig | 1 - arch/ia64/configs/sn2_defconfig | 79 +- arch/ia64/configs/tiger_defconfig | 4 +- arch/ia64/defconfig | 3 +- arch/ia64/dig/setup.c | 23 +- 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 | 10 +- arch/ia64/ia32/Makefile | 1 - arch/ia64/ia32/binfmt_elf32.c | 6 +- arch/ia64/ia32/ia32_entry.S | 2 +- arch/ia64/ia32/ia32priv.h | 5 +- arch/ia64/ia32/sys_ia32.c | 113 +- arch/ia64/kernel/Makefile | 4 +- arch/ia64/kernel/acpi-ext.c | 144 +- arch/ia64/kernel/acpi.c | 111 +- arch/ia64/kernel/asm-offsets.c | 42 +- arch/ia64/kernel/cpufreq/acpi-cpufreq.c | 1 + arch/ia64/kernel/efi.c | 195 +- arch/ia64/kernel/efi_stub.S | 2 +- arch/ia64/kernel/entry.S | 63 +- arch/ia64/kernel/entry.h | 2 +- arch/ia64/kernel/gate.S | 114 +- arch/ia64/kernel/gate.lds.S | 25 +- arch/ia64/kernel/head.S | 14 +- arch/ia64/kernel/ia64_ksyms.c | 12 +- arch/ia64/kernel/iosapic.c | 359 +- arch/ia64/kernel/irq.c | 38 +- arch/ia64/kernel/irq_ia64.c | 285 +- arch/ia64/kernel/irq_lsapic.c | 10 +- arch/ia64/kernel/ivt.S | 2 +- arch/ia64/kernel/kprobes.c | 71 +- arch/ia64/kernel/machvec.c | 20 +- arch/ia64/kernel/mca.c | 261 +- arch/ia64/kernel/mca_asm.S | 39 +- arch/ia64/kernel/mca_drv.c | 77 +- arch/ia64/kernel/mca_drv.h | 7 - arch/ia64/kernel/mca_drv_asm.S | 14 +- arch/ia64/kernel/minstate.h | 1 + arch/ia64/kernel/module.c | 3 +- arch/ia64/kernel/numa.c | 37 +- arch/ia64/kernel/pal.S | 23 +- arch/ia64/kernel/palinfo.c | 56 +- arch/ia64/kernel/patch.c | 79 +- arch/ia64/kernel/perfmon.c | 23 +- arch/ia64/kernel/perfmon_default_smpl.c | 1 + arch/ia64/kernel/process.c | 13 +- arch/ia64/kernel/ptrace.c | 14 +- arch/ia64/kernel/sal.c | 7 +- arch/ia64/kernel/salinfo.c | 4 +- arch/ia64/kernel/setup.c | 200 +- arch/ia64/kernel/signal.c | 103 + arch/ia64/kernel/smpboot.c | 224 +- arch/ia64/kernel/sys_ia64.c | 1 + arch/ia64/kernel/time.c | 14 +- arch/ia64/kernel/topology.c | 403 +- arch/ia64/kernel/traps.c | 12 +- arch/ia64/kernel/uncached.c | 256 +- arch/ia64/kernel/vmlinux.lds.S | 55 +- arch/ia64/lib/Makefile | 4 +- arch/ia64/lib/clear_page.S | 1 + arch/ia64/lib/io.c | 1 + arch/ia64/lib/memcpy_mck.S | 10 +- arch/ia64/mm/Makefile | 2 +- arch/ia64/mm/contig.c | 29 +- arch/ia64/mm/discontig.c | 119 +- arch/ia64/mm/extable.c | 1 + arch/ia64/mm/fault.c | 39 +- arch/ia64/mm/hugetlbpage.c | 13 +- arch/ia64/mm/init.c | 100 +- arch/ia64/mm/numa.c | 1 + arch/ia64/mm/tlb.c | 13 +- arch/ia64/oprofile/perfmon.c | 1 + arch/ia64/pci/pci.c | 28 +- arch/ia64/sn/kernel/Makefile | 3 +- arch/ia64/sn/kernel/bte.c | 3 +- arch/ia64/sn/kernel/huberror.c | 4 +- arch/ia64/sn/kernel/io_init.c | 38 +- arch/ia64/sn/kernel/irq.c | 169 +- arch/ia64/sn/kernel/setup.c | 32 +- arch/ia64/sn/kernel/sn2/cache.c | 15 +- arch/ia64/sn/kernel/sn2/prominfo_proc.c | 1 + arch/ia64/sn/kernel/sn2/sn2_smp.c | 21 - arch/ia64/sn/kernel/sn2/sn_hwperf.c | 66 +- arch/ia64/sn/kernel/sn2/sn_proc_fs.c | 40 +- arch/ia64/sn/kernel/tiocx.c | 10 +- arch/ia64/sn/kernel/xpc_channel.c | 106 +- arch/ia64/sn/kernel/xpc_main.c | 3 +- arch/ia64/sn/kernel/xpc_partition.c | 36 +- arch/ia64/sn/kernel/xpnet.c | 1 + arch/ia64/sn/pci/pci_dma.c | 10 +- arch/ia64/sn/pci/pcibr/pcibr_ate.c | 2 +- arch/ia64/sn/pci/pcibr/pcibr_dma.c | 64 +- arch/ia64/sn/pci/pcibr/pcibr_provider.c | 19 +- arch/ia64/sn/pci/tioca_provider.c | 14 +- arch/ia64/sn/pci/tioce_provider.c | 393 +- arch/m32r/Kconfig | 13 - arch/m32r/Kconfig.debug | 2 +- arch/m32r/Makefile | 5 +- 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 | 83 +- 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 | 12 +- arch/m32r/kernel/m32r_ksyms.c | 26 + arch/m32r/kernel/module.c | 1 + arch/m32r/kernel/process.c | 5 +- arch/m32r/kernel/ptrace.c | 1 + arch/m32r/kernel/semaphore.c | 1 + arch/m32r/kernel/setup.c | 6 +- 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 | 5 +- 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 | 8 +- arch/m32r/mm/fault-nommu.c | 1 + arch/m32r/mm/fault.c | 3 +- arch/m32r/mm/init.c | 7 +- arch/m32r/mm/mmu.S | 1 + arch/m68k/Kconfig | 4 - 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/config.c | 23 +- arch/m68k/bvme6000/rtc.c | 4 +- arch/m68k/hp300/Makefile | 2 +- arch/m68k/hp300/config.c | 12 +- 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 | 5 + arch/m68k/kernel/process.c | 3 +- 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 | 3 +- arch/m68k/mm/kmap.c | 7 +- arch/m68k/mm/memory.c | 9 +- arch/m68k/mm/motorola.c | 15 +- arch/m68k/mm/sun3mmu.c | 5 +- arch/m68k/mvme147/Makefile | 2 +- arch/m68k/mvme147/config.c | 22 +- arch/m68k/mvme16x/Makefile | 2 +- arch/m68k/mvme16x/config.c | 23 +- arch/m68k/mvme16x/rtc.c | 4 +- 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 | 305 +- 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 | 3 + arch/m68knommu/kernel/process.c | 3 +- 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 | 235 +- arch/m68knommu/lib/semaphore.S | 1 + arch/m68knommu/mm/init.c | 11 +- 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 | 83 +- 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 | 533 +- arch/mips/Kconfig.debug | 12 +- arch/mips/Makefile | 278 +- arch/mips/arc/identify.c | 1 + arch/mips/arc/memory.c | 2 +- arch/mips/au1000/common/Makefile | 2 +- arch/mips/au1000/common/au1xxx_irqmap.c | 5 +- arch/mips/au1000/common/cputable.c | 2 +- arch/mips/au1000/common/dbdma.c | 13 +- arch/mips/au1000/common/dbg_io.c | 1 + arch/mips/au1000/common/dma.c | 3 +- arch/mips/au1000/common/gpio.c | 1 + arch/mips/au1000/common/irq.c | 66 +- arch/mips/au1000/common/pci.c | 17 +- arch/mips/au1000/common/platform.c | 9 +- arch/mips/au1000/common/power.c | 23 +- arch/mips/au1000/common/prom.c | 34 +- arch/mips/au1000/common/reset.c | 1 + arch/mips/au1000/common/setup.c | 13 +- arch/mips/au1000/common/sleeper.S | 5 - arch/mips/au1000/common/time.c | 13 +- arch/mips/au1000/common/usbdev.c | 8 +- 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/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/Makefile | 4 +- arch/mips/cobalt/int-handler.S | 6 +- arch/mips/cobalt/irq.c | 6 +- arch/mips/cobalt/setup.c | 61 +- arch/mips/configs/atlas_defconfig | 237 +- arch/mips/configs/bigsur_defconfig | 143 +- arch/mips/configs/capcella_defconfig | 205 +- arch/mips/configs/cobalt_defconfig | 183 +- arch/mips/configs/db1000_defconfig | 163 +- arch/mips/configs/db1100_defconfig | 164 +- arch/mips/configs/db1200_defconfig | 159 +- arch/mips/configs/db1500_defconfig | 259 +- arch/mips/configs/db1550_defconfig | 169 +- arch/mips/configs/ddb5476_defconfig | 88 +- arch/mips/configs/ddb5477_defconfig | 138 +- arch/mips/configs/decstation_defconfig | 146 +- arch/mips/configs/e55_defconfig | 334 +- arch/mips/configs/ev64120_defconfig | 137 +- arch/mips/configs/ev96100_defconfig | 131 +- arch/mips/configs/ip22_defconfig | 201 +- arch/mips/configs/ip27_defconfig | 164 +- arch/mips/configs/ip32_defconfig | 149 +- arch/mips/configs/it8172_defconfig | 134 +- arch/mips/configs/ivr_defconfig | 137 +- arch/mips/configs/jaguar-atx_defconfig | 131 +- arch/mips/configs/jmr3927_defconfig | 144 +- arch/mips/configs/lasat200_defconfig | 139 +- arch/mips/configs/malta_defconfig | 226 +- arch/mips/configs/mipssim_defconfig | 127 +- arch/mips/configs/mpc30x_defconfig | 165 +- arch/mips/configs/ocelot_3_defconfig | 180 +- arch/mips/configs/ocelot_c_defconfig | 136 +- arch/mips/configs/ocelot_defconfig | 132 +- arch/mips/configs/ocelot_g_defconfig | 136 +- arch/mips/configs/pb1100_defconfig | 161 +- arch/mips/configs/pb1500_defconfig | 168 +- arch/mips/configs/pb1550_defconfig | 168 +- arch/mips/configs/pnx8550-jbs_defconfig | 412 +- arch/mips/configs/pnx8550-v2pci_defconfig | 487 +- arch/mips/configs/qemu_defconfig | 111 +- arch/mips/configs/rbhma4500_defconfig | 202 +- arch/mips/configs/rm200_defconfig | 281 +- arch/mips/configs/sb1250-swarm_defconfig | 136 +- arch/mips/configs/sead_defconfig | 113 +- arch/mips/configs/tb0226_defconfig | 294 +- arch/mips/configs/tb0229_defconfig | 348 +- arch/mips/configs/tb0287_defconfig | 337 +- arch/mips/configs/workpad_defconfig | 240 +- arch/mips/configs/yosemite_defconfig | 136 +- arch/mips/ddb5xxx/common/prom.c | 11 +- arch/mips/ddb5xxx/common/rtc_ds1386.c | 4 +- arch/mips/ddb5xxx/ddb5074/Makefile | 2 +- arch/mips/ddb5xxx/ddb5074/irq.c | 26 +- arch/mips/ddb5xxx/ddb5476/Makefile | 2 +- arch/mips/ddb5xxx/ddb5476/dbg_io.c | 2 +- arch/mips/ddb5xxx/ddb5476/irq.c | 30 +- arch/mips/ddb5xxx/ddb5476/vrc5476_irq.c | 6 +- arch/mips/ddb5xxx/ddb5477/Makefile | 2 +- arch/mips/ddb5xxx/ddb5477/irq.c | 26 +- arch/mips/ddb5xxx/ddb5477/irq_5477.c | 4 +- arch/mips/ddb5xxx/ddb5477/kgdb_io.c | 2 +- arch/mips/ddb5xxx/ddb5477/setup.c | 9 +- arch/mips/dec/boot/decstation.c | 3 +- arch/mips/dec/int-handler.S | 15 +- 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 | 5 +- arch/mips/dec/setup.c | 11 +- arch/mips/dec/time.c | 55 +- arch/mips/defconfig | 201 +- arch/mips/galileo-boards/ev96100/Makefile | 2 +- arch/mips/galileo-boards/ev96100/irq.c | 19 +- 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/time.c | 3 +- arch/mips/gt64120/ev64120/Makefile | 2 +- arch/mips/gt64120/ev64120/irq.c | 31 +- arch/mips/gt64120/ev64120/serialGT.c | 2 +- arch/mips/gt64120/ev64120/setup.c | 2 +- arch/mips/gt64120/momenco_ocelot/Makefile | 2 +- arch/mips/gt64120/momenco_ocelot/dbg_io.c | 3 +- arch/mips/gt64120/momenco_ocelot/irq.c | 36 +- arch/mips/gt64120/momenco_ocelot/setup.c | 6 +- arch/mips/ite-boards/generic/Makefile | 2 +- arch/mips/ite-boards/generic/dbg_io.c | 3 +- arch/mips/ite-boards/generic/irq.c | 26 +- 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 | 8 +- arch/mips/ite-boards/ivr/init.c | 5 +- arch/mips/ite-boards/qed-4n-s01b/init.c | 5 +- arch/mips/jazz/Makefile | 2 +- arch/mips/jazz/irq.c | 82 +- arch/mips/jazz/setup.c | 6 +- arch/mips/jmr3927/common/rtc_ds1742.c | 64 +- arch/mips/jmr3927/rbhma3100/Makefile | 2 +- arch/mips/jmr3927/rbhma3100/init.c | 1 + arch/mips/jmr3927/rbhma3100/irq.c | 11 +- arch/mips/jmr3927/rbhma3100/setup.c | 67 +- arch/mips/kernel/Makefile | 9 +- arch/mips/kernel/asm-offsets.c | 74 +- arch/mips/kernel/branch.c | 2 +- arch/mips/kernel/cpu-bugs64.c | 9 +- arch/mips/kernel/cpu-probe.c | 30 +- arch/mips/kernel/entry.S | 87 +- arch/mips/kernel/gdb-low.S | 37 +- arch/mips/kernel/gdb-stub.c | 62 +- arch/mips/kernel/genex.S | 52 +- arch/mips/kernel/head.S | 61 +- arch/mips/kernel/i8259.c | 14 +- arch/mips/kernel/irixelf.c | 2 + arch/mips/kernel/irixsig.c | 9 +- arch/mips/kernel/irq-msc01.c | 17 +- arch/mips/kernel/irq-mv6434x.c | 4 +- arch/mips/kernel/irq-rm7000.c | 4 +- arch/mips/kernel/irq-rm9000.c | 8 +- arch/mips/kernel/irq.c | 33 +- arch/mips/kernel/irq_cpu.c | 8 +- arch/mips/kernel/linux32.c | 325 +- arch/mips/kernel/mips_ksyms.c | 17 + arch/mips/kernel/module.c | 6 - arch/mips/kernel/proc.c | 4 +- arch/mips/kernel/process.c | 39 +- arch/mips/kernel/ptrace.c | 50 +- arch/mips/kernel/ptrace32.c | 30 +- arch/mips/kernel/r2300_switch.S | 1 + arch/mips/kernel/r4k_fpu.S | 1 + arch/mips/kernel/r4k_switch.S | 48 +- arch/mips/kernel/rtlx.c | 518 +- arch/mips/kernel/scall32-o32.S | 34 +- arch/mips/kernel/scall64-64.S | 8 +- arch/mips/kernel/scall64-n32.S | 10 +- arch/mips/kernel/scall64-o32.S | 12 +- arch/mips/kernel/setup.c | 105 +- arch/mips/kernel/signal-common.h | 41 +- arch/mips/kernel/signal.c | 7 +- arch/mips/kernel/signal32.c | 46 +- arch/mips/kernel/signal_n32.c | 5 +- arch/mips/kernel/smp.c | 58 +- arch/mips/kernel/syscall.c | 43 +- arch/mips/kernel/sysirix.c | 46 +- arch/mips/kernel/time.c | 33 +- arch/mips/kernel/traps.c | 265 +- arch/mips/kernel/unaligned.c | 1 + arch/mips/kernel/vmlinux.lds.S | 23 +- arch/mips/kernel/vpe.c | 666 +- arch/mips/lasat/Makefile | 2 +- arch/mips/lasat/image/romscript.normal | 5 +- arch/mips/lasat/interrupt.c | 18 +- arch/mips/lasat/lasat_board.c | 1 + arch/mips/lasat/reset.c | 1 + arch/mips/lasat/setup.c | 18 +- arch/mips/lasat/sysctl.c | 64 +- 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/dp_fint.c | 4 +- arch/mips/math-emu/dp_flong.c | 4 +- arch/mips/math-emu/ieee754.h | 2 +- arch/mips/math-emu/kernel_linkage.c | 25 +- arch/mips/math-emu/sp_fint.c | 4 +- arch/mips/math-emu/sp_flong.c | 4 +- arch/mips/mips-boards/atlas/atlas_int.c | 96 +- arch/mips/mips-boards/atlas/atlas_setup.c | 7 +- arch/mips/mips-boards/generic/Makefile | 4 +- arch/mips/mips-boards/generic/gdb_hook.c | 2 +- arch/mips/mips-boards/generic/init.c | 3 +- arch/mips/mips-boards/generic/memory.c | 54 +- arch/mips/mips-boards/generic/mipsIRQ.S | 110 +- arch/mips/mips-boards/generic/pci.c | 1 - arch/mips/mips-boards/generic/printf.c | 1 + arch/mips/mips-boards/generic/reset.c | 1 + arch/mips/mips-boards/generic/time.c | 77 +- arch/mips/mips-boards/malta/Makefile | 1 - arch/mips/mips-boards/malta/malta_int.c | 105 +- arch/mips/mips-boards/malta/malta_setup.c | 19 +- arch/mips/mips-boards/sead/sead_int.c | 86 +- arch/mips/mips-boards/sead/sead_setup.c | 5 +- arch/mips/mips-boards/sim/Makefile | 3 +- arch/mips/mips-boards/sim/sim_IRQ.c | 2 +- arch/mips/mips-boards/sim/sim_cmdline.c | 6 +- arch/mips/mips-boards/sim/sim_int.c | 64 +- arch/mips/mips-boards/sim/sim_irq.S | 6 +- arch/mips/mips-boards/sim/sim_mem.c | 10 +- arch/mips/mips-boards/sim/sim_setup.c | 5 +- arch/mips/mips-boards/sim/sim_smp.c | 38 +- arch/mips/mips-boards/sim/sim_time.c | 5 +- arch/mips/mm/Makefile | 3 +- arch/mips/mm/c-r3k.c | 23 +- arch/mips/mm/c-r4k.c | 217 +- arch/mips/mm/c-sb1.c | 2 +- arch/mips/mm/c-tx39.c | 7 - arch/mips/mm/cache.c | 2 +- arch/mips/mm/cerr-sb1.c | 1 + arch/mips/mm/dma-coherent.c | 1 + arch/mips/mm/dma-ip32.c | 6 +- arch/mips/mm/dma-noncoherent.c | 1 + arch/mips/mm/fault.c | 13 +- arch/mips/mm/highmem.c | 3 +- arch/mips/mm/init.c | 127 +- arch/mips/mm/pg-r4k.c | 11 +- arch/mips/mm/pg-sb1.c | 1 + arch/mips/mm/pgtable-32.c | 1 + arch/mips/mm/pgtable.c | 3 +- arch/mips/mm/sc-rm7k.c | 25 +- arch/mips/mm/tlb-andes.c | 4 +- arch/mips/mm/tlb-r4k.c | 90 +- arch/mips/mm/tlb-r8k.c | 1 + arch/mips/mm/tlbex.c | 262 +- arch/mips/momentum/jaguar_atx/Makefile | 2 +- arch/mips/momentum/jaguar_atx/dbg_io.c | 3 +- arch/mips/momentum/jaguar_atx/int-handler.S | 12 +- arch/mips/momentum/jaguar_atx/irq.c | 37 +- arch/mips/momentum/jaguar_atx/prom.c | 1 + arch/mips/momentum/jaguar_atx/reset.c | 3 +- arch/mips/momentum/jaguar_atx/setup.c | 52 +- arch/mips/momentum/ocelot_3/Makefile | 2 +- arch/mips/momentum/ocelot_3/irq.c | 40 +- arch/mips/momentum/ocelot_3/prom.c | 1 + arch/mips/momentum/ocelot_3/reset.c | 2 +- arch/mips/momentum/ocelot_3/setup.c | 67 +- arch/mips/momentum/ocelot_c/Makefile | 2 +- arch/mips/momentum/ocelot_c/cpci-irq.c | 4 +- arch/mips/momentum/ocelot_c/dbg_io.c | 3 +- arch/mips/momentum/ocelot_c/int-handler.S | 8 +- arch/mips/momentum/ocelot_c/irq.c | 34 +- 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 | 3 +- arch/mips/momentum/ocelot_c/setup.c | 14 +- arch/mips/momentum/ocelot_c/uart-irq.c | 6 +- arch/mips/momentum/ocelot_g/Makefile | 2 +- arch/mips/momentum/ocelot_g/dbg_io.c | 3 +- arch/mips/momentum/ocelot_g/gt-irq.c | 7 +- arch/mips/momentum/ocelot_g/irq.c | 38 +- arch/mips/momentum/ocelot_g/prom.c | 1 + arch/mips/momentum/ocelot_g/setup.c | 7 +- arch/mips/oprofile/common.c | 16 +- arch/mips/oprofile/op_model_mipsxx.c | 186 +- arch/mips/oprofile/op_model_rm9000.c | 2 +- arch/mips/pci/Makefile | 7 +- arch/mips/pci/fixup-atlas.c | 1 + arch/mips/pci/fixup-mpc30x.c | 1 + arch/mips/pci/fixup-vr4133.c | 3 +- arch/mips/pci/ops-au1000.c | 1 + arch/mips/pci/ops-ddb5477.c | 4 +- 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 | 24 +- arch/mips/pci/pci-bcm1480.c | 3 +- arch/mips/pci/pci-bcm1480ht.c | 3 +- arch/mips/pci/pci-ddb5477.c | 32 +- arch/mips/pci/pci-ip27.c | 307 +- 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/Makefile | 2 +- arch/mips/philips/pnx8550/common/int.c | 42 +- arch/mips/philips/pnx8550/common/pci.c | 16 +- arch/mips/philips/pnx8550/common/platform.c | 1 - arch/mips/philips/pnx8550/common/setup.c | 33 +- arch/mips/philips/pnx8550/common/time.c | 11 +- arch/mips/pmc-sierra/yosemite/Makefile | 2 +- arch/mips/pmc-sierra/yosemite/ht.c | 5 +- arch/mips/pmc-sierra/yosemite/irq.c | 34 +- arch/mips/pmc-sierra/yosemite/prom.c | 1 + arch/mips/pmc-sierra/yosemite/setup.c | 9 +- arch/mips/qemu/Makefile | 4 +- arch/mips/qemu/q-irq.c | 3 +- arch/mips/qemu/q-setup.c | 8 +- arch/mips/sgi-ip22/Makefile | 2 +- arch/mips/sgi-ip22/ip22-eisa.c | 9 +- arch/mips/sgi-ip22/ip22-int.c | 82 +- arch/mips/sgi-ip22/ip22-reset.c | 4 +- arch/mips/sgi-ip22/ip22-setup.c | 3 +- arch/mips/sgi-ip22/ip22-time.c | 14 +- arch/mips/sgi-ip27/Kconfig | 41 +- arch/mips/sgi-ip27/Makefile | 11 +- arch/mips/sgi-ip27/TODO | 4 + arch/mips/sgi-ip27/ip27-console.c | 40 +- arch/mips/sgi-ip27/ip27-init.c | 5 +- arch/mips/sgi-ip27/ip27-irq.c | 43 +- arch/mips/sgi-ip27/ip27-klnuma.c | 1 + arch/mips/sgi-ip27/ip27-memory.c | 10 +- arch/mips/sgi-ip27/ip27-reset.c | 1 + arch/mips/sgi-ip27/ip27-timer.c | 74 +- arch/mips/sgi-ip32/Makefile | 2 +- arch/mips/sgi-ip32/ip32-irq.c | 62 +- arch/mips/sgi-ip32/ip32-reset.c | 14 +- arch/mips/sgi-ip32/ip32-setup.c | 13 +- arch/mips/sibyte/Kconfig | 3 - arch/mips/sibyte/bcm1480/Makefile | 2 +- arch/mips/sibyte/bcm1480/irq.c | 89 +- 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/Makefile | 2 +- arch/mips/sibyte/sb1250/bus_watcher.c | 1 + arch/mips/sibyte/sb1250/irq.c | 93 +- 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 | 18 +- arch/mips/sni/Makefile | 3 +- arch/mips/sni/irq.c | 41 +- arch/mips/sni/setup.c | 145 +- arch/mips/tx4927/common/Makefile | 2 +- arch/mips/tx4927/common/tx4927_irq.c | 39 +- arch/mips/tx4927/common/tx4927_irq_handler.S | 6 +- arch/mips/tx4927/common/tx4927_setup.c | 7 +- .../toshiba_rbtx4927/toshiba_rbtx4927_irq.c | 21 +- .../toshiba_rbtx4927/toshiba_rbtx4927_prom.c | 4 +- .../toshiba_rbtx4927/toshiba_rbtx4927_setup.c | 5 +- arch/mips/tx4938/common/Makefile | 2 +- arch/mips/tx4938/common/irq.c | 29 +- arch/mips/tx4938/common/rtc_rx5c348.c | 16 +- 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 | 8 +- .../mips/tx4938/toshiba_rbtx4938/spi_eeprom.c | 1 + arch/mips/vr41xx/Kconfig | 14 +- arch/mips/vr41xx/casio-e55/setup.c | 15 +- arch/mips/vr41xx/common/Makefile | 3 +- arch/mips/vr41xx/common/bcu.c | 6 +- arch/mips/vr41xx/common/icu.c | 49 +- arch/mips/vr41xx/common/init.c | 6 +- arch/mips/vr41xx/common/int-handler.S | 12 +- arch/mips/vr41xx/common/irq.c | 37 +- arch/mips/vr41xx/ibm-workpad/setup.c | 15 +- arch/mips/vr41xx/nec-cmbvr4133/init.c | 1 + arch/mips/vr41xx/nec-cmbvr4133/irq.c | 4 +- arch/mips/vr41xx/nec-cmbvr4133/m1535plus.c | 1 + arch/mips/vr41xx/nec-cmbvr4133/setup.c | 1 + arch/parisc/Kconfig | 54 +- arch/parisc/configs/712_defconfig | 160 +- arch/parisc/configs/a500_defconfig | 4 +- arch/parisc/configs/b180_defconfig | 12 +- arch/parisc/configs/c3000_defconfig | 252 +- arch/parisc/defconfig | 641 +- arch/parisc/hpux/fs.c | 6 +- arch/parisc/hpux/sys_hpux.c | 10 +- arch/parisc/kernel/asm-offsets.c | 3 - arch/parisc/kernel/cache.c | 38 +- arch/parisc/kernel/entry.S | 82 +- arch/parisc/kernel/firmware.c | 53 +- arch/parisc/kernel/head.S | 17 +- arch/parisc/kernel/init_task.c | 10 +- arch/parisc/kernel/irq.c | 34 +- arch/parisc/kernel/module.c | 63 +- arch/parisc/kernel/pacache.S | 30 +- arch/parisc/kernel/parisc_ksyms.c | 21 + arch/parisc/kernel/pci.c | 3 +- arch/parisc/kernel/pdc_chassis.c | 113 +- arch/parisc/kernel/pdc_cons.c | 3 +- arch/parisc/kernel/perf.c | 2 +- arch/parisc/kernel/perf_asm.S | 1 + arch/parisc/kernel/process.c | 5 + 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 | 26 +- arch/parisc/kernel/sys_parisc.c | 8 - arch/parisc/kernel/sys_parisc32.c | 78 +- arch/parisc/kernel/syscall.S | 25 +- arch/parisc/kernel/syscall_table.S | 12 +- 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 | 1 + arch/parisc/kernel/vmlinux.lds.S | 56 +- arch/parisc/lib/bitops.c | 1 + arch/parisc/lib/fixup.S | 1 + arch/parisc/lib/iomap.c | 4 + arch/parisc/lib/memcpy.c | 1 + arch/parisc/mm/fault.c | 2 +- arch/parisc/mm/init.c | 44 +- arch/parisc/mm/ioremap.c | 57 +- arch/powerpc/Kconfig | 184 +- arch/powerpc/Kconfig.debug | 25 +- arch/powerpc/Makefile | 16 +- arch/powerpc/boot/Makefile | 4 +- arch/powerpc/boot/install.sh | 2 + arch/powerpc/boot/main.c | 34 +- arch/powerpc/boot/prom.h | 7 - arch/powerpc/configs/cell_defconfig | 244 +- arch/powerpc/configs/g5_defconfig | 175 +- arch/powerpc/configs/iseries_defconfig | 116 +- arch/powerpc/configs/maple_defconfig | 129 +- arch/powerpc/configs/pmac32_defconfig | 316 +- arch/powerpc/configs/ppc64_defconfig | 198 +- arch/powerpc/configs/pseries_defconfig | 180 +- arch/powerpc/kernel/Makefile | 22 +- arch/powerpc/kernel/align.c | 189 +- arch/powerpc/kernel/asm-offsets.c | 12 +- arch/powerpc/kernel/binfmt_elf32.c | 1 + arch/powerpc/kernel/btext.c | 21 +- arch/powerpc/kernel/cpu_setup_power4.S | 32 +- arch/powerpc/kernel/cputable.c | 148 +- arch/powerpc/kernel/crash.c | 169 +- arch/powerpc/kernel/crash_dump.c | 15 +- arch/powerpc/kernel/entry_32.S | 36 +- arch/powerpc/kernel/entry_64.S | 20 +- arch/powerpc/kernel/firmware.c | 30 +- arch/powerpc/kernel/fpu.S | 12 +- arch/powerpc/kernel/head_32.S | 15 +- arch/powerpc/kernel/head_44x.S | 3 + arch/powerpc/kernel/head_4xx.S | 1 + arch/powerpc/kernel/head_64.S | 197 +- arch/powerpc/kernel/head_8xx.S | 3 + arch/powerpc/kernel/head_fsl_booke.S | 7 +- arch/powerpc/kernel/ibmebus.c | 9 +- arch/powerpc/kernel/idle_6xx.S | 82 +- arch/powerpc/kernel/idle_power4.S | 49 +- arch/powerpc/kernel/iomap.c | 4 + arch/powerpc/kernel/iommu.c | 89 +- arch/powerpc/kernel/irq.c | 744 +- arch/powerpc/kernel/kprobes.c | 102 +- arch/powerpc/kernel/legacy_serial.c | 126 +- arch/powerpc/kernel/lparcfg.c | 185 +- 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/module_64.c | 16 +- arch/powerpc/kernel/nvram_64.c | 9 +- arch/powerpc/kernel/of_device.c | 6 +- arch/powerpc/kernel/paca.c | 23 +- arch/powerpc/kernel/pci_32.c | 121 +- 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 | 76 +- arch/powerpc/kernel/pmc.c | 1 + arch/powerpc/kernel/ppc_ksyms.c | 15 +- arch/powerpc/kernel/proc_ppc64.c | 6 +- arch/powerpc/kernel/process.c | 79 +- arch/powerpc/kernel/prom.c | 855 +- arch/powerpc/kernel/prom_init.c | 404 +- arch/powerpc/kernel/prom_parse.c | 474 +- arch/powerpc/kernel/ptrace-common.h | 3 + arch/powerpc/kernel/ptrace.c | 8 +- arch/powerpc/kernel/ptrace32.c | 1 + arch/powerpc/kernel/rtas-proc.c | 7 +- arch/powerpc/kernel/rtas-rtc.c | 30 +- arch/powerpc/kernel/rtas.c | 264 +- arch/powerpc/kernel/rtas_flash.c | 25 +- arch/powerpc/kernel/rtas_pci.c | 23 +- arch/powerpc/kernel/setup-common.c | 130 +- arch/powerpc/kernel/setup.h | 3 - arch/powerpc/kernel/setup_32.c | 97 +- arch/powerpc/kernel/setup_64.c | 150 +- arch/powerpc/kernel/signal_32.c | 25 +- arch/powerpc/kernel/signal_64.c | 20 +- arch/powerpc/kernel/smp-tbsync.c | 6 +- arch/powerpc/kernel/smp.c | 33 +- arch/powerpc/kernel/sys_ppc32.c | 89 +- arch/powerpc/kernel/syscalls.c | 1 - arch/powerpc/kernel/sysfs.c | 58 +- arch/powerpc/kernel/systbl.S | 289 +- arch/powerpc/kernel/time.c | 355 +- arch/powerpc/kernel/traps.c | 135 +- arch/powerpc/kernel/udbg.c | 15 +- arch/powerpc/kernel/udbg_16550.c | 7 +- arch/powerpc/kernel/vdso.c | 72 +- 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 | 3 +- 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 | 3 +- arch/powerpc/kernel/vdso64/vdso64.lds.S | 1 - arch/powerpc/kernel/vector.S | 5 +- arch/powerpc/kernel/vio.c | 338 +- arch/powerpc/kernel/vmlinux.lds.S | 387 +- arch/powerpc/lib/Makefile | 5 +- arch/powerpc/lib/copy_32.S | 1 + arch/powerpc/lib/copypage_64.S | 2 + arch/powerpc/lib/copyuser_64.S | 2 + arch/powerpc/lib/e2a.c | 14 +- arch/powerpc/lib/locks.c | 1 + arch/powerpc/lib/memcpy_64.S | 2 + arch/powerpc/lib/rheap.c | 2 + arch/powerpc/lib/sstep.c | 3 +- arch/powerpc/lib/strcase.c | 4 +- arch/powerpc/lib/string.S | 1 + arch/powerpc/mm/44x_mmu.c | 5 +- arch/powerpc/mm/4xx_mmu.c | 1 + arch/powerpc/mm/fault.c | 75 +- arch/powerpc/mm/fsl_booke_mmu.c | 1 + arch/powerpc/mm/hash_low_32.S | 37 + arch/powerpc/mm/hash_low_64.S | 32 +- arch/powerpc/mm/hash_native_64.c | 9 +- arch/powerpc/mm/hash_utils_64.c | 220 +- arch/powerpc/mm/hugetlbpage.c | 310 +- arch/powerpc/mm/imalloc.c | 18 +- arch/powerpc/mm/init_32.c | 5 +- arch/powerpc/mm/init_64.c | 63 +- arch/powerpc/mm/lmb.c | 61 +- arch/powerpc/mm/mem.c | 47 +- arch/powerpc/mm/mmap.c | 2 + arch/powerpc/mm/mmu_context_32.c | 3 +- arch/powerpc/mm/mmu_context_64.c | 6 +- arch/powerpc/mm/numa.c | 201 +- arch/powerpc/mm/pgtable_32.c | 7 +- 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 | 20 +- arch/powerpc/mm/stab.c | 11 +- arch/powerpc/mm/tlb_32.c | 7 +- arch/powerpc/mm/tlb_64.c | 8 +- arch/powerpc/oprofile/Kconfig | 1 + arch/powerpc/oprofile/Makefile | 6 +- arch/powerpc/oprofile/common.c | 17 +- arch/powerpc/oprofile/op_model_7450.c | 4 +- arch/powerpc/oprofile/op_model_fsl_booke.c | 4 +- arch/powerpc/oprofile/op_model_power4.c | 71 +- arch/powerpc/oprofile/op_model_rs64.c | 5 +- arch/powerpc/platforms/83xx/Kconfig | 11 +- arch/powerpc/platforms/83xx/Makefile | 5 +- arch/powerpc/platforms/83xx/mpc834x_sys.c | 180 +- arch/powerpc/platforms/83xx/mpc834x_sys.h | 2 +- arch/powerpc/platforms/83xx/mpc83xx.h | 6 +- arch/powerpc/platforms/83xx/pci.c | 34 +- arch/powerpc/platforms/85xx/Kconfig | 77 +- arch/powerpc/platforms/85xx/Makefile | 7 +- arch/powerpc/platforms/Makefile | 4 +- arch/powerpc/platforms/cell/Kconfig | 15 - arch/powerpc/platforms/cell/Makefile | 19 +- arch/powerpc/platforms/cell/interrupt.c | 371 +- arch/powerpc/platforms/cell/interrupt.h | 19 +- arch/powerpc/platforms/cell/iommu.c | 34 +- arch/powerpc/platforms/cell/pervasive.c | 105 +- arch/powerpc/platforms/cell/pervasive.h | 37 +- arch/powerpc/platforms/cell/setup.c | 123 +- arch/powerpc/platforms/cell/smp.c | 1 + arch/powerpc/platforms/cell/spider-pic.c | 366 +- arch/powerpc/platforms/cell/spu_base.c | 410 +- arch/powerpc/platforms/cell/spufs/Makefile | 14 +- .../platforms/cell/spufs/backing_ops.c | 48 +- arch/powerpc/platforms/cell/spufs/context.c | 22 +- arch/powerpc/platforms/cell/spufs/file.c | 590 +- arch/powerpc/platforms/cell/spufs/hw_ops.c | 59 +- arch/powerpc/platforms/cell/spufs/inode.c | 47 +- arch/powerpc/platforms/cell/spufs/run.c | 92 - arch/powerpc/platforms/cell/spufs/sched.c | 6 +- .../cell/spufs/spu_restore_dump.h_shipped | 1122 +- .../cell/spufs/spu_save_dump.h_shipped | 922 +- arch/powerpc/platforms/cell/spufs/spufs.h | 28 +- arch/powerpc/platforms/cell/spufs/switch.c | 64 +- arch/powerpc/platforms/chrp/chrp.h | 3 +- arch/powerpc/platforms/chrp/pci.c | 22 +- arch/powerpc/platforms/chrp/pegasos_eth.c | 2 + arch/powerpc/platforms/chrp/setup.c | 227 +- arch/powerpc/platforms/chrp/smp.c | 2 + arch/powerpc/platforms/chrp/time.c | 24 +- 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/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 | 119 +- arch/powerpc/platforms/iseries/pci.c | 347 +- arch/powerpc/platforms/iseries/proc.c | 1 + arch/powerpc/platforms/iseries/setup.c | 331 +- arch/powerpc/platforms/iseries/setup.h | 2 - arch/powerpc/platforms/iseries/smp.c | 1 + arch/powerpc/platforms/maple/pci.c | 25 +- arch/powerpc/platforms/maple/setup.c | 121 +- arch/powerpc/platforms/maple/time.c | 27 +- arch/powerpc/platforms/powermac/backlight.c | 336 +- arch/powerpc/platforms/powermac/bootx_init.c | 80 +- arch/powerpc/platforms/powermac/cache.S | 1 + arch/powerpc/platforms/powermac/cpufreq_32.c | 9 +- arch/powerpc/platforms/powermac/cpufreq_64.c | 88 +- arch/powerpc/platforms/powermac/feature.c | 7 +- arch/powerpc/platforms/powermac/low_i2c.c | 103 +- arch/powerpc/platforms/powermac/nvram.c | 26 +- arch/powerpc/platforms/powermac/pci.c | 90 +- arch/powerpc/platforms/powermac/pfunc_base.c | 18 +- arch/powerpc/platforms/powermac/pfunc_core.c | 33 +- arch/powerpc/platforms/powermac/pic.c | 427 +- arch/powerpc/platforms/powermac/pmac.h | 2 - arch/powerpc/platforms/powermac/setup.c | 97 +- arch/powerpc/platforms/powermac/sleep.S | 1 + arch/powerpc/platforms/powermac/smp.c | 7 +- arch/powerpc/platforms/powermac/time.c | 5 +- arch/powerpc/platforms/powermac/udbg_adb.c | 1 + arch/powerpc/platforms/powermac/udbg_scc.c | 3 +- arch/powerpc/platforms/pseries/Makefile | 8 +- arch/powerpc/platforms/pseries/eeh.c | 70 +- arch/powerpc/platforms/pseries/eeh_cache.c | 4 +- arch/powerpc/platforms/pseries/eeh_driver.c | 76 +- arch/powerpc/platforms/pseries/eeh_event.c | 78 +- arch/powerpc/platforms/pseries/hvCall.S | 102 +- arch/powerpc/platforms/pseries/hvconsole.c | 11 +- arch/powerpc/platforms/pseries/hvcserver.c | 22 +- arch/powerpc/platforms/pseries/iommu.c | 220 +- arch/powerpc/platforms/pseries/lpar.c | 36 +- arch/powerpc/platforms/pseries/pci.c | 4 +- arch/powerpc/platforms/pseries/pci_dlpar.c | 11 +- arch/powerpc/platforms/pseries/ras.c | 83 +- arch/powerpc/platforms/pseries/reconfig.c | 15 +- arch/powerpc/platforms/pseries/rtasd.c | 11 +- arch/powerpc/platforms/pseries/scanlog.c | 6 +- arch/powerpc/platforms/pseries/setup.c | 563 +- arch/powerpc/platforms/pseries/smp.c | 35 +- arch/powerpc/platforms/pseries/vio.c | 4 +- arch/powerpc/platforms/pseries/xics.c | 758 +- arch/powerpc/platforms/pseries/xics.h | 17 +- arch/powerpc/sysdev/Makefile | 13 +- arch/powerpc/sysdev/dart.h | 6 +- arch/powerpc/sysdev/dart_iommu.c | 71 +- arch/powerpc/sysdev/dcr.S | 2 + arch/powerpc/sysdev/fsl_soc.c | 307 +- arch/powerpc/sysdev/i8259.c | 163 +- arch/powerpc/sysdev/ipic.c | 303 +- arch/powerpc/sysdev/ipic.h | 25 +- arch/powerpc/sysdev/mmio_nvram.c | 2 +- arch/powerpc/sysdev/mpic.c | 768 +- arch/powerpc/xmon/xmon.c | 34 +- arch/ppc/4xx_io/serial_sicc.c | 8 +- arch/ppc/8260_io/fcc_enet.c | 3 +- arch/ppc/8xx_io/commproc.c | 8 +- arch/ppc/8xx_io/cs4218.h | 1 + arch/ppc/8xx_io/cs4218_tdm.c | 11 +- arch/ppc/8xx_io/enet.c | 1 + arch/ppc/8xx_io/fec.c | 1 + arch/ppc/8xx_io/micropatch.c | 1 + arch/ppc/Kconfig | 152 +- arch/ppc/Kconfig.debug | 9 +- arch/ppc/Makefile | 8 +- arch/ppc/amiga/amiints.c | 3 +- arch/ppc/amiga/bootinfo.c | 2 + arch/ppc/amiga/cia.c | 2 + arch/ppc/amiga/config.c | 3 + arch/ppc/amiga/ints.c | 2 + arch/ppc/amiga/time.c | 1 + arch/ppc/boot/Makefile | 12 +- arch/ppc/boot/common/Makefile | 3 + arch/ppc/boot/common/bootinfo.c | 2 + arch/ppc/boot/common/crt0.S | 1 + arch/ppc/boot/common/misc-common.c | 3 + arch/ppc/boot/common/ns16550.c | 4 +- arch/ppc/boot/common/serial_stub.c | 2 + arch/ppc/boot/common/util.S | 2 + arch/ppc/boot/include/mpc10x.h | 2 + arch/ppc/boot/lib/Makefile | 4 +- arch/ppc/boot/openfirmware/Makefile | 102 +- arch/ppc/boot/openfirmware/chrpmain.c | 4 +- arch/ppc/boot/openfirmware/common.c | 16 - arch/ppc/boot/simple/Makefile | 1 - arch/ppc/boot/simple/cpc700_memory.c | 2 + arch/ppc/boot/simple/embed_config.c | 8 +- arch/ppc/boot/simple/head.S | 10 +- arch/ppc/boot/simple/m8xx_tty.c | 1 + arch/ppc/boot/simple/misc-chestnut.c | 3 + arch/ppc/boot/simple/misc-cpci690.c | 2 + arch/ppc/boot/simple/misc-embedded.c | 1 + arch/ppc/boot/simple/misc-ev64260.c | 3 + arch/ppc/boot/simple/misc-ev64360.c | 2 + arch/ppc/boot/simple/misc-katana.c | 3 + arch/ppc/boot/simple/misc-mv64x60.c | 3 + arch/ppc/boot/simple/misc-prep.c | 3 + arch/ppc/boot/simple/misc-radstone_ppc7d.c | 2 + arch/ppc/boot/simple/misc-spruce.c | 3 + arch/ppc/boot/simple/misc.c | 3 + arch/ppc/boot/simple/mpc10x_memory.c | 6 +- arch/ppc/boot/simple/mpc52xx_tty.c | 3 + arch/ppc/boot/simple/mv64x60_tty.c | 3 + arch/ppc/boot/simple/openbios.c | 3 + arch/ppc/boot/simple/pibs.c | 1 + arch/ppc/boot/simple/relocate.S | 5 +- arch/ppc/boot/utils/mkbugboot.c | 2 + arch/ppc/configs/common_defconfig | 781 +- arch/ppc/configs/pmac_defconfig | 542 +- arch/ppc/configs/power3_defconfig | 1 + arch/ppc/kernel/Makefile | 28 +- arch/ppc/kernel/asm-offsets.c | 2 +- arch/ppc/kernel/cpu_setup_6xx.S | 18 +- arch/ppc/kernel/cpu_setup_power4.S | 1 + arch/ppc/kernel/dma-mapping.c | 5 +- arch/ppc/kernel/entry.S | 88 +- arch/ppc/kernel/head.S | 184 +- arch/ppc/kernel/head_44x.S | 3 + arch/ppc/kernel/head_4xx.S | 1 + arch/ppc/kernel/head_8xx.S | 7 + arch/ppc/kernel/head_fsl_booke.S | 7 +- arch/ppc/kernel/idle.c | 30 +- arch/ppc/kernel/idle_6xx.S | 2 +- arch/ppc/kernel/idle_power4.S | 2 +- arch/ppc/kernel/l2cr.S | 33 +- arch/ppc/kernel/machine_kexec.c | 4 +- arch/ppc/kernel/misc.S | 1 + arch/ppc/kernel/pci.c | 450 +- arch/ppc/kernel/perfmon_fsl_booke.c | 2 +- arch/ppc/kernel/ppc-stub.c | 1 + arch/ppc/kernel/ppc_htab.c | 11 +- arch/ppc/kernel/ppc_ksyms.c | 32 +- arch/ppc/kernel/setup.c | 267 +- arch/ppc/kernel/smp-tbsync.c | 11 +- arch/ppc/kernel/smp.c | 3 +- arch/ppc/kernel/swsusp.S | 2 +- arch/ppc/kernel/temp.c | 1 - arch/ppc/kernel/time.c | 1 + arch/ppc/kernel/traps.c | 3 + arch/ppc/kernel/vmlinux.lds.S | 1 - arch/ppc/lib/locks.c | 1 + arch/ppc/lib/rheap.c | 2 + arch/ppc/lib/strcase.c | 3 +- arch/ppc/lib/string.S | 1 + arch/ppc/math-emu/sfp-machine.h | 2 +- arch/ppc/mm/44x_mmu.c | 5 +- arch/ppc/mm/4xx_mmu.c | 1 + arch/ppc/mm/fault.c | 33 +- arch/ppc/mm/fsl_booke_mmu.c | 1 + arch/ppc/mm/hashtable.S | 37 + arch/ppc/mm/init.c | 22 +- arch/ppc/mm/mem_pieces.c | 1 + arch/ppc/mm/mmu_context.c | 5 +- arch/ppc/mm/pgtable.c | 9 +- arch/ppc/mm/ppc_mmu.c | 29 +- arch/ppc/mm/tlb.c | 7 +- arch/ppc/platforms/4xx/Kconfig | 25 +- arch/ppc/platforms/4xx/Makefile | 4 +- arch/ppc/platforms/4xx/bamboo.c | 3 + arch/ppc/platforms/4xx/bamboo.h | 3 + arch/ppc/platforms/4xx/bubinga.c | 1 + arch/ppc/platforms/4xx/bubinga.h | 3 + arch/ppc/platforms/4xx/cpci405.c | 142 +- arch/ppc/platforms/4xx/cpci405.h | 31 +- arch/ppc/platforms/4xx/ebony.c | 3 + arch/ppc/platforms/4xx/ebony.h | 3 + arch/ppc/platforms/4xx/ep405.c | 3 + arch/ppc/platforms/4xx/ep405.h | 2 + arch/ppc/platforms/4xx/ibm405ep.c | 3 + arch/ppc/platforms/4xx/ibm405ep.h | 3 + arch/ppc/platforms/4xx/ibm405gp.c | 1 + arch/ppc/platforms/4xx/ibm405gp.h | 3 + arch/ppc/platforms/4xx/ibm405gpr.c | 3 + arch/ppc/platforms/4xx/ibm405gpr.h | 3 + arch/ppc/platforms/4xx/ibm440ep.c | 2 + arch/ppc/platforms/4xx/ibm440ep.h | 3 + arch/ppc/platforms/4xx/ibm440gp.c | 2 + arch/ppc/platforms/4xx/ibm440gp.h | 3 + arch/ppc/platforms/4xx/ibm440gx.c | 2 + arch/ppc/platforms/4xx/ibm440gx.h | 3 + arch/ppc/platforms/4xx/ibm440sp.c | 2 + arch/ppc/platforms/4xx/ibm440sp.h | 3 + arch/ppc/platforms/4xx/ibmnp405h.c | 3 + arch/ppc/platforms/4xx/ibmnp405h.h | 3 + arch/ppc/platforms/4xx/ibmstb4.c | 2 + arch/ppc/platforms/4xx/ibmstb4.h | 3 + arch/ppc/platforms/4xx/ibmstbx25.c | 2 + arch/ppc/platforms/4xx/ibmstbx25.h | 3 + arch/ppc/platforms/4xx/luan.c | 3 + arch/ppc/platforms/4xx/luan.h | 3 + arch/ppc/platforms/4xx/ocotea.c | 5 +- arch/ppc/platforms/4xx/ocotea.h | 3 + arch/ppc/platforms/4xx/ppc440spe.c | 2 + arch/ppc/platforms/4xx/ppc440spe.h | 3 + arch/ppc/platforms/4xx/redwood5.c | 3 + arch/ppc/platforms/4xx/redwood5.h | 2 + arch/ppc/platforms/4xx/redwood6.c | 3 + arch/ppc/platforms/4xx/redwood6.h | 2 + arch/ppc/platforms/4xx/sycamore.c | 3 + arch/ppc/platforms/4xx/sycamore.h | 3 + arch/ppc/platforms/4xx/walnut.c | 3 + arch/ppc/platforms/4xx/walnut.h | 3 + arch/ppc/platforms/4xx/xilinx_ml300.c | 77 +- arch/ppc/platforms/4xx/xilinx_ml300.h | 6 +- arch/ppc/platforms/4xx/yucca.c | 3 + arch/ppc/platforms/4xx/yucca.h | 3 + arch/ppc/platforms/83xx/mpc834x_sys.c | 3 + arch/ppc/platforms/83xx/mpc834x_sys.h | 5 +- arch/ppc/platforms/85xx/mpc8540_ads.c | 3 + arch/ppc/platforms/85xx/mpc8540_ads.h | 3 + arch/ppc/platforms/85xx/mpc8555_cds.h | 3 + arch/ppc/platforms/85xx/mpc8560_ads.c | 94 +- arch/ppc/platforms/85xx/mpc8560_ads.h | 3 + arch/ppc/platforms/85xx/mpc85xx_ads_common.c | 3 + arch/ppc/platforms/85xx/mpc85xx_ads_common.h | 22 +- arch/ppc/platforms/85xx/mpc85xx_cds_common.c | 14 +- arch/ppc/platforms/85xx/mpc85xx_cds_common.h | 3 + arch/ppc/platforms/85xx/sbc8560.c | 3 + arch/ppc/platforms/85xx/sbc8560.h | 3 + arch/ppc/platforms/85xx/sbc85xx.c | 3 + arch/ppc/platforms/85xx/sbc85xx.h | 3 + arch/ppc/platforms/85xx/stx_gp3.c | 5 +- arch/ppc/platforms/85xx/stx_gp3.h | 3 + arch/ppc/platforms/85xx/tqm85xx.c | 5 +- arch/ppc/platforms/85xx/tqm85xx.h | 3 + arch/ppc/platforms/Makefile | 15 +- arch/ppc/platforms/apus_pci.c | 1 + arch/ppc/platforms/apus_setup.c | 7 +- arch/ppc/platforms/ccm.h | 1 + arch/ppc/platforms/chestnut.c | 3 + arch/ppc/platforms/chestnut.h | 2 + arch/ppc/platforms/chrp_pci.c | 13 +- arch/ppc/platforms/chrp_pegasos_eth.c | 126 +- arch/ppc/platforms/chrp_setup.c | 108 +- arch/ppc/platforms/chrp_smp.c | 3 +- arch/ppc/platforms/chrp_time.c | 73 +- arch/ppc/platforms/cpci690.c | 5 +- arch/ppc/platforms/cpci690.h | 2 + arch/ppc/platforms/ev64260.c | 5 +- arch/ppc/platforms/ev64260.h | 2 + arch/ppc/platforms/ev64360.c | 5 +- arch/ppc/platforms/ev64360.h | 2 + arch/ppc/platforms/fads.h | 3 +- arch/ppc/platforms/gemini.h | 3 + arch/ppc/platforms/gemini_prom.S | 3 + arch/ppc/platforms/gemini_serial.h | 1 + arch/ppc/platforms/gemini_setup.c | 3 + arch/ppc/platforms/hdpu.c | 15 +- arch/ppc/platforms/hdpu.h | 2 + arch/ppc/platforms/hermes.h | 1 + arch/ppc/platforms/ip860.h | 1 + arch/ppc/platforms/ivms8.h | 1 + arch/ppc/platforms/katana.c | 8 +- arch/ppc/platforms/katana.h | 2 + arch/ppc/platforms/lantec.h | 1 + arch/ppc/platforms/lite5200.c | 74 +- arch/ppc/platforms/lite5200.h | 2 + arch/ppc/platforms/lopec.c | 3 + arch/ppc/platforms/lwmon.h | 1 + arch/ppc/platforms/mpc885ads.h | 1 + arch/ppc/platforms/mvme5100.c | 3 + arch/ppc/platforms/pal4.h | 2 + arch/ppc/platforms/pal4_pci.c | 2 + arch/ppc/platforms/pal4_serial.h | 2 + arch/ppc/platforms/pal4_setup.c | 3 + arch/ppc/platforms/pcu_e.h | 1 + arch/ppc/platforms/powerpmc250.c | 3 + arch/ppc/platforms/pplus.c | 3 + arch/ppc/platforms/pplus.h | 2 + arch/ppc/platforms/pq2ads.c | 33 +- arch/ppc/platforms/pq2ads.h | 5 +- arch/ppc/platforms/prep_pci.c | 1 + arch/ppc/platforms/prep_setup.c | 19 +- arch/ppc/platforms/prpmc750.c | 3 + arch/ppc/platforms/prpmc800.c | 3 + arch/ppc/platforms/radstone_ppc7d.c | 10 +- arch/ppc/platforms/radstone_ppc7d.h | 2 + arch/ppc/platforms/rpxclassic.h | 1 + arch/ppc/platforms/rpxlite.h | 1 + arch/ppc/platforms/sandpoint.c | 3 + arch/ppc/platforms/sandpoint.h | 2 + arch/ppc/platforms/sbc82xx.c | 7 +- arch/ppc/platforms/spruce.c | 3 + arch/ppc/platforms/tqm8260.h | 1 + arch/ppc/platforms/tqm8260_setup.c | 2 + arch/ppc/platforms/tqm8xx.h | 1 + arch/ppc/syslib/Makefile | 10 +- arch/ppc/syslib/btext.c | 3 +- arch/ppc/syslib/cpc700.h | 2 + arch/ppc/syslib/cpc700_pic.c | 6 +- arch/ppc/syslib/cpc710.h | 2 + arch/ppc/syslib/cpm2_pic.c | 2 +- arch/ppc/syslib/gen550.h | 2 + arch/ppc/syslib/gen550_dbg.c | 3 + arch/ppc/syslib/gen550_kgdb.c | 3 + arch/ppc/syslib/gt64260_pic.c | 10 +- arch/ppc/syslib/harrier.c | 2 + arch/ppc/syslib/hawk_common.c | 2 + arch/ppc/syslib/ibm440gp_common.c | 3 + arch/ppc/syslib/ibm440gp_common.h | 3 + arch/ppc/syslib/ibm440gx_common.c | 18 +- arch/ppc/syslib/ibm440gx_common.h | 7 +- arch/ppc/syslib/ibm440sp_common.c | 3 + arch/ppc/syslib/ibm440sp_common.h | 2 + arch/ppc/syslib/ibm44x_common.c | 3 + arch/ppc/syslib/ibm44x_common.h | 2 + arch/ppc/syslib/m8260_pci_erratum9.c | 3 + arch/ppc/syslib/m8260_setup.c | 3 + arch/ppc/syslib/m82xx_pci.c | 4 +- arch/ppc/syslib/m8xx_setup.c | 70 +- arch/ppc/syslib/m8xx_wdt.c | 3 +- arch/ppc/syslib/mpc10x_common.c | 2 + arch/ppc/syslib/mpc52xx_devices.c | 2 + arch/ppc/syslib/mpc52xx_pci.c | 6 +- arch/ppc/syslib/mpc52xx_pci.h | 2 + arch/ppc/syslib/mpc52xx_pic.c | 6 +- arch/ppc/syslib/mpc52xx_setup.c | 51 +- arch/ppc/syslib/mpc52xx_sys.c | 2 + arch/ppc/syslib/mpc83xx_devices.c | 8 +- arch/ppc/syslib/mpc83xx_sys.c | 2 + arch/ppc/syslib/mpc85xx_devices.c | 91 +- arch/ppc/syslib/mpc85xx_sys.c | 2 + arch/ppc/syslib/mpc8xx_devices.c | 35 +- arch/ppc/syslib/mpc8xx_sys.c | 8 +- arch/ppc/syslib/mv64360_pic.c | 12 +- arch/ppc/syslib/mv64x60.c | 2 + arch/ppc/syslib/mv64x60_dbg.c | 3 + arch/ppc/syslib/mv64x60_win.c | 2 + arch/ppc/syslib/ocp.c | 4 +- arch/ppc/syslib/open_pic.c | 28 +- arch/ppc/syslib/open_pic2.c | 5 +- arch/ppc/syslib/open_pic_defs.h | 2 + arch/ppc/syslib/pci_auto.c | 2 + arch/ppc/syslib/ppc403_pic.c | 2 +- arch/ppc/syslib/ppc440spe_pcie.c | 1 + arch/ppc/syslib/ppc4xx_dma.c | 3 + arch/ppc/syslib/ppc4xx_pic.c | 5 +- arch/ppc/syslib/ppc4xx_setup.c | 1 + arch/ppc/syslib/ppc4xx_sgdma.c | 3 + arch/ppc/syslib/ppc83xx_setup.c | 3 + arch/ppc/syslib/ppc83xx_setup.h | 3 + arch/ppc/syslib/ppc85xx_common.c | 3 + arch/ppc/syslib/ppc85xx_common.h | 3 + arch/ppc/syslib/ppc85xx_rio.c | 1 + arch/ppc/syslib/ppc85xx_rio.h | 1 + arch/ppc/syslib/ppc85xx_setup.c | 5 +- arch/ppc/syslib/ppc85xx_setup.h | 3 + arch/ppc/syslib/ppc8xx_pic.c | 1 + arch/ppc/syslib/ppc8xx_pic.h | 1 + arch/ppc/syslib/ppc_sys.c | 184 +- arch/ppc/syslib/pq2_devices.c | 23 +- arch/ppc/syslib/pq2_sys.c | 19 +- arch/ppc/syslib/prep_nvram.c | 2 + arch/ppc/syslib/prom.c | 48 +- arch/ppc/syslib/prom_init.c | 1 - arch/ppc/syslib/qspan_pci.c | 1 + arch/ppc/syslib/todc_time.c | 2 + arch/ppc/syslib/xilinx_pic.c | 6 +- arch/ppc/xmon/privinst.h | 1 + arch/ppc/xmon/start.c | 3 +- arch/ppc/xmon/xmon.c | 1 + arch/s390/Kconfig | 35 +- arch/s390/Kconfig.debug | 4 - arch/s390/Makefile | 8 +- arch/s390/appldata/appldata.h | 24 +- arch/s390/appldata/appldata_base.c | 55 +- 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/crypt_s390_query.c | 2 +- arch/s390/crypto/des_s390.c | 42 +- arch/s390/crypto/sha1_s390.c | 34 +- arch/s390/crypto/sha256_s390.c | 14 +- arch/s390/defconfig | 82 +- arch/s390/kernel/Makefile | 7 +- arch/s390/kernel/asm-offsets.c | 1 + arch/s390/kernel/binfmt_elf32.c | 6 + arch/s390/kernel/compat_linux.c | 99 +- arch/s390/kernel/compat_linux.h | 1 + arch/s390/kernel/compat_signal.c | 3 +- arch/s390/kernel/compat_wrapper.S | 58 +- arch/s390/kernel/debug.c | 14 +- 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 | 17 +- arch/s390/kernel/profile.c | 2 +- arch/s390/kernel/ptrace.c | 5 +- arch/s390/kernel/s390_ext.c | 2 +- arch/s390/kernel/s390_ksyms.c | 3 + arch/s390/kernel/setup.c | 225 +- arch/s390/kernel/signal.c | 6 +- arch/s390/kernel/smp.c | 14 +- arch/s390/kernel/syscalls.S | 8 +- arch/s390/kernel/time.c | 12 +- arch/s390/kernel/traps.c | 27 +- arch/s390/kernel/vmlinux.lds.S | 5 +- arch/s390/kernel/vtime.c | 3 +- arch/s390/lib/Makefile | 1 - arch/s390/lib/delay.c | 1 + arch/s390/lib/string.c | 4 +- arch/s390/lib/uaccess.S | 33 +- arch/s390/lib/uaccess64.S | 35 +- arch/s390/math-emu/math.c | 1 + arch/s390/mm/cmm.c | 9 +- arch/s390/mm/extmem.c | 19 +- arch/s390/mm/fault.c | 3 +- arch/s390/mm/init.c | 51 +- arch/sh/Kconfig | 17 +- arch/sh/Makefile | 6 +- 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/rtc.c | 50 +- 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 | 3 +- 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 | 3 +- arch/sh/boards/renesas/rts7751r2d/led.c | 1 + arch/sh/boards/renesas/rts7751r2d/mach.c | 1 + arch/sh/boards/renesas/systemh/irq.c | 3 +- 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/rtc.c | 13 +- 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 | 5 +- 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/init.c | 2 +- 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/rtc.c | 10 +- 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 | 7 +- arch/sh/kernel/machine_kexec.c | 4 +- arch/sh/kernel/process.c | 2 +- arch/sh/kernel/ptrace.c | 1 + arch/sh/kernel/relocate_kernel.S | 1 + arch/sh/kernel/setup.c | 12 +- arch/sh/kernel/sh_ksyms.c | 2 + 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/consistent.c | 3 +- arch/sh/mm/extable.c | 1 + arch/sh/mm/hugetlbpage.c | 13 + arch/sh/mm/init.c | 5 +- arch/sh/mm/pg-sh4.c | 1 + arch/sh/oprofile/op_model_sh7750.c | 2 +- arch/sh64/Kconfig | 8 - arch/sh64/Makefile | 1 + 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 | 5 +- arch/sh64/kernel/led.c | 1 + arch/sh64/kernel/pci_sh5.c | 5 +- arch/sh64/kernel/pcibios.c | 4 +- arch/sh64/kernel/process.c | 4 +- arch/sh64/kernel/ptrace.c | 1 + arch/sh64/kernel/setup.c | 6 +- arch/sh64/kernel/sh_ksyms.c | 4 +- arch/sh64/kernel/signal.c | 2 +- arch/sh64/kernel/time.c | 14 +- arch/sh64/kernel/vmlinux.lds.S | 1 + arch/sh64/lib/c-checksum.c | 1 + arch/sh64/lib/dbg.c | 1 + 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 | 1 + arch/sh64/mm/extable.c | 1 + arch/sh64/mm/hugetlbpage.c | 13 + arch/sh64/mm/init.c | 4 +- arch/sh64/mm/ioremap.c | 4 +- arch/sparc/Kconfig | 9 +- 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 | 4 +- arch/sparc/kernel/head.S | 1 + arch/sparc/kernel/idprom.c | 1 + arch/sparc/kernel/ioport.c | 202 +- arch/sparc/kernel/irq.c | 84 +- arch/sparc/kernel/module.c | 1 - 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 | 222 +- arch/sparc/kernel/sparc_ksyms.c | 21 + arch/sparc/kernel/sun4c_irq.c | 6 +- arch/sparc/kernel/sun4d_irq.c | 35 +- arch/sparc/kernel/sun4d_smp.c | 121 +- arch/sparc/kernel/sun4m_irq.c | 11 +- arch/sparc/kernel/sun4m_smp.c | 194 +- 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 | 12 +- 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/math-emu/Makefile | 2 +- arch/sparc/mm/btfixup.c | 1 + arch/sparc/mm/extable.c | 1 + arch/sparc/mm/generic.c | 1 + arch/sparc/mm/hypersparc.S | 1 + arch/sparc/mm/init.c | 9 +- arch/sparc/mm/io-unit.c | 2 +- arch/sparc/mm/iommu.c | 1 + arch/sparc/mm/loadmmu.c | 2 + arch/sparc/mm/srmmu.c | 16 +- arch/sparc/mm/sun4c.c | 16 +- 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 | 43 +- arch/sparc64/Kconfig.debug | 2 +- arch/sparc64/defconfig | 153 +- arch/sparc64/kernel/Makefile | 11 +- arch/sparc64/kernel/auxio.c | 97 +- arch/sparc64/kernel/binfmt_aout32.c | 14 +- arch/sparc64/kernel/binfmt_elf32.c | 5 +- arch/sparc64/kernel/central.c | 131 +- arch/sparc64/kernel/chmc.c | 69 +- arch/sparc64/kernel/cpu.c | 8 +- arch/sparc64/kernel/devices.c | 136 +- arch/sparc64/kernel/dtlb_backend.S | 13 +- arch/sparc64/kernel/dtlb_base.S | 18 +- arch/sparc64/kernel/ebus.c | 279 +- arch/sparc64/kernel/entry.S | 348 +- arch/sparc64/kernel/etrap.S | 171 +- arch/sparc64/kernel/head.S | 296 +- arch/sparc64/kernel/irq.c | 1200 +- arch/sparc64/kernel/isa.c | 230 +- arch/sparc64/kernel/itlb_base.S | 26 +- arch/sparc64/kernel/kprobes.c | 82 +- arch/sparc64/kernel/ktlb.S | 364 +- arch/sparc64/kernel/module.c | 5 - arch/sparc64/kernel/pci.c | 110 +- arch/sparc64/kernel/pci_common.c | 392 +- arch/sparc64/kernel/pci_impl.h | 3 +- arch/sparc64/kernel/pci_iommu.c | 38 +- arch/sparc64/kernel/pci_psycho.c | 363 +- arch/sparc64/kernel/pci_sabre.c | 456 +- arch/sparc64/kernel/pci_schizo.c | 598 +- arch/sparc64/kernel/power.c | 99 +- arch/sparc64/kernel/process.c | 135 +- arch/sparc64/kernel/ptrace.c | 31 +- arch/sparc64/kernel/rtrap.S | 116 +- arch/sparc64/kernel/sbus.c | 122 +- arch/sparc64/kernel/setup.c | 419 +- arch/sparc64/kernel/signal.c | 1 + arch/sparc64/kernel/smp.c | 541 +- arch/sparc64/kernel/sparc64_ksyms.c | 64 +- arch/sparc64/kernel/starfire.c | 4 +- arch/sparc64/kernel/sys32.S | 5 +- arch/sparc64/kernel/sys_sparc.c | 326 +- arch/sparc64/kernel/sys_sparc32.c | 97 +- arch/sparc64/kernel/sys_sunos32.c | 14 +- arch/sparc64/kernel/systbls.S | 27 +- arch/sparc64/kernel/time.c | 693 +- arch/sparc64/kernel/trampoline.S | 238 +- arch/sparc64/kernel/traps.c | 469 +- arch/sparc64/kernel/ttable.S | 74 +- arch/sparc64/kernel/unaligned.c | 56 +- arch/sparc64/kernel/us2e_cpufreq.c | 11 +- arch/sparc64/kernel/us3_cpufreq.c | 11 +- arch/sparc64/kernel/vmlinux.lds.S | 16 - arch/sparc64/kernel/winfixup.S | 480 +- arch/sparc64/lib/Makefile | 4 +- arch/sparc64/lib/U3patch.S | 3 +- arch/sparc64/lib/atomic.S | 1 + arch/sparc64/lib/bitops.S | 1 + arch/sparc64/lib/bzero.S | 18 +- arch/sparc64/lib/clear_page.S | 12 +- arch/sparc64/lib/copy_page.S | 7 +- arch/sparc64/lib/delay.c | 19 +- arch/sparc64/lib/mcount.S | 1 + arch/sparc64/lib/xor.S | 300 +- arch/sparc64/math-emu/math.c | 24 +- arch/sparc64/mm/Makefile | 2 +- arch/sparc64/mm/fault.c | 69 +- arch/sparc64/mm/generic.c | 43 +- arch/sparc64/mm/hugetlbpage.c | 227 +- arch/sparc64/mm/init.c | 1559 +- arch/sparc64/mm/tlb.c | 69 +- arch/sparc64/mm/ultra.S | 375 +- arch/sparc64/prom/cif.S | 211 +- arch/sparc64/prom/console.c | 6 - arch/sparc64/prom/init.c | 60 +- arch/sparc64/prom/misc.c | 45 +- arch/sparc64/prom/p1275.c | 11 + arch/sparc64/prom/tree.c | 94 +- arch/sparc64/solaris/fs.c | 11 +- arch/sparc64/solaris/misc.c | 42 +- arch/sparc64/solaris/socksys.c | 4 + arch/um/Kconfig | 22 +- arch/um/Kconfig.debug | 10 + arch/um/Kconfig.i386 | 24 +- arch/um/Kconfig.x86_64 | 5 - arch/um/Makefile | 36 +- arch/um/Makefile-i386 | 4 - arch/um/Makefile-x86_64 | 10 +- arch/um/defconfig | 241 +- arch/um/drivers/cow.h | 2 +- arch/um/drivers/cow_sys.h | 2 +- arch/um/drivers/cow_user.c | 94 +- arch/um/drivers/daemon_kern.c | 13 +- arch/um/drivers/harddog_kern.c | 9 +- arch/um/drivers/hostaudio_kern.c | 11 +- arch/um/drivers/line.c | 8 +- arch/um/drivers/mcast_kern.c | 13 +- arch/um/drivers/mconsole_kern.c | 152 +- arch/um/drivers/mconsole_user.c | 7 +- arch/um/drivers/net_kern.c | 3 +- arch/um/drivers/net_user.c | 84 +- arch/um/drivers/pcap_kern.c | 13 +- arch/um/drivers/port_kern.c | 4 +- arch/um/drivers/slip_kern.c | 14 +- arch/um/drivers/slirp_kern.c | 15 +- arch/um/drivers/slirp_user.c | 2 +- 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 | 102 +- arch/um/drivers/xterm_kern.c | 2 +- arch/um/include/common-offsets.h | 1 - arch/um/include/irq_user.h | 24 +- arch/um/include/kern.h | 2 +- arch/um/include/kern_util.h | 18 +- arch/um/include/line.h | 19 +- arch/um/include/longjmp.h | 6 +- arch/um/include/mconsole_kern.h | 1 + arch/um/include/mem_user.h | 1 + arch/um/include/mode_kern.h | 2 + arch/um/include/os.h | 114 +- arch/um/include/sigio.h | 3 + arch/um/include/skas/mmu-skas.h | 1 + arch/um/include/skas/mode-skas.h | 1 + arch/um/include/skas/mode_kern_skas.h | 3 +- arch/um/include/skas/skas.h | 1 + arch/um/include/sysdep-i386/checksum.h | 5 +- arch/um/include/sysdep-i386/kernel-offsets.h | 3 - arch/um/include/sysdep-i386/ptrace.h | 5 - arch/um/include/sysdep-ppc/ptrace.h | 1 + .../um/include/sysdep-x86_64/kernel-offsets.h | 4 +- arch/um/include/sysdep-x86_64/syscalls.h | 2 + arch/um/include/tt/mode_kern_tt.h | 3 +- arch/um/include/tt/tt.h | 3 +- arch/um/include/um_uaccess.h | 1 + arch/um/include/user.h | 6 +- arch/um/include/user_util.h | 9 +- arch/um/kernel/Makefile | 15 +- arch/um/kernel/dyn.lds.S | 1 - arch/um/kernel/exec_kern.c | 18 +- arch/um/kernel/init_task.c | 1 + arch/um/kernel/irq.c | 328 +- arch/um/kernel/irq_user.c | 51 +- arch/um/kernel/ksyms.c | 10 + arch/um/kernel/mem.c | 17 +- arch/um/kernel/physmem.c | 15 +- arch/um/kernel/process_kern.c | 27 +- arch/um/kernel/ptrace.c | 50 +- arch/um/kernel/sigio_kern.c | 10 +- arch/um/kernel/sigio_user.c | 86 +- arch/um/kernel/skas/Makefile | 10 +- arch/um/kernel/skas/mem.c | 25 +- arch/um/kernel/skas/mmu.c | 3 +- arch/um/kernel/skas/process_kern.c | 13 +- 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 | 16 +- arch/um/kernel/syscall.c | 178 +- arch/um/kernel/syscall_kern.c | 4 +- arch/um/kernel/sysrq.c | 1 + arch/um/kernel/time.c | 256 +- arch/um/kernel/time_kern.c | 12 +- arch/um/kernel/trap_kern.c | 8 +- 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 | 14 +- arch/um/kernel/tt/syscall_kern.c | 12 +- arch/um/kernel/tt/tracer.c | 22 +- arch/um/kernel/um_arch.c | 36 +- arch/um/kernel/uml.lds.S | 13 +- arch/um/kernel/vmlinux.lds.S | 1 + arch/um/os-Linux/Makefile | 16 +- arch/um/os-Linux/drivers/ethertap_kern.c | 13 +- arch/um/os-Linux/drivers/ethertap_user.c | 2 +- arch/um/os-Linux/drivers/tuntap_kern.c | 13 +- arch/um/os-Linux/file.c | 145 +- arch/um/os-Linux/helper.c | 10 +- arch/um/os-Linux/main.c | 32 +- arch/um/os-Linux/mem.c | 185 +- arch/um/os-Linux/process.c | 83 +- arch/um/os-Linux/signal.c | 23 + arch/um/os-Linux/skas/mem.c | 4 +- arch/um/os-Linux/skas/process.c | 55 +- arch/um/os-Linux/start_up.c | 170 +- arch/um/os-Linux/sys-i386/Makefile | 2 +- arch/um/os-Linux/sys-i386/registers.c | 4 +- arch/um/os-Linux/sys-x86_64/registers.c | 4 +- arch/um/os-Linux/time.c | 31 +- arch/um/os-Linux/trap.c | 4 +- arch/um/os-Linux/tt.c | 10 - arch/um/os-Linux/uaccess.c | 5 +- arch/um/os-Linux/umid.c | 137 +- arch/um/os-Linux/user_syms.c | 16 +- arch/um/os-Linux/util.c | 2 +- arch/um/scripts/Makefile.rules | 44 +- arch/um/sys-i386/Makefile | 28 +- arch/um/sys-i386/checksum.S | 1 + arch/um/sys-i386/ksyms.c | 4 + arch/um/sys-i386/ldt.c | 1 + arch/um/sys-i386/ptrace.c | 61 +- arch/um/sys-i386/ptrace_user.c | 12 +- arch/um/sys-i386/signal.c | 107 +- arch/um/sys-i386/stub_segv.c | 4 +- arch/um/sys-i386/sys_call_table.S | 4 + arch/um/sys-i386/syscalls.c | 25 +- arch/um/sys-i386/sysrq.c | 1 + arch/um/sys-i386/user-offsets.c | 10 +- arch/um/sys-ppc/misc.S | 7 +- arch/um/sys-x86_64/Makefile | 39 +- arch/um/sys-x86_64/ptrace.c | 22 +- arch/um/sys-x86_64/signal.c | 80 +- arch/um/sys-x86_64/stub_segv.c | 11 +- arch/um/sys-x86_64/syscall_table.c | 7 + arch/um/sys-x86_64/syscalls.c | 2 +- arch/um/sys-x86_64/user-offsets.c | 6 - arch/v850/Kconfig | 6 - 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/memcons.c | 2 +- arch/v850/kernel/process.c | 3 +- arch/v850/kernel/rte_cb.c | 1 + arch/v850/kernel/rte_cb_leds.c | 3 +- arch/v850/kernel/rte_ma1_cb.c | 1 + arch/v850/kernel/rte_mb_a_pci.c | 15 +- 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 | 18 + arch/v850/kernel/vmlinux.lds.S | 9 +- arch/x86_64/Kconfig | 175 +- arch/x86_64/Kconfig.debug | 22 +- arch/x86_64/Makefile | 67 +- arch/x86_64/boot/Makefile | 41 +- 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 | 26 +- arch/x86_64/crypto/aes-x86_64-asm.S | 22 +- arch/x86_64/crypto/aes.c | 27 +- arch/x86_64/defconfig | 325 +- arch/x86_64/ia32/Makefile | 24 +- arch/x86_64/ia32/fpu32.c | 1 + arch/x86_64/ia32/ia32_binfmt.c | 72 +- arch/x86_64/ia32/ia32_signal.c | 28 +- arch/x86_64/ia32/ia32entry.S | 72 +- arch/x86_64/ia32/ptrace32.c | 50 +- arch/x86_64/ia32/sys_ia32.c | 126 +- arch/x86_64/ia32/syscall32.c | 4 +- arch/x86_64/ia32/vsyscall-sigreturn.S | 25 +- arch/x86_64/ia32/vsyscall.lds | 1 - arch/x86_64/kernel/Makefile | 29 +- arch/x86_64/kernel/acpi/Makefile | 1 - arch/x86_64/kernel/acpi/sleep.c | 8 +- arch/x86_64/kernel/aperture.c | 33 +- arch/x86_64/kernel/apic.c | 72 +- arch/x86_64/kernel/asm-offsets.c | 5 - arch/x86_64/kernel/crash.c | 6 +- arch/x86_64/kernel/e820.c | 102 +- arch/x86_64/kernel/early_printk.c | 120 +- arch/x86_64/kernel/entry.S | 336 +- 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 | 27 +- 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 | 8 - arch/x86_64/kernel/io_apic.c | 110 +- arch/x86_64/kernel/irq.c | 71 +- arch/x86_64/kernel/kprobes.c | 86 +- arch/x86_64/kernel/machine_kexec.c | 17 +- arch/x86_64/kernel/mce.c | 27 +- arch/x86_64/kernel/mce_amd.c | 513 +- arch/x86_64/kernel/module.c | 38 +- arch/x86_64/kernel/mpparse.c | 32 +- arch/x86_64/kernel/nmi.c | 106 +- arch/x86_64/kernel/pci-dma.c | 64 +- arch/x86_64/kernel/pci-gart.c | 153 +- arch/x86_64/kernel/pci-nommu.c | 12 +- arch/x86_64/kernel/pci-swiotlb.c | 5 +- arch/x86_64/kernel/pmtimer.c | 9 +- arch/x86_64/kernel/process.c | 74 +- arch/x86_64/kernel/ptrace.c | 17 +- arch/x86_64/kernel/reboot.c | 1 - arch/x86_64/kernel/setup.c | 322 +- arch/x86_64/kernel/setup64.c | 50 +- arch/x86_64/kernel/signal.c | 89 +- arch/x86_64/kernel/smp.c | 24 +- arch/x86_64/kernel/smpboot.c | 54 +- arch/x86_64/kernel/suspend.c | 1 + arch/x86_64/kernel/syscall.c | 1 + arch/x86_64/kernel/time.c | 273 +- arch/x86_64/kernel/traps.c | 349 +- arch/x86_64/kernel/vmlinux.lds.S | 69 +- arch/x86_64/kernel/vsyscall.c | 4 +- arch/x86_64/kernel/x8664_ksyms.c | 123 +- 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 | 37 +- arch/x86_64/lib/usercopy.c | 13 +- arch/x86_64/mm/Makefile | 10 - arch/x86_64/mm/extable.c | 1 + arch/x86_64/mm/fault.c | 130 +- arch/x86_64/mm/init.c | 205 +- arch/x86_64/mm/ioremap.c | 5 - arch/x86_64/mm/k8topology.c | 2 +- arch/x86_64/mm/mmap.c | 99 +- arch/x86_64/mm/numa.c | 87 +- arch/x86_64/mm/pageattr.c | 64 +- arch/x86_64/mm/srat.c | 216 +- arch/x86_64/oprofile/Makefile | 5 +- arch/x86_64/pci/Makefile | 15 +- arch/x86_64/pci/mmconfig.c | 76 +- arch/xtensa/Kconfig | 12 +- 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 | 19 +- 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 | 4 + arch/xtensa/mm/init.c | 3 +- arch/xtensa/mm/pgtable.c | 24 +- arch/xtensa/platform-iss/console.c | 5 + arch/xtensa/platform-iss/network.c | 1 + arch/xtensa/platform-iss/setup.c | 3 +- block/Kconfig | 22 - block/Kconfig.iosched | 2 +- block/Makefile | 2 - block/as-iosched.c | 226 +- block/cfq-iosched.c | 865 +- block/deadline-iosched.c | 183 +- block/elevator.c | 224 +- block/genhd.c | 39 +- block/ioctl.c | 28 +- block/ll_rw_blk.c | 251 +- block/noop-iosched.c | 7 +- block/scsi_ioctl.c | 101 +- crypto/Kconfig | 21 +- crypto/Makefile | 3 - crypto/aes.c | 21 +- crypto/anubis.c | 13 +- crypto/api.c | 37 +- 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 | 26 +- crypto/des.c | 28 +- crypto/digest.c | 59 +- crypto/khazad.c | 21 +- crypto/md4.c | 12 +- crypto/md5.c | 12 +- crypto/michael_mic.c | 20 +- crypto/serpent.c | 28 +- crypto/sha1.c | 18 +- crypto/sha256.c | 19 +- crypto/sha512.c | 31 +- crypto/tcrypt.c | 179 +- crypto/tcrypt.h | 61 +- crypto/tea.c | 55 +- crypto/tgr192.c | 33 +- crypto/twofish.c | 35 +- crypto/wp512.c | 24 +- drivers/Kconfig | 8 +- drivers/Makefile | 10 +- drivers/acorn/block/Kconfig | 2 +- drivers/acorn/block/mfmhd.c | 3 +- drivers/acpi/Kconfig | 42 +- drivers/acpi/Makefile | 3 - drivers/acpi/ac.c | 97 +- drivers/acpi/acpi_memhotplug.c | 280 +- drivers/acpi/asus_acpi.c | 367 +- drivers/acpi/battery.c | 171 +- drivers/acpi/blacklist.c | 27 +- drivers/acpi/bus.c | 153 +- drivers/acpi/button.c | 86 +- drivers/acpi/container.c | 38 +- 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 | 244 +- 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 | 83 +- 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 | 261 +- 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 | 7 +- 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 | 181 +- drivers/acpi/processor_idle.c | 187 +- drivers/acpi/processor_perflib.c | 375 +- drivers/acpi/processor_thermal.c | 48 +- drivers/acpi/processor_throttling.c | 45 +- 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 | 304 +- 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 | 8 +- 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 | 112 +- 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 | 4 +- drivers/atm/nicstar.c | 3 +- drivers/atm/suni.c | 4 +- drivers/atm/zatm.c | 3 +- drivers/atm/zatm.h | 1 + drivers/base/Kconfig | 6 +- drivers/base/Makefile | 2 - drivers/base/attribute_container.c | 8 + drivers/base/base.h | 9 - drivers/base/bus.c | 61 +- drivers/base/class.c | 156 +- drivers/base/core.c | 201 +- drivers/base/cpu.c | 37 +- drivers/base/dd.c | 2 +- drivers/base/dmapool.c | 3 +- drivers/base/driver.c | 1 + drivers/base/firmware_class.c | 63 +- drivers/base/init.c | 1 - drivers/base/map.c | 21 +- drivers/base/memory.c | 12 +- drivers/base/node.c | 124 +- drivers/base/platform.c | 41 +- 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 | 42 +- drivers/base/sys.c | 52 +- drivers/base/topology.c | 4 +- drivers/block/DAC960.c | 58 +- drivers/block/Kconfig | 30 +- drivers/block/Makefile | 2 +- drivers/block/acsi.c | 6 +- drivers/block/acsi_slm.c | 12 + drivers/block/amiflop.c | 2 - drivers/block/aoe/aoe.h | 14 +- drivers/block/aoe/aoeblk.c | 26 +- drivers/block/aoe/aoechr.c | 39 +- drivers/block/aoe/aoecmd.c | 187 +- drivers/block/aoe/aoedev.c | 69 +- drivers/block/aoe/aoemain.c | 4 +- drivers/block/aoe/aoenet.c | 21 +- drivers/block/ataflop.c | 4 +- drivers/block/cciss.c | 3262 +- drivers/block/cciss.h | 2 + drivers/block/cciss_scsi.c | 13 +- drivers/block/cpqarray.c | 24 +- drivers/block/floppy.c | 128 +- drivers/block/loop.c | 46 +- drivers/block/nbd.c | 81 +- drivers/block/paride/bpck6.c | 3 +- drivers/block/paride/comm.c | 16 +- drivers/block/paride/on26.c | 2 +- drivers/block/paride/paride.c | 1 + drivers/block/paride/pd.c | 5 +- drivers/block/paride/pf.c | 2 +- drivers/block/paride/pg.c | 26 +- drivers/block/paride/pt.c | 29 +- drivers/block/pktcdvd.c | 61 +- drivers/block/ps2esdi.c | 6 +- drivers/block/rd.c | 17 +- drivers/block/swim3.c | 235 +- drivers/block/sx8.c | 12 +- drivers/block/ub.c | 327 +- drivers/block/umem.c | 11 +- drivers/block/viodasd.c | 5 +- drivers/block/vroot.c | 11 +- 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 | 121 +- drivers/bluetooth/bpa10x.c | 1 + drivers/bluetooth/bt3c_cs.c | 132 +- drivers/bluetooth/btuart_cs.c | 132 +- drivers/bluetooth/dtl1_cs.c | 125 +- 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 | 3 +- drivers/cdrom/cdrom.c | 881 +- drivers/cdrom/cdu31a.c | 11 +- drivers/cdrom/cm206.c | 62 +- drivers/cdrom/gscd.c | 3 +- drivers/cdrom/mcdx.c | 5 +- drivers/cdrom/optcd.c | 1 + drivers/cdrom/sbpcd.c | 2197 +- drivers/cdrom/sjcd.c | 1 + drivers/cdrom/sonycd535.c | 3 +- drivers/cdrom/viocd.c | 7 +- drivers/char/Kconfig | 84 +- drivers/char/Makefile | 95 +- drivers/char/agp/Kconfig | 14 +- drivers/char/agp/agp.h | 13 +- drivers/char/agp/ali-agp.c | 2 +- drivers/char/agp/alpha-agp.c | 29 +- drivers/char/agp/amd-k7-agp.c | 2 +- drivers/char/agp/amd64-agp.c | 88 +- drivers/char/agp/ati-agp.c | 41 +- drivers/char/agp/backend.c | 4 +- drivers/char/agp/efficeon-agp.c | 34 +- drivers/char/agp/frontend.c | 31 +- drivers/char/agp/generic.c | 46 +- drivers/char/agp/hp-agp.c | 8 +- drivers/char/agp/i460-agp.c | 16 +- drivers/char/agp/intel-agp.c | 220 +- drivers/char/agp/isoch.c | 20 +- drivers/char/agp/nvidia-agp.c | 23 +- drivers/char/agp/sgi-agp.c | 5 +- drivers/char/agp/sis-agp.c | 8 +- drivers/char/agp/sworks-agp.c | 15 +- drivers/char/agp/uninorth-agp.c | 16 +- drivers/char/agp/via-agp.c | 4 +- drivers/char/amiserial.c | 21 +- drivers/char/applicom.c | 57 +- drivers/char/consolemap.c | 1 + drivers/char/cs5535_gpio.c | 2 +- drivers/char/cyclades.c | 17 +- drivers/char/decserial.c | 1 + drivers/char/drm/Kconfig | 4 +- drivers/char/drm/drm.h | 1 + drivers/char/drm/drmP.h | 22 +- drivers/char/drm/drm_agpsupport.c | 2 + drivers/char/drm/drm_bufs.c | 25 +- drivers/char/drm/drm_dma.c | 4 +- drivers/char/drm/drm_drv.c | 4 +- drivers/char/drm/drm_fops.c | 2 +- drivers/char/drm/drm_irq.c | 2 +- drivers/char/drm/drm_memory.c | 174 +- drivers/char/drm/drm_memory.h | 129 +- drivers/char/drm/drm_memory_debug.h | 75 +- drivers/char/drm/drm_pci.c | 30 +- drivers/char/drm/drm_pciids.h | 120 +- drivers/char/drm/drm_scatter.c | 1 + drivers/char/drm/drm_stub.c | 2 + drivers/char/drm/drm_sysfs.c | 1 + drivers/char/drm/drm_vm.c | 1 - drivers/char/drm/ffb_drv.c | 1 + drivers/char/drm/i810_dma.c | 2 +- drivers/char/drm/i810_drv.c | 1 + drivers/char/drm/i830_dma.c | 2 +- drivers/char/drm/i830_drv.c | 1 + drivers/char/drm/i915_dma.c | 6 +- drivers/char/drm/i915_drm.h | 13 - drivers/char/drm/i915_drv.h | 6 +- drivers/char/drm/i915_irq.c | 71 +- drivers/char/drm/mga_drv.c | 1 + drivers/char/drm/r128_drv.c | 1 + drivers/char/drm/r300_cmdbuf.c | 86 +- drivers/char/drm/r300_reg.h | 39 +- drivers/char/drm/radeon_cp.c | 157 +- drivers/char/drm/radeon_drm.h | 12 +- drivers/char/drm/radeon_drv.c | 1 + drivers/char/drm/radeon_drv.h | 31 +- drivers/char/drm/radeon_state.c | 153 +- drivers/char/drm/savage_drv.c | 1 + drivers/char/drm/sis_drv.c | 1 + drivers/char/drm/sis_mm.c | 2 +- drivers/char/drm/tdfx_drv.c | 1 + drivers/char/drm/via_dmablit.c | 2 +- drivers/char/drm/via_drv.c | 1 + drivers/char/drm/via_irq.c | 12 +- drivers/char/ds1286.c | 17 +- drivers/char/ds1302.c | 3 +- drivers/char/ds1620.c | 3 +- drivers/char/dsp56k.c | 12 +- drivers/char/dtlk.c | 9 +- drivers/char/ec3104_keyb.c | 1 + drivers/char/efirtc.c | 2 +- drivers/char/epca.c | 7 +- drivers/char/esp.c | 7 +- drivers/char/ftape/lowlevel/fdc-io.c | 5 +- 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/generic_nvram.c | 5 +- drivers/char/generic_serial.c | 14 +- drivers/char/genrtc.c | 11 +- drivers/char/hangcheck-timer.c | 4 +- drivers/char/hpet.c | 10 +- drivers/char/hvc_console.c | 107 +- drivers/char/hvc_vio.c | 11 - drivers/char/hvcs.c | 26 +- drivers/char/hvsi.c | 20 +- drivers/char/i8k.c | 2 +- drivers/char/ip2.c | 1 - drivers/char/ip2/i2ellis.h | 1 + drivers/char/ip27-rtc.c | 2 +- drivers/char/ip2main.c | 136 +- drivers/char/ipmi/ipmi_devintf.c | 75 +- drivers/char/ipmi/ipmi_kcs_sm.c | 8 +- drivers/char/ipmi/ipmi_msghandler.c | 671 +- drivers/char/ipmi/ipmi_poweroff.c | 9 +- drivers/char/ipmi/ipmi_si_intf.c | 1234 +- drivers/char/ipmi/ipmi_si_sm.h | 3 +- drivers/char/ipmi/ipmi_watchdog.c | 115 +- drivers/char/isicom.c | 13 +- drivers/char/istallion.c | 1897 +- drivers/char/ite_gpio.c | 4 +- drivers/char/keyboard.c | 303 +- drivers/char/lcd.c | 3 +- drivers/char/lp.c | 10 +- drivers/char/mbcs.c | 7 +- drivers/char/mem.c | 224 +- drivers/char/misc.c | 22 +- drivers/char/mmtimer.c | 7 +- drivers/char/moxa.c | 12 +- drivers/char/mwave/3780i.c | 1 + drivers/char/mwave/mwavedd.c | 4 +- drivers/char/mxser.c | 848 +- drivers/char/mxser.h | 2 +- drivers/char/n_hdlc.c | 1 + drivers/char/n_r3964.c | 3 +- drivers/char/n_tty.c | 18 +- drivers/char/nvram.c | 3 +- drivers/char/nwbutton.c | 5 +- drivers/char/nwflash.c | 13 +- drivers/char/pcmcia/cm4000_cs.c | 130 +- drivers/char/pcmcia/cm4040_cs.c | 135 +- drivers/char/pcmcia/synclink_cs.c | 191 +- drivers/char/ppdev.c | 20 +- drivers/char/pty.c | 11 +- drivers/char/qtronix.c | 3 +- drivers/char/random.c | 15 +- drivers/char/raw.c | 44 +- drivers/char/rio/Makefile | 2 +- drivers/char/rio/board.h | 58 +- drivers/char/rio/bootpkt.h | 11 +- drivers/char/rio/cirrus.h | 110 +- drivers/char/rio/cmdblk.h | 4 +- drivers/char/rio/cmdpkt.h | 94 +- drivers/char/rio/control.h | 7 +- drivers/char/rio/daemon.h | 79 +- drivers/char/rio/defaults.h | 14 +- drivers/char/rio/error.h | 3 - drivers/char/rio/func.h | 63 +- drivers/char/rio/host.h | 65 +- drivers/char/rio/link.h | 124 +- drivers/char/rio/linux_compat.h | 45 +- drivers/char/rio/list.h | 144 +- drivers/char/rio/map.h | 12 +- drivers/char/rio/param.h | 24 +- drivers/char/rio/parmmap.h | 68 +- drivers/char/rio/phb.h | 39 +- drivers/char/rio/pkt.h | 24 +- drivers/char/rio/port.h | 250 +- drivers/char/rio/qbuf.h | 19 +- drivers/char/rio/rio.h | 173 +- drivers/char/rio/rio_linux.c | 171 +- drivers/char/rio/rio_linux.h | 21 +- drivers/char/rio/rioboot.c | 1691 +- drivers/char/rio/riocmd.c | 196 +- drivers/char/rio/rioctrl.c | 444 +- drivers/char/rio/riodrvr.h | 48 +- drivers/char/rio/rioinit.c | 216 +- drivers/char/rio/riointr.c | 360 +- drivers/char/rio/rioioctl.h | 56 +- drivers/char/rio/rioparam.c | 131 +- drivers/char/rio/riopcicopy.c | 6 +- drivers/char/rio/rioroute.c | 178 +- drivers/char/rio/riotable.c | 129 +- drivers/char/rio/riotty.c | 198 +- drivers/char/rio/riotypes.h | 69 +- drivers/char/rio/rom.h | 22 +- drivers/char/rio/rup.h | 25 +- drivers/char/rio/sam.h | 17 +- drivers/char/rio/space.h | 2 +- drivers/char/rio/top.h | 9 +- drivers/char/rio/typdef.h | 36 +- drivers/char/rio/unixrup.h | 8 +- drivers/char/riscom8.c | 11 +- drivers/char/rocket.c | 67 +- drivers/char/rtc.c | 66 +- drivers/char/s3c2410-rtc.c | 8 +- drivers/char/scx200_gpio.c | 158 +- drivers/char/selection.c | 2 +- drivers/char/ser_a2232.c | 4 +- drivers/char/serial167.c | 2 + drivers/char/snsc.c | 19 +- drivers/char/snsc.h | 5 +- drivers/char/snsc_event.c | 46 +- drivers/char/sonypi.c | 15 +- drivers/char/specialix.c | 17 +- drivers/char/stallion.c | 275 +- drivers/char/sx.c | 12 +- drivers/char/synclink.c | 52 +- drivers/char/synclink_gt.c | 388 +- drivers/char/synclinkmp.c | 23 +- drivers/char/sysrq.c | 261 +- drivers/char/tb0219.c | 26 +- drivers/char/tipar.c | 20 +- drivers/char/tlclk.c | 7 +- drivers/char/toshiba.c | 40 +- drivers/char/tpm/Kconfig | 11 +- drivers/char/tpm/Makefile | 1 - drivers/char/tpm/tpm.c | 787 +- drivers/char/tpm/tpm.h | 40 +- drivers/char/tpm/tpm_atmel.c | 60 +- drivers/char/tpm/tpm_atmel.h | 25 +- drivers/char/tpm/tpm_bios.c | 137 +- drivers/char/tpm/tpm_infineon.c | 63 +- drivers/char/tpm/tpm_nsc.c | 51 +- drivers/char/tty_io.c | 1193 +- drivers/char/tty_ioctl.c | 88 +- drivers/char/vc_screen.c | 14 +- drivers/char/viocons.c | 2 + drivers/char/viotape.c | 15 +- drivers/char/vme_scc.c | 52 +- drivers/char/vr41xx_giu.c | 26 +- drivers/char/vr41xx_rtc.c | 28 +- drivers/char/vt.c | 616 +- drivers/char/vt_ioctl.c | 20 +- drivers/char/watchdog/Kconfig | 25 +- drivers/char/watchdog/Makefile | 2 - 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/booke_wdt.c | 3 +- drivers/char/watchdog/cpu5wdt.c | 2 +- drivers/char/watchdog/eurotechwdt.c | 5 +- drivers/char/watchdog/i6300esb.c | 2 +- drivers/char/watchdog/i8xx_tco.c | 46 +- drivers/char/watchdog/ib700wdt.c | 3 +- drivers/char/watchdog/ibmasr.c | 3 +- drivers/char/watchdog/indydog.c | 3 +- drivers/char/watchdog/ixp2000_wdt.c | 3 +- drivers/char/watchdog/ixp4xx_wdt.c | 3 +- drivers/char/watchdog/machzwd.c | 3 +- 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 | 9 +- drivers/char/watchdog/mv64x60_wdt.c | 23 +- drivers/char/watchdog/pcwd.c | 142 +- drivers/char/watchdog/pcwd_pci.c | 35 +- drivers/char/watchdog/pcwd_usb.c | 38 +- drivers/char/watchdog/s3c2410_wdt.c | 9 +- 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 | 3 +- 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 | 21 +- drivers/connector/cn_queue.c | 2 +- drivers/connector/connector.c | 43 +- drivers/cpufreq/Kconfig | 2 +- drivers/cpufreq/cpufreq.c | 327 +- drivers/cpufreq/cpufreq_conservative.c | 168 +- drivers/cpufreq/cpufreq_ondemand.c | 328 +- drivers/cpufreq/cpufreq_performance.c | 2 +- drivers/cpufreq/cpufreq_powersave.c | 2 +- drivers/cpufreq/cpufreq_stats.c | 21 +- drivers/cpufreq/cpufreq_userspace.c | 16 +- drivers/cpufreq/freq_table.c | 28 +- drivers/crypto/padlock-aes.c | 48 +- drivers/dio/dio-driver.c | 9 +- drivers/edac/Kconfig | 17 +- drivers/edac/Makefile | 1 - drivers/edac/amd76x_edac.c | 213 +- drivers/edac/e752x_edac.c | 605 +- drivers/edac/e7xxx_edac.c | 359 +- drivers/edac/edac_mc.c | 1863 +- drivers/edac/edac_mc.h | 146 +- drivers/edac/i82860_edac.c | 240 +- drivers/edac/i82875p_edac.c | 359 +- drivers/edac/r82600_edac.c | 258 +- drivers/eisa/eisa-bus.c | 7 +- 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 | 5 +- drivers/firmware/Makefile | 3 +- drivers/firmware/dcdbas.c | 152 +- drivers/firmware/dell_rbu.c | 1 + drivers/firmware/efivars.c | 29 +- drivers/firmware/pcdp.c | 20 +- drivers/hwmon/Kconfig | 72 +- drivers/hwmon/Makefile | 4 - drivers/hwmon/adm1021.c | 13 +- drivers/hwmon/adm1025.c | 25 +- drivers/hwmon/adm1026.c | 92 +- drivers/hwmon/adm1031.c | 49 +- drivers/hwmon/adm9240.c | 29 +- drivers/hwmon/asb100.c | 47 +- drivers/hwmon/atxp1.c | 9 +- drivers/hwmon/ds1621.c | 13 +- drivers/hwmon/f71805f.c | 290 +- drivers/hwmon/fscher.c | 41 +- drivers/hwmon/fscpos.c | 33 +- drivers/hwmon/gl518sm.c | 25 +- drivers/hwmon/gl520sm.c | 47 +- drivers/hwmon/hdaps.c | 22 +- drivers/hwmon/hwmon-vid.c | 52 +- drivers/hwmon/hwmon.c | 26 +- drivers/hwmon/it87.c | 66 +- drivers/hwmon/lm63.c | 29 +- drivers/hwmon/lm75.c | 13 +- drivers/hwmon/lm77.c | 21 +- drivers/hwmon/lm78.c | 53 +- drivers/hwmon/lm80.c | 29 +- drivers/hwmon/lm83.c | 63 +- drivers/hwmon/lm85.c | 71 +- drivers/hwmon/lm87.c | 41 +- drivers/hwmon/lm90.c | 21 +- drivers/hwmon/lm92.c | 17 +- drivers/hwmon/max1619.c | 13 +- drivers/hwmon/pc87360.c | 469 +- drivers/hwmon/sis5595.c | 53 +- drivers/hwmon/smsc47b397.c | 17 +- drivers/hwmon/smsc47m1.c | 43 +- drivers/hwmon/via686a.c | 33 +- drivers/hwmon/vt8231.c | 51 +- drivers/hwmon/w83627ehf.c | 409 +- drivers/hwmon/w83627hf.c | 136 +- drivers/hwmon/w83781d.c | 84 +- drivers/hwmon/w83792d.c | 616 +- drivers/hwmon/w83l785ts.c | 9 +- drivers/i2c/algos/i2c-algo-bit.c | 1 + drivers/i2c/busses/Kconfig | 61 +- drivers/i2c/busses/Makefile | 1 - drivers/i2c/busses/i2c-ali1535.c | 4 + drivers/i2c/busses/i2c-amd756-s4882.c | 13 +- drivers/i2c/busses/i2c-frodo.c | 1 - drivers/i2c/busses/i2c-i801.c | 160 +- drivers/i2c/busses/i2c-ibm_iic.c | 1 + drivers/i2c/busses/i2c-iop3xx.c | 27 +- drivers/i2c/busses/i2c-iop3xx.h | 2 +- drivers/i2c/busses/i2c-isa.c | 2 +- drivers/i2c/busses/i2c-ite.c | 6 +- drivers/i2c/busses/i2c-ixp4xx.c | 4 +- drivers/i2c/busses/i2c-mpc.c | 8 +- drivers/i2c/busses/i2c-mv64xxx.c | 8 +- drivers/i2c/busses/i2c-nforce2.c | 38 +- drivers/i2c/busses/i2c-parport-light.c | 9 +- drivers/i2c/busses/i2c-parport.c | 9 +- drivers/i2c/busses/i2c-parport.h | 2 +- drivers/i2c/busses/i2c-piix4.c | 37 +- drivers/i2c/busses/i2c-powermac.c | 5 +- drivers/i2c/busses/i2c-pxa.c | 4 +- drivers/i2c/busses/i2c-s3c2410.c | 3 +- drivers/i2c/busses/i2c-sis96x.c | 8 + drivers/i2c/busses/i2c-viapro.c | 8 + drivers/i2c/busses/scx200_acb.c | 414 +- drivers/i2c/busses/scx200_i2c.c | 1 + drivers/i2c/chips/Kconfig | 24 +- drivers/i2c/chips/Makefile | 2 + drivers/i2c/chips/ds1337.c | 8 +- drivers/i2c/chips/ds1374.c | 27 +- drivers/i2c/chips/eeprom.c | 9 +- drivers/i2c/chips/isp1301_omap.c | 7 +- drivers/i2c/chips/m41t00.c | 359 +- drivers/i2c/chips/max6875.c | 10 +- drivers/i2c/chips/pca9539.c | 12 +- drivers/i2c/chips/pcf8591.c | 13 +- drivers/i2c/chips/rtc8564.c | 51 +- drivers/i2c/chips/tps65010.c | 64 +- drivers/i2c/i2c-core.c | 85 +- 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 | 242 +- drivers/ide/ide-disk.c | 23 +- drivers/ide/ide-dma.c | 11 +- drivers/ide/ide-floppy.c | 29 +- drivers/ide/ide-io.c | 161 +- drivers/ide/ide-iops.c | 21 +- drivers/ide/ide-lib.c | 16 +- drivers/ide/ide-probe.c | 38 +- drivers/ide/ide-proc.c | 3 +- drivers/ide/ide-tape.c | 88 +- drivers/ide/ide-taskfile.c | 14 +- drivers/ide/ide-timing.h | 8 +- drivers/ide/ide.c | 26 +- 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/ide-cs.c | 128 +- 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/mips/au1xxx-ide.c | 5 - drivers/ide/pci/aec62xx.c | 8 +- drivers/ide/pci/alim15x3.c | 1 + drivers/ide/pci/amd74xx.c | 16 +- drivers/ide/pci/atiixp.c | 2 +- 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 | 54 +- drivers/ide/pci/hpt34x.c | 3 +- drivers/ide/pci/hpt366.c | 1 + drivers/ide/pci/it8172.c | 1 + drivers/ide/pci/it821x.c | 14 +- drivers/ide/pci/ns87415.c | 1 + drivers/ide/pci/pdc202xx_new.c | 7 +- drivers/ide/pci/pdc202xx_old.c | 162 +- drivers/ide/pci/piix.c | 13 +- drivers/ide/pci/rz1000.c | 1 + drivers/ide/pci/sc1200.c | 5 +- drivers/ide/pci/serverworks.c | 44 +- drivers/ide/pci/sgiioc4.c | 79 +- drivers/ide/pci/siimage.c | 57 +- drivers/ide/pci/sis5513.c | 5 +- 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 | 3 +- drivers/ide/ppc/mpc8xx.c | 1 + drivers/ide/ppc/pmac.c | 132 +- drivers/ide/setup-pci.c | 19 + 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 | 42 +- drivers/ieee1394/eth1394.c | 54 +- drivers/ieee1394/eth1394.h | 2 + drivers/ieee1394/highlevel.c | 449 +- drivers/ieee1394/hosts.c | 20 +- drivers/ieee1394/hosts.h | 17 +- drivers/ieee1394/ieee1394_core.c | 79 +- drivers/ieee1394/ieee1394_core.h | 5 +- drivers/ieee1394/ieee1394_transactions.c | 10 +- drivers/ieee1394/nodemgr.c | 76 +- drivers/ieee1394/ohci1394.c | 130 +- drivers/ieee1394/ohci1394.h | 10 - drivers/ieee1394/oui2c.sh | 1 + drivers/ieee1394/pcilynx.c | 7 +- drivers/ieee1394/pcilynx.h | 1 + drivers/ieee1394/raw1394.c | 103 +- drivers/ieee1394/sbp2.c | 418 +- drivers/ieee1394/sbp2.h | 41 +- drivers/ieee1394/video1394.c | 33 +- drivers/infiniband/Kconfig | 8 - drivers/infiniband/Makefile | 2 - drivers/infiniband/core/Makefile | 11 +- drivers/infiniband/core/agent.c | 19 + drivers/infiniband/core/cache.c | 35 +- drivers/infiniband/core/cm.c | 199 +- drivers/infiniband/core/fmr_pool.c | 42 +- drivers/infiniband/core/mad.c | 439 +- drivers/infiniband/core/mad_priv.h | 26 +- drivers/infiniband/core/mad_rmpp.c | 221 +- drivers/infiniband/core/sa_query.c | 44 +- drivers/infiniband/core/smi.h | 9 +- drivers/infiniband/core/sysfs.c | 38 +- drivers/infiniband/core/ucm.c | 195 +- drivers/infiniband/core/user_mad.c | 306 +- drivers/infiniband/core/uverbs.h | 11 +- drivers/infiniband/core/uverbs_cmd.c | 1137 +- drivers/infiniband/core/uverbs_main.c | 62 +- drivers/infiniband/core/uverbs_mem.c | 4 +- drivers/infiniband/core/verbs.c | 337 +- drivers/infiniband/hw/mthca/Kconfig | 11 +- drivers/infiniband/hw/mthca/Makefile | 4 + drivers/infiniband/hw/mthca/mthca_allocator.c | 30 +- drivers/infiniband/hw/mthca/mthca_av.c | 136 +- drivers/infiniband/hw/mthca/mthca_cmd.c | 351 +- drivers/infiniband/hw/mthca/mthca_cmd.h | 15 +- drivers/infiniband/hw/mthca/mthca_cq.c | 223 +- drivers/infiniband/hw/mthca/mthca_dev.h | 58 +- drivers/infiniband/hw/mthca/mthca_eq.c | 18 +- drivers/infiniband/hw/mthca/mthca_mad.c | 75 +- drivers/infiniband/hw/mthca/mthca_main.c | 57 +- drivers/infiniband/hw/mthca/mthca_mcg.c | 4 +- drivers/infiniband/hw/mthca/mthca_memfree.c | 29 +- drivers/infiniband/hw/mthca/mthca_memfree.h | 10 +- drivers/infiniband/hw/mthca/mthca_mr.c | 59 +- drivers/infiniband/hw/mthca/mthca_pd.c | 5 +- drivers/infiniband/hw/mthca/mthca_profile.c | 10 +- drivers/infiniband/hw/mthca/mthca_provider.c | 202 +- drivers/infiniband/hw/mthca/mthca_provider.h | 83 +- drivers/infiniband/hw/mthca/mthca_qp.c | 720 +- drivers/infiniband/hw/mthca/mthca_reset.c | 1 + drivers/infiniband/hw/mthca/mthca_srq.c | 156 +- drivers/infiniband/hw/mthca/mthca_user.h | 7 +- drivers/infiniband/ulp/ipoib/Kconfig | 6 +- drivers/infiniband/ulp/ipoib/ipoib.h | 70 +- drivers/infiniband/ulp/ipoib/ipoib_fs.c | 6 +- drivers/infiniband/ulp/ipoib/ipoib_ib.c | 108 +- drivers/infiniband/ulp/ipoib/ipoib_main.c | 169 +- .../infiniband/ulp/ipoib/ipoib_multicast.c | 91 +- drivers/infiniband/ulp/ipoib/ipoib_verbs.c | 17 +- drivers/infiniband/ulp/ipoib/ipoib_vlan.c | 4 +- drivers/infiniband/ulp/srp/ib_srp.c | 832 +- drivers/infiniband/ulp/srp/ib_srp.h | 44 +- drivers/input/evbug.c | 3 +- drivers/input/evdev.c | 43 +- drivers/input/gameport/emu10k1-gp.c | 1 + drivers/input/gameport/fm801-gp.c | 4 +- drivers/input/gameport/gameport.c | 96 +- drivers/input/gameport/ns558.c | 14 +- drivers/input/input.c | 572 +- drivers/input/joydev.c | 75 +- drivers/input/joystick/a3d.c | 2 +- drivers/input/joystick/amijoy.c | 11 +- drivers/input/joystick/analog.c | 24 +- drivers/input/joystick/cobra.c | 3 +- drivers/input/joystick/db9.c | 18 +- drivers/input/joystick/gamecon.c | 99 +- 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 | 32 +- drivers/input/joystick/iforce/iforce-main.c | 27 +- drivers/input/joystick/iforce/iforce.h | 6 +- drivers/input/joystick/interact.c | 2 +- drivers/input/joystick/magellan.c | 2 +- drivers/input/joystick/sidewinder.c | 26 +- drivers/input/joystick/spaceball.c | 4 +- drivers/input/joystick/spaceorb.c | 2 +- drivers/input/joystick/stinger.c | 2 +- drivers/input/joystick/turbografx.c | 13 +- drivers/input/joystick/twidjoy.c | 2 +- drivers/input/joystick/warrior.c | 2 +- drivers/input/keyboard/Kconfig | 2 +- drivers/input/keyboard/amikbd.c | 34 +- drivers/input/keyboard/atkbd.c | 340 +- drivers/input/keyboard/corgikbd.c | 45 +- drivers/input/keyboard/hil_kbd.c | 65 +- drivers/input/keyboard/hilkbd.c | 54 +- drivers/input/keyboard/lkkbd.c | 9 +- drivers/input/keyboard/locomokbd.c | 1 + drivers/input/keyboard/newtonkbd.c | 2 +- drivers/input/keyboard/spitzkbd.c | 32 +- drivers/input/keyboard/sunkbd.c | 4 +- drivers/input/keyboard/xtkbd.c | 2 +- drivers/input/misc/Kconfig | 2 +- drivers/input/misc/ixp4xx-beeper.c | 2 +- drivers/input/misc/pcspkr.c | 27 +- drivers/input/misc/sparcspkr.c | 219 +- drivers/input/misc/uinput.c | 14 +- drivers/input/misc/wistron_btns.c | 72 +- drivers/input/mouse/alps.c | 6 +- drivers/input/mouse/hil_ptr.c | 93 +- drivers/input/mouse/inport.c | 1 + drivers/input/mouse/lifebook.c | 24 - drivers/input/mouse/psmouse-base.c | 78 +- drivers/input/mouse/rpcmouse.c | 2 +- drivers/input/mouse/sermouse.c | 3 +- drivers/input/mouse/synaptics.c | 18 +- drivers/input/mouse/trackpoint.c | 52 +- drivers/input/mouse/vsxxxaa.c | 23 +- drivers/input/mousedev.c | 49 +- drivers/input/power.c | 4 +- drivers/input/serio/ct82c710.c | 7 +- drivers/input/serio/gscps2.c | 7 +- drivers/input/serio/hil_mlc.c | 5 +- drivers/input/serio/hp_sdc_mlc.c | 7 +- drivers/input/serio/i8042-io.h | 4 +- drivers/input/serio/i8042-sparcio.h | 109 +- drivers/input/serio/i8042-x86ia64io.h | 26 +- drivers/input/serio/i8042.c | 5 +- drivers/input/serio/i8042.h | 1 + drivers/input/serio/libps2.c | 19 +- drivers/input/serio/parkbd.c | 3 +- drivers/input/serio/pcips2.c | 2 +- drivers/input/serio/rpckbd.c | 3 +- drivers/input/serio/serio.c | 122 +- drivers/input/serio/serio_raw.c | 30 +- drivers/input/touchscreen/ads7846.c | 449 +- drivers/input/touchscreen/corgi_ts.c | 4 +- drivers/input/touchscreen/gunze.c | 2 +- drivers/input/touchscreen/h3600_ts_input.c | 8 +- drivers/input/touchscreen/hp680_ts_input.c | 2 +- drivers/input/touchscreen/mtouch.c | 2 +- drivers/input/tsdev.c | 29 +- drivers/isdn/Makefile | 1 - drivers/isdn/capi/capi.c | 67 +- drivers/isdn/capi/capidrv.c | 3 +- drivers/isdn/capi/capifs.c | 8 +- drivers/isdn/capi/capiutil.c | 1 + drivers/isdn/capi/kcapi.c | 17 +- drivers/isdn/capi/kcapi_proc.c | 2 +- drivers/isdn/divert/divert_procfs.c | 1 + drivers/isdn/divert/isdn_divert.c | 2 +- drivers/isdn/hardware/avm/avm_cs.c | 185 +- drivers/isdn/hardware/avm/avmcard.h | 4 +- drivers/isdn/hardware/avm/b1dma.c | 3 +- drivers/isdn/hardware/avm/b1isa.c | 4 +- drivers/isdn/hardware/avm/b1pci.c | 5 +- drivers/isdn/hardware/avm/b1pcmcia.c | 2 +- drivers/isdn/hardware/avm/c4.c | 5 +- drivers/isdn/hardware/avm/t1isa.c | 6 +- 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/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/avma1_cs.c | 182 +- drivers/isdn/hisax/bkm_a4t.c | 7 +- drivers/isdn/hisax/bkm_a8.c | 19 +- drivers/isdn/hisax/config.c | 10 +- drivers/isdn/hisax/diva.c | 17 +- drivers/isdn/hisax/elsa.c | 24 +- drivers/isdn/hisax/elsa_cs.c | 112 +- 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 | 5 +- 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 | 11 +- drivers/isdn/hisax/hisax_isac.c | 9 +- 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 | 145 +- drivers/isdn/hisax/sportster.c | 4 +- drivers/isdn/hisax/st5481.h | 1 + drivers/isdn/hisax/st5481_b.c | 4 +- drivers/isdn/hisax/st5481_d.c | 4 +- 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/teles_cs.c | 121 +- drivers/isdn/hisax/telespci.c | 12 +- drivers/isdn/hisax/w6692.c | 13 +- drivers/isdn/hysdn/boardergo.c | 34 +- drivers/isdn/hysdn/boardergo.h | 46 +- drivers/isdn/hysdn/hycapi.c | 4 +- drivers/isdn/hysdn/hysdn_boot.c | 28 +- drivers/isdn/hysdn/hysdn_defs.h | 72 +- drivers/isdn/hysdn/hysdn_init.c | 5 +- drivers/isdn/hysdn/hysdn_net.c | 8 +- drivers/isdn/hysdn/hysdn_pof.h | 12 +- drivers/isdn/hysdn/hysdn_procconf.c | 14 +- drivers/isdn/hysdn/hysdn_proclog.c | 10 +- drivers/isdn/hysdn/hysdn_sched.c | 12 +- drivers/isdn/hysdn/ince1pc.h | 18 +- drivers/isdn/i4l/Kconfig | 1 - drivers/isdn/i4l/isdn_common.c | 41 +- drivers/isdn/i4l/isdn_net.c | 1 + drivers/isdn/i4l/isdn_ppp.c | 33 +- drivers/isdn/i4l/isdn_tty.c | 13 +- drivers/isdn/i4l/isdn_tty.h | 1 + drivers/isdn/i4l/isdn_x25iface.c | 6 +- drivers/isdn/icn/icn.c | 3 +- drivers/isdn/isdnloop/isdnloop.c | 6 +- drivers/isdn/pcbit/drv.c | 16 +- drivers/isdn/sc/init.c | 2 +- drivers/isdn/sc/ioctl.c | 10 +- drivers/macintosh/Kconfig | 46 +- drivers/macintosh/Makefile | 4 +- drivers/macintosh/adb.c | 18 +- drivers/macintosh/adbhid.c | 48 +- drivers/macintosh/apm_emu.c | 1 + drivers/macintosh/mac_hid.c | 1 + drivers/macintosh/macio-adb.c | 19 +- drivers/macintosh/macio_asic.c | 162 +- drivers/macintosh/macio_sysfs.c | 1 + drivers/macintosh/mediabay.c | 5 +- drivers/macintosh/smu.c | 77 +- drivers/macintosh/therm_adt746x.c | 1 + drivers/macintosh/therm_pm72.c | 221 +- drivers/macintosh/therm_pm72.h | 35 +- drivers/macintosh/therm_windtunnel.c | 1 + drivers/macintosh/via-cuda.c | 25 +- drivers/macintosh/via-pmu.c | 216 +- drivers/macintosh/via-pmu68k.c | 7 +- drivers/macintosh/windfarm_core.c | 8 +- drivers/macintosh/windfarm_cpufreq_clamp.c | 1 + drivers/macintosh/windfarm_lm75_sensor.c | 1 + drivers/macintosh/windfarm_max6690_sensor.c | 1 + drivers/macintosh/windfarm_smu_controls.c | 2 +- drivers/macintosh/windfarm_smu_sat.c | 1 + drivers/macintosh/windfarm_smu_sensors.c | 2 +- drivers/md/Kconfig | 57 +- drivers/md/Makefile | 5 +- drivers/md/bitmap.c | 498 +- drivers/md/dm-crypt.c | 87 +- drivers/md/dm-emc.c | 40 +- drivers/md/dm-exception-store.c | 22 +- drivers/md/dm-hw-handler.c | 3 +- drivers/md/dm-io.c | 13 +- drivers/md/dm-ioctl.c | 233 +- drivers/md/dm-linear.c | 16 +- drivers/md/dm-log.c | 304 +- drivers/md/dm-log.h | 41 +- drivers/md/dm-mpath.c | 46 +- drivers/md/dm-path-selector.c | 3 +- drivers/md/dm-raid1.c | 805 +- drivers/md/dm-round-robin.c | 6 +- drivers/md/dm-snap.c | 418 +- drivers/md/dm-stripe.c | 38 +- drivers/md/dm-table.c | 116 +- drivers/md/dm-target.c | 5 +- drivers/md/dm-zero.c | 8 +- drivers/md/dm.c | 264 +- drivers/md/dm.h | 84 +- drivers/md/kcopyd.c | 35 +- drivers/md/linear.c | 80 +- drivers/md/md.c | 1024 +- drivers/md/multipath.c | 19 +- drivers/md/raid0.c | 5 +- drivers/md/raid1.c | 173 +- drivers/md/raid10.c | 131 +- drivers/md/raid5.c | 1945 +- drivers/md/raid6algos.c | 7 +- drivers/md/raid6main.c | 45 +- drivers/media/Kconfig | 60 +- drivers/media/common/Kconfig | 3 +- drivers/media/common/Makefile | 3 +- drivers/media/common/ir-common.c | 388 +- drivers/media/common/saa7146_core.c | 11 +- drivers/media/common/saa7146_fops.c | 33 +- drivers/media/common/saa7146_hlp.c | 3 +- drivers/media/common/saa7146_i2c.c | 4 +- drivers/media/common/saa7146_vbi.c | 10 +- drivers/media/common/saa7146_video.c | 42 +- drivers/media/dvb/Kconfig | 10 +- drivers/media/dvb/b2c2/Kconfig | 7 +- drivers/media/dvb/b2c2/flexcop-common.h | 5 +- drivers/media/dvb/b2c2/flexcop-fe-tuner.c | 122 +- drivers/media/dvb/b2c2/flexcop-i2c.c | 6 +- drivers/media/dvb/b2c2/flexcop-pci.c | 21 +- drivers/media/dvb/b2c2/flexcop-usb.c | 11 +- drivers/media/dvb/b2c2/flexcop.c | 12 +- drivers/media/dvb/bt8xx/Kconfig | 5 +- drivers/media/dvb/bt8xx/Makefile | 2 +- drivers/media/dvb/bt8xx/bt878.c | 17 +- drivers/media/dvb/bt8xx/bt878.h | 4 +- drivers/media/dvb/bt8xx/dst.c | 672 +- drivers/media/dvb/bt8xx/dst_ca.c | 122 +- drivers/media/dvb/bt8xx/dst_common.h | 34 +- drivers/media/dvb/bt8xx/dvb-bt8xx.c | 165 +- drivers/media/dvb/bt8xx/dvb-bt8xx.h | 5 +- drivers/media/dvb/cinergyT2/Kconfig | 2 +- drivers/media/dvb/cinergyT2/cinergyT2.c | 63 +- drivers/media/dvb/dvb-core/Makefile | 6 +- drivers/media/dvb/dvb-core/dmxdev.c | 804 +- drivers/media/dvb/dvb-core/dmxdev.h | 36 +- drivers/media/dvb/dvb-core/dvb_ca_en50221.c | 25 +- drivers/media/dvb/dvb-core/dvb_demux.c | 108 +- drivers/media/dvb/dvb-core/dvb_demux.h | 4 +- drivers/media/dvb/dvb-core/dvb_frontend.c | 232 +- drivers/media/dvb/dvb-core/dvb_frontend.h | 48 +- drivers/media/dvb/dvb-core/dvb_net.c | 249 +- drivers/media/dvb/dvb-core/dvb_ringbuffer.c | 2 - drivers/media/dvb/dvb-core/dvb_ringbuffer.h | 1 - drivers/media/dvb/dvb-core/dvbdev.c | 22 +- drivers/media/dvb/dvb-core/dvbdev.h | 5 +- drivers/media/dvb/dvb-usb/Kconfig | 13 +- drivers/media/dvb/dvb-usb/Makefile | 3 - drivers/media/dvb/dvb-usb/cxusb.c | 130 +- drivers/media/dvb/dvb-usb/cxusb.h | 2 - drivers/media/dvb/dvb-usb/dibusb-common.c | 13 +- drivers/media/dvb/dvb-usb/dibusb-mb.c | 7 +- drivers/media/dvb/dvb-usb/digitv.c | 19 +- drivers/media/dvb/dvb-usb/dtt200u-fe.c | 8 +- drivers/media/dvb/dvb-usb/dtt200u.c | 47 +- 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 | 6 +- drivers/media/dvb/dvb-usb/dvb-usb-init.c | 4 +- drivers/media/dvb/dvb-usb/dvb-usb-urb.c | 4 +- drivers/media/dvb/dvb-usb/dvb-usb.h | 16 +- drivers/media/dvb/dvb-usb/umt-010.c | 2 +- drivers/media/dvb/dvb-usb/vp702x-fe.c | 12 +- drivers/media/dvb/dvb-usb/vp702x.c | 4 +- drivers/media/dvb/dvb-usb/vp7045-fe.c | 9 +- drivers/media/dvb/dvb-usb/vp7045.c | 4 +- drivers/media/dvb/frontends/Kconfig | 96 +- drivers/media/dvb/frontends/Makefile | 5 +- drivers/media/dvb/frontends/bcm3510.c | 13 +- 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 | 19 +- drivers/media/dvb/frontends/cx24110.h | 4 + drivers/media/dvb/frontends/cx24123.c | 678 +- 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 | 221 +- drivers/media/dvb/frontends/dvb-pll.h | 24 +- 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/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 | 157 +- drivers/media/dvb/frontends/or51132.h | 2 + drivers/media/dvb/frontends/or51211.c | 6 +- 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 | 67 +- 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/pluto2/Kconfig | 4 +- drivers/media/dvb/pluto2/Makefile | 2 +- drivers/media/dvb/pluto2/pluto2.c | 17 +- drivers/media/dvb/ttpci/Kconfig | 20 +- drivers/media/dvb/ttpci/Makefile | 6 +- drivers/media/dvb/ttpci/av7110.c | 408 +- drivers/media/dvb/ttpci/av7110.h | 11 +- drivers/media/dvb/ttpci/av7110_av.c | 27 +- drivers/media/dvb/ttpci/av7110_hw.c | 40 +- drivers/media/dvb/ttpci/av7110_v4l.c | 78 +- drivers/media/dvb/ttpci/budget-av.c | 297 +- drivers/media/dvb/ttpci/budget-ci.c | 294 +- drivers/media/dvb/ttpci/budget-core.c | 139 +- drivers/media/dvb/ttpci/budget-patch.c | 168 +- drivers/media/dvb/ttpci/budget.c | 316 +- drivers/media/dvb/ttpci/budget.h | 22 +- drivers/media/dvb/ttusb-budget/Kconfig | 5 +- .../media/dvb/ttusb-budget/dvb-ttusb-budget.c | 316 +- drivers/media/dvb/ttusb-dec/ttusb_dec.c | 37 +- drivers/media/dvb/ttusb-dec/ttusbdecfe.c | 8 +- drivers/media/radio/Kconfig | 44 +- drivers/media/radio/Makefile | 3 - drivers/media/radio/miropcm20-radio.c | 17 +- drivers/media/radio/miropcm20-rds-core.c | 45 +- drivers/media/radio/miropcm20-rds.c | 3 +- drivers/media/radio/radio-aimslab.c | 71 +- drivers/media/radio/radio-aztech.c | 57 +- 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 | 19 +- drivers/media/radio/radio-maxiradio.c | 92 +- drivers/media/radio/radio-rtrack2.c | 35 +- drivers/media/radio/radio-sf16fmi.c | 63 +- drivers/media/radio/radio-sf16fmr2.c | 27 +- drivers/media/radio/radio-terratec.c | 63 +- drivers/media/radio/radio-trust.c | 27 +- drivers/media/radio/radio-typhoon.c | 17 +- drivers/media/radio/radio-zoltrix.c | 57 +- drivers/media/video/Kconfig | 300 +- drivers/media/video/Makefile | 59 +- drivers/media/video/adv7170.c | 28 +- drivers/media/video/adv7175.c | 58 +- drivers/media/video/arv.c | 75 +- drivers/media/video/bt819.c | 28 +- drivers/media/video/bt832.c | 193 +- drivers/media/video/bt832.h | 40 +- drivers/media/video/bt856.c | 18 +- drivers/media/video/bttv-cards.c | 5508 +-- drivers/media/video/bttv-driver.c | 858 +- drivers/media/video/bttv-gpio.c | 30 +- drivers/media/video/bttv-i2c.c | 106 +- drivers/media/video/bttv-if.c | 5 +- drivers/media/video/bttv-risc.c | 122 +- drivers/media/video/bttv-vbi.c | 58 +- drivers/media/video/bttv.h | 321 +- drivers/media/video/bttvp.h | 43 +- drivers/media/video/bw-qcam.c | 125 +- drivers/media/video/bw-qcam.h | 2 +- drivers/media/video/c-qcam.c | 86 +- drivers/media/video/compat_ioctl32.c | 55 +- drivers/media/video/cpia.c | 778 +- drivers/media/video/cpia.h | 56 +- drivers/media/video/cpia_pp.c | 117 +- drivers/media/video/cpia_usb.c | 46 +- drivers/media/video/cs53l32a.c | 20 +- drivers/media/video/cs8420.h | 2 +- drivers/media/video/cx25840/Makefile | 4 +- drivers/media/video/cx25840/cx25840-audio.c | 58 +- drivers/media/video/cx25840/cx25840-core.c | 419 +- .../media/video/cx25840/cx25840-firmware.c | 64 +- drivers/media/video/cx25840/cx25840-vbi.c | 180 +- drivers/media/video/cx88/Kconfig | 48 +- drivers/media/video/cx88/Makefile | 12 +- drivers/media/video/cx88/cx88-alsa.c | 85 +- drivers/media/video/cx88/cx88-blackbird.c | 954 +- drivers/media/video/cx88/cx88-cards.c | 279 +- drivers/media/video/cx88/cx88-core.c | 45 +- drivers/media/video/cx88/cx88-dvb.c | 327 +- drivers/media/video/cx88/cx88-i2c.c | 9 +- drivers/media/video/cx88/cx88-input.c | 373 +- drivers/media/video/cx88/cx88-mpeg.c | 84 +- drivers/media/video/cx88/cx88-tvaudio.c | 20 +- drivers/media/video/cx88/cx88-vbi.c | 11 +- drivers/media/video/cx88/cx88-video.c | 170 +- drivers/media/video/cx88/cx88.h | 50 +- drivers/media/video/dpc7146.c | 58 +- drivers/media/video/em28xx/Kconfig | 3 +- drivers/media/video/em28xx/Makefile | 2 +- drivers/media/video/em28xx/em28xx-cards.c | 141 +- drivers/media/video/em28xx/em28xx-core.c | 12 +- drivers/media/video/em28xx/em28xx-i2c.c | 32 +- drivers/media/video/em28xx/em28xx-input.c | 93 +- drivers/media/video/em28xx/em28xx-video.c | 1618 +- drivers/media/video/em28xx/em28xx.h | 17 +- drivers/media/video/hexium_gemini.c | 10 +- drivers/media/video/hexium_orion.c | 18 +- drivers/media/video/ir-kbd-i2c.c | 113 +- drivers/media/video/meye.c | 120 +- drivers/media/video/meye.h | 5 +- drivers/media/video/msp3400-driver.c | 490 +- drivers/media/video/msp3400-kthreads.c | 680 +- drivers/media/video/msp3400.h | 109 +- drivers/media/video/mxb.c | 158 +- drivers/media/video/mxb.h | 2 +- drivers/media/video/ovcamchip/Makefile | 2 +- .../media/video/ovcamchip/ovcamchip_core.c | 6 +- .../media/video/ovcamchip/ovcamchip_priv.h | 2 +- drivers/media/video/planb.c | 139 +- drivers/media/video/planb.h | 8 +- drivers/media/video/pms.c | 167 +- drivers/media/video/saa5246a.c | 11 +- drivers/media/video/saa5249.c | 123 +- drivers/media/video/saa6588.c | 2 +- drivers/media/video/saa7110.c | 25 +- drivers/media/video/saa7111.c | 31 +- drivers/media/video/saa7114.c | 36 +- drivers/media/video/saa7115.c | 244 +- drivers/media/video/saa711x.c | 1 + drivers/media/video/saa7121.h | 6 +- drivers/media/video/saa7127.c | 45 +- drivers/media/video/saa7134/Kconfig | 1 - drivers/media/video/saa7134/Makefile | 6 +- drivers/media/video/saa7134/saa6752hs.c | 315 +- drivers/media/video/saa7134/saa7134-alsa.c | 88 +- drivers/media/video/saa7134/saa7134-cards.c | 84 +- drivers/media/video/saa7134/saa7134-core.c | 57 +- drivers/media/video/saa7134/saa7134-dvb.c | 280 +- drivers/media/video/saa7134/saa7134-empress.c | 32 +- drivers/media/video/saa7134/saa7134-input.c | 555 +- drivers/media/video/saa7134/saa7134-oss.c | 54 +- drivers/media/video/saa7134/saa7134-ts.c | 9 +- drivers/media/video/saa7134/saa7134-tvaudio.c | 16 - drivers/media/video/saa7134/saa7134-vbi.c | 10 +- drivers/media/video/saa7134/saa7134-video.c | 87 +- drivers/media/video/saa7134/saa7134.h | 15 +- drivers/media/video/saa7146.h | 10 +- drivers/media/video/saa7146reg.h | 4 +- drivers/media/video/saa7185.c | 22 +- drivers/media/video/saa7196.h | 4 +- drivers/media/video/stradis.c | 18 +- drivers/media/video/tda7432.c | 5 +- drivers/media/video/tda8290.c | 2 +- drivers/media/video/tda9840.c | 7 +- drivers/media/video/tda9840.h | 2 +- drivers/media/video/tda9875.c | 12 +- drivers/media/video/tda9887.c | 488 +- drivers/media/video/tea5767.c | 2 +- drivers/media/video/tea6415c.c | 7 +- drivers/media/video/tea6420.c | 9 +- drivers/media/video/tea6420.h | 4 +- drivers/media/video/tuner-3036.c | 51 +- drivers/media/video/tuner-core.c | 149 +- drivers/media/video/tuner-simple.c | 255 +- drivers/media/video/tuner-types.c | 660 +- drivers/media/video/tvaudio.c | 166 +- drivers/media/video/tveeprom.c | 58 +- drivers/media/video/tvmixer.c | 8 + drivers/media/video/tvp5150.c | 864 +- drivers/media/video/tvp5150_reg.h | 125 +- drivers/media/video/v4l1-compat.c | 6 +- drivers/media/video/v4l2-common.c | 1116 +- drivers/media/video/video-buf-dvb.c | 15 +- drivers/media/video/video-buf.c | 315 +- drivers/media/video/videocodec.c | 1 + drivers/media/video/videocodec.h | 68 +- drivers/media/video/videodev.c | 1331 +- drivers/media/video/vino.c | 39 +- drivers/media/video/vpx3220.c | 22 +- drivers/media/video/w9966.c | 103 +- drivers/media/video/wm8775.c | 20 +- drivers/media/video/zoran.h | 14 +- drivers/media/video/zoran_card.c | 142 +- drivers/media/video/zoran_card.h | 2 +- drivers/media/video/zoran_device.c | 19 +- drivers/media/video/zoran_device.h | 2 +- drivers/media/video/zoran_driver.c | 293 +- drivers/media/video/zoran_procfs.c | 4 +- drivers/media/video/zoran_procfs.h | 2 +- drivers/media/video/zr36016.c | 22 +- drivers/media/video/zr36050.c | 16 +- drivers/media/video/zr36057.h | 10 +- drivers/media/video/zr36060.c | 20 +- drivers/media/video/zr36120.c | 56 +- drivers/media/video/zr36120.h | 6 +- drivers/media/video/zr36120_mem.c | 1 + drivers/message/fusion/Kconfig | 3 +- drivers/message/fusion/Makefile | 7 +- 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 | 187 +- drivers/message/fusion/lsi/mpi_sas.h | 13 +- drivers/message/fusion/lsi/mpi_targ.h | 5 +- drivers/message/fusion/mptbase.c | 648 +- drivers/message/fusion/mptbase.h | 74 +- drivers/message/fusion/mptctl.c | 12 +- drivers/message/fusion/mptctl.h | 5 + drivers/message/fusion/mptfc.c | 657 +- drivers/message/fusion/mptlan.c | 5 +- drivers/message/fusion/mptsas.c | 1673 +- drivers/message/fusion/mptscsih.c | 2743 +- drivers/message/fusion/mptscsih.h | 12 +- drivers/message/fusion/mptspi.c | 817 +- drivers/message/i2o/core.h | 3 - drivers/message/i2o/debug.c | 32 +- drivers/message/i2o/exec-osm.c | 21 +- drivers/message/i2o/i2o_block.c | 8 +- drivers/message/i2o/i2o_config.c | 4 +- drivers/message/i2o/i2o_proc.c | 2 +- drivers/message/i2o/i2o_scsi.c | 4 +- drivers/message/i2o/iop.c | 15 +- drivers/message/i2o/pci.c | 2 +- drivers/mfd/Kconfig | 1 - drivers/mfd/ucb1x00-core.c | 9 +- drivers/mfd/ucb1x00-ts.c | 1 + drivers/mfd/ucb1x00.h | 1 - drivers/misc/ibmasm/heartbeat.c | 5 +- drivers/misc/ibmasm/ibmasm.h | 1 + drivers/misc/ibmasm/ibmasmfs.c | 26 +- drivers/misc/ibmasm/module.c | 4 +- drivers/mmc/Kconfig | 42 +- drivers/mmc/Makefile | 8 - drivers/mmc/au1xmmc.c | 32 +- drivers/mmc/mmc.c | 128 +- drivers/mmc/mmc_block.c | 10 +- drivers/mmc/mmc_queue.c | 3 +- drivers/mmc/mmci.c | 16 +- drivers/mmc/pxamci.c | 40 +- drivers/mmc/wbsd.c | 33 +- drivers/mtd/Kconfig | 8 +- drivers/mtd/chips/Kconfig | 27 +- drivers/mtd/chips/Makefile | 7 + drivers/mtd/chips/amd_flash.c | 12 +- 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 | 34 +- 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 | 8 +- drivers/mtd/cmdlinepart.c | 7 +- drivers/mtd/devices/Kconfig | 19 +- drivers/mtd/devices/Makefile | 8 + drivers/mtd/devices/blkmtd.c | 25 +- drivers/mtd/devices/block2mtd.c | 133 +- drivers/mtd/devices/doc2000.c | 335 +- drivers/mtd/devices/doc2001.c | 239 +- drivers/mtd/devices/doc2001plus.c | 224 +- drivers/mtd/devices/docprobe.c | 27 +- drivers/mtd/devices/lart.c | 11 +- drivers/mtd/devices/m25p80.c | 15 +- drivers/mtd/devices/ms02-nv.c | 5 +- drivers/mtd/devices/mtd_dataflash.c | 4 +- drivers/mtd/devices/mtdram.c | 2 +- drivers/mtd/devices/phram.c | 17 +- drivers/mtd/devices/pmc551.c | 16 +- drivers/mtd/devices/slram.c | 4 +- drivers/mtd/inftlcore.c | 200 +- drivers/mtd/inftlmount.c | 60 +- drivers/mtd/maps/Kconfig | 25 +- drivers/mtd/maps/alchemy-flash.c | 5 +- drivers/mtd/maps/amd76xrom.c | 6 +- drivers/mtd/maps/ceiva.c | 1 + drivers/mtd/maps/cfi_flagadm.c | 6 +- drivers/mtd/maps/cstm_mips_ixx.c | 1 + drivers/mtd/maps/dbox2-flash.c | 5 +- drivers/mtd/maps/dc21285.c | 1 + drivers/mtd/maps/dilnetpc.c | 13 +- drivers/mtd/maps/dmv182.c | 3 +- drivers/mtd/maps/ebony.c | 1 + drivers/mtd/maps/edb7312.c | 1 + drivers/mtd/maps/h720x-flash.c | 3 +- drivers/mtd/maps/ichxrom.c | 6 +- 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/netsc520.c | 4 +- drivers/mtd/maps/nettel.c | 7 +- drivers/mtd/maps/ocotea.c | 7 +- drivers/mtd/maps/omap-toto-flash.c | 1 + drivers/mtd/maps/pci.c | 3 + drivers/mtd/maps/pcmciamtd.c | 132 +- drivers/mtd/maps/physmap.c | 256 +- drivers/mtd/maps/redwood.c | 4 +- drivers/mtd/maps/sa1100-flash.c | 1 + drivers/mtd/maps/sbc8240.c | 9 +- drivers/mtd/maps/sc520cdp.c | 3 +- drivers/mtd/maps/scb2_flash.c | 1 + drivers/mtd/maps/scx200_docflash.c | 8 +- drivers/mtd/maps/sharpsl-flash.c | 4 +- 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 | 3 +- drivers/mtd/maps/uclinux.c | 3 +- drivers/mtd/maps/vmax301.c | 2 +- drivers/mtd/maps/walnut.c | 1 + drivers/mtd/maps/wr_sbc82xx_flash.c | 1 + drivers/mtd/mtd_blkdevs.c | 35 +- drivers/mtd/mtdblock.c | 31 +- drivers/mtd/mtdblock_ro.c | 4 +- drivers/mtd/mtdchar.c | 339 +- drivers/mtd/mtdconcat.c | 341 +- drivers/mtd/mtdcore.c | 79 +- drivers/mtd/mtdpart.c | 172 +- drivers/mtd/nand/Kconfig | 59 +- drivers/mtd/nand/Makefile | 4 - drivers/mtd/nand/au1550nd.c | 325 +- drivers/mtd/nand/autcpu12.c | 125 +- drivers/mtd/nand/diskonchip.c | 530 +- drivers/mtd/nand/edb7312.c | 97 +- drivers/mtd/nand/h1910.c | 98 +- drivers/mtd/nand/nand_base.c | 3301 +- drivers/mtd/nand/nand_bbt.c | 502 +- drivers/mtd/nand/nand_ecc.c | 226 +- drivers/mtd/nand/nand_ids.c | 177 +- drivers/mtd/nand/nandsim.c | 96 +- drivers/mtd/nand/ppchameleonevb.c | 256 +- drivers/mtd/nand/rtc_from4.c | 351 +- drivers/mtd/nand/s3c2410.c | 378 +- drivers/mtd/nand/sharpsl.c | 154 +- drivers/mtd/nand/spia.c | 101 +- drivers/mtd/nand/toto.c | 121 +- 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 | 24 +- 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 | 71 +- drivers/net/3c515.c | 6 +- drivers/net/3c523.c | 13 +- drivers/net/3c527.c | 7 +- drivers/net/3c59x.c | 536 +- drivers/net/7990.c | 2 +- drivers/net/8139cp.c | 248 +- drivers/net/8139too.c | 70 +- drivers/net/82596.c | 15 +- drivers/net/8390.c | 14 +- drivers/net/8390.h | 3 +- drivers/net/Kconfig | 134 +- drivers/net/Makefile | 11 +- drivers/net/Space.c | 1 + drivers/net/a2065.c | 8 +- drivers/net/ac3200.c | 3 +- drivers/net/acenic.c | 9 +- drivers/net/acenic.h | 1 + drivers/net/acenic_firmware.h | 11 +- drivers/net/amd8111e.c | 3 +- drivers/net/apne.c | 9 +- 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/Kconfig | 4 +- drivers/net/arcnet/arc-rawmode.c | 2 +- drivers/net/arcnet/arc-rimi.c | 68 +- drivers/net/arcnet/arcnet.c | 24 +- drivers/net/arcnet/com20020-pci.c | 2 +- drivers/net/arcnet/com90xx.c | 132 +- drivers/net/arcnet/rfc1051.c | 2 +- drivers/net/arcnet/rfc1201.c | 2 +- drivers/net/ariadne.c | 7 +- drivers/net/arm/Kconfig | 8 - drivers/net/arm/Makefile | 1 - drivers/net/arm/am79c961a.c | 4 +- drivers/net/arm/ether1.c | 3 +- drivers/net/arm/ether3.c | 3 +- drivers/net/arm/etherh.c | 3 +- drivers/net/at1700.c | 3 +- drivers/net/atari_bionet.c | 2 +- drivers/net/atari_pamsnet.c | 2 +- drivers/net/atarilance.c | 5 +- drivers/net/au1000_eth.c | 1839 +- drivers/net/au1000_eth.h | 134 +- drivers/net/b44.c | 408 +- drivers/net/b44.h | 7 - drivers/net/bmac.c | 1 + drivers/net/bnx2.c | 903 +- drivers/net/bnx2.h | 115 +- drivers/net/bnx2_fw.h | 5340 ++- drivers/net/bonding/bond_3ad.c | 28 - drivers/net/bonding/bond_3ad.h | 1 - drivers/net/bonding/bond_alb.c | 2 +- drivers/net/bonding/bond_main.c | 161 +- drivers/net/bonding/bond_sysfs.c | 7 +- drivers/net/bonding/bonding.h | 33 +- drivers/net/cassini.c | 91 +- drivers/net/cassini.h | 2 +- drivers/net/chelsio/Makefile | 2 +- drivers/net/chelsio/common.h | 1 + drivers/net/chelsio/cxgb2.c | 5 +- drivers/net/chelsio/espi.c | 14 +- drivers/net/chelsio/sge.c | 8 +- drivers/net/chelsio/subr.c | 2 +- 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 | 10 +- drivers/net/dgrs.c | 18 +- drivers/net/dgrs_firmware.c | 4 +- drivers/net/dl2k.c | 64 +- drivers/net/dl2k.h | 12 +- drivers/net/dm9000.c | 54 +- drivers/net/dummy.c | 2 +- drivers/net/e100.c | 94 +- drivers/net/e1000/Makefile | 3 +- drivers/net/e1000/e1000.h | 86 +- drivers/net/e1000/e1000_ethtool.c | 297 +- drivers/net/e1000/e1000_hw.c | 2672 +- drivers/net/e1000/e1000_hw.h | 708 +- drivers/net/e1000/e1000_main.c | 1386 +- drivers/net/e1000/e1000_osdep.h | 16 +- drivers/net/e1000/e1000_param.c | 204 +- drivers/net/e2100.c | 4 +- drivers/net/eepro.c | 8 +- drivers/net/eepro100.c | 18 +- drivers/net/eexpress.c | 6 +- drivers/net/epic100.c | 169 +- drivers/net/eql.c | 3 +- drivers/net/es3210.c | 3 +- drivers/net/eth16i.c | 16 +- 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 | 1 + drivers/net/forcedeth.c | 2581 +- drivers/net/fs_enet/Makefile | 6 +- drivers/net/fs_enet/fs_enet-main.c | 214 +- drivers/net/fs_enet/fs_enet.h | 40 +- drivers/net/fs_enet/mac-fcc.c | 35 +- drivers/net/fs_enet/mac-fec.c | 145 +- drivers/net/fs_enet/mac-scc.c | 7 +- drivers/net/fs_enet/mii-bitbang.c | 449 +- drivers/net/gianfar.c | 61 +- drivers/net/gianfar.h | 68 +- drivers/net/gianfar_ethtool.c | 21 +- drivers/net/gianfar_mii.c | 1 + drivers/net/gianfar_sysfs.c | 25 +- drivers/net/gt96100eth.c | 9 +- drivers/net/gt96100eth.h | 3 + drivers/net/hamachi.c | 20 +- drivers/net/hamradio/6pack.c | 11 +- drivers/net/hamradio/baycom_epp.c | 2 +- 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 | 5 +- drivers/net/hamradio/mkiss.c | 11 +- drivers/net/hamradio/scc.c | 4 +- drivers/net/hamradio/yam.c | 4 +- drivers/net/hp-plus.c | 19 +- drivers/net/hp.c | 4 +- drivers/net/hp100.c | 45 +- drivers/net/hplance.c | 2 +- drivers/net/hydra.c | 4 +- drivers/net/ibm_emac/ibm_emac.h | 1 + drivers/net/ibm_emac/ibm_emac_core.c | 41 +- drivers/net/ibm_emac/ibm_emac_core.h | 3 +- drivers/net/ibm_emac/ibm_emac_debug.c | 3 +- drivers/net/ibm_emac/ibm_emac_debug.h | 1 + drivers/net/ibm_emac/ibm_emac_mal.c | 1 + drivers/net/ibm_emac/ibm_emac_mal.h | 1 + drivers/net/ibm_emac/ibm_emac_phy.c | 1 + drivers/net/ibm_emac/ibm_emac_rgmii.c | 1 + drivers/net/ibm_emac/ibm_emac_rgmii.h | 3 +- drivers/net/ibm_emac/ibm_emac_tah.c | 1 + drivers/net/ibm_emac/ibm_emac_tah.h | 1 + drivers/net/ibm_emac/ibm_emac_zmii.c | 8 +- drivers/net/ibm_emac/ibm_emac_zmii.h | 3 +- drivers/net/ibmlana.c | 22 +- drivers/net/ibmlana.h | 6 +- drivers/net/ibmveth.c | 324 +- drivers/net/ibmveth.h | 11 +- drivers/net/ifb.c | 12 +- drivers/net/ioc3-eth.c | 12 +- drivers/net/irda/Kconfig | 47 +- drivers/net/irda/Makefile | 4 +- drivers/net/irda/ali-ircc.c | 109 +- drivers/net/irda/au1k_ir.c | 1 + drivers/net/irda/donauboe.c | 6 +- drivers/net/irda/ep7211_ir.c | 11 +- drivers/net/irda/irda-usb.c | 320 +- drivers/net/irda/irda-usb.h | 41 +- drivers/net/irda/irport.c | 6 +- drivers/net/irda/irtty-sir.c | 19 +- drivers/net/irda/nsc-ircc.c | 326 +- drivers/net/irda/nsc-ircc.h | 2 +- drivers/net/irda/pxaficp_ir.c | 1 + drivers/net/irda/sa1100_ir.c | 4 +- drivers/net/irda/sir-dev.h | 13 +- drivers/net/irda/sir_dev.c | 315 +- drivers/net/irda/sir_dongle.c | 19 +- drivers/net/irda/sir_kthread.c | 14 +- drivers/net/irda/smsc-ircc2.c | 537 +- drivers/net/irda/stir4200.c | 38 +- drivers/net/irda/vlsi_ir.c | 7 +- 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 | 327 +- 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 | 16 +- drivers/net/ixp2000/ixp2400-msf.c | 1 + drivers/net/ixp2000/ixpdev.c | 10 +- drivers/net/ixp2000/pm3386.c | 31 +- drivers/net/ixp2000/pm3386.h | 1 - drivers/net/jazzsonic.c | 2 +- drivers/net/lance.c | 14 +- drivers/net/lasi_82596.c | 9 +- drivers/net/lne390.c | 2 +- drivers/net/loopback.c | 8 +- drivers/net/lp486e.c | 11 +- drivers/net/mac89x0.c | 2 +- drivers/net/mace.c | 7 +- drivers/net/macsonic.c | 2 +- drivers/net/meth.c | 2 +- drivers/net/mipsnet.c | 2 +- drivers/net/mv643xx_eth.c | 1577 +- drivers/net/mv643xx_eth.h | 258 +- drivers/net/myri_sbus.c | 119 +- drivers/net/myri_sbus.h | 1 + drivers/net/natsemi.c | 432 +- drivers/net/ne-h8300.c | 11 +- drivers/net/ne.c | 42 +- drivers/net/ne2.c | 9 +- drivers/net/ne2k-pci.c | 15 +- drivers/net/netconsole.c | 5 +- drivers/net/ni5010.c | 56 +- drivers/net/ni52.c | 2 +- drivers/net/ni65.c | 2 +- drivers/net/ns83820.c | 61 +- drivers/net/oaknet.c | 3 +- drivers/net/pci-skeleton.c | 22 +- drivers/net/pcmcia/3c574_cs.c | 117 +- drivers/net/pcmcia/3c589_cs.c | 127 +- drivers/net/pcmcia/axnet_cs.c | 182 +- drivers/net/pcmcia/com20020_cs.c | 132 +- drivers/net/pcmcia/fmvj18x_cs.c | 171 +- drivers/net/pcmcia/ibmtr_cs.c | 121 +- drivers/net/pcmcia/nmclan_cs.c | 130 +- drivers/net/pcmcia/pcnet_cs.c | 209 +- drivers/net/pcmcia/smc91c92_cs.c | 241 +- drivers/net/pcmcia/xirc2ps_cs.c | 194 +- drivers/net/pcnet32.c | 4364 ++- 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 | 6 +- drivers/net/phy/phy.c | 13 +- drivers/net/phy/phy_device.c | 52 +- drivers/net/phy/qsemi.c | 1 + drivers/net/plip.c | 4 +- drivers/net/ppp_async.c | 3 +- drivers/net/ppp_generic.c | 74 +- drivers/net/ppp_mppe.c | 1 + drivers/net/ppp_synctty.c | 2 +- drivers/net/pppoe.c | 7 +- drivers/net/r8169.c | 88 +- drivers/net/rrunner.c | 3 +- drivers/net/rrunner.h | 1 + drivers/net/s2io-regs.h | 32 +- drivers/net/s2io.c | 2513 +- drivers/net/s2io.h | 127 +- drivers/net/sb1000.c | 2 +- drivers/net/sb1250-mac.c | 112 +- drivers/net/seeq8005.c | 10 +- drivers/net/sgiseeq.c | 17 +- drivers/net/shaper.c | 4 +- drivers/net/sis190.c | 7 +- drivers/net/sis900.c | 44 +- drivers/net/sis900.h | 10 +- drivers/net/sk98lin/h/skaddr.h | 48 + drivers/net/sk98lin/h/skcsum.h | 6 + drivers/net/sk98lin/h/skgeinit.h | 56 + drivers/net/sk98lin/h/skgepnmi.h | 4 + drivers/net/sk98lin/h/skgesirq.h | 1 + drivers/net/sk98lin/h/ski2c.h | 3 + drivers/net/sk98lin/h/skvpd.h | 15 + drivers/net/sk98lin/h/xmac_ii.h | 2 +- drivers/net/sk98lin/skaddr.c | 35 +- drivers/net/sk98lin/skge.c | 12 +- drivers/net/sk98lin/skgeinit.c | 148 +- drivers/net/sk98lin/skgemib.c | 7 + drivers/net/sk98lin/skgepnmi.c | 153 +- drivers/net/sk98lin/skgesirq.c | 24 +- drivers/net/sk98lin/ski2c.c | 6 +- drivers/net/sk98lin/sklm80.c | 72 + drivers/net/sk98lin/skrlmt.c | 1 + drivers/net/sk98lin/skvpd.c | 110 +- drivers/net/sk98lin/skxmac2.c | 461 +- drivers/net/sk_mca.c | 2 +- drivers/net/skfp/fplustm.c | 26 +- drivers/net/skfp/h/sba.h | 2 +- drivers/net/skfp/pcmplc.c | 4 +- drivers/net/skfp/skfddi.c | 4 +- drivers/net/skge.c | 463 +- drivers/net/skge.h | 12 +- drivers/net/sky2.c | 989 +- drivers/net/sky2.h | 122 +- 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 | 66 +- drivers/net/smc91x.h | 569 +- drivers/net/sonic.c | 3 +- drivers/net/sonic.h | 1 + drivers/net/spider_net.c | 601 +- drivers/net/spider_net.h | 78 +- drivers/net/spider_net_ethtool.c | 13 - drivers/net/starfire.c | 174 +- drivers/net/stnic.c | 1 + drivers/net/sun3lance.c | 6 +- drivers/net/sunbmac.c | 129 +- drivers/net/sunbmac.h | 1 + drivers/net/sundance.c | 116 +- drivers/net/sungem.c | 58 +- drivers/net/sungem.h | 6 +- drivers/net/sungem_phy.c | 59 +- drivers/net/sungem_phy.h | 1 - drivers/net/sunhme.c | 433 +- drivers/net/sunhme.h | 2 + drivers/net/sunlance.c | 173 +- drivers/net/sunqe.c | 468 +- drivers/net/tc35815.c | 2 +- drivers/net/tg3.c | 1430 +- drivers/net/tg3.h | 59 +- drivers/net/tlan.c | 2 +- drivers/net/tokenring/3c359.c | 3 +- drivers/net/tokenring/Kconfig | 2 +- drivers/net/tokenring/abyss.c | 5 +- drivers/net/tokenring/ibmtr.c | 9 +- drivers/net/tokenring/lanstreamer.c | 6 +- drivers/net/tokenring/madgemc.c | 5 +- drivers/net/tokenring/olympic.c | 16 +- drivers/net/tokenring/smctr.c | 10 +- drivers/net/tokenring/smctr_firmware.h | 1 + drivers/net/tokenring/tmspci.c | 2 +- drivers/net/tulip/de2104x.c | 90 +- drivers/net/tulip/de4x5.c | 725 +- 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/pnic.c | 3 +- drivers/net/tulip/pnic2.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 | 92 +- drivers/net/tulip/xircom_cb.c | 222 +- drivers/net/tulip/xircom_tulip_cb.c | 30 +- drivers/net/tun.c | 5 +- drivers/net/typhoon.c | 21 +- drivers/net/via-rhine.c | 272 +- drivers/net/via-velocity.c | 116 +- drivers/net/via-velocity.h | 6 +- drivers/net/wan/Kconfig | 109 + drivers/net/wan/Makefile | 14 + 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 | 21 +- 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 | 3 +- 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.h | 1 - drivers/net/wan/pc300_drv.c | 6 +- drivers/net/wan/pci200syn.c | 30 +- drivers/net/wan/sbni.c | 6 +- drivers/net/wan/sdla.c | 5 +- drivers/net/wan/sdla_fr.c | 33 +- drivers/net/wan/sdla_ft1.c | 3 +- drivers/net/wan/sdla_ppp.c | 3 +- drivers/net/wan/sdla_x25.c | 11 +- drivers/net/wan/sdladrv.c | 18 +- drivers/net/wan/sdlamain.c | 23 +- drivers/net/wan/sealevel.c | 3 +- drivers/net/wan/syncppp.c | 1 + drivers/net/wan/wanpipe_multppp.c | 9 +- drivers/net/wan/wanxl.c | 23 +- drivers/net/wd.c | 4 +- drivers/net/wireless/Kconfig | 91 +- drivers/net/wireless/Makefile | 4 - drivers/net/wireless/airo.c | 1063 +- drivers/net/wireless/airo_cs.c | 159 +- drivers/net/wireless/airport.c | 1 + drivers/net/wireless/arlan-main.c | 5 +- drivers/net/wireless/arlan-proc.c | 1 + drivers/net/wireless/arlan.h | 1 + drivers/net/wireless/atmel.c | 124 +- drivers/net/wireless/atmel_cs.c | 163 +- drivers/net/wireless/atmel_pci.c | 1 + drivers/net/wireless/hermes.c | 67 +- drivers/net/wireless/hermes.h | 43 +- drivers/net/wireless/hostap/hostap_80211.h | 2 + drivers/net/wireless/hostap/hostap_80211_tx.c | 8 +- drivers/net/wireless/hostap/hostap_ap.c | 13 +- drivers/net/wireless/hostap/hostap_cs.c | 209 +- drivers/net/wireless/hostap/hostap_hw.c | 22 +- drivers/net/wireless/hostap/hostap_ioctl.c | 8 +- drivers/net/wireless/hostap/hostap_main.c | 3 + drivers/net/wireless/hostap/hostap_pci.c | 7 +- drivers/net/wireless/hostap/hostap_plx.c | 18 +- drivers/net/wireless/ipw2100.c | 273 +- drivers/net/wireless/ipw2100.h | 17 +- drivers/net/wireless/ipw2200.c | 2113 +- drivers/net/wireless/ipw2200.h | 188 +- drivers/net/wireless/netwave_cs.c | 130 +- drivers/net/wireless/orinoco.c | 268 +- drivers/net/wireless/orinoco.h | 19 +- drivers/net/wireless/orinoco_cs.c | 212 +- 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/isl_ioctl.c | 2 +- drivers/net/wireless/prism54/islpci_hotplug.c | 5 +- drivers/net/wireless/prism54/islpci_mgt.c | 1 + drivers/net/wireless/prism54/oid_mgt.c | 4 +- drivers/net/wireless/prism54/prismcompat.h | 1 + drivers/net/wireless/ray_cs.c | 283 +- drivers/net/wireless/ray_cs.h | 2 +- drivers/net/wireless/spectrum_cs.c | 272 +- drivers/net/wireless/strip.c | 11 +- drivers/net/wireless/wavelan.c | 20 +- drivers/net/wireless/wavelan.p.h | 6 +- drivers/net/wireless/wavelan_cs.c | 196 +- drivers/net/wireless/wavelan_cs.p.h | 16 +- drivers/net/wireless/wl3501.h | 1 - drivers/net/wireless/wl3501_cs.c | 179 +- drivers/net/yellowfin.c | 82 +- drivers/net/znet.c | 4 +- drivers/net/zorro8390.c | 11 +- drivers/nubus/nubus.c | 1 + drivers/nubus/nubus_syms.c | 1 + drivers/oprofile/buffer_sync.c | 74 +- drivers/oprofile/cpu_buffer.c | 67 +- drivers/oprofile/cpu_buffer.h | 9 +- drivers/oprofile/event_buffer.c | 12 +- drivers/oprofile/event_buffer.h | 11 +- drivers/oprofile/oprof.c | 58 +- drivers/oprofile/oprof.h | 3 - drivers/oprofile/oprofile_files.c | 207 +- drivers/oprofile/oprofile_stats.c | 4 +- drivers/oprofile/oprofilefs.c | 23 +- drivers/parisc/Kconfig | 33 +- drivers/parisc/ccio-dma.c | 3 +- drivers/parisc/dino.c | 10 +- drivers/parisc/eisa.c | 6 +- drivers/parisc/gsc.c | 9 +- drivers/parisc/iosapic.c | 4 +- drivers/parisc/lba_pci.c | 8 +- drivers/parisc/led.c | 26 +- drivers/parisc/pdc_stable.c | 230 +- drivers/parisc/power.c | 7 +- drivers/parisc/sba_iommu.c | 75 +- drivers/parisc/superio.c | 63 +- drivers/parport/Kconfig | 19 +- drivers/parport/Makefile | 3 +- drivers/parport/daisy.c | 2 +- drivers/parport/ieee1284.c | 1 + drivers/parport/ieee1284_ops.c | 1 + drivers/parport/parport_cs.c | 129 +- drivers/parport/parport_gsc.c | 2 +- drivers/parport/parport_gsc.h | 2 +- drivers/parport/parport_mfc3.c | 2 +- drivers/parport/parport_pc.c | 54 +- drivers/parport/parport_serial.c | 77 +- drivers/parport/parport_sunbpp.c | 136 +- drivers/parport/procfs.c | 3 +- drivers/parport/share.c | 22 +- drivers/pci/Kconfig | 22 +- drivers/pci/Makefile | 6 +- drivers/pci/bus.c | 31 +- drivers/pci/hotplug/Kconfig | 12 +- drivers/pci/hotplug/Makefile | 17 +- drivers/pci/hotplug/acpiphp.h | 35 +- drivers/pci/hotplug/acpiphp_core.c | 128 +- drivers/pci/hotplug/acpiphp_glue.c | 561 +- drivers/pci/hotplug/cpci_hotplug_core.c | 12 +- 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.h | 3 +- drivers/pci/hotplug/cpqphp_core.c | 40 +- drivers/pci/hotplug/cpqphp_ctrl.c | 125 +- 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 | 10 +- drivers/pci/hotplug/ibmphp.h | 2 + drivers/pci/hotplug/ibmphp_core.c | 22 +- drivers/pci/hotplug/ibmphp_ebda.c | 59 +- drivers/pci/hotplug/ibmphp_hpc.c | 64 +- drivers/pci/hotplug/ibmphp_pci.c | 121 +- drivers/pci/hotplug/ibmphp_res.c | 81 +- drivers/pci/hotplug/pci_hotplug.h | 56 - drivers/pci/hotplug/pci_hotplug_core.c | 1 + drivers/pci/hotplug/pciehp.h | 32 +- drivers/pci/hotplug/pciehp_core.c | 33 +- drivers/pci/hotplug/pciehp_ctrl.c | 68 +- drivers/pci/hotplug/pciehp_hpc.c | 108 +- drivers/pci/hotplug/pciehp_pci.c | 152 +- drivers/pci/hotplug/pciehprm_acpi.c | 1726 +- drivers/pci/hotplug/pciehprm_nonacpi.c | 466 +- drivers/pci/hotplug/pcihp_skeleton.c | 34 +- drivers/pci/hotplug/rpadlpar_core.c | 12 +- drivers/pci/hotplug/rpaphp_core.c | 4 + drivers/pci/hotplug/rpaphp_slot.c | 9 +- drivers/pci/hotplug/sgi_hotplug.c | 81 +- drivers/pci/hotplug/shpchp.h | 114 +- drivers/pci/hotplug/shpchp_core.c | 329 +- drivers/pci/hotplug/shpchp_ctrl.c | 834 +- drivers/pci/hotplug/shpchp_hpc.c | 1339 +- drivers/pci/hotplug/shpchp_pci.c | 31 +- drivers/pci/hotplug/shpchp_sysfs.c | 18 +- drivers/pci/hotplug/shpchprm_acpi.c | 1651 +- drivers/pci/hotplug/shpchprm_legacy.c | 397 +- drivers/pci/hotplug/shpchprm_nonacpi.c | 393 +- drivers/pci/msi.c | 532 +- drivers/pci/msi.h | 133 +- drivers/pci/pci-acpi.c | 16 +- drivers/pci/pci-driver.c | 34 +- drivers/pci/pci-sysfs.c | 56 +- drivers/pci/pci.c | 84 +- drivers/pci/pci.h | 31 +- drivers/pci/pcie/portdrv.h | 1 + drivers/pci/pcie/portdrv_core.c | 3 +- drivers/pci/pcie/portdrv_pci.c | 100 +- drivers/pci/probe.c | 80 +- drivers/pci/proc.c | 146 +- drivers/pci/quirks.c | 211 +- drivers/pci/remove.c | 12 +- drivers/pci/rom.c | 11 +- drivers/pci/search.c | 84 +- drivers/pci/setup-bus.c | 11 +- drivers/pci/setup-res.c | 74 +- drivers/pcmcia/Kconfig | 11 +- drivers/pcmcia/Makefile | 3 +- drivers/pcmcia/au1000_db1x00.c | 3 +- drivers/pcmcia/au1000_generic.c | 1 + drivers/pcmcia/au1000_generic.h | 1 + drivers/pcmcia/au1000_pb1x00.c | 1 + drivers/pcmcia/cistpl.c | 1 + drivers/pcmcia/cs.c | 72 +- drivers/pcmcia/cs_internal.h | 19 +- drivers/pcmcia/ds.c | 270 +- drivers/pcmcia/ds_internal.h | 4 +- drivers/pcmcia/hd64465_ss.c | 8 +- drivers/pcmcia/i82092.c | 3 +- drivers/pcmcia/i82365.c | 13 +- drivers/pcmcia/m32r_cfc.c | 1 + drivers/pcmcia/m32r_pcc.c | 1 + drivers/pcmcia/m8xx_pcmcia.c | 4 +- drivers/pcmcia/omap_cf.c | 4 +- drivers/pcmcia/pcmcia_compat.c | 82 +- drivers/pcmcia/pcmcia_ioctl.c | 84 +- drivers/pcmcia/pcmcia_resource.c | 272 +- drivers/pcmcia/pd6729.c | 8 +- drivers/pcmcia/pxa2xx_base.c | 1 + drivers/pcmcia/pxa2xx_sharpsl.c | 8 + drivers/pcmcia/rsrc_mgr.c | 5 +- drivers/pcmcia/rsrc_nonstatic.c | 67 +- drivers/pcmcia/sa1100_badge4.c | 4 +- drivers/pcmcia/sa1100_cerf.c | 1 + drivers/pcmcia/sa1100_generic.c | 1 + drivers/pcmcia/sa1111_generic.c | 1 + drivers/pcmcia/sa11xx_base.c | 1 + drivers/pcmcia/soc_common.c | 5 +- drivers/pcmcia/socket_sysfs.c | 10 +- drivers/pcmcia/tcic.c | 5 +- drivers/pcmcia/ti113x.h | 2 +- drivers/pcmcia/vrc4171_card.c | 14 +- drivers/pcmcia/vrc4173_cardu.c | 10 +- drivers/pcmcia/yenta_socket.c | 87 +- drivers/pnp/card.c | 65 +- drivers/pnp/driver.c | 20 +- drivers/pnp/interface.c | 20 +- drivers/pnp/isapnp/compat.c | 1 + drivers/pnp/isapnp/core.c | 16 +- drivers/pnp/isapnp/proc.c | 1 + drivers/pnp/manager.c | 20 +- drivers/pnp/pnpacpi/core.c | 1 + drivers/pnp/pnpacpi/rsparser.c | 218 +- drivers/pnp/pnpbios/core.c | 2 +- drivers/pnp/pnpbios/rsparser.c | 7 +- drivers/pnp/quirks.c | 1 + drivers/pnp/resource.c | 12 +- 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/s390/Kconfig | 8 +- drivers/s390/block/Kconfig | 14 +- drivers/s390/block/Makefile | 4 +- drivers/s390/block/dasd.c | 402 +- drivers/s390/block/dasd_3370_erp.c | 27 +- drivers/s390/block/dasd_3990_erp.c | 192 +- drivers/s390/block/dasd_9336_erp.c | 27 +- drivers/s390/block/dasd_9343_erp.c | 2 +- drivers/s390/block/dasd_cmb.c | 2 - drivers/s390/block/dasd_devmap.c | 261 +- drivers/s390/block/dasd_diag.c | 7 +- drivers/s390/block/dasd_diag.h | 2 +- drivers/s390/block/dasd_eckd.c | 523 +- drivers/s390/block/dasd_eckd.h | 71 +- drivers/s390/block/dasd_erp.c | 17 +- 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 | 112 +- drivers/s390/block/dasd_ioctl.c | 335 +- drivers/s390/block/dasd_proc.c | 18 +- drivers/s390/block/dcssblk.c | 11 +- drivers/s390/block/xpram.c | 105 +- drivers/s390/char/Makefile | 1 - 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 | 28 +- drivers/s390/char/keyboard.c | 21 +- drivers/s390/char/monreader.c | 7 +- drivers/s390/char/raw3270.c | 196 +- 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 | 4 +- drivers/s390/char/sclp_rw.c | 3 +- drivers/s390/char/sclp_tty.c | 1 + drivers/s390/char/sclp_vt220.c | 1 + drivers/s390/char/tape.h | 2 +- drivers/s390/char/tape_34xx.c | 15 +- drivers/s390/char/tape_block.c | 18 +- drivers/s390/char/tape_char.c | 1 + drivers/s390/char/tape_class.c | 13 +- drivers/s390/char/tape_core.c | 86 +- drivers/s390/char/tape_proc.c | 1 + drivers/s390/char/tape_std.c | 16 +- drivers/s390/char/tape_std.h | 13 +- drivers/s390/char/tty3270.c | 38 +- drivers/s390/char/vmlogrdr.c | 9 +- drivers/s390/char/vmwatchdog.c | 2 +- drivers/s390/cio/blacklist.c | 40 +- drivers/s390/cio/ccwgroup.c | 46 +- drivers/s390/cio/chsc.c | 530 +- drivers/s390/cio/chsc.h | 22 +- drivers/s390/cio/cio.c | 9 +- drivers/s390/cio/cio.h | 3 +- drivers/s390/cio/cio_debug.h | 22 +- drivers/s390/cio/cmf.c | 628 +- drivers/s390/cio/css.c | 137 +- drivers/s390/cio/css.h | 14 +- drivers/s390/cio/device.c | 44 +- drivers/s390/cio/device.h | 10 - drivers/s390/cio/device_fsm.c | 144 +- drivers/s390/cio/device_id.c | 1 + drivers/s390/cio/device_ops.c | 23 +- drivers/s390/cio/device_pgid.c | 150 +- drivers/s390/cio/device_status.c | 8 +- drivers/s390/cio/qdio.c | 57 +- drivers/s390/crypto/z90crypt.h | 185 +- drivers/s390/crypto/z90hardware.c | 10 +- drivers/s390/crypto/z90main.c | 16 +- drivers/s390/net/Kconfig | 9 + drivers/s390/net/Makefile | 2 +- drivers/s390/net/claw.c | 7 +- drivers/s390/net/ctcmain.c | 95 +- drivers/s390/net/ctcmain.h | 12 +- drivers/s390/net/ctctty.c | 10 +- drivers/s390/net/cu3088.c | 10 +- drivers/s390/net/fsm.c | 11 +- drivers/s390/net/iucv.c | 54 +- drivers/s390/net/iucv.h | 622 +- drivers/s390/net/lcs.c | 365 +- drivers/s390/net/lcs.h | 14 +- drivers/s390/net/netiucv.c | 125 +- drivers/s390/net/qeth.h | 87 +- drivers/s390/net/qeth_eddp.c | 49 +- drivers/s390/net/qeth_fs.h | 2 +- drivers/s390/net/qeth_main.c | 728 +- drivers/s390/net/qeth_mpc.h | 4 +- drivers/s390/net/qeth_proc.c | 87 +- drivers/s390/net/qeth_sys.c | 79 +- drivers/s390/net/qeth_tso.h | 8 +- drivers/s390/net/smsgiucv.c | 14 +- drivers/s390/s390_rdev.c | 3 +- drivers/s390/s390mach.c | 53 +- drivers/s390/scsi/zfcp_aux.c | 271 +- 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 | 10 +- 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 | 21 +- drivers/sbus/char/openprom.c | 596 +- 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 | 143 +- drivers/scsi/3w-9xxx.h | 18 +- drivers/scsi/3w-xxxx.c | 10 +- drivers/scsi/53c700.c | 134 +- drivers/scsi/53c700.h | 42 +- drivers/scsi/53c7xx.c | 31 +- drivers/scsi/BusLogic.c | 13 +- drivers/scsi/BusLogic.h | 1 + drivers/scsi/FlashPoint.c | 9816 +++--- drivers/scsi/Kconfig | 48 +- drivers/scsi/Makefile | 10 +- 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 | 18 +- drivers/scsi/NCR_Q720.c | 2 +- drivers/scsi/a100u2w.c | 5 +- drivers/scsi/a2091.c | 2 +- drivers/scsi/a3000.c | 2 +- drivers/scsi/aacraid/aachba.c | 144 +- drivers/scsi/aacraid/aacraid.h | 24 +- drivers/scsi/aacraid/commctrl.c | 14 +- drivers/scsi/aacraid/comminit.c | 25 +- drivers/scsi/aacraid/commsup.c | 67 +- drivers/scsi/aacraid/dpcsup.c | 6 +- drivers/scsi/aacraid/linit.c | 99 +- drivers/scsi/aacraid/rkt.c | 10 +- drivers/scsi/aacraid/rx.c | 10 +- drivers/scsi/aacraid/sa.c | 12 +- drivers/scsi/advansys.c | 21 +- drivers/scsi/aha152x.c | 54 +- drivers/scsi/aha1542.c | 32 +- drivers/scsi/aha1740.c | 2 +- drivers/scsi/ahci.c | 1288 +- drivers/scsi/aic7xxx/Kconfig.aic7xxx | 2 +- drivers/scsi/aic7xxx/aic7770.c | 2 +- drivers/scsi/aic7xxx/aic7770_osm.c | 2 +- drivers/scsi/aic7xxx/aic79xx.h | 7 +- drivers/scsi/aic7xxx/aic79xx_core.c | 237 +- drivers/scsi/aic7xxx/aic79xx_osm.c | 633 +- drivers/scsi/aic7xxx/aic79xx_osm.h | 20 +- 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 | 36 +- drivers/scsi/aic7xxx/aic7xxx_osm.c | 88 +- drivers/scsi/aic7xxx/aic7xxx_osm.h | 6 +- drivers/scsi/aic7xxx/aic7xxx_osm_pci.c | 3 +- drivers/scsi/aic7xxx/aic7xxx_pci.c | 95 +- 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 | 4 +- drivers/scsi/arm/eesox.c | 2 +- drivers/scsi/arm/fas216.c | 2 +- drivers/scsi/arm/powertec.c | 4 +- drivers/scsi/arm/queue.c | 6 +- drivers/scsi/arm/scsi.h | 2 +- drivers/scsi/ata_piix.c | 560 +- drivers/scsi/atari_NCR5380.c | 3 +- drivers/scsi/atari_scsi.c | 11 +- drivers/scsi/atp870u.c | 170 +- drivers/scsi/blz1230.c | 2 +- drivers/scsi/blz2060.c | 2 +- drivers/scsi/ch.c | 2 +- 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 | 4 +- drivers/scsi/dpt/dpti_i2o.h | 1 + drivers/scsi/dpt_i2o.c | 8 +- drivers/scsi/dtc.c | 20 +- drivers/scsi/eata.c | 6 +- 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 | 50 +- drivers/scsi/g_NCR5380.h | 24 +- drivers/scsi/gdth.c | 542 +- 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/hosts.c | 15 +- drivers/scsi/hptiop.c | 3 +- drivers/scsi/ibmmca.c | 39 +- drivers/scsi/ibmvscsi/ibmvscsi.c | 346 +- drivers/scsi/ibmvscsi/ibmvscsi.h | 2 +- drivers/scsi/ibmvscsi/iseries_vscsi.c | 2 +- drivers/scsi/ibmvscsi/rpa_vscsi.c | 17 +- drivers/scsi/ibmvscsi/srp.h | 4 +- drivers/scsi/ibmvscsi/viosrp.h | 17 +- drivers/scsi/ide-scsi.c | 20 +- drivers/scsi/imm.c | 12 +- drivers/scsi/imm.h | 3 +- drivers/scsi/in2000.c | 30 +- drivers/scsi/initio.c | 9 +- drivers/scsi/initio.h | 13 +- drivers/scsi/ipr.c | 235 +- drivers/scsi/ipr.h | 46 +- drivers/scsi/ips.c | 48 +- drivers/scsi/iscsi_tcp.c | 3313 +- drivers/scsi/iscsi_tcp.h | 192 +- drivers/scsi/jazz_esp.c | 23 +- drivers/scsi/lasi700.c | 4 +- drivers/scsi/libata-core.c | 5584 ++- drivers/scsi/libata-scsi.c | 1110 +- drivers/scsi/libata.h | 39 +- drivers/scsi/lpfc/lpfc.h | 53 +- drivers/scsi/lpfc/lpfc_attr.c | 324 +- drivers/scsi/lpfc/lpfc_crtn.h | 40 +- drivers/scsi/lpfc/lpfc_ct.c | 85 +- drivers/scsi/lpfc/lpfc_disc.h | 20 +- drivers/scsi/lpfc/lpfc_els.c | 1105 +- drivers/scsi/lpfc/lpfc_hbadisc.c | 608 +- drivers/scsi/lpfc/lpfc_hw.h | 68 +- drivers/scsi/lpfc/lpfc_init.c | 362 +- drivers/scsi/lpfc/lpfc_mbox.c | 72 +- drivers/scsi/lpfc/lpfc_mem.c | 27 +- drivers/scsi/lpfc/lpfc_nportdisc.c | 538 +- drivers/scsi/lpfc/lpfc_scsi.c | 192 +- drivers/scsi/lpfc/lpfc_scsi.h | 5 +- drivers/scsi/lpfc/lpfc_sli.c | 564 +- drivers/scsi/lpfc/lpfc_sli.h | 27 +- drivers/scsi/lpfc/lpfc_version.h | 6 +- drivers/scsi/mac53c94.c | 2 +- drivers/scsi/mac_esp.c | 7 +- drivers/scsi/mac_scsi.c | 7 +- drivers/scsi/megaraid.c | 16 +- drivers/scsi/megaraid/mega_common.h | 6 - drivers/scsi/megaraid/megaraid_ioctl.h | 4 - drivers/scsi/megaraid/megaraid_mbox.c | 105 +- drivers/scsi/megaraid/megaraid_mbox.h | 7 +- drivers/scsi/megaraid/megaraid_mm.c | 8 +- drivers/scsi/megaraid/megaraid_mm.h | 4 +- drivers/scsi/megaraid/megaraid_sas.c | 88 +- drivers/scsi/megaraid/megaraid_sas.h | 24 +- drivers/scsi/mesh.c | 5 +- drivers/scsi/ncr53c8xx.c | 136 +- drivers/scsi/ncr53c8xx.h | 37 +- drivers/scsi/nsp32.c | 17 +- drivers/scsi/oktagon_esp.c | 3 +- drivers/scsi/oktagon_io.S | 1 + drivers/scsi/osst.c | 539 +- drivers/scsi/osst.h | 13 +- drivers/scsi/pas16.c | 10 +- drivers/scsi/pcmcia/aha152x_stub.c | 112 +- drivers/scsi/pcmcia/fdomain_stub.c | 155 +- drivers/scsi/pcmcia/nsp_cs.c | 138 +- drivers/scsi/pcmcia/nsp_cs.h | 8 +- drivers/scsi/pcmcia/qlogic_stub.c | 127 +- drivers/scsi/pcmcia/sym53c500_cs.c | 126 +- drivers/scsi/pdc_adma.c | 25 +- drivers/scsi/pluto.c | 6 +- drivers/scsi/ppa.c | 13 +- drivers/scsi/ppa.h | 3 +- drivers/scsi/psi240i.c | 2 +- drivers/scsi/qla1280.c | 47 +- drivers/scsi/qla2xxx/Kconfig | 66 +- drivers/scsi/qla2xxx/Makefile | 19 +- drivers/scsi/qla2xxx/ql2100_fw.c | 11253 +++--- drivers/scsi/qla2xxx/ql2200_fw.c | 12385 +++---- drivers/scsi/qla2xxx/ql2300.c | 12 - drivers/scsi/qla2xxx/ql2300_fw.c | 17933 ++++------ drivers/scsi/qla2xxx/ql2322.c | 12 - drivers/scsi/qla2xxx/ql2322_fw.c | 19365 +++++----- drivers/scsi/qla2xxx/ql2400.c | 27 - drivers/scsi/qla2xxx/ql2400_fw.c | 29065 +++++++--------- drivers/scsi/qla2xxx/ql6312.c | 7 +- drivers/scsi/qla2xxx/ql6312_fw.c | 13337 ++++--- drivers/scsi/qla2xxx/qla_attr.c | 188 +- drivers/scsi/qla2xxx/qla_dbg.c | 973 +- drivers/scsi/qla2xxx/qla_dbg.h | 151 +- drivers/scsi/qla2xxx/qla_def.h | 334 +- drivers/scsi/qla2xxx/qla_devtbl.h | 232 +- drivers/scsi/qla2xxx/qla_fw.h | 9 +- drivers/scsi/qla2xxx/qla_gbl.h | 48 +- drivers/scsi/qla2xxx/qla_gs.c | 10 +- drivers/scsi/qla2xxx/qla_init.c | 409 +- drivers/scsi/qla2xxx/qla_inline.h | 2 +- drivers/scsi/qla2xxx/qla_iocb.c | 12 +- drivers/scsi/qla2xxx/qla_isr.c | 131 +- drivers/scsi/qla2xxx/qla_mbx.c | 343 +- drivers/scsi/qla2xxx/qla_os.c | 491 +- drivers/scsi/qla2xxx/qla_settings.h | 1 + drivers/scsi/qla2xxx/qla_sup.c | 102 +- drivers/scsi/qla2xxx/qla_version.h | 4 +- drivers/scsi/qlogicfc.c | 5 +- drivers/scsi/qlogicpti.c | 379 +- drivers/scsi/raid_class.c | 4 +- drivers/scsi/sata_mv.c | 469 +- drivers/scsi/sata_nv.c | 639 +- drivers/scsi/sata_promise.c | 221 +- drivers/scsi/sata_qstor.c | 27 +- drivers/scsi/sata_sil.c | 425 +- drivers/scsi/sata_sil24.c | 811 +- drivers/scsi/sata_sis.c | 16 +- drivers/scsi/sata_svw.c | 79 +- drivers/scsi/sata_sx4.c | 48 +- drivers/scsi/sata_uli.c | 54 +- drivers/scsi/sata_via.c | 144 +- drivers/scsi/sata_vsc.c | 148 +- drivers/scsi/scsi.c | 195 +- drivers/scsi/scsi.h | 3 + drivers/scsi/scsi_debug.c | 1301 +- drivers/scsi/scsi_devinfo.c | 11 +- drivers/scsi/scsi_error.c | 301 +- drivers/scsi/scsi_ioctl.c | 184 +- drivers/scsi/scsi_lib.c | 526 +- drivers/scsi/scsi_logging.h | 9 +- drivers/scsi/scsi_priv.h | 14 +- drivers/scsi/scsi_proc.c | 9 +- drivers/scsi/scsi_scan.c | 193 +- drivers/scsi/scsi_sysfs.c | 15 +- drivers/scsi/scsi_transport_fc.c | 544 +- drivers/scsi/scsi_transport_iscsi.c | 1055 +- drivers/scsi/scsi_transport_sas.c | 870 +- drivers/scsi/scsi_transport_spi.c | 123 +- drivers/scsi/scsi_typedefs.h | 1 + drivers/scsi/scsicam.c | 3 +- drivers/scsi/sd.c | 345 +- drivers/scsi/seagate.c | 8 +- drivers/scsi/sg.c | 87 +- drivers/scsi/sgiwd93.c | 4 +- drivers/scsi/sim710.c | 7 +- drivers/scsi/sr.c | 55 +- drivers/scsi/sr.h | 1 + drivers/scsi/sr_ioctl.c | 19 + drivers/scsi/sr_vendor.c | 1 + drivers/scsi/st.c | 48 +- 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_defs.h | 2 +- drivers/scsi/sym53c8xx_2/sym_glue.c | 221 +- drivers/scsi/sym53c8xx_2/sym_glue.h | 3 +- drivers/scsi/sym53c8xx_2/sym_hipd.c | 169 +- drivers/scsi/sym53c8xx_2/sym_hipd.h | 2 - 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 | 11 +- drivers/scsi/wd33c93.h | 1 + drivers/scsi/wd7000.c | 16 +- drivers/scsi/zalon.c | 4 +- drivers/serial/21285.c | 21 +- drivers/serial/68328serial.c | 112 +- drivers/serial/68328serial.h | 1 + drivers/serial/68360serial.c | 1 + drivers/serial/8250.c | 160 +- drivers/serial/8250.h | 1 + drivers/serial/8250_acpi.c | 38 +- drivers/serial/8250_au1x00.c | 7 +- drivers/serial/8250_early.c | 9 +- drivers/serial/8250_gsc.c | 15 +- drivers/serial/8250_hp300.c | 10 +- drivers/serial/8250_mca.c | 1 + drivers/serial/8250_pci.c | 55 +- drivers/serial/8250_pnp.c | 6 +- drivers/serial/Kconfig | 106 +- drivers/serial/Makefile | 16 +- drivers/serial/amba-pl010.c | 293 +- drivers/serial/amba-pl011.c | 21 +- drivers/serial/at91_serial.c | 492 +- drivers/serial/au1x00_uart.c | 64 +- drivers/serial/clps711x.c | 25 +- drivers/serial/cpm_uart/cpm_uart.h | 59 +- drivers/serial/cpm_uart/cpm_uart_core.c | 310 +- drivers/serial/cpm_uart/cpm_uart_cpm1.c | 57 +- drivers/serial/cpm_uart/cpm_uart_cpm2.c | 17 +- drivers/serial/crisv10.c | 99 +- drivers/serial/crisv10.h | 1 + drivers/serial/dz.c | 19 +- drivers/serial/icom.c | 3 +- drivers/serial/imx.c | 70 +- drivers/serial/ioc4_serial.c | 398 +- drivers/serial/ip22zilog.c | 16 +- drivers/serial/jsm/jsm.h | 2 +- drivers/serial/jsm/jsm_driver.c | 4 +- drivers/serial/jsm/jsm_neo.c | 2 +- drivers/serial/jsm/jsm_tty.c | 36 +- drivers/serial/m32r_sio.c | 46 +- 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 | 20 +- drivers/serial/mpsc.c | 263 +- drivers/serial/mux.c | 5 +- drivers/serial/pmac_zilog.c | 33 +- drivers/serial/pxa.c | 31 +- drivers/serial/s3c2410.c | 176 +- drivers/serial/sa1100.c | 28 +- drivers/serial/serial_core.c | 180 +- drivers/serial/serial_cs.c | 238 +- drivers/serial/serial_lh7a40x.c | 31 +- drivers/serial/serial_txx9.c | 111 +- drivers/serial/sh-sci.c | 12 +- drivers/serial/sh-sci.h | 1 + drivers/serial/sn_console.c | 3 +- drivers/serial/suncore.c | 1 + drivers/serial/sunsab.c | 334 +- drivers/serial/sunsu.c | 575 +- drivers/serial/sunzilog.c | 841 +- drivers/serial/v850e_uart.c | 5 +- drivers/serial/vr41xx_siu.c | 43 +- drivers/sn/ioc3.c | 14 +- drivers/sn/ioc4.c | 107 +- drivers/spi/Kconfig | 34 - drivers/spi/Makefile | 4 - drivers/spi/spi.c | 16 +- drivers/spi/spi_bitbang.c | 105 +- drivers/spi/spi_butterfly.c | 2 +- drivers/tc/lk201.c | 1 + drivers/tc/zs.c | 15 +- drivers/telephony/ixj.c | 2 +- drivers/telephony/ixj.h | 2 +- drivers/telephony/ixj_pcmcia.c | 119 +- drivers/telephony/phonedev.c | 27 +- drivers/usb/Kconfig | 12 +- drivers/usb/Makefile | 18 +- drivers/usb/atm/speedtch.c | 2 +- drivers/usb/atm/ueagle-atm.c | 52 +- drivers/usb/atm/usbatm.c | 10 +- drivers/usb/atm/xusbatm.c | 1 + drivers/usb/class/Kconfig | 47 + drivers/usb/class/Makefile | 2 + drivers/usb/class/audio.c | 13 +- drivers/usb/class/cdc-acm.c | 157 +- drivers/usb/class/cdc-acm.h | 16 +- drivers/usb/class/usb-midi.c | 1 - drivers/usb/class/usblp.c | 15 +- drivers/usb/core/Kconfig | 10 +- drivers/usb/core/Makefile | 3 +- drivers/usb/core/buffer.c | 1 + drivers/usb/core/config.c | 1 + drivers/usb/core/devices.c | 7 +- drivers/usb/core/devio.c | 68 +- drivers/usb/core/driver.c | 7 +- drivers/usb/core/file.c | 77 +- drivers/usb/core/hcd-pci.c | 25 +- drivers/usb/core/hcd.c | 166 +- drivers/usb/core/hcd.h | 4 +- drivers/usb/core/hub.c | 238 +- drivers/usb/core/inode.c | 24 +- drivers/usb/core/message.c | 188 +- drivers/usb/core/notify.c | 70 +- drivers/usb/core/sysfs.c | 202 +- drivers/usb/core/urb.c | 1 + drivers/usb/core/usb.c | 11 +- drivers/usb/core/usb.h | 5 - drivers/usb/gadget/Kconfig | 23 +- drivers/usb/gadget/Makefile | 1 - drivers/usb/gadget/dummy_hcd.c | 10 +- drivers/usb/gadget/epautoconf.c | 16 +- drivers/usb/gadget/ether.c | 197 +- drivers/usb/gadget/file_storage.c | 45 +- drivers/usb/gadget/gadget_chips.h | 30 +- drivers/usb/gadget/goku_udc.c | 17 +- drivers/usb/gadget/inode.c | 112 +- drivers/usb/gadget/lh7a40x_udc.c | 7 +- drivers/usb/gadget/lh7a40x_udc.h | 1 + drivers/usb/gadget/net2280.c | 145 +- drivers/usb/gadget/net2280.h | 415 +- drivers/usb/gadget/omap_udc.c | 17 +- drivers/usb/gadget/pxa2xx_udc.c | 21 +- drivers/usb/gadget/rndis.c | 392 +- drivers/usb/gadget/rndis.h | 28 +- drivers/usb/gadget/serial.c | 118 +- drivers/usb/gadget/zero.c | 23 +- drivers/usb/host/Kconfig | 25 +- drivers/usb/host/ehci-hcd.c | 61 +- drivers/usb/host/ehci-hub.c | 4 - drivers/usb/host/ehci-mem.c | 11 +- drivers/usb/host/ehci-pci.c | 82 +- drivers/usb/host/ehci-q.c | 17 +- drivers/usb/host/ehci-sched.c | 225 +- drivers/usb/host/ehci.h | 18 +- drivers/usb/host/hc_crisv10.c | 16 +- drivers/usb/host/isp116x-hcd.c | 13 +- drivers/usb/host/ohci-au1xxx.c | 104 +- drivers/usb/host/ohci-hcd.c | 63 +- drivers/usb/host/ohci-hub.c | 16 +- drivers/usb/host/ohci-lh7a404.c | 2 +- drivers/usb/host/ohci-omap.c | 11 +- drivers/usb/host/ohci-pci.c | 17 +- drivers/usb/host/ohci-ppc-soc.c | 2 +- drivers/usb/host/ohci-pxa27x.c | 5 +- drivers/usb/host/ohci-s3c2410.c | 45 +- drivers/usb/host/ohci-sa1111.c | 2 +- drivers/usb/host/pci-quirks.c | 10 +- drivers/usb/host/sl811-hcd.c | 18 +- drivers/usb/host/sl811_cs.c | 121 +- drivers/usb/host/uhci-debug.c | 392 +- drivers/usb/host/uhci-hcd.c | 276 +- drivers/usb/host/uhci-hcd.h | 244 +- drivers/usb/host/uhci-hub.c | 23 +- drivers/usb/host/uhci-q.c | 1955 +- drivers/usb/image/mdc800.c | 67 +- drivers/usb/image/microtek.c | 12 +- drivers/usb/input/Kconfig | 56 +- drivers/usb/input/Makefile | 1 - drivers/usb/input/acecad.c | 4 +- drivers/usb/input/aiptek.c | 4 +- drivers/usb/input/appletouch.c | 120 +- drivers/usb/input/ati_remote.c | 183 +- drivers/usb/input/ati_remote2.c | 2 +- drivers/usb/input/fixp-arith.h | 15 +- drivers/usb/input/hid-core.c | 393 +- drivers/usb/input/hid-debug.h | 2 +- drivers/usb/input/hid-ff.c | 6 + drivers/usb/input/hid-input.c | 58 +- drivers/usb/input/hid-lgff.c | 6 +- drivers/usb/input/hid-tmff.c | 3 +- drivers/usb/input/hid.h | 27 +- drivers/usb/input/hiddev.c | 80 +- drivers/usb/input/itmtouch.c | 5 +- drivers/usb/input/kbtab.c | 5 +- drivers/usb/input/keyspan_remote.c | 7 +- drivers/usb/input/mtouchusb.c | 5 +- drivers/usb/input/pid.c | 1 + drivers/usb/input/powermate.c | 4 +- drivers/usb/input/touchkitusb.c | 5 +- drivers/usb/input/usbkbd.c | 4 +- drivers/usb/input/usbmouse.c | 4 +- drivers/usb/input/wacom.c | 141 +- drivers/usb/input/xpad.c | 5 +- drivers/usb/input/yealink.c | 5 +- drivers/usb/media/Kconfig | 17 +- drivers/usb/media/Makefile | 4 +- drivers/usb/media/dabusb.c | 4 +- drivers/usb/media/dsbr100.c | 2 +- drivers/usb/media/ibmcam.c | 2 +- drivers/usb/media/konicawc.c | 99 +- drivers/usb/media/ov511.c | 200 +- drivers/usb/media/pwc/pwc-ctrl.c | 266 +- drivers/usb/media/pwc/pwc-if.c | 3 +- drivers/usb/media/pwc/pwc-uncompress.c | 11 +- drivers/usb/media/pwc/pwc.h | 2 - drivers/usb/media/se401.c | 2 +- drivers/usb/media/sn9c102.h | 50 +- drivers/usb/media/sn9c102_core.c | 1705 +- drivers/usb/media/sn9c102_hv7131d.c | 2 +- drivers/usb/media/sn9c102_mi0343.c | 2 +- drivers/usb/media/sn9c102_pas106b.c | 2 +- drivers/usb/media/sn9c102_sensor.h | 101 +- drivers/usb/media/sn9c102_tas5110c1b.c | 23 +- drivers/usb/media/sn9c102_tas5130d1b.c | 29 +- drivers/usb/media/stv680.c | 36 +- drivers/usb/media/stv680.h | 11 +- drivers/usb/media/usbvideo.c | 5 +- drivers/usb/media/vicam.c | 6 +- drivers/usb/media/w9968cf.c | 149 +- drivers/usb/media/w9968cf.h | 1 - drivers/usb/media/w9968cf_vpp.h | 3 - drivers/usb/misc/Kconfig | 23 - drivers/usb/misc/Makefile | 2 - drivers/usb/misc/auerswald.c | 6 +- drivers/usb/misc/cytherm.c | 4 +- drivers/usb/misc/emi26.c | 4 - drivers/usb/misc/emi62.c | 4 - drivers/usb/misc/idmouse.c | 29 +- drivers/usb/misc/ldusb.c | 15 +- drivers/usb/misc/legousbtower.c | 12 +- drivers/usb/misc/phidgetkit.c | 313 +- drivers/usb/misc/phidgetservo.c | 4 +- drivers/usb/misc/sisusbvga/sisusb.c | 135 +- drivers/usb/misc/sisusbvga/sisusb.h | 14 +- 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 | 9 +- drivers/usb/misc/usbled.c | 4 +- drivers/usb/misc/usbtest.c | 66 +- drivers/usb/mon/mon_dma.c | 5 +- drivers/usb/mon/mon_main.c | 45 +- drivers/usb/mon/mon_stat.c | 6 +- drivers/usb/mon/mon_text.c | 71 +- drivers/usb/mon/usb_mon.h | 4 +- drivers/usb/net/Kconfig | 18 + drivers/usb/net/Makefile | 1 + drivers/usb/net/asix.c | 1265 +- 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 | 52 +- drivers/usb/net/pegasus.h | 29 +- drivers/usb/net/plusb.c | 1 + drivers/usb/net/rndis_host.c | 31 +- drivers/usb/net/rtl8150.c | 92 +- drivers/usb/net/usbnet.c | 13 +- drivers/usb/net/usbnet.h | 1 - drivers/usb/net/zaurus.c | 22 +- drivers/usb/net/zd1201.c | 11 +- drivers/usb/serial/Kconfig | 59 +- drivers/usb/serial/Makefile | 5 +- drivers/usb/serial/airprime.c | 5 +- drivers/usb/serial/belkin_sa.c | 3 +- drivers/usb/serial/bus.c | 3 +- drivers/usb/serial/console.c | 60 +- drivers/usb/serial/cp2101.c | 11 +- drivers/usb/serial/cyberjack.c | 11 +- drivers/usb/serial/cypress_m8.c | 78 +- drivers/usb/serial/cypress_m8.h | 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 | 51 +- drivers/usb/serial/ftdi_sio.h | 80 - drivers/usb/serial/garmin_gps.c | 9 +- drivers/usb/serial/generic.c | 15 +- drivers/usb/serial/hp4x.c | 3 +- drivers/usb/serial/io_edgeport.c | 54 +- drivers/usb/serial/io_ti.c | 9 +- drivers/usb/serial/ipaq.c | 31 +- drivers/usb/serial/ipw.c | 12 +- drivers/usb/serial/ir-usb.c | 17 +- drivers/usb/serial/keyspan.c | 11 +- drivers/usb/serial/keyspan_pda.c | 10 +- drivers/usb/serial/kl5kusb105.c | 6 +- drivers/usb/serial/kobil_sct.c | 19 +- drivers/usb/serial/mct_u232.c | 6 +- drivers/usb/serial/omninet.c | 27 +- drivers/usb/serial/option.c | 140 +- drivers/usb/serial/pl2303.c | 19 +- drivers/usb/serial/pl2303.h | 14 - drivers/usb/serial/safe_serial.c | 9 +- drivers/usb/serial/ti_usb_3410_5052.c | 6 +- drivers/usb/serial/usb-serial.c | 124 +- drivers/usb/serial/usb-serial.h | 6 +- drivers/usb/serial/visor.c | 45 +- drivers/usb/serial/whiteheat.c | 27 +- drivers/usb/storage/datafab.c | 3 +- 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/isd200.c | 10 +- drivers/usb/storage/jumpshot.c | 3 +- drivers/usb/storage/libusual.c | 63 +- drivers/usb/storage/onetouch.c | 4 +- drivers/usb/storage/scsiglue.c | 21 +- drivers/usb/storage/sddr55.c | 3 +- drivers/usb/storage/shuttle_usbat.c | 108 +- drivers/usb/storage/shuttle_usbat.h | 4 +- drivers/usb/storage/transport.c | 89 +- drivers/usb/storage/unusual_devs.h | 202 +- drivers/usb/storage/usb.c | 115 +- drivers/usb/storage/usb.h | 13 +- drivers/usb/usb-skeleton.c | 1 + drivers/video/68328fb.c | 1 + drivers/video/Kconfig | 220 +- drivers/video/Makefile | 15 +- drivers/video/S3triofb.c | 2 + drivers/video/acornfb.c | 11 +- drivers/video/amifb.c | 2 + drivers/video/arcfb.c | 3 +- drivers/video/asiliantfb.c | 16 +- drivers/video/atafb.c | 1 + drivers/video/aty/Makefile | 1 - drivers/video/aty/aty128fb.c | 388 +- drivers/video/aty/atyfb.h | 2 +- drivers/video/aty/atyfb_base.c | 264 +- drivers/video/aty/mach64_accel.c | 10 + drivers/video/aty/mach64_cursor.c | 33 +- drivers/video/aty/mach64_gx.c | 3 +- drivers/video/aty/radeon_base.c | 170 +- drivers/video/aty/radeon_i2c.c | 1 + drivers/video/aty/radeon_pm.c | 152 +- drivers/video/aty/radeonfb.h | 18 +- drivers/video/au1100fb.c | 84 +- drivers/video/backlight/Kconfig | 12 +- drivers/video/backlight/Makefile | 2 +- drivers/video/backlight/backlight.c | 98 +- drivers/video/backlight/corgi_bl.c | 124 +- drivers/video/backlight/hp680_bl.c | 141 +- drivers/video/backlight/lcd.c | 32 +- drivers/video/backlight/locomolcd.c | 135 +- drivers/video/bw2.c | 214 +- 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 | 45 +- drivers/video/cirrusfb.c | 10 +- drivers/video/console/Kconfig | 24 - drivers/video/console/bitblit.c | 1 + drivers/video/console/dummycon.c | 3 +- drivers/video/console/fbcon.c | 381 +- 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 | 3 +- drivers/video/console/mdacon.c | 9 +- drivers/video/console/newport_con.c | 43 +- drivers/video/console/promcon.c | 6 +- drivers/video/console/softcursor.c | 32 +- drivers/video/console/sticon.c | 3 +- drivers/video/console/sticore.c | 23 +- drivers/video/console/tileblit.c | 1 + drivers/video/console/vgacon.c | 327 +- 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 | 29 +- drivers/video/fbcmap.c | 5 +- drivers/video/fbcvt.c | 1 + drivers/video/fbmem.c | 126 +- drivers/video/fbmon.c | 38 +- drivers/video/fbsysfs.c | 244 +- drivers/video/ffb.c | 469 +- drivers/video/g364fb.c | 1 + drivers/video/gbefb.c | 1 + drivers/video/geode/Kconfig | 17 +- drivers/video/geode/Makefile | 4 +- drivers/video/geode/gx1fb_core.c | 4 + drivers/video/hgafb.c | 1 + drivers/video/hitfb.c | 2 + drivers/video/hpfb.c | 5 +- drivers/video/i810/i810-i2c.c | 4 +- drivers/video/i810/i810_main.c | 9 +- drivers/video/igafb.c | 4 + drivers/video/imsttfb.c | 34 +- drivers/video/imxfb.c | 1 + 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/Makefile | 2 +- drivers/video/logo/logo.c | 1 + drivers/video/macfb.c | 1 + drivers/video/macmodes.c | 9 +- drivers/video/macmodes.h | 7 +- drivers/video/matrox/g450_pll.c | 31 +- drivers/video/matrox/matroxfb_DAC1064.c | 2 + drivers/video/matrox/matroxfb_DAC1064.h | 4 +- drivers/video/matrox/matroxfb_Ti3026.c | 2 + drivers/video/matrox/matroxfb_Ti3026.h | 2 + drivers/video/matrox/matroxfb_base.c | 59 +- drivers/video/matrox/matroxfb_base.h | 4 +- drivers/video/matrox/matroxfb_g450.c | 2 +- drivers/video/matrox/matroxfb_maven.c | 78 +- drivers/video/matrox/matroxfb_misc.c | 2 + drivers/video/maxinefb.c | 5 +- drivers/video/modedb.c | 14 +- drivers/video/neofb.c | 42 +- drivers/video/nvidia/Makefile | 3 +- drivers/video/nvidia/nv_accel.c | 12 - drivers/video/nvidia/nv_i2c.c | 4 +- drivers/video/nvidia/nv_of.c | 1 + drivers/video/nvidia/nv_proto.h | 12 - drivers/video/nvidia/nv_setup.c | 2 +- drivers/video/nvidia/nv_type.h | 1 - drivers/video/nvidia/nvidia.c | 592 +- drivers/video/offb.c | 445 +- drivers/video/p9100.c | 251 +- drivers/video/platinumfb.c | 2 + drivers/video/pm2fb.c | 6 +- drivers/video/pm3fb.c | 20 +- drivers/video/pmag-aa-fb.c | 1 + drivers/video/pmagb-b-fb.c | 2 +- drivers/video/pvr2fb.c | 2 + drivers/video/pxafb.c | 11 +- drivers/video/q40fb.c | 1 + drivers/video/radeonfb.c | 7 +- drivers/video/retz3fb.c | 1 + drivers/video/riva/fbdev.c | 256 +- drivers/video/riva/rivafb-i2c.c | 1 + drivers/video/riva/rivafb.h | 1 + drivers/video/s1d13xxxfb.c | 1 + drivers/video/s3c2410fb.c | 20 +- drivers/video/sa1100fb.c | 5 +- drivers/video/savage/savagefb-i2c.c | 4 +- drivers/video/savage/savagefb.h | 45 +- drivers/video/savage/savagefb_driver.c | 1479 +- drivers/video/sbuslib.c | 2 - drivers/video/sgivwfb.c | 7 +- drivers/video/sis/init.h | 1 + drivers/video/sis/init301.c | 15 +- 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 | 14 +- drivers/video/sticore.h | 37 +- drivers/video/stifb.c | 96 +- 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 | 72 +- drivers/video/vfb.c | 29 +- drivers/video/vga16fb.c | 44 +- drivers/video/vgastate.c | 1 + drivers/video/virgefb.c | 4 +- drivers/video/w100fb.c | 162 +- drivers/video/w100fb.h | 748 +- drivers/w1/Kconfig | 75 +- drivers/w1/Makefile | 14 +- drivers/w1/ds_w1_bridge.c | 28 +- drivers/w1/dscore.c | 162 +- drivers/w1/dscore.h | 10 +- drivers/w1/matrox_w1.c | 10 +- drivers/w1/w1.c | 336 +- drivers/w1/w1.h | 66 +- drivers/w1/w1_family.c | 20 +- drivers/w1/w1_family.h | 3 +- drivers/w1/w1_int.c | 59 +- drivers/w1/w1_io.c | 33 +- drivers/w1/w1_netlink.c | 219 +- drivers/w1/w1_netlink.h | 35 +- drivers/w1/w1_smem.c | 85 +- drivers/w1/w1_therm.c | 135 +- drivers/zorro/names.c | 1 + drivers/zorro/zorro-driver.c | 9 +- fs/9p/9p.h | 11 +- fs/9p/Makefile | 10 +- fs/9p/conv.c | 18 +- fs/9p/conv.h | 9 +- fs/9p/debug.h | 6 +- fs/9p/error.c | 6 +- fs/9p/error.h | 5 +- fs/9p/fid.c | 6 +- fs/9p/fid.h | 5 +- fs/9p/mux.c | 275 +- fs/9p/mux.h | 11 +- fs/9p/trans_fd.c | 302 +- fs/9p/transport.h | 5 +- fs/9p/v9fs.c | 16 +- fs/9p/v9fs.h | 8 +- fs/9p/v9fs_vfs.h | 11 +- fs/9p/vfs_addr.c | 8 +- fs/9p/vfs_dentry.c | 7 +- fs/9p/vfs_dir.c | 7 +- fs/9p/vfs_file.c | 51 +- fs/9p/vfs_inode.c | 97 +- fs/9p/vfs_super.c | 43 +- fs/Kconfig | 279 +- fs/Makefile | 10 +- fs/adfs/adfs.h | 4 +- fs/adfs/dir.c | 3 +- fs/adfs/file.c | 6 +- fs/adfs/inode.c | 3 +- fs/adfs/super.c | 20 +- fs/affs/affs.h | 12 +- fs/affs/dir.c | 2 +- fs/affs/file.c | 6 +- fs/affs/namei.c | 3 +- fs/affs/super.c | 27 +- fs/affs/symlink.c | 2 +- fs/afs/cell.c | 112 +- fs/afs/cell.h | 16 +- fs/afs/cmservice.c | 4 +- fs/afs/dir.c | 25 +- fs/afs/file.c | 252 +- fs/afs/fsclient.c | 4 +- fs/afs/inode.c | 46 +- fs/afs/internal.h | 31 +- fs/afs/kafsasyncd.c | 9 +- fs/afs/main.c | 24 +- fs/afs/mntpt.c | 27 +- fs/afs/proc.c | 11 +- fs/afs/server.c | 9 +- fs/afs/super.c | 28 +- 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 | 9 +- fs/autofs/autofs_i.h | 2 +- fs/autofs/dirhash.c | 2 +- fs/autofs/init.c | 6 +- fs/autofs/inode.c | 3 +- fs/autofs/root.c | 2 +- fs/autofs/symlink.c | 2 +- fs/autofs4/autofs_i.h | 61 +- fs/autofs4/expire.c | 301 +- fs/autofs4/init.c | 8 +- fs/autofs4/inode.c | 128 +- fs/autofs4/root.c | 346 +- fs/autofs4/waitq.c | 189 +- fs/bad_inode.c | 2 +- fs/befs/datastream.c | 2 +- fs/befs/linuxvfs.c | 60 +- fs/bfs/bfs.h | 6 +- fs/bfs/dir.c | 4 +- fs/bfs/file.c | 4 +- fs/bfs/inode.c | 13 +- fs/binfmt_elf.c | 493 +- fs/binfmt_elf_fdpic.c | 1003 +- fs/binfmt_flat.c | 64 +- fs/binfmt_misc.c | 25 +- fs/binfmt_som.c | 1 + fs/bio.c | 44 +- fs/block_dev.c | 395 +- fs/buffer.c | 228 +- fs/char_dev.c | 54 +- fs/cifs/CHANGES | 60 +- fs/cifs/Makefile | 2 +- fs/cifs/README | 56 +- 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 | 147 +- fs/cifs/cifsfs.c | 169 +- fs/cifs/cifsfs.h | 17 +- fs/cifs/cifsglob.h | 80 +- fs/cifs/cifspdu.h | 111 +- fs/cifs/cifsproto.h | 27 +- fs/cifs/cifssmb.c | 470 +- fs/cifs/connect.c | 607 +- fs/cifs/dir.c | 27 +- fs/cifs/fcntl.c | 6 +- fs/cifs/file.c | 284 +- fs/cifs/inode.c | 66 +- fs/cifs/link.c | 19 +- fs/cifs/misc.c | 56 +- fs/cifs/netmisc.c | 5 +- fs/cifs/ntlmssp.h | 2 +- fs/cifs/readdir.c | 255 +- fs/cifs/smbencrypt.c | 1 - fs/cifs/smberr.h | 1 - fs/cifs/transport.c | 619 +- fs/cifs/xattr.c | 14 +- fs/coda/cache.c | 2 +- fs/coda/cnode.c | 3 +- fs/coda/coda_linux.c | 2 + fs/coda/dir.c | 5 +- fs/coda/file.c | 10 +- fs/coda/inode.c | 16 +- fs/coda/pioctl.c | 2 +- fs/coda/psdev.c | 36 +- fs/coda/symlink.c | 2 +- fs/coda/sysctl.c | 1 + fs/coda/upcall.c | 6 +- fs/compat.c | 260 +- fs/compat_ioctl.c | 42 +- fs/configfs/configfs_internal.h | 6 +- fs/configfs/dir.c | 153 +- fs/configfs/file.c | 2 +- fs/configfs/inode.c | 3 +- fs/configfs/mount.c | 8 +- fs/configfs/symlink.c | 2 +- fs/cramfs/inode.c | 55 +- fs/dcache.c | 543 +- fs/dcookies.c | 26 +- fs/debugfs/file.c | 55 +- fs/debugfs/inode.c | 18 +- fs/devfs/base.c | 12 +- fs/devpts/inode.c | 88 +- fs/direct-io.c | 67 +- fs/dnotify.c | 4 +- fs/dquot.c | 197 +- fs/efs/dir.c | 2 +- fs/efs/inode.c | 2 +- fs/efs/super.c | 14 +- fs/efs/symlink.c | 5 +- fs/eventpoll.c | 85 +- fs/exec.c | 242 +- fs/exportfs/expfs.c | 4 +- fs/ext2/Makefile | 2 +- fs/ext2/balloc.c | 26 +- fs/ext2/dir.c | 28 +- fs/ext2/ext2.h | 15 +- fs/ext2/file.c | 6 +- fs/ext2/fsync.c | 2 +- fs/ext2/ialloc.c | 4 + fs/ext2/inode.c | 21 +- fs/ext2/namei.c | 54 +- fs/ext2/super.c | 56 +- fs/ext2/xattr.h | 1 + fs/ext3/acl.h | 3 + fs/ext3/balloc.c | 370 +- fs/ext3/bitmap.c | 6 +- fs/ext3/dir.c | 57 +- fs/ext3/file.c | 8 +- fs/ext3/ialloc.c | 15 +- fs/ext3/inode.c | 646 +- fs/ext3/ioctl.c | 24 +- fs/ext3/namei.c | 8 +- fs/ext3/resize.c | 99 +- fs/ext3/super.c | 284 +- fs/ext3/xattr.c | 29 +- fs/ext3/xattr.h | 1 + fs/fat/cache.c | 2 +- fs/fat/dir.c | 6 +- fs/fat/fatent.c | 6 +- fs/fat/file.c | 2 +- fs/fat/inode.c | 26 +- fs/fat/misc.c | 1 + fs/fcntl.c | 22 +- fs/fifo.c | 67 +- fs/file.c | 34 +- fs/file_table.c | 16 +- fs/freevxfs/vxfs.h | 6 +- fs/freevxfs/vxfs_extern.h | 2 +- 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_olt.c | 9 +- fs/freevxfs/vxfs_subr.c | 7 +- fs/freevxfs/vxfs_super.c | 22 +- fs/fs-writeback.c | 12 +- fs/fuse/Makefile | 2 +- fs/fuse/dev.c | 617 +- fs/fuse/dir.c | 278 +- fs/fuse/file.c | 284 +- fs/fuse/fuse_i.h | 193 +- fs/fuse/inode.c | 294 +- fs/hfs/bnode.c | 11 +- fs/hfs/btree.c | 5 +- fs/hfs/dir.c | 2 +- fs/hfs/hfs_fs.h | 6 +- fs/hfs/inode.c | 23 +- fs/hfs/super.c | 13 +- fs/hfsplus/bitmap.c | 15 +- fs/hfsplus/bnode.c | 8 +- fs/hfsplus/btree.c | 5 +- fs/hfsplus/dir.c | 2 +- fs/hfsplus/hfsplus_fs.h | 4 +- fs/hfsplus/inode.c | 21 +- fs/hfsplus/super.c | 13 +- fs/hostfs/hostfs_kern.c | 23 +- fs/hostfs/hostfs_user.c | 1 + fs/hpfs/dir.c | 2 +- fs/hpfs/file.c | 4 +- fs/hpfs/hpfs_fn.h | 13 +- fs/hpfs/inode.c | 11 +- fs/hpfs/namei.c | 62 +- fs/hpfs/super.c | 17 +- fs/hppfs/hppfs_kern.c | 29 +- fs/hugetlbfs/inode.c | 112 +- fs/inode.c | 70 +- fs/inotify.c | 1087 +- fs/ioctl.c | 1 + fs/ioprio.c | 66 +- fs/isofs/compress.c | 3 +- fs/isofs/dir.c | 3 +- fs/isofs/inode.c | 22 +- fs/isofs/isofs.h | 16 +- fs/isofs/joliet.c | 2 +- fs/isofs/namei.c | 1 + fs/isofs/rock.c | 2 +- fs/isofs/zisofs.h | 2 +- fs/jbd/checkpoint.c | 423 +- fs/jbd/commit.c | 209 +- fs/jbd/journal.c | 126 +- fs/jbd/recovery.c | 1 - fs/jbd/transaction.c | 56 +- fs/jffs/inode-v23.c | 155 +- fs/jffs/intrep.c | 22 +- fs/jffs/jffs_fm.c | 2 +- fs/jffs/jffs_fm.h | 4 +- fs/jffs2/Makefile | 3 - fs/jffs2/README.Locking | 21 - fs/jffs2/background.c | 3 +- fs/jffs2/build.c | 2 - fs/jffs2/compr.c | 2 +- fs/jffs2/compr.h | 4 +- fs/jffs2/compr_zlib.c | 20 +- fs/jffs2/debug.c | 14 +- fs/jffs2/debug.h | 7 +- fs/jffs2/dir.c | 123 +- fs/jffs2/erase.c | 88 +- fs/jffs2/file.c | 39 +- fs/jffs2/fs.c | 70 +- fs/jffs2/gc.c | 131 +- fs/jffs2/malloc.c | 129 +- fs/jffs2/nodelist.c | 190 +- fs/jffs2/nodelist.h | 194 +- fs/jffs2/nodemgmt.c | 210 +- fs/jffs2/os-linux.h | 31 +- fs/jffs2/readinode.c | 139 +- fs/jffs2/scan.c | 453 +- fs/jffs2/summary.c | 480 +- fs/jffs2/summary.h | 64 +- fs/jffs2/super.c | 77 +- fs/jffs2/symlink.c | 7 +- fs/jffs2/wbuf.c | 971 +- fs/jffs2/write.c | 147 +- fs/jfs/Makefile | 3 +- fs/jfs/acl.c | 7 +- fs/jfs/file.c | 4 +- fs/jfs/inode.c | 34 +- fs/jfs/jfs_debug.c | 2 +- fs/jfs/jfs_dinode.h | 34 +- fs/jfs/jfs_dmap.c | 8 +- fs/jfs/jfs_dmap.h | 2 +- fs/jfs/jfs_dtree.c | 13 +- fs/jfs/jfs_extent.c | 32 +- fs/jfs/jfs_imap.c | 73 +- fs/jfs/jfs_imap.h | 4 +- fs/jfs/jfs_incore.h | 10 +- fs/jfs/jfs_inode.c | 87 +- fs/jfs/jfs_inode.h | 11 +- fs/jfs/jfs_lock.h | 1 - fs/jfs/jfs_logmgr.c | 62 +- fs/jfs/jfs_logmgr.h | 2 +- fs/jfs/jfs_metapage.c | 23 +- fs/jfs/jfs_metapage.h | 2 +- fs/jfs/jfs_superblock.h | 9 +- fs/jfs/jfs_txnmgr.c | 38 +- fs/jfs/namei.c | 107 +- fs/jfs/super.c | 233 +- fs/jfs/xattr.c | 8 +- fs/libfs.c | 50 +- fs/lockd/clntlock.c | 145 +- fs/lockd/clntproc.c | 359 +- fs/lockd/host.c | 40 +- fs/lockd/mon.c | 17 +- fs/lockd/svc.c | 22 +- fs/lockd/svc4proc.c | 157 +- fs/lockd/svclock.c | 360 +- fs/lockd/svcproc.c | 152 +- fs/lockd/svcshare.c | 4 +- fs/lockd/svcsubs.c | 38 +- fs/lockd/xdr.c | 20 +- fs/lockd/xdr4.c | 21 +- fs/locks.c | 313 +- fs/mbcache.c | 4 +- fs/minix/bitmap.c | 12 +- fs/minix/dir.c | 5 +- fs/minix/file.c | 2 +- fs/minix/inode.c | 65 +- fs/minix/itree_v1.c | 4 +- fs/minix/itree_v2.c | 4 +- fs/minix/minix.h | 4 +- fs/minix/namei.c | 48 +- fs/mpage.c | 126 +- fs/msdos/namei.c | 24 +- fs/namei.c | 203 +- fs/namespace.c | 206 +- fs/ncpfs/dir.c | 3 +- fs/ncpfs/file.c | 6 +- fs/ncpfs/inode.c | 24 +- fs/ncpfs/ioctl.c | 1 + fs/ncpfs/mmap.c | 2 +- fs/ncpfs/ncplib_kernel.c | 5 +- fs/ncpfs/ncplib_kernel.h | 1 + fs/ncpfs/ncpsign_kernel.c | 1 + fs/ncpfs/sock.c | 35 +- fs/ncpfs/symlink.c | 3 +- fs/nfs/Makefile | 9 +- fs/nfs/callback.c | 65 +- fs/nfs/callback.h | 7 +- fs/nfs/callback_proc.c | 14 +- fs/nfs/callback_xdr.c | 31 +- fs/nfs/delegation.c | 53 +- fs/nfs/delegation.h | 11 +- fs/nfs/dir.c | 160 +- fs/nfs/direct.c | 1018 +- fs/nfs/file.c | 127 +- fs/nfs/idmap.c | 85 +- fs/nfs/inode.c | 1322 +- fs/nfs/mount_clnt.c | 20 +- fs/nfs/nfs2xdr.c | 12 +- fs/nfs/nfs3acl.c | 27 +- fs/nfs/nfs3proc.c | 259 +- fs/nfs/nfs3xdr.c | 14 +- fs/nfs/nfs4_fs.h | 82 +- fs/nfs/nfs4proc.c | 573 +- fs/nfs/nfs4renewd.c | 20 +- fs/nfs/nfs4state.c | 176 +- fs/nfs/nfs4xdr.c | 285 +- fs/nfs/nfsroot.c | 1 + fs/nfs/pagelist.c | 68 +- fs/nfs/proc.c | 163 +- fs/nfs/read.c | 272 +- fs/nfs/symlink.c | 13 +- fs/nfs/sysctl.c | 54 +- fs/nfs/unlink.c | 3 +- fs/nfs/write.c | 381 +- fs/nfsctl.c | 3 +- fs/nfsd/auth.c | 49 +- fs/nfsd/export.c | 375 +- fs/nfsd/nfs4acl.c | 12 +- fs/nfsd/nfs4callback.c | 13 +- fs/nfsd/nfs4idmap.c | 147 +- fs/nfsd/nfs4proc.c | 10 +- fs/nfsd/nfs4recover.c | 2 +- fs/nfsd/nfs4state.c | 246 +- fs/nfsd/nfs4xdr.c | 66 +- fs/nfsd/nfscache.c | 3 +- fs/nfsd/nfsctl.c | 72 +- fs/nfsd/nfsfh.c | 29 +- fs/nfsd/nfsproc.c | 2 +- fs/nfsd/nfssvc.c | 15 +- fs/nfsd/stats.c | 12 +- fs/nfsd/vfs.c | 40 +- fs/nls/Kconfig | 2 +- fs/nls/nls_base.c | 1 + fs/nls/nls_euc-jp.c | 6 +- fs/ntfs/ChangeLog | 30 +- fs/ntfs/Makefile | 2 +- fs/ntfs/aops.c | 18 +- fs/ntfs/aops.h | 3 +- fs/ntfs/attrib.c | 41 +- fs/ntfs/compress.c | 4 +- fs/ntfs/dir.c | 4 +- fs/ntfs/file.c | 49 +- fs/ntfs/inode.c | 148 +- fs/ntfs/inode.h | 13 +- fs/ntfs/layout.h | 44 +- fs/ntfs/logfile.c | 4 +- fs/ntfs/mft.c | 75 +- fs/ntfs/mft.h | 5 +- fs/ntfs/namei.c | 9 +- fs/ntfs/ntfs.h | 41 +- fs/ntfs/runlist.c | 12 +- fs/ntfs/super.c | 133 +- fs/ntfs/sysctl.h | 1 + fs/ntfs/unistr.c | 51 +- fs/ocfs2/alloc.c | 88 +- fs/ocfs2/aops.c | 77 +- fs/ocfs2/aops.h | 4 +- fs/ocfs2/buffer_head_io.c | 11 +- fs/ocfs2/cluster/heartbeat.c | 100 +- fs/ocfs2/cluster/masklog.h | 32 +- fs/ocfs2/cluster/ocfs2_heartbeat.h | 1 - fs/ocfs2/cluster/tcp.c | 16 +- fs/ocfs2/dcache.c | 9 +- fs/ocfs2/dir.c | 42 +- fs/ocfs2/dlm/dlmast.c | 37 +- fs/ocfs2/dlm/dlmcommon.h | 82 +- fs/ocfs2/dlm/dlmconvert.c | 44 +- fs/ocfs2/dlm/dlmdebug.c | 24 +- fs/ocfs2/dlm/dlmdomain.c | 112 +- fs/ocfs2/dlm/dlmfs.c | 17 +- fs/ocfs2/dlm/dlmlock.c | 87 +- fs/ocfs2/dlm/dlmmaster.c | 662 +- fs/ocfs2/dlm/dlmrecovery.c | 633 +- fs/ocfs2/dlm/dlmthread.c | 74 +- fs/ocfs2/dlm/dlmunlock.c | 67 +- fs/ocfs2/dlm/userdlm.c | 76 +- fs/ocfs2/dlmglue.c | 110 +- fs/ocfs2/export.c | 24 +- fs/ocfs2/extent_map.c | 69 +- fs/ocfs2/file.c | 151 +- fs/ocfs2/file.h | 4 +- fs/ocfs2/inode.c | 120 +- fs/ocfs2/inode.h | 2 +- fs/ocfs2/journal.c | 55 +- fs/ocfs2/localalloc.c | 25 +- fs/ocfs2/mmap.c | 4 +- fs/ocfs2/namei.c | 84 +- fs/ocfs2/ocfs2.h | 18 +- fs/ocfs2/slot_map.c | 2 +- fs/ocfs2/suballoc.c | 333 +- fs/ocfs2/suballoc.h | 2 - fs/ocfs2/super.c | 103 +- fs/ocfs2/super.h | 8 +- fs/ocfs2/symlink.c | 5 +- fs/ocfs2/uptodate.c | 44 +- fs/ocfs2/vote.c | 77 +- fs/open.c | 57 +- fs/openpromfs/inode.c | 1164 +- fs/partitions/Kconfig | 2 +- fs/partitions/Makefile | 1 + fs/partitions/acorn.c | 1 + fs/partitions/check.c | 113 +- fs/partitions/devfs.c | 12 +- fs/partitions/efi.c | 1 + fs/partitions/efi.h | 1 + fs/partitions/ibm.c | 30 +- fs/partitions/mac.c | 4 +- fs/partitions/msdos.c | 1 + fs/pipe.c | 491 +- fs/pnode.c | 11 +- fs/proc/array.c | 24 +- fs/proc/base.c | 1228 +- fs/proc/generic.c | 34 +- fs/proc/inode.c | 16 +- fs/proc/internal.h | 27 +- fs/proc/kcore.c | 9 +- fs/proc/kmsg.c | 2 +- fs/proc/proc_devtree.c | 101 +- fs/proc/proc_misc.c | 67 +- fs/proc/root.c | 7 +- fs/proc/task_mmu.c | 170 +- fs/proc/task_nommu.c | 23 +- fs/proc/vmcore.c | 3 +- fs/qnx4/bitmap.c | 1 + fs/qnx4/dir.c | 3 +- fs/qnx4/file.c | 5 +- fs/qnx4/fsync.c | 1 + fs/qnx4/inode.c | 20 +- fs/qnx4/namei.c | 1 + fs/qnx4/truncate.c | 1 + fs/quota.c | 6 +- fs/quota_v2.c | 2 +- fs/ramfs/file-mmu.c | 15 +- fs/ramfs/file-nommu.c | 11 +- fs/ramfs/inode.c | 14 +- fs/ramfs/internal.h | 4 +- fs/read_write.c | 10 +- fs/readdir.c | 18 +- fs/reiserfs/bitmap.c | 1 + fs/reiserfs/dir.c | 3 +- fs/reiserfs/do_balan.c | 1 + fs/reiserfs/file.c | 30 +- fs/reiserfs/fix_node.c | 5 +- fs/reiserfs/ibalance.c | 1 + fs/reiserfs/inode.c | 57 +- fs/reiserfs/ioctl.c | 2 +- fs/reiserfs/item_ops.c | 2 +- fs/reiserfs/journal.c | 28 +- fs/reiserfs/lbalance.c | 1 + fs/reiserfs/namei.c | 1 + fs/reiserfs/objectid.c | 1 + fs/reiserfs/prints.c | 12 +- fs/reiserfs/procfs.c | 28 +- fs/reiserfs/stree.c | 211 +- fs/reiserfs/super.c | 60 +- fs/reiserfs/tail_conversion.c | 1 + fs/reiserfs/xattr.c | 11 +- fs/reiserfs/xattr_acl.c | 4 +- fs/relayfs/Makefile | 8 +- fs/relayfs/inode.c | 772 +- fs/relayfs/relay.c | 2015 +- fs/romfs/inode.c | 18 +- fs/select.c | 228 +- fs/seq_file.c | 10 +- fs/smbfs/dir.c | 2 +- fs/smbfs/file.c | 10 +- fs/smbfs/inode.c | 20 +- fs/smbfs/proc.c | 5 +- fs/smbfs/proto.h | 8 +- fs/smbfs/request.c | 6 +- fs/smbfs/smbiod.c | 30 +- fs/stat.c | 12 +- fs/super.c | 179 +- fs/sysfs/bin.c | 2 +- fs/sysfs/dir.c | 49 +- fs/sysfs/file.c | 94 +- fs/sysfs/inode.c | 21 +- fs/sysfs/mount.c | 6 +- fs/sysfs/symlink.c | 5 +- fs/sysfs/sysfs.h | 8 +- fs/sysv/dir.c | 11 +- fs/sysv/file.c | 2 +- fs/sysv/ialloc.c | 2 +- fs/sysv/inode.c | 7 +- fs/sysv/itree.c | 2 +- fs/sysv/namei.c | 48 +- fs/sysv/super.c | 17 +- fs/sysv/sysv.h | 6 +- fs/udf/balloc.c | 36 +- fs/udf/dir.c | 2 +- fs/udf/file.c | 4 +- fs/udf/ialloc.c | 20 +- fs/udf/inode.c | 16 +- fs/udf/super.c | 44 +- fs/udf/symlink.c | 2 +- fs/udf/udfdecl.h | 11 +- fs/ufs/balloc.c | 406 +- fs/ufs/cylinder.c | 49 +- fs/ufs/dir.c | 1002 +- fs/ufs/file.c | 37 +- fs/ufs/ialloc.c | 64 +- fs/ufs/inode.c | 399 +- fs/ufs/namei.c | 135 +- fs/ufs/super.c | 444 +- fs/ufs/truncate.c | 221 +- fs/ufs/util.c | 103 +- fs/ufs/util.h | 115 +- fs/vfat/namei.c | 27 +- fs/xattr.c | 11 +- fs/xfs/Kconfig | 27 +- fs/xfs/Makefile-linux-2.6 | 44 +- fs/xfs/linux-2.6/kmem.h | 113 +- fs/xfs/linux-2.6/mrlock.h | 6 +- fs/xfs/linux-2.6/sema.h | 19 +- fs/xfs/linux-2.6/xfs_aops.c | 619 +- fs/xfs/linux-2.6/xfs_aops.h | 12 +- fs/xfs/linux-2.6/xfs_buf.c | 12 +- fs/xfs/linux-2.6/xfs_buf.h | 5 +- fs/xfs/linux-2.6/xfs_export.c | 46 +- fs/xfs/linux-2.6/xfs_export.h | 2 +- fs/xfs/linux-2.6/xfs_file.c | 369 +- fs/xfs/linux-2.6/xfs_fs_subr.c | 65 +- fs/xfs/linux-2.6/xfs_globals.c | 1 - fs/xfs/linux-2.6/xfs_ioctl.c | 193 +- fs/xfs/linux-2.6/xfs_ioctl32.c | 27 +- fs/xfs/linux-2.6/xfs_ioctl32.h | 4 +- fs/xfs/linux-2.6/xfs_iops.c | 477 +- fs/xfs/linux-2.6/xfs_iops.h | 12 +- fs/xfs/linux-2.6/xfs_linux.h | 48 +- fs/xfs/linux-2.6/xfs_lrw.c | 313 +- fs/xfs/linux-2.6/xfs_lrw.h | 17 +- fs/xfs/linux-2.6/xfs_stats.c | 9 +- fs/xfs/linux-2.6/xfs_super.c | 395 +- fs/xfs/linux-2.6/xfs_super.h | 9 +- fs/xfs/linux-2.6/xfs_sysctl.c | 8 +- fs/xfs/linux-2.6/xfs_sysctl.h | 2 - fs/xfs/linux-2.6/xfs_vfs.c | 56 +- fs/xfs/linux-2.6/xfs_vfs.h | 164 +- fs/xfs/linux-2.6/xfs_vnode.c | 76 +- fs/xfs/linux-2.6/xfs_vnode.h | 405 +- fs/xfs/quota/xfs_dquot.c | 8 +- fs/xfs/quota/xfs_dquot.h | 4 +- fs/xfs/quota/xfs_dquot_item.c | 10 +- fs/xfs/quota/xfs_qm.c | 52 +- fs/xfs/quota/xfs_qm_bhv.c | 92 +- fs/xfs/quota/xfs_qm_stats.c | 2 + fs/xfs/quota/xfs_qm_syscalls.c | 8 +- fs/xfs/quota/xfs_trans_dquot.c | 72 +- fs/xfs/support/debug.c | 4 +- fs/xfs/support/debug.h | 3 + fs/xfs/support/ktrace.c | 4 +- fs/xfs/support/uuid.c | 15 +- fs/xfs/xfs_acl.c | 73 +- fs/xfs/xfs_acl.h | 20 +- fs/xfs/xfs_ag.h | 2 +- fs/xfs/xfs_alloc.c | 129 +- fs/xfs/xfs_alloc.h | 24 +- fs/xfs/xfs_alloc_btree.c | 2 + fs/xfs/xfs_attr.c | 131 +- fs/xfs/xfs_attr.h | 14 +- fs/xfs/xfs_attr_leaf.c | 737 +- fs/xfs/xfs_attr_leaf.h | 47 +- fs/xfs/xfs_attr_sf.h | 8 +- fs/xfs/xfs_behavior.c | 4 +- fs/xfs/xfs_behavior.h | 7 +- fs/xfs/xfs_bmap.c | 1749 +- fs/xfs/xfs_bmap.h | 37 +- fs/xfs/xfs_bmap_btree.c | 22 +- fs/xfs/xfs_bmap_btree.h | 8 + fs/xfs/xfs_btree.c | 2 + fs/xfs/xfs_buf_item.c | 13 +- fs/xfs/xfs_cap.h | 12 +- fs/xfs/xfs_clnt.h | 3 +- fs/xfs/xfs_da_btree.c | 589 +- fs/xfs/xfs_da_btree.h | 20 +- fs/xfs/xfs_dfrag.c | 88 +- fs/xfs/xfs_dfrag.h | 3 - fs/xfs/xfs_dinode.h | 10 +- fs/xfs/xfs_dir.c | 32 +- fs/xfs/xfs_dir2.c | 396 +- fs/xfs/xfs_dir2.h | 57 +- fs/xfs/xfs_dir2_block.c | 226 +- fs/xfs/xfs_dir2_block.h | 7 +- fs/xfs/xfs_dir2_data.c | 245 +- fs/xfs/xfs_dir2_data.h | 34 +- fs/xfs/xfs_dir2_leaf.c | 299 +- fs/xfs/xfs_dir2_leaf.h | 15 +- fs/xfs/xfs_dir2_node.c | 319 +- fs/xfs/xfs_dir2_node.h | 10 +- fs/xfs/xfs_dir2_sf.c | 21 +- fs/xfs/xfs_dir2_trace.c | 2 + fs/xfs/xfs_dir_leaf.c | 84 +- fs/xfs/xfs_dir_sf.h | 24 +- fs/xfs/xfs_dmapi.h | 12 +- fs/xfs/xfs_dmops.c | 1 + fs/xfs/xfs_error.c | 2 + fs/xfs/xfs_error.h | 3 - 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 | 39 +- fs/xfs/xfs_ialloc.c | 129 +- fs/xfs/xfs_ialloc_btree.c | 2 + fs/xfs/xfs_iget.c | 61 +- fs/xfs/xfs_inode.c | 1429 +- fs/xfs/xfs_inode.h | 86 +- fs/xfs/xfs_inode_item.c | 59 +- fs/xfs/xfs_inode_item.h | 61 +- fs/xfs/xfs_iocore.c | 7 +- fs/xfs/xfs_iomap.c | 28 +- fs/xfs/xfs_itable.c | 29 +- fs/xfs/xfs_itable.h | 3 +- fs/xfs/xfs_log.c | 59 +- fs/xfs/xfs_log.h | 2 +- fs/xfs/xfs_log_recover.c | 121 +- fs/xfs/xfs_mount.c | 758 +- fs/xfs/xfs_mount.h | 121 +- fs/xfs/xfs_qmops.c | 1 + fs/xfs/xfs_quota.h | 11 +- fs/xfs/xfs_rename.c | 80 +- fs/xfs/xfs_rtalloc.c | 18 +- fs/xfs/xfs_rw.c | 124 +- fs/xfs/xfs_rw.h | 9 +- fs/xfs/xfs_trans.c | 241 +- fs/xfs/xfs_trans.h | 15 +- 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 | 4 +- 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 | 254 +- fs/xfs/xfs_vnodeops.c | 341 +- 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 | 15 +- 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 | 134 +- 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/fcntl.h | 1 - include/asm-alpha/floppy.h | 6 +- include/asm-alpha/fpu.h | 4 +- include/asm-alpha/hardirq.h | 1 + include/asm-alpha/hw_irq.h | 3 + include/asm-alpha/ide.h | 1 + include/asm-alpha/io.h | 85 + 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 | 6 +- include/asm-alpha/mmzone.h | 20 +- include/asm-alpha/module.h | 3 - include/asm-alpha/page.h | 11 +- include/asm-alpha/param.h | 1 + include/asm-alpha/pgalloc.h | 1 + include/asm-alpha/pgtable.h | 1 + include/asm-alpha/poll.h | 4 +- include/asm-alpha/rwsem.h | 14 +- include/asm-alpha/serial.h | 1 + include/asm-alpha/signal.h | 2 + include/asm-alpha/smp.h | 5 +- include/asm-alpha/socket.h | 1 - include/asm-alpha/spinlock.h | 1 + include/asm-alpha/system.h | 1 + include/asm-alpha/termbits.h | 1 - include/asm-alpha/tlbflush.h | 1 + include/asm-alpha/topology.h | 4 +- include/asm-alpha/unistd.h | 7 +- include/asm-alpha/vga.h | 2 +- include/asm-arm/apm.h | 1 + include/asm-arm/arch-aaec2000/debug-macro.S | 1 - include/asm-arm/arch-aaec2000/entry-macro.S | 1 - include/asm-arm/arch-aaec2000/io.h | 1 + include/asm-arm/arch-aaec2000/memory.h | 1 + include/asm-arm/arch-aaec2000/uncompress.h | 23 +- .../asm-arm/arch-at91rm9200/at91rm9200_sys.h | 111 +- include/asm-arm/arch-at91rm9200/board.h | 48 +- include/asm-arm/arch-at91rm9200/gpio.h | 5 - include/asm-arm/arch-at91rm9200/hardware.h | 12 +- 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/system.h | 10 +- include/asm-arm/arch-at91rm9200/timex.h | 2 +- include/asm-arm/arch-at91rm9200/uncompress.h | 25 +- include/asm-arm/arch-at91rm9200/vmalloc.h | 2 +- include/asm-arm/arch-cl7500/acornfb.h | 1 + include/asm-arm/arch-cl7500/debug-macro.S | 14 +- include/asm-arm/arch-cl7500/hardware.h | 4 + include/asm-arm/arch-cl7500/memory.h | 6 - include/asm-arm/arch-cl7500/uncompress.h | 18 +- 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 | 22 +- include/asm-arm/arch-ebsa110/debug-macro.S | 19 +- include/asm-arm/arch-ebsa110/hardware.h | 3 + include/asm-arm/arch-ebsa110/memory.h | 6 - include/asm-arm/arch-ebsa110/uncompress.h | 47 +- include/asm-arm/arch-ebsa285/debug-macro.S | 18 +- include/asm-arm/arch-ebsa285/hardware.h | 8 + include/asm-arm/arch-ebsa285/io.h | 8 + include/asm-arm/arch-ebsa285/memory.h | 13 +- include/asm-arm/arch-ebsa285/uncompress.h | 16 +- include/asm-arm/arch-ebsa285/vmalloc.h | 1 + include/asm-arm/arch-h720x/memory.h | 2 + include/asm-arm/arch-h720x/uncompress.h | 24 +- include/asm-arm/arch-imx/debug-macro.S | 2 +- include/asm-arm/arch-imx/dma.h | 17 +- include/asm-arm/arch-imx/memory.h | 6 +- include/asm-arm/arch-imx/uncompress.h | 21 +- include/asm-arm/arch-integrator/debug-macro.S | 18 +- include/asm-arm/arch-integrator/io.h | 1 + include/asm-arm/arch-integrator/smp.h | 1 + include/asm-arm/arch-integrator/uncompress.h | 21 +- include/asm-arm/arch-iop3xx/debug-macro.S | 19 +- 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 | 17 +- include/asm-arm/arch-ixp2000/debug-macro.S | 17 +- include/asm-arm/arch-ixp2000/ixdp2x00.h | 5 +- include/asm-arm/arch-ixp2000/ixp2000-regs.h | 4 +- include/asm-arm/arch-ixp2000/system.h | 2 +- include/asm-arm/arch-ixp2000/uncompress.h | 15 +- include/asm-arm/arch-ixp4xx/debug-macro.S | 15 +- include/asm-arm/arch-ixp4xx/dma.h | 1 + include/asm-arm/arch-ixp4xx/io.h | 9 +- include/asm-arm/arch-ixp4xx/memory.h | 2 +- include/asm-arm/arch-ixp4xx/platform.h | 27 - include/asm-arm/arch-ixp4xx/uncompress.h | 18 +- include/asm-arm/arch-l7200/hardware.h | 3 + include/asm-arm/arch-l7200/io.h | 1 + include/asm-arm/arch-l7200/memory.h | 6 - include/asm-arm/arch-l7200/serial_l7200.h | 2 +- include/asm-arm/arch-l7200/uncompress.h | 17 +- include/asm-arm/arch-lh7a40x/constants.h | 9 +- include/asm-arm/arch-lh7a40x/dma.h | 79 +- include/asm-arm/arch-lh7a40x/entry-macro.S | 70 +- 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/memory.h | 2 + include/asm-arm/arch-lh7a40x/registers.h | 65 +- include/asm-arm/arch-lh7a40x/uncompress.h | 13 +- include/asm-arm/arch-omap/aic23.h | 4 - include/asm-arm/arch-omap/board-h2.h | 4 + include/asm-arm/arch-omap/board-h3.h | 4 + include/asm-arm/arch-omap/board-h4.h | 8 +- include/asm-arm/arch-omap/board-perseus2.h | 4 + include/asm-arm/arch-omap/board.h | 38 +- include/asm-arm/arch-omap/clock.h | 15 +- include/asm-arm/arch-omap/dma.h | 16 +- include/asm-arm/arch-omap/dmtimer.h | 79 +- include/asm-arm/arch-omap/dsp.h | 6 - include/asm-arm/arch-omap/dsp_common.h | 13 +- include/asm-arm/arch-omap/hardware.h | 13 +- include/asm-arm/arch-omap/io.h | 1 + include/asm-arm/arch-omap/irqs.h | 19 - include/asm-arm/arch-omap/mcbsp.h | 65 - include/asm-arm/arch-omap/menelaus.h | 2 +- include/asm-arm/arch-omap/mux.h | 80 +- include/asm-arm/arch-omap/omapfb.h | 98 +- include/asm-arm/arch-omap/pm.h | 114 +- include/asm-arm/arch-omap/prcm.h | 404 +- include/asm-arm/arch-omap/sram.h | 2 - include/asm-arm/arch-omap/system.h | 18 +- include/asm-arm/arch-omap/uncompress.h | 21 +- include/asm-arm/arch-pxa/audio.h | 4 +- include/asm-arm/arch-pxa/debug-macro.S | 17 +- include/asm-arm/arch-pxa/dma.h | 26 +- include/asm-arm/arch-pxa/idp.h | 1 + include/asm-arm/arch-pxa/io.h | 1 + include/asm-arm/arch-pxa/irq.h | 5 - include/asm-arm/arch-pxa/irqs.h | 7 +- include/asm-arm/arch-pxa/ohci.h | 2 - include/asm-arm/arch-pxa/poodle.h | 4 - include/asm-arm/arch-pxa/pxa-regs.h | 23 +- include/asm-arm/arch-pxa/sharpsl.h | 2 - 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-pxa/uncompress.h | 13 +- include/asm-arm/arch-realview/debug-macro.S | 18 +- include/asm-arm/arch-realview/io.h | 1 + include/asm-arm/arch-realview/smp.h | 1 + include/asm-arm/arch-realview/uncompress.h | 20 +- include/asm-arm/arch-rpc/debug-macro.S | 19 +- include/asm-arm/arch-rpc/hardware.h | 3 + include/asm-arm/arch-rpc/memory.h | 6 - include/asm-arm/arch-rpc/uncompress.h | 27 +- 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 | 13 +- 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/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 | 85 +- 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 | 30 +- 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/debug-macro.S | 1 - include/asm-arm/arch-sa1100/dma.h | 1 + include/asm-arm/arch-sa1100/hardware.h | 5 + 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 | 8 +- include/asm-arm/arch-sa1100/system.h | 1 + include/asm-arm/arch-sa1100/uncompress.h | 21 +- include/asm-arm/arch-shark/hardware.h | 6 + include/asm-arm/arch-shark/memory.h | 6 - include/asm-arm/arch-shark/uncompress.h | 13 +- include/asm-arm/arch-versatile/debug-macro.S | 18 +- 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/arch-versatile/uncompress.h | 20 +- include/asm-arm/assembler.h | 53 +- include/asm-arm/atomic.h | 1 + include/asm-arm/bitops.h | 175 +- include/asm-arm/bug.h | 1 + include/asm-arm/bugs.h | 4 - include/asm-arm/byteorder.h | 10 +- include/asm-arm/cacheflush.h | 27 +- include/asm-arm/cpu.h | 1 + include/asm-arm/delay.h | 12 +- include/asm-arm/dma-mapping.h | 23 +- include/asm-arm/dma.h | 1 + include/asm-arm/domain.h | 25 - include/asm-arm/elf.h | 17 +- include/asm-arm/floppy.h | 2 +- include/asm-arm/fpstate.h | 11 +- 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/hardware/vic.h | 2 +- include/asm-arm/io.h | 43 +- include/asm-arm/irq.h | 26 +- include/asm-arm/leds.h | 1 + include/asm-arm/mach/arch.h | 5 +- include/asm-arm/mach/irq.h | 134 +- include/asm-arm/mach/map.h | 9 +- include/asm-arm/mach/pci.h | 2 +- include/asm-arm/mach/serial_sa1100.h | 1 + include/asm-arm/mach/time.h | 2 - include/asm-arm/memory.h | 106 +- include/asm-arm/mmu.h | 17 - include/asm-arm/mmu_context.h | 14 +- include/asm-arm/module.h | 5 - include/asm-arm/numnodes.h | 2 + include/asm-arm/page.h | 28 +- include/asm-arm/param.h | 7 +- include/asm-arm/pci.h | 1 + include/asm-arm/pgalloc.h | 13 +- include/asm-arm/pgtable.h | 91 +- include/asm-arm/poll.h | 1 - include/asm-arm/proc-fns.h | 13 +- include/asm-arm/procinfo.h | 6 +- include/asm-arm/ptrace.h | 6 +- include/asm-arm/rtc.h | 3 + include/asm-arm/signal.h | 6 + include/asm-arm/smp.h | 1 + include/asm-arm/socket.h | 1 - include/asm-arm/spinlock.h | 22 +- include/asm-arm/system.h | 30 +- include/asm-arm/thread_info.h | 9 +- include/asm-arm/tlb.h | 9 - include/asm-arm/tlbflush.h | 10 +- include/asm-arm/uaccess.h | 184 +- include/asm-arm/ucontext.h | 93 +- include/asm-arm/unistd.h | 73 +- include/asm-arm/vfpmacros.h | 8 - include/asm-arm/vga.h | 2 +- include/asm-arm26/atomic.h | 1 + include/asm-arm26/bitops.h | 146 +- 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/memory.h | 4 +- include/asm-arm26/page.h | 3 +- include/asm-arm26/pgtable.h | 1 + include/asm-arm26/poll.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/bitops.h | 235 +- 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/module.h | 5 - include/asm-cris/page.h | 15 +- include/asm-cris/pci.h | 1 + include/asm-cris/pgtable.h | 1 + include/asm-cris/poll.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 | 4 +- include/asm-cris/tlbflush.h | 1 + include/asm-cris/unistd.h | 15 +- include/asm-frv/atomic.h | 5 +- include/asm-frv/bitops.h | 175 +- include/asm-frv/bug.h | 1 + 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/futex.h | 6 - include/asm-frv/gdb-stub.h | 22 - include/asm-frv/hardirq.h | 1 + include/asm-frv/highmem.h | 3 +- include/asm-frv/ide.h | 1 + include/asm-frv/io.h | 41 +- include/asm-frv/irq-routing.h | 2 +- include/asm-frv/irq.h | 1 + include/asm-frv/mb-regs.h | 27 +- include/asm-frv/mmu_context.h | 1 + include/asm-frv/page.h | 8 +- include/asm-frv/pci.h | 1 + include/asm-frv/pgalloc.h | 1 + include/asm-frv/pgtable.h | 1 + include/asm-frv/poll.h | 1 - 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 | 8 +- include/asm-frv/smp.h | 1 + include/asm-frv/socket.h | 1 - include/asm-frv/system.h | 4 + include/asm-frv/thread_info.h | 24 +- include/asm-frv/tlbflush.h | 1 + include/asm-frv/types.h | 1 + include/asm-frv/uaccess.h | 64 +- include/asm-frv/unaligned.h | 1 + include/asm-frv/unistd.h | 28 +- include/asm-frv/virtconvert.h | 1 + include/asm-generic/bitops.h | 76 +- include/asm-generic/bug.h | 43 +- include/asm-generic/cputime.h | 2 - include/asm-generic/dma-mapping.h | 1 + include/asm-generic/fcntl.h | 5 +- include/asm-generic/futex.h | 6 - include/asm-generic/local.h | 92 +- include/asm-generic/mutex-dec.h | 30 +- include/asm-generic/mutex-null.h | 15 +- include/asm-generic/mutex-xchg.h | 33 +- include/asm-generic/percpu.h | 11 +- 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 | 45 - include/asm-h8300/bitops.h | 223 +- 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/module.h | 5 - include/asm-h8300/page.h | 15 +- include/asm-h8300/page_offset.h | 1 + include/asm-h8300/param.h | 1 + include/asm-h8300/pgtable.h | 1 + include/asm-h8300/poll.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 | 4 + include/asm-h8300/types.h | 3 - include/asm-h8300/unaligned.h | 1 + include/asm-h8300/unistd.h | 9 +- include/asm-h8300/virtconvert.h | 1 + include/asm-i386/a.out.h | 2 +- include/asm-i386/acpi.h | 10 +- include/asm-i386/apic.h | 15 +- include/asm-i386/apicdef.h | 2 +- include/asm-i386/arch_hooks.h | 3 - include/asm-i386/atomic.h | 72 +- include/asm-i386/bitops.h | 63 +- include/asm-i386/bug.h | 1 + include/asm-i386/bugs.h | 1 + include/asm-i386/byteorder.h | 1 + include/asm-i386/cache.h | 3 +- include/asm-i386/cpu.h | 2 + include/asm-i386/cpufeature.h | 14 - include/asm-i386/delay.h | 2 - include/asm-i386/desc.h | 14 - include/asm-i386/dma.h | 1 + include/asm-i386/e820.h | 4 - include/asm-i386/elf.h | 65 +- include/asm-i386/fixmap.h | 12 +- include/asm-i386/floppy.h | 41 +- include/asm-i386/futex.h | 35 +- include/asm-i386/hardirq.h | 1 + include/asm-i386/highmem.h | 1 + include/asm-i386/hpet.h | 2 +- include/asm-i386/hw_irq.h | 13 +- include/asm-i386/ide.h | 1 + include/asm-i386/io.h | 13 + include/asm-i386/io_apic.h | 2 +- include/asm-i386/irq.h | 1 + include/asm-i386/kdebug.h | 12 +- include/asm-i386/kmap_types.h | 1 + include/asm-i386/kprobes.h | 8 - include/asm-i386/local.h | 46 +- include/asm-i386/mach-default/do_timer.h | 2 +- include/asm-i386/mach-default/mach_ipi.h | 7 +- include/asm-i386/mach-default/mach_mpspec.h | 4 - include/asm-i386/mach-default/mach_time.h | 37 +- include/asm-i386/mach-default/mach_timer.h | 4 +- include/asm-i386/mach-default/mach_traps.h | 12 - include/asm-i386/mach-es7000/mach_mpparse.h | 10 +- include/asm-i386/mach-summit/mach_apic.h | 1 + include/asm-i386/mach-summit/mach_mpparse.h | 3 - include/asm-i386/mach-visws/do_timer.h | 2 +- include/asm-i386/mach-voyager/do_timer.h | 2 +- include/asm-i386/mmu.h | 5 - include/asm-i386/mmu_context.h | 1 + include/asm-i386/mmzone.h | 19 +- include/asm-i386/module.h | 5 - include/asm-i386/mpspec.h | 2 + include/asm-i386/msi.h | 10 +- include/asm-i386/mtrr.h | 6 +- include/asm-i386/mutex.h | 6 +- include/asm-i386/nmi.h | 28 +- include/asm-i386/page.h | 28 +- include/asm-i386/param.h | 1 + include/asm-i386/pci.h | 1 + include/asm-i386/pgalloc.h | 2 +- include/asm-i386/pgtable-2level-defs.h | 2 - include/asm-i386/pgtable-2level.h | 2 - include/asm-i386/pgtable-3level-defs.h | 2 - include/asm-i386/pgtable-3level.h | 2 - include/asm-i386/pgtable.h | 6 +- include/asm-i386/poll.h | 1 - include/asm-i386/posix_types.h | 4 +- include/asm-i386/processor.h | 46 +- include/asm-i386/rwlock.h | 60 +- include/asm-i386/rwsem.h | 77 +- include/asm-i386/semaphore.h | 16 +- include/asm-i386/serial.h | 1 + include/asm-i386/setup.h | 21 +- include/asm-i386/signal.h | 6 +- include/asm-i386/smp.h | 1 + include/asm-i386/socket.h | 1 - include/asm-i386/spinlock.h | 50 +- include/asm-i386/stat.h | 3 +- include/asm-i386/string.h | 1 + include/asm-i386/system.h | 110 +- include/asm-i386/thread_info.h | 26 +- include/asm-i386/timer.h | 57 + include/asm-i386/timex.h | 35 +- include/asm-i386/tlbflush.h | 1 + include/asm-i386/topology.h | 13 +- include/asm-i386/types.h | 6 +- include/asm-i386/uaccess.h | 82 +- include/asm-i386/unistd.h | 59 +- include/asm-i386/vga.h | 2 +- include/asm-ia64/acpi-ext.h | 11 +- include/asm-ia64/acpi.h | 5 +- include/asm-ia64/agp.h | 31 - include/asm-ia64/asmmacro.h | 16 +- include/asm-ia64/atomic.h | 8 +- include/asm-ia64/bitops.h | 68 +- include/asm-ia64/cache.h | 3 +- include/asm-ia64/compat.h | 6 - include/asm-ia64/delay.h | 1 + include/asm-ia64/dma-mapping.h | 99 +- include/asm-ia64/dma.h | 1 + include/asm-ia64/elf.h | 1 + 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 | 202 +- include/asm-ia64/intrinsics.h | 1 + include/asm-ia64/io.h | 57 +- include/asm-ia64/iosapic.h | 2 - include/asm-ia64/irq.h | 32 +- include/asm-ia64/kdebug.h | 8 +- include/asm-ia64/kmap_types.h | 1 + include/asm-ia64/kprobes.h | 2 - include/asm-ia64/linkage.h | 8 - include/asm-ia64/machvec.h | 23 +- include/asm-ia64/machvec_dig.h | 17 +- include/asm-ia64/machvec_sn2.h | 11 +- include/asm-ia64/mca.h | 16 +- include/asm-ia64/meminit.h | 13 +- include/asm-ia64/module.h | 5 - include/asm-ia64/msi.h | 12 - include/asm-ia64/mutex.h | 93 +- include/asm-ia64/nodedata.h | 13 +- include/asm-ia64/numa.h | 9 +- include/asm-ia64/page.h | 78 +- include/asm-ia64/pal.h | 45 +- include/asm-ia64/param.h | 1 + include/asm-ia64/percpu.h | 4 +- include/asm-ia64/pgalloc.h | 9 +- include/asm-ia64/pgtable.h | 28 +- include/asm-ia64/poll.h | 1 - include/asm-ia64/processor.h | 6 +- include/asm-ia64/ptrace.h | 11 +- include/asm-ia64/rwsem.h | 18 +- include/asm-ia64/signal.h | 6 + include/asm-ia64/smp.h | 1 + include/asm-ia64/sn/addrs.h | 8 - include/asm-ia64/sn/intr.h | 8 - include/asm-ia64/sn/l1.h | 3 +- include/asm-ia64/sn/pcibr_provider.h | 6 +- include/asm-ia64/sn/pcibus_provider_defs.h | 17 +- include/asm-ia64/sn/pcidev.h | 1 - include/asm-ia64/sn/rw_mmr.h | 56 +- include/asm-ia64/sn/simulator.h | 1 + include/asm-ia64/sn/sn2/sn_hwperf.h | 6 +- include/asm-ia64/sn/sn_cpuid.h | 1 + include/asm-ia64/sn/sn_feature_sets.h | 3 +- include/asm-ia64/sn/sn_sal.h | 60 +- include/asm-ia64/sn/tioca_provider.h | 2 +- include/asm-ia64/sn/tioce.h | 36 +- include/asm-ia64/sn/tiocp.h | 3 +- include/asm-ia64/sn/xpc.h | 28 +- include/asm-ia64/socket.h | 1 - include/asm-ia64/string.h | 1 + include/asm-ia64/system.h | 19 +- include/asm-ia64/thread_info.h | 19 +- include/asm-ia64/tlb.h | 1 + include/asm-ia64/tlbflush.h | 1 + include/asm-ia64/topology.h | 6 - include/asm-ia64/unistd.h | 12 +- include/asm-ia64/ustack.h | 7 +- include/asm-ia64/vga.h | 2 +- include/asm-m32r/assembler.h | 6 +- include/asm-m32r/atomic.h | 1 + include/asm-m32r/bitops.h | 458 +- 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/mappi3/mappi3_pld.h | 22 +- include/asm-m32r/mmu.h | 1 + include/asm-m32r/mmu_context.h | 2 + include/asm-m32r/mmzone.h | 14 + include/asm-m32r/module.h | 5 - 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 | 9 +- include/asm-m32r/pgalloc.h | 1 + include/asm-m32r/pgtable-2level.h | 1 + include/asm-m32r/pgtable.h | 1 + include/asm-m32r/poll.h | 1 - include/asm-m32r/processor.h | 1 + include/asm-m32r/ptrace.h | 38 +- include/asm-m32r/rtc.h | 1 + include/asm-m32r/semaphore.h | 65 +- include/asm-m32r/serial.h | 1 + include/asm-m32r/setup.h | 4 + include/asm-m32r/sigcontext.h | 12 +- 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 | 73 +- include/asm-m32r/timex.h | 1 + include/asm-m32r/tlbflush.h | 1 + include/asm-m32r/uaccess.h | 1 + include/asm-m32r/unistd.h | 11 +- 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 | 9 +- include/asm-m68k/bitops.h | 42 +- 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/module.h | 5 - 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 | 11 +- include/asm-m68k/page_offset.h | 1 + include/asm-m68k/pgalloc.h | 1 + include/asm-m68k/pgtable.h | 1 + include/asm-m68k/poll.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/stat.h | 3 +- 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 | 222 +- 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 | 16 +- 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 | 10 +- 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 | 37 +- 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 | 48 +- include/asm-mips/atomic.h | 3 +- include/asm-mips/bcache.h | 1 + include/asm-mips/bitops.h | 526 +- include/asm-mips/bootinfo.h | 13 - include/asm-mips/bug.h | 1 + include/asm-mips/bugs.h | 1 + include/asm-mips/byteorder.h | 23 +- include/asm-mips/cache.h | 1 + include/asm-mips/cacheflush.h | 1 - include/asm-mips/checksum.h | 1 + include/asm-mips/compat.h | 16 +- include/asm-mips/cpu-features.h | 33 +- include/asm-mips/cpu-info.h | 11 +- include/asm-mips/cpu.h | 8 +- 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 | 23 +- include/asm-mips/dma.h | 1 + include/asm-mips/elf.h | 46 +- include/asm-mips/fcntl.h | 1 + include/asm-mips/fixmap.h | 5 +- include/asm-mips/fpu.h | 8 +- include/asm-mips/fpu_emulator.h | 4 +- include/asm-mips/futex.h | 158 +- include/asm-mips/hazards.h | 7 +- include/asm-mips/highmem.h | 1 + include/asm-mips/hw_irq.h | 8 +- include/asm-mips/inst.h | 33 +- include/asm-mips/interrupt.h | 73 +- include/asm-mips/io.h | 83 +- include/asm-mips/ip32/machine.h | 1 + include/asm-mips/irq.h | 36 +- include/asm-mips/isadep.h | 1 + include/asm-mips/jmr3927/irq.h | 1 + include/asm-mips/kmap_types.h | 1 + include/asm-mips/linkage.h | 4 +- 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 + include/asm-mips/mach-cobalt/cobalt.h | 2 - .../mach-cobalt/cpu-feature-overrides.h | 3 +- include/asm-mips/mach-db1x00/db1x00.h | 13 +- include/asm-mips/mach-dec/mc146818rtc.h | 2 - include/asm-mips/mach-generic/floppy.h | 2 +- include/asm-mips/mach-generic/ide.h | 47 +- include/asm-mips/mach-generic/kmalloc.h | 1 + include/asm-mips/mach-generic/mangle-port.h | 36 - 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 +- include/asm-mips/mach-ip27/mangle-port.h | 9 - .../mach-ip32/cpu-feature-overrides.h | 3 +- include/asm-mips/mach-ip32/kmalloc.h | 1 + include/asm-mips/mach-ip32/mangle-port.h | 9 - .../asm-mips/mach-ja/cpu-feature-overrides.h | 2 +- include/asm-mips/mach-jazz/floppy.h | 2 +- include/asm-mips/mach-jmr3927/ds1742.h | 4 +- .../mach-mips/cpu-feature-overrides.h | 13 +- include/asm-mips/mach-mips/irq.h | 7 + .../mach-ocelot3/cpu-feature-overrides.h | 2 +- include/asm-mips/mach-pb1x00/pb1550.h | 1 + .../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 | 2 +- include/asm-mips/marvell.h | 2 - include/asm-mips/mc146818-time.h | 33 +- include/asm-mips/mips-boards/atlas.h | 18 +- include/asm-mips/mips-boards/atlasint.h | 19 + include/asm-mips/mips-boards/generic.h | 2 +- include/asm-mips/mipsmtregs.h | 16 +- include/asm-mips/mipsregs.h | 140 +- include/asm-mips/mmu_context.h | 120 +- include/asm-mips/mmzone.h | 27 + include/asm-mips/module.h | 13 +- include/asm-mips/msgbuf.h | 1 + include/asm-mips/paccess.h | 1 + include/asm-mips/page.h | 33 +- 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 | 62 +- include/asm-mips/pgtable-64.h | 14 +- include/asm-mips/pgtable-bits.h | 1 + include/asm-mips/pgtable.h | 96 +- include/asm-mips/poll.h | 1 - include/asm-mips/prefetch.h | 1 + include/asm-mips/processor.h | 39 +- include/asm-mips/ptrace.h | 5 +- include/asm-mips/qemu.h | 6 - include/asm-mips/r4kcache.h | 129 - include/asm-mips/reg.h | 1 + include/asm-mips/resource.h | 1 + include/asm-mips/rtc.h | 4 +- include/asm-mips/rtlx.h | 38 +- include/asm-mips/serial.h | 98 +- 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/sigcontext.h | 10 +- include/asm-mips/siginfo.h | 1 + include/asm-mips/signal.h | 32 +- include/asm-mips/sim.h | 1 + include/asm-mips/smp.h | 6 +- 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 | 102 +- include/asm-mips/sn/kldir.h | 35 +- include/asm-mips/sn/launch.h | 1 + include/asm-mips/sn/mapped_kernel.h | 5 + 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 | 28 +- 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/sni.h | 7 +- include/asm-mips/socket.h | 1 - include/asm-mips/stackframe.h | 206 +- include/asm-mips/string.h | 1 + include/asm-mips/system.h | 48 +- include/asm-mips/termbits.h | 2 +- include/asm-mips/thread_info.h | 3 +- include/asm-mips/time.h | 16 +- include/asm-mips/tlbflush.h | 1 + include/asm-mips/tx4927/toshiba_rbtx4927.h | 1 + include/asm-mips/types.h | 6 +- include/asm-mips/uaccess.h | 1 + include/asm-mips/unistd.h | 34 +- include/asm-mips/vga.h | 2 +- include/asm-mips/vr41xx/capcella.h | 2 +- include/asm-mips/vr41xx/cmbvr4133.h | 6 +- include/asm-mips/vr41xx/mpc30x.h | 2 +- include/asm-mips/vr41xx/tb0219.h | 2 +- include/asm-mips/vr41xx/tb0226.h | 2 +- include/asm-mips/vr41xx/tb0287.h | 2 +- include/asm-mips/vr41xx/vr41xx.h | 53 + include/asm-mips/war.h | 6 +- include/asm-mips/wbflush.h | 1 + include/asm-parisc/assembly.h | 2 - include/asm-parisc/atomic.h | 4 +- include/asm-parisc/bitops.h | 286 +- include/asm-parisc/cache.h | 5 +- include/asm-parisc/cacheflush.h | 18 +- include/asm-parisc/compat.h | 16 - 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 | 131 +- include/asm-parisc/irq.h | 6 + include/asm-parisc/kmap_types.h | 1 + include/asm-parisc/local.h | 16 +- include/asm-parisc/mmzone.h | 22 + include/asm-parisc/module.h | 8 - include/asm-parisc/page.h | 83 +- include/asm-parisc/param.h | 1 + include/asm-parisc/pci.h | 6 +- include/asm-parisc/pdc.h | 24 +- include/asm-parisc/pdc_chassis.h | 5 +- include/asm-parisc/pgtable.h | 64 +- include/asm-parisc/poll.h | 1 - include/asm-parisc/processor.h | 15 +- include/asm-parisc/psw.h | 1 + include/asm-parisc/semaphore.h | 6 +- include/asm-parisc/signal.h | 2 + include/asm-parisc/smp.h | 1 + include/asm-parisc/socket.h | 1 - include/asm-parisc/spinlock.h | 16 +- include/asm-parisc/system.h | 29 +- include/asm-parisc/thread_info.h | 3 +- include/asm-parisc/tlbflush.h | 1 + include/asm-parisc/uaccess.h | 9 +- include/asm-parisc/unistd.h | 17 +- include/asm-powerpc/abs_addr.h | 1 + include/asm-powerpc/atomic.h | 70 +- include/asm-powerpc/backlight.h | 40 +- include/asm-powerpc/bitops.h | 127 +- include/asm-powerpc/bug.h | 36 +- include/asm-powerpc/cache.h | 1 + include/asm-powerpc/cputable.h | 375 +- include/asm-powerpc/cputime.h | 220 - include/asm-powerpc/delay.h | 13 - include/asm-powerpc/dma-mapping.h | 1 + include/asm-powerpc/dma.h | 1 + include/asm-powerpc/eeh.h | 39 +- include/asm-powerpc/eeh_event.h | 10 +- include/asm-powerpc/elf.h | 14 +- include/asm-powerpc/firmware.h | 26 +- include/asm-powerpc/floppy.h | 4 +- include/asm-powerpc/futex.h | 32 - include/asm-powerpc/hvcall.h | 194 +- include/asm-powerpc/hvconsole.h | 26 +- include/asm-powerpc/hw_irq.h | 19 +- include/asm-powerpc/i8259.h | 8 +- include/asm-powerpc/ide.h | 1 + include/asm-powerpc/io.h | 62 +- include/asm-powerpc/iommu.h | 12 +- include/asm-powerpc/ipic.h | 12 +- include/asm-powerpc/irq.h | 440 +- include/asm-powerpc/iseries/iseries_io.h | 1 + include/asm-powerpc/iseries/it_lp_queue.h | 40 +- include/asm-powerpc/iseries/mf.h | 7 +- include/asm-powerpc/kdebug.h | 14 +- include/asm-powerpc/kdump.h | 33 +- include/asm-powerpc/kexec.h | 28 +- include/asm-powerpc/kprobes.h | 3 - include/asm-powerpc/lmb.h | 19 +- include/asm-powerpc/machdep.h | 57 +- include/asm-powerpc/mmu.h | 18 +- include/asm-powerpc/mmu_context.h | 19 +- include/asm-powerpc/mmzone.h | 1 + include/asm-powerpc/module.h | 10 - include/asm-powerpc/mpic.h | 198 +- include/asm-powerpc/of_device.h | 2 +- include/asm-powerpc/oprofile_impl.h | 17 +- include/asm-powerpc/paca.h | 15 +- include/asm-powerpc/page.h | 17 +- include/asm-powerpc/page_64.h | 1 - include/asm-powerpc/pci-bridge.h | 13 +- include/asm-powerpc/pci.h | 2 +- include/asm-powerpc/percpu.h | 10 +- include/asm-powerpc/pgalloc.h | 9 +- include/asm-powerpc/pgtable-4k.h | 13 +- include/asm-powerpc/pgtable-64k.h | 2 - include/asm-powerpc/pgtable.h | 25 +- include/asm-powerpc/pmac_feature.h | 2 +- include/asm-powerpc/pmac_pfunc.h | 2 +- include/asm-powerpc/poll.h | 1 - include/asm-powerpc/ppc_asm.h | 43 +- include/asm-powerpc/processor.h | 77 +- include/asm-powerpc/prom.h | 130 +- include/asm-powerpc/ptrace.h | 4 + include/asm-powerpc/reg.h | 73 +- include/asm-powerpc/rtas.h | 13 +- include/asm-powerpc/rwsem.h | 20 +- include/asm-powerpc/signal.h | 2 + include/asm-powerpc/smp.h | 3 +- include/asm-powerpc/smu.h | 1 + include/asm-powerpc/socket.h | 1 - include/asm-powerpc/spinlock.h | 17 - include/asm-powerpc/spu.h | 43 +- include/asm-powerpc/spu_csa.h | 13 +- include/asm-powerpc/string.h | 2 +- include/asm-powerpc/synch.h | 2 +- include/asm-powerpc/system.h | 37 +- include/asm-powerpc/tce.h | 35 +- include/asm-powerpc/termbits.h | 1 - include/asm-powerpc/thread_info.h | 9 +- include/asm-powerpc/time.h | 26 +- include/asm-powerpc/timex.h | 1 + include/asm-powerpc/tlb.h | 1 + include/asm-powerpc/tlbflush.h | 1 + include/asm-powerpc/topology.h | 39 +- include/asm-powerpc/types.h | 6 +- include/asm-powerpc/uaccess.h | 19 +- include/asm-powerpc/udbg.h | 6 +- include/asm-powerpc/unistd.h | 68 +- include/asm-powerpc/vdso_datapage.h | 3 - 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 | 2 +- include/asm-ppc/cpm2.h | 97 +- include/asm-ppc/floppy.h | 8 +- include/asm-ppc/harrier.h | 2 + include/asm-ppc/ibm403.h | 1 + include/asm-ppc/ibm44x.h | 3 +- include/asm-ppc/ibm4xx.h | 5 +- include/asm-ppc/io.h | 28 +- include/asm-ppc/machdep.h | 18 +- include/asm-ppc/mmu.h | 24 +- include/asm-ppc/mmu_context.h | 28 +- include/asm-ppc/mpc10x.h | 3 +- include/asm-ppc/mpc52xx.h | 5 - include/asm-ppc/mpc8260.h | 3 +- include/asm-ppc/mpc83xx.h | 2 +- include/asm-ppc/mpc85xx.h | 5 +- include/asm-ppc/mpc8xx.h | 5 +- include/asm-ppc/mv64x60.h | 1 + include/asm-ppc/ocp.h | 2 + include/asm-ppc/open_pic.h | 1 + include/asm-ppc/page.h | 11 +- include/asm-ppc/pc_serial.h | 1 + include/asm-ppc/pci.h | 2 +- include/asm-ppc/pgalloc.h | 6 +- include/asm-ppc/pgtable.h | 12 +- include/asm-ppc/ppc4xx_dma.h | 1 + include/asm-ppc/ppc4xx_pic.h | 1 + include/asm-ppc/ppc_sys.h | 36 - include/asm-ppc/prom.h | 156 +- include/asm-ppc/reg_booke.h | 1 - include/asm-ppc/serial.h | 8 +- include/asm-ppc/smp.h | 1 + include/asm-ppc/system.h | 1 + include/asm-ppc/time.h | 6 +- include/asm-ppc/todc.h | 2 + include/asm-s390/atomic.h | 20 +- include/asm-s390/bitops.h | 91 +- include/asm-s390/bug.h | 14 +- include/asm-s390/cache.h | 2 - include/asm-s390/ccwdev.h | 2 +- include/asm-s390/cio.h | 4 - include/asm-s390/cmb.h | 4 + include/asm-s390/compat.h | 5 - include/asm-s390/dasd.h | 8 +- include/asm-s390/debug.h | 3 +- include/asm-s390/div64.h | 48 + include/asm-s390/ebcdic.h | 12 +- include/asm-s390/elf.h | 28 +- include/asm-s390/futex.h | 125 +- 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 | 5 +- include/asm-s390/module.h | 3 - include/asm-s390/page.h | 11 +- include/asm-s390/percpu.h | 10 +- include/asm-s390/pgalloc.h | 14 +- include/asm-s390/pgtable.h | 7 + include/asm-s390/poll.h | 1 - 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 | 6 +- include/asm-s390/unistd.h | 18 +- include/asm-s390/vtoc.h | 38 +- include/asm-sh/addrspace.h | 2 +- include/asm-sh/bitops.h | 348 +- 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 | 15 + 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/module.h | 5 - 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 | 11 +- include/asm-sh/pgtable.h | 1 + include/asm-sh/poll.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/stat.h | 8 +- include/asm-sh/system.h | 4 +- include/asm-sh/thread_info.h | 2 +- include/asm-sh/types.h | 6 +- include/asm-sh/unistd.h | 9 +- include/asm-sh/watchdog.h | 1 + include/asm-sh64/bitops.h | 390 +- include/asm-sh64/bug.h | 17 +- include/asm-sh64/byteorder.h | 4 +- include/asm-sh64/dma-mapping.h | 17 +- include/asm-sh64/hardirq.h | 1 + include/asm-sh64/hw_irq.h | 1 + include/asm-sh64/ide.h | 1 + include/asm-sh64/io.h | 7 - include/asm-sh64/irq.h | 1 + include/asm-sh64/keyboard.h | 2 +- include/asm-sh64/mmu_context.h | 1 + include/asm-sh64/page.h | 11 +- include/asm-sh64/param.h | 1 + include/asm-sh64/pgalloc.h | 16 + include/asm-sh64/pgtable.h | 1 + include/asm-sh64/platform.h | 5 + include/asm-sh64/poll.h | 1 - include/asm-sh64/processor.h | 3 +- include/asm-sh64/ptrace.h | 2 +- include/asm-sh64/shmparam.h | 16 +- include/asm-sh64/signal.h | 3 + include/asm-sh64/system.h | 4 +- include/asm-sh64/uaccess.h | 19 +- include/asm-sh64/unistd.h | 9 +- include/asm-sh64/user.h | 1 + include/asm-sparc/asmmacro.h | 1 + include/asm-sparc/atomic.h | 1 + include/asm-sparc/bitops.h | 388 +- include/asm-sparc/bugs.h | 1 + include/asm-sparc/cacheflush.h | 1 + include/asm-sparc/cpudata.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/fcntl.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/idprom.h | 26 +- include/asm-sparc/io.h | 16 - include/asm-sparc/irq.h | 7 + include/asm-sparc/module.h | 5 - include/asm-sparc/mostek.h | 1 + include/asm-sparc/oplib.h | 7 +- include/asm-sparc/page.h | 15 +- include/asm-sparc/pbm.h | 3 +- include/asm-sparc/pgalloc.h | 5 +- include/asm-sparc/pgtable.h | 7 +- include/asm-sparc/poll.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 | 18 +- include/asm-sparc/socket.h | 3 +- include/asm-sparc/spinlock.h | 28 +- include/asm-sparc/system.h | 3 + include/asm-sparc/timer.h | 1 + include/asm-sparc/tlbflush.h | 1 + include/asm-sparc/uaccess.h | 47 + include/asm-sparc/unistd.h | 24 +- include/asm-sparc/vac-ops.h | 1 + include/asm-sparc/winmacro.h | 1 + include/asm-sparc64/a.out.h | 6 +- include/asm-sparc64/asi.h | 18 +- include/asm-sparc64/atomic.h | 11 +- include/asm-sparc64/bitops.h | 220 +- include/asm-sparc64/bugs.h | 1 + include/asm-sparc64/cache.h | 2 - include/asm-sparc64/cacheflush.h | 1 + include/asm-sparc64/cpudata.h | 207 +- include/asm-sparc64/delay.h | 1 + include/asm-sparc64/dma-mapping.h | 60 +- include/asm-sparc64/dma.h | 1 + include/asm-sparc64/ebus.h | 20 +- include/asm-sparc64/elf.h | 22 +- include/asm-sparc64/fcntl.h | 1 - include/asm-sparc64/fhc.h | 7 +- include/asm-sparc64/floppy.h | 82 +- include/asm-sparc64/futex.h | 22 - include/asm-sparc64/hardirq.h | 2 - include/asm-sparc64/head.h | 15 - include/asm-sparc64/hw_irq.h | 2 +- include/asm-sparc64/ide.h | 1 + include/asm-sparc64/idprom.h | 12 +- include/asm-sparc64/irq.h | 99 +- include/asm-sparc64/isa.h | 21 +- include/asm-sparc64/kdebug.h | 13 +- include/asm-sparc64/kprobes.h | 3 +- include/asm-sparc64/mc146818rtc.h | 1 + include/asm-sparc64/mmu.h | 58 +- include/asm-sparc64/mmu_context.h | 167 +- include/asm-sparc64/module.h | 5 - include/asm-sparc64/openprom.h | 2 +- include/asm-sparc64/oplib.h | 54 +- include/asm-sparc64/page.h | 55 +- include/asm-sparc64/param.h | 1 + include/asm-sparc64/parport.h | 25 +- include/asm-sparc64/pbm.h | 23 +- include/asm-sparc64/pci.h | 58 +- include/asm-sparc64/percpu.h | 10 +- include/asm-sparc64/pgalloc.h | 169 +- include/asm-sparc64/pgtable.h | 711 +- include/asm-sparc64/pil.h | 11 +- include/asm-sparc64/poll.h | 1 - include/asm-sparc64/processor.h | 24 +- include/asm-sparc64/pstate.h | 9 +- 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 | 31 +- include/asm-sparc64/socket.h | 1 - include/asm-sparc64/spinlock.h | 1 + include/asm-sparc64/spitfire.h | 1 - include/asm-sparc64/starfire.h | 2 +- include/asm-sparc64/system.h | 10 +- include/asm-sparc64/thread_info.h | 9 +- include/asm-sparc64/timer.h | 1 + include/asm-sparc64/timex.h | 6 - include/asm-sparc64/tlb.h | 1 + include/asm-sparc64/tlbflush.h | 26 +- include/asm-sparc64/topology.h | 3 - include/asm-sparc64/ttable.h | 273 +- include/asm-sparc64/uaccess.h | 46 +- include/asm-sparc64/unistd.h | 22 +- include/asm-sparc64/vga.h | 2 +- include/asm-sparc64/xor.h | 34 +- include/asm-um/a.out.h | 1 + include/asm-um/cache.h | 1 + include/asm-um/desc.h | 12 +- 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/module-i386.h | 4 - include/asm-um/page.h | 8 +- include/asm-um/pgalloc.h | 1 + include/asm-um/processor-generic.h | 1 + include/asm-um/processor-i386.h | 35 +- include/asm-um/processor-x86_64.h | 9 - include/asm-um/ptrace-generic.h | 17 +- include/asm-um/ptrace-i386.h | 44 +- include/asm-um/ptrace-x86_64.h | 35 +- include/asm-um/segment.h | 6 - include/asm-um/smp.h | 1 + include/asm-um/thread_info.h | 17 +- include/asm-um/uaccess.h | 35 +- include/asm-v850/atomic.h | 1 + include/asm-v850/bitops.h | 221 +- 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/linkage.h | 4 +- include/asm-v850/machdep.h | 1 + include/asm-v850/module.h | 5 - include/asm-v850/page.h | 13 +- include/asm-v850/param.h | 4 +- include/asm-v850/pgtable.h | 1 + include/asm-v850/poll.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 | 3 + include/asm-v850/unistd.h | 12 +- include/asm-v850/v850e_uart.h | 1 + include/asm-x86_64/apic.h | 29 +- include/asm-x86_64/apicdef.h | 3 +- include/asm-x86_64/atomic.h | 51 +- include/asm-x86_64/bitops.h | 50 +- include/asm-x86_64/bugs.h | 1 + include/asm-x86_64/cache.h | 3 +- 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 | 6 +- include/asm-x86_64/elf.h | 22 +- include/asm-x86_64/fixmap.h | 1 + include/asm-x86_64/floppy.h | 10 +- include/asm-x86_64/futex.h | 27 - include/asm-x86_64/hardirq.h | 1 + include/asm-x86_64/hpet.h | 4 +- include/asm-x86_64/hw_irq.h | 14 +- include/asm-x86_64/ia32.h | 1 + include/asm-x86_64/ia32_unistd.h | 310 +- include/asm-x86_64/io.h | 41 +- include/asm-x86_64/io_apic.h | 2 +- include/asm-x86_64/ipi.h | 2 - include/asm-x86_64/kdebug.h | 27 +- include/asm-x86_64/kprobes.h | 2 - include/asm-x86_64/local.h | 44 +- include/asm-x86_64/mce.h | 20 +- include/asm-x86_64/mmu_context.h | 7 +- include/asm-x86_64/mmzone.h | 18 +- include/asm-x86_64/module.h | 5 - 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 | 8 +- include/asm-x86_64/page.h | 14 +- include/asm-x86_64/param.h | 1 + include/asm-x86_64/pci.h | 5 +- include/asm-x86_64/pda.h | 2 +- include/asm-x86_64/percpu.h | 11 +- include/asm-x86_64/pgalloc.h | 35 - include/asm-x86_64/pgtable.h | 22 +- include/asm-x86_64/poll.h | 1 - include/asm-x86_64/processor.h | 19 +- include/asm-x86_64/proto.h | 18 +- 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 | 4 +- include/asm-x86_64/socket.h | 1 - include/asm-x86_64/spinlock.h | 25 +- include/asm-x86_64/string.h | 20 +- include/asm-x86_64/suspend.h | 4 +- include/asm-x86_64/swiotlb.h | 3 +- include/asm-x86_64/system.h | 154 +- include/asm-x86_64/thread_info.h | 21 +- include/asm-x86_64/timex.h | 2 +- include/asm-x86_64/tlbflush.h | 1 + include/asm-x86_64/topology.h | 13 +- include/asm-x86_64/uaccess.h | 1 + include/asm-x86_64/unistd.h | 49 +- include/asm-x86_64/vga.h | 2 +- include/asm-x86_64/vsyscall.h | 3 +- include/asm-xtensa/atomic.h | 1 + include/asm-xtensa/bitops.h | 340 +- 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/ioctls.h | 2 +- include/asm-xtensa/irq.h | 1 + include/asm-xtensa/mmu_context.h | 1 + include/asm-xtensa/page.h | 7 +- include/asm-xtensa/pgalloc.h | 1 + include/asm-xtensa/platform.h | 1 + include/asm-xtensa/poll.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 | 4 + 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/adb.h | 2 +- include/linux/affs_hardblocks.h | 72 +- include/linux/agpgart.h | 3 +- include/linux/amba/clcd.h | 13 +- include/linux/amba/serial.h | 6 - include/linux/arcdevice.h | 9 + include/linux/ata.h | 66 +- include/linux/atmdev.h | 5 +- include/linux/audit.h | 272 +- include/linux/auto_fs4.h | 51 +- include/linux/backlight.h | 25 +- include/linux/bio.h | 2 +- include/linux/bitmap.h | 20 +- include/linux/bitops.h | 131 +- include/linux/blkdev.h | 59 +- include/linux/blkpg.h | 1 - include/linux/blockgroup_lock.h | 1 + include/linux/bootmem.h | 9 +- include/linux/buffer_head.h | 29 +- include/linux/cache.h | 5 +- include/linux/capability.h | 3 +- include/linux/cdev.h | 4 +- include/linux/cdrom.h | 5 +- include/linux/clk.h | 4 +- include/linux/cn_proc.h | 24 +- include/linux/coda.h | 1 + include/linux/coda_linux.h | 12 +- include/linux/coda_psdev.h | 2 +- include/linux/compat.h | 49 +- include/linux/compat_ioctl.h | 17 +- include/linux/compiler.h | 19 +- include/linux/completion.h | 15 - include/linux/config.h | 5 +- include/linux/connector.h | 5 +- include/linux/console.h | 9 +- include/linux/console_struct.h | 1 - include/linux/cpu.h | 31 +- include/linux/cpufreq.h | 10 +- include/linux/cpumask.h | 52 +- include/linux/cpuset.h | 29 +- include/linux/cramfs_fs.h | 34 +- include/linux/crash_dump.h | 2 +- include/linux/crypto.h | 59 +- include/linux/cyclomx.h | 1 + include/linux/dcache.h | 26 +- include/linux/dccp.h | 132 +- include/linux/dcookies.h | 1 + include/linux/debugfs.h | 22 +- include/linux/delay.h | 17 +- include/linux/device-mapper.h | 112 +- include/linux/device.h | 33 +- include/linux/dio.h | 32 + include/linux/divert.h | 20 +- include/linux/dm-ioctl.h | 19 +- include/linux/dma-mapping.h | 3 - include/linux/dmi.h | 3 +- include/linux/dn.h | 44 +- include/linux/dnotify.h | 1 + include/linux/dqblk_xfs.h | 4 +- include/linux/dvb/audio.h | 13 - include/linux/dvb/dmx.h | 26 + include/linux/dvb/video.h | 13 - include/linux/efi.h | 21 +- include/linux/efs_fs.h | 4 +- include/linux/elevator.h | 12 +- include/linux/elf.h | 59 +- include/linux/elfcore.h | 10 - include/linux/err.h | 4 +- include/linux/errno.h | 3 - include/linux/errqueue.h | 1 + include/linux/ethtool.h | 171 +- include/linux/eventpoll.h | 10 +- include/linux/ext2_fs.h | 2 +- include/linux/ext3_fs.h | 53 +- include/linux/ext3_fs_i.h | 23 +- include/linux/fb.h | 50 +- include/linux/fcntl.h | 1 - include/linux/file.h | 30 +- include/linux/firmware.h | 1 + include/linux/fs.h | 235 +- include/linux/fs_enet_pd.h | 50 +- include/linux/fsl_devices.h | 38 - include/linux/fsnotify.h | 57 +- include/linux/ftape.h | 1 + include/linux/fuse.h | 36 +- include/linux/futex.h | 102 +- include/linux/gameport.h | 17 +- include/linux/genalloc.h | 35 +- include/linux/generic_serial.h | 10 +- include/linux/genhd.h | 44 +- include/linux/gfp.h | 11 +- include/linux/hardirq.h | 28 +- include/linux/hdlc.h | 4 +- include/linux/highmem.h | 19 +- include/linux/highuid.h | 1 + include/linux/hpet.h | 36 +- include/linux/hrtimer.h | 60 +- include/linux/hugetlb.h | 43 +- include/linux/hwmon-sysfs.h | 24 +- include/linux/i2c-algo-ite.h | 7 +- include/linux/i2c-id.h | 10 +- include/linux/i2c.h | 21 +- include/linux/i2o-dev.h | 167 +- include/linux/i2o.h | 4 +- include/linux/icmpv6.h | 11 +- include/linux/ide.h | 11 +- include/linux/idr.h | 3 +- include/linux/if.h | 29 +- include/linux/if_ether.h | 1 - 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 | 4 +- include/linux/in.h | 1 - include/linux/inetdevice.h | 1 - include/linux/init.h | 8 +- include/linux/init_task.h | 27 +- include/linux/inotify.h | 120 +- include/linux/input.h | 152 +- include/linux/interrupt.h | 156 +- include/linux/io.h | 1 - include/linux/ioc4.h | 5 - include/linux/ioport.h | 33 +- include/linux/ioprio.h | 23 +- include/linux/ipmi.h | 7 +- include/linux/ipmi_msgdefs.h | 1 - include/linux/ipmi_smi.h | 63 +- include/linux/ipv6.h | 15 +- include/linux/ipv6_route.h | 10 - include/linux/irda.h | 1 - include/linux/irq.h | 432 +- include/linux/irq_cpustat.h | 1 + include/linux/isapnp.h | 1 + include/linux/isdn.h | 1 + include/linux/isdn_ppp.h | 1 + include/linux/isdnif.h | 1 + include/linux/jbd.h | 24 +- include/linux/jffs2.h | 57 +- include/linux/jiffies.h | 10 +- include/linux/joystick.h | 22 +- include/linux/kallsyms.h | 24 +- include/linux/kbd_kern.h | 6 +- include/linux/kernel.h | 29 +- include/linux/kernel_stat.h | 3 +- include/linux/kexec.h | 1 - include/linux/key.h | 40 +- include/linux/keyboard.h | 13 - include/linux/kmod.h | 3 +- include/linux/kobj_map.h | 4 +- include/linux/kobject.h | 9 +- include/linux/kprobes.h | 4 +- include/linux/kthread.h | 66 +- include/linux/ktime.h | 35 +- include/linux/libata.h | 638 +- include/linux/libps2.h | 2 +- include/linux/linkage.h | 17 +- include/linux/list.h | 206 +- include/linux/lockd/lockd.h | 33 +- include/linux/lockd/nlm.h | 1 + include/linux/lockd/share.h | 2 +- include/linux/lockd/xdr.h | 1 - include/linux/loop.h | 3 +- include/linux/major.h | 1 - include/linux/mc146818rtc.h | 7 - include/linux/memory.h | 1 + include/linux/memory_hotplug.h | 82 +- include/linux/mempolicy.h | 6 +- include/linux/mempool.h | 38 - include/linux/mii.h | 30 +- include/linux/miscdevice.h | 3 +- include/linux/mm.h | 138 +- include/linux/mm_inline.h | 2 +- include/linux/mman.h | 12 +- include/linux/mmc/card.h | 1 - include/linux/mmc/host.h | 2 +- include/linux/mmc/mmc.h | 3 - include/linux/mmzone.h | 166 +- include/linux/mod_devicetable.h | 48 - include/linux/module.h | 84 +- include/linux/moduleparam.h | 7 + include/linux/mount.h | 13 - include/linux/msdos_fs.h | 12 +- include/linux/msg.h | 2 +- include/linux/mtd/bbm.h | 35 +- include/linux/mtd/blktrans.h | 4 +- include/linux/mtd/cfi.h | 14 +- include/linux/mtd/doc2000.h | 4 +- include/linux/mtd/inftl.h | 7 +- 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 | 29 +- include/linux/mtd/xip.h | 1 + include/linux/mutex-debug.h | 18 +- include/linux/mutex.h | 37 +- include/linux/mv643xx.h | 29 +- include/linux/namei.h | 5 +- include/linux/nbd.h | 15 +- include/linux/ncp_fs.h | 9 +- include/linux/ncp_fs_i.h | 2 +- include/linux/ncp_fs_sb.h | 5 +- include/linux/net.h | 17 +- include/linux/netdevice.h | 214 +- include/linux/netfilter.h | 52 +- include/linux/netfilter/nf_conntrack_common.h | 4 - include/linux/netfilter/nfnetlink.h | 1 - include/linux/netfilter/nfnetlink_conntrack.h | 4 +- include/linux/netfilter/nfnetlink_log.h | 6 - include/linux/netfilter/x_tables.h | 180 +- include/linux/netfilter/xt_conntrack.h | 2 +- include/linux/netfilter_arp.h | 1 + include/linux/netfilter_arp/arp_tables.h | 37 +- include/linux/netfilter_bridge.h | 34 +- include/linux/netfilter_ipv4.h | 5 +- include/linux/netfilter_ipv4/ip_conntrack.h | 26 +- include/linux/netfilter_ipv4/ip_nat.h | 2 +- include/linux/netfilter_ipv4/ip_tables.h | 88 +- include/linux/netfilter_ipv4/ipt_esp.h | 14 +- include/linux/netfilter_ipv4/ipt_multiport.h | 31 +- include/linux/netfilter_ipv4/ipt_policy.h | 69 +- include/linux/netfilter_ipv4/listhelp.h | 1 + include/linux/netfilter_ipv6.h | 3 - include/linux/netfilter_ipv6/ip6_tables.h | 69 +- include/linux/netfilter_ipv6/ip6t_esp.h | 12 +- include/linux/netfilter_ipv6/ip6t_multiport.h | 25 +- include/linux/netfilter_ipv6/ip6t_policy.h | 69 +- include/linux/netlink.h | 4 +- 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 | 201 +- include/linux/nfs_fs_i.h | 8 +- include/linux/nfs_fs_sb.h | 97 +- include/linux/nfs_idmap.h | 14 +- include/linux/nfs_mount.h | 1 - include/linux/nfs_page.h | 5 +- include/linux/nfs_xdr.h | 80 +- include/linux/nfsd/export.h | 29 +- include/linux/nfsd/nfsd.h | 1 + include/linux/nfsd/nfsfh.h | 22 +- include/linux/nfsd/stats.h | 6 - include/linux/nfsd/syscall.h | 15 +- include/linux/node.h | 25 - include/linux/nodemask.h | 4 - include/linux/notifier.h | 96 +- include/linux/numa.h | 9 +- include/linux/oprofile.h | 25 +- include/linux/page-flags.h | 202 +- include/linux/pagemap.h | 80 +- include/linux/parport.h | 6 +- include/linux/pci-acpi.h | 2 +- include/linux/pci.h | 68 +- include/linux/pci_ids.h | 70 +- include/linux/pci_regs.h | 17 - include/linux/percpu_counter.h | 39 +- include/linux/phy.h | 1 - include/linux/pid.h | 98 +- include/linux/pipe_fs_i.h | 77 +- include/linux/pm.h | 12 +- include/linux/pm_legacy.h | 15 + include/linux/pmu.h | 4 +- include/linux/pnp.h | 7 +- include/linux/poll.h | 17 - include/linux/ppdev.h | 2 + include/linux/ppp_defs.h | 14 +- include/linux/prctl.h | 7 - include/linux/preempt.h | 1 + include/linux/proc_fs.h | 32 +- include/linux/profile.h | 3 +- include/linux/ptrace.h | 6 +- include/linux/qnx4_fs.h | 4 +- include/linux/quota.h | 10 +- include/linux/quotaops.h | 1 + include/linux/radix-tree.h | 14 +- include/linux/raid/bitmap.h | 11 +- include/linux/raid/linear.h | 2 - include/linux/raid/md.h | 7 +- include/linux/raid/md_k.h | 34 +- include/linux/raid/md_p.h | 35 +- include/linux/raid/raid10.h | 7 +- include/linux/raid/raid5.h | 26 +- include/linux/ramfs.h | 6 +- include/linux/rbtree.h | 30 +- include/linux/rcupdate.h | 31 +- include/linux/reboot.h | 4 +- include/linux/reiserfs_fs.h | 11 +- include/linux/reiserfs_xattr.h | 9 +- include/linux/relayfs_fs.h | 791 +- include/linux/resource.h | 9 +- include/linux/rio.h | 1 + include/linux/rio_drv.h | 1 + include/linux/rmap.h | 12 +- include/linux/root_dev.h | 5 - include/linux/rtc.h | 108 +- include/linux/rtnetlink.h | 28 +- include/linux/rwsem-spinlock.h | 27 +- include/linux/rwsem.h | 97 +- include/linux/scc.h | 1 + include/linux/sched.h | 413 +- include/linux/screen_info.h | 3 +- include/linux/scx200.h | 9 +- include/linux/scx200_gpio.h | 21 +- include/linux/sdladrv.h | 4 - include/linux/seccomp.h | 1 + include/linux/security.h | 241 +- include/linux/sem.h | 2 +- include/linux/seq_file.h | 4 +- include/linux/seqlock.h | 17 +- include/linux/serialP.h | 1 + include/linux/serial_8250.h | 1 - include/linux/serial_core.h | 21 +- include/linux/serio.h | 16 +- include/linux/signal.h | 30 +- include/linux/skbuff.h | 242 +- include/linux/slab.h | 95 +- include/linux/smb.h | 1 + include/linux/smb_fs.h | 4 +- include/linux/smp.h | 32 +- include/linux/smp_lock.h | 1 + include/linux/socket.h | 7 +- include/linux/sound.h | 12 +- include/linux/spi/ads7846.h | 7 - include/linux/spi/spi.h | 51 +- include/linux/spi/spi_bitbang.h | 8 - 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/stat.h | 4 +- include/linux/statfs.h | 10 +- include/linux/stddef.h | 2 - include/linux/stop_machine.h | 1 + include/linux/string.h | 18 +- include/linux/sunrpc/auth.h | 1 + include/linux/sunrpc/cache.h | 145 +- include/linux/sunrpc/clnt.h | 20 +- include/linux/sunrpc/debug.h | 24 +- include/linux/sunrpc/gss_api.h | 2 +- include/linux/sunrpc/gss_krb5.h | 2 - include/linux/sunrpc/rpc_pipe_fs.h | 6 +- include/linux/sunrpc/sched.h | 9 +- include/linux/sunrpc/stats.h | 5 +- include/linux/sunrpc/svc.h | 13 +- include/linux/sunrpc/svcauth.h | 12 +- include/linux/sunrpc/svcsock.h | 2 +- include/linux/sunrpc/xdr.h | 1 - include/linux/sunrpc/xprt.h | 18 +- include/linux/suspend.h | 9 + include/linux/swap.h | 129 +- include/linux/swapops.h | 53 - include/linux/synclink.h | 14 +- include/linux/syscalls.h | 34 +- include/linux/sysctl.h | 94 +- include/linux/sysdev.h | 18 +- include/linux/sysfs.h | 6 - include/linux/sysrq.h | 1 + include/linux/tcp.h | 15 +- include/linux/threads.h | 4 +- include/linux/time.h | 59 +- include/linux/timer.h | 18 +- include/linux/timex.h | 49 +- include/linux/tiocl.h | 1 - include/linux/topology.h | 12 +- include/linux/tty.h | 71 +- include/linux/tty_driver.h | 14 +- include/linux/tty_flip.h | 39 +- include/linux/types.h | 12 +- include/linux/udf_fs_i.h | 21 + include/linux/udf_fs_sb.h | 4 +- include/linux/udp.h | 3 +- include/linux/ufs_fs.h | 113 +- include/linux/ufs_fs_i.h | 1 - include/linux/uinput.h | 4 +- include/linux/unistd.h | 2 - include/linux/usb.h | 22 +- include/linux/usb_ch9.h | 7 - include/linux/usb_gadget.h | 11 +- include/linux/usb_usual.h | 5 +- include/linux/usbdevice_fs.h | 2 - include/linux/vermagic.h | 9 +- include/linux/videodev.h | 55 +- include/linux/videodev2.h | 391 +- include/linux/vmalloc.h | 9 - include/linux/vs_base.h | 1 - include/linux/vs_context.h | 43 - include/linux/vs_cvirt.h | 49 - include/linux/vs_dlimit.h | 4 +- include/linux/vs_network.h | 3 +- include/linux/vserver/cacct.h | 4 +- include/linux/vserver/context.h | 7 +- include/linux/vserver/dlimit_cmd.h | 2 - include/linux/vserver/inode_cmd.h | 2 - include/linux/vserver/network.h | 2 - include/linux/vserver/xid.h | 2 + include/linux/vt.h | 11 - include/linux/vt_buffer.h | 1 + include/linux/vt_kern.h | 5 +- include/linux/wait.h | 15 +- include/linux/wanpipe.h | 9 - include/linux/wanrouter.h | 4 +- include/linux/watchdog.h | 10 +- include/linux/wireless.h | 10 +- include/linux/workqueue.h | 8 - include/linux/writeback.h | 20 +- include/linux/x25.h | 26 - include/linux/xfrm.h | 34 - include/linux/zconf.h | 12 - include/linux/zlib.h | 209 +- include/linux/zorro.h | 75 + include/linux/zutil.h | 12 + include/media/audiochip.h | 14 + include/media/ir-common.h | 41 +- include/media/ir-kbd-i2c.h | 3 +- include/media/ovcamchip.h | 1 - include/media/saa7146.h | 21 +- include/media/saa7146_vv.h | 5 +- include/media/tuner-types.h | 58 +- include/media/tuner.h | 19 +- include/media/v4l2-common.h | 97 +- include/media/video-buf-dvb.h | 5 +- include/media/video-buf.h | 59 +- include/mtd/mtd-abi.h | 95 +- include/mtd/mtd-user.h | 1 - include/net/addrconf.h | 1 + include/net/af_unix.h | 11 +- include/net/arp.h | 2 + include/net/ax25.h | 35 +- include/net/bluetooth/bluetooth.h | 2 +- include/net/bluetooth/hci.h | 73 +- include/net/bluetooth/hci_core.h | 59 +- include/net/compat.h | 6 +- include/net/dn.h | 105 +- include/net/dn_dev.h | 88 +- include/net/dn_fib.h | 22 +- include/net/dn_neigh.h | 4 +- include/net/dn_nsp.h | 72 +- include/net/dn_route.h | 12 +- include/net/dst.h | 1 + include/net/flow.h | 8 +- include/net/genetlink.h | 20 - include/net/icmp.h | 1 + include/net/ieee80211.h | 197 +- include/net/ieee80211_crypt.h | 3 +- include/net/if_inet6.h | 3 + include/net/inet6_hashtables.h | 71 +- include/net/inet_connection_sock.h | 26 - include/net/inet_hashtables.h | 1 + include/net/inet_sock.h | 1 + include/net/inet_timewait_sock.h | 3 +- include/net/ip.h | 6 +- include/net/ip6_route.h | 38 +- include/net/ip_fib.h | 1 + include/net/ip_mp_alg.h | 1 + include/net/ip_vs.h | 1 + include/net/ipv6.h | 28 +- include/net/ipx.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 | 3 +- include/net/irda/irlmp_frame.h | 1 + include/net/irda/qos.h | 1 + include/net/iw_handler.h | 12 +- include/net/llc.h | 2 +- include/net/llc_if.h | 17 +- include/net/ndisc.h | 3 +- include/net/neighbour.h | 3 +- include/net/netfilter/nf_conntrack.h | 81 +- include/net/netfilter/nf_conntrack_compat.h | 26 - include/net/netrom.h | 8 +- include/net/pkt_act.h | 1 + include/net/pkt_sched.h | 11 +- include/net/protocol.h | 11 +- include/net/raw.h | 3 +- include/net/red.h | 3 +- include/net/request_sock.h | 2 +- include/net/rose.h | 14 +- include/net/route.h | 5 +- include/net/sch_generic.h | 1 + include/net/scm.h | 48 +- include/net/sctp/command.h | 1 - include/net/sctp/sctp.h | 1 + include/net/sctp/structs.h | 21 +- include/net/sctp/user.h | 9 - include/net/sock.h | 193 +- include/net/tc_act/tc_ipt.h | 4 +- include/net/tcp.h | 50 +- include/net/tcp_ecn.h | 4 +- include/net/tipc/tipc_bearer.h | 12 +- include/net/x25.h | 21 +- include/net/x25device.h | 1 - include/net/xfrm.h | 131 +- include/pcmcia/bulkmem.h | 4 +- include/pcmcia/ciscode.h | 5 +- include/pcmcia/cistpl.h | 21 +- include/pcmcia/cs.h | 34 +- include/pcmcia/ds.h | 80 +- include/pcmcia/ss.h | 12 +- include/rdma/ib_cache.h | 13 - include/rdma/ib_cm.h | 26 +- include/rdma/ib_fmr_pool.h | 4 +- include/rdma/ib_mad.h | 82 +- include/rdma/ib_sa.h | 35 +- include/rdma/ib_smi.h | 36 - include/rdma/ib_user_cm.h | 86 +- include/rdma/ib_user_verbs.h | 157 +- include/rdma/ib_verbs.h | 88 +- include/scsi/iscsi_if.h | 151 +- include/scsi/iscsi_proto.h | 2 + include/scsi/scsi.h | 2 + include/scsi/scsi_cmnd.h | 42 +- include/scsi/scsi_dbg.h | 2 + include/scsi/scsi_device.h | 26 +- include/scsi/scsi_devinfo.h | 2 - include/scsi/scsi_eh.h | 6 +- include/scsi/scsi_host.h | 24 +- include/scsi/scsi_ioctl.h | 2 + include/scsi/scsi_transport.h | 16 - include/scsi/scsi_transport_fc.h | 42 +- include/scsi/scsi_transport_iscsi.h | 123 +- include/scsi/scsi_transport_sas.h | 88 +- include/scsi/scsi_transport_spi.h | 5 +- include/scsi/srp.h | 28 +- include/sound/ac97_codec.h | 17 +- include/sound/ad1848.h | 2 +- include/sound/ak4531_codec.h | 2 +- include/sound/ak4xxx-adda.h | 35 +- include/sound/asequencer.h | 4 - include/sound/asound.h | 2 +- include/sound/core.h | 23 +- include/sound/cs4231.h | 4 +- include/sound/cs46xx.h | 3 +- include/sound/driver.h | 1 + include/sound/emu10k1.h | 6 +- include/sound/emux_synth.h | 2 +- include/sound/gus.h | 6 +- include/sound/hdsp.h | 12 +- include/sound/hwdep.h | 2 +- include/sound/i2c.h | 10 +- include/sound/info.h | 13 +- include/sound/initval.h | 3 +- include/sound/mixer_oss.h | 2 +- include/sound/mpu401.h | 14 +- include/sound/opl3.h | 4 +- include/sound/pcm.h | 45 +- include/sound/pcm_oss.h | 9 +- include/sound/pcm_params.h | 125 +- include/sound/rawmidi.h | 7 +- include/sound/sb16_csp.h | 2 +- include/sound/seq_instr.h | 2 +- include/sound/soundfont.h | 2 +- include/sound/tea575x-tuner.h | 3 +- include/sound/util_mem.h | 4 +- include/sound/version.h | 4 +- include/sound/vx_core.h | 2 +- include/sound/ymfpci.h | 10 +- include/video/edid.h | 1 + include/video/pm3fb.h | 3 + include/video/vga.h | 1 + init/Kconfig | 181 +- init/Makefile | 1 + init/calibrate.c | 2 +- init/do_mounts.c | 20 +- init/do_mounts.h | 17 +- init/do_mounts_initrd.c | 7 +- init/do_mounts_md.c | 7 +- init/do_mounts_rd.c | 4 +- init/initramfs.c | 56 +- init/main.c | 166 +- init/version.c | 1 - ipc/compat.c | 3 +- ipc/mqueue.c | 38 +- ipc/msg.c | 422 +- ipc/sem.c | 57 +- ipc/shm.c | 67 +- ipc/util.c | 44 +- ipc/util.h | 4 +- kernel/Kconfig.preempt | 1 - kernel/Makefile | 25 +- kernel/acct.c | 134 +- kernel/audit.c | 508 +- kernel/auditsc.c | 1539 +- kernel/capability.c | 28 +- kernel/compat.c | 112 +- kernel/configs.c | 1 + kernel/cpu.c | 249 +- kernel/cpuset.c | 558 +- kernel/exec_domain.c | 1 + kernel/exit.c | 246 +- kernel/extable.c | 2 +- kernel/fork.c | 275 +- kernel/futex.c | 1240 +- kernel/hrtimer.c | 226 +- kernel/irq/Makefile | 4 +- kernel/irq/autoprobe.c | 56 +- kernel/irq/handle.c | 166 +- kernel/irq/internals.h | 46 - kernel/irq/manage.c | 220 +- kernel/irq/proc.c | 33 +- kernel/irq/spurious.c | 49 +- kernel/itimer.c | 117 +- kernel/kallsyms.c | 4 +- kernel/kexec.c | 12 +- kernel/kmod.c | 35 +- kernel/kprobes.c | 86 +- kernel/ksysfs.c | 27 +- kernel/kthread.c | 72 +- kernel/module.c | 652 +- kernel/mutex-debug.c | 404 +- kernel/mutex-debug.h | 111 +- kernel/mutex.c | 95 +- kernel/mutex.h | 25 +- kernel/panic.c | 107 +- kernel/params.c | 25 +- kernel/pid.c | 269 +- kernel/posix-cpu-timers.c | 4 + kernel/posix-timers.c | 87 +- kernel/power/Kconfig | 26 +- kernel/power/Makefile | 4 +- kernel/power/disk.c | 29 +- kernel/power/main.c | 22 +- kernel/power/pm.c | 70 +- kernel/power/power.h | 124 +- kernel/power/process.c | 87 +- kernel/power/smp.c | 4 +- kernel/power/snapshot.c | 525 +- kernel/power/swsusp.c | 907 +- kernel/printk.c | 229 +- kernel/profile.c | 65 +- kernel/ptrace.c | 47 +- kernel/rcupdate.c | 75 +- kernel/rcutorture.c | 232 +- kernel/resource.c | 96 +- kernel/sched.c | 2258 +- kernel/signal.c | 468 +- kernel/softirq.c | 187 +- kernel/softlockup.c | 63 +- kernel/spinlock.c | 89 +- kernel/sys.c | 536 +- kernel/sys_ni.c | 18 - kernel/sysctl.c | 165 +- kernel/time.c | 75 +- kernel/timer.c | 663 +- kernel/user.c | 14 +- kernel/vserver/Kconfig | 18 +- kernel/vserver/context.c | 2 +- kernel/vserver/cvirt_init.h | 3 + kernel/vserver/helper.c | 6 +- kernel/vserver/limit_init.h | 3 + kernel/vserver/sched_init.h | 5 +- kernel/wait.c | 9 +- kernel/workqueue.c | 213 +- lib/Kconfig | 11 - lib/Kconfig.debug | 223 +- lib/Makefile | 13 +- lib/bitmap.c | 211 +- lib/bust_spinlocks.c | 1 + lib/crc-ccitt.c | 6 +- lib/crc16.c | 10 +- lib/crc32.c | 54 +- lib/extable.c | 2 + lib/find_next_bit.c | 177 +- lib/genalloc.c | 263 +- lib/idr.c | 43 - lib/iomap_copy.c | 28 - lib/kernel_lock.c | 11 +- lib/kobject.c | 66 +- lib/kobject_uevent.c | 10 +- lib/kref.c | 7 +- lib/libcrc32c.c | 2 +- lib/radix-tree.c | 238 +- lib/rbtree.c | 189 +- lib/reed_solomon/reed_solomon.c | 22 +- lib/rwsem-spinlock.c | 66 +- lib/rwsem.c | 51 +- lib/semaphore-sleepers.c | 1 + lib/spinlock_debug.c | 129 +- lib/string.c | 34 +- lib/swiotlb.c | 32 +- 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/inffast.c | 462 +- lib/zlib_inflate/inffast.h | 12 +- lib/zlib_inflate/inflate.c | 1089 +- lib/zlib_inflate/inflate_syms.c | 3 +- lib/zlib_inflate/inftrees.c | 677 +- lib/zlib_inflate/inftrees.h | 99 +- lib/zlib_inflate/infutil.h | 176 +- mm/Kconfig | 20 +- mm/Makefile | 4 +- mm/bootmem.c | 54 +- mm/fadvise.c | 17 +- mm/filemap.c | 460 +- mm/filemap.h | 37 +- mm/filemap_xip.c | 4 +- mm/fremap.c | 35 +- mm/highmem.c | 58 +- mm/hugetlb.c | 336 +- mm/internal.h | 34 +- mm/memory.c | 326 +- mm/memory_hotplug.c | 196 +- mm/mempolicy.c | 208 +- mm/mempool.c | 59 +- mm/mincore.c | 183 +- mm/mmap.c | 265 +- mm/mprotect.c | 83 +- mm/mremap.c | 6 +- mm/msync.c | 202 +- mm/nommu.c | 26 +- mm/oom_kill.c | 219 +- mm/page-writeback.c | 194 +- mm/page_alloc.c | 888 +- mm/page_io.c | 31 +- mm/pdflush.c | 3 +- mm/readahead.c | 78 +- mm/rmap.c | 209 +- mm/shmem.c | 52 +- mm/slab.c | 1704 +- mm/slob.c | 21 +- mm/sparse.c | 41 +- mm/swap.c | 133 +- mm/swap_state.c | 12 +- mm/swapfile.c | 118 +- mm/tiny-shmem.c | 4 + mm/truncate.c | 69 +- mm/util.c | 47 +- mm/vmalloc.c | 134 +- mm/vmscan.c | 1264 +- net/802/fc.c | 1 + net/802/fddi.c | 1 + net/802/psnap.c | 4 +- net/802/sysctl_net_802.c | 1 + net/802/tr.c | 2 + net/8021q/vlan.c | 61 +- net/8021q/vlan_dev.c | 6 +- net/8021q/vlanproc.c | 1 + net/Kconfig | 28 +- net/Makefile | 1 - net/appletalk/aarp.c | 1 + net/appletalk/atalk_proc.c | 1 + net/appletalk/ddp.c | 26 +- net/appletalk/sysctl_net_atalk.c | 1 + net/atm/Makefile | 2 +- net/atm/br2684.c | 4 +- net/atm/clip.c | 442 +- net/atm/common.c | 12 +- net/atm/common.h | 2 - net/atm/ioctl.c | 16 +- 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 | 54 +- net/atm/resources.h | 6 +- net/ax25/af_ax25.c | 111 +- net/ax25/ax25_addr.c | 9 - net/ax25/ax25_dev.c | 5 +- net/ax25/ax25_ds_subr.c | 8 +- net/ax25/ax25_ds_timer.c | 7 +- net/ax25/ax25_iface.c | 32 +- net/ax25/ax25_in.c | 2 +- net/ax25/ax25_ip.c | 27 +- net/ax25/ax25_out.c | 4 +- net/ax25/ax25_route.c | 51 +- net/ax25/ax25_timer.c | 4 +- net/ax25/ax25_uid.c | 4 - net/ax25/sysctl_net_ax25.c | 15 +- net/bluetooth/af_bluetooth.c | 24 +- net/bluetooth/bnep/core.c | 5 +- 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 | 54 +- net/bluetooth/hci_event.c | 207 +- net/bluetooth/hci_sock.c | 12 +- net/bluetooth/hci_sysfs.c | 212 +- net/bluetooth/hidp/Kconfig | 3 +- net/bluetooth/hidp/core.c | 4 +- net/bluetooth/hidp/sock.c | 1 + net/bluetooth/l2cap.c | 376 +- net/bluetooth/lib.c | 1 + net/bluetooth/rfcomm/core.c | 64 +- net/bluetooth/rfcomm/sock.c | 5 +- net/bluetooth/rfcomm/tty.c | 18 +- net/bluetooth/sco.c | 19 +- net/bridge/Kconfig | 1 - net/bridge/Makefile | 2 +- net/bridge/br.c | 40 +- net/bridge/br_device.c | 11 +- net/bridge/br_fdb.c | 6 +- net/bridge/br_forward.c | 20 +- net/bridge/br_if.c | 65 +- net/bridge/br_input.c | 47 +- net/bridge/br_ioctl.c | 7 +- net/bridge/br_netfilter.c | 246 +- net/bridge/br_notify.c | 2 - net/bridge/br_private.h | 18 +- net/bridge/br_stp_bpdu.c | 199 +- net/bridge/br_stp_if.c | 4 - net/bridge/br_stp_timer.c | 47 +- net/bridge/br_sysfs_br.c | 49 - net/bridge/netfilter/ebt_802_3.c | 8 +- net/bridge/netfilter/ebt_among.c | 8 +- net/bridge/netfilter/ebt_arp.c | 8 +- net/bridge/netfilter/ebt_arpreply.c | 8 +- net/bridge/netfilter/ebt_dnat.c | 8 +- net/bridge/netfilter/ebt_ip.c | 8 +- net/bridge/netfilter/ebt_limit.c | 8 +- net/bridge/netfilter/ebt_log.c | 10 +- net/bridge/netfilter/ebt_mark.c | 8 +- net/bridge/netfilter/ebt_mark_m.c | 8 +- net/bridge/netfilter/ebt_pkttype.c | 8 +- net/bridge/netfilter/ebt_redirect.c | 8 +- net/bridge/netfilter/ebt_snat.c | 8 +- net/bridge/netfilter/ebt_stp.c | 8 +- net/bridge/netfilter/ebt_ulog.c | 9 +- net/bridge/netfilter/ebt_vlan.c | 8 +- net/bridge/netfilter/ebtable_broute.c | 8 +- net/bridge/netfilter/ebtable_filter.c | 8 +- net/bridge/netfilter/ebtable_nat.c | 8 +- net/bridge/netfilter/ebtables.c | 150 +- net/compat.c | 117 +- net/core/Makefile | 5 +- net/core/datagram.c | 2 - net/core/dev.c | 692 +- net/core/dev_mcast.c | 29 +- net/core/dv.c | 5 +- net/core/ethtool.c | 35 +- net/core/filter.c | 5 +- net/core/flow.c | 15 +- net/core/gen_estimator.c | 3 +- net/core/link_watch.c | 60 +- net/core/neighbour.c | 67 +- net/core/net-sysfs.c | 91 +- net/core/netpoll.c | 65 +- net/core/pktgen.c | 2996 +- net/core/request_sock.c | 6 +- net/core/rtnetlink.c | 179 +- net/core/skbuff.c | 296 +- net/core/sock.c | 256 +- net/core/stream.c | 17 +- net/core/sysctl_net_core.c | 24 +- net/core/utils.c | 11 +- net/core/wireless.c | 942 +- net/dccp/Kconfig | 13 +- net/dccp/Makefile | 9 +- net/dccp/ackvec.c | 297 +- net/dccp/ackvec.h | 54 +- net/dccp/ccid.c | 189 +- net/dccp/ccid.h | 129 +- net/dccp/ccids/Kconfig | 43 +- net/dccp/ccids/Makefile | 4 - net/dccp/ccids/ccid3.c | 266 +- net/dccp/ccids/ccid3.h | 15 +- 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 | 144 +- net/dccp/diag.c | 3 +- net/dccp/input.c | 29 +- net/dccp/ipv4.c | 337 +- net/dccp/ipv6.c | 380 +- net/dccp/ipv6.h | 1 + net/dccp/minisocks.c | 38 +- net/dccp/options.c | 296 +- net/dccp/output.c | 89 +- net/dccp/proto.c | 460 +- net/dccp/timer.c | 15 +- net/decnet/af_decnet.c | 23 +- net/decnet/dn_dev.c | 56 +- net/decnet/dn_fib.c | 12 +- net/decnet/dn_neigh.c | 33 +- net/decnet/dn_nsp_in.c | 32 +- net/decnet/dn_nsp_out.c | 38 +- net/decnet/dn_route.c | 73 +- net/decnet/dn_rules.c | 122 +- net/decnet/dn_table.c | 24 +- net/decnet/netfilter/dn_rtmsg.c | 10 +- net/decnet/sysctl_net_decnet.c | 13 +- net/econet/af_econet.c | 128 +- net/ethernet/Makefile | 1 + net/ethernet/eth.c | 1 + net/ethernet/sysctl_net_ether.c | 1 + net/ieee80211/Kconfig | 1 - net/ieee80211/Makefile | 1 - net/ieee80211/ieee80211_crypt.c | 14 +- net/ieee80211/ieee80211_crypt_ccmp.c | 12 +- net/ieee80211/ieee80211_crypt_tkip.c | 68 +- net/ieee80211/ieee80211_crypt_wep.c | 9 +- net/ieee80211/ieee80211_geo.c | 49 +- net/ieee80211/ieee80211_module.c | 21 +- net/ieee80211/ieee80211_rx.c | 252 +- net/ieee80211/ieee80211_tx.c | 126 +- net/ieee80211/ieee80211_wx.c | 207 +- net/ipv4/Kconfig | 51 +- net/ipv4/Makefile | 8 +- net/ipv4/af_inet.c | 218 +- net/ipv4/ah4.c | 23 +- net/ipv4/arp.c | 28 +- net/ipv4/datagram.c | 1 + net/ipv4/devinet.c | 37 +- net/ipv4/esp4.c | 29 +- net/ipv4/fib_frontend.c | 3 +- net/ipv4/fib_hash.c | 7 +- net/ipv4/fib_rules.c | 146 +- net/ipv4/fib_semantics.c | 16 +- net/ipv4/fib_trie.c | 35 +- net/ipv4/icmp.c | 10 +- net/ipv4/igmp.c | 79 +- net/ipv4/inet_connection_sock.c | 50 +- net/ipv4/inet_diag.c | 4 +- net/ipv4/inet_hashtables.c | 7 +- net/ipv4/inet_timewait_sock.c | 1 + net/ipv4/inetpeer.c | 2 +- net/ipv4/ip_forward.c | 2 +- net/ipv4/ip_fragment.c | 1 + net/ipv4/ip_gre.c | 4 +- net/ipv4/ip_input.c | 6 +- net/ipv4/ip_options.c | 3 +- net/ipv4/ip_output.c | 34 +- net/ipv4/ip_sockglue.c | 176 +- net/ipv4/ipcomp.c | 76 +- net/ipv4/ipconfig.c | 13 +- net/ipv4/ipip.c | 85 +- net/ipv4/ipmr.c | 26 +- net/ipv4/ipvs/ip_vs_app.c | 19 +- net/ipv4/ipvs/ip_vs_core.c | 10 - net/ipv4/ipvs/ip_vs_ctl.c | 21 +- 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 | 1 + net/ipv4/multipath_random.c | 1 + net/ipv4/multipath_rr.c | 1 + net/ipv4/multipath_wrandom.c | 1 + net/ipv4/netfilter.c | 67 +- net/ipv4/netfilter/Kconfig | 200 +- net/ipv4/netfilter/Makefile | 23 +- net/ipv4/netfilter/arp_tables.c | 105 +- net/ipv4/netfilter/arpt_mangle.c | 31 +- net/ipv4/netfilter/arptable_filter.c | 27 +- net/ipv4/netfilter/ip_conntrack_amanda.c | 151 +- net/ipv4/netfilter/ip_conntrack_core.c | 22 +- net/ipv4/netfilter/ip_conntrack_ftp.c | 88 +- net/ipv4/netfilter/ip_conntrack_helper_pptp.c | 13 +- net/ipv4/netfilter/ip_conntrack_irc.c | 13 +- net/ipv4/netfilter/ip_conntrack_netbios_ns.c | 8 +- net/ipv4/netfilter/ip_conntrack_netlink.c | 163 +- net/ipv4/netfilter/ip_conntrack_proto_gre.c | 7 +- net/ipv4/netfilter/ip_conntrack_proto_icmp.c | 23 +- net/ipv4/netfilter/ip_conntrack_proto_sctp.c | 8 +- net/ipv4/netfilter/ip_conntrack_proto_tcp.c | 8 +- net/ipv4/netfilter/ip_conntrack_proto_udp.c | 7 +- net/ipv4/netfilter/ip_conntrack_standalone.c | 291 +- net/ipv4/netfilter/ip_conntrack_tftp.c | 10 +- net/ipv4/netfilter/ip_nat_amanda.c | 8 +- net/ipv4/netfilter/ip_nat_ftp.c | 8 +- net/ipv4/netfilter/ip_nat_helper.c | 1 + net/ipv4/netfilter/ip_nat_helper_pptp.c | 17 +- net/ipv4/netfilter/ip_nat_irc.c | 8 +- net/ipv4/netfilter/ip_nat_proto_gre.c | 13 +- net/ipv4/netfilter/ip_nat_proto_tcp.c | 7 +- net/ipv4/netfilter/ip_nat_proto_udp.c | 7 +- net/ipv4/netfilter/ip_nat_rule.c | 45 +- net/ipv4/netfilter/ip_nat_snmp_basic.c | 21 +- net/ipv4/netfilter/ip_nat_standalone.c | 182 +- net/ipv4/netfilter/ip_nat_tftp.c | 8 +- net/ipv4/netfilter/ip_queue.c | 60 +- net/ipv4/netfilter/ip_tables.c | 1322 +- net/ipv4/netfilter/ipt_CLUSTERIP.c | 97 +- net/ipv4/netfilter/ipt_DSCP.c | 25 +- net/ipv4/netfilter/ipt_ECN.c | 26 +- net/ipv4/netfilter/ipt_LOG.c | 21 +- net/ipv4/netfilter/ipt_MASQUERADE.c | 27 +- net/ipv4/netfilter/ipt_NETMAP.c | 28 +- net/ipv4/netfilter/ipt_REDIRECT.c | 25 +- net/ipv4/netfilter/ipt_REJECT.c | 47 +- net/ipv4/netfilter/ipt_SAME.c | 27 +- net/ipv4/netfilter/ipt_TCPMSS.c | 24 +- net/ipv4/netfilter/ipt_TOS.c | 25 +- net/ipv4/netfilter/ipt_TTL.c | 33 +- net/ipv4/netfilter/ipt_ULOG.c | 21 +- net/ipv4/netfilter/ipt_addrtype.c | 28 +- net/ipv4/netfilter/ipt_ah.c | 33 +- net/ipv4/netfilter/ipt_dscp.c | 27 +- net/ipv4/netfilter/ipt_ecn.c | 22 +- net/ipv4/netfilter/ipt_esp.c | 6 +- net/ipv4/netfilter/ipt_hashlimit.c | 125 +- net/ipv4/netfilter/ipt_iprange.c | 36 +- net/ipv4/netfilter/ipt_multiport.c | 10 +- net/ipv4/netfilter/ipt_owner.c | 29 +- net/ipv4/netfilter/ipt_recent.c | 1284 +- net/ipv4/netfilter/ipt_tos.c | 26 +- net/ipv4/netfilter/ipt_ttl.c | 27 +- net/ipv4/netfilter/iptable_filter.c | 29 +- net/ipv4/netfilter/iptable_mangle.c | 45 +- net/ipv4/netfilter/iptable_raw.c | 43 +- .../netfilter/nf_conntrack_l3proto_ipv4.c | 251 +- net/ipv4/netfilter/nf_conntrack_proto_icmp.c | 20 +- net/ipv4/proc.c | 4 +- net/ipv4/protocol.c | 1 + net/ipv4/raw.c | 86 +- net/ipv4/route.c | 84 +- net/ipv4/sysctl_net_ipv4.c | 52 +- net/ipv4/tcp.c | 326 +- net/ipv4/tcp_bic.c | 8 + net/ipv4/tcp_cong.c | 11 +- net/ipv4/tcp_cubic.c | 13 +- net/ipv4/tcp_diag.c | 6 +- net/ipv4/tcp_highspeed.c | 43 +- net/ipv4/tcp_htcp.c | 76 +- net/ipv4/tcp_hybla.c | 1 + net/ipv4/tcp_input.c | 163 +- net/ipv4/tcp_ipv4.c | 96 +- net/ipv4/tcp_minisocks.c | 9 +- net/ipv4/tcp_output.c | 358 +- net/ipv4/tcp_scalable.c | 1 + net/ipv4/tcp_timer.c | 36 +- net/ipv4/tcp_vegas.c | 1 + net/ipv4/tcp_westwood.c | 81 +- net/ipv4/udp.c | 89 +- net/ipv4/xfrm4_input.c | 45 +- net/ipv4/xfrm4_output.c | 119 +- net/ipv4/xfrm4_policy.c | 9 +- net/ipv4/xfrm4_state.c | 1 + net/ipv4/xfrm4_tunnel.c | 82 +- net/ipv6/Kconfig | 57 +- net/ipv6/Makefile | 5 +- net/ipv6/addrconf.c | 568 +- net/ipv6/af_inet6.c | 125 +- net/ipv6/ah6.c | 18 +- net/ipv6/anycast.c | 8 +- net/ipv6/datagram.c | 2 +- net/ipv6/esp6.c | 28 +- net/ipv6/exthdrs.c | 8 +- net/ipv6/icmp.c | 21 +- net/ipv6/inet6_connection_sock.c | 7 +- net/ipv6/inet6_hashtables.c | 81 +- net/ipv6/ip6_fib.c | 2 + net/ipv6/ip6_flowlabel.c | 7 +- net/ipv6/ip6_input.c | 12 +- net/ipv6/ip6_output.c | 147 +- net/ipv6/ip6_tunnel.c | 61 +- net/ipv6/ipcomp6.c | 81 +- net/ipv6/ipv6_sockglue.c | 275 +- net/ipv6/ipv6_syms.c | 1 + net/ipv6/mcast.c | 34 +- net/ipv6/ndisc.c | 50 +- net/ipv6/netfilter.c | 52 +- net/ipv6/netfilter/Kconfig | 26 +- net/ipv6/netfilter/Makefile | 4 +- net/ipv6/netfilter/ip6_queue.c | 48 +- net/ipv6/netfilter/ip6_tables.c | 236 +- net/ipv6/netfilter/ip6t_HL.c | 27 +- net/ipv6/netfilter/ip6t_LOG.c | 21 +- net/ipv6/netfilter/ip6t_REJECT.c | 34 +- net/ipv6/netfilter/ip6t_ah.c | 27 +- net/ipv6/netfilter/ip6t_dst.c | 30 +- net/ipv6/netfilter/ip6t_esp.c | 76 +- net/ipv6/netfilter/ip6t_eui64.c | 37 +- net/ipv6/netfilter/ip6t_frag.c | 28 +- net/ipv6/netfilter/ip6t_hbh.c | 30 +- net/ipv6/netfilter/ip6t_hl.c | 30 +- net/ipv6/netfilter/ip6t_ipv6header.c | 8 +- net/ipv6/netfilter/ip6t_multiport.c | 3 +- net/ipv6/netfilter/ip6t_owner.c | 26 +- net/ipv6/netfilter/ip6t_rt.c | 27 +- net/ipv6/netfilter/ip6table_filter.c | 29 +- net/ipv6/netfilter/ip6table_mangle.c | 41 +- net/ipv6/netfilter/ip6table_raw.c | 23 +- .../netfilter/nf_conntrack_l3proto_ipv6.c | 224 +- .../netfilter/nf_conntrack_proto_icmpv6.c | 12 +- net/ipv6/netfilter/nf_conntrack_reasm.c | 19 +- net/ipv6/proc.c | 5 +- net/ipv6/raw.c | 148 +- net/ipv6/reassembly.c | 54 +- net/ipv6/route.c | 701 +- net/ipv6/sit.c | 4 +- net/ipv6/sysctl_net_ipv6.c | 1 + net/ipv6/tcp_ipv6.c | 124 +- net/ipv6/udp.c | 87 +- net/ipv6/xfrm6_input.c | 45 +- net/ipv6/xfrm6_output.c | 102 +- net/ipv6/xfrm6_policy.c | 7 + net/ipv6/xfrm6_state.c | 1 + net/ipv6/xfrm6_tunnel.c | 219 +- net/ipx/af_ipx.c | 58 +- net/ipx/ipx_proc.c | 1 + net/ipx/ipx_route.c | 9 +- net/ipx/sysctl_net_ipx.c | 1 + net/irda/af_irda.c | 34 +- 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 | 13 +- net/irda/iriap_event.c | 2 +- net/irda/irias_object.c | 27 +- 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 | 12 +- 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 | 25 +- net/irda/qos.c | 1 + net/irda/timer.c | 1 + net/key/af_key.c | 24 +- net/lapb/lapb_iface.c | 16 +- net/llc/af_llc.c | 42 +- net/llc/llc_c_ac.c | 1 + net/llc/llc_core.c | 4 +- net/llc/llc_if.c | 3 + net/llc/llc_input.c | 13 +- net/llc/llc_output.c | 3 +- net/llc/llc_proc.c | 1 + net/llc/llc_s_ac.c | 2 +- net/llc/llc_sap.c | 66 +- net/llc/llc_station.c | 1 + net/llc/sysctl_net_llc.c | 1 + net/netfilter/Kconfig | 94 +- net/netfilter/Makefile | 7 - net/netfilter/core.c | 52 +- net/netfilter/nf_conntrack_core.c | 203 +- net/netfilter/nf_conntrack_ftp.c | 90 +- net/netfilter/nf_conntrack_l3proto_generic.c | 2 + net/netfilter/nf_conntrack_netlink.c | 219 +- net/netfilter/nf_conntrack_proto_sctp.c | 10 +- net/netfilter/nf_conntrack_proto_tcp.c | 54 +- net/netfilter/nf_conntrack_proto_udp.c | 53 +- net/netfilter/nf_conntrack_standalone.c | 143 +- net/netfilter/nf_internals.h | 1 + net/netfilter/nf_log.c | 1 + net/netfilter/nf_queue.c | 59 +- net/netfilter/nf_sockopt.c | 95 +- net/netfilter/nfnetlink.c | 9 +- net/netfilter/nfnetlink_log.c | 77 +- net/netfilter/nfnetlink_queue.c | 64 +- net/netfilter/x_tables.c | 264 +- net/netfilter/xt_CLASSIFY.c | 62 +- net/netfilter/xt_CONNMARK.c | 47 +- net/netfilter/xt_MARK.c | 66 +- net/netfilter/xt_NFQUEUE.c | 51 +- net/netfilter/xt_NOTRACK.c | 65 +- net/netfilter/xt_comment.c | 38 +- net/netfilter/xt_connbytes.c | 35 +- net/netfilter/xt_connmark.c | 65 +- net/netfilter/xt_conntrack.c | 49 +- net/netfilter/xt_dccp.c | 68 +- net/netfilter/xt_helper.c | 63 +- net/netfilter/xt_length.c | 44 +- net/netfilter/xt_limit.c | 27 +- net/netfilter/xt_mac.c | 54 +- net/netfilter/xt_mark.c | 38 +- net/netfilter/xt_physdev.c | 50 +- net/netfilter/xt_pkttype.c | 53 +- net/netfilter/xt_realm.c | 40 +- net/netfilter/xt_sctp.c | 92 +- net/netfilter/xt_state.c | 52 +- net/netfilter/xt_string.c | 39 +- net/netfilter/xt_tcpmss.c | 72 +- net/netfilter/xt_tcpudp.c | 146 +- net/netlink/af_netlink.c | 100 +- net/netlink/attr.c | 1 + net/netlink/genetlink.c | 12 +- net/netrom/af_netrom.c | 48 +- net/netrom/nr_dev.c | 2 + net/netrom/nr_route.c | 12 +- net/netrom/nr_timer.c | 2 +- net/nonet.c | 2 +- net/packet/af_packet.c | 5 +- net/rose/af_rose.c | 33 +- net/rose/rose_dev.c | 7 +- net/rose/rose_link.c | 6 +- net/rose/rose_route.c | 7 + net/rxrpc/call.c | 3 +- net/rxrpc/connection.c | 9 +- net/rxrpc/krxsecd.c | 3 +- net/rxrpc/main.c | 2 +- net/rxrpc/peer.c | 3 +- net/rxrpc/rxrpc_syms.c | 1 + net/rxrpc/sysctl.c | 1 + net/rxrpc/transport.c | 6 +- net/sched/Kconfig | 9 +- net/sched/act_api.c | 10 +- net/sched/act_gact.c | 1 + net/sched/act_ipt.c | 16 +- net/sched/act_mirred.c | 1 + net/sched/act_pedit.c | 4 +- net/sched/act_police.c | 15 +- net/sched/act_simple.c | 1 + net/sched/cls_api.c | 1 + net/sched/cls_basic.c | 7 +- 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 | 24 +- net/sched/em_cmp.c | 1 + net/sched/em_meta.c | 4 +- net/sched/em_nbyte.c | 1 + net/sched/em_text.c | 1 + net/sched/em_u32.c | 1 + net/sched/ematch.c | 4 +- net/sched/estimator.c | 3 +- net/sched/sch_api.c | 3 +- net/sched/sch_atm.c | 2 +- net/sched/sch_blackhole.c | 1 + net/sched/sch_cbq.c | 4 +- net/sched/sch_dsmark.c | 2 +- net/sched/sch_fifo.c | 1 + net/sched/sch_generic.c | 76 +- net/sched/sch_gred.c | 4 +- net/sched/sch_hfsc.c | 10 +- net/sched/sch_htb.c | 8 +- net/sched/sch_ingress.c | 1 + net/sched/sch_netem.c | 11 +- net/sched/sch_prio.c | 3 +- net/sched/sch_red.c | 180 +- net/sched/sch_sfq.c | 6 +- net/sched/sch_tbf.c | 10 +- net/sched/sch_teql.c | 9 +- net/sctp/associola.c | 27 +- net/sctp/bind_addr.c | 8 +- net/sctp/endpointola.c | 11 +- net/sctp/input.c | 161 +- net/sctp/ipv6.c | 95 +- net/sctp/output.c | 48 +- net/sctp/outqueue.c | 9 +- net/sctp/proc.c | 2 +- net/sctp/protocol.c | 101 +- net/sctp/sm_make_chunk.c | 18 +- net/sctp/sm_sideeffect.c | 28 +- net/sctp/sm_statefuns.c | 83 +- net/sctp/socket.c | 110 +- net/sctp/transport.c | 9 +- net/socket.c | 452 +- net/sunrpc/auth.c | 16 +- net/sunrpc/auth_gss/auth_gss.c | 13 +- net/sunrpc/auth_gss/gss_krb5_crypto.c | 11 +- net/sunrpc/auth_gss/gss_krb5_mech.c | 5 +- net/sunrpc/auth_gss/gss_krb5_seal.c | 15 +- net/sunrpc/auth_gss/gss_krb5_unseal.c | 4 +- net/sunrpc/auth_gss/gss_krb5_wrap.c | 17 +- net/sunrpc/auth_gss/gss_mech_switch.c | 9 +- net/sunrpc/auth_gss/gss_spkm3_mech.c | 11 +- net/sunrpc/auth_gss/gss_spkm3_seal.c | 5 +- net/sunrpc/auth_gss/gss_spkm3_token.c | 3 +- net/sunrpc/auth_gss/gss_spkm3_unseal.c | 4 +- net/sunrpc/auth_gss/svcauth_gss.c | 451 +- net/sunrpc/auth_null.c | 2 - net/sunrpc/auth_unix.c | 1 - net/sunrpc/cache.c | 185 +- net/sunrpc/clnt.c | 120 +- net/sunrpc/pmap_clnt.c | 42 +- net/sunrpc/rpc_pipe.c | 111 +- net/sunrpc/sched.c | 45 +- net/sunrpc/stats.c | 115 +- net/sunrpc/sunrpc_syms.c | 7 +- net/sunrpc/svc.c | 9 +- net/sunrpc/svcauth.c | 122 +- net/sunrpc/svcauth_unix.c | 229 +- net/sunrpc/svcsock.c | 44 +- net/sunrpc/sysctl.c | 1 + net/sunrpc/xdr.c | 31 +- net/sunrpc/xprt.c | 55 +- net/sunrpc/xprtsock.c | 128 +- net/sysctl_net.c | 9 + net/tipc/bcast.c | 93 +- net/tipc/bcast.h | 2 +- net/tipc/bearer.c | 98 +- net/tipc/cluster.c | 48 +- net/tipc/cluster.h | 2 +- net/tipc/config.c | 91 +- net/tipc/core.c | 10 +- net/tipc/core.h | 26 +- net/tipc/dbg.c | 6 +- net/tipc/discover.c | 23 +- net/tipc/eth_media.c | 33 +- net/tipc/handler.c | 2 +- net/tipc/link.c | 322 +- net/tipc/name_distr.c | 37 +- net/tipc/name_table.c | 283 +- net/tipc/net.c | 14 +- net/tipc/node.c | 124 +- net/tipc/node.h | 4 +- net/tipc/node_subscr.c | 15 +- net/tipc/port.c | 107 +- net/tipc/ref.c | 45 +- net/tipc/ref.h | 4 +- net/tipc/socket.c | 128 +- net/tipc/subscr.c | 53 +- net/tipc/user_reg.c | 9 +- net/tipc/zone.c | 30 +- net/tipc/zone.h | 4 +- net/unix/af_unix.c | 70 +- net/unix/garbage.c | 7 +- net/wanrouter/af_wanpipe.c | 12 +- net/wanrouter/wanmain.c | 10 +- net/wanrouter/wanproc.c | 1 + net/x25/af_x25.c | 174 +- net/x25/x25_dev.c | 1 + net/x25/x25_facilities.c | 82 +- net/x25/x25_in.c | 3 +- net/x25/x25_proc.c | 1 + net/x25/x25_route.c | 1 + net/x25/x25_subr.c | 6 +- net/x25/x25_timer.c | 4 +- net/xfrm/xfrm_algo.c | 1 + net/xfrm/xfrm_input.c | 6 +- net/xfrm/xfrm_policy.c | 199 +- net/xfrm/xfrm_state.c | 149 +- net/xfrm/xfrm_user.c | 418 +- scripts/Kbuild.include | 80 +- scripts/Makefile.build | 41 +- scripts/Makefile.clean | 10 +- scripts/Makefile.host | 16 +- scripts/Makefile.lib | 11 +- scripts/Makefile.modinst | 12 +- scripts/Makefile.modpost | 25 +- scripts/basic/Makefile | 6 +- scripts/basic/fixdep.c | 14 +- scripts/bloat-o-meter | 3 +- scripts/checkstack.pl | 14 +- scripts/checkversion.pl | 7 +- scripts/extract-ikconfig | 5 +- scripts/gen_initramfs_list.sh | 229 +- scripts/genksyms/genksyms.c | 866 +- scripts/genksyms/genksyms.h | 58 +- scripts/genksyms/keywords.c_shipped | 91 +- scripts/genksyms/keywords.gperf | 1 - scripts/genksyms/lex.c_shipped | 2 +- scripts/genksyms/lex.l | 2 +- scripts/kallsyms.c | 12 +- scripts/kconfig/Makefile | 9 +- scripts/kconfig/conf.c | 73 +- 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/Makefile | 6 +- scripts/kconfig/lxdialog/checklist.c | 26 +- scripts/kconfig/lxdialog/menubox.c | 19 +- scripts/kconfig/menu.c | 34 +- scripts/kconfig/qconf.cc | 1048 +- scripts/kconfig/qconf.h | 158 +- scripts/kconfig/symbol.c | 50 +- scripts/kconfig/util.c | 4 +- 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-doc | 33 +- scripts/mkmakefile | 13 +- scripts/mod/file2alias.c | 107 +- scripts/mod/mk_elfconfig.c | 10 +- scripts/mod/modpost.c | 948 +- scripts/mod/modpost.h | 54 +- scripts/mod/sumversion.c | 32 +- scripts/namespace.pl | 4 +- scripts/package/Makefile | 20 +- scripts/package/mkspec | 5 - scripts/reference_discarded.pl | 12 +- scripts/reference_init.pl | 1 + scripts/setlocalversion | 4 +- scripts/ver_linux | 4 +- security/Kconfig | 20 +- security/capability.c | 1 + security/commoncap.c | 9 +- security/dummy.c | 77 +- security/inode.c | 20 +- security/keys/internal.h | 4 +- security/keys/key.c | 87 +- security/keys/keyctl.c | 218 +- security/keys/keyring.c | 28 +- security/keys/proc.c | 7 - security/keys/process_keys.c | 115 +- 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 | 211 +- security/security.c | 27 + security/selinux/Kconfig | 62 - security/selinux/Makefile | 2 +- security/selinux/avc.c | 13 +- security/selinux/hooks.c | 756 +- 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 | 10 +- security/selinux/include/security.h | 10 +- security/selinux/include/xfrm.h | 16 +- security/selinux/nlmsgtab.c | 16 +- security/selinux/selinuxfs.c | 198 +- security/selinux/ss/mls.c | 51 +- security/selinux/ss/mls.h | 4 +- security/selinux/ss/policydb.c | 31 +- security/selinux/ss/policydb.h | 7 +- security/selinux/ss/services.c | 279 +- security/selinux/xfrm.c | 122 +- sound/Kconfig | 2 - sound/Makefile | 1 - sound/arm/aaci.c | 17 +- sound/arm/aaci.h | 2 +- sound/arm/pxa2xx-ac97.c | 12 +- sound/arm/sa11xx-uda1341.c | 17 +- sound/core/Kconfig | 37 +- sound/core/control.c | 70 +- sound/core/control_compat.c | 33 +- sound/core/device.c | 6 - sound/core/hwdep.c | 47 +- sound/core/info.c | 209 +- sound/core/info_oss.c | 16 +- sound/core/init.c | 134 +- sound/core/isadma.c | 6 - sound/core/memalloc.c | 57 +- sound/core/memory.c | 6 +- sound/core/misc.c | 6 - sound/core/oss/copy.c | 5 - sound/core/oss/io.c | 5 - sound/core/oss/linear.c | 7 +- sound/core/oss/mixer_oss.c | 19 +- sound/core/oss/mulaw.c | 24 - sound/core/oss/pcm_oss.c | 867 +- sound/core/oss/pcm_plugin.c | 272 +- sound/core/oss/pcm_plugin.h | 28 +- sound/core/oss/plugin_ops.h | 166 + sound/core/oss/rate.c | 85 +- sound/core/oss/route.c | 489 +- sound/core/pcm.c | 159 +- sound/core/pcm_compat.c | 4 +- sound/core/pcm_lib.c | 780 +- sound/core/pcm_memory.c | 22 +- sound/core/pcm_misc.c | 24 - sound/core/pcm_native.c | 278 +- sound/core/rawmidi.c | 66 +- sound/core/seq/oss/seq_oss.c | 28 +- sound/core/seq/seq.c | 22 + sound/core/seq/seq_clientmgr.c | 55 +- sound/core/seq/seq_clientmgr.h | 2 +- sound/core/seq/seq_device.c | 65 +- sound/core/seq/seq_dummy.c | 6 +- sound/core/seq/seq_info.c | 11 +- sound/core/seq/seq_instr.c | 6 +- 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 | 31 +- sound/core/seq/seq_ports.c | 27 +- sound/core/seq/seq_queue.c | 6 +- sound/core/seq/seq_queue.h | 2 +- sound/core/seq/seq_virmidi.c | 8 +- sound/core/sgbuf.c | 10 +- sound/core/sound.c | 163 +- sound/core/sound_oss.c | 34 +- sound/core/timer.c | 83 +- sound/drivers/dummy.c | 20 +- sound/drivers/mpu401/mpu401.c | 45 +- sound/drivers/mpu401/mpu401_uart.c | 226 +- sound/drivers/mtpav.c | 16 +- sound/drivers/opl3/opl3_lib.c | 21 +- sound/drivers/opl3/opl3_oss.c | 3 +- sound/drivers/opl3/opl3_seq.c | 14 +- sound/drivers/opl3/opl3_synth.c | 14 +- sound/drivers/opl4/opl4_lib.c | 14 +- sound/drivers/opl4/opl4_local.h | 2 +- sound/drivers/opl4/opl4_proc.c | 10 +- sound/drivers/opl4/opl4_seq.c | 16 +- sound/drivers/serial-u16550.c | 23 +- sound/drivers/virmidi.c | 20 +- sound/drivers/vx/vx_core.c | 34 +- sound/drivers/vx/vx_hwdep.c | 3 - sound/drivers/vx/vx_mixer.c | 72 +- sound/drivers/vx/vx_pcm.c | 20 +- sound/i2c/cs8427.c | 121 +- sound/i2c/i2c.c | 19 +- sound/i2c/l3/uda1341.c | 4 +- sound/i2c/other/ak4xxx-adda.c | 284 +- sound/isa/Kconfig | 23 - sound/isa/Makefile | 2 - sound/isa/ad1816a/ad1816a.c | 14 +- sound/isa/ad1816a/ad1816a_lib.c | 17 +- sound/isa/ad1848/ad1848.c | 20 +- sound/isa/ad1848/ad1848_lib.c | 16 +- sound/isa/als100.c | 16 +- sound/isa/azt2320.c | 14 +- sound/isa/cmi8330.c | 35 +- sound/isa/cs423x/Makefile | 1 - sound/isa/cs423x/cs4231.c | 22 +- sound/isa/cs423x/cs4231_lib.c | 32 +- sound/isa/cs423x/cs4236.c | 47 +- sound/isa/cs423x/cs4236_lib.c | 6 +- sound/isa/dt019x.c | 14 +- sound/isa/es1688/es1688.c | 22 +- sound/isa/es1688/es1688_lib.c | 2 +- sound/isa/es18xx.c | 258 +- sound/isa/gus/gus_dma.c | 10 +- sound/isa/gus/gus_irq.c | 2 +- sound/isa/gus/gus_main.c | 4 +- sound/isa/gus/gus_mem.c | 20 +- sound/isa/gus/gus_pcm.c | 2 + sound/isa/gus/gus_synth.c | 18 +- sound/isa/gus/gusclassic.c | 20 +- sound/isa/gus/gusextreme.c | 24 +- sound/isa/gus/gusmax.c | 22 +- sound/isa/gus/interwave.c | 46 +- sound/isa/opl3sa2.c | 51 +- sound/isa/opti9xx/Makefile | 2 - sound/isa/opti9xx/opti92x-ad1848.c | 11 +- sound/isa/sb/emu8000.c | 22 +- sound/isa/sb/emu8000_patch.c | 2 +- sound/isa/sb/es968.c | 12 +- sound/isa/sb/sb16.c | 39 +- sound/isa/sb/sb16_csp.c | 14 +- sound/isa/sb/sb8.c | 20 +- sound/isa/sb/sb8_midi.c | 20 +- sound/isa/sb/sb_common.c | 2 +- sound/isa/sgalaxy.c | 22 +- sound/isa/sscape.c | 25 +- sound/isa/wavefront/wavefront.c | 36 +- 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 | 46 +- sound/oss/Kconfig | 317 +- sound/oss/ac97_codec.c | 24 +- sound/oss/aci.c | 11 +- sound/oss/ad1816.c | 1 + sound/oss/ad1848.c | 11 +- sound/oss/ad1889.c | 208 +- sound/oss/ad1889.h | 103 +- sound/oss/aedsp16.c | 1 + sound/oss/ali5455.c | 10 +- sound/oss/au1000.c | 50 +- sound/oss/au1550_ac97.c | 57 +- sound/oss/awe_wave.c | 6 +- sound/oss/btaudio.c | 38 +- sound/oss/cmpci.c | 24 +- sound/oss/cs4232.c | 18 +- sound/oss/cs4281/cs4281m.c | 56 +- sound/oss/cs46xx.c | 1349 +- sound/oss/dmabuf.c | 6 +- sound/oss/dmasound/dmasound.h | 1 + sound/oss/dmasound/dmasound_awacs.c | 33 +- sound/oss/dmasound/dmasound_core.c | 10 +- sound/oss/dmasound/dmasound_paula.c | 1 + sound/oss/emu10k1/hwaccess.h | 2 +- sound/oss/emu10k1/main.c | 7 +- sound/oss/emu10k1/midi.c | 25 +- sound/oss/es1370.c | 73 +- sound/oss/es1371.c | 73 +- sound/oss/esssolo1.c | 54 +- sound/oss/forte.c | 18 +- sound/oss/hal2.c | 24 +- sound/oss/i810_audio.c | 10 +- sound/oss/ite8172.c | 26 +- sound/oss/kahlua.c | 1 + sound/oss/maestro.c | 28 +- sound/oss/maestro3.c | 32 +- sound/oss/msnd.c | 8 +- sound/oss/msnd_classic.h | 1 + sound/oss/msnd_pinnacle.c | 1 + sound/oss/msnd_pinnacle.h | 1 + sound/oss/nec_vrc5477.c | 22 +- sound/oss/nm256_audio.c | 8 +- sound/oss/opl3sa2.c | 1 + sound/oss/pas2_card.c | 1 + sound/oss/pss.c | 1 + sound/oss/rme96xx.c | 19 +- sound/oss/sb_card.c | 36 +- sound/oss/sb_common.c | 3 +- sound/oss/sb_ess.c | 28 +- sound/oss/sb_mixer.c | 6 +- sound/oss/sequencer.c | 17 +- sound/oss/sh_dac_audio.c | 5 +- sound/oss/sonicvibes.c | 71 +- sound/oss/sound_config.h | 1 + sound/oss/soundcard.c | 17 +- sound/oss/swarm_cs4297a.c | 45 +- sound/oss/trident.c | 65 +- sound/oss/via82cxxx_audio.c | 61 +- sound/oss/vidc.c | 1 + sound/oss/vwsnd.c | 101 +- sound/oss/waveartist.c | 9 +- sound/oss/wavfront.c | 2 +- sound/oss/wf_midi.c | 2 +- sound/oss/ymfpci.c | 16 +- sound/oss/ymfpci.h | 3 +- sound/pci/Kconfig | 91 +- sound/pci/Makefile | 3 - sound/pci/ac97/ac97_codec.c | 126 +- sound/pci/ac97/ac97_patch.c | 61 +- sound/pci/ac97/ac97_patch.h | 1 - sound/pci/ac97/ac97_pcm.c | 16 +- sound/pci/ac97/ac97_proc.c | 19 +- sound/pci/ac97/ak4531_codec.c | 30 +- sound/pci/ad1889.c | 17 +- sound/pci/ali5451/ali5451.c | 11 +- sound/pci/als4000.c | 9 +- sound/pci/atiixp.c | 25 +- sound/pci/atiixp_modem.c | 17 +- sound/pci/au88x0/au88x0.c | 25 +- sound/pci/au88x0/au88x0.h | 28 +- sound/pci/au88x0/au88x0_a3d.c | 29 +- sound/pci/au88x0/au88x0_core.c | 18 +- sound/pci/au88x0/au88x0_eq.c | 33 +- sound/pci/au88x0/au88x0_eq.h | 31 +- sound/pci/au88x0/au88x0_eqdata.c | 6 +- sound/pci/au88x0/au88x0_mpu401.c | 13 +- sound/pci/au88x0/au88x0_pcm.c | 2 +- sound/pci/au88x0/au88x0_synth.c | 10 +- sound/pci/au88x0/au88x0_wt.h | 10 +- sound/pci/au88x0/au88x0_xtalk.c | 45 +- sound/pci/au88x0/au88x0_xtalk.h | 12 +- sound/pci/azt3328.c | 241 +- sound/pci/azt3328.h | 36 +- sound/pci/bt87x.c | 26 +- sound/pci/ca0106/ca0106.h | 4 +- sound/pci/ca0106/ca0106_main.c | 59 +- sound/pci/ca0106/ca0106_mixer.c | 181 +- sound/pci/ca0106/ca0106_proc.c | 17 +- sound/pci/cmipci.c | 37 +- sound/pci/cs4281.c | 46 +- sound/pci/cs46xx/cs46xx.c | 4 +- sound/pci/cs46xx/cs46xx_lib.c | 66 +- sound/pci/cs46xx/dsp_spos.c | 65 +- sound/pci/cs46xx/dsp_spos_scb_lib.c | 12 +- sound/pci/cs5535audio/Makefile | 4 - sound/pci/cs5535audio/cs5535audio.c | 49 +- sound/pci/cs5535audio/cs5535audio.h | 8 - sound/pci/cs5535audio/cs5535audio_pcm.c | 26 +- sound/pci/echoaudio/echoaudio.c | 6 +- sound/pci/emu10k1/emu10k1.c | 8 +- sound/pci/emu10k1/emu10k1_main.c | 94 +- sound/pci/emu10k1/emu10k1_synth.c | 1 + sound/pci/emu10k1/emu10k1x.c | 53 +- sound/pci/emu10k1/emufx.c | 22 +- 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 | 34 +- sound/pci/emu10k1/tina2.h | 8 +- sound/pci/emu10k1/voice.c | 4 - sound/pci/ens1370.c | 43 +- sound/pci/es1938.c | 12 +- sound/pci/es1968.c | 34 +- sound/pci/fm801.c | 7 +- sound/pci/hda/Makefile | 2 +- sound/pci/hda/hda_codec.c | 187 +- sound/pci/hda/hda_codec.h | 4 +- sound/pci/hda/hda_generic.c | 128 +- sound/pci/hda/hda_intel.c | 142 +- sound/pci/hda/hda_local.h | 9 +- sound/pci/hda/hda_patch.h | 3 - sound/pci/hda/hda_proc.c | 6 +- sound/pci/hda/patch_analog.c | 674 +- sound/pci/hda/patch_realtek.c | 2497 +- sound/pci/hda/patch_sigmatel.c | 466 +- sound/pci/ice1712/aureon.c | 305 +- sound/pci/ice1712/aureon.h | 9 +- sound/pci/ice1712/delta.c | 62 +- sound/pci/ice1712/ews.c | 3 - sound/pci/ice1712/hoontech.c | 26 +- sound/pci/ice1712/ice1712.c | 98 +- sound/pci/ice1712/ice1712.h | 17 +- sound/pci/ice1712/ice1724.c | 44 +- sound/pci/ice1712/phase.c | 10 +- sound/pci/ice1712/pontis.c | 94 +- sound/pci/ice1712/revo.c | 23 +- sound/pci/intel8x0.c | 175 +- sound/pci/intel8x0m.c | 6 +- sound/pci/korg1212/korg1212.c | 21 +- sound/pci/maestro3.c | 69 +- sound/pci/mixart/mixart.c | 28 +- sound/pci/mixart/mixart.h | 7 +- sound/pci/mixart/mixart_core.c | 18 +- sound/pci/mixart/mixart_mixer.c | 52 +- sound/pci/nm256/nm256.c | 138 +- sound/pci/pcxhr/pcxhr.c | 45 +- sound/pci/pcxhr/pcxhr.h | 5 +- sound/pci/pcxhr/pcxhr_core.c | 11 +- sound/pci/pcxhr/pcxhr_hwdep.c | 4 +- sound/pci/pcxhr/pcxhr_mixer.c | 75 +- sound/pci/rme32.c | 22 +- sound/pci/rme96.c | 54 +- sound/pci/rme9652/hdsp.c | 8 +- sound/pci/rme9652/hdspm.c | 8 +- sound/pci/rme9652/rme9652.c | 6 +- sound/pci/sonicvibes.c | 19 +- sound/pci/trident/trident.c | 3 +- sound/pci/trident/trident_main.c | 29 +- sound/pci/trident/trident_memory.c | 39 +- sound/pci/trident/trident_synth.c | 4 +- sound/pci/via82xx.c | 34 +- sound/pci/via82xx_modem.c | 4 +- sound/pci/vx222/vx222.c | 2 +- sound/pci/vx222/vx222_ops.c | 18 +- sound/pci/ymfpci/ymfpci.c | 8 +- sound/pci/ymfpci/ymfpci_main.c | 42 +- sound/pcmcia/Kconfig | 4 +- sound/pcmcia/pdaudiocf/pdaudiocf.c | 88 +- sound/pcmcia/pdaudiocf/pdaudiocf.h | 2 +- sound/pcmcia/pdaudiocf/pdaudiocf_core.c | 2 +- sound/pcmcia/pdaudiocf/pdaudiocf_pcm.c | 7 +- sound/pcmcia/vx/vxp_mixer.c | 12 +- sound/pcmcia/vx/vxp_ops.c | 2 +- sound/pcmcia/vx/vxpocket.c | 94 +- sound/pcmcia/vx/vxpocket.h | 2 +- sound/ppc/Makefile | 2 +- sound/ppc/awacs.c | 3 +- sound/ppc/daca.c | 4 +- sound/ppc/keywest.c | 7 +- sound/ppc/pmac.c | 93 +- sound/ppc/pmac.h | 3 +- sound/ppc/powermac.c | 14 +- sound/ppc/toonie.c | 7 +- sound/ppc/tumbler.c | 12 +- sound/sound_core.c | 29 +- sound/sparc/amd7930.c | 146 +- sound/sparc/cs4231.c | 97 +- sound/sparc/dbri.c | 16 +- sound/synth/emux/emux.c | 14 +- sound/synth/emux/emux_oss.c | 12 +- sound/synth/emux/emux_proc.c | 9 +- sound/synth/emux/emux_seq.c | 15 +- sound/synth/emux/emux_synth.c | 5 - sound/synth/emux/soundfont.c | 12 +- sound/synth/util_mem.c | 15 +- sound/usb/usbaudio.c | 221 +- sound/usb/usbaudio.h | 11 +- sound/usb/usbmidi.c | 210 +- sound/usb/usbmixer.c | 108 +- sound/usb/usbmixer_maps.c | 20 - sound/usb/usbquirks.h | 112 +- sound/usb/usx2y/usbusx2y.c | 2 +- sound/usb/usx2y/usbusx2y.h | 2 +- sound/usb/usx2y/usbusx2yaudio.c | 26 +- sound/usb/usx2y/usx2yhwdeppcm.c | 31 +- usr/Makefile | 93 +- usr/gen_init_cpio.c | 4 +- 9750 files changed, 305527 insertions(+), 404842 deletions(-) diff --git a/.gitignore b/.gitignore index e1d5c17c1..3f8fb686b 100644 --- a/.gitignore +++ b/.gitignore @@ -12,14 +12,10 @@ *.ko *.so *.mod.c -*.i -*.lst -*.symtypes # # Top-level generic files # -tags vmlinux* System.map Module.symvers @@ -33,11 +29,4 @@ 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 0fe904ebb..1f171f103 100644 --- a/CREDITS +++ b/CREDITS @@ -24,11 +24,6 @@ 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. @@ -528,11 +523,11 @@ S: Oxford S: United Kingdom N: Luiz Fernando N. Capitulino -E: lcapitulino@mandriva.com.br -E: lcapitulino@gmail.com -W: http://www.cpu.eti.br -D: misc kernel hacking -S: Mandriva +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 S: Brazil N: Remy Card @@ -1132,10 +1127,8 @@ S: Carnegie, Pennsylvania 15106-4304 S: USA N: Philip Gladstone -E: philip@gladstonefamily.net +E: philip@raptor.com D: Kernel / timekeeping stuff -S: Carlisle, MA 01741 -S: USA N: Jan-Benedict Glaw E: jbglaw@lug-owl.de @@ -1199,9 +1192,15 @@ S: Brecksville, OH 44141-1334 S: USA N: Tristan Greaves -E: tristan@extricate.org -W: http://www.extricate.org/ +E: Tristan.Greaves@icl.com +E: tmg296@ecs.soton.ac.uk +W: http://www.ecs.soton.ac.uk/~tmg296 D: Miscellaneous ipv4 sysctl patches +S: 15 Little Mead +S: Denmead +S: Hampshire +S: PO7 6HS +S: United Kingdom N: Michael A. Griffith E: grif@cs.ucr.edu @@ -1578,8 +1577,12 @@ S: 160 00 Praha 6 S: Czech Republic N: Niels Kristian Bech Jensen -E: nkbj1970@hotmail.com +E: nkbj@image.dk +W: http://www.image.dk/~nkbj 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 @@ -2004,14 +2007,13 @@ S: University of Stuttgart, Germany and S: Ecole Nationale Superieure des Telecommunications, Paris N: Jamie Lokier -E: jamie@shareable.org -W: http://www.shareable.org/ +E: jamie@imbolc.ucc.ie D: Reboot-through-BIOS for broken 486 motherboards -D: Parport fixes, futex improvements -D: First instruction of x86 sysenter path :) -S: 51 Sunningwell Road +D: Some parport fixes +S: 11 Goodson Walk +S: Marston S: Oxford -S: OX1 4SZ +S: OX3 0HX S: United Kingdom N: Mark Lord @@ -2209,7 +2211,7 @@ S: (address available on request) S: USA N: Ian McDonald -E: ian.mcdonald@jandi.co.nz +E: iam4@cs.waikato.ac.nz E: imcdnzl@gmail.com W: http://wand.net.nz/~iam4 W: http://imcdnzl.blogspot.com @@ -2811,8 +2813,6 @@ E: luca.risolia@studio.unibo.it P: 1024D/FCE635A4 88E8 F32F 7244 68BA 3958 5D40 99DA 5D2A FCE6 35A4 D: V4L driver for W996[87]CF JPEG USB Dual Mode Camera Chips D: V4L2 driver for SN9C10x PC Camera Controllers -D: V4L2 driver for ET61X151 and ET61X251 PC Camera Controllers -D: V4L2 driver for ZC0301 Image Processor and Control Chip S: Via Liberta' 41/A S: Osio Sotto, 24046, Bergamo S: Italy @@ -3242,9 +3242,14 @@ S: 12725 SW Millikan Way, Suite 400 S: Beaverton, Oregon 97005 S: USA -N: Marcelo Tosatti -E: marcelo@kvack.org +N: Marcelo W. Tosatti +E: marcelo.tosatti@cyclades.com +D: Miscellaneous kernel hacker D: v2.4 kernel maintainer +D: Current pc300/cyclades maintainer +S: Cyclades Corporation +S: Av Cristovao Colombo, 462. Floresta. +S: Porto Alegre S: Brazil N: Stefan Traby @@ -3372,7 +3377,7 @@ S: Germany N: Geert Uytterhoeven E: geert@linux-m68k.org -W: http://users.telenet.be/geertu/ +W: http://home.tvd.be/cr26864/ P: 1024/862678A6 C51D 361C 0BD1 4C90 B275 C553 6EEA 11BA 8626 78A6 D: m68k/Amiga and PPC/CHRP Longtrail coordinator D: Frame buffer device and XF68_FBDev maintainer @@ -3382,8 +3387,8 @@ D: Amiga Buddha and Catweasel chipset IDE D: Atari Falcon chipset IDE D: Amiga Gayle chipset IDE D: mipsel NEC DDB Vrc-5074 -S: Haterbeekstraat 55B -S: B-3200 Aarschot +S: Emiel Vlieberghlaan 2A/21 +S: B-3010 Kessel-Lo S: Belgium N: Chris Vance @@ -3401,10 +3406,10 @@ S: Czech Republic N: Thibaut Varene E: T-Bone@parisc-linux.org -W: http://www.parisc-linux.org/~varenet/ +W: http://www.parisc-linux.org/ 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 ARM at91rm9200 bits, S1D13XXX FB driver, random patches here and there +D: Some bits in an ARM port, S1D13XXX FB driver, random patches here and there D: AD1889 sound driver S: Paris, France @@ -3733,11 +3738,10 @@ D: Mylex DAC960 PCI RAID driver D: Miscellaneous kernel fixes N: Alessandro Zummo -E: a.zummo@towertech.it +E: azummo@ita.flashnet.it +W: http://freepage.logicom.it/azummo/ D: CMI8330 support is sb_card.c D: ISAPnP fixes in sb_card.c -D: ZyXEL omni.net lcd plus driver -D: RTC subsystem S: Italy N: Marc Zyngier diff --git a/Documentation/BUG-HUNTING b/Documentation/BUG-HUNTING index 65b97e1db..ca29242db 100644 --- a/Documentation/BUG-HUNTING +++ b/Documentation/BUG-HUNTING @@ -1,56 +1,3 @@ -Table of contents -================= - -Last updated: 20 December 2005 - -Contents -======== - -- Introduction -- Devices not appearing -- Finding patch that caused a bug --- Finding using git-bisect --- Finding it the old way -- Fixing the bug - -Introduction -============ - -Always try the latest kernel from kernel.org and build from source. If you are -not confident in doing that please report the bug to your distribution vendor -instead of to a kernel developer. - -Finding bugs is not always easy. Have a go though. If you can't find it don't -give up. Report as much as you have found to the relevant maintainer. See -MAINTAINERS for who that is for the subsystem you have worked on. - -Before you submit a bug report read REPORTING-BUGS. - -Devices not appearing -===================== - -Often this is caused by udev. Check that first before blaming it on the -kernel. - -Finding patch that caused a bug -=============================== - - - -Finding using git-bisect ------------------------- - -Using the provided tools with git makes finding bugs easy provided the bug is -reproducible. - -Steps to do it: -- start using git for the kernel source -- read the man page for git-bisect -- have fun - -Finding it the old way ----------------------- - [Sat Mar 2 10:32:33 PST 1996 KERNEL_BUG-HOWTO lm@sgi.com (Larry McVoy)] This is how to track down a bug if you know nothing about kernel hacking. @@ -143,63 +90,3 @@ it does work and it lets non-hackers help fix bugs. And it is cool because Linux snapshots will let you do this - something that you can't do with vendor supplied releases. -Fixing the bug -============== - -Nobody is going to tell you how to fix bugs. Seriously. You need to work it -out. But below are some hints on how to use the tools. - -To debug a kernel, use objdump and look for the hex offset from the crash -output to find the valid line of code/assembler. Without debug symbols, you -will see the assembler code for the routine shown, but if your kernel has -debug symbols the C code will also be available. (Debug symbols can be enabled -in the kernel hacking menu of the menu configuration.) For example: - - objdump -r -S -l --disassemble net/dccp/ipv4.o - -NB.: you need to be at the top level of the kernel tree for this to pick up -your C files. - -If you don't have access to the code you can also debug on some crash dumps -e.g. crash dump output as shown by Dave Miller. - -> EIP is at ip_queue_xmit+0x14/0x4c0 -> ... -> Code: 44 24 04 e8 6f 05 00 00 e9 e8 fe ff ff 8d 76 00 8d bc 27 00 00 -> 00 00 55 57 56 53 81 ec bc 00 00 00 8b ac 24 d0 00 00 00 8b 5d 08 -> <8b> 83 3c 01 00 00 89 44 24 14 8b 45 28 85 c0 89 44 24 18 0f 85 -> -> Put the bytes into a "foo.s" file like this: -> -> .text -> .globl foo -> foo: -> .byte .... /* bytes from Code: part of OOPS dump */ -> -> Compile it with "gcc -c -o foo.o foo.s" then look at the output of -> "objdump --disassemble foo.o". -> -> Output: -> -> ip_queue_xmit: -> push %ebp -> push %edi -> push %esi -> push %ebx -> sub $0xbc, %esp -> mov 0xd0(%esp), %ebp ! %ebp = arg0 (skb) -> mov 0x8(%ebp), %ebx ! %ebx = skb->sk -> mov 0x13c(%ebx), %eax ! %eax = inet_sk(sk)->opt - -Another very useful option of the Kernel Hacking section in menuconfig is -Debug memory allocations. This will help you see whether data has been -initialised and not set before use etc. To see the values that get assigned -with this look at mm/slab.c and search for POISON_INUSE. When using this an -Oops will often show the poisoned data instead of zero which is the default. - -Once you have worked out a fix please submit it upstream. After all open -source is about sharing what you do and don't you want to be recognised for -your genius? - -Please do read Documentation/SubmittingPatches though to help your code get -accepted. diff --git a/Documentation/Changes b/Documentation/Changes index 488272074..fe5ae0f55 100644 --- a/Documentation/Changes +++ b/Documentation/Changes @@ -15,6 +15,24 @@ and therefore owes credit to the same people as that file (Jared Mauch, Axel Boldt, Alessandro Sigala, and countless other users all over the 'net). +The latest revision of this document, in various formats, can always +be found at . + +Feel free to translate this document. If you do so, please send me a +URL to your translation for inclusion in future revisions of this +document. + +Smotrite file , yavlyaushisya +russkim perevodom dannogo documenta. + +Visite para obtener la traducción +al español de este documento en varios formatos. + +Eine deutsche Version dieser Datei finden Sie unter +. + +Chris Ricker (kaboom@gatech.edu or chris.ricker@genetics.utah.edu). + Current Minimal Requirements ============================ @@ -181,8 +199,8 @@ Intel IA32 microcode -------------------- A driver has been added to allow updating of Intel IA32 microcode, -accessible as a normal (misc) character device. If you are not using -udev you may need to: +accessible as both a devfs regular file and as a normal (misc) +character device. If you are not using devfs you may need to: mkdir /dev/cpu mknod /dev/cpu/microcode c 10 184 @@ -201,9 +219,7 @@ with programs using shared memory. udev ---- udev is a userspace application for populating /dev dynamically with -only entries for devices actually present. udev replaces the basic -functionality of devfs, while allowing persistant device naming for -devices. +only entries for devices actually present. udev replaces devfs. FUSE ---- @@ -233,13 +249,18 @@ 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 udev, you must have the device file /dev/ppp +If you are not using devfs, 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 6d2412ec9..ce5d2c038 100644 --- a/Documentation/CodingStyle +++ b/Documentation/CodingStyle @@ -155,83 +155,7 @@ problem, which is called the function-growth-hormone-imbalance syndrome. See next chapter. - 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 + Chapter 5: 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, @@ -259,7 +183,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 7: Centralized exiting of functions + Chapter 6: 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. @@ -296,7 +220,7 @@ out: return result; } - Chapter 8: Commenting + Chapter 7: 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 @@ -316,7 +240,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 9: You've made a mess of it + Chapter 8: 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 @@ -364,7 +288,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 10: Configuration-files + Chapter 9: Configuration-files For configuration options (arch/xxx/Kconfig, and all the Kconfig files), somewhat different indentation is used. @@ -389,7 +313,7 @@ support for file-systems, for instance) should be denoted (DANGEROUS), other experimental options should be denoted (EXPERIMENTAL). - Chapter 11: Data structures + Chapter 10: Data structures Data structures that have visibility outside the single-threaded environment they are created and destroyed in should always have @@ -420,7 +344,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 12: Macros, Enums and RTL + Chapter 11: Macros, Enums and RTL Names of macros defining constants and labels in enums are capitalized. @@ -475,7 +399,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 13: Printing kernel messages + Chapter 12: 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 @@ -486,7 +410,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 14: Allocating memory + Chapter 13: Allocating memory The kernel provides the following general purpose memory allocators: kmalloc(), kzalloc(), kcalloc(), and vmalloc(). Please refer to the API @@ -505,7 +429,7 @@ from void pointer to any other pointer type is guaranteed by the C programming language. - Chapter 15: The inline disease + Chapter 14: 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 @@ -533,7 +457,7 @@ something it would have done anyway. - Appendix I: References + Chapter 15: References The C Programming Language, Second Edition by Brian W. Kernighan and Dennis M. Ritchie. @@ -557,4 +481,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 April 2006. +Last updated on 30 December 2005 by a community effort on LKML. diff --git a/Documentation/DMA-API.txt b/Documentation/DMA-API.txt index 2ffb0d62f..1af0f2d50 100644 --- a/Documentation/DMA-API.txt +++ b/Documentation/DMA-API.txt @@ -33,9 +33,7 @@ pci_alloc_consistent(struct pci_dev *dev, size_t size, Consistent memory is memory for which a write by either the device or the processor can immediately be read by the processor or device -without having to worry about caching effects. (You may however need -to make sure to flush the processor's write buffers before telling -devices to read that memory.) +without having to worry about caching effects. This routine allocates a region of bytes of consistent memory. it also returns a which may be cast to an unsigned @@ -306,12 +304,12 @@ dma address with dma_mapping_error(). A non zero return value means the mapping could not be created and the driver should take appropriate action (eg reduce current DMA mapping usage or delay and try again later). - int - dma_map_sg(struct device *dev, struct scatterlist *sg, - int nents, enum dma_data_direction direction) - int - pci_map_sg(struct pci_dev *hwdev, struct scatterlist *sg, - int nents, int direction) +int +dma_map_sg(struct device *dev, struct scatterlist *sg, int nents, + enum dma_data_direction direction) +int +pci_map_sg(struct pci_dev *hwdev, struct scatterlist *sg, + int nents, int direction) Maps a scatter gather list from the block layer. @@ -329,33 +327,12 @@ critical that the driver do something, in the case of a block driver aborting the request or even oopsing is better than doing nothing and corrupting the filesystem. -With scatterlists, you use the resulting mapping like this: - - int i, count = dma_map_sg(dev, sglist, nents, direction); - struct scatterlist *sg; - - for (i = 0, sg = sglist; i < count; i++, sg++) { - hw_address[i] = sg_dma_address(sg); - hw_len[i] = sg_dma_len(sg); - } - -where nents is the number of entries in the sglist. - -The implementation is free to merge several consecutive sglist entries -into one (e.g. with an IOMMU, or if several pages just happen to be -physically contiguous) and returns the actual number of sg entries it -mapped them to. On failure 0, is returned. - -Then you should loop count times (note: this can be less than nents times) -and use sg_dma_address() and sg_dma_len() macros where you previously -accessed sg->address and sg->length as shown above. - - void - dma_unmap_sg(struct device *dev, struct scatterlist *sg, - int nhwentries, enum dma_data_direction direction) - void - pci_unmap_sg(struct pci_dev *hwdev, struct scatterlist *sg, - int nents, int direction) +void +dma_unmap_sg(struct device *dev, struct scatterlist *sg, int nhwentries, + enum dma_data_direction direction) +void +pci_unmap_sg(struct pci_dev *hwdev, struct scatterlist *sg, + int nents, int direction) unmap the previously mapped scatter/gather list. All the parameters must be the same as those and passed in to the scatter/gather mapping diff --git a/Documentation/DMA-mapping.txt b/Documentation/DMA-mapping.txt index 63392c913..684557474 100644 --- a/Documentation/DMA-mapping.txt +++ b/Documentation/DMA-mapping.txt @@ -58,15 +58,11 @@ translating each of those pages back to a kernel address using something like __va(). [ EDIT: Update this when we integrate Gerd Knorr's generic code which does this. ] -This rule also means that you may use neither kernel image addresses -(items in data/text/bss segments), nor module image addresses, nor -stack addresses for DMA. These could all be mapped somewhere entirely -different than the rest of physical memory. Even if those classes of -memory could physically work with DMA, you'd need to ensure the I/O -buffers were cacheline-aligned. Without that, you'd see cacheline -sharing problems (data corruption) on CPUs with DMA-incoherent caches. -(The CPU could write to one word, DMA would write to a different one -in the same cache line, and one of them could be overwritten.) +This rule also means that you may not use kernel image addresses +(ie. items in the kernel's data/text/bss segment, or your driver's) +nor may you use kernel stack addresses for DMA. Both of these items +might be mapped somewhere entirely different than the rest of physical +memory. Also, this means that you cannot take the return of a kmap() call and DMA to/from that. This is similar to vmalloc(). @@ -198,13 +194,11 @@ document for how to handle this case. Finally, if your device can only drive the low 24-bits of address during PCI bus mastering you might do something like: - if (pci_set_dma_mask(pdev, DMA_24BIT_MASK)) { + if (pci_set_dma_mask(pdev, 0x00ffffff)) { printk(KERN_WARNING "mydev: 24-bit DMA addressing not available.\n"); goto ignore_this_device; } -[Better use DMA_24BIT_MASK instead of 0x00ffffff. -See linux/include/dma-mapping.h for reference.] When pci_set_dma_mask() is successful, and returns zero, the PCI layer saves away this mask you have provided. The PCI layer will use this @@ -216,7 +210,7 @@ functions (for example a sound card provides playback and record functions) and the various different functions have _different_ DMA addressing limitations, you may wish to probe each mask and only provide the functionality which the machine can handle. It -is important that the last call to pci_set_dma_mask() be for the +is important that the last call to pci_set_dma_mask() be for the most specific mask. Here is pseudo-code showing how this might be done: @@ -288,11 +282,6 @@ There are two types of DMA mappings: in order to get correct behavior on all platforms. - Also, on some platforms your driver may need to flush CPU write - buffers in much the same way as it needs to flush write buffers - found in PCI bridges (such as by reading a register's value - after writing it). - - Streaming DMA mappings which are usually mapped for one DMA transfer, unmapped right after it (unless you use pci_dma_sync_* below) and for which hardware can optimize for sequential accesses. @@ -312,9 +301,6 @@ There are two types of DMA mappings: Neither type of DMA mapping has alignment restrictions that come from PCI, although some devices may have such restrictions. -Also, systems with caches that aren't DMA-coherent will work better -when the underlying buffers don't share cache lines with other data. - Using Consistent DMA mappings. @@ -698,12 +684,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 if it is capable of handling your devices DAC addressing -capabilities: +layer with your devices DAC addressing capabilities: - int pci_dac_dma_supported(struct pci_dev *hwdev, u64 mask); + int pci_dac_set_dma_mask(struct pci_dev *pdev, u64 mask); -You may not use the following interfaces if this routine fails. +This routine behaves identically to pci_set_dma_mask. 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 66e1cf733..1c955883c 100644 --- a/Documentation/DocBook/Makefile +++ b/Documentation/DocBook/Makefile @@ -2,16 +2,15 @@ # This makefile is used to generate the kernel documentation, # primarily based on in-line comments in various source files. # See Documentation/kernel-doc-nano-HOWTO.txt for instruction in how -# to document the SRC - and how to read it. +# to ducument the SRC - and how to read it. # To add a new book the only step required is to add the book to the # list of DOCBOOKS. 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 \ - genericirq.xml + sis900.xml kernel-api.xml journal-api.xml lsm.xml usb.xml \ + gadget.xml libata.xml mtdnand.xml librs.xml rapidio.xml ### # The build process is as follows (targets): @@ -29,7 +28,7 @@ PS_METHOD = $(prefer-db2x) ### # The targets that may be used. -PHONY += xmldocs sgmldocs psdocs pdfdocs htmldocs mandocs installmandocs +.PHONY: xmldocs sgmldocs psdocs pdfdocs htmldocs mandocs installmandocs BOOKS := $(addprefix $(obj)/,$(DOCBOOKS)) xmldocs: $(BOOKS) @@ -212,9 +211,3 @@ clean-dirs := $(patsubst %.xml,%,$(DOCBOOKS)) #man put files in man subdir - traverse down subdir- := man/ - - -# Declare the contents of the .PHONY variable as phony. We keep that -# information in a variable se we can use it in if_changed and friends. - -.PHONY: $(PHONY) diff --git a/Documentation/DocBook/deviceiobook.tmpl b/Documentation/DocBook/deviceiobook.tmpl index 90ed23df1..6f41f2f5c 100644 --- a/Documentation/DocBook/deviceiobook.tmpl +++ b/Documentation/DocBook/deviceiobook.tmpl @@ -270,6 +270,25 @@ CPU B: spin_unlock_irqrestore(&dev_lock, flags) + + ISA legacy functions + + On older kernels (2.2 and earlier) the ISA bus could be read or + written with these functions and without ioremap being used. This is + no longer true in Linux 2.4. A set of equivalent functions exist for + easy legacy driver porting. The functions available are prefixed + with 'isa_' and are isa_readb, + isa_writeb, isa_readw, + isa_writew, isa_readl, + isa_writel, isa_memcpy_fromio + and isa_memcpy_toio + + + These functions should not be used in new drivers, and will + eventually be going away. + + + diff --git a/Documentation/DocBook/kernel-api.tmpl b/Documentation/DocBook/kernel-api.tmpl index f8fe882e3..8c9c6704e 100644 --- a/Documentation/DocBook/kernel-api.tmpl +++ b/Documentation/DocBook/kernel-api.tmpl @@ -58,15 +58,10 @@ !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 @@ -119,33 +114,9 @@ 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 @@ -303,19 +274,20 @@ X!Ekernel/module.c Resources Management -!Ikernel/resource.c +!Ekernel/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 error_handler() is a driver's hook into probe, hotplug, and recovery -and other exceptional conditions. The primary responsibility of an -implementation is to call ata_do_eh() or ata_bmdma_drive_eh() with a set -of EH hooks as arguments: - - - -'prereset' hook (may be NULL) is called during an EH reset, before any other actions -are taken. - - - -'postreset' hook (may be NULL) is called after the EH reset is performed. Based on -existing conditions, severity of the problem, and hardware capabilities, - - - -Either 'softreset' (may be NULL) or 'hardreset' (may be NULL) will be -called to perform the low-level EH reset. - - - -void (*post_internal_cmd) (struct ata_queued_cmd *qc); -Perform any hardware-specific actions necessary to finish processing -after executing a probe-time or EH-time command via ata_exec_internal(). +This is a high level error handling function, called from the +error handling thread, when a command times out. Most newer +hardware will implement its own error handling code here. IDE BMDMA +drivers may use the helper function ata_eng_timeout(). @@ -761,7 +666,7 @@ and other resources, etc. ata_scsi_error() - ata_scsi_error() is the current transportt->eh_strategy_handler() + ata_scsi_error() is the current hostt->eh_strategy_handler() for libata. As discussed above, this will be entered in two cases - timeout and ATAPI error completion. This function calls low level libata driver's eng_timeout() callback, the diff --git a/Documentation/DocBook/mtdnand.tmpl b/Documentation/DocBook/mtdnand.tmpl index a8c8cce50..6e463d0db 100644 --- a/Documentation/DocBook/mtdnand.tmpl +++ b/Documentation/DocBook/mtdnand.tmpl @@ -109,7 +109,7 @@ for most of the implementations. These functions can be replaced by the board driver if neccecary. Those functions are called via pointers in the NAND chip description structure. The board driver can set the functions which - should be replaced by board dependent functions before calling nand_scan(). + should be replaced by board dependend functions before calling nand_scan(). If the function pointer is NULL on entry to nand_scan() then the pointer is set to the default function which is suitable for the detected chip type. @@ -133,7 +133,7 @@ [REPLACEABLE] Replaceable members hold hardware related functions which can be provided by the board driver. The board driver can set the functions which - should be replaced by board dependent functions before calling nand_scan(). + should be replaced by board dependend functions before calling nand_scan(). If the function pointer is NULL on entry to nand_scan() then the pointer is set to the default function which is suitable for the detected chip type. @@ -156,8 +156,9 @@ Basic board driver For most boards it will be sufficient to provide just the - basic functions and fill out some really board dependent + basic functions and fill out some really board dependend members in the nand chip description structure. + See drivers/mtd/nand/skeleton for reference. Basic defines @@ -188,9 +189,9 @@ static unsigned long baseaddr; Partition defines - If you want to divide your device into partitions, then - enable the configuration switch CONFIG_MTD_PARTITIONS and define - a partitioning scheme suitable to your board. + If you want to divide your device into parititions, then + enable the configuration switch CONFIG_MTD_PARITIONS and define + a paritioning scheme suitable to your board. #define NUM_PARTITIONS 2 @@ -1294,9 +1295,7 @@ in this page !Idrivers/mtd/nand/nand_base.c !Idrivers/mtd/nand/nand_bbt.c - +!Idrivers/mtd/nand/nand_ecc.c diff --git a/Documentation/DocBook/videobook.tmpl b/Documentation/DocBook/videobook.tmpl index b629da339..fdff984a5 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 IRQF_SHARED to indicate a + able to share the interrupt and would have set SA_SHIRQ 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/HOWTO b/Documentation/HOWTO index 915ae8c98..6c9e74626 100644 --- a/Documentation/HOWTO +++ b/Documentation/HOWTO @@ -603,8 +603,7 @@ start exactly where you are now. ---------- -Thanks to Paolo Ciarrocchi who allowed the "Development Process" -(http://linux.tar.bz/articles/2.6-development_process) section +Thanks to Paolo Ciarrocchi who allowed the "Development Process" section to be based on text he had written, and to Randy Dunlap and Gerrit Huizenga for some of the list of things you should and should not say. Also thanks to Pat Mochel, Hanna Linder, Randy Dunlap, Kay Sievers, diff --git a/Documentation/IPMI.txt b/Documentation/IPMI.txt index 0256805b5..bf1cf98d2 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-replaceable units (FRUs) and a watchdog +standardized database for field-replacable 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 initializes. It also have a lot +watchdog timer start as soon as it intitializes. 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 1d50cf0c9..49e27cc19 100644 --- a/Documentation/RCU/checklist.txt +++ b/Documentation/RCU/checklist.txt @@ -144,47 +144,9 @@ 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 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. + 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(). 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 a49485916..e4c38152f 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 "torture"). The test is started +command (perhaps grepping for "rcutorture"). 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,19 +35,6 @@ 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. @@ -55,14 +42,14 @@ OUTPUT The statistics output is as follows: - 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 + 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 -The command "dmesg | grep torture:" will extract this information on +The command "dmesg | grep rcutorture:" 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 @@ -128,9 +115,8 @@ The following script may be used to torture RCU: modprobe rcutorture sleep 100 rmmod rcutorture - dmesg | grep torture: + dmesg | grep rcutorture: 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. The "rmmod" command forces a "SUCCESS" or -"FAILURE" indication to be printk()ed. +checked for such errors. diff --git a/Documentation/RCU/whatisRCU.txt b/Documentation/RCU/whatisRCU.txt index 318df4425..5ed85af88 100644 --- a/Documentation/RCU/whatisRCU.txt +++ b/Documentation/RCU/whatisRCU.txt @@ -184,17 +184,7 @@ 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 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. + it is illegal to block. rcu_assign_pointer() @@ -370,7 +360,7 @@ uses of RCU may be found in listRCU.txt, arrayRCU.txt, and NMI-RCU.txt. struct foo *new_fp; struct foo *old_fp; - new_fp = kmalloc(sizeof(*new_fp), GFP_KERNEL); + new_fp = kmalloc(sizeof(*fp), GFP_KERNEL); spin_lock(&foo_mutex); old_fp = gbl_foo; *new_fp = *old_fp; @@ -471,7 +461,7 @@ The foo_update_a() function might then be written as follows: struct foo *new_fp; struct foo *old_fp; - new_fp = kmalloc(sizeof(*new_fp), GFP_KERNEL); + new_fp = kmalloc(sizeof(*fp), GFP_KERNEL); spin_lock(&foo_mutex); old_fp = gbl_foo; *new_fp = *old_fp; @@ -615,7 +605,7 @@ are the same as those shown in the preceding section, so they are omitted. { int cpu; - for_each_possible_cpu(cpu) + for_each_cpu(cpu) run_on(cpu); } @@ -687,9 +677,8 @@ 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); @@ -737,7 +726,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_rcu(&p->list); + 8 list_del(&p->list); 8 list_del(&p->list); 9 write_unlock(&listmutex); 9 spin_unlock(&listmutex); 10 synchronize_rcu(); 10 kfree(p); 11 kfree(p); @@ -801,6 +790,7 @@ 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 0e8f618ab..98ea617a0 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 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 +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 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 d42ab4c9e..c2c85bcb3 100644 --- a/Documentation/SubmittingPatches +++ b/Documentation/SubmittingPatches @@ -10,9 +10,7 @@ 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. -Read Documentation/SubmitChecklist for a list of items to check -before submitting code. If you are submitting a driver, also read -Documentation/SubmittingDrivers. +If you are submitting a driver, also read Documentation/SubmittingDrivers. @@ -76,6 +74,9 @@ 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 @@ -308,8 +309,6 @@ 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. @@ -485,7 +484,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 @@ -494,3 +493,4 @@ Kernel Documentation/CodingStyle Linus Torvald's mail on the canonical patch format: -- +Last updated on 17 Nov 2005. diff --git a/Documentation/acpi-hotkey.txt b/Documentation/acpi-hotkey.txt index 38040fa37..744f1aec6 100644 --- a/Documentation/acpi-hotkey.txt +++ b/Documentation/acpi-hotkey.txt @@ -30,7 +30,7 @@ specific hotkey(event)) echo "event_num:event_type:event_argument" > /proc/acpi/hotkey/action. The result of the execution of this aml method is -attached to /proc/acpi/hotkey/poll_method, which is dynamically +attached to /proc/acpi/hotkey/poll_method, which is dnyamically created. Please use command "cat /proc/acpi/hotkey/polling_method" to retrieve it. diff --git a/Documentation/aoe/mkdevs.sh b/Documentation/aoe/mkdevs.sh index 97374aaca..ec5a6de1c 100644 --- a/Documentation/aoe/mkdevs.sh +++ b/Documentation/aoe/mkdevs.sh @@ -27,8 +27,6 @@ rm -f $dir/discover mknod -m 0200 $dir/discover c $MAJOR 3 rm -f $dir/interfaces mknod -m 0200 $dir/interfaces c $MAJOR 4 -rm -f $dir/revalidate -mknod -m 0200 $dir/revalidate c $MAJOR 5 export n_partitions mkshelf=`echo $0 | sed 's!mkdevs!mkshelf!'` diff --git a/Documentation/aoe/udev.txt b/Documentation/aoe/udev.txt index a7ed1dc4f..ab39d8bb6 100644 --- a/Documentation/aoe/udev.txt +++ b/Documentation/aoe/udev.txt @@ -18,7 +18,6 @@ SUBSYSTEM="aoe", KERNEL="discover", NAME="etherd/%k", GROUP="disk", MODE="0220" SUBSYSTEM="aoe", KERNEL="err", NAME="etherd/%k", GROUP="disk", MODE="0440" SUBSYSTEM="aoe", KERNEL="interfaces", NAME="etherd/%k", GROUP="disk", MODE="0220" -SUBSYSTEM="aoe", KERNEL="revalidate", NAME="etherd/%k", GROUP="disk", MODE="0220" # aoe block devices KERNEL="etherd*", NAME="%k", GROUP="disk" diff --git a/Documentation/arm/Booting b/Documentation/arm/Booting index 76850295a..fad566bb0 100644 --- a/Documentation/arm/Booting +++ b/Documentation/arm/Booting @@ -118,7 +118,7 @@ to store page tables. The recommended placement is 32KiB into RAM. In either case, the following conditions must be met: -- Quiesce all DMA capable devices so that memory does not get +- Quiesce all DMA capable devicess so that memory does not get corrupted by bogus network packets or disk data. This will save you many hours of debug. diff --git a/Documentation/arm/IXP4xx b/Documentation/arm/IXP4xx index 43edb4ecf..d4c6d3aa0 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 disadvantage of this is that every PCI access requires + The disadvantadge 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/README b/Documentation/arm/README index 9b9c8226f..5ed6f3530 100644 --- a/Documentation/arm/README +++ b/Documentation/arm/README @@ -89,7 +89,7 @@ Modules Although modularisation is supported (and required for the FP emulator), each module on an ARM2/ARM250/ARM3 machine when is loaded will take memory up to the next 32k boundary due to the size of the pages. - Therefore, is modularisation on these machines really worth it? + Therefore, modularisation on these machines really worth it? However, ARM6 and up machines allow modules to take multiples of 4k, and as such Acorn RiscPCs and other architectures using these processors can diff --git a/Documentation/arm/SA1100/Assabet b/Documentation/arm/SA1100/Assabet index 78bc1c1b0..cbbe5587c 100644 --- a/Documentation/arm/SA1100/Assabet +++ b/Documentation/arm/SA1100/Assabet @@ -26,7 +26,7 @@ Installing a bootloader A couple of bootloaders able to boot Linux on Assabet are available: -BLOB (http://www.lartmaker.nl/lartware/blob/) +BLOB (http://www.lart.tudelft.nl/lartware/blob/) BLOB is a bootloader used within the LART project. Some contributed patches were merged into BLOB to add support for Assabet. diff --git a/Documentation/arm/SA1100/LART b/Documentation/arm/SA1100/LART index 6d412b685..2f73f513e 100644 --- a/Documentation/arm/SA1100/LART +++ b/Documentation/arm/SA1100/LART @@ -11,4 +11,4 @@ is under development, with plenty of others in different stages of planning. The hardware designs for this board have been released under an open license; -see the LART page at http://www.lartmaker.nl/ for more information. +see the LART page at http://www.lart.tudelft.nl/ for more information. diff --git a/Documentation/arm/Samsung-S3C24XX/Overview.txt b/Documentation/arm/Samsung-S3C24XX/Overview.txt index 3e46d2a31..89aa89d52 100644 --- a/Documentation/arm/Samsung-S3C24XX/Overview.txt +++ b/Documentation/arm/Samsung-S3C24XX/Overview.txt @@ -7,12 +7,8 @@ Introduction ------------ The Samsung S3C24XX range of ARM9 System-on-Chip CPUs are supported - 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. + by the 's3c2410' architecture of ARM Linux. Currently the S3C2410 and + the S3C2440 are supported CPUs. Configuration @@ -36,27 +32,13 @@ Machines A general purpose development board, see EB2410ITX.txt for further details - Simtec Electronics IM2440D20 (Osiris) - - CPU Module from Simtec Electronics, with a S3C2440A CPU, nand flash - and a PCMCIA controller. - Samsung SMDK2410 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, which has the - option of an S3C2440 or S3C2442 CPU module. + The S3C2440 compatible version of the SMDK2440 Thorcom VR1000 @@ -103,26 +85,6 @@ Adding New Machines mailing list information. -I2C ---- - - The hardware I2C core in the CPU is supported in single master - mode, and can be configured via platform data. - - -RTC ---- - - Support for the onboard RTC unit, including alarm function. - - -Watchdog --------- - - The onchip watchdog is available via the standard watchdog - interface. - - NAND ---- @@ -159,15 +121,6 @@ Clock Management various clock units -Suspend to RAM --------------- - - For boards that provide support for suspend to RAM, the - system can be placed into low power suspend. - - See Suspend.txt for more information. - - Platform Data ------------- @@ -205,7 +158,6 @@ Platform Data exported outside arch/arm/mach-s3c2410/, or exported to modules via EXPORT_SYMBOL() and related functions. - Port Contributors ----------------- @@ -222,7 +174,22 @@ 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 + Document Author --------------- -Ben Dooks, (c) 2004-2005,2006 Simtec Electronics +Ben Dooks, (c) 2004-2005 Simtec Electronics diff --git a/Documentation/arm/Setup b/Documentation/arm/Setup index 0cb1e64bd..0abd0720d 100644 --- a/Documentation/arm/Setup +++ b/Documentation/arm/Setup @@ -58,7 +58,7 @@ below: video_y This describes the character position of cursor on VGA console, and - is otherwise unused. (should not be used for other console types, and + is otherwise unused. (should not used for other console types, and should not be used for other purposes). memc_control_reg diff --git a/Documentation/atomic_ops.txt b/Documentation/atomic_ops.txt index 2a63d5662..23a1c2402 100644 --- a/Documentation/atomic_ops.txt +++ b/Documentation/atomic_ops.txt @@ -157,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 preceding the atomic_dec() +It makes sure that all memory operations preceeding the atomic_dec() call are strongly ordered with respect to the atomic counter -operation. In the above example, it guarantees that the assignment of +operation. In the above example, it guarentees that the assignment of "1" to obj->dead will be globally visible to other cpus before the atomic counter decrement. -Without the explicit smp_mb__before_atomic_dec() call, the +Without the explicitl 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. @@ -173,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 disastrous results. Here is -an example, which follows a pattern occurring frequently in the Linux +atomic_t implementation above can have disasterous results. Here is +an example, which follows a pattern occuring 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 guaranteed that no other entity can be accessing the object: +be guarenteed that no other entity can be accessing the object: static void obj_list_add(struct obj *obj) { @@ -291,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, volatile unsigned long *addr); - void clear_bit(unsigned long nr, volatile unsigned long *addr); - void change_bit(unsigned long nr, volatile unsigned long *addr); + 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); These routines set, clear, and change, respectively, the bit number indicated by "nr" on the bit mask pointed to by "ADDR". @@ -301,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, 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); + 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); Like the above, except that these routines return a boolean which indicates whether the changed bit was set _BEFORE_ the atomic bit @@ -335,7 +335,7 @@ subsequent memory operation is made visible. For example: /* ... */; obj->killed = 1; -The implementation of test_and_set_bit() must guarantee that +The implementation of test_and_set_bit() must guarentee 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 @@ -474,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 guarantee that +Said another way, _atomic_dec_and_lock() must guarentee that a counter dropping to zero is never made visible before the spinlock being acquired. diff --git a/Documentation/block/biodoc.txt b/Documentation/block/biodoc.txt index f989a9e83..8e6383197 100644 --- a/Documentation/block/biodoc.txt +++ b/Documentation/block/biodoc.txt @@ -132,18 +132,8 @@ Some new queue property settings: limit. No highmem default. blk_queue_max_sectors(q, max_sectors) - Sets two variables that limit the size of the request. - - - The request queue's max_sectors, which is a soft size in - in units of 512 byte sectors, and could be dynamically varied - by the core kernel. - - - The request queue's max_hw_sectors, which is a hard limit - and reflects the maximum size request a driver can handle - in units of 512 byte sectors. - - The default for both max_sectors and max_hw_sectors is - 255. The upper limit of max_sectors is 1024. + Maximum size request you can handle in units of 512 byte + sectors. 255 default. blk_queue_max_phys_segments(q, max_segments) Maximum physical segments you can handle in a request. 128 diff --git a/Documentation/cachetlb.txt b/Documentation/cachetlb.txt index 53245c429..4ae418889 100644 --- a/Documentation/cachetlb.txt +++ b/Documentation/cachetlb.txt @@ -362,27 +362,6 @@ maps this page at its virtual address. likely that you will need to flush the instruction cache for copy_to_user_page(). - void flush_anon_page(struct page *page, unsigned long vmaddr) - When the kernel needs to access the contents of an anonymous - page, it calls this function (currently only - get_user_pages()). Note: flush_dcache_page() deliberately - doesn't work for an anonymous page. The default - implementation is a nop (and should remain so for all coherent - architectures). For incoherent architectures, it should flush - the cache of the page at vmaddr in the current user process. - - void flush_kernel_dcache_page(struct page *page) - When the kernel needs to modify a user page is has obtained - with kmap, it calls this function after all modifications are - complete (but before kunmapping it) to bring the underlying - page up to date. It is assumed here that the user has no - incoherent cached copies (i.e. the original page was obtained - from a mechanism like get_user_pages()). The default - implementation is a nop and should remain so on all coherent - architectures. On incoherent architectures, this should flush - the kernel cache for page (using page_address(page)). - - void flush_icache_range(unsigned long start, unsigned long end) When the kernel stores into addresses that it will execute out of (eg when loading modules), this function is called. diff --git a/Documentation/cciss.txt b/Documentation/cciss.txt index 9c629ffa0..15378422f 100644 --- a/Documentation/cciss.txt +++ b/Documentation/cciss.txt @@ -20,7 +20,6 @@ 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/connector/connector.txt b/Documentation/connector/connector.txt index ad6e0ba7b..57a314b14 100644 --- a/Documentation/connector/connector.txt +++ b/Documentation/connector/connector.txt @@ -69,11 +69,10 @@ Unregisters new callback with connector core. struct cb_id *id - unique connector's user identifier. -int cn_netlink_send(struct cn_msg *msg, u32 __groups, int gfp_mask); +void cn_netlink_send(struct cn_msg *msg, u32 __groups, int gfp_mask); Sends message to the specified groups. It can be safely called from -softirq context, but may silently fail under strong memory pressure. -If there are no listeners for given group -ESRCH can be returned. +any context, but may silently fail under strong memory pressure. struct cn_msg * - message header(with attached data). u32 __group - destination group. diff --git a/Documentation/cpu-freq/index.txt b/Documentation/cpu-freq/index.txt index ffdb5323d..5009805f9 100644 --- a/Documentation/cpu-freq/index.txt +++ b/Documentation/cpu-freq/index.txt @@ -53,4 +53,4 @@ the CPUFreq Mailing list: * http://lists.linux.org.uk/mailman/listinfo/cpufreq Clock and voltage scaling for the SA-1100: -* http://www.lartmaker.nl/projects/scaling +* http://www.lart.tudelft.nl/projects/scaling diff --git a/Documentation/cpu-freq/user-guide.txt b/Documentation/cpu-freq/user-guide.txt index 555c8cf36..7fedc00c3 100644 --- a/Documentation/cpu-freq/user-guide.txt +++ b/Documentation/cpu-freq/user-guide.txt @@ -153,13 +153,10 @@ 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 bc107cb15..57a09f99e 100644 --- a/Documentation/cpu-hotplug.txt +++ b/Documentation/cpu-hotplug.txt @@ -97,13 +97,13 @@ at which time hotplug is disabled. You really dont need to manipulate any of the system cpu maps. They should be read-only for most use. When setting up per-cpu resources almost always use -cpu_possible_map/for_each_possible_cpu() to iterate. +cpu_possible_map/for_each_cpu() to iterate. Never use anything other than cpumask_t to represent bitmap of CPUs. #include -for_each_possible_cpu - Iterate over cpu_possible_map +for_each_cpu - Iterate over cpu_possible_map for_each_online_cpu - Iterate over cpu_online_map for_each_present_cpu - Iterate over cpu_present_map for_each_cpu_mask(x,mask) - Iterate over some random collection of cpu mask. @@ -251,24 +251,16 @@ A: This is what you would need in your kernel code to receive notifications. return NOTIFY_OK; } - static struct notifier_block __cpuinitdata foobar_cpu_notifer = + static struct notifier_block 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). -For the first case, you should add the following to your init function +In 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 76b44290c..30c414599 100644 --- a/Documentation/cpusets.txt +++ b/Documentation/cpusets.txt @@ -18,8 +18,7 @@ CONTENTS: 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 ? + 1.7 How do I use cpusets ? 2. Usage Examples and Syntax 2.1 Basic Usage 2.2 Adding/removing cpus @@ -217,12 +216,6 @@ 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. -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 ? -------------------------------- @@ -324,78 +317,7 @@ 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 ? +1.7 How do I use cpusets ? -------------------------- In order to minimize the impact of cpusets on critical kernel diff --git a/Documentation/cputopology.txt b/Documentation/cputopology.txt index 2b28e9ec4..ff280e2e1 100644 --- a/Documentation/cputopology.txt +++ b/Documentation/cputopology.txt @@ -1,5 +1,5 @@ -Export cpu topology info via sysfs. Items (attributes) are similar +Export cpu topology info by sysfs. Items (attributes) are similar to /proc/cpuinfo. 1) /sys/devices/system/cpu/cpuX/topology/physical_package_id: @@ -12,7 +12,7 @@ represent the thread siblings to cpu X in the same core; represent the thread siblings to cpu X in the same physical package; To implement it in an architecture-neutral way, a new source file, -drivers/base/topology.c, is to export the 4 attributes. +driver/base/topology.c, is to export the 5 attributes. If one architecture wants to support this feature, it just needs to implement 4 defines, typically in file include/asm-XXX/topology.h. diff --git a/Documentation/devices.txt b/Documentation/devices.txt index 66c725f53..3c406acd4 100644 --- a/Documentation/devices.txt +++ b/Documentation/devices.txt @@ -3,7 +3,7 @@ Maintained by Torben Mathiasen - Last revised: 15 May 2006 + Last revised: 25 January 2005 This list is the Linux Device List, the official registry of allocated device numbers and /dev directory nodes for the Linux operating @@ -94,6 +94,7 @@ 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 @@ -261,13 +262,13 @@ Your cooperation is appreciated. NOTE: These devices permit both read and write access. 7 block Loopback devices - 0 = /dev/loop0 First loop device - 1 = /dev/loop1 Second loop device + 0 = /dev/loop0 First loopback device + 1 = /dev/loop1 Second loopback device ... - The loop devices are used to mount filesystems not + The loopback devices are used to mount filesystems not associated with block devices. The binding to the - loop devices is handled by mount(8) or losetup(8). + loopback devices is handled by mount(8) or losetup(8). 8 block SCSI disk devices (0-15) 0 = /dev/sda First SCSI disk whole disk @@ -942,7 +943,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) except that the partition + disks (see major number 3) expect that the partition limit is 15 rather than 63 per disk (same as SCSI.) 45 char isdn4linux ISDN BRI driver @@ -1167,7 +1168,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 loop mounting (all handled + /dev/scramdisk/x nodes for loopback mounting (all handled through the sdmount tool). Requested by: andy@scramdisklinux.org @@ -1720,6 +1721,11 @@ Your cooperation is appreciated. These devices support the same API as the generic SCSI devices. + 97 block Packet writing for CD/DVD devices + 0 = /dev/pktcdvd0 First packet-writing module + 1 = /dev/pktcdvd1 Second packet-writing module + ... + 98 char Control and Measurement Device (comedi) 0 = /dev/comedi0 First comedi device 1 = /dev/comedi1 Second comedi device @@ -2537,38 +2543,24 @@ 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 Third USB block device - ... + 0 = /dev/uba First USB block device + 8 = /dev/ubb Second USB block device + 16 = /dev/ubc Thrid USB block device + ... 181 char Conrad Electronic parallel port radio clocks 0 = /dev/pcfclock0 First Conrad radio clock @@ -2723,17 +2715,6 @@ 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 @@ -2771,27 +2752,11 @@ 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/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 + 50 = /dev/ttyIOC40 Altix serial card ... - 169 = /dev/ttyAT15 ATMEL serial port 15 - 170 = /dev/ttyNX0 Hilscher netX serial port 0 - ... - 185 = /dev/ttyNX15 Hilscher netX serial port 15 - 186 = /dev/ttyJ0 JTAG1 DCC protocol based serial port emulation + 81 = /dev/ttyIOC431 Altix serial card + 82 = /dev/ttyVR0 NEC VR4100 series SIU + 83 = /dev/ttyVR1 NEC VR4100 series DSIU 205 char Low-density serial ports (alternate device) 0 = /dev/culu0 Callout device for ttyLU0 @@ -2826,8 +2791,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 @@ -2937,6 +2902,7 @@ 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 @@ -3041,43 +3007,12 @@ Your cooperation is appreciated. ioctl()'s can be used to rewind the tape regardless of the device used to access it. -231 char InfiniBand +231 char InfiniBand MAD 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 + ... -234-239 UNASSIGNED +232-239 UNASSIGNED 240-254 char LOCAL/EXPERIMENTAL USE 240-254 block LOCAL/EXPERIMENTAL USE @@ -3091,28 +3026,6 @@ 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 f2560e22f..88820fe38 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 acquired from +This driver requires a number of user-space tools. They can be aquired from http://www.digi.com, but only works with 2.4 kernels. diff --git a/Documentation/dontdiff b/Documentation/dontdiff index 63c2d0c55..24adfe9af 100644 --- a/Documentation/dontdiff +++ b/Documentation/dontdiff @@ -135,7 +135,6 @@ 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 2050c9ffc..ac4a7a737 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 common, uniform data model for describing +The current driver model provides a comon, 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 7b3d969d2..d37191fe5 100644 --- a/Documentation/drivers/edac/edac.txt +++ b/Documentation/drivers/edac/edac.txt @@ -21,7 +21,7 @@ within the computer system. In the initial release, memory Correctable Errors Detecting CE events, then harvesting those events and reporting them, CAN be a predictor of future UE events. With CE events, the system can -continue to operate, but with less safety. Preventive maintenance and +continue to operate, but with less safety. Preventive maintainence and proactive part replacement of memory DIMMs exhibiting CEs can reduce the likelihood of the dreaded UE events and system 'panics'. @@ -29,20 +29,21 @@ the likelihood of the dreaded UE events and system 'panics'. In addition, PCI Bus Parity and SERR Errors are scanned for on PCI devices in order to determine if errors are occurring on data transfers. The presence of PCI Parity errors must be examined with a grain of salt. -There are several add-in adapters that do NOT follow the PCI specification +There are several addin adapters that do NOT follow the PCI specification with regards to Parity generation and reporting. The specification says 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. -[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.] +The PCI Parity EDAC device has the ability to "skip" known flakey +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. -EDAC will have future error detectors that will be integrated with -EDAC or added to it, in the following list: +EDAC will have future error detectors that will be added or integrated +into EDAC in the following list: MCE Machine Check Exception MCA Machine Check Architecture @@ -92,24 +93,22 @@ 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 control and status system + pci PCI 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 -laid out in a Chip-Select Row (csrowX) and Channel table (chX). There can -be multiple csrows and multiple channels. +Each mc device controls a set of DIMM memory modules. These modules are +layed out in a Chip-Select Row (csrowX) and Channel table (chX). There can +be multiple csrows and two 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 @@ -132,7 +131,7 @@ for memory DIMMs: DIMM_B1 Labels for these slots are usually silk screened on the motherboard. Slots -labeled 'A' are channel 0 in this example. Slots labeled 'B' +labeled 'A' are channel 0 in this example. Slots labled 'B' are channel 1. Notice that there are two csrows possible on a physical DIMM. These csrows are allocated their csrow assignment based on the slot into which the memory DIMM is placed. Thus, when 1 DIMM @@ -141,7 +140,7 @@ is placed in each Channel, the csrows cross both DIMMs. Memory DIMMs come single or dual "ranked". A rank is a populated csrow. Thus, 2 single ranked DIMMs, placed in slots DIMM_A0 and DIMM_B0 above will have 1 csrow, csrow0. csrow1 will be empty. On the other hand, -when 2 dual ranked DIMMs are similarly placed, then both csrow0 and +when 2 dual ranked DIMMs are similiaryly placed, then both csrow0 and csrow1 will be populated. The pattern repeats itself for csrow2 and csrow3. @@ -235,15 +234,23 @@ 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 the current - default. Systems which require all the bandwidth they can get, may - increase this. + locating the error. 1000 milliseconds (once each second) is about + right for most uses. 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 modules's version and compile date are shown here to + indicate what EDAC is running. + + + ============================================================================ 'mcX' DIRECTORIES @@ -277,6 +284,35 @@ 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' @@ -285,6 +321,16 @@ 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' @@ -377,7 +423,7 @@ Total memory managed by this csrow attribute file: 'size_mb' This attribute file displays, in count of megabytes, of memory - that this csrow contains. + that this csrow contatins. Memory Type attribute file: @@ -386,9 +432,6 @@ 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: @@ -403,13 +446,8 @@ Device type attribute file: 'dev_type' - This attribute file will display what type of DRAM device is - being utilized on this DIMM. - Examples: - x1 - x2 - x4 - x8 + This attribute file will display what type of DIMM device is + being utilized. Example: x4 Channel 0 CE Count attribute file: @@ -484,10 +522,10 @@ SYSTEM LOGGING If logging for UEs and CEs are enabled then system logs will have error notices indicating errors that have been detected: -EDAC MC0: CE page 0x283, offset 0xce0, grain 8, syndrome 0x6ec3, row 0, +MC0: CE page 0x283, offset 0xce0, grain 8, syndrome 0x6ec3, row 0, channel 1 "DIMM_B1": amd76x_edac -EDAC MC0: CE page 0x1e5, offset 0xfb0, grain 8, syndrome 0xb741, row 0, +MC0: CE page 0x1e5, offset 0xfb0, grain 8, syndrome 0xb741, row 0, channel 1 "DIMM_B1": amd76x_edac @@ -519,7 +557,7 @@ On Header Type 00 devices the primary status is looked at for any parity error regardless of whether Parity is enabled on the device. (The spec indicates parity is generated in some cases). On Header Type 01 bridges, the secondary status register is also -looked at to see if parity occurred on the bus on the other side of +looked at to see if parity ocurred on the bus on the other side of the bridge. @@ -550,7 +588,7 @@ Panic on PCI PARITY Error: 'panic_on_pci_parity' - This control files enables or disables panicking when a parity + This control files enables or disables panic'ing when a parity error has been detected. @@ -572,4 +610,64 @@ 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 hexadecimel VENDOR and DEVICE + ID tuples: + + 1022:7450,1434:16a6 + + One or more can be inserted, seperated 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 hexadecimel VENDOR and DEVICE ID tuples: + + 1022:7450,1434:16a6 + + One or more can be inserted, seperated 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 current contatins, + 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 +adminstrator 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 utililzed. + diff --git a/Documentation/dvb/avermedia.txt b/Documentation/dvb/avermedia.txt index 8bab8461a..068070ff1 100644 --- a/Documentation/dvb/avermedia.txt +++ b/Documentation/dvb/avermedia.txt @@ -1,3 +1,4 @@ + HOWTO: Get An Avermedia DVB-T working under Linux ______________________________________________ @@ -136,8 +137,11 @@ Getting the card going To power up the card, load the following modules in the following order: - * modprobe bttv (normally loaded automatically) - * modprobe dvb-bt8xx (or place dvb-bt8xx in /etc/modules) + * insmod dvb-core.o + * modprobe bttv.o + * insmod bt878.o + * insmod dvb-bt8xx.o + * insmod sp887x.o Insertion of these modules into the running kernel will activate the appropriate DVB device nodes. It is then possible @@ -298,4 +302,4 @@ Further Update Many thanks to Nigel Pearson for the updates to this document since the recent revision of the driver. - February 14th 2006 + January 29th 2004 diff --git a/Documentation/dvb/bt8xx.txt b/Documentation/dvb/bt8xx.txt index 4e7614e60..52ed46206 100644 --- a/Documentation/dvb/bt8xx.txt +++ b/Documentation/dvb/bt8xx.txt @@ -1,78 +1,118 @@ -How to get the bt8xx cards working -================================== +How to get the Nebula, PCTV, FusionHDTV Lite and Twinhan DST cards working +========================================================================== -1) General information -====================== +This class of cards has a bt878a as the PCI interface, and +require the bttv driver. -This class of cards has a bt878a as the PCI interface, and require the bttv driver -for accessing the i2c bus and the gpio pins of the bt8xx chipset. -Please see Documentation/dvb/cards.txt => o Cards based on the Conexant Bt8xx PCI bridge: +Please pay close attention to the warning about the bttv module +options below for the DST card. -Compiling kernel please enable: -a.)"Device drivers" => "Multimedia devices" => "Video For Linux" => "BT848 Video For Linux" -b.)"Device drivers" => "Multimedia devices" => "Digital Video Broadcasting Devices" - => "DVB for Linux" "DVB Core Support" "Bt8xx based PCI Cards" +1) General informations +======================= + +These drivers require the bttv driver to provide the means to access +the i2c bus and the gpio pins of the bt8xx chipset. + +Because of this, you need to enable +"Device drivers" => "Multimedia devices" + => "Video For Linux" => "BT848 Video For Linux" + +Furthermore you need to enable +"Device drivers" => "Multimedia devices" => "Digital Video Broadcasting Devices" + => "DVB for Linux" "DVB Core Support" "BT8xx based PCI cards" 2) Loading Modules ================== -In default cases bttv is loaded automatically. -To load the backend either place dvb-bt8xx in etc/modules, or apply manually: +In general you need to load the bttv driver, which will handle the gpio and +i2c communication for us, plus the common dvb-bt8xx device driver. +The frontends for Nebula (nxt6000), Pinnacle PCTV (cx24110), TwinHan (dst), +FusionHDTV DVB-T Lite (mt352) and FusionHDTV5 Lite (lgdt330x) are loaded +automatically by the dvb-bt8xx device driver. + +3a) Nebula / Pinnacle PCTV / FusionHDTV Lite +--------------------------------------------- + + $ modprobe bttv (normally bttv is being loaded automatically by kmod) + $ modprobe dvb-bt8xx + +(or just place dvb-bt8xx in /etc/modules for automatic loading) + + +3b) TwinHan and Clones +-------------------------- - $ modprobe dvb-bt8xx + $ modprobe bttv card=0x71 + $ modprobe dvb-bt8xx + $ modprobe dst -All frontends will be loaded automatically. -People running udev please see Documentation/dvb/udev.txt. +The value 0x71 will override the PCI type detection for dvb-bt8xx, +which is necessary for TwinHan cards. Omission of this parameter might result +in a system lockup. -In the following cases overriding the PCI type detection for dvb-bt8xx might be necessary: +If you're having an older card (blue color PCB) and card=0x71 locks up +your machine, try using 0x68, too. If that does not work, ask on the +mailing list. -2a) Running TwinHan and Clones ------------------------------- +The DST module takes a couple of useful parameters. - $ modprobe bttv card=113 - $ modprobe dvb-bt8xx - $ modprobe dst +verbose takes values 0 to 4. These values control the verbosity level, +and can be used to debug also. -Useful parameters for verbosity level and debugging the dst module: +verbose=0 means complete disabling of messages + 1 only error messages are displayed + 2 notifications are also displayed + 3 informational messages are also displayed + 4 debug setting -verbose=0: messages are disabled - 1: only error messages are displayed - 2: notifications are displayed - 3: other useful messages are displayed - 4: debug setting -dst_addons=0: card is a free to air (FTA) card only - 0x20: card has a conditional access slot for scrambled channels +dst_addons takes values 0 and 0x20. A value of 0 means it is a FTA card. +0x20 means it has a Conditional Access slot. -The autodetected values are determined by the cards' "response string". -In your logs see f. ex.: dst_get_device_id: Recognize [DSTMCI]. -For bug reports please send in a complete log with verbose=4 activated. -Please also see Documentation/dvb/ci.txt. +The autodetected values are determined by the cards 'response string' +which you can see in your logs e.g. -2b) Running multiple cards +dst_get_device_id: Recognise [DSTMCI] + +If you need to sent in bug reports on the dst, please do send in a complete +log with the verbose=4 module parameter. For general usage, the default setting +of verbose=1 is ideal. + + +4) Multiple cards -------------------------- -Examples of card ID's: +If you happen to be running multiple cards, it would be advisable to load +the bttv module with the card id. This would help to solve any module loading +problems that you might face. + +For example, if you have a Twinhan and Clones card along with a FusionHDTV5 Lite -Pinnacle PCTV Sat: 94 -Nebula Electronics Digi TV: 104 -pcHDTV HD-2000 TV: 112 -Twinhan DST and clones: 113 -Avermedia AverTV DVB-T 771: 123 -Avermedia AverTV DVB-T 761: 124 -DViCO FusionHDTV DVB-T Lite: 128 -DViCO FusionHDTV 5 Lite: 135 + $ modprobe bttv card=0x71 card=0x87 + +Here the order of the card id is important and should be the same as that of the +physical order of the cards. Here card=0x71 represents the Twinhan and clones +and card=0x87 represents Fusion HDTV5 Lite. These arguments can also be +specified in decimal, rather than hex: -Notice: The order of the card ID should be uprising: -Example: $ modprobe bttv card=113 card=135 - $ modprobe dvb-bt8xx -For a full list of card ID's please see Documentation/video4linux/CARDLIST.bttv. -In case of further problems send questions to the mailing list: www.linuxdvb.org. +Some examples of card-id's + +Pinnacle Sat 0x5e (94) +Nebula Digi TV 0x68 (104) +PC HDTV 0x70 (112) +Twinhan 0x71 (113) +FusionHDTV DVB-T Lite 0x80 (128) +FusionHDTV5 Lite 0x87 (135) + +For a full list of card-id's, see the V4L Documentation within the kernel +source: linux/Documentation/video4linux/CARDLIST.bttv + +If you have problems with this please do ask on the mailing list. +-- Authors: Richard Walker, Jamie Honan, Michael Hunold, Manu Abraham, - Uwe Bugla, Michael Krufky diff --git a/Documentation/dvb/get_dvb_firmware b/Documentation/dvb/get_dvb_firmware index 4820366b6..ee74eeb76 100644 --- a/Documentation/dvb/get_dvb_firmware +++ b/Documentation/dvb/get_dvb_firmware @@ -246,7 +246,7 @@ sub vp7041 { } sub dibusb { - my $url = "http://www.linuxtv.org/downloads/firmware/dvb-usb-dibusb-5.0.0.11.fw"; + my $url = "http://www.linuxtv.org/downloads/firmware/dvb-dibusb-5.0.0.11.fw"; my $outfile = "dvb-dibusb-5.0.0.11.fw"; my $hash = "fa490295a527360ca16dcdf3224ca243"; diff --git a/Documentation/dvb/readme.txt b/Documentation/dvb/readme.txt index 0b0380c91..f5c50b22d 100644 --- a/Documentation/dvb/readme.txt +++ b/Documentation/dvb/readme.txt @@ -20,23 +20,11 @@ http://linuxtv.org/downloads/ What's inside this directory: -"avermedia.txt" -contains detailed information about the -Avermedia DVB-T cards. See also "bt8xx.txt". - -"bt8xx.txt" -contains detailed information about the -various bt8xx based "budget" DVB cards. - "cards.txt" contains a list of supported hardware. -"ci.txt" -contains detailed information about the -CI module as part from TwinHan cards and Clones. - "contributors.txt" -is the who-is-who of DVB development. +is the who-is-who of DVB development "faq.txt" contains frequently asked questions and their answers. @@ -46,17 +34,19 @@ script to download and extract firmware for those devices that require it. "ttusb-dec.txt" -contains detailed information about the +contains detailed informations about the TT DEC2000/DEC3000 USB DVB hardware. -"udev.txt" -how to get DVB and udev up and running. +"bt8xx.txt" +contains detailed installation instructions for the +various bt8xx based "budget" DVB cards +(Nebula, Pinnacle PCTV, Twinhan DST) -"README.dvb-usb" -contains detailed information about the DVB USB cards. +"README.dibusb" +contains detailed information about adapters +based on DiBcom reference design. -"README.flexcop" -contains detailed information about the -Technisat- and Flexcop B2C2 drivers. +"udev.txt" +how to get DVB and udev up and running. Good luck and have fun! diff --git a/Documentation/fb/fbcon.txt b/Documentation/fb/fbcon.txt index f373df12e..08dce0f63 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/fbcon + /sys/class/graphics/fb{x} - rotate - rotate the display of the active console - rotate_all - rotate the display of all consoles + con_rotate - rotate the display of the active console + con_rotate_all - rotate the display of all consoles Console rotation will only become available if Console Rotation Support is compiled in your kernel. @@ -148,177 +148,5 @@ 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/filesystems/00-INDEX b/Documentation/filesystems/00-INDEX index 16dec61d7..74052d22d 100644 --- a/Documentation/filesystems/00-INDEX +++ b/Documentation/filesystems/00-INDEX @@ -1,47 +1,27 @@ 00-INDEX - this file (info on some of the filesystems supported by linux). -Exporting - - explanation of how to make filesystems exportable. Locking - info on locking rules as they pertain to Linux VFS. adfs.txt - info and mount options for the Acorn Advanced Disc Filing System. -afs.txt - - info and examples for the distributed AFS (Andrew File System) fs. affs.txt - info and mount options for the Amiga Fast File System. -automount-support.txt - - information about filesystem automount support. -befs.txt - - information about the BeOS filesystem for Linux. bfs.txt - info for the SCO UnixWare Boot Filesystem (BFS). cifs.txt - - description of the CIFS filesystem. + - description of the CIFS filesystem coda.txt - description of the CODA filesystem. configfs/ - directory containing configfs documentation and example code. cramfs.txt - - info on the cram filesystem for small storage (ROMs etc). -dentry-locking.txt - - info on the RCU-based dcache locking model. + - info on the cram filesystem for small storage (ROMs etc) devfs/ - directory containing devfs documentation. -directory-locking - - info about the locking scheme used for directory operations. dlmfs.txt - info on the userspace interface to the OCFS2 DLM. ext2.txt - info, mount options and specifications for the Ext2 filesystem. -ext3.txt - - info, mount options and specifications for the Ext3 filesystem. -files.txt - - info on file management in the Linux kernel. -fuse.txt - - info on the Filesystem in User SpacE including mount options. -hfs.txt - - info on the Macintosh HFS Filesystem for Linux. hpfs.txt - info and mount options for the OS/2 HPFS. isofs.txt @@ -52,43 +32,23 @@ ncpfs.txt - info on Novell Netware(tm) filesystem using NCP protocol. ntfs.txt - info and mount options for the NTFS filesystem (Windows NT). -ocfs2.txt - - info and mount options for the OCFS2 clustered filesystem. -porting - - various information on filesystem porting. proc.txt - info on Linux's /proc filesystem. -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. -relay.txt - - info on relay, for efficient streaming from kernel to user space. +ocfs2.txt + - info and mount options for the OCFS2 clustered filesystem. romfs.txt - - description of the ROMFS filesystem. + - Description of the ROMFS filesystem. smbfs.txt - - info on using filesystems with the SMB protocol (Win 3.11 and NT). -spufs.txt - - info and mount options for the SPU filesystem used on Cell. -sysfs-pci.txt - - info on accessing PCI device resources through sysfs. -sysfs.txt - - info on sysfs, a ram-based filesystem for exporting kernel objects. + - info on using filesystems with the SMB protocol (Windows 3.11 and NT) sysv-fs.txt - info on the SystemV/V7/Xenix/Coherent filesystem. -tmpfs.txt - - info on tmpfs, a filesystem that holds all files in virtual memory. udf.txt - info and mount options for the UDF filesystem. ufs.txt - info on the ufs filesystem. -v9fs.txt - - v9fs is a Unix implementation of the Plan 9 9p remote fs protocol. vfat.txt - info on using the VFAT filesystem used in Windows NT and Windows 95 vfs.txt - - overview of the Virtual File System + - Overview of the Virtual File System xfs.txt - info and mount options for the XFS filesystem. -xip.txt - - info on execute-in-place for file mappings. diff --git a/Documentation/filesystems/Locking b/Documentation/filesystems/Locking index 247d7f619..1045da582 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 dentry *, struct kstatfs *); + int (*statfs) (struct super_block *, struct kstatfs *); int (*remount_fs) (struct super_block *, int *, char *); void (*clear_inode) (struct inode *); void (*umount_begin) (struct super_block *); @@ -142,16 +142,15 @@ see also dquot_operations section. --------------------------- file_system_type --------------------------- prototypes: - int (*get_sb) (struct file_system_type *, int, - const char *, void *, struct vfsmount *); + struct super_block *(*get_sb) (struct file_system_type *, int, + const char *, void *); void (*kill_sb) (struct super_block *); locking rules: may block BKL get_sb yes yes kill_sb yes yes -->get_sb() returns error or 0 with locked superblock attached to the vfsmount -(exclusive on ->s_umount). +->get_sb() returns error or a locked superblock (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 7cac200e2..58c65a171 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 vfs_kern_mount() to call the appropriate filesystem to set up a + (a) Call do_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 2d6a14a46..3d4713a6c 100644 --- a/Documentation/filesystems/configfs/configfs_example.c +++ b/Documentation/filesystems/configfs/configfs_example.c @@ -264,15 +264,6 @@ 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; @@ -313,13 +304,7 @@ 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, }; @@ -360,6 +345,10 @@ 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/ext3.txt b/Documentation/filesystems/ext3.txt index 4aecc9bdb..afb1335c0 100644 --- a/Documentation/filesystems/ext3.txt +++ b/Documentation/filesystems/ext3.txt @@ -113,14 +113,6 @@ noquota grpquota usrquota -bh (*) ext3 associates buffer heads to data pages to -nobh (a) cache disk block mapping information - (b) link pages into transaction to provide - ordering guarantees. - "bh" option forces use of buffer heads. - "nobh" option tries to avoid associating buffer - heads (supported only for "writeback" mode). - Specification ============= diff --git a/Documentation/filesystems/fuse.txt b/Documentation/filesystems/fuse.txt index a584f0540..33f74310d 100644 --- a/Documentation/filesystems/fuse.txt +++ b/Documentation/filesystems/fuse.txt @@ -18,14 +18,6 @@ Non-privileged mount (or user mount): user. NOTE: this is not the same as mounts allowed with the "user" option in /etc/fstab, which is not discussed here. -Filesystem connection: - - A connection between the filesystem daemon and the kernel. The - connection exists until either the daemon dies, or the filesystem is - umounted. Note that detaching (or lazy umounting) the filesystem - does _not_ break the connection, in this case it will exist until - the last reference to the filesystem is released. - Mount owner: The user who does the mounting. @@ -94,20 +86,16 @@ Mount options The default is infinite. Note that the size of read requests is limited anyway to 32 pages (which is 128kbyte on i386). -Control filesystem -~~~~~~~~~~~~~~~~~~ - -There's a control filesystem for FUSE, which can be mounted by: +Sysfs +~~~~~ - mount -t fusectl none /sys/fs/fuse/connections +FUSE sets up the following hierarchy in sysfs: -Mounting it under the '/sys/fs/fuse/connections' directory makes it -backwards compatible with earlier versions. + /sys/fs/fuse/connections/N/ -Under the fuse control filesystem each connection has a directory -named by a unique number. +where N is an increasing number allocated to each new connection. -For each connection the following files exist within this directory: +For each connection the following attributes are defined: 'waiting' @@ -122,47 +110,7 @@ For each connection the following files exist within this directory: connection. This means that all waiting requests will be aborted an error returned for all aborted and new requests. -Only the owner of the mount may read or write these files. - -Interrupting filesystem operations -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -If a process issuing a FUSE filesystem request is interrupted, the -following will happen: - - 1) If the request is not yet sent to userspace AND the signal is - fatal (SIGKILL or unhandled fatal signal), then the request is - dequeued and returns immediately. - - 2) If the request is not yet sent to userspace AND the signal is not - fatal, then an 'interrupted' flag is set for the request. When - the request has been successfully transfered to userspace and - this flag is set, an INTERRUPT request is queued. - - 3) If the request is already sent to userspace, then an INTERRUPT - request is queued. - -INTERRUPT requests take precedence over other requests, so the -userspace filesystem will receive queued INTERRUPTs before any others. - -The userspace filesystem may ignore the INTERRUPT requests entirely, -or may honor them by sending a reply to the _original_ request, with -the error set to EINTR. - -It is also possible that there's a race between processing the -original request and it's INTERRUPT request. There are two possibilities: - - 1) The INTERRUPT request is processed before the original request is - processed - - 2) The INTERRUPT request is processed after the original request has - been answered - -If the filesystem cannot find the original request, it should wait for -some timeout and/or a number of new requests to arrive, after which it -should reply to the INTERRUPT request with an EAGAIN error. In case -1) the INTERRUPT request will be requeued. In case 2) the INTERRUPT -reply will be ignored. +Only a privileged user may read or write these attributes. Aborting a filesystem connection ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -191,8 +139,8 @@ the filesystem. There are several ways to do this: - Use forced umount (umount -f). Works in all cases but only if filesystem is still attached (it hasn't been lazy unmounted) - - Abort filesystem through the FUSE control filesystem. Most - powerful method, always works. + - Abort filesystem through the sysfs interface. Most powerful + method, always works. How do non-privileged mounts work? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -356,7 +304,25 @@ Scenario 1 - Simple deadlock | | for "file"] | | *DEADLOCK* -The solution for this is to allow the filesystem to be aborted. +The solution for this is to allow requests to be interrupted while +they are in userspace: + + | [interrupted by signal] | + | fuse_unlink() + | | [queue req on fc->pending] + | | [wake up fc->waitq] + | | [sleep on req->waitq] + +If the filesystem daemon was single threaded, this will stop here, +since there's no other thread to dequeue and execute the request. +In this case the solution is to kill the FUSE daemon as well. If +there are multiple serving threads, you just have to kill them as +long as any remain. + +Moral: a filesystem which deadlocks, can soon find itself dead. Scenario 2 - Tricky deadlock ---------------------------- @@ -389,14 +355,24 @@ but is caused by a pagefault. | | [lock page] | | * DEADLOCK * -Solution is basically the same as above. +Solution is again to let the the request be interrupted (not +elaborated further). + +An additional problem is that while the write buffer is being +copied to the request, the request must not be interrupted. This +is because the destination address of the copy may not be valid +after the request is interrupted. + +This is solved with doing the copy atomically, and allowing +interruption while the page(s) belonging to the write buffer are +faulted with get_user_pages(). The 'req->locked' flag indicates +when the copy is taking place, and interruption is delayed until +this flag is unset. -An additional problem is that while the write buffer is being copied -to the request, the request must not be interrupted/aborted. This is -because the destination address of the copy may not be valid after the -request has returned. +Scenario 3 - Tricky deadlock with asynchronous read +--------------------------------------------------- -This is solved with doing the copy atomically, and allowing abort -while the page(s) belonging to the write buffer are faulted with -get_user_pages(). The 'req->locked' flag indicates when the copy is -taking place, and abort is delayed until this flag is unset. +The same situation as above, except thread-1 will wait on page lock +and hence it will be uninterruptible as well. The solution is to +abort the connection with forced umount (if mount is attached) or +through the abort attribute in sysfs. diff --git a/Documentation/filesystems/inotify.txt b/Documentation/filesystems/inotify.txt index 59a919f16..6d501903f 100644 --- a/Documentation/filesystems/inotify.txt +++ b/Documentation/filesystems/inotify.txt @@ -69,135 +69,17 @@ Prototypes: int inotify_rm_watch (int fd, __u32 mask); -(iii) Kernel Interface +(iii) Internal Kernel Implementation -Inotify's kernel API consists a set of functions for managing watches and an -event callback. - -To use the kernel API, you must first initialize an inotify instance with a set -of inotify_operations. You are given an opaque inotify_handle, which you use -for any further calls to inotify. - - struct inotify_handle *ih = inotify_init(my_event_handler); - -You must provide a function for processing events and a function for destroying -the inotify watch. - - void handle_event(struct inotify_watch *watch, u32 wd, u32 mask, - u32 cookie, const char *name, struct inode *inode) - - watch - the pointer to the inotify_watch that triggered this call - wd - the watch descriptor - mask - describes the event that occurred - cookie - an identifier for synchronizing events - name - the dentry name for affected files in a directory-based event - inode - the affected inode in a directory-based event - - void destroy_watch(struct inotify_watch *watch) - -You may add watches by providing a pre-allocated and initialized inotify_watch -structure and specifying the inode to watch along with an inotify event mask. -You must pin the inode during the call. You will likely wish to embed the -inotify_watch structure in a structure of your own which contains other -information about the watch. Once you add an inotify watch, it is immediately -subject to removal depending on filesystem events. You must grab a reference if -you depend on the watch hanging around after the call. - - inotify_init_watch(&my_watch->iwatch); - inotify_get_watch(&my_watch->iwatch); // optional - s32 wd = inotify_add_watch(ih, &my_watch->iwatch, inode, mask); - inotify_put_watch(&my_watch->iwatch); // optional - -You may use the watch descriptor (wd) or the address of the inotify_watch for -other inotify operations. You must not directly read or manipulate data in the -inotify_watch. Additionally, you must not call inotify_add_watch() more than -once for a given inotify_watch structure, unless you have first called either -inotify_rm_watch() or inotify_rm_wd(). - -To determine if you have already registered a watch for a given inode, you may -call inotify_find_watch(), which gives you both the wd and the watch pointer for -the inotify_watch, or an error if the watch does not exist. - - wd = inotify_find_watch(ih, inode, &watchp); - -You may use container_of() on the watch pointer to access your own data -associated with a given watch. When an existing watch is found, -inotify_find_watch() bumps the refcount before releasing its locks. You must -put that reference with: - - put_inotify_watch(watchp); - -Call inotify_find_update_watch() to update the event mask for an existing watch. -inotify_find_update_watch() returns the wd of the updated watch, or an error if -the watch does not exist. - - wd = inotify_find_update_watch(ih, inode, mask); - -An existing watch may be removed by calling either inotify_rm_watch() or -inotify_rm_wd(). - - int ret = inotify_rm_watch(ih, &my_watch->iwatch); - int ret = inotify_rm_wd(ih, wd); - -A watch may be removed while executing your event handler with the following: - - inotify_remove_watch_locked(ih, iwatch); - -Call inotify_destroy() to remove all watches from your inotify instance and -release it. If there are no outstanding references, inotify_destroy() will call -your destroy_watch op for each watch. - - inotify_destroy(ih); - -When inotify removes a watch, it sends an IN_IGNORED event to your callback. -You may use this event as an indication to free the watch memory. Note that -inotify may remove a watch due to filesystem events, as well as by your request. -If you use IN_ONESHOT, inotify will remove the watch after the first event, at -which point you may call the final inotify_put_watch. - -(iv) Kernel Interface Prototypes - - struct inotify_handle *inotify_init(struct inotify_operations *ops); - - inotify_init_watch(struct inotify_watch *watch); - - s32 inotify_add_watch(struct inotify_handle *ih, - struct inotify_watch *watch, - struct inode *inode, u32 mask); - - s32 inotify_find_watch(struct inotify_handle *ih, struct inode *inode, - struct inotify_watch **watchp); - - s32 inotify_find_update_watch(struct inotify_handle *ih, - struct inode *inode, u32 mask); - - int inotify_rm_wd(struct inotify_handle *ih, u32 wd); - - int inotify_rm_watch(struct inotify_handle *ih, - struct inotify_watch *watch); - - void inotify_remove_watch_locked(struct inotify_handle *ih, - struct inotify_watch *watch); - - void inotify_destroy(struct inotify_handle *ih); - - void get_inotify_watch(struct inotify_watch *watch); - void put_inotify_watch(struct inotify_watch *watch); - - -(v) Internal Kernel Implementation - -Each inotify instance is represented by an inotify_handle structure. -Inotify's userspace consumers also have an inotify_device which is -associated with the inotify_handle, and on which events are queued. +Each inotify instance is associated with an inotify_device structure. Each watch is associated with an inotify_watch structure. Watches are chained -off of each associated inotify_handle and each associated inode. +off of each associated device and each associated inode. -See fs/inotify.c and fs/inotify_user.c for the locking and lifetime rules. +See fs/inotify.c for the locking and lifetime rules. -(vi) Rationale +(iv) Rationale Q: What is the design decision behind not tying the watch to the open fd of the watched object? @@ -263,7 +145,7 @@ A: The poor user-space interface is the second biggest problem with dnotify. file descriptor-based one that allows basic file I/O and poll/select. Obtaining the fd and managing the watches could have been done either via a device file or a family of new system calls. We decided to implement a - family of system calls because that is the preferred approach for new kernel + family of system calls because that is the preffered approach for new kernel interfaces. The only real difference was whether we wanted to use open(2) and ioctl(2) or a couple of new system calls. System calls beat ioctls. diff --git a/Documentation/filesystems/isofs.txt b/Documentation/filesystems/isofs.txt index 758e50401..424585ff6 100644 --- a/Documentation/filesystems/isofs.txt +++ b/Documentation/filesystems/isofs.txt @@ -9,9 +9,9 @@ when using discs encoded using Microsoft's Joliet extensions. iocharset=name Character set to use for converting from Unicode to ASCII. Joliet filenames are stored in Unicode format, but Unix for the most part doesn't know how to deal with Unicode. - There is also an option of doing UTF-8 translations with the + There is also an option of doing UTF8 translations with the utf8 option. - utf8 Encode Unicode names in UTF-8 format. Default is no. + utf8 Encode Unicode names in UTF8 format. Default is no. Mount options unique to the isofs filesystem. block=512 Set the block size for the disk to 512 bytes diff --git a/Documentation/filesystems/jfs.txt b/Documentation/filesystems/jfs.txt index bae128663..3e992daf9 100644 --- a/Documentation/filesystems/jfs.txt +++ b/Documentation/filesystems/jfs.txt @@ -6,7 +6,7 @@ The following mount options are supported: iocharset=name Character set to use for converting from Unicode to ASCII. The default is to do no conversion. Use - iocharset=utf8 for UTF-8 translations. This requires + iocharset=utf8 for UTF8 translations. This requires CONFIG_NLS_UTF8 to be set in the kernel .config file. iocharset=none specifies the default behavior explicitly. diff --git a/Documentation/filesystems/ntfs.txt b/Documentation/filesystems/ntfs.txt index 638cbd3d2..251168587 100644 --- a/Documentation/filesystems/ntfs.txt +++ b/Documentation/filesystems/ntfs.txt @@ -457,11 +457,6 @@ ChangeLog Note, a technical ChangeLog aimed at kernel hackers is in fs/ntfs/ChangeLog. -2.1.27: - - Implement page migration support so the kernel can move memory used - by NTFS files and directories around for management purposes. - - Add support for writing to sparse files created with Windows XP SP2. - - Many minor improvements and bug fixes. 2.1.26: - Implement support for sector sizes above 512 bytes (up to the maximum supported by NTFS which is 4096 bytes). diff --git a/Documentation/filesystems/porting b/Documentation/filesystems/porting index 553169405..2f388460c 100644 --- a/Documentation/filesystems/porting +++ b/Documentation/filesystems/porting @@ -50,11 +50,10 @@ Turn your foo_read_super() into a function that would return 0 in case of success and negative number in case of error (-EINVAL unless you have more informative error value to report). Call it foo_fill_super(). Now declare -int foo_get_sb(struct file_system_type *fs_type, - int flags, const char *dev_name, void *data, struct vfsmount *mnt) +struct super_block foo_get_sb(struct file_system_type *fs_type, + int flags, const char *dev_name, void *data) { - return get_sb_bdev(fs_type, flags, dev_name, data, foo_fill_super, - mnt); + return get_sb_bdev(fs_type, flags, dev_name, data, ext2_fill_super); } (or similar with s/bdev/nodev/ or s/bdev/single/, depending on the kind of diff --git a/Documentation/filesystems/proc.txt b/Documentation/filesystems/proc.txt index 99902ae68..944cf109a 100644 --- a/Documentation/filesystems/proc.txt +++ b/Documentation/filesystems/proc.txt @@ -121,7 +121,7 @@ Table 1-1: Process specific entries in /proc .............................................................................. File Content cmdline Command line arguments - cpu Current and last cpu in which it was executed (2.4)(smp) + cpu Current and last cpu in wich it was executed (2.4)(smp) cwd Link to the current working directory environ Values of environment variables exe Link to the executable of this process @@ -309,13 +309,13 @@ is the same by default: > cat /proc/irq/0/smp_affinity ffffffff -It's a bitmask, in which you can specify which CPUs can handle the IRQ, you can +It's a bitmask, in wich you can specify wich CPUs can handle the IRQ, you can set it by doing: > echo 1 > /proc/irq/prof_cpu_mask This means that only the first CPU will handle the IRQ, but you can also echo 5 -which means that only the first and fourth CPU can handle the IRQ. +wich means that only the first and fourth CPU can handle the IRQ. The way IRQs are routed is handled by the IO-APIC, and it's Round Robin between all the CPUs which are allowed to handle it. As usual the kernel has diff --git a/Documentation/filesystems/ramfs-rootfs-initramfs.txt b/Documentation/filesystems/ramfs-rootfs-initramfs.txt index 25981e2e5..60ab61e54 100644 --- a/Documentation/filesystems/ramfs-rootfs-initramfs.txt +++ b/Documentation/filesystems/ramfs-rootfs-initramfs.txt @@ -70,13 +70,11 @@ tmpfs mounts. See Documentation/filesystems/tmpfs.txt for more information. What is rootfs? --------------- -Rootfs is a special instance of ramfs (or tmpfs, if that's enabled), which is -always present in 2.6 systems. You can't unmount rootfs for approximately the -same reason you can't kill the init process; rather than having special code -to check for and handle an empty list, it's smaller and simpler for the kernel -to just make sure certain lists can't become empty. +Rootfs is a special instance of ramfs, which is always present in 2.6 systems. +(It's used internally as the starting and stopping point for searches of the +kernel's doubly-linked list of mount points.) -Most systems just mount another filesystem over rootfs and ignore it. The +Most systems just mount another filesystem over it and ignore it. The amount of space an empty instance of ramfs takes up is tiny. What is initramfs? @@ -94,16 +92,14 @@ out of that. All this differs from the old initrd in several ways: - - The old initrd was always a separate file, while the initramfs archive is - linked into the linux kernel image. (The directory linux-*/usr is devoted - to generating this archive during the build.) + - The old initrd was a separate file, while the initramfs archive is linked + into the linux kernel image. (The directory linux-*/usr is devoted to + generating this archive during the build.) - The old initrd file was a gzipped filesystem image (in some file format, - such as ext2, that needed a driver built into the kernel), while the new + such as ext2, that had to be built into the kernel), while the new initramfs archive is a gzipped cpio archive (like tar only simpler, - see cpio(1) and Documentation/early-userspace/buffer-format.txt). The - kernel's cpio extraction code is not only extremely small, it's also - __init data that can be discarded during the boot process. + see cpio(1) and Documentation/early-userspace/buffer-format.txt). - The program run by the old initrd (which was called /initrd, not /init) did some setup and then returned to the kernel, while the init program from @@ -128,14 +124,13 @@ Populating initramfs: The 2.6 kernel build process always creates a gzipped cpio format initramfs archive and links it into the resulting kernel binary. By default, this -archive is empty (consuming 134 bytes on x86). - -The config option CONFIG_INITRAMFS_SOURCE (for some reason buried under -devices->block devices in menuconfig, and living in usr/Kconfig) can be used -to specify a source for the initramfs archive, which will automatically be -incorporated into the resulting binary. This option can point to an existing -gzipped cpio archive, a directory containing files to be archived, or a text -file specification such as the following example: +archive is empty (consuming 134 bytes on x86). The config option +CONFIG_INITRAMFS_SOURCE (for some reason buried under devices->block devices +in menuconfig, and living in usr/Kconfig) can be used to specify a source for +the initramfs archive, which will automatically be incorporated into the +resulting binary. This option can point to an existing gzipped cpio archive, a +directory containing files to be archived, or a text file specification such +as the following example: dir /dev 755 0 0 nod /dev/console 644 0 0 c 5 1 @@ -151,84 +146,23 @@ file specification such as the following example: Run "usr/gen_init_cpio" (after the kernel build) to get a usage message documenting the above file format. -One advantage of the configuration file is that root access is not required to +One advantage of the text file is that root access is not required to set permissions or create device nodes in the new archive. (Note that those two example "file" entries expect to find files named "init.sh" and "busybox" in a directory called "initramfs", under the linux-2.6.* directory. See Documentation/early-userspace/README for more details.) -The kernel does not depend on external cpio tools. If you specify a -directory instead of a configuration file, the kernel's build infrastructure -creates a configuration file from that directory (usr/Makefile calls -scripts/gen_initramfs_list.sh), and proceeds to package up that directory -using the config file (by feeding it to usr/gen_init_cpio, which is created -from usr/gen_init_cpio.c). The kernel's build-time cpio creation code is -entirely self-contained, and the kernel's boot-time extractor is also -(obviously) self-contained. - -The one thing you might need external cpio utilities installed for is creating -or extracting your own preprepared cpio files to feed to the kernel build -(instead of a config file or directory). - -The following command line can extract a cpio image (either by the above script -or by the kernel build) back into its component files: +The kernel does not depend on external cpio tools, gen_init_cpio is created +from usr/gen_init_cpio.c which is entirely self-contained, and the kernel's +boot-time extractor is also (obviously) self-contained. However, if you _do_ +happen to have cpio installed, the following command line can extract the +generated cpio image back into its component files: cpio -i -d -H newc -F initramfs_data.cpio --no-absolute-filenames -The following shell script can create a prebuilt cpio archive you can -use in place of the above config file: - - #!/bin/sh - - # Copyright 2006 Rob Landley and TimeSys Corporation. - # Licensed under GPL version 2 - - if [ $# -ne 2 ] - then - echo "usage: mkinitramfs directory imagename.cpio.gz" - exit 1 - fi - - if [ -d "$1" ] - then - echo "creating $2 from $1" - (cd "$1"; find . | cpio -o -H newc | gzip) > "$2" - else - echo "First argument must be a directory" - exit 1 - fi - -Note: The cpio man page contains some bad advice that will break your initramfs -archive if you follow it. It says "A typical way to generate the list -of filenames is with the find command; you should give find the -depth option -to minimize problems with permissions on directories that are unwritable or not -searchable." Don't do this when creating initramfs.cpio.gz images, it won't -work. The Linux kernel cpio extractor won't create files in a directory that -doesn't exist, so the directory entries must go before the files that go in -those directories. The above script gets them in the right order. - -External initramfs images: --------------------------- - -If the kernel has initrd support enabled, an external cpio.gz archive can also -be passed into a 2.6 kernel in place of an initrd. In this case, the kernel -will autodetect the type (initramfs, not initrd) and extract the external cpio -archive into rootfs before trying to run /init. - -This has the memory efficiency advantages of initramfs (no ramdisk block -device) but the separate packaging of initrd (which is nice if you have -non-GPL code you'd like to run from initramfs, without conflating it with -the GPL licensed Linux kernel binary). - -It can also be used to supplement the kernel's built-in initamfs image. The -files in the external archive will overwrite any conflicting files in -the built-in initramfs archive. Some distributors also prefer to customize -a single kernel image with task-specific initramfs images, without recompiling. - Contents of initramfs: ---------------------- -An initramfs archive is a complete self-contained root filesystem for Linux. If you don't already understand what shared libraries, devices, and paths you need to get a minimal root filesystem up and running, here are some references: @@ -242,36 +176,13 @@ code against, along with some related utilities. It is BSD licensed. I use uClibc (http://www.uclibc.org) and busybox (http://www.busybox.net) myself. These are LGPL and GPL, respectively. (A self-contained initramfs -package is planned for the busybox 1.3 release.) +package is planned for the busybox 1.2 release.) In theory you could use glibc, but that's not well suited for small embedded uses like this. (A "hello world" program statically linked against glibc is over 400k. With uClibc it's 7k. Also note that glibc dlopens libnss to do name lookups, even when otherwise statically linked.) -A good first step is to get initramfs to run a statically linked "hello world" -program as init, and test it under an emulator like qemu (www.qemu.org) or -User Mode Linux, like so: - - cat > hello.c << EOF - #include - #include - - int main(int argc, char *argv[]) - { - printf("Hello world!\n"); - sleep(999999999); - } - EOF - gcc -static hello2.c -o init - echo init | cpio -o -H newc | gzip > test.cpio.gz - # Testing external initramfs using the initrd loading mechanism. - qemu -kernel /boot/vmlinuz -initrd test.cpio.gz /dev/zero - -When debugging a normal root filesystem, it's nice to be able to boot with -"init=/bin/sh". The initramfs equivalent is "rdinit=/bin/sh", and it's -just as useful. - Why cpio rather than tar? ------------------------- @@ -330,7 +241,7 @@ the above threads) is: Future directions: ------------------ -Today (2.6.16), initramfs is always compiled in, but not always used. The +Today (2.6.14), initramfs is always compiled in, but not always used. The kernel falls back to legacy boot code that is reached only if initramfs does not contain an /init program. The fallback is legacy code, there to ensure a smooth transition and allowing early boot functionality to gradually move to @@ -347,9 +258,8 @@ and so on. This kind of complexity (which inevitably includes policy) is rightly handled in userspace. Both klibc and busybox/uClibc are working on simple initramfs -packages to drop into a kernel build. +packages to drop into a kernel build, and when standard solutions are ready +and widely deployed, the kernel's legacy early boot code will become obsolete +and a candidate for the feature removal schedule. -The klibc package has now been accepted into Andrew Morton's 2.6.17-mm tree. -The kernel's current early boot code (partition detection, etc) will probably -be migrated into a default initramfs, automatically created and used by the -kernel build. +But that's a while off yet. diff --git a/Documentation/filesystems/sysfs.txt b/Documentation/filesystems/sysfs.txt index 89b1d196c..c8bce82dd 100644 --- a/Documentation/filesystems/sysfs.txt +++ b/Documentation/filesystems/sysfs.txt @@ -246,7 +246,6 @@ class/ devices/ firmware/ net/ -fs/ devices/ contains a filesystem representation of the device tree. It maps directly to the internal kernel device tree, which is a hierarchy of @@ -265,10 +264,6 @@ drivers/ contains a directory for each device driver that is loaded for devices on that particular bus (this assumes that drivers do not span multiple bus types). -fs/ contains a directory for some filesystems. Currently each -filesystem wanting to export attributes must create its own hierarchy -below fs/ (see ./fuse.txt for an example). - More information can driver-model specific features can be found in Documentation/driver-model/. diff --git a/Documentation/filesystems/udf.txt b/Documentation/filesystems/udf.txt index 511b4230c..e5213bc30 100644 --- a/Documentation/filesystems/udf.txt +++ b/Documentation/filesystems/udf.txt @@ -26,20 +26,6 @@ The following mount options are supported: nostrict Unset strict conformance iocharset= Set the NLS character set -The uid= and gid= options need a bit more explaining. They will accept a -decimal numeric value which will be used as the default ID for that mount. -They will also accept the string "ignore" and "forget". For files on the disk -that are owned by nobody ( -1 ), they will instead look as if they are owned -by the default ID. The ignore option causes the default ID to override all -IDs on the disk, not just -1. The forget option causes all IDs to be written -to disk as -1, so when the media is later remounted, they will appear to be -owned by whatever default ID it is mounted with at that time. - -For typical desktop use of removable media, you should set the ID to that -of the interactively logged on user, and also specify both the forget and -ignore options. This way the interactive user will always see the files -on the disk as belonging to him. - The remaining are for debugging and disaster recovery: novrs Skip volume sequence recognition diff --git a/Documentation/filesystems/vfat.txt b/Documentation/filesystems/vfat.txt index 2001abbc6..5ead20c6c 100644 --- a/Documentation/filesystems/vfat.txt +++ b/Documentation/filesystems/vfat.txt @@ -28,16 +28,16 @@ iocharset=name -- Character set to use for converting between the know how to deal with Unicode. By default, FAT_DEFAULT_IOCHARSET setting is used. - There is also an option of doing UTF-8 translations + There is also an option of doing UTF8 translations with the utf8 option. NOTE: "iocharset=utf8" is not recommended. If unsure, you should consider the following option instead. -utf8= -- UTF-8 is the filesystem safe version of Unicode that +utf8= -- UTF8 is the filesystem safe version of Unicode that is used by the console. It can be be enabled for the filesystem with this option. If 'uni_xlate' gets set, - UTF-8 gets disabled. + UTF8 gets disabled. uni_xlate= -- Translate unhandled Unicode characters to special escaped sequences. This would let you backup and diff --git a/Documentation/filesystems/vfs.txt b/Documentation/filesystems/vfs.txt index 1cb7e8be9..e56e84284 100644 --- a/Documentation/filesystems/vfs.txt +++ b/Documentation/filesystems/vfs.txt @@ -113,8 +113,8 @@ members are defined: struct file_system_type { const char *name; int fs_flags; - int (*get_sb) (struct file_system_type *, int, - const char *, void *, struct vfsmount *); + struct super_block *(*get_sb) (struct file_system_type *, int, + const char *, void *); void (*kill_sb) (struct super_block *); struct module *owner; struct file_system_type * next; @@ -211,7 +211,7 @@ 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 dentry *, struct kstatfs *); + int (*statfs) (struct super_block *, struct kstatfs *); int (*remount_fs) (struct super_block *, int *, char *); void (*clear_inode) (struct inode *); void (*umount_begin) (struct super_block *); @@ -230,15 +230,10 @@ only called from a process context (i.e. not from an interrupt handler or bottom half). alloc_inode: this method is called by inode_alloc() to allocate memory - for struct inode and initialize it. If this function is not - defined, a simple 'struct inode' is allocated. Normally - alloc_inode will be used to allocate a larger structure which - contains a 'struct inode' embedded within it. + for struct inode and initialize it. destroy_inode: this method is called by destroy_inode() to release - resources allocated for struct inode. It is only required if - ->alloc_inode was defined and simply undoes anything done by - ->alloc_inode. + resources allocated for struct inode. read_inode: this method is called to read a specific inode from the mounted filesystem. The i_ino member in the struct inode is @@ -448,81 +443,14 @@ otherwise noted. The Address Space Object ======================== -The address space object is used to group and manage pages in the page -cache. It can be used to keep track of the pages in a file (or -anything else) and also track the mapping of sections of the file into -process address spaces. - -There are a number of distinct yet related services that an -address-space can provide. These include communicating memory -pressure, page lookup by address, and keeping track of pages tagged as -Dirty or Writeback. - -The first can be used independently to the others. The VM can try to -either write dirty pages in order to clean them, or release clean -pages in order to reuse them. To do this it can call the ->writepage -method on dirty pages, and ->releasepage on clean pages with -PagePrivate set. Clean pages without PagePrivate and with no external -references will be released without notice being given to the -address_space. - -To achieve this functionality, pages need to be placed on an LRU with -lru_cache_add and mark_page_active needs to be called whenever the -page is used. - -Pages are normally kept in a radix tree index by ->index. This tree -maintains information about the PG_Dirty and PG_Writeback status of -each page, so that pages with either of these flags can be found -quickly. - -The Dirty tag is primarily used by mpage_writepages - the default -->writepages method. It uses the tag to find dirty pages to call -->writepage on. If mpage_writepages is not used (i.e. the address -provides its own ->writepages) , the PAGECACHE_TAG_DIRTY tag is -almost unused. write_inode_now and sync_inode do use it (through -__sync_single_inode) to check if ->writepages has been successful in -writing out the whole address_space. - -The Writeback tag is used by filemap*wait* and sync_page* functions, -via wait_on_page_writeback_range, to wait for all writeback to -complete. While waiting ->sync_page (if defined) will be called on -each page that is found to require writeback. - -An address_space handler may attach extra information to a page, -typically using the 'private' field in the 'struct page'. If such -information is attached, the PG_Private flag should be set. This will -cause various VM routines to make extra calls into the address_space -handler to deal with that data. - -An address space acts as an intermediate between storage and -application. Data is read into the address space a whole page at a -time, and provided to the application either by copying of the page, -or by memory-mapping the page. -Data is written into the address space by the application, and then -written-back to storage typically in whole pages, however the -address_space has finer control of write sizes. - -The read process essentially only requires 'readpage'. The write -process is more complicated and uses prepare_write/commit_write or -set_page_dirty to write data into the address_space, and writepage, -sync_page, and writepages to writeback data to storage. - -Adding and removing pages to/from an address_space is protected by the -inode's i_mutex. - -When data is written to a page, the PG_Dirty flag should be set. It -typically remains set until writepage asks for it to be written. This -should clear PG_Dirty and set PG_Writeback. It can be actually -written at any point after PG_Dirty is clear. Once it is known to be -safe, PG_Writeback is cleared. - -Writeback makes use of a writeback_control structure... +The address space object is used to identify pages in the page cache. + struct address_space_operations ------------------------------- This describes how the VFS can manipulate mapping of a file to page cache in -your filesystem. As of kernel 2.6.16, the following members are defined: +your filesystem. As of kernel 2.6.13, the following members are defined: struct address_space_operations { int (*writepage)(struct page *page, struct writeback_control *wbc); @@ -541,148 +469,47 @@ struct address_space_operations { loff_t offset, unsigned long nr_segs); struct page* (*get_xip_page)(struct address_space *, sector_t, int); - /* migrate the contents of a page to the specified target */ - int (*migratepage) (struct page *, struct page *); }; - writepage: called by the VM to write a dirty page to backing store. - This may happen for data integrity reasons (i.e. 'sync'), or - to free up memory (flush). The difference can be seen in - wbc->sync_mode. - The PG_Dirty flag has been cleared and PageLocked is true. - writepage should start writeout, should set PG_Writeback, - and should make sure the page is unlocked, either synchronously - or asynchronously when the write operation completes. - - If wbc->sync_mode is WB_SYNC_NONE, ->writepage doesn't have to - try too hard if there are problems, and may choose to write out - other pages from the mapping if that is easier (e.g. due to - internal dependencies). If it chooses not to start writeout, it - should return AOP_WRITEPAGE_ACTIVATE so that the VM will not keep - calling ->writepage on that page. - - See the file "Locking" for more details. + writepage: called by the VM write a dirty page to backing store. readpage: called by the VM to read a page from backing store. - The page will be Locked when readpage is called, and should be - unlocked and marked uptodate once the read completes. - If ->readpage discovers that it needs to unlock the page for - some reason, it can do so, and then return AOP_TRUNCATED_PAGE. - In this case, the page will be relocated, relocked and if - that all succeeds, ->readpage will be called again. sync_page: called by the VM to notify the backing store to perform all queued I/O operations for a page. I/O operations for other pages associated with this address_space object may also be performed. - This function is optional and is called only for pages with - PG_Writeback set while waiting for the writeback to complete. - writepages: called by the VM to write out pages associated with the - address_space object. If wbc->sync_mode is WBC_SYNC_ALL, then - the writeback_control will specify a range of pages that must be - written out. If it is WBC_SYNC_NONE, then a nr_to_write is given - and that many pages should be written if possible. - If no ->writepages is given, then mpage_writepages is used - instead. This will choose pages from the address space that are - tagged as DIRTY and will pass them to ->writepage. + address_space object. set_page_dirty: called by the VM to set a page dirty. - This is particularly needed if an address space attaches - private data to a page, and that data needs to be updated when - a page is dirtied. This is called, for example, when a memory - mapped page gets modified. - If defined, it should set the PageDirty flag, and the - PAGECACHE_TAG_DIRTY tag in the radix tree. readpages: called by the VM to read pages associated with the address_space - object. This is essentially just a vector version of - readpage. Instead of just one page, several pages are - requested. - readpages is only used for read-ahead, so read errors are - ignored. If anything goes wrong, feel free to give up. + object. prepare_write: called by the generic write path in VM to set up a write - request for a page. This indicates to the address space that - the given range of bytes is about to be written. The - address_space should check that the write will be able to - complete, by allocating space if necessary and doing any other - internal housekeeping. If the write will update parts of - any basic-blocks on storage, then those blocks should be - pre-read (if they haven't been read already) so that the - updated blocks can be written out properly. - The page will be locked. If prepare_write wants to unlock the - page it, like readpage, may do so and return - AOP_TRUNCATED_PAGE. - In this case the prepare_write will be retried one the lock is - regained. - - commit_write: If prepare_write succeeds, new data will be copied - into the page and then commit_write will be called. It will - typically update the size of the file (if appropriate) and - mark the inode as dirty, and do any other related housekeeping - operations. It should avoid returning an error if possible - - errors should have been handled by prepare_write. + request for a page. + + commit_write: called by the generic write path in VM to write page to + its backing store. bmap: called by the VFS to map a logical block offset within object to - physical block number. This method is used by the FIBMAP - ioctl and for working with swap-files. To be able to swap to - a file, the file must have a stable mapping to a block - device. The swap system does not go through the filesystem - but instead uses bmap to find out where the blocks in the file - are and uses those addresses directly. - - - invalidatepage: If a page has PagePrivate set, then invalidatepage - will be called when part or all of the page is to be removed - from the address space. This generally corresponds to either a - truncation or a complete invalidation of the address space - (in the latter case 'offset' will always be 0). - Any private data associated with the page should be updated - to reflect this truncation. If offset is 0, then - the private data should be released, because the page - must be able to be completely discarded. This may be done by - calling the ->releasepage function, but in this case the - release MUST succeed. - - releasepage: releasepage is called on PagePrivate pages to indicate - that the page should be freed if possible. ->releasepage - should remove any private data from the page and clear the - PagePrivate flag. It may also remove the page from the - address_space. If this fails for some reason, it may indicate - failure with a 0 return value. - This is used in two distinct though related cases. The first - is when the VM finds a clean page with no active users and - wants to make it a free page. If ->releasepage succeeds, the - page will be removed from the address_space and become free. - - The second case if when a request has been made to invalidate - some or all pages in an address_space. This can happen - through the fadvice(POSIX_FADV_DONTNEED) system call or by the - filesystem explicitly requesting it as nfs and 9fs do (when - they believe the cache may be out of date with storage) by - calling invalidate_inode_pages2(). - If the filesystem makes such a call, and needs to be certain - that all pages are invalidated, then its releasepage will - need to ensure this. Possibly it can clear the PageUptodate - bit if it cannot free private data yet. - - direct_IO: called by the generic read/write routines to perform - direct_IO - that is IO requests which bypass the page cache - and transfer data directly between the storage and the - application's address space. + physical block number. This method is use by for the legacy FIBMAP + ioctl. Other uses are discouraged. + + invalidatepage: called by the VM on truncate to disassociate a page from its + address_space mapping. + + releasepage: called by the VFS to release filesystem specific metadata from + a page. + + direct_IO: called by the VM for direct I/O writes and reads. get_xip_page: called by the VM to translate a block number to a page. The page is valid until the corresponding filesystem is unmounted. Filesystems that want to use execute-in-place (XIP) need to implement it. An example implementation can be found in fs/ext2/xip.c. - migrate_page: This is used to compact the physical memory usage. - If the VM wants to relocate a page (maybe off a memory card - that is signalling imminent failure) it will pass a new page - and an old page to this function. migrate_page should - transfer any private data across and update any references - that it has to the page. The File Object =============== @@ -694,7 +521,7 @@ struct file_operations ---------------------- This describes how the VFS can manipulate an open file. As of kernel -2.6.17, the following members are defined: +2.6.13, the following members are defined: struct file_operations { loff_t (*llseek) (struct file *, loff_t, int); @@ -723,10 +550,6 @@ struct file_operations { int (*check_flags)(int); int (*dir_notify)(struct file *filp, unsigned long arg); int (*flock) (struct file *, int, struct file_lock *); - ssize_t (*splice_write)(struct pipe_inode_info *, struct file *, size_t, unsigned -int); - ssize_t (*splice_read)(struct file *, struct pipe_inode_info *, size_t, unsigned -int); }; Again, all methods are called without any locks being held, unless @@ -794,12 +617,6 @@ otherwise noted. flock: called by the flock(2) system call - splice_write: called by the VFS to splice data from a pipe to a file. This - method is used by the splice(2) system call - - splice_read: called by the VFS to splice data from file to a pipe. This - method is used by the splice(2) system call - Note that the file operations are implemented by the specific filesystem in which the inode resides. When opening a device node (character or block special) most filesystems will call special diff --git a/Documentation/firmware_class/README b/Documentation/firmware_class/README index e9cc8bb26..43e836c07 100644 --- a/Documentation/firmware_class/README +++ b/Documentation/firmware_class/README @@ -105,3 +105,20 @@ on the setup, so I think that the choice on what firmware to make persistent should be left to userspace. + - Why register_firmware()+__init can be useful: + - For boot devices needing firmware. + - To make the transition easier: + The firmware can be declared __init and register_firmware() + called on module_init. Then the firmware is warranted to be + there even if "firmware hotplug userspace" is not there yet or + it doesn't yet provide the needed firmware. + Once the firmware is widely available in userspace, it can be + removed from the kernel. Or made optional (CONFIG_.*_FIRMWARE). + + In either case, if firmware hotplug support is there, it can move the + firmware out of kernel memory into the real filesystem for later + usage. + + Note: If persistence is implemented on top of initramfs, + register_firmware() may not be appropriate. + diff --git a/Documentation/firmware_class/firmware_sample_driver.c b/Documentation/firmware_class/firmware_sample_driver.c index 87feccdb5..d3ad2c244 100644 --- a/Documentation/firmware_class/firmware_sample_driver.c +++ b/Documentation/firmware_class/firmware_sample_driver.c @@ -5,6 +5,8 @@ * * Sample code on how to use request_firmware() from drivers. * + * Note that register_firmware() is currently useless. + * */ #include @@ -15,7 +17,13 @@ #include "linux/firmware.h" +#define WE_CAN_NEED_FIRMWARE_BEFORE_USERSPACE_IS_AVAILABLE +#ifdef WE_CAN_NEED_FIRMWARE_BEFORE_USERSPACE_IS_AVAILABLE +char __init inkernel_firmware[] = "let's say that this is firmware\n"; +#endif + static struct device ghost_device = { + .name = "Ghost Device", .bus_id = "ghost0", }; @@ -84,7 +92,7 @@ static void sample_probe_async(void) { /* Let's say that I can't sleep */ int error; - error = request_firmware_nowait (THIS_MODULE, FW_ACTION_NOHOTPLUG, + error = request_firmware_nowait (THIS_MODULE, "sample_driver_fw", &ghost_device, "my device pointer", sample_probe_async_cont); @@ -97,6 +105,10 @@ static void sample_probe_async(void) static int sample_init(void) { +#ifdef WE_CAN_NEED_FIRMWARE_BEFORE_USERSPACE_IS_AVAILABLE + register_firmware("sample_driver_fw", inkernel_firmware, + sizeof(inkernel_firmware)); +#endif device_initialize(&ghost_device); /* since there is no real hardware insertion I just call the * sample probe functions here */ diff --git a/Documentation/firmware_class/firmware_sample_firmware_class.c b/Documentation/firmware_class/firmware_sample_firmware_class.c index 9e1b0e405..57b956aec 100644 --- a/Documentation/firmware_class/firmware_sample_firmware_class.c +++ b/Documentation/firmware_class/firmware_sample_firmware_class.c @@ -172,6 +172,7 @@ static void fw_remove_class_device(struct class_device *class_dev) static struct class_device *class_dev; static struct device my_device = { + .name = "Sample Device", .bus_id = "my_dev0", }; diff --git a/Documentation/fujitsu/frv/kernel-ABI.txt b/Documentation/fujitsu/frv/kernel-ABI.txt index 8b0a5fc8b..0ed9b0a77 100644 --- a/Documentation/fujitsu/frv/kernel-ABI.txt +++ b/Documentation/fujitsu/frv/kernel-ABI.txt @@ -1,19 +1,17 @@ - ================================= - INTERNAL KERNEL ABI FOR FR-V ARCH - ================================= - -The internal FRV kernel ABI is not quite the same as the userspace ABI. A -number of the registers are used for special purposed, and the ABI is not -consistent between modules vs core, and MMU vs no-MMU. - -This partly stems from the fact that FRV CPUs do not have a separate -supervisor stack pointer, and most of them do not have any scratch -registers, thus requiring at least one general purpose register to be -clobbered in such an event. Also, within the kernel core, it is possible to -simply jump or call directly between functions using a relative offset. -This cannot be extended to modules for the displacement is likely to be too -far. Thus in modules the address of a function to call must be calculated -in a register and then used, requiring two extra instructions. + ================================= + INTERNAL KERNEL ABI FOR FR-V ARCH + ================================= + +The internal FRV kernel ABI is not quite the same as the userspace ABI. A number of the registers +are used for special purposed, and the ABI is not consistent between modules vs core, and MMU vs +no-MMU. + +This partly stems from the fact that FRV CPUs do not have a separate supervisor stack pointer, and +most of them do not have any scratch registers, thus requiring at least one general purpose +register to be clobbered in such an event. Also, within the kernel core, it is possible to simply +jump or call directly between functions using a relative offset. This cannot be extended to modules +for the displacement is likely to be too far. Thus in modules the address of a function to call +must be calculated in a register and then used, requiring two extra instructions. This document has the following sections: @@ -41,8 +39,7 @@ When a system call is made, the following registers are effective: CPU OPERATING MODES =================== -The FR-V CPU has three basic operating modes. In order of increasing -capability: +The FR-V CPU has three basic operating modes. In order of increasing capability: (1) User mode. @@ -50,46 +47,42 @@ capability: (2) Kernel mode. - Normal kernel mode. There are many additional control registers - available that may be accessed in this mode, in addition to all the - stuff available to user mode. This has two submodes: + Normal kernel mode. There are many additional control registers available that may be + accessed in this mode, in addition to all the stuff available to user mode. This has two + submodes: (a) Exceptions enabled (PSR.T == 1). - Exceptions will invoke the appropriate normal kernel mode - handler. On entry to the handler, the PSR.T bit will be cleared. + Exceptions will invoke the appropriate normal kernel mode handler. On entry to the + handler, the PSR.T bit will be cleared. (b) Exceptions disabled (PSR.T == 0). - No exceptions or interrupts may happen. Any mandatory exceptions - will cause the CPU to halt unless the CPU is told to jump into - debug mode instead. + No exceptions or interrupts may happen. Any mandatory exceptions will cause the CPU to + halt unless the CPU is told to jump into debug mode instead. (3) Debug mode. - No exceptions may happen in this mode. Memory protection and - management exceptions will be flagged for later consideration, but - the exception handler won't be invoked. Debugging traps such as - hardware breakpoints and watchpoints will be ignored. This mode is - entered only by debugging events obtained from the other two modes. + No exceptions may happen in this mode. Memory protection and management exceptions will be + flagged for later consideration, but the exception handler won't be invoked. Debugging traps + such as hardware breakpoints and watchpoints will be ignored. This mode is entered only by + debugging events obtained from the other two modes. - All kernel mode registers may be accessed, plus a few extra debugging - specific registers. + All kernel mode registers may be accessed, plus a few extra debugging specific registers. ================================= INTERNAL KERNEL-MODE REGISTER ABI ================================= -There are a number of permanent register assignments that are set up by -entry.S in the exception prologue. Note that there is a complete set of -exception prologues for each of user->kernel transition and kernel->kernel -transition. There are also user->debug and kernel->debug mode transition -prologues. +There are a number of permanent register assignments that are set up by entry.S in the exception +prologue. Note that there is a complete set of exception prologues for each of user->kernel +transition and kernel->kernel transition. There are also user->debug and kernel->debug mode +transition prologues. REGISTER FLAVOUR USE - =============== ======= ============================================== + =============== ======= ==================================================== GR1 Supervisor stack pointer GR15 Current thread info pointer GR16 GP-Rel base register for small data @@ -99,12 +92,10 @@ prologues. GR31 NOMMU Destroyed by debug mode entry GR31 MMU Destroyed by TLB miss kernel mode entry CCR.ICC2 Virtual interrupt disablement tracking - CCCR.CC3 Cleared by exception prologue - (atomic op emulation) + CCCR.CC3 Cleared by exception prologue (atomic op emulation) SCR0 MMU See mmu-layout.txt. SCR1 MMU See mmu-layout.txt. - SCR2 MMU Save for EAR0 (destroyed by icache insns - in debug mode) + SCR2 MMU Save for EAR0 (destroyed by icache insns in debug mode) SCR3 MMU Save for GR31 during debug exceptions DAMR/IAMR NOMMU Fixed memory protection layout. DAMR/IAMR MMU See mmu-layout.txt. @@ -113,21 +104,18 @@ prologues. Certain registers are also used or modified across function calls: REGISTER CALL RETURN - =============== =============================== ====================== + =============== =============================== =============================== GR0 Fixed Zero - GR2 Function call frame pointer GR3 Special Preserved GR3-GR7 - Clobbered - GR8 Function call arg #1 Return value - (or clobbered) - GR9 Function call arg #2 Return value MSW - (or clobbered) + GR8 Function call arg #1 Return value (or clobbered) + GR9 Function call arg #2 Return value MSW (or clobbered) GR10-GR13 Function call arg #3-#6 Clobbered GR14 - Clobbered GR15-GR16 Special Preserved GR17-GR27 - Preserved - GR28-GR31 Special Only accessed - explicitly + GR28-GR31 Special Only accessed explicitly LR Return address after CALL Clobbered CCR/CCCR - Mostly Clobbered @@ -136,53 +124,46 @@ Certain registers are also used or modified across function calls: INTERNAL DEBUG-MODE REGISTER ABI ================================ -This is the same as the kernel-mode register ABI for functions calls. The -difference is that in debug-mode there's a different stack and a different -exception frame. Almost all the global registers from kernel-mode -(including the stack pointer) may be changed. +This is the same as the kernel-mode register ABI for functions calls. The difference is that in +debug-mode there's a different stack and a different exception frame. Almost all the global +registers from kernel-mode (including the stack pointer) may be changed. REGISTER FLAVOUR USE - =============== ======= ============================================== + =============== ======= ==================================================== GR1 Debug stack pointer GR16 GP-Rel base register for small data - GR31 Current debug exception frame pointer - (__debug_frame) + GR31 Current debug exception frame pointer (__debug_frame) SCR3 MMU Saved value of GR31 -Note that debug mode is able to interfere with the kernel's emulated atomic -ops, so it must be exceedingly careful not to do any that would interact -with the main kernel in this regard. Hence the debug mode code (gdbstub) is -almost completely self-contained. The only external code used is the -sprintf family of functions. +Note that debug mode is able to interfere with the kernel's emulated atomic ops, so it must be +exceedingly careful not to do any that would interact with the main kernel in this regard. Hence +the debug mode code (gdbstub) is almost completely self-contained. The only external code used is +the sprintf family of functions. -Futhermore, break.S is so complicated because single-step mode does not -switch off on entry to an exception. That means unless manually disabled, -single-stepping will blithely go on stepping into things like interrupts. -See gdbstub.txt for more information. +Futhermore, break.S is so complicated because single-step mode does not switch off on entry to an +exception. That means unless manually disabled, single-stepping will blithely go on stepping into +things like interrupts. See gdbstub.txt for more information. ========================== VIRTUAL INTERRUPT HANDLING ========================== -Because accesses to the PSR is so slow, and to disable interrupts we have -to access it twice (once to read and once to write), we don't actually -disable interrupts at all if we don't have to. What we do instead is use -the ICC2 condition code flags to note virtual disablement, such that if we -then do take an interrupt, we note the flag, really disable interrupts, set -another flag and resume execution at the point the interrupt happened. -Setting condition flags as a side effect of an arithmetic or logical -instruction is really fast. This use of the ICC2 only occurs within the +Because accesses to the PSR is so slow, and to disable interrupts we have to access it twice (once +to read and once to write), we don't actually disable interrupts at all if we don't have to. What +we do instead is use the ICC2 condition code flags to note virtual disablement, such that if we +then do take an interrupt, we note the flag, really disable interrupts, set another flag and resume +execution at the point the interrupt happened. Setting condition flags as a side effect of an +arithmetic or logical instruction is really fast. This use of the ICC2 only occurs within the kernel - it does not affect userspace. The flags we use are: (*) CCR.ICC2.Z [Zero flag] - Set to virtually disable interrupts, clear when interrupts are - virtually enabled. Can be modified by logical instructions without - affecting the Carry flag. + Set to virtually disable interrupts, clear when interrupts are virtually enabled. Can be + modified by logical instructions without affecting the Carry flag. (*) CCR.ICC2.C [Carry flag] @@ -195,9 +176,8 @@ What happens is this: ICC2.Z is 0, ICC2.C is 1. - (2) An interrupt occurs. The exception prologue examines ICC2.Z and - determines that nothing needs doing. This is done simply with an - unlikely BEQ instruction. + (2) An interrupt occurs. The exception prologue examines ICC2.Z and determines that nothing needs + doing. This is done simply with an unlikely BEQ instruction. (3) The interrupts are disabled (local_irq_disable) @@ -207,56 +187,48 @@ What happens is this: ICC2.Z would be set to 0. - A TIHI #2 instruction (trap #2 if condition HI - Z==0 && C==0) would - be used to trap if interrupts were now virtually enabled, but - physically disabled - which they're not, so the trap isn't taken. The - kernel would then be back to state (1). + A TIHI #2 instruction (trap #2 if condition HI - Z==0 && C==0) would be used to trap if + interrupts were now virtually enabled, but physically disabled - which they're not, so the + trap isn't taken. The kernel would then be back to state (1). - (5) An interrupt occurs. The exception prologue examines ICC2.Z and - determines that the interrupt shouldn't actually have happened. It - jumps aside, and there disabled interrupts by setting PSR.PIL to 14 - and then it clears ICC2.C. + (5) An interrupt occurs. The exception prologue examines ICC2.Z and determines that the interrupt + shouldn't actually have happened. It jumps aside, and there disabled interrupts by setting + PSR.PIL to 14 and then it clears ICC2.C. (6) If interrupts were then saved and disabled again (local_irq_save): - ICC2.Z would be shifted into the save variable and masked off - (giving a 1). + ICC2.Z would be shifted into the save variable and masked off (giving a 1). - ICC2.Z would then be set to 1 (thus unchanged), and ICC2.C would be - unaffected (ie: 0). + ICC2.Z would then be set to 1 (thus unchanged), and ICC2.C would be unaffected (ie: 0). (7) If interrupts were then restored from state (6) (local_irq_restore): - ICC2.Z would be set to indicate the result of XOR'ing the saved - value (ie: 1) with 1, which gives a result of 0 - thus leaving - ICC2.Z set. + ICC2.Z would be set to indicate the result of XOR'ing the saved value (ie: 1) with 1, which + gives a result of 0 - thus leaving ICC2.Z set. ICC2.C would remain unaffected (ie: 0). - A TIHI #2 instruction would be used to again assay the current state, - but this would do nothing as Z==1. + A TIHI #2 instruction would be used to again assay the current state, but this would do + nothing as Z==1. (8) If interrupts were then enabled (local_irq_enable): - ICC2.Z would be cleared. ICC2.C would be left unaffected. Both - flags would now be 0. + ICC2.Z would be cleared. ICC2.C would be left unaffected. Both flags would now be 0. - A TIHI #2 instruction again issued to assay the current state would - then trap as both Z==0 [interrupts virtually enabled] and C==0 - [interrupts really disabled] would then be true. + A TIHI #2 instruction again issued to assay the current state would then trap as both Z==0 + [interrupts virtually enabled] and C==0 [interrupts really disabled] would then be true. - (9) The trap #2 handler would simply enable hardware interrupts - (set PSR.PIL to 0), set ICC2.C to 1 and return. + (9) The trap #2 handler would simply enable hardware interrupts (set PSR.PIL to 0), set ICC2.C to + 1 and return. (10) Immediately upon returning, the pending interrupt would be taken. -(11) The interrupt handler would take the path of actually processing the - interrupt (ICC2.Z is clear, BEQ fails as per step (2)). +(11) The interrupt handler would take the path of actually processing the interrupt (ICC2.Z is + clear, BEQ fails as per step (2)). -(12) The interrupt handler would then set ICC2.C to 1 since hardware - interrupts are definitely enabled - or else the kernel wouldn't be here. +(12) The interrupt handler would then set ICC2.C to 1 since hardware interrupts are definitely + enabled - or else the kernel wouldn't be here. (13) On return from the interrupt handler, things would be back to state (1). -This trap (#2) is only available in kernel mode. In user mode it will -result in SIGILL. +This trap (#2) is only available in kernel mode. In user mode it will result in SIGILL. diff --git a/Documentation/hwmon/lm83 b/Documentation/hwmon/lm83 index f7aad1489..061d9ed8f 100644 --- a/Documentation/hwmon/lm83 +++ b/Documentation/hwmon/lm83 @@ -7,10 +7,6 @@ Supported chips: Addresses scanned: I2C 0x18 - 0x1a, 0x29 - 0x2b, 0x4c - 0x4e Datasheet: Publicly available at the National Semiconductor website http://www.national.com/pf/LM/LM83.html - * National Semiconductor LM82 - Addresses scanned: I2C 0x18 - 0x1a, 0x29 - 0x2b, 0x4c - 0x4e - Datasheet: Publicly available at the National Semiconductor website - http://www.national.com/pf/LM/LM82.html Author: Jean Delvare @@ -19,11 +15,10 @@ Description ----------- The LM83 is a digital temperature sensor. It senses its own temperature as -well as the temperature of up to three external diodes. The LM82 is -a stripped down version of the LM83 that only supports one external diode. -Both are compatible with many other devices such as the LM84 and all -other ADM1021 clones. The main difference between the LM83 and the LM84 -in that the later can only sense the temperature of one external diode. +well as the temperature of up to three external diodes. It is compatible +with many other devices such as the LM84 and all other ADM1021 clones. +The main difference between the LM83 and the LM84 in that the later can +only sense the temperature of one external diode. Using the adm1021 driver for a LM83 should work, but only two temperatures will be reported instead of four. @@ -35,16 +30,12 @@ contact us. Note that the LM90 can easily be misdetected as a LM83. Confirmed motherboards: SBS P014 - SBS PSL09 Unconfirmed motherboards: Gigabyte GA-8IK1100 Iwill MPX2 Soltek SL-75DRV5 -The LM82 is confirmed to have been found on most AMD Geode reference -designs and test platforms. - The driver has been successfully tested by Magnus Forsström, who I'd like to thank here. More testers will be of course welcome. diff --git a/Documentation/hwmon/sysfs-interface b/Documentation/hwmon/sysfs-interface index d1d390aaf..a0d0ab242 100644 --- a/Documentation/hwmon/sysfs-interface +++ b/Documentation/hwmon/sysfs-interface @@ -3,15 +3,15 @@ Naming and data format standards for sysfs files The libsensors library offers an interface to the raw sensors data through the sysfs interface. See libsensors documentation and source for -further information. As of writing this document, libsensors -(from lm_sensors 2.8.3) is heavily chip-dependent. Adding or updating +more further information. As of writing this document, libsensors +(from lm_sensors 2.8.3) is heavily chip-dependant. Adding or updating support for any given chip requires modifying the library's code. This is because libsensors was written for the procfs interface older kernel modules were using, which wasn't standardized enough. Recent versions of libsensors (from lm_sensors 2.8.2 and later) have support for the sysfs interface, though. -The new sysfs interface was designed to be as chip-independent as +The new sysfs interface was designed to be as chip-independant as possible. Note that motherboards vary widely in the connections to sensor chips. @@ -24,7 +24,7 @@ range using external resistors. Since the values of these resistors can change from motherboard to motherboard, the conversions cannot be hard coded into the driver and have to be done in user space. -For this reason, even if we aim at a chip-independent libsensors, it will +For this reason, even if we aim at a chip-independant libsensors, it will still require a configuration file (e.g. /etc/sensors.conf) for proper values conversion, labeling of inputs and hiding of unused inputs. @@ -39,16 +39,15 @@ If you are developing a userspace application please send us feedback on this standard. Note that this standard isn't completely established yet, so it is subject -to changes. If you are writing a new hardware monitoring driver those -features can't seem to fit in this interface, please contact us with your -extension proposal. Keep in mind that backward compatibility must be -preserved. +to changes, even important ones. One more reason to use the library instead +of accessing sysfs files directly. Each chip gets its own directory in the sysfs /sys/devices tree. To -find all sensor chips, it is easier to follow the device symlinks from -/sys/class/hwmon/hwmon*. +find all sensor chips, it is easier to follow the symlinks from +/sys/i2c/devices/ -All sysfs values are fixed point numbers. +All sysfs values are fixed point numbers. To get the true value of some +of the values, you should divide by the specified value. There is only one value per file, unlike the older /proc specification. The common scheme for files naming is: _. Usual @@ -70,40 +69,28 @@ to cause an alarm) is chip-dependent. ------------------------------------------------------------------------- -[0-*] denotes any positive number starting from 0 -[1-*] denotes any positive number starting from 1 -RO read only value -RW read/write value - -Read/write values may be read-only for some chips, depending on the -hardware implementation. - -All entries are optional, and should only be created in a given driver -if the chip has the feature. - ************ * Voltages * ************ -in[0-*]_min Voltage min value. +in[0-8]_min Voltage min value. Unit: millivolt - RW + Read/Write -in[0-*]_max Voltage max value. +in[0-8]_max Voltage max value. Unit: millivolt - RW + Read/Write -in[0-*]_input Voltage input value. +in[0-8]_input Voltage input value. Unit: millivolt - RO - Voltage measured on the chip pin. + Read only Actual voltage depends on the scaling resistors on the motherboard, as recommended in the chip datasheet. This varies by chip and by motherboard. Because of this variation, values are generally NOT scaled by the chip driver, and must be done by the application. However, some drivers (notably lm87 and via686a) - do scale, because of internal resistors built into a chip. + do scale, with various degrees of success. These drivers will output the actual voltage. Typical usage: @@ -117,72 +104,58 @@ in[0-*]_input Voltage input value. in7_* varies in8_* varies -cpu[0-*]_vid CPU core reference voltage. +cpu[0-1]_vid CPU core reference voltage. Unit: millivolt - RO + Read only. Not always correct. vrm Voltage Regulator Module version number. - RW (but changing it should no more be necessary) - Originally the VRM standard version multiplied by 10, but now - an arbitrary number, as not all standards have a version - number. + Read only. + Two digit number, first is major version, second is + minor version. Affects the way the driver calculates the CPU core reference voltage from the vid pins. -Also see the Alarms section for status flags associated with voltages. - ******** * Fans * ******** -fan[1-*]_min Fan minimum value +fan[1-3]_min Fan minimum value Unit: revolution/min (RPM) - RW + Read/Write. -fan[1-*]_input Fan input value. +fan[1-3]_input Fan input value. Unit: revolution/min (RPM) - RO + Read only. -fan[1-*]_div Fan divisor. +fan[1-3]_div Fan divisor. Integer value in powers of two (1, 2, 4, 8, 16, 32, 64, 128). - RW Some chips only support values 1, 2, 4 and 8. Note that this is actually an internal clock divisor, which affects the measurable speed range, not the read value. -Also see the Alarms section for status flags associated with fans. - - ******* * PWM * ******* -pwm[1-*] Pulse width modulation fan control. +pwm[1-3] Pulse width modulation fan control. Integer value in the range 0 to 255 - RW + Read/Write 255 is max or 100%. -pwm[1-*]_enable +pwm[1-3]_enable Switch PWM on and off. Not always present even if fan*_pwm is. - 0: turn off - 1: turn on in manual mode - 2+: turn on in automatic mode - Check individual chip documentation files for automatic mode details. - RW - -pwm[1-*]_mode - 0: DC mode - 1: PWM mode - RW + 0 to turn off + 1 to turn on in manual mode + 2 to turn on in automatic mode + Read/Write pwm[1-*]_auto_channels_temp Select which temperature channels affect this PWM output in auto mode. Bitfield, 1 is temp1, 2 is temp2, 4 is temp3 etc... Which values are possible depend on the chip used. - RW pwm[1-*]_auto_point[1-*]_pwm pwm[1-*]_auto_point[1-*]_temp @@ -190,7 +163,6 @@ pwm[1-*]_auto_point[1-*]_temp_hyst Define the PWM vs temperature curve. Number of trip points is chip-dependent. Use this for chips which associate trip points to PWM output channels. - RW OR @@ -200,57 +172,50 @@ temp[1-*]_auto_point[1-*]_temp_hyst Define the PWM vs temperature curve. Number of trip points is chip-dependent. Use this for chips which associate trip points to temperature channels. - RW **************** * Temperatures * **************** -temp[1-*]_type Sensor type selection. +temp[1-3]_type Sensor type selection. Integers 1 to 4 or thermistor Beta value (typically 3435) - RW + Read/Write. 1: PII/Celeron Diode 2: 3904 transistor 3: thermal diode 4: thermistor (default/unknown Beta) Not all types are supported by all chips -temp[1-*]_max Temperature max value. - Unit: millidegree Celsius (or millivolt, see below) - RW +temp[1-4]_max Temperature max value. + Unit: millidegree Celcius + Read/Write value. -temp[1-*]_min Temperature min value. - Unit: millidegree Celsius - RW +temp[1-3]_min Temperature min value. + Unit: millidegree Celcius + Read/Write value. -temp[1-*]_max_hyst +temp[1-3]_max_hyst Temperature hysteresis value for max limit. - Unit: millidegree Celsius + Unit: millidegree Celcius Must be reported as an absolute temperature, NOT a delta from the max value. - RW + Read/Write value. -temp[1-*]_input Temperature input value. - Unit: millidegree Celsius - RO +temp[1-4]_input Temperature input value. + Unit: millidegree Celcius + Read only value. -temp[1-*]_crit Temperature critical value, typically greater than +temp[1-4]_crit Temperature critical value, typically greater than corresponding temp_max values. - Unit: millidegree Celsius - RW + Unit: millidegree Celcius + Read/Write value. -temp[1-*]_crit_hyst +temp[1-2]_crit_hyst Temperature hysteresis value for critical limit. - Unit: millidegree Celsius + Unit: millidegree Celcius Must be reported as an absolute temperature, NOT a delta from the critical value. - RW - -temp[1-4]_offset - Temperature offset which is added to the temperature reading - by the chip. - Unit: millidegree Celsius Read/Write value. If there are multiple temperature sensors, temp1_* is @@ -260,17 +225,6 @@ temp[1-4]_offset itself, for example the thermal diode inside the CPU or a thermistor nearby. -Some chips measure temperature using external thermistors and an ADC, and -report the temperature measurement as a voltage. Converting this voltage -back to a temperature (or the other way around for limits) requires -mathematical functions not available in the kernel, so the conversion -must occur in user space. For these chips, all temp* files described -above should contain values expressed in millivolt instead of millidegree -Celsius. In other words, such temperature channels are handled as voltage -channels by the driver. - -Also see the Alarms section for status flags associated with temperatures. - ************ * Currents * @@ -279,88 +233,25 @@ Also see the Alarms section for status flags associated with temperatures. Note that no known chip provides current measurements as of writing, so this part is theoretical, so to say. -curr[1-*]_max Current max value +curr[1-n]_max Current max value Unit: milliampere - RW + Read/Write. -curr[1-*]_min Current min value. +curr[1-n]_min Current min value. Unit: milliampere - RW + Read/Write. -curr[1-*]_input Current input value +curr[1-n]_input Current input value Unit: milliampere - RO - + Read only. -********** -* Alarms * -********** -Each channel or limit may have an associated alarm file, containing a -boolean value. 1 means than an alarm condition exists, 0 means no alarm. - -Usually a given chip will either use channel-related alarms, or -limit-related alarms, not both. The driver should just reflect the hardware -implementation. - -in[0-*]_alarm -fan[1-*]_alarm -temp[1-*]_alarm - Channel alarm - 0: no alarm - 1: alarm - RO - -OR - -in[0-*]_min_alarm -in[0-*]_max_alarm -fan[1-*]_min_alarm -temp[1-*]_min_alarm -temp[1-*]_max_alarm -temp[1-*]_crit_alarm - Limit alarm - 0: no alarm - 1: alarm - RO - -Each input channel may have an associated fault file. This can be used -to notify open diodes, unconnected fans etc. where the hardware -supports it. When this boolean has value 1, the measurement for that -channel should not be trusted. - -in[0-*]_input_fault -fan[1-*]_input_fault -temp[1-*]_input_fault - Input fault condition - 0: no fault occured - 1: fault condition - RO - -Some chips also offer the possibility to get beeped when an alarm occurs: - -beep_enable Master beep enable - 0: no beeps - 1: beeps - RW - -in[0-*]_beep -fan[1-*]_beep -temp[1-*]_beep - Channel beep - 0: disable - 1: enable - RW - -In theory, a chip could provide per-limit beep masking, but no such chip -was seen so far. - -Old drivers provided a different, non-standard interface to alarms and -beeps. These interface files are deprecated, but will be kept around -for compatibility reasons: +********* +* Other * +********* alarms Alarm bitmask. - RO + Read only. Integer representation of one to four bytes. A '1' bit means an alarm. Chips should be programmed for 'comparator' mode so that @@ -368,26 +259,35 @@ alarms Alarm bitmask. if it is still valid. Generally a direct representation of a chip's internal alarm registers; there is no standard for the position - of individual bits. For this reason, the use of this - interface file for new drivers is discouraged. Use - individual *_alarm and *_fault files instead. + of individual bits. Bits are defined in kernel/include/sensors.h. -beep_mask Bitmask for beep. - Same format as 'alarms' with the same bit locations, - use discouraged for the same reason. Use individual - *_beep files instead. - RW +alarms_in Alarm bitmask relative to in (voltage) channels + Read only + A '1' bit means an alarm, LSB corresponds to in0 and so on + Prefered to 'alarms' for newer chips +alarms_fan Alarm bitmask relative to fan channels + Read only + A '1' bit means an alarm, LSB corresponds to fan1 and so on + Prefered to 'alarms' for newer chips -********* -* Other * -********* +alarms_temp Alarm bitmask relative to temp (temperature) channels + Read only + A '1' bit means an alarm, LSB corresponds to temp1 and so on + Prefered to 'alarms' for newer chips + +beep_enable Beep/interrupt enable + 0 to disable. + 1 to enable. + Read/Write + +beep_mask Bitmask for beep. + Same format as 'alarms' with the same bit locations. + Read/Write eeprom Raw EEPROM data in binary form. - RO + Read only. pec Enable or disable PEC (SMBus only) - 0: disable - 1: enable - RW + Read/Write diff --git a/Documentation/hwmon/userspace-tools b/Documentation/hwmon/userspace-tools index 19900a8fe..2622aac65 100644 --- a/Documentation/hwmon/userspace-tools +++ b/Documentation/hwmon/userspace-tools @@ -6,32 +6,31 @@ voltages, fans speed). They are often connected through an I2C bus, but some are also connected directly through the ISA bus. The kernel drivers make the data from the sensor chips available in the /sys -virtual filesystem. Userspace tools are then used to display the measured -values or configure the chips in a more friendly manner. +virtual filesystem. Userspace tools are then used to display or set or the +data in a more friendly manner. Lm-sensors ---------- -Core set of utilities that will allow you to obtain health information, +Core set of utilites that will allow you to obtain health information, setup monitoring limits etc. You can get them on their homepage http://www.lm-sensors.nu/ or as a package from your Linux distribution. If from website: -Get lm-sensors from project web site. Please note, you need only userspace -part, so compile with "make user" and install with "make user_install". +Get lmsensors from project web site. Please note, you need only userspace +part, so compile with "make user_install" target. General hints to get things working: 0) get lm-sensors userspace utils -1) compile all drivers in I2C and Hardware Monitoring sections as modules - in your kernel +1) compile all drivers in I2C section as modules in your kernel 2) run sensors-detect script, it will tell you what modules you need to load. 3) load them and run "sensors" command, you should see some results. 4) fix sensors.conf, labels, limits, fan divisors 5) if any more problems consult FAQ, or documentation -Other utilities ---------------- +Other utilites +-------------- If you want some graphical indicators of system health look for applications like: gkrellm, ksensors, xsensors, wmtemp, wmsensors, wmgtemp, ksysguardd, diff --git a/Documentation/hwmon/w83627hf b/Documentation/hwmon/w83627hf index 792231921..bbeaba680 100644 --- a/Documentation/hwmon/w83627hf +++ b/Documentation/hwmon/w83627hf @@ -18,10 +18,6 @@ Supported chips: Prefix: 'w83637hf' Addresses scanned: ISA address retrieved from Super I/O registers Datasheet: http://www.winbond.com/PDF/sheet/w83637hf.pdf - * Winbond W83687THF - Prefix: 'w83687thf' - Addresses scanned: ISA address retrieved from Super I/O registers - Datasheet: Provided by Winbond on request Authors: Frodo Looijaard , diff --git a/Documentation/hwmon/w83781d b/Documentation/hwmon/w83781d index b1e9f8009..e5459333b 100644 --- a/Documentation/hwmon/w83781d +++ b/Documentation/hwmon/w83781d @@ -36,11 +36,6 @@ Module parameters Use 'init=0' to bypass initializing the chip. Try this if your computer crashes when you load the module. -* reset int - (default 0) - The driver used to reset the chip on load, but does no more. Use - 'reset=1' to restore the old behavior. Report if you need to do this. - force_subclients=bus,caddr,saddr,saddr This is used to force the i2c addresses for subclients of a certain chip. Typical usage is `force_subclients=0,0x2d,0x4a,0x4b' @@ -128,25 +123,6 @@ When an alarm goes off, you can be warned by a beeping signal through your computer speaker. It is possible to enable all beeping globally, or only the beeping for some alarms. -Individual alarm and beep bits: - -0x000001: in0 -0x000002: in1 -0x000004: in2 -0x000008: in3 -0x000010: temp1 -0x000020: temp2 (+temp3 on W83781D) -0x000040: fan1 -0x000080: fan2 -0x000100: in4 -0x000200: in5 -0x000400: in6 -0x000800: fan3 -0x001000: chassis -0x002000: temp3 (W83782D and W83627HF only) -0x010000: in7 (W83782D and W83627HF only) -0x020000: in8 (W83782D and W83627HF only) - If an alarm triggers, it will remain triggered until the hardware register is read at least once. This means that the cause for the alarm may already have disappeared! Note that in the current implementation, all diff --git a/Documentation/i2c/busses/i2c-i801 b/Documentation/i2c/busses/i2c-i801 index e46c23458..fd4b2712d 100644 --- a/Documentation/i2c/busses/i2c-i801 +++ b/Documentation/i2c/busses/i2c-i801 @@ -21,7 +21,8 @@ Authors: Module Parameters ----------------- -None. +* force_addr: int + Forcibly enable the ICH at the given address. EXTREMELY DANGEROUS! Description diff --git a/Documentation/i2c/busses/i2c-nforce2 b/Documentation/i2c/busses/i2c-nforce2 index cd49c428a..d751282d9 100644 --- a/Documentation/i2c/busses/i2c-nforce2 +++ b/Documentation/i2c/busses/i2c-nforce2 @@ -7,8 +7,6 @@ Supported adapters: * nForce3 250Gb MCP 10de:00E4 * nForce4 MCP 10de:0052 * nForce4 MCP-04 10de:0034 - * nForce4 MCP51 10de:0264 - * nForce4 MCP55 10de:0368 Datasheet: not publically available, but seems to be similar to the AMD-8111 SMBus 2.0 adapter. diff --git a/Documentation/i2c/busses/i2c-parport b/Documentation/i2c/busses/i2c-parport index 77b995dfc..d9f23c076 100644 --- a/Documentation/i2c/busses/i2c-parport +++ b/Documentation/i2c/busses/i2c-parport @@ -12,22 +12,18 @@ meant as a replacement for the older, individual drivers: teletext adapters) It currently supports the following devices: - * (type=0) Philips adapter - * (type=1) home brew teletext adapter - * (type=2) Velleman K8000 adapter - * (type=3) ELV adapter - * (type=4) Analog Devices ADM1032 evaluation board - * (type=5) Analog Devices evaluation boards: ADM1025, ADM1030, ADM1031 - * (type=6) Barco LPT->DVI (K5800236) adapter + * Philips adapter + * home brew teletext adapter + * Velleman K8000 adapter + * ELV adapter + * Analog Devices evaluation boards (ADM1025, ADM1030, ADM1031, ADM1032) + * Barco LPT->DVI (K5800236) adapter These devices use different pinout configurations, so you have to tell the driver what you have, using the type module parameter. There is no way to autodetect the devices. Support for different pinout configurations can be easily added when needed. -Earlier kernels defaulted to type=0 (Philips). But now, if the type -parameter is missing, the driver will simply fail to initialize. - Building your own adapter ------------------------- diff --git a/Documentation/i2c/busses/i2c-piix4 b/Documentation/i2c/busses/i2c-piix4 index 921476333..856b4b8b9 100644 --- a/Documentation/i2c/busses/i2c-piix4 +++ b/Documentation/i2c/busses/i2c-piix4 @@ -4,10 +4,8 @@ Supported adapters: * Intel 82371AB PIIX4 and PIIX4E * Intel 82443MX (440MX) Datasheet: Publicly available at the Intel website - * ServerWorks OSB4, CSB5, CSB6 and HT-1000 southbridges + * ServerWorks OSB4, CSB5 and CSB6 southbridges Datasheet: Only available via NDA from ServerWorks - * ATI IXP southbridges IXP200, IXP300, IXP400 - Datasheet: Not publicly available * Standard Microsystems (SMSC) SLC90E66 (Victory66) southbridge Datasheet: Publicly available at the SMSC website http://www.smsc.com @@ -23,6 +21,8 @@ Module Parameters Forcibly enable the PIIX4. DANGEROUS! * force_addr: int Forcibly enable the PIIX4 at the given address. EXTREMELY DANGEROUS! +* fix_hstcfg: int + Fix config register. Needed on some boards (Force CPCI735). Description @@ -63,36 +63,10 @@ The PIIX4E is just an new version of the PIIX4; it is supported as well. The PIIX/PIIX3 does not implement an SMBus or I2C bus, so you can't use this driver on those mainboards. -The ServerWorks Southbridges, the Intel 440MX, and the Victory66 are +The ServerWorks Southbridges, the Intel 440MX, and the Victory766 are identical to the PIIX4 in I2C/SMBus support. -If you own Force CPCI735 motherboard or other OSB4 based systems you may need -to change the SMBus Interrupt Select register so the SMBus controller uses -the SMI mode. - -1) Use lspci command and locate the PCI device with the SMBus controller: - 00:0f.0 ISA bridge: ServerWorks OSB4 South Bridge (rev 4f) - The line may vary for different chipsets. Please consult the driver source - for all possible PCI ids (and lspci -n to match them). Lets assume the - device is located at 00:0f.0. -2) Now you just need to change the value in 0xD2 register. Get it first with - command: lspci -xxx -s 00:0f.0 - If the value is 0x3 then you need to change it to 0x1 - setpci -s 00:0f.0 d2.b=1 - -Please note that you don't need to do that in all cases, just when the SMBus is -not working properly. - - -Hardware-specific issues ------------------------- - -This driver will refuse to load on IBM systems with an Intel PIIX4 SMBus. -Some of these machines have an RFID EEPROM (24RF08) connected to the SMBus, -which can easily get corrupted due to a state machine bug. These are mostly -Thinkpad laptops, but desktop systems may also be affected. We have no list -of all affected systems, so the only safe solution was to prevent access to -the SMBus on all IBM systems (detected using DMI data.) - -For additional information, read: -http://www2.lm-sensors.nu/~lm78/cvs/lm_sensors2/README.thinkpad +A few OSB4 southbridges are known to be misconfigured by the BIOS. In this +case, you have you use the fix_hstcfg module parameter. Do not use it +unless you know you have to, because in some cases it also breaks +configuration on southbridges that don't need it. diff --git a/Documentation/i2c/busses/i2c-sis96x b/Documentation/i2c/busses/i2c-sis96x index 08d7b2dac..00a009b97 100644 --- a/Documentation/i2c/busses/i2c-sis96x +++ b/Documentation/i2c/busses/i2c-sis96x @@ -42,8 +42,8 @@ I suspect that this driver could be made to work for the following SiS chipsets as well: 635, and 635T. If anyone owns a board with those chips AND is willing to risk crashing & burning an otherwise well-behaved kernel in the name of progress... please contact me at or -via the project's mailing list: . Please send bug -reports and/or success stories as well. +via the project's mailing list: . Please +send bug reports and/or success stories as well. TO DOs diff --git a/Documentation/i2c/busses/i2c-viapro b/Documentation/i2c/busses/i2c-viapro index 16775663b..25680346e 100644 --- a/Documentation/i2c/busses/i2c-viapro +++ b/Documentation/i2c/busses/i2c-viapro @@ -7,9 +7,12 @@ Supported adapters: * VIA Technologies, Inc. VT82C686A/B Datasheet: Sometimes available at the VIA website - * VIA Technologies, Inc. VT8231, VT8233, VT8233A, VT8235, VT8237R + * VIA Technologies, Inc. VT8231, VT8233, VT8233A Datasheet: available on request from VIA + * VIA Technologies, Inc. VT8235, VT8237R, VT8237A, VT8251 + Datasheet: available on request and under NDA from VIA + Authors: Kyösti Mälkki , Mark D. Studebaker , @@ -39,6 +42,8 @@ Your lspci -n listing must show one of these : device 1106:8235 (VT8231 function 4) device 1106:3177 (VT8235) device 1106:3227 (VT8237R) + device 1106:3337 (VT8237A) + device 1106:3287 (VT8251) If none of these show up, you should look in the BIOS for settings like enable ACPI / SMBus or even USB. diff --git a/Documentation/i2c/busses/scx200_acb b/Documentation/i2c/busses/scx200_acb index 7c07883d4..08c8cd1df 100644 --- a/Documentation/i2c/busses/scx200_acb +++ b/Documentation/i2c/busses/scx200_acb @@ -2,31 +2,13 @@ Kernel driver scx200_acb Author: Christer Weinigel -The driver supersedes the older, never merged driver named i2c-nscacb. - Module Parameters ----------------- -* base: up to 4 ints - Base addresses for the ACCESS.bus controllers on SCx200 and SC1100 devices - - By default the driver uses two base addresses 0x820 and 0x840. - If you want only one base address, specify the second as 0 so as to - override this default. +* base: int + Base addresses for the ACCESS.bus controllers Description ----------- -Enable the use of the ACCESS.bus controller on the Geode SCx200 and -SC1100 processors and the CS5535 and CS5536 Geode companion devices. - -Device-specific notes ---------------------- - -The SC1100 WRAP boards are known to use base addresses 0x810 and 0x820. -If the scx200_acb driver is built into the kernel, add the following -parameter to your boot command line: - scx200_acb.base=0x810,0x820 -If the scx200_acb driver is built as a module, add the following line to -the file /etc/modprobe.conf instead: - options scx200_acb base=0x810,0x820 +Enable the use of the ACCESS.bus controllers of a SCx200 processor. diff --git a/Documentation/i386/boot.txt b/Documentation/i386/boot.txt index c51314b1a..10312bebe 100644 --- a/Documentation/i386/boot.txt +++ b/Documentation/i386/boot.txt @@ -181,7 +181,6 @@ filled out, however: 5 ELILO 7 GRuB 8 U-BOOT - 9 Xen Please contact if you need a bootloader ID value assigned. diff --git a/Documentation/i386/zero-page.txt b/Documentation/i386/zero-page.txt index c04a421f4..df28c7416 100644 --- a/Documentation/i386/zero-page.txt +++ b/Documentation/i386/zero-page.txt @@ -63,10 +63,6 @@ Offset Type Description 2 for bootsect-loader 3 for SYSLINUX 4 for ETHERBOOT - 5 for ELILO - 7 for GRuB - 8 for U-BOOT - 9 for Xen V = version 0x211 char loadflags: bit0 = 1: kernel is loaded high (bzImage) diff --git a/Documentation/infiniband/ipoib.txt b/Documentation/infiniband/ipoib.txt index 864ff3283..5c5a4ccce 100644 --- a/Documentation/infiniband/ipoib.txt +++ b/Documentation/infiniband/ipoib.txt @@ -1,10 +1,10 @@ IP OVER INFINIBAND The ib_ipoib driver is an implementation of the IP over InfiniBand - protocol as specified by RFC 4391 and 4392, issued by the IETF ipoib - working group. It is a "native" implementation in the sense of - setting the interface type to ARPHRD_INFINIBAND and the hardware - address length to 20 (earlier proprietary implementations + protocol as specified by the latest Internet-Drafts issued by the + IETF ipoib working group. It is a "native" implementation in the + sense of setting the interface type to ARPHRD_INFINIBAND and the + hardware address length to 20 (earlier proprietary implementations masqueraded to the kernel as ethernet interfaces). Partitions and P_Keys @@ -51,7 +51,5 @@ Debugging Information References - Transmission of IP over InfiniBand (IPoIB) (RFC 4391) - http://ietf.org/rfc/rfc4391.txt - IP over InfiniBand (IPoIB) Architecture (RFC 4392) - http://ietf.org/rfc/rfc4392.txt + IETF IP over InfiniBand (ipoib) Working Group + http://ietf.org/html.charters/ipoib-charter.html diff --git a/Documentation/initrd.txt b/Documentation/initrd.txt index 15f1b35de..7de1c80cd 100644 --- a/Documentation/initrd.txt +++ b/Documentation/initrd.txt @@ -67,27 +67,12 @@ initrd adds the following new options: as the last process has closed it, all data is freed and /dev/initrd can't be opened anymore. - root=/dev/ram0 + root=/dev/ram0 (without devfs) + root=/dev/rd/0 (with devfs) initrd is mounted as root, and the normal boot procedure is followed, with the RAM disk still mounted as root. -Compressed cpio images ----------------------- - -Recent kernels have support for populating a ramdisk from a compressed cpio -archive, on such systems, the creation of a ramdisk image doesn't need to -involve special block devices or loopbacks, you merely create a directory on -disk with the desired initrd content, cd to that directory, and run (as an -example): - -find . | cpio --quiet -c -o | gzip -9 -n > /boot/imagefile.img - -Examining the contents of an existing image file is just as simple: - -mkdir /tmp/imagefile -cd /tmp/imagefile -gzip -cd /boot/imagefile.img | cpio -imd --quiet Installation ------------ @@ -105,7 +90,8 @@ you're building an install floppy), the root file system creation procedure should create the /initrd directory. If initrd will not be mounted in some cases, its content is still -accessible if the following device has been created: +accessible if the following device has been created (note that this +does not work if using devfs): # mknod /dev/initrd b 1 250 # chmod 400 /dev/initrd @@ -133,7 +119,8 @@ We'll describe the loopback device method: (if space is critical, you may want to use the Minix FS instead of Ext2) 3) mount the file system, e.g. # mount -t ext2 -o loop initrd /mnt - 4) create the console device: + 4) create the console device (not necessary if using devfs, but it can't + hurt to do it anyway): # mkdir /mnt/dev # mknod /mnt/dev/console c 5 1 5) copy all the files that are needed to properly use the initrd @@ -165,7 +152,12 @@ have to be given: root=/dev/ram0 init=/linuxrc rw -(rw is only necessary if writing to the initrd file system.) +if not using devfs, or + + root=/dev/rd/0 init=/linuxrc rw + +if using devfs. (rw is only necessary if writing to the initrd file +system.) With LOADLIN, you simply execute @@ -225,9 +217,9 @@ following command: # exec chroot . what-follows dev/console 2>&1 Where what-follows is a program under the new root, e.g. /sbin/init -If the new root file system will be used with udev and has no valid -/dev directory, udev must be initialized before invoking chroot in order -to provide /dev/console. +If the new root file system will be used with devfs and has no valid +/dev directory, devfs must be mounted before invoking chroot in order to +provide /dev/console. Note: implementation details of pivot_root may change with time. In order to ensure compatibility, the following points should be observed: @@ -244,7 +236,7 @@ Now, the initrd can be unmounted and the memory allocated by the RAM disk can be freed: # umount /initrd -# blockdev --flushbufs /dev/ram0 +# blockdev --flushbufs /dev/ram0 # /dev/rd/0 if using devfs It is also possible to use initrd with an NFS-mounted root, see the pivot_root(8) man page for details. diff --git a/Documentation/input/joystick-parport.txt b/Documentation/input/joystick-parport.txt index d537c48cc..88a011c9f 100644 --- a/Documentation/input/joystick-parport.txt +++ b/Documentation/input/joystick-parport.txt @@ -36,12 +36,12 @@ with them. All NES and SNES use the same synchronous serial protocol, clocked from the computer's side (and thus timing insensitive). To allow up to 5 NES -and/or SNES gamepads and/or SNES mice connected to the parallel port at once, -the output lines of the parallel port are shared, while one of 5 available -input lines is assigned to each gamepad. +and/or SNES gamepads connected to the parallel port at once, the output +lines of the parallel port are shared, while one of 5 available input lines +is assigned to each gamepad. This protocol is handled by the gamecon.c driver, so that's the one -you'll use for NES, SNES gamepads and SNES mice. +you'll use for NES and SNES gamepads. The main problem with PC parallel ports is that they don't have +5V power source on any of their pins. So, if you want a reliable source of power @@ -106,7 +106,7 @@ A, Turbo B, Select and Start, and is connected through 5 wires, then it is either a NES or NES clone and will work with this connection. SNES gamepads also use 5 wires, but have more buttons. They will work as well, of course. -Pinout for NES gamepads Pinout for SNES gamepads and mice +Pinout for NES gamepads Pinout for SNES gamepads +----> Power +-----------------------\ | 7 | o o o o | x x o | 1 @@ -454,7 +454,6 @@ uses the following kernel/module command line: 6 | N64 pad 7 | Sony PSX controller 8 | Sony PSX DDR controller - 9 | SNES mouse The exact type of the PSX controller type is autoprobed when used so hot swapping should work (but is not recomended). diff --git a/Documentation/input/joystick.txt b/Documentation/input/joystick.txt index 841c35329..d53b857a3 100644 --- a/Documentation/input/joystick.txt +++ b/Documentation/input/joystick.txt @@ -39,6 +39,7 @@ them. Bug reports and success stories are also welcome. The input project website is at: + http://www.suse.cz/development/input/ http://atrey.karlin.mff.cuni.cz/~vojtech/input/ There is also a mailing list for the driver at: diff --git a/Documentation/ioctl-number.txt b/Documentation/ioctl-number.txt index edc04d74a..aa7ba00ec 100644 --- a/Documentation/ioctl-number.txt +++ b/Documentation/ioctl-number.txt @@ -78,6 +78,8 @@ Code Seq# Include File Comments '#' 00-3F IEEE 1394 Subsystem Block for the entire subsystem '1' 00-1F PPS kit from Ulrich Windl +'6' 00-10 Intel IA32 microcode update driver + '8' all SNP8023 advanced NIC card 'A' 00-1F linux/apm_bios.h @@ -85,9 +87,7 @@ Code Seq# Include File Comments 'C' all linux/soundcard.h 'D' all asm-s390/dasd.h -'E' all linux/input.h 'F' all linux/fb.h -'H' all linux/hiddev.h 'I' all linux/isdn.h 'J' 00-1F drivers/scsi/gdth_ioctl.h 'K' all linux/kd.h @@ -119,6 +119,7 @@ Code Seq# Include File Comments 'c' 00-7F linux/comstats.h conflict! 'c' 00-7F linux/coda.h conflict! 'd' 00-FF linux/char/drm/drm/h conflict! +'d' 00-1F linux/devfs_fs.h conflict! 'd' 00-DF linux/video_decoder.h conflict! 'd' F0-FF linux/digi1.h 'e' all linux/digi1.h conflict! diff --git a/Documentation/kbuild/makefiles.txt b/Documentation/kbuild/makefiles.txt index 0706699c9..443230b43 100644 --- a/Documentation/kbuild/makefiles.txt +++ b/Documentation/kbuild/makefiles.txt @@ -17,7 +17,6 @@ This document describes the Linux kernel Makefiles. --- 3.8 Command line dependency --- 3.9 Dependency tracking --- 3.10 Special Rules - --- 3.11 $(CC) support functions === 4 Host Program support --- 4.1 Simple Host Program @@ -39,6 +38,7 @@ This document describes the Linux kernel Makefiles. --- 6.6 Commands useful for building a boot image --- 6.7 Custom kbuild commands --- 6.8 Preprocessing linker scripts + --- 6.9 $(CC) support functions === 7 Kbuild Variables === 8 Makefile language @@ -106,9 +106,9 @@ This document is aimed towards normal developers and arch developers. Most Makefiles within the kernel are kbuild Makefiles that use the kbuild infrastructure. This chapter introduce the syntax used in the kbuild makefiles. -The preferred name for the kbuild files are 'Makefile' but 'Kbuild' can -be used and if both a 'Makefile' and a 'Kbuild' file exists then the 'Kbuild' -file will be used. +The preferred name for the kbuild files is 'Kbuild' but 'Makefile' will +continue to be supported. All new developmen is expected to use the +Kbuild filename. Section 3.1 "Goal definitions" is a quick intro, further chapters provide more details, with real examples. @@ -385,116 +385,6 @@ more details, with real examples. to prerequisites are referenced with $(src) (because they are not generated files). ---- 3.11 $(CC) support functions - - The kernel may be build with several different versions of - $(CC), each supporting a unique set of features and options. - kbuild provide basic support to check for valid options for $(CC). - $(CC) is useally the gcc compiler, but other alternatives are - available. - - as-option - as-option is used to check if $(CC) when used to compile - assembler (*.S) files supports the given option. An optional - second option may be specified if first option are not supported. - - Example: - #arch/sh/Makefile - cflags-y += $(call as-option,-Wa$(comma)-isa=$(isa-y),) - - In the above example cflags-y will be assinged the the option - -Wa$(comma)-isa=$(isa-y) if it is supported by $(CC). - The second argument is optional, and if supplied will be used - if first argument is not supported. - - ld-option - ld-option is used to check if $(CC) when used to link object files - supports the given option. An optional second option may be - specified if first option are not supported. - - Example: - #arch/i386/kernel/Makefile - vsyscall-flags += $(call ld-option, -Wl$(comma)--hash-style=sysv) - - In the above example vsyscall-flags will be assigned the option - -Wl$(comma)--hash-style=sysv if it is supported by $(CC). - The second argument is optional, and if supplied will be used - if first argument is not supported. - - cc-option - cc-option is used to check if $(CC) support a given option, and not - supported to use an optional second option. - - Example: - #arch/i386/Makefile - cflags-y += $(call cc-option,-march=pentium-mmx,-march=i586) - - In the above example cflags-y will be assigned the option - -march=pentium-mmx if supported by $(CC), otherwise -march-i586. - The second argument to cc-option is optional, and if omitted - cflags-y will be assigned no value if first option is not supported. - - cc-option-yn - cc-option-yn is used to check if gcc supports a given option - and return 'y' if supported, otherwise 'n'. - - Example: - #arch/ppc/Makefile - biarch := $(call cc-option-yn, -m32) - aflags-$(biarch) += -a32 - cflags-$(biarch) += -m32 - - In the above example $(biarch) is set to y if $(CC) supports the -m32 - option. When $(biarch) equals to y the expanded variables $(aflags-y) - and $(cflags-y) will be assigned the values -a32 and -m32. - - cc-option-align - gcc version >= 3.0 shifted type of options used to speify - alignment of functions, loops etc. $(cc-option-align) whrn used - as prefix to the align options will select the right prefix: - gcc < 3.00 - cc-option-align = -malign - gcc >= 3.00 - cc-option-align = -falign - - Example: - CFLAGS += $(cc-option-align)-functions=4 - - In the above example the option -falign-functions=4 is used for - gcc >= 3.00. For gcc < 3.00 -malign-functions=4 is used. - - cc-version - cc-version return a numerical version of the $(CC) compiler version. - The format is where both are two digits. So for example - gcc 3.41 would return 0341. - cc-version is useful when a specific $(CC) version is faulty in one - area, for example the -mregparm=3 were broken in some gcc version - even though the option was accepted by gcc. - - Example: - #arch/i386/Makefile - cflags-y += $(shell \ - if [ $(call cc-version) -ge 0300 ] ; then \ - echo "-mregparm=3"; fi ;) - - In the above example -mregparm=3 is only used for gcc version greater - than or equal to gcc 3.0. - - cc-ifversion - cc-ifversion test the version of $(CC) and equals last argument if - version expression is true. - - Example: - #fs/reiserfs/Makefile - EXTRA_CFLAGS := $(call cc-ifversion, -lt, 0402, -O1) - - In this example EXTRA_CFLAGS will be assigned the value -O1 if the - $(CC) version is less than 4.2. - cc-ifversion takes all the shell operators: - -eq, -ne, -lt, -le, -gt, and -ge - The third parameter may be a text as in this example, but it may also - be an expanded variable or a macro. - === 4 Host Program support @@ -1083,6 +973,74 @@ When kbuild executes the following steps are followed (roughly): architecture specific files. +--- 6.9 $(CC) support functions + + The kernel may be build with several different versions of + $(CC), each supporting a unique set of features and options. + kbuild provide basic support to check for valid options for $(CC). + $(CC) is useally the gcc compiler, but other alternatives are + available. + + cc-option + cc-option is used to check if $(CC) support a given option, and not + supported to use an optional second option. + + Example: + #arch/i386/Makefile + cflags-y += $(call cc-option,-march=pentium-mmx,-march=i586) + + In the above example cflags-y will be assigned the option + -march=pentium-mmx if supported by $(CC), otherwise -march-i586. + The second argument to cc-option is optional, and if omitted + cflags-y will be assigned no value if first option is not supported. + + cc-option-yn + cc-option-yn is used to check if gcc supports a given option + and return 'y' if supported, otherwise 'n'. + + Example: + #arch/ppc/Makefile + biarch := $(call cc-option-yn, -m32) + aflags-$(biarch) += -a32 + cflags-$(biarch) += -m32 + + In the above example $(biarch) is set to y if $(CC) supports the -m32 + option. When $(biarch) equals to y the expanded variables $(aflags-y) + and $(cflags-y) will be assigned the values -a32 and -m32. + + cc-option-align + gcc version >= 3.0 shifted type of options used to speify + alignment of functions, loops etc. $(cc-option-align) whrn used + as prefix to the align options will select the right prefix: + gcc < 3.00 + cc-option-align = -malign + gcc >= 3.00 + cc-option-align = -falign + + Example: + CFLAGS += $(cc-option-align)-functions=4 + + In the above example the option -falign-functions=4 is used for + gcc >= 3.00. For gcc < 3.00 -malign-functions=4 is used. + + cc-version + cc-version return a numerical version of the $(CC) compiler version. + The format is where both are two digits. So for example + gcc 3.41 would return 0341. + cc-version is useful when a specific $(CC) version is faulty in one + area, for example the -mregparm=3 were broken in some gcc version + even though the option was accepted by gcc. + + Example: + #arch/i386/Makefile + cflags-y += $(shell \ + if [ $(call cc-version) -ge 0300 ] ; then \ + echo "-mregparm=3"; fi ;) + + In the above example -mregparm=3 is only used for gcc version greater + than or equal to gcc 3.0. + + === 7 Kbuild Variables The top Makefile exports the following variables: @@ -1137,14 +1095,6 @@ The top Makefile exports the following variables: $(INSTALL_MOD_PATH)/lib/modules/$(KERNELRELEASE). The user may override this value on the command line if desired. - INSTALL_MOD_STRIP - - If this variable is specified, 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 option(s) to the strip command. - - === 8 Makefile language The kernel Makefiles are designed to run with GNU Make. The Makefiles diff --git a/Documentation/kbuild/modules.txt b/Documentation/kbuild/modules.txt index 61fc079eb..7e77f9363 100644 --- a/Documentation/kbuild/modules.txt +++ b/Documentation/kbuild/modules.txt @@ -13,7 +13,6 @@ In this document you will find information about: --- 2.2 Available targets --- 2.3 Available options --- 2.4 Preparing the kernel tree for module build - --- 2.5 Building separate files for a module === 3. Example commands === 4. Creating a kbuild file for an external module === 5. Include files @@ -23,10 +22,7 @@ In this document you will find information about: === 6. Module installation --- 6.1 INSTALL_MOD_PATH --- 6.2 INSTALL_MOD_DIR - === 7. Module versioning & Module.symvers - --- 7.1 Symbols fron the kernel (vmlinux + modules) - --- 7.2 Symbols and external modules - --- 7.3 Symbols from another external module + === 7. Module versioning === 8. Tips & Tricks --- 8.1 Testing for CONFIG_FOO_BAR @@ -44,7 +40,7 @@ What is covered within this file is mainly information to authors of modules. The author of an external modules should supply a makefile that hides most of the complexity so one only has to type 'make' to build the module. A complete example will be present in -chapter 4, "Creating a kbuild file for an external module". +chapter ¤. Creating a kbuild file for an external module". === 2. How to build external modules @@ -92,8 +88,7 @@ when building an external module. make -C $KDIR M=$PWD modules_install Install the external module(s). Installation default is in /lib/modules//extra, - but may be prefixed with INSTALL_MOD_PATH - see separate - chapter. + but may be prefixed with INSTALL_MOD_PATH - see separate chapter. make -C $KDIR M=$PWD clean Remove all generated files for the module - the kernel @@ -136,16 +131,6 @@ when building an external module. Therefore a full kernel build needs to be executed to make module versioning work. ---- 2.5 Building separate files for a module - It is possible to build single files which is part of a module. - This works equal for the kernel, a module and even for external - modules. - Examples (module foo.ko, consist of bar.o, baz.o): - make -C $KDIR M=`pwd` bar.lst - make -C $KDIR M=`pwd` bar.o - make -C $KDIR M=`pwd` foo.ko - make -C $KDIR M=`pwd` / - === 3. Example commands @@ -437,7 +422,7 @@ External modules are installed in the directory: => Install dir: /lib/modules/$(KERNELRELEASE)/gandalf -=== 7. Module versioning & Module.symvers +=== 7. Module versioning Module versioning is enabled by the CONFIG_MODVERSIONS tag. @@ -447,80 +432,11 @@ when a module is loaded/used then the CRC values contained in the kernel are compared with similar values in the module. If they are not equal then the kernel refuses to load the module. -Module.symvers contains a list of all exported symbols from a kernel build. - ---- 7.1 Symbols fron the kernel (vmlinux + modules) - - During a kernel build a file named Module.symvers will be generated. - Module.symvers contains all exported symbols from the kernel and - compiled modules. For each symbols the corresponding CRC value - is stored too. - - The syntax of the Module.symvers file is: - - Sample: - 0x2d036834 scsi_remove_host drivers/scsi/scsi_mod +During a kernel build a file named Module.symvers will be generated. This +file includes the symbol version of all symbols within the kernel. If the +Module.symvers file is saved from the last full kernel compile one does not +have to do a full kernel compile to build a module version's compatible module. - For a kernel build without CONFIG_MODVERSIONING enabled the crc - would read: 0x00000000 - - Module.symvers serve two purposes. - 1) It list all exported symbols both from vmlinux and all modules - 2) It list CRC if CONFIG_MODVERSION is enabled - ---- 7.2 Symbols and external modules - - When building an external module the build system needs access to - the symbols from the kernel to check if all external symbols are - defined. This is done in the MODPOST step and to obtain all - symbols modpost reads Module.symvers from the kernel. - If a Module.symvers file is present in the directory where - the external module is being build this file will be read too. - During the MODPOST step a new Module.symvers file will be written - containing all exported symbols that was not defined in the kernel. - ---- 7.3 Symbols from another external module - - Sometimes one external module uses exported symbols from another - external module. Kbuild needs to have full knowledge on all symbols - to avoid spitting out warnings about undefined symbols. - Two solutions exist to let kbuild know all symbols of more than - one external module. - The method with a top-level kbuild file is recommended but may be - impractical in certain situations. - - Use a top-level Kbuild file - If you have two modules: 'foo', 'bar' and 'foo' needs symbols - from 'bar' then one can use a common top-level kbuild file so - both modules are compiled in same build. - - Consider following directory layout: - ./foo/ <= contains the foo module - ./bar/ <= contains the bar module - The top-level Kbuild file would then look like: - - #./Kbuild: (this file may also be named Makefile) - obj-y := foo/ bar/ - - Executing: - make -C $KDIR M=`pwd` - - will then do the expected and compile both modules with full - knowledge on symbols from both modules. - - Use an extra Module.symvers file - When an external module is build a Module.symvers file is - generated containing all exported symbols which are not - defined in the kernel. - To get access to symbols from module 'bar' one can copy the - Module.symvers file from the compilation of the 'bar' module - to the directory where the 'foo' module is build. - During the module build kbuild will read the Module.symvers - file in the directory of the external module and when the - build is finished a new Module.symvers file is created - containing the sum of all symbols defined and not part of the - kernel. - === 8. Tips & Tricks --- 8.1 Testing for CONFIG_FOO_BAR diff --git a/Documentation/kdump/gdbmacros.txt b/Documentation/kdump/gdbmacros.txt index 9b9b454b0..dcf558038 100644 --- a/Documentation/kdump/gdbmacros.txt +++ b/Documentation/kdump/gdbmacros.txt @@ -175,7 +175,7 @@ end document trapinfo Run info threads and lookup pid of thread #1 'trapinfo ' will tell you by which trap & possibly - address the kernel panicked. + addresthe kernel paniced. end diff --git a/Documentation/kdump/kdump.txt b/Documentation/kdump/kdump.txt index 08bafa8c1..212cf3c21 100644 --- a/Documentation/kdump/kdump.txt +++ b/Documentation/kdump/kdump.txt @@ -1,325 +1,155 @@ +Documentation for kdump - the kexec-based crash dumping solution ================================================================ -Documentation for Kdump - The kexec-based Crash Dumping Solution -================================================================ - -This document includes overview, setup and installation, and analysis -information. - -Overview -======== - -Kdump uses kexec to quickly boot to a dump-capture kernel whenever a -dump of the system kernel's memory needs to be taken (for example, when -the system panics). The system kernel's memory image is preserved across -the reboot and is accessible to the dump-capture kernel. - -You can use common Linux commands, such as cp and scp, to copy the -memory image to a dump file on the local disk, or across the network to -a remote system. - -Kdump and kexec are currently supported on the x86, x86_64, and ppc64 -architectures. - -When the system kernel boots, it reserves a small section of memory for -the dump-capture kernel. This ensures that ongoing Direct Memory Access -(DMA) from the system kernel does not corrupt the dump-capture kernel. -The kexec -p command loads the dump-capture kernel into this reserved -memory. - -On x86 machines, the first 640 KB of physical memory is needed to boot, -regardless of where the kernel loads. Therefore, kexec backs up this -region just before rebooting into the dump-capture kernel. - -All of the necessary information about the system kernel's core image is -encoded in the ELF format, and stored in a reserved area of memory -before a crash. The physical address of the start of the ELF header is -passed to the dump-capture kernel through the elfcorehdr= boot -parameter. - -With the dump-capture kernel, you can access the memory image, or "old -memory," in two ways: - -- Through a /dev/oldmem device interface. A capture utility can read the - device file and write out the memory in raw format. This is a raw dump - of memory. Analysis and capture tools must be intelligent enough to - determine where to look for the right information. - -- Through /proc/vmcore. This exports the dump as an ELF-format file that - you can write out using file copy commands such as cp or scp. Further, - you can use analysis tools such as the GNU Debugger (GDB) and the Crash - tool to debug the dump file. This method ensures that the dump pages are - correctly ordered. - - -Setup and Installation -====================== - -Install kexec-tools and the Kdump patch ---------------------------------------- - -1) Login as the root user. - -2) Download the kexec-tools user-space package from the following URL: - - http://www.xmission.com/~ebiederm/files/kexec/kexec-tools-1.101.tar.gz - -3) Unpack the tarball with the tar command, as follows: - - tar xvpzf kexec-tools-1.101.tar.gz - -4) Download the latest consolidated Kdump patch from the following URL: - - http://lse.sourceforge.net/kdump/ - - (This location is being used until all the user-space Kdump patches - are integrated with the kexec-tools package.) - -5) Change to the kexec-tools-1.101 directory, as follows: - - cd kexec-tools-1.101 - -6) Apply the consolidated patch to the kexec-tools-1.101 source tree - with the patch command, as follows. (Modify the path to the downloaded - patch as necessary.) - - patch -p1 < /path-to-kdump-patch/kexec-tools-1.101-kdump.patch - -7) Configure the package, as follows: - - ./configure - -8) Compile the package, as follows: - - make - -9) Install the package, as follows: - - make install - - -Download and build the system and dump-capture kernels ------------------------------------------------------- - -Download the mainline (vanilla) kernel source code (2.6.13-rc1 or newer) -from http://www.kernel.org. Two kernels must be built: a system kernel -and a dump-capture kernel. Use the following steps to configure these -kernels with the necessary kexec and Kdump features: - -System kernel -------------- - -1) Enable "kexec system call" in "Processor type and features." - - CONFIG_KEXEC=y - -2) Enable "sysfs file system support" in "Filesystem" -> "Pseudo - filesystems." This is usually enabled by default. - - CONFIG_SYSFS=y - - Note that "sysfs file system support" might not appear in the "Pseudo - filesystems" menu if "Configure standard kernel features (for small - systems)" is not enabled in "General Setup." In this case, check the - .config file itself to ensure that sysfs is turned on, as follows: - - grep 'CONFIG_SYSFS' .config - -3) Enable "Compile the kernel with debug info" in "Kernel hacking." - - CONFIG_DEBUG_INFO=Y - This causes the kernel to be built with debug symbols. The dump - analysis tools require a vmlinux with debug symbols in order to read - and analyze a dump file. +DESIGN +====== -4) Make and install the kernel and its modules. Update the boot loader - (such as grub, yaboot, or lilo) configuration files as necessary. +Kdump uses kexec to reboot to a second kernel whenever a dump needs to be +taken. This second kernel is booted with very little memory. The first kernel +reserves the section of memory that the second kernel uses. This ensures that +on-going DMA from the first kernel does not corrupt the second kernel. -5) Boot the system kernel with the boot parameter "crashkernel=Y@X", - where Y specifies how much memory to reserve for the dump-capture kernel - and X specifies the beginning of this reserved memory. For example, - "crashkernel=64M@16M" tells the system kernel to reserve 64 MB of memory - starting at physical address 0x01000000 for the dump-capture kernel. +All the necessary information about Core image is encoded in ELF format and +stored in reserved area of memory before crash. Physical address of start of +ELF header is passed to new kernel through command line parameter elfcorehdr=. - On x86 and x86_64, use "crashkernel=64M@16M". +On i386, the first 640 KB of physical memory is needed to boot, irrespective +of where the kernel loads. Hence, this region is backed up by kexec just before +rebooting into the new kernel. - On ppc64, use "crashkernel=128M@32M". +In the second kernel, "old memory" can be accessed in two ways. +- The first one is through a /dev/oldmem device interface. A capture utility + can read the device file and write out the memory in raw format. This is raw + dump of memory and analysis/capture tool should be intelligent enough to + determine where to look for the right information. ELF headers (elfcorehdr=) + can become handy here. -The dump-capture kernel ------------------------ +- The second interface is through /proc/vmcore. This exports the dump as an ELF + format file which can be written out using any file copy command + (cp, scp, etc). Further, gdb can be used to perform limited debugging on + the dump file. This method ensures methods ensure that there is correct + ordering of the dump pages (corresponding to the first 640 KB that has been + relocated). -1) Under "General setup," append "-kdump" to the current string in - "Local version." - -2) On x86, enable high memory support under "Processor type and - features": - - CONFIG_HIGHMEM64G=y - or - CONFIG_HIGHMEM4G - -3) On x86 and x86_64, disable symmetric multi-processing support - under "Processor type and features": - - CONFIG_SMP=n - (If CONFIG_SMP=y, then specify maxcpus=1 on the kernel command line - when loading the dump-capture kernel, see section "Load the Dump-capture - Kernel".) - -4) On ppc64, disable NUMA support and enable EMBEDDED support: - - CONFIG_NUMA=n - CONFIG_EMBEDDED=y - CONFIG_EEH=N for the dump-capture kernel - -5) Enable "kernel crash dumps" support under "Processor type and - features": - - CONFIG_CRASH_DUMP=y - -6) Use a suitable value for "Physical address where the kernel is - loaded" (under "Processor type and features"). This only appears when - "kernel crash dumps" is enabled. By default this value is 0x1000000 - (16MB). It should be the same as X in the "crashkernel=Y@X" boot - parameter discussed above. - - On x86 and x86_64, use "CONFIG_PHYSICAL_START=0x1000000". - - On ppc64 the value is automatically set at 32MB when - CONFIG_CRASH_DUMP is set. - -6) Optionally enable "/proc/vmcore support" under "Filesystems" -> - "Pseudo filesystems". - - CONFIG_PROC_VMCORE=y - (CONFIG_PROC_VMCORE is set by default when CONFIG_CRASH_DUMP is selected.) - -7) Make and install the kernel and its modules. DO NOT add this kernel - to the boot loader configuration files. - - -Load the Dump-capture Kernel -============================ - -After booting to the system kernel, load the dump-capture kernel using -the following command: - - kexec -p \ - --initrd= --args-linux \ - --append="root= init 1 irqpoll" - - -Notes on loading the dump-capture kernel: - -* must be a vmlinux image (that is, an - uncompressed ELF image). bzImage does not work at this time. - -* By default, the ELF headers are stored in ELF64 format to support - systems with more than 4GB memory. The --elf32-core-headers option can - be used to force the generation of ELF32 headers. This is necessary - because GDB currently cannot open vmcore files with ELF64 headers on - 32-bit systems. ELF32 headers can be used on non-PAE systems (that is, - less than 4GB of memory). - -* The "irqpoll" boot parameter reduces driver initialization failures - due to shared interrupts in the dump-capture kernel. - -* You must specify in the format corresponding to the root - device name in the output of mount command. - -* "init 1" boots the dump-capture kernel into single-user mode without - networking. If you want networking, use "init 3." - - -Kernel Panic -============ - -After successfully loading the dump-capture kernel as previously -described, the system will reboot into the dump-capture kernel if a -system crash is triggered. Trigger points are located in panic(), -die(), die_nmi() and in the sysrq handler (ALT-SysRq-c). - -The following conditions will execute a crash trigger point: - -If a hard lockup is detected and "NMI watchdog" is configured, the system -will boot into the dump-capture kernel ( die_nmi() ). - -If die() is called, and it happens to be a thread with pid 0 or 1, or die() -is called inside interrupt context or die() is called and panic_on_oops is set, -the system will boot into the dump-capture kernel. - -On powererpc systems when a soft-reset is generated, die() is called by all cpus and the system system will boot into the dump-capture kernel. - -For testing purposes, you can trigger a crash by using "ALT-SysRq-c", -"echo c > /proc/sysrq-trigger or write a module to force the panic. - -Write Out the Dump File -======================= +SETUP +===== -After the dump-capture kernel is booted, write out the dump file with -the following command: +1) Download the upstream kexec-tools userspace package from + http://www.xmission.com/~ebiederm/files/kexec/kexec-tools-1.101.tar.gz. + + Apply the latest consolidated kdump patch on top of kexec-tools-1.101 + from http://lse.sourceforge.net/kdump/. This arrangment has been made + till all the userspace patches supporting kdump are integrated with + upstream kexec-tools userspace. + +2) Download and build the appropriate (2.6.13-rc1 onwards) vanilla kernels. + Two kernels need to be built in order to get this feature working. + Following are the steps to properly configure the two kernels specific + to kexec and kdump features: + + A) First kernel or regular kernel: + ---------------------------------- + a) Enable "kexec system call" feature (in Processor type and features). + CONFIG_KEXEC=y + b) Enable "sysfs file system support" (in Pseudo filesystems). + CONFIG_SYSFS=y + c) make + d) Boot into first kernel with the command line parameter "crashkernel=Y@X". + Use appropriate values for X and Y. Y denotes how much memory to reserve + for the second kernel, and X denotes at what physical address the + reserved memory section starts. For example: "crashkernel=64M@16M". + + + B) Second kernel or dump capture kernel: + --------------------------------------- + a) For i386 architecture enable Highmem support + CONFIG_HIGHMEM=y + b) Enable "kernel crash dumps" feature (under "Processor type and features") + CONFIG_CRASH_DUMP=y + c) Make sure a suitable value for "Physical address where the kernel is + loaded" (under "Processor type and features"). By default this value + is 0x1000000 (16MB) and it should be same as X (See option d above), + e.g., 16 MB or 0x1000000. + CONFIG_PHYSICAL_START=0x1000000 + d) Enable "/proc/vmcore support" (Optional, under "Pseudo filesystems"). + CONFIG_PROC_VMCORE=y + +3) After booting to regular kernel or first kernel, load the second kernel + using the following command: + + kexec -p --args-linux --elf32-core-headers + --append="root= init 1 irqpoll maxcpus=1" + + Notes: + ====== + i) has to be a vmlinux image ie uncompressed elf image. + bzImage will not work, as of now. + ii) --args-linux has to be speicfied as if kexec it loading an elf image, + it needs to know that the arguments supplied are of linux type. + iii) By default ELF headers are stored in ELF64 format to support systems + with more than 4GB memory. Option --elf32-core-headers forces generation + of ELF32 headers. The reason for this option being, as of now gdb can + not open vmcore file with ELF64 headers on a 32 bit systems. So ELF32 + headers can be used if one has non-PAE systems and hence memory less + than 4GB. + iv) Specify "irqpoll" as command line parameter. This reduces driver + initialization failures in second kernel due to shared interrupts. + v) needs to be specified in a format corresponding to the root + device name in the output of mount command. + vi) If you have built the drivers required to mount root file system as + modules in , then, specify + --initrd=. + vii) Specify maxcpus=1 as, if during first kernel run, if panic happens on + non-boot cpus, second kernel doesn't seem to be boot up all the cpus. + The other option is to always built the second kernel without SMP + support ie CONFIG_SMP=n + +4) After successfully loading the second kernel as above, if a panic occurs + system reboots into the second kernel. A module can be written to force + the panic or "ALT-SysRq-c" can be used initiate a crash dump for testing + purposes. + +5) Once the second kernel has booted, write out the dump file using cp /proc/vmcore -You can also access dumped memory as a /dev/oldmem device for a linear -and raw view. To create the device, use the following command: + Dump memory can also be accessed as a /dev/oldmem device for a linear/raw + view. To create the device, type: - mknod /dev/oldmem c 1 12 + mknod /dev/oldmem c 1 12 -Use the dd command with suitable options for count, bs, and skip to -access specific portions of the dump. + Use "dd" with suitable options for count, bs and skip to access specific + portions of the dump. -To see the entire memory, use the following command: + Entire memory: dd if=/dev/oldmem of=oldmem.001 - dd if=/dev/oldmem of=oldmem.001 - -Analysis +ANALYSIS ======== +Limited analysis can be done using gdb on the dump file copied out of +/proc/vmcore. Use vmlinux built with -g and run -Before analyzing the dump image, you should reboot into a stable kernel. - -You can do limited analysis using GDB on the dump file copied out of -/proc/vmcore. Use the debug vmlinux built with -g and run the following -command: - - gdb vmlinux + gdb vmlinux -Stack trace for the task on processor 0, register display, and memory -display work fine. +Stack trace for the task on processor 0, register display, memory display +work fine. -Note: GDB cannot analyze core files generated in ELF64 format for x86. -On systems with a maximum of 4GB of memory, you can generate -ELF32-format headers using the --elf32-core-headers kernel option on the -dump kernel. +Note: gdb cannot analyse core files generated in ELF64 format for i386. -You can also use the Crash utility to analyze dump files in Kdump -format. Crash is available on Dave Anderson's site at the following URL: +Latest "crash" (crash-4.0-2.18) as available on Dave Anderson's site +http://people.redhat.com/~anderson/ works well with kdump format. - http://people.redhat.com/~anderson/ - - -To Do -===== -1) Provide a kernel pages filtering mechanism, so core file size is not - extreme on systems with huge memory banks. +TODO +==== +1) Provide a kernel pages filtering mechanism so that core file size is not + insane on systems having huge memory banks. +2) Relocatable kernel can help in maintaining multiple kernels for crashdump + and same kernel as the first kernel can be used to capture the dump. -2) Relocatable kernel can help in maintaining multiple kernels for - crash_dump, and the same kernel as the system kernel can be used to - capture the dump. - -Contact +CONTACT ======= - Vivek Goyal (vgoyal@in.ibm.com) Maneesh Soni (maneesh@in.ibm.com) - - -Trademark -========= - -Linux is a trademark of Linus Torvalds in the United States, other -countries, or both. diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt index 71d05f481..fc99075e0 100644 --- a/Documentation/kernel-parameters.txt +++ b/Documentation/kernel-parameters.txt @@ -1,4 +1,4 @@ - Kernel Parameters +February 2003 Kernel Parameters v2.5.59 ~~~~~~~~~~~~~~~~~ The following is a consolidated list of the kernel parameters as implemented @@ -17,17 +17,9 @@ are specified on the kernel command line with the module name plus usbcore.blinkenlights=1 -This document may not be entirely up to date and comprehensive. The command -"modinfo -p ${modulename}" shows a current list of all parameters of a loadable -module. Loadable modules, after being loaded into the running kernel, also -reveal their parameters in /sys/module/${modulename}/parameters/. Some of these -parameters may be changed at runtime by the command -"echo -n ${value} > /sys/module/${modulename}/parameters/${parm}". - -The parameters listed below are only valid if certain kernel build options were -enabled and if respective hardware is present. The text in square brackets at -the beginning of each description states the restrictions within which a -parameter is applicable: +The text in square brackets at the beginning of the description states the +restrictions on the kernel for the said kernel parameter to be valid. The +restrictions referred to are that the relevant option is valid if: ACPI ACPI support is enabled. ALSA ALSA sound support is enabled. @@ -35,6 +27,7 @@ parameter is applicable: APM Advanced Power Management support is enabled. AX25 Appropriate AX.25 support is enabled. CD Appropriate CD support is enabled. + DEVFS devfs support is enabled. DRM Direct Rendering Management support is enabled. EDD BIOS Enhanced Disk Drive Services (EDD) is enabled EFI EFI Partitioning (GPT) is enabled @@ -56,11 +49,9 @@ parameter is applicable: MCA MCA bus support is enabled. MDA MDA console support is enabled. MOUSE Appropriate mouse support is enabled. - MSI Message Signaled Interrupts (PCI). MTD MTD support is enabled. NET Appropriate network support is enabled. NUMA NUMA support is enabled. - GENERIC_TIME The generic timeofday code is enabled. NFS Appropriate NFS support is enabled. OSS OSS sound support is enabled. PARIDE The ParIDE subsystem is enabled. @@ -147,9 +138,6 @@ running once the system is up. acpi_irq_isa= [HW,ACPI] If irq_balance, mark listed IRQs used by ISA Format: ,... - acpi_os_name= [HW,ACPI] Tell ACPI BIOS the name of the OS - Format: To spoof as Windows 98: ="Microsoft Windows" - acpi_osi= [HW,ACPI] empty param disables _OSI acpi_serialize [HW,ACPI] force serialization of AML methods @@ -179,11 +167,6 @@ running once the system is up. override platform specific driver. See also Documentation/acpi-hotkey.txt. - acpi_pm_good [IA-32,X86-64] - Override the pmtimer bug detection: force the kernel - to assume that this machine's pmtimer latches its value - and always returns good values. - enable_timer_pin_1 [i386,x86-64] Enable PIN 1 of APIC timer Can be useful to work around chipset bugs @@ -346,11 +329,10 @@ running once the system is up. Value can be changed at runtime via /selinux/checkreqprot. - clock= [BUGS=IA-32, HW] gettimeofday clocksource override. - [Deprecated] - Forces specified clocksource (if avaliable) to be used - when calculating gettimeofday(). If specified - clocksource is not avalible, it defaults to PIT. + clock= [BUGS=IA-32,HW] gettimeofday timesource override. + Forces specified timesource (if avaliable) to be used + when calculating gettimeofday(). If specicified + timesource is not avalible, it defaults to PIT. Format: { pit | tsc | cyclone | pmtmr } disable_8254_timer @@ -384,17 +366,12 @@ running once the system is up. tty Use the virtual console device . ttyS[,options] - ttyUSB0[,options] Use the specified serial port. The options are of - the form "bbbbpnf", where "bbbb" is the baud rate, - "p" is parity ("n", "o", or "e"), "n" is number of - bits, and "f" is flow control ("r" for RTS or - omit it). Default is "9600n8". + the form "bbbbpn", where "bbbb" is the baud rate, + "p" is parity ("n", "o", or "e"), and "n" is bits. + Default is "9600n8". - See Documentation/serial-console.txt for more - information. See - Documentation/networking/netconsole.txt for an - alternative. + See also Documentation/serial-console.txt. uart,io,[,options] uart,mmio,[,options] @@ -435,19 +412,13 @@ running once the system is up. debug [KNL] Enable kernel debugging (events log level). - debug_locks_verbose= - [KNL] verbose self-tests - Format=<0|1> - Print debugging info while doing the locking API - self-tests. - We default to 0 (no extra messages), setting it to - 1 will print _a lot_ more information - normally - only useful to kernel developers. - decnet= [HW,NET] Format: [,] See also Documentation/networking/decnet.txt. + devfs= [DEVFS] + See Documentation/filesystems/devfs/boot-options. + dhash_entries= [KNL] Set number of hash buckets for dentry cache. @@ -697,12 +668,6 @@ running once the system is up. ips= [HW,SCSI] Adaptec / IBM ServeRAID controller See header of drivers/scsi/ips.c. - ports= [IP_VS_FTP] IPVS ftp helper module - Default is 21. - Up to 8 (IP_VS_APP_MAX_PORTS) ports - may be specified. - Format: ,.... - irqfixup [HW] When an interrupt is not handled search all handlers for it. Intended to get systems with badly broken @@ -1035,8 +1000,6 @@ running once the system is up. nocache [ARM] - nodelayacct [KNL] Disable per-task delay accounting - nodisconnect [HW,SCSI,M68K] Disables SCSI disconnects. noexec [IA-64] @@ -1045,9 +1008,7 @@ running once the system is up. noexec=on: enable non-executable mappings (default) noexec=off: disable nn-executable mappings - nofxsr [BUGS=IA-32] Disables x86 floating point extended - register save and restore. The kernel will only save - legacy floating-point registers on task switch. + nofxsr [BUGS=IA-32] nohlt [BUGS=ARM] @@ -1077,10 +1038,10 @@ running once the system is up. noltlbs [PPC] Do not use large page/tlb entries for kernel lowmem mapping on PPC40x. - nomca [IA-64] Disable machine check abort handling - nomce [IA-32] Machine Check Exception + nomca [IA-64] Disable machine check abort handling + noresidual [PPC] Don't use residual data on PReP machines. noresume [SWSUSP] Disables resume and restores original swap @@ -1092,8 +1053,6 @@ running once the system is up. nosbagart [IA-64] - nosep [BUGS=IA-32] Disables x86 SYSENTER/SYSEXIT support. - nosmp [SMP] Tells an SMP kernel to act as a UP kernel. nosync [HW,M68K] Disables sync negotiation for all devices. @@ -1163,11 +1122,6 @@ running once the system is up. pas16= [HW,SCSI] See header of drivers/scsi/pas16.c. - pause_on_oops= - Halt all CPUs after the first oops has been printed for - the specified number of seconds. This is to be used if - your oopses keep scrolling off the screen. - pcbit= [HW,ISDN] pcd. [PARIDE] @@ -1189,9 +1143,6 @@ running once the system is up. Mechanism 2. nommconf [IA-32,X86_64] Disable use of MMCONFIG for PCI Configuration - nomsi [MSI] If the PCI_MSI kernel config parameter is - enabled, this kernel boot option can be used to - disable the use of MSI interrupts system-wide. nosort [IA-32] Don't sort PCI devices according to order given by the PCI BIOS. This sorting is done to get a device order compatible with @@ -1425,15 +1376,6 @@ running once the system is up. If enabled at boot time, /selinux/disable can be used later to disable prior to initial policy load. - selinux_compat_net = - [SELINUX] Set initial selinux_compat_net flag value. - Format: { "0" | "1" } - 0 -- use new secmark-based packet controls - 1 -- use legacy packet controls - Default value is 0 (preferred). - Value can be changed at runtime via - /selinux/compat_net. - serialnumber [BUGS=IA-32] sg_def_reserved_size= [SCSI] @@ -1637,10 +1579,6 @@ running once the system is up. time Show timing data prefixed to each printk message line - clocksource= [GENERIC_TIME] Override the default clocksource - Override the default clocksource and use the clocksource - with the name specified. - tipar.timeout= [HW,PPT] Set communications timeout in tenths of a second (default 15). @@ -1682,10 +1620,6 @@ running once the system is up. usbhid.mousepoll= [USBHID] The interval which mice are to be polled at. - vdso= [IA-32] - vdso=1: enable VDSO (default) - vdso=0: disable VDSO mapping - video= [FB] Frame buffer configuration See Documentation/fb/modedb.txt. @@ -1702,14 +1636,9 @@ running once the system is up. decrease the size and leave more room for directly mapped kernel RAM. - vmhalt= [KNL,S390] Perform z/VM CP command after system halt. - Format: - - vmpanic= [KNL,S390] Perform z/VM CP command after kernel panic. - Format: + vmhalt= [KNL,S390] - vmpoff= [KNL,S390] Perform z/VM CP command after power off. - Format: + vmpoff= [KNL,S390] waveartist= [HW,OSS] Format: ,,, @@ -1735,6 +1664,20 @@ running once the system is up. ______________________________________________________________________ +Changelog: + +2000-06-?? Mr. Unknown + The last known update (for 2.4.0) - the changelog was not kept before. + +2002-11-24 Petr Baudis + Randy Dunlap + Update for 2.5.49, description for most of the options introduced, + references to other documentation (C files, READMEs, ..), added S390, + PPC, SPARC, MTD, ALSA and OSS category. Minor corrections and + reformatting. + +2005-10-19 Randy Dunlap + Lots of typos, whitespace, some reformatting. TODO: diff --git a/Documentation/keys-request-key.txt b/Documentation/keys-request-key.txt index c1f64fdf8..22488d791 100644 --- a/Documentation/keys-request-key.txt +++ b/Documentation/keys-request-key.txt @@ -3,23 +3,16 @@ =================== The key request service is part of the key retention service (refer to -Documentation/keys.txt). This document explains more fully how the requesting -algorithm works. +Documentation/keys.txt). This document explains more fully how that the +requesting algorithm works. The process starts by either the kernel requesting a service by calling -request_key*(): +request_key(): struct key *request_key(const struct key_type *type, const char *description, const char *callout_string); -or: - - struct key *request_key_with_auxdata(const struct key_type *type, - const char *description, - const char *callout_string, - void *aux); - Or by userspace invoking the request_key system call: key_serial_t request_key(const char *type, @@ -27,26 +20,16 @@ Or by userspace invoking the request_key system call: const char *callout_info, key_serial_t dest_keyring); -The main difference between the access points is that the in-kernel interface -does not need to link the key to a keyring to prevent it from being immediately -destroyed. The kernel interface returns a pointer directly to the key, and -it's up to the caller to destroy the key. - -The request_key_with_auxdata() call is like the in-kernel request_key() call, -except that it permits auxiliary data to be passed to the upcaller (the default -is NULL). This is only useful for those key types that define their own upcall -mechanism rather than using /sbin/request-key. +The main difference between the two access points is that the in-kernel +interface does not need to link the key to a keyring to prevent it from being +immediately destroyed. The kernel interface returns a pointer directly to the +key, and it's up to the caller to destroy the key. The userspace interface links the key to a keyring associated with the process to prevent the key from going away, and returns the serial number of the key to the caller. -The following example assumes that the key types involved don't define their -own upcall mechanisms. If they do, then those should be substituted for the -forking and execution of /sbin/request-key. - - =========== THE PROCESS =========== @@ -57,8 +40,8 @@ A request proceeds in the following manner: interface]. (2) request_key() searches the process's subscribed keyrings to see if there's - a suitable key there. If there is, it returns the key. If there isn't, - and callout_info is not set, an error is returned. Otherwise the process + a suitable key there. If there is, it returns the key. If there isn't, and + callout_info is not set, an error is returned. Otherwise the process proceeds to the next step. (3) request_key() sees that A doesn't have the desired key yet, so it creates @@ -79,7 +62,7 @@ A request proceeds in the following manner: instantiation. (7) The program may want to access another key from A's context (say a - Kerberos TGT key). It just requests the appropriate key, and the keyring + Kerberos TGT key). It just requests the appropriate key, and the keyring search notes that the session keyring has auth key V in its bottom level. This will permit it to then search the keyrings of process A with the @@ -96,11 +79,10 @@ A request proceeds in the following manner: (10) The program then exits 0 and request_key() deletes key V and returns key U to the caller. -This also extends further. If key W (step 7 above) didn't exist, key W would -be created uninstantiated, another auth key (X) would be created (as per step -3) and another copy of /sbin/request-key spawned (as per step 4); but the -context specified by auth key X will still be process A, as it was in auth key -V. +This also extends further. If key W (step 7 above) didn't exist, key W would be +created uninstantiated, another auth key (X) would be created (as per step 3) +and another copy of /sbin/request-key spawned (as per step 4); but the context +specified by auth key X will still be process A, as it was in auth key V. This is because process A's keyrings can't simply be attached to /sbin/request-key at the appropriate places because (a) execve will discard two @@ -136,17 +118,17 @@ A search of any particular keyring proceeds in the following fashion: (2) It considers all the non-keyring keys within that keyring and, if any key matches the criteria specified, calls key_permission(SEARCH) on it to see - if the key is allowed to be found. If it is, that key is returned; if + if the key is allowed to be found. If it is, that key is returned; if not, the search continues, and the error code is retained if of higher priority than the one currently set. (3) It then considers all the keyring-type keys in the keyring it's currently - searching. It calls key_permission(SEARCH) on each keyring, and if this + searching. It calls key_permission(SEARCH) on each keyring, and if this grants permission, it recurses, executing steps (2) and (3) on that keyring. The process stops immediately a valid key is found with permission granted to -use it. Any error from a previous match attempt is discarded and the key is +use it. Any error from a previous match attempt is discarded and the key is returned. When search_process_keyrings() is invoked, it performs the following searches @@ -171,7 +153,7 @@ The moment one succeeds, all pending errors are discarded and the found key is returned. Only if all these fail does the whole thing fail with the highest priority -error. Note that several errors may have come from LSM. +error. Note that several errors may have come from LSM. The error priority is: diff --git a/Documentation/keys.txt b/Documentation/keys.txt index e373f0212..aaa01b0e3 100644 --- a/Documentation/keys.txt +++ b/Documentation/keys.txt @@ -19,7 +19,6 @@ This document has the following sections: - Key overview - Key service overview - Key access permissions - - SELinux support - New procfs files - Userspace system call interface - Kernel services @@ -233,39 +232,6 @@ For changing the ownership, group ID or permissions mask, being the owner of the key or having the sysadmin capability is sufficient. -=============== -SELINUX SUPPORT -=============== - -The security class "key" has been added to SELinux so that mandatory access -controls can be applied to keys created within various contexts. This support -is preliminary, and is likely to change quite significantly in the near future. -Currently, all of the basic permissions explained above are provided in SELinux -as well; SELinux is simply invoked after all basic permission checks have been -performed. - -The value of the file /proc/self/attr/keycreate influences the labeling of -newly-created keys. If the contents of that file correspond to an SELinux -security context, then the key will be assigned that context. Otherwise, the -key will be assigned the current context of the task that invoked the key -creation request. Tasks must be granted explicit permission to assign a -particular context to newly-created keys, using the "create" permission in the -key security class. - -The default keyrings associated with users will be labeled with the default -context of the user if and only if the login programs have been instrumented to -properly initialize keycreate during the login process. Otherwise, they will -be labeled with the context of the login program itself. - -Note, however, that the default keyrings associated with the root user are -labeled with the default kernel context, since they are created early in the -boot process, before root has a chance to log in. - -The keyrings associated with new threads are each labeled with the context of -their associated thread, and both session and process keyrings are handled -similarly. - - ================ NEW PROCFS FILES ================ @@ -275,17 +241,9 @@ about the status of the key service: (*) /proc/keys - This lists the keys that are currently viewable by the task reading the - file, giving information about their type, description and permissions. - It is not possible to view the payload of the key this way, though some - information about it may be given. - - 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. - - The contents of the file look like this: + This lists all the keys on the system, giving information about their + type, description and permissions. The payload of the key is not available + this way: SERIAL FLAGS USAGE EXPY PERM UID GID TYPE DESCRIPTION: SUMMARY 00000001 I----- 39 perm 1f3f0000 0 0 keyring _uid_ses.0: 1/4 @@ -313,7 +271,7 @@ about the status of the key service: (*) /proc/key-users This file lists the tracking data for each user that has at least one key - on the system. Such data includes quota information and statistics: + on the system. Such data includes quota information and statistics: [root@andromeda root]# cat /proc/key-users 0: 46 45/45 1/100 13/10000 @@ -780,17 +738,6 @@ payload contents" for more information. See also Documentation/keys-request-key.txt. -(*) To search for a key, passing auxiliary data to the upcaller, call: - - struct key *request_key_with_auxdata(const struct key_type *type, - const char *description, - const char *callout_string, - void *aux); - - This is identical to request_key(), except that the auxiliary data is - passed to the key_type->request_key() op if it exists. - - (*) When it is no longer required, the key should be released using: void key_put(struct key *key); @@ -988,16 +935,6 @@ The structure has a number of fields, some of which are mandatory: It is not safe to sleep in this method; the caller may hold spinlocks. - (*) void (*revoke)(struct key *key); - - This method is optional. It is called to discard part of the payload - data upon a key being revoked. The caller will have the key semaphore - write-locked. - - It is safe to sleep in this method, though care should be taken to avoid - a deadlock against the key semaphore. - - (*) void (*destroy)(struct key *key); This method is optional. It is called to discard the payload data on a key @@ -1042,24 +979,6 @@ The structure has a number of fields, some of which are mandatory: as might happen when the userspace buffer is accessed. - (*) int (*request_key)(struct key *key, struct key *authkey, const char *op, - void *aux); - - This method is optional. If provided, request_key() and - request_key_with_auxdata() will invoke this function rather than - upcalling to /sbin/request-key to operate upon a key of this type. - - The aux parameter is as passed to request_key_with_auxdata() or is NULL - otherwise. Also passed are the key to be operated upon, the - authorisation key for this operation and the operation type (currently - only "create"). - - This function should return only when the upcall is complete. Upon return - the authorisation key will be revoked, and the target key will be - negatively instantiated if it is still uninstantiated. The error will be - returned to the caller of request_key*(). - - ============================ REQUEST-KEY CALLBACK SERVICE ============================ diff --git a/Documentation/kobject.txt b/Documentation/kobject.txt index 949f7b5a2..8d9bffbd1 100644 --- a/Documentation/kobject.txt +++ b/Documentation/kobject.txt @@ -247,7 +247,7 @@ the object-specific fields, which include: - default_attrs: Default attributes to be exported via sysfs when the object is registered.Note that the last attribute has to be initialized to NULL ! You can find a complete implementation - in block/genhd.c + in drivers/block/genhd.c Instances of struct kobj_type are not registered; only referenced by diff --git a/Documentation/laptop-mode.txt b/Documentation/laptop-mode.txt index 5696e8794..b18e21675 100644 --- a/Documentation/laptop-mode.txt +++ b/Documentation/laptop-mode.txt @@ -919,11 +919,11 @@ int main(int argc, char **argv) int settle_time = 60; /* Parse the simple command-line */ - if (argc == 2) - disk = argv[1]; - else if (argc == 4) { - settle_time = atoi(argv[2]); - disk = argv[3]; + if (ac == 2) + disk = av[1]; + else if (ac == 4) { + settle_time = atoi(av[2]); + disk = av[3]; } else usage(); diff --git a/Documentation/m68k/README.buddha b/Documentation/m68k/README.buddha index ef484a719..bf802ffc9 100644 --- a/Documentation/m68k/README.buddha +++ b/Documentation/m68k/README.buddha @@ -29,7 +29,7 @@ address is written to $4a, then the whole Byte is written to $48, while it doesn't matter how often you're writing to $4a as long as $48 is not touched. After $48 has been written, the whole card disappears from $e8 and is mapped to the new -address just written. Make sure $4a is written before $48, +address just written. Make shure $4a is written before $48, otherwise your chance is only 1:16 to find the board :-). The local memory-map is even active when mapped to $e8: diff --git a/Documentation/md.txt b/Documentation/md.txt index 0668f9dc9..03a13c462 100644 --- a/Documentation/md.txt +++ b/Documentation/md.txt @@ -200,17 +200,6 @@ All md devices contain: This can be written only while the array is being assembled, not after it is started. - layout - The "layout" for the array for the particular level. This is - simply a number that is interpretted differently by different - levels. It can be written while assembling an array. - - resync_start - The point at which resync should start. If no resync is needed, - this will be a very large number. At array creation it will - default to 0, though starting the array as 'clean' will - set it much larger. - new_dev This file can be written but not read. The value written should be a block device number as major:minor. e.g. 8:0 @@ -218,54 +207,6 @@ All md devices contain: available. It will then appear at md/dev-XXX (depending on the name of the device) and further configuration is then possible. - safe_mode_delay - When an md array has seen no write requests for a certain period - of time, it will be marked as 'clean'. When another write - request arrive, the array is marked as 'dirty' before the write - commenses. This is known as 'safe_mode'. - The 'certain period' is controlled by this file which stores the - period as a number of seconds. The default is 200msec (0.200). - Writing a value of 0 disables safemode. - - array_state - This file contains a single word which describes the current - state of the array. In many cases, the state can be set by - writing the word for the desired state, however some states - cannot be explicitly set, and some transitions are not allowed. - - clear - No devices, no size, no level - Writing is equivalent to STOP_ARRAY ioctl - inactive - May have some settings, but array is not active - all IO results in error - When written, doesn't tear down array, but just stops it - suspended (not supported yet) - All IO requests will block. The array can be reconfigured. - Writing this, if accepted, will block until array is quiessent - readonly - no resync can happen. no superblocks get written. - write requests fail - read-auto - like readonly, but behaves like 'clean' on a write request. - - clean - no pending writes, but otherwise active. - When written to inactive array, starts without resync - If a write request arrives then - if metadata is known, mark 'dirty' and switch to 'active'. - if not known, block and switch to write-pending - If written to an active array that has pending writes, then fails. - active - fully active: IO and resync can be happening. - When written to inactive array, starts with resync - - write-pending - clean, but writes are blocked waiting for 'active' to be written. - - active-idle - like active, but no writes have been seen for a while (safe_mode_delay). - - sync_speed_min sync_speed_max This are similar to /proc/sys/dev/raid/speed_limit_{min,max} @@ -309,18 +250,10 @@ Each directory contains: faulty - device has been kicked from active use due to a detected fault in_sync - device is a fully in-sync member of the array - writemostly - device will only be subject to read - requests if there are no other options. - This applies only to raid1 arrays. spare - device is working, but not a full member. This includes spares that are in the process of being recoverred to This list make grow in future. - This can be written to. - Writing "faulty" simulates a failure on the device. - Writing "remove" removes the device from the array. - Writing "writemostly" sets the writemostly flag. - Writing "-writemostly" clears the writemostly flag. errors An approximate count of read errors that have been detected on diff --git a/Documentation/mips/time.README b/Documentation/mips/time.README index 69ddc5c14..70bc0dd43 100644 --- a/Documentation/mips/time.README +++ b/Documentation/mips/time.README @@ -65,7 +65,7 @@ the following functions or values: 1. (optional) set up RTC routines 2. (optional) calibrate and set the mips_counter_frequency - b) plat_timer_setup - a function pointer. Invoked at the end of time_init() + b) board_timer_setup - a function pointer. Invoked at the end of time_init() 1. (optional) over-ride any decisions made in time_init() 2. set up the irqaction for timer interrupt. 3. enable the timer interrupt @@ -116,17 +116,19 @@ Step 2: the machine setup() function If you supply board_time_init(), set the function poointer. + Set the function pointer board_timer_setup() (mandatory) -Step 3: implement rtc routines, board_time_init() and plat_timer_setup() + +Step 3: implement rtc routines, board_time_init() and board_timer_setup() if needed. - board_time_init() - + board_time_init() - a) (optional) set up RTC routines, b) (optional) calibrate and set the mips_counter_frequency (only needed if you intended to use fixed_rate_gettimeoffset or use cpu counter as timer interrupt source) - plat_timer_setup() - + board_timer_setup() - a) (optional) over-write any choices made above by time_init(). b) machine specific code should setup the timer irqaction. c) enable the timer interrupt diff --git a/Documentation/mtrr.txt b/Documentation/mtrr.txt index c39ac3959..b78af1c32 100644 --- a/Documentation/mtrr.txt +++ b/Documentation/mtrr.txt @@ -138,29 +138,19 @@ Reading MTRRs from a C program using ioctl()'s: */ #include -#include #include #include #include #include #include #include +#define MTRR_NEED_STRINGS #include #define TRUE 1 #define FALSE 0 #define ERRSTRING strerror (errno) -static char *mtrr_strings[MTRR_NUM_TYPES] = -{ - "uncachable", /* 0 */ - "write-combining", /* 1 */ - "?", /* 2 */ - "?", /* 3 */ - "write-through", /* 4 */ - "write-protect", /* 5 */ - "write-back", /* 6 */ -}; int main () { @@ -242,22 +232,13 @@ Creating MTRRs from a C programme using ioctl()'s: #include #include #include +#define MTRR_NEED_STRINGS #include #define TRUE 1 #define FALSE 0 #define ERRSTRING strerror (errno) -static char *mtrr_strings[MTRR_NUM_TYPES] = -{ - "uncachable", /* 0 */ - "write-combining", /* 1 */ - "?", /* 2 */ - "?", /* 3 */ - "write-through", /* 4 */ - "write-protect", /* 5 */ - "write-back", /* 6 */ -}; int main (int argc, char **argv) { diff --git a/Documentation/networking/00-INDEX b/Documentation/networking/00-INDEX index b1181ce23..5b01d5cc4 100644 --- a/Documentation/networking/00-INDEX +++ b/Documentation/networking/00-INDEX @@ -92,6 +92,8 @@ routing.txt - the new routing mechanism shaper.txt - info on the module that can shape/limit transmitted traffic. +sis900.txt + - SiS 900/7016 Fast Ethernet device driver info. sk98lin.txt - Marvell Yukon Chipset / SysKonnect SK-98xx compliant Gigabit Ethernet Adapter family driver info diff --git a/Documentation/networking/README.ipw2100 b/Documentation/networking/README.ipw2100 index f3fcaa41f..3ab40379d 100644 --- a/Documentation/networking/README.ipw2100 +++ b/Documentation/networking/README.ipw2100 @@ -3,18 +3,18 @@ Intel(R) PRO/Wireless 2100 Driver for Linux in support of: Intel(R) PRO/Wireless 2100 Network Connection -Copyright (C) 2003-2006, Intel Corporation +Copyright (C) 2003-2005, Intel Corporation README.ipw2100 -Version: git-1.1.5 -Date : January 25, 2006 +Version: 1.1.3 +Date : October 17, 2005 Index ----------------------------------------------- 0. IMPORTANT INFORMATION BEFORE USING THIS DRIVER 1. Introduction -2. Release git-1.1.5 Current Features +2. Release 1.1.3 Current Features 3. Command Line Parameters 4. Sysfs Helper Files 5. Radio Kill Switch @@ -89,7 +89,7 @@ potential fixes and patches, as well as links to the development mailing list for the driver project. -2. Release git-1.1.5 Current Supported Features +2. Release 1.1.3 Current Supported Features ----------------------------------------------- - Managed (BSS) and Ad-Hoc (IBSS) - WEP (shared key and open) @@ -270,7 +270,7 @@ For installation support on the ipw2100 1.1.0 driver on Linux kernels 9. License ----------------------------------------------- - Copyright(c) 2003 - 2006 Intel Corporation. All rights reserved. + Copyright(c) 2003 - 2005 Intel Corporation. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License (version 2) as diff --git a/Documentation/networking/README.ipw2200 b/Documentation/networking/README.ipw2200 index 4f2a40f1d..c6492d383 100644 --- a/Documentation/networking/README.ipw2200 +++ b/Documentation/networking/README.ipw2200 @@ -10,12 +10,12 @@ both hardware adapters listed above. In this document the Intel(R) PRO/Wireless 2915ABG Driver for Linux will be used to reference the unified driver. -Copyright (C) 2004-2006, Intel Corporation +Copyright (C) 2004-2005, Intel Corporation README.ipw2200 -Version: 1.1.2 -Date : March 30, 2006 +Version: 1.0.8 +Date : October 20, 2005 Index @@ -26,11 +26,9 @@ Index 1.2. Module parameters 1.3. Wireless Extension Private Methods 1.4. Sysfs Helper Files -1.5. Supported channels 2. Ad-Hoc Networking 3. Interacting with Wireless Tools 3.1. iwconfig mode -3.2. iwconfig sens 4. About the Version Numbers 5. Firmware installation 6. Support @@ -103,7 +101,7 @@ file. 1.1. Overview of Features ----------------------------------------------- -The current release (1.1.2) supports the following features: +The current release (1.0.8) supports the following features: + BSS mode (Infrastructure, Managed) + IBSS mode (Ad-Hoc) @@ -247,8 +245,8 @@ and can set the contents via echo. For example: % cat /sys/bus/pci/drivers/ipw2200/debug_level Will report the current debug level of the driver's logging subsystem -(only available if CONFIG_IPW2200_DEBUG was configured when the driver -was built). +(only available if CONFIG_IPW_DEBUG was configured when the driver was +built). You can set the debug level via: @@ -316,35 +314,6 @@ For the device level files, see /sys/bus/pci/drivers/ipw2200: running ifconfig and is therefore disabled by default. -1.5. Supported channels ------------------------------------------------ - -Upon loading the Intel(R) PRO/Wireless 2915ABG Driver for Linux, a -message stating the detected geography code and the number of 802.11 -channels supported by the card will be displayed in the log. - -The geography code corresponds to a regulatory domain as shown in the -table below. - - Supported channels -Code Geography 802.11bg 802.11a - ---- Restricted 11 0 -ZZF Custom US/Canada 11 8 -ZZD Rest of World 13 0 -ZZA Custom USA & Europe & High 11 13 -ZZB Custom NA & Europe 11 13 -ZZC Custom Japan 11 4 -ZZM Custom 11 0 -ZZE Europe 13 19 -ZZJ Custom Japan 14 4 -ZZR Rest of World 14 0 -ZZH High Band 13 4 -ZZG Custom Europe 13 4 -ZZK Europe 13 24 -ZZL Europe 11 13 - - 2. Ad-Hoc Networking ----------------------------------------------- @@ -384,15 +353,6 @@ When configuring the mode of the adapter, all run-time configured parameters are reset to the value used when the module was loaded. This includes channels, rates, ESSID, etc. -3.2 iwconfig sens ------------------------------------------------ - -The 'iwconfig ethX sens XX' command will not set the signal sensitivity -threshold, as described in iwconfig documentation, but rather the number -of consecutive missed beacons that will trigger handover, i.e. roaming -to another access point. At the same time, it will set the disassociation -threshold to 3 times the given value. - 4. About the Version Numbers ----------------------------------------------- @@ -448,7 +408,7 @@ For general information and support, go to: 7. License ----------------------------------------------- - Copyright(c) 2003 - 2006 Intel Corporation. All rights reserved. + Copyright(c) 2003 - 2005 Intel Corporation. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License version 2 as diff --git a/Documentation/networking/bonding.txt b/Documentation/networking/bonding.txt index afac78044..8d8b4e5ea 100644 --- a/Documentation/networking/bonding.txt +++ b/Documentation/networking/bonding.txt @@ -1,7 +1,7 @@ Linux Ethernet Bonding Driver HOWTO - Latest update: 24 April 2006 + Latest update: 21 June 2005 Initial release : Thomas Davis Corrections, HA extensions : 2000/10/03-15 : @@ -12,8 +12,6 @@ Corrections, HA extensions : 2000/10/03-15 : - Jay Vosburgh Reorganized and updated Feb 2005 by Jay Vosburgh -Added Sysfs information: 2006/04/24 - - Mitch Williams Introduction ============ @@ -40,62 +38,61 @@ Table of Contents 2. Bonding Driver Options 3. Configuring Bonding Devices -3.1 Configuration with Sysconfig Support -3.1.1 Using DHCP with Sysconfig -3.1.2 Configuring Multiple Bonds with Sysconfig -3.2 Configuration with Initscripts Support -3.2.1 Using DHCP with Initscripts -3.2.2 Configuring Multiple Bonds with Initscripts -3.3 Configuring Bonding Manually with Ifenslave +3.1 Configuration with sysconfig support +3.1.1 Using DHCP with sysconfig +3.1.2 Configuring Multiple Bonds with sysconfig +3.2 Configuration with initscripts support +3.2.1 Using DHCP with initscripts +3.2.2 Configuring Multiple Bonds with initscripts +3.3 Configuring Bonding Manually 3.3.1 Configuring Multiple Bonds Manually -3.4 Configuring Bonding Manually via Sysfs -4. Querying Bonding Configuration -4.1 Bonding Configuration -4.2 Network Configuration +5. Querying Bonding Configuration +5.1 Bonding Configuration +5.2 Network Configuration -5. Switch Configuration +6. Switch Configuration -6. 802.1q VLAN Support +7. 802.1q VLAN Support -7. Link Monitoring -7.1 ARP Monitor Operation -7.2 Configuring Multiple ARP Targets -7.3 MII Monitor Operation +8. Link Monitoring +8.1 ARP Monitor Operation +8.2 Configuring Multiple ARP Targets +8.3 MII Monitor Operation -8. Potential Trouble Sources -8.1 Adventures in Routing -8.2 Ethernet Device Renaming -8.3 Painfully Slow Or No Failed Link Detection By Miimon +9. Potential Trouble Sources +9.1 Adventures in Routing +9.2 Ethernet Device Renaming +9.3 Painfully Slow Or No Failed Link Detection By Miimon -9. SNMP agents +10. SNMP agents -10. Promiscuous mode +11. Promiscuous mode -11. Configuring Bonding for High Availability -11.1 High Availability in a Single Switch Topology -11.2 High Availability in a Multiple Switch Topology -11.2.1 HA Bonding Mode Selection for Multiple Switch Topology -11.2.2 HA Link Monitoring for Multiple Switch Topology +12. Configuring Bonding for High Availability +12.1 High Availability in a Single Switch Topology +12.2 High Availability in a Multiple Switch Topology +12.2.1 HA Bonding Mode Selection for Multiple Switch Topology +12.2.2 HA Link Monitoring for Multiple Switch Topology -12. Configuring Bonding for Maximum Throughput -12.1 Maximum Throughput in a Single Switch Topology -12.1.1 MT Bonding Mode Selection for Single Switch Topology -12.1.2 MT Link Monitoring for Single Switch Topology -12.2 Maximum Throughput in a Multiple Switch Topology -12.2.1 MT Bonding Mode Selection for Multiple Switch Topology -12.2.2 MT Link Monitoring for Multiple Switch Topology +13. Configuring Bonding for Maximum Throughput +13.1 Maximum Throughput in a Single Switch Topology +13.1.1 MT Bonding Mode Selection for Single Switch Topology +13.1.2 MT Link Monitoring for Single Switch Topology +13.2 Maximum Throughput in a Multiple Switch Topology +13.2.1 MT Bonding Mode Selection for Multiple Switch Topology +13.2.2 MT Link Monitoring for Multiple Switch Topology -13. Switch Behavior Issues -13.1 Link Establishment and Failover Delays -13.2 Duplicated Incoming Packets +14. Switch Behavior Issues +14.1 Link Establishment and Failover Delays +14.2 Duplicated Incoming Packets -14. Hardware Specific Considerations -14.1 IBM BladeCenter +15. Hardware Specific Considerations +15.1 IBM BladeCenter -15. Frequently Asked Questions +16. Frequently Asked Questions -16. Resources and Links +17. Resources and Links 1. Bonding Driver Installation @@ -159,9 +156,6 @@ you're trying to build it for. Some distros (e.g., Red Hat from 7.1 onwards) do not have /usr/include/linux symbolically linked to the default kernel source include directory. -SECOND IMPORTANT NOTE: - If you plan to configure bonding using sysfs, you do not need -to use ifenslave. 2. Bonding Driver Options ========================= @@ -276,7 +270,7 @@ mode In bonding version 2.6.2 or later, when a failover occurs in active-backup mode, bonding will issue one or more gratuitous ARPs on the newly active slave. - One gratuitous ARP is issued for the bonding master + One gratutious ARP is issued for the bonding master interface and each VLAN interfaces configured above it, provided that the interface has at least one IP address configured. Gratuitous ARPs issued for VLAN @@ -383,7 +377,7 @@ mode When a link is reconnected or a new slave joins the bond the receive traffic is redistributed among all active slaves in the bond by initiating ARP Replies - with the selected MAC address to each of the + with the selected mac address to each of the clients. The updelay parameter (detailed below) must be set to a value equal or greater than the switch's forwarding delay so that the ARP Replies sent to the @@ -504,12 +498,11 @@ not exist, and the layer2 policy is the only policy. 3. Configuring Bonding Devices ============================== - You can configure bonding using either your distro's network -initialization scripts, or manually using either ifenslave or the -sysfs interface. Distros generally use one of two packages for the -network initialization scripts: initscripts or sysconfig. Recent -versions of these packages have support for bonding, while older -versions do not. + There are, essentially, two methods for configuring bonding: +with support from the distro's network initialization scripts, and +without. Distros generally use one of two packages for the network +initialization scripts: initscripts or sysconfig. Recent versions of +these packages have support for bonding, while older versions do not. We will first describe the options for configuring bonding for distros using versions of initscripts and sysconfig with full or @@ -537,7 +530,7 @@ $ grep ifenslave /sbin/ifup If this returns any matches, then your initscripts or sysconfig has support for bonding. -3.1 Configuration with Sysconfig Support +3.1 Configuration with sysconfig support ---------------------------------------- This section applies to distros using a version of sysconfig @@ -545,7 +538,7 @@ with bonding support, for example, SuSE Linux Enterprise Server 9. SuSE SLES 9's networking configuration system does support bonding, however, at this writing, the YaST system configuration -front end does not provide any means to work with bonding devices. +frontend does not provide any means to work with bonding devices. Bonding devices can be managed by hand, however, as follows. First, if they have not already been configured, configure the @@ -667,7 +660,7 @@ format can be found in an example ifcfg template file: Note that the template does not document the various BONDING_ settings described above, but does describe many of the other options. -3.1.1 Using DHCP with Sysconfig +3.1.1 Using DHCP with sysconfig ------------------------------- Under sysconfig, configuring a device with BOOTPROTO='dhcp' @@ -677,7 +670,7 @@ attempt to obtain the device address from DHCP prior to adding any of the slave devices. Without active slaves, the DHCP requests are not sent to the network. -3.1.2 Configuring Multiple Bonds with Sysconfig +3.1.2 Configuring Multiple Bonds with sysconfig ----------------------------------------------- The sysconfig network initialization system is capable of @@ -692,7 +685,7 @@ ifcfg-bondX files. options in the ifcfg-bondX file, it is not necessary to add them to the system /etc/modules.conf or /etc/modprobe.conf configuration file. -3.2 Configuration with Initscripts Support +3.2 Configuration with initscripts support ------------------------------------------ This section applies to distros using a version of initscripts @@ -763,7 +756,7 @@ options for your configuration. will restart the networking subsystem and your bond link should be now up and running. -3.2.1 Using DHCP with Initscripts +3.2.1 Using DHCP with initscripts --------------------------------- Recent versions of initscripts (the version supplied with @@ -775,7 +768,7 @@ above, except replace the line "BOOTPROTO=none" with "BOOTPROTO=dhcp" and add a line consisting of "TYPE=Bonding". Note that the TYPE value is case sensitive. -3.2.2 Configuring Multiple Bonds with Initscripts +3.2.2 Configuring Multiple Bonds with initscripts ------------------------------------------------- At this writing, the initscripts package does not directly @@ -791,8 +784,8 @@ Fedora Core kernels, and has been seen on RHEL 4 as well. On kernels exhibiting this problem, it will be impossible to configure multiple bonds with differing parameters. -3.3 Configuring Bonding Manually with Ifenslave ------------------------------------------------ +3.3 Configuring Bonding Manually +-------------------------------- This section applies to distros whose network initialization scripts (the sysconfig or initscripts package) do not have specific @@ -896,139 +889,11 @@ install bond1 /sbin/modprobe --ignore-install bonding -o bond1 \ This may be repeated any number of times, specifying a new and unique name in place of bond1 for each subsequent instance. -3.4 Configuring Bonding Manually via Sysfs ------------------------------------------- - - Starting with version 3.0, Channel Bonding may be configured -via the sysfs interface. This interface allows dynamic configuration -of all bonds in the system without unloading the module. It also -allows for adding and removing bonds at runtime. Ifenslave is no -longer required, though it is still supported. - - Use of the sysfs interface allows you to use multiple bonds -with different configurations without having to reload the module. -It also allows you to use multiple, differently configured bonds when -bonding is compiled into the kernel. - - You must have the sysfs filesystem mounted to configure -bonding this way. The examples in this document assume that you -are using the standard mount point for sysfs, e.g. /sys. If your -sysfs filesystem is mounted elsewhere, you will need to adjust the -example paths accordingly. - -Creating and Destroying Bonds ------------------------------ -To add a new bond foo: -# echo +foo > /sys/class/net/bonding_masters - -To remove an existing bond bar: -# echo -bar > /sys/class/net/bonding_masters - -To show all existing bonds: -# cat /sys/class/net/bonding_masters - -NOTE: due to 4K size limitation of sysfs files, this list may be -truncated if you have more than a few hundred bonds. This is unlikely -to occur under normal operating conditions. - -Adding and Removing Slaves --------------------------- - Interfaces may be enslaved to a bond using the file -/sys/class/net//bonding/slaves. The semantics for this file -are the same as for the bonding_masters file. - -To enslave interface eth0 to bond bond0: -# ifconfig bond0 up -# echo +eth0 > /sys/class/net/bond0/bonding/slaves - -To free slave eth0 from bond bond0: -# echo -eth0 > /sys/class/net/bond0/bonding/slaves - - NOTE: The bond must be up before slaves can be added. All -slaves are freed when the interface is brought down. - - When an interface is enslaved to a bond, symlinks between the -two are created in the sysfs filesystem. In this case, you would get -/sys/class/net/bond0/slave_eth0 pointing to /sys/class/net/eth0, and -/sys/class/net/eth0/master pointing to /sys/class/net/bond0. - - This means that you can tell quickly whether or not an -interface is enslaved by looking for the master symlink. Thus: -# echo -eth0 > /sys/class/net/eth0/master/bonding/slaves -will free eth0 from whatever bond it is enslaved to, regardless of -the name of the bond interface. - -Changing a Bond's Configuration -------------------------------- - Each bond may be configured individually by manipulating the -files located in /sys/class/net//bonding - - The names of these files correspond directly with the command- -line parameters described elsewhere in in this file, and, with the -exception of arp_ip_target, they accept the same values. To see the -current setting, simply cat the appropriate file. - - A few examples will be given here; for specific usage -guidelines for each parameter, see the appropriate section in this -document. - -To configure bond0 for balance-alb mode: -# ifconfig bond0 down -# echo 6 > /sys/class/net/bond0/bonding/mode - - or - -# echo balance-alb > /sys/class/net/bond0/bonding/mode - NOTE: The bond interface must be down before the mode can be -changed. - -To enable MII monitoring on bond0 with a 1 second interval: -# echo 1000 > /sys/class/net/bond0/bonding/miimon - NOTE: If ARP monitoring is enabled, it will disabled when MII -monitoring is enabled, and vice-versa. - -To add ARP targets: -# echo +192.168.0.100 > /sys/class/net/bond0/bonding/arp_ip_target -# echo +192.168.0.101 > /sys/class/net/bond0/bonding/arp_ip_target - NOTE: up to 10 target addresses may be specified. - -To remove an ARP target: -# echo -192.168.0.100 > /sys/class/net/bond0/bonding/arp_ip_target - -Example Configuration ---------------------- - We begin with the same example that is shown in section 3.3, -executed with sysfs, and without using ifenslave. - - To make a simple bond of two e100 devices (presumed to be eth0 -and eth1), and have it persist across reboots, edit the appropriate -file (/etc/init.d/boot.local or /etc/rc.d/rc.local), and add the -following: - -modprobe bonding -modprobe e100 -echo balance-alb > /sys/class/net/bond0/bonding/mode -ifconfig bond0 192.168.1.1 netmask 255.255.255.0 up -echo 100 > /sys/class/net/bond0/bonding/miimon -echo +eth0 > /sys/class/net/bond0/bonding/slaves -echo +eth1 > /sys/class/net/bond0/bonding/slaves - - To add a second bond, with two e1000 interfaces in -active-backup mode, using ARP monitoring, add the following lines to -your init script: - -modprobe e1000 -echo +bond1 > /sys/class/net/bonding_masters -echo active-backup > /sys/class/net/bond1/bonding/mode -ifconfig bond1 192.168.2.1 netmask 255.255.255.0 up -echo +192.168.2.100 /sys/class/net/bond1/bonding/arp_ip_target -echo 2000 > /sys/class/net/bond1/bonding/arp_interval -echo +eth2 > /sys/class/net/bond1/bonding/slaves -echo +eth3 > /sys/class/net/bond1/bonding/slaves - -4. Querying Bonding Configuration +5. Querying Bonding Configuration ================================= -4.1 Bonding Configuration +5.1 Bonding Configuration ------------------------- Each bonding device has a read-only file residing in the @@ -1058,7 +923,7 @@ generally as follows: The precise format and contents will change depending upon the bonding configuration, state, and version of the bonding driver. -4.2 Network configuration +5.2 Network configuration ------------------------- The network configuration can be inspected using the ifconfig @@ -1093,7 +958,7 @@ eth1 Link encap:Ethernet HWaddr 00:C0:F0:1F:37:B4 collisions:0 txqueuelen:100 Interrupt:9 Base address:0x1400 -5. Switch Configuration +6. Switch Configuration ======================= For this section, "switch" refers to whatever system the @@ -1126,7 +991,7 @@ transmit policy for an EtherChannel group; all three will interoperate with another EtherChannel group. -6. 802.1q VLAN Support +7. 802.1q VLAN Support ====================== It is possible to configure VLAN devices over a bond interface @@ -1177,7 +1042,7 @@ underlying device -- i.e. the bonding interface -- to promiscuous mode, which might not be what you want. -7. Link Monitoring +8. Link Monitoring ================== The bonding driver at present supports two schemes for @@ -1188,7 +1053,7 @@ monitor. bonding driver itself, it is not possible to enable both ARP and MII monitoring simultaneously. -7.1 ARP Monitor Operation +8.1 ARP Monitor Operation ------------------------- The ARP monitor operates as its name suggests: it sends ARP @@ -1206,7 +1071,7 @@ those slaves will stay down. If networking monitoring (tcpdump, etc) shows the ARP requests and replies on the network, then it may be that your device driver is not updating last_rx and trans_start. -7.2 Configuring Multiple ARP Targets +8.2 Configuring Multiple ARP Targets ------------------------------------ While ARP monitoring can be done with just one target, it can @@ -1229,7 +1094,7 @@ alias bond0 bonding options bond0 arp_interval=60 arp_ip_target=192.168.0.100 -7.3 MII Monitor Operation +8.3 MII Monitor Operation ------------------------- The MII monitor monitors only the carrier state of the local @@ -1255,14 +1120,14 @@ does not support or had some error in processing both the MII register and ethtool requests), then the MII monitor will assume the link is up. -8. Potential Sources of Trouble +9. Potential Sources of Trouble =============================== -8.1 Adventures in Routing +9.1 Adventures in Routing ------------------------- When bonding is configured, it is important that the slave -devices not have routes that supersede routes of the master (or, +devices not have routes that supercede routes of the master (or, generally, not have routes at all). For example, suppose the bonding device bond0 has two slaves, eth0 and eth1, and the routing table is as follows: @@ -1289,11 +1154,11 @@ by the state of the routing table. The solution here is simply to insure that slaves do not have routes of their own, and if for some reason they must, those routes do -not supersede routes of their master. This should generally be the +not supercede routes of their master. This should generally be the case, but unusual configurations or errant manual or automatic static route additions may cause trouble. -8.2 Ethernet Device Renaming +9.2 Ethernet Device Renaming ---------------------------- On systems with network configuration scripts that do not @@ -1342,7 +1207,7 @@ modprobe with --ignore-install to cause the normal action to then take place. Full documentation on this can be found in the modprobe.conf and modprobe manual pages. -8.3. Painfully Slow Or No Failed Link Detection By Miimon +9.3. Painfully Slow Or No Failed Link Detection By Miimon --------------------------------------------------------- By default, bonding enables the use_carrier option, which @@ -1370,7 +1235,7 @@ carrier state. It has no way to determine the state of devices on or beyond other ports of a switch, or if a switch is refusing to pass traffic while still maintaining carrier on. -9. SNMP agents +10. SNMP agents =============== If running SNMP agents, the bonding driver should be loaded @@ -1416,7 +1281,7 @@ ifDescr, the association between the IP address and IfIndex remains and SNMP functions such as Interface_Scan_Next will report that association. -10. Promiscuous mode +11. Promiscuous mode ==================== When running network monitoring tools, e.g., tcpdump, it is @@ -1443,7 +1308,7 @@ sending to peers that are unassigned or if the load is unbalanced. the active slave changes (e.g., due to a link failure), the promiscuous setting will be propagated to the new active slave. -11. Configuring Bonding for High Availability +12. Configuring Bonding for High Availability ============================================= High Availability refers to configurations that provide @@ -1453,7 +1318,7 @@ goal is to provide the maximum availability of network connectivity (i.e., the network always works), even though other configurations could provide higher throughput. -11.1 High Availability in a Single Switch Topology +12.1 High Availability in a Single Switch Topology -------------------------------------------------- If two hosts (or a host and a single switch) are directly @@ -1467,7 +1332,7 @@ the load will be rebalanced across the remaining devices. See Section 13, "Configuring Bonding for Maximum Throughput" for information on configuring bonding with one peer device. -11.2 High Availability in a Multiple Switch Topology +12.2 High Availability in a Multiple Switch Topology ---------------------------------------------------- With multiple switches, the configuration of bonding and the @@ -1494,7 +1359,7 @@ switches (ISL, or inter switch link), and multiple ports connecting to the outside world ("port3" on each switch). There is no technical reason that this could not be extended to a third switch. -11.2.1 HA Bonding Mode Selection for Multiple Switch Topology +12.2.1 HA Bonding Mode Selection for Multiple Switch Topology ------------------------------------------------------------- In a topology such as the example above, the active-backup and @@ -1516,7 +1381,7 @@ broadcast: This mode is really a special purpose mode, and is suitable necessary for some specific one-way traffic to reach both independent networks, then the broadcast mode may be suitable. -11.2.2 HA Link Monitoring Selection for Multiple Switch Topology +12.2.2 HA Link Monitoring Selection for Multiple Switch Topology ---------------------------------------------------------------- The choice of link monitoring ultimately depends upon your @@ -1537,10 +1402,10 @@ regardless of which switch is active, the ARP monitor has a suitable target to query. -12. Configuring Bonding for Maximum Throughput +13. Configuring Bonding for Maximum Throughput ============================================== -12.1 Maximizing Throughput in a Single Switch Topology +13.1 Maximizing Throughput in a Single Switch Topology ------------------------------------------------------ In a single switch configuration, the best method to maximize @@ -1611,7 +1476,7 @@ destination to make load balancing decisions. The behavior of each mode is described below. -12.1.1 MT Bonding Mode Selection for Single Switch Topology +13.1.1 MT Bonding Mode Selection for Single Switch Topology ----------------------------------------------------------- This configuration is the easiest to set up and to understand, @@ -1742,7 +1607,7 @@ balance-alb: This mode is everything that balance-tlb is, and more. device driver must support changing the hardware address while the device is open. -12.1.2 MT Link Monitoring for Single Switch Topology +13.1.2 MT Link Monitoring for Single Switch Topology ---------------------------------------------------- The choice of link monitoring may largely depend upon which @@ -1751,7 +1616,7 @@ support the use of the ARP monitor, and are thus restricted to using the MII monitor (which does not provide as high a level of end to end assurance as the ARP monitor). -12.2 Maximum Throughput in a Multiple Switch Topology +13.2 Maximum Throughput in a Multiple Switch Topology ----------------------------------------------------- Multiple switches may be utilized to optimize for throughput @@ -1786,7 +1651,7 @@ a single 72 port switch. can be equipped with an additional network device connected to an external network; this host then additionally acts as a gateway. -12.2.1 MT Bonding Mode Selection for Multiple Switch Topology +13.2.1 MT Bonding Mode Selection for Multiple Switch Topology ------------------------------------------------------------- In actual practice, the bonding mode typically employed in @@ -1799,7 +1664,7 @@ packets has arrived). When employed in this fashion, the balance-rr mode allows individual connections between two hosts to effectively utilize greater than one interface's bandwidth. -12.2.2 MT Link Monitoring for Multiple Switch Topology +13.2.2 MT Link Monitoring for Multiple Switch Topology ------------------------------------------------------ Again, in actual practice, the MII monitor is most often used @@ -1809,10 +1674,10 @@ advantages over the MII monitor are mitigated by the volume of probes needed as the number of systems involved grows (remember that each host in the network is configured with bonding). -13. Switch Behavior Issues +14. Switch Behavior Issues ========================== -13.1 Link Establishment and Failover Delays +14.1 Link Establishment and Failover Delays ------------------------------------------- Some switches exhibit undesirable behavior with regard to the @@ -1847,7 +1712,7 @@ switches take a long time to go into backup mode, it may be desirable to not activate a backup interface immediately after a link goes down. Failover may be delayed via the downdelay bonding module option. -13.2 Duplicated Incoming Packets +14.2 Duplicated Incoming Packets -------------------------------- It is not uncommon to observe a short burst of duplicated @@ -1886,14 +1751,14 @@ behavior, it can be induced by clearing the MAC forwarding table (on most Cisco switches, the privileged command "clear mac address-table dynamic" will accomplish this). -14. Hardware Specific Considerations +15. Hardware Specific Considerations ==================================== This section contains additional information for configuring bonding on specific hardware platforms, or for interfacing bonding with particular switches or other devices. -14.1 IBM BladeCenter +15.1 IBM BladeCenter -------------------- This applies to the JS20 and similar systems. @@ -1996,7 +1861,7 @@ bonding driver. avoid fail-over delay issues when using bonding. -15. Frequently Asked Questions +16. Frequently Asked Questions ============================== 1. Is it SMP safe? @@ -2060,7 +1925,7 @@ not have special switch requirements, but do need device drivers that support specific features (described in the appropriate section under module parameters, above). - In 802.3ad mode, it works with systems that support IEEE + In 802.3ad mode, it works with with systems that support IEEE 802.3ad Dynamic Link Aggregation. Most managed and many unmanaged switches currently available support 802.3ad. diff --git a/Documentation/networking/e100.txt b/Documentation/networking/e100.txt index 944aa55e7..4ef9f7cd5 100644 --- a/Documentation/networking/e100.txt +++ b/Documentation/networking/e100.txt @@ -1,17 +1,16 @@ Linux* Base Driver for the Intel(R) PRO/100 Family of Adapters ============================================================== -November 15, 2005 +November 17, 2004 + Contents ======== - In This Release - Identifying Your Adapter -- Building and Installation - Driver Configuration Parameters - Additional Configurations -- Known Issues - Support @@ -19,30 +18,18 @@ In This Release =============== This file describes the Linux* Base Driver for the Intel(R) PRO/100 Family of -Adapters. This driver includes support for Itanium(R)2-based systems. - -For questions related to hardware requirements, refer to the documentation -supplied with your Intel PRO/100 adapter. - -The following features are now available in supported kernels: - - Native VLANs - - Channel Bonding (teaming) - - SNMP - -Channel Bonding documentation can be found in the Linux kernel source: -/Documentation/networking/bonding.txt - +Adapters, version 3.3.x. This driver supports 2.4.x and 2.6.x kernels. Identifying Your Adapter ======================== -For more information on how to identify your adapter, go to the Adapter & +For more information on how to identify your adapter, go to the Adapter & Driver ID Guide at: http://support.intel.com/support/network/adapter/pro100/21397.htm -For the latest Intel network drivers for Linux, refer to the following -website. In the search field, enter your adapter name or type, or use the +For the latest Intel network drivers for Linux, refer to the following +website. In the search field, enter your adapter name or type, or use the networking link on the left to search for your adapter: http://downloadfinder.intel.com/scripts-df/support_intel.asp @@ -53,75 +40,73 @@ Driver Configuration Parameters The default value for each parameter is generally the recommended setting, unless otherwise noted. -Rx Descriptors: Number of receive descriptors. A receive descriptor is a data - structure that describes a receive buffer and its attributes to the network - controller. The data in the descriptor is used by the controller to write - data from the controller to host memory. In the 3.x.x driver the valid range - for this parameter is 64-256. The default value is 64. This parameter can be - changed using the command: - +Rx Descriptors: Number of receive descriptors. A receive descriptor is a data + structure that describes a receive buffer and its attributes to the network + controller. The data in the descriptor is used by the controller to write + data from the controller to host memory. In the 3.0.x driver the valid + range for this parameter is 64-256. The default value is 64. This parameter + can be changed using the command + ethtool -G eth? rx n, where n is the number of desired rx descriptors. -Tx Descriptors: Number of transmit descriptors. A transmit descriptor is a data - structure that describes a transmit buffer and its attributes to the network - controller. The data in the descriptor is used by the controller to read - data from the host memory to the controller. In the 3.x.x driver the valid - range for this parameter is 64-256. The default value is 64. This parameter - can be changed using the command: +Tx Descriptors: Number of transmit descriptors. A transmit descriptor is a + data structure that describes a transmit buffer and its attributes to the + network controller. The data in the descriptor is used by the controller to + read data from the host memory to the controller. In the 3.0.x driver the + valid range for this parameter is 64-256. The default value is 64. This + parameter can be changed using the command ethtool -G eth? tx n, where n is the number of desired tx descriptors. -Speed/Duplex: The driver auto-negotiates the link speed and duplex settings by - default. Ethtool can be used as follows to force speed/duplex. +Speed/Duplex: The driver auto-negotiates the link speed and duplex settings by + default. Ethtool can be used as follows to force speed/duplex. ethtool -s eth? autoneg off speed {10|100} duplex {full|half} NOTE: setting the speed/duplex to incorrect values will cause the link to fail. -Event Log Message Level: The driver uses the message level flag to log events - to syslog. The message level can be set at driver load time. It can also be - set using the command: +Event Log Message Level: The driver uses the message level flag to log events + to syslog. The message level can be set at driver load time. It can also be + set using the command ethtool -s eth? msglvl n - Additional Configurations ========================= Configuring the Driver on Different Distributions ------------------------------------------------- - Configuring a network driver to load properly when the system is started is - distribution dependent. Typically, the configuration process involves adding - an alias line to /etc/modules.conf or /etc/modprobe.conf as well as editing - other system startup scripts and/or configuration files. Many popular Linux - distributions ship with tools to make these changes for you. To learn the - proper way to configure a network device for your system, refer to your - distribution documentation. If during this process you are asked for the - driver or module name, the name for the Linux Base Driver for the Intel - PRO/100 Family of Adapters is e100. + Configuring a network driver to load properly when the system is started is + distribution dependent. Typically, the configuration process involves adding + an alias line to /etc/modules.conf as well as editing other system startup + scripts and/or configuration files. Many popular Linux distributions ship + with tools to make these changes for you. To learn the proper way to + configure a network device for your system, refer to your distribution + documentation. If during this process you are asked for the driver or module + name, the name for the Linux Base Driver for the Intel PRO/100 Family of + Adapters is e100. - As an example, if you install the e100 driver for two PRO/100 adapters - (eth0 and eth1), add the following to modules.conf or modprobe.conf: + As an example, if you install the e100 driver for two PRO/100 adapters + (eth0 and eth1), add the following to modules.conf: alias eth0 e100 alias eth1 e100 Viewing Link Messages --------------------- - In order to see link messages and other Intel driver information on your - console, you must set the dmesg level up to six. This can be done by - entering the following on the command line before loading the e100 driver: + In order to see link messages and other Intel driver information on your + console, you must set the dmesg level up to six. This can be done by + entering the following on the command line before loading the e100 driver: dmesg -n 8 - If you wish to see all messages issued by the driver, including debug + If you wish to see all messages issued by the driver, including debug messages, set the dmesg level to eight. NOTE: This setting is not saved across reboots. - Ethtool ------- @@ -129,27 +114,29 @@ Additional Configurations diagnostics, as well as displaying statistical information. Ethtool version 1.6 or later is required for this functionality. - The latest release of ethtool can be found from - http://sourceforge.net/projects/gkernel. + The latest release of ethtool can be found at: + http://sf.net/projects/gkernel. - NOTE: Ethtool 1.6 only supports a limited set of ethtool options. Support - for a more complete ethtool feature set can be enabled by upgrading - ethtool to ethtool-1.8.1. + NOTE: This driver uses mii support from the kernel. As a result, when + there is no link, ethtool will report speed/duplex to be 10/half. + NOTE: Ethtool 1.6 only supports a limited set of ethtool options. Support + for a more complete ethtool feature set can be enabled by upgrading + ethtool to ethtool-1.8.1. Enabling Wake on LAN* (WoL) --------------------------- - WoL is provided through the Ethtool* utility. Ethtool is included with Red - Hat* 8.0. For other Linux distributions, download and install Ethtool from - the following website: http://sourceforge.net/projects/gkernel. + WoL is provided through the Ethtool* utility. Ethtool is included with Red + Hat* 8.0. For other Linux distributions, download and install Ethtool from + the following website: http://sourceforge.net/projects/gkernel. - For instructions on enabling WoL with Ethtool, refer to the Ethtool man page. + For instructions on enabling WoL with Ethtool, refer to the Ethtool man + page. WoL will be enabled on the system during the next shut down or reboot. For - this driver version, in order to enable WoL, the e100 driver must be + this driver version, in order to enable WoL, the e100 driver must be loaded when shutting down or rebooting the system. - NAPI ---- @@ -157,25 +144,6 @@ Additional Configurations See www.cyberus.ca/~hadi/usenix-paper.tgz for more information on NAPI. - Multiple Interfaces on Same Ethernet Broadcast Network - ------------------------------------------------------ - - Due to the default ARP behavior on Linux, it is not possible to have - one system on two IP networks in the same Ethernet broadcast domain - (non-partitioned switch) behave as expected. All Ethernet interfaces - will respond to IP traffic for any IP address assigned to the system. - This results in unbalanced receive traffic. - - If you have multiple interfaces in a server, either turn on ARP - filtering by - - (1) entering: echo 1 > /proc/sys/net/ipv4/conf/all/arp_filter - (this only works if your kernel's version is higher than 2.4.5), or - - (2) installing the interfaces in separate broadcast domains (either - in different switches or in a switch partitioned to VLANs). - - Support ======= @@ -183,24 +151,20 @@ For general information, go to the Intel support website at: http://support.intel.com - or the Intel Wired Networking project hosted by Sourceforge at: - - http://sourceforge.net/projects/e1000 - If an issue is identified with the released source code on the supported -kernel with a supported adapter, email the specific information related to the -issue to e1000-devel@lists.sourceforge.net. +kernel with a supported adapter, email the specific information related to +the issue to linux.nics@intel.com. License ======= -This software program is released under the terms of a license agreement -between you ('Licensee') and Intel. Do not use or load this software or any -associated materials (collectively, the 'Software') until you have carefully -read the full terms and conditions of the file COPYING located in this software -package. By loading or using the Software, you agree to the terms of this -Agreement. If you do not agree with the terms of this Agreement, do not install -or use the Software. +This software program is released under the terms of a license agreement +between you ('Licensee') and Intel. Do not use or load this software or any +associated materials (collectively, the 'Software') until you have carefully +read the full terms and conditions of the LICENSE located in this software +package. By loading or using the Software, you agree to the terms of this +Agreement. If you do not agree with the terms of this Agreement, do not +install or use the Software. * Other names and brands may be claimed as the property of others. diff --git a/Documentation/networking/e1000.txt b/Documentation/networking/e1000.txt index 71fe15af3..2ebd4058d 100644 --- a/Documentation/networking/e1000.txt +++ b/Documentation/networking/e1000.txt @@ -1,7 +1,7 @@ Linux* Base Driver for the Intel(R) PRO/1000 Family of Adapters =============================================================== -November 15, 2005 +November 17, 2004 Contents @@ -20,316 +20,254 @@ In This Release =============== This file describes the Linux* Base Driver for the Intel(R) PRO/1000 Family -of Adapters. This driver includes support for Itanium(R)2-based systems. +of Adapters, version 5.x.x. -For questions related to hardware requirements, refer to the documentation -supplied with your Intel PRO/1000 adapter. All hardware requirements listed +For questions related to hardware requirements, refer to the documentation +supplied with your Intel PRO/1000 adapter. All hardware requirements listed apply to use with Linux. -The following features are now available in supported kernels: - - Native VLANs - - Channel Bonding (teaming) - - SNMP - -Channel Bonding documentation can be found in the Linux kernel source: -/Documentation/networking/bonding.txt - -The driver information previously displayed in the /proc filesystem is not -supported in this release. Alternatively, you can use ethtool (version 1.6 -or later), lspci, and ifconfig to obtain the same information. - -Instructions on updating ethtool can be found in the section "Additional -Configurations" later in this document. - +Native VLANs are now available with supported kernels. Identifying Your Adapter ======================== -For more information on how to identify your adapter, go to the Adapter & +For more information on how to identify your adapter, go to the Adapter & Driver ID Guide at: http://support.intel.com/support/network/adapter/pro100/21397.htm -For the latest Intel network drivers for Linux, refer to the following -website. In the search field, enter your adapter name or type, or use the +For the latest Intel network drivers for Linux, refer to the following +website. In the search field, enter your adapter name or type, or use the networking link on the left to search for your adapter: http://downloadfinder.intel.com/scripts-df/support_intel.asp +Command Line Parameters +======================= -Command Line Parameters ======================= - -If the driver is built as a module, the following optional parameters -are used by entering them on the command line with the modprobe or insmod -command using this syntax: +If the driver is built as a module, the following optional parameters are +used by entering them on the command line with the modprobe or insmod command +using this syntax: modprobe e1000 [ @@ -1225,7 +1225,7 @@ allocating resources. Also, you need to set the proper PCI DMA mask to limit the accessed i/o range. In some cases, you might need to call pci_set_master() function, - too. + too. @@ -1236,8 +1236,8 @@ Now assume that this PCI device has an I/O port with 8 bytes and an interrupt. Then struct mychip will have the - following fields: + following fields: @@ -1323,7 +1323,7 @@ irq, snd_mychip_interrupt, - IRQF_DISABLED|IRQF_SHARED, "My Chip", chip)) { + SA_INTERRUPT|SA_SHIRQ, "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, - IRQF_SHARED is given as the interrupt flag of + SA_SHIRQ is given as the interrupt flag of request_irq(). @@ -1834,7 +1834,7 @@ mychip_set_sample_format(chip, runtime->format); mychip_set_sample_rate(chip, runtime->rate); mychip_set_channels(chip, runtime->channels); - mychip_set_dma_setup(chip, runtime->dma_addr, + mychip_set_dma_setup(chip, runtime->dma_area, chip->buffer_size, chip->period_size); return 0; @@ -2836,7 +2836,7 @@ struct _snd_pcm_runtime { Note that this callback became non-atomic since the recent version. - You can use schedule-related functions safely in this callback now. + You can use schedule-related fucntions safely in this callback now. @@ -3048,7 +3048,7 @@ struct _snd_pcm_runtime { - If you acquire a spinlock in the interrupt handler, and the + If you aquire 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 @@ -3388,7 +3388,7 @@ struct _snd_pcm_runtime { .name = "PCM Playback Switch", .index = 0, .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .private_value = 0xffff, + .private_values = 0xffff, .info = my_control_info, .get = my_control_get, .put = my_control_put @@ -3449,7 +3449,7 @@ struct _snd_pcm_runtime { - The private_value field contains + The private_values field contains an arbitrary long integer value for this record. When using generic info, get and @@ -4215,7 +4215,7 @@ struct _snd_pcm_runtime { @@ -4242,36 +4242,15 @@ 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 a bit flag - MPU401_INFO_INTEGRATED, + (reserved) by the driver itself. In such a case, pass non-zero + to the 5th argument + (integrated). Otherwise, pass 0 to it, 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 @@ -5354,7 +5333,7 @@ struct _snd_pcm_runtime { @@ -5415,12 +5394,29 @@ 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 @@ -5566,7 +5562,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_suspend() for each codec. + snd_ac97_resume() for each codec. Save the register values if necessary. Stop the hardware if necessary. Disable the PCI device by calling diff --git a/Documentation/sound/oss/Introduction b/Documentation/sound/oss/Introduction index f04ba6bb7..15d4fb975 100644 --- a/Documentation/sound/oss/Introduction +++ b/Documentation/sound/oss/Introduction @@ -69,7 +69,7 @@ are available, for example IRQ, address, DMA. Warning, the options for different cards sometime use different names for the same or a similar feature (dma1= versus dma16=). As a last -resort, inspect the code (search for module_param). +resort, inspect the code (search for MODULE_PARM). Notes: diff --git a/Documentation/sound/oss/cs46xx b/Documentation/sound/oss/cs46xx index b54432709..88d6cf8b3 100644 --- a/Documentation/sound/oss/cs46xx +++ b/Documentation/sound/oss/cs46xx @@ -88,7 +88,7 @@ parameters. for a copy email: twoller@crystal.cirrus.com MODULE_PARMS definitions ------------------------ -module_param(defaultorder, ulong, 0); +MODULE_PARM(defaultorder, "i"); defaultorder=N where N is a value from 1 to 12 The buffer order determines the size of the dma buffer for the driver. @@ -98,18 +98,18 @@ to not underrun the dma buffer as easily. As default, use 32k (order=3) rather than 64k as some of the games work more responsively. (2^N) * PAGE_SIZE = allocated buffer size -module_param(cs_debuglevel, ulong, 0644); -module_param(cs_debugmask, ulong, 0644); +MODULE_PARM(cs_debuglevel, "i"); +MODULE_PARM(cs_debugmask, "i"); cs_debuglevel=N cs_debugmask=0xMMMMMMMM where N is a value from 0 (no debug printfs), to 9 (maximum) 0xMMMMMMMM is a debug mask corresponding to the CS_xxx bits (see driver source). -module_param(hercules_egpio_disable, ulong, 0); +MODULE_PARM(hercules_egpio_disable, "i"); hercules_egpio_disable=N where N is a 0 (enable egpio), or a 1 (disable egpio support) -module_param(initdelay, ulong, 0); +MODULE_PARM(initdelay, "i"); initdelay=N This value is used to determine the millescond delay during the initialization code prior to powering up the PLL. On laptops this value can be used to @@ -118,19 +118,19 @@ system is booted under battery power then the mdelay()/udelay() functions fail t properly delay the required time. Also, if the system is booted under AC power and then the power removed, the mdelay()/udelay() functions will not delay properly. -module_param(powerdown, ulong, 0); +MODULE_PARM(powerdown, "i"); powerdown=N where N is 0 (disable any powerdown of the internal blocks) or 1 (enable powerdown) -module_param(external_amp, bool, 0); +MODULE_PARM(external_amp, "i"); external_amp=1 if N is set to 1, then force enabling the EAPD support in the primary AC97 codec. override the detection logic and force the external amp bit in the AC97 0x26 register to be reset (0). EAPD should be 0 for powerup, and 1 for powerdown. The VTB Santa Cruz card has inverted logic, so there is a special function for these cards. -module_param(thinkpad, bool, 0); +MODULE_PARM(thinkpad, "i"); thinkpad=1 if N is set to 1, then force enabling the clkrun functionality. Currently, when the part is being used, then clkrun is disabled for the entire system, diff --git a/Documentation/sparc/sbus_drivers.txt b/Documentation/sparc/sbus_drivers.txt index 4b9351624..876195dc2 100644 --- a/Documentation/sparc/sbus_drivers.txt +++ b/Documentation/sparc/sbus_drivers.txt @@ -25,84 +25,42 @@ 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 a piece of skeleton code for perofming a device -probe in an SBUS driverunder Linux: + Here is how probing is performed by an SBUS driver +under Linux: - static int __devinit mydevice_probe_one(struct sbus_dev *sdev) + static void init_one_mydevice(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 __devinit mydevice_probe(struct of_device *dev, - const struct of_device_id *match) + static int mydevice_match(struct sbus_dev *sdev) { - struct sbus_dev *sdev = to_sbus_device(&dev->dev); - - return mydevice_probe_one(sdev); + if (some_criteria(sdev)) + return 1; + return 0; } - static int __devexit mydevice_remove(struct of_device *dev) + static void mydevice_probe(void) { - struct sbus_dev *sdev = to_sbus_device(&dev->dev); - struct mydevice *mp = dev_get_drvdata(&dev->dev); - - return mydevice_remove_one(sdev, mp); - } - - static struct of_device_id mydevice_match[] = { - { - .name = "mydevice", - }, - {}, - }; - - MODULE_DEVICE_TABLE(of, mydevice_match); - - 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); - } + struct sbus_bus *sbus; + struct sbus_dev *sdev; - static void __exit mydevice_exit(void) - { - of_unregister_driver(&mydevice_driver); + for_each_sbus(sbus) { + for_each_sbusdev(sdev, sbus) { + if (mydevice_match(sdev)) + init_one_mydevice(sdev); + } + } } - 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. + 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. - 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. + "init_one_mydevice" might do things like allocate software +state structures, map in I/O registers, place the hardware +into an initialized state, etc. Mapping and Accessing I/O Registers @@ -305,3 +263,10 @@ 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 5a311c38d..3f1c5464b 100644 --- a/Documentation/sparse.txt +++ b/Documentation/sparse.txt @@ -1,6 +1,5 @@ Copyright 2004 Linus Torvalds Copyright 2004 Pavel Machek -Copyright 2006 Bob Copeland Using sparse for typechecking ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -42,8 +41,15 @@ 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. -Getting sparse -~~~~~~~~~~~~~~ +Use + + make C=[12] CF=-Wbitwise + +or you don't get any checking at all. + + +Where to get sparse +~~~~~~~~~~~~~~~~~~~ With git, you can just get it from @@ -51,7 +57,7 @@ With git, you can just get it from and DaveJ has tar-balls at - http://www.codemonkey.org.uk/projects/git-snapshots/sparse/ + http://www.codemonkey.org.uk/projects/git-snapshots/sparse/ Once you have it, just do @@ -59,20 +65,8 @@ Once you have it, just do make make install -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. +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). diff --git a/Documentation/spi/spi-summary b/Documentation/spi/spi-summary index 068732d32..a5ffba33a 100644 --- a/Documentation/spi/spi-summary +++ b/Documentation/spi/spi-summary @@ -414,33 +414,7 @@ to get the driver-private data allocated for that device. The driver will initialize the fields of that spi_master, including the bus number (maybe the same as the platform device ID) and three methods used to interact with the SPI core and SPI protocol drivers. It will -also initialize its own internal state. (See below about bus numbering -and those methods.) - -After you initialize the spi_master, then use spi_register_master() to -publish it to the rest of the system. At that time, device nodes for -the controller and any predeclared spi devices will be made available, -and the driver model core will take care of binding them to drivers. - -If you need to remove your SPI controller driver, spi_unregister_master() -will reverse the effect of spi_register_master(). - - -BUS NUMBERING - -Bus numbering is important, since that's how Linux identifies a given -SPI bus (shared SCK, MOSI, MISO). Valid bus numbers start at zero. On -SOC systems, the bus numbers should match the numbers defined by the chip -manufacturer. For example, hardware controller SPI2 would be bus number 2, -and spi_board_info for devices connected to it would use that number. - -If you don't have such hardware-assigned bus number, and for some reason -you can't just assign them, then provide a negative bus number. That will -then be replaced by a dynamically assigned number. You'd then need to treat -this as a non-static configuration (see above). - - -SPI MASTER METHODS +also initialize its own internal state. master->setup(struct spi_device *spi) This sets up the device clock rate, SPI mode, and word sizes. @@ -457,9 +431,6 @@ SPI MASTER METHODS state it dynamically associates with that device. If you do that, be sure to provide the cleanup() method to free that state. - -SPI MESSAGE QUEUE - The bulk of the driver will be managing the I/O queue fed by transfer(). That queue could be purely conceptual. For example, a driver used only @@ -469,9 +440,6 @@ But the queue will probably be very real, using message->queue, PIO, often DMA (especially if the root filesystem is in SPI flash), and execution contexts like IRQ handlers, tasklets, or workqueues (such as keventd). Your driver can be as fancy, or as simple, as you need. -Such a transfer() method would normally just add the message to a -queue, and then start some asynchronous transfer engine (unless it's -already running). THANKS TO diff --git a/Documentation/spinlocks.txt b/Documentation/spinlocks.txt index a661d6847..c21229966 100644 --- a/Documentation/spinlocks.txt +++ b/Documentation/spinlocks.txt @@ -9,7 +9,7 @@ removed soon. So for any new code dynamic initialization should be used: static int __init xxx_init(void) { spin_lock_init(&xxx_lock); - rwlock_init(&xxx_rw_lock); + rw_lock_init(&xxx_rw_lock); ... } diff --git a/Documentation/sysctl/fs.txt b/Documentation/sysctl/fs.txt index 5c3a51905..0b62c6214 100644 --- a/Documentation/sysctl/fs.txt +++ b/Documentation/sysctl/fs.txt @@ -25,7 +25,6 @@ Currently, these files are in /proc/sys/fs: - inode-state - overflowuid - overflowgid -- suid_dumpable - super-max - super-nr @@ -132,25 +131,6 @@ 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 89bf8c20a..b0c7ab93d 100644 --- a/Documentation/sysctl/kernel.txt +++ b/Documentation/sysctl/kernel.txt @@ -50,6 +50,7 @@ show up in /proc/sys/kernel: - shmmax [ sysv ipc ] - shmmni - stop-a [ SPARC only ] +- suid_dumpable - sysrq ==> Documentation/sysrq.txt - tainted - threads-max @@ -210,8 +211,9 @@ Controls the kernel's behaviour when an oops or BUG is encountered. 0: try to continue operation -1: panic immediatly. If the `panic' sysctl is also non-zero then the - machine will be rebooted. +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. ============================================================== @@ -309,6 +311,25 @@ 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 20d0d797f..a46c10fcd 100644 --- a/Documentation/sysctl/vm.txt +++ b/Documentation/sysctl/vm.txt @@ -28,9 +28,7 @@ Currently, these files are in /proc/sys/vm: - block_dump - drop-caches - zone_reclaim_mode -- min_unmapped_ratio -- min_slab_ratio -- panic_on_oom +- zone_reclaim_interval ============================================================== @@ -139,6 +137,7 @@ 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 @@ -162,46 +161,20 @@ 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: +================================================================ -This is available only on NUMA kernels. +zone_reclaim_interval: -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. +The time allowed for off node allocations after zone reclaim +has failed to reclaim enough pages to allow a local allocation. -The default is 1 percent. +Time is set in seconds and set by default to 30 seconds. -============================================================= - -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. +Reduce the interval if undesired off node allocations occur. However, too +frequent scans will have a negative impact onoff node allocation performance. diff --git a/Documentation/sysrq.txt b/Documentation/sysrq.txt index e0188a23f..ad0bedf67 100644 --- a/Documentation/sysrq.txt +++ b/Documentation/sysrq.txt @@ -115,9 +115,8 @@ 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 a :IMPORTANT -IMPORTANT: c2 compliant system, and it should not be mistaken as :IMPORTANT -IMPORTANT: such. :IMPORTANT +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 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 dab566047..8ff7bc2a0 100644 --- a/Documentation/tty.txt +++ b/Documentation/tty.txt @@ -80,6 +80,13 @@ 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/ibmcam.txt b/Documentation/usb/ibmcam.txt index ce2f21a3e..c25003644 100644 --- a/Documentation/usb/ibmcam.txt +++ b/Documentation/usb/ibmcam.txt @@ -28,8 +28,8 @@ SUPPORTED CAMERAS: Xirlink "C-It" camera, also known as "IBM PC Camera". The device uses proprietary ASIC (and compression method); it is manufactured by Xirlink. See http://www.xirlink.com/ -http://www.ibmpccamera.com or http://www.c-itnow.com/ for -details and pictures. +(renamed to http://www.veo.com), http://www.ibmpccamera.com, +or http://www.c-itnow.com/ for details and pictures. This very chipset ("X Chip", as marked at the factory) is used in several other cameras, and they are supported diff --git a/Documentation/usb/ov511.txt b/Documentation/usb/ov511.txt index e1974ec82..a7fc0432b 100644 --- a/Documentation/usb/ov511.txt +++ b/Documentation/usb/ov511.txt @@ -22,8 +22,8 @@ WHAT YOU NEED: http://www.ovt.com/omniusbp.html - A Video4Linux compatible frame grabber program (I recommend vidcat and xawtv) - vidcat is part of the w3cam package: http://www.hdk-berlin.de/~rasca/w3cam/ - xawtv is available at: http://www.in-berlin.de/User/kraxel/xawtv.html + vidcat is part of the w3cam package: http://mpx.freeshell.net/ + xawtv is available at: http://linux.bytesex.org/xawtv/ HOW TO USE IT: diff --git a/Documentation/usb/proc_usb_info.txt b/Documentation/usb/proc_usb_info.txt index 22c533126..f86550fe3 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/core/devio.c) is the primary reference +source code (linux/drivers/usb/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/sn9c102.txt b/Documentation/usb/sn9c102.txt index cf9a1187e..c6b764141 100644 --- a/Documentation/usb/sn9c102.txt +++ b/Documentation/usb/sn9c102.txt @@ -17,16 +17,15 @@ Index 7. Module parameters 8. Optional device control through "sysfs" 9. Supported devices -10. How to add plug-in's for new image sensors -11. Notes for V4L2 application developers -12. Video frame formats -13. Contact information -14. Credits +10. Notes for V4L2 application developers +11. Video frame formats +12. Contact information +13. Credits 1. Copyright ============ -Copyright (C) 2004-2005 by Luca Risolia +Copyright (C) 2004-2006 by Luca Risolia 2. Disclaimer @@ -54,9 +53,8 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 4. Overview and features ======================== -This driver attempts to support the video and audio streaming capabilities of -the devices mounting the SONiX SN9C101, SN9C102 and SN9C103 PC Camera -Controllers. +This driver attempts to support the video interface of the devices mounting the +SONiX SN9C101, SN9C102 and SN9C103 PC Camera Controllers. It's worth to note that SONiX has never collaborated with the author during the development of this project, despite several requests for enough detailed @@ -78,6 +76,7 @@ Some of the features of the driver are: - available mmap or read/poll methods for video streaming through isochronous data transfers; - automatic detection of image sensor; +- support for built-in microphone interface; - support for any window resolutions and optional panning within the maximum pixel area of image sensor; - image downscaling with arbitrary scaling factors from 1, 2 and 4 in both @@ -96,7 +95,7 @@ Some of the features of the driver are: parameters" paragraph); - up to 64 cameras can be handled at the same time; they can be connected and disconnected from the host many times without turning off the computer, if - your system supports hotplugging; + the system supports hotplugging; - no known bugs. @@ -112,6 +111,12 @@ corresponding modules must be compiled: # CONFIG_VIDEO_DEV=m +To enable advanced debugging functionality on the device through /sysfs: + + # Multimedia devices + # + CONFIG_VIDEO_ADV_DEBUG=y + # USB support # CONFIG_USB=m @@ -125,6 +130,21 @@ necessary: CONFIG_USB_UHCI_HCD=m CONFIG_USB_OHCI_HCD=m +The SN9C103 controller also provides a built-in microphone interface. It is +supported by the USB Audio driver thanks to the ALSA API: + + # Sound + # + CONFIG_SOUND=y + + # Advanced Linux Sound Architecture + # + CONFIG_SND=m + + # USB devices + # + CONFIG_SND_USB_AUDIO=m + And finally: # USB Multimedia devices @@ -153,7 +173,7 @@ analyze kernel messages and verify that the loading process has gone well: Module parameters are listed below: ------------------------------------------------------------------------------- Name: video_nr -Type: int array (min = 0, max = 64) +Type: short array (min = 0, max = 64) Syntax: <-1|n[,...]> Description: Specify V4L2 minor mode number: -1 = use next available @@ -165,19 +185,19 @@ Description: Specify V4L2 minor mode number: other camera. Default: -1 ------------------------------------------------------------------------------- -Name: force_munmap; +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)" + 0 = do not force memory unmapping + 1 = force memory unmapping (save memory) Default: 0 ------------------------------------------------------------------------------- Name: debug -Type: int +Type: ushort Syntax: Description: Debugging information level, from 0 to 3: 0 = none (use carefully) @@ -187,14 +207,15 @@ Description: Debugging information level, from 0 to 3: 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. + runtime thanks to the /sys filesystem interface. Default: 2 ------------------------------------------------------------------------------- 8. Optional device control through "sysfs" [1] ========================================== -It is possible to read and write both the SN9C10x and the image sensor +If the kernel has been compiled with the CONFIG_VIDEO_ADV_DEBUG option enabled, +it is possible to read and write both the SN9C10x and the image sensor registers by using the "sysfs" filesystem interface. Every time a supported device is recognized, a write-only file named "green" is @@ -236,7 +257,7 @@ serialized. The sysfs interface also provides the "frame_header" entry, which exports the frame header of the most recent requested and captured video frame. The header -is 12-bytes long and is appended to every video frame by the SN9C10x +is always 18-bytes long and is appended to every video frame by the SN9C10x controllers. As an example, this additional information can be used by the user application for implementing auto-exposure features via software. @@ -250,7 +271,8 @@ Byte # Value Description 0x03 0xC4 Frame synchronisation pattern. 0x04 0xC4 Frame synchronisation pattern. 0x05 0x96 Frame synchronisation pattern. -0x06 0x00 or 0x01 Unknown meaning. The exact value depends on the chip. +0x06 0xXX Unknown meaning. The exact value depends on the chip; + 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 @@ -267,12 +289,23 @@ Byte # Value Description 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: + +0x0C 0xXX Unknown meaning +0x0D 0xXX Unknown meaning +0x0E 0xXX Unknown meaning +0x0F 0xXX Unknown meaning +0x10 0xXX Unknown meaning +0x11 0xXX Unknown meaning The AE area (sx, sy, ex, ey) in the active window can be set by programming the registers 0x1c, 0x1d, 0x1e and 0x1f of the SN9C10x controllers, where one unit corresponds to 32 pixels. -[1] The frame header has been documented by Bertrik Sikken. +[1] Part of the meaning of the frame header has been documented by Bertrik + Sikken. 9. Supported devices @@ -297,6 +330,8 @@ Vendor ID Product ID 0x0c45 0x602a 0x0c45 0x602b 0x0c45 0x602c +0x0c45 0x602d +0x0c45 0x602e 0x0c45 0x6030 0x0c45 0x6080 0x0c45 0x6082 @@ -333,6 +368,7 @@ Model Manufacturer ----- ------------ HV7131D Hynix Semiconductor, Inc. MI-0343 Micron Technology, Inc. +OV7630 OmniVision Technologies, Inc. PAS106B PixArt Imaging, Inc. PAS202BCB PixArt Imaging, Inc. TAS5110C1B Taiwan Advanced Sensor Corporation @@ -346,18 +382,7 @@ appreciated. Non-available hardware will not be supported by the author of this driver. -10. How to add plug-in's for new image sensors -============================================== -It should be easy to write plug-in's for new sensors by using the small API -that has been created for this purpose, which is present in "sn9c102_sensor.h" -(documentation is included there). As an example, have a look at the code in -"sn9c102_pas106b.c", which uses the mentioned interface. - -At the moment, possible unsupported image sensors are: CIS-VF10 (VGA), -OV7620 (VGA), OV7630 (VGA). - - -11. Notes for V4L2 application developers +10. Notes for V4L2 application developers ========================================= This driver follows the V4L2 API specifications. In particular, it enforces two rules: @@ -392,7 +417,7 @@ initialized (as described in the documentation of the API for the image sensors supplied by this driver). -12. Video frame formats [1] +11. Video frame formats [1] ======================= The SN9C10x PC Camera Controllers can send images in two possible video formats over the USB: either native "Sequential RGB Bayer" or Huffman @@ -453,7 +478,7 @@ The following Huffman codes have been found: documented by Bertrik Sikken. -13. Contact information +12. Contact information ======================= The author may be contacted by e-mail at . @@ -462,7 +487,7 @@ GPG/PGP encrypted e-mail's are accepted. The GPG key ID of the author is the fingerprint is: '88E8 F32F 7244 68BA 3958 5D40 99DA 5D2A FCE6 35A4'. -14. Credits +13. Credits =========== Many thanks to following persons for their contribute (listed in alphabetical order): @@ -470,11 +495,13 @@ order): - Luca Capello for the donation of a webcam; - Joao Rodrigo Fuzaro, Joao Limirio, Claudio Filho and Caio Begotti for the donation of a webcam; +- Jon Hollstrom for the donation of a webcam; - Carlos Eduardo Medaglia Dyonisio, who added the support for the PAS202BCB image sensor; - Stefano Mozzi, who donated 45 EU; +- Andrew Pearce for the donation of a webcam; - Bertrik Sikken, who reverse-engineered and documented the Huffman compression algorithm used in the SN9C10x controllers and implemented the first decoder; - Mizuno Takafumi for the donation of a webcam; -- An "anonymous" donator (who didn't want his name to be revealed) for the +- an "anonymous" donator (who didn't want his name to be revealed) for the donation of a webcam. diff --git a/Documentation/usb/usb-help.txt b/Documentation/usb/usb-help.txt index a74085938..b7c324973 100644 --- a/Documentation/usb/usb-help.txt +++ b/Documentation/usb/usb-help.txt @@ -5,7 +5,8 @@ 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://usb.in.tum.de/linux-usb/ + mirrors at http://www.suse.cz/development/linux-usb/ + and 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 02b0f7beb..f001cd93b 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 supports any device that has the PL2303 chip from Prolific + This driver support 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, as does the DCU-11 mobile-phone cable. + IO-Data work with this driver. 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 e65ec828d..63cb7edd1 100644 --- a/Documentation/usb/usbmon.txt +++ b/Documentation/usb/usbmon.txt @@ -29,13 +29,14 @@ if usbmon is built into the kernel. # mount -t debugfs none_debugs /sys/kernel/debug # modprobe usbmon -# Verify that bus sockets are present. -# ls /sys/kernel/debug/usbmon +[root@lembas zaitcev]# 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 @@ -75,7 +76,7 @@ that the file size is not excessive for your favourite editor. * Raw text data format -The '1t' type data consists of a stream of events, such as URB submission, +The '0t' 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. @@ -96,25 +97,20 @@ 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 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. + 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. + In case of a setup packet, it contains a Setup Tag. If scripts read a number + in this field, they proceed to read Data Length. Otherwise, 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 Length. This is the actual length in the URB. - Data tag. The usbmon may not always capture data, even if length is nonzero. - The data words are present only if this tag is '='. + Only if tag is '=', the data words are present. - 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. diff --git a/Documentation/usb/w9968cf.txt b/Documentation/usb/w9968cf.txt index 18a47738d..9d46cd0b1 100644 --- a/Documentation/usb/w9968cf.txt +++ b/Documentation/usb/w9968cf.txt @@ -57,16 +57,12 @@ based cameras should be supported as well. The driver is divided into two modules: the basic one, "w9968cf", is needed for the supported devices to work; the second one, "w9968cf-vpp", is an optional module, which provides some useful video post-processing functions like video -decoding, up-scaling and colour conversions. Once the driver is installed, -every time an application tries to open a recognized device, "w9968cf" checks -the presence of the "w9968cf-vpp" module and loads it automatically by default. +decoding, up-scaling and colour conversions. -Please keep in mind that official kernels do not include the second module for -performance purposes. However it is always recommended to download and install -the latest and complete release of the driver, replacing the existing one, if -present: it will be still even possible not to load the "w9968cf-vpp" module at -all, if you ever want to. Another important missing feature of the version in -the official Linux 2.4 kernels is the writeable /proc filesystem interface. +Note that the official kernels do neither include nor support the second +module for performance purposes. Therefore, it is always recommended to +download and install the latest and complete release of the driver, +replacing the existing one, if present. The latest and full-featured version of the W996[87]CF driver can be found at: http://www.linux-projects.org. Please refer to the documentation included in @@ -201,22 +197,6 @@ 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. ------------------------------------------------------------------------------- -Name: vppmod_load -Type: bool -Syntax: <0|1> -Description: Automatic 'w9968cf-vpp' module loading: 0 disabled, 1 enabled. - If enabled, every time an application attempts to open a - camera, 'insmod' searches for the video post-processing module - in the system and loads it automatically (if present). - The optional 'w9968cf-vpp' module adds extra image manipulation - capabilities to the 'w9968cf' module,like software up-scaling, - colour conversions and video decompression for very high frame - rates. -Default: 1 -Note: The kernel must be compiled with the CONFIG_KMOD option - enabled for the 'w9968cf-vpp' module to be loaded and for - this parameter to be present. -------------------------------------------------------------------------------- Name: simcams Type: int Syntax: diff --git a/Documentation/video4linux/CARDLIST.bttv b/Documentation/video4linux/CARDLIST.bttv index 4efa46458..b72706c58 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/230 + 89 -> Osprey 210/220 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,1822:0026] +113 -> Twinhan DST + clones [11bd:0026,1822:0001,270f:fc00] 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 00d9a1f2a..8bea3fbd0 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,18ac:d800] + 17 -> DViCO FusionHDTV 3 Gold-Q [18ac:d810] 18 -> Hauppauge Nova-T DVB-T [0070:9002,0070:9001] 19 -> Conexant DVB-T reference design [14f1:0187] 20 -> Provideo PV259 [1540:2580] @@ -40,14 +40,6 @@ 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,1822:0019] + 42 -> digitalnow DNTV Live! DVB-T Pro [1822:0025] 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.em28xx b/Documentation/video4linux/CARDLIST.em28xx index a3026689b..a0c7cad20 100644 --- a/Documentation/video4linux/CARDLIST.em28xx +++ b/Documentation/video4linux/CARDLIST.em28xx @@ -8,4 +8,3 @@ 7 -> Leadtek Winfast USB II (em2800) 8 -> Kworld USB2800 (em2800) 9 -> Pinnacle Dazzle DVC 90 (em2820/em2840) [2304:0207] - 12 -> Kworld PVR TV 2800 RF (em2820/em2840) diff --git a/Documentation/video4linux/CARDLIST.saa7134 b/Documentation/video4linux/CARDLIST.saa7134 index 9068b669f..bca509032 100644 --- a/Documentation/video4linux/CARDLIST.saa7134 +++ b/Documentation/video4linux/CARDLIST.saa7134 @@ -93,4 +93,3 @@ 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 44134f04b..f6d0cf7b7 100644 --- a/Documentation/video4linux/CARDLIST.tuner +++ b/Documentation/video4linux/CARDLIST.tuner @@ -62,13 +62,10 @@ 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-H06xF +tuner=64 - LG TDVS-H062F/TUA6034 tuner=65 - Ymec TVF66T5-B/DFF -tuner=66 - LG TALN series +tuner=66 - LG NTSC (TALN mini series) tuner=67 - Philips TD1316 Hybrid Tuner tuner=68 - Philips TUV1236D ATSC/NTSC dual in -tuner=69 - Tena TNF 5335 and similar models +tuner=69 - Tena TNF 5335 MF 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 ade8651e2..e415e3604 100644 --- a/Documentation/video4linux/CQcam.txt +++ b/Documentation/video4linux/CQcam.txt @@ -1,7 +1,7 @@ c-qcam - Connectix Color QuickCam video4linux kernel driver Copyright (C) 1999 Dave Forrest - released under GNU GPL. + released under GNU GPL. 1999-12-08 Dave Forrest, written with kernel version 2.2.12 in mind @@ -45,21 +45,21 @@ configuration. The appropriate flags are: CONFIG_PNP_PARPORT M for autoprobe.o IEEE1284 readback module CONFIG_PRINTER_READBACK M for parport_probe.o IEEE1284 readback module CONFIG_VIDEO_DEV M for videodev.o video4linux module - CONFIG_VIDEO_CQCAM M for c-qcam.o Color Quickcam module + CONFIG_VIDEO_CQCAM M for c-qcam.o Color Quickcam module With these flags, the kernel should compile and install the modules. To record and monitor the compilation, I use: (make zlilo ; \ make modules; \ - make modules_install ; + make modules_install ; depmod -a ) &>log & less log # then a capital 'F' to watch the progress - + But that is my personal preference. 2.2 Configuration - + The configuration requires module configuration and device configuration. I like kmod or kerneld process with the /etc/modprobe.conf file so the modules can automatically load/unload as @@ -68,7 +68,7 @@ using MAKEDEV, or need to be created. The following sections detail these procedures. -2.1 Module Configuration +2.1 Module Configuration Using modules requires a bit of work to install and pass the parameters. Understand that entries in /etc/modprobe.conf of: @@ -128,9 +128,9 @@ system (CONFIG_PROC_FS), the parallel printer support (CONFIG_PRINTER), the IEEE 1284 system,(CONFIG_PRINTER_READBACK), you should be able to read some identification from your quickcam with - modprobe -v parport - modprobe -v parport_probe - cat /proc/parport/PORTNUMBER/autoprobe + modprobe -v parport + modprobe -v parport_probe + cat /proc/parport/PORTNUMBER/autoprobe Returns: CLASS:MEDIA; MODEL:Color QuickCam 2.0; @@ -140,7 +140,7 @@ Returns: and well. A common problem is that the current driver does not reliably detect a c-qcam, even though one is attached. In this case, - modprobe -v c-qcam + modprobe -v c-qcam or insmod -v c-qcam @@ -152,16 +152,16 @@ video4linux mailing list and archive for more current information. 3.1 Checklist: Can you get an image? - v4lgrab >qcam.ppm ; wc qcam.ppm ; xv qcam.ppm + v4lgrab >qcam.ppm ; wc qcam.ppm ; xv qcam.ppm - Is a working c-qcam connected to the port? - grep ^ /proc/parport/?/autoprobe + Is a working c-qcam connected to the port? + grep ^ /proc/parport/?/autoprobe - Do the /dev/video* files exist? - ls -lad /dev/video + Do the /dev/video* files exist? + ls -lad /dev/video - Is the c-qcam module loaded? - modprobe -v c-qcam ; lsmod + Is the c-qcam module loaded? + modprobe -v c-qcam ; lsmod Does the camera work with alternate programs? cqcam, etc? @@ -174,7 +174,7 @@ video4linux mailing list and archive for more current information. isn't, you might try patching the c-qcam module to add a parport=xxx option as in the bw-qcam module so you can specify the parallel port: - insmod -v c-qcam parport=0 + insmod -v c-qcam parport=0 And bypass the detection code, see ../../drivers/char/c-qcam.c and look for the 'qc_detect' code and call. @@ -183,12 +183,209 @@ look for the 'qc_detect' code and call. this work is documented at the video4linux2 site listed below. -9.0 --- A sample program using v4lgrabber, +9.0 --- A sample program using v4lgrabber, -v4lgrab is a simple image grabber that will copy a frame from the +This program 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) To produce .jpg output, you can use it like this: -'v4lgrab | convert - c-qcam.jpg' +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< ----------------------------- 10.0 --- Other Information diff --git a/Documentation/video4linux/README.cpia b/Documentation/video4linux/README.cpia index 19cd3bf24..c95e7bbc0 100644 --- a/Documentation/video4linux/README.cpia +++ b/Documentation/video4linux/README.cpia @@ -87,7 +87,7 @@ hardware configuration of the parport. You can give the boot-parameter at the LILO-prompt or specify it in lilo.conf. I use the following append-line in lilo.conf: - append="parport=0x378,7,3" + append="parport=0x378,7,3" See Documentation/parport.txt for more information about the configuration of the parport and the values given above. Do not simply @@ -175,7 +175,7 @@ THANKS (in no particular order): - Manuel J. Petit de Gabriel for providing help with Isabel (http://isabel.dit.upm.es/) - Bas Huisman for writing the initial parport code -- Jarl Totland for setting up the mailing list +- Jarl Totland for setting up the mailing list and maintaining the web-server[3] - Chris Whiteford for fixes related to the 1.02 firmware diff --git a/Documentation/video4linux/Zoran b/Documentation/video4linux/Zoran index 040a2c841..52c94bd7d 100644 --- a/Documentation/video4linux/Zoran +++ b/Documentation/video4linux/Zoran @@ -28,33 +28,18 @@ Iomega Buz: * Philips saa7111 TV decoder * Philips saa7185 TV encoder Drivers to use: videodev, i2c-core, i2c-algo-bit, - videocodec, saa7111, saa7185, zr36060, zr36067 + videocodec, saa7111, saa7185, zr36060, zr36067 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 * Brooktree bt819 TV decoder * Brooktree bt856 TV encoder Drivers to use: videodev, i2c-core, i2c-algo-bit, - videocodec, bt819, bt856, zr36060, zr36067 + videocodec, bt819, bt856, zr36060, zr36067 Inputs/outputs: Composite and S-video Norms: PAL (720x576 @ 25 fps), NTSC (720x480 @ 29.97 fps) Card number: 5 @@ -65,7 +50,7 @@ Linux Media Labs LML33R10: * Philips saa7114 TV decoder * Analog Devices adv7170 TV encoder Drivers to use: videodev, i2c-core, i2c-algo-bit, - videocodec, saa7114, adv7170, zr36060, zr36067 + videocodec, saa7114, adv7170, zr36060, zr36067 Inputs/outputs: Composite and S-video Norms: PAL (720x576 @ 25 fps), NTSC (720x480 @ 29.97 fps) Card number: 6 @@ -76,7 +61,7 @@ Pinnacle/Miro DC10(new): * Philips saa7110a TV decoder * Analog Devices adv7176 TV encoder Drivers to use: videodev, i2c-core, i2c-algo-bit, - videocodec, saa7110, adv7175, zr36060, zr36067 + videocodec, saa7110, adv7175, zr36060, zr36067 Inputs/outputs: Composite, S-video and Internal Norms: PAL, SECAM (768x576 @ 25 fps), NTSC (640x480 @ 29.97 fps) Card number: 1 @@ -99,7 +84,7 @@ Pinnacle/Miro DC10(old): * * Micronas vpx3220a TV decoder * mse3000 TV encoder or Analog Devices adv7176 TV encoder * Drivers to use: videodev, i2c-core, i2c-algo-bit, - videocodec, vpx3220, mse3000/adv7175, zr36050, zr36016, zr36067 + videocodec, vpx3220, mse3000/adv7175, zr36050, zr36016, zr36067 Inputs/outputs: Composite, S-video and Internal Norms: PAL, SECAM (768x576 @ 25 fps), NTSC (640x480 @ 29.97 fps) Card number: 0 @@ -111,7 +96,7 @@ Pinnacle/Miro DC30: * * Micronas vpx3225d/vpx3220a/vpx3216b TV decoder * Analog Devices adv7176 TV encoder Drivers to use: videodev, i2c-core, i2c-algo-bit, - videocodec, vpx3220/vpx3224, adv7175, zr36050, zr36016, zr36067 + videocodec, vpx3220/vpx3224, adv7175, zr36050, zr36016, zr36067 Inputs/outputs: Composite, S-video and Internal Norms: PAL, SECAM (768x576 @ 25 fps), NTSC (640x480 @ 29.97 fps) Card number: 3 @@ -138,11 +123,11 @@ Note: use encoder=X or decoder=X for non-default i2c chips (see i2c-id.h) The best know TV standards are NTSC/PAL/SECAM. but for decoding a frame that information is not enough. There are several formats of the TV standards. -And not every TV decoder is able to handle every format. Also the every -combination is supported by the driver. There are currently 11 different -tv broadcast formats all aver the world. +And not every TV decoder is able to handle every format. Also the every +combination is supported by the driver. There are currently 11 different +tv broadcast formats all aver the world. -The CCIR defines parameters needed for broadcasting the signal. +The CCIR defines parameters needed for broadcasting the signal. The CCIR has defined different standards: A,B,D,E,F,G,D,H,I,K,K1,L,M,N,... The CCIR says not much about about the colorsystem used !!! And talking about a colorsystem says not to much about how it is broadcast. @@ -151,18 +136,18 @@ The CCIR standards A,E,F are not used any more. When you speak about NTSC, you usually mean the standard: CCIR - M using the NTSC colorsystem which is used in the USA, Japan, Mexico, Canada -and a few others. +and a few others. When you talk about PAL, you usually mean: CCIR - B/G using the PAL -colorsystem which is used in many Countries. +colorsystem which is used in many Countries. -When you talk about SECAM, you mean: CCIR - L using the SECAM Colorsystem +When you talk about SECAM, you mean: CCIR - L using the SECAM Colorsystem which is used in France, and a few others. There the other version of SECAM, CCIR - D/K is used in Bulgaria, China, -Slovakai, Hungary, Korea (Rep.), Poland, Rumania and a others. +Slovakai, Hungary, Korea (Rep.), Poland, Rumania and a others. -The CCIR - H uses the PAL colorsystem (sometimes SECAM) and is used in +The CCIR - H uses the PAL colorsystem (sometimes SECAM) and is used in Egypt, Libya, Sri Lanka, Syrain Arab. Rep. The CCIR - I uses the PAL colorsystem, and is used in Great Britain, Hong Kong, @@ -173,30 +158,30 @@ and is used in Argentinia, Uruguay, an a few others We do not talk about how the audio is broadcast ! -A rather good sites about the TV standards are: +A rather good sites about the TV standards are: http://www.sony.jp/ServiceArea/Voltage_map/ http://info.electronicwerkstatt.de/bereiche/fernsehtechnik/frequenzen_und_normen/Fernsehnormen/ and http://www.cabl.com/restaurant/channel.html Other weird things around: NTSC 4.43 is a modificated NTSC, which is mainly used in PAL VCR's that are able to play back NTSC. PAL 60 seems to be the same -as NTSC 4.43 . The Datasheets also talk about NTSC 44, It seems as if it would -be the same as NTSC 4.43. +as NTSC 4.43 . The Datasheets also talk about NTSC 44, It seems as if it would +be the same as NTSC 4.43. NTSC Combs seems to be a decoder mode where the decoder uses a comb filter to split coma and luma instead of a Delay line. But I did not defiantly find out what NTSC Comb is. Philips saa7111 TV decoder -was introduced in 1997, is used in the BUZ and -can handle: PAL B/G/H/I, PAL N, PAL M, NTSC M, NTSC N, NTSC 4.43 and SECAM +was introduced in 1997, is used in the BUZ and +can handle: PAL B/G/H/I, PAL N, PAL M, NTSC M, NTSC N, NTSC 4.43 and SECAM Philips saa7110a TV decoder was introduced in 1995, is used in the Pinnacle/Miro DC10(new), DC10+ and -can handle: PAL B/G, NTSC M and SECAM +can handle: PAL B/G, NTSC M and SECAM Philips saa7114 TV decoder -was introduced in 2000, is used in the LML33R10 and +was introduced in 2000, is used in the LML33R10 and can handle: PAL B/G/D/H/I/N, PAL N, PAL M, NTSC M, NTSC 4.43 and SECAM Brooktree bt819 TV decoder @@ -207,10 +192,6 @@ 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 @@ -225,7 +206,7 @@ was introduced in 1996, is used in the BUZ can generate: PAL B/G, NTSC M Brooktree bt856 TV Encoder -was introduced in 1994, is used in the LML33 +was introduced in 1994, is used in the LML33 can generate: PAL B/D/G/H/I/N, PAL M, NTSC M, PAL-N (Argentina) Analog Devices adv7170 TV Encoder @@ -240,13 +221,9 @@ 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 +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. +to generate PAL N, maybe it would work if you use the PAL M settings. ========================== @@ -284,7 +261,7 @@ Here's my experience of using LML33 and Buz on various motherboards: VIA MVP3 Forget it. Pointless. Doesn't work. -Intel 430FX (Pentium 200) +Intel 430FX (Pentium 200) LML33 perfect, Buz tolerable (3 or 4 frames dropped per movie) Intel 440BX (early stepping) LML33 tolerable. Buz starting to get annoying (6-10 frames/hour) @@ -461,52 +438,52 @@ importance of buffer sizes: > -q 25 -b 128 : 24.655.992 > -q 25 -b 256 : 25.859.820 -I woke up, and can't go to sleep again. I'll kill some time explaining why +I woke up, and can't go to sleep again. I'll kill some time explaining why this doesn't look strange to me. -Let's do some math using a width of 704 pixels. I'm not sure whether the Buz +Let's do some math using a width of 704 pixels. I'm not sure whether the Buz actually use that number or not, but that's not too important right now. -704x288 pixels, one field, is 202752 pixels. Divided by 64 pixels per block; -3168 blocks per field. Each pixel consist of two bytes; 128 bytes per block; -1024 bits per block. 100% in the new driver mean 1:2 compression; the maximum -output becomes 512 bits per block. Actually 510, but 512 is simpler to use +704x288 pixels, one field, is 202752 pixels. Divided by 64 pixels per block; +3168 blocks per field. Each pixel consist of two bytes; 128 bytes per block; +1024 bits per block. 100% in the new driver mean 1:2 compression; the maximum +output becomes 512 bits per block. Actually 510, but 512 is simpler to use for calculations. -Let's say that we specify d1q50. We thus want 256 bits per block; times 3168 -becomes 811008 bits; 101376 bytes per field. We're talking raw bits and bytes -here, so we don't need to do any fancy corrections for bits-per-pixel or such +Let's say that we specify d1q50. We thus want 256 bits per block; times 3168 +becomes 811008 bits; 101376 bytes per field. We're talking raw bits and bytes +here, so we don't need to do any fancy corrections for bits-per-pixel or such things. 101376 bytes per field. -d1 video contains two fields per frame. Those sum up to 202752 bytes per +d1 video contains two fields per frame. Those sum up to 202752 bytes per frame, and one of those frames goes into each buffer. -But wait a second! -b128 gives 128kB buffers! It's not possible to cram +But wait a second! -b128 gives 128kB buffers! It's not possible to cram 202752 bytes of JPEG data into 128kB! -This is what the driver notice and automatically compensate for in your +This is what the driver notice and automatically compensate for in your examples. Let's do some math using this information: -128kB is 131072 bytes. In this buffer, we want to store two fields, which -leaves 65536 bytes for each field. Using 3168 blocks per field, we get -20.68686868... available bytes per block; 165 bits. We can't allow the -request for 256 bits per block when there's only 165 bits available! The -q50 -option is silently overridden, and the -b128 option takes precedence, leaving +128kB is 131072 bytes. In this buffer, we want to store two fields, which +leaves 65536 bytes for each field. Using 3168 blocks per field, we get +20.68686868... available bytes per block; 165 bits. We can't allow the +request for 256 bits per block when there's only 165 bits available! The -q50 +option is silently overridden, and the -b128 option takes precedence, leaving us with the equivalence of -q32. -This gives us a data rate of 165 bits per block, which, times 3168, sums up -to 65340 bytes per field, out of the allowed 65536. The current driver has -another level of rate limiting; it won't accept -q values that fill more than -6/8 of the specified buffers. (I'm not sure why. "Playing it safe" seem to be -a safe bet. Personally, I think I would have lowered requested-bits-per-block -by one, or something like that.) We can't use 165 bits per block, but have to -lower it again, to 6/8 of the available buffer space: We end up with 124 bits -per block, the equivalence of -q24. With 128kB buffers, you can't use greater +This gives us a data rate of 165 bits per block, which, times 3168, sums up +to 65340 bytes per field, out of the allowed 65536. The current driver has +another level of rate limiting; it won't accept -q values that fill more than +6/8 of the specified buffers. (I'm not sure why. "Playing it safe" seem to be +a safe bet. Personally, I think I would have lowered requested-bits-per-block +by one, or something like that.) We can't use 165 bits per block, but have to +lower it again, to 6/8 of the available buffer space: We end up with 124 bits +per block, the equivalence of -q24. With 128kB buffers, you can't use greater than -q24 at -d1. (And PAL, and 704 pixels width...) -The third example is limited to -q24 through the same process. The second -example, using very similar calculations, is limited to -q48. The only -example that actually grab at the specified -q value is the last one, which +The third example is limited to -q24 through the same process. The second +example, using very similar calculations, is limited to -q48. The only +example that actually grab at the specified -q value is the last one, which is clearly visible, looking at the file size. -- diff --git a/Documentation/video4linux/bttv/CONTRIBUTORS b/Documentation/video4linux/bttv/CONTRIBUTORS index 8aad6dd93..aef49db88 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/bttv/ICs b/Documentation/video4linux/bttv/ICs index 611315f87..6b7491336 100644 --- a/Documentation/video4linux/bttv/ICs +++ b/Documentation/video4linux/bttv/ICs @@ -14,13 +14,13 @@ Hauppauge Win/TV pci (version 405): Microchip 24LC02B or Philips 8582E2Y: 256 Byte EEPROM with configuration information - I2C 0xa0-0xa1, (24LC02B also responds to 0xa2-0xaf) + I2C 0xa0-0xa1, (24LC02B also responds to 0xa2-0xaf) Philips SAA5246AGP/E: Videotext decoder chip, I2C 0x22-0x23 TDA9800: sound decoder Winbond W24257AS-35: 32Kx8 CMOS static RAM (Videotext buffer mem) 14052B: analog switch for selection of sound source -PAL: +PAL: TDA5737: VHF, hyperband and UHF mixer/oscillator for TV and VCR 3-band tuners TSA5522: 1.4 GHz I2C-bus controlled synthesizer, I2C 0xc2-0xc3 diff --git a/Documentation/video4linux/bttv/PROBLEMS b/Documentation/video4linux/bttv/PROBLEMS index 2b8b0079f..8e31e9e36 100644 --- a/Documentation/video4linux/bttv/PROBLEMS +++ b/Documentation/video4linux/bttv/PROBLEMS @@ -3,7 +3,7 @@ - Start capturing by pressing "c" or by selecting it via a menu!!! - The memory of some S3 cards is not recognized right: - + First of all, if you are not using XFree-3.2 or newer, upgrade AT LEAST to XFree-3.2A! This solved the problem for most people. @@ -31,23 +31,23 @@ (mostly with Trio 64 but also with some others) Get the free demo version of Accelerated X from www.xinside.com and try bttv with it. bttv seems to work with most S3 cards with Accelerated X. - + Since I do not know much (better make that almost nothing) about VGA card programming I do not know the reason for this. Looks like XFree does something different when setting up the video memory? - Maybe somebody can enlighten me? - Would be nice if somebody could get this to work with XFree since - Accelerated X costs more than some of the grabber cards ... - + Maybe somebody can enlighten me? + Would be nice if somebody could get this to work with XFree since + Accelerated X costs more than some of the grabber cards ... + Better linear frame buffer support for S3 cards will probably be in XFree 4.0. - + - Grabbing is not switched off when changing consoles with XFree. That's because XFree and some AcceleratedX versions do not send unmap events. - Some popup windows (e.g. of the window manager) are not refreshed. - + Disable backing store by starting X with the option "-bs" - When using 32 bpp in XFree or 24+8bpp mode in AccelX 3.1 the system diff --git a/Documentation/video4linux/bttv/README.quirks b/Documentation/video4linux/bttv/README.quirks index 92e03929a..e8edb87df 100644 --- a/Documentation/video4linux/bttv/README.quirks +++ b/Documentation/video4linux/bttv/README.quirks @@ -38,9 +38,9 @@ tolerate. ------------------------ When using the 430FX PCI, the following rules will ensure -compatibility: +compatibility: - (1) Deassert REQ at the same time as asserting FRAME. + (1) Deassert REQ at the same time as asserting FRAME. (2) Do not reassert REQ to request another bus transaction until after finish-ing the previous transaction. diff --git a/Documentation/video4linux/bttv/THANKS b/Documentation/video4linux/bttv/THANKS index 950aa781c..2085399da 100644 --- a/Documentation/video4linux/bttv/THANKS +++ b/Documentation/video4linux/bttv/THANKS @@ -1,6 +1,6 @@ Many thanks to: -- Markus Schroeder for information on the Bt848 +- Markus Schroeder for information on the Bt848 and tuner programming and his control program xtvc. - Martin Buck for his great Videotext @@ -16,7 +16,7 @@ Many thanks to: - MIRO for providing a free PCTV card and detailed information about the components on their cards. (E.g. how the tuner type is detected) Without their card I could not have debugged the NTSC mode. - + - Hauppauge for telling how the sound input is selected and what components they do and will use on their radio cards. Also many thanks for faxing me the FM1216 data sheet. diff --git a/Documentation/video4linux/radiotrack.txt b/Documentation/video4linux/radiotrack.txt index d1f3ed199..2b75345f1 100644 --- a/Documentation/video4linux/radiotrack.txt +++ b/Documentation/video4linux/radiotrack.txt @@ -131,17 +131,17 @@ Check Stereo: BASE <-- 0xd8 (current volume, stereo detect, x=0xff ==> "not stereo", x=0xfd ==> "stereo detected" Set Frequency: code = (freq*40) + 10486188 - foreach of the 24 bits in code, - (from Least to Most Significant): - to write a "zero" bit, - BASE <-- 0x01 (audio mute, no stereo detect, radio + foreach of the 24 bits in code, + (from Least to Most Significant): + to write a "zero" bit, + BASE <-- 0x01 (audio mute, no stereo detect, radio disable, "zero" bit phase 1, tuner adjust) - BASE <-- 0x03 (audio mute, no stereo detect, radio + BASE <-- 0x03 (audio mute, no stereo detect, radio disable, "zero" bit phase 2, tuner adjust) - to write a "one" bit, - BASE <-- 0x05 (audio mute, no stereo detect, radio + to write a "one" bit, + BASE <-- 0x05 (audio mute, no stereo detect, radio disable, "one" bit phase 1, tuner adjust) - BASE <-- 0x07 (audio mute, no stereo detect, radio + BASE <-- 0x07 (audio mute, no stereo detect, radio disable, "one" bit phase 2, tuner adjust) ---------------------------------------------------------------------------- diff --git a/Documentation/video4linux/w9966.txt b/Documentation/video4linux/w9966.txt index 78a651254..e7ac33a7e 100644 --- a/Documentation/video4linux/w9966.txt +++ b/Documentation/video4linux/w9966.txt @@ -26,7 +26,7 @@ is called VIDEO_PALETTE_YUV422 (16 bpp). A minimal test application (with source) is available from: http://hem.fyristorg.com/mogul/w9966.html -The slow framerate is due to missing DMA ECP read support in the +The slow framerate is due to missing DMA ECP read support in the parport drivers. I might add working EPP support later. Good luck! diff --git a/Documentation/video4linux/zr36120.txt b/Documentation/video4linux/zr36120.txt index ac6d92d01..5d6357eef 100644 --- a/Documentation/video4linux/zr36120.txt +++ b/Documentation/video4linux/zr36120.txt @@ -2,7 +2,7 @@ Driver for Trust Computer Products Framegrabber, version 0.6.1 ------ --- ----- -------- -------- ------------ ------- - - - - ZORAN ------------------------------------------------------ - Author: Pauline Middelink + Author: Pauline Middelink Date: 18 September 1999 Version: 0.6.1 @@ -115,7 +115,7 @@ After making/checking the devices do: is the cardtype of the card you have. The cardnumber can be found in the source of zr36120. Look for tvcards. If your card is not there, please try if any other card gives some -response, and mail me if you got a working tvcard addition. +response, and mail me if you got a working tvcard addition. PS. +#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 -- Other IOCTL functions include: diff --git a/Documentation/watchdog/watchdog-api.txt b/Documentation/watchdog/watchdog-api.txt index 958ff3d48..c5beb548c 100644 --- a/Documentation/watchdog/watchdog-api.txt +++ b/Documentation/watchdog/watchdog-api.txt @@ -34,7 +34,19 @@ 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 source file: see Documentation/watchdog/src/watchdog-simple.c +like this: + +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); + } +} A more advanced driver could for example check that a HTTP server is still responding before doing the write call to ping the watchdog. @@ -95,40 +107,7 @@ current timeout using the GETTIMEOUT ioctl. ioctl(fd, WDIOC_GETTIMEOUT, &timeout); printf("The timeout was is %d seconds\n", timeout); -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: +Envinronmental monitoring: All watchdog drivers are required return more information about the system, some do temperature, fan and power level monitoring, some can tell you @@ -187,10 +166,6 @@ 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 4b1ff69cc..dffda29c8 100644 --- a/Documentation/watchdog/watchdog.txt +++ b/Documentation/watchdog/watchdog.txt @@ -65,7 +65,28 @@ The external event interfaces on the WDT boards are not currently supported. Minor numbers are however allocated for it. -Example Watchdog Driver: see Documentation/watchdog/src/watchdog-simple.c +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); + } +} Contact Information diff --git a/Documentation/x86_64/boot-options.txt b/Documentation/x86_64/boot-options.txt index 6da24e7a5..192135325 100644 --- a/Documentation/x86_64/boot-options.txt +++ b/Documentation/x86_64/boot-options.txt @@ -151,11 +151,6 @@ NUMA numa=fake=X Fake X nodes and ignore NUMA setup of the actual machine. - numa=hotadd=percent - Only allow hotadd memory to preallocate page structures upto - percent of already available memory. - numa=hotadd=0 will disable hotadd memory. - ACPI acpi=off Don't enable ACPI @@ -205,27 +200,6 @@ 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, @@ -238,13 +212,6 @@ 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/Kbuild b/Kbuild index 2d4f95e4b..95d6a00ba 100644 --- a/Kbuild +++ b/Kbuild @@ -18,7 +18,7 @@ define sed-y "/^->/{s:^->\([^ ]*\) [\$$#]*\([^ ]*\) \(.*\):#define \1 \2 /* \3 */:; s:->::; p;}" endef # Override default regexp for specific architectures -sed-$(CONFIG_MIPS) := "/^@@@/{s/^@@@//; s/ \#.*\$$//; p;}" +sed-$(CONFIG_MIPS) := "/^@@@/s///p" quiet_cmd_offsets = GEN $@ define cmd_offsets diff --git a/MAINTAINERS b/MAINTAINERS index c5e32622c..8079b8268 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -40,20 +40,11 @@ trivial patch so apply some common sense. PLEASE document known bugs. If it doesn't work for everything or does something very odd once a month document it. - PLEASE remember that submissions must be made under the terms - of the OSDL certificate of contribution - (http://www.osdl.org/newsroom/press_releases/2004/2004_05_24_dco.html) - and should include a Signed-off-by: line. - 6. Make sure you have the right to send any changes you make. If you do changes at work you may find your employer owns the patch not you. -7. When sending security related changes or reports to a maintainer - please Cc: security@kernel.org, especially if the maintainer - does not respond. - -8. Happy hacking. +7. Happy hacking. ----------------------------------- @@ -156,18 +147,6 @@ M: p_gortmaker@yahoo.com L: netdev@vger.kernel.org S: Maintained -9P FILE SYSTEM -P: Eric Van Hensbergen -M: ericvh@gmail.com -P: Ron Minnich -M: rminnich@lanl.gov -P: Latchesar Ionkov -M: lucho@ionkov.net -L: v9fs-developer@lists.sourceforge.net -W: http://v9fs.sf.net -T: git kernel.org:/pub/scm/linux/kernel/ericvh/v9fs.git -S: Maintained - A2232 SERIAL BOARD DRIVER P: Enver Haase M: ehaase@inf.fu-berlin.de @@ -181,12 +160,6 @@ 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 @@ -214,12 +187,6 @@ 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 @@ -280,7 +247,7 @@ S: Maintained ALI1563 I2C DRIVER P: Rudolf Marek M: r.marek@sh.cvut.cz -L: i2c@lm-sensors.org +L: lm-sensors@lm-sensors.org S: Maintained ALPHA PORT @@ -298,13 +265,6 @@ 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 @@ -416,7 +376,7 @@ S: Supported ATM P: Chas Williams M: chas@cmf.nrl.navy.mil -L: linux-atm-general@lists.sourceforge.net (subscribers-only) +L: linux-atm-general@lists.sourceforge.net W: http://linux-atm.sourceforge.net S: Maintained @@ -439,7 +399,6 @@ AX.25 NETWORK LAYER P: Ralf Baechle M: ralf@linux-mips.org L: linux-hams@vger.kernel.org -W: http://www.linux-ax25.org/ S: Maintained BAYCOM/HDLCDRV DRIVERS FOR AX.25 @@ -449,14 +408,6 @@ L: linux-hams@vger.kernel.org W: http://www.baycom.org/~tom/ham/ham.html S: Maintained -BCM43XX WIRELESS DRIVER -P: Michael Buesch -M: mb@bu3sch.de -P: Stefano Brivio -M: st3@riseup.net -W: http://bcm43xx.berlios.de/ -S: Maintained - BEFS FILE SYSTEM P: Sergey S. Kostyliov M: rathamahata@php4.ru @@ -583,26 +534,8 @@ S: Supported BROADBAND PROCESSOR ARCHITECTURE P: Arnd Bergmann M: arnd@arndb.de -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 -L: netdev@vger.kernel.org -S: Supported - -BROADCOM TG3 GIGABIT ETHERNET DRIVER -P: Michael Chan -M: mchan@broadcom.com -L: netdev@vger.kernel.org +L: linuxppc64-dev@ozlabs.org +W: http://linuxppc64.org S: Supported BTTV VIDEO4LINUX DRIVER @@ -614,15 +547,6 @@ 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 @@ -784,7 +708,6 @@ 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 @@ -884,17 +807,9 @@ 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 @@ -955,48 +870,19 @@ W: http://ebtables.sourceforge.net/ S: Maintained EDAC-CORE -P: Doug Thompson -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 - -EDAC-E752X -P: Mark Gross -M: mark.gross@intel.com -L: bluesmoke-devel@lists.sourceforge.net -W: bluesmoke.sourceforge.net -S: Maintained - -EDAC-E7XXX -P: Doug Thompson -M: norsk5@xmission.com -L: bluesmoke-devel@lists.sourceforge.net -W: bluesmoke.sourceforge.net -S: Maintained - -EDAC-R82600 -P: Tim Small -M: tim@buttersideup.com -L: bluesmoke-devel@lists.sourceforge.net -W: bluesmoke.sourceforge.net -S: Maintained +P: Doug Thompson +M: norsk5@xmission.com, dthompson@linuxnetworx.com +P: Dave Peterson +M: dsp@llnl.gov, dave_peterson@pobox.com +L: bluesmoke-devel@lists.sourceforge.net +W: bluesmoke.sourceforge.net +S: Maintained EEPRO100 NETWORK DRIVER 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 @@ -1041,7 +927,7 @@ S: Maintained EXT3 FILE SYSTEM P: Stephen Tweedie, Andrew Morton M: sct@redhat.com, akpm@osdl.org, adilger@clusterfs.com -L: ext2-devel@lists.sourceforge.net +L: ext3-users@redhat.com S: Maintained F71805F HARDWARE MONITORING DRIVER @@ -1141,15 +1027,6 @@ M: khc@pm.waw.pl W: http://www.kernel.org/pub/linux/utils/net/hdlc/ S: Maintained -GIGASET ISDN DRIVERS -P: Hansjoerg Lipp -M: hjlipp@web.de -P: Tilman Schmidt -M: tilman@imap.cc -L: gigaset307x-common@lists.sourceforge.net -W: http://gigaset307x.sourceforge.net/ -S: Maintained - HARDWARE MONITORING P: Jean Delvare M: khali@linux-fr.org @@ -1157,11 +1034,6 @@ 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 @@ -1279,7 +1151,7 @@ S: Maintained I2C SUBSYSTEM P: Jean Delvare M: khali@linux-fr.org -L: i2c@lm-sensors.org +L: lm-sensors@lm-sensors.org W: http://www.lm-sensors.nu/ T: quilt kernel.org/pub/linux/kernel/people/gregkh/gregkh-2.6/ S: Maintained @@ -1440,8 +1312,7 @@ S: Supported INPUT (KEYBOARD, MOUSE, JOYSTICK) DRIVERS P: Dmitry Torokhov -M: dmitry.torokhov@gmail.com -M: dtor@mail.ru +M: dtor_core@ameritech.net L: linux-input@atrey.karlin.mff.cuni.cz L: linux-joystick@atrey.karlin.mff.cuni.cz T: git kernel.org:/pub/scm/linux/kernel/git/dtor/input.git @@ -1481,20 +1352,13 @@ 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 +P: Ganesh Venkatesan +M: ganesh.venkatesan@intel.com 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 @@ -1503,26 +1367,18 @@ P: Jeb Cramer M: cramerj@intel.com P: John Ronciak M: john.ronciak@intel.com -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 +P: Ganesh Venkatesan +M: ganesh.venkatesan@intel.com W: http://sourceforge.net/projects/e1000/ S: Supported INTEL PRO/10GbE SUPPORT -P: Jeff Kirsher -M: jeffrey.t.kirsher@intel.com P: Ayyappan Veeraiyan M: ayyappan.veeraiyan@intel.com +P: Ganesh Venkatesan +M: ganesh.venkatesan@intel.com 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 @@ -1531,7 +1387,6 @@ 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 @@ -1541,7 +1396,6 @@ 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 @@ -1557,19 +1411,6 @@ P: Juanjo Ciarlante M: jjciarla@raiz.uncu.edu.ar S: Maintained -IPATH DRIVER: -P: Bryan O'Sullivan -M: support@pathscale.com -L: openib-general@openib.org -S: Supported - -IPMI SUBSYSTEM -P: Corey Minyard -M: minyard@acm.org -L: openipmi-developer@lists.sourceforge.net -W: http://openipmi.sourceforge.net/ -S: Supported - IPX NETWORK LAYER P: Arnaldo Carvalho de Melo M: acme@conectiva.com.br @@ -1577,11 +1418,10 @@ L: netdev@vger.kernel.org S: Maintained IRDA SUBSYSTEM -P: Samuel Ortiz -M: samuel@sortiz.org +P: Jean Tourrilhes L: irda-users@lists.sourceforge.net (subscribers-only) W: http://irda.sourceforge.net/ -S: Maintained +S: Odd Fixes ISAPNP P: Jaroslav Kysela @@ -1627,28 +1467,12 @@ 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 DEVICES (JBD) -P: Stephen Tweedie, Andrew Morton -M: sct@redhat.com, akpm@osdl.org -L: ext2-devel@lists.sourceforge.net -S: Maintained - KCONFIG P: Roman Zippel M: zippel@linux-m68k.org L: kbuild-devel@lists.sourceforge.net S: Maintained -KDUMP -P: Vivek Goyal -M: vgoyal@in.ibm.com -P: Haren Myneni -M: hbabu@us.ibm.com -L: fastboot@lists.osdl.org -L: linux-kernel@vger.kernel.org -W: http://lse.sourceforge.net/kdump/ -S: Maintained - KERNEL AUTOMOUNTER (AUTOFS) P: H. Peter Anvin M: hpa@zytor.com @@ -1671,8 +1495,9 @@ S: Maintained KERNEL JANITORS P: Several -L: kernel-janitors@lists.osdl.org +L: kernel-janitors@osdl.org W: http://www.kerneljanitors.org/ +W: http://sf.net/projects/kernel-janitor/ S: Maintained KERNEL NFSD @@ -1685,7 +1510,9 @@ S: Maintained KEXEC P: Eric Biederman +P: Randy Dunlap M: ebiederm@xmission.com +M: rdunlap@xenotime.net W: http://www.xmission.com/~ebiederm/files/kexec/ L: linux-kernel@vger.kernel.org L: fastboot@osdl.org @@ -1703,9 +1530,17 @@ M: davem@davemloft.net L: linux-kernel@vger.kernel.org S: Maintained +LANMEDIA WAN CARD DRIVER +P: Andrew Stanley-Jones +M: asj@lanmedia.com +W: http://www.lanmedia.com/ +S: Supported + LAPB module +P: Henner Eisen +M: eis@baty.hanse.de L: linux-x25@vger.kernel.org -S: Orphan +S: Maintained LASI 53c700 driver for PARISC P: James E.J. Bottomley @@ -1713,11 +1548,6 @@ M: James.Bottomley@HansenPartnership.com L: linux-scsi@vger.kernel.org S: Maintained -LED SUBSYSTEM -P: Richard Purdie -M: rpurdie@rpsys.net -S: Maintained - LEGO USB Tower driver P: Juergen Stuber M: starblue@users.sourceforge.net @@ -1777,7 +1607,7 @@ S: Maintained LINUX FOR POWERPC EMBEDDED PPC8XX P: Marcelo Tosatti -M: marcelo@kvack.org +M: marcelo.tosatti@cyclades.com W: http://www.penguinppc.org/ L: linuxppc-embedded@ozlabs.org S: Maintained @@ -1801,8 +1631,8 @@ M: paulus@au.ibm.com P: Anton Blanchard M: anton@samba.org M: anton@au.ibm.com -W: http://www.penguinppc.org/ppc64/ -L: linuxppc-dev@ozlabs.org +W: http://linuxppc64.org +L: linuxppc64-dev@ozlabs.org S: Supported LINUX SECURITY MODULE (LSM) FRAMEWORK @@ -1910,18 +1740,12 @@ S: linux-scsi@vger.kernel.org W: http://megaraid.lsilogic.com S: Maintained -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) +MEMORY TECHNOLOGY DEVICES P: David Woodhouse M: dwmw2@infradead.org W: http://www.linux-mtd.infradead.org/ L: linux-mtd@lists.infradead.org -T: git git://git.infradead.org/mtd-2.6.git +T: git kernel.org:/pub/scm/linux/kernel/git/tglx/mtd-2.6.git S: Maintained MICROTEK X6 SCANNER @@ -1968,11 +1792,6 @@ L: linux-kernel@vger.kernel.org W: http://www.atnf.csiro.au/~rgooch/linux/kernel-patches.html S: Maintained -MULTIMEDIA CARD (MMC) SUBSYSTEM -P: Russell King -M: rmk+mmc@arm.linux.org.uk -S: Maintained - MULTISOUND SOUND DRIVER P: Andrew Veliath M: andrewtv@usa.net @@ -1995,12 +1814,6 @@ M: James.Bottomley@HansenPartnership.com L: linux-scsi@vger.kernel.org S: Maintained -NETEM NETWORK EMULATOR -P: Stephen Hemminger -M: shemminger@osdl.org -L: netem@osdl.org -S: Maintained - NETFILTER/IPTABLES/IPCHAINS P: Rusty Russell P: Marc Boucher @@ -2018,7 +1831,6 @@ NETROM NETWORK LAYER P: Ralf Baechle M: ralf@linux-mips.org L: linux-hams@vger.kernel.org -W: http://www.linux-ax25.org/ S: Maintained NETWORK BLOCK DEVICE @@ -2039,7 +1851,6 @@ NETWORKING [GENERAL] P: Networking Team M: netdev@vger.kernel.org L: netdev@vger.kernel.org -W: http://linux-net.osdl.org/ S: Maintained NETWORKING [IPv4/IPv6] @@ -2083,10 +1894,9 @@ L: linux-kernel@vger.kernel.org S: Maintained NI5010 NETWORK DRIVER -P: Jan-Pascal van Best -M: janpascal@vanbest.org -P: Andreas Mohr -M: andi@lisas.de +P: Jan-Pascal van Best and Andreas Mohr +M: Jan-Pascal van Best +M: Andreas Mohr <100.30936@germany.net> L: netdev@vger.kernel.org S: Maintained @@ -2125,12 +1935,6 @@ 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 @@ -2213,12 +2017,14 @@ P: Matthew Wilcox M: matthew@wil.cx P: Grant Grundler M: grundler@parisc-linux.org -P: Kyle McMartin -M: kyle@parisc-linux.org L: parisc-linux@parisc-linux.org W: http://www.parisc-linux.org/ -T: git kernel.org:/pub/scm/linux/kernel/git/kyle/parisc-2.6.git -T: cvs cvs.parisc-linux.org:/var/cvs/linux-2.6 +S: Maintained + +PERSONALITY HANDLING +P: Christoph Hellwig +M: hch@infradead.org +L: linux-abi-devel@lists.sourceforge.net S: Maintained PCI ERROR RECOVERY @@ -2261,7 +2067,6 @@ 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 @@ -2272,18 +2077,6 @@ 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 -L: linux-abi-devel@lists.sourceforge.net -S: Maintained - PHRAM MTD DRIVER P: Jörn Engel M: joern@wh.fh-wedel.de @@ -2352,14 +2145,6 @@ 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 @@ -2368,7 +2153,7 @@ S: Maintained QLOGIC QLA2XXX FC-SCSI DRIVER P: Andrew Vasquez -M: linux-driver@qlogic.com +M: andrew.vasquez@qlogic.com L: linux-scsi@vger.kernel.org S: Supported @@ -2414,12 +2199,6 @@ M: p_gortmaker@yahoo.com L: linux-kernel@vger.kernel.org S: Maintained -REAL TIME CLOCK (RTC) SUBSYSTEM -P: Alessandro Zummo -M: a.zummo@towertech.it -L: linux-kernel@vger.kernel.org -S: Maintained - REISERFS FILE SYSTEM P: Hans Reiser M: reiserfs-dev@namesys.com @@ -2436,12 +2215,18 @@ ROSE NETWORK LAYER P: Ralf Baechle M: ralf@linux-mips.org L: linux-hams@vger.kernel.org -W: http://www.linux-ax25.org/ S: Maintained RISCOM8 DRIVER S: Orphan +RTLINUX REALTIME LINUX +P: Victor Yodaiken +M: yodaiken@fsmlabs.com +L: rtl@rtlinux.org +W: www.rtlinux.org +S: Maintained + S3 SAVAGE FRAMEBUFFER DRIVER P: Antonino Daplas M: adaplas@pol.net @@ -2617,6 +2402,19 @@ 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 @@ -2654,28 +2452,6 @@ M: perex@suse.cz L: alsa-devel@alsa-project.org S: Maintained -SPI SUBSYSTEM -P: David Brownell -M: dbrownell@users.sourceforge.net -L: spi-devel-general@lists.sourceforge.net -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 - -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 @@ -2720,24 +2496,12 @@ M: kristen.c.accardi@intel.com L: pcihpd-discuss@lists.sourceforge.net S: Maintained -SECURE DIGITAL HOST CONTROLLER INTERFACE DRIVER -P: Pierre Ossman -M: drzeus-sdhci@drzeus.cx -L: sdhci-devel@list.drzeus.cx -W: http://mmc.drzeus.cx/wiki/Linux/Drivers/sdhci -S: Maintained - SKGE, SKY2 10/100/1000 GIGABIT ETHERNET DRIVERS P: Stephen Hemminger 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 @@ -2768,6 +2532,7 @@ S: Unsupported ? STRADIS MPEG-2 DECODER DRIVER P: Nathan Laredo M: laredo@gnu.org +W: http://mpeg.openprojects.net/ W: http://www.stradis.com/ S: Maintained @@ -2816,25 +2581,6 @@ 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 @@ -2911,7 +2657,7 @@ S: Maintained TUN/TAP driver P: Maxim Krasnyansky -M: maxk@qualcomm.com +M: maxk@qualcomm.com, max_mk@yahoo.com L: vtun@office.satix.net W: http://vtun.sourceforge.net/tun S: Maintained @@ -3168,14 +2914,6 @@ L: video4linux-list@redhat.com W: http://www.linux-projects.org S: Maintained -USB ZC0301 DRIVER -P: Luca Risolia -M: luca.risolia@studio.unibo.it -L: linux-usb-devel@lists.sourceforge.net -L: video4linux-list@redhat.com -W: http://www.linux-projects.org -S: Maintained - USB ZD1201 DRIVER P: Jeroen Vreeken M: pe1rxq@amsat.org @@ -3210,7 +2948,7 @@ S: Maintained VIAPRO SMBUS DRIVER P: Jean Delvare M: khali@linux-fr.org -L: i2c@lm-sensors.org +L: lm-sensors@lm-sensors.org S: Maintained UCLINUX (AND M68KNOMMU) @@ -3240,6 +2978,18 @@ L: rio500-users@lists.sourceforge.net W: http://rio500.sourceforge.net S: Maintained +V9FS FILE SYSTEM +P: Eric Van Hensbergen +M: ericvh@gmail.com +P: Ron Minnich +M: rminnich@lanl.gov +P: Latchesar Ionkov +M: lucho@ionkov.net +L: v9fs-developer@lists.sourceforge.net +W: http://v9fs.sf.net +T: git kernel.org:/pub/scm/linux/kernel/ericvh/v9fs-devel.git +S: Maintained + VIDEO FOR LINUX P: Mauro Carvalho Chehab M: mchehab@infradead.org @@ -3258,11 +3008,6 @@ 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 @@ -3273,6 +3018,19 @@ 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 + +WAN ROUTER & SANGOMA WANPIPE DRIVERS & API (X.25, FRAME RELAY, PPP, CISCO HDLC) +P: Nenad Corbic +M: ncorbic@sangoma.com +M: dm@sangoma.com +W: http://www.sangoma.com +S: Supported + WATCHDOG DEVICE DRIVERS P: Wim Van Sebroeck M: wim@iguana.be @@ -3310,11 +3068,10 @@ S: Maintained XFS FILESYSTEM P: Silicon Graphics Inc -P: Tim Shimmin, David Chatterton M: xfs-masters@oss.sgi.com -L: xfs@oss.sgi.com +M: nathans@sgi.com +L: linux-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 4b9d7fa81..322656a7f 100644 --- a/Makefile +++ b/Makefile @@ -1,8 +1,8 @@ VERSION = 2 PATCHLEVEL = 6 -SUBLEVEL = 18 -EXTRAVERSION = -prep -NAME=Avast! A bilge rat! +SUBLEVEL = 16 +EXTRAVERSION = .38-vs2.0.3-rc1 +NAME=Stable Penguin # *DOCUMENTATION* # To see a list of typical targets execute "make help" @@ -41,9 +41,8 @@ ifndef KBUILD_VERBOSE KBUILD_VERBOSE = 0 endif -# 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=....' +# Call sparse as part of compilation of C files +# Use 'make C=1' to enable sparse checking ifdef C ifeq ("$(origin C)", "command line") @@ -72,7 +71,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. @@ -96,7 +95,7 @@ ifdef O endif # That's our default target when none is given on the command line -PHONY := _all +.PHONY: _all _all: ifneq ($(KBUILD_OUTPUT),) @@ -107,7 +106,7 @@ KBUILD_OUTPUT := $(shell cd $(KBUILD_OUTPUT) && /bin/pwd) $(if $(KBUILD_OUTPUT),, \ $(error output directory "$(saved-output)" does not exist)) -PHONY += $(MAKECMDGOALS) +.PHONY: $(MAKECMDGOALS) $(filter-out _all,$(MAKECMDGOALS)) _all: $(if $(KBUILD_VERBOSE:1=),@)$(MAKE) -C $(KBUILD_OUTPUT) \ @@ -124,7 +123,7 @@ ifeq ($(skip-makefile),) # If building an external module we do not care about the all: rule # but instead _all depend on modules -PHONY += all +.PHONY: all ifeq ($(KBUILD_EXTMOD),) _all: all else @@ -138,7 +137,7 @@ objtree := $(CURDIR) src := $(srctree) obj := $(objtree) -VPATH := $(srctree)$(if $(KBUILD_EXTMOD),:$(KBUILD_EXTMOD)) +VPATH := $(srctree) export srctree objtree VPATH TOPDIR @@ -152,7 +151,7 @@ export srctree objtree VPATH TOPDIR SUBARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ \ -e s/arm.*/arm/ -e s/sa110/arm/ \ -e s/s390x/s390/ -e s/parisc64/parisc/ \ - -e s/ppc.*/powerpc/ -e s/mips.*/mips/ ) + -e s/ppc.*/powerpc/ ) # Cross compiling and selecting different set of gcc/bin-utils # --------------------------------------------------------------------------- @@ -179,20 +178,18 @@ 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 @@ -200,7 +197,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 up to date before we record them. +# make sure the checksums are uptodate before we record them. ifeq ($(MAKECMDGOALS),modules) KBUILD_BUILTIN := $(if $(CONFIG_MODVERSIONS),1) @@ -233,7 +230,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 will be printed at all, since +# If it is set to "silent_", nothing wil 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 @@ -261,6 +258,38 @@ endif export quiet Q KBUILD_VERBOSE +###### +# cc support functions to be used (only) in arch/$(ARCH)/Makefile +# See documentation in Documentation/kbuild/makefiles.txt + +# as-option +# Usage: cflags-y += $(call as-option, -Wa$(comma)-isa=foo,) + +as-option = $(shell if $(CC) $(CFLAGS) $(1) -Wa,-Z -c -o /dev/null \ + -xassembler /dev/null > /dev/null 2>&1; then echo "$(1)"; \ + else echo "$(2)"; fi ;) + +# cc-option +# Usage: cflags-y += $(call cc-option, -march=winchip-c6, -march=i586) + +cc-option = $(shell if $(CC) $(CFLAGS) $(1) -S -o /dev/null -xc /dev/null \ + > /dev/null 2>&1; then echo "$(1)"; else echo "$(2)"; fi ;) + +# cc-option-yn +# Usage: flag := $(call cc-option-yn, -march=winchip-c6) +cc-option-yn = $(shell if $(CC) $(CFLAGS) $(1) -S -o /dev/null -xc /dev/null \ + > /dev/null 2>&1; then echo "y"; else echo "n"; fi;) + +# cc-option-align +# Prefix align with either -falign or -malign +cc-option-align = $(subst -functions=0,,\ + $(call cc-option,-falign-functions=0,-malign-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))) + # Look for make include files relative to root of kernel src MAKEFLAGS += --include-dir=$(srctree) @@ -268,6 +297,11 @@ 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 @@ -303,21 +337,22 @@ 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 \ + -ffreestanding +AFLAGS := -D__ASSEMBLY__ -# Read KERNELRELEASE from include/config/kernel.release (if it exists) -KERNELRELEASE = $(shell cat include/config/kernel.release 2> /dev/null) +# Read KERNELRELEASE from .kernelrelease (if it exists) +KERNELRELEASE = $(shell cat .kernelrelease 2> /dev/null) KERNELVERSION = $(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION) -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 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 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 @@ -334,35 +369,35 @@ export RCS_TAR_IGNORE := --exclude SCCS --exclude BitKeeper --exclude .svn --exc # Rules shared between *config targets and build targets # Basic helpers built in scripts/ -PHONY += scripts_basic +.PHONY: scripts_basic scripts_basic: $(Q)$(MAKE) $(build)=scripts/basic # To avoid any implicit rule to kick in, define an empty command. scripts/basic/%: scripts_basic ; -PHONY += outputmakefile -# outputmakefile generates a Makefile in the output directory, if using a -# separate output directory. This allows convenient use of make in the -# output directory. +.PHONY: outputmakefile +# outputmakefile generate a Makefile to be placed in output directory, if +# using a seperate output directory. This allows convinient use +# of make in output directory outputmakefile: -ifneq ($(KBUILD_SRC),) - $(Q)$(CONFIG_SHELL) $(srctree)/scripts/mkmakefile \ - $(srctree) $(objtree) $(VERSION) $(PATCHLEVEL) -endif + $(Q)if test ! $(srctree) -ef $(objtree); then \ + $(CONFIG_SHELL) $(srctree)/scripts/mkmakefile \ + $(srctree) $(objtree) $(VERSION) $(PATCHLEVEL) \ + > $(objtree)/Makefile; \ + echo ' GEN $(objtree)/Makefile'; \ + fi # To make sure we do not include .config for any of the *config targets # 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% \ - include/linux/version.h headers_% \ - kernelrelease kernelversion + cscope TAGS tags help %docs check% config-targets := 0 mixed-targets := 0 @@ -404,8 +439,9 @@ include $(srctree)/arch/$(ARCH)/Makefile export KBUILD_DEFCONFIG config %config: scripts_basic outputmakefile FORCE - $(Q)mkdir -p include/linux include/config + $(Q)mkdir -p include/linux $(Q)$(MAKE) $(build)=scripts/kconfig $@ + $(Q)$(MAKE) -C $(srctree) KBUILD_SRC= .kernelrelease else # =========================================================================== @@ -415,11 +451,13 @@ else ifeq ($(KBUILD_EXTMOD),) # Additional helpers built in scripts/ # Carefully list dependencies so we do not try to build scripts twice -# in parallel -PHONY += scripts -scripts: scripts_basic include/config/auto.conf +# in parrallel +.PHONY: scripts +scripts: scripts_basic include/config/MARKER $(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/ @@ -429,48 +467,35 @@ core-y := usr/ endif # KBUILD_EXTMOD ifeq ($(dot-config),1) -# Read in config --include include/config/auto.conf +# In this section, we need .config -ifeq ($(KBUILD_EXTMOD),) # Read in dependencies to all Kconfig* files, make sure to run # oldconfig if changes are detected. --include include/config/auto.conf.cmd +-include .kconfig.d + +include .config +# 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 -$(KCONFIG_CONFIG) include/config/auto.conf.cmd: ; +.config .kconfig.d: ; -# If .config is newer than include/config/auto.conf, someone tinkered +# If .config is newer than include/linux/autoconf.h, someone tinkered # with it and forgot to run make oldconfig. -# if auto.conf.cmd is missing then we are probably in a cleaned tree so +# If kconfig.d is missing then we are probarly in a cleaned tree so # we execute the config step to be sure to catch updated Kconfig files -include/config/auto.conf: $(KCONFIG_CONFIG) include/config/auto.conf.cmd +include/linux/autoconf.h: .kconfig.d .config + $(Q)mkdir -p include/linux $(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/config/auto.conf: ; -endif # $(dot-config) +include/linux/autoconf.h: ; +endif # 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 overridden in the arch makefile +# Defaults vmlinux but it is usually overriden in the arch makefile all: vmlinux ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE @@ -479,7 +504,12 @@ else CFLAGS += -O2 endif -include $(srctree)/arch/$(ARCH)/Makefile +#Add align options if CONFIG_CC_* is not equal to 0 +add-align = $(if $(filter-out 0,$($(1))),$(cc-option-align)$(2)=$($(1))) +CFLAGS += $(call add-align,CONFIG_CC_ALIGN_FUNCTIONS,-functions) +CFLAGS += $(call add-align,CONFIG_CC_ALIGN_LABELS,-labels) +CFLAGS += $(call add-align,CONFIG_CC_ALIGN_LOOPS,-loops) +CFLAGS += $(call add-align,CONFIG_CC_ALIGN_JUMPS,-jumps) ifdef CONFIG_FRAME_POINTER CFLAGS += -fno-omit-frame-pointer $(call cc-option,-fno-optimize-sibling-calls,) @@ -487,16 +517,11 @@ else CFLAGS += -fomit-frame-pointer endif -ifdef CONFIG_UNWIND_INFO -CFLAGS += -fasynchronous-unwind-tables -endif - ifdef CONFIG_DEBUG_INFO CFLAGS += -g endif -# Force gcc to behave correct even for buggy distributions -CFLAGS += $(call cc-option, -fno-stack-protector) +include $(srctree)/arch/$(ARCH)/Makefile # arch Makefile may override CC so keep this after arch Makefile is included NOSTDINC_FLAGS += -nostdinc -isystem $(shell $(CC) -print-file-name=include) @@ -505,11 +530,11 @@ CHECKFLAGS += $(NOSTDINC_FLAGS) # warn about C99 declaration after statement CFLAGS += $(call cc-option,-Wdeclaration-after-statement,) -# disable pointer signed / unsigned warnings in gcc 4.0 +# disable pointer signedness 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 command line or +# KBUILD_IMAGE may be overruled on the commandline or # set in the environment # Also any assignments in arch/$(ARCH)/Makefile take precedence over # this default value @@ -523,29 +548,12 @@ 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 argument can be passed to make if needed. +# makefile but the arguement 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/ @@ -569,7 +577,7 @@ libs-y := $(libs-y1) $(libs-y2) # Build vmlinux # --------------------------------------------------------------------------- -# vmlinux is built from the objects selected by $(vmlinux-init) and +# vmlinux is build 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. @@ -620,7 +628,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 @@ -744,12 +752,12 @@ $(sort $(vmlinux-init) $(vmlinux-main)) $(vmlinux-lds): $(vmlinux-dirs) ; # make menuconfig etc. # Error messages still appears in the original language -PHONY += $(vmlinux-dirs) +.PHONY: $(vmlinux-dirs) $(vmlinux-dirs): prepare scripts $(Q)$(MAKE) $(build)=$@ # Build the kernel release string -# The KERNELRELEASE is stored in a file named include/config/kernel.release +# The KERNELRELEASE is stored in a file named .kernelrelease # to be used when executing for example make install or make modules_install # # Take the contents of any files called localversion* and the config @@ -767,10 +775,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 determined by the SCM used. +# The appended tag is determinded by the SCM used. # # Currently, only git is supported. # Other SCMs can edit scripts/setlocalversion and add the appropriate @@ -783,9 +791,9 @@ endif localver-full = $(localver)$(localver-auto) -# Store (new) KERNELRELASE string in include/config/kernel.release +# Store (new) KERNELRELASE string in .kernelrelease kernelrelease = $(KERNELVERSION)$(localver-full) -include/config/kernel.release: include/config/auto.conf FORCE +.kernelrelease: FORCE $(Q)rm -f $@ $(Q)echo $(kernelrelease) > $@ @@ -797,19 +805,19 @@ include/config/kernel.release: include/config/auto.conf FORCE # version.h and scripts_basic is processed / created. # Listed in dependency order -PHONY += prepare archprepare prepare0 prepare1 prepare2 prepare3 +.PHONY: prepare archprepare prepare0 prepare1 prepare2 prepare3 # prepare-all is deprecated, use prepare as valid replacement -PHONY += prepare-all +.PHONY: prepare-all # prepare3 is used to check if we are building in a separate output directory, # 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: include/config/kernel.release +prepare3: .kernelrelease ifneq ($(KBUILD_SRC),) @echo ' Using $(srctree) as source for kernel' - $(Q)if [ -f $(srctree)/.config -o -d $(srctree)/include/config ]; then \ + $(Q)if [ -f $(srctree)/.config ]; then \ echo " $(srctree) is not clean, please run 'make mrproper'";\ echo " in the '$(srctree)' directory.";\ /bin/false; \ @@ -821,11 +829,11 @@ endif # prepare2 creates a makefile if using a separate output directory prepare2: prepare3 outputmakefile -prepare1: prepare2 include/linux/version.h include/linux/utsrelease.h \ - include/asm include/config/auto.conf +prepare1: prepare2 include/linux/version.h include/asm \ + include/config/MARKER ifneq ($(KBUILD_MODULES),) + $(Q)rm -rf $(MODVERDIR) $(Q)mkdir -p $(MODVERDIR) - $(Q)rm -f $(MODVERDIR)/* endif archprepare: prepare1 scripts_basic @@ -836,20 +844,48 @@ 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. +# Single targets +# --------------------------------------------------------------------------- + +%.s: %.c scripts FORCE + $(Q)$(MAKE) $(build)=$(@D) $@ +%.i: %.c scripts FORCE + $(Q)$(MAKE) $(build)=$(@D) $@ +%.o: %.c scripts FORCE + $(Q)$(MAKE) $(build)=$(@D) $@ +%.ko: scripts FORCE + $(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1) $(build)=$(@D) $(@:.ko=.o) + $(Q)$(MAKE) -rR -f $(srctree)/scripts/Makefile.modpost +%/: scripts prepare FORCE + $(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1) $(build)=$(@D) +%.lst: %.c scripts FORCE + $(Q)$(MAKE) $(build)=$(@D) $@ +%.s: %.S scripts FORCE + $(Q)$(MAKE) $(build)=$(@D) $@ +%.o: %.S scripts FORCE + $(Q)$(MAKE) $(build)=$(@D) $@ + +# 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 # --------------------------------------------------------------------------- @@ -857,76 +893,53 @@ include/asm: # 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 - (echo \#define LINUX_VERSION_CODE $(shell \ - expr $(VERSION) \* 65536 + $(PATCHLEVEL) \* 256 + $(SUBLEVEL)); \ - echo '#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))';) + 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))'; \ + ) endef -include/linux/version.h: $(srctree)/Makefile FORCE +include/linux/version.h: $(srctree)/Makefile .config .kernelrelease FORCE $(call filechk,version.h) -include/linux/utsrelease.h: include/config/kernel.release FORCE - $(call filechk,utsrelease.h) - # --------------------------------------------------------------------------- -PHONY += depend dep +.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 # Build modules -PHONY += modules +.PHONY: modules modules: $(vmlinux-dirs) $(if $(KBUILD_BUILTIN),vmlinux) @echo ' Building modules, stage 2.'; $(Q)$(MAKE) -rR -f $(srctree)/scripts/Makefile.modpost # Target to prepare building external modules -PHONY += modules_prepare +.PHONY: modules_prepare modules_prepare: prepare scripts # Target to install modules -PHONY += modules_install +.PHONY: modules_install modules_install: _modinst_ _modinst_post -PHONY += _modinst_ +.PHONY: _modinst_ _modinst_: @if [ -z "`$(DEPMOD) -V 2>/dev/null | grep module-init-tools`" ]; then \ echo "Warning: you may need to install module-init-tools"; \ @@ -953,7 +966,7 @@ depmod_opts := else depmod_opts := -b $(INSTALL_MOD_PATH) -r endif -PHONY += _modinst_post +.PHONY: _modinst_post _modinst_post: _modinst_ if [ -r System.map -a -x $(DEPMOD) ]; then $(DEPMOD) -ae -F System.map $(depmod_opts) $(KERNELRELEASE); fi @@ -985,11 +998,10 @@ 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 usr/include +MRPROPER_DIRS += include/config include2 MRPROPER_FILES += .config .config.old include/asm .version .old_version \ - include/linux/autoconf.h include/linux/version.h \ - include/linux/utsrelease.h \ - Module.symvers tags TAGS cscope* + include/linux/autoconf.h include/linux/version.h \ + .kernelrelease Module.symvers tags TAGS cscope* # clean - Delete most, but leave enough to build external modules # @@ -997,7 +1009,7 @@ clean: rm-dirs := $(CLEAN_DIRS) clean: rm-files := $(CLEAN_FILES) clean-dirs := $(addprefix _clean_,$(srctree) $(vmlinux-alldirs)) -PHONY += $(clean-dirs) clean archclean +.PHONY: $(clean-dirs) clean archclean $(clean-dirs): $(Q)$(MAKE) $(clean)=$(patsubst _clean_%,%,$@) @@ -1005,9 +1017,8 @@ 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' \ - -o -name '*.symtypes' \) \ + \( -name '*.[oas]' -o -name '*.ko' -o -name '.*.cmd' \ + -o -name '.*.d' -o -name '.*.tmp' -o -name '*.mod.c' \) \ -type f -print | xargs rm -f # mrproper - Delete all generated files, including .config @@ -1016,7 +1027,7 @@ mrproper: rm-dirs := $(wildcard $(MRPROPER_DIRS)) mrproper: rm-files := $(wildcard $(MRPROPER_FILES)) mrproper-dirs := $(addprefix _mrproper_,Documentation/DocBook scripts) -PHONY += $(mrproper-dirs) mrproper archmrproper +.PHONY: $(mrproper-dirs) mrproper archmrproper $(mrproper-dirs): $(Q)$(MAKE) $(clean)=$(patsubst _mrproper_%,%,$@) @@ -1026,13 +1037,13 @@ mrproper: clean archmrproper $(mrproper-dirs) # distclean # -PHONY += distclean +.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 @@ -1042,10 +1053,12 @@ distclean: mrproper # rpm target kept for backward compatibility package-dir := $(srctree)/scripts/package -%pkg: include/config/kernel.release FORCE - $(Q)$(MAKE) $(build)=$(package-dir) $@ -rpm: include/config/kernel.release FORCE - $(Q)$(MAKE) $(build)=$(package-dir) $@ +.PHONY: %-pkg rpm + +%pkg: FORCE + $(Q)$(MAKE) -f $(package-dir)/Makefile $@ +rpm: FORCE + $(Q)$(MAKE) -f $(package-dir)/Makefile $@ # Brief documentation of the typical targets used @@ -1075,20 +1088,15 @@ 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 ' buildcheck - List dangling references to vmlinux discarded sections' + @echo ' and init sections from non-init sections' @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 + @$(MAKE) -f $(package-dir)/Makefile help @echo '' @echo 'Documentation targets:' @$(MAKE) -f $(srctree)/Documentation/DocBook/Makefile dochelp @@ -1104,8 +1112,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 by default)' - @echo ' make C=2 [targets] Force check of all c source with $$CHECK' + @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 '' @echo 'Execute "make" or "make all" to build all targets marked with [*] ' @echo 'For further info see the ./README file' @@ -1132,17 +1140,16 @@ 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 built in the module directory +# Install the modules build in the module directory # Assumes install directory is already created # We are always building modules KBUILD_MODULES := 1 -PHONY += crmodverdir +.PHONY: crmodverdir crmodverdir: $(Q)mkdir -p $(MODVERDIR) - $(Q)rm -f $(MODVERDIR)/* -PHONY += $(objtree)/Module.symvers +.PHONY: $(objtree)/Module.symvers $(objtree)/Module.symvers: @test -e $(objtree)/Module.symvers || ( \ echo; \ @@ -1151,7 +1158,7 @@ $(objtree)/Module.symvers: echo ) module-dirs := $(addprefix _module_,$(KBUILD_EXTMOD)) -PHONY += $(module-dirs) modules +.PHONY: $(module-dirs) modules $(module-dirs): crmodverdir $(objtree)/Module.symvers $(Q)$(MAKE) $(build)=$(patsubst _module_%,%,$@) @@ -1159,31 +1166,13 @@ modules: $(module-dirs) @echo ' Building modules, stage 2.'; $(Q)$(MAKE) -rR -f $(srctree)/scripts/Makefile.modpost -PHONY += modules_install -modules_install: _emodinst_ _emodinst_post - -install-dir := $(if $(INSTALL_MOD_DIR),$(INSTALL_MOD_DIR),extra) -PHONY += _emodinst_ -_emodinst_: - $(Q)mkdir -p $(MODLIB)/$(install-dir) +.PHONY: modules_install +modules_install: $(Q)$(MAKE) -rR -f $(srctree)/scripts/Makefile.modinst -# Run depmod only is we have System.map and depmod is executable -quiet_cmd_depmod = DEPMOD $(KERNELRELEASE) - cmd_depmod = if [ -r System.map -a -x $(DEPMOD) ]; then \ - $(DEPMOD) -ae -F System.map \ - $(if $(strip $(INSTALL_MOD_PATH)), \ - -b $(INSTALL_MOD_PATH) -r) \ - $(KERNELRELEASE); \ - fi - -PHONY += _emodinst_post -_emodinst_post: _emodinst_ - $(call cmd,depmod) - clean-dirs := $(addprefix _clean_,$(KBUILD_EXTMOD)) -PHONY += $(clean-dirs) clean +.PHONY: $(clean-dirs) clean $(clean-dirs): $(Q)$(MAKE) $(clean)=$(patsubst _clean_%,%,$@) @@ -1191,7 +1180,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 @@ -1203,11 +1192,6 @@ help: @echo ' modules_install - install the module' @echo ' clean - remove generated files in module directory only' @echo '' - -# Dummies... -PHONY += prepare scripts -prepare: ; -scripts: ; endif # KBUILD_EXTMOD # Generate tags for editors @@ -1230,41 +1214,31 @@ else ALLINCLUDE_ARCHS := $(ARCH) endif else -#Allow user to specify only ALLSOURCE_PATHS on the command line, keeping existing behavour. +#Allow user to specify only ALLSOURCE_PATHS on the command line, keeping existing behaviour. ALLINCLUDE_ARCHS := $(ALLSOURCE_ARCHS) endif ALLSOURCE_ARCHS := $(ARCH) -define find-sources - ( find $(__srctree) $(RCS_FIND_IGNORE) \ +define all-sources + ( find $(__srctree) $(RCS_FIND_IGNORE) \ \( -name include -o -name arch \) -prune -o \ - -name $1 -print; \ + -name '*.[chS]' -print; \ for ARCH in $(ALLSOURCE_ARCHS) ; do \ find $(__srctree)arch/$${ARCH} $(RCS_FIND_IGNORE) \ - -name $1 -print; \ + -name '*.[chS]' -print; \ done ; \ find $(__srctree)security/selinux/include $(RCS_FIND_IGNORE) \ - -name $1 -print; \ + -name '*.[chS]' -print; \ find $(__srctree)include $(RCS_FIND_IGNORE) \ \( -name config -o -name 'asm-*' \) -prune \ - -o -name $1 -print; \ + -o -name '*.[chS]' -print; \ for ARCH in $(ALLINCLUDE_ARCHS) ; do \ find $(__srctree)include/asm-$${ARCH} $(RCS_FIND_IGNORE) \ - -name $1 -print; \ + -name '*.[chS]' -print; \ done ; \ find $(__srctree)include/asm-generic $(RCS_FIND_IGNORE) \ - -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') + -name '*.[chS]' -print ) endef quiet_cmd_cscope-file = FILELST cscope.files @@ -1284,13 +1258,7 @@ 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; \ - 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 + $(all-sources) | xargs etags $$ETAGSF -a endef TAGS: FORCE @@ -1324,66 +1292,27 @@ versioncheck: -name '*.[hcS]' -type f -print | sort \ | xargs $(PERL) -w scripts/checkversion.pl +buildcheck: + $(PERL) $(srctree)/scripts/reference_discarded.pl + $(PERL) $(srctree)/scripts/reference_init.pl + namespacecheck: $(PERL) $(srctree)/scripts/namespace.pl endif #ifeq ($(config-targets),1) endif #ifeq ($(mixed-targets),1) -PHONY += checkstack kernelrelease kernelversion +.PHONY: checkstack checkstack: $(OBJDUMP) -d vmlinux $$(find . -name '*.ko') | \ $(PERL) $(src)/scripts/checkstack.pl $(ARCH) kernelrelease: - $(if $(wildcard include/config/kernel.release), $(Q)echo $(KERNELRELEASE), \ - $(error kernelrelease not valid - run 'make prepare' to update it)) + $(if $(wildcard .kernelrelease), $(Q)echo $(KERNELRELEASE), \ + $(error kernelrelease not valid - run 'make *config' to update it)) kernelversion: @echo $(KERNELVERSION) -# Single targets -# --------------------------------------------------------------------------- -# Single targets are compatible with: -# - build whith mixed source and output -# - build with separate output dir 'make O=...' -# - external modules -# -# target-dir => where to store outputfile -# build-dir => directory in kernel source tree to use - -ifeq ($(KBUILD_EXTMOD),) - build-dir = $(patsubst %/,%,$(dir $@)) - target-dir = $(dir $@) -else - zap-slash=$(filter-out .,$(patsubst %/,%,$(dir $@))) - build-dir = $(KBUILD_EXTMOD)$(if $(zap-slash),/$(zap-slash)) - target-dir = $(if $(KBUILD_EXTMOD),$(dir $<),$(dir $@)) -endif - -%.s: %.c prepare scripts FORCE - $(Q)$(MAKE) $(build)=$(build-dir) $(target-dir)$(notdir $@) -%.i: %.c prepare scripts FORCE - $(Q)$(MAKE) $(build)=$(build-dir) $(target-dir)$(notdir $@) -%.o: %.c prepare scripts FORCE - $(Q)$(MAKE) $(build)=$(build-dir) $(target-dir)$(notdir $@) -%.lst: %.c prepare scripts FORCE - $(Q)$(MAKE) $(build)=$(build-dir) $(target-dir)$(notdir $@) -%.s: %.S prepare scripts FORCE - $(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 - $(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1) \ - $(build)=$(build-dir) -%.ko: prepare scripts FORCE - $(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1) \ - $(build)=$(build-dir) $(@:.ko=.o) - $(Q)$(MAKE) -rR -f $(srctree)/scripts/Makefile.modpost - # FIXME Should go into a make.lib or something # =========================================================================== @@ -1396,7 +1325,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_$(basetarget).o) + $(modkern_aflags) $(EXTRA_AFLAGS) $(AFLAGS_$(*F).o) quiet_cmd_as_o_S = AS $@ cmd_as_o_S = $(CC) $(a_flags) -c -o $@ $< @@ -1418,10 +1347,4 @@ clean := -f $(if $(KBUILD_SRC),$(srctree)/)scripts/Makefile.clean obj endif # skip-makefile -PHONY += FORCE FORCE: - - -# Declare the contents of the .PHONY variable as phony. We keep that -# information in a variable se we can use it in if_changed and friends. -.PHONY: $(PHONY) diff --git a/README b/README index 3e264723b..0d318abaf 100644 --- a/README +++ b/README @@ -74,7 +74,7 @@ INSTALLING the kernel: whatever the kernel-du-jour happens to be. - You can also upgrade between 2.6.xx releases by patching. Patches are - distributed in the traditional gzip and the newer bzip2 format. To + distributed in the traditional gzip and the new bzip2 format. To install by patching, get all the newer patch files, enter the top level directory of the kernel source (linux-2.6.xx) and execute: @@ -165,31 +165,10 @@ CONFIGURING the kernel: "make xconfig" X windows (Qt) based configuration tool. "make gconfig" X windows (Gtk) based configuration tool. "make oldconfig" Default all questions based on the contents of - your existing ./.config file and asking about - new config symbols. + your existing ./.config file. "make silentoldconfig" Like above, but avoids cluttering the screen with questions already answered. - "make defconfig" Create a ./.config file by using the default - symbol values from arch/$ARCH/defconfig. - "make allyesconfig" - Create a ./.config file by setting symbol - values to 'y' as much as possible. - "make allmodconfig" - Create a ./.config file by setting symbol - values to 'm' as much as possible. - "make allnoconfig" Create a ./.config file by setting symbol - values to 'n' as much as possible. - "make randconfig" Create a ./.config file by setting symbol - values to random values. - - The allyesconfig/allmodconfig/allnoconfig/randconfig variants can - also use the environment variable KCONFIG_ALLCONFIG to specify a - filename that contains config options that the user requires to be - set to a specific value. If KCONFIG_ALLCONFIG=filename is not used, - "make *config" checks for a file named "all{yes/mod/no/random}.config" - for symbol values that are to be forced. If this file is not found, - it checks for a file named "all.config" to contain forced values. NOTES on "make config": - having unnecessary drivers will make the kernel bigger, and can diff --git a/arch/alpha/Kconfig b/arch/alpha/Kconfig index 60fdd21c3..3debe3263 100644 --- a/arch/alpha/Kconfig +++ b/arch/alpha/Kconfig @@ -25,10 +25,6 @@ config RWSEM_XCHGADD_ALGORITHM bool default y -config GENERIC_FIND_NEXT_BIT - bool - default y - config GENERIC_CALIBRATE_DELAY bool default y @@ -451,10 +447,6 @@ config ALPHA_IRONGATE depends on ALPHA_NAUTILUS default y -config GENERIC_HWEIGHT - bool - default y if !ALPHA_EV67 - config ALPHA_AVANTI bool depends on ALPHA_XL || ALPHA_AVANTI_CH @@ -549,11 +541,6 @@ config NUMA Access). This option is for configuring high-end multiprocessor server machines. If in doubt, say N. -config NODES_SHIFT - int - default "7" - depends on NEED_MULTIPLE_NODES - # LARGE_VMALLOC is racy, if you *really* need it then fix it first config ALPHA_LARGE_VMALLOC bool diff --git a/arch/alpha/boot/bootp.c b/arch/alpha/boot/bootp.c index 3af21c789..ec53c28e3 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 4307bde80..a6657f2cf 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 90ed55b66..78c9b0b6e 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 f042cc42b..1898ea79d 100644 --- a/arch/alpha/kernel/alpha_ksyms.c +++ b/arch/alpha/kernel/alpha_ksyms.c @@ -5,6 +5,7 @@ * modules. */ +#include #include #include #include @@ -14,7 +15,6 @@ #include #include #include -#include #include #include #include @@ -53,6 +53,10 @@ 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); @@ -64,13 +68,20 @@ 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(strpbrk); EXPORT_SYMBOL(strchr); EXPORT_SYMBOL(strrchr); +EXPORT_SYMBOL(memcmp); EXPORT_SYMBOL(memmove); +EXPORT_SYMBOL(memscan); EXPORT_SYMBOL(__memcpy); EXPORT_SYMBOL(__memset); EXPORT_SYMBOL(__memsetw); @@ -112,9 +123,11 @@ 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); @@ -170,6 +183,7 @@ EXPORT_SYMBOL(smp_num_cpus); EXPORT_SYMBOL(smp_call_function); EXPORT_SYMBOL(smp_call_function_on_cpu); EXPORT_SYMBOL(_atomic_dec_and_lock); +EXPORT_SYMBOL(cpu_present_mask); #endif /* CONFIG_SMP */ /* @@ -202,6 +216,8 @@ EXPORT_SYMBOL(memcpy); EXPORT_SYMBOL(memset); EXPORT_SYMBOL(memchr); +EXPORT_SYMBOL(get_wchan); + #ifdef CONFIG_ALPHA_IRONGATE EXPORT_SYMBOL(irongate_ioremap); EXPORT_SYMBOL(irongate_iounmap); diff --git a/arch/alpha/kernel/console.c b/arch/alpha/kernel/console.c index f313b3493..cb3e739fb 100644 --- a/arch/alpha/kernel/console.c +++ b/arch/alpha/kernel/console.c @@ -5,6 +5,7 @@ * non-0 I/O hose */ +#include #include #include #include diff --git a/arch/alpha/kernel/core_marvel.c b/arch/alpha/kernel/core_marvel.c index 7f6a98455..44866cb26 100644 --- a/arch/alpha/kernel/core_marvel.c +++ b/arch/alpha/kernel/core_marvel.c @@ -435,7 +435,7 @@ marvel_specify_io7(char *str) str = pchar; } while(*str); - return 1; + return 0; } __setup("io7=", marvel_specify_io7); diff --git a/arch/alpha/kernel/entry.S b/arch/alpha/kernel/entry.S index 428333baf..780cb9368 100644 --- a/arch/alpha/kernel/entry.S +++ b/arch/alpha/kernel/entry.S @@ -4,6 +4,7 @@ * Kernel entry-points. */ +#include #include #include #include diff --git a/arch/alpha/kernel/err_ev7.c b/arch/alpha/kernel/err_ev7.c index fed6b3d1b..bf52ba691 100644 --- a/arch/alpha/kernel/err_ev7.c +++ b/arch/alpha/kernel/err_ev7.c @@ -274,14 +274,16 @@ 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 < ARRAY_SIZE(el_ev7_pal_annotations); i++) + for(i = 0; + i #include #include #include diff --git a/arch/alpha/kernel/head.S b/arch/alpha/kernel/head.S index 1e2a62a1f..0905721fc 100644 --- a/arch/alpha/kernel/head.S +++ b/arch/alpha/kernel/head.S @@ -7,6 +7,7 @@ * 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 729c475d2..da677f829 100644 --- a/arch/alpha/kernel/irq.c +++ b/arch/alpha/kernel/irq.c @@ -10,6 +10,7 @@ * should be easier. */ +#include #include #include #include @@ -48,15 +49,15 @@ select_smp_affinity(unsigned int irq) static int last_cpu; int cpu = last_cpu + 1; - if (!irq_desc[irq].chip->set_affinity || irq_user_affinity[irq]) + if (!irq_desc[irq].handler->set_affinity || irq_user_affinity[irq]) return 1; while (!cpu_possible(cpu)) cpu = (cpu < (NR_CPUS-1) ? cpu + 1 : 0); last_cpu = cpu; - irq_desc[irq].affinity = cpumask_of_cpu(cpu); - irq_desc[irq].chip->set_affinity(irq, cpumask_of_cpu(cpu)); + irq_affinity[irq] = cpumask_of_cpu(cpu); + irq_desc[irq].handler->set_affinity(irq, cpumask_of_cpu(cpu)); return 0; } #endif /* CONFIG_SMP */ @@ -92,14 +93,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].chip->typename); + seq_printf(p, " %14s", irq_desc[irq].handler->typename); seq_printf(p, " %c%s", - (action->flags & IRQF_DISABLED)?'+':' ', + (action->flags & SA_INTERRUPT)?'+':' ', action->name); for (action=action->next; action; action = action->next) { seq_printf(p, ", %c%s", - (action->flags & IRQF_DISABLED)?'+':' ', + (action->flags & SA_INTERRUPT)?'+':' ', action->name); } diff --git a/arch/alpha/kernel/irq_alpha.c b/arch/alpha/kernel/irq_alpha.c index ddf5cf8dc..9d34ce26e 100644 --- a/arch/alpha/kernel/irq_alpha.c +++ b/arch/alpha/kernel/irq_alpha.c @@ -2,6 +2,7 @@ * Alpha specific irq code. */ +#include #include #include #include @@ -214,7 +215,7 @@ static unsigned int rtc_startup(unsigned int irq) { return 0; } struct irqaction timer_irqaction = { .handler = timer_interrupt, - .flags = IRQF_DISABLED, + .flags = SA_INTERRUPT, .name = "timer", }; @@ -232,7 +233,7 @@ void __init init_rtc_irq(void) { irq_desc[RTC_IRQ].status = IRQ_DISABLED; - irq_desc[RTC_IRQ].chip = &rtc_irq_type; + irq_desc[RTC_IRQ].handler = &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 ebbadbc0c..b188683b8 100644 --- a/arch/alpha/kernel/irq_i8259.c +++ b/arch/alpha/kernel/irq_i8259.c @@ -7,6 +7,7 @@ * Started hacking from linux-2.3.30pre6/arch/i386/kernel/i8259.c. */ +#include #include #include #include @@ -108,7 +109,7 @@ init_i8259a_irqs(void) for (i = 0; i < 16; i++) { irq_desc[i].status = IRQ_DISABLED; - irq_desc[i].chip = &i8259a_irq_type; + irq_desc[i].handler = &i8259a_irq_type; } setup_irq(2, &cascade); diff --git a/arch/alpha/kernel/irq_pyxis.c b/arch/alpha/kernel/irq_pyxis.c index 3b581415b..146a20b9e 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].chip = &pyxis_irq_type; + irq_desc[i].handler = &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 8e4d121f8..0a87e4669 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].chip = &srm_irq_type; + irq_desc[i].handler = &srm_irq_type; } } diff --git a/arch/alpha/kernel/machvec_impl.h b/arch/alpha/kernel/machvec_impl.h index 08b8302e6..11f996f24 100644 --- a/arch/alpha/kernel/machvec_impl.h +++ b/arch/alpha/kernel/machvec_impl.h @@ -6,6 +6,7 @@ * 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 67cd383a1..4fe254a03 100644 --- a/arch/alpha/kernel/osf_sys.c +++ b/arch/alpha/kernel/osf_sys.c @@ -117,21 +117,17 @@ 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(d_ino, &dirent->d_ino); + put_user(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) || @@ -249,7 +245,7 @@ do_osf_statfs(struct dentry * dentry, struct osf_statfs __user *buffer, unsigned long bufsiz) { struct kstatfs linux_stat; - int error = vfs_statfs(dentry, &linux_stat); + int error = vfs_statfs(dentry->d_inode->i_sb, &linux_stat); if (!error) error = linux_to_osf_statfs(&linux_stat, buffer, bufsiz); return error; @@ -621,12 +617,12 @@ osf_sysinfo(int command, char __user *buf, long count) long len, err = -EINVAL; offset = command-1; - if (offset >= 9) { + if (offset >= sizeof(sysinfo_table)/sizeof(char *)) { /* Digital UNIX has a few unpublished interfaces here */ printk("sysinfo(%d)", command); goto out; } - + down_read(&uts_sem); switch (offset) { @@ -830,6 +826,7 @@ osf_setsysinfo(unsigned long op, void __user *buffer, unsigned long nbytes, affects all sorts of things, like timeval and itimerval. */ extern struct timezone sys_tz; +extern int do_adjtimex(struct timex *); struct timeval32 { diff --git a/arch/alpha/kernel/pci.c b/arch/alpha/kernel/pci.c index ffb7d5423..2a8b364c8 100644 --- a/arch/alpha/kernel/pci.c +++ b/arch/alpha/kernel/pci.c @@ -12,6 +12,7 @@ * Nov 2000, Ivan Kokshaysky * PCI-PCI bridges cleanup */ +#include #include #include #include @@ -123,12 +124,12 @@ DECLARE_PCI_FIXUP_FINAL(PCI_ANY_ID, PCI_ANY_ID, pcibios_fixup_final); void pcibios_align_resource(void *data, struct resource *res, - resource_size_t size, resource_size_t align) + unsigned long size, unsigned long align) { struct pci_dev *dev = data; struct pci_controller *hose = dev->sysdata; unsigned long alignto; - resource_size_t start = res->start; + unsigned long 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 b3a8a2980..9924fd077 100644 --- a/arch/alpha/kernel/process.c +++ b/arch/alpha/kernel/process.c @@ -8,6 +8,7 @@ * This file handles the architecture-dependent parts of process handling. */ +#include #include #include #include @@ -25,7 +26,6 @@ #include #include #include -#include #include #include #include @@ -94,7 +94,7 @@ common_shutdown_1(void *generic_ptr) if (cpuid != boot_cpuid) { flags |= 0x00040000UL; /* "remain halted" */ *pflags = flags; - cpu_clear(cpuid, cpu_present_map); + clear_bit(cpuid, &cpu_present_mask); halt(); } #endif @@ -120,8 +120,8 @@ common_shutdown_1(void *generic_ptr) #ifdef CONFIG_SMP /* Wait for the secondaries to halt. */ - cpu_clear(boot_cpuid, cpu_present_map); - while (cpus_weight(cpu_present_map)) + cpu_clear(boot_cpuid, cpu_possible_map); + while (cpus_weight(cpu_possible_map)) barrier(); #endif @@ -475,7 +475,7 @@ out: */ unsigned long -thread_saved_pc(struct task_struct *t) +thread_saved_pc(task_t *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 2a6e3da81..e1560fb15 100644 --- a/arch/alpha/kernel/proto.h +++ b/arch/alpha/kernel/proto.h @@ -1,3 +1,4 @@ +#include #include diff --git a/arch/alpha/kernel/setup.c b/arch/alpha/kernel/setup.c index a94e6d93e..45308bd3b 100644 --- a/arch/alpha/kernel/setup.c +++ b/arch/alpha/kernel/setup.c @@ -19,8 +19,9 @@ #include #include #include -#include +#include #include +#include /* CONFIG_ALPHA_LCA etc */ #include #include #include @@ -28,14 +29,12 @@ #include #include #include -#include #include #include #include #include #include #include -#include #ifdef CONFIG_MAGIC_SYSRQ #include #include @@ -44,7 +43,7 @@ #include #include -extern struct atomic_notifier_head panic_notifier_list; +extern struct notifier_block *panic_notifier_list; static int alpha_panic_event(struct notifier_block *, unsigned long, void *); static struct notifier_block alpha_panic_block = { alpha_panic_event, @@ -113,6 +112,8 @@ 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 *); @@ -237,10 +238,13 @@ 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 < ARRAY_SIZE(standard_io_resources); ++i) + for (i = 0; i < N(standard_io_resources); ++i) request_resource(io, standard_io_resources+i); } +#define PFN_UP(x) (((x) + PAGE_SIZE-1) >> PAGE_SHIFT) +#define PFN_DOWN(x) ((x) >> PAGE_SHIFT) +#define PFN_PHYS(x) ((x) << PAGE_SHIFT) #define PFN_MAX PFN_DOWN(0x80000000) #define for_each_mem_cluster(memdesc, cluster, i) \ for ((cluster) = (memdesc)->cluster, (i) = 0; \ @@ -469,6 +473,11 @@ page_is_ram(unsigned long pfn) return 0; } +#undef PFN_UP +#undef PFN_DOWN +#undef PFN_PHYS +#undef PFN_MAX + static int __init register_cpus(void) { @@ -478,7 +487,7 @@ register_cpus(void) struct cpu *p = kzalloc(sizeof(*p), GFP_KERNEL); if (!p) return -ENOMEM; - register_cpu(p, i); + register_cpu(p, i, NULL); } return 0; } @@ -515,8 +524,7 @@ setup_arch(char **cmdline_p) } /* Register a call for panic conditions. */ - atomic_notifier_chain_register(&panic_notifier_list, - &alpha_panic_block); + notifier_chain_register(&panic_notifier_list, &alpha_panic_block); #ifdef CONFIG_ALPHA_GENERIC /* Assume that we've booted from SRM if we haven't booted from MILO. @@ -915,13 +923,13 @@ get_sysvec(unsigned long type, unsigned long variation, unsigned long cpu) /* Search the system tables first... */ vec = NULL; - if (type < ARRAY_SIZE(systype_vecs)) { + if (type < N(systype_vecs)) { vec = systype_vecs[type]; } else if ((type > ST_API_BIAS) && - (type - ST_API_BIAS) < ARRAY_SIZE(api_vecs)) { + (type - ST_API_BIAS) < N(api_vecs)) { vec = api_vecs[type - ST_API_BIAS]; } else if ((type > ST_UNOFFICIAL_BIAS) && - (type - ST_UNOFFICIAL_BIAS) < ARRAY_SIZE(unofficial_vecs)) { + (type - ST_UNOFFICIAL_BIAS) < N(unofficial_vecs)) { vec = unofficial_vecs[type - ST_UNOFFICIAL_BIAS]; } @@ -935,11 +943,11 @@ get_sysvec(unsigned long type, unsigned long variation, unsigned long cpu) switch (type) { case ST_DEC_ALCOR: - if (member < ARRAY_SIZE(alcor_indices)) + if (member < N(alcor_indices)) vec = alcor_vecs[alcor_indices[member]]; break; case ST_DEC_EB164: - if (member < ARRAY_SIZE(eb164_indices)) + if (member < N(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... */ @@ -947,24 +955,24 @@ get_sysvec(unsigned long type, unsigned long variation, unsigned long cpu) vec = &pc164_mv; break; case ST_DEC_EB64P: - if (member < ARRAY_SIZE(eb64p_indices)) + if (member < N(eb64p_indices)) vec = eb64p_vecs[eb64p_indices[member]]; break; case ST_DEC_EB66: - if (member < ARRAY_SIZE(eb66_indices)) + if (member < N(eb66_indices)) vec = eb66_vecs[eb66_indices[member]]; break; case ST_DEC_MARVEL: - if (member < ARRAY_SIZE(marvel_indices)) + if (member < N(marvel_indices)) vec = marvel_vecs[marvel_indices[member]]; break; case ST_DEC_TITAN: vec = titan_vecs[0]; /* default */ - if (member < ARRAY_SIZE(titan_indices)) + if (member < N(titan_indices)) vec = titan_vecs[titan_indices[member]]; break; case ST_DEC_TSUNAMI: - if (member < ARRAY_SIZE(tsunami_indices)) + if (member < N(tsunami_indices)) vec = tsunami_vecs[tsunami_indices[member]]; break; case ST_DEC_1000: @@ -1036,7 +1044,7 @@ get_sysvec_byname(const char *name) size_t i; - for (i = 0; i < ARRAY_SIZE(all_vecs); ++i) { + for (i = 0; i < N(all_vecs); ++i) { struct alpha_machine_vector *mv = all_vecs[i]; if (strcasecmp(mv->vector_name, name) == 0) return mv; @@ -1052,13 +1060,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 < ARRAY_SIZE(systype_names)) { + if (type < N(systype_names)) { *type_name = systype_names[type]; } else if ((type > ST_API_BIAS) && - (type - ST_API_BIAS) < ARRAY_SIZE(api_names)) { + (type - ST_API_BIAS) < N(api_names)) { *type_name = api_names[type - ST_API_BIAS]; } else if ((type > ST_UNOFFICIAL_BIAS) && - (type - ST_UNOFFICIAL_BIAS) < ARRAY_SIZE(unofficial_names)) { + (type - ST_UNOFFICIAL_BIAS) < N(unofficial_names)) { *type_name = unofficial_names[type - ST_UNOFFICIAL_BIAS]; } else { *type_name = sys_unknown; @@ -1080,7 +1088,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 < ARRAY_SIZE(eb164_indices)) + if (member < N(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... */ @@ -1088,32 +1096,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 < ARRAY_SIZE(alcor_indices)) + if (member < N(alcor_indices)) *variation_name = alcor_names[alcor_indices[member]]; break; case ST_DEC_EB64P: - if (member < ARRAY_SIZE(eb64p_indices)) + if (member < N(eb64p_indices)) *variation_name = eb64p_names[eb64p_indices[member]]; break; case ST_DEC_EB66: - if (member < ARRAY_SIZE(eb66_indices)) + if (member < N(eb66_indices)) *variation_name = eb66_names[eb66_indices[member]]; break; case ST_DEC_MARVEL: - if (member < ARRAY_SIZE(marvel_indices)) + if (member < N(marvel_indices)) *variation_name = marvel_names[marvel_indices[member]]; break; case ST_DEC_RAWHIDE: - if (member < ARRAY_SIZE(rawhide_indices)) + if (member < N(rawhide_indices)) *variation_name = rawhide_names[rawhide_indices[member]]; break; case ST_DEC_TITAN: *variation_name = titan_names[0]; /* default */ - if (member < ARRAY_SIZE(titan_indices)) + if (member < N(titan_indices)) *variation_name = titan_names[titan_indices[member]]; break; case ST_DEC_TSUNAMI: - if (member < ARRAY_SIZE(tsunami_indices)) + if (member < N(tsunami_indices)) *variation_name = tsunami_names[tsunami_indices[member]]; break; } @@ -1208,7 +1216,7 @@ show_cpuinfo(struct seq_file *f, void *slot) cpu_index = (unsigned) (cpu->type - 1); cpu_name = "Unknown"; - if (cpu_index < ARRAY_SIZE(cpu_names)) + if (cpu_index < N(cpu_names)) cpu_name = cpu_names[cpu_index]; get_sysnames(hwrpb->sys_type, hwrpb->sys_variation, @@ -1493,20 +1501,3 @@ alpha_panic_event(struct notifier_block *this, unsigned long event, void *ptr) #endif return NOTIFY_DONE; } - -static __init int add_pcspkr(void) -{ - struct platform_device *pd; - int ret; - - pd = platform_device_alloc("pcspkr", -1); - if (!pd) - return -ENOMEM; - - ret = platform_device_add(pd); - if (ret) - platform_device_put(pd); - - return ret; -} -device_initcall(add_pcspkr); diff --git a/arch/alpha/kernel/signal.c b/arch/alpha/kernel/signal.c index 741da0945..2e45e8604 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 && ! sas_ss_flags(sp)) + if ((ka->sa.sa_flags & SA_ONSTACK) != 0 && ! on_sig_stack(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 2636cc028..421e51ea6 100644 --- a/arch/alpha/kernel/smc37c93x.c +++ b/arch/alpha/kernel/smc37c93x.c @@ -2,6 +2,7 @@ * SMC 37C93X initialization code */ +#include #include #include diff --git a/arch/alpha/kernel/smp.c b/arch/alpha/kernel/smp.c index 4dc273e53..185255416 100644 --- a/arch/alpha/kernel/smp.c +++ b/arch/alpha/kernel/smp.c @@ -68,6 +68,7 @@ enum ipi_message_type { static int smp_secondary_alive __initdata = 0; /* Which cpus ids came online. */ +cpumask_t cpu_present_mask; cpumask_t cpu_online_map; EXPORT_SYMBOL(cpu_online_map); @@ -438,7 +439,7 @@ setup_smp(void) if ((cpu->flags & 0x1cc) == 0x1cc) { smp_num_probed++; /* Assume here that "whami" == index */ - cpu_set(i, cpu_present_map); + cpu_set(i, cpu_present_mask); cpu->pal_revision = boot_cpu_palrev; } @@ -449,10 +450,11 @@ setup_smp(void) } } else { smp_num_probed = 1; + cpu_set(boot_cpuid, cpu_present_mask); } - printk(KERN_INFO "SMP: %d CPUs probed -- cpu_present_map = %lx\n", - smp_num_probed, cpu_present_map.bits[0]); + printk(KERN_INFO "SMP: %d CPUs probed -- cpu_present_mask = %lx\n", + smp_num_probed, cpu_possible_map.bits[0]); } /* @@ -471,7 +473,7 @@ smp_prepare_cpus(unsigned int max_cpus) /* Nothing to do on a UP box, or when told not to. */ if (smp_num_probed == 1 || max_cpus == 0) { - cpu_present_map = cpumask_of_cpu(boot_cpuid); + cpu_present_mask = cpumask_of_cpu(boot_cpuid); printk(KERN_INFO "SMP mode deactivated.\n"); return; } @@ -484,6 +486,10 @@ smp_prepare_cpus(unsigned int max_cpus) void __devinit smp_prepare_boot_cpu(void) { + /* + * Mark the boot cpu (current cpu) as online + */ + cpu_set(smp_processor_id(), cpu_online_map); } int __devinit diff --git a/arch/alpha/kernel/srm_env.c b/arch/alpha/kernel/srm_env.c index 990ac6102..5c98fc83e 100644 --- a/arch/alpha/kernel/srm_env.c +++ b/arch/alpha/kernel/srm_env.c @@ -57,6 +57,7 @@ */ #include +#include #include #include #include diff --git a/arch/alpha/kernel/srmcons.c b/arch/alpha/kernel/srmcons.c index 9d7dff27f..3b30d4f1f 100644 --- a/arch/alpha/kernel/srmcons.c +++ b/arch/alpha/kernel/srmcons.c @@ -5,6 +5,7 @@ * (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 d6926b7b1..d7f0e97fe 100644 --- a/arch/alpha/kernel/sys_alcor.c +++ b/arch/alpha/kernel/sys_alcor.c @@ -8,6 +8,7 @@ * Code supporting the ALCOR and XLT (XL-300/366/433). */ +#include #include #include #include @@ -143,7 +144,7 @@ alcor_init_irq(void) if (i >= 16+20 && i <= 16+30) continue; irq_desc[i].status = IRQ_DISABLED | IRQ_LEVEL; - irq_desc[i].chip = &alcor_irq_type; + irq_desc[i].handler = &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 25a215067..8e3374d34 100644 --- a/arch/alpha/kernel/sys_cabriolet.c +++ b/arch/alpha/kernel/sys_cabriolet.c @@ -9,6 +9,7 @@ * PC164 and LX164. */ +#include #include #include #include @@ -123,7 +124,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].chip = &cabriolet_irq_type; + irq_desc[i].handler = &cabriolet_irq_type; } } diff --git a/arch/alpha/kernel/sys_dp264.c b/arch/alpha/kernel/sys_dp264.c index dd6103b86..d5da6b1b2 100644 --- a/arch/alpha/kernel/sys_dp264.c +++ b/arch/alpha/kernel/sys_dp264.c @@ -12,6 +12,7 @@ * Code supporting the DP264 (EV6+TSUNAMI). */ +#include #include #include #include @@ -299,7 +300,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].chip = ops; + irq_desc[i].handler = ops; } } diff --git a/arch/alpha/kernel/sys_eb64p.c b/arch/alpha/kernel/sys_eb64p.c index ed108b66e..61a79c354 100644 --- a/arch/alpha/kernel/sys_eb64p.c +++ b/arch/alpha/kernel/sys_eb64p.c @@ -8,6 +8,7 @@ * Code supporting the EB64+ and EB66. */ +#include #include #include #include @@ -136,7 +137,7 @@ eb64p_init_irq(void) for (i = 16; i < 32; ++i) { irq_desc[i].status = IRQ_DISABLED | IRQ_LEVEL; - irq_desc[i].chip = &eb64p_irq_type; + irq_desc[i].handler = &eb64p_irq_type; } common_init_isa_dma(); diff --git a/arch/alpha/kernel/sys_eiger.c b/arch/alpha/kernel/sys_eiger.c index 64a785baf..bd6e5f0e4 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].chip = &eiger_irq_type; + irq_desc[i].handler = &eiger_irq_type; } } diff --git a/arch/alpha/kernel/sys_jensen.c b/arch/alpha/kernel/sys_jensen.c index 4ac2b328b..fcabb7c96 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 |= IRQF_DISABLED; + irq_desc[irq].action->flags |= SA_INTERRUPT; return 0; } @@ -206,11 +206,11 @@ jensen_init_irq(void) { init_i8259a_irqs(); - 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; + 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; common_init_isa_dma(); } diff --git a/arch/alpha/kernel/sys_marvel.c b/arch/alpha/kernel/sys_marvel.c index 36d215954..e32fee505 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].chip = lsi_ops; + irq_desc[base + i].handler = 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].chip = msi_ops; + irq_desc[base + i].handler = 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].chip = &marvel_legacy_irq_type; + irq_desc[i].handler = &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 cc4c58111..d78a0daa6 100644 --- a/arch/alpha/kernel/sys_mikasa.c +++ b/arch/alpha/kernel/sys_mikasa.c @@ -8,6 +8,7 @@ * Code supporting the MIKASA (AlphaServer 1000). */ +#include #include #include #include @@ -116,7 +117,7 @@ mikasa_init_irq(void) for (i = 16; i < 32; ++i) { irq_desc[i].status = IRQ_DISABLED | IRQ_LEVEL; - irq_desc[i].chip = &mikasa_irq_type; + irq_desc[i].handler = &mikasa_irq_type; } init_i8259a_irqs(); diff --git a/arch/alpha/kernel/sys_noritake.c b/arch/alpha/kernel/sys_noritake.c index 2d3cff7e8..65061f5d7 100644 --- a/arch/alpha/kernel/sys_noritake.c +++ b/arch/alpha/kernel/sys_noritake.c @@ -9,6 +9,7 @@ * CORELLE (AlphaServer 800), and ALCOR Primo (AlphaStation 600A). */ +#include #include #include #include @@ -138,7 +139,7 @@ noritake_init_irq(void) for (i = 16; i < 48; ++i) { irq_desc[i].status = IRQ_DISABLED | IRQ_LEVEL; - irq_desc[i].chip = &noritake_irq_type; + irq_desc[i].handler = &noritake_irq_type; } init_i8259a_irqs(); diff --git a/arch/alpha/kernel/sys_rawhide.c b/arch/alpha/kernel/sys_rawhide.c index 949607e3d..05888a02a 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].chip = &rawhide_irq_type; + irq_desc[i].handler = &rawhide_irq_type; } init_i8259a_irqs(); diff --git a/arch/alpha/kernel/sys_ruffian.c b/arch/alpha/kernel/sys_ruffian.c index 5b99cf3cd..78c30decf 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 < ARRAY_SIZE(size)) + if (bank < sizeof(size)/sizeof(*size)) ret = size[bank]; } diff --git a/arch/alpha/kernel/sys_rx164.c b/arch/alpha/kernel/sys_rx164.c index 6ae506052..584042430 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].chip = &rx164_irq_type; + irq_desc[i].handler = &rx164_irq_type; } init_i8259a_irqs(); diff --git a/arch/alpha/kernel/sys_sable.c b/arch/alpha/kernel/sys_sable.c index a7a14647b..a7ff84474 100644 --- a/arch/alpha/kernel/sys_sable.c +++ b/arch/alpha/kernel/sys_sable.c @@ -8,6 +8,7 @@ * Code supporting the Sable, Sable-Gamma, and Lynx systems. */ +#include #include #include #include @@ -536,7 +537,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].chip = &sable_lynx_irq_type; + irq_desc[i].handler = &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 a654014d2..131a2d9f7 100644 --- a/arch/alpha/kernel/sys_sio.c +++ b/arch/alpha/kernel/sys_sio.c @@ -10,13 +10,14 @@ * 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 2c75cd1fd..7955bdfc2 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].chip = &takara_irq_type; + irq_desc[i].handler = &takara_irq_type; } common_init_isa_dma(); diff --git a/arch/alpha/kernel/sys_titan.c b/arch/alpha/kernel/sys_titan.c index 302aab38d..5f84417ee 100644 --- a/arch/alpha/kernel/sys_titan.c +++ b/arch/alpha/kernel/sys_titan.c @@ -12,6 +12,7 @@ * Granite */ +#include #include #include #include @@ -65,7 +66,7 @@ titan_update_irq_hw(unsigned long mask) register int bcpu = boot_cpuid; #ifdef CONFIG_SMP - cpumask_t cpm = cpu_present_map; + cpumask_t cpm = cpu_present_mask; volatile unsigned long *dim0, *dim1, *dim2, *dim3; unsigned long mask0, mask1, mask2, mask3, dummy; @@ -188,7 +189,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].chip = ops; + irq_desc[i].handler = ops; } } @@ -279,15 +280,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, IRQF_DISABLED, + request_irq(63+16, titan_intr_nop, SA_INTERRUPT, "CChip Error", NULL); - request_irq(62+16, titan_intr_nop, IRQF_DISABLED, + request_irq(62+16, titan_intr_nop, SA_INTERRUPT, "PChip 0 H_Error", NULL); - request_irq(61+16, titan_intr_nop, IRQF_DISABLED, + request_irq(61+16, titan_intr_nop, SA_INTERRUPT, "PChip 1 H_Error", NULL); - request_irq(60+16, titan_intr_nop, IRQF_DISABLED, + request_irq(60+16, titan_intr_nop, SA_INTERRUPT, "PChip 0 C_Error", NULL); - request_irq(59+16, titan_intr_nop, IRQF_DISABLED, + request_irq(59+16, titan_intr_nop, SA_INTERRUPT, "PChip 1 C_Error", NULL); /* @@ -348,9 +349,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, IRQF_DISABLED, + request_irq(53+16, titan_intr_nop, SA_INTERRUPT, "NMI", NULL); - request_irq(50+16, titan_intr_nop, IRQF_DISABLED, + request_irq(50+16, titan_intr_nop, SA_INTERRUPT, "Temperature Warning", NULL); /* diff --git a/arch/alpha/kernel/sys_wildfire.c b/arch/alpha/kernel/sys_wildfire.c index 22c5798fe..1553f4702 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].chip = &wildfire_irq_type; + irq_desc[i+irq_bias].handler = &wildfire_irq_type; } irq_desc[36+irq_bias].status = IRQ_DISABLED | IRQ_LEVEL; - irq_desc[36+irq_bias].chip = &wildfire_irq_type; + irq_desc[36+irq_bias].handler = &wildfire_irq_type; for (i = 40; i < 64; ++i) { irq_desc[i+irq_bias].status = IRQ_DISABLED | IRQ_LEVEL; - irq_desc[i+irq_bias].chip = &wildfire_irq_type; + irq_desc[i+irq_bias].handler = &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 fa818f41f..1c5c9e32f 100644 --- a/arch/alpha/kernel/systbls.S +++ b/arch/alpha/kernel/systbls.S @@ -4,6 +4,7 @@ * The system call table. */ +#include /* CONFIG_OSF4_COMPAT */ #include .data @@ -239,15 +240,7 @@ sys_call_table: .quad alpha_ni_syscall .quad alpha_ni_syscall /* 220 */ .quad alpha_ni_syscall -#ifdef CONFIG_TUX - .quad __sys_tux -#else -# ifdef CONFIG_TUX_MODULE - .quad sys_tux -# else .quad alpha_ni_syscall -# endif -#endif .quad alpha_ni_syscall .quad alpha_ni_syscall .quad alpha_ni_syscall /* 225 */ diff --git a/arch/alpha/kernel/time.c b/arch/alpha/kernel/time.c index b191cc759..6b2921be1 100644 --- a/arch/alpha/kernel/time.c +++ b/arch/alpha/kernel/time.c @@ -27,6 +27,7 @@ * 2003-06-03 R. Scott Bailey * Tighten sanity in time_init from 1% (10,000 PPM) to 250 PPM */ +#include #include #include #include @@ -233,7 +234,7 @@ validate_cc_value(unsigned long cc) index = cpu->type & 0xffffffff; /* If index out of bounds, no way to validate. */ - if (index >= ARRAY_SIZE(cpu_hz)) + if (index >= sizeof(cpu_hz)/sizeof(cpu_hz[0])) return cc; /* If index contains no data, no way to validate. */ @@ -313,11 +314,10 @@ time_init(void) if (!est_cycle_freq) est_cycle_freq = validate_cc_value(calibrate_cc_with_pit()); - cc1 = rpcc(); + cc1 = rpcc_after_update_in_progress(); /* Calibrate CPU clock -- attempt #2. */ if (!est_cycle_freq) { - cc1 = rpcc_after_update_in_progress(); cc2 = rpcc_after_update_in_progress(); est_cycle_freq = validate_cc_value(cc2 - cc1); cc1 = cc2; diff --git a/arch/alpha/kernel/traps.c b/arch/alpha/kernel/traps.c index d6e665d56..f9d12319e 100644 --- a/arch/alpha/kernel/traps.c +++ b/arch/alpha/kernel/traps.c @@ -8,6 +8,7 @@ * 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 71470e9d9..0922e0785 100644 --- a/arch/alpha/kernel/vmlinux.lds.S +++ b/arch/alpha/kernel/vmlinux.lds.S @@ -1,3 +1,4 @@ +#include #include OUTPUT_FORMAT("elf64-alpha") diff --git a/arch/alpha/lib/callback_srm.S b/arch/alpha/lib/callback_srm.S index 8804bec2c..0528acd0d 100644 --- a/arch/alpha/lib/callback_srm.S +++ b/arch/alpha/lib/callback_srm.S @@ -2,6 +2,7 @@ * arch/alpha/lib/callback_srm.S */ +#include #include .text diff --git a/arch/alpha/lib/ev6-memchr.S b/arch/alpha/lib/ev6-memchr.S index 1a5f71b9d..a8e843dbc 100644 --- a/arch/alpha/lib/ev6-memchr.S +++ b/arch/alpha/lib/ev6-memchr.S @@ -84,7 +84,7 @@ $last_quad: beq $2, $not_found # U : U L U L $found_it: -#ifdef CONFIG_ALPHA_EV67 +#if defined(__alpha_fix__) && defined(__alpha_cix__) /* * Since we are guaranteed to have set one of the bits, we don't * have to worry about coming back with a 0x40 out of cttz... diff --git a/arch/alpha/lib/fpreg.c b/arch/alpha/lib/fpreg.c index 05017ba34..97c4d9d7a 100644 --- a/arch/alpha/lib/fpreg.c +++ b/arch/alpha/lib/fpreg.c @@ -4,7 +4,7 @@ * (C) Copyright 1998 Linus Torvalds */ -#if defined(CONFIG_ALPHA_EV6) || defined(CONFIG_ALPHA_EV67) +#if defined(__alpha_cix__) || defined(__alpha_fix__) #define STT(reg,val) asm volatile ("ftoit $f"#reg",%0" : "=r"(val)); #else #define STT(reg,val) asm volatile ("stt $f"#reg",%0" : "=m"(val)); @@ -53,7 +53,7 @@ alpha_read_fp_reg (unsigned long reg) return val; } -#if defined(CONFIG_ALPHA_EV6) || defined(CONFIG_ALPHA_EV67) +#if defined(__alpha_cix__) || defined(__alpha_fix__) #define LDT(reg,val) asm volatile ("itoft %0,$f"#reg : : "r"(val)); #else #define LDT(reg,val) asm volatile ("ldt $f"#reg",%0" : : "m"(val)); @@ -98,7 +98,7 @@ alpha_write_fp_reg (unsigned long reg, unsigned long val) } } -#if defined(CONFIG_ALPHA_EV6) || defined(CONFIG_ALPHA_EV67) +#if defined(__alpha_cix__) || defined(__alpha_fix__) #define STS(reg,val) asm volatile ("ftois $f"#reg",%0" : "=r"(val)); #else #define STS(reg,val) asm volatile ("sts $f"#reg",%0" : "=m"(val)); @@ -147,7 +147,7 @@ alpha_read_fp_reg_s (unsigned long reg) return val; } -#if defined(CONFIG_ALPHA_EV6) || defined(CONFIG_ALPHA_EV67) +#if defined(__alpha_cix__) || defined(__alpha_fix__) #define LDS(reg,val) asm volatile ("itofs %0,$f"#reg : : "r"(val)); #else #define LDS(reg,val) asm volatile ("lds $f"#reg",%0" : : "m"(val)); diff --git a/arch/alpha/lib/udelay.c b/arch/alpha/lib/udelay.c index 69d52aa37..1c879bbce 100644 --- a/arch/alpha/lib/udelay.c +++ b/arch/alpha/lib/udelay.c @@ -4,6 +4,7 @@ * 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 dc7aeda15..c3849baeb 100644 --- a/arch/alpha/mm/extable.c +++ b/arch/alpha/mm/extable.c @@ -2,6 +2,7 @@ * linux/arch/alpha/mm/extable.c */ +#include #include #include diff --git a/arch/alpha/mm/fault.c b/arch/alpha/mm/fault.c index 622dabd84..64ace5a9c 100644 --- a/arch/alpha/mm/fault.c +++ b/arch/alpha/mm/fault.c @@ -4,6 +4,7 @@ * Copyright (C) 1995 Linus Torvalds */ +#include #include #include #include diff --git a/arch/alpha/mm/init.c b/arch/alpha/mm/init.c index f45b42f69..038f38e2b 100644 --- a/arch/alpha/mm/init.c +++ b/arch/alpha/mm/init.c @@ -6,6 +6,7 @@ /* 2.3.x zone allocator, 1999 Andrea Arcangeli */ +#include #include #include #include @@ -357,7 +358,7 @@ free_reserved_mem(void *start, void *end) void *__start = start; for (; __start < end; __start += PAGE_SIZE) { ClearPageReserved(virt_to_page(__start)); - init_page_count(virt_to_page(__start)); + set_page_count(virt_to_page(__start), 1); free_page((long)__start); totalram_pages++; } diff --git a/arch/alpha/mm/numa.c b/arch/alpha/mm/numa.c index b826f58c6..6d5251254 100644 --- a/arch/alpha/mm/numa.c +++ b/arch/alpha/mm/numa.c @@ -6,13 +6,13 @@ * Copyright (C) 2001 Andrea Arcangeli SuSE */ +#include #include #include #include #include #include #include -#include #include #include @@ -27,6 +27,9 @@ bootmem_data_t node_bdata[MAX_NUMNODES]; #define DBGDCONT(args...) #endif +#define PFN_UP(x) (((x) + PAGE_SIZE-1) >> PAGE_SHIFT) +#define PFN_DOWN(x) ((x) >> PAGE_SHIFT) +#define PFN_PHYS(x) ((x) << PAGE_SHIFT) #define for_each_mem_cluster(memdesc, cluster, i) \ for ((cluster) = (memdesc)->cluster, (i) = 0; \ (i) < (memdesc)->numclusters; (i)++, (cluster)++) diff --git a/arch/alpha/oprofile/common.c b/arch/alpha/oprofile/common.c index 9fc0eeb4f..ba788cfdc 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[4]; + char buf[3]; snprintf(buf, sizeof buf, "%d", i); dir = oprofilefs_mkdir(sb, root, buf); diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index 1ab0864f0..7f139d1bd 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig @@ -8,7 +8,6 @@ mainmenu "Linux Kernel Configuration" config ARM bool default y - select RTC_LIB help The ARM series is a line of low-power-consumption RISC chip designs licensed by ARM Ltd and targeted at embedded applications and @@ -47,18 +46,6 @@ 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 @@ -66,10 +53,6 @@ config RWSEM_GENERIC_SPINLOCK config RWSEM_XCHGADD_ALGORITHM bool -config GENERIC_HWEIGHT - bool - default y - config GENERIC_CALIBRATE_DELAY bool default y @@ -89,14 +72,6 @@ config FIQ config ARCH_MTD_XIP bool -config VECTORS_BASE - hex - default 0xffff0000 if MMU - default DRAM_BASE if REMAP_VECTORS_TO_RAM - default 0x00000000 - help - The base address of exception vectors. - source "init/Kconfig" menu "System Type" @@ -105,49 +80,15 @@ 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 "Cirrus Logic CLPS711x/EP721x-based" + bool "CLPS711x/EP721x-based" help Support for Cirrus Logic 711x/721x based boards. @@ -167,13 +108,6 @@ config ARCH_EBSA110 Ethernet interface, two PCMCIA sockets, two serial ports and a parallel port. -config ARCH_EP93XX - bool "EP93xx-based" - select ARM_AMBA - select ARM_VIC - help - This enables support for the Cirrus EP93xx series of CPUs. - config ARCH_FOOTBRIDGE bool "FootBridge" select FOOTBRIDGE @@ -181,50 +115,32 @@ config ARCH_FOOTBRIDGE Support for systems based on the DC21285 companion chip ("FootBridge"), such as the Simtec CATS and the Rebel NetWinder. -config ARCH_NETX - bool "Hilscher NetX based" - select ARM_VIC - help - 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" +config ARCH_INTEGRATOR + bool "Integrator" + select ARM_AMBA + select ICST525 help - Support for Motorola's i.MX family of processors (MX1, MXL). + Support for ARM's Integrator platform. 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 + select DMABOUNCE + select PCI 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. - config ARCH_L7200 bool "LinkUp-L7200" select FIQ @@ -238,14 +154,8 @@ 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. @@ -270,7 +180,7 @@ config ARCH_SA1100 Support for StrongARM 11x0 based boards. config ARCH_S3C2410 - bool "Samsung S3C2410, S3C2412, S3C2413, S3C2440, S3C2442" + bool "Samsung S3C2410" help Samsung S3C2410X CPU based systems, such as the Simtec Electronics BAST (), the IPAQ 1940 or @@ -298,12 +208,48 @@ 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" -source "arch/arm/mach-ep93xx/Kconfig" - source "arch/arm/mach-footbridge/Kconfig" source "arch/arm/mach-integrator/Kconfig" @@ -314,8 +260,6 @@ source "arch/arm/mach-ixp4xx/Kconfig" source "arch/arm/mach-ixp2000/Kconfig" -source "arch/arm/mach-ixp23xx/Kconfig" - source "arch/arm/mach-pxa/Kconfig" source "arch/arm/mach-sa1100/Kconfig" @@ -342,8 +286,6 @@ 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 @@ -356,10 +298,6 @@ 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" @@ -393,7 +331,7 @@ config ISA_DMA_API bool config PCI - bool "PCI support" if ARCH_INTEGRATOR_AP || ARCH_VERSATILE_PB || ARCH_IXP4XX + bool "PCI support" if ARCH_INTEGRATOR_AP || ARCH_VERSATILE_PB help Find out whether you have a PCI motherboard. PCI is the name of a bus system, i.e. the way the CPU talks to the other stuff inside @@ -496,13 +434,6 @@ config NO_IDLE_HZ Currently at least OMAP, PXA2xx and SA11x0 platforms are known to have accurate timekeeping with dynamic tick. -config HZ - int - default 128 if ARCH_L7200 - default 200 if ARCH_EBSA110 || ARCH_S3C2410 - default OMAP_32K_TIMER_HZ if ARCH_OMAP && OMAP_32K_TIMER - default 100 - config AEABI bool "Use the ARM EABI to compile the kernel" help @@ -544,12 +475,6 @@ config ARCH_DISCONTIGMEM_ENABLE or have huge holes in the physical address space for other reasons. See for more. -config NODES_SHIFT - int - default "4" if ARCH_LH7A40X - default "2" - depends on NEED_MULTIPLE_NODES - source "mm/Kconfig" config LEDS @@ -559,7 +484,7 @@ config LEDS ARCH_LUBBOCK || MACH_MAINSTONE || ARCH_NETWINDER || \ ARCH_OMAP || ARCH_P720T || ARCH_PXA_IDP || \ ARCH_SA1100 || ARCH_SHARK || ARCH_VERSATILE || \ - ARCH_AT91RM9200 || MACH_TRIZEPS4 + ARCH_AT91RM9200 help If you say Y here, the LEDs on your machine will be used to provide useful information about your current system status. @@ -690,7 +615,7 @@ config XIP_PHYS_ADDR endmenu -if (ARCH_SA1100 || ARCH_INTEGRATOR || ARCH_OMAP) +if (ARCH_SA1100 || ARCH_INTEGRATOR || ARCH_OMAP1) menu "CPU Frequency scaling" @@ -846,8 +771,7 @@ source "drivers/acorn/block/Kconfig" if PCMCIA || ARCH_CLPS7500 || ARCH_IOP3XX || ARCH_IXP4XX \ || ARCH_L7200 || ARCH_LH7A40X || ARCH_PXA || ARCH_RPC \ - || ARCH_S3C2410 || ARCH_SA1100 || ARCH_SHARK || FOOTBRIDGE \ - || ARCH_IXP23XX + || ARCH_S3C2410 || ARCH_SA1100 || ARCH_SHARK || FOOTBRIDGE source "drivers/ide/Kconfig" endif @@ -885,8 +809,6 @@ source "drivers/misc/Kconfig" source "drivers/mfd/Kconfig" -source "drivers/leds/Kconfig" - source "drivers/media/Kconfig" source "drivers/video/Kconfig" @@ -897,8 +819,6 @@ source "drivers/usb/Kconfig" source "drivers/mmc/Kconfig" -source "drivers/rtc/Kconfig" - endmenu source "fs/Kconfig" diff --git a/arch/arm/Kconfig.debug b/arch/arm/Kconfig.debug index d22f38b95..5d3acff8c 100644 --- a/arch/arm/Kconfig.debug +++ b/arch/arm/Kconfig.debug @@ -101,7 +101,7 @@ config DEBUG_S3C2410_UART help Choice for UART for kernel low-level using S3C2410 UARTS, should be between zero and two. The port must have been - initialised by the boot-loader before use. + initalised by the boot-loader before use. The uncompressor code port configuration is now handled by CONFIG_S3C2410_LOWLEVEL_UART_PORT. diff --git a/arch/arm/Makefile b/arch/arm/Makefile index 92873cdee..fbfc14a56 100644 --- a/arch/arm/Makefile +++ b/arch/arm/Makefile @@ -1,9 +1,6 @@ # # arch/arm/Makefile # -# This file is included by the global makefile so that you can add your own -# architecture-specific flags and dependencies. -# # 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. @@ -20,11 +17,6 @@ GZFLAGS :=-9 # Select a platform tht is kept up-to-date KBUILD_DEFCONFIG := versatile_defconfig -# defines filename extension depending memory manement type. -ifeq ($(CONFIG_MMU),) -MMUEXT := -nommu -endif - ifeq ($(CONFIG_FRAME_POINTER),y) CFLAGS +=-fno-omit-frame-pointer -mapcs -mno-sched-prolog endif @@ -47,8 +39,7 @@ 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=armv4t) -arch-$(CONFIG_CPU_32v4T) :=-D__LINUX_ARM_ARCH__=4 -march=armv4t +arch-$(CONFIG_CPU_32v5) :=-D__LINUX_ARM_ARCH__=5 $(call cc-option,-march=armv5te,-march=armv4) arch-$(CONFIG_CPU_32v4) :=-D__LINUX_ARM_ARCH__=4 -march=armv4 arch-$(CONFIG_CPU_32v3) :=-D__LINUX_ARM_ARCH__=3 -march=armv3 @@ -63,11 +54,10 @@ tune-$(CONFIG_CPU_ARM926T) :=-mtune=arm9tdmi tune-$(CONFIG_CPU_SA110) :=-mtune=strongarm110 tune-$(CONFIG_CPU_SA1100) :=-mtune=strongarm1100 tune-$(CONFIG_CPU_XSCALE) :=$(call cc-option,-mtune=xscale,-mtune=strongarm110) -Wa,-mcpu=xscale -tune-$(CONFIG_CPU_XSC3) :=$(call cc-option,-mtune=xscale,-mtune=strongarm110) -Wa,-mcpu=xscale tune-$(CONFIG_CPU_V6) :=$(call cc-option,-mtune=arm1136j-s,-mtune=strongarm) ifeq ($(CONFIG_AEABI),y) -CFLAGS_ABI :=-mabi=aapcs-linux -mno-thumb-interwork +CFLAGS_ABI :=-mabi=aapcs -mno-thumb-interwork else CFLAGS_ABI :=$(call cc-option,-mapcs-32,-mabi=apcs-gnu) $(call cc-option,-mno-thumb-interwork,) endif @@ -79,7 +69,7 @@ AFLAGS +=$(CFLAGS_ABI) $(arch-y) $(tune-y) -msoft-float CHECKFLAGS += -D__arm__ #Default value -head-y := arch/arm/kernel/head$(MMUEXT).o arch/arm/kernel/init_task.o +head-y := arch/arm/kernel/head.o arch/arm/kernel/init_task.o textofs-y := 0x00008000 machine-$(CONFIG_ARCH_RPC) := rpc @@ -104,7 +94,6 @@ endif machine-$(CONFIG_ARCH_IOP3XX) := iop3xx machine-$(CONFIG_ARCH_IXP4XX) := ixp4xx machine-$(CONFIG_ARCH_IXP2000) := ixp2000 - machine-$(CONFIG_ARCH_IXP23XX) := ixp23xx machine-$(CONFIG_ARCH_OMAP1) := omap1 machine-$(CONFIG_ARCH_OMAP2) := omap2 incdir-$(CONFIG_ARCH_OMAP) := omap @@ -115,10 +104,7 @@ endif machine-$(CONFIG_ARCH_H720X) := h720x machine-$(CONFIG_ARCH_AAEC2000) := aaec2000 machine-$(CONFIG_ARCH_REALVIEW) := realview - machine-$(CONFIG_ARCH_AT91) := at91rm9200 - machine-$(CONFIG_ARCH_EP93XX) := ep93xx - machine-$(CONFIG_ARCH_PNX4008) := pnx4008 - machine-$(CONFIG_ARCH_NETX) := netx + machine-$(CONFIG_ARCH_AT91RM9200) := at91rm9200 ifeq ($(CONFIG_ARCH_EBSA110),y) # This is what happens if you forget the IOCS16 line. @@ -141,7 +127,7 @@ else MACHINE := endif -export TEXT_OFFSET GZFLAGS MMUEXT +export TEXT_OFFSET GZFLAGS # Do we have FASTFPE? FASTFPE :=arch/arm/fastfpe @@ -178,7 +164,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/auto.conf +include/asm-arm/.arch: $(wildcard include/config/arch/*.h) include/config/MARKER @echo ' SYMLINK include/asm-arm/arch -> include/asm-arm/$(INCDIR)' ifneq ($(KBUILD_SRC),) $(Q)mkdir -p include/asm-arm @@ -190,7 +176,7 @@ endif archprepare: maketools -PHONY += maketools FORCE +.PHONY: maketools FORCE maketools: include/linux/version.h include/asm-arm/.arch FORCE $(Q)$(MAKE) $(build)=arch/arm/tools include/asm-arm/mach-types.h diff --git a/arch/arm/boot/Makefile b/arch/arm/boot/Makefile index ec9c400c7..a174d6339 100644 --- a/arch/arm/boot/Makefile +++ b/arch/arm/boot/Makefile @@ -1,9 +1,6 @@ # # arch/arm/boot/Makefile # -# This file is included by the global makefile so that you can add your own -# architecture-specific flags and dependencies. -# # 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. @@ -76,7 +73,7 @@ $(obj)/bootpImage: $(obj)/bootp/bootp FORCE $(call if_changed,objcopy) @echo ' Kernel: $@ is ready' -PHONY += initrd FORCE +.PHONY: initrd FORCE initrd: @test "$(INITRD_PHYS)" != "" || \ (echo This machine does not support INITRD; exit -1) diff --git a/arch/arm/boot/bootp/Makefile b/arch/arm/boot/bootp/Makefile index c394e3054..8e8879b6b 100644 --- a/arch/arm/boot/bootp/Makefile +++ b/arch/arm/boot/bootp/Makefile @@ -1,9 +1,6 @@ # # linux/arch/arm/boot/bootp/Makefile # -# This file is included by the global makefile so that you can add your own -# architecture-specific flags and dependencies. -# LDFLAGS_bootp :=-p --no-undefined -X \ --defsym initrd_phys=$(INITRD_PHYS) \ @@ -24,4 +21,4 @@ $(obj)/kernel.o: arch/arm/boot/zImage FORCE $(obj)/initrd.o: $(INITRD) FORCE -PHONY += $(INITRD) FORCE +.PHONY: $(INITRD) FORCE diff --git a/arch/arm/boot/compressed/Makefile b/arch/arm/boot/compressed/Makefile index 2adc1527e..35ffe0f4e 100644 --- a/arch/arm/boot/compressed/Makefile +++ b/arch/arm/boot/compressed/Makefile @@ -50,6 +50,10 @@ ifeq ($(CONFIG_ARCH_AT91RM9200),y) OBJS += head-at91rm9200.o endif +ifeq ($(CONFIG_DEBUG_ICEDCC),y) +OBJS += ice-dcc.o +endif + ifeq ($(CONFIG_CPU_BIG_ENDIAN),y) OBJS += big-endian.o endif diff --git a/arch/arm/boot/compressed/head-at91rm9200.S b/arch/arm/boot/compressed/head-at91rm9200.S index d68b9acd8..2119ea62b 100644 --- a/arch/arm/boot/compressed/head-at91rm9200.S +++ b/arch/arm/boot/compressed/head-at91rm9200.S @@ -49,24 +49,6 @@ 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 941c5f5cb..4a8a689d1 100644 --- a/arch/arm/boot/compressed/head-clps7500.S +++ b/arch/arm/boot/compressed/head-clps7500.S @@ -4,6 +4,7 @@ * 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 d0e3b2085..b08bd23f8 100644 --- a/arch/arm/boot/compressed/head-l7200.S +++ b/arch/arm/boot/compressed/head-l7200.S @@ -7,6 +7,7 @@ * 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 4c8c0e460..5aefffd46 100644 --- a/arch/arm/boot/compressed/head-sa1100.S +++ b/arch/arm/boot/compressed/head-sa1100.S @@ -7,6 +7,7 @@ * */ +#include #include #include diff --git a/arch/arm/boot/compressed/head-sharpsl.S b/arch/arm/boot/compressed/head-sharpsl.S index eb0084ea1..59ad69640 100644 --- a/arch/arm/boot/compressed/head-sharpsl.S +++ b/arch/arm/boot/compressed/head-sharpsl.S @@ -12,6 +12,7 @@ * */ +#include #include #include diff --git a/arch/arm/boot/compressed/head-xscale.S b/arch/arm/boot/compressed/head-xscale.S index 73c5d9e02..d3fe25339 100644 --- a/arch/arm/boot/compressed/head-xscale.S +++ b/arch/arm/boot/compressed/head-xscale.S @@ -5,6 +5,7 @@ * */ +#include #include #include diff --git a/arch/arm/boot/compressed/head.S b/arch/arm/boot/compressed/head.S index 14a9ff9c6..db3389d8e 100644 --- a/arch/arm/boot/compressed/head.S +++ b/arch/arm/boot/compressed/head.S @@ -2,12 +2,12 @@ * linux/arch/arm/boot/compressed/head.S * * Copyright (C) 1996-2002 Russell King - * Copyright (C) 2004 Hyok S. Choi (MPU 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. */ +#include #include /* @@ -320,62 +320,6 @@ params: ldr r0, =params_phys cache_on: mov r3, #8 @ cache_on function b call_cache_fn -/* - * Initialize the highest priority protection region, PR7 - * to cover all 32bit address and cacheable and bufferable. - */ -__armv4_mpu_cache_on: - mov r0, #0x3f @ 4G, the whole - mcr p15, 0, r0, c6, c7, 0 @ PR7 Area Setting - mcr p15, 0, r0, c6, c7, 1 - - mov r0, #0x80 @ PR7 - mcr p15, 0, r0, c2, c0, 0 @ D-cache on - mcr p15, 0, r0, c2, c0, 1 @ I-cache on - mcr p15, 0, r0, c3, c0, 0 @ write-buffer on - - mov r0, #0xc000 - mcr p15, 0, r0, c5, c0, 1 @ I-access permission - mcr p15, 0, r0, c5, c0, 0 @ D-access permission - - mov r0, #0 - mcr p15, 0, r0, c7, c10, 4 @ drain write buffer - mcr p15, 0, r0, c7, c5, 0 @ flush(inval) I-Cache - mcr p15, 0, r0, c7, c6, 0 @ flush(inval) D-Cache - mrc p15, 0, r0, c1, c0, 0 @ read control reg - @ ...I .... ..D. WC.M - orr r0, r0, #0x002d @ .... .... ..1. 11.1 - orr r0, r0, #0x1000 @ ...1 .... .... .... - - mcr p15, 0, r0, c1, c0, 0 @ write control reg - - mov r0, #0 - mcr p15, 0, r0, c7, c5, 0 @ flush(inval) I-Cache - mcr p15, 0, r0, c7, c6, 0 @ flush(inval) D-Cache - mov pc, lr - -__armv3_mpu_cache_on: - mov r0, #0x3f @ 4G, the whole - mcr p15, 0, r0, c6, c7, 0 @ PR7 Area Setting - - mov r0, #0x80 @ PR7 - mcr p15, 0, r0, c2, c0, 0 @ cache on - mcr p15, 0, r0, c3, c0, 0 @ write-buffer on - - mov r0, #0xc000 - mcr p15, 0, r0, c5, c0, 0 @ access permission - - mov r0, #0 - mcr p15, 0, r0, c7, c0, 0 @ invalidate whole cache v3 - mrc p15, 0, r0, c1, c0, 0 @ read control reg - @ .... .... .... WC.M - orr r0, r0, #0x000d @ .... .... .... 11.1 - mov r0, #0 - mcr p15, 0, r0, c1, c0, 0 @ write control reg - - mcr p15, 0, r0, c7, c0, 0 @ invalidate whole cache v3 - mov pc, lr - __setup_mmu: sub r3, r4, #16384 @ Page directory size bic r3, r3, #0xff @ Align the pointer bic r3, r3, #0x3f00 @@ -414,7 +358,7 @@ __setup_mmu: sub r3, r4, #16384 @ Page directory size str r1, [r0] mov pc, lr -__armv4_mmu_cache_on: +__armv4_cache_on: mov r12, lr bl __setup_mmu mov r0, #0 @@ -423,35 +367,32 @@ __armv4_mmu_cache_on: mrc p15, 0, r0, c1, c0, 0 @ read control reg orr r0, r0, #0x5000 @ I-cache enable, RR cache replacement orr r0, r0, #0x0030 - bl __common_mmu_cache_on + bl __common_cache_on mov r0, #0 mcr p15, 0, r0, c8, c7, 0 @ flush I,D TLBs mov pc, r12 -__arm6_mmu_cache_on: +__arm6_cache_on: mov r12, lr bl __setup_mmu mov r0, #0 mcr p15, 0, r0, c7, c0, 0 @ invalidate whole cache v3 mcr p15, 0, r0, c5, c0, 0 @ invalidate whole TLB v3 mov r0, #0x30 - bl __common_mmu_cache_on + bl __common_cache_on mov r0, #0 mcr p15, 0, r0, c5, c0, 0 @ invalidate whole TLB v3 mov pc, r12 -__common_mmu_cache_on: +__common_cache_on: #ifndef DEBUG orr r0, r0, #0x000d @ Write buffer, mmu #endif 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 - 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 + mcr p15, 0, r0, c1, c0, 0 @ load control register + mov pc, lr /* * All code following this line is relocatable. It is relocated by @@ -530,12 +471,12 @@ call_cache_fn: adr r12, proc_types proc_types: .word 0x41560600 @ ARM6/610 .word 0xffffffe0 - b __arm6_mmu_cache_off @ works, but slow - b __arm6_mmu_cache_off + b __arm6_cache_off @ works, but slow + b __arm6_cache_off mov pc, lr -@ b __arm6_mmu_cache_on @ untested -@ b __arm6_mmu_cache_off -@ b __armv3_mmu_cache_flush +@ b __arm6_cache_on @ untested +@ b __arm6_cache_off +@ b __armv3_cache_flush .word 0x00000000 @ old ARM ID .word 0x0000f000 @@ -545,28 +486,16 @@ proc_types: .word 0x41007000 @ ARM7/710 .word 0xfff8fe00 - b __arm7_mmu_cache_off - b __arm7_mmu_cache_off + b __arm7_cache_off + b __arm7_cache_off mov pc, lr .word 0x41807200 @ ARM720T (writethrough) .word 0xffffff00 - b __armv4_mmu_cache_on - b __armv4_mmu_cache_off + b __armv4_cache_on + b __armv4_cache_off mov pc, lr - .word 0x41007400 @ ARM74x - .word 0xff00ff00 - b __armv3_mpu_cache_on - b __armv3_mpu_cache_off - b __armv3_mpu_cache_flush - - .word 0x41009400 @ ARM94x - .word 0xff00ff00 - b __armv4_mpu_cache_on - b __armv4_mpu_cache_off - b __armv4_mpu_cache_flush - .word 0x00007000 @ ARM7 IDs .word 0x0000f000 mov pc, lr @@ -577,41 +506,41 @@ proc_types: .word 0x4401a100 @ sa110 / sa1100 .word 0xffffffe0 - b __armv4_mmu_cache_on - b __armv4_mmu_cache_off - b __armv4_mmu_cache_flush + b __armv4_cache_on + b __armv4_cache_off + b __armv4_cache_flush .word 0x6901b110 @ sa1110 .word 0xfffffff0 - b __armv4_mmu_cache_on - b __armv4_mmu_cache_off - b __armv4_mmu_cache_flush + b __armv4_cache_on + b __armv4_cache_off + b __armv4_cache_flush @ These match on the architecture ID .word 0x00020000 @ ARMv4T .word 0x000f0000 - b __armv4_mmu_cache_on - b __armv4_mmu_cache_off - b __armv4_mmu_cache_flush + b __armv4_cache_on + b __armv4_cache_off + b __armv4_cache_flush .word 0x00050000 @ ARMv5TE .word 0x000f0000 - b __armv4_mmu_cache_on - b __armv4_mmu_cache_off - b __armv4_mmu_cache_flush + b __armv4_cache_on + b __armv4_cache_off + b __armv4_cache_flush .word 0x00060000 @ ARMv5TEJ .word 0x000f0000 - b __armv4_mmu_cache_on - b __armv4_mmu_cache_off - b __armv4_mmu_cache_flush + b __armv4_cache_on + b __armv4_cache_off + b __armv4_cache_flush - .word 0x0007b000 @ ARMv6 - .word 0x0007f000 - b __armv4_mmu_cache_on - b __armv4_mmu_cache_off - b __armv6_mmu_cache_flush + .word 0x00070000 @ ARMv6 + .word 0x000f0000 + b __armv4_cache_on + b __armv4_cache_off + b __armv6_cache_flush .word 0 @ unrecognised type .word 0 @@ -633,25 +562,7 @@ proc_types: cache_off: mov r3, #12 @ cache_off function b call_cache_fn -__armv4_mpu_cache_off: - mrc p15, 0, r0, c1, c0 - bic r0, r0, #0x000d - mcr p15, 0, r0, c1, c0 @ turn MPU and cache off - mov r0, #0 - mcr p15, 0, r0, c7, c10, 4 @ drain write buffer - mcr p15, 0, r0, c7, c6, 0 @ flush D-Cache - mcr p15, 0, r0, c7, c5, 0 @ flush I-Cache - mov pc, lr - -__armv3_mpu_cache_off: - mrc p15, 0, r0, c1, c0 - bic r0, r0, #0x000d - mcr p15, 0, r0, c1, c0, 0 @ turn MPU and cache off - mov r0, #0 - mcr p15, 0, r0, c7, c0, 0 @ invalidate whole cache v3 - mov pc, lr - -__armv4_mmu_cache_off: +__armv4_cache_off: mrc p15, 0, r0, c1, c0 bic r0, r0, #0x000d mcr p15, 0, r0, c1, c0 @ turn MMU and cache off @@ -660,15 +571,15 @@ __armv4_mmu_cache_off: mcr p15, 0, r0, c8, c7 @ invalidate whole TLB v4 mov pc, lr -__arm6_mmu_cache_off: +__arm6_cache_off: mov r0, #0x00000030 @ ARM6 control reg. - b __armv3_mmu_cache_off + b __armv3_cache_off -__arm7_mmu_cache_off: +__arm7_cache_off: mov r0, #0x00000070 @ ARM7 control reg. - b __armv3_mmu_cache_off + b __armv3_cache_off -__armv3_mmu_cache_off: +__armv3_cache_off: mcr p15, 0, r0, c1, c0, 0 @ turn MMU and cache off mov r0, #0 mcr p15, 0, r0, c7, c0, 0 @ invalidate whole cache v3 @@ -690,25 +601,7 @@ cache_clean_flush: mov r3, #16 b call_cache_fn -__armv4_mpu_cache_flush: - mov r2, #1 - mov r3, #0 - mcr p15, 0, ip, c7, c6, 0 @ invalidate D cache - mov r1, #7 << 5 @ 8 segments -1: orr r3, r1, #63 << 26 @ 64 entries -2: mcr p15, 0, r3, c7, c14, 2 @ clean & invalidate D index - subs r3, r3, #1 << 26 - bcs 2b @ entries 63 to 0 - subs r1, r1, #1 << 5 - bcs 1b @ segments 7 to 0 - - teq r2, #0 - mcrne p15, 0, ip, c7, c5, 0 @ invalidate I cache - mcr p15, 0, ip, c7, c10, 4 @ drain WB - mov pc, lr - - -__armv6_mmu_cache_flush: +__armv6_cache_flush: mov r1, #0 mcr p15, 0, r1, c7, c14, 0 @ clean+invalidate D mcr p15, 0, r1, c7, c5, 0 @ invalidate I+BTB @@ -716,7 +609,7 @@ __armv6_mmu_cache_flush: mcr p15, 0, r1, c7, c10, 4 @ drain WB mov pc, lr -__armv4_mmu_cache_flush: +__armv4_cache_flush: mov r2, #64*1024 @ default: 32K dcache size (*2) mov r11, #32 @ default: 32 byte line size mrc p15, 0, r3, c0, c0, 1 @ read cache type @@ -744,8 +637,7 @@ no_cache_id: mcr p15, 0, r1, c7, c10, 4 @ drain WB mov pc, lr -__armv3_mmu_cache_flush: -__armv3_mpu_cache_flush: +__armv3_cache_flush: mov r1, #0 mcr p15, 0, r0, c7, c0, 0 @ invalidate whole cache v3 mov pc, lr diff --git a/arch/arm/boot/compressed/ll_char_wr.S b/arch/arm/boot/compressed/ll_char_wr.S index 8517c8606..d7bbd9da2 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 - ldmfd sp!, {r4 - r7, pc} + LOADREGS(fd, 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 - ldmfd sp!, {r4 - r7, pc} + LOADREGS(fd, 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 - ldmfd sp!, {r4 - r7, pc} + LOADREGS(fd, sp!, {r4 - r7, pc}) .bss ENTRY(con_charconvtable) diff --git a/arch/arm/boot/compressed/misc.c b/arch/arm/boot/compressed/misc.c index ace3fb583..5ab94584b 100644 --- a/arch/arm/boot/compressed/misc.c +++ b/arch/arm/boot/compressed/misc.c @@ -20,45 +20,24 @@ unsigned int __machine_arch_type; #include +#include + #ifdef STANDALONE_DEBUG #define putstr printf -#else - -static void putstr(const char *ptr); - -#include -#include +#endif #ifdef CONFIG_DEBUG_ICEDCC -static void icedcc_putc(int ch) -{ - int status, i = 0x4000000; +#define putstr icedcc_putstr +#define putc icedcc_putc - do { - if (--i < 0) - return; +extern void icedcc_putc(int ch); - asm volatile ("mrc p14, 0, %0, c0, c0, 0" : "=r" (status)); - } while (status & 2); - - asm("mcr p14, 0, %0, c1, c0, 0" : : "r" (ch)); -} - -#define putc(ch) icedcc_putc(ch) -#define flush() do { } while (0) -#endif - -static void putstr(const char *ptr) +static void +icedcc_putstr(const char *ptr) { - char c; - - while ((c = *ptr++) != '\0') { - if (c == '\n') - putc('\r'); - putc(c); + for (; *ptr != '\0'; ptr++) { + icedcc_putc(*ptr); } - - flush(); } #endif diff --git a/arch/arm/boot/compressed/vmlinux.lds.in b/arch/arm/boot/compressed/vmlinux.lds.in index 153a07e72..eed616113 100644 --- a/arch/arm/boot/compressed/vmlinux.lds.in +++ b/arch/arm/boot/compressed/vmlinux.lds.in @@ -18,7 +18,6 @@ SECTIONS _start = .; *(.start) *(.text) - *(.text.*) *(.fixup) *(.gnu.warning) *(.rodata) diff --git a/arch/arm/common/Makefile b/arch/arm/common/Makefile index e1289a256..c81a2ff6b 100644 --- a/arch/arm/common/Makefile +++ b/arch/arm/common/Makefile @@ -15,5 +15,3 @@ obj-$(CONFIG_SHARP_LOCOMO) += locomo.o 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 028bdc922..ad6c89a55 100644 --- a/arch/arm/common/dmabounce.c +++ b/arch/arm/common/dmabounce.c @@ -5,7 +5,7 @@ * limited DMA windows. These functions utilize bounce buffers to * copy data to/from buffers located outside the DMA region. This * only works for systems in which DMA memory is at the bottom of - * RAM, the remainder of memory is at the top and the DMA memory + * RAM and the remainder of memory is at the top an the DMA memory * can be marked as ZONE_DMA. Anything beyond that such as discontigous * DMA windows will require custom implementations that reserve memory * areas at early bootup. @@ -77,8 +77,6 @@ struct dmabounce_device_info { #endif struct dmabounce_pool small; struct dmabounce_pool large; - - rwlock_t lock; }; static LIST_HEAD(dmabounce_devs); @@ -118,7 +116,6 @@ 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); @@ -166,12 +163,8 @@ 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; } @@ -179,34 +172,22 @@ 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, *rb = NULL; - unsigned long flags; - - read_lock_irqsave(&device_info->lock, flags); + struct safe_buffer *b; list_for_each_entry(b, &device_info->safe_buffers, node) - if (b->safe_dma_addr == safe_dma_addr) { - rb = b; - break; - } + if (b->safe_dma_addr == safe_dma_addr) + return b; - read_unlock_irqrestore(&device_info->lock, flags); - return rb; + return NULL; } 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 @@ -415,6 +396,7 @@ 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", @@ -422,8 +404,12 @@ 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; } @@ -438,18 +424,25 @@ 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", @@ -457,6 +450,8 @@ 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; @@ -467,6 +462,8 @@ dma_map_sg(struct device *dev, struct scatterlist *sg, int nents, map_single(dev, ptr, length, dir); } + local_irq_restore(flags); + return nents; } @@ -474,6 +471,7 @@ 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", @@ -481,38 +479,55 @@ 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", @@ -520,18 +535,23 @@ 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", @@ -539,12 +559,16 @@ 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 @@ -598,7 +622,6 @@ 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 f3e020f22..c02dc8116 100644 --- a/arch/arm/common/gic.c +++ b/arch/arm/common/gic.c @@ -33,7 +33,6 @@ 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 @@ -53,55 +52,41 @@ static DEFINE_SPINLOCK(irq_controller_lock); 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(unsigned int irq, cpumask_t mask_val) +static void gic_set_cpu(struct irqdesc *desc, unsigned int irq, unsigned int cpu) { 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 irq_chip gic_chip = { - .name = "GIC", +static struct irqchip gic_chip = { .ack = gic_ack_irq, .mask = gic_mask_irq, .unmask = gic_unmask_irq, #ifdef CONFIG_SMP - .set_affinity = gic_set_cpu, + .set_cpu = gic_set_cpu, #endif }; diff --git a/arch/arm/common/locomo.c b/arch/arm/common/locomo.c index 4e0dcaef6..d31b1cb7e 100644 --- a/arch/arm/common/locomo.c +++ b/arch/arm/common/locomo.c @@ -15,6 +15,7 @@ * Based on sa1111.c */ +#include #include #include #include @@ -59,7 +60,7 @@ struct locomo { unsigned long phys; unsigned int irq; spinlock_t lock; - void __iomem *base; + void *base; }; struct locomo_dev_info { @@ -161,7 +162,7 @@ static void locomo_handler(unsigned int irq, struct irqdesc *desc, { int req, i; struct irqdesc *d; - void __iomem *mapbase = get_irq_chipdata(irq); + void *mapbase = get_irq_chipdata(irq); /* Acknowledge the parent IRQ */ desc->chip->ack(irq); @@ -188,7 +189,7 @@ static void locomo_ack_irq(unsigned int irq) static void locomo_mask_irq(unsigned int irq) { - void __iomem *mapbase = get_irq_chipdata(irq); + void *mapbase = get_irq_chipdata(irq); unsigned int r; r = locomo_readl(mapbase + LOCOMO_ICR); r &= ~(0x0010 << (irq - LOCOMO_IRQ_START)); @@ -197,15 +198,14 @@ static void locomo_mask_irq(unsigned int irq) static void locomo_unmask_irq(unsigned int irq) { - void __iomem *mapbase = get_irq_chipdata(irq); + void *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 irq_chip locomo_chip = { - .name = "LOCOMO", +static struct irqchip locomo_chip = { .ack = locomo_ack_irq, .mask = locomo_mask_irq, .unmask = locomo_unmask_irq, @@ -215,7 +215,7 @@ static void locomo_key_handler(unsigned int irq, struct irqdesc *desc, struct pt_regs *regs) { struct irqdesc *d; - void __iomem *mapbase = get_irq_chipdata(irq); + void *mapbase = get_irq_chipdata(irq); if (locomo_readl(mapbase + LOCOMO_KEYBOARD + LOCOMO_KIC) & 0x0001) { d = irq_desc + LOCOMO_IRQ_KEY_START; @@ -225,7 +225,7 @@ static void locomo_key_handler(unsigned int irq, struct irqdesc *desc, static void locomo_key_ack_irq(unsigned int irq) { - void __iomem *mapbase = get_irq_chipdata(irq); + void *mapbase = get_irq_chipdata(irq); unsigned int r; r = locomo_readl(mapbase + LOCOMO_KEYBOARD + LOCOMO_KIC); r &= ~(0x0100 << (irq - LOCOMO_IRQ_KEY_START)); @@ -234,7 +234,7 @@ static void locomo_key_ack_irq(unsigned int irq) static void locomo_key_mask_irq(unsigned int irq) { - void __iomem *mapbase = get_irq_chipdata(irq); + void *mapbase = get_irq_chipdata(irq); unsigned int r; r = locomo_readl(mapbase + LOCOMO_KEYBOARD + LOCOMO_KIC); r &= ~(0x0010 << (irq - LOCOMO_IRQ_KEY_START)); @@ -243,15 +243,14 @@ static void locomo_key_mask_irq(unsigned int irq) static void locomo_key_unmask_irq(unsigned int irq) { - void __iomem *mapbase = get_irq_chipdata(irq); + void *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 irq_chip locomo_key_chip = { - .name = "LOCOMO-key", +static struct irqchip locomo_key_chip = { .ack = locomo_key_ack_irq, .mask = locomo_key_mask_irq, .unmask = locomo_key_unmask_irq, @@ -262,7 +261,7 @@ static void locomo_gpio_handler(unsigned int irq, struct irqdesc *desc, { int req, i; struct irqdesc *d; - void __iomem *mapbase = get_irq_chipdata(irq); + void *mapbase = get_irq_chipdata(irq); req = locomo_readl(mapbase + LOCOMO_GIR) & locomo_readl(mapbase + LOCOMO_GPD) & @@ -281,7 +280,7 @@ static void locomo_gpio_handler(unsigned int irq, struct irqdesc *desc, static void locomo_gpio_ack_irq(unsigned int irq) { - void __iomem *mapbase = get_irq_chipdata(irq); + void *mapbase = get_irq_chipdata(irq); unsigned int r; r = locomo_readl(mapbase + LOCOMO_GWE); r |= (0x0001 << (irq - LOCOMO_IRQ_GPIO_START)); @@ -298,7 +297,7 @@ static void locomo_gpio_ack_irq(unsigned int irq) static void locomo_gpio_mask_irq(unsigned int irq) { - void __iomem *mapbase = get_irq_chipdata(irq); + void *mapbase = get_irq_chipdata(irq); unsigned int r; r = locomo_readl(mapbase + LOCOMO_GIE); r &= ~(0x0001 << (irq - LOCOMO_IRQ_GPIO_START)); @@ -307,15 +306,14 @@ static void locomo_gpio_mask_irq(unsigned int irq) static void locomo_gpio_unmask_irq(unsigned int irq) { - void __iomem *mapbase = get_irq_chipdata(irq); + void *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 irq_chip locomo_gpio_chip = { - .name = "LOCOMO-gpio", +static struct irqchip locomo_gpio_chip = { .ack = locomo_gpio_ack_irq, .mask = locomo_gpio_mask_irq, .unmask = locomo_gpio_unmask_irq, @@ -325,7 +323,7 @@ static void locomo_lt_handler(unsigned int irq, struct irqdesc *desc, struct pt_regs *regs) { struct irqdesc *d; - void __iomem *mapbase = get_irq_chipdata(irq); + void *mapbase = get_irq_chipdata(irq); if (locomo_readl(mapbase + LOCOMO_LTINT) & 0x0001) { d = irq_desc + LOCOMO_IRQ_LT_START; @@ -335,7 +333,7 @@ static void locomo_lt_handler(unsigned int irq, struct irqdesc *desc, static void locomo_lt_ack_irq(unsigned int irq) { - void __iomem *mapbase = get_irq_chipdata(irq); + void *mapbase = get_irq_chipdata(irq); unsigned int r; r = locomo_readl(mapbase + LOCOMO_LTINT); r &= ~(0x0100 << (irq - LOCOMO_IRQ_LT_START)); @@ -344,7 +342,7 @@ static void locomo_lt_ack_irq(unsigned int irq) static void locomo_lt_mask_irq(unsigned int irq) { - void __iomem *mapbase = get_irq_chipdata(irq); + void *mapbase = get_irq_chipdata(irq); unsigned int r; r = locomo_readl(mapbase + LOCOMO_LTINT); r &= ~(0x0010 << (irq - LOCOMO_IRQ_LT_START)); @@ -353,15 +351,14 @@ static void locomo_lt_mask_irq(unsigned int irq) static void locomo_lt_unmask_irq(unsigned int irq) { - void __iomem *mapbase = get_irq_chipdata(irq); + void *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 irq_chip locomo_lt_chip = { - .name = "LOCOMO-lt", +static struct irqchip locomo_lt_chip = { .ack = locomo_lt_ack_irq, .mask = locomo_lt_mask_irq, .unmask = locomo_lt_unmask_irq, @@ -372,7 +369,7 @@ static void locomo_spi_handler(unsigned int irq, struct irqdesc *desc, { int req, i; struct irqdesc *d; - void __iomem *mapbase = get_irq_chipdata(irq); + void *mapbase = get_irq_chipdata(irq); req = locomo_readl(mapbase + LOCOMO_SPIIR) & 0x000F; if (req) { @@ -389,7 +386,7 @@ static void locomo_spi_handler(unsigned int irq, struct irqdesc *desc, static void locomo_spi_ack_irq(unsigned int irq) { - void __iomem *mapbase = get_irq_chipdata(irq); + void *mapbase = get_irq_chipdata(irq); unsigned int r; r = locomo_readl(mapbase + LOCOMO_SPIWE); r |= (0x0001 << (irq - LOCOMO_IRQ_SPI_START)); @@ -406,7 +403,7 @@ static void locomo_spi_ack_irq(unsigned int irq) static void locomo_spi_mask_irq(unsigned int irq) { - void __iomem *mapbase = get_irq_chipdata(irq); + void *mapbase = get_irq_chipdata(irq); unsigned int r; r = locomo_readl(mapbase + LOCOMO_SPIIE); r &= ~(0x0001 << (irq - LOCOMO_IRQ_SPI_START)); @@ -415,15 +412,14 @@ static void locomo_spi_mask_irq(unsigned int irq) static void locomo_spi_unmask_irq(unsigned int irq) { - void __iomem *mapbase = get_irq_chipdata(irq); + void *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 irq_chip locomo_spi_chip = { - .name = "LOCOMO-spi", +static struct irqchip locomo_spi_chip = { .ack = locomo_spi_ack_irq, .mask = locomo_spi_mask_irq, .unmask = locomo_spi_unmask_irq, @@ -432,7 +428,7 @@ static struct irq_chip locomo_spi_chip = { static void locomo_setup_irq(struct locomo *lchip) { int irq; - void __iomem *irqbase = lchip->base; + void *irqbase = lchip->base; /* * Install handler for IRQ_LOCOMO_HW. @@ -505,13 +501,14 @@ locomo_init_one_child(struct locomo *lchip, struct locomo_dev_info *info) struct locomo_dev *dev; int ret; - dev = kzalloc(sizeof(struct locomo_dev), GFP_KERNEL); + dev = kmalloc(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. @@ -633,6 +630,21 @@ static int locomo_resume(struct platform_device *dev) #endif +#define LCM_ALC_EN 0x8000 + +void frontlight_set(struct locomo *lchip, int duty, int vr, int bpwf) +{ + unsigned long flags; + + 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 | LCM_ALC_EN, lchip->base + LOCOMO_FRONTLIGHT + LOCOMO_ALS); + spin_unlock_irqrestore(&lchip->lock, flags); +} + + /** * locomo_probe - probe for a single LoCoMo chip. * @phys_addr: physical address of device. @@ -652,10 +664,12 @@ __locomo_probe(struct device *me, struct resource *mem, int irq) unsigned long r; int i, ret = -ENODEV; - lchip = kzalloc(sizeof(struct locomo), GFP_KERNEL); + lchip = kmalloc(sizeof(struct locomo), GFP_KERNEL); if (!lchip) return -ENOMEM; + memset(lchip, 0, sizeof(struct locomo)); + spin_lock_init(&lchip->lock); lchip->dev = me; @@ -687,10 +701,14 @@ __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); + /* Same constants can be used for collie and poodle + (depending on CONFIG options in original sharp code)? */ + frontlight_set(lchip, 163, 0, 148); + /* Longtime timer */ locomo_writel(0, lchip->base + LOCOMO_LTINT); /* SPI */ @@ -734,6 +752,7 @@ __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: @@ -769,8 +788,6 @@ static int locomo_probe(struct platform_device *dev) if (!mem) return -EINVAL; irq = platform_get_irq(dev, 0); - if (irq < 0) - return -ENXIO; return __locomo_probe(&dev->dev, mem, irq); } @@ -1046,30 +1063,6 @@ 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." * diff --git a/arch/arm/common/rtctime.c b/arch/arm/common/rtctime.c index 4e5445cfb..e851d86c2 100644 --- a/arch/arm/common/rtctime.c +++ b/arch/arm/common/rtctime.c @@ -20,7 +20,6 @@ #include #include #include -#include #include #include @@ -43,6 +42,89 @@ static struct rtc_ops *rtc_ops; #define rtc_epoch 1900UL +static const unsigned char days_in_month[] = { + 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 +}; + +#define LEAPS_THRU_END_OF(y) ((y)/4 - (y)/100 + (y)/400) +#define LEAP_YEAR(year) ((!(year % 4) && (year % 100)) || !(year % 400)) + +static int month_days(unsigned int month, unsigned int year) +{ + return days_in_month[month] + (LEAP_YEAR(year) && month == 1); +} + +/* + * Convert seconds since 01-01-1970 00:00:00 to Gregorian date. + */ +void rtc_time_to_tm(unsigned long time, struct rtc_time *tm) +{ + int days, month, year; + + days = time / 86400; + time -= days * 86400; + + tm->tm_wday = (days + 4) % 7; + + year = 1970 + days / 365; + days -= (year - 1970) * 365 + + LEAPS_THRU_END_OF(year - 1) + - LEAPS_THRU_END_OF(1970 - 1); + if (days < 0) { + year -= 1; + days += 365 + LEAP_YEAR(year); + } + tm->tm_year = year - 1900; + tm->tm_yday = days + 1; + + for (month = 0; month < 11; month++) { + int newdays; + + newdays = days - month_days(month, year); + if (newdays < 0) + break; + days = newdays; + } + tm->tm_mon = month; + tm->tm_mday = days + 1; + + tm->tm_hour = time / 3600; + time -= tm->tm_hour * 3600; + tm->tm_min = time / 60; + tm->tm_sec = time - tm->tm_min * 60; +} +EXPORT_SYMBOL(rtc_time_to_tm); + +/* + * Does the rtc_time represent a valid date/time? + */ +int rtc_valid_tm(struct rtc_time *tm) +{ + if (tm->tm_year < 70 || + tm->tm_mon >= 12 || + tm->tm_mday < 1 || + tm->tm_mday > month_days(tm->tm_mon, tm->tm_year + 1900) || + tm->tm_hour >= 24 || + tm->tm_min >= 60 || + tm->tm_sec >= 60) + return -EINVAL; + + return 0; +} +EXPORT_SYMBOL(rtc_valid_tm); + +/* + * Convert Gregorian date to seconds since 01-01-1970 00:00:00. + */ +int rtc_tm_to_time(struct rtc_time *tm, unsigned long *time) +{ + *time = mktime(tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, + tm->tm_hour, tm->tm_min, tm->tm_sec); + + return 0; +} +EXPORT_SYMBOL(rtc_tm_to_time); + /* * Calculate the next alarm time given the requested alarm time mask * and the current time. @@ -68,15 +150,14 @@ 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) +static inline int rtc_read_time(struct rtc_ops *ops, struct rtc_time *tm) { memset(tm, 0, sizeof(struct rtc_time)); return ops->read_time(tm); } -static inline int rtc_arm_set_time(struct rtc_ops *ops, struct rtc_time *tm) +static inline int rtc_set_time(struct rtc_ops *ops, struct rtc_time *tm) { int ret; @@ -87,7 +168,7 @@ static inline int rtc_arm_set_time(struct rtc_ops *ops, struct rtc_time *tm) return ret; } -static inline int rtc_arm_read_alarm(struct rtc_ops *ops, struct rtc_wkalrm *alrm) +static inline int rtc_read_alarm(struct rtc_ops *ops, struct rtc_wkalrm *alrm) { int ret = -EINVAL; if (ops->read_alarm) { @@ -97,7 +178,7 @@ static inline int rtc_arm_read_alarm(struct rtc_ops *ops, struct rtc_wkalrm *alr return ret; } -static inline int rtc_arm_set_alarm(struct rtc_ops *ops, struct rtc_wkalrm *alrm) +static inline int rtc_set_alarm(struct rtc_ops *ops, struct rtc_wkalrm *alrm) { int ret = -EINVAL; if (ops->set_alarm) @@ -185,7 +266,7 @@ static int rtc_ioctl(struct inode *inode, struct file *file, unsigned int cmd, switch (cmd) { case RTC_ALM_READ: - ret = rtc_arm_read_alarm(ops, &alrm); + ret = rtc_read_alarm(ops, &alrm); if (ret) break; ret = copy_to_user(uarg, &alrm.time, sizeof(tm)); @@ -207,11 +288,11 @@ static int rtc_ioctl(struct inode *inode, struct file *file, unsigned int cmd, alrm.time.tm_wday = -1; alrm.time.tm_yday = -1; alrm.time.tm_isdst = -1; - ret = rtc_arm_set_alarm(ops, &alrm); + ret = rtc_set_alarm(ops, &alrm); break; case RTC_RD_TIME: - ret = rtc_arm_read_time(ops, &tm); + ret = rtc_read_time(ops, &tm); if (ret) break; ret = copy_to_user(uarg, &tm, sizeof(tm)); @@ -229,7 +310,7 @@ static int rtc_ioctl(struct inode *inode, struct file *file, unsigned int cmd, ret = -EFAULT; break; } - ret = rtc_arm_set_time(ops, &tm); + ret = rtc_set_time(ops, &tm); break; case RTC_EPOCH_SET: @@ -260,11 +341,11 @@ static int rtc_ioctl(struct inode *inode, struct file *file, unsigned int cmd, ret = -EFAULT; break; } - ret = rtc_arm_set_alarm(ops, &alrm); + ret = rtc_set_alarm(ops, &alrm); break; case RTC_WKALM_RD: - ret = rtc_arm_read_alarm(ops, &alrm); + ret = rtc_read_alarm(ops, &alrm); if (ret) break; ret = copy_to_user(uarg, &alrm, sizeof(alrm)); @@ -354,7 +435,7 @@ static int rtc_read_proc(char *page, char **start, off_t off, int count, int *eo struct rtc_time tm; char *p = page; - if (rtc_arm_read_time(ops, &tm) == 0) { + if (rtc_read_time(ops, &tm) == 0) { p += sprintf(p, "rtc_time\t: %02d:%02d:%02d\n" "rtc_date\t: %04d-%02d-%02d\n" @@ -364,7 +445,7 @@ static int rtc_read_proc(char *page, char **start, off_t off, int count, int *eo rtc_epoch); } - if (rtc_arm_read_alarm(ops, &alrm) == 0) { + if (rtc_read_alarm(ops, &alrm) == 0) { p += sprintf(p, "alrm_time\t: "); if ((unsigned int)alrm.time.tm_hour <= 24) p += sprintf(p, "%02d:", alrm.time.tm_hour); diff --git a/arch/arm/common/sa1111.c b/arch/arm/common/sa1111.c index 29818bd32..1475089f9 100644 --- a/arch/arm/common/sa1111.c +++ b/arch/arm/common/sa1111.c @@ -14,6 +14,7 @@ * All initialization functions provided here are intended to be called * from machine specific code with proper arguments when required. */ +#include #include #include #include @@ -25,7 +26,6 @@ #include #include #include -#include #include #include @@ -36,6 +36,10 @@ #include +#ifdef CONFIG_ARCH_PXA +#include +#endif + extern void __init sa1110_mb_enable(void); /* @@ -47,7 +51,6 @@ extern void __init sa1110_mb_enable(void); */ struct sa1111 { struct device *dev; - struct clk *clk; unsigned long phys; int irq; spinlock_t lock; @@ -150,7 +153,7 @@ static void sa1111_irq_handler(unsigned int irq, struct irqdesc *desc, struct pt_regs *regs) { unsigned int stat0, stat1, i; - void __iomem *base = get_irq_data(irq); + void __iomem *base = desc->data; stat0 = sa1111_readl(base + SA1111_INTSTATCLR0); stat1 = sa1111_readl(base + SA1111_INTSTATCLR1); @@ -168,11 +171,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) - handle_edge_irq(i, irq_desc + i, regs); + do_edge_IRQ(i, irq_desc + i, regs); for (i = IRQ_SA1111_START + 32; stat1; i++, stat1 >>= 1) if (stat1 & 1) - handle_edge_irq(i, irq_desc + i, regs); + do_edge_IRQ(i, irq_desc + i, regs); /* For level-based interrupts */ desc->chip->unmask(irq); @@ -272,8 +275,7 @@ static int sa1111_wake_lowirq(unsigned int irq, unsigned int on) return 0; } -static struct irq_chip sa1111_low_chip = { - .name = "SA1111-l", +static struct irqchip sa1111_low_chip = { .ack = sa1111_ack_irq, .mask = sa1111_mask_lowirq, .unmask = sa1111_unmask_lowirq, @@ -369,8 +371,7 @@ static int sa1111_wake_highirq(unsigned int irq, unsigned int on) return 0; } -static struct irq_chip sa1111_high_chip = { - .name = "SA1111-h", +static struct irqchip sa1111_high_chip = { .ack = sa1111_ack_irq, .mask = sa1111_mask_highirq, .unmask = sa1111_unmask_highirq, @@ -450,7 +451,19 @@ static void sa1111_wake(struct sa1111 *sachip) spin_lock_irqsave(&sachip->lock, flags); - clk_enable(sachip->clk); +#ifdef CONFIG_ARCH_SA1100 + /* + * First, set up the 3.6864MHz clock on GPIO 27 for the SA-1111: + * (SA-1110 Developer's Manual, section 9.1.2.1) + */ + GAFR |= GPIO_32_768kHz; + GPDR |= GPIO_32_768kHz; + TUCR = TUCR_3_6864MHz; +#elif CONFIG_ARCH_PXA + pxa_gpio_mode(GPIO11_3_6MHz_MD); +#else +#error missing clock setup +#endif /* * Turn VCO on, and disable PLL Bypass. @@ -542,11 +555,12 @@ sa1111_init_one_child(struct sa1111 *sachip, struct resource *parent, struct sa1111_dev *dev; int ret; - dev = kzalloc(sizeof(struct sa1111_dev), GFP_KERNEL); + dev = kmalloc(sizeof(struct sa1111_dev), GFP_KERNEL); if (!dev) { ret = -ENOMEM; goto out; } + memset(dev, 0, sizeof(struct sa1111_dev)); snprintf(dev->dev.bus_id, sizeof(dev->dev.bus_id), "%4.4lx", info->offset); @@ -618,18 +632,14 @@ __sa1111_probe(struct device *me, struct resource *mem, int irq) { struct sa1111 *sachip; unsigned long id; - unsigned int has_devs; + unsigned int has_devs, val; int i, ret = -ENODEV; - sachip = kzalloc(sizeof(struct sa1111), GFP_KERNEL); + sachip = kmalloc(sizeof(struct sa1111), GFP_KERNEL); if (!sachip) return -ENOMEM; - sachip->clk = clk_get(me, "GPIO27_CLK"); - if (!sachip->clk) { - ret = PTR_ERR(sachip->clk); - goto err_free; - } + memset(sachip, 0, sizeof(struct sa1111)); spin_lock_init(&sachip->lock); @@ -646,7 +656,7 @@ __sa1111_probe(struct device *me, struct resource *mem, int irq) sachip->base = ioremap(mem->start, PAGE_SIZE * 2); if (!sachip->base) { ret = -ENOMEM; - goto err_clkput; + goto out; } /* @@ -656,7 +666,7 @@ __sa1111_probe(struct device *me, struct resource *mem, int irq) if ((id & SKID_ID_MASK) != SKID_SA1111_ID) { printk(KERN_DEBUG "SA1111 not detected: ID = %08lx\n", id); ret = -ENODEV; - goto err_unmap; + goto unmap; } printk(KERN_INFO "SA1111 Microprocessor Companion Chip: " @@ -669,9 +679,6 @@ __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 @@ -695,7 +702,6 @@ __sa1111_probe(struct device *me, struct resource *mem, int irq) * Enable the SA1110 memory bus request and grant signals. */ sa1110_mb_enable(); - } #endif /* @@ -720,11 +726,9 @@ __sa1111_probe(struct device *me, struct resource *mem, int irq) return 0; - err_unmap: + unmap: iounmap(sachip->base); - err_clkput: - clk_put(sachip->clk); - err_free: + out: kfree(sachip); return ret; } @@ -747,8 +751,6 @@ static void __sa1111_remove(struct sa1111 *sachip) sa1111_writel(0, irqbase + SA1111_WAKEEN0); sa1111_writel(0, irqbase + SA1111_WAKEEN1); - clk_disable(sachip->clk); - if (sachip->irq != NO_IRQ) { set_irq_chained_handler(sachip->irq, NULL); set_irq_data(sachip->irq, NULL); @@ -757,7 +759,6 @@ static void __sa1111_remove(struct sa1111 *sachip) } iounmap(sachip->base); - clk_put(sachip->clk); kfree(sachip); } @@ -856,8 +857,6 @@ static int sa1111_suspend(struct platform_device *dev, pm_message_t state) sa1111_writel(0, sachip->base + SA1111_SKPWM0); sa1111_writel(0, sachip->base + SA1111_SKPWM1); - clk_disable(sachip->clk); - spin_unlock_irqrestore(&sachip->lock, flags); return 0; @@ -944,8 +943,6 @@ static int sa1111_probe(struct platform_device *pdev) if (!mem) return -EINVAL; irq = platform_get_irq(pdev, 0); - if (irq < 0) - return -ENXIO; return __sa1111_probe(&pdev->dev, mem, irq); } diff --git a/arch/arm/common/scoop.c b/arch/arm/common/scoop.c index 314ebd3a1..a2dfe0b0f 100644 --- a/arch/arm/common/scoop.c +++ b/arch/arm/common/scoop.c @@ -18,18 +18,6 @@ #include #include -/* PCMCIA to Scoop linkage - - There is no easy way to link multiple scoop devices into one - single entity for the pxa2xx_pcmcia device so this structure - is used which is setup by the platform code. - - This file is never modular so this symbol is always - accessile to the board support files. -*/ -struct scoop_pcmcia_config *platform_scoop_config; -EXPORT_SYMBOL(platform_scoop_config); - #define SCOOP_REG(d,adr) (*(volatile unsigned short*)(d +(adr))) struct scoop_dev { @@ -144,10 +132,12 @@ int __init scoop_probe(struct platform_device *pdev) if (!mem) return -EINVAL; - devptr = kzalloc(sizeof(struct scoop_dev), GFP_KERNEL); + devptr = kmalloc(sizeof(struct scoop_dev), GFP_KERNEL); + if (!devptr) - return -ENOMEM; + return -ENOMEM; + memset(devptr, 0, sizeof(struct scoop_dev)); spin_lock_init(&devptr->scoop_lock); inf = pdev->dev.platform_data; diff --git a/arch/arm/common/sharpsl_pm.c b/arch/arm/common/sharpsl_pm.c index 59b5ddec4..978d32e82 100644 --- a/arch/arm/common/sharpsl_pm.c +++ b/arch/arm/common/sharpsl_pm.c @@ -22,7 +22,6 @@ #include #include #include -#include #include #include @@ -49,6 +48,13 @@ #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 */ @@ -69,19 +75,17 @@ static void sharpsl_battery_thread(void *private_); struct sharpsl_pm_status sharpsl_pm; DECLARE_WORK(toggle_charger, sharpsl_charge_toggle, NULL); DECLARE_WORK(sharpsl_bat, sharpsl_battery_thread, NULL); -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 = bl_status ? sharpsl_pm.machinfo->bat_levels_acin_bl : sharpsl_pm.machinfo->bat_levels_acin; + thresh=sharpsl_pm.machinfo->bat_levels_acin; else - thresh = bl_status ? sharpsl_pm.machinfo->bat_levels_noac_bl : sharpsl_pm.machinfo->bat_levels_noac; + thresh=sharpsl_pm.machinfo->bat_levels_noac; while (i > 0 && (voltage > thresh[i].voltage)) i--; @@ -125,7 +129,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 (!sharpsl_pm.machinfo->batfull_irq && (sharpsl_pm.charge_mode == CHRG_ON) + if (machine_is_corgi() && (sharpsl_pm.charge_mode == CHRG_ON) && time_after(jiffies, sharpsl_pm.charge_start_time + SHARPSL_CHARGE_ON_TIME_INTERVAL)) schedule_work(&toggle_charger); @@ -160,11 +164,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)) { - sharpsl_pm.machinfo->backlight_limit(1); + corgibl_limit_intensity(1); sharpsl_pm.flags |= SHARPSL_BL_LIMIT; } } else if (sharpsl_pm.flags & SHARPSL_BL_LIMIT) { - sharpsl_pm.machinfo->backlight_limit(0); + corgibl_limit_intensity(0); sharpsl_pm.flags &= ~SHARPSL_BL_LIMIT; } @@ -186,10 +190,10 @@ void sharpsl_pm_led(int val) dev_err(sharpsl_pm.dev, "Charging Error!\n"); } else if (val == SHARPSL_LED_ON) { dev_dbg(sharpsl_pm.dev, "Charge LED On\n"); - led_trigger_event(sharpsl_charge_led_trigger, LED_FULL); + } else { dev_dbg(sharpsl_pm.dev, "Charge LED Off\n"); - led_trigger_event(sharpsl_charge_led_trigger, LED_OFF); + } } @@ -412,10 +416,8 @@ static int sharpsl_check_battery_temp(void) val = get_select_val(buff); dev_dbg(sharpsl_pm.dev, "Temperature: %d\n", val); - if (val > sharpsl_pm.machinfo->charge_on_temp) { - printk(KERN_WARNING "Not charging: temperature out of limits.\n"); + if (val > SHARPSL_CHARGE_ON_TEMP) return -1; - } return 0; } @@ -446,7 +448,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_pm.machinfo->charge_on_volt) + if (val < SHARPSL_CHARGE_ON_VOLT) return -1; return 0; @@ -464,7 +466,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_pm.machinfo->charge_acin_high) || (temp < sharpsl_pm.machinfo->charge_acin_low)) { + if ((temp > SHARPSL_CHARGE_ON_ACIN_HIGH) || (temp < SHARPSL_CHARGE_ON_ACIN_LOW)) { dev_err(sharpsl_pm.dev, "Error: AC check failed.\n"); return -1; } @@ -623,8 +625,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_pm.machinfo->fatal_acin_volt)) || - (!acin && (temp < sharpsl_pm.machinfo->fatal_noacin_volt))) + if ((acin && (temp < SHARPSL_FATAL_ACIN_VOLT)) || + (!acin && (temp < SHARPSL_FATAL_NOACIN_VOLT))) return -1; return 0; } @@ -784,8 +786,6 @@ static int __init sharpsl_pm_probe(struct platform_device *pdev) init_timer(&sharpsl_pm.chrg_full_timer); sharpsl_pm.chrg_full_timer.function = sharpsl_chrg_full_timer; - led_trigger_register_simple("sharpsl-charge", &sharpsl_charge_led_trigger); - sharpsl_pm.machinfo->init(); device_create_file(&pdev->dev, &dev_attr_battery_percentage); @@ -807,8 +807,6 @@ static int sharpsl_pm_remove(struct platform_device *pdev) device_remove_file(&pdev->dev, &dev_attr_battery_percentage); device_remove_file(&pdev->dev, &dev_attr_battery_voltage); - led_trigger_unregister_simple(sharpsl_charge_led_trigger); - sharpsl_pm.machinfo->exit(); del_timer_sync(&sharpsl_pm.chrg_full_timer); diff --git a/arch/arm/common/time-acorn.c b/arch/arm/common/time-acorn.c index 3f60dd9ac..486add853 100644 --- a/arch/arm/common/time-acorn.c +++ b/arch/arm/common/time-acorn.c @@ -16,7 +16,6 @@ #include #include #include -#include #include #include @@ -77,7 +76,7 @@ ioc_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs) static struct irqaction ioc_timer_irq = { .name = "timer", - .flags = IRQF_DISABLED, + .flags = SA_INTERRUPT, .handler = ioc_timer_interrupt }; diff --git a/arch/arm/common/via82c505.c b/arch/arm/common/via82c505.c index ba2e62986..ef716a5b0 100644 --- a/arch/arm/common/via82c505.c +++ b/arch/arm/common/via82c505.c @@ -1,3 +1,4 @@ +#include #include #include #include diff --git a/arch/arm/common/vic.c b/arch/arm/common/vic.c index 43d278134..a45ed1687 100644 --- a/arch/arm/common/vic.c +++ b/arch/arm/common/vic.c @@ -22,73 +22,67 @@ #include #include +#include #include #include +static void __iomem *vic_base; + static void vic_mask_irq(unsigned int irq) { - void __iomem *base = get_irq_chipdata(irq); - irq &= 31; - writel(1 << irq, base + VIC_INT_ENABLE_CLEAR); + irq -= IRQ_VIC_START; + writel(1 << irq, vic_base + VIC_INT_ENABLE_CLEAR); } static void vic_unmask_irq(unsigned int irq) { - void __iomem *base = get_irq_chipdata(irq); - irq &= 31; - writel(1 << irq, base + VIC_INT_ENABLE); + irq -= IRQ_VIC_START; + writel(1 << irq, vic_base + VIC_INT_ENABLE); } -static struct irq_chip vic_chip = { - .name = "VIC", +static struct irqchip vic_chip = { .ack = vic_mask_irq, .mask = vic_mask_irq, .unmask = vic_unmask_irq, }; -/** - * vic_init - initialise a vectored interrupt controller - * @base: iomem base address - * @irq_start: starting interrupt number, must be muliple of 32 - * @vic_sources: bitmask of interrupt sources to allow - */ -void __init vic_init(void __iomem *base, unsigned int irq_start, - u32 vic_sources) +void __init vic_init(void __iomem *base, u32 vic_sources) { unsigned int i; + vic_base = base; + /* Disable all interrupts initially. */ - writel(0, base + VIC_INT_SELECT); - writel(0, base + VIC_INT_ENABLE); - writel(~0, base + VIC_INT_ENABLE_CLEAR); - writel(0, base + VIC_IRQ_STATUS); - writel(0, base + VIC_ITCR); - writel(~0, base + VIC_INT_SOFT_CLEAR); + writel(0, vic_base + VIC_INT_SELECT); + writel(0, vic_base + VIC_INT_ENABLE); + writel(~0, vic_base + VIC_INT_ENABLE_CLEAR); + writel(0, vic_base + VIC_IRQ_STATUS); + writel(0, vic_base + VIC_ITCR); + writel(~0, vic_base + VIC_INT_SOFT_CLEAR); /* * Make sure we clear all existing interrupts */ - writel(0, base + VIC_VECT_ADDR); + writel(0, vic_base + VIC_VECT_ADDR); for (i = 0; i < 19; i++) { unsigned int value; - value = readl(base + VIC_VECT_ADDR); - writel(value, base + VIC_VECT_ADDR); + value = readl(vic_base + VIC_VECT_ADDR); + writel(value, vic_base + VIC_VECT_ADDR); } for (i = 0; i < 16; i++) { - void __iomem *reg = base + VIC_VECT_CNTL0 + (i * 4); + void __iomem *reg = vic_base + VIC_VECT_CNTL0 + (i * 4); writel(VIC_VECT_CNTL_ENABLE | i, reg); } - writel(32, base + VIC_DEF_VECT_ADDR); + writel(32, vic_base + VIC_DEF_VECT_ADDR); for (i = 0; i < 32; i++) { - unsigned int irq = irq_start + i; + unsigned int irq = IRQ_VIC_START + i; set_irq_chip(irq, &vic_chip); - set_irq_chipdata(irq, base); if (vic_sources & (1 << i)) { set_irq_handler(irq, do_level_IRQ); diff --git a/arch/arm/configs/at91rm9200dk_defconfig b/arch/arm/configs/at91rm9200dk_defconfig index 4f3d8d377..1fe73d198 100644 --- a/arch/arm/configs/at91rm9200dk_defconfig +++ b/arch/arm/configs/at91rm9200dk_defconfig @@ -103,7 +103,6 @@ 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 # @@ -380,7 +379,7 @@ CONFIG_MTD_PHYSMAP_BANKWIDTH=2 # CONFIG_MTD_DOC2001 is not set # CONFIG_MTD_DOC2001PLUS is not set CONFIG_MTD_AT91_DATAFLASH=y -# CONFIG_MTD_AT91_DATAFLASH_CARD is not set +CONFIG_MTD_AT91_DATAFLASH_CARD=y # # NAND Flash Device Drivers diff --git a/arch/arm/configs/at91rm9200ek_defconfig b/arch/arm/configs/at91rm9200ek_defconfig index 08b5dc388..b7d934cdb 100644 --- a/arch/arm/configs/at91rm9200ek_defconfig +++ b/arch/arm/configs/at91rm9200ek_defconfig @@ -103,7 +103,6 @@ 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 # @@ -371,7 +370,7 @@ CONFIG_MTD_PHYSMAP_BANKWIDTH=2 # CONFIG_MTD_DOC2001 is not set # CONFIG_MTD_DOC2001PLUS is not set CONFIG_MTD_AT91_DATAFLASH=y -# CONFIG_MTD_AT91_DATAFLASH_CARD is not set +CONFIG_MTD_AT91_DATAFLASH_CARD=y # # NAND Flash Device Drivers diff --git a/arch/arm/configs/collie_defconfig b/arch/arm/configs/collie_defconfig index 074c47a4f..c9aa878e6 100644 --- a/arch/arm/configs/collie_defconfig +++ b/arch/arm/configs/collie_defconfig @@ -1,21 +1,21 @@ # # Automatically generated make config: don't edit -# Linux kernel version: 2.6.17-rc1 -# Fri Apr 14 19:09:52 2006 +# Linux kernel version: 2.6.14-rc3 +# Sun Oct 9 16:55:14 2005 # CONFIG_ARM=y CONFIG_MMU=y +CONFIG_UID16=y CONFIG_RWSEM_GENERIC_SPINLOCK=y -CONFIG_GENERIC_HWEIGHT=y CONFIG_GENERIC_CALIBRATE_DELAY=y -CONFIG_ARCH_MTD_XIP=y -CONFIG_VECTORS_BASE=0xffff0000 # # 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 # @@ -23,58 +23,45 @@ CONFIG_INIT_ENV_ARG_LIMIT=32 # CONFIG_LOCALVERSION="" CONFIG_LOCALVERSION_AUTO=y -# CONFIG_SWAP is not set +CONFIG_SWAP=y CONFIG_SYSVIPC=y # CONFIG_POSIX_MQUEUE is not set -# CONFIG_BSD_PROCESS_ACCT is not set +CONFIG_BSD_PROCESS_ACCT=y +# CONFIG_BSD_PROCESS_ACCT_V3 is not set CONFIG_SYSCTL=y # CONFIG_AUDIT is not set +CONFIG_HOTPLUG=y +CONFIG_KOBJECT_UEVENT=y # CONFIG_IKCONFIG is not set -# CONFIG_RELAY is not set CONFIG_INITRAMFS_SOURCE="" -CONFIG_UID16=y -# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set CONFIG_EMBEDDED=y 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 is not set +CONFIG_BASE_FULL=y CONFIG_FUTEX=y -# CONFIG_EPOLL is not set +CONFIG_EPOLL=y +# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set CONFIG_SHMEM=y -# CONFIG_SLAB is not set -CONFIG_DOUBLEFAULT=y +CONFIG_CC_ALIGN_FUNCTIONS=0 +CONFIG_CC_ALIGN_LABELS=0 +CONFIG_CC_ALIGN_LOOPS=0 +CONFIG_CC_ALIGN_JUMPS=0 # CONFIG_TINY_SHMEM is not set -CONFIG_BASE_SMALL=1 -CONFIG_SLOB=y -CONFIG_OBSOLETE_INTERMODULE=y +CONFIG_BASE_SMALL=0 # # Loadable module support # -# CONFIG_MODULES 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 is not set -# CONFIG_IOSCHED_CFQ is not set -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" +CONFIG_MODULES=y +CONFIG_MODULE_UNLOAD=y +CONFIG_MODULE_FORCE_UNLOAD=y +CONFIG_OBSOLETE_MODPARM=y +CONFIG_MODVERSIONS=y +# CONFIG_MODULE_SRCVERSION_ALL is not set +CONFIG_KMOD=y # # System Type @@ -83,13 +70,11 @@ CONFIG_DEFAULT_IOSCHED="anticipatory" # 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_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_PXA is not set # CONFIG_ARCH_RPC is not set @@ -99,11 +84,9 @@ CONFIG_ARCH_SA1100=y # CONFIG_ARCH_LH7A40X is not set # CONFIG_ARCH_OMAP is not set # CONFIG_ARCH_VERSATILE is not set -# CONFIG_ARCH_REALVIEW is not set # CONFIG_ARCH_IMX is not set # CONFIG_ARCH_H720X is not set # CONFIG_ARCH_AAEC2000 is not set -# CONFIG_ARCH_AT91RM9200 is not set # # SA11x0 Implementations @@ -145,32 +128,20 @@ CONFIG_SHARP_SCOOP=y # Bus support # CONFIG_ISA=y +CONFIG_ISA_DMA_API=y # # PCCARD (PCMCIA/CardBus) support # -CONFIG_PCCARD=y -CONFIG_PCMCIA_DEBUG=y -CONFIG_PCMCIA=y -CONFIG_PCMCIA_LOAD_CIS=y -CONFIG_PCMCIA_IOCTL=y - -# -# PC-card bridges -# -# CONFIG_I82365 is not set -# CONFIG_TCIC is not set -CONFIG_PCMCIA_SA1100=y +# CONFIG_PCCARD is not set # # Kernel Features # -# CONFIG_PREEMPT is not set +# CONFIG_SMP is not set +CONFIG_PREEMPT=y # CONFIG_NO_IDLE_HZ is not set -CONFIG_HZ=100 -# CONFIG_AEABI is not set CONFIG_ARCH_DISCONTIGMEM_ENABLE=y -CONFIG_NODES_SHIFT=2 CONFIG_SELECT_MEMORY_MODEL=y # CONFIG_FLATMEM_MANUAL is not set CONFIG_DISCONTIGMEM_MANUAL=y @@ -179,7 +150,6 @@ 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_LEDS is not set CONFIG_ALIGNMENT_TRAP=y @@ -188,7 +158,7 @@ CONFIG_ALIGNMENT_TRAP=y # CONFIG_ZBOOT_ROM_TEXT=0x0 CONFIG_ZBOOT_ROM_BSS=0x0 -CONFIG_CMDLINE="noinitrd root=/dev/mtdblock2 rootfstype=jffs2 fbcon=rotate:1" +CONFIG_CMDLINE="console=ttyS0,115200n8 console=tty1 noinitrd root=/dev/mtdblock2 rootfstype=jffs2 debug" # CONFIG_XIP_KERNEL is not set # @@ -211,16 +181,14 @@ CONFIG_FPE_NWFPE=y # Userspace binary formats # CONFIG_BINFMT_ELF=y -# CONFIG_BINFMT_AOUT is not set -# CONFIG_BINFMT_MISC is not set +CONFIG_BINFMT_AOUT=m +CONFIG_BINFMT_MISC=m # CONFIG_ARTHUR is not set # # Power management options # CONFIG_PM=y -CONFIG_PM_LEGACY=y -# CONFIG_PM_DEBUG is not set CONFIG_APM=y # @@ -231,7 +199,6 @@ CONFIG_NET=y # # Networking options # -# CONFIG_NETDEBUG is not set CONFIG_PACKET=y CONFIG_PACKET_MMAP=y CONFIG_UNIX=y @@ -244,19 +211,16 @@ CONFIG_IP_FIB_HASH=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_SYN_COOKIES=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_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_NETFILTER is not set # @@ -268,11 +232,6 @@ CONFIG_TCP_CONG_BIC=y # 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 @@ -285,11 +244,8 @@ CONFIG_TCP_CONG_BIC=y # CONFIG_NET_DIVERT is not set # CONFIG_ECONET is not set # CONFIG_WAN_ROUTER is not set - -# -# QoS and/or fair queueing -# # CONFIG_NET_SCHED is not set +# CONFIG_NET_CLS_ROUTE is not set # # Network testing @@ -309,14 +265,9 @@ CONFIG_TCP_CONG_BIC=y # CONFIG_STANDALONE=y CONFIG_PREVENT_FIRMWARE_BUILD=y -CONFIG_FW_LOADER=y +CONFIG_FW_LOADER=m # CONFIG_DEBUG_DRIVER is not set -# -# Connector - unified userspace <-> kernelspace linker -# -# CONFIG_CONNECTOR is not set - # # Memory Technology Devices (MTD) # @@ -336,49 +287,32 @@ 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 # -CONFIG_MTD_CFI=y -CONFIG_MTD_JEDECPROBE=y -CONFIG_MTD_GEN_PROBE=y -CONFIG_MTD_CFI_ADV_OPTIONS=y -CONFIG_MTD_CFI_NOSWAP=y -# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set -# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set -CONFIG_MTD_CFI_GEOMETRY=y -# CONFIG_MTD_MAP_BANK_WIDTH_1 is not set -# CONFIG_MTD_MAP_BANK_WIDTH_2 is not set +# CONFIG_MTD_CFI is not set +# CONFIG_MTD_JEDECPROBE is not set +CONFIG_MTD_MAP_BANK_WIDTH_1=y +CONFIG_MTD_MAP_BANK_WIDTH_2=y CONFIG_MTD_MAP_BANK_WIDTH_4=y # CONFIG_MTD_MAP_BANK_WIDTH_8 is not set # CONFIG_MTD_MAP_BANK_WIDTH_16 is not set # CONFIG_MTD_MAP_BANK_WIDTH_32 is not set -# CONFIG_MTD_CFI_I1 is not set -# CONFIG_MTD_CFI_I2 is not set -CONFIG_MTD_CFI_I4=y +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_OTP 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_OBSOLETE_CHIPS=y CONFIG_MTD_SHARP=y -# CONFIG_MTD_XIP is not set # # Mapping drivers for chip access # # CONFIG_MTD_COMPLEX_MAPPINGS is not set -# CONFIG_MTD_PHYSMAP is not set -# CONFIG_MTD_ARM_INTEGRATOR is not set -CONFIG_MTD_SA1100=y -# CONFIG_MTD_IMPA7 is not set # CONFIG_MTD_PLATRAM is not set # @@ -387,6 +321,7 @@ CONFIG_MTD_SA1100=y # 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 # @@ -401,11 +336,6 @@ CONFIG_MTD_SA1100=y # # CONFIG_MTD_NAND is not set -# -# OneNAND Flash Device Drivers -# -# CONFIG_MTD_ONENAND is not set - # # Parallel port support # @@ -419,6 +349,7 @@ CONFIG_MTD_SA1100=y # # Block devices # +# CONFIG_BLK_DEV_XD is not set # CONFIG_BLK_DEV_COW_COMMON is not set CONFIG_BLK_DEV_LOOP=y # CONFIG_BLK_DEV_CRYPTOLOOP is not set @@ -428,35 +359,20 @@ CONFIG_BLK_DEV_RAM_COUNT=16 CONFIG_BLK_DEV_RAM_SIZE=1024 CONFIG_BLK_DEV_INITRD=y # CONFIG_CDROM_PKTCDVD is not set -# CONFIG_ATA_OVER_ETH is not set - -# -# ATA/ATAPI/MFM/RLL support -# -CONFIG_IDE=y -CONFIG_BLK_DEV_IDE=y # -# Please see Documentation/ide.txt for help/info on IDE drives +# IO Schedulers # -# CONFIG_BLK_DEV_IDE_SATA is not set -CONFIG_BLK_DEV_IDEDISK=y -CONFIG_IDEDISK_MULTI_MODE=y -CONFIG_BLK_DEV_IDECS=y -# CONFIG_BLK_DEV_IDECD is not set -# CONFIG_BLK_DEV_IDETAPE is not set -# CONFIG_BLK_DEV_IDEFLOPPY is not set -# CONFIG_IDE_TASK_IOCTL is not set +CONFIG_IOSCHED_NOOP=y +CONFIG_IOSCHED_AS=y +CONFIG_IOSCHED_DEADLINE=y +CONFIG_IOSCHED_CFQ=y +CONFIG_ATA_OVER_ETH=m # -# IDE chipset support/bugfixes +# ATA/ATAPI/MFM/RLL support # -CONFIG_IDE_GENERIC=y -# CONFIG_IDE_ARM is not set -# CONFIG_IDE_CHIPSETS is not set -# CONFIG_BLK_DEV_IDEDMA is not set -# CONFIG_IDEDMA_AUTO is not set -# CONFIG_BLK_DEV_HD is not set +# CONFIG_IDE is not set # # SCSI device support @@ -486,39 +402,6 @@ CONFIG_IDE_GENERIC=y # Network device support # # CONFIG_NETDEVICES is not set -# CONFIG_DUMMY is not set -# CONFIG_BONDING is not set -# CONFIG_EQUALIZER is not set -# CONFIG_TUN is not set - -# -# PHY device support -# - -# -# Ethernet (10 or 100Mbit) -# -# CONFIG_NET_ETHERNET is not set - -# -# Ethernet (1000 Mbit) -# - -# -# Ethernet (10000 Mbit) -# -CONFIG_PPP=y -# CONFIG_PPP_MULTILINK is not set -# CONFIG_PPP_FILTER is not set -CONFIG_PPP_ASYNC=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 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 @@ -541,7 +424,7 @@ CONFIG_INPUT_TSDEV=y CONFIG_INPUT_TSDEV_SCREEN_X=240 CONFIG_INPUT_TSDEV_SCREEN_Y=320 CONFIG_INPUT_EVDEV=y -# CONFIG_INPUT_EVBUG is not set +CONFIG_INPUT_EVBUG=y # # Input Device Drivers @@ -555,11 +438,7 @@ CONFIG_KEYBOARD_LOCOMO=y # CONFIG_KEYBOARD_NEWTON is not set # CONFIG_INPUT_MOUSE is not set # CONFIG_INPUT_JOYSTICK 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_INPUT_TOUCHSCREEN is not set # CONFIG_INPUT_MISC is not set # @@ -582,16 +461,7 @@ CONFIG_HW_CONSOLE=y # # Serial drivers # -CONFIG_SERIAL_8250=y -# CONFIG_SERIAL_8250_CONSOLE is not set -CONFIG_SERIAL_8250_CS=y -CONFIG_SERIAL_8250_NR_UARTS=4 -CONFIG_SERIAL_8250_RUNTIME_UARTS=4 -CONFIG_SERIAL_8250_EXTENDED=y -# CONFIG_SERIAL_8250_MANY_PORTS is not set -# CONFIG_SERIAL_8250_SHARE_IRQ is not set -# CONFIG_SERIAL_8250_DETECT_IRQ is not set -# CONFIG_SERIAL_8250_RSA is not set +# CONFIG_SERIAL_8250 is not set # # Non-8250 serial port support @@ -613,48 +483,94 @@ CONFIG_UNIX98_PTYS=y # # CONFIG_WATCHDOG is not set # CONFIG_NVRAM is not set +# CONFIG_RTC is not set # CONFIG_DTLK is not set # CONFIG_R3964 is not set # # Ftape, the floppy tape device driver # - -# -# PCMCIA character devices -# -# CONFIG_SYNCLINK_CS is not set -# CONFIG_CARDMAN_4000 is not set -# CONFIG_CARDMAN_4040 is not set # CONFIG_RAW_DRIVER is not set # # TPM devices # -# CONFIG_TCG_TPM is not set -# CONFIG_TELCLOCK is not set # # I2C support # -# CONFIG_I2C is not set +CONFIG_I2C=m +# CONFIG_I2C_CHARDEV is not set + +# +# I2C Algorithms +# +CONFIG_I2C_ALGOBIT=m +# CONFIG_I2C_ALGOPCF is not set +# CONFIG_I2C_ALGOPCA is not set # -# SPI support +# I2C Hardware Bus support # -# CONFIG_SPI is not set -# CONFIG_SPI_MASTER is not set +# CONFIG_I2C_ELEKTOR is not set +# CONFIG_I2C_PARPORT_LIGHT is not set +# CONFIG_I2C_STUB is not set +# CONFIG_I2C_PCA_ISA is not set # -# Dallas's 1-wire bus +# Miscellaneous I2C Chip support # -# CONFIG_W1 is not set +# CONFIG_SENSORS_DS1337 is not set +# CONFIG_SENSORS_DS1374 is not set +# CONFIG_SENSORS_EEPROM is not set +# CONFIG_SENSORS_PCF8574 is not set +# CONFIG_SENSORS_PCA9539 is not set +# CONFIG_SENSORS_PCF8591 is not set +# CONFIG_SENSORS_RTC8564 is not set +# CONFIG_SENSORS_MAX6875 is not set +# CONFIG_I2C_DEBUG_CORE is not set +# CONFIG_I2C_DEBUG_ALGO is not set +# CONFIG_I2C_DEBUG_BUS is not set +# CONFIG_I2C_DEBUG_CHIP is not set # # Hardware Monitoring support # -# CONFIG_HWMON is not set +CONFIG_HWMON=y # CONFIG_HWMON_VID is not set +# CONFIG_SENSORS_ADM1021 is not set +# CONFIG_SENSORS_ADM1025 is not set +# CONFIG_SENSORS_ADM1026 is not set +# CONFIG_SENSORS_ADM1031 is not set +# CONFIG_SENSORS_ADM9240 is not set +# CONFIG_SENSORS_ASB100 is not set +# CONFIG_SENSORS_ATXP1 is not set +# CONFIG_SENSORS_DS1621 is not set +# CONFIG_SENSORS_FSCHER is not set +# CONFIG_SENSORS_FSCPOS is not set +# CONFIG_SENSORS_GL518SM is not set +# CONFIG_SENSORS_GL520SM is not set +# CONFIG_SENSORS_IT87 is not set +# CONFIG_SENSORS_LM63 is not set +# CONFIG_SENSORS_LM75 is not set +# CONFIG_SENSORS_LM77 is not set +# CONFIG_SENSORS_LM78 is not set +# CONFIG_SENSORS_LM80 is not set +# CONFIG_SENSORS_LM83 is not set +# CONFIG_SENSORS_LM85 is not set +# CONFIG_SENSORS_LM87 is not set +# CONFIG_SENSORS_LM90 is not set +# CONFIG_SENSORS_LM92 is not set +# CONFIG_SENSORS_MAX1619 is not set +# CONFIG_SENSORS_PC87360 is not set +# CONFIG_SENSORS_SMSC47M1 is not set +# CONFIG_SENSORS_SMSC47B397 is not set +# CONFIG_SENSORS_W83781D is not set +# CONFIG_SENSORS_W83792D is not set +# CONFIG_SENSORS_W83L785TS is not set +# CONFIG_SENSORS_W83627HF is not set +# CONFIG_SENSORS_W83627EHF is not set +# CONFIG_HWMON_DEBUG_CHIP is not set # # Misc devices @@ -663,33 +579,42 @@ CONFIG_UNIX98_PTYS=y # # Multimedia Capabilities Port drivers # -CONFIG_MCP=y -CONFIG_MCP_SA11X0=y -CONFIG_MCP_UCB1200=y -CONFIG_MCP_UCB1200_TS=y +# CONFIG_MCP_SA11X0 is not set # -# LED devices +# Multimedia devices # -CONFIG_NEW_LEDS=y -CONFIG_LEDS_CLASS=y +CONFIG_VIDEO_DEV=m # -# LED drivers +# Video For Linux # -CONFIG_LEDS_LOCOMO=y # -# LED Triggers +# Video Adapters # -CONFIG_LEDS_TRIGGERS=y -CONFIG_LEDS_TRIGGER_TIMER=y -CONFIG_LEDS_TRIGGER_IDE_DISK=y +# CONFIG_VIDEO_PMS is not set +# CONFIG_VIDEO_CPIA is not set +# CONFIG_VIDEO_SAA5246A is not set +# CONFIG_VIDEO_SAA5249 is not set +# CONFIG_TUNER_3036 is not set +# CONFIG_VIDEO_OVCAMCHIP is not set # -# Multimedia devices +# Radio Adapters # -# CONFIG_VIDEO_DEV is not set +# CONFIG_RADIO_CADET is not set +# CONFIG_RADIO_RTRACK is not set +# CONFIG_RADIO_RTRACK2 is not set +# CONFIG_RADIO_AZTECH is not set +# CONFIG_RADIO_GEMTEK is not set +# CONFIG_RADIO_MAESTRO is not set +# CONFIG_RADIO_SF16FMI is not set +# CONFIG_RADIO_SF16FMR2 is not set +# CONFIG_RADIO_TERRATEC is not set +# CONFIG_RADIO_TRUST is not set +# CONFIG_RADIO_TYPHOON is not set +# CONFIG_RADIO_ZOLTRIX is not set # # Digital Video Broadcasting Devices @@ -703,8 +628,8 @@ 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_FIRMWARE_EDID is not set CONFIG_FB_MODE_HELPERS=y # CONFIG_FB_TILEBLITTING is not set CONFIG_FB_SA1100=y @@ -718,15 +643,14 @@ CONFIG_FB_SA1100=y # CONFIG_MDA_CONSOLE is not set CONFIG_DUMMY_CONSOLE=y CONFIG_FRAMEBUFFER_CONSOLE=y -CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y CONFIG_FONTS=y -# CONFIG_FONT_8x8 is not set +CONFIG_FONT_8x8=y # CONFIG_FONT_8x16 is not set # CONFIG_FONT_6x11 is not set # CONFIG_FONT_7x14 is not set # CONFIG_FONT_PEARL_8x8 is not set # CONFIG_FONT_ACORN_8x8 is not set -CONFIG_FONT_MINI_4x6=y +# 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 @@ -735,11 +659,7 @@ CONFIG_FONT_MINI_4x6=y # Logo configuration # # CONFIG_LOGO is not set -CONFIG_BACKLIGHT_LCD_SUPPORT=y -CONFIG_BACKLIGHT_CLASS_DEVICE=y -CONFIG_BACKLIGHT_DEVICE=y -CONFIG_LCD_CLASS_DEVICE=y -CONFIG_LCD_DEVICE=y +# CONFIG_BACKLIGHT_LCD_SUPPORT is not set # # Sound @@ -751,42 +671,44 @@ CONFIG_LCD_DEVICE=y # CONFIG_USB_ARCH_HAS_HCD=y # CONFIG_USB_ARCH_HAS_OHCI is not set -# 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 is not set +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_LH7A40X is not set +# CONFIG_USB_GADGET_OMAP is not set +# CONFIG_USB_GADGET_DUMMY_HCD is not set +# CONFIG_USB_GADGET_DUALSPEED is not set # # 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 is not set +CONFIG_EXT2_FS=y +CONFIG_EXT2_FS_XATTR=y +CONFIG_EXT2_FS_POSIX_ACL=y +CONFIG_EXT2_FS_SECURITY=y +# CONFIG_EXT2_FS_XIP is not set # CONFIG_EXT3_FS is not set +# CONFIG_JBD is not set +CONFIG_FS_MBCACHE=y # CONFIG_REISERFS_FS is not set # CONFIG_JFS_FS is not set -# CONFIG_FS_POSIX_ACL is not set +CONFIG_FS_POSIX_ACL=y # CONFIG_XFS_FS is not set -# CONFIG_OCFS2_FS is not set # CONFIG_MINIX_FS is not set CONFIG_ROMFS_FS=y -# CONFIG_INOTIFY is not set +CONFIG_INOTIFY=y # CONFIG_QUOTA is not set # CONFIG_DNOTIFY is not set # CONFIG_AUTOFS_FS is not set @@ -803,7 +725,7 @@ CONFIG_ROMFS_FS=y # DOS/FAT/NT Filesystems # CONFIG_FAT_FS=y -# CONFIG_MSDOS_FS is not set +CONFIG_MSDOS_FS=y CONFIG_VFAT_FS=y CONFIG_FAT_DEFAULT_CODEPAGE=437 CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" @@ -817,7 +739,7 @@ CONFIG_SYSFS=y CONFIG_TMPFS=y # CONFIG_HUGETLB_PAGE is not set CONFIG_RAMFS=y -# CONFIG_CONFIGFS_FS is not set +# CONFIG_RELAYFS_FS is not set # # Miscellaneous filesystems @@ -833,12 +755,11 @@ CONFIG_RAMFS=y CONFIG_JFFS2_FS=y CONFIG_JFFS2_FS_DEBUG=0 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 # CONFIG_JFFS2_RUBIN is not set -# CONFIG_CRAMFS is not set +CONFIG_CRAMFS=y # CONFIG_VXFS_FS is not set # CONFIG_HPFS_FS is not set # CONFIG_QNX4FS_FS is not set @@ -868,7 +789,7 @@ CONFIG_MSDOS_PARTITION=y # CONFIG_NLS=y CONFIG_NLS_DEFAULT="cp437" -CONFIG_NLS_CODEPAGE_437=y +CONFIG_NLS_CODEPAGE_437=m # CONFIG_NLS_CODEPAGE_737 is not set # CONFIG_NLS_CODEPAGE_775 is not set # CONFIG_NLS_CODEPAGE_850 is not set @@ -892,7 +813,7 @@ CONFIG_NLS_CODEPAGE_437=y # CONFIG_NLS_CODEPAGE_1250 is not set # CONFIG_NLS_CODEPAGE_1251 is not set # CONFIG_NLS_ASCII is not set -CONFIG_NLS_ISO8859_1=y +CONFIG_NLS_ISO8859_1=m # CONFIG_NLS_ISO8859_2 is not set # CONFIG_NLS_ISO8859_3 is not set # CONFIG_NLS_ISO8859_4 is not set @@ -905,7 +826,7 @@ CONFIG_NLS_ISO8859_1=y # CONFIG_NLS_ISO8859_15 is not set # CONFIG_NLS_KOI8_R is not set # CONFIG_NLS_KOI8_U is not set -# CONFIG_NLS_UTF8 is not set +CONFIG_NLS_UTF8=m # # Profiling support @@ -916,23 +837,20 @@ CONFIG_NLS_ISO8859_1=y # Kernel hacking # # CONFIG_PRINTK_TIME is not set -CONFIG_MAGIC_SYSRQ=y CONFIG_DEBUG_KERNEL=y +CONFIG_MAGIC_SYSRQ=y CONFIG_LOG_BUF_SHIFT=14 -# CONFIG_DETECT_SOFTLOCKUP is not set +CONFIG_DETECT_SOFTLOCKUP=y # CONFIG_SCHEDSTATS is not set -CONFIG_DEBUG_MUTEXES=y +# CONFIG_DEBUG_SLAB is not set +CONFIG_DEBUG_PREEMPT=y # CONFIG_DEBUG_SPINLOCK is not set # CONFIG_DEBUG_SPINLOCK_SLEEP is not set # CONFIG_DEBUG_KOBJECT is not set # CONFIG_DEBUG_BUGVERBOSE is not set # CONFIG_DEBUG_INFO is not set # CONFIG_DEBUG_FS is not set -# CONFIG_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 is not set # CONFIG_DEBUG_WAITQ is not set CONFIG_DEBUG_ERRORS=y @@ -956,7 +874,7 @@ CONFIG_DEBUG_ERRORS=y # # Library routines # -CONFIG_CRC_CCITT=y +# CONFIG_CRC_CCITT is not set # CONFIG_CRC16 is not set CONFIG_CRC32=y # CONFIG_LIBCRC32C is not set diff --git a/arch/arm/configs/csb337_defconfig b/arch/arm/configs/csb337_defconfig index cf3fa5cb2..94bd9932a 100644 --- a/arch/arm/configs/csb337_defconfig +++ b/arch/arm/configs/csb337_defconfig @@ -103,7 +103,6 @@ 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 # @@ -621,8 +620,9 @@ 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,41 +955,9 @@ 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 640d70c1f..1519124c5 100644 --- a/arch/arm/configs/csb637_defconfig +++ b/arch/arm/configs/csb637_defconfig @@ -103,7 +103,6 @@ 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/enp2611_defconfig b/arch/arm/configs/enp2611_defconfig index e8f9fccff..5fdaf3ce9 100644 --- a/arch/arm/configs/enp2611_defconfig +++ b/arch/arm/configs/enp2611_defconfig @@ -1,14 +1,13 @@ # # Automatically generated make config: don't edit -# Linux kernel version: 2.6.12-rc1-bk2 -# Sun Mar 27 22:08:24 2005 +# Linux kernel version: 2.6.14-git13 +# Thu Nov 10 15:12:48 2005 # 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 @@ -16,11 +15,13 @@ CONFIG_GENERIC_IOMAP=y CONFIG_EXPERIMENTAL=y CONFIG_CLEAN_COMPILE=y CONFIG_BROKEN_ON_SMP=y +CONFIG_INIT_ENV_ARG_LIMIT=32 # # General setup # CONFIG_LOCALVERSION="" +CONFIG_LOCALVERSION_AUTO=y CONFIG_SWAP=y CONFIG_SYSVIPC=y # CONFIG_POSIX_MQUEUE is not set @@ -31,10 +32,13 @@ CONFIG_SYSCTL=y # CONFIG_HOTPLUG is not set CONFIG_KOBJECT_UEVENT=y # CONFIG_IKCONFIG is not set +CONFIG_INITRAMFS_SOURCE="" CONFIG_EMBEDDED=y CONFIG_KALLSYMS=y # CONFIG_KALLSYMS_ALL is not set # CONFIG_KALLSYMS_EXTRA_PASS is not set +CONFIG_PRINTK=y +CONFIG_BUG=y CONFIG_BASE_FULL=y CONFIG_FUTEX=y CONFIG_EPOLL=y @@ -50,7 +54,30 @@ CONFIG_BASE_SMALL=0 # # Loadable module support # -# CONFIG_MODULES is not set +CONFIG_MODULES=y +CONFIG_MODULE_UNLOAD=y +# CONFIG_MODULE_FORCE_UNLOAD is not set +CONFIG_OBSOLETE_MODPARM=y +# CONFIG_MODVERSIONS is not set +# CONFIG_MODULE_SRCVERSION_ALL is not set +CONFIG_KMOD=y + +# +# Block layer +# + +# +# IO Schedulers +# +CONFIG_IOSCHED_NOOP=y +CONFIG_IOSCHED_AS=y +CONFIG_IOSCHED_DEADLINE=y +CONFIG_IOSCHED_CFQ=y +CONFIG_DEFAULT_AS=y +# CONFIG_DEFAULT_DEADLINE is not set +# CONFIG_DEFAULT_CFQ is not set +# CONFIG_DEFAULT_NOOP is not set +CONFIG_DEFAULT_IOSCHED="anticipatory" # # System Type @@ -59,7 +86,6 @@ CONFIG_BASE_SMALL=0 # CONFIG_ARCH_CLPS711X is not set # CONFIG_ARCH_CO285 is not set # CONFIG_ARCH_EBSA110 is not set -# CONFIG_ARCH_CAMELOT is not set # CONFIG_ARCH_FOOTBRIDGE is not set # CONFIG_ARCH_INTEGRATOR is not set # CONFIG_ARCH_IOP3XX is not set @@ -74,8 +100,10 @@ CONFIG_ARCH_IXP2000=y # CONFIG_ARCH_LH7A40X is not set # CONFIG_ARCH_OMAP is not set # CONFIG_ARCH_VERSATILE is not set +# CONFIG_ARCH_REALVIEW is not set # CONFIG_ARCH_IMX is not set # CONFIG_ARCH_H720X is not set +# CONFIG_ARCH_AAEC2000 is not set CONFIG_ARCH_SUPPORTS_BIG_ENDIAN=y # @@ -90,6 +118,7 @@ CONFIG_ARCH_ENP2611=y # CONFIG_ARCH_IXDP2800 is not set # CONFIG_ARCH_IXDP2401 is not set # CONFIG_ARCH_IXDP2801 is not set +# CONFIG_IXP2000_SUPPORT_BROKEN_PCI_IO is not set # # Processor Type @@ -100,7 +129,6 @@ CONFIG_CPU_32v5=y CONFIG_CPU_ABRT_EV5T=y CONFIG_CPU_CACHE_VIVT=y CONFIG_CPU_TLB_V4WBI=y -CONFIG_CPU_MINICACHE=y # # Processor Features @@ -112,9 +140,10 @@ CONFIG_XSCALE_PMU=y # # Bus support # +CONFIG_ISA_DMA_API=y CONFIG_PCI=y CONFIG_PCI_LEGACY_PROC=y -CONFIG_PCI_NAMES=y +# CONFIG_PCI_DEBUG is not set # # PCCARD (PCMCIA/CardBus) support @@ -125,6 +154,16 @@ CONFIG_PCI_NAMES=y # Kernel Features # # CONFIG_PREEMPT is not set +# CONFIG_NO_IDLE_HZ is not set +# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set +CONFIG_SELECT_MEMORY_MODEL=y +CONFIG_FLATMEM_MANUAL=y +# CONFIG_DISCONTIGMEM_MANUAL is not set +# CONFIG_SPARSEMEM_MANUAL is not set +CONFIG_FLATMEM=y +CONFIG_FLAT_NODE_MEM_MAP=y +# CONFIG_SPARSEMEM_STATIC is not set +CONFIG_SPLIT_PTLOCK_CPUS=4096 CONFIG_ALIGNMENT_TRAP=y # @@ -132,7 +171,7 @@ CONFIG_ALIGNMENT_TRAP=y # CONFIG_ZBOOT_ROM_TEXT=0x0 CONFIG_ZBOOT_ROM_BSS=0x0 -CONFIG_CMDLINE="console=ttyS0,57600 root=/dev/nfs ip=bootp mem=64M@0x0 pci=firmware" +CONFIG_CMDLINE="console=ttyS0,57600 root=/dev/nfs ip=bootp mem=64M@0x0" # CONFIG_XIP_KERNEL is not set # @@ -143,6 +182,7 @@ CONFIG_CMDLINE="console=ttyS0,57600 root=/dev/nfs ip=bootp mem=64M@0x0 pci=firmw # At least one emulation must be selected # CONFIG_FPE_NWFPE=y +CONFIG_FPE_NWFPE_XP=y # CONFIG_FPE_FASTFPE is not set # @@ -158,6 +198,78 @@ CONFIG_BINFMT_ELF=y # # CONFIG_PM is not set +# +# Networking +# +CONFIG_NET=y + +# +# Networking options +# +CONFIG_PACKET=y +CONFIG_PACKET_MMAP=y +CONFIG_UNIX=y +# CONFIG_NET_KEY is not set +CONFIG_INET=y +# CONFIG_IP_MULTICAST is not set +# CONFIG_IP_ADVANCED_ROUTER is not set +CONFIG_IP_FIB_HASH=y +CONFIG_IP_PNP=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=y +# CONFIG_INET_AH is not set +# CONFIG_INET_ESP is not set +# CONFIG_INET_IPCOMP is not set +# CONFIG_INET_TUNNEL is not set +CONFIG_INET_DIAG=y +CONFIG_INET_TCP_DIAG=y +# CONFIG_TCP_CONG_ADVANCED is not set +CONFIG_TCP_CONG_BIC=y +# CONFIG_IPV6 is not set +# CONFIG_NETFILTER is not set + +# +# DCCP Configuration (EXPERIMENTAL) +# +# CONFIG_IP_DCCP is not set + +# +# SCTP Configuration (EXPERIMENTAL) +# +# CONFIG_IP_SCTP is not set +# CONFIG_ATM is not set +# CONFIG_BRIDGE is not set +# CONFIG_VLAN_8021Q is not set +# CONFIG_DECNET is not set +# CONFIG_LLC2 is not set +# CONFIG_IPX is not set +# CONFIG_ATALK is not set +# CONFIG_X25 is not set +# CONFIG_LAPB is not set +# CONFIG_NET_DIVERT is not set +# CONFIG_ECONET is not set +# CONFIG_WAN_ROUTER is not set + +# +# 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_HAMRADIO is not set +# CONFIG_IRDA is not set +# CONFIG_BT is not set +# CONFIG_IEEE80211 is not set + # # Device Drivers # @@ -192,6 +304,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 @@ -226,8 +339,8 @@ CONFIG_MTD_COMPLEX_MAPPINGS=y # CONFIG_MTD_PHYSMAP is not set # CONFIG_MTD_ARM_INTEGRATOR is not set CONFIG_MTD_IXP2000=y -# CONFIG_MTD_EDB7312 is not set # CONFIG_MTD_PCI is not set +# CONFIG_MTD_PLATRAM is not set # # Self-contained MTD device drivers @@ -251,6 +364,11 @@ CONFIG_MTD_IXP2000=y # # CONFIG_MTD_NAND is not set +# +# OneNAND Flash Device Drivers +# +# CONFIG_MTD_ONENAND is not set + # # Parallel port support # @@ -263,7 +381,6 @@ CONFIG_MTD_IXP2000=y # # Block devices # -# CONFIG_BLK_DEV_FD is not set # CONFIG_BLK_CPQ_DA is not set # CONFIG_BLK_CPQ_CISS_DA is not set # CONFIG_BLK_DEV_DAC960 is not set @@ -277,21 +394,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 is not set # # SCSI device support # +# CONFIG_RAID_ATTRS is not set # CONFIG_SCSI is not set # @@ -302,6 +411,7 @@ CONFIG_IOSCHED_CFQ=y # # Fusion MPT device support # +# CONFIG_FUSION is not set # # IEEE 1394 (FireWire) support @@ -314,70 +424,8 @@ CONFIG_IOSCHED_CFQ=y # CONFIG_I2O is not set # -# Networking support -# -CONFIG_NET=y - -# -# Networking options -# -CONFIG_PACKET=y -CONFIG_PACKET_MMAP=y -# CONFIG_NETLINK_DEV is not set -CONFIG_UNIX=y -# CONFIG_NET_KEY is not set -CONFIG_INET=y -# 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=y -# CONFIG_INET_AH is not set -# CONFIG_INET_ESP is not set -# CONFIG_INET_IPCOMP is not set -# CONFIG_INET_TUNNEL is not set -# CONFIG_IP_TCPDIAG is not set -# 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=y # CONFIG_BONDING is not set @@ -389,6 +437,11 @@ CONFIG_DUMMY=y # # CONFIG_ARCNET is not set +# +# PHY device support +# +# CONFIG_PHYLIB is not set + # # Ethernet (10 or 100Mbit) # @@ -396,8 +449,10 @@ CONFIG_NET_ETHERNET=y CONFIG_MII=y # CONFIG_HAPPYMEAL is not set # CONFIG_SUNGEM is not set +# CONFIG_CASSINI is not set # CONFIG_NET_VENDOR_3COM is not set # CONFIG_SMC91X is not set +# CONFIG_DM9000 is not set # # Tulip family network device support @@ -434,13 +489,17 @@ CONFIG_EEPRO100=y # CONFIG_HAMACHI is not set # CONFIG_YELLOWFIN is not set # CONFIG_R8169 is not set +# CONFIG_SIS190 is not set +# CONFIG_SKGE is not set # CONFIG_SK98LIN is not set # CONFIG_VIA_VELOCITY is not set # CONFIG_TIGON3 is not set +# CONFIG_BNX2 is not set # # Ethernet (10000 Mbit) # +# CONFIG_CHELSIO_T1 is not set # CONFIG_IXGB is not set # CONFIG_S2IO is not set @@ -458,6 +517,7 @@ CONFIG_EEPRO100=y # Wan interfaces # CONFIG_WAN=y +# CONFIG_DSCC4 is not set # CONFIG_LANMEDIA is not set # CONFIG_SYNCLINK_SYNCPPP is not set CONFIG_HDLC=y @@ -483,6 +543,8 @@ CONFIG_DLCI_MAX=8 # 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 @@ -520,7 +582,6 @@ CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 # # CONFIG_SERIO is not set # CONFIG_GAMEPORT is not set -CONFIG_SOUND_GAMEPORT=y # # Character devices @@ -541,6 +602,7 @@ CONFIG_SERIAL_8250_NR_UARTS=2 # CONFIG_SERIAL_CORE=y CONFIG_SERIAL_CORE_CONSOLE=y +# CONFIG_SERIAL_JSM is not set CONFIG_UNIX98_PTYS=y CONFIG_LEGACY_PTYS=y CONFIG_LEGACY_PTY_COUNT=256 @@ -583,6 +645,7 @@ CONFIG_IXP2000_WATCHDOG=y # TPM devices # # CONFIG_TCG_TPM is not set +# CONFIG_TELCLOCK is not set # # I2C support @@ -607,31 +670,51 @@ CONFIG_I2C_ALGOBIT=y # CONFIG_I2C_AMD8111 is not set # CONFIG_I2C_I801 is not set # CONFIG_I2C_I810 is not set -# CONFIG_I2C_ISA is not set -# CONFIG_I2C_IXP2000 is not set +# CONFIG_I2C_PIIX4 is not set +CONFIG_I2C_IXP2000=y # CONFIG_I2C_NFORCE2 is not set # CONFIG_I2C_PARPORT_LIGHT is not set -# CONFIG_I2C_PIIX4 is not set # CONFIG_I2C_PROSAVAGE is not set # CONFIG_I2C_SAVAGE4 is not set # CONFIG_SCx200_ACB is not set # CONFIG_I2C_SIS5595 is not set # CONFIG_I2C_SIS630 is not set # CONFIG_I2C_SIS96X is not set +# CONFIG_I2C_STUB is not set # CONFIG_I2C_VIA is not set # CONFIG_I2C_VIAPRO is not set # CONFIG_I2C_VOODOO3 is not set # CONFIG_I2C_PCA_ISA is not set # -# Hardware Sensors Chip support +# Miscellaneous I2C Chip support # -CONFIG_I2C_SENSOR=y +# CONFIG_SENSORS_DS1337 is not set +# CONFIG_SENSORS_DS1374 is not set +CONFIG_SENSORS_EEPROM=y +# 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 +# CONFIG_I2C_DEBUG_CHIP is not set + +# +# Hardware Monitoring support +# +CONFIG_HWMON=y +# CONFIG_HWMON_VID is not set # CONFIG_SENSORS_ADM1021 is not set # CONFIG_SENSORS_ADM1025 is not set # CONFIG_SENSORS_ADM1026 is not set # CONFIG_SENSORS_ADM1031 is not set +# CONFIG_SENSORS_ADM9240 is not set # CONFIG_SENSORS_ASB100 is not set +# CONFIG_SENSORS_ATXP1 is not set # CONFIG_SENSORS_DS1621 is not set # CONFIG_SENSORS_FSCHER is not set # CONFIG_SENSORS_FSCPOS is not set @@ -647,30 +730,26 @@ CONFIG_I2C_SENSOR=y # CONFIG_SENSORS_LM85 is not set # CONFIG_SENSORS_LM87 is not set # CONFIG_SENSORS_LM90 is not set +# CONFIG_SENSORS_LM92 is not set # CONFIG_SENSORS_MAX1619 is not set # CONFIG_SENSORS_PC87360 is not set -# CONFIG_SENSORS_SMSC47B397 is not set # CONFIG_SENSORS_SIS5595 is not set # CONFIG_SENSORS_SMSC47M1 is not set +# CONFIG_SENSORS_SMSC47B397 is not set # CONFIG_SENSORS_VIA686A is not set # CONFIG_SENSORS_W83781D is not set +# CONFIG_SENSORS_W83792D is not set # CONFIG_SENSORS_W83L785TS is not set # CONFIG_SENSORS_W83627HF is not set +# CONFIG_SENSORS_W83627EHF is not set +# CONFIG_HWMON_DEBUG_CHIP is not set # -# Other I2C Chip support +# Misc devices # -CONFIG_SENSORS_EEPROM=y -# CONFIG_SENSORS_PCF8574 is not set -# CONFIG_SENSORS_PCF8591 is not set -# CONFIG_SENSORS_RTC8564 is not set -# CONFIG_I2C_DEBUG_CORE is not set -# CONFIG_I2C_DEBUG_ALGO is not set -# CONFIG_I2C_DEBUG_BUS is not set -# CONFIG_I2C_DEBUG_CHIP is not set # -# Misc devices +# Multimedia Capabilities Port drivers # # @@ -700,6 +779,10 @@ CONFIG_USB_ARCH_HAS_HCD=y CONFIG_USB_ARCH_HAS_OHCI=y # CONFIG_USB is not set +# +# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' +# + # # USB Gadget Support # @@ -717,6 +800,7 @@ CONFIG_EXT2_FS=y CONFIG_EXT2_FS_XATTR=y CONFIG_EXT2_FS_POSIX_ACL=y # CONFIG_EXT2_FS_SECURITY is not set +# CONFIG_EXT2_FS_XIP is not set CONFIG_EXT3_FS=y CONFIG_EXT3_FS_XATTR=y CONFIG_EXT3_FS_POSIX_ACL=y @@ -727,17 +811,15 @@ CONFIG_FS_MBCACHE=y # CONFIG_REISERFS_FS is not set # CONFIG_JFS_FS is not set CONFIG_FS_POSIX_ACL=y - -# -# XFS support -# # CONFIG_XFS_FS is not set # CONFIG_MINIX_FS is not set # CONFIG_ROMFS_FS is not set +CONFIG_INOTIFY=y # CONFIG_QUOTA is not set CONFIG_DNOTIFY=y # CONFIG_AUTOFS_FS is not set # CONFIG_AUTOFS4_FS is not set +# CONFIG_FUSE_FS is not set # # CD-ROM/DVD Filesystems @@ -757,12 +839,10 @@ CONFIG_DNOTIFY=y # 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 # # Miscellaneous filesystems @@ -777,8 +857,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 @@ -795,12 +875,14 @@ CONFIG_JFFS2_RTIME=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 @@ -809,6 +891,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 @@ -847,6 +930,7 @@ CONFIG_MSDOS_PARTITION=y CONFIG_DEBUG_KERNEL=y CONFIG_MAGIC_SYSRQ=y CONFIG_LOG_BUF_SHIFT=14 +CONFIG_DETECT_SOFTLOCKUP=y # CONFIG_SCHEDSTATS is not set # CONFIG_DEBUG_SLAB is not set # CONFIG_DEBUG_SPINLOCK is not set @@ -855,7 +939,9 @@ CONFIG_LOG_BUF_SHIFT=14 CONFIG_DEBUG_BUGVERBOSE=y # CONFIG_DEBUG_INFO is not set # CONFIG_DEBUG_FS is not set +# CONFIG_DEBUG_VM is not set CONFIG_FRAME_POINTER=y +# CONFIG_RCU_TORTURE_TEST is not set CONFIG_DEBUG_USER=y # CONFIG_DEBUG_WAITQ is not set CONFIG_DEBUG_ERRORS=y @@ -881,6 +967,7 @@ CONFIG_DEBUG_LL=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/ixdp2400_defconfig b/arch/arm/configs/ixdp2400_defconfig index 4fd663ecb..c67fc449a 100644 --- a/arch/arm/configs/ixdp2400_defconfig +++ b/arch/arm/configs/ixdp2400_defconfig @@ -1,14 +1,13 @@ # # Automatically generated make config: don't edit -# Linux kernel version: 2.6.12-rc1-bk2 -# Sun Mar 27 21:13:38 2005 +# Linux kernel version: 2.6.14-git13 +# Thu Nov 10 15:14:13 2005 # 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 @@ -16,11 +15,13 @@ CONFIG_GENERIC_IOMAP=y CONFIG_EXPERIMENTAL=y CONFIG_CLEAN_COMPILE=y CONFIG_BROKEN_ON_SMP=y +CONFIG_INIT_ENV_ARG_LIMIT=32 # # General setup # CONFIG_LOCALVERSION="" +CONFIG_LOCALVERSION_AUTO=y CONFIG_SWAP=y CONFIG_SYSVIPC=y # CONFIG_POSIX_MQUEUE is not set @@ -31,10 +32,13 @@ CONFIG_SYSCTL=y # CONFIG_HOTPLUG is not set CONFIG_KOBJECT_UEVENT=y # CONFIG_IKCONFIG is not set +CONFIG_INITRAMFS_SOURCE="" CONFIG_EMBEDDED=y CONFIG_KALLSYMS=y # CONFIG_KALLSYMS_ALL is not set # CONFIG_KALLSYMS_EXTRA_PASS is not set +CONFIG_PRINTK=y +CONFIG_BUG=y CONFIG_BASE_FULL=y CONFIG_FUTEX=y CONFIG_EPOLL=y @@ -50,7 +54,30 @@ CONFIG_BASE_SMALL=0 # # Loadable module support # -# CONFIG_MODULES is not set +CONFIG_MODULES=y +CONFIG_MODULE_UNLOAD=y +# CONFIG_MODULE_FORCE_UNLOAD is not set +CONFIG_OBSOLETE_MODPARM=y +# CONFIG_MODVERSIONS is not set +# CONFIG_MODULE_SRCVERSION_ALL is not set +CONFIG_KMOD=y + +# +# Block layer +# + +# +# IO Schedulers +# +CONFIG_IOSCHED_NOOP=y +CONFIG_IOSCHED_AS=y +CONFIG_IOSCHED_DEADLINE=y +CONFIG_IOSCHED_CFQ=y +CONFIG_DEFAULT_AS=y +# CONFIG_DEFAULT_DEADLINE is not set +# CONFIG_DEFAULT_CFQ is not set +# CONFIG_DEFAULT_NOOP is not set +CONFIG_DEFAULT_IOSCHED="anticipatory" # # System Type @@ -59,7 +86,6 @@ CONFIG_BASE_SMALL=0 # CONFIG_ARCH_CLPS711X is not set # CONFIG_ARCH_CO285 is not set # CONFIG_ARCH_EBSA110 is not set -# CONFIG_ARCH_CAMELOT is not set # CONFIG_ARCH_FOOTBRIDGE is not set # CONFIG_ARCH_INTEGRATOR is not set # CONFIG_ARCH_IOP3XX is not set @@ -74,8 +100,10 @@ CONFIG_ARCH_IXP2000=y # CONFIG_ARCH_LH7A40X is not set # CONFIG_ARCH_OMAP is not set # CONFIG_ARCH_VERSATILE is not set +# CONFIG_ARCH_REALVIEW is not set # CONFIG_ARCH_IMX is not set # CONFIG_ARCH_H720X is not set +# CONFIG_ARCH_AAEC2000 is not set CONFIG_ARCH_SUPPORTS_BIG_ENDIAN=y # @@ -91,6 +119,7 @@ CONFIG_ARCH_IXDP2400=y CONFIG_ARCH_IXDP2X00=y # CONFIG_ARCH_IXDP2401 is not set # CONFIG_ARCH_IXDP2801 is not set +# CONFIG_IXP2000_SUPPORT_BROKEN_PCI_IO is not set # # Processor Type @@ -101,7 +130,6 @@ CONFIG_CPU_32v5=y CONFIG_CPU_ABRT_EV5T=y CONFIG_CPU_CACHE_VIVT=y CONFIG_CPU_TLB_V4WBI=y -CONFIG_CPU_MINICACHE=y # # Processor Features @@ -113,9 +141,10 @@ CONFIG_XSCALE_PMU=y # # Bus support # +CONFIG_ISA_DMA_API=y CONFIG_PCI=y CONFIG_PCI_LEGACY_PROC=y -CONFIG_PCI_NAMES=y +# CONFIG_PCI_DEBUG is not set # # PCCARD (PCMCIA/CardBus) support @@ -126,6 +155,16 @@ CONFIG_PCI_NAMES=y # Kernel Features # # CONFIG_PREEMPT is not set +# CONFIG_NO_IDLE_HZ is not set +# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set +CONFIG_SELECT_MEMORY_MODEL=y +CONFIG_FLATMEM_MANUAL=y +# CONFIG_DISCONTIGMEM_MANUAL is not set +# CONFIG_SPARSEMEM_MANUAL is not set +CONFIG_FLATMEM=y +CONFIG_FLAT_NODE_MEM_MAP=y +# CONFIG_SPARSEMEM_STATIC is not set +CONFIG_SPLIT_PTLOCK_CPUS=4096 CONFIG_ALIGNMENT_TRAP=y # @@ -133,7 +172,7 @@ CONFIG_ALIGNMENT_TRAP=y # CONFIG_ZBOOT_ROM_TEXT=0x0 CONFIG_ZBOOT_ROM_BSS=0x0 -CONFIG_CMDLINE="console=ttyS0,57600 root=/dev/nfs ip=bootp mem=64M@0x0 pci=firmware" +CONFIG_CMDLINE="console=ttyS0,57600 root=/dev/nfs ip=bootp mem=64M@0x0" # CONFIG_XIP_KERNEL is not set # @@ -144,6 +183,7 @@ CONFIG_CMDLINE="console=ttyS0,57600 root=/dev/nfs ip=bootp mem=64M@0x0 pci=firmw # At least one emulation must be selected # CONFIG_FPE_NWFPE=y +CONFIG_FPE_NWFPE_XP=y # CONFIG_FPE_FASTFPE is not set # @@ -159,6 +199,78 @@ CONFIG_BINFMT_ELF=y # # CONFIG_PM is not set +# +# Networking +# +CONFIG_NET=y + +# +# Networking options +# +CONFIG_PACKET=y +CONFIG_PACKET_MMAP=y +CONFIG_UNIX=y +# CONFIG_NET_KEY is not set +CONFIG_INET=y +# CONFIG_IP_MULTICAST is not set +# CONFIG_IP_ADVANCED_ROUTER is not set +CONFIG_IP_FIB_HASH=y +CONFIG_IP_PNP=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=y +# CONFIG_INET_AH is not set +# CONFIG_INET_ESP is not set +# CONFIG_INET_IPCOMP is not set +# CONFIG_INET_TUNNEL is not set +CONFIG_INET_DIAG=y +CONFIG_INET_TCP_DIAG=y +# CONFIG_TCP_CONG_ADVANCED is not set +CONFIG_TCP_CONG_BIC=y +# CONFIG_IPV6 is not set +# CONFIG_NETFILTER is not set + +# +# DCCP Configuration (EXPERIMENTAL) +# +# CONFIG_IP_DCCP is not set + +# +# SCTP Configuration (EXPERIMENTAL) +# +# CONFIG_IP_SCTP is not set +# CONFIG_ATM is not set +# CONFIG_BRIDGE is not set +# CONFIG_VLAN_8021Q is not set +# CONFIG_DECNET is not set +# CONFIG_LLC2 is not set +# CONFIG_IPX is not set +# CONFIG_ATALK is not set +# CONFIG_X25 is not set +# CONFIG_LAPB is not set +# CONFIG_NET_DIVERT is not set +# CONFIG_ECONET is not set +# CONFIG_WAN_ROUTER is not set + +# +# 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_HAMRADIO is not set +# CONFIG_IRDA is not set +# CONFIG_BT is not set +# CONFIG_IEEE80211 is not set + # # Device Drivers # @@ -193,6 +305,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 @@ -227,8 +340,8 @@ CONFIG_MTD_COMPLEX_MAPPINGS=y # CONFIG_MTD_PHYSMAP is not set # CONFIG_MTD_ARM_INTEGRATOR is not set CONFIG_MTD_IXP2000=y -# CONFIG_MTD_EDB7312 is not set # CONFIG_MTD_PCI is not set +# CONFIG_MTD_PLATRAM is not set # # Self-contained MTD device drivers @@ -252,6 +365,11 @@ CONFIG_MTD_IXP2000=y # # CONFIG_MTD_NAND is not set +# +# OneNAND Flash Device Drivers +# +# CONFIG_MTD_ONENAND is not set + # # Parallel port support # @@ -264,7 +382,6 @@ CONFIG_MTD_IXP2000=y # # Block devices # -# CONFIG_BLK_DEV_FD is not set # CONFIG_BLK_CPQ_DA is not set # CONFIG_BLK_CPQ_CISS_DA is not set # CONFIG_BLK_DEV_DAC960 is not set @@ -278,21 +395,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 is not set # # SCSI device support # +# CONFIG_RAID_ATTRS is not set # CONFIG_SCSI is not set # @@ -303,6 +412,7 @@ CONFIG_IOSCHED_CFQ=y # # Fusion MPT device support # +# CONFIG_FUSION is not set # # IEEE 1394 (FireWire) support @@ -315,70 +425,8 @@ CONFIG_IOSCHED_CFQ=y # CONFIG_I2O is not set # -# Networking support -# -CONFIG_NET=y - -# -# Networking options -# -CONFIG_PACKET=y -CONFIG_PACKET_MMAP=y -# CONFIG_NETLINK_DEV is not set -CONFIG_UNIX=y -# CONFIG_NET_KEY is not set -CONFIG_INET=y -# 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=y -# CONFIG_INET_AH is not set -# CONFIG_INET_ESP is not set -# CONFIG_INET_IPCOMP is not set -# CONFIG_INET_TUNNEL is not set -# CONFIG_IP_TCPDIAG is not set -# 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=y # CONFIG_BONDING is not set @@ -390,6 +438,11 @@ CONFIG_DUMMY=y # # CONFIG_ARCNET is not set +# +# PHY device support +# +# CONFIG_PHYLIB is not set + # # Ethernet (10 or 100Mbit) # @@ -397,8 +450,10 @@ CONFIG_NET_ETHERNET=y CONFIG_MII=y # CONFIG_HAPPYMEAL is not set # CONFIG_SUNGEM is not set +# CONFIG_CASSINI is not set # CONFIG_NET_VENDOR_3COM is not set # CONFIG_SMC91X is not set +# CONFIG_DM9000 is not set # # Tulip family network device support @@ -435,13 +490,17 @@ CONFIG_EEPRO100=y # CONFIG_HAMACHI is not set # CONFIG_YELLOWFIN is not set # CONFIG_R8169 is not set +# CONFIG_SIS190 is not set +# CONFIG_SKGE is not set # CONFIG_SK98LIN is not set # CONFIG_VIA_VELOCITY is not set # CONFIG_TIGON3 is not set +# CONFIG_BNX2 is not set # # Ethernet (10000 Mbit) # +# CONFIG_CHELSIO_T1 is not set # CONFIG_IXGB is not set # CONFIG_S2IO is not set @@ -459,6 +518,7 @@ CONFIG_EEPRO100=y # Wan interfaces # CONFIG_WAN=y +# CONFIG_DSCC4 is not set # CONFIG_LANMEDIA is not set # CONFIG_SYNCLINK_SYNCPPP is not set CONFIG_HDLC=y @@ -484,6 +544,8 @@ CONFIG_DLCI_MAX=8 # 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 @@ -521,7 +583,6 @@ CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 # # CONFIG_SERIO is not set # CONFIG_GAMEPORT is not set -CONFIG_SOUND_GAMEPORT=y # # Character devices @@ -534,7 +595,7 @@ CONFIG_SOUND_GAMEPORT=y # CONFIG_SERIAL_8250=y CONFIG_SERIAL_8250_CONSOLE=y -CONFIG_SERIAL_8250_NR_UARTS=2 +CONFIG_SERIAL_8250_NR_UARTS=1 # CONFIG_SERIAL_8250_EXTENDED is not set # @@ -542,6 +603,7 @@ CONFIG_SERIAL_8250_NR_UARTS=2 # CONFIG_SERIAL_CORE=y CONFIG_SERIAL_CORE_CONSOLE=y +# CONFIG_SERIAL_JSM is not set CONFIG_UNIX98_PTYS=y CONFIG_LEGACY_PTYS=y CONFIG_LEGACY_PTY_COUNT=256 @@ -584,6 +646,7 @@ CONFIG_IXP2000_WATCHDOG=y # TPM devices # # CONFIG_TCG_TPM is not set +# CONFIG_TELCLOCK is not set # # I2C support @@ -608,31 +671,51 @@ CONFIG_I2C_ALGOBIT=y # CONFIG_I2C_AMD8111 is not set # CONFIG_I2C_I801 is not set # CONFIG_I2C_I810 is not set -# CONFIG_I2C_ISA is not set -# CONFIG_I2C_IXP2000 is not set +# CONFIG_I2C_PIIX4 is not set +CONFIG_I2C_IXP2000=y # CONFIG_I2C_NFORCE2 is not set # CONFIG_I2C_PARPORT_LIGHT is not set -# CONFIG_I2C_PIIX4 is not set # CONFIG_I2C_PROSAVAGE is not set # CONFIG_I2C_SAVAGE4 is not set # CONFIG_SCx200_ACB is not set # CONFIG_I2C_SIS5595 is not set # CONFIG_I2C_SIS630 is not set # CONFIG_I2C_SIS96X is not set +# CONFIG_I2C_STUB is not set # CONFIG_I2C_VIA is not set # CONFIG_I2C_VIAPRO is not set # CONFIG_I2C_VOODOO3 is not set # CONFIG_I2C_PCA_ISA is not set # -# Hardware Sensors Chip support +# Miscellaneous I2C Chip support # -CONFIG_I2C_SENSOR=y +# CONFIG_SENSORS_DS1337 is not set +# CONFIG_SENSORS_DS1374 is not set +CONFIG_SENSORS_EEPROM=y +# 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 +# CONFIG_I2C_DEBUG_CHIP is not set + +# +# Hardware Monitoring support +# +CONFIG_HWMON=y +# CONFIG_HWMON_VID is not set # CONFIG_SENSORS_ADM1021 is not set # CONFIG_SENSORS_ADM1025 is not set # CONFIG_SENSORS_ADM1026 is not set # CONFIG_SENSORS_ADM1031 is not set +# CONFIG_SENSORS_ADM9240 is not set # CONFIG_SENSORS_ASB100 is not set +# CONFIG_SENSORS_ATXP1 is not set # CONFIG_SENSORS_DS1621 is not set # CONFIG_SENSORS_FSCHER is not set # CONFIG_SENSORS_FSCPOS is not set @@ -648,30 +731,26 @@ CONFIG_I2C_SENSOR=y # CONFIG_SENSORS_LM85 is not set # CONFIG_SENSORS_LM87 is not set # CONFIG_SENSORS_LM90 is not set +# CONFIG_SENSORS_LM92 is not set # CONFIG_SENSORS_MAX1619 is not set # CONFIG_SENSORS_PC87360 is not set -# CONFIG_SENSORS_SMSC47B397 is not set # CONFIG_SENSORS_SIS5595 is not set # CONFIG_SENSORS_SMSC47M1 is not set +# CONFIG_SENSORS_SMSC47B397 is not set # CONFIG_SENSORS_VIA686A is not set # CONFIG_SENSORS_W83781D is not set +# CONFIG_SENSORS_W83792D is not set # CONFIG_SENSORS_W83L785TS is not set # CONFIG_SENSORS_W83627HF is not set +# CONFIG_SENSORS_W83627EHF is not set +# CONFIG_HWMON_DEBUG_CHIP is not set # -# Other I2C Chip support +# Misc devices # -CONFIG_SENSORS_EEPROM=y -# CONFIG_SENSORS_PCF8574 is not set -# CONFIG_SENSORS_PCF8591 is not set -# CONFIG_SENSORS_RTC8564 is not set -# CONFIG_I2C_DEBUG_CORE is not set -# CONFIG_I2C_DEBUG_ALGO is not set -# CONFIG_I2C_DEBUG_BUS is not set -# CONFIG_I2C_DEBUG_CHIP is not set # -# Misc devices +# Multimedia Capabilities Port drivers # # @@ -701,6 +780,10 @@ CONFIG_USB_ARCH_HAS_HCD=y CONFIG_USB_ARCH_HAS_OHCI=y # CONFIG_USB is not set +# +# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' +# + # # USB Gadget Support # @@ -718,6 +801,7 @@ CONFIG_EXT2_FS=y CONFIG_EXT2_FS_XATTR=y CONFIG_EXT2_FS_POSIX_ACL=y # CONFIG_EXT2_FS_SECURITY is not set +# CONFIG_EXT2_FS_XIP is not set CONFIG_EXT3_FS=y CONFIG_EXT3_FS_XATTR=y CONFIG_EXT3_FS_POSIX_ACL=y @@ -728,17 +812,15 @@ CONFIG_FS_MBCACHE=y # CONFIG_REISERFS_FS is not set # CONFIG_JFS_FS is not set CONFIG_FS_POSIX_ACL=y - -# -# XFS support -# # CONFIG_XFS_FS is not set # CONFIG_MINIX_FS is not set # CONFIG_ROMFS_FS is not set +CONFIG_INOTIFY=y # CONFIG_QUOTA is not set CONFIG_DNOTIFY=y # CONFIG_AUTOFS_FS is not set # CONFIG_AUTOFS4_FS is not set +# CONFIG_FUSE_FS is not set # # CD-ROM/DVD Filesystems @@ -758,12 +840,10 @@ CONFIG_DNOTIFY=y # 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 # # Miscellaneous filesystems @@ -778,8 +858,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 @@ -796,12 +876,14 @@ CONFIG_JFFS2_RTIME=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 @@ -810,6 +892,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 @@ -848,6 +931,7 @@ CONFIG_MSDOS_PARTITION=y CONFIG_DEBUG_KERNEL=y CONFIG_MAGIC_SYSRQ=y CONFIG_LOG_BUF_SHIFT=14 +CONFIG_DETECT_SOFTLOCKUP=y # CONFIG_SCHEDSTATS is not set # CONFIG_DEBUG_SLAB is not set # CONFIG_DEBUG_SPINLOCK is not set @@ -856,7 +940,9 @@ CONFIG_LOG_BUF_SHIFT=14 CONFIG_DEBUG_BUGVERBOSE=y # CONFIG_DEBUG_INFO is not set # CONFIG_DEBUG_FS is not set +# CONFIG_DEBUG_VM is not set CONFIG_FRAME_POINTER=y +# CONFIG_RCU_TORTURE_TEST is not set CONFIG_DEBUG_USER=y # CONFIG_DEBUG_WAITQ is not set CONFIG_DEBUG_ERRORS=y @@ -882,6 +968,7 @@ CONFIG_DEBUG_LL=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/ixdp2401_defconfig b/arch/arm/configs/ixdp2401_defconfig index 6f51c9808..60d66e82c 100644 --- a/arch/arm/configs/ixdp2401_defconfig +++ b/arch/arm/configs/ixdp2401_defconfig @@ -1,14 +1,13 @@ # # Automatically generated make config: don't edit -# Linux kernel version: 2.6.12-rc1-bk2 -# Sun Mar 27 21:53:55 2005 +# Linux kernel version: 2.6.14-git13 +# Thu Nov 10 15:14:50 2005 # 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 @@ -16,11 +15,13 @@ CONFIG_GENERIC_IOMAP=y CONFIG_EXPERIMENTAL=y CONFIG_CLEAN_COMPILE=y CONFIG_BROKEN_ON_SMP=y +CONFIG_INIT_ENV_ARG_LIMIT=32 # # General setup # CONFIG_LOCALVERSION="" +CONFIG_LOCALVERSION_AUTO=y CONFIG_SWAP=y CONFIG_SYSVIPC=y # CONFIG_POSIX_MQUEUE is not set @@ -31,10 +32,13 @@ CONFIG_SYSCTL=y # CONFIG_HOTPLUG is not set CONFIG_KOBJECT_UEVENT=y # CONFIG_IKCONFIG is not set +CONFIG_INITRAMFS_SOURCE="" CONFIG_EMBEDDED=y CONFIG_KALLSYMS=y # CONFIG_KALLSYMS_ALL is not set # CONFIG_KALLSYMS_EXTRA_PASS is not set +CONFIG_PRINTK=y +CONFIG_BUG=y CONFIG_BASE_FULL=y CONFIG_FUTEX=y CONFIG_EPOLL=y @@ -50,7 +54,30 @@ CONFIG_BASE_SMALL=0 # # Loadable module support # -# CONFIG_MODULES is not set +CONFIG_MODULES=y +CONFIG_MODULE_UNLOAD=y +# CONFIG_MODULE_FORCE_UNLOAD is not set +CONFIG_OBSOLETE_MODPARM=y +# CONFIG_MODVERSIONS is not set +# CONFIG_MODULE_SRCVERSION_ALL is not set +CONFIG_KMOD=y + +# +# Block layer +# + +# +# IO Schedulers +# +CONFIG_IOSCHED_NOOP=y +CONFIG_IOSCHED_AS=y +CONFIG_IOSCHED_DEADLINE=y +CONFIG_IOSCHED_CFQ=y +CONFIG_DEFAULT_AS=y +# CONFIG_DEFAULT_DEADLINE is not set +# CONFIG_DEFAULT_CFQ is not set +# CONFIG_DEFAULT_NOOP is not set +CONFIG_DEFAULT_IOSCHED="anticipatory" # # System Type @@ -59,7 +86,6 @@ CONFIG_BASE_SMALL=0 # CONFIG_ARCH_CLPS711X is not set # CONFIG_ARCH_CO285 is not set # CONFIG_ARCH_EBSA110 is not set -# CONFIG_ARCH_CAMELOT is not set # CONFIG_ARCH_FOOTBRIDGE is not set # CONFIG_ARCH_INTEGRATOR is not set # CONFIG_ARCH_IOP3XX is not set @@ -74,8 +100,10 @@ CONFIG_ARCH_IXP2000=y # CONFIG_ARCH_LH7A40X is not set # CONFIG_ARCH_OMAP is not set # CONFIG_ARCH_VERSATILE is not set +# CONFIG_ARCH_REALVIEW is not set # CONFIG_ARCH_IMX is not set # CONFIG_ARCH_H720X is not set +# CONFIG_ARCH_AAEC2000 is not set CONFIG_ARCH_SUPPORTS_BIG_ENDIAN=y # @@ -91,6 +119,7 @@ CONFIG_ARCH_SUPPORTS_BIG_ENDIAN=y CONFIG_ARCH_IXDP2401=y # CONFIG_ARCH_IXDP2801 is not set CONFIG_ARCH_IXDP2X01=y +# CONFIG_IXP2000_SUPPORT_BROKEN_PCI_IO is not set # # Processor Type @@ -101,7 +130,6 @@ CONFIG_CPU_32v5=y CONFIG_CPU_ABRT_EV5T=y CONFIG_CPU_CACHE_VIVT=y CONFIG_CPU_TLB_V4WBI=y -CONFIG_CPU_MINICACHE=y # # Processor Features @@ -113,9 +141,10 @@ CONFIG_XSCALE_PMU=y # # Bus support # +CONFIG_ISA_DMA_API=y CONFIG_PCI=y CONFIG_PCI_LEGACY_PROC=y -CONFIG_PCI_NAMES=y +# CONFIG_PCI_DEBUG is not set # # PCCARD (PCMCIA/CardBus) support @@ -126,6 +155,16 @@ CONFIG_PCI_NAMES=y # Kernel Features # # CONFIG_PREEMPT is not set +# CONFIG_NO_IDLE_HZ is not set +# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set +CONFIG_SELECT_MEMORY_MODEL=y +CONFIG_FLATMEM_MANUAL=y +# CONFIG_DISCONTIGMEM_MANUAL is not set +# CONFIG_SPARSEMEM_MANUAL is not set +CONFIG_FLATMEM=y +CONFIG_FLAT_NODE_MEM_MAP=y +# CONFIG_SPARSEMEM_STATIC is not set +CONFIG_SPLIT_PTLOCK_CPUS=4096 CONFIG_ALIGNMENT_TRAP=y # @@ -133,7 +172,7 @@ CONFIG_ALIGNMENT_TRAP=y # CONFIG_ZBOOT_ROM_TEXT=0x0 CONFIG_ZBOOT_ROM_BSS=0x0 -CONFIG_CMDLINE="console=ttyS0,57600 root=/dev/nfs ip=bootp mem=64M@0x0 pci=firmware" +CONFIG_CMDLINE="console=ttyS0,115200 root=/dev/nfs ip=bootp mem=64M@0x0" # CONFIG_XIP_KERNEL is not set # @@ -144,6 +183,7 @@ CONFIG_CMDLINE="console=ttyS0,57600 root=/dev/nfs ip=bootp mem=64M@0x0 pci=firmw # At least one emulation must be selected # CONFIG_FPE_NWFPE=y +CONFIG_FPE_NWFPE_XP=y # CONFIG_FPE_FASTFPE is not set # @@ -159,6 +199,78 @@ CONFIG_BINFMT_ELF=y # # CONFIG_PM is not set +# +# Networking +# +CONFIG_NET=y + +# +# Networking options +# +CONFIG_PACKET=y +CONFIG_PACKET_MMAP=y +CONFIG_UNIX=y +# CONFIG_NET_KEY is not set +CONFIG_INET=y +# CONFIG_IP_MULTICAST is not set +# CONFIG_IP_ADVANCED_ROUTER is not set +CONFIG_IP_FIB_HASH=y +CONFIG_IP_PNP=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=y +# CONFIG_INET_AH is not set +# CONFIG_INET_ESP is not set +# CONFIG_INET_IPCOMP is not set +# CONFIG_INET_TUNNEL is not set +CONFIG_INET_DIAG=y +CONFIG_INET_TCP_DIAG=y +# CONFIG_TCP_CONG_ADVANCED is not set +CONFIG_TCP_CONG_BIC=y +# CONFIG_IPV6 is not set +# CONFIG_NETFILTER is not set + +# +# DCCP Configuration (EXPERIMENTAL) +# +# CONFIG_IP_DCCP is not set + +# +# SCTP Configuration (EXPERIMENTAL) +# +# CONFIG_IP_SCTP is not set +# CONFIG_ATM is not set +# CONFIG_BRIDGE is not set +# CONFIG_VLAN_8021Q is not set +# CONFIG_DECNET is not set +# CONFIG_LLC2 is not set +# CONFIG_IPX is not set +# CONFIG_ATALK is not set +# CONFIG_X25 is not set +# CONFIG_LAPB is not set +# CONFIG_NET_DIVERT is not set +# CONFIG_ECONET is not set +# CONFIG_WAN_ROUTER is not set + +# +# 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_HAMRADIO is not set +# CONFIG_IRDA is not set +# CONFIG_BT is not set +# CONFIG_IEEE80211 is not set + # # Device Drivers # @@ -193,6 +305,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 @@ -227,8 +340,8 @@ CONFIG_MTD_COMPLEX_MAPPINGS=y # CONFIG_MTD_PHYSMAP is not set # CONFIG_MTD_ARM_INTEGRATOR is not set CONFIG_MTD_IXP2000=y -# CONFIG_MTD_EDB7312 is not set # CONFIG_MTD_PCI is not set +# CONFIG_MTD_PLATRAM is not set # # Self-contained MTD device drivers @@ -252,6 +365,11 @@ CONFIG_MTD_IXP2000=y # # CONFIG_MTD_NAND is not set +# +# OneNAND Flash Device Drivers +# +# CONFIG_MTD_ONENAND is not set + # # Parallel port support # @@ -264,7 +382,6 @@ CONFIG_MTD_IXP2000=y # # Block devices # -# CONFIG_BLK_DEV_FD is not set # CONFIG_BLK_CPQ_DA is not set # CONFIG_BLK_CPQ_CISS_DA is not set # CONFIG_BLK_DEV_DAC960 is not set @@ -278,21 +395,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 is not set # # SCSI device support # +# CONFIG_RAID_ATTRS is not set # CONFIG_SCSI is not set # @@ -303,6 +412,7 @@ CONFIG_IOSCHED_CFQ=y # # Fusion MPT device support # +# CONFIG_FUSION is not set # # IEEE 1394 (FireWire) support @@ -315,70 +425,8 @@ CONFIG_IOSCHED_CFQ=y # CONFIG_I2O is not set # -# Networking support -# -CONFIG_NET=y - -# -# Networking options -# -CONFIG_PACKET=y -CONFIG_PACKET_MMAP=y -# CONFIG_NETLINK_DEV is not set -CONFIG_UNIX=y -# CONFIG_NET_KEY is not set -CONFIG_INET=y -# 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=y -# CONFIG_INET_AH is not set -# CONFIG_INET_ESP is not set -# CONFIG_INET_IPCOMP is not set -# CONFIG_INET_TUNNEL is not set -CONFIG_IP_TCPDIAG=y -# CONFIG_IP_TCPDIAG_IPV6 is not set -# CONFIG_IPV6 is not set -# CONFIG_NETFILTER is not set - -# -# SCTP Configuration (EXPERIMENTAL) +# 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=y # CONFIG_BONDING is not set @@ -390,6 +438,11 @@ CONFIG_DUMMY=y # # CONFIG_ARCNET is not set +# +# PHY device support +# +# CONFIG_PHYLIB is not set + # # Ethernet (10 or 100Mbit) # @@ -397,8 +450,10 @@ CONFIG_NET_ETHERNET=y CONFIG_MII=y # CONFIG_HAPPYMEAL is not set # CONFIG_SUNGEM is not set +# CONFIG_CASSINI is not set # CONFIG_NET_VENDOR_3COM is not set # CONFIG_SMC91X is not set +# CONFIG_DM9000 is not set # # Tulip family network device support @@ -436,13 +491,17 @@ CONFIG_EEPRO100=y # CONFIG_HAMACHI is not set # CONFIG_YELLOWFIN is not set # CONFIG_R8169 is not set +# CONFIG_SIS190 is not set +# CONFIG_SKGE is not set # CONFIG_SK98LIN is not set # CONFIG_VIA_VELOCITY is not set # CONFIG_TIGON3 is not set +# CONFIG_BNX2 is not set # # Ethernet (10000 Mbit) # +# CONFIG_CHELSIO_T1 is not set # CONFIG_IXGB is not set # CONFIG_S2IO is not set @@ -460,6 +519,7 @@ CONFIG_EEPRO100=y # Wan interfaces # CONFIG_WAN=y +# CONFIG_DSCC4 is not set # CONFIG_LANMEDIA is not set # CONFIG_SYNCLINK_SYNCPPP is not set CONFIG_HDLC=y @@ -485,6 +545,8 @@ CONFIG_DLCI_MAX=8 # 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 @@ -522,7 +584,6 @@ CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 # # CONFIG_SERIO is not set # CONFIG_GAMEPORT is not set -CONFIG_SOUND_GAMEPORT=y # # Character devices @@ -535,7 +596,7 @@ CONFIG_SOUND_GAMEPORT=y # CONFIG_SERIAL_8250=y CONFIG_SERIAL_8250_CONSOLE=y -CONFIG_SERIAL_8250_NR_UARTS=2 +CONFIG_SERIAL_8250_NR_UARTS=3 # CONFIG_SERIAL_8250_EXTENDED is not set # @@ -543,6 +604,7 @@ CONFIG_SERIAL_8250_NR_UARTS=2 # CONFIG_SERIAL_CORE=y CONFIG_SERIAL_CORE_CONSOLE=y +# CONFIG_SERIAL_JSM is not set CONFIG_UNIX98_PTYS=y CONFIG_LEGACY_PTYS=y CONFIG_LEGACY_PTY_COUNT=256 @@ -585,6 +647,7 @@ CONFIG_IXP2000_WATCHDOG=y # TPM devices # # CONFIG_TCG_TPM is not set +# CONFIG_TELCLOCK is not set # # I2C support @@ -609,31 +672,51 @@ CONFIG_I2C_ALGOBIT=y # CONFIG_I2C_AMD8111 is not set # CONFIG_I2C_I801 is not set # CONFIG_I2C_I810 is not set -# CONFIG_I2C_ISA is not set -# CONFIG_I2C_IXP2000 is not set +# CONFIG_I2C_PIIX4 is not set +CONFIG_I2C_IXP2000=y # CONFIG_I2C_NFORCE2 is not set # CONFIG_I2C_PARPORT_LIGHT is not set -# CONFIG_I2C_PIIX4 is not set # CONFIG_I2C_PROSAVAGE is not set # CONFIG_I2C_SAVAGE4 is not set # CONFIG_SCx200_ACB is not set # CONFIG_I2C_SIS5595 is not set # CONFIG_I2C_SIS630 is not set # CONFIG_I2C_SIS96X is not set +# CONFIG_I2C_STUB is not set # CONFIG_I2C_VIA is not set # CONFIG_I2C_VIAPRO is not set # CONFIG_I2C_VOODOO3 is not set # CONFIG_I2C_PCA_ISA is not set # -# Hardware Sensors Chip support +# Miscellaneous I2C Chip support # -CONFIG_I2C_SENSOR=y +# CONFIG_SENSORS_DS1337 is not set +# CONFIG_SENSORS_DS1374 is not set +CONFIG_SENSORS_EEPROM=y +# 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 +# CONFIG_I2C_DEBUG_CHIP is not set + +# +# Hardware Monitoring support +# +CONFIG_HWMON=y +# CONFIG_HWMON_VID is not set # CONFIG_SENSORS_ADM1021 is not set # CONFIG_SENSORS_ADM1025 is not set # CONFIG_SENSORS_ADM1026 is not set # CONFIG_SENSORS_ADM1031 is not set +# CONFIG_SENSORS_ADM9240 is not set # CONFIG_SENSORS_ASB100 is not set +# CONFIG_SENSORS_ATXP1 is not set # CONFIG_SENSORS_DS1621 is not set # CONFIG_SENSORS_FSCHER is not set # CONFIG_SENSORS_FSCPOS is not set @@ -649,30 +732,26 @@ CONFIG_I2C_SENSOR=y # CONFIG_SENSORS_LM85 is not set # CONFIG_SENSORS_LM87 is not set # CONFIG_SENSORS_LM90 is not set +# CONFIG_SENSORS_LM92 is not set # CONFIG_SENSORS_MAX1619 is not set # CONFIG_SENSORS_PC87360 is not set -# CONFIG_SENSORS_SMSC47B397 is not set # CONFIG_SENSORS_SIS5595 is not set # CONFIG_SENSORS_SMSC47M1 is not set +# CONFIG_SENSORS_SMSC47B397 is not set # CONFIG_SENSORS_VIA686A is not set # CONFIG_SENSORS_W83781D is not set +# CONFIG_SENSORS_W83792D is not set # CONFIG_SENSORS_W83L785TS is not set # CONFIG_SENSORS_W83627HF is not set +# CONFIG_SENSORS_W83627EHF is not set +# CONFIG_HWMON_DEBUG_CHIP is not set # -# Other I2C Chip support +# Misc devices # -CONFIG_SENSORS_EEPROM=y -# CONFIG_SENSORS_PCF8574 is not set -# CONFIG_SENSORS_PCF8591 is not set -# CONFIG_SENSORS_RTC8564 is not set -# CONFIG_I2C_DEBUG_CORE is not set -# CONFIG_I2C_DEBUG_ALGO is not set -# CONFIG_I2C_DEBUG_BUS is not set -# CONFIG_I2C_DEBUG_CHIP is not set # -# Misc devices +# Multimedia Capabilities Port drivers # # @@ -702,6 +781,10 @@ CONFIG_USB_ARCH_HAS_HCD=y CONFIG_USB_ARCH_HAS_OHCI=y # CONFIG_USB is not set +# +# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' +# + # # USB Gadget Support # @@ -719,6 +802,7 @@ CONFIG_EXT2_FS=y CONFIG_EXT2_FS_XATTR=y CONFIG_EXT2_FS_POSIX_ACL=y # CONFIG_EXT2_FS_SECURITY is not set +# CONFIG_EXT2_FS_XIP is not set CONFIG_EXT3_FS=y CONFIG_EXT3_FS_XATTR=y CONFIG_EXT3_FS_POSIX_ACL=y @@ -729,17 +813,15 @@ CONFIG_FS_MBCACHE=y # CONFIG_REISERFS_FS is not set # CONFIG_JFS_FS is not set CONFIG_FS_POSIX_ACL=y - -# -# XFS support -# # CONFIG_XFS_FS is not set # CONFIG_MINIX_FS is not set # CONFIG_ROMFS_FS is not set +CONFIG_INOTIFY=y # CONFIG_QUOTA is not set CONFIG_DNOTIFY=y # CONFIG_AUTOFS_FS is not set # CONFIG_AUTOFS4_FS is not set +# CONFIG_FUSE_FS is not set # # CD-ROM/DVD Filesystems @@ -759,12 +841,10 @@ CONFIG_DNOTIFY=y # 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 # # Miscellaneous filesystems @@ -779,8 +859,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 @@ -797,12 +877,14 @@ CONFIG_JFFS2_RTIME=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 @@ -811,6 +893,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 @@ -849,6 +932,7 @@ CONFIG_MSDOS_PARTITION=y CONFIG_DEBUG_KERNEL=y CONFIG_MAGIC_SYSRQ=y CONFIG_LOG_BUF_SHIFT=14 +CONFIG_DETECT_SOFTLOCKUP=y # CONFIG_SCHEDSTATS is not set # CONFIG_DEBUG_SLAB is not set # CONFIG_DEBUG_SPINLOCK is not set @@ -857,7 +941,9 @@ CONFIG_LOG_BUF_SHIFT=14 CONFIG_DEBUG_BUGVERBOSE=y # CONFIG_DEBUG_INFO is not set # CONFIG_DEBUG_FS is not set +# CONFIG_DEBUG_VM is not set CONFIG_FRAME_POINTER=y +# CONFIG_RCU_TORTURE_TEST is not set CONFIG_DEBUG_USER=y # CONFIG_DEBUG_WAITQ is not set CONFIG_DEBUG_ERRORS=y @@ -883,6 +969,7 @@ CONFIG_DEBUG_LL=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/ixdp2800_defconfig b/arch/arm/configs/ixdp2800_defconfig index 7be3521f9..424812381 100644 --- a/arch/arm/configs/ixdp2800_defconfig +++ b/arch/arm/configs/ixdp2800_defconfig @@ -1,14 +1,13 @@ # # Automatically generated make config: don't edit -# Linux kernel version: 2.6.12-rc1-bk2 -# Sun Mar 27 22:15:23 2005 +# Linux kernel version: 2.6.14-git13 +# Thu Nov 10 15:14:56 2005 # 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 @@ -16,11 +15,13 @@ CONFIG_GENERIC_IOMAP=y CONFIG_EXPERIMENTAL=y CONFIG_CLEAN_COMPILE=y CONFIG_BROKEN_ON_SMP=y +CONFIG_INIT_ENV_ARG_LIMIT=32 # # General setup # CONFIG_LOCALVERSION="" +CONFIG_LOCALVERSION_AUTO=y CONFIG_SWAP=y CONFIG_SYSVIPC=y # CONFIG_POSIX_MQUEUE is not set @@ -31,10 +32,13 @@ CONFIG_SYSCTL=y # CONFIG_HOTPLUG is not set CONFIG_KOBJECT_UEVENT=y # CONFIG_IKCONFIG is not set +CONFIG_INITRAMFS_SOURCE="" CONFIG_EMBEDDED=y CONFIG_KALLSYMS=y # CONFIG_KALLSYMS_ALL is not set # CONFIG_KALLSYMS_EXTRA_PASS is not set +CONFIG_PRINTK=y +CONFIG_BUG=y CONFIG_BASE_FULL=y CONFIG_FUTEX=y CONFIG_EPOLL=y @@ -50,7 +54,30 @@ CONFIG_BASE_SMALL=0 # # Loadable module support # -# CONFIG_MODULES is not set +CONFIG_MODULES=y +CONFIG_MODULE_UNLOAD=y +# CONFIG_MODULE_FORCE_UNLOAD is not set +CONFIG_OBSOLETE_MODPARM=y +# CONFIG_MODVERSIONS is not set +# CONFIG_MODULE_SRCVERSION_ALL is not set +CONFIG_KMOD=y + +# +# Block layer +# + +# +# IO Schedulers +# +CONFIG_IOSCHED_NOOP=y +CONFIG_IOSCHED_AS=y +CONFIG_IOSCHED_DEADLINE=y +CONFIG_IOSCHED_CFQ=y +CONFIG_DEFAULT_AS=y +# CONFIG_DEFAULT_DEADLINE is not set +# CONFIG_DEFAULT_CFQ is not set +# CONFIG_DEFAULT_NOOP is not set +CONFIG_DEFAULT_IOSCHED="anticipatory" # # System Type @@ -59,7 +86,6 @@ CONFIG_BASE_SMALL=0 # CONFIG_ARCH_CLPS711X is not set # CONFIG_ARCH_CO285 is not set # CONFIG_ARCH_EBSA110 is not set -# CONFIG_ARCH_CAMELOT is not set # CONFIG_ARCH_FOOTBRIDGE is not set # CONFIG_ARCH_INTEGRATOR is not set # CONFIG_ARCH_IOP3XX is not set @@ -74,8 +100,10 @@ CONFIG_ARCH_IXP2000=y # CONFIG_ARCH_LH7A40X is not set # CONFIG_ARCH_OMAP is not set # CONFIG_ARCH_VERSATILE is not set +# CONFIG_ARCH_REALVIEW is not set # CONFIG_ARCH_IMX is not set # CONFIG_ARCH_H720X is not set +# CONFIG_ARCH_AAEC2000 is not set CONFIG_ARCH_SUPPORTS_BIG_ENDIAN=y # @@ -91,6 +119,7 @@ CONFIG_ARCH_IXDP2800=y CONFIG_ARCH_IXDP2X00=y # CONFIG_ARCH_IXDP2401 is not set # CONFIG_ARCH_IXDP2801 is not set +# CONFIG_IXP2000_SUPPORT_BROKEN_PCI_IO is not set # # Processor Type @@ -101,7 +130,6 @@ CONFIG_CPU_32v5=y CONFIG_CPU_ABRT_EV5T=y CONFIG_CPU_CACHE_VIVT=y CONFIG_CPU_TLB_V4WBI=y -CONFIG_CPU_MINICACHE=y # # Processor Features @@ -113,9 +141,10 @@ CONFIG_XSCALE_PMU=y # # Bus support # +CONFIG_ISA_DMA_API=y CONFIG_PCI=y CONFIG_PCI_LEGACY_PROC=y -CONFIG_PCI_NAMES=y +# CONFIG_PCI_DEBUG is not set # # PCCARD (PCMCIA/CardBus) support @@ -126,6 +155,16 @@ CONFIG_PCI_NAMES=y # Kernel Features # # CONFIG_PREEMPT is not set +# CONFIG_NO_IDLE_HZ is not set +# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set +CONFIG_SELECT_MEMORY_MODEL=y +CONFIG_FLATMEM_MANUAL=y +# CONFIG_DISCONTIGMEM_MANUAL is not set +# CONFIG_SPARSEMEM_MANUAL is not set +CONFIG_FLATMEM=y +CONFIG_FLAT_NODE_MEM_MAP=y +# CONFIG_SPARSEMEM_STATIC is not set +CONFIG_SPLIT_PTLOCK_CPUS=4096 CONFIG_ALIGNMENT_TRAP=y # @@ -144,6 +183,7 @@ CONFIG_CMDLINE="console=ttyS0,9600 root=/dev/nfs ip=bootp mem=64M@0x0" # At least one emulation must be selected # CONFIG_FPE_NWFPE=y +CONFIG_FPE_NWFPE_XP=y # CONFIG_FPE_FASTFPE is not set # @@ -159,6 +199,78 @@ CONFIG_BINFMT_ELF=y # # CONFIG_PM is not set +# +# Networking +# +CONFIG_NET=y + +# +# Networking options +# +CONFIG_PACKET=y +CONFIG_PACKET_MMAP=y +CONFIG_UNIX=y +# CONFIG_NET_KEY is not set +CONFIG_INET=y +# CONFIG_IP_MULTICAST is not set +# CONFIG_IP_ADVANCED_ROUTER is not set +CONFIG_IP_FIB_HASH=y +CONFIG_IP_PNP=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=y +# CONFIG_INET_AH is not set +# CONFIG_INET_ESP is not set +# CONFIG_INET_IPCOMP is not set +# CONFIG_INET_TUNNEL is not set +CONFIG_INET_DIAG=y +CONFIG_INET_TCP_DIAG=y +# CONFIG_TCP_CONG_ADVANCED is not set +CONFIG_TCP_CONG_BIC=y +# CONFIG_IPV6 is not set +# CONFIG_NETFILTER is not set + +# +# DCCP Configuration (EXPERIMENTAL) +# +# CONFIG_IP_DCCP is not set + +# +# SCTP Configuration (EXPERIMENTAL) +# +# CONFIG_IP_SCTP is not set +# CONFIG_ATM is not set +# CONFIG_BRIDGE is not set +# CONFIG_VLAN_8021Q is not set +# CONFIG_DECNET is not set +# CONFIG_LLC2 is not set +# CONFIG_IPX is not set +# CONFIG_ATALK is not set +# CONFIG_X25 is not set +# CONFIG_LAPB is not set +# CONFIG_NET_DIVERT is not set +# CONFIG_ECONET is not set +# CONFIG_WAN_ROUTER is not set + +# +# 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_HAMRADIO is not set +# CONFIG_IRDA is not set +# CONFIG_BT is not set +# CONFIG_IEEE80211 is not set + # # Device Drivers # @@ -193,6 +305,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 @@ -227,8 +340,8 @@ CONFIG_MTD_COMPLEX_MAPPINGS=y # CONFIG_MTD_PHYSMAP is not set # CONFIG_MTD_ARM_INTEGRATOR is not set CONFIG_MTD_IXP2000=y -# CONFIG_MTD_EDB7312 is not set # CONFIG_MTD_PCI is not set +# CONFIG_MTD_PLATRAM is not set # # Self-contained MTD device drivers @@ -252,6 +365,11 @@ CONFIG_MTD_IXP2000=y # # CONFIG_MTD_NAND is not set +# +# OneNAND Flash Device Drivers +# +# CONFIG_MTD_ONENAND is not set + # # Parallel port support # @@ -264,7 +382,6 @@ CONFIG_MTD_IXP2000=y # # Block devices # -# CONFIG_BLK_DEV_FD is not set # CONFIG_BLK_CPQ_DA is not set # CONFIG_BLK_CPQ_CISS_DA is not set # CONFIG_BLK_DEV_DAC960 is not set @@ -278,21 +395,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 is not set # # SCSI device support # +# CONFIG_RAID_ATTRS is not set # CONFIG_SCSI is not set # @@ -303,6 +412,7 @@ CONFIG_IOSCHED_CFQ=y # # Fusion MPT device support # +# CONFIG_FUSION is not set # # IEEE 1394 (FireWire) support @@ -315,70 +425,8 @@ CONFIG_IOSCHED_CFQ=y # CONFIG_I2O is not set # -# Networking support -# -CONFIG_NET=y - -# -# Networking options -# -CONFIG_PACKET=y -CONFIG_PACKET_MMAP=y -# CONFIG_NETLINK_DEV is not set -CONFIG_UNIX=y -# CONFIG_NET_KEY is not set -CONFIG_INET=y -# 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=y -# CONFIG_INET_AH is not set -# CONFIG_INET_ESP is not set -# CONFIG_INET_IPCOMP is not set -# CONFIG_INET_TUNNEL is not set -# CONFIG_IP_TCPDIAG is not set -# 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=y # CONFIG_BONDING is not set @@ -390,6 +438,11 @@ CONFIG_DUMMY=y # # CONFIG_ARCNET is not set +# +# PHY device support +# +# CONFIG_PHYLIB is not set + # # Ethernet (10 or 100Mbit) # @@ -397,8 +450,10 @@ CONFIG_NET_ETHERNET=y CONFIG_MII=y # CONFIG_HAPPYMEAL is not set # CONFIG_SUNGEM is not set +# CONFIG_CASSINI is not set # CONFIG_NET_VENDOR_3COM is not set # CONFIG_SMC91X is not set +# CONFIG_DM9000 is not set # # Tulip family network device support @@ -435,13 +490,17 @@ CONFIG_EEPRO100=y # CONFIG_HAMACHI is not set # CONFIG_YELLOWFIN is not set # CONFIG_R8169 is not set +# CONFIG_SIS190 is not set +# CONFIG_SKGE is not set # CONFIG_SK98LIN is not set # CONFIG_VIA_VELOCITY is not set # CONFIG_TIGON3 is not set +# CONFIG_BNX2 is not set # # Ethernet (10000 Mbit) # +# CONFIG_CHELSIO_T1 is not set # CONFIG_IXGB is not set # CONFIG_S2IO is not set @@ -459,6 +518,7 @@ CONFIG_EEPRO100=y # Wan interfaces # CONFIG_WAN=y +# CONFIG_DSCC4 is not set # CONFIG_LANMEDIA is not set # CONFIG_SYNCLINK_SYNCPPP is not set CONFIG_HDLC=y @@ -484,6 +544,8 @@ CONFIG_DLCI_MAX=8 # 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 @@ -521,7 +583,6 @@ CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 # # CONFIG_SERIO is not set # CONFIG_GAMEPORT is not set -CONFIG_SOUND_GAMEPORT=y # # Character devices @@ -534,7 +595,7 @@ CONFIG_SOUND_GAMEPORT=y # CONFIG_SERIAL_8250=y CONFIG_SERIAL_8250_CONSOLE=y -CONFIG_SERIAL_8250_NR_UARTS=2 +CONFIG_SERIAL_8250_NR_UARTS=1 # CONFIG_SERIAL_8250_EXTENDED is not set # @@ -542,6 +603,7 @@ CONFIG_SERIAL_8250_NR_UARTS=2 # CONFIG_SERIAL_CORE=y CONFIG_SERIAL_CORE_CONSOLE=y +# CONFIG_SERIAL_JSM is not set CONFIG_UNIX98_PTYS=y CONFIG_LEGACY_PTYS=y CONFIG_LEGACY_PTY_COUNT=256 @@ -584,6 +646,7 @@ CONFIG_IXP2000_WATCHDOG=y # TPM devices # # CONFIG_TCG_TPM is not set +# CONFIG_TELCLOCK is not set # # I2C support @@ -608,31 +671,51 @@ CONFIG_I2C_ALGOBIT=y # CONFIG_I2C_AMD8111 is not set # CONFIG_I2C_I801 is not set # CONFIG_I2C_I810 is not set -# CONFIG_I2C_ISA is not set -# CONFIG_I2C_IXP2000 is not set +# CONFIG_I2C_PIIX4 is not set +CONFIG_I2C_IXP2000=y # CONFIG_I2C_NFORCE2 is not set # CONFIG_I2C_PARPORT_LIGHT is not set -# CONFIG_I2C_PIIX4 is not set # CONFIG_I2C_PROSAVAGE is not set # CONFIG_I2C_SAVAGE4 is not set # CONFIG_SCx200_ACB is not set # CONFIG_I2C_SIS5595 is not set # CONFIG_I2C_SIS630 is not set # CONFIG_I2C_SIS96X is not set +# CONFIG_I2C_STUB is not set # CONFIG_I2C_VIA is not set # CONFIG_I2C_VIAPRO is not set # CONFIG_I2C_VOODOO3 is not set # CONFIG_I2C_PCA_ISA is not set # -# Hardware Sensors Chip support +# Miscellaneous I2C Chip support # -CONFIG_I2C_SENSOR=y +# CONFIG_SENSORS_DS1337 is not set +# CONFIG_SENSORS_DS1374 is not set +CONFIG_SENSORS_EEPROM=y +# 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 +# CONFIG_I2C_DEBUG_CHIP is not set + +# +# Hardware Monitoring support +# +CONFIG_HWMON=y +# CONFIG_HWMON_VID is not set # CONFIG_SENSORS_ADM1021 is not set # CONFIG_SENSORS_ADM1025 is not set # CONFIG_SENSORS_ADM1026 is not set # CONFIG_SENSORS_ADM1031 is not set +# CONFIG_SENSORS_ADM9240 is not set # CONFIG_SENSORS_ASB100 is not set +# CONFIG_SENSORS_ATXP1 is not set # CONFIG_SENSORS_DS1621 is not set # CONFIG_SENSORS_FSCHER is not set # CONFIG_SENSORS_FSCPOS is not set @@ -648,30 +731,26 @@ CONFIG_I2C_SENSOR=y # CONFIG_SENSORS_LM85 is not set # CONFIG_SENSORS_LM87 is not set # CONFIG_SENSORS_LM90 is not set +# CONFIG_SENSORS_LM92 is not set # CONFIG_SENSORS_MAX1619 is not set # CONFIG_SENSORS_PC87360 is not set -# CONFIG_SENSORS_SMSC47B397 is not set # CONFIG_SENSORS_SIS5595 is not set # CONFIG_SENSORS_SMSC47M1 is not set +# CONFIG_SENSORS_SMSC47B397 is not set # CONFIG_SENSORS_VIA686A is not set # CONFIG_SENSORS_W83781D is not set +# CONFIG_SENSORS_W83792D is not set # CONFIG_SENSORS_W83L785TS is not set # CONFIG_SENSORS_W83627HF is not set +# CONFIG_SENSORS_W83627EHF is not set +# CONFIG_HWMON_DEBUG_CHIP is not set # -# Other I2C Chip support +# Misc devices # -CONFIG_SENSORS_EEPROM=y -# CONFIG_SENSORS_PCF8574 is not set -# CONFIG_SENSORS_PCF8591 is not set -# CONFIG_SENSORS_RTC8564 is not set -# CONFIG_I2C_DEBUG_CORE is not set -# CONFIG_I2C_DEBUG_ALGO is not set -# CONFIG_I2C_DEBUG_BUS is not set -# CONFIG_I2C_DEBUG_CHIP is not set # -# Misc devices +# Multimedia Capabilities Port drivers # # @@ -701,6 +780,10 @@ CONFIG_USB_ARCH_HAS_HCD=y CONFIG_USB_ARCH_HAS_OHCI=y # CONFIG_USB is not set +# +# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' +# + # # USB Gadget Support # @@ -718,6 +801,7 @@ CONFIG_EXT2_FS=y CONFIG_EXT2_FS_XATTR=y CONFIG_EXT2_FS_POSIX_ACL=y # CONFIG_EXT2_FS_SECURITY is not set +# CONFIG_EXT2_FS_XIP is not set CONFIG_EXT3_FS=y CONFIG_EXT3_FS_XATTR=y CONFIG_EXT3_FS_POSIX_ACL=y @@ -728,17 +812,15 @@ CONFIG_FS_MBCACHE=y # CONFIG_REISERFS_FS is not set # CONFIG_JFS_FS is not set CONFIG_FS_POSIX_ACL=y - -# -# XFS support -# # CONFIG_XFS_FS is not set # CONFIG_MINIX_FS is not set # CONFIG_ROMFS_FS is not set +CONFIG_INOTIFY=y # CONFIG_QUOTA is not set CONFIG_DNOTIFY=y # CONFIG_AUTOFS_FS is not set # CONFIG_AUTOFS4_FS is not set +# CONFIG_FUSE_FS is not set # # CD-ROM/DVD Filesystems @@ -758,12 +840,10 @@ CONFIG_DNOTIFY=y # 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 # # Miscellaneous filesystems @@ -778,8 +858,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 @@ -796,12 +876,14 @@ CONFIG_JFFS2_RTIME=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 @@ -810,6 +892,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 @@ -848,6 +931,7 @@ CONFIG_MSDOS_PARTITION=y CONFIG_DEBUG_KERNEL=y CONFIG_MAGIC_SYSRQ=y CONFIG_LOG_BUF_SHIFT=14 +CONFIG_DETECT_SOFTLOCKUP=y # CONFIG_SCHEDSTATS is not set # CONFIG_DEBUG_SLAB is not set # CONFIG_DEBUG_SPINLOCK is not set @@ -856,7 +940,9 @@ CONFIG_LOG_BUF_SHIFT=14 CONFIG_DEBUG_BUGVERBOSE=y # CONFIG_DEBUG_INFO is not set # CONFIG_DEBUG_FS is not set +# CONFIG_DEBUG_VM is not set CONFIG_FRAME_POINTER=y +# CONFIG_RCU_TORTURE_TEST is not set CONFIG_DEBUG_USER=y # CONFIG_DEBUG_WAITQ is not set CONFIG_DEBUG_ERRORS=y @@ -882,6 +968,7 @@ CONFIG_DEBUG_LL=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/ixdp2801_defconfig b/arch/arm/configs/ixdp2801_defconfig index cd84a20f3..f54f3dcc5 100644 --- a/arch/arm/configs/ixdp2801_defconfig +++ b/arch/arm/configs/ixdp2801_defconfig @@ -1,14 +1,13 @@ # # Automatically generated make config: don't edit -# Linux kernel version: 2.6.12-rc1-bk2 -# Sun Mar 27 22:39:19 2005 +# Linux kernel version: 2.6.14-git13 +# Thu Nov 10 15:15:03 2005 # 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 @@ -16,11 +15,13 @@ CONFIG_GENERIC_IOMAP=y CONFIG_EXPERIMENTAL=y CONFIG_CLEAN_COMPILE=y CONFIG_BROKEN_ON_SMP=y +CONFIG_INIT_ENV_ARG_LIMIT=32 # # General setup # CONFIG_LOCALVERSION="" +CONFIG_LOCALVERSION_AUTO=y CONFIG_SWAP=y CONFIG_SYSVIPC=y # CONFIG_POSIX_MQUEUE is not set @@ -31,10 +32,13 @@ CONFIG_SYSCTL=y # CONFIG_HOTPLUG is not set CONFIG_KOBJECT_UEVENT=y # CONFIG_IKCONFIG is not set +CONFIG_INITRAMFS_SOURCE="" CONFIG_EMBEDDED=y CONFIG_KALLSYMS=y # CONFIG_KALLSYMS_ALL is not set # CONFIG_KALLSYMS_EXTRA_PASS is not set +CONFIG_PRINTK=y +CONFIG_BUG=y CONFIG_BASE_FULL=y CONFIG_FUTEX=y CONFIG_EPOLL=y @@ -50,7 +54,30 @@ CONFIG_BASE_SMALL=0 # # Loadable module support # -# CONFIG_MODULES is not set +CONFIG_MODULES=y +CONFIG_MODULE_UNLOAD=y +# CONFIG_MODULE_FORCE_UNLOAD is not set +CONFIG_OBSOLETE_MODPARM=y +# CONFIG_MODVERSIONS is not set +# CONFIG_MODULE_SRCVERSION_ALL is not set +CONFIG_KMOD=y + +# +# Block layer +# + +# +# IO Schedulers +# +CONFIG_IOSCHED_NOOP=y +CONFIG_IOSCHED_AS=y +CONFIG_IOSCHED_DEADLINE=y +CONFIG_IOSCHED_CFQ=y +CONFIG_DEFAULT_AS=y +# CONFIG_DEFAULT_DEADLINE is not set +# CONFIG_DEFAULT_CFQ is not set +# CONFIG_DEFAULT_NOOP is not set +CONFIG_DEFAULT_IOSCHED="anticipatory" # # System Type @@ -59,7 +86,6 @@ CONFIG_BASE_SMALL=0 # CONFIG_ARCH_CLPS711X is not set # CONFIG_ARCH_CO285 is not set # CONFIG_ARCH_EBSA110 is not set -# CONFIG_ARCH_CAMELOT is not set # CONFIG_ARCH_FOOTBRIDGE is not set # CONFIG_ARCH_INTEGRATOR is not set # CONFIG_ARCH_IOP3XX is not set @@ -74,8 +100,10 @@ CONFIG_ARCH_IXP2000=y # CONFIG_ARCH_LH7A40X is not set # CONFIG_ARCH_OMAP is not set # CONFIG_ARCH_VERSATILE is not set +# CONFIG_ARCH_REALVIEW is not set # CONFIG_ARCH_IMX is not set # CONFIG_ARCH_H720X is not set +# CONFIG_ARCH_AAEC2000 is not set CONFIG_ARCH_SUPPORTS_BIG_ENDIAN=y # @@ -91,6 +119,7 @@ CONFIG_ARCH_SUPPORTS_BIG_ENDIAN=y # CONFIG_ARCH_IXDP2401 is not set CONFIG_ARCH_IXDP2801=y CONFIG_ARCH_IXDP2X01=y +# CONFIG_IXP2000_SUPPORT_BROKEN_PCI_IO is not set # # Processor Type @@ -101,7 +130,6 @@ CONFIG_CPU_32v5=y CONFIG_CPU_ABRT_EV5T=y CONFIG_CPU_CACHE_VIVT=y CONFIG_CPU_TLB_V4WBI=y -CONFIG_CPU_MINICACHE=y # # Processor Features @@ -113,9 +141,10 @@ CONFIG_XSCALE_PMU=y # # Bus support # +CONFIG_ISA_DMA_API=y CONFIG_PCI=y CONFIG_PCI_LEGACY_PROC=y -CONFIG_PCI_NAMES=y +# CONFIG_PCI_DEBUG is not set # # PCCARD (PCMCIA/CardBus) support @@ -126,6 +155,16 @@ CONFIG_PCI_NAMES=y # Kernel Features # # CONFIG_PREEMPT is not set +# CONFIG_NO_IDLE_HZ is not set +# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set +CONFIG_SELECT_MEMORY_MODEL=y +CONFIG_FLATMEM_MANUAL=y +# CONFIG_DISCONTIGMEM_MANUAL is not set +# CONFIG_SPARSEMEM_MANUAL is not set +CONFIG_FLATMEM=y +CONFIG_FLAT_NODE_MEM_MAP=y +# CONFIG_SPARSEMEM_STATIC is not set +CONFIG_SPLIT_PTLOCK_CPUS=4096 CONFIG_ALIGNMENT_TRAP=y # @@ -133,7 +172,7 @@ CONFIG_ALIGNMENT_TRAP=y # CONFIG_ZBOOT_ROM_TEXT=0x0 CONFIG_ZBOOT_ROM_BSS=0x0 -CONFIG_CMDLINE="console=ttyS0,115200 root=/dev/nfs ip=bootp mem=64M@0x0 pci=firmware ixdp2x01_clock=50000000" +CONFIG_CMDLINE="console=ttyS0,115200 root=/dev/nfs ip=bootp mem=64M@0x0" # CONFIG_XIP_KERNEL is not set # @@ -144,6 +183,7 @@ CONFIG_CMDLINE="console=ttyS0,115200 root=/dev/nfs ip=bootp mem=64M@0x0 pci=firm # At least one emulation must be selected # CONFIG_FPE_NWFPE=y +CONFIG_FPE_NWFPE_XP=y # CONFIG_FPE_FASTFPE is not set # @@ -159,6 +199,78 @@ CONFIG_BINFMT_ELF=y # # CONFIG_PM is not set +# +# Networking +# +CONFIG_NET=y + +# +# Networking options +# +CONFIG_PACKET=y +CONFIG_PACKET_MMAP=y +CONFIG_UNIX=y +# CONFIG_NET_KEY is not set +CONFIG_INET=y +# CONFIG_IP_MULTICAST is not set +# CONFIG_IP_ADVANCED_ROUTER is not set +CONFIG_IP_FIB_HASH=y +CONFIG_IP_PNP=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=y +# CONFIG_INET_AH is not set +# CONFIG_INET_ESP is not set +# CONFIG_INET_IPCOMP is not set +# CONFIG_INET_TUNNEL is not set +CONFIG_INET_DIAG=y +CONFIG_INET_TCP_DIAG=y +# CONFIG_TCP_CONG_ADVANCED is not set +CONFIG_TCP_CONG_BIC=y +# CONFIG_IPV6 is not set +# CONFIG_NETFILTER is not set + +# +# DCCP Configuration (EXPERIMENTAL) +# +# CONFIG_IP_DCCP is not set + +# +# SCTP Configuration (EXPERIMENTAL) +# +# CONFIG_IP_SCTP is not set +# CONFIG_ATM is not set +# CONFIG_BRIDGE is not set +# CONFIG_VLAN_8021Q is not set +# CONFIG_DECNET is not set +# CONFIG_LLC2 is not set +# CONFIG_IPX is not set +# CONFIG_ATALK is not set +# CONFIG_X25 is not set +# CONFIG_LAPB is not set +# CONFIG_NET_DIVERT is not set +# CONFIG_ECONET is not set +# CONFIG_WAN_ROUTER is not set + +# +# 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_HAMRADIO is not set +# CONFIG_IRDA is not set +# CONFIG_BT is not set +# CONFIG_IEEE80211 is not set + # # Device Drivers # @@ -193,6 +305,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 @@ -227,8 +340,8 @@ CONFIG_MTD_COMPLEX_MAPPINGS=y # CONFIG_MTD_PHYSMAP is not set # CONFIG_MTD_ARM_INTEGRATOR is not set CONFIG_MTD_IXP2000=y -# CONFIG_MTD_EDB7312 is not set # CONFIG_MTD_PCI is not set +# CONFIG_MTD_PLATRAM is not set # # Self-contained MTD device drivers @@ -252,6 +365,11 @@ CONFIG_MTD_IXP2000=y # # CONFIG_MTD_NAND is not set +# +# OneNAND Flash Device Drivers +# +# CONFIG_MTD_ONENAND is not set + # # Parallel port support # @@ -264,7 +382,6 @@ CONFIG_MTD_IXP2000=y # # Block devices # -# CONFIG_BLK_DEV_FD is not set # CONFIG_BLK_CPQ_DA is not set # CONFIG_BLK_CPQ_CISS_DA is not set # CONFIG_BLK_DEV_DAC960 is not set @@ -278,21 +395,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 is not set # # SCSI device support # +# CONFIG_RAID_ATTRS is not set # CONFIG_SCSI is not set # @@ -303,6 +412,7 @@ CONFIG_IOSCHED_CFQ=y # # Fusion MPT device support # +# CONFIG_FUSION is not set # # IEEE 1394 (FireWire) support @@ -315,70 +425,8 @@ CONFIG_IOSCHED_CFQ=y # CONFIG_I2O is not set # -# Networking support -# -CONFIG_NET=y - -# -# Networking options -# -CONFIG_PACKET=y -CONFIG_PACKET_MMAP=y -# CONFIG_NETLINK_DEV is not set -CONFIG_UNIX=y -# CONFIG_NET_KEY is not set -CONFIG_INET=y -# 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=y -# CONFIG_INET_AH is not set -# CONFIG_INET_ESP is not set -# CONFIG_INET_IPCOMP is not set -# CONFIG_INET_TUNNEL is not set -# CONFIG_IP_TCPDIAG is not set -# 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=y # CONFIG_BONDING is not set @@ -390,6 +438,11 @@ CONFIG_DUMMY=y # # CONFIG_ARCNET is not set +# +# PHY device support +# +# CONFIG_PHYLIB is not set + # # Ethernet (10 or 100Mbit) # @@ -397,8 +450,10 @@ CONFIG_NET_ETHERNET=y CONFIG_MII=y # CONFIG_HAPPYMEAL is not set # CONFIG_SUNGEM is not set +# CONFIG_CASSINI is not set # CONFIG_NET_VENDOR_3COM is not set # CONFIG_SMC91X is not set +# CONFIG_DM9000 is not set # # Tulip family network device support @@ -436,13 +491,17 @@ CONFIG_EEPRO100=y # CONFIG_HAMACHI is not set # CONFIG_YELLOWFIN is not set # CONFIG_R8169 is not set +# CONFIG_SIS190 is not set +# CONFIG_SKGE is not set # CONFIG_SK98LIN is not set # CONFIG_VIA_VELOCITY is not set # CONFIG_TIGON3 is not set +# CONFIG_BNX2 is not set # # Ethernet (10000 Mbit) # +# CONFIG_CHELSIO_T1 is not set # CONFIG_IXGB is not set # CONFIG_S2IO is not set @@ -460,6 +519,7 @@ CONFIG_EEPRO100=y # Wan interfaces # CONFIG_WAN=y +# CONFIG_DSCC4 is not set # CONFIG_LANMEDIA is not set # CONFIG_SYNCLINK_SYNCPPP is not set CONFIG_HDLC=y @@ -485,6 +545,8 @@ CONFIG_DLCI_MAX=8 # 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 @@ -522,7 +584,6 @@ CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 # # CONFIG_SERIO is not set # CONFIG_GAMEPORT is not set -CONFIG_SOUND_GAMEPORT=y # # Character devices @@ -535,7 +596,7 @@ CONFIG_SOUND_GAMEPORT=y # CONFIG_SERIAL_8250=y CONFIG_SERIAL_8250_CONSOLE=y -CONFIG_SERIAL_8250_NR_UARTS=2 +CONFIG_SERIAL_8250_NR_UARTS=3 # CONFIG_SERIAL_8250_EXTENDED is not set # @@ -543,6 +604,7 @@ CONFIG_SERIAL_8250_NR_UARTS=2 # CONFIG_SERIAL_CORE=y CONFIG_SERIAL_CORE_CONSOLE=y +# CONFIG_SERIAL_JSM is not set CONFIG_UNIX98_PTYS=y CONFIG_LEGACY_PTYS=y CONFIG_LEGACY_PTY_COUNT=256 @@ -585,6 +647,7 @@ CONFIG_IXP2000_WATCHDOG=y # TPM devices # # CONFIG_TCG_TPM is not set +# CONFIG_TELCLOCK is not set # # I2C support @@ -609,31 +672,51 @@ CONFIG_I2C_ALGOBIT=y # CONFIG_I2C_AMD8111 is not set # CONFIG_I2C_I801 is not set # CONFIG_I2C_I810 is not set -# CONFIG_I2C_ISA is not set -# CONFIG_I2C_IXP2000 is not set +# CONFIG_I2C_PIIX4 is not set +CONFIG_I2C_IXP2000=y # CONFIG_I2C_NFORCE2 is not set # CONFIG_I2C_PARPORT_LIGHT is not set -# CONFIG_I2C_PIIX4 is not set # CONFIG_I2C_PROSAVAGE is not set # CONFIG_I2C_SAVAGE4 is not set # CONFIG_SCx200_ACB is not set # CONFIG_I2C_SIS5595 is not set # CONFIG_I2C_SIS630 is not set # CONFIG_I2C_SIS96X is not set +# CONFIG_I2C_STUB is not set # CONFIG_I2C_VIA is not set # CONFIG_I2C_VIAPRO is not set # CONFIG_I2C_VOODOO3 is not set # CONFIG_I2C_PCA_ISA is not set # -# Hardware Sensors Chip support +# Miscellaneous I2C Chip support # -CONFIG_I2C_SENSOR=y +# CONFIG_SENSORS_DS1337 is not set +# CONFIG_SENSORS_DS1374 is not set +CONFIG_SENSORS_EEPROM=y +# 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 +# CONFIG_I2C_DEBUG_CHIP is not set + +# +# Hardware Monitoring support +# +CONFIG_HWMON=y +# CONFIG_HWMON_VID is not set # CONFIG_SENSORS_ADM1021 is not set # CONFIG_SENSORS_ADM1025 is not set # CONFIG_SENSORS_ADM1026 is not set # CONFIG_SENSORS_ADM1031 is not set +# CONFIG_SENSORS_ADM9240 is not set # CONFIG_SENSORS_ASB100 is not set +# CONFIG_SENSORS_ATXP1 is not set # CONFIG_SENSORS_DS1621 is not set # CONFIG_SENSORS_FSCHER is not set # CONFIG_SENSORS_FSCPOS is not set @@ -649,30 +732,26 @@ CONFIG_I2C_SENSOR=y # CONFIG_SENSORS_LM85 is not set # CONFIG_SENSORS_LM87 is not set # CONFIG_SENSORS_LM90 is not set +# CONFIG_SENSORS_LM92 is not set # CONFIG_SENSORS_MAX1619 is not set # CONFIG_SENSORS_PC87360 is not set -# CONFIG_SENSORS_SMSC47B397 is not set # CONFIG_SENSORS_SIS5595 is not set # CONFIG_SENSORS_SMSC47M1 is not set +# CONFIG_SENSORS_SMSC47B397 is not set # CONFIG_SENSORS_VIA686A is not set # CONFIG_SENSORS_W83781D is not set +# CONFIG_SENSORS_W83792D is not set # CONFIG_SENSORS_W83L785TS is not set # CONFIG_SENSORS_W83627HF is not set +# CONFIG_SENSORS_W83627EHF is not set +# CONFIG_HWMON_DEBUG_CHIP is not set # -# Other I2C Chip support +# Misc devices # -CONFIG_SENSORS_EEPROM=y -# CONFIG_SENSORS_PCF8574 is not set -# CONFIG_SENSORS_PCF8591 is not set -# CONFIG_SENSORS_RTC8564 is not set -# CONFIG_I2C_DEBUG_CORE is not set -# CONFIG_I2C_DEBUG_ALGO is not set -# CONFIG_I2C_DEBUG_BUS is not set -# CONFIG_I2C_DEBUG_CHIP is not set # -# Misc devices +# Multimedia Capabilities Port drivers # # @@ -702,6 +781,10 @@ CONFIG_USB_ARCH_HAS_HCD=y CONFIG_USB_ARCH_HAS_OHCI=y # CONFIG_USB is not set +# +# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' +# + # # USB Gadget Support # @@ -719,6 +802,7 @@ CONFIG_EXT2_FS=y CONFIG_EXT2_FS_XATTR=y CONFIG_EXT2_FS_POSIX_ACL=y # CONFIG_EXT2_FS_SECURITY is not set +# CONFIG_EXT2_FS_XIP is not set CONFIG_EXT3_FS=y CONFIG_EXT3_FS_XATTR=y CONFIG_EXT3_FS_POSIX_ACL=y @@ -729,17 +813,15 @@ CONFIG_FS_MBCACHE=y # CONFIG_REISERFS_FS is not set # CONFIG_JFS_FS is not set CONFIG_FS_POSIX_ACL=y - -# -# XFS support -# # CONFIG_XFS_FS is not set # CONFIG_MINIX_FS is not set # CONFIG_ROMFS_FS is not set +CONFIG_INOTIFY=y # CONFIG_QUOTA is not set CONFIG_DNOTIFY=y # CONFIG_AUTOFS_FS is not set # CONFIG_AUTOFS4_FS is not set +# CONFIG_FUSE_FS is not set # # CD-ROM/DVD Filesystems @@ -759,12 +841,10 @@ CONFIG_DNOTIFY=y # 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 # # Miscellaneous filesystems @@ -779,8 +859,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 @@ -797,12 +877,14 @@ CONFIG_JFFS2_RTIME=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 @@ -811,6 +893,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 @@ -849,6 +932,7 @@ CONFIG_MSDOS_PARTITION=y CONFIG_DEBUG_KERNEL=y CONFIG_MAGIC_SYSRQ=y CONFIG_LOG_BUF_SHIFT=14 +CONFIG_DETECT_SOFTLOCKUP=y # CONFIG_SCHEDSTATS is not set # CONFIG_DEBUG_SLAB is not set # CONFIG_DEBUG_SPINLOCK is not set @@ -857,7 +941,9 @@ CONFIG_LOG_BUF_SHIFT=14 CONFIG_DEBUG_BUGVERBOSE=y # CONFIG_DEBUG_INFO is not set # CONFIG_DEBUG_FS is not set +# CONFIG_DEBUG_VM is not set CONFIG_FRAME_POINTER=y +# CONFIG_RCU_TORTURE_TEST is not set CONFIG_DEBUG_USER=y # CONFIG_DEBUG_WAITQ is not set CONFIG_DEBUG_ERRORS=y @@ -883,6 +969,7 @@ CONFIG_DEBUG_LL=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/lpd7a400_defconfig b/arch/arm/configs/lpd7a400_defconfig index bf9cf9c6d..67eaa26c2 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 -# Thu Nov 3 14:15:32 2005 +# Linux kernel version: 2.6.12-rc1-bk2 +# Mon Mar 28 00:06:33 2005 # CONFIG_ARM=y CONFIG_MMU=y @@ -17,7 +17,6 @@ CONFIG_EXPERIMENTAL=y CONFIG_CLEAN_COMPILE=y CONFIG_BROKEN_ON_SMP=y CONFIG_LOCK_KERNEL=y -CONFIG_INIT_ENV_ARG_LIMIT=32 # # General setup @@ -37,8 +36,6 @@ 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 @@ -74,7 +71,6 @@ 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 @@ -88,7 +84,6 @@ 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 @@ -115,8 +110,6 @@ CONFIG_ARM_THUMB=y # # Bus support # -CONFIG_ARM_AMBA=y -CONFIG_ISA_DMA_API=y # # PCCARD (PCMCIA/CardBus) support @@ -126,7 +119,6 @@ CONFIG_ISA_DMA_API=y # # Kernel Features # -# CONFIG_SMP is not set CONFIG_PREEMPT=y CONFIG_DISCONTIGMEM=y CONFIG_ALIGNMENT_TRAP=y @@ -183,7 +175,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=y +# CONFIG_MTD_CMDLINE_PARTS is not set # CONFIG_MTD_AFS_PARTS is not set # @@ -225,10 +217,7 @@ CONFIG_MTD_CFI_UTIL=y # Mapping drivers for chip access # # CONFIG_MTD_COMPLEX_MAPPINGS is not set -CONFIG_MTD_PHYSMAP=y -CONFIG_MTD_PHYSMAP_START=0x00000000 -CONFIG_MTD_PHYSMAP_LEN=0x04000000 -CONFIG_MTD_PHYSMAP_BANKWIDTH=4 +# CONFIG_MTD_PHYSMAP is not set # CONFIG_MTD_ARM_INTEGRATOR is not set # CONFIG_MTD_EDB7312 is not set @@ -265,6 +254,7 @@ CONFIG_MTD_PHYSMAP_BANKWIDTH=4 # # 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 @@ -298,15 +288,13 @@ 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=y +# CONFIG_IDE_ARM is not set # CONFIG_BLK_DEV_IDEDMA is not set # CONFIG_IDEDMA_AUTO is not set # CONFIG_BLK_DEV_HD is not set @@ -314,37 +302,7 @@ CONFIG_IDE_ARM=y # # SCSI device support # -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 +# CONFIG_SCSI is not set # # Multi-device support (RAID and LVM) @@ -373,6 +331,7 @@ 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 @@ -479,10 +438,13 @@ CONFIG_INPUT=y # # Userland interfaces # -# CONFIG_INPUT_MOUSEDEV is not set +CONFIG_INPUT_MOUSEDEV=y +CONFIG_INPUT_MOUSEDEV_PSAUX=y +CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 +CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 # CONFIG_INPUT_JOYDEV is not set # CONFIG_INPUT_TSDEV is not set -CONFIG_INPUT_EVDEV=y +# CONFIG_INPUT_EVDEV is not set # CONFIG_INPUT_EVBUG is not set # @@ -491,13 +453,7 @@ CONFIG_INPUT_EVDEV=y # CONFIG_INPUT_KEYBOARD is not set # CONFIG_INPUT_MOUSE is not set # CONFIG_INPUT_JOYSTICK 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_TOUCHSCREEN is not set # CONFIG_INPUT_MISC is not set # @@ -505,6 +461,7 @@ CONFIG_HAS_TOUCHSCREEN_ADS7843_LH7=y # # CONFIG_SERIO is not set # CONFIG_GAMEPORT is not set +CONFIG_SOUND_GAMEPORT=y # # Character devices @@ -522,8 +479,6 @@ 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 @@ -555,6 +510,7 @@ CONFIG_RTC=y # # TPM devices # +# CONFIG_TCG_TPM is not set # # I2C support @@ -578,73 +534,18 @@ CONFIG_RTC=y # # Graphics support # -CONFIG_FB=y -CONFIG_FB_CFB_FILLRECT=y -CONFIG_FB_CFB_COPYAREA=y -CONFIG_FB_CFB_IMAGEBLIT=y -CONFIG_FB_SOFT_CURSOR=y -# CONFIG_FB_MACMODES 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 +# CONFIG_FB 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=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 +# CONFIG_SOUND is not set # # USB support diff --git a/arch/arm/configs/lpd7a404_defconfig b/arch/arm/configs/lpd7a404_defconfig index 3a57be32e..208d591eb 100644 --- a/arch/arm/configs/lpd7a404_defconfig +++ b/arch/arm/configs/lpd7a404_defconfig @@ -1,81 +1,58 @@ # # Automatically generated make config: don't edit -# Linux kernel version: 2.6.16 -# Thu Mar 23 17:50:31 2006 +# Linux kernel version: 2.6.12-rc1-bk2 +# Mon Mar 28 00:14:08 2005 # 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 # @@ -94,15 +71,11 @@ CONFIG_DEFAULT_IOSCHED="cfq" # 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 @@ -137,7 +110,6 @@ CONFIG_ARM_THUMB=y # # Bus support # -CONFIG_ARM_AMBA=y # # PCCARD (PCMCIA/CardBus) support @@ -148,18 +120,7 @@ CONFIG_ARM_AMBA=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 # @@ -193,84 +154,6 @@ 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 @@ -284,11 +167,6 @@ 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) # @@ -297,7 +175,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=y +# CONFIG_MTD_CMDLINE_PARTS is not set # CONFIG_MTD_AFS_PARTS is not set # @@ -308,7 +186,6 @@ 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 @@ -334,18 +211,15 @@ CONFIG_MTD_CFI_UTIL=y # CONFIG_MTD_RAM is not set # CONFIG_MTD_ROM is not set # CONFIG_MTD_ABSENT is not set -# CONFIG_MTD_OBSOLETE_CHIPS is not set +# CONFIG_MTD_XIP is not set # # Mapping drivers for chip access # # CONFIG_MTD_COMPLEX_MAPPINGS is not set -CONFIG_MTD_PHYSMAP=y -CONFIG_MTD_PHYSMAP_START=0x00000000 -CONFIG_MTD_PHYSMAP_LEN=0x04000000 -CONFIG_MTD_PHYSMAP_BANKWIDTH=4 +# CONFIG_MTD_PHYSMAP is not set # CONFIG_MTD_ARM_INTEGRATOR is not set -# CONFIG_MTD_PLATRAM is not set +# CONFIG_MTD_EDB7312 is not set # # Self-contained MTD device drivers @@ -368,11 +242,6 @@ CONFIG_MTD_PHYSMAP_BANKWIDTH=4 # # CONFIG_MTD_NAND is not set -# -# OneNAND Flash Device Drivers -# -# CONFIG_MTD_ONENAND is not set - # # Parallel port support # @@ -385,6 +254,7 @@ CONFIG_MTD_PHYSMAP_BANKWIDTH=4 # # 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 @@ -392,7 +262,16 @@ 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 # @@ -412,13 +291,12 @@ 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=y +# CONFIG_IDE_ARM is not set # CONFIG_BLK_DEV_IDEDMA is not set # CONFIG_IDEDMA_AUTO is not set # CONFIG_BLK_DEV_HD is not set @@ -426,7 +304,6 @@ CONFIG_IDE_ARM=y # # SCSI device support # -# CONFIG_RAID_ATTRS is not set CONFIG_SCSI=y # CONFIG_SCSI_PROC_FS is not set @@ -438,7 +315,6 @@ 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 @@ -453,12 +329,10 @@ 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 @@ -470,7 +344,6 @@ CONFIG_SCSI=y # # Fusion MPT device support # -# CONFIG_FUSION is not set # # IEEE 1394 (FireWire) support @@ -481,26 +354,82 @@ CONFIG_SCSI=y # # -# Network device support +# 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=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) @@ -527,8 +456,6 @@ 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 @@ -543,13 +470,10 @@ CONFIG_INPUT=y # # Userland interfaces # -CONFIG_INPUT_MOUSEDEV=y -# CONFIG_INPUT_MOUSEDEV_PSAUX is not set -CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 -CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 +# CONFIG_INPUT_MOUSEDEV is not set # CONFIG_INPUT_JOYDEV is not set # CONFIG_INPUT_TSDEV is not set -CONFIG_INPUT_EVDEV=y +# CONFIG_INPUT_EVDEV is not set # CONFIG_INPUT_EVBUG is not set # @@ -558,13 +482,7 @@ CONFIG_INPUT_EVDEV=y # CONFIG_INPUT_KEYBOARD is not set # CONFIG_INPUT_MOUSE is not set # CONFIG_INPUT_JOYSTICK 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_TOUCHSCREEN is not set # CONFIG_INPUT_MISC is not set # @@ -572,6 +490,7 @@ CONFIG_HAS_TOUCHSCREEN_ADC_LH7=y # # CONFIG_SERIO is not set # CONFIG_GAMEPORT is not set +CONFIG_SOUND_GAMEPORT=y # # Character devices @@ -589,8 +508,6 @@ 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 @@ -616,46 +533,23 @@ 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 # @@ -669,83 +563,18 @@ CONFIG_HWMON=y # # Graphics support # -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 +# CONFIG_FB 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=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 +# CONFIG_SOUND is not set # # USB support @@ -766,7 +595,6 @@ 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 @@ -775,19 +603,16 @@ CONFIG_USB_OHCI_LITTLE_ENDIAN=y # # USB Device Class drivers # -# CONFIG_OBSOLETE_OSS_USB_DRIVER is not set +# CONFIG_USB_BLUETOOTH_TTY is not set # CONFIG_USB_ACM is not set # CONFIG_USB_PRINTER is not set # -# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' -# - -# -# may also be needed; see USB_STORAGE Help for more information +# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' may also be needed; see USB_STORAGE Help for more information # CONFIG_USB_STORAGE=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 @@ -796,32 +621,22 @@ 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 @@ -871,33 +686,16 @@ 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 DSL modem support +# USB ATM/DSL drivers # # # USB Gadget Support # -CONFIG_USB_GADGET=y -# CONFIG_USB_GADGET_DEBUG_FILES is not set -CONFIG_USB_GADGET_SELECTED=y -# CONFIG_USB_GADGET_NET2280 is not set -# CONFIG_USB_GADGET_PXA2XX 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 +# CONFIG_USB_GADGET is not set # # MMC/SD Card support @@ -909,7 +707,6 @@ CONFIG_USB_ZERO=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 @@ -919,17 +716,17 @@ CONFIG_JBD=y CONFIG_FS_MBCACHE=y # CONFIG_REISERFS_FS is not set # CONFIG_JFS_FS is not set -# CONFIG_FS_POSIX_ACL is not set + +# +# XFS support +# # 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 @@ -952,11 +749,12 @@ 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 @@ -971,8 +769,8 @@ CONFIG_RAMFS=y # CONFIG_JFFS_FS is not set CONFIG_JFFS2_FS=y CONFIG_JFFS2_FS_DEBUG=0 -CONFIG_JFFS2_FS_WRITEBUFFER=y -# CONFIG_JFFS2_SUMMARY is not set +# 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 @@ -989,14 +787,12 @@ 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 @@ -1005,7 +801,6 @@ 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 @@ -1025,7 +820,6 @@ 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 # @@ -1081,24 +875,19 @@ CONFIG_NLS_DEFAULT="iso8859-1" # Kernel hacking # # CONFIG_PRINTK_TIME is not set -CONFIG_MAGIC_SYSRQ=y CONFIG_DEBUG_KERNEL=y -CONFIG_LOG_BUF_SHIFT=16 -CONFIG_DETECT_SOFTLOCKUP=y +CONFIG_MAGIC_SYSRQ=y +CONFIG_LOG_BUF_SHIFT=14 # 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 @@ -1123,7 +912,6 @@ 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 05adb0b34..ee3ecbd90 100644 --- a/arch/arm/configs/omap_h2_1610_defconfig +++ b/arch/arm/configs/omap_h2_1610_defconfig @@ -1,20 +1,19 @@ # # Automatically generated make config: don't edit -# Linux kernel version: 2.6.17 -# Thu Jun 29 15:25:18 2006 +# Linux kernel version: 2.6.14 +# Wed Nov 9 18:53:40 2005 # CONFIG_ARM=y CONFIG_MMU=y +CONFIG_UID16=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 # CONFIG_EXPERIMENTAL=y +CONFIG_CLEAN_COMPILE=y CONFIG_BROKEN_ON_SMP=y CONFIG_LOCK_KERNEL=y CONFIG_INIT_ENV_ARG_LIMIT=32 @@ -30,26 +29,26 @@ CONFIG_SYSVIPC=y # 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_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_SLAB=y +CONFIG_CC_ALIGN_FUNCTIONS=0 +CONFIG_CC_ALIGN_LABELS=0 +CONFIG_CC_ALIGN_LOOPS=0 +CONFIG_CC_ALIGN_JUMPS=0 # CONFIG_TINY_SHMEM is not set CONFIG_BASE_SMALL=0 -# CONFIG_SLOB is not set # # Loadable module support @@ -57,6 +56,7 @@ 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 @@ -64,7 +64,6 @@ CONFIG_MODULE_UNLOAD=y # # Block layer # -# CONFIG_BLK_DEV_IO_TRACE is not set # # IO Schedulers @@ -82,26 +81,16 @@ 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_NETX is not set -# CONFIG_ARCH_H720X is not set -# CONFIG_ARCH_IMX is not set +# CONFIG_ARCH_INTEGRATOR is not set # CONFIG_ARCH_IOP3XX is not set # CONFIG_ARCH_IXP4XX is not set # CONFIG_ARCH_IXP2000 is not set -# CONFIG_ARCH_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 @@ -109,6 +98,11 @@ CONFIG_DEFAULT_IOSCHED="anticipatory" # CONFIG_ARCH_SHARK is not set # CONFIG_ARCH_LH7A40X is not set CONFIG_ARCH_OMAP=y +# 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 # # TI OMAP Implementations @@ -147,7 +141,6 @@ CONFIG_ARCH_OMAP16XX=y CONFIG_MACH_OMAP_H2=y # CONFIG_MACH_OMAP_H3 is not set # CONFIG_MACH_OMAP_OSK is not set -# CONFIG_MACH_NOKIA770 is not set # CONFIG_MACH_OMAP_GENERIC is not set # @@ -184,6 +177,7 @@ CONFIG_ARM_THUMB=y # # Bus support # +CONFIG_ISA_DMA_API=y # # PCCARD (PCMCIA/CardBus) support @@ -195,8 +189,6 @@ CONFIG_ARM_THUMB=y # 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 @@ -257,8 +249,6 @@ 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 # @@ -269,12 +259,9 @@ CONFIG_NET=y # # Networking options # -# CONFIG_NETDEBUG is not set CONFIG_PACKET=y # CONFIG_PACKET_MMAP is not set CONFIG_UNIX=y -CONFIG_XFRM=y -# CONFIG_XFRM_USER is not set # CONFIG_NET_KEY is not set CONFIG_INET=y # CONFIG_IP_MULTICAST is not set @@ -291,18 +278,12 @@ 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 # @@ -314,11 +295,6 @@ CONFIG_TCP_CONG_BIC=y # 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 @@ -336,6 +312,7 @@ CONFIG_TCP_CONG_BIC=y # QoS and/or fair queueing # # CONFIG_NET_SCHED is not set +# CONFIG_NET_CLS_ROUTE is not set # # Network testing @@ -356,12 +333,6 @@ CONFIG_TCP_CONG_BIC=y CONFIG_STANDALONE=y CONFIG_PREVENT_FIRMWARE_BUILD=y # CONFIG_FW_LOADER is not set -# CONFIG_SYS_HYPERVISOR is not set - -# -# Connector - unified userspace <-> kernelspace linker -# -# CONFIG_CONNECTOR is not set # # Memory Technology Devices (MTD) @@ -555,7 +526,6 @@ CONFIG_SERIO_SERPORT=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 # @@ -564,7 +534,6 @@ 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 # @@ -590,8 +559,8 @@ 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 @@ -603,7 +572,6 @@ CONFIG_WATCHDOG_NOWAYOUT=y # # TPM devices # -# CONFIG_TCG_TPM is not set # CONFIG_TELCLOCK is not set # @@ -611,23 +579,11 @@ CONFIG_WATCHDOG_NOWAYOUT=y # # 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 # @@ -635,23 +591,13 @@ CONFIG_HWMON=y # # -# LED devices -# -# CONFIG_NEW_LEDS is not set - -# -# LED drivers -# - -# -# LED Triggers +# Multimedia Capabilities Port drivers # # # Multimedia devices # # CONFIG_VIDEO_DEV is not set -CONFIG_VIDEO_V4L2=y # # Digital Video Broadcasting Devices @@ -661,13 +607,11 @@ CONFIG_VIDEO_V4L2=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_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 @@ -691,6 +635,7 @@ CONFIG_FONT_8x16=y # CONFIG_FONT_SUN8x16 is not set # CONFIG_FONT_SUN12x22 is not set # CONFIG_FONT_10x18 is not set +# CONFIG_FONT_RL is not set # # Logo configuration @@ -715,15 +660,16 @@ CONFIG_SOUND=y # Open Sound System # CONFIG_SOUND_PRIME=y +# CONFIG_OBSOLETE_OSS_DRIVER is not set # CONFIG_SOUND_MSNDCLAS is not set # CONFIG_SOUND_MSNDPIN is not set +# CONFIG_SOUND_OSS 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 # @@ -734,18 +680,23 @@ CONFIG_USB_ARCH_HAS_OHCI=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 # @@ -753,15 +704,14 @@ 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 # 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 @@ -791,7 +741,7 @@ CONFIG_SYSFS=y # CONFIG_TMPFS is not set # CONFIG_HUGETLB_PAGE is not set CONFIG_RAMFS=y -# CONFIG_CONFIGFS_FS is not set +# CONFIG_RELAYFS_FS is not set # # Miscellaneous filesystems @@ -893,13 +843,10 @@ CONFIG_NLS_DEFAULT="iso8859-1" # Kernel hacking # # CONFIG_PRINTK_TIME is not set -# CONFIG_MAGIC_SYSRQ is not set # CONFIG_DEBUG_KERNEL is not set CONFIG_LOG_BUF_SHIFT=14 CONFIG_DEBUG_BUGVERBOSE=y -# CONFIG_DEBUG_FS is not set CONFIG_FRAME_POINTER=y -# CONFIG_UNWIND_INFO is not set # CONFIG_DEBUG_USER is not set # diff --git a/arch/arm/configs/s3c2410_defconfig b/arch/arm/configs/s3c2410_defconfig index f20814e6f..6695b07cf 100644 --- a/arch/arm/configs/s3c2410_defconfig +++ b/arch/arm/configs/s3c2410_defconfig @@ -1,19 +1,18 @@ # # Automatically generated make config: don't edit -# Linux kernel version: 2.6.17-git9 -# Sun Jun 25 23:56:32 2006 +# Linux kernel version: 2.6.16-rc2 +# Mon Feb 6 11:17:23 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 # CONFIG_EXPERIMENTAL=y +CONFIG_CLEAN_COMPILE=y CONFIG_BROKEN_ON_SMP=y CONFIG_INIT_ENV_ARG_LIMIT=32 @@ -29,7 +28,6 @@ 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 @@ -45,16 +43,22 @@ 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 @@ -62,7 +66,6 @@ CONFIG_KMOD=y # # Block layer # -# CONFIG_BLK_DEV_IO_TRACE is not set # # IO Schedulers @@ -80,26 +83,16 @@ 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_NETX is not set -# CONFIG_ARCH_H720X is not set -# CONFIG_ARCH_IMX is not set +# CONFIG_ARCH_INTEGRATOR is not set # CONFIG_ARCH_IOP3XX is not set # CONFIG_ARCH_IXP4XX is not set # CONFIG_ARCH_IXP2000 is not set -# CONFIG_ARCH_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 @@ -107,32 +100,29 @@ 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 # CONFIG_MACH_ANUBIS=y -CONFIG_MACH_OSIRIS=y 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 @@ -155,11 +145,8 @@ 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 @@ -172,7 +159,6 @@ 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 @@ -189,7 +175,6 @@ CONFIG_ISA=y # # CONFIG_PREEMPT is not set # CONFIG_NO_IDLE_HZ is not set -CONFIG_HZ=200 # CONFIG_AEABI is not set # CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set CONFIG_SELECT_MEMORY_MODEL=y @@ -220,7 +205,6 @@ 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 @@ -246,11 +230,8 @@ CONFIG_NET=y # # Networking options # -# 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 @@ -267,18 +248,12 @@ 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 # @@ -333,7 +308,6 @@ 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 @@ -383,12 +357,14 @@ 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 CONFIG_MTD_ROM=y # CONFIG_MTD_ABSENT is not set # CONFIG_MTD_OBSOLETE_CHIPS is not set +# CONFIG_MTD_XIP is not set # # Mapping drivers for chip access @@ -407,6 +383,7 @@ 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 # @@ -421,12 +398,10 @@ 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 @@ -440,8 +415,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 # @@ -456,7 +431,6 @@ CONFIG_PARPORT_1284=y CONFIG_BLK_DEV_LOOP=y # CONFIG_BLK_DEV_CRYPTOLOOP is not set CONFIG_BLK_DEV_NBD=m -# CONFIG_BLK_DEV_UB is not set CONFIG_BLK_DEV_RAM=y CONFIG_BLK_DEV_RAM_COUNT=16 CONFIG_BLK_DEV_RAM_SIZE=4096 @@ -649,6 +623,7 @@ CONFIG_SERIAL_NONSTANDARD=y # CONFIG_MOXA_SMARTIO is not set # CONFIG_ISI is not set # CONFIG_SYNCLINKMP is not set +# CONFIG_SYNCLINK_GT is not set # CONFIG_N_HDLC is not set # CONFIG_RISCOM8 is not set # CONFIG_SPECIALIX is not set @@ -711,12 +686,8 @@ CONFIG_S3C2410_WATCHDOG=y # CONFIG_PCWATCHDOG is not set # CONFIG_MIXCOMWD is not set # CONFIG_WDT is not set - -# -# USB-based Watchdog Cards -# -# 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 @@ -750,7 +721,6 @@ 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 @@ -766,7 +736,9 @@ 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 @@ -778,16 +750,11 @@ CONFIG_SENSORS_EEPROM=m # 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=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 @@ -796,7 +763,6 @@ CONFIG_HWMON_VID=m # CONFIG_SENSORS_ASB100 is not set # CONFIG_SENSORS_ATXP1 is not set # CONFIG_SENSORS_DS1621 is not set -# CONFIG_SENSORS_F71805F is not set # CONFIG_SENSORS_FSCHER is not set # CONFIG_SENSORS_FSCPOS is not set # CONFIG_SENSORS_GL518SM is not set @@ -815,10 +781,8 @@ 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 @@ -830,29 +794,18 @@ CONFIG_SENSORS_LM85=m # # -# LED devices -# -# CONFIG_NEW_LEDS is not set - -# -# LED drivers -# - -# -# LED Triggers +# Multimedia Capabilities Port drivers # # # 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 @@ -862,8 +815,6 @@ 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 @@ -899,115 +850,12 @@ 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 - -# -# Miscellaneous USB options -# -CONFIG_USB_DEVICEFS=y -# CONFIG_USB_BANDWIDTH is not set -# CONFIG_USB_DYNAMIC_MINORS is not set -# CONFIG_USB_SUSPEND is not set -# CONFIG_USB_OTG is not set - -# -# 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 - -# -# USB Device Class drivers -# -# CONFIG_USB_ACM is not set -# CONFIG_USB_PRINTER is not set +# CONFIG_USB is not set # # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' # -# -# may also be needed; see USB_STORAGE Help for more information -# -# CONFIG_USB_STORAGE is not set -# CONFIG_USB_LIBUSUAL is not set - -# -# USB Input Devices -# -# CONFIG_USB_HID is not set - -# -# USB HID Boot Protocol drivers -# -# CONFIG_USB_KBD is not set -# CONFIG_USB_MOUSE 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_TOUCHSCREEN 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 -# -# CONFIG_USB_MDC800 is not set - -# -# USB Network Adapters -# -# CONFIG_USB_CATC is not set -# CONFIG_USB_KAWETH is not set -# CONFIG_USB_PEGASUS is not set -# CONFIG_USB_RTL8150 is not set -# CONFIG_USB_USBNET is not set -CONFIG_USB_MON=y - -# -# USB port drivers -# -# CONFIG_USB_USS720 is not set - -# -# USB Serial Converter support -# -# CONFIG_USB_SERIAL is not set - -# -# USB Miscellaneous drivers -# -# CONFIG_USB_EMI62 is not set -# CONFIG_USB_EMI26 is not set -# CONFIG_USB_AUERSWALD is not set -# CONFIG_USB_RIO500 is not set -# 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 - -# -# USB DSL modem support -# - # # USB Gadget Support # @@ -1018,12 +866,6 @@ CONFIG_USB_MON=y # # CONFIG_MMC is not set -# -# Real Time Clock -# -CONFIG_RTC_LIB=y -# CONFIG_RTC_CLASS is not set - # # File systems # @@ -1045,7 +887,6 @@ 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 @@ -1076,6 +917,7 @@ 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 # @@ -1216,7 +1058,6 @@ 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/configs/versatile_defconfig b/arch/arm/configs/versatile_defconfig index 96b7a7762..2687a225a 100644 --- a/arch/arm/configs/versatile_defconfig +++ b/arch/arm/configs/versatile_defconfig @@ -1,55 +1,50 @@ # # Automatically generated make config: don't edit -# Linux kernel version: 2.6.17-rc3 -# Mon May 8 20:15:57 2006 +# Linux kernel version: 2.6.12-rc1-bk2 +# Mon Mar 28 00:20:50 2005 # CONFIG_ARM=y CONFIG_MMU=y +CONFIG_UID16=y CONFIG_RWSEM_GENERIC_SPINLOCK=y -CONFIG_GENERIC_HWEIGHT=y CONFIG_GENERIC_CALIBRATE_DELAY=y -CONFIG_VECTORS_BASE=0xffff0000 +CONFIG_GENERIC_IOMAP=y # # Code maturity level options # CONFIG_EXPERIMENTAL=y +CONFIG_CLEAN_COMPILE=y CONFIG_BROKEN_ON_SMP=y -CONFIG_INIT_ENV_ARG_LIMIT=32 # # General setup # CONFIG_LOCALVERSION="" -# CONFIG_LOCALVERSION_AUTO is not set CONFIG_SWAP=y CONFIG_SYSVIPC=y # CONFIG_POSIX_MQUEUE is not set # CONFIG_BSD_PROCESS_ACCT is not set CONFIG_SYSCTL=y # CONFIG_AUDIT is not set +CONFIG_HOTPLUG=y +CONFIG_KOBJECT_UEVENT=y # CONFIG_IKCONFIG is not set -# CONFIG_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_SLAB=y +CONFIG_CC_ALIGN_FUNCTIONS=0 +CONFIG_CC_ALIGN_LABELS=0 +CONFIG_CC_ALIGN_LOOPS=0 +CONFIG_CC_ALIGN_JUMPS=0 # CONFIG_TINY_SHMEM is not set CONFIG_BASE_SMALL=0 -# CONFIG_SLOB is not set -CONFIG_OBSOLETE_INTERMODULE=y # # Loadable module support @@ -57,28 +52,11 @@ CONFIG_OBSOLETE_INTERMODULE=y CONFIG_MODULES=y CONFIG_MODULE_UNLOAD=y # CONFIG_MODULE_FORCE_UNLOAD is not set +CONFIG_OBSOLETE_MODPARM=y # CONFIG_MODVERSIONS is not set # CONFIG_MODULE_SRCVERSION_ALL is not set CONFIG_KMOD=y -# -# 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 # @@ -86,13 +64,11 @@ CONFIG_DEFAULT_IOSCHED="anticipatory" # 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_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_PXA is not set # CONFIG_ARCH_RPC is not set @@ -102,17 +78,14 @@ CONFIG_DEFAULT_IOSCHED="anticipatory" # CONFIG_ARCH_LH7A40X is not set # CONFIG_ARCH_OMAP is not set CONFIG_ARCH_VERSATILE=y -# 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 # # Versatile platform type # CONFIG_ARCH_VERSATILE_PB=y -CONFIG_MACH_VERSATILE_AB=y +# CONFIG_MACH_VERSATILE_AB is not set # # Processor Type @@ -133,14 +106,12 @@ CONFIG_ARM_THUMB=y # CONFIG_CPU_DCACHE_DISABLE is not set # CONFIG_CPU_DCACHE_WRITETHROUGH is not set # CONFIG_CPU_CACHE_ROUND_ROBIN is not set -CONFIG_ARM_VIC=y CONFIG_ICST307=y # # Bus support # CONFIG_ARM_AMBA=y -# CONFIG_PCI is not set # # PCCARD (PCMCIA/CardBus) support @@ -151,18 +122,6 @@ CONFIG_ARM_AMBA=y # Kernel Features # # CONFIG_PREEMPT is not set -# CONFIG_NO_IDLE_HZ is not set -CONFIG_HZ=100 -# 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=y CONFIG_LEDS_TIMER=y CONFIG_LEDS_CPU=y @@ -186,7 +145,7 @@ CONFIG_CMDLINE="root=1f03 mem=32M" CONFIG_FPE_NWFPE=y # CONFIG_FPE_NWFPE_XP is not set # CONFIG_FPE_FASTFPE is not set -CONFIG_VFP=y +# CONFIG_VFP is not set # # Userspace binary formats @@ -200,91 +159,8 @@ CONFIG_BINFMT_ELF=y # Power management options # CONFIG_PM=y -CONFIG_PM_LEGACY=y -# CONFIG_PM_DEBUG 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=y -CONFIG_UNIX=y -# CONFIG_NET_KEY is not set -CONFIG_INET=y -CONFIG_IP_MULTICAST=y -# CONFIG_IP_ADVANCED_ROUTER is not set -CONFIG_IP_FIB_HASH=y -CONFIG_IP_PNP=y -# CONFIG_IP_PNP_DHCP is not set -CONFIG_IP_PNP_BOOTP=y -# CONFIG_IP_PNP_RARP is not set -# CONFIG_NET_IPIP is not set -# CONFIG_NET_IPGRE is not set -# CONFIG_IP_MROUTE is not set -# CONFIG_ARPD is not set -# CONFIG_SYN_COOKIES 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_DIAG is not set -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_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 # @@ -297,11 +173,6 @@ 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) # @@ -321,7 +192,6 @@ 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 @@ -344,7 +214,6 @@ 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_OTP is not set CONFIG_MTD_CFI_INTELEXT=y # CONFIG_MTD_CFI_AMDSTD is not set # CONFIG_MTD_CFI_STAA is not set @@ -352,7 +221,7 @@ CONFIG_MTD_CFI_UTIL=y # CONFIG_MTD_RAM is not set # CONFIG_MTD_ROM is not set # CONFIG_MTD_ABSENT is not set -# CONFIG_MTD_OBSOLETE_CHIPS is not set +# CONFIG_MTD_XIP is not set # # Mapping drivers for chip access @@ -360,7 +229,7 @@ CONFIG_MTD_CFI_UTIL=y # CONFIG_MTD_COMPLEX_MAPPINGS is not set # CONFIG_MTD_PHYSMAP is not set CONFIG_MTD_ARM_INTEGRATOR=y -# CONFIG_MTD_PLATRAM is not set +# CONFIG_MTD_EDB7312 is not set # # Self-contained MTD device drivers @@ -368,6 +237,7 @@ CONFIG_MTD_ARM_INTEGRATOR=y # 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 # @@ -382,11 +252,6 @@ CONFIG_MTD_ARM_INTEGRATOR=y # # CONFIG_MTD_NAND is not set -# -# OneNAND Flash Device Drivers -# -# CONFIG_MTD_ONENAND is not set - # # Parallel port support # @@ -399,6 +264,7 @@ CONFIG_MTD_ARM_INTEGRATOR=y # # Block devices # +# CONFIG_BLK_DEV_FD is not set # CONFIG_BLK_DEV_COW_COMMON is not set # CONFIG_BLK_DEV_LOOP is not set # CONFIG_BLK_DEV_NBD is not set @@ -406,13 +272,21 @@ CONFIG_BLK_DEV_RAM=y CONFIG_BLK_DEV_RAM_COUNT=16 CONFIG_BLK_DEV_RAM_SIZE=4096 CONFIG_BLK_DEV_INITRD=y +CONFIG_INITRAMFS_SOURCE="" # CONFIG_CDROM_PKTCDVD is not set + +# +# IO Schedulers +# +CONFIG_IOSCHED_NOOP=y +CONFIG_IOSCHED_AS=y +CONFIG_IOSCHED_DEADLINE=y +CONFIG_IOSCHED_CFQ=y # CONFIG_ATA_OVER_ETH is not set # # SCSI device support # -# CONFIG_RAID_ATTRS is not set # CONFIG_SCSI is not set # @@ -423,7 +297,6 @@ CONFIG_BLK_DEV_INITRD=y # # Fusion MPT device support # -# CONFIG_FUSION is not set # # IEEE 1394 (FireWire) support @@ -434,26 +307,83 @@ CONFIG_BLK_DEV_INITRD=y # # -# Network device support +# Networking support +# +CONFIG_NET=y + +# +# Networking options +# +CONFIG_PACKET=y +CONFIG_PACKET_MMAP=y +# CONFIG_NETLINK_DEV is not set +CONFIG_UNIX=y +# CONFIG_NET_KEY is not set +CONFIG_INET=y +CONFIG_IP_MULTICAST=y +# CONFIG_IP_ADVANCED_ROUTER is not set +CONFIG_IP_PNP=y +# CONFIG_IP_PNP_DHCP is not set +CONFIG_IP_PNP_BOOTP=y +# CONFIG_IP_PNP_RARP is not set +# CONFIG_NET_IPIP is not set +# CONFIG_NET_IPGRE is not set +# CONFIG_IP_MROUTE is not set +# CONFIG_ARPD is not set +# CONFIG_SYN_COOKIES 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) @@ -480,8 +410,6 @@ 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 @@ -531,6 +459,7 @@ CONFIG_SERIO_AMBAKMI=y CONFIG_SERIO_LIBPS2=y # CONFIG_SERIO_RAW is not set # CONFIG_GAMEPORT is not set +CONFIG_SOUND_GAMEPORT=y # # Character devices @@ -545,16 +474,17 @@ CONFIG_HW_CONSOLE=y # CONFIG_SERIAL_8250=m CONFIG_SERIAL_8250_NR_UARTS=4 -CONFIG_SERIAL_8250_RUNTIME_UARTS=4 CONFIG_SERIAL_8250_EXTENDED=y CONFIG_SERIAL_8250_MANY_PORTS=y CONFIG_SERIAL_8250_SHARE_IRQ=y # CONFIG_SERIAL_8250_DETECT_IRQ is not set +CONFIG_SERIAL_8250_MULTIPORT=y CONFIG_SERIAL_8250_RSA=y # # Non-8250 serial port support # +# CONFIG_SERIAL_AMBA_PL010 is not set CONFIG_SERIAL_AMBA_PL011=y CONFIG_SERIAL_AMBA_PL011_CONSOLE=y CONFIG_SERIAL_CORE=y @@ -573,19 +503,20 @@ CONFIG_LEGACY_PTY_COUNT=16 # # CONFIG_WATCHDOG is not set # CONFIG_NVRAM is not set +# CONFIG_RTC is not set # CONFIG_DTLK is not set # CONFIG_R3964 is not set # # Ftape, the floppy tape device driver # +# 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 @@ -603,59 +534,59 @@ CONFIG_I2C_ALGOBIT=y # # 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 # -# Miscellaneous I2C Chip support +# Hardware Sensors Chip support +# +CONFIG_I2C_SENSOR=m +# 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_DS1337 is not set -# CONFIG_SENSORS_DS1374 is not set CONFIG_SENSORS_EEPROM=m # CONFIG_SENSORS_PCF8574 is not set -# CONFIG_SENSORS_PCA9539 is not set # CONFIG_SENSORS_PCF8591 is not set -# CONFIG_SENSORS_MAX6875 is not set +# CONFIG_SENSORS_RTC8564 is not set # CONFIG_I2C_DEBUG_CORE is not set # CONFIG_I2C_DEBUG_ALGO is not set # CONFIG_I2C_DEBUG_BUS is not set # CONFIG_I2C_DEBUG_CHIP is not set -# -# 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 is not set -# CONFIG_HWMON_VID is not set - # # Misc devices # -# -# LED devices -# -# CONFIG_NEW_LEDS is not set - -# -# LED drivers -# - -# -# LED Triggers -# - # # Multimedia devices # @@ -673,31 +604,27 @@ 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_FIRMWARE_EDID is not set +CONFIG_FB_SOFT_CURSOR=y # CONFIG_FB_MODE_HELPERS is not set # CONFIG_FB_TILEBLITTING is not set CONFIG_FB_ARMCLCD=y -# CONFIG_FB_S1D13XXX is not set # CONFIG_FB_VIRTUAL is not set # # Console display driver support # +# CONFIG_VGA_CONSOLE is not set CONFIG_DUMMY_CONSOLE=y CONFIG_FRAMEBUFFER_CONSOLE=y -# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set CONFIG_FONTS=y # CONFIG_FONT_8x8 is not set # CONFIG_FONT_8x16 is not set # CONFIG_FONT_6x11 is not set -# CONFIG_FONT_7x14 is not set # CONFIG_FONT_PEARL_8x8 is not set CONFIG_FONT_ACORN_8x8=y # 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 @@ -720,18 +647,12 @@ CONFIG_SND_PCM=m CONFIG_SND_OSSEMUL=y CONFIG_SND_MIXER_OSS=m CONFIG_SND_PCM_OSS=m -CONFIG_SND_PCM_OSS_PLUGINS=y -# CONFIG_SND_DYNAMIC_MINORS is not set -CONFIG_SND_SUPPORT_OLD_API=y -CONFIG_SND_VERBOSE_PROCFS=y # CONFIG_SND_VERBOSE_PRINTK is not set # CONFIG_SND_DEBUG is not set # # Generic devices # -CONFIG_SND_AC97_CODEC=m -CONFIG_SND_AC97_BUS=m # CONFIG_SND_DUMMY is not set # CONFIG_SND_MTPAV is not set # CONFIG_SND_SERIAL_U16550 is not set @@ -740,7 +661,6 @@ CONFIG_SND_AC97_BUS=m # # ALSA ARM devices # -CONFIG_SND_ARMAACI=m # # Open Sound System @@ -752,13 +672,8 @@ CONFIG_SND_ARMAACI=m # CONFIG_USB_ARCH_HAS_HCD=y # CONFIG_USB_ARCH_HAS_OHCI is not set -# 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 # @@ -772,32 +687,26 @@ CONFIG_MMC=y CONFIG_MMC_BLOCK=y CONFIG_MMC_ARMMMCI=m -# -# 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 -# CONFIG_FS_POSIX_ACL is not set + +# +# XFS support +# # CONFIG_XFS_FS is not set -# CONFIG_OCFS2_FS is not set CONFIG_MINIX_FS=y CONFIG_ROMFS_FS=y -# CONFIG_INOTIFY is not set # 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 @@ -820,10 +729,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 is not set # CONFIG_HUGETLB_PAGE is not set CONFIG_RAMFS=y -# CONFIG_CONFIGFS_FS is not set # # Miscellaneous filesystems @@ -838,8 +748,8 @@ CONFIG_RAMFS=y # CONFIG_JFFS_FS is not set CONFIG_JFFS2_FS=y CONFIG_JFFS2_FS_DEBUG=0 -CONFIG_JFFS2_FS_WRITEBUFFER=y -# CONFIG_JFFS2_SUMMARY is not set +# 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 @@ -856,19 +766,16 @@ 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=y CONFIG_NFSD_V3=y -# CONFIG_NFSD_V3_ACL is not set # CONFIG_NFSD_V4 is not set # CONFIG_NFSD_TCP is not set CONFIG_ROOT_NFS=y CONFIG_LOCKD=y CONFIG_LOCKD_V4=y CONFIG_EXPORTFS=y -CONFIG_NFS_COMMON=y CONFIG_SUNRPC=y # CONFIG_RPCSEC_GSS_KRB5 is not set # CONFIG_RPCSEC_GSS_SPKM3 is not set @@ -877,7 +784,6 @@ 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 @@ -897,7 +803,6 @@ 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 # @@ -953,24 +858,18 @@ CONFIG_NLS_ISO8859_1=m # Kernel hacking # # CONFIG_PRINTK_TIME is not set -CONFIG_MAGIC_SYSRQ=y CONFIG_DEBUG_KERNEL=y +CONFIG_MAGIC_SYSRQ=y CONFIG_LOG_BUF_SHIFT=14 -CONFIG_DETECT_SOFTLOCKUP=y # CONFIG_SCHEDSTATS is not set # CONFIG_DEBUG_SLAB is not set -# CONFIG_DEBUG_MUTEXES is not set # 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 is not set # 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 # CONFIG_DEBUG_WAITQ is not set CONFIG_DEBUG_ERRORS=y @@ -996,7 +895,6 @@ CONFIG_DEBUG_LL=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/kernel/Makefile b/arch/arm/kernel/Makefile index 1320a0efc..2ce0e3a27 100644 --- a/arch/arm/kernel/Makefile +++ b/arch/arm/kernel/Makefile @@ -13,25 +13,23 @@ 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 isa.o +obj-$(CONFIG_PCI) += bios32.o obj-$(CONFIG_SMP) += smp.o obj-$(CONFIG_OABI_COMPAT) += sys_oabi-compat.o -obj-$(CONFIG_CRUNCH) += crunch.o crunch-bits.o -AFLAGS_crunch-bits.o := -Wa,-mcpu=ep9312 - -obj-$(CONFIG_IWMMXT) += iwmmxt.o iwmmxt-notifier.o +obj-$(CONFIG_IWMMXT) += iwmmxt.o AFLAGS_iwmmxt.o := -Wa,-mcpu=iwmmxt ifneq ($(CONFIG_ARCH_EBSA110),y) obj-y += io.o endif -head-y := head$(MMUEXT).o +head-y := head.o obj-$(CONFIG_DEBUG_LL) += debug.o extra-y := $(head-y) init_task.o vmlinux.lds diff --git a/arch/arm/kernel/apm.c b/arch/arm/kernel/apm.c index 33c55689f..766b6c05c 100644 --- a/arch/arm/kernel/apm.c +++ b/arch/arm/kernel/apm.c @@ -10,6 +10,7 @@ * [This document is available from Microsoft at: * http://www.microsoft.com/hwdev/busbios/amp_12.htm] */ +#include #include #include #include @@ -356,8 +357,10 @@ static int apm_open(struct inode * inode, struct file * filp) { struct apm_user *as; - as = (struct apm_user *)kzalloc(sizeof(*as), GFP_KERNEL); + as = (struct apm_user *)kmalloc(sizeof(*as), GFP_KERNEL); if (as) { + memset(as, 0, sizeof(*as)); + /* * XXX - this is a tiny bit broken, when we consider BSD * process accounting. If the device is opened by root, we diff --git a/arch/arm/kernel/armksyms.c b/arch/arm/kernel/armksyms.c index da69e6605..1574941eb 100644 --- a/arch/arm/kernel/armksyms.c +++ b/arch/arm/kernel/armksyms.c @@ -100,22 +100,32 @@ EXPORT_SYMBOL(__raw_writesl); #endif /* string / mem functions */ +EXPORT_SYMBOL(strcpy); +EXPORT_SYMBOL(strncpy); +EXPORT_SYMBOL(strcat); +EXPORT_SYMBOL(strncat); +EXPORT_SYMBOL(strcmp); +EXPORT_SYMBOL(strncmp); EXPORT_SYMBOL(strchr); +EXPORT_SYMBOL(strlen); +EXPORT_SYMBOL(strnlen); +EXPORT_SYMBOL(strpbrk); EXPORT_SYMBOL(strrchr); +EXPORT_SYMBOL(strstr); EXPORT_SYMBOL(memset); EXPORT_SYMBOL(memcpy); EXPORT_SYMBOL(memmove); +EXPORT_SYMBOL(memcmp); +EXPORT_SYMBOL(memscan); EXPORT_SYMBOL(memchr); EXPORT_SYMBOL(__memzero); /* user mem (segment) */ -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(__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(__get_user_1); EXPORT_SYMBOL(__get_user_2); @@ -125,7 +135,6 @@ 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); @@ -181,6 +190,8 @@ EXPORT_SYMBOL(_find_next_bit_be); /* syscalls */ EXPORT_SYMBOL(sys_write); +EXPORT_SYMBOL(sys_read); EXPORT_SYMBOL(sys_lseek); +EXPORT_SYMBOL(sys_open); EXPORT_SYMBOL(sys_exit); EXPORT_SYMBOL(sys_wait4); diff --git a/arch/arm/kernel/asm-offsets.c b/arch/arm/kernel/asm-offsets.c index cc2d58d02..b324dcac1 100644 --- a/arch/arm/kernel/asm-offsets.c +++ b/arch/arm/kernel/asm-offsets.c @@ -59,9 +59,6 @@ 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)); @@ -98,14 +95,5 @@ int main(void) DEFINE(SYS_ERROR0, 0x9f0000); BLANK(); DEFINE(SIZEOF_MACHINE_DESC, sizeof(struct machine_desc)); - DEFINE(MACHINFO_TYPE, offsetof(struct machine_desc, nr)); - DEFINE(MACHINFO_NAME, offsetof(struct machine_desc, name)); - DEFINE(MACHINFO_PHYSIO, offsetof(struct machine_desc, phys_io)); - DEFINE(MACHINFO_PGOFFIO, offsetof(struct machine_desc, io_pg_offst)); - BLANK(); - DEFINE(PROC_INFO_SZ, sizeof(struct proc_info_list)); - DEFINE(PROCINFO_INITFUNC, offsetof(struct proc_info_list, __cpu_flush)); - 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 240c448ec..c4923fac8 100644 --- a/arch/arm/kernel/bios32.c +++ b/arch/arm/kernel/bios32.c @@ -5,6 +5,7 @@ * * Bits taken from various places. */ +#include #include #include #include @@ -303,7 +304,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) { - resource_size_t offset; + unsigned long offset; int i; for (i = 0; i < PCI_NUM_RESOURCES; i++) { @@ -370,6 +371,17 @@ 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; @@ -528,10 +540,12 @@ static void __init pcibios_init_hw(struct hw_pci *hw) int nr, busnr; for (nr = busnr = 0; nr < hw->nr_controllers; nr++) { - sys = kzalloc(sizeof(struct pci_sys_data), GFP_KERNEL); + sys = kmalloc(sizeof(struct pci_sys_data), GFP_KERNEL); if (!sys) panic("PCI: unable to allocate sys data!"); + memset(sys, 0, sizeof(struct pci_sys_data)); + sys->hw = hw; sys->busnr = busnr; sys->swizzle = hw->swizzle; @@ -622,9 +636,9 @@ char * __init pcibios_setup(char *str) * which might be mirrored at 0x0100-0x03ff.. */ void pcibios_align_resource(void *data, struct resource *res, - resource_size_t size, resource_size_t align) + unsigned long size, unsigned long align) { - resource_size_t start = res->start; + unsigned long start = res->start; if (res->flags & IORESOURCE_IO && start & 0x300) start = (start + 0x3ff) & ~0x3ff; @@ -690,6 +704,7 @@ 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/calls.S b/arch/arm/kernel/calls.S index fa5c40c31..83c02a708 100644 --- a/arch/arm/kernel/calls.S +++ b/arch/arm/kernel/calls.S @@ -331,19 +331,6 @@ CALL(sys_mbind) /* 320 */ CALL(sys_get_mempolicy) CALL(sys_set_mempolicy) - CALL(sys_openat) - CALL(sys_mkdirat) - CALL(sys_mknodat) -/* 325 */ CALL(sys_fchownat) - CALL(sys_futimesat) - CALL(sys_fstatat64) - CALL(sys_unlinkat) - CALL(sys_renameat) -/* 330 */ CALL(sys_linkat) - CALL(sys_symlinkat) - CALL(sys_readlinkat) - CALL(sys_fchmodat) - CALL(sys_faccessat) #ifndef syscalls_counted .equ syscalls_padding, ((NR_syscalls + 3) & ~3) - NR_syscalls #define syscalls_counted diff --git a/arch/arm/kernel/compat.c b/arch/arm/kernel/compat.c index 0a1385442..60cfa7f32 100644 --- a/arch/arm/kernel/compat.c +++ b/arch/arm/kernel/compat.c @@ -15,6 +15,7 @@ * 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 a5747e58a..caaa919ab 100644 --- a/arch/arm/kernel/debug.S +++ b/arch/arm/kernel/debug.S @@ -9,7 +9,9 @@ * * 32-bit debugging code */ +#include #include +#include .text diff --git a/arch/arm/kernel/dma-isa.c b/arch/arm/kernel/dma-isa.c index 0a3e9ad29..03532769a 100644 --- a/arch/arm/kernel/dma-isa.c +++ b/arch/arm/kernel/dma-isa.c @@ -143,23 +143,12 @@ static struct dma_ops isa_dma_ops = { .residue = isa_get_dma_residue, }; -static struct resource dma_resources[] = { { - .name = "dma1", - .start = 0x0000, - .end = 0x000f -}, { - .name = "dma low page", - .start = 0x0080, - .end = 0x008f -}, { - .name = "dma2", - .start = 0x00c0, - .end = 0x00df -}, { - .name = "dma high page", - .start = 0x0480, - .end = 0x048f -} }; +static struct resource dma_resources[] = { + { "dma1", 0x0000, 0x000f }, + { "dma low page", 0x0080, 0x008f }, + { "dma2", 0x00c0, 0x00df }, + { "dma high page", 0x0480, 0x048f } +}; void __init isa_init_dma(dma_t *dma) { diff --git a/arch/arm/kernel/ecard.c b/arch/arm/kernel/ecard.c index 3e14b1348..74ea29c32 100644 --- a/arch/arm/kernel/ecard.c +++ b/arch/arm/kernel/ecard.c @@ -27,6 +27,7 @@ */ #define ECARD_C +#include #include #include #include @@ -295,7 +296,7 @@ ecard_task(void * unused) */ static void ecard_call(struct ecard_request *req) { - DECLARE_COMPLETION_ONSTACK(completion); + DECLARE_COMPLETION(completion); req->complete = &completion; @@ -470,8 +471,7 @@ static void ecard_irq_mask(unsigned int irqnr) } } -static struct irq_chip ecard_chip = { - .name = "ECARD", +static struct irqchip ecard_chip = { .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 irq_desc *d = irq_desc + ec->irq; + struct irqdesc *d = irqdesc + ec->irq; /* * this ugly code is so that we can operate a * prioritorising system: @@ -807,12 +807,14 @@ static struct expansion_card *__init ecard_alloc_card(int type, int slot) unsigned long base; int i; - ec = kzalloc(sizeof(ecard_t), GFP_KERNEL); + ec = kmalloc(sizeof(ecard_t), GFP_KERNEL); if (!ec) { ec = ERR_PTR(-ENOMEM); goto nomem; } + memset(ec, 0, sizeof(ecard_t)); + ec->slot_no = slot; ec->type = type; ec->irq = NO_IRQ; @@ -884,7 +886,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, "%08x %08x %08lx\n", + str += sprintf(str, "%08lx %08lx %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 de4e33137..ec48d70c6 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" @@ -484,6 +484,7 @@ call_fpe: movcss r7, r5, lsr #(TIF_USING_IWMMXT + 1) bcs iwmmxt_task_enable #endif + enable_irq add pc, pc, r8, lsr #6 mov r0, r0 @@ -491,15 +492,9 @@ 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 @@ -516,7 +511,6 @@ call_fpe: mov pc, lr @ CP#15 (Control) do_fpe: - enable_irq ldr r4, .LCfp add r10, r10, #TI_FPSTATE @ r10 = workspace ldr pc, [r4] @ Call FP module USR entry point @@ -566,8 +560,10 @@ 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 -#ifdef CONFIG_MMU - ldr r6, [r2, #TI_CPU_DOMAIN] +#ifndef CONFIG_MMU + add r2, r2, #TI_CPU_DOMAIN +#else + ldr r6, [r2, #TI_CPU_DOMAIN]! #endif #if __LINUX_ARM_ARCH__ >= 6 #ifdef CONFIG_CPU_32v6K @@ -589,18 +585,21 @@ ENTRY(__switch_to) #ifdef CONFIG_MMU mcr p15, 0, r6, c3, c0, 0 @ Set domain register #endif -#if defined(CONFIG_CPU_XSCALE) && !defined(CONFIG_IWMMXT) - add r4, r2, #TI_CPU_DOMAIN + 40 @ cpu_context_save->extra +#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 ldmib r4, {r4, r5} mar acc0, r4, r5 #endif - 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 + ldmib r2, {r4 - sl, fp, sp, pc} @ Load all regs saved previously __INIT @@ -634,14 +633,6 @@ 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: @@ -675,7 +666,7 @@ __kuser_helper_start: * * #define __kernel_dmb() \ * asm volatile ( "mov r0, #0xffff0fff; mov lr, pc; sub pc, r0, #95" \ - * : : : "r0", "lr","cc" ) + * : : : "lr","cc" ) */ __kuser_memory_barrier: @ 0xffff0fa0 @@ -683,7 +674,7 @@ __kuser_memory_barrier: @ 0xffff0fa0 #if __LINUX_ARM_ARCH__ >= 6 && defined(CONFIG_SMP) mcr p15, 0, r0, c7, c10, 5 @ dmb #endif - usr_ret lr + mov pc, lr .align 5 @@ -786,7 +777,7 @@ __kuser_cmpxchg: @ 0xffff0fc0 mov r0, #-1 adds r0, r0, #0 #endif - usr_ret lr + mov pc, lr #else @@ -800,7 +791,7 @@ __kuser_cmpxchg: @ 0xffff0fc0 #ifdef CONFIG_SMP mcr p15, 0, r0, c7, c10, 5 @ dmb #endif - usr_ret lr + mov pc, lr #endif @@ -842,11 +833,16 @@ __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 6f5e7c50d..dbcb11a31 100644 --- a/arch/arm/kernel/entry-common.S +++ b/arch/arm/kernel/entry-common.S @@ -7,6 +7,7 @@ * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. */ +#include #include @@ -270,7 +271,7 @@ ENTRY(sys_call_table) @ r8 = syscall table .type sys_syscall, #function sys_syscall: - bic scno, r0, #__NR_OABI_SYSCALL_BASE + eor 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 @@ -339,7 +340,7 @@ sys_mmap2: streq r5, [sp, #4] beq do_mmap2 mov r0, #-EINVAL - mov pc, lr + RETINSTR(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 87ab4e157..55c99cdab 100644 --- a/arch/arm/kernel/entry-header.S +++ b/arch/arm/kernel/entry-header.S @@ -1,3 +1,4 @@ +#include #include #include @@ -36,6 +37,24 @@ #endif .endm +#if __LINUX_ARM_ARCH__ >= 6 + .macro disable_irq + cpsid i + .endm + + .macro enable_irq + cpsie i + .endm +#else + .macro disable_irq + msr cpsr_c, #PSR_I_BIT | SVC_MODE + .endm + + .macro enable_irq + msr cpsr_c, #SVC_MODE + .endm +#endif + .macro get_thread_info, rd mov \rd, sp, lsr #13 mov \rd, \rd, lsl #13 diff --git a/arch/arm/kernel/fiq.c b/arch/arm/kernel/fiq.c index e8e90346f..1ec3f7faa 100644 --- a/arch/arm/kernel/fiq.c +++ b/arch/arm/kernel/fiq.c @@ -38,7 +38,6 @@ #include #include #include -#include #include #include diff --git a/arch/arm/kernel/head.S b/arch/arm/kernel/head.S index 5365d4e59..1aca1775b 100644 --- a/arch/arm/kernel/head.S +++ b/arch/arm/kernel/head.S @@ -11,6 +11,7 @@ * * Kernel startup code for all 32-bit CPUs */ +#include #include #include @@ -23,6 +24,15 @@ #include #include +#define PROCINFO_MMUFLAGS 8 +#define PROCINFO_INITFUNC 12 + +#define MACHINFO_TYPE 0 +#define MACHINFO_PHYSRAM 4 +#define MACHINFO_PHYSIO 8 +#define MACHINFO_PGOFFIO 12 +#define MACHINFO_NAME 16 + #define KERNEL_RAM_ADDR (PAGE_OFFSET + TEXT_OFFSET) /* @@ -70,9 +80,8 @@ __INIT .type stext, %function ENTRY(stext) - msr cpsr_c, #PSR_F_BIT | PSR_I_BIT | SVC_MODE @ ensure svc mode + msr cpsr_c, #PSR_F_BIT | PSR_I_BIT | MODE_SVC @ ensure svc mode @ and irqs disabled - mrc p15, 0, r9, c0, c0 @ get processor id bl __lookup_processor_type @ r5=procinfo r9=cpuid movs r10, r5 @ invalid processor (r5=0)? beq __error_p @ yes, error 'p' @@ -93,6 +102,49 @@ ENTRY(stext) adr lr, __enable_mmu @ return (PIC) address add pc, r10, #PROCINFO_INITFUNC + .type __switch_data, %object +__switch_data: + .long __mmap_switched + .long __data_loc @ r4 + .long __data_start @ r5 + .long __bss_start @ r6 + .long _end @ r7 + .long processor_id @ r4 + .long __machine_arch_type @ r5 + .long cr_alignment @ r6 + .long init_thread_union + THREAD_START_SP @ sp + +/* + * The following fragment of code is executed with the MMU on, and uses + * absolute addresses; this is not position independent. + * + * r0 = cp#15 control register + * r1 = machine ID + * r9 = processor ID + */ + .type __mmap_switched, %function +__mmap_switched: + adr r3, __switch_data + 4 + + ldmia r3!, {r4, r5, r6, r7} + cmp r4, r5 @ Copy data segment if needed +1: cmpne r5, r6 + ldrne fp, [r4], #4 + strne fp, [r5], #4 + bne 1b + + mov fp, #0 @ Clear BSS (and zero fp) +1: cmp r6, r7 + strcc fp, [r6],#4 + bcc 1b + + ldmia r3, {r4, r5, r6, sp} + str r9, [r4] @ Save processor ID + str r1, [r5] @ Save machine type + bic r4, r0, #CR_A @ Clear 'A' bit + stmia r6, {r0, r4} @ Save control register values + b start_kernel + #if defined(CONFIG_SMP) .type secondary_startup, #function ENTRY(secondary_startup) @@ -103,8 +155,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 | SVC_MODE - mrc p15, 0, r9, c0, c0 @ get processor id + msr cpsr_c, #PSR_F_BIT | PSR_I_BIT | MODE_SVC bl __lookup_processor_type movs r10, r5 @ invalid processor? moveq r0, #'p' @ yes, error 'p' @@ -114,18 +165,18 @@ ENTRY(secondary_startup) * Use the page tables supplied from __cpu_up. */ adr r4, __secondary_data - ldmia r4, {r5, r7, r13} @ address to jump to after + ldmia r4, {r5, r6, r13} @ address to jump to after sub r4, r4, r5 @ mmu has been enabled - ldr r4, [r7, r4] @ get secondary_data.pgdir + ldr r4, [r6, r4] @ get secondary_data.pgdir adr lr, __enable_mmu @ return address - add pc, r10, #PROCINFO_INITFUNC @ initialise processor + add pc, r10, #12 @ initialise processor @ (return control reg) /* * r6 = &secondary_data */ ENTRY(__secondary_switched) - ldr sp, [r7, #4] @ get secondary_data.stack + ldr sp, [r6, #4] @ get secondary_data.stack mov fp, #0 b secondary_start_kernel @@ -220,7 +271,7 @@ __create_page_tables: teq r0, r6 bne 1b - ldr r7, [r10, #PROCINFO_MM_MMUFLAGS] @ mm_mmuflags + ldr r7, [r10, #PROCINFO_MMUFLAGS] @ mmuflags /* * Create identity mapping for first MB of kernel to @@ -271,7 +322,8 @@ __create_page_tables: #endif #ifdef CONFIG_DEBUG_LL - ldr r7, [r10, #PROCINFO_IO_MMUFLAGS] @ io_mmuflags + bic r7, r7, #0x0c @ turn off cacheable + @ and bufferable bits /* * Map in IO space for serial debugging. * This allows debug messages to be output @@ -314,4 +366,165 @@ __create_page_tables: mov pc, lr .ltorg -#include "head-common.S" + + +/* + * Exception handling. Something went wrong and we can't proceed. We + * ought to tell the user, but since we don't have any guarantee that + * we're even running on the right architecture, we do virtually nothing. + * + * If CONFIG_DEBUG_LL is set we try to print out something about the error + * and hope for the best (useful if bootloader fails to pass a proper + * machine ID for example). + */ + + .type __error_p, %function +__error_p: +#ifdef CONFIG_DEBUG_LL + adr r0, str_p1 + bl printascii + b __error +str_p1: .asciz "\nError: unrecognized/unsupported processor variant.\n" + .align +#endif + + .type __error_a, %function +__error_a: +#ifdef CONFIG_DEBUG_LL + mov r4, r1 @ preserve machine ID + adr r0, str_a1 + bl printascii + mov r0, r4 + bl printhex8 + adr r0, str_a2 + bl printascii + adr r3, 3f + ldmia r3, {r4, r5, r6} @ get machine desc list + sub r4, r3, r4 @ get offset between virt&phys + add r5, r5, r4 @ convert virt addresses to + add r6, r6, r4 @ physical address space +1: ldr r0, [r5, #MACHINFO_TYPE] @ get machine type + bl printhex8 + mov r0, #'\t' + bl printch + ldr r0, [r5, #MACHINFO_NAME] @ get machine name + add r0, r0, r4 + bl printascii + mov r0, #'\n' + bl printch + add r5, r5, #SIZEOF_MACHINE_DESC @ next machine_desc + cmp r5, r6 + blo 1b + adr r0, str_a3 + bl printascii + b __error +str_a1: .asciz "\nError: unrecognized/unsupported machine ID (r1 = 0x" +str_a2: .asciz ").\n\nAvailable machine support:\n\nID (hex)\tNAME\n" +str_a3: .asciz "\nPlease check your kernel config and/or bootloader.\n" + .align +#endif + + .type __error, %function +__error: +#ifdef CONFIG_ARCH_RPC +/* + * Turn the screen red on a error - RiscPC only. + */ + mov r0, #0x02000000 + mov r3, #0x11 + orr r3, r3, r3, lsl #8 + orr r3, r3, r3, lsl #16 + str r3, [r0], #4 + str r3, [r0], #4 + str r3, [r0], #4 + str r3, [r0], #4 +#endif +1: mov r0, r0 + b 1b + + +/* + * Read processor ID register (CP#15, CR0), and look up in the linker-built + * supported processor list. Note that we can't use the absolute addresses + * for the __proc_info lists since we aren't running with the MMU on + * (and therefore, we are not in the correct address space). We have to + * calculate the offset. + * + * Returns: + * r3, r4, r6 corrupted + * r5 = proc_info pointer in physical address space + * r9 = cpuid + */ + .type __lookup_processor_type, %function +__lookup_processor_type: + adr r3, 3f + ldmda r3, {r5, r6, r9} + sub r3, r3, r9 @ get offset between virt&phys + add r5, r5, r3 @ convert virt addresses to + add r6, r6, r3 @ physical address space + mrc p15, 0, r9, c0, c0 @ get processor id +1: ldmia r5, {r3, r4} @ value, mask + and r4, r4, r9 @ mask wanted bits + teq r3, r4 + beq 2f + add r5, r5, #PROC_INFO_SZ @ sizeof(proc_info_list) + cmp r5, r6 + blo 1b + mov r5, #0 @ unknown processor +2: mov pc, lr + +/* + * This provides a C-API version of the above function. + */ +ENTRY(lookup_processor_type) + stmfd sp!, {r4 - r6, r9, lr} + bl __lookup_processor_type + mov r0, r5 + ldmfd sp!, {r4 - r6, r9, pc} + +/* + * Look in include/asm-arm/procinfo.h and arch/arm/kernel/arch.[ch] for + * more information about the __proc_info and __arch_info structures. + */ + .long __proc_info_begin + .long __proc_info_end +3: .long . + .long __arch_info_begin + .long __arch_info_end + +/* + * Lookup machine architecture in the linker-build list of architectures. + * Note that we can't use the absolute addresses for the __arch_info + * lists since we aren't running with the MMU on (and therefore, we are + * not in the correct address space). We have to calculate the offset. + * + * r1 = machine architecture number + * Returns: + * r3, r4, r6 corrupted + * r5 = mach_info pointer in physical address space + */ + .type __lookup_machine_type, %function +__lookup_machine_type: + adr r3, 3b + ldmia r3, {r4, r5, r6} + sub r3, r3, r4 @ get offset between virt&phys + add r5, r5, r3 @ convert virt addresses to + add r6, r6, r3 @ physical address space +1: ldr r3, [r5, #MACHINFO_TYPE] @ get machine type + teq r3, r1 @ matches loader number? + beq 2f @ found + add r5, r5, #SIZEOF_MACHINE_DESC @ next machine_desc + cmp r5, r6 + blo 1b + mov r5, #0 @ unknown machine +2: mov pc, lr + +/* + * This provides a C-API version of the above function. + */ +ENTRY(lookup_machine_type) + stmfd sp!, {r4 - r6, lr} + mov r1, r0 + bl __lookup_machine_type + mov r0, r5 + ldmfd sp!, {r4 - r6, pc} diff --git a/arch/arm/kernel/irq.c b/arch/arm/kernel/irq.c index 2e1bf830f..1d50d2b98 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 @@ -38,9 +38,28 @@ #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. */ @@ -48,8 +67,163 @@ #define irq_finish(irq) do { } while (0) #endif -void (*init_arch_irq)(void) __initdata = NULL; -unsigned long irq_err_count; +/* + * 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); int show_interrupts(struct seq_file *p, void *v) { @@ -69,22 +243,21 @@ int show_interrupts(struct seq_file *p, void *v) } if (i < NR_IRQS) { - spin_lock_irqsave(&irq_desc[i].lock, flags); - action = irq_desc[i].action; + spin_lock_irqsave(&irq_controller_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_desc[i].lock, flags); + spin_unlock_irqrestore(&irq_controller_lock, flags); } else if (i == NR_IRQS) { #ifdef CONFIG_ARCH_ACORN show_fiq_list(p, v); @@ -98,11 +271,262 @@ unlock: return 0; } -/* Handle bad interrupts */ -static struct irq_desc bad_irq_desc = { - .handle_irq = handle_bad_irq, - .lock = SPIN_LOCK_UNLOCKED -}; +/* + * 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 (!count || noirqdebug) + return; + + count--; + + if (ret != IRQ_HANDLED && ret != IRQ_NONE) { + printk("irq%u: bogus retval mask %x\n", irq, ret); + } else { + 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)); +} /* * do_IRQ handles all hardware IRQ's. Decoded IRQs should not @@ -121,15 +545,96 @@ asmlinkage void asm_do_IRQ(unsigned int irq, struct pt_regs *regs) desc = &bad_irq_desc; irq_enter(); - + spin_lock(&irq_controller_lock); desc_handle_irq(irq, desc, regs); - /* AT91 specific workaround */ + /* + * Now re-run any pending interrupts. + */ + if (!list_empty(&irq_pending)) + do_pending_irqs(regs); + irq_finish(irq); + spin_unlock(&irq_controller_lock); 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; @@ -141,43 +646,422 @@ void set_irq_flags(unsigned int irq, unsigned int iflags) } desc = irq_desc + irq; - 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); + 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); } -void __init init_IRQ(void) +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; - for (irq = 0; irq < NR_IRQS; irq++) - irq_desc[irq].status |= IRQ_NOREQUEST | IRQ_DELAYED_DISABLE | - IRQ_NOPROBE; + 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 +} + +void __init init_IRQ(void) +{ + struct irqdesc *desc; + int irq; #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(); } -#ifdef CONFIG_HOTPLUG_CPU - -static void route_irq(struct irqdesc *desc, unsigned int irq, unsigned int cpu) +static int __init noirqdebug_setup(char *str) { - pr_debug("IRQ%u: moving from cpu%u to cpu%u\n", irq, desc->cpu, cpu); - - spin_lock_irq(&desc->lock); - desc->chip->set_affinity(irq, cpumask_of_cpu(cpu)); - spin_unlock_irq(&desc->lock); + noirqdebug = 1; + return 1; } +__setup("noirqdebug", noirqdebug_setup); + +#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 54bbd9fe2..685c3e591 100644 --- a/arch/arm/kernel/isa.c +++ b/arch/arm/kernel/isa.c @@ -3,14 +3,21 @@ * * 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 @@ -20,49 +27,21 @@ static unsigned int isa_membase, isa_portbase, isa_portshift; static ctl_table ctl_isa_vars[4] = { - { - .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} + {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} }; static struct ctl_table_header *isa_sysctl_header; -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} -}; +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}}; 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 b63b528f2..24c7b0477 100644 --- a/arch/arm/kernel/iwmmxt.S +++ b/arch/arm/kernel/iwmmxt.S @@ -271,27 +271,30 @@ ENTRY(iwmmxt_task_restore) /* * Concan handling on task switch * - * r0 = next thread_info pointer + * r0 = previous task_struct pointer (must be preserved) + * r1 = previous thread_info pointer + * r2 = next thread_info.cpu_domain pointer (must be preserved) * - * Called only from the iwmmxt notifier with task preemption disabled. + * Called only from __switch_to with task preemption disabled. + * No need to care about preserving r4 and above. */ ENTRY(iwmmxt_task_switch) - mrc p15, 0, r1, c15, c1, 0 - tst r1, #0x3 @ CP0 and CP1 accessible? + mrc p15, 0, r4, c15, c1, 0 + tst r4, #0x3 @ CP0 and CP1 accessible? bne 1f @ yes: block them for next task - 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? + 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? movne pc, lr @ no: leave Concan disabled -1: eor r1, r1, #3 @ flip Concan access - mcr p15, 0, r1, c15, c1, 0 +1: eor r4, r4, #3 @ flip Concan access + mcr p15, 0, r4, c15, c1, 0 - mrc p15, 0, r1, c2, c0, 0 - sub pc, lr, r1, lsr #32 @ cpwait and return + mrc p15, 0, r4, c2, c0, 0 + sub pc, lr, r4, 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 298363d97..055bf5d28 100644 --- a/arch/arm/kernel/module.c +++ b/arch/arm/kernel/module.c @@ -9,6 +9,7 @@ * * 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 3079535af..489c069e5 100644 --- a/arch/arm/kernel/process.c +++ b/arch/arm/kernel/process.c @@ -10,6 +10,7 @@ */ #include +#include #include #include #include @@ -27,12 +28,10 @@ #include #include #include -#include #include #include #include -#include #include #include @@ -72,36 +71,8 @@ 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); -} - /* - * Function pointers to optional machine specific functions + * The following aren't currently used. */ void (*pm_idle)(void); EXPORT_SYMBOL(pm_idle); @@ -109,10 +80,6 @@ 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. @@ -184,9 +151,33 @@ void machine_power_off(void) pm_power_off(); } + void machine_restart(char * __unused) { - arm_pm_restart(reboot_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(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); } void __show_regs(struct pt_regs *regs) @@ -273,12 +264,8 @@ void show_fpregs(struct user_fp *regs) /* * Task structure and kernel stack allocation. */ -struct thread_info_list { - unsigned long *head; - unsigned int nr; -}; - -static DEFINE_PER_CPU(struct thread_info_list, thread_info_list) = { NULL, 0 }; +static unsigned long *thread_info_head; +static unsigned int nr_thread_info; #define EXTRA_TASK_STRUCT 4 @@ -287,15 +274,12 @@ struct thread_info *alloc_thread_info(struct task_struct *task) struct thread_info *thread = NULL; if (EXTRA_TASK_STRUCT) { - struct thread_info_list *th = &get_cpu_var(thread_info_list); - unsigned long *p = th->head; + unsigned long *p = thread_info_head; if (p) { - th->head = (unsigned long *)p[0]; - th->nr -= 1; + thread_info_head = (unsigned long *)p[0]; + nr_thread_info -= 1; } - put_cpu_var(thread_info_list); - thread = (struct thread_info *)p; } @@ -316,19 +300,13 @@ struct thread_info *alloc_thread_info(struct task_struct *task) void free_thread_info(struct thread_info *thread) { - if (EXTRA_TASK_STRUCT) { - struct thread_info_list *th = &get_cpu_var(thread_info_list); - if (th->nr < EXTRA_TASK_STRUCT) { - unsigned long *p = (unsigned long *)thread; - p[0] = (unsigned long)th->head; - th->head = p; - th->nr += 1; - put_cpu_var(thread_info_list); - return; - } - put_cpu_var(thread_info_list); - } - free_pages((unsigned long)thread, THREAD_SIZE_ORDER); + if (EXTRA_TASK_STRUCT && nr_thread_info < EXTRA_TASK_STRUCT) { + unsigned long *p = (unsigned long *)thread; + p[0] = (unsigned long)thread_info_head; + thread_info_head = p; + nr_thread_info += 1; + } else + free_pages((unsigned long)thread, THREAD_SIZE_ORDER); } /* @@ -338,9 +316,13 @@ void exit_thread(void) { } -ATOMIC_NOTIFIER_HEAD(thread_notify_head); +static void default_fp_init(union fp_state *fp) +{ + memset(fp, 0, sizeof(union fp_state)); +} -EXPORT_SYMBOL_GPL(thread_notify_head); +void (*fp_init)(union fp_state *) = default_fp_init; +EXPORT_SYMBOL(fp_init); void flush_thread(void) { @@ -349,16 +331,23 @@ void flush_thread(void) memset(thread->used_cp, 0, sizeof(thread->used_cp)); memset(&tsk->thread.debug, 0, sizeof(struct debug_info)); - memset(&thread->fpstate, 0, sizeof(union fp_state)); - - thread_notify(THREAD_NOTIFY_FLUSH, thread); +#if defined(CONFIG_IWMMXT) + iwmmxt_task_release(thread); +#endif + fp_init(&thread->fpstate); +#if defined(CONFIG_VFP) + vfp_flush_thread(&thread->vfpstate); +#endif } void release_thread(struct task_struct *dead_task) { - struct thread_info *thread = task_thread_info(dead_task); - - thread_notify(THREAD_NOTIFY_RELEASE, thread); +#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 } asmlinkage void ret_from_fork(void) __asm__("ret_from_fork"); @@ -485,3 +474,4 @@ unsigned long get_wchan(struct task_struct *p) } while (count ++ < 16); return 0; } +EXPORT_SYMBOL(get_wchan); diff --git a/arch/arm/kernel/ptrace.c b/arch/arm/kernel/ptrace.c index 9254ba2f4..a1d1b2906 100644 --- a/arch/arm/kernel/ptrace.c +++ b/arch/arm/kernel/ptrace.c @@ -9,6 +9,7 @@ * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. */ +#include #include #include #include @@ -633,32 +634,6 @@ 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; @@ -790,16 +765,6 @@ 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; diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c index 0a722e77c..08974cbe9 100644 --- a/arch/arm/kernel/setup.c +++ b/arch/arm/kernel/setup.c @@ -7,6 +7,7 @@ * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. */ +#include #include #include #include @@ -17,7 +18,7 @@ #include #include #include -#include +#include #include #include #include @@ -118,24 +119,9 @@ DEFINE_PER_CPU(struct cpuinfo_arm, cpu_data); * Standard memory resources */ static struct resource mem_res[] = { - { - .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 - } + { "Video RAM", 0, 0, IORESOURCE_MEM }, + { "Kernel text", 0, 0, IORESOURCE_MEM }, + { "Kernel data", 0, 0, IORESOURCE_MEM } }; #define video_ram mem_res[0] @@ -143,24 +129,9 @@ static struct resource mem_res[] = { #define kernel_data mem_res[2] static struct resource io_res[] = { - { - .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 - } + { "reserved", 0x3bc, 0x3be, IORESOURCE_IO | IORESOURCE_BUSY }, + { "reserved", 0x378, 0x37f, IORESOURCE_IO | IORESOURCE_BUSY }, + { "reserved", 0x278, 0x27f, IORESOURCE_IO | IORESOURCE_BUSY } }; #define lp0 io_res[0] @@ -281,9 +252,6 @@ static void __init dump_cpu_info(int cpu) dump_cache("cache", cpu, CACHE_ISIZE(info)); } } - - if (arch_is_coherent()) - printk("Cache coherency enabled\n"); } int cpu_architecture(void) @@ -310,7 +278,7 @@ int cpu_architecture(void) * These functions re-use the assembly code in head.S, which * already provide the required functionality. */ -extern struct proc_info_list *lookup_processor_type(unsigned int); +extern struct proc_info_list *lookup_processor_type(void); extern struct machine_desc *lookup_machine_type(unsigned int); static void __init setup_processor(void) @@ -322,7 +290,7 @@ static void __init setup_processor(void) * types. The linker builds this table for us from the * entries in arch/arm/mm/proc-*.S */ - list = lookup_processor_type(processor_id); + list = lookup_processor_type(); if (!list) { printk("CPU configuration botched (ID %08x), unable " "to continue.\n", processor_id); @@ -344,19 +312,13 @@ static void __init setup_processor(void) cpu_cache = *list->cache; #endif - printk("CPU: %s [%08x] revision %d (ARMv%s), cr=%08lx\n", + printk("CPU: %s [%08x] revision %d (ARMv%s)\n", cpu_name, processor_id, (int)processor_id & 15, - proc_arch[cpu_architecture()], cr_alignment); + proc_arch[cpu_architecture()]); sprintf(system_utsname.machine, "%s%c", list->arch_name, ENDIANNESS); sprintf(elf_platform, "%s%c", list->elf_name, ENDIANNESS); elf_hwcap = list->elf_hwcap; -#ifndef CONFIG_ARM_THUMB - elf_hwcap &= ~HWCAP_THUMB; -#endif -#ifndef CONFIG_VFP - elf_hwcap &= ~HWCAP_VFP; -#endif cpu_proc_init(); } @@ -436,7 +398,7 @@ static void __init early_initrd(char **p) } __early_param("initrd=", early_initrd); -static void __init arm_add_memory(unsigned long start, unsigned long size) +static void __init add_memory(unsigned long start, unsigned long size) { /* * Ensure that start/size are aligned to a page boundary. @@ -474,7 +436,7 @@ static void __init early_mem(char **p) if (**p == '@') start = memparse(*p + 1, p); - arm_add_memory(start, size); + add_memory(start, size); } __early_param("mem=", early_mem); @@ -616,7 +578,7 @@ static int __init parse_tag_mem32(const struct tag *tag) tag->u.mem.start, tag->u.mem.size / 1024); return -EINVAL; } - arm_add_memory(tag->u.mem.start, tag->u.mem.size); + add_memory(tag->u.mem.start, tag->u.mem.size); return 0; } @@ -836,8 +798,8 @@ static int __init topology_init(void) { int cpu; - for_each_possible_cpu(cpu) - register_cpu(&per_cpu(cpu_data, cpu).cpu, cpu); + for_each_cpu(cpu) + register_cpu(&per_cpu(cpu_data, cpu).cpu, cpu, NULL); return 0; } diff --git a/arch/arm/kernel/signal.c b/arch/arm/kernel/signal.c index 48cf7fffd..a0cd0a90a 100644 --- a/arch/arm/kernel/signal.c +++ b/arch/arm/kernel/signal.c @@ -7,6 +7,7 @@ * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. */ +#include #include #include #include @@ -131,38 +132,18 @@ sys_sigaction(int sig, const struct old_sigaction __user *act, return ret; } -#ifdef CONFIG_CRUNCH -static int preserve_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); - 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)); -} - -static int restore_crunch_context(struct crunch_sigframe *frame) -{ - char kbuf[sizeof(*frame) + 8]; - struct crunch_sigframe *kframe; +#ifdef CONFIG_IWMMXT - /* 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 +/* 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 -#ifdef CONFIG_IWMMXT +struct iwmmxt_sigframe { + unsigned long magic0; + unsigned long magic1; + unsigned long storage[0x98/4]; +}; static int preserve_iwmmxt_context(struct iwmmxt_sigframe *frame) { @@ -171,8 +152,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->magic = IWMMXT_MAGIC; - kframe->size = IWMMXT_STORAGE_SIZE; + kframe->magic0 = IWMMXT_MAGIC0; + kframe->magic1 = IWMMXT_MAGIC1; iwmmxt_task_copy(current_thread_info(), &kframe->storage); return __copy_to_user(frame, kframe, sizeof(*frame)); } @@ -186,8 +167,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->magic != IWMMXT_MAGIC || - kframe->size != IWMMXT_STORAGE_SIZE) + if (kframe->magic0 != IWMMXT_MAGIC0 || + kframe->magic1 != IWMMXT_MAGIC1) return -1; iwmmxt_task_restore(current_thread_info(), &kframe->storage); return 0; @@ -195,66 +176,71 @@ 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 ucontext uc; + struct sigcontext sc; + unsigned long extramask[_NSIG_WORDS-1]; 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 sigframe sig; + struct ucontext uc; + unsigned long retcode[2]; + struct aux_sigframe aux __attribute__((aligned(8))); }; -static int restore_sigframe(struct pt_regs *regs, struct sigframe __user *sf) +static int +restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc, + struct aux_sigframe __user *aux) { - struct aux_sigframe __user *aux; - sigset_t set; - int 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); - } + int err = 0; - __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); + __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 |= !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(&sf->aux.vfp); +// err |= vfp_restore_state(&aux->vfp); #endif return err; @@ -263,6 +249,7 @@ static int restore_sigframe(struct pt_regs *regs, struct sigframe __user *sf) 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; @@ -279,8 +266,19 @@ 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; - if (restore_sigframe(regs, frame)) + 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)) goto badframe; /* Send SIGTRAP if we're single-stepping */ @@ -299,6 +297,7 @@ 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; @@ -315,11 +314,19 @@ 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_sigframe(regs, &frame->sig)) + if (restore_sigcontext(regs, &frame->uc.uc_mcontext, &frame->aux)) goto badframe; - if (do_sigaltstack(&frame->sig.uc.uc_stack, NULL, regs->ARM_sp) == -EFAULT) + if (do_sigaltstack(&frame->uc.uc_stack, NULL, regs->ARM_sp) == -EFAULT) goto badframe; /* Send SIGTRAP if we're single-stepping */ @@ -336,50 +343,42 @@ badframe: } static int -setup_sigframe(struct sigframe __user *sf, struct pt_regs *regs, sigset_t *set) +setup_sigcontext(struct sigcontext __user *sc, struct aux_sigframe __user *aux, + struct pt_regs *regs, unsigned long mask) { - struct aux_sigframe __user *aux; int err = 0; - __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 + __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); + #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(&sf->aux.vfp); +// err |= vfp_save_state(&aux->vfp); #endif - __put_user_error(0, &aux->end_magic, err); return err; } @@ -488,12 +487,13 @@ setup_frame(int usig, struct k_sigaction *ka, sigset_t *set, struct pt_regs *reg if (!frame) return 1; - /* - * 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_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)); + } - err |= setup_sigframe(frame, regs, set); if (err == 0) err = setup_return(regs, ka, frame->retcode, frame, usig); @@ -511,20 +511,25 @@ 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->sig.uc.uc_flags, err); - __put_user_error(NULL, &frame->sig.uc.uc_link, err); + __put_user_error(0, &frame->uc.uc_flags, err); + __put_user_error(NULL, &frame->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->sig.uc.uc_stack, &stack, sizeof(stack)); + 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 |= setup_sigframe(&frame->sig, regs, set); if (err == 0) - err = setup_return(regs, ka, frame->sig.retcode, frame, usig); + err = setup_return(regs, ka, frame->retcode, frame, usig); if (err == 0) { /* @@ -533,7 +538,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->sig.uc; + regs->ARM_r2 = (unsigned long)&frame->uc; } return err; @@ -660,33 +665,17 @@ 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 - __NR_SYSCALL_BASE; + regs->ARM_r7 = __NR_restart_syscall; 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 | swival, &usp[1]); + put_user(0xef000000 | __NR_restart_syscall, &usp[1]); /* ldr pc, [sp], #12 */ put_user(0xe49df00c, &usp[2]); @@ -694,7 +683,6 @@ 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/signal.h b/arch/arm/kernel/signal.h index 27beece15..9991049c5 100644 --- a/arch/arm/kernel/signal.h +++ b/arch/arm/kernel/signal.h @@ -7,6 +7,6 @@ * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. */ -#define KERN_SIGRETURN_CODE (CONFIG_VECTORS_BASE + 0x00000500) +#define KERN_SIGRETURN_CODE 0xffff0500 extern const unsigned long sigreturn_codes[7]; diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c index 68e9634d2..02aa300c4 100644 --- a/arch/arm/kernel/smp.c +++ b/arch/arm/kernel/smp.c @@ -7,6 +7,7 @@ * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. */ +#include #include #include #include @@ -336,6 +337,9 @@ void __init smp_prepare_boot_cpu(void) unsigned int cpu = smp_processor_id(); per_cpu(cpu_data, cpu).idle = current; + + cpu_set(cpu, cpu_present_map); + cpu_set(cpu, cpu_online_map); } static void send_ipi_message(cpumask_t callmap, enum ipi_msg_type msg) diff --git a/arch/arm/kernel/sys_arm.c b/arch/arm/kernel/sys_arm.c index 8170af471..a491de2d9 100644 --- a/arch/arm/kernel/sys_arm.c +++ b/arch/arm/kernel/sys_arm.c @@ -234,12 +234,7 @@ asmlinkage int sys_ipc(uint call, int first, int second, int third, */ asmlinkage int sys_fork(struct pt_regs *regs) { -#ifdef CONFIG_MMU return do_fork(SIGCHLD, regs->ARM_sp, regs, 0, NULL, NULL); -#else - /* can not support in nommu mode */ - return(-EINVAL); -#endif } /* Clone a task - this clones the calling program thread. diff --git a/arch/arm/kernel/time.c b/arch/arm/kernel/time.c index 09a67d771..d6bd435a6 100644 --- a/arch/arm/kernel/time.c +++ b/arch/arm/kernel/time.c @@ -16,6 +16,7 @@ * 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 @@ -378,7 +379,7 @@ static int timer_dyn_tick_enable(void) int ret = -ENODEV; if (dyn_tick) { - spin_lock_irqsave(&dyn_tick->lock, flags); + write_seqlock_irqsave(&xtime_lock, flags); ret = 0; if (!(dyn_tick->state & DYN_TICK_ENABLED)) { ret = dyn_tick->enable(); @@ -386,7 +387,7 @@ static int timer_dyn_tick_enable(void) if (ret == 0) dyn_tick->state |= DYN_TICK_ENABLED; } - spin_unlock_irqrestore(&dyn_tick->lock, flags); + write_sequnlock_irqrestore(&xtime_lock, flags); } return ret; @@ -399,7 +400,7 @@ static int timer_dyn_tick_disable(void) int ret = -ENODEV; if (dyn_tick) { - spin_lock_irqsave(&dyn_tick->lock, flags); + write_seqlock_irqsave(&xtime_lock, flags); ret = 0; if (dyn_tick->state & DYN_TICK_ENABLED) { ret = dyn_tick->disable(); @@ -407,7 +408,7 @@ static int timer_dyn_tick_disable(void) if (ret == 0) dyn_tick->state &= ~DYN_TICK_ENABLED; } - spin_unlock_irqrestore(&dyn_tick->lock, flags); + write_sequnlock_irqrestore(&xtime_lock, flags); } return ret; @@ -421,20 +422,15 @@ 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, flags; + unsigned long next, seq; - if (!dyn_tick) - return; - - spin_lock_irqsave(&dyn_tick->lock, flags); - if (dyn_tick->state & DYN_TICK_ENABLED) { + if (dyn_tick && (dyn_tick->state & DYN_TICK_ENABLED)) { next = next_timer_interrupt(); do { seq = read_seqbegin(&xtime_lock); - dyn_tick->reprogram(next - jiffies); + dyn_tick->reprogram(next_timer_interrupt() - 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) @@ -503,10 +499,5 @@ 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 aeeed806f..03924bcc6 100644 --- a/arch/arm/kernel/traps.c +++ b/arch/arm/kernel/traps.c @@ -12,6 +12,7 @@ * 'linux/arch/arm/lib/traps.S'. Mostly a debugging aid, but will probably * kill the offending process. */ +#include #include #include #include @@ -232,8 +233,11 @@ 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) + if (panic_on_oops) { + printk(KERN_EMERG "Fatal exception: panic in 5 seconds\n"); + ssleep(5); panic("Fatal exception"); + } do_exit(SIGSEGV); } @@ -502,7 +506,7 @@ asmlinkage int arm_syscall(int no, struct pt_regs *regs) if (!pmd_present(*pmd)) goto bad_access; pte = pte_offset_map_lock(mm, pmd, addr, &ptl); - if (!pte_present(*pte) || !pte_dirty(*pte)) { + if (!pte_present(*pte) || !pte_write(*pte)) { pte_unmap_unlock(pte, ptl); goto bad_access; } @@ -684,7 +688,6 @@ EXPORT_SYMBOL(abort); void __init trap_init(void) { - unsigned long vectors = CONFIG_VECTORS_BASE; extern char __stubs_start[], __stubs_end[]; extern char __vectors_start[], __vectors_end[]; extern char __kuser_helper_start[], __kuser_helper_end[]; @@ -695,9 +698,9 @@ void __init trap_init(void) * into the vector page, mapped at 0xffff0000, and ensure these * are visible to the instruction stream. */ - memcpy((void *)vectors, __vectors_start, __vectors_end - __vectors_start); - memcpy((void *)vectors + 0x200, __stubs_start, __stubs_end - __stubs_start); - memcpy((void *)vectors + 0x1000 - kuser_sz, __kuser_helper_start, kuser_sz); + memcpy((void *)0xffff0000, __vectors_start, __vectors_end - __vectors_start); + memcpy((void *)0xffff0200, __stubs_start, __stubs_end - __stubs_start); + memcpy((void *)0xffff1000 - kuser_sz, __kuser_helper_start, kuser_sz); /* * Copy signal return handlers into the vector page, and @@ -706,6 +709,6 @@ void __init trap_init(void) memcpy((void *)KERN_SIGRETURN_CODE, sigreturn_codes, sizeof(sigreturn_codes)); - flush_icache_range(vectors, vectors + PAGE_SIZE); + flush_icache_range(0xffff0000, 0xffff0000 + PAGE_SIZE); modify_domain(DOMAIN_USER, DOMAIN_CLIENT); } diff --git a/arch/arm/kernel/vmlinux.lds.S b/arch/arm/kernel/vmlinux.lds.S index 3ca574ee2..2b254e885 100644 --- a/arch/arm/kernel/vmlinux.lds.S +++ b/arch/arm/kernel/vmlinux.lds.S @@ -4,6 +4,7 @@ */ #include +#include #include #include @@ -79,10 +80,6 @@ SECTIONS *(.exit.text) *(.exit.data) *(.exitcall.exit) -#ifndef CONFIG_MMU - *(.fixup) - *(__ex_table) -#endif } .text : { /* Real text segment */ @@ -90,9 +87,7 @@ SECTIONS *(.text) SCHED_TEXT LOCK_TEXT -#ifdef CONFIG_MMU *(.fixup) -#endif *(.gnu.warning) *(.rodata) *(.rodata.*) @@ -147,9 +142,7 @@ 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 30351cd45..391f3ab3f 100644 --- a/arch/arm/lib/Makefile +++ b/arch/arm/lib/Makefile @@ -6,31 +6,28 @@ lib-y := backtrace.o changebit.o csumipv6.o csumpartial.o \ csumpartialcopy.o csumpartialcopyuser.o clearbit.o \ - delay.o findbit.o memchr.o memcpy.o \ + copy_page.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) - mmu-y += copy_from_user.o copy_to_user.o +ifeq ($CONFIG_PREEMPT,y) + lib-y += copy_from_user.o copy_to_user.o else ifneq ($(CONFIG_CPU_32v3),y) - mmu-y += copy_from_user.o copy_to_user.o + lib-y += copy_from_user.o copy_to_user.o else - mmu-y += uaccess.o + lib-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 74230083c..68a21c0f3 100644 --- a/arch/arm/lib/backtrace.S +++ b/arch/arm/lib/backtrace.S @@ -10,6 +10,7 @@ * 27/03/03 Ian Molton Clean up CONFIG_CPU * */ +#include #include #include .text @@ -28,7 +29,7 @@ ENTRY(__backtrace) ENTRY(c_backtrace) -#if !defined(CONFIG_FRAME_POINTER) || !defined(CONFIG_PRINTK) +#ifndef CONFIG_FRAME_POINTER mov pc, lr #else @@ -40,7 +41,7 @@ ENTRY(c_backtrace) movne r0, #0 movs frame, r0 1: moveq r0, #-2 - ldmeqfd sp!, {r4 - r8, pc} + LOADREGS(eqfd, sp!, {r4 - r8, pc}) 2: stmfd sp!, {pc} @ calculate offset of PC in STMIA instruction ldr r0, [sp], #4 @@ -84,7 +85,7 @@ ENTRY(c_backtrace) * A zero next framepointer means we're done. */ teq next, #0 - ldmeqfd sp!, {r4 - r8, pc} + LOADREGS(eqfd, sp!, {r4 - r8, pc}) /* * The next framepointer must be above the @@ -96,13 +97,16 @@ ENTRY(c_backtrace) b 1007f /* - * Fixup for LDMDB. Note that this must not be in the fixup section. + * Fixup for LDMDB */ + .section .fixup,"ax" + .align 0 1007: ldr r0, =.Lbad mov r1, frame bl printk - ldmfd sp!, {r4 - r8, pc} + LOADREGS(fd, sp!, {r4 - r8, pc}) .ltorg + .previous .section __ex_table,"a" .align 3 @@ -118,7 +122,7 @@ ENTRY(c_backtrace) #define reg r5 #define stack r6 -.Ldumpstm: stmfd sp!, {instr, reg, stack, r7, r8, lr} +.Ldumpstm: stmfd sp!, {instr, reg, stack, r7, lr} mov stack, r0 mov instr, r1 mov reg, #9 @@ -141,7 +145,7 @@ ENTRY(c_backtrace) adrne r0, .Lcr blne printk mov r0, stack - ldmfd sp!, {instr, reg, stack, r7, r8, pc} + LOADREGS(fd, sp!, {instr, reg, stack, r7, 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 542251021..b8c14e936 100644 --- a/arch/arm/lib/bitops.h +++ b/arch/arm/lib/bitops.h @@ -1,3 +1,4 @@ +#include #if __LINUX_ARM_ARCH__ >= 6 && defined(CONFIG_CPU_32v6K) .macro bitop, instr diff --git a/arch/arm/lib/clear_user.S b/arch/arm/lib/clear_user.S index ecb28dcda..7ff9f831b 100644 --- a/arch/arm/lib/clear_user.S +++ b/arch/arm/lib/clear_user.S @@ -12,13 +12,13 @@ .text -/* Prototype: int __clear_user(void *addr, size_t sz) +/* Prototype: int __arch_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(__clear_user) +ENTRY(__arch_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 - ldmfd sp!, {r1, pc} + LOADREGS(fd,sp!, {r1, pc}) .section .fixup,"ax" .align 0 -9001: ldmfd sp!, {r0, pc} +9001: LOADREGS(fd,sp!, {r0, pc}) .previous diff --git a/arch/arm/lib/copy_from_user.S b/arch/arm/lib/copy_from_user.S index 6b7363ce7..7497393a0 100644 --- a/arch/arm/lib/copy_from_user.S +++ b/arch/arm/lib/copy_from_user.S @@ -16,7 +16,7 @@ /* * Prototype: * - * size_t __copy_from_user(void *to, const void *from, size_t n) + * size_t __arch_copy_from_user(void *to, const void *from, size_t n) * * Purpose: * @@ -83,7 +83,7 @@ .text -ENTRY(__copy_from_user) +ENTRY(__arch_copy_from_user) #include "copy_template.S" diff --git a/arch/arm/lib/copy_page.S b/arch/arm/lib/copy_page.S index 666c99cc0..681179684 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 ) - ldmfd sp!, {r4, pc} @ 3 + LOADREGS(fd, sp!, {r4, pc}) @ 3 diff --git a/arch/arm/lib/copy_template.S b/arch/arm/lib/copy_template.S index cab355c0c..838e435e4 100644 --- a/arch/arm/lib/copy_template.S +++ b/arch/arm/lib/copy_template.S @@ -236,7 +236,7 @@ /* - * Abort preamble and completion macros. + * Abort preanble and completion macros. * If a fixup handler is required then those macros must surround it. * It is assumed that the fixup code will handle the private part of * the exit macro. diff --git a/arch/arm/lib/copy_to_user.S b/arch/arm/lib/copy_to_user.S index 5224d9468..4a6d8ea14 100644 --- a/arch/arm/lib/copy_to_user.S +++ b/arch/arm/lib/copy_to_user.S @@ -16,7 +16,7 @@ /* * Prototype: * - * size_t __copy_to_user(void *to, const void *from, size_t n) + * size_t __arch_copy_to_user(void *to, const void *from, size_t n) * * Purpose: * @@ -86,7 +86,7 @@ .text -ENTRY(__copy_to_user) +ENTRY(__arch_copy_to_user) #include "copy_template.S" diff --git a/arch/arm/lib/csumipv6.S b/arch/arm/lib/csumipv6.S index 9621469be..7065a20ee 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 - ldmfd sp!, {pc} + LOADREGS(fd, sp!, {pc}) diff --git a/arch/arm/lib/delay.S b/arch/arm/lib/delay.S index 930a70259..b3fb475b4 100644 --- a/arch/arm/lib/delay.S +++ b/arch/arm/lib/delay.S @@ -9,32 +9,28 @@ */ #include #include -#include .text .LC0: .word loops_per_jiffy -.LC1: .word (2199023*HZ)>>11 /* - * r0 <= 2000 - * lpj <= 0x01ffffff (max. 3355 bogomips) - * HZ <= 1000 + * 0 <= r0 <= 2000 */ - ENTRY(__udelay) - ldr r2, .LC1 + mov r2, #0x6800 + orr r2, r2, #0x00db mul r0, r2, r0 -ENTRY(__const_udelay) @ 0 <= r0 <= 0x7fffff06 +ENTRY(__const_udelay) @ 0 <= r0 <= 0x01ffffff ldr r2, .LC0 - ldr r2, [r2] @ max = 0x01ffffff - mov r0, r0, lsr #14 @ max = 0x0001ffff - mov r2, r2, lsr #10 @ max = 0x00007fff + ldr r2, [r2] @ max = 0x0fffffff + mov r0, r0, lsr #11 @ max = 0x00003fff + mov r2, r2, lsr #11 @ max = 0x0003ffff mul r0, r2, r0 @ max = 2^32-1 movs r0, r0, lsr #6 - moveq pc, lr + RETINSTR(moveq,pc,lr) /* - * loops = r0 * HZ * loops_per_jiffy / 1000000 + * loops = (r0 * 0x10c6 * 100 * loops_per_jiffy) / 2^32 * * Oh, if only we had a cycle counter... */ @@ -43,20 +39,20 @@ ENTRY(__const_udelay) @ 0 <= r0 <= 0x7fffff06 ENTRY(__delay) subs r0, r0, #1 #if 0 - movls pc, lr + RETINSTR(movls,pc,lr) subs r0, r0, #1 - movls pc, lr + RETINSTR(movls,pc,lr) subs r0, r0, #1 - movls pc, lr + RETINSTR(movls,pc,lr) subs r0, r0, #1 - movls pc, lr + RETINSTR(movls,pc,lr) subs r0, r0, #1 - movls pc, lr + RETINSTR(movls,pc,lr) subs r0, r0, #1 - movls pc, lr + RETINSTR(movls,pc,lr) subs r0, r0, #1 - movls pc, lr + RETINSTR(movls,pc,lr) subs r0, r0, #1 #endif bhi __delay - mov pc, lr + RETINSTR(mov,pc,lr) diff --git a/arch/arm/lib/div64.S b/arch/arm/lib/div64.S index 58eef6607..ec9a1cd61 100644 --- a/arch/arm/lib/div64.S +++ b/arch/arm/lib/div64.S @@ -189,12 +189,12 @@ ENTRY(__do_div64) moveq pc, lr @ Division by 0: - str lr, [sp, #-8]! + str lr, [sp, #-4]! bl __div0 @ as wrong as it could be... mov yl, #0 mov yh, #0 mov xh, #0 - ldr pc, [sp], #8 + ldr pc, [sp], #4 diff --git a/arch/arm/lib/ecard.S b/arch/arm/lib/ecard.S index c55aaa2a2..fb7b602a6 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 - ldmfd sp!, {r4 - r12, pc} + LOADREGS(fd, 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 - ldmfd sp!, {r4 - r12, pc} + LOADREGS(fd, sp!, {r4 - r12, pc}) diff --git a/arch/arm/lib/findbit.S b/arch/arm/lib/findbit.S index a5ca0248a..6f8e27a58 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 - mov pc, lr + RETINSTR(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 - mov pc, lr + RETINSTR(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 - mov pc, lr + RETINSTR(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 - mov pc, lr + RETINSTR(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 - mov pc, lr + RETINSTR(mov,pc,lr) diff --git a/arch/arm/lib/io-acorn.S b/arch/arm/lib/io-acorn.S index 1b197ea7a..b15352363 100644 --- a/arch/arm/lib/io-acorn.S +++ b/arch/arm/lib/io-acorn.S @@ -12,6 +12,7 @@ */ #include #include +#include .text .align diff --git a/arch/arm/lib/io-readsb.S b/arch/arm/lib/io-readsb.S index fb966ad02..d3d8de71a 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 - ldmeqfd sp!, {r4 - r6, pc} + LOADREGS(eqfd, 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 - ldmeqfd sp!, {r4 - r6, pc} + LOADREGS(eqfd, sp!, {r4 - r6, pc}) cmp r2, #2 ldrb r3, [r0] @@ -119,4 +119,4 @@ ENTRY(__raw_readsb) ldrgtb r3, [r0] strgtb r3, [r1] - ldmfd sp!, {r4 - r6, pc} + LOADREGS(fd, sp!, {r4 - r6, pc}) diff --git a/arch/arm/lib/io-readsw-armv3.S b/arch/arm/lib/io-readsw-armv3.S index 4ef904185..146d47c15 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 - moveq pc, lr + RETINSTR(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 - ldmeqfd sp!, {r4, r5, r6, pc} + LOADREGS(eqfd, 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] - ldmfd sp!, {r4, r5, r6, pc} + LOADREGS(fd, sp!, {r4, r5, r6, pc}) diff --git a/arch/arm/lib/io-writesb.S b/arch/arm/lib/io-writesb.S index 7eba2b6cc..08209fc64 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 - ldmeqfd sp!, {r4, r5, pc} + LOADREGS(eqfd, 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 - ldmeqfd sp!, {r4, r5, pc} + LOADREGS(eqfd, sp!, {r4, r5, pc}) cmp r2, #2 ldrb r3, [r1], #1 @@ -90,4 +90,4 @@ ENTRY(__raw_writesb) ldrgtb r3, [r1] strgtb r3, [r0] - ldmfd sp!, {r4, r5, pc} + LOADREGS(fd, sp!, {r4, r5, pc}) diff --git a/arch/arm/lib/io-writesw-armv3.S b/arch/arm/lib/io-writesw-armv3.S index 1607a29f4..52d62b481 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 - moveq pc, lr + RETINSTR(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 - ldmeqfd sp!, {r4, r5, r6, pc} + LOADREGS(eqfd, 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] - ldmfd sp!, {r4, r5, r6, pc} + LOADREGS(fd, sp!, {r4, r5, r6, pc}) diff --git a/arch/arm/lib/memchr.S b/arch/arm/lib/memchr.S index e7ab1ea8e..ac34fe55d 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 - mov pc, lr + RETINSTR(mov,pc,lr) diff --git a/arch/arm/lib/memset.S b/arch/arm/lib/memset.S index 95b110b07..a1795f599 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 - ldmeqfd sp!, {pc} @ Now <64 bytes to go. + LOADREGS(eqfd, 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 - mov pc, lr + RETINSTR(mov,pc,lr) diff --git a/arch/arm/lib/memzero.S b/arch/arm/lib/memzero.S index abf2508e8..51ccc6016 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 - ldmeqfd sp!, {pc} @ 1/2 quick exit + LOADREGS(eqfd, 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 - mov pc, lr @ 1 + RETINSTR(mov,pc,lr) @ 1 diff --git a/arch/arm/lib/strchr.S b/arch/arm/lib/strchr.S index 9f18d6fde..5b9b49373 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 - mov pc, lr + RETINSTR(mov,pc,lr) diff --git a/arch/arm/lib/strncpy_from_user.S b/arch/arm/lib/strncpy_from_user.S index 36e3741a3..629cc8775 100644 --- a/arch/arm/lib/strncpy_from_user.S +++ b/arch/arm/lib/strncpy_from_user.S @@ -20,7 +20,8 @@ * returns the number of characters copied (strlen of copied string), * -EFAULT on exception, or "len" if we fill the whole buffer */ -ENTRY(__strncpy_from_user) +ENTRY(__arch_strncpy_from_user) + save_lr mov ip, r1 1: subs r2, r2, #1 USER( ldrplbt r3, [r1], #1) @@ -30,13 +31,13 @@ USER( ldrplbt r3, [r1], #1) bne 1b sub r1, r1, #1 @ take NUL character out of count 2: sub r0, r1, ip - mov pc, lr + restore_pc .section .fixup,"ax" .align 0 9001: mov r3, #0 strb r3, [r0, #0] @ null terminate mov r0, #-EFAULT - mov pc, lr + restore_pc .previous diff --git a/arch/arm/lib/strnlen_user.S b/arch/arm/lib/strnlen_user.S index 18d8fa4f9..67bcd8268 100644 --- a/arch/arm/lib/strnlen_user.S +++ b/arch/arm/lib/strnlen_user.S @@ -14,13 +14,14 @@ .text .align 5 -/* Prototype: unsigned long __strnlen_user(const char *str, long n) +/* Prototype: unsigned long __arch_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(__strnlen_user) +ENTRY(__arch_strnlen_user) + save_lr mov r2, r0 1: USER( ldrbt r3, [r0], #1) @@ -30,10 +31,10 @@ USER( ldrbt r3, [r0], #1) bne 1b add r0, r0, #1 2: sub r0, r0, r2 - mov pc, lr + restore_pc .section .fixup,"ax" .align 0 9001: mov r0, #0 - mov pc, lr + restore_pc .previous diff --git a/arch/arm/lib/strrchr.S b/arch/arm/lib/strrchr.S index 538df220a..fa923f026 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 - mov pc, lr + RETINSTR(mov,pc,lr) diff --git a/arch/arm/lib/uaccess.S b/arch/arm/lib/uaccess.S index b48bd6d5f..0cc450f86 100644 --- a/arch/arm/lib/uaccess.S +++ b/arch/arm/lib/uaccess.S @@ -19,7 +19,7 @@ #define PAGE_SHIFT 12 -/* Prototype: int __copy_to_user(void *to, const char *from, size_t n) +/* Prototype: int __arch_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(__copy_to_user) +ENTRY(__arch_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 - ldmfd sp!, {r2, r4 - r7, pc} + LOADREGS(fd,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: ldmfd sp!, {r0, r4 - r7, pc} +9001: LOADREGS(fd,sp!, {r0, r4 - r7, pc}) .previous -/* Prototype: unsigned long __copy_from_user(void *to,const void *from,unsigned long n); +/* Prototype: unsigned long __arch_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(__copy_from_user) +ENTRY(__arch_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 - ldmfd sp!, {r4 - r7, pc} + LOADREGS(fd,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 - ldmfd sp!, {r4 - r7, pc} + LOADREGS(fd,sp!, {r4 - r7, pc}) .previous diff --git a/arch/arm/lib/ucmpdi2.S b/arch/arm/lib/ucmpdi2.S index f76de07ac..d847a6283 100644 --- a/arch/arm/lib/ucmpdi2.S +++ b/arch/arm/lib/ucmpdi2.S @@ -10,6 +10,7 @@ * published by the Free Software Foundation. */ +#include #include #ifdef __ARMEB__ diff --git a/arch/arm/mach-aaec2000/aaed2000.c b/arch/arm/mach-aaec2000/aaed2000.c index 83f57da31..dc5fa8e5e 100644 --- a/arch/arm/mach-aaec2000/aaed2000.c +++ b/arch/arm/mach-aaec2000/aaed2000.c @@ -79,12 +79,7 @@ static void __init aaed2000_init(void) } static struct map_desc aaed2000_io_desc[] __initdata = { - { - .virtual = EXT_GPIO_VBASE, - .pfn = __phys_to_pfn(EXT_GPIO_PBASE), - .length = EXT_GPIO_LENGTH, - .type = MT_DEVICE - }, + { EXT_GPIO_VBASE, EXT_GPIO_PBASE, EXT_GPIO_LENGTH, MT_DEVICE }, /* Ext GPIO */ }; static void __init aaed2000_map_io(void) diff --git a/arch/arm/mach-aaec2000/core.c b/arch/arm/mach-aaec2000/core.c index baa997c85..dce4815cf 100644 --- a/arch/arm/mach-aaec2000/core.c +++ b/arch/arm/mach-aaec2000/core.c @@ -9,6 +9,7 @@ * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. */ +#include #include #include #include @@ -19,6 +20,7 @@ #include #include #include +#include #include #include @@ -48,12 +50,12 @@ static struct map_desc standard_io_desc[] __initdata = { { .virtual = VIO_APB_BASE, - .pfn = __phys_to_pfn(PIO_APB_BASE), + .physical = __phys_to_pfn(PIO_APB_BASE), .length = IO_APB_LENGTH, .type = MT_DEVICE }, { .virtual = VIO_AHB_BASE, - .pfn = __phys_to_pfn(PIO_AHB_BASE), + .physical = __phys_to_pfn(PIO_AHB_BASE), .length = IO_AHB_LENGTH, .type = MT_DEVICE } @@ -142,7 +144,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 = IRQF_DISABLED | IRQF_TIMER, + .flags = SA_INTERRUPT | SA_TIMER, .handler = aaec2000_timer_interrupt, }; diff --git a/arch/arm/mach-aaec2000/core.h b/arch/arm/mach-aaec2000/core.h index 59501b573..b6029a95f 100644 --- a/arch/arm/mach-aaec2000/core.h +++ b/arch/arm/mach-aaec2000/core.h @@ -9,7 +9,6 @@ * */ -#include #include struct sys_timer; diff --git a/arch/arm/mach-at91rm9200/Kconfig b/arch/arm/mach-at91rm9200/Kconfig index 2f85e8693..4b7218fc3 100644 --- a/arch/arm/mach-at91rm9200/Kconfig +++ b/arch/arm/mach-at91rm9200/Kconfig @@ -1,109 +1,47 @@ -if ARCH_AT91 - -menu "Atmel AT91 System-on-Chip" - -comment "Atmel AT91 Processors" - -config ARCH_AT91RM9200 - bool "AT91RM9200" - -config ARCH_AT91SAM9260 - bool "AT91SAM9260" - -config ARCH_AT91SAM9261 - bool "AT91SAM9261" - -# ---------------------------------------------------------- - if ARCH_AT91RM9200 -comment "AT91RM9200 Board Type" +menu "AT91RM9200 Implementations" -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. - +comment "AT91RM9200 Board Type" 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. - (Discontinued) - + Select this if you are using Atmel's AT91RM9200-DK Development board 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" + bool "Cogent CSB337 board" 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" + bool "Cogent CSB637 board" 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 ARM&EVA" + bool "Conitec's ARM&EVA" depends on ARCH_AT91RM9200 help - 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. - + Select this if you are using Conitec's AT91RM9200-MCU-Module config MACH_KB9200 - bool "KwikByte KB920x" + bool "KwikByte's KB920x" depends on ARCH_AT91RM9200 help - 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 - + Select this if you are using KwikByte's KB920x board -# ---------------------------------------------------------- -comment "AT91 Feature Selections" +comment "AT91RM9200 Feature Selections" config AT91_PROGRAMMABLE_CLOCKS bool "Programmable Clocks" diff --git a/arch/arm/mach-at91rm9200/Makefile b/arch/arm/mach-at91rm9200/Makefile index c174805c2..75e6ee318 100644 --- a/arch/arm/mach-at91rm9200/Makefile +++ b/arch/arm/mach-at91rm9200/Makefile @@ -2,46 +2,26 @@ # Makefile for the linux kernel. # -obj-y := clock.o irq.o gpio.o devices.o +obj-y := clock.o irq.o time.o gpio.o common.o devices.o obj-m := obj-n := obj- := -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 +# Board-specific support 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_ATEB9200) += board-eb9200.o -obj-$(CONFIG_MACH_KAFA) += board-kafa.o - -# AT91SAM9260 board-specific support - -# AT91SAM9261 board-specific support +#obj-$(CONFIG_MACH_CARMEVA) += board-carmeva.o +#obj-$(CONFIG_MACH_KB9200) += board-kb9202.o # 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_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 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 794d3fbb4..54022e58d 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,24 +54,29 @@ static void __init csb337_init_irq(void) * 0 .. 3 = USART0 .. USART3 * 4 = DBGU */ -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 */ -}; +#define CSB337_UART_MAP { 4, 1, -1, -1, -1 } /* ttyS0, ..., ttyS4 */ +#define CSB337_SERIAL_CONSOLE 0 /* ttyS0 */ 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_PB0, AT91_PIN_PB1); +#ifdef CONFIG_SERIAL_AT91 + at91_console_port = CSB337_SERIAL_CONSOLE; + memcpy(at91_serial_map, serial, sizeof(serial)); - /* Setup the serial ports and console */ - at91_init_serial(&csb337_uart_config); + /* Register UARTs */ + for (i = 0; i < AT91_NR_UART; i++) { + if (serial[i] >= 0) + at91_register_uart(i, serial[i]); + } +#endif } static struct at91_eth_data __initdata csb337_eth_data = { @@ -110,31 +115,17 @@ 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 c8b6f3342..8195f9d91 100644 --- a/arch/arm/mach-at91rm9200/board-csb637.c +++ b/arch/arm/mach-at91rm9200/board-csb637.c @@ -18,6 +18,7 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +#include #include #include #include @@ -33,9 +34,9 @@ #include #include -#include +#include +#include #include -#include #include "generic.h" @@ -53,24 +54,29 @@ static void __init csb637_init_irq(void) * 0 .. 3 = USART0 .. USART3 * 4 = DBGU */ -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 */ -}; +#define CSB637_UART_MAP { 4, 1, -1, -1, -1 } /* ttyS0, ..., ttyS4 */ +#define CSB637_SERIAL_CONSOLE 0 /* ttyS0 */ 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 */ at91_clock_init(3686400); - /* 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)); - /* Setup the serial ports and console */ - at91_init_serial(&csb637_uart_config); + /* Register UARTs */ + for (i = 0; i < AT91_NR_UART; i++) { + if (serial[i] >= 0) + at91_register_uart(i, serial[i]); + } +#endif } static struct at91_eth_data __initdata csb637_eth_data = { @@ -89,18 +95,12 @@ 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 65873037e..8a7833683 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,24 +57,29 @@ static void __init dk_init_irq(void) * 0 .. 3 = USART0 .. USART3 * 4 = DBGU */ -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 */ -}; +#define DK_UART_MAP { 4, 1, -1, -1, -1 } /* ttyS0, ..., ttyS4 */ +#define DK_SERIAL_CONSOLE 0 /* ttyS0 */ 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 */ at91_clock_init(18432000); - /* 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)); - /* Setup the serial ports and console */ - at91_init_serial(&dk_uart_config); + /* 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 } static struct at91_eth_data __initdata dk_eth_data = { @@ -103,56 +108,19 @@ 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); -#else /* MMC */ - at91_set_gpio_output(AT91_PIN_PB7, 1); /* this MMC card slot can optionally use SPI signaling (CS3). */ + at91_set_gpio_output(AT91_PIN_PB7, 1); /* this MMC card slot can optionally use SPI signaling (CS3). default: MMC */ at91_add_device_mmc(&dk_mmc_data); -#endif /* VGA */ // dk_add_device_video(); } diff --git a/arch/arm/mach-at91rm9200/board-ek.c b/arch/arm/mach-at91rm9200/board-ek.c index 868192351..fd0752eba 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,24 +57,29 @@ static void __init ek_init_irq(void) * 0 .. 3 = USART0 .. USART3 * 4 = DBGU */ -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 */ -}; +#define EK_UART_MAP { 4, 1, -1, -1, -1 } /* ttyS0, ..., ttyS4 */ +#define EK_SERIAL_CONSOLE 0 /* ttyS0 */ 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 */ at91_clock_init(18432000); - /* 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)); - /* Setup the serial ports and console */ - at91_init_serial(&ek_uart_config); + /* Register UARTs */ + for (i = 0; i < AT91_NR_UART; i++) { + if (serial[i] >= 0) + at91_register_uart(i, serial[i]); + } +#endif } static struct at91_eth_data __initdata ek_eth_data = { @@ -98,44 +103,17 @@ 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); -#else /* MMC */ - at91_set_gpio_output(AT91_PIN_PB22, 1); /* this MMC card slot can optionally use SPI signaling (CS3). */ + at91_set_gpio_output(AT91_PIN_PB22, 1); /* this MMC card slot can optionally use SPI signaling (CS3). default: MMC */ at91_add_device_mmc(&ek_mmc_data); -#endif /* VGA */ // ek_add_device_video(); } diff --git a/arch/arm/mach-at91rm9200/clock.c b/arch/arm/mach-at91rm9200/clock.c index edc2cc837..ec8195a2a 100644 --- a/arch/arm/mach-at91rm9200/clock.c +++ b/arch/arm/mach-at91rm9200/clock.c @@ -27,10 +27,12 @@ #include #include -#include +#include +#include /* for master clock global */ #include "generic.h" +#undef DEBUG /* * There's a lot more which can be done with clocks, including cpufreq @@ -39,9 +41,7 @@ */ struct clk { - const char *name; /* unique clock name */ - const char *function; /* function of the clock */ - struct device *dev; /* device associated with function */ + const char *name; unsigned long rate_hz; struct clk *parent; u32 pmc_mask; @@ -71,14 +71,15 @@ static struct clk clk32k = { }; static struct clk main_clk = { .name = "main", - .pmc_mask = AT91_PMC_MOSCS, /* in PMC_SR */ + .pmc_mask = 1 << 0, /* in PMC_SR */ + .users = 1, .id = 1, .primary = 1, }; static struct clk plla = { .name = "plla", .parent = &main_clk, - .pmc_mask = AT91_PMC_LOCKA, /* in PMC_SR */ + .pmc_mask = 1 << 1, /* in PMC_SR */ .id = 2, .primary = 1, .pll = 1, @@ -104,7 +105,7 @@ static void pllb_mode(struct clk *clk, int is_on) static struct clk pllb = { .name = "pllb", .parent = &main_clk, - .pmc_mask = AT91_PMC_LOCKB, /* in PMC_SR */ + .pmc_mask = 1 << 2, /* in PMC_SR */ .mode = pllb_mode, .id = 3, .primary = 1, @@ -176,7 +177,8 @@ static struct clk pck3 = { */ static struct clk mck = { .name = "mck", - .pmc_mask = AT91_PMC_MCKRDY, /* in PMC_SR */ + .pmc_mask = 1 << 3, /* in PMC_SR */ + .users = 1, /* (must be) always on */ }; static void pmc_periph_mode(struct clk *clk, int is_on) @@ -199,78 +201,6 @@ static struct clk ohci_clk = { .pmc_mask = 1 << AT91_ID_UHP, .mode = pmc_periph_mode, }; -static struct clk ether_clk = { - .name = "ether_clk", - .parent = &mck, - .pmc_mask = 1 << AT91_ID_EMAC, - .mode = pmc_periph_mode, -}; -static struct clk mmc_clk = { - .name = "mci_clk", - .parent = &mck, - .pmc_mask = 1 << AT91_ID_MCI, - .mode = pmc_periph_mode, -}; -static struct clk twi_clk = { - .name = "twi_clk", - .parent = &mck, - .pmc_mask = 1 << AT91_ID_TWI, - .mode = pmc_periph_mode, -}; -static struct clk usart0_clk = { - .name = "usart0_clk", - .parent = &mck, - .pmc_mask = 1 << AT91_ID_US0, - .mode = pmc_periph_mode, -}; -static struct clk usart1_clk = { - .name = "usart1_clk", - .parent = &mck, - .pmc_mask = 1 << AT91_ID_US1, - .mode = pmc_periph_mode, -}; -static struct clk usart2_clk = { - .name = "usart2_clk", - .parent = &mck, - .pmc_mask = 1 << AT91_ID_US2, - .mode = pmc_periph_mode, -}; -static struct clk usart3_clk = { - .name = "usart3_clk", - .parent = &mck, - .pmc_mask = 1 << AT91_ID_US3, - .mode = pmc_periph_mode, -}; -static struct clk spi_clk = { - .name = "spi0_clk", - .parent = &mck, - .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! */ @@ -293,54 +223,26 @@ static struct clk *const clock_list[] = { /* MCK and peripherals */ &mck, - &usart0_clk, - &usart1_clk, - &usart2_clk, - &usart3_clk, - &mmc_clk, + // usart0..usart3 + // mmc &udc_clk, - &twi_clk, - &spi_clk, - &pioA_clk, - &pioB_clk, - &pioC_clk, - &pioD_clk, + // i2c + // spi // ssc0..ssc2 // tc0..tc5 - // irq0..irq6 &ohci_clk, - ðer_clk, + // ether }; -/* - * 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++) { - 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; + if (strcmp(id, clock_list[i]->name) == 0) + return clock_list[i]; } return ERR_PTR(-ENOENT); @@ -458,7 +360,7 @@ int clk_set_rate(struct clk *clk, unsigned long rate) u32 pckr; pckr = at91_sys_read(AT91_PMC_PCKR(clk->id)); - pckr &= AT91_PMC_CSS_PLLB; /* clock selection */ + pckr &= 0x03; pckr |= prescale << 2; at91_sys_write(AT91_PMC_PCKR(clk->id), pckr); clk->rate_hz = actual; @@ -538,7 +440,7 @@ static int at91_clk_show(struct seq_file *s, void *unused) else state = ""; - seq_printf(s, "%-10s users=%2d %-3s %9ld Hz %s\n", + seq_printf(s, "%-10s users=%d %-3s %9ld Hz %s\n", clk->name, clk->users, state, clk_get_rate(clk), clk->parent ? clk->parent->name : ""); } @@ -581,18 +483,11 @@ static u32 __init at91_pll_rate(struct clk *pll, u32 freq, u32 reg) freq *= mul + 1; } else freq = 0; - + if (pll == &pllb && (reg & (1 << 28))) + freq /= 2; return freq; } -static u32 __init at91_usb_rate(struct clk *pll, u32 freq, u32 reg) -{ - if (pll == &pllb && (reg & AT91_PMC_USB96M)) - return freq / 2; - else - return freq; -} - static unsigned __init at91_pll_calc(unsigned main_freq, unsigned out_freq) { unsigned i, div = 0, mul = 0, diff = 1 << 30; @@ -640,30 +535,6 @@ 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; @@ -679,8 +550,8 @@ int __init at91_clock_init(unsigned long main_clock) if (!main_clock) { do { tmp = at91_sys_read(AT91_CKGR_MCFR); - } while (!(tmp & AT91_PMC_MAINRDY)); - main_clock = (tmp & AT91_PMC_MAINF) * (AT91_SLOW_CLOCK / 16); + } while (!(tmp & 0x10000)); + main_clock = (tmp & 0xffff) * (AT91_SLOW_CLOCK / 16); } main_clk.rate_hz = main_clock; @@ -695,33 +566,32 @@ int __init at91_clock_init(unsigned long main_clock) * * REVISIT: assumes MCK doesn't derive from PLLB! */ - at91_pllb_usb_init = at91_pll_calc(main_clock, 48000000 * 2) | AT91_PMC_USB96M; + at91_pllb_usb_init = at91_pll_calc(main_clock, 48000000 * 2) | 0x10000000; 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); - udpck.rate_hz = at91_usb_rate(&pllb, pllb.rate_hz, at91_pllb_usb_init); - uhpck.rate_hz = at91_usb_rate(&pllb, pllb.rate_hz, at91_pllb_usb_init); - /* * MCK and CPU derive from one of those primary clocks. * For now, assume this parentage won't change. */ 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++) { @@ -732,28 +602,19 @@ int __init at91_clock_init(unsigned long main_clock) continue; pckr = at91_sys_read(AT91_PMC_PCKR(clk->id)); - parent = clock_list[pckr & AT91_PMC_CSS]; + parent = clock_list[pckr & 3]; 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 all programmable clocks */ + /* disable unused clocks */ at91_sys_write(AT91_PMC_SCDR, AT91_PMC_PCK0 | AT91_PMC_PCK1 | AT91_PMC_PCK2 | AT91_PMC_PCK3); -#endif - - /* enable the PIO clocks */ - clk_enable(&pioA_clk); - clk_enable(&pioB_clk); - clk_enable(&pioC_clk); - clk_enable(&pioD_clk); +#endif /* CONFIG_AT91_PROGRAMMABLE_CLOCKS */ - /* disable all other unused peripheral clocks */ - at91_periphclk_reset(); + /* 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. + */ return 0; } diff --git a/arch/arm/mach-at91rm9200/devices.c b/arch/arm/mach-at91rm9200/devices.c index 4352acb88..57eedd5be 100644 --- a/arch/arm/mach-at91rm9200/devices.c +++ b/arch/arm/mach-at91rm9200/devices.c @@ -13,17 +13,12 @@ #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 @@ -33,10 +28,10 @@ static u64 ohci_dmamask = 0xffffffffUL; static struct at91_usbh_data usbh_data; -static struct resource at91_usbh_resources[] = { +static struct resource at91rm9200_usbh_resource[] = { [0] = { .start = AT91_UHP_BASE, - .end = AT91_UHP_BASE + SZ_1M - 1, + .end = AT91_UHP_BASE + SZ_1M -1, .flags = IORESOURCE_MEM, }, [1] = { @@ -47,15 +42,15 @@ static struct resource at91_usbh_resources[] = { }; static struct platform_device at91rm9200_usbh_device = { - .name = "at91_ohci", + .name = "at91rm9200-ohci", .id = -1, .dev = { .dma_mask = &ohci_dmamask, .coherent_dma_mask = 0xffffffff, .platform_data = &usbh_data, }, - .resource = at91_usbh_resources, - .num_resources = ARRAY_SIZE(at91_usbh_resources), + .resource = at91rm9200_usbh_resource, + .num_resources = ARRAY_SIZE(at91rm9200_usbh_resource), }; void __init at91_add_device_usbh(struct at91_usbh_data *data) @@ -79,16 +74,11 @@ 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 = { @@ -110,8 +100,10 @@ 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); @@ -129,19 +121,6 @@ void __init at91_add_device_udc(struct at91_udc_data *data) {} static u64 eth_dmamask = 0xffffffffUL; static struct at91_eth_data eth_data; -static struct resource at91_eth_resources[] = { - [0] = { - .start = AT91_BASE_EMAC, - .end = AT91_BASE_EMAC + SZ_16K - 1, - .flags = IORESOURCE_MEM, - }, - [1] = { - .start = AT91_ID_EMAC, - .end = AT91_ID_EMAC, - .flags = IORESOURCE_IRQ, - }, -}; - static struct platform_device at91rm9200_eth_device = { .name = "at91_ether", .id = -1, @@ -150,8 +129,7 @@ static struct platform_device at91rm9200_eth_device = { .coherent_dma_mask = 0xffffffff, .platform_data = ð_data, }, - .resource = at91_eth_resources, - .num_resources = ARRAY_SIZE(at91_eth_resources), + .num_resources = 0, }; void __init at91_add_device_eth(struct at91_eth_data *data) @@ -202,23 +180,13 @@ void __init at91_add_device_eth(struct at91_eth_data *data) {} #if defined(CONFIG_AT91_CF) || defined(CONFIG_AT91_CF_MODULE) static struct at91_cf_data cf_data; -static struct resource at91_cf_resources[] = { - [0] = { - .start = AT91_CF_BASE, - /* ties up CS4, CS5 and CS6 */ - .end = AT91_CF_BASE + (0x30000000 - 1), - .flags = IORESOURCE_MEM | IORESOURCE_MEM_8AND16BIT, - }, -}; - static struct platform_device at91rm9200_cf_device = { .name = "at91_cf", .id = -1, .dev = { .platform_data = &cf_data, }, - .resource = at91_cf_resources, - .num_resources = ARRAY_SIZE(at91_cf_resources), + .num_resources = 0, }; void __init at91_add_device_cf(struct at91_cf_data *data) @@ -239,12 +207,6 @@ 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); } @@ -262,20 +224,15 @@ static u64 mmc_dmamask = 0xffffffffUL; static struct at91_mmc_data mmc_data; static struct resource at91_mmc_resources[] = { - [0] = { + { .start = AT91_BASE_MCI, .end = AT91_BASE_MCI + SZ_16K - 1, .flags = IORESOURCE_MEM, - }, - [1] = { - .start = AT91_ID_MCI, - .end = AT91_ID_MCI, - .flags = IORESOURCE_IRQ, - }, + } }; static struct platform_device at91rm9200_mmc_device = { - .name = "at91_mci", + .name = "at91rm9200_mci", .id = -1, .dev = { .dma_mask = &mmc_dmamask, @@ -333,480 +290,4 @@ 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 - * -------------------------------------------------------------------- */ - -#if defined(CONFIG_MTD_NAND_AT91) || defined(CONFIG_MTD_NAND_AT91_MODULE) -static struct at91_nand_data nand_data; - -static struct resource at91_nand_resources[] = { - { - .start = AT91_SMARTMEDIA_BASE, - .end = AT91_SMARTMEDIA_BASE + SZ_8M - 1, - .flags = IORESOURCE_MEM, - } -}; - -static struct platform_device at91_nand_device = { - .name = "at91_nand", - .id = -1, - .dev = { - .platform_data = &nand_data, - }, - .resource = at91_nand_resources, - .num_resources = ARRAY_SIZE(at91_nand_resources), -}; - -void __init at91_add_device_nand(struct at91_nand_data *data) -{ - if (!data) - return; - - /* enable pin */ - if (data->enable_pin) - at91_set_gpio_output(data->enable_pin, 1); - - /* ready/busy pin */ - if (data->rdy_pin) - at91_set_gpio_input(data->rdy_pin, 1); - - /* card detect pin */ - if (data->det_pin) - at91_set_gpio_input(data->det_pin, 1); - - at91_set_A_periph(AT91_PIN_PC1, 0); /* SMOE */ - at91_set_A_periph(AT91_PIN_PC3, 0); /* SMWE */ - - nand_data = *data; - platform_device_register(&at91_nand_device); -} -#else -void __init at91_add_device_nand(struct at91_nand_data *data) {} -#endif - - -/* -------------------------------------------------------------------- - * TWI (i2c) - * -------------------------------------------------------------------- */ - -#if defined(CONFIG_I2C_AT91) || defined(CONFIG_I2C_AT91_MODULE) -static struct platform_device at91rm9200_twi_device = { - .name = "at91_i2c", - .id = -1, - .num_resources = 0, -}; - -void __init at91_add_device_i2c(void) -{ - /* pins used for TWI interface */ - at91_set_A_periph(AT91_PIN_PA25, 0); /* TWD */ - at91_set_multi_drive(AT91_PIN_PA25, 1); - - at91_set_A_periph(AT91_PIN_PA26, 0); /* TWCK */ - at91_set_multi_drive(AT91_PIN_PA26, 1); - - platform_device_register(&at91rm9200_twi_device); -} -#else -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_RTC_DRV_AT91) || defined(CONFIG_RTC_DRV_AT91_MODULE) -static struct platform_device at91rm9200_rtc_device = { - .name = "at91_rtc", - .id = -1, - .num_resources = 0, -}; - -static void __init at91_add_device_rtc(void) -{ - platform_device_register(&at91rm9200_rtc_device); -} -#else -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 - - -/* -------------------------------------------------------------------- - * LEDs - * -------------------------------------------------------------------- */ - -#if defined(CONFIG_LEDS) -u8 at91_leds_cpu; -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; -} -#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 7979d8ab7..9bd541eba 100644 --- a/arch/arm/mach-at91rm9200/generic.h +++ b/arch/arm/mach-at91rm9200/generic.h @@ -8,24 +8,11 @@ * published by the Free Software Foundation. */ - /* 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); +void 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 cec199fd6..0e396feec 100644 --- a/arch/arm/mach-at91rm9200/gpio.c +++ b/arch/arm/mach-at91rm9200/gpio.c @@ -10,14 +10,13 @@ */ #include -#include -#include #include #include #include #include -#include +#include +#include #include static const u32 pio_controller_offset[4] = { @@ -214,84 +213,6 @@ 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 @@ -327,12 +248,10 @@ static int gpio_irq_type(unsigned pin, unsigned type) return (type == IRQT_BOTHEDGE) ? 0 : -EINVAL; } -static struct irq_chip gpio_irqchip = { - .name = "GPIO", +static struct irqchip gpio_irqchip = { .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) @@ -342,22 +261,21 @@ static void gpio_irq_handler(unsigned irq, struct irqdesc *desc, struct pt_regs void __iomem *pio; u32 isr; - pio = get_irq_chip_data(irq); + pio = (void __force __iomem *) desc->chipdata; /* 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) get_irq_data(irq); + pin = (unsigned) desc->data; gpio = &irq_desc[pin]; while (isr) { if (isr & 1) { - if (unlikely(gpio->depth)) { + if (unlikely(gpio->disable_depth)) { /* * The core ARM interrupt handler lazily disables IRQs so * another IRQ must be generated before it actually gets @@ -366,7 +284,7 @@ static void gpio_irq_handler(unsigned irq, struct irqdesc *desc, struct pt_regs gpio_irq_mask(pin); } else - desc_handle_irq(pin, gpio, regs); + gpio->handle(pin, gpio, regs); } pin++; gpio++; @@ -394,19 +312,18 @@ void __init at91_gpio_irq_setup(unsigned banks) __raw_writel(~0, controller + PIO_IDR); set_irq_data(id, (void *) pin); - set_irq_chipdata(id, controller); + set_irq_chipdata(id, (void __force *) 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 c3a5e777f..cb62bc83a 100644 --- a/arch/arm/mach-at91rm9200/irq.c +++ b/arch/arm/mach-at91rm9200/irq.c @@ -20,6 +20,7 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +#include #include #include #include @@ -36,23 +37,65 @@ #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 at91_aic_mask_irq(unsigned int irq) + +static void at91rm9200_mask_irq(unsigned int irq) { /* Disable interrupt on AIC */ at91_sys_write(AT91_AIC_IDCR, 1 << irq); } -static void at91_aic_unmask_irq(unsigned int irq) +static void at91rm9200_unmask_irq(unsigned int irq) { /* Enable interrupt on AIC */ at91_sys_write(AT91_AIC_IECR, 1 << irq); } -static int at91_aic_set_type(unsigned irq, unsigned type) +static int at91rm9200_irq_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; @@ -61,13 +104,9 @@ static int at91_aic_set_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: @@ -79,57 +118,24 @@ static int at91_aic_set_type(unsigned irq, unsigned type) return 0; } -#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, +static struct irqchip at91rm9200_irq_chip = { + .ack = at91rm9200_mask_irq, + .mask = at91rm9200_mask_irq, + .unmask = at91rm9200_unmask_irq, + .set_type = at91rm9200_irq_type, }; /* * Initialize the AIC interrupt controller. */ -void __init at91_aic_init(unsigned int priority[NR_AIC_IRQS]) +void __init at91rm9200_init_irq(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. @@ -137,10 +143,10 @@ void __init at91_aic_init(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); - /* Active Low interrupt, with the specified priority */ + /* Store the Source Mode Register as defined in table above */ at91_sys_write(AT91_AIC_SMR(i), AT91_AIC_SRCTYPE_LOW | priority[i]); - set_irq_chip(i, &at91_aic_chip); + set_irq_chip(i, &at91rm9200_irq_chip); set_irq_handler(i, do_level_IRQ); set_irq_flags(i, IRQF_VALID | IRQF_PROBE); diff --git a/arch/arm/mach-at91rm9200/time.c b/arch/arm/mach-at91rm9200/time.c index 7ffcf443b..1b6dd2dee 100644 --- a/arch/arm/mach-at91rm9200/time.c +++ b/arch/arm/mach-at91rm9200/time.c @@ -71,11 +71,11 @@ static irqreturn_t at91rm9200_timer_interrupt(int irq, void *dev_id, struct pt_r 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) { + do { timer_tick(regs); rtar = (at91_sys_read(AT91_ST_RTAR) + LATCH) & AT91_ST_ALMV; at91_sys_write(AT91_ST_RTAR, rtar); - } + } while (((read_CRTR() - at91_sys_read(AT91_ST_RTAR)) & AT91_ST_ALMV) >= LATCH); write_sequnlock(&xtime_lock); diff --git a/arch/arm/mach-clps711x/fortunet.c b/arch/arm/mach-clps711x/fortunet.c index 3792ab4f0..ff26a85aa 100644 --- a/arch/arm/mach-clps711x/fortunet.c +++ b/arch/arm/mach-clps711x/fortunet.c @@ -19,6 +19,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +#include #include #include #include diff --git a/arch/arm/mach-clps711x/p720t.c b/arch/arm/mach-clps711x/p720t.c index c8ecd2480..9ba45f4d5 100644 --- a/arch/arm/mach-clps711x/p720t.c +++ b/arch/arm/mach-clps711x/p720t.c @@ -17,6 +17,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +#include #include #include #include diff --git a/arch/arm/mach-clps711x/time.c b/arch/arm/mach-clps711x/time.c index a071eac4a..1a23f0dcd 100644 --- a/arch/arm/mach-clps711x/time.c +++ b/arch/arm/mach-clps711x/time.c @@ -19,7 +19,6 @@ #include #include #include -#include #include #include @@ -58,7 +57,7 @@ p720t_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs) static struct irqaction clps711x_timer_irq = { .name = "CLPS711x Timer Tick", - .flags = IRQF_DISABLED | IRQF_TIMER, + .flags = SA_INTERRUPT | SA_TIMER, .handler = p720t_timer_interrupt, }; diff --git a/arch/arm/mach-clps7500/core.c b/arch/arm/mach-clps7500/core.c index 92eaebdd5..5b12cab0e 100644 --- a/arch/arm/mach-clps7500/core.c +++ b/arch/arm/mach-clps7500/core.c @@ -9,7 +9,6 @@ #include #include #include -#include #include #include #include @@ -316,7 +315,7 @@ clps7500_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs) static struct irqaction clps7500_timer_irq = { .name = "CLPS7500 Timer Tick", - .flags = IRQF_DISABLED | IRQF_TIMER, + .flags = SA_INTERRUPT | SA_TIMER, .handler = clps7500_timer_interrupt, }; diff --git a/arch/arm/mach-ebsa110/core.c b/arch/arm/mach-ebsa110/core.c index 70dd12ef3..6d620d826 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 = IRQF_DISABLED | IRQF_TIMER, + .flags = SA_INTERRUPT | SA_TIMER, .handler = ebsa110_timer_interrupt, }; diff --git a/arch/arm/mach-footbridge/cats-hw.c b/arch/arm/mach-footbridge/cats-hw.c index ef6ccc899..5b64d5c5b 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 af900f475..bbe6e4a0b 100644 --- a/arch/arm/mach-footbridge/common.c +++ b/arch/arm/mach-footbridge/common.c @@ -7,6 +7,7 @@ * 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 2af610811..14a62d600 100644 --- a/arch/arm/mach-footbridge/dc21285-timer.c +++ b/arch/arm/mach-footbridge/dc21285-timer.c @@ -6,7 +6,6 @@ */ #include #include -#include #include @@ -44,7 +43,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 = IRQF_DISABLED | IRQF_TIMER, + .flags = SA_INTERRUPT | SA_TIMER, }; /* diff --git a/arch/arm/mach-footbridge/dc21285.c b/arch/arm/mach-footbridge/dc21285.c index 823e25d45..e79884eea 100644 --- a/arch/arm/mach-footbridge/dc21285.c +++ b/arch/arm/mach-footbridge/dc21285.c @@ -35,6 +35,7 @@ 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) @@ -254,12 +255,14 @@ int __init dc21285_setup(int nr, struct pci_sys_data *sys) if (nr || !footbridge_cfn_mode()) return 0; - res = kzalloc(sizeof(struct resource) * 2, GFP_KERNEL); + res = kmalloc(sizeof(struct resource) * 2, GFP_KERNEL); if (!res) { printk("out of memory for root bus resources"); return 0; } + memset(res, 0, sizeof(struct resource) * 2); + res[0].flags = IORESOURCE_MEM; res[0].name = "Footbridge non-prefetch"; res[1].flags = IORESOURCE_MEM | IORESOURCE_PREFETCH; @@ -331,15 +334,15 @@ void __init dc21285_preinit(void) /* * We don't care if these fail. */ - request_irq(IRQ_PCI_SERR, dc21285_serr_irq, IRQF_DISABLED, + request_irq(IRQ_PCI_SERR, dc21285_serr_irq, SA_INTERRUPT, "PCI system error", &serr_timer); - request_irq(IRQ_PCI_PERR, dc21285_parity_irq, IRQF_DISABLED, + request_irq(IRQ_PCI_PERR, dc21285_parity_irq, SA_INTERRUPT, "PCI parity error", &perr_timer); - request_irq(IRQ_PCI_ABORT, dc21285_abort_irq, IRQF_DISABLED, + request_irq(IRQ_PCI_ABORT, dc21285_abort_irq, SA_INTERRUPT, "PCI abort", NULL); - request_irq(IRQ_DISCARD_TIMER, dc21285_discard_irq, IRQF_DISABLED, + request_irq(IRQ_DISCARD_TIMER, dc21285_discard_irq, SA_INTERRUPT, "Discard timer", NULL); - request_irq(IRQ_PCI_DPERR, dc21285_dparity_irq, IRQF_DISABLED, + request_irq(IRQ_PCI_DPERR, dc21285_dparity_irq, SA_INTERRUPT, "PCI data parity", NULL); if (cfn_mode) { diff --git a/arch/arm/mach-footbridge/dma.c b/arch/arm/mach-footbridge/dma.c index 1f9b09b8e..7a54578b5 100644 --- a/arch/arm/mach-footbridge/dma.c +++ b/arch/arm/mach-footbridge/dma.c @@ -10,6 +10,7 @@ * 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 a64e22226..2c7c36304 100644 --- a/arch/arm/mach-footbridge/ebsa285-leds.c +++ b/arch/arm/mach-footbridge/ebsa285-leds.c @@ -16,6 +16,7 @@ * 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 87448c2d6..e1c43b331 100644 --- a/arch/arm/mach-footbridge/isa-irq.c +++ b/arch/arm/mach-footbridge/isa-irq.c @@ -98,22 +98,9 @@ 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 = { - .name = "pic1", - .start = 0x20, - .end = 0x3f, -}; - -static struct resource pic2_resource = { - .name = "pic2", - .start = 0xa0, - .end = 0xbf, -}; +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 }; 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 c4810a40c..c1d74f7ab 100644 --- a/arch/arm/mach-footbridge/isa-timer.c +++ b/arch/arm/mach-footbridge/isa-timer.c @@ -6,7 +6,6 @@ */ #include #include -#include #include #include @@ -73,7 +72,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 = IRQF_DISABLED | IRQF_TIMER, + .flags = SA_INTERRUPT | SA_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 a1f381c64..229bf0585 100644 --- a/arch/arm/mach-footbridge/netwinder-hw.c +++ b/arch/arm/mach-footbridge/netwinder-hw.c @@ -5,6 +5,7 @@ * * 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 8e9cac5a2..7451fc07b 100644 --- a/arch/arm/mach-footbridge/netwinder-leds.c +++ b/arch/arm/mach-footbridge/netwinder-leds.c @@ -16,6 +16,7 @@ * Changelog: * 02-05-1999 RMK Various cleanups */ +#include #include #include #include diff --git a/arch/arm/mach-footbridge/time.c b/arch/arm/mach-footbridge/time.c index 5d02e95de..2c64a0b05 100644 --- a/arch/arm/mach-footbridge/time.c +++ b/arch/arm/mach-footbridge/time.c @@ -34,12 +34,27 @@ static int rtc_base; static unsigned long __init get_isa_cmos_time(void) { unsigned int year, mon, day, hour, min, sec; + int i; // check to see if the RTC makes sense..... if ((CMOS_READ(RTC_VALID) & RTC_VRT) == 0) return mktime(1970, 1, 1, 0, 0, 0); - do { + /* The Linux interpretation of the CMOS clock register contents: + * When the Update-In-Progress (UIP) flag goes from 1 to 0, the + * RTC registers show the second which has precisely just started. + * Let's hope other operating systems interpret the RTC the same way. + */ + /* read RTC exactly on falling edge of update flag */ + for (i = 0 ; i < 1000000 ; i++) /* may take up to 1 second... */ + if (CMOS_READ(RTC_FREQ_SELECT) & RTC_UIP) + break; + + for (i = 0 ; i < 1000000 ; i++) /* must try at least 2.228 ms */ + if (!(CMOS_READ(RTC_FREQ_SELECT) & RTC_UIP)) + break; + + do { /* Isn't this overkill ? UIP above should guarantee consistency */ sec = CMOS_READ(RTC_SECONDS); min = CMOS_READ(RTC_MINUTES); hour = CMOS_READ(RTC_HOURS); diff --git a/arch/arm/mach-h720x/cpu-h7201.c b/arch/arm/mach-h720x/cpu-h7201.c index a9a8255a3..af9e4a5d5 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 = IRQF_DISABLED | IRQF_TIMER, + .flags = SA_INTERRUPT | SA_TIMER, .handler = h7201_timer_interrupt, }; diff --git a/arch/arm/mach-h720x/cpu-h7202.c b/arch/arm/mach-h720x/cpu-h7202.c index da678d163..a4a7c0125 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 = IRQF_DISABLED | IRQF_TIMER, + .flags = SA_INTERRUPT | SA_TIMER, .handler = h7202_timer_interrupt, }; diff --git a/arch/arm/mach-h720x/h7201-eval.c b/arch/arm/mach-h720x/h7201-eval.c index 407cd4c0a..193f968ed 100644 --- a/arch/arm/mach-h720x/h7201-eval.c +++ b/arch/arm/mach-h720x/h7201-eval.c @@ -13,6 +13,7 @@ * */ +#include #include #include #include diff --git a/arch/arm/mach-h720x/h7202-eval.c b/arch/arm/mach-h720x/h7202-eval.c index bf2acdce6..362668969 100644 --- a/arch/arm/mach-h720x/h7202-eval.c +++ b/arch/arm/mach-h720x/h7202-eval.c @@ -13,6 +13,7 @@ * */ +#include #include #include #include diff --git a/arch/arm/mach-imx/dma.c b/arch/arm/mach-imx/dma.c index 36578871e..71a59e196 100644 --- a/arch/arm/mach-imx/dma.c +++ b/arch/arm/mach-imx/dma.c @@ -7,21 +7,11 @@ * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * - * 2004-03-03 Sascha Hauer + * 03/03/2004 Sascha Hauer * initial version heavily inspired by * linux/arch/arm/mach-pxa/dma.c - * - * 2005-04-17 Pavel Pisa - * Changed to support scatter gather DMA - * by taking Russell's code from RiscPC - * - * 2006-05-31 Pavel Pisa - * Corrected error handling code. - * */ -#undef DEBUG - #include #include #include @@ -32,368 +22,69 @@ #include #include #include -#include - -struct imx_dma_channel imx_dma_channels[IMX_DMA_CHANNELS]; - -/* - * imx_dma_sg_next - prepare next chunk for scatter-gather DMA emulation - * @dma_ch: i.MX DMA channel number - * @lastcount: number of bytes transferred during last transfer - * - * Functions prepares DMA controller for next sg data chunk transfer. - * The @lastcount argument informs function about number of bytes transferred - * during last block. Zero value can be used for @lastcount to setup DMA - * for the first chunk. - */ -static inline int imx_dma_sg_next(imx_dmach_t dma_ch, unsigned int lastcount) -{ - struct imx_dma_channel *imxdma = &imx_dma_channels[dma_ch]; - unsigned int nextcount; - unsigned int nextaddr; - - if (!imxdma->name) { - printk(KERN_CRIT "%s: called for not allocated channel %d\n", - __FUNCTION__, dma_ch); - return 0; - } - - imxdma->resbytes -= lastcount; - - if (!imxdma->sg) { - pr_debug("imxdma%d: no sg data\n", dma_ch); - return 0; - } - - imxdma->sgbc += lastcount; - if ((imxdma->sgbc >= imxdma->sg->length) || !imxdma->resbytes) { - if ((imxdma->sgcount <= 1) || !imxdma->resbytes) { - pr_debug("imxdma%d: sg transfer limit reached\n", - dma_ch); - imxdma->sgcount=0; - imxdma->sg = NULL; - return 0; - } else { - imxdma->sgcount--; - imxdma->sg++; - imxdma->sgbc = 0; - } - } - nextcount = imxdma->sg->length - imxdma->sgbc; - nextaddr = imxdma->sg->dma_address + imxdma->sgbc; - - if(imxdma->resbytes < nextcount) - nextcount = imxdma->resbytes; - if ((imxdma->dma_mode & DMA_MODE_MASK) == DMA_MODE_READ) - DAR(dma_ch) = nextaddr; - else - SAR(dma_ch) = nextaddr; +static struct dma_channel { + char *name; + void (*irq_handler) (int, void *, struct pt_regs *); + void (*err_handler) (int, void *, struct pt_regs *); + void *data; +} dma_channels[11]; - CNTR(dma_ch) = nextcount; - pr_debug("imxdma%d: next sg chunk dst 0x%08x, src 0x%08x, size 0x%08x\n", - dma_ch, DAR(dma_ch), SAR(dma_ch), CNTR(dma_ch)); - - return nextcount; -} - -/* - * imx_dma_setup_sg_base - scatter-gather DMA emulation - * @dma_ch: i.MX DMA channel number - * @sg: pointer to the scatter-gather list/vector - * @sgcount: scatter-gather list hungs count - * - * Functions sets up i.MX DMA state for emulated scatter-gather transfer - * and sets up channel registers to be ready for the first chunk - */ -static int -imx_dma_setup_sg_base(imx_dmach_t dma_ch, - struct scatterlist *sg, unsigned int sgcount) -{ - struct imx_dma_channel *imxdma = &imx_dma_channels[dma_ch]; - - imxdma->sg = sg; - imxdma->sgcount = sgcount; - imxdma->sgbc = 0; - return imx_dma_sg_next(dma_ch, 0); -} - -/** - * imx_dma_setup_single - setup i.MX DMA channel for linear memory to/from device transfer - * @dma_ch: i.MX DMA channel number - * @dma_address: the DMA/physical memory address of the linear data block - * to transfer - * @dma_length: length of the data block in bytes - * @dev_addr: physical device port address - * @dmamode: DMA transfer mode, %DMA_MODE_READ from the device to the memory - * or %DMA_MODE_WRITE from memory to the device - * - * The function setups DMA channel source and destination addresses for transfer - * specified by provided parameters. The scatter-gather emulation is disabled, - * because linear data block - * form the physical address range is transfered. - * Return value: if incorrect parameters are provided -%EINVAL. - * Zero indicates success. - */ +/* set err_handler to NULL to have the standard info-only error handler */ int -imx_dma_setup_single(imx_dmach_t dma_ch, dma_addr_t dma_address, - unsigned int dma_length, unsigned int dev_addr, - dmamode_t dmamode) +imx_request_dma(char *name, imx_dma_prio prio, + void (*irq_handler) (int, void *, struct pt_regs *), + void (*err_handler) (int, void *, struct pt_regs *), void *data) { - struct imx_dma_channel *imxdma = &imx_dma_channels[dma_ch]; - - imxdma->sg = NULL; - imxdma->sgcount = 0; - imxdma->dma_mode = dmamode; - imxdma->resbytes = dma_length; - - if (!dma_address) { - printk(KERN_ERR "imxdma%d: imx_dma_setup_single null address\n", - dma_ch); - return -EINVAL; - } - - if (!dma_length) { - printk(KERN_ERR "imxdma%d: imx_dma_setup_single zero length\n", - dma_ch); - return -EINVAL; - } - - if ((dmamode & DMA_MODE_MASK) == DMA_MODE_READ) { - pr_debug("imxdma%d: mx_dma_setup_single2dev dma_addressg=0x%08x dma_length=%d dev_addr=0x%08x for read\n", - dma_ch, (unsigned int)dma_address, dma_length, - dev_addr); - SAR(dma_ch) = dev_addr; - DAR(dma_ch) = (unsigned int)dma_address; - } else if ((dmamode & DMA_MODE_MASK) == DMA_MODE_WRITE) { - pr_debug("imxdma%d: mx_dma_setup_single2dev dma_addressg=0x%08x dma_length=%d dev_addr=0x%08x for write\n", - dma_ch, (unsigned int)dma_address, dma_length, - dev_addr); - SAR(dma_ch) = (unsigned int)dma_address; - DAR(dma_ch) = dev_addr; - } else { - printk(KERN_ERR "imxdma%d: imx_dma_setup_single bad dmamode\n", - dma_ch); - return -EINVAL; - } - - CNTR(dma_ch) = dma_length; - - return 0; -} - -/** - * imx_dma_setup_sg - setup i.MX DMA channel SG list to/from device transfer - * @dma_ch: i.MX DMA channel number - * @sg: pointer to the scatter-gather list/vector - * @sgcount: scatter-gather list hungs count - * @dma_length: total length of the transfer request in bytes - * @dev_addr: physical device port address - * @dmamode: DMA transfer mode, %DMA_MODE_READ from the device to the memory - * or %DMA_MODE_WRITE from memory to the device - * - * The function setups DMA channel state and registers to be ready for transfer - * specified by provided parameters. The scatter-gather emulation is set up - * according to the parameters. - * - * The full preparation of the transfer requires setup of more register - * by the caller before imx_dma_enable() can be called. - * - * %BLR(dma_ch) holds transfer burst length in bytes, 0 means 64 bytes - * - * %RSSR(dma_ch) has to be set to the DMA request line source %DMA_REQ_xxx - * - * %CCR(dma_ch) has to specify transfer parameters, the next settings is typical - * for linear or simple scatter-gather transfers if %DMA_MODE_READ is specified - * - * %CCR_DMOD_LINEAR | %CCR_DSIZ_32 | %CCR_SMOD_FIFO | %CCR_SSIZ_x - * - * The typical setup for %DMA_MODE_WRITE is specified by next options combination - * - * %CCR_SMOD_LINEAR | %CCR_SSIZ_32 | %CCR_DMOD_FIFO | %CCR_DSIZ_x - * - * Be carefull there and do not mistakenly mix source and target device - * port sizes constants, they are really different: - * %CCR_SSIZ_8, %CCR_SSIZ_16, %CCR_SSIZ_32, - * %CCR_DSIZ_8, %CCR_DSIZ_16, %CCR_DSIZ_32 - * - * Return value: if incorrect parameters are provided -%EINVAL. - * Zero indicates success. - */ -int -imx_dma_setup_sg(imx_dmach_t dma_ch, - struct scatterlist *sg, unsigned int sgcount, unsigned int dma_length, - unsigned int dev_addr, dmamode_t dmamode) -{ - int res; - struct imx_dma_channel *imxdma = &imx_dma_channels[dma_ch]; - - imxdma->sg = NULL; - imxdma->sgcount = 0; - imxdma->dma_mode = dmamode; - imxdma->resbytes = dma_length; - - if (!sg || !sgcount) { - printk(KERN_ERR "imxdma%d: imx_dma_setup_sg epty sg list\n", - dma_ch); - return -EINVAL; - } - - if (!sg->length) { - printk(KERN_ERR "imxdma%d: imx_dma_setup_sg zero length\n", - dma_ch); - return -EINVAL; - } - - if ((dmamode & DMA_MODE_MASK) == DMA_MODE_READ) { - pr_debug("imxdma%d: mx_dma_setup_sg2dev sg=%p sgcount=%d total length=%d dev_addr=0x%08x for read\n", - dma_ch, sg, sgcount, dma_length, dev_addr); - SAR(dma_ch) = dev_addr; - } else if ((dmamode & DMA_MODE_MASK) == DMA_MODE_WRITE) { - pr_debug("imxdma%d: mx_dma_setup_sg2dev sg=%p sgcount=%d total length=%d dev_addr=0x%08x for write\n", - dma_ch, sg, sgcount, dma_length, dev_addr); - DAR(dma_ch) = dev_addr; - } else { - printk(KERN_ERR "imxdma%d: imx_dma_setup_sg bad dmamode\n", - dma_ch); - return -EINVAL; - } - - res = imx_dma_setup_sg_base(dma_ch, sg, sgcount); - if (res <= 0) { - printk(KERN_ERR "imxdma%d: no sg chunk ready\n", dma_ch); - return -EINVAL; - } - - return 0; -} - -/** - * imx_dma_setup_handlers - setup i.MX DMA channel end and error notification handlers - * @dma_ch: i.MX DMA channel number - * @irq_handler: the pointer to the function called if the transfer - * ends successfully - * @err_handler: the pointer to the function called if the premature - * end caused by error occurs - * @data: user specified value to be passed to the handlers - */ -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 *, int), - void *data) -{ - struct imx_dma_channel *imxdma = &imx_dma_channels[dma_ch]; unsigned long flags; + int i, found = 0; - if (!imxdma->name) { - printk(KERN_CRIT "%s: called for not allocated channel %d\n", - __FUNCTION__, dma_ch); - return -ENODEV; - } + /* basic sanity checks */ + if (!name || !irq_handler) + return -EINVAL; local_irq_save(flags); - DISR = (1 << dma_ch); - imxdma->irq_handler = irq_handler; - imxdma->err_handler = err_handler; - imxdma->data = data; - local_irq_restore(flags); - return 0; -} -/** - * imx_dma_enable - function to start i.MX DMA channel operation - * @dma_ch: i.MX DMA channel number - * - * The channel has to be allocated by driver through imx_dma_request() - * or imx_dma_request_by_prio() function. - * The transfer parameters has to be set to the channel registers through - * call of the imx_dma_setup_single() or imx_dma_setup_sg() function - * and registers %BLR(dma_ch), %RSSR(dma_ch) and %CCR(dma_ch) has to - * be set prior this function call by the channel user. - */ -void imx_dma_enable(imx_dmach_t dma_ch) -{ - struct imx_dma_channel *imxdma = &imx_dma_channels[dma_ch]; - unsigned long flags; - - pr_debug("imxdma%d: imx_dma_enable\n", dma_ch); - - if (!imxdma->name) { - printk(KERN_CRIT "%s: called for not allocated channel %d\n", - __FUNCTION__, dma_ch); - return; + /* try grabbing a DMA channel with the requested priority */ + for (i = prio; i < prio + (prio == DMA_PRIO_LOW) ? 8 : 4; i++) { + if (!dma_channels[i].name) { + found = 1; + break; + } } - local_irq_save(flags); - DISR = (1 << dma_ch); - DIMR &= ~(1 << dma_ch); - CCR(dma_ch) |= CCR_CEN; - local_irq_restore(flags); -} - -/** - * imx_dma_disable - stop, finish i.MX DMA channel operatin - * @dma_ch: i.MX DMA channel number - */ -void imx_dma_disable(imx_dmach_t dma_ch) -{ - unsigned long flags; - - pr_debug("imxdma%d: imx_dma_disable\n", dma_ch); - - local_irq_save(flags); - DIMR |= (1 << dma_ch); - CCR(dma_ch) &= ~CCR_CEN; - DISR = (1 << dma_ch); - local_irq_restore(flags); -} - -/** - * imx_dma_request - request/allocate specified channel number - * @dma_ch: i.MX DMA channel number - * @name: the driver/caller own non-%NULL identification - */ -int imx_dma_request(imx_dmach_t dma_ch, const char *name) -{ - struct imx_dma_channel *imxdma = &imx_dma_channels[dma_ch]; - unsigned long flags; - - /* basic sanity checks */ - if (!name) - return -EINVAL; - - if (dma_ch >= IMX_DMA_CHANNELS) { - printk(KERN_CRIT "%s: called for non-existed channel %d\n", - __FUNCTION__, dma_ch); - return -EINVAL; + if (!found) { + /* requested prio group is full, try hier priorities */ + for (i = prio - 1; i >= 0; i--) { + if (!dma_channels[i].name) { + found = 1; + break; + } + } } - local_irq_save(flags); - if (imxdma->name) { - local_irq_restore(flags); - return -ENODEV; + if (found) { + DIMR &= ~(1 << i); + dma_channels[i].name = name; + dma_channels[i].irq_handler = irq_handler; + dma_channels[i].err_handler = err_handler; + dma_channels[i].data = data; + } else { + printk(KERN_WARNING "No more available DMA channels for %s\n", + name); + i = -ENODEV; } - imxdma->name = name; - imxdma->irq_handler = NULL; - imxdma->err_handler = NULL; - imxdma->data = NULL; - imxdma->sg = NULL; local_irq_restore(flags); - return 0; + return i; } -/** - * imx_dma_free - release previously acquired channel - * @dma_ch: i.MX DMA channel number - */ -void imx_dma_free(imx_dmach_t dma_ch) +void +imx_free_dma(int dma_ch) { unsigned long flags; - struct imx_dma_channel *imxdma = &imx_dma_channels[dma_ch]; - if (!imxdma->name) { + if (!dma_channels[dma_ch].name) { printk(KERN_CRIT "%s: trying to free channel %d which is already freed\n", __FUNCTION__, dma_ch); @@ -401,143 +92,66 @@ void imx_dma_free(imx_dmach_t dma_ch) } local_irq_save(flags); - /* Disable interrupts */ - DIMR |= (1 << dma_ch); - CCR(dma_ch) &= ~CCR_CEN; - imxdma->name = NULL; + DIMR &= ~(1 << dma_ch); + dma_channels[dma_ch].name = NULL; local_irq_restore(flags); } -/** - * imx_dma_request_by_prio - find and request some of free channels best suiting requested priority - * @dma_ch: i.MX DMA channel number - * @name: the driver/caller own non-%NULL identification - * @prio: one of the hardware distinguished priority level: - * %DMA_PRIO_HIGH, %DMA_PRIO_MEDIUM, %DMA_PRIO_LOW - * - * This function tries to find free channel in the specified priority group - * if the priority cannot be achieved it tries to look for free channel - * in the higher and then even lower priority groups. - * - * Return value: If there is no free channel to allocate, -%ENODEV is returned. - * Zero value indicates successful channel allocation. - */ -int -imx_dma_request_by_prio(imx_dmach_t * pdma_ch, const char *name, - imx_dma_prio prio) -{ - int i; - int best; - - switch (prio) { - case (DMA_PRIO_HIGH): - best = 8; - break; - case (DMA_PRIO_MEDIUM): - best = 4; - break; - case (DMA_PRIO_LOW): - default: - best = 0; - break; - } - - for (i = best; i < IMX_DMA_CHANNELS; i++) { - if (!imx_dma_request(i, name)) { - *pdma_ch = i; - return 0; - } - } - - for (i = best - 1; i >= 0; i--) { - if (!imx_dma_request(i, name)) { - *pdma_ch = i; - return 0; - } - } - - printk(KERN_ERR "%s: no free DMA channel found\n", __FUNCTION__); - - return -ENODEV; -} - -static irqreturn_t dma_err_handler(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t +dma_err_handler(int irq, void *dev_id, struct pt_regs *regs) { int i, disr = DISR; - struct imx_dma_channel *channel; + struct dma_channel *channel; unsigned int err_mask = DBTOSR | DRTOSR | DSESR | DBOSR; - int errcode; - DISR = disr & err_mask; - for (i = 0; i < IMX_DMA_CHANNELS; i++) { - if(!(err_mask & (1 << i))) + DISR = disr; + for (i = 0; i < 11; i++) { + channel = &dma_channels[i]; + + if ( (err_mask & 1<name && channel->err_handler) { + channel->err_handler(i, channel->data, regs); continue; - channel = &imx_dma_channels[i]; - errcode = 0; + } if (DBTOSR & (1 << i)) { - DBTOSR = (1 << i); - errcode |= IMX_DMA_ERR_BURST; + printk(KERN_WARNING + "Burst timeout on channel %d (%s)\n", + i, channel->name); + DBTOSR |= (1 << i); } if (DRTOSR & (1 << i)) { - DRTOSR = (1 << i); - errcode |= IMX_DMA_ERR_REQUEST; + printk(KERN_WARNING + "Request timeout on channel %d (%s)\n", + i, channel->name); + DRTOSR |= (1 << i); } if (DSESR & (1 << i)) { - DSESR = (1 << i); - errcode |= IMX_DMA_ERR_TRANSFER; + printk(KERN_WARNING + "Transfer timeout on channel %d (%s)\n", + i, channel->name); + DSESR |= (1 << i); } if (DBOSR & (1 << i)) { - DBOSR = (1 << i); - errcode |= IMX_DMA_ERR_BUFFER; + printk(KERN_WARNING + "Buffer overflow timeout on channel %d (%s)\n", + i, channel->name); + DBOSR |= (1 << i); } - - /* - * 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; } -static irqreturn_t dma_irq_handler(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t +dma_irq_handler(int irq, void *dev_id, struct pt_regs *regs) { int i, disr = DISR; - pr_debug("imxdma: dma_irq_handler called, disr=0x%08x\n", - disr); - DISR = disr; - for (i = 0; i < IMX_DMA_CHANNELS; i++) { + for (i = 0; i < 11; i++) { if (disr & (1 << i)) { - struct imx_dma_channel *channel = &imx_dma_channels[i]; - if (channel->name) { - if (imx_dma_sg_next(i, CNTR(i))) { - CCR(i) &= ~CCR_CEN; - mb(); - CCR(i) |= CCR_CEN; - } else { - if (channel->irq_handler) - channel->irq_handler(i, - channel->data, regs); - } + struct dma_channel *channel = &dma_channels[i]; + if (channel->name && channel->irq_handler) { + channel->irq_handler(i, channel->data, regs); } else { /* * IRQ for an unregistered DMA channel: @@ -551,10 +165,10 @@ static irqreturn_t dma_irq_handler(int irq, void *dev_id, struct pt_regs *regs) return IRQ_HANDLED; } -static int __init imx_dma_init(void) +static int __init +imx_dma_init(void) { int ret; - int i; /* reset DMA module */ DCR = DCR_DRST; @@ -575,27 +189,15 @@ static int __init imx_dma_init(void) DCR = DCR_DEN; /* clear all interrupts */ - DISR = (1 << IMX_DMA_CHANNELS) - 1; + DISR = 0x3ff; /* enable interrupts */ - DIMR = (1 << IMX_DMA_CHANNELS) - 1; - - for (i = 0; i < IMX_DMA_CHANNELS; i++) { - imx_dma_channels[i].sg = NULL; - imx_dma_channels[i].dma_num = i; - } + DIMR = 0; return ret; } arch_initcall(imx_dma_init); -EXPORT_SYMBOL(imx_dma_setup_single); -EXPORT_SYMBOL(imx_dma_setup_sg); -EXPORT_SYMBOL(imx_dma_setup_handlers); -EXPORT_SYMBOL(imx_dma_enable); -EXPORT_SYMBOL(imx_dma_disable); -EXPORT_SYMBOL(imx_dma_request); -EXPORT_SYMBOL(imx_dma_free); -EXPORT_SYMBOL(imx_dma_request_by_prio); -EXPORT_SYMBOL(imx_dma_channels); +EXPORT_SYMBOL(imx_request_dma); +EXPORT_SYMBOL(imx_free_dma); diff --git a/arch/arm/mach-imx/generic.c b/arch/arm/mach-imx/generic.c index 12ea58a3b..37613ad68 100644 --- a/arch/arm/mach-imx/generic.c +++ b/arch/arm/mach-imx/generic.c @@ -33,7 +33,6 @@ #include #include -#include void imx_gpio_mode(int gpio_mode) { @@ -176,24 +175,62 @@ static struct resource imx_mmc_resources[] = { }, }; -static u64 imxmmmc_dmamask = 0xffffffffUL; - static struct platform_device imx_mmc_device = { .name = "imx-mmc", .id = 0, - .dev = { - .dma_mask = &imxmmmc_dmamask, - .coherent_dma_mask = 0xffffffff, - }, .num_resources = ARRAY_SIZE(imx_mmc_resources), .resource = imx_mmc_resources, }; -void __init imx_set_mmc_info(struct imxmmc_platform_data *info) -{ - imx_mmc_device.dev.platform_data = info; -} -EXPORT_SYMBOL(imx_set_mmc_info); +static struct resource imx_uart1_resources[] = { + [0] = { + .start = 0x00206000, + .end = 0x002060FF, + .flags = IORESOURCE_MEM, + }, + [1] = { + .start = (UART1_MINT_RX), + .end = (UART1_MINT_RX), + .flags = IORESOURCE_IRQ, + }, + [2] = { + .start = (UART1_MINT_TX), + .end = (UART1_MINT_TX), + .flags = IORESOURCE_IRQ, + }, +}; + +static struct platform_device imx_uart1_device = { + .name = "imx-uart", + .id = 0, + .num_resources = ARRAY_SIZE(imx_uart1_resources), + .resource = imx_uart1_resources, +}; + +static struct resource imx_uart2_resources[] = { + [0] = { + .start = 0x00207000, + .end = 0x002070FF, + .flags = IORESOURCE_MEM, + }, + [1] = { + .start = (UART2_MINT_RX), + .end = (UART2_MINT_RX), + .flags = IORESOURCE_IRQ, + }, + [2] = { + .start = (UART2_MINT_TX), + .end = (UART2_MINT_TX), + .flags = IORESOURCE_IRQ, + }, +}; + +static struct platform_device imx_uart2_device = { + .name = "imx-uart", + .id = 1, + .num_resources = ARRAY_SIZE(imx_uart2_resources), + .resource = imx_uart2_resources, +}; static struct imxfb_mach_info imx_fb_info; @@ -233,6 +270,8 @@ static struct platform_device imxfb_device = { static struct platform_device *devices[] __initdata = { &imx_mmc_device, &imxfb_device, + &imx_uart1_device, + &imx_uart2_device, }; static struct map_desc imx_io_desc[] __initdata = { diff --git a/arch/arm/mach-imx/irq.c b/arch/arm/mach-imx/irq.c index 2688bd82c..eeb8a6d4a 100644 --- a/arch/arm/mach-imx/irq.c +++ b/arch/arm/mach-imx/irq.c @@ -127,7 +127,7 @@ static void imx_gpio_ack_irq(unsigned int irq) { DEBUG_IRQ("%s: irq %d\n", __FUNCTION__, irq); - ISR(IRQ_TO_REG(irq)) = 1 << ((irq - IRQ_GPIOA(0)) % 32); + ISR(IRQ_TO_REG(irq)) |= 1 << ((irq - IRQ_GPIOA(0)) % 32); } static void @@ -204,15 +204,13 @@ imx_gpiod_demux_handler(unsigned int irq_unused, struct irqdesc *desc, imx_gpio_handler(mask, irq, desc, regs); } -static struct irq_chip imx_internal_chip = { - .name = "MPU", +static struct irqchip imx_internal_chip = { .ack = imx_mask_irq, .mask = imx_mask_irq, .unmask = imx_unmask_irq, }; -static struct irq_chip imx_gpio_chip = { - .name = "GPIO", +static struct irqchip imx_gpio_chip = { .ack = imx_gpio_ack_irq, .mask = imx_gpio_mask_irq, .unmask = imx_gpio_unmask_irq, diff --git a/arch/arm/mach-imx/mx1ads.c b/arch/arm/mach-imx/mx1ads.c index da893c80d..8ab1b0402 100644 --- a/arch/arm/mach-imx/mx1ads.c +++ b/arch/arm/mach-imx/mx1ads.c @@ -25,8 +25,6 @@ #include #include -#include -#include #include #include "generic.h" @@ -49,83 +47,9 @@ static struct platform_device cs89x0_device = { .resource = cs89x0_resources, }; -static struct imxuart_platform_data uart_pdata = { - .flags = IMXUART_HAVE_RTSCTS, -}; - -static struct resource imx_uart1_resources[] = { - [0] = { - .start = 0x00206000, - .end = 0x002060FF, - .flags = IORESOURCE_MEM, - }, - [1] = { - .start = (UART1_MINT_RX), - .end = (UART1_MINT_RX), - .flags = IORESOURCE_IRQ, - }, - [2] = { - .start = (UART1_MINT_TX), - .end = (UART1_MINT_TX), - .flags = IORESOURCE_IRQ, - }, -}; - -static struct platform_device imx_uart1_device = { - .name = "imx-uart", - .id = 0, - .num_resources = ARRAY_SIZE(imx_uart1_resources), - .resource = imx_uart1_resources, - .dev = { - .platform_data = &uart_pdata, - } -}; - -static struct resource imx_uart2_resources[] = { - [0] = { - .start = 0x00207000, - .end = 0x002070FF, - .flags = IORESOURCE_MEM, - }, - [1] = { - .start = (UART2_MINT_RX), - .end = (UART2_MINT_RX), - .flags = IORESOURCE_IRQ, - }, - [2] = { - .start = (UART2_MINT_TX), - .end = (UART2_MINT_TX), - .flags = IORESOURCE_IRQ, - }, -}; - -static struct platform_device imx_uart2_device = { - .name = "imx-uart", - .id = 1, - .num_resources = ARRAY_SIZE(imx_uart2_resources), - .resource = imx_uart2_resources, - .dev = { - .platform_data = &uart_pdata, - } -}; - static struct platform_device *devices[] __initdata = { &cs89x0_device, - &imx_uart1_device, - &imx_uart2_device, -}; - -#ifdef CONFIG_MMC_IMX -static int mx1ads_mmc_card_present(void) -{ - /* MMC/SD Card Detect is PB 20 on MX1ADS V1.0.7 */ - return (SSR(1) & (1 << 20) ? 0 : 1); -} - -static struct imxmmc_platform_data mx1ads_mmc_info = { - .card_present = mx1ads_mmc_card_present, }; -#endif static void __init mx1ads_init(void) @@ -133,22 +57,6 @@ mx1ads_init(void) #ifdef CONFIG_LEDS imx_gpio_mode(GPIO_PORTA | GPIO_OUT | 2); #endif -#ifdef CONFIG_MMC_IMX - /* SD/MMC card detect */ - imx_gpio_mode(GPIO_PORTB | GPIO_GIUS | GPIO_IN | 20); - imx_set_mmc_info(&mx1ads_mmc_info); -#endif - - imx_gpio_mode(PC9_PF_UART1_CTS); - imx_gpio_mode(PC10_PF_UART1_RTS); - imx_gpio_mode(PC11_PF_UART1_TXD); - imx_gpio_mode(PC12_PF_UART1_RXD); - - imx_gpio_mode(PB28_PF_UART2_CTS); - imx_gpio_mode(PB29_PF_UART2_RTS); - imx_gpio_mode(PB30_PF_UART2_TXD); - imx_gpio_mode(PB31_PF_UART2_RXD); - platform_add_devices(devices, ARRAY_SIZE(devices)); } @@ -161,7 +69,7 @@ mx1ads_map_io(void) MACHINE_START(MX1ADS, "Motorola MX1ADS") /* Maintainer: Sascha Hauer, Pengutronix */ .phys_io = 0x00200000, - .io_pg_offst = ((0xe0000000) >> 18) & 0xfffc, + .io_pg_offst = ((0xe0200000) >> 18) & 0xfffc, .boot_params = 0x08000100, .map_io = mx1ads_map_io, .init_irq = imx_init_irq, diff --git a/arch/arm/mach-imx/time.c b/arch/arm/mach-imx/time.c index 6ed7523c6..ea805bfa5 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 = IRQF_DISABLED | IRQF_TIMER, + .flags = SA_INTERRUPT | SA_TIMER, .handler = imx_timer_interrupt, }; diff --git a/arch/arm/mach-integrator/core.c b/arch/arm/mach-integrator/core.c index 42021fdfa..20071a276 100644 --- a/arch/arm/mach-integrator/core.c +++ b/arch/arm/mach-integrator/core.c @@ -13,12 +13,9 @@ #include #include #include -#include #include #include -#include #include -#include #include #include @@ -31,8 +28,6 @@ #include "common.h" -static struct amba_pl010_data integrator_uart_data; - static struct amba_device rtc_device = { .dev = { .bus_id = "mb:15", @@ -49,7 +44,6 @@ static struct amba_device rtc_device = { static struct amba_device uart0_device = { .dev = { .bus_id = "mb:16", - .platform_data = &integrator_uart_data, }, .res = { .start = INTEGRATOR_UART0_BASE, @@ -63,7 +57,6 @@ static struct amba_device uart0_device = { static struct amba_device uart1_device = { .dev = { .bus_id = "mb:17", - .platform_data = &integrator_uart_data, }, .res = { .start = INTEGRATOR_UART1_BASE, @@ -122,46 +115,6 @@ static int __init integrator_init(void) arch_initcall(integrator_init); -/* - * On the Integrator platform, the port RTS and DTR are provided by - * bits in the following SC_CTRLS register bits: - * RTS DTR - * UART0 7 6 - * UART1 5 4 - */ -#define SC_CTRLC (IO_ADDRESS(INTEGRATOR_SC_BASE) + INTEGRATOR_SC_CTRLC_OFFSET) -#define SC_CTRLS (IO_ADDRESS(INTEGRATOR_SC_BASE) + INTEGRATOR_SC_CTRLS_OFFSET) - -static void integrator_uart_set_mctrl(struct amba_device *dev, void __iomem *base, unsigned int mctrl) -{ - unsigned int ctrls = 0, ctrlc = 0, rts_mask, dtr_mask; - - if (dev == &uart0_device) { - rts_mask = 1 << 4; - dtr_mask = 1 << 5; - } else { - rts_mask = 1 << 6; - dtr_mask = 1 << 7; - } - - if (mctrl & TIOCM_RTS) - ctrlc |= rts_mask; - else - ctrls |= rts_mask; - - if (mctrl & TIOCM_DTR) - ctrlc |= dtr_mask; - else - ctrls |= dtr_mask; - - __raw_writel(ctrls, SC_CTRLS); - __raw_writel(ctrlc, SC_CTRLC); -} - -static struct amba_pl010_data integrator_uart_data = { - .set_mctrl = integrator_uart_set_mctrl, -}; - #define CM_CTRL IO_ADDRESS(INTEGRATOR_HDR_BASE) + INTEGRATOR_HDR_CTRL_OFFSET static DEFINE_SPINLOCK(cm_lock); @@ -282,7 +235,7 @@ integrator_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs) static struct irqaction integrator_timer_irq = { .name = "Integrator Timer Tick", - .flags = IRQF_DISABLED | IRQF_TIMER, + .flags = SA_INTERRUPT | SA_TIMER, .handler = integrator_timer_interrupt, }; diff --git a/arch/arm/mach-integrator/impd1.c b/arch/arm/mach-integrator/impd1.c index 92d79fb39..a85d471c5 100644 --- a/arch/arm/mach-integrator/impd1.c +++ b/arch/arm/mach-integrator/impd1.c @@ -355,11 +355,12 @@ static int impd1_probe(struct lm_device *dev) if (!request_mem_region(dev->resource.start, SZ_4K, "LM registers")) return -EBUSY; - impd1 = kzalloc(sizeof(struct impd1_module), GFP_KERNEL); + impd1 = kmalloc(sizeof(struct impd1_module), GFP_KERNEL); if (!impd1) { ret = -ENOMEM; goto release_lm; } + memset(impd1, 0, sizeof(struct impd1_module)); impd1->base = ioremap(dev->resource.start, SZ_4K); if (!impd1->base) { @@ -388,10 +389,12 @@ static int impd1_probe(struct lm_device *dev) pc_base = dev->resource.start + idev->offset; - d = kzalloc(sizeof(struct amba_device), GFP_KERNEL); + d = kmalloc(sizeof(struct amba_device), GFP_KERNEL); if (!d) continue; + memset(d, 0, sizeof(struct amba_device)); + snprintf(d->dev.bus_id, sizeof(d->dev.bus_id), "lm%x:%5.5lx", dev->id, idev->offset >> 12); diff --git a/arch/arm/mach-integrator/integrator_ap.c b/arch/arm/mach-integrator/integrator_ap.c index 191c57a3b..d8d3c2a5a 100644 --- a/arch/arm/mach-integrator/integrator_ap.c +++ b/arch/arm/mach-integrator/integrator_ap.c @@ -161,8 +161,7 @@ static void sc_unmask_irq(unsigned int irq) writel(1 << irq, VA_IC_BASE + IRQ_ENABLE_SET); } -static struct irq_chip sc_chip = { - .name = "SC", +static struct irqchip sc_chip = { .ack = sc_mask_irq, .mask = sc_mask_irq, .unmask = sc_unmask_irq, @@ -320,10 +319,12 @@ static void __init ap_init(void) if ((sc_dec & (16 << i)) == 0) continue; - lmdev = kzalloc(sizeof(struct lm_device), GFP_KERNEL); + lmdev = kmalloc(sizeof(struct lm_device), GFP_KERNEL); if (!lmdev) continue; + memset(lmdev, 0, sizeof(struct lm_device)); + lmdev->resource.start = 0xc0000000 + 0x10000000 * i; lmdev->resource.end = lmdev->resource.start + 0x0fffffff; lmdev->resource.flags = IORESOURCE_MEM; diff --git a/arch/arm/mach-integrator/integrator_cp.c b/arch/arm/mach-integrator/integrator_cp.c index 678b6ba2b..a0724f2b2 100644 --- a/arch/arm/mach-integrator/integrator_cp.c +++ b/arch/arm/mach-integrator/integrator_cp.c @@ -156,8 +156,7 @@ static void cic_unmask_irq(unsigned int irq) cic_writel(1 << irq, INTCP_VA_CIC_BASE + IRQ_ENABLE_SET); } -static struct irq_chip cic_chip = { - .name = "CIC", +static struct irqchip cic_chip = { .ack = cic_mask_irq, .mask = cic_mask_irq, .unmask = cic_unmask_irq, @@ -175,8 +174,7 @@ static void pic_unmask_irq(unsigned int irq) pic_writel(1 << irq, INTCP_VA_PIC_BASE + IRQ_ENABLE_SET); } -static struct irq_chip pic_chip = { - .name = "PIC", +static struct irqchip pic_chip = { .ack = pic_mask_irq, .mask = pic_mask_irq, .unmask = pic_unmask_irq, @@ -194,8 +192,7 @@ static void sic_unmask_irq(unsigned int irq) sic_writel(1 << irq, INTCP_VA_SIC_BASE + IRQ_ENABLE_SET); } -static struct irq_chip sic_chip = { - .name = "SIC", +static struct irqchip sic_chip = { .ack = sic_mask_irq, .mask = sic_mask_irq, .unmask = sic_unmask_irq, @@ -235,6 +232,8 @@ static void __init intcp_init_irq(void) for (i = IRQ_PIC_START; i <= IRQ_PIC_END; i++) { if (i == 11) i = 22; + if (i == IRQ_CP_CPPLDINT) + i++; if (i == 29) break; set_irq_chip(i, &pic_chip); @@ -260,7 +259,8 @@ static void __init intcp_init_irq(void) set_irq_flags(i, IRQF_VALID | IRQF_PROBE); } - set_irq_chained_handler(IRQ_CP_CPPLDINT, sic_handle_irq); + set_irq_handler(IRQ_CP_CPPLDINT, sic_handle_irq); + pic_unmask_irq(IRQ_CP_CPPLDINT); } /* diff --git a/arch/arm/mach-integrator/pci_v3.c b/arch/arm/mach-integrator/pci_v3.c index 4418f6d75..229a63a52 100644 --- a/arch/arm/mach-integrator/pci_v3.c +++ b/arch/arm/mach-integrator/pci_v3.c @@ -20,6 +20,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +#include #include #include #include @@ -600,6 +601,4 @@ 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 ee49cf790..3c22c16b3 100644 --- a/arch/arm/mach-integrator/time.c +++ b/arch/arm/mach-integrator/time.c @@ -40,13 +40,13 @@ static int integrator_set_rtc(void) return 1; } -static int integrator_rtc_read_alarm(struct rtc_wkalrm *alrm) +static int rtc_read_alarm(struct rtc_wkalrm *alrm) { rtc_time_to_tm(readl(rtc_base + RTC_MR), &alrm->time); return 0; } -static inline int integrator_rtc_set_alarm(struct rtc_wkalrm *alrm) +static inline int rtc_set_alarm(struct rtc_wkalrm *alrm) { unsigned long time; int ret; @@ -62,7 +62,7 @@ static inline int integrator_rtc_set_alarm(struct rtc_wkalrm *alrm) return ret; } -static int integrator_rtc_read_time(struct rtc_time *tm) +static int rtc_read_time(struct rtc_time *tm) { rtc_time_to_tm(readl(rtc_base + RTC_DR), tm); return 0; @@ -76,7 +76,7 @@ static int integrator_rtc_read_time(struct rtc_time *tm) * edge of the 1Hz clock, we must write the time one second * in advance. */ -static inline int integrator_rtc_set_time(struct rtc_time *tm) +static inline int rtc_set_time(struct rtc_time *tm) { unsigned long time; int ret; @@ -90,10 +90,10 @@ static inline int integrator_rtc_set_time(struct rtc_time *tm) static struct rtc_ops rtc_ops = { .owner = THIS_MODULE, - .read_time = integrator_rtc_read_time, - .set_time = integrator_rtc_set_time, - .read_alarm = integrator_rtc_read_alarm, - .set_alarm = integrator_rtc_set_alarm, + .read_time = rtc_read_time, + .set_time = rtc_set_time, + .read_alarm = rtc_read_alarm, + .set_alarm = rtc_set_alarm, }; static irqreturn_t arm_rtc_interrupt(int irq, void *dev_id, @@ -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, IRQF_DISABLED, + ret = request_irq(dev->irq[0], arm_rtc_interrupt, SA_INTERRUPT, "rtc-pl030", dev); if (ret) goto map_out; diff --git a/arch/arm/mach-iop3xx/Kconfig b/arch/arm/mach-iop3xx/Kconfig index 4422f2388..2bfe8c729 100644 --- a/arch/arm/mach-iop3xx/Kconfig +++ b/arch/arm/mach-iop3xx/Kconfig @@ -30,15 +30,12 @@ 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 - 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). + bool "Enable support for EP80219" + select ARCH_IOP321 + select ARCH_IQ31244 # Which IOP variant are we running? config ARCH_IOP321 @@ -59,8 +56,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 d7f50e57e..fdeeef489 100644 --- a/arch/arm/mach-iop3xx/common.c +++ b/arch/arm/mach-iop3xx/common.c @@ -12,6 +12,7 @@ * 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 88ac33347..d42aae6ae 100644 --- a/arch/arm/mach-iop3xx/iop321-irq.c +++ b/arch/arm/mach-iop3xx/iop321-irq.c @@ -52,8 +52,7 @@ iop321_irq_unmask (unsigned int irq) intctl_write(iop321_mask); } -struct irq_chip ext_chip = { - .name = "IOP", +struct irqchip ext_chip = { .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 b6d096903..0ebbcb20c 100644 --- a/arch/arm/mach-iop3xx/iop321-setup.c +++ b/arch/arm/mach-iop3xx/iop321-setup.c @@ -12,6 +12,7 @@ */ #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 04b1a6f7e..d67ac0e5d 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 = IRQF_DISABLED | IRQF_TIMER, + .flags = SA_INTERRUPT | SA_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 cab11722c..f4d432173 100644 --- a/arch/arm/mach-iop3xx/iop331-irq.c +++ b/arch/arm/mach-iop3xx/iop331-irq.c @@ -77,15 +77,13 @@ iop331_irq_unmask2(unsigned int irq) intctl_write1(iop331_mask1); } -struct irq_chip iop331_irqchip1 = { - .name = "IOP-1", +struct irqchip iop331_irqchip1 = { .ack = iop331_irq_mask1, .mask = iop331_irq_mask1, .unmask = iop331_irq_unmask1, }; -struct irq_chip iop331_irqchip2 = { - .name = "IOP-2", +struct irqchip iop331_irqchip2 = { .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 3cc98d892..2d6abe5be 100644 --- a/arch/arm/mach-iop3xx/iop331-setup.c +++ b/arch/arm/mach-iop3xx/iop331-setup.c @@ -11,6 +11,7 @@ */ #include #include +#include #include #include #include @@ -102,7 +103,7 @@ static struct plat_serial8250_port iop33x_uart1_data[] = { static struct platform_device iop33x_uart0 = { .name = "serial8250", - .id = PLAT8250_DEV_PLATFORM, + .id = 0, .dev.platform_data = iop33x_uart0_data, .num_resources = 2, .resource = iop33x_uart0_resources, @@ -110,7 +111,7 @@ static struct platform_device iop33x_uart0 = { static struct platform_device iop33x_uart1 = { .name = "serial8250", - .id = PLAT8250_DEV_PLATFORM1, + .id = 1, .dev.platform_data = iop33x_uart1_data, .num_resources = 2, .resource = iop33x_uart1_resources, diff --git a/arch/arm/mach-iop3xx/iop331-time.c b/arch/arm/mach-iop3xx/iop331-time.c index 0c09e74c5..3c1f0ebbd 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 = IRQF_DISABLED | IRQF_TIMER, + .flags = SA_INTERRUPT | SA_TIMER, }; static void __init iop331_timer_init(void) diff --git a/arch/arm/mach-iop3xx/iq31244-pci.c b/arch/arm/mach-iop3xx/iq31244-pci.c index f3c6413fa..c6a973ba8 100644 --- a/arch/arm/mach-iop3xx/iq31244-pci.c +++ b/arch/arm/mach-iop3xx/iq31244-pci.c @@ -74,10 +74,12 @@ static int iq31244_setup(int nr, struct pci_sys_data *sys) if(nr != 0) return 0; - res = kzalloc(sizeof(struct resource) * 2, GFP_KERNEL); + res = kmalloc(sizeof(struct resource) * 2, GFP_KERNEL); if (!res) panic("PCI: unable to alloc resources"); + memset(res, 0, sizeof(struct resource) * 2); + res[0].start = IOP321_PCI_LOWER_IO_VA; res[0].end = IOP321_PCI_UPPER_IO_VA; res[0].name = "IQ31244 PCI I/O Space"; diff --git a/arch/arm/mach-iop3xx/iq80321-pci.c b/arch/arm/mach-iop3xx/iq80321-pci.c index d9758d3f6..802f6d091 100644 --- a/arch/arm/mach-iop3xx/iq80321-pci.c +++ b/arch/arm/mach-iop3xx/iq80321-pci.c @@ -68,10 +68,12 @@ static int iq80321_setup(int nr, struct pci_sys_data *sys) if(nr != 0) return 0; - res = kzalloc(sizeof(struct resource) * 2, GFP_KERNEL); + res = kmalloc(sizeof(struct resource) * 2, GFP_KERNEL); if (!res) panic("PCI: unable to alloc resources"); + memset(res, 0, sizeof(struct resource) * 2); + res[0].start = IOP321_PCI_LOWER_IO_VA; res[0].end = IOP321_PCI_UPPER_IO_VA; res[0].name = "IQ80321 PCI I/O Space"; diff --git a/arch/arm/mach-iop3xx/iq80331-pci.c b/arch/arm/mach-iop3xx/iq80331-pci.c index 40d861002..654e450a1 100644 --- a/arch/arm/mach-iop3xx/iq80331-pci.c +++ b/arch/arm/mach-iop3xx/iq80331-pci.c @@ -64,10 +64,12 @@ static int iq80331_setup(int nr, struct pci_sys_data *sys) if(nr != 0) return 0; - res = kzalloc(sizeof(struct resource) * 2, GFP_KERNEL); + res = kmalloc(sizeof(struct resource) * 2, GFP_KERNEL); if (!res) panic("PCI: unable to alloc resources"); + memset(res, 0, sizeof(struct resource) * 2); + res[0].start = IOP331_PCI_LOWER_IO_VA; res[0].end = IOP331_PCI_UPPER_IO_VA; res[0].name = "IQ80331 PCI I/O Space"; diff --git a/arch/arm/mach-iop3xx/iq80332-pci.c b/arch/arm/mach-iop3xx/iq80332-pci.c index afc067631..65951ffe4 100644 --- a/arch/arm/mach-iop3xx/iq80332-pci.c +++ b/arch/arm/mach-iop3xx/iq80332-pci.c @@ -70,10 +70,12 @@ static int iq80332_setup(int nr, struct pci_sys_data *sys) if(nr != 0) return 0; - res = kzalloc(sizeof(struct resource) * 2, GFP_KERNEL); + res = kmalloc(sizeof(struct resource) * 2, GFP_KERNEL); if (!res) panic("PCI: unable to alloc resources"); + memset(res, 0, sizeof(struct resource) * 2); + res[0].start = IOP331_PCI_LOWER_IO_VA; res[0].end = IOP331_PCI_UPPER_IO_VA; res[0].name = "IQ80332 PCI I/O Space"; diff --git a/arch/arm/mach-ixp2000/Kconfig b/arch/arm/mach-ixp2000/Kconfig index 86f53f8cc..ecb58d834 100644 --- a/arch/arm/mach-ixp2000/Kconfig +++ b/arch/arm/mach-ixp2000/Kconfig @@ -43,17 +43,12 @@ config ARCH_IXDP2401 this platform, see . config ARCH_IXDP2801 - bool "Support Intel IXDP2801 and IXDP28x5" + bool "Support Intel IXDP2801" help Say 'Y' here if you want your kernel to support the Intel - IXDP2801/2805/2855 reference platforms. For more information on + IXDP2801 reference platform. For more information on this platform, see . -config MACH_IXDP28X5 - bool - depends on ARCH_IXDP2801 - default y - config ARCH_IXDP2X01 bool depends on ARCH_IXDP2401 || ARCH_IXDP2801 diff --git a/arch/arm/mach-ixp2000/Makefile b/arch/arm/mach-ixp2000/Makefile index 1e6139d42..9621aeb61 100644 --- a/arch/arm/mach-ixp2000/Makefile +++ b/arch/arm/mach-ixp2000/Makefile @@ -1,7 +1,7 @@ # # Makefile for the linux kernel. # -obj-y := core.o pci.o +obj-y := core.o pci.o uengine.o obj-m := obj-n := obj- := diff --git a/arch/arm/mach-ixp2000/core.c b/arch/arm/mach-ixp2000/core.c index 7f91f689a..cfd5bef31 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,8 +211,7 @@ 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 ((signed long)(next_jiffy_time - *missing_jiffy_timer_csr) - >= ticks_per_jiffy) { + while ((next_jiffy_time - *missing_jiffy_timer_csr) > ticks_per_jiffy) { timer_tick(regs); next_jiffy_time -= ticks_per_jiffy; } @@ -224,7 +223,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 = IRQF_DISABLED | IRQF_TIMER, + .flags = SA_INTERRUPT | SA_TIMER, .handler = ixp2000_timer_interrupt, }; @@ -289,6 +288,8 @@ void gpio_line_config(int line, int direction) local_irq_save(flags); if (direction == GPIO_OUT) { + irq_desc[line + IRQ_IXP2000_GPIO0].valid = 0; + /* if it's an output, it ain't an interrupt anymore */ GPIO_IRQ_falling_edge &= ~(1 << line); GPIO_IRQ_rising_edge &= ~(1 << line); @@ -302,7 +303,6 @@ void gpio_line_config(int line, int direction) } local_irq_restore(flags); } -EXPORT_SYMBOL(gpio_line_config); /************************************************************************* @@ -351,6 +351,11 @@ static int ixp2000_GPIO_irq_type(unsigned int irq, unsigned int type) GPIO_IRQ_level_high &= ~(1 << line); update_gpio_int_csrs(); + /* + * Finally, mark the corresponding IRQ as valid. + */ + irq_desc[irq].valid = 1; + return 0; } @@ -409,7 +414,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(IRQ_IXP2000_DRAM0_MIN_ERR + i, desc, regs); + desc->handle(IRQ_IXP2000_DRAM0_MIN_ERR + i, desc, regs); } } } @@ -501,10 +506,14 @@ void __init ixp2000_init_irq(void) } set_irq_chained_handler(IRQ_IXP2000_ERRSUM, ixp2000_err_irq_handler); + /* + * GPIO IRQs are invalid until someone sets the interrupt mode + * by calling set_irq_type(). + */ for (irq = IRQ_IXP2000_GPIO0; irq <= IRQ_IXP2000_GPIO7; irq++) { set_irq_chip(irq, &ixp2000_GPIO_irq_chip); set_irq_handler(irq, do_level_IRQ); - set_irq_flags(irq, IRQF_VALID); + set_irq_flags(irq, 0); } set_irq_chained_handler(IRQ_IXP2000_GPIO, ixp2000_GPIO_irq_handler); diff --git a/arch/arm/mach-ixp2000/enp2611.c b/arch/arm/mach-ixp2000/enp2611.c index ac29298c5..52fac89e9 100644 --- a/arch/arm/mach-ixp2000/enp2611.c +++ b/arch/arm/mach-ixp2000/enp2611.c @@ -18,6 +18,7 @@ * 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 a6f148018..091012712 100644 --- a/arch/arm/mach-ixp2000/ixdp2400.c +++ b/arch/arm/mach-ixp2000/ixdp2400.c @@ -14,6 +14,7 @@ * 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 91d36d91d..076e3f8ac 100644 --- a/arch/arm/mach-ixp2000/ixdp2800.c +++ b/arch/arm/mach-ixp2000/ixdp2800.c @@ -14,6 +14,7 @@ * 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 40eef8b36..d628da56b 100644 --- a/arch/arm/mach-ixp2000/ixdp2x00.c +++ b/arch/arm/mach-ixp2000/ixdp2x00.c @@ -14,6 +14,7 @@ * Free Software Foundation; either version 2 of the License, or (at your * option) any later version. */ +#include #include #include #include @@ -167,7 +168,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 7f42366f6..150519fb3 100644 --- a/arch/arm/mach-ixp2000/ixdp2x01.c +++ b/arch/arm/mach-ixp2000/ixdp2x01.c @@ -15,6 +15,7 @@ * option) any later version. */ +#include #include #include #include @@ -29,7 +30,6 @@ #include #include #include -#include #include #include @@ -127,12 +127,12 @@ 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); } /************************************************************************* - * IXDP2x01 memory map + * IXDP2x01 memory map and serial ports *************************************************************************/ static struct map_desc ixdp2x01_io_desc __initdata = { .virtual = IXDP2X01_VIRT_CPLD_BASE, @@ -141,78 +141,40 @@ static struct map_desc ixdp2x01_io_desc __initdata = { .type = MT_DEVICE }; -static void __init ixdp2x01_map_io(void) -{ - ixp2000_map_io(); - iotable_init(&ixdp2x01_io_desc, 1); -} - - -/************************************************************************* - * IXDP2x01 serial ports - *************************************************************************/ -static struct plat_serial8250_port ixdp2x01_serial_port1[] = { +static struct uart_port ixdp2x01_serial_ports[2] = { { + .membase = (char *)(IXDP2X01_UART1_VIRT_BASE), .mapbase = (unsigned long)IXDP2X01_UART1_PHYS_BASE, - .membase = (char *)IXDP2X01_UART1_VIRT_BASE, .irq = IRQ_IXDP2X01_UART1, - .flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST, + .flags = UPF_SKIP_TEST, .iotype = UPIO_MEM32, .regshift = 2, .uartclk = IXDP2X01_UART_CLK, - }, - { } -}; - -static struct resource ixdp2x01_uart_resource1 = { - .start = IXDP2X01_UART1_PHYS_BASE, - .end = IXDP2X01_UART1_PHYS_BASE + 0xffff, - .flags = IORESOURCE_MEM, -}; - -static struct platform_device ixdp2x01_serial_device1 = { - .name = "serial8250", - .id = PLAT8250_DEV_PLATFORM1, - .dev = { - .platform_data = ixdp2x01_serial_port1, - }, - .num_resources = 1, - .resource = &ixdp2x01_uart_resource1, -}; - -static struct plat_serial8250_port ixdp2x01_serial_port2[] = { - { + .line = 1, + .type = PORT_16550A, + .fifosize = 16 + }, { + .membase = (char *)(IXDP2X01_UART2_VIRT_BASE), .mapbase = (unsigned long)IXDP2X01_UART2_PHYS_BASE, - .membase = (char *)IXDP2X01_UART2_VIRT_BASE, .irq = IRQ_IXDP2X01_UART2, - .flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST, + .flags = UPF_SKIP_TEST, .iotype = UPIO_MEM32, .regshift = 2, .uartclk = IXDP2X01_UART_CLK, + .line = 2, + .type = PORT_16550A, + .fifosize = 16 }, - { } }; -static struct resource ixdp2x01_uart_resource2 = { - .start = IXDP2X01_UART2_PHYS_BASE, - .end = IXDP2X01_UART2_PHYS_BASE + 0xffff, - .flags = IORESOURCE_MEM, -}; +static void __init ixdp2x01_map_io(void) +{ + ixp2000_map_io(); -static struct platform_device ixdp2x01_serial_device2 = { - .name = "serial8250", - .id = PLAT8250_DEV_PLATFORM2, - .dev = { - .platform_data = ixdp2x01_serial_port2, - }, - .num_resources = 1, - .resource = &ixdp2x01_uart_resource2, -}; + iotable_init(&ixdp2x01_io_desc, 1); -static void ixdp2x01_uart_init(void) -{ - platform_device_register(&ixdp2x01_serial_device1); - platform_device_register(&ixdp2x01_serial_device2); + early_serial_setup(&ixdp2x01_serial_ports[0]); + early_serial_setup(&ixdp2x01_serial_ports[1]); } @@ -322,7 +284,7 @@ static int ixdp2x01_pci_setup(int nr, struct pci_sys_data *sys) { sys->mem_offset = 0xe0000000; - if (machine_is_ixdp2801() || machine_is_ixdp28x5()) + if (machine_is_ixdp2801()) sys->mem_offset -= ((*IXP2000_PCI_ADDR_EXT & 0xE000) << 16); return ixp2000_pci_setup(nr, sys); @@ -338,8 +300,7 @@ struct hw_pci ixdp2x01_pci __initdata = { int __init ixdp2x01_pci_init(void) { - if (machine_is_ixdp2401() || machine_is_ixdp2801() ||\ - machine_is_ixdp28x5()) + if (machine_is_ixdp2401() || machine_is_ixdp2801()) pci_common_init(&ixdp2x01_pci); return 0; @@ -412,7 +373,6 @@ static void __init ixdp2x01_init_machine(void) platform_add_devices(ixdp2x01_devices, ARRAY_SIZE(ixdp2x01_devices)); ixp2000_uart_init(); - ixdp2x01_uart_init(); } @@ -440,21 +400,6 @@ MACHINE_START(IXDP2801, "Intel IXDP2801 Development Platform") .timer = &ixdp2x01_timer, .init_machine = ixdp2x01_init_machine, MACHINE_END - -/* - * IXDP28x5 is basically an IXDP2801 with a different CPU but Intel - * changed the machine ID in the bootloader - */ -MACHINE_START(IXDP28X5, "Intel IXDP2805/2855 Development Platform") - /* Maintainer: MontaVista Software, Inc. */ - .phys_io = IXP2000_UART_PHYS_BASE, - .io_pg_offst = ((IXP2000_UART_VIRT_BASE) >> 18) & 0xfffc, - .boot_params = 0x00000100, - .map_io = ixdp2x01_map_io, - .init_irq = ixdp2x01_init_irq, - .timer = &ixdp2x01_timer, - .init_machine = ixdp2x01_init_machine, -MACHINE_END #endif diff --git a/arch/arm/mach-ixp4xx/Kconfig b/arch/arm/mach-ixp4xx/Kconfig index 57f23b465..5bf50a2a7 100644 --- a/arch/arm/mach-ixp4xx/Kconfig +++ b/arch/arm/mach-ixp4xx/Kconfig @@ -11,7 +11,6 @@ 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, @@ -19,7 +18,6 @@ config MACH_NSLU2 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, @@ -27,7 +25,6 @@ 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 @@ -75,7 +72,6 @@ config ARCH_PRPMC1100 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, @@ -100,7 +96,6 @@ 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. @@ -115,16 +110,11 @@ 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 +comment "IXP4xx Options" config IXP4XX_INDIRECT_PCI bool "Use indirect PCI memory access" - depends on PCI help IXP4xx provides two methods of accessing PCI memory space: @@ -138,7 +128,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 disadvantage of this is that every PCI access requires + The disadvantadge 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 640315d8b..0471044fa 100644 --- a/arch/arm/mach-ixp4xx/Makefile +++ b/arch/arm/mach-ixp4xx/Makefile @@ -2,23 +2,12 @@ # Makefile for the linux kernel. # -obj-pci-y := -obj-pci-n := +obj-y += common.o common-pci.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-$(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-$(CONFIG_MACH_NSLU2) += nslu2-pci.o nslu2-setup.o nslu2-power.o +obj-$(CONFIG_MACH_NAS100D) += nas100d-pci.o nas100d-setup.o nas100d-power.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 9562177b5..6e3462ed5 100644 --- a/arch/arm/mach-ixp4xx/common-pci.c +++ b/arch/arm/mach-ixp4xx/common-pci.c @@ -463,7 +463,7 @@ int ixp4xx_setup(int nr, struct pci_sys_data *sys) if (nr >= 1) return 0; - res = kzalloc(sizeof(*res) * 2, GFP_KERNEL); + res = kmalloc(sizeof(*res) * 2, GFP_KERNEL); if (res == NULL) { /* * If we're out of memory this early, something is wrong, @@ -471,6 +471,7 @@ 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); @@ -532,6 +533,8 @@ 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 7c25dbd5a..fbadf3021 100644 --- a/arch/arm/mach-ixp4xx/common.c +++ b/arch/arm/mach-ixp4xx/common.c @@ -13,6 +13,7 @@ * warranty of any kind, whether express or implied. */ +#include #include #include #include @@ -90,7 +91,7 @@ static void ixp4xx_config_irq(unsigned irq, enum ixp4xx_irq_type type); /* * IRQ -> GPIO mapping table */ -static signed char irq2gpio[32] = { +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, @@ -152,9 +153,6 @@ static int ixp4xx_set_irq_type(unsigned int irq, unsigned int type) /* 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; } @@ -275,7 +273,7 @@ static irqreturn_t ixp4xx_timer_interrupt(int irq, void *dev_id, struct pt_regs /* * Catch up with the real idea of time */ - while ((signed long)(*IXP4XX_OSTS - last_jiffy_time) >= LATCH) { + while ((*IXP4XX_OSTS - last_jiffy_time) > LATCH) { timer_tick(regs); last_jiffy_time += LATCH; } @@ -287,7 +285,7 @@ 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 = IRQF_DISABLED | IRQF_TIMER, + .flags = SA_INTERRUPT | SA_TIMER, .handler = ixp4xx_timer_interrupt, }; diff --git a/arch/arm/mach-ixp4xx/coyote-pci.c b/arch/arm/mach-ixp4xx/coyote-pci.c index 2cebb2878..e6b7fcd92 100644 --- a/arch/arm/mach-ixp4xx/coyote-pci.c +++ b/arch/arm/mach-ixp4xx/coyote-pci.c @@ -17,7 +17,6 @@ #include #include #include -#include #include #include diff --git a/arch/arm/mach-ixp4xx/gtwx5715-setup.c b/arch/arm/mach-ixp4xx/gtwx5715-setup.c index 30f1300e0..654e2eed8 100644 --- a/arch/arm/mach-ixp4xx/gtwx5715-setup.c +++ b/arch/arm/mach-ixp4xx/gtwx5715-setup.c @@ -107,9 +107,9 @@ static struct flash_platform_data gtwx5715_flash_data = { .width = 2, }; -static struct resource gtwx5715_flash_resource = { +static struct gtw5715_flash_resource = { .flags = IORESOURCE_MEM, -}; +} static struct platform_device gtwx5715_flash = { .name = "IXP4XX-Flash", @@ -130,6 +130,9 @@ static void __init gtwx5715_init(void) { ixp4xx_sys_init(); + if (!flash_resource) + printk(KERN_ERR "Could not allocate flash resource\n"); + gtwx5715_flash_resource.start = IXP4XX_EXP_BUS_BASE(0); gtwx5715_flash_resource.end = IXP4XX_EXP_BUS_BASE(0) + SZ_8M - 1; diff --git a/arch/arm/mach-ixp4xx/ixdp425-pci.c b/arch/arm/mach-ixp4xx/ixdp425-pci.c index d5156c043..da415d5d7 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 diff --git a/arch/arm/mach-ixp4xx/ixdpg425-pci.c b/arch/arm/mach-ixp4xx/ixdpg425-pci.c index ed5270800..526fb6175 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 b8ebaf4a9..26b7c001f 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 81ffcae1f..99d333d7e 100644 --- a/arch/arm/mach-ixp4xx/nas100d-power.c +++ b/arch/arm/mach-ixp4xx/nas100d-power.c @@ -17,13 +17,14 @@ * */ -#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 @@ -42,7 +43,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, - IRQF_DISABLED, "NAS100D reset button", NULL) < 0) { + SA_INTERRUPT, "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 9a31444d9..a3b4c6ac5 100644 --- a/arch/arm/mach-ixp4xx/nas100d-setup.c +++ b/arch/arm/mach-ixp4xx/nas100d-setup.c @@ -15,7 +15,6 @@ #include #include #include -#include #include #include @@ -38,36 +37,6 @@ 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, @@ -126,9 +95,7 @@ static struct platform_device nas100d_uart = { static struct platform_device *nas100d_devices[] __initdata = { &nas100d_i2c_controller, &nas100d_flash, -#ifdef CONFIG_LEDS_IXP4XX - &nas100d_leds, -#endif + &nas100d_uart, }; static void nas100d_power_off(void) @@ -155,12 +122,6 @@ 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 04661fef9..ece860444 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 a29b3b2b6..d80c362bc 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, - IRQF_DISABLED, "NSLU2 reset button", NULL) < 0) { + SA_INTERRUPT, "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, - IRQF_DISABLED, "NSLU2 power button", NULL) < 0) { + SA_INTERRUPT, "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 749a33749..55411f21d 100644 --- a/arch/arm/mach-ixp4xx/nslu2-setup.c +++ b/arch/arm/mach-ixp4xx/nslu2-setup.c @@ -7,7 +7,6 @@ * 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 @@ -17,7 +16,6 @@ #include #include #include -#include #include #include @@ -45,42 +43,6 @@ 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, @@ -140,10 +102,8 @@ 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) @@ -167,12 +127,6 @@ 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 b7af5640e..ac626436e 100644 --- a/arch/arm/mach-l7200/core.c +++ b/arch/arm/mach-l7200/core.c @@ -7,7 +7,6 @@ */ #include #include -#include #include #include diff --git a/arch/arm/mach-lh7a40x/Kconfig b/arch/arm/mach-lh7a40x/Kconfig index 558a34f53..8a17867a6 100644 --- a/arch/arm/mach-lh7a40x/Kconfig +++ b/arch/arm/mach-lh7a40x/Kconfig @@ -14,7 +14,6 @@ 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 @@ -24,7 +23,6 @@ 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 @@ -36,9 +34,6 @@ 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 94b8615fb..e90512dbc 100644 --- a/arch/arm/mach-lh7a40x/Makefile +++ b/arch/arm/mach-lh7a40x/Makefile @@ -4,14 +4,11 @@ # Object file lists. -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 - +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- := diff --git a/arch/arm/mach-lh7a40x/arch-kev7a400.c b/arch/arm/mach-lh7a40x/arch-kev7a400.c index 4f2ab4880..2cccc27c6 100644 --- a/arch/arm/mach-lh7a40x/arch-kev7a400.c +++ b/arch/arm/mach-lh7a40x/arch-kev7a400.c @@ -63,8 +63,7 @@ static void kev7a400_unmask_cpld_irq (u32 irq) CPLD_WR_PB_INT_MASK = CPLD_IRQ_mask; } -static struct irq_chip kev7a400_cpld_chip = { - .name = "CPLD", +static struct irqchip kev7a400_cpld_chip = { .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 a6910114b..12e23277c 100644 --- a/arch/arm/mach-lh7a40x/arch-lpd7a40x.c +++ b/arch/arm/mach-lh7a40x/arch-lpd7a40x.c @@ -12,7 +12,6 @@ #include #include #include -#include #include #include @@ -24,28 +23,6 @@ #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, @@ -71,12 +48,12 @@ static struct platform_device smc91x_device = { static struct resource lh7a40x_usbclient_resources[] = { [0] = { .start = USB_PHYS, - .end = (USB_PHYS + PAGE_SIZE), + .end = (USB_PHYS + 0xFF), .flags = IORESOURCE_MEM, }, [1] = { - .start = IRQ_USB, - .end = IRQ_USB, + .start = IRQ_USBINTR, + .end = IRQ_USBINTR, .flags = IORESOURCE_IRQ, }, }; @@ -84,8 +61,7 @@ static struct resource lh7a40x_usbclient_resources[] = { static u64 lh7a40x_usbclient_dma_mask = 0xffffffffUL; static struct platform_device lh7a40x_usbclient_device = { -// .name = "lh7a40x_udc", - .name = "lh7-udc", + .name = "lh7a40x_udc", .id = 0, .dev = { .dma_mask = &lh7a40x_usbclient_dma_mask, @@ -125,7 +101,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) @@ -137,52 +113,29 @@ extern void lpd7a400_map_io (void); static void __init lpd7a40x_init (void) { -#if defined (CONFIG_MACH_LPD7A400) - CPLD_CONTROL |= 0 - | CPLD_CONTROL_SWINT /* Disable software interrupt */ - | CPLD_CONTROL_OCMSK; /* Mask USB1 connection IRQ */ + CPLD_CONTROL |= (1<<6); /* Mask USB1 connection IRQ */ CPLD_CONTROL &= ~(0 - | CPLD_CONTROL_LCD_ENABLE /* Disable LCD */ - | CPLD_CONTROL_WRLAN_NENABLE /* Enable SMC91x */ + | (1<<1) /* Disable LCD */ + | (1<<0) /* Enable WLAN */ ); -#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, 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 + /* CPLD doesn't have ack capability */ } static void lh7a40x_mask_cpld_irq (u32 irq) { switch (irq) { case IRQ_LPD7A40X_ETH_INT: - CPLD_INTERRUPTS |= CPLD_INTMASK_ETHERNET; + CPLD_INTERRUPTS = CPLD_INTERRUPTS | 0x4; break; -#if defined (IRQ_TOUCH) - case IRQ_TOUCH: - CPLD_INTERRUPTS |= CPLD_INTMASK_TOUCH; + case IRQ_LPD7A400_TS: + CPLD_INTERRUPTS = CPLD_INTERRUPTS | 0x8; break; -#endif } } @@ -190,18 +143,15 @@ static void lh7a40x_unmask_cpld_irq (u32 irq) { switch (irq) { case IRQ_LPD7A40X_ETH_INT: - CPLD_INTERRUPTS &= ~CPLD_INTMASK_ETHERNET; + CPLD_INTERRUPTS = CPLD_INTERRUPTS & ~ 0x4; break; -#if defined (IRQ_TOUCH) - case IRQ_TOUCH: - CPLD_INTERRUPTS &= ~CPLD_INTMASK_TOUCH; + case IRQ_LPD7A400_TS: + CPLD_INTERRUPTS = CPLD_INTERRUPTS & ~ 0x8; break; -#endif } } -static struct irq_chip lpd7a40x_cpld_chip = { - .name = "CPLD", +static struct irqchip lpd7a40x_cpld_chip = { .ack = lh7a40x_ack_cpld_irq, .mask = lh7a40x_mask_cpld_irq, .unmask = lh7a40x_unmask_cpld_irq, @@ -214,13 +164,11 @@ static void lpd7a40x_cpld_handler (unsigned int irq, struct irqdesc *desc, desc->chip->ack (irq); - if ((mask & (1<<0)) == 0) /* WLAN */ + if ((mask & 0x1) == 0) /* WLAN */ IRQ_DISPATCH (IRQ_LPD7A40X_ETH_INT); -#if defined (IRQ_TOUCH) - if ((mask & (1<<1)) == 0) /* Touch */ - IRQ_DISPATCH (IRQ_TOUCH); -#endif + if ((mask & 0x2) == 0) /* Touch */ + IRQ_DISPATCH (IRQ_LPD7A400_TS); desc->chip->unmask (irq); /* Level-triggered need this */ } @@ -256,21 +204,9 @@ void __init lh7a40x_init_board_irq (void) /* Then, configure CPLD interrupt */ - /* 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 + CPLD_INTERRUPTS = 0x9c; /* Disable all CPLD interrupts */ GPIO_PFDD &= ~(1 << pinCPLD); /* Make input */ - GPIO_INTTYPE1 &= ~(1 << pinCPLD); /* Level triggered */ + GPIO_INTTYPE1 |= (1 << pinCPLD); /* Edge triggered */ GPIO_INTTYPE2 &= ~(1 << pinCPLD); /* Active low */ barrier (); GPIO_GPIOFINTEN |= (1 << pinCPLD); /* Enable */ @@ -280,7 +216,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_level_IRQ); + set_irq_handler (irq, do_edge_IRQ); set_irq_flags (irq, IRQF_VALID); } @@ -290,109 +226,91 @@ void __init lh7a40x_init_board_irq (void) lpd7a40x_cpld_handler); } -static struct map_desc lpd7a40x_io_desc[] __initdata = { +static struct map_desc lpd7a400_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, - .type = MT_DEVICE - }, - { - .virtual = CPLD08_VIRT, - .pfn = __phys_to_pfn(CPLD08_PHYS), - .length = CPLD08_SIZE, + .length = CPLD06_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 -lpd7a40x_map_io(void) +lpd7a400_map_io(void) { - iotable_init (lpd7a40x_io_desc, ARRAY_SIZE (lpd7a40x_io_desc)); + 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 */ } #ifdef CONFIG_MACH_LPD7A400 @@ -402,7 +320,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 = lpd7a40x_map_io, + .map_io = lpd7a400_map_io, .init_irq = lh7a400_init_irq, .timer = &lh7a40x_timer, .init_machine = lpd7a40x_init, @@ -417,7 +335,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 = lpd7a40x_map_io, + .map_io = lpd7a400_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 18e8bb4eb..578a52461 100644 --- a/arch/arm/mach-lh7a40x/common.h +++ b/arch/arm/mach-lh7a40x/common.h @@ -12,7 +12,5 @@ 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 f9b3fe917..691bb0923 100644 --- a/arch/arm/mach-lh7a40x/irq-kev7a400.c +++ b/arch/arm/mach-lh7a40x/irq-kev7a400.c @@ -16,7 +16,6 @@ #include #include -#include "common.h" /* KEV7a400 CPLD IRQ handling */ @@ -43,8 +42,7 @@ lh7a400_unmask_cpld_irq (u32 irq) } static struct -irq_chip lh7a400_cpld_chip = { - .name = "CPLD", +irqchip lh7a400_cpld_chip = { .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 091b2dc58..f334d81c2 100644 --- a/arch/arm/mach-lh7a40x/irq-lh7a400.c +++ b/arch/arm/mach-lh7a40x/irq-lh7a400.c @@ -16,9 +16,9 @@ #include #include #include +#include #include -#include "common.h" /* CPU IRQ handling */ @@ -38,15 +38,13 @@ static void lh7a400_ack_gpio_irq (u32 irq) INTC_INTENC = (1 << irq); } -static struct irq_chip lh7a400_internal_chip = { - .name = "MPU", +static struct irqchip lh7a400_internal_chip = { .ack = lh7a400_mask_irq, /* Level triggering -> mask is ack */ .mask = lh7a400_mask_irq, .unmask = lh7a400_unmask_irq, }; -static struct irq_chip lh7a400_gpio_chip = { - .name = "GPIO", +static struct irqchip lh7a400_gpio_chip = { .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 7059b9837..122fadabc 100644 --- a/arch/arm/mach-lh7a40x/irq-lh7a404.c +++ b/arch/arm/mach-lh7a40x/irq-lh7a404.c @@ -16,10 +16,9 @@ #include #include #include +#include #include -#include "common.h" - #define USE_PRIORITIES /* See Documentation/arm/Sharp-LH/VectoredInterruptController for more @@ -28,17 +27,13 @@ static unsigned char irq_pri_vic1[] = { #if defined (USE_PRIORITIES) - IRQ_GPIO3INTR, /* CPLD */ - IRQ_DMAM2P4, IRQ_DMAM2P5, /* AC97 */ +IRQ_GPIO3INTR, #endif }; static unsigned char irq_pri_vic2[] = { #if defined (USE_PRIORITIES) - IRQ_T3UI, /* Timer */ - IRQ_GPIO7INTR, /* CPLD */ + IRQ_T3UI, IRQ_GPIO7INTR, IRQ_UART1INTR, IRQ_UART2INTR, IRQ_UART3INTR, - IRQ_LCDINTR, /* LCD */ - IRQ_TSCINTR, /* ADC/Touchscreen */ #endif }; @@ -76,29 +71,25 @@ static void lh7a404_vic2_ack_gpio_irq (u32 irq) VIC2_INTENCLR = (1 << irq); } -static struct irq_chip lh7a404_vic1_chip = { - .name = "VIC1", +static struct irqchip lh7a404_vic1_chip = { .ack = lh7a404_vic1_mask_irq, /* Because level-triggered */ .mask = lh7a404_vic1_mask_irq, .unmask = lh7a404_vic1_unmask_irq, }; -static struct irq_chip lh7a404_vic2_chip = { - .name = "VIC2", +static struct irqchip lh7a404_vic2_chip = { .ack = lh7a404_vic2_mask_irq, /* Because level-triggered */ .mask = lh7a404_vic2_mask_irq, .unmask = lh7a404_vic2_unmask_irq, }; -static struct irq_chip lh7a404_gpio_vic1_chip = { - .name = "GPIO-VIC1", +static struct irqchip lh7a404_gpio_vic1_chip = { .ack = lh7a404_vic1_ack_gpio_irq, .mask = lh7a404_vic1_mask_irq, .unmask = lh7a404_vic1_unmask_irq, }; -static struct irq_chip lh7a404_gpio_vic2_chip = { - .name = "GPIO-VIC2", +static struct irqchip lh7a404_gpio_vic2_chip = { .ack = lh7a404_vic2_ack_gpio_irq, .mask = lh7a404_vic2_mask_irq, .unmask = lh7a404_vic2_unmask_irq, @@ -106,19 +97,10 @@ static struct irq_chip 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 d6055dde6..6262d4491 100644 --- a/arch/arm/mach-lh7a40x/irq-lpd7a40x.c +++ b/arch/arm/mach-lh7a40x/irq-lpd7a40x.c @@ -19,7 +19,6 @@ #include #include -#include "common.h" static void lh7a40x_ack_cpld_irq (u32 irq) { @@ -50,8 +49,7 @@ static void lh7a40x_unmask_cpld_irq (u32 irq) } } -static struct irq_chip lh7a40x_cpld_chip = { - .name = "CPLD", +static struct irqchip lh7a40x_cpld_chip = { .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 ad5652e01..be377e331 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 = IRQF_DISABLED | IRQF_TIMER, + .flags = SA_INTERRUPT | SA_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 d135568dc..86a0f0d14 100644 --- a/arch/arm/mach-omap1/Kconfig +++ b/arch/arm/mach-omap1/Kconfig @@ -62,13 +62,6 @@ 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 @@ -76,6 +69,12 @@ config MACH_VOICEBLUE Support for Voiceblue GSM/VoIP gateway. Say Y here if you have such a board. +config MACH_NETSTAR + bool "NetStar" + depends on ARCH_OMAP1 && ARCH_OMAP15XX + help + Support for NetStar PBX. Say Y here if you have such a board. + config MACH_OMAP_PALMTE bool "Palm Tungsten E" depends on ARCH_OMAP1 && ARCH_OMAP15XX @@ -86,20 +85,6 @@ config MACH_OMAP_PALMTE informations. Say Y here if you have such a PDA, say NO otherwise. -config MACH_NOKIA770 - bool "Nokia 770" - depends on ARCH_OMAP1 && ARCH_OMAP16XX - help - Support for the Nokia 770 Internet Tablet. Say Y here if you - have such a device. - -config MACH_AMS_DELTA - bool "Amstrad E3 (Delta)" - depends on ARCH_OMAP1 && ARCH_OMAP15XX - help - Support for the Amstrad E3 (codename Delta) videophone. Say Y here - if you have such a device. - config MACH_OMAP_GENERIC bool "Generic OMAP board" depends on ARCH_OMAP1 && (ARCH_OMAP15XX || ARCH_OMAP16XX) diff --git a/arch/arm/mach-omap1/Makefile b/arch/arm/mach-omap1/Makefile index 7165f74f7..b0b00156f 100644 --- a/arch/arm/mach-omap1/Makefile +++ b/arch/arm/mach-omap1/Makefile @@ -3,13 +3,7 @@ # # Common support -obj-y := io.o id.o clock.o irq.o mux.o serial.o devices.o - -obj-$(CONFIG_OMAP_MPU_TIMER) += time.o - -# Power Management -obj-$(CONFIG_PM) += pm.o sleep.o - +obj-y := io.o id.o clock.o irq.o time.o mux.o serial.o devices.o led-y := leds.o # Specific board support @@ -17,13 +11,11 @@ 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 +obj-$(CONFIG_MACH_NETSTAR) += board-netstar.o obj-$(CONFIG_MACH_OMAP_PALMTE) += board-palmte.o -obj-$(CONFIG_MACH_NOKIA770) += board-nokia770.o -obj-$(CONFIG_MACH_AMS_DELTA) += board-ams-delta.o ifeq ($(CONFIG_ARCH_OMAP15XX),y) # Innovator-1510 FPGA diff --git a/arch/arm/mach-omap1/board-generic.c b/arch/arm/mach-omap1/board-generic.c index 33d01adab..a177e78b2 100644 --- a/arch/arm/mach-omap1/board-generic.c +++ b/arch/arm/mach-omap1/board-generic.c @@ -88,7 +88,7 @@ static struct omap_board_config_kernel generic_config[] = { static void __init omap_generic_init(void) { #ifdef CONFIG_ARCH_OMAP15XX - if (cpu_is_omap15xx()) { + if (cpu_is_omap1510()) { generic_config[0].data = &generic1510_usb_config; } #endif diff --git a/arch/arm/mach-omap1/board-h2.c b/arch/arm/mach-omap1/board-h2.c index cd3a06dfc..89f0cc74a 100644 --- a/arch/arm/mach-omap1/board-h2.c +++ b/arch/arm/mach-omap1/board-h2.c @@ -24,9 +24,7 @@ #include #include #include -#include #include -#include #include #include @@ -37,55 +35,12 @@ #include #include #include -#include #include -#include #include -#include -#include extern int omap_gpio_init(void); -static int h2_keymap[] = { - KEY(0, 0, KEY_LEFT), - KEY(0, 1, KEY_RIGHT), - KEY(0, 2, KEY_3), - KEY(0, 3, KEY_F10), - KEY(0, 4, KEY_F5), - KEY(0, 5, KEY_9), - KEY(1, 0, KEY_DOWN), - KEY(1, 1, KEY_UP), - KEY(1, 2, KEY_2), - KEY(1, 3, KEY_F9), - KEY(1, 4, KEY_F7), - KEY(1, 5, KEY_0), - KEY(2, 0, KEY_ENTER), - KEY(2, 1, KEY_6), - KEY(2, 2, KEY_1), - KEY(2, 3, KEY_F2), - KEY(2, 4, KEY_F6), - KEY(2, 5, KEY_HOME), - KEY(3, 0, KEY_8), - KEY(3, 1, KEY_5), - KEY(3, 2, KEY_F12), - KEY(3, 3, KEY_F3), - KEY(3, 4, KEY_F8), - KEY(3, 5, KEY_END), - KEY(4, 0, KEY_7), - KEY(4, 1, KEY_4), - KEY(4, 2, KEY_F11), - KEY(4, 3, KEY_F1), - KEY(4, 4, KEY_F4), - KEY(4, 5, KEY_ESC), - KEY(5, 0, KEY_F13), - KEY(5, 1, KEY_F14), - KEY(5, 2, KEY_F15), - KEY(5, 3, KEY_F16), - KEY(5, 4, KEY_SLEEP), - 0 -}; - -static struct mtd_partition h2_nor_partitions[] = { +static struct mtd_partition h2_partitions[] = { /* bootloader (U-Boot, etc) in first sector */ { .name = "bootloader", @@ -116,26 +71,26 @@ static struct mtd_partition h2_nor_partitions[] = { } }; -static struct flash_platform_data h2_nor_data = { +static struct flash_platform_data h2_flash_data = { .map_name = "cfi_probe", .width = 2, - .parts = h2_nor_partitions, - .nr_parts = ARRAY_SIZE(h2_nor_partitions), + .parts = h2_partitions, + .nr_parts = ARRAY_SIZE(h2_partitions), }; -static struct resource h2_nor_resource = { +static struct resource h2_flash_resource = { /* This is on CS3, wherever it's mapped */ .flags = IORESOURCE_MEM, }; -static struct platform_device h2_nor_device = { +static struct platform_device h2_flash_device = { .name = "omapflash", .id = 0, .dev = { - .platform_data = &h2_nor_data, + .platform_data = &h2_flash_data, }, .num_resources = 1, - .resource = &h2_nor_resource, + .resource = &h2_flash_resource, }; static struct resource h2_smc91x_resources[] = { @@ -158,119 +113,9 @@ static struct platform_device h2_smc91x_device = { .resource = h2_smc91x_resources, }; -static struct resource h2_kp_resources[] = { - [0] = { - .start = INT_KEYBOARD, - .end = INT_KEYBOARD, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct omap_kp_platform_data h2_kp_data = { - .rows = 8, - .cols = 8, - .keymap = h2_keymap, - .rep = 1, -}; - -static struct platform_device h2_kp_device = { - .name = "omap-keypad", - .id = -1, - .dev = { - .platform_data = &h2_kp_data, - }, - .num_resources = ARRAY_SIZE(h2_kp_resources), - .resource = h2_kp_resources, -}; - -#define H2_IRDA_FIRSEL_GPIO_PIN 17 - -#if defined(CONFIG_OMAP_IR) || defined(CONFIG_OMAP_IR_MODULE) -static int h2_transceiver_mode(struct device *dev, int state) -{ - if (state & IR_SIRMODE) - omap_set_gpio_dataout(H2_IRDA_FIRSEL_GPIO_PIN, 0); - else /* MIR/FIR */ - omap_set_gpio_dataout(H2_IRDA_FIRSEL_GPIO_PIN, 1); - - return 0; -} -#endif - -static struct omap_irda_config h2_irda_data = { - .transceiver_cap = IR_SIRMODE | IR_MIRMODE | IR_FIRMODE, - .rx_channel = OMAP_DMA_UART3_RX, - .tx_channel = OMAP_DMA_UART3_TX, - .dest_start = UART3_THR, - .src_start = UART3_RHR, - .tx_trigger = 0, - .rx_trigger = 0, -}; - -static struct resource h2_irda_resources[] = { - [0] = { - .start = INT_UART3, - .end = INT_UART3, - .flags = IORESOURCE_IRQ, - }, -}; -static struct platform_device h2_irda_device = { - .name = "omapirda", - .id = 0, - .dev = { - .platform_data = &h2_irda_data, - }, - .num_resources = ARRAY_SIZE(h2_irda_resources), - .resource = h2_irda_resources, -}; - -static struct platform_device h2_lcd_device = { - .name = "lcd_h2", - .id = -1, -}; - -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(1), - .rcr1 = RFRLEN1(OMAP_MCBSP_WORD_8) | RWDLEN1(OMAP_MCBSP_WORD_16), - .xcr2 = XPHASE | XFRLEN2(OMAP_MCBSP_WORD_8) | - XWDLEN2(OMAP_MCBSP_WORD_16) | XDATDLY(1) | XFIG, - .xcr1 = XFRLEN1(OMAP_MCBSP_WORD_8) | XWDLEN1(OMAP_MCBSP_WORD_16), - .srgr1 = FWID(15), - .srgr2 = GSYNC | CLKSP | FSGM | FPER(31), - - .pcr0 = CLKXM | CLKRM | FSXP | FSRP | CLKXP | CLKRP, - //.pcr0 = CLKXP | CLKRP, /* mcbsp: slave */ -}; - -static struct omap_alsa_codec_config alsa_config = { - .name = "H2 TSC2101", - .mcbsp_regs_alsa = &mcbsp_regs, - .codec_configure_dev = NULL, // tsc2101_configure, - .codec_set_samplerate = NULL, // tsc2101_set_samplerate, - .codec_clock_setup = NULL, // tsc2101_clock_setup, - .codec_clock_on = NULL, // tsc2101_clock_on, - .codec_clock_off = NULL, // tsc2101_clock_off, - .get_default_samplerate = NULL, // tsc2101_get_default_samplerate, -}; - -static struct platform_device h2_mcbsp1_device = { - .name = "omap_alsa_mcbsp", - .id = 1, - .dev = { - .platform_data = &alsa_config, - }, -}; - static struct platform_device *h2_devices[] __initdata = { - &h2_nor_device, + &h2_flash_device, &h2_smc91x_device, - &h2_irda_device, - &h2_kp_device, - &h2_lcd_device, - &h2_mcbsp1_device, }; static void __init h2_init_smc91x(void) @@ -319,6 +164,7 @@ static struct omap_uart_config h2_uart_config __initdata = { }; static struct omap_lcd_config h2_lcd_config __initdata = { + .panel_name = "h2", .ctrl_name = "internal", }; @@ -331,34 +177,16 @@ static struct omap_board_config_kernel h2_config[] = { static void __init h2_init(void) { - /* Here we assume the NOR boot config: NOR on CS3 (possibly swapped - * to address 0 by a dip switch), NAND on CS2B. The NAND driver will - * notice whether a NAND chip is enabled at probe time. - * - * FIXME revC boards (and H3) support NAND-boot, with a dip switch to - * put NOR on CS2B and NAND (which on H2 may be 16bit) on CS3. Try - * detecting that in code here, to avoid probing every possible flash - * configuration... + /* NOTE: revC boards support NAND-boot, which can put NOR on CS2B + * and NAND (either 16bit or 8bit) on CS3. */ - h2_nor_resource.end = h2_nor_resource.start = omap_cs3_phys(); - h2_nor_resource.end += SZ_32M - 1; - - omap_cfg_reg(L3_1610_FLASH_CS2B_OE); - omap_cfg_reg(M8_1610_FLASH_CS2B_WE); + h2_flash_resource.end = h2_flash_resource.start = omap_cs3_phys(); + h2_flash_resource.end += SZ_32M - 1; /* MMC: card detect and WP */ // omap_cfg_reg(U19_ARMIO1); /* CD */ omap_cfg_reg(BALLOUT_V8_ARMIO3); /* WP */ - /* Irda */ -#if defined(CONFIG_OMAP_IR) || defined(CONFIG_OMAP_IR_MODULE) - omap_writel(omap_readl(FUNC_MUX_CTRL_A) | 7, FUNC_MUX_CTRL_A); - if (!(omap_request_gpio(H2_IRDA_FIRSEL_GPIO_PIN))) { - omap_set_gpio_direction(H2_IRDA_FIRSEL_GPIO_PIN, 0); - h2_irda_data.transceiver_mode = h2_transceiver_mode; - } -#endif - platform_add_devices(h2_devices, ARRAY_SIZE(h2_devices)); omap_board_config = h2_config; omap_board_config_size = ARRAY_SIZE(h2_config); diff --git a/arch/arm/mach-omap1/board-h3.c b/arch/arm/mach-omap1/board-h3.c index 7b206116c..d9f386265 100644 --- a/arch/arm/mach-omap1/board-h3.c +++ b/arch/arm/mach-omap1/board-h3.c @@ -14,17 +14,15 @@ * published by the Free Software Foundation. */ +#include #include #include #include #include #include #include -#include #include -#include #include -#include #include #include @@ -35,59 +33,15 @@ #include #include -#include #include #include #include -#include #include -#include -#include #include extern int omap_gpio_init(void); -static int h3_keymap[] = { - KEY(0, 0, KEY_LEFT), - KEY(0, 1, KEY_RIGHT), - KEY(0, 2, KEY_3), - KEY(0, 3, KEY_F10), - KEY(0, 4, KEY_F5), - KEY(0, 5, KEY_9), - KEY(1, 0, KEY_DOWN), - KEY(1, 1, KEY_UP), - KEY(1, 2, KEY_2), - KEY(1, 3, KEY_F9), - KEY(1, 4, KEY_F7), - KEY(1, 5, KEY_0), - KEY(2, 0, KEY_ENTER), - KEY(2, 1, KEY_6), - KEY(2, 2, KEY_1), - KEY(2, 3, KEY_F2), - KEY(2, 4, KEY_F6), - KEY(2, 5, KEY_HOME), - KEY(3, 0, KEY_8), - KEY(3, 1, KEY_5), - KEY(3, 2, KEY_F12), - KEY(3, 3, KEY_F3), - KEY(3, 4, KEY_F8), - KEY(3, 5, KEY_END), - KEY(4, 0, KEY_7), - KEY(4, 1, KEY_4), - KEY(4, 2, KEY_F11), - KEY(4, 3, KEY_F1), - KEY(4, 4, KEY_F4), - KEY(4, 5, KEY_ESC), - KEY(5, 0, KEY_F13), - KEY(5, 1, KEY_F14), - KEY(5, 2, KEY_F15), - KEY(5, 3, KEY_F16), - KEY(5, 4, KEY_SLEEP), - 0 -}; - - -static struct mtd_partition nor_partitions[] = { +static struct mtd_partition h3_partitions[] = { /* bootloader (U-Boot, etc) in first sector */ { .name = "bootloader", @@ -118,80 +72,26 @@ static struct mtd_partition nor_partitions[] = { } }; -static struct flash_platform_data nor_data = { +static struct flash_platform_data h3_flash_data = { .map_name = "cfi_probe", .width = 2, - .parts = nor_partitions, - .nr_parts = ARRAY_SIZE(nor_partitions), + .parts = h3_partitions, + .nr_parts = ARRAY_SIZE(h3_partitions), }; -static struct resource nor_resource = { +static struct resource h3_flash_resource = { /* This is on CS3, wherever it's mapped */ .flags = IORESOURCE_MEM, }; -static struct platform_device nor_device = { +static struct platform_device flash_device = { .name = "omapflash", .id = 0, .dev = { - .platform_data = &nor_data, - }, - .num_resources = 1, - .resource = &nor_resource, -}; - -static struct mtd_partition nand_partitions[] = { -#if 0 - /* REVISIT: enable these partitions if you make NAND BOOT work */ - { - .name = "xloader", - .offset = 0, - .size = 64 * 1024, - .mask_flags = MTD_WRITEABLE, /* force read-only */ - }, - { - .name = "bootloader", - .offset = MTDPART_OFS_APPEND, - .size = 256 * 1024, - .mask_flags = MTD_WRITEABLE, /* force read-only */ - }, - { - .name = "params", - .offset = MTDPART_OFS_APPEND, - .size = 192 * 1024, - }, - { - .name = "kernel", - .offset = MTDPART_OFS_APPEND, - .size = 2 * SZ_1M, - }, -#endif - { - .name = "filesystem", - .size = MTDPART_SIZ_FULL, - .offset = MTDPART_OFS_APPEND, - }, -}; - -/* dip switches control NAND chip access: 8 bit, 16 bit, or neither */ -static struct nand_platform_data nand_data = { - .options = NAND_SAMSUNG_LP_OPTIONS, - .parts = nand_partitions, - .nr_parts = ARRAY_SIZE(nand_partitions), -}; - -static struct resource nand_resource = { - .flags = IORESOURCE_MEM, -}; - -static struct platform_device nand_device = { - .name = "omapnand", - .id = 0, - .dev = { - .platform_data = &nand_data, + .platform_data = &h3_flash_data, }, .num_resources = 1, - .resource = &nand_resource, + .resource = &h3_flash_resource, }; static struct resource smc91x_resources[] = { @@ -238,136 +138,10 @@ static struct platform_device intlat_device = { .resource = intlat_resources, }; -static struct resource h3_kp_resources[] = { - [0] = { - .start = INT_KEYBOARD, - .end = INT_KEYBOARD, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct omap_kp_platform_data h3_kp_data = { - .rows = 8, - .cols = 8, - .keymap = h3_keymap, - .rep = 1, -}; - -static struct platform_device h3_kp_device = { - .name = "omap-keypad", - .id = -1, - .dev = { - .platform_data = &h3_kp_data, - }, - .num_resources = ARRAY_SIZE(h3_kp_resources), - .resource = h3_kp_resources, -}; - - -/* Select between the IrDA and aGPS module - */ -static int h3_select_irda(struct device *dev, int state) -{ - unsigned char expa; - int err = 0; - - if ((err = read_gpio_expa(&expa, 0x26))) { - printk(KERN_ERR "Error reading from I/O EXPANDER \n"); - return err; - } - - /* 'P6' enable/disable IRDA_TX and IRDA_RX */ - if (state & IR_SEL) { /* IrDA */ - if ((err = write_gpio_expa(expa | 0x40, 0x26))) { - printk(KERN_ERR "Error writing to I/O EXPANDER \n"); - return err; - } - } else { - if ((err = write_gpio_expa(expa & ~0x40, 0x26))) { - printk(KERN_ERR "Error writing to I/O EXPANDER \n"); - return err; - } - } - return err; -} - -static void set_trans_mode(void *data) -{ - int *mode = data; - unsigned char expa; - int err = 0; - - if ((err = read_gpio_expa(&expa, 0x27)) != 0) { - printk(KERN_ERR "Error reading from I/O expander\n"); - } - - expa &= ~0x03; - - if (*mode & IR_SIRMODE) { - expa |= 0x01; - } else { /* MIR/FIR */ - expa |= 0x03; - } - - if ((err = write_gpio_expa(expa, 0x27)) != 0) { - printk(KERN_ERR "Error writing to I/O expander\n"); - } -} - -static int h3_transceiver_mode(struct device *dev, int mode) -{ - struct omap_irda_config *irda_config = dev->platform_data; - - cancel_delayed_work(&irda_config->gpio_expa); - PREPARE_WORK(&irda_config->gpio_expa, set_trans_mode, &mode); - schedule_work(&irda_config->gpio_expa); - - return 0; -} - -static struct omap_irda_config h3_irda_data = { - .transceiver_cap = IR_SIRMODE | IR_MIRMODE | IR_FIRMODE, - .transceiver_mode = h3_transceiver_mode, - .select_irda = h3_select_irda, - .rx_channel = OMAP_DMA_UART3_RX, - .tx_channel = OMAP_DMA_UART3_TX, - .dest_start = UART3_THR, - .src_start = UART3_RHR, - .tx_trigger = 0, - .rx_trigger = 0, -}; - -static struct resource h3_irda_resources[] = { - [0] = { - .start = INT_UART3, - .end = INT_UART3, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct platform_device h3_irda_device = { - .name = "omapirda", - .id = 0, - .dev = { - .platform_data = &h3_irda_data, - }, - .num_resources = ARRAY_SIZE(h3_irda_resources), - .resource = h3_irda_resources, -}; - -static struct platform_device h3_lcd_device = { - .name = "lcd_h3", - .id = -1, -}; - static struct platform_device *devices[] __initdata = { - &nor_device, - &nand_device, + &flash_device, &smc91x_device, &intlat_device, - &h3_irda_device, - &h3_kp_device, - &h3_lcd_device, }; static struct omap_usb_config h3_usb_config __initdata = { @@ -397,6 +171,7 @@ static struct omap_uart_config h3_uart_config __initdata = { }; static struct omap_lcd_config h3_lcd_config __initdata = { + .panel_name = "h3", .ctrl_name = "internal", }; @@ -407,36 +182,11 @@ static struct omap_board_config_kernel h3_config[] = { { OMAP_TAG_LCD, &h3_lcd_config }, }; -#define H3_NAND_RB_GPIO_PIN 10 - -static int nand_dev_ready(struct nand_platform_data *data) -{ - return omap_get_gpio_datain(H3_NAND_RB_GPIO_PIN); -} - static void __init h3_init(void) { - /* Here we assume the NOR boot config: NOR on CS3 (possibly swapped - * to address 0 by a dip switch), NAND on CS2B. The NAND driver will - * notice whether a NAND chip is enabled at probe time. - * - * H3 support NAND-boot, with a dip switch to put NOR on CS2B and NAND - * (which on H2 may be 16bit) on CS3. Try detecting that in code here, - * to avoid probing every possible flash configuration... - */ - nor_resource.end = nor_resource.start = omap_cs3_phys(); - nor_resource.end += SZ_32M - 1; - - nand_resource.end = nand_resource.start = OMAP_CS2B_PHYS; - nand_resource.end += SZ_4K - 1; - if (!(omap_request_gpio(H3_NAND_RB_GPIO_PIN))) - nand_data.dev_ready = nand_dev_ready; - - /* GPIO10 Func_MUX_CTRL reg bit 29:27, Configure V2 to mode1 as GPIO */ - /* GPIO10 pullup/down register, Enable pullup on GPIO10 */ - omap_cfg_reg(V2_1710_GPIO10); - - platform_add_devices(devices, ARRAY_SIZE(devices)); + h3_flash_resource.end = h3_flash_resource.start = omap_cs3_phys(); + h3_flash_resource.end += OMAP_CS3_SIZE - 1; + (void) platform_add_devices(devices, ARRAY_SIZE(devices)); omap_board_config = h3_config; omap_board_config_size = ARRAY_SIZE(h3_config); omap_serial_init(); diff --git a/arch/arm/mach-omap1/board-innovator.c b/arch/arm/mach-omap1/board-innovator.c index 4cbc62db5..a04e43329 100644 --- a/arch/arm/mach-omap1/board-innovator.c +++ b/arch/arm/mach-omap1/board-innovator.c @@ -22,7 +22,6 @@ #include #include #include -#include #include #include @@ -35,23 +34,7 @@ #include #include #include -#include #include -#include -#include - -static int innovator_keymap[] = { - KEY(0, 0, KEY_F1), - KEY(0, 3, KEY_DOWN), - KEY(1, 1, KEY_F2), - KEY(1, 2, KEY_RIGHT), - KEY(2, 0, KEY_F3), - KEY(2, 1, KEY_F4), - KEY(2, 2, KEY_UP), - KEY(3, 2, KEY_ENTER), - KEY(3, 3, KEY_LEFT), - 0 -}; static struct mtd_partition innovator_partitions[] = { /* bootloader (U-Boot, etc) in first sector */ @@ -114,73 +97,8 @@ 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, - .end = INT_KEYBOARD, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct omap_kp_platform_data innovator_kp_data = { - .rows = 8, - .cols = 8, - .keymap = innovator_keymap, -}; - -static struct platform_device innovator_kp_device = { - .name = "omap-keypad", - .id = -1, - .dev = { - .platform_data = &innovator_kp_data, - }, - .num_resources = ARRAY_SIZE(innovator_kp_resources), - .resource = innovator_kp_resources, -}; - - #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 = { { @@ -211,49 +129,11 @@ static struct platform_device innovator1510_smc91x_device = { .resource = innovator1510_smc91x_resources, }; -static struct platform_device innovator1510_lcd_device = { - .name = "lcd_inn1510", - .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 @@ -278,16 +158,9 @@ static struct platform_device innovator1610_smc91x_device = { .resource = innovator1610_smc91x_resources, }; -static struct platform_device innovator1610_lcd_device = { - .name = "inn1610_lcd", - .id = -1, -}; - static struct platform_device *innovator1610_devices[] __initdata = { &innovator_flash_device, &innovator1610_smc91x_device, - &innovator_kp_device, - &innovator1610_lcd_device, }; #endif /* CONFIG_ARCH_OMAP16XX */ @@ -333,6 +206,7 @@ static struct omap_usb_config innovator1510_usb_config __initdata = { }; static struct omap_lcd_config innovator1510_lcd_config __initdata = { + .panel_name = "inn1510", .ctrl_name = "internal", }; #endif @@ -354,6 +228,7 @@ static struct omap_usb_config h2_usb_config __initdata = { }; static struct omap_lcd_config innovator1610_lcd_config __initdata = { + .panel_name = "inn1610", .ctrl_name = "internal", }; #endif @@ -384,8 +259,6 @@ 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 b742261c9..543fa1361 100644 --- a/arch/arm/mach-omap1/board-osk.c +++ b/arch/arm/mach-omap1/board-osk.c @@ -29,7 +29,7 @@ #include #include #include -#include +#include #include #include @@ -45,8 +45,6 @@ #include #include #include -#include -#include static struct mtd_partition osk_partitions[] = { /* bootloader (U-Boot, etc) in first sector */ @@ -135,40 +133,9 @@ static struct platform_device osk5912_cf_device = { .resource = osk5912_cf_resources, }; -#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 = "OSK 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 osk5912_mcbsp1_device = { - .name = "omap_alsa_mcbsp", - .id = 1, - .dev = { - .platform_data = &alsa_config, - }, + .name = "omap_mcbsp", + .id = 1, }; static struct platform_device *osk5912_devices[] __initdata = { @@ -229,100 +196,19 @@ 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 = { + .panel_name = "osk", .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) @@ -333,18 +219,14 @@ osk_mistral_wake_interrupt(int irq, void *ignored, struct pt_regs *regs) static void __init osk_mistral_init(void) { - /* NOTE: we could actually tell if there's a Mistral board + /* 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 * attached, e.g. by trying to read something from the ads7846. - * But this arch_init() code is too early for that, since we - * can't talk to the ads or even the i2c eeprom. + * But this is too early for that... */ - // 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) { @@ -357,7 +239,7 @@ static void __init osk_mistral_init(void) */ ret = request_irq(OMAP_GPIO_IRQ(OMAP_MPUIO(2)), &osk_mistral_wake_interrupt, - IRQF_SHARED, "mistral_wakeup", + SA_SHIRQ, "mistral_wakeup", &osk_mistral_wake_interrupt); if (ret != 0) { omap_free_gpio(OMAP_MPUIO(2)); @@ -368,25 +250,13 @@ 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) { } #endif -#define EMIFS_CS3_VAL (0x88013141) - static void __init osk_init(void) { - /* Workaround for wrong CS3 (NOR flash) timing - * There are some U-Boot versions out there which configure - * wrong CS3 memory timings. This mainly leads to CRC - * or similiar errors if you use NOR flash (e.g. with JFFS2) - */ - if (EMIFS_CCS(3) != EMIFS_CS3_VAL) - EMIFS_CCS(3) = EMIFS_CS3_VAL; - osk_flash_resource.end = osk_flash_resource.start = omap_cs3_phys(); osk_flash_resource.end += SZ_32M - 1; platform_add_devices(osk5912_devices, ARRAY_SIZE(osk5912_devices)); diff --git a/arch/arm/mach-omap1/board-palmte.c b/arch/arm/mach-omap1/board-palmte.c index 4bc8a6290..e488f7236 100644 --- a/arch/arm/mach-omap1/board-palmte.c +++ b/arch/arm/mach-omap1/board-palmte.c @@ -38,15 +38,6 @@ static void __init omap_generic_init_irq(void) omap_init_irq(); } -static struct platform_device palmte_lcd_device = { - .name = "lcd_palmte", - .id = -1, -}; - -static struct platform_device *devices[] __initdata = { - &palmte_lcd_device, -}; - static struct omap_usb_config palmte_usb_config __initdata = { .register_dev = 1, .hmc_mode = 0, @@ -64,6 +55,7 @@ static struct omap_mmc_config palmte_mmc_config __initdata = { }; static struct omap_lcd_config palmte_lcd_config __initdata = { + .panel_name = "palmte", .ctrl_name = "internal", }; @@ -77,8 +69,6 @@ static void __init omap_generic_init(void) { omap_board_config = palmte_config; omap_board_config_size = ARRAY_SIZE(palmte_config); - - platform_add_devices(devices, ARRAY_SIZE(devices)); } static void __init omap_generic_map_io(void) diff --git a/arch/arm/mach-omap1/board-perseus2.c b/arch/arm/mach-omap1/board-perseus2.c index 64b45d8ae..3913a3cc0 100644 --- a/arch/arm/mach-omap1/board-perseus2.c +++ b/arch/arm/mach-omap1/board-perseus2.c @@ -16,9 +16,7 @@ #include #include #include -#include #include -#include #include #include @@ -30,44 +28,9 @@ #include #include #include -#include #include #include -static int p2_keymap[] = { - KEY(0,0,KEY_UP), - KEY(0,1,KEY_RIGHT), - KEY(0,2,KEY_LEFT), - KEY(0,3,KEY_DOWN), - KEY(0,4,KEY_CENTER), - KEY(0,5,KEY_0_5), - KEY(1,0,KEY_SOFT2), - KEY(1,1,KEY_SEND), - KEY(1,2,KEY_END), - KEY(1,3,KEY_VOLUMEDOWN), - KEY(1,4,KEY_VOLUMEUP), - KEY(1,5,KEY_RECORD), - KEY(2,0,KEY_SOFT1), - KEY(2,1,KEY_3), - KEY(2,2,KEY_6), - KEY(2,3,KEY_9), - KEY(2,4,KEY_SHARP), - KEY(2,5,KEY_2_5), - KEY(3,0,KEY_BACK), - KEY(3,1,KEY_2), - KEY(3,2,KEY_5), - KEY(3,3,KEY_8), - KEY(3,4,KEY_0), - KEY(3,5,KEY_HEADSETHOOK), - KEY(4,0,KEY_HOME), - KEY(4,1,KEY_1), - KEY(4,2,KEY_4), - KEY(4,3,KEY_7), - KEY(4,4,KEY_STAR), - KEY(4,5,KEY_POWER), - 0 -}; - static struct resource smc91x_resources[] = { [0] = { .start = H2P2_DBG_FPGA_ETHR_START, /* Physical */ @@ -81,7 +44,7 @@ static struct resource smc91x_resources[] = { }, }; -static struct mtd_partition nor_partitions[] = { +static struct mtd_partition p2_partitions[] = { /* bootloader (U-Boot, etc) in first sector */ { .name = "bootloader", @@ -112,47 +75,27 @@ static struct mtd_partition nor_partitions[] = { }, }; -static struct flash_platform_data nor_data = { +static struct flash_platform_data p2_flash_data = { .map_name = "cfi_probe", .width = 2, - .parts = nor_partitions, - .nr_parts = ARRAY_SIZE(nor_partitions), + .parts = p2_partitions, + .nr_parts = ARRAY_SIZE(p2_partitions), }; -static struct resource nor_resource = { +static struct resource p2_flash_resource = { .start = OMAP_CS0_PHYS, .end = OMAP_CS0_PHYS + SZ_32M - 1, .flags = IORESOURCE_MEM, }; -static struct platform_device nor_device = { +static struct platform_device p2_flash_device = { .name = "omapflash", .id = 0, .dev = { - .platform_data = &nor_data, - }, - .num_resources = 1, - .resource = &nor_resource, -}; - -static struct nand_platform_data nand_data = { - .options = NAND_SAMSUNG_LP_OPTIONS, -}; - -static struct resource nand_resource = { - .start = OMAP_CS3_PHYS, - .end = OMAP_CS3_PHYS + SZ_4K - 1, - .flags = IORESOURCE_MEM, -}; - -static struct platform_device nand_device = { - .name = "omapnand", - .id = 0, - .dev = { - .platform_data = &nand_data, + .platform_data = &p2_flash_data, }, .num_resources = 1, - .resource = &nand_resource, + .resource = &p2_flash_resource, }; static struct platform_device smc91x_device = { @@ -162,55 +105,17 @@ static struct platform_device smc91x_device = { .resource = smc91x_resources, }; -static struct resource kp_resources[] = { - [0] = { - .start = INT_730_MPUIO_KEYPAD, - .end = INT_730_MPUIO_KEYPAD, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct omap_kp_platform_data kp_data = { - .rows = 8, - .cols = 8, - .keymap = p2_keymap, -}; - -static struct platform_device kp_device = { - .name = "omap-keypad", - .id = -1, - .dev = { - .platform_data = &kp_data, - }, - .num_resources = ARRAY_SIZE(kp_resources), - .resource = kp_resources, -}; - -static struct platform_device lcd_device = { - .name = "lcd_p2", - .id = -1, -}; - static struct platform_device *devices[] __initdata = { - &nor_device, - &nand_device, + &p2_flash_device, &smc91x_device, - &kp_device, - &lcd_device, }; -#define P2_NAND_RB_GPIO_PIN 62 - -static int nand_dev_ready(struct nand_platform_data *data) -{ - return omap_get_gpio_datain(P2_NAND_RB_GPIO_PIN); -} - static struct omap_uart_config perseus2_uart_config __initdata = { .enabled_uarts = ((1 << 0) | (1 << 1)), }; static struct omap_lcd_config perseus2_lcd_config __initdata = { + .panel_name = "p2", .ctrl_name = "internal", }; @@ -221,13 +126,7 @@ static struct omap_board_config_kernel perseus2_config[] = { static void __init omap_perseus2_init(void) { - if (!(omap_request_gpio(P2_NAND_RB_GPIO_PIN))) - nand_data.dev_ready = nand_dev_ready; - - omap_cfg_reg(L3_1610_FLASH_CS2B_OE); - omap_cfg_reg(M8_1610_FLASH_CS2B_WE); - - platform_add_devices(devices, ARRAY_SIZE(devices)); + (void) platform_add_devices(devices, ARRAY_SIZE(devices)); omap_board_config = perseus2_config; omap_board_config_size = ARRAY_SIZE(perseus2_config); diff --git a/arch/arm/mach-omap1/board-voiceblue.c b/arch/arm/mach-omap1/board-voiceblue.c index 447a586eb..bfd5fdd1a 100644 --- a/arch/arm/mach-omap1/board-voiceblue.c +++ b/arch/arm/mach-omap1/board-voiceblue.c @@ -155,9 +155,9 @@ static struct omap_uart_config voiceblue_uart_config __initdata = { }; static struct omap_board_config_kernel voiceblue_config[] = { - { OMAP_TAG_USB, &voiceblue_usb_config }, - { OMAP_TAG_MMC, &voiceblue_mmc_config }, - { OMAP_TAG_UART, &voiceblue_uart_config }, + { OMAP_TAG_USB, &voiceblue_usb_config }, + { OMAP_TAG_MMC, &voiceblue_mmc_config }, + { OMAP_TAG_UART, &voiceblue_uart_config }, }; static void __init voiceblue_init_irq(void) diff --git a/arch/arm/mach-omap1/clock.c b/arch/arm/mach-omap1/clock.c index f1958e882..75110ba10 100644 --- a/arch/arm/mach-omap1/clock.c +++ b/arch/arm/mach-omap1/clock.c @@ -1,4 +1,3 @@ -//kernel/linux-omap-fsample/arch/arm/mach-omap1/clock.c#2 - edit change 3808 (text) /* * linux/arch/arm/mach-omap1/clock.c * @@ -21,7 +20,6 @@ #include -#include #include #include #include @@ -272,12 +270,8 @@ 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) */ - 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); + omap_sram_reprogram_clock(ptr->dpllctl_val, ptr->ckctl_val); ck_dpll1.rate = ptr->pll_rate; propagate_rate(&ck_dpll1); @@ -351,7 +345,7 @@ static unsigned calc_ext_dsor(unsigned long rate) */ for (dsor = 2; dsor < 96; ++dsor) { if ((dsor & 1) && dsor > 8) - continue; + continue; if (rate >= 96000000 / dsor) break; } @@ -693,11 +687,6 @@ int __init omap1_clk_init(void) clk_register(*clkp); continue; } - - if (((*clkp)->flags &CLOCK_IN_OMAP310) && cpu_is_omap310()) { - clk_register(*clkp); - continue; - } } info = omap_get_config(OMAP_TAG_CLOCK, struct omap_clock_config); @@ -754,7 +743,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(cpu_is_omap730() ? 0x3005 : 0x1005, ARM_CKCTL); + omap_writew(0x1005, ARM_CKCTL); ck_dpll1.rate = 60000000; propagate_rate(&ck_dpll1); } @@ -767,17 +756,13 @@ int __init omap1_clk_init(void) ck_dpll1.rate / 1000000, (ck_dpll1.rate / 100000) % 10, arm_ck.rate / 1000000, (arm_ck.rate / 100000) % 10); -#if defined(CONFIG_MACH_OMAP_PERSEUS2) || defined(CONFIG_MACH_OMAP_FSAMPLE) +#ifdef CONFIG_MACH_OMAP_PERSEUS2 /* 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 */ - /* (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); + omap_writew(omap_readw(ARM_CKCTL) & 0x0fff, ARM_CKCTL); /* Put DSP/MPUI into reset until needed */ omap_writew(0, ARM_RSTCT1); @@ -799,7 +784,7 @@ int __init omap1_clk_init(void) clk_enable(&armxor_ck.clk); clk_enable(&armtim_ck.clk); /* This should be done by timer code */ - if (cpu_is_omap15xx()) + if (cpu_is_omap1510()) clk_enable(&arm_gpio_ck); return 0; diff --git a/arch/arm/mach-omap1/clock.h b/arch/arm/mach-omap1/clock.h index b7c68819c..4f18d1b94 100644 --- a/arch/arm/mach-omap1/clock.h +++ b/arch/arm/mach-omap1/clock.h @@ -151,7 +151,7 @@ static struct clk ck_ref = { .name = "ck_ref", .rate = 12000000, .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX | - CLOCK_IN_OMAP310 | ALWAYS_ENABLED, + ALWAYS_ENABLED, .enable = &omap1_clk_enable_generic, .disable = &omap1_clk_disable_generic, }; @@ -160,7 +160,7 @@ static struct clk ck_dpll1 = { .name = "ck_dpll1", .parent = &ck_ref, .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX | - CLOCK_IN_OMAP310 | RATE_PROPAGATES | ALWAYS_ENABLED, + RATE_PROPAGATES | ALWAYS_ENABLED, .enable = &omap1_clk_enable_generic, .disable = &omap1_clk_disable_generic, }; @@ -183,8 +183,7 @@ static struct clk arm_ck = { .name = "arm_ck", .parent = &ck_dpll1, .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX | - CLOCK_IN_OMAP310 | RATE_CKCTL | RATE_PROPAGATES | - ALWAYS_ENABLED, + RATE_CKCTL | RATE_PROPAGATES | ALWAYS_ENABLED, .rate_offset = CKCTL_ARMDIV_OFFSET, .recalc = &omap1_ckctl_recalc, .enable = &omap1_clk_enable_generic, @@ -196,8 +195,7 @@ static struct arm_idlect1_clk armper_ck = { .name = "armper_ck", .parent = &ck_dpll1, .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX | - CLOCK_IN_OMAP310 | RATE_CKCTL | - CLOCK_IDLE_CONTROL, + RATE_CKCTL | CLOCK_IDLE_CONTROL, .enable_reg = (void __iomem *)ARM_IDLECT2, .enable_bit = EN_PERCK, .rate_offset = CKCTL_PERDIV_OFFSET, @@ -211,7 +209,7 @@ static struct arm_idlect1_clk armper_ck = { static struct clk arm_gpio_ck = { .name = "arm_gpio_ck", .parent = &ck_dpll1, - .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP310, + .flags = CLOCK_IN_OMAP1510, .enable_reg = (void __iomem *)ARM_IDLECT2, .enable_bit = EN_GPIOCK, .recalc = &followparent_recalc, @@ -224,7 +222,7 @@ static struct arm_idlect1_clk armxor_ck = { .name = "armxor_ck", .parent = &ck_ref, .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX | - CLOCK_IN_OMAP310 | CLOCK_IDLE_CONTROL, + CLOCK_IDLE_CONTROL, .enable_reg = (void __iomem *)ARM_IDLECT2, .enable_bit = EN_XORPCK, .recalc = &followparent_recalc, @@ -239,7 +237,7 @@ static struct arm_idlect1_clk armtim_ck = { .name = "armtim_ck", .parent = &ck_ref, .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX | - CLOCK_IN_OMAP310 | CLOCK_IDLE_CONTROL, + CLOCK_IDLE_CONTROL, .enable_reg = (void __iomem *)ARM_IDLECT2, .enable_bit = EN_TIMCK, .recalc = &followparent_recalc, @@ -254,7 +252,7 @@ static struct arm_idlect1_clk armwdt_ck = { .name = "armwdt_ck", .parent = &ck_ref, .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX | - CLOCK_IN_OMAP310 | CLOCK_IDLE_CONTROL, + CLOCK_IDLE_CONTROL, .enable_reg = (void __iomem *)ARM_IDLECT2, .enable_bit = EN_WDTCK, .recalc = &omap1_watchdog_recalc, @@ -346,9 +344,9 @@ static struct arm_idlect1_clk tc_ck = { .name = "tc_ck", .parent = &ck_dpll1, .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX | - CLOCK_IN_OMAP730 | CLOCK_IN_OMAP310 | - RATE_CKCTL | RATE_PROPAGATES | - ALWAYS_ENABLED | CLOCK_IDLE_CONTROL, + CLOCK_IN_OMAP730 | RATE_CKCTL | + RATE_PROPAGATES | ALWAYS_ENABLED | + CLOCK_IDLE_CONTROL, .rate_offset = CKCTL_TCDIV_OFFSET, .recalc = &omap1_ckctl_recalc, .enable = &omap1_clk_enable_generic, @@ -360,8 +358,7 @@ static struct arm_idlect1_clk tc_ck = { static struct clk arminth_ck1510 = { .name = "arminth_ck", .parent = &tc_ck.clk, - .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP310 | - ALWAYS_ENABLED, + .flags = CLOCK_IN_OMAP1510 | ALWAYS_ENABLED, .recalc = &followparent_recalc, /* Note: On 1510 the frequency follows TC_CK * @@ -375,8 +372,7 @@ static struct clk tipb_ck = { /* No-idle controlled by "tc_ck" */ .name = "tibp_ck", .parent = &tc_ck.clk, - .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP310 | - ALWAYS_ENABLED, + .flags = CLOCK_IN_OMAP1510 | ALWAYS_ENABLED, .recalc = &followparent_recalc, .enable = &omap1_clk_enable_generic, .disable = &omap1_clk_disable_generic, @@ -421,7 +417,7 @@ static struct clk dma_ck = { .name = "dma_ck", .parent = &tc_ck.clk, .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX | - CLOCK_IN_OMAP310 | ALWAYS_ENABLED, + ALWAYS_ENABLED, .recalc = &followparent_recalc, .enable = &omap1_clk_enable_generic, .disable = &omap1_clk_disable_generic, @@ -441,7 +437,7 @@ static struct arm_idlect1_clk api_ck = { .name = "api_ck", .parent = &tc_ck.clk, .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX | - CLOCK_IN_OMAP310 | CLOCK_IDLE_CONTROL, + CLOCK_IDLE_CONTROL, .enable_reg = (void __iomem *)ARM_IDLECT2, .enable_bit = EN_APICK, .recalc = &followparent_recalc, @@ -455,8 +451,7 @@ static struct arm_idlect1_clk lb_ck = { .clk = { .name = "lb_ck", .parent = &tc_ck.clk, - .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP310 | - CLOCK_IDLE_CONTROL, + .flags = CLOCK_IN_OMAP1510 | CLOCK_IDLE_CONTROL, .enable_reg = (void __iomem *)ARM_IDLECT2, .enable_bit = EN_LBCK, .recalc = &followparent_recalc, @@ -500,8 +495,8 @@ static struct arm_idlect1_clk lcd_ck_1510 = { .clk = { .name = "lcd_ck", .parent = &ck_dpll1, - .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP310 | - RATE_CKCTL | CLOCK_IDLE_CONTROL, + .flags = CLOCK_IN_OMAP1510 | RATE_CKCTL | + CLOCK_IDLE_CONTROL, .enable_reg = (void __iomem *)ARM_IDLECT2, .enable_bit = EN_LCDCK, .rate_offset = CKCTL_LCDDIV_OFFSET, @@ -517,9 +512,8 @@ static struct clk uart1_1510 = { /* Direct from ULPD, no real parent */ .parent = &armper_ck.clk, .rate = 12000000, - .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP310 | - ENABLE_REG_32BIT | ALWAYS_ENABLED | - CLOCK_NO_IDLE_PARENT, + .flags = CLOCK_IN_OMAP1510 | ENABLE_REG_32BIT | + ALWAYS_ENABLED | CLOCK_NO_IDLE_PARENT, .enable_reg = (void __iomem *)MOD_CONF_CTRL_0, .enable_bit = 29, /* Chooses between 12MHz and 48MHz */ .set_rate = &omap1_set_uart_rate, @@ -550,8 +544,8 @@ static struct clk uart2_ck = { .parent = &armper_ck.clk, .rate = 12000000, .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX | - CLOCK_IN_OMAP310 | ENABLE_REG_32BIT | - ALWAYS_ENABLED | CLOCK_NO_IDLE_PARENT, + ENABLE_REG_32BIT | ALWAYS_ENABLED | + CLOCK_NO_IDLE_PARENT, .enable_reg = (void __iomem *)MOD_CONF_CTRL_0, .enable_bit = 30, /* Chooses between 12MHz and 48MHz */ .set_rate = &omap1_set_uart_rate, @@ -565,9 +559,8 @@ static struct clk uart3_1510 = { /* Direct from ULPD, no real parent */ .parent = &armper_ck.clk, .rate = 12000000, - .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP310 | - ENABLE_REG_32BIT | ALWAYS_ENABLED | - CLOCK_NO_IDLE_PARENT, + .flags = CLOCK_IN_OMAP1510 | ENABLE_REG_32BIT | + ALWAYS_ENABLED | CLOCK_NO_IDLE_PARENT, .enable_reg = (void __iomem *)MOD_CONF_CTRL_0, .enable_bit = 31, /* Chooses between 12MHz and 48MHz */ .set_rate = &omap1_set_uart_rate, @@ -597,7 +590,7 @@ static struct clk usb_clko = { /* 6 MHz output on W4_USB_CLKO */ /* Direct from ULPD, no parent */ .rate = 6000000, .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX | - CLOCK_IN_OMAP310 | RATE_FIXED | ENABLE_REG_32BIT, + RATE_FIXED | ENABLE_REG_32BIT, .enable_reg = (void __iomem *)ULPD_CLOCK_CTRL, .enable_bit = USB_MCLK_EN_BIT, .enable = &omap1_clk_enable_generic, @@ -608,7 +601,7 @@ static struct clk usb_hhc_ck1510 = { .name = "usb_hhc_ck", /* Direct from ULPD, no parent */ .rate = 48000000, /* Actually 2 clocks, 12MHz and 48MHz */ - .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP310 | + .flags = CLOCK_IN_OMAP1510 | RATE_FIXED | ENABLE_REG_32BIT, .enable_reg = (void __iomem *)MOD_CONF_CTRL_0, .enable_bit = USB_HOST_HHC_UHOST_EN, @@ -644,9 +637,7 @@ static struct clk mclk_1510 = { .name = "mclk", /* Direct from ULPD, no parent. May be enabled by ext hardware. */ .rate = 12000000, - .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP310 | RATE_FIXED, - .enable_reg = (void __iomem *)SOFT_REQ_REG, - .enable_bit = 6, + .flags = CLOCK_IN_OMAP1510 | RATE_FIXED, .enable = &omap1_clk_enable_generic, .disable = &omap1_clk_disable_generic, }; @@ -668,7 +659,7 @@ static struct clk bclk_1510 = { .name = "bclk", /* Direct from ULPD, no parent. May be enabled by ext hardware. */ .rate = 12000000, - .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP310 | RATE_FIXED, + .flags = CLOCK_IN_OMAP1510 | RATE_FIXED, .enable = &omap1_clk_enable_generic, .disable = &omap1_clk_disable_generic, }; @@ -687,14 +678,12 @@ static struct clk bclk_16xx = { }; static struct clk mmc1_ck = { - .name = "mmc_ck", - .id = 1, + .name = "mmc1_ck", /* Functional clock is direct from ULPD, interface clock is ARMPER */ .parent = &armper_ck.clk, .rate = 48000000, .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX | - CLOCK_IN_OMAP310 | RATE_FIXED | ENABLE_REG_32BIT | - CLOCK_NO_IDLE_PARENT, + RATE_FIXED | ENABLE_REG_32BIT | CLOCK_NO_IDLE_PARENT, .enable_reg = (void __iomem *)MOD_CONF_CTRL_0, .enable_bit = 23, .enable = &omap1_clk_enable_generic, @@ -702,8 +691,7 @@ static struct clk mmc1_ck = { }; static struct clk mmc2_ck = { - .name = "mmc_ck", - .id = 2, + .name = "mmc2_ck", /* Functional clock is direct from ULPD, interface clock is ARMPER */ .parent = &armper_ck.clk, .rate = 48000000, @@ -718,7 +706,7 @@ static struct clk mmc2_ck = { static struct clk virtual_ck_mpu = { .name = "mpu", .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX | - CLOCK_IN_OMAP310 | VIRTUAL_CLOCK | ALWAYS_ENABLED, + VIRTUAL_CLOCK | ALWAYS_ENABLED, .parent = &arm_ck, /* Is smarter alias for */ .recalc = &followparent_recalc, .set_rate = &omap1_select_table_rate, @@ -727,20 +715,6 @@ static struct clk virtual_ck_mpu = { .disable = &omap1_clk_disable_generic, }; -/* virtual functional clock domain for I2C. Just for making sure that ARMXOR_CK -remains active during MPU idle whenever this is enabled */ -static struct clk i2c_fck = { - .name = "i2c_fck", - .id = 1, - .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX | - VIRTUAL_CLOCK | CLOCK_NO_IDLE_PARENT | - ALWAYS_ENABLED, - .parent = &armxor_ck.clk, - .recalc = &followparent_recalc, - .enable = &omap1_clk_enable_generic, - .disable = &omap1_clk_disable_generic, -}; - static struct clk * onchip_clks[] = { /* non-ULPD clocks */ &ck_ref, @@ -789,7 +763,6 @@ static struct clk * onchip_clks[] = { &mmc2_ck, /* Virtual clocks */ &virtual_ck_mpu, - &i2c_fck, }; #endif diff --git a/arch/arm/mach-omap1/devices.c b/arch/arm/mach-omap1/devices.c index a611c3b63..ecbc47514 100644 --- a/arch/arm/mach-omap1/devices.c +++ b/arch/arm/mach-omap1/devices.c @@ -9,6 +9,7 @@ * (at your option) any later version. */ +#include #include #include #include @@ -24,6 +25,10 @@ #include #include +extern void omap_nop_release(struct device *dev); + +/*-------------------------------------------------------------------------*/ + #if defined(CONFIG_OMAP1610_IR) || defined(CONFIG_OMAP161O_IR_MODULE) static u64 irda_dmamask = 0xffffffff; @@ -32,6 +37,7 @@ static struct platform_device omap1610ir_device = { .name = "omap1610-ir", .id = -1, .dev = { + .release = omap_nop_release, .dma_mask = &irda_dmamask, }, }; @@ -78,6 +84,9 @@ static struct resource rtc_resources[] = { static struct platform_device omap_rtc_device = { .name = "omap_rtc", .id = -1, + .dev = { + .release = omap_nop_release, + }, .num_resources = ARRAY_SIZE(rtc_resources), .resource = rtc_resources, }; @@ -90,42 +99,6 @@ static void omap_init_rtc(void) static inline void omap_init_rtc(void) {} #endif -#if defined(CONFIG_OMAP_STI) - -#define OMAP1_STI_BASE IO_ADDRESS(0xfffea000) -#define OMAP1_STI_CHANNEL_BASE (OMAP1_STI_BASE + 0x400) - -static struct resource sti_resources[] = { - { - .start = OMAP1_STI_BASE, - .end = OMAP1_STI_BASE + SZ_1K - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = OMAP1_STI_CHANNEL_BASE, - .end = OMAP1_STI_CHANNEL_BASE + SZ_1K - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = INT_1610_STI, - .flags = IORESOURCE_IRQ, - } -}; - -static struct platform_device sti_device = { - .name = "sti", - .id = -1, - .num_resources = ARRAY_SIZE(sti_resources), - .resource = sti_resources, -}; - -static inline void omap_init_sti(void) -{ - platform_device_register(&sti_device); -} -#else -static inline void omap_init_sti(void) {} -#endif /*-------------------------------------------------------------------------*/ @@ -156,7 +129,6 @@ static int __init omap1_init_devices(void) */ omap_init_irda(); omap_init_rtc(); - omap_init_sti(); return 0; } diff --git a/arch/arm/mach-omap1/fpga.c b/arch/arm/mach-omap1/fpga.c index efe9bfc6e..aca2a1208 100644 --- a/arch/arm/mach-omap1/fpga.c +++ b/arch/arm/mach-omap1/fpga.c @@ -16,6 +16,7 @@ * published by the Free Software Foundation. */ +#include #include #include #include @@ -106,16 +107,14 @@ void innovator_fpga_IRQ_demux(unsigned int irq, struct irqdesc *desc, } } -static struct irq_chip omap_fpga_irq_ack = { - .name = "FPGA-ack", +static struct irqchip omap_fpga_irq_ack = { .ack = fpga_mask_ack_irq, .mask = fpga_mask_irq, .unmask = fpga_unmask_irq, }; -static struct irq_chip omap_fpga_irq = { - .name = "FPGA", +static struct irqchip omap_fpga_irq = { .ack = fpga_ack_irq, .mask = fpga_mask_irq, .unmask = fpga_unmask_irq, @@ -135,7 +134,7 @@ static struct irq_chip 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 IRQF_DISABLED flag, which leaves all + * interrupt is installed with the SA_INTERRUPT 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 da13c3e82..5c637c048 100644 --- a/arch/arm/mach-omap1/id.c +++ b/arch/arm/mach-omap1/id.c @@ -11,6 +11,7 @@ * 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 fab8b0b27..82d556be7 100644 --- a/arch/arm/mach-omap1/io.c +++ b/arch/arm/mach-omap1/io.c @@ -8,6 +8,7 @@ * published by the Free Software Foundation. */ +#include #include #include #include @@ -17,7 +18,6 @@ #include #include #include -#include extern int omap1_clk_init(void); extern void omap_check_revision(void); @@ -110,7 +110,7 @@ void __init omap1_map_common_io(void) } #endif #ifdef CONFIG_ARCH_OMAP15XX - if (cpu_is_omap15xx()) { + if (cpu_is_omap1510()) { iotable_init(omap1510_io_desc, ARRAY_SIZE(omap1510_io_desc)); } #endif @@ -121,7 +121,6 @@ void __init omap1_map_common_io(void) #endif omap_sram_init(); - omapfb_reserve_mem(); } /* diff --git a/arch/arm/mach-omap1/irq.c b/arch/arm/mach-omap1/irq.c index 3ea140bb9..ed65a7d2e 100644 --- a/arch/arm/mach-omap1/irq.c +++ b/arch/arm/mach-omap1/irq.c @@ -36,6 +36,7 @@ * 675 Mass Ave, Cambridge, MA 02139, USA. */ +#include #include #include #include @@ -59,7 +60,7 @@ struct omap_irq_bank { unsigned long wake_enable; }; -static unsigned int irq_bank_count; +static unsigned int irq_bank_count = 0; static struct omap_irq_bank *irq_banks; static inline unsigned int irq_bank_readl(int bank, int offset) @@ -141,35 +142,34 @@ static void omap_irq_set_cfg(int irq, int fiq, int priority, int trigger) #ifdef CONFIG_ARCH_OMAP730 static struct omap_irq_bank omap730_irq_banks[] = { - { .base_reg = OMAP_IH1_BASE, .trigger_map = 0xb3f8e22f }, - { .base_reg = OMAP_IH2_BASE, .trigger_map = 0xfdb9c1f2 }, + { .base_reg = OMAP_IH1_BASE, .trigger_map = 0xb3f8e22f }, + { .base_reg = OMAP_IH2_BASE, .trigger_map = 0xfdb9c1f2 }, { .base_reg = OMAP_IH2_BASE + 0x100, .trigger_map = 0x800040f3 }, }; #endif #ifdef CONFIG_ARCH_OMAP15XX static struct omap_irq_bank omap1510_irq_banks[] = { - { .base_reg = OMAP_IH1_BASE, .trigger_map = 0xb3febfff }, - { .base_reg = OMAP_IH2_BASE, .trigger_map = 0xffbfffed }, + { .base_reg = OMAP_IH1_BASE, .trigger_map = 0xb3febfff }, + { .base_reg = OMAP_IH2_BASE, .trigger_map = 0xffbfffed }, }; static struct omap_irq_bank omap310_irq_banks[] = { - { .base_reg = OMAP_IH1_BASE, .trigger_map = 0xb3faefc3 }, - { .base_reg = OMAP_IH2_BASE, .trigger_map = 0x65b3c061 }, + { .base_reg = OMAP_IH1_BASE, .trigger_map = 0xb3faefc3 }, + { .base_reg = OMAP_IH2_BASE, .trigger_map = 0x65b3c061 }, }; #endif #if defined(CONFIG_ARCH_OMAP16XX) static struct omap_irq_bank omap1610_irq_banks[] = { - { .base_reg = OMAP_IH1_BASE, .trigger_map = 0xb3fefe8f }, - { .base_reg = OMAP_IH2_BASE, .trigger_map = 0xfdb7c1fd }, + { .base_reg = OMAP_IH1_BASE, .trigger_map = 0xb3fefe8f }, + { .base_reg = OMAP_IH2_BASE, .trigger_map = 0xfdb7c1fd }, { .base_reg = OMAP_IH2_BASE + 0x100, .trigger_map = 0xffffb7ff }, { .base_reg = OMAP_IH2_BASE + 0x200, .trigger_map = 0xffffffff }, }; #endif -static struct irq_chip omap_irq_chip = { - .name = "MPU", +static struct irqchip omap_irq_chip = { .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 8976fbb21..650650815 100644 --- a/arch/arm/mach-omap1/leds-h2p2-debug.c +++ b/arch/arm/mach-omap1/leds-h2p2-debug.c @@ -9,6 +9,7 @@ * 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 a0cd001ac..c8ffd1ddc 100644 --- a/arch/arm/mach-omap1/leds-innovator.c +++ b/arch/arm/mach-omap1/leds-innovator.c @@ -1,6 +1,7 @@ /* * 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 3b29e59b0..2c8bda847 100644 --- a/arch/arm/mach-omap1/leds-osk.c +++ b/arch/arm/mach-omap1/leds-osk.c @@ -3,6 +3,7 @@ * * 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 fa74ef7af..d4b8d624e 100644 --- a/arch/arm/mach-omap1/mux.c +++ b/arch/arm/mach-omap1/mux.c @@ -22,6 +22,7 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ +#include #include #include #include @@ -34,20 +35,16 @@ #ifdef CONFIG_ARCH_OMAP730 struct pin_config __initdata_or_module omap730_pins[] = { -MUX_CFG_730("E2_730_KBR0", 12, 21, 0, 20, 1, 0) -MUX_CFG_730("J7_730_KBR1", 12, 25, 0, 24, 1, 0) -MUX_CFG_730("E1_730_KBR2", 12, 29, 0, 28, 1, 0) -MUX_CFG_730("F3_730_KBR3", 13, 1, 0, 0, 1, 0) -MUX_CFG_730("D2_730_KBR4", 13, 5, 0, 4, 1, 0) -MUX_CFG_730("C2_730_KBC0", 13, 9, 0, 8, 1, 0) -MUX_CFG_730("D3_730_KBC1", 13, 13, 0, 12, 1, 0) -MUX_CFG_730("E4_730_KBC2", 13, 17, 0, 16, 1, 0) -MUX_CFG_730("F4_730_KBC3", 13, 21, 0, 20, 1, 0) -MUX_CFG_730("E3_730_KBC4", 13, 25, 0, 24, 1, 0) - -MUX_CFG_730("AA17_730_USB_DM", 2, 21, 0, 20, 0, 0) -MUX_CFG_730("W16_730_USB_PU_EN", 2, 25, 0, 24, 0, 0) -MUX_CFG_730("W17_730_USB_VBUSI", 2, 29, 0, 28, 0, 0) +MUX_CFG_730("E2_730_KBR0", 12, 21, 0, 0, 20, 1, NA, 0, 0) +MUX_CFG_730("J7_730_KBR1", 12, 25, 0, 0, 24, 1, NA, 0, 0) +MUX_CFG_730("E1_730_KBR2", 12, 29, 0, 0, 28, 1, NA, 0, 0) +MUX_CFG_730("F3_730_KBR3", 13, 1, 0, 0, 0, 1, NA, 0, 0) +MUX_CFG_730("D2_730_KBR4", 13, 5, 0, 0, 4, 1, NA, 0, 0) +MUX_CFG_730("C2_730_KBC0", 13, 9, 0, 0, 8, 1, NA, 0, 0) +MUX_CFG_730("D3_730_KBC1", 13, 13, 0, 0, 12, 1, NA, 0, 0) +MUX_CFG_730("E4_730_KBC2", 13, 17, 0, 0, 16, 1, NA, 0, 0) +MUX_CFG_730("F4_730_KBC3", 13, 21, 0, 0, 20, 1, NA, 0, 0) +MUX_CFG_730("E3_730_KBC4", 13, 25, 0, 0, 24, 1, NA, 0, 0) }; #endif @@ -76,8 +73,8 @@ MUX_CFG("UART3_BCLK", A, 0, 0, 2, 6, 0, NA, 0, 0) MUX_CFG("Y15_1610_UART3_RTS", A, 0, 1, 2, 6, 0, NA, 0, 0) /* PWT & PWL, conflicts with UART3 */ -MUX_CFG("PWT", 6, 0, 2, 0, 30, 0, NA, 0, 0) -MUX_CFG("PWL", 6, 3, 1, 0, 31, 1, NA, 0, 0) +MUX_CFG("PWT", 6, 0, 2, 0, 30, 0, NA, 0, 0) +MUX_CFG("PWL", 6, 3, 1, 0, 31, 1, NA, 0, 0) /* USB internal master generic */ MUX_CFG("R18_USB_VBUS", 7, 9, 2, 1, 11, 0, NA, 0, 1) @@ -154,7 +151,7 @@ MUX_CFG("MCBSP3_CLKX", 9, 3, 1, 1, 29, 0, NA, 0, 1) /* Misc ballouts */ MUX_CFG("BALLOUT_V8_ARMIO3", B, 18, 0, 2, 25, 1, NA, 0, 1) -MUX_CFG("N20_HDQ", 6, 18, 1, 1, 4, 0, 1, 4, 0) +MUX_CFG("N20_HDQ", 6, 18, 1, 1, 4, 0, 1, 4, 0) /* OMAP-1610 MMC2 */ MUX_CFG("W8_1610_MMC2_DAT0", B, 21, 6, 2, 23, 1, 2, 1, 1) diff --git a/arch/arm/mach-omap1/serial.c b/arch/arm/mach-omap1/serial.c index 976edfb88..e924e0c6a 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 @@ -30,9 +30,9 @@ #include #endif -static struct clk * uart1_ck; -static struct clk * uart2_ck; -static struct clk * uart3_ck; +static struct clk * uart1_ck = NULL; +static struct clk * uart2_ck = NULL; +static struct clk * uart3_ck = NULL; static inline unsigned int omap_serial_in(struct plat_serial8250_port *up, int offset) @@ -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, - IRQF_TRIGGER_RISING, "serial wakeup", NULL); + SA_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/time.c b/arch/arm/mach-omap1/time.c index 4d91b9f51..cdbf4d762 100644 --- a/arch/arm/mach-omap1/time.c +++ b/arch/arm/mach-omap1/time.c @@ -33,6 +33,7 @@ * 675 Mass Ave, Cambridge, MA 02139, USA. */ +#include #include #include #include @@ -50,6 +51,8 @@ struct sys_timer omap_timer; +#ifdef CONFIG_OMAP_MPU_TIMER + /* * --------------------------------------------------------------------------- * MPU timer @@ -93,7 +96,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. */ -#if defined(CONFIG_MACH_OMAP_PERSEUS2) || defined(CONFIG_MACH_OMAP_FSAMPLE) +#ifdef CONFIG_MACH_OMAP_PERSEUS2 /* 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. */ @@ -177,7 +180,7 @@ static irqreturn_t omap_mpu_timer_interrupt(int irq, void *dev_id, static struct irqaction omap_mpu_timer_irq = { .name = "mpu timer", - .flags = IRQF_DISABLED | IRQF_TIMER, + .flags = SA_INTERRUPT | SA_TIMER, .handler = omap_mpu_timer_interrupt, }; @@ -191,7 +194,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 = IRQF_DISABLED, + .flags = SA_INTERRUPT, .handler = omap_mpu_timer1_interrupt, }; @@ -219,6 +222,195 @@ unsigned long long sched_clock(void) return cycles_2_ns(ticks64); } +#endif /* CONFIG_OMAP_MPU_TIMER */ + +#ifdef CONFIG_OMAP_32K_TIMER + +#ifdef CONFIG_ARCH_OMAP15XX +#error OMAP 32KHz timer does not currently work on 15XX! +#endif + +/* + * --------------------------------------------------------------------------- + * 32KHz OS timer + * + * This currently works only on 16xx, as 1510 does not have the continuous + * 32KHz synchronous timer. The 32KHz synchronous timer is used to keep track + * of time in addition to the 32KHz OS timer. Using only the 32KHz OS timer + * on 1510 would be possible, but the timer would not be as accurate as + * with the 32KHz synchronized timer. + * --------------------------------------------------------------------------- + */ +#define OMAP_32K_TIMER_BASE 0xfffb9000 +#define OMAP_32K_TIMER_CR 0x08 +#define OMAP_32K_TIMER_TVR 0x00 +#define OMAP_32K_TIMER_TCR 0x04 + +#define OMAP_32K_TICKS_PER_HZ (32768 / HZ) + +/* + * TRM says 1 / HZ = ( TVR + 1) / 32768, so TRV = (32768 / HZ) - 1 + * so with HZ = 100, TVR = 327.68. + */ +#define OMAP_32K_TIMER_TICK_PERIOD ((32768 / HZ) - 1) +#define TIMER_32K_SYNCHRONIZED 0xfffbc410 + +#define JIFFIES_TO_HW_TICKS(nr_jiffies, clock_rate) \ + (((nr_jiffies) * (clock_rate)) / HZ) + +static inline void omap_32k_timer_write(int val, int reg) +{ + omap_writew(val, reg + OMAP_32K_TIMER_BASE); +} + +static inline unsigned long omap_32k_timer_read(int reg) +{ + return omap_readl(reg + OMAP_32K_TIMER_BASE) & 0xffffff; +} + +/* + * The 32KHz synchronized timer is an additional timer on 16xx. + * It is always running. + */ +static inline unsigned long omap_32k_sync_timer_read(void) +{ + return omap_readl(TIMER_32K_SYNCHRONIZED); +} + +static inline void omap_32k_timer_start(unsigned long load_val) +{ + omap_32k_timer_write(load_val, OMAP_32K_TIMER_TVR); + omap_32k_timer_write(0x0f, OMAP_32K_TIMER_CR); +} + +static inline void omap_32k_timer_stop(void) +{ + omap_32k_timer_write(0x0, OMAP_32K_TIMER_CR); +} + +/* + * Rounds down to nearest usec. Note that this will overflow for larger values. + */ +static inline unsigned long omap_32k_ticks_to_usecs(unsigned long ticks_32k) +{ + return (ticks_32k * 5*5*5*5*5*5) >> 9; +} + +/* + * Rounds down to nearest nsec. + */ +static inline unsigned long long +omap_32k_ticks_to_nsecs(unsigned long ticks_32k) +{ + return (unsigned long long) ticks_32k * 1000 * 5*5*5*5*5*5 >> 9; +} + +static unsigned long omap_32k_last_tick = 0; + +/* + * Returns elapsed usecs since last 32k timer interrupt + */ +static unsigned long omap_32k_timer_gettimeoffset(void) +{ + unsigned long now = omap_32k_sync_timer_read(); + return omap_32k_ticks_to_usecs(now - omap_32k_last_tick); +} + +/* + * Returns current time from boot in nsecs. It's OK for this to wrap + * around for now, as it's just a relative time stamp. + */ +unsigned long long sched_clock(void) +{ + return omap_32k_ticks_to_nsecs(omap_32k_sync_timer_read()); +} + +/* + * Timer interrupt for 32KHz timer. When dynamic tick is enabled, this + * function is also called from other interrupts to remove latency + * issues with dynamic tick. In the dynamic tick case, we need to lock + * with irqsave. + */ +static irqreturn_t omap_32k_timer_interrupt(int irq, void *dev_id, + struct pt_regs *regs) +{ + unsigned long flags; + unsigned long now; + + write_seqlock_irqsave(&xtime_lock, flags); + now = omap_32k_sync_timer_read(); + + while (now - omap_32k_last_tick >= OMAP_32K_TICKS_PER_HZ) { + omap_32k_last_tick += OMAP_32K_TICKS_PER_HZ; + timer_tick(regs); + } + + /* Restart timer so we don't drift off due to modulo or dynamic tick. + * By default we program the next timer to be continuous to avoid + * latencies during high system load. During dynamic tick operation the + * continuous timer can be overridden from pm_idle to be longer. + */ + omap_32k_timer_start(omap_32k_last_tick + OMAP_32K_TICKS_PER_HZ - now); + write_sequnlock_irqrestore(&xtime_lock, flags); + + return IRQ_HANDLED; +} + +#ifdef CONFIG_NO_IDLE_HZ +/* + * Programs the next timer interrupt needed. Called when dynamic tick is + * enabled, and to reprogram the ticks to skip from pm_idle. Note that + * we can keep the timer continuous, and don't need to set it to run in + * one-shot mode. This is because the timer will get reprogrammed again + * after next interrupt. + */ +void omap_32k_timer_reprogram(unsigned long next_tick) +{ + omap_32k_timer_start(JIFFIES_TO_HW_TICKS(next_tick, 32768) + 1); +} + +static struct irqaction omap_32k_timer_irq; +extern struct timer_update_handler timer_update; + +static int omap_32k_timer_enable_dyn_tick(void) +{ + /* No need to reprogram timer, just use the next interrupt */ + return 0; +} + +static int omap_32k_timer_disable_dyn_tick(void) +{ + omap_32k_timer_start(OMAP_32K_TIMER_TICK_PERIOD); + return 0; +} + +static struct dyn_tick_timer omap_dyn_tick_timer = { + .enable = omap_32k_timer_enable_dyn_tick, + .disable = omap_32k_timer_disable_dyn_tick, + .reprogram = omap_32k_timer_reprogram, + .handler = omap_32k_timer_interrupt, +}; +#endif /* CONFIG_NO_IDLE_HZ */ + +static struct irqaction omap_32k_timer_irq = { + .name = "32KHz timer", + .flags = SA_INTERRUPT | SA_TIMER, + .handler = omap_32k_timer_interrupt, +}; + +static __init void omap_init_32k_timer(void) +{ + +#ifdef CONFIG_NO_IDLE_HZ + omap_timer.dyn_tick = &omap_dyn_tick_timer; +#endif + + setup_irq(INT_OS_TIMER, &omap_32k_timer_irq); + omap_timer.offset = omap_32k_timer_gettimeoffset; + omap_32k_last_tick = omap_32k_sync_timer_read(); + omap_32k_timer_start(OMAP_32K_TIMER_TICK_PERIOD); +} +#endif /* CONFIG_OMAP_32K_TIMER */ /* * --------------------------------------------------------------------------- @@ -227,7 +419,13 @@ unsigned long long sched_clock(void) */ static void __init omap_timer_init(void) { +#if defined(CONFIG_OMAP_MPU_TIMER) omap_init_mpu_timer(); +#elif defined(CONFIG_OMAP_32K_TIMER) + omap_init_32k_timer(); +#else +#error No system timer selected in Kconfig! +#endif } struct sys_timer omap_timer = { diff --git a/arch/arm/mach-omap2/Kconfig b/arch/arm/mach-omap2/Kconfig index aab97ccf1..578880943 100644 --- a/arch/arm/mach-omap2/Kconfig +++ b/arch/arm/mach-omap2/Kconfig @@ -8,7 +8,6 @@ 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 @@ -21,6 +20,3 @@ config MACH_OMAP_H4 bool "OMAP 2420 H4 board" depends on ARCH_OMAP2 && ARCH_OMAP24XX -config MACH_OMAP_APOLLON - bool "OMAP 2420 Apollon board" - depends on ARCH_OMAP2 && ARCH_OMAP24XX diff --git a/arch/arm/mach-omap2/Makefile b/arch/arm/mach-omap2/Makefile index 266d88e77..420411664 100644 --- a/arch/arm/mach-omap2/Makefile +++ b/arch/arm/mach-omap2/Makefile @@ -3,16 +3,11 @@ # # 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 gpmc.o +obj-y := irq.o id.o io.o sram-fn.o clock.o mux.o devices.o serial.o obj-$(CONFIG_OMAP_MPU_TIMER) += timer-gp.o -# Power Management -obj-$(CONFIG_PM) += pm.o pm-domain.o sleep.o - # Specific board support obj-$(CONFIG_MACH_OMAP_GENERIC) += board-generic.o obj-$(CONFIG_MACH_OMAP_H4) += board-h4.o -obj-$(CONFIG_MACH_OMAP_APOLLON) += board-apollon.o diff --git a/arch/arm/mach-omap2/board-h4.c b/arch/arm/mach-omap2/board-h4.c index 4933fce76..a300d634d 100644 --- a/arch/arm/mach-omap2/board-h4.c +++ b/arch/arm/mach-omap2/board-h4.c @@ -17,8 +17,6 @@ #include #include #include -#include -#include #include #include @@ -27,57 +25,15 @@ #include #include -#include #include #include -#include #include #include -#include -#include -#include -#include "prcm-regs.h" +#include #include #include -static unsigned int row_gpios[6] = { 88, 89, 124, 11, 6, 96 }; -static unsigned int col_gpios[7] = { 90, 91, 100, 36, 12, 97, 98 }; - -static int h4_keymap[] = { - KEY(0, 0, KEY_LEFT), - KEY(0, 1, KEY_RIGHT), - KEY(0, 2, KEY_A), - KEY(0, 3, KEY_B), - KEY(0, 4, KEY_C), - KEY(1, 0, KEY_DOWN), - KEY(1, 1, KEY_UP), - KEY(1, 2, KEY_E), - KEY(1, 3, KEY_F), - KEY(1, 4, KEY_G), - KEY(2, 0, KEY_ENTER), - KEY(2, 1, KEY_I), - KEY(2, 2, KEY_J), - KEY(2, 3, KEY_K), - KEY(2, 4, KEY_3), - KEY(3, 0, KEY_M), - KEY(3, 1, KEY_N), - KEY(3, 2, KEY_O), - KEY(3, 3, KEY_P), - KEY(3, 4, KEY_Q), - KEY(4, 0, KEY_R), - KEY(4, 1, KEY_4), - KEY(4, 2, KEY_T), - KEY(4, 3, KEY_U), - KEY(4, 4, KEY_ENTER), - KEY(5, 0, KEY_V), - KEY(5, 1, KEY_W), - KEY(5, 2, KEY_L), - KEY(5, 3, KEY_S), - KEY(5, 4, KEY_ENTER), - 0 -}; - static struct mtd_partition h4_partitions[] = { /* bootloader (U-Boot, etc) in first sector */ { @@ -152,123 +108,9 @@ static struct platform_device h4_smc91x_device = { .resource = h4_smc91x_resources, }; -/* Select between the IrDA and aGPS module - */ -static int h4_select_irda(struct device *dev, int state) -{ - unsigned char expa; - int err = 0; - - if ((err = read_gpio_expa(&expa, 0x21))) { - printk(KERN_ERR "Error reading from I/O expander\n"); - return err; - } - - /* 'P6' enable/disable IRDA_TX and IRDA_RX */ - if (state & IR_SEL) { /* IrDa */ - if ((err = write_gpio_expa(expa | 0x01, 0x21))) { - printk(KERN_ERR "Error writing to I/O expander\n"); - return err; - } - } else { - if ((err = write_gpio_expa(expa & ~0x01, 0x21))) { - printk(KERN_ERR "Error writing to I/O expander\n"); - return err; - } - } - return err; -} - -static void set_trans_mode(void *data) -{ - int *mode = data; - unsigned char expa; - int err = 0; - - if ((err = read_gpio_expa(&expa, 0x20)) != 0) { - printk(KERN_ERR "Error reading from I/O expander\n"); - } - - expa &= ~0x01; - - if (!(*mode & IR_SIRMODE)) { /* MIR/FIR */ - expa |= 0x01; - } - - if ((err = write_gpio_expa(expa, 0x20)) != 0) { - printk(KERN_ERR "Error writing to I/O expander\n"); - } -} - -static int h4_transceiver_mode(struct device *dev, int mode) -{ - struct omap_irda_config *irda_config = dev->platform_data; - - cancel_delayed_work(&irda_config->gpio_expa); - PREPARE_WORK(&irda_config->gpio_expa, set_trans_mode, &mode); - schedule_work(&irda_config->gpio_expa); - - return 0; -} - -static struct omap_irda_config h4_irda_data = { - .transceiver_cap = IR_SIRMODE | IR_MIRMODE | IR_FIRMODE, - .transceiver_mode = h4_transceiver_mode, - .select_irda = h4_select_irda, - .rx_channel = OMAP24XX_DMA_UART3_RX, - .tx_channel = OMAP24XX_DMA_UART3_TX, - .dest_start = OMAP_UART3_BASE, - .src_start = OMAP_UART3_BASE, - .tx_trigger = OMAP24XX_DMA_UART3_TX, - .rx_trigger = OMAP24XX_DMA_UART3_RX, -}; - -static struct resource h4_irda_resources[] = { - [0] = { - .start = INT_24XX_UART3_IRQ, - .end = INT_24XX_UART3_IRQ, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct platform_device h4_irda_device = { - .name = "omapirda", - .id = -1, - .dev = { - .platform_data = &h4_irda_data, - }, - .num_resources = 1, - .resource = h4_irda_resources, -}; - -static struct omap_kp_platform_data h4_kp_data = { - .rows = 6, - .cols = 7, - .keymap = h4_keymap, - .rep = 1, - .row_gpios = row_gpios, - .col_gpios = col_gpios, -}; - -static struct platform_device h4_kp_device = { - .name = "omap-keypad", - .id = -1, - .dev = { - .platform_data = &h4_kp_data, - }, -}; - -static struct platform_device h4_lcd_device = { - .name = "lcd_h4", - .id = -1, -}; - static struct platform_device *h4_devices[] __initdata = { &h4_smc91x_device, &h4_flash_device, - &h4_irda_device, - &h4_kp_device, - &h4_lcd_device, }; static inline void __init h4_init_smc91x(void) @@ -315,6 +157,7 @@ static struct omap_mmc_config h4_mmc_config __initdata = { }; static struct omap_lcd_config h4_lcd_config __initdata = { + .panel_name = "h4", .ctrl_name = "internal", }; @@ -331,19 +174,6 @@ static void __init omap_h4_init(void) * You have to mux them off in device drivers later on * if not needed. */ -#if defined(CONFIG_OMAP_IR) || defined(CONFIG_OMAP_IR_MODULE) - omap_cfg_reg(K15_24XX_UART3_TX); - omap_cfg_reg(K14_24XX_UART3_RX); -#endif - -#if defined(CONFIG_KEYBOARD_OMAP) || defined(CONFIG_KEYBOARD_OMAP_MODULE) - if (omap_has_menelaus()) { - row_gpios[5] = 0; - col_gpios[2] = 15; - col_gpios[6] = 18; - } -#endif - platform_add_devices(h4_devices, ARRAY_SIZE(h4_devices)); omap_board_config = h4_config; omap_board_config_size = ARRAY_SIZE(h4_config); diff --git a/arch/arm/mach-omap2/clock.c b/arch/arm/mach-omap2/clock.c index d1b648a4e..180f675c9 100644 --- a/arch/arm/mach-omap2/clock.c +++ b/arch/arm/mach-omap2/clock.c @@ -15,6 +15,7 @@ * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. */ +#include #include #include #include @@ -27,14 +28,14 @@ #include #include +#include -#include "prcm-regs.h" -#include "memory.h" #include "clock.h" //#define DOWN_VARIABLE_DPLL 1 /* Experimental */ static struct prcm_config *curr_prcm_set; +static struct memory_timings mem_timings; static u32 curr_perf_level = PRCM_FULL_SPEED; /*------------------------------------------------------------------------- @@ -53,13 +54,11 @@ static void omap2_sys_clk_recalc(struct clk * clk) static u32 omap2_get_dpll_rate(struct clk * tclk) { - long long dpll_clk; - int dpll_mult, dpll_div, amult; + int dpll_clk, dpll_mult, dpll_div, amult; dpll_mult = (CM_CLKSEL1_PLL >> 12) & 0x03ff; /* 10 bits */ dpll_div = (CM_CLKSEL1_PLL >> 8) & 0x0f; /* 4 bits */ - dpll_clk = (long long)tclk->parent->rate * dpll_mult; - do_div(dpll_clk, dpll_div + 1); + dpll_clk = (tclk->parent->rate * dpll_mult) / (dpll_div + 1); amult = CM_CLKSEL2_PLL & 0x3; dpll_clk *= amult; @@ -386,23 +385,75 @@ static u32 omap2_dll_force_needed(void) return 0; } +static void omap2_init_memory_params(u32 force_lock_to_unlock_mode) +{ + unsigned long dll_cnt; + u32 fast_dll = 0; + + mem_timings.m_type = !((SDRC_MR_0 & 0x3) == 0x1); /* DDR = 1, SDR = 0 */ + + /* 2422 es2.05 and beyond has a single SIP DDR instead of 2 like others. + * In the case of 2422, its ok to use CS1 instead of CS0. + */ + +#if 0 /* FIXME: Enable after 24xx cpu detection works */ + ctype = get_cpu_type(); + if (cpu_is_omap2422()) + mem_timings.base_cs = 1; + else +#endif + mem_timings.base_cs = 0; + + if (mem_timings.m_type != M_DDR) + return; + + /* With DDR we need to determine the low frequency DLL value */ + if (((mem_timings.fast_dll_ctrl & (1 << 2)) == M_LOCK_CTRL)) + mem_timings.dll_mode = M_UNLOCK; + else + mem_timings.dll_mode = M_LOCK; + + if (mem_timings.base_cs == 0) { + fast_dll = SDRC_DLLA_CTRL; + dll_cnt = SDRC_DLLA_STATUS & 0xff00; + } else { + fast_dll = SDRC_DLLB_CTRL; + dll_cnt = SDRC_DLLB_STATUS & 0xff00; + } + if (force_lock_to_unlock_mode) { + fast_dll &= ~0xff00; + fast_dll |= dll_cnt; /* Current lock mode */ + } + mem_timings.fast_dll_ctrl = fast_dll; + + /* No disruptions, DDR will be offline & C-ABI not followed */ + omap2_sram_ddr_init(&mem_timings.slow_dll_ctrl, + mem_timings.fast_dll_ctrl, + mem_timings.base_cs, + force_lock_to_unlock_mode); + mem_timings.slow_dll_ctrl &= 0xff00; /* Keep lock value */ + + /* Turn status into unlock ctrl */ + mem_timings.slow_dll_ctrl |= + ((mem_timings.fast_dll_ctrl & 0xF) | (1 << 2)); + + /* 90 degree phase for anything below 133Mhz */ + mem_timings.slow_dll_ctrl |= (1 << 1); +} + static u32 omap2_reprogram_sdrc(u32 level, u32 force) { - u32 slow_dll_ctrl, fast_dll_ctrl, m_type; u32 prev = curr_perf_level, flags; if ((curr_perf_level == level) && !force) return prev; - m_type = omap2_memory_get_type(); - slow_dll_ctrl = omap2_memory_get_slow_dll_ctrl(); - fast_dll_ctrl = omap2_memory_get_fast_dll_ctrl(); - if (level == PRCM_HALF_SPEED) { local_irq_save(flags); PRCM_VOLTSETUP = 0xffff; omap2_sram_reprogram_sdrc(PRCM_HALF_SPEED, - slow_dll_ctrl, m_type); + mem_timings.slow_dll_ctrl, + mem_timings.m_type); curr_perf_level = PRCM_HALF_SPEED; local_irq_restore(flags); } @@ -410,7 +461,8 @@ static u32 omap2_reprogram_sdrc(u32 level, u32 force) local_irq_save(flags); PRCM_VOLTSETUP = 0xffff; omap2_sram_reprogram_sdrc(PRCM_FULL_SPEED, - fast_dll_ctrl, m_type); + mem_timings.fast_dll_ctrl, + mem_timings.m_type); curr_perf_level = PRCM_FULL_SPEED; local_irq_restore(flags); } @@ -598,7 +650,7 @@ static u32 omap2_get_clksel(u32 *div_sel, u32 *field_mask, case 13: /* dss2 */ mask = 0x1; break; case 25: /* usb */ - mask = 0x7; break; + mask = 0xf; break; } } @@ -659,35 +711,26 @@ 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->rate_offset; + div_off = clk->src_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; @@ -752,7 +795,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_CLKSEL_WKUP; + src_reg_addr = (u32)&CM_CLKSEL2_CORE; mask = 0x3; if (src_clk == &func_32k_ck) val = 0x0; @@ -792,9 +835,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_96m_ck) - val = 2; if (src_clk == &func_54m_ck) + val = 2; + if (src_clk == &func_96m_ck) val = 3; break; } diff --git a/arch/arm/mach-omap2/clock.h b/arch/arm/mach-omap2/clock.h index 2781dfbc5..6cab20b1d 100644 --- a/arch/arm/mach-omap2/clock.h +++ b/arch/arm/mach-omap2/clock.h @@ -33,6 +33,20 @@ static u32 omap2_clksel_get_divisor(struct clk *clk); #define RATE_IN_242X (1 << 0) #define RATE_IN_243X (1 << 1) +/* Memory timings */ +#define M_DDR 1 +#define M_LOCK_CTRL (1 << 2) +#define M_UNLOCK 0 +#define M_LOCK 1 + +struct memory_timings { + u32 m_type; /* ddr = 1, sdr = 0 */ + u32 dll_mode; /* use lock mode = 1, unlock mode = 0 */ + u32 slow_dll_ctrl; /* unlock mode, dll value for slow speed */ + u32 fast_dll_ctrl; /* unlock mode, dll value for fast speed */ + u32 base_cs; /* base chip select to use for calculations */ +}; + /* Key dividers which make up a PRCM set. Ratio's for a PRCM are mandated. * xtal_speed, dpll_speed, mpu_speed, CM_CLKSEL_MPU,CM_CLKSEL_DSP * CM_CLKSEL_GFX, CM_CLKSEL1_CORE, CM_CLKSEL1_PLL CM_CLKSEL2_PLL, CM_CLKSEL_MDM @@ -717,16 +731,6 @@ static struct clk sys_clkout2 = { .recalc = &omap2_clksel_recalc, }; -static struct clk emul_ck = { - .name = "emul_ck", - .parent = &func_54m_ck, - .flags = CLOCK_IN_OMAP242X, - .enable_reg = (void __iomem *)&PRCM_CLKEMUL_CTRL, - .enable_bit = 0, - .recalc = &omap2_propagate_rate, - -}; - /* * MPU clock domain * Clocks: @@ -1062,7 +1066,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 = 4, + .enable_bit = 0, .recalc = &omap2_followparent_recalc, }; @@ -1698,8 +1702,7 @@ static struct clk hdq_fck = { }; static struct clk i2c2_ick = { - .name = "i2c_ick", - .id = 2, + .name = "i2c2_ick", .parent = &l4_ck, .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X, .enable_reg = (void __iomem *)&CM_ICLKEN1_CORE, @@ -1708,8 +1711,7 @@ static struct clk i2c2_ick = { }; static struct clk i2c2_fck = { - .name = "i2c_fck", - .id = 2, + .name = "i2c2_fck", .parent = &func_12m_ck, .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X, .enable_reg = (void __iomem *)&CM_FCLKEN1_CORE, @@ -1727,8 +1729,7 @@ static struct clk i2chs2_fck = { }; static struct clk i2c1_ick = { - .name = "i2c_ick", - .id = 1, + .name = "i2c1_ick", .parent = &l4_ck, .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X, .enable_reg = (void __iomem *)&CM_ICLKEN1_CORE, @@ -1737,8 +1738,7 @@ static struct clk i2c1_ick = { }; static struct clk i2c1_fck = { - .name = "i2c_fck", - .id = 1, + .name = "i2c1_fck", .parent = &func_12m_ck, .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X, .enable_reg = (void __iomem *)&CM_FCLKEN1_CORE, @@ -1971,7 +1971,6 @@ static struct clk *onchip_clks[] = { &wdt1_osc_ck, &sys_clkout, &sys_clkout2, - &emul_ck, /* mpu domain clocks */ &mpu_ck, /* dsp domain clocks */ diff --git a/arch/arm/mach-omap2/devices.c b/arch/arm/mach-omap2/devices.c index aa4322451..7181edb89 100644 --- a/arch/arm/mach-omap2/devices.c +++ b/arch/arm/mach-omap2/devices.c @@ -9,6 +9,7 @@ * (at your option) any later version. */ +#include #include #include #include @@ -24,6 +25,10 @@ #include #include +extern void omap_nop_release(struct device *dev); + +/*-------------------------------------------------------------------------*/ + #if defined(CONFIG_I2C_OMAP) || defined(CONFIG_I2C_OMAP_MODULE) #define OMAP2_I2C_BASE2 0x48072000 @@ -44,6 +49,9 @@ static struct resource i2c_resources2[] = { static struct platform_device omap_i2c_device2 = { .name = "i2c_omap", .id = 2, + .dev = { + .release = omap_nop_release, + }, .num_resources = ARRAY_SIZE(i2c_resources2), .resource = i2c_resources2, }; @@ -66,89 +74,6 @@ static void omap_init_i2c(void) {} #endif -#if defined(CONFIG_OMAP_STI) - -#define OMAP2_STI_BASE IO_ADDRESS(0x48068000) -#define OMAP2_STI_CHANNEL_BASE 0x54000000 -#define OMAP2_STI_IRQ 4 - -static struct resource sti_resources[] = { - { - .start = OMAP2_STI_BASE, - .end = OMAP2_STI_BASE + 0x7ff, - .flags = IORESOURCE_MEM, - }, - { - .start = OMAP2_STI_CHANNEL_BASE, - .end = OMAP2_STI_CHANNEL_BASE + SZ_64K - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = OMAP2_STI_IRQ, - .flags = IORESOURCE_IRQ, - } -}; - -static struct platform_device sti_device = { - .name = "sti", - .id = -1, - .num_resources = ARRAY_SIZE(sti_resources), - .resource = sti_resources, -}; - -static inline void omap_init_sti(void) -{ - platform_device_register(&sti_device); -} -#else -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) @@ -157,8 +82,6 @@ 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 871ace4fc..76187300f 100644 --- a/arch/arm/mach-omap2/id.c +++ b/arch/arm/mach-omap2/id.c @@ -11,6 +11,7 @@ * 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 a0728c33e..8ea67bf19 100644 --- a/arch/arm/mach-omap2/io.c +++ b/arch/arm/mach-omap2/io.c @@ -11,22 +11,18 @@ * published by the Free Software Foundation. */ +#include #include #include #include -#include -#include - #include - +#include #include -#include 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 @@ -47,25 +43,11 @@ static struct map_desc omap2_io_desc[] __initdata = { } }; -void __init omap2_map_common_io(void) +void __init omap_map_common_io(void) { iotable_init(omap2_io_desc, ARRAY_SIZE(omap2_io_desc)); - - /* Normally devicemaps_init() would flush caches and tlb after - * mdesc->map_io(), but we must also do it here because of the CPU - * revision check below. - */ - local_flush_tlb_all(); - flush_cache_all(); - omap2_check_revision(); omap_sram_init(); - omapfb_reserve_mem(); -} - -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 dfc3b35cc..d7baff675 100644 --- a/arch/arm/mach-omap2/irq.c +++ b/arch/arm/mach-omap2/irq.c @@ -12,6 +12,7 @@ */ #include #include +#include #include #include #include @@ -94,8 +95,7 @@ static void omap_mask_ack_irq(unsigned int irq) omap_ack_irq(irq); } -static struct irq_chip omap_irq_chip = { - .name = "INTC", +static struct irqchip omap_irq_chip = { .ack = omap_mask_ack_irq, .mask = omap_mask_irq, .unmask = omap_unmask_irq, diff --git a/arch/arm/mach-omap2/mux.c b/arch/arm/mach-omap2/mux.c index 60ef084fa..ea4654815 100644 --- a/arch/arm/mach-omap2/mux.c +++ b/arch/arm/mach-omap2/mux.c @@ -22,6 +22,7 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ +#include #include #include #include @@ -49,80 +50,9 @@ MUX_CFG_24XX("H19_24XX_I2C2_SDA", 0x114, 0, 0, 0, 1) /* Menelaus interrupt */ 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) -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("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("AA12_242X_GPIO17", 0x0e9, 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("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) - -/* UART3 */ -MUX_CFG_24XX("K15_24XX_UART3_TX", 0x118, 0, 0, 0, 1) -MUX_CFG_24XX("K14_24XX_UART3_RX", 0x119, 0, 0, 0, 1) - -/* Keypad GPIO*/ -MUX_CFG_24XX("T19_24XX_KBR0", 0x106, 3, 1, 1, 1) -MUX_CFG_24XX("R19_24XX_KBR1", 0x107, 3, 1, 1, 1) -MUX_CFG_24XX("V18_24XX_KBR2", 0x139, 3, 1, 1, 1) -MUX_CFG_24XX("M21_24XX_KBR3", 0xc9, 3, 1, 1, 1) -MUX_CFG_24XX("E5__24XX_KBR4", 0x138, 3, 1, 1, 1) -MUX_CFG_24XX("M18_24XX_KBR5", 0x10e, 3, 1, 1, 1) -MUX_CFG_24XX("R20_24XX_KBC0", 0x108, 3, 0, 0, 1) -MUX_CFG_24XX("M14_24XX_KBC1", 0x109, 3, 0, 0, 1) -MUX_CFG_24XX("H19_24XX_KBC2", 0x114, 3, 0, 0, 1) -MUX_CFG_24XX("V17_24XX_KBC3", 0x135, 3, 0, 0, 1) -MUX_CFG_24XX("P21_24XX_KBC4", 0xca, 3, 0, 0, 1) -MUX_CFG_24XX("L14_24XX_KBC5", 0x10f, 3, 0, 0, 1) -MUX_CFG_24XX("N19_24XX_KBC6", 0x110, 3, 0, 0, 1) - -/* 24xx Menelaus Keypad GPIO */ -MUX_CFG_24XX("B3__24XX_KBR5", 0x30, 3, 1, 1, 1) -MUX_CFG_24XX("AA4_24XX_KBC2", 0xe7, 3, 0, 0, 1) -MUX_CFG_24XX("B13_24XX_KBC6", 0x110, 3, 0, 0, 1) }; diff --git a/arch/arm/mach-omap2/serial.c b/arch/arm/mach-omap2/serial.c index 0884bc7c2..24dd37422 100644 --- a/arch/arm/mach-omap2/serial.c +++ b/arch/arm/mach-omap2/serial.c @@ -167,7 +167,7 @@ void __init omap_serial_init() static struct platform_device serial_device = { .name = "serial8250", - .id = PLAT8250_DEV_PLATFORM, + .id = 0, .dev = { .platform_data = serial_platform_data, }, diff --git a/arch/arm/mach-omap2/sram-fn.S b/arch/arm/mach-omap2/sram-fn.S index a5ef7f611..2a869e203 100644 --- a/arch/arm/mach-omap2/sram-fn.S +++ b/arch/arm/mach-omap2/sram-fn.S @@ -1,5 +1,5 @@ /* - * linux/arch/arm/mach-omap2/sram.S + * linux/arch/arm/mach-omap1/sram.S * * Omap2 specific functions that need to be run in internal SRAM * @@ -22,12 +22,13 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, * MA 02111-1307 USA */ +#include #include #include #include #include -#include "prcm-regs.h" +#include #define TIMER_32KSYNCT_CR_V IO_ADDRESS(OMAP24XX_32KSYNCT_BASE + 0x010) diff --git a/arch/arm/mach-omap2/timer-gp.c b/arch/arm/mach-omap2/timer-gp.c index fe5fd6d42..1d2f5ac2f 100644 --- a/arch/arm/mach-omap2/timer-gp.c +++ b/arch/arm/mach-omap2/timer-gp.c @@ -6,7 +6,6 @@ * 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: * @@ -23,18 +22,54 @@ #include #include #include -#include #include -#include +#include +#include -static struct omap_dm_timer *gptimer; +#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 inline void omap2_gp_timer_start(unsigned long load_val) +#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) { - 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); + 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); } static irqreturn_t omap2_gp_timer_interrupt(int irq, void *dev_id, @@ -42,7 +77,7 @@ static irqreturn_t omap2_gp_timer_interrupt(int irq, void *dev_id, { write_seqlock(&xtime_lock); - omap_dm_timer_write_status(gptimer, OMAP_TIMER_INT_OVERFLOW); + timer_write_reg(OS_TIMER_NR, GP_TIMER_TISR, 1 << 1); timer_tick(regs); write_sequnlock(&xtime_lock); @@ -52,26 +87,41 @@ static irqreturn_t omap2_gp_timer_interrupt(int irq, void *dev_id, static struct irqaction omap2_gp_timer_irq = { .name = "gp timer", - .flags = IRQF_DISABLED | IRQF_TIMER, + .flags = SA_INTERRUPT, .handler = omap2_gp_timer_interrupt, }; static void __init omap2_gp_timer_init(void) { - u32 tick_period; + struct clk * sys_ck; + u32 tick_period = 120000; + u32 l; - omap_dm_timer_init(); - gptimer = omap_dm_timer_request_specific(1); - BUG_ON(gptimer == NULL); + /* Reset clock and prescale value */ + timer_write_reg(OS_TIMER_NR, GP_TIMER_TCLR, 0); - omap_dm_timer_set_source(gptimer, OMAP_TIMER_SRC_SYS_CLK); - tick_period = clk_get_rate(omap_dm_timer_get_fclk(gptimer)) / 100; + 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 */ tick_period -= 1; - setup_irq(omap_dm_timer_get_irq(gptimer), &omap2_gp_timer_irq); - omap2_gp_timer_start(tick_period); + 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); } 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 03d07cae2..c1d77f5b3 100644 --- a/arch/arm/mach-pxa/Kconfig +++ b/arch/arm/mach-pxa/Kconfig @@ -10,11 +10,6 @@ config ARCH_LUBBOCK select PXA25x select SA1111 -config MACH_LOGICPD_PXA270 - bool "LogicPD PXA270 Card Engine Development Platform" - select PXA27x - select IWMMXT - config MACH_MAINSTONE bool "Intel HCDDBBVA0 Development Platform" select PXA27x @@ -35,10 +30,6 @@ 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 @@ -59,28 +50,12 @@ 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 9093eb1c9..32526a0a6 100644 --- a/arch/arm/mach-pxa/Makefile +++ b/arch/arm/mach-pxa/Makefile @@ -3,20 +3,18 @@ # # Common support (must be linked before board specific support) -obj-y += clock.o generic.o irq.o dma.o time.o +obj-y += generic.o irq.o dma.o time.o obj-$(CONFIG_PXA25x) += pxa25x.o obj-$(CONFIG_PXA27x) += pxa27x.o # Specific board support 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 corgi_ssp.o +obj-$(CONFIG_MACH_POODLE) += poodle.o obj-$(CONFIG_MACH_TOSA) += tosa.o # Support for blinky lights @@ -24,7 +22,6 @@ 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 cce265769..7ffd2de8f 100644 --- a/arch/arm/mach-pxa/corgi.c +++ b/arch/arm/mach-pxa/corgi.c @@ -19,7 +19,6 @@ #include #include #include -#include #include #include @@ -27,13 +26,13 @@ #include #include #include -#include #include #include #include #include +#include #include #include #include @@ -143,8 +142,6 @@ struct corgissp_machinfo corgi_ssp_machinfo = { */ static struct corgibl_machinfo corgi_bl_machinfo = { .max_intensity = 0x2f, - .default_intensity = 0x1f, - .limit_mask = 0x0b, .set_bl_intensity = corgi_bl_set_intensity, }; @@ -167,14 +164,6 @@ static struct platform_device corgikbd_device = { }; -/* - * Corgi LEDs - */ -static struct platform_device corgiled_device = { - .name = "corgi-led", - .id = -1, -}; - /* * Corgi Touch Screen Device */ @@ -225,7 +214,7 @@ static int corgi_mci_init(struct device *dev, irqreturn_t (*corgi_detect_int)(in corgi_mci_platform_data.detect_delay = msecs_to_jiffies(250); err = request_irq(CORGI_IRQ_GPIO_nSD_DETECT, corgi_detect_int, - IRQF_DISABLED | IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, + SA_INTERRUPT | SA_TRIGGER_RISING | SA_TRIGGER_FALLING, "MMC card detect", data); if (err) { printk(KERN_ERR "corgi_mci_init: MMC/SD: can't request MMC card detect IRQ\n"); @@ -309,34 +298,10 @@ static struct platform_device *devices[] __initdata = { &corgikbd_device, &corgibl_device, &corgits_device, - &corgiled_device, }; -static void corgi_poweroff(void) -{ - RCSR = RCSR_HWR | RCSR_WDR | RCSR_SMR | RCSR_GPR; - - if (!machine_is_corgi()) - /* Green LED off tells the bootloader to halt */ - reset_scoop_gpio(&corgiscoop_device.dev, CORGI_SCP_LED_GREEN); - arm_machine_restart('h'); -} - -static void corgi_restart(char mode) -{ - RCSR = RCSR_HWR | RCSR_WDR | RCSR_SMR | RCSR_GPR; - - if (!machine_is_corgi()) - /* Green LED on tells the bootloader to reboot */ - set_scoop_gpio(&corgiscoop_device.dev, CORGI_SCP_LED_GREEN); - arm_machine_restart('h'); -} - static void __init corgi_init(void) { - pm_power_off = corgi_poweroff; - arm_pm_restart = corgi_restart; - /* setup sleep mode values */ PWER = 0x00000002; PFER = 0x00000000; diff --git a/arch/arm/mach-pxa/corgi_pm.c b/arch/arm/mach-pxa/corgi_pm.c index 4c3de4008..7a1ab73e9 100644 --- a/arch/arm/mach-pxa/corgi_pm.c +++ b/arch/arm/mach-pxa/corgi_pm.c @@ -27,13 +27,6 @@ #include #include "sharpsl.h" -#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 */ - static void corgi_charger_init(void) { pxa_gpio_mode(CORGI_GPIO_ADC_TEMP_ON | GPIO_OUT); @@ -202,16 +195,9 @@ static struct sharpsl_charger_machinfo corgi_pm_machinfo = { .read_devdata = corgipm_read_devdata, .charger_wakeup = corgi_charger_wakeup, .should_wakeup = corgi_should_wakeup, - .backlight_limit = corgibl_limit_intensity, - .charge_on_volt = SHARPSL_CHARGE_ON_VOLT, - .charge_on_temp = SHARPSL_CHARGE_ON_TEMP, - .charge_acin_high = SHARPSL_CHARGE_ON_ACIN_HIGH, - .charge_acin_low = SHARPSL_CHARGE_ON_ACIN_LOW, - .fatal_acin_volt = SHARPSL_FATAL_ACIN_VOLT, - .fatal_noacin_volt= SHARPSL_FATAL_NOACIN_VOLT, - .bat_levels = 40, - .bat_levels_noac = spitz_battery_levels_noac, - .bat_levels_acin = spitz_battery_levels_acin, + .bat_levels = 40, + .bat_levels_noac = spitz_battery_levels_noac, + .bat_levels_acin = spitz_battery_levels_acin, .status_high_acin = 188, .status_low_acin = 178, .status_high_noac = 185, @@ -228,9 +214,6 @@ static int __devinit corgipm_init(void) if (!corgipm_device) return -ENOMEM; - if (!machine_is_corgi()) - corgi_pm_machinfo.batfull_irq = 1; - corgipm_device->dev.platform_data = &corgi_pm_machinfo; ret = platform_device_add(corgipm_device); diff --git a/arch/arm/mach-pxa/corgi_ssp.c b/arch/arm/mach-pxa/corgi_ssp.c index ff6b4ee03..b371d7236 100644 --- a/arch/arm/mach-pxa/corgi_ssp.c +++ b/arch/arm/mach-pxa/corgi_ssp.c @@ -47,18 +47,15 @@ static struct corgissp_machinfo *ssp_machinfo; */ unsigned long corgi_ssp_ads7846_putget(ulong data) { - unsigned long flag; - u32 ret = 0; + unsigned long ret,flag; spin_lock_irqsave(&corgi_ssp_lock, flag); - if (ssp_machinfo->cs_ads7846 >= 0) - GPCR(ssp_machinfo->cs_ads7846) = GPIO_bit(ssp_machinfo->cs_ads7846); + GPCR(ssp_machinfo->cs_ads7846) = GPIO_bit(ssp_machinfo->cs_ads7846); ssp_write_word(&corgi_ssp_dev,data); - ssp_read_word(&corgi_ssp_dev, &ret); + ret = ssp_read_word(&corgi_ssp_dev); - if (ssp_machinfo->cs_ads7846 >= 0) - GPSR(ssp_machinfo->cs_ads7846) = GPIO_bit(ssp_machinfo->cs_ads7846); + GPSR(ssp_machinfo->cs_ads7846) = GPIO_bit(ssp_machinfo->cs_ads7846); spin_unlock_irqrestore(&corgi_ssp_lock, flag); return ret; @@ -71,14 +68,12 @@ unsigned long corgi_ssp_ads7846_putget(ulong data) void corgi_ssp_ads7846_lock(void) { spin_lock(&corgi_ssp_lock); - if (ssp_machinfo->cs_ads7846 >= 0) - GPCR(ssp_machinfo->cs_ads7846) = GPIO_bit(ssp_machinfo->cs_ads7846); + GPCR(ssp_machinfo->cs_ads7846) = GPIO_bit(ssp_machinfo->cs_ads7846); } void corgi_ssp_ads7846_unlock(void) { - if (ssp_machinfo->cs_ads7846 >= 0) - GPSR(ssp_machinfo->cs_ads7846) = GPIO_bit(ssp_machinfo->cs_ads7846); + GPSR(ssp_machinfo->cs_ads7846) = GPIO_bit(ssp_machinfo->cs_ads7846); spin_unlock(&corgi_ssp_lock); } @@ -89,9 +84,7 @@ void corgi_ssp_ads7846_put(ulong data) unsigned long corgi_ssp_ads7846_get(void) { - u32 ret = 0; - ssp_read_word(&corgi_ssp_dev, &ret); - return ret; + return ssp_read_word(&corgi_ssp_dev); } EXPORT_SYMBOL(corgi_ssp_ads7846_putget); @@ -107,7 +100,6 @@ EXPORT_SYMBOL(corgi_ssp_ads7846_get); unsigned long corgi_ssp_dac_put(ulong data) { unsigned long flag, sscr1 = SSCR1_SPH; - u32 tmp; spin_lock_irqsave(&corgi_ssp_lock, flag); @@ -118,13 +110,11 @@ unsigned long corgi_ssp_dac_put(ulong data) ssp_config(&corgi_ssp_dev, (SSCR0_Motorola | (SSCR0_DSS & 0x07 )), sscr1, 0, SSCR0_SerClkDiv(ssp_machinfo->clk_lcdcon)); ssp_enable(&corgi_ssp_dev); - if (ssp_machinfo->cs_lcdcon >= 0) - GPCR(ssp_machinfo->cs_lcdcon) = GPIO_bit(ssp_machinfo->cs_lcdcon); + GPCR(ssp_machinfo->cs_lcdcon) = GPIO_bit(ssp_machinfo->cs_lcdcon); ssp_write_word(&corgi_ssp_dev,data); /* Read null data back from device to prevent SSP overflow */ - ssp_read_word(&corgi_ssp_dev, &tmp); - if (ssp_machinfo->cs_lcdcon >= 0) - GPSR(ssp_machinfo->cs_lcdcon) = GPIO_bit(ssp_machinfo->cs_lcdcon); + ssp_read_word(&corgi_ssp_dev); + GPSR(ssp_machinfo->cs_lcdcon) = GPIO_bit(ssp_machinfo->cs_lcdcon); ssp_disable(&corgi_ssp_dev); ssp_config(&corgi_ssp_dev, (SSCR0_National | (SSCR0_DSS & 0x0b )), 0, 0, SSCR0_SerClkDiv(ssp_machinfo->clk_ads7846)); @@ -154,11 +144,10 @@ EXPORT_SYMBOL(corgi_ssp_blduty_set); int corgi_ssp_max1111_get(ulong data) { unsigned long flag; - long voltage = 0, voltage1 = 0, voltage2 = 0; + int voltage,voltage1,voltage2; spin_lock_irqsave(&corgi_ssp_lock, flag); - if (ssp_machinfo->cs_max1111 >= 0) - GPCR(ssp_machinfo->cs_max1111) = GPIO_bit(ssp_machinfo->cs_max1111); + GPCR(ssp_machinfo->cs_max1111) = GPIO_bit(ssp_machinfo->cs_max1111); ssp_disable(&corgi_ssp_dev); ssp_config(&corgi_ssp_dev, (SSCR0_Motorola | (SSCR0_DSS & 0x07 )), 0, 0, SSCR0_SerClkDiv(ssp_machinfo->clk_max1111)); ssp_enable(&corgi_ssp_dev); @@ -167,21 +156,20 @@ int corgi_ssp_max1111_get(ulong data) /* TB1/RB1 */ ssp_write_word(&corgi_ssp_dev,data); - ssp_read_word(&corgi_ssp_dev, (u32*)&voltage1); /* null read */ + ssp_read_word(&corgi_ssp_dev); /* null read */ /* TB12/RB2 */ ssp_write_word(&corgi_ssp_dev,0); - ssp_read_word(&corgi_ssp_dev, (u32*)&voltage1); + voltage1=ssp_read_word(&corgi_ssp_dev); /* TB13/RB3*/ ssp_write_word(&corgi_ssp_dev,0); - ssp_read_word(&corgi_ssp_dev, (u32*)&voltage2); + voltage2=ssp_read_word(&corgi_ssp_dev); ssp_disable(&corgi_ssp_dev); ssp_config(&corgi_ssp_dev, (SSCR0_National | (SSCR0_DSS & 0x0b )), 0, 0, SSCR0_SerClkDiv(ssp_machinfo->clk_ads7846)); ssp_enable(&corgi_ssp_dev); - if (ssp_machinfo->cs_max1111 >= 0) - GPSR(ssp_machinfo->cs_max1111) = GPIO_bit(ssp_machinfo->cs_max1111); + GPSR(ssp_machinfo->cs_max1111) = GPIO_bit(ssp_machinfo->cs_max1111); spin_unlock_irqrestore(&corgi_ssp_lock, flag); if (voltage1 & 0xc0 || voltage2 & 0x3f) @@ -208,12 +196,12 @@ static int __init corgi_ssp_probe(struct platform_device *dev) int ret; /* Chip Select - Disable All */ - if (ssp_machinfo->cs_lcdcon >= 0) - pxa_gpio_mode(ssp_machinfo->cs_lcdcon | GPIO_OUT | GPIO_DFLT_HIGH); - if (ssp_machinfo->cs_max1111 >= 0) - pxa_gpio_mode(ssp_machinfo->cs_max1111 | GPIO_OUT | GPIO_DFLT_HIGH); - if (ssp_machinfo->cs_ads7846 >= 0) - pxa_gpio_mode(ssp_machinfo->cs_ads7846 | GPIO_OUT | GPIO_DFLT_HIGH); + GPDR(ssp_machinfo->cs_lcdcon) |= GPIO_bit(ssp_machinfo->cs_lcdcon); /* output */ + GPSR(ssp_machinfo->cs_lcdcon) = GPIO_bit(ssp_machinfo->cs_lcdcon); /* High - Disable LCD Control/Timing Gen */ + GPDR(ssp_machinfo->cs_max1111) |= GPIO_bit(ssp_machinfo->cs_max1111); /* output */ + GPSR(ssp_machinfo->cs_max1111) = GPIO_bit(ssp_machinfo->cs_max1111); /* High - Disable MAX1111*/ + GPDR(ssp_machinfo->cs_ads7846) |= GPIO_bit(ssp_machinfo->cs_ads7846); /* output */ + GPSR(ssp_machinfo->cs_ads7846) = GPIO_bit(ssp_machinfo->cs_ads7846); /* High - Disable ADS7846*/ ret = ssp_init(&corgi_ssp_dev, ssp_machinfo->port, 0); @@ -244,12 +232,9 @@ static int corgi_ssp_suspend(struct platform_device *dev, pm_message_t state) static int corgi_ssp_resume(struct platform_device *dev) { - if (ssp_machinfo->cs_lcdcon >= 0) - GPSR(ssp_machinfo->cs_lcdcon) = GPIO_bit(ssp_machinfo->cs_lcdcon); /* High - Disable LCD Control/Timing Gen */ - if (ssp_machinfo->cs_max1111 >= 0) - GPSR(ssp_machinfo->cs_max1111) = GPIO_bit(ssp_machinfo->cs_max1111); /* High - Disable MAX1111*/ - if (ssp_machinfo->cs_ads7846 >= 0) - GPSR(ssp_machinfo->cs_ads7846) = GPIO_bit(ssp_machinfo->cs_ads7846); /* High - Disable ADS7846*/ + GPSR(ssp_machinfo->cs_lcdcon) = GPIO_bit(ssp_machinfo->cs_lcdcon); /* High - Disable LCD Control/Timing Gen */ + GPSR(ssp_machinfo->cs_max1111) = GPIO_bit(ssp_machinfo->cs_max1111); /* High - Disable MAX1111*/ + GPSR(ssp_machinfo->cs_ads7846) = GPIO_bit(ssp_machinfo->cs_ads7846); /* High - Disable ADS7846*/ ssp_restore_state(&corgi_ssp_dev,&corgi_ssp_state); ssp_enable(&corgi_ssp_dev); diff --git a/arch/arm/mach-pxa/dma.c b/arch/arm/mach-pxa/dma.c index 7d8c85486..458112b21 100644 --- a/arch/arm/mach-pxa/dma.c +++ b/arch/arm/mach-pxa/dma.c @@ -45,16 +45,23 @@ int pxa_request_dma (char *name, pxa_dma_prio prio, local_irq_save(flags); - do { - /* try grabbing a DMA channel with the requested priority */ - pxa_for_each_dma_prio (i, prio) { + /* try grabbing a DMA channel with the requested priority */ + for (i = prio; i < prio + PXA_DMA_NBCH(prio); i++) { + if (!dma_channels[i].name) { + found = 1; + break; + } + } + + if (!found) { + /* requested prio group is full, try hier priorities */ + for (i = prio-1; i >= 0; i--) { if (!dma_channels[i].name) { found = 1; break; } } - /* if requested prio group is full, try a hier priority */ - } while (!found && prio--); + } if (found) { DCSR(i) = DCSR_STARTINTR|DCSR_ENDINTR|DCSR_BUSERR; diff --git a/arch/arm/mach-pxa/generic.c b/arch/arm/mach-pxa/generic.c index 5efa84749..9b48a90ae 100644 --- a/arch/arm/mach-pxa/generic.c +++ b/arch/arm/mach-pxa/generic.c @@ -319,11 +319,6 @@ void __init pxa_set_ficp_info(struct pxaficp_platform_data *info) pxaficp_device.dev.platform_data = info; } -static struct platform_device pxartc_device = { - .name = "sa1100-rtc", - .id = -1, -}; - static struct platform_device *devices[] __initdata = { &pxamci_device, &udc_device, @@ -334,7 +329,6 @@ static struct platform_device *devices[] __initdata = { &pxaficp_device, &i2c_device, &i2s_device, - &pxartc_device, }; static int __init pxa_init(void) diff --git a/arch/arm/mach-pxa/idp.c b/arch/arm/mach-pxa/idp.c index 6914d22bc..347b9dea2 100644 --- a/arch/arm/mach-pxa/idp.c +++ b/arch/arm/mach-pxa/idp.c @@ -18,7 +18,6 @@ #include #include -#include #include #include diff --git a/arch/arm/mach-pxa/irq.c b/arch/arm/mach-pxa/irq.c index 12141e2a5..539b59600 100644 --- a/arch/arm/mach-pxa/irq.c +++ b/arch/arm/mach-pxa/irq.c @@ -39,8 +39,7 @@ static void pxa_unmask_low_irq(unsigned int irq) ICMR |= (1 << (irq + PXA_IRQ_SKIP)); } -static struct irq_chip pxa_internal_chip_low = { - .name = "SC", +static struct irqchip pxa_internal_chip_low = { .ack = pxa_mask_low_irq, .mask = pxa_mask_low_irq, .unmask = pxa_unmask_low_irq, @@ -62,8 +61,7 @@ static void pxa_unmask_high_irq(unsigned int irq) ICMR2 |= (1 << (irq - 32 + PXA_IRQ_SKIP)); } -static struct irq_chip pxa_internal_chip_high = { - .name = "SC-hi", +static struct irqchip pxa_internal_chip_high = { .ack = pxa_mask_high_irq, .mask = pxa_mask_high_irq, .unmask = pxa_unmask_high_irq, @@ -90,8 +88,8 @@ static int pxa_gpio_irq_type(unsigned int irq, unsigned int type) if (type == IRQT_PROBE) { /* Don't mess with enabled GPIOs using preconfigured edges or - GPIOs set to alternate function or to output during probe */ - if ((GPIO_IRQ_rising_edge[idx] | GPIO_IRQ_falling_edge[idx] | GPDR(gpio)) & + GPIOs set to alternate function during probe */ + if ((GPIO_IRQ_rising_edge[idx] | GPIO_IRQ_falling_edge[idx]) & GPIO_bit(gpio)) return 0; if (GAFR(gpio) & (0x3 << (((gpio) & 0xf)*2))) @@ -131,8 +129,7 @@ static void pxa_ack_low_gpio(unsigned int irq) GEDR0 = (1 << (irq - IRQ_GPIO0)); } -static struct irq_chip pxa_low_gpio_chip = { - .name = "GPIO-l", +static struct irqchip pxa_low_gpio_chip = { .ack = pxa_ack_low_gpio, .mask = pxa_mask_low_irq, .unmask = pxa_unmask_low_irq, @@ -240,8 +237,7 @@ static void pxa_unmask_muxed_gpio(unsigned int irq) GFER(gpio) = GPIO_IRQ_falling_edge[idx] & GPIO_IRQ_mask[idx]; } -static struct irq_chip pxa_muxed_gpio_chip = { - .name = "GPIO", +static struct irqchip pxa_muxed_gpio_chip = { .ack = pxa_ack_muxed_gpio, .mask = pxa_mask_muxed_gpio, .unmask = pxa_unmask_muxed_gpio, diff --git a/arch/arm/mach-pxa/leds-idp.c b/arch/arm/mach-pxa/leds-idp.c index 38aa92705..5eba6ea0b 100644 --- a/arch/arm/mach-pxa/leds-idp.c +++ b/arch/arm/mach-pxa/leds-idp.c @@ -12,6 +12,7 @@ */ +#include #include #include diff --git a/arch/arm/mach-pxa/leds-lubbock.c b/arch/arm/mach-pxa/leds-lubbock.c index afbc6698e..05cf56059 100644 --- a/arch/arm/mach-pxa/leds-lubbock.c +++ b/arch/arm/mach-pxa/leds-lubbock.c @@ -11,6 +11,7 @@ * namespace collision. Mostly adapted the Mainstone version. */ +#include #include #include diff --git a/arch/arm/mach-pxa/leds-mainstone.c b/arch/arm/mach-pxa/leds-mainstone.c index 065293eb0..bbd3f87a9 100644 --- a/arch/arm/mach-pxa/leds-mainstone.c +++ b/arch/arm/mach-pxa/leds-mainstone.c @@ -10,6 +10,7 @@ * published by the Free Software Foundation. */ +#include #include #include @@ -84,7 +85,7 @@ void mainstone_leds_event(led_event_t evt) break; case led_green_on: - hw_led_state |= D21; + hw_led_state |= D21;; break; case led_green_off: @@ -92,7 +93,7 @@ void mainstone_leds_event(led_event_t evt) break; case led_amber_on: - hw_led_state |= D22; + hw_led_state |= D22;; break; case led_amber_off: @@ -100,7 +101,7 @@ void mainstone_leds_event(led_event_t evt) break; case led_red_on: - hw_led_state |= D23; + hw_led_state |= D23;; break; case led_red_off: diff --git a/arch/arm/mach-pxa/leds.c b/arch/arm/mach-pxa/leds.c index e13eb841e..bbe4d5f6a 100644 --- a/arch/arm/mach-pxa/leds.c +++ b/arch/arm/mach-pxa/leds.c @@ -24,8 +24,6 @@ pxa_leds_init(void) leds_event = mainstone_leds_event; if (machine_is_pxa_idp()) leds_event = idp_leds_event; - if (machine_is_trizeps4()) - leds_event = trizeps4_leds_event; leds_event(led_start); return 0; diff --git a/arch/arm/mach-pxa/leds.h b/arch/arm/mach-pxa/leds.h index 4f829b8c3..d98f6e93c 100644 --- a/arch/arm/mach-pxa/leds.h +++ b/arch/arm/mach-pxa/leds.h @@ -10,4 +10,3 @@ extern void idp_leds_event(led_event_t evt); extern void lubbock_leds_event(led_event_t evt); extern void mainstone_leds_event(led_event_t evt); -extern void trizeps4_leds_event(led_event_t evt); diff --git a/arch/arm/mach-pxa/lubbock.c b/arch/arm/mach-pxa/lubbock.c index 83ff5cee6..3e26d7ce5 100644 --- a/arch/arm/mach-pxa/lubbock.c +++ b/arch/arm/mach-pxa/lubbock.c @@ -22,10 +22,6 @@ #include #include -#include -#include -#include - #include #include #include @@ -78,8 +74,7 @@ static void lubbock_unmask_irq(unsigned int irq) LUB_IRQ_MASK_EN = (lubbock_irq_enabled |= (1 << lubbock_irq)); } -static struct irq_chip lubbock_irq_chip = { - .name = "FPGA", +static struct irqchip lubbock_irq_chip = { .ack = lubbock_mask_irq, .mask = lubbock_mask_irq, .unmask = lubbock_unmask_irq, @@ -201,78 +196,6 @@ static struct resource smc91x_resources[] = { }, }; -/* ADS7846 is connected through SSP ... and if your board has J5 populated, - * you can select it to replace the ucb1400 by switching the touchscreen cable - * (to J5) and poking board registers (as done below). Else it's only useful - * for the temperature sensors. - */ -static struct resource pxa_ssp_resources[] = { - [0] = { - .start = __PREG(SSCR0_P(1)), - .end = __PREG(SSCR0_P(1)) + 0x14, - .flags = IORESOURCE_MEM, - }, - [1] = { - .start = IRQ_SSP, - .end = IRQ_SSP, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct pxa2xx_spi_master pxa_ssp_master_info = { - .ssp_type = PXA25x_SSP, - .clock_enable = CKEN3_SSP, - .num_chipselect = 0, -}; - -static struct platform_device pxa_ssp = { - .name = "pxa2xx-spi", - .id = 1, - .resource = pxa_ssp_resources, - .num_resources = ARRAY_SIZE(pxa_ssp_resources), - .dev = { - .platform_data = &pxa_ssp_master_info, - }, -}; - -static int lubbock_ads7846_pendown_state(void) -{ - /* TS_BUSY is bit 8 in LUB_MISC_RD, but pendown is irq-only */ - return 0; -} - -static struct ads7846_platform_data ads_info = { - .model = 7846, - .vref_delay_usecs = 100, /* internal, no cap */ - .get_pendown_state = lubbock_ads7846_pendown_state, - // .x_plate_ohms = 500, /* GUESS! */ - // .y_plate_ohms = 500, /* GUESS! */ -}; - -static void ads7846_cs(u32 command) -{ - static const unsigned TS_nCS = 1 << 11; - lubbock_set_misc_wr(TS_nCS, (command == PXA2XX_CS_ASSERT) ? 0 : TS_nCS); -} - -static struct pxa2xx_spi_chip ads_hw = { - .tx_threshold = 1, - .rx_threshold = 2, - .cs_control = ads7846_cs, -}; - -static struct spi_board_info spi_board_info[] __initdata = { { - .modalias = "ads7846", - .platform_data = &ads_info, - .controller_data = &ads_hw, - .irq = LUBBOCK_BB_IRQ, - .max_speed_hz = 120000 /* max sample rate at 3V */ - * 26 /* command + data + overhead */, - .bus_num = 1, - .chip_select = 0, -}, -}; - static struct platform_device smc91x_device = { .name = "smc91x", .id = -1, @@ -349,7 +272,6 @@ static struct platform_device *devices[] __initdata = { &smc91x_device, &lubbock_flash_device[0], &lubbock_flash_device[1], - &pxa_ssp, }; static struct pxafb_mach_info sharp_lm8v31 __initdata = { @@ -420,7 +342,7 @@ static int lubbock_mci_init(struct device *dev, init_timer(&mmc_timer); mmc_timer.data = (unsigned long) data; return request_irq(LUBBOCK_SD_IRQ, lubbock_detect_int, - IRQF_SAMPLE_RANDOM, "lubbock-sd-detect", data); + SA_SAMPLE_RANDOM, "lubbock-sd-detect", data); } static int lubbock_mci_get_ro(struct device *dev) @@ -478,8 +400,6 @@ static void __init lubbock_init(void) lubbock_flash_data[flashboot^1].name = "application-flash"; lubbock_flash_data[flashboot].name = "boot-rom"; (void) platform_add_devices(devices, ARRAY_SIZE(devices)); - - spi_register_board_info(spi_board_info, ARRAY_SIZE(spi_board_info)); } static struct map_desc lubbock_io_desc[] __initdata = { @@ -496,11 +416,6 @@ static void __init lubbock_map_io(void) pxa_map_io(); iotable_init(lubbock_io_desc, ARRAY_SIZE(lubbock_io_desc)); - /* SSP data pins */ - pxa_gpio_mode(GPIO23_SCLK_MD); - pxa_gpio_mode(GPIO25_STXD_MD); - pxa_gpio_mode(GPIO26_SRXD_MD); - /* This enables the BTUART */ pxa_gpio_mode(GPIO42_BTRXD_MD); pxa_gpio_mode(GPIO43_BTTXD_MD); diff --git a/arch/arm/mach-pxa/mainstone.c b/arch/arm/mach-pxa/mainstone.c index a7e9b96f2..d5bda6020 100644 --- a/arch/arm/mach-pxa/mainstone.c +++ b/arch/arm/mach-pxa/mainstone.c @@ -64,8 +64,7 @@ static void mainstone_unmask_irq(unsigned int irq) MST_INTMSKENA = (mainstone_irq_enabled |= (1 << mainstone_irq)); } -static struct irq_chip mainstone_irq_chip = { - .name = "FPGA", +static struct irqchip mainstone_irq_chip = { .ack = mainstone_mask_irq, .mask = mainstone_mask_irq, .unmask = mainstone_unmask_irq, @@ -96,10 +95,7 @@ static void __init mainstone_init_irq(void) for(irq = MAINSTONE_IRQ(0); irq <= MAINSTONE_IRQ(15); irq++) { set_irq_chip(irq, &mainstone_irq_chip); set_irq_handler(irq, do_level_IRQ); - if (irq == MAINSTONE_IRQ(10) || irq == MAINSTONE_IRQ(14)) - set_irq_flags(irq, IRQF_VALID | IRQF_PROBE | IRQF_NOAUTOEN); - else - set_irq_flags(irq, IRQF_VALID | IRQF_PROBE); + set_irq_flags(irq, IRQF_VALID | IRQF_PROBE); } set_irq_flags(MAINSTONE_IRQ(8), 0); set_irq_flags(MAINSTONE_IRQ(12), 0); @@ -161,14 +157,14 @@ static struct platform_device smc91x_device = { .resource = smc91x_resources, }; -static int mst_audio_startup(struct snd_pcm_substream *substream, void *priv) +static int mst_audio_startup(snd_pcm_substream_t *substream, void *priv) { if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) MST_MSCWR2 &= ~MST_MSCWR2_AC97_SPKROFF; return 0; } -static void mst_audio_shutdown(struct snd_pcm_substream *substream, void *priv) +static void mst_audio_shutdown(snd_pcm_substream_t *substream, void *priv) { if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) MST_MSCWR2 |= MST_MSCWR2_AC97_SPKROFF; @@ -332,7 +328,7 @@ static int mainstone_mci_init(struct device *dev, irqreturn_t (*mstone_detect_in */ MST_MSCWR1 &= ~MST_MSCWR1_MS_SEL; - err = request_irq(MAINSTONE_MMC_IRQ, mstone_detect_int, IRQF_DISABLED, + err = request_irq(MAINSTONE_MMC_IRQ, mstone_detect_int, SA_INTERRUPT, "MMC card detect", data); if (err) { printk(KERN_ERR "mainstone_mci_init: MMC/SD: can't request MMC card detect IRQ\n"); @@ -494,7 +490,6 @@ static void __init mainstone_map_io(void) MACHINE_START(MAINSTONE, "Intel HCDDBBVA0 Development Platform (aka Mainstone)") /* Maintainer: MontaVista Software Inc. */ .phys_io = 0x40000000, - .boot_params = 0xa0000100, /* BLOB boot parameter setting */ .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc, .map_io = mainstone_map_io, .init_irq = mainstone_init_irq, diff --git a/arch/arm/mach-pxa/pm.c b/arch/arm/mach-pxa/pm.c index 2112c414f..852ea72d8 100644 --- a/arch/arm/mach-pxa/pm.c +++ b/arch/arm/mach-pxa/pm.c @@ -10,6 +10,7 @@ * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License. */ +#include #include #include #include diff --git a/arch/arm/mach-pxa/poodle.c b/arch/arm/mach-pxa/poodle.c index 6dbff6d94..911e6ff5a 100644 --- a/arch/arm/mach-pxa/poodle.c +++ b/arch/arm/mach-pxa/poodle.c @@ -18,34 +18,29 @@ #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 "generic.h" -#include "sharpsl.h" static struct resource poodle_scoop_resources[] = { [0] = { @@ -123,71 +118,13 @@ static struct resource locomo_resources[] = { }, }; -struct platform_device poodle_locomo_device = { +static struct platform_device locomo_device = { .name = "locomo", .id = 0, .num_resources = ARRAY_SIZE(locomo_resources), .resource = locomo_resources, }; -EXPORT_SYMBOL(poodle_locomo_device); - -/* - * Poodle SSP Device - */ - -struct platform_device poodle_ssp_device = { - .name = "corgi-ssp", - .id = -1, -}; - -struct corgissp_machinfo poodle_ssp_machinfo = { - .port = 1, - .cs_lcdcon = -1, - .cs_ads7846 = -1, - .cs_max1111 = -1, - .clk_lcdcon = 2, - .clk_ads7846 = 36, - .clk_max1111 = 2, -}; - - -/* - * Poodle Touch Screen Device - */ -static struct resource poodlets_resources[] = { - [0] = { - .start = POODLE_IRQ_GPIO_TP_INT, - .end = POODLE_IRQ_GPIO_TP_INT, - .flags = IORESOURCE_IRQ, - }, -}; - -static unsigned long poodle_get_hsync_len(void) -{ - return 0; -} - -static void poodle_null_hsync(void) -{ -} - -static struct corgits_machinfo poodle_ts_machinfo = { - .get_hsync_len = poodle_get_hsync_len, - .put_hsync = poodle_null_hsync, - .wait_hsync = poodle_null_hsync, -}; - -static struct platform_device poodle_ts_device = { - .name = "corgi-ts", - .dev = { - .platform_data = &poodle_ts_machinfo, - }, - .id = -1, - .num_resources = ARRAY_SIZE(poodlets_resources), - .resource = poodlets_resources, -}; - /* * MMC/SD Device @@ -205,14 +142,12 @@ static int poodle_mci_init(struct device *dev, irqreturn_t (*poodle_detect_int)( pxa_gpio_mode(GPIO6_MMCCLK_MD); pxa_gpio_mode(GPIO8_MMCCS0_MD); pxa_gpio_mode(POODLE_GPIO_nSD_DETECT | GPIO_IN); - pxa_gpio_mode(POODLE_GPIO_nSD_WP | GPIO_IN); pxa_gpio_mode(POODLE_GPIO_SD_PWR | GPIO_OUT); - pxa_gpio_mode(POODLE_GPIO_SD_PWR1 | GPIO_OUT); poodle_mci_platform_data.detect_delay = msecs_to_jiffies(250); err = request_irq(POODLE_IRQ_GPIO_nSD_DETECT, poodle_detect_int, - IRQF_DISABLED | IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, + SA_INTERRUPT | SA_TRIGGER_RISING | SA_TRIGGER_FALLING, "MMC card detect", data); if (err) { printk(KERN_ERR "poodle_mci_init: MMC/SD: can't request MMC card detect IRQ\n"); @@ -226,22 +161,12 @@ static void poodle_mci_setpower(struct device *dev, unsigned int vdd) { struct pxamci_platform_data* p_d = dev->platform_data; - if (( 1 << vdd) & p_d->ocr_mask) { - GPSR(POODLE_GPIO_SD_PWR) = GPIO_bit(POODLE_GPIO_SD_PWR); - mdelay(2); - GPSR(POODLE_GPIO_SD_PWR1) = GPIO_bit(POODLE_GPIO_SD_PWR1); - } else { - GPCR(POODLE_GPIO_SD_PWR1) = GPIO_bit(POODLE_GPIO_SD_PWR1); - GPCR(POODLE_GPIO_SD_PWR) = GPIO_bit(POODLE_GPIO_SD_PWR); - } -} - -static int poodle_mci_get_ro(struct device *dev) -{ - return GPLR(POODLE_GPIO_nSD_WP) & GPIO_bit(POODLE_GPIO_nSD_WP); + if (( 1 << vdd) & p_d->ocr_mask) + GPSR1 = GPIO_bit(POODLE_GPIO_SD_PWR); + else + GPCR1 = GPIO_bit(POODLE_GPIO_SD_PWR); } - static void poodle_mci_exit(struct device *dev, void *data) { free_irq(POODLE_IRQ_GPIO_nSD_DETECT, data); @@ -250,7 +175,6 @@ static void poodle_mci_exit(struct device *dev, void *data) static struct pxamci_platform_data poodle_mci_platform_data = { .ocr_mask = MMC_VDD_32_33|MMC_VDD_33_34, .init = poodle_mci_init, - .get_ro = poodle_mci_get_ro, .setpower = poodle_mci_setpower, .exit = poodle_mci_exit, }; @@ -320,31 +244,14 @@ static struct pxafb_mach_info poodle_fb_info __initdata = { }; static struct platform_device *devices[] __initdata = { - &poodle_locomo_device, + &locomo_device, &poodle_scoop_device, - &poodle_ssp_device, - &poodle_ts_device, }; -static void poodle_poweroff(void) -{ - RCSR = RCSR_HWR | RCSR_WDR | RCSR_SMR | RCSR_GPR; - arm_machine_restart('h'); -} - -static void poodle_restart(char mode) -{ - RCSR = RCSR_HWR | RCSR_WDR | RCSR_SMR | RCSR_GPR; - arm_machine_restart('h'); -} - static void __init poodle_init(void) { int ret = 0; - pm_power_off = poodle_poweroff; - arm_pm_restart = poodle_restart; - /* setup sleep mode values */ PWER = 0x00000002; PFER = 0x00000000; @@ -382,7 +289,6 @@ static void __init poodle_init(void) GPSR1 = 0x00000000; GPSR2 = 0x00000000; - set_pxa_fb_parent(&poodle_locomo_device.dev); set_pxa_fb_info(&poodle_fb_info); pxa_gpio_mode(POODLE_GPIO_USB_PULLUP | GPIO_OUT); pxa_gpio_mode(POODLE_GPIO_IR_ON | GPIO_OUT); @@ -396,17 +302,12 @@ static void __init poodle_init(void) if (ret) { printk(KERN_WARNING "poodle: Unable to register LoCoMo device\n"); } - corgi_ssp_set_machinfo(&poodle_ssp_machinfo); } static void __init fixup_poodle(struct machine_desc *desc, struct tag *tags, char **cmdline, struct meminfo *mi) { sharpsl_save_param(); - mi->nr_banks=1; - mi->bank[0].start = 0xa0000000; - mi->bank[0].node = 0; - mi->bank[0].size = (32*1024*1024); } MACHINE_START(POODLE, "SHARP Poodle") diff --git a/arch/arm/mach-pxa/pxa25x.c b/arch/arm/mach-pxa/pxa25x.c index c1f21739b..573a5758e 100644 --- a/arch/arm/mach-pxa/pxa25x.c +++ b/arch/arm/mach-pxa/pxa25x.c @@ -16,6 +16,7 @@ * initialization stuff for PXA machines which can be overridden later if * need be. */ +#include #include #include #include diff --git a/arch/arm/mach-pxa/pxa27x.c b/arch/arm/mach-pxa/pxa27x.c index 74eeada1e..3baa70819 100644 --- a/arch/arm/mach-pxa/pxa27x.c +++ b/arch/arm/mach-pxa/pxa27x.c @@ -11,6 +11,7 @@ * 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-pxa/sharpsl_pm.c b/arch/arm/mach-pxa/sharpsl_pm.c index db6e8f56a..6d402b262 100644 --- a/arch/arm/mach-pxa/sharpsl_pm.c +++ b/arch/arm/mach-pxa/sharpsl_pm.c @@ -18,11 +18,11 @@ #include #include #include -#include #include #include #include +#include #include #include #include @@ -128,9 +128,6 @@ struct battery_thresh spitz_battery_levels_noac[] = { */ int sharpsl_pm_pxa_read_max1111(int channel) { - if (machine_is_tosa()) // Ugly, better move this function into another module - return 0; - return corgi_ssp_max1111_get((channel << MAXCTRL_SEL_SH) | MAXCTRL_PD0 | MAXCTRL_PD1 | MAXCTRL_SGL | MAXCTRL_UNI | MAXCTRL_STR); } @@ -142,27 +139,27 @@ void sharpsl_pm_pxa_init(void) pxa_gpio_mode(sharpsl_pm.machinfo->gpio_batlock | GPIO_IN); /* Register interrupt handlers */ - if (request_irq(IRQ_GPIO(sharpsl_pm.machinfo->gpio_acin), sharpsl_ac_isr, IRQF_DISABLED, "AC Input Detect", sharpsl_ac_isr)) { + if (request_irq(IRQ_GPIO(sharpsl_pm.machinfo->gpio_acin), sharpsl_ac_isr, SA_INTERRUPT, "AC Input Detect", sharpsl_ac_isr)) { dev_err(sharpsl_pm.dev, "Could not get irq %d.\n", IRQ_GPIO(sharpsl_pm.machinfo->gpio_acin)); } else set_irq_type(IRQ_GPIO(sharpsl_pm.machinfo->gpio_acin),IRQT_BOTHEDGE); - if (request_irq(IRQ_GPIO(sharpsl_pm.machinfo->gpio_batlock), sharpsl_fatal_isr, IRQF_DISABLED, "Battery Cover", sharpsl_fatal_isr)) { + if (request_irq(IRQ_GPIO(sharpsl_pm.machinfo->gpio_batlock), sharpsl_fatal_isr, SA_INTERRUPT, "Battery Cover", sharpsl_fatal_isr)) { dev_err(sharpsl_pm.dev, "Could not get irq %d.\n", IRQ_GPIO(sharpsl_pm.machinfo->gpio_batlock)); } else set_irq_type(IRQ_GPIO(sharpsl_pm.machinfo->gpio_batlock),IRQT_FALLING); if (sharpsl_pm.machinfo->gpio_fatal) { - if (request_irq(IRQ_GPIO(sharpsl_pm.machinfo->gpio_fatal), sharpsl_fatal_isr, IRQF_DISABLED, "Fatal Battery", sharpsl_fatal_isr)) { + if (request_irq(IRQ_GPIO(sharpsl_pm.machinfo->gpio_fatal), sharpsl_fatal_isr, SA_INTERRUPT, "Fatal Battery", sharpsl_fatal_isr)) { dev_err(sharpsl_pm.dev, "Could not get irq %d.\n", IRQ_GPIO(sharpsl_pm.machinfo->gpio_fatal)); } else set_irq_type(IRQ_GPIO(sharpsl_pm.machinfo->gpio_fatal),IRQT_FALLING); } - if (sharpsl_pm.machinfo->batfull_irq) + if (!machine_is_corgi()) { /* Register interrupt handler. */ - if (request_irq(IRQ_GPIO(sharpsl_pm.machinfo->gpio_batfull), sharpsl_chrg_full_isr, IRQF_DISABLED, "CO", sharpsl_chrg_full_isr)) { + if (request_irq(IRQ_GPIO(sharpsl_pm.machinfo->gpio_batfull), sharpsl_chrg_full_isr, SA_INTERRUPT, "CO", sharpsl_chrg_full_isr)) { dev_err(sharpsl_pm.dev, "Could not get irq %d.\n", IRQ_GPIO(sharpsl_pm.machinfo->gpio_batfull)); } else set_irq_type(IRQ_GPIO(sharpsl_pm.machinfo->gpio_batfull),IRQT_RISING); @@ -177,6 +174,6 @@ void sharpsl_pm_pxa_remove(void) if (sharpsl_pm.machinfo->gpio_fatal) free_irq(IRQ_GPIO(sharpsl_pm.machinfo->gpio_fatal), sharpsl_fatal_isr); - if (sharpsl_pm.machinfo->batfull_irq) + if (!machine_is_corgi()) free_irq(IRQ_GPIO(sharpsl_pm.machinfo->gpio_batfull), sharpsl_chrg_full_isr); } diff --git a/arch/arm/mach-pxa/sleep.S b/arch/arm/mach-pxa/sleep.S index 15874b360..c9862688f 100644 --- a/arch/arm/mach-pxa/sleep.S +++ b/arch/arm/mach-pxa/sleep.S @@ -11,6 +11,7 @@ * modify it under the terms of the GNU General Public License. */ +#include #include #include #include @@ -188,7 +189,7 @@ ENTRY(pxa_cpu_suspend) .data .align 5 ENTRY(pxa_cpu_resume) - mov r0, #PSR_I_BIT | PSR_F_BIT | SVC_MODE @ set SVC, irqs off + mov r0, #PSR_I_BIT | PSR_F_BIT | MODE_SVC @ set SVC, irqs off msr cpsr_c, r0 ldr r0, sleep_save_sp @ stack phys addr diff --git a/arch/arm/mach-pxa/spitz.c b/arch/arm/mach-pxa/spitz.c index 1c32a9310..c094d99eb 100644 --- a/arch/arm/mach-pxa/spitz.c +++ b/arch/arm/mach-pxa/spitz.c @@ -20,7 +20,6 @@ #include #include #include -#include #include #include @@ -28,13 +27,13 @@ #include #include #include -#include #include #include #include #include +#include #include #include #include @@ -222,8 +221,6 @@ struct corgissp_machinfo spitz_ssp_machinfo = { * Spitz Backlight Device */ static struct corgibl_machinfo spitz_bl_machinfo = { - .default_intensity = 0x1f, - .limit_mask = 0x0b, .max_intensity = 0x2f, }; @@ -245,14 +242,6 @@ static struct platform_device spitzkbd_device = { }; -/* - * Spitz LEDs - */ -static struct platform_device spitzled_device = { - .name = "spitz-led", - .id = -1, -}; - /* * Spitz Touch Screen Device */ @@ -308,7 +297,7 @@ static int spitz_mci_init(struct device *dev, irqreturn_t (*spitz_detect_int)(in spitz_mci_platform_data.detect_delay = msecs_to_jiffies(250); err = request_irq(SPITZ_IRQ_GPIO_nSD_DETECT, spitz_detect_int, - IRQF_DISABLED | IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, + SA_INTERRUPT | SA_TRIGGER_RISING | SA_TRIGGER_FALLING, "MMC card detect", data); if (err) { printk(KERN_ERR "spitz_mci_init: MMC/SD: can't request MMC card detect IRQ\n"); @@ -373,7 +362,6 @@ static int spitz_ohci_init(struct device *dev) static struct pxaohci_platform_data spitz_ohci_platform_data = { .port_mode = PMM_NPS_MODE, .init = spitz_ohci_init, - .power_budget = 150, }; @@ -431,34 +419,10 @@ static struct platform_device *devices[] __initdata = { &spitzkbd_device, &spitzts_device, &spitzbl_device, - &spitzled_device, }; -static void spitz_poweroff(void) -{ - RCSR = RCSR_HWR | RCSR_WDR | RCSR_SMR | RCSR_GPR; - - pxa_gpio_mode(SPITZ_GPIO_ON_RESET | GPIO_OUT); - GPSR(SPITZ_GPIO_ON_RESET) = GPIO_bit(SPITZ_GPIO_ON_RESET); - - mdelay(1000); - arm_machine_restart('h'); -} - -static void spitz_restart(char mode) -{ - /* Bootloader magic for a reboot */ - if((MSC0 & 0xffff0000) == 0x7ff00000) - MSC0 = (MSC0 & 0xffff) | 0x7ee00000; - - spitz_poweroff(); -} - static void __init common_init(void) { - pm_power_off = spitz_poweroff; - arm_pm_restart = spitz_restart; - PMCR = 0x00; /* setup sleep mode values */ @@ -504,8 +468,6 @@ struct platform_device akitaioexp_device = { .id = -1, }; -EXPORT_SYMBOL_GPL(akitaioexp_device); - static void __init akita_init(void) { spitz_ficp_platform_data.transceiver_mode = akita_irda_transceiver_mode; diff --git a/arch/arm/mach-pxa/spitz_pm.c b/arch/arm/mach-pxa/spitz_pm.c index 40be83307..5e5bdc898 100644 --- a/arch/arm/mach-pxa/spitz_pm.c +++ b/arch/arm/mach-pxa/spitz_pm.c @@ -27,13 +27,6 @@ #include #include "sharpsl.h" -#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 */ - static int spitz_last_ac_status; static void spitz_charger_init(void) @@ -197,7 +190,6 @@ struct sharpsl_charger_machinfo spitz_pm_machinfo = { .gpio_batlock = SPITZ_GPIO_BAT_COVER, .gpio_acin = SPITZ_GPIO_AC_IN, .gpio_batfull = SPITZ_GPIO_CHRG_FULL, - .batfull_irq = 1, .gpio_fatal = SPITZ_GPIO_FATAL_BAT, .discharge = spitz_discharge, .discharge1 = spitz_discharge1, @@ -208,13 +200,6 @@ struct sharpsl_charger_machinfo spitz_pm_machinfo = { .read_devdata = spitzpm_read_devdata, .charger_wakeup = spitz_charger_wakeup, .should_wakeup = spitz_should_wakeup, - .backlight_limit = corgibl_limit_intensity, - .charge_on_volt = SHARPSL_CHARGE_ON_VOLT, - .charge_on_temp = SHARPSL_CHARGE_ON_TEMP, - .charge_acin_high = SHARPSL_CHARGE_ON_ACIN_HIGH, - .charge_acin_low = SHARPSL_CHARGE_ON_ACIN_LOW, - .fatal_acin_volt = SHARPSL_FATAL_ACIN_VOLT, - .fatal_noacin_volt= SHARPSL_FATAL_NOACIN_VOLT, .bat_levels = 40, .bat_levels_noac = spitz_battery_levels_noac, .bat_levels_acin = spitz_battery_levels_acin, diff --git a/arch/arm/mach-pxa/ssp.c b/arch/arm/mach-pxa/ssp.c index 1fddfeaa6..93096befd 100644 --- a/arch/arm/mach-pxa/ssp.c +++ b/arch/arm/mach-pxa/ssp.c @@ -40,8 +40,6 @@ #define PXA_SSP_PORTS 3 -#define TIMEOUT 100000 - struct ssp_info_ { int irq; u32 clock; @@ -94,18 +92,13 @@ static irqreturn_t ssp_interrupt(int irq, void *dev_id, struct pt_regs *regs) * The caller is expected to perform the necessary locking. * * Returns: - * %-ETIMEDOUT timeout occurred + * %-ETIMEDOUT timeout occurred (for future) * 0 success */ int ssp_write_word(struct ssp_dev *dev, u32 data) { - int timeout = TIMEOUT; - - while (!(SSSR_P(dev->port) & SSSR_TNF)) { - if (!--timeout) - return -ETIMEDOUT; + while (!(SSSR_P(dev->port) & SSSR_TNF)) cpu_relax(); - } SSDR_P(dev->port) = data; @@ -124,21 +117,15 @@ int ssp_write_word(struct ssp_dev *dev, u32 data) * The caller is expected to perform the necessary locking. * * Returns: - * %-ETIMEDOUT timeout occurred + * %-ETIMEDOUT timeout occurred (for future) * 32-bit data success */ -int ssp_read_word(struct ssp_dev *dev, u32 *data) +int ssp_read_word(struct ssp_dev *dev) { - int timeout = TIMEOUT; - - while (!(SSSR_P(dev->port) & SSSR_RNE)) { - if (!--timeout) - return -ETIMEDOUT; + while (!(SSSR_P(dev->port) & SSSR_RNE)) cpu_relax(); - } - *data = SSDR_P(dev->port); - return 0; + return SSDR_P(dev->port); } /** @@ -149,21 +136,13 @@ int ssp_read_word(struct ssp_dev *dev, u32 *data) * * The caller is expected to perform the necessary locking. */ -int ssp_flush(struct ssp_dev *dev) +void ssp_flush(struct ssp_dev *dev) { - int timeout = TIMEOUT * 2; - do { while (SSSR_P(dev->port) & SSSR_RNE) { - if (!--timeout) - return -ETIMEDOUT; (void) SSDR_P(dev->port); } - if (!--timeout) - return -ETIMEDOUT; } while (SSSR_P(dev->port) & SSSR_BSY); - - return 0; } /** diff --git a/arch/arm/mach-pxa/standby.S b/arch/arm/mach-pxa/standby.S index d774430d0..6f6dbbd08 100644 --- a/arch/arm/mach-pxa/standby.S +++ b/arch/arm/mach-pxa/standby.S @@ -9,6 +9,7 @@ * or implied. */ +#include #include #include #include diff --git a/arch/arm/mach-pxa/time.c b/arch/arm/mach-pxa/time.c index 5dbd191c5..b9b205734 100644 --- a/arch/arm/mach-pxa/time.c +++ b/arch/arm/mach-pxa/time.c @@ -10,6 +10,7 @@ * published by the Free Software Foundation. */ +#include #include #include #include @@ -117,7 +118,7 @@ pxa_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs) static struct irqaction pxa_timer_irq = { .name = "PXA Timer Tick", - .flags = IRQF_DISABLED | IRQF_TIMER, + .flags = SA_INTERRUPT | SA_TIMER, .handler = pxa_timer_interrupt, }; diff --git a/arch/arm/mach-pxa/tosa.c b/arch/arm/mach-pxa/tosa.c index 249353616..d168286ed 100644 --- a/arch/arm/mach-pxa/tosa.c +++ b/arch/arm/mach-pxa/tosa.c @@ -19,15 +19,12 @@ #include #include #include -#include -#include #include #include #include #include #include -#include #include #include #include @@ -37,6 +34,7 @@ #include #include +#include #include #include @@ -185,7 +183,7 @@ static int tosa_mci_init(struct device *dev, irqreturn_t (*tosa_detect_int)(int, tosa_mci_platform_data.detect_delay = msecs_to_jiffies(250); - err = request_irq(TOSA_IRQ_GPIO_nSD_DETECT, tosa_detect_int, IRQF_DISABLED, + err = request_irq(TOSA_IRQ_GPIO_nSD_DETECT, tosa_detect_int, SA_INTERRUPT, "MMC/SD card detect", data); if (err) { printk(KERN_ERR "tosa_mci_init: MMC/SD: can't request MMC card detect IRQ\n"); @@ -254,46 +252,14 @@ static struct platform_device tosakbd_device = { .id = -1, }; -/* - * Tosa LEDs - */ -static struct platform_device tosaled_device = { - .name = "tosa-led", - .id = -1, -}; - static struct platform_device *devices[] __initdata = { &tosascoop_device, &tosascoop_jc_device, &tosakbd_device, - &tosaled_device, }; -static void tosa_poweroff(void) -{ - RCSR = RCSR_HWR | RCSR_WDR | RCSR_SMR | RCSR_GPR; - - pxa_gpio_mode(TOSA_GPIO_ON_RESET | GPIO_OUT); - GPSR(TOSA_GPIO_ON_RESET) = GPIO_bit(TOSA_GPIO_ON_RESET); - - mdelay(1000); - arm_machine_restart('h'); -} - -static void tosa_restart(char mode) -{ - /* Bootloader magic for a reboot */ - if((MSC0 & 0xffff0000) == 0x7ff00000) - MSC0 = (MSC0 & 0xffff) | 0x7ee00000; - - tosa_poweroff(); -} - static void __init tosa_init(void) { - pm_power_off = tosa_poweroff; - arm_pm_restart = tosa_restart; - pxa_gpio_mode(TOSA_GPIO_ON_RESET | GPIO_IN); pxa_gpio_mode(TOSA_GPIO_TC6393_INT | GPIO_IN); pxa_gpio_mode(TOSA_GPIO_USB_IN | GPIO_IN); diff --git a/arch/arm/mach-realview/core.c b/arch/arm/mach-realview/core.c index da0286973..4303d988c 100644 --- a/arch/arm/mach-realview/core.c +++ b/arch/arm/mach-realview/core.c @@ -18,6 +18,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +#include #include #include #include @@ -201,6 +202,11 @@ struct clk realview_clcd_clk = { /* * CLCD support. */ +#define SYS_CLCD_MODE_MASK (3 << 0) +#define SYS_CLCD_MODE_888 (0 << 0) +#define SYS_CLCD_MODE_5551 (1 << 0) +#define SYS_CLCD_MODE_565_RLSB (2 << 0) +#define SYS_CLCD_MODE_565_BLSB (3 << 0) #define SYS_CLCD_NLCDIOON (1 << 2) #define SYS_CLCD_VDDPOSSWITCH (1 << 3) #define SYS_CLCD_PWR3V5SWITCH (1 << 4) @@ -354,10 +360,29 @@ static void realview_clcd_enable(struct clcd_fb *fb) void __iomem *sys_clcd = __io_address(REALVIEW_SYS_BASE) + REALVIEW_SYS_CLCD_OFFSET; u32 val; + val = readl(sys_clcd); + val &= ~SYS_CLCD_MODE_MASK; + + switch (fb->fb.var.green.length) { + case 5: + val |= SYS_CLCD_MODE_5551; + break; + case 6: + val |= SYS_CLCD_MODE_565_RLSB; + break; + case 8: + val |= SYS_CLCD_MODE_888; + break; + } + /* - * Enable the PSUs + * Set the MUX + */ + writel(val, sys_clcd); + + /* + * And now enable the PSUs */ - val = readl(sys_clcd); val |= SYS_CLCD_NLCDIOON | SYS_CLCD_PWR3V5SWITCH; writel(val, sys_clcd); } @@ -536,7 +561,7 @@ static irqreturn_t realview_timer_interrupt(int irq, void *dev_id, struct pt_reg static struct irqaction realview_timer_irq = { .name = "RealView Timer Tick", - .flags = IRQF_DISABLED | IRQF_TIMER, + .flags = SA_INTERRUPT | SA_TIMER, .handler = realview_timer_interrupt, }; diff --git a/arch/arm/mach-realview/realview_eb.c b/arch/arm/mach-realview/realview_eb.c index 84a959530..d4a586e38 100644 --- a/arch/arm/mach-realview/realview_eb.c +++ b/arch/arm/mach-realview/realview_eb.c @@ -19,6 +19,7 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +#include #include #include #include @@ -136,11 +137,8 @@ static struct amba_device *amba_devs[] __initdata = { static void __init gic_init_irq(void) { #ifdef CONFIG_REALVIEW_MPCORE - unsigned int pldctrl; writel(0x0000a05f, __io_address(REALVIEW_SYS_LOCK)); - pldctrl = readl(__io_address(REALVIEW_SYS_BASE) + 0xd8); - pldctrl |= 0x00800000; /* New irq mode */ - writel(pldctrl, __io_address(REALVIEW_SYS_BASE) + 0xd8); + writel(0x008003c0, __io_address(REALVIEW_SYS_BASE) + 0xd8); writel(0x00000000, __io_address(REALVIEW_SYS_LOCK)); #endif gic_dist_init(__io_address(REALVIEW_GIC_DIST_BASE)); diff --git a/arch/arm/mach-rpc/dma.c b/arch/arm/mach-rpc/dma.c index ac511d41d..bd86ffba8 100644 --- a/arch/arm/mach-rpc/dma.c +++ b/arch/arm/mach-rpc/dma.c @@ -128,7 +128,7 @@ static irqreturn_t iomd_dma_handle(int irq, void *dev_id, struct pt_regs *regs) static int iomd_request_dma(dmach_t channel, dma_t *dma) { return request_irq(dma->dma_irq, iomd_dma_handle, - IRQF_DISABLED, dma->device_id, dma); + SA_INTERRUPT, dma->device_id, dma); } static void iomd_free_dma(dmach_t channel, dma_t *dma) diff --git a/arch/arm/mach-s3c2410/Kconfig b/arch/arm/mach-s3c2410/Kconfig index bbd138be6..0b9d7ca49 100644 --- a/arch/arm/mach-s3c2410/Kconfig +++ b/arch/arm/mach-s3c2410/Kconfig @@ -9,13 +9,6 @@ config MACH_ANUBIS Say Y gere if you are using the Simtec Electronics ANUBIS development system -config MACH_OSIRIS - bool "Simtec IM2440D20 (OSIRIS) module" - select CPU_S3C2440 - help - Say Y here if you are using the Simtec IM2440D20 module, also - known as the Osiris. - config ARCH_BAST bool "Simtec Electronics BAST (EB2410ITX)" select CPU_S3C2410 @@ -50,15 +43,9 @@ config MACH_N30 . -config MACH_SMDK - bool - help - Common machine code for SMDK2410 and SMDK2440 - config ARCH_SMDK2410 bool "SMDK2410/A9M2410" select CPU_S3C2410 - select MACH_SMDK help Say Y here if you are using the SMDK2410 or the derived module A9M2410 @@ -66,36 +53,9 @@ config ARCH_SMDK2410 config ARCH_S3C2440 bool "SMDK2440" select CPU_S3C2440 - select MACH_SMDK help Say Y here if you are using the SMDK2440. -config SMDK2440_CPU2440 - bool "SMDK2440 with S3C2440 CPU module" - depends on ARCH_S3C2440 - default y if ARCH_S3C2440 - select CPU_S3C2440 - -config SMDK2440_CPU2442 - bool "SMDM2440 with S3C2442 CPU module" - depends on ARCH_S3C2440 - select CPU_S3C2442 - -config MACH_S3C2413 - bool - help - Internal node for S3C2413 verison of SMDK2413, so that - machine_is_s3c2413() will work when MACH_SMDK2413 is - selected - -config MACH_SMDK2413 - bool "SMDK2413" - select CPU_S3C2412 - select MACH_S3C2413 - select MACH_SMDK - help - Say Y here if you are using an SMDK2413 - config MACH_VR1000 bool "Thorcom VR1000" select CPU_S3C2410 @@ -128,55 +88,19 @@ config MACH_NEXCODER_2440 endmenu -config S3C2410_CLOCK - bool - help - Clock code for the S3C2410, and similar processors - config CPU_S3C2410 bool depends on ARCH_S3C2410 - select S3C2410_CLOCK help Support for S3C2410 and S3C2410A family from the S3C24XX line of Samsung Mobile CPUs. -# internal node to signify if we are only dealing with an S3C2412 - -config CPU_S3C2412_ONLY - bool - depends on ARCH_S3C2410 && !CPU_S3C2400 && !CPU_S3C2410 && \ - !CPU_S3C2440 && !CPU_S3C2442 && CPU_S3C2412 - default y if CPU_S3C2412 - -config CPU_S3C2412 - bool - depends on ARCH_S3C2410 - help - Support for the S3C2412 and S3C2413 SoCs from the S3C24XX line - -config CPU_S3C244X - bool - depends on ARCH_S3C2410 && (CPU_S3C2440 || CPU_S3C2442) - help - Support for S3C2440 and S3C2442 Samsung Mobile CPU based systems. - config CPU_S3C2440 bool depends on ARCH_S3C2410 - select S3C2410_CLOCK - select CPU_S3C244X help Support for S3C2440 Samsung Mobile CPU based systems. -config CPU_S3C2442 - bool - depends on ARCH_S3C2420 - select S3C2410_CLOCK - select CPU_S3C244X - help - Support for S3C2442 Samsung Mobile CPU based systems. - comment "S3C2410 Boot" config S3C2410_BOOT_WATCHDOG @@ -232,7 +156,7 @@ config S3C2410_PM_DEBUG depends on ARCH_S3C2410 && PM help Say Y here if you want verbose debugging from the PM Suspend and - Resume code. See + Resume code. See `Documentation/arm/Samsing-S3C24XX/Suspend.txt` for more information. config S3C2410_PM_CHECK diff --git a/arch/arm/mach-s3c2410/Makefile b/arch/arm/mach-s3c2410/Makefile index 0eadec916..1217bf003 100644 --- a/arch/arm/mach-s3c2410/Makefile +++ b/arch/arm/mach-s3c2410/Makefile @@ -10,48 +10,26 @@ obj-m := obj-n := obj- := -# DMA -obj-$(CONFIG_S3C2410_DMA) += dma.o - # S3C2400 support files -obj-$(CONFIG_CPU_S3C2400) += s3c2400-gpio.o +obj-$(CONFIG_CPU_S3C2400) += s3c2400-gpio.o # S3C2410 support files -obj-$(CONFIG_CPU_S3C2410) += s3c2410.o -obj-$(CONFIG_CPU_S3C2410) += s3c2410-gpio.o +obj-$(CONFIG_CPU_S3C2410) += s3c2410.o +obj-$(CONFIG_CPU_S3C2410) += s3c2410-gpio.o +obj-$(CONFIG_S3C2410_DMA) += dma.o # Power Management support -obj-$(CONFIG_PM) += pm.o sleep.o -obj-$(CONFIG_PM_SIMTEC) += pm-simtec.o - -# S3C2412 support -obj-$(CONFIG_CPU_S3C2412) += s3c2412.o -obj-$(CONFIG_CPU_S3C2412) += s3c2412-irq.o -obj-$(CONFIG_CPU_S3C2412) += s3c2412-clock.o - -# -# S3C244X support - -obj-$(CONFIG_CPU_S3C244X) += s3c244x.o -obj-$(CONFIG_CPU_S3C244X) += s3c244x-irq.o - -# Clock control - -obj-$(CONFIG_S3C2410_CLOCK) += s3c2410-clock.o +obj-$(CONFIG_PM) += pm.o sleep.o +obj-$(CONFIG_PM_SIMTEC) += pm-simtec.o # S3C2440 support -obj-$(CONFIG_CPU_S3C2440) += s3c2440.o s3c2440-dsc.o -obj-$(CONFIG_CPU_S3C2440) += s3c2440-irq.o -obj-$(CONFIG_CPU_S3C2440) += s3c2440-clock.o -obj-$(CONFIG_CPU_S3C2440) += s3c2410-gpio.o - -# S3C2442 support - -obj-$(CONFIG_CPU_S3C2442) += s3c2442.o -obj-$(CONFIG_CPU_S3C2442) += s3c2442-clock.o +obj-$(CONFIG_CPU_S3C2440) += s3c2440.o s3c2440-dsc.o +obj-$(CONFIG_CPU_S3C2440) += s3c2440-irq.o +obj-$(CONFIG_CPU_S3C2440) += s3c2440-clock.o +obj-$(CONFIG_CPU_S3C2440) += s3c2410-gpio.o # bast extras @@ -60,16 +38,12 @@ obj-$(CONFIG_BAST_PC104_IRQ) += bast-irq.o # machine specific support obj-$(CONFIG_MACH_ANUBIS) += mach-anubis.o -obj-$(CONFIG_MACH_OSIRIS) += mach-osiris.o obj-$(CONFIG_ARCH_BAST) += mach-bast.o usb-simtec.o obj-$(CONFIG_ARCH_H1940) += mach-h1940.o obj-$(CONFIG_MACH_N30) += mach-n30.o obj-$(CONFIG_ARCH_SMDK2410) += mach-smdk2410.o -obj-$(CONFIG_MACH_SMDK2413) += mach-smdk2413.o obj-$(CONFIG_ARCH_S3C2440) += mach-smdk2440.o obj-$(CONFIG_MACH_VR1000) += mach-vr1000.o usb-simtec.o obj-$(CONFIG_MACH_RX3715) += mach-rx3715.o obj-$(CONFIG_MACH_OTOM) += mach-otom.o obj-$(CONFIG_MACH_NEXCODER_2440) += mach-nexcoder.o - -obj-$(CONFIG_MACH_SMDK) += common-smdk.o \ No newline at end of file diff --git a/arch/arm/mach-s3c2410/bast-irq.c b/arch/arm/mach-s3c2410/bast-irq.c index def4441d2..fbbeb0553 100644 --- a/arch/arm/mach-s3c2410/bast-irq.c +++ b/arch/arm/mach-s3c2410/bast-irq.c @@ -136,8 +136,8 @@ bast_irq_pc104_demux(unsigned int irq, for (i = 0; stat != 0; i++, stat >>= 1) { if (stat & 1) { irqno = bast_pc104_irqs[i]; - desc = irq_desc + irqno; - desc_handle_irq(irqno, desc, regs); + + desc_handle_irq(irqno, irq_desc + irqno, regs); } } } @@ -156,7 +156,7 @@ static __init int bast_irq_init(void) set_irq_chained_handler(IRQ_ISA, bast_irq_pc104_demux); - /* register our IRQs */ + /* reigster our IRQs */ for (i = 0; i < 4; i++) { unsigned int irqno = bast_pc104_irqs[i]; diff --git a/arch/arm/mach-s3c2410/clock.c b/arch/arm/mach-s3c2410/clock.c index e13fb6778..08489efda 100644 --- a/arch/arm/mach-s3c2410/clock.c +++ b/arch/arm/mach-s3c2410/clock.c @@ -3,7 +3,7 @@ * Copyright (c) 2004-2005 Simtec Electronics * Ben Dooks * - * S3C24XX Core clock control support + * S3C2410 Clock control support * * Based on, and code from linux/arch/arm/mach-versatile/clock.c ** @@ -38,14 +38,12 @@ #include #include #include -#include #include #include #include #include -#include #include "clock.h" #include "cpu.h" @@ -53,8 +51,26 @@ /* clock information */ static LIST_HEAD(clocks); +static DEFINE_MUTEX(clocks_mutex); -DEFINE_MUTEX(clocks_mutex); +/* old functions */ + +void inline s3c24xx_clk_enable(unsigned int clocks, unsigned int enable) +{ + unsigned long clkcon; + + clkcon = __raw_readl(S3C2410_CLKCON); + + if (enable) + clkcon |= clocks; + else + clkcon &= ~clocks; + + /* ensure none of the special function bits set */ + clkcon &= ~(S3C2410_CLKCON_IDLE|S3C2410_CLKCON_POWER); + + __raw_writel(clkcon, S3C2410_CLKCON); +} /* enable and disable calls for use with the clk struct */ @@ -63,6 +79,12 @@ static int clk_null_enable(struct clk *clk, int enable) return 0; } +int s3c24xx_clkcon_enable(struct clk *clk, int enable) +{ + s3c24xx_clk_enable(clk->ctrlbit, enable); + return 0; +} + /* Clock API calls */ struct clk *clk_get(struct device *dev, const char *id) @@ -148,35 +170,20 @@ unsigned long clk_get_rate(struct clk *clk) if (clk->rate != 0) return clk->rate; - if (clk->get_rate != NULL) - return (clk->get_rate)(clk); - - if (clk->parent != NULL) - return clk_get_rate(clk->parent); + while (clk->parent != NULL && clk->rate == 0) + clk = clk->parent; return clk->rate; } long clk_round_rate(struct clk *clk, unsigned long rate) { - if (!IS_ERR(clk) && clk->round_rate) - return (clk->round_rate)(clk, rate); - return rate; } int clk_set_rate(struct clk *clk, unsigned long rate) { - int ret; - - if (IS_ERR(clk)) - return -EINVAL; - - mutex_lock(&clocks_mutex); - ret = (clk->set_rate)(clk, rate); - mutex_unlock(&clocks_mutex); - - return ret; + return -EINVAL; } struct clk *clk_get_parent(struct clk *clk) @@ -184,23 +191,6 @@ struct clk *clk_get_parent(struct clk *clk) return clk->parent; } -int clk_set_parent(struct clk *clk, struct clk *parent) -{ - int ret = 0; - - if (IS_ERR(clk)) - return -EINVAL; - - mutex_lock(&clocks_mutex); - - if (clk->set_parent) - ret = (clk->set_parent)(clk, parent); - - mutex_unlock(&clocks_mutex); - - return ret; -} - EXPORT_SYMBOL(clk_get); EXPORT_SYMBOL(clk_put); EXPORT_SYMBOL(clk_enable); @@ -209,11 +199,10 @@ EXPORT_SYMBOL(clk_get_rate); EXPORT_SYMBOL(clk_round_rate); EXPORT_SYMBOL(clk_set_rate); EXPORT_SYMBOL(clk_get_parent); -EXPORT_SYMBOL(clk_set_parent); /* base clocks */ -struct clk clk_xtal = { +static struct clk clk_xtal = { .name = "xtal", .id = -1, .rate = 0, @@ -221,27 +210,15 @@ struct clk clk_xtal = { .ctrlbit = 0, }; -struct clk clk_mpll = { - .name = "mpll", - .id = -1, -}; - -struct clk clk_upll = { - .name = "upll", - .id = -1, - .parent = NULL, - .ctrlbit = 0, -}; - -struct clk clk_f = { +static struct clk clk_f = { .name = "fclk", .id = -1, .rate = 0, - .parent = &clk_mpll, + .parent = NULL, .ctrlbit = 0, }; -struct clk clk_h = { +static struct clk clk_h = { .name = "hclk", .id = -1, .rate = 0, @@ -249,7 +226,7 @@ struct clk clk_h = { .ctrlbit = 0, }; -struct clk clk_p = { +static struct clk clk_p = { .name = "pclk", .id = -1, .rate = 0, @@ -257,128 +234,26 @@ struct clk clk_p = { .ctrlbit = 0, }; -struct clk clk_usb_bus = { - .name = "usb-bus", - .id = -1, - .rate = 0, - .parent = &clk_upll, -}; - /* clocks that could be registered by external code */ -static int s3c24xx_dclk_enable(struct clk *clk, int enable) -{ - unsigned long dclkcon = __raw_readl(S3C24XX_DCLKCON); - - if (enable) - dclkcon |= clk->ctrlbit; - else - dclkcon &= ~clk->ctrlbit; - - __raw_writel(dclkcon, S3C24XX_DCLKCON); - - return 0; -} - -static int s3c24xx_dclk_setparent(struct clk *clk, struct clk *parent) -{ - unsigned long dclkcon; - unsigned int uclk; - - if (parent == &clk_upll) - uclk = 1; - else if (parent == &clk_p) - uclk = 0; - else - return -EINVAL; - - clk->parent = parent; - - dclkcon = __raw_readl(S3C24XX_DCLKCON); - - if (clk->ctrlbit == S3C2410_DCLKCON_DCLK0EN) { - if (uclk) - dclkcon |= S3C2410_DCLKCON_DCLK0_UCLK; - else - dclkcon &= ~S3C2410_DCLKCON_DCLK0_UCLK; - } else { - if (uclk) - dclkcon |= S3C2410_DCLKCON_DCLK1_UCLK; - else - dclkcon &= ~S3C2410_DCLKCON_DCLK1_UCLK; - } - - __raw_writel(dclkcon, S3C24XX_DCLKCON); - - return 0; -} - - -static int s3c24xx_clkout_setparent(struct clk *clk, struct clk *parent) -{ - unsigned long mask; - unsigned long source; - - /* calculate the MISCCR setting for the clock */ - - if (parent == &clk_xtal) - source = S3C2410_MISCCR_CLK0_MPLL; - else if (parent == &clk_upll) - source = S3C2410_MISCCR_CLK0_UPLL; - else if (parent == &clk_f) - source = S3C2410_MISCCR_CLK0_FCLK; - else if (parent == &clk_h) - source = S3C2410_MISCCR_CLK0_HCLK; - else if (parent == &clk_p) - source = S3C2410_MISCCR_CLK0_PCLK; - else if (clk == &s3c24xx_clkout0 && parent == &s3c24xx_dclk0) - source = S3C2410_MISCCR_CLK0_DCLK0; - else if (clk == &s3c24xx_clkout1 && parent == &s3c24xx_dclk1) - source = S3C2410_MISCCR_CLK0_DCLK0; - else - return -EINVAL; - - clk->parent = parent; - - if (clk == &s3c24xx_dclk0) - mask = S3C2410_MISCCR_CLK0_MASK; - else { - source <<= 4; - mask = S3C2410_MISCCR_CLK1_MASK; - } - - s3c2410_modify_misccr(mask, source); - return 0; -} - -/* external clock definitions */ - struct clk s3c24xx_dclk0 = { .name = "dclk0", .id = -1, - .ctrlbit = S3C2410_DCLKCON_DCLK0EN, - .enable = s3c24xx_dclk_enable, - .set_parent = s3c24xx_dclk_setparent, }; struct clk s3c24xx_dclk1 = { .name = "dclk1", .id = -1, - .ctrlbit = S3C2410_DCLKCON_DCLK0EN, - .enable = s3c24xx_dclk_enable, - .set_parent = s3c24xx_dclk_setparent, }; struct clk s3c24xx_clkout0 = { .name = "clkout0", .id = -1, - .set_parent = s3c24xx_clkout_setparent, }; struct clk s3c24xx_clkout1 = { .name = "clkout1", .id = -1, - .set_parent = s3c24xx_clkout_setparent, }; struct clk s3c24xx_uclk = { @@ -386,6 +261,108 @@ struct clk s3c24xx_uclk = { .id = -1, }; + +/* clock definitions */ + +static struct clk init_clocks[] = { + { + .name = "nand", + .id = -1, + .parent = &clk_h, + .enable = s3c24xx_clkcon_enable, + .ctrlbit = S3C2410_CLKCON_NAND, + }, { + .name = "lcd", + .id = -1, + .parent = &clk_h, + .enable = s3c24xx_clkcon_enable, + .ctrlbit = S3C2410_CLKCON_LCDC, + }, { + .name = "usb-host", + .id = -1, + .parent = &clk_h, + .enable = s3c24xx_clkcon_enable, + .ctrlbit = S3C2410_CLKCON_USBH, + }, { + .name = "usb-device", + .id = -1, + .parent = &clk_h, + .enable = s3c24xx_clkcon_enable, + .ctrlbit = S3C2410_CLKCON_USBD, + }, { + .name = "timers", + .id = -1, + .parent = &clk_p, + .enable = s3c24xx_clkcon_enable, + .ctrlbit = S3C2410_CLKCON_PWMT, + }, { + .name = "sdi", + .id = -1, + .parent = &clk_p, + .enable = s3c24xx_clkcon_enable, + .ctrlbit = S3C2410_CLKCON_SDI, + }, { + .name = "uart", + .id = 0, + .parent = &clk_p, + .enable = s3c24xx_clkcon_enable, + .ctrlbit = S3C2410_CLKCON_UART0, + }, { + .name = "uart", + .id = 1, + .parent = &clk_p, + .enable = s3c24xx_clkcon_enable, + .ctrlbit = S3C2410_CLKCON_UART1, + }, { + .name = "uart", + .id = 2, + .parent = &clk_p, + .enable = s3c24xx_clkcon_enable, + .ctrlbit = S3C2410_CLKCON_UART2, + }, { + .name = "gpio", + .id = -1, + .parent = &clk_p, + .enable = s3c24xx_clkcon_enable, + .ctrlbit = S3C2410_CLKCON_GPIO, + }, { + .name = "rtc", + .id = -1, + .parent = &clk_p, + .enable = s3c24xx_clkcon_enable, + .ctrlbit = S3C2410_CLKCON_RTC, + }, { + .name = "adc", + .id = -1, + .parent = &clk_p, + .enable = s3c24xx_clkcon_enable, + .ctrlbit = S3C2410_CLKCON_ADC, + }, { + .name = "i2c", + .id = -1, + .parent = &clk_p, + .enable = s3c24xx_clkcon_enable, + .ctrlbit = S3C2410_CLKCON_IIC, + }, { + .name = "iis", + .id = -1, + .parent = &clk_p, + .enable = s3c24xx_clkcon_enable, + .ctrlbit = S3C2410_CLKCON_IIS, + }, { + .name = "spi", + .id = -1, + .parent = &clk_p, + .enable = s3c24xx_clkcon_enable, + .ctrlbit = S3C2410_CLKCON_SPI, + }, { + .name = "watchdog", + .id = -1, + .parent = &clk_p, + .ctrlbit = 0, + } +}; + /* initialise the clock system */ int s3c24xx_register_clock(struct clk *clk) @@ -395,6 +372,14 @@ int s3c24xx_register_clock(struct clk *clk) if (clk->enable == NULL) clk->enable = clk_null_enable; + /* if this is a standard clock, set the usage state */ + + if (clk->ctrlbit) { + unsigned long clkcon = __raw_readl(S3C2410_CLKCON); + + clk->usage = (clkcon & clk->ctrlbit) ? 1 : 0; + } + /* add to the list of available clocks */ mutex_lock(&clocks_mutex); @@ -411,18 +396,42 @@ int __init s3c24xx_setup_clocks(unsigned long xtal, unsigned long hclk, unsigned long pclk) { - printk(KERN_INFO "S3C24XX Clocks, (c) 2004 Simtec Electronics\n"); + unsigned long clkslow = __raw_readl(S3C2410_CLKSLOW); + struct clk *clkp = init_clocks; + int ptr; + int ret; + + printk(KERN_INFO "S3C2410 Clocks, (c) 2004 Simtec Electronics\n"); /* initialise the main system clocks */ clk_xtal.rate = xtal; - clk_upll.rate = s3c2410_get_pll(__raw_readl(S3C2410_UPLLCON), xtal); - clk_mpll.rate = fclk; clk_h.rate = hclk; clk_p.rate = pclk; clk_f.rate = fclk; + /* We must be careful disabling the clocks we are not intending to + * be using at boot time, as subsytems such as the LCD which do + * their own DMA requests to the bus can cause the system to lockup + * if they where in the middle of requesting bus access. + * + * Disabling the LCD clock if the LCD is active is very dangerous, + * and therefore the bootloader should be careful to not enable + * the LCD clock if it is not needed. + */ + + mutex_lock(&clocks_mutex); + + s3c24xx_clk_enable(S3C2410_CLKCON_NAND, 0); + s3c24xx_clk_enable(S3C2410_CLKCON_USBH, 0); + s3c24xx_clk_enable(S3C2410_CLKCON_USBD, 0); + s3c24xx_clk_enable(S3C2410_CLKCON_ADC, 0); + s3c24xx_clk_enable(S3C2410_CLKCON_IIC, 0); + s3c24xx_clk_enable(S3C2410_CLKCON_SPI, 0); + + mutex_unlock(&clocks_mutex); + /* assume uart clocks are correctly setup */ /* register our clocks */ @@ -430,12 +439,6 @@ int __init s3c24xx_setup_clocks(unsigned long xtal, if (s3c24xx_register_clock(&clk_xtal) < 0) printk(KERN_ERR "failed to register master xtal\n"); - if (s3c24xx_register_clock(&clk_mpll) < 0) - printk(KERN_ERR "failed to register mpll clock\n"); - - if (s3c24xx_register_clock(&clk_upll) < 0) - printk(KERN_ERR "failed to register upll clock\n"); - if (s3c24xx_register_clock(&clk_f) < 0) printk(KERN_ERR "failed to register cpu fclk\n"); @@ -445,5 +448,23 @@ int __init s3c24xx_setup_clocks(unsigned long xtal, if (s3c24xx_register_clock(&clk_p) < 0) printk(KERN_ERR "failed to register cpu pclk\n"); + /* register clocks from clock array */ + + for (ptr = 0; ptr < ARRAY_SIZE(init_clocks); ptr++, clkp++) { + ret = s3c24xx_register_clock(clkp); + if (ret < 0) { + printk(KERN_ERR "Failed to register clock %s (%d)\n", + clkp->name, ret); + } + } + + /* show the clock-slow value */ + + printk("CLOCK: Slow mode (%ld.%ld MHz), %s, MPLL %s, UPLL %s\n", + print_mhz(xtal / ( 2 * S3C2410_CLKSLOW_GET_SLOWVAL(clkslow))), + (clkslow & S3C2410_CLKSLOW_SLOW) ? "slow" : "fast", + (clkslow & S3C2410_CLKSLOW_MPLL_OFF) ? "off" : "on", + (clkslow & S3C2410_CLKSLOW_UCLK_OFF) ? "off" : "on"); + return 0; } diff --git a/arch/arm/mach-s3c2410/clock.h b/arch/arm/mach-s3c2410/clock.h index 7f0ea03e1..eb5c95d1e 100644 --- a/arch/arm/mach-s3c2410/clock.h +++ b/arch/arm/mach-s3c2410/clock.h @@ -19,12 +19,7 @@ struct clk { int usage; unsigned long rate; unsigned long ctrlbit; - int (*enable)(struct clk *, int enable); - int (*set_rate)(struct clk *c, unsigned long rate); - unsigned long (*get_rate)(struct clk *c); - unsigned long (*round_rate)(struct clk *c, unsigned long rate); - int (*set_parent)(struct clk *c, struct clk *parent); }; /* other clocks which may be registered by board support */ @@ -35,26 +30,12 @@ extern struct clk s3c24xx_clkout0; extern struct clk s3c24xx_clkout1; extern struct clk s3c24xx_uclk; -extern struct clk clk_usb_bus; - -/* core clock support */ - -extern struct clk clk_f; -extern struct clk clk_h; -extern struct clk clk_p; -extern struct clk clk_mpll; -extern struct clk clk_upll; -extern struct clk clk_xtal; - /* exports for arch/arm/mach-s3c2410 * * Please DO NOT use these outside of arch/arm/mach-s3c2410 */ -extern struct mutex clocks_mutex; - -extern int s3c2410_clkcon_enable(struct clk *clk, int enable); - +extern int s3c24xx_clkcon_enable(struct clk *clk, int enable); extern int s3c24xx_register_clock(struct clk *clk); extern int s3c24xx_setup_clocks(unsigned long xtal, diff --git a/arch/arm/mach-s3c2410/cpu.c b/arch/arm/mach-s3c2410/cpu.c index 1c3c6adae..00a379334 100644 --- a/arch/arm/mach-s3c2410/cpu.c +++ b/arch/arm/mach-s3c2410/cpu.c @@ -37,17 +37,12 @@ #include #include -#include #include "cpu.h" -#include "devs.h" #include "clock.h" #include "s3c2400.h" #include "s3c2410.h" -#include "s3c2412.h" -#include "s3c244x.h" #include "s3c2440.h" -#include "s3c2442.h" struct cpu_table { unsigned long idcode; @@ -63,9 +58,7 @@ struct cpu_table { static const char name_s3c2400[] = "S3C2400"; static const char name_s3c2410[] = "S3C2410"; -static const char name_s3c2412[] = "S3C2412"; static const char name_s3c2440[] = "S3C2440"; -static const char name_s3c2442[] = "S3C2442"; static const char name_s3c2410a[] = "S3C2410A"; static const char name_s3c2440a[] = "S3C2440A"; @@ -91,39 +84,21 @@ static struct cpu_table cpu_ids[] __initdata = { { .idcode = 0x32440000, .idmask = 0xffffffff, - .map_io = s3c244x_map_io, - .init_clocks = s3c244x_init_clocks, - .init_uarts = s3c244x_init_uarts, + .map_io = s3c2440_map_io, + .init_clocks = s3c2440_init_clocks, + .init_uarts = s3c2440_init_uarts, .init = s3c2440_init, .name = name_s3c2440 }, { .idcode = 0x32440001, .idmask = 0xffffffff, - .map_io = s3c244x_map_io, - .init_clocks = s3c244x_init_clocks, - .init_uarts = s3c244x_init_uarts, + .map_io = s3c2440_map_io, + .init_clocks = s3c2440_init_clocks, + .init_uarts = s3c2440_init_uarts, .init = s3c2440_init, .name = name_s3c2440a }, - { - .idcode = 0x32440aaa, - .idmask = 0xffffffff, - .map_io = s3c244x_map_io, - .init_clocks = s3c244x_init_clocks, - .init_uarts = s3c244x_init_uarts, - .init = s3c2442_init, - .name = name_s3c2442 - }, - { - .idcode = 0x32412001, - .idmask = 0xffffffff, - .map_io = s3c2412_map_io, - .init_clocks = s3c2412_init_clocks, - .init_uarts = s3c2412_init_uarts, - .init = s3c2412_init, - .name = name_s3c2412, - }, { .idcode = 0x0, /* S3C2400 doesn't have an idcode */ .idmask = 0xffffffff, @@ -171,7 +146,7 @@ void s3c24xx_set_board(struct s3c24xx_board *b) board = b; if (b->clocks_count != 0) { - struct clk **ptr = b->clocks; + struct clk **ptr = b->clocks;; for (i = b->clocks_count; i > 0; i--, ptr++) s3c24xx_register_clock(*ptr); @@ -182,24 +157,6 @@ void s3c24xx_set_board(struct s3c24xx_board *b) static struct cpu_table *cpu; -static unsigned long s3c24xx_read_idcode_v5(void) -{ -#if defined(CONFIG_CPU_S3C2412) || defined(CONFIG_CPU_S3C2413) - return __raw_readl(S3C2412_GSTATUS1); -#else - return 1UL; /* don't look like an 2400 */ -#endif -} - -static unsigned long s3c24xx_read_idcode_v4(void) -{ -#ifndef CONFIG_CPU_S3C2400 - return __raw_readl(S3C2410_GSTATUS1); -#else - return 0UL; -#endif -} - void __init s3c24xx_init_io(struct map_desc *mach_desc, int size) { unsigned long idcode = 0x0; @@ -207,11 +164,9 @@ void __init s3c24xx_init_io(struct map_desc *mach_desc, int size) /* initialise the io descriptors we need for initialisation */ iotable_init(s3c_iodesc, ARRAY_SIZE(s3c_iodesc)); - if (cpu_architecture() >= CPU_ARCH_ARMv5) { - idcode = s3c24xx_read_idcode_v5(); - } else { - idcode = s3c24xx_read_idcode_v4(); - } +#ifndef CONFIG_CPU_S3C2400 + idcode = __raw_readl(S3C2410_GSTATUS1); +#endif cpu = s3c_lookup_cpu(idcode); @@ -220,13 +175,13 @@ void __init s3c24xx_init_io(struct map_desc *mach_desc, int size) panic("Unknown S3C24XX CPU"); } - printk("CPU %s (id 0x%08lx)\n", cpu->name, idcode); - if (cpu->map_io == NULL || cpu->init == NULL) { printk(KERN_ERR "CPU %s support not enabled\n", cpu->name); panic("Unsupported S3C24XX CPU"); } + printk("CPU %s (id 0x%08lx)\n", cpu->name, idcode); + (cpu->map_io)(mach_desc, size); } @@ -253,49 +208,6 @@ void __init s3c24xx_init_clocks(int xtal) (cpu->init_clocks)(xtal); } -/* uart management */ - -static int nr_uarts __initdata = 0; - -static struct s3c2410_uartcfg uart_cfgs[3]; - -/* s3c24xx_init_uartdevs - * - * copy the specified platform data and configuration into our central - * set of devices, before the data is thrown away after the init process. - * - * This also fills in the array passed to the serial driver for the - * early initialisation of the console. -*/ - -void __init s3c24xx_init_uartdevs(char *name, - struct s3c24xx_uart_resources *res, - struct s3c2410_uartcfg *cfg, int no) -{ - struct platform_device *platdev; - struct s3c2410_uartcfg *cfgptr = uart_cfgs; - struct s3c24xx_uart_resources *resp; - int uart; - - memcpy(cfgptr, cfg, sizeof(struct s3c2410_uartcfg) * no); - - for (uart = 0; uart < no; uart++, cfg++, cfgptr++) { - platdev = s3c24xx_uart_src[cfgptr->hwport]; - - resp = res + cfgptr->hwport; - - s3c24xx_uart_devs[uart] = platdev; - - platdev->name = name; - platdev->resource = resp->resources; - platdev->num_resources = resp->nr_resources; - - platdev->dev.platform_data = cfgptr; - } - - nr_uarts = no; -} - void __init s3c24xx_init_uarts(struct s3c2410_uartcfg *cfg, int no) { if (cpu == NULL) @@ -320,10 +232,6 @@ static int __init s3c_arch_init(void) if (ret != 0) return ret; - ret = platform_add_devices(s3c24xx_uart_devs, nr_uarts); - if (ret != 0) - return ret; - if (board != NULL) { struct platform_device **ptr = board->devices; int i; diff --git a/arch/arm/mach-s3c2410/cpu.h b/arch/arm/mach-s3c2410/cpu.h index be42e4032..fc1067783 100644 --- a/arch/arm/mach-s3c2410/cpu.h +++ b/arch/arm/mach-s3c2410/cpu.h @@ -8,6 +8,16 @@ * 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: + * 24-Aug-2004 BJD Start of generic S3C24XX support + * 18-Oct-2004 BJD Moved board struct into this file + * 04-Jan-2005 BJD New uart initialisation + * 10-Jan-2005 BJD Moved generic init here, specific to cpu headers + * 14-Jan-2005 BJD Added s3c24xx_init_clocks() call + * 10-Mar-2005 LCVR Changed S3C2410_{VA,SZ} to S3C24XX_{VA,SZ} & IODESC_ENT + * 14-Mar-2005 BJD Updated for __iomem + * 15-Jan-2006 LCVR Updated S3C2410_PA_##x to new S3C24XX_PA_##x macro */ /* todo - fix when rmk changes iodescs to use `void __iomem *` */ @@ -21,8 +31,6 @@ #define print_mhz(m) ((m) / MHZ), ((m / 1000) % 1000) /* forward declaration */ -struct s3c24xx_uart_resources; -struct platform_device; struct s3c2410_uartcfg; struct map_desc; @@ -36,10 +44,6 @@ extern void s3c24xx_init_uarts(struct s3c2410_uartcfg *cfg, int no); extern void s3c24xx_init_clocks(int xtal); -extern void s3c24xx_init_uartdevs(char *name, - struct s3c24xx_uart_resources *res, - struct s3c2410_uartcfg *cfg, int no); - /* the board structure is used at first initialsation time * to get info such as the devices to register for this * board. This is done because platfrom_add_devices() cannot @@ -63,7 +67,4 @@ extern struct sys_timer s3c24xx_timer; /* system device classes */ -extern struct sysdev_class s3c2410_sysclass; -extern struct sysdev_class s3c2412_sysclass; extern struct sysdev_class s3c2440_sysclass; -extern struct sysdev_class s3c2442_sysclass; diff --git a/arch/arm/mach-s3c2410/devs.c b/arch/arm/mach-s3c2410/devs.c index cae35ff76..ca09ba516 100644 --- a/arch/arm/mach-s3c2410/devs.c +++ b/arch/arm/mach-s3c2410/devs.c @@ -1,14 +1,22 @@ /* linux/arch/arm/mach-s3c2410/devs.c * * Copyright (c) 2004 Simtec Electronics - * Ben Dooks + * Ben Dooks * - * Base S3C24XX platform device definitions + * Base S3C2410 platform device definitions * * 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: + * 15-Jan-2006 LCVR Using S3C24XX_PA_##x macro for common S3C24XX devices + * 10-Mar-2005 LCVR Changed S3C2410_{VA,SZ} to S3C24XX_{VA,SZ} + * 10-Feb-2005 BJD Added camera from guillaume.gourat@nexvision.tv + * 29-Aug-2004 BJD Added timers 0 through 3 + * 29-Aug-2004 BJD Changed index of devices we only have one of to -1 + * 21-Aug-2004 BJD Added IRQ_TICK to RTC resources + * 18-Aug-2004 BJD Created initial version */ #include @@ -30,86 +38,10 @@ #include #include "devs.h" -#include "cpu.h" /* Serial port registrations */ -static struct resource s3c2410_uart0_resource[] = { - [0] = { - .start = S3C2410_PA_UART0, - .end = S3C2410_PA_UART0 + 0x3fff, - .flags = IORESOURCE_MEM, - }, - [1] = { - .start = IRQ_S3CUART_RX0, - .end = IRQ_S3CUART_ERR0, - .flags = IORESOURCE_IRQ, - } -}; - -static struct resource s3c2410_uart1_resource[] = { - [0] = { - .start = S3C2410_PA_UART1, - .end = S3C2410_PA_UART1 + 0x3fff, - .flags = IORESOURCE_MEM, - }, - [1] = { - .start = IRQ_S3CUART_RX1, - .end = IRQ_S3CUART_ERR1, - .flags = IORESOURCE_IRQ, - } -}; - -static struct resource s3c2410_uart2_resource[] = { - [0] = { - .start = S3C2410_PA_UART2, - .end = S3C2410_PA_UART2 + 0x3fff, - .flags = IORESOURCE_MEM, - }, - [1] = { - .start = IRQ_S3CUART_RX2, - .end = IRQ_S3CUART_ERR2, - .flags = IORESOURCE_IRQ, - } -}; - -struct s3c24xx_uart_resources s3c2410_uart_resources[] __initdata = { - [0] = { - .resources = s3c2410_uart0_resource, - .nr_resources = ARRAY_SIZE(s3c2410_uart0_resource), - }, - [1] = { - .resources = s3c2410_uart1_resource, - .nr_resources = ARRAY_SIZE(s3c2410_uart1_resource), - }, - [2] = { - .resources = s3c2410_uart2_resource, - .nr_resources = ARRAY_SIZE(s3c2410_uart2_resource), - }, -}; - -/* yart devices */ - -static struct platform_device s3c24xx_uart_device0 = { - .id = 0, -}; - -static struct platform_device s3c24xx_uart_device1 = { - .id = 1, -}; - -static struct platform_device s3c24xx_uart_device2 = { - .id = 2, -}; - -struct platform_device *s3c24xx_uart_src[3] = { - &s3c24xx_uart_device0, - &s3c24xx_uart_device1, - &s3c24xx_uart_device2, -}; - -struct platform_device *s3c24xx_uart_devs[3] = { -}; +struct platform_device *s3c24xx_uart_devs[3]; /* USB Host Controller */ diff --git a/arch/arm/mach-s3c2410/devs.h b/arch/arm/mach-s3c2410/devs.h index 726e2eaf8..52c4bab5c 100644 --- a/arch/arm/mach-s3c2410/devs.h +++ b/arch/arm/mach-s3c2410/devs.h @@ -14,17 +14,10 @@ * 27-Aug-2004 BJD Added timers 0 through 3 * 10-Feb-2005 BJD Added camera from guillaume.gourat@nexvision.tv */ +#include #include -struct s3c24xx_uart_resources { - struct resource *resources; - unsigned long nr_resources; -}; - -extern struct s3c24xx_uart_resources s3c2410_uart_resources[]; - extern struct platform_device *s3c24xx_uart_devs[]; -extern struct platform_device *s3c24xx_uart_src[]; extern struct platform_device s3c_device_usb; extern struct platform_device s3c_device_lcd; diff --git a/arch/arm/mach-s3c2410/dma.c b/arch/arm/mach-s3c2410/dma.c index cc92a7b2d..4dbd8e758 100644 --- a/arch/arm/mach-s3c2410/dma.c +++ b/arch/arm/mach-s3c2410/dma.c @@ -31,6 +31,7 @@ * possible DMA function */ +#include #ifdef CONFIG_S3C2410_DMA_DEBUG #define DEBUG @@ -60,7 +61,7 @@ static void __iomem *dma_base; static kmem_cache_t *dma_kmem; /* dma channel state information */ -struct s3c2410_dma_chan s3c2410_chans[S3C2410_DMA_CHANNELS]; +s3c2410_dma_chan_t s3c2410_chans[S3C2410_DMA_CHANNELS]; /* debugging functions */ @@ -74,7 +75,7 @@ struct s3c2410_dma_chan s3c2410_chans[S3C2410_DMA_CHANNELS]; #define dma_wrreg(chan, reg, val) writel((val), (chan)->regs + (reg)) #else static inline void -dma_wrreg(struct s3c2410_dma_chan *chan, int reg, unsigned long val) +dma_wrreg(s3c2410_dma_chan_t *chan, int reg, unsigned long val) { pr_debug("writing %08x to register %08x\n",(unsigned int)val,reg); writel(val, dma_regaddr(chan, reg)); @@ -102,7 +103,7 @@ struct s3c2410_dma_regstate { */ static void -dmadbg_capture(struct s3c2410_dma_chan *chan, struct s3c2410_dma_regstate *regs) +dmadbg_capture(s3c2410_dma_chan_t *chan, struct s3c2410_dma_regstate *regs) { regs->dcsrc = dma_rdreg(chan, S3C2410_DMA_DCSRC); regs->disrc = dma_rdreg(chan, S3C2410_DMA_DISRC); @@ -112,7 +113,7 @@ dmadbg_capture(struct s3c2410_dma_chan *chan, struct s3c2410_dma_regstate *regs) } static void -dmadbg_dumpregs(const char *fname, int line, struct s3c2410_dma_chan *chan, +dmadbg_showregs(const char *fname, int line, s3c2410_dma_chan_t *chan, struct s3c2410_dma_regstate *regs) { printk(KERN_DEBUG "dma%d: %s:%d: DCSRC=%08lx, DISRC=%08lx, DSTAT=%08lx DMT=%02lx, DCON=%08lx\n", @@ -122,7 +123,7 @@ dmadbg_dumpregs(const char *fname, int line, struct s3c2410_dma_chan *chan, } static void -dmadbg_showchan(const char *fname, int line, struct s3c2410_dma_chan *chan) +dmadbg_showchan(const char *fname, int line, s3c2410_dma_chan_t *chan) { struct s3c2410_dma_regstate state; @@ -132,16 +133,7 @@ dmadbg_showchan(const char *fname, int line, struct s3c2410_dma_chan *chan) chan->number, fname, line, chan->load_state, chan->curr, chan->next, chan->end); - dmadbg_dumpregs(fname, line, chan, &state); -} - -static void -dmadbg_showregs(const char *fname, int line, struct s3c2410_dma_chan *chan) -{ - struct s3c2410_dma_regstate state; - - dmadbg_capture(chan, &state); - dmadbg_dumpregs(fname, line, chan, &state); + dmadbg_showregs(fname, line, chan, &state); } #define dbg_showregs(chan) dmadbg_showregs(__FUNCTION__, __LINE__, (chan)) @@ -164,7 +156,7 @@ dmadbg_showregs(const char *fname, int line, struct s3c2410_dma_chan *chan) */ static void -s3c2410_dma_stats_timeout(struct s3c2410_dma_stats *stats, int val) +s3c2410_dma_stats_timeout(s3c2410_dma_stats_t *stats, int val) { if (stats == NULL) return; @@ -183,7 +175,7 @@ s3c2410_dma_stats_timeout(struct s3c2410_dma_stats *stats, int val) */ static int -s3c2410_dma_waitforload(struct s3c2410_dma_chan *chan, int line) +s3c2410_dma_waitforload(s3c2410_dma_chan_t *chan, int line) { int timeout = chan->load_timeout; int took; @@ -230,8 +222,8 @@ s3c2410_dma_waitforload(struct s3c2410_dma_chan *chan, int line) */ static inline int -s3c2410_dma_loadbuffer(struct s3c2410_dma_chan *chan, - struct s3c2410_dma_buf *buf) +s3c2410_dma_loadbuffer(s3c2410_dma_chan_t *chan, + s3c2410_dma_buf_t *buf) { unsigned long reload; @@ -262,14 +254,10 @@ s3c2410_dma_loadbuffer(struct s3c2410_dma_chan *chan, buf->next); reload = (buf->next == NULL) ? S3C2410_DCON_NORELOAD : 0; } else { - //pr_debug("load_state is %d => autoreload\n", chan->load_state); + pr_debug("load_state is %d => autoreload\n", chan->load_state); reload = S3C2410_DCON_AUTORELOAD; } - if ((buf->data & 0xf0000000) != 0x30000000) { - dmawarn("dmaload: buffer is %p\n", (void *)buf->data); - } - writel(buf->data, chan->addr_reg); dma_wrreg(chan, S3C2410_DMA_DCON, @@ -304,7 +292,7 @@ s3c2410_dma_loadbuffer(struct s3c2410_dma_chan *chan, */ static void -s3c2410_dma_call_op(struct s3c2410_dma_chan *chan, enum s3c2410_chan_op op) +s3c2410_dma_call_op(s3c2410_dma_chan_t *chan, s3c2410_chan_op_t op) { if (chan->op_fn != NULL) { (chan->op_fn)(chan, op); @@ -318,8 +306,8 @@ s3c2410_dma_call_op(struct s3c2410_dma_chan *chan, enum s3c2410_chan_op op) */ static inline void -s3c2410_dma_buffdone(struct s3c2410_dma_chan *chan, struct s3c2410_dma_buf *buf, - enum s3c2410_dma_buffresult result) +s3c2410_dma_buffdone(s3c2410_dma_chan_t *chan, s3c2410_dma_buf_t *buf, + s3c2410_dma_buffresult_t result) { pr_debug("callback_fn=%p, buf=%p, id=%p, size=%d, result=%d\n", chan->callback_fn, buf, buf->id, buf->size, result); @@ -334,7 +322,7 @@ s3c2410_dma_buffdone(struct s3c2410_dma_chan *chan, struct s3c2410_dma_buf *buf, * start a dma channel going */ -static int s3c2410_dma_start(struct s3c2410_dma_chan *chan) +static int s3c2410_dma_start(s3c2410_dma_chan_t *chan) { unsigned long tmp; unsigned long flags; @@ -383,7 +371,7 @@ static int s3c2410_dma_start(struct s3c2410_dma_chan *chan) tmp |= S3C2410_DMASKTRIG_ON; dma_wrreg(chan, S3C2410_DMA_DMASKTRIG, tmp); - pr_debug("dma%d: %08lx to DMASKTRIG\n", chan->number, tmp); + pr_debug("wrote %08lx to DMASKTRIG\n", tmp); #if 0 /* the dma buffer loads should take care of clearing the AUTO @@ -397,30 +385,7 @@ static int s3c2410_dma_start(struct s3c2410_dma_chan *chan) dbg_showchan(chan); - /* if we've only loaded one buffer onto the channel, then chec - * to see if we have another, and if so, try and load it so when - * the first buffer is finished, the new one will be loaded onto - * the channel */ - - if (chan->next != NULL) { - if (chan->load_state == S3C2410_DMALOAD_1LOADED) { - - if (s3c2410_dma_waitforload(chan, __LINE__) == 0) { - pr_debug("%s: buff not yet loaded, no more todo\n", - __FUNCTION__); - } else { - chan->load_state = S3C2410_DMALOAD_1RUNNING; - s3c2410_dma_loadbuffer(chan, chan->next); - } - - } else if (chan->load_state == S3C2410_DMALOAD_1RUNNING) { - s3c2410_dma_loadbuffer(chan, chan->next); - } - } - - local_irq_restore(flags); - return 0; } @@ -430,7 +395,7 @@ static int s3c2410_dma_start(struct s3c2410_dma_chan *chan) */ static int -s3c2410_dma_canload(struct s3c2410_dma_chan *chan) +s3c2410_dma_canload(s3c2410_dma_chan_t *chan) { if (chan->load_state == S3C2410_DMALOAD_NONE || chan->load_state == S3C2410_DMALOAD_1RUNNING) @@ -460,8 +425,8 @@ s3c2410_dma_canload(struct s3c2410_dma_chan *chan) int s3c2410_dma_enqueue(unsigned int channel, void *id, dma_addr_t data, int size) { - struct s3c2410_dma_chan *chan = &s3c2410_chans[channel]; - struct s3c2410_dma_buf *buf; + s3c2410_dma_chan_t *chan = &s3c2410_chans[channel]; + s3c2410_dma_buf_t *buf; unsigned long flags; check_channel(channel); @@ -472,11 +437,12 @@ int s3c2410_dma_enqueue(unsigned int channel, void *id, buf = kmem_cache_alloc(dma_kmem, GFP_ATOMIC); if (buf == NULL) { pr_debug("%s: out of memory (%ld alloc)\n", - __FUNCTION__, (long)sizeof(*buf)); + __FUNCTION__, sizeof(*buf)); return -ENOMEM; } - //pr_debug("%s: new buffer %p\n", __FUNCTION__, buf); + pr_debug("%s: new buffer %p\n", __FUNCTION__, buf); + //dbg_showchan(chan); buf->next = NULL; @@ -540,7 +506,7 @@ int s3c2410_dma_enqueue(unsigned int channel, void *id, EXPORT_SYMBOL(s3c2410_dma_enqueue); static inline void -s3c2410_dma_freebuf(struct s3c2410_dma_buf *buf) +s3c2410_dma_freebuf(s3c2410_dma_buf_t *buf) { int magicok = (buf->magic == BUF_MAGIC); @@ -560,7 +526,7 @@ s3c2410_dma_freebuf(struct s3c2410_dma_buf *buf) */ static inline void -s3c2410_dma_lastxfer(struct s3c2410_dma_chan *chan) +s3c2410_dma_lastxfer(s3c2410_dma_chan_t *chan) { pr_debug("dma%d: s3c2410_dma_lastxfer: load_state %d\n", chan->number, chan->load_state); @@ -572,20 +538,14 @@ s3c2410_dma_lastxfer(struct s3c2410_dma_chan *chan) case S3C2410_DMALOAD_1LOADED: if (s3c2410_dma_waitforload(chan, __LINE__) == 0) { /* flag error? */ - printk(KERN_ERR "dma%d: timeout waiting for load (%s)\n", - chan->number, __FUNCTION__); + printk(KERN_ERR "dma%d: timeout waiting for load\n", + chan->number); return; } break; - case S3C2410_DMALOAD_1LOADED_1RUNNING: - /* I belive in this case we do not have anything to do - * until the next buffer comes along, and we turn off the - * reload */ - return; - default: - pr_debug("dma%d: lastxfer: unhandled load_state %d with no next\n", + pr_debug("dma%d: lastxfer: unhandled load_state %d with no next", chan->number, chan->load_state); return; @@ -601,8 +561,8 @@ s3c2410_dma_lastxfer(struct s3c2410_dma_chan *chan) static irqreturn_t s3c2410_dma_irq(int irq, void *devpw, struct pt_regs *regs) { - struct s3c2410_dma_chan *chan = (struct s3c2410_dma_chan *)devpw; - struct s3c2410_dma_buf *buf; + s3c2410_dma_chan_t *chan = (s3c2410_dma_chan_t *)devpw; + s3c2410_dma_buf_t *buf; buf = chan->curr; @@ -670,14 +630,7 @@ s3c2410_dma_irq(int irq, void *devpw, struct pt_regs *regs) } else { } - /* only reload if the channel is still running... our buffer done - * routine may have altered the state by requesting the dma channel - * to stop or shutdown... */ - - /* todo: check that when the channel is shut-down from inside this - * function, we cope with unsetting reload, etc */ - - if (chan->next != NULL && chan->state != S3C2410_DMA_IDLE) { + if (chan->next != NULL) { unsigned long flags; switch (chan->load_state) { @@ -692,8 +645,8 @@ s3c2410_dma_irq(int irq, void *devpw, struct pt_regs *regs) case S3C2410_DMALOAD_1LOADED: if (s3c2410_dma_waitforload(chan, __LINE__) == 0) { /* flag error? */ - printk(KERN_ERR "dma%d: timeout waiting for load (%s)\n", - chan->number, __FUNCTION__); + printk(KERN_ERR "dma%d: timeout waiting for load\n", + chan->number); return IRQ_HANDLED; } @@ -726,15 +679,17 @@ s3c2410_dma_irq(int irq, void *devpw, struct pt_regs *regs) return IRQ_HANDLED; } + + /* s3c2410_request_dma * * get control of an dma channel */ -int s3c2410_dma_request(unsigned int channel, struct s3c2410_dma_client *client, +int s3c2410_dma_request(unsigned int channel, s3c2410_dma_client_t *client, void *dev) { - struct s3c2410_dma_chan *chan = &s3c2410_chans[channel]; + s3c2410_dma_chan_t *chan = &s3c2410_chans[channel]; unsigned long flags; int err; @@ -764,17 +719,11 @@ int s3c2410_dma_request(unsigned int channel, struct s3c2410_dma_client *client, pr_debug("dma%d: %s : requesting irq %d\n", channel, __FUNCTION__, chan->irq); - chan->irq_claimed = 1; - local_irq_restore(flags); - - err = request_irq(chan->irq, s3c2410_dma_irq, IRQF_DISABLED, + err = request_irq(chan->irq, s3c2410_dma_irq, SA_INTERRUPT, client->name, (void *)chan); - local_irq_save(flags); - if (err) { chan->in_use = 0; - chan->irq_claimed = 0; local_irq_restore(flags); printk(KERN_ERR "%s: cannot get IRQ %d for DMA %d\n", @@ -782,6 +731,7 @@ int s3c2410_dma_request(unsigned int channel, struct s3c2410_dma_client *client, return err; } + chan->irq_claimed = 1; chan->irq_enabled = 1; } @@ -807,9 +757,9 @@ EXPORT_SYMBOL(s3c2410_dma_request); * allowed to go through. */ -int s3c2410_dma_free(dmach_t channel, struct s3c2410_dma_client *client) +int s3c2410_dma_free(dmach_t channel, s3c2410_dma_client_t *client) { - struct s3c2410_dma_chan *chan = &s3c2410_chans[channel]; + s3c2410_dma_chan_t *chan = &s3c2410_chans[channel]; unsigned long flags; check_channel(channel); @@ -846,7 +796,7 @@ int s3c2410_dma_free(dmach_t channel, struct s3c2410_dma_client *client) EXPORT_SYMBOL(s3c2410_dma_free); -static int s3c2410_dma_dostop(struct s3c2410_dma_chan *chan) +static int s3c2410_dma_dostop(s3c2410_dma_chan_t *chan) { unsigned long tmp; unsigned long flags; @@ -861,7 +811,6 @@ static int s3c2410_dma_dostop(struct s3c2410_dma_chan *chan) tmp = dma_rdreg(chan, S3C2410_DMA_DMASKTRIG); tmp |= S3C2410_DMASKTRIG_STOP; - //tmp &= ~S3C2410_DMASKTRIG_ON; dma_wrreg(chan, S3C2410_DMA_DMASKTRIG, tmp); #if 0 @@ -871,7 +820,6 @@ static int s3c2410_dma_dostop(struct s3c2410_dma_chan *chan) dma_wrreg(chan, S3C2410_DMA_DCON, tmp); #endif - /* should stop do this, or should we wait for flush? */ chan->state = S3C2410_DMA_IDLE; chan->load_state = S3C2410_DMALOAD_NONE; @@ -880,35 +828,17 @@ static int s3c2410_dma_dostop(struct s3c2410_dma_chan *chan) return 0; } -void s3c2410_dma_waitforstop(struct s3c2410_dma_chan *chan) -{ - unsigned long tmp; - unsigned int timeout = 0x10000; - - while (timeout-- > 0) { - tmp = dma_rdreg(chan, S3C2410_DMA_DMASKTRIG); - - if (!(tmp & S3C2410_DMASKTRIG_ON)) - return; - } - - pr_debug("dma%d: failed to stop?\n", chan->number); -} - - /* s3c2410_dma_flush * * stop the channel, and remove all current and pending transfers */ -static int s3c2410_dma_flush(struct s3c2410_dma_chan *chan) +static int s3c2410_dma_flush(s3c2410_dma_chan_t *chan) { - struct s3c2410_dma_buf *buf, *next; + s3c2410_dma_buf_t *buf, *next; unsigned long flags; - pr_debug("%s: chan %p (%d)\n", __FUNCTION__, chan, chan->number); - - dbg_showchan(chan); + pr_debug("%s:\n", __FUNCTION__); local_irq_save(flags); @@ -935,69 +865,16 @@ static int s3c2410_dma_flush(struct s3c2410_dma_chan *chan) } } - dbg_showregs(chan); - - s3c2410_dma_waitforstop(chan); - -#if 0 - /* should also clear interrupts, according to WinCE BSP */ - { - unsigned long tmp; - - tmp = dma_rdreg(chan, S3C2410_DMA_DCON); - tmp |= S3C2410_DCON_NORELOAD; - dma_wrreg(chan, S3C2410_DMA_DCON, tmp); - } -#endif - - dbg_showregs(chan); - local_irq_restore(flags); return 0; } -int -s3c2410_dma_started(struct s3c2410_dma_chan *chan) -{ - unsigned long flags; - - local_irq_save(flags); - - dbg_showchan(chan); - - /* if we've only loaded one buffer onto the channel, then chec - * to see if we have another, and if so, try and load it so when - * the first buffer is finished, the new one will be loaded onto - * the channel */ - - if (chan->next != NULL) { - if (chan->load_state == S3C2410_DMALOAD_1LOADED) { - - if (s3c2410_dma_waitforload(chan, __LINE__) == 0) { - pr_debug("%s: buff not yet loaded, no more todo\n", - __FUNCTION__); - } else { - chan->load_state = S3C2410_DMALOAD_1RUNNING; - s3c2410_dma_loadbuffer(chan, chan->next); - } - - } else if (chan->load_state == S3C2410_DMALOAD_1RUNNING) { - s3c2410_dma_loadbuffer(chan, chan->next); - } - } - - - local_irq_restore(flags); - - return 0; - -} int -s3c2410_dma_ctrl(dmach_t channel, enum s3c2410_chan_op op) +s3c2410_dma_ctrl(dmach_t channel, s3c2410_chan_op_t op) { - struct s3c2410_dma_chan *chan = &s3c2410_chans[channel]; + s3c2410_dma_chan_t *chan = &s3c2410_chans[channel]; check_channel(channel); @@ -1009,15 +886,14 @@ s3c2410_dma_ctrl(dmach_t channel, enum s3c2410_chan_op op) return s3c2410_dma_dostop(chan); case S3C2410_DMAOP_PAUSE: + return -ENOENT; + case S3C2410_DMAOP_RESUME: return -ENOENT; case S3C2410_DMAOP_FLUSH: return s3c2410_dma_flush(chan); - case S3C2410_DMAOP_STARTED: - return s3c2410_dma_started(chan); - case S3C2410_DMAOP_TIMEOUT: return 0; @@ -1046,7 +922,7 @@ int s3c2410_dma_config(dmach_t channel, int xferunit, int dcon) { - struct s3c2410_dma_chan *chan = &s3c2410_chans[channel]; + s3c2410_dma_chan_t *chan = &s3c2410_chans[channel]; pr_debug("%s: chan=%d, xfer_unit=%d, dcon=%08x\n", __FUNCTION__, channel, xferunit, dcon); @@ -1086,7 +962,7 @@ EXPORT_SYMBOL(s3c2410_dma_config); int s3c2410_dma_setflags(dmach_t channel, unsigned int flags) { - struct s3c2410_dma_chan *chan = &s3c2410_chans[channel]; + s3c2410_dma_chan_t *chan = &s3c2410_chans[channel]; check_channel(channel); @@ -1106,7 +982,7 @@ EXPORT_SYMBOL(s3c2410_dma_setflags); int s3c2410_dma_set_opfn(dmach_t channel, s3c2410_dma_opfn_t rtn) { - struct s3c2410_dma_chan *chan = &s3c2410_chans[channel]; + s3c2410_dma_chan_t *chan = &s3c2410_chans[channel]; check_channel(channel); @@ -1121,7 +997,7 @@ EXPORT_SYMBOL(s3c2410_dma_set_opfn); int s3c2410_dma_set_buffdone_fn(dmach_t channel, s3c2410_dma_cbfn_t rtn) { - struct s3c2410_dma_chan *chan = &s3c2410_chans[channel]; + s3c2410_dma_chan_t *chan = &s3c2410_chans[channel]; check_channel(channel); @@ -1149,11 +1025,11 @@ EXPORT_SYMBOL(s3c2410_dma_set_buffdone_fn); */ int s3c2410_dma_devconfig(int channel, - enum s3c2410_dmasrc source, + s3c2410_dmasrc_t source, int hwcfg, unsigned long devaddr) { - struct s3c2410_dma_chan *chan = &s3c2410_chans[channel]; + s3c2410_dma_chan_t *chan = &s3c2410_chans[channel]; check_channel(channel); @@ -1200,7 +1076,7 @@ EXPORT_SYMBOL(s3c2410_dma_devconfig); int s3c2410_dma_getposition(dmach_t channel, dma_addr_t *src, dma_addr_t *dst) { - struct s3c2410_dma_chan *chan = &s3c2410_chans[channel]; + s3c2410_dma_chan_t *chan = &s3c2410_chans[channel]; check_channel(channel); @@ -1222,7 +1098,7 @@ EXPORT_SYMBOL(s3c2410_dma_getposition); static int s3c2410_dma_suspend(struct sys_device *dev, pm_message_t state) { - struct s3c2410_dma_chan *cp = container_of(dev, struct s3c2410_dma_chan, dev); + s3c2410_dma_chan_t *cp = container_of(dev, s3c2410_dma_chan_t, dev); printk(KERN_DEBUG "suspending dma channel %d\n", cp->number); @@ -1262,7 +1138,7 @@ static struct sysdev_class dma_sysclass = { static void s3c2410_dma_cache_ctor(void *p, kmem_cache_t *c, unsigned long f) { - memset(p, 0, sizeof(struct s3c2410_dma_buf)); + memset(p, 0, sizeof(s3c2410_dma_buf_t)); } @@ -1270,7 +1146,7 @@ static void s3c2410_dma_cache_ctor(void *p, kmem_cache_t *c, unsigned long f) static int __init s3c2410_init_dma(void) { - struct s3c2410_dma_chan *cp; + s3c2410_dma_chan_t *cp; int channel; int ret; @@ -1288,7 +1164,7 @@ static int __init s3c2410_init_dma(void) goto err; } - dma_kmem = kmem_cache_create("dma_desc", sizeof(struct s3c2410_dma_buf), 0, + dma_kmem = kmem_cache_create("dma_desc", sizeof(s3c2410_dma_buf_t), 0, SLAB_HWCACHE_ALIGN, s3c2410_dma_cache_ctor, NULL); @@ -1301,7 +1177,7 @@ static int __init s3c2410_init_dma(void) for (channel = 0; channel < S3C2410_DMA_CHANNELS; channel++) { cp = &s3c2410_chans[channel]; - memset(cp, 0, sizeof(struct s3c2410_dma_chan)); + memset(cp, 0, sizeof(s3c2410_dma_chan_t)); /* dma channel irqs are in order.. */ cp->number = channel; diff --git a/arch/arm/mach-s3c2410/irq.c b/arch/arm/mach-s3c2410/irq.c index cd6139b35..66d8c068e 100644 --- a/arch/arm/mach-s3c2410/irq.c +++ b/arch/arm/mach-s3c2410/irq.c @@ -86,7 +86,7 @@ unsigned long s3c_irqwake_intmask = 0xffffffffL; unsigned long s3c_irqwake_eintallow = 0x0000fff0L; unsigned long s3c_irqwake_eintmask = 0xffffffffL; -int +static int s3c_irq_wake(unsigned int irqno, unsigned int state) { unsigned long irqbit = 1 << (irqno - IRQ_EINT0); @@ -191,9 +191,13 @@ static struct irqchip s3c_irq_chip = { .ack = s3c_irq_ack, .mask = s3c_irq_mask, .unmask = s3c_irq_unmask, - .set_wake = s3c_irq_wake + .set_wake = s3c_irq_wake }; +/* S3C2410_EINTMASK + * S3C2410_EINTPEND + */ + static void s3c_irqext_mask(unsigned int irqno) { @@ -201,9 +205,9 @@ s3c_irqext_mask(unsigned int irqno) irqno -= EXTINT_OFF; - mask = __raw_readl(S3C24XX_EINTMASK); + mask = __raw_readl(S3C2410_EINTMASK); mask |= ( 1UL << irqno); - __raw_writel(mask, S3C24XX_EINTMASK); + __raw_writel(mask, S3C2410_EINTMASK); if (irqno <= (IRQ_EINT7 - EXTINT_OFF)) { /* check to see if all need masking */ @@ -228,11 +232,11 @@ s3c_irqext_ack(unsigned int irqno) bit = 1UL << (irqno - EXTINT_OFF); - mask = __raw_readl(S3C24XX_EINTMASK); + mask = __raw_readl(S3C2410_EINTMASK); - __raw_writel(bit, S3C24XX_EINTPEND); + __raw_writel(bit, S3C2410_EINTPEND); - req = __raw_readl(S3C24XX_EINTPEND); + req = __raw_readl(S3C2410_EINTPEND); req &= ~mask; /* not sure if we should be acking the parent irq... */ @@ -253,14 +257,14 @@ s3c_irqext_unmask(unsigned int irqno) irqno -= EXTINT_OFF; - mask = __raw_readl(S3C24XX_EINTMASK); + mask = __raw_readl(S3C2410_EINTMASK); mask &= ~( 1UL << irqno); - __raw_writel(mask, S3C24XX_EINTMASK); + __raw_writel(mask, S3C2410_EINTMASK); s3c_irq_unmask((irqno <= (IRQ_EINT7 - EXTINT_OFF)) ? IRQ_EINT4t7 : IRQ_EINT8t23); } -int +static int s3c_irqext_type(unsigned int irq, unsigned int type) { void __iomem *extint_reg; @@ -271,28 +275,28 @@ s3c_irqext_type(unsigned int irq, unsigned int type) if ((irq >= IRQ_EINT0) && (irq <= IRQ_EINT3)) { gpcon_reg = S3C2410_GPFCON; - extint_reg = S3C24XX_EXTINT0; + extint_reg = S3C2410_EXTINT0; gpcon_offset = (irq - IRQ_EINT0) * 2; extint_offset = (irq - IRQ_EINT0) * 4; } else if ((irq >= IRQ_EINT4) && (irq <= IRQ_EINT7)) { gpcon_reg = S3C2410_GPFCON; - extint_reg = S3C24XX_EXTINT0; + extint_reg = S3C2410_EXTINT0; gpcon_offset = (irq - (EXTINT_OFF)) * 2; extint_offset = (irq - (EXTINT_OFF)) * 4; } else if ((irq >= IRQ_EINT8) && (irq <= IRQ_EINT15)) { gpcon_reg = S3C2410_GPGCON; - extint_reg = S3C24XX_EXTINT1; + extint_reg = S3C2410_EXTINT1; gpcon_offset = (irq - IRQ_EINT8) * 2; extint_offset = (irq - IRQ_EINT8) * 4; } else if ((irq >= IRQ_EINT16) && (irq <= IRQ_EINT23)) { gpcon_reg = S3C2410_GPGCON; - extint_reg = S3C24XX_EXTINT2; + extint_reg = S3C2410_EXTINT2; gpcon_offset = (irq - IRQ_EINT8) * 2; extint_offset = (irq - IRQ_EINT16) * 4; } else @@ -568,23 +572,6 @@ s3c_irq_demux_uart2(unsigned int irq, s3c_irq_demux_uart(IRQ_S3CUART_RX2, regs); } -static void -s3c_irq_demux_extint(unsigned int irq, - struct irqdesc *desc, - struct pt_regs *regs) -{ - unsigned long eintpnd = __raw_readl(S3C24XX_EINTPEND); - unsigned long eintmsk = __raw_readl(S3C24XX_EINTMASK); - - eintpnd &= ~eintmsk; - - if (eintpnd) { - irq = fls(eintpnd); - irq += (IRQ_EINT4 - (4 + 1)); - - desc_handle_irq(irq, irq_desc + irq, regs); - } -} /* s3c24xx_init_irq * @@ -604,12 +591,12 @@ void __init s3c24xx_init_irq(void) last = 0; for (i = 0; i < 4; i++) { - pend = __raw_readl(S3C24XX_EINTPEND); + pend = __raw_readl(S3C2410_EINTPEND); if (pend == 0 || pend == last) break; - __raw_writel(pend, S3C24XX_EINTPEND); + __raw_writel(pend, S3C2410_EINTPEND); printk("irq: clearing pending ext status %08x\n", (int)pend); last = pend; } @@ -643,14 +630,12 @@ void __init s3c24xx_init_irq(void) irqdbf("s3c2410_init_irq: registering s3c2410 interrupt handlers\n"); - for (irqno = IRQ_EINT4t7; irqno <= IRQ_ADCPARENT; irqno++) { + for (irqno = IRQ_BATT_FLT; irqno <= IRQ_ADCPARENT; irqno++) { /* set all the s3c2410 internal irqs */ switch (irqno) { /* deal with the special IRQs (cascaded) */ - case IRQ_EINT4t7: - case IRQ_EINT8t23: case IRQ_UART0: case IRQ_UART1: case IRQ_UART2: @@ -674,14 +659,12 @@ void __init s3c24xx_init_irq(void) /* setup the cascade irq handlers */ - set_irq_chained_handler(IRQ_EINT4t7, s3c_irq_demux_extint); - set_irq_chained_handler(IRQ_EINT8t23, s3c_irq_demux_extint); - set_irq_chained_handler(IRQ_UART0, s3c_irq_demux_uart0); set_irq_chained_handler(IRQ_UART1, s3c_irq_demux_uart1); set_irq_chained_handler(IRQ_UART2, s3c_irq_demux_uart2); set_irq_chained_handler(IRQ_ADCPARENT, s3c_irq_demux_adc); + /* external interrupts */ for (irqno = IRQ_EINT0; irqno <= IRQ_EINT3; irqno++) { diff --git a/arch/arm/mach-s3c2410/irq.h b/arch/arm/mach-s3c2410/irq.h index 842a9f42c..4abf0ca14 100644 --- a/arch/arm/mach-s3c2410/irq.h +++ b/arch/arm/mach-s3c2410/irq.h @@ -97,13 +97,3 @@ s3c_irqsub_ack(unsigned int irqno, unsigned int parentmask, unsigned int group) __raw_writel(parentmask, S3C2410_INTPND); } } - -/* exported for use in arch/arm/mach-s3c2410 */ - -#ifdef CONFIG_PM -extern int s3c_irq_wake(unsigned int irqno, unsigned int state); -#else -#define s3c_irq_wake NULL -#endif - -extern int s3c_irqext_type(unsigned int irq, unsigned int type); diff --git a/arch/arm/mach-s3c2410/mach-anubis.c b/arch/arm/mach-s3c2410/mach-anubis.c index 60641d452..3e327b8e4 100644 --- a/arch/arm/mach-s3c2410/mach-anubis.c +++ b/arch/arm/mach-s3c2410/mach-anubis.c @@ -60,12 +60,11 @@ static struct map_desc anubis_iodesc[] __initdata = { .virtual = (u32)S3C24XX_VA_ISA_BYTE, .pfn = __phys_to_pfn(0x0), .length = SZ_4M, - .type = MT_DEVICE, + .type = MT_DEVICE }, { .virtual = (u32)S3C24XX_VA_ISA_WORD, .pfn = __phys_to_pfn(0x0), - .length = SZ_4M, - .type = MT_DEVICE, + .length = SZ_4M, MT_DEVICE }, /* we could possibly compress the next set down into a set of smaller tables @@ -79,12 +78,36 @@ static struct map_desc anubis_iodesc[] __initdata = { .virtual = (u32)ANUBIS_VA_CTRL1, .pfn = __phys_to_pfn(ANUBIS_PA_CTRL1), .length = SZ_4K, - .type = MT_DEVICE, + .type = MT_DEVICE }, { .virtual = (u32)ANUBIS_VA_CTRL2, .pfn = __phys_to_pfn(ANUBIS_PA_CTRL2), .length = SZ_4K, - .type = MT_DEVICE, + .type =MT_DEVICE + }, + + /* IDE drives */ + + { + .virtual = (u32)ANUBIS_IDEPRI, + .pfn = __phys_to_pfn(S3C2410_CS3), + .length = SZ_1M, + .type = MT_DEVICE + }, { + .virtual = (u32)ANUBIS_IDEPRIAUX, + .pfn = __phys_to_pfn(S3C2410_CS3+(1<<26)), + .length = SZ_1M, + .type = MT_DEVICE + }, { + .virtual = (u32)ANUBIS_IDESEC, + .pfn = __phys_to_pfn(S3C2410_CS4), + .length = SZ_1M, + .type = MT_DEVICE + }, { + .virtual = (u32)ANUBIS_IDESECAUX, + .pfn = __phys_to_pfn(S3C2410_CS4+(1<<26)), + .length = SZ_1M, + .type = MT_DEVICE }, }; @@ -103,12 +126,12 @@ static struct s3c24xx_uart_clksrc anubis_serial_clocks[] = { .name = "pclk", .divisor = 1, .min_baud = 0, - .max_baud = 0, + .max_baud = 0. } }; -static struct s3c2410_uartcfg anubis_uartcfgs[] __initdata = { +static struct s3c2410_uartcfg anubis_uartcfgs[] = { [0] = { .hwport = 0, .flags = 0, @@ -116,7 +139,7 @@ static struct s3c2410_uartcfg anubis_uartcfgs[] __initdata = { .ulcon = ULCON, .ufcon = UFCON, .clocks = anubis_serial_clocks, - .clocks_size = ARRAY_SIZE(anubis_serial_clocks), + .clocks_size = ARRAY_SIZE(anubis_serial_clocks) }, [1] = { .hwport = 2, @@ -125,7 +148,7 @@ static struct s3c2410_uartcfg anubis_uartcfgs[] __initdata = { .ulcon = ULCON, .ufcon = UFCON, .clocks = anubis_serial_clocks, - .clocks_size = ARRAY_SIZE(anubis_serial_clocks), + .clocks_size = ARRAY_SIZE(anubis_serial_clocks) }, }; @@ -139,7 +162,7 @@ static struct mtd_partition anubis_default_nand_part[] = { [0] = { .name = "Boot Agent", .size = SZ_16K, - .offset = 0, + .offset = 0 }, [1] = { .name = "/boot", @@ -171,21 +194,21 @@ static struct s3c2410_nand_set anubis_nand_sets[] = { .nr_chips = 1, .nr_map = external_map, .nr_partitions = ARRAY_SIZE(anubis_default_nand_part), - .partitions = anubis_default_nand_part, + .partitions = anubis_default_nand_part }, [0] = { .name = "chip0", .nr_chips = 1, .nr_map = chip0_map, .nr_partitions = ARRAY_SIZE(anubis_default_nand_part), - .partitions = anubis_default_nand_part, + .partitions = anubis_default_nand_part }, [2] = { .name = "chip1", .nr_chips = 1, .nr_map = chip1_map, .nr_partitions = ARRAY_SIZE(anubis_default_nand_part), - .partitions = anubis_default_nand_part, + .partitions = anubis_default_nand_part }, }; @@ -209,61 +232,13 @@ static void anubis_nand_select(struct s3c2410_nand_set *set, int slot) static struct s3c2410_platform_nand anubis_nand_info = { .tacls = 25, - .twrph0 = 55, - .twrph1 = 40, + .twrph0 = 80, + .twrph1 = 80, .nr_sets = ARRAY_SIZE(anubis_nand_sets), .sets = anubis_nand_sets, .select_chip = anubis_nand_select, }; -/* IDE channels */ - -static struct resource anubis_ide0_resource[] = { - { - .start = S3C2410_CS3, - .end = S3C2410_CS3 + (8*32) - 1, - .flags = IORESOURCE_MEM, - }, { - .start = S3C2410_CS3 + (1<<26), - .end = S3C2410_CS3 + (1<<26) + (8*32) - 1, - .flags = IORESOURCE_MEM, - }, { - .start = IRQ_IDE0, - .end = IRQ_IDE0, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct platform_device anubis_device_ide0 = { - .name = "simtec-ide", - .id = 0, - .num_resources = ARRAY_SIZE(anubis_ide0_resource), - .resource = anubis_ide0_resource, -}; - -static struct resource anubis_ide1_resource[] = { - { - .start = S3C2410_CS4, - .end = S3C2410_CS4 + (8*32) - 1, - .flags = IORESOURCE_MEM, - }, { - .start = S3C2410_CS4 + (1<<26), - .end = S3C2410_CS4 + (1<<26) + (8*32) - 1, - .flags = IORESOURCE_MEM, - }, { - .start = IRQ_IDE0, - .end = IRQ_IDE0, - .flags = IORESOURCE_IRQ, - }, -}; - - -static struct platform_device anubis_device_ide1 = { - .name = "simtec-ide", - .id = 1, - .num_resources = ARRAY_SIZE(anubis_ide1_resource), - .resource = anubis_ide1_resource, -}; /* Standard Anubis devices */ @@ -274,8 +249,6 @@ static struct platform_device *anubis_devices[] __initdata = { &s3c_device_i2c, &s3c_device_rtc, &s3c_device_nand, - &anubis_device_ide0, - &anubis_device_ide1, }; static struct clk *anubis_clocks[] = { @@ -290,7 +263,7 @@ static struct s3c24xx_board anubis_board __initdata = { .devices = anubis_devices, .devices_count = ARRAY_SIZE(anubis_devices), .clocks = anubis_clocks, - .clocks_count = ARRAY_SIZE(anubis_clocks), + .clocks_count = ARRAY_SIZE(anubis_clocks) }; static void __init anubis_map_io(void) diff --git a/arch/arm/mach-s3c2410/mach-bast.c b/arch/arm/mach-s3c2410/mach-bast.c index 2968fb235..995bb8add 100644 --- a/arch/arm/mach-s3c2410/mach-bast.c +++ b/arch/arm/mach-s3c2410/mach-bast.c @@ -8,6 +8,31 @@ * 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: + * 14-Sep-2004 BJD USB power control + * 20-Aug-2004 BJD Added s3c2410_board struct + * 18-Aug-2004 BJD Added platform devices from default set + * 16-May-2003 BJD Created initial version + * 16-Aug-2003 BJD Fixed header files and copyright, added URL + * 05-Sep-2003 BJD Moved to v2.6 kernel + * 06-Jan-2003 BJD Updates for + * 18-Jan-2003 BJD Added serial port configuration + * 05-Oct-2004 BJD Power management code + * 04-Nov-2004 BJD Updated serial port clocks + * 04-Jan-2005 BJD New uart init call + * 10-Jan-2005 BJD Removed include of s3c2410.h + * 14-Jan-2005 BJD Add support for muitlple NAND devices + * 03-Mar-2005 BJD Ensured that bast-cpld.h is included + * 10-Mar-2005 LCVR Changed S3C2410_VA to S3C24XX_VA + * 14-Mar-2005 BJD Updated for __iomem changes + * 22-Jun-2005 BJD Added DM9000 platform information + * 28-Jun-2005 BJD Moved pm functionality out to common code + * 17-Jul-2005 BJD Changed to platform device for SuperIO 16550s + * 25-Jul-2005 BJD Removed ASIX static mappings + * 27-Jul-2005 BJD Ensure maximum frequency of i2c bus + * 20-Sep-2005 BJD Added static to non-exported items + * 26-Oct-2005 BJD Added FB platform data */ #include @@ -183,7 +208,7 @@ static struct s3c24xx_uart_clksrc bast_serial_clocks[] = { }; -static struct s3c2410_uartcfg bast_uartcfgs[] __initdata = { +static struct s3c2410_uartcfg bast_uartcfgs[] = { [0] = { .hwport = 0, .flags = 0, diff --git a/arch/arm/mach-s3c2410/mach-h1940.c b/arch/arm/mach-s3c2410/mach-h1940.c index 8c895c077..646a3a5d3 100644 --- a/arch/arm/mach-s3c2410/mach-h1940.c +++ b/arch/arm/mach-s3c2410/mach-h1940.c @@ -9,6 +9,23 @@ * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * + * Modifications: + * 16-May-2003 BJD Created initial version + * 16-Aug-2003 BJD Fixed header files and copyright, added URL + * 05-Sep-2003 BJD Moved to v2.6 kernel + * 06-Jan-2003 BJD Updates for + * 18-Jan-2003 BJD Added serial port configuration + * 17-Feb-2003 BJD Copied to mach-ipaq.c + * 21-Aug-2004 BJD Added struct s3c2410_board + * 04-Sep-2004 BJD Changed uart init, renamed ipaq_ -> h1940_ + * 18-Oct-2004 BJD Updated new board structure name + * 04-Nov-2004 BJD Change for new serial clock + * 04-Jan-2005 BJD Updated uart init call + * 10-Jan-2005 BJD Removed include of s3c2410.h + * 14-Jan-2005 BJD Added clock init + * 10-Mar-2005 LCVR Changed S3C2410_VA to S3C24XX_VA + * 20-Sep-2005 BJD Added static to non-exported items + * 26-Oct-2005 BJD Changed name of fb init call */ #include @@ -55,7 +72,7 @@ static struct map_desc h1940_iodesc[] __initdata = { #define ULCON S3C2410_LCON_CS8 | S3C2410_LCON_PNONE | S3C2410_LCON_STOPB #define UFCON S3C2410_UFCON_RXTRIG8 | S3C2410_UFCON_FIFOMODE -static struct s3c2410_uartcfg h1940_uartcfgs[] __initdata = { +static struct s3c2410_uartcfg h1940_uartcfgs[] = { [0] = { .hwport = 0, .flags = 0, diff --git a/arch/arm/mach-s3c2410/mach-nexcoder.c b/arch/arm/mach-s3c2410/mach-nexcoder.c index 065a1d4e8..07d09509a 100644 --- a/arch/arm/mach-s3c2410/mach-nexcoder.c +++ b/arch/arm/mach-s3c2410/mach-nexcoder.c @@ -51,7 +51,7 @@ static struct map_desc nexcoder_iodesc[] __initdata = { #define ULCON S3C2410_LCON_CS8 | S3C2410_LCON_PNONE | S3C2410_LCON_STOPB #define UFCON S3C2410_UFCON_RXTRIG12 | S3C2410_UFCON_FIFOMODE -static struct s3c2410_uartcfg nexcoder_uartcfgs[] __initdata = { +static struct s3c2410_uartcfg nexcoder_uartcfgs[] = { [0] = { .hwport = 0, .flags = 0, diff --git a/arch/arm/mach-s3c2410/mach-otom.c b/arch/arm/mach-s3c2410/mach-otom.c index c71673fd9..b39daedf9 100644 --- a/arch/arm/mach-s3c2410/mach-otom.c +++ b/arch/arm/mach-s3c2410/mach-otom.c @@ -45,7 +45,7 @@ static struct map_desc otom11_iodesc[] __initdata = { #define ULCON S3C2410_LCON_CS8 | S3C2410_LCON_PNONE | S3C2410_LCON_STOPB #define UFCON S3C2410_UFCON_RXTRIG12 | S3C2410_UFCON_FIFOMODE -static struct s3c2410_uartcfg otom11_uartcfgs[] __initdata = { +static struct s3c2410_uartcfg otom11_uartcfgs[] = { [0] = { .hwport = 0, .flags = 0, diff --git a/arch/arm/mach-s3c2410/mach-rx3715.c b/arch/arm/mach-s3c2410/mach-rx3715.c index 23d7c0520..0260ed5ab 100644 --- a/arch/arm/mach-s3c2410/mach-rx3715.c +++ b/arch/arm/mach-s3c2410/mach-rx3715.c @@ -9,6 +9,15 @@ * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * + * Modifications: + * 16-Sep-2004 BJD Copied from mach-h1940.c + * 25-Oct-2004 BJD Updates for 2.6.10-rc1 + * 10-Jan-2005 BJD Removed include of s3c2410.h s3c2440.h + * 14-Jan-2005 BJD Added new clock init + * 10-Mar-2005 LCVR Changed S3C2410_VA to S3C24XX_VA + * 14-Mar-2005 BJD Fixed __iomem warnings + * 20-Sep-2005 BJD Added static to non-exported items + * 31-Oct-2005 BJD Added LCD setup for framebuffer */ #include @@ -23,11 +32,6 @@ #include #include -#include -#include -#include -#include - #include #include #include @@ -42,7 +46,6 @@ #include #include -#include #include #include "clock.h" @@ -167,39 +170,12 @@ static struct s3c2410fb_mach_info rx3715_lcdcfg __initdata = { }, }; -static struct mtd_partition rx3715_nand_part[] = { - [0] = { - .name = "Whole Flash", - .offset = 0, - .size = MTDPART_SIZ_FULL, - .mask_flags = MTD_WRITEABLE, - } -}; - -static struct s3c2410_nand_set rx3715_nand_sets[] = { - [0] = { - .name = "Internal", - .nr_chips = 1, - .nr_partitions = ARRAY_SIZE(rx3715_nand_part), - .partitions = rx3715_nand_part, - }, -}; - -static struct s3c2410_platform_nand rx3715_nand_info = { - .tacls = 25, - .twrph0 = 50, - .twrph1 = 15, - .nr_sets = ARRAY_SIZE(rx3715_nand_sets), - .sets = rx3715_nand_sets, -}; - static struct platform_device *rx3715_devices[] __initdata = { &s3c_device_usb, &s3c_device_lcd, &s3c_device_wdt, &s3c_device_i2c, &s3c_device_iis, - &s3c_device_nand, }; static struct s3c24xx_board rx3715_board __initdata = { @@ -209,8 +185,6 @@ static struct s3c24xx_board rx3715_board __initdata = { static void __init rx3715_map_io(void) { - s3c_device_nand.dev.platform_data = &rx3715_nand_info; - s3c24xx_init_io(rx3715_iodesc, ARRAY_SIZE(rx3715_iodesc)); s3c24xx_init_clocks(16934000); s3c24xx_init_uarts(rx3715_uartcfgs, ARRAY_SIZE(rx3715_uartcfgs)); diff --git a/arch/arm/mach-s3c2410/mach-smdk2410.c b/arch/arm/mach-s3c2410/mach-smdk2410.c index b3b0171d5..1e76e1fdf 100644 --- a/arch/arm/mach-s3c2410/mach-smdk2410.c +++ b/arch/arm/mach-s3c2410/mach-smdk2410.c @@ -27,6 +27,9 @@ * derived from linux/arch/arm/mach-s3c2410/mach-bast.c, written by * Ben Dooks * + * 10-Mar-2005 LCVR Changed S3C2410_VA to S3C24XX_VA + * 20-Sep-2005 BJD Added static to non-exported items + * ***********************************************************************/ #include @@ -51,8 +54,6 @@ #include "devs.h" #include "cpu.h" -#include "common-smdk.h" - static struct map_desc smdk2410_iodesc[] __initdata = { /* nothing here yet */ }; @@ -61,7 +62,7 @@ static struct map_desc smdk2410_iodesc[] __initdata = { #define ULCON S3C2410_LCON_CS8 | S3C2410_LCON_PNONE | S3C2410_LCON_STOPB #define UFCON S3C2410_UFCON_RXTRIG8 | S3C2410_UFCON_FIFOMODE -static struct s3c2410_uartcfg smdk2410_uartcfgs[] __initdata = { +static struct s3c2410_uartcfg smdk2410_uartcfgs[] = { [0] = { .hwport = 0, .flags = 0, @@ -106,6 +107,11 @@ static void __init smdk2410_map_io(void) s3c24xx_set_board(&smdk2410_board); } +static void __init smdk2410_init_irq(void) +{ + s3c24xx_init_irq(); +} + MACHINE_START(SMDK2410, "SMDK2410") /* @TODO: request a new identifier and switch * to SMDK2410 */ /* Maintainer: Jonas Dietsche */ @@ -113,8 +119,7 @@ MACHINE_START(SMDK2410, "SMDK2410") /* @TODO: request a new identifier and switc .io_pg_offst = (((u32)S3C24XX_VA_UART) >> 18) & 0xfffc, .boot_params = S3C2410_SDRAM_PA + 0x100, .map_io = smdk2410_map_io, - .init_irq = s3c24xx_init_irq, - .init_machine = smdk_machine_init, + .init_irq = smdk2410_init_irq, .timer = &s3c24xx_timer, MACHINE_END diff --git a/arch/arm/mach-s3c2410/mach-smdk2440.c b/arch/arm/mach-s3c2410/mach-smdk2440.c index d661c6b7f..f4315721c 100644 --- a/arch/arm/mach-s3c2410/mach-smdk2440.c +++ b/arch/arm/mach-s3c2410/mach-smdk2440.c @@ -53,8 +53,7 @@ #include "clock.h" #include "devs.h" #include "cpu.h" - -#include "common-smdk.h" +#include "pm.h" static struct map_desc smdk2440_iodesc[] __initdata = { /* ISA IO Space map (memory space selected by A24) */ @@ -86,7 +85,7 @@ static struct map_desc smdk2440_iodesc[] __initdata = { #define ULCON S3C2410_LCON_CS8 | S3C2410_LCON_PNONE | S3C2410_LCON_STOPB #define UFCON S3C2410_UFCON_RXTRIG8 | S3C2410_UFCON_FIFOMODE -static struct s3c2410_uartcfg smdk2440_uartcfgs[] __initdata = { +static struct s3c2410_uartcfg smdk2440_uartcfgs[] = { [0] = { .hwport = 0, .flags = 0, @@ -198,9 +197,21 @@ static void __init smdk2440_map_io(void) static void __init smdk2440_machine_init(void) { + /* Configure the LEDs (even if we have no LED support)*/ + + s3c2410_gpio_cfgpin(S3C2410_GPF4, S3C2410_GPF4_OUTP); + s3c2410_gpio_cfgpin(S3C2410_GPF5, S3C2410_GPF5_OUTP); + s3c2410_gpio_cfgpin(S3C2410_GPF6, S3C2410_GPF6_OUTP); + s3c2410_gpio_cfgpin(S3C2410_GPF7, S3C2410_GPF7_OUTP); + + s3c2410_gpio_setpin(S3C2410_GPF4, 0); + s3c2410_gpio_setpin(S3C2410_GPF5, 0); + s3c2410_gpio_setpin(S3C2410_GPF6, 0); + s3c2410_gpio_setpin(S3C2410_GPF7, 0); + s3c24xx_fb_set_platdata(&smdk2440_lcd_cfg); - smdk_machine_init(); + s3c2410_pm_init(); } MACHINE_START(S3C2440, "SMDK2440") diff --git a/arch/arm/mach-s3c2410/mach-vr1000.c b/arch/arm/mach-s3c2410/mach-vr1000.c index a0d7692cd..785fc9cdc 100644 --- a/arch/arm/mach-s3c2410/mach-vr1000.c +++ b/arch/arm/mach-s3c2410/mach-vr1000.c @@ -10,6 +10,25 @@ * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * + * Modifications: + * 14-Sep-2004 BJD USB Power control + * 04-Sep-2004 BJD Added new uart init, and io init + * 21-Aug-2004 BJD Added struct s3c2410_board + * 06-Aug-2004 BJD Fixed call to time initialisation + * 05-Apr-2004 BJD Copied to make mach-vr1000.c + * 18-Oct-2004 BJD Updated board struct + * 04-Nov-2004 BJD Clock and serial configuration update + * + * 04-Jan-2005 BJD Updated uart init call + * 10-Jan-2005 BJD Removed include of s3c2410.h + * 14-Jan-2005 BJD Added clock init + * 15-Jan-2005 BJD Add serial port device definition + * 20-Jan-2005 BJD Use UPF_IOREMAP for ports + * 10-Feb-2005 BJD Added power-off capability + * 10-Mar-2005 LCVR Changed S3C2410_VA to S3C24XX_VA + * 14-Mar-2006 BJD void __iomem fixes + * 22-Jun-2006 BJD Added DM9000 platform information + * 20-Sep-2005 BJD Added static to non-exported items */ #include @@ -147,7 +166,7 @@ static struct s3c24xx_uart_clksrc vr1000_serial_clocks[] = { } }; -static struct s3c2410_uartcfg vr1000_uartcfgs[] __initdata = { +static struct s3c2410_uartcfg vr1000_uartcfgs[] = { [0] = { .hwport = 0, .flags = 0, diff --git a/arch/arm/mach-s3c2410/pm-simtec.c b/arch/arm/mach-s3c2410/pm-simtec.c index 7b244566a..4c7ccef6c 100644 --- a/arch/arm/mach-s3c2410/pm-simtec.c +++ b/arch/arm/mach-s3c2410/pm-simtec.c @@ -48,8 +48,7 @@ static __init int pm_simtec_init(void) /* check which machine we are running on */ - if (!machine_is_bast() && !machine_is_vr1000() && - !machine_is_anubis() && !machine_is_osiris()) + if (!machine_is_bast() && !machine_is_vr1000() && !machine_is_anubis()) return 0; printk(KERN_INFO "Simtec Board Power Manangement" COPYRIGHT "\n"); diff --git a/arch/arm/mach-s3c2410/pm.c b/arch/arm/mach-s3c2410/pm.c index a589fe76d..fe57d966a 100644 --- a/arch/arm/mach-s3c2410/pm.c +++ b/arch/arm/mach-s3c2410/pm.c @@ -29,6 +29,7 @@ * 10-Mar-2005 LCVR Changed S3C2410_VA_UART to S3C24XX_VA_UART */ +#include #include #include #include @@ -57,11 +58,7 @@ unsigned long s3c_pm_flags; /* cache functions from arch/arm/mm/proc-arm920.S */ -#ifndef CONFIG_CPU_DCACHE_WRITETHROUGH extern void arm920_flush_kern_cache_all(void); -#else -static void arm920_flush_kern_cache_all(void) { } -#endif #define PFX "s3c24xx-pm: " diff --git a/arch/arm/mach-s3c2410/s3c2400-gpio.c b/arch/arm/mach-s3c2410/s3c2400-gpio.c index f2a78175a..5127f39fa 100644 --- a/arch/arm/mach-s3c2410/s3c2400-gpio.c +++ b/arch/arm/mach-s3c2410/s3c2400-gpio.c @@ -17,7 +17,10 @@ * 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 -*/ + * + * Changelog + * 15-Jan-2006 LCVR Splitted from gpio.c, adding support for the S3C2400 + */ #include #include diff --git a/arch/arm/mach-s3c2410/s3c2410-gpio.c b/arch/arm/mach-s3c2410/s3c2410-gpio.c index 471a71490..d5e1caea1 100644 --- a/arch/arm/mach-s3c2410/s3c2410-gpio.c +++ b/arch/arm/mach-s3c2410/s3c2410-gpio.c @@ -18,6 +18,9 @@ * 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 + * + * Changelog + * 15-Jan-2006 LCVR Splitted from gpio.c */ #include @@ -35,7 +38,7 @@ int s3c2410_gpio_irqfilter(unsigned int pin, unsigned int on, unsigned int config) { - void __iomem *reg = S3C24XX_EINFLT0; + void __iomem *reg = S3C2410_EINFLT0; unsigned long flags; unsigned long val; @@ -44,7 +47,7 @@ int s3c2410_gpio_irqfilter(unsigned int pin, unsigned int on, config &= 0xff; - pin -= S3C2410_GPG8; + pin -= S3C2410_GPG8_EINT16; reg += pin & ~3; local_irq_save(flags); @@ -58,10 +61,10 @@ int s3c2410_gpio_irqfilter(unsigned int pin, unsigned int on, /* update filter enable */ - val = __raw_readl(S3C24XX_EXTINT2); + val = __raw_readl(S3C2410_EXTINT2); val &= ~(1 << ((pin * 4) + 3)); val |= on << ((pin * 4) + 3); - __raw_writel(val, S3C24XX_EXTINT2); + __raw_writel(val, S3C2410_EXTINT2); local_irq_restore(flags); @@ -72,7 +75,7 @@ EXPORT_SYMBOL(s3c2410_gpio_irqfilter); int s3c2410_gpio_getirq(unsigned int pin) { - if (pin < S3C2410_GPF0 || pin > S3C2410_GPG15) + if (pin < S3C2410_GPF0 || pin > S3C2410_GPG15_EINT23) return -1; /* not valid interrupts */ if (pin < S3C2410_GPG0 && pin > S3C2410_GPF7) diff --git a/arch/arm/mach-s3c2410/s3c2410.c b/arch/arm/mach-s3c2410/s3c2410.c index a110cff9c..0a2013a76 100644 --- a/arch/arm/mach-s3c2410/s3c2410.c +++ b/arch/arm/mach-s3c2410/s3c2410.c @@ -27,7 +27,6 @@ #include #include #include -#include #include #include @@ -43,7 +42,6 @@ #include "s3c2410.h" #include "cpu.h" -#include "devs.h" #include "clock.h" /* Initial IO mappings */ @@ -57,13 +55,93 @@ static struct map_desc s3c2410_iodesc[] __initdata = { IODESC_ENT(WATCHDOG), }; +static struct resource s3c_uart0_resource[] = { + [0] = { + .start = S3C2410_PA_UART0, + .end = S3C2410_PA_UART0 + 0x3fff, + .flags = IORESOURCE_MEM, + }, + [1] = { + .start = IRQ_S3CUART_RX0, + .end = IRQ_S3CUART_ERR0, + .flags = IORESOURCE_IRQ, + } + +}; + +static struct resource s3c_uart1_resource[] = { + [0] = { + .start = S3C2410_PA_UART1, + .end = S3C2410_PA_UART1 + 0x3fff, + .flags = IORESOURCE_MEM, + }, + [1] = { + .start = IRQ_S3CUART_RX1, + .end = IRQ_S3CUART_ERR1, + .flags = IORESOURCE_IRQ, + } +}; + +static struct resource s3c_uart2_resource[] = { + [0] = { + .start = S3C2410_PA_UART2, + .end = S3C2410_PA_UART2 + 0x3fff, + .flags = IORESOURCE_MEM, + }, + [1] = { + .start = IRQ_S3CUART_RX2, + .end = IRQ_S3CUART_ERR2, + .flags = IORESOURCE_IRQ, + } +}; + /* our uart devices */ +static struct platform_device s3c_uart0 = { + .name = "s3c2410-uart", + .id = 0, + .num_resources = ARRAY_SIZE(s3c_uart0_resource), + .resource = s3c_uart0_resource, +}; + + +static struct platform_device s3c_uart1 = { + .name = "s3c2410-uart", + .id = 1, + .num_resources = ARRAY_SIZE(s3c_uart1_resource), + .resource = s3c_uart1_resource, +}; + +static struct platform_device s3c_uart2 = { + .name = "s3c2410-uart", + .id = 2, + .num_resources = ARRAY_SIZE(s3c_uart2_resource), + .resource = s3c_uart2_resource, +}; + +static struct platform_device *uart_devices[] __initdata = { + &s3c_uart0, + &s3c_uart1, + &s3c_uart2 +}; + +static int s3c2410_uart_count = 0; + /* uart registration process */ void __init s3c2410_init_uarts(struct s3c2410_uartcfg *cfg, int no) { - s3c24xx_init_uartdevs("s3c2410-uart", s3c2410_uart_resources, cfg, no); + struct platform_device *platdev; + int uart; + + for (uart = 0; uart < no; uart++, cfg++) { + platdev = uart_devices[cfg->hwport]; + + s3c24xx_uart_devs[uart] = platdev; + platdev->dev.platform_data = cfg; + } + + s3c2410_uart_count = uart; } /* s3c2410_map_io @@ -109,33 +187,11 @@ void __init s3c2410_init_clocks(int xtal) */ s3c24xx_setup_clocks(xtal, fclk, hclk, pclk); - s3c2410_baseclk_add(); } -struct sysdev_class s3c2410_sysclass = { - set_kset_name("s3c2410-core"), -}; - -static struct sys_device s3c2410_sysdev = { - .cls = &s3c2410_sysclass, -}; - -/* need to register class before we actually register the device, and - * we also need to ensure that it has been initialised before any of the - * drivers even try to use it (even if not on an s3c2440 based system) - * as a driver which may support both 2410 and 2440 may try and use it. -*/ - -static int __init s3c2410_core_init(void) -{ - return sysdev_class_register(&s3c2410_sysclass); -} - -core_initcall(s3c2410_core_init); - int __init s3c2410_init(void) { printk("S3C2410: Initialising architecture\n"); - return sysdev_register(&s3c2410_sysdev); + return platform_add_devices(s3c24xx_uart_devs, s3c2410_uart_count); } diff --git a/arch/arm/mach-s3c2410/s3c2410.h b/arch/arm/mach-s3c2410/s3c2410.h index fbed084f2..4d5312a48 100644 --- a/arch/arm/mach-s3c2410/s3c2410.h +++ b/arch/arm/mach-s3c2410/s3c2410.h @@ -9,6 +9,14 @@ * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * + * Modifications: + * 18-Aug-2004 BJD Created initial version + * 20-Aug-2004 BJD Added s3c2410_board struct + * 04-Sep-2004 BJD Added s3c2410_init_uarts() call + * 17-Oct-2004 BJD Moved board out to cpu + * 04-Jan-2005 BJD Changed uart init + * 10-Jan-2005 BJD Removed timer to cpu.h, moved 2410 specific bits here + * 14-Jan-2005 BJD Added s3c2410_init_clocks call */ #ifdef CONFIG_CPU_S3C2410 @@ -21,8 +29,6 @@ extern void s3c2410_init_uarts(struct s3c2410_uartcfg *cfg, int no); extern void s3c2410_init_clocks(int xtal); -extern int s3c2410_baseclk_add(void); - #else #define s3c2410_init_clocks NULL #define s3c2410_init_uarts NULL diff --git a/arch/arm/mach-s3c2410/s3c2440-clock.c b/arch/arm/mach-s3c2410/s3c2440-clock.c index 15796864d..b557a2be8 100644 --- a/arch/arm/mach-s3c2410/s3c2440-clock.c +++ b/arch/arm/mach-s3c2410/s3c2440-clock.c @@ -31,7 +31,6 @@ #include #include #include -#include #include #include @@ -46,111 +45,59 @@ /* S3C2440 extended clock support */ -static unsigned long s3c2440_camif_upll_round(struct clk *clk, - unsigned long rate) -{ - unsigned long parent_rate = clk_get_rate(clk->parent); - int div; - - if (rate > parent_rate) - return parent_rate; - - /* note, we remove the +/- 1 calculations for the divisor */ - - div = (parent_rate / rate) / 2; - - if (div < 1) - div = 1; - else if (div > 16) - div = 16; - - return parent_rate / (div * 2); -} - -static int s3c2440_camif_upll_setrate(struct clk *clk, unsigned long rate) -{ - unsigned long parent_rate = clk_get_rate(clk->parent); - unsigned long camdivn = __raw_readl(S3C2440_CAMDIVN); - - rate = s3c2440_camif_upll_round(clk, rate); - - camdivn &= ~(S3C2440_CAMDIVN_CAMCLK_SEL | S3C2440_CAMDIVN_CAMCLK_MASK); - - if (rate != parent_rate) { - camdivn |= S3C2440_CAMDIVN_CAMCLK_SEL; - camdivn |= (((parent_rate / rate) / 2) - 1); - } - - __raw_writel(camdivn, S3C2440_CAMDIVN); - - return 0; -} - -/* Extra S3C2440 clocks */ +static struct clk s3c2440_clk_upll = { + .name = "upll", + .id = -1, +}; static struct clk s3c2440_clk_cam = { .name = "camif", .id = -1, - .enable = s3c2410_clkcon_enable, + .enable = s3c24xx_clkcon_enable, .ctrlbit = S3C2440_CLKCON_CAMERA, }; -static struct clk s3c2440_clk_cam_upll = { - .name = "camif-upll", - .id = -1, - .set_rate = s3c2440_camif_upll_setrate, - .round_rate = s3c2440_camif_upll_round, -}; - static struct clk s3c2440_clk_ac97 = { .name = "ac97", .id = -1, - .enable = s3c2410_clkcon_enable, + .enable = s3c24xx_clkcon_enable, .ctrlbit = S3C2440_CLKCON_CAMERA, }; static int s3c2440_clk_add(struct sys_device *sysdev) { + unsigned long upllcon = __raw_readl(S3C2410_UPLLCON); unsigned long camdivn = __raw_readl(S3C2440_CAMDIVN); - unsigned long clkdivn; struct clk *clk_h; struct clk *clk_p; - struct clk *clk_upll; + struct clk *clk_xtal; + + clk_xtal = clk_get(NULL, "xtal"); + if (IS_ERR(clk_xtal)) { + printk(KERN_ERR "S3C2440: Failed to get clk_xtal\n"); + return -EINVAL; + } + + s3c2440_clk_upll.rate = s3c2410_get_pll(upllcon, clk_xtal->rate); - printk("S3C2440: Clock Support, DVS %s\n", + printk("S3C2440: Clock Support, UPLL %ld.%03ld MHz, DVS %s\n", + print_mhz(s3c2440_clk_upll.rate), (camdivn & S3C2440_CAMDIVN_DVSEN) ? "on" : "off"); clk_p = clk_get(NULL, "pclk"); clk_h = clk_get(NULL, "hclk"); - clk_upll = clk_get(NULL, "upll"); - if (IS_ERR(clk_p) || IS_ERR(clk_h) || IS_ERR(clk_upll)) { + if (IS_ERR(clk_p) || IS_ERR(clk_h)) { printk(KERN_ERR "S3C2440: Failed to get parent clocks\n"); return -EINVAL; } - /* check rate of UPLL, and if it is near 96MHz, then change - * to using half the UPLL rate for the system */ - - if (clk_get_rate(clk_upll) > (94 * MHZ)) { - clk_usb_bus.rate = clk_get_rate(clk_upll) / 2; - - mutex_lock(&clocks_mutex); - - clkdivn = __raw_readl(S3C2410_CLKDIVN); - clkdivn |= S3C2440_CLKDIVN_UCLK; - __raw_writel(clkdivn, S3C2410_CLKDIVN); - - mutex_unlock(&clocks_mutex); - } - s3c2440_clk_cam.parent = clk_h; s3c2440_clk_ac97.parent = clk_p; - s3c2440_clk_cam_upll.parent = clk_upll; s3c24xx_register_clock(&s3c2440_clk_ac97); s3c24xx_register_clock(&s3c2440_clk_cam); - s3c24xx_register_clock(&s3c2440_clk_cam_upll); + s3c24xx_register_clock(&s3c2440_clk_upll); clk_disable(&s3c2440_clk_ac97); clk_disable(&s3c2440_clk_cam); diff --git a/arch/arm/mach-s3c2410/s3c2440-irq.c b/arch/arm/mach-s3c2410/s3c2440-irq.c index 1667ba1fa..278d0044c 100644 --- a/arch/arm/mach-s3c2410/s3c2440-irq.c +++ b/arch/arm/mach-s3c2410/s3c2440-irq.c @@ -17,6 +17,9 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * + * Changelog: + * 25-Jul-2005 BJD Split from irq.c + * */ #include @@ -97,12 +100,73 @@ static struct irqchip s3c_irq_wdtac97 = { .ack = s3c_irq_wdtac97_ack, }; +/* camera irq */ + +static void s3c_irq_demux_cam(unsigned int irq, + struct irqdesc *desc, + struct pt_regs *regs) +{ + unsigned int subsrc, submsk; + struct irqdesc *mydesc; + + /* read the current pending interrupts, and the mask + * for what it is available */ + + subsrc = __raw_readl(S3C2410_SUBSRCPND); + submsk = __raw_readl(S3C2410_INTSUBMSK); + + subsrc &= ~submsk; + subsrc >>= 11; + subsrc &= 3; + + if (subsrc != 0) { + if (subsrc & 1) { + mydesc = irq_desc + IRQ_S3C2440_CAM_C; + desc_handle_irq(IRQ_S3C2440_CAM_C, mydesc, regs); + } + if (subsrc & 2) { + mydesc = irq_desc + IRQ_S3C2440_CAM_P; + desc_handle_irq(IRQ_S3C2440_CAM_P, mydesc, regs); + } + } +} + +#define INTMSK_CAM (1UL << (IRQ_CAM - IRQ_EINT0)) + +static void +s3c_irq_cam_mask(unsigned int irqno) +{ + s3c_irqsub_mask(irqno, INTMSK_CAM, 3<<11); +} + +static void +s3c_irq_cam_unmask(unsigned int irqno) +{ + s3c_irqsub_unmask(irqno, INTMSK_CAM); +} + +static void +s3c_irq_cam_ack(unsigned int irqno) +{ + s3c_irqsub_maskack(irqno, INTMSK_CAM, 3<<11); +} + +static struct irqchip s3c_irq_cam = { + .mask = s3c_irq_cam_mask, + .unmask = s3c_irq_cam_unmask, + .ack = s3c_irq_cam_ack, +}; + static int s3c2440_irq_add(struct sys_device *sysdev) { unsigned int irqno; printk("S3C2440: IRQ Support\n"); + set_irq_chip(IRQ_NFCON, &s3c_irq_level_chip); + set_irq_handler(IRQ_NFCON, do_level_IRQ); + set_irq_flags(IRQ_NFCON, IRQF_VALID); + /* add new chained handler for wdt, ac7 */ set_irq_chip(IRQ_WDT, &s3c_irq_level_chip); @@ -115,6 +179,18 @@ static int s3c2440_irq_add(struct sys_device *sysdev) set_irq_flags(irqno, IRQF_VALID); } + /* add chained handler for camera */ + + set_irq_chip(IRQ_CAM, &s3c_irq_level_chip); + set_irq_handler(IRQ_CAM, do_level_IRQ); + set_irq_chained_handler(IRQ_CAM, s3c_irq_demux_cam); + + for (irqno = IRQ_S3C2440_CAM_C; irqno <= IRQ_S3C2440_CAM_P; irqno++) { + set_irq_chip(irqno, &s3c_irq_cam); + set_irq_handler(irqno, do_level_IRQ); + set_irq_flags(irqno, IRQF_VALID); + } + return 0; } @@ -122,10 +198,10 @@ static struct sysdev_driver s3c2440_irq_driver = { .add = s3c2440_irq_add, }; -static int s3c2440_irq_init(void) +static int s3c24xx_irq_driver(void) { return sysdev_driver_register(&s3c2440_sysclass, &s3c2440_irq_driver); } -arch_initcall(s3c2440_irq_init); +arch_initcall(s3c24xx_irq_driver); diff --git a/arch/arm/mach-s3c2410/s3c2440.c b/arch/arm/mach-s3c2410/s3c2440.c index 0ab50f44f..b7fe6d945 100644 --- a/arch/arm/mach-s3c2410/s3c2440.c +++ b/arch/arm/mach-s3c2410/s3c2440.c @@ -1,6 +1,6 @@ /* linux/arch/arm/mach-s3c2410/s3c2440.c * - * Copyright (c) 2004-2006 Simtec Electronics + * Copyright (c) 2004-2005 Simtec Electronics * Ben Dooks * * Samsung S3C2440 Mobile CPU support @@ -8,6 +8,16 @@ * 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: + * 24-Aug-2004 BJD Start of s3c2440 support + * 12-Oct-2004 BJD Moved clock info out to clock.c + * 01-Nov-2004 BJD Fixed clock build code + * 09-Nov-2004 BJD Added sysdev for power management + * 04-Nov-2004 BJD New serial registration + * 15-Nov-2004 BJD Rename the i2c device for the s3c2440 + * 14-Jan-2005 BJD Moved clock init code into seperate function + * 14-Jan-2005 BJD Removed un-used clock bits */ #include @@ -40,20 +50,234 @@ #include "cpu.h" #include "pm.h" + +static struct map_desc s3c2440_iodesc[] __initdata = { + IODESC_ENT(USBHOST), + IODESC_ENT(CLKPWR), + IODESC_ENT(LCD), + IODESC_ENT(TIMER), + IODESC_ENT(ADC), + IODESC_ENT(WATCHDOG), +}; + +static struct resource s3c_uart0_resource[] = { + [0] = { + .start = S3C2410_PA_UART0, + .end = S3C2410_PA_UART0 + 0x3fff, + .flags = IORESOURCE_MEM, + }, + [1] = { + .start = IRQ_S3CUART_RX0, + .end = IRQ_S3CUART_ERR0, + .flags = IORESOURCE_IRQ, + } + +}; + +static struct resource s3c_uart1_resource[] = { + [0] = { + .start = S3C2410_PA_UART1, + .end = S3C2410_PA_UART1 + 0x3fff, + .flags = IORESOURCE_MEM, + }, + [1] = { + .start = IRQ_S3CUART_RX1, + .end = IRQ_S3CUART_ERR1, + .flags = IORESOURCE_IRQ, + } +}; + +static struct resource s3c_uart2_resource[] = { + [0] = { + .start = S3C2410_PA_UART2, + .end = S3C2410_PA_UART2 + 0x3fff, + .flags = IORESOURCE_MEM, + }, + [1] = { + .start = IRQ_S3CUART_RX2, + .end = IRQ_S3CUART_ERR2, + .flags = IORESOURCE_IRQ, + } +}; + +/* our uart devices */ + +static struct platform_device s3c_uart0 = { + .name = "s3c2440-uart", + .id = 0, + .num_resources = ARRAY_SIZE(s3c_uart0_resource), + .resource = s3c_uart0_resource, +}; + +static struct platform_device s3c_uart1 = { + .name = "s3c2440-uart", + .id = 1, + .num_resources = ARRAY_SIZE(s3c_uart1_resource), + .resource = s3c_uart1_resource, +}; + +static struct platform_device s3c_uart2 = { + .name = "s3c2440-uart", + .id = 2, + .num_resources = ARRAY_SIZE(s3c_uart2_resource), + .resource = s3c_uart2_resource, +}; + +static struct platform_device *uart_devices[] __initdata = { + &s3c_uart0, + &s3c_uart1, + &s3c_uart2 +}; + +/* uart initialisation */ + +static int __initdata s3c2440_uart_count; + +void __init s3c2440_init_uarts(struct s3c2410_uartcfg *cfg, int no) +{ + struct platform_device *platdev; + int uart; + + for (uart = 0; uart < no; uart++, cfg++) { + platdev = uart_devices[cfg->hwport]; + + s3c24xx_uart_devs[uart] = platdev; + platdev->dev.platform_data = cfg; + } + + s3c2440_uart_count = uart; +} + + +#ifdef CONFIG_PM + +static struct sleep_save s3c2440_sleep[] = { + SAVE_ITEM(S3C2440_DSC0), + SAVE_ITEM(S3C2440_DSC1), + SAVE_ITEM(S3C2440_GPJDAT), + SAVE_ITEM(S3C2440_GPJCON), + SAVE_ITEM(S3C2440_GPJUP) +}; + +static int s3c2440_suspend(struct sys_device *dev, pm_message_t state) +{ + s3c2410_pm_do_save(s3c2440_sleep, ARRAY_SIZE(s3c2440_sleep)); + return 0; +} + +static int s3c2440_resume(struct sys_device *dev) +{ + s3c2410_pm_do_restore(s3c2440_sleep, ARRAY_SIZE(s3c2440_sleep)); + return 0; +} + +#else +#define s3c2440_suspend NULL +#define s3c2440_resume NULL +#endif + +struct sysdev_class s3c2440_sysclass = { + set_kset_name("s3c2440-core"), + .suspend = s3c2440_suspend, + .resume = s3c2440_resume +}; + static struct sys_device s3c2440_sysdev = { .cls = &s3c2440_sysclass, }; -int __init s3c2440_init(void) +void __init s3c2440_map_io(struct map_desc *mach_desc, int size) { - printk("S3C2440: Initialising architecture\n"); + /* register our io-tables */ + + iotable_init(s3c2440_iodesc, ARRAY_SIZE(s3c2440_iodesc)); + iotable_init(mach_desc, size); + + /* rename any peripherals used differing from the s3c2410 */ + + s3c_device_i2c.name = "s3c2440-i2c"; + s3c_device_nand.name = "s3c2440-nand"; /* change irq for watchdog */ s3c_device_wdt.resource[1].start = IRQ_S3C2440_WDT; s3c_device_wdt.resource[1].end = IRQ_S3C2440_WDT; +} + +void __init s3c2440_init_clocks(int xtal) +{ + unsigned long clkdiv; + unsigned long camdiv; + unsigned long hclk, fclk, pclk; + int hdiv = 1; + + /* now we've got our machine bits initialised, work out what + * clocks we've got */ + + fclk = s3c2410_get_pll(__raw_readl(S3C2410_MPLLCON), xtal) * 2; + + clkdiv = __raw_readl(S3C2410_CLKDIVN); + camdiv = __raw_readl(S3C2440_CAMDIVN); + + /* work out clock scalings */ + + switch (clkdiv & S3C2440_CLKDIVN_HDIVN_MASK) { + case S3C2440_CLKDIVN_HDIVN_1: + hdiv = 1; + break; + + case S3C2440_CLKDIVN_HDIVN_2: + hdiv = 2; + break; + + case S3C2440_CLKDIVN_HDIVN_4_8: + hdiv = (camdiv & S3C2440_CAMDIVN_HCLK4_HALF) ? 8 : 4; + break; + + case S3C2440_CLKDIVN_HDIVN_3_6: + hdiv = (camdiv & S3C2440_CAMDIVN_HCLK3_HALF) ? 6 : 3; + break; + } + + hclk = fclk / hdiv; + pclk = hclk / ((clkdiv & S3C2440_CLKDIVN_PDIVN)? 2:1); + + /* print brief summary of clocks, etc */ + + printk("S3C2440: core %ld.%03ld MHz, memory %ld.%03ld MHz, peripheral %ld.%03ld MHz\n", + print_mhz(fclk), print_mhz(hclk), print_mhz(pclk)); + + /* initialise the clocks here, to allow other things like the + * console to use them, and to add new ones after the initialisation + */ + + s3c24xx_setup_clocks(xtal, fclk, hclk, pclk); +} + +/* need to register class before we actually register the device, and + * we also need to ensure that it has been initialised before any of the + * drivers even try to use it (even if not on an s3c2440 based system) + * as a driver which may support both 2410 and 2440 may try and use it. +*/ + +static int __init s3c2440_core_init(void) +{ + return sysdev_class_register(&s3c2440_sysclass); +} + +core_initcall(s3c2440_core_init); + +int __init s3c2440_init(void) +{ + int ret; + + printk("S3C2440: Initialising architecture\n"); - /* register our system device for everything else */ + ret = sysdev_register(&s3c2440_sysdev); + if (ret != 0) + printk(KERN_ERR "failed to register sysdev for s3c2440\n"); + else + ret = platform_add_devices(s3c24xx_uart_devs, s3c2440_uart_count); - return sysdev_register(&s3c2440_sysdev); + return ret; } diff --git a/arch/arm/mach-s3c2410/sleep.S b/arch/arm/mach-s3c2410/sleep.S index a7561a79f..832fb86a0 100644 --- a/arch/arm/mach-s3c2410/sleep.S +++ b/arch/arm/mach-s3c2410/sleep.S @@ -24,6 +24,7 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +#include #include #include #include @@ -58,16 +59,15 @@ ENTRY(s3c2410_cpu_suspend) mrc p15, 0, r5, c13, c0, 0 @ PID mrc p15, 0, r6, c3, c0, 0 @ Domain ID mrc p15, 0, r7, c2, c0, 0 @ translation table base address - mrc p15, 0, r8, c1, c0, 0 @ control register + mrc p15, 0, r8, c2, c0, 0 @ auxiliary control register + mrc p15, 0, r9, c1, c0, 0 @ control register stmia r0, { r4 - r13 } @@ flush the caches to ensure everything is back out to @@ SDRAM before the core powers down -#ifndef CONFIG_CPU_DCACHE_WRITETHROUGH bl arm920_flush_kern_cache_all -#endif @@ prepare cpu to sleep @@ -127,7 +127,7 @@ s3c2410_sleep_save_phys: */ ENTRY(s3c2410_cpu_resume) - mov r0, #PSR_I_BIT | PSR_F_BIT | SVC_MODE + mov r0, #PSR_I_BIT | PSR_F_BIT | MODE_SVC msr cpsr_c, r0 @@ load UART to allow us to print the two characters for @@ -165,6 +165,7 @@ ENTRY(s3c2410_cpu_resume) mcr p15, 0, r5, c13, c0, 0 @ PID mcr p15, 0, r6, c3, c0, 0 @ Domain ID mcr p15, 0, r7, c2, c0, 0 @ translation table base + mcr p15, 0, r8, c1, c1, 0 @ auxilliary control #ifdef CONFIG_DEBUG_RESUME mov r3, #'R' @@ -172,7 +173,7 @@ ENTRY(s3c2410_cpu_resume) #endif ldr r2, =resume_with_mmu - mcr p15, 0, r8, c1, c0, 0 @ turn on MMU, etc + mcr p15, 0, r9, c1, c0, 0 @ turn on MMU, etc nop @ second-to-last before mmu mov pc, r2 @ go back to virtual address diff --git a/arch/arm/mach-s3c2410/time.c b/arch/arm/mach-s3c2410/time.c index 00d1cfca9..10a2976ae 100644 --- a/arch/arm/mach-s3c2410/time.c +++ b/arch/arm/mach-s3c2410/time.c @@ -18,11 +18,11 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +#include #include #include #include #include -#include #include #include @@ -138,16 +138,10 @@ s3c2410_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs) static struct irqaction s3c2410_timer_irq = { .name = "S3C2410 Timer Tick", - .flags = IRQF_DISABLED | IRQF_TIMER, + .flags = SA_INTERRUPT | SA_TIMER, .handler = s3c2410_timer_interrupt, }; -#define use_tclk1_12() ( \ - machine_is_bast() || \ - machine_is_vr1000() || \ - machine_is_anubis() || \ - machine_is_osiris() ) - /* * Set up timer interrupt, and return the current time in seconds. * @@ -171,7 +165,7 @@ static void s3c2410_timer_setup (void) /* configure the system for whichever machine is in use */ - if (use_tclk1_12()) { + if (machine_is_bast() || machine_is_vr1000() || machine_is_anubis()) { /* timer is at 12MHz, scaler is 1 */ timer_usec_ticks = timer_mask_usec_ticks(1, 12000000); tcnt = 12000000 / HZ; diff --git a/arch/arm/mach-s3c2410/usb-simtec.c b/arch/arm/mach-s3c2410/usb-simtec.c index 6b22d8f0a..495f8c6ff 100644 --- a/arch/arm/mach-s3c2410/usb-simtec.c +++ b/arch/arm/mach-s3c2410/usb-simtec.c @@ -85,8 +85,8 @@ static void usb_simtec_enableoc(struct s3c2410_hcd_info *info, int on) if (on) { ret = request_irq(IRQ_USBOC, usb_simtec_ocirq, - IRQF_DISABLED | IRQF_TRIGGER_RISING | - IRQF_TRIGGER_FALLING, + SA_INTERRUPT | SA_TRIGGER_RISING | + SA_TRIGGER_FALLING, "USB Over-current", info); if (ret != 0) { printk(KERN_ERR "failed to request usb oc irq\n"); diff --git a/arch/arm/mach-sa1100/Kconfig b/arch/arm/mach-sa1100/Kconfig index cd67ab1b2..6923316b3 100644 --- a/arch/arm/mach-sa1100/Kconfig +++ b/arch/arm/mach-sa1100/Kconfig @@ -111,7 +111,7 @@ config SA1100_LART bool "LART" help Say Y here if you are using the Linux Advanced Radio Terminal - (also known as the LART). See for + (also known as the LART). See for information on the LART. config SA1100_PLEB diff --git a/arch/arm/mach-sa1100/Makefile b/arch/arm/mach-sa1100/Makefile index e27f15042..e4a4a3e8a 100644 --- a/arch/arm/mach-sa1100/Makefile +++ b/arch/arm/mach-sa1100/Makefile @@ -3,7 +3,7 @@ # # Common support -obj-y := clock.o generic.o irq.o dma.o time.o #nmi-oopser.o +obj-y := generic.o irq.o dma.o time.o obj-m := obj-n := obj- := diff --git a/arch/arm/mach-sa1100/assabet.c b/arch/arm/mach-sa1100/assabet.c index be06d668a..a599bb0d4 100644 --- a/arch/arm/mach-sa1100/assabet.c +++ b/arch/arm/mach-sa1100/assabet.c @@ -9,6 +9,7 @@ * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. */ +#include #include #include #include @@ -25,7 +26,6 @@ #include #include #include -#include #include #include diff --git a/arch/arm/mach-sa1100/cerf.c b/arch/arm/mach-sa1100/cerf.c index 31afe50d7..8269a9ef9 100644 --- a/arch/arm/mach-sa1100/cerf.c +++ b/arch/arm/mach-sa1100/cerf.c @@ -10,11 +10,11 @@ * Jan-2004 : Removed io map for flash [FB] */ +#include #include #include #include #include -#include #include #include diff --git a/arch/arm/mach-sa1100/collie.c b/arch/arm/mach-sa1100/collie.c index a0dfa390e..6888816a1 100644 --- a/arch/arm/mach-sa1100/collie.c +++ b/arch/arm/mach-sa1100/collie.c @@ -11,12 +11,12 @@ * published by the Free Software Foundation. * * ChangeLog: - * 2006 Pavel Machek - * 03-06-2004 John Lenz + * 03-06-2004 John Lenz * 06-04-2002 Chris Larson * 04-16-2001 Lineo Japan,Inc. ... */ +#include #include #include #include @@ -40,7 +40,6 @@ #include #include #include -#include #include "generic.h" @@ -67,95 +66,6 @@ struct platform_device colliescoop_device = { .resource = collie_scoop_resources, }; -static struct scoop_pcmcia_dev collie_pcmcia_scoop[] = { -{ - .dev = &colliescoop_device.dev, - .irq = COLLIE_IRQ_GPIO_CF_IRQ, - .cd_irq = COLLIE_IRQ_GPIO_CF_CD, - .cd_irq_str = "PCMCIA0 CD", -}, -}; - -static struct scoop_pcmcia_config collie_pcmcia_config = { - .devs = &collie_pcmcia_scoop[0], - .num_devs = 1, -}; - - -static struct mcp_plat_data collie_mcp_data = { - .mccr0 = MCCR0_ADM | MCCR0_ExtClk, - .sclk_rate = 9216000, -}; - -#ifdef CONFIG_SHARP_LOCOMO -/* - * low-level UART features. - */ -static struct locomo_dev *uart_dev = NULL; - -static void collie_uart_set_mctrl(struct uart_port *port, u_int mctrl) -{ - if (!uart_dev) return; - - if (mctrl & TIOCM_RTS) - locomo_gpio_write(uart_dev, LOCOMO_GPIO_RTS, 0); - else - locomo_gpio_write(uart_dev, LOCOMO_GPIO_RTS, 1); - - if (mctrl & TIOCM_DTR) - locomo_gpio_write(uart_dev, LOCOMO_GPIO_DTR, 0); - else - locomo_gpio_write(uart_dev, LOCOMO_GPIO_DTR, 1); -} - -static u_int collie_uart_get_mctrl(struct uart_port *port) -{ - int ret = TIOCM_CD; - unsigned int r; - if (!uart_dev) return ret; - - r = locomo_gpio_read_output(uart_dev, LOCOMO_GPIO_CTS & LOCOMO_GPIO_DSR); - if (r & LOCOMO_GPIO_CTS) - ret |= TIOCM_CTS; - if (r & LOCOMO_GPIO_DSR) - ret |= TIOCM_DSR; - - return ret; -} - -static struct sa1100_port_fns collie_port_fns __initdata = { - .set_mctrl = collie_uart_set_mctrl, - .get_mctrl = collie_uart_get_mctrl, -}; - -static int collie_uart_probe(struct locomo_dev *dev) -{ - uart_dev = dev; - return 0; -} - -static int collie_uart_remove(struct locomo_dev *dev) -{ - uart_dev = NULL; - return 0; -} - -static struct locomo_driver collie_uart_driver = { - .drv = { - .name = "collie_uart", - }, - .devid = LOCOMO_DEVID_UART, - .probe = collie_uart_probe, - .remove = collie_uart_remove, -}; - -static int __init collie_uart_init(void) { - return locomo_driver_register(&collie_uart_driver); -} -device_initcall(collie_uart_init); - -#endif - static struct resource locomo_resources[] = { [0] = { @@ -249,8 +159,6 @@ static void __init collie_init(void) GPDR |= GPIO_32_768kHz; TUCR = TUCR_32_768kHz; - platform_scoop_config = &collie_pcmcia_config; - ret = platform_add_devices(devices, ARRAY_SIZE(devices)); if (ret) { printk(KERN_WARNING "collie: Unable to register LoCoMo device\n"); @@ -258,7 +166,6 @@ static void __init collie_init(void) sa11x0_set_flash_data(&collie_flash_data, collie_flash_resources, ARRAY_SIZE(collie_flash_resources)); - sa11x0_set_mcp_data(&collie_mcp_data); sharpsl_save_param(); } @@ -281,12 +188,6 @@ static void __init collie_map_io(void) { sa1100_map_io(); iotable_init(collie_io_desc, ARRAY_SIZE(collie_io_desc)); - -#ifdef CONFIG_SHARP_LOCOMO - sa1100_register_uart_fns(&collie_port_fns); -#endif - sa1100_register_uart(0, 3); - sa1100_register_uart(1, 1); } MACHINE_START(COLLIE, "Sharp-Collie") diff --git a/arch/arm/mach-sa1100/cpu-sa1100.c b/arch/arm/mach-sa1100/cpu-sa1100.c index d68630b74..6435b2e48 100644 --- a/arch/arm/mach-sa1100/cpu-sa1100.c +++ b/arch/arm/mach-sa1100/cpu-sa1100.c @@ -11,7 +11,7 @@ * linux-2.4.5-rmk1 * * This software has been developed while working on the LART - * computing board (http://www.lartmaker.nl/), which is + * computing board (http://www.lart.tudelft.nl/), which is * sponsored by the Mobile Multi-media Communications * (http://www.mmc.tudelft.nl/) and Ubiquitous Communications * (http://www.ubicom.tudelft.nl/) projects. diff --git a/arch/arm/mach-sa1100/cpu-sa1110.c b/arch/arm/mach-sa1100/cpu-sa1110.c index 639597729..04c94ab6c 100644 --- a/arch/arm/mach-sa1100/cpu-sa1110.c +++ b/arch/arm/mach-sa1100/cpu-sa1110.c @@ -15,10 +15,7 @@ * SDRAM reads (rev A0, B0, B1) * * We ignore rev. A0 and B0 devices; I don't think they're worth supporting. - * - * The SDRAM type can be passed on the command line as cpu_sa1110.sdram=type */ -#include #include #include #include @@ -38,7 +35,6 @@ static struct cpufreq_driver sa1110_driver; struct sdram_params { - const char name[16]; u_char rows; /* bits */ u_char cas_latency; /* cycles */ u_char tck; /* clock cycle time (ns) */ @@ -54,53 +50,54 @@ struct sdram_info { u_int mdcas[3]; }; -static struct sdram_params sdram_tbl[] __initdata = { - { /* Toshiba TC59SM716 CL2 */ - .name = "TC59SM716-CL2", - .rows = 12, - .tck = 10, - .trcd = 20, - .trp = 20, - .twr = 10, - .refresh = 64000, - .cas_latency = 2, - }, { /* Toshiba TC59SM716 CL3 */ - .name = "TC59SM716-CL3", - .rows = 12, - .tck = 8, - .trcd = 20, - .trp = 20, - .twr = 8, - .refresh = 64000, - .cas_latency = 3, - }, { /* Samsung K4S641632D TC75 */ - .name = "K4S641632D", - .rows = 14, - .tck = 9, - .trcd = 27, - .trp = 20, - .twr = 9, - .refresh = 64000, - .cas_latency = 3, - }, { /* Samsung KM416S4030CT */ - .name = "KM416S4030CT", - .rows = 13, - .tck = 8, - .trcd = 24, /* 3 CLKs */ - .trp = 24, /* 3 CLKs */ - .twr = 16, /* Trdl: 2 CLKs */ - .refresh = 64000, - .cas_latency = 3, - }, { /* Winbond W982516AH75L CL3 */ - .name = "W982516AH75L", - .rows = 16, - .tck = 8, - .trcd = 20, - .trp = 20, - .twr = 8, - .refresh = 64000, - .cas_latency = 3, - }, +static struct sdram_params tc59sm716_cl2_params __initdata = { + .rows = 12, + .tck = 10, + .trcd = 20, + .trp = 20, + .twr = 10, + .refresh = 64000, + .cas_latency = 2, +}; + +static struct sdram_params tc59sm716_cl3_params __initdata = { + .rows = 12, + .tck = 8, + .trcd = 20, + .trp = 20, + .twr = 8, + .refresh = 64000, + .cas_latency = 3, +}; + +static struct sdram_params samsung_k4s641632d_tc75 __initdata = { + .rows = 14, + .tck = 9, + .trcd = 27, + .trp = 20, + .twr = 9, + .refresh = 64000, + .cas_latency = 3, +}; + +static struct sdram_params samsung_km416s4030ct __initdata = { + .rows = 13, + .tck = 8, + .trcd = 24, /* 3 CLKs */ + .trp = 24, /* 3 CLKs */ + .twr = 16, /* Trdl: 2 CLKs */ + .refresh = 64000, + .cas_latency = 3, +}; + +static struct sdram_params wbond_w982516ah75l_cl3_params __initdata = { + .rows = 16, + .tck = 8, + .trcd = 20, + .trp = 20, + .twr = 8, + .refresh = 64000, + .cas_latency = 3, }; static struct sdram_params sdram_params; @@ -339,36 +336,19 @@ static struct cpufreq_driver sa1110_driver = { .name = "sa1110", }; -static struct sdram_params *sa1110_find_sdram(const char *name) -{ - struct sdram_params *sdram; - - for (sdram = sdram_tbl; sdram < sdram_tbl + ARRAY_SIZE(sdram_tbl); sdram++) - if (strcmp(name, sdram->name) == 0) - return sdram; - - return NULL; -} - -static char sdram_name[16]; - static int __init sa1110_clk_init(void) { - struct sdram_params *sdram; - const char *name = sdram_name; + struct sdram_params *sdram = NULL; - if (!name[0]) { - if (machine_is_assabet()) - name = "TC59SM716-CL3"; + if (machine_is_assabet()) + sdram = &tc59sm716_cl3_params; - if (machine_is_pt_system3()) - name = "K4S641632D"; + if (machine_is_pt_system3()) + sdram = &samsung_k4s641632d_tc75; - if (machine_is_h3100()) - name = "KM416S4030CT"; - } + if (machine_is_h3100()) + sdram = &samsung_km416s4030ct; - sdram = sa1110_find_sdram(name); if (sdram) { printk(KERN_DEBUG "SDRAM: tck: %d trcd: %d trp: %d" " twr: %d refresh: %d cas_latency: %d\n", @@ -383,5 +363,4 @@ static int __init sa1110_clk_init(void) return 0; } -module_param_string(sdram, sdram_name, sizeof(sdram_name), 0); arch_initcall(sa1110_clk_init); diff --git a/arch/arm/mach-sa1100/dma.c b/arch/arm/mach-sa1100/dma.c index 3c6441d4b..be0e4427b 100644 --- a/arch/arm/mach-sa1100/dma.c +++ b/arch/arm/mach-sa1100/dma.c @@ -124,7 +124,7 @@ int sa1100_request_dma (dma_device_t device, const char *device_id, i = dma - dma_chan; regs = (dma_regs_t *)&DDAR(i); - err = request_irq(IRQ_DMA0 + i, dma_irq_handler, IRQF_DISABLED, + err = request_irq(IRQ_DMA0 + i, dma_irq_handler, SA_INTERRUPT, device_id, regs); if (err) { printk(KERN_ERR diff --git a/arch/arm/mach-sa1100/generic.c b/arch/arm/mach-sa1100/generic.c index 4575f316e..2abdc419e 100644 --- a/arch/arm/mach-sa1100/generic.c +++ b/arch/arm/mach-sa1100/generic.c @@ -9,6 +9,7 @@ * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. */ +#include #include #include #include @@ -323,11 +324,6 @@ void sa11x0_set_irda_data(struct irda_platform_data *irda) sa11x0ir_device.dev.platform_data = irda; } -static struct platform_device sa11x0rtc_device = { - .name = "sa1100-rtc", - .id = -1, -}; - static struct platform_device *sa11x0_devices[] __initdata = { &sa11x0udc_device, &sa11x0uart1_device, @@ -337,7 +333,6 @@ static struct platform_device *sa11x0_devices[] __initdata = { &sa11x0pcmcia_device, &sa11x0fb_device, &sa11x0mtd_device, - &sa11x0rtc_device, }; static int __init sa1100_init(void) diff --git a/arch/arm/mach-sa1100/h3600.c b/arch/arm/mach-sa1100/h3600.c index 7364478ce..b04d92271 100644 --- a/arch/arm/mach-sa1100/h3600.c +++ b/arch/arm/mach-sa1100/h3600.c @@ -19,6 +19,7 @@ * and abstracted EGPIO interface. * */ +#include #include #include #include @@ -740,7 +741,7 @@ static void h3800_IRQ_demux(unsigned int irq, struct irqdesc *desc, struct pt_re static struct irqaction h3800_irq = { .name = "h3800_asic", .handler = h3800_IRQ_demux, - .flags = IRQF_DISABLED | IRQF_TIMER, + .flags = SA_INTERRUPT | SA_TIMER, }; u32 kpio_int_shadow = 0; @@ -835,7 +836,7 @@ static void __init h3800_init_irq(void) } #endif set_irq_type(IRQ_GPIO_H3800_ASIC, IRQT_RISING); - set_irq_chained_handler(IRQ_GPIO_H3800_ASIC, h3800_IRQ_demux); + set_irq_chained_handler(IRQ_GPIO_H3800_ASIC, &h3800_IRQ_demux); } diff --git a/arch/arm/mach-sa1100/irq.c b/arch/arm/mach-sa1100/irq.c index b55b90a2e..c131a5201 100644 --- a/arch/arm/mach-sa1100/irq.c +++ b/arch/arm/mach-sa1100/irq.c @@ -11,13 +11,12 @@ */ #include #include -#include -#include #include #include #include #include +#include #include #include "generic.h" @@ -95,8 +94,7 @@ static int sa1100_low_gpio_wake(unsigned int irq, unsigned int on) return 0; } -static struct irq_chip sa1100_low_gpio_chip = { - .name = "GPIO-l", +static struct irqchip sa1100_low_gpio_chip = { .ack = sa1100_low_gpio_ack, .mask = sa1100_low_gpio_mask, .unmask = sa1100_low_gpio_unmask, @@ -179,8 +177,7 @@ static int sa1100_high_gpio_wake(unsigned int irq, unsigned int on) return 0; } -static struct irq_chip sa1100_high_gpio_chip = { - .name = "GPIO-h", +static struct irqchip sa1100_high_gpio_chip = { .ack = sa1100_high_gpio_ack, .mask = sa1100_high_gpio_mask, .unmask = sa1100_high_gpio_unmask, @@ -202,27 +199,10 @@ static void sa1100_unmask_irq(unsigned int irq) ICMR |= (1 << irq); } -/* - * Apart form GPIOs, only the RTC alarm can be a wakeup event. - */ -static int sa1100_set_wake(unsigned int irq, unsigned int on) -{ - if (irq == IRQ_RTCAlrm) { - if (on) - PWER |= PWER_RTC; - else - PWER &= ~PWER_RTC; - return 0; - } - return -EINVAL; -} - -static struct irq_chip sa1100_normal_chip = { - .name = "SC", +static struct irqchip sa1100_normal_chip = { .ack = sa1100_mask_irq, .mask = sa1100_mask_irq, .unmask = sa1100_unmask_irq, - .set_wake = sa1100_set_wake, }; static struct resource irq_resource = { diff --git a/arch/arm/mach-sa1100/leds-assabet.c b/arch/arm/mach-sa1100/leds-assabet.c index ee9788989..e9aa9dff2 100644 --- a/arch/arm/mach-sa1100/leds-assabet.c +++ b/arch/arm/mach-sa1100/leds-assabet.c @@ -9,6 +9,7 @@ * - Green - toggles state every 50 timer interrupts * - Red - on if system is not idle */ +#include #include #include diff --git a/arch/arm/mach-sa1100/leds-badge4.c b/arch/arm/mach-sa1100/leds-badge4.c index 280929be9..0a8f87bb6 100644 --- a/arch/arm/mach-sa1100/leds-badge4.c +++ b/arch/arm/mach-sa1100/leds-badge4.c @@ -10,6 +10,7 @@ * */ +#include #include #include diff --git a/arch/arm/mach-sa1100/leds-cerf.c b/arch/arm/mach-sa1100/leds-cerf.c index f38eeddbe..f6635a2d0 100644 --- a/arch/arm/mach-sa1100/leds-cerf.c +++ b/arch/arm/mach-sa1100/leds-cerf.c @@ -3,6 +3,7 @@ * * Author: ??? */ +#include #include #include diff --git a/arch/arm/mach-sa1100/leds-hackkit.c b/arch/arm/mach-sa1100/leds-hackkit.c index 7e91cc90b..2e5fa14aa 100644 --- a/arch/arm/mach-sa1100/leds-hackkit.c +++ b/arch/arm/mach-sa1100/leds-hackkit.c @@ -9,6 +9,7 @@ * The HackKit has two leds (GPIO 22/23). The red led (gpio 22) is used * as cpu led, the green one is used as timer led. */ +#include #include #include diff --git a/arch/arm/mach-sa1100/leds-lart.c b/arch/arm/mach-sa1100/leds-lart.c index 2d27d76cf..187501490 100644 --- a/arch/arm/mach-sa1100/leds-lart.c +++ b/arch/arm/mach-sa1100/leds-lart.c @@ -9,6 +9,7 @@ * time, but in that case the timer events will still dictate the * pace of the LED. */ +#include #include #include diff --git a/arch/arm/mach-sa1100/leds-simpad.c b/arch/arm/mach-sa1100/leds-simpad.c index def090a87..6a27a2d32 100644 --- a/arch/arm/mach-sa1100/leds-simpad.c +++ b/arch/arm/mach-sa1100/leds-simpad.c @@ -3,6 +3,7 @@ * * Author: Juergen Messerer */ +#include #include #include diff --git a/arch/arm/mach-sa1100/neponset.c b/arch/arm/mach-sa1100/neponset.c index af6d2775c..9e02bc371 100644 --- a/arch/arm/mach-sa1100/neponset.c +++ b/arch/arm/mach-sa1100/neponset.c @@ -59,14 +59,6 @@ neponset_irq_handler(unsigned int irq, struct irqdesc *desc, struct pt_regs *reg if (irr & (IRR_ETHERNET | IRR_USAR)) { desc->chip->mask(irq); - /* - * Ack the interrupt now to prevent re-entering - * this neponset handler. Again, this is safe - * since we'll check the IRR register prior to - * leaving. - */ - desc->chip->ack(irq); - if (irr & IRR_ETHERNET) { d = irq_desc + IRQ_NEPONSET_SMC9196; desc_handle_irq(IRQ_NEPONSET_SMC9196, d, regs); diff --git a/arch/arm/mach-sa1100/pleb.c b/arch/arm/mach-sa1100/pleb.c index c7bf7e003..0709ebab5 100644 --- a/arch/arm/mach-sa1100/pleb.c +++ b/arch/arm/mach-sa1100/pleb.c @@ -7,7 +7,6 @@ #include #include #include -#include #include diff --git a/arch/arm/mach-sa1100/shannon.c b/arch/arm/mach-sa1100/shannon.c index 8acab7b1e..5aafe0b56 100644 --- a/arch/arm/mach-sa1100/shannon.c +++ b/arch/arm/mach-sa1100/shannon.c @@ -2,6 +2,7 @@ * linux/arch/arm/mach-sa1100/shannon.c */ +#include #include #include #include diff --git a/arch/arm/mach-sa1100/simpad.c b/arch/arm/mach-sa1100/simpad.c index a9ae1b581..d2c23b2c3 100644 --- a/arch/arm/mach-sa1100/simpad.c +++ b/arch/arm/mach-sa1100/simpad.c @@ -2,6 +2,7 @@ * linux/arch/arm/mach-sa1100/simpad.c */ +#include #include #include #include diff --git a/arch/arm/mach-sa1100/sleep.S b/arch/arm/mach-sa1100/sleep.S index 5a84062f9..2fa1e289d 100644 --- a/arch/arm/mach-sa1100/sleep.S +++ b/arch/arm/mach-sa1100/sleep.S @@ -177,7 +177,7 @@ sa1110_sdram_controller_fix: .data .align 5 ENTRY(sa1100_cpu_resume) - mov r0, #PSR_F_BIT | PSR_I_BIT | SVC_MODE + mov r0, #PSR_F_BIT | PSR_I_BIT | MODE_SVC msr cpsr_c, r0 @ set SVC, irqs off ldr r0, sleep_save_sp @ stack phys addr diff --git a/arch/arm/mach-sa1100/ssp.c b/arch/arm/mach-sa1100/ssp.c index 5eba5fbbb..1604dadf2 100644 --- a/arch/arm/mach-sa1100/ssp.c +++ b/arch/arm/mach-sa1100/ssp.c @@ -23,8 +23,6 @@ #include #include -#define TIMEOUT 100000 - static irqreturn_t ssp_interrupt(int irq, void *dev_id, struct pt_regs *regs) { unsigned int status = Ser4SSSR; @@ -49,27 +47,18 @@ static irqreturn_t ssp_interrupt(int irq, void *dev_id, struct pt_regs *regs) * The caller is expected to perform the necessary locking. * * Returns: - * %-ETIMEDOUT timeout occurred + * %-ETIMEDOUT timeout occurred (for future) * 0 success */ int ssp_write_word(u16 data) { - int timeout = TIMEOUT; - - while (!(Ser4SSSR & SSSR_TNF)) { - if (!--timeout) - return -ETIMEDOUT; + while (!(Ser4SSSR & SSSR_TNF)) cpu_relax(); - } Ser4SSDR = data; - timeout = TIMEOUT; - while (!(Ser4SSSR & SSSR_BSY)) { - if (!--timeout) - return -ETIMEDOUT; + while (!(Ser4SSSR & SSSR_BSY)) cpu_relax(); - } return 0; } @@ -86,22 +75,15 @@ int ssp_write_word(u16 data) * The caller is expected to perform the necessary locking. * * Returns: - * %-ETIMEDOUT timeout occurred + * %-ETIMEDOUT timeout occurred (for future) * 16-bit data success */ -int ssp_read_word(u16 *data) +int ssp_read_word(void) { - int timeout = TIMEOUT; - - while (!(Ser4SSSR & SSSR_RNE)) { - if (!--timeout) - return -ETIMEDOUT; + while (!(Ser4SSSR & SSSR_RNE)) cpu_relax(); - } - - *data = (u16)Ser4SSDR; - return 0; + return Ser4SSDR; } /** @@ -111,26 +93,14 @@ int ssp_read_word(u16 *data) * is empty. * * The caller is expected to perform the necessary locking. - * - * Returns: - * %-ETIMEDOUT timeout occurred - * 0 success */ -int ssp_flush(void) +void ssp_flush(void) { - int timeout = TIMEOUT * 2; - do { while (Ser4SSSR & SSSR_RNE) { - if (!--timeout) - return -ETIMEDOUT; (void) Ser4SSDR; } - if (!--timeout) - return -ETIMEDOUT; } while (Ser4SSSR & SSSR_BSY); - - return 0; } /** diff --git a/arch/arm/mach-sa1100/time.c b/arch/arm/mach-sa1100/time.c index 49ae716e1..e4b435e63 100644 --- a/arch/arm/mach-sa1100/time.c +++ b/arch/arm/mach-sa1100/time.c @@ -11,7 +11,6 @@ #include #include #include -#include #include #include @@ -111,7 +110,7 @@ sa1100_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs) static struct irqaction sa1100_timer_irq = { .name = "SA11xx Timer Tick", - .flags = IRQF_DISABLED | IRQF_TIMER, + .flags = SA_INTERRUPT | SA_TIMER, .handler = sa1100_timer_interrupt, }; diff --git a/arch/arm/mach-shark/core.c b/arch/arm/mach-shark/core.c index 1095df34f..877600e21 100644 --- a/arch/arm/mach-shark/core.c +++ b/arch/arm/mach-shark/core.c @@ -6,7 +6,6 @@ #include #include #include -#include #include #include @@ -90,7 +89,7 @@ shark_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs) static struct irqaction shark_timer_irq = { .name = "Shark Timer Tick", - .flags = IRQF_DISABLED | IRQF_TIMER, + .flags = SA_INTERRUPT | SA_TIMER, .handler = shark_timer_interrupt, }; diff --git a/arch/arm/mach-shark/dma.c b/arch/arm/mach-shark/dma.c index 6774b8d5d..835989a02 100644 --- a/arch/arm/mach-shark/dma.c +++ b/arch/arm/mach-shark/dma.c @@ -8,6 +8,7 @@ * Copyright (C) 1998 Phil Blundell */ +#include #include #include diff --git a/arch/arm/mach-shark/irq.c b/arch/arm/mach-shark/irq.c index b22705229..6cb67bd3d 100644 --- a/arch/arm/mach-shark/irq.c +++ b/arch/arm/mach-shark/irq.c @@ -69,8 +69,7 @@ static irqreturn_t bogus_int(int irq, void *dev_id, struct pt_regs *regs) static struct irqaction cascade; -static struct irq_chip fb_chip = { - .name = "XT-PIC", +static struct irqchip fb_chip = { .ack = shark_ack_8259A_irq, .mask = shark_disable_8259A_irq, .unmask = shark_enable_8259A_irq, diff --git a/arch/arm/mach-shark/leds.c b/arch/arm/mach-shark/leds.c index 7cd86d357..7bdeb70a0 100644 --- a/arch/arm/mach-shark/leds.c +++ b/arch/arm/mach-shark/leds.c @@ -15,6 +15,7 @@ * * Changelog: */ +#include #include #include #include diff --git a/arch/arm/mach-versatile/core.c b/arch/arm/mach-versatile/core.c index f2bbef07b..9ebbe808b 100644 --- a/arch/arm/mach-versatile/core.c +++ b/arch/arm/mach-versatile/core.c @@ -18,6 +18,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +#include #include #include #include @@ -35,7 +36,6 @@ #include #include #include -#include #include #include @@ -69,8 +69,7 @@ static void sic_unmask_irq(unsigned int irq) writel(1 << irq, VA_SIC_BASE + SIC_IRQ_ENABLE_SET); } -static struct irq_chip sic_chip = { - .name = "SIC", +static struct irqchip sic_chip = { .ack = sic_mask_irq, .mask = sic_mask_irq, .unmask = sic_unmask_irq, @@ -113,9 +112,10 @@ void __init versatile_init_irq(void) { unsigned int i; - vic_init(VA_VIC_BASE, IRQ_VIC_START, ~0); + vic_init(VA_VIC_BASE, ~(1 << 31)); - set_irq_chained_handler(IRQ_VICSOURCE31, sic_handle_irq); + set_irq_handler(IRQ_VICSOURCE31, sic_handle_irq); + enable_irq(IRQ_VICSOURCE31); /* Do second interrupt controller */ writel(~0, VA_SIC_BASE + SIC_IRQ_ENABLE_CLEAR); @@ -285,7 +285,7 @@ static struct flash_platform_data versatile_flash_data = { static struct resource versatile_flash_resource = { .start = VERSATILE_FLASH_BASE, - .end = VERSATILE_FLASH_BASE + VERSATILE_FLASH_SIZE - 1, + .end = VERSATILE_FLASH_BASE + VERSATILE_FLASH_SIZE, .flags = IORESOURCE_MEM, }; @@ -354,7 +354,11 @@ static const struct icst307_params versatile_oscvco_params = { static void versatile_oscvco_set(struct clk *clk, struct icst307_vco vco) { void __iomem *sys_lock = __io_address(VERSATILE_SYS_BASE) + VERSATILE_SYS_LOCK_OFFSET; - void __iomem *sys_osc = __io_address(VERSATILE_SYS_BASE) + VERSATILE_SYS_OSCCLCD_OFFSET; +#if defined(CONFIG_ARCH_VERSATILE_PB) + void __iomem *sys_osc = __io_address(VERSATILE_SYS_BASE) + VERSATILE_SYS_OSC4_OFFSET; +#elif defined(CONFIG_MACH_VERSATILE_AB) + void __iomem *sys_osc = __io_address(VERSATILE_SYS_BASE) + VERSATILE_SYS_OSC1_OFFSET; +#endif u32 val; val = readl(sys_osc) & ~0x7ffff; @@ -527,7 +531,7 @@ static void versatile_clcd_disable(struct clcd_fb *fb) /* * If the LCD is Sanyo 2x5 in on the IB2 board, turn the back-light off */ - if (machine_is_versatile_ab() && fb->panel == &sanyo_2_5_in) { + if (fb->panel == &sanyo_2_5_in) { void __iomem *versatile_ib2_ctrl = __io_address(VERSATILE_IB2_CTRL); unsigned long ctrl; @@ -576,7 +580,7 @@ static void versatile_clcd_enable(struct clcd_fb *fb) /* * If the LCD is Sanyo 2x5 in on the IB2 board, turn the back-light on */ - if (machine_is_versatile_ab() && fb->panel == &sanyo_2_5_in) { + if (fb->panel == &sanyo_2_5_in) { void __iomem *versatile_ib2_ctrl = __io_address(VERSATILE_IB2_CTRL); unsigned long ctrl; @@ -867,7 +871,7 @@ static irqreturn_t versatile_timer_interrupt(int irq, void *dev_id, struct pt_re static struct irqaction versatile_timer_irq = { .name = "Versatile Timer Tick", - .flags = IRQF_DISABLED | IRQF_TIMER, + .flags = SA_INTERRUPT | SA_TIMER, .handler = versatile_timer_interrupt, }; diff --git a/arch/arm/mach-versatile/pci.c b/arch/arm/mach-versatile/pci.c index 41b370090..722fbabc9 100644 --- a/arch/arm/mach-versatile/pci.c +++ b/arch/arm/mach-versatile/pci.c @@ -14,6 +14,7 @@ * 14/04/2005 Initial version, colin.king@philips.com * */ +#include #include #include #include diff --git a/arch/arm/mach-versatile/versatile_ab.c b/arch/arm/mach-versatile/versatile_ab.c index b257ef78e..1eb596782 100644 --- a/arch/arm/mach-versatile/versatile_ab.c +++ b/arch/arm/mach-versatile/versatile_ab.c @@ -19,6 +19,7 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +#include #include #include #include diff --git a/arch/arm/mach-versatile/versatile_pb.c b/arch/arm/mach-versatile/versatile_pb.c index 503725b16..f17ab4fb5 100644 --- a/arch/arm/mach-versatile/versatile_pb.c +++ b/arch/arm/mach-versatile/versatile_pb.c @@ -19,6 +19,7 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +#include #include #include #include diff --git a/arch/arm/mm/Kconfig b/arch/arm/mm/Kconfig index b4f220dd5..3b79d0e23 100644 --- a/arch/arm/mm/Kconfig +++ b/arch/arm/mm/Kconfig @@ -15,8 +15,8 @@ config CPU_ARM610 select CPU_32v3 select CPU_CACHE_V3 select CPU_CACHE_VIVT - select CPU_COPY_V3 if MMU - select CPU_TLB_V3 if MMU + select CPU_COPY_V3 + select CPU_TLB_V3 help The ARM610 is the successor to the ARM3 processor and was produced by VLSI Technology Inc. @@ -31,8 +31,8 @@ config CPU_ARM710 select CPU_32v3 select CPU_CACHE_V3 select CPU_CACHE_VIVT - select CPU_COPY_V3 if MMU - select CPU_TLB_V3 if MMU + select CPU_COPY_V3 + select CPU_TLB_V3 help A 32-bit RISC microprocessor based on the ARM7 processor core designed by Advanced RISC Machines Ltd. The ARM710 is the @@ -46,12 +46,12 @@ config CPU_ARM710 config CPU_ARM720T bool "Support ARM720T processor" if !ARCH_CLPS711X && !ARCH_L7200 && !ARCH_CDB89712 && ARCH_INTEGRATOR default y if ARCH_CLPS711X || ARCH_L7200 || ARCH_CDB89712 || ARCH_H720X - select CPU_32v4T + select CPU_32v4 select CPU_ABRT_LV4T select CPU_CACHE_V4 select CPU_CACHE_VIVT - select CPU_COPY_V4WT if MMU - select CPU_TLB_V4WT if MMU + select CPU_COPY_V4WT + select CPU_TLB_V4WT help A 32-bit RISC processor with 8kByte Cache, Write Buffer and MMU built around an ARM7TDMI core. @@ -61,15 +61,15 @@ config CPU_ARM720T # ARM920T config CPU_ARM920T - bool "Support ARM920T processor" - depends on ARCH_EP93XX || ARCH_INTEGRATOR || CPU_S3C2410 || CPU_S3C2440 || CPU_S3C2442 || ARCH_IMX || ARCH_AAEC2000 || ARCH_AT91RM9200 - default y if CPU_S3C2410 || CPU_S3C2440 || CPU_S3C2442 || ARCH_AT91RM9200 - select CPU_32v4T + bool "Support ARM920T processor" if !ARCH_S3C2410 + depends on ARCH_INTEGRATOR || ARCH_S3C2410 || ARCH_IMX || ARCH_AAEC2000 || ARCH_AT91RM9200 + default y if ARCH_S3C2410 || ARCH_AT91RM9200 + select CPU_32v4 select CPU_ABRT_EV4T select CPU_CACHE_V4WT select CPU_CACHE_VIVT - select CPU_COPY_V4WB if MMU - select CPU_TLB_V4WBI if MMU + select CPU_COPY_V4WB + select CPU_TLB_V4WBI help The ARM920T is licensed to be produced by numerous vendors, and is used in the Maverick EP9312 and the Samsung S3C2410. @@ -85,12 +85,12 @@ config CPU_ARM922T bool "Support ARM922T processor" if ARCH_INTEGRATOR depends on ARCH_LH7A40X || ARCH_INTEGRATOR default y if ARCH_LH7A40X - select CPU_32v4T + select CPU_32v4 select CPU_ABRT_EV4T select CPU_CACHE_V4WT select CPU_CACHE_VIVT - select CPU_COPY_V4WB if MMU - select CPU_TLB_V4WBI if MMU + select CPU_COPY_V4WB + select CPU_TLB_V4WBI help The ARM922T is a version of the ARM920T, but with smaller instruction and data caches. It is used in Altera's @@ -104,12 +104,12 @@ config CPU_ARM925T bool "Support ARM925T processor" if ARCH_OMAP1 depends on ARCH_OMAP15XX default y if ARCH_OMAP15XX - select CPU_32v4T + select CPU_32v4 select CPU_ABRT_EV4T select CPU_CACHE_V4WT select CPU_CACHE_VIVT - select CPU_COPY_V4WB if MMU - select CPU_TLB_V4WBI if MMU + select CPU_COPY_V4WB + select CPU_TLB_V4WBI help The ARM925T is a mix between the ARM920T and ARM926T, but with different instruction and data caches. It is used in TI's OMAP @@ -121,13 +121,13 @@ config CPU_ARM925T # ARM926T config CPU_ARM926T bool "Support ARM926T processor" - depends on ARCH_INTEGRATOR || ARCH_VERSATILE_PB || MACH_VERSATILE_AB || ARCH_OMAP730 || ARCH_OMAP16XX || MACH_REALVIEW_EB || ARCH_PNX4008 || ARCH_NETX || CPU_S3C2412 || ARCH_AT91SAM9260 || ARCH_AT91SAM9261 - default y if ARCH_VERSATILE_PB || MACH_VERSATILE_AB || ARCH_OMAP730 || ARCH_OMAP16XX || ARCH_PNX4008 || ARCH_NETX || CPU_S3C2412 || ARCH_AT91SAM9260 || ARCH_AT91SAM9261 + depends on ARCH_INTEGRATOR || ARCH_VERSATILE_PB || MACH_VERSATILE_AB || ARCH_OMAP730 || ARCH_OMAP16XX || MACH_REALVIEW_EB + default y if ARCH_VERSATILE_PB || MACH_VERSATILE_AB || ARCH_OMAP730 || ARCH_OMAP16XX select CPU_32v5 select CPU_ABRT_EV5TJ select CPU_CACHE_VIVT - select CPU_COPY_V4WB if MMU - select CPU_TLB_V4WBI if MMU + select CPU_COPY_V4WB + select CPU_TLB_V4WBI help This is a variant of the ARM920. It has slightly different instruction sequences for cache and TLB operations. Curiously, @@ -144,8 +144,8 @@ config CPU_ARM1020 select CPU_ABRT_EV4T select CPU_CACHE_V4WT select CPU_CACHE_VIVT - select CPU_COPY_V4WB if MMU - select CPU_TLB_V4WBI if MMU + select CPU_COPY_V4WB + select CPU_TLB_V4WBI help The ARM1020 is the 32K cached version of the ARM10 processor, with an addition of a floating-point unit. @@ -161,8 +161,8 @@ config CPU_ARM1020E select CPU_ABRT_EV4T select CPU_CACHE_V4WT select CPU_CACHE_VIVT - select CPU_COPY_V4WB if MMU - select CPU_TLB_V4WBI if MMU + select CPU_COPY_V4WB + select CPU_TLB_V4WBI depends on n # ARM1022E @@ -172,8 +172,8 @@ config CPU_ARM1022 select CPU_32v5 select CPU_ABRT_EV4T select CPU_CACHE_VIVT - select CPU_COPY_V4WB if MMU # can probably do better - select CPU_TLB_V4WBI if MMU + select CPU_COPY_V4WB # can probably do better + select CPU_TLB_V4WBI help The ARM1022E is an implementation of the ARMv5TE architecture based upon the ARM10 integer core with a 16KiB L1 Harvard cache, @@ -189,8 +189,8 @@ config CPU_ARM1026 select CPU_32v5 select CPU_ABRT_EV5T # But need Jazelle, but EV5TJ ignores bit 10 select CPU_CACHE_VIVT - select CPU_COPY_V4WB if MMU # can probably do better - select CPU_TLB_V4WBI if MMU + select CPU_COPY_V4WB # can probably do better + select CPU_TLB_V4WBI help The ARM1026EJ-S is an implementation of the ARMv5TEJ architecture based upon the ARM10 integer core. @@ -207,8 +207,8 @@ config CPU_SA110 select CPU_ABRT_EV4 select CPU_CACHE_V4WB select CPU_CACHE_VIVT - select CPU_COPY_V4WB if MMU - select CPU_TLB_V4WB if MMU + select CPU_COPY_V4WB + select CPU_TLB_V4WB help The Intel StrongARM(R) SA-110 is a 32-bit microprocessor and is available at five speeds ranging from 100 MHz to 233 MHz. @@ -227,7 +227,7 @@ config CPU_SA1100 select CPU_ABRT_EV4 select CPU_CACHE_V4WB select CPU_CACHE_VIVT - select CPU_TLB_V4WB if MMU + select CPU_TLB_V4WB # XScale config CPU_XSCALE @@ -237,18 +237,7 @@ config CPU_XSCALE select CPU_32v5 select CPU_ABRT_EV5T select CPU_CACHE_VIVT - select CPU_TLB_V4WBI if MMU - -# XScale Core Version 3 -config CPU_XSC3 - bool - depends on ARCH_IXP23XX - default y - select CPU_32v5 - select CPU_ABRT_EV5T - select CPU_CACHE_VIVT - select CPU_TLB_V4WBI if MMU - select IO_36 + select CPU_TLB_V4WBI # ARMv6 config CPU_V6 @@ -258,8 +247,8 @@ config CPU_V6 select CPU_ABRT_EV6 select CPU_CACHE_V6 select CPU_CACHE_VIPT - select CPU_COPY_V6 if MMU - select CPU_TLB_V6 if MMU + select CPU_COPY_V6 + select CPU_TLB_V6 # ARMv6k config CPU_32v6K @@ -277,23 +266,12 @@ config CPU_32v6K # This defines the compiler instruction set which depends on the machine type. config CPU_32v3 bool - select TLS_REG_EMUL if SMP || !MMU - select NEEDS_SYSCALL_FOR_CMPXCHG if SMP config CPU_32v4 bool - select TLS_REG_EMUL if SMP || !MMU - select NEEDS_SYSCALL_FOR_CMPXCHG if SMP - -config CPU_32v4T - bool - select TLS_REG_EMUL if SMP || !MMU - select NEEDS_SYSCALL_FOR_CMPXCHG if SMP config CPU_32v5 bool - select TLS_REG_EMUL if SMP || !MMU - select NEEDS_SYSCALL_FOR_CMPXCHG if SMP config CPU_32v6 bool @@ -339,7 +317,6 @@ config CPU_CACHE_VIVT config CPU_CACHE_VIPT bool -if MMU # The copy-page model config CPU_COPY_V3 bool @@ -378,19 +355,11 @@ config CPU_TLB_V4WBI config CPU_TLB_V6 bool -endif - -# -# CPU supports 36-bit I/O -# -config IO_36 - bool - comment "Processor Features" config ARM_THUMB bool "Support Thumb user binaries" - depends on CPU_ARM720T || CPU_ARM920T || CPU_ARM922T || CPU_ARM925T || CPU_ARM926T || CPU_ARM1020 || CPU_ARM1020E || CPU_ARM1022 || CPU_ARM1026 || CPU_XSCALE || CPU_XSC3 || CPU_V6 + depends on CPU_ARM720T || CPU_ARM920T || CPU_ARM922T || CPU_ARM925T || CPU_ARM926T || CPU_ARM1020 || CPU_ARM1020E || CPU_ARM1022 || CPU_ARM1026 || CPU_XSCALE || CPU_V6 default y help Say Y if you want to include kernel support for running user space @@ -448,6 +417,7 @@ config CPU_BPREDICT_DISABLE config TLS_REG_EMUL bool + default y if SMP && (CPU_32v5 || CPU_32v4 || CPU_32v3) help An SMP system using a pre-ARMv6 processor (there are apparently a few prototypes like that in existence) and therefore access to @@ -466,6 +436,7 @@ config HAS_TLS_REG config NEEDS_SYSCALL_FOR_CMPXCHG bool + default y if SMP && (CPU_32v5 || CPU_32v4 || CPU_32v3) help SMP on a pre-ARMv6 processor? Well OK then. Forget about fast user space cmpxchg support. diff --git a/arch/arm/mm/Makefile b/arch/arm/mm/Makefile index 21a277022..ffe73ba2b 100644 --- a/arch/arm/mm/Makefile +++ b/arch/arm/mm/Makefile @@ -2,16 +2,10 @@ # Makefile for the linux arm-specific parts of the memory manager. # -obj-y := consistent.o extable.o fault.o init.o \ - iomap.o - -obj-$(CONFIG_MMU) += fault-armv.o flush.o ioremap.o mmap.o \ +obj-y := consistent.o extable.o fault-armv.o \ + fault.o flush.o init.o ioremap.o mmap.o \ mm-armv.o -ifneq ($(CONFIG_MMU),y) -obj-y += nommu.o -endif - obj-$(CONFIG_MODULES) += proc-syms.o obj-$(CONFIG_ALIGNMENT_TRAP) += alignment.o @@ -36,7 +30,6 @@ obj-$(CONFIG_CPU_COPY_V4WB) += copypage-v4wb.o obj-$(CONFIG_CPU_COPY_V6) += copypage-v6.o mmu.o obj-$(CONFIG_CPU_SA1100) += copypage-v4mc.o obj-$(CONFIG_CPU_XSCALE) += copypage-xscale.o -obj-$(CONFIG_CPU_XSC3) += copypage-xsc3.o obj-$(CONFIG_CPU_TLB_V3) += tlb-v3.o obj-$(CONFIG_CPU_TLB_V4WT) += tlb-v4.o @@ -58,5 +51,4 @@ obj-$(CONFIG_CPU_ARM1026) += proc-arm1026.o obj-$(CONFIG_CPU_SA110) += proc-sa110.o obj-$(CONFIG_CPU_SA1100) += proc-sa1100.o obj-$(CONFIG_CPU_XSCALE) += proc-xscale.o -obj-$(CONFIG_CPU_XSC3) += proc-xsc3.o obj-$(CONFIG_CPU_V6) += proc-v6.o diff --git a/arch/arm/mm/alignment.c b/arch/arm/mm/alignment.c index e0d21bbbe..705c98921 100644 --- a/arch/arm/mm/alignment.c +++ b/arch/arm/mm/alignment.c @@ -11,6 +11,7 @@ * 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/mm/cache-v4wb.S b/arch/arm/mm/cache-v4wb.S index 2ebc1b3bf..5c4055b62 100644 --- a/arch/arm/mm/cache-v4wb.S +++ b/arch/arm/mm/cache-v4wb.S @@ -7,9 +7,10 @@ * 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 "proc-macros.S" @@ -45,11 +46,6 @@ */ #define CACHE_DLIMIT (CACHE_DSIZE * 4) - .data -flush_base: - .long FLUSH_BASE - .text - /* * flush_user_cache_all() * @@ -67,21 +63,11 @@ ENTRY(v4wb_flush_kern_cache_all) mov ip, #0 mcr p15, 0, ip, c7, c5, 0 @ invalidate I cache __flush_whole_cache: - ldr r3, =flush_base - ldr r1, [r3, #0] - eor r1, r1, #CACHE_DSIZE - str r1, [r3, #0] - add r2, r1, #CACHE_DSIZE -1: ldr r3, [r1], #32 - cmp r1, r2 - blo 1b -#ifdef FLUSH_BASE_MINICACHE - add r2, r2, #FLUSH_BASE_MINICACHE - FLUSH_BASE - sub r1, r2, #512 @ only 512 bytes -1: ldr r3, [r1], #32 - cmp r1, r2 + mov r0, #FLUSH_BASE + add r1, r0, #CACHE_DSIZE +1: ldr r2, [r0], #32 + cmp r0, r1 blo 1b -#endif mcr p15, 0, ip, c7, c10, 4 @ drain write buffer mov pc, lr @@ -96,7 +82,6 @@ __flush_whole_cache: * - flags - vma_area_struct flags describing address space */ ENTRY(v4wb_flush_user_cache_range) - mov ip, #0 sub r3, r1, r0 @ calculate total size tst r2, #VM_EXEC @ executable region? mcrne p15, 0, ip, c7, c5, 0 @ invalidate I cache diff --git a/arch/arm/mm/consistent.c b/arch/arm/mm/consistent.c index 50e6b6bfb..c2ee18d20 100644 --- a/arch/arm/mm/consistent.c +++ b/arch/arm/mm/consistent.c @@ -18,7 +18,6 @@ #include #include -#include #include #include #include @@ -224,8 +223,6 @@ __dma_alloc(struct device *dev, size_t size, dma_addr_t *handle, gfp_t gfp, pte = consistent_pte[idx] + off; c->vm_pages = page; - split_page(page, order); - /* * Set the "dma handle" */ @@ -234,6 +231,7 @@ __dma_alloc(struct device *dev, size_t size, dma_addr_t *handle, gfp_t gfp, do { BUG_ON(!pte_none(*pte)); + set_page_count(page, 1); /* * x86 does not mark the pages reserved... */ @@ -252,6 +250,7 @@ __dma_alloc(struct device *dev, size_t size, dma_addr_t *handle, gfp_t gfp, * Free the otherwise unused pages. */ while (page < end) { + set_page_count(page, 1); __free_page(page); page++; } @@ -273,17 +272,6 @@ __dma_alloc(struct device *dev, size_t size, dma_addr_t *handle, gfp_t gfp, void * dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *handle, gfp_t gfp) { - if (arch_is_coherent()) { - void *virt; - - virt = kmalloc(size, gfp); - if (!virt) - return NULL; - *handle = virt_to_dma(dev, virt); - - return virt; - } - return __dma_alloc(dev, size, handle, gfp, pgprot_noncached(pgprot_kernel)); } @@ -362,11 +350,6 @@ void dma_free_coherent(struct device *dev, size_t size, void *cpu_addr, dma_addr WARN_ON(irqs_disabled()); - if (arch_is_coherent()) { - kfree(cpu_addr); - return; - } - size = PAGE_ALIGN(size); spin_lock_irqsave(&consistent_lock, flags); diff --git a/arch/arm/mm/copypage-v3.S b/arch/arm/mm/copypage-v3.S index 2ee394b11..3c58ebbf0 100644 --- a/arch/arm/mm/copypage-v3.S +++ b/arch/arm/mm/copypage-v3.S @@ -35,7 +35,7 @@ ENTRY(v3_copy_user_page) stmia r0!, {r3, r4, ip, lr} @ 4 ldmneia r1!, {r3, r4, ip, lr} @ 4 bne 1b @ 1 - ldmfd sp!, {r4, pc} @ 3 + LOADREGS(fd, sp!, {r4, pc}) @ 3 .align 5 /* diff --git a/arch/arm/mm/fault.c b/arch/arm/mm/fault.c index c5e0622c7..4a884baf3 100644 --- a/arch/arm/mm/fault.c +++ b/arch/arm/mm/fault.c @@ -8,6 +8,7 @@ * 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/mm/flush.c b/arch/arm/mm/flush.c index d438ce41c..b103e5680 100644 --- a/arch/arm/mm/flush.c +++ b/arch/arm/mm/flush.c @@ -87,32 +87,6 @@ void flush_cache_page(struct vm_area_struct *vma, unsigned long user_addr, unsig if (cache_is_vipt_aliasing()) flush_pfn_alias(pfn, user_addr); } - -void flush_ptrace_access(struct vm_area_struct *vma, struct page *page, - unsigned long uaddr, void *kaddr, - unsigned long len, int write) -{ - if (cache_is_vivt()) { - 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); - } - return; - } - - if (cache_is_vipt_aliasing()) { - flush_pfn_alias(page_to_pfn(page), uaddr); - return; - } - - /* VIPT non-aliasing cache */ - if (cpu_isset(smp_processor_id(), vma->vm_mm->cpu_vm_mask) && - vma->vm_flags | VM_EXEC) { - unsigned long addr = (unsigned long)kaddr; - /* only flushing the kernel mapping on non-aliasing VIPT */ - __cpuc_coherent_kern_range(addr, addr + len); - } -} #else #define flush_pfn_alias(pfn,vaddr) do { } while (0) #endif diff --git a/arch/arm/mm/init.c b/arch/arm/mm/init.c index fe3f7f625..8b276ee38 100644 --- a/arch/arm/mm/init.c +++ b/arch/arm/mm/init.c @@ -7,6 +7,7 @@ * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. */ +#include #include #include #include @@ -18,13 +19,15 @@ #include #include +#include #include -#include #include #include #include +#define TABLE_SIZE (2 * PTRS_PER_PTE * sizeof(pte_t)) + DEFINE_PER_CPU(struct mmu_gather, mmu_gathers); extern pgd_t swapper_pg_dir[PTRS_PER_PGD]; @@ -453,14 +456,14 @@ static void __init devicemaps_init(struct machine_desc *mdesc) #ifdef FLUSH_BASE map.pfn = __phys_to_pfn(FLUSH_BASE_PHYS); map.virtual = FLUSH_BASE; - map.length = SZ_1M; + map.length = PGDIR_SIZE; map.type = MT_CACHECLEAN; create_mapping(&map); #endif #ifdef FLUSH_BASE_MINICACHE - map.pfn = __phys_to_pfn(FLUSH_BASE_PHYS + SZ_1M); + map.pfn = __phys_to_pfn(FLUSH_BASE_PHYS + PGDIR_SIZE); map.virtual = FLUSH_BASE_MINICACHE; - map.length = SZ_1M; + map.length = PGDIR_SIZE; map.type = MT_MINICLEAN; create_mapping(&map); #endif @@ -528,7 +531,7 @@ static inline void free_area(unsigned long addr, unsigned long end, char *s) for (; addr < end; addr += PAGE_SIZE) { struct page *page = virt_to_page(addr); ClearPageReserved(page); - init_page_count(page); + set_page_count(page, 1); free_page(addr); totalram_pages++; } diff --git a/arch/arm/mm/ioremap.c b/arch/arm/mm/ioremap.c index 88a999df0..da9b35974 100644 --- a/arch/arm/mm/ioremap.c +++ b/arch/arm/mm/ioremap.c @@ -26,17 +26,9 @@ #include #include +#include #include -#include -#include #include -#include - -/* - * Used by ioremap() and iounmap() code to mark (super)section-mapped - * I/O regions in vm_struct->flags field. - */ -#define VM_ARM_SECTION_MAPPING 0x80000000 static inline void remap_area_pte(pte_t * pte, unsigned long address, unsigned long size, @@ -122,168 +114,10 @@ remap_area_pages(unsigned long start, unsigned long pfn, dir++; } while (address && (address < end)); + flush_cache_vmap(start, end); return err; } - -void __check_kvm_seq(struct mm_struct *mm) -{ - unsigned int seq; - - do { - seq = init_mm.context.kvm_seq; - memcpy(pgd_offset(mm, VMALLOC_START), - pgd_offset_k(VMALLOC_START), - sizeof(pgd_t) * (pgd_index(VMALLOC_END) - - pgd_index(VMALLOC_START))); - mm->context.kvm_seq = seq; - } while (seq != init_mm.context.kvm_seq); -} - -#ifndef CONFIG_SMP -/* - * Section support is unsafe on SMP - If you iounmap and ioremap a region, - * the other CPUs will not see this change until their next context switch. - * Meanwhile, (eg) if an interrupt comes in on one of those other CPUs - * which requires the new ioremap'd region to be referenced, the CPU will - * reference the _old_ region. - * - * Note that get_vm_area() allocates a guard 4K page, so we need to mask - * the size back to 1MB aligned or we will overflow in the loop below. - */ -static void unmap_area_sections(unsigned long virt, unsigned long size) -{ - unsigned long addr = virt, end = virt + (size & ~SZ_1M); - pgd_t *pgd; - - flush_cache_vunmap(addr, end); - pgd = pgd_offset_k(addr); - do { - pmd_t pmd, *pmdp = pmd_offset(pgd, addr); - - pmd = *pmdp; - if (!pmd_none(pmd)) { - /* - * Clear the PMD from the page table, and - * increment the kvm sequence so others - * notice this change. - * - * Note: this is still racy on SMP machines. - */ - pmd_clear(pmdp); - init_mm.context.kvm_seq++; - - /* - * Free the page table, if there was one. - */ - if ((pmd_val(pmd) & PMD_TYPE_MASK) == PMD_TYPE_TABLE) - pte_free_kernel(pmd_page_kernel(pmd)); - } - - addr += PGDIR_SIZE; - pgd++; - } while (addr < end); - - /* - * Ensure that the active_mm is up to date - we want to - * catch any use-after-iounmap cases. - */ - if (current->active_mm->context.kvm_seq != init_mm.context.kvm_seq) - __check_kvm_seq(current->active_mm); - - flush_tlb_kernel_range(virt, end); -} - -static int -remap_area_sections(unsigned long virt, unsigned long pfn, - unsigned long size, unsigned long flags) -{ - unsigned long prot, addr = virt, end = virt + size; - pgd_t *pgd; - - /* - * Remove and free any PTE-based mapping, and - * sync the current kernel mapping. - */ - unmap_area_sections(virt, size); - - prot = PMD_TYPE_SECT | PMD_SECT_AP_WRITE | PMD_DOMAIN(DOMAIN_IO) | - (flags & (L_PTE_CACHEABLE | L_PTE_BUFFERABLE)); - - /* - * ARMv6 and above need XN set to prevent speculative prefetches - * hitting IO. - */ - if (cpu_architecture() >= CPU_ARCH_ARMv6) - prot |= PMD_SECT_XN; - - pgd = pgd_offset_k(addr); - do { - pmd_t *pmd = pmd_offset(pgd, addr); - - pmd[0] = __pmd(__pfn_to_phys(pfn) | prot); - pfn += SZ_1M >> PAGE_SHIFT; - pmd[1] = __pmd(__pfn_to_phys(pfn) | prot); - pfn += SZ_1M >> PAGE_SHIFT; - flush_pmd_entry(pmd); - - addr += PGDIR_SIZE; - pgd++; - } while (addr < end); - - return 0; -} - -static int -remap_area_supersections(unsigned long virt, unsigned long pfn, - unsigned long size, unsigned long flags) -{ - unsigned long prot, addr = virt, end = virt + size; - pgd_t *pgd; - - /* - * Remove and free any PTE-based mapping, and - * sync the current kernel mapping. - */ - unmap_area_sections(virt, size); - - prot = PMD_TYPE_SECT | PMD_SECT_SUPER | PMD_SECT_AP_WRITE | - PMD_DOMAIN(DOMAIN_IO) | - (flags & (L_PTE_CACHEABLE | L_PTE_BUFFERABLE)); - - /* - * ARMv6 and above need XN set to prevent speculative prefetches - * hitting IO. - */ - if (cpu_architecture() >= CPU_ARCH_ARMv6) - prot |= PMD_SECT_XN; - - pgd = pgd_offset_k(virt); - do { - unsigned long super_pmd_val, i; - - super_pmd_val = __pfn_to_phys(pfn) | prot; - super_pmd_val |= ((pfn >> (32 - PAGE_SHIFT)) & 0xf) << 20; - - for (i = 0; i < 8; i++) { - pmd_t *pmd = pmd_offset(pgd, addr); - - pmd[0] = __pmd(super_pmd_val); - pmd[1] = __pmd(super_pmd_val); - flush_pmd_entry(pmd); - - addr += PGDIR_SIZE; - pgd++; - } - - pfn += SUPERSECTION_SIZE >> PAGE_SHIFT; - } while (addr < end); - - return 0; -} -#endif - - /* * Remap an arbitrary physical address space into the kernel virtual * address space. Needed when the kernel wants to access high addresses @@ -300,41 +134,18 @@ void __iomem * __ioremap_pfn(unsigned long pfn, unsigned long offset, size_t size, unsigned long flags) { - int err; unsigned long addr; struct vm_struct * area; - /* - * High mappings must be supersection aligned - */ - if (pfn >= 0x100000 && (__pfn_to_phys(pfn) & ~SUPERSECTION_MASK)) - return NULL; - area = get_vm_area(size, VM_IOREMAP); if (!area) return NULL; addr = (unsigned long)area->addr; - -#ifndef CONFIG_SMP - if ((((cpu_architecture() >= CPU_ARCH_ARMv6) && (get_cr() & CR_XP)) || - cpu_is_xsc3()) && - !((__pfn_to_phys(pfn) | size | addr) & ~SUPERSECTION_MASK)) { - area->flags |= VM_ARM_SECTION_MAPPING; - err = remap_area_supersections(addr, pfn, size, flags); - } else if (!((__pfn_to_phys(pfn) | size | addr) & ~PMD_MASK)) { - area->flags |= VM_ARM_SECTION_MAPPING; - err = remap_area_sections(addr, pfn, size, flags); - } else -#endif - err = remap_area_pages(addr, pfn, size, flags); - - if (err) { - vunmap((void *)addr); + if (remap_area_pages(addr, pfn, size, flags)) { + vfree((void *)addr); return NULL; } - - flush_cache_vmap(addr, addr + size); - return (void __iomem *) (offset + addr); + return (void __iomem *) (offset + (char *)addr); } EXPORT_SYMBOL(__ioremap_pfn); @@ -363,38 +174,53 @@ EXPORT_SYMBOL(__ioremap); void __iounmap(void __iomem *addr) { -#ifndef CONFIG_SMP - struct vm_struct **p, *tmp; + vfree((void *) (PAGE_MASK & (unsigned long) addr)); +} +EXPORT_SYMBOL(__iounmap); + +#ifdef __io +void __iomem *ioport_map(unsigned long port, unsigned int nr) +{ + return __io(port); +} +EXPORT_SYMBOL(ioport_map); + +void ioport_unmap(void __iomem *addr) +{ +} +EXPORT_SYMBOL(ioport_unmap); #endif - unsigned int section_mapping = 0; - addr = (void __iomem *)(PAGE_MASK & (unsigned long)addr); +#ifdef CONFIG_PCI +#include +#include -#ifndef CONFIG_SMP - /* - * If this is a section based mapping we need to handle it - * specially as the VM subysystem does not know how to handle - * such a beast. We need the lock here b/c we need to clear - * all the mappings before the area can be reclaimed - * by someone else. - */ - write_lock(&vmlist_lock); - for (p = &vmlist ; (tmp = *p) ; p = &tmp->next) { - if((tmp->flags & VM_IOREMAP) && (tmp->addr == addr)) { - if (tmp->flags & VM_ARM_SECTION_MAPPING) { - *p = tmp->next; - unmap_area_sections((unsigned long)tmp->addr, - tmp->size); - kfree(tmp); - section_mapping = 1; - } - break; - } +void __iomem *pci_iomap(struct pci_dev *dev, int bar, unsigned long maxlen) +{ + unsigned long start = pci_resource_start(dev, bar); + unsigned long len = pci_resource_len(dev, bar); + unsigned long flags = pci_resource_flags(dev, bar); + + if (!len || !start) + return NULL; + if (maxlen && len > maxlen) + len = maxlen; + if (flags & IORESOURCE_IO) + return ioport_map(start, len); + if (flags & IORESOURCE_MEM) { + if (flags & IORESOURCE_CACHEABLE) + return ioremap(start, len); + return ioremap_nocache(start, len); } - write_unlock(&vmlist_lock); -#endif + return NULL; +} +EXPORT_SYMBOL(pci_iomap); - if (!section_mapping) - vunmap(addr); +void pci_iounmap(struct pci_dev *dev, void __iomem *addr) +{ + if ((unsigned long)addr >= VMALLOC_START && + (unsigned long)addr < VMALLOC_END) + iounmap(addr); } -EXPORT_SYMBOL(__iounmap); +EXPORT_SYMBOL(pci_iounmap); +#endif diff --git a/arch/arm/mm/mm-armv.c b/arch/arm/mm/mm-armv.c index 38769f586..ef8d30a18 100644 --- a/arch/arm/mm/mm-armv.c +++ b/arch/arm/mm/mm-armv.c @@ -9,6 +9,7 @@ * * Page table sludge for ARM v3 and v4 processor architectures. */ +#include #include #include #include @@ -226,7 +227,7 @@ void free_pgd_slow(pgd_t *pgd) pte = pmd_page(*pmd); pmd_clear(pmd); - dec_zone_page_state(virt_to_page((unsigned long *)pgd), NR_PAGETABLE); + dec_page_state(nr_page_table_pages); pte_lock_deinit(pte); pte_free(pte); pmd_free(pmd); @@ -302,16 +303,16 @@ static struct mem_types mem_types[] __initdata = { .prot_pte = L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_DIRTY | L_PTE_WRITE, .prot_l1 = PMD_TYPE_TABLE, - .prot_sect = PMD_TYPE_SECT | PMD_BIT4 | PMD_SECT_UNCACHED | + .prot_sect = PMD_TYPE_SECT | PMD_SECT_UNCACHED | PMD_SECT_AP_WRITE, .domain = DOMAIN_IO, }, [MT_CACHECLEAN] = { - .prot_sect = PMD_TYPE_SECT | PMD_BIT4, + .prot_sect = PMD_TYPE_SECT, .domain = DOMAIN_KERNEL, }, [MT_MINICLEAN] = { - .prot_sect = PMD_TYPE_SECT | PMD_BIT4 | PMD_SECT_MINICACHE, + .prot_sect = PMD_TYPE_SECT | PMD_SECT_MINICACHE, .domain = DOMAIN_KERNEL, }, [MT_LOW_VECTORS] = { @@ -327,25 +328,25 @@ static struct mem_types mem_types[] __initdata = { .domain = DOMAIN_USER, }, [MT_MEMORY] = { - .prot_sect = PMD_TYPE_SECT | PMD_BIT4 | PMD_SECT_AP_WRITE, + .prot_sect = PMD_TYPE_SECT | PMD_SECT_AP_WRITE, .domain = DOMAIN_KERNEL, }, [MT_ROM] = { - .prot_sect = PMD_TYPE_SECT | PMD_BIT4, + .prot_sect = PMD_TYPE_SECT, .domain = DOMAIN_KERNEL, }, [MT_IXP2000_DEVICE] = { /* IXP2400 requires XCB=101 for on-chip I/O */ .prot_pte = L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_DIRTY | L_PTE_WRITE, .prot_l1 = PMD_TYPE_TABLE, - .prot_sect = PMD_TYPE_SECT | PMD_BIT4 | PMD_SECT_UNCACHED | + .prot_sect = PMD_TYPE_SECT | PMD_SECT_UNCACHED | PMD_SECT_AP_WRITE | PMD_SECT_BUFFERABLE | PMD_SECT_TEX(1), .domain = DOMAIN_IO, }, [MT_NONSHARED_DEVICE] = { .prot_l1 = PMD_TYPE_TABLE, - .prot_sect = PMD_TYPE_SECT | PMD_BIT4 | PMD_SECT_NONSHARED_DEV | + .prot_sect = PMD_TYPE_SECT | PMD_SECT_NONSHARED_DEV | PMD_SECT_AP_WRITE, .domain = DOMAIN_IO, } @@ -375,36 +376,18 @@ void __init build_mem_type_table(void) ecc_mask = 0; } - /* - * Xscale must not have PMD bit 4 set for section mappings. - */ - if (cpu_is_xscale()) - for (i = 0; i < ARRAY_SIZE(mem_types); i++) - mem_types[i].prot_sect &= ~PMD_BIT4; - - /* - * ARMv5 and lower, excluding Xscale, bit 4 must be set for - * page tables. - */ - if (cpu_arch < CPU_ARCH_ARMv6 && !cpu_is_xscale()) - for (i = 0; i < ARRAY_SIZE(mem_types); i++) + if (cpu_arch <= CPU_ARCH_ARMv5TEJ) { + for (i = 0; i < ARRAY_SIZE(mem_types); i++) { if (mem_types[i].prot_l1) mem_types[i].prot_l1 |= PMD_BIT4; + if (mem_types[i].prot_sect) + mem_types[i].prot_sect |= PMD_BIT4; + } + } cp = &cache_policies[cachepolicy]; kern_pgprot = user_pgprot = cp->pte; - /* - * Enable CPU-specific coherency if supported. - * (Only available on XSC3 at the moment.) - */ - if (arch_is_coherent()) { - if (cpu_is_xsc3()) { - mem_types[MT_MEMORY].prot_sect |= PMD_SECT_S; - mem_types[MT_MEMORY].prot_pte |= L_PTE_COHERENT; - } - } - /* * ARMv6 and above have extended page tables. */ @@ -413,8 +396,8 @@ void __init build_mem_type_table(void) * bit 4 becomes XN which we must clear for the * kernel memory mapping. */ - mem_types[MT_MEMORY].prot_sect &= ~PMD_SECT_XN; - mem_types[MT_ROM].prot_sect &= ~PMD_SECT_XN; + mem_types[MT_MEMORY].prot_sect &= ~PMD_BIT4; + mem_types[MT_ROM].prot_sect &= ~PMD_BIT4; /* * Mark cache clean areas and XIP ROM read only @@ -574,8 +557,7 @@ void __init create_mapping(struct map_desc *md) * supersections are only allocated for domain 0 regardless * of the actual domain assignments in use. */ - if ((cpu_architecture() >= CPU_ARCH_ARMv6 || cpu_is_xsc3()) - && domain == 0) { + if (cpu_architecture() >= CPU_ARCH_ARMv6 && domain == 0) { /* * Align to supersection boundary if !high pages. * High pages have already been checked for proper @@ -637,7 +619,7 @@ void setup_mm_for_reboot(char mode) pgd = init_mm.pgd; base_pmdval = PMD_SECT_AP_WRITE | PMD_SECT_AP_READ | PMD_TYPE_SECT; - if (cpu_architecture() <= CPU_ARCH_ARMv5TEJ && !cpu_is_xscale()) + if (cpu_architecture() <= CPU_ARCH_ARMv5TEJ) base_pmdval |= PMD_BIT4; for (i = 0; i < FIRST_USER_PGD_NR + USER_PTRS_PER_PGD; i++, pgd++) { diff --git a/arch/arm/mm/mmap.c b/arch/arm/mm/mmap.c index 29e54807c..3de7f84b5 100644 --- a/arch/arm/mm/mmap.c +++ b/arch/arm/mm/mmap.c @@ -1,6 +1,7 @@ /* * linux/arch/arm/mm/mmap.c */ +#include #include #include #include diff --git a/arch/arm/mm/proc-arm1020.S b/arch/arm/mm/proc-arm1020.S index 1d8316f3c..82ec954e4 100644 --- a/arch/arm/mm/proc-arm1020.S +++ b/arch/arm/mm/proc-arm1020.S @@ -3,7 +3,6 @@ * * Copyright (C) 2000 ARM Limited * Copyright (C) 2000 Deep Blue Solutions Ltd. - * hacked for non-paged-MM by Hyok S. Choi, 2003. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -26,15 +25,14 @@ * CONFIG_CPU_ARM1020_CPU_IDLE -> nohlt */ #include +#include #include #include #include -#include #include #include #include - -#include "proc-macros.S" +#include /* * This is the maximum size of an area which will be invalidated @@ -103,9 +101,7 @@ ENTRY(cpu_arm1020_reset) mov ip, #0 mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches mcr p15, 0, ip, c7, c10, 4 @ drain WB -#ifdef CONFIG_MMU mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs -#endif mrc p15, 0, ip, c1, c0, 0 @ ctrl register bic ip, ip, #0x000f @ ............wcam bic ip, ip, #0x1100 @ ...i...s........ @@ -363,7 +359,6 @@ ENTRY(cpu_arm1020_dcache_clean_area) */ .align 5 ENTRY(cpu_arm1020_switch_mm) -#ifdef CONFIG_MMU #ifndef CONFIG_CPU_DCACHE_DISABLE mcr p15, 0, r3, c7, c10, 4 mov r1, #0xF @ 16 segments @@ -388,7 +383,6 @@ ENTRY(cpu_arm1020_switch_mm) mcr p15, 0, r1, c7, c10, 4 @ drain WB mcr p15, 0, r0, c2, c0, 0 @ load page table pointer mcr p15, 0, r1, c8, c7, 0 @ invalidate I & D TLBs -#endif /* CONFIG_MMU */ mov pc, lr /* @@ -398,7 +392,6 @@ ENTRY(cpu_arm1020_switch_mm) */ .align 5 ENTRY(cpu_arm1020_set_pte) -#ifdef CONFIG_MMU str r1, [r0], #-2048 @ linux version eor r1, r1, #L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_WRITE | L_PTE_DIRTY @@ -428,7 +421,6 @@ ENTRY(cpu_arm1020_set_pte) mcr p15, 0, r0, c7, c10, 1 @ clean D entry #endif mcr p15, 0, r0, c7, c10, 4 @ drain WB -#endif /* CONFIG_MMU */ mov pc, lr __INIT @@ -438,15 +430,12 @@ __arm1020_setup: mov r0, #0 mcr p15, 0, r0, c7, c7 @ invalidate I,D caches on v4 mcr p15, 0, r0, c7, c10, 4 @ drain write buffer on v4 -#ifdef CONFIG_MMU mcr p15, 0, r0, c8, c7 @ invalidate I,D TLBs on v4 -#endif - - adr r5, arm1020_crval - ldmia r5, {r5, r6} mrc p15, 0, r0, c1, c0 @ get control register v4 + ldr r5, arm1020_cr1_clear bic r0, r0, r5 - orr r0, r0, r6 + ldr r5, arm1020_cr1_set + orr r0, r0, r5 #ifdef CONFIG_CPU_CACHE_ROUND_ROBIN orr r0, r0, #0x4000 @ .R.. .... .... .... #endif @@ -458,9 +447,12 @@ __arm1020_setup: * .RVI ZFRS BLDP WCAM * .011 1001 ..11 0101 */ - .type arm1020_crval, #object -arm1020_crval: - crval clear=0x0000593f, mmuset=0x00003935, ucset=0x00001930 + .type arm1020_cr1_clear, #object + .type arm1020_cr1_set, #object +arm1020_cr1_clear: + .word 0x593f +arm1020_cr1_set: + .word 0x3935 __INITDATA @@ -523,9 +515,6 @@ cpu_arm1020_name: __arm1020_proc_info: .long 0x4104a200 @ ARM 1020T (Architecture v5T) .long 0xff0ffff0 - .long PMD_TYPE_SECT | \ - PMD_SECT_AP_WRITE | \ - PMD_SECT_AP_READ .long PMD_TYPE_SECT | \ PMD_SECT_AP_WRITE | \ PMD_SECT_AP_READ diff --git a/arch/arm/mm/proc-arm1020e.S b/arch/arm/mm/proc-arm1020e.S index 89b1d6d3d..7375fe930 100644 --- a/arch/arm/mm/proc-arm1020e.S +++ b/arch/arm/mm/proc-arm1020e.S @@ -3,7 +3,6 @@ * * Copyright (C) 2000 ARM Limited * Copyright (C) 2000 Deep Blue Solutions Ltd. - * hacked for non-paged-MM by Hyok S. Choi, 2003. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -26,15 +25,14 @@ * CONFIG_CPU_ARM1020_CPU_IDLE -> nohlt */ #include +#include #include #include #include -#include #include #include #include - -#include "proc-macros.S" +#include /* * This is the maximum size of an area which will be invalidated @@ -103,9 +101,7 @@ ENTRY(cpu_arm1020e_reset) mov ip, #0 mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches mcr p15, 0, ip, c7, c10, 4 @ drain WB -#ifdef CONFIG_MMU mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs -#endif mrc p15, 0, ip, c1, c0, 0 @ ctrl register bic ip, ip, #0x000f @ ............wcam bic ip, ip, #0x1100 @ ...i...s........ @@ -348,7 +344,6 @@ ENTRY(cpu_arm1020e_dcache_clean_area) */ .align 5 ENTRY(cpu_arm1020e_switch_mm) -#ifdef CONFIG_MMU #ifndef CONFIG_CPU_DCACHE_DISABLE mcr p15, 0, r3, c7, c10, 4 mov r1, #0xF @ 16 segments @@ -372,7 +367,6 @@ ENTRY(cpu_arm1020e_switch_mm) mcr p15, 0, r1, c7, c10, 4 @ drain WB mcr p15, 0, r0, c2, c0, 0 @ load page table pointer mcr p15, 0, r1, c8, c7, 0 @ invalidate I & D TLBs -#endif mov pc, lr /* @@ -382,7 +376,6 @@ ENTRY(cpu_arm1020e_switch_mm) */ .align 5 ENTRY(cpu_arm1020e_set_pte) -#ifdef CONFIG_MMU str r1, [r0], #-2048 @ linux version eor r1, r1, #L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_WRITE | L_PTE_DIRTY @@ -410,7 +403,6 @@ ENTRY(cpu_arm1020e_set_pte) #ifndef CONFIG_CPU_DCACHE_DISABLE mcr p15, 0, r0, c7, c10, 1 @ clean D entry #endif -#endif /* CONFIG_MMU */ mov pc, lr __INIT @@ -420,14 +412,12 @@ __arm1020e_setup: mov r0, #0 mcr p15, 0, r0, c7, c7 @ invalidate I,D caches on v4 mcr p15, 0, r0, c7, c10, 4 @ drain write buffer on v4 -#ifdef CONFIG_MMU mcr p15, 0, r0, c8, c7 @ invalidate I,D TLBs on v4 -#endif - adr r5, arm1020e_crval - ldmia r5, {r5, r6} mrc p15, 0, r0, c1, c0 @ get control register v4 + ldr r5, arm1020e_cr1_clear bic r0, r0, r5 - orr r0, r0, r6 + ldr r5, arm1020e_cr1_set + orr r0, r0, r5 #ifdef CONFIG_CPU_CACHE_ROUND_ROBIN orr r0, r0, #0x4000 @ .R.. .... .... .... #endif @@ -439,9 +429,12 @@ __arm1020e_setup: * .RVI ZFRS BLDP WCAM * .011 1001 ..11 0101 */ - .type arm1020e_crval, #object -arm1020e_crval: - crval clear=0x00007f3f, mmuset=0x00003935, ucset=0x00001930 + .type arm1020e_cr1_clear, #object + .type arm1020e_cr1_set, #object +arm1020e_cr1_clear: + .word 0x5f3f +arm1020e_cr1_set: + .word 0x3935 __INITDATA @@ -475,7 +468,25 @@ cpu_elf_name: .type cpu_arm1020e_name, #object cpu_arm1020e_name: - .asciz "ARM1020E" + .ascii "ARM1020E" +#ifndef CONFIG_CPU_ICACHE_DISABLE + .ascii "i" +#endif +#ifndef CONFIG_CPU_DCACHE_DISABLE + .ascii "d" +#ifdef CONFIG_CPU_DCACHE_WRITETHROUGH + .ascii "(wt)" +#else + .ascii "(wb)" +#endif +#endif +#ifndef CONFIG_CPU_BPREDICT_DISABLE + .ascii "B" +#endif +#ifdef CONFIG_CPU_CACHE_ROUND_ROBIN + .ascii "RR" +#endif + .ascii "\0" .size cpu_arm1020e_name, . - cpu_arm1020e_name .align @@ -486,10 +497,6 @@ cpu_arm1020e_name: __arm1020e_proc_info: .long 0x4105a200 @ ARM 1020TE (Architecture v5TE) .long 0xff0ffff0 - .long PMD_TYPE_SECT | \ - PMD_BIT4 | \ - PMD_SECT_AP_WRITE | \ - PMD_SECT_AP_READ .long PMD_TYPE_SECT | \ PMD_BIT4 | \ PMD_SECT_AP_WRITE | \ diff --git a/arch/arm/mm/proc-arm1022.S b/arch/arm/mm/proc-arm1022.S index a089528e6..6ca639094 100644 --- a/arch/arm/mm/proc-arm1022.S +++ b/arch/arm/mm/proc-arm1022.S @@ -3,7 +3,6 @@ * * Copyright (C) 2000 ARM Limited * Copyright (C) 2000 Deep Blue Solutions Ltd. - * hacked for non-paged-MM by Hyok S. Choi, 2003. * * This 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,16 +14,14 @@ * functions on the ARM1022E. */ #include +#include #include #include #include -#include #include #include #include -#include "proc-macros.S" - /* * This is the maximum size of an area which will be invalidated * using the single invalidate entry instructions. Anything larger @@ -92,9 +89,7 @@ ENTRY(cpu_arm1022_reset) mov ip, #0 mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches mcr p15, 0, ip, c7, c10, 4 @ drain WB -#ifdef CONFIG_MMU mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs -#endif mrc p15, 0, ip, c1, c0, 0 @ ctrl register bic ip, ip, #0x000f @ ............wcam bic ip, ip, #0x1100 @ ...i...s........ @@ -337,7 +332,6 @@ ENTRY(cpu_arm1022_dcache_clean_area) */ .align 5 ENTRY(cpu_arm1022_switch_mm) -#ifdef CONFIG_MMU #ifndef CONFIG_CPU_DCACHE_DISABLE mov r1, #(CACHE_DSEGMENTS - 1) << 5 @ 16 segments 1: orr r3, r1, #(CACHE_DENTRIES - 1) << 26 @ 64 entries @@ -354,7 +348,6 @@ ENTRY(cpu_arm1022_switch_mm) mcr p15, 0, r1, c7, c10, 4 @ drain WB mcr p15, 0, r0, c2, c0, 0 @ load page table pointer mcr p15, 0, r1, c8, c7, 0 @ invalidate I & D TLBs -#endif mov pc, lr /* @@ -364,7 +357,6 @@ ENTRY(cpu_arm1022_switch_mm) */ .align 5 ENTRY(cpu_arm1022_set_pte) -#ifdef CONFIG_MMU str r1, [r0], #-2048 @ linux version eor r1, r1, #L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_WRITE | L_PTE_DIRTY @@ -392,7 +384,6 @@ ENTRY(cpu_arm1022_set_pte) #ifndef CONFIG_CPU_DCACHE_DISABLE mcr p15, 0, r0, c7, c10, 1 @ clean D entry #endif -#endif /* CONFIG_MMU */ mov pc, lr __INIT @@ -402,14 +393,12 @@ __arm1022_setup: mov r0, #0 mcr p15, 0, r0, c7, c7 @ invalidate I,D caches on v4 mcr p15, 0, r0, c7, c10, 4 @ drain write buffer on v4 -#ifdef CONFIG_MMU mcr p15, 0, r0, c8, c7 @ invalidate I,D TLBs on v4 -#endif - adr r5, arm1022_crval - ldmia r5, {r5, r6} mrc p15, 0, r0, c1, c0 @ get control register v4 + ldr r5, arm1022_cr1_clear bic r0, r0, r5 - orr r0, r0, r6 + ldr r5, arm1022_cr1_set + orr r0, r0, r5 #ifdef CONFIG_CPU_CACHE_ROUND_ROBIN orr r0, r0, #0x4000 @ .R.............. #endif @@ -422,9 +411,12 @@ __arm1022_setup: * .011 1001 ..11 0101 * */ - .type arm1022_crval, #object -arm1022_crval: - crval clear=0x00007f3f, mmuset=0x00003935, ucset=0x00001930 + .type arm1022_cr1_clear, #object + .type arm1022_cr1_set, #object +arm1022_cr1_clear: + .word 0x7f3f +arm1022_cr1_set: + .word 0x3935 __INITDATA @@ -458,7 +450,25 @@ cpu_elf_name: .type cpu_arm1022_name, #object cpu_arm1022_name: - .asciz "ARM1022" + .ascii "arm1022" +#ifndef CONFIG_CPU_ICACHE_DISABLE + .ascii "i" +#endif +#ifndef CONFIG_CPU_DCACHE_DISABLE + .ascii "d" +#ifdef CONFIG_CPU_DCACHE_WRITETHROUGH + .ascii "(wt)" +#else + .ascii "(wb)" +#endif +#endif +#ifndef CONFIG_CPU_BPREDICT_DISABLE + .ascii "B" +#endif +#ifdef CONFIG_CPU_CACHE_ROUND_ROBIN + .ascii "RR" +#endif + .ascii "\0" .size cpu_arm1022_name, . - cpu_arm1022_name .align @@ -469,10 +479,6 @@ cpu_arm1022_name: __arm1022_proc_info: .long 0x4105a220 @ ARM 1022E (v5TE) .long 0xff0ffff0 - .long PMD_TYPE_SECT | \ - PMD_BIT4 | \ - PMD_SECT_AP_WRITE | \ - PMD_SECT_AP_READ .long PMD_TYPE_SECT | \ PMD_BIT4 | \ PMD_SECT_AP_WRITE | \ diff --git a/arch/arm/mm/proc-arm1026.S b/arch/arm/mm/proc-arm1026.S index d6d84d92c..10317e4f5 100644 --- a/arch/arm/mm/proc-arm1026.S +++ b/arch/arm/mm/proc-arm1026.S @@ -3,7 +3,6 @@ * * Copyright (C) 2000 ARM Limited * Copyright (C) 2000 Deep Blue Solutions Ltd. - * hacked for non-paged-MM by Hyok S. Choi, 2003. * * This 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,16 +14,14 @@ * functions on the ARM1026EJ-S. */ #include +#include #include #include #include -#include #include #include #include -#include "proc-macros.S" - /* * This is the maximum size of an area which will be invalidated * using the single invalidate entry instructions. Anything larger @@ -92,9 +89,7 @@ ENTRY(cpu_arm1026_reset) mov ip, #0 mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches mcr p15, 0, ip, c7, c10, 4 @ drain WB -#ifdef CONFIG_MMU mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs -#endif mrc p15, 0, ip, c1, c0, 0 @ ctrl register bic ip, ip, #0x000f @ ............wcam bic ip, ip, #0x1100 @ ...i...s........ @@ -331,7 +326,6 @@ ENTRY(cpu_arm1026_dcache_clean_area) */ .align 5 ENTRY(cpu_arm1026_switch_mm) -#ifdef CONFIG_MMU mov r1, #0 #ifndef CONFIG_CPU_DCACHE_DISABLE 1: mrc p15, 0, r15, c7, c14, 3 @ test, clean, invalidate @@ -343,7 +337,6 @@ ENTRY(cpu_arm1026_switch_mm) mcr p15, 0, r1, c7, c10, 4 @ drain WB mcr p15, 0, r0, c2, c0, 0 @ load page table pointer mcr p15, 0, r1, c8, c7, 0 @ invalidate I & D TLBs -#endif mov pc, lr /* @@ -353,7 +346,6 @@ ENTRY(cpu_arm1026_switch_mm) */ .align 5 ENTRY(cpu_arm1026_set_pte) -#ifdef CONFIG_MMU str r1, [r0], #-2048 @ linux version eor r1, r1, #L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_WRITE | L_PTE_DIRTY @@ -381,7 +373,6 @@ ENTRY(cpu_arm1026_set_pte) #ifndef CONFIG_CPU_DCACHE_DISABLE mcr p15, 0, r0, c7, c10, 1 @ clean D entry #endif -#endif /* CONFIG_MMU */ mov pc, lr @@ -392,19 +383,17 @@ __arm1026_setup: mov r0, #0 mcr p15, 0, r0, c7, c7 @ invalidate I,D caches on v4 mcr p15, 0, r0, c7, c10, 4 @ drain write buffer on v4 -#ifdef CONFIG_MMU mcr p15, 0, r0, c8, c7 @ invalidate I,D TLBs on v4 mcr p15, 0, r4, c2, c0 @ load page table pointer -#endif #ifdef CONFIG_CPU_DCACHE_WRITETHROUGH mov r0, #4 @ explicitly disable writeback mcr p15, 7, r0, c15, c0, 0 #endif - adr r5, arm1026_crval - ldmia r5, {r5, r6} mrc p15, 0, r0, c1, c0 @ get control register v4 + ldr r5, arm1026_cr1_clear bic r0, r0, r5 - orr r0, r0, r6 + ldr r5, arm1026_cr1_set + orr r0, r0, r5 #ifdef CONFIG_CPU_CACHE_ROUND_ROBIN orr r0, r0, #0x4000 @ .R.. .... .... .... #endif @@ -417,9 +406,12 @@ __arm1026_setup: * .011 1001 ..11 0101 * */ - .type arm1026_crval, #object -arm1026_crval: - crval clear=0x00007f3f, mmuset=0x00003935, ucset=0x00001934 + .type arm1026_cr1_clear, #object + .type arm1026_cr1_set, #object +arm1026_cr1_clear: + .word 0x7f3f +arm1026_cr1_set: + .word 0x3935 __INITDATA @@ -454,7 +446,25 @@ cpu_elf_name: .type cpu_arm1026_name, #object cpu_arm1026_name: - .asciz "ARM1026EJ-S" + .ascii "ARM1026EJ-S" +#ifndef CONFIG_CPU_ICACHE_DISABLE + .ascii "i" +#endif +#ifndef CONFIG_CPU_DCACHE_DISABLE + .ascii "d" +#ifdef CONFIG_CPU_DCACHE_WRITETHROUGH + .ascii "(wt)" +#else + .ascii "(wb)" +#endif +#endif +#ifndef CONFIG_CPU_BPREDICT_DISABLE + .ascii "B" +#endif +#ifdef CONFIG_CPU_CACHE_ROUND_ROBIN + .ascii "RR" +#endif + .ascii "\0" .size cpu_arm1026_name, . - cpu_arm1026_name .align @@ -465,10 +475,6 @@ cpu_arm1026_name: __arm1026_proc_info: .long 0x4106a260 @ ARM 1026EJ-S (v5TEJ) .long 0xff0ffff0 - .long PMD_TYPE_SECT | \ - PMD_BIT4 | \ - PMD_SECT_AP_WRITE | \ - PMD_SECT_AP_READ .long PMD_TYPE_SECT | \ PMD_BIT4 | \ PMD_SECT_AP_WRITE | \ diff --git a/arch/arm/mm/proc-arm6_7.S b/arch/arm/mm/proc-arm6_7.S index 0432e4806..8e7e1e70a 100644 --- a/arch/arm/mm/proc-arm6_7.S +++ b/arch/arm/mm/proc-arm6_7.S @@ -2,7 +2,6 @@ * linux/arch/arm/mm/proc-arm6,7.S * * Copyright (C) 1997-2000 Russell King - * hacked for non-paged-MM by Hyok S. Choi, 2003. * * 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 @@ -15,7 +14,6 @@ #include #include #include -#include #include #include #include @@ -200,12 +198,10 @@ ENTRY(cpu_arm7_do_idle) */ ENTRY(cpu_arm6_switch_mm) ENTRY(cpu_arm7_switch_mm) -#ifdef CONFIG_MMU mov r1, #0 mcr p15, 0, r1, c7, c0, 0 @ flush cache mcr p15, 0, r0, c2, c0, 0 @ update page table ptr mcr p15, 0, r1, c5, c0, 0 @ flush TLBs -#endif mov pc, lr /* @@ -217,7 +213,6 @@ ENTRY(cpu_arm7_switch_mm) .align 5 ENTRY(cpu_arm6_set_pte) ENTRY(cpu_arm7_set_pte) -#ifdef CONFIG_MMU str r1, [r0], #-2048 @ linux version eor r1, r1, #L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_WRITE | L_PTE_DIRTY @@ -236,7 +231,6 @@ ENTRY(cpu_arm7_set_pte) movne r2, #0 str r2, [r0] @ hardware version -#endif /* CONFIG_MMU */ mov pc, lr /* @@ -248,9 +242,7 @@ ENTRY(cpu_arm6_reset) ENTRY(cpu_arm7_reset) mov r1, #0 mcr p15, 0, r1, c7, c0, 0 @ flush cache -#ifdef CONFIG_MMU mcr p15, 0, r1, c5, c0, 0 @ flush TLB -#endif mov r1, #0x30 mcr p15, 0, r1, c1, c0, 0 @ turn off MMU etc mov pc, r0 @@ -260,27 +252,19 @@ ENTRY(cpu_arm7_reset) .type __arm6_setup, #function __arm6_setup: mov r0, #0 mcr p15, 0, r0, c7, c0 @ flush caches on v3 -#ifdef CONFIG_MMU mcr p15, 0, r0, c5, c0 @ flush TLBs on v3 mov r0, #0x3d @ . ..RS BLDP WCAM orr r0, r0, #0x100 @ . ..01 0011 1101 -#else - mov r0, #0x3c @ . ..RS BLDP WCA. -#endif mov pc, lr .size __arm6_setup, . - __arm6_setup .type __arm7_setup, #function __arm7_setup: mov r0, #0 mcr p15, 0, r0, c7, c0 @ flush caches on v3 -#ifdef CONFIG_MMU mcr p15, 0, r0, c5, c0 @ flush TLBs on v3 mcr p15, 0, r0, c3, c0 @ load domain access register mov r0, #0x7d @ . ..RS BLDP WCAM orr r0, r0, #0x100 @ . ..01 0111 1101 -#else - mov r0, #0x7c @ . ..RS BLDP WCA. -#endif mov pc, lr .size __arm7_setup, . - __arm7_setup @@ -355,10 +339,6 @@ __arm6_proc_info: .long 0x41560600 .long 0xfffffff0 .long 0x00000c1e - .long PMD_TYPE_SECT | \ - PMD_BIT4 | \ - PMD_SECT_AP_WRITE | \ - PMD_SECT_AP_READ b __arm6_setup .long cpu_arch_name .long cpu_elf_name @@ -375,10 +355,6 @@ __arm610_proc_info: .long 0x41560610 .long 0xfffffff0 .long 0x00000c1e - .long PMD_TYPE_SECT | \ - PMD_BIT4 | \ - PMD_SECT_AP_WRITE | \ - PMD_SECT_AP_READ b __arm6_setup .long cpu_arch_name .long cpu_elf_name @@ -395,10 +371,6 @@ __arm7_proc_info: .long 0x41007000 .long 0xffffff00 .long 0x00000c1e - .long PMD_TYPE_SECT | \ - PMD_BIT4 | \ - PMD_SECT_AP_WRITE | \ - PMD_SECT_AP_READ b __arm7_setup .long cpu_arch_name .long cpu_elf_name @@ -420,10 +392,6 @@ __arm710_proc_info: PMD_BIT4 | \ PMD_SECT_AP_WRITE | \ PMD_SECT_AP_READ - .long PMD_TYPE_SECT | \ - PMD_BIT4 | \ - PMD_SECT_AP_WRITE | \ - PMD_SECT_AP_READ b __arm7_setup .long cpu_arch_name .long cpu_elf_name diff --git a/arch/arm/mm/proc-arm720.S b/arch/arm/mm/proc-arm720.S index c2f0705bf..a13e0184d 100644 --- a/arch/arm/mm/proc-arm720.S +++ b/arch/arm/mm/proc-arm720.S @@ -4,7 +4,6 @@ * Copyright (C) 2000 Steve Hill (sjhill@cotw.com) * Rob Scott (rscott@mtrob.fdns.net) * Copyright (C) 2000 ARM Limited, Deep Blue Solutions Ltd. - * hacked for non-paged-MM by 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 as published by @@ -30,18 +29,15 @@ * out of 'proc-arm6,7.S' per RMK discussion * 07-25-2000 SJH Added idle function. * 08-25-2000 DBS Updated for integration of ARM Ltd version. - * 04-20-2004 HSC modified for non-paged memory management mode. */ #include #include #include #include -#include #include #include #include - -#include "proc-macros.S" +#include /* * Function: arm720_proc_init (void) @@ -79,12 +75,10 @@ ENTRY(cpu_arm720_do_idle) * the new. */ ENTRY(cpu_arm720_switch_mm) -#ifdef CONFIG_MMU mov r1, #0 mcr p15, 0, r1, c7, c7, 0 @ invalidate cache mcr p15, 0, r0, c2, c0, 0 @ update page table ptr mcr p15, 0, r1, c8, c7, 0 @ flush TLB (v4) -#endif mov pc, lr /* @@ -95,7 +89,6 @@ ENTRY(cpu_arm720_switch_mm) */ .align 5 ENTRY(cpu_arm720_set_pte) -#ifdef CONFIG_MMU str r1, [r0], #-2048 @ linux version eor r1, r1, #L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_WRITE | L_PTE_DIRTY @@ -114,7 +107,6 @@ ENTRY(cpu_arm720_set_pte) movne r2, #0 str r2, [r0] @ hardware version -#endif mov pc, lr /* @@ -125,9 +117,7 @@ ENTRY(cpu_arm720_set_pte) ENTRY(cpu_arm720_reset) mov ip, #0 mcr p15, 0, ip, c7, c7, 0 @ invalidate cache -#ifdef CONFIG_MMU mcr p15, 0, ip, c8, c7, 0 @ flush TLB (v4) -#endif mrc p15, 0, ip, c1, c0, 0 @ get ctrl register bic ip, ip, #0x000f @ ............wcam bic ip, ip, #0x2100 @ ..v....s........ @@ -140,9 +130,7 @@ ENTRY(cpu_arm720_reset) __arm710_setup: mov r0, #0 mcr p15, 0, r0, c7, c7, 0 @ invalidate caches -#ifdef CONFIG_MMU mcr p15, 0, r0, c8, c7, 0 @ flush TLB (v4) -#endif mrc p15, 0, r0, c1, c0 @ get control register ldr r5, arm710_cr1_clear bic r0, r0, r5 @@ -168,14 +156,12 @@ arm710_cr1_set: __arm720_setup: mov r0, #0 mcr p15, 0, r0, c7, c7, 0 @ invalidate caches -#ifdef CONFIG_MMU mcr p15, 0, r0, c8, c7, 0 @ flush TLB (v4) -#endif - adr r5, arm720_crval - ldmia r5, {r5, r6} mrc p15, 0, r0, c1, c0 @ get control register + ldr r5, arm720_cr1_clear bic r0, r0, r5 - orr r0, r0, r6 + ldr r5, arm720_cr1_set + orr r0, r0, r5 mov pc, lr @ __ret (head.S) .size __arm720_setup, . - __arm720_setup @@ -185,9 +171,12 @@ __arm720_setup: * ..1. 1001 ..11 1101 * */ - .type arm720_crval, #object -arm720_crval: - crval clear=0x00002f3f, mmuset=0x0000213d, ucset=0x00000130 + .type arm720_cr1_clear, #object + .type arm720_cr1_set, #object +arm720_cr1_clear: + .word 0x2f3f +arm720_cr1_set: + .word 0x213d __INITDATA @@ -245,10 +234,6 @@ __arm710_proc_info: PMD_BIT4 | \ PMD_SECT_AP_WRITE | \ PMD_SECT_AP_READ - .long PMD_TYPE_SECT | \ - PMD_BIT4 | \ - PMD_SECT_AP_WRITE | \ - PMD_SECT_AP_READ b __arm710_setup @ cpu_flush .long cpu_arch_name @ arch_name .long cpu_elf_name @ elf_name @@ -270,10 +255,6 @@ __arm720_proc_info: PMD_BIT4 | \ PMD_SECT_AP_WRITE | \ PMD_SECT_AP_READ - .long PMD_TYPE_SECT | \ - PMD_BIT4 | \ - PMD_SECT_AP_WRITE | \ - PMD_SECT_AP_READ b __arm720_setup @ cpu_flush .long cpu_arch_name @ arch_name .long cpu_elf_name @ elf_name diff --git a/arch/arm/mm/proc-arm920.S b/arch/arm/mm/proc-arm920.S index 4adb46b3a..d16513899 100644 --- a/arch/arm/mm/proc-arm920.S +++ b/arch/arm/mm/proc-arm920.S @@ -3,7 +3,6 @@ * * Copyright (C) 1999,2000 ARM Limited * Copyright (C) 2000 Deep Blue Solutions Ltd. - * hacked for non-paged-MM by Hyok S. Choi, 2003. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -26,11 +25,12 @@ * CONFIG_CPU_ARM920_CPU_IDLE -> nohlt */ #include +#include #include #include -#include #include #include +#include #include #include #include "proc-macros.S" @@ -97,9 +97,7 @@ ENTRY(cpu_arm920_reset) mov ip, #0 mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches mcr p15, 0, ip, c7, c10, 4 @ drain WB -#ifdef CONFIG_MMU mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs -#endif mrc p15, 0, ip, c1, c0, 0 @ ctrl register bic ip, ip, #0x000f @ ............wcam bic ip, ip, #0x1100 @ ...i...s........ @@ -319,7 +317,6 @@ ENTRY(cpu_arm920_dcache_clean_area) */ .align 5 ENTRY(cpu_arm920_switch_mm) -#ifdef CONFIG_MMU mov ip, #0 #ifdef CONFIG_CPU_DCACHE_WRITETHROUGH mcr p15, 0, ip, c7, c6, 0 @ invalidate D cache @@ -340,7 +337,6 @@ ENTRY(cpu_arm920_switch_mm) mcr p15, 0, ip, c7, c10, 4 @ drain WB mcr p15, 0, r0, c2, c0, 0 @ load page table pointer mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs -#endif mov pc, lr /* @@ -350,7 +346,6 @@ ENTRY(cpu_arm920_switch_mm) */ .align 5 ENTRY(cpu_arm920_set_pte) -#ifdef CONFIG_MMU str r1, [r0], #-2048 @ linux version eor r1, r1, #L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_WRITE | L_PTE_DIRTY @@ -377,7 +372,6 @@ ENTRY(cpu_arm920_set_pte) mov r0, r0 mcr p15, 0, r0, c7, c10, 1 @ clean D entry mcr p15, 0, r0, c7, c10, 4 @ drain WB -#endif /* CONFIG_MMU */ mov pc, lr __INIT @@ -387,14 +381,12 @@ __arm920_setup: mov r0, #0 mcr p15, 0, r0, c7, c7 @ invalidate I,D caches on v4 mcr p15, 0, r0, c7, c10, 4 @ drain write buffer on v4 -#ifdef CONFIG_MMU mcr p15, 0, r0, c8, c7 @ invalidate I,D TLBs on v4 -#endif - adr r5, arm920_crval - ldmia r5, {r5, r6} mrc p15, 0, r0, c1, c0 @ get control register v4 + ldr r5, arm920_cr1_clear bic r0, r0, r5 - orr r0, r0, r6 + ldr r5, arm920_cr1_set + orr r0, r0, r5 mov pc, lr .size __arm920_setup, . - __arm920_setup @@ -404,9 +396,12 @@ __arm920_setup: * ..11 0001 ..11 0101 * */ - .type arm920_crval, #object -arm920_crval: - crval clear=0x00003f3f, mmuset=0x00003135, ucset=0x00001130 + .type arm920_cr1_clear, #object + .type arm920_cr1_set, #object +arm920_cr1_clear: + .word 0x3f3f +arm920_cr1_set: + .word 0x3135 __INITDATA @@ -440,7 +435,19 @@ cpu_elf_name: .type cpu_arm920_name, #object cpu_arm920_name: - .asciz "ARM920T" + .ascii "ARM920T" +#ifndef CONFIG_CPU_ICACHE_DISABLE + .ascii "i" +#endif +#ifndef CONFIG_CPU_DCACHE_DISABLE + .ascii "d" +#ifdef CONFIG_CPU_DCACHE_WRITETHROUGH + .ascii "(wt)" +#else + .ascii "(wb)" +#endif +#endif + .ascii "\0" .size cpu_arm920_name, . - cpu_arm920_name .align @@ -457,10 +464,6 @@ __arm920_proc_info: PMD_BIT4 | \ PMD_SECT_AP_WRITE | \ PMD_SECT_AP_READ - .long PMD_TYPE_SECT | \ - PMD_BIT4 | \ - PMD_SECT_AP_WRITE | \ - PMD_SECT_AP_READ b __arm920_setup .long cpu_arch_name .long cpu_elf_name diff --git a/arch/arm/mm/proc-arm922.S b/arch/arm/mm/proc-arm922.S index 571f082f0..23b8ed97f 100644 --- a/arch/arm/mm/proc-arm922.S +++ b/arch/arm/mm/proc-arm922.S @@ -4,7 +4,6 @@ * Copyright (C) 1999,2000 ARM Limited * Copyright (C) 2000 Deep Blue Solutions Ltd. * Copyright (C) 2001 Altera Corporation - * hacked for non-paged-MM by Hyok S. Choi, 2003. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -27,11 +26,12 @@ * CONFIG_CPU_ARM922_CPU_IDLE -> nohlt */ #include +#include #include #include -#include #include #include +#include #include #include #include "proc-macros.S" @@ -99,9 +99,7 @@ ENTRY(cpu_arm922_reset) mov ip, #0 mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches mcr p15, 0, ip, c7, c10, 4 @ drain WB -#ifdef CONFIG_MMU mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs -#endif mrc p15, 0, ip, c1, c0, 0 @ ctrl register bic ip, ip, #0x000f @ ............wcam bic ip, ip, #0x1100 @ ...i...s........ @@ -323,7 +321,6 @@ ENTRY(cpu_arm922_dcache_clean_area) */ .align 5 ENTRY(cpu_arm922_switch_mm) -#ifdef CONFIG_MMU mov ip, #0 #ifdef CONFIG_CPU_DCACHE_WRITETHROUGH mcr p15, 0, ip, c7, c6, 0 @ invalidate D cache @@ -344,7 +341,6 @@ ENTRY(cpu_arm922_switch_mm) mcr p15, 0, ip, c7, c10, 4 @ drain WB mcr p15, 0, r0, c2, c0, 0 @ load page table pointer mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs -#endif mov pc, lr /* @@ -354,7 +350,6 @@ ENTRY(cpu_arm922_switch_mm) */ .align 5 ENTRY(cpu_arm922_set_pte) -#ifdef CONFIG_MMU str r1, [r0], #-2048 @ linux version eor r1, r1, #L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_WRITE | L_PTE_DIRTY @@ -381,7 +376,6 @@ ENTRY(cpu_arm922_set_pte) mov r0, r0 mcr p15, 0, r0, c7, c10, 1 @ clean D entry mcr p15, 0, r0, c7, c10, 4 @ drain WB -#endif /* CONFIG_MMU */ mov pc, lr __INIT @@ -391,14 +385,12 @@ __arm922_setup: mov r0, #0 mcr p15, 0, r0, c7, c7 @ invalidate I,D caches on v4 mcr p15, 0, r0, c7, c10, 4 @ drain write buffer on v4 -#ifdef CONFIG_MMU mcr p15, 0, r0, c8, c7 @ invalidate I,D TLBs on v4 -#endif - adr r5, arm922_crval - ldmia r5, {r5, r6} mrc p15, 0, r0, c1, c0 @ get control register v4 + ldr r5, arm922_cr1_clear bic r0, r0, r5 - orr r0, r0, r6 + ldr r5, arm922_cr1_set + orr r0, r0, r5 mov pc, lr .size __arm922_setup, . - __arm922_setup @@ -408,9 +400,12 @@ __arm922_setup: * ..11 0001 ..11 0101 * */ - .type arm922_crval, #object -arm922_crval: - crval clear=0x00003f3f, mmuset=0x00003135, ucset=0x00001130 + .type arm922_cr1_clear, #object + .type arm922_cr1_set, #object +arm922_cr1_clear: + .word 0x3f3f +arm922_cr1_set: + .word 0x3135 __INITDATA @@ -444,7 +439,19 @@ cpu_elf_name: .type cpu_arm922_name, #object cpu_arm922_name: - .asciz "ARM922T" + .ascii "ARM922T" +#ifndef CONFIG_CPU_ICACHE_DISABLE + .ascii "i" +#endif +#ifndef CONFIG_CPU_DCACHE_DISABLE + .ascii "d" +#ifdef CONFIG_CPU_DCACHE_WRITETHROUGH + .ascii "(wt)" +#else + .ascii "(wb)" +#endif +#endif + .ascii "\0" .size cpu_arm922_name, . - cpu_arm922_name .align @@ -461,10 +468,6 @@ __arm922_proc_info: PMD_BIT4 | \ PMD_SECT_AP_WRITE | \ PMD_SECT_AP_READ - .long PMD_TYPE_SECT | \ - PMD_BIT4 | \ - PMD_SECT_AP_WRITE | \ - PMD_SECT_AP_READ b __arm922_setup .long cpu_arch_name .long cpu_elf_name diff --git a/arch/arm/mm/proc-arm925.S b/arch/arm/mm/proc-arm925.S index 8d9a9f93b..ee95c52db 100644 --- a/arch/arm/mm/proc-arm925.S +++ b/arch/arm/mm/proc-arm925.S @@ -9,8 +9,6 @@ * Update for Linux-2.6 and cache flush improvements * Copyright (C) 2004 Nokia Corporation by Tony Lindgren * - * hacked for non-paged-MM by 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 as published by * the Free Software Foundation; either version 2 of the License, or @@ -50,11 +48,12 @@ */ #include +#include #include #include -#include #include #include +#include #include #include #include "proc-macros.S" @@ -123,9 +122,7 @@ ENTRY(cpu_arm925_reset) mov ip, #0 mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches mcr p15, 0, ip, c7, c10, 4 @ drain WB -#ifdef CONFIG_MMU mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs -#endif mrc p15, 0, ip, c1, c0, 0 @ ctrl register bic ip, ip, #0x000f @ ............wcam bic ip, ip, #0x1100 @ ...i...s........ @@ -372,7 +369,6 @@ ENTRY(cpu_arm925_dcache_clean_area) */ .align 5 ENTRY(cpu_arm925_switch_mm) -#ifdef CONFIG_MMU mov ip, #0 #ifdef CONFIG_CPU_DCACHE_WRITETHROUGH mcr p15, 0, ip, c7, c6, 0 @ invalidate D cache @@ -387,7 +383,6 @@ ENTRY(cpu_arm925_switch_mm) mcr p15, 0, ip, c7, c10, 4 @ drain WB mcr p15, 0, r0, c2, c0, 0 @ load page table pointer mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs -#endif mov pc, lr /* @@ -397,7 +392,6 @@ ENTRY(cpu_arm925_switch_mm) */ .align 5 ENTRY(cpu_arm925_set_pte) -#ifdef CONFIG_MMU str r1, [r0], #-2048 @ linux version eor r1, r1, #L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_WRITE | L_PTE_DIRTY @@ -426,7 +420,6 @@ ENTRY(cpu_arm925_set_pte) mcr p15, 0, r0, c7, c10, 1 @ clean D entry #endif mcr p15, 0, r0, c7, c10, 4 @ drain WB -#endif /* CONFIG_MMU */ mov pc, lr __INIT @@ -445,20 +438,18 @@ __arm925_setup: mov r0, #0 mcr p15, 0, r0, c7, c7 @ invalidate I,D caches on v4 mcr p15, 0, r0, c7, c10, 4 @ drain write buffer on v4 -#ifdef CONFIG_MMU mcr p15, 0, r0, c8, c7 @ invalidate I,D TLBs on v4 -#endif #ifdef CONFIG_CPU_DCACHE_WRITETHROUGH mov r0, #4 @ disable write-back on caches explicitly mcr p15, 7, r0, c15, c0, 0 #endif - adr r5, arm925_crval - ldmia r5, {r5, r6} mrc p15, 0, r0, c1, c0 @ get control register v4 + ldr r5, arm925_cr1_clear bic r0, r0, r5 - orr r0, r0, r6 + ldr r5, arm925_cr1_set + orr r0, r0, r5 #ifdef CONFIG_CPU_CACHE_ROUND_ROBIN orr r0, r0, #0x4000 @ .1.. .... .... .... #endif @@ -471,9 +462,12 @@ __arm925_setup: * .011 0001 ..11 1101 * */ - .type arm925_crval, #object -arm925_crval: - crval clear=0x00007f3f, mmuset=0x0000313d, ucset=0x00001130 + .type arm925_cr1_clear, #object + .type arm925_cr1_set, #object +arm925_cr1_clear: + .word 0x7f3f +arm925_cr1_set: + .word 0x313d __INITDATA @@ -507,7 +501,22 @@ cpu_elf_name: .type cpu_arm925_name, #object cpu_arm925_name: - .asciz "ARM925T" + .ascii "ARM925T" +#ifndef CONFIG_CPU_ICACHE_DISABLE + .ascii "i" +#endif +#ifndef CONFIG_CPU_DCACHE_DISABLE + .ascii "d" +#ifdef CONFIG_CPU_DCACHE_WRITETHROUGH + .ascii "(wt)" +#else + .ascii "(wb)" +#endif +#ifdef CONFIG_CPU_CACHE_ROUND_ROBIN + .ascii "RR" +#endif +#endif + .ascii "\0" .size cpu_arm925_name, . - cpu_arm925_name .align @@ -518,10 +527,6 @@ cpu_arm925_name: __arm925_proc_info: .long 0x54029250 .long 0xfffffff0 - .long PMD_TYPE_SECT | \ - PMD_BIT4 | \ - PMD_SECT_AP_WRITE | \ - PMD_SECT_AP_READ .long PMD_TYPE_SECT | \ PMD_BIT4 | \ PMD_SECT_AP_WRITE | \ @@ -541,10 +546,6 @@ __arm925_proc_info: __arm915_proc_info: .long 0x54029150 .long 0xfffffff0 - .long PMD_TYPE_SECT | \ - PMD_BIT4 | \ - PMD_SECT_AP_WRITE | \ - PMD_SECT_AP_READ .long PMD_TYPE_SECT | \ PMD_BIT4 | \ PMD_SECT_AP_WRITE | \ diff --git a/arch/arm/mm/proc-arm926.S b/arch/arm/mm/proc-arm926.S index 44a7a652d..7d042dc20 100644 --- a/arch/arm/mm/proc-arm926.S +++ b/arch/arm/mm/proc-arm926.S @@ -3,7 +3,6 @@ * * Copyright (C) 1999-2001 ARM Limited * Copyright (C) 2000 Deep Blue Solutions Ltd. - * hacked for non-paged-MM by Hyok S. Choi, 2003. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -26,11 +25,12 @@ * CONFIG_CPU_ARM926_CPU_IDLE -> nohlt */ #include +#include #include #include -#include #include #include +#include #include #include #include "proc-macros.S" @@ -85,9 +85,7 @@ ENTRY(cpu_arm926_reset) mov ip, #0 mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches mcr p15, 0, ip, c7, c10, 4 @ drain WB -#ifdef CONFIG_MMU mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs -#endif mrc p15, 0, ip, c1, c0, 0 @ ctrl register bic ip, ip, #0x000f @ ............wcam bic ip, ip, #0x1100 @ ...i...s........ @@ -331,7 +329,6 @@ ENTRY(cpu_arm926_dcache_clean_area) */ .align 5 ENTRY(cpu_arm926_switch_mm) -#ifdef CONFIG_MMU mov ip, #0 #ifdef CONFIG_CPU_DCACHE_WRITETHROUGH mcr p15, 0, ip, c7, c6, 0 @ invalidate D cache @@ -344,7 +341,6 @@ ENTRY(cpu_arm926_switch_mm) mcr p15, 0, ip, c7, c10, 4 @ drain WB mcr p15, 0, r0, c2, c0, 0 @ load page table pointer mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs -#endif mov pc, lr /* @@ -354,7 +350,6 @@ ENTRY(cpu_arm926_switch_mm) */ .align 5 ENTRY(cpu_arm926_set_pte) -#ifdef CONFIG_MMU str r1, [r0], #-2048 @ linux version eor r1, r1, #L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_WRITE | L_PTE_DIRTY @@ -383,7 +378,6 @@ ENTRY(cpu_arm926_set_pte) mcr p15, 0, r0, c7, c10, 1 @ clean D entry #endif mcr p15, 0, r0, c7, c10, 4 @ drain WB -#endif mov pc, lr __INIT @@ -393,9 +387,7 @@ __arm926_setup: mov r0, #0 mcr p15, 0, r0, c7, c7 @ invalidate I,D caches on v4 mcr p15, 0, r0, c7, c10, 4 @ drain write buffer on v4 -#ifdef CONFIG_MMU mcr p15, 0, r0, c8, c7 @ invalidate I,D TLBs on v4 -#endif #ifdef CONFIG_CPU_DCACHE_WRITETHROUGH @@ -403,11 +395,11 @@ __arm926_setup: mcr p15, 7, r0, c15, c0, 0 #endif - adr r5, arm926_crval - ldmia r5, {r5, r6} mrc p15, 0, r0, c1, c0 @ get control register v4 + ldr r5, arm926_cr1_clear bic r0, r0, r5 - orr r0, r0, r6 + ldr r5, arm926_cr1_set + orr r0, r0, r5 #ifdef CONFIG_CPU_CACHE_ROUND_ROBIN orr r0, r0, #0x4000 @ .1.. .... .... .... #endif @@ -420,9 +412,12 @@ __arm926_setup: * .011 0001 ..11 0101 * */ - .type arm926_crval, #object -arm926_crval: - crval clear=0x00007f3f, mmuset=0x00003135, ucset=0x00001134 + .type arm926_cr1_clear, #object + .type arm926_cr1_set, #object +arm926_cr1_clear: + .word 0x7f3f +arm926_cr1_set: + .word 0x3135 __INITDATA @@ -456,7 +451,22 @@ cpu_elf_name: .type cpu_arm926_name, #object cpu_arm926_name: - .asciz "ARM926EJ-S" + .ascii "ARM926EJ-S" +#ifndef CONFIG_CPU_ICACHE_DISABLE + .ascii "i" +#endif +#ifndef CONFIG_CPU_DCACHE_DISABLE + .ascii "d" +#ifdef CONFIG_CPU_DCACHE_WRITETHROUGH + .ascii "(wt)" +#else + .ascii "(wb)" +#endif +#ifdef CONFIG_CPU_CACHE_ROUND_ROBIN + .ascii "RR" +#endif +#endif + .ascii "\0" .size cpu_arm926_name, . - cpu_arm926_name .align @@ -473,14 +483,10 @@ __arm926_proc_info: PMD_BIT4 | \ PMD_SECT_AP_WRITE | \ PMD_SECT_AP_READ - .long PMD_TYPE_SECT | \ - PMD_BIT4 | \ - PMD_SECT_AP_WRITE | \ - PMD_SECT_AP_READ b __arm926_setup .long cpu_arch_name .long cpu_elf_name - .long HWCAP_SWP|HWCAP_HALF|HWCAP_THUMB|HWCAP_FAST_MULT|HWCAP_VFP|HWCAP_EDSP|HWCAP_JAVA + .long HWCAP_SWP|HWCAP_HALF|HWCAP_THUMB|HWCAP_FAST_MULT|HWCAP_EDSP|HWCAP_JAVA .long cpu_arm926_name .long arm926_processor_functions .long v4wbi_tlb_fns diff --git a/arch/arm/mm/proc-macros.S b/arch/arm/mm/proc-macros.S index 9e2c89eb2..7cfc2604a 100644 --- a/arch/arm/mm/proc-macros.S +++ b/arch/arm/mm/proc-macros.S @@ -49,13 +49,3 @@ .macro asid, rd, rn and \rd, \rn, #255 .endm - - .macro crval, clear, mmuset, ucset -#ifdef CONFIG_MMU - .word \clear - .word \mmuset -#else - .word \clear - .word \ucset -#endif - .endm diff --git a/arch/arm/mm/proc-sa110.S b/arch/arm/mm/proc-sa110.S index c878064e9..bd330c407 100644 --- a/arch/arm/mm/proc-sa110.S +++ b/arch/arm/mm/proc-sa110.S @@ -2,7 +2,6 @@ * linux/arch/arm/mm/proc-sa110.S * * Copyright (C) 1997-2002 Russell King - * hacked for non-paged-MM by Hyok S. Choi, 2003. * * 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 @@ -19,17 +18,29 @@ #include #include #include -#include #include #include -#include "proc-macros.S" - /* * the cache line size of the I and D cache */ #define DCACHELINESIZE 32 - +#define FLUSH_OFFSET 32768 + + .macro flush_110_dcache rd, ra, re + ldr \rd, =flush_base + ldr \ra, [\rd] + eor \ra, \ra, #FLUSH_OFFSET + str \ra, [\rd] + add \re, \ra, #16384 @ only necessary for 16k +1001: ldr \rd, [\ra], #DCACHELINESIZE + teq \re, \ra + bne 1001b + .endm + + .data +flush_base: + .long FLUSH_BASE .text /* @@ -70,9 +81,7 @@ ENTRY(cpu_sa110_reset) mov ip, #0 mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches mcr p15, 0, ip, c7, c10, 4 @ drain WB -#ifdef CONFIG_MMU mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs -#endif mrc p15, 0, ip, c1, c0, 0 @ ctrl register bic ip, ip, #0x000f @ ............wcam bic ip, ip, #0x1100 @ ...i...s........ @@ -135,15 +144,13 @@ ENTRY(cpu_sa110_dcache_clean_area) */ .align 5 ENTRY(cpu_sa110_switch_mm) -#ifdef CONFIG_MMU - str lr, [sp, #-4]! - bl v4wb_flush_kern_cache_all @ clears IP + flush_110_dcache r3, ip, r1 + mov r1, #0 + mcr p15, 0, r1, c7, c5, 0 @ invalidate I cache + mcr p15, 0, r1, c7, c10, 4 @ drain WB mcr p15, 0, r0, c2, c0, 0 @ load page table pointer - mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs - ldr pc, [sp], #4 -#else + mcr p15, 0, r1, c8, c7, 0 @ invalidate I & D TLBs mov pc, lr -#endif /* * cpu_sa110_set_pte(ptep, pte) @@ -152,7 +159,6 @@ ENTRY(cpu_sa110_switch_mm) */ .align 5 ENTRY(cpu_sa110_set_pte) -#ifdef CONFIG_MMU str r1, [r0], #-2048 @ linux version eor r1, r1, #L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_WRITE | L_PTE_DIRTY @@ -174,7 +180,6 @@ ENTRY(cpu_sa110_set_pte) mov r0, r0 mcr p15, 0, r0, c7, c10, 1 @ clean D entry mcr p15, 0, r0, c7, c10, 4 @ drain WB -#endif mov pc, lr __INIT @@ -184,15 +189,12 @@ __sa110_setup: mov r10, #0 mcr p15, 0, r10, c7, c7 @ invalidate I,D caches on v4 mcr p15, 0, r10, c7, c10, 4 @ drain write buffer on v4 -#ifdef CONFIG_MMU mcr p15, 0, r10, c8, c7 @ invalidate I,D TLBs on v4 -#endif - - adr r5, sa110_crval - ldmia r5, {r5, r6} mrc p15, 0, r0, c1, c0 @ get control register v4 + ldr r5, sa110_cr1_clear bic r0, r0, r5 - orr r0, r0, r6 + ldr r5, sa110_cr1_set + orr r0, r0, r5 mov pc, lr .size __sa110_setup, . - __sa110_setup @@ -202,9 +204,12 @@ __sa110_setup: * ..01 0001 ..11 1101 * */ - .type sa110_crval, #object -sa110_crval: - crval clear=0x00003f3f, mmuset=0x0000113d, ucset=0x00001130 + .type sa110_cr1_clear, #object + .type sa110_cr1_set, #object +sa110_cr1_clear: + .word 0x3f3f +sa110_cr1_set: + .word 0x113d __INITDATA @@ -255,9 +260,6 @@ __sa110_proc_info: PMD_SECT_CACHEABLE | \ PMD_SECT_AP_WRITE | \ PMD_SECT_AP_READ - .long PMD_TYPE_SECT | \ - PMD_SECT_AP_WRITE | \ - PMD_SECT_AP_READ b __sa110_setup .long cpu_arch_name .long cpu_elf_name diff --git a/arch/arm/mm/proc-sa1100.S b/arch/arm/mm/proc-sa1100.S index b23b66a61..91b89124c 100644 --- a/arch/arm/mm/proc-sa1100.S +++ b/arch/arm/mm/proc-sa1100.S @@ -2,7 +2,6 @@ * linux/arch/arm/mm/proc-sa1100.S * * Copyright (C) 1997-2002 Russell King - * hacked for non-paged-MM by Hyok S. Choi, 2003. * * 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 @@ -24,15 +23,36 @@ #include #include #include -#include #include -#include "proc-macros.S" - /* * the cache line size of the I and D cache */ #define DCACHELINESIZE 32 +#define FLUSH_OFFSET 32768 + + .macro flush_1100_dcache rd, ra, re + ldr \rd, =flush_base + ldr \ra, [\rd] + eor \ra, \ra, #FLUSH_OFFSET + str \ra, [\rd] + add \re, \ra, #8192 @ only necessary for 8k +1001: ldr \rd, [\ra], #DCACHELINESIZE + teq \re, \ra + bne 1001b +#ifdef FLUSH_BASE_MINICACHE + add \ra, \ra, #FLUSH_BASE_MINICACHE - FLUSH_BASE + add \re, \ra, #512 @ only 512 bytes +1002: ldr \rd, [\ra], #DCACHELINESIZE + teq \re, \ra + bne 1002b +#endif + .endm + + .data +flush_base: + .long FLUSH_BASE + .text __INIT @@ -58,8 +78,9 @@ ENTRY(cpu_sa1100_proc_fin) stmfd sp!, {lr} mov ip, #PSR_F_BIT | PSR_I_BIT | SVC_MODE msr cpsr_c, ip - bl v4wb_flush_kern_cache_all - mcr p15, 0, ip, c15, c2, 2 @ Disable clock switching + flush_1100_dcache r0, r1, r2 @ clean caches + mov r0, #0 + mcr p15, 0, r0, c15, c2, 2 @ Disable clock switching mrc p15, 0, r0, c1, c0, 0 @ ctrl register bic r0, r0, #0x1000 @ ...i............ bic r0, r0, #0x000e @ ............wca. @@ -80,9 +101,7 @@ ENTRY(cpu_sa1100_reset) mov ip, #0 mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches mcr p15, 0, ip, c7, c10, 4 @ drain WB -#ifdef CONFIG_MMU mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs -#endif mrc p15, 0, ip, c1, c0, 0 @ ctrl register bic ip, ip, #0x000f @ ............wcam bic ip, ip, #0x1100 @ ...i...s........ @@ -147,16 +166,14 @@ ENTRY(cpu_sa1100_dcache_clean_area) */ .align 5 ENTRY(cpu_sa1100_switch_mm) -#ifdef CONFIG_MMU - str lr, [sp, #-4]! - bl v4wb_flush_kern_cache_all @ clears IP + flush_1100_dcache r3, ip, r1 + mov ip, #0 + mcr p15, 0, ip, c7, c5, 0 @ invalidate I cache mcr p15, 0, ip, c9, c0, 0 @ invalidate RB + mcr p15, 0, ip, c7, c10, 4 @ drain WB mcr p15, 0, r0, c2, c0, 0 @ load page table pointer mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs - ldr pc, [sp], #4 -#else mov pc, lr -#endif /* * cpu_sa1100_set_pte(ptep, pte) @@ -165,7 +182,6 @@ ENTRY(cpu_sa1100_switch_mm) */ .align 5 ENTRY(cpu_sa1100_set_pte) -#ifdef CONFIG_MMU str r1, [r0], #-2048 @ linux version eor r1, r1, #L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_WRITE | L_PTE_DIRTY @@ -187,7 +203,6 @@ ENTRY(cpu_sa1100_set_pte) mov r0, r0 mcr p15, 0, r0, c7, c10, 1 @ clean D entry mcr p15, 0, r0, c7, c10, 4 @ drain WB -#endif mov pc, lr __INIT @@ -197,14 +212,12 @@ __sa1100_setup: mov r0, #0 mcr p15, 0, r0, c7, c7 @ invalidate I,D caches on v4 mcr p15, 0, r0, c7, c10, 4 @ drain write buffer on v4 -#ifdef CONFIG_MMU mcr p15, 0, r0, c8, c7 @ invalidate I,D TLBs on v4 -#endif - adr r5, sa1100_crval - ldmia r5, {r5, r6} mrc p15, 0, r0, c1, c0 @ get control register v4 + ldr r5, sa1100_cr1_clear bic r0, r0, r5 - orr r0, r0, r6 + ldr r5, sa1100_cr1_set + orr r0, r0, r5 mov pc, lr .size __sa1100_setup, . - __sa1100_setup @@ -214,9 +227,12 @@ __sa1100_setup: * ..11 0001 ..11 1101 * */ - .type sa1100_crval, #object -sa1100_crval: - crval clear=0x00003f3f, mmuset=0x0000313d, ucset=0x00001130 + .type sa1100_cr1_clear, #object + .type sa1100_cr1_set, #object +sa1100_cr1_clear: + .word 0x3f3f +sa1100_cr1_set: + .word 0x313d __INITDATA @@ -275,9 +291,6 @@ __sa1100_proc_info: PMD_SECT_CACHEABLE | \ PMD_SECT_AP_WRITE | \ PMD_SECT_AP_READ - .long PMD_TYPE_SECT | \ - PMD_SECT_AP_WRITE | \ - PMD_SECT_AP_READ b __sa1100_setup .long cpu_arch_name .long cpu_elf_name @@ -298,9 +311,6 @@ __sa1110_proc_info: PMD_SECT_CACHEABLE | \ PMD_SECT_AP_WRITE | \ PMD_SECT_AP_READ - .long PMD_TYPE_SECT | \ - PMD_SECT_AP_WRITE | \ - PMD_SECT_AP_READ b __sa1100_setup .long cpu_arch_name .long cpu_elf_name diff --git a/arch/arm/mm/proc-syms.c b/arch/arm/mm/proc-syms.c index ab143557e..6c5f0fe57 100644 --- a/arch/arm/mm/proc-syms.c +++ b/arch/arm/mm/proc-syms.c @@ -13,7 +13,6 @@ #include #include #include -#include #ifndef MULTI_CPU EXPORT_SYMBOL(cpu_dcache_clean_area); @@ -31,13 +30,6 @@ EXPORT_SYMBOL(__cpuc_coherent_kern_range); EXPORT_SYMBOL(cpu_cache); #endif -#ifndef MULTI_USER -EXPORT_SYMBOL(__cpu_clear_user_page); -EXPORT_SYMBOL(__cpu_copy_user_page); -#else -EXPORT_SYMBOL(cpu_user); -#endif - /* * No module should need to touch the TLB (and currently * no modules do. We export this for "loadkernel" support diff --git a/arch/arm/mm/proc-v6.S b/arch/arm/mm/proc-v6.S index 6f72549f8..92f3ca31b 100644 --- a/arch/arm/mm/proc-v6.S +++ b/arch/arm/mm/proc-v6.S @@ -2,7 +2,6 @@ * linux/arch/arm/mm/proc-v6.S * * Copyright (C) 2001 Deep Blue Solutions Ltd. - * Modified by Catalin Marinas for noMMU 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 @@ -15,20 +14,43 @@ #include #include #include -#include #include #include "proc-macros.S" #define D_CACHE_LINE_SIZE 32 -#define TTB_C (1 << 0) -#define TTB_S (1 << 1) -#define TTB_IMP (1 << 2) -#define TTB_RGN_NC (0 << 3) -#define TTB_RGN_WBWA (1 << 3) -#define TTB_RGN_WT (2 << 3) -#define TTB_RGN_WB (3 << 3) + .macro cpsie, flags + .ifc \flags, f + .long 0xf1080040 + .exitm + .endif + .ifc \flags, i + .long 0xf1080080 + .exitm + .endif + .ifc \flags, if + .long 0xf10800c0 + .exitm + .endif + .err + .endm + + .macro cpsid, flags + .ifc \flags, f + .long 0xf10c0040 + .exitm + .endif + .ifc \flags, i + .long 0xf10c0080 + .exitm + .endif + .ifc \flags, if + .long 0xf10c00c0 + .exitm + .endif + .err + .endm ENTRY(cpu_v6_proc_init) mov pc, lr @@ -89,17 +111,15 @@ ENTRY(cpu_v6_dcache_clean_area) * - we are not using split page tables */ ENTRY(cpu_v6_switch_mm) -#ifdef CONFIG_MMU mov r2, #0 ldr r1, [r1, #MM_CONTEXT_ID] @ get mm->context.id #ifdef CONFIG_SMP - orr r0, r0, #TTB_RGN_WBWA|TTB_S @ mark PTWs shared, outer cacheable + orr r0, r0, #2 @ set shared pgtable #endif mcr p15, 0, r2, c7, c5, 6 @ flush BTAC/BTB mcr p15, 0, r2, c7, c10, 4 @ drain write buffer mcr p15, 0, r0, c2, c0, 0 @ set TTB 0 mcr p15, 0, r1, c13, c0, 1 @ set context ID -#endif mov pc, lr /* @@ -122,7 +142,6 @@ ENTRY(cpu_v6_switch_mm) * 1111 0 1 1 r/w r/w */ ENTRY(cpu_v6_set_pte) -#ifdef CONFIG_MMU str r1, [r0], #-2048 @ linux version bic r2, r1, #0x000003f0 @@ -141,15 +160,14 @@ ENTRY(cpu_v6_set_pte) tst r1, #L_PTE_YOUNG biceq r2, r2, #PTE_EXT_APX | PTE_EXT_AP_MASK - tst r1, #L_PTE_EXEC - orreq r2, r2, #PTE_EXT_XN +@ tst r1, #L_PTE_EXEC +@ orreq r2, r2, #PTE_EXT_XN tst r1, #L_PTE_PRESENT moveq r2, #0 str r2, [r0] mcr p15, 0, r0, c7, c10, 1 @ flush_pte -#endif mov pc, lr @@ -199,24 +217,22 @@ __v6_setup: mcr p15, 0, r0, c7, c5, 0 @ invalidate I cache mcr p15, 0, r0, c7, c15, 0 @ clean+invalidate cache mcr p15, 0, r0, c7, c10, 4 @ drain write buffer -#ifdef CONFIG_MMU mcr p15, 0, r0, c8, c7, 0 @ invalidate I + D TLBs mcr p15, 0, r0, c2, c0, 2 @ TTB control register #ifdef CONFIG_SMP - orr r4, r4, #TTB_RGN_WBWA|TTB_S @ mark PTWs shared, outer cacheable + orr r4, r4, #2 @ set shared pgtable #endif mcr p15, 0, r4, c2, c0, 1 @ load TTB1 -#endif /* CONFIG_MMU */ #ifdef CONFIG_VFP mrc p15, 0, r0, c1, c0, 2 orr r0, r0, #(0xf << 20) mcr p15, 0, r0, c1, c0, 2 @ Enable full access to VFP #endif - adr r5, v6_crval - ldmia r5, {r5, r6} mrc p15, 0, r0, c1, c0, 0 @ read control register + ldr r5, v6_cr1_clear @ get mask for bits to clear bic r0, r0, r5 @ clear bits them - orr r0, r0, r6 @ set them + ldr r5, v6_cr1_set @ get mask for bits to set + orr r0, r0, r5 @ set them mov pc, lr @ return to head.S:__ret /* @@ -225,9 +241,12 @@ __v6_setup: * rrrr rrrx xxx0 0101 xxxx xxxx x111 xxxx < forced * 0 110 0011 1.00 .111 1101 < we want */ - .type v6_crval, #object -v6_crval: - crval clear=0x01e0fb7f, mmuset=0x00c0387d, ucset=0x00c0187c + .type v6_cr1_clear, #object + .type v6_cr1_set, #object +v6_cr1_clear: + .word 0x01e0fb7f +v6_cr1_set: + .word 0x00c0387d .type v6_processor_functions, #object ENTRY(v6_processor_functions) @@ -266,10 +285,6 @@ __v6_proc_info: PMD_SECT_CACHEABLE | \ PMD_SECT_AP_WRITE | \ PMD_SECT_AP_READ - .long PMD_TYPE_SECT | \ - PMD_SECT_XN | \ - PMD_SECT_AP_WRITE | \ - PMD_SECT_AP_READ b __v6_setup .long cpu_arch_name .long cpu_elf_name diff --git a/arch/arm/mm/proc-xscale.S b/arch/arm/mm/proc-xscale.S index 3ca0c92e9..2d3823ec3 100644 --- a/arch/arm/mm/proc-xscale.S +++ b/arch/arm/mm/proc-xscale.S @@ -24,8 +24,8 @@ #include #include #include +#include #include -#include #include #include #include "proc-macros.S" @@ -138,23 +138,17 @@ ENTRY(cpu_xscale_proc_fin) * to what would be the reset vector. * * loc: location to jump to for soft reset - * - * Beware PXA270 erratum E7. */ .align 5 ENTRY(cpu_xscale_reset) mov r1, #PSR_F_BIT|PSR_I_BIT|SVC_MODE msr cpsr_c, r1 @ reset CPSR - mcr p15, 0, r1, c10, c4, 1 @ unlock I-TLB - mcr p15, 0, r1, c8, c5, 0 @ invalidate I-TLB mrc p15, 0, r1, c1, c0, 0 @ ctrl register bic r1, r1, #0x0086 @ ........B....CA. bic r1, r1, #0x3900 @ ..VIZ..S........ - sub pc, pc, #4 @ flush pipeline - @ *** cache line aligned *** mcr p15, 0, r1, c1, c0, 0 @ ctrl register - bic r1, r1, #0x0001 @ ...............M mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches & BTB + bic r1, r1, #0x0001 @ ...............M mcr p15, 0, r1, c1, c0, 0 @ ctrl register @ CAUTION: MMU turned off from this point. We count on the pipeline @ already containing those two last instructions to survive. @@ -481,12 +475,11 @@ __xscale_setup: orr r0, r0, #1 << 6 @ cp6 for IOP3xx and Bulverde orr r0, r0, #1 << 13 @ Its undefined whether this mcr p15, 0, r0, c15, c1, 0 @ affects USR or SVC modes - - adr r5, xscale_crval - ldmia r5, {r5, r6} mrc p15, 0, r0, c1, c0, 0 @ get control register + ldr r5, xscale_cr1_clear bic r0, r0, r5 - orr r0, r0, r6 + ldr r5, xscale_cr1_set + orr r0, r0, r5 mov pc, lr .size __xscale_setup, . - __xscale_setup @@ -496,9 +489,12 @@ __xscale_setup: * ..11 1.01 .... .101 * */ - .type xscale_crval, #object -xscale_crval: - crval clear=0x00003b07, mmuset=0x00003905, ucset=0x00001900 + .type xscale_cr1_clear, #object + .type xscale_cr1_set, #object +xscale_cr1_clear: + .word 0x3b07 +xscale_cr1_set: + .word 0x3905 __INITDATA @@ -536,11 +532,6 @@ cpu_80200_name: .asciz "XScale-80200" .size cpu_80200_name, . - cpu_80200_name - .type cpu_80219_name, #object -cpu_80219_name: - .asciz "XScale-80219" - .size cpu_80219_name, . - cpu_80219_name - .type cpu_8032x_name, #object cpu_8032x_name: .asciz "XScale-IOP8032x Family" @@ -604,9 +595,6 @@ __80200_proc_info: PMD_SECT_CACHEABLE | \ PMD_SECT_AP_WRITE | \ PMD_SECT_AP_READ - .long PMD_TYPE_SECT | \ - PMD_SECT_AP_WRITE | \ - PMD_SECT_AP_READ b __xscale_setup .long cpu_arch_name .long cpu_elf_name @@ -618,41 +606,15 @@ __80200_proc_info: .long xscale_cache_fns .size __80200_proc_info, . - __80200_proc_info - .type __80219_proc_info,#object -__80219_proc_info: - .long 0x69052e20 - .long 0xffffffe0 - .long PMD_TYPE_SECT | \ - PMD_SECT_BUFFERABLE | \ - PMD_SECT_CACHEABLE | \ - PMD_SECT_AP_WRITE | \ - PMD_SECT_AP_READ - .long PMD_TYPE_SECT | \ - PMD_SECT_AP_WRITE | \ - PMD_SECT_AP_READ - b __xscale_setup - .long cpu_arch_name - .long cpu_elf_name - .long HWCAP_SWP|HWCAP_HALF|HWCAP_THUMB|HWCAP_FAST_MULT|HWCAP_EDSP - .long cpu_80219_name - .long xscale_processor_functions - .long v4wbi_tlb_fns - .long xscale_mc_user_fns - .long xscale_cache_fns - .size __80219_proc_info, . - __80219_proc_info - .type __8032x_proc_info,#object __8032x_proc_info: .long 0x69052420 - .long 0xfffff7e0 + .long 0xfffff5e0 @ mask should accomodate IOP80219 also .long PMD_TYPE_SECT | \ PMD_SECT_BUFFERABLE | \ PMD_SECT_CACHEABLE | \ PMD_SECT_AP_WRITE | \ PMD_SECT_AP_READ - .long PMD_TYPE_SECT | \ - PMD_SECT_AP_WRITE | \ - PMD_SECT_AP_READ b __xscale_setup .long cpu_arch_name .long cpu_elf_name @@ -673,9 +635,6 @@ __8033x_proc_info: PMD_SECT_CACHEABLE | \ PMD_SECT_AP_WRITE | \ PMD_SECT_AP_READ - .long PMD_TYPE_SECT | \ - PMD_SECT_AP_WRITE | \ - PMD_SECT_AP_READ b __xscale_setup .long cpu_arch_name .long cpu_elf_name @@ -696,9 +655,6 @@ __pxa250_proc_info: PMD_SECT_CACHEABLE | \ PMD_SECT_AP_WRITE | \ PMD_SECT_AP_READ - .long PMD_TYPE_SECT | \ - PMD_SECT_AP_WRITE | \ - PMD_SECT_AP_READ b __xscale_setup .long cpu_arch_name .long cpu_elf_name @@ -719,9 +675,6 @@ __pxa210_proc_info: PMD_SECT_CACHEABLE | \ PMD_SECT_AP_WRITE | \ PMD_SECT_AP_READ - .long PMD_TYPE_SECT | \ - PMD_SECT_AP_WRITE | \ - PMD_SECT_AP_READ b __xscale_setup .long cpu_arch_name .long cpu_elf_name @@ -742,9 +695,6 @@ __ixp2400_proc_info: PMD_SECT_CACHEABLE | \ PMD_SECT_AP_WRITE | \ PMD_SECT_AP_READ - .long PMD_TYPE_SECT | \ - PMD_SECT_AP_WRITE | \ - PMD_SECT_AP_READ b __xscale_setup .long cpu_arch_name .long cpu_elf_name @@ -765,9 +715,6 @@ __ixp2800_proc_info: PMD_SECT_CACHEABLE | \ PMD_SECT_AP_WRITE | \ PMD_SECT_AP_READ - .long PMD_TYPE_SECT | \ - PMD_SECT_AP_WRITE | \ - PMD_SECT_AP_READ b __xscale_setup .long cpu_arch_name .long cpu_elf_name @@ -788,9 +735,6 @@ __ixp42x_proc_info: PMD_SECT_CACHEABLE | \ PMD_SECT_AP_WRITE | \ PMD_SECT_AP_READ - .long PMD_TYPE_SECT | \ - PMD_SECT_AP_WRITE | \ - PMD_SECT_AP_READ b __xscale_setup .long cpu_arch_name .long cpu_elf_name @@ -806,14 +750,7 @@ __ixp42x_proc_info: __ixp46x_proc_info: .long 0x69054200 .long 0xffffff00 - .long PMD_TYPE_SECT | \ - PMD_SECT_BUFFERABLE | \ - PMD_SECT_CACHEABLE | \ - PMD_SECT_AP_WRITE | \ - PMD_SECT_AP_READ - .long PMD_TYPE_SECT | \ - PMD_SECT_AP_WRITE | \ - PMD_SECT_AP_READ + .long 0x00000c0e b __xscale_setup .long cpu_arch_name .long cpu_elf_name @@ -834,9 +771,6 @@ __pxa255_proc_info: PMD_SECT_CACHEABLE | \ PMD_SECT_AP_WRITE | \ PMD_SECT_AP_READ - .long PMD_TYPE_SECT | \ - PMD_SECT_AP_WRITE | \ - PMD_SECT_AP_READ b __xscale_setup .long cpu_arch_name .long cpu_elf_name @@ -857,9 +791,6 @@ __pxa270_proc_info: PMD_SECT_CACHEABLE | \ PMD_SECT_AP_WRITE | \ PMD_SECT_AP_READ - .long PMD_TYPE_SECT | \ - PMD_SECT_AP_WRITE | \ - PMD_SECT_AP_READ b __xscale_setup .long cpu_arch_name .long cpu_elf_name diff --git a/arch/arm/nwfpe/entry26.S b/arch/arm/nwfpe/entry26.S index 3e6fb5d21..51940a96d 100644 --- a/arch/arm/nwfpe/entry26.S +++ b/arch/arm/nwfpe/entry26.S @@ -26,7 +26,7 @@ It is called from the kernel with code similar to this: mov fp, #0 - teqp pc, #PSR_I_BIT | SVC_MODE + teqp pc, #PSR_I_BIT | MODE_SVC ldr r4, .LC2 ldr pc, [r4] @ Call FP module USR entry point diff --git a/arch/arm/nwfpe/fpa11.c b/arch/arm/nwfpe/fpa11.c index cc60acde8..7b3d74d73 100644 --- a/arch/arm/nwfpe/fpa11.c +++ b/arch/arm/nwfpe/fpa11.c @@ -26,6 +26,7 @@ #include "fpmodule.h" #include "fpmodule.inl" +#include #include #include #include diff --git a/arch/arm/nwfpe/fpa11.h b/arch/arm/nwfpe/fpa11.h index 4a4d02c09..28cd79a45 100644 --- a/arch/arm/nwfpe/fpa11.h +++ b/arch/arm/nwfpe/fpa11.h @@ -31,6 +31,7 @@ */ #define GET_USERREG() ((struct pt_regs *)(THREAD_START_SP + (unsigned long)current_thread_info()) - 1) +#include #include /* includes */ diff --git a/arch/arm/nwfpe/fpa11_cpdo.c b/arch/arm/nwfpe/fpa11_cpdo.c index 2cebb1529..4a31dfd94 100644 --- a/arch/arm/nwfpe/fpa11_cpdo.c +++ b/arch/arm/nwfpe/fpa11_cpdo.c @@ -20,6 +20,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +#include #include "fpa11.h" #include "fpopcode.h" diff --git a/arch/arm/nwfpe/fpa11_cpdt.c b/arch/arm/nwfpe/fpa11_cpdt.c index 79f8e67cc..32859fa8d 100644 --- a/arch/arm/nwfpe/fpa11_cpdt.c +++ b/arch/arm/nwfpe/fpa11_cpdt.c @@ -20,6 +20,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +#include #include "fpa11.h" #include "softfloat.h" #include "fpopcode.h" diff --git a/arch/arm/nwfpe/fpa11_cprt.c b/arch/arm/nwfpe/fpa11_cprt.c index 9843dc533..7c6702365 100644 --- a/arch/arm/nwfpe/fpa11_cprt.c +++ b/arch/arm/nwfpe/fpa11_cprt.c @@ -20,6 +20,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +#include #include "fpa11.h" #include "fpopcode.h" #include "fpa11.inl" diff --git a/arch/arm/nwfpe/fpmodule.c b/arch/arm/nwfpe/fpmodule.c index 4c0ab50f3..2dfe1ac42 100644 --- a/arch/arm/nwfpe/fpmodule.c +++ b/arch/arm/nwfpe/fpmodule.c @@ -24,6 +24,7 @@ #include "fpa11.h" #include +#include /* XXX */ #include @@ -32,8 +33,7 @@ #include #include #include - -#include +/* XXX */ #include "softfloat.h" #include "fpopcode.h" @@ -56,28 +56,16 @@ void fp_send_sig(unsigned long sig, struct task_struct *p, int priv); extern char fpe_type[]; #endif -static int nwfpe_notify(struct notifier_block *self, unsigned long cmd, void *v) -{ - struct thread_info *thread = v; - - if (cmd == THREAD_NOTIFY_FLUSH) - nwfpe_init_fpa(&thread->fpstate); - - return NOTIFY_DONE; -} - -static struct notifier_block nwfpe_notifier_block = { - .notifier_call = nwfpe_notify, -}; - /* kernel function prototypes required */ void fp_setup(void); /* external declarations for saved kernel symbols */ extern void (*kern_fp_enter)(void); +extern void (*fp_init)(union fp_state *); /* Original value of fp_enter from kernel before patched by fpe_init. */ static void (*orig_fp_enter)(void); +static void (*orig_fp_init)(union fp_state *); /* forward declarations */ extern void nwfpe_enter(void); @@ -100,20 +88,20 @@ static int __init fpe_init(void) printk(KERN_WARNING "NetWinder Floating Point Emulator V0.97 (" NWFPE_BITS " precision)\n"); - thread_register_notifier(&nwfpe_notifier_block); - /* Save pointer to the old FP handler and then patch ourselves in */ orig_fp_enter = kern_fp_enter; + orig_fp_init = fp_init; kern_fp_enter = nwfpe_enter; + fp_init = nwfpe_init_fpa; return 0; } static void __exit fpe_exit(void) { - thread_unregister_notifier(&nwfpe_notifier_block); /* Restore the values we saved earlier. */ kern_fp_enter = orig_fp_enter; + fp_init = orig_fp_init; } /* diff --git a/arch/arm/nwfpe/fpopcode.c b/arch/arm/nwfpe/fpopcode.c index 922b81107..67ff2ab08 100644 --- a/arch/arm/nwfpe/fpopcode.c +++ b/arch/arm/nwfpe/fpopcode.c @@ -19,6 +19,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +#include #include "fpa11.h" #include "softfloat.h" #include "fpopcode.h" diff --git a/arch/arm/nwfpe/fpopcode.h b/arch/arm/nwfpe/fpopcode.h index ec78e3517..6528e081c 100644 --- a/arch/arm/nwfpe/fpopcode.h +++ b/arch/arm/nwfpe/fpopcode.h @@ -23,6 +23,7 @@ #ifndef __FPOPCODE_H__ #define __FPOPCODE_H__ +#include /* ARM Floating Point Instruction Classes diff --git a/arch/arm/nwfpe/softfloat.h b/arch/arm/nwfpe/softfloat.h index 0a3067452..978c69967 100644 --- a/arch/arm/nwfpe/softfloat.h +++ b/arch/arm/nwfpe/softfloat.h @@ -32,6 +32,7 @@ this code that are retained. #ifndef __SOFTFLOAT_H__ #define __SOFTFLOAT_H__ +#include /* ------------------------------------------------------------------------------- @@ -61,7 +62,7 @@ typedef struct { u16 __padding; #endif u64 low; -} __attribute__ ((packed,aligned(4))) floatx80; +} floatx80; /* ------------------------------------------------------------------------------- diff --git a/arch/arm/oprofile/common.c b/arch/arm/oprofile/common.c index 6f833358c..6f8bc1f0e 100644 --- a/arch/arm/oprofile/common.c +++ b/arch/arm/oprofile/common.c @@ -10,18 +10,17 @@ #include #include #include -#include #include -#include +#include #include "op_counter.h" #include "op_arm_model.h" static struct op_arm_model_spec *op_arm_model; static int op_arm_enabled; -static DEFINE_MUTEX(op_arm_mutex); +static struct semaphore op_arm_sem; -struct op_counter_config *counter_config; +struct op_counter_config counter_config[OP_MAX_COUNTER]; static int op_arm_create_files(struct super_block *sb, struct dentry *root) { @@ -29,7 +28,7 @@ static int op_arm_create_files(struct super_block *sb, struct dentry *root) for (i = 0; i < op_arm_model->num_counters; i++) { struct dentry *dir; - char buf[4]; + char buf[2]; snprintf(buf, sizeof buf, "%d", i); dir = oprofilefs_mkdir(sb, root, buf); @@ -58,40 +57,40 @@ static int op_arm_start(void) { int ret = -EBUSY; - mutex_lock(&op_arm_mutex); + down(&op_arm_sem); if (!op_arm_enabled) { ret = op_arm_model->start(); op_arm_enabled = !ret; } - mutex_unlock(&op_arm_mutex); + up(&op_arm_sem); return ret; } static void op_arm_stop(void) { - mutex_lock(&op_arm_mutex); + down(&op_arm_sem); if (op_arm_enabled) op_arm_model->stop(); op_arm_enabled = 0; - mutex_unlock(&op_arm_mutex); + up(&op_arm_sem); } #ifdef CONFIG_PM static int op_arm_suspend(struct sys_device *dev, pm_message_t state) { - mutex_lock(&op_arm_mutex); + down(&op_arm_sem); if (op_arm_enabled) op_arm_model->stop(); - mutex_unlock(&op_arm_mutex); + up(&op_arm_sem); return 0; } static int op_arm_resume(struct sys_device *dev) { - mutex_lock(&op_arm_mutex); + down(&op_arm_sem); if (op_arm_enabled && op_arm_model->start()) op_arm_enabled = 0; - mutex_unlock(&op_arm_mutex); + up(&op_arm_sem); return 0; } @@ -136,15 +135,12 @@ int __init oprofile_arch_init(struct oprofile_operations *ops) #endif if (spec) { + init_MUTEX(&op_arm_sem); + ret = spec->init(); if (ret < 0) return ret; - counter_config = kcalloc(spec->num_counters, sizeof(struct op_counter_config), - GFP_KERNEL); - if (!counter_config) - return -ENOMEM; - op_arm_model = spec; init_driverfs(); ops->create_files = op_arm_create_files; @@ -166,5 +162,5 @@ void oprofile_arch_exit(void) exit_driverfs(); op_arm_model = NULL; } - kfree(counter_config); } + diff --git a/arch/arm/oprofile/op_counter.h b/arch/arm/oprofile/op_counter.h index 8c5351d75..153c1d467 100644 --- a/arch/arm/oprofile/op_counter.h +++ b/arch/arm/oprofile/op_counter.h @@ -24,6 +24,6 @@ struct op_counter_config { unsigned long user; }; -extern struct op_counter_config *counter_config; +extern struct op_counter_config counter_config[]; #endif /* OP_COUNTER_H */ diff --git a/arch/arm/oprofile/op_model_xscale.c b/arch/arm/oprofile/op_model_xscale.c index 34fdc7337..e0f0b320d 100644 --- a/arch/arm/oprofile/op_model_xscale.c +++ b/arch/arm/oprofile/op_model_xscale.c @@ -384,7 +384,7 @@ static int xscale_pmu_start(void) int ret; u32 pmnc = read_pmnc(); - ret = request_irq(XSCALE_PMU_IRQ, xscale_pmu_interrupt, IRQF_DISABLED, + ret = request_irq(XSCALE_PMU_IRQ, xscale_pmu_interrupt, SA_INTERRUPT, "XScale PMU", (void *)results); if (ret < 0) { diff --git a/arch/arm/plat-omap/Kconfig b/arch/arm/plat-omap/Kconfig index ec752e16d..0887bb2a2 100644 --- a/arch/arm/plat-omap/Kconfig +++ b/arch/arm/plat-omap/Kconfig @@ -70,13 +70,13 @@ config OMAP_MPU_TIMER config OMAP_32K_TIMER bool "Use 32KHz timer" - depends on ARCH_OMAP16XX || ARCH_OMAP24XX + depends on ARCH_OMAP16XX help Select this option if you want to enable the OMAP 32KHz timer. This timer saves power compared to the OMAP_MPU_TIMER, and has support for no tick during idle. The 32KHz timer provides less intra-tick resolution than OMAP_MPU_TIMER. The 32KHz timer is - currently only available for OMAP16XX and 24XX. + currently only available for OMAP-16xx. endchoice @@ -91,7 +91,7 @@ config OMAP_32K_TIMER_HZ config OMAP_DM_TIMER bool "Use dual-mode timer" - depends on ARCH_OMAP16XX || ARCH_OMAP24XX + depends on ARCH_OMAP16XX help Select this option if you want to use OMAP Dual-Mode timers. diff --git a/arch/arm/plat-omap/Makefile b/arch/arm/plat-omap/Makefile index 2896b4546..9ccf1943f 100644 --- a/arch/arm/plat-omap/Makefile +++ b/arch/arm/plat-omap/Makefile @@ -3,16 +3,16 @@ # # Common support -obj-y := common.o sram.o sram-fn.o clock.o devices.o dma.o mux.o gpio.o mcbsp.o usb.o fb.o +obj-y := common.o sram.o sram-fn.o clock.o devices.o dma.o mux.o gpio.o mcbsp.o usb.o obj-m := obj-n := obj- := -obj-$(CONFIG_OMAP_32K_TIMER) += timer32k.o - # OCPI interconnect support for 1710, 1610 and 5912 obj-$(CONFIG_ARCH_OMAP16XX) += ocpi.o +# Power Management +obj-$(CONFIG_PM) += pm.o sleep.o obj-$(CONFIG_CPU_FREQ) += cpu-omap.o obj-$(CONFIG_OMAP_DM_TIMER) += dmtimer.o diff --git a/arch/arm/plat-omap/clock.c b/arch/arm/plat-omap/clock.c index 7f45c7c3e..3c2bfc0ef 100644 --- a/arch/arm/plat-omap/clock.c +++ b/arch/arm/plat-omap/clock.c @@ -11,6 +11,7 @@ * published by the Free Software Foundation. */ #include +#include #include #include #include @@ -20,16 +21,15 @@ #include #include #include -#include #include #include #include -static LIST_HEAD(clocks); +LIST_HEAD(clocks); static DEFINE_MUTEX(clocks_mutex); -static DEFINE_SPINLOCK(clockfw_lock); +DEFINE_SPINLOCK(clockfw_lock); static struct clk_functions *arch_clock; @@ -37,38 +37,17 @@ static struct clk_functions *arch_clock; * Standard clock functions defined in include/linux/clk.h *-------------------------------------------------------------------------*/ -/* - * Returns a clock. Note that we first try to use device id on the bus - * and clock name. If this fails, we try to use clock name only. - */ struct clk * clk_get(struct device *dev, const char *id) { struct clk *p, *clk = ERR_PTR(-ENOENT); - int idno; - - if (dev == NULL || dev->bus != &platform_bus_type) - idno = -1; - else - idno = to_platform_device(dev)->id; mutex_lock(&clocks_mutex); - - list_for_each_entry(p, &clocks, node) { - if (p->id == idno && - strcmp(id, p->name) == 0 && try_module_get(p->owner)) { - clk = p; - goto found; - } - } - list_for_each_entry(p, &clocks, node) { if (strcmp(id, p->name) == 0 && try_module_get(p->owner)) { clk = p; break; } } - -found: mutex_unlock(&clocks_mutex); return clk; @@ -80,9 +59,6 @@ int clk_enable(struct clk *clk) unsigned long flags; int ret = 0; - if (clk == NULL || IS_ERR(clk)) - return -EINVAL; - spin_lock_irqsave(&clockfw_lock, flags); if (arch_clock->clk_enable) ret = arch_clock->clk_enable(clk); @@ -96,9 +72,6 @@ void clk_disable(struct clk *clk) { unsigned long flags; - if (clk == NULL || IS_ERR(clk)) - return; - spin_lock_irqsave(&clockfw_lock, flags); if (arch_clock->clk_disable) arch_clock->clk_disable(clk); @@ -111,9 +84,6 @@ int clk_get_usecount(struct clk *clk) unsigned long flags; int ret = 0; - if (clk == NULL || IS_ERR(clk)) - return 0; - spin_lock_irqsave(&clockfw_lock, flags); ret = clk->usecount; spin_unlock_irqrestore(&clockfw_lock, flags); @@ -127,9 +97,6 @@ unsigned long clk_get_rate(struct clk *clk) unsigned long flags; unsigned long ret = 0; - if (clk == NULL || IS_ERR(clk)) - return 0; - spin_lock_irqsave(&clockfw_lock, flags); ret = clk->rate; spin_unlock_irqrestore(&clockfw_lock, flags); @@ -154,9 +121,6 @@ long clk_round_rate(struct clk *clk, unsigned long rate) unsigned long flags; long ret = 0; - if (clk == NULL || IS_ERR(clk)) - return ret; - spin_lock_irqsave(&clockfw_lock, flags); if (arch_clock->clk_round_rate) ret = arch_clock->clk_round_rate(clk, rate); @@ -169,10 +133,7 @@ EXPORT_SYMBOL(clk_round_rate); int clk_set_rate(struct clk *clk, unsigned long rate) { unsigned long flags; - int ret = -EINVAL; - - if (clk == NULL || IS_ERR(clk)) - return ret; + int ret = 0; spin_lock_irqsave(&clockfw_lock, flags); if (arch_clock->clk_set_rate) @@ -186,10 +147,7 @@ EXPORT_SYMBOL(clk_set_rate); int clk_set_parent(struct clk *clk, struct clk *parent) { unsigned long flags; - int ret = -EINVAL; - - if (clk == NULL || IS_ERR(clk) || parent == NULL || IS_ERR(parent)) - return ret; + int ret = 0; spin_lock_irqsave(&clockfw_lock, flags); if (arch_clock->clk_set_parent) @@ -205,9 +163,6 @@ struct clk *clk_get_parent(struct clk *clk) unsigned long flags; struct clk * ret = NULL; - if (clk == NULL || IS_ERR(clk)) - return ret; - spin_lock_irqsave(&clockfw_lock, flags); if (arch_clock->clk_get_parent) ret = arch_clock->clk_get_parent(clk); @@ -244,9 +199,6 @@ __setup("mpurate=", omap_clk_setup); /* Used for clocks that always have same value as the parent clock */ void followparent_recalc(struct clk *clk) { - if (clk == NULL || IS_ERR(clk)) - return; - clk->rate = clk->parent->rate; } @@ -255,9 +207,6 @@ void propagate_rate(struct clk * tclk) { struct clk *clkp; - if (tclk == NULL || IS_ERR(tclk)) - return; - list_for_each_entry(clkp, &clocks, node) { if (likely(clkp->parent != tclk)) continue; @@ -268,9 +217,6 @@ void propagate_rate(struct clk * tclk) int clk_register(struct clk *clk) { - if (clk == NULL || IS_ERR(clk)) - return -EINVAL; - mutex_lock(&clocks_mutex); list_add(&clk->node, &clocks); if (clk->init) @@ -283,9 +229,6 @@ EXPORT_SYMBOL(clk_register); void clk_unregister(struct clk *clk) { - if (clk == NULL || IS_ERR(clk)) - return; - mutex_lock(&clocks_mutex); list_del(&clk->node); mutex_unlock(&clocks_mutex); @@ -296,9 +239,6 @@ void clk_deny_idle(struct clk *clk) { unsigned long flags; - if (clk == NULL || IS_ERR(clk)) - return; - spin_lock_irqsave(&clockfw_lock, flags); if (arch_clock->clk_deny_idle) arch_clock->clk_deny_idle(clk); @@ -310,9 +250,6 @@ void clk_allow_idle(struct clk *clk) { unsigned long flags; - if (clk == NULL || IS_ERR(clk)) - return; - spin_lock_irqsave(&clockfw_lock, flags); if (arch_clock->clk_allow_idle) arch_clock->clk_allow_idle(clk); diff --git a/arch/arm/plat-omap/common.c b/arch/arm/plat-omap/common.c index 57b7b9367..adffc5a85 100644 --- a/arch/arm/plat-omap/common.c +++ b/arch/arm/plat-omap/common.c @@ -7,6 +7,7 @@ * 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/plat-omap/cpu-omap.c b/arch/arm/plat-omap/cpu-omap.c index a0c71dca2..98edc9fdd 100644 --- a/arch/arm/plat-omap/cpu-omap.c +++ b/arch/arm/plat-omap/cpu-omap.c @@ -25,14 +25,6 @@ #include #include -#define VERY_HI_RATE 900000000 - -#ifdef CONFIG_ARCH_OMAP1 -#define MPU_CLK "mpu" -#else -#define MPU_CLK "virt_prcm_set" -#endif - /* TODO: Add support for SDRAM timing changes */ int omap_verify_speed(struct cpufreq_policy *policy) @@ -44,7 +36,7 @@ int omap_verify_speed(struct cpufreq_policy *policy) cpufreq_verify_within_limits(policy, policy->cpuinfo.min_freq, policy->cpuinfo.max_freq); - mpu_clk = clk_get(NULL, MPU_CLK); + mpu_clk = clk_get(NULL, "mpu"); if (IS_ERR(mpu_clk)) return PTR_ERR(mpu_clk); policy->min = clk_round_rate(mpu_clk, policy->min * 1000) / 1000; @@ -64,7 +56,7 @@ unsigned int omap_getspeed(unsigned int cpu) if (cpu) return 0; - mpu_clk = clk_get(NULL, MPU_CLK); + mpu_clk = clk_get(NULL, "mpu"); if (IS_ERR(mpu_clk)) return 0; rate = clk_get_rate(mpu_clk) / 1000; @@ -81,7 +73,7 @@ static int omap_target(struct cpufreq_policy *policy, struct cpufreq_freqs freqs; int ret = 0; - mpu_clk = clk_get(NULL, MPU_CLK); + mpu_clk = clk_get(NULL, "mpu"); if (IS_ERR(mpu_clk)) return PTR_ERR(mpu_clk); @@ -101,7 +93,7 @@ static int __init omap_cpu_init(struct cpufreq_policy *policy) { struct clk * mpu_clk; - mpu_clk = clk_get(NULL, MPU_CLK); + mpu_clk = clk_get(NULL, "mpu"); if (IS_ERR(mpu_clk)) return PTR_ERR(mpu_clk); @@ -110,7 +102,7 @@ static int __init omap_cpu_init(struct cpufreq_policy *policy) policy->cur = policy->min = policy->max = omap_getspeed(0); policy->governor = CPUFREQ_DEFAULT_GOVERNOR; policy->cpuinfo.min_freq = clk_round_rate(mpu_clk, 0) / 1000; - policy->cpuinfo.max_freq = clk_round_rate(mpu_clk, VERY_HI_RATE) / 1000; + policy->cpuinfo.max_freq = clk_round_rate(mpu_clk, 216000000) / 1000; policy->cpuinfo.transition_latency = CPUFREQ_ETERNAL; clk_put(mpu_clk); diff --git a/arch/arm/plat-omap/devices.c b/arch/arm/plat-omap/devices.c index 1812f237d..9dcce904b 100644 --- a/arch/arm/plat-omap/devices.c +++ b/arch/arm/plat-omap/devices.c @@ -9,6 +9,7 @@ * (at your option) any later version. */ +#include #include #include #include @@ -23,7 +24,14 @@ #include #include #include -#include + + +void omap_nop_release(struct device *dev) +{ + /* Nothing */ +} + +/*-------------------------------------------------------------------------*/ #if defined(CONFIG_I2C_OMAP) || defined(CONFIG_I2C_OMAP_MODULE) @@ -50,6 +58,9 @@ static struct resource i2c_resources1[] = { static struct platform_device omap_i2c_device1 = { .name = "i2c_omap", .id = 1, + .dev = { + .release = omap_nop_release, + }, .num_resources = ARRAY_SIZE(i2c_resources1), .resource = i2c_resources1, }; @@ -86,62 +97,6 @@ static void omap_init_i2c(void) static inline void omap_init_i2c(void) {} #endif -/*-------------------------------------------------------------------------*/ -#if defined(CONFIG_KEYBOARD_OMAP) || defined(CONFIG_KEYBOARD_OMAP_MODULE) - -static void omap_init_kp(void) -{ - if (machine_is_omap_h2() || machine_is_omap_h3()) { - omap_cfg_reg(F18_1610_KBC0); - omap_cfg_reg(D20_1610_KBC1); - omap_cfg_reg(D19_1610_KBC2); - omap_cfg_reg(E18_1610_KBC3); - omap_cfg_reg(C21_1610_KBC4); - - omap_cfg_reg(G18_1610_KBR0); - omap_cfg_reg(F19_1610_KBR1); - omap_cfg_reg(H14_1610_KBR2); - omap_cfg_reg(E20_1610_KBR3); - omap_cfg_reg(E19_1610_KBR4); - omap_cfg_reg(N19_1610_KBR5); - } else if (machine_is_omap_perseus2() || machine_is_omap_fsample()) { - omap_cfg_reg(E2_730_KBR0); - omap_cfg_reg(J7_730_KBR1); - omap_cfg_reg(E1_730_KBR2); - omap_cfg_reg(F3_730_KBR3); - omap_cfg_reg(D2_730_KBR4); - - omap_cfg_reg(C2_730_KBC0); - omap_cfg_reg(D3_730_KBC1); - omap_cfg_reg(E4_730_KBC2); - omap_cfg_reg(F4_730_KBC3); - omap_cfg_reg(E3_730_KBC4); - } else if (machine_is_omap_h4()) { - omap_cfg_reg(T19_24XX_KBR0); - omap_cfg_reg(R19_24XX_KBR1); - omap_cfg_reg(V18_24XX_KBR2); - omap_cfg_reg(M21_24XX_KBR3); - omap_cfg_reg(E5__24XX_KBR4); - if (omap_has_menelaus()) { - omap_cfg_reg(B3__24XX_KBR5); - omap_cfg_reg(AA4_24XX_KBC2); - omap_cfg_reg(B13_24XX_KBC6); - } else { - omap_cfg_reg(M18_24XX_KBR5); - omap_cfg_reg(H19_24XX_KBC2); - omap_cfg_reg(N19_24XX_KBC6); - } - omap_cfg_reg(R20_24XX_KBC0); - omap_cfg_reg(M14_24XX_KBC1); - omap_cfg_reg(V17_24XX_KBC3); - omap_cfg_reg(P21_24XX_KBC4); - omap_cfg_reg(L14_24XX_KBC5); - } -} -#else -static inline void omap_init_kp(void) {} -#endif - /*-------------------------------------------------------------------------*/ #if defined(CONFIG_MMC_OMAP) || defined(CONFIG_MMC_OMAP_MODULE) @@ -161,8 +116,8 @@ static u64 mmc1_dmamask = 0xffffffff; static struct resource mmc1_resources[] = { { - .start = OMAP_MMC1_BASE, - .end = OMAP_MMC1_BASE + 0x7f, + .start = IO_ADDRESS(OMAP_MMC1_BASE), + .end = IO_ADDRESS(OMAP_MMC1_BASE) + 0x7f, .flags = IORESOURCE_MEM, }, { @@ -175,6 +130,7 @@ static struct platform_device mmc_omap_device1 = { .name = "mmci-omap", .id = 1, .dev = { + .release = omap_nop_release, .dma_mask = &mmc1_dmamask, .platform_data = &mmc1_conf, }, @@ -190,8 +146,8 @@ static u64 mmc2_dmamask = 0xffffffff; static struct resource mmc2_resources[] = { { - .start = OMAP_MMC2_BASE, - .end = OMAP_MMC2_BASE + 0x7f, + .start = IO_ADDRESS(OMAP_MMC2_BASE), + .end = IO_ADDRESS(OMAP_MMC2_BASE) + 0x7f, .flags = IORESOURCE_MEM, }, { @@ -204,6 +160,7 @@ static struct platform_device mmc_omap_device2 = { .name = "mmci-omap", .id = 2, .dev = { + .release = omap_nop_release, .dma_mask = &mmc2_dmamask, .platform_data = &mmc2_conf, }, @@ -283,52 +240,6 @@ static void __init omap_init_mmc(void) static inline void omap_init_mmc(void) {} #endif -/*-------------------------------------------------------------------------*/ - -/* Numbering for the SPI-capable controllers when used for SPI: - * spi = 1 - * uwire = 2 - * mmc1..2 = 3..4 - * mcbsp1..3 = 5..7 - */ - -#if defined(CONFIG_SPI_OMAP_UWIRE) || defined(CONFIG_SPI_OMAP_UWIRE_MODULE) - -#define OMAP_UWIRE_BASE 0xfffb3000 - -static struct resource uwire_resources[] = { - { - .start = OMAP_UWIRE_BASE, - .end = OMAP_UWIRE_BASE + 0x20, - .flags = IORESOURCE_MEM, - }, -}; - -static struct platform_device omap_uwire_device = { - .name = "omap_uwire", - .id = -1, - .num_resources = ARRAY_SIZE(uwire_resources), - .resource = uwire_resources, -}; - -static void omap_init_uwire(void) -{ - /* FIXME define and use a boot tag; not all boards will be hooking - * up devices to the microwire controller, and multi-board configs - * mean that CONFIG_SPI_OMAP_UWIRE may be configured anyway... - */ - - /* board-specific code must configure chipselects (only a few - * are normally used) and SCLK/SDI/SDO (each has two choices). - */ - (void) platform_device_register(&omap_uwire_device); -} -#else -static inline void omap_init_uwire(void) {} -#endif - -/*-------------------------------------------------------------------------*/ - #if defined(CONFIG_OMAP_WATCHDOG) || defined(CONFIG_OMAP_WATCHDOG_MODULE) #ifdef CONFIG_ARCH_OMAP24XX @@ -348,6 +259,9 @@ static struct resource wdt_resources[] = { static struct platform_device omap_wdt_device = { .name = "omap_wdt", .id = -1, + .dev = { + .release = omap_nop_release, + }, .num_resources = ARRAY_SIZE(wdt_resources), .resource = wdt_resources, }; @@ -381,6 +295,9 @@ static struct resource rng_resources[] = { static struct platform_device omap_rng_device = { .name = "omap_rng", .id = -1, + .dev = { + .release = omap_nop_release, + }, .num_resources = ARRAY_SIZE(rng_resources), .resource = rng_resources, }; @@ -393,6 +310,40 @@ static void omap_init_rng(void) static inline void omap_init_rng(void) {} #endif +#if defined(CONFIG_FB_OMAP) || defined(CONFIG_FB_OMAP_MODULE) + +static struct omap_lcd_config omap_fb_conf; + +static u64 omap_fb_dma_mask = ~(u32)0; + +static struct platform_device omap_fb_device = { + .name = "omapfb", + .id = -1, + .dev = { + .release = omap_nop_release, + .dma_mask = &omap_fb_dma_mask, + .coherent_dma_mask = ~(u32)0, + .platform_data = &omap_fb_conf, + }, + .num_resources = 0, +}; + +static inline void omap_init_fb(void) +{ + const struct omap_lcd_config *conf; + + conf = omap_get_config(OMAP_TAG_LCD, struct omap_lcd_config); + if (conf != NULL) + omap_fb_conf = *conf; + platform_device_register(&omap_fb_device); +} + +#else + +static inline void omap_init_fb(void) {} + +#endif + /* * This gets called after board-specific INIT_MACHINE, and initializes most * on-chip peripherals accessible on this board (except for few like USB): @@ -418,10 +369,9 @@ static int __init omap_init_devices(void) /* please keep these calls, and their implementations above, * in alphabetical order so they're easier to sort through. */ + omap_init_fb(); omap_init_i2c(); - omap_init_kp(); omap_init_mmc(); - omap_init_uwire(); omap_init_wdt(); omap_init_rng(); diff --git a/arch/arm/plat-omap/dma.c b/arch/arm/plat-omap/dma.c index 9eddc9507..a4e5ac77f 100644 --- a/arch/arm/plat-omap/dma.c +++ b/arch/arm/plat-omap/dma.c @@ -24,9 +24,9 @@ #include #include #include -#include #include +#include #include #include #include @@ -43,7 +43,6 @@ #define OMAP_DMA_ACTIVE 0x01 #define OMAP_DMA_CCR_EN (1 << 7) -#define OMAP2_DMA_CSR_CLEAR_MASK 0xffe #define OMAP_FUNC_MUX_ARM_BASE (0xfffe1000 + 0xec) @@ -167,24 +166,18 @@ void omap_set_dma_transfer_params(int lch, int data_type, int elem_count, if (cpu_is_omap24xx() && dma_trigger) { u32 val = OMAP_DMA_CCR_REG(lch); - val &= ~(3 << 19); if (dma_trigger > 63) val |= 1 << 20; if (dma_trigger > 31) val |= 1 << 19; - val &= ~(0x1f); val |= (dma_trigger & 0x1f); if (sync_mode & OMAP_DMA_SYNC_FRAME) val |= 1 << 5; - else - val &= ~(1 << 5); if (sync_mode & OMAP_DMA_SYNC_BLOCK) val |= 1 << 18; - else - val &= ~(1 << 18); if (src_or_dst_synch) val |= 1 << 24; /* source synch */ @@ -293,39 +286,22 @@ void omap_set_dma_src_data_pack(int lch, int enable) void omap_set_dma_src_burst_mode(int lch, enum omap_dma_burst_mode burst_mode) { - unsigned int burst = 0; OMAP_DMA_CSDP_REG(lch) &= ~(0x03 << 7); switch (burst_mode) { case OMAP_DMA_DATA_BURST_DIS: break; case OMAP_DMA_DATA_BURST_4: - if (cpu_is_omap24xx()) - burst = 0x1; - else - burst = 0x2; + OMAP_DMA_CSDP_REG(lch) |= (0x02 << 7); break; case OMAP_DMA_DATA_BURST_8: - if (cpu_is_omap24xx()) { - burst = 0x2; - break; - } - /* not supported by current hardware on OMAP1 + /* not supported by current hardware * w |= (0x03 << 7); * fall through */ - case OMAP_DMA_DATA_BURST_16: - if (cpu_is_omap24xx()) { - burst = 0x3; - break; - } - /* OMAP1 don't support burst 16 - * fall through - */ default: BUG(); } - OMAP_DMA_CSDP_REG(lch) |= (burst << 7); } /* Note that dest_port is only for OMAP1 */ @@ -372,49 +348,30 @@ void omap_set_dma_dest_data_pack(int lch, int enable) void omap_set_dma_dest_burst_mode(int lch, enum omap_dma_burst_mode burst_mode) { - unsigned int burst = 0; OMAP_DMA_CSDP_REG(lch) &= ~(0x03 << 14); switch (burst_mode) { case OMAP_DMA_DATA_BURST_DIS: break; case OMAP_DMA_DATA_BURST_4: - if (cpu_is_omap24xx()) - burst = 0x1; - else - burst = 0x2; + OMAP_DMA_CSDP_REG(lch) |= (0x02 << 14); break; case OMAP_DMA_DATA_BURST_8: - if (cpu_is_omap24xx()) - burst = 0x2; - else - burst = 0x3; + OMAP_DMA_CSDP_REG(lch) |= (0x03 << 14); break; - case OMAP_DMA_DATA_BURST_16: - if (cpu_is_omap24xx()) { - burst = 0x3; - break; - } - /* OMAP1 don't support burst 16 - * fall through - */ default: printk(KERN_ERR "Invalid DMA burst mode\n"); BUG(); return; } - OMAP_DMA_CSDP_REG(lch) |= (burst << 14); } static inline void omap_enable_channel_irq(int lch) { u32 status; - /* Clear CSR */ - if (cpu_class_is_omap1()) - status = OMAP_DMA_CSR_REG(lch); - else if (cpu_is_omap24xx()) - OMAP_DMA_CSR_REG(lch) = OMAP2_DMA_CSR_CLEAR_MASK; + /* Read CSR to make sure it's cleared. */ + status = OMAP_DMA_CSR_REG(lch); /* Enable some nice interrupts. */ OMAP_DMA_CICR_REG(lch) = dma_chan[lch].enabled_irqs; @@ -513,13 +470,11 @@ int omap_request_dma(int dev_id, const char *dev_name, chan->dev_name = dev_name; chan->callback = callback; chan->data = data; - chan->enabled_irqs = OMAP_DMA_DROP_IRQ | OMAP_DMA_BLOCK_IRQ; + chan->enabled_irqs = OMAP_DMA_TOUT_IRQ | OMAP_DMA_DROP_IRQ | + OMAP_DMA_BLOCK_IRQ; - if (cpu_class_is_omap1()) - chan->enabled_irqs |= OMAP1_DMA_TOUT_IRQ; - else if (cpu_is_omap24xx()) - chan->enabled_irqs |= OMAP2_DMA_MISALIGNED_ERR_IRQ | - OMAP2_DMA_TRANS_ERR_IRQ; + if (cpu_is_omap24xx()) + chan->enabled_irqs |= OMAP2_DMA_TRANS_ERR_IRQ; if (cpu_is_omap16xx()) { /* If the sync device is set, configure it dynamically. */ @@ -539,7 +494,7 @@ int omap_request_dma(int dev_id, const char *dev_name, omap_enable_channel_irq(free_ch); /* Clear the CSR register and IRQ status register */ - OMAP_DMA_CSR_REG(free_ch) = OMAP2_DMA_CSR_CLEAR_MASK; + OMAP_DMA_CSR_REG(free_ch) = 0x0; omap_writel(~0x0, OMAP_DMA4_IRQSTATUS_L0); } @@ -579,7 +534,7 @@ void omap_free_dma(int lch) omap_writel(val, OMAP_DMA4_IRQENABLE_L0); /* Clear the CSR register and IRQ status register */ - OMAP_DMA_CSR_REG(lch) = OMAP2_DMA_CSR_CLEAR_MASK; + OMAP_DMA_CSR_REG(lch) = 0x0; val = omap_readl(OMAP_DMA4_IRQSTATUS_L0); val |= 1 << lch; @@ -843,7 +798,7 @@ static int omap1_dma_handle_ch(int ch) "%d (CSR %04x)\n", ch, csr); return 0; } - if (unlikely(csr & OMAP1_DMA_TOUT_IRQ)) + if (unlikely(csr & OMAP_DMA_TOUT_IRQ)) printk(KERN_WARNING "DMA timeout with device %d\n", dma_chan[ch].dev_id); if (unlikely(csr & OMAP_DMA_DROP_IRQ)) @@ -891,21 +846,20 @@ static int omap2_dma_handle_ch(int ch) return 0; if (unlikely(dma_chan[ch].dev_id == -1)) return 0; + /* REVISIT: According to 24xx TRM, there's no TOUT_IE */ + if (unlikely(status & OMAP_DMA_TOUT_IRQ)) + printk(KERN_INFO "DMA timeout with device %d\n", + dma_chan[ch].dev_id); if (unlikely(status & OMAP_DMA_DROP_IRQ)) printk(KERN_INFO "DMA synchronization event drop occurred with device " "%d\n", dma_chan[ch].dev_id); + if (unlikely(status & OMAP2_DMA_TRANS_ERR_IRQ)) printk(KERN_INFO "DMA transaction error with device %d\n", dma_chan[ch].dev_id); - if (unlikely(status & OMAP2_DMA_SECURE_ERR_IRQ)) - printk(KERN_INFO "DMA secure error with device %d\n", - dma_chan[ch].dev_id); - if (unlikely(status & OMAP2_DMA_MISALIGNED_ERR_IRQ)) - printk(KERN_INFO "DMA misaligned error with device %d\n", - dma_chan[ch].dev_id); - OMAP_DMA_CSR_REG(ch) = OMAP2_DMA_CSR_CLEAR_MASK; + OMAP_DMA_CSR_REG(ch) = 0x20; val = omap_readl(OMAP_DMA4_IRQSTATUS_L0); /* ch in this function is from 0-31 while in register it is 1-32 */ @@ -939,7 +893,7 @@ static irqreturn_t omap2_dma_irq_handler(int irq, void *dev_id, static struct irqaction omap24xx_dma_irq = { .name = "DMA", .handler = omap2_dma_irq_handler, - .flags = IRQF_DISABLED + .flags = SA_INTERRUPT }; #else @@ -1304,11 +1258,6 @@ void omap_stop_lcd_dma(void) omap_writew(w, OMAP1610_DMA_LCD_CTRL); } -int omap_lcd_dma_ext_running(void) -{ - return lcd_dma.ext_ctrl && lcd_dma.active; -} - /*----------------------------------------------------------------------------*/ static int __init omap_init_dma(void) @@ -1440,7 +1389,6 @@ EXPORT_SYMBOL(omap_free_lcd_dma); EXPORT_SYMBOL(omap_enable_lcd_dma); EXPORT_SYMBOL(omap_setup_lcd_dma); EXPORT_SYMBOL(omap_stop_lcd_dma); -EXPORT_SYMBOL(omap_lcd_dma_ext_running); EXPORT_SYMBOL(omap_set_lcd_dma_b1); EXPORT_SYMBOL(omap_set_lcd_dma_single_transfer); EXPORT_SYMBOL(omap_set_lcd_dma_ext_controller); diff --git a/arch/arm/plat-omap/dmtimer.c b/arch/arm/plat-omap/dmtimer.c index 50524436d..38d7ebf87 100644 --- a/arch/arm/plat-omap/dmtimer.c +++ b/arch/arm/plat-omap/dmtimer.c @@ -4,8 +4,7 @@ * OMAP Dual-Mode Timers * * Copyright (C) 2005 Nokia Corporation - * OMAP2 support by Juha Yrjola - * API improvements and OMAP2 clock framework support by Timo Teras + * Author: Lauri Leukkunen * * This 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 @@ -27,17 +26,15 @@ */ #include -#include -#include -#include -#include -#include #include #include #include #include +#include +#include + +#define OMAP_TIMER_COUNT 8 -/* register offsets */ #define OMAP_TIMER_ID_REG 0x00 #define OMAP_TIMER_OCP_CFG_REG 0x10 #define OMAP_TIMER_SYS_STAT_REG 0x14 @@ -53,426 +50,211 @@ #define OMAP_TIMER_CAPTURE_REG 0x3c #define OMAP_TIMER_IF_CTRL_REG 0x40 -/* timer control reg bits */ -#define OMAP_TIMER_CTRL_GPOCFG (1 << 14) -#define OMAP_TIMER_CTRL_CAPTMODE (1 << 13) -#define OMAP_TIMER_CTRL_PT (1 << 12) -#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 */ - -struct omap_dm_timer { - unsigned long phys_base; - int irq; -#ifdef CONFIG_ARCH_OMAP2 - struct clk *iclk, *fclk; -#endif - void __iomem *io_base; - unsigned reserved:1; -}; -#ifdef CONFIG_ARCH_OMAP1 +static struct dmtimer_info_struct { + struct list_head unused_timers; + struct list_head reserved_timers; +} dm_timer_info; static struct omap_dm_timer dm_timers[] = { - { .phys_base = 0xfffb1400, .irq = INT_1610_GPTIMER1 }, - { .phys_base = 0xfffb1c00, .irq = INT_1610_GPTIMER2 }, - { .phys_base = 0xfffb2400, .irq = INT_1610_GPTIMER3 }, - { .phys_base = 0xfffb2c00, .irq = INT_1610_GPTIMER4 }, - { .phys_base = 0xfffb3400, .irq = INT_1610_GPTIMER5 }, - { .phys_base = 0xfffb3c00, .irq = INT_1610_GPTIMER6 }, - { .phys_base = 0xfffb4400, .irq = INT_1610_GPTIMER7 }, - { .phys_base = 0xfffb4c00, .irq = INT_1610_GPTIMER8 }, + { .base=0xfffb1400, .irq=INT_1610_GPTIMER1 }, + { .base=0xfffb1c00, .irq=INT_1610_GPTIMER2 }, + { .base=0xfffb2400, .irq=INT_1610_GPTIMER3 }, + { .base=0xfffb2c00, .irq=INT_1610_GPTIMER4 }, + { .base=0xfffb3400, .irq=INT_1610_GPTIMER5 }, + { .base=0xfffb3c00, .irq=INT_1610_GPTIMER6 }, + { .base=0xfffb4400, .irq=INT_1610_GPTIMER7 }, + { .base=0xfffb4c00, .irq=INT_1610_GPTIMER8 }, + { .base=0x0 }, }; -#elif defined(CONFIG_ARCH_OMAP2) -static struct omap_dm_timer dm_timers[] = { - { .phys_base = 0x48028000, .irq = INT_24XX_GPTIMER1 }, - { .phys_base = 0x4802a000, .irq = INT_24XX_GPTIMER2 }, - { .phys_base = 0x48078000, .irq = INT_24XX_GPTIMER3 }, - { .phys_base = 0x4807a000, .irq = INT_24XX_GPTIMER4 }, - { .phys_base = 0x4807c000, .irq = INT_24XX_GPTIMER5 }, - { .phys_base = 0x4807e000, .irq = INT_24XX_GPTIMER6 }, - { .phys_base = 0x48080000, .irq = INT_24XX_GPTIMER7 }, - { .phys_base = 0x48082000, .irq = INT_24XX_GPTIMER8 }, - { .phys_base = 0x48084000, .irq = INT_24XX_GPTIMER9 }, - { .phys_base = 0x48086000, .irq = INT_24XX_GPTIMER10 }, - { .phys_base = 0x48088000, .irq = INT_24XX_GPTIMER11 }, - { .phys_base = 0x4808a000, .irq = INT_24XX_GPTIMER12 }, -}; - -static const char *dm_source_names[] = { - "sys_ck", - "func_32k_ck", - "alt_ck" -}; - -static struct clk *dm_source_clocks[3]; - -#else - -#error OMAP architecture not supported! - -#endif - -static const int dm_timer_count = ARRAY_SIZE(dm_timers); static spinlock_t dm_timer_lock; -static inline u32 omap_dm_timer_read_reg(struct omap_dm_timer *timer, int reg) -{ - return readl(timer->io_base + reg); -} -static void omap_dm_timer_write_reg(struct omap_dm_timer *timer, int reg, u32 value) +inline void omap_dm_timer_write_reg(struct omap_dm_timer *timer, int reg, u32 value) { - writel(value, timer->io_base + reg); + omap_writel(value, timer->base + reg); while (omap_dm_timer_read_reg(timer, OMAP_TIMER_WRITE_PEND_REG)) ; } -static void omap_dm_timer_wait_for_reset(struct omap_dm_timer *timer) +u32 omap_dm_timer_read_reg(struct omap_dm_timer *timer, int reg) { - int c; - - c = 0; - while (!(omap_dm_timer_read_reg(timer, OMAP_TIMER_SYS_STAT_REG) & 1)) { - c++; - if (c > 100000) { - printk(KERN_ERR "Timer failed to reset\n"); - return; - } - } + return omap_readl(timer->base + reg); } -static void omap_dm_timer_reset(struct omap_dm_timer *timer) +int omap_dm_timers_active(void) { - u32 l; + struct omap_dm_timer *timer; - if (timer != &dm_timers[0]) { - omap_dm_timer_write_reg(timer, OMAP_TIMER_IF_CTRL_REG, 0x06); - omap_dm_timer_wait_for_reset(timer); - } - omap_dm_timer_set_source(timer, OMAP_TIMER_SRC_SYS_CLK); + for (timer = &dm_timers[0]; timer->base; ++timer) + if (omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG) & + OMAP_TIMER_CTRL_ST) + return 1; - /* Set to smart-idle mode */ - l = omap_dm_timer_read_reg(timer, OMAP_TIMER_OCP_CFG_REG); - l |= 0x02 << 3; - omap_dm_timer_write_reg(timer, OMAP_TIMER_OCP_CFG_REG, l); + return 0; } -static void omap_dm_timer_prepare(struct omap_dm_timer *timer) -{ -#ifdef CONFIG_ARCH_OMAP2 - clk_enable(timer->iclk); - clk_enable(timer->fclk); -#endif - omap_dm_timer_reset(timer); -} -struct omap_dm_timer *omap_dm_timer_request(void) +void omap_dm_timer_set_source(struct omap_dm_timer *timer, int source) { - struct omap_dm_timer *timer = NULL; - unsigned long flags; - int i; + int n = (timer - dm_timers) << 1; + u32 l; - spin_lock_irqsave(&dm_timer_lock, flags); - for (i = 0; i < dm_timer_count; i++) { - if (dm_timers[i].reserved) - continue; + l = omap_readl(MOD_CONF_CTRL_1) & ~(0x03 << n); + l |= source << n; + omap_writel(l, MOD_CONF_CTRL_1); +} - timer = &dm_timers[i]; - timer->reserved = 1; - break; - } - spin_unlock_irqrestore(&dm_timer_lock, flags); - if (timer != NULL) - omap_dm_timer_prepare(timer); +static void omap_dm_timer_reset(struct omap_dm_timer *timer) +{ + /* Reset and set posted mode */ + omap_dm_timer_write_reg(timer, OMAP_TIMER_IF_CTRL_REG, 0x06); + omap_dm_timer_write_reg(timer, OMAP_TIMER_OCP_CFG_REG, 0x02); - return timer; + omap_dm_timer_set_source(timer, OMAP_TIMER_SRC_ARMXOR); } -struct omap_dm_timer *omap_dm_timer_request_specific(int id) + + +struct omap_dm_timer * omap_dm_timer_request(void) { - struct omap_dm_timer *timer; + struct omap_dm_timer *timer = NULL; unsigned long flags; spin_lock_irqsave(&dm_timer_lock, flags); - if (id <= 0 || id > dm_timer_count || dm_timers[id-1].reserved) { - spin_unlock_irqrestore(&dm_timer_lock, flags); - printk("BUG: warning at %s:%d/%s(): unable to get timer %d\n", - __FILE__, __LINE__, __FUNCTION__, id); - dump_stack(); - return NULL; + if (!list_empty(&dm_timer_info.unused_timers)) { + timer = (struct omap_dm_timer *) + dm_timer_info.unused_timers.next; + list_move_tail((struct list_head *)timer, + &dm_timer_info.reserved_timers); } - - timer = &dm_timers[id-1]; - timer->reserved = 1; spin_unlock_irqrestore(&dm_timer_lock, flags); - omap_dm_timer_prepare(timer); - return timer; } -void omap_dm_timer_free(struct omap_dm_timer *timer) -{ - omap_dm_timer_reset(timer); -#ifdef CONFIG_ARCH_OMAP2 - clk_disable(timer->iclk); - clk_disable(timer->fclk); -#endif - WARN_ON(!timer->reserved); - timer->reserved = 0; -} -int omap_dm_timer_get_irq(struct omap_dm_timer *timer) -{ - return timer->irq; -} - -#if defined(CONFIG_ARCH_OMAP1) - -struct clk *omap_dm_timer_get_fclk(struct omap_dm_timer *timer) -{ - BUG(); -} - -/** - * omap_dm_timer_modify_idlect_mask - Check if any running timers use ARMXOR - * @inputmask: current value of idlect mask - */ -__u32 omap_dm_timer_modify_idlect_mask(__u32 inputmask) +void omap_dm_timer_free(struct omap_dm_timer *timer) { - int i; - - /* If ARMXOR cannot be idled this function call is unnecessary */ - if (!(inputmask & (1 << 1))) - return inputmask; - - /* If any active timer is using ARMXOR return modified mask */ - for (i = 0; i < dm_timer_count; i++) { - u32 l; - - l = omap_dm_timer_read_reg(&dm_timers[i], OMAP_TIMER_CTRL_REG); - if (l & OMAP_TIMER_CTRL_ST) { - if (((omap_readl(MOD_CONF_CTRL_1) >> (i * 2)) & 0x03) == 0) - inputmask &= ~(1 << 1); - else - inputmask &= ~(1 << 2); - } - } - - return inputmask; -} + unsigned long flags; -#elif defined(CONFIG_ARCH_OMAP2) + omap_dm_timer_reset(timer); -struct clk *omap_dm_timer_get_fclk(struct omap_dm_timer *timer) -{ - return timer->fclk; + spin_lock_irqsave(&dm_timer_lock, flags); + list_move_tail((struct list_head *)timer, &dm_timer_info.unused_timers); + spin_unlock_irqrestore(&dm_timer_lock, flags); } -__u32 omap_dm_timer_modify_idlect_mask(__u32 inputmask) +void omap_dm_timer_set_int_enable(struct omap_dm_timer *timer, + unsigned int value) { - BUG(); + omap_dm_timer_write_reg(timer, OMAP_TIMER_INT_EN_REG, value); } -#endif - -void omap_dm_timer_trigger(struct omap_dm_timer *timer) +unsigned int omap_dm_timer_read_status(struct omap_dm_timer *timer) { - omap_dm_timer_write_reg(timer, OMAP_TIMER_TRIGGER_REG, 0); + return omap_dm_timer_read_reg(timer, OMAP_TIMER_STAT_REG); } -void omap_dm_timer_start(struct omap_dm_timer *timer) +void omap_dm_timer_write_status(struct omap_dm_timer *timer, unsigned int value) { - u32 l; - - l = omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG); - if (!(l & OMAP_TIMER_CTRL_ST)) { - l |= OMAP_TIMER_CTRL_ST; - omap_dm_timer_write_reg(timer, OMAP_TIMER_CTRL_REG, l); - } + omap_dm_timer_write_reg(timer, OMAP_TIMER_STAT_REG, value); } -void omap_dm_timer_stop(struct omap_dm_timer *timer) +void omap_dm_timer_enable_autoreload(struct omap_dm_timer *timer) { u32 l; - l = omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG); - if (l & OMAP_TIMER_CTRL_ST) { - l &= ~0x1; - omap_dm_timer_write_reg(timer, OMAP_TIMER_CTRL_REG, l); - } -} - -#ifdef CONFIG_ARCH_OMAP1 - -void omap_dm_timer_set_source(struct omap_dm_timer *timer, int source) -{ - int n = (timer - dm_timers) << 1; - u32 l; - - l = omap_readl(MOD_CONF_CTRL_1) & ~(0x03 << n); - l |= source << n; - omap_writel(l, MOD_CONF_CTRL_1); + l |= OMAP_TIMER_CTRL_AR; + omap_dm_timer_write_reg(timer, OMAP_TIMER_CTRL_REG, l); } -#else - -void omap_dm_timer_set_source(struct omap_dm_timer *timer, int source) +void omap_dm_timer_trigger(struct omap_dm_timer *timer) { - if (source < 0 || source >= 3) - return; - - clk_disable(timer->fclk); - clk_set_parent(timer->fclk, dm_source_clocks[source]); - clk_enable(timer->fclk); - - /* When the functional clock disappears, too quick writes seem to - * cause an abort. */ - __delay(15000); + omap_dm_timer_write_reg(timer, OMAP_TIMER_TRIGGER_REG, 1); } -#endif - -void omap_dm_timer_set_load(struct omap_dm_timer *timer, int autoreload, - unsigned int load) +void omap_dm_timer_set_trigger(struct omap_dm_timer *timer, unsigned int value) { u32 l; l = omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG); - if (autoreload) - l |= OMAP_TIMER_CTRL_AR; - else - l &= ~OMAP_TIMER_CTRL_AR; + l |= value & 0x3; omap_dm_timer_write_reg(timer, OMAP_TIMER_CTRL_REG, l); - omap_dm_timer_write_reg(timer, OMAP_TIMER_LOAD_REG, load); - omap_dm_timer_write_reg(timer, OMAP_TIMER_TRIGGER_REG, 0); } -void omap_dm_timer_set_match(struct omap_dm_timer *timer, int enable, - unsigned int match) +void omap_dm_timer_start(struct omap_dm_timer *timer) { u32 l; l = omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG); - if (enable) - l |= OMAP_TIMER_CTRL_CE; - else - l &= ~OMAP_TIMER_CTRL_CE; + l |= OMAP_TIMER_CTRL_ST; omap_dm_timer_write_reg(timer, OMAP_TIMER_CTRL_REG, l); - omap_dm_timer_write_reg(timer, OMAP_TIMER_MATCH_REG, match); } - -void omap_dm_timer_set_pwm(struct omap_dm_timer *timer, int def_on, - int toggle, int trigger) +void omap_dm_timer_stop(struct omap_dm_timer *timer) { u32 l; l = omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG); - l &= ~(OMAP_TIMER_CTRL_GPOCFG | OMAP_TIMER_CTRL_SCPWM | - OMAP_TIMER_CTRL_PT | (0x03 << 10)); - if (def_on) - l |= OMAP_TIMER_CTRL_SCPWM; - if (toggle) - l |= OMAP_TIMER_CTRL_PT; - l |= trigger << 10; + l &= ~0x1; omap_dm_timer_write_reg(timer, OMAP_TIMER_CTRL_REG, l); } -void omap_dm_timer_set_prescaler(struct omap_dm_timer *timer, int prescaler) +unsigned int omap_dm_timer_read_counter(struct omap_dm_timer *timer) { - u32 l; - - l = omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG); - l &= ~(OMAP_TIMER_CTRL_PRE | (0x07 << 2)); - if (prescaler >= 0x00 && prescaler <= 0x07) { - l |= OMAP_TIMER_CTRL_PRE; - l |= prescaler << 2; - } - omap_dm_timer_write_reg(timer, OMAP_TIMER_CTRL_REG, l); + return omap_dm_timer_read_reg(timer, OMAP_TIMER_COUNTER_REG); } -void omap_dm_timer_set_int_enable(struct omap_dm_timer *timer, - unsigned int value) +void omap_dm_timer_reset_counter(struct omap_dm_timer *timer) { - omap_dm_timer_write_reg(timer, OMAP_TIMER_INT_EN_REG, value); + omap_dm_timer_write_reg(timer, OMAP_TIMER_COUNTER_REG, 0); } -unsigned int omap_dm_timer_read_status(struct omap_dm_timer *timer) +void omap_dm_timer_set_load(struct omap_dm_timer *timer, unsigned int load) { - return omap_dm_timer_read_reg(timer, OMAP_TIMER_STAT_REG); + omap_dm_timer_write_reg(timer, OMAP_TIMER_LOAD_REG, load); } -void omap_dm_timer_write_status(struct omap_dm_timer *timer, unsigned int value) +void omap_dm_timer_set_match(struct omap_dm_timer *timer, unsigned int match) { - omap_dm_timer_write_reg(timer, OMAP_TIMER_STAT_REG, value); + omap_dm_timer_write_reg(timer, OMAP_TIMER_MATCH_REG, match); } -unsigned int omap_dm_timer_read_counter(struct omap_dm_timer *timer) +void omap_dm_timer_enable_compare(struct omap_dm_timer *timer) { - return omap_dm_timer_read_reg(timer, OMAP_TIMER_COUNTER_REG); -} + u32 l; -void omap_dm_timer_write_counter(struct omap_dm_timer *timer, unsigned int value) -{ - return omap_dm_timer_write_reg(timer, OMAP_TIMER_COUNTER_REG, value); + l = omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG); + l |= OMAP_TIMER_CTRL_CE; + omap_dm_timer_write_reg(timer, OMAP_TIMER_CTRL_REG, l); } -int omap_dm_timers_active(void) -{ - int i; - - for (i = 0; i < dm_timer_count; i++) { - struct omap_dm_timer *timer; - - timer = &dm_timers[i]; - if (omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG) & - OMAP_TIMER_CTRL_ST) - return 1; - } - return 0; -} -int omap_dm_timer_init(void) +static inline void __dm_timer_init(void) { struct omap_dm_timer *timer; - int i; - - if (!(cpu_is_omap16xx() || cpu_is_omap24xx())) - return -ENODEV; spin_lock_init(&dm_timer_lock); -#ifdef CONFIG_ARCH_OMAP2 - for (i = 0; i < ARRAY_SIZE(dm_source_names); i++) { - dm_source_clocks[i] = clk_get(NULL, dm_source_names[i]); - BUG_ON(dm_source_clocks[i] == NULL); - } -#endif - - for (i = 0; i < dm_timer_count; i++) { -#ifdef CONFIG_ARCH_OMAP2 - char clk_name[16]; -#endif - - timer = &dm_timers[i]; - timer->io_base = (void __iomem *) io_p2v(timer->phys_base); -#ifdef CONFIG_ARCH_OMAP2 - sprintf(clk_name, "gpt%d_ick", i + 1); - timer->iclk = clk_get(NULL, clk_name); - sprintf(clk_name, "gpt%d_fck", i + 1); - timer->fclk = clk_get(NULL, clk_name); -#endif + INIT_LIST_HEAD(&dm_timer_info.unused_timers); + INIT_LIST_HEAD(&dm_timer_info.reserved_timers); + + timer = &dm_timers[0]; + while (timer->base) { + list_add_tail((struct list_head *)timer, &dm_timer_info.unused_timers); + omap_dm_timer_reset(timer); + timer++; } +} +static int __init omap_dm_timer_init(void) +{ + if (cpu_is_omap16xx()) + __dm_timer_init(); return 0; } + +arch_initcall(omap_dm_timer_init); diff --git a/arch/arm/plat-omap/gpio.c b/arch/arm/plat-omap/gpio.c index cd7f973fb..b4d5b9e4b 100644 --- a/arch/arm/plat-omap/gpio.c +++ b/arch/arm/plat-omap/gpio.c @@ -11,6 +11,7 @@ * published by the Free Software Foundation. */ +#include #include #include #include @@ -173,7 +174,7 @@ static int gpio_bank_count; static inline struct gpio_bank *get_gpio_bank(int gpio) { #ifdef CONFIG_ARCH_OMAP15XX - if (cpu_is_omap15xx()) { + if (cpu_is_omap1510()) { if (OMAP_GPIO_IS_MPUIO(gpio)) return &gpio_bank[0]; return &gpio_bank[1]; @@ -222,7 +223,7 @@ static inline int gpio_valid(int gpio) return 0; } #ifdef CONFIG_ARCH_OMAP15XX - if (cpu_is_omap15xx() && gpio < 16) + if (cpu_is_omap1510() && gpio < 16) return 0; #endif #if defined(CONFIG_ARCH_OMAP16XX) @@ -401,13 +402,13 @@ static inline void set_24xx_gpio_triggering(void __iomem *base, int gpio, int tr u32 gpio_bit = 1 << gpio; MOD_REG_BIT(OMAP24XX_GPIO_LEVELDETECT0, gpio_bit, - trigger & __IRQT_LOWLVL); + trigger & IRQT_LOW); MOD_REG_BIT(OMAP24XX_GPIO_LEVELDETECT1, gpio_bit, - trigger & __IRQT_HIGHLVL); + trigger & IRQT_HIGH); MOD_REG_BIT(OMAP24XX_GPIO_RISINGDETECT, gpio_bit, - trigger & __IRQT_RISEDGE); + trigger & IRQT_RISING); MOD_REG_BIT(OMAP24XX_GPIO_FALLINGDETECT, gpio_bit, - trigger & __IRQT_FALEDGE); + trigger & IRQT_FALLING); /* FIXME: Possibly do 'set_irq_handler(j, do_level_IRQ)' if only level * triggering requested. */ } @@ -421,9 +422,9 @@ static int _set_gpio_triggering(struct gpio_bank *bank, int gpio, int trigger) case METHOD_MPUIO: reg += OMAP_MPUIO_GPIO_INT_EDGE; l = __raw_readl(reg); - if (trigger & __IRQT_RISEDGE) + if (trigger == IRQT_RISING) l |= 1 << gpio; - else if (trigger & __IRQT_FALEDGE) + else if (trigger == IRQT_FALLING) l &= ~(1 << gpio); else goto bad; @@ -431,9 +432,9 @@ static int _set_gpio_triggering(struct gpio_bank *bank, int gpio, int trigger) case METHOD_GPIO_1510: reg += OMAP1510_GPIO_INT_CONTROL; l = __raw_readl(reg); - if (trigger & __IRQT_RISEDGE) + if (trigger == IRQT_RISING) l |= 1 << gpio; - else if (trigger & __IRQT_FALEDGE) + else if (trigger == IRQT_FALLING) l &= ~(1 << gpio); else goto bad; @@ -445,21 +446,20 @@ static int _set_gpio_triggering(struct gpio_bank *bank, int gpio, int trigger) reg += OMAP1610_GPIO_EDGE_CTRL1; gpio &= 0x07; /* We allow only edge triggering, i.e. two lowest bits */ - if (trigger & (__IRQT_LOWLVL | __IRQT_HIGHLVL)) + if (trigger & ~IRQT_BOTHEDGE) BUG(); + /* NOTE: knows __IRQT_{FAL,RIS}EDGE match OMAP hardware */ + trigger &= 0x03; l = __raw_readl(reg); l &= ~(3 << (gpio << 1)); - if (trigger & __IRQT_RISEDGE) - l |= 2 << (gpio << 1); - if (trigger & __IRQT_FALEDGE) - l |= 1 << (gpio << 1); + l |= trigger << (gpio << 1); break; case METHOD_GPIO_730: reg += OMAP730_GPIO_INT_CONTROL; l = __raw_readl(reg); - if (trigger & __IRQT_RISEDGE) + if (trigger == IRQT_RISING) l |= 1 << gpio; - else if (trigger & __IRQT_FALEDGE) + else if (trigger == IRQT_FALLING) l &= ~(1 << gpio); else goto bad; @@ -491,9 +491,7 @@ static int gpio_irq_type(unsigned irq, unsigned type) if (check_gpio(gpio) < 0) return -EINVAL; - if (type & IRQT_PROBE) - return -EINVAL; - if (!cpu_is_omap24xx() && (type & (__IRQT_LOWLVL|__IRQT_HIGHLVL))) + if (type & (__IRQT_LOWLVL|__IRQT_HIGHLVL|IRQT_PROBE)) return -EINVAL; bank = get_gpio_bank(gpio); @@ -536,49 +534,6 @@ static inline void _clear_gpio_irqstatus(struct gpio_bank *bank, int gpio) _clear_gpio_irqbank(bank, 1 << get_gpio_index(gpio)); } -static u32 _get_gpio_irqbank_mask(struct gpio_bank *bank) -{ - void __iomem *reg = bank->base; - int inv = 0; - u32 l; - u32 mask; - - switch (bank->method) { - case METHOD_MPUIO: - reg += OMAP_MPUIO_GPIO_MASKIT; - mask = 0xffff; - inv = 1; - break; - case METHOD_GPIO_1510: - reg += OMAP1510_GPIO_INT_MASK; - mask = 0xffff; - inv = 1; - break; - case METHOD_GPIO_1610: - reg += OMAP1610_GPIO_IRQENABLE1; - mask = 0xffff; - break; - case METHOD_GPIO_730: - reg += OMAP730_GPIO_INT_MASK; - mask = 0xffffffff; - inv = 1; - break; - case METHOD_GPIO_24XX: - reg += OMAP24XX_GPIO_IRQENABLE1; - mask = 0xffffffff; - break; - default: - BUG(); - return 0; - } - - l = __raw_readl(reg); - if (inv) - l = ~l; - l &= mask; - return l; -} - static void _enable_gpio_irqbank(struct gpio_bank *bank, int gpio_mask, int enable) { void __iomem *reg = bank->base; @@ -778,12 +733,10 @@ static void gpio_irq_handler(unsigned int irq, struct irqdesc *desc, u32 isr; unsigned int gpio_irq; struct gpio_bank *bank; - u32 retrigger = 0; - int unmasked = 0; desc->chip->ack(irq); - bank = get_irq_data(irq); + bank = (struct gpio_bank *) desc->data; if (bank->method == METHOD_MPUIO) isr_reg = bank->base + OMAP_MPUIO_GPIO_INT; #ifdef CONFIG_ARCH_OMAP15XX @@ -802,100 +755,26 @@ static void gpio_irq_handler(unsigned int irq, struct irqdesc *desc, if (bank->method == METHOD_GPIO_24XX) isr_reg = bank->base + OMAP24XX_GPIO_IRQSTATUS1; #endif - while(1) { - u32 isr_saved, level_mask = 0; - u32 enabled; - - enabled = _get_gpio_irqbank_mask(bank); - isr_saved = isr = __raw_readl(isr_reg) & enabled; - - if (cpu_is_omap15xx() && (bank->method == METHOD_MPUIO)) - isr &= 0x0000ffff; - - if (cpu_is_omap24xx()) { - level_mask = - __raw_readl(bank->base + - OMAP24XX_GPIO_LEVELDETECT0) | - __raw_readl(bank->base + - OMAP24XX_GPIO_LEVELDETECT1); - level_mask &= enabled; - } - /* clear edge sensitive interrupts before handler(s) are - called so that we don't miss any interrupt occurred while - executing them */ - _enable_gpio_irqbank(bank, isr_saved & ~level_mask, 0); - _clear_gpio_irqbank(bank, isr_saved & ~level_mask); - _enable_gpio_irqbank(bank, isr_saved & ~level_mask, 1); - - /* if there is only edge sensitive GPIO pin interrupts - configured, we could unmask GPIO bank interrupt immediately */ - if (!level_mask && !unmasked) { - unmasked = 1; - desc->chip->unmask(irq); - } + while(1) { + isr = __raw_readl(isr_reg); + _enable_gpio_irqbank(bank, isr, 0); + _clear_gpio_irqbank(bank, isr); + _enable_gpio_irqbank(bank, isr, 1); + desc->chip->unmask(irq); - isr |= retrigger; - retrigger = 0; if (!isr) break; gpio_irq = bank->virtual_irq_start; for (; isr != 0; isr >>= 1, gpio_irq++) { struct irqdesc *d; - int irq_mask; if (!(isr & 1)) continue; d = irq_desc + gpio_irq; - /* Don't run the handler if it's already running - * or was disabled lazely. - */ - if (unlikely((d->depth || - (d->status & IRQ_INPROGRESS)))) { - irq_mask = 1 << - (gpio_irq - bank->virtual_irq_start); - /* The unmasking will be done by - * enable_irq in case it is disabled or - * after returning from the handler if - * it's already running. - */ - _enable_gpio_irqbank(bank, irq_mask, 0); - if (!d->depth) { - /* Level triggered interrupts - * won't ever be reentered - */ - BUG_ON(level_mask & irq_mask); - d->status |= IRQ_PENDING; - } - continue; - } - desc_handle_irq(gpio_irq, d, regs); - - if (unlikely((d->status & IRQ_PENDING) && !d->depth)) { - irq_mask = 1 << - (gpio_irq - bank->virtual_irq_start); - d->status &= ~IRQ_PENDING; - _enable_gpio_irqbank(bank, irq_mask, 1); - retrigger |= irq_mask; - } } - - if (cpu_is_omap24xx()) { - /* clear level sensitive interrupts after handler(s) */ - _enable_gpio_irqbank(bank, isr_saved & level_mask, 0); - _clear_gpio_irqbank(bank, isr_saved & level_mask); - _enable_gpio_irqbank(bank, isr_saved & level_mask, 1); - } - } - /* if bank has any level sensitive GPIO pin interrupt - configured, we must unmask the bank interrupt only after - handler(s) are executed in order to avoid spurious bank - interrupt */ - if (!unmasked) - desc->chip->unmask(irq); - } static void gpio_ack_irq(unsigned int irq) @@ -944,8 +823,7 @@ static void mpuio_unmask_irq(unsigned int irq) _set_gpio_irqenable(bank, gpio, 1); } -static struct irq_chip gpio_irq_chip = { - .name = "GPIO", +static struct irqchip gpio_irq_chip = { .ack = gpio_ack_irq, .mask = gpio_mask_irq, .unmask = gpio_unmask_irq, @@ -953,11 +831,10 @@ static struct irq_chip gpio_irq_chip = { .set_wake = gpio_wake_enable, }; -static struct irq_chip mpuio_irq_chip = { - .name = "MPUIO", +static struct irqchip mpuio_irq_chip = { .ack = mpuio_ack_irq, .mask = mpuio_mask_irq, - .unmask = mpuio_unmask_irq + .unmask = mpuio_unmask_irq }; static int initialized; @@ -971,7 +848,7 @@ static int __init _omap_gpio_init(void) initialized = 1; - if (cpu_is_omap15xx()) { + if (cpu_is_omap1510()) { gpio_ick = clk_get(NULL, "arm_gpio_ck"); if (IS_ERR(gpio_ick)) printk("Could not get arm_gpio_ck\n"); @@ -992,7 +869,7 @@ static int __init _omap_gpio_init(void) } #ifdef CONFIG_ARCH_OMAP15XX - if (cpu_is_omap15xx()) { + if (cpu_is_omap1510()) { printk(KERN_INFO "OMAP1510 GPIO hardware\n"); gpio_bank_count = 2; gpio_bank = gpio_bank_1510; diff --git a/arch/arm/plat-omap/mcbsp.c b/arch/arm/plat-omap/mcbsp.c index 196aac3ac..1cd2cace7 100644 --- a/arch/arm/plat-omap/mcbsp.c +++ b/arch/arm/plat-omap/mcbsp.c @@ -34,7 +34,7 @@ #ifdef CONFIG_MCBSP_DEBUG #define DBG(x...) printk(x) #else -#define DBG(x...) do { } while (0) +#define DBG(x...) do { } while (0) #endif struct omap_mcbsp { @@ -44,7 +44,6 @@ struct omap_mcbsp { omap_mcbsp_word_length rx_word_length; omap_mcbsp_word_length tx_word_length; - omap_mcbsp_io_type_t io_type; /* IRQ or poll */ /* IRQ based TX/RX */ int rx_irq; int tx_irq; @@ -65,19 +64,10 @@ struct omap_mcbsp { }; static struct omap_mcbsp mcbsp[OMAP_MAX_MCBSP_COUNT]; -#ifdef CONFIG_ARCH_OMAP1 static struct clk *mcbsp_dsp_ck = 0; static struct clk *mcbsp_api_ck = 0; static struct clk *mcbsp_dspxor_ck = 0; -#endif -#ifdef CONFIG_ARCH_OMAP2 -static struct clk *mcbsp1_ick = 0; -static struct clk *mcbsp1_fck = 0; -static struct clk *mcbsp2_ick = 0; -static struct clk *mcbsp2_fck = 0; -static struct clk *sys_ck = 0; -static struct clk *sys_clkout = 0; -#endif + static void omap_mcbsp_dump_reg(u8 id) { @@ -98,6 +88,7 @@ static void omap_mcbsp_dump_reg(u8 id) DBG("***********************\n"); } + static irqreturn_t omap_mcbsp_tx_irq_handler(int irq, void *dev_id, struct pt_regs *regs) { struct omap_mcbsp * mcbsp_tx = (struct omap_mcbsp *)(dev_id); @@ -118,6 +109,7 @@ static irqreturn_t omap_mcbsp_rx_irq_handler(int irq, void *dev_id, struct pt_re return IRQ_HANDLED; } + static void omap_mcbsp_tx_dma_callback(int lch, u16 ch_status, void *data) { struct omap_mcbsp * mcbsp_dma_tx = (struct omap_mcbsp *)(data); @@ -184,7 +176,7 @@ static int omap_mcbsp_check(unsigned int id) return 0; } - if (cpu_is_omap15xx() || cpu_is_omap16xx() || cpu_is_omap24xx()) { + if (cpu_is_omap1510() || cpu_is_omap16xx()) { if (id > OMAP_MAX_MCBSP_COUNT) { printk(KERN_ERR "OMAP-McBSP: McBSP%d doesn't exist\n", id + 1); return -1; @@ -195,10 +187,9 @@ static int omap_mcbsp_check(unsigned int id) return -1; } -#ifdef CONFIG_ARCH_OMAP1 static void omap_mcbsp_dsp_request(void) { - if (cpu_is_omap15xx() || cpu_is_omap16xx()) { + if (cpu_is_omap1510() || cpu_is_omap16xx()) { clk_enable(mcbsp_dsp_ck); clk_enable(mcbsp_api_ck); @@ -216,49 +207,12 @@ static void omap_mcbsp_dsp_request(void) static void omap_mcbsp_dsp_free(void) { - if (cpu_is_omap15xx() || cpu_is_omap16xx()) { + if (cpu_is_omap1510() || cpu_is_omap16xx()) { clk_disable(mcbsp_dspxor_ck); clk_disable(mcbsp_dsp_ck); clk_disable(mcbsp_api_ck); } } -#endif - -#ifdef CONFIG_ARCH_OMAP2 -static void omap2_mcbsp2_mux_setup(void) -{ - omap_cfg_reg(Y15_24XX_MCBSP2_CLKX); - omap_cfg_reg(R14_24XX_MCBSP2_FSX); - omap_cfg_reg(W15_24XX_MCBSP2_DR); - omap_cfg_reg(V15_24XX_MCBSP2_DX); - omap_cfg_reg(V14_24XX_GPIO117); - omap_cfg_reg(W14_24XX_SYS_CLKOUT); -} -#endif - -/* - * We can choose between IRQ based or polled IO. - * This needs to be called before omap_mcbsp_request(). - */ -int omap_mcbsp_set_io_type(unsigned int id, omap_mcbsp_io_type_t io_type) -{ - if (omap_mcbsp_check(id) < 0) - return -EINVAL; - - spin_lock(&mcbsp[id].lock); - - if (!mcbsp[id].free) { - printk (KERN_ERR "OMAP-McBSP: McBSP%d is currently in use\n", id + 1); - spin_unlock(&mcbsp[id].lock); - return -EINVAL; - } - - mcbsp[id].io_type = io_type; - - spin_unlock(&mcbsp[id].lock); - - return 0; -} int omap_mcbsp_request(unsigned int id) { @@ -267,26 +221,12 @@ int omap_mcbsp_request(unsigned int id) if (omap_mcbsp_check(id) < 0) return -EINVAL; -#ifdef CONFIG_ARCH_OMAP1 /* * On 1510, 1610 and 1710, McBSP1 and McBSP3 * are DSP public peripherals. */ if (id == OMAP_MCBSP1 || id == OMAP_MCBSP3) omap_mcbsp_dsp_request(); -#endif - -#ifdef CONFIG_ARCH_OMAP2 - if (cpu_is_omap24xx()) { - if (id == OMAP_MCBSP1) { - clk_enable(mcbsp1_ick); - clk_enable(mcbsp1_fck); - } else { - clk_enable(mcbsp2_ick); - clk_enable(mcbsp2_fck); - } - } -#endif spin_lock(&mcbsp[id].lock); if (!mcbsp[id].free) { @@ -298,33 +238,30 @@ int omap_mcbsp_request(unsigned int id) mcbsp[id].free = 0; spin_unlock(&mcbsp[id].lock); - if (mcbsp[id].io_type == OMAP_MCBSP_IRQ_IO) { - /* We need to get IRQs here */ - err = request_irq(mcbsp[id].tx_irq, omap_mcbsp_tx_irq_handler, 0, - "McBSP", - (void *) (&mcbsp[id])); - if (err != 0) { - printk(KERN_ERR "OMAP-McBSP: Unable to request TX IRQ %d for McBSP%d\n", - mcbsp[id].tx_irq, mcbsp[id].id); - return err; - } - - init_completion(&(mcbsp[id].tx_irq_completion)); + /* We need to get IRQs here */ + err = request_irq(mcbsp[id].tx_irq, omap_mcbsp_tx_irq_handler, 0, + "McBSP", + (void *) (&mcbsp[id])); + if (err != 0) { + printk(KERN_ERR "OMAP-McBSP: Unable to request TX IRQ %d for McBSP%d\n", + mcbsp[id].tx_irq, mcbsp[id].id); + return err; + } + init_completion(&(mcbsp[id].tx_irq_completion)); - err = request_irq(mcbsp[id].rx_irq, omap_mcbsp_rx_irq_handler, 0, - "McBSP", - (void *) (&mcbsp[id])); - if (err != 0) { - printk(KERN_ERR "OMAP-McBSP: Unable to request RX IRQ %d for McBSP%d\n", - mcbsp[id].rx_irq, mcbsp[id].id); - free_irq(mcbsp[id].tx_irq, (void *) (&mcbsp[id])); - return err; - } - init_completion(&(mcbsp[id].rx_irq_completion)); + err = request_irq(mcbsp[id].rx_irq, omap_mcbsp_rx_irq_handler, 0, + "McBSP", + (void *) (&mcbsp[id])); + if (err != 0) { + printk(KERN_ERR "OMAP-McBSP: Unable to request RX IRQ %d for McBSP%d\n", + mcbsp[id].rx_irq, mcbsp[id].id); + free_irq(mcbsp[id].tx_irq, (void *) (&mcbsp[id])); + return err; } + init_completion(&(mcbsp[id].rx_irq_completion)); return 0; } @@ -334,24 +271,8 @@ void omap_mcbsp_free(unsigned int id) if (omap_mcbsp_check(id) < 0) return; -#ifdef CONFIG_ARCH_OMAP1 - if (cpu_class_is_omap1()) { - if (id == OMAP_MCBSP1 || id == OMAP_MCBSP3) - omap_mcbsp_dsp_free(); - } -#endif - -#ifdef CONFIG_ARCH_OMAP2 - if (cpu_is_omap24xx()) { - if (id == OMAP_MCBSP1) { - clk_disable(mcbsp1_ick); - clk_disable(mcbsp1_fck); - } else { - clk_disable(mcbsp2_ick); - clk_disable(mcbsp2_fck); - } - } -#endif + if (id == OMAP_MCBSP1 || id == OMAP_MCBSP3) + omap_mcbsp_dsp_free(); spin_lock(&mcbsp[id].lock); if (mcbsp[id].free) { @@ -363,11 +284,9 @@ void omap_mcbsp_free(unsigned int id) mcbsp[id].free = 1; spin_unlock(&mcbsp[id].lock); - if (mcbsp[id].io_type == OMAP_MCBSP_IRQ_IO) { - /* Free IRQs */ - free_irq(mcbsp[id].rx_irq, (void *) (&mcbsp[id])); - free_irq(mcbsp[id].tx_irq, (void *) (&mcbsp[id])); - } + /* Free IRQs */ + free_irq(mcbsp[id].rx_irq, (void *) (&mcbsp[id])); + free_irq(mcbsp[id].tx_irq, (void *) (&mcbsp[id])); } /* @@ -542,115 +461,6 @@ u32 omap_mcbsp_recv_word(unsigned int id) } -int omap_mcbsp_spi_master_xmit_word_poll(unsigned int id, u32 word) -{ - u32 io_base = mcbsp[id].io_base; - omap_mcbsp_word_length tx_word_length = mcbsp[id].tx_word_length; - omap_mcbsp_word_length rx_word_length = mcbsp[id].rx_word_length; - u16 spcr2, spcr1, attempts = 0, word_lsb, word_msb = 0; - - if (tx_word_length != rx_word_length) - return -EINVAL; - - /* First we wait for the transmitter to be ready */ - spcr2 = OMAP_MCBSP_READ(io_base, SPCR2); - while (!(spcr2 & XRDY)) { - spcr2 = OMAP_MCBSP_READ(io_base, SPCR2); - if (attempts++ > 1000) { - /* We must reset the transmitter */ - OMAP_MCBSP_WRITE(io_base, SPCR2, spcr2 & (~XRST)); - udelay(10); - OMAP_MCBSP_WRITE(io_base, SPCR2, spcr2 | XRST); - udelay(10); - printk("McBSP transmitter not ready\n"); - return -EAGAIN; - } - } - - /* Now we can push the data */ - if (tx_word_length > OMAP_MCBSP_WORD_16) - OMAP_MCBSP_WRITE(io_base, DXR2, word >> 16); - OMAP_MCBSP_WRITE(io_base, DXR1, word & 0xffff); - - /* We wait for the receiver to be ready */ - spcr1 = OMAP_MCBSP_READ(io_base, SPCR1); - while (!(spcr1 & RRDY)) { - spcr1 = OMAP_MCBSP_READ(io_base, SPCR1); - if (attempts++ > 1000) { - /* We must reset the receiver */ - OMAP_MCBSP_WRITE(io_base, SPCR1, spcr1 & (~RRST)); - udelay(10); - OMAP_MCBSP_WRITE(io_base, SPCR1, spcr1 | RRST); - udelay(10); - printk("McBSP receiver not ready\n"); - return -EAGAIN; - } - } - - /* Receiver is ready, let's read the dummy data */ - if (rx_word_length > OMAP_MCBSP_WORD_16) - word_msb = OMAP_MCBSP_READ(io_base, DRR2); - word_lsb = OMAP_MCBSP_READ(io_base, DRR1); - - return 0; -} - -int omap_mcbsp_spi_master_recv_word_poll(unsigned int id, u32 * word) -{ - u32 io_base = mcbsp[id].io_base, clock_word = 0; - omap_mcbsp_word_length tx_word_length = mcbsp[id].tx_word_length; - omap_mcbsp_word_length rx_word_length = mcbsp[id].rx_word_length; - u16 spcr2, spcr1, attempts = 0, word_lsb, word_msb = 0; - - if (tx_word_length != rx_word_length) - return -EINVAL; - - /* First we wait for the transmitter to be ready */ - spcr2 = OMAP_MCBSP_READ(io_base, SPCR2); - while (!(spcr2 & XRDY)) { - spcr2 = OMAP_MCBSP_READ(io_base, SPCR2); - if (attempts++ > 1000) { - /* We must reset the transmitter */ - OMAP_MCBSP_WRITE(io_base, SPCR2, spcr2 & (~XRST)); - udelay(10); - OMAP_MCBSP_WRITE(io_base, SPCR2, spcr2 | XRST); - udelay(10); - printk("McBSP transmitter not ready\n"); - return -EAGAIN; - } - } - - /* We first need to enable the bus clock */ - if (tx_word_length > OMAP_MCBSP_WORD_16) - OMAP_MCBSP_WRITE(io_base, DXR2, clock_word >> 16); - OMAP_MCBSP_WRITE(io_base, DXR1, clock_word & 0xffff); - - /* We wait for the receiver to be ready */ - spcr1 = OMAP_MCBSP_READ(io_base, SPCR1); - while (!(spcr1 & RRDY)) { - spcr1 = OMAP_MCBSP_READ(io_base, SPCR1); - if (attempts++ > 1000) { - /* We must reset the receiver */ - OMAP_MCBSP_WRITE(io_base, SPCR1, spcr1 & (~RRST)); - udelay(10); - OMAP_MCBSP_WRITE(io_base, SPCR1, spcr1 | RRST); - udelay(10); - printk("McBSP receiver not ready\n"); - return -EAGAIN; - } - } - - /* Receiver is ready, there is something for us */ - if (rx_word_length > OMAP_MCBSP_WORD_16) - word_msb = OMAP_MCBSP_READ(io_base, DRR2); - word_lsb = OMAP_MCBSP_READ(io_base, DRR1); - - word[0] = (word_lsb | (word_msb << 16)); - - return 0; -} - - /* * Simple DMA based buffer rx/tx routines. * Nothing fancy, just a single buffer tx/rx through DMA. @@ -661,9 +471,6 @@ int omap_mcbsp_spi_master_recv_word_poll(unsigned int id, u32 * word) int omap_mcbsp_xmit_buffer(unsigned int id, dma_addr_t buffer, unsigned int length) { int dma_tx_ch; - int src_port = 0; - int dest_port = 0; - int sync_dev = 0; if (omap_mcbsp_check(id) < 0) return -EINVAL; @@ -680,27 +487,20 @@ int omap_mcbsp_xmit_buffer(unsigned int id, dma_addr_t buffer, unsigned int leng init_completion(&(mcbsp[id].tx_dma_completion)); - if (cpu_class_is_omap1()) { - src_port = OMAP_DMA_PORT_TIPB; - dest_port = OMAP_DMA_PORT_EMIFF; - } - if (cpu_is_omap24xx()) - sync_dev = mcbsp[id].dma_tx_sync; - omap_set_dma_transfer_params(mcbsp[id].dma_tx_lch, OMAP_DMA_DATA_TYPE_S16, length >> 1, 1, OMAP_DMA_SYNC_ELEMENT, - sync_dev, 0); + 0, 0); omap_set_dma_dest_params(mcbsp[id].dma_tx_lch, - src_port, + OMAP_DMA_PORT_TIPB, OMAP_DMA_AMODE_CONSTANT, mcbsp[id].io_base + OMAP_MCBSP_REG_DXR1, 0, 0); omap_set_dma_src_params(mcbsp[id].dma_tx_lch, - dest_port, + OMAP_DMA_PORT_EMIFF, OMAP_DMA_AMODE_POST_INC, buffer, 0, 0); @@ -714,9 +514,6 @@ int omap_mcbsp_xmit_buffer(unsigned int id, dma_addr_t buffer, unsigned int leng int omap_mcbsp_recv_buffer(unsigned int id, dma_addr_t buffer, unsigned int length) { int dma_rx_ch; - int src_port = 0; - int dest_port = 0; - int sync_dev = 0; if (omap_mcbsp_check(id) < 0) return -EINVAL; @@ -733,27 +530,20 @@ int omap_mcbsp_recv_buffer(unsigned int id, dma_addr_t buffer, unsigned int leng init_completion(&(mcbsp[id].rx_dma_completion)); - if (cpu_class_is_omap1()) { - src_port = OMAP_DMA_PORT_TIPB; - dest_port = OMAP_DMA_PORT_EMIFF; - } - if (cpu_is_omap24xx()) - sync_dev = mcbsp[id].dma_rx_sync; - omap_set_dma_transfer_params(mcbsp[id].dma_rx_lch, OMAP_DMA_DATA_TYPE_S16, length >> 1, 1, OMAP_DMA_SYNC_ELEMENT, - sync_dev, 0); + 0, 0); omap_set_dma_src_params(mcbsp[id].dma_rx_lch, - src_port, + OMAP_DMA_PORT_TIPB, OMAP_DMA_AMODE_CONSTANT, mcbsp[id].io_base + OMAP_MCBSP_REG_DRR1, 0, 0); omap_set_dma_dest_params(mcbsp[id].dma_rx_lch, - dest_port, + OMAP_DMA_PORT_EMIFF, OMAP_DMA_AMODE_POST_INC, buffer, 0, 0); @@ -898,23 +688,6 @@ static const struct omap_mcbsp_info mcbsp_1610[] = { }; #endif -#if defined(CONFIG_ARCH_OMAP24XX) -static const struct omap_mcbsp_info mcbsp_24xx[] = { - [0] = { .virt_base = IO_ADDRESS(OMAP24XX_MCBSP1_BASE), - .dma_rx_sync = OMAP24XX_DMA_MCBSP1_RX, - .dma_tx_sync = OMAP24XX_DMA_MCBSP1_TX, - .rx_irq = INT_24XX_MCBSP1_IRQ_RX, - .tx_irq = INT_24XX_MCBSP1_IRQ_TX, - }, - [1] = { .virt_base = IO_ADDRESS(OMAP24XX_MCBSP2_BASE), - .dma_rx_sync = OMAP24XX_DMA_MCBSP2_RX, - .dma_tx_sync = OMAP24XX_DMA_MCBSP2_TX, - .rx_irq = INT_24XX_MCBSP2_IRQ_RX, - .tx_irq = INT_24XX_MCBSP2_IRQ_TX, - }, -}; -#endif - static int __init omap_mcbsp_init(void) { int mcbsp_count = 0, i; @@ -922,7 +695,6 @@ static int __init omap_mcbsp_init(void) printk("Initializing OMAP McBSP system\n"); -#ifdef CONFIG_ARCH_OMAP1 mcbsp_dsp_ck = clk_get(0, "dsp_ck"); if (IS_ERR(mcbsp_dsp_ck)) { printk(KERN_ERR "mcbsp: could not acquire dsp_ck handle.\n"); @@ -938,29 +710,6 @@ static int __init omap_mcbsp_init(void) printk(KERN_ERR "mcbsp: could not acquire dspxor_ck handle.\n"); return PTR_ERR(mcbsp_dspxor_ck); } -#endif -#ifdef CONFIG_ARCH_OMAP2 - mcbsp1_ick = clk_get(0, "mcbsp1_ick"); - if (IS_ERR(mcbsp1_ick)) { - printk(KERN_ERR "mcbsp: could not acquire mcbsp1_ick handle.\n"); - return PTR_ERR(mcbsp1_ick); - } - mcbsp1_fck = clk_get(0, "mcbsp1_fck"); - if (IS_ERR(mcbsp1_fck)) { - printk(KERN_ERR "mcbsp: could not acquire mcbsp1_fck handle.\n"); - return PTR_ERR(mcbsp1_fck); - } - mcbsp2_ick = clk_get(0, "mcbsp2_ick"); - if (IS_ERR(mcbsp2_ick)) { - printk(KERN_ERR "mcbsp: could not acquire mcbsp2_ick handle.\n"); - return PTR_ERR(mcbsp2_ick); - } - mcbsp2_fck = clk_get(0, "mcbsp2_fck"); - if (IS_ERR(mcbsp2_fck)) { - printk(KERN_ERR "mcbsp: could not acquire mcbsp2_fck handle.\n"); - return PTR_ERR(mcbsp2_fck); - } -#endif #ifdef CONFIG_ARCH_OMAP730 if (cpu_is_omap730()) { @@ -969,7 +718,7 @@ static int __init omap_mcbsp_init(void) } #endif #ifdef CONFIG_ARCH_OMAP15XX - if (cpu_is_omap15xx()) { + if (cpu_is_omap1510()) { mcbsp_info = mcbsp_1510; mcbsp_count = ARRAY_SIZE(mcbsp_1510); } @@ -979,19 +728,6 @@ static int __init omap_mcbsp_init(void) mcbsp_info = mcbsp_1610; mcbsp_count = ARRAY_SIZE(mcbsp_1610); } -#endif -#if defined(CONFIG_ARCH_OMAP24XX) - if (cpu_is_omap24xx()) { - mcbsp_info = mcbsp_24xx; - mcbsp_count = ARRAY_SIZE(mcbsp_24xx); - - /* REVISIT: where's the right place? */ - omap2_mcbsp2_mux_setup(); - sys_ck = clk_get(0, "sys_ck"); - sys_clkout = clk_get(0, "sys_clkout"); - clk_set_parent(sys_clkout, sys_ck); - clk_enable(sys_clkout); - } #endif for (i = 0; i < OMAP_MAX_MCBSP_COUNT ; i++) { if (i >= mcbsp_count) { @@ -1005,7 +741,6 @@ static int __init omap_mcbsp_init(void) mcbsp[i].dma_rx_lch = -1; mcbsp[i].io_base = mcbsp_info[i].virt_base; - mcbsp[i].io_type = OMAP_MCBSP_IRQ_IO; /* Default I/O is IRQ based */ mcbsp[i].tx_irq = mcbsp_info[i].tx_irq; mcbsp[i].rx_irq = mcbsp_info[i].rx_irq; mcbsp[i].dma_rx_sync = mcbsp_info[i].dma_rx_sync; @@ -1016,11 +751,11 @@ static int __init omap_mcbsp_init(void) return 0; } + arch_initcall(omap_mcbsp_init); EXPORT_SYMBOL(omap_mcbsp_config); EXPORT_SYMBOL(omap_mcbsp_request); -EXPORT_SYMBOL(omap_mcbsp_set_io_type); EXPORT_SYMBOL(omap_mcbsp_free); EXPORT_SYMBOL(omap_mcbsp_start); EXPORT_SYMBOL(omap_mcbsp_stop); @@ -1028,6 +763,4 @@ EXPORT_SYMBOL(omap_mcbsp_xmit_word); EXPORT_SYMBOL(omap_mcbsp_recv_word); EXPORT_SYMBOL(omap_mcbsp_xmit_buffer); EXPORT_SYMBOL(omap_mcbsp_recv_buffer); -EXPORT_SYMBOL(omap_mcbsp_spi_master_xmit_word_poll); -EXPORT_SYMBOL(omap_mcbsp_spi_master_recv_word_poll); EXPORT_SYMBOL(omap_mcbsp_set_spi_mode); diff --git a/arch/arm/plat-omap/mux.c b/arch/arm/plat-omap/mux.c index 042105ac3..8c1c016aa 100644 --- a/arch/arm/plat-omap/mux.c +++ b/arch/arm/plat-omap/mux.c @@ -22,6 +22,7 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ +#include #include #include #include diff --git a/arch/arm/plat-omap/ocpi.c b/arch/arm/plat-omap/ocpi.c index b5d307026..5cc6775c7 100644 --- a/arch/arm/plat-omap/ocpi.c +++ b/arch/arm/plat-omap/ocpi.c @@ -23,6 +23,7 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +#include #include #include #include @@ -61,6 +62,9 @@ int ocpi_enable(void) if (!cpu_is_omap16xx()) return -ENODEV; + /* Make sure there's clock for OCPI */ + clk_enable(ocpi_ck); + /* Enable access for OHCI in OCPI */ val = omap_readl(OCPI_PROT); val &= ~0xff; diff --git a/arch/arm/plat-omap/pm.c b/arch/arm/plat-omap/pm.c index 04b410272..093efd786 100644 --- a/arch/arm/plat-omap/pm.c +++ b/arch/arm/plat-omap/pm.c @@ -38,7 +38,6 @@ #include #include #include -#include #include #include @@ -580,7 +579,7 @@ static irqreturn_t omap_wakeup_interrupt(int irq, void * dev, static struct irqaction omap_wakeup_irq = { .name = "peripheral wakeup", - .flags = IRQF_DISABLED, + .flags = SA_INTERRUPT, .handler = omap_wakeup_interrupt }; diff --git a/arch/arm/plat-omap/sram-fn.S b/arch/arm/plat-omap/sram-fn.S index 85cffe2c6..66414cc8e 100644 --- a/arch/arm/plat-omap/sram-fn.S +++ b/arch/arm/plat-omap/sram-fn.S @@ -8,6 +8,7 @@ * published by the Free Software Foundation. */ +#include #include #include #include diff --git a/arch/arm/plat-omap/sram.c b/arch/arm/plat-omap/sram.c index e75718301..ee82763b0 100644 --- a/arch/arm/plat-omap/sram.c +++ b/arch/arm/plat-omap/sram.c @@ -11,98 +11,29 @@ * published by the Free Software Foundation. */ +#include #include #include #include +#include #include #include #include -#include - #include -#include #define OMAP1_SRAM_PA 0x20000000 #define OMAP1_SRAM_VA 0xd0000000 #define OMAP2_SRAM_PA 0x40200000 -#define OMAP2_SRAM_PUB_PA 0x4020f800 #define OMAP2_SRAM_VA 0xd0000000 -#define OMAP2_SRAM_PUB_VA 0xd0000800 -#if defined(CONFIG_ARCH_OMAP24XX) -#define SRAM_BOOTLOADER_SZ 0x00 -#else #define SRAM_BOOTLOADER_SZ 0x80 -#endif - -#define VA_REQINFOPERM0 IO_ADDRESS(0x68005048) -#define VA_READPERM0 IO_ADDRESS(0x68005050) -#define VA_WRITEPERM0 IO_ADDRESS(0x68005058) -#define VA_CONTROL_STAT IO_ADDRESS(0x480002F8) -#define GP_DEVICE 0x300 -#define TYPE_MASK 0x700 - -#define ROUND_DOWN(value,boundary) ((value) & (~((boundary)-1))) static unsigned long omap_sram_base; static unsigned long omap_sram_size; static unsigned long omap_sram_ceil; -unsigned long omap_fb_sram_start; -unsigned long omap_fb_sram_size; - -/* Depending on the target RAMFS firewall setup, the public usable amount of - * SRAM varies. The default accessable size for all device types is 2k. A GP - * device allows ARM11 but not other initators for full size. This - * functionality seems ok until some nice security API happens. - */ -static int is_sram_locked(void) -{ - int type = 0; - - if (cpu_is_omap242x()) - type = __raw_readl(VA_CONTROL_STAT) & TYPE_MASK; - - if (type == GP_DEVICE) { - /* RAMFW: R/W access to all initators for all qualifier sets */ - if (cpu_is_omap242x()) { - __raw_writel(0xFF, VA_REQINFOPERM0); /* all q-vects */ - __raw_writel(0xCFDE, VA_READPERM0); /* all i-read */ - __raw_writel(0xCFDE, VA_WRITEPERM0); /* all i-write */ - } - return 0; - } else - return 1; /* assume locked with no PPA or security driver */ -} - -void get_fb_sram_conf(unsigned long start_avail, unsigned size_avail, - unsigned long *start, unsigned long *size) -{ - const struct omap_fbmem_config *fbmem_conf; - - fbmem_conf = omap_get_config(OMAP_TAG_FBMEM, struct omap_fbmem_config); - if (fbmem_conf != NULL) { - *start = fbmem_conf->fb_sram_start; - *size = fbmem_conf->fb_sram_size; - } else { - *size = 0; - *start = 0; - } - - if (*size && ( - *start < start_avail || - *start + *size > start_avail + size_avail)) { - printk(KERN_ERR "invalid FB SRAM configuration\n"); - *start = start_avail; - *size = size_avail; - } - - if (*size) - pr_info("Reserving %lu bytes SRAM for frame buffer\n", *size); -} - /* * The amount of SRAM depends on the core type. * Note that we cannot try to test for SRAM here because writes @@ -111,45 +42,26 @@ void get_fb_sram_conf(unsigned long start_avail, unsigned size_avail, */ void __init omap_detect_sram(void) { - unsigned long sram_start; - - if (cpu_is_omap24xx()) { - if (is_sram_locked()) { - omap_sram_base = OMAP2_SRAM_PUB_VA; - sram_start = OMAP2_SRAM_PUB_PA; - omap_sram_size = 0x800; /* 2K */ - } else { - omap_sram_base = OMAP2_SRAM_VA; - sram_start = OMAP2_SRAM_PA; - if (cpu_is_omap242x()) - omap_sram_size = 0xa0000; /* 640K */ - else if (cpu_is_omap243x()) - omap_sram_size = 0x10000; /* 64K */ - } - } else { + if (!cpu_is_omap24xx()) omap_sram_base = OMAP1_SRAM_VA; - sram_start = OMAP1_SRAM_PA; - - if (cpu_is_omap730()) - omap_sram_size = 0x32000; /* 200K */ - else if (cpu_is_omap15xx()) - omap_sram_size = 0x30000; /* 192K */ - else if (cpu_is_omap1610() || cpu_is_omap1621() || - cpu_is_omap1710()) - omap_sram_size = 0x4000; /* 16K */ - else if (cpu_is_omap1611()) - omap_sram_size = 0x3e800; /* 250K */ - else { - printk(KERN_ERR "Could not detect SRAM size\n"); - omap_sram_size = 0x4000; - } + else + omap_sram_base = OMAP2_SRAM_VA; + + if (cpu_is_omap730()) + omap_sram_size = 0x32000; /* 200K */ + else if (cpu_is_omap15xx()) + omap_sram_size = 0x30000; /* 192K */ + else if (cpu_is_omap1610() || cpu_is_omap1621() || cpu_is_omap1710()) + omap_sram_size = 0x4000; /* 16K */ + else if (cpu_is_omap1611()) + omap_sram_size = 0x3e800; /* 250K */ + else if (cpu_is_omap2420()) + omap_sram_size = 0xa0014; /* 640K */ + else { + printk(KERN_ERR "Could not detect SRAM size\n"); + omap_sram_size = 0x4000; } - get_fb_sram_conf(sram_start + SRAM_BOOTLOADER_SZ, - omap_sram_size - SRAM_BOOTLOADER_SZ, - &omap_fb_sram_start, &omap_fb_sram_size); - if (omap_fb_sram_size) - omap_sram_size -= sram_start + omap_sram_size - - omap_fb_sram_start; + omap_sram_ceil = omap_sram_base + omap_sram_size; } @@ -157,37 +69,31 @@ static struct map_desc omap_sram_io_desc[] __initdata = { { /* .length gets filled in at runtime */ .virtual = OMAP1_SRAM_VA, .pfn = __phys_to_pfn(OMAP1_SRAM_PA), - .type = MT_MEMORY + .type = MT_DEVICE } }; /* - * Note that we cannot use ioremap for SRAM, as clock init needs SRAM early. + * In order to use last 2kB of SRAM on 1611b, we must round the size + * up to multiple of PAGE_SIZE. We cannot use ioremap for SRAM, as + * clock init needs SRAM early. */ void __init omap_map_sram(void) { - unsigned long base; - if (omap_sram_size == 0) return; if (cpu_is_omap24xx()) { omap_sram_io_desc[0].virtual = OMAP2_SRAM_VA; - - if (is_sram_locked()) - base = OMAP2_SRAM_PUB_PA; - else - base = OMAP2_SRAM_PA; - base = ROUND_DOWN(base, PAGE_SIZE); - omap_sram_io_desc[0].pfn = __phys_to_pfn(base); + omap_sram_io_desc[0].pfn = __phys_to_pfn(OMAP2_SRAM_PA); } - omap_sram_io_desc[0].length = 1024 * 1024; /* Use section desc */ + omap_sram_io_desc[0].length = (omap_sram_size + PAGE_SIZE-1)/PAGE_SIZE; + omap_sram_io_desc[0].length *= PAGE_SIZE; iotable_init(omap_sram_io_desc, ARRAY_SIZE(omap_sram_io_desc)); printk(KERN_INFO "SRAM: Mapped pa 0x%08lx to va 0x%08lx size: 0x%lx\n", - __pfn_to_phys(omap_sram_io_desc[0].pfn), - omap_sram_io_desc[0].virtual, + omap_sram_io_desc[0].pfn, omap_sram_io_desc[0].virtual, omap_sram_io_desc[0].length); /* @@ -212,9 +118,8 @@ void * omap_sram_push(void * start, unsigned long size) printk(KERN_ERR "Not enough space in SRAM\n"); return NULL; } - omap_sram_ceil -= size; - omap_sram_ceil = ROUND_DOWN(omap_sram_ceil, sizeof(void *)); + omap_sram_ceil &= ~0x3; memcpy((void *)omap_sram_ceil, start, size); return (void *)omap_sram_ceil; diff --git a/arch/arm/plat-omap/usb.c b/arch/arm/plat-omap/usb.c index 9b815327b..00afc7a8c 100644 --- a/arch/arm/plat-omap/usb.c +++ b/arch/arm/plat-omap/usb.c @@ -20,6 +20,7 @@ #undef DEBUG +#include #include #include #include diff --git a/arch/arm/tools/mach-types b/arch/arm/tools/mach-types index e1372a253..8ab5300dc 100644 --- a/arch/arm/tools/mach-types +++ b/arch/arm/tools/mach-types @@ -12,7 +12,7 @@ # # http://www.arm.linux.org.uk/developer/machines/?action=new # -# Last update: Mon Jun 26 22:26:08 2006 +# Last update: Mon Feb 20 10:18:02 2006 # # machine_is_xxx CONFIG_xxxx MACH_TYPE_xxx number # @@ -566,8 +566,8 @@ switchgrass MACH_SWITCHGRASS SWITCHGRASS 549 ens_cmu MACH_ENS_CMU ENS_CMU 550 mm6_sdb MACH_MM6_SDB MM6_SDB 551 saturn MACH_SATURN SATURN 552 -i30030evb MACH_I30030EVB I30030EVB 553 -mxc27530evb MACH_MXC27530EVB MXC27530EVB 554 +argonplusevb MACH_ARGONPLUSEVB ARGONPLUSEVB 553 +scma11evb MACH_SCMA11EVB SCMA11EVB 554 smdk2800 MACH_SMDK2800 SMDK2800 555 mtwilson MACH_MTWILSON MTWILSON 556 ziti MACH_ZITI ZITI 557 @@ -647,7 +647,7 @@ sendt MACH_SENDT SENDT 630 mx2jazz MACH_MX2JAZZ MX2JAZZ 631 multiio MACH_MULTIIO MULTIIO 632 hrdisplay MACH_HRDISPLAY HRDISPLAY 633 -mxc27530ads MACH_MXC27530ADS MXC27530ADS 634 +scma11bb MACH_SCMA11BB SCMA11BB 634 trizeps3 MACH_TRIZEPS3 TRIZEPS3 635 zefeerdza MACH_ZEFEERDZA ZEFEERDZA 636 zefeerdzb MACH_ZEFEERDZB ZEFEERDZB 637 @@ -721,7 +721,7 @@ gp32 MACH_GP32 GP32 706 gem MACH_GEM GEM 707 i858 MACH_I858 I858 708 hx2750 MACH_HX2750 HX2750 709 -mxc91131evb MACH_MXC91131EVB MXC91131EVB 710 +zeusevb MACH_ZEUSEVB ZEUSEVB 710 p700 MACH_P700 P700 711 cpe MACH_CPE CPE 712 spitz MACH_SPITZ SPITZ 713 @@ -802,7 +802,7 @@ cpuat91 MACH_CPUAT91 CPUAT91 787 rea9200 MACH_REA9200 REA9200 788 acts_pune_sa1110 MACH_ACTS_PUNE_SA1110 ACTS_PUNE_SA1110 789 ixp425 MACH_IXP425 IXP425 790 -i30030ads MACH_I30030ADS I30030ADS 791 +argonplusodyssey MACH_ARGONPLUSODYSSEY ARGONPLUSODYSSEY 791 perch MACH_PERCH PERCH 792 eis05r1 MACH_EIS05R1 EIS05R1 793 pepperpad MACH_PEPPERPAD PEPPERPAD 794 @@ -827,7 +827,7 @@ micro9l MACH_MICRO9L MICRO9L 812 uc5471dsp MACH_UC5471DSP UC5471DSP 813 sj5471eng MACH_SJ5471ENG SJ5471ENG 814 none MACH_CMPXA26X CMPXA26X 815 -nc1 MACH_NC NC 816 +nc MACH_NC NC 816 omap_palmte MACH_OMAP_PALMTE OMAP_PALMTE 817 ajax52x MACH_AJAX52X AJAX52X 818 siriustar MACH_SIRIUSTAR SIRIUSTAR 819 @@ -930,7 +930,7 @@ netclient MACH_NETCLIENT NETCLIENT 916 xscale_palmtt5 MACH_XSCALE_PALMTT5 XSCALE_PALMTT5 917 xscale_palmtc MACH_OMAP_PALMTC OMAP_PALMTC 918 omap_apollon MACH_OMAP_APOLLON OMAP_APOLLON 919 -mxc30030evb MACH_MXC30030EVB MXC30030EVB 920 +argonlvevb MACH_ARGONLVEVB ARGONLVEVB 920 rea_2d MACH_REA_2D REA_2D 921 eti3e524 MACH_TI3E524 TI3E524 922 ateb9200 MACH_ATEB9200 ATEB9200 923 @@ -965,131 +965,7 @@ sisteron MACH_SISTERON SISTERON 951 rx1950 MACH_RX1950 RX1950 952 tsc_venus MACH_TSC_VENUS TSC_VENUS 953 ds101j MACH_DS101J DS101J 954 -mxc30030ads MACH_MXC30030ADS MXC30030ADS 955 +mxc300_30ads MACH_MXC30030ADS MXC30030ADS 955 fujitsu_wimaxsoc MACH_FUJITSU_WIMAXSOC FUJITSU_WIMAXSOC 956 dualpcmodem MACH_DUALPCMODEM DUALPCMODEM 957 gesbc9312 MACH_GESBC9312 GESBC9312 958 -htcapache MACH_HTCAPACHE HTCAPACHE 959 -ixdp435 MACH_IXDP435 IXDP435 960 -catprovt100 MACH_CATPROVT100 CATPROVT100 961 -picotux1xx MACH_PICOTUX1XX PICOTUX1XX 962 -picotux2xx MACH_PICOTUX2XX PICOTUX2XX 963 -dsmg600 MACH_DSMG600 DSMG600 964 -empc2 MACH_EMPC2 EMPC2 965 -ventura MACH_VENTURA VENTURA 966 -phidget_sbc MACH_PHIDGET_SBC PHIDGET_SBC 967 -ij3k MACH_IJ3K IJ3K 968 -pisgah MACH_PISGAH PISGAH 969 -omap_fsample MACH_OMAP_FSAMPLE OMAP_FSAMPLE 970 -sg720 MACH_SG720 SG720 971 -redfox MACH_REDFOX REDFOX 972 -mysh_ep9315_1 MACH_MYSH_EP9315_1 MYSH_EP9315_1 973 -tpf106 MACH_TPF106 TPF106 974 -at91rm9200kg MACH_AT91RM9200KG AT91RM9200KG 975 -rcmt2 MACH_SLEDB SLEDB 976 -ontrack MACH_ONTRACK ONTRACK 977 -pm1200 MACH_PM1200 PM1200 978 -ess24562 MACH_ESS24XXX ESS24XXX 979 -coremp7 MACH_COREMP7 COREMP7 980 -nexcoder_6446 MACH_NEXCODER_6446 NEXCODER_6446 981 -stvc8380 MACH_STVC8380 STVC8380 982 -teklynx MACH_TEKLYNX TEKLYNX 983 -carbonado MACH_CARBONADO CARBONADO 984 -sysmos_mp730 MACH_SYSMOS_MP730 SYSMOS_MP730 985 -snapper_cl15 MACH_SNAPPER_CL15 SNAPPER_CL15 986 -pgigim MACH_PGIGIM PGIGIM 987 -ptx9160p2 MACH_PTX9160P2 PTX9160P2 988 -dcore1 MACH_DCORE1 DCORE1 989 -victorpxa MACH_VICTORPXA VICTORPXA 990 -mx2dtb MACH_MX2DTB MX2DTB 991 -pxa_irex_er0100 MACH_PXA_IREX_ER0100 PXA_IREX_ER0100 992 -omap_palmz71 MACH_OMAP_PALMZ71 OMAP_PALMZ71 993 -bartec_deg MACH_BARTEC_DEG BARTEC_DEG 994 -hw50251 MACH_HW50251 HW50251 995 -ibox MACH_IBOX IBOX 996 -atlaslh7a404 MACH_ATLASLH7A404 ATLASLH7A404 997 -pt2026 MACH_PT2026 PT2026 998 -htcalpine MACH_HTCALPINE HTCALPINE 999 -bartec_vtu MACH_BARTEC_VTU BARTEC_VTU 1000 -vcoreii MACH_VCOREII VCOREII 1001 -pdnb3 MACH_PDNB3 PDNB3 1002 -htcbeetles MACH_HTCBEETLES HTCBEETLES 1003 -s3c6400 MACH_S3C6400 S3C6400 1004 -s3c2443 MACH_S3C2443 S3C2443 1005 -omap_ldk MACH_OMAP_LDK OMAP_LDK 1006 -smdk2460 MACH_SMDK2460 SMDK2460 1007 -smdk2440 MACH_SMDK2440 SMDK2440 1008 -smdk2412 MACH_SMDK2412 SMDK2412 1009 -webbox MACH_WEBBOX WEBBOX 1010 -cwwndp MACH_CWWNDP CWWNDP 1011 -i839 MACH_DRAGON DRAGON 1012 -opendo_cpu_board MACH_OPENDO_CPU_BOARD OPENDO_CPU_BOARD 1013 -ccm2200 MACH_CCM2200 CCM2200 1014 -etwarm MACH_ETWARM ETWARM 1015 -m93030 MACH_M93030 M93030 1016 -cc7u MACH_CC7U CC7U 1017 -mtt_ranger MACH_MTT_RANGER MTT_RANGER 1018 -nexus MACH_NEXUS NEXUS 1019 -desman MACH_DESMAN DESMAN 1020 -bkde303 MACH_BKDE303 BKDE303 1021 -smdk2413 MACH_SMDK2413 SMDK2413 1022 -aml_m7200 MACH_AML_M7200 AML_M7200 1023 -aml_m5900 MACH_AML_M5900 AML_M5900 1024 -sg640 MACH_SG640 SG640 1025 -edg79524 MACH_EDG79524 EDG79524 1026 -ai2410 MACH_AI2410 AI2410 1027 -ixp465 MACH_IXP465 IXP465 1028 -balloon3 MACH_BALLOON3 BALLOON3 1029 -heins MACH_HEINS HEINS 1030 -mpluseva MACH_MPLUSEVA MPLUSEVA 1031 -rt042 MACH_RT042 RT042 1032 -cwiem MACH_CWIEM CWIEM 1033 -cm_x270 MACH_CM_X270 CM_X270 1034 -cm_x255 MACH_CM_X255 CM_X255 1035 -esh_at91 MACH_ESH_AT91 ESH_AT91 1036 -sandgate3 MACH_SANDGATE3 SANDGATE3 1037 -primo MACH_PRIMO PRIMO 1038 -gemstone MACH_GEMSTONE GEMSTONE 1039 -pronghorn_metro MACH_PRONGHORNMETRO PRONGHORNMETRO 1040 -sidewinder MACH_SIDEWINDER SIDEWINDER 1041 -picomod1 MACH_PICOMOD1 PICOMOD1 1042 -sg590 MACH_SG590 SG590 1043 -akai9307 MACH_AKAI9307 AKAI9307 1044 -fontaine MACH_FONTAINE FONTAINE 1045 -wombat MACH_WOMBAT WOMBAT 1046 -acq300 MACH_ACQ300 ACQ300 1047 -mod_270 MACH_MOD_270 MOD_270 1048 -vmc_vc0820 MACH_VC0820 VC0820 1049 -ani_aim MACH_ANI_AIM ANI_AIM 1050 -jellyfish MACH_JELLYFISH JELLYFISH 1051 -amanita MACH_AMANITA AMANITA 1052 -vlink MACH_VLINK VLINK 1053 -dexflex MACH_DEXFLEX DEXFLEX 1054 -eigen_ttq MACH_EIGEN_TTQ EIGEN_TTQ 1055 -arcom_titan MACH_ARCOM_TITAN ARCOM_TITAN 1056 -tabla MACH_TABLA TABLA 1057 -mdirac3 MACH_MDIRAC3 MDIRAC3 1058 -mrhfbp2 MACH_MRHFBP2 MRHFBP2 1059 -at91rm9200rb MACH_AT91RM9200RB AT91RM9200RB 1060 -ani_apm MACH_ANI_APM ANI_APM 1061 -ella1 MACH_ELLA1 ELLA1 1062 -inhand_pxa27x MACH_INHAND_PXA27X INHAND_PXA27X 1063 -inhand_pxa25x MACH_INHAND_PXA25X INHAND_PXA25X 1064 -empos_xm MACH_EMPOS_XM EMPOS_XM 1065 -empos MACH_EMPOS EMPOS 1066 -empos_tiny MACH_EMPOS_TINY EMPOS_TINY 1067 -empos_sm MACH_EMPOS_SM EMPOS_SM 1068 -egret MACH_EGRET EGRET 1069 -ostrich MACH_OSTRICH OSTRICH 1070 -n50 MACH_N50 N50 1071 -ecbat91 MACH_ECBAT91 ECBAT91 1072 -stareast MACH_STAREAST STAREAST 1073 -dspg_dw MACH_DSPG_DW DSPG_DW 1074 -onearm MACH_ONEARM ONEARM 1075 -mrg110_6 MACH_MRG110_6 MRG110_6 1076 -wrt300nv2 MACH_WRT300NV2 WRT300NV2 1077 -xm_bulverde MACH_XM_BULVERDE XM_BULVERDE 1078 -msm6100 MACH_MSM6100 MSM6100 1079 -eti_b1 MACH_ETI_B1 ETI_B1 1080 -za9l_series MACH_ZILOG_ZA9L ZILOG_ZA9L 1081 -bit2440 MACH_BIT2440 BIT2440 1082 diff --git a/arch/arm/vfp/Makefile b/arch/arm/vfp/Makefile index 7e136e779..afabac31d 100644 --- a/arch/arm/vfp/Makefile +++ b/arch/arm/vfp/Makefile @@ -7,9 +7,6 @@ # EXTRA_CFLAGS := -DDEBUG # EXTRA_AFLAGS := -DDEBUG -AFLAGS :=$(AFLAGS:-msoft-float=-Wa,-mfpu=softvfp+vfp) -LDFLAGS +=--no-warn-mismatch - obj-y += vfp.o -vfp-$(CONFIG_VFP) += vfpmodule.o entry.o vfphw.o vfpsingle.o vfpdouble.o +vfp-$(CONFIG_VFP) += entry.o vfpmodule.o vfphw.o vfpsingle.o vfpdouble.o diff --git a/arch/arm/vfp/entry.S b/arch/arm/vfp/entry.S index 7b595547c..6f17187ab 100644 --- a/arch/arm/vfp/entry.S +++ b/arch/arm/vfp/entry.S @@ -18,12 +18,10 @@ #include #include #include -#include #include .globl do_vfp do_vfp: - enable_irq ldr r4, .LCvfp add r10, r10, #TI_VFPSTATE @ r10 = workspace ldr pc, [r4] @ call VFP entry point diff --git a/arch/arm/vfp/vfp.h b/arch/arm/vfp/vfp.h index 96fdf30f6..4b9795098 100644 --- a/arch/arm/vfp/vfp.h +++ b/arch/arm/vfp/vfp.h @@ -156,7 +156,7 @@ struct vfp_single { }; extern s32 vfp_get_float(unsigned int reg); -extern void vfp_put_float(s32 val, unsigned int reg); +extern void vfp_put_float(unsigned int reg, s32 val); /* * VFP_SINGLE_MANTISSA_BITS - number of bits in the mantissa @@ -267,7 +267,7 @@ struct vfp_double { */ #define VFP_REG_ZERO 16 extern u64 vfp_get_double(unsigned int reg); -extern void vfp_put_double(u64 val, unsigned int reg); +extern void vfp_put_double(unsigned int reg, u64 val); #define VFP_DOUBLE_MANTISSA_BITS (52) #define VFP_DOUBLE_EXPONENT_BITS (11) @@ -341,17 +341,15 @@ static inline int vfp_double_type(struct vfp_double *s) u32 vfp_double_normaliseround(int dd, struct vfp_double *vd, u32 fpscr, u32 exceptions, const char *func); +/* + * System registers + */ +extern u32 vfp_get_sys(unsigned int reg); +extern void vfp_put_sys(unsigned int reg, u32 val); + u32 vfp_estimate_sqrt_significand(u32 exponent, u32 significand); /* * A special flag to tell the normalisation code not to normalise. */ #define VFP_NAN_FLAG 0x100 - -/* - * A bit pattern used to indicate the initial (unset) value of the - * exception mask, in case nothing handles an instruction. This - * doesn't include the NAN flag, which get masked out before - * we check for an error. - */ -#define VFP_EXCEPTION_ERROR ((u32)-1 & ~VFP_NAN_FLAG) diff --git a/arch/arm/vfp/vfpdouble.c b/arch/arm/vfp/vfpdouble.c index add48e36c..9b367a65c 100644 --- a/arch/arm/vfp/vfpdouble.c +++ b/arch/arm/vfp/vfpdouble.c @@ -195,9 +195,9 @@ u32 vfp_double_normaliseround(int dd, struct vfp_double *vd, u32 fpscr, u32 exce s64 d = vfp_double_pack(vd); pr_debug("VFP: %s: d(d%d)=%016llx exceptions=%08x\n", func, dd, d, exceptions); - vfp_put_double(d, dd); + vfp_put_double(dd, d); } - return exceptions; + return exceptions & ~VFP_NAN_FLAG; } /* @@ -250,19 +250,19 @@ vfp_propagate_nan(struct vfp_double *vdd, struct vfp_double *vdn, */ static u32 vfp_double_fabs(int dd, int unused, int dm, u32 fpscr) { - vfp_put_double(vfp_double_packed_abs(vfp_get_double(dm)), dd); + vfp_put_double(dd, vfp_double_packed_abs(vfp_get_double(dm))); return 0; } static u32 vfp_double_fcpy(int dd, int unused, int dm, u32 fpscr) { - vfp_put_double(vfp_get_double(dm), dd); + vfp_put_double(dd, vfp_get_double(dm)); return 0; } static u32 vfp_double_fneg(int dd, int unused, int dm, u32 fpscr) { - vfp_put_double(vfp_double_packed_negate(vfp_get_double(dm)), dd); + vfp_put_double(dd, vfp_double_packed_negate(vfp_get_double(dm))); return 0; } @@ -287,7 +287,7 @@ static u32 vfp_double_fsqrt(int dd, int unused, int dm, u32 fpscr) vdp = &vfp_double_default_qnan; ret = FPSCR_IOC; } - vfp_put_double(vfp_double_pack(vdp), dd); + vfp_put_double(dd, vfp_double_pack(vdp)); return ret; } @@ -465,7 +465,7 @@ static u32 vfp_double_fcvts(int sd, int unused, int dm, u32 fpscr) */ if (tm & (VFP_INFINITY|VFP_NAN)) { vsd.exponent = 255; - if (tm == VFP_QNAN) + if (tm & VFP_NAN) vsd.significand |= VFP_SINGLE_SIGNIFICAND_QNAN; goto pack_nan; } else if (tm & VFP_ZERO) @@ -476,7 +476,7 @@ static u32 vfp_double_fcvts(int sd, int unused, int dm, u32 fpscr) return vfp_single_normaliseround(sd, &vsd, fpscr, exceptions, "fcvts"); pack_nan: - vfp_put_float(vfp_single_pack(&vsd), sd); + vfp_put_float(sd, vfp_single_pack(&vsd)); return exceptions; } @@ -573,7 +573,7 @@ static u32 vfp_double_ftoui(int sd, int unused, int dm, u32 fpscr) pr_debug("VFP: ftoui: d(s%d)=%08x exceptions=%08x\n", sd, d, exceptions); - vfp_put_float(d, sd); + vfp_put_float(sd, d); return exceptions; } @@ -588,7 +588,6 @@ static u32 vfp_double_ftosi(int sd, int unused, int dm, u32 fpscr) struct vfp_double vdm; u32 d, exceptions = 0; int rmode = fpscr & FPSCR_RMODE_MASK; - int tm; vfp_double_unpack(&vdm, vfp_get_double(dm)); vfp_double_dump("VDM", &vdm); @@ -596,14 +595,10 @@ static u32 vfp_double_ftosi(int sd, int unused, int dm, u32 fpscr) /* * Do we have denormalised number? */ - tm = vfp_double_type(&vdm); - if (tm & VFP_DENORMAL) + if (vfp_double_type(&vdm) & VFP_DENORMAL) exceptions |= FPSCR_IDC; - if (tm & VFP_NAN) { - d = 0; - exceptions |= FPSCR_IOC; - } else if (vdm.exponent >= 1023 + 32) { + if (vdm.exponent >= 1023 + 32) { d = 0x7fffffff; if (vdm.sign) d = ~d; @@ -648,7 +643,7 @@ static u32 vfp_double_ftosi(int sd, int unused, int dm, u32 fpscr) pr_debug("VFP: ftosi: d(s%d)=%08x exceptions=%08x\n", sd, d, exceptions); - vfp_put_float((s32)d, sd); + vfp_put_float(sd, (s32)d); return exceptions; } @@ -1084,7 +1079,7 @@ static u32 vfp_double_fdiv(int dd, int dn, int dm, u32 fpscr) vdn_nan: exceptions = vfp_propagate_nan(&vdd, &vdn, &vdm, fpscr); pack: - vfp_put_double(vfp_double_pack(&vdd), dd); + vfp_put_double(dd, vfp_double_pack(&vdd)); return exceptions; vdm_nan: @@ -1104,7 +1099,7 @@ static u32 vfp_double_fdiv(int dd, int dn, int dm, u32 fpscr) goto pack; invalid: - vfp_put_double(vfp_double_pack(&vfp_double_default_qnan), dd); + vfp_put_double(dd, vfp_double_pack(&vfp_double_default_qnan)); return FPSCR_IOC; } @@ -1127,56 +1122,46 @@ u32 vfp_double_cpdo(u32 inst, u32 fpscr) { u32 op = inst & FOP_MASK; u32 exceptions = 0; - unsigned int dest; - unsigned int dn = vfp_get_dn(inst); - unsigned int dm = vfp_get_dm(inst); + unsigned int dd = vfp_get_sd(inst); + unsigned int dn = vfp_get_sn(inst); + unsigned int dm = vfp_get_sm(inst); unsigned int vecitr, veclen, vecstride; u32 (*fop)(int, int, s32, u32); veclen = fpscr & FPSCR_LENGTH_MASK; vecstride = (1 + ((fpscr & FPSCR_STRIDE_MASK) == FPSCR_STRIDE_MASK)) * 2; - /* - * fcvtds takes an sN register number as destination, not dN. - * It also always operates on scalars. - */ - if ((inst & FEXT_MASK) == FEXT_FCVT) { - veclen = 0; - dest = vfp_get_sd(inst); - } else - dest = vfp_get_dd(inst); - /* * If destination bank is zero, vector length is always '1'. * ARM DDI0100F C5.1.3, C5.3.2. */ - if (FREG_BANK(dest) == 0) + if (FREG_BANK(dd) == 0) veclen = 0; pr_debug("VFP: vecstride=%u veclen=%u\n", vecstride, (veclen >> FPSCR_LENGTH_BIT) + 1); - fop = (op == FOP_EXT) ? fop_extfns[FEXT_TO_IDX(inst)] : fop_fns[FOP_TO_IDX(op)]; + fop = (op == FOP_EXT) ? fop_extfns[dn] : fop_fns[FOP_TO_IDX(op)]; if (!fop) goto invalid; for (vecitr = 0; vecitr <= veclen; vecitr += 1 << FPSCR_LENGTH_BIT) { u32 except; - if (op == FOP_EXT && (inst & FEXT_MASK) == FEXT_FCVT) - pr_debug("VFP: itr%d (s%u) = op[%u] (d%u)\n", - vecitr >> FPSCR_LENGTH_BIT, - dest, dn, dm); - else if (op == FOP_EXT) - pr_debug("VFP: itr%d (d%u) = op[%u] (d%u)\n", + if (op == FOP_EXT) + pr_debug("VFP: itr%d (d%u.%u) = op[%u] (d%u.%u)\n", vecitr >> FPSCR_LENGTH_BIT, - dest, dn, dm); + dd >> 1, dd & 1, dn, + dm >> 1, dm & 1); else - pr_debug("VFP: itr%d (d%u) = (d%u) op[%u] (d%u)\n", + pr_debug("VFP: itr%d (d%u.%u) = (d%u.%u) op[%u] (d%u.%u)\n", vecitr >> FPSCR_LENGTH_BIT, - dest, dn, FOP_TO_IDX(op), dm); + dd >> 1, dd & 1, + dn >> 1, dn & 1, + FOP_TO_IDX(op), + dm >> 1, dm & 1); - except = fop(dest, dn, dm, fpscr); + except = fop(dd, dn, dm, fpscr); pr_debug("VFP: itr%d: exceptions=%08x\n", vecitr >> FPSCR_LENGTH_BIT, except); @@ -1194,7 +1179,7 @@ u32 vfp_double_cpdo(u32 inst, u32 fpscr) * we encounter an exception. We continue. */ - dest = FREG_BANK(dest) + ((FREG_IDX(dest) + vecstride) & 6); + dd = FREG_BANK(dd) + ((FREG_IDX(dd) + vecstride) & 6); dn = FREG_BANK(dn) + ((FREG_IDX(dn) + vecstride) & 6); if (FREG_BANK(dm) != 0) dm = FREG_BANK(dm) + ((FREG_IDX(dm) + vecstride) & 6); diff --git a/arch/arm/vfp/vfphw.S b/arch/arm/vfp/vfphw.S index e51e6679c..de4ca1223 100644 --- a/arch/arm/vfp/vfphw.S +++ b/arch/arm/vfp/vfphw.S @@ -102,6 +102,7 @@ vfp_support_entry: VFPFMRX r8, FPINST2, NE @ FPINST2 if needed - avoids reading @ nonexistant reg on rev0 VFPFSTMIA r4 @ save the working registers + add r4, r4, #8*16+4 stmia r4, {r1, r5, r6, r8} @ save FPEXC, FPSCR, FPINST, FPINST2 @ and point r4 at the word at the @ start of the register dump @@ -110,9 +111,10 @@ no_old_VFP_process: DBGSTR1 "load state %p", r10 str r10, [r3] @ update the last_VFP_context pointer @ Load the saved state back into the VFP + add r4, r10, #8*16+4 + ldmia r4, {r1, r5, r6, r8} @ load FPEXC, FPSCR, FPINST, FPINST2 VFPFLDMIA r10 @ reload the working registers while @ FPEXC is in a safe state - ldmia r10, {r1, r5, r6, r8} @ load FPEXC, FPSCR, FPINST, FPINST2 tst r1, #FPEXC_FPV2 @ is there an FPINST2 to write? VFPFMXR FPINST2, r8, NE @ FPINST2 if needed - avoids writing @ nonexistant reg on rev0 @@ -178,21 +180,22 @@ vfp_get_float: .globl vfp_put_float vfp_put_float: - add pc, pc, r1, lsl #3 + add pc, pc, r0, lsl #3 mov r0, r0 .irp dr,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 - mcr p10, 0, r0, c\dr, c0, 0 @ fmsr r0, s0 + mcr p10, 0, r1, c\dr, c0, 0 @ fmsr r0, s0 mov pc, lr - mcr p10, 0, r0, c\dr, c0, 4 @ fmsr r0, s1 + mcr p10, 0, r1, c\dr, c0, 4 @ fmsr r0, s1 mov pc, lr .endr .globl vfp_get_double vfp_get_double: + mov r0, r0, lsr #1 add pc, pc, r0, lsl #3 mov r0, r0 .irp dr,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 - fmrrd r0, r1, d\dr + mrrc p10, 1, r0, r1, c\dr @ fmrrd r0, r1, d\dr mov pc, lr .endr @@ -203,9 +206,10 @@ vfp_get_double: .globl vfp_put_double vfp_put_double: - add pc, pc, r2, lsl #3 + mov r0, r0, lsr #1 + add pc, pc, r0, lsl #3 mov r0, r0 .irp dr,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 - fmdrr d\dr, r0, r1 + mcrr p10, 1, r1, r2, c\dr @ fmrrd r1, r2, d\dr mov pc, lr .endr diff --git a/arch/arm/vfp/vfpmodule.c b/arch/arm/vfp/vfpmodule.c index 4178f6cc3..22f3da4e0 100644 --- a/arch/arm/vfp/vfpmodule.c +++ b/arch/arm/vfp/vfpmodule.c @@ -9,13 +9,12 @@ * published by the Free Software Foundation. */ #include +#include #include #include #include #include #include - -#include #include #include "vfpinstr.h" @@ -37,54 +36,37 @@ union vfp_state *last_VFP_context; */ unsigned int VFP_arch; -static int vfp_notifier(struct notifier_block *self, unsigned long cmd, void *v) +/* + * Per-thread VFP initialisation. + */ +void vfp_flush_thread(union vfp_state *vfp) { - struct thread_info *thread = v; - union vfp_state *vfp = &thread->vfpstate; - - switch (cmd) { - case THREAD_NOTIFY_FLUSH: - /* - * Per-thread VFP initialisation. - */ - memset(vfp, 0, sizeof(union vfp_state)); - - vfp->hard.fpexc = FPEXC_ENABLE; - vfp->hard.fpscr = FPSCR_ROUND_NEAREST; + memset(vfp, 0, sizeof(union vfp_state)); - /* - * Disable VFP to ensure we initialise it first. - */ - fmxr(FPEXC, fmrx(FPEXC) & ~FPEXC_ENABLE); - - /* - * FALLTHROUGH: Ensure we don't try to overwrite our newly - * initialised state information on the first fault. - */ - - case THREAD_NOTIFY_RELEASE: - /* - * Per-thread VFP cleanup. - */ - if (last_VFP_context == vfp) - last_VFP_context = NULL; - break; + vfp->hard.fpexc = FPEXC_ENABLE; + vfp->hard.fpscr = FPSCR_ROUND_NEAREST; - case THREAD_NOTIFY_SWITCH: - /* - * Always disable VFP so we can lazily save/restore the - * old state. - */ - fmxr(FPEXC, fmrx(FPEXC) & ~FPEXC_ENABLE); - break; - } + /* + * Disable VFP to ensure we initialise it first. + */ + fmxr(FPEXC, fmrx(FPEXC) & ~FPEXC_ENABLE); - return NOTIFY_DONE; + /* + * Ensure we don't try to overwrite our newly initialised + * state information on the first fault. + */ + if (last_VFP_context == vfp) + last_VFP_context = NULL; } -static struct notifier_block vfp_notifier_block = { - .notifier_call = vfp_notifier, -}; +/* + * Per-thread VFP cleanup. + */ +void vfp_release_thread(union vfp_state *vfp) +{ + if (last_VFP_context == vfp) + last_VFP_context = NULL; +} /* * Raise a SIGFPE for the current process. @@ -131,7 +113,7 @@ static void vfp_raise_exceptions(u32 exceptions, u32 inst, u32 fpscr, struct pt_ pr_debug("VFP: raising exceptions %08x\n", exceptions); - if (exceptions == VFP_EXCEPTION_ERROR) { + if (exceptions == (u32)-1) { vfp_panic("unhandled bounce"); vfp_raise_sigfpe(0, regs); return; @@ -170,7 +152,7 @@ static void vfp_raise_exceptions(u32 exceptions, u32 inst, u32 fpscr, struct pt_ */ static u32 vfp_emulate_instruction(u32 inst, u32 fpscr, struct pt_regs *regs) { - u32 exceptions = VFP_EXCEPTION_ERROR; + u32 exceptions = (u32)-1; pr_debug("VFP: emulate: INST=0x%08x SCR=0x%08x\n", inst, fpscr); @@ -198,7 +180,7 @@ static u32 vfp_emulate_instruction(u32 inst, u32 fpscr, struct pt_regs *regs) * emulate it. */ } - return exceptions & ~VFP_NAN_FLAG; + return exceptions; } /* @@ -263,7 +245,7 @@ void VFP9_bounce(u32 trigger, u32 fpexc, struct pt_regs *regs) */ barrier(); trigger = fmrx(FPINST2); - orig_fpscr = fpscr = fmrx(FPSCR); + fpscr = fmrx(FPSCR); emulate: exceptions = vfp_emulate_instruction(trigger, fpscr, regs); @@ -299,8 +281,6 @@ static int __init vfp_init(void) (vfpsid & FPSID_VARIANT_MASK) >> FPSID_VARIANT_BIT, (vfpsid & FPSID_REV_MASK) >> FPSID_REV_BIT); vfp_vector = vfp_support_entry; - - thread_register_notifier(&vfp_notifier_block); } return 0; } diff --git a/arch/arm/vfp/vfpsingle.c b/arch/arm/vfp/vfpsingle.c index 8f6c179ca..14dd696dd 100644 --- a/arch/arm/vfp/vfpsingle.c +++ b/arch/arm/vfp/vfpsingle.c @@ -200,10 +200,10 @@ u32 vfp_single_normaliseround(int sd, struct vfp_single *vs, u32 fpscr, u32 exce s32 d = vfp_single_pack(vs); pr_debug("VFP: %s: d(s%d)=%08x exceptions=%08x\n", func, sd, d, exceptions); - vfp_put_float(d, sd); + vfp_put_float(sd, d); } - return exceptions; + return exceptions & ~VFP_NAN_FLAG; } /* @@ -257,19 +257,19 @@ vfp_propagate_nan(struct vfp_single *vsd, struct vfp_single *vsn, */ static u32 vfp_single_fabs(int sd, int unused, s32 m, u32 fpscr) { - vfp_put_float(vfp_single_packed_abs(m), sd); + vfp_put_float(sd, vfp_single_packed_abs(m)); return 0; } static u32 vfp_single_fcpy(int sd, int unused, s32 m, u32 fpscr) { - vfp_put_float(m, sd); + vfp_put_float(sd, m); return 0; } static u32 vfp_single_fneg(int sd, int unused, s32 m, u32 fpscr) { - vfp_put_float(vfp_single_packed_negate(m), sd); + vfp_put_float(sd, vfp_single_packed_negate(m)); return 0; } @@ -333,7 +333,7 @@ static u32 vfp_single_fsqrt(int sd, int unused, s32 m, u32 fpscr) vsp = &vfp_single_default_qnan; ret = FPSCR_IOC; } - vfp_put_float(vfp_single_pack(vsp), sd); + vfp_put_float(sd, vfp_single_pack(vsp)); return ret; } @@ -506,7 +506,7 @@ static u32 vfp_single_fcvtd(int dd, int unused, s32 m, u32 fpscr) */ if (tm & (VFP_INFINITY|VFP_NAN)) { vdd.exponent = 2047; - if (tm == VFP_QNAN) + if (tm & VFP_NAN) vdd.significand |= VFP_DOUBLE_SIGNIFICAND_QNAN; goto pack_nan; } else if (tm & VFP_ZERO) @@ -514,10 +514,14 @@ static u32 vfp_single_fcvtd(int dd, int unused, s32 m, u32 fpscr) else vdd.exponent = vsm.exponent + (1023 - 127); + /* + * Technically, if bit 0 of dd is set, this is an invalid + * instruction. However, we ignore this for efficiency. + */ return vfp_double_normaliseround(dd, &vdd, fpscr, exceptions, "fcvtd"); pack_nan: - vfp_put_double(vfp_double_pack(&vdd), dd); + vfp_put_double(dd, vfp_double_pack(&vdd)); return exceptions; } @@ -613,7 +617,7 @@ static u32 vfp_single_ftoui(int sd, int unused, s32 m, u32 fpscr) pr_debug("VFP: ftoui: d(s%d)=%08x exceptions=%08x\n", sd, d, exceptions); - vfp_put_float(d, sd); + vfp_put_float(sd, d); return exceptions; } @@ -628,7 +632,6 @@ static u32 vfp_single_ftosi(int sd, int unused, s32 m, u32 fpscr) struct vfp_single vsm; u32 d, exceptions = 0; int rmode = fpscr & FPSCR_RMODE_MASK; - int tm; vfp_single_unpack(&vsm, m); vfp_single_dump("VSM", &vsm); @@ -636,14 +639,10 @@ static u32 vfp_single_ftosi(int sd, int unused, s32 m, u32 fpscr) /* * Do we have a denormalised number? */ - tm = vfp_single_type(&vsm); if (vfp_single_type(&vsm) & VFP_DENORMAL) exceptions |= FPSCR_IDC; - if (tm & VFP_NAN) { - d = 0; - exceptions |= FPSCR_IOC; - } else if (vsm.exponent >= 127 + 32) { + if (vsm.exponent >= 127 + 32) { /* * m >= 2^31-2^7: invalid */ @@ -692,7 +691,7 @@ static u32 vfp_single_ftosi(int sd, int unused, s32 m, u32 fpscr) pr_debug("VFP: ftosi: d(s%d)=%08x exceptions=%08x\n", sd, d, exceptions); - vfp_put_float((s32)d, sd); + vfp_put_float(sd, (s32)d); return exceptions; } @@ -1127,7 +1126,7 @@ static u32 vfp_single_fdiv(int sd, int sn, s32 m, u32 fpscr) vsn_nan: exceptions = vfp_propagate_nan(&vsd, &vsn, &vsm, fpscr); pack: - vfp_put_float(vfp_single_pack(&vsd), sd); + vfp_put_float(sd, vfp_single_pack(&vsd)); return exceptions; vsm_nan: @@ -1147,7 +1146,7 @@ static u32 vfp_single_fdiv(int sd, int sn, s32 m, u32 fpscr) goto pack; invalid: - vfp_put_float(vfp_single_pack(&vfp_single_default_qnan), sd); + vfp_put_float(sd, vfp_single_pack(&vfp_single_default_qnan)); return FPSCR_IOC; } @@ -1170,7 +1169,7 @@ u32 vfp_single_cpdo(u32 inst, u32 fpscr) { u32 op = inst & FOP_MASK; u32 exceptions = 0; - unsigned int dest; + unsigned int sd = vfp_get_sd(inst); unsigned int sn = vfp_get_sn(inst); unsigned int sm = vfp_get_sm(inst); unsigned int vecitr, veclen, vecstride; @@ -1179,29 +1178,17 @@ u32 vfp_single_cpdo(u32 inst, u32 fpscr) veclen = fpscr & FPSCR_LENGTH_MASK; vecstride = 1 + ((fpscr & FPSCR_STRIDE_MASK) == FPSCR_STRIDE_MASK); - /* - * fcvtsd takes a dN register number as destination, not sN. - * Technically, if bit 0 of dd is set, this is an invalid - * instruction. However, we ignore this for efficiency. - * It also only operates on scalars. - */ - if ((inst & FEXT_MASK) == FEXT_FCVT) { - veclen = 0; - dest = vfp_get_dd(inst); - } else - dest = vfp_get_sd(inst); - /* * If destination bank is zero, vector length is always '1'. * ARM DDI0100F C5.1.3, C5.3.2. */ - if (FREG_BANK(dest) == 0) + if (FREG_BANK(sd) == 0) veclen = 0; pr_debug("VFP: vecstride=%u veclen=%u\n", vecstride, (veclen >> FPSCR_LENGTH_BIT) + 1); - fop = (op == FOP_EXT) ? fop_extfns[FEXT_TO_IDX(inst)] : fop_fns[FOP_TO_IDX(op)]; + fop = (op == FOP_EXT) ? fop_extfns[sn] : fop_fns[FOP_TO_IDX(op)]; if (!fop) goto invalid; @@ -1209,18 +1196,15 @@ u32 vfp_single_cpdo(u32 inst, u32 fpscr) s32 m = vfp_get_float(sm); u32 except; - if (op == FOP_EXT && (inst & FEXT_MASK) == FEXT_FCVT) - pr_debug("VFP: itr%d (d%u) = op[%u] (s%u=%08x)\n", - vecitr >> FPSCR_LENGTH_BIT, dest, sn, sm, m); - else if (op == FOP_EXT) + if (op == FOP_EXT) pr_debug("VFP: itr%d (s%u) = op[%u] (s%u=%08x)\n", - vecitr >> FPSCR_LENGTH_BIT, dest, sn, sm, m); + vecitr >> FPSCR_LENGTH_BIT, sd, sn, sm, m); else pr_debug("VFP: itr%d (s%u) = (s%u) op[%u] (s%u=%08x)\n", - vecitr >> FPSCR_LENGTH_BIT, dest, sn, + vecitr >> FPSCR_LENGTH_BIT, sd, sn, FOP_TO_IDX(op), sm, m); - except = fop(dest, sn, m, fpscr); + except = fop(sd, sn, m, fpscr); pr_debug("VFP: itr%d: exceptions=%08x\n", vecitr >> FPSCR_LENGTH_BIT, except); @@ -1238,7 +1222,7 @@ u32 vfp_single_cpdo(u32 inst, u32 fpscr) * we encounter an exception. We continue. */ - dest = FREG_BANK(dest) + ((FREG_IDX(dest) + vecstride) & 7); + sd = FREG_BANK(sd) + ((FREG_IDX(sd) + vecstride) & 7); sn = FREG_BANK(sn) + ((FREG_IDX(sn) + vecstride) & 7); if (FREG_BANK(sm) != 0) sm = FREG_BANK(sm) + ((FREG_IDX(sm) + vecstride) & 7); diff --git a/arch/arm26/Kconfig b/arch/arm26/Kconfig index 0a4e2ac0d..76d40545a 100644 --- a/arch/arm26/Kconfig +++ b/arch/arm26/Kconfig @@ -41,10 +41,6 @@ config RWSEM_GENERIC_SPINLOCK config RWSEM_XCHGADD_ALGORITHM bool -config GENERIC_HWEIGHT - bool - default y - config GENERIC_CALIBRATE_DELAY bool default y @@ -79,7 +75,7 @@ config ARCH_A5K bool "A5000" select ARCH_MAY_HAVE_PC_FDC help - Say Y here to support the Acorn A5000. + Say Y here to to support the Acorn A5000. Linux can support the internal IDE disk and CD-ROM interface, serial and parallel port, @@ -129,7 +125,7 @@ config ZBOOT_ROM_BSS config XIP_KERNEL bool "Execute In Place (XIP) kernel image" help - Select this option to create a kernel that can be programmed into + Select this option to create a kernel that can be programed into the OS ROMs. comment "At least one math emulation must be selected" @@ -140,7 +136,7 @@ config FPE_NWFPE Say Y to include the NWFPE floating point emulator in the kernel. This is necessary to run most binaries. Linux does not currently support floating point hardware so you need to say Y here even if - your machine has an FPA or floating point co-processor module. + your machine has an FPA or floating point co-processor podule. It is also possible to say M to build the emulator as a module (nwfpe) or indeed to leave it out altogether. However, unless you diff --git a/arch/arm26/Makefile b/arch/arm26/Makefile index fe91eda98..844a9e468 100644 --- a/arch/arm26/Makefile +++ b/arch/arm26/Makefile @@ -1,9 +1,6 @@ # # arch/arm26/Makefile # -# This file is included by the global makefile so that you can add your own -# architecture-specific flags and dependencies. -# # 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. @@ -52,9 +49,9 @@ all: zImage boot := arch/arm26/boot -PHONY += maketools FORCE +.PHONY: maketools FORCE maketools: FORCE - + # Convert bzImage to zImage bzImage: vmlinux diff --git a/arch/arm26/boot/Makefile b/arch/arm26/boot/Makefile index 68acb7b0d..b5c227765 100644 --- a/arch/arm26/boot/Makefile +++ b/arch/arm26/boot/Makefile @@ -1,9 +1,6 @@ # # arch/arm26/boot/Makefile # -# This file is included by the global makefile so that you can add your own -# architecture-specific flags and dependencies. -# # 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. @@ -63,7 +60,7 @@ $(obj)/xipImage: vmlinux FORCE @echo ' Kernel: $@ is ready' endif -PHONY += initrd +.PHONY: initrd initrd: @test "$(INITRD_PHYS)" != "" || \ (echo This machine does not support INITRD; exit -1) diff --git a/arch/arm26/boot/compressed/head.S b/arch/arm26/boot/compressed/head.S index 2a2cda36d..0307804a6 100644 --- a/arch/arm26/boot/compressed/head.S +++ b/arch/arm26/boot/compressed/head.S @@ -7,6 +7,7 @@ * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. */ +#include #include /* diff --git a/arch/arm26/kernel/armksyms.c b/arch/arm26/kernel/armksyms.c index 07907b6ec..811a6376c 100644 --- a/arch/arm26/kernel/armksyms.c +++ b/arch/arm26/kernel/armksyms.c @@ -8,6 +8,7 @@ * published by the Free Software Foundation. */ #include +#include #include #include #include @@ -151,6 +152,7 @@ EXPORT_SYMBOL(strncmp); EXPORT_SYMBOL(strchr); EXPORT_SYMBOL(strlen); EXPORT_SYMBOL(strnlen); +EXPORT_SYMBOL(strpbrk); EXPORT_SYMBOL(strrchr); EXPORT_SYMBOL(strstr); EXPORT_SYMBOL(memset); @@ -210,6 +212,8 @@ EXPORT_SYMBOL(sys_open); EXPORT_SYMBOL(sys_exit); EXPORT_SYMBOL(sys_wait4); +EXPORT_SYMBOL(get_wchan); + #ifdef CONFIG_PREEMPT EXPORT_SYMBOL(kernel_flag); #endif diff --git a/arch/arm26/kernel/asm-offsets.c b/arch/arm26/kernel/asm-offsets.c index 76d9d7d48..ac682d5fd 100644 --- a/arch/arm26/kernel/asm-offsets.c +++ b/arch/arm26/kernel/asm-offsets.c @@ -12,6 +12,7 @@ * published by the Free Software Foundation. */ +#include #include #include diff --git a/arch/arm26/kernel/compat.c b/arch/arm26/kernel/compat.c index 21e966ff0..db0310db8 100644 --- a/arch/arm26/kernel/compat.c +++ b/arch/arm26/kernel/compat.c @@ -16,6 +16,7 @@ * 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/arm26/kernel/ecard.c b/arch/arm26/kernel/ecard.c index 047d0a408..f2278aada 100644 --- a/arch/arm26/kernel/ecard.c +++ b/arch/arm26/kernel/ecard.c @@ -24,6 +24,7 @@ */ #define ECARD_C +#include #include #include #include diff --git a/arch/arm26/kernel/fiq.c b/arch/arm26/kernel/fiq.c index c4776c96b..a24272b61 100644 --- a/arch/arm26/kernel/fiq.c +++ b/arch/arm26/kernel/fiq.c @@ -36,6 +36,7 @@ * - enables FIQ. * 6. Goto 3 */ +#include #include #include #include diff --git a/arch/arm26/kernel/head.S b/arch/arm26/kernel/head.S index 93575e0e5..8bfc62539 100644 --- a/arch/arm26/kernel/head.S +++ b/arch/arm26/kernel/head.S @@ -10,6 +10,7 @@ * * 26-bit kernel startup code */ +#include #include #include diff --git a/arch/arm26/kernel/irq.c b/arch/arm26/kernel/irq.c index d87d68b77..0934e6fba 100644 --- a/arch/arm26/kernel/irq.c +++ b/arch/arm26/kernel/irq.c @@ -18,6 +18,7 @@ * 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 @@ -190,7 +191,7 @@ __do_irq(unsigned int irq, struct irqaction *action, struct pt_regs *regs) int ret; spin_unlock(&irq_controller_lock); - if (!(action->flags & IRQF_DISABLED)) + if (!(action->flags & SA_INTERRUPT)) local_irq_enable(); status = 0; @@ -201,7 +202,7 @@ __do_irq(unsigned int irq, struct irqaction *action, struct pt_regs *regs) action = action->next; } while (action); - if (status & IRQF_SAMPLE_RANDOM) + if (status & SA_SAMPLE_RANDOM) add_interrupt_randomness(irq); spin_lock_irq(&irq_controller_lock); @@ -451,7 +452,7 @@ int setup_irq(unsigned int irq, struct irqaction *new) * so we have to be careful not to interfere with a * running system. */ - if (new->flags & IRQF_SAMPLE_RANDOM) { + if (new->flags & SA_SAMPLE_RANDOM) { /* * This function might sleep, we want to call it first, * outside of the atomic block. @@ -471,7 +472,7 @@ int setup_irq(unsigned int irq, struct irqaction *new) p = &desc->action; if ((old = *p) != NULL) { /* Can't share interrupts unless both agree to */ - if (!(old->flags & new->flags & IRQF_SHARED)) { + if (!(old->flags & new->flags & SA_SHIRQ)) { spin_unlock_irqrestore(&irq_controller_lock, flags); return -EBUSY; } @@ -526,11 +527,11 @@ int setup_irq(unsigned int irq, struct irqaction *new) * * Flags: * - * IRQF_SHARED Interrupt is shared + * SA_SHIRQ Interrupt is shared * - * IRQF_DISABLED Disable local interrupts while processing + * SA_INTERRUPT Disable local interrupts while processing * - * IRQF_SAMPLE_RANDOM The interrupt can be used for entropy + * SA_SAMPLE_RANDOM The interrupt can be used for entropy * */ @@ -542,7 +543,7 @@ int request_irq(unsigned int irq, irqreturn_t (*handler)(int, void *, struct pt_ struct irqaction *action; if (irq >= NR_IRQS || !irq_desc[irq].valid || !handler || - (irq_flags & IRQF_SHARED && !dev_id)) + (irq_flags & SA_SHIRQ && !dev_id)) return -EINVAL; action = (struct irqaction *)kmalloc(sizeof(struct irqaction), GFP_KERNEL); diff --git a/arch/arm26/kernel/process.c b/arch/arm26/kernel/process.c index dcd81e62f..386305659 100644 --- a/arch/arm26/kernel/process.c +++ b/arch/arm26/kernel/process.c @@ -11,6 +11,7 @@ */ #include +#include #include #include #include diff --git a/arch/arm26/kernel/ptrace.c b/arch/arm26/kernel/ptrace.c index 9343889b2..282e24d79 100644 --- a/arch/arm26/kernel/ptrace.c +++ b/arch/arm26/kernel/ptrace.c @@ -9,6 +9,7 @@ * 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/arm26/kernel/semaphore.c b/arch/arm26/kernel/semaphore.c index 5447a06db..3023a5343 100644 --- a/arch/arm26/kernel/semaphore.c +++ b/arch/arm26/kernel/semaphore.c @@ -13,6 +13,7 @@ * published by the Free Software Foundation. */ #include +#include #include #include #include diff --git a/arch/arm26/kernel/setup.c b/arch/arm26/kernel/setup.c index e7eb070f7..4eb329e38 100644 --- a/arch/arm26/kernel/setup.c +++ b/arch/arm26/kernel/setup.c @@ -8,6 +8,7 @@ * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. */ +#include #include #include #include @@ -17,7 +18,7 @@ #include #include #include -#include +#include #include #include diff --git a/arch/arm26/kernel/signal.c b/arch/arm26/kernel/signal.c index 6a8ef8da6..2a48c1210 100644 --- a/arch/arm26/kernel/signal.c +++ b/arch/arm26/kernel/signal.c @@ -10,6 +10,7 @@ * 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/arm26/kernel/time.c b/arch/arm26/kernel/time.c index db63d75d0..335525339 100644 --- a/arch/arm26/kernel/time.c +++ b/arch/arm26/kernel/time.c @@ -18,6 +18,7 @@ * "A Kernel Model for Precision Timekeeping" by Dave Mills */ +#include #include #include #include @@ -205,7 +206,7 @@ static irqreturn_t timer_interrupt(int irq, void *dev_id, struct pt_regs *regs) static struct irqaction timer_irq = { .name = "timer", - .flags = IRQF_DISABLED, + .flags = SA_INTERRUPT, .handler = timer_interrupt, }; diff --git a/arch/arm26/kernel/traps.c b/arch/arm26/kernel/traps.c index 7a297db05..4110862f1 100644 --- a/arch/arm26/kernel/traps.c +++ b/arch/arm26/kernel/traps.c @@ -15,6 +15,7 @@ */ #include +#include #include #include #include @@ -33,7 +34,7 @@ #include #include #include -#include +#include #include "ptrace.h" @@ -207,19 +208,19 @@ void die_if_kernel(const char *str, struct pt_regs *regs, int err) die(str, regs, err); } -static DEFINE_MUTEX(undef_mutex); +static DECLARE_MUTEX(undef_sem); static int (*undef_hook)(struct pt_regs *); int request_undef_hook(int (*fn)(struct pt_regs *)) { int ret = -EBUSY; - mutex_lock(&undef_mutex); + down(&undef_sem); if (undef_hook == NULL) { undef_hook = fn; ret = 0; } - mutex_unlock(&undef_mutex); + up(&undef_sem); return ret; } @@ -228,12 +229,12 @@ int release_undef_hook(int (*fn)(struct pt_regs *)) { int ret = -EINVAL; - mutex_lock(&undef_mutex); + down(&undef_sem); if (undef_hook == fn) { undef_hook = NULL; ret = 0; } - mutex_unlock(&undef_mutex); + up(&undef_sem); return ret; } diff --git a/arch/arm26/kernel/vmlinux.lds.S b/arch/arm26/kernel/vmlinux.lds.S index 1fa39f02e..811a69048 100644 --- a/arch/arm26/kernel/vmlinux.lds.S +++ b/arch/arm26/kernel/vmlinux.lds.S @@ -1,3 +1,4 @@ +#include #ifdef CONFIG_XIP_KERNEL diff --git a/arch/arm26/lib/backtrace.S b/arch/arm26/lib/backtrace.S index e27feb1e8..d793fe433 100644 --- a/arch/arm26/lib/backtrace.S +++ b/arch/arm26/lib/backtrace.S @@ -7,6 +7,7 @@ * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. */ +#include #include #include .text diff --git a/arch/arm26/lib/csumpartialcopyuser.S b/arch/arm26/lib/csumpartialcopyuser.S index a98eea743..261dd154c 100644 --- a/arch/arm26/lib/csumpartialcopyuser.S +++ b/arch/arm26/lib/csumpartialcopyuser.S @@ -7,6 +7,7 @@ * 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/arm26/lib/ecard.S b/arch/arm26/lib/ecard.S index 658bc4529..b4633150f 100644 --- a/arch/arm26/lib/ecard.S +++ b/arch/arm26/lib/ecard.S @@ -7,6 +7,7 @@ * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. */ +#include /* for CONFIG_CPU_nn */ #include #include #include diff --git a/arch/arm26/lib/io-acorn.S b/arch/arm26/lib/io-acorn.S index 5f62ade5b..f6c3e30b1 100644 --- a/arch/arm26/lib/io-acorn.S +++ b/arch/arm26/lib/io-acorn.S @@ -7,6 +7,7 @@ * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. */ +#include /* for CONFIG_CPU_nn */ #include #include #include diff --git a/arch/arm26/lib/kbd.c b/arch/arm26/lib/kbd.c index cb56e943e..22d2c93aa 100644 --- a/arch/arm26/lib/kbd.c +++ b/arch/arm26/lib/kbd.c @@ -1,3 +1,4 @@ +#include #include //#include #include diff --git a/arch/arm26/lib/lib1funcs.S b/arch/arm26/lib/lib1funcs.S index 0e29970b0..b8f9518db 100644 --- a/arch/arm26/lib/lib1funcs.S +++ b/arch/arm26/lib/lib1funcs.S @@ -39,6 +39,7 @@ Boston, MA 02111-1307, USA. */ #include #include #include +#include #define RET movs #define RETc(x) mov##x##s diff --git a/arch/arm26/machine/dma.c b/arch/arm26/machine/dma.c index 4402a5a1b..cbc7c61d5 100644 --- a/arch/arm26/machine/dma.c +++ b/arch/arm26/machine/dma.c @@ -10,6 +10,7 @@ * * DMA functions specific to Archimedes and A5000 architecture */ +#include #include #include diff --git a/arch/arm26/machine/irq.c b/arch/arm26/machine/irq.c index a60d543ed..4361863f7 100644 --- a/arch/arm26/machine/irq.c +++ b/arch/arm26/machine/irq.c @@ -16,6 +16,7 @@ * 08-09-2002 IM Brought up to date for 2.5 * 01-06-2003 JMA Removed arc_fiq_chip */ +#include #include #include diff --git a/arch/arm26/mm/extable.c b/arch/arm26/mm/extable.c index 38e1958d9..2d9f5b5a7 100644 --- a/arch/arm26/mm/extable.c +++ b/arch/arm26/mm/extable.c @@ -2,6 +2,7 @@ * linux/arch/arm26/mm/extable.c */ +#include #include #include diff --git a/arch/arm26/mm/fault.c b/arch/arm26/mm/fault.c index 761938b56..bd6f2db60 100644 --- a/arch/arm26/mm/fault.c +++ b/arch/arm26/mm/fault.c @@ -8,6 +8,7 @@ * 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/arm26/mm/init.c b/arch/arm26/mm/init.c index 562fac12e..1f09a9d0f 100644 --- a/arch/arm26/mm/init.c +++ b/arch/arm26/mm/init.c @@ -7,6 +7,7 @@ * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. */ +#include #include #include #include @@ -22,7 +23,6 @@ #include #include #include -#include #include #include @@ -101,6 +101,12 @@ struct node_info { int bootmap_pages; }; +#define PFN_DOWN(x) ((x) >> PAGE_SHIFT) +#define PFN_UP(x) (PAGE_ALIGN(x) >> PAGE_SHIFT) +#define PFN_SIZE(x) ((x) >> PAGE_SHIFT) +#define PFN_RANGE(s,e) PFN_SIZE(PAGE_ALIGN((unsigned long)(e)) - \ + (((unsigned long)(s)) & PAGE_MASK)) + /* * FIXME: We really want to avoid allocating the bootmap bitmap * over the top of the initrd. Hopefully, this is located towards @@ -318,7 +324,7 @@ static inline void free_area(unsigned long addr, unsigned long end, char *s) for (; addr < end; addr += PAGE_SIZE) { struct page *page = virt_to_page(addr); ClearPageReserved(page); - init_page_count(page); + set_page_count(page, 1); free_page(addr); totalram_pages++; } diff --git a/arch/arm26/nwfpe/fpmodule.c b/arch/arm26/nwfpe/fpmodule.c index a8fad92eb..5258c6096 100644 --- a/arch/arm26/nwfpe/fpmodule.c +++ b/arch/arm26/nwfpe/fpmodule.c @@ -25,6 +25,7 @@ #include #include +#include /* XXX */ #include diff --git a/arch/arm26/nwfpe/fpmodule.h b/arch/arm26/nwfpe/fpmodule.h index f971ddd60..ef71aab46 100644 --- a/arch/arm26/nwfpe/fpmodule.h +++ b/arch/arm26/nwfpe/fpmodule.h @@ -22,6 +22,7 @@ #ifndef __FPMODULE_H__ #define __FPMODULE_H__ +#include #define REG_ORIG_R0 16 #define REG_CPSR 15 diff --git a/arch/cris/Kconfig b/arch/cris/Kconfig index 62348e80b..4afa4318a 100644 --- a/arch/cris/Kconfig +++ b/arch/cris/Kconfig @@ -16,22 +16,10 @@ config RWSEM_GENERIC_SPINLOCK config RWSEM_XCHGADD_ALGORITHM bool -config GENERIC_FIND_NEXT_BIT - bool - default y - -config GENERIC_HWEIGHT - bool - default y - config GENERIC_CALIBRATE_DELAY bool default y -config IRQ_PER_CPU - bool - default y - config CRIS bool default y diff --git a/arch/cris/arch-v10/boot/compressed/head.S b/arch/cris/arch-v10/boot/compressed/head.S index 610bdb237..e73f44c99 100644 --- a/arch/cris/arch-v10/boot/compressed/head.S +++ b/arch/cris/arch-v10/boot/compressed/head.S @@ -8,6 +8,7 @@ * */ +#include #define ASSEMBLER_MACROS_ONLY #include diff --git a/arch/cris/arch-v10/boot/compressed/misc.c b/arch/cris/arch-v10/boot/compressed/misc.c index ffb8d21b2..1b5e83f1f 100644 --- a/arch/cris/arch-v10/boot/compressed/misc.c +++ b/arch/cris/arch-v10/boot/compressed/misc.c @@ -20,6 +20,7 @@ #define KERNEL_LOAD_ADR 0x40004000 +#include #include #include diff --git a/arch/cris/arch-v10/boot/rescue/head.S b/arch/cris/arch-v10/boot/rescue/head.S index f223cc0c0..addb2194d 100644 --- a/arch/cris/arch-v10/boot/rescue/head.S +++ b/arch/cris/arch-v10/boot/rescue/head.S @@ -63,6 +63,7 @@ * Copyright (C) 1999, 2000, 2001, 2002, 2003 Axis Communications AB */ +#include #define ASSEMBLER_MACROS_ONLY #include diff --git a/arch/cris/arch-v10/boot/rescue/kimagerescue.S b/arch/cris/arch-v10/boot/rescue/kimagerescue.S index cbccd6316..264bf7afc 100644 --- a/arch/cris/arch-v10/boot/rescue/kimagerescue.S +++ b/arch/cris/arch-v10/boot/rescue/kimagerescue.S @@ -6,6 +6,7 @@ * 4004000 and after a timeout jump to it. */ +#include #define ASSEMBLER_MACROS_ONLY #include diff --git a/arch/cris/arch-v10/drivers/axisflashmap.c b/arch/cris/arch-v10/drivers/axisflashmap.c index 4fa81abab..56b038c8d 100644 --- a/arch/cris/arch-v10/drivers/axisflashmap.c +++ b/arch/cris/arch-v10/drivers/axisflashmap.c @@ -138,6 +138,7 @@ #include #include #include +#include #include #include diff --git a/arch/cris/arch-v10/drivers/ds1302.c b/arch/cris/arch-v10/drivers/ds1302.c index 3cf4f23de..b100f2649 100644 --- a/arch/cris/arch-v10/drivers/ds1302.c +++ b/arch/cris/arch-v10/drivers/ds1302.c @@ -139,6 +139,7 @@ *! *!***************************************************************************/ +#include #include #include diff --git a/arch/cris/arch-v10/drivers/eeprom.c b/arch/cris/arch-v10/drivers/eeprom.c index 6e1f191a7..512f16dec 100644 --- a/arch/cris/arch-v10/drivers/eeprom.c +++ b/arch/cris/arch-v10/drivers/eeprom.c @@ -93,6 +93,7 @@ *! (c) 1999 Axis Communications AB, Lund, Sweden *!*****************************************************************************/ +#include #include #include #include @@ -450,9 +451,9 @@ int __init eeprom_init(void) static int eeprom_open(struct inode * inode, struct file * file) { - if(iminor(inode) != EEPROM_MINOR_NR) + if(MINOR(inode->i_rdev) != EEPROM_MINOR_NR) return -ENXIO; - if(imajor(inode) != EEPROM_MAJOR_NR) + if(MAJOR(inode->i_rdev) != EEPROM_MAJOR_NR) return -ENXIO; if( eeprom.size > 0 ) diff --git a/arch/cris/arch-v10/drivers/gpio.c b/arch/cris/arch-v10/drivers/gpio.c index fcba6632e..09963fe29 100644 --- a/arch/cris/arch-v10/drivers/gpio.c +++ b/arch/cris/arch-v10/drivers/gpio.c @@ -135,6 +135,7 @@ * */ +#include #include #include @@ -435,7 +436,7 @@ static int gpio_open(struct inode *inode, struct file *filp) { struct gpio_private *priv; - int p = iminor(inode); + int p = MINOR(inode->i_rdev); if (p > GPIO_MINOR_LAST) return -EINVAL; @@ -937,11 +938,11 @@ gpio_init(void) * in some tests. */ if (request_irq(TIMER0_IRQ_NBR, gpio_poll_timer_interrupt, - IRQF_SHARED | IRQF_DISABLED,"gpio poll", NULL)) { + SA_SHIRQ | SA_INTERRUPT,"gpio poll", NULL)) { printk(KERN_CRIT "err: timer0 irq for gpio\n"); } if (request_irq(PA_IRQ_NBR, gpio_pa_interrupt, - IRQF_SHARED | IRQF_DISABLED,"gpio PA", NULL)) { + SA_SHIRQ | SA_INTERRUPT,"gpio PA", NULL)) { printk(KERN_CRIT "err: PA irq for gpio\n"); } diff --git a/arch/cris/arch-v10/drivers/i2c.c b/arch/cris/arch-v10/drivers/i2c.c index 6114596c3..b38267d60 100644 --- a/arch/cris/arch-v10/drivers/i2c.c +++ b/arch/cris/arch-v10/drivers/i2c.c @@ -96,6 +96,7 @@ #include #include #include +#include #include diff --git a/arch/cris/arch-v10/drivers/pcf8563.c b/arch/cris/arch-v10/drivers/pcf8563.c index 8c830eefc..af517c210 100644 --- a/arch/cris/arch-v10/drivers/pcf8563.c +++ b/arch/cris/arch-v10/drivers/pcf8563.c @@ -18,6 +18,7 @@ * $Id: pcf8563.c,v 1.11 2005/03/07 13:13:07 starvik Exp $ */ +#include #include #include #include diff --git a/arch/cris/arch-v10/kernel/crisksyms.c b/arch/cris/arch-v10/kernel/crisksyms.c index e6b801355..b332bf9b3 100644 --- a/arch/cris/arch-v10/kernel/crisksyms.c +++ b/arch/cris/arch-v10/kernel/crisksyms.c @@ -1,3 +1,4 @@ +#include #include #include #include diff --git a/arch/cris/arch-v10/kernel/debugport.c b/arch/cris/arch-v10/kernel/debugport.c index 2b536ca6f..f3a85b77c 100644 --- a/arch/cris/arch-v10/kernel/debugport.c +++ b/arch/cris/arch-v10/kernel/debugport.c @@ -103,6 +103,7 @@ * */ +#include #include #include #include @@ -540,7 +541,7 @@ init_dummy_console(void) dummy_driver.init_termios = tty_std_termios; dummy_driver.init_termios.c_cflag = B115200 | CS8 | CREAD | HUPCL | CLOCAL; /* is normally B9600 default... */ - dummy_driver.flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_DYNAMIC_DEV; + dummy_driver.flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_NO_DEVFS; dummy_driver.open = dummy_open; dummy_driver.close = dummy_close; diff --git a/arch/cris/arch-v10/kernel/entry.S b/arch/cris/arch-v10/kernel/entry.S index ae45d4522..c808005e8 100644 --- a/arch/cris/arch-v10/kernel/entry.S +++ b/arch/cris/arch-v10/kernel/entry.S @@ -263,6 +263,7 @@ * */ +#include #include #include #include diff --git a/arch/cris/arch-v10/kernel/fasttimer.c b/arch/cris/arch-v10/kernel/fasttimer.c index 8cbdf594b..cac05a5e5 100644 --- a/arch/cris/arch-v10/kernel/fasttimer.c +++ b/arch/cris/arch-v10/kernel/fasttimer.c @@ -111,6 +111,7 @@ #include #include +#include #include #include diff --git a/arch/cris/arch-v10/kernel/head.S b/arch/cris/arch-v10/kernel/head.S index d946d8b8d..f00c145b4 100644 --- a/arch/cris/arch-v10/kernel/head.S +++ b/arch/cris/arch-v10/kernel/head.S @@ -183,6 +183,7 @@ * */ +#include #define ASSEMBLER_MACROS_ONLY /* The IO_* macros use the ## token concatenation operator, so -traditional must not be used when assembling this file. */ diff --git a/arch/cris/arch-v10/kernel/irq.c b/arch/cris/arch-v10/kernel/irq.c index 96094cbf1..4b368a122 100644 --- a/arch/cris/arch-v10/kernel/irq.c +++ b/arch/cris/arch-v10/kernel/irq.c @@ -15,6 +15,7 @@ #include #include #include +#include #define mask_irq(irq_nr) (*R_VECT_MASK_CLR = 1 << (irq_nr)); #define unmask_irq(irq_nr) (*R_VECT_MASK_SET = 1 << (irq_nr)); @@ -171,7 +172,7 @@ init_IRQ(void) /* Initialize IRQ handler descriptiors. */ for(i = 2; i < NR_IRQS; i++) { - irq_desc[i].chip = &crisv10_irq_type; + irq_desc[i].handler = &crisv10_irq_type; set_int_vector(i, interrupt[i]); } diff --git a/arch/cris/arch-v10/kernel/process.c b/arch/cris/arch-v10/kernel/process.c index b6831ceb6..0a675ce9e 100644 --- a/arch/cris/arch-v10/kernel/process.c +++ b/arch/cris/arch-v10/kernel/process.c @@ -11,6 +11,7 @@ * This file handles the architecture-dependent parts of process handling.. */ +#include #include #include #include diff --git a/arch/cris/arch-v10/kernel/setup.c b/arch/cris/arch-v10/kernel/setup.c index 682ef955a..b668d7fb6 100644 --- a/arch/cris/arch-v10/kernel/setup.c +++ b/arch/cris/arch-v10/kernel/setup.c @@ -10,6 +10,7 @@ * This file handles the architecture-dependent parts of initialization */ +#include #include #include #include diff --git a/arch/cris/arch-v10/kernel/time.c b/arch/cris/arch-v10/kernel/time.c index 9c22b76e1..dc3dfe9b4 100644 --- a/arch/cris/arch-v10/kernel/time.c +++ b/arch/cris/arch-v10/kernel/time.c @@ -7,6 +7,7 @@ * */ +#include #include #include #include @@ -251,11 +252,11 @@ timer_interrupt(int irq, void *dev_id, struct pt_regs *regs) return IRQ_HANDLED; } -/* timer is IRQF_SHARED so drivers can add stuff to the timer irq chain - * it needs to be IRQF_DISABLED to make the jiffies update work properly +/* timer is SA_SHIRQ so drivers can add stuff to the timer irq chain + * it needs to be SA_INTERRUPT to make the jiffies update work properly */ -static struct irqaction irq2 = { timer_interrupt, IRQF_SHARED | IRQF_DISABLED, +static struct irqaction irq2 = { timer_interrupt, SA_SHIRQ | SA_INTERRUPT, CPU_MASK_NONE, "timer", NULL, NULL}; void __init diff --git a/arch/cris/arch-v10/kernel/traps.c b/arch/cris/arch-v10/kernel/traps.c index 4becc1bcc..34a27ea20 100644 --- a/arch/cris/arch-v10/kernel/traps.c +++ b/arch/cris/arch-v10/kernel/traps.c @@ -11,6 +11,7 @@ * */ +#include #include #include #include diff --git a/arch/cris/arch-v10/lib/dram_init.S b/arch/cris/arch-v10/lib/dram_init.S index 9cf83932c..2ef4ad570 100644 --- a/arch/cris/arch-v10/lib/dram_init.S +++ b/arch/cris/arch-v10/lib/dram_init.S @@ -70,6 +70,7 @@ * uses this code. */ +#include ;; WARNING! The registers r8 and r9 are used as parameters carrying ;; information from the decompressor (if the kernel was compressed). diff --git a/arch/cris/arch-v10/mm/init.c b/arch/cris/arch-v10/mm/init.c index e0fcd1a9b..ff3481e76 100644 --- a/arch/cris/arch-v10/mm/init.c +++ b/arch/cris/arch-v10/mm/init.c @@ -2,6 +2,7 @@ * linux/arch/cris/arch-v10/mm/init.c * */ +#include #include #include #include diff --git a/arch/cris/arch-v10/vmlinux.lds.S b/arch/cris/arch-v10/vmlinux.lds.S index 689729a7e..71ba736be 100644 --- a/arch/cris/arch-v10/vmlinux.lds.S +++ b/arch/cris/arch-v10/vmlinux.lds.S @@ -8,6 +8,7 @@ * the kernel has booted. */ +#include #include jiffies = jiffies_64; diff --git a/arch/cris/arch-v32/boot/compressed/head.S b/arch/cris/arch-v32/boot/compressed/head.S index 34cea10a8..0c55b83b8 100644 --- a/arch/cris/arch-v32/boot/compressed/head.S +++ b/arch/cris/arch-v32/boot/compressed/head.S @@ -5,6 +5,7 @@ * Copyright (C) 1999 - 2003, Axis Communications AB */ +#include #define ASSEMBLER_MACROS_ONLY #include #include diff --git a/arch/cris/arch-v32/boot/compressed/misc.c b/arch/cris/arch-v32/boot/compressed/misc.c index 119026971..54644238e 100644 --- a/arch/cris/arch-v32/boot/compressed/misc.c +++ b/arch/cris/arch-v32/boot/compressed/misc.c @@ -20,6 +20,7 @@ #define KERNEL_LOAD_ADR 0x40004000 +#include #include #include diff --git a/arch/cris/arch-v32/boot/rescue/head.S b/arch/cris/arch-v32/boot/rescue/head.S index 8cdb4011b..61ede5f30 100644 --- a/arch/cris/arch-v32/boot/rescue/head.S +++ b/arch/cris/arch-v32/boot/rescue/head.S @@ -4,6 +4,7 @@ * RedBoot based RFL instead. Nothing to see here, move along. */ +#include #include #include diff --git a/arch/cris/arch-v32/drivers/axisflashmap.c b/arch/cris/arch-v32/drivers/axisflashmap.c index 41952320e..b679f983b 100644 --- a/arch/cris/arch-v32/drivers/axisflashmap.c +++ b/arch/cris/arch-v32/drivers/axisflashmap.c @@ -18,6 +18,7 @@ #include #include #include +#include #include #include diff --git a/arch/cris/arch-v32/drivers/cryptocop.c b/arch/cris/arch-v32/drivers/cryptocop.c index ba096ebb0..501fa52d8 100644 --- a/arch/cris/arch-v32/drivers/cryptocop.c +++ b/arch/cris/arch-v32/drivers/cryptocop.c @@ -2302,7 +2302,7 @@ static int cryptocop_job_setup(struct cryptocop_prio_job **pj, struct cryptocop_ static int cryptocop_open(struct inode *inode, struct file *filp) { - int p = iminor(inode); + int p = MINOR(inode->i_rdev); if (p != CRYPTOCOP_MINOR) return -EINVAL; @@ -2944,7 +2944,7 @@ static int cryptocop_ioctl_process(struct inode *inode, struct file *filp, unsig int spdl_err; /* Mark output pages dirty. */ spdl_err = set_page_dirty_lock(outpages[i]); - DEBUG(if (spdl_err < 0)printk("cryptocop_ioctl_process: set_page_dirty_lock returned %d\n", spdl_err)); + DEBUG(if (spdl_err)printk("cryptocop_ioctl_process: set_page_dirty_lock returned %d\n", spdl_err)); } for (i = 0; i < nooutpages; i++){ put_page(outpages[i]); diff --git a/arch/cris/arch-v32/drivers/gpio.c b/arch/cris/arch-v32/drivers/gpio.c index c3f876b4d..a551237dc 100644 --- a/arch/cris/arch-v32/drivers/gpio.c +++ b/arch/cris/arch-v32/drivers/gpio.c @@ -62,6 +62,7 @@ * */ +#include #include #include @@ -418,7 +419,7 @@ static int gpio_open(struct inode *inode, struct file *filp) { struct gpio_private *priv; - int p = iminor(inode); + int p = MINOR(inode->i_rdev); if (p > GPIO_MINOR_LAST) return -EINVAL; @@ -744,11 +745,11 @@ gpio_init(void) * in some tests. */ if (request_irq(TIMER_INTR_VECT, gpio_poll_timer_interrupt, - IRQF_SHARED | IRQF_DISABLED,"gpio poll", &alarmlist)) { + SA_SHIRQ | SA_INTERRUPT,"gpio poll", &alarmlist)) { printk("err: timer0 irq for gpio\n"); } if (request_irq(GEN_IO_INTR_VECT, gpio_pa_interrupt, - IRQF_SHARED | IRQF_DISABLED,"gpio PA", &alarmlist)) { + SA_SHIRQ | SA_INTERRUPT,"gpio PA", &alarmlist)) { printk("err: PA irq for gpio\n"); } /* enable the gio and timer irq in global config */ diff --git a/arch/cris/arch-v32/drivers/i2c.c b/arch/cris/arch-v32/drivers/i2c.c index 95f00188c..440c20a94 100644 --- a/arch/cris/arch-v32/drivers/i2c.c +++ b/arch/cris/arch-v32/drivers/i2c.c @@ -33,6 +33,7 @@ #include #include #include +#include #include diff --git a/arch/cris/arch-v32/drivers/pcf8563.c b/arch/cris/arch-v32/drivers/pcf8563.c index 2fc7d75a3..d788bda35 100644 --- a/arch/cris/arch-v32/drivers/pcf8563.c +++ b/arch/cris/arch-v32/drivers/pcf8563.c @@ -17,6 +17,7 @@ * */ +#include #include #include #include @@ -324,12 +325,14 @@ pcf8563_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned int pcf8563_open(struct inode *inode, struct file *filp) { + MOD_INC_USE_COUNT; return 0; } int pcf8563_release(struct inode *inode, struct file *filp) { + MOD_DEC_USE_COUNT; return 0; } diff --git a/arch/cris/arch-v32/drivers/pci/bios.c b/arch/cris/arch-v32/drivers/pci/bios.c index a2b9c60c2..24bc14988 100644 --- a/arch/cris/arch-v32/drivers/pci/bios.c +++ b/arch/cris/arch-v32/drivers/pci/bios.c @@ -27,6 +27,8 @@ int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma, /* Leave vm_pgoff as-is, the PCI space address is the physical * address on this platform. */ + vma->vm_flags |= (VM_SHM | VM_LOCKED | VM_IO); + prot = pgprot_val(vma->vm_page_prot); vma->vm_page_prot = __pgprot(prot); @@ -43,10 +45,10 @@ int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma, void pcibios_align_resource(void *data, struct resource *res, - resource_size_t size, resource_size_t align) + unsigned long size, unsigned long align) { if (res->flags & IORESOURCE_IO) { - resource_size_t start = res->start; + unsigned long start = res->start; if (start & 0x300) { start = (start + 0x3ff) & ~0x3ff; diff --git a/arch/cris/arch-v32/drivers/sync_serial.c b/arch/cris/arch-v32/drivers/sync_serial.c index e067806b2..c85a6df85 100644 --- a/arch/cris/arch-v32/drivers/sync_serial.c +++ b/arch/cris/arch-v32/drivers/sync_serial.c @@ -9,6 +9,7 @@ #include #include +#include #include #include #include @@ -340,7 +341,7 @@ static inline int sync_data_avail_to_end(struct sync_port *port) static int sync_serial_open(struct inode *inode, struct file *file) { - int dev = iminor(inode); + int dev = MINOR(inode->i_rdev); sync_port* port; reg_dma_rw_cfg cfg = {.en = regk_dma_yes}; reg_dma_rw_intr_mask intr_mask = {.data = regk_dma_yes}; @@ -486,7 +487,7 @@ static int sync_serial_open(struct inode *inode, struct file *file) static int sync_serial_release(struct inode *inode, struct file *file) { - int dev = iminor(inode); + int dev = MINOR(inode->i_rdev); sync_port* port; if (dev < 0 || dev >= NUMBER_OF_PORTS || !ports[dev].enabled) @@ -504,7 +505,7 @@ static int sync_serial_release(struct inode *inode, struct file *file) static unsigned int sync_serial_poll(struct file *file, poll_table *wait) { - int dev = iminor(file->f_dentry->d_inode); + int dev = MINOR(file->f_dentry->d_inode->i_rdev); unsigned int mask = 0; sync_port* port; DEBUGPOLL( static unsigned int prev_mask = 0; ); @@ -531,7 +532,7 @@ static int sync_serial_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) { int return_val = 0; - int dev = iminor(file->f_dentry->d_inode); + int dev = MINOR(file->f_dentry->d_inode->i_rdev); sync_port* port; reg_sser_rw_tr_cfg tr_cfg; reg_sser_rw_rec_cfg rec_cfg; @@ -789,7 +790,7 @@ static int sync_serial_ioctl(struct inode *inode, struct file *file, static ssize_t sync_serial_write(struct file * file, const char * buf, size_t count, loff_t *ppos) { - int dev = iminor(file->f_dentry->d_inode); + int dev = MINOR(file->f_dentry->d_inode->i_rdev); DECLARE_WAITQUEUE(wait, current); sync_port *port; unsigned long c, c1; @@ -919,7 +920,7 @@ static ssize_t sync_serial_write(struct file * file, const char * buf, static ssize_t sync_serial_read(struct file * file, char * buf, size_t count, loff_t *ppos) { - int dev = iminor(file->f_dentry->d_inode); + int dev = MINOR(file->f_dentry->d_inode->i_rdev); int avail; sync_port *port; unsigned char* start; diff --git a/arch/cris/arch-v32/kernel/arbiter.c b/arch/cris/arch-v32/kernel/arbiter.c index 420a5312e..3870d2fd5 100644 --- a/arch/cris/arch-v32/kernel/arbiter.c +++ b/arch/cris/arch-v32/kernel/arbiter.c @@ -1,14 +1,15 @@ /* - * Memory arbiter functions. Allocates bandwidth through the + * Memory arbiter functions. Allocates bandwith through the * arbiter and sets up arbiter breakpoints. * * The algorithm first assigns slots to the clients that has specified - * bandwidth (e.g. ethernet) and then the remaining slots are divided + * bandwith (e.g. ethernet) and then the remaining slots are divided * on all the active clients. * * Copyright (c) 2004, 2005 Axis Communications AB. */ +#include #include #include #include @@ -119,7 +120,7 @@ static void crisv32_arbiter_init(void) crisv32_arbiter_config(EXT_REGION); crisv32_arbiter_config(INT_REGION); - if (request_irq(MEMARB_INTR_VECT, crisv32_arbiter_irq, IRQF_DISABLED, + if (request_irq(MEMARB_INTR_VECT, crisv32_arbiter_irq, SA_INTERRUPT, "arbiter", NULL)) printk(KERN_ERR "Couldn't allocate arbiter IRQ\n"); @@ -132,8 +133,8 @@ static void crisv32_arbiter_init(void) -int crisv32_arbiter_allocate_bandwidth(int client, int region, - unsigned long bandwidth) +int crisv32_arbiter_allocate_bandwith(int client, int region, + unsigned long bandwidth) { int i; int total_assigned = 0; diff --git a/arch/cris/arch-v32/kernel/crisksyms.c b/arch/cris/arch-v32/kernel/crisksyms.c index e513da711..2c3bb9a0a 100644 --- a/arch/cris/arch-v32/kernel/crisksyms.c +++ b/arch/cris/arch-v32/kernel/crisksyms.c @@ -1,3 +1,4 @@ +#include #include #include #include diff --git a/arch/cris/arch-v32/kernel/debugport.c b/arch/cris/arch-v32/kernel/debugport.c index d1272ad92..ffc1ebf2d 100644 --- a/arch/cris/arch-v32/kernel/debugport.c +++ b/arch/cris/arch-v32/kernel/debugport.c @@ -2,6 +2,7 @@ * Copyright (C) 2003, Axis Communications AB. */ +#include #include #include #include @@ -352,7 +353,7 @@ init_dummy_console(void) dummy_driver.init_termios = tty_std_termios; dummy_driver.init_termios.c_cflag = B115200 | CS8 | CREAD | HUPCL | CLOCAL; /* is normally B9600 default... */ - dummy_driver.flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_DYNAMIC_DEV; + dummy_driver.flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_NO_DEVFS; dummy_driver.open = dummy_open; dummy_driver.close = dummy_close; diff --git a/arch/cris/arch-v32/kernel/dma.c b/arch/cris/arch-v32/kernel/dma.c index 570e19128..b92e85799 100644 --- a/arch/cris/arch-v32/kernel/dma.c +++ b/arch/cris/arch-v32/kernel/dma.c @@ -25,8 +25,8 @@ int crisv32_request_dma(unsigned int dmanr, const char * device_id, reg_config_rw_clk_ctrl clk_ctrl; reg_strmux_rw_cfg strmux_cfg; - if (crisv32_arbiter_allocate_bandwidth(dmanr, - options & DMA_INT_MEM ? INT_REGION : EXT_REGION, + if (crisv32_arbiter_allocate_bandwith(dmanr, + options & DMA_INT_MEM ? INT_REGION : EXT_REGION, bandwidth)) return -ENOMEM; diff --git a/arch/cris/arch-v32/kernel/entry.S b/arch/cris/arch-v32/kernel/entry.S index f9d27807b..3bd8503fe 100644 --- a/arch/cris/arch-v32/kernel/entry.S +++ b/arch/cris/arch-v32/kernel/entry.S @@ -17,6 +17,7 @@ * */ +#include #include #include #include diff --git a/arch/cris/arch-v32/kernel/fasttimer.c b/arch/cris/arch-v32/kernel/fasttimer.c index 5daeb6f7f..ea2b4a97c 100644 --- a/arch/cris/arch-v32/kernel/fasttimer.c +++ b/arch/cris/arch-v32/kernel/fasttimer.c @@ -120,6 +120,7 @@ #include #include +#include #include #include @@ -981,7 +982,7 @@ void fast_timer_init(void) proc_register_dynamic(&proc_root, &fasttimer_proc_entry); #endif #endif /* PROC_FS */ - if(request_irq(TIMER_INTR_VECT, timer_trig_interrupt, IRQF_DISABLED, + if(request_irq(TIMER_INTR_VECT, timer_trig_interrupt, SA_INTERRUPT, "fast timer int", NULL)) { printk("err: timer1 irq\n"); diff --git a/arch/cris/arch-v32/kernel/head.S b/arch/cris/arch-v32/kernel/head.S index 20bd80a84..3cfe57dc3 100644 --- a/arch/cris/arch-v32/kernel/head.S +++ b/arch/cris/arch-v32/kernel/head.S @@ -4,6 +4,7 @@ * Copyright (C) 2003, Axis Communications AB */ +#include #define ASSEMBLER_MACROS_ONLY diff --git a/arch/cris/arch-v32/kernel/io.c b/arch/cris/arch-v32/kernel/io.c index dfbfcb8d2..6bc9f263c 100644 --- a/arch/cris/arch-v32/kernel/io.c +++ b/arch/cris/arch-v32/kernel/io.c @@ -4,6 +4,7 @@ * Copyright (c) 2004 Axis Communications AB. */ +#include #include #include #include diff --git a/arch/cris/arch-v32/kernel/irq.c b/arch/cris/arch-v32/kernel/irq.c index cc361bf57..c78cc2685 100644 --- a/arch/cris/arch-v32/kernel/irq.c +++ b/arch/cris/arch-v32/kernel/irq.c @@ -6,6 +6,7 @@ #include #include #include +#include #include #include #include @@ -268,7 +269,7 @@ void crisv32_do_IRQ(int irq, int block, struct pt_regs* regs) { /* Interrupts that may not be moved to another CPU and - * are IRQF_DISABLED may skip blocking. This is currently + * are SA_INTERRUPT may skip blocking. This is currently * only valid for the timer IRQ and the IPI and is used * for the timer interrupt to avoid watchdog starvation. */ @@ -368,7 +369,7 @@ init_IRQ(void) /* Point all IRQ's to bad handlers. */ for (i = FIRST_IRQ, j = 0; j < NR_IRQS; i++, j++) { - irq_desc[j].chip = &crisv32_irq_type; + irq_desc[j].handler = &crisv32_irq_type; set_exception_vector(i, interrupt[j]); } diff --git a/arch/cris/arch-v32/kernel/kgdb_asm.S b/arch/cris/arch-v32/kernel/kgdb_asm.S index 3e7fa9ef8..b350dd279 100644 --- a/arch/cris/arch-v32/kernel/kgdb_asm.S +++ b/arch/cris/arch-v32/kernel/kgdb_asm.S @@ -5,6 +5,7 @@ * port exceptions for kernel debugging purposes. */ +#include #include ;; Exported functions. diff --git a/arch/cris/arch-v32/kernel/process.c b/arch/cris/arch-v32/kernel/process.c index 6326351af..843513102 100644 --- a/arch/cris/arch-v32/kernel/process.c +++ b/arch/cris/arch-v32/kernel/process.c @@ -8,6 +8,7 @@ * This file handles the architecture-dependent parts of process handling.. */ +#include #include #include #include diff --git a/arch/cris/arch-v32/kernel/setup.c b/arch/cris/arch-v32/kernel/setup.c index 4662f363d..b17a39a2e 100644 --- a/arch/cris/arch-v32/kernel/setup.c +++ b/arch/cris/arch-v32/kernel/setup.c @@ -4,6 +4,7 @@ * Copyright (C) 2003, Axis Communications AB. */ +#include #include #include #include diff --git a/arch/cris/arch-v32/kernel/smp.c b/arch/cris/arch-v32/kernel/smp.c index 464ecaec3..da40d19a1 100644 --- a/arch/cris/arch-v32/kernel/smp.c +++ b/arch/cris/arch-v32/kernel/smp.c @@ -62,7 +62,7 @@ static unsigned long irq_regs[NR_CPUS] = static irqreturn_t crisv32_ipi_interrupt(int irq, void *dev_id, struct pt_regs *regs); static int send_ipi(int vector, int wait, cpumask_t cpu_mask); -static struct irqaction irq_ipi = { crisv32_ipi_interrupt, IRQF_DISABLED, +static struct irqaction irq_ipi = { crisv32_ipi_interrupt, SA_INTERRUPT, CPU_MASK_NONE, "ipi", NULL, NULL}; extern void cris_mmu_init(void); diff --git a/arch/cris/arch-v32/kernel/time.c b/arch/cris/arch-v32/kernel/time.c index 50f3f9329..d48e397f5 100644 --- a/arch/cris/arch-v32/kernel/time.c +++ b/arch/cris/arch-v32/kernel/time.c @@ -6,6 +6,7 @@ * */ +#include #include #include #include @@ -241,16 +242,12 @@ timer_interrupt(int irq, void *dev_id, struct pt_regs *regs) return IRQ_HANDLED; } -/* timer is IRQF_SHARED so drivers can add stuff to the timer irq chain - * it needs to be IRQF_DISABLED to make the jiffies update work properly +/* timer is SA_SHIRQ so drivers can add stuff to the timer irq chain + * it needs to be SA_INTERRUPT to make the jiffies update work properly */ -static struct irqaction irq_timer = { - .mask = timer_interrupt, - .flags = IRQF_SHARED | IRQF_DISABLED, - .mask = CPU_MASK_NONE, - .name = "timer" -}; +static struct irqaction irq_timer = { timer_interrupt, SA_SHIRQ | SA_INTERRUPT, + CPU_MASK_NONE, "timer", NULL, NULL}; void __init cris_timer_init(void) diff --git a/arch/cris/arch-v32/kernel/traps.c b/arch/cris/arch-v32/kernel/traps.c index 2462b1ef1..6e3787045 100644 --- a/arch/cris/arch-v32/kernel/traps.c +++ b/arch/cris/arch-v32/kernel/traps.c @@ -2,6 +2,7 @@ * Copyright (C) 2003, Axis Communications AB. */ +#include #include #include diff --git a/arch/cris/arch-v32/lib/dram_init.S b/arch/cris/arch-v32/lib/dram_init.S index 158b3dbb4..47b6cf5f4 100644 --- a/arch/cris/arch-v32/lib/dram_init.S +++ b/arch/cris/arch-v32/lib/dram_init.S @@ -16,6 +16,7 @@ * uses this code. */ +#include #include #include diff --git a/arch/cris/arch-v32/lib/hw_settings.S b/arch/cris/arch-v32/lib/hw_settings.S index fff944351..5182e8c2c 100644 --- a/arch/cris/arch-v32/lib/hw_settings.S +++ b/arch/cris/arch-v32/lib/hw_settings.S @@ -10,6 +10,7 @@ * Authors: Mikael Starvik (starvik@axis.com) */ +#include #include #include #include diff --git a/arch/cris/arch-v32/lib/nand_init.S b/arch/cris/arch-v32/lib/nand_init.S index e019816fa..aba5c751c 100644 --- a/arch/cris/arch-v32/lib/nand_init.S +++ b/arch/cris/arch-v32/lib/nand_init.S @@ -27,6 +27,7 @@ #include #include #include +#include ;; There are 8-bit NAND flashes and 16-bit NAND flashes. ;; We need to treat them slightly different. diff --git a/arch/cris/arch-v32/mm/init.c b/arch/cris/arch-v32/mm/init.c index a84ba7ff2..f2fba27d8 100644 --- a/arch/cris/arch-v32/mm/init.c +++ b/arch/cris/arch-v32/mm/init.c @@ -6,10 +6,12 @@ * Authors: Bjorn Wesen * Tobias Anderberg , CRISv32 port. */ +#include #include #include #include #include +#include #include #include #include diff --git a/arch/cris/arch-v32/vmlinux.lds.S b/arch/cris/arch-v32/vmlinux.lds.S index 472d4b3c4..adb94605d 100644 --- a/arch/cris/arch-v32/vmlinux.lds.S +++ b/arch/cris/arch-v32/vmlinux.lds.S @@ -8,6 +8,7 @@ * the kernel has booted. */ +#include #include jiffies = jiffies_64; diff --git a/arch/cris/kernel/crisksyms.c b/arch/cris/kernel/crisksyms.c index 1f20c16ac..de39725da 100644 --- a/arch/cris/kernel/crisksyms.c +++ b/arch/cris/kernel/crisksyms.c @@ -1,3 +1,4 @@ +#include #include #include #include @@ -38,6 +39,7 @@ EXPORT_SYMBOL(loops_per_usec); /* String functions */ EXPORT_SYMBOL(memcmp); EXPORT_SYMBOL(memmove); +EXPORT_SYMBOL(strpbrk); EXPORT_SYMBOL(strstr); EXPORT_SYMBOL(strcpy); EXPORT_SYMBOL(strchr); diff --git a/arch/cris/kernel/irq.c b/arch/cris/kernel/irq.c index 903ea62c6..30deaf1b7 100644 --- a/arch/cris/kernel/irq.c +++ b/arch/cris/kernel/irq.c @@ -19,6 +19,7 @@ * Naturally it's not a 1:1 relation, but there are similarities. */ +#include #include #include #include @@ -51,8 +52,9 @@ int show_interrupts(struct seq_file *p, void *v) if (i == 0) { seq_printf(p, " "); - for_each_online_cpu(j) - seq_printf(p, "CPU%d ",j); + for (j=0; jtypename); + seq_printf(p, " %14s", irq_desc[i].handler->typename); seq_printf(p, " %s", action->name); for (action=action->next; action; action = action->next) @@ -85,7 +88,7 @@ skip: /* called by the assembler IRQ entry functions defined in irq.h * to dispatch the interrupts to registred handlers * interrupts are disabled upon entry - depending on if the - * interrupt was registred with IRQF_DISABLED or not, interrupts + * interrupt was registred with SA_INTERRUPT or not, interrupts * are re-enabled or not. */ diff --git a/arch/cris/kernel/process.c b/arch/cris/kernel/process.c index 123451c44..4ab3e8711 100644 --- a/arch/cris/kernel/process.c +++ b/arch/cris/kernel/process.c @@ -116,7 +116,6 @@ #include #include #include -#include #include #include #include @@ -195,6 +194,8 @@ EXPORT_SYMBOL(enable_hlt); */ void (*pm_idle)(void); +extern void default_idle(void); + /* * The idle thread. There's no useful work to be * done, so just try to conserve power and have a diff --git a/arch/cris/kernel/setup.c b/arch/cris/kernel/setup.c index 7af3d5d43..1ba57efff 100644 --- a/arch/cris/kernel/setup.c +++ b/arch/cris/kernel/setup.c @@ -10,14 +10,14 @@ * This file handles the architecture-dependent parts of initialization */ +#include #include #include #include #include #include -#include +#include #include -#include #include @@ -88,6 +88,10 @@ setup_arch(char **cmdline_p) init_mm.end_data = (unsigned long) &_edata; init_mm.brk = (unsigned long) &_end; +#define PFN_UP(x) (((x) + PAGE_SIZE-1) >> PAGE_SHIFT) +#define PFN_DOWN(x) ((x) >> PAGE_SHIFT) +#define PFN_PHYS(x) ((x) << PAGE_SHIFT) + /* min_low_pfn points to the start of DRAM, start_pfn points * to the first DRAM pages after the kernel, and max_low_pfn * to the end of DRAM. diff --git a/arch/cris/mm/init.c b/arch/cris/mm/init.c index b7842ff21..31a0018b5 100644 --- a/arch/cris/mm/init.c +++ b/arch/cris/mm/init.c @@ -216,7 +216,7 @@ free_initmem(void) addr = (unsigned long)(&__init_begin); for (; addr < (unsigned long)(&__init_end); addr += PAGE_SIZE) { ClearPageReserved(virt_to_page(addr)); - init_page_count(virt_to_page(addr)); + set_page_count(virt_to_page(addr), 1); free_page(addr); totalram_pages++; } diff --git a/arch/frv/Kconfig b/arch/frv/Kconfig index a601a17cf..e08383712 100644 --- a/arch/frv/Kconfig +++ b/arch/frv/Kconfig @@ -17,10 +17,6 @@ config GENERIC_FIND_NEXT_BIT bool default y -config GENERIC_HWEIGHT - bool - default y - config GENERIC_CALIBRATE_DELAY bool default n @@ -29,10 +25,6 @@ config GENERIC_HARDIRQS bool default n -config GENERIC_TIME - bool - default y - config TIME_LOW_RES bool default y diff --git a/arch/frv/kernel/asm-offsets.c b/arch/frv/kernel/asm-offsets.c index fbb19fc1a..9e263112a 100644 --- a/arch/frv/kernel/asm-offsets.c +++ b/arch/frv/kernel/asm-offsets.c @@ -1,115 +1 @@ -/* - * Generate definitions needed by assembly language modules. - * This code generates raw asm output which is post-processed - * to extract and format the required data. - */ - -#include -#include -#include -#include -#include -#include -#include -#include - -#define DEFINE(sym, val) \ - asm volatile("\n->" #sym " %0 " #val : : "i" (val)) - -#define DEF_PTREG(sym, reg) \ - asm volatile("\n->" #sym " %0 offsetof(struct pt_regs, " #reg ")" \ - : : "i" (offsetof(struct pt_regs, reg))) - -#define DEF_IREG(sym, reg) \ - asm volatile("\n->" #sym " %0 offsetof(struct user_context, " #reg ")" \ - : : "i" (offsetof(struct user_context, reg))) - -#define DEF_FREG(sym, reg) \ - asm volatile("\n->" #sym " %0 offsetof(struct user_context, " #reg ")" \ - : : "i" (offsetof(struct user_context, reg))) - -#define DEF_0REG(sym, reg) \ - asm volatile("\n->" #sym " %0 offsetof(struct frv_frame0, " #reg ")" \ - : : "i" (offsetof(struct frv_frame0, reg))) - -#define BLANK() asm volatile("\n->" : : ) - -#define OFFSET(sym, str, mem) \ - DEFINE(sym, offsetof(struct str, mem)); - -void foo(void) -{ - /* offsets into the thread_info structure */ - OFFSET(TI_TASK, thread_info, task); - OFFSET(TI_EXEC_DOMAIN, thread_info, exec_domain); - OFFSET(TI_FLAGS, thread_info, flags); - OFFSET(TI_STATUS, thread_info, status); - OFFSET(TI_CPU, thread_info, cpu); - OFFSET(TI_PREEMPT_COUNT, thread_info, preempt_count); - OFFSET(TI_ADDR_LIMIT, thread_info, addr_limit); - OFFSET(TI_RESTART_BLOCK, thread_info, restart_block); - BLANK(); - - /* offsets into register file storage */ - DEF_PTREG(REG_PSR, psr); - DEF_PTREG(REG_ISR, isr); - DEF_PTREG(REG_CCR, ccr); - DEF_PTREG(REG_CCCR, cccr); - DEF_PTREG(REG_LR, lr); - DEF_PTREG(REG_LCR, lcr); - DEF_PTREG(REG_PC, pc); - DEF_PTREG(REG__STATUS, __status); - DEF_PTREG(REG_SYSCALLNO, syscallno); - DEF_PTREG(REG_ORIG_GR8, orig_gr8); - DEF_PTREG(REG_GNER0, gner0); - DEF_PTREG(REG_GNER1, gner1); - DEF_PTREG(REG_IACC0, iacc0); - DEF_PTREG(REG_TBR, tbr); - DEF_PTREG(REG_GR0, tbr); - DEFINE(REG__END, sizeof(struct pt_regs)); - BLANK(); - - DEF_0REG(REG_DCR, debug.dcr); - DEF_0REG(REG_IBAR0, debug.ibar[0]); - DEF_0REG(REG_DBAR0, debug.dbar[0]); - DEF_0REG(REG_DBDR00, debug.dbdr[0][0]); - DEF_0REG(REG_DBMR00, debug.dbmr[0][0]); - BLANK(); - - DEF_IREG(__INT_GR0, i.gr[0]); - DEF_FREG(__USER_FPMEDIA, f); - DEF_FREG(__FPMEDIA_FR0, f.fr[0]); - DEF_FREG(__FPMEDIA_FNER0, f.fner[0]); - DEF_FREG(__FPMEDIA_MSR0, f.msr[0]); - DEF_FREG(__FPMEDIA_ACC0, f.acc[0]); - DEF_FREG(__FPMEDIA_ACCG0, f.accg[0]); - DEF_FREG(__FPMEDIA_FSR0, f.fsr[0]); - BLANK(); - - DEFINE(NR_PT_REGS, sizeof(struct pt_regs) / 4); - DEFINE(NR_USER_INT_REGS, sizeof(struct user_int_regs) / 4); - DEFINE(NR_USER_FPMEDIA_REGS, sizeof(struct user_fpmedia_regs) / 4); - DEFINE(NR_USER_CONTEXT, sizeof(struct user_context) / 4); - DEFINE(FRV_FRAME0_SIZE, sizeof(struct frv_frame0)); - BLANK(); - - /* offsets into thread_struct */ - OFFSET(__THREAD_FRAME, thread_struct, frame); - OFFSET(__THREAD_CURR, thread_struct, curr); - OFFSET(__THREAD_SP, thread_struct, sp); - OFFSET(__THREAD_FP, thread_struct, fp); - OFFSET(__THREAD_LR, thread_struct, lr); - OFFSET(__THREAD_PC, thread_struct, pc); - OFFSET(__THREAD_GR16, thread_struct, gr[0]); - OFFSET(__THREAD_SCHED_LR, thread_struct, sched_lr); - OFFSET(__THREAD_FRAME0, thread_struct, frame0); - OFFSET(__THREAD_USER, thread_struct, user); - BLANK(); - - /* offsets into frv_debug_status */ - OFFSET(DEBUG_BPSR, frv_debug_status, bpsr); - OFFSET(DEBUG_DCR, frv_debug_status, dcr); - OFFSET(DEBUG_BRR, frv_debug_status, brr); - OFFSET(DEBUG_NMAR, frv_debug_status, nmar); - BLANK(); -} +/* Dummy asm-offsets.c file. Required by kbuild and ready to be used - hint! */ diff --git a/arch/frv/kernel/break.S b/arch/frv/kernel/break.S index dac4a5f68..687c48d62 100644 --- a/arch/frv/kernel/break.S +++ b/arch/frv/kernel/break.S @@ -9,11 +9,12 @@ * 2 of the License, or (at your option) any later version. */ +#include +#include #include #include #include #include -#include #include #include @@ -23,11 +24,13 @@ # .section .bss.stack .globl __break_user_context - .balign THREAD_SIZE + .balign 8192 __break_stack: - .space THREAD_SIZE - FRV_FRAME0_SIZE -__break_frame_0: - .space FRV_FRAME0_SIZE + .space (8192 - (USER_CONTEXT_SIZE + REG__DEBUG_XTRA)) & ~7 +__break_stack_tos: + .space REG__DEBUG_XTRA +__break_user_context: + .space USER_CONTEXT_SIZE # # miscellaneous variables @@ -72,8 +75,8 @@ __entry_break: #endif LEDS 0x1001,gr31 - sethi.p %hi(__break_frame_0),gr31 - setlo %lo(__break_frame_0),gr31 + sethi.p %hi(__break_user_context),gr31 + setlo %lo(__break_user_context),gr31 stdi gr2,@(gr31,#REG_GR(2)) movsg ccr,gr3 @@ -583,8 +586,8 @@ __break_continue: # set up the kernel stack pointer sti sp,@(gr31,#REG_SP) - sethi.p %hi(__break_frame_0),sp - setlo %lo(__break_frame_0),sp + sethi.p %hi(__break_stack_tos),sp + setlo %lo(__break_stack_tos),sp # finish building the exception frame stdi gr4 ,@(gr31,#REG_GR(4)) @@ -649,12 +652,9 @@ __break_continue: movsg nmar,gr5 movsg dcr,gr6 - sethi.p %hi(__debug_status),gr7 - setlo %lo(__debug_status),gr7 - - stdi gr4 ,@(gr7,#DEBUG_BRR) - sti gr19,@(gr7,#DEBUG_BPSR) - sti.p gr6 ,@(gr7,#DEBUG_DCR) + stdi gr4 ,@(gr31,#REG_BRR) + sti gr19,@(gr31,#REG_BPSR) + sti.p gr6 ,@(gr31,#REG_DCR) # trap exceptions during break handling and disable h/w breakpoints/watchpoints sethi %hi(DCR_EBE),gr5 @@ -699,10 +699,7 @@ __break_continue: lddi @(gr31,#REG_PSR) ,gr22 ldi @(gr31,#REG_PC) ,gr21 ldi @(gr31,#REG_TBR) ,gr20 - - sethi.p %hi(__debug_status),gr6 - setlo %lo(__debug_status),gr6 - ldi.p @(gr6,#DEBUG_DCR) ,gr6 + ldi.p @(gr31,#REG_DCR) ,gr6 andi gr22,#PSR_S,gr19 /* rebuild BPSR */ andi.p gr22,#PSR_ET,gr5 diff --git a/arch/frv/kernel/cmode.S b/arch/frv/kernel/cmode.S index 81ba28ad2..6591e6a37 100644 --- a/arch/frv/kernel/cmode.S +++ b/arch/frv/kernel/cmode.S @@ -11,6 +11,7 @@ */ #include +#include #include #include #include diff --git a/arch/frv/kernel/debug-stub.c b/arch/frv/kernel/debug-stub.c index 2f6c60c92..4761cc4b4 100644 --- a/arch/frv/kernel/debug-stub.c +++ b/arch/frv/kernel/debug-stub.c @@ -39,10 +39,11 @@ do { \ gdbstub_do_rx(); \ } while(!FLOWCTL_QUERY(LINE)) -struct frv_debug_status __debug_status; - static void __init debug_stub_init(void); +extern asmlinkage void __break_hijack_kernel_event(void); +extern asmlinkage void __break_hijack_kernel_event_breaks_here(void); + /*****************************************************************************/ /* * debug mode handler stub @@ -66,7 +67,7 @@ asmlinkage void debug_stub(void) __set_HSR(0, hsr0 & ~HSR0_ETMD); /* disable single stepping */ - __debug_status.dcr &= ~DCR_SE; + __debug_regs->dcr &= ~DCR_SE; /* kernel mode can propose an exception be handled in debug mode by jumping to a special * location */ @@ -75,8 +76,8 @@ asmlinkage void debug_stub(void) * the top kernel context */ *__debug_frame = *__frame; __frame = __debug_frame->next_frame; - __debug_status.brr = (__debug_frame->tbr & TBR_TT) << 12; - __debug_status.brr |= BRR_EB; + __debug_regs->brr = (__debug_frame->tbr & TBR_TT) << 12; + __debug_regs->brr |= BRR_EB; } if (__debug_frame->pc == (unsigned long) __debug_bug_trap + 4) { @@ -123,7 +124,7 @@ static void __init debug_stub_init(void) __debug_frame->pc = (unsigned long) start_kernel; /* enable the debug events we want to trap */ - __debug_status.dcr = DCR_EBE; + __debug_regs->dcr = DCR_EBE; #ifdef CONFIG_GDBSTUB gdbstub_init(); diff --git a/arch/frv/kernel/entry-table.S b/arch/frv/kernel/entry-table.S index d3b9253d8..81568acea 100644 --- a/arch/frv/kernel/entry-table.S +++ b/arch/frv/kernel/entry-table.S @@ -11,6 +11,7 @@ */ #include +#include #include #include diff --git a/arch/frv/kernel/entry.S b/arch/frv/kernel/entry.S index 940ac306e..1d21c8d34 100644 --- a/arch/frv/kernel/entry.S +++ b/arch/frv/kernel/entry.S @@ -27,6 +27,8 @@ * */ +#include +#include #include #include #include @@ -1168,6 +1170,12 @@ __syscall_badsys: # syscall vector table # ############################################################################### +#ifdef CONFIG_MMU +#define __MMU(X) X +#else +#define __MMU(X) sys_ni_syscall +#endif + .section .rodata ALIGN .globl sys_call_table @@ -1297,7 +1305,7 @@ sys_call_table: .long sys_newuname .long sys_ni_syscall /* old "cacheflush" */ .long sys_adjtimex - .long sys_mprotect /* 125 */ + .long __MMU(sys_mprotect) /* 125 */ .long sys_sigprocmask .long sys_ni_syscall /* old "create_module" */ .long sys_init_module @@ -1316,16 +1324,16 @@ sys_call_table: .long sys_getdents .long sys_select .long sys_flock - .long sys_msync + .long __MMU(sys_msync) .long sys_readv /* 145 */ .long sys_writev .long sys_getsid .long sys_fdatasync .long sys_sysctl - .long sys_mlock /* 150 */ - .long sys_munlock - .long sys_mlockall - .long sys_munlockall + .long __MMU(sys_mlock) /* 150 */ + .long __MMU(sys_munlock) + .long __MMU(sys_mlockall) + .long __MMU(sys_munlockall) .long sys_sched_setparam .long sys_sched_getparam /* 155 */ .long sys_sched_setscheduler @@ -1335,7 +1343,7 @@ sys_call_table: .long sys_sched_get_priority_min /* 160 */ .long sys_sched_rr_get_interval .long sys_nanosleep - .long sys_mremap + .long __MMU(sys_mremap) .long sys_setresuid16 .long sys_getresuid16 /* 165 */ .long sys_ni_syscall /* for vm86 */ @@ -1390,8 +1398,8 @@ sys_call_table: .long sys_setfsuid /* 215 */ .long sys_setfsgid .long sys_pivot_root - .long sys_mincore - .long sys_madvise + .long __MMU(sys_mincore) + .long __MMU(sys_madvise) .long sys_getdents64 /* 220 */ .long sys_fcntl64 .long sys_ni_syscall /* reserved for TUX */ @@ -1429,7 +1437,7 @@ sys_call_table: .long sys_epoll_create .long sys_epoll_ctl /* 255 */ .long sys_epoll_wait - .long sys_remap_file_pages + .long __MMU(sys_remap_file_pages) .long sys_set_tid_address .long sys_timer_create .long sys_timer_settime /* 260 */ @@ -1472,7 +1480,7 @@ sys_call_table: .long sys_mknodat .long sys_fchownat .long sys_futimesat - .long sys_fstatat64 /* 300 */ + .long sys_newfstatat /* 300 */ .long sys_unlinkat .long sys_renameat .long sys_linkat diff --git a/arch/frv/kernel/frv_ksyms.c b/arch/frv/kernel/frv_ksyms.c index f772704b3..0f1c6cbc4 100644 --- a/arch/frv/kernel/frv_ksyms.c +++ b/arch/frv/kernel/frv_ksyms.c @@ -7,6 +7,7 @@ #include #include #include +#include #include #include @@ -25,6 +26,16 @@ extern long __memset_user(void *dst, const void *src, size_t count); EXPORT_SYMBOL(__ioremap); EXPORT_SYMBOL(iounmap); +EXPORT_SYMBOL(strnlen); +EXPORT_SYMBOL(strrchr); +EXPORT_SYMBOL(strstr); +EXPORT_SYMBOL(strchr); +EXPORT_SYMBOL(strcat); +EXPORT_SYMBOL(strlen); +EXPORT_SYMBOL(strcmp); +EXPORT_SYMBOL(strncmp); +EXPORT_SYMBOL(strncpy); + EXPORT_SYMBOL(ip_fast_csum); #if 0 @@ -33,6 +44,8 @@ EXPORT_SYMBOL(local_bh_count); #endif EXPORT_SYMBOL(kernel_thread); +EXPORT_SYMBOL(enable_irq); +EXPORT_SYMBOL(disable_irq); EXPORT_SYMBOL(__res_bus_clock_speed_HZ); EXPORT_SYMBOL(__page_offset); EXPORT_SYMBOL(__memcpy_user); @@ -49,16 +62,24 @@ EXPORT_SYMBOL(memory_end); EXPORT_SYMBOL(__debug_bug_trap); +/* Networking helper routines. */ +EXPORT_SYMBOL(csum_partial_copy); + /* The following are special because they're not called explicitly (the C compiler generates them). Fortunately, their interface isn't gonna change any time soon now, so it's OK to leave it out of version control. */ EXPORT_SYMBOL(memcpy); EXPORT_SYMBOL(memset); +EXPORT_SYMBOL(memcmp); +EXPORT_SYMBOL(memscan); +EXPORT_SYMBOL(memmove); EXPORT_SYMBOL(__outsl_ns); EXPORT_SYMBOL(__insl_ns); +EXPORT_SYMBOL(get_wchan); + #ifdef CONFIG_FRV_OUTOFLINE_ATOMIC_OPS EXPORT_SYMBOL(atomic_test_and_ANDNOT_mask); EXPORT_SYMBOL(atomic_test_and_OR_mask); diff --git a/arch/frv/kernel/gdb-stub.c b/arch/frv/kernel/gdb-stub.c index 9550f37fb..8f860d9c4 100644 --- a/arch/frv/kernel/gdb-stub.c +++ b/arch/frv/kernel/gdb-stub.c @@ -124,7 +124,6 @@ #include #include -#include #include #include #include @@ -137,6 +136,7 @@ extern void debug_to_serial(const char *p, int n); extern void gdbstub_console_write(struct console *co, const char *p, unsigned n); extern volatile uint32_t __break_error_detect[3]; /* ESFR1, ESR15, EAR15 */ +extern struct user_context __break_user_context; struct __debug_amr { unsigned long L, P; @@ -926,7 +926,6 @@ static int gdbstub_set_breakpoint(unsigned long type, unsigned long addr, unsign if (!(__debug_regs->dcr & DCR_IBE0)) { //gdbstub_printk("set h/w break 0: %08lx\n", addr); __debug_regs->dcr |= DCR_IBE0; - __debug_regs->ibar[0] = addr; asm volatile("movgs %0,ibar0" : : "r"(addr)); return 0; } @@ -934,7 +933,6 @@ static int gdbstub_set_breakpoint(unsigned long type, unsigned long addr, unsign if (!(__debug_regs->dcr & DCR_IBE1)) { //gdbstub_printk("set h/w break 1: %08lx\n", addr); __debug_regs->dcr |= DCR_IBE1; - __debug_regs->ibar[1] = addr; asm volatile("movgs %0,ibar1" : : "r"(addr)); return 0; } @@ -942,7 +940,6 @@ static int gdbstub_set_breakpoint(unsigned long type, unsigned long addr, unsign if (!(__debug_regs->dcr & DCR_IBE2)) { //gdbstub_printk("set h/w break 2: %08lx\n", addr); __debug_regs->dcr |= DCR_IBE2; - __debug_regs->ibar[2] = addr; asm volatile("movgs %0,ibar2" : : "r"(addr)); return 0; } @@ -950,7 +947,6 @@ static int gdbstub_set_breakpoint(unsigned long type, unsigned long addr, unsign if (!(__debug_regs->dcr & DCR_IBE3)) { //gdbstub_printk("set h/w break 3: %08lx\n", addr); __debug_regs->dcr |= DCR_IBE3; - __debug_regs->ibar[3] = addr; asm volatile("movgs %0,ibar3" : : "r"(addr)); return 0; } @@ -975,14 +971,7 @@ static int gdbstub_set_breakpoint(unsigned long type, unsigned long addr, unsign if (!(__debug_regs->dcr & (DCR_DRBE0|DCR_DWBE0))) { //gdbstub_printk("set h/w watchpoint 0 type %ld: %08lx\n", type, addr); tmp = type==2 ? DCR_DWBE0 : type==3 ? DCR_DRBE0 : DCR_DRBE0|DCR_DWBE0; - __debug_regs->dcr |= tmp; - __debug_regs->dbar[0] = addr; - __debug_regs->dbmr[0][0] = dbmr.mask0; - __debug_regs->dbmr[0][1] = dbmr.mask1; - __debug_regs->dbdr[0][0] = 0; - __debug_regs->dbdr[0][1] = 0; - asm volatile(" movgs %0,dbar0 \n" " movgs %1,dbmr00 \n" " movgs %2,dbmr01 \n" @@ -995,14 +984,7 @@ static int gdbstub_set_breakpoint(unsigned long type, unsigned long addr, unsign if (!(__debug_regs->dcr & (DCR_DRBE1|DCR_DWBE1))) { //gdbstub_printk("set h/w watchpoint 1 type %ld: %08lx\n", type, addr); tmp = type==2 ? DCR_DWBE1 : type==3 ? DCR_DRBE1 : DCR_DRBE1|DCR_DWBE1; - __debug_regs->dcr |= tmp; - __debug_regs->dbar[1] = addr; - __debug_regs->dbmr[1][0] = dbmr.mask0; - __debug_regs->dbmr[1][1] = dbmr.mask1; - __debug_regs->dbdr[1][0] = 0; - __debug_regs->dbdr[1][1] = 0; - asm volatile(" movgs %0,dbar1 \n" " movgs %1,dbmr10 \n" " movgs %2,dbmr11 \n" @@ -1065,7 +1047,6 @@ int gdbstub_clear_breakpoint(unsigned long type, unsigned long addr, unsigned lo if (__debug_regs->dcr & DCR_IBE0 && __get_ibar(0) == addr) { //gdbstub_printk("clear h/w break 0: %08lx\n", addr); __debug_regs->dcr &= ~DCR_IBE0; - __debug_regs->ibar[0] = 0; asm volatile("movgs gr0,ibar0"); return 0; } @@ -1073,7 +1054,6 @@ int gdbstub_clear_breakpoint(unsigned long type, unsigned long addr, unsigned lo if (__debug_regs->dcr & DCR_IBE1 && __get_ibar(1) == addr) { //gdbstub_printk("clear h/w break 1: %08lx\n", addr); __debug_regs->dcr &= ~DCR_IBE1; - __debug_regs->ibar[1] = 0; asm volatile("movgs gr0,ibar1"); return 0; } @@ -1081,7 +1061,6 @@ int gdbstub_clear_breakpoint(unsigned long type, unsigned long addr, unsigned lo if (__debug_regs->dcr & DCR_IBE2 && __get_ibar(2) == addr) { //gdbstub_printk("clear h/w break 2: %08lx\n", addr); __debug_regs->dcr &= ~DCR_IBE2; - __debug_regs->ibar[2] = 0; asm volatile("movgs gr0,ibar2"); return 0; } @@ -1089,7 +1068,6 @@ int gdbstub_clear_breakpoint(unsigned long type, unsigned long addr, unsigned lo if (__debug_regs->dcr & DCR_IBE3 && __get_ibar(3) == addr) { //gdbstub_printk("clear h/w break 3: %08lx\n", addr); __debug_regs->dcr &= ~DCR_IBE3; - __debug_regs->ibar[3] = 0; asm volatile("movgs gr0,ibar3"); return 0; } @@ -1126,12 +1104,6 @@ int gdbstub_clear_breakpoint(unsigned long type, unsigned long addr, unsigned lo //gdbstub_printk("clear h/w watchpoint 0 type %ld: %08lx\n", type, addr); __debug_regs->dcr &= ~(DCR_DRBE0|DCR_DWBE0); - __debug_regs->dbar[0] = 0; - __debug_regs->dbmr[0][0] = 0; - __debug_regs->dbmr[0][1] = 0; - __debug_regs->dbdr[0][0] = 0; - __debug_regs->dbdr[0][1] = 0; - asm volatile(" movgs gr0,dbar0 \n" " movgs gr0,dbmr00 \n" " movgs gr0,dbmr01 \n" @@ -1151,12 +1123,6 @@ int gdbstub_clear_breakpoint(unsigned long type, unsigned long addr, unsigned lo //gdbstub_printk("clear h/w watchpoint 1 type %ld: %08lx\n", type, addr); __debug_regs->dcr &= ~(DCR_DRBE1|DCR_DWBE1); - __debug_regs->dbar[1] = 0; - __debug_regs->dbmr[1][0] = 0; - __debug_regs->dbmr[1][1] = 0; - __debug_regs->dbdr[1][0] = 0; - __debug_regs->dbdr[1][1] = 0; - asm volatile(" movgs gr0,dbar1 \n" " movgs gr0,dbmr10 \n" " movgs gr0,dbmr11 \n" @@ -1197,7 +1163,7 @@ static void gdbstub_check_breakpoint(void) */ static void __attribute__((unused)) gdbstub_show_regs(void) { - unsigned long *reg; + uint32_t *reg; int loop; gdbstub_printk("\n"); @@ -1206,11 +1172,11 @@ static void __attribute__((unused)) gdbstub_show_regs(void) __debug_frame, __debug_frame->psr & PSR_S ? "kernel" : "user"); - reg = (unsigned long *) __debug_frame; - for (loop = 0; loop < NR_PT_REGS; loop++) { - printk("%s %08lx", regnames[loop + 0], reg[loop + 0]); + reg = (uint32_t *) __debug_frame; + for (loop = 0; loop < REG__END; loop++) { + printk("%s %08x", regnames[loop + 0], reg[loop + 0]); - if (loop == NR_PT_REGS - 1 || loop % 5 == 4) + if (loop == REG__END - 1 || loop % 5 == 4) printk("\n"); else printk(" | "); @@ -1225,8 +1191,13 @@ static void __attribute__((unused)) gdbstub_show_regs(void) */ static void __attribute__((unused)) gdbstub_dump_debugregs(void) { - gdbstub_printk("DCR %08lx ", __debug_status.dcr); - gdbstub_printk("BRR %08lx\n", __debug_status.brr); + unsigned long x; + + x = __debug_regs->dcr; + gdbstub_printk("DCR %08lx ", x); + + x = __debug_regs->brr; + gdbstub_printk("BRR %08lx\n", x); gdbstub_printk("IBAR0 %08lx ", __get_ibar(0)); gdbstub_printk("IBAR1 %08lx ", __get_ibar(1)); @@ -1389,7 +1360,7 @@ void gdbstub(int sigval) #endif } - save_user_regs(&__debug_frame0->uc); + save_user_regs(&__break_user_context); #if 0 gdbstub_printk("--> gdbstub() %08x %p %08x %08x\n", @@ -1418,8 +1389,8 @@ void gdbstub(int sigval) __debug_frame->psr &= ~PSR_S; if (__debug_frame->psr & PSR_PS) __debug_frame->psr |= PSR_S; - __debug_status.brr = (__debug_frame->tbr & TBR_TT) << 12; - __debug_status.brr |= BRR_EB; + __debug_regs->brr = (__debug_frame->tbr & TBR_TT) << 12; + __debug_regs->brr |= BRR_EB; sigval = SIGINT; } @@ -1433,15 +1404,15 @@ void gdbstub(int sigval) __debug_frame->psr &= ~PSR_S; if (__debug_frame->psr & PSR_PS) __debug_frame->psr |= PSR_S; - __debug_status.brr = (__debug_frame->tbr & TBR_TT) << 12; - __debug_status.brr |= BRR_EB; - sigval = SIGXCPU; + __debug_regs->brr = (__debug_frame->tbr & TBR_TT) << 12; + __debug_regs->brr |= BRR_EB; + sigval = SIGXCPU;; } LEDS(0x5002); /* after a BREAK insn, the PC lands on the far side of it */ - if (__debug_status.brr & BRR_SB) + if (__debug_regs->brr & BRR_SB) gdbstub_check_breakpoint(); LEDS(0x5003); @@ -1460,7 +1431,7 @@ void gdbstub(int sigval) } if (!sigval) - sigval = gdbstub_compute_signal(__debug_status.brr); + sigval = gdbstub_compute_signal(__debug_regs->brr); LEDS(0x5004); @@ -1470,7 +1441,7 @@ void gdbstub(int sigval) if (sigval != SIGINT && sigval != SIGTRAP && sigval != SIGILL) { static const char title[] = "Break "; static const char crlf[] = "\r\n"; - unsigned long brr = __debug_status.brr; + unsigned long brr = __debug_regs->brr; char hx; ptr = output_buffer; @@ -1594,24 +1565,28 @@ void gdbstub(int sigval) ptr = mem2hex(&zero, ptr, 4, 0); for (loop = 1; loop <= 27; loop++) - ptr = mem2hex(&__debug_user_context->i.gr[loop], ptr, 4, 0); + ptr = mem2hex((unsigned long *)__debug_frame + REG_GR(loop), + ptr, 4, 0); temp = (unsigned long) __frame; ptr = mem2hex(&temp, ptr, 4, 0); - ptr = mem2hex(&__debug_user_context->i.gr[29], ptr, 4, 0); - ptr = mem2hex(&__debug_user_context->i.gr[30], ptr, 4, 0); + ptr = mem2hex((unsigned long *)__debug_frame + REG_GR(29), ptr, 4, 0); + ptr = mem2hex((unsigned long *)__debug_frame + REG_GR(30), ptr, 4, 0); #ifdef CONFIG_MMU - ptr = mem2hex(&__debug_user_context->i.gr[31], ptr, 4, 0); + ptr = mem2hex((unsigned long *)__debug_frame + REG_GR(31), ptr, 4, 0); #else temp = (unsigned long) __debug_frame; ptr = mem2hex(&temp, ptr, 4, 0); #endif for (loop = 32; loop <= 63; loop++) - ptr = mem2hex(&__debug_user_context->i.gr[loop], ptr, 4, 0); + ptr = mem2hex((unsigned long *)__debug_frame + REG_GR(loop), + ptr, 4, 0); /* deal with FR0-FR63 */ for (loop = 0; loop <= 63; loop++) - ptr = mem2hex(&__debug_user_context->f.fr[loop], ptr, 4, 0); + ptr = mem2hex((unsigned long *)&__break_user_context + + __FPMEDIA_FR(loop), + ptr, 4, 0); /* deal with special registers */ ptr = mem2hex(&__debug_frame->pc, ptr, 4, 0); @@ -1622,7 +1597,7 @@ void gdbstub(int sigval) ptr = mem2hex(&zero, ptr, 4, 0); ptr = mem2hex(&zero, ptr, 4, 0); ptr = mem2hex(&__debug_frame->tbr, ptr, 4, 0); - ptr = mem2hex(&__debug_status.brr , ptr, 4, 0); + ptr = mem2hex(&__debug_regs->brr , ptr, 4, 0); asm volatile("movsg dbar0,%0" : "=r"(dbar)); ptr = mem2hex(&dbar, ptr, 4, 0); @@ -1647,21 +1622,21 @@ void gdbstub(int sigval) ptr = mem2hex(&__debug_frame->iacc0, ptr, 8, 0); - ptr = mem2hex(&__debug_user_context->f.fsr[0], ptr, 4, 0); + ptr = mem2hex(&__break_user_context.f.fsr[0], ptr, 4, 0); for (loop = 0; loop <= 7; loop++) - ptr = mem2hex(&__debug_user_context->f.acc[loop], ptr, 4, 0); + ptr = mem2hex(&__break_user_context.f.acc[loop], ptr, 4, 0); - ptr = mem2hex(&__debug_user_context->f.accg, ptr, 8, 0); + ptr = mem2hex(&__break_user_context.f.accg, ptr, 8, 0); for (loop = 0; loop <= 1; loop++) - ptr = mem2hex(&__debug_user_context->f.msr[loop], ptr, 4, 0); + ptr = mem2hex(&__break_user_context.f.msr[loop], ptr, 4, 0); ptr = mem2hex(&__debug_frame->gner0, ptr, 4, 0); ptr = mem2hex(&__debug_frame->gner1, ptr, 4, 0); - ptr = mem2hex(&__debug_user_context->f.fner[0], ptr, 4, 0); - ptr = mem2hex(&__debug_user_context->f.fner[1], ptr, 4, 0); + ptr = mem2hex(&__break_user_context.f.fner[0], ptr, 4, 0); + ptr = mem2hex(&__break_user_context.f.fner[1], ptr, 4, 0); break; @@ -1673,7 +1648,8 @@ void gdbstub(int sigval) ptr = hex2mem(ptr, &temp, 4); for (loop = 1; loop <= 27; loop++) - ptr = hex2mem(ptr, &__debug_user_context->i.gr[loop], 4); + ptr = hex2mem(ptr, (unsigned long *)__debug_frame + REG_GR(loop), + 4); ptr = hex2mem(ptr, &temp, 4); __frame = (struct pt_regs *) temp; @@ -1686,11 +1662,14 @@ void gdbstub(int sigval) #endif for (loop = 32; loop <= 63; loop++) - ptr = hex2mem(ptr, &__debug_user_context->i.gr[loop], 4); + ptr = hex2mem(ptr, (unsigned long *)__debug_frame + REG_GR(loop), + 4); /* deal with FR0-FR63 */ for (loop = 0; loop <= 63; loop++) - ptr = mem2hex(&__debug_user_context->f.fr[loop], ptr, 4, 0); + ptr = mem2hex((unsigned long *)&__break_user_context + + __FPMEDIA_FR(loop), + ptr, 4, 0); /* deal with special registers */ ptr = hex2mem(ptr, &__debug_frame->pc, 4); @@ -1715,21 +1694,21 @@ void gdbstub(int sigval) ptr = hex2mem(ptr, &__debug_frame->iacc0, 8); - ptr = hex2mem(ptr, &__debug_user_context->f.fsr[0], 4); + ptr = hex2mem(ptr, &__break_user_context.f.fsr[0], 4); for (loop = 0; loop <= 7; loop++) - ptr = hex2mem(ptr, &__debug_user_context->f.acc[loop], 4); + ptr = hex2mem(ptr, &__break_user_context.f.acc[loop], 4); - ptr = hex2mem(ptr, &__debug_user_context->f.accg, 8); + ptr = hex2mem(ptr, &__break_user_context.f.accg, 8); for (loop = 0; loop <= 1; loop++) - ptr = hex2mem(ptr, &__debug_user_context->f.msr[loop], 4); + ptr = hex2mem(ptr, &__break_user_context.f.msr[loop], 4); ptr = hex2mem(ptr, &__debug_frame->gner0, 4); ptr = hex2mem(ptr, &__debug_frame->gner1, 4); - ptr = hex2mem(ptr, &__debug_user_context->f.fner[0], 4); - ptr = hex2mem(ptr, &__debug_user_context->f.fner[1], 4); + ptr = hex2mem(ptr, &__break_user_context.f.fner[0], 4); + ptr = hex2mem(ptr, &__break_user_context.f.fner[1], 4); gdbstub_strcpy(output_buffer,"OK"); break; @@ -1790,52 +1769,52 @@ void gdbstub(int sigval) case GDB_REG_GR(0): break; case GDB_REG_GR(1) ... GDB_REG_GR(63): - __debug_user_context->i.gr[addr - GDB_REG_GR(0)] = temp; + __break_user_context.i.gr[addr - GDB_REG_GR(0)] = temp; break; case GDB_REG_FR(0) ... GDB_REG_FR(63): - __debug_user_context->f.fr[addr - GDB_REG_FR(0)] = temp; + __break_user_context.f.fr[addr - GDB_REG_FR(0)] = temp; break; case GDB_REG_PC: - __debug_user_context->i.pc = temp; + __break_user_context.i.pc = temp; break; case GDB_REG_PSR: - __debug_user_context->i.psr = temp; + __break_user_context.i.psr = temp; break; case GDB_REG_CCR: - __debug_user_context->i.ccr = temp; + __break_user_context.i.ccr = temp; break; case GDB_REG_CCCR: - __debug_user_context->i.cccr = temp; + __break_user_context.i.cccr = temp; break; case GDB_REG_BRR: - __debug_status.brr = temp; + __debug_regs->brr = temp; break; case GDB_REG_LR: - __debug_user_context->i.lr = temp; + __break_user_context.i.lr = temp; break; case GDB_REG_LCR: - __debug_user_context->i.lcr = temp; + __break_user_context.i.lcr = temp; break; case GDB_REG_FSR0: - __debug_user_context->f.fsr[0] = temp; + __break_user_context.f.fsr[0] = temp; break; case GDB_REG_ACC(0) ... GDB_REG_ACC(7): - __debug_user_context->f.acc[addr - GDB_REG_ACC(0)] = temp; + __break_user_context.f.acc[addr - GDB_REG_ACC(0)] = temp; break; case GDB_REG_ACCG(0): - *(uint32_t *) &__debug_user_context->f.accg[0] = temp; + *(uint32_t *) &__break_user_context.f.accg[0] = temp; break; case GDB_REG_ACCG(4): - *(uint32_t *) &__debug_user_context->f.accg[4] = temp; + *(uint32_t *) &__break_user_context.f.accg[4] = temp; break; case GDB_REG_MSR(0) ... GDB_REG_MSR(1): - __debug_user_context->f.msr[addr - GDB_REG_MSR(0)] = temp; + __break_user_context.f.msr[addr - GDB_REG_MSR(0)] = temp; break; case GDB_REG_GNER(0) ... GDB_REG_GNER(1): - __debug_user_context->i.gner[addr - GDB_REG_GNER(0)] = temp; + __break_user_context.i.gner[addr - GDB_REG_GNER(0)] = temp; break; case GDB_REG_FNER(0) ... GDB_REG_FNER(1): - __debug_user_context->f.fner[addr - GDB_REG_FNER(0)] = temp; + __break_user_context.f.fner[addr - GDB_REG_FNER(0)] = temp; break; default: temp2 = 0; @@ -1871,7 +1850,6 @@ void gdbstub(int sigval) /* step to next instruction */ case 's': __debug_regs->dcr |= DCR_SE; - __debug_status.dcr |= DCR_SE; goto done; /* set baud rate (bBB) */ @@ -1956,7 +1934,7 @@ void gdbstub(int sigval) } done: - restore_user_regs(&__debug_frame0->uc); + restore_user_regs(&__break_user_context); //gdbstub_dump_debugregs(); //gdbstub_printk("<-- gdbstub() %08x\n", __debug_frame->pc); @@ -1988,6 +1966,7 @@ void __init gdbstub_init(void) #endif gdbstub_printk("%s", gdbstub_banner); + gdbstub_printk("DCR: %x\n", __debug_regs->dcr); gdbstub_io_init(); diff --git a/arch/frv/kernel/head-mmu-fr451.S b/arch/frv/kernel/head-mmu-fr451.S index c8f210d84..a143c2f66 100644 --- a/arch/frv/kernel/head-mmu-fr451.S +++ b/arch/frv/kernel/head-mmu-fr451.S @@ -9,6 +9,7 @@ * 2 of the License, or (at your option) any later version. */ +#include #include #include #include diff --git a/arch/frv/kernel/head-uc-fr401.S b/arch/frv/kernel/head-uc-fr401.S index ee282be20..4ccf8414a 100644 --- a/arch/frv/kernel/head-uc-fr401.S +++ b/arch/frv/kernel/head-uc-fr401.S @@ -9,6 +9,7 @@ * 2 of the License, or (at your option) any later version. */ +#include #include #include #include diff --git a/arch/frv/kernel/head-uc-fr451.S b/arch/frv/kernel/head-uc-fr451.S index b10d9c829..31cb54a6f 100644 --- a/arch/frv/kernel/head-uc-fr451.S +++ b/arch/frv/kernel/head-uc-fr451.S @@ -9,6 +9,7 @@ * 2 of the License, or (at your option) any later version. */ +#include #include #include #include diff --git a/arch/frv/kernel/head-uc-fr555.S b/arch/frv/kernel/head-uc-fr555.S index 39937c19b..d088db269 100644 --- a/arch/frv/kernel/head-uc-fr555.S +++ b/arch/frv/kernel/head-uc-fr555.S @@ -9,6 +9,7 @@ * 2 of the License, or (at your option) any later version. */ +#include #include #include #include diff --git a/arch/frv/kernel/head.S b/arch/frv/kernel/head.S index fecf751c5..29a526548 100644 --- a/arch/frv/kernel/head.S +++ b/arch/frv/kernel/head.S @@ -9,9 +9,9 @@ * 2 of the License, or (at your option) any later version. */ +#include #include #include -#include #include #include #include diff --git a/arch/frv/kernel/irq-mb93091.c b/arch/frv/kernel/irq-mb93091.c index 1381abcd5..9778e0ff7 100644 --- a/arch/frv/kernel/irq-mb93091.c +++ b/arch/frv/kernel/irq-mb93091.c @@ -9,6 +9,7 @@ * 2 of the License, or (at your option) any later version. */ +#include #include #include #include diff --git a/arch/frv/kernel/irq-mb93093.c b/arch/frv/kernel/irq-mb93093.c index 48b2a6420..21ca2b298 100644 --- a/arch/frv/kernel/irq-mb93093.c +++ b/arch/frv/kernel/irq-mb93093.c @@ -9,6 +9,7 @@ * 2 of the License, or (at your option) any later version. */ +#include #include #include #include diff --git a/arch/frv/kernel/irq-mb93493.c b/arch/frv/kernel/irq-mb93493.c index 988d03564..c003ae5e2 100644 --- a/arch/frv/kernel/irq-mb93493.c +++ b/arch/frv/kernel/irq-mb93493.c @@ -9,6 +9,7 @@ * 2 of the License, or (at your option) any later version. */ +#include #include #include #include diff --git a/arch/frv/kernel/irq-routing.c b/arch/frv/kernel/irq-routing.c index 53886adf4..d4776d1f4 100644 --- a/arch/frv/kernel/irq-routing.c +++ b/arch/frv/kernel/irq-routing.c @@ -81,7 +81,7 @@ void distribute_irqs(struct irq_group *group, unsigned long irqmask) if (action) { int status = 0; -// if (!(action->flags & IRQF_DISABLED)) +// if (!(action->flags & SA_INTERRUPT)) // local_irq_enable(); do { @@ -90,7 +90,7 @@ void distribute_irqs(struct irq_group *group, unsigned long irqmask) action = action->next; } while (action); - if (status & IRQF_SAMPLE_RANDOM) + if (status & SA_SAMPLE_RANDOM) add_interrupt_randomness(irq); local_irq_disable(); } @@ -112,7 +112,7 @@ struct irq_source frv_cpuuart[2] = { #define __CPUUART(X, A) \ [X] = { \ .muxname = "uart", \ - .muxdata = (volatile void __iomem *)(unsigned long)A,\ + .muxdata = (volatile void __iomem *) A, \ .irqmask = 1 << IRQ_CPU_UART##X, \ .doirq = frv_cpuuart_doirq, \ } @@ -136,7 +136,7 @@ struct irq_source frv_cpudma[8] = { #define __CPUDMA(X, A) \ [X] = { \ .muxname = "dma", \ - .muxdata = (volatile void __iomem *)(unsigned long)A,\ + .muxdata = (volatile void __iomem *) A, \ .irqmask = 1 << IRQ_CPU_DMA##X, \ .doirq = frv_cpudma_doirq, \ } @@ -164,7 +164,7 @@ struct irq_source frv_cputimer[3] = { #define __CPUTIMER(X) \ [X] = { \ .muxname = "timer", \ - .muxdata = NULL, \ + .muxdata = 0, \ .irqmask = 1 << IRQ_CPU_TIMER##X, \ .doirq = frv_cputimer_doirq, \ } @@ -187,7 +187,7 @@ struct irq_source frv_cpuexternal[8] = { #define __CPUEXTERNAL(X) \ [X] = { \ .muxname = "ext", \ - .muxdata = NULL, \ + .muxdata = 0, \ .irqmask = 1 << IRQ_CPU_EXTERNAL##X, \ .doirq = frv_cpuexternal_doirq, \ } diff --git a/arch/frv/kernel/irq.c b/arch/frv/kernel/irq.c index 08967010b..27ab4c30a 100644 --- a/arch/frv/kernel/irq.c +++ b/arch/frv/kernel/irq.c @@ -16,6 +16,7 @@ * Naturally it's not a 1:1 relation, but there are similarities. */ +#include #include #include #include @@ -74,8 +75,9 @@ int show_interrupts(struct seq_file *p, void *v) switch (i) { case 0: seq_printf(p, " "); - for_each_online_cpu(j) - seq_printf(p, "CPU%d ",j); + for (j = 0; j < NR_CPUS; j++) + if (cpu_online(j)) + seq_printf(p, "CPU%d ",j); seq_putc(p, '\n'); break; @@ -98,8 +100,9 @@ int show_interrupts(struct seq_file *p, void *v) #ifndef CONFIG_SMP seq_printf(p, "%10u ", kstat_irqs(i)); #else - for_each_online_cpu(j) - seq_printf(p, "%10u ", kstat_cpu(j).irqs[i - 1]); + for (j = 0; j < NR_CPUS; j++) + if (cpu_online(j)) + seq_printf(p, "%10u ", kstat_cpu(j).irqs[i - 1]); #endif level = group->sources[ix]->level - frv_irq_levels; @@ -341,11 +344,11 @@ asmlinkage void do_NMI(void) * * Flags: * - * IRQF_SHARED Interrupt is shared + * SA_SHIRQ Interrupt is shared * - * IRQF_DISABLED Disable local interrupts while processing + * SA_INTERRUPT Disable local interrupts while processing * - * IRQF_SAMPLE_RANDOM The interrupt can be used for entropy + * SA_SAMPLE_RANDOM The interrupt can be used for entropy * */ @@ -365,7 +368,7 @@ int request_irq(unsigned int irq, * to figure out which interrupt is which (messes up the * interrupt freeing logic etc). */ - if (irqflags & IRQF_SHARED) { + if (irqflags & SA_SHIRQ) { if (!dev_id) printk("Bad boy: %s (at 0x%x) called us without a dev_id!\n", devname, (&irq)[-1]); @@ -576,7 +579,7 @@ int setup_irq(unsigned int irq, struct irqaction *new) * so we have to be careful not to interfere with a * running system. */ - if (new->flags & IRQF_SAMPLE_RANDOM) { + if (new->flags & SA_SAMPLE_RANDOM) { /* * This function might sleep, we want to call it first, * outside of the atomic block. @@ -592,7 +595,7 @@ int setup_irq(unsigned int irq, struct irqaction *new) spin_lock_irqsave(&level->lock, flags); /* can't share interrupts unless all parties agree to */ - if (level->usage != 0 && !(level->flags & new->flags & IRQF_SHARED)) { + if (level->usage != 0 && !(level->flags & new->flags & SA_SHIRQ)) { spin_unlock_irqrestore(&level->lock,flags); return -EBUSY; } @@ -624,7 +627,7 @@ static struct proc_dir_entry * irq_dir [NR_IRQS]; #define HEX_DIGITS 8 -static unsigned int parse_hex_value (const char __user *buffer, +static unsigned int parse_hex_value (const char *buffer, unsigned long count, unsigned long *ret) { unsigned char hexnum [HEX_DIGITS]; @@ -671,7 +674,7 @@ static int prof_cpu_mask_read_proc (char *page, char **start, off_t off, return sprintf (page, "%08lx\n", *mask); } -static int prof_cpu_mask_write_proc (struct file *file, const char __user *buffer, +static int prof_cpu_mask_write_proc (struct file *file, const char *buffer, unsigned long count, void *data) { unsigned long *mask = (unsigned long *) data, full_count = count, err; @@ -710,7 +713,7 @@ void init_irq_proc (void) int i; /* create /proc/irq */ - root_irq_dir = proc_mkdir("irq", NULL); + root_irq_dir = proc_mkdir("irq", 0); /* create /proc/irq/prof_cpu_mask */ entry = create_proc_entry("prof_cpu_mask", 0600, root_irq_dir); diff --git a/arch/frv/kernel/local.h b/arch/frv/kernel/local.h index 76606d13b..e9471761d 100644 --- a/arch/frv/kernel/local.h +++ b/arch/frv/kernel/local.h @@ -51,9 +51,6 @@ extern void (*__power_switch_wake_cleanup)(void); /* time.c */ extern void time_divisor_init(void); -/* cmode.S */ -extern asmlinkage void frv_change_cmode(int); - #endif /* __ASSEMBLY__ */ #endif /* _FRV_LOCAL_H */ diff --git a/arch/frv/kernel/pm-mb93093.c b/arch/frv/kernel/pm-mb93093.c index eaa7b582e..34d01d7dc 100644 --- a/arch/frv/kernel/pm-mb93093.c +++ b/arch/frv/kernel/pm-mb93093.c @@ -10,6 +10,7 @@ * */ +#include #include #include #include diff --git a/arch/frv/kernel/pm.c b/arch/frv/kernel/pm.c index c1d9fc8f1..f0b8fff3e 100644 --- a/arch/frv/kernel/pm.c +++ b/arch/frv/kernel/pm.c @@ -11,6 +11,7 @@ * */ +#include #include #include #include @@ -26,6 +27,11 @@ #include "local.h" +void (*pm_power_off)(void); +EXPORT_SYMBOL(pm_power_off); + +extern void frv_change_cmode(int); + /* * Debug macros */ @@ -131,7 +137,7 @@ unsigned long sleep_phys_sp(void *sp) #define CTL_PM_P0 4 #define CTL_PM_CM 5 -static int user_atoi(char __user *ubuf, size_t len) +static int user_atoi(char *ubuf, size_t len) { char buf[16]; unsigned long ret; @@ -153,7 +159,7 @@ static int user_atoi(char __user *ubuf, size_t len) * Send us to sleep. */ static int sysctl_pm_do_suspend(ctl_table *ctl, int write, struct file *filp, - void __user *buffer, size_t *lenp, loff_t *fpos) + void *buffer, size_t *lenp, loff_t *fpos) { int retval, mode; @@ -209,7 +215,7 @@ static int try_set_cmode(int new_cmode) static int cmode_procctl(ctl_table *ctl, int write, struct file *filp, - void __user *buffer, size_t *lenp, loff_t *fpos) + void *buffer, size_t *lenp, loff_t *fpos) { int new_cmode; @@ -221,9 +227,9 @@ static int cmode_procctl(ctl_table *ctl, int write, struct file *filp, return try_set_cmode(new_cmode)?:*lenp; } -static int cmode_sysctl(ctl_table *table, int __user *name, int nlen, - void __user *oldval, size_t __user *oldlenp, - void __user *newval, size_t newlen, void **context) +static int cmode_sysctl(ctl_table *table, int *name, int nlen, + void *oldval, size_t *oldlenp, + void *newval, size_t newlen, void **context) { if (oldval && oldlenp) { size_t oldlen; @@ -234,7 +240,7 @@ static int cmode_sysctl(ctl_table *table, int __user *name, int nlen, if (oldlen != sizeof(int)) return -EINVAL; - if (put_user(clock_cmode_current, (unsigned __user *)oldval) || + if (put_user(clock_cmode_current, (unsigned int *)oldval) || put_user(sizeof(int), oldlenp)) return -EFAULT; } @@ -244,7 +250,7 @@ static int cmode_sysctl(ctl_table *table, int __user *name, int nlen, if (newlen != sizeof(int)) return -EINVAL; - if (get_user(new_cmode, (int __user *)newval)) + if (get_user(new_cmode, (int *)newval)) return -EFAULT; return try_set_cmode(new_cmode)?:1; @@ -312,7 +318,7 @@ static int try_set_cm(int new_cm) } static int p0_procctl(ctl_table *ctl, int write, struct file *filp, - void __user *buffer, size_t *lenp, loff_t *fpos) + void *buffer, size_t *lenp, loff_t *fpos) { int new_p0; @@ -324,9 +330,9 @@ static int p0_procctl(ctl_table *ctl, int write, struct file *filp, return try_set_p0(new_p0)?:*lenp; } -static int p0_sysctl(ctl_table *table, int __user *name, int nlen, - void __user *oldval, size_t __user *oldlenp, - void __user *newval, size_t newlen, void **context) +static int p0_sysctl(ctl_table *table, int *name, int nlen, + void *oldval, size_t *oldlenp, + void *newval, size_t newlen, void **context) { if (oldval && oldlenp) { size_t oldlen; @@ -337,7 +343,7 @@ static int p0_sysctl(ctl_table *table, int __user *name, int nlen, if (oldlen != sizeof(int)) return -EINVAL; - if (put_user(clock_p0_current, (unsigned __user *)oldval) || + if (put_user(clock_p0_current, (unsigned int *)oldval) || put_user(sizeof(int), oldlenp)) return -EFAULT; } @@ -347,7 +353,7 @@ static int p0_sysctl(ctl_table *table, int __user *name, int nlen, if (newlen != sizeof(int)) return -EINVAL; - if (get_user(new_p0, (int __user *)newval)) + if (get_user(new_p0, (int *)newval)) return -EFAULT; return try_set_p0(new_p0)?:1; @@ -356,7 +362,7 @@ static int p0_sysctl(ctl_table *table, int __user *name, int nlen, } static int cm_procctl(ctl_table *ctl, int write, struct file *filp, - void __user *buffer, size_t *lenp, loff_t *fpos) + void *buffer, size_t *lenp, loff_t *fpos) { int new_cm; @@ -368,9 +374,9 @@ static int cm_procctl(ctl_table *ctl, int write, struct file *filp, return try_set_cm(new_cm)?:*lenp; } -static int cm_sysctl(ctl_table *table, int __user *name, int nlen, - void __user *oldval, size_t __user *oldlenp, - void __user *newval, size_t newlen, void **context) +static int cm_sysctl(ctl_table *table, int *name, int nlen, + void *oldval, size_t *oldlenp, + void *newval, size_t newlen, void **context) { if (oldval && oldlenp) { size_t oldlen; @@ -381,7 +387,7 @@ static int cm_sysctl(ctl_table *table, int __user *name, int nlen, if (oldlen != sizeof(int)) return -EINVAL; - if (put_user(clock_cm_current, (unsigned __user *)oldval) || + if (put_user(clock_cm_current, (unsigned int *)oldval) || put_user(sizeof(int), oldlenp)) return -EFAULT; } @@ -391,7 +397,7 @@ static int cm_sysctl(ctl_table *table, int __user *name, int nlen, if (newlen != sizeof(int)) return -EINVAL; - if (get_user(new_cm, (int __user *)newval)) + if (get_user(new_cm, (int *)newval)) return -EFAULT; return try_set_cm(new_cm)?:1; diff --git a/arch/frv/kernel/process.c b/arch/frv/kernel/process.c index 515a5cea5..0fff8a61e 100644 --- a/arch/frv/kernel/process.c +++ b/arch/frv/kernel/process.c @@ -10,7 +10,7 @@ * 2 of the License, or (at your option) any later version. */ -#include +#include #include #include #include @@ -26,7 +26,6 @@ #include #include -#include #include #include #include @@ -40,9 +39,6 @@ asmlinkage void ret_from_fork(void); #include -void (*pm_power_off)(void); -EXPORT_SYMBOL(pm_power_off); - struct task_struct *alloc_task_struct(void) { struct task_struct *p = kmalloc(THREAD_SIZE, GFP_KERNEL); @@ -208,7 +204,7 @@ int copy_thread(int nr, unsigned long clone_flags, regs0 = __kernel_frame0_ptr; childregs0 = (struct pt_regs *) - (task_stack_page(p) + THREAD_SIZE - FRV_FRAME0_SIZE); + (task_stack_page(p) + THREAD_SIZE - USER_CONTEXT_SIZE); childregs = childregs0; /* set up the userspace frame (the only place that the USP is stored) */ @@ -250,7 +246,7 @@ int copy_thread(int nr, unsigned long clone_flags, /* * sys_execve() executes a new program. */ -asmlinkage int sys_execve(char __user *name, char __user * __user *argv, char __user * __user *envp) +asmlinkage int sys_execve(char *name, char **argv, char **envp) { int error; char * filename; @@ -372,11 +368,3 @@ int elf_check_arch(const struct elf32_hdr *hdr) return 1; } - -int dump_fpu(struct pt_regs *regs, elf_fpregset_t *fpregs) -{ - memcpy(fpregs, - ¤t->thread.user->f, - sizeof(current->thread.user->f)); - return 1; -} diff --git a/arch/frv/kernel/ptrace.c b/arch/frv/kernel/ptrace.c index fcff819b4..f953484e7 100644 --- a/arch/frv/kernel/ptrace.c +++ b/arch/frv/kernel/ptrace.c @@ -18,6 +18,7 @@ #include #include #include +#include #include #include diff --git a/arch/frv/kernel/semaphore.c b/arch/frv/kernel/semaphore.c index f278cdf3a..7971d680a 100644 --- a/arch/frv/kernel/semaphore.c +++ b/arch/frv/kernel/semaphore.c @@ -10,6 +10,7 @@ * 2 of the License, or (at your option) any later version. */ +#include #include #include #include diff --git a/arch/frv/kernel/setup.c b/arch/frv/kernel/setup.c index af08ccd4e..5908deae9 100644 --- a/arch/frv/kernel/setup.c +++ b/arch/frv/kernel/setup.c @@ -10,7 +10,8 @@ * 2 of the License, or (at your option) any later version. */ -#include +#include +#include #include #include #include @@ -813,7 +814,7 @@ void __init setup_arch(char **cmdline_p) * - by now the stack is part of the init task */ printk("Memory %08lx-%08lx\n", memory_start, memory_end); - BUG_ON(memory_start == memory_end); + if (memory_start == memory_end) BUG(); init_mm.start_code = (unsigned long) &_stext; init_mm.end_code = (unsigned long) &_etext; diff --git a/arch/frv/kernel/signal.c b/arch/frv/kernel/signal.c index b8a5882b8..679c1d5cc 100644 --- a/arch/frv/kernel/signal.c +++ b/arch/frv/kernel/signal.c @@ -98,7 +98,7 @@ int sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss) struct sigframe { - __sigrestore_t pretcode; + void (*pretcode)(void); int sig; struct sigcontext sc; unsigned long extramask[_NSIG_WORDS-1]; @@ -107,10 +107,10 @@ struct sigframe struct rt_sigframe { - __sigrestore_t pretcode; + void (*pretcode)(void); int sig; - struct siginfo __user *pinfo; - void __user *puc; + struct siginfo *pinfo; + void *puc; struct siginfo info; struct ucontext uc; uint32_t retcode[2]; @@ -233,7 +233,7 @@ static inline void __user *get_sigframe(struct k_sigaction *ka, /* This is the X/Open sanctioned signal stack switching. */ if (ka->sa.sa_flags & SA_ONSTACK) { - if (! sas_ss_flags(sp)) + if (! on_sig_stack(sp)) sp = current->sas_ss_sp + current->sas_ss_size; } @@ -284,7 +284,7 @@ static int setup_frame(int sig, struct k_sigaction *ka, sigset_t *set) * setlos #__NR_sigreturn,gr7 * tira gr0,0 */ - if (__put_user((__sigrestore_t)frame->retcode, &frame->pretcode) || + if (__put_user((void (*)(void))frame->retcode, &frame->pretcode) || __put_user(0x8efc0000|__NR_sigreturn, &frame->retcode[0]) || __put_user(0xc0700000, &frame->retcode[1])) goto give_sigsegv; @@ -300,7 +300,7 @@ static int setup_frame(int sig, struct k_sigaction *ka, sigset_t *set) if (get_personality & FDPIC_FUNCPTRS) { struct fdpic_func_descriptor __user *funcptr = - (struct fdpic_func_descriptor __user *) ka->sa.sa_handler; + (struct fdpic_func_descriptor *) ka->sa.sa_handler; __get_user(__frame->pc, &funcptr->text); __get_user(__frame->gr15, &funcptr->GOT); } else { @@ -359,8 +359,8 @@ static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, /* Create the ucontext. */ if (__put_user(0, &frame->uc.uc_flags) || - __put_user(NULL, &frame->uc.uc_link) || - __put_user((void __user *)current->sas_ss_sp, &frame->uc.uc_stack.ss_sp) || + __put_user(0, &frame->uc.uc_link) || + __put_user((void*)current->sas_ss_sp, &frame->uc.uc_stack.ss_sp) || __put_user(sas_ss_flags(__frame->sp), &frame->uc.uc_stack.ss_flags) || __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size)) goto give_sigsegv; @@ -382,7 +382,7 @@ static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, * setlos #__NR_sigreturn,gr7 * tira gr0,0 */ - if (__put_user((__sigrestore_t)frame->retcode, &frame->pretcode) || + if (__put_user((void (*)(void))frame->retcode, &frame->pretcode) || __put_user(0x8efc0000|__NR_rt_sigreturn, &frame->retcode[0]) || __put_user(0xc0700000, &frame->retcode[1])) goto give_sigsegv; @@ -398,7 +398,7 @@ static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, __frame->gr9 = (unsigned long) &frame->info; if (get_personality & FDPIC_FUNCPTRS) { - struct fdpic_func_descriptor __user *funcptr = + struct fdpic_func_descriptor *funcptr = (struct fdpic_func_descriptor __user *) ka->sa.sa_handler; __get_user(__frame->pc, &funcptr->text); __get_user(__frame->gr15, &funcptr->GOT); diff --git a/arch/frv/kernel/sleep.S b/arch/frv/kernel/sleep.S index c9b2d51ab..e6079b8ca 100644 --- a/arch/frv/kernel/sleep.S +++ b/arch/frv/kernel/sleep.S @@ -11,6 +11,7 @@ */ #include +#include #include #include #include diff --git a/arch/frv/kernel/switch_to.S b/arch/frv/kernel/switch_to.S index b5275fa9c..1703dc201 100644 --- a/arch/frv/kernel/switch_to.S +++ b/arch/frv/kernel/switch_to.S @@ -11,7 +11,7 @@ # 2 of the License, or (at your option) any later version. # ############################################################################### - +#include #include #include #include @@ -31,7 +31,7 @@ # address of frame 0 (userspace) on current kernel stack .globl __kernel_frame0_ptr __kernel_frame0_ptr: - .long init_thread_union + THREAD_SIZE - FRV_FRAME0_SIZE + .long init_thread_union + THREAD_SIZE - USER_CONTEXT_SIZE # address of current task .globl __kernel_current_task diff --git a/arch/frv/kernel/sys_frv.c b/arch/frv/kernel/sys_frv.c index c4d4348c9..931aa6d89 100644 --- a/arch/frv/kernel/sys_frv.c +++ b/arch/frv/kernel/sys_frv.c @@ -32,7 +32,7 @@ * sys_pipe() is the normal C calling standard for creating * a pipe. It's not the way unix traditionally does this, though. */ -asmlinkage long sys_pipe(unsigned long __user * fildes) +asmlinkage long sys_pipe(unsigned long * fildes) { int fd[2]; int error; diff --git a/arch/frv/kernel/sysctl.c b/arch/frv/kernel/sysctl.c index ce676803e..408b0f382 100644 --- a/arch/frv/kernel/sysctl.c +++ b/arch/frv/kernel/sysctl.c @@ -9,6 +9,7 @@ * 2 of the License, or (at your option) any later version. */ +#include #include #include #include @@ -48,7 +49,7 @@ static void frv_change_dcache_mode(unsigned long newmode) * handle requests to dynamically switch the write caching mode delivered by /proc */ static int procctl_frv_cachemode(ctl_table *table, int write, struct file *filp, - void __user *buffer, size_t *lenp, loff_t *ppos) + void *buffer, size_t *lenp, loff_t *ppos) { unsigned long hsr0; char buff[8]; @@ -122,7 +123,7 @@ static int procctl_frv_cachemode(ctl_table *table, int write, struct file *filp, */ #ifdef CONFIG_MMU static int procctl_frv_pin_cxnr(ctl_table *table, int write, struct file *filp, - void __user *buffer, size_t *lenp, loff_t *ppos) + void *buffer, size_t *lenp, loff_t *ppos) { pid_t pid; char buff[16], *p; diff --git a/arch/frv/kernel/time.c b/arch/frv/kernel/time.c index 35eaf5e26..24cf85f89 100644 --- a/arch/frv/kernel/time.c +++ b/arch/frv/kernel/time.c @@ -10,6 +10,7 @@ * 2 of the License, or (at your option) any later version. */ +#include /* CONFIG_HEARTBEAT */ #include #include #include @@ -31,6 +32,8 @@ #define TICK_SIZE (tick_nsec / 1000) +extern unsigned long wall_jiffies; + unsigned long __nongprelbss __clkin_clock_speed_HZ; unsigned long __nongprelbss __ext_bus_clock_speed_HZ; unsigned long __nongprelbss __res_bus_clock_speed_HZ; @@ -44,7 +47,7 @@ unsigned long __delay_loops_MHz; static irqreturn_t timer_interrupt(int irq, void *dummy, struct pt_regs *regs); static struct irqaction timer_irq = { - timer_interrupt, IRQF_DISABLED, CPU_MASK_NONE, "timer", NULL, NULL + timer_interrupt, SA_INTERRUPT, CPU_MASK_NONE, "timer", NULL, NULL }; static inline int set_rtc_mmss(unsigned long nowtime) @@ -141,6 +144,85 @@ void time_init(void) time_divisor_init(); } +/* + * This version of gettimeofday has near microsecond resolution. + */ +void do_gettimeofday(struct timeval *tv) +{ + unsigned long seq; + unsigned long usec, sec; + unsigned long max_ntp_tick; + + do { + unsigned long lost; + + seq = read_seqbegin(&xtime_lock); + + usec = 0; + lost = jiffies - wall_jiffies; + + /* + * If time_adjust is negative then NTP is slowing the clock + * so make sure not to go into next possible interval. + * Better to lose some accuracy than have time go backwards.. + */ + if (unlikely(time_adjust < 0)) { + max_ntp_tick = (USEC_PER_SEC / HZ) - tickadj; + usec = min(usec, max_ntp_tick); + + if (lost) + usec += lost * max_ntp_tick; + } + else if (unlikely(lost)) + usec += lost * (USEC_PER_SEC / HZ); + + sec = xtime.tv_sec; + usec += (xtime.tv_nsec / 1000); + } while (read_seqretry(&xtime_lock, seq)); + + while (usec >= 1000000) { + usec -= 1000000; + sec++; + } + + tv->tv_sec = sec; + tv->tv_usec = usec; +} + +EXPORT_SYMBOL(do_gettimeofday); + +int do_settimeofday(struct timespec *tv) +{ + 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_irq(&xtime_lock); + /* + * This is revolting. We need to set "xtime" correctly. However, the + * value in this location is the value at the most recent update of + * wall time. Discover what correction gettimeofday() would have + * made, and then undo it! + */ + nsec -= 0 * NSEC_PER_USEC; + nsec -= (jiffies - wall_jiffies) * TICK_NSEC; + + 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); + + ntp_clear(); + write_sequnlock_irq(&xtime_lock); + clock_was_set(); + return 0; +} + +EXPORT_SYMBOL(do_settimeofday); + /* * Scheduler clock - returns current time in nanosec units. */ diff --git a/arch/frv/kernel/traps.c b/arch/frv/kernel/traps.c index 2e6098c85..9eb84b2e6 100644 --- a/arch/frv/kernel/traps.c +++ b/arch/frv/kernel/traps.c @@ -9,6 +9,7 @@ * 2 of the License, or (at your option) any later version. */ +#include #include #include #include @@ -20,7 +21,6 @@ #include #include -#include #include #include #include @@ -280,20 +280,20 @@ static const char *regnames[] = { void show_regs(struct pt_regs *regs) { - unsigned long *reg; + uint32_t *reg; int loop; printk("\n"); - printk("Frame: @%08lx [%s]\n", - (unsigned long) regs, + printk("Frame: @%08x [%s]\n", + (uint32_t) regs, regs->psr & PSR_S ? "kernel" : "user"); - reg = (unsigned long *) regs; - for (loop = 0; loop < NR_PT_REGS; loop++) { - printk("%s %08lx", regnames[loop + 0], reg[loop + 0]); + reg = (uint32_t *) regs; + for (loop = 0; loop < REG__END; loop++) { + printk("%s %08x", regnames[loop + 0], reg[loop + 0]); - if (loop == NR_PT_REGS - 1 || loop % 5 == 4) + if (loop == REG__END - 1 || loop % 5 == 4) printk("\n"); else printk(" | "); @@ -329,7 +329,7 @@ void die_if_kernel(const char *str, ...) */ static void show_backtrace_regs(struct pt_regs *frame) { - unsigned long *reg; + uint32_t *reg; int loop; /* print the registers for this frame */ @@ -337,11 +337,11 @@ static void show_backtrace_regs(struct pt_regs *frame) frame->psr & PSR_S ? "Kernel Mode" : "User Mode", frame); - reg = (unsigned long *) frame; - for (loop = 0; loop < NR_PT_REGS; loop++) { - printk("%s %08lx", regnames[loop + 0], reg[loop + 0]); + reg = (uint32_t *) frame; + for (loop = 0; loop < REG__END; loop++) { + printk("%s %08x", regnames[loop + 0], reg[loop + 0]); - if (loop == NR_PT_REGS - 1 || loop % 5 == 4) + if (loop == REG__END - 1 || loop % 5 == 4) printk("\n"); else printk(" | "); diff --git a/arch/frv/kernel/uaccess.c b/arch/frv/kernel/uaccess.c index 9fb771a20..9b751c0f0 100644 --- a/arch/frv/kernel/uaccess.c +++ b/arch/frv/kernel/uaccess.c @@ -17,7 +17,7 @@ /* * copy a null terminated string from userspace */ -long strncpy_from_user(char *dst, const char __user *src, long count) +long strncpy_from_user(char *dst, const char *src, long count) { unsigned long max; char *p, ch; @@ -70,9 +70,9 @@ EXPORT_SYMBOL(strncpy_from_user); * * Return 0 on exception, a value greater than N if too long */ -long strnlen_user(const char __user *src, long count) +long strnlen_user(const char *src, long count) { - const char __user *p; + const char *p; long err = 0; char ch; diff --git a/arch/frv/mb93090-mb00/pci-frv.c b/arch/frv/mb93090-mb00/pci-frv.c index 4f165c93b..0a26bf6f1 100644 --- a/arch/frv/mb93090-mb00/pci-frv.c +++ b/arch/frv/mb93090-mb00/pci-frv.c @@ -64,10 +64,10 @@ pcibios_update_resource(struct pci_dev *dev, struct resource *root, */ void pcibios_align_resource(void *data, struct resource *res, - resource_size_t size, resource_size_t align) + unsigned long size, unsigned long align) { if (res->flags & IORESOURCE_IO) { - resource_size_t start = res->start; + unsigned long start = res->start; if (start & 0x300) { start = (start + 0x3ff) & ~0x3ff; diff --git a/arch/frv/mb93090-mb00/pci-irq.c b/arch/frv/mb93090-mb00/pci-irq.c index 2278c80bd..c4a1144c9 100644 --- a/arch/frv/mb93090-mb00/pci-irq.c +++ b/arch/frv/mb93090-mb00/pci-irq.c @@ -5,6 +5,7 @@ * derived from: arch/i386/kernel/pci-irq.c: (c) 1999--2000 Martin Mares */ +#include #include #include #include @@ -31,11 +32,11 @@ */ static const uint8_t __initdata pci_bus0_irq_routing[32][4] = { - [0 ] = { IRQ_FPGA_MB86943_PCI_INTA }, - [16] = { IRQ_FPGA_RTL8029_INTA }, - [17] = { IRQ_FPGA_PCI_INTC, IRQ_FPGA_PCI_INTD, IRQ_FPGA_PCI_INTA, IRQ_FPGA_PCI_INTB }, - [18] = { IRQ_FPGA_PCI_INTB, IRQ_FPGA_PCI_INTC, IRQ_FPGA_PCI_INTD, IRQ_FPGA_PCI_INTA }, - [19] = { IRQ_FPGA_PCI_INTA, IRQ_FPGA_PCI_INTB, IRQ_FPGA_PCI_INTC, IRQ_FPGA_PCI_INTD }, + [0 ] { IRQ_FPGA_MB86943_PCI_INTA }, + [16] { IRQ_FPGA_RTL8029_INTA }, + [17] { IRQ_FPGA_PCI_INTC, IRQ_FPGA_PCI_INTD, IRQ_FPGA_PCI_INTA, IRQ_FPGA_PCI_INTB }, + [18] { IRQ_FPGA_PCI_INTB, IRQ_FPGA_PCI_INTC, IRQ_FPGA_PCI_INTD, IRQ_FPGA_PCI_INTA }, + [19] { IRQ_FPGA_PCI_INTA, IRQ_FPGA_PCI_INTB, IRQ_FPGA_PCI_INTC, IRQ_FPGA_PCI_INTD }, }; void __init pcibios_irq_init(void) diff --git a/arch/frv/mb93090-mb00/pci-vdk.c b/arch/frv/mb93090-mb00/pci-vdk.c index f7279d789..c8817f7b8 100644 --- a/arch/frv/mb93090-mb00/pci-vdk.c +++ b/arch/frv/mb93090-mb00/pci-vdk.c @@ -9,6 +9,7 @@ * 2 of the License, or (at your option) any later version. */ +#include #include #include #include @@ -406,9 +407,7 @@ int __init pcibios_init(void) ioport_resource.end = (__reg_MB86943_sl_pci_io_range << 9) | 0x3ff; ioport_resource.end += ioport_resource.start; - printk("PCI IO window: %08llx-%08llx\n", - (unsigned long long) ioport_resource.start, - (unsigned long long) ioport_resource.end); + printk("PCI IO window: %08lx-%08lx\n", ioport_resource.start, ioport_resource.end); iomem_resource.start = (__reg_MB86943_sl_pci_mem_base << 9) & 0xfffffc00; @@ -418,11 +417,8 @@ int __init pcibios_init(void) iomem_resource.end = (__reg_MB86943_sl_pci_mem_range << 9) | 0x3ff; iomem_resource.end += iomem_resource.start; - printk("PCI MEM window: %08llx-%08llx\n", - (unsigned long long) iomem_resource.start, - (unsigned long long) iomem_resource.end); - printk("PCI DMA memory: %08lx-%08lx\n", - dma_coherent_mem_start, dma_coherent_mem_end); + printk("PCI MEM window: %08lx-%08lx\n", iomem_resource.start, iomem_resource.end); + printk("PCI DMA memory: %08lx-%08lx\n", dma_coherent_mem_start, dma_coherent_mem_end); if (!pci_probe) return -ENXIO; diff --git a/arch/frv/mm/dma-alloc.c b/arch/frv/mm/dma-alloc.c index dc6522c46..342823aad 100644 --- a/arch/frv/mm/dma-alloc.c +++ b/arch/frv/mm/dma-alloc.c @@ -21,6 +21,7 @@ * published by the Free Software Foundation. */ +#include #include #include #include @@ -114,7 +115,9 @@ void *consistent_alloc(gfp_t gfp, size_t size, dma_addr_t *dma_handle) */ if (order > 0) { struct page *rpage = virt_to_page(page); - split_page(rpage, order); + + for (i = 1; i < (1 << order); i++) + set_page_count(rpage + i, 1); } err = 0; diff --git a/arch/frv/mm/extable.c b/arch/frv/mm/extable.c index 6aea124f5..caacf030a 100644 --- a/arch/frv/mm/extable.c +++ b/arch/frv/mm/extable.c @@ -2,6 +2,7 @@ * linux/arch/frv/mm/extable.c */ +#include #include #include #include diff --git a/arch/frv/mm/init.c b/arch/frv/mm/init.c index b5b4286f9..765088ea8 100644 --- a/arch/frv/mm/init.c +++ b/arch/frv/mm/init.c @@ -16,6 +16,7 @@ * - Copyright (C) 1995 Hamish Macdonald */ +#include #include #include #include @@ -168,7 +169,7 @@ void __init mem_init(void) struct page *page = &mem_map[pfn]; ClearPageReserved(page); - init_page_count(page); + set_page_count(page, 1); __free_page(page); totalram_pages++; } @@ -209,7 +210,7 @@ void __init free_initmem(void) /* next to check that the page we free is not a partial page */ for (addr = start; addr < end; addr += PAGE_SIZE) { ClearPageReserved(virt_to_page(addr)); - init_page_count(virt_to_page(addr)); + set_page_count(virt_to_page(addr), 1); free_page(addr); totalram_pages++; } @@ -229,7 +230,7 @@ void __init free_initrd_mem(unsigned long start, unsigned long end) int pages = 0; for (; start < end; start += PAGE_SIZE) { ClearPageReserved(virt_to_page(start)); - init_page_count(virt_to_page(start)); + set_page_count(virt_to_page(start), 1); free_page(start); totalram_pages++; pages++; diff --git a/arch/frv/mm/kmap.c b/arch/frv/mm/kmap.c index fb78be38e..c54f18e65 100644 --- a/arch/frv/mm/kmap.c +++ b/arch/frv/mm/kmap.c @@ -10,6 +10,7 @@ * 2 of the License, or (at your option) any later version. */ +#include #include #include #include @@ -30,15 +31,15 @@ * Map some physical address range into the kernel address space. */ -void __iomem *__ioremap(unsigned long physaddr, unsigned long size, int cacheflag) +void *__ioremap(unsigned long physaddr, unsigned long size, int cacheflag) { - return (void __iomem *)physaddr; + return (void *)physaddr; } /* * Unmap a ioremap()ed region again */ -void iounmap(void volatile __iomem *addr) +void iounmap(void *addr) { } diff --git a/arch/frv/mm/mmu-context.c b/arch/frv/mm/mmu-context.c index 1530a4111..6983198ca 100644 --- a/arch/frv/mm/mmu-context.c +++ b/arch/frv/mm/mmu-context.c @@ -11,6 +11,7 @@ #include #include +#include #include #define NR_CXN 4096 @@ -54,9 +55,9 @@ static unsigned get_cxn(mm_context_t *ctx) /* find the first unallocated context number * - 0 is reserved for the kernel */ - cxn = find_next_zero_bit(cxn_bitmap, NR_CXN, 1); + cxn = find_next_zero_bit(&cxn_bitmap, NR_CXN, 1); if (cxn < NR_CXN) { - set_bit(cxn, cxn_bitmap); + set_bit(cxn, &cxn_bitmap); } else { /* none remaining - need to steal someone else's cxn */ @@ -138,7 +139,7 @@ void destroy_context(struct mm_struct *mm) cxn_pinned = -1; list_del_init(&ctx->id_link); - clear_bit(ctx->id, cxn_bitmap); + clear_bit(ctx->id, &cxn_bitmap); __flush_tlb_mm(ctx->id); ctx->id = 0; } diff --git a/arch/frv/mm/tlb-flush.S b/arch/frv/mm/tlb-flush.S index 79b3c7091..6f43c74c5 100644 --- a/arch/frv/mm/tlb-flush.S +++ b/arch/frv/mm/tlb-flush.S @@ -10,6 +10,7 @@ */ #include +#include #include #include #include diff --git a/arch/frv/mm/tlb-miss.S b/arch/frv/mm/tlb-miss.S index 04da67468..8729f7d7c 100644 --- a/arch/frv/mm/tlb-miss.S +++ b/arch/frv/mm/tlb-miss.S @@ -10,6 +10,7 @@ */ #include +#include #include #include #include diff --git a/arch/frv/mm/unaligned.c b/arch/frv/mm/unaligned.c index 8f0375fc1..09b361443 100644 --- a/arch/frv/mm/unaligned.c +++ b/arch/frv/mm/unaligned.c @@ -9,6 +9,7 @@ * 2 of the License, or (at your option) any later version. */ +#include #include #include #include diff --git a/arch/h8300/Kconfig b/arch/h8300/Kconfig index 3f2426d37..a6038b070 100644 --- a/arch/h8300/Kconfig +++ b/arch/h8300/Kconfig @@ -29,14 +29,6 @@ config RWSEM_XCHGADD_ALGORITHM bool default n -config GENERIC_FIND_NEXT_BIT - bool - default y - -config GENERIC_HWEIGHT - bool - default y - config GENERIC_CALIBRATE_DELAY bool default y diff --git a/arch/h8300/kernel/gpio.c b/arch/h8300/kernel/gpio.c index 6a25dd553..d195568ca 100644 --- a/arch/h8300/kernel/gpio.c +++ b/arch/h8300/kernel/gpio.c @@ -9,6 +9,7 @@ * Internal I/O Port Management */ +#include #include #include #include diff --git a/arch/h8300/kernel/h8300_ksyms.c b/arch/h8300/kernel/h8300_ksyms.c index 9b4be053d..5cc76efaf 100644 --- a/arch/h8300/kernel/h8300_ksyms.c +++ b/arch/h8300/kernel/h8300_ksyms.c @@ -7,6 +7,7 @@ #include #include #include +#include #include #include @@ -53,6 +54,8 @@ EXPORT_SYMBOL(memcmp); EXPORT_SYMBOL(memscan); EXPORT_SYMBOL(memmove); +EXPORT_SYMBOL(get_wchan); + /* * libgcc functions - functions that are used internally by the * compiler... (prototypes are not correct though, but that diff --git a/arch/h8300/kernel/ints.c b/arch/h8300/kernel/ints.c index 1488b6ace..edb3c4170 100644 --- a/arch/h8300/kernel/ints.c +++ b/arch/h8300/kernel/ints.c @@ -158,7 +158,7 @@ int request_irq(unsigned int irq, irq_handle->devname = devname; irq_list[irq] = irq_handle; - if (irq_handle->flags & IRQF_SAMPLE_RANDOM) + if (irq_handle->flags & SA_SAMPLE_RANDOM) rand_initialize_irq(irq); enable_irq(irq); @@ -222,7 +222,7 @@ asmlinkage void process_int(int irq, struct pt_regs *fp) if (irq_list[irq]) { irq_list[irq]->handler(irq, irq_list[irq]->dev_id, fp); irq_list[irq]->count++; - if (irq_list[irq]->flags & IRQF_SAMPLE_RANDOM) + if (irq_list[irq]->flags & SA_SAMPLE_RANDOM) add_interrupt_randomness(irq); } } else { diff --git a/arch/h8300/kernel/process.c b/arch/h8300/kernel/process.c index e061b63a0..dd344f112 100644 --- a/arch/h8300/kernel/process.c +++ b/arch/h8300/kernel/process.c @@ -22,6 +22,7 @@ * This file handles the architecture-dependent parts of process handling.. */ +#include #include #include #include @@ -53,7 +54,7 @@ asmlinkage void ret_from_fork(void); * The idle loop on an H8/300.. */ #if !defined(CONFIG_H8300H_SIM) && !defined(CONFIG_H8S_SIM) -static void default_idle(void) +void default_idle(void) { local_irq_disable(); if (!need_resched()) { @@ -64,7 +65,7 @@ static void default_idle(void) local_irq_enable(); } #else -static void default_idle(void) +void default_idle(void) { cpu_relax(); } diff --git a/arch/h8300/kernel/ptrace.c b/arch/h8300/kernel/ptrace.c index f6031373d..0ff6f79b0 100644 --- a/arch/h8300/kernel/ptrace.c +++ b/arch/h8300/kernel/ptrace.c @@ -23,6 +23,7 @@ #include #include #include +#include #include #include diff --git a/arch/h8300/kernel/semaphore.c b/arch/h8300/kernel/semaphore.c index d12cbbfe6..1ebb79baa 100644 --- a/arch/h8300/kernel/semaphore.c +++ b/arch/h8300/kernel/semaphore.c @@ -3,6 +3,7 @@ * specific changes in */ +#include #include #include #include diff --git a/arch/h8300/kernel/setup.c b/arch/h8300/kernel/setup.c index 1077b71d5..f469d9160 100644 --- a/arch/h8300/kernel/setup.c +++ b/arch/h8300/kernel/setup.c @@ -16,6 +16,7 @@ * This file handles the architecture-dependent parts of system setup */ +#include #include #include #include diff --git a/arch/h8300/kernel/signal.c b/arch/h8300/kernel/signal.c index 7787f70a0..f13d5e82d 100644 --- a/arch/h8300/kernel/signal.c +++ b/arch/h8300/kernel/signal.c @@ -307,7 +307,7 @@ get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, size_t frame_size) /* This is the X/Open sanctioned signal stack switching. */ if (ka->sa.sa_flags & SA_ONSTACK) { - if (!sas_ss_flags(usp)) + if (!on_sig_stack(usp)) usp = current->sas_ss_sp + current->sas_ss_size; } return (void *)((usp - frame_size) & -8UL); diff --git a/arch/h8300/kernel/syscalls.S b/arch/h8300/kernel/syscalls.S index dab98fd99..79b3bda5c 100644 --- a/arch/h8300/kernel/syscalls.S +++ b/arch/h8300/kernel/syscalls.S @@ -1,4 +1,5 @@ /* Systemcall Entry Table */ +#include #include #include #include diff --git a/arch/h8300/kernel/time.c b/arch/h8300/kernel/time.c index 91f47658c..688a51006 100644 --- a/arch/h8300/kernel/time.c +++ b/arch/h8300/kernel/time.c @@ -16,6 +16,7 @@ * "A Kernel Model for Precision Timekeeping" by Dave Mills */ +#include /* CONFIG_HEARTBEAT */ #include #include #include diff --git a/arch/h8300/kernel/vmlinux.lds.S b/arch/h8300/kernel/vmlinux.lds.S index 6406c388f..17fa11da1 100644 --- a/arch/h8300/kernel/vmlinux.lds.S +++ b/arch/h8300/kernel/vmlinux.lds.S @@ -1,5 +1,6 @@ #define VMLINUX_SYMBOL(_sym_) _##_sym_ #include +#include /* target memory map */ #ifdef CONFIG_H8300H_GENERIC diff --git a/arch/h8300/lib/romfs.S b/arch/h8300/lib/romfs.S index 68910d8e1..b72f93a47 100644 --- a/arch/h8300/lib/romfs.S +++ b/arch/h8300/lib/romfs.S @@ -1,6 +1,7 @@ /* romfs move to __ebss */ #include +#include #if defined(__H8300H__) .h8300h diff --git a/arch/h8300/mm/init.c b/arch/h8300/mm/init.c index d3d40bdc2..1e0929ddc 100644 --- a/arch/h8300/mm/init.c +++ b/arch/h8300/mm/init.c @@ -16,6 +16,7 @@ * DEC/2000 -- linux 2.4 support */ +#include #include #include #include @@ -195,7 +196,7 @@ void free_initrd_mem(unsigned long start, unsigned long end) int pages = 0; for (; start < end; start += PAGE_SIZE) { ClearPageReserved(virt_to_page(start)); - init_page_count(virt_to_page(start)); + set_page_count(virt_to_page(start), 1); free_page(start); totalram_pages++; pages++; @@ -218,7 +219,7 @@ free_initmem() /* next to check that the page we free is not a partial page */ for (; addr + PAGE_SIZE < (unsigned long)(&__init_end); addr +=PAGE_SIZE) { ClearPageReserved(virt_to_page(addr)); - init_page_count(virt_to_page(addr)); + set_page_count(virt_to_page(addr), 1); free_page(addr); totalram_pages++; } diff --git a/arch/h8300/mm/kmap.c b/arch/h8300/mm/kmap.c index 26ab17286..4101ab54f 100644 --- a/arch/h8300/mm/kmap.c +++ b/arch/h8300/mm/kmap.c @@ -8,6 +8,7 @@ * Copyright (C) 2000-2002 David McCullough */ +#include #include #include #include diff --git a/arch/h8300/mm/memory.c b/arch/h8300/mm/memory.c index ccd6ade81..81eace93f 100644 --- a/arch/h8300/mm/memory.c +++ b/arch/h8300/mm/memory.c @@ -17,6 +17,7 @@ * Copyright (C) 1995 Hamish Macdonald */ +#include #include #include #include diff --git a/arch/h8300/platform/h8300h/aki3068net/crt0_ram.S b/arch/h8300/platform/h8300h/aki3068net/crt0_ram.S index ecaeb31ae..31c3703d8 100644 --- a/arch/h8300/platform/h8300h/aki3068net/crt0_ram.S +++ b/arch/h8300/platform/h8300h/aki3068net/crt0_ram.S @@ -10,6 +10,7 @@ #define ASSEMBLY +#include #include #if !defined(CONFIG_BLKDEV_RESERVE) diff --git a/arch/h8300/platform/h8300h/aki3068net/timer.c b/arch/h8300/platform/h8300h/aki3068net/timer.c index 27cd85d56..086efb1fd 100644 --- a/arch/h8300/platform/h8300h/aki3068net/timer.c +++ b/arch/h8300/platform/h8300h/aki3068net/timer.c @@ -7,6 +7,7 @@ * */ +#include #include #include #include diff --git a/arch/h8300/platform/h8300h/entry.S b/arch/h8300/platform/h8300h/entry.S index d2dea2432..2052dbb94 100644 --- a/arch/h8300/platform/h8300h/entry.S +++ b/arch/h8300/platform/h8300h/entry.S @@ -14,6 +14,7 @@ */ #include +#include #include #include #include diff --git a/arch/h8300/platform/h8300h/generic/crt0_ram.S b/arch/h8300/platform/h8300h/generic/crt0_ram.S index 80d0e16a4..b735042a7 100644 --- a/arch/h8300/platform/h8300h/generic/crt0_ram.S +++ b/arch/h8300/platform/h8300h/generic/crt0_ram.S @@ -10,6 +10,7 @@ #define ASSEMBLY +#include #include #if !defined(CONFIG_BLKDEV_RESERVE) diff --git a/arch/h8300/platform/h8300h/generic/crt0_rom.S b/arch/h8300/platform/h8300h/generic/crt0_rom.S index 120add7ca..2e32d8179 100644 --- a/arch/h8300/platform/h8300h/generic/crt0_rom.S +++ b/arch/h8300/platform/h8300h/generic/crt0_rom.S @@ -10,6 +10,7 @@ #define ASSEMBLY +#include #include .global SYMBOL_NAME(_start) diff --git a/arch/h8300/platform/h8300h/generic/timer.c b/arch/h8300/platform/h8300h/generic/timer.c index 6f5cefe0c..6590f89e5 100644 --- a/arch/h8300/platform/h8300h/generic/timer.c +++ b/arch/h8300/platform/h8300h/generic/timer.c @@ -7,6 +7,7 @@ * */ +#include #include #include #include diff --git a/arch/h8300/platform/h8300h/h8max/crt0_ram.S b/arch/h8300/platform/h8300h/h8max/crt0_ram.S index efcbefb91..a5c5a9156 100644 --- a/arch/h8300/platform/h8300h/h8max/crt0_ram.S +++ b/arch/h8300/platform/h8300h/h8max/crt0_ram.S @@ -10,6 +10,7 @@ #define ASSEMBLY +#include #include #if !defined(CONFIG_BLKDEV_RESERVE) diff --git a/arch/h8300/platform/h8300h/h8max/timer.c b/arch/h8300/platform/h8300h/h8max/timer.c index 85a574afe..9ac9fa669 100644 --- a/arch/h8300/platform/h8300h/h8max/timer.c +++ b/arch/h8300/platform/h8300h/h8max/timer.c @@ -7,6 +7,7 @@ * */ +#include #include #include #include diff --git a/arch/h8300/platform/h8300h/ints_h8300h.c b/arch/h8300/platform/h8300h/ints_h8300h.c index f1777119b..86a155479 100644 --- a/arch/h8300/platform/h8300h/ints_h8300h.c +++ b/arch/h8300/platform/h8300h/ints_h8300h.c @@ -6,6 +6,7 @@ * */ +#include #include #include diff --git a/arch/h8300/platform/h8s/edosk2674/crt0_ram.S b/arch/h8300/platform/h8s/edosk2674/crt0_ram.S index d12b0debe..8105dc17d 100644 --- a/arch/h8300/platform/h8s/edosk2674/crt0_ram.S +++ b/arch/h8300/platform/h8s/edosk2674/crt0_ram.S @@ -10,6 +10,7 @@ #define ASSEMBLY +#include #include #include diff --git a/arch/h8300/platform/h8s/edosk2674/crt0_rom.S b/arch/h8300/platform/h8s/edosk2674/crt0_rom.S index c03d23c6f..65748bf18 100644 --- a/arch/h8300/platform/h8s/edosk2674/crt0_rom.S +++ b/arch/h8300/platform/h8s/edosk2674/crt0_rom.S @@ -10,6 +10,7 @@ #define ASSEMBLY +#include #include #include diff --git a/arch/h8300/platform/h8s/edosk2674/timer.c b/arch/h8300/platform/h8s/edosk2674/timer.c index bfb142448..9441a4f16 100644 --- a/arch/h8300/platform/h8s/edosk2674/timer.c +++ b/arch/h8300/platform/h8s/edosk2674/timer.c @@ -7,6 +7,7 @@ * */ +#include #include #include #include diff --git a/arch/h8300/platform/h8s/entry.S b/arch/h8300/platform/h8s/entry.S index aeb2e9faa..a7a53c84c 100644 --- a/arch/h8300/platform/h8s/entry.S +++ b/arch/h8300/platform/h8s/entry.S @@ -15,6 +15,7 @@ */ #include +#include #include #include #include diff --git a/arch/h8300/platform/h8s/generic/crt0_ram.S b/arch/h8300/platform/h8s/generic/crt0_ram.S index b04541069..86f450178 100644 --- a/arch/h8300/platform/h8s/generic/crt0_ram.S +++ b/arch/h8300/platform/h8s/generic/crt0_ram.S @@ -10,6 +10,7 @@ #define ASSEMBLY +#include #include #include diff --git a/arch/h8300/platform/h8s/generic/crt0_rom.S b/arch/h8300/platform/h8s/generic/crt0_rom.S index 95b6f2898..e18e41202 100644 --- a/arch/h8300/platform/h8s/generic/crt0_rom.S +++ b/arch/h8300/platform/h8s/generic/crt0_rom.S @@ -10,6 +10,7 @@ #define ASSEMBLY +#include #include #include diff --git a/arch/h8300/platform/h8s/generic/timer.c b/arch/h8300/platform/h8s/generic/timer.c index c2211c6e7..633cd8e1c 100644 --- a/arch/h8300/platform/h8s/generic/timer.c +++ b/arch/h8300/platform/h8s/generic/timer.c @@ -7,6 +7,7 @@ * */ +#include #include #include #include diff --git a/arch/h8300/platform/h8s/ints.c b/arch/h8300/platform/h8s/ints.c index 270440de4..f6ed663bd 100644 --- a/arch/h8300/platform/h8s/ints.c +++ b/arch/h8300/platform/h8s/ints.c @@ -192,7 +192,7 @@ int request_irq(unsigned int irq, irq_handle->dev_id = dev_id; irq_handle->devname = devname; irq_list[irq] = irq_handle; - if (irq_handle->flags & IRQF_SAMPLE_RANDOM) + if (irq_handle->flags & SA_SAMPLE_RANDOM) rand_initialize_irq(irq); /* enable interrupt */ @@ -270,7 +270,7 @@ asmlinkage void process_int(unsigned long vec, struct pt_regs *fp) if (irq_list[vec]) { irq_list[vec]->handler(vec, irq_list[vec]->dev_id, fp); irq_list[vec]->count++; - if (irq_list[vec]->flags & IRQF_SAMPLE_RANDOM) + if (irq_list[vec]->flags & SA_SAMPLE_RANDOM) add_interrupt_randomness(vec); } } else { diff --git a/arch/h8300/platform/h8s/ints_h8s.c b/arch/h8300/platform/h8s/ints_h8s.c index 93395d2a8..8268dfd12 100644 --- a/arch/h8300/platform/h8s/ints_h8s.c +++ b/arch/h8300/platform/h8s/ints_h8s.c @@ -6,6 +6,7 @@ * */ +#include #include #include #include diff --git a/arch/i386/Kconfig b/arch/i386/Kconfig index 9c714ef0b..20d835e0d 100644 --- a/arch/i386/Kconfig +++ b/arch/i386/Kconfig @@ -14,19 +14,6 @@ config X86_32 486, 586, Pentiums, and various instruction-set-compatible chips by AMD, Cyrix, and others. -config GENERIC_TIME - bool - depends on !X86_XEN - default y - -config LOCKDEP_SUPPORT - bool - default y - -config STACKTRACE_SUPPORT - bool - default y - config SEMAPHORE_SLEEPERS bool default y @@ -50,10 +37,6 @@ config GENERIC_IOMAP bool default y -config GENERIC_HWEIGHT - bool - default y - config ARCH_MAY_HAVE_PC_FDC bool default y @@ -66,35 +49,6 @@ source "init/Kconfig" menu "Processor type and features" -config SMP - bool "Symmetric multi-processing support" - ---help--- - This enables support for systems with more than one CPU. If you have - a system with only one CPU, like most personal computers, say N. If - you have a system with more than one CPU, say Y. - - If you say N here, the kernel will run on single and multiprocessor - machines, but will use only one CPU of a multiprocessor machine. If - you say Y here, the kernel will run on many, but not all, - singleprocessor machines. On a singleprocessor machine, the kernel - will run faster if you say N here. - - Note that if you say Y here and choose architecture "586" or - "Pentium" under "Processor family", the kernel will not work on 486 - architectures. Similarly, multiprocessor kernels for the "PPro" - architecture may not work on all Pentium based boards. - - People using multiprocessor machines who say Y here should also say - Y to "Enhanced Real Time Clock Support", below. The "Advanced Power - Management" code will be disabled if you say Y here. - - See also the , - , - and the SMP-HOWTO available at - . - - If you don't know what to do here, say N. - choice prompt "Subarchitecture Type" default X86_PC @@ -104,15 +58,6 @@ config X86_PC help Choose this option if your computer is a standard PC or compatible. -config X86_XEN - bool "Xen-compatible" - select X86_UP_APIC if !SMP && XEN_PRIVILEGED_GUEST - select X86_UP_IOAPIC if !SMP && XEN_PRIVILEGED_GUEST - select SWIOTLB - help - Choose this option if you plan to run this kernel on top of the - Xen Hypervisor. - config X86_ELAN bool "AMD Elan" help @@ -135,7 +80,6 @@ config X86_VOYAGER config X86_NUMAQ bool "NUMAQ (IBM/Sequent)" - select SMP select NUMA help This option is used for getting Linux to run on a (IBM/Sequent) NUMA @@ -152,7 +96,6 @@ config X86_SUMMIT In particular, it is needed for the x440. If you don't have one of these computers, you should say N here. - If you want to build a NUMA kernel, you must select ACPI. config X86_BIGSMP bool "Support for other sub-arch SMP systems with more than 8 CPUs" @@ -180,7 +123,6 @@ config X86_GENERICARCH help This option compiles in the Summit, bigsmp, ES7000, default subarchitectures. It is intended for a generic binary kernel. - If you want a NUMA kernel, select ACPI. We need SRAT for NUMA. config X86_ES7000 bool "Support for Unisys ES7000 IA32 series" @@ -196,13 +138,7 @@ endchoice config ACPI_SRAT bool default y - depends on ACPI && NUMA && (X86_SUMMIT || X86_GENERICARCH) - select ACPI_NUMA - -config HAVE_ARCH_PARSE_SRAT - bool - default y - depends on ACPI_SRAT + depends on NUMA && (X86_SUMMIT || X86_GENERICARCH) config X86_SUMMIT_NUMA bool @@ -223,7 +159,6 @@ source "arch/i386/Kconfig.cpu" config HPET_TIMER bool "HPET Timer Support" - depends on !X86_XEN help This enables the use of the HPET for the kernel's internal timer. HPET is the next generation timer replacing legacy 8254s. @@ -238,6 +173,35 @@ config HPET_EMULATE_RTC depends on HPET_TIMER && RTC=y default y +config SMP + bool "Symmetric multi-processing support" + ---help--- + This enables support for systems with more than one CPU. If you have + a system with only one CPU, like most personal computers, say N. If + you have a system with more than one CPU, say Y. + + If you say N here, the kernel will run on single and multiprocessor + machines, but will use only one CPU of a multiprocessor machine. If + you say Y here, the kernel will run on many, but not all, + singleprocessor machines. On a singleprocessor machine, the kernel + will run faster if you say N here. + + Note that if you say Y here and choose architecture "586" or + "Pentium" under "Processor family", the kernel will not work on 486 + architectures. Similarly, multiprocessor kernels for the "PPro" + architecture may not work on all Pentium based boards. + + People using multiprocessor machines who say Y here should also say + Y to "Enhanced Real Time Clock Support", below. The "Advanced Power + Management" code will be disabled if you say Y here. + + See also the , + , + and the SMP-HOWTO available at + . + + If you don't know what to do here, say N. + config NR_CPUS int "Maximum number of CPUs (2-255)" range 2 255 @@ -254,27 +218,19 @@ config NR_CPUS config SCHED_SMT bool "SMT (Hyperthreading) scheduler support" - depends on X86_HT + depends on SMP + default off help SMT scheduler support improves the CPU scheduler's decision making when dealing with Intel Pentium 4 chips with HyperThreading at a cost of slightly increased overhead in some places. If unsure say N here. -config SCHED_MC - bool "Multi-core scheduler support" - depends on X86_HT - default y - help - Multi-core scheduler support improves the CPU scheduler's decision - making when dealing with multi-core CPU chips at a cost of slightly - increased overhead in some places. If unsure say N here. - source "kernel/Kconfig.preempt" config X86_UP_APIC bool "Local APIC support on uniprocessors" - depends on !SMP && !(X86_VISWS || X86_VOYAGER || XEN_UNPRIVILEGED_GUEST) + depends on !SMP && !(X86_VISWS || X86_VOYAGER) help A local APIC (Advanced Programmable Interrupt Controller) is an integrated interrupt controller in the CPU. If you have a single-CPU @@ -299,12 +255,12 @@ config X86_UP_IOAPIC config X86_LOCAL_APIC bool - depends on X86_UP_APIC || ((X86_VISWS || SMP) && !(X86_VOYAGER || XEN_UNPRIVILEGED_GUEST)) + depends on X86_UP_APIC || ((X86_VISWS || SMP) && !X86_VOYAGER) default y config X86_IO_APIC bool - depends on X86_UP_IOAPIC || (SMP && !(X86_VISWS || X86_VOYAGER || XEN_UNPRIVILEGED_GUEST)) + depends on X86_UP_IOAPIC || (SMP && !(X86_VISWS || X86_VOYAGER)) default y config X86_VISWS_APIC @@ -314,7 +270,7 @@ config X86_VISWS_APIC config X86_MCE bool "Machine Check Exception" - depends on !(X86_VOYAGER || X86_XEN) + depends on !X86_VOYAGER ---help--- Machine Check Exception support allows the processor to notify the kernel if it detects a problem (e.g. overheating, component failure). @@ -349,15 +305,6 @@ config X86_MCE_P4THERMAL Enabling this feature will cause a message to be printed when the P4 enters thermal throttling. -config VM86 - 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 TOSHIBA tristate "Toshiba Laptop support" ---help--- @@ -413,7 +360,6 @@ config X86_REBOOTFIXUPS config MICROCODE tristate "/dev/cpu/microcode - Intel IA32 CPU microcode support" - depends on !XEN_UNPRIVILEGED_GUEST ---help--- If you say Y here and also to "/dev file system support" in the 'File systems' section, you will be able to update the microcode on @@ -431,7 +377,6 @@ config MICROCODE config X86_MSR tristate "/dev/cpu/*/msr - Model-specific register support" - depends on !X86_XEN help This device gives privileged processes access to the x86 Model-Specific Registers (MSRs). It is a character device with @@ -447,10 +392,6 @@ config X86_CPUID with major 203 and minors 0 to 31 for /dev/cpu/0/cpuid to /dev/cpu/31/cpuid. -config SWIOTLB - bool - default n - source "drivers/firmware/Kconfig" choice @@ -459,7 +400,6 @@ choice config NOHIGHMEM bool "off" - depends on !X86_NUMAQ ---help--- Linux can use up to 64 Gigabytes of physical memory on x86 systems. However, the address space of 32-bit x86 processors is only 4 @@ -496,7 +436,6 @@ config NOHIGHMEM config HIGHMEM4G bool "4GB" - depends on !X86_NUMAQ help Select this if you have a 32-bit processor and between 1 and 4 gigabytes of physical RAM. @@ -512,7 +451,7 @@ endchoice choice depends on EXPERIMENTAL && !X86_PAE - prompt "Memory split" if EMBEDDED + prompt "Memory split" default VMSPLIT_3G help Select the desired split between kernel and user memory. @@ -527,23 +466,43 @@ choice will also likely make your kernel incompatible with binary-only kernel modules. - If you are not absolutely sure what you are doing, leave this - option alone! - config VMSPLIT_3G - bool "3G/1G user/kernel split" - config VMSPLIT_3G_OPT - bool "3G/1G user/kernel split (for full 1G low memory)" + bool "3G/1G user/kernel split (Default)" + help + This is the default split of 3GB userspace to 1GB kernel + space, which will result in about 860MB of lowmem. + + config VMSPLIT_25G + bool "2.5G/1.5G user/kernel split" + help + This split provides 2.5GB userspace and 1.5GB kernel + space, which will result in about 1370MB of lowmem. + config VMSPLIT_2G bool "2G/2G user/kernel split" + help + This split provides 2GB userspace and 2GB kernel + space, which will result in about 1880MB of lowmem. + + config VMSPLIT_15G + bool "1.5G/2.5G user/kernel split" + help + This split provides 1.5GB userspace and 2.5GB kernel + space, which will result in about 2390MB of lowmem. + config VMSPLIT_1G bool "1G/3G user/kernel split" + help + This split provides 1GB userspace and 3GB kernel + space, which will result in about 2900MB of lowmem. + endchoice config PAGE_OFFSET hex - default 0xB0000000 if VMSPLIT_3G_OPT - default 0x78000000 if VMSPLIT_2G + default 0xA0000000 if VMSPLIT_25G + default 0x80000000 if VMSPLIT_2G + default 0x60000000 if VMSPLIT_15G default 0x40000000 if VMSPLIT_1G default 0xC0000000 @@ -556,24 +515,21 @@ config X86_PAE bool depends on HIGHMEM64G default y - select RESOURCES_64BIT # Common NUMA Features config NUMA bool "Numa Memory Allocation and Scheduler Support" - depends on SMP && HIGHMEM64G && (X86_NUMAQ || (X86_SUMMIT || X86_GENERICARCH) && ACPI) + depends on SMP && HIGHMEM64G && (X86_NUMAQ || X86_GENERICARCH || (X86_SUMMIT && ACPI)) default n if X86_PC default y if (X86_NUMAQ || X86_SUMMIT) +# Need comments to help the hapless user trying to turn on NUMA support +comment "NUMA (NUMA-Q) requires SMP, 64GB highmem support" + depends on X86_NUMAQ && (!HIGHMEM64G || !SMP) + comment "NUMA (Summit) requires SMP, 64GB highmem support, ACPI" depends on X86_SUMMIT && (!HIGHMEM64G || !ACPI) -config NODES_SHIFT - int - default "4" if X86_NUMAQ - default "3" - depends on NEED_MULTIPLE_NODES - config HAVE_ARCH_BOOTMEM_NODE bool depends on NUMA @@ -624,7 +580,7 @@ config HAVE_ARCH_EARLY_PFN_TO_NID config HIGHPTE bool "Allocate 3rd-level pagetables from highmem" - depends on (HIGHMEM4G || HIGHMEM64G) && !X86_XEN + depends on HIGHMEM4G || HIGHMEM64G help The VM uses one page table entry for each page of physical memory. For systems with a lot of RAM, this can be wasteful of precious @@ -633,7 +589,6 @@ config HIGHPTE config MATH_EMULATION bool "Math emulation" - depends on !X86_XEN ---help--- Linux can emulate a math coprocessor (used for floating point operations) if you don't have one. 486DX and Pentium processors have @@ -659,8 +614,6 @@ config MATH_EMULATION config MTRR bool "MTRR (Memory Type Range Register) support" - depends on !XEN_UNPRIVILEGED_GUEST - default y if X86_XEN ---help--- On Intel P6 family processors (Pentium Pro, Pentium II and later) the Memory Type Range Registers (MTRRs) may be used to control @@ -694,8 +647,8 @@ config MTRR See for more information. config EFI - bool "Boot from EFI support" - depends on ACPI && !X86_XEN + bool "Boot from EFI support (EXPERIMENTAL)" + depends on ACPI default n ---help--- This enables the the kernel to boot on EFI platforms using @@ -713,7 +666,7 @@ config EFI config IRQBALANCE bool "Enable kernel irq balancing" - depends on SMP && X86_IO_APIC && !X86_XEN + depends on SMP && X86_IO_APIC default y help The default yes will allow the kernel to do irq load balancing. @@ -727,18 +680,13 @@ config BOOT_IOREMAP default y config REGPARM - bool "Use register arguments" - default y + bool "Use register arguments (EXPERIMENTAL)" + depends on EXPERIMENTAL + default n help - Compile the kernel with -mregparm=3. This instructs gcc to use - a more efficient function call ABI which passes the first three - arguments of a function call via registers, which results in denser - and faster code. - - If this option is disabled, then the default ABI of passing - arguments via the stack is used. - - If unsure, say Y. + Compile the kernel with -mregparm=3. This uses a different ABI + and passes the first three arguments of a function call in registers. + This will probably break binary only modules. config SECCOMP bool "Enable seccomp to safely compute untrusted bytecode" @@ -761,14 +709,14 @@ source kernel/Kconfig.hz config KEXEC bool "kexec system call (EXPERIMENTAL)" - depends on EXPERIMENTAL && !X86_XEN + depends on EXPERIMENTAL help kexec is a system call that implements the ability to shutdown your current kernel, and to start another kernel. It is like a reboot - but it is independent of the system firmware. And like a reboot + but it is indepedent of the system firmware. And like a reboot you can start any kernel with it, not just Linux. - The name comes from the similarity to the exec system call. + The name comes from the similiarity to the exec system call. It is an ongoing process to be certain the hardware in a machine is properly shutdown, so do not be surprised if this code does not @@ -784,7 +732,7 @@ config CRASH_DUMP Generate crash dump after being started by kexec. config PHYSICAL_START - hex "Physical address where the kernel is loaded" + hex "Physical address where the kernel is loaded" if (EMBEDDED || CRASH_DUMP) default "0x1000000" if CRASH_DUMP default "0x100000" @@ -807,22 +755,19 @@ config HOTPLUG_CPU bool "Support for hot-pluggable CPUs (EXPERIMENTAL)" depends on SMP && HOTPLUG && EXPERIMENTAL && !X86_VOYAGER ---help--- - Say Y here to experiment with turning CPUs off and on, and to - enable suspend on SMP systems. CPUs can be controlled through - /sys/devices/system/cpu. + Say Y here to experiment with turning CPUs off and on. CPUs + can be controlled through /sys/devices/system/cpu. -config COMPAT_VDSO - bool "Compat VDSO support" + Say N. + +config DOUBLEFAULT default y - depends on !X86_XEN + bool "Enable doublefault exception handler" if EMBEDDED help - Map the VDSO to the predictable old-style address too. - ---help--- - Say N here if you are running a sufficiently recent glibc - version (2.3.3 or later), to remove the high-mapped - VDSO mapping and to exclusively use the randomized VDSO. - - If unsure, say Y. + This option allows trapping of rare doublefault exceptions that + would otherwise cause a system to silently reboot. Disabling this + option saves about 4k and might cause you much additional grey + hair. endmenu @@ -831,20 +776,18 @@ config ARCH_ENABLE_MEMORY_HOTPLUG depends on HIGHMEM menu "Power management options (ACPI, APM)" - depends on !(X86_VOYAGER || XEN_UNPRIVILEGED_GUEST) + depends on !X86_VOYAGER -if !X86_XEN source kernel/power/Kconfig -endif source "drivers/acpi/Kconfig" menu "APM (Advanced Power Management) BIOS Support" -depends on PM && !(X86_VISWS || X86_XEN) +depends on PM && !X86_VISWS config APM tristate "APM (Advanced Power Management) BIOS support" - depends on PM && PM_LEGACY + depends on PM ---help--- APM is a BIOS specification for saving power using several different techniques. This is mostly useful for battery powered laptops with @@ -1029,7 +972,6 @@ choice config PCI_GOBIOS bool "BIOS" - depends on !X86_XEN config PCI_GOMMCONFIG bool "MMConfig" @@ -1037,13 +979,6 @@ config PCI_GOMMCONFIG config PCI_GODIRECT bool "Direct" -config PCI_GOXEN_FE - bool "Xen PCI Frontend" - depends on X86_XEN - help - The PCI device frontend driver allows the kernel to import arbitrary - PCI devices from a PCI backend to support PCI driver domains. - config PCI_GOANY bool "Any" @@ -1051,7 +986,7 @@ endchoice config PCI_BIOS bool - depends on !(X86_VISWS || X86_XEN) && PCI && (PCI_GOBIOS || PCI_GOANY) + depends on !X86_VISWS && PCI && (PCI_GOBIOS || PCI_GOANY) default y config PCI_DIRECT @@ -1064,18 +999,6 @@ config PCI_MMCONFIG depends on PCI && ACPI && (PCI_GOMMCONFIG || PCI_GOANY) default y -config XEN_PCIDEV_FRONTEND - bool - depends on PCI && X86_XEN && (PCI_GOXEN_FE || PCI_GOANY) - default y - -config XEN_PCIDEV_FE_DEBUG - bool "Xen PCI Frontend Debugging" - depends on XEN_PCIDEV_FRONTEND - default n - help - Enables some debug statements within the PCI Frontend. - source "drivers/pci/pcie/Kconfig" source "drivers/pci/Kconfig" @@ -1086,7 +1009,7 @@ config ISA_DMA_API config ISA bool "ISA support" - depends on !(X86_VOYAGER || X86_VISWS || X86_XEN) + depends on !(X86_VOYAGER || X86_VISWS) help Find out whether you have ISA slots on your motherboard. ISA is the name of a bus system, i.e. the way the CPU talks to the other stuff @@ -1113,7 +1036,7 @@ config EISA source "drivers/eisa/Kconfig" config MCA - bool "MCA support" if !(X86_VISWS || X86_VOYAGER || X86_XEN) + bool "MCA support" if !(X86_VISWS || X86_VOYAGER) default y if X86_VOYAGER help MicroChannel Architecture is found in some IBM PS/2 machines and @@ -1127,27 +1050,13 @@ config SCx200 tristate "NatSemi SCx200 support" depends on !X86_VOYAGER help - This provides basic support for National Semiconductor's - (now AMD's) Geode processors. The driver probes for the - PCI-IDs of several on-chip devices, so its a good dependency - for other scx200_* drivers. - - If compiled as a module, the driver is named scx200. + This provides basic support for the National Semiconductor SCx200 + processor. Right now this is just a driver for the GPIO pins. -config SCx200HR_TIMER - tristate "NatSemi SCx200 27MHz High-Resolution Timer Support" - depends on SCx200 && GENERIC_TIME - default y - help - This driver provides a clocksource built upon the on-chip - 27MHz high-resolution timer. Its also a workaround for - NSC Geode SC-1100's buggy TSC, which loses time when the - processor goes idle (as is done by the scheduler). The - other workaround is idle=poll boot option. + If you don't know what to do here, say N. -config K8_NB - def_bool y - depends on AGP_AMD64 + This support is also available as a module. If compiled as a + module, it will be called scx200. source "drivers/pcmcia/Kconfig" @@ -1191,8 +1100,6 @@ source "security/Kconfig" source "crypto/Kconfig" -source "drivers/xen/Kconfig" - source "lib/Kconfig" # @@ -1218,7 +1125,7 @@ config X86_SMP config X86_HT bool - depends on SMP && !(X86_VISWS || X86_VOYAGER || X86_XEN) + depends on SMP && !(X86_VISWS || X86_VOYAGER) default y config X86_BIOS_REBOOT @@ -1231,16 +1138,6 @@ config X86_TRAMPOLINE depends on X86_SMP || (X86_VOYAGER && SMP) default y -config X86_NO_TSS - bool - depends on X86_XEN - default y - -config X86_NO_IDT - bool - depends on X86_XEN - default y - config KTIME_SCALAR bool default y diff --git a/arch/i386/Kconfig.cpu b/arch/i386/Kconfig.cpu index d82cdccf7..e99d58e5e 100644 --- a/arch/i386/Kconfig.cpu +++ b/arch/i386/Kconfig.cpu @@ -42,7 +42,7 @@ config M386 - "GeodeGX1" for Geode GX1 (Cyrix MediaGX). - "Geode GX/LX" For AMD Geode GX and LX processors. - "CyrixIII/VIA C3" for VIA Cyrix III or VIA C3. - - "VIA C3-2" for VIA C3-2 "Nehemiah" (model 9 and above). + - "VIA C3-2 for VIA C3-2 "Nehemiah" (model 9 and above). If you don't know what to do, choose "386". @@ -252,7 +252,7 @@ config X86_PPRO_FENCE config X86_F00F_BUG bool - depends on (M586MMX || M586TSC || M586 || M486 || M386) && !X86_NO_IDT + depends on M586MMX || M586TSC || M586 || M486 || M386 default y config X86_WP_WORKS_OK @@ -312,5 +312,5 @@ config X86_OOSTORE config X86_TSC bool - depends on (MWINCHIP3D || MWINCHIP2 || MCRUSOE || MEFFICEON || MCYRIXIII || MK7 || MK6 || MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M686 || M586MMX || M586TSC || MK8 || MVIAC3_2 || MGEODEGX1 || MGEODE_LX) && !X86_NUMAQ && !X86_XEN + depends on (MWINCHIP3D || MWINCHIP2 || MCRUSOE || MEFFICEON || MCYRIXIII || MK7 || MK6 || MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M686 || M586MMX || M586TSC || MK8 || MVIAC3_2 || MGEODEGX1) && !X86_NUMAQ default y diff --git a/arch/i386/Kconfig.debug b/arch/i386/Kconfig.debug index a454cbe5d..bf32ecc9a 100644 --- a/arch/i386/Kconfig.debug +++ b/arch/i386/Kconfig.debug @@ -1,9 +1,5 @@ menu "Kernel hacking" -config TRACE_IRQFLAGS_SUPPORT - bool - default y - source "lib/Kconfig.debug" config EARLY_PRINTK @@ -39,8 +35,8 @@ comment "Page alloc debug is incompatible with Software Suspend on i386" depends on DEBUG_KERNEL && SOFTWARE_SUSPEND config DEBUG_PAGEALLOC - bool "Debug page memory allocations" - depends on DEBUG_KERNEL && !SOFTWARE_SUSPEND && !HUGETLBFS + bool "Page alloc debugging" + depends on DEBUG_KERNEL && !SOFTWARE_SUSPEND help Unmap pages from the kernel linear mapping after free_pages(). This results in a large slowdown, but helps to find certain types @@ -76,14 +72,4 @@ config X86_MPPARSE depends on X86_LOCAL_APIC && !X86_VISWS default y -config DOUBLEFAULT - default y - bool "Enable doublefault exception handler" if EMBEDDED - depends on !X86_NO_TSS - help - This option allows trapping of rare doublefault exceptions that - would otherwise cause a system to silently reboot. Disabling this - option saves about 4k and might cause you much additional grey - hair. - endmenu diff --git a/arch/i386/Makefile b/arch/i386/Makefile index 53b7343aa..36bef6543 100644 --- a/arch/i386/Makefile +++ b/arch/i386/Makefile @@ -29,7 +29,7 @@ OBJCOPYFLAGS := -O binary -R .note -R .comment -S LDFLAGS_vmlinux := CHECKFLAGS += -D__i386__ -CFLAGS += -pipe -msoft-float -fno-builtin-sprintf -fno-builtin-log2 -fno-builtin-puts +CFLAGS += -pipe -msoft-float # prevent gcc from keeping the stack 16 byte aligned CFLAGS += $(call cc-option,-mpreferred-stack-boundary=2) @@ -39,20 +39,12 @@ include $(srctree)/arch/i386/Makefile.cpu cflags-$(CONFIG_REGPARM) += -mregparm=3 -# temporary until string.h is fixed -cflags-y += -ffreestanding - # Disable unit-at-a-time mode on pre-gcc-4.0 compilers, it makes gcc use # a lot more stack due to the lack of sharing of stacklots: CFLAGS += $(shell if [ $(call cc-version) -lt 0400 ] ; then echo $(call cc-option,-fno-unit-at-a-time); fi ;) CFLAGS += $(cflags-y) -cppflags-$(CONFIG_XEN) += \ - -D__XEN_INTERFACE_VERSION__=$(CONFIG_XEN_INTERFACE_VERSION) - -CPPFLAGS += $(cppflags-y) - # Default subarch .c files mcore-y := mach-default @@ -76,10 +68,6 @@ mcore-$(CONFIG_X86_BIGSMP) := mach-default mflags-$(CONFIG_X86_SUMMIT) := -Iinclude/asm-i386/mach-summit mcore-$(CONFIG_X86_SUMMIT) := mach-default -# Xen subarch support -mflags-$(CONFIG_X86_XEN) := -Iinclude/asm-i386/mach-xen -mcore-$(CONFIG_X86_XEN) := mach-xen - # generic subarchitecture mflags-$(CONFIG_X86_GENERICARCH) := -Iinclude/asm-i386/mach-generic mcore-$(CONFIG_X86_GENERICARCH) := mach-default @@ -111,22 +99,9 @@ AFLAGS += $(mflags-y) boot := arch/i386/boot -PHONY += zImage bzImage compressed zlilo bzlilo \ - zdisk bzdisk fdimage fdimage144 fdimage288 isoimage install +.PHONY: zImage bzImage compressed zlilo bzlilo \ + zdisk bzdisk fdimage fdimage144 fdimage288 install -ifdef CONFIG_XEN -CPPFLAGS := -Iinclude$(if $(KBUILD_SRC),2)/asm/mach-xen $(CPPFLAGS) -head-y := arch/i386/kernel/head-xen.o arch/i386/kernel/init_task-xen.o -boot := arch/i386/boot-xen -.PHONY: vmlinuz -all: vmlinuz - -vmlinuz: vmlinux - $(Q)$(MAKE) $(build)=$(boot) $@ - -install: - $(Q)$(MAKE) $(build)=$(boot) XENGUEST=$(XENGUEST) $@ -else all: bzImage # KBUILD_IMAGE specify target image being built @@ -144,12 +119,11 @@ zlilo bzlilo: vmlinux zdisk bzdisk: vmlinux $(Q)$(MAKE) $(build)=$(boot) BOOTIMAGE=$(KBUILD_IMAGE) zdisk -fdimage fdimage144 fdimage288 isoimage: vmlinux +fdimage fdimage144 fdimage288: vmlinux $(Q)$(MAKE) $(build)=$(boot) BOOTIMAGE=$(KBUILD_IMAGE) $@ install: $(Q)$(MAKE) $(build)=$(boot) BOOTIMAGE=$(KBUILD_IMAGE) install -endif archclean: $(Q)$(MAKE) $(clean)=arch/i386/boot @@ -162,10 +136,6 @@ define archhelp echo ' install to $$(INSTALL_PATH) and run lilo' echo ' bzdisk - Create a boot floppy in /dev/fd0' echo ' fdimage - Create a boot floppy image' - echo ' isoimage - Create a boot CD-ROM image' endef -CLEAN_FILES += arch/$(ARCH)/boot/fdimage \ - arch/$(ARCH)/boot/image.iso \ - arch/$(ARCH)/boot/mtools.conf -CLEAN_FILES += vmlinuz vmlinux-stripped +CLEAN_FILES += arch/$(ARCH)/boot/fdimage arch/$(ARCH)/boot/mtools.conf diff --git a/arch/i386/Makefile.cpu b/arch/i386/Makefile.cpu index 7a06a2869..dcd936ef4 100644 --- a/arch/i386/Makefile.cpu +++ b/arch/i386/Makefile.cpu @@ -15,7 +15,7 @@ cflags-$(CONFIG_M486) += -march=i486 cflags-$(CONFIG_M586) += -march=i586 cflags-$(CONFIG_M586TSC) += -march=i586 cflags-$(CONFIG_M586MMX) += -march=pentium-mmx -cflags-$(CONFIG_M686) += -march=i686 $(call tune,generic) +cflags-$(CONFIG_M686) += -march=i686 cflags-$(CONFIG_MPENTIUMII) += -march=i686 $(call tune,pentium2) cflags-$(CONFIG_MPENTIUMIII) += -march=i686 $(call tune,pentium3) cflags-$(CONFIG_MPENTIUMM) += -march=i686 $(call tune,pentium3) @@ -39,7 +39,3 @@ cflags-$(CONFIG_X86_ELAN) += -march=i486 # Geode GX1 support cflags-$(CONFIG_MGEODEGX1) += -march=pentium-mmx -# add at the end to overwrite eventual tuning options from earlier -# cpu entries -cflags-$(CONFIG_X86_GENERIC) += $(call tune,generic) - diff --git a/arch/i386/boot/Makefile b/arch/i386/boot/Makefile index e97946626..f13675256 100644 --- a/arch/i386/boot/Makefile +++ b/arch/i386/boot/Makefile @@ -62,12 +62,8 @@ $(obj)/setup $(obj)/bootsect: %: %.o FORCE $(obj)/compressed/vmlinux: FORCE $(Q)$(MAKE) $(build)=$(obj)/compressed IMAGE_OFFSET=$(IMAGE_OFFSET) $@ -# Set this if you want to pass append arguments to the zdisk/fdimage/isoimage kernel +# Set this if you want to pass append arguments to the zdisk/fdimage kernel FDARGS = -# Set this if you want an initrd included with the zdisk/fdimage/isoimage kernel -FDINITRD = - -image_cmdline = default linux $(FDARGS) $(if $(FDINITRD),initrd=initrd.img,) $(obj)/mtools.conf: $(src)/mtools.conf.in sed -e 's|@OBJ@|$(obj)|g' < $< > $@ @@ -76,11 +72,8 @@ $(obj)/mtools.conf: $(src)/mtools.conf.in zdisk: $(BOOTIMAGE) $(obj)/mtools.conf MTOOLSRC=$(obj)/mtools.conf mformat a: ; sync syslinux /dev/fd0 ; sync - echo '$(image_cmdline)' | \ + echo 'default linux $(FDARGS)' | \ MTOOLSRC=$(src)/mtools.conf mcopy - a:syslinux.cfg - if [ -f '$(FDINITRD)' ] ; then \ - MTOOLSRC=$(obj)/mtools.conf mcopy '$(FDINITRD)' a:initrd.img ; \ - fi MTOOLSRC=$(obj)/mtools.conf mcopy $(BOOTIMAGE) a:linux ; sync # These require being root or having syslinux 2.02 or higher installed @@ -88,44 +81,18 @@ fdimage fdimage144: $(BOOTIMAGE) $(obj)/mtools.conf dd if=/dev/zero of=$(obj)/fdimage bs=1024 count=1440 MTOOLSRC=$(obj)/mtools.conf mformat v: ; sync syslinux $(obj)/fdimage ; sync - echo '$(image_cmdline)' | \ + echo 'default linux $(FDARGS)' | \ MTOOLSRC=$(obj)/mtools.conf mcopy - v:syslinux.cfg - if [ -f '$(FDINITRD)' ] ; then \ - MTOOLSRC=$(obj)/mtools.conf mcopy '$(FDINITRD)' v:initrd.img ; \ - fi MTOOLSRC=$(obj)/mtools.conf mcopy $(BOOTIMAGE) v:linux ; sync fdimage288: $(BOOTIMAGE) $(obj)/mtools.conf dd if=/dev/zero of=$(obj)/fdimage bs=1024 count=2880 MTOOLSRC=$(obj)/mtools.conf mformat w: ; sync syslinux $(obj)/fdimage ; sync - echo '$(image_cmdline)' | \ + echo 'default linux $(FDARGS)' | \ MTOOLSRC=$(obj)/mtools.conf mcopy - w:syslinux.cfg - if [ -f '$(FDINITRD)' ] ; then \ - MTOOLSRC=$(obj)/mtools.conf mcopy '$(FDINITRD)' w:initrd.img ; \ - fi MTOOLSRC=$(obj)/mtools.conf mcopy $(BOOTIMAGE) w:linux ; sync -isoimage: $(BOOTIMAGE) - -rm -rf $(obj)/isoimage - mkdir $(obj)/isoimage - for i in lib lib64 share end ; do \ - if [ -f /usr/$$i/syslinux/isolinux.bin ] ; then \ - cp /usr/$$i/syslinux/isolinux.bin $(obj)/isoimage ; \ - break ; \ - fi ; \ - if [ $$i = end ] ; then exit 1 ; fi ; \ - done - cp $(BOOTIMAGE) $(obj)/isoimage/linux - echo '$(image_cmdline)' > $(obj)/isoimage/isolinux.cfg - if [ -f '$(FDINITRD)' ] ; then \ - cp '$(FDINITRD)' $(obj)/isoimage/initrd.img ; \ - fi - mkisofs -J -r -o $(obj)/image.iso -b isolinux.bin -c boot.cat \ - -no-emul-boot -boot-load-size 4 -boot-info-table \ - $(obj)/isoimage - rm -rf $(obj)/isoimage - zlilo: $(BOOTIMAGE) if [ -f $(INSTALL_PATH)/vmlinuz ]; then mv $(INSTALL_PATH)/vmlinuz $(INSTALL_PATH)/vmlinuz.old; fi if [ -f $(INSTALL_PATH)/System.map ]; then mv $(INSTALL_PATH)/System.map $(INSTALL_PATH)/System.old; fi diff --git a/arch/i386/boot/compressed/misc.c b/arch/i386/boot/compressed/misc.c index b2ccd5434..6f962291a 100644 --- a/arch/i386/boot/compressed/misc.c +++ b/arch/i386/boot/compressed/misc.c @@ -24,6 +24,14 @@ #undef memset #undef memcpy + +/* + * Why do we do this? Don't ask me.. + * + * Incomprehensible are the ways of bootloaders. + */ +static void* memset(void *, int, size_t); +static void* memcpy(void *, __const void *, size_t); #define memzero(s, n) memset ((s), 0, (n)) typedef unsigned char uch; @@ -85,7 +93,7 @@ static unsigned char *real_mode; /* Pointer to real-mode data */ #endif #define RM_SCREEN_INFO (*(struct screen_info *)(real_mode+0)) -extern unsigned char input_data[]; +extern char input_data[]; extern int input_len; static long bytes_out = 0; @@ -95,9 +103,6 @@ static unsigned long output_ptr = 0; static void *malloc(int size); static void free(void *where); -static void *memset(void *s, int c, unsigned n); -static void *memcpy(void *dest, const void *src, unsigned n); - static void putstr(const char *); extern int end; @@ -200,7 +205,7 @@ static void putstr(const char *s) outb_p(0xff & (pos >> 1), vidport+1); } -static void* memset(void* s, int c, unsigned n) +static void* memset(void* s, int c, size_t n) { int i; char *ss = (char*)s; @@ -209,13 +214,14 @@ static void* memset(void* s, int c, unsigned n) return s; } -static void* memcpy(void* dest, const void* src, unsigned n) +static void* memcpy(void* __dest, __const void* __src, + size_t __n) { int i; - char *d = (char *)dest, *s = (char *)src; + char *d = (char *)__dest, *s = (char *)__src; - for (i=0;i RM_EXT_MEM_K ? RM_ALT_MEM_K : RM_EXT_MEM_K) < 1024) error("Less than 2MB of memory"); #endif - output_data = (unsigned char *)__PHYSICAL_START; /* Normally Points to 1M */ + output_data = (char *)PHYSICAL_START; /* Normally Points to 1M */ free_mem_end_ptr = (long)real_mode; } @@ -318,16 +324,18 @@ static void setup_output_buffer_if_we_run_high(struct moveparams *mv) #ifdef STANDARD_MEMORY_BIOS_CALL if (RM_EXT_MEM_K < (3*1024)) error("Less than 4MB of memory"); #else - if ((RM_ALT_MEM_K > RM_EXT_MEM_K ? RM_ALT_MEM_K : RM_EXT_MEM_K) < (3*1024)) error("Less than 4MB of memory"); + if ((RM_ALT_MEM_K > RM_EXT_MEM_K ? RM_ALT_MEM_K : RM_EXT_MEM_K) < + (3*1024)) + error("Less than 4MB of memory"); #endif - mv->low_buffer_start = output_data = (unsigned char *)LOW_BUFFER_START; + mv->low_buffer_start = output_data = (char *)LOW_BUFFER_START; low_buffer_end = ((unsigned int)real_mode > LOW_BUFFER_MAX ? LOW_BUFFER_MAX : (unsigned int)real_mode) & ~0xfff; low_buffer_size = low_buffer_end - LOW_BUFFER_START; high_loaded = 1; free_mem_end_ptr = (long)high_buffer_start; - if ( (__PHYSICAL_START + low_buffer_size) > ((ulg)high_buffer_start)) { - high_buffer_start = (uch *)(__PHYSICAL_START + low_buffer_size); + if ((PHYSICAL_START + low_buffer_size) > ((ulg)high_buffer_start)) { + high_buffer_start = (uch *)(PHYSICAL_START + low_buffer_size); mv->hcount = 0; /* say: we need not to move high_buffer */ } else mv->hcount = -1; diff --git a/arch/i386/boot/edd.S b/arch/i386/boot/edd.S index 4b84ea216..d8d69f2b9 100644 --- a/arch/i386/boot/edd.S +++ b/arch/i386/boot/edd.S @@ -76,8 +76,6 @@ edd_mbr_sig_read: popw %es popw %bx jc edd_mbr_sig_done # on failure, we're done. - cmpb $0, %ah # some BIOSes do not set CF - jne edd_mbr_sig_done # on failure, we're done. movl (EDDBUF+EDD_MBR_SIG_OFFSET), %eax # read sig out of the MBR movl %eax, (%bx) # store success incb (EDD_MBR_SIG_NR_BUF) # note that we stored something diff --git a/arch/i386/boot/setup.S b/arch/i386/boot/setup.S index d2b684cd6..ca668d9df 100644 --- a/arch/i386/boot/setup.S +++ b/arch/i386/boot/setup.S @@ -46,8 +46,9 @@ * by Robert Schwebel, December 2001 */ +#include #include -#include +#include #include #include #include diff --git a/arch/i386/boot/video.S b/arch/i386/boot/video.S index 5846d69dc..2ac40c824 100644 --- a/arch/i386/boot/video.S +++ b/arch/i386/boot/video.S @@ -11,6 +11,8 @@ * */ +#include /* for CONFIG_VIDEO_* */ + /* Enable autodetection of SVGA adapters and modes. */ #undef CONFIG_VIDEO_SVGA @@ -95,7 +97,6 @@ #define PARAM_VESAPM_OFF 0x30 #define PARAM_LFB_PAGES 0x32 #define PARAM_VESA_ATTRIB 0x34 -#define PARAM_CAPABILITIES 0x36 /* Define DO_STORE according to CONFIG_VIDEO_RETAIN */ #ifdef CONFIG_VIDEO_RETAIN @@ -125,12 +126,8 @@ video: pushw %ds # We use different segments call mode_set # Set the mode jc vid1 -#if 0 leaw badmdt, %si # Invalid mode ID call prtstr -#else - jmp vid1 -#endif /* CONFIG_VIDEO_IGNORE_BAD_MODE */ vid2: call mode_menu vid1: #ifdef CONFIG_VIDEO_RETAIN @@ -236,10 +233,6 @@ mopar_gr: movw 18(%di), %ax movl %eax, %fs:(PARAM_LFB_SIZE) -# store mode capabilities - movl 10(%di), %eax - movl %eax, %fs:(PARAM_CAPABILITIES) - # switching the DAC to 8-bit is for <= 8 bpp only movw %fs:(PARAM_LFB_DEPTH), %ax cmpw $8, %ax @@ -1931,7 +1924,6 @@ skip10: movb %ah, %al ret store_edid: -#ifdef CONFIG_FIRMWARE_EDID pushw %es # just save all registers pushw %ax pushw %bx @@ -1949,22 +1941,6 @@ store_edid: rep stosl - pushw %es # save ES - xorw %di, %di # Report Capability - pushw %di - popw %es # ES:DI must be 0:0 - movw $0x4f15, %ax - xorw %bx, %bx - xorw %cx, %cx - int $0x10 - popw %es # restore ES - - cmpb $0x00, %ah # call successful - jne no_edid - - cmpb $0x4f, %al # function supported - jne no_edid - movw $0x4f15, %ax # do VBE/DDC movw $0x01, %bx movw $0x00, %cx @@ -1972,14 +1948,12 @@ store_edid: movw $0x140, %di int $0x10 -no_edid: popw %di # restore all registers popw %dx popw %cx popw %bx popw %ax popw %es -#endif ret # VIDEO_SELECT-only variables diff --git a/arch/i386/crypto/aes-i586-asm.S b/arch/i386/crypto/aes-i586-asm.S index f942f0c8f..911b15377 100644 --- a/arch/i386/crypto/aes-i586-asm.S +++ b/arch/i386/crypto/aes-i586-asm.S @@ -36,19 +36,22 @@ .file "aes-i586-asm.S" .text -#include - +// aes_rval aes_enc_blk(const unsigned char in_blk[], unsigned char out_blk[], const aes_ctx cx[1])// +// aes_rval aes_dec_blk(const unsigned char in_blk[], unsigned char out_blk[], const aes_ctx cx[1])// + #define tlen 1024 // length of each of 4 'xor' arrays (256 32-bit words) -/* offsets to parameters with one register pushed onto stack */ -#define tfm 8 -#define out_blk 12 -#define in_blk 16 +// offsets to parameters with one register pushed onto stack + +#define in_blk 8 // input byte array address parameter +#define out_blk 12 // output byte array address parameter +#define ctx 16 // AES context structure + +// offsets in context structure -/* offsets in crypto_tfm structure */ -#define ekey (crypto_tfm_ctx_offset + 0) -#define nrnd (crypto_tfm_ctx_offset + 256) -#define dkey (crypto_tfm_ctx_offset + 260) +#define ekey 0 // encryption key schedule base address +#define nrnd 256 // number of rounds +#define dkey 260 // decryption key schedule base address // register mapping for encrypt and decrypt subroutines @@ -217,7 +220,6 @@ do_col (table, r5,r0,r1,r4, r2,r3); /* idx=r5 */ // AES (Rijndael) Encryption Subroutine -/* void aes_enc_blk(struct crypto_tfm *tfm, u8 *out_blk, const u8 *in_blk) */ .global aes_enc_blk @@ -228,7 +230,7 @@ aes_enc_blk: push %ebp - mov tfm(%esp),%ebp + mov ctx(%esp),%ebp // pointer to context // CAUTION: the order and the values used in these assigns // rely on the register mappings @@ -293,7 +295,6 @@ aes_enc_blk: ret // AES (Rijndael) Decryption Subroutine -/* void aes_dec_blk(struct crypto_tfm *tfm, u8 *out_blk, const u8 *in_blk) */ .global aes_dec_blk @@ -304,7 +305,7 @@ aes_enc_blk: aes_dec_blk: push %ebp - mov tfm(%esp),%ebp + mov ctx(%esp),%ebp // pointer to context // CAUTION: the order and the values used in these assigns // rely on the register mappings diff --git a/arch/i386/crypto/aes.c b/arch/i386/crypto/aes.c index d3806daa3..a50397b1d 100644 --- a/arch/i386/crypto/aes.c +++ b/arch/i386/crypto/aes.c @@ -45,8 +45,8 @@ #include #include -asmlinkage void aes_enc_blk(struct crypto_tfm *tfm, u8 *dst, const u8 *src); -asmlinkage void aes_dec_blk(struct crypto_tfm *tfm, u8 *dst, const u8 *src); +asmlinkage void aes_enc_blk(const u8 *src, u8 *dst, void *ctx); +asmlinkage void aes_dec_blk(const u8 *src, u8 *dst, void *ctx); #define AES_MIN_KEY_SIZE 16 #define AES_MAX_KEY_SIZE 32 @@ -378,12 +378,12 @@ static void gen_tabs(void) k[8*(i)+11] = ss[3]; \ } -static int aes_set_key(struct crypto_tfm *tfm, const u8 *in_key, - unsigned int key_len, u32 *flags) +static int +aes_set_key(void *ctx_arg, const u8 *in_key, unsigned int key_len, u32 *flags) { int i; u32 ss[8]; - struct aes_ctx *ctx = crypto_tfm_ctx(tfm); + struct aes_ctx *ctx = ctx_arg; const __le32 *key = (const __le32 *)in_key; /* encryption schedule */ @@ -464,16 +464,16 @@ static int aes_set_key(struct crypto_tfm *tfm, const u8 *in_key, return 0; } -static void aes_encrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src) +static inline void aes_encrypt(void *ctx, u8 *dst, const u8 *src) { - aes_enc_blk(tfm, dst, src); + aes_enc_blk(src, dst, ctx); } - -static void aes_decrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src) +static inline void aes_decrypt(void *ctx, u8 *dst, const u8 *src) { - aes_dec_blk(tfm, dst, src); + aes_dec_blk(src, dst, ctx); } + static struct crypto_alg aes_alg = { .cra_name = "aes", .cra_driver_name = "aes-i586", diff --git a/arch/i386/defconfig b/arch/i386/defconfig index 89ebb7a31..23cc26d1b 100644 --- a/arch/i386/defconfig +++ b/arch/i386/defconfig @@ -219,7 +219,7 @@ CONFIG_ACPI_BLACKLIST_YEAR=0 CONFIG_ACPI_EC=y CONFIG_ACPI_POWER=y CONFIG_ACPI_SYSTEM=y -# CONFIG_X86_PM_TIMER is not set +CONFIG_X86_PM_TIMER=y # CONFIG_ACPI_CONTAINER is not set # @@ -416,7 +416,7 @@ CONFIG_IP_NF_TARGET_LOG=y # CONFIG_STANDALONE=y CONFIG_PREVENT_FIRMWARE_BUILD=y -# CONFIG_FW_LOADER is not set +CONFIG_FW_LOADER=y # # Connector - unified userspace <-> kernelspace linker @@ -447,7 +447,7 @@ CONFIG_PARPORT_1284=y # # Block devices # -# CONFIG_BLK_DEV_FD is not set +CONFIG_BLK_DEV_FD=y # CONFIG_PARIDE is not set # CONFIG_BLK_CPQ_DA is not set # CONFIG_BLK_CPQ_CISS_DA is not set @@ -575,7 +575,22 @@ CONFIG_BLK_DEV_SD=y # CONFIG_MEGARAID_NEWGEN is not set # CONFIG_MEGARAID_LEGACY is not set # CONFIG_MEGARAID_SAS is not set -# CONFIG_SCSI_SATA is not set +CONFIG_SCSI_SATA=y +# CONFIG_SCSI_SATA_AHCI is not set +# CONFIG_SCSI_SATA_SVW is not set +# CONFIG_SCSI_ATA_PIIX is not set +# CONFIG_SCSI_SATA_MV is not set +# CONFIG_SCSI_SATA_NV is not set +# CONFIG_SCSI_PDC_ADMA is not set +# CONFIG_SCSI_SATA_QSTOR is not set +# CONFIG_SCSI_SATA_PROMISE is not set +# CONFIG_SCSI_SATA_SX4 is not set +# CONFIG_SCSI_SATA_SIL is not set +# CONFIG_SCSI_SATA_SIL24 is not set +# CONFIG_SCSI_SATA_SIS is not set +# CONFIG_SCSI_SATA_ULI is not set +CONFIG_SCSI_SATA_VIA=y +# CONFIG_SCSI_SATA_VITESSE is not set # CONFIG_SCSI_BUSLOGIC is not set # CONFIG_SCSI_DMX3191D is not set # CONFIG_SCSI_EATA is not set @@ -1011,6 +1026,11 @@ CONFIG_VIDEO_DEV=y # CONFIG_VIDEO_ZORAN is not set CONFIG_VIDEO_SAA7134=y # CONFIG_VIDEO_SAA7134_ALSA is not set +CONFIG_VIDEO_SAA7134_DVB=y +# CONFIG_VIDEO_SAA7134_DVB_ALL_FRONTENDS is not set +# CONFIG_VIDEO_SAA7134_DVB_MT352 is not set +CONFIG_VIDEO_SAA7134_DVB_TDA1004X=y +# CONFIG_VIDEO_SAA7134_DVB_NXT200X is not set # CONFIG_VIDEO_MXB is not set # CONFIG_VIDEO_DPC is not set # CONFIG_VIDEO_HEXIUM_ORION is not set @@ -1031,9 +1051,90 @@ CONFIG_VIDEO_SAA7134=y # # Digital Video Broadcasting Devices # -# CONFIG_DVB is not set +CONFIG_DVB=y +CONFIG_DVB_CORE=y + +# +# Supported SAA7146 based PCI Adapters +# +# CONFIG_DVB_AV7110 is not set +# CONFIG_DVB_BUDGET is not set +# CONFIG_DVB_BUDGET_CI is not set +# CONFIG_DVB_BUDGET_AV is not set + +# +# Supported USB Adapters +# +# CONFIG_DVB_USB is not set +# CONFIG_DVB_TTUSB_BUDGET is not set +# CONFIG_DVB_TTUSB_DEC is not set +# CONFIG_DVB_CINERGYT2 is not set + +# +# Supported FlexCopII (B2C2) Adapters +# +# CONFIG_DVB_B2C2_FLEXCOP is not set + +# +# Supported BT878 Adapters +# + +# +# Supported Pluto2 Adapters +# +# CONFIG_DVB_PLUTO2 is not set + +# +# Supported DVB Frontends +# + +# +# Customise DVB Frontends +# + +# +# DVB-S (satellite) frontends +# +# CONFIG_DVB_STV0299 is not set +# CONFIG_DVB_CX24110 is not set +# CONFIG_DVB_CX24123 is not set +# CONFIG_DVB_TDA8083 is not set +# CONFIG_DVB_MT312 is not set +# CONFIG_DVB_VES1X93 is not set +# CONFIG_DVB_S5H1420 is not set + +# +# DVB-T (terrestrial) frontends +# +# CONFIG_DVB_SP8870 is not set +# CONFIG_DVB_SP887X is not set +# CONFIG_DVB_CX22700 is not set +# CONFIG_DVB_CX22702 is not set +# CONFIG_DVB_L64781 is not set +CONFIG_DVB_TDA1004X=y +# CONFIG_DVB_NXT6000 is not set +# CONFIG_DVB_MT352 is not set +# CONFIG_DVB_DIB3000MB is not set +# CONFIG_DVB_DIB3000MC is not set + +# +# DVB-C (cable) frontends +# +# CONFIG_DVB_VES1820 is not set +# CONFIG_DVB_TDA10021 is not set +# CONFIG_DVB_STV0297 is not set + +# +# ATSC (North American/Korean Terresterial DTV) frontends +# +# CONFIG_DVB_NXT200X is not set +# CONFIG_DVB_OR51211 is not set +# CONFIG_DVB_OR51132 is not set +# CONFIG_DVB_BCM3510 is not set +# CONFIG_DVB_LGDT330X is not set CONFIG_VIDEO_TUNER=y CONFIG_VIDEO_BUF=y +CONFIG_VIDEO_BUF_DVB=y CONFIG_VIDEO_IR=y # @@ -1349,11 +1450,7 @@ CONFIG_USB_STORAGE=y # CONFIG_INFINIBAND is not set # -# SN Devices -# - -# -# EDAC - error detection and reporting (RAS) +# EDAC - error detection and reporting (RAS) (EXPERIMENTAL) # # CONFIG_EDAC is not set diff --git a/arch/i386/kernel/Makefile b/arch/i386/kernel/Makefile index 9bfc980ae..65656c033 100644 --- a/arch/i386/kernel/Makefile +++ b/arch/i386/kernel/Makefile @@ -6,11 +6,11 @@ extra-y := head.o init_task.o vmlinux.lds obj-y := process.o semaphore.o signal.o entry.o traps.o irq.o \ ptrace.o time.o ioport.o ldt.o setup.o i8259.o sys_i386.o \ - pci-dma.o i386_ksyms.o i387.o bootflag.o \ - quirks.o i8237.o topology.o alternative.o i8253.o tsc.o + pci-dma.o i386_ksyms.o i387.o dmi_scan.o bootflag.o \ + quirks.o i8237.o topology.o -obj-$(CONFIG_STACKTRACE) += stacktrace.o obj-y += cpu/ +obj-y += timers/ obj-y += acpi/ obj-$(CONFIG_X86_BIOS_REBOOT) += reboot.o obj-$(CONFIG_MCA) += mca.o @@ -37,19 +37,11 @@ obj-$(CONFIG_EFI) += efi.o efi_stub.o obj-$(CONFIG_DOUBLEFAULT) += doublefault.o obj-$(CONFIG_VM86) += vm86.o obj-$(CONFIG_EARLY_PRINTK) += early_printk.o -obj-$(CONFIG_HPET_TIMER) += hpet.o -obj-$(CONFIG_K8_NB) += k8.o EXTRA_AFLAGS := -traditional obj-$(CONFIG_SCx200) += scx200.o -ifdef CONFIG_XEN -vsyscall_note := vsyscall-note-xen.o -else -vsyscall_note := vsyscall-note.o -endif - # vsyscall.o contains the vsyscall DSO images as __initdata. # We must build both images before we can assemble it. # Note: kbuild does not track this dependency due to usage of .incbin @@ -64,14 +56,13 @@ quiet_cmd_syscall = SYSCALL $@ export CPPFLAGS_vsyscall.lds += -P -C -U$(ARCH) -vsyscall-flags = -shared -s -Wl,-soname=linux-gate.so.1 \ - $(call ld-option, -Wl$(comma)--hash-style=sysv) +vsyscall-flags = -shared -s -Wl,-soname=linux-gate.so.1 SYSCFLAGS_vsyscall-sysenter.so = $(vsyscall-flags) SYSCFLAGS_vsyscall-int80.so = $(vsyscall-flags) $(obj)/vsyscall-int80.so $(obj)/vsyscall-sysenter.so: \ $(obj)/vsyscall-%.so: $(src)/vsyscall.lds \ - $(obj)/vsyscall-%.o $(obj)/$(vsyscall_note) FORCE + $(obj)/vsyscall-%.o $(obj)/vsyscall-note.o FORCE $(call if_changed,syscall) # We also create a special relocatable object that should mirror the symbol @@ -83,20 +74,5 @@ $(obj)/built-in.o: ld_flags += -R $(obj)/vsyscall-syms.o SYSCFLAGS_vsyscall-syms.o = -r $(obj)/vsyscall-syms.o: $(src)/vsyscall.lds \ - $(obj)/vsyscall-sysenter.o $(obj)/$(vsyscall_note) FORCE + $(obj)/vsyscall-sysenter.o $(obj)/vsyscall-note.o FORCE $(call if_changed,syscall) - -k8-y += ../../x86_64/kernel/k8.o -stacktrace-y += ../../x86_64/kernel/stacktrace.o - -ifdef CONFIG_XEN -include $(srctree)/scripts/Makefile.xen - -obj-y += fixup.o -microcode-$(subst m,y,$(CONFIG_MICROCODE)) := microcode-xen.o -n-obj-xen := i8259.o timers/ reboot.o smpboot.o trampoline.o - -obj-y := $(call filterxen, $(obj-y), $(n-obj-xen)) -obj-y := $(call cherrypickxen, $(obj-y)) -extra-y := $(call cherrypickxen, $(extra-y)) -endif diff --git a/arch/i386/kernel/acpi/Makefile b/arch/i386/kernel/acpi/Makefile index fa783e6f9..7e9ac9935 100644 --- a/arch/i386/kernel/acpi/Makefile +++ b/arch/i386/kernel/acpi/Makefile @@ -6,7 +6,3 @@ ifneq ($(CONFIG_ACPI_PROCESSOR),) obj-y += cstate.o processor.o endif -ifdef CONFIG_XEN -include $(srctree)/scripts/Makefile.xen -obj-y := $(call cherrypickxen, $(obj-y), $(src)) -endif diff --git a/arch/i386/kernel/acpi/boot.c b/arch/i386/kernel/acpi/boot.c index ee003bc0e..f1a219459 100644 --- a/arch/i386/kernel/acpi/boot.c +++ b/arch/i386/kernel/acpi/boot.c @@ -24,6 +24,7 @@ */ #include +#include #include #include #include @@ -59,7 +60,7 @@ static inline int gsi_irq_sharing(int gsi) { return gsi; } #define BAD_MADT_ENTRY(entry, end) ( \ (!entry) || (unsigned long)entry + sizeof(*entry) > end || \ - ((acpi_table_entry_header *)entry)->length < sizeof(*entry)) + ((acpi_table_entry_header *)entry)->length != sizeof(*entry)) #define PREFIX "ACPI: " @@ -201,8 +202,6 @@ int __init acpi_parse_mcfg(unsigned long phys_addr, unsigned long size) if (mcfg->config[i].base_reserved) { printk(KERN_ERR PREFIX "MMCONFIG not in low 4GB of memory\n"); - kfree(pci_mmcfg_config); - pci_mmcfg_config_num = 0; return -ENODEV; } } @@ -216,7 +215,7 @@ static int __init acpi_parse_madt(unsigned long phys_addr, unsigned long size) { struct acpi_table_madt *madt = NULL; - if (!phys_addr || !size || !cpu_has_apic) + if (!phys_addr || !size) return -EINVAL; madt = (struct acpi_table_madt *)__acpi_map_table(phys_addr, size); @@ -622,9 +621,9 @@ extern u32 pmtmr_ioport; static int __init acpi_parse_fadt(unsigned long phys, unsigned long size) { - struct fadt_descriptor *fadt = NULL; + struct fadt_descriptor_rev2 *fadt = NULL; - fadt = (struct fadt_descriptor *)__acpi_map_table(phys, size); + fadt = (struct fadt_descriptor_rev2 *)__acpi_map_table(phys, size); if (!fadt) { printk(KERN_WARNING PREFIX "Unable to map FADT\n"); return 0; @@ -669,10 +668,10 @@ unsigned long __init acpi_find_rsdp(void) unsigned long rsdp_phys = 0; if (efi_enabled) { - if (efi.acpi20 != EFI_INVALID_TABLE_ADDR) - return efi.acpi20; - else if (efi.acpi != EFI_INVALID_TABLE_ADDR) - return efi.acpi; + if (efi.acpi20) + return __pa(efi.acpi20); + else if (efi.acpi) + return __pa(efi.acpi); } /* * Scan memory looking for the RSDP signature. First search EBDA (low @@ -694,9 +693,6 @@ static int __init acpi_parse_madt_lapic_entries(void) { int count; - if (!cpu_has_apic) - return -ENODEV; - /* * Note that the LAPIC address is obtained from the MADT (32-bit value) * and (optionally) overriden by a LAPIC_ADDR_OVR entry (64-bit value). @@ -755,9 +751,6 @@ static int __init acpi_parse_madt_ioapic_entries(void) return -ENODEV; } - if (!cpu_has_apic) - return -ENODEV; - /* * if "noapic" boot option, don't look for IO-APICs */ diff --git a/arch/i386/kernel/acpi/earlyquirk.c b/arch/i386/kernel/acpi/earlyquirk.c index 1649a175a..2e3b643a4 100644 --- a/arch/i386/kernel/acpi/earlyquirk.c +++ b/arch/i386/kernel/acpi/earlyquirk.c @@ -5,34 +5,17 @@ #include #include #include -#include - #include #include #include -#ifdef CONFIG_ACPI - -static int nvidia_hpet_detected __initdata; - -static int __init nvidia_hpet_check(unsigned long phys, unsigned long size) -{ - nvidia_hpet_detected = 1; - return 0; -} -#endif - static int __init check_bridge(int vendor, int device) { #ifdef CONFIG_ACPI - /* According to Nvidia all timer overrides are bogus unless HPET - is enabled. */ + /* According to Nvidia all timer overrides are bogus. Just ignore + them all. */ if (vendor == PCI_VENDOR_ID_NVIDIA) { - nvidia_hpet_detected = 0; - acpi_table_parse(ACPI_HPET, nvidia_hpet_check); - if (nvidia_hpet_detected == 0) { - acpi_skip_timer_override = 1; - } + acpi_skip_timer_override = 1; } #endif if (vendor == PCI_VENDOR_ID_ATI && timer_over_8254 == 1) { diff --git a/arch/i386/kernel/acpi/processor.c b/arch/i386/kernel/acpi/processor.c index b54fded49..9f4cc0271 100644 --- a/arch/i386/kernel/acpi/processor.c +++ b/arch/i386/kernel/acpi/processor.c @@ -47,7 +47,7 @@ static void init_intel_pdc(struct acpi_processor *pr, struct cpuinfo_x86 *c) buf[2] = ACPI_PDC_C_CAPABILITY_SMP; if (cpu_has(c, X86_FEATURE_EST)) - buf[2] |= ACPI_PDC_EST_CAPABILITY_SWSMP; + buf[2] |= ACPI_PDC_EST_CAPABILITY_SMP; obj->type = ACPI_TYPE_BUFFER; obj->buffer.length = 12; diff --git a/arch/i386/kernel/acpi/sleep.c b/arch/i386/kernel/acpi/sleep.c index 4ee83577b..1cb2b186a 100644 --- a/arch/i386/kernel/acpi/sleep.c +++ b/arch/i386/kernel/acpi/sleep.c @@ -8,17 +8,30 @@ #include #include #include -#include - #include +#include /* address in low memory of the wakeup routine. */ unsigned long acpi_wakeup_address = 0; unsigned long acpi_video_flags; extern char wakeup_start, wakeup_end; +extern void zap_low_mappings(void); + extern unsigned long FASTCALL(acpi_copy_wakeup_routine(unsigned long)); +static void init_low_mapping(pgd_t * pgd, int pgd_limit) +{ + int pgd_ofs = 0; + + while ((pgd_ofs < pgd_limit) + && (pgd_ofs + USER_PTRS_PER_PGD < PTRS_PER_PGD)) { + set_pgd(pgd, *(pgd + USER_PTRS_PER_PGD)); + pgd_ofs++, pgd++; + } + flush_tlb_all(); +} + /** * acpi_save_state_mem - save kernel state * @@ -29,6 +42,7 @@ int acpi_save_state_mem(void) { if (!acpi_wakeup_address) return 1; + init_low_mapping(swapper_pg_dir, USER_PTRS_PER_PGD); memcpy((void *)acpi_wakeup_address, &wakeup_start, &wakeup_end - &wakeup_start); acpi_copy_wakeup_routine(acpi_wakeup_address); @@ -41,6 +55,7 @@ int acpi_save_state_mem(void) */ void acpi_restore_state_mem(void) { + zap_low_mappings(); } /** diff --git a/arch/i386/kernel/acpi/wakeup.S b/arch/i386/kernel/acpi/wakeup.S index b781b3813..7c74fe0dc 100644 --- a/arch/i386/kernel/acpi/wakeup.S +++ b/arch/i386/kernel/acpi/wakeup.S @@ -56,7 +56,7 @@ wakeup_code: 1: # set up page table - movl $swsusp_pg_dir-__PAGE_OFFSET, %eax + movl $swapper_pg_dir-__PAGE_OFFSET, %eax movl %eax, %cr3 testl $1, real_efer_save_restore - wakeup_code @@ -265,6 +265,11 @@ ENTRY(acpi_copy_wakeup_routine) movl $0x12345678, saved_magic ret +.data +ALIGN +ENTRY(saved_magic) .long 0 +ENTRY(saved_eip) .long 0 + save_registers: leal 4(%esp), %eax movl %eax, saved_context_esp @@ -292,21 +297,14 @@ ENTRY(do_suspend_lowlevel) pushl $3 call acpi_enter_sleep_state addl $4, %esp - -# In case of S3 failure, we'll emerge here. Jump -# to ret_point to recover - jmp ret_point + ret .p2align 4,,7 ret_point: call restore_registers call restore_processor_state ret -.data ALIGN -ENTRY(saved_magic) .long 0 -ENTRY(saved_eip) .long 0 - # saved registers saved_gdt: .long 0,0 saved_idt: .long 0,0 diff --git a/arch/i386/kernel/apic.c b/arch/i386/kernel/apic.c index 8c844d078..776c90989 100644 --- a/arch/i386/kernel/apic.c +++ b/arch/i386/kernel/apic.c @@ -14,6 +14,7 @@ * Mikael Pettersson : PM converted to driver model. */ +#include #include #include @@ -35,10 +36,8 @@ #include #include #include -#include #include -#include #include #include "io_ports.h" @@ -62,18 +61,6 @@ int apic_verbosity; static void apic_pm_activate(void); -static int modern_apic(void) -{ - unsigned int lvr, version; - /* AMD systems use old APIC versions, so check the CPU */ - if (boot_cpu_data.x86_vendor == X86_VENDOR_AMD && - boot_cpu_data.x86 >= 0xf) - return 1; - lvr = apic_read(APIC_LVR); - version = GET_APIC_VERSION(lvr); - return version >= 0x14; -} - /* * 'what should we do if we get a hw irq event on an illegal vector'. * each architecture has to answer this themselves. @@ -113,7 +100,7 @@ void __init apic_intr_init(void) } /* Using APIC to generate smp_local_timer_interrupt? */ -int using_apic_timer __read_mostly = 0; +int using_apic_timer = 0; static int enabled_via_apicbase; @@ -131,7 +118,10 @@ void enable_NMI_through_LVT0 (void * dummy) int get_physical_broadcast(void) { - if (modern_apic()) + unsigned int lvr, version; + lvr = apic_read(APIC_LVR); + version = GET_APIC_VERSION(lvr); + if (!APIC_INTEGRATED(version) || version >= 0x14) return 0xff; else return 0xf; @@ -156,7 +146,7 @@ void clear_local_APIC(void) maxlvt = get_maxlvt(); /* - * Masking an LVT entry can trigger a local APIC error + * Masking an LVT entry on a P6 can trigger a local APIC error * if the vector is zero. Mask LVTERR first to prevent this. */ if (maxlvt >= 3) { @@ -358,9 +348,9 @@ int __init verify_local_APIC(void) void __init sync_Arb_IDs(void) { - /* Unsupported on P4 - see Intel Dev. Manual Vol. 3, Ch. 8.6.1 - And not needed on AMD */ - if (modern_apic()) + /* Unsupported on P4 - see Intel Dev. Manual Vol. 3, Ch. 8.6.1 */ + unsigned int ver = GET_APIC_VERSION(apic_read(APIC_LVR)); + if (ver >= 0x14) /* P4 or higher */ return; /* * Wait for idle. @@ -424,7 +414,6 @@ void __init init_bsp_APIC(void) void __devinit setup_local_APIC(void) { unsigned long oldvalue, value, ver, maxlvt; - int i, j; /* Pound the ESR really hard over the head with a big hammer - mbligh */ if (esr_disable) { @@ -461,25 +450,6 @@ void __devinit setup_local_APIC(void) value &= ~APIC_TPRI_MASK; apic_write_around(APIC_TASKPRI, value); - /* - * After a crash, we no longer service the interrupts and a pending - * interrupt from previous kernel might still have ISR bit set. - * - * Most probably by now CPU has serviced that pending interrupt and - * it might not have done the ack_APIC_irq() because it thought, - * interrupt came from i8259 as ExtInt. LAPIC did not get EOI so it - * does not clear the ISR bit and cpu thinks it has already serivced - * the interrupt. Hence a vector might get locked. It was noticed - * for timer irq (vector 0x31). Issue an extra EOI to clear ISR. - */ - for (i = APIC_ISR_NR - 1; i >= 0; i--) { - value = apic_read(APIC_ISR + i*0x10); - for (j = 31; j >= 0; j--) { - if (value & (1<status & TS_POLLING); + polling = test_thread_flag(TIF_POLLING_NRFLAG); if (polling) { - current_thread_info()->status &= ~TS_POLLING; + clear_thread_flag(TIF_POLLING_NRFLAG); smp_mb__after_clear_bit(); } if (!need_resched()) { @@ -784,7 +774,7 @@ static int apm_do_idle(void) ret = apm_bios_call_simple(APM_FUNC_IDLE, 0, 0, &eax); } if (polling) - current_thread_info()->status |= TS_POLLING; + set_thread_flag(TIF_POLLING_NRFLAG); if (!idled) return 0; @@ -832,7 +822,9 @@ static void apm_do_busy(void) #define IDLE_CALC_LIMIT (HZ * 100) #define IDLE_LEAKY_MAX 16 -static void (*original_pm_idle)(void) __read_mostly; +static void (*original_pm_idle)(void); + +extern void default_idle(void); /** * apm_cpu_idle - cpu idling for APM capable Linux @@ -1073,8 +1065,7 @@ static int apm_engage_power_management(u_short device, int enable) static int apm_console_blank(int blank) { - int error = APM_NOT_ENGAGED; /* silence gcc */ - int i; + int error, i; u_short state; static const u_short dev[3] = { 0x100, 0x1FF, 0x101 }; @@ -1115,8 +1106,7 @@ static int queue_empty(struct apm_user *as) static apm_event_t get_queued_event(struct apm_user *as) { - if (++as->event_tail >= APM_MAX_EVENTS) - as->event_tail = 0; + as->event_tail = (as->event_tail + 1) % APM_MAX_EVENTS; return as->events[as->event_tail]; } @@ -1130,16 +1120,13 @@ static void queue_event(apm_event_t event, struct apm_user *sender) for (as = user_list; as != NULL; as = as->next) { if ((as == sender) || (!as->reader)) continue; - if (++as->event_head >= APM_MAX_EVENTS) - as->event_head = 0; - + as->event_head = (as->event_head + 1) % APM_MAX_EVENTS; if (as->event_head == as->event_tail) { static int notified; if (notified++ == 0) printk(KERN_ERR "apm: an event queue overflowed\n"); - if (++as->event_tail >= APM_MAX_EVENTS) - as->event_tail = 0; + as->event_tail = (as->event_tail + 1) % APM_MAX_EVENTS; } as->events[as->event_head] = event; if ((!as->suser) || (!as->writer)) @@ -1297,7 +1284,7 @@ static void standby(void) static apm_event_t get_event(void) { int error; - apm_event_t event = APM_NO_EVENTS; /* silence gcc */ + apm_event_t event; apm_eventinfo_t info; static int notified; diff --git a/arch/i386/kernel/asm-offsets.c b/arch/i386/kernel/asm-offsets.c index 8eda1abcd..36d66e207 100644 --- a/arch/i386/kernel/asm-offsets.c +++ b/arch/i386/kernel/asm-offsets.c @@ -4,7 +4,6 @@ * to extract and format the required data. */ -#include #include #include #include @@ -14,7 +13,6 @@ #include #include #include -#include #define DEFINE(sym, val) \ asm volatile("\n->" #sym " %0 " #val : : "i" (val)) @@ -55,7 +53,6 @@ void foo(void) OFFSET(TI_preempt_count, thread_info, preempt_count); OFFSET(TI_addr_limit, thread_info, addr_limit); OFFSET(TI_restart_block, thread_info, restart_block); - OFFSET(TI_sysenter_return, thread_info, sysenter_return); BLANK(); OFFSET(EXEC_DOMAIN_handler, exec_domain, handler); @@ -66,17 +63,10 @@ void foo(void) OFFSET(pbe_orig_address, pbe, orig_address); OFFSET(pbe_next, pbe, next); -#ifndef CONFIG_X86_NO_TSS /* Offset from the sysenter stack to tss.esp0 */ - DEFINE(SYSENTER_stack_esp0, offsetof(struct tss_struct, esp0) - + DEFINE(TSS_sysenter_esp0, offsetof(struct tss_struct, esp0) - sizeof(struct tss_struct)); -#else - /* sysenter stack points directly to esp0 */ - DEFINE(SYSENTER_stack_esp0, 0); -#endif DEFINE(PAGE_SIZE_asm, PAGE_SIZE); - DEFINE(VDSO_PRELINK, VDSO_PRELINK); - - OFFSET(crypto_tfm_ctx_offset, crypto_tfm, __crt_ctx); + DEFINE(VSYSCALL_BASE, __fix_to_virt(FIX_VSYSCALL)); } diff --git a/arch/i386/kernel/bootflag.c b/arch/i386/kernel/bootflag.c index 0b9860530..4c30ed01f 100644 --- a/arch/i386/kernel/bootflag.c +++ b/arch/i386/kernel/bootflag.c @@ -3,6 +3,7 @@ */ +#include #include #include #include diff --git a/arch/i386/kernel/cpu/Makefile b/arch/i386/kernel/cpu/Makefile index 753f1d770..010aecfff 100644 --- a/arch/i386/kernel/cpu/Makefile +++ b/arch/i386/kernel/cpu/Makefile @@ -17,8 +17,3 @@ obj-$(CONFIG_X86_MCE) += mcheck/ obj-$(CONFIG_MTRR) += mtrr/ obj-$(CONFIG_CPU_FREQ) += cpufreq/ - -ifdef CONFIG_XEN -include $(srctree)/scripts/Makefile.xen -obj-y := $(call cherrypickxen, $(obj-y), $(src)) -endif diff --git a/arch/i386/kernel/cpu/amd.c b/arch/i386/kernel/cpu/amd.c index e6a2d6b80..d2d50cbdc 100644 --- a/arch/i386/kernel/cpu/amd.c +++ b/arch/i386/kernel/cpu/amd.c @@ -214,6 +214,8 @@ static void __init init_amd(struct cpuinfo_x86 *c) if (cpuid_eax(0x80000000) >= 0x80000008) { c->x86_max_cores = (cpuid_ecx(0x80000008) & 0xff) + 1; + if (c->x86_max_cores & (c->x86_max_cores - 1)) + c->x86_max_cores = 1; } if (cpuid_eax(0x80000000) >= 0x80000007) { @@ -224,26 +226,22 @@ static void __init init_amd(struct cpuinfo_x86 *c) #ifdef CONFIG_X86_HT /* - * On a AMD multi core setup the lower bits of the APIC id - * distingush the cores. + * On a AMD dual core setup the lower bits of the APIC id + * distingush the cores. Assumes number of cores is a power + * of two. */ if (c->x86_max_cores > 1) { int cpu = smp_processor_id(); - unsigned bits = (cpuid_ecx(0x80000008) >> 12) & 0xf; - - if (bits == 0) { - while ((1 << bits) < c->x86_max_cores) - bits++; - } - c->cpu_core_id = c->phys_proc_id & ((1<phys_proc_id >>= bits; + unsigned bits = 0; + while ((1 << bits) < c->x86_max_cores) + bits++; + cpu_core_id[cpu] = phys_proc_id[cpu] & ((1<>= bits; printk(KERN_INFO "CPU %d(%d) -> Core %d\n", - cpu, c->x86_max_cores, c->cpu_core_id); + cpu, c->x86_max_cores, cpu_core_id[cpu]); } #endif - if (cpuid_eax(0x80000000) >= 0x80000006) - num_cache_leaves = 3; } static unsigned int amd_size_cache(struct cpuinfo_x86 * c, unsigned int size) diff --git a/arch/i386/kernel/cpu/centaur.c b/arch/i386/kernel/cpu/centaur.c index bd75629dd..f52669ecb 100644 --- a/arch/i386/kernel/cpu/centaur.c +++ b/arch/i386/kernel/cpu/centaur.c @@ -4,7 +4,6 @@ #include #include #include -#include #include "cpu.h" #ifdef CONFIG_X86_OOSTORE diff --git a/arch/i386/kernel/cpu/common.c b/arch/i386/kernel/cpu/common.c index 7dda85f66..e6bd095ae 100644 --- a/arch/i386/kernel/cpu/common.c +++ b/arch/i386/kernel/cpu/common.c @@ -11,8 +11,6 @@ #include #include #include -#include -#include #ifdef CONFIG_X86_LOCAL_APIC #include #include @@ -27,10 +25,9 @@ EXPORT_PER_CPU_SYMBOL(cpu_gdt_descr); DEFINE_PER_CPU(unsigned char, cpu_16bit_stack[CPU_16BIT_STACK_SIZE]); EXPORT_PER_CPU_SYMBOL(cpu_16bit_stack); -static int cachesize_override __cpuinitdata = -1; -static int disable_x86_fxsr __cpuinitdata; -static int disable_x86_serial_nr __cpuinitdata = 1; -static int disable_x86_sep __cpuinitdata; +static int cachesize_override __devinitdata = -1; +static int disable_x86_fxsr __devinitdata = 0; +static int disable_x86_serial_nr __devinitdata = 1; struct cpu_dev * cpu_devs[X86_VENDOR_NUM] = {}; @@ -62,7 +59,7 @@ static int __init cachesize_setup(char *str) } __setup("cachesize=", cachesize_setup); -int __cpuinit get_model_name(struct cpuinfo_x86 *c) +int __devinit get_model_name(struct cpuinfo_x86 *c) { unsigned int *v; char *p, *q; @@ -92,7 +89,7 @@ int __cpuinit get_model_name(struct cpuinfo_x86 *c) } -void __cpuinit display_cacheinfo(struct cpuinfo_x86 *c) +void __devinit display_cacheinfo(struct cpuinfo_x86 *c) { unsigned int n, dummy, ecx, edx, l2size; @@ -133,7 +130,7 @@ void __cpuinit display_cacheinfo(struct cpuinfo_x86 *c) /* in particular, if CPUID levels 0x80000002..4 are supported, this isn't used */ /* Look up CPU names by table lookup. */ -static char __cpuinit *table_lookup_model(struct cpuinfo_x86 *c) +static char __devinit *table_lookup_model(struct cpuinfo_x86 *c) { struct cpu_model_info *info; @@ -154,7 +151,7 @@ static char __cpuinit *table_lookup_model(struct cpuinfo_x86 *c) } -static void __cpuinit get_cpu_vendor(struct cpuinfo_x86 *c, int early) +static void __devinit get_cpu_vendor(struct cpuinfo_x86 *c, int early) { char *v = c->x86_vendor_id; int i; @@ -190,14 +187,6 @@ static int __init x86_fxsr_setup(char * s) __setup("nofxsr", x86_fxsr_setup); -static int __init x86_sep_setup(char * s) -{ - disable_x86_sep = 1; - return 1; -} -__setup("nosep", x86_sep_setup); - - /* Standard macro to see if a specific flag is changeable */ static inline int flag_is_changeable_p(u32 flag) { @@ -221,7 +210,7 @@ static inline int flag_is_changeable_p(u32 flag) /* Probe for the CPUID instruction */ -static int __cpuinit have_cpuid_p(void) +static int __devinit have_cpuid_p(void) { return flag_is_changeable_p(X86_EFLAGS_ID); } @@ -265,10 +254,10 @@ static void __init early_cpu_detect(void) } } -void __cpuinit generic_identify(struct cpuinfo_x86 * c) +void __devinit generic_identify(struct cpuinfo_x86 * c) { u32 tfms, xlvl; - int ebx; + int junk; if (have_cpuid_p()) { /* Get vendor name */ @@ -284,7 +273,7 @@ void __cpuinit generic_identify(struct cpuinfo_x86 * c) /* Intel-defined flags: level 0x00000001 */ if ( c->cpuid_level >= 0x00000001 ) { u32 capability, excap; - cpuid(0x00000001, &tfms, &ebx, &excap, &capability); + cpuid(0x00000001, &tfms, &junk, &excap, &capability); c->x86_capability[0] = capability; c->x86_capability[4] = excap; c->x86 = (tfms >> 8) & 15; @@ -294,11 +283,6 @@ void __cpuinit generic_identify(struct cpuinfo_x86 * c) if (c->x86 >= 0x6) c->x86_model += ((tfms >> 16) & 0xF) << 4; c->x86_mask = tfms & 15; -#ifdef CONFIG_X86_HT - c->apicid = phys_pkg_id((ebx >> 24) & 0xFF, 0); -#else - c->apicid = (ebx >> 24) & 0xFF; -#endif } else { /* Have CPUID level 0 only - unheard of */ c->x86 = 4; @@ -319,11 +303,11 @@ void __cpuinit generic_identify(struct cpuinfo_x86 * c) early_intel_workaround(c); #ifdef CONFIG_X86_HT - c->phys_proc_id = (cpuid_ebx(1) >> 24) & 0xff; + phys_proc_id[smp_processor_id()] = (cpuid_ebx(1) >> 24) & 0xff; #endif } -static void __cpuinit squash_the_stupid_serial_number(struct cpuinfo_x86 *c) +static void __devinit squash_the_stupid_serial_number(struct cpuinfo_x86 *c) { if (cpu_has(c, X86_FEATURE_PN) && disable_x86_serial_nr ) { /* Disable processor serial number */ @@ -351,7 +335,7 @@ __setup("serialnumber", x86_serial_nr_setup); /* * This does the hard work of actually picking apart the CPU stuff... */ -void __cpuinit identify_cpu(struct cpuinfo_x86 *c) +void __devinit identify_cpu(struct cpuinfo_x86 *c) { int i; @@ -421,20 +405,9 @@ void __cpuinit identify_cpu(struct cpuinfo_x86 *c) clear_bit(X86_FEATURE_XMM, c->x86_capability); } - /* SEP disabled? */ - if (disable_x86_sep) - clear_bit(X86_FEATURE_SEP, c->x86_capability); - if (disable_pse) clear_bit(X86_FEATURE_PSE, c->x86_capability); - if (exec_shield != 0) { -#ifdef CONFIG_HIGHMEM64G /* NX implies PAE */ - if (!test_bit(X86_FEATURE_NX, c->x86_capability)) -#endif - clear_bit(X86_FEATURE_SEP, c->x86_capability); - } - /* If the model name is still unset, do table lookup. */ if ( !c->x86_model_id[0] ) { char *p; @@ -444,7 +417,7 @@ void __cpuinit identify_cpu(struct cpuinfo_x86 *c) else /* Last resort... */ sprintf(c->x86_model_id, "%02x/%02x", - c->x86, c->x86_model); + c->x86_vendor, c->x86_model); } /* Now the feature flags better reflect actual CPU features! */ @@ -480,13 +453,16 @@ void __cpuinit identify_cpu(struct cpuinfo_x86 *c) } #ifdef CONFIG_X86_HT -void __cpuinit detect_ht(struct cpuinfo_x86 *c) +void __devinit detect_ht(struct cpuinfo_x86 *c) { u32 eax, ebx, ecx, edx; int index_msb, core_bits; + int cpu = smp_processor_id(); cpuid(1, &eax, &ebx, &ecx, &edx); + c->apicid = phys_pkg_id((ebx >> 24) & 0xFF, 0); + if (!cpu_has(c, X86_FEATURE_HT) || cpu_has(c, X86_FEATURE_CMP_LEGACY)) return; @@ -497,17 +473,16 @@ void __cpuinit detect_ht(struct cpuinfo_x86 *c) } else if (smp_num_siblings > 1 ) { if (smp_num_siblings > NR_CPUS) { - printk(KERN_WARNING "CPU: Unsupported number of the " - "siblings %d", smp_num_siblings); + printk(KERN_WARNING "CPU: Unsupported number of the siblings %d", smp_num_siblings); smp_num_siblings = 1; return; } index_msb = get_count_order(smp_num_siblings); - c->phys_proc_id = phys_pkg_id((ebx >> 24) & 0xFF, index_msb); + phys_proc_id[cpu] = phys_pkg_id((ebx >> 24) & 0xFF, index_msb); printk(KERN_INFO "CPU: Physical Processor ID: %d\n", - c->phys_proc_id); + phys_proc_id[cpu]); smp_num_siblings = smp_num_siblings / c->x86_max_cores; @@ -515,17 +490,17 @@ void __cpuinit detect_ht(struct cpuinfo_x86 *c) core_bits = get_count_order(c->x86_max_cores); - c->cpu_core_id = phys_pkg_id((ebx >> 24) & 0xFF, index_msb) & + cpu_core_id[cpu] = phys_pkg_id((ebx >> 24) & 0xFF, index_msb) & ((1 << core_bits) - 1); if (c->x86_max_cores > 1) printk(KERN_INFO "CPU: Processor Core ID: %d\n", - c->cpu_core_id); + cpu_core_id[cpu]); } } #endif -void __cpuinit print_cpu_info(struct cpuinfo_x86 *c) +void __devinit print_cpu_info(struct cpuinfo_x86 *c) { char *vendor = NULL; @@ -548,7 +523,7 @@ void __cpuinit print_cpu_info(struct cpuinfo_x86 *c) printk("\n"); } -cpumask_t cpu_initialized __cpuinitdata = CPU_MASK_NONE; +cpumask_t cpu_initialized __devinitdata = CPU_MASK_NONE; /* This is hacky. :) * We're emulating future behavior. @@ -595,7 +570,7 @@ void __init early_cpu_init(void) * and IDT. We reload them nevertheless, this function acts as a * 'CPU state barrier', nothing should get across. */ -void __cpuinit cpu_init(void) +void __devinit cpu_init(void) { int cpu = smp_processor_id(); struct tss_struct * t = &per_cpu(init_tss, cpu); @@ -619,12 +594,6 @@ void __cpuinit cpu_init(void) set_in_cr4(X86_CR4_TSD); } - /* The CPU hotplug case */ - if (cpu_gdt_descr->address) { - gdt = (struct desc_struct *)cpu_gdt_descr->address; - memset(gdt, 0, PAGE_SIZE); - goto old_gdt; - } /* * This is a horrible hack to allocate the GDT. The problem * is that cpu_init() is called really early for the boot CPU @@ -643,7 +612,7 @@ void __cpuinit cpu_init(void) local_irq_enable(); } } -old_gdt: + /* * Initialize the per-CPU GDT with the boot GDT, * and set up the GDT descriptor: @@ -701,7 +670,7 @@ old_gdt: } #ifdef CONFIG_HOTPLUG_CPU -void __cpuinit cpu_uninit(void) +void __devinit cpu_uninit(void) { int cpu = raw_smp_processor_id(); cpu_clear(cpu, cpu_initialized); diff --git a/arch/i386/kernel/cpu/cpufreq/Kconfig b/arch/i386/kernel/cpu/cpufreq/Kconfig index ccc1edff5..16f2e356c 100644 --- a/arch/i386/kernel/cpu/cpufreq/Kconfig +++ b/arch/i386/kernel/cpu/cpufreq/Kconfig @@ -115,9 +115,9 @@ config X86_SPEEDSTEP_CENTRINO you also need to say Y to "Use ACPI tables to decode..." below [which might imply enabling ACPI] if you want to use this driver on non-Banias CPUs. - + For details, take a look at . - + If in doubt, say N. config X86_SPEEDSTEP_CENTRINO_ACPI @@ -148,7 +148,7 @@ config X86_SPEEDSTEP_ICH help This adds the CPUFreq driver for certain mobile Intel Pentium III (Coppermine), all mobile Intel Pentium III-M (Tualatin) and all - mobile Intel Pentium 4 P4-M on systems which have an Intel ICH2, + mobile Intel Pentium 4 P4-M on systems which have an Intel ICH2, ICH3 or ICH4 southbridge. For details, take a look at . @@ -161,7 +161,7 @@ config X86_SPEEDSTEP_SMI depends on EXPERIMENTAL help This adds the CPUFreq driver for certain mobile Intel Pentium III - (Coppermine), all mobile Intel Pentium III-M (Tualatin) + (Coppermine), all mobile Intel Pentium III-M (Tualatin) on systems which have an Intel 440BX/ZX/MX southbridge. For details, take a look at . @@ -203,10 +203,10 @@ config X86_LONGRUN config X86_LONGHAUL tristate "VIA Cyrix III Longhaul" select CPU_FREQ_TABLE - depends on ACPI_PROCESSOR + depends on BROKEN help - This adds the CPUFreq driver for VIA Samuel/CyrixIII, - VIA Cyrix Samuel/C3, VIA Cyrix Ezra and VIA Cyrix Ezra-T + This adds the CPUFreq driver for VIA Samuel/CyrixIII, + VIA Cyrix Samuel/C3, VIA Cyrix Ezra and VIA Cyrix Ezra-T processors. For details, take a look at . @@ -216,11 +216,11 @@ config X86_LONGHAUL comment "shared options" config X86_ACPI_CPUFREQ_PROC_INTF - bool "/proc/acpi/processor/../performance interface (deprecated)" + bool "/proc/acpi/processor/../performance interface (deprecated)" depends on PROC_FS depends on X86_ACPI_CPUFREQ || X86_SPEEDSTEP_CENTRINO_ACPI || X86_POWERNOW_K7_ACPI || X86_POWERNOW_K8_ACPI help - This enables the deprecated /proc/acpi/processor/../performance + This enables the deprecated /proc/acpi/processor/../performance interface. While it is helpful for debugging, the generic, cross-architecture cpufreq interfaces should be used. @@ -234,9 +234,9 @@ config X86_SPEEDSTEP_RELAXED_CAP_CHECK bool "Relaxed speedstep capability checks" depends on (X86_SPEEDSTEP_SMI || X86_SPEEDSTEP_ICH) help - Don't perform all checks for a speedstep capable system which would - normally be done. Some ancient or strange systems, though speedstep - capable, don't always indicate that they are speedstep capable. This + Don't perform all checks for a speedstep capable system which would + normally be done. Some ancient or strange systems, though speedstep + capable, don't always indicate that they are speedstep capable. This option lets the probing code bypass some of those checks if the parameter "relaxed_check=1" is passed to the module. diff --git a/arch/i386/kernel/cpu/cpufreq/acpi-cpufreq.c b/arch/i386/kernel/cpu/cpufreq/acpi-cpufreq.c index ec0c5c24a..3852d0a4c 100644 --- a/arch/i386/kernel/cpu/cpufreq/acpi-cpufreq.c +++ b/arch/i386/kernel/cpu/cpufreq/acpi-cpufreq.c @@ -24,6 +24,7 @@ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ +#include #include #include #include @@ -47,13 +48,12 @@ MODULE_LICENSE("GPL"); struct cpufreq_acpi_io { - struct acpi_processor_performance *acpi_data; + struct acpi_processor_performance acpi_data; struct cpufreq_frequency_table *freq_table; unsigned int resume; }; static struct cpufreq_acpi_io *acpi_io_data[NR_CPUS]; -static struct acpi_processor_performance *acpi_perf_data[NR_CPUS]; static struct cpufreq_driver acpi_cpufreq_driver; @@ -104,43 +104,64 @@ acpi_processor_set_performance ( { u16 port = 0; u8 bit_width = 0; - int i = 0; int ret = 0; u32 value = 0; + int i = 0; + struct cpufreq_freqs cpufreq_freqs; + cpumask_t saved_mask; int retval; - struct acpi_processor_performance *perf; dprintk("acpi_processor_set_performance\n"); - retval = 0; - perf = data->acpi_data; - if (state == perf->state) { + /* + * TBD: Use something other than set_cpus_allowed. + * As set_cpus_allowed is a bit racy, + * with any other set_cpus_allowed for this process. + */ + saved_mask = current->cpus_allowed; + set_cpus_allowed(current, cpumask_of_cpu(cpu)); + if (smp_processor_id() != cpu) { + return (-EAGAIN); + } + + if (state == data->acpi_data.state) { if (unlikely(data->resume)) { dprintk("Called after resume, resetting to P%d\n", state); data->resume = 0; } else { dprintk("Already at target state (P%d)\n", state); - return (retval); + retval = 0; + goto migrate_end; } } - dprintk("Transitioning from P%d to P%d\n", perf->state, state); + dprintk("Transitioning from P%d to P%d\n", + data->acpi_data.state, state); + + /* cpufreq frequency struct */ + cpufreq_freqs.cpu = cpu; + cpufreq_freqs.old = data->freq_table[data->acpi_data.state].frequency; + cpufreq_freqs.new = data->freq_table[state].frequency; + + /* notify cpufreq */ + cpufreq_notify_transition(&cpufreq_freqs, CPUFREQ_PRECHANGE); /* * First we write the target state's 'control' value to the * control_register. */ - port = perf->control_register.address; - bit_width = perf->control_register.bit_width; - value = (u32) perf->states[state].control; + port = data->acpi_data.control_register.address; + bit_width = data->acpi_data.control_register.bit_width; + value = (u32) data->acpi_data.states[state].control; dprintk("Writing 0x%08x to port 0x%04x\n", value, port); ret = acpi_processor_write_port(port, bit_width, value); if (ret) { dprintk("Invalid port width 0x%04x\n", bit_width); - return (ret); + retval = ret; + goto migrate_end; } /* @@ -156,35 +177,49 @@ acpi_processor_set_performance ( * before giving up. */ - port = perf->status_register.address; - bit_width = perf->status_register.bit_width; + port = data->acpi_data.status_register.address; + bit_width = data->acpi_data.status_register.bit_width; dprintk("Looking for 0x%08x from port 0x%04x\n", - (u32) perf->states[state].status, port); + (u32) data->acpi_data.states[state].status, port); - for (i = 0; i < 100; i++) { + for (i=0; i<100; i++) { ret = acpi_processor_read_port(port, bit_width, &value); if (ret) { dprintk("Invalid port width 0x%04x\n", bit_width); - return (ret); + retval = ret; + goto migrate_end; } - if (value == (u32) perf->states[state].status) + if (value == (u32) data->acpi_data.states[state].status) break; udelay(10); } } else { - value = (u32) perf->states[state].status; + i = 0; + value = (u32) data->acpi_data.states[state].status; } - if (unlikely(value != (u32) perf->states[state].status)) { + /* notify cpufreq */ + cpufreq_notify_transition(&cpufreq_freqs, CPUFREQ_POSTCHANGE); + + if (unlikely(value != (u32) data->acpi_data.states[state].status)) { + unsigned int tmp = cpufreq_freqs.new; + cpufreq_freqs.new = cpufreq_freqs.old; + cpufreq_freqs.old = tmp; + cpufreq_notify_transition(&cpufreq_freqs, CPUFREQ_PRECHANGE); + cpufreq_notify_transition(&cpufreq_freqs, CPUFREQ_POSTCHANGE); printk(KERN_WARNING "acpi-cpufreq: Transition failed\n"); retval = -ENODEV; - return (retval); + goto migrate_end; } dprintk("Transition successful after %d microseconds\n", i * 10); - perf->state = state; + data->acpi_data.state = state; + + retval = 0; +migrate_end: + set_cpus_allowed(current, saved_mask); return (retval); } @@ -196,17 +231,8 @@ acpi_cpufreq_target ( unsigned int relation) { struct cpufreq_acpi_io *data = acpi_io_data[policy->cpu]; - struct acpi_processor_performance *perf; - struct cpufreq_freqs freqs; - cpumask_t online_policy_cpus; - cpumask_t saved_mask; - cpumask_t set_mask; - cpumask_t covered_cpus; - unsigned int cur_state = 0; unsigned int next_state = 0; unsigned int result = 0; - unsigned int j; - unsigned int tmp; dprintk("acpi_cpufreq_setpolicy\n"); @@ -215,95 +241,11 @@ acpi_cpufreq_target ( target_freq, relation, &next_state); - if (unlikely(result)) + if (result) return (result); - perf = data->acpi_data; - cur_state = perf->state; - freqs.old = data->freq_table[cur_state].frequency; - freqs.new = data->freq_table[next_state].frequency; - -#ifdef CONFIG_HOTPLUG_CPU - /* cpufreq holds the hotplug lock, so we are safe from here on */ - cpus_and(online_policy_cpus, cpu_online_map, policy->cpus); -#else - online_policy_cpus = policy->cpus; -#endif - - for_each_cpu_mask(j, online_policy_cpus) { - freqs.cpu = j; - cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE); - } - - /* - * We need to call driver->target() on all or any CPU in - * policy->cpus, depending on policy->shared_type. - */ - saved_mask = current->cpus_allowed; - cpus_clear(covered_cpus); - for_each_cpu_mask(j, online_policy_cpus) { - /* - * Support for SMP systems. - * Make sure we are running on CPU that wants to change freq - */ - cpus_clear(set_mask); - if (policy->shared_type == CPUFREQ_SHARED_TYPE_ANY) - cpus_or(set_mask, set_mask, online_policy_cpus); - else - cpu_set(j, set_mask); - - set_cpus_allowed(current, set_mask); - if (unlikely(!cpu_isset(smp_processor_id(), set_mask))) { - dprintk("couldn't limit to CPUs in this domain\n"); - result = -EAGAIN; - break; - } - - result = acpi_processor_set_performance (data, j, next_state); - if (result) { - result = -EAGAIN; - break; - } - - if (policy->shared_type == CPUFREQ_SHARED_TYPE_ANY) - break; - - cpu_set(j, covered_cpus); - } - - for_each_cpu_mask(j, online_policy_cpus) { - freqs.cpu = j; - cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE); - } - - if (unlikely(result)) { - /* - * We have failed halfway through the frequency change. - * We have sent callbacks to online_policy_cpus and - * acpi_processor_set_performance() has been called on - * coverd_cpus. Best effort undo.. - */ + result = acpi_processor_set_performance (data, policy->cpu, next_state); - if (!cpus_empty(covered_cpus)) { - for_each_cpu_mask(j, covered_cpus) { - policy->cpu = j; - acpi_processor_set_performance (data, - j, - cur_state); - } - } - - tmp = freqs.new; - freqs.new = freqs.old; - freqs.old = tmp; - for_each_cpu_mask(j, online_policy_cpus) { - freqs.cpu = j; - cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE); - cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE); - } - } - - set_cpus_allowed(current, saved_mask); return (result); } @@ -329,64 +271,30 @@ acpi_cpufreq_guess_freq ( struct cpufreq_acpi_io *data, unsigned int cpu) { - struct acpi_processor_performance *perf = data->acpi_data; - if (cpu_khz) { /* search the closest match to cpu_khz */ unsigned int i; unsigned long freq; - unsigned long freqn = perf->states[0].core_frequency * 1000; + unsigned long freqn = data->acpi_data.states[0].core_frequency * 1000; - for (i = 0; i < (perf->state_count - 1); i++) { + for (i=0; i < (data->acpi_data.state_count - 1); i++) { freq = freqn; - freqn = perf->states[i+1].core_frequency * 1000; + freqn = data->acpi_data.states[i+1].core_frequency * 1000; if ((2 * cpu_khz) > (freqn + freq)) { - perf->state = i; + data->acpi_data.state = i; return (freq); } } - perf->state = perf->state_count - 1; + data->acpi_data.state = data->acpi_data.state_count - 1; return (freqn); - } else { + } else /* assume CPU is at P0... */ - perf->state = 0; - return perf->states[0].core_frequency * 1000; - } + data->acpi_data.state = 0; + return data->acpi_data.states[0].core_frequency * 1000; + } -/* - * acpi_cpufreq_early_init - initialize ACPI P-States library - * - * Initialize the ACPI P-States library (drivers/acpi/processor_perflib.c) - * in order to determine correct frequency and voltage pairings. We can - * do _PDC and _PSD and find out the processor dependency for the - * actual init that will happen later... - */ -static int acpi_cpufreq_early_init_acpi(void) -{ - struct acpi_processor_performance *data; - unsigned int i, j; - - dprintk("acpi_cpufreq_early_init\n"); - - for_each_possible_cpu(i) { - data = kzalloc(sizeof(struct acpi_processor_performance), - GFP_KERNEL); - if (!data) { - for_each_possible_cpu(j) { - kfree(acpi_perf_data[j]); - acpi_perf_data[j] = NULL; - } - return (-ENOMEM); - } - acpi_perf_data[i] = data; - } - - /* Do initialization in ACPI core */ - return acpi_processor_preregister_performance(acpi_perf_data); -} - static int acpi_cpufreq_cpu_init ( struct cpufreq_policy *policy) @@ -396,57 +304,41 @@ acpi_cpufreq_cpu_init ( struct cpufreq_acpi_io *data; unsigned int result = 0; struct cpuinfo_x86 *c = &cpu_data[policy->cpu]; - struct acpi_processor_performance *perf; dprintk("acpi_cpufreq_cpu_init\n"); - if (!acpi_perf_data[cpu]) - return (-ENODEV); - data = kzalloc(sizeof(struct cpufreq_acpi_io), GFP_KERNEL); if (!data) return (-ENOMEM); - data->acpi_data = acpi_perf_data[cpu]; acpi_io_data[cpu] = data; - result = acpi_processor_register_performance(data->acpi_data, cpu); + result = acpi_processor_register_performance(&data->acpi_data, cpu); if (result) goto err_free; - perf = data->acpi_data; - policy->shared_type = perf->shared_type; - /* - * Will let policy->cpus know about dependency only when software - * coordination is required. - */ - if (policy->shared_type == CPUFREQ_SHARED_TYPE_ALL || - policy->shared_type == CPUFREQ_SHARED_TYPE_ANY) - policy->cpus = perf->shared_cpu_map; - if (cpu_has(c, X86_FEATURE_CONSTANT_TSC)) { acpi_cpufreq_driver.flags |= CPUFREQ_CONST_LOOPS; } /* capability check */ - if (perf->state_count <= 1) { + if (data->acpi_data.state_count <= 1) { dprintk("No P-States\n"); result = -ENODEV; goto err_unreg; } - - if ((perf->control_register.space_id != ACPI_ADR_SPACE_SYSTEM_IO) || - (perf->status_register.space_id != ACPI_ADR_SPACE_SYSTEM_IO)) { + if ((data->acpi_data.control_register.space_id != ACPI_ADR_SPACE_SYSTEM_IO) || + (data->acpi_data.status_register.space_id != ACPI_ADR_SPACE_SYSTEM_IO)) { dprintk("Unsupported address space [%d, %d]\n", - (u32) (perf->control_register.space_id), - (u32) (perf->status_register.space_id)); + (u32) (data->acpi_data.control_register.space_id), + (u32) (data->acpi_data.status_register.space_id)); result = -ENODEV; goto err_unreg; } /* alloc freq_table */ - data->freq_table = kmalloc(sizeof(struct cpufreq_frequency_table) * (perf->state_count + 1), GFP_KERNEL); + data->freq_table = kmalloc(sizeof(struct cpufreq_frequency_table) * (data->acpi_data.state_count + 1), GFP_KERNEL); if (!data->freq_table) { result = -ENOMEM; goto err_unreg; @@ -454,9 +346,9 @@ acpi_cpufreq_cpu_init ( /* detect transition latency */ policy->cpuinfo.transition_latency = 0; - for (i=0; istate_count; i++) { - if ((perf->states[i].transition_latency * 1000) > policy->cpuinfo.transition_latency) - policy->cpuinfo.transition_latency = perf->states[i].transition_latency * 1000; + for (i=0; iacpi_data.state_count; i++) { + if ((data->acpi_data.states[i].transition_latency * 1000) > policy->cpuinfo.transition_latency) + policy->cpuinfo.transition_latency = data->acpi_data.states[i].transition_latency * 1000; } policy->governor = CPUFREQ_DEFAULT_GOVERNOR; @@ -464,11 +356,11 @@ acpi_cpufreq_cpu_init ( policy->cur = acpi_cpufreq_guess_freq(data, policy->cpu); /* table init */ - for (i=0; i<=perf->state_count; i++) + for (i=0; i<=data->acpi_data.state_count; i++) { data->freq_table[i].index = i; - if (istate_count) - data->freq_table[i].frequency = perf->states[i].core_frequency * 1000; + if (iacpi_data.state_count) + data->freq_table[i].frequency = data->acpi_data.states[i].core_frequency * 1000; else data->freq_table[i].frequency = CPUFREQ_TABLE_END; } @@ -483,12 +375,12 @@ acpi_cpufreq_cpu_init ( printk(KERN_INFO "acpi-cpufreq: CPU%u - ACPI performance management activated.\n", cpu); - for (i = 0; i < perf->state_count; i++) + for (i = 0; i < data->acpi_data.state_count; i++) dprintk(" %cP%d: %d MHz, %d mW, %d uS\n", - (i == perf->state?'*':' '), i, - (u32) perf->states[i].core_frequency, - (u32) perf->states[i].power, - (u32) perf->states[i].transition_latency); + (i == data->acpi_data.state?'*':' '), i, + (u32) data->acpi_data.states[i].core_frequency, + (u32) data->acpi_data.states[i].power, + (u32) data->acpi_data.states[i].transition_latency); cpufreq_frequency_table_get_attr(data->freq_table, policy->cpu); @@ -503,7 +395,7 @@ acpi_cpufreq_cpu_init ( err_freqfree: kfree(data->freq_table); err_unreg: - acpi_processor_unregister_performance(perf, cpu); + acpi_processor_unregister_performance(&data->acpi_data, cpu); err_free: kfree(data); acpi_io_data[cpu] = NULL; @@ -524,7 +416,7 @@ acpi_cpufreq_cpu_exit ( if (data) { cpufreq_frequency_table_put_attr(policy->cpu); acpi_io_data[policy->cpu] = NULL; - acpi_processor_unregister_performance(data->acpi_data, policy->cpu); + acpi_processor_unregister_performance(&data->acpi_data, policy->cpu); kfree(data); } @@ -552,40 +444,37 @@ static struct freq_attr* acpi_cpufreq_attr[] = { }; static struct cpufreq_driver acpi_cpufreq_driver = { - .verify = acpi_cpufreq_verify, - .target = acpi_cpufreq_target, - .init = acpi_cpufreq_cpu_init, - .exit = acpi_cpufreq_cpu_exit, - .resume = acpi_cpufreq_resume, - .name = "acpi-cpufreq", - .owner = THIS_MODULE, - .attr = acpi_cpufreq_attr, + .verify = acpi_cpufreq_verify, + .target = acpi_cpufreq_target, + .init = acpi_cpufreq_cpu_init, + .exit = acpi_cpufreq_cpu_exit, + .resume = acpi_cpufreq_resume, + .name = "acpi-cpufreq", + .owner = THIS_MODULE, + .attr = acpi_cpufreq_attr, }; static int __init acpi_cpufreq_init (void) { - dprintk("acpi_cpufreq_init\n"); + int result = 0; - acpi_cpufreq_early_init_acpi(); + dprintk("acpi_cpufreq_init\n"); - return cpufreq_register_driver(&acpi_cpufreq_driver); + result = cpufreq_register_driver(&acpi_cpufreq_driver); + + return (result); } static void __exit acpi_cpufreq_exit (void) { - unsigned int i; dprintk("acpi_cpufreq_exit\n"); cpufreq_unregister_driver(&acpi_cpufreq_driver); - for_each_possible_cpu(i) { - kfree(acpi_perf_data[i]); - acpi_perf_data[i] = NULL; - } return; } diff --git a/arch/i386/kernel/cpu/cpufreq/cpufreq-nforce2.c b/arch/i386/kernel/cpu/cpufreq/cpufreq-nforce2.c index 0d49d73d1..2b62dee35 100644 --- a/arch/i386/kernel/cpu/cpufreq/cpufreq-nforce2.c +++ b/arch/i386/kernel/cpu/cpufreq/cpufreq-nforce2.c @@ -1,5 +1,5 @@ /* - * (C) 2004-2006 Sebastian Witt + * (C) 2004 Sebastian Witt * * Licensed under the terms of the GNU GPL License version 2. * Based upon reverse engineered information @@ -39,7 +39,7 @@ static struct pci_dev *nforce2_chipset_dev; static int fid = 0; /* min_fsb, max_fsb: - * minimum and maximum FSB (= FSB at boot time) + * minimum and maximum FSB (= FSB at boot time) */ static int min_fsb = 0; static int max_fsb = 0; @@ -57,10 +57,10 @@ MODULE_PARM_DESC(min_fsb, #define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_DRIVER, "cpufreq-nforce2", msg) -/** +/* * nforce2_calc_fsb - calculate FSB * @pll: PLL value - * + * * Calculates FSB from PLL value */ static int nforce2_calc_fsb(int pll) @@ -76,10 +76,10 @@ static int nforce2_calc_fsb(int pll) return 0; } -/** +/* * nforce2_calc_pll - calculate PLL value * @fsb: FSB - * + * * Calculate PLL value for given FSB */ static int nforce2_calc_pll(unsigned int fsb) @@ -90,7 +90,7 @@ static int nforce2_calc_pll(unsigned int fsb) /* Try to calculate multiplier and divider up to 4 times */ while (((mul == 0) || (div == 0)) && (tried <= 3)) { - for (xdiv = 2; xdiv <= 0x80; xdiv++) + for (xdiv = 1; xdiv <= 0x80; xdiv++) for (xmul = 1; xmul <= 0xfe; xmul++) if (nforce2_calc_fsb(NFORCE2_PLL(xmul, xdiv)) == fsb + tried) { @@ -106,10 +106,10 @@ static int nforce2_calc_pll(unsigned int fsb) return NFORCE2_PLL(mul, div); } -/** +/* * nforce2_write_pll - write PLL value to chipset * @pll: PLL value - * + * * Writes new FSB PLL value to chipset */ static void nforce2_write_pll(int pll) @@ -117,16 +117,19 @@ static void nforce2_write_pll(int pll) int temp; /* Set the pll addr. to 0x00 */ - pci_write_config_dword(nforce2_chipset_dev, NFORCE2_PLLADR, 0); + temp = 0x00; + pci_write_config_dword(nforce2_chipset_dev, NFORCE2_PLLADR, temp); /* Now write the value in all 64 registers */ - for (temp = 0; temp <= 0x3f; temp++) - pci_write_config_dword(nforce2_chipset_dev, NFORCE2_PLLREG, pll); + for (temp = 0; temp <= 0x3f; temp++) { + pci_write_config_dword(nforce2_chipset_dev, + NFORCE2_PLLREG, pll); + } return; } -/** +/* * nforce2_fsb_read - Read FSB * * Read FSB from chipset @@ -137,32 +140,39 @@ static unsigned int nforce2_fsb_read(int bootfsb) struct pci_dev *nforce2_sub5; u32 fsb, temp = 0; + /* Get chipset boot FSB from subdevice 5 (FSB at boot-time) */ nforce2_sub5 = pci_get_subsys(PCI_VENDOR_ID_NVIDIA, - 0x01EF,PCI_ANY_ID,PCI_ANY_ID,NULL); + 0x01EF, + PCI_ANY_ID, + PCI_ANY_ID, + NULL); + if (!nforce2_sub5) return 0; pci_read_config_dword(nforce2_sub5, NFORCE2_BOOTFSB, &fsb); fsb /= 1000000; - + /* Check if PLL register is already set */ - pci_read_config_byte(nforce2_chipset_dev,NFORCE2_PLLENABLE, (u8 *)&temp); - + pci_read_config_byte(nforce2_chipset_dev, + NFORCE2_PLLENABLE, (u8 *)&temp); + if(bootfsb || !temp) return fsb; /* Use PLL register FSB value */ - pci_read_config_dword(nforce2_chipset_dev,NFORCE2_PLLREG, &temp); + pci_read_config_dword(nforce2_chipset_dev, + NFORCE2_PLLREG, &temp); fsb = nforce2_calc_fsb(temp); return fsb; } -/** +/* * nforce2_set_fsb - set new FSB * @fsb: New FSB - * + * * Sets new FSB */ static int nforce2_set_fsb(unsigned int fsb) @@ -176,7 +186,7 @@ static int nforce2_set_fsb(unsigned int fsb) printk(KERN_ERR "cpufreq: FSB %d is out of range!\n", fsb); return -EINVAL; } - + tfsb = nforce2_fsb_read(0); if (!tfsb) { printk(KERN_ERR "cpufreq: Error while reading the FSB\n"); @@ -184,7 +194,8 @@ static int nforce2_set_fsb(unsigned int fsb) } /* First write? Then set actual value */ - pci_read_config_byte(nforce2_chipset_dev,NFORCE2_PLLENABLE, (u8 *)&temp); + pci_read_config_byte(nforce2_chipset_dev, + NFORCE2_PLLENABLE, (u8 *)&temp); if (!temp) { pll = nforce2_calc_pll(tfsb); @@ -212,7 +223,7 @@ static int nforce2_set_fsb(unsigned int fsb) /* Calculate the PLL reg. value */ if ((pll = nforce2_calc_pll(tfsb)) == -1) return -EINVAL; - + nforce2_write_pll(pll); #ifdef NFORCE2_DELAY mdelay(NFORCE2_DELAY); @@ -228,7 +239,7 @@ static int nforce2_set_fsb(unsigned int fsb) /** * nforce2_get - get the CPU frequency * @cpu: CPU number - * + * * Returns the CPU frequency */ static unsigned int nforce2_get(unsigned int cpu) @@ -265,7 +276,7 @@ static int nforce2_target(struct cpufreq_policy *policy, if (freqs.old == freqs.new) return 0; - dprintk("Old CPU frequency %d kHz, new %d kHz\n", + dprintk(KERN_INFO "cpufreq: Old CPU frequency %d kHz, new %d kHz\n", freqs.old, freqs.new); cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE); @@ -277,7 +288,7 @@ static int nforce2_target(struct cpufreq_policy *policy, printk(KERN_ERR "cpufreq: Changing FSB to %d failed\n", target_fsb); else - dprintk("Changed FSB successfully to %d\n", + dprintk(KERN_INFO "cpufreq: Changed FSB successfully to %d\n", target_fsb); /* Enable IRQs */ @@ -343,10 +354,10 @@ static int nforce2_cpu_init(struct cpufreq_policy *policy) printk(KERN_INFO "cpufreq: FSB currently at %i MHz, FID %d.%d\n", fsb, fid / 10, fid % 10); - + /* Set maximum FSB to FSB at boot time */ max_fsb = nforce2_fsb_read(1); - + if(!max_fsb) return -EIO; @@ -387,15 +398,17 @@ static struct cpufreq_driver nforce2_driver = { * nforce2_detect_chipset - detect the Southbridge which contains FSB PLL logic * * Detects nForce2 A2 and C1 stepping - * + * */ static unsigned int nforce2_detect_chipset(void) { u8 revision; nforce2_chipset_dev = pci_get_subsys(PCI_VENDOR_ID_NVIDIA, - PCI_DEVICE_ID_NVIDIA_NFORCE2, - PCI_ANY_ID, PCI_ANY_ID, NULL); + PCI_DEVICE_ID_NVIDIA_NFORCE2, + PCI_ANY_ID, + PCI_ANY_ID, + NULL); if (nforce2_chipset_dev == NULL) return -ENODEV; diff --git a/arch/i386/kernel/cpu/cpufreq/elanfreq.c b/arch/i386/kernel/cpu/cpufreq/elanfreq.c index f317276af..3f7caa4ae 100644 --- a/arch/i386/kernel/cpu/cpufreq/elanfreq.c +++ b/arch/i386/kernel/cpu/cpufreq/elanfreq.c @@ -1,16 +1,16 @@ /* - * elanfreq: cpufreq driver for the AMD ELAN family + * elanfreq: cpufreq driver for the AMD ELAN family * * (c) Copyright 2002 Robert Schwebel * - * Parts of this code are (c) Sven Geggus + * Parts of this code are (c) Sven Geggus * - * All Rights Reserved. + * 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. + * 2 of the License, or (at your option) any later version. * * 2002-02-13: - initial revision for 2.4.18-pre9 by Robert Schwebel * @@ -28,7 +28,7 @@ #include #include -#define REG_CSCIR 0x22 /* Chip Setup and Control Index Register */ +#define REG_CSCIR 0x22 /* Chip Setup and Control Index Register */ #define REG_CSCDR 0x23 /* Chip Setup and Control Data Register */ /* Module parameter */ @@ -41,7 +41,7 @@ struct s_elan_multiplier { }; /* - * It is important that the frequencies + * It is important that the frequencies * are listed in ascending order here! */ struct s_elan_multiplier elan_multiplier[] = { @@ -72,79 +72,78 @@ static struct cpufreq_frequency_table elanfreq_table[] = { * elanfreq_get_cpu_frequency: determine current cpu speed * * Finds out at which frequency the CPU of the Elan SOC runs - * at the moment. Frequencies from 1 to 33 MHz are generated + * at the moment. Frequencies from 1 to 33 MHz are generated * the normal way, 66 and 99 MHz are called "Hyperspeed Mode" - * and have the rest of the chip running with 33 MHz. + * and have the rest of the chip running with 33 MHz. */ static unsigned int elanfreq_get_cpu_frequency(unsigned int cpu) { - u8 clockspeed_reg; /* Clock Speed Register */ - + u8 clockspeed_reg; /* Clock Speed Register */ + local_irq_disable(); - outb_p(0x80,REG_CSCIR); - clockspeed_reg = inb_p(REG_CSCDR); + outb_p(0x80,REG_CSCIR); + clockspeed_reg = inb_p(REG_CSCDR); local_irq_enable(); - if ((clockspeed_reg & 0xE0) == 0xE0) - return 0; + if ((clockspeed_reg & 0xE0) == 0xE0) { return 0; } - /* Are we in CPU clock multiplied mode (66/99 MHz)? */ - if ((clockspeed_reg & 0xE0) == 0xC0) { - if ((clockspeed_reg & 0x01) == 0) + /* Are we in CPU clock multiplied mode (66/99 MHz)? */ + if ((clockspeed_reg & 0xE0) == 0xC0) { + if ((clockspeed_reg & 0x01) == 0) { return 66000; - else - return 99000; - } + } else { + return 99000; + } + } /* 33 MHz is not 32 MHz... */ if ((clockspeed_reg & 0xE0)==0xA0) return 33000; - return ((1<<((clockspeed_reg & 0xE0) >> 5)) * 1000); + return ((1<<((clockspeed_reg & 0xE0) >> 5)) * 1000); } /** - * elanfreq_set_cpu_frequency: Change the CPU core frequency - * @cpu: cpu number + * elanfreq_set_cpu_frequency: Change the CPU core frequency + * @cpu: cpu number * @freq: frequency in kHz * - * This function takes a frequency value and changes the CPU frequency + * This function takes a frequency value and changes the CPU frequency * according to this. Note that the frequency has to be checked by * elanfreq_validatespeed() for correctness! - * - * There is no return value. + * + * There is no return value. */ -static void elanfreq_set_cpu_state (unsigned int state) -{ +static void elanfreq_set_cpu_state (unsigned int state) { + struct cpufreq_freqs freqs; freqs.old = elanfreq_get_cpu_frequency(0); freqs.new = elan_multiplier[state].clock; freqs.cpu = 0; /* elanfreq.c is UP only driver */ - + cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE); - printk(KERN_INFO "elanfreq: attempting to set frequency to %i kHz\n", - elan_multiplier[state].clock); + printk(KERN_INFO "elanfreq: attempting to set frequency to %i kHz\n",elan_multiplier[state].clock); - /* - * Access to the Elan's internal registers is indexed via - * 0x22: Chip Setup & Control Register Index Register (CSCI) - * 0x23: Chip Setup & Control Register Data Register (CSCD) + /* + * Access to the Elan's internal registers is indexed via + * 0x22: Chip Setup & Control Register Index Register (CSCI) + * 0x23: Chip Setup & Control Register Data Register (CSCD) * */ - /* - * 0x40 is the Power Management Unit's Force Mode Register. + /* + * 0x40 is the Power Management Unit's Force Mode Register. * Bit 6 enables Hyperspeed Mode (66/100 MHz core frequency) */ local_irq_disable(); - outb_p(0x40,REG_CSCIR); /* Disable hyperspeed mode */ + outb_p(0x40,REG_CSCIR); /* Disable hyperspeed mode */ outb_p(0x00,REG_CSCDR); local_irq_enable(); /* wait till internal pipelines and */ udelay(1000); /* buffers have cleaned up */ @@ -167,10 +166,10 @@ static void elanfreq_set_cpu_state (unsigned int state) /** * elanfreq_validatespeed: test if frequency range is valid - * @policy: the policy to validate + * @policy: the policy to validate * - * This function checks if a given frequency range in kHz is valid - * for the hardware supported by the driver. + * This function checks if a given frequency range in kHz is valid + * for the hardware supported by the driver. */ static int elanfreq_verify (struct cpufreq_policy *policy) @@ -178,11 +177,11 @@ static int elanfreq_verify (struct cpufreq_policy *policy) return cpufreq_frequency_table_verify(policy, &elanfreq_table[0]); } -static int elanfreq_target (struct cpufreq_policy *policy, - unsigned int target_freq, +static int elanfreq_target (struct cpufreq_policy *policy, + unsigned int target_freq, unsigned int relation) { - unsigned int newstate = 0; + unsigned int newstate = 0; if (cpufreq_frequency_table_target(policy, &elanfreq_table[0], target_freq, relation, &newstate)) return -EINVAL; @@ -213,7 +212,7 @@ static int elanfreq_cpu_init(struct cpufreq_policy *policy) max_freq = elanfreq_get_cpu_frequency(0); /* table init */ - for (i=0; (elanfreq_table[i].frequency != CPUFREQ_TABLE_END); i++) { + for (i=0; (elanfreq_table[i].frequency != CPUFREQ_TABLE_END); i++) { if (elanfreq_table[i].frequency > max_freq) elanfreq_table[i].frequency = CPUFREQ_ENTRY_INVALID; } @@ -227,7 +226,8 @@ static int elanfreq_cpu_init(struct cpufreq_policy *policy) if (result) return (result); - cpufreq_frequency_table_get_attr(elanfreq_table, policy->cpu); + cpufreq_frequency_table_get_attr(elanfreq_table, policy->cpu); + return 0; } @@ -268,9 +268,9 @@ static struct freq_attr* elanfreq_attr[] = { static struct cpufreq_driver elanfreq_driver = { - .get = elanfreq_get_cpu_frequency, - .verify = elanfreq_verify, - .target = elanfreq_target, + .get = elanfreq_get_cpu_frequency, + .verify = elanfreq_verify, + .target = elanfreq_target, .init = elanfreq_cpu_init, .exit = elanfreq_cpu_exit, .name = "elanfreq", @@ -279,21 +279,23 @@ static struct cpufreq_driver elanfreq_driver = { }; -static int __init elanfreq_init(void) -{ +static int __init elanfreq_init(void) +{ struct cpuinfo_x86 *c = cpu_data; /* Test if we have the right hardware */ if ((c->x86_vendor != X86_VENDOR_AMD) || - (c->x86 != 4) || (c->x86_model!=10)) { + (c->x86 != 4) || (c->x86_model!=10)) + { printk(KERN_INFO "elanfreq: error: no Elan processor found!\n"); return -ENODEV; } + return cpufreq_register_driver(&elanfreq_driver); } -static void __exit elanfreq_exit(void) +static void __exit elanfreq_exit(void) { cpufreq_unregister_driver(&elanfreq_driver); } @@ -307,3 +309,4 @@ MODULE_DESCRIPTION("cpufreq driver for AMD's Elan CPUs"); module_init(elanfreq_init); module_exit(elanfreq_exit); + diff --git a/arch/i386/kernel/cpu/cpufreq/gx-suspmod.c b/arch/i386/kernel/cpu/cpufreq/gx-suspmod.c index 92afa3bc8..e86ea486c 100644 --- a/arch/i386/kernel/cpu/cpufreq/gx-suspmod.c +++ b/arch/i386/kernel/cpu/cpufreq/gx-suspmod.c @@ -6,12 +6,12 @@ * * 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 * * The author(s) of this software shall not be held liable for damages * of any nature resulting due to the use of this software. This * software is provided AS-IS with no warranties. - * + * * Theoritical note: * * (see Geode(tm) CS5530 manual (rev.4.1) page.56) @@ -21,18 +21,18 @@ * * Suspend Modulation works by asserting and de-asserting the SUSP# pin * to CPU(GX1/GXLV) for configurable durations. When asserting SUSP# - * the CPU enters an idle state. GX1 stops its core clock when SUSP# is + * the CPU enters an idle state. GX1 stops its core clock when SUSP# is * asserted then power consumption is reduced. * - * Suspend Modulation's OFF/ON duration are configurable + * Suspend Modulation's OFF/ON duration are configurable * with 'Suspend Modulation OFF Count Register' * and 'Suspend Modulation ON Count Register'. - * These registers are 8bit counters that represent the number of + * These registers are 8bit counters that represent the number of * 32us intervals which the SUSP# pin is asserted(ON)/de-asserted(OFF) * to the processor. * - * These counters define a ratio which is the effective frequency - * of operation of the system. + * These counters define a ratio which is the effective frequency + * of operation of the system. * * OFF Count * F_eff = Fgx * ---------------------- @@ -40,24 +40,24 @@ * * 0 <= On Count, Off Count <= 255 * - * From these limits, we can get register values + * From these limits, we can get register values * * off_duration + on_duration <= MAX_DURATION * on_duration = off_duration * (stock_freq - freq) / freq * - * off_duration = (freq * DURATION) / stock_freq - * on_duration = DURATION - off_duration + * off_duration = (freq * DURATION) / stock_freq + * on_duration = DURATION - off_duration * * *--------------------------------------------------------------------------- * * ChangeLog: - * Dec. 12, 2003 Hiroshi Miura - * - fix on/off register mistake - * - fix cpu_khz calc when it stops cpu modulation. + * Dec. 12, 2003 Hiroshi Miura + * - fix on/off register mistake + * - fix cpu_khz calc when it stops cpu modulation. * - * Dec. 11, 2002 Hiroshi Miura - * - rewrite for Cyrix MediaGX Cx5510/5520 and + * Dec. 11, 2002 Hiroshi Miura + * - rewrite for Cyrix MediaGX Cx5510/5520 and * NatSemi Geode Cs5530(A). * * Jul. ??, 2002 Zwane Mwaikambo @@ -74,40 +74,40 @@ ************************************************************************/ #include -#include +#include #include #include #include #include -#include +#include #include /* PCI config registers, all at F0 */ -#define PCI_PMER1 0x80 /* power management enable register 1 */ -#define PCI_PMER2 0x81 /* power management enable register 2 */ -#define PCI_PMER3 0x82 /* power management enable register 3 */ -#define PCI_IRQTC 0x8c /* irq speedup timer counter register:typical 2 to 4ms */ -#define PCI_VIDTC 0x8d /* video speedup timer counter register: typical 50 to 100ms */ -#define PCI_MODOFF 0x94 /* suspend modulation OFF counter register, 1 = 32us */ -#define PCI_MODON 0x95 /* suspend modulation ON counter register */ -#define PCI_SUSCFG 0x96 /* suspend configuration register */ +#define PCI_PMER1 0x80 /* power management enable register 1 */ +#define PCI_PMER2 0x81 /* power management enable register 2 */ +#define PCI_PMER3 0x82 /* power management enable register 3 */ +#define PCI_IRQTC 0x8c /* irq speedup timer counter register:typical 2 to 4ms */ +#define PCI_VIDTC 0x8d /* video speedup timer counter register: typical 50 to 100ms */ +#define PCI_MODOFF 0x94 /* suspend modulation OFF counter register, 1 = 32us */ +#define PCI_MODON 0x95 /* suspend modulation ON counter register */ +#define PCI_SUSCFG 0x96 /* suspend configuration register */ /* PMER1 bits */ -#define GPM (1<<0) /* global power management */ -#define GIT (1<<1) /* globally enable PM device idle timers */ -#define GTR (1<<2) /* globally enable IO traps */ -#define IRQ_SPDUP (1<<3) /* disable clock throttle during interrupt handling */ -#define VID_SPDUP (1<<4) /* disable clock throttle during vga video handling */ +#define GPM (1<<0) /* global power management */ +#define GIT (1<<1) /* globally enable PM device idle timers */ +#define GTR (1<<2) /* globally enable IO traps */ +#define IRQ_SPDUP (1<<3) /* disable clock throttle during interrupt handling */ +#define VID_SPDUP (1<<4) /* disable clock throttle during vga video handling */ /* SUSCFG bits */ -#define SUSMOD (1<<0) /* enable/disable suspend modulation */ -/* the belows support only with cs5530 (after rev.1.2)/cs5530A */ -#define SMISPDUP (1<<1) /* select how SMI re-enable suspend modulation: */ - /* IRQTC timer or read SMI speedup disable reg.(F1BAR[08-09h]) */ -#define SUSCFG (1<<2) /* enable powering down a GXLV processor. "Special 3Volt Suspend" mode */ -/* the belows support only with cs5530A */ -#define PWRSVE_ISA (1<<3) /* stop ISA clock */ -#define PWRSVE (1<<4) /* active idle */ +#define SUSMOD (1<<0) /* enable/disable suspend modulation */ +/* the belows support only with cs5530 (after rev.1.2)/cs5530A */ +#define SMISPDUP (1<<1) /* select how SMI re-enable suspend modulation: */ + /* IRQTC timer or read SMI speedup disable reg.(F1BAR[08-09h]) */ +#define SUSCFG (1<<2) /* enable powering down a GXLV processor. "Special 3Volt Suspend" mode */ +/* the belows support only with cs5530A */ +#define PWRSVE_ISA (1<<3) /* stop ISA clock */ +#define PWRSVE (1<<4) /* active idle */ struct gxfreq_params { u8 on_duration; @@ -128,7 +128,7 @@ module_param (pci_busclk, int, 0444); /* maximum duration for which the cpu may be suspended * (32us * MAX_DURATION). If no parameter is given, this defaults - * to 255. + * to 255. * Note that this leads to a maximum of 8 ms(!) where the CPU clock * is suspended -- processing power is just 0.39% of what it used to be, * though. 781.25 kHz(!) for a 200 MHz processor -- wow. */ @@ -144,17 +144,17 @@ module_param (max_duration, int, 0444); #define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_DRIVER, "gx-suspmod", msg) /** - * we can detect a core multipiler from dir0_lsb - * from GX1 datasheet p.56, - * MULT[3:0]: - * 0000 = SYSCLK multiplied by 4 (test only) - * 0001 = SYSCLK multiplied by 10 - * 0010 = SYSCLK multiplied by 4 - * 0011 = SYSCLK multiplied by 6 - * 0100 = SYSCLK multiplied by 9 - * 0101 = SYSCLK multiplied by 5 - * 0110 = SYSCLK multiplied by 7 - * 0111 = SYSCLK multiplied by 8 + * we can detect a core multipiler from dir0_lsb + * from GX1 datasheet p.56, + * MULT[3:0]: + * 0000 = SYSCLK multiplied by 4 (test only) + * 0001 = SYSCLK multiplied by 10 + * 0010 = SYSCLK multiplied by 4 + * 0011 = SYSCLK multiplied by 6 + * 0100 = SYSCLK multiplied by 9 + * 0101 = SYSCLK multiplied by 5 + * 0110 = SYSCLK multiplied by 7 + * 0111 = SYSCLK multiplied by 8 * of 33.3MHz **/ static int gx_freq_mult[16] = { @@ -164,17 +164,17 @@ static int gx_freq_mult[16] = { /**************************************************************** - * Low Level chipset interface * + * Low Level chipset interface * ****************************************************************/ static struct pci_device_id gx_chipset_tbl[] __initdata = { - { PCI_VENDOR_ID_CYRIX, PCI_DEVICE_ID_CYRIX_5530_LEGACY, PCI_ANY_ID, PCI_ANY_ID }, - { PCI_VENDOR_ID_CYRIX, PCI_DEVICE_ID_CYRIX_5520, PCI_ANY_ID, PCI_ANY_ID }, - { PCI_VENDOR_ID_CYRIX, PCI_DEVICE_ID_CYRIX_5510, PCI_ANY_ID, PCI_ANY_ID }, - { 0, }, + { PCI_VENDOR_ID_CYRIX, PCI_DEVICE_ID_CYRIX_5530_LEGACY, PCI_ANY_ID, PCI_ANY_ID }, + { PCI_VENDOR_ID_CYRIX, PCI_DEVICE_ID_CYRIX_5520, PCI_ANY_ID, PCI_ANY_ID }, + { PCI_VENDOR_ID_CYRIX, PCI_DEVICE_ID_CYRIX_5510, PCI_ANY_ID, PCI_ANY_ID }, + { 0, }, }; /** - * gx_detect_chipset: + * gx_detect_chipset: * **/ static __init struct pci_dev *gx_detect_chipset(void) @@ -182,16 +182,17 @@ static __init struct pci_dev *gx_detect_chipset(void) struct pci_dev *gx_pci = NULL; /* check if CPU is a MediaGX or a Geode. */ - if ((current_cpu_data.x86_vendor != X86_VENDOR_NSC) && + if ((current_cpu_data.x86_vendor != X86_VENDOR_NSC) && (current_cpu_data.x86_vendor != X86_VENDOR_CYRIX)) { dprintk("error: no MediaGX/Geode processor found!\n"); - return NULL; + return NULL; } /* detect which companion chip is used */ while ((gx_pci = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, gx_pci)) != NULL) { - if ((pci_match_id(gx_chipset_tbl, gx_pci)) != NULL) + if ((pci_match_id(gx_chipset_tbl, gx_pci)) != NULL) { return gx_pci; + } } dprintk("error: no supported chipset found!\n"); @@ -199,24 +200,24 @@ static __init struct pci_dev *gx_detect_chipset(void) } /** - * gx_get_cpuspeed: + * gx_get_cpuspeed: * * Finds out at which efficient frequency the Cyrix MediaGX/NatSemi Geode CPU runs. */ static unsigned int gx_get_cpuspeed(unsigned int cpu) { - if ((gx_params->pci_suscfg & SUSMOD) == 0) + if ((gx_params->pci_suscfg & SUSMOD) == 0) return stock_freq; - return (stock_freq * gx_params->off_duration) + return (stock_freq * gx_params->off_duration) / (gx_params->on_duration + gx_params->off_duration); } /** * gx_validate_speed: * determine current cpu speed - * - **/ + * +**/ static unsigned int gx_validate_speed(unsigned int khz, u8 *on_duration, u8 *off_duration) { @@ -229,7 +230,7 @@ static unsigned int gx_validate_speed(unsigned int khz, u8 *on_duration, u8 *off *on_duration=0; for (i=max_duration; i>0; i--) { - tmp_off = ((khz * i) / stock_freq) & 0xff; + tmp_off = ((khz * i) / stock_freq) & 0xff; tmp_on = i - tmp_off; tmp_freq = (stock_freq * tmp_off) / i; /* if this relation is closer to khz, use this. If it's equal, @@ -246,17 +247,18 @@ static unsigned int gx_validate_speed(unsigned int khz, u8 *on_duration, u8 *off /** - * gx_set_cpuspeed: - * set cpu speed in khz. + * gx_set_cpuspeed: + * set cpu speed in khz. **/ static void gx_set_cpuspeed(unsigned int khz) { - u8 suscfg, pmer1; + u8 suscfg, pmer1; unsigned int new_khz; unsigned long flags; struct cpufreq_freqs freqs; + freqs.cpu = 0; freqs.old = gx_get_cpuspeed(0); @@ -301,18 +303,18 @@ static void gx_set_cpuspeed(unsigned int khz) pci_write_config_byte(gx_params->cs55x0, PCI_MODOFF, gx_params->off_duration); pci_write_config_byte(gx_params->cs55x0, PCI_MODON, gx_params->on_duration); - pci_write_config_byte(gx_params->cs55x0, PCI_SUSCFG, suscfg); - pci_read_config_byte(gx_params->cs55x0, PCI_SUSCFG, &suscfg); + pci_write_config_byte(gx_params->cs55x0, PCI_SUSCFG, suscfg); + pci_read_config_byte(gx_params->cs55x0, PCI_SUSCFG, &suscfg); - local_irq_restore(flags); + local_irq_restore(flags); gx_params->pci_suscfg = suscfg; cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE); - dprintk("suspend modulation w/ duration of ON:%d us, OFF:%d us\n", - gx_params->on_duration * 32, gx_params->off_duration * 32); - dprintk("suspend modulation w/ clock speed: %d kHz.\n", freqs.new); + dprintk("suspend modulation w/ duration of ON:%d us, OFF:%d us\n", + gx_params->on_duration * 32, gx_params->off_duration * 32); + dprintk("suspend modulation w/ clock speed: %d kHz.\n", freqs.new); } /**************************************************************** @@ -320,10 +322,10 @@ static void gx_set_cpuspeed(unsigned int khz) ****************************************************************/ /* - * cpufreq_gx_verify: test if frequency range is valid + * cpufreq_gx_verify: test if frequency range is valid * - * This function checks if a given frequency range in kHz is valid - * for the hardware supported by the driver. + * This function checks if a given frequency range in kHz is valid + * for the hardware supported by the driver. */ static int cpufreq_gx_verify(struct cpufreq_policy *policy) @@ -331,8 +333,8 @@ static int cpufreq_gx_verify(struct cpufreq_policy *policy) unsigned int tmp_freq = 0; u8 tmp1, tmp2; - if (!stock_freq || !policy) - return -EINVAL; + if (!stock_freq || !policy) + return -EINVAL; policy->cpu = 0; cpufreq_verify_within_limits(policy, (stock_freq / max_duration), stock_freq); @@ -340,14 +342,14 @@ static int cpufreq_gx_verify(struct cpufreq_policy *policy) /* it needs to be assured that at least one supported frequency is * within policy->min and policy->max. If it is not, policy->max * needs to be increased until one freuqency is supported. - * policy->min may not be decreased, though. This way we guarantee a + * policy->min may not be decreased, though. This way we guarantee a * specific processing capacity. */ tmp_freq = gx_validate_speed(policy->min, &tmp1, &tmp2); - if (tmp_freq < policy->min) + if (tmp_freq < policy->min) tmp_freq += stock_freq / max_duration; policy->min = tmp_freq; - if (policy->min > policy->max) + if (policy->min > policy->max) policy->max = tmp_freq; tmp_freq = gx_validate_speed(policy->max, &tmp1, &tmp2); if (tmp_freq > policy->max) @@ -356,12 +358,12 @@ static int cpufreq_gx_verify(struct cpufreq_policy *policy) if (policy->max < policy->min) policy->max = policy->min; cpufreq_verify_within_limits(policy, (stock_freq / max_duration), stock_freq); - + return 0; } /* - * cpufreq_gx_target: + * cpufreq_gx_target: * */ static int cpufreq_gx_target(struct cpufreq_policy *policy, @@ -371,8 +373,8 @@ static int cpufreq_gx_target(struct cpufreq_policy *policy, u8 tmp1, tmp2; unsigned int tmp_freq; - if (!stock_freq || !policy) - return -EINVAL; + if (!stock_freq || !policy) + return -EINVAL; policy->cpu = 0; @@ -429,7 +431,7 @@ static int cpufreq_gx_cpu_init(struct cpufreq_policy *policy) return 0; } -/* +/* * cpufreq_gx_init: * MediaGX/Geode GX initialize cpufreq driver */ @@ -450,7 +452,7 @@ static int __init cpufreq_gx_init(void) u32 class_rev; /* Test if we have the right hardware */ - if ((gx_pci = gx_detect_chipset()) == NULL) + if ((gx_pci = gx_detect_chipset()) == NULL) return -ENODEV; /* check whether module parameters are sane */ @@ -459,9 +461,10 @@ static int __init cpufreq_gx_init(void) dprintk("geode suspend modulation available.\n"); - params = kzalloc(sizeof(struct gxfreq_params), GFP_KERNEL); + params = kmalloc(sizeof(struct gxfreq_params), GFP_KERNEL); if (params == NULL) return -ENOMEM; + memset(params, 0, sizeof(struct gxfreq_params)); params->cs55x0 = gx_pci; gx_params = params; @@ -475,7 +478,7 @@ static int __init cpufreq_gx_init(void) pci_read_config_dword(params->cs55x0, PCI_CLASS_REVISION, &class_rev); params->pci_rev = class_rev && 0xff; - if ((ret = cpufreq_register_driver(&gx_suspmod_driver))) { + if ((ret = cpufreq_register_driver(&gx_suspmod_driver))) { kfree(params); return ret; /* register error! */ } diff --git a/arch/i386/kernel/cpu/cpufreq/longhaul.c b/arch/i386/kernel/cpu/cpufreq/longhaul.c index 4f2c3aeef..8ef385444 100644 --- a/arch/i386/kernel/cpu/cpufreq/longhaul.c +++ b/arch/i386/kernel/cpu/cpufreq/longhaul.c @@ -29,13 +29,11 @@ #include #include #include +#include #include #include #include -#include -#include -#include #include "longhaul.h" @@ -58,8 +56,6 @@ static int minvid, maxvid; static unsigned int minmult, maxmult; static int can_scale_voltage; static int vrmrev; -static struct acpi_processor *pr = NULL; -static struct acpi_processor_cx *cx = NULL; /* Module parameters */ static int dont_scale_voltage; @@ -81,17 +77,13 @@ static char speedbuffer[8]; static char *print_speed(int speed) { - if (speed < 1000) { - snprintf(speedbuffer, sizeof(speedbuffer),"%dMHz", speed); - return speedbuffer; - } - - if (speed%1000 == 0) - snprintf(speedbuffer, sizeof(speedbuffer), - "%dGHz", speed/1000); - else - snprintf(speedbuffer, sizeof(speedbuffer), - "%d.%dGHz", speed/1000, (speed%1000)/100); + if (speed > 1000) { + if (speed%1000 == 0) + sprintf (speedbuffer, "%dGHz", speed/1000); + else + sprintf (speedbuffer, "%d.%dGHz", speed/1000, (speed%1000)/100); + } else + sprintf (speedbuffer, "%dMHz", speed); return speedbuffer; } @@ -122,65 +114,84 @@ static int longhaul_get_cpu_mult(void) return eblcr_table[invalue]; } -/* For processor with BCR2 MSR */ -static void do_longhaul1(int cx_address, unsigned int clock_ratio_index) +static void do_powersaver(union msr_longhaul *longhaul, + unsigned int clock_ratio_index) { - union msr_bcr2 bcr2; - u32 t; + struct pci_dev *dev; + unsigned long flags; + unsigned int tmp_mask; + int version; + int i; + u16 pci_cmd; + u16 cmd_state[64]; - rdmsrl(MSR_VIA_BCR2, bcr2.val); - /* Enable software clock multiplier */ - bcr2.bits.ESOFTBF = 1; - bcr2.bits.CLOCKMUL = clock_ratio_index; + switch (cpu_model) { + case CPU_EZRA_T: + version = 3; + break; + case CPU_NEHEMIAH: + version = 0xf; + break; + default: + return; + } - /* Sync to timer tick */ - safe_halt(); - ACPI_FLUSH_CPU_CACHE(); - /* Change frequency on next halt or sleep */ - wrmsrl(MSR_VIA_BCR2, bcr2.val); - /* Invoke C3 */ - inb(cx_address); - /* Dummy op - must do something useless after P_LVL3 read */ - t = inl(acpi_fadt.xpm_tmr_blk.address); - - /* Disable software clock multiplier */ - local_irq_disable(); - rdmsrl(MSR_VIA_BCR2, bcr2.val); - bcr2.bits.ESOFTBF = 0; - wrmsrl(MSR_VIA_BCR2, bcr2.val); -} + rdmsrl(MSR_VIA_LONGHAUL, longhaul->val); + longhaul->bits.SoftBusRatio = clock_ratio_index & 0xf; + longhaul->bits.SoftBusRatio4 = (clock_ratio_index & 0x10) >> 4; + longhaul->bits.EnableSoftBusRatio = 1; + longhaul->bits.RevisionKey = 0; -/* For processor with Longhaul MSR */ + preempt_disable(); + local_irq_save(flags); -static void do_powersaver(int cx_address, unsigned int clock_ratio_index) -{ - union msr_longhaul longhaul; - u32 t; + /* + * get current pci bus master state for all devices + * and clear bus master bit + */ + dev = NULL; + i = 0; + do { + dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev); + if (dev != NULL) { + pci_read_config_word(dev, PCI_COMMAND, &pci_cmd); + cmd_state[i++] = pci_cmd; + pci_cmd &= ~PCI_COMMAND_MASTER; + pci_write_config_word(dev, PCI_COMMAND, pci_cmd); + } + } while (dev != NULL); - rdmsrl(MSR_VIA_LONGHAUL, longhaul.val); - longhaul.bits.RevisionKey = longhaul.bits.RevisionID; - longhaul.bits.SoftBusRatio = clock_ratio_index & 0xf; - longhaul.bits.SoftBusRatio4 = (clock_ratio_index & 0x10) >> 4; - longhaul.bits.EnableSoftBusRatio = 1; + tmp_mask=inb(0x21); /* works on C3. save mask. */ + outb(0xFE,0x21); /* TMR0 only */ + outb(0xFF,0x80); /* delay */ - /* Sync to timer tick */ safe_halt(); - ACPI_FLUSH_CPU_CACHE(); - /* Change frequency on next halt or sleep */ - wrmsrl(MSR_VIA_LONGHAUL, longhaul.val); - /* Invoke C3 */ - inb(cx_address); - /* Dummy op - must do something useless after P_LVL3 read */ - t = inl(acpi_fadt.xpm_tmr_blk.address); - - /* Disable bus ratio bit */ + wrmsrl(MSR_VIA_LONGHAUL, longhaul->val); + halt(); + local_irq_disable(); - longhaul.bits.RevisionKey = longhaul.bits.RevisionID; - longhaul.bits.EnableSoftBusRatio = 0; - longhaul.bits.EnableSoftBSEL = 0; - longhaul.bits.EnableSoftVID = 0; - wrmsrl(MSR_VIA_LONGHAUL, longhaul.val); + + outb(tmp_mask,0x21); /* restore mask */ + + /* restore pci bus master state for all devices */ + dev = NULL; + i = 0; + do { + dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev); + if (dev != NULL) { + pci_cmd = cmd_state[i++]; + pci_write_config_byte(dev, PCI_COMMAND, pci_cmd); + } + } while (dev != NULL); + local_irq_restore(flags); + preempt_enable(); + + /* disable bus ratio bit */ + rdmsrl(MSR_VIA_LONGHAUL, longhaul->val); + longhaul->bits.EnableSoftBusRatio = 0; + longhaul->bits.RevisionKey = version; + wrmsrl(MSR_VIA_LONGHAUL, longhaul->val); } /** @@ -194,9 +205,9 @@ static void longhaul_setstate(unsigned int clock_ratio_index) { int speed, mult; struct cpufreq_freqs freqs; + union msr_longhaul longhaul; + union msr_bcr2 bcr2; static unsigned int old_ratio=-1; - unsigned long flags; - unsigned int pic1_mask, pic2_mask; if (old_ratio == clock_ratio_index) return; @@ -219,20 +230,6 @@ static void longhaul_setstate(unsigned int clock_ratio_index) dprintk ("Setting to FSB:%dMHz Mult:%d.%dx (%s)\n", fsb, mult/10, mult%10, print_speed(speed/1000)); - preempt_disable(); - local_irq_save(flags); - - pic2_mask = inb(0xA1); - pic1_mask = inb(0x21); /* works on C3. save mask. */ - outb(0xFF,0xA1); /* Overkill */ - outb(0xFE,0x21); /* TMR0 only */ - - /* Disable bus master arbitration */ - if (pr->flags.bm_check) { - acpi_set_register(ACPI_BITREG_ARB_DISABLE, 1, - ACPI_MTX_DO_NOT_LOCK); - } - switch (longhaul_version) { /* @@ -244,7 +241,20 @@ static void longhaul_setstate(unsigned int clock_ratio_index) */ case TYPE_LONGHAUL_V1: case TYPE_LONGHAUL_V2: - do_longhaul1(cx->address, clock_ratio_index); + rdmsrl (MSR_VIA_BCR2, bcr2.val); + /* Enable software clock multiplier */ + bcr2.bits.ESOFTBF = 1; + bcr2.bits.CLOCKMUL = clock_ratio_index; + local_irq_disable(); + wrmsrl (MSR_VIA_BCR2, bcr2.val); + safe_halt(); + + /* Disable software clock multiplier */ + rdmsrl (MSR_VIA_BCR2, bcr2.val); + bcr2.bits.ESOFTBF = 0; + local_irq_disable(); + wrmsrl (MSR_VIA_BCR2, bcr2.val); + local_irq_enable(); break; /* @@ -259,22 +269,10 @@ static void longhaul_setstate(unsigned int clock_ratio_index) * to work in practice. */ case TYPE_POWERSAVER: - do_powersaver(cx->address, clock_ratio_index); + do_powersaver(&longhaul, clock_ratio_index); break; } - /* Enable bus master arbitration */ - if (pr->flags.bm_check) { - acpi_set_register(ACPI_BITREG_ARB_DISABLE, 0, - ACPI_MTX_DO_NOT_LOCK); - } - - outb(pic2_mask,0xA1); /* restore mask */ - outb(pic1_mask,0x21); - - local_irq_restore(flags); - preempt_enable(); - cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE); } @@ -322,11 +320,9 @@ static int guess_fsb(void) static int __init longhaul_get_ranges(void) { unsigned long invalue; - unsigned int ezra_t_multipliers[32]= { - 90, 30, 40, 100, 55, 35, 45, 95, - 50, 70, 80, 60, 120, 75, 85, 65, - -1, 110, 120, -1, 135, 115, 125, 105, - 130, 150, 160, 140, -1, 155, -1, 145 }; + unsigned int multipliers[32]= { + 50,30,40,100,55,35,45,95,90,70,80,60,120,75,85,65, + -1,110,120,-1,135,115,125,105,130,150,160,140,-1,155,-1,145 }; unsigned int j, k = 0; union msr_longhaul longhaul; unsigned long lo, hi; @@ -355,13 +351,13 @@ static int __init longhaul_get_ranges(void) invalue = longhaul.bits.MaxMHzBR; if (longhaul.bits.MaxMHzBR4) invalue += 16; - maxmult=ezra_t_multipliers[invalue]; + maxmult=multipliers[invalue]; invalue = longhaul.bits.MinMHzBR; if (longhaul.bits.MinMHzBR4 == 1) minmult = 30; else - minmult = ezra_t_multipliers[invalue]; + minmult = multipliers[invalue]; fsb = eblcr_fsb_table_v2[longhaul.bits.MaxMHzFSB]; break; } @@ -527,18 +523,6 @@ static unsigned int longhaul_get(unsigned int cpu) return calc_speed(longhaul_get_cpu_mult()); } -static acpi_status longhaul_walk_callback(acpi_handle obj_handle, - u32 nesting_level, - void *context, void **return_value) -{ - struct acpi_device *d; - - if ( acpi_bus_get_device(obj_handle, &d) ) { - return 0; - } - *return_value = (void *)acpi_driver_data(d); - return 1; -} static int __init longhaul_cpu_init(struct cpufreq_policy *policy) { @@ -546,15 +530,6 @@ static int __init longhaul_cpu_init(struct cpufreq_policy *policy) char *cpuname=NULL; int ret; - /* Check ACPI support for C3 state */ - acpi_walk_namespace(ACPI_TYPE_PROCESSOR, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX, - &longhaul_walk_callback, NULL, (void *)&pr); - if (pr == NULL) goto err_acpi; - - cx = &pr->power.states[ACPI_STATE_C3]; - if (cx->address == 0 || cx->latency > 1000) goto err_acpi; - - /* Now check what we have on this motherboard */ switch (c->x86_model) { case 6: cpu_model = CPU_SAMUEL; @@ -655,10 +630,6 @@ static int __init longhaul_cpu_init(struct cpufreq_policy *policy) cpufreq_frequency_table_get_attr(longhaul_table, policy->cpu); return 0; - -err_acpi: - printk(KERN_ERR PFX "No ACPI support for CPU frequency changes.\n"); - return -ENODEV; } static int __devexit longhaul_cpu_exit(struct cpufreq_policy *policy) @@ -691,18 +662,6 @@ static int __init longhaul_init(void) if (c->x86_vendor != X86_VENDOR_CENTAUR || c->x86 != 6) return -ENODEV; -#ifdef CONFIG_SMP - if (num_online_cpus() > 1) { - return -ENODEV; - printk(KERN_ERR PFX "More than 1 CPU detected, longhaul disabled.\n"); - } -#endif -#ifdef CONFIG_X86_IO_APIC - if (cpu_has_apic) { - printk(KERN_ERR PFX "APIC detected. Longhaul is currently broken in this configuration.\n"); - return -ENODEV; - } -#endif switch (c->x86_model) { case 6 ... 9: return cpufreq_register_driver(&longhaul_driver); @@ -716,7 +675,7 @@ static int __init longhaul_init(void) static void __exit longhaul_exit(void) { - int i; + int i=0; for (i=0; i < numscales; i++) { if (clock_ratio[i] == maxmult) { @@ -736,6 +695,6 @@ MODULE_AUTHOR ("Dave Jones "); MODULE_DESCRIPTION ("Longhaul driver for VIA Cyrix processors."); MODULE_LICENSE ("GPL"); -late_initcall(longhaul_init); +module_init(longhaul_init); module_exit(longhaul_exit); diff --git a/arch/i386/kernel/cpu/cpufreq/longhaul.h b/arch/i386/kernel/cpu/cpufreq/longhaul.h index d3a95d77e..2a495c162 100644 --- a/arch/i386/kernel/cpu/cpufreq/longhaul.h +++ b/arch/i386/kernel/cpu/cpufreq/longhaul.h @@ -234,7 +234,7 @@ static int __initdata ezrat_eblcr[32] = { /* * VIA C3 Nehemiah */ - + static int __initdata nehemiah_a_clock_ratio[32] = { 100, /* 0000 -> 10.0x */ 160, /* 0001 -> 16.0x */ @@ -446,7 +446,7 @@ static int __initdata nehemiah_c_eblcr[32] = { /* end of table */ }; -/* +/* * Voltage scales. Div/Mod by 1000 to get actual voltage. * Which scale to use depends on the VRM type in use. */ diff --git a/arch/i386/kernel/cpu/cpufreq/longrun.c b/arch/i386/kernel/cpu/cpufreq/longrun.c index b26895142..e3868de4d 100644 --- a/arch/i386/kernel/cpu/cpufreq/longrun.c +++ b/arch/i386/kernel/cpu/cpufreq/longrun.c @@ -223,6 +223,7 @@ static unsigned int __init longrun_determine_freqs(unsigned int *low_freq, /* set to 0 to try_hi perf_pctg */ msr_lo &= 0xFFFFFF80; msr_hi &= 0xFFFFFF80; + msr_lo |= 0; msr_hi |= try_hi; wrmsr(MSR_TMTA_LONGRUN_CTRL, msr_lo, msr_hi); diff --git a/arch/i386/kernel/cpu/cpufreq/p4-clockmod.c b/arch/i386/kernel/cpu/cpufreq/p4-clockmod.c index 304d2eaa4..ebe184816 100644 --- a/arch/i386/kernel/cpu/cpufreq/p4-clockmod.c +++ b/arch/i386/kernel/cpu/cpufreq/p4-clockmod.c @@ -14,14 +14,15 @@ * The author(s) of this software shall not be held liable for damages * of any nature resulting due to the use of this software. This * software is provided AS-IS with no warranties. - * + * * Date Errata Description * 20020525 N44, O17 12.5% or 25% DC causes lockup * */ +#include #include -#include +#include #include #include #include @@ -29,7 +30,7 @@ #include #include /* current / set_cpus_allowed() */ -#include +#include #include #include @@ -78,7 +79,7 @@ static int cpufreq_p4_setdc(unsigned int cpu, unsigned int newstate) } else { dprintk("CPU#%d setting duty cycle to %d%%\n", cpu, ((125 * newstate) / 10)); - /* bits 63 - 5 : reserved + /* bits 63 - 5 : reserved * bit 4 : enable/disable * bits 3-1 : duty cycle * bit 0 : reserved @@ -131,7 +132,7 @@ static int cpufreq_p4_target(struct cpufreq_policy *policy, } /* run on each logical CPU, see section 13.15.3 of IA32 Intel Architecture Software - * Developer's Manual, Volume 3 + * Developer's Manual, Volume 3 */ cpus_allowed = current->cpus_allowed; @@ -205,7 +206,7 @@ static unsigned int cpufreq_p4_get_frequency(struct cpuinfo_x86 *c) return speedstep_get_processor_frequency(SPEEDSTEP_PROCESSOR_P4D); } - + static int cpufreq_p4_cpu_init(struct cpufreq_policy *policy) { @@ -233,7 +234,7 @@ static int cpufreq_p4_cpu_init(struct cpufreq_policy *policy) dprintk("has errata -- disabling frequencies lower than 2ghz\n"); break; } - + /* get max frequency */ stock_freq = cpufreq_p4_get_frequency(c); if (!stock_freq) @@ -249,7 +250,7 @@ static int cpufreq_p4_cpu_init(struct cpufreq_policy *policy) p4clockmod_table[i].frequency = (stock_freq * i)/8; } cpufreq_frequency_table_get_attr(p4clockmod_table, policy->cpu); - + /* cpuinfo and default policy values */ policy->governor = CPUFREQ_DEFAULT_GOVERNOR; policy->cpuinfo.transition_latency = 1000000; /* assumed */ @@ -261,7 +262,7 @@ static int cpufreq_p4_cpu_init(struct cpufreq_policy *policy) static int cpufreq_p4_cpu_exit(struct cpufreq_policy *policy) { - cpufreq_frequency_table_put_attr(policy->cpu); + cpufreq_frequency_table_put_attr(policy->cpu); return 0; } @@ -297,7 +298,7 @@ static struct freq_attr* p4clockmod_attr[] = { }; static struct cpufreq_driver p4clockmod_driver = { - .verify = cpufreq_p4_verify, + .verify = cpufreq_p4_verify, .target = cpufreq_p4_target, .init = cpufreq_p4_cpu_init, .exit = cpufreq_p4_cpu_exit, @@ -309,12 +310,12 @@ static struct cpufreq_driver p4clockmod_driver = { static int __init cpufreq_p4_init(void) -{ +{ struct cpuinfo_x86 *c = cpu_data; int ret; /* - * THERM_CONTROL is architectural for IA32 now, so + * THERM_CONTROL is architectural for IA32 now, so * we can rely on the capability checks */ if (c->x86_vendor != X86_VENDOR_INTEL) diff --git a/arch/i386/kernel/cpu/cpufreq/powernow-k6.c b/arch/i386/kernel/cpu/cpufreq/powernow-k6.c index f89524051..222f8cfe3 100644 --- a/arch/i386/kernel/cpu/cpufreq/powernow-k6.c +++ b/arch/i386/kernel/cpu/cpufreq/powernow-k6.c @@ -8,7 +8,7 @@ */ #include -#include +#include #include #include #include @@ -50,7 +50,7 @@ static int powernow_k6_get_cpu_multiplier(void) { u64 invalue = 0; u32 msrval; - + msrval = POWERNOW_IOPORT + 0x1; wrmsr(MSR_K6_EPMR, msrval, 0); /* enable the PowerNow port */ invalue=inl(POWERNOW_IOPORT + 0x8); @@ -81,7 +81,7 @@ static void powernow_k6_set_state (unsigned int best_i) freqs.old = busfreq * powernow_k6_get_cpu_multiplier(); freqs.new = busfreq * clock_ratio[best_i].index; freqs.cpu = 0; /* powernow-k6.c is UP only driver */ - + cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE); /* we now need to transform best_i to the BVC format, see AMD#23446 */ @@ -152,7 +152,7 @@ static int powernow_k6_cpu_init(struct cpufreq_policy *policy) busfreq = cpu_khz / max_multiplier; /* table init */ - for (i=0; (clock_ratio[i].frequency != CPUFREQ_TABLE_END); i++) { + for (i=0; (clock_ratio[i].frequency != CPUFREQ_TABLE_END); i++) { if (clock_ratio[i].index > max_multiplier) clock_ratio[i].frequency = CPUFREQ_ENTRY_INVALID; else @@ -182,7 +182,7 @@ static int powernow_k6_cpu_exit(struct cpufreq_policy *policy) powernow_k6_set_state(i); } cpufreq_frequency_table_put_attr(policy->cpu); - return 0; + return 0; } static unsigned int powernow_k6_get(unsigned int cpu) @@ -196,8 +196,8 @@ static struct freq_attr* powernow_k6_attr[] = { }; static struct cpufreq_driver powernow_k6_driver = { - .verify = powernow_k6_verify, - .target = powernow_k6_target, + .verify = powernow_k6_verify, + .target = powernow_k6_target, .init = powernow_k6_cpu_init, .exit = powernow_k6_cpu_exit, .get = powernow_k6_get, @@ -215,7 +215,7 @@ static struct cpufreq_driver powernow_k6_driver = { * on success. */ static int __init powernow_k6_init(void) -{ +{ struct cpuinfo_x86 *c = cpu_data; if ((c->x86_vendor != X86_VENDOR_AMD) || (c->x86 != 5) || diff --git a/arch/i386/kernel/cpu/cpufreq/powernow-k7.c b/arch/i386/kernel/cpu/cpufreq/powernow-k7.c index 543827609..8439f90eb 100644 --- a/arch/i386/kernel/cpu/cpufreq/powernow-k7.c +++ b/arch/i386/kernel/cpu/cpufreq/powernow-k7.c @@ -12,6 +12,7 @@ * - We disable half multipliers if ACPI is used on A0 stepping CPUs. */ +#include #include #include #include @@ -198,8 +199,8 @@ static int get_ranges (unsigned char *pst) powernow_table[j].index |= (vid << 8); /* upper 8 bits */ dprintk (" FID: 0x%x (%d.%dx [%dMHz]) " - "VID: 0x%x (%d.%03dV)\n", fid, fid_codes[fid] / 10, - fid_codes[fid] % 10, speed/1000, vid, + "VID: 0x%x (%d.%03dV)\n", fid, fid_codes[fid] / 10, + fid_codes[fid] % 10, speed/1000, vid, mobile_vid_table[vid]/1000, mobile_vid_table[vid]%1000); } @@ -367,8 +368,8 @@ static int powernow_acpi_init(void) } dprintk (" FID: 0x%x (%d.%dx [%dMHz]) " - "VID: 0x%x (%d.%03dV)\n", fid, fid_codes[fid] / 10, - fid_codes[fid] % 10, speed/1000, vid, + "VID: 0x%x (%d.%03dV)\n", fid, fid_codes[fid] / 10, + fid_codes[fid] % 10, speed/1000, vid, mobile_vid_table[vid]/1000, mobile_vid_table[vid]%1000); @@ -451,23 +452,23 @@ static int powernow_decode_bios (int maxfid, int startvid) pst = (struct pst_s *) p; - for (j=0; jnumpst; j++) { + for (i = 0 ; i numpst; i++) { pst = (struct pst_s *) p; number_scales = pst->numpstates; if ((etuple == pst->cpuid) && check_fsb(pst->fsbspeed) && (maxfid==pst->maxfid) && (startvid==pst->startvid)) { - dprintk ("PST:%d (@%p)\n", j, pst); - dprintk (" cpuid: 0x%x fsb: %d maxFID: 0x%x startvid: 0x%x\n", + dprintk ("PST:%d (@%p)\n", i, pst); + dprintk (" cpuid: 0x%x fsb: %d maxFID: 0x%x startvid: 0x%x\n", pst->cpuid, pst->fsbspeed, pst->maxfid, pst->startvid); ret = get_ranges ((char *) pst + sizeof (struct pst_s)); return ret; + } else { - unsigned int k; p = (char *) pst + sizeof (struct pst_s); - for (k=0; k -#include #include #endif #define PFX "powernow-k8: " #define BFX PFX "BIOS error: " -#define VERSION "version 2.00.00" +#define VERSION "version 1.60.0" #include "powernow-k8.h" /* serialize freq changes */ -static DEFINE_MUTEX(fidvid_mutex); +static DECLARE_MUTEX(fidvid_sem); static struct powernow_k8_data *powernow_data[NR_CPUS]; -static int cpu_family = CPU_OPTERON; - #ifndef CONFIG_SMP static cpumask_t cpu_core_map[1]; #endif @@ -66,36 +63,16 @@ static u32 find_freq_from_fid(u32 fid) return 800 + (fid * 100); } - /* Return a frequency in KHz, given an input fid */ static u32 find_khz_freq_from_fid(u32 fid) { return 1000 * find_freq_from_fid(fid); } -/* Return a frequency in MHz, given an input fid and did */ -static u32 find_freq_from_fiddid(u32 fid, u32 did) -{ - return 100 * (fid + 0x10) >> did; -} - -static u32 find_khz_freq_from_fiddid(u32 fid, u32 did) -{ - return 1000 * find_freq_from_fiddid(fid, did); -} - -static u32 find_fid_from_pstate(u32 pstate) -{ - u32 hi, lo; - rdmsr(MSR_PSTATE_DEF_BASE + pstate, lo, hi); - return lo & HW_PSTATE_FID_MASK; -} - -static u32 find_did_from_pstate(u32 pstate) +/* Return a voltage in miliVolts, given an input vid */ +static u32 find_millivolts_from_vid(struct powernow_k8_data *data, u32 vid) { - u32 hi, lo; - rdmsr(MSR_PSTATE_DEF_BASE + pstate, lo, hi); - return (lo & HW_PSTATE_DID_MASK) >> HW_PSTATE_DID_SHIFT; + return 1550-vid*25; } /* Return the vco fid for an input fid @@ -106,10 +83,11 @@ static u32 find_did_from_pstate(u32 pstate) */ static u32 convert_fid_to_vco_fid(u32 fid) { - if (fid < HI_FID_TABLE_BOTTOM) + if (fid < HI_FID_TABLE_BOTTOM) { return 8 + (2 * fid); - else + } else { return fid; + } } /* @@ -120,9 +98,6 @@ static int pending_bit_stuck(void) { u32 lo, hi; - if (cpu_family == CPU_HW_PSTATE) - return 0; - rdmsr(MSR_FIDVID_STATUS, lo, hi); return lo & MSR_S_LO_CHANGE_PENDING ? 1 : 0; } @@ -136,14 +111,6 @@ static int query_current_values_with_pending_wait(struct powernow_k8_data *data) u32 lo, hi; u32 i = 0; - if (cpu_family == CPU_HW_PSTATE) { - rdmsr(MSR_PSTATE_STATUS, lo, hi); - i = lo & HW_PSTATE_MASK; - rdmsr(MSR_PSTATE_DEF_BASE + i, lo, hi); - data->currfid = lo & HW_PSTATE_FID_MASK; - data->currdid = (lo & HW_PSTATE_DID_MASK) >> HW_PSTATE_DID_SHIFT; - return 0; - } do { if (i++ > 10000) { dprintk("detected change pending stuck\n"); @@ -208,9 +175,9 @@ static int write_new_fid(struct powernow_k8_data *data, u32 fid) do { wrmsr(MSR_FIDVID_CTL, lo, data->plllock * PLL_LOCK_CONVERSION); if (i++ > 100) { - printk(KERN_ERR PFX "Hardware error - pending bit very stuck - no further pstate changes possible\n"); + printk(KERN_ERR PFX "internal error - pending bit very stuck - no further pstate changes possible\n"); return 1; - } + } } while (query_current_values_with_pending_wait(data)); count_off_irt(data); @@ -288,15 +255,7 @@ static int decrease_vid_code_by_step(struct powernow_k8_data *data, u32 reqvid, return 0; } -/* Change hardware pstate by single MSR write */ -static int transition_pstate(struct powernow_k8_data *data, u32 pstate) -{ - wrmsr(MSR_PSTATE_CTRL, pstate, 0); - data->currfid = find_fid_from_pstate(pstate); - return 0; -} - -/* Change Opteron/Athlon64 fid and vid, by the 3 phases. */ +/* Change the fid and vid, by the 3 phases. */ static int transition_fid_vid(struct powernow_k8_data *data, u32 reqfid, u32 reqvid) { if (core_voltage_pre_transition(data, reqvid)) @@ -515,35 +474,24 @@ static int check_supported_cpu(unsigned int cpu) goto out; eax = cpuid_eax(CPUID_PROCESSOR_SIGNATURE); - if (((eax & CPUID_XFAM) != CPUID_XFAM_K8) && - ((eax & CPUID_XFAM) < CPUID_XFAM_10H)) + if (((eax & CPUID_USE_XFAM_XMOD) != CPUID_USE_XFAM_XMOD) || + ((eax & CPUID_XFAM) != CPUID_XFAM_K8) || + ((eax & CPUID_XMOD) > CPUID_XMOD_REV_G)) { + printk(KERN_INFO PFX "Processor cpuid %x not supported\n", eax); goto out; + } - if ((eax & CPUID_XFAM) == CPUID_XFAM_K8) { - if (((eax & CPUID_USE_XFAM_XMOD) != CPUID_USE_XFAM_XMOD) || - ((eax & CPUID_XMOD) > CPUID_XMOD_REV_G)) { - printk(KERN_INFO PFX "Processor cpuid %x not supported\n", eax); - goto out; - } - - eax = cpuid_eax(CPUID_GET_MAX_CAPABILITIES); - if (eax < CPUID_FREQ_VOLT_CAPABILITIES) { - printk(KERN_INFO PFX - "No frequency change capabilities detected\n"); - goto out; - } + eax = cpuid_eax(CPUID_GET_MAX_CAPABILITIES); + if (eax < CPUID_FREQ_VOLT_CAPABILITIES) { + printk(KERN_INFO PFX + "No frequency change capabilities detected\n"); + goto out; + } - cpuid(CPUID_FREQ_VOLT_CAPABILITIES, &eax, &ebx, &ecx, &edx); - if ((edx & P_STATE_TRANSITION_CAPABLE) != P_STATE_TRANSITION_CAPABLE) { - printk(KERN_INFO PFX "Power state transitions not supported\n"); - goto out; - } - } else { /* must be a HW Pstate capable processor */ - cpuid(CPUID_FREQ_VOLT_CAPABILITIES, &eax, &ebx, &ecx, &edx); - if ((edx & USE_HW_PSTATE) == USE_HW_PSTATE) - cpu_family = CPU_HW_PSTATE; - else - goto out; + cpuid(CPUID_FREQ_VOLT_CAPABILITIES, &eax, &ebx, &ecx, &edx); + if ((edx & P_STATE_TRANSITION_CAPABLE) != P_STATE_TRANSITION_CAPABLE) { + printk(KERN_INFO PFX "Power state transitions not supported\n"); + goto out; } rc = 1; @@ -597,18 +545,12 @@ static void print_basics(struct powernow_k8_data *data) { int j; for (j = 0; j < data->numps; j++) { - if (data->powernow_table[j].frequency != CPUFREQ_ENTRY_INVALID) { - if (cpu_family == CPU_HW_PSTATE) { - printk(KERN_INFO PFX " %d : fid 0x%x gid 0x%x (%d MHz)\n", j, (data->powernow_table[j].index & 0xff00) >> 8, - (data->powernow_table[j].index & 0xff0000) >> 16, - data->powernow_table[j].frequency/1000); - } else { - printk(KERN_INFO PFX " %d : fid 0x%x (%d MHz), vid 0x%x\n", j, + if (data->powernow_table[j].frequency != CPUFREQ_ENTRY_INVALID) + printk(KERN_INFO PFX " %d : fid 0x%x (%d MHz), vid 0x%x (%d mV)\n", j, data->powernow_table[j].index & 0xff, data->powernow_table[j].frequency/1000, - data->powernow_table[j].index >> 8); - } - } + data->powernow_table[j].index >> 8, + find_millivolts_from_vid(data, data->powernow_table[j].index >> 8)); } if (data->batps) printk(KERN_INFO PFX "Only %d pstates on battery\n", data->batps); @@ -758,7 +700,7 @@ static int find_psb_table(struct powernow_k8_data *data) #ifdef CONFIG_X86_POWERNOW_K8_ACPI static void powernow_k8_acpi_pst_values(struct powernow_k8_data *data, unsigned int index) { - if (!data->acpi_data.state_count || (cpu_family == CPU_HW_PSTATE)) + if (!data->acpi_data.state_count) return; data->irt = (data->acpi_data.states[index].control >> IRT_SHIFT) & IRT_MASK; @@ -771,8 +713,9 @@ static void powernow_k8_acpi_pst_values(struct powernow_k8_data *data, unsigned static int powernow_k8_cpu_init_acpi(struct powernow_k8_data *data) { + int i; + int cntlofreq = 0; struct cpufreq_frequency_table *powernow_table; - int ret_val; if (acpi_processor_register_performance(&data->acpi_data, data->cpu)) { dprintk("register performance failed: bad ACPI data\n"); @@ -801,92 +744,13 @@ static int powernow_k8_cpu_init_acpi(struct powernow_k8_data *data) goto err_out; } - if (cpu_family == CPU_HW_PSTATE) - ret_val = fill_powernow_table_pstate(data, powernow_table); - else - ret_val = fill_powernow_table_fidvid(data, powernow_table); - if (ret_val) - goto err_out_mem; - - powernow_table[data->acpi_data.state_count].frequency = CPUFREQ_TABLE_END; - powernow_table[data->acpi_data.state_count].index = 0; - data->powernow_table = powernow_table; - - /* fill in data */ - data->numps = data->acpi_data.state_count; - print_basics(data); - powernow_k8_acpi_pst_values(data, 0); - - /* notify BIOS that we exist */ - acpi_processor_notify_smm(THIS_MODULE); - - return 0; - -err_out_mem: - kfree(powernow_table); - -err_out: - acpi_processor_unregister_performance(&data->acpi_data, data->cpu); - - /* data->acpi_data.state_count informs us at ->exit() whether ACPI was used */ - data->acpi_data.state_count = 0; - - return -ENODEV; -} - -static int fill_powernow_table_pstate(struct powernow_k8_data *data, struct cpufreq_frequency_table *powernow_table) -{ - int i; - - for (i = 0; i < data->acpi_data.state_count; i++) { - u32 index; - u32 hi = 0, lo = 0; - u32 fid; - u32 did; - - index = data->acpi_data.states[i].control & HW_PSTATE_MASK; - if (index > MAX_HW_PSTATE) { - printk(KERN_ERR PFX "invalid pstate %d - bad value %d.\n", i, index); - printk(KERN_ERR PFX "Please report to BIOS manufacturer\n"); - } - rdmsr(MSR_PSTATE_DEF_BASE + index, lo, hi); - if (!(hi & HW_PSTATE_VALID_MASK)) { - dprintk("invalid pstate %d, ignoring\n", index); - powernow_table[i].frequency = CPUFREQ_ENTRY_INVALID; - continue; - } - - fid = lo & HW_PSTATE_FID_MASK; - did = (lo & HW_PSTATE_DID_MASK) >> HW_PSTATE_DID_SHIFT; - - dprintk(" %d : fid 0x%x, did 0x%x\n", index, fid, did); - - powernow_table[i].index = index | (fid << HW_FID_INDEX_SHIFT) | (did << HW_DID_INDEX_SHIFT); - - powernow_table[i].frequency = find_khz_freq_from_fiddid(fid, did); - - if (powernow_table[i].frequency != (data->acpi_data.states[i].core_frequency * 1000)) { - printk(KERN_INFO PFX "invalid freq entries %u kHz vs. %u kHz\n", - powernow_table[i].frequency, - (unsigned int) (data->acpi_data.states[i].core_frequency * 1000)); - powernow_table[i].frequency = CPUFREQ_ENTRY_INVALID; - continue; - } - } - return 0; -} - -static int fill_powernow_table_fidvid(struct powernow_k8_data *data, struct cpufreq_frequency_table *powernow_table) -{ - int i; - int cntlofreq = 0; for (i = 0; i < data->acpi_data.state_count; i++) { u32 fid; u32 vid; if (data->exttype) { - fid = data->acpi_data.states[i].status & EXT_FID_MASK; - vid = (data->acpi_data.states[i].status >> VID_SHIFT) & EXT_VID_MASK; + fid = data->acpi_data.states[i].status & FID_MASK; + vid = (data->acpi_data.states[i].status >> VID_SHIFT) & VID_MASK; } else { fid = data->acpi_data.states[i].control & FID_MASK; vid = (data->acpi_data.states[i].control >> VID_SHIFT) & VID_MASK; @@ -916,11 +780,13 @@ static int fill_powernow_table_fidvid(struct powernow_k8_data *data, struct cpuf /* verify only 1 entry from the lo frequency table */ if (fid < HI_FID_TABLE_BOTTOM) { if (cntlofreq) { - /* if both entries are the same, ignore this one ... */ + /* if both entries are the same, ignore this + * one... + */ if ((powernow_table[i].frequency != powernow_table[cntlofreq].frequency) || (powernow_table[i].index != powernow_table[cntlofreq].index)) { printk(KERN_ERR PFX "Too many lo freq table entries\n"); - return 1; + goto err_out_mem; } dprintk("double low frequency table entry, ignoring it.\n"); @@ -938,7 +804,31 @@ static int fill_powernow_table_fidvid(struct powernow_k8_data *data, struct cpuf continue; } } + + powernow_table[data->acpi_data.state_count].frequency = CPUFREQ_TABLE_END; + powernow_table[data->acpi_data.state_count].index = 0; + data->powernow_table = powernow_table; + + /* fill in data */ + data->numps = data->acpi_data.state_count; + print_basics(data); + powernow_k8_acpi_pst_values(data, 0); + + /* notify BIOS that we exist */ + acpi_processor_notify_smm(THIS_MODULE); + return 0; + +err_out_mem: + kfree(powernow_table); + +err_out: + acpi_processor_unregister_performance(&data->acpi_data, data->cpu); + + /* data->acpi_data.state_count informs us at ->exit() whether ACPI was used */ + data->acpi_data.state_count = 0; + + return -ENODEV; } static void powernow_k8_cpu_exit_acpi(struct powernow_k8_data *data) @@ -954,20 +844,20 @@ static void powernow_k8_acpi_pst_values(struct powernow_k8_data *data, unsigned #endif /* CONFIG_X86_POWERNOW_K8_ACPI */ /* Take a frequency, and issue the fid/vid transition command */ -static int transition_frequency_fidvid(struct powernow_k8_data *data, unsigned int index) +static int transition_frequency(struct powernow_k8_data *data, unsigned int index) { - u32 fid = 0; - u32 vid = 0; + u32 fid; + u32 vid; int res, i; struct cpufreq_freqs freqs; dprintk("cpu %d transition to index %u\n", smp_processor_id(), index); - /* fid/vid correctness check for k8 */ /* fid are the lower 8 bits of the index we stored into - * the cpufreq frequency table in find_psb_table, vid - * are the upper 8 bits. + * the cpufreq frequency table in find_psb_table, vid are + * the upper 8 bits. */ + fid = data->powernow_table[index].index & 0xFF; vid = (data->powernow_table[index].index & 0xFF00) >> 8; @@ -991,58 +881,22 @@ static int transition_frequency_fidvid(struct powernow_k8_data *data, unsigned i dprintk("cpu %d, changing to fid 0x%x, vid 0x%x\n", smp_processor_id(), fid, vid); + + freqs.cpu = data->cpu; freqs.old = find_khz_freq_from_fid(data->currfid); freqs.new = find_khz_freq_from_fid(fid); - - for_each_cpu_mask(i, *(data->available_cores)) { + for_each_cpu_mask(i, cpu_core_map[data->cpu]) { freqs.cpu = i; cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE); } res = transition_fid_vid(data, fid, vid); - freqs.new = find_khz_freq_from_fid(data->currfid); - for_each_cpu_mask(i, *(data->available_cores)) { - freqs.cpu = i; - cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE); - } - return res; -} - -/* Take a frequency, and issue the hardware pstate transition command */ -static int transition_frequency_pstate(struct powernow_k8_data *data, unsigned int index) -{ - u32 fid = 0; - u32 did = 0; - u32 pstate = 0; - int res, i; - struct cpufreq_freqs freqs; - - dprintk("cpu %d transition to index %u\n", smp_processor_id(), index); - - /* get fid did for hardware pstate transition */ - pstate = index & HW_PSTATE_MASK; - if (pstate > MAX_HW_PSTATE) - return 0; - fid = (index & HW_FID_INDEX_MASK) >> HW_FID_INDEX_SHIFT; - did = (index & HW_DID_INDEX_MASK) >> HW_DID_INDEX_SHIFT; - freqs.old = find_khz_freq_from_fiddid(data->currfid, data->currdid); - freqs.new = find_khz_freq_from_fiddid(fid, did); - - for_each_cpu_mask(i, *(data->available_cores)) { - freqs.cpu = i; - cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE); - } - - res = transition_pstate(data, pstate); - data->currfid = find_fid_from_pstate(pstate); - data->currdid = find_did_from_pstate(pstate); - freqs.new = find_khz_freq_from_fiddid(data->currfid, data->currdid); - - for_each_cpu_mask(i, *(data->available_cores)) { + freqs.new = find_khz_freq_from_fid(data->currfid); + for_each_cpu_mask(i, cpu_core_map[data->cpu]) { freqs.cpu = i; cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE); - } + } return res; } @@ -1051,16 +905,11 @@ static int powernowk8_target(struct cpufreq_policy *pol, unsigned targfreq, unsi { cpumask_t oldmask = CPU_MASK_ALL; struct powernow_k8_data *data = powernow_data[pol->cpu]; - u32 checkfid; - u32 checkvid; + u32 checkfid = data->currfid; + u32 checkvid = data->currvid; unsigned int newstate; int ret = -EIO; - - if (!data) - return -EINVAL; - - checkfid = data->currfid; - checkvid = data->currvid; + int i; /* only run on specific CPU from here on */ oldmask = current->cpus_allowed; @@ -1079,46 +928,42 @@ static int powernowk8_target(struct cpufreq_policy *pol, unsigned targfreq, unsi dprintk("targ: cpu %d, %d kHz, min %d, max %d, relation %d\n", pol->cpu, targfreq, pol->min, pol->max, relation); - if (query_current_values_with_pending_wait(data)) + if (query_current_values_with_pending_wait(data)) { + ret = -EIO; goto err_out; + } - if (cpu_family == CPU_HW_PSTATE) - dprintk("targ: curr fid 0x%x, did 0x%x\n", - data->currfid, data->currvid); - else { - dprintk("targ: curr fid 0x%x, vid 0x%x\n", + dprintk("targ: curr fid 0x%x, vid 0x%x\n", data->currfid, data->currvid); - if ((checkvid != data->currvid) || (checkfid != data->currfid)) { - printk(KERN_INFO PFX - "error - out of sync, fix 0x%x 0x%x, vid 0x%x 0x%x\n", - checkfid, data->currfid, checkvid, data->currvid); - } + if ((checkvid != data->currvid) || (checkfid != data->currfid)) { + printk(KERN_INFO PFX + "error - out of sync, fix 0x%x 0x%x, vid 0x%x 0x%x\n", + checkfid, data->currfid, checkvid, data->currvid); } if (cpufreq_frequency_table_target(pol, data->powernow_table, targfreq, relation, &newstate)) goto err_out; - mutex_lock(&fidvid_mutex); + down(&fidvid_sem); powernow_k8_acpi_pst_values(data, newstate); - if (cpu_family == CPU_HW_PSTATE) - ret = transition_frequency_pstate(data, newstate); - else - ret = transition_frequency_fidvid(data, newstate); - if (ret) { + if (transition_frequency(data, newstate)) { printk(KERN_ERR PFX "transition frequency failed\n"); ret = 1; - mutex_unlock(&fidvid_mutex); + up(&fidvid_sem); goto err_out; } - mutex_unlock(&fidvid_mutex); - if (cpu_family == CPU_HW_PSTATE) - pol->cur = find_khz_freq_from_fiddid(data->currfid, data->currdid); - else - pol->cur = find_khz_freq_from_fid(data->currfid); + /* Update all the fid/vids of our siblings */ + for_each_cpu_mask(i, cpu_core_map[pol->cpu]) { + powernow_data[i]->currvid = data->currvid; + powernow_data[i]->currfid = data->currfid; + } + up(&fidvid_sem); + + pol->cur = find_khz_freq_from_fid(data->currfid); ret = 0; err_out: @@ -1131,9 +976,6 @@ static int powernowk8_verify(struct cpufreq_policy *pol) { struct powernow_k8_data *data = powernow_data[pol->cpu]; - if (!data) - return -EINVAL; - return cpufreq_frequency_table_verify(pol, data->powernow_table); } @@ -1142,7 +984,7 @@ static int __cpuinit powernowk8_cpu_init(struct cpufreq_policy *pol) { struct powernow_k8_data *data; cpumask_t oldmask = CPU_MASK_ALL; - int rc; + int rc, i; if (!cpu_online(pol->cpu)) return -ENODEV; @@ -1163,13 +1005,14 @@ static int __cpuinit powernowk8_cpu_init(struct cpufreq_policy *pol) * Use the PSB BIOS structure. This is only availabe on * an UP version, and is deprecated by AMD. */ + if (num_online_cpus() != 1) { printk(KERN_ERR PFX "MP systems not supported by PSB BIOS structure\n"); kfree(data); return -ENODEV; } if (pol->cpu != 0) { - printk(KERN_ERR PFX "No _PSS objects for CPU other than CPU0\n"); + printk(KERN_ERR PFX "init not cpu 0\n"); kfree(data); return -ENODEV; } @@ -1197,28 +1040,20 @@ static int __cpuinit powernowk8_cpu_init(struct cpufreq_policy *pol) if (query_current_values_with_pending_wait(data)) goto err_out; - if (cpu_family == CPU_OPTERON) - fidvid_msr_init(); + fidvid_msr_init(); /* run on any CPU again */ set_cpus_allowed(current, oldmask); pol->governor = CPUFREQ_DEFAULT_GOVERNOR; - if (cpu_family == CPU_HW_PSTATE) - pol->cpus = cpumask_of_cpu(pol->cpu); - else - pol->cpus = cpu_core_map[pol->cpu]; - data->available_cores = &(pol->cpus); + pol->cpus = cpu_core_map[pol->cpu]; - /* Take a crude guess here. + /* Take a crude guess here. * That guess was in microseconds, so multiply with 1000 */ pol->cpuinfo.transition_latency = (((data->rvo + 8) * data->vstable * VST_UNITS_20US) + (3 * (1 << data->irt) * 10)) * 1000; - if (cpu_family == CPU_HW_PSTATE) - pol->cur = find_khz_freq_from_fiddid(data->currfid, data->currdid); - else - pol->cur = find_khz_freq_from_fid(data->currfid); + pol->cur = find_khz_freq_from_fid(data->currfid); dprintk("policy current frequency %d kHz\n", pol->cur); /* min/max the cpu is capable of */ @@ -1232,14 +1067,12 @@ static int __cpuinit powernowk8_cpu_init(struct cpufreq_policy *pol) cpufreq_frequency_table_get_attr(data->powernow_table, pol->cpu); - if (cpu_family == CPU_HW_PSTATE) - dprintk("cpu_init done, current fid 0x%x, did 0x%x\n", - data->currfid, data->currdid); - else - dprintk("cpu_init done, current fid 0x%x, vid 0x%x\n", - data->currfid, data->currvid); + printk("cpu_init done, current fid 0x%x, vid 0x%x\n", + data->currfid, data->currvid); - powernow_data[pol->cpu] = data; + for_each_cpu_mask(i, cpu_core_map[pol->cpu]) { + powernow_data[i] = data; + } return 0; @@ -1270,15 +1103,10 @@ static int __devexit powernowk8_cpu_exit (struct cpufreq_policy *pol) static unsigned int powernowk8_get (unsigned int cpu) { - struct powernow_k8_data *data; + struct powernow_k8_data *data = powernow_data[cpu]; cpumask_t oldmask = current->cpus_allowed; unsigned int khz = 0; - data = powernow_data[first_cpu(cpu_core_map[cpu])]; - - if (!data) - return -EINVAL; - set_cpus_allowed(current, cpumask_of_cpu(cpu)); if (smp_processor_id() != cpu) { printk(KERN_ERR PFX "limiting to CPU %d failed in powernowk8_get\n", cpu); @@ -1317,15 +1145,16 @@ static int __cpuinit powernowk8_init(void) { unsigned int i, supported_cpus = 0; - for_each_online_cpu(i) { + for (i=0; icpus - * structure */ - cpumask_t *available_cores; }; @@ -47,7 +43,6 @@ struct powernow_k8_data { #define CPUID_XFAM_K8 0 #define CPUID_XMOD 0x000f0000 /* extended model */ #define CPUID_XMOD_REV_G 0x00060000 -#define CPUID_XFAM_10H 0x00100000 /* family 0x10 */ #define CPUID_USE_XFAM_XMOD 0x00000f00 #define CPUID_GET_MAX_CAPABILITIES 0x80000000 #define CPUID_FREQ_VOLT_CAPABILITIES 0x80000007 @@ -68,7 +63,7 @@ struct powernow_k8_data { #define MSR_C_LO_VID_SHIFT 8 /* Field definitions within the FID VID High Control MSR : */ -#define MSR_C_HI_STP_GNT_TO 0x000fffff +#define MSR_C_HI_STP_GNT_TO 0x000fffff /* Field definitions within the FID VID Low Status MSR : */ #define MSR_S_LO_CHANGE_PENDING 0x80000000 /* cleared when completed */ @@ -84,32 +79,6 @@ struct powernow_k8_data { #define MSR_S_HI_CURRENT_VID 0x0000003f #define MSR_C_HI_STP_GNT_BENIGN 0x00000001 - -/* Hardware Pstate _PSS and MSR definitions */ -#define USE_HW_PSTATE 0x00000080 -#define HW_PSTATE_FID_MASK 0x0000003f -#define HW_PSTATE_DID_MASK 0x000001c0 -#define HW_PSTATE_DID_SHIFT 6 -#define HW_PSTATE_MASK 0x00000007 -#define HW_PSTATE_VALID_MASK 0x80000000 -#define HW_FID_INDEX_SHIFT 8 -#define HW_FID_INDEX_MASK 0x0000ff00 -#define HW_DID_INDEX_SHIFT 16 -#define HW_DID_INDEX_MASK 0x00ff0000 -#define HW_WATTS_MASK 0xff -#define HW_PWR_DVR_MASK 0x300 -#define HW_PWR_DVR_SHIFT 8 -#define HW_PWR_MAX_MULT 3 -#define MAX_HW_PSTATE 8 /* hw pstate supports up to 8 */ -#define MSR_PSTATE_DEF_BASE 0xc0010064 /* base of Pstate MSRs */ -#define MSR_PSTATE_STATUS 0xc0010063 /* Pstate Status MSR */ -#define MSR_PSTATE_CTRL 0xc0010062 /* Pstate control MSR */ - -/* define the two driver architectures */ -#define CPU_OPTERON 0 -#define CPU_HW_PSTATE 1 - - /* * There are restrictions frequencies have to follow: * - only 1 entry in the low fid table ( <=1.4GHz ) @@ -154,7 +123,7 @@ struct powernow_k8_data { * Most values of interest are enocoded in a single field of the _PSS * entries: the "control" value. */ - + #define IRT_SHIFT 30 #define RVO_SHIFT 28 #define EXT_TYPE_SHIFT 27 @@ -169,9 +138,7 @@ struct powernow_k8_data { #define MVS_MASK 3 #define VST_MASK 0x7f #define VID_MASK 0x1f -#define FID_MASK 0x1f -#define EXT_VID_MASK 0x3f -#define EXT_FID_MASK 0x3f +#define FID_MASK 0x3f /* @@ -215,9 +182,10 @@ static int core_frequency_transition(struct powernow_k8_data *data, u32 reqfid); static void powernow_k8_acpi_pst_values(struct powernow_k8_data *data, unsigned int index); -static int fill_powernow_table_pstate(struct powernow_k8_data *data, struct cpufreq_frequency_table *powernow_table); -static int fill_powernow_table_fidvid(struct powernow_k8_data *data, struct cpufreq_frequency_table *powernow_table); - +#ifndef for_each_cpu_mask +#define for_each_cpu_mask(i,mask) for (i=0;i<1;i++) +#endif + #ifdef CONFIG_SMP static inline void define_siblings(int cpu, cpumask_t cpu_sharedcore_mask[]) { diff --git a/arch/i386/kernel/cpu/cpufreq/speedstep-centrino.c b/arch/i386/kernel/cpu/cpufreq/speedstep-centrino.c index b77f1358b..c173c0fa1 100644 --- a/arch/i386/kernel/cpu/cpufreq/speedstep-centrino.c +++ b/arch/i386/kernel/cpu/cpufreq/speedstep-centrino.c @@ -2,21 +2,26 @@ * cpufreq driver for Enhanced SpeedStep, as found in Intel's Pentium * M (part of the Centrino chipset). * - * Since the original Pentium M, most new Intel CPUs support Enhanced - * SpeedStep. - * * Despite the "SpeedStep" in the name, this is almost entirely unlike * traditional SpeedStep. * * Modelled on speedstep.c * * Copyright (C) 2003 Jeremy Fitzhardinge + * + * WARNING WARNING WARNING + * + * This driver manipulates the PERF_CTL MSR, which is only somewhat + * documented. While it seems to work on my laptop, it has not been + * tested anywhere else, and it may not work for you, do strange + * things or simply crash. */ #include #include #include #include +#include #include /* current */ #include #include @@ -31,7 +36,7 @@ #include #define PFX "speedstep-centrino: " -#define MAINTAINER "cpufreq@lists.linux.org.uk" +#define MAINTAINER "Jeremy Fitzhardinge " #define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_DRIVER, "speedstep-centrino", msg) @@ -245,7 +250,7 @@ static int centrino_cpu_init_table(struct cpufreq_policy *policy) if (model->cpu_id == NULL) { /* No match at all */ - dprintk("no support for CPU model \"%s\": " + dprintk(KERN_INFO PFX "no support for CPU model \"%s\": " "send /proc/cpuinfo to " MAINTAINER "\n", cpu->x86_model_id); return -ENOENT; @@ -253,10 +258,10 @@ static int centrino_cpu_init_table(struct cpufreq_policy *policy) if (model->op_points == NULL) { /* Matched a non-match */ - dprintk("no table support for CPU model \"%s\"\n", + dprintk(KERN_INFO PFX "no table support for CPU model \"%s\"\n", cpu->x86_model_id); #ifndef CONFIG_X86_SPEEDSTEP_CENTRINO_ACPI - dprintk("try compiling with CONFIG_X86_SPEEDSTEP_CENTRINO_ACPI enabled\n"); + dprintk(KERN_INFO PFX "try compiling with CONFIG_X86_SPEEDSTEP_CENTRINO_ACPI enabled\n"); #endif return -ENOENT; } @@ -346,36 +351,7 @@ static unsigned int get_cur_freq(unsigned int cpu) #ifdef CONFIG_X86_SPEEDSTEP_CENTRINO_ACPI -static struct acpi_processor_performance *acpi_perf_data[NR_CPUS]; - -/* - * centrino_cpu_early_init_acpi - Do the preregistering with ACPI P-States - * library - * - * Before doing the actual init, we need to do _PSD related setup whenever - * supported by the BIOS. These are handled by this early_init routine. - */ -static int centrino_cpu_early_init_acpi(void) -{ - unsigned int i, j; - struct acpi_processor_performance *data; - - for_each_possible_cpu(i) { - data = kzalloc(sizeof(struct acpi_processor_performance), - GFP_KERNEL); - if (!data) { - for_each_possible_cpu(j) { - kfree(acpi_perf_data[j]); - acpi_perf_data[j] = NULL; - } - return (-ENOMEM); - } - acpi_perf_data[i] = data; - } - - acpi_processor_preregister_performance(acpi_perf_data); - return 0; -} +static struct acpi_processor_performance p; /* * centrino_cpu_init_acpi - register with ACPI P-States library @@ -389,57 +365,46 @@ static int centrino_cpu_init_acpi(struct cpufreq_policy *policy) unsigned long cur_freq; int result = 0, i; unsigned int cpu = policy->cpu; - struct acpi_processor_performance *p; - - p = acpi_perf_data[cpu]; /* register with ACPI core */ - if (acpi_processor_register_performance(p, cpu)) { - dprintk(PFX "obtaining ACPI data failed\n"); + if (acpi_processor_register_performance(&p, cpu)) { + dprintk(KERN_INFO PFX "obtaining ACPI data failed\n"); return -EIO; } - policy->shared_type = p->shared_type; - /* - * Will let policy->cpus know about dependency only when software - * coordination is required. - */ - if (policy->shared_type == CPUFREQ_SHARED_TYPE_ALL || - policy->shared_type == CPUFREQ_SHARED_TYPE_ANY) - policy->cpus = p->shared_cpu_map; /* verify the acpi_data */ - if (p->state_count <= 1) { + if (p.state_count <= 1) { dprintk("No P-States\n"); result = -ENODEV; goto err_unreg; } - if ((p->control_register.space_id != ACPI_ADR_SPACE_FIXED_HARDWARE) || - (p->status_register.space_id != ACPI_ADR_SPACE_FIXED_HARDWARE)) { + if ((p.control_register.space_id != ACPI_ADR_SPACE_FIXED_HARDWARE) || + (p.status_register.space_id != ACPI_ADR_SPACE_FIXED_HARDWARE)) { dprintk("Invalid control/status registers (%x - %x)\n", - p->control_register.space_id, p->status_register.space_id); + p.control_register.space_id, p.status_register.space_id); result = -EIO; goto err_unreg; } - for (i=0; istate_count; i++) { - if (p->states[i].control != p->states[i].status) { + for (i=0; istates[i].control, p->states[i].status); + p.states[i].control, p.states[i].status); result = -EINVAL; goto err_unreg; } - if (!p->states[i].core_frequency) { + if (!p.states[i].core_frequency) { dprintk("Zero core frequency for state %u\n", i); result = -EINVAL; goto err_unreg; } - if (p->states[i].core_frequency > p->states[0].core_frequency) { + if (p.states[i].core_frequency > p.states[0].core_frequency) { dprintk("P%u has larger frequency (%llu) than P0 (%llu), skipping\n", i, - p->states[i].core_frequency, p->states[0].core_frequency); - p->states[i].core_frequency = 0; + p.states[i].core_frequency, p.states[0].core_frequency); + p.states[i].core_frequency = 0; continue; } } @@ -451,26 +416,26 @@ static int centrino_cpu_init_acpi(struct cpufreq_policy *policy) } centrino_model[cpu]->model_name=NULL; - centrino_model[cpu]->max_freq = p->states[0].core_frequency * 1000; + centrino_model[cpu]->max_freq = p.states[0].core_frequency * 1000; centrino_model[cpu]->op_points = kmalloc(sizeof(struct cpufreq_frequency_table) * - (p->state_count + 1), GFP_KERNEL); + (p.state_count + 1), GFP_KERNEL); if (!centrino_model[cpu]->op_points) { result = -ENOMEM; goto err_kfree; } - for (i=0; istate_count; i++) { - centrino_model[cpu]->op_points[i].index = p->states[i].control; - centrino_model[cpu]->op_points[i].frequency = p->states[i].core_frequency * 1000; + for (i=0; iop_points[i].index = p.states[i].control; + centrino_model[cpu]->op_points[i].frequency = p.states[i].core_frequency * 1000; dprintk("adding state %i with frequency %u and control value %04x\n", i, centrino_model[cpu]->op_points[i].frequency, centrino_model[cpu]->op_points[i].index); } - centrino_model[cpu]->op_points[p->state_count].frequency = CPUFREQ_TABLE_END; + centrino_model[cpu]->op_points[p.state_count].frequency = CPUFREQ_TABLE_END; cur_freq = get_cur_freq(cpu); - for (i=0; istate_count; i++) { - if (!p->states[i].core_frequency) { + for (i=0; iop_points[i].frequency = CPUFREQ_ENTRY_INVALID; continue; @@ -486,7 +451,7 @@ static int centrino_cpu_init_acpi(struct cpufreq_policy *policy) } if (cur_freq == centrino_model[cpu]->op_points[i].frequency) - p->state = i; + p.state = i; } /* notify BIOS that we exist */ @@ -499,13 +464,12 @@ static int centrino_cpu_init_acpi(struct cpufreq_policy *policy) err_kfree: kfree(centrino_model[cpu]); err_unreg: - acpi_processor_unregister_performance(p, cpu); - dprintk(PFX "invalid ACPI data\n"); + acpi_processor_unregister_performance(&p, cpu); + dprintk(KERN_INFO PFX "invalid ACPI data\n"); return (result); } #else static inline int centrino_cpu_init_acpi(struct cpufreq_policy *policy) { return -ENODEV; } -static inline int centrino_cpu_early_init_acpi(void) { return 0; } #endif static int centrino_cpu_init(struct cpufreq_policy *policy) @@ -515,13 +479,15 @@ static int centrino_cpu_init(struct cpufreq_policy *policy) unsigned l, h; int ret; int i; + struct cpuinfo_x86 *c = &cpu_data[policy->cpu]; /* Only Intel makes Enhanced Speedstep-capable CPUs */ if (cpu->x86_vendor != X86_VENDOR_INTEL || !cpu_has(cpu, X86_FEATURE_EST)) return -ENODEV; - if (cpu_has(cpu, X86_FEATURE_CONSTANT_TSC)) + if (cpu_has(c, X86_FEATURE_CONSTANT_TSC)) { centrino_driver.flags |= CPUFREQ_CONST_LOOPS; + } if (centrino_cpu_init_acpi(policy)) { if (policy->cpu != 0) @@ -535,7 +501,7 @@ static int centrino_cpu_init(struct cpufreq_policy *policy) centrino_cpu[policy->cpu] = &cpu_ids[i]; if (!centrino_cpu[policy->cpu]) { - dprintk("found unsupported CPU with " + dprintk(KERN_INFO PFX "found unsupported CPU with " "Enhanced SpeedStep: send /proc/cpuinfo to " MAINTAINER "\n"); return -ENODEV; @@ -591,15 +557,10 @@ static int centrino_cpu_exit(struct cpufreq_policy *policy) #ifdef CONFIG_X86_SPEEDSTEP_CENTRINO_ACPI if (!centrino_model[cpu]->model_name) { - static struct acpi_processor_performance *p; - - if (acpi_perf_data[cpu]) { - p = acpi_perf_data[cpu]; - dprintk("unregistering and freeing ACPI data\n"); - acpi_processor_unregister_performance(p, cpu); - kfree(centrino_model[cpu]->op_points); - kfree(centrino_model[cpu]); - } + dprintk("unregistering and freeing ACPI data\n"); + acpi_processor_unregister_performance(&p, cpu); + kfree(centrino_model[cpu]->op_points); + kfree(centrino_model[cpu]); } #endif @@ -633,128 +594,63 @@ static int centrino_target (struct cpufreq_policy *policy, unsigned int relation) { unsigned int newstate = 0; - unsigned int msr, oldmsr = 0, h = 0, cpu = policy->cpu; + unsigned int msr, oldmsr, h, cpu = policy->cpu; struct cpufreq_freqs freqs; - cpumask_t online_policy_cpus; cpumask_t saved_mask; - cpumask_t set_mask; - cpumask_t covered_cpus; - int retval = 0; - unsigned int j, k, first_cpu, tmp; + int retval; - if (unlikely(centrino_model[cpu] == NULL)) + if (centrino_model[cpu] == NULL) return -ENODEV; - if (unlikely(cpufreq_frequency_table_target(policy, - centrino_model[cpu]->op_points, - target_freq, - relation, - &newstate))) { - return -EINVAL; + /* + * Support for SMP systems. + * Make sure we are running on the CPU that wants to change frequency + */ + saved_mask = current->cpus_allowed; + set_cpus_allowed(current, policy->cpus); + if (!cpu_isset(smp_processor_id(), policy->cpus)) { + dprintk("couldn't limit to CPUs in this domain\n"); + return(-EAGAIN); } -#ifdef CONFIG_HOTPLUG_CPU - /* cpufreq holds the hotplug lock, so we are safe from here on */ - cpus_and(online_policy_cpus, cpu_online_map, policy->cpus); -#else - online_policy_cpus = policy->cpus; -#endif + if (cpufreq_frequency_table_target(policy, centrino_model[cpu]->op_points, target_freq, + relation, &newstate)) { + retval = -EINVAL; + goto migrate_end; + } - saved_mask = current->cpus_allowed; - first_cpu = 1; - cpus_clear(covered_cpus); - for_each_cpu_mask(j, online_policy_cpus) { - /* - * Support for SMP systems. - * Make sure we are running on CPU that wants to change freq - */ - cpus_clear(set_mask); - if (policy->shared_type == CPUFREQ_SHARED_TYPE_ANY) - cpus_or(set_mask, set_mask, online_policy_cpus); - else - cpu_set(j, set_mask); - - set_cpus_allowed(current, set_mask); - if (unlikely(!cpu_isset(smp_processor_id(), set_mask))) { - dprintk("couldn't limit to CPUs in this domain\n"); - retval = -EAGAIN; - if (first_cpu) { - /* We haven't started the transition yet. */ - goto migrate_end; - } - break; - } + msr = centrino_model[cpu]->op_points[newstate].index; + rdmsr(MSR_IA32_PERF_CTL, oldmsr, h); - msr = centrino_model[cpu]->op_points[newstate].index; - - if (first_cpu) { - rdmsr(MSR_IA32_PERF_CTL, oldmsr, h); - if (msr == (oldmsr & 0xffff)) { - dprintk("no change needed - msr was and needs " - "to be %x\n", oldmsr); - retval = 0; - goto migrate_end; - } - - freqs.old = extract_clock(oldmsr, cpu, 0); - freqs.new = extract_clock(msr, cpu, 0); - - dprintk("target=%dkHz old=%d new=%d msr=%04x\n", - target_freq, freqs.old, freqs.new, msr); - - for_each_cpu_mask(k, online_policy_cpus) { - freqs.cpu = k; - cpufreq_notify_transition(&freqs, - CPUFREQ_PRECHANGE); - } - - first_cpu = 0; - /* all but 16 LSB are reserved, treat them with care */ - oldmsr &= ~0xffff; - msr &= 0xffff; - oldmsr |= msr; - } + if (msr == (oldmsr & 0xffff)) { + retval = 0; + dprintk("no change needed - msr was and needs to be %x\n", oldmsr); + goto migrate_end; + } - wrmsr(MSR_IA32_PERF_CTL, oldmsr, h); - if (policy->shared_type == CPUFREQ_SHARED_TYPE_ANY) - break; + freqs.cpu = cpu; + freqs.old = extract_clock(oldmsr, cpu, 0); + freqs.new = extract_clock(msr, cpu, 0); - cpu_set(j, covered_cpus); - } + dprintk("target=%dkHz old=%d new=%d msr=%04x\n", + target_freq, freqs.old, freqs.new, msr); - for_each_cpu_mask(k, online_policy_cpus) { - freqs.cpu = k; - cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE); - } + cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE); - if (unlikely(retval)) { - /* - * We have failed halfway through the frequency change. - * We have sent callbacks to policy->cpus and - * MSRs have already been written on coverd_cpus. - * Best effort undo.. - */ + /* all but 16 LSB are "reserved", so treat them with + care */ + oldmsr &= ~0xffff; + msr &= 0xffff; + oldmsr |= msr; - if (!cpus_empty(covered_cpus)) { - for_each_cpu_mask(j, covered_cpus) { - set_cpus_allowed(current, cpumask_of_cpu(j)); - wrmsr(MSR_IA32_PERF_CTL, oldmsr, h); - } - } + wrmsr(MSR_IA32_PERF_CTL, oldmsr, h); - tmp = freqs.new; - freqs.new = freqs.old; - freqs.old = tmp; - for_each_cpu_mask(j, online_policy_cpus) { - freqs.cpu = j; - cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE); - cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE); - } - } + cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE); + retval = 0; migrate_end: set_cpus_allowed(current, saved_mask); - return 0; + return (retval); } static struct freq_attr* centrino_attr[] = { @@ -796,25 +692,12 @@ static int __init centrino_init(void) if (!cpu_has(cpu, X86_FEATURE_EST)) return -ENODEV; - centrino_cpu_early_init_acpi(); - return cpufreq_register_driver(¢rino_driver); } static void __exit centrino_exit(void) { -#ifdef CONFIG_X86_SPEEDSTEP_CENTRINO_ACPI - unsigned int j; -#endif - cpufreq_unregister_driver(¢rino_driver); - -#ifdef CONFIG_X86_SPEEDSTEP_CENTRINO_ACPI - for_each_possible_cpu(j) { - kfree(acpi_perf_data[j]); - acpi_perf_data[j] = NULL; - } -#endif } MODULE_AUTHOR ("Jeremy Fitzhardinge "); diff --git a/arch/i386/kernel/cpu/cpufreq/speedstep-lib.c b/arch/i386/kernel/cpu/cpufreq/speedstep-lib.c index 4f46cac15..7c47005a1 100644 --- a/arch/i386/kernel/cpu/cpufreq/speedstep-lib.c +++ b/arch/i386/kernel/cpu/cpufreq/speedstep-lib.c @@ -9,7 +9,7 @@ */ #include -#include +#include #include #include #include @@ -36,8 +36,8 @@ static unsigned int pentium3_get_frequency (unsigned int processor) /* See table 14 of p3_ds.pdf and table 22 of 29834003.pdf */ struct { unsigned int ratio; /* Frequency Multiplier (x10) */ - u8 bitmap; /* power on configuration bits - [27, 25:22] (in MSR 0x2a) */ + u8 bitmap; /* power on configuration bits + [27, 25:22] (in MSR 0x2a) */ } msr_decode_mult [] = { { 30, 0x01 }, { 35, 0x05 }, @@ -58,9 +58,9 @@ static unsigned int pentium3_get_frequency (unsigned int processor) /* PIII(-M) FSB settings: see table b1-b of 24547206.pdf */ struct { - unsigned int value; /* Front Side Bus speed in MHz */ - u8 bitmap; /* power on configuration bits [18: 19] - (in MSR 0x2a) */ + unsigned int value; /* Front Side Bus speed in MHz */ + u8 bitmap; /* power on configuration bits [18: 19] + (in MSR 0x2a) */ } msr_decode_fsb [] = { { 66, 0x0 }, { 100, 0x2 }, @@ -68,8 +68,8 @@ static unsigned int pentium3_get_frequency (unsigned int processor) { 0, 0xff} }; - u32 msr_lo, msr_tmp; - int i = 0, j = 0; + u32 msr_lo, msr_tmp; + int i = 0, j = 0; /* read MSR 0x2a - we only need the low 32 bits */ rdmsr(MSR_IA32_EBL_CR_POWERON, msr_lo, msr_tmp); @@ -106,7 +106,7 @@ static unsigned int pentium3_get_frequency (unsigned int processor) static unsigned int pentiumM_get_frequency(void) { - u32 msr_lo, msr_tmp; + u32 msr_lo, msr_tmp; rdmsr(MSR_IA32_EBL_CR_POWERON, msr_lo, msr_tmp); dprintk("PM - MSR_IA32_EBL_CR_POWERON: 0x%x 0x%x\n", msr_lo, msr_tmp); @@ -134,7 +134,7 @@ static unsigned int pentium4_get_frequency(void) dprintk("P4 - MSR_EBC_FREQUENCY_ID: 0x%x 0x%x\n", msr_lo, msr_hi); - /* decode the FSB: see IA-32 Intel (C) Architecture Software + /* decode the FSB: see IA-32 Intel (C) Architecture Software * Developer's Manual, Volume 3: System Prgramming Guide, * revision #12 in Table B-1: MSRs in the Pentium 4 and * Intel Xeon Processors, on page B-4 and B-5. @@ -170,7 +170,7 @@ static unsigned int pentium4_get_frequency(void) return (fsb * mult); } - + unsigned int speedstep_get_processor_frequency(unsigned int processor) { switch (processor) { @@ -198,11 +198,11 @@ EXPORT_SYMBOL_GPL(speedstep_get_processor_frequency); unsigned int speedstep_detect_processor (void) { struct cpuinfo_x86 *c = cpu_data; - u32 ebx, msr_lo, msr_hi; + u32 ebx, msr_lo, msr_hi; dprintk("x86: %x, model: %x\n", c->x86, c->x86_model); - if ((c->x86_vendor != X86_VENDOR_INTEL) || + if ((c->x86_vendor != X86_VENDOR_INTEL) || ((c->x86 != 6) && (c->x86 != 0xF))) return 0; @@ -218,15 +218,15 @@ unsigned int speedstep_detect_processor (void) dprintk("ebx value is %x, x86_mask is %x\n", ebx, c->x86_mask); switch (c->x86_mask) { - case 4: + case 4: /* - * B-stepping [M-P4-M] + * B-stepping [M-P4-M] * sample has ebx = 0x0f, production has 0x0e. */ if ((ebx == 0x0e) || (ebx == 0x0f)) return SPEEDSTEP_PROCESSOR_P4M; break; - case 7: + case 7: /* * C-stepping [M-P4-M] * needs to have ebx=0x0e, else it's a celeron: @@ -253,7 +253,7 @@ unsigned int speedstep_detect_processor (void) * also, M-P4M HTs have ebx=0x8, too * For now, they are distinguished by the model_id string */ - if ((ebx == 0x0e) || (strstr(c->x86_model_id,"Mobile Intel(R) Pentium(R) 4") != NULL)) + if ((ebx == 0x0e) || (strstr(c->x86_model_id,"Mobile Intel(R) Pentium(R) 4") != NULL)) return SPEEDSTEP_PROCESSOR_P4M; break; default: @@ -264,7 +264,8 @@ unsigned int speedstep_detect_processor (void) switch (c->x86_model) { case 0x0B: /* Intel PIII [Tualatin] */ - /* cpuid_ebx(1) is 0x04 for desktop PIII, 0x06 for mobile PIII-M */ + /* cpuid_ebx(1) is 0x04 for desktop PIII, + 0x06 for mobile PIII-M */ ebx = cpuid_ebx(0x00000001); dprintk("ebx is %x\n", ebx); @@ -274,8 +275,9 @@ unsigned int speedstep_detect_processor (void) return 0; /* So far all PIII-M processors support SpeedStep. See - * Intel's 24540640.pdf of June 2003 + * Intel's 24540640.pdf of June 2003 */ + return SPEEDSTEP_PROCESSOR_PIII_T; case 0x08: /* Intel PIII [Coppermine] */ @@ -397,7 +399,7 @@ unsigned int speedstep_get_freqs(unsigned int processor, } } -out: + out: local_irq_restore(flags); return (ret); } diff --git a/arch/i386/kernel/cpu/cpufreq/speedstep-lib.h b/arch/i386/kernel/cpu/cpufreq/speedstep-lib.h index b735429c5..6a727fd3a 100644 --- a/arch/i386/kernel/cpu/cpufreq/speedstep-lib.h +++ b/arch/i386/kernel/cpu/cpufreq/speedstep-lib.h @@ -14,7 +14,7 @@ #define SPEEDSTEP_PROCESSOR_PIII_C_EARLY 0x00000001 /* Coppermine core */ #define SPEEDSTEP_PROCESSOR_PIII_C 0x00000002 /* Coppermine core */ -#define SPEEDSTEP_PROCESSOR_PIII_T 0x00000003 /* Tualatin core */ +#define SPEEDSTEP_PROCESSOR_PIII_T 0x00000003 /* Tualatin core */ #define SPEEDSTEP_PROCESSOR_P4M 0x00000004 /* P4-M */ /* the following processors are not speedstep-capable and are not auto-detected @@ -25,8 +25,8 @@ /* speedstep states -- only two of them */ -#define SPEEDSTEP_HIGH 0x00000000 -#define SPEEDSTEP_LOW 0x00000001 +#define SPEEDSTEP_HIGH 0x00000000 +#define SPEEDSTEP_LOW 0x00000001 /* detect a speedstep-capable processor */ @@ -36,13 +36,13 @@ extern unsigned int speedstep_detect_processor (void); extern unsigned int speedstep_get_processor_frequency(unsigned int processor); -/* detect the low and high speeds of the processor. The callback - * set_state"'s first argument is either SPEEDSTEP_HIGH or - * SPEEDSTEP_LOW; the second argument is zero so that no +/* detect the low and high speeds of the processor. The callback + * set_state"'s first argument is either SPEEDSTEP_HIGH or + * SPEEDSTEP_LOW; the second argument is zero so that no * cpufreq_notify_transition calls are initiated. */ extern unsigned int speedstep_get_freqs(unsigned int processor, - unsigned int *low_speed, - unsigned int *high_speed, - unsigned int *transition_latency, - void (*set_state) (unsigned int state)); + unsigned int *low_speed, + unsigned int *high_speed, + unsigned int *transition_latency, + void (*set_state) (unsigned int state)); diff --git a/arch/i386/kernel/cpu/cpufreq/speedstep-smi.c b/arch/i386/kernel/cpu/cpufreq/speedstep-smi.c index ff0d89806..cfc4276e6 100644 --- a/arch/i386/kernel/cpu/cpufreq/speedstep-smi.c +++ b/arch/i386/kernel/cpu/cpufreq/speedstep-smi.c @@ -13,8 +13,8 @@ *********************************************************************/ #include -#include -#include +#include +#include #include #include #include @@ -28,21 +28,21 @@ * * These parameters are got from IST-SMI BIOS call. * If user gives it, these are used. - * + * */ -static int smi_port = 0; -static int smi_cmd = 0; -static unsigned int smi_sig = 0; +static int smi_port = 0; +static int smi_cmd = 0; +static unsigned int smi_sig = 0; /* info about the processor */ -static unsigned int speedstep_processor = 0; +static unsigned int speedstep_processor = 0; -/* - * There are only two frequency states for each processor. Values +/* + * There are only two frequency states for each processor. Values * are in kHz for the time being. */ static struct cpufreq_frequency_table speedstep_freqs[] = { - {SPEEDSTEP_HIGH, 0}, + {SPEEDSTEP_HIGH, 0}, {SPEEDSTEP_LOW, 0}, {0, CPUFREQ_TABLE_END}, }; @@ -125,7 +125,7 @@ static int speedstep_smi_get_freqs (unsigned int *low, unsigned int *high) *low = low_mhz * 1000; return result; -} +} /** * speedstep_get_state - set the SpeedStep state @@ -206,7 +206,7 @@ static void speedstep_set_state (unsigned int state) * speedstep_target - set a new CPUFreq policy * @policy: new policy * @target_freq: new freq - * @relation: + * @relation: * * Sets a new CPUFreq policy/freq. */ @@ -285,7 +285,7 @@ static int speedstep_cpu_init(struct cpufreq_policy *policy) state = speedstep_get_state(); speed = speedstep_freqs[state].frequency; - dprintk("currently at %s speed setting - %i MHz\n", + dprintk("currently at %s speed setting - %i MHz\n", (speed == speedstep_freqs[SPEEDSTEP_LOW].frequency) ? "low" : "high", (speed / 1000)); @@ -298,7 +298,7 @@ static int speedstep_cpu_init(struct cpufreq_policy *policy) if (result) return (result); - cpufreq_frequency_table_get_attr(speedstep_freqs, policy->cpu); + cpufreq_frequency_table_get_attr(speedstep_freqs, policy->cpu); return 0; } @@ -334,8 +334,8 @@ static struct freq_attr* speedstep_attr[] = { static struct cpufreq_driver speedstep_driver = { .name = "speedstep-smi", - .verify = speedstep_verify, - .target = speedstep_target, + .verify = speedstep_verify, + .target = speedstep_target, .init = speedstep_cpu_init, .exit = speedstep_cpu_exit, .get = speedstep_get, @@ -360,6 +360,9 @@ static int __init speedstep_init(void) case SPEEDSTEP_PROCESSOR_PIII_C: case SPEEDSTEP_PROCESSOR_PIII_C_EARLY: break; + case SPEEDSTEP_PROCESSOR_P4M: + printk(KERN_INFO "speedstep-smi: you're trying to use this cpufreq driver on a Pentium 4-based CPU. Most likely it will not work.\n"); + break; default: speedstep_processor = 0; } @@ -369,12 +372,13 @@ static int __init speedstep_init(void) return -ENODEV; } - dprintk("signature:0x%.8lx, command:0x%.8lx, event:0x%.8lx, perf_level:0x%.8lx.\n", + dprintk("signature:0x%.8lx, command:0x%.8lx, event:0x%.8lx, perf_level:0x%.8lx.\n", ist_info.signature, ist_info.command, ist_info.event, ist_info.perf_level); - /* Error if no IST-SMI BIOS or no PARM + + /* Error if no IST-SMI BIOS or no PARM sig= 'ISGE' aka 'Intel Speedstep Gate E' */ - if ((ist_info.signature != 0x47534943) && ( + if ((ist_info.signature != 0x47534943) && ( (smi_port == 0) || (smi_cmd == 0))) return -ENODEV; @@ -384,15 +388,17 @@ static int __init speedstep_init(void) smi_sig = ist_info.signature; /* setup smi_port from MODLULE_PARM or BIOS */ - if ((smi_port > 0xff) || (smi_port < 0)) + if ((smi_port > 0xff) || (smi_port < 0)) { return -EINVAL; - else if (smi_port == 0) + } else if (smi_port == 0) { smi_port = ist_info.command & 0xff; + } - if ((smi_cmd > 0xff) || (smi_cmd < 0)) + if ((smi_cmd > 0xff) || (smi_cmd < 0)) { return -EINVAL; - else if (smi_cmd == 0) + } else if (smi_cmd == 0) { smi_cmd = (ist_info.command >> 16) & 0xff; + } return cpufreq_register_driver(&speedstep_driver); } diff --git a/arch/i386/kernel/cpu/cyrix.c b/arch/i386/kernel/cpu/cyrix.c index f03b7f94c..00f2e0587 100644 --- a/arch/i386/kernel/cpu/cyrix.c +++ b/arch/i386/kernel/cpu/cyrix.c @@ -184,7 +184,7 @@ static void __init geode_configure(void) #ifdef CONFIG_PCI -static struct pci_device_id __initdata cyrix_55x0[] = { +static struct pci_device_id cyrix_55x0[] = { { PCI_DEVICE(PCI_VENDOR_ID_CYRIX, PCI_DEVICE_ID_CYRIX_5510) }, { PCI_DEVICE(PCI_VENDOR_ID_CYRIX, PCI_DEVICE_ID_CYRIX_5520) }, { }, @@ -272,15 +272,14 @@ static void __init init_cyrix(struct cpuinfo_x86 *c) printk(KERN_INFO "Working around Cyrix MediaGX virtual DMA bugs.\n"); isa_dma_bridge_buggy = 2; - - +#endif + c->x86_cache_size=16; /* Yep 16K integrated cache thats it */ + /* * The 5510/5520 companion chips have a funky PIT. */ if (pci_dev_present(cyrix_55x0)) pit_latch_buggy = 1; -#endif - c->x86_cache_size=16; /* Yep 16K integrated cache thats it */ /* GXm supports extended cpuid levels 'ala' AMD */ if (c->cpuid_level == 2) { @@ -354,7 +353,7 @@ static void __init init_nsc(struct cpuinfo_x86 *c) * This function only handles the GX processor, and kicks every * thing else to the Cyrix init function above - that should * cover any processors that might have been branded differently - * after NSC acquired Cyrix. + * after NSC aquired Cyrix. * * If this breaks your GX1 horribly, please e-mail * info-linux@ldcmail.amd.com to tell us. diff --git a/arch/i386/kernel/cpu/intel.c b/arch/i386/kernel/cpu/intel.c index 5a2e27092..8c0120186 100644 --- a/arch/i386/kernel/cpu/intel.c +++ b/arch/i386/kernel/cpu/intel.c @@ -1,3 +1,4 @@ +#include #include #include @@ -28,7 +29,7 @@ extern int trap_init_f00f_bug(void); struct movsl_mask movsl_mask __read_mostly; #endif -void __cpuinit early_intel_workaround(struct cpuinfo_x86 *c) +void __devinit early_intel_workaround(struct cpuinfo_x86 *c) { if (c->x86_vendor != X86_VENDOR_INTEL) return; @@ -43,7 +44,7 @@ void __cpuinit early_intel_workaround(struct cpuinfo_x86 *c) * This is called before we do cpu ident work */ -int __cpuinit ppro_with_ram_bug(void) +int __devinit ppro_with_ram_bug(void) { /* Uses data from early_cpu_detect now */ if (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL && @@ -61,7 +62,7 @@ int __cpuinit ppro_with_ram_bug(void) * P4 Xeon errata 037 workaround. * Hardware prefetcher may cause stale data to be loaded into the cache. */ -static void __cpuinit Intel_errata_workarounds(struct cpuinfo_x86 *c) +static void __devinit Intel_errata_workarounds(struct cpuinfo_x86 *c) { unsigned long lo, hi; @@ -80,7 +81,7 @@ static void __cpuinit Intel_errata_workarounds(struct cpuinfo_x86 *c) /* * find out the number of processor cores on the die */ -static int __cpuinit num_cpu_cores(struct cpuinfo_x86 *c) +static int __devinit num_cpu_cores(struct cpuinfo_x86 *c) { unsigned int eax, ebx, ecx, edx; @@ -95,7 +96,7 @@ static int __cpuinit num_cpu_cores(struct cpuinfo_x86 *c) return 1; } -static void __cpuinit init_intel(struct cpuinfo_x86 *c) +static void __devinit init_intel(struct cpuinfo_x86 *c) { unsigned int l2 = 0; char *p = NULL; @@ -121,12 +122,6 @@ static void __cpuinit init_intel(struct cpuinfo_x86 *c) select_idle_routine(c); l2 = init_intel_cacheinfo(c); - if (c->cpuid_level > 9 ) { - unsigned eax = cpuid_eax(10); - /* Check for version and the number of counters */ - if ((eax & 0xff) && (((eax>>8) & 0xff) > 1)) - set_bit(X86_FEATURE_ARCH_PERFMON, c->x86_capability); - } /* SEP CPUID bug: Pentium Pro reports SEP but doesn't have it until model 3 mask 3 */ if ((c->x86<<8 | c->x86_model<<4 | c->x86_mask) < 0x633) @@ -210,7 +205,7 @@ static unsigned int intel_size_cache(struct cpuinfo_x86 * c, unsigned int size) return size; } -static struct cpu_dev intel_cpu_dev __cpuinitdata = { +static struct cpu_dev intel_cpu_dev __devinitdata = { .c_vendor = "Intel", .c_ident = { "GenuineIntel" }, .c_models = { diff --git a/arch/i386/kernel/cpu/intel_cacheinfo.c b/arch/i386/kernel/cpu/intel_cacheinfo.c index 5c43be475..ffe58cee0 100644 --- a/arch/i386/kernel/cpu/intel_cacheinfo.c +++ b/arch/i386/kernel/cpu/intel_cacheinfo.c @@ -4,7 +4,6 @@ * Changes: * Venkatesh Pallipadi : Adding cache identification through cpuid(4) * Ashok Raj : Work with CPU hotplug infrastructure. - * Andi Kleen : CPUID4 emulation on AMD. */ #include @@ -131,111 +130,25 @@ struct _cpuid4_info { cpumask_t shared_cpu_map; }; -unsigned short num_cache_leaves; - -/* AMD doesn't have CPUID4. Emulate it here to report the same - information to the user. This makes some assumptions about the machine: - No L3, L2 not shared, no SMT etc. that is currently true on AMD CPUs. - - In theory the TLBs could be reported as fake type (they are in "dummy"). - Maybe later */ -union l1_cache { - struct { - unsigned line_size : 8; - unsigned lines_per_tag : 8; - unsigned assoc : 8; - unsigned size_in_kb : 8; - }; - unsigned val; -}; - -union l2_cache { - struct { - unsigned line_size : 8; - unsigned lines_per_tag : 4; - unsigned assoc : 4; - unsigned size_in_kb : 16; - }; - unsigned val; -}; - -static const unsigned short assocs[] = { - [1] = 1, [2] = 2, [4] = 4, [6] = 8, - [8] = 16, - [0xf] = 0xffff // ?? - }; -static const unsigned char levels[] = { 1, 1, 2 }; -static const unsigned char types[] = { 1, 2, 3 }; - -static void __cpuinit amd_cpuid4(int leaf, union _cpuid4_leaf_eax *eax, - union _cpuid4_leaf_ebx *ebx, - union _cpuid4_leaf_ecx *ecx) -{ - unsigned dummy; - unsigned line_size, lines_per_tag, assoc, size_in_kb; - union l1_cache l1i, l1d; - union l2_cache l2; - - eax->full = 0; - ebx->full = 0; - ecx->full = 0; - - cpuid(0x80000005, &dummy, &dummy, &l1d.val, &l1i.val); - cpuid(0x80000006, &dummy, &dummy, &l2.val, &dummy); - - if (leaf > 2 || !l1d.val || !l1i.val || !l2.val) - return; - - eax->split.is_self_initializing = 1; - eax->split.type = types[leaf]; - eax->split.level = levels[leaf]; - eax->split.num_threads_sharing = 0; - eax->split.num_cores_on_die = current_cpu_data.x86_max_cores - 1; - - if (leaf <= 1) { - union l1_cache *l1 = leaf == 0 ? &l1d : &l1i; - assoc = l1->assoc; - line_size = l1->line_size; - lines_per_tag = l1->lines_per_tag; - size_in_kb = l1->size_in_kb; - } else { - assoc = l2.assoc; - line_size = l2.line_size; - lines_per_tag = l2.lines_per_tag; - /* cpu_data has errata corrections for K7 applied */ - size_in_kb = current_cpu_data.x86_cache_size; - } - - if (assoc == 0xf) - eax->split.is_fully_associative = 1; - ebx->split.coherency_line_size = line_size - 1; - ebx->split.ways_of_associativity = assocs[assoc] - 1; - ebx->split.physical_line_partition = lines_per_tag - 1; - ecx->split.number_of_sets = (size_in_kb * 1024) / line_size / - (ebx->split.ways_of_associativity + 1) - 1; -} +static unsigned short num_cache_leaves; static int __cpuinit cpuid4_cache_lookup(int index, struct _cpuid4_info *this_leaf) { - union _cpuid4_leaf_eax eax; - union _cpuid4_leaf_ebx ebx; - union _cpuid4_leaf_ecx ecx; - unsigned edx; - - if (boot_cpu_data.x86_vendor == X86_VENDOR_AMD) - amd_cpuid4(index, &eax, &ebx, &ecx); - else - cpuid_count(4, index, &eax.full, &ebx.full, &ecx.full, &edx); - if (eax.split.type == CACHE_TYPE_NULL) + unsigned int eax, ebx, ecx, edx; + union _cpuid4_leaf_eax cache_eax; + + cpuid_count(4, index, &eax, &ebx, &ecx, &edx); + cache_eax.full = eax; + if (cache_eax.split.type == CACHE_TYPE_NULL) return -EIO; /* better error ? */ - this_leaf->eax = eax; - this_leaf->ebx = ebx; - this_leaf->ecx = ecx; - this_leaf->size = (ecx.split.number_of_sets + 1) * - (ebx.split.coherency_line_size + 1) * - (ebx.split.physical_line_partition + 1) * - (ebx.split.ways_of_associativity + 1); + this_leaf->eax.full = eax; + this_leaf->ebx.full = ebx; + this_leaf->ecx.full = ecx; + this_leaf->size = (this_leaf->ecx.split.number_of_sets + 1) * + (this_leaf->ebx.split.coherency_line_size + 1) * + (this_leaf->ebx.split.physical_line_partition + 1) * + (this_leaf->ebx.split.ways_of_associativity + 1); return 0; } @@ -260,12 +173,8 @@ unsigned int __cpuinit init_intel_cacheinfo(struct cpuinfo_x86 *c) unsigned int trace = 0, l1i = 0, l1d = 0, l2 = 0, l3 = 0; /* Cache sizes */ unsigned int new_l1d = 0, new_l1i = 0; /* Cache sizes from cpuid(4) */ unsigned int new_l2 = 0, new_l3 = 0, i; /* Cache sizes from cpuid(4) */ - unsigned int l2_id = 0, l3_id = 0, num_threads_sharing, index_msb; -#ifdef CONFIG_X86_HT - unsigned int cpu = (c == &boot_cpu_data) ? 0 : (c - cpu_data); -#endif - if (c->cpuid_level > 3) { + if (c->cpuid_level > 4) { static int is_initialized; if (is_initialized == 0) { @@ -296,15 +205,9 @@ unsigned int __cpuinit init_intel_cacheinfo(struct cpuinfo_x86 *c) break; case 2: new_l2 = this_leaf.size/1024; - num_threads_sharing = 1 + this_leaf.eax.split.num_threads_sharing; - index_msb = get_count_order(num_threads_sharing); - l2_id = c->apicid >> index_msb; break; case 3: new_l3 = this_leaf.size/1024; - num_threads_sharing = 1 + this_leaf.eax.split.num_threads_sharing; - index_msb = get_count_order(num_threads_sharing); - l3_id = c->apicid >> index_msb; break; default: break; @@ -312,19 +215,11 @@ unsigned int __cpuinit init_intel_cacheinfo(struct cpuinfo_x86 *c) } } } - /* - * Don't use cpuid2 if cpuid4 is supported. For P4, we use cpuid2 for - * trace cache - */ - if ((num_cache_leaves == 0 || c->x86 == 15) && c->cpuid_level > 1) { + if (c->cpuid_level > 1) { /* supports eax=2 call */ int i, j, n; int regs[4]; unsigned char *dp = (unsigned char *)regs; - int only_trace = 0; - - if (num_cache_leaves != 0 && c->x86 == 15) - only_trace = 1; /* Number of times to iterate */ n = cpuid_eax(2) & 0xFF; @@ -346,8 +241,6 @@ unsigned int __cpuinit init_intel_cacheinfo(struct cpuinfo_x86 *c) while (cache_table[k].descriptor != 0) { if (cache_table[k].descriptor == des) { - if (only_trace && cache_table[k].cache_type != LVL_TRACE) - break; switch (cache_table[k].cache_type) { case LVL_1_INST: l1i += cache_table[k].size; @@ -373,45 +266,34 @@ unsigned int __cpuinit init_intel_cacheinfo(struct cpuinfo_x86 *c) } } } - } - if (new_l1d) - l1d = new_l1d; + if (new_l1d) + l1d = new_l1d; - if (new_l1i) - l1i = new_l1i; + if (new_l1i) + l1i = new_l1i; - if (new_l2) { - l2 = new_l2; -#ifdef CONFIG_X86_HT - cpu_llc_id[cpu] = l2_id; -#endif - } + if (new_l2) + l2 = new_l2; - if (new_l3) { - l3 = new_l3; -#ifdef CONFIG_X86_HT - cpu_llc_id[cpu] = l3_id; -#endif - } - - if (trace) - printk (KERN_INFO "CPU: Trace cache: %dK uops", trace); - else if ( l1i ) - printk (KERN_INFO "CPU: L1 I cache: %dK", l1i); + if (new_l3) + l3 = new_l3; - if (l1d) - printk(", L1 D cache: %dK\n", l1d); - else - printk("\n"); + if ( trace ) + printk (KERN_INFO "CPU: Trace cache: %dK uops", trace); + else if ( l1i ) + printk (KERN_INFO "CPU: L1 I cache: %dK", l1i); + if ( l1d ) + printk(", L1 D cache: %dK\n", l1d); + else + printk("\n"); + if ( l2 ) + printk(KERN_INFO "CPU: L2 cache: %dK\n", l2); + if ( l3 ) + printk(KERN_INFO "CPU: L3 cache: %dK\n", l3); - if (l2) - printk(KERN_INFO "CPU: L2 cache: %dK\n", l2); - - if (l3) - printk(KERN_INFO "CPU: L3 cache: %dK\n", l3); - - c->x86_cache_size = l3 ? l3 : (l2 ? l2 : (l1i+l1d)); + c->x86_cache_size = l3 ? l3 : (l2 ? l2 : (l1i+l1d)); + } return l2; } @@ -448,7 +330,7 @@ static void __cpuinit cache_shared_cpu_map_setup(unsigned int cpu, int index) } } } -static void __cpuinit cache_remove_shared_cpu_map(unsigned int cpu, int index) +static void __devinit cache_remove_shared_cpu_map(unsigned int cpu, int index) { struct _cpuid4_info *this_leaf, *sibling_leaf; int sibling; @@ -747,7 +629,7 @@ static int __cpuinit cacheinfo_cpu_callback(struct notifier_block *nfb, return NOTIFY_OK; } -static struct notifier_block __cpuinitdata cacheinfo_cpu_notifier = +static struct notifier_block cacheinfo_cpu_notifier = { .notifier_call = cacheinfo_cpu_callback, }; @@ -759,7 +641,7 @@ static int __cpuinit cache_sysfs_init(void) if (num_cache_leaves == 0) return 0; - register_hotcpu_notifier(&cacheinfo_cpu_notifier); + register_cpu_notifier(&cacheinfo_cpu_notifier); for_each_online_cpu(i) { cacheinfo_cpu_callback(&cacheinfo_cpu_notifier, CPU_ONLINE, diff --git a/arch/i386/kernel/cpu/mcheck/k7.c b/arch/i386/kernel/cpu/mcheck/k7.c index b0862af59..fc5d5215e 100644 --- a/arch/i386/kernel/cpu/mcheck/k7.c +++ b/arch/i386/kernel/cpu/mcheck/k7.c @@ -6,6 +6,7 @@ #include #include #include +#include #include #include diff --git a/arch/i386/kernel/cpu/mcheck/mce.c b/arch/i386/kernel/cpu/mcheck/mce.c index d555bec0d..6170af3c2 100644 --- a/arch/i386/kernel/cpu/mcheck/mce.c +++ b/arch/i386/kernel/cpu/mcheck/mce.c @@ -6,6 +6,7 @@ #include #include #include +#include #include #include #include @@ -63,13 +64,13 @@ void mcheck_init(struct cpuinfo_x86 *c) static int __init mcheck_disable(char *str) { mce_disabled = 1; - return 1; + return 0; } static int __init mcheck_enable(char *str) { mce_disabled = -1; - return 1; + return 0; } __setup("nomce", mcheck_disable); diff --git a/arch/i386/kernel/cpu/mcheck/mce.h b/arch/i386/kernel/cpu/mcheck/mce.h index 84fd4cf7d..dc2416dfe 100644 --- a/arch/i386/kernel/cpu/mcheck/mce.h +++ b/arch/i386/kernel/cpu/mcheck/mce.h @@ -9,6 +9,6 @@ void winchip_mcheck_init(struct cpuinfo_x86 *c); /* Call the installed machine check handler for this CPU setup. */ extern fastcall void (*machine_check_vector)(struct pt_regs *, long error_code); -extern int mce_disabled; +extern int mce_disabled __initdata; extern int nr_mce_banks; diff --git a/arch/i386/kernel/cpu/mcheck/non-fatal.c b/arch/i386/kernel/cpu/mcheck/non-fatal.c index 1f9153ae5..82dffe0d4 100644 --- a/arch/i386/kernel/cpu/mcheck/non-fatal.c +++ b/arch/i386/kernel/cpu/mcheck/non-fatal.c @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include diff --git a/arch/i386/kernel/cpu/mcheck/p4.c b/arch/i386/kernel/cpu/mcheck/p4.c index b95f1b3d5..fd2c459a3 100644 --- a/arch/i386/kernel/cpu/mcheck/p4.c +++ b/arch/i386/kernel/cpu/mcheck/p4.c @@ -5,6 +5,7 @@ #include #include #include +#include #include #include diff --git a/arch/i386/kernel/cpu/mtrr/Makefile b/arch/i386/kernel/cpu/mtrr/Makefile index 06df4feee..a25b701ab 100644 --- a/arch/i386/kernel/cpu/mtrr/Makefile +++ b/arch/i386/kernel/cpu/mtrr/Makefile @@ -3,10 +3,3 @@ obj-y += amd.o obj-y += cyrix.o obj-y += centaur.o -ifdef CONFIG_XEN -include $(srctree)/scripts/Makefile.xen -n-obj-xen := generic.o state.o amd.o cyrix.o centaur.o - -obj-y := $(call filterxen, $(obj-y), $(n-obj-xen)) -obj-y := $(call cherrypickxen, $(obj-y)) -endif diff --git a/arch/i386/kernel/cpu/mtrr/main.c b/arch/i386/kernel/cpu/mtrr/main.c index fff90bda4..3b4618bed 100644 --- a/arch/i386/kernel/cpu/mtrr/main.c +++ b/arch/i386/kernel/cpu/mtrr/main.c @@ -36,7 +36,6 @@ #include #include #include -#include #include @@ -48,7 +47,7 @@ u32 num_var_ranges = 0; unsigned int *usage_table; -static DEFINE_MUTEX(mtrr_mutex); +static DECLARE_MUTEX(mtrr_sem); u32 size_or_mask, size_and_mask; @@ -334,7 +333,7 @@ int mtrr_add_page(unsigned long base, unsigned long size, /* No CPU hotplug when we change MTRR entries */ lock_cpu_hotplug(); /* Search for existing MTRR */ - mutex_lock(&mtrr_mutex); + down(&mtrr_sem); for (i = 0; i < num_var_ranges; ++i) { mtrr_if->get(i, &lbase, &lsize, <ype); if (base >= lbase + lsize) @@ -372,7 +371,7 @@ int mtrr_add_page(unsigned long base, unsigned long size, printk(KERN_INFO "mtrr: no more MTRRs available\n"); error = i; out: - mutex_unlock(&mtrr_mutex); + up(&mtrr_sem); unlock_cpu_hotplug(); return error; } @@ -465,7 +464,7 @@ int mtrr_del_page(int reg, unsigned long base, unsigned long size) max = num_var_ranges; /* No CPU hotplug when we change MTRR entries */ lock_cpu_hotplug(); - mutex_lock(&mtrr_mutex); + down(&mtrr_sem); if (reg < 0) { /* Search for existing MTRR */ for (i = 0; i < max; ++i) { @@ -504,7 +503,7 @@ int mtrr_del_page(int reg, unsigned long base, unsigned long size) set_mtrr(reg, 0, 0, 0); error = reg; out: - mutex_unlock(&mtrr_mutex); + up(&mtrr_sem); unlock_cpu_hotplug(); return error; } @@ -686,7 +685,7 @@ void mtrr_ap_init(void) if (!mtrr_if || !use_intel()) return; /* - * Ideally we should hold mtrr_mutex here to avoid mtrr entries changed, + * Ideally we should hold mtrr_sem here to avoid mtrr entries changed, * but this routine will be called in cpu boot time, holding the lock * breaks it. This routine is called in two cases: 1.very earily time * of software resume, when there absolutely isn't mtrr entry changes; diff --git a/arch/i386/kernel/cpu/proc.c b/arch/i386/kernel/cpu/proc.c index f54a15268..89a85af33 100644 --- a/arch/i386/kernel/cpu/proc.c +++ b/arch/i386/kernel/cpu/proc.c @@ -18,7 +18,7 @@ static int show_cpuinfo(struct seq_file *m, void *v) * applications want to get the raw CPUID data, they should access * /dev/cpu//cpuid instead. */ - static const char * const x86_cap_flags[] = { + static char *x86_cap_flags[] = { /* Intel-defined */ "fpu", "vme", "de", "pse", "tsc", "msr", "pae", "mce", "cx8", "apic", NULL, "sep", "mtrr", "pge", "mca", "cmov", @@ -40,19 +40,19 @@ static int show_cpuinfo(struct seq_file *m, void *v) /* Other (Linux-defined) */ "cxmmx", "k6_mtrr", "cyrix_arr", "centaur_mcr", NULL, NULL, NULL, NULL, - "constant_tsc", "up", NULL, NULL, NULL, NULL, NULL, NULL, + "constant_tsc", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* Intel-defined (#2) */ - "pni", NULL, NULL, "monitor", "ds_cpl", "vmx", "smx", "est", + "pni", NULL, NULL, "monitor", "ds_cpl", "vmx", NULL, "est", "tm2", NULL, "cid", NULL, NULL, "cx16", "xtpr", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* VIA/Cyrix/Centaur-defined */ NULL, NULL, "rng", "rng_en", NULL, NULL, "ace", "ace_en", - "ace2", "ace2_en", "phe", "phe_en", "pmm", "pmm_en", NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, @@ -62,7 +62,7 @@ static int show_cpuinfo(struct seq_file *m, void *v) NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, }; - static const char * const x86_power_flags[] = { + static char *x86_power_flags[] = { "ts", /* temperature sensor */ "fid", /* frequency id control */ "vid", /* voltage id control */ @@ -109,9 +109,9 @@ static int show_cpuinfo(struct seq_file *m, void *v) seq_printf(m, "cache size\t: %d KB\n", c->x86_cache_size); #ifdef CONFIG_X86_HT if (c->x86_max_cores * smp_num_siblings > 1) { - seq_printf(m, "physical id\t: %d\n", c->phys_proc_id); + seq_printf(m, "physical id\t: %d\n", phys_proc_id[n]); seq_printf(m, "siblings\t: %d\n", cpus_weight(cpu_core_map[n])); - seq_printf(m, "core id\t\t: %d\n", c->cpu_core_id); + seq_printf(m, "core id\t\t: %d\n", cpu_core_id[n]); seq_printf(m, "cpu cores\t: %d\n", c->booted_cores); } #endif diff --git a/arch/i386/kernel/cpuid.c b/arch/i386/kernel/cpuid.c index fde8bea85..006141d1c 100644 --- a/arch/i386/kernel/cpuid.c +++ b/arch/i386/kernel/cpuid.c @@ -24,6 +24,7 @@ */ #include +#include #include #include @@ -167,8 +168,7 @@ static int cpuid_class_device_create(int i) return err; } -#ifdef CONFIG_HOTPLUG_CPU -static int cpuid_class_cpu_callback(struct notifier_block *nfb, unsigned long action, void *hcpu) +static int __devinit cpuid_class_cpu_callback(struct notifier_block *nfb, unsigned long action, void *hcpu) { unsigned int cpu = (unsigned long)hcpu; @@ -183,11 +183,10 @@ static int cpuid_class_cpu_callback(struct notifier_block *nfb, unsigned long ac return NOTIFY_OK; } -static struct notifier_block __cpuinitdata cpuid_class_cpu_notifier = +static struct notifier_block cpuid_class_cpu_notifier = { .notifier_call = cpuid_class_cpu_callback, }; -#endif /* !CONFIG_HOTPLUG_CPU */ static int __init cpuid_init(void) { @@ -210,7 +209,7 @@ static int __init cpuid_init(void) if (err != 0) goto out_class; } - register_hotcpu_notifier(&cpuid_class_cpu_notifier); + register_cpu_notifier(&cpuid_class_cpu_notifier); err = 0; goto out; @@ -235,7 +234,7 @@ static void __exit cpuid_exit(void) class_device_destroy(cpuid_class, MKDEV(CPUID_MAJOR, cpu)); class_destroy(cpuid_class); unregister_chrdev(CPUID_MAJOR, "cpu/cpuid"); - unregister_hotcpu_notifier(&cpuid_class_cpu_notifier); + unregister_cpu_notifier(&cpuid_class_cpu_notifier); } module_init(cpuid_init); diff --git a/arch/i386/kernel/crash.c b/arch/i386/kernel/crash.c index 5b96f0383..d49dbe8dc 100644 --- a/arch/i386/kernel/crash.c +++ b/arch/i386/kernel/crash.c @@ -69,7 +69,7 @@ static void crash_save_this_cpu(struct pt_regs *regs, int cpu) * for the data I pass, and I need tags * on the data to indicate what information I have * squirrelled away. ELF notes happen to provide - * all of that, so there is no need to invent something new. + * all of that that no need to invent something new. */ buf = (u32*)per_cpu_ptr(crash_notes, cpu); if (!buf) @@ -90,7 +90,7 @@ static void crash_save_self(struct pt_regs *regs) crash_save_this_cpu(regs, cpu); } -#if defined(CONFIG_SMP) && defined(CONFIG_X86_LOCAL_APIC) +#ifdef CONFIG_SMP static atomic_t waiting_for_crash_ipi; static int crash_nmi_callback(struct pt_regs *regs, int cpu) @@ -105,7 +105,7 @@ static int crash_nmi_callback(struct pt_regs *regs, int cpu) return 1; local_irq_disable(); - if (!user_mode_vm(regs)) { + if (!user_mode(regs)) { crash_fixup_ss_esp(&fixed_regs, regs); regs = &fixed_regs; } @@ -114,15 +114,19 @@ static int crash_nmi_callback(struct pt_regs *regs, int cpu) atomic_dec(&waiting_for_crash_ipi); /* Assume hlt works */ halt(); - for (;;) - cpu_relax(); + for(;;); return 1; } +/* + * By using the NMI code instead of a vector we just sneak thru the + * word generator coming out with just what we want. AND it does + * not matter if clustered_apic_mode is set or not. + */ static void smp_send_nmi_allbutself(void) { - send_IPI_allbutself(NMI_VECTOR); + send_IPI_allbutself(APIC_DM_NMI); } static void nmi_shootdown_cpus(void) @@ -158,7 +162,7 @@ static void nmi_shootdown_cpus(void) void machine_crash_shutdown(struct pt_regs *regs) { /* This function is only called after the system - * has panicked or is otherwise in a critical state. + * has paniced or is otherwise in a critical state. * The minimum amount of code to allow a kexec'd kernel * to run successfully needs to happen here. * diff --git a/arch/i386/kernel/dmi_scan.c b/arch/i386/kernel/dmi_scan.c index 6ed7e28f3..ca2a0cbca 100644 --- a/arch/i386/kernel/dmi_scan.c +++ b/arch/i386/kernel/dmi_scan.c @@ -1,62 +1,47 @@ #include -#include #include #include #include -#include -#include -#include -#include -#include #include #include +#include - -struct dmi_header +static char * __init dmi_string(struct dmi_header *dm, u8 s) { - u8 type; - u8 length; - u16 handle; -}; + u8 *bp = ((u8 *) dm) + dm->length; + char *str = ""; -#undef DMI_DEBUG + if (s) { + s--; + while (s > 0 && *bp) { + bp += strlen(bp) + 1; + s--; + } -#ifdef DMI_DEBUG -#define dmi_printk(x) printk x -#else -#define dmi_printk(x) -#endif + if (*bp != 0) { + str = dmi_alloc(strlen(bp) + 1); + if (str != NULL) + strcpy(str, bp); + else + printk(KERN_ERR "dmi_string: out of memory.\n"); + } + } -static char * __init dmi_string(struct dmi_header *dm, u8 s) -{ - u8 *bp=(u8 *)dm; - bp+=dm->length; - if(!s) - return ""; - s--; - while(s>0 && *bp) - { - bp+=strlen(bp); - bp++; - s--; - } - return bp; + return str; } /* * We have to be cautious here. We have seen BIOSes with DMI pointers * pointing to completely the wrong place for example */ - -static int __init dmi_table(u32 base, int len, int num, void (*decode)(struct dmi_header *)) +static int __init dmi_table(u32 base, int len, int num, + void (*decode)(struct dmi_header *)) { - u8 *buf; - struct dmi_header *dm; - u8 *data; - int i=0; + u8 *buf, *data; + int i = 0; - buf = bt_ioremap(base, len); - if(buf==NULL) + buf = dmi_ioremap(base, len); + if (buf == NULL) return -1; data = buf; @@ -65,377 +50,178 @@ static int __init dmi_table(u32 base, int len, int num, void (*decode)(struct dm * Stop when we see all the items the table claimed to have * OR we run off the end of the table (also happens) */ - - while(ilength; - while(data-buflength; + while ((data - buf < len - 1) && (data[0] || data[1])) data++; - if(data-buf>4, buf[14]&0x0F); - else - printk(KERN_INFO "DMI present.\n"); - dmi_printk((KERN_INFO "%d structures occupying %d bytes.\n", - num, len)); - dmi_printk((KERN_INFO "DMI table at 0x%08X.\n", - base)); - if(dmi_table(base,len, num, decode)==0) - return 0; - } - } - return -1; + return sum == 0; } static char *dmi_ident[DMI_STRING_MAX]; +static LIST_HEAD(dmi_devices); /* * Save a DMI string */ - static void __init dmi_save_ident(struct dmi_header *dm, int slot, int string) { - char *d = (char*)dm; - char *p = dmi_string(dm, d[string]); - if(p==NULL || *p == 0) - return; + char *p, *d = (char*) dm; + if (dmi_ident[slot]) return; - dmi_ident[slot] = alloc_bootmem(strlen(p)+1); - if(dmi_ident[slot]) - strcpy(dmi_ident[slot], p); - else - printk(KERN_ERR "dmi_save_ident: out of memory.\n"); -} -/* - * Ugly compatibility crap. - */ -#define dmi_blacklist dmi_system_id -#define NO_MATCH { DMI_NONE, NULL} -#define MATCH DMI_MATCH - -/* - * Toshiba keyboard likes to repeat keys when they are not repeated. - */ + p = dmi_string(dm, d[string]); + if (p == NULL) + return; -static __init int broken_toshiba_keyboard(struct dmi_blacklist *d) -{ - printk(KERN_WARNING "Toshiba with broken keyboard detected. If your keyboard sometimes generates 3 keypresses instead of one, see http://davyd.ucc.asn.au/projects/toshiba/README\n"); - return 0; + dmi_ident[slot] = p; } - -#ifdef CONFIG_ACPI_SLEEP -static __init int reset_videomode_after_s3(struct dmi_blacklist *d) +static void __init dmi_save_devices(struct dmi_header *dm) { - /* See acpi_wakeup.S */ - extern long acpi_video_flags; - acpi_video_flags |= 2; - return 0; -} -#endif + int i, count = (dm->length - sizeof(struct dmi_header)) / 2; + struct dmi_device *dev; + for (i = 0; i < count; i++) { + char *d = (char *)(dm + 1) + (i * 2); -#ifdef CONFIG_ACPI_BOOT -extern int acpi_force; + /* Skip disabled device */ + if ((*d & 0x80) == 0) + continue; -static __init __attribute__((unused)) int dmi_disable_acpi(struct dmi_blacklist *d) -{ - if (!acpi_force) { - printk(KERN_NOTICE "%s detected: acpi off\n",d->ident); - disable_acpi(); - } else { - printk(KERN_NOTICE - "Warning: DMI blacklist says broken, but acpi forced\n"); - } - return 0; -} + dev = dmi_alloc(sizeof(*dev)); + if (!dev) { + printk(KERN_ERR "dmi_save_devices: out of memory.\n"); + break; + } -/* - * Limit ACPI to CPU enumeration for HT - */ -static __init __attribute__((unused)) int force_acpi_ht(struct dmi_blacklist *d) -{ - if (!acpi_force) { - printk(KERN_NOTICE "%s detected: force use of acpi=ht\n", d->ident); - disable_acpi(); - acpi_ht = 1; - } else { - printk(KERN_NOTICE - "Warning: acpi=force overrules DMI blacklist: acpi=ht\n"); - } - return 0; -} -#endif + dev->type = *d++ & 0x7f; + dev->name = dmi_string(dm, *d); + dev->device_data = NULL; -#ifdef CONFIG_ACPI_PCI -static __init int disable_acpi_irq(struct dmi_blacklist *d) -{ - if (!acpi_force) { - printk(KERN_NOTICE "%s detected: force use of acpi=noirq\n", - d->ident); - acpi_noirq_set(); + list_add(&dev->list, &dmi_devices); } - return 0; } -static __init int disable_acpi_pci(struct dmi_blacklist *d) -{ - if (!acpi_force) { - printk(KERN_NOTICE "%s detected: force use of pci=noacpi\n", - d->ident); - acpi_disable_pci(); - } - return 0; -} -#endif -/* - * Process the DMI blacklists - */ - - -/* - * This will be expanded over time to force things like the APM - * interrupt mask settings according to the laptop - */ - -static __initdata struct dmi_blacklist dmi_blacklist[]={ - - { broken_toshiba_keyboard, "Toshiba Satellite 4030cdt", { /* Keyboard generates spurious repeats */ - MATCH(DMI_PRODUCT_NAME, "S4030CDT/4.3"), - NO_MATCH, NO_MATCH, NO_MATCH - } }, -#ifdef CONFIG_ACPI_SLEEP - { reset_videomode_after_s3, "Toshiba Satellite 4030cdt", { /* Reset video mode after returning from ACPI S3 sleep */ - MATCH(DMI_PRODUCT_NAME, "S4030CDT/4.3"), - NO_MATCH, NO_MATCH, NO_MATCH - } }, -#endif - -#ifdef CONFIG_ACPI_BOOT - /* - * If your system is blacklisted here, but you find that acpi=force - * works for you, please contact acpi-devel@sourceforge.net - */ - - /* - * Boxes that need ACPI disabled - */ - - { dmi_disable_acpi, "IBM Thinkpad", { - MATCH(DMI_BOARD_VENDOR, "IBM"), - MATCH(DMI_BOARD_NAME, "2629H1G"), - NO_MATCH, NO_MATCH }}, - - /* - * Boxes that need acpi=ht - */ - - { force_acpi_ht, "FSC Primergy T850", { - MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), - MATCH(DMI_PRODUCT_NAME, "PRIMERGY T850"), - NO_MATCH, NO_MATCH }}, - - { force_acpi_ht, "DELL GX240", { - MATCH(DMI_BOARD_VENDOR, "Dell Computer Corporation"), - MATCH(DMI_BOARD_NAME, "OptiPlex GX240"), - NO_MATCH, NO_MATCH }}, - - { force_acpi_ht, "HP VISUALIZE NT Workstation", { - MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"), - MATCH(DMI_PRODUCT_NAME, "HP VISUALIZE NT Workstation"), - NO_MATCH, NO_MATCH }}, - - { force_acpi_ht, "Compaq Workstation W8000", { - MATCH(DMI_SYS_VENDOR, "Compaq"), - MATCH(DMI_PRODUCT_NAME, "Workstation W8000"), - NO_MATCH, NO_MATCH }}, - - { force_acpi_ht, "ASUS P4B266", { - MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."), - MATCH(DMI_BOARD_NAME, "P4B266"), - NO_MATCH, NO_MATCH }}, - - { force_acpi_ht, "ASUS P2B-DS", { - MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."), - MATCH(DMI_BOARD_NAME, "P2B-DS"), - NO_MATCH, NO_MATCH }}, - - { force_acpi_ht, "ASUS CUR-DLS", { - MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."), - MATCH(DMI_BOARD_NAME, "CUR-DLS"), - NO_MATCH, NO_MATCH }}, - - { force_acpi_ht, "ABIT i440BX-W83977", { - MATCH(DMI_BOARD_VENDOR, "ABIT "), - MATCH(DMI_BOARD_NAME, "i440BX-W83977 (BP6)"), - NO_MATCH, NO_MATCH }}, - - { force_acpi_ht, "IBM Bladecenter", { - MATCH(DMI_BOARD_VENDOR, "IBM"), - MATCH(DMI_BOARD_NAME, "IBM eServer BladeCenter HS20"), - NO_MATCH, NO_MATCH }}, - - { force_acpi_ht, "IBM eServer xSeries 360", { - MATCH(DMI_BOARD_VENDOR, "IBM"), - MATCH(DMI_BOARD_NAME, "eServer xSeries 360"), - NO_MATCH, NO_MATCH }}, - - { force_acpi_ht, "IBM eserver xSeries 330", { - MATCH(DMI_BOARD_VENDOR, "IBM"), - MATCH(DMI_BOARD_NAME, "eserver xSeries 330"), - NO_MATCH, NO_MATCH }}, - - { force_acpi_ht, "IBM eserver xSeries 440", { - MATCH(DMI_BOARD_VENDOR, "IBM"), - MATCH(DMI_PRODUCT_NAME, "eserver xSeries 440"), - NO_MATCH, NO_MATCH }}, - -#endif // CONFIG_ACPI_BOOT - -#ifdef CONFIG_ACPI_PCI - /* - * Boxes that need ACPI PCI IRQ routing disabled - */ +static void __init dmi_save_ipmi_device(struct dmi_header *dm) +{ + struct dmi_device *dev; + void * data; - { disable_acpi_irq, "ASUS A7V", { - MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC"), - MATCH(DMI_BOARD_NAME, ""), - /* newer BIOS, Revision 1011, does work */ - MATCH(DMI_BIOS_VERSION, "ASUS A7V ACPI BIOS Revision 1007"), - NO_MATCH }}, + data = dmi_alloc(dm->length); + if (data == NULL) { + printk(KERN_ERR "dmi_save_ipmi_device: out of memory.\n"); + return; + } - /* - * Boxes that need ACPI PCI IRQ routing and PCI scan disabled - */ - { disable_acpi_pci, "ASUS PR-DLS", { /* _BBN 0 bug */ - MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."), - MATCH(DMI_BOARD_NAME, "PR-DLS"), - MATCH(DMI_BIOS_VERSION, "ASUS PR-DLS ACPI BIOS Revision 1010"), - MATCH(DMI_BIOS_DATE, "03/21/2003") }}, + memcpy(data, dm, dm->length); - { disable_acpi_pci, "Acer TravelMate 36x Laptop", { - MATCH(DMI_SYS_VENDOR, "Acer"), - MATCH(DMI_PRODUCT_NAME, "TravelMate 360"), - NO_MATCH, NO_MATCH - } }, + dev = dmi_alloc(sizeof(*dev)); + if (!dev) { + printk(KERN_ERR "dmi_save_ipmi_device: out of memory.\n"); + return; + } -#endif + dev->type = DMI_DEV_TYPE_IPMI; + dev->name = "IPMI controller"; + dev->device_data = data; - { NULL, } -}; + list_add(&dev->list, &dmi_devices); +} /* * Process a DMI table entry. Right now all we care about are the BIOS * and machine entries. For 2.5 we should pull the smbus controller info * out of here. */ - static void __init dmi_decode(struct dmi_header *dm) { -#ifdef DMI_DEBUG - u8 *data = (u8 *)dm; -#endif - - switch(dm->type) - { - case 0: - dmi_printk(("BIOS Vendor: %s\n", - dmi_string(dm, data[4]))); - dmi_save_ident(dm, DMI_BIOS_VENDOR, 4); - dmi_printk(("BIOS Version: %s\n", - dmi_string(dm, data[5]))); - dmi_save_ident(dm, DMI_BIOS_VERSION, 5); - dmi_printk(("BIOS Release: %s\n", - dmi_string(dm, data[8]))); - dmi_save_ident(dm, DMI_BIOS_DATE, 8); - break; - case 1: - dmi_printk(("System Vendor: %s\n", - dmi_string(dm, data[4]))); - dmi_save_ident(dm, DMI_SYS_VENDOR, 4); - dmi_printk(("Product Name: %s\n", - dmi_string(dm, data[5]))); - dmi_save_ident(dm, DMI_PRODUCT_NAME, 5); - dmi_printk(("Version: %s\n", - dmi_string(dm, data[6]))); - dmi_save_ident(dm, DMI_PRODUCT_VERSION, 6); - dmi_printk(("Serial Number: %s\n", - dmi_string(dm, data[7]))); - break; - case 2: - dmi_printk(("Board Vendor: %s\n", - dmi_string(dm, data[4]))); - dmi_save_ident(dm, DMI_BOARD_VENDOR, 4); - dmi_printk(("Board Name: %s\n", - dmi_string(dm, data[5]))); - dmi_save_ident(dm, DMI_BOARD_NAME, 5); - dmi_printk(("Board Version: %s\n", - dmi_string(dm, data[6]))); - dmi_save_ident(dm, DMI_BOARD_VERSION, 6); - break; + switch(dm->type) { + case 0: /* BIOS Information */ + dmi_save_ident(dm, DMI_BIOS_VENDOR, 4); + dmi_save_ident(dm, DMI_BIOS_VERSION, 5); + dmi_save_ident(dm, DMI_BIOS_DATE, 8); + break; + case 1: /* System Information */ + dmi_save_ident(dm, DMI_SYS_VENDOR, 4); + dmi_save_ident(dm, DMI_PRODUCT_NAME, 5); + dmi_save_ident(dm, DMI_PRODUCT_VERSION, 6); + dmi_save_ident(dm, DMI_PRODUCT_SERIAL, 7); + break; + case 2: /* Base Board Information */ + dmi_save_ident(dm, DMI_BOARD_VENDOR, 4); + dmi_save_ident(dm, DMI_BOARD_NAME, 5); + dmi_save_ident(dm, DMI_BOARD_VERSION, 6); + break; + case 10: /* Onboard Devices Information */ + dmi_save_devices(dm); + break; + case 38: /* IPMI Device Information */ + dmi_save_ipmi_device(dm); } } void __init dmi_scan_machine(void) { - int err = dmi_iterate(dmi_decode); - if(err == 0) - dmi_check_system(dmi_blacklist); - else - printk(KERN_INFO "DMI not present.\n"); + u8 buf[15]; + char __iomem *p, *q; + + /* + * no iounmap() for that ioremap(); it would be a no-op, but it's + * so early in setup that sucker gets confused into doing what + * it shouldn't if we actually call it. + */ + p = ioremap(0xF0000, 0x10000); + if (p == NULL) + goto out; + + for (q = p; q < p + 0x10000; q += 16) { + memcpy_fromio(buf, q, 15); + if ((memcmp(buf, "_DMI_", 5) == 0) && dmi_checksum(buf)) { + u16 num = (buf[13] << 8) | buf[12]; + u16 len = (buf[7] << 8) | buf[6]; + u32 base = (buf[11] << 24) | (buf[10] << 16) | + (buf[9] << 8) | buf[8]; + + /* + * DMI version 0.0 means that the real version is taken from + * the SMBIOS version, which we don't know at this point. + */ + if (buf[14] != 0) + printk(KERN_INFO "DMI %d.%d present.\n", + buf[14] >> 4, buf[14] & 0xF); + else + printk(KERN_INFO "DMI present.\n"); + + if (dmi_table(base,len, num, dmi_decode) == 0) + return; + } + } + +out: printk(KERN_INFO "DMI not present or invalid.\n"); } @@ -462,15 +248,14 @@ int dmi_check_system(struct dmi_system_id *list) /* No match */ goto fail; } + count++; if (d->callback && d->callback(d)) break; - count++; fail: d++; } return count; } - EXPORT_SYMBOL(dmi_check_system); /** @@ -480,8 +265,37 @@ EXPORT_SYMBOL(dmi_check_system); * Returns one DMI data value, can be used to perform * complex DMI data checks. */ -char * dmi_get_system_info(int field) +char *dmi_get_system_info(int field) { return dmi_ident[field]; } +EXPORT_SYMBOL(dmi_get_system_info); + +/** + * dmi_find_device - find onboard device by type/name + * @type: device type or %DMI_DEV_TYPE_ANY to match all device types + * @desc: device name string or %NULL to match all + * @from: previous device found in search, or %NULL for new search. + * + * Iterates through the list of known onboard devices. If a 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. + * If @from is not %NULL, searches continue from next device. + */ +struct dmi_device * dmi_find_device(int type, const char *name, + struct dmi_device *from) +{ + struct list_head *d, *head = from ? &from->list : &dmi_devices; + for(d = head->next; d != &dmi_devices; d = d->next) { + struct dmi_device *dev = list_entry(d, struct dmi_device, list); + + if (((type == DMI_DEV_TYPE_ANY) || (dev->type == type)) && + ((name == NULL) || (strcmp(dev->name, name) == 0))) + return dev; + } + + return NULL; +} +EXPORT_SYMBOL(dmi_find_device); diff --git a/arch/i386/kernel/doublefault.c b/arch/i386/kernel/doublefault.c index b4d14c2eb..5edb1d379 100644 --- a/arch/i386/kernel/doublefault.c +++ b/arch/i386/kernel/doublefault.c @@ -44,8 +44,7 @@ static void doublefault_fn(void) } } - for (;;) - cpu_relax(); + for (;;) /* nothing */; } struct tss_struct doublefault_tss __cacheline_aligned = { diff --git a/arch/i386/kernel/efi.c b/arch/i386/kernel/efi.c index fe1580421..c9cad7ba0 100644 --- a/arch/i386/kernel/efi.c +++ b/arch/i386/kernel/efi.c @@ -19,6 +19,7 @@ * Skip non-WB memory and ignore empty memory ranges. */ +#include #include #include #include @@ -114,7 +115,7 @@ static void efi_call_phys_epilog(void) unsigned long cr4; struct Xgt_desc_struct *cpu_gdt_descr = &per_cpu(cpu_gdt_descr, 0); - cpu_gdt_descr->address = (unsigned long)__va(cpu_gdt_descr->address); + cpu_gdt_descr->address = __va(cpu_gdt_descr->address); load_gdt(cpu_gdt_descr); cr4 = read_cr4(); @@ -360,7 +361,7 @@ void __init efi_init(void) */ c16 = (efi_char16_t *) boot_ioremap(efi.systab->fw_vendor, 2); if (c16) { - for (i = 0; i < (sizeof(vendor) - 1) && *c16; ++i) + for (i = 0; i < sizeof(vendor) && *c16; ++i) vendor[i] = *c16++; vendor[i] = '\0'; } else @@ -380,38 +381,29 @@ void __init efi_init(void) if (config_tables == NULL) printk(KERN_ERR PFX "Could not map EFI Configuration Table!\n"); - efi.mps = EFI_INVALID_TABLE_ADDR; - efi.acpi = EFI_INVALID_TABLE_ADDR; - efi.acpi20 = EFI_INVALID_TABLE_ADDR; - efi.smbios = EFI_INVALID_TABLE_ADDR; - efi.sal_systab = EFI_INVALID_TABLE_ADDR; - efi.boot_info = EFI_INVALID_TABLE_ADDR; - efi.hcdp = EFI_INVALID_TABLE_ADDR; - efi.uga = EFI_INVALID_TABLE_ADDR; - for (i = 0; i < num_config_tables; i++) { if (efi_guidcmp(config_tables[i].guid, MPS_TABLE_GUID) == 0) { - efi.mps = config_tables[i].table; + efi.mps = (void *)config_tables[i].table; printk(KERN_INFO " MPS=0x%lx ", config_tables[i].table); } else if (efi_guidcmp(config_tables[i].guid, ACPI_20_TABLE_GUID) == 0) { - efi.acpi20 = config_tables[i].table; + efi.acpi20 = __va(config_tables[i].table); printk(KERN_INFO " ACPI 2.0=0x%lx ", config_tables[i].table); } else if (efi_guidcmp(config_tables[i].guid, ACPI_TABLE_GUID) == 0) { - efi.acpi = config_tables[i].table; + efi.acpi = __va(config_tables[i].table); printk(KERN_INFO " ACPI=0x%lx ", config_tables[i].table); } else if (efi_guidcmp(config_tables[i].guid, SMBIOS_TABLE_GUID) == 0) { - efi.smbios = config_tables[i].table; + efi.smbios = (void *) config_tables[i].table; printk(KERN_INFO " SMBIOS=0x%lx ", config_tables[i].table); } else if (efi_guidcmp(config_tables[i].guid, HCDP_TABLE_GUID) == 0) { - efi.hcdp = config_tables[i].table; + efi.hcdp = (void *)config_tables[i].table; printk(KERN_INFO " HCDP=0x%lx ", config_tables[i].table); } else if (efi_guidcmp(config_tables[i].guid, UGA_IO_PROTOCOL_GUID) == 0) { - efi.uga = config_tables[i].table; + efi.uga = (void *)config_tables[i].table; printk(KERN_INFO " UGA=0x%lx ", config_tables[i].table); } } @@ -551,7 +543,7 @@ efi_initialize_iomem_resources(struct resource *code_resource, if ((md->phys_addr + (md->num_pages << EFI_PAGE_SHIFT)) > 0x100000000ULL) continue; - res = kzalloc(sizeof(struct resource), GFP_ATOMIC); + res = alloc_bootmem_low(sizeof(struct resource)); switch (md->type) { case EFI_RESERVED_TYPE: res->name = "Reserved Memory"; @@ -600,10 +592,8 @@ efi_initialize_iomem_resources(struct resource *code_resource, res->end = res->start + ((md->num_pages << EFI_PAGE_SHIFT) - 1); res->flags = IORESOURCE_MEM | IORESOURCE_BUSY; if (request_resource(&iomem_resource, res) < 0) - printk(KERN_ERR PFX "Failed to allocate res %s : " - "0x%llx-0x%llx\n", res->name, - (unsigned long long)res->start, - (unsigned long long)res->end); + printk(KERN_ERR PFX "Failed to allocate res %s : 0x%lx-0x%lx\n", + res->name, res->start, res->end); /* * We don't know which region contains kernel data so we try * it repeatedly and let the resource manager test it. diff --git a/arch/i386/kernel/efi_stub.S b/arch/i386/kernel/efi_stub.S index d3ee73a3e..08c0312d9 100644 --- a/arch/i386/kernel/efi_stub.S +++ b/arch/i386/kernel/efi_stub.S @@ -5,6 +5,7 @@ * turned off. */ +#include #include #include #include diff --git a/arch/i386/kernel/entry.S b/arch/i386/kernel/entry.S index fd0f85ff5..a14218c9e 100644 --- a/arch/i386/kernel/entry.S +++ b/arch/i386/kernel/entry.S @@ -40,15 +40,14 @@ * "current" is in register %ebx during any slow entries. */ +#include #include #include -#include #include #include #include #include #include -#include #include "irq_vectors.h" #define nr_syscalls ((syscall_table_size)/4) @@ -77,91 +76,40 @@ NT_MASK = 0x00004000 VM_MASK = 0x00020000 #ifdef CONFIG_PREEMPT -#define preempt_stop cli; TRACE_IRQS_OFF +#define preempt_stop cli #else #define preempt_stop #define resume_kernel restore_nocheck #endif -.macro TRACE_IRQS_IRET -#ifdef CONFIG_TRACE_IRQFLAGS - testl $IF_MASK,EFLAGS(%esp) # interrupts off? - jz 1f - TRACE_IRQS_ON -1: -#endif -.endm - -#ifdef CONFIG_VM86 -#define resume_userspace_sig check_userspace -#else -#define resume_userspace_sig resume_userspace -#endif - #define SAVE_ALL \ cld; \ pushl %es; \ - CFI_ADJUST_CFA_OFFSET 4;\ - /*CFI_REL_OFFSET es, 0;*/\ pushl %ds; \ - CFI_ADJUST_CFA_OFFSET 4;\ - /*CFI_REL_OFFSET ds, 0;*/\ pushl %eax; \ - CFI_ADJUST_CFA_OFFSET 4;\ - CFI_REL_OFFSET eax, 0;\ pushl %ebp; \ - CFI_ADJUST_CFA_OFFSET 4;\ - CFI_REL_OFFSET ebp, 0;\ pushl %edi; \ - CFI_ADJUST_CFA_OFFSET 4;\ - CFI_REL_OFFSET edi, 0;\ pushl %esi; \ - CFI_ADJUST_CFA_OFFSET 4;\ - CFI_REL_OFFSET esi, 0;\ pushl %edx; \ - CFI_ADJUST_CFA_OFFSET 4;\ - CFI_REL_OFFSET edx, 0;\ pushl %ecx; \ - CFI_ADJUST_CFA_OFFSET 4;\ - CFI_REL_OFFSET ecx, 0;\ pushl %ebx; \ - CFI_ADJUST_CFA_OFFSET 4;\ - CFI_REL_OFFSET ebx, 0;\ movl $(__USER_DS), %edx; \ movl %edx, %ds; \ movl %edx, %es; #define RESTORE_INT_REGS \ popl %ebx; \ - CFI_ADJUST_CFA_OFFSET -4;\ - CFI_RESTORE ebx;\ popl %ecx; \ - CFI_ADJUST_CFA_OFFSET -4;\ - CFI_RESTORE ecx;\ popl %edx; \ - CFI_ADJUST_CFA_OFFSET -4;\ - CFI_RESTORE edx;\ popl %esi; \ - CFI_ADJUST_CFA_OFFSET -4;\ - CFI_RESTORE esi;\ popl %edi; \ - CFI_ADJUST_CFA_OFFSET -4;\ - CFI_RESTORE edi;\ popl %ebp; \ - CFI_ADJUST_CFA_OFFSET -4;\ - CFI_RESTORE ebp;\ - popl %eax; \ - CFI_ADJUST_CFA_OFFSET -4;\ - CFI_RESTORE eax + popl %eax #define RESTORE_REGS \ RESTORE_INT_REGS; \ 1: popl %ds; \ - CFI_ADJUST_CFA_OFFSET -4;\ - /*CFI_RESTORE ds;*/\ 2: popl %es; \ - CFI_ADJUST_CFA_OFFSET -4;\ - /*CFI_RESTORE es;*/\ .section .fixup,"ax"; \ 3: movl $0,(%esp); \ jmp 1b; \ @@ -174,47 +122,15 @@ VM_MASK = 0x00020000 .long 2b,4b; \ .previous -#define RING0_INT_FRAME \ - CFI_STARTPROC simple;\ - CFI_DEF_CFA esp, 3*4;\ - /*CFI_OFFSET cs, -2*4;*/\ - CFI_OFFSET eip, -3*4 - -#define RING0_EC_FRAME \ - CFI_STARTPROC simple;\ - CFI_DEF_CFA esp, 4*4;\ - /*CFI_OFFSET cs, -2*4;*/\ - CFI_OFFSET eip, -3*4 - -#define RING0_PTREGS_FRAME \ - CFI_STARTPROC simple;\ - CFI_DEF_CFA esp, OLDESP-EBX;\ - /*CFI_OFFSET cs, CS-OLDESP;*/\ - CFI_OFFSET eip, EIP-OLDESP;\ - /*CFI_OFFSET es, ES-OLDESP;*/\ - /*CFI_OFFSET ds, DS-OLDESP;*/\ - CFI_OFFSET eax, EAX-OLDESP;\ - CFI_OFFSET ebp, EBP-OLDESP;\ - CFI_OFFSET edi, EDI-OLDESP;\ - CFI_OFFSET esi, ESI-OLDESP;\ - CFI_OFFSET edx, EDX-OLDESP;\ - CFI_OFFSET ecx, ECX-OLDESP;\ - CFI_OFFSET ebx, EBX-OLDESP ENTRY(ret_from_fork) - CFI_STARTPROC pushl %eax - CFI_ADJUST_CFA_OFFSET 4 call schedule_tail GET_THREAD_INFO(%ebp) popl %eax - CFI_ADJUST_CFA_OFFSET -4 pushl $0x0202 # Reset kernel eflags - CFI_ADJUST_CFA_OFFSET 4 popfl - CFI_ADJUST_CFA_OFFSET -4 jmp syscall_exit - CFI_ENDPROC /* * Return to user mode is not as complex as all this looks, @@ -225,12 +141,10 @@ ENTRY(ret_from_fork) # userspace resumption stub bypassing syscall exit tracing ALIGN - RING0_PTREGS_FRAME ret_from_exception: preempt_stop ret_from_intr: GET_THREAD_INFO(%ebp) -check_userspace: movl EFLAGS(%esp), %eax # mix EFLAGS and CS movb CS(%esp), %al testl $(VM_MASK | 3), %eax @@ -259,42 +173,20 @@ need_resched: call preempt_schedule_irq jmp need_resched #endif - CFI_ENDPROC /* SYSENTER_RETURN points to after the "sysenter" instruction in the vsyscall page. See vsyscall-sysentry.S, which defines the symbol. */ # sysenter call handler stub ENTRY(sysenter_entry) - CFI_STARTPROC simple - CFI_DEF_CFA esp, 0 - CFI_REGISTER esp, ebp - movl SYSENTER_stack_esp0(%esp),%esp + movl TSS_sysenter_esp0(%esp),%esp sysenter_past_esp: - /* - * No need to follow this irqs on/off section: the syscall - * disabled irqs and here we enable it straight after entry: - */ sti pushl $(__USER_DS) - CFI_ADJUST_CFA_OFFSET 4 - /*CFI_REL_OFFSET ss, 0*/ pushl %ebp - CFI_ADJUST_CFA_OFFSET 4 - CFI_REL_OFFSET esp, 0 pushfl - CFI_ADJUST_CFA_OFFSET 4 pushl $(__USER_CS) - CFI_ADJUST_CFA_OFFSET 4 - /*CFI_REL_OFFSET cs, 0*/ - /* - * Push current_thread_info()->sysenter_return to the stack. - * A tiny bit of offset fixup is necessary - 4*4 means the 4 words - * pushed above; +8 corresponds to copy_thread's esp0 setting. - */ - pushl (TI_sysenter_return-THREAD_SIZE+8+4*4)(%esp) - CFI_ADJUST_CFA_OFFSET 4 - CFI_REL_OFFSET eip, 0 + pushl $SYSENTER_RETURN /* * Load the potential sixth argument from user stack. @@ -309,7 +201,6 @@ sysenter_past_esp: .previous pushl %eax - CFI_ADJUST_CFA_OFFSET 4 SAVE_ALL GET_THREAD_INFO(%ebp) @@ -321,7 +212,6 @@ sysenter_past_esp: call *sys_call_table(,%eax,4) movl %eax,EAX(%esp) cli - TRACE_IRQS_OFF movl TI_flags(%ebp), %ecx testw $_TIF_ALLWORK_MASK, %cx jne syscall_exit_work @@ -329,23 +219,15 @@ sysenter_past_esp: movl EIP(%esp), %edx movl OLDESP(%esp), %ecx xorl %ebp,%ebp - TRACE_IRQS_ON sti sysexit - CFI_ENDPROC # system call handler stub ENTRY(system_call) - RING0_INT_FRAME # can't unwind into user space anyway pushl %eax # save orig_eax - CFI_ADJUST_CFA_OFFSET 4 SAVE_ALL GET_THREAD_INFO(%ebp) - testl $TF_MASK,EFLAGS(%esp) - jz no_singlestep - orl $_TIF_SINGLESTEP,TI_flags(%ebp) -no_singlestep: # system call tracing in operation / emulation /* Note, _TIF_SECCOMP is bit number 8, and so it needs testw and not testb */ testw $(_TIF_SYSCALL_EMU|_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT),TI_flags(%ebp) @@ -359,7 +241,6 @@ syscall_exit: cli # make sure we don't miss an interrupt # setting need_resched or sigpending # between sampling and the iret - TRACE_IRQS_OFF movl TI_flags(%ebp), %ecx testw $_TIF_ALLWORK_MASK, %cx # current->work jne syscall_exit_work @@ -373,18 +254,13 @@ restore_all: movb CS(%esp), %al andl $(VM_MASK | (4 << 8) | 3), %eax cmpl $((4 << 8) | 3), %eax - CFI_REMEMBER_STATE je ldt_ss # returning to user-space with LDT SS restore_nocheck: - TRACE_IRQS_IRET -restore_nocheck_notrace: RESTORE_REGS addl $4, %esp - CFI_ADJUST_CFA_OFFSET -4 1: iret .section .fixup,"ax" iret_exc: - TRACE_IRQS_ON sti pushl $0 # no error code pushl $do_iret_error @@ -395,7 +271,6 @@ iret_exc: .long 1b,iret_exc .previous - CFI_RESTORE_STATE ldt_ss: larl OLDSS(%esp), %eax jnz restore_nocheck @@ -408,15 +283,11 @@ ldt_ss: * CPUs, which we can try to work around to make * dosemu and wine happy. */ subl $8, %esp # reserve space for switch16 pointer - CFI_ADJUST_CFA_OFFSET 8 cli - TRACE_IRQS_OFF movl %esp, %eax /* Set up the 16bit stack frame with switch32 pointer on top, * and a switch16 pointer on top of the current frame. */ call setup_x86_bogus_stack - CFI_ADJUST_CFA_OFFSET -8 # frame has moved - TRACE_IRQS_IRET RESTORE_REGS lss 20+4(%esp), %esp # switch to 16bit stack 1: iret @@ -424,11 +295,9 @@ ldt_ss: .align 4 .long 1b,iret_exc .previous - CFI_ENDPROC # perform work that needs to be done immediately before resumption ALIGN - RING0_PTREGS_FRAME # can't unwind into user space anyway work_pending: testb $_TIF_NEED_RESCHED, %cl jz work_notifysig @@ -437,7 +306,6 @@ work_resched: cli # make sure we don't miss an interrupt # setting need_resched or sigpending # between sampling and the iret - TRACE_IRQS_OFF movl TI_flags(%ebp), %ecx andl $_TIF_WORK_MASK, %ecx # is there any work to be done other # than syscall tracing? @@ -453,20 +321,18 @@ work_notifysig: # deal with pending signals and # vm86-space xorl %edx, %edx call do_notify_resume - jmp resume_userspace_sig + jmp resume_userspace ALIGN work_notifysig_v86: #ifdef CONFIG_VM86 pushl %ecx # save ti_flags for do_notify_resume - CFI_ADJUST_CFA_OFFSET 4 call save_v86_state # %eax contains pt_regs pointer popl %ecx - CFI_ADJUST_CFA_OFFSET -4 movl %eax, %esp xorl %edx, %edx call do_notify_resume - jmp resume_userspace_sig + jmp resume_userspace #endif # perform syscall exit tracing @@ -489,28 +355,25 @@ syscall_trace_entry: syscall_exit_work: testb $(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT|_TIF_SINGLESTEP), %cl jz work_pending - TRACE_IRQS_ON sti # could let do_syscall_trace() call # schedule() instead movl %esp, %eax movl $1, %edx call do_syscall_trace jmp resume_userspace - CFI_ENDPROC - RING0_INT_FRAME # can't unwind into user space anyway + ALIGN syscall_fault: pushl %eax # save orig_eax - CFI_ADJUST_CFA_OFFSET 4 SAVE_ALL GET_THREAD_INFO(%ebp) movl $-EFAULT,EAX(%esp) jmp resume_userspace + ALIGN syscall_badsys: movl $-ENOSYS,EAX(%esp) jmp resume_userspace - CFI_ENDPROC #define FIXUP_ESPFIX_STACK \ movl %esp, %eax; \ @@ -522,21 +385,16 @@ syscall_badsys: movl %eax, %esp; #define UNWIND_ESPFIX_STACK \ pushl %eax; \ - CFI_ADJUST_CFA_OFFSET 4; \ movl %ss, %eax; \ /* see if on 16bit stack */ \ cmpw $__ESPFIX_SS, %ax; \ - je 28f; \ -27: popl %eax; \ - CFI_ADJUST_CFA_OFFSET -4; \ -.section .fixup,"ax"; \ -28: movl $__KERNEL_DS, %eax; \ - movl %eax, %ds; \ - movl %eax, %es; \ + jne 28f; \ + movl $__KERNEL_DS, %edx; \ + movl %edx, %ds; \ + movl %edx, %es; \ /* switch to 32bit stack */ \ - FIXUP_ESPFIX_STACK; \ - jmp 27b; \ -.previous + FIXUP_ESPFIX_STACK \ +28: popl %eax; /* * Build the entry stubs and pointer table with @@ -548,14 +406,9 @@ ENTRY(interrupt) vector=0 ENTRY(irq_entries_start) - RING0_INT_FRAME .rept NR_IRQS ALIGN - .if vector - CFI_ADJUST_CFA_OFFSET -4 - .endif -1: pushl $~(vector) - CFI_ADJUST_CFA_OFFSET 4 +1: pushl $vector-256 jmp common_interrupt .data .long 1b @@ -563,111 +416,66 @@ ENTRY(irq_entries_start) vector=vector+1 .endr -/* - * the CPU automatically disables interrupts when executing an IRQ vector, - * so IRQ-flags tracing has to follow that: - */ ALIGN common_interrupt: SAVE_ALL - TRACE_IRQS_OFF movl %esp,%eax call do_IRQ jmp ret_from_intr - CFI_ENDPROC #define BUILD_INTERRUPT(name, nr) \ ENTRY(name) \ - RING0_INT_FRAME; \ - pushl $~(nr); \ - CFI_ADJUST_CFA_OFFSET 4; \ - SAVE_ALL; \ - TRACE_IRQS_OFF \ + pushl $nr-256; \ + SAVE_ALL \ movl %esp,%eax; \ call smp_/**/name; \ - jmp ret_from_intr; \ - CFI_ENDPROC + jmp ret_from_intr; /* The include is where all of the SMP etc. interrupts come from */ #include "entry_arch.h" ENTRY(divide_error) - RING0_INT_FRAME pushl $0 # no error code - CFI_ADJUST_CFA_OFFSET 4 pushl $do_divide_error - CFI_ADJUST_CFA_OFFSET 4 ALIGN error_code: pushl %ds - CFI_ADJUST_CFA_OFFSET 4 - /*CFI_REL_OFFSET ds, 0*/ pushl %eax - CFI_ADJUST_CFA_OFFSET 4 - CFI_REL_OFFSET eax, 0 xorl %eax, %eax pushl %ebp - CFI_ADJUST_CFA_OFFSET 4 - CFI_REL_OFFSET ebp, 0 pushl %edi - CFI_ADJUST_CFA_OFFSET 4 - CFI_REL_OFFSET edi, 0 pushl %esi - CFI_ADJUST_CFA_OFFSET 4 - CFI_REL_OFFSET esi, 0 pushl %edx - CFI_ADJUST_CFA_OFFSET 4 - CFI_REL_OFFSET edx, 0 decl %eax # eax = -1 pushl %ecx - CFI_ADJUST_CFA_OFFSET 4 - CFI_REL_OFFSET ecx, 0 pushl %ebx - CFI_ADJUST_CFA_OFFSET 4 - CFI_REL_OFFSET ebx, 0 cld pushl %es - CFI_ADJUST_CFA_OFFSET 4 - /*CFI_REL_OFFSET es, 0*/ UNWIND_ESPFIX_STACK popl %ecx - CFI_ADJUST_CFA_OFFSET -4 - /*CFI_REGISTER es, ecx*/ movl ES(%esp), %edi # get the function address movl ORIG_EAX(%esp), %edx # get the error code movl %eax, ORIG_EAX(%esp) movl %ecx, ES(%esp) - /*CFI_REL_OFFSET es, ES*/ movl $(__USER_DS), %ecx movl %ecx, %ds movl %ecx, %es movl %esp,%eax # pt_regs pointer call *%edi jmp ret_from_exception - CFI_ENDPROC ENTRY(coprocessor_error) - RING0_INT_FRAME pushl $0 - CFI_ADJUST_CFA_OFFSET 4 pushl $do_coprocessor_error - CFI_ADJUST_CFA_OFFSET 4 jmp error_code - CFI_ENDPROC ENTRY(simd_coprocessor_error) - RING0_INT_FRAME pushl $0 - CFI_ADJUST_CFA_OFFSET 4 pushl $do_simd_coprocessor_error - CFI_ADJUST_CFA_OFFSET 4 jmp error_code - CFI_ENDPROC ENTRY(device_not_available) - RING0_INT_FRAME pushl $-1 # mark this as an int - CFI_ADJUST_CFA_OFFSET 4 SAVE_ALL movl %cr0, %eax testl $0x4, %eax # EM (math emulation bit) @@ -677,19 +485,16 @@ ENTRY(device_not_available) jmp ret_from_exception device_not_available_emulate: pushl $0 # temporary storage for ORIG_EIP - CFI_ADJUST_CFA_OFFSET 4 call math_emulate addl $4, %esp - CFI_ADJUST_CFA_OFFSET -4 jmp ret_from_exception - CFI_ENDPROC /* * Debug traps and NMI can happen at the one SYSENTER instruction * that sets up the real kernel stack. Check here, since we can't * allow the wrong stack to be used. * - * "SYSENTER_stack_esp0+12" is because the NMI/debug handler will have + * "TSS_sysenter_esp0+12" is because the NMI/debug handler will have * already pushed 3 words if it hits on the sysenter instruction: * eflags, cs and eip. * @@ -701,31 +506,22 @@ device_not_available_emulate: cmpw $__KERNEL_CS,4(%esp); \ jne ok; \ label: \ - movl SYSENTER_stack_esp0+offset(%esp),%esp; \ - CFI_DEF_CFA esp, 0; \ - CFI_UNDEFINED eip; \ + movl TSS_sysenter_esp0+offset(%esp),%esp; \ pushfl; \ - CFI_ADJUST_CFA_OFFSET 4; \ pushl $__KERNEL_CS; \ - CFI_ADJUST_CFA_OFFSET 4; \ - pushl $sysenter_past_esp; \ - CFI_ADJUST_CFA_OFFSET 4; \ - CFI_REL_OFFSET eip, 0 + pushl $sysenter_past_esp KPROBE_ENTRY(debug) - RING0_INT_FRAME cmpl $sysenter_entry,(%esp) jne debug_stack_correct FIX_STACK(12, debug_stack_correct, debug_esp_fix_insn) debug_stack_correct: pushl $-1 # mark this as an int - CFI_ADJUST_CFA_OFFSET 4 SAVE_ALL xorl %edx,%edx # error code 0 movl %esp,%eax # pt_regs pointer call do_debug jmp ret_from_exception - CFI_ENDPROC .previous .text /* * NMI is doubly nasty. It can happen _while_ we're handling @@ -736,18 +532,14 @@ debug_stack_correct: * fault happened on the sysenter path. */ ENTRY(nmi) - RING0_INT_FRAME pushl %eax - CFI_ADJUST_CFA_OFFSET 4 movl %ss, %eax cmpw $__ESPFIX_SS, %ax popl %eax - CFI_ADJUST_CFA_OFFSET -4 je nmi_16bit_stack cmpl $sysenter_entry,(%esp) je nmi_stack_fixup pushl %eax - CFI_ADJUST_CFA_OFFSET 4 movl %esp,%eax /* Do not access memory above the end of our stack page, * it might not exist. @@ -755,28 +547,21 @@ ENTRY(nmi) andl $(THREAD_SIZE-1),%eax cmpl $(THREAD_SIZE-20),%eax popl %eax - CFI_ADJUST_CFA_OFFSET -4 jae nmi_stack_correct cmpl $sysenter_entry,12(%esp) je nmi_debug_stack_check nmi_stack_correct: - /* We have a RING0_INT_FRAME here */ pushl %eax - CFI_ADJUST_CFA_OFFSET 4 SAVE_ALL xorl %edx,%edx # zero error code movl %esp,%eax # pt_regs pointer call do_nmi - jmp restore_nocheck_notrace - CFI_ENDPROC + jmp restore_all nmi_stack_fixup: - RING0_INT_FRAME FIX_STACK(12,nmi_stack_correct, 1) jmp nmi_stack_correct - nmi_debug_stack_check: - /* We have a RING0_INT_FRAME here */ cmpw $__KERNEL_CS,16(%esp) jne nmi_stack_correct cmpl $debug,(%esp) @@ -787,192 +572,94 @@ nmi_debug_stack_check: jmp nmi_stack_correct nmi_16bit_stack: - /* We have a RING0_INT_FRAME here. - * - * create the pointer to lss back - */ + /* create the pointer to lss back */ pushl %ss - CFI_ADJUST_CFA_OFFSET 4 pushl %esp - CFI_ADJUST_CFA_OFFSET 4 movzwl %sp, %esp addw $4, (%esp) /* copy the iret frame of 12 bytes */ .rept 3 pushl 16(%esp) - CFI_ADJUST_CFA_OFFSET 4 .endr pushl %eax - CFI_ADJUST_CFA_OFFSET 4 SAVE_ALL FIXUP_ESPFIX_STACK # %eax == %esp - CFI_ADJUST_CFA_OFFSET -20 # the frame has now moved xorl %edx,%edx # zero error code call do_nmi RESTORE_REGS lss 12+4(%esp), %esp # back to 16bit stack 1: iret - CFI_ENDPROC .section __ex_table,"a" .align 4 .long 1b,iret_exc .previous KPROBE_ENTRY(int3) - RING0_INT_FRAME pushl $-1 # mark this as an int - CFI_ADJUST_CFA_OFFSET 4 SAVE_ALL xorl %edx,%edx # zero error code movl %esp,%eax # pt_regs pointer call do_int3 jmp ret_from_exception - CFI_ENDPROC .previous .text ENTRY(overflow) - RING0_INT_FRAME pushl $0 - CFI_ADJUST_CFA_OFFSET 4 pushl $do_overflow - CFI_ADJUST_CFA_OFFSET 4 jmp error_code - CFI_ENDPROC ENTRY(bounds) - RING0_INT_FRAME pushl $0 - CFI_ADJUST_CFA_OFFSET 4 pushl $do_bounds - CFI_ADJUST_CFA_OFFSET 4 jmp error_code - CFI_ENDPROC ENTRY(invalid_op) - RING0_INT_FRAME pushl $0 - CFI_ADJUST_CFA_OFFSET 4 pushl $do_invalid_op - CFI_ADJUST_CFA_OFFSET 4 jmp error_code - CFI_ENDPROC ENTRY(coprocessor_segment_overrun) - RING0_INT_FRAME pushl $0 - CFI_ADJUST_CFA_OFFSET 4 pushl $do_coprocessor_segment_overrun - CFI_ADJUST_CFA_OFFSET 4 jmp error_code - CFI_ENDPROC ENTRY(invalid_TSS) - RING0_EC_FRAME pushl $do_invalid_TSS - CFI_ADJUST_CFA_OFFSET 4 jmp error_code - CFI_ENDPROC ENTRY(segment_not_present) - RING0_EC_FRAME pushl $do_segment_not_present - CFI_ADJUST_CFA_OFFSET 4 jmp error_code - CFI_ENDPROC ENTRY(stack_segment) - RING0_EC_FRAME pushl $do_stack_segment - CFI_ADJUST_CFA_OFFSET 4 jmp error_code - CFI_ENDPROC KPROBE_ENTRY(general_protection) - RING0_EC_FRAME pushl $do_general_protection - CFI_ADJUST_CFA_OFFSET 4 jmp error_code - CFI_ENDPROC .previous .text ENTRY(alignment_check) - RING0_EC_FRAME pushl $do_alignment_check - CFI_ADJUST_CFA_OFFSET 4 jmp error_code - CFI_ENDPROC KPROBE_ENTRY(page_fault) - RING0_EC_FRAME pushl $do_page_fault - CFI_ADJUST_CFA_OFFSET 4 jmp error_code - CFI_ENDPROC .previous .text #ifdef CONFIG_X86_MCE ENTRY(machine_check) - RING0_INT_FRAME pushl $0 - CFI_ADJUST_CFA_OFFSET 4 pushl machine_check_vector - CFI_ADJUST_CFA_OFFSET 4 jmp error_code - CFI_ENDPROC #endif ENTRY(spurious_interrupt_bug) - RING0_INT_FRAME pushl $0 - CFI_ADJUST_CFA_OFFSET 4 pushl $do_spurious_interrupt_bug - CFI_ADJUST_CFA_OFFSET 4 jmp error_code - CFI_ENDPROC - -#ifdef CONFIG_STACK_UNWIND -ENTRY(arch_unwind_init_running) - CFI_STARTPROC - movl 4(%esp), %edx - movl (%esp), %ecx - leal 4(%esp), %eax - movl %ebx, EBX(%edx) - xorl %ebx, %ebx - movl %ebx, ECX(%edx) - movl %ebx, EDX(%edx) - movl %esi, ESI(%edx) - movl %edi, EDI(%edx) - movl %ebp, EBP(%edx) - movl %ebx, EAX(%edx) - movl $__USER_DS, DS(%edx) - movl $__USER_DS, ES(%edx) - movl %ebx, ORIG_EAX(%edx) - movl %ecx, EIP(%edx) - movl 12(%esp), %ecx - movl $__KERNEL_CS, CS(%edx) - movl %ebx, EFLAGS(%edx) - movl %eax, OLDESP(%edx) - movl 8(%esp), %eax - movl %ecx, 8(%esp) - movl EBX(%edx), %ebx - movl $__KERNEL_DS, OLDSS(%edx) - jmpl *%eax - CFI_ENDPROC -ENDPROC(arch_unwind_init_running) -#endif - -ENTRY(kernel_thread_helper) - pushl $0 # fake return address for unwinder - CFI_STARTPROC - movl %edx,%eax - push %edx - CFI_ADJUST_CFA_OFFSET 4 - call *%ebx - push %eax - CFI_ADJUST_CFA_OFFSET 4 - call do_exit - CFI_ENDPROC -ENDPROC(kernel_thread_helper) .section .rodata,"a" #include "syscall_table.S" diff --git a/arch/i386/kernel/head.S b/arch/i386/kernel/head.S index a6b8bd89a..e0b7c632e 100644 --- a/arch/i386/kernel/head.S +++ b/arch/i386/kernel/head.S @@ -8,6 +8,7 @@ */ .text +#include #include #include #include @@ -317,14 +318,20 @@ is386: movl $2,%ecx # set MP movl %eax,%gs lldt %ax cld # gcc2 wants the direction flag cleared at all times - pushl %eax # fake return address #ifdef CONFIG_SMP movb ready, %cl movb $1, ready - cmpb $0,%cl # the first CPU calls start_kernel - jne initialize_secondary # all other CPUs call initialize_secondary + cmpb $0,%cl + je 1f # the first CPU calls start_kernel + # all other CPUs call initialize_secondary + call initialize_secondary + jmp L6 +1: #endif /* CONFIG_SMP */ - jmp start_kernel + call start_kernel +L6: + jmp L6 # main should never return here, but + # just in case, we know what happens. /* * We depend on ET to be correct. This checks for 287/387. @@ -443,6 +450,7 @@ int_msg: .globl boot_gdt_descr .globl idt_descr +.globl cpu_gdt_descr ALIGN # early boot GDT descriptor (must use 1:1 address mapping) @@ -462,6 +470,8 @@ cpu_gdt_descr: .word GDT_ENTRIES*8-1 .long cpu_gdt_table + .fill NR_CPUS-1,8,0 # space for the other GDT descriptors + /* * The boot_gdt_table must mirror the equivalent in setup.S and is * used only for booting. @@ -475,7 +485,7 @@ ENTRY(boot_gdt_table) /* * The Global Descriptor Table contains 28 quadwords, per-CPU. */ - .align L1_CACHE_BYTES + .align PAGE_SIZE_asm ENTRY(cpu_gdt_table) .quad 0x0000000000000000 /* NULL descriptor */ .quad 0x0000000000000000 /* 0x0b reserved */ diff --git a/arch/i386/kernel/i386_ksyms.c b/arch/i386/kernel/i386_ksyms.c index e3d4b73bf..055325056 100644 --- a/arch/i386/kernel/i386_ksyms.c +++ b/arch/i386/kernel/i386_ksyms.c @@ -1,3 +1,4 @@ +#include #include #include #include @@ -18,6 +19,7 @@ EXPORT_SYMBOL(__put_user_2); EXPORT_SYMBOL(__put_user_4); EXPORT_SYMBOL(__put_user_8); +EXPORT_SYMBOL(strpbrk); EXPORT_SYMBOL(strstr); #ifdef CONFIG_SMP diff --git a/arch/i386/kernel/i387.c b/arch/i386/kernel/i387.c index 665847281..d75524758 100644 --- a/arch/i386/kernel/i387.c +++ b/arch/i386/kernel/i387.c @@ -8,6 +8,7 @@ * Gareth Hughes , May 2000 */ +#include #include #include #include @@ -24,7 +25,7 @@ #define HAVE_HWFP 1 #endif -static unsigned long mxcsr_feature_mask __read_mostly = 0xffffffff; +static unsigned long mxcsr_feature_mask = 0xffffffff; void mxcsr_feature_mask_init(void) { diff --git a/arch/i386/kernel/i8259.c b/arch/i386/kernel/i8259.c index d4756d154..323ef8ab3 100644 --- a/arch/i386/kernel/i8259.c +++ b/arch/i386/kernel/i8259.c @@ -1,3 +1,4 @@ +#include #include #include #include @@ -131,7 +132,7 @@ void make_8259A_irq(unsigned int irq) { disable_irq_nosync(irq); io_apic_irqs &= ~(1< #include #include +#include #include #include #include @@ -37,7 +38,6 @@ #include #include #include -#include #include @@ -50,7 +50,6 @@ atomic_t irq_mis_count; static struct { int pin, apic; } ioapic_i8259 = { -1, -1 }; static DEFINE_SPINLOCK(ioapic_lock); -static DEFINE_SPINLOCK(vector_lock); int timer_over_8254 __initdata = 1; @@ -268,7 +267,7 @@ static void set_ioapic_affinity_irq(unsigned int irq, cpumask_t cpumask) # include /* kmalloc() */ # include /* time_after() */ -#ifdef CONFIG_BALANCED_IRQ_DEBUG +# ifdef CONFIG_BALANCED_IRQ_DEBUG # define TDprintk(x...) do { printk("<%ld:%s:%d>: ", jiffies, __FILE__, __LINE__); printk(x); } while (0) # define Dprintk(x...) do { TDprintk(x); } while (0) # else @@ -276,15 +275,10 @@ static void set_ioapic_affinity_irq(unsigned int irq, cpumask_t cpumask) # define Dprintk(x...) # endif -#define IRQBALANCE_CHECK_ARCH -999 -#define MAX_BALANCED_IRQ_INTERVAL (5*HZ) -#define MIN_BALANCED_IRQ_INTERVAL (HZ/2) -#define BALANCED_IRQ_MORE_DELTA (HZ/10) -#define BALANCED_IRQ_LESS_DELTA (HZ) -static int irqbalance_disabled __read_mostly = IRQBALANCE_CHECK_ARCH; -static int physical_balance __read_mostly; -static long balanced_irq_interval __read_mostly = MAX_BALANCED_IRQ_INTERVAL; +#define IRQBALANCE_CHECK_ARCH -999 +static int irqbalance_disabled = IRQBALANCE_CHECK_ARCH; +static int physical_balance = 0; static struct irq_cpu_info { unsigned long * last_irq; @@ -303,14 +297,12 @@ static struct irq_cpu_info { #define CPU_TO_PACKAGEINDEX(i) (first_cpu(cpu_sibling_map[i])) -static cpumask_t balance_irq_affinity[NR_IRQS] = { - [0 ... NR_IRQS-1] = CPU_MASK_ALL -}; +#define MAX_BALANCED_IRQ_INTERVAL (5*HZ) +#define MIN_BALANCED_IRQ_INTERVAL (HZ/2) +#define BALANCED_IRQ_MORE_DELTA (HZ/10) +#define BALANCED_IRQ_LESS_DELTA (HZ) -void set_balance_irq_affinity(unsigned int irq, cpumask_t mask) -{ - balance_irq_affinity[irq] = mask; -} +static long balanced_irq_interval = MAX_BALANCED_IRQ_INTERVAL; static unsigned long move(int curr_cpu, cpumask_t allowed_mask, unsigned long now, int direction) @@ -348,7 +340,7 @@ static inline void balance_irq(int cpu, int irq) if (irqbalance_disabled) return; - cpus_and(allowed_mask, cpu_online_map, balance_irq_affinity[irq]); + cpus_and(allowed_mask, cpu_online_map, irq_affinity[irq]); new_cpu = move(cpu, allowed_mask, now, 1); if (cpu != new_cpu) { set_pending_irq(irq, cpumask_of_cpu(new_cpu)); @@ -359,8 +351,8 @@ static inline void rotate_irqs_among_cpus(unsigned long useful_load_threshold) { int i, j; Dprintk("Rotating IRQs among CPUs.\n"); - for_each_online_cpu(i) { - for (j = 0; j < NR_IRQS; j++) { + for (i = 0; i < NR_CPUS; i++) { + for (j = 0; cpu_online(i) && (j < NR_IRQS); j++) { if (!irq_desc[j].action) continue; /* Is it a significant load ? */ @@ -389,7 +381,7 @@ static void do_irq_balance(void) unsigned long imbalance = 0; cpumask_t allowed_mask, target_cpu_mask, tmp; - for_each_possible_cpu(i) { + for (i = 0; i < NR_CPUS; i++) { int package_index; CPU_IRQ(i) = 0; if (!cpu_online(i)) @@ -430,7 +422,9 @@ static void do_irq_balance(void) } } /* Find the least loaded processor package */ - for_each_online_cpu(i) { + for (i = 0; i < NR_CPUS; i++) { + if (!cpu_online(i)) + continue; if (i != CPU_TO_PACKAGEINDEX(i)) continue; if (min_cpu_irq > CPU_IRQ(i)) { @@ -447,7 +441,9 @@ tryanothercpu: */ tmp_cpu_irq = 0; tmp_loaded = -1; - for_each_online_cpu(i) { + for (i = 0; i < NR_CPUS; i++) { + if (!cpu_online(i)) + continue; if (i != CPU_TO_PACKAGEINDEX(i)) continue; if (max_cpu_irq <= CPU_IRQ(i)) @@ -537,9 +533,7 @@ tryanotherirq: } } - cpus_and(allowed_mask, - cpu_online_map, - balance_irq_affinity[selected_irq]); + cpus_and(allowed_mask, cpu_online_map, irq_affinity[selected_irq]); target_cpu_mask = cpumask_of_cpu(min_loaded); cpus_and(tmp, target_cpu_mask, allowed_mask); @@ -580,7 +574,7 @@ static int balanced_irq(void *unused) /* push everything to CPU 0 to give us a starting point. */ for (i = 0 ; i < NR_IRQS ; i++) { - irq_desc[i].pending_mask = cpumask_of_cpu(0); + pending_irq_cpumask[i] = cpumask_of_cpu(0); set_pending_irq(i, cpumask_of_cpu(0)); } @@ -625,7 +619,9 @@ static int __init balanced_irq_init(void) if (smp_num_siblings > 1 && !cpus_empty(tmp)) physical_balance = 1; - for_each_online_cpu(i) { + for (i = 0; i < NR_CPUS; i++) { + if (!cpu_online(i)) + continue; irq_cpu_data[i].irq_delta = kmalloc(sizeof(unsigned long) * NR_IRQS, GFP_KERNEL); irq_cpu_data[i].last_irq = kmalloc(sizeof(unsigned long) * NR_IRQS, GFP_KERNEL); if (irq_cpu_data[i].irq_delta == NULL || irq_cpu_data[i].last_irq == NULL) { @@ -642,11 +638,9 @@ static int __init balanced_irq_init(void) else printk(KERN_ERR "balanced_irq_init: failed to spawn balanced_irq"); failed: - for_each_possible_cpu(i) { + for (i = 0; i < NR_CPUS; i++) { kfree(irq_cpu_data[i].irq_delta); - irq_cpu_data[i].irq_delta = NULL; kfree(irq_cpu_data[i].last_irq); - irq_cpu_data[i].last_irq = NULL; } return 0; } @@ -654,7 +648,7 @@ failed: int __init irqbalance_disable(char *str) { irqbalance_disabled = 1; - return 1; + return 0; } __setup("noirqbalance", irqbalance_disable); @@ -1162,17 +1156,10 @@ u8 irq_vector[NR_IRQ_VECTORS] __read_mostly = { FIRST_DEVICE_VECTOR , 0 }; int assign_irq_vector(int irq) { static int current_vector = FIRST_DEVICE_VECTOR, offset = 0; - unsigned long flags; - int vector; - BUG_ON(irq != AUTO_ASSIGN && (unsigned)irq >= NR_IRQ_VECTORS); - - spin_lock_irqsave(&vector_lock, flags); - - if (irq != AUTO_ASSIGN && IO_APIC_VECTOR(irq) > 0) { - spin_unlock_irqrestore(&vector_lock, flags); + BUG_ON(irq >= NR_IRQ_VECTORS); + if (irq != AUTO_ASSIGN && IO_APIC_VECTOR(irq) > 0) return IO_APIC_VECTOR(irq); - } next: current_vector += 8; if (current_vector == SYSCALL_VECTOR) @@ -1180,21 +1167,16 @@ next: if (current_vector >= FIRST_SYSTEM_VECTOR) { offset++; - if (!(offset%8)) { - spin_unlock_irqrestore(&vector_lock, flags); + if (!(offset%8)) return -ENOSPC; - } current_vector = FIRST_DEVICE_VECTOR + offset; } - vector = current_vector; - vector_irq[vector] = irq; + vector_irq[current_vector] = irq; if (irq != AUTO_ASSIGN) - IO_APIC_VECTOR(irq) = vector; - - spin_unlock_irqrestore(&vector_lock, flags); + IO_APIC_VECTOR(irq) = current_vector; - return vector; + return current_vector; } static struct hw_interrupt_type ioapic_level_type; @@ -1204,18 +1186,23 @@ static struct hw_interrupt_type ioapic_edge_type; #define IOAPIC_EDGE 0 #define IOAPIC_LEVEL 1 -static void ioapic_register_intr(int irq, int vector, unsigned long trigger) +static inline void ioapic_register_intr(int irq, int vector, unsigned long trigger) { - unsigned idx; - - idx = use_pci_vector() && !platform_legacy_irq(irq) ? vector : irq; - - if ((trigger == IOAPIC_AUTO && IO_APIC_irq_trigger(irq)) || - trigger == IOAPIC_LEVEL) - irq_desc[idx].chip = &ioapic_level_type; - else - irq_desc[idx].chip = &ioapic_edge_type; - set_intr_gate(vector, interrupt[idx]); + if (use_pci_vector() && !platform_legacy_irq(irq)) { + if ((trigger == IOAPIC_AUTO && IO_APIC_irq_trigger(irq)) || + trigger == IOAPIC_LEVEL) + irq_desc[vector].handler = &ioapic_level_type; + else + irq_desc[vector].handler = &ioapic_edge_type; + set_intr_gate(vector, interrupt[vector]); + } else { + if ((trigger == IOAPIC_AUTO && IO_APIC_irq_trigger(irq)) || + trigger == IOAPIC_LEVEL) + irq_desc[irq].handler = &ioapic_level_type; + else + irq_desc[irq].handler = &ioapic_edge_type; + set_intr_gate(vector, interrupt[irq]); + } } static void __init setup_IO_APIC_irqs(void) @@ -1326,7 +1313,7 @@ static void __init setup_ExtINT_IRQ0_pin(unsigned int apic, unsigned int pin, in * The timer IRQ doesn't have to know that behind the * scene we have a 8259A-master in AEOI mode ... */ - irq_desc[0].chip = &ioapic_edge_type; + irq_desc[0].handler = &ioapic_edge_type; /* * Add it to the IO-APIC irq-routing table: @@ -1774,8 +1761,7 @@ static void __init setup_ioapic_ids_from_mpc(void) * Don't check I/O APIC IDs for xAPIC systems. They have * no meaning without the serial APIC bus. */ - if (!(boot_cpu_data.x86_vendor == X86_VENDOR_INTEL) - || APIC_XAPIC(apic_version[boot_cpu_physical_apicid])) + if (!(boot_cpu_data.x86_vendor == X86_VENDOR_INTEL && boot_cpu_data.x86 < 15)) return; /* * This is broken; anything with a real cpu count has to @@ -2070,13 +2056,6 @@ static void set_ioapic_affinity_vector (unsigned int vector, #endif #endif -static int ioapic_retrigger(unsigned int irq) -{ - send_IPI_self(IO_APIC_VECTOR(irq)); - - return 1; -} - /* * Level and edge triggered IO-APIC interrupts need different handling, * so we use two separate IRQ descriptors. Edge triggered IRQs can be @@ -2096,7 +2075,6 @@ static struct hw_interrupt_type ioapic_edge_type __read_mostly = { #ifdef CONFIG_SMP .set_affinity = set_ioapic_affinity, #endif - .retrigger = ioapic_retrigger, }; static struct hw_interrupt_type ioapic_level_type __read_mostly = { @@ -2110,7 +2088,6 @@ static struct hw_interrupt_type ioapic_level_type __read_mostly = { #ifdef CONFIG_SMP .set_affinity = set_ioapic_affinity, #endif - .retrigger = ioapic_retrigger, }; static inline void init_IO_APIC_traps(void) @@ -2145,7 +2122,7 @@ static inline void init_IO_APIC_traps(void) make_8259A_irq(irq); else /* Strange. Oh, well.. */ - irq_desc[irq].chip = &no_irq_type; + irq_desc[irq].handler = &no_irq_type; } } } @@ -2264,8 +2241,6 @@ static inline void unlock_ExtINT_logic(void) spin_unlock_irqrestore(&ioapic_lock, flags); } -int timer_uses_ioapic_pin_0; - /* * This code may look a bit paranoid, but it's supposed to cooperate with * a wide range of boards and BIOS bugs. Fortunately only the timer IRQ @@ -2302,9 +2277,6 @@ static inline void check_timer(void) pin2 = ioapic_i8259.pin; apic2 = ioapic_i8259.apic; - if (pin1 == 0) - timer_uses_ioapic_pin_0 = 1; - printk(KERN_INFO "..TIMER: vector=0x%02X apic1=%d pin1=%d apic2=%d pin2=%d\n", vector, apic1, pin1, apic2, pin2); @@ -2361,7 +2333,7 @@ static inline void check_timer(void) printk(KERN_INFO "...trying to set up timer as Virtual Wire IRQ..."); disable_8259A_irq(0); - irq_desc[0].chip = &lapic_irq_type; + irq_desc[0].handler = &lapic_irq_type; apic_write_around(APIC_LVT0, APIC_DM_FIXED | vector); /* Fixed mode */ enable_8259A_irq(0); diff --git a/arch/i386/kernel/ioport.c b/arch/i386/kernel/ioport.c index 498e8bc19..79026f026 100644 --- a/arch/i386/kernel/ioport.c +++ b/arch/i386/kernel/ioport.c @@ -79,7 +79,6 @@ asmlinkage long sys_ioperm(unsigned long from, unsigned long num, int turn_on) memset(bitmap, 0xff, IO_BITMAP_BYTES); t->io_bitmap_ptr = bitmap; - set_thread_flag(TIF_IO_BITMAP); } /* diff --git a/arch/i386/kernel/irq.c b/arch/i386/kernel/irq.c index 5fe547cd8..f3a9c78c4 100644 --- a/arch/i386/kernel/irq.c +++ b/arch/i386/kernel/irq.c @@ -42,8 +42,8 @@ union irq_ctx { u32 stack[THREAD_SIZE/sizeof(u32)]; }; -static union irq_ctx *hardirq_ctx[NR_CPUS] __read_mostly; -static union irq_ctx *softirq_ctx[NR_CPUS] __read_mostly; +static union irq_ctx *hardirq_ctx[NR_CPUS]; +static union irq_ctx *softirq_ctx[NR_CPUS]; #endif /* @@ -53,19 +53,13 @@ static union irq_ctx *softirq_ctx[NR_CPUS] __read_mostly; */ fastcall unsigned int do_IRQ(struct pt_regs *regs) { - /* high bit used in ret_from_ code */ - int irq = ~regs->orig_eax; + /* high bits used in ret_from_ code */ + int irq = regs->orig_eax & 0xff; #ifdef CONFIG_4KSTACKS union irq_ctx *curctx, *irqctx; u32 *isp; #endif - if (unlikely((unsigned)irq >= NR_IRQS)) { - printk(KERN_EMERG "%s: cannot handle IRQ %d\n", - __FUNCTION__, irq); - BUG(); - } - irq_enter(); #ifdef CONFIG_DEBUG_STACKOVERFLOW /* Debugging check for stack overflow: is there less than 1KB free? */ @@ -101,14 +95,6 @@ fastcall unsigned int do_IRQ(struct pt_regs *regs) irqctx->tinfo.task = curctx->tinfo.task; irqctx->tinfo.previous_esp = current_stack_pointer; - /* - * Copy the softirq bits in preempt_count so that the - * softirq checks work in the hardirq context. - */ - irqctx->tinfo.preempt_count = - (irqctx->tinfo.preempt_count & ~SOFTIRQ_MASK) | - (curctx->tinfo.preempt_count & SOFTIRQ_MASK); - asm volatile( " xchgl %%ebx,%%esp \n" " call __do_IRQ \n" @@ -161,7 +147,7 @@ void irq_ctx_init(int cpu) irqctx->tinfo.task = NULL; irqctx->tinfo.exec_domain = NULL; irqctx->tinfo.cpu = cpu; - irqctx->tinfo.preempt_count = 0; + irqctx->tinfo.preempt_count = SOFTIRQ_OFFSET; irqctx->tinfo.addr_limit = MAKE_MM_SEG(0); softirq_ctx[cpu] = irqctx; @@ -206,10 +192,6 @@ asmlinkage void do_softirq(void) : "0"(isp) : "memory", "cc", "edx", "ecx", "eax" ); - /* - * Shouldnt happen, we returned above if in_interrupt(): - */ - WARN_ON_ONCE(softirq_count()); } local_irq_restore(flags); @@ -237,7 +219,7 @@ int show_interrupts(struct seq_file *p, void *v) if (i == 0) { seq_printf(p, " "); for_each_online_cpu(j) - seq_printf(p, "CPU%-8d",j); + seq_printf(p, "CPU%d ",j); seq_putc(p, '\n'); } @@ -253,7 +235,7 @@ int show_interrupts(struct seq_file *p, void *v) for_each_online_cpu(j) seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]); #endif - seq_printf(p, " %14s", irq_desc[i].chip->typename); + seq_printf(p, " %14s", irq_desc[i].handler->typename); seq_printf(p, " %s", action->name); for (action=action->next; action; action = action->next) @@ -295,13 +277,13 @@ void fixup_irqs(cpumask_t map) if (irq == 2) continue; - cpus_and(mask, irq_desc[irq].affinity, map); + cpus_and(mask, irq_affinity[irq], map); if (any_online_cpu(mask) == NR_CPUS) { printk("Breaking affinity for irq %i\n", irq); mask = map; } - if (irq_desc[irq].chip->set_affinity) - irq_desc[irq].chip->set_affinity(irq, mask); + if (irq_desc[irq].handler->set_affinity) + irq_desc[irq].handler->set_affinity(irq, mask); else if (irq_desc[irq].action && !(warned++)) printk("Cannot set affinity for irq %i\n", irq); } diff --git a/arch/i386/kernel/kprobes.c b/arch/i386/kernel/kprobes.c index afe6505ca..694a13997 100644 --- a/arch/i386/kernel/kprobes.c +++ b/arch/i386/kernel/kprobes.c @@ -28,117 +28,23 @@ * added function-return probes. */ +#include #include #include #include #include #include #include -#include void jprobe_return_end(void); DEFINE_PER_CPU(struct kprobe *, current_kprobe) = NULL; DEFINE_PER_CPU(struct kprobe_ctlblk, kprobe_ctlblk); -/* insert a jmp code */ -static __always_inline void set_jmp_op(void *from, void *to) -{ - struct __arch_jmp_op { - char op; - long raddr; - } __attribute__((packed)) *jop; - jop = (struct __arch_jmp_op *)from; - jop->raddr = (long)(to) - ((long)(from) + 5); - jop->op = RELATIVEJUMP_INSTRUCTION; -} - -/* - * returns non-zero if opcodes can be boosted. - */ -static __always_inline int can_boost(kprobe_opcode_t *opcodes) -{ -#define W(row,b0,b1,b2,b3,b4,b5,b6,b7,b8,b9,ba,bb,bc,bd,be,bf) \ - (((b0##UL << 0x0)|(b1##UL << 0x1)|(b2##UL << 0x2)|(b3##UL << 0x3) | \ - (b4##UL << 0x4)|(b5##UL << 0x5)|(b6##UL << 0x6)|(b7##UL << 0x7) | \ - (b8##UL << 0x8)|(b9##UL << 0x9)|(ba##UL << 0xa)|(bb##UL << 0xb) | \ - (bc##UL << 0xc)|(bd##UL << 0xd)|(be##UL << 0xe)|(bf##UL << 0xf)) \ - << (row % 32)) - /* - * Undefined/reserved opcodes, conditional jump, Opcode Extension - * Groups, and some special opcodes can not be boost. - */ - static const unsigned long twobyte_is_boostable[256 / 32] = { - /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ - /* ------------------------------- */ - W(0x00, 0,0,1,1,0,0,1,0,1,1,0,0,0,0,0,0)| /* 00 */ - W(0x10, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), /* 10 */ - W(0x20, 1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0)| /* 20 */ - W(0x30, 0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0), /* 30 */ - W(0x40, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1)| /* 40 */ - W(0x50, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), /* 50 */ - W(0x60, 1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1)| /* 60 */ - W(0x70, 0,0,0,0,1,1,1,1,0,0,0,0,0,0,1,1), /* 70 */ - W(0x80, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0)| /* 80 */ - W(0x90, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1), /* 90 */ - W(0xa0, 1,1,0,1,1,1,0,0,1,1,0,1,1,1,0,1)| /* a0 */ - W(0xb0, 1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1), /* b0 */ - W(0xc0, 1,1,0,0,0,0,0,0,1,1,1,1,1,1,1,1)| /* c0 */ - W(0xd0, 0,1,1,1,0,1,0,0,1,1,0,1,1,1,0,1), /* d0 */ - W(0xe0, 0,1,1,0,0,1,0,0,1,1,0,1,1,1,0,1)| /* e0 */ - W(0xf0, 0,1,1,1,0,1,0,0,1,1,1,0,1,1,1,0) /* f0 */ - /* ------------------------------- */ - /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ - }; -#undef W - kprobe_opcode_t opcode; - kprobe_opcode_t *orig_opcodes = opcodes; -retry: - if (opcodes - orig_opcodes > MAX_INSN_SIZE - 1) - return 0; - opcode = *(opcodes++); - - /* 2nd-byte opcode */ - if (opcode == 0x0f) { - if (opcodes - orig_opcodes > MAX_INSN_SIZE - 1) - return 0; - return test_bit(*opcodes, twobyte_is_boostable); - } - - switch (opcode & 0xf0) { - case 0x60: - if (0x63 < opcode && opcode < 0x67) - goto retry; /* prefixes */ - /* can't boost Address-size override and bound */ - return (opcode != 0x62 && opcode != 0x67); - case 0x70: - return 0; /* can't boost conditional jump */ - case 0xc0: - /* can't boost software-interruptions */ - return (0xc1 < opcode && opcode < 0xcc) || opcode == 0xcf; - case 0xd0: - /* can boost AA* and XLAT */ - return (opcode == 0xd4 || opcode == 0xd5 || opcode == 0xd7); - case 0xe0: - /* can boost in/out and absolute jmps */ - return ((opcode & 0x04) || opcode == 0xea); - case 0xf0: - if ((opcode & 0x0c) == 0 && opcode != 0xf1) - goto retry; /* lock/rep(ne) prefix */ - /* clear and set flags can be boost */ - return (opcode == 0xf5 || (0xf7 < opcode && opcode < 0xfe)); - default: - if (opcode == 0x26 || opcode == 0x36 || opcode == 0x3e) - goto retry; /* prefixes */ - /* can't boost CS override and call */ - return (opcode != 0x2e && opcode != 0x9a); - } -} - /* * returns non-zero if opcode modifies the interrupt flag. */ -static int __kprobes is_IF_modifier(kprobe_opcode_t opcode) +static inline int is_IF_modifier(kprobe_opcode_t opcode) { switch (opcode) { case 0xfa: /* cli */ @@ -159,11 +65,6 @@ int __kprobes arch_prepare_kprobe(struct kprobe *p) memcpy(p->ainsn.insn, p->addr, MAX_INSN_SIZE * sizeof(kprobe_opcode_t)); p->opcode = *p->addr; - if (can_boost(p->addr)) { - p->ainsn.boostable = 0; - } else { - p->ainsn.boostable = -1; - } return 0; } @@ -183,12 +84,12 @@ void __kprobes arch_disarm_kprobe(struct kprobe *p) void __kprobes arch_remove_kprobe(struct kprobe *p) { - mutex_lock(&kprobe_mutex); + down(&kprobe_mutex); free_insn_slot(p->ainsn.insn); - mutex_unlock(&kprobe_mutex); + up(&kprobe_mutex); } -static void __kprobes save_previous_kprobe(struct kprobe_ctlblk *kcb) +static inline void save_previous_kprobe(struct kprobe_ctlblk *kcb) { kcb->prev_kprobe.kp = kprobe_running(); kcb->prev_kprobe.status = kcb->kprobe_status; @@ -196,7 +97,7 @@ static void __kprobes save_previous_kprobe(struct kprobe_ctlblk *kcb) kcb->prev_kprobe.saved_eflags = kcb->kprobe_saved_eflags; } -static void __kprobes restore_previous_kprobe(struct kprobe_ctlblk *kcb) +static inline void restore_previous_kprobe(struct kprobe_ctlblk *kcb) { __get_cpu_var(current_kprobe) = kcb->prev_kprobe.kp; kcb->kprobe_status = kcb->prev_kprobe.status; @@ -204,7 +105,7 @@ static void __kprobes restore_previous_kprobe(struct kprobe_ctlblk *kcb) kcb->kprobe_saved_eflags = kcb->prev_kprobe.saved_eflags; } -static void __kprobes set_current_kprobe(struct kprobe *p, struct pt_regs *regs, +static inline void set_current_kprobe(struct kprobe *p, struct pt_regs *regs, struct kprobe_ctlblk *kcb) { __get_cpu_var(current_kprobe) = p; @@ -214,7 +115,7 @@ static void __kprobes set_current_kprobe(struct kprobe *p, struct pt_regs *regs, kcb->kprobe_saved_eflags &= ~IF_MASK; } -static void __kprobes prepare_singlestep(struct kprobe *p, struct pt_regs *regs) +static inline void prepare_singlestep(struct kprobe *p, struct pt_regs *regs) { regs->eflags |= TF_MASK; regs->eflags &= ~IF_MASK; @@ -254,11 +155,10 @@ static int __kprobes kprobe_handler(struct pt_regs *regs) { struct kprobe *p; int ret = 0; - kprobe_opcode_t *addr; + kprobe_opcode_t *addr = NULL; + unsigned long *lp; struct kprobe_ctlblk *kcb; - addr = (kprobe_opcode_t *)(regs->eip - sizeof(kprobe_opcode_t)); - /* * We don't want to be preempted for the entire * duration of kprobe processing @@ -266,6 +166,17 @@ static int __kprobes kprobe_handler(struct pt_regs *regs) preempt_disable(); kcb = get_kprobe_ctlblk(); + /* Check if the application is using LDT entry for its code segment and + * calculate the address by reading the base address from the LDT entry. + */ + if ((regs->xcs & 4) && (current->mm)) { + lp = (unsigned long *) ((unsigned long)((regs->xcs >> 3) * 8) + + (char *) current->mm->context.ldt); + addr = (kprobe_opcode_t *) (get_desc_base(lp) + regs->eip - + sizeof(kprobe_opcode_t)); + } else { + addr = (kprobe_opcode_t *)(regs->eip - sizeof(kprobe_opcode_t)); + } /* Check we're not actually recursing */ if (kprobe_running()) { p = get_kprobe(addr); @@ -289,6 +200,10 @@ static int __kprobes kprobe_handler(struct pt_regs *regs) kcb->kprobe_status = KPROBE_REENTER; return 1; } else { + if (regs->eflags & VM_MASK) { + /* We are in virtual-8086 mode. Return 0 */ + goto no_kprobe; + } if (*addr != BREAKPOINT_INSTRUCTION) { /* The breakpoint instruction was removed by * another cpu right after we hit, no further @@ -308,6 +223,11 @@ static int __kprobes kprobe_handler(struct pt_regs *regs) p = get_kprobe(addr); if (!p) { + if (regs->eflags & VM_MASK) { + /* We are in virtual-8086 mode. Return 0 */ + goto no_kprobe; + } + if (*addr != BREAKPOINT_INSTRUCTION) { /* * The breakpoint instruction was removed right @@ -333,15 +253,6 @@ static int __kprobes kprobe_handler(struct pt_regs *regs) return 1; ss_probe: -#ifndef CONFIG_PREEMPT - if (p->ainsn.boostable == 1 && !p->post_handler){ - /* Boost up -- we can execute copied instructions directly */ - reset_current_kprobe(); - regs->eip = (unsigned long)p->ainsn.insn; - preempt_enable_no_resched(); - return 1; - } -#endif prepare_singlestep(p, regs); kcb->kprobe_status = KPROBE_HIT_SS; return 1; @@ -356,44 +267,17 @@ no_kprobe: * here. When a retprobed function returns, this probe is hit and * trampoline_probe_handler() runs, calling the kretprobe's handler. */ - void __kprobes kretprobe_trampoline_holder(void) + void kretprobe_trampoline_holder(void) { - asm volatile ( ".global kretprobe_trampoline\n" + asm volatile ( ".global kretprobe_trampoline\n" "kretprobe_trampoline: \n" - " pushf\n" - /* skip cs, eip, orig_eax, es, ds */ - " subl $20, %esp\n" - " pushl %eax\n" - " pushl %ebp\n" - " pushl %edi\n" - " pushl %esi\n" - " pushl %edx\n" - " pushl %ecx\n" - " pushl %ebx\n" - " movl %esp, %eax\n" - " call trampoline_handler\n" - /* move eflags to cs */ - " movl 48(%esp), %edx\n" - " movl %edx, 44(%esp)\n" - /* save true return address on eflags */ - " movl %eax, 48(%esp)\n" - " popl %ebx\n" - " popl %ecx\n" - " popl %edx\n" - " popl %esi\n" - " popl %edi\n" - " popl %ebp\n" - " popl %eax\n" - /* skip eip, orig_eax, es, ds */ - " addl $16, %esp\n" - " popf\n" - " ret\n"); -} + "nop\n"); + } /* - * Called from kretprobe_trampoline + * Called when we hit the probe point at kretprobe_trampoline */ -fastcall void *__kprobes trampoline_handler(struct pt_regs *regs) +int __kprobes trampoline_probe_handler(struct kprobe *p, struct pt_regs *regs) { struct kretprobe_instance *ri = NULL; struct hlist_head *head; @@ -422,11 +306,8 @@ fastcall void *__kprobes trampoline_handler(struct pt_regs *regs) /* another task is sharing our hash bucket */ continue; - if (ri->rp && ri->rp->handler){ - __get_cpu_var(current_kprobe) = &ri->rp->kp; + if (ri->rp && ri->rp->handler) ri->rp->handler(ri, regs); - __get_cpu_var(current_kprobe) = NULL; - } orig_ret_address = (unsigned long)ri->ret_addr; recycle_rp_inst(ri); @@ -441,10 +322,18 @@ fastcall void *__kprobes trampoline_handler(struct pt_regs *regs) } BUG_ON(!orig_ret_address || (orig_ret_address == trampoline_address)); + regs->eip = orig_ret_address; + reset_current_kprobe(); spin_unlock_irqrestore(&kretprobe_lock, flags); + preempt_enable_no_resched(); - return (void*)orig_ret_address; + /* + * By returning a non-zero value, we are telling + * kprobe_handler() that we don't want the post_handler + * to run (and have re-enabled preemption) + */ + return 1; } /* @@ -468,82 +357,62 @@ fastcall void *__kprobes trampoline_handler(struct pt_regs *regs) * 2) If the single-stepped instruction was a call, the return address * that is atop the stack is the address following the copied instruction. * We need to make it the address following the original instruction. - * - * This function also checks instruction size for preparing direct execution. */ static void __kprobes resume_execution(struct kprobe *p, struct pt_regs *regs, struct kprobe_ctlblk *kcb) { unsigned long *tos = (unsigned long *)®s->esp; + unsigned long next_eip = 0; unsigned long copy_eip = (unsigned long)p->ainsn.insn; unsigned long orig_eip = (unsigned long)p->addr; - regs->eflags &= ~TF_MASK; switch (p->ainsn.insn[0]) { case 0x9c: /* pushfl */ *tos &= ~(TF_MASK | IF_MASK); *tos |= kcb->kprobe_old_eflags; break; - case 0xc2: /* iret/ret/lret */ - case 0xc3: - case 0xca: + case 0xc3: /* ret/lret */ case 0xcb: - case 0xcf: - case 0xea: /* jmp absolute -- eip is correct */ - /* eip is already adjusted, no more changes required */ - p->ainsn.boostable = 1; - goto no_change; + case 0xc2: + case 0xca: + regs->eflags &= ~TF_MASK; + /* eip is already adjusted, no more changes required*/ + return; case 0xe8: /* call relative - Fix return addr */ *tos = orig_eip + (*tos - copy_eip); break; - case 0x9a: /* call absolute -- same as call absolute, indirect */ - *tos = orig_eip + (*tos - copy_eip); - goto no_change; case 0xff: if ((p->ainsn.insn[1] & 0x30) == 0x10) { - /* - * call absolute, indirect - * Fix return addr; eip is correct. - * But this is not boostable - */ + /* call absolute, indirect */ + /* Fix return addr; eip is correct. */ + next_eip = regs->eip; *tos = orig_eip + (*tos - copy_eip); - goto no_change; } else if (((p->ainsn.insn[1] & 0x31) == 0x20) || /* jmp near, absolute indirect */ ((p->ainsn.insn[1] & 0x31) == 0x21)) { /* jmp far, absolute indirect */ - /* eip is correct. And this is boostable */ - p->ainsn.boostable = 1; - goto no_change; + /* eip is correct. */ + next_eip = regs->eip; } + break; + case 0xea: /* jmp absolute -- eip is correct */ + next_eip = regs->eip; + break; default: break; } - if (p->ainsn.boostable == 0) { - if ((regs->eip > copy_eip) && - (regs->eip - copy_eip) + 5 < MAX_INSN_SIZE) { - /* - * These instructions can be executed directly if it - * jumps back to correct address. - */ - set_jmp_op((void *)regs->eip, - (void *)orig_eip + (regs->eip - copy_eip)); - p->ainsn.boostable = 1; - } else { - p->ainsn.boostable = -1; - } + regs->eflags &= ~TF_MASK; + if (next_eip) { + regs->eip = next_eip; + } else { + regs->eip = orig_eip + (regs->eip - copy_eip); } - - regs->eip = orig_eip + (regs->eip - copy_eip); - -no_change: - return; } /* * Interrupts are disabled on entry as trap1 is an interrupt gate and they * remain disabled thoroughout this function. */ -static int __kprobes post_kprobe_handler(struct pt_regs *regs) +static inline int post_kprobe_handler(struct pt_regs *regs) { struct kprobe *cur = kprobe_running(); struct kprobe_ctlblk *kcb = get_kprobe_ctlblk(); @@ -579,62 +448,20 @@ out: return 1; } -static int __kprobes kprobe_fault_handler(struct pt_regs *regs, int trapnr) +static inline int kprobe_fault_handler(struct pt_regs *regs, int trapnr) { struct kprobe *cur = kprobe_running(); struct kprobe_ctlblk *kcb = get_kprobe_ctlblk(); - switch(kcb->kprobe_status) { - case KPROBE_HIT_SS: - case KPROBE_REENTER: - /* - * We are here because the instruction being single - * stepped caused a page fault. We reset the current - * kprobe and the eip points back to the probe address - * and allow the page fault handler to continue as a - * normal page fault. - */ - regs->eip = (unsigned long)cur->addr; - regs->eflags |= kcb->kprobe_old_eflags; - if (kcb->kprobe_status == KPROBE_REENTER) - restore_previous_kprobe(kcb); - else - reset_current_kprobe(); - preempt_enable_no_resched(); - break; - case KPROBE_HIT_ACTIVE: - case KPROBE_HIT_SSDONE: - /* - * We increment the nmissed count for accounting, - * we can also use npre/npostfault count for accouting - * these specific fault cases. - */ - kprobes_inc_nmissed_count(cur); - - /* - * We come here because instructions in the pre/post - * handler caused the page_fault, this could happen - * if handler tries to access user space by - * copy_from_user(), get_user() etc. Let the - * user-specified handler try to fix it first. - */ - if (cur->fault_handler && cur->fault_handler(cur, regs, trapnr)) - return 1; + if (cur->fault_handler && cur->fault_handler(cur, regs, trapnr)) + return 1; - /* - * In case the user-specified fault handler returned - * zero, try to fix up. - */ - if (fixup_exception(regs)) - return 1; + if (kcb->kprobe_status & KPROBE_HIT_SS) { + resume_execution(cur, regs, kcb); + regs->eflags |= kcb->kprobe_old_eflags; - /* - * fixup_exception() could not handle it, - * Let do_page_fault() fix it. - */ - break; - default: - break; + reset_current_kprobe(); + preempt_enable_no_resched(); } return 0; } @@ -648,9 +475,6 @@ int __kprobes kprobe_exceptions_notify(struct notifier_block *self, struct die_args *args = (struct die_args *)data; int ret = NOTIFY_DONE; - if (args->regs && user_mode_vm(args->regs)) - return ret; - switch (val) { case DIE_INT3: if (kprobe_handler(args->regs)) @@ -740,7 +564,12 @@ int __kprobes longjmp_break_handler(struct kprobe *p, struct pt_regs *regs) return 0; } +static struct kprobe trampoline_p = { + .addr = (kprobe_opcode_t *) &kretprobe_trampoline, + .pre_handler = trampoline_probe_handler +}; + int __init arch_init_kprobes(void) { - return 0; + return register_kprobe(&trampoline_p); } diff --git a/arch/i386/kernel/machine_kexec.c b/arch/i386/kernel/machine_kexec.c index 6b1ae6ba7..f73d7374a 100644 --- a/arch/i386/kernel/machine_kexec.c +++ b/arch/i386/kernel/machine_kexec.c @@ -133,9 +133,9 @@ typedef asmlinkage NORET_TYPE void (*relocate_new_kernel_t)( unsigned long start_address, unsigned int has_pae) ATTRIB_NORET; -extern const unsigned char relocate_new_kernel[]; +const extern unsigned char relocate_new_kernel[]; extern void relocate_new_kernel_end(void); -extern const unsigned int relocate_new_kernel_size; +const extern unsigned int relocate_new_kernel_size; /* * A architecture hook called to validate the @@ -189,11 +189,14 @@ NORET_TYPE void machine_kexec(struct kimage *image) memcpy((void *)reboot_code_buffer, relocate_new_kernel, relocate_new_kernel_size); - /* The segment registers are funny things, they have both a - * visible and an invisible part. Whenever the visible part is - * set to a specific selector, the invisible part is loaded - * with from a table in memory. At no other time is the - * descriptor table in memory accessed. + /* The segment registers are funny things, they are + * automatically loaded from a table, in memory wherever you + * set them to a specific selector, but this table is never + * accessed again you set the segment to a different selector. + * + * The more common model is are caches where the behide + * the scenes work is done, but is also dropped at arbitrary + * times. * * I take advantage of this here by force loading the * segments, before I zap the gdt with an invalid value. diff --git a/arch/i386/kernel/mca.c b/arch/i386/kernel/mca.c index cd5456f14..558bb2077 100644 --- a/arch/i386/kernel/mca.c +++ b/arch/i386/kernel/mca.c @@ -46,6 +46,7 @@ #include #include #include +#include #include #include #include diff --git a/arch/i386/kernel/microcode.c b/arch/i386/kernel/microcode.c index e5520eb87..5390b521a 100644 --- a/arch/i386/kernel/microcode.c +++ b/arch/i386/kernel/microcode.c @@ -81,7 +81,6 @@ #include #include #include -#include #include #include @@ -91,10 +90,7 @@ MODULE_DESCRIPTION("Intel CPU (IA-32) Microcode Update Driver"); MODULE_AUTHOR("Tigran Aivazian "); MODULE_LICENSE("GPL"); -static int verbose; -module_param(verbose, int, 0644); - -#define MICROCODE_VERSION "1.14a" +#define MICROCODE_VERSION "1.14" #define DEFAULT_UCODE_DATASIZE (2000) /* 2000 bytes */ #define MC_HEADER_SIZE (sizeof (microcode_header_t)) /* 48 bytes */ @@ -118,22 +114,21 @@ module_param(verbose, int, 0644); static DEFINE_SPINLOCK(microcode_update_lock); /* no concurrent ->write()s are allowed on /dev/cpu/microcode */ -static DEFINE_MUTEX(microcode_mutex); +static DECLARE_MUTEX(microcode_sem); static void __user *user_buffer; /* user area microcode data buffer */ static unsigned int user_buffer_size; /* it's size */ typedef enum mc_error_code { MC_SUCCESS = 0, - MC_IGNORED = 1, - MC_NOTFOUND = 2, - MC_MARKED = 3, - MC_ALLOCATED = 4, + MC_NOTFOUND = 1, + MC_MARKED = 2, + MC_ALLOCATED = 3, } mc_error_code_t; static struct ucode_cpu_info { unsigned int sig; - unsigned int pf, orig_pf; + unsigned int pf; unsigned int rev; unsigned int cksum; mc_error_code_t err; @@ -168,7 +163,6 @@ static void collect_cpu_info (void *unused) rdmsr(MSR_IA32_PLATFORM_ID, val[0], val[1]); uci->pf = 1 << ((val[1] >> 18) & 7); } - uci->orig_pf = uci->pf; } wrmsr(MSR_IA32_UCODE_REV, 0, 0); @@ -202,34 +196,23 @@ static inline void mark_microcode_update (int cpu_num, microcode_header_t *mc_he pr_debug(" Checksum 0x%x\n", cksum); if (mc_header->rev < uci->rev) { - if (uci->err == MC_NOTFOUND) { - uci->err = MC_IGNORED; - uci->cksum = mc_header->rev; - } else if (uci->err == MC_IGNORED && uci->cksum < mc_header->rev) - uci->cksum = mc_header->rev; + printk(KERN_ERR "microcode: CPU%d not 'upgrading' to earlier revision" + " 0x%x (current=0x%x)\n", cpu_num, mc_header->rev, uci->rev); + goto out; } else if (mc_header->rev == uci->rev) { - if (uci->err < MC_MARKED) { - /* notify the caller of success on this cpu */ - uci->err = MC_SUCCESS; - } - } else if (uci->err != MC_ALLOCATED || mc_header->rev > uci->mc->hdr.rev) { - pr_debug("microcode: CPU%d found a matching microcode update with " - " revision 0x%x (current=0x%x)\n", cpu_num, mc_header->rev, uci->rev); - uci->cksum = cksum; - uci->pf = pf; /* keep the original mc pf for cksum calculation */ - uci->err = MC_MARKED; /* found the match */ - for_each_online_cpu(cpu_num) { - if (ucode_cpu_info + cpu_num != uci - && ucode_cpu_info[cpu_num].mc == uci->mc) { - uci->mc = NULL; - break; - } - } - if (uci->mc != NULL) { - vfree(uci->mc); - uci->mc = NULL; - } + /* notify the caller of success on this cpu */ + uci->err = MC_SUCCESS; + printk(KERN_ERR "microcode: CPU%d already at revision" + " 0x%x (current=0x%x)\n", cpu_num, mc_header->rev, uci->rev); + goto out; } + + pr_debug("microcode: CPU%d found a matching microcode update with " + " revision 0x%x (current=0x%x)\n", cpu_num, mc_header->rev, uci->rev); + uci->cksum = cksum; + uci->pf = pf; /* keep the original mc pf for cksum calculation */ + uci->err = MC_MARKED; /* found the match */ +out: return; } @@ -250,14 +233,14 @@ static int find_matching_ucodes (void) } total_size = get_totalsize(&mc_header); - if (cursor + total_size > user_buffer_size) { + if ((cursor + total_size > user_buffer_size) || (total_size < DEFAULT_UCODE_TOTALSIZE)) { printk(KERN_ERR "microcode: error! Bad data in microcode data file\n"); error = -EINVAL; goto out; } data_size = get_datasize(&mc_header); - if (data_size + MC_HEADER_SIZE > total_size) { + if ((data_size + MC_HEADER_SIZE > total_size) || (data_size < DEFAULT_UCODE_DATASIZE)) { printk(KERN_ERR "microcode: error! Bad data in microcode data file\n"); error = -EINVAL; goto out; @@ -271,8 +254,10 @@ static int find_matching_ucodes (void) for_each_online_cpu(cpu_num) { struct ucode_cpu_info *uci = ucode_cpu_info + cpu_num; + if (uci->err != MC_NOTFOUND) /* already found a match or not an online cpu*/ + continue; - if (sigmatch(mc_header.sig, uci->sig, mc_header.pf, uci->orig_pf)) + if (sigmatch(mc_header.sig, uci->sig, mc_header.pf, uci->pf)) mark_microcode_update(cpu_num, &mc_header, mc_header.sig, mc_header.pf, mc_header.cksum); } @@ -311,8 +296,9 @@ static int find_matching_ucodes (void) } for_each_online_cpu(cpu_num) { struct ucode_cpu_info *uci = ucode_cpu_info + cpu_num; - - if (sigmatch(ext_sig.sig, uci->sig, ext_sig.pf, uci->orig_pf)) { + if (uci->err != MC_NOTFOUND) /* already found a match or not an online cpu*/ + continue; + if (sigmatch(ext_sig.sig, uci->sig, ext_sig.pf, uci->pf)) { mark_microcode_update(cpu_num, &mc_header, ext_sig.sig, ext_sig.pf, ext_sig.cksum); } } @@ -383,13 +369,7 @@ static void do_update_one (void * unused) struct ucode_cpu_info *uci = ucode_cpu_info + cpu_num; if (uci->mc == NULL) { - if (verbose) { - if (uci->err == MC_SUCCESS) - printk(KERN_INFO "microcode: CPU%d already at revision 0x%x\n", - cpu_num, uci->rev); - else - printk(KERN_INFO "microcode: No new microcode data for CPU%d\n", cpu_num); - } + printk(KERN_INFO "microcode: No new microcode data for CPU%d\n", cpu_num); return; } @@ -448,9 +428,6 @@ out_free: ucode_cpu_info[j].mc = NULL; } } - if (ucode_cpu_info[i].err == MC_IGNORED && verbose) - printk(KERN_WARNING "microcode: CPU%d not 'upgrading' to earlier revision" - " 0x%x (current=0x%x)\n", i, ucode_cpu_info[i].cksum, ucode_cpu_info[i].rev); } out: return error; @@ -460,12 +437,17 @@ static ssize_t microcode_write (struct file *file, const char __user *buf, size_ { ssize_t ret; + if (len < DEFAULT_UCODE_TOTALSIZE) { + printk(KERN_ERR "microcode: not enough data\n"); + return -EINVAL; + } + if ((len >> PAGE_SHIFT) > num_physpages) { printk(KERN_ERR "microcode: too much data (max %ld pages)\n", num_physpages); return -EINVAL; } - mutex_lock(µcode_mutex); + down(µcode_sem); user_buffer = (void __user *) buf; user_buffer_size = (int) len; @@ -474,20 +456,38 @@ static ssize_t microcode_write (struct file *file, const char __user *buf, size_ if (!ret) ret = (ssize_t)len; - mutex_unlock(µcode_mutex); + up(µcode_sem); return ret; } +static int microcode_ioctl (struct inode *inode, struct file *file, + unsigned int cmd, unsigned long arg) +{ + switch (cmd) { + /* + * XXX: will be removed after microcode_ctl + * is updated to ignore failure of this ioctl() + */ + case MICROCODE_IOCFREE: + return 0; + default: + return -EINVAL; + } + return -EINVAL; +} + static struct file_operations microcode_fops = { .owner = THIS_MODULE, .write = microcode_write, + .ioctl = microcode_ioctl, .open = microcode_open, }; static struct miscdevice microcode_dev = { .minor = MICROCODE_MINOR, .name = "microcode", + .devfs_name = "cpu/microcode", .fops = µcode_fops, }; @@ -511,6 +511,7 @@ static int __init microcode_init (void) static void __exit microcode_exit (void) { misc_deregister(µcode_dev); + printk(KERN_INFO "IA-32 Microcode Update Driver v" MICROCODE_VERSION " unregistered\n"); } module_init(microcode_init) diff --git a/arch/i386/kernel/module.c b/arch/i386/kernel/module.c index 470cf97e7..5149c8a62 100644 --- a/arch/i386/kernel/module.c +++ b/arch/i386/kernel/module.c @@ -104,38 +104,26 @@ int apply_relocate_add(Elf32_Shdr *sechdrs, return -ENOEXEC; } +extern void apply_alternatives(void *start, void *end); + int module_finalize(const Elf_Ehdr *hdr, const Elf_Shdr *sechdrs, struct module *me) { - const Elf_Shdr *s, *text = NULL, *alt = NULL, *locks = NULL; + const Elf_Shdr *s; char *secstrings = (void *)hdr + sechdrs[hdr->e_shstrndx].sh_offset; + /* look for .altinstructions to patch */ for (s = sechdrs; s < sechdrs + hdr->e_shnum; s++) { - if (!strcmp(".text", secstrings + s->sh_name)) - text = s; - if (!strcmp(".altinstructions", secstrings + s->sh_name)) - alt = s; - if (!strcmp(".smp_locks", secstrings + s->sh_name)) - locks= s; - } - - if (alt) { - /* patch .altinstructions */ - void *aseg = (void *)alt->sh_addr; - apply_alternatives(aseg, aseg + alt->sh_size); - } - if (locks && text) { - void *lseg = (void *)locks->sh_addr; - void *tseg = (void *)text->sh_addr; - alternatives_smp_module_add(me, me->name, - lseg, lseg + locks->sh_size, - tseg, tseg + text->sh_size); - } + void *seg; + if (strcmp(".altinstructions", secstrings + s->sh_name)) + continue; + seg = (void *)s->sh_addr; + apply_alternatives(seg, seg + s->sh_size); + } return 0; } void module_arch_cleanup(struct module *mod) { - alternatives_smp_module_del(mod); } diff --git a/arch/i386/kernel/mpparse.c b/arch/i386/kernel/mpparse.c index a70b5fa0e..e6e2f43db 100644 --- a/arch/i386/kernel/mpparse.c +++ b/arch/i386/kernel/mpparse.c @@ -17,6 +17,7 @@ #include #include #include +#include #include #include #include @@ -37,6 +38,12 @@ int smp_found_config; unsigned int __initdata maxcpus = NR_CPUS; +#ifdef CONFIG_HOTPLUG_CPU +#define CPU_HOTPLUG_ENABLED (1) +#else +#define CPU_HOTPLUG_ENABLED (0) +#endif + /* * Various Linux-internal data structures created from the * MP-table. @@ -103,6 +110,21 @@ static int __init mpf_checksum(unsigned char *mp, int len) static int mpc_record; static struct mpc_config_translation *translation_table[MAX_MPC_ENTRY] __initdata; +#ifdef CONFIG_X86_NUMAQ +static int MP_valid_apicid(int apicid, int version) +{ + return hweight_long(apicid & 0xf) == 1 && (apicid >> 4) != 0xf; +} +#else +static int MP_valid_apicid(int apicid, int version) +{ + if (version >= 0x14) + return apicid < 0xff; + else + return apicid < 0xf; +} +#endif + static void __devinit MP_processor_info (struct mpc_config_processor *m) { int ver, apicid; @@ -168,6 +190,12 @@ static void __devinit MP_processor_info (struct mpc_config_processor *m) ver = m->mpc_apicver; + if (!MP_valid_apicid(apicid, ver)) { + printk(KERN_WARNING "Processor #%d INVALID. (Max ID: %d).\n", + m->mpc_apicid, MAX_APICS); + return; + } + /* * Validate version */ @@ -197,14 +225,7 @@ static void __devinit MP_processor_info (struct mpc_config_processor *m) cpu_set(num_processors, cpu_possible_map); num_processors++; - /* - * Would be preferable to switch to bigsmp when CONFIG_HOTPLUG_CPU=y - * but we need to work other dependencies like SMP_SUSPEND etc - * before this can be done without some confusion. - * if (CPU_HOTPLUG_ENABLED || num_processors > 8) - * - Ashok Raj - */ - if (num_processors > 8) { + if (CPU_HOTPLUG_ENABLED || (num_processors > 8)) { switch (boot_cpu_data.x86_vendor) { case X86_VENDOR_INTEL: if (!APIC_XAPIC(ver)) { @@ -228,13 +249,6 @@ static void __init MP_bus_info (struct mpc_config_bus *m) mpc_oem_bus_info(m, str, translation_table[mpc_record]); - if (m->mpc_busid >= MAX_MP_BUSSES) { - printk(KERN_WARNING "MP table busid value (%d) for bustype %s " - " is too large, max. supported is %d\n", - m->mpc_busid, str, MAX_MP_BUSSES - 1); - return; - } - if (strncmp(str, BUSTYPE_ISA, sizeof(BUSTYPE_ISA)-1) == 0) { mp_bus_id_to_type[m->mpc_busid] = MP_BUS_ISA; } else if (strncmp(str, BUSTYPE_EISA, sizeof(BUSTYPE_EISA)-1) == 0) { @@ -814,8 +828,6 @@ void __init find_smp_config (void) smp_scan_config(address, 0x400); } -int es7000_plat; - /* -------------------------------------------------------------------------- ACPI-based MP Configuration -------------------------------------------------------------------------- */ @@ -923,8 +935,7 @@ void __init mp_register_ioapic ( mp_ioapics[idx].mpc_apicaddr = address; set_fixmap_nocache(FIX_IO_APIC_BASE_0 + idx, address); - if ((boot_cpu_data.x86_vendor == X86_VENDOR_INTEL) - && !APIC_XAPIC(apic_version[boot_cpu_physical_apicid])) + if ((boot_cpu_data.x86_vendor == X86_VENDOR_INTEL) && (boot_cpu_data.x86 < 15)) tmpid = io_apic_get_unique_id(idx, id); else tmpid = id; @@ -1000,6 +1011,8 @@ void __init mp_override_legacy_irq ( return; } +int es7000_plat; + void __init mp_config_acpi_legacy_irqs (void) { struct mpc_config_intsrc intsrc; @@ -1129,17 +1142,7 @@ int mp_register_gsi (u32 gsi, int triggering, int polarity) */ int irq = gsi; if (gsi < MAX_GSI_NUM) { - /* - * Retain the VIA chipset work-around (gsi > 15), but - * avoid a problem where the 8254 timer (IRQ0) is setup - * via an override (so it's not on pin 0 of the ioapic), - * and at the same time, the pin 0 interrupt is a PCI - * type. The gsi > 15 test could cause these two pins - * to be shared as IRQ0, and they are not shareable. - * So test for this condition, and if necessary, avoid - * the pin collision. - */ - if (gsi > 15 || (gsi == 0 && !timer_uses_ioapic_pin_0)) + if (gsi > 15) gsi = pci_irq++; /* * Don't assign IRQ used by ACPI SCI diff --git a/arch/i386/kernel/msr.c b/arch/i386/kernel/msr.c index d535cdbbf..1d0a55e68 100644 --- a/arch/i386/kernel/msr.c +++ b/arch/i386/kernel/msr.c @@ -24,6 +24,7 @@ */ #include +#include #include #include @@ -250,9 +251,7 @@ static int msr_class_device_create(int i) return err; } -#ifdef CONFIG_HOTPLUG_CPU -static int msr_class_cpu_callback(struct notifier_block *nfb, - unsigned long action, void *hcpu) +static int __devinit msr_class_cpu_callback(struct notifier_block *nfb, unsigned long action, void *hcpu) { unsigned int cpu = (unsigned long)hcpu; @@ -267,11 +266,10 @@ static int msr_class_cpu_callback(struct notifier_block *nfb, return NOTIFY_OK; } -static struct notifier_block __cpuinitdata msr_class_cpu_notifier = +static struct notifier_block msr_class_cpu_notifier = { .notifier_call = msr_class_cpu_callback, }; -#endif static int __init msr_init(void) { @@ -294,7 +292,7 @@ static int __init msr_init(void) if (err != 0) goto out_class; } - register_hotcpu_notifier(&msr_class_cpu_notifier); + register_cpu_notifier(&msr_class_cpu_notifier); err = 0; goto out; @@ -317,7 +315,7 @@ static void __exit msr_exit(void) class_device_destroy(msr_class, MKDEV(MSR_MAJOR, cpu)); class_destroy(msr_class); unregister_chrdev(MSR_MAJOR, "cpu/msr"); - unregister_hotcpu_notifier(&msr_class_cpu_notifier); + unregister_cpu_notifier(&msr_class_cpu_notifier); } module_init(msr_init); diff --git a/arch/i386/kernel/nmi.c b/arch/i386/kernel/nmi.c index ce9d5bb75..be87c5e2e 100644 --- a/arch/i386/kernel/nmi.c +++ b/arch/i386/kernel/nmi.c @@ -13,17 +13,22 @@ * Mikael Pettersson : PM converted to driver model. Disable/enable API. */ +#include +#include #include +#include +#include #include +#include +#include #include #include #include #include -#include #include +#include #include -#include #include "mach_traps.h" @@ -95,9 +100,6 @@ int nmi_active; (P4_CCCR_OVF_PMI0|P4_CCCR_THRESHOLD(15)|P4_CCCR_COMPLEMENT| \ P4_CCCR_COMPARE|P4_CCCR_REQUIRED|P4_CCCR_ESCR_SELECT(4)|P4_CCCR_ENABLE) -#define ARCH_PERFMON_NMI_EVENT_SEL ARCH_PERFMON_UNHALTED_CORE_CYCLES_SEL -#define ARCH_PERFMON_NMI_EVENT_UMASK ARCH_PERFMON_UNHALTED_CORE_CYCLES_UMASK - #ifdef CONFIG_SMP /* The performance counters used by NMI_LOCAL_APIC don't trigger when * the CPU is idle. To make sure the NMI watchdog really ticks on all @@ -106,7 +108,7 @@ int nmi_active; static __init void nmi_cpu_busy(void *data) { volatile int *endflag = data; - local_irq_enable_in_hardirq(); + local_irq_enable(); /* Intentionally don't use cpu_relax here. This is to make sure that the performance counter really ticks, even if there is a simulator or similar that catches the @@ -136,12 +138,12 @@ static int __init check_nmi_watchdog(void) if (nmi_watchdog == NMI_LOCAL_APIC) smp_call_function(nmi_cpu_busy, (void *)&endflag, 0, 0); - for_each_possible_cpu(cpu) + for_each_cpu(cpu) prev_nmi_count[cpu] = per_cpu(irq_stat, cpu).__nmi_count; local_irq_enable(); mdelay((10*1000)/nmi_hz); // wait 10 ticks - for_each_possible_cpu(cpu) { + for (cpu = 0; cpu < NR_CPUS; cpu++) { #ifdef CONFIG_SMP /* Check cpu_callin_map here because that is set after the timer is started. */ @@ -210,8 +212,6 @@ static int __init setup_nmi_watchdog(char *str) __setup("nmi_watchdog=", setup_nmi_watchdog); -static void disable_intel_arch_watchdog(void); - static void disable_lapic_nmi_watchdog(void) { if (nmi_active <= 0) @@ -221,10 +221,6 @@ static void disable_lapic_nmi_watchdog(void) wrmsr(MSR_K7_EVNTSEL0, 0, 0); break; case X86_VENDOR_INTEL: - if (cpu_has(&boot_cpu_data, X86_FEATURE_ARCH_PERFMON)) { - disable_intel_arch_watchdog(); - break; - } switch (boot_cpu_data.x86) { case 6: if (boot_cpu_data.x86_model > 0xd) @@ -453,53 +449,6 @@ static int setup_p4_watchdog(void) return 1; } -static void disable_intel_arch_watchdog(void) -{ - unsigned ebx; - - /* - * Check whether the Architectural PerfMon supports - * Unhalted Core Cycles Event or not. - * NOTE: Corresponding bit = 0 in ebp indicates event present. - */ - ebx = cpuid_ebx(10); - if (!(ebx & ARCH_PERFMON_UNHALTED_CORE_CYCLES_PRESENT)) - wrmsr(MSR_ARCH_PERFMON_EVENTSEL0, 0, 0); -} - -static int setup_intel_arch_watchdog(void) -{ - unsigned int evntsel; - unsigned ebx; - - /* - * Check whether the Architectural PerfMon supports - * Unhalted Core Cycles Event or not. - * NOTE: Corresponding bit = 0 in ebp indicates event present. - */ - ebx = cpuid_ebx(10); - if ((ebx & ARCH_PERFMON_UNHALTED_CORE_CYCLES_PRESENT)) - return 0; - - nmi_perfctr_msr = MSR_ARCH_PERFMON_PERFCTR0; - - clear_msr_range(MSR_ARCH_PERFMON_EVENTSEL0, 2); - clear_msr_range(MSR_ARCH_PERFMON_PERFCTR0, 2); - - evntsel = ARCH_PERFMON_EVENTSEL_INT - | ARCH_PERFMON_EVENTSEL_OS - | ARCH_PERFMON_EVENTSEL_USR - | ARCH_PERFMON_NMI_EVENT_SEL - | ARCH_PERFMON_NMI_EVENT_UMASK; - - wrmsr(MSR_ARCH_PERFMON_EVENTSEL0, evntsel, 0); - write_watchdog_counter("INTEL_ARCH_PERFCTR0"); - apic_write(APIC_LVTPC, APIC_DM_NMI); - evntsel |= ARCH_PERFMON_EVENTSEL0_ENABLE; - wrmsr(MSR_ARCH_PERFMON_EVENTSEL0, evntsel, 0); - return 1; -} - void setup_apic_nmi_watchdog (void) { switch (boot_cpu_data.x86_vendor) { @@ -509,11 +458,6 @@ void setup_apic_nmi_watchdog (void) setup_k7_watchdog(); break; case X86_VENDOR_INTEL: - if (cpu_has(&boot_cpu_data, X86_FEATURE_ARCH_PERFMON)) { - if (!setup_intel_arch_watchdog()) - return; - break; - } switch (boot_cpu_data.x86) { case 6: if (boot_cpu_data.x86_model > 0xd) @@ -566,7 +510,7 @@ void touch_nmi_watchdog (void) * Just reset the alert counters, (other CPUs might be * spinning on locks we hold): */ - for_each_possible_cpu(i) + for (i = 0; i < NR_CPUS; i++) alert_counter[i] = 0; /* @@ -574,7 +518,6 @@ void touch_nmi_watchdog (void) */ touch_softlockup_watchdog(); } -EXPORT_SYMBOL(touch_nmi_watchdog); extern void die_nmi(struct pt_regs *, const char *msg); @@ -586,8 +529,7 @@ void nmi_watchdog_tick (struct pt_regs * regs) * always switch the stack NMI-atomically, it's safe to use * smp_processor_id(). */ - unsigned int sum; - int cpu = smp_processor_id(); + int sum, cpu = smp_processor_id(); sum = per_cpu(irq_stat, cpu).apic_timer_irqs; @@ -601,7 +543,7 @@ void nmi_watchdog_tick (struct pt_regs * regs) /* * die_nmi will return ONLY if NOTIFY_STOP happens.. */ - die_nmi(regs, "BUG: NMI Watchdog detected LOCKUP"); + die_nmi(regs, "NMI Watchdog detected LOCKUP"); } else { last_irq_sums[cpu] = sum; alert_counter[cpu] = 0; @@ -618,8 +560,7 @@ void nmi_watchdog_tick (struct pt_regs * regs) wrmsr(MSR_P4_IQ_CCCR0, nmi_p4_cccr_val, 0); apic_write(APIC_LVTPC, APIC_DM_NMI); } - else if (nmi_perfctr_msr == MSR_P6_PERFCTR0 || - nmi_perfctr_msr == MSR_ARCH_PERFMON_PERFCTR0) { + else if (nmi_perfctr_msr == MSR_P6_PERFCTR0) { /* Only P6 based Pentium M need to re-unmask * the apic vector but it doesn't hurt * other P6 variant */ diff --git a/arch/i386/kernel/numaq.c b/arch/i386/kernel/numaq.c index 9000d82c6..5f5b075f8 100644 --- a/arch/i386/kernel/numaq.c +++ b/arch/i386/kernel/numaq.c @@ -23,6 +23,7 @@ * Send feedback to */ +#include #include #include #include @@ -78,12 +79,10 @@ int __init get_memcfg_numaq(void) return 1; } -static int __init numaq_tsc_disable(void) +static int __init numaq_dsc_disable(void) { - if (num_online_nodes() > 1) { - printk(KERN_DEBUG "NUMAQ: disabling TSC\n"); - tsc_disable = 1; - } + printk(KERN_DEBUG "NUMAQ: disabling TSC\n"); + tsc_disable = 1; return 0; } -arch_initcall(numaq_tsc_disable); +core_initcall(numaq_dsc_disable); diff --git a/arch/i386/kernel/process.c b/arch/i386/kernel/process.c index ea4ffbbda..0480454eb 100644 --- a/arch/i386/kernel/process.c +++ b/arch/i386/kernel/process.c @@ -28,6 +28,7 @@ #include #include #include +#include #include #include #include @@ -37,6 +38,7 @@ #include #include #include +#include #include #include @@ -101,7 +103,7 @@ void default_idle(void) local_irq_enable(); if (!hlt_counter && boot_cpu_data.hlt_works_ok) { - current_thread_info()->status &= ~TS_POLLING; + clear_thread_flag(TIF_POLLING_NRFLAG); smp_mb__after_clear_bit(); while (!need_resched()) { local_irq_disable(); @@ -110,7 +112,7 @@ void default_idle(void) else local_irq_enable(); } - current_thread_info()->status |= TS_POLLING; + set_thread_flag(TIF_POLLING_NRFLAG); } else { while (!need_resched()) cpu_relax(); @@ -173,7 +175,7 @@ void cpu_idle(void) { int cpu = smp_processor_id(); - current_thread_info()->status |= TS_POLLING; + set_thread_flag(TIF_POLLING_NRFLAG); /* endless idle loop with no priority at all */ while (1) { @@ -293,7 +295,7 @@ void show_regs(struct pt_regs * regs) printk("EIP: %04x:[<%08lx>] CPU: %d\n",0xffff & regs->xcs,regs->eip, smp_processor_id()); print_symbol("EIP is at %s\n", regs->eip); - if (user_mode_vm(regs)) + if (user_mode(regs)) printk(" ESP: %04x:%08lx",0xffff & regs->xss,regs->esp); printk(" EFLAGS: %08lx %s (%s %.*s)\n", regs->eflags, print_tainted(), system_utsname.release, @@ -311,7 +313,7 @@ void show_regs(struct pt_regs * regs) cr3 = read_cr3(); cr4 = read_cr4_safe(); printk("CR0: %08lx CR2: %08lx CR3: %08lx CR4: %08lx\n", cr0, cr2, cr3, cr4); - show_trace(NULL, regs, ®s->esp); + show_trace(NULL, ®s->esp); } /* @@ -320,6 +322,15 @@ void show_regs(struct pt_regs * regs) * the "args". */ extern void kernel_thread_helper(void); +__asm__(".section .text\n" + ".align 4\n" + "kernel_thread_helper:\n\t" + "movl %edx,%eax\n\t" + "pushl %edx\n\t" + "call *%ebx\n\t" + "pushl %eax\n\t" + "call do_exit\n" + ".previous"); /* * Create a kernel thread @@ -327,7 +338,6 @@ extern void kernel_thread_helper(void); int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags) { struct pt_regs regs; - int err; memset(®s, 0, sizeof(regs)); @@ -342,10 +352,7 @@ int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags) regs.eflags = X86_EFLAGS_IF | X86_EFLAGS_SF | X86_EFLAGS_PF | 0x2; /* Ok, create the new process.. */ - err = do_fork(flags | CLONE_VM | CLONE_UNTRACED, 0, ®s, 0, NULL, NULL); - if (err == 0) /* terminate kernel stack */ - task_pt_regs(current)->eip = 0; - return err; + return do_fork(flags | CLONE_VM | CLONE_UNTRACED, 0, ®s, 0, NULL, NULL); } EXPORT_SYMBOL(kernel_thread); @@ -354,16 +361,23 @@ EXPORT_SYMBOL(kernel_thread); */ void exit_thread(void) { + struct task_struct *tsk = current; + struct thread_struct *t = &tsk->thread; + + /* + * Remove function-return probe instances associated with this task + * and put them back on the free list. Do not insert an exit probe for + * this function, it will be disabled by kprobe_flush_task if you do. + */ + kprobe_flush_task(tsk); + /* The process may have allocated an io port bitmap... nuke it. */ - if (unlikely(test_thread_flag(TIF_IO_BITMAP))) { - struct task_struct *tsk = current; - struct thread_struct *t = &tsk->thread; + if (unlikely(NULL != t->io_bitmap_ptr)) { int cpu = get_cpu(); struct tss_struct *tss = &per_cpu(init_tss, cpu); kfree(t->io_bitmap_ptr); t->io_bitmap_ptr = NULL; - clear_thread_flag(TIF_IO_BITMAP); /* * Careful, clear this in the TSS too: */ @@ -382,7 +396,6 @@ void flush_thread(void) memset(tsk->thread.debugreg, 0, sizeof(unsigned long)*8); memset(tsk->thread.tls_array, 0, sizeof(tsk->thread.tls_array)); - clear_tsk_thread_flag(tsk, TIF_DEBUG); /* * Forget coprocessor state.. */ @@ -427,7 +440,7 @@ int copy_thread(int nr, unsigned long clone_flags, unsigned long esp, savesegment(gs,p->thread.gs); tsk = current; - if (unlikely(test_tsk_thread_flag(tsk, TIF_IO_BITMAP))) { + if (unlikely(NULL != tsk->thread.io_bitmap_ptr)) { p->thread.io_bitmap_ptr = kmalloc(IO_BITMAP_BYTES, GFP_KERNEL); if (!p->thread.io_bitmap_ptr) { p->thread.io_bitmap_max = 0; @@ -435,7 +448,6 @@ int copy_thread(int nr, unsigned long clone_flags, unsigned long esp, } memcpy(p->thread.io_bitmap_ptr, tsk->thread.io_bitmap_ptr, IO_BITMAP_BYTES); - set_tsk_thread_flag(p, TIF_IO_BITMAP); } /* @@ -530,24 +542,10 @@ int dump_task_regs(struct task_struct *tsk, elf_gregset_t *regs) return 1; } -static noinline void __switch_to_xtra(struct task_struct *next_p, - struct tss_struct *tss) +static inline void +handle_io_bitmap(struct thread_struct *next, struct tss_struct *tss) { - struct thread_struct *next; - - next = &next_p->thread; - - if (test_tsk_thread_flag(next_p, TIF_DEBUG)) { - set_debugreg(next->debugreg[0], 0); - set_debugreg(next->debugreg[1], 1); - set_debugreg(next->debugreg[2], 2); - set_debugreg(next->debugreg[3], 3); - /* no 4 and 5 */ - set_debugreg(next->debugreg[6], 6); - set_debugreg(next->debugreg[7], 7); - } - - if (!test_tsk_thread_flag(next_p, TIF_IO_BITMAP)) { + if (!next->io_bitmap_ptr) { /* * Disable the bitmap via an invalid offset. We still cache * the previous bitmap owner and the IO bitmap contents: @@ -555,7 +553,6 @@ static noinline void __switch_to_xtra(struct task_struct *next_p, tss->io_bitmap_base = INVALID_IO_BITMAP_OFFSET; return; } - if (likely(next == tss->io_bitmap_owner)) { /* * Previous owner of the bitmap (hence the bitmap content) @@ -641,8 +638,6 @@ struct task_struct fastcall * __switch_to(struct task_struct *prev_p, struct tas /* never put a printk in __switch_to... printk() calls wake_up*() indirectly */ __unlazy_fpu(prev_p); - if (next_p->mm) - load_user_cs_desc(cpu, next_p->mm); /* * Reload esp0. @@ -685,11 +680,20 @@ struct task_struct fastcall * __switch_to(struct task_struct *prev_p, struct tas set_iopl_mask(next->iopl); /* - * Now maybe handle debug registers and/or IO bitmaps + * Now maybe reload the debug registers */ - if (unlikely((task_thread_info(next_p)->flags & _TIF_WORK_CTXSW) - || test_tsk_thread_flag(prev_p, TIF_IO_BITMAP))) - __switch_to_xtra(next_p, tss); + if (unlikely(next->debugreg[7])) { + set_debugreg(next->debugreg[0], 0); + set_debugreg(next->debugreg[1], 1); + set_debugreg(next->debugreg[2], 2); + set_debugreg(next->debugreg[3], 3); + /* no 4 and 5 */ + set_debugreg(next->debugreg[6], 6); + set_debugreg(next->debugreg[7], 7); + } + + if (unlikely(prev->io_bitmap_ptr || next->io_bitmap_ptr)) + handle_io_bitmap(next, tss); disable_tsc(prev_p, next_p); @@ -785,6 +789,7 @@ unsigned long get_wchan(struct task_struct *p) } while (count++ < 16); return 0; } +EXPORT_SYMBOL(get_wchan); /* * sys_alloc_thread_area: get a yet unused TLS descriptor index. @@ -906,60 +911,3 @@ unsigned long arch_align_stack(unsigned long sp) sp -= get_random_int() % 8192; return sp & ~0xf; } - -void arch_add_exec_range(struct mm_struct *mm, unsigned long limit) -{ - if (limit > mm->context.exec_limit) { - mm->context.exec_limit = limit; - set_user_cs(&mm->context.user_cs, limit); - if (mm == current->mm) { - preempt_disable(); - load_user_cs_desc(smp_processor_id(), mm); - preempt_enable(); - } - } -} - -void arch_remove_exec_range(struct mm_struct *mm, unsigned long old_end) -{ - struct vm_area_struct *vma; - unsigned long limit = PAGE_SIZE; - - if (old_end == mm->context.exec_limit) { - for (vma = mm->mmap; vma; vma = vma->vm_next) - if ((vma->vm_flags & VM_EXEC) && (vma->vm_end > limit)) - limit = vma->vm_end; - - mm->context.exec_limit = limit; - set_user_cs(&mm->context.user_cs, limit); - if (mm == current->mm) { - preempt_disable(); - load_user_cs_desc(smp_processor_id(), mm); - preempt_enable(); - } - } -} - -void arch_flush_exec_range(struct mm_struct *mm) -{ - mm->context.exec_limit = 0; - set_user_cs(&mm->context.user_cs, 0); -} - -/* - * Generate random brk address between 128MB and 196MB. (if the layout - * allows it.) - */ -void randomize_brk(unsigned long old_brk) -{ - unsigned long new_brk, range_start, range_end; - - range_start = 0x08000000; - if (current->mm->brk >= range_start) - range_start = current->mm->brk; - range_end = range_start + 0x02000000; - new_brk = randomize_range(range_start, range_end, 0); - if (new_brk) - current->mm->brk = new_brk; -} - diff --git a/arch/i386/kernel/ptrace.c b/arch/i386/kernel/ptrace.c index d3db03f40..5c1fb6aad 100644 --- a/arch/i386/kernel/ptrace.c +++ b/arch/i386/kernel/ptrace.c @@ -34,10 +34,10 @@ /* * Determines which flags the user has access to [1 = access, 0 = no access]. - * Prohibits changing ID(21), VIP(20), VIF(19), VM(17), NT(14), IOPL(12-13), IF(9). + * Prohibits changing ID(21), VIP(20), VIF(19), VM(17), IOPL(12-13), IF(9). * Also masks reserved bits (31-22, 15, 5, 3, 1). */ -#define FLAG_MASK 0x00050dd5 +#define FLAG_MASK 0x00054dd5 /* set's the trap flag. */ #define TRAP_FLAG 0x100 @@ -468,11 +468,8 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) for(i=0; i<4; i++) if ((0x5f54 >> ((data >> (16 + 4*i)) & 0xf)) & 1) goto out_tsk; - if (data) - set_tsk_thread_flag(child, TIF_DEBUG); - else - clear_tsk_thread_flag(child, TIF_DEBUG); } + addr -= (long) &dummy->u_debugreg; addr = addr >> 2; child->thread.debugreg[addr] = data; @@ -674,7 +671,7 @@ int do_syscall_trace(struct pt_regs *regs, int entryexit) if (unlikely(current->audit_context)) { if (entryexit) - audit_syscall_exit(AUDITSC_RESULT(regs->eax), + audit_syscall_exit(current, AUDITSC_RESULT(regs->eax), regs->eax); /* Debug traps, when using PTRACE_SINGLESTEP, must be sent only * on the syscall exit path. Normally, when TIF_SYSCALL_AUDIT is @@ -723,13 +720,14 @@ int do_syscall_trace(struct pt_regs *regs, int entryexit) ret = is_sysemu; out: if (unlikely(current->audit_context) && !entryexit) - audit_syscall_entry(AUDIT_ARCH_I386, regs->orig_eax, + audit_syscall_entry(current, AUDIT_ARCH_I386, regs->orig_eax, regs->ebx, regs->ecx, regs->edx, regs->esi); if (ret == 0) return 0; regs->orig_eax = -1; /* force skip of syscall restarting */ if (unlikely(current->audit_context)) - audit_syscall_exit(AUDITSC_RESULT(regs->eax), regs->eax); + audit_syscall_exit(current, AUDITSC_RESULT(regs->eax), + regs->eax); return 1; } diff --git a/arch/i386/kernel/quirks.c b/arch/i386/kernel/quirks.c index 9f6ab1789..87ccdac84 100644 --- a/arch/i386/kernel/quirks.c +++ b/arch/i386/kernel/quirks.c @@ -1,6 +1,7 @@ /* * This file contains work-arounds for x86 and x86_64 platform bugs. */ +#include #include #include diff --git a/arch/i386/kernel/reboot.c b/arch/i386/kernel/reboot.c index 54cfeabbc..d20724297 100644 --- a/arch/i386/kernel/reboot.c +++ b/arch/i386/kernel/reboot.c @@ -2,6 +2,7 @@ * linux/arch/i386/kernel/reboot.c */ +#include #include #include #include diff --git a/arch/i386/kernel/reboot_fixups.c b/arch/i386/kernel/reboot_fixups.c index 99aab41a0..10e21a477 100644 --- a/arch/i386/kernel/reboot_fixups.c +++ b/arch/i386/kernel/reboot_fixups.c @@ -51,5 +51,7 @@ void mach_reboot_fixups(void) cur->reboot_fixup(dev); } + + printk(KERN_WARNING "No reboot fixup found for your hardware\n"); } diff --git a/arch/i386/kernel/scx200.c b/arch/i386/kernel/scx200.c index c7d3df23f..321f5fd26 100644 --- a/arch/i386/kernel/scx200.c +++ b/arch/i386/kernel/scx200.c @@ -4,11 +4,11 @@ National Semiconductor SCx200 support. */ +#include #include #include #include #include -#include #include #include @@ -45,19 +45,11 @@ static struct pci_driver scx200_pci_driver = { .probe = scx200_probe, }; -static DEFINE_MUTEX(scx200_gpio_config_lock); - -static void __devinit scx200_init_shadow(void) -{ - int bank; - - /* read the current values driven on the GPIO signals */ - for (bank = 0; bank < 2; ++bank) - scx200_gpio_shadow[bank] = inl(scx200_gpio_base + 0x10 * bank); -} +static DEFINE_SPINLOCK(scx200_gpio_config_lock); static int __devinit scx200_probe(struct pci_dev *pdev, const struct pci_device_id *ent) { + int bank; unsigned base; if (pdev->device == PCI_DEVICE_ID_NS_SCx200_BRIDGE || @@ -71,7 +63,10 @@ static int __devinit scx200_probe(struct pci_dev *pdev, const struct pci_device_ } scx200_gpio_base = base; - scx200_init_shadow(); + + /* read the current values driven on the GPIO signals */ + for (bank = 0; bank < 2; ++bank) + scx200_gpio_shadow[bank] = inl(scx200_gpio_base + 0x10 * bank); } else { /* find the base of the Configuration Block */ @@ -92,11 +87,12 @@ static int __devinit scx200_probe(struct pci_dev *pdev, const struct pci_device_ return 0; } -u32 scx200_gpio_configure(unsigned index, u32 mask, u32 bits) +u32 scx200_gpio_configure(int index, u32 mask, u32 bits) { u32 config, new_config; + unsigned long flags; - mutex_lock(&scx200_gpio_config_lock); + spin_lock_irqsave(&scx200_gpio_config_lock, flags); outl(index, scx200_gpio_base + 0x20); config = inl(scx200_gpio_base + 0x24); @@ -104,11 +100,45 @@ u32 scx200_gpio_configure(unsigned index, u32 mask, u32 bits) new_config = (config & mask) | bits; outl(new_config, scx200_gpio_base + 0x24); - mutex_unlock(&scx200_gpio_config_lock); + spin_unlock_irqrestore(&scx200_gpio_config_lock, flags); return config; } +#if 0 +void scx200_gpio_dump(unsigned index) +{ + u32 config = scx200_gpio_configure(index, ~0, 0); + printk(KERN_DEBUG "GPIO%02u: 0x%08lx", index, (unsigned long)config); + + if (config & 1) + printk(" OE"); /* output enabled */ + else + printk(" TS"); /* tristate */ + if (config & 2) + printk(" PP"); /* push pull */ + else + printk(" OD"); /* open drain */ + if (config & 4) + printk(" PUE"); /* pull up enabled */ + else + printk(" PUD"); /* pull up disabled */ + if (config & 8) + printk(" LOCKED"); /* locked */ + if (config & 16) + printk(" LEVEL"); /* level input */ + else + printk(" EDGE"); /* edge input */ + if (config & 32) + printk(" HI"); /* trigger on rising edge */ + else + printk(" LO"); /* trigger on falling edge */ + if (config & 64) + printk(" DEBOUNCE"); /* debounce */ + printk("\n"); +} +#endif /* 0 */ + static int __init scx200_init(void) { printk(KERN_INFO NAME ": NatSemi SCx200 Driver\n"); @@ -129,3 +159,10 @@ EXPORT_SYMBOL(scx200_gpio_base); EXPORT_SYMBOL(scx200_gpio_shadow); EXPORT_SYMBOL(scx200_gpio_configure); EXPORT_SYMBOL(scx200_cb_base); + +/* + Local variables: + compile-command: "make -k -C ../../.. SUBDIRS=arch/i386/kernel modules" + c-basic-offset: 8 + End: +*/ diff --git a/arch/i386/kernel/semaphore.c b/arch/i386/kernel/semaphore.c index 98352c374..7455ab643 100644 --- a/arch/i386/kernel/semaphore.c +++ b/arch/i386/kernel/semaphore.c @@ -12,6 +12,7 @@ * * rw semaphores implemented November 1999 by Benjamin LaHaise */ +#include #include /* @@ -109,11 +110,11 @@ asm( ".align 4\n" ".globl __write_lock_failed\n" "__write_lock_failed:\n\t" - LOCK_PREFIX "addl $" RW_LOCK_BIAS_STR ",(%eax)\n" + LOCK "addl $" RW_LOCK_BIAS_STR ",(%eax)\n" "1: rep; nop\n\t" "cmpl $" RW_LOCK_BIAS_STR ",(%eax)\n\t" "jne 1b\n\t" - LOCK_PREFIX "subl $" RW_LOCK_BIAS_STR ",(%eax)\n\t" + LOCK "subl $" RW_LOCK_BIAS_STR ",(%eax)\n\t" "jnz __write_lock_failed\n\t" "ret" ); @@ -123,11 +124,11 @@ asm( ".align 4\n" ".globl __read_lock_failed\n" "__read_lock_failed:\n\t" - LOCK_PREFIX "incl (%eax)\n" + LOCK "incl (%eax)\n" "1: rep; nop\n\t" "cmpl $1,(%eax)\n\t" "js 1b\n\t" - LOCK_PREFIX "decl (%eax)\n\t" + LOCK "decl (%eax)\n\t" "js __read_lock_failed\n\t" "ret" ); diff --git a/arch/i386/kernel/setup.c b/arch/i386/kernel/setup.c index f1682206d..0fc23c0a4 100644 --- a/arch/i386/kernel/setup.c +++ b/arch/i386/kernel/setup.c @@ -23,17 +23,17 @@ * This file handles the architecture-dependent parts of initialization */ +#include #include #include #include -#include +#include #include #include #include #include #include #include -#include #include #include #include @@ -46,7 +46,6 @@ #include #include #include -#include #include , (default is __obsolete_setup("amijoy="); static int amijoy_used; -static DEFINE_MUTEX(amijoy_mutex); +static DECLARE_MUTEX(amijoy_sem); static struct input_dev *amijoy_dev[2]; static char *amijoy_phys[2] = { "amijoy/input0", "amijoy/input1" }; @@ -86,7 +85,7 @@ static int amijoy_open(struct input_dev *dev) { int err; - err = mutex_lock_interruptible(&amijoy_mutex); + err = down_interruptible(&amijoy_sem); if (err) return err; @@ -98,16 +97,16 @@ static int amijoy_open(struct input_dev *dev) amijoy_used++; out: - mutex_unlock(&amijoy_mutex); + up(&amijoy_sem); return err; } static void amijoy_close(struct input_dev *dev) { - mutex_lock(&amijoy_mutex); + down(&amijoy_sem); if (!--amijoy_used) free_irq(IRQ_AMIGA_VERTB, amijoy_interrupt); - mutex_unlock(&amijoy_mutex); + up(&amijoy_sem); } static int __init amijoy_init(void) diff --git a/drivers/input/joystick/analog.c b/drivers/input/joystick/analog.c index e9a02db36..3121961e3 100644 --- a/drivers/input/joystick/analog.c +++ b/drivers/input/joystick/analog.c @@ -28,6 +28,7 @@ * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic */ +#include #include #include #include @@ -407,23 +408,21 @@ static void analog_calibrate_timer(struct analog_port *port) static void analog_name(struct analog *analog) { - snprintf(analog->name, sizeof(analog->name), "Analog %d-axis %d-button", - hweight8(analog->mask & ANALOG_AXES_STD), - hweight8(analog->mask & ANALOG_BTNS_STD) + !!(analog->mask & ANALOG_BTNS_CHF) * 2 + - hweight16(analog->mask & ANALOG_BTNS_GAMEPAD) + !!(analog->mask & ANALOG_HBTN_CHF) * 4); + sprintf(analog->name, "Analog %d-axis %d-button", + hweight8(analog->mask & ANALOG_AXES_STD), + hweight8(analog->mask & ANALOG_BTNS_STD) + !!(analog->mask & ANALOG_BTNS_CHF) * 2 + + hweight16(analog->mask & ANALOG_BTNS_GAMEPAD) + !!(analog->mask & ANALOG_HBTN_CHF) * 4); if (analog->mask & ANALOG_HATS_ALL) - snprintf(analog->name, sizeof(analog->name), "%s %d-hat", - analog->name, hweight16(analog->mask & ANALOG_HATS_ALL)); + sprintf(analog->name, "%s %d-hat", + analog->name, hweight16(analog->mask & ANALOG_HATS_ALL)); if (analog->mask & ANALOG_HAT_FCS) - strlcat(analog->name, " FCS", sizeof(analog->name)); + strcat(analog->name, " FCS"); if (analog->mask & ANALOG_ANY_CHF) - strlcat(analog->name, (analog->mask & ANALOG_SAITEK) ? " Saitek" : " CHF", - sizeof(analog->name)); + strcat(analog->name, (analog->mask & ANALOG_SAITEK) ? " Saitek" : " CHF"); - strlcat(analog->name, (analog->mask & ANALOG_GAMEPAD) ? " gamepad": " joystick", - sizeof(analog->name)); + strcat(analog->name, (analog->mask & ANALOG_GAMEPAD) ? " gamepad": " joystick"); } /* @@ -436,8 +435,7 @@ static int analog_init_device(struct analog_port *port, struct analog *analog, i int i, j, t, v, w, x, y, z; analog_name(analog); - snprintf(analog->phys, sizeof(analog->phys), - "%s/input%d", port->gameport->phys, index); + sprintf(analog->phys, "%s/input%d", port->gameport->phys, index); analog->buttons = (analog->mask & ANALOG_GAMEPAD) ? analog_pad_btn : analog_joy_btn; analog->dev = input_dev = input_allocate_device(); diff --git a/drivers/input/joystick/cobra.c b/drivers/input/joystick/cobra.c index d5e42eb88..1909f7ef3 100644 --- a/drivers/input/joystick/cobra.c +++ b/drivers/input/joystick/cobra.c @@ -202,8 +202,7 @@ static int cobra_connect(struct gameport *gameport, struct gameport_driver *drv) goto fail3; } - snprintf(cobra->phys[i], sizeof(cobra->phys[i]), - "%s/input%d", gameport->phys, i); + sprintf(cobra->phys[i], "%s/input%d", gameport->phys, i); input_dev->name = "Creative Labs Blaster GamePad Cobra"; input_dev->phys = cobra->phys[i]; diff --git a/drivers/input/joystick/db9.c b/drivers/input/joystick/db9.c index 5080e15c6..dcffc34f3 100644 --- a/drivers/input/joystick/db9.c +++ b/drivers/input/joystick/db9.c @@ -38,7 +38,6 @@ #include #include #include -#include MODULE_AUTHOR("Vojtech Pavlik "); MODULE_DESCRIPTION("Atari, Amstrad, Commodore, Amiga, Sega, etc. joystick driver"); @@ -112,7 +111,7 @@ struct db9 { struct pardevice *pd; int mode; int used; - struct mutex mutex; + struct semaphore sem; char phys[DB9_MAX_DEVICES][32]; }; @@ -526,7 +525,7 @@ static int db9_open(struct input_dev *dev) struct parport *port = db9->pd->port; int err; - err = mutex_lock_interruptible(&db9->mutex); + err = down_interruptible(&db9->sem); if (err) return err; @@ -540,7 +539,7 @@ static int db9_open(struct input_dev *dev) mod_timer(&db9->timer, jiffies + DB9_REFRESH_TIME); } - mutex_unlock(&db9->mutex); + up(&db9->sem); return 0; } @@ -549,14 +548,14 @@ static void db9_close(struct input_dev *dev) struct db9 *db9 = dev->private; struct parport *port = db9->pd->port; - mutex_lock(&db9->mutex); + down(&db9->sem); if (!--db9->used) { del_timer_sync(&db9->timer); parport_write_control(port, 0x00); parport_data_forward(port); parport_release(db9->pd); } - mutex_unlock(&db9->mutex); + up(&db9->sem); } static struct db9 __init *db9_probe(int parport, int mode) @@ -584,7 +583,7 @@ static struct db9 __init *db9_probe(int parport, int mode) goto err_out; } - if (db9_mode->bidirectional && !(pp->modes & PARPORT_MODE_TRISTATE)) { + if (db9_mode[mode].bidirectional && !(pp->modes & PARPORT_MODE_TRISTATE)) { printk(KERN_ERR "db9.c: specified parport is not bidirectional\n"); err = -EINVAL; goto err_put_pp; @@ -604,7 +603,7 @@ static struct db9 __init *db9_probe(int parport, int mode) goto err_unreg_pardev; } - mutex_init(&db9->mutex); + init_MUTEX(&db9->sem); db9->pd = pd; db9->mode = mode; init_timer(&db9->timer); @@ -620,8 +619,7 @@ static struct db9 __init *db9_probe(int parport, int mode) goto err_unreg_devs; } - snprintf(db9->phys[i], sizeof(db9->phys[i]), - "%s/input%d", db9->pd->port->name, i); + sprintf(db9->phys[i], "%s/input%d", db9->pd->port->name, i); input_dev->name = db9_mode->name; input_dev->phys = db9->phys[i]; diff --git a/drivers/input/joystick/gamecon.c b/drivers/input/joystick/gamecon.c index fe12aa373..900587acd 100644 --- a/drivers/input/joystick/gamecon.c +++ b/drivers/input/joystick/gamecon.c @@ -7,7 +7,6 @@ * Based on the work of: * Andree Borrmann John Dahlstrom * David Kuder Nathan Hand - * Raphael Assenat */ /* @@ -37,7 +36,6 @@ #include #include #include -#include MODULE_AUTHOR("Vojtech Pavlik "); MODULE_DESCRIPTION("NES, SNES, N64, MultiSystem, PSX gamepad driver"); @@ -74,9 +72,8 @@ __obsolete_setup("gc_3="); #define GC_N64 6 #define GC_PSX 7 #define GC_DDR 8 -#define GC_SNESMOUSE 9 -#define GC_MAX 9 +#define GC_MAX 8 #define GC_REFRESH_TIME HZ/100 @@ -86,7 +83,7 @@ struct gc { struct timer_list timer; unsigned char pads[GC_MAX + 1]; int used; - struct mutex mutex; + struct semaphore sem; char phys[GC_MAX_DEVICES][32]; }; @@ -96,7 +93,7 @@ static int gc_status_bit[] = { 0x40, 0x80, 0x20, 0x10, 0x08 }; static char *gc_names[] = { NULL, "SNES pad", "NES pad", "NES FourPort", "Multisystem joystick", "Multisystem 2-button joystick", "N64 controller", "PSX controller", - "PSX DDR controller", "SNES mouse" }; + "PSX DDR controller" }; /* * N64 support. */ @@ -208,12 +205,9 @@ static void gc_n64_process_packet(struct gc *gc) * NES/SNES support. */ -#define GC_NES_DELAY 6 /* Delay between bits - 6us */ -#define GC_NES_LENGTH 8 /* The NES pads use 8 bits of data */ -#define GC_SNES_LENGTH 12 /* The SNES true length is 16, but the - last 4 bits are unused */ -#define GC_SNESMOUSE_LENGTH 32 /* The SNES mouse uses 32 bits, the first - 16 bits are equivalent to a gamepad */ +#define GC_NES_DELAY 6 /* Delay between bits - 6us */ +#define GC_NES_LENGTH 8 /* The NES pads use 8 bits of data */ +#define GC_SNES_LENGTH 12 /* The SNES true length is 16, but the last 4 bits are unused */ #define GC_NES_POWER 0xfc #define GC_NES_CLOCK 0x01 @@ -248,15 +242,11 @@ static void gc_nes_read_packet(struct gc *gc, int length, unsigned char *data) static void gc_nes_process_packet(struct gc *gc) { - unsigned char data[GC_SNESMOUSE_LENGTH]; + unsigned char data[GC_SNES_LENGTH]; struct input_dev *dev; - int i, j, s, len; - char x_rel, y_rel; - - len = gc->pads[GC_SNESMOUSE] ? GC_SNESMOUSE_LENGTH : - (gc->pads[GC_SNES] ? GC_SNES_LENGTH : GC_NES_LENGTH); + int i, j, s; - gc_nes_read_packet(gc, len, data); + gc_nes_read_packet(gc, gc->pads[GC_SNES] ? GC_SNES_LENGTH : GC_NES_LENGTH, data); for (i = 0; i < GC_MAX_DEVICES; i++) { @@ -279,44 +269,6 @@ static void gc_nes_process_packet(struct gc *gc) for (j = 0; j < 8; j++) input_report_key(dev, gc_snes_btn[j], s & data[gc_snes_bytes[j]]); - if (s & gc->pads[GC_SNESMOUSE]) { - /* - * The 4 unused bits from SNES controllers appear to be ID bits - * so use them to make sure iwe are dealing with a mouse. - * gamepad is connected. This is important since - * my SNES gamepad sends 1's for bits 16-31, which - * cause the mouse pointer to quickly move to the - * upper left corner of the screen. - */ - if (!(s & data[12]) && !(s & data[13]) && - !(s & data[14]) && (s & data[15])) { - input_report_key(dev, BTN_LEFT, s & data[9]); - input_report_key(dev, BTN_RIGHT, s & data[8]); - - x_rel = y_rel = 0; - for (j = 0; j < 7; j++) { - x_rel <<= 1; - if (data[25 + j] & s) - x_rel |= 1; - - y_rel <<= 1; - if (data[17 + j] & s) - y_rel |= 1; - } - - if (x_rel) { - if (data[24] & s) - x_rel = -x_rel; - input_report_rel(dev, REL_X, x_rel); - } - - if (y_rel) { - if (data[16] & s) - y_rel = -y_rel; - input_report_rel(dev, REL_Y, y_rel); - } - } - } input_sync(dev); } } @@ -572,10 +524,10 @@ static void gc_timer(unsigned long private) gc_n64_process_packet(gc); /* - * NES and SNES pads or mouse + * NES and SNES pads */ - if (gc->pads[GC_NES] || gc->pads[GC_SNES] || gc->pads[GC_SNESMOUSE]) + if (gc->pads[GC_NES] || gc->pads[GC_SNES]) gc_nes_process_packet(gc); /* @@ -600,7 +552,7 @@ static int gc_open(struct input_dev *dev) struct gc *gc = dev->private; int err; - err = mutex_lock_interruptible(&gc->mutex); + err = down_interruptible(&gc->sem); if (err) return err; @@ -610,7 +562,7 @@ static int gc_open(struct input_dev *dev) mod_timer(&gc->timer, jiffies + GC_REFRESH_TIME); } - mutex_unlock(&gc->mutex); + up(&gc->sem); return 0; } @@ -618,13 +570,13 @@ static void gc_close(struct input_dev *dev) { struct gc *gc = dev->private; - mutex_lock(&gc->mutex); + down(&gc->sem); if (!--gc->used) { del_timer_sync(&gc->timer); parport_write_control(gc->pd->port, 0x00); parport_release(gc->pd); } - mutex_unlock(&gc->mutex); + up(&gc->sem); } static int __init gc_setup_pad(struct gc *gc, int idx, int pad_type) @@ -657,13 +609,10 @@ static int __init gc_setup_pad(struct gc *gc, int idx, int pad_type) input_dev->open = gc_open; input_dev->close = gc_close; - if (pad_type != GC_SNESMOUSE) { - input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_ABS); + input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_ABS); - for (i = 0; i < 2; i++) - input_set_abs_params(input_dev, ABS_X + i, -1, 1, 0, 0); - } else - input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_REL); + for (i = 0; i < 2; i++) + input_set_abs_params(input_dev, ABS_X + i, -1, 1, 0, 0); gc->pads[0] |= gc_status_bit[idx]; gc->pads[pad_type] |= gc_status_bit[idx]; @@ -681,13 +630,6 @@ static int __init gc_setup_pad(struct gc *gc, int idx, int pad_type) break; - case GC_SNESMOUSE: - set_bit(BTN_LEFT, input_dev->keybit); - set_bit(BTN_RIGHT, input_dev->keybit); - set_bit(REL_X, input_dev->relbit); - set_bit(REL_Y, input_dev->relbit); - break; - case GC_SNES: for (i = 4; i < 8; i++) set_bit(gc_snes_btn[i], input_dev->keybit); @@ -751,7 +693,7 @@ static struct gc __init *gc_probe(int parport, int *pads, int n_pads) goto err_unreg_pardev; } - mutex_init(&gc->mutex); + init_MUTEX(&gc->sem); gc->pd = pd; init_timer(&gc->timer); gc->timer.data = (long) gc; @@ -761,8 +703,7 @@ static struct gc __init *gc_probe(int parport, int *pads, int n_pads) if (!pads[i]) continue; - snprintf(gc->phys[i], sizeof(gc->phys[i]), - "%s/input%d", gc->pd->port->name, i); + sprintf(gc->phys[i], "%s/input%d", gc->pd->port->name, i); err = gc_setup_pad(gc, i, pads[i]); if (err) goto err_unreg_devs; diff --git a/drivers/input/joystick/gf2k.c b/drivers/input/joystick/gf2k.c index e4a699f6e..8a3ad455e 100644 --- a/drivers/input/joystick/gf2k.c +++ b/drivers/input/joystick/gf2k.c @@ -298,7 +298,7 @@ static int gf2k_connect(struct gameport *gameport, struct gameport_driver *drv) gameport_set_poll_handler(gameport, gf2k_poll); gameport_set_poll_interval(gameport, 20); - snprintf(gf2k->phys, sizeof(gf2k->phys), "%s/input0", gameport->phys); + sprintf(gf2k->phys, "%s/input0", gameport->phys); gf2k->length = gf2k_lens[gf2k->id]; diff --git a/drivers/input/joystick/grip.c b/drivers/input/joystick/grip.c index 17a90c436..20cb98ac2 100644 --- a/drivers/input/joystick/grip.c +++ b/drivers/input/joystick/grip.c @@ -354,8 +354,7 @@ static int grip_connect(struct gameport *gameport, struct gameport_driver *drv) goto fail3; } - snprintf(grip->phys[i], sizeof(grip->phys[i]), - "%s/input%d", gameport->phys, i); + sprintf(grip->phys[i], "%s/input%d", gameport->phys, i); input_dev->name = grip_name[grip->mode[i]]; input_dev->phys = grip->phys[i]; diff --git a/drivers/input/joystick/guillemot.c b/drivers/input/joystick/guillemot.c index 840ed9b51..6e2c721c2 100644 --- a/drivers/input/joystick/guillemot.c +++ b/drivers/input/joystick/guillemot.c @@ -222,7 +222,7 @@ static int guillemot_connect(struct gameport *gameport, struct gameport_driver * gameport_set_poll_handler(gameport, guillemot_poll); gameport_set_poll_interval(gameport, 20); - snprintf(guillemot->phys, sizeof(guillemot->phys), "%s/input0", gameport->phys); + sprintf(guillemot->phys, "%s/input0", gameport->phys); guillemot->type = guillemot_type + i; input_dev->name = guillemot_type[i].name; diff --git a/drivers/input/joystick/iforce/iforce-ff.c b/drivers/input/joystick/iforce/iforce-ff.c index 50c90765a..4678b6dab 100644 --- a/drivers/input/joystick/iforce/iforce-ff.c +++ b/drivers/input/joystick/iforce/iforce-ff.c @@ -42,14 +42,14 @@ static int make_magnitude_modifier(struct iforce* iforce, unsigned char data[3]; if (!no_alloc) { - mutex_lock(&iforce->mem_mutex); + down(&iforce->mem_mutex); if (allocate_resource(&(iforce->device_memory), mod_chunk, 2, iforce->device_memory.start, iforce->device_memory.end, 2L, NULL, NULL)) { - mutex_unlock(&iforce->mem_mutex); - return -ENOSPC; + up(&iforce->mem_mutex); + return -ENOMEM; } - mutex_unlock(&iforce->mem_mutex); + up(&iforce->mem_mutex); } data[0] = LO(mod_chunk->start); @@ -75,14 +75,14 @@ static int make_period_modifier(struct iforce* iforce, period = TIME_SCALE(period); if (!no_alloc) { - mutex_lock(&iforce->mem_mutex); + down(&iforce->mem_mutex); if (allocate_resource(&(iforce->device_memory), mod_chunk, 0x0c, iforce->device_memory.start, iforce->device_memory.end, 2L, NULL, NULL)) { - mutex_unlock(&iforce->mem_mutex); - return -ENOSPC; + up(&iforce->mem_mutex); + return -ENOMEM; } - mutex_unlock(&iforce->mem_mutex); + up(&iforce->mem_mutex); } data[0] = LO(mod_chunk->start); @@ -115,14 +115,14 @@ static int make_envelope_modifier(struct iforce* iforce, fade_duration = TIME_SCALE(fade_duration); if (!no_alloc) { - mutex_lock(&iforce->mem_mutex); + down(&iforce->mem_mutex); if (allocate_resource(&(iforce->device_memory), mod_chunk, 0x0e, iforce->device_memory.start, iforce->device_memory.end, 2L, NULL, NULL)) { - mutex_unlock(&iforce->mem_mutex); - return -ENOSPC; + up(&iforce->mem_mutex); + return -ENOMEM; } - mutex_unlock(&iforce->mem_mutex); + up(&iforce->mem_mutex); } data[0] = LO(mod_chunk->start); @@ -152,14 +152,14 @@ static int make_condition_modifier(struct iforce* iforce, unsigned char data[10]; if (!no_alloc) { - mutex_lock(&iforce->mem_mutex); + down(&iforce->mem_mutex); if (allocate_resource(&(iforce->device_memory), mod_chunk, 8, iforce->device_memory.start, iforce->device_memory.end, 2L, NULL, NULL)) { - mutex_unlock(&iforce->mem_mutex); - return -ENOSPC; + up(&iforce->mem_mutex); + return -ENOMEM; } - mutex_unlock(&iforce->mem_mutex); + up(&iforce->mem_mutex); } data[0] = LO(mod_chunk->start); diff --git a/drivers/input/joystick/iforce/iforce-main.c b/drivers/input/joystick/iforce/iforce-main.c index b4914e723..b6bc04998 100644 --- a/drivers/input/joystick/iforce/iforce-main.c +++ b/drivers/input/joystick/iforce/iforce-main.c @@ -79,7 +79,6 @@ static struct iforce_device iforce_device[] = { { 0x06f8, 0x0001, "Guillemot Race Leader Force Feedback", btn_wheel, abs_wheel, ff_iforce }, //? { 0x06f8, 0x0004, "Guillemot Force Feedback Racing Wheel", btn_wheel, abs_wheel, ff_iforce }, //? { 0x06f8, 0x0004, "Gullemot Jet Leader 3D", btn_joystick, abs_joystick, ff_iforce }, //? - { 0x06d6, 0x29bc, "Trust Force Feedback Race Master", btn_wheel, abs_wheel, ff_iforce }, { 0x0000, 0x0000, "Unknown I-Force Device [%04x:%04x]", btn_joystick, abs_joystick, ff_iforce } }; @@ -87,7 +86,7 @@ static struct iforce_device iforce_device[] = { static int iforce_input_event(struct input_dev *dev, unsigned int type, unsigned int code, int value) { - struct iforce* iforce = dev->private; + struct iforce* iforce = (struct iforce*)(dev->private); unsigned char data[3]; if (type != EV_FF) @@ -139,7 +138,7 @@ static int iforce_input_event(struct input_dev *dev, unsigned int type, unsigned */ static int iforce_upload_effect(struct input_dev *dev, struct ff_effect *effect) { - struct iforce* iforce = dev->private; + struct iforce* iforce = (struct iforce*)(dev->private); int id; int ret; int is_update; @@ -219,26 +218,26 @@ static int iforce_upload_effect(struct input_dev *dev, struct ff_effect *effect) */ static int iforce_erase_effect(struct input_dev *dev, int effect_id) { - struct iforce* iforce = dev->private; + struct iforce* iforce = (struct iforce*)(dev->private); int err = 0; struct iforce_core_effect* core_effect; - if (effect_id < 0 || effect_id >= FF_EFFECTS_MAX) - return -EINVAL; - - core_effect = &iforce->core_effects[effect_id]; - /* Check who is trying to erase this effect */ - if (core_effect->owner != current->pid) { - printk(KERN_WARNING "iforce-main.c: %d tried to erase an effect belonging to %d\n", current->pid, core_effect->owner); + if (iforce->core_effects[effect_id].owner != current->pid) { + printk(KERN_WARNING "iforce-main.c: %d tried to erase an effect belonging to %d\n", current->pid, iforce->core_effects[effect_id].owner); return -EACCES; } + if (effect_id < 0 || effect_id >= FF_EFFECTS_MAX) + return -EINVAL; + + core_effect = iforce->core_effects + effect_id; + if (test_bit(FF_MOD1_IS_USED, core_effect->flags)) - err = release_resource(&core_effect->mod1_chunk); + err = release_resource(&(iforce->core_effects[effect_id].mod1_chunk)); if (!err && test_bit(FF_MOD2_IS_USED, core_effect->flags)) - err = release_resource(&core_effect->mod2_chunk); + err = release_resource(&(iforce->core_effects[effect_id].mod2_chunk)); /*TODO: remember to change that if more FF_MOD* bits are added */ core_effect->flags[0] = 0; @@ -351,7 +350,7 @@ int iforce_init_device(struct iforce *iforce) init_waitqueue_head(&iforce->wait); spin_lock_init(&iforce->xmit_lock); - mutex_init(&iforce->mem_mutex); + init_MUTEX(&iforce->mem_mutex); iforce->xmit.buf = iforce->xmit_data; iforce->dev = input_dev; diff --git a/drivers/input/joystick/iforce/iforce.h b/drivers/input/joystick/iforce/iforce.h index e9924d6f0..146f406b8 100644 --- a/drivers/input/joystick/iforce/iforce.h +++ b/drivers/input/joystick/iforce/iforce.h @@ -35,8 +35,9 @@ #include #include #include +#include #include -#include +#include /* This module provides arbitrary resource management routines. * I use it to manage the device's memory. @@ -44,7 +45,6 @@ */ #include - #define IFORCE_MAX_LENGTH 16 /* iforce::bus */ @@ -146,7 +146,7 @@ struct iforce { wait_queue_head_t wait; struct resource device_memory; struct iforce_core_effect core_effects[FF_EFFECTS_MAX]; - struct mutex mem_mutex; + struct semaphore mem_mutex; }; /* Get hi and low bytes of a 16-bits int */ diff --git a/drivers/input/joystick/interact.c b/drivers/input/joystick/interact.c index bbfeb9c59..c4ed01758 100644 --- a/drivers/input/joystick/interact.c +++ b/drivers/input/joystick/interact.c @@ -251,7 +251,7 @@ static int interact_connect(struct gameport *gameport, struct gameport_driver *d gameport_set_poll_handler(gameport, interact_poll); gameport_set_poll_interval(gameport, 20); - snprintf(interact->phys, sizeof(interact->phys), "%s/input0", gameport->phys); + sprintf(interact->phys, "%s/input0", gameport->phys); interact->type = i; interact->length = interact_type[i].length; diff --git a/drivers/input/joystick/magellan.c b/drivers/input/joystick/magellan.c index 168b1061a..ca3cc2319 100644 --- a/drivers/input/joystick/magellan.c +++ b/drivers/input/joystick/magellan.c @@ -162,7 +162,7 @@ static int magellan_connect(struct serio *serio, struct serio_driver *drv) goto fail; magellan->dev = input_dev; - snprintf(magellan->phys, sizeof(magellan->phys), "%s/input0", serio->phys); + sprintf(magellan->phys, "%s/input0", serio->phys); input_dev->name = "LogiCad3D Magellan / SpaceMouse"; input_dev->phys = magellan->phys; diff --git a/drivers/input/joystick/sidewinder.c b/drivers/input/joystick/sidewinder.c index e58b22c01..2b2ec1057 100644 --- a/drivers/input/joystick/sidewinder.c +++ b/drivers/input/joystick/sidewinder.c @@ -541,7 +541,7 @@ static void sw_print_packet(char *name, int length, unsigned char *buf, char bit * Unfortunately I don't know how to do this for the other SW types. */ -static void sw_3dp_id(unsigned char *buf, char *comment, size_t size) +static void sw_3dp_id(unsigned char *buf, char *comment) { int i; char pnp[8], rev[9]; @@ -554,7 +554,7 @@ static void sw_3dp_id(unsigned char *buf, char *comment, size_t size) pnp[7] = rev[8] = 0; - snprintf(comment, size, " [PnP %d.%02d id %s rev %s]", + sprintf(comment, " [PnP %d.%02d id %s rev %s]", (int) ((sw_get_bits(buf, 8, 6, 1) << 6) | /* Two 6-bit values */ sw_get_bits(buf, 16, 6, 1)) / 100, (int) ((sw_get_bits(buf, 8, 6, 1) << 6) | @@ -589,7 +589,7 @@ static int sw_connect(struct gameport *gameport, struct gameport_driver *drv) struct sw *sw; struct input_dev *input_dev; int i, j, k, l; - int err = 0; + int err; unsigned char *buf = NULL; /* [SW_LENGTH] */ unsigned char *idbuf = NULL; /* [SW_LENGTH] */ unsigned char m = 1; @@ -695,7 +695,7 @@ static int sw_connect(struct gameport *gameport, struct gameport_driver *drv) sw->type = SW_ID_FFP; sprintf(comment, " [AC %s]", sw_get_bits(idbuf,38,1,3) ? "off" : "on"); } else - sw->type = SW_ID_PP; + sw->type = SW_ID_PP; break; case 66: sw->bits = 3; @@ -703,8 +703,7 @@ static int sw_connect(struct gameport *gameport, struct gameport_driver *drv) sw->length = 22; case 64: sw->type = SW_ID_3DP; - if (j == 160) - sw_3dp_id(idbuf, comment, sizeof(comment)); + if (j == 160) sw_3dp_id(idbuf, comment); break; } } @@ -734,10 +733,8 @@ static int sw_connect(struct gameport *gameport, struct gameport_driver *drv) for (i = 0; i < sw->number; i++) { int bits, code; - snprintf(sw->name, sizeof(sw->name), - "Microsoft SideWinder %s", sw_name[sw->type]); - snprintf(sw->phys[i], sizeof(sw->phys[i]), - "%s/input%d", gameport->phys, i); + sprintf(sw->name, "Microsoft SideWinder %s", sw_name[sw->type]); + sprintf(sw->phys[i], "%s/input%d", gameport->phys, i); sw->dev[i] = input_dev = input_allocate_device(); if (!input_dev) { @@ -779,10 +776,7 @@ static int sw_connect(struct gameport *gameport, struct gameport_driver *drv) goto fail4; } - out: kfree(buf); - kfree(idbuf); - - return err; + return 0; fail4: input_free_device(sw->dev[i]); fail3: while (--i >= 0) @@ -790,7 +784,9 @@ static int sw_connect(struct gameport *gameport, struct gameport_driver *drv) fail2: gameport_close(gameport); fail1: gameport_set_drvdata(gameport, NULL); kfree(sw); - goto out; + kfree(buf); + kfree(idbuf); + return err; } static void sw_disconnect(struct gameport *gameport) diff --git a/drivers/input/joystick/spaceball.c b/drivers/input/joystick/spaceball.c index 7a19ee052..d6f8db8ec 100644 --- a/drivers/input/joystick/spaceball.c +++ b/drivers/input/joystick/spaceball.c @@ -50,7 +50,7 @@ MODULE_LICENSE("GPL"); */ #define SPACEBALL_MAX_LENGTH 128 -#define SPACEBALL_MAX_ID 9 +#define SPACEBALL_MAX_ID 8 #define SPACEBALL_1003 1 #define SPACEBALL_2003B 3 @@ -220,7 +220,7 @@ static int spaceball_connect(struct serio *serio, struct serio_driver *drv) goto fail; spaceball->dev = input_dev; - snprintf(spaceball->phys, sizeof(spaceball->phys), "%s/input0", serio->phys); + sprintf(spaceball->phys, "%s/input0", serio->phys); input_dev->name = spaceball_names[id]; input_dev->phys = spaceball->phys; diff --git a/drivers/input/joystick/spaceorb.c b/drivers/input/joystick/spaceorb.c index 3e2782e79..7c123a01c 100644 --- a/drivers/input/joystick/spaceorb.c +++ b/drivers/input/joystick/spaceorb.c @@ -177,7 +177,7 @@ static int spaceorb_connect(struct serio *serio, struct serio_driver *drv) goto fail; spaceorb->dev = input_dev; - snprintf(spaceorb->phys, sizeof(spaceorb->phys), "%s/input0", serio->phys); + sprintf(spaceorb->phys, "%s/input0", serio->phys); input_dev->name = "SpaceTec SpaceOrb 360 / Avenger"; input_dev->phys = spaceorb->phys; diff --git a/drivers/input/joystick/stinger.c b/drivers/input/joystick/stinger.c index 011ec4858..0a9ed1d30 100644 --- a/drivers/input/joystick/stinger.c +++ b/drivers/input/joystick/stinger.c @@ -148,7 +148,7 @@ static int stinger_connect(struct serio *serio, struct serio_driver *drv) goto fail; stinger->dev = input_dev; - snprintf(stinger->phys, sizeof(stinger->phys), "%s/serio0", serio->phys); + sprintf(stinger->phys, "%s/serio0", serio->phys); input_dev->name = "Gravis Stinger"; input_dev->phys = stinger->phys; diff --git a/drivers/input/joystick/turbografx.c b/drivers/input/joystick/turbografx.c index 5570fd548..b154938e8 100644 --- a/drivers/input/joystick/turbografx.c +++ b/drivers/input/joystick/turbografx.c @@ -37,7 +37,6 @@ #include #include #include -#include MODULE_AUTHOR("Vojtech Pavlik "); MODULE_DESCRIPTION("TurboGraFX parallel port interface driver"); @@ -87,7 +86,7 @@ static struct tgfx { char phys[TGFX_MAX_DEVICES][32]; int sticks; int used; - struct mutex sem; + struct semaphore sem; } *tgfx_base[TGFX_MAX_PORTS]; /* @@ -129,7 +128,7 @@ static int tgfx_open(struct input_dev *dev) struct tgfx *tgfx = dev->private; int err; - err = mutex_lock_interruptible(&tgfx->sem); + err = down_interruptible(&tgfx->sem); if (err) return err; @@ -139,7 +138,7 @@ static int tgfx_open(struct input_dev *dev) mod_timer(&tgfx->timer, jiffies + TGFX_REFRESH_TIME); } - mutex_unlock(&tgfx->sem); + up(&tgfx->sem); return 0; } @@ -147,13 +146,13 @@ static void tgfx_close(struct input_dev *dev) { struct tgfx *tgfx = dev->private; - mutex_lock(&tgfx->sem); + down(&tgfx->sem); if (!--tgfx->used) { del_timer_sync(&tgfx->timer); parport_write_control(tgfx->pd->port, 0x00); parport_release(tgfx->pd); } - mutex_unlock(&tgfx->sem); + up(&tgfx->sem); } @@ -192,7 +191,7 @@ static struct tgfx __init *tgfx_probe(int parport, int *n_buttons, int n_devs) goto err_unreg_pardev; } - mutex_init(&tgfx->sem); + init_MUTEX(&tgfx->sem); tgfx->pd = pd; init_timer(&tgfx->timer); tgfx->timer.data = (long) tgfx; diff --git a/drivers/input/joystick/twidjoy.c b/drivers/input/joystick/twidjoy.c index 076f237d9..7f8b0093c 100644 --- a/drivers/input/joystick/twidjoy.c +++ b/drivers/input/joystick/twidjoy.c @@ -199,7 +199,7 @@ static int twidjoy_connect(struct serio *serio, struct serio_driver *drv) goto fail; twidjoy->dev = input_dev; - snprintf(twidjoy->phys, sizeof(twidjoy->phys), "%s/input0", serio->phys); + sprintf(twidjoy->phys, "%s/input0", serio->phys); input_dev->name = "Handykey Twiddler"; input_dev->phys = twidjoy->phys; diff --git a/drivers/input/joystick/warrior.c b/drivers/input/joystick/warrior.c index f9c1a0321..1849b176c 100644 --- a/drivers/input/joystick/warrior.c +++ b/drivers/input/joystick/warrior.c @@ -154,7 +154,7 @@ static int warrior_connect(struct serio *serio, struct serio_driver *drv) goto fail; warrior->dev = input_dev; - snprintf(warrior->phys, sizeof(warrior->phys), "%s/input0", serio->phys); + sprintf(warrior->phys, "%s/input0", serio->phys); input_dev->name = "Logitech WingMan Warrior"; input_dev->phys = warrior->phys; diff --git a/drivers/input/keyboard/Kconfig b/drivers/input/keyboard/Kconfig index a9dda56f6..3b0ac3b43 100644 --- a/drivers/input/keyboard/Kconfig +++ b/drivers/input/keyboard/Kconfig @@ -13,7 +13,7 @@ menuconfig INPUT_KEYBOARD if INPUT_KEYBOARD config KEYBOARD_ATKBD - tristate "AT keyboard" if EMBEDDED || !X86_PC + tristate "AT keyboard" if !X86_PC default y select SERIO select SERIO_LIBPS2 diff --git a/drivers/input/keyboard/amikbd.c b/drivers/input/keyboard/amikbd.c index f1f9db9d2..4c8fb1f86 100644 --- a/drivers/input/keyboard/amikbd.c +++ b/drivers/input/keyboard/amikbd.c @@ -36,7 +36,6 @@ #include #include #include -#include #include #include @@ -46,7 +45,7 @@ MODULE_AUTHOR("Vojtech Pavlik "); MODULE_DESCRIPTION("Amiga keyboard driver"); MODULE_LICENSE("GPL"); -static unsigned char amikbd_keycode[0x78] __initdata = { +static unsigned char amikbd_keycode[0x78] = { [0] = KEY_GRAVE, [1] = KEY_1, [2] = KEY_2, @@ -171,9 +170,12 @@ static irqreturn_t amikbd_interrupt(int irq, void *dummy, struct pt_regs *fp) scancode >>= 1; if (scancode < 0x78) { /* scancodes < 0x78 are keys */ + + scancode = amikbd_keycode[scancode]; + input_regs(amikbd_dev, fp); - if (scancode == 98) { /* CapsLock is a toggle switch key on Amiga */ + if (scancode == KEY_CAPSLOCK) { /* CapsLock is a toggle switch key on Amiga */ input_report_key(amikbd_dev, scancode, 1); input_report_key(amikbd_dev, scancode, 0); } else { @@ -189,7 +191,7 @@ static irqreturn_t amikbd_interrupt(int irq, void *dummy, struct pt_regs *fp) static int __init amikbd_init(void) { - int i, j; + int i; if (!AMIGAHW_PRESENT(AMI_KEYBOARD)) return -EIO; @@ -212,26 +214,14 @@ static int __init amikbd_init(void) amikbd_dev->id.version = 0x0100; amikbd_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_REP); + amikbd_dev->keycode = amikbd_keycode; + amikbd_dev->keycodesize = sizeof(unsigned char); + amikbd_dev->keycodemax = ARRAY_SIZE(amikbd_keycode); for (i = 0; i < 0x78; i++) - set_bit(i, amikbd_dev->keybit); - - for (i = 0; i < MAX_NR_KEYMAPS; i++) { - static u_short temp_map[NR_KEYS] __initdata; - if (!key_maps[i]) - continue; - memset(temp_map, 0, sizeof(temp_map)); - for (j = 0; j < 0x78; j++) { - if (!amikbd_keycode[j]) - continue; - temp_map[j] = key_maps[i][amikbd_keycode[j]]; - } - for (j = 0; j < NR_KEYS; j++) { - if (!temp_map[j]) - temp_map[j] = 0xf200; - } - memcpy(key_maps[i], temp_map, sizeof(temp_map)); - } + if (amikbd_keycode[i]) + set_bit(amikbd_keycode[i], amikbd_dev->keybit); + ciaa.cra &= ~0x41; /* serial data in, turn off TA */ request_irq(IRQ_AMIGA_CIAA_SP, amikbd_interrupt, 0, "amikbd", amikbd_interrupt); diff --git a/drivers/input/keyboard/atkbd.c b/drivers/input/keyboard/atkbd.c index dd9958876..ffacf6eca 100644 --- a/drivers/input/keyboard/atkbd.c +++ b/drivers/input/keyboard/atkbd.c @@ -27,7 +27,6 @@ #include #include #include -#include #define DRIVER_DESC "AT and PS/2 keyboard driver" @@ -55,7 +54,7 @@ static int atkbd_softraw = 1; module_param_named(softraw, atkbd_softraw, bool, 0); MODULE_PARM_DESC(softraw, "Use software generated rawmode"); -static int atkbd_scroll; +static int atkbd_scroll = 0; module_param_named(scroll, atkbd_scroll, bool, 0); MODULE_PARM_DESC(scroll, "Enable scroll-wheel on MS Office and similar keyboards"); @@ -150,8 +149,8 @@ static unsigned char atkbd_unxlate_table[128] = { #define ATKBD_RET_EMUL0 0xe0 #define ATKBD_RET_EMUL1 0xe1 #define ATKBD_RET_RELEASE 0xf0 -#define ATKBD_RET_HANJA 0xf1 -#define ATKBD_RET_HANGEUL 0xf2 +#define ATKBD_RET_HANGUEL 0xf1 +#define ATKBD_RET_HANJA 0xf2 #define ATKBD_RET_ERR 0xff #define ATKBD_KEY_UNKNOWN 0 @@ -170,13 +169,6 @@ static unsigned char atkbd_unxlate_table[128] = { #define ATKBD_LED_EVENT_BIT 0 #define ATKBD_REP_EVENT_BIT 1 -#define ATKBD_XL_ERR 0x01 -#define ATKBD_XL_BAT 0x02 -#define ATKBD_XL_ACK 0x04 -#define ATKBD_XL_NAK 0x08 -#define ATKBD_XL_HANGEUL 0x10 -#define ATKBD_XL_HANJA 0x20 - static struct { unsigned char keycode; unsigned char set2; @@ -218,12 +210,13 @@ struct atkbd { unsigned char emul; unsigned char resend; unsigned char release; - unsigned long xl_bit; + unsigned char bat_xl; + unsigned char err_xl; unsigned int last; unsigned long time; struct work_struct event_work; - struct mutex event_mutex; + struct semaphore event_sem; unsigned long event_mask; }; @@ -251,65 +244,17 @@ ATKBD_DEFINE_ATTR(set); ATKBD_DEFINE_ATTR(softrepeat); ATKBD_DEFINE_ATTR(softraw); -static const unsigned int xl_table[] = { - ATKBD_RET_BAT, ATKBD_RET_ERR, ATKBD_RET_ACK, - ATKBD_RET_NAK, ATKBD_RET_HANJA, ATKBD_RET_HANGEUL, -}; - -/* - * Checks if we should mangle the scancode to extract 'release' bit - * in translated mode. - */ -static int atkbd_need_xlate(unsigned long xl_bit, unsigned char code) -{ - int i; - - if (code == ATKBD_RET_EMUL0 || code == ATKBD_RET_EMUL1) - return 0; - - for (i = 0; i < ARRAY_SIZE(xl_table); i++) - if (code == xl_table[i]) - return test_bit(i, &xl_bit); - - return 1; -} -/* - * Calculates new value of xl_bit so the driver can distinguish - * between make/break pair of scancodes for select keys and PS/2 - * protocol responses. - */ -static void atkbd_calculate_xl_bit(struct atkbd *atkbd, unsigned char code) -{ - int i; - - for (i = 0; i < ARRAY_SIZE(xl_table); i++) { - if (!((code ^ xl_table[i]) & 0x7f)) { - if (code & 0x80) - __clear_bit(i, &atkbd->xl_bit); - else - __set_bit(i, &atkbd->xl_bit); - break; - } - } -} - -/* - * Encode the scancode, 0xe0 prefix, and high bit into a single integer, - * keeping kernel 2.4 compatibility for set 2 - */ -static unsigned int atkbd_compat_scancode(struct atkbd *atkbd, unsigned int code) +static void atkbd_report_key(struct input_dev *dev, struct pt_regs *regs, int code, int value) { - if (atkbd->set == 3) { - if (atkbd->emul == 1) - code |= 0x100; - } else { - code = (code & 0x7f) | ((code & 0x80) << 1); - if (atkbd->emul == 1) - code |= 0x80; - } - - return code; + input_regs(dev, regs); + if (value == 3) { + input_report_key(dev, code, 1); + input_sync(dev); + input_report_key(dev, code, 0); + } else + input_event(dev, EV_KEY, code, value); + input_sync(dev); } /* @@ -321,11 +266,9 @@ static irqreturn_t atkbd_interrupt(struct serio *serio, unsigned char data, unsigned int flags, struct pt_regs *regs) { struct atkbd *atkbd = serio_get_drvdata(serio); - struct input_dev *dev = atkbd->dev; unsigned int code = data; - int scroll = 0, hscroll = 0, click = -1, add_release_event = 0; + int scroll = 0, hscroll = 0, click = -1; int value; - unsigned char keycode; #ifdef ATKBD_DEBUG printk(KERN_DEBUG "atkbd.c: Received %02x flags %02x\n", data, flags); @@ -354,17 +297,25 @@ static irqreturn_t atkbd_interrupt(struct serio *serio, unsigned char data, if (!atkbd->enabled) goto out; - input_event(dev, EV_MSC, MSC_RAW, code); + input_event(atkbd->dev, EV_MSC, MSC_RAW, code); if (atkbd->translated) { - if (atkbd->emul || atkbd_need_xlate(atkbd->xl_bit, code)) { + if (atkbd->emul || + !(code == ATKBD_RET_EMUL0 || code == ATKBD_RET_EMUL1 || + code == ATKBD_RET_HANGUEL || code == ATKBD_RET_HANJA || + (code == ATKBD_RET_ERR && !atkbd->err_xl) || + (code == ATKBD_RET_BAT && !atkbd->bat_xl))) { atkbd->release = code >> 7; code &= 0x7f; } - if (!atkbd->emul) - atkbd_calculate_xl_bit(atkbd, data); + if (!atkbd->emul) { + if ((code & 0x7f) == (ATKBD_RET_BAT & 0x7f)) + atkbd->bat_xl = !atkbd->release; + if ((code & 0x7f) == (ATKBD_RET_ERR & 0x7f)) + atkbd->err_xl = !atkbd->release; + } } switch (code) { @@ -381,52 +332,47 @@ static irqreturn_t atkbd_interrupt(struct serio *serio, unsigned char data, case ATKBD_RET_RELEASE: atkbd->release = 1; goto out; - case ATKBD_RET_ACK: - case ATKBD_RET_NAK: -#if 0 - /* Quite a few key switchers and other tools trigger this and it confuses - people who can do nothing about it */ - printk(KERN_WARNING "atkbd.c: Spurious %s on %s. " - "Some program might be trying access hardware directly.\n", - data == ATKBD_RET_ACK ? "ACK" : "NAK", serio->phys); -#endif + case ATKBD_RET_HANGUEL: + atkbd_report_key(atkbd->dev, regs, KEY_HANGUEL, 3); goto out; - case ATKBD_RET_HANGEUL: case ATKBD_RET_HANJA: - /* - * These keys do not report release and thus need to be - * flagged properly - */ - add_release_event = 1; - break; + atkbd_report_key(atkbd->dev, regs, KEY_HANJA, 3); + goto out; case ATKBD_RET_ERR: -// printk(KERN_DEBUG "atkbd.c: Keyboard on %s reports too many keys pressed.\n", serio->phys); + printk(KERN_DEBUG "atkbd.c: Keyboard on %s reports too many keys pressed.\n", serio->phys); goto out; } - code = atkbd_compat_scancode(atkbd, code); - - if (atkbd->emul && --atkbd->emul) - goto out; - - keycode = atkbd->keycode[code]; + if (atkbd->set != 3) + code = (code & 0x7f) | ((code & 0x80) << 1); + if (atkbd->emul) { + if (--atkbd->emul) + goto out; + code |= (atkbd->set != 3) ? 0x80 : 0x100; + } - if (keycode != ATKBD_KEY_NULL) - input_event(dev, EV_MSC, MSC_SCAN, code); + if (atkbd->keycode[code] != ATKBD_KEY_NULL) + input_event(atkbd->dev, EV_MSC, MSC_SCAN, code); - switch (keycode) { + switch (atkbd->keycode[code]) { case ATKBD_KEY_NULL: break; case ATKBD_KEY_UNKNOWN: - printk(KERN_WARNING - "atkbd.c: Unknown key %s (%s set %d, code %#x on %s).\n", - atkbd->release ? "released" : "pressed", - atkbd->translated ? "translated" : "raw", - atkbd->set, code, serio->phys); - printk(KERN_WARNING - "atkbd.c: Use 'setkeycodes %s%02x ' to make it known.\n", - code & 0x80 ? "e0" : "", code & 0x7f); - input_sync(dev); + if (data == ATKBD_RET_ACK || data == ATKBD_RET_NAK) { + printk(KERN_WARNING "atkbd.c: Spurious %s on %s. Some program, " + "like XFree86, might be trying access hardware directly.\n", + data == ATKBD_RET_ACK ? "ACK" : "NAK", serio->phys); + } else { + printk(KERN_WARNING "atkbd.c: Unknown key %s " + "(%s set %d, code %#x on %s).\n", + atkbd->release ? "released" : "pressed", + atkbd->translated ? "translated" : "raw", + atkbd->set, code, serio->phys); + printk(KERN_WARNING "atkbd.c: Use 'setkeycodes %s%02x ' " + "to make it known.\n", + code & 0x80 ? "e0" : "", code & 0x7f); + } + input_sync(atkbd->dev); break; case ATKBD_SCR_1: scroll = 1 - atkbd->release * 2; @@ -450,35 +396,33 @@ static irqreturn_t atkbd_interrupt(struct serio *serio, unsigned char data, hscroll = 1; break; default: - if (atkbd->release) { - value = 0; - atkbd->last = 0; - } else if (!atkbd->softrepeat && test_bit(keycode, dev->key)) { - /* Workaround Toshiba laptop multiple keypress */ - value = time_before(jiffies, atkbd->time) && atkbd->last == code ? 1 : 2; - } else { - value = 1; - atkbd->last = code; - atkbd->time = jiffies + msecs_to_jiffies(dev->rep[REP_DELAY]) / 2; + value = atkbd->release ? 0 : + (1 + (!atkbd->softrepeat && test_bit(atkbd->keycode[code], atkbd->dev->key))); + + switch (value) { /* Workaround Toshiba laptop multiple keypress */ + case 0: + atkbd->last = 0; + break; + case 1: + atkbd->last = code; + atkbd->time = jiffies + msecs_to_jiffies(atkbd->dev->rep[REP_DELAY]) / 2; + break; + case 2: + if (!time_after(jiffies, atkbd->time) && atkbd->last == code) + value = 1; + break; } - input_regs(dev, regs); - input_event(dev, EV_KEY, keycode, value); - input_sync(dev); - - if (value && add_release_event) { - input_report_key(dev, keycode, 0); - input_sync(dev); - } + atkbd_report_key(atkbd->dev, regs, atkbd->keycode[code], value); } if (atkbd->scroll) { - input_regs(dev, regs); + input_regs(atkbd->dev, regs); if (click != -1) - input_report_key(dev, BTN_MIDDLE, click); - input_report_rel(dev, REL_WHEEL, scroll); - input_report_rel(dev, REL_HWHEEL, hscroll); - input_sync(dev); + input_report_key(atkbd->dev, BTN_MIDDLE, click); + input_report_rel(atkbd->dev, REL_WHEEL, scroll); + input_report_rel(atkbd->dev, REL_HWHEEL, hscroll); + input_sync(atkbd->dev); } atkbd->release = 0; @@ -486,7 +430,13 @@ out: return IRQ_HANDLED; } -static int atkbd_set_repeat_rate(struct atkbd *atkbd) +/* + * atkbd_event_work() is used to complete processing of events that + * can not be processed by input_event() which is often called from + * interrupt context. + */ + +static void atkbd_event_work(void *data) { const short period[32] = { 33, 37, 42, 46, 50, 54, 58, 63, 67, 75, 83, 92, 100, 109, 116, 125, @@ -494,66 +444,43 @@ static int atkbd_set_repeat_rate(struct atkbd *atkbd) const short delay[4] = { 250, 500, 750, 1000 }; - struct input_dev *dev = atkbd->dev; - unsigned char param; - int i = 0, j = 0; - - while (i < ARRAY_SIZE(period) - 1 && period[i] < dev->rep[REP_PERIOD]) - i++; - dev->rep[REP_PERIOD] = period[i]; - - while (j < ARRAY_SIZE(delay) - 1 && delay[j] < dev->rep[REP_DELAY]) - j++; - dev->rep[REP_DELAY] = delay[j]; - - param = i | (j << 5); - return ps2_command(&atkbd->ps2dev, ¶m, ATKBD_CMD_SETREP); -} - -static int atkbd_set_leds(struct atkbd *atkbd) -{ + struct atkbd *atkbd = data; struct input_dev *dev = atkbd->dev; unsigned char param[2]; + int i, j; - param[0] = (test_bit(LED_SCROLLL, dev->led) ? 1 : 0) - | (test_bit(LED_NUML, dev->led) ? 2 : 0) - | (test_bit(LED_CAPSL, dev->led) ? 4 : 0); - if (ps2_command(&atkbd->ps2dev, param, ATKBD_CMD_SETLEDS)) - return -1; - - if (atkbd->extra) { - param[0] = 0; - param[1] = (test_bit(LED_COMPOSE, dev->led) ? 0x01 : 0) - | (test_bit(LED_SLEEP, dev->led) ? 0x02 : 0) - | (test_bit(LED_SUSPEND, dev->led) ? 0x04 : 0) - | (test_bit(LED_MISC, dev->led) ? 0x10 : 0) - | (test_bit(LED_MUTE, dev->led) ? 0x20 : 0); - if (ps2_command(&atkbd->ps2dev, param, ATKBD_CMD_EX_SETLEDS)) - return -1; + down(&atkbd->event_sem); + + if (test_and_clear_bit(ATKBD_LED_EVENT_BIT, &atkbd->event_mask)) { + param[0] = (test_bit(LED_SCROLLL, dev->led) ? 1 : 0) + | (test_bit(LED_NUML, dev->led) ? 2 : 0) + | (test_bit(LED_CAPSL, dev->led) ? 4 : 0); + ps2_command(&atkbd->ps2dev, param, ATKBD_CMD_SETLEDS); + + if (atkbd->extra) { + param[0] = 0; + param[1] = (test_bit(LED_COMPOSE, dev->led) ? 0x01 : 0) + | (test_bit(LED_SLEEP, dev->led) ? 0x02 : 0) + | (test_bit(LED_SUSPEND, dev->led) ? 0x04 : 0) + | (test_bit(LED_MISC, dev->led) ? 0x10 : 0) + | (test_bit(LED_MUTE, dev->led) ? 0x20 : 0); + ps2_command(&atkbd->ps2dev, param, ATKBD_CMD_EX_SETLEDS); + } } - return 0; -} - -/* - * atkbd_event_work() is used to complete processing of events that - * can not be processed by input_event() which is often called from - * interrupt context. - */ - -static void atkbd_event_work(void *data) -{ - struct atkbd *atkbd = data; - - mutex_lock(&atkbd->event_mutex); - - if (test_and_clear_bit(ATKBD_LED_EVENT_BIT, &atkbd->event_mask)) - atkbd_set_leds(atkbd); - - if (test_and_clear_bit(ATKBD_REP_EVENT_BIT, &atkbd->event_mask)) - atkbd_set_repeat_rate(atkbd); + if (test_and_clear_bit(ATKBD_REP_EVENT_BIT, &atkbd->event_mask)) { + i = j = 0; + while (i < 31 && period[i] < dev->rep[REP_PERIOD]) + i++; + while (j < 3 && delay[j] < dev->rep[REP_DELAY]) + j++; + dev->rep[REP_PERIOD] = period[i]; + dev->rep[REP_DELAY] = delay[j]; + param[0] = i | (j << 5); + ps2_command(&atkbd->ps2dev, param, ATKBD_CMD_SETREP); + } - mutex_unlock(&atkbd->event_mutex); + up(&atkbd->event_sem); } /* @@ -836,9 +763,6 @@ static void atkbd_set_keycode_table(struct atkbd *atkbd) for (i = 0; i < ARRAY_SIZE(atkbd_scroll_keys); i++) atkbd->keycode[atkbd_scroll_keys[i].set2] = atkbd_scroll_keys[i].keycode; } - - atkbd->keycode[atkbd_compat_scancode(atkbd, ATKBD_RET_HANGEUL)] = KEY_HANGUEL; - atkbd->keycode[atkbd_compat_scancode(atkbd, ATKBD_RET_HANJA)] = KEY_HANJA; } /* @@ -851,15 +775,12 @@ static void atkbd_set_device_attrs(struct atkbd *atkbd) int i; if (atkbd->extra) - snprintf(atkbd->name, sizeof(atkbd->name), - "AT Set 2 Extra keyboard"); + sprintf(atkbd->name, "AT Set 2 Extra keyboard"); else - snprintf(atkbd->name, sizeof(atkbd->name), - "AT %s Set %d keyboard", - atkbd->translated ? "Translated" : "Raw", atkbd->set); + sprintf(atkbd->name, "AT %s Set %d keyboard", + atkbd->translated ? "Translated" : "Raw", atkbd->set); - snprintf(atkbd->phys, sizeof(atkbd->phys), - "%s/input0", atkbd->ps2dev.serio->phys); + sprintf(atkbd->phys, "%s/input0", atkbd->ps2dev.serio->phys); input_dev->name = atkbd->name; input_dev->phys = atkbd->phys; @@ -925,7 +846,7 @@ static int atkbd_connect(struct serio *serio, struct serio_driver *drv) atkbd->dev = dev; ps2_init(&atkbd->ps2dev, serio); INIT_WORK(&atkbd->event_work, atkbd_event_work, atkbd); - mutex_init(&atkbd->event_mutex); + init_MUTEX(&atkbd->event_sem); switch (serio->id.type) { @@ -941,6 +862,9 @@ static int atkbd_connect(struct serio *serio, struct serio_driver *drv) atkbd->softrepeat = atkbd_softrepeat; atkbd->scroll = atkbd_scroll; + if (!atkbd->write) + atkbd->softrepeat = 1; + if (atkbd->softrepeat) atkbd->softraw = 1; @@ -996,6 +920,7 @@ static int atkbd_reconnect(struct serio *serio) { struct atkbd *atkbd = serio_get_drvdata(serio); struct serio_driver *drv = serio->drv; + unsigned char param[1]; if (!atkbd || !drv) { printk(KERN_DEBUG "atkbd: reconnect request, but serio is disconnected, ignoring...\n"); @@ -1005,6 +930,10 @@ static int atkbd_reconnect(struct serio *serio) atkbd_disable(atkbd); if (atkbd->write) { + param[0] = (test_bit(LED_SCROLLL, atkbd->dev->led) ? 1 : 0) + | (test_bit(LED_NUML, atkbd->dev->led) ? 2 : 0) + | (test_bit(LED_CAPSL, atkbd->dev->led) ? 4 : 0); + if (atkbd_probe(atkbd)) return -1; if (atkbd->set != atkbd_select_set(atkbd, atkbd->set, atkbd->extra)) @@ -1012,13 +941,8 @@ static int atkbd_reconnect(struct serio *serio) atkbd_activate(atkbd); -/* - * Restore repeat rate and LEDs (that were reset by atkbd_activate) - * to pre-resume state - */ - if (!atkbd->softrepeat) - atkbd_set_repeat_rate(atkbd); - atkbd_set_leds(atkbd); + if (ps2_command(&atkbd->ps2dev, param, ATKBD_CMD_SETLEDS)) + return -1; } atkbd_enable(atkbd); diff --git a/drivers/input/keyboard/corgikbd.c b/drivers/input/keyboard/corgikbd.c index 1e03153b9..e301ee4ca 100644 --- a/drivers/input/keyboard/corgikbd.c +++ b/drivers/input/keyboard/corgikbd.c @@ -29,11 +29,11 @@ #define KB_COLS 12 #define KB_ROWMASK(r) (1 << (r)) #define SCANCODE(r,c) ( ((r)<<4) + (c) + 1 ) -/* zero code, 124 scancodes */ -#define NR_SCANCODES ( SCANCODE(KB_ROWS-1,KB_COLS-1) +1 +1 ) +/* zero code, 124 scancodes + 3 hinge combinations */ +#define NR_SCANCODES ( SCANCODE(KB_ROWS-1,KB_COLS-1) +1 +1 +3 ) +#define SCAN_INTERVAL (HZ/10) -#define SCAN_INTERVAL (50) /* ms */ -#define HINGE_SCAN_INTERVAL (250) /* ms */ +#define HINGE_SCAN_INTERVAL (HZ/4) #define CORGI_KEY_CALENDER KEY_F1 #define CORGI_KEY_ADDRESS KEY_F2 @@ -49,6 +49,9 @@ #define CORGI_KEY_MAIL KEY_F10 #define CORGI_KEY_OK KEY_F11 #define CORGI_KEY_MENU KEY_F12 +#define CORGI_HINGE_0 KEY_KP0 +#define CORGI_HINGE_1 KEY_KP1 +#define CORGI_HINGE_2 KEY_KP2 static unsigned char corgikbd_keycode[NR_SCANCODES] = { 0, /* 0 */ @@ -60,6 +63,7 @@ static unsigned char corgikbd_keycode[NR_SCANCODES] = { CORGI_KEY_MAIL, KEY_Z, KEY_X, KEY_MINUS, KEY_SPACE, KEY_COMMA, 0, KEY_UP, 0, 0, 0, CORGI_KEY_FN, 0, 0, 0, 0, /* 81-96 */ KEY_SYSRQ, CORGI_KEY_JAP1, CORGI_KEY_JAP2, CORGI_KEY_CANCEL, CORGI_KEY_OK, CORGI_KEY_MENU, KEY_LEFT, KEY_DOWN, KEY_RIGHT, 0, 0, 0, 0, 0, 0, 0, /* 97-112 */ CORGI_KEY_OFF, CORGI_KEY_EXOK, CORGI_KEY_EXCANCEL, CORGI_KEY_EXJOGDOWN, CORGI_KEY_EXJOGUP, 0, 0, 0, 0, 0, 0, 0, /* 113-124 */ + CORGI_HINGE_0, CORGI_HINGE_1, CORGI_HINGE_2 /* 125-127 */ }; @@ -183,7 +187,7 @@ static void corgikbd_scankeyboard(struct corgikbd *corgikbd_data, struct pt_regs /* if any keys are pressed, enable the timer */ if (num_pressed) - mod_timer(&corgikbd_data->timer, jiffies + msecs_to_jiffies(SCAN_INTERVAL)); + mod_timer(&corgikbd_data->timer, jiffies + SCAN_INTERVAL); spin_unlock_irqrestore(&corgikbd_data->lock, flags); } @@ -224,7 +228,6 @@ static void corgikbd_timer_callback(unsigned long data) * 0x0c - Keyboard and Screen Closed */ -#define READ_GPIO_BIT(x) (GPLR(x) & GPIO_bit(x)) #define HINGE_STABLE_COUNT 2 static int sharpsl_hinge_state; static int hinge_count; @@ -236,7 +239,6 @@ static void corgikbd_hinge_timer(unsigned long data) unsigned long flags; gprr = read_scoop_reg(&corgiscoop_device.dev, SCOOP_GPRR) & (CORGI_SCP_SWA | CORGI_SCP_SWB); - gprr |= (READ_GPIO_BIT(CORGI_GPIO_AK_INT) != 0); if (gprr != sharpsl_hinge_state) { hinge_count = 0; sharpsl_hinge_state = gprr; @@ -245,40 +247,29 @@ static void corgikbd_hinge_timer(unsigned long data) if (hinge_count >= HINGE_STABLE_COUNT) { spin_lock_irqsave(&corgikbd_data->lock, flags); - input_report_switch(corgikbd_data->input, SW_LID, ((sharpsl_hinge_state & CORGI_SCP_SWA) != 0)); - input_report_switch(corgikbd_data->input, SW_TABLET_MODE, ((sharpsl_hinge_state & CORGI_SCP_SWB) != 0)); - input_report_switch(corgikbd_data->input, SW_HEADPHONE_INSERT, (READ_GPIO_BIT(CORGI_GPIO_AK_INT) != 0)); + input_report_switch(corgikbd_data->input, SW_0, ((sharpsl_hinge_state & CORGI_SCP_SWA) != 0)); + input_report_switch(corgikbd_data->input, SW_1, ((sharpsl_hinge_state & CORGI_SCP_SWB) != 0)); input_sync(corgikbd_data->input); spin_unlock_irqrestore(&corgikbd_data->lock, flags); } } - mod_timer(&corgikbd_data->htimer, jiffies + msecs_to_jiffies(HINGE_SCAN_INTERVAL)); + mod_timer(&corgikbd_data->htimer, jiffies + HINGE_SCAN_INTERVAL); } #ifdef CONFIG_PM static int corgikbd_suspend(struct platform_device *dev, pm_message_t state) { - int i; struct corgikbd *corgikbd = platform_get_drvdata(dev); - corgikbd->suspended = 1; - /* strobe 0 is the power key so this can't be made an input for - powersaving therefore i = 1 */ - for (i = 1; i < CORGI_KEY_STROBE_NUM; i++) - pxa_gpio_mode(CORGI_GPIO_KEY_STROBE(i) | GPIO_IN); return 0; } static int corgikbd_resume(struct platform_device *dev) { - int i; struct corgikbd *corgikbd = platform_get_drvdata(dev); - for (i = 1; i < CORGI_KEY_STROBE_NUM; i++) - pxa_gpio_mode(CORGI_GPIO_KEY_STROBE(i) | GPIO_OUT | GPIO_DFLT_HIGH); - /* Upon resume, ignore the suspend key for a short while */ corgikbd->suspend_jiffies=jiffies; corgikbd->suspended = 0; @@ -340,19 +331,18 @@ static int __init corgikbd_probe(struct platform_device *pdev) for (i = 0; i < ARRAY_SIZE(corgikbd_keycode); i++) set_bit(corgikbd->keycode[i], input_dev->keybit); clear_bit(0, input_dev->keybit); - set_bit(SW_LID, input_dev->swbit); - set_bit(SW_TABLET_MODE, input_dev->swbit); - set_bit(SW_HEADPHONE_INSERT, input_dev->swbit); + set_bit(SW_0, input_dev->swbit); + set_bit(SW_1, input_dev->swbit); input_register_device(corgikbd->input); - mod_timer(&corgikbd->htimer, jiffies + msecs_to_jiffies(HINGE_SCAN_INTERVAL)); + mod_timer(&corgikbd->htimer, jiffies + HINGE_SCAN_INTERVAL); /* Setup sense interrupts - RisingEdge Detect, sense lines as inputs */ for (i = 0; i < CORGI_KEY_SENSE_NUM; i++) { pxa_gpio_mode(CORGI_GPIO_KEY_SENSE(i) | GPIO_IN); if (request_irq(CORGI_IRQ_GPIO_KEY_SENSE(i), corgikbd_interrupt, - IRQF_DISABLED | IRQF_TRIGGER_RISING, + SA_INTERRUPT | SA_TRIGGER_RISING, "corgikbd", corgikbd)) printk(KERN_WARNING "corgikbd: Can't get IRQ: %d!\n", i); } @@ -361,9 +351,6 @@ static int __init corgikbd_probe(struct platform_device *pdev) for (i = 0; i < CORGI_KEY_STROBE_NUM; i++) pxa_gpio_mode(CORGI_GPIO_KEY_STROBE(i) | GPIO_OUT | GPIO_DFLT_HIGH); - /* Setup the headphone jack as an input */ - pxa_gpio_mode(CORGI_GPIO_AK_INT | GPIO_IN); - return 0; } diff --git a/drivers/input/keyboard/hil_kbd.c b/drivers/input/keyboard/hil_kbd.c index 2e4abdc26..0a90962c3 100644 --- a/drivers/input/keyboard/hil_kbd.c +++ b/drivers/input/keyboard/hil_kbd.c @@ -66,7 +66,7 @@ static unsigned int hil_kbd_set3[HIL_KEYCODES_SET3_TBLSIZE] = static char hil_language[][16] = { HIL_LOCALE_MAP }; struct hil_kbd { - struct input_dev *dev; + struct input_dev dev; struct serio *serio; /* Input buffer and index for packets from HIL bus. */ @@ -86,7 +86,7 @@ struct hil_kbd { /* Process a complete packet after transfer from the HIL */ static void hil_kbd_process_record(struct hil_kbd *kbd) { - struct input_dev *dev = kbd->dev; + struct input_dev *dev = &kbd->dev; hil_packet *data = kbd->data; hil_packet p; int idx, i, cnt; @@ -240,8 +240,8 @@ static void hil_kbd_disconnect(struct serio *serio) return; } + input_unregister_device(&kbd->dev); serio_close(serio); - input_unregister_device(kbd->dev); kfree(kbd); } @@ -250,22 +250,17 @@ static int hil_kbd_connect(struct serio *serio, struct serio_driver *drv) struct hil_kbd *kbd; uint8_t did, *idd; int i; - - kbd = kzalloc(sizeof(*kbd), GFP_KERNEL); + + kbd = kmalloc(sizeof(*kbd), GFP_KERNEL); if (!kbd) return -ENOMEM; + memset(kbd, 0, sizeof(struct hil_kbd)); - kbd->dev = input_allocate_device(); - if (!kbd->dev) - goto bail0; - - kbd->dev->private = kbd; - - if (serio_open(serio, drv)) - goto bail1; + if (serio_open(serio, drv)) goto bail0; serio_set_drvdata(serio, kbd); kbd->serio = serio; + kbd->dev.private = kbd; init_MUTEX_LOCKED(&(kbd->sem)); @@ -307,38 +302,38 @@ static int hil_kbd_connect(struct serio *serio, struct serio_driver *drv) did, hil_language[did & HIL_IDD_DID_TYPE_KB_LANG_MASK]); break; default: - goto bail2; + goto bail1; } if(HIL_IDD_NUM_BUTTONS(idd) || HIL_IDD_NUM_AXES_PER_SET(*idd)) { printk(KERN_INFO PREFIX "keyboards only, no combo devices supported.\n"); - goto bail2; + goto bail1; } - kbd->dev->evbit[0] = BIT(EV_KEY) | BIT(EV_REP); - kbd->dev->ledbit[0] = BIT(LED_NUML) | BIT(LED_CAPSL) | BIT(LED_SCROLLL); - kbd->dev->keycodemax = HIL_KEYCODES_SET1_TBLSIZE; - kbd->dev->keycodesize = sizeof(hil_kbd_set1[0]); - kbd->dev->keycode = hil_kbd_set1; - kbd->dev->name = strlen(kbd->rnm) ? kbd->rnm : HIL_GENERIC_NAME; - kbd->dev->phys = "hpkbd/input0"; /* XXX */ + kbd->dev.evbit[0] = BIT(EV_KEY) | BIT(EV_REP); + kbd->dev.ledbit[0] = BIT(LED_NUML) | BIT(LED_CAPSL) | BIT(LED_SCROLLL); + kbd->dev.keycodemax = HIL_KEYCODES_SET1_TBLSIZE; + kbd->dev.keycodesize = sizeof(hil_kbd_set1[0]); + kbd->dev.keycode = hil_kbd_set1; + kbd->dev.name = strlen(kbd->rnm) ? kbd->rnm : HIL_GENERIC_NAME; + kbd->dev.phys = "hpkbd/input0"; /* XXX */ - kbd->dev->id.bustype = BUS_HIL; - kbd->dev->id.vendor = PCI_VENDOR_ID_HP; - kbd->dev->id.product = 0x0001; /* TODO: get from kbd->rsc */ - kbd->dev->id.version = 0x0100; /* TODO: get from kbd->rsc */ - kbd->dev->dev = &serio->dev; + kbd->dev.id.bustype = BUS_HIL; + kbd->dev.id.vendor = PCI_VENDOR_ID_HP; + kbd->dev.id.product = 0x0001; /* TODO: get from kbd->rsc */ + kbd->dev.id.version = 0x0100; /* TODO: get from kbd->rsc */ + kbd->dev.dev = &serio->dev; for (i = 0; i < 128; i++) { - set_bit(hil_kbd_set1[i], kbd->dev->keybit); - set_bit(hil_kbd_set3[i], kbd->dev->keybit); + set_bit(hil_kbd_set1[i], kbd->dev.keybit); + set_bit(hil_kbd_set3[i], kbd->dev.keybit); } - clear_bit(0, kbd->dev->keybit); + clear_bit(0, kbd->dev.keybit); - input_register_device(kbd->dev); + input_register_device(&kbd->dev); printk(KERN_INFO "input: %s, ID: %d\n", - kbd->dev->name, did); + kbd->dev.name, did); serio->write(serio, 0); serio->write(serio, 0); @@ -348,13 +343,11 @@ static int hil_kbd_connect(struct serio *serio, struct serio_driver *drv) up(&(kbd->sem)); return 0; - bail2: - serio_close(serio); - serio_set_drvdata(serio, NULL); bail1: - input_free_device(kbd->dev); + serio_close(serio); bail0: kfree(kbd); + serio_set_drvdata(serio, NULL); return -EIO; } diff --git a/drivers/input/keyboard/hilkbd.c b/drivers/input/keyboard/hilkbd.c index d22c7c624..e95bc052e 100644 --- a/drivers/input/keyboard/hilkbd.c +++ b/drivers/input/keyboard/hilkbd.c @@ -3,7 +3,7 @@ * * Copyright (C) 1998 Philip Blundell * Copyright (C) 1999 Matthew Wilcox - * Copyright (C) 1999-2006 Helge Deller + * Copyright (C) 1999-2003 Helge Deller * * Very basic HP Human Interface Loop (HIL) driver. * This driver handles the keyboard on HP300 (m68k) and on some @@ -18,6 +18,7 @@ #include #include #include +#include #include #include #include @@ -89,7 +90,7 @@ static unsigned int hphilkeyb_keycode[HIL_KEYCODES_SET1_TBLSIZE] = /* HIL structure */ static struct { - struct input_dev *dev; + struct input_dev dev; unsigned int curdev; @@ -116,7 +117,7 @@ static void poll_finished(void) down = (hil_dev.data[1] & 1) == 0; scode = hil_dev.data[1] >> 1; key = hphilkeyb_keycode[scode]; - input_report_key(hil_dev.dev, key, down); + input_report_key(&hil_dev.dev, key, down); break; } hil_dev.curdev = 0; @@ -206,14 +207,9 @@ hil_keyb_init(void) unsigned int i, kbid; wait_queue_head_t hil_wait; - if (hil_dev.dev) { + if (hil_dev.dev.id.bustype) { return -ENODEV; /* already initialized */ } - - hil_dev.dev = input_allocate_device(); - if (!hil_dev.dev) - return -ENOMEM; - hil_dev.dev->private = &hil_dev; #if defined(CONFIG_HP300) if (!hwreg_present((void *)(HILBASE + HIL_DATA))) @@ -251,26 +247,28 @@ hil_keyb_init(void) c = 0; hil_do(HIL_WRITEKBDSADR, &c, 1); + init_input_dev(&hil_dev.dev); + for (i = 0; i < HIL_KEYCODES_SET1_TBLSIZE; i++) if (hphilkeyb_keycode[i] != KEY_RESERVED) - set_bit(hphilkeyb_keycode[i], hil_dev.dev->keybit); - - hil_dev.dev->evbit[0] = BIT(EV_KEY) | BIT(EV_REP); - hil_dev.dev->ledbit[0] = BIT(LED_NUML) | BIT(LED_CAPSL) | BIT(LED_SCROLLL); - hil_dev.dev->keycodemax = HIL_KEYCODES_SET1_TBLSIZE; - hil_dev.dev->keycodesize = sizeof(hphilkeyb_keycode[0]); - hil_dev.dev->keycode = hphilkeyb_keycode; - hil_dev.dev->name = "HIL keyboard"; - hil_dev.dev->phys = "hpkbd/input0"; - - hil_dev.dev->id.bustype = BUS_HIL; - hil_dev.dev->id.vendor = PCI_VENDOR_ID_HP; - hil_dev.dev->id.product = 0x0001; - hil_dev.dev->id.version = 0x0010; - - input_register_device(hil_dev.dev); + set_bit(hphilkeyb_keycode[i], hil_dev.dev.keybit); + + hil_dev.dev.evbit[0] = BIT(EV_KEY) | BIT(EV_REP); + hil_dev.dev.ledbit[0] = BIT(LED_NUML) | BIT(LED_CAPSL) | BIT(LED_SCROLLL); + hil_dev.dev.keycodemax = HIL_KEYCODES_SET1_TBLSIZE; + hil_dev.dev.keycodesize = sizeof(hphilkeyb_keycode[0]); + hil_dev.dev.keycode = hphilkeyb_keycode; + hil_dev.dev.name = "HIL keyboard"; + hil_dev.dev.phys = "hpkbd/input0"; + + hil_dev.dev.id.bustype = BUS_HIL; + hil_dev.dev.id.vendor = PCI_VENDOR_ID_HP; + hil_dev.dev.id.product = 0x0001; + hil_dev.dev.id.version = 0x0010; + + input_register_device(&hil_dev.dev); printk(KERN_INFO "input: %s, ID %d at 0x%08lx (irq %d) found and attached\n", - hil_dev.dev->name, kbid, HILBASE, HIL_IRQ); + hil_dev.dev.name, kbid, HILBASE, HIL_IRQ); return 0; } @@ -331,9 +329,7 @@ static void __exit hil_exit(void) /* Turn off interrupts */ hil_do(HIL_INTOFF, NULL, 0); - input_unregister_device(hil_dev.dev); - - hil_dev.dev = NULL; + input_unregister_device(&hil_dev.dev); #if defined(CONFIG_PARISC) unregister_parisc_driver(&hil_driver); diff --git a/drivers/input/keyboard/lkkbd.c b/drivers/input/keyboard/lkkbd.c index 5174224ca..77c4d9669 100644 --- a/drivers/input/keyboard/lkkbd.c +++ b/drivers/input/keyboard/lkkbd.c @@ -384,21 +384,18 @@ lkkbd_detection_done (struct lkkbd *lk) */ switch (lk->id[4]) { case 1: - strlcpy (lk->name, "DEC LK201 keyboard", - sizeof (lk->name)); + sprintf (lk->name, "DEC LK201 keyboard"); if (lk201_compose_is_alt) lk->keycode[0xb1] = KEY_LEFTALT; break; case 2: - strlcpy (lk->name, "DEC LK401 keyboard", - sizeof (lk->name)); + sprintf (lk->name, "DEC LK401 keyboard"); break; default: - strlcpy (lk->name, "Unknown DEC keyboard", - sizeof (lk->name)); + sprintf (lk->name, "Unknown DEC keyboard"); printk (KERN_ERR "lkkbd: keyboard on %s is unknown, " "please report to Jan-Benedict Glaw " "\n", lk->phys); diff --git a/drivers/input/keyboard/locomokbd.c b/drivers/input/keyboard/locomokbd.c index 83906f80b..2c5108818 100644 --- a/drivers/input/keyboard/locomokbd.c +++ b/drivers/input/keyboard/locomokbd.c @@ -25,6 +25,7 @@ * */ +#include #include #include #include diff --git a/drivers/input/keyboard/newtonkbd.c b/drivers/input/keyboard/newtonkbd.c index 40a3f5512..d10983c52 100644 --- a/drivers/input/keyboard/newtonkbd.c +++ b/drivers/input/keyboard/newtonkbd.c @@ -96,7 +96,7 @@ static int nkbd_connect(struct serio *serio, struct serio_driver *drv) nkbd->serio = serio; nkbd->dev = input_dev; - snprintf(nkbd->phys, sizeof(nkbd->phys), "%s/input0", serio->phys); + sprintf(nkbd->phys, "%s/input0", serio->phys); memcpy(nkbd->keycode, nkbd_keycode, sizeof(nkbd->keycode)); input_dev->name = "Newton Keyboard"; diff --git a/drivers/input/keyboard/spitzkbd.c b/drivers/input/keyboard/spitzkbd.c index e38571023..83999d583 100644 --- a/drivers/input/keyboard/spitzkbd.c +++ b/drivers/input/keyboard/spitzkbd.c @@ -30,7 +30,6 @@ #define SCANCODE(r,c) (((r)<<4) + (c) + 1) #define NR_SCANCODES ((KB_ROWS<<4) + 1) -#define SCAN_INTERVAL (50) /* ms */ #define HINGE_SCAN_INTERVAL (150) /* ms */ #define SPITZ_KEY_CALENDER KEY_F1 @@ -53,8 +52,8 @@ static unsigned char spitzkbd_keycode[NR_SCANCODES] = { KEY_LEFTCTRL, KEY_1, KEY_3, KEY_5, KEY_6, KEY_7, KEY_9, KEY_0, KEY_BACKSPACE, SPITZ_KEY_EXOK, SPITZ_KEY_EXCANCEL, 0, 0, 0, 0, 0, /* 1-16 */ 0, KEY_2, KEY_4, KEY_R, KEY_Y, KEY_8, KEY_I, KEY_O, KEY_P, SPITZ_KEY_EXJOGDOWN, SPITZ_KEY_EXJOGUP, 0, 0, 0, 0, 0, /* 17-32 */ KEY_TAB, KEY_Q, KEY_E, KEY_T, KEY_G, KEY_U, KEY_J, KEY_K, 0, 0, 0, 0, 0, 0, 0, 0, /* 33-48 */ - SPITZ_KEY_ADDRESS, KEY_W, KEY_S, KEY_F, KEY_V, KEY_H, KEY_M, KEY_L, 0, KEY_RIGHTSHIFT, 0, 0, 0, 0, 0, 0, /* 49-64 */ - SPITZ_KEY_CALENDER, KEY_A, KEY_D, KEY_C, KEY_B, KEY_N, KEY_DOT, 0, KEY_ENTER, KEY_LEFTSHIFT, 0, 0, 0, 0, 0, 0, /* 65-80 */ + SPITZ_KEY_CALENDER, KEY_W, KEY_S, KEY_F, KEY_V, KEY_H, KEY_M, KEY_L, 0, KEY_RIGHTSHIFT, 0, 0, 0, 0, 0, 0, /* 49-64 */ + SPITZ_KEY_ADDRESS, KEY_A, KEY_D, KEY_C, KEY_B, KEY_N, KEY_DOT, 0, KEY_ENTER, KEY_LEFTSHIFT, 0, 0, 0, 0, 0, 0, /* 65-80 */ SPITZ_KEY_MAIL, KEY_Z, KEY_X, KEY_MINUS, KEY_SPACE, KEY_COMMA, 0, KEY_UP, 0, 0, SPITZ_KEY_FN, 0, 0, 0, 0, 0, /* 81-96 */ KEY_SYSRQ, SPITZ_KEY_JAP1, SPITZ_KEY_JAP2, SPITZ_KEY_CANCEL, SPITZ_KEY_OK, SPITZ_KEY_MENU, KEY_LEFT, KEY_DOWN, KEY_RIGHT, 0, 0, 0, 0, 0, 0, 0 /* 97-112 */ }; @@ -231,7 +230,7 @@ static void spitzkbd_scankeyboard(struct spitzkbd *spitzkbd_data, struct pt_regs /* if any keys are pressed, enable the timer */ if (num_pressed) - mod_timer(&spitzkbd_data->timer, jiffies + msecs_to_jiffies(SCAN_INTERVAL)); + mod_timer(&spitzkbd_data->timer, jiffies + msecs_to_jiffies(100)); spin_unlock_irqrestore(&spitzkbd_data->lock, flags); } @@ -288,7 +287,6 @@ static void spitzkbd_hinge_timer(unsigned long data) unsigned long flags; state = GPLR(SPITZ_GPIO_SWA) & (GPIO_bit(SPITZ_GPIO_SWA)|GPIO_bit(SPITZ_GPIO_SWB)); - state |= (GPLR(SPITZ_GPIO_AK_INT) & GPIO_bit(SPITZ_GPIO_AK_INT)); if (state != sharpsl_hinge_state) { hinge_count = 0; sharpsl_hinge_state = state; @@ -299,9 +297,8 @@ static void spitzkbd_hinge_timer(unsigned long data) if (hinge_count >= HINGE_STABLE_COUNT) { spin_lock_irqsave(&spitzkbd_data->lock, flags); - input_report_switch(spitzkbd_data->input, SW_LID, ((GPLR(SPITZ_GPIO_SWA) & GPIO_bit(SPITZ_GPIO_SWA)) != 0)); - input_report_switch(spitzkbd_data->input, SW_TABLET_MODE, ((GPLR(SPITZ_GPIO_SWB) & GPIO_bit(SPITZ_GPIO_SWB)) != 0)); - input_report_switch(spitzkbd_data->input, SW_HEADPHONE_INSERT, ((GPLR(SPITZ_GPIO_AK_INT) & GPIO_bit(SPITZ_GPIO_AK_INT)) != 0)); + input_report_switch(spitzkbd_data->input, SW_0, ((GPLR(SPITZ_GPIO_SWA) & GPIO_bit(SPITZ_GPIO_SWA)) != 0)); + input_report_switch(spitzkbd_data->input, SW_1, ((GPLR(SPITZ_GPIO_SWB) & GPIO_bit(SPITZ_GPIO_SWB)) != 0)); input_sync(spitzkbd_data->input); spin_unlock_irqrestore(&spitzkbd_data->lock, flags); @@ -398,9 +395,8 @@ static int __init spitzkbd_probe(struct platform_device *dev) for (i = 0; i < ARRAY_SIZE(spitzkbd_keycode); i++) set_bit(spitzkbd->keycode[i], input_dev->keybit); clear_bit(0, input_dev->keybit); - set_bit(SW_LID, input_dev->swbit); - set_bit(SW_TABLET_MODE, input_dev->swbit); - set_bit(SW_HEADPHONE_INSERT, input_dev->swbit); + set_bit(SW_0, input_dev->swbit); + set_bit(SW_1, input_dev->swbit); input_register_device(input_dev); @@ -410,7 +406,7 @@ static int __init spitzkbd_probe(struct platform_device *dev) for (i = 0; i < SPITZ_KEY_SENSE_NUM; i++) { pxa_gpio_mode(spitz_senses[i] | GPIO_IN); if (request_irq(IRQ_GPIO(spitz_senses[i]), spitzkbd_interrupt, - IRQF_DISABLED|IRQF_TRIGGER_RISING, + SA_INTERRUPT|SA_TRIGGER_RISING, "Spitzkbd Sense", spitzkbd)) printk(KERN_WARNING "spitzkbd: Can't get Sense IRQ: %d!\n", i); } @@ -425,20 +421,17 @@ static int __init spitzkbd_probe(struct platform_device *dev) pxa_gpio_mode(SPITZ_GPIO_SWB | GPIO_IN); request_irq(SPITZ_IRQ_GPIO_SYNC, spitzkbd_interrupt, - IRQF_DISABLED | IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, + SA_INTERRUPT | SA_TRIGGER_RISING | SA_TRIGGER_FALLING, "Spitzkbd Sync", spitzkbd); request_irq(SPITZ_IRQ_GPIO_ON_KEY, spitzkbd_interrupt, - IRQF_DISABLED | IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, + SA_INTERRUPT | SA_TRIGGER_RISING | SA_TRIGGER_FALLING, "Spitzkbd PwrOn", spitzkbd); request_irq(SPITZ_IRQ_GPIO_SWA, spitzkbd_hinge_isr, - IRQF_DISABLED | IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, + SA_INTERRUPT | SA_TRIGGER_RISING | SA_TRIGGER_FALLING, "Spitzkbd SWA", spitzkbd); request_irq(SPITZ_IRQ_GPIO_SWB, spitzkbd_hinge_isr, - IRQF_DISABLED | IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, + SA_INTERRUPT | SA_TRIGGER_RISING | SA_TRIGGER_FALLING, "Spitzkbd SWB", spitzkbd); - request_irq(SPITZ_IRQ_GPIO_AK_INT, spitzkbd_hinge_isr, - IRQF_DISABLED | IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, - "Spitzkbd HP", spitzkbd); printk(KERN_INFO "input: Spitz Keyboard Registered\n"); @@ -457,7 +450,6 @@ static int spitzkbd_remove(struct platform_device *dev) free_irq(SPITZ_IRQ_GPIO_ON_KEY, spitzkbd); free_irq(SPITZ_IRQ_GPIO_SWA, spitzkbd); free_irq(SPITZ_IRQ_GPIO_SWB, spitzkbd); - free_irq(SPITZ_IRQ_GPIO_AK_INT, spitzkbd); del_timer_sync(&spitzkbd->htimer); del_timer_sync(&spitzkbd->timer); diff --git a/drivers/input/keyboard/sunkbd.c b/drivers/input/keyboard/sunkbd.c index 9dbd7b856..84c00a53f 100644 --- a/drivers/input/keyboard/sunkbd.c +++ b/drivers/input/keyboard/sunkbd.c @@ -226,7 +226,7 @@ static void sunkbd_reinit(void *data) static void sunkbd_enable(struct sunkbd *sunkbd, int enable) { serio_pause_rx(sunkbd->serio); - sunkbd->enabled = 1; + sunkbd->enabled = enable; serio_continue_rx(sunkbd->serio); } @@ -263,7 +263,7 @@ static int sunkbd_connect(struct serio *serio, struct serio_driver *drv) goto fail; } - snprintf(sunkbd->name, sizeof(sunkbd->name), "Sun Type %d keyboard", sunkbd->type); + sprintf(sunkbd->name, "Sun Type %d keyboard", sunkbd->type); memcpy(sunkbd->keycode, sunkbd_keycode, sizeof(sunkbd->keycode)); input_dev->name = sunkbd->name; diff --git a/drivers/input/keyboard/xtkbd.c b/drivers/input/keyboard/xtkbd.c index 0821d53cf..4135e3e16 100644 --- a/drivers/input/keyboard/xtkbd.c +++ b/drivers/input/keyboard/xtkbd.c @@ -100,7 +100,7 @@ static int xtkbd_connect(struct serio *serio, struct serio_driver *drv) xtkbd->serio = serio; xtkbd->dev = input_dev; - snprintf(xtkbd->phys, sizeof(xtkbd->phys), "%s/input0", serio->phys); + sprintf(xtkbd->phys, "%s/input0", serio->phys); memcpy(xtkbd->keycode, xtkbd_keycode, sizeof(xtkbd->keycode)); input_dev->name = "XT Keyboard"; diff --git a/drivers/input/misc/Kconfig b/drivers/input/misc/Kconfig index a6dfc7455..4bad588d0 100644 --- a/drivers/input/misc/Kconfig +++ b/drivers/input/misc/Kconfig @@ -26,7 +26,7 @@ config INPUT_PCSPKR config INPUT_SPARCSPKR tristate "SPARC Speaker support" - depends on PCI && SPARC64 + depends on PCI && SPARC help Say Y here if you want the standard Speaker on Sparc PCI systems to be used for bells and whistles. diff --git a/drivers/input/misc/ixp4xx-beeper.c b/drivers/input/misc/ixp4xx-beeper.c index 805b636e7..3a6ae85cd 100644 --- a/drivers/input/misc/ixp4xx-beeper.c +++ b/drivers/input/misc/ixp4xx-beeper.c @@ -113,7 +113,7 @@ static int __devinit ixp4xx_spkr_probe(struct platform_device *dev) input_dev->event = ixp4xx_spkr_event; err = request_irq(IRQ_IXP4XX_TIMER2, &ixp4xx_spkr_interrupt, - IRQF_DISABLED | IRQF_TIMER, "ixp4xx-beeper", (void *) dev->id); + SA_INTERRUPT | SA_TIMER, "ixp4xx-beeper", (void *) dev->id); if (err) goto err_free_device; diff --git a/drivers/input/misc/pcspkr.c b/drivers/input/misc/pcspkr.c index afd322185..1ef477f44 100644 --- a/drivers/input/misc/pcspkr.c +++ b/drivers/input/misc/pcspkr.c @@ -24,6 +24,7 @@ MODULE_AUTHOR("Vojtech Pavlik "); MODULE_DESCRIPTION("PC Speaker beeper driver"); MODULE_LICENSE("GPL"); +static struct platform_device *pcspkr_platform_device; static DEFINE_SPINLOCK(i8253_beep_lock); static int pcspkr_event(struct input_dev *dev, unsigned int type, unsigned int code, int value) @@ -134,11 +135,35 @@ static struct platform_driver pcspkr_platform_driver = { static int __init pcspkr_init(void) { - return platform_driver_register(&pcspkr_platform_driver); + int err; + + err = platform_driver_register(&pcspkr_platform_driver); + if (err) + return err; + + pcspkr_platform_device = platform_device_alloc("pcspkr", -1); + if (!pcspkr_platform_device) { + err = -ENOMEM; + goto err_unregister_driver; + } + + err = platform_device_add(pcspkr_platform_device); + if (err) + goto err_free_device; + + return 0; + + err_free_device: + platform_device_put(pcspkr_platform_device); + err_unregister_driver: + platform_driver_unregister(&pcspkr_platform_driver); + + return err; } static void __exit pcspkr_exit(void) { + platform_device_unregister(pcspkr_platform_device); platform_driver_unregister(&pcspkr_platform_driver); } diff --git a/drivers/input/misc/sparcspkr.c b/drivers/input/misc/sparcspkr.c index 106c94f33..f0fd2c474 100644 --- a/drivers/input/misc/sparcspkr.c +++ b/drivers/input/misc/sparcspkr.c @@ -2,8 +2,9 @@ * Driver for PC-speaker like devices found on various Sparc systems. * * Copyright (c) 2002 Vojtech Pavlik - * Copyright (c) 2002, 2006 David S. Miller (davem@davemloft.net) + * Copyright (c) 2002 David S. Miller (davem@redhat.com) */ +#include #include #include #include @@ -12,23 +13,21 @@ #include #include +#ifdef CONFIG_SPARC64 #include +#endif -MODULE_AUTHOR("David S. Miller "); +MODULE_AUTHOR("David S. Miller "); MODULE_DESCRIPTION("Sparc Speaker beeper driver"); MODULE_LICENSE("GPL"); -struct sparcspkr_state { - const char *name; - unsigned long iobase; - int (*event)(struct input_dev *dev, unsigned int type, unsigned int code, int value); - spinlock_t lock; - struct input_dev *input_dev; -}; +const char *beep_name; +static unsigned long beep_iobase; +static int (*beep_event)(struct input_dev *dev, unsigned int type, unsigned int code, int value); +static DEFINE_SPINLOCK(beep_lock); static int ebus_spkr_event(struct input_dev *dev, unsigned int type, unsigned int code, int value) { - struct sparcspkr_state *state = dev_get_drvdata(dev->cdev.dev); unsigned int count = 0; unsigned long flags; @@ -44,24 +43,24 @@ static int ebus_spkr_event(struct input_dev *dev, unsigned int type, unsigned in if (value > 20 && value < 32767) count = 1193182 / value; - spin_lock_irqsave(&state->lock, flags); + spin_lock_irqsave(&beep_lock, flags); /* EBUS speaker only has on/off state, the frequency does not * appear to be programmable. */ - if (state->iobase & 0x2UL) - outb(!!count, state->iobase); + if (beep_iobase & 0x2UL) + outb(!!count, beep_iobase); else - outl(!!count, state->iobase); + outl(!!count, beep_iobase); - spin_unlock_irqrestore(&state->lock, flags); + spin_unlock_irqrestore(&beep_lock, flags); return 0; } +#ifdef CONFIG_SPARC64 static int isa_spkr_event(struct input_dev *dev, unsigned int type, unsigned int code, int value) { - struct sparcspkr_state *state = dev_get_drvdata(dev->cdev.dev); unsigned int count = 0; unsigned long flags; @@ -77,29 +76,29 @@ static int isa_spkr_event(struct input_dev *dev, unsigned int type, unsigned int if (value > 20 && value < 32767) count = 1193182 / value; - spin_lock_irqsave(&state->lock, flags); + spin_lock_irqsave(&beep_lock, flags); if (count) { /* enable counter 2 */ - outb(inb(state->iobase + 0x61) | 3, state->iobase + 0x61); + outb(inb(beep_iobase + 0x61) | 3, beep_iobase + 0x61); /* set command for counter 2, 2 byte write */ - outb(0xB6, state->iobase + 0x43); + outb(0xB6, beep_iobase + 0x43); /* select desired HZ */ - outb(count & 0xff, state->iobase + 0x42); - outb((count >> 8) & 0xff, state->iobase + 0x42); + outb(count & 0xff, beep_iobase + 0x42); + outb((count >> 8) & 0xff, beep_iobase + 0x42); } else { /* disable counter 2 */ - outb(inb_p(state->iobase + 0x61) & 0xFC, state->iobase + 0x61); + outb(inb_p(beep_iobase + 0x61) & 0xFC, beep_iobase + 0x61); } - spin_unlock_irqrestore(&state->lock, flags); + spin_unlock_irqrestore(&beep_lock, flags); return 0; } +#endif -static int __devinit sparcspkr_probe(struct device *dev) +static int __devinit sparcspkr_probe(struct platform_device *dev) { - struct sparcspkr_state *state = dev_get_drvdata(dev); struct input_dev *input_dev; int error; @@ -107,18 +106,18 @@ static int __devinit sparcspkr_probe(struct device *dev) if (!input_dev) return -ENOMEM; - input_dev->name = state->name; + input_dev->name = beep_name; input_dev->phys = "sparc/input0"; input_dev->id.bustype = BUS_ISA; input_dev->id.vendor = 0x001f; input_dev->id.product = 0x0001; input_dev->id.version = 0x0100; - input_dev->cdev.dev = dev; + input_dev->cdev.dev = &dev->dev; input_dev->evbit[0] = BIT(EV_SND); input_dev->sndbit[0] = BIT(SND_BELL) | BIT(SND_TONE); - input_dev->event = state->event; + input_dev->event = beep_event; error = input_register_device(input_dev); if (error) { @@ -126,137 +125,111 @@ static int __devinit sparcspkr_probe(struct device *dev) return error; } - state->input_dev = input_dev; + platform_set_drvdata(dev, input_dev); return 0; } -static int __devexit sparcspkr_remove(struct of_device *dev) +static int __devexit sparcspkr_remove(struct platform_device *dev) { - struct sparcspkr_state *state = dev_get_drvdata(&dev->dev); - struct input_dev *input_dev = state->input_dev; - - /* turn off the speaker */ - state->event(input_dev, EV_SND, SND_BELL, 0); + struct input_dev *input_dev = platform_get_drvdata(dev); input_unregister_device(input_dev); - - dev_set_drvdata(&dev->dev, NULL); - kfree(state); - - return 0; -} - -static int sparcspkr_shutdown(struct of_device *dev) -{ - struct sparcspkr_state *state = dev_get_drvdata(&dev->dev); - struct input_dev *input_dev = state->input_dev; - + platform_set_drvdata(dev, NULL); /* turn off the speaker */ - state->event(input_dev, EV_SND, SND_BELL, 0); + beep_event(NULL, EV_SND, SND_BELL, 0); return 0; } -static int __devinit ebus_beep_probe(struct of_device *dev, const struct of_device_id *match) +static void sparcspkr_shutdown(struct platform_device *dev) { - struct linux_ebus_device *edev = to_ebus_device(&dev->dev); - struct sparcspkr_state *state; - int err; - - state = kzalloc(sizeof(*state), GFP_KERNEL); - if (!state) - return -ENOMEM; - - state->name = "Sparc EBUS Speaker"; - state->iobase = edev->resource[0].start; - state->event = ebus_spkr_event; - spin_lock_init(&state->lock); - - dev_set_drvdata(&dev->dev, state); - - err = sparcspkr_probe(&dev->dev); - if (err) { - dev_set_drvdata(&dev->dev, NULL); - kfree(state); - } - - return 0; + /* turn off the speaker */ + beep_event(NULL, EV_SND, SND_BELL, 0); } -static struct of_device_id ebus_beep_match[] = { - { - .name = "beep", +static struct platform_driver sparcspkr_platform_driver = { + .driver = { + .name = "sparcspkr", + .owner = THIS_MODULE, }, - {}, -}; - -static struct of_platform_driver ebus_beep_driver = { - .name = "beep", - .match_table = ebus_beep_match, - .probe = ebus_beep_probe, - .remove = sparcspkr_remove, + .probe = sparcspkr_probe, + .remove = __devexit_p(sparcspkr_remove), .shutdown = sparcspkr_shutdown, }; -static int __devinit isa_beep_probe(struct of_device *dev, const struct of_device_id *match) -{ - struct sparc_isa_device *idev = to_isa_device(&dev->dev); - struct sparcspkr_state *state; - int err; +static struct platform_device *sparcspkr_platform_device; - state = kzalloc(sizeof(*state), GFP_KERNEL); - if (!state) - return -ENOMEM; - - state->name = "Sparc ISA Speaker"; - state->iobase = idev->resource.start; - state->event = isa_spkr_event; - spin_lock_init(&state->lock); +static int __init sparcspkr_drv_init(void) +{ + int error; - dev_set_drvdata(&dev->dev, state); + error = platform_driver_register(&sparcspkr_platform_driver); + if (error) + return error; - err = sparcspkr_probe(&dev->dev); - if (err) { - dev_set_drvdata(&dev->dev, NULL); - kfree(state); + sparcspkr_platform_device = platform_device_alloc("sparcspkr", -1); + if (!sparcspkr_platform_device) { + error = -ENOMEM; + goto err_unregister_driver; } + error = platform_device_add(sparcspkr_platform_device); + if (error) + goto err_free_device; + return 0; -} -static struct of_device_id isa_beep_match[] = { - { - .name = "dma", - }, - {}, -}; + err_free_device: + platform_device_put(sparcspkr_platform_device); + err_unregister_driver: + platform_driver_unregister(&sparcspkr_platform_driver); -static struct of_platform_driver isa_beep_driver = { - .name = "beep", - .match_table = isa_beep_match, - .probe = isa_beep_probe, - .remove = sparcspkr_remove, - .shutdown = sparcspkr_shutdown, -}; + return error; +} static int __init sparcspkr_init(void) { - int err = of_register_driver(&ebus_beep_driver, &ebus_bus_type); - - if (!err) { - err = of_register_driver(&isa_beep_driver, &isa_bus_type); - if (err) - of_unregister_driver(&ebus_beep_driver); + struct linux_ebus *ebus; + struct linux_ebus_device *edev; +#ifdef CONFIG_SPARC64 + struct sparc_isa_bridge *isa_br; + struct sparc_isa_device *isa_dev; +#endif + + for_each_ebus(ebus) { + for_each_ebusdev(edev, ebus) { + if (!strcmp(edev->prom_name, "beep")) { + beep_name = "Sparc EBUS Speaker"; + beep_event = ebus_spkr_event; + beep_iobase = edev->resource[0].start; + return sparcspkr_drv_init(); + } + } + } +#ifdef CONFIG_SPARC64 + for_each_isa(isa_br) { + for_each_isadev(isa_dev, isa_br) { + /* A hack, the beep device's base lives in + * the DMA isa node. + */ + if (!strcmp(isa_dev->prom_name, "dma")) { + beep_name = "Sparc ISA Speaker"; + beep_event = isa_spkr_event, + beep_iobase = isa_dev->resource.start; + return sparcspkr_drv_init(); + } + } } +#endif - return err; + return -ENODEV; } static void __exit sparcspkr_exit(void) { - of_unregister_driver(&ebus_beep_driver); - of_unregister_driver(&isa_beep_driver); + platform_device_unregister(sparcspkr_platform_device); + platform_driver_unregister(&sparcspkr_platform_driver); } module_init(sparcspkr_init); diff --git a/drivers/input/misc/uinput.c b/drivers/input/misc/uinput.c index d723e9ad7..546ed9b49 100644 --- a/drivers/input/misc/uinput.c +++ b/drivers/input/misc/uinput.c @@ -194,7 +194,7 @@ static int uinput_open(struct inode *inode, struct file *file) if (!newdev) return -ENOMEM; - mutex_init(&newdev->mutex); + init_MUTEX(&newdev->sem); spin_lock_init(&newdev->requests_lock); init_waitqueue_head(&newdev->requests_waitq); init_waitqueue_head(&newdev->waitq); @@ -340,7 +340,7 @@ static ssize_t uinput_write(struct file *file, const char __user *buffer, size_t struct uinput_device *udev = file->private_data; int retval; - retval = mutex_lock_interruptible(&udev->mutex); + retval = down_interruptible(&udev->sem); if (retval) return retval; @@ -348,7 +348,7 @@ static ssize_t uinput_write(struct file *file, const char __user *buffer, size_t uinput_inject_event(udev, buffer, count) : uinput_setup_device(udev, buffer, count); - mutex_unlock(&udev->mutex); + up(&udev->sem); return retval; } @@ -369,7 +369,7 @@ static ssize_t uinput_read(struct file *file, char __user *buffer, size_t count, if (retval) return retval; - retval = mutex_lock_interruptible(&udev->mutex); + retval = down_interruptible(&udev->sem); if (retval) return retval; @@ -388,7 +388,7 @@ static ssize_t uinput_read(struct file *file, char __user *buffer, size_t count, } out: - mutex_unlock(&udev->mutex); + up(&udev->sem); return retval; } @@ -439,7 +439,7 @@ static long uinput_ioctl(struct file *file, unsigned int cmd, unsigned long arg) udev = file->private_data; - retval = mutex_lock_interruptible(&udev->mutex); + retval = down_interruptible(&udev->sem); if (retval) return retval; @@ -589,7 +589,7 @@ static long uinput_ioctl(struct file *file, unsigned int cmd, unsigned long arg) } out: - mutex_unlock(&udev->mutex); + up(&udev->sem); return retval; } diff --git a/drivers/input/misc/wistron_btns.c b/drivers/input/misc/wistron_btns.c index de0f46dd9..4b415d9b0 100644 --- a/drivers/input/misc/wistron_btns.c +++ b/drivers/input/misc/wistron_btns.c @@ -94,7 +94,7 @@ static void call_bios(struct regs *regs) static ssize_t __init locate_wistron_bios(void __iomem *base) { - static unsigned char __initdata signature[] = + static const unsigned char __initdata signature[] = { 0x42, 0x21, 0x55, 0x30 }; ssize_t offset; @@ -273,27 +273,6 @@ static struct key_entry keymap_fs_amilo_pro_v2000[] = { { KE_END, 0 } }; -static struct key_entry keymap_fujitsu_n3510[] = { - { KE_KEY, 0x11, KEY_PROG1 }, - { KE_KEY, 0x12, KEY_PROG2 }, - { KE_KEY, 0x36, KEY_WWW }, - { KE_KEY, 0x31, KEY_MAIL }, - { KE_KEY, 0x71, KEY_STOPCD }, - { KE_KEY, 0x72, KEY_PLAYPAUSE }, - { KE_KEY, 0x74, KEY_REWIND }, - { KE_KEY, 0x78, KEY_FORWARD }, - { KE_END, 0 } -}; - -static struct key_entry keymap_wistron_ms2111[] = { - { KE_KEY, 0x11, KEY_PROG1 }, - { KE_KEY, 0x12, KEY_PROG2 }, - { KE_KEY, 0x13, KEY_PROG3 }, - { KE_KEY, 0x31, KEY_MAIL }, - { KE_KEY, 0x36, KEY_WWW }, - { KE_END, 0 } -}; - static struct key_entry keymap_wistron_ms2141[] = { { KE_KEY, 0x11, KEY_PROG1 }, { KE_KEY, 0x12, KEY_PROG2 }, @@ -327,23 +306,12 @@ static struct key_entry keymap_acer_travelmate_240[] = { { KE_END, 0 } }; -static struct key_entry keymap_aopen_1559as[] = { - { KE_KEY, 0x01, KEY_HELP }, - { KE_KEY, 0x06, KEY_PROG3 }, - { KE_KEY, 0x11, KEY_PROG1 }, - { KE_KEY, 0x12, KEY_PROG2 }, - { KE_WIFI, 0x30, 0 }, - { KE_KEY, 0x31, KEY_MAIL }, - { KE_KEY, 0x36, KEY_WWW }, - { KE_END, 0 }, -}; - /* * If your machine is not here (which is currently rather likely), please send * a list of buttons and their key codes (reported when loading this module * with force=1) and the output of dmidecode to $MODULE_AUTHOR. */ -static struct dmi_system_id dmi_ids[] __initdata = { +static struct dmi_system_id dmi_ids[] = { { .callback = dmi_matched, .ident = "Fujitsu-Siemens Amilo Pro V2000", @@ -353,24 +321,6 @@ static struct dmi_system_id dmi_ids[] __initdata = { }, .driver_data = keymap_fs_amilo_pro_v2000 }, - { - .callback = dmi_matched, - .ident = "Fujitsu-Siemens Amilo M7400", - .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), - DMI_MATCH(DMI_PRODUCT_NAME, "AMILO M "), - }, - .driver_data = keymap_fs_amilo_pro_v2000 - }, - { - .callback = dmi_matched, - .ident = "Fujitsu N3510", - .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), - DMI_MATCH(DMI_PRODUCT_NAME, "N3510"), - }, - .driver_data = keymap_fujitsu_n3510 - }, { .callback = dmi_matched, .ident = "Acer Aspire 1500", @@ -389,24 +339,6 @@ static struct dmi_system_id dmi_ids[] __initdata = { }, .driver_data = keymap_acer_travelmate_240 }, - { - .callback = dmi_matched, - .ident = "AOpen 1559AS", - .matches = { - DMI_MATCH(DMI_PRODUCT_NAME, "E2U"), - DMI_MATCH(DMI_BOARD_NAME, "E2U"), - }, - .driver_data = keymap_aopen_1559as - }, - { - .callback = dmi_matched, - .ident = "Medion MD 9783", - .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "MEDIONNB"), - DMI_MATCH(DMI_PRODUCT_NAME, "MD 9783"), - }, - .driver_data = keymap_wistron_ms2111 - }, { NULL, } }; diff --git a/drivers/input/mouse/alps.c b/drivers/input/mouse/alps.c index 070d75330..2141501e9 100644 --- a/drivers/input/mouse/alps.c +++ b/drivers/input/mouse/alps.c @@ -100,8 +100,8 @@ static void alps_process_packet(struct psmouse *psmouse, struct pt_regs *regs) } if (priv->i->flags & ALPS_OLDPROTO) { - left = packet[2] & 0x10; - right = packet[2] & 0x08; + left = packet[2] & 0x08; + right = packet[2] & 0x10; middle = 0; x = packet[1] | ((packet[0] & 0x07) << 7); y = packet[4] | ((packet[3] & 0x07) << 7); @@ -470,7 +470,7 @@ int alps_init(struct psmouse *psmouse) dev1->keybit[LONG(BTN_BACK)] |= BIT(BTN_BACK); } - snprintf(priv->phys, sizeof(priv->phys), "%s/input1", psmouse->ps2dev.serio->phys); + sprintf(priv->phys, "%s/input1", psmouse->ps2dev.serio->phys); dev2->phys = priv->phys; dev2->name = (priv->i->flags & ALPS_DUALPOINT) ? "DualPoint Stick" : "PS/2 Mouse"; dev2->id.bustype = BUS_I8042; diff --git a/drivers/input/mouse/hil_ptr.c b/drivers/input/mouse/hil_ptr.c index 69f02178c..c2bf2ed07 100644 --- a/drivers/input/mouse/hil_ptr.c +++ b/drivers/input/mouse/hil_ptr.c @@ -55,7 +55,7 @@ MODULE_LICENSE("Dual BSD/GPL"); #define HIL_PTR_MAX_LENGTH 16 struct hil_ptr { - struct input_dev *dev; + struct input_dev dev; struct serio *serio; /* Input buffer and index for packets from HIL bus. */ @@ -79,7 +79,7 @@ struct hil_ptr { /* Process a complete packet after transfer from the HIL */ static void hil_ptr_process_record(struct hil_ptr *ptr) { - struct input_dev *dev = ptr->dev; + struct input_dev *dev = &ptr->dev; hil_packet *data = ptr->data; hil_packet p; int idx, i, cnt, laxis; @@ -148,12 +148,12 @@ static void hil_ptr_process_record(struct hil_ptr *ptr) if (absdev) { val = lo + (hi<<8); #ifdef TABLET_AUTOADJUST - if (val < dev->absmin[ABS_X + i]) - dev->absmin[ABS_X + i] = val; - if (val > dev->absmax[ABS_X + i]) - dev->absmax[ABS_X + i] = val; + if (val < ptr->dev.absmin[ABS_X + i]) + ptr->dev.absmin[ABS_X + i] = val; + if (val > ptr->dev.absmax[ABS_X + i]) + ptr->dev.absmax[ABS_X + i] = val; #endif - if (i%3) val = dev->absmax[ABS_X + i] - val; + if (i%3) val = ptr->dev.absmax[ABS_X + i] - val; input_report_abs(dev, ABS_X + i, val); } else { val = (int) (((int8_t)lo) | ((int8_t)hi<<8)); @@ -233,32 +233,26 @@ static void hil_ptr_disconnect(struct serio *serio) return; } + input_unregister_device(&ptr->dev); serio_close(serio); - input_unregister_device(ptr->dev); kfree(ptr); } static int hil_ptr_connect(struct serio *serio, struct serio_driver *driver) { - struct hil_ptr *ptr; - char *txt; - unsigned int i, naxsets, btntype; - uint8_t did, *idd; + struct hil_ptr *ptr; + char *txt; + unsigned int i, naxsets, btntype; + uint8_t did, *idd; - if (!(ptr = kzalloc(sizeof(struct hil_ptr), GFP_KERNEL))) - return -ENOMEM; + if (!(ptr = kmalloc(sizeof(struct hil_ptr), GFP_KERNEL))) return -ENOMEM; + memset(ptr, 0, sizeof(struct hil_ptr)); - ptr->dev = input_allocate_device(); - if (!ptr->dev) - goto bail0; - - ptr->dev->private = ptr; - - if (serio_open(serio, driver)) - goto bail1; + if (serio_open(serio, driver)) goto bail0; serio_set_drvdata(serio, ptr); ptr->serio = serio; + ptr->dev.private = ptr; init_MUTEX_LOCKED(&(ptr->sem)); @@ -289,24 +283,25 @@ static int hil_ptr_connect(struct serio *serio, struct serio_driver *driver) up(&(ptr->sem)); + init_input_dev(&ptr->dev); did = ptr->idd[0]; idd = ptr->idd + 1; txt = "unknown"; if ((did & HIL_IDD_DID_TYPE_MASK) == HIL_IDD_DID_TYPE_REL) { - ptr->dev->evbit[0] = BIT(EV_REL); + ptr->dev.evbit[0] = BIT(EV_REL); txt = "relative"; } if ((did & HIL_IDD_DID_TYPE_MASK) == HIL_IDD_DID_TYPE_ABS) { - ptr->dev->evbit[0] = BIT(EV_ABS); + ptr->dev.evbit[0] = BIT(EV_ABS); txt = "absolute"; } - if (!ptr->dev->evbit[0]) { - goto bail2; + if (!ptr->dev.evbit[0]) { + goto bail1; } ptr->nbtn = HIL_IDD_NUM_BUTTONS(idd); - if (ptr->nbtn) ptr->dev->evbit[0] |= BIT(EV_KEY); + if (ptr->nbtn) ptr->dev.evbit[0] |= BIT(EV_KEY); naxsets = HIL_IDD_NUM_AXSETS(*idd); ptr->naxes = HIL_IDD_NUM_AXES_PER_SET(*idd); @@ -330,7 +325,7 @@ static int hil_ptr_connect(struct serio *serio, struct serio_driver *driver) btntype = BTN_MOUSE; for (i = 0; i < ptr->nbtn; i++) { - set_bit(btntype | i, ptr->dev->keybit); + set_bit(btntype | i, ptr->dev.keybit); ptr->btnmap[i] = btntype | i; } @@ -342,52 +337,50 @@ static int hil_ptr_connect(struct serio *serio, struct serio_driver *driver) if ((did & HIL_IDD_DID_TYPE_MASK) == HIL_IDD_DID_TYPE_REL) { for (i = 0; i < ptr->naxes; i++) { - set_bit(REL_X + i, ptr->dev->relbit); + set_bit(REL_X + i, ptr->dev.relbit); } for (i = 3; (i < ptr->naxes + 3) && (naxsets > 1); i++) { - set_bit(REL_X + i, ptr->dev->relbit); + set_bit(REL_X + i, ptr->dev.relbit); } } else { for (i = 0; i < ptr->naxes; i++) { - set_bit(ABS_X + i, ptr->dev->absbit); - ptr->dev->absmin[ABS_X + i] = 0; - ptr->dev->absmax[ABS_X + i] = + set_bit(ABS_X + i, ptr->dev.absbit); + ptr->dev.absmin[ABS_X + i] = 0; + ptr->dev.absmax[ABS_X + i] = HIL_IDD_AXIS_MAX((ptr->idd + 1), i); } for (i = 3; (i < ptr->naxes + 3) && (naxsets > 1); i++) { - set_bit(ABS_X + i, ptr->dev->absbit); - ptr->dev->absmin[ABS_X + i] = 0; - ptr->dev->absmax[ABS_X + i] = + set_bit(ABS_X + i, ptr->dev.absbit); + ptr->dev.absmin[ABS_X + i] = 0; + ptr->dev.absmax[ABS_X + i] = HIL_IDD_AXIS_MAX((ptr->idd + 1), (i - 3)); } #ifdef TABLET_AUTOADJUST for (i = 0; i < ABS_MAX; i++) { - int diff = ptr->dev->absmax[ABS_X + i] / 10; - ptr->dev->absmin[ABS_X + i] += diff; - ptr->dev->absmax[ABS_X + i] -= diff; + int diff = ptr->dev.absmax[ABS_X + i] / 10; + ptr->dev.absmin[ABS_X + i] += diff; + ptr->dev.absmax[ABS_X + i] -= diff; } #endif } - ptr->dev->name = strlen(ptr->rnm) ? ptr->rnm : HIL_GENERIC_NAME; + ptr->dev.name = strlen(ptr->rnm) ? ptr->rnm : HIL_GENERIC_NAME; - ptr->dev->id.bustype = BUS_HIL; - ptr->dev->id.vendor = PCI_VENDOR_ID_HP; - ptr->dev->id.product = 0x0001; /* TODO: get from ptr->rsc */ - ptr->dev->id.version = 0x0100; /* TODO: get from ptr->rsc */ - ptr->dev->dev = &serio->dev; + ptr->dev.id.bustype = BUS_HIL; + ptr->dev.id.vendor = PCI_VENDOR_ID_HP; + ptr->dev.id.product = 0x0001; /* TODO: get from ptr->rsc */ + ptr->dev.id.version = 0x0100; /* TODO: get from ptr->rsc */ + ptr->dev.dev = &serio->dev; - input_register_device(ptr->dev); + input_register_device(&ptr->dev); printk(KERN_INFO "input: %s (%s), ID: %d\n", - ptr->dev->name, + ptr->dev.name, (btntype == BTN_MOUSE) ? "HIL mouse":"HIL tablet or touchpad", did); return 0; - bail2: - serio_close(serio); bail1: - input_free_device(ptr->dev); + serio_close(serio); bail0: kfree(ptr); serio_set_drvdata(serio, NULL); diff --git a/drivers/input/mouse/inport.c b/drivers/input/mouse/inport.c index 50f1fed10..afc66f56d 100644 --- a/drivers/input/mouse/inport.c +++ b/drivers/input/mouse/inport.c @@ -36,6 +36,7 @@ #include #include +#include #include #include #include diff --git a/drivers/input/mouse/lifebook.c b/drivers/input/mouse/lifebook.c index c14395ba7..5ccc3ef3b 100644 --- a/drivers/input/mouse/lifebook.c +++ b/drivers/input/mouse/lifebook.c @@ -21,36 +21,12 @@ #include "lifebook.h" static struct dmi_system_id lifebook_dmi_table[] = { - { - .ident = "LifeBook B", - .matches = { - DMI_MATCH(DMI_PRODUCT_NAME, "LifeBook B Series"), - }, - }, { .ident = "Lifebook B", .matches = { DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK B Series"), }, }, - { - .ident = "Lifebook B213x/B2150", - .matches = { - DMI_MATCH(DMI_PRODUCT_NAME, "LifeBook B2131/B2133/B2150"), - }, - }, - { - .ident = "Zephyr", - .matches = { - DMI_MATCH(DMI_PRODUCT_NAME, "ZEPHYR"), - }, - }, - { - .ident = "CF-18", - .matches = { - DMI_MATCH(DMI_PRODUCT_NAME, "CF-18"), - }, - }, { .ident = "Lifebook B142", .matches = { diff --git a/drivers/input/mouse/psmouse-base.c b/drivers/input/mouse/psmouse-base.c index 07b060438..b2bed1acf 100644 --- a/drivers/input/mouse/psmouse-base.c +++ b/drivers/input/mouse/psmouse-base.c @@ -20,8 +20,6 @@ #include #include #include -#include - #include "psmouse.h" #include "synaptics.h" #include "logips2pp.h" @@ -100,13 +98,13 @@ __obsolete_setup("psmouse_resetafter="); __obsolete_setup("psmouse_rate="); /* - * psmouse_mutex protects all operations changing state of mouse + * psmouse_sem protects all operations changing state of mouse * (connecting, disconnecting, changing rate or resolution via * sysfs). We could use a per-device semaphore but since there * rarely more than one PS/2 mouse connected and since semaphore * is taken in "slow" paths it is not worth it. */ -static DEFINE_MUTEX(psmouse_mutex); +static DECLARE_MUTEX(psmouse_sem); static struct workqueue_struct *kpsmoused_wq; @@ -150,20 +148,9 @@ static psmouse_ret_t psmouse_process_byte(struct psmouse *psmouse, struct pt_reg */ if (psmouse->type == PSMOUSE_IMEX) { - switch (packet[3] & 0xC0) { - case 0x80: /* vertical scroll on IntelliMouse Explorer 4.0 */ - input_report_rel(dev, REL_WHEEL, (int) (packet[3] & 32) - (int) (packet[3] & 31)); - break; - case 0x40: /* horizontal scroll on IntelliMouse Explorer 4.0 */ - input_report_rel(dev, REL_HWHEEL, (int) (packet[3] & 32) - (int) (packet[3] & 31)); - break; - case 0x00: - case 0xC0: - input_report_rel(dev, REL_WHEEL, (int) (packet[3] & 8) - (int) (packet[3] & 7)); - input_report_key(dev, BTN_SIDE, (packet[3] >> 4) & 1); - input_report_key(dev, BTN_EXTRA, (packet[3] >> 5) & 1); - break; - } + input_report_rel(dev, REL_WHEEL, (int) (packet[3] & 8) - (int) (packet[3] & 7)); + input_report_key(dev, BTN_SIDE, (packet[3] >> 4) & 1); + input_report_key(dev, BTN_EXTRA, (packet[3] >> 5) & 1); } /* @@ -477,18 +464,9 @@ static int im_explorer_detect(struct psmouse *psmouse, int set_properties) if (param[0] != 4) return -1; -/* Magic to enable horizontal scrolling on IntelliMouse 4.0 */ - param[0] = 200; - ps2_command(ps2dev, param, PSMOUSE_CMD_SETRATE); - param[0] = 80; - ps2_command(ps2dev, param, PSMOUSE_CMD_SETRATE); - param[0] = 40; - ps2_command(ps2dev, param, PSMOUSE_CMD_SETRATE); - if (set_properties) { set_bit(BTN_MIDDLE, psmouse->dev->keybit); set_bit(REL_WHEEL, psmouse->dev->relbit); - set_bit(REL_HWHEEL, psmouse->dev->relbit); set_bit(BTN_SIDE, psmouse->dev->keybit); set_bit(BTN_EXTRA, psmouse->dev->keybit); @@ -892,7 +870,7 @@ static void psmouse_resync(void *p) int failed = 0, enabled = 0; int i; - mutex_lock(&psmouse_mutex); + down(&psmouse_sem); if (psmouse->state != PSMOUSE_RESYNCING) goto out; @@ -972,7 +950,7 @@ static void psmouse_resync(void *p) if (parent) psmouse_activate(parent); out: - mutex_unlock(&psmouse_mutex); + up(&psmouse_sem); } /* @@ -998,14 +976,14 @@ static void psmouse_disconnect(struct serio *serio) sysfs_remove_group(&serio->dev.kobj, &psmouse_attribute_group); - mutex_lock(&psmouse_mutex); + down(&psmouse_sem); psmouse_set_state(psmouse, PSMOUSE_CMD_MODE); /* make sure we don't have a resync in progress */ - mutex_unlock(&psmouse_mutex); + up(&psmouse_sem); flush_workqueue(kpsmoused_wq); - mutex_lock(&psmouse_mutex); + down(&psmouse_sem); if (serio->parent && serio->id.type == SERIO_PS_PSTHRU) { parent = serio_get_drvdata(serio->parent); @@ -1028,7 +1006,7 @@ static void psmouse_disconnect(struct serio *serio) if (parent) psmouse_activate(parent); - mutex_unlock(&psmouse_mutex); + up(&psmouse_sem); } static int psmouse_switch_protocol(struct psmouse *psmouse, struct psmouse_protocol *proto) @@ -1077,8 +1055,8 @@ static int psmouse_switch_protocol(struct psmouse *psmouse, struct psmouse_proto if (psmouse->resync_time && psmouse->poll(psmouse)) psmouse->resync_time = 0; - snprintf(psmouse->devname, sizeof(psmouse->devname), "%s %s %s", - psmouse_protocol_by_type(psmouse->type)->name, psmouse->vendor, psmouse->name); + sprintf(psmouse->devname, "%s %s %s", + psmouse_protocol_by_type(psmouse->type)->name, psmouse->vendor, psmouse->name); input_dev->name = psmouse->devname; input_dev->phys = psmouse->phys; @@ -1100,7 +1078,7 @@ static int psmouse_connect(struct serio *serio, struct serio_driver *drv) struct input_dev *input_dev; int retval = -ENOMEM; - mutex_lock(&psmouse_mutex); + down(&psmouse_sem); /* * If this is a pass-through port deactivate parent so the device @@ -1119,7 +1097,7 @@ static int psmouse_connect(struct serio *serio, struct serio_driver *drv) ps2_init(&psmouse->ps2dev, serio); INIT_WORK(&psmouse->resync_work, psmouse_resync, psmouse); psmouse->dev = input_dev; - snprintf(psmouse->phys, sizeof(psmouse->phys), "%s/input0", serio->phys); + sprintf(psmouse->phys, "%s/input0", serio->phys); psmouse_set_state(psmouse, PSMOUSE_INITIALIZING); @@ -1168,7 +1146,7 @@ out: if (parent) psmouse_activate(parent); - mutex_unlock(&psmouse_mutex); + up(&psmouse_sem); return retval; } @@ -1185,7 +1163,7 @@ static int psmouse_reconnect(struct serio *serio) return -1; } - mutex_lock(&psmouse_mutex); + down(&psmouse_sem); if (serio->parent && serio->id.type == SERIO_PS_PSTHRU) { parent = serio_get_drvdata(serio->parent); @@ -1219,7 +1197,7 @@ out: if (parent) psmouse_activate(parent); - mutex_unlock(&psmouse_mutex); + up(&psmouse_sem); return rc; } @@ -1297,7 +1275,7 @@ ssize_t psmouse_attr_set_helper(struct device *dev, struct device_attribute *dev goto out_unpin; } - retval = mutex_lock_interruptible(&psmouse_mutex); + retval = down_interruptible(&psmouse_sem); if (retval) goto out_unpin; @@ -1305,7 +1283,7 @@ ssize_t psmouse_attr_set_helper(struct device *dev, struct device_attribute *dev if (psmouse->state == PSMOUSE_IGNORE) { retval = -ENODEV; - goto out_unlock; + goto out_up; } if (serio->parent && serio->id.type == SERIO_PS_PSTHRU) { @@ -1323,8 +1301,8 @@ ssize_t psmouse_attr_set_helper(struct device *dev, struct device_attribute *dev if (parent) psmouse_activate(parent); - out_unlock: - mutex_unlock(&psmouse_mutex); + out_up: + up(&psmouse_sem); out_unpin: serio_unpin_driver(serio); return retval; @@ -1332,22 +1310,20 @@ ssize_t psmouse_attr_set_helper(struct device *dev, struct device_attribute *dev static ssize_t psmouse_show_int_attr(struct psmouse *psmouse, void *offset, char *buf) { - unsigned int *field = (unsigned int *)((char *)psmouse + (size_t)offset); + unsigned long *field = (unsigned long *)((char *)psmouse + (size_t)offset); - return sprintf(buf, "%u\n", *field); + return sprintf(buf, "%lu\n", *field); } static ssize_t psmouse_set_int_attr(struct psmouse *psmouse, void *offset, const char *buf, size_t count) { - unsigned int *field = (unsigned int *)((char *)psmouse + (size_t)offset); + unsigned long *field = (unsigned long *)((char *)psmouse + (size_t)offset); unsigned long value; char *rest; value = simple_strtoul(buf, &rest, 10); if (*rest) return -EINVAL; - if ((unsigned int)value != value) - return -EINVAL; *field = value; @@ -1383,11 +1359,11 @@ static ssize_t psmouse_attr_set_protocol(struct psmouse *psmouse, void *data, co return -EIO; } - mutex_unlock(&psmouse_mutex); + up(&psmouse_sem); serio_unpin_driver(serio); serio_unregister_child_port(serio); serio_pin_driver_uninterruptible(serio); - mutex_lock(&psmouse_mutex); + down(&psmouse_sem); if (serio->drv != &psmouse_drv) { input_free_device(new_dev); diff --git a/drivers/input/mouse/rpcmouse.c b/drivers/input/mouse/rpcmouse.c index 872b30bf7..09b6ffdb7 100644 --- a/drivers/input/mouse/rpcmouse.c +++ b/drivers/input/mouse/rpcmouse.c @@ -85,7 +85,7 @@ static int __init rpcmouse_init(void) rpcmouse_lastx = (short) iomd_readl(IOMD_MOUSEX); rpcmouse_lasty = (short) iomd_readl(IOMD_MOUSEY); - if (request_irq(IRQ_VSYNCPULSE, rpcmouse_irq, IRQF_SHARED, "rpcmouse", rpcmouse_dev)) { + if (request_irq(IRQ_VSYNCPULSE, rpcmouse_irq, SA_SHIRQ, "rpcmouse", rpcmouse_dev)) { printk(KERN_ERR "rpcmouse: unable to allocate VSYNC interrupt\n"); input_free_device(rpcmouse_dev); return -EBUSY; diff --git a/drivers/input/mouse/sermouse.c b/drivers/input/mouse/sermouse.c index 0023501a5..2f9a04ae7 100644 --- a/drivers/input/mouse/sermouse.c +++ b/drivers/input/mouse/sermouse.c @@ -33,6 +33,7 @@ #include #include #include +#include #include #include @@ -253,7 +254,7 @@ static int sermouse_connect(struct serio *serio, struct serio_driver *drv) goto fail; sermouse->dev = input_dev; - snprintf(sermouse->phys, sizeof(sermouse->phys), "%s/input0", serio->phys); + sprintf(sermouse->phys, "%s/input0", serio->phys); sermouse->type = serio->id.proto; input_dev->name = sermouse_protocols[sermouse->type]; diff --git a/drivers/input/mouse/synaptics.c b/drivers/input/mouse/synaptics.c index ad5d0a85e..2051bec2c 100644 --- a/drivers/input/mouse/synaptics.c +++ b/drivers/input/mouse/synaptics.c @@ -247,12 +247,14 @@ static void synaptics_pt_create(struct psmouse *psmouse) { struct serio *serio; - serio = kzalloc(sizeof(struct serio), GFP_KERNEL); + serio = kmalloc(sizeof(struct serio), GFP_KERNEL); if (!serio) { printk(KERN_ERR "synaptics: not enough memory to allocate pass-through port\n"); return; } + memset(serio, 0, sizeof(struct serio)); + serio->id.type = SERIO_PS_PSTHRU; strlcpy(serio->name, "Synaptics pass-through", sizeof(serio->name)); strlcpy(serio->phys, "synaptics-pt/serio0", sizeof(serio->name)); @@ -603,21 +605,14 @@ static struct dmi_system_id toshiba_dmi_table[] = { .ident = "Toshiba Satellite", .matches = { DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), - DMI_MATCH(DMI_PRODUCT_NAME, "Satellite"), + DMI_MATCH(DMI_PRODUCT_NAME , "Satellite"), }, }, { .ident = "Toshiba Dynabook", .matches = { DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), - DMI_MATCH(DMI_PRODUCT_NAME, "dynabook"), - }, - }, - { - .ident = "Toshiba Portege M300", - .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), - DMI_MATCH(DMI_PRODUCT_NAME, "PORTEGE M300"), + DMI_MATCH(DMI_PRODUCT_NAME , "dynabook"), }, }, { } @@ -628,9 +623,10 @@ int synaptics_init(struct psmouse *psmouse) { struct synaptics_data *priv; - psmouse->private = priv = kzalloc(sizeof(struct synaptics_data), GFP_KERNEL); + psmouse->private = priv = kmalloc(sizeof(struct synaptics_data), GFP_KERNEL); if (!priv) return -1; + memset(priv, 0, sizeof(struct synaptics_data)); if (synaptics_query_hardware(psmouse)) { printk(KERN_ERR "Unable to query Synaptics hardware.\n"); diff --git a/drivers/input/mouse/trackpoint.c b/drivers/input/mouse/trackpoint.c index ae5871a0e..6d9ec9ab1 100644 --- a/drivers/input/mouse/trackpoint.c +++ b/drivers/input/mouse/trackpoint.c @@ -183,26 +183,21 @@ static struct attribute_group trackpoint_attr_group = { .attrs = trackpoint_attrs, }; -static int trackpoint_start_protocol(struct psmouse *psmouse, unsigned char *firmware_id) +static void trackpoint_disconnect(struct psmouse *psmouse) { - unsigned char param[2] = { 0 }; - - if (ps2_command(&psmouse->ps2dev, param, MAKE_PS2_CMD(0, 2, TP_READ_ID))) - return -1; - - if (param[0] != TP_MAGIC_IDENT) - return -1; - - if (firmware_id) - *firmware_id = param[1]; + sysfs_remove_group(&psmouse->ps2dev.serio->dev.kobj, &trackpoint_attr_group); - return 0; + kfree(psmouse->private); + psmouse->private = NULL; } static int trackpoint_sync(struct psmouse *psmouse) { - struct trackpoint_data *tp = psmouse->private; unsigned char toggle; + struct trackpoint_data *tp = psmouse->private; + + if (!tp) + return -1; /* Disable features that may make device unusable with this driver */ trackpoint_read(&psmouse->ps2dev, TP_TOGGLE_TWOHAND, &toggle); @@ -268,38 +263,27 @@ static void trackpoint_defaults(struct trackpoint_data *tp) tp->ext_dev = TP_DEF_EXT_DEV; } -static void trackpoint_disconnect(struct psmouse *psmouse) -{ - sysfs_remove_group(&psmouse->ps2dev.serio->dev.kobj, &trackpoint_attr_group); - - kfree(psmouse->private); - psmouse->private = NULL; -} - -static int trackpoint_reconnect(struct psmouse *psmouse) -{ - if (trackpoint_start_protocol(psmouse, NULL)) - return -1; - - if (trackpoint_sync(psmouse)) - return -1; - - return 0; -} - int trackpoint_detect(struct psmouse *psmouse, int set_properties) { struct trackpoint_data *priv; struct ps2dev *ps2dev = &psmouse->ps2dev; unsigned char firmware_id; unsigned char button_info; + unsigned char param[2]; + + param[0] = param[1] = 0; - if (trackpoint_start_protocol(psmouse, &firmware_id)) + if (ps2_command(ps2dev, param, MAKE_PS2_CMD(0, 2, TP_READ_ID))) + return -1; + + if (param[0] != TP_MAGIC_IDENT) return -1; if (!set_properties) return 0; + firmware_id = param[1]; + if (trackpoint_read(&psmouse->ps2dev, TP_EXT_BTN, &button_info)) { printk(KERN_WARNING "trackpoint.c: failed to get extended button data\n"); button_info = 0; @@ -312,7 +296,7 @@ int trackpoint_detect(struct psmouse *psmouse, int set_properties) psmouse->vendor = "IBM"; psmouse->name = "TrackPoint"; - psmouse->reconnect = trackpoint_reconnect; + psmouse->reconnect = trackpoint_sync; psmouse->disconnect = trackpoint_disconnect; trackpoint_defaults(priv); diff --git a/drivers/input/mouse/vsxxxaa.c b/drivers/input/mouse/vsxxxaa.c index 47edcfd02..36e9442a1 100644 --- a/drivers/input/mouse/vsxxxaa.c +++ b/drivers/input/mouse/vsxxxaa.c @@ -81,6 +81,7 @@ #include #include #include +#include #include #include @@ -152,25 +153,22 @@ vsxxxaa_detection_done (struct vsxxxaa *mouse) { switch (mouse->type) { case 0x02: - strlcpy (mouse->name, "DEC VSXXX-AA/-GA mouse", - sizeof (mouse->name)); + sprintf (mouse->name, "DEC VSXXX-AA/-GA mouse"); break; case 0x04: - strlcpy (mouse->name, "DEC VSXXX-AB digitizer", - sizeof (mouse->name)); + sprintf (mouse->name, "DEC VSXXX-AB digitizer"); break; default: - snprintf (mouse->name, sizeof (mouse->name), - "unknown DEC pointer device (type = 0x%02x)", - mouse->type); + sprintf (mouse->name, "unknown DEC pointer device " + "(type = 0x%02x)", mouse->type); break; } - printk (KERN_INFO - "Found %s version 0x%02x from country 0x%02x on port %s\n", - mouse->name, mouse->version, mouse->country, mouse->phys); + printk (KERN_INFO "Found %s version 0x%02x from country 0x%02x " + "on port %s\n", mouse->name, mouse->version, + mouse->country, mouse->phys); } /* @@ -505,9 +503,8 @@ vsxxxaa_connect (struct serio *serio, struct serio_driver *drv) mouse->dev = input_dev; mouse->serio = serio; - strlcat (mouse->name, "DEC VSXXX-AA/-GA mouse or VSXXX-AB digitizer", - sizeof (mouse->name)); - snprintf (mouse->phys, sizeof (mouse->phys), "%s/input0", serio->phys); + sprintf (mouse->name, "DEC VSXXX-AA/-GA mouse or VSXXX-AB digitizer"); + sprintf (mouse->phys, "%s/input0", serio->phys); input_dev->name = mouse->name; input_dev->phys = mouse->phys; diff --git a/drivers/input/mousedev.c b/drivers/input/mousedev.c index 1f851acab..9abed18d2 100644 --- a/drivers/input/mousedev.c +++ b/drivers/input/mousedev.c @@ -19,6 +19,7 @@ #include #include #include +#include #include #include #include @@ -122,9 +123,7 @@ static void mousedev_touchpad_event(struct input_dev *dev, struct mousedev *mous if (mousedev->touch) { size = dev->absmax[ABS_X] - dev->absmin[ABS_X]; - if (size == 0) - size = 256 * 2; - + if (size == 0) size = 256 * 2; switch (code) { case ABS_X: fx(0) = value; @@ -156,24 +155,18 @@ static void mousedev_abs_event(struct input_dev *dev, struct mousedev *mousedev, switch (code) { case ABS_X: size = dev->absmax[ABS_X] - dev->absmin[ABS_X]; - if (size == 0) - size = xres ? : 1; - if (value > dev->absmax[ABS_X]) - value = dev->absmax[ABS_X]; - if (value < dev->absmin[ABS_X]) - value = dev->absmin[ABS_X]; + if (size == 0) size = xres ? : 1; + if (value > dev->absmax[ABS_X]) value = dev->absmax[ABS_X]; + if (value < dev->absmin[ABS_X]) value = dev->absmin[ABS_X]; mousedev->packet.x = ((value - dev->absmin[ABS_X]) * xres) / size; mousedev->packet.abs_event = 1; break; case ABS_Y: size = dev->absmax[ABS_Y] - dev->absmin[ABS_Y]; - if (size == 0) - size = yres ? : 1; - if (value > dev->absmax[ABS_Y]) - value = dev->absmax[ABS_Y]; - if (value < dev->absmin[ABS_Y]) - value = dev->absmin[ABS_Y]; + if (size == 0) size = yres ? : 1; + if (value > dev->absmax[ABS_Y]) value = dev->absmax[ABS_Y]; + if (value < dev->absmin[ABS_Y]) value = dev->absmin[ABS_Y]; mousedev->packet.y = yres - ((value - dev->absmin[ABS_Y]) * yres) / size; mousedev->packet.abs_event = 1; break; @@ -209,7 +202,7 @@ static void mousedev_key_event(struct mousedev *mousedev, unsigned int code, int case BTN_SIDE: index = 3; break; case BTN_4: case BTN_EXTRA: index = 4; break; - default: return; + default: return; } if (value) { @@ -292,9 +285,10 @@ static void mousedev_touchpad_touch(struct mousedev *mousedev, int value) mousedev->touch = mousedev->pkt_count = 0; mousedev->frac_dx = 0; mousedev->frac_dy = 0; - - } else if (!mousedev->touch) - mousedev->touch = jiffies; + } + else + if (!mousedev->touch) + mousedev->touch = jiffies; } static void mousedev_event(struct input_handle *handle, unsigned int type, unsigned int code, int value) @@ -333,7 +327,7 @@ static void mousedev_event(struct input_handle *handle, unsigned int type, unsig mousedev->pkt_count++; /* Input system eats duplicate events, but we need all of them * to do correct averaging so apply present one forward - */ + */ fx(0) = fx(1); fy(0) = fy(1); } @@ -352,9 +346,7 @@ static int mousedev_fasync(int fd, struct file *file, int on) { int retval; struct mousedev_list *list = file->private_data; - retval = fasync_helper(fd, file, on, &list->fasync); - return retval < 0 ? retval : 0; } @@ -420,8 +412,9 @@ static int mousedev_open(struct inode * inode, struct file * file) if (i >= MOUSEDEV_MINORS || !mousedev_table[i]) return -ENODEV; - if (!(list = kzalloc(sizeof(struct mousedev_list), GFP_KERNEL))) + if (!(list = kmalloc(sizeof(struct mousedev_list), GFP_KERNEL))) return -ENOMEM; + memset(list, 0, sizeof(struct mousedev_list)); spin_lock_init(&list->packet_lock); list->pos_x = xres / 2; @@ -515,16 +508,14 @@ static ssize_t mousedev_write(struct file * file, const char __user * buffer, si list->imexseq = 0; list->mode = MOUSEDEV_EMUL_EXPS; } - } else - list->imexseq = 0; + } else list->imexseq = 0; if (c == mousedev_imps_seq[list->impsseq]) { if (++list->impsseq == MOUSEDEV_SEQ_LEN) { list->impsseq = 0; list->mode = MOUSEDEV_EMUL_IMPS; } - } else - list->impsseq = 0; + } else list->impsseq = 0; list->ps2[0] = 0xfa; @@ -608,7 +599,6 @@ static ssize_t mousedev_read(struct file * file, char __user * buffer, size_t co static unsigned int mousedev_poll(struct file *file, poll_table *wait) { struct mousedev_list *list = file->private_data; - poll_wait(file, &list->mousedev->wait, wait); return ((list->ready || list->buffer) ? (POLLIN | POLLRDNORM) : 0) | (list->mousedev->exist ? 0 : (POLLHUP | POLLERR)); @@ -636,8 +626,9 @@ static struct input_handle *mousedev_connect(struct input_handler *handler, stru return NULL; } - if (!(mousedev = kzalloc(sizeof(struct mousedev), GFP_KERNEL))) + if (!(mousedev = kmalloc(sizeof(struct mousedev), GFP_KERNEL))) return NULL; + memset(mousedev, 0, sizeof(struct mousedev)); INIT_LIST_HEAD(&mousedev->list); init_waitqueue_head(&mousedev->wait); diff --git a/drivers/input/power.c b/drivers/input/power.c index 51a519e24..bfc5c63eb 100644 --- a/drivers/input/power.c +++ b/drivers/input/power.c @@ -28,6 +28,7 @@ */ #include +#include #include #include #include @@ -102,8 +103,9 @@ static struct input_handle *power_connect(struct input_handler *handler, { struct input_handle *handle; - if (!(handle = kzalloc(sizeof(struct input_handle), GFP_KERNEL))) + if (!(handle = kmalloc(sizeof(struct input_handle), GFP_KERNEL))) return NULL; + memset(handle, 0, sizeof(struct input_handle)); handle->dev = dev; handle->handler = handler; diff --git a/drivers/input/serio/ct82c710.c b/drivers/input/serio/ct82c710.c index bc6e87add..096b6a0b5 100644 --- a/drivers/input/serio/ct82c710.c +++ b/drivers/input/serio/ct82c710.c @@ -31,6 +31,7 @@ #include #include #include +#include #include #include #include @@ -188,7 +189,7 @@ static int __devinit ct82c710_probe(struct platform_device *dev) strlcpy(ct82c710_port->name, "C&T 82c710 mouse port", sizeof(ct82c710_port->name)); snprintf(ct82c710_port->phys, sizeof(ct82c710_port->phys), - "isa%16llx/serio0", (unsigned long long)CT82C710_DATA); + "isa%04lx/serio0", CT82C710_DATA); serio_register_port(ct82c710_port); @@ -240,8 +241,8 @@ static int __init ct82c710_init(void) serio_register_port(ct82c710_port); - printk(KERN_INFO "serio: C&T 82c710 mouse port at %#llx irq %d\n", - (unsigned long long)CT82C710_DATA, CT82C710_IRQ); + printk(KERN_INFO "serio: C&T 82c710 mouse port at %#lx irq %d\n", + CT82C710_DATA, CT82C710_IRQ); return 0; diff --git a/drivers/input/serio/gscps2.c b/drivers/input/serio/gscps2.c index cde036a92..a7b0de0f9 100644 --- a/drivers/input/serio/gscps2.c +++ b/drivers/input/serio/gscps2.c @@ -1,7 +1,7 @@ /* * drivers/input/serio/gscps2.c * - * Copyright (c) 2004-2006 Helge Deller + * Copyright (c) 2004 Helge Deller * Copyright (c) 2002 Laurent Canet * Copyright (c) 2002 Thibaut Varene * @@ -22,6 +22,7 @@ * was usable/enabled ?) */ +#include #include #include #include @@ -353,7 +354,7 @@ static int __init gscps2_probe(struct parisc_device *dev) memset(serio, 0, sizeof(struct serio)); ps2port->port = serio; ps2port->padev = dev; - ps2port->addr = ioremap_nocache(hpa, GSC_STATUS + 4); + ps2port->addr = ioremap(hpa, GSC_STATUS + 4); spin_lock_init(&ps2port->lock); gscps2_reset(ps2port); @@ -370,7 +371,7 @@ static int __init gscps2_probe(struct parisc_device *dev) serio->dev.parent = &dev->dev; ret = -EBUSY; - if (request_irq(dev->irq, gscps2_interrupt, IRQF_SHARED, ps2port->port->name, ps2port)) + if (request_irq(dev->irq, gscps2_interrupt, SA_SHIRQ, ps2port->port->name, ps2port)) goto fail_miserably; if (ps2port->id != GSC_ID_KEYBOARD && ps2port->id != GSC_ID_MOUSE) { diff --git a/drivers/input/serio/hil_mlc.c b/drivers/input/serio/hil_mlc.c index bbbe15e21..570420496 100644 --- a/drivers/input/serio/hil_mlc.c +++ b/drivers/input/serio/hil_mlc.c @@ -556,7 +556,7 @@ static inline void hilse_setup_input(hil_mlc *mlc, struct hilse_node *node) { do_gettimeofday(&(mlc->instart)); mlc->icount = 15; memset(mlc->ipacket, 0, 16 * sizeof(hil_packet)); - BUG_ON(down_trylock(&(mlc->isem))); + if (down_trylock(&(mlc->isem))) BUG(); return; } @@ -872,8 +872,9 @@ int hil_mlc_register(hil_mlc *mlc) { for (i = 0; i < HIL_MLC_DEVMEM; i++) { struct serio *mlc_serio; hil_mlc_copy_di_scratch(mlc, i); - mlc_serio = kzalloc(sizeof(*mlc_serio), GFP_KERNEL); + mlc_serio = kmalloc(sizeof(*mlc_serio), GFP_KERNEL); mlc->serio[i] = mlc_serio; + memset(mlc_serio, 0, sizeof(*mlc_serio)); mlc_serio->id = hil_mlc_serio_id; mlc_serio->write = hil_mlc_serio_write; mlc_serio->open = hil_mlc_serio_open; diff --git a/drivers/input/serio/hp_sdc_mlc.c b/drivers/input/serio/hp_sdc_mlc.c index aa4a8a4cc..1c9426fd5 100644 --- a/drivers/input/serio/hp_sdc_mlc.c +++ b/drivers/input/serio/hp_sdc_mlc.c @@ -270,10 +270,9 @@ static void hp_sdc_mlc_out (hil_mlc *mlc) { do_control: priv->emtestmode = mlc->opacket & HIL_CTRL_TEST; - - /* we cannot emulate this, it should not be used. */ - BUG_ON((mlc->opacket & (HIL_CTRL_APE | HIL_CTRL_IPF)) == HIL_CTRL_APE); - + if ((mlc->opacket & (HIL_CTRL_APE | HIL_CTRL_IPF)) == HIL_CTRL_APE) { + BUG(); /* we cannot emulate this, it should not be used. */ + } if ((mlc->opacket & HIL_CTRL_ONLY) == HIL_CTRL_ONLY) goto control_only; if (mlc->opacket & HIL_CTRL_APE) { BUG(); /* Should not send command/data after engaging APE */ diff --git a/drivers/input/serio/i8042-io.h b/drivers/input/serio/i8042-io.h index cc21914fb..9a9221644 100644 --- a/drivers/input/serio/i8042-io.h +++ b/drivers/input/serio/i8042-io.h @@ -67,14 +67,14 @@ static inline int i8042_platform_init(void) * On some platforms touching the i8042 data register region can do really * bad things. Because of this the region is always reserved on such boxes. */ -#if !defined(__sh__) && !defined(__alpha__) && !defined(__mips__) && !defined(CONFIG_PPC_MERGE) +#if !defined(__sh__) && !defined(__alpha__) && !defined(__mips__) && !defined(CONFIG_PPC64) if (!request_region(I8042_DATA_REG, 16, "i8042")) return -EBUSY; #endif i8042_reset = 1; -#if defined(CONFIG_PPC_MERGE) +#if defined(CONFIG_PPC64) if (check_legacy_ioport(I8042_DATA_REG)) return -EBUSY; if (!request_region(I8042_DATA_REG, 16, "i8042")) diff --git a/drivers/input/serio/i8042-sparcio.h b/drivers/input/serio/i8042-sparcio.h index 54adba2d8..ed9446f6d 100644 --- a/drivers/input/serio/i8042-sparcio.h +++ b/drivers/input/serio/i8042-sparcio.h @@ -1,10 +1,13 @@ #ifndef _I8042_SPARCIO_H #define _I8042_SPARCIO_H +#include #include + +#ifdef CONFIG_PCI #include -#include -#include +#include +#endif static int i8042_kbd_irq = -1; static int i8042_aux_irq = -1; @@ -45,83 +48,54 @@ static inline void i8042_write_command(int val) #define OBP_PS2MS_NAME1 "kdmouse" #define OBP_PS2MS_NAME2 "mouse" -static int __devinit sparc_i8042_probe(struct of_device *op, const struct of_device_id *match) -{ - struct device_node *dp = op->node; - - dp = dp->child; - while (dp) { - if (!strcmp(dp->name, OBP_PS2KBD_NAME1) || - !strcmp(dp->name, OBP_PS2KBD_NAME2)) { - struct of_device *kbd = of_find_device_by_node(dp); - unsigned int irq = kbd->irqs[0]; - if (irq == 0xffffffff) - irq = op->irqs[0]; - i8042_kbd_irq = irq; - kbd_iobase = of_ioremap(&kbd->resource[0], - 0, 8, "kbd"); - } else if (!strcmp(dp->name, OBP_PS2MS_NAME1) || - !strcmp(dp->name, OBP_PS2MS_NAME2)) { - struct of_device *ms = of_find_device_by_node(dp); - unsigned int irq = ms->irqs[0]; - if (irq == 0xffffffff) - irq = op->irqs[0]; - i8042_aux_irq = irq; - } - - dp = dp->sibling; - } - - return 0; -} - -static int __devexit sparc_i8042_remove(struct of_device *op) -{ - of_iounmap(kbd_iobase, 8); - - return 0; -} - -static struct of_device_id sparc_i8042_match[] = { - { - .name = "8042", - }, - {}, -}; -MODULE_DEVICE_TABLE(of, sparc_i8042_match); - -static struct of_platform_driver sparc_i8042_driver = { - .name = "i8042", - .match_table = sparc_i8042_match, - .probe = sparc_i8042_probe, - .remove = __devexit_p(sparc_i8042_remove), -}; - static int __init i8042_platform_init(void) { #ifndef CONFIG_PCI return -ENODEV; #else - struct device_node *root = of_find_node_by_path("/"); + char prop[128]; + int len; - if (!strcmp(root->name, "SUNW,JavaStation-1")) { + len = prom_getproperty(prom_root_node, "name", prop, sizeof(prop)); + if (len < 0) { + printk("i8042: Cannot get name property of root OBP node.\n"); + return -ENODEV; + } + if (strncmp(prop, "SUNW,JavaStation-1", len) == 0) { /* Hardcoded values for MrCoffee. */ i8042_kbd_irq = i8042_aux_irq = 13 | 0x20; kbd_iobase = ioremap(0x71300060, 8); if (!kbd_iobase) return -ENODEV; } else { - int err = of_register_driver(&sparc_i8042_driver, - &of_bus_type); - if (err) - return err; - + struct linux_ebus *ebus; + struct linux_ebus_device *edev; + struct linux_ebus_child *child; + + for_each_ebus(ebus) { + for_each_ebusdev(edev, ebus) { + if (!strcmp(edev->prom_name, "8042")) + goto edev_found; + } + } + return -ENODEV; + + edev_found: + for_each_edevchild(edev, child) { + if (!strcmp(child->prom_name, OBP_PS2KBD_NAME1) || + !strcmp(child->prom_name, OBP_PS2KBD_NAME2)) { + i8042_kbd_irq = child->irqs[0]; + kbd_iobase = + ioremap(child->resource[0].start, 8); + } + if (!strcmp(child->prom_name, OBP_PS2MS_NAME1) || + !strcmp(child->prom_name, OBP_PS2MS_NAME2)) + i8042_aux_irq = child->irqs[0]; + } if (i8042_kbd_irq == -1 || i8042_aux_irq == -1) { - if (kbd_iobase) { - of_iounmap(kbd_iobase, 8); - kbd_iobase = (void __iomem *) NULL; - } + printk("i8042: Error, 8042 device lacks both kbd and " + "mouse nodes.\n"); return -ENODEV; } } @@ -135,10 +109,7 @@ static int __init i8042_platform_init(void) static inline void i8042_platform_exit(void) { #ifdef CONFIG_PCI - struct device_node *root = of_find_node_by_path("/"); - - if (strcmp(root->name, "SUNW,JavaStation-1")) - of_unregister_driver(&sparc_i8042_driver); + iounmap(kbd_iobase); #endif } diff --git a/drivers/input/serio/i8042-x86ia64io.h b/drivers/input/serio/i8042-x86ia64io.h index f606e96bc..a4c6f3522 100644 --- a/drivers/input/serio/i8042-x86ia64io.h +++ b/drivers/input/serio/i8042-x86ia64io.h @@ -192,9 +192,7 @@ static struct dmi_system_id __initdata i8042_dmi_nomux_table[] = { #include static int i8042_pnp_kbd_registered; -static unsigned int i8042_pnp_kbd_devices; static int i8042_pnp_aux_registered; -static unsigned int i8042_pnp_aux_devices; static int i8042_pnp_command_reg; static int i8042_pnp_data_reg; @@ -221,7 +219,6 @@ static int i8042_pnp_kbd_probe(struct pnp_dev *dev, const struct pnp_device_id * strncat(i8042_pnp_kbd_name, pnp_dev_name(dev), sizeof(i8042_pnp_kbd_name)); } - i8042_pnp_kbd_devices++; return 0; } @@ -242,7 +239,6 @@ static int i8042_pnp_aux_probe(struct pnp_dev *dev, const struct pnp_device_id * strncat(i8042_pnp_aux_name, pnp_dev_name(dev), sizeof(i8042_pnp_aux_name)); } - i8042_pnp_aux_devices++; return 0; } @@ -291,23 +287,21 @@ static void i8042_pnp_exit(void) static int __init i8042_pnp_init(void) { + int result_kbd = 0, result_aux = 0; char kbd_irq_str[4] = { 0 }, aux_irq_str[4] = { 0 }; - int err; if (i8042_nopnp) { printk(KERN_INFO "i8042: PNP detection disabled\n"); return 0; } - err = pnp_register_driver(&i8042_pnp_kbd_driver); - if (!err) + if ((result_kbd = pnp_register_driver(&i8042_pnp_kbd_driver)) >= 0) i8042_pnp_kbd_registered = 1; - err = pnp_register_driver(&i8042_pnp_aux_driver); - if (!err) + if ((result_aux = pnp_register_driver(&i8042_pnp_aux_driver)) >= 0) i8042_pnp_aux_registered = 1; - if (!i8042_pnp_kbd_devices && !i8042_pnp_aux_devices) { + if (result_kbd <= 0 && result_aux <= 0) { i8042_pnp_exit(); #if defined(__ia64__) return -ENODEV; @@ -317,24 +311,24 @@ static int __init i8042_pnp_init(void) #endif } - if (i8042_pnp_kbd_devices) + if (result_kbd > 0) snprintf(kbd_irq_str, sizeof(kbd_irq_str), "%d", i8042_pnp_kbd_irq); - if (i8042_pnp_aux_devices) + if (result_aux > 0) snprintf(aux_irq_str, sizeof(aux_irq_str), "%d", i8042_pnp_aux_irq); printk(KERN_INFO "PNP: PS/2 Controller [%s%s%s] at %#x,%#x irq %s%s%s\n", - i8042_pnp_kbd_name, (i8042_pnp_kbd_devices && i8042_pnp_aux_devices) ? "," : "", + i8042_pnp_kbd_name, (result_kbd > 0 && result_aux > 0) ? "," : "", i8042_pnp_aux_name, i8042_pnp_data_reg, i8042_pnp_command_reg, - kbd_irq_str, (i8042_pnp_kbd_devices && i8042_pnp_aux_devices) ? "," : "", + kbd_irq_str, (result_kbd > 0 && result_aux > 0) ? "," : "", aux_irq_str); #if defined(__ia64__) - if (!i8042_pnp_kbd_devices) + if (result_kbd <= 0) i8042_nokbd = 1; - if (!i8042_pnp_aux_devices) + if (result_aux <= 0) i8042_noaux = 1; #endif diff --git a/drivers/input/serio/i8042.c b/drivers/input/serio/i8042.c index 06a3f2565..a7d91d535 100644 --- a/drivers/input/serio/i8042.c +++ b/drivers/input/serio/i8042.c @@ -15,6 +15,7 @@ #include #include #include +#include #include #include #include @@ -328,7 +329,7 @@ static int i8042_open(struct serio *serio) return 0; if (request_irq(port->irq, i8042_interrupt, - IRQF_SHARED, "i8042", i8042_request_irq_cookie)) { + SA_SHIRQ, "i8042", i8042_request_irq_cookie)) { printk(KERN_ERR "i8042.c: Can't get irq %d for %s, unregistering the port.\n", port->irq, port->name); goto irq_fail; } @@ -610,7 +611,7 @@ static int __devinit i8042_check_aux(void) */ if (request_irq(i8042_ports[I8042_AUX_PORT_NO].irq, i8042_interrupt, - IRQF_SHARED, "i8042", &i8042_check_aux_cookie)) + SA_SHIRQ, "i8042", &i8042_check_aux_cookie)) return -1; free_irq(i8042_ports[I8042_AUX_PORT_NO].irq, &i8042_check_aux_cookie); diff --git a/drivers/input/serio/i8042.h b/drivers/input/serio/i8042.h index af526ab9e..cbbf3842d 100644 --- a/drivers/input/serio/i8042.h +++ b/drivers/input/serio/i8042.h @@ -1,6 +1,7 @@ #ifndef _I8042_H #define _I8042_H +#include /* * Copyright (c) 1999-2002 Vojtech Pavlik diff --git a/drivers/input/serio/libps2.c b/drivers/input/serio/libps2.c index b9f5d99fa..d4c990f7c 100644 --- a/drivers/input/serio/libps2.c +++ b/drivers/input/serio/libps2.c @@ -84,7 +84,7 @@ void ps2_drain(struct ps2dev *ps2dev, int maxbytes, int timeout) maxbytes = sizeof(ps2dev->cmdbuf); } - mutex_lock(&ps2dev->cmd_mutex); + down(&ps2dev->cmd_sem); serio_pause_rx(ps2dev->serio); ps2dev->flags = PS2_FLAG_CMD; @@ -94,7 +94,7 @@ void ps2_drain(struct ps2dev *ps2dev, int maxbytes, int timeout) wait_event_timeout(ps2dev->wait, !(ps2dev->flags & PS2_FLAG_CMD), msecs_to_jiffies(timeout)); - mutex_unlock(&ps2dev->cmd_mutex); + up(&ps2dev->cmd_sem); } /* @@ -177,12 +177,7 @@ int ps2_command(struct ps2dev *ps2dev, unsigned char *param, int command) return -1; } - if (send && !param) { - WARN_ON(1); - return -1; - } - - mutex_lock(&ps2dev->cmd_mutex); + down(&ps2dev->cmd_sem); serio_pause_rx(ps2dev->serio); ps2dev->flags = command == PS2_CMD_GETID ? PS2_FLAG_WAITID : 0; @@ -234,7 +229,7 @@ int ps2_command(struct ps2dev *ps2dev, unsigned char *param, int command) ps2dev->flags = 0; serio_continue_rx(ps2dev->serio); - mutex_unlock(&ps2dev->cmd_mutex); + up(&ps2dev->cmd_sem); return rc; } @@ -280,17 +275,13 @@ int ps2_schedule_command(struct ps2dev *ps2dev, unsigned char *param, int comman return 0; } -static struct lock_class_key ps2_mutex_key; - /* * ps2_init() initializes ps2dev structure */ void ps2_init(struct ps2dev *ps2dev, struct serio *serio) { - mutex_init(&ps2dev->cmd_mutex); - lockdep_set_class_and_subclass(&ps2dev->cmd_mutex, &ps2_mutex_key, - serio->depth); + init_MUTEX(&ps2dev->cmd_sem); init_waitqueue_head(&ps2dev->wait); ps2dev->serio = serio; } diff --git a/drivers/input/serio/parkbd.c b/drivers/input/serio/parkbd.c index a5c1fb3a4..1d15c2819 100644 --- a/drivers/input/serio/parkbd.c +++ b/drivers/input/serio/parkbd.c @@ -171,8 +171,9 @@ static struct serio * __init parkbd_allocate_serio(void) { struct serio *serio; - serio = kzalloc(sizeof(struct serio), GFP_KERNEL); + serio = kmalloc(sizeof(struct serio), GFP_KERNEL); if (serio) { + memset(serio, 0, sizeof(struct serio)); serio->id.type = parkbd_mode; serio->write = parkbd_write, strlcpy(serio->name, "PARKBD AT/XT keyboard adapter", sizeof(serio->name)); diff --git a/drivers/input/serio/pcips2.c b/drivers/input/serio/pcips2.c index fb727c665..1e139c5e5 100644 --- a/drivers/input/serio/pcips2.c +++ b/drivers/input/serio/pcips2.c @@ -107,7 +107,7 @@ static int pcips2_open(struct serio *io) outb(PS2_CTRL_ENABLE, ps2if->base); pcips2_flush_input(ps2if); - ret = request_irq(ps2if->dev->irq, pcips2_interrupt, IRQF_SHARED, + ret = request_irq(ps2if->dev->irq, pcips2_interrupt, SA_SHIRQ, "pcips2", ps2if); if (ret == 0) val = PS2_CTRL_ENABLE | PS2_CTRL_RXIRQ; diff --git a/drivers/input/serio/rpckbd.c b/drivers/input/serio/rpckbd.c index 513d37fc1..a3bd11589 100644 --- a/drivers/input/serio/rpckbd.c +++ b/drivers/input/serio/rpckbd.c @@ -111,10 +111,11 @@ static int __devinit rpckbd_probe(struct platform_device *dev) { struct serio *serio; - serio = kzalloc(sizeof(struct serio), GFP_KERNEL); + serio = kmalloc(sizeof(struct serio), GFP_KERNEL); if (!serio) return -ENOMEM; + memset(serio, 0, sizeof(struct serio)); serio->id.type = SERIO_8042; serio->write = rpckbd_write; serio->open = rpckbd_open; diff --git a/drivers/input/serio/serio.c b/drivers/input/serio/serio.c index 4a1c3e365..2f76813c3 100644 --- a/drivers/input/serio/serio.c +++ b/drivers/input/serio/serio.c @@ -34,7 +34,6 @@ #include #include #include -#include MODULE_AUTHOR("Vojtech Pavlik "); MODULE_DESCRIPTION("Serio abstraction core"); @@ -53,16 +52,15 @@ EXPORT_SYMBOL(serio_rescan); EXPORT_SYMBOL(serio_reconnect); /* - * serio_mutex protects entire serio subsystem and is taken every time + * serio_sem protects entire serio subsystem and is taken every time * serio port or driver registrered or unregistered. */ -static DEFINE_MUTEX(serio_mutex); +static DECLARE_MUTEX(serio_sem); static LIST_HEAD(serio_list); static struct bus_type serio_bus; -static void serio_add_driver(struct serio_driver *drv); static void serio_add_port(struct serio *serio); static void serio_destroy_port(struct serio *serio); static void serio_reconnect_port(struct serio *serio); @@ -72,9 +70,9 @@ static int serio_connect_driver(struct serio *serio, struct serio_driver *drv) { int retval; - mutex_lock(&serio->drv_mutex); + down(&serio->drv_sem); retval = drv->connect(serio, drv); - mutex_unlock(&serio->drv_mutex); + up(&serio->drv_sem); return retval; } @@ -83,20 +81,20 @@ static int serio_reconnect_driver(struct serio *serio) { int retval = -1; - mutex_lock(&serio->drv_mutex); + down(&serio->drv_sem); if (serio->drv && serio->drv->reconnect) retval = serio->drv->reconnect(serio); - mutex_unlock(&serio->drv_mutex); + up(&serio->drv_sem); return retval; } static void serio_disconnect_driver(struct serio *serio) { - mutex_lock(&serio->drv_mutex); + down(&serio->drv_sem); if (serio->drv) serio->drv->disconnect(serio); - mutex_unlock(&serio->drv_mutex); + up(&serio->drv_sem); } static int serio_match_port(const struct serio_device_id *ids, struct serio *serio) @@ -141,14 +139,8 @@ static void serio_release_driver(struct serio *serio) static void serio_find_driver(struct serio *serio) { - int error; - down_write(&serio_bus.subsys.rwsem); - error = device_attach(&serio->dev); - if (error < 0) - printk(KERN_WARNING - "serio: device_attach() failed for %s (%s), error: %d\n", - serio->phys, serio->name, error); + device_attach(&serio->dev); up_write(&serio_bus.subsys.rwsem); } @@ -203,7 +195,6 @@ static void serio_queue_event(void *object, struct module *owner, if ((event = kmalloc(sizeof(struct serio_event), GFP_ATOMIC))) { if (!try_module_get(owner)) { printk(KERN_WARNING "serio: Can't get module reference, dropping event %d\n", event_type); - kfree(event); goto out; } @@ -279,8 +270,9 @@ static struct serio_event *serio_get_event(void) static void serio_handle_event(void) { struct serio_event *event; + struct serio_driver *serio_drv; - mutex_lock(&serio_mutex); + down(&serio_sem); /* * Note that we handle only one event here to give swsusp @@ -310,7 +302,8 @@ static void serio_handle_event(void) break; case SERIO_REGISTER_DRIVER: - serio_add_driver(event->object); + serio_drv = event->object; + driver_register(&serio_drv->driver); break; default: @@ -321,7 +314,7 @@ static void serio_handle_event(void) serio_free_event(event); } - mutex_unlock(&serio_mutex); + up(&serio_sem); } /* @@ -456,7 +449,7 @@ static ssize_t serio_rebind_driver(struct device *dev, struct device_attribute * struct device_driver *drv; int retval; - retval = mutex_lock_interruptible(&serio_mutex); + retval = down_interruptible(&serio_sem); if (retval) return retval; @@ -476,7 +469,7 @@ static ssize_t serio_rebind_driver(struct device *dev, struct device_attribute * retval = -EINVAL; } - mutex_unlock(&serio_mutex); + up(&serio_sem); return retval; } @@ -521,8 +514,6 @@ static void serio_release_port(struct device *dev) module_put(THIS_MODULE); } -static struct lock_class_key serio_lock_key; - /* * Prepare serio port for registration. */ @@ -532,21 +523,15 @@ static void serio_init_port(struct serio *serio) __module_get(THIS_MODULE); - INIT_LIST_HEAD(&serio->node); spin_lock_init(&serio->lock); - mutex_init(&serio->drv_mutex); + init_MUTEX(&serio->drv_sem); device_initialize(&serio->dev); snprintf(serio->dev.bus_id, sizeof(serio->dev.bus_id), "serio%ld", (long)atomic_inc_return(&serio_no) - 1); serio->dev.bus = &serio_bus; serio->dev.release = serio_release_port; - if (serio->parent) { + if (serio->parent) serio->dev.parent = &serio->parent->dev; - serio->depth = serio->parent->depth + 1; - } else - serio->depth = 0; - lockdep_set_class_and_subclass(&serio->lock, &serio_lock_key, - serio->depth); } /* @@ -555,8 +540,6 @@ static void serio_init_port(struct serio *serio) */ static void serio_add_port(struct serio *serio) { - int error; - if (serio->parent) { serio_pause_rx(serio->parent); serio->parent->child = serio; @@ -566,19 +549,9 @@ static void serio_add_port(struct serio *serio) list_add_tail(&serio->node, &serio_list); if (serio->start) serio->start(serio); - error = device_add(&serio->dev); - if (error) - printk(KERN_ERR - "serio: device_add() failed for %s (%s), error: %d\n", - serio->phys, serio->name, error); - else { - serio->registered = 1; - error = sysfs_create_group(&serio->dev.kobj, &serio_id_attr_group); - if (error) - printk(KERN_ERR - "serio: sysfs_create_group() failed for %s (%s), error: %d\n", - serio->phys, serio->name, error); - } + device_add(&serio->dev); + sysfs_create_group(&serio->dev.kobj, &serio_id_attr_group); + serio->registered = 1; } /* @@ -608,10 +581,10 @@ static void serio_destroy_port(struct serio *serio) if (serio->registered) { sysfs_remove_group(&serio->dev.kobj, &serio_id_attr_group); device_del(&serio->dev); + list_del_init(&serio->node); serio->registered = 0; } - list_del_init(&serio->node); serio_remove_pending_events(serio); put_device(&serio->dev); } @@ -688,10 +661,10 @@ void __serio_register_port(struct serio *serio, struct module *owner) */ void serio_unregister_port(struct serio *serio) { - mutex_lock(&serio_mutex); + down(&serio_sem); serio_disconnect_port(serio); serio_destroy_port(serio); - mutex_unlock(&serio_mutex); + up(&serio_sem); } /* @@ -699,17 +672,17 @@ void serio_unregister_port(struct serio *serio) */ void serio_unregister_child_port(struct serio *serio) { - mutex_lock(&serio_mutex); + down(&serio_sem); if (serio->child) { serio_disconnect_port(serio->child); serio_destroy_port(serio->child); } - mutex_unlock(&serio_mutex); + up(&serio_sem); } /* * Submits register request to kseriod for subsequent execution. - * Can be used when it is not obvious whether the serio_mutex is + * Can be used when it is not obvious whether the serio_sem is * taken or not and when delayed execution is feasible. */ void __serio_unregister_port_delayed(struct serio *serio, struct module *owner) @@ -781,17 +754,6 @@ static struct bus_type serio_bus = { .remove = serio_driver_remove, }; -static void serio_add_driver(struct serio_driver *drv) -{ - int error; - - error = driver_register(&drv->driver); - if (error) - printk(KERN_ERR - "serio: driver_register() failed for %s, error: %d\n", - drv->driver.name, error); -} - void __serio_register_driver(struct serio_driver *drv, struct module *owner) { drv->driver.bus = &serio_bus; @@ -803,7 +765,7 @@ void serio_unregister_driver(struct serio_driver *drv) { struct serio *serio; - mutex_lock(&serio_mutex); + down(&serio_sem); drv->manual_bind = 1; /* so serio_find_driver ignores it */ start_over: @@ -817,7 +779,7 @@ start_over: } driver_unregister(&drv->driver); - mutex_unlock(&serio_mutex); + up(&serio_sem); } static void serio_set_drv(struct serio *serio, struct serio_driver *drv) @@ -896,7 +858,7 @@ static int serio_resume(struct device *dev) return 0; } -/* called from serio_driver->connect/disconnect methods under serio_mutex */ +/* called from serio_driver->connect/disconnect methods under serio_sem */ int serio_open(struct serio *serio, struct serio_driver *drv) { serio_set_drv(serio, drv); @@ -908,7 +870,7 @@ int serio_open(struct serio *serio, struct serio_driver *drv) return 0; } -/* called from serio_driver->connect/disconnect methods under serio_mutex */ +/* called from serio_driver->connect/disconnect methods under serio_sem */ void serio_close(struct serio *serio) { if (serio->close) @@ -939,26 +901,18 @@ irqreturn_t serio_interrupt(struct serio *serio, static int __init serio_init(void) { - int error; + serio_task = kthread_run(serio_thread, NULL, "kseriod"); + if (IS_ERR(serio_task)) { + printk(KERN_ERR "serio: Failed to start kseriod\n"); + return PTR_ERR(serio_task); + } serio_bus.dev_attrs = serio_device_attrs; serio_bus.drv_attrs = serio_driver_attrs; serio_bus.match = serio_bus_match; serio_bus.uevent = serio_uevent; serio_bus.resume = serio_resume; - error = bus_register(&serio_bus); - if (error) { - printk(KERN_ERR "serio: failed to register serio bus, error: %d\n", error); - return error; - } - - serio_task = kthread_run(serio_thread, NULL, "kseriod"); - if (IS_ERR(serio_task)) { - bus_unregister(&serio_bus); - error = PTR_ERR(serio_task); - printk(KERN_ERR "serio: Failed to start kseriod, error: %d\n", error); - return error; - } + bus_register(&serio_bus); return 0; } @@ -969,5 +923,5 @@ static void __exit serio_exit(void) kthread_stop(serio_task); } -subsys_initcall(serio_init); +module_init(serio_init); module_exit(serio_exit); diff --git a/drivers/input/serio/serio_raw.c b/drivers/input/serio/serio_raw.c index 71a8eea81..47e08de18 100644 --- a/drivers/input/serio/serio_raw.c +++ b/drivers/input/serio/serio_raw.c @@ -16,9 +16,9 @@ #include #include #include +#include #include #include -#include #define DRIVER_DESC "Raw serio driver" @@ -46,7 +46,7 @@ struct serio_raw_list { struct list_head node; }; -static DEFINE_MUTEX(serio_raw_mutex); +static DECLARE_MUTEX(serio_raw_sem); static LIST_HEAD(serio_raw_list); static unsigned int serio_raw_no; @@ -81,7 +81,7 @@ static int serio_raw_open(struct inode *inode, struct file *file) struct serio_raw_list *list; int retval = 0; - retval = mutex_lock_interruptible(&serio_raw_mutex); + retval = down_interruptible(&serio_raw_sem); if (retval) return retval; @@ -95,11 +95,12 @@ static int serio_raw_open(struct inode *inode, struct file *file) goto out; } - if (!(list = kzalloc(sizeof(struct serio_raw_list), GFP_KERNEL))) { + if (!(list = kmalloc(sizeof(struct serio_raw_list), GFP_KERNEL))) { retval = -ENOMEM; goto out; } + memset(list, 0, sizeof(struct serio_raw_list)); list->serio_raw = serio_raw; file->private_data = list; @@ -107,7 +108,7 @@ static int serio_raw_open(struct inode *inode, struct file *file) list_add_tail(&list->node, &serio_raw->list); out: - mutex_unlock(&serio_raw_mutex); + up(&serio_raw_sem); return retval; } @@ -129,12 +130,12 @@ static int serio_raw_release(struct inode *inode, struct file *file) struct serio_raw_list *list = file->private_data; struct serio_raw *serio_raw = list->serio_raw; - mutex_lock(&serio_raw_mutex); + down(&serio_raw_sem); serio_raw_fasync(-1, file, 0); serio_raw_cleanup(serio_raw); - mutex_unlock(&serio_raw_mutex); + up(&serio_raw_sem); return 0; } @@ -193,7 +194,7 @@ static ssize_t serio_raw_write(struct file *file, const char __user *buffer, siz int retval; unsigned char c; - retval = mutex_lock_interruptible(&serio_raw_mutex); + retval = down_interruptible(&serio_raw_sem); if (retval) return retval; @@ -218,7 +219,7 @@ static ssize_t serio_raw_write(struct file *file, const char __user *buffer, siz }; out: - mutex_unlock(&serio_raw_mutex); + up(&serio_raw_sem); return written; } @@ -274,13 +275,14 @@ static int serio_raw_connect(struct serio *serio, struct serio_driver *drv) struct serio_raw *serio_raw; int err; - if (!(serio_raw = kzalloc(sizeof(struct serio_raw), GFP_KERNEL))) { + if (!(serio_raw = kmalloc(sizeof(struct serio_raw), GFP_KERNEL))) { printk(KERN_ERR "serio_raw.c: can't allocate memory for a device\n"); return -ENOMEM; } - mutex_lock(&serio_raw_mutex); + down(&serio_raw_sem); + memset(serio_raw, 0, sizeof(struct serio_raw)); snprintf(serio_raw->name, sizeof(serio_raw->name), "serio_raw%d", serio_raw_no++); serio_raw->refcnt = 1; serio_raw->serio = serio; @@ -323,7 +325,7 @@ out_free: serio_set_drvdata(serio, NULL); kfree(serio_raw); out: - mutex_unlock(&serio_raw_mutex); + up(&serio_raw_sem); return err; } @@ -348,7 +350,7 @@ static void serio_raw_disconnect(struct serio *serio) { struct serio_raw *serio_raw; - mutex_lock(&serio_raw_mutex); + down(&serio_raw_sem); serio_raw = serio_get_drvdata(serio); @@ -359,7 +361,7 @@ static void serio_raw_disconnect(struct serio *serio) if (!serio_raw_cleanup(serio_raw)) wake_up_interruptible(&serio_raw->wait); - mutex_unlock(&serio_raw_mutex); + up(&serio_raw_sem); } static struct serio_device_id serio_raw_serio_ids[] = { diff --git a/drivers/input/touchscreen/ads7846.c b/drivers/input/touchscreen/ads7846.c index 66e411bad..8c12a974b 100644 --- a/drivers/input/touchscreen/ads7846.c +++ b/drivers/input/touchscreen/ads7846.c @@ -2,8 +2,6 @@ * ADS7846 based touchscreen and sensor driver * * Copyright (c) 2005 David Brownell - * Copyright (c) 2006 Nokia Corporation - * Various changes: Imre Deak * * Using code from: * - corgi_ts.c @@ -25,7 +23,6 @@ #include #include #include -#include #ifdef CONFIG_ARM #include @@ -36,22 +33,17 @@ /* - * This code has been heavily tested on a Nokia 770, and lightly - * tested on other ads7846 devices (OSK/Mistral, Lubbock). + * This code has been lightly tested on an ads7846. * Support for ads7843 and ads7845 has only been stubbed in. * - * IRQ handling needs a workaround because of a shortcoming in handling - * edge triggered IRQs on some platforms like the OMAP1/2. These - * platforms don't handle the ARM lazy IRQ disabling properly, thus we - * have to maintain our own SW IRQ disabled status. This should be - * removed as soon as the affected platform's IRQ handling is fixed. + * Not yet done: investigate the values reported. Are x/y/pressure + * event values sane enough for X11? How accurate are the temperature + * and voltage readings? (System-specific calibration should support + * accuracy of 0.3 degrees C; otherwise it's 2.0 degrees.) * * app note sbaa036 talks in more detail about accurate sampling... * that ought to help in situations like LCDs inducing noise (which * can also be helped by using synch signals) and more generally. - * This driver tries to utilize the measures described in the app - * note. The strength of filtering can be set in the board-* specific - * files. */ #define TS_POLL_PERIOD msecs_to_jiffies(10) @@ -68,7 +60,6 @@ struct ts_event { __be16 x; __be16 y; __be16 z1, z2; - int ignore; }; struct ads7846 { @@ -79,23 +70,12 @@ struct ads7846 { u16 model; u16 vref_delay_usecs; u16 x_plate_ohms; - u16 pressure_max; - u8 read_x, read_y, read_z1, read_z2, pwrdown; - u16 dummy; /* for the pwrdown read */ + u8 read_x, read_y, read_z1, read_z2; struct ts_event tc; - struct spi_transfer xfer[10]; - struct spi_message msg[5]; - struct spi_message *last_msg; - int msg_idx; - int read_cnt; - int read_rep; - int last_read; - - u16 debounce_max; - u16 debounce_tol; - u16 debounce_rep; + struct spi_transfer xfer[8]; + struct spi_message msg; spinlock_t lock; struct timer_list timer; /* P: lock */ @@ -103,9 +83,6 @@ struct ads7846 { unsigned pending:1; /* P: lock */ // FIXME remove "irq_disabled" unsigned irq_disabled:1; /* P: lock */ - unsigned disabled:1; - - int (*get_pendown_state)(void); }; /* leave chip selected when we're done, for quicker re-select? */ @@ -147,9 +124,7 @@ struct ads7846 { #define READ_Y (READ_12BIT_DFR(y) | ADS_PD10_ADC_ON) #define READ_Z1 (READ_12BIT_DFR(z1) | ADS_PD10_ADC_ON) #define READ_Z2 (READ_12BIT_DFR(z2) | ADS_PD10_ADC_ON) - -#define READ_X (READ_12BIT_DFR(x) | ADS_PD10_ADC_ON) -#define PWRDOWN (READ_12BIT_DFR(y) | ADS_PD10_PDOWN) /* LAST */ +#define READ_X (READ_12BIT_DFR(x) | ADS_PD10_PDOWN) /* LAST */ /* single-ended samples need to first power up reference voltage; * we leave both ADC and VREF powered @@ -176,15 +151,6 @@ struct ser_req { struct spi_transfer xfer[6]; }; -static void ads7846_enable(struct ads7846 *ts); -static void ads7846_disable(struct ads7846 *ts); - -static int device_suspended(struct device *dev) -{ - struct ads7846 *ts = dev_get_drvdata(dev); - return dev->power.power_state.event != PM_EVENT_ON || ts->disabled; -} - static int ads7846_read12_ser(struct device *dev, unsigned command) { struct spi_device *spi = to_spi_device(dev); @@ -197,7 +163,7 @@ static int ads7846_read12_ser(struct device *dev, unsigned command) if (!req) return -ENOMEM; - spi_message_init(&req->msg); + INIT_LIST_HEAD(&req->msg.transfers); /* activate reference, so it has time to settle; */ req->ref_on = REF_ON; @@ -237,21 +203,16 @@ static int ads7846_read12_ser(struct device *dev, unsigned command) for (i = 0; i < 6; i++) spi_message_add_tail(&req->xfer[i], &req->msg); - ts->irq_disabled = 1; disable_irq(spi->irq); status = spi_sync(spi, &req->msg); - ts->irq_disabled = 0; enable_irq(spi->irq); if (req->msg.status) status = req->msg.status; - - /* on-wire is a must-ignore bit, a BE12 value, then padding */ sample = be16_to_cpu(req->sample); - sample = sample >> 3; - sample &= 0x0fff; - + sample = sample >> 4; kfree(req); + return status ? status : sample; } @@ -271,52 +232,6 @@ SHOW(temp1) SHOW(vaux) SHOW(vbatt) -static int is_pen_down(struct device *dev) -{ - struct ads7846 *ts = dev_get_drvdata(dev); - - return ts->pendown; -} - -static ssize_t ads7846_pen_down_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - return sprintf(buf, "%u\n", is_pen_down(dev)); -} - -static DEVICE_ATTR(pen_down, S_IRUGO, ads7846_pen_down_show, NULL); - -static ssize_t ads7846_disable_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - struct ads7846 *ts = dev_get_drvdata(dev); - - return sprintf(buf, "%u\n", ts->disabled); -} - -static ssize_t ads7846_disable_store(struct device *dev, - struct device_attribute *attr, - const char *buf, size_t count) -{ - struct ads7846 *ts = dev_get_drvdata(dev); - char *endp; - int i; - - i = simple_strtoul(buf, &endp, 10); - spin_lock_irq(&ts->lock); - - if (i) - ads7846_disable(ts); - else - ads7846_enable(ts); - - spin_unlock_irq(&ts->lock); - - return count; -} - -static DEVICE_ATTR(disable, 0664, ads7846_disable_show, ads7846_disable_store); - /*--------------------------------------------------------------------------*/ /* @@ -336,19 +251,19 @@ static void ads7846_rx(void *ads) u16 x, y, z1, z2; unsigned long flags; - /* adjust: on-wire is a must-ignore bit, a BE12 value, then padding; - * built from two 8 bit values written msb-first. + /* adjust: 12 bit samples (left aligned), built from + * two 8 bit values writen msb-first. */ - x = (be16_to_cpu(ts->tc.x) >> 3) & 0x0fff; - y = (be16_to_cpu(ts->tc.y) >> 3) & 0x0fff; - z1 = (be16_to_cpu(ts->tc.z1) >> 3) & 0x0fff; - z2 = (be16_to_cpu(ts->tc.z2) >> 3) & 0x0fff; + x = be16_to_cpu(ts->tc.x) >> 4; + y = be16_to_cpu(ts->tc.y) >> 4; + z1 = be16_to_cpu(ts->tc.z1) >> 4; + z2 = be16_to_cpu(ts->tc.z2) >> 4; /* range filtering */ if (x == MAX_12BIT) x = 0; - if (likely(x && z1 && !device_suspended(&ts->spi->dev))) { + if (x && z1 && ts->spi->dev.power.power_state.event == PM_EVENT_ON) { /* compute touch pressure resistance using equation #2 */ Rt = z2; Rt -= z1; @@ -359,14 +274,6 @@ static void ads7846_rx(void *ads) } else Rt = 0; - /* Sample found inconsistent by debouncing or pressure is beyond - * the maximum. Don't report it to user space, repeat at least - * once more the measurement */ - if (ts->tc.ignore || Rt > ts->pressure_max) { - mod_timer(&ts->timer, jiffies + TS_POLL_PERIOD); - return; - } - /* NOTE: "pendown" is inferred from pressure; we don't rely on * being able to check nPENIRQ status, or "friendly" trigger modes * (both-edges is much better than just-falling or low-level). @@ -388,13 +295,11 @@ static void ads7846_rx(void *ads) if (Rt) { input_report_abs(input_dev, ABS_X, x); input_report_abs(input_dev, ABS_Y, y); + input_report_abs(input_dev, ABS_PRESSURE, Rt); sync = 1; } - - if (sync) { - input_report_abs(input_dev, ABS_PRESSURE, Rt); + if (sync) input_sync(input_dev); - } #ifdef VERBOSE if (Rt || ts->pendown) @@ -402,137 +307,80 @@ static void ads7846_rx(void *ads) x, y, Rt, Rt ? "" : " UP"); #endif + /* don't retrigger while we're suspended */ spin_lock_irqsave(&ts->lock, flags); ts->pendown = (Rt != 0); - mod_timer(&ts->timer, jiffies + TS_POLL_PERIOD); - - spin_unlock_irqrestore(&ts->lock, flags); -} - -static void ads7846_debounce(void *ads) -{ - struct ads7846 *ts = ads; - struct spi_message *m; - struct spi_transfer *t; - int val; - int status; - - m = &ts->msg[ts->msg_idx]; - t = list_entry(m->transfers.prev, struct spi_transfer, transfer_list); - val = (be16_to_cpu(*(__be16 *)t->rx_buf) >> 3) & 0x0fff; - if (!ts->read_cnt || (abs(ts->last_read - val) > ts->debounce_tol)) { - /* Repeat it, if this was the first read or the read - * wasn't consistent enough. */ - if (ts->read_cnt < ts->debounce_max) { - ts->last_read = val; - ts->read_cnt++; - } else { - /* Maximum number of debouncing reached and still - * not enough number of consistent readings. Abort - * the whole sample, repeat it in the next sampling - * period. - */ - ts->tc.ignore = 1; - ts->read_cnt = 0; - /* Last message will contain ads7846_rx() as the - * completion function. - */ - m = ts->last_msg; - } - /* Start over collecting consistent readings. */ - ts->read_rep = 0; - } else { - if (++ts->read_rep > ts->debounce_rep) { - /* Got a good reading for this coordinate, - * go for the next one. */ - ts->tc.ignore = 0; - ts->msg_idx++; - ts->read_cnt = 0; - ts->read_rep = 0; - m++; - } else - /* Read more values that are consistent. */ - ts->read_cnt++; - } - status = spi_async(ts->spi, m); - if (status) - dev_err(&ts->spi->dev, "spi_async --> %d\n", - status); -} - -static void ads7846_timer(unsigned long handle) -{ - struct ads7846 *ts = (void *)handle; - int status = 0; - - spin_lock_irq(&ts->lock); + ts->pending = 0; - if (unlikely(ts->msg_idx && !ts->pendown)) { - /* measurement cycle ended */ - if (!device_suspended(&ts->spi->dev)) { + if (ts->spi->dev.power.power_state.event == PM_EVENT_ON) { + if (ts->pendown) + mod_timer(&ts->timer, jiffies + TS_POLL_PERIOD); + else if (ts->irq_disabled) { ts->irq_disabled = 0; enable_irq(ts->spi->irq); } - ts->pending = 0; - ts->msg_idx = 0; - } else { - /* pen is still down, continue with the measurement */ - ts->msg_idx = 0; - status = spi_async(ts->spi, &ts->msg[0]); - if (status) - dev_err(&ts->spi->dev, "spi_async --> %d\n", status); } - spin_unlock_irq(&ts->lock); + spin_unlock_irqrestore(&ts->lock, flags); } -static irqreturn_t ads7846_irq(int irq, void *handle, struct pt_regs *regs) +static void ads7846_timer(unsigned long handle) { - struct ads7846 *ts = handle; - unsigned long flags; + struct ads7846 *ts = (void *)handle; + int status = 0; + unsigned long flags; spin_lock_irqsave(&ts->lock, flags); - if (likely(ts->get_pendown_state())) { + if (!ts->pending) { + ts->pending = 1; if (!ts->irq_disabled) { - /* The ARM do_simple_IRQ() dispatcher doesn't act - * like the other dispatchers: it will report IRQs - * even after they've been disabled. We work around - * that here. (The "generic irq" framework may help...) - */ ts->irq_disabled = 1; disable_irq(ts->spi->irq); - ts->pending = 1; - mod_timer(&ts->timer, jiffies); } + status = spi_async(ts->spi, &ts->msg); + if (status) + dev_err(&ts->spi->dev, "spi_async --> %d\n", + status); } spin_unlock_irqrestore(&ts->lock, flags); +} +static irqreturn_t ads7846_irq(int irq, void *handle, struct pt_regs *regs) +{ + ads7846_timer((unsigned long) handle); return IRQ_HANDLED; } /*--------------------------------------------------------------------------*/ -/* Must be called with ts->lock held */ -static void ads7846_disable(struct ads7846 *ts) +static int +ads7846_suspend(struct spi_device *spi, pm_message_t message) { - if (ts->disabled) - return; + struct ads7846 *ts = dev_get_drvdata(&spi->dev); + unsigned long flags; - ts->disabled = 1; + spin_lock_irqsave(&ts->lock, flags); + + spi->dev.power.power_state = message; /* are we waiting for IRQ, or polling? */ - if (!ts->pending) { - ts->irq_disabled = 1; - disable_irq(ts->spi->irq); + if (!ts->pendown) { + if (!ts->irq_disabled) { + ts->irq_disabled = 1; + disable_irq(ts->spi->irq); + } } else { - /* the timer will run at least once more, and - * leave everything in a clean state, IRQ disabled + /* polling; force a final SPI completion; + * that will clean things up neatly */ - while (ts->pending) { - spin_unlock_irq(&ts->lock); - msleep(1); - spin_lock_irq(&ts->lock); + if (!ts->pending) + mod_timer(&ts->timer, jiffies); + + while (ts->pendown || ts->pending) { + spin_unlock_irqrestore(&ts->lock, flags); + udelay(10); + spin_lock_irqsave(&ts->lock, flags); } } @@ -540,45 +388,17 @@ static void ads7846_disable(struct ads7846 *ts) * leave it that way after every request */ -} - -/* Must be called with ts->lock held */ -static void ads7846_enable(struct ads7846 *ts) -{ - if (!ts->disabled) - return; - - ts->disabled = 0; - ts->irq_disabled = 0; - enable_irq(ts->spi->irq); -} - -static int ads7846_suspend(struct spi_device *spi, pm_message_t message) -{ - struct ads7846 *ts = dev_get_drvdata(&spi->dev); - - spin_lock_irq(&ts->lock); - - spi->dev.power.power_state = message; - ads7846_disable(ts); - - spin_unlock_irq(&ts->lock); - + spin_unlock_irqrestore(&ts->lock, flags); return 0; - } static int ads7846_resume(struct spi_device *spi) { struct ads7846 *ts = dev_get_drvdata(&spi->dev); - spin_lock_irq(&ts->lock); - + ts->irq_disabled = 0; + enable_irq(ts->spi->irq); spi->dev.power.power_state = PMSG_ON; - ads7846_enable(ts); - - spin_unlock_irq(&ts->lock); - return 0; } @@ -587,7 +407,6 @@ static int __devinit ads7846_probe(struct spi_device *spi) struct ads7846 *ts; struct input_dev *input_dev; struct ads7846_platform_data *pdata = spi->dev.platform_data; - struct spi_message *m; struct spi_transfer *x; int err; @@ -608,20 +427,11 @@ static int __devinit ads7846_probe(struct spi_device *spi) return -EINVAL; } - /* REVISIT when the irq can be triggered active-low, or if for some - * reason the touchscreen isn't hooked up, we don't need to access - * the pendown state. + /* We'd set the wordsize to 12 bits ... except that some controllers + * will then treat the 8 bit command words as 12 bits (and drop the + * four MSBs of the 12 bit result). Result: inputs must be shifted + * to discard the four garbage LSBs. */ - if (pdata->get_pendown_state == NULL) { - dev_dbg(&spi->dev, "no get_pendown_state function?\n"); - return -EINVAL; - } - - /* We'd set TX wordsize 8 bits and RX wordsize to 13 bits ... except - * that even if the hardware can do that, the SPI controller driver - * may not. So we stick to very-portable 8 bit words, both RX and TX. - */ - spi->bits_per_word = 8; ts = kzalloc(sizeof(struct ads7846), GFP_KERNEL); input_dev = input_allocate_device(); @@ -640,21 +450,9 @@ static int __devinit ads7846_probe(struct spi_device *spi) ts->timer.data = (unsigned long) ts; ts->timer.function = ads7846_timer; - spin_lock_init(&ts->lock); - ts->model = pdata->model ? : 7846; ts->vref_delay_usecs = pdata->vref_delay_usecs ? : 100; ts->x_plate_ohms = pdata->x_plate_ohms ? : 400; - ts->pressure_max = pdata->pressure_max ? : ~0; - if (pdata->debounce_max) { - ts->debounce_max = pdata->debounce_max; - ts->debounce_tol = pdata->debounce_tol; - ts->debounce_rep = pdata->debounce_rep; - if (ts->debounce_rep > ts->debounce_max + 1) - ts->debounce_rep = ts->debounce_max - 1; - } else - ts->debounce_tol = ~0; - ts->get_pendown_state = pdata->get_pendown_state; snprintf(ts->phys, sizeof(ts->phys), "%s/input0", spi->dev.bus_id); @@ -678,103 +476,64 @@ static int __devinit ads7846_probe(struct spi_device *spi) /* set up the transfers to read touchscreen state; this assumes we * use formula #2 for pressure, not #3. */ - m = &ts->msg[0]; + INIT_LIST_HEAD(&ts->msg.transfers); x = ts->xfer; - spi_message_init(m); - /* y- still on; turn on only y+ (and ADC) */ ts->read_y = READ_Y; x->tx_buf = &ts->read_y; x->len = 1; - spi_message_add_tail(x, m); + spi_message_add_tail(x, &ts->msg); x++; x->rx_buf = &ts->tc.y; x->len = 2; - spi_message_add_tail(x, m); - - m->complete = ads7846_debounce; - m->context = ts; - - m++; - spi_message_init(m); - - /* turn y- off, x+ on, then leave in lowpower */ - x++; - ts->read_x = READ_X; - x->tx_buf = &ts->read_x; - x->len = 1; - spi_message_add_tail(x, m); - - x++; - x->rx_buf = &ts->tc.x; - x->len = 2; - spi_message_add_tail(x, m); - - m->complete = ads7846_debounce; - m->context = ts; + spi_message_add_tail(x, &ts->msg); /* turn y+ off, x- on; we'll use formula #2 */ if (ts->model == 7846) { - m++; - spi_message_init(m); - x++; ts->read_z1 = READ_Z1; x->tx_buf = &ts->read_z1; x->len = 1; - spi_message_add_tail(x, m); + spi_message_add_tail(x, &ts->msg); x++; x->rx_buf = &ts->tc.z1; x->len = 2; - spi_message_add_tail(x, m); - - m->complete = ads7846_debounce; - m->context = ts; - - m++; - spi_message_init(m); + spi_message_add_tail(x, &ts->msg); x++; ts->read_z2 = READ_Z2; x->tx_buf = &ts->read_z2; x->len = 1; - spi_message_add_tail(x, m); + spi_message_add_tail(x, &ts->msg); x++; x->rx_buf = &ts->tc.z2; x->len = 2; - spi_message_add_tail(x, m); - - m->complete = ads7846_debounce; - m->context = ts; + spi_message_add_tail(x, &ts->msg); } - /* power down */ - m++; - spi_message_init(m); - + /* turn y- off, x+ on, then leave in lowpower */ x++; - ts->pwrdown = PWRDOWN; - x->tx_buf = &ts->pwrdown; + ts->read_x = READ_X; + x->tx_buf = &ts->read_x; x->len = 1; - spi_message_add_tail(x, m); + spi_message_add_tail(x, &ts->msg); x++; - x->rx_buf = &ts->dummy; + x->rx_buf = &ts->tc.x; x->len = 2; CS_CHANGE(*x); - spi_message_add_tail(x, m); - - m->complete = ads7846_rx; - m->context = ts; + spi_message_add_tail(x, &ts->msg); - ts->last_msg = m; + ts->msg.complete = ads7846_rx; + ts->msg.context = ts; - if (request_irq(spi->irq, ads7846_irq, IRQF_TRIGGER_FALLING, - spi->dev.driver->name, ts)) { + if (request_irq(spi->irq, ads7846_irq, + SA_SAMPLE_RANDOM | SA_TRIGGER_FALLING, + spi->dev.bus_id, ts)) { dev_dbg(&spi->dev, "irq %d busy?\n", spi->irq); err = -EBUSY; goto err_free_mem; @@ -799,27 +558,13 @@ static int __devinit ads7846_probe(struct spi_device *spi) device_create_file(&spi->dev, &dev_attr_vbatt); device_create_file(&spi->dev, &dev_attr_vaux); - device_create_file(&spi->dev, &dev_attr_pen_down); - - device_create_file(&spi->dev, &dev_attr_disable); - err = input_register_device(input_dev); if (err) - goto err_remove_attr; + goto err_free_irq; return 0; - err_remove_attr: - device_remove_file(&spi->dev, &dev_attr_disable); - device_remove_file(&spi->dev, &dev_attr_pen_down); - if (ts->model == 7846) { - device_remove_file(&spi->dev, &dev_attr_temp1); - device_remove_file(&spi->dev, &dev_attr_temp0); - } - if (ts->model != 7845) - device_remove_file(&spi->dev, &dev_attr_vbatt); - device_remove_file(&spi->dev, &dev_attr_vaux); - + err_free_irq: free_irq(spi->irq, ts); err_free_mem: input_free_device(input_dev); @@ -831,24 +576,20 @@ static int __devexit ads7846_remove(struct spi_device *spi) { struct ads7846 *ts = dev_get_drvdata(&spi->dev); - input_unregister_device(ts->input); - ads7846_suspend(spi, PMSG_SUSPEND); + free_irq(ts->spi->irq, ts); + if (ts->irq_disabled) + enable_irq(ts->spi->irq); - device_remove_file(&spi->dev, &dev_attr_disable); - device_remove_file(&spi->dev, &dev_attr_pen_down); if (ts->model == 7846) { - device_remove_file(&spi->dev, &dev_attr_temp1); device_remove_file(&spi->dev, &dev_attr_temp0); + device_remove_file(&spi->dev, &dev_attr_temp1); } if (ts->model != 7845) device_remove_file(&spi->dev, &dev_attr_vbatt); device_remove_file(&spi->dev, &dev_attr_vaux); - free_irq(ts->spi->irq, ts); - /* suspend left the IRQ disabled */ - enable_irq(ts->spi->irq); - + input_unregister_device(ts->input); kfree(ts); dev_dbg(&spi->dev, "unregistered touchscreen\n"); diff --git a/drivers/input/touchscreen/corgi_ts.c b/drivers/input/touchscreen/corgi_ts.c index 9b66271d3..104298785 100644 --- a/drivers/input/touchscreen/corgi_ts.c +++ b/drivers/input/touchscreen/corgi_ts.c @@ -17,7 +17,7 @@ #include #include #include -#include +#include #include #include @@ -318,7 +318,7 @@ static int __init corgits_probe(struct platform_device *pdev) corgi_ssp_ads7846_putget((5u << ADSCTRL_ADR_SH) | ADSCTRL_STS); mdelay(5); - if (request_irq(corgi_ts->irq_gpio, ts_interrupt, IRQF_DISABLED, "ts", corgi_ts)) { + if (request_irq(corgi_ts->irq_gpio, ts_interrupt, SA_INTERRUPT, "ts", corgi_ts)) { err = -EBUSY; goto fail; } diff --git a/drivers/input/touchscreen/gunze.c b/drivers/input/touchscreen/gunze.c index b769b2197..466da190c 100644 --- a/drivers/input/touchscreen/gunze.c +++ b/drivers/input/touchscreen/gunze.c @@ -129,7 +129,7 @@ static int gunze_connect(struct serio *serio, struct serio_driver *drv) gunze->serio = serio; gunze->dev = input_dev; - snprintf(gunze->phys, sizeof(serio->phys), "%s/input0", serio->phys); + sprintf(gunze->phys, "%s/input0", serio->phys); input_dev->private = gunze; input_dev->name = "Gunze AHL-51S TouchScreen"; diff --git a/drivers/input/touchscreen/h3600_ts_input.c b/drivers/input/touchscreen/h3600_ts_input.c index e2b910018..a18d56bda 100644 --- a/drivers/input/touchscreen/h3600_ts_input.c +++ b/drivers/input/touchscreen/h3600_ts_input.c @@ -363,7 +363,7 @@ static int h3600ts_connect(struct serio *serio, struct serio_driver *drv) ts->serio = serio; ts->dev = input_dev; - snprintf(ts->phys, sizeof(ts->phys), "%s/input0", serio->phys); + sprintf(ts->phys, "%s/input0", serio->phys); input_dev->name = "H3600 TouchScreen"; input_dev->phys = ts->phys; @@ -399,14 +399,16 @@ static int h3600ts_connect(struct serio *serio, struct serio_driver *drv) set_GPIO_IRQ_edge(GPIO_BITSY_NPOWER_BUTTON, GPIO_RISING_EDGE); if (request_irq(IRQ_GPIO_BITSY_ACTION_BUTTON, action_button_handler, - IRQF_SHARED | IRQF_DISABLED, "h3600_action", &ts->dev)) { + SA_SHIRQ | SA_INTERRUPT | SA_SAMPLE_RANDOM, + "h3600_action", &ts->dev)) { printk(KERN_ERR "h3600ts.c: Could not allocate Action Button IRQ!\n"); err = -EBUSY; goto fail2; } if (request_irq(IRQ_GPIO_BITSY_NPOWER_BUTTON, npower_button_handler, - IRQF_SHARED | IRQF_DISABLED, "h3600_suspend", &ts->dev)) { + SA_SHIRQ | SA_INTERRUPT | SA_SAMPLE_RANDOM, + "h3600_suspend", &ts->dev)) { printk(KERN_ERR "h3600ts.c: Could not allocate Power Button IRQ!\n"); err = -EBUSY; goto fail3; diff --git a/drivers/input/touchscreen/hp680_ts_input.c b/drivers/input/touchscreen/hp680_ts_input.c index fa97e0f79..957dd5a1b 100644 --- a/drivers/input/touchscreen/hp680_ts_input.c +++ b/drivers/input/touchscreen/hp680_ts_input.c @@ -109,7 +109,7 @@ static int __init hp680_ts_init(void) input_register_device(hp680_ts_dev); if (request_irq(HP680_TS_IRQ, hp680_ts_interrupt, - IRQF_DISABLED, MODNAME, 0) < 0) { + SA_INTERRUPT, MODNAME, 0) < 0) { printk(KERN_ERR "hp680_touchscreen.c: Can't allocate irq %d\n", HP680_TS_IRQ); input_unregister_device(hp680_ts_dev); diff --git a/drivers/input/touchscreen/mtouch.c b/drivers/input/touchscreen/mtouch.c index 8647a905d..1d0d37eee 100644 --- a/drivers/input/touchscreen/mtouch.c +++ b/drivers/input/touchscreen/mtouch.c @@ -143,7 +143,7 @@ static int mtouch_connect(struct serio *serio, struct serio_driver *drv) mtouch->serio = serio; mtouch->dev = input_dev; - snprintf(mtouch->phys, sizeof(mtouch->phys), "%s/input0", serio->phys); + sprintf(mtouch->phys, "%s/input0", serio->phys); input_dev->private = mtouch; input_dev->name = "MicroTouch Serial TouchScreen"; diff --git a/drivers/input/tsdev.c b/drivers/input/tsdev.c index 00e3929c6..ca1547929 100644 --- a/drivers/input/tsdev.c +++ b/drivers/input/tsdev.c @@ -35,7 +35,7 @@ * e-mail - mail your message to . */ -#define TSDEV_MINOR_BASE 128 +#define TSDEV_MINOR_BASE 128 #define TSDEV_MINORS 32 /* First 16 devices are h3600_ts compatible; second 16 are h3600_tsraw */ #define TSDEV_MINOR_MASK 15 @@ -48,6 +48,7 @@ #include #include #include +#include #include #include #include @@ -156,8 +157,9 @@ static int tsdev_open(struct inode *inode, struct file *file) if (i >= TSDEV_MINORS || !tsdev_table[i & TSDEV_MINOR_MASK]) return -ENODEV; - if (!(list = kzalloc(sizeof(struct tsdev_list), GFP_KERNEL))) + if (!(list = kmalloc(sizeof(struct tsdev_list), GFP_KERNEL))) return -ENOMEM; + memset(list, 0, sizeof(struct tsdev_list)); list->raw = (i >= TSDEV_MINORS/2) ? 1 : 0; @@ -229,7 +231,6 @@ static ssize_t tsdev_read(struct file *file, char __user *buffer, size_t count, static unsigned int tsdev_poll(struct file *file, poll_table * wait) { struct tsdev_list *list = file->private_data; - poll_wait(file, &list->tsdev->wait, wait); return ((list->head == list->tail) ? 0 : (POLLIN | POLLRDNORM)) | (list->tsdev->exist ? 0 : (POLLHUP | POLLERR)); @@ -248,13 +249,11 @@ static int tsdev_ioctl(struct inode *inode, struct file *file, sizeof (struct ts_calibration))) retval = -EFAULT; break; - case TS_SET_CAL: if (copy_from_user (&tsdev->cal, (void __user *)arg, sizeof (struct ts_calibration))) retval = -EFAULT; break; - default: retval = -EINVAL; break; @@ -286,11 +285,9 @@ static void tsdev_event(struct input_handle *handle, unsigned int type, case ABS_X: tsdev->x = value; break; - case ABS_Y: tsdev->y = value; break; - case ABS_PRESSURE: if (value > handle->dev->absmax[ABS_PRESSURE]) value = handle->dev->absmax[ABS_PRESSURE]; @@ -311,7 +308,6 @@ static void tsdev_event(struct input_handle *handle, unsigned int type, else if (tsdev->x > xres) tsdev->x = xres; break; - case REL_Y: tsdev->y += value; if (tsdev->y < 0) @@ -328,7 +324,6 @@ static void tsdev_event(struct input_handle *handle, unsigned int type, case 0: tsdev->pressure = 0; break; - case 1: if (!tsdev->pressure) tsdev->pressure = 1; @@ -376,15 +371,17 @@ static struct input_handle *tsdev_connect(struct input_handler *handler, struct class_device *cdev; int minor, delta; - for (minor = 0; minor < TSDEV_MINORS / 2 && tsdev_table[minor]; minor++); - if (minor >= TSDEV_MINORS / 2) { + for (minor = 0; minor < TSDEV_MINORS/2 && tsdev_table[minor]; + minor++); + if (minor >= TSDEV_MINORS/2) { printk(KERN_ERR "tsdev: You have way too many touchscreens\n"); return NULL; } - if (!(tsdev = kzalloc(sizeof(struct tsdev), GFP_KERNEL))) + if (!(tsdev = kmalloc(sizeof(struct tsdev), GFP_KERNEL))) return NULL; + memset(tsdev, 0, sizeof(struct tsdev)); INIT_LIST_HEAD(&tsdev->list); init_waitqueue_head(&tsdev->wait); @@ -449,22 +446,22 @@ static struct input_device_id tsdev_ids[] = { .evbit = { BIT(EV_KEY) | BIT(EV_REL) }, .keybit = { [LONG(BTN_LEFT)] = BIT(BTN_LEFT) }, .relbit = { BIT(REL_X) | BIT(REL_Y) }, - }, /* A mouse like device, at least one button, two relative axes */ + },/* A mouse like device, at least one button, two relative axes */ { .flags = INPUT_DEVICE_ID_MATCH_EVBIT | INPUT_DEVICE_ID_MATCH_KEYBIT | INPUT_DEVICE_ID_MATCH_ABSBIT, .evbit = { BIT(EV_KEY) | BIT(EV_ABS) }, .keybit = { [LONG(BTN_TOUCH)] = BIT(BTN_TOUCH) }, .absbit = { BIT(ABS_X) | BIT(ABS_Y) }, - }, /* A tablet like device, at least touch detection, two absolute axes */ + },/* A tablet like device, at least touch detection, two absolute axes */ { .flags = INPUT_DEVICE_ID_MATCH_EVBIT | INPUT_DEVICE_ID_MATCH_ABSBIT, .evbit = { BIT(EV_ABS) }, .absbit = { BIT(ABS_X) | BIT(ABS_Y) | BIT(ABS_PRESSURE) }, - }, /* A tablet like device with several gradations of pressure */ + },/* A tablet like device with several gradations of pressure */ - {} /* Terminating entry */ + {},/* Terminating entry */ }; MODULE_DEVICE_TABLE(input, tsdev_ids); diff --git a/drivers/isdn/Makefile b/drivers/isdn/Makefile index 988142c30..03d8ccd51 100644 --- a/drivers/isdn/Makefile +++ b/drivers/isdn/Makefile @@ -13,4 +13,3 @@ obj-$(CONFIG_ISDN_DRV_SC) += sc/ obj-$(CONFIG_ISDN_DRV_LOOP) += isdnloop/ obj-$(CONFIG_ISDN_DRV_ACT2000) += act2000/ obj-$(CONFIG_HYSDN) += hysdn/ -obj-$(CONFIG_ISDN_DRV_GIGASET) += gigaset/ diff --git a/drivers/isdn/capi/capi.c b/drivers/isdn/capi/capi.c index 669f76393..623adbb0d 100644 --- a/drivers/isdn/capi/capi.c +++ b/drivers/isdn/capi/capi.c @@ -9,6 +9,7 @@ * */ +#include #include #include #include @@ -38,6 +39,7 @@ #include #include #include +#include #include #include #if defined(CONFIG_ISDN_CAPI_CAPIFS) || defined(CONFIG_ISDN_CAPI_CAPIFS_MODULE) @@ -85,11 +87,6 @@ struct capincci; #ifdef CONFIG_ISDN_CAPI_MIDDLEWARE struct capiminor; -struct datahandle_queue { - struct list_head list; - u16 datahandle; -}; - struct capiminor { struct list_head list; struct capincci *nccip; @@ -112,9 +109,12 @@ struct capiminor { int outbytes; /* transmit path */ - struct list_head ackqueue; + struct datahandle_queue { + struct datahandle_queue *next; + u16 datahandle; + } *ackqueue; int nack; - spinlock_t ackqlock; + }; #endif /* CONFIG_ISDN_CAPI_MIDDLEWARE */ @@ -156,54 +156,48 @@ static LIST_HEAD(capiminor_list); static int capincci_add_ack(struct capiminor *mp, u16 datahandle) { - struct datahandle_queue *n; - unsigned long flags; + struct datahandle_queue *n, **pp; n = kmalloc(sizeof(*n), GFP_ATOMIC); - if (unlikely(!n)) { - printk(KERN_ERR "capi: alloc datahandle failed\n"); - return -1; + if (!n) { + printk(KERN_ERR "capi: alloc datahandle failed\n"); + return -1; } + n->next = NULL; n->datahandle = datahandle; - INIT_LIST_HEAD(&n->list); - spin_lock_irqsave(&mp->ackqlock, flags); - list_add_tail(&n->list, &mp->ackqueue); + for (pp = &mp->ackqueue; *pp; pp = &(*pp)->next) ; + *pp = n; mp->nack++; - spin_unlock_irqrestore(&mp->ackqlock, flags); return 0; } static int capiminor_del_ack(struct capiminor *mp, u16 datahandle) { - struct datahandle_queue *p, *tmp; - unsigned long flags; + struct datahandle_queue **pp, *p; - spin_lock_irqsave(&mp->ackqlock, flags); - list_for_each_entry_safe(p, tmp, &mp->ackqueue, list) { - if (p->datahandle == datahandle) { - list_del(&p->list); + for (pp = &mp->ackqueue; *pp; pp = &(*pp)->next) { + if ((*pp)->datahandle == datahandle) { + p = *pp; + *pp = (*pp)->next; kfree(p); mp->nack--; - spin_unlock_irqrestore(&mp->ackqlock, flags); return 0; } } - spin_unlock_irqrestore(&mp->ackqlock, flags); return -1; } static void capiminor_del_all_ack(struct capiminor *mp) { - struct datahandle_queue *p, *tmp; - unsigned long flags; + struct datahandle_queue **pp, *p; - spin_lock_irqsave(&mp->ackqlock, flags); - list_for_each_entry_safe(p, tmp, &mp->ackqueue, list) { - list_del(&p->list); + pp = &mp->ackqueue; + while (*pp) { + p = *pp; + *pp = (*pp)->next; kfree(p); mp->nack--; } - spin_unlock_irqrestore(&mp->ackqlock, flags); } @@ -226,8 +220,6 @@ static struct capiminor *capiminor_alloc(struct capi20_appl *ap, u32 ncci) mp->ncci = ncci; mp->msgid = 0; atomic_set(&mp->ttyopencount,0); - INIT_LIST_HEAD(&mp->ackqueue); - spin_lock_init(&mp->ackqlock); skb_queue_head_init(&mp->inqueue); skb_queue_head_init(&mp->outqueue); @@ -1335,6 +1327,7 @@ static int capinc_tty_init(void) drv->owner = THIS_MODULE; drv->driver_name = "capi_nc"; + drv->devfs_name = "capi/"; drv->name = "capi"; drv->major = capi_ttymajor; drv->minor_start = 0; @@ -1492,7 +1485,6 @@ static int __init capi_init(void) { char *p; char *compileinfo; - int major_ret; if ((p = strchr(revision, ':')) != 0 && p[1]) { strlcpy(rev, p + 2, sizeof(rev)); @@ -1501,11 +1493,11 @@ static int __init capi_init(void) } else strcpy(rev, "1.0"); - major_ret = register_chrdev(capi_major, "capi20", &capi_fops); - if (major_ret < 0) { + if (register_chrdev(capi_major, "capi20", &capi_fops)) { printk(KERN_ERR "capi20: unable to get major %d\n", capi_major); - return major_ret; + return -EIO; } + capi_class = class_create(THIS_MODULE, "capi"); if (IS_ERR(capi_class)) { unregister_chrdev(capi_major, "capi20"); @@ -1513,6 +1505,8 @@ static int __init capi_init(void) } class_device_create(capi_class, NULL, MKDEV(capi_major, 0), NULL, "capi"); + devfs_mk_cdev(MKDEV(capi_major, 0), S_IFCHR | S_IRUSR | S_IWUSR, + "isdn/capi20"); #ifdef CONFIG_ISDN_CAPI_MIDDLEWARE if (capinc_tty_init() < 0) { @@ -1547,6 +1541,7 @@ static void __exit capi_exit(void) class_device_destroy(capi_class, MKDEV(capi_major, 0)); class_destroy(capi_class); unregister_chrdev(capi_major, "capi20"); + devfs_remove("isdn/capi20"); #ifdef CONFIG_ISDN_CAPI_MIDDLEWARE capinc_tty_exit(); diff --git a/drivers/isdn/capi/capidrv.c b/drivers/isdn/capi/capidrv.c index b6f9476c0..d10c8b82e 100644 --- a/drivers/isdn/capi/capidrv.c +++ b/drivers/isdn/capi/capidrv.c @@ -1907,8 +1907,7 @@ static int if_readstat(u8 __user *buf, int len, int id, int channel) } for (p=buf, count=0; count < len; p++, count++) { - if (put_user(*card->q931_read++, p)) - return -EFAULT; + put_user(*card->q931_read++, p); if (card->q931_read > card->q931_end) card->q931_read = card->q931_buf; } diff --git a/drivers/isdn/capi/capifs.c b/drivers/isdn/capi/capifs.c index 2dd1b57b0..0a37aded4 100644 --- a/drivers/isdn/capi/capifs.c +++ b/drivers/isdn/capi/capifs.c @@ -104,6 +104,7 @@ capifs_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; @@ -120,10 +121,10 @@ fail: return -ENOMEM; } -static int capifs_get_sb(struct file_system_type *fs_type, - int flags, const char *dev_name, void *data, struct vfsmount *mnt) +static struct super_block *capifs_get_sb(struct file_system_type *fs_type, + int flags, const char *dev_name, void *data) { - return get_sb_single(fs_type, flags, data, capifs_fill_super, mnt); + return get_sb_single(fs_type, flags, data, capifs_fill_super); } static struct file_system_type capifs_fs_type = { @@ -148,6 +149,7 @@ void capifs_new_ncci(unsigned int number, dev_t device) if (!inode) return; 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; diff --git a/drivers/isdn/capi/capiutil.c b/drivers/isdn/capi/capiutil.c index c1b21552f..e7cf6bc28 100644 --- a/drivers/isdn/capi/capiutil.c +++ b/drivers/isdn/capi/capiutil.c @@ -17,6 +17,7 @@ #include #include #include +#include #include /* from CAPI2.0 DDK AVM Berlin GmbH */ diff --git a/drivers/isdn/capi/kcapi.c b/drivers/isdn/capi/kcapi.c index 8c4fcb902..feec40cf5 100644 --- a/drivers/isdn/capi/kcapi.c +++ b/drivers/isdn/capi/kcapi.c @@ -32,7 +32,6 @@ #ifdef CONFIG_AVMB1_COMPAT #include #endif -#include static char *revision = "$Revision: 1.1.2.8 $"; @@ -67,7 +66,7 @@ LIST_HEAD(capi_drivers); DEFINE_RWLOCK(capi_drivers_list_lock); static DEFINE_RWLOCK(application_lock); -static DEFINE_MUTEX(controller_mutex); +static DECLARE_MUTEX(controller_sem); struct capi20_appl *capi_applications[CAPI_MAXAPPL]; struct capi_ctr *capi_cards[CAPI_MAXCONTR]; @@ -396,20 +395,20 @@ attach_capi_ctr(struct capi_ctr *card) { int i; - mutex_lock(&controller_mutex); + down(&controller_sem); for (i = 0; i < CAPI_MAXCONTR; i++) { if (capi_cards[i] == NULL) break; } if (i == CAPI_MAXCONTR) { - mutex_unlock(&controller_mutex); + up(&controller_sem); printk(KERN_ERR "kcapi: out of controller slots\n"); return -EBUSY; } capi_cards[i] = card; - mutex_unlock(&controller_mutex); + up(&controller_sem); card->nrecvctlpkt = 0; card->nrecvdatapkt = 0; @@ -532,13 +531,13 @@ u16 capi20_register(struct capi20_appl *ap) write_unlock_irqrestore(&application_lock, flags); - mutex_lock(&controller_mutex); + down(&controller_sem); for (i = 0; i < CAPI_MAXCONTR; i++) { if (!capi_cards[i] || capi_cards[i]->cardstate != CARD_RUNNING) continue; register_appl(capi_cards[i], applid, &ap->rparam); } - mutex_unlock(&controller_mutex); + up(&controller_sem); if (showcapimsgs & 1) { printk(KERN_DEBUG "kcapi: appl %d up\n", applid); @@ -561,13 +560,13 @@ u16 capi20_release(struct capi20_appl *ap) capi_applications[ap->applid - 1] = NULL; write_unlock_irqrestore(&application_lock, flags); - mutex_lock(&controller_mutex); + down(&controller_sem); for (i = 0; i < CAPI_MAXCONTR; i++) { if (!capi_cards[i] || capi_cards[i]->cardstate != CARD_RUNNING) continue; release_appl(capi_cards[i], ap->applid); } - mutex_unlock(&controller_mutex); + up(&controller_sem); flush_scheduled_work(); skb_queue_purge(&ap->recv_queue); diff --git a/drivers/isdn/capi/kcapi_proc.c b/drivers/isdn/capi/kcapi_proc.c index ca9dc00a4..2cc8b27e4 100644 --- a/drivers/isdn/capi/kcapi_proc.c +++ b/drivers/isdn/capi/kcapi_proc.c @@ -233,7 +233,7 @@ static struct file_operations proc_applstats_ops = { }; static void -create_seq_entry(char *name, mode_t mode, const struct file_operations *f) +create_seq_entry(char *name, mode_t mode, struct file_operations *f) { struct proc_dir_entry *entry; entry = create_proc_entry(name, mode, NULL); diff --git a/drivers/isdn/divert/divert_procfs.c b/drivers/isdn/divert/divert_procfs.c index 399b31611..1b37d86d5 100644 --- a/drivers/isdn/divert/divert_procfs.c +++ b/drivers/isdn/divert/divert_procfs.c @@ -9,6 +9,7 @@ * */ +#include #include #include #include diff --git a/drivers/isdn/divert/isdn_divert.c b/drivers/isdn/divert/isdn_divert.c index 1f5ebe9ee..f1a1f9a9b 100644 --- a/drivers/isdn/divert/isdn_divert.c +++ b/drivers/isdn/divert/isdn_divert.c @@ -592,7 +592,7 @@ static int put_address(char *st, u_char *p, int len) } /* put_address */ /*************************************/ -/* report a successful interrogation */ +/* report a succesfull interrogation */ /*************************************/ static int interrogate_success(isdn_ctrl *ic, struct call_struc *cs) { char *src = ic->parm.dss1_io.data; diff --git a/drivers/isdn/hardware/avm/avm_cs.c b/drivers/isdn/hardware/avm/avm_cs.c index 7bbfd85ab..2a2b03ff0 100644 --- a/drivers/isdn/hardware/avm/avm_cs.c +++ b/drivers/isdn/hardware/avm/avm_cs.c @@ -51,8 +51,8 @@ MODULE_LICENSE("GPL"); handler. */ -static int avmcs_config(struct pcmcia_device *link); -static void avmcs_release(struct pcmcia_device *link); +static void avmcs_config(dev_link_t *link); +static void avmcs_release(dev_link_t *link); /* The attach() and detach() entry points are used to create and destroy @@ -65,10 +65,10 @@ static void avmcs_detach(struct pcmcia_device *p_dev); /* A linked list of "instances" of the skeleton device. Each actual PCMCIA card corresponds to one device instance, and is described - by one struct pcmcia_device structure (defined in ds.h). + by one dev_link_t structure (defined in ds.h). You may not want to use a linked list for this -- for example, the - memory card driver uses an array of struct pcmcia_device pointers, where minor + memory card driver uses an array of dev_link_t pointers, where minor device numbers are used to derive the corresponding array index. */ @@ -78,7 +78,7 @@ static void avmcs_detach(struct pcmcia_device *p_dev); example, ethernet cards, modems). In other cases, there may be many actual or logical devices (SCSI adapters, memory cards with multiple partitions). The dev_node_t structures need to be kept - in a linked list starting at the 'dev' field of a struct pcmcia_device + in a linked list starting at the 'dev' field of a dev_link_t structure. We allocate them in the card's private data structure, because they generally can't be allocated dynamically. */ @@ -99,38 +99,54 @@ typedef struct local_info_t { ======================================================================*/ -static int avmcs_probe(struct pcmcia_device *p_dev) +static int avmcs_attach(struct pcmcia_device *p_dev) { + dev_link_t *link; local_info_t *local; + /* Initialize the dev_link_t structure */ + link = kmalloc(sizeof(struct dev_link_t), GFP_KERNEL); + if (!link) + goto err; + memset(link, 0, sizeof(struct dev_link_t)); + /* The io structure describes IO port mapping */ - p_dev->io.NumPorts1 = 16; - p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_8; - p_dev->io.NumPorts2 = 0; + link->io.NumPorts1 = 16; + link->io.Attributes1 = IO_DATA_PATH_WIDTH_8; + link->io.NumPorts2 = 0; /* Interrupt setup */ - p_dev->irq.Attributes = IRQ_TYPE_EXCLUSIVE; - p_dev->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING|IRQ_FIRST_SHARED; - - p_dev->irq.IRQInfo1 = IRQ_LEVEL_ID; + link->irq.Attributes = IRQ_TYPE_EXCLUSIVE; + link->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING|IRQ_FIRST_SHARED; + link->irq.IRQInfo1 = IRQ_LEVEL_ID; + /* General socket configuration */ - p_dev->conf.Attributes = CONF_ENABLE_IRQ; - p_dev->conf.IntType = INT_MEMORY_AND_IO; - p_dev->conf.ConfigIndex = 1; - p_dev->conf.Present = PRESENT_OPTION; + link->conf.Attributes = CONF_ENABLE_IRQ; + link->conf.Vcc = 50; + link->conf.IntType = INT_MEMORY_AND_IO; + link->conf.ConfigIndex = 1; + link->conf.Present = PRESENT_OPTION; /* Allocate space for private device-specific data */ local = kmalloc(sizeof(local_info_t), GFP_KERNEL); if (!local) - goto err; + goto err_kfree; memset(local, 0, sizeof(local_info_t)); - p_dev->priv = local; + link->priv = local; - return avmcs_config(p_dev); + link->handle = p_dev; + p_dev->instance = link; + link->state |= DEV_PRESENT | DEV_CONFIG_PENDING; + avmcs_config(link); + + return 0; + + err_kfree: + kfree(link); err: - return -ENOMEM; + return -EINVAL; } /* avmcs_attach */ /*====================================================================== @@ -142,10 +158,15 @@ static int avmcs_probe(struct pcmcia_device *p_dev) ======================================================================*/ -static void avmcs_detach(struct pcmcia_device *link) +static void avmcs_detach(struct pcmcia_device *p_dev) { + dev_link_t *link = dev_to_instance(p_dev); + + if (link->state & DEV_CONFIG) avmcs_release(link); - kfree(link->priv); + + kfree(link->priv); + kfree(link); } /* avmcs_detach */ /*====================================================================== @@ -156,7 +177,7 @@ static void avmcs_detach(struct pcmcia_device *link) ======================================================================*/ -static int get_tuple(struct pcmcia_device *handle, tuple_t *tuple, +static int get_tuple(client_handle_t handle, tuple_t *tuple, cisparse_t *parse) { int i = pcmcia_get_tuple_data(handle, tuple); @@ -164,7 +185,7 @@ static int get_tuple(struct pcmcia_device *handle, tuple_t *tuple, return pcmcia_parse_tuple(handle, tuple, parse); } -static int first_tuple(struct pcmcia_device *handle, tuple_t *tuple, +static int first_tuple(client_handle_t handle, tuple_t *tuple, cisparse_t *parse) { int i = pcmcia_get_first_tuple(handle, tuple); @@ -172,7 +193,7 @@ static int first_tuple(struct pcmcia_device *handle, tuple_t *tuple, return get_tuple(handle, tuple, parse); } -static int next_tuple(struct pcmcia_device *handle, tuple_t *tuple, +static int next_tuple(client_handle_t handle, tuple_t *tuple, cisparse_t *parse) { int i = pcmcia_get_next_tuple(handle, tuple); @@ -180,8 +201,9 @@ static int next_tuple(struct pcmcia_device *handle, tuple_t *tuple, return get_tuple(handle, tuple, parse); } -static int avmcs_config(struct pcmcia_device *link) +static void avmcs_config(dev_link_t *link) { + client_handle_t handle; tuple_t tuple; cisparse_t parse; cistpl_cftable_entry_t *cf = &parse.cftable_entry; @@ -191,7 +213,8 @@ static int avmcs_config(struct pcmcia_device *link) char devname[128]; int cardtype; int (*addcard)(unsigned int port, unsigned irq); - + + handle = link->handle; dev = link->priv; /* @@ -200,21 +223,25 @@ static int avmcs_config(struct pcmcia_device *link) */ do { tuple.DesiredTuple = CISTPL_CONFIG; - i = pcmcia_get_first_tuple(link, &tuple); + i = pcmcia_get_first_tuple(handle, &tuple); if (i != CS_SUCCESS) break; tuple.TupleData = buf; tuple.TupleDataMax = 64; tuple.TupleOffset = 0; - i = pcmcia_get_tuple_data(link, &tuple); + i = pcmcia_get_tuple_data(handle, &tuple); if (i != CS_SUCCESS) break; - i = pcmcia_parse_tuple(link, &tuple, &parse); + i = pcmcia_parse_tuple(handle, &tuple, &parse); if (i != CS_SUCCESS) break; link->conf.ConfigBase = parse.config.base; } while (0); if (i != CS_SUCCESS) { - cs_error(link, ParseTuple, i); - return -ENODEV; + cs_error(link->handle, ParseTuple, i); + link->state &= ~DEV_CONFIG_PENDING; + return; } + + /* Configure card */ + link->state |= DEV_CONFIG; do { @@ -225,7 +252,7 @@ static int avmcs_config(struct pcmcia_device *link) tuple.DesiredTuple = CISTPL_VERS_1; devname[0] = 0; - if( !first_tuple(link, &tuple, &parse) && parse.version_1.ns > 1 ) { + if( !first_tuple(handle, &tuple, &parse) && parse.version_1.ns > 1 ) { strlcpy(devname,parse.version_1.str + parse.version_1.ofs[1], sizeof(devname)); } @@ -236,7 +263,7 @@ static int avmcs_config(struct pcmcia_device *link) tuple.TupleOffset = 0; tuple.TupleDataMax = 255; tuple.Attributes = 0; tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY; - i = first_tuple(link, &tuple, &parse); + i = first_tuple(handle, &tuple, &parse); while (i == CS_SUCCESS) { if (cf->io.nwin > 0) { link->conf.ConfigIndex = cf->index; @@ -246,36 +273,36 @@ static int avmcs_config(struct pcmcia_device *link) printk(KERN_INFO "avm_cs: testing i/o %#x-%#x\n", link->io.BasePort1, link->io.BasePort1+link->io.NumPorts1-1); - i = pcmcia_request_io(link, &link->io); + i = pcmcia_request_io(link->handle, &link->io); if (i == CS_SUCCESS) goto found_port; } - i = next_tuple(link, &tuple, &parse); + i = next_tuple(handle, &tuple, &parse); } found_port: if (i != CS_SUCCESS) { - cs_error(link, RequestIO, i); + cs_error(link->handle, RequestIO, i); break; } - + /* * allocate an interrupt line */ - i = pcmcia_request_irq(link, &link->irq); + i = pcmcia_request_irq(link->handle, &link->irq); if (i != CS_SUCCESS) { - cs_error(link, RequestIRQ, i); - /* undo */ - pcmcia_disable_device(link); + cs_error(link->handle, RequestIRQ, i); + pcmcia_release_io(link->handle, &link->io); break; } - + /* * configure the PCMCIA socket */ - i = pcmcia_request_configuration(link, &link->conf); + i = pcmcia_request_configuration(link->handle, &link->conf); if (i != CS_SUCCESS) { - cs_error(link, RequestConfiguration, i); - pcmcia_disable_device(link); + cs_error(link->handle, RequestConfiguration, i); + pcmcia_release_io(link->handle, &link->io); + pcmcia_release_irq(link->handle, &link->irq); break; } @@ -304,12 +331,13 @@ found_port: dev->node.major = 64; dev->node.minor = 0; - link->dev_node = &dev->node; - + link->dev = &dev->node; + + link->state &= ~DEV_CONFIG_PENDING; /* If any step failed, release any partially configured state */ if (i != 0) { avmcs_release(link); - return -ENODEV; + return; } @@ -323,10 +351,9 @@ found_port: printk(KERN_ERR "avm_cs: failed to add AVM-%s-Controller at i/o %#x, irq %d\n", dev->node.dev_name, link->io.BasePort1, link->irq.AssignedIRQ); avmcs_release(link); - return -ENODEV; + return; } dev->node.minor = i; - return 0; } /* avmcs_config */ @@ -338,12 +365,56 @@ found_port: ======================================================================*/ -static void avmcs_release(struct pcmcia_device *link) +static void avmcs_release(dev_link_t *link) { - b1pcmcia_delcard(link->io.BasePort1, link->irq.AssignedIRQ); - pcmcia_disable_device(link); + b1pcmcia_delcard(link->io.BasePort1, link->irq.AssignedIRQ); + + /* Unlink the device chain */ + link->dev = NULL; + + /* Don't bother checking to see if these succeed or not */ + pcmcia_release_configuration(link->handle); + pcmcia_release_io(link->handle, &link->io); + pcmcia_release_irq(link->handle, &link->irq); + link->state &= ~DEV_CONFIG; } /* avmcs_release */ +static int avmcs_suspend(struct pcmcia_device *dev) +{ + dev_link_t *link = dev_to_instance(dev); + + link->state |= DEV_SUSPEND; + if (link->state & DEV_CONFIG) + pcmcia_release_configuration(link->handle); + + return 0; +} + +static int avmcs_resume(struct pcmcia_device *dev) +{ + dev_link_t *link = dev_to_instance(dev); + + link->state &= ~DEV_SUSPEND; + if (link->state & DEV_CONFIG) + pcmcia_request_configuration(link->handle, &link->conf); + + return 0; +} + +/*====================================================================== + + The card status event handler. Mostly, this schedules other + stuff to run after an event is received. A CARD_REMOVAL event + also sets some flags to discourage the net drivers from trying + to talk to the card any more. + + When a CARD_REMOVAL event is received, we immediately set a flag + to block future accesses to this device. All the functions that + actually access the device should check this flag to make sure + the card is still present. + +======================================================================*/ + static struct pcmcia_device_id avmcs_ids[] = { PCMCIA_DEVICE_PROD_ID12("AVM", "ISDN-Controller B1", 0x95d42008, 0x845dc335), @@ -358,9 +429,11 @@ static struct pcmcia_driver avmcs_driver = { .drv = { .name = "avm_cs", }, - .probe = avmcs_probe, + .probe = avmcs_attach, .remove = avmcs_detach, .id_table = avmcs_ids, + .suspend= avmcs_suspend, + .resume = avmcs_resume, }; static int __init avmcs_init(void) diff --git a/drivers/isdn/hardware/avm/avmcard.h b/drivers/isdn/hardware/avm/avmcard.h index 3b431723c..296d6a6f7 100644 --- a/drivers/isdn/hardware/avm/avmcard.h +++ b/drivers/isdn/hardware/avm/avmcard.h @@ -437,7 +437,9 @@ static inline unsigned int t1_get_slice(unsigned int base, #endif dp += i; i = 0; - break; + if (i == 0) + break; + /* fall through */ default: *dp++ = b1_get_byte(base); i--; diff --git a/drivers/isdn/hardware/avm/b1dma.c b/drivers/isdn/hardware/avm/b1dma.c index a4beeb46c..91dd0551f 100644 --- a/drivers/isdn/hardware/avm/b1dma.c +++ b/drivers/isdn/hardware/avm/b1dma.c @@ -9,6 +9,7 @@ * */ +#include #include #include #include @@ -38,7 +39,7 @@ MODULE_AUTHOR("Carsten Paeth"); MODULE_LICENSE("GPL"); static int suppress_pollack = 0; -module_param(suppress_pollack, bool, 0); +MODULE_PARM(suppress_pollack, "0-1i"); /* ------------------------------------------------------------- */ diff --git a/drivers/isdn/hardware/avm/b1isa.c b/drivers/isdn/hardware/avm/b1isa.c index 80fb48884..38bd4dfec 100644 --- a/drivers/isdn/hardware/avm/b1isa.c +++ b/drivers/isdn/hardware/avm/b1isa.c @@ -169,8 +169,8 @@ static struct pci_dev isa_dev[MAX_CARDS]; static int io[MAX_CARDS]; static int irq[MAX_CARDS]; -module_param_array(io, int, NULL, 0); -module_param_array(irq, int, NULL, 0); +MODULE_PARM(io, "1-" __MODULE_STRING(MAX_CARDS) "i"); +MODULE_PARM(irq, "1-" __MODULE_STRING(MAX_CARDS) "i"); MODULE_PARM_DESC(io, "I/O base address(es)"); MODULE_PARM_DESC(irq, "IRQ number(s) (assigned)"); diff --git a/drivers/isdn/hardware/avm/b1pci.c b/drivers/isdn/hardware/avm/b1pci.c index 90e2e6643..5435a6cfb 100644 --- a/drivers/isdn/hardware/avm/b1pci.c +++ b/drivers/isdn/hardware/avm/b1pci.c @@ -9,6 +9,7 @@ * */ +#include #include #include #include @@ -97,7 +98,7 @@ static int b1pci_probe(struct capicardparams *p, struct pci_dev *pdev) b1_reset(card->port); b1_getrevision(card); - retval = request_irq(card->irq, b1_interrupt, IRQF_SHARED, card->name, card); + retval = request_irq(card->irq, b1_interrupt, SA_SHIRQ, card->name, card); if (retval) { printk(KERN_ERR "b1pci: unable to get IRQ %d.\n", card->irq); retval = -EBUSY; @@ -234,7 +235,7 @@ static int b1pciv4_probe(struct capicardparams *p, struct pci_dev *pdev) b1dma_reset(card); b1_getrevision(card); - retval = request_irq(card->irq, b1dma_interrupt, IRQF_SHARED, card->name, card); + retval = request_irq(card->irq, b1dma_interrupt, SA_SHIRQ, card->name, card); if (retval) { printk(KERN_ERR "b1pci: unable to get IRQ %d.\n", card->irq); diff --git a/drivers/isdn/hardware/avm/b1pcmcia.c b/drivers/isdn/hardware/avm/b1pcmcia.c index e479c0aef..9746cc5ff 100644 --- a/drivers/isdn/hardware/avm/b1pcmcia.c +++ b/drivers/isdn/hardware/avm/b1pcmcia.c @@ -82,7 +82,7 @@ static int b1pcmcia_add_card(unsigned int port, unsigned irq, card->irq = irq; card->cardtype = cardtype; - retval = request_irq(card->irq, b1_interrupt, IRQF_SHARED, card->name, card); + retval = request_irq(card->irq, b1_interrupt, 0, card->name, card); if (retval) { printk(KERN_ERR "b1pcmcia: unable to get IRQ %d.\n", card->irq); diff --git a/drivers/isdn/hardware/avm/c4.c b/drivers/isdn/hardware/avm/c4.c index 6c3d5f5f1..724aac2c1 100644 --- a/drivers/isdn/hardware/avm/c4.c +++ b/drivers/isdn/hardware/avm/c4.c @@ -9,6 +9,7 @@ * */ +#include #include #include #include @@ -49,7 +50,7 @@ MODULE_DEVICE_TABLE(pci, c4_pci_tbl); MODULE_DESCRIPTION("CAPI4Linux: Driver for AVM C2/C4 cards"); MODULE_AUTHOR("Carsten Paeth"); MODULE_LICENSE("GPL"); -module_param(suppress_pollack, bool, 0); +MODULE_PARM(suppress_pollack, "0-1i"); /* ------------------------------------------------------------- */ @@ -1172,7 +1173,7 @@ static int c4_add_card(struct capicardparams *p, struct pci_dev *dev, } c4_reset(card); - retval = request_irq(card->irq, c4_interrupt, IRQF_SHARED, card->name, card); + retval = request_irq(card->irq, c4_interrupt, SA_SHIRQ, card->name, card); if (retval) { printk(KERN_ERR "c4: unable to get IRQ %d.\n",card->irq); retval = -EBUSY; diff --git a/drivers/isdn/hardware/avm/t1isa.c b/drivers/isdn/hardware/avm/t1isa.c index 5a2f854d5..3b701d97b 100644 --- a/drivers/isdn/hardware/avm/t1isa.c +++ b/drivers/isdn/hardware/avm/t1isa.c @@ -519,9 +519,9 @@ static int io[MAX_CARDS]; static int irq[MAX_CARDS]; static int cardnr[MAX_CARDS]; -module_param_array(io, int, NULL, 0); -module_param_array(irq, int, NULL, 0); -module_param_array(cardnr, int, NULL, 0); +MODULE_PARM(io, "1-" __MODULE_STRING(MAX_CARDS) "i"); +MODULE_PARM(irq, "1-" __MODULE_STRING(MAX_CARDS) "i"); +MODULE_PARM(cardnr, "1-" __MODULE_STRING(MAX_CARDS) "i"); MODULE_PARM_DESC(io, "I/O base address(es)"); MODULE_PARM_DESC(irq, "IRQ number(s) (assigned)"); MODULE_PARM_DESC(cardnr, "Card number(s) (as jumpered)"); diff --git a/drivers/isdn/hardware/avm/t1pci.c b/drivers/isdn/hardware/avm/t1pci.c index d1e253c94..2ceec8e84 100644 --- a/drivers/isdn/hardware/avm/t1pci.c +++ b/drivers/isdn/hardware/avm/t1pci.c @@ -9,6 +9,7 @@ * */ +#include #include #include #include @@ -103,7 +104,7 @@ static int t1pci_add_card(struct capicardparams *p, struct pci_dev *pdev) } b1dma_reset(card); - retval = request_irq(card->irq, b1dma_interrupt, IRQF_SHARED, card->name, card); + retval = request_irq(card->irq, b1dma_interrupt, SA_SHIRQ, card->name, card); if (retval) { printk(KERN_ERR "t1pci: unable to get IRQ %d.\n", card->irq); retval = -EBUSY; diff --git a/drivers/isdn/hardware/eicon/capimain.c b/drivers/isdn/hardware/eicon/capimain.c index 7a74ed35b..8fe4f3f09 100644 --- a/drivers/isdn/hardware/eicon/capimain.c +++ b/drivers/isdn/hardware/eicon/capimain.c @@ -10,6 +10,7 @@ * of the GNU General Public License, incorporated herein by reference. */ +#include #include #include #include diff --git a/drivers/isdn/hardware/eicon/diva_didd.c b/drivers/isdn/hardware/eicon/diva_didd.c index 14298b8c8..27204f4b1 100644 --- a/drivers/isdn/hardware/eicon/diva_didd.c +++ b/drivers/isdn/hardware/eicon/diva_didd.c @@ -11,6 +11,7 @@ * of the GNU General Public License, incorporated herein by reference. */ +#include #include #include #include diff --git a/drivers/isdn/hardware/eicon/divamnt.c b/drivers/isdn/hardware/eicon/divamnt.c index 77155d9f3..6146f7633 100644 --- a/drivers/isdn/hardware/eicon/divamnt.c +++ b/drivers/isdn/hardware/eicon/divamnt.c @@ -10,12 +10,14 @@ * of the GNU General Public License, incorporated herein by reference. */ +#include #include #include #include #include #include #include +#include #include #include "platform.h" @@ -176,6 +178,7 @@ static struct file_operations divas_maint_fops = { static void divas_maint_unregister_chrdev(void) { + devfs_remove(DEVNAME); unregister_chrdev(major, DEVNAME); } @@ -187,6 +190,7 @@ static int DIVA_INIT_FUNCTION divas_maint_register_chrdev(void) DRIVERLNAME); return (0); } + devfs_mk_cdev(MKDEV(major, 0), S_IFCHR|S_IRUSR|S_IWUSR, DEVNAME); return (1); } diff --git a/drivers/isdn/hardware/eicon/divasi.c b/drivers/isdn/hardware/eicon/divasi.c index fff0d89c8..df715b47e 100644 --- a/drivers/isdn/hardware/eicon/divasi.c +++ b/drivers/isdn/hardware/eicon/divasi.c @@ -10,6 +10,7 @@ * of the GNU General Public License, incorporated herein by reference. */ +#include #include #include #include @@ -18,6 +19,7 @@ #include #include #include +#include #include #include "platform.h" @@ -143,6 +145,7 @@ static struct file_operations divas_idi_fops = { static void divas_idi_unregister_chrdev(void) { + devfs_remove(DEVNAME); unregister_chrdev(major, DEVNAME); } @@ -154,6 +157,7 @@ static int DIVA_INIT_FUNCTION divas_idi_register_chrdev(void) DRIVERLNAME); return (0); } + devfs_mk_cdev(MKDEV(major, 0), S_IFCHR|S_IRUSR|S_IWUSR, DEVNAME); return (1); } diff --git a/drivers/isdn/hardware/eicon/divasmain.c b/drivers/isdn/hardware/eicon/divasmain.c index b7dadba13..c9b26e86d 100644 --- a/drivers/isdn/hardware/eicon/divasmain.c +++ b/drivers/isdn/hardware/eicon/divasmain.c @@ -9,10 +9,12 @@ * of the GNU General Public License, incorporated herein by reference. */ +#include #include #include #include #include +#include #include #include #include @@ -486,7 +488,7 @@ void __inline__ outpp(void __iomem *addr, word p) int diva_os_register_irq(void *context, byte irq, const char *name) { int result = request_irq(irq, diva_os_irq_wrapper, - IRQF_DISABLED | IRQF_SHARED, name, context); + SA_INTERRUPT | SA_SHIRQ, name, context); return (result); } @@ -676,6 +678,7 @@ static struct file_operations divas_fops = { static void divas_unregister_chrdev(void) { + devfs_remove(DEVNAME); unregister_chrdev(major, DEVNAME); } @@ -687,6 +690,7 @@ static int DIVA_INIT_FUNCTION divas_register_chrdev(void) DRIVERLNAME); return (0); } + devfs_mk_cdev(MKDEV(major, 0), S_IFCHR|S_IRUSR|S_IWUSR, DEVNAME); return (1); } diff --git a/drivers/isdn/hardware/eicon/divasproc.c b/drivers/isdn/hardware/eicon/divasproc.c index 6a4373a4f..c12efa6f8 100644 --- a/drivers/isdn/hardware/eicon/divasproc.c +++ b/drivers/isdn/hardware/eicon/divasproc.c @@ -10,6 +10,7 @@ * of the GNU General Public License, incorporated herein by reference. */ +#include #include #include #include diff --git a/drivers/isdn/hardware/eicon/platform.h b/drivers/isdn/hardware/eicon/platform.h index a66836cf7..12b8ff29e 100644 --- a/drivers/isdn/hardware/eicon/platform.h +++ b/drivers/isdn/hardware/eicon/platform.h @@ -18,6 +18,7 @@ #define DIVA_BUILD "local" #endif +#include #include #include #include diff --git a/drivers/isdn/hisax/asuscom.c b/drivers/isdn/hisax/asuscom.c index 93ff941c4..a98c5e38b 100644 --- a/drivers/isdn/hisax/asuscom.c +++ b/drivers/isdn/hisax/asuscom.c @@ -297,7 +297,7 @@ Asus_card_msg(struct IsdnCardState *cs, int mt, void *arg) } #ifdef __ISAPNP__ -static struct isapnp_device_id asus_ids[] __devinitdata = { +static struct isapnp_device_id asus_ids[] __initdata = { { ISAPNP_VENDOR('A', 'S', 'U'), ISAPNP_FUNCTION(0x1688), ISAPNP_VENDOR('A', 'S', 'U'), ISAPNP_FUNCTION(0x1688), (unsigned long) "Asus1688 PnP" }, @@ -313,11 +313,11 @@ static struct isapnp_device_id asus_ids[] __devinitdata = { { 0, } }; -static struct isapnp_device_id *ipid __devinitdata = &asus_ids[0]; +static struct isapnp_device_id *ipid __initdata = &asus_ids[0]; static struct pnp_card *pnp_c __devinitdata = NULL; #endif -int __devinit +int __init setup_asuscom(struct IsdnCard *card) { int bytecnt; diff --git a/drivers/isdn/hisax/avm_a1.c b/drivers/isdn/hisax/avm_a1.c index 729e906bd..9a8b02557 100644 --- a/drivers/isdn/hisax/avm_a1.c +++ b/drivers/isdn/hisax/avm_a1.c @@ -178,7 +178,7 @@ AVM_card_msg(struct IsdnCardState *cs, int mt, void *arg) return(0); } -int __devinit +int __init setup_avm_a1(struct IsdnCard *card) { u_char val; diff --git a/drivers/isdn/hisax/avm_a1p.c b/drivers/isdn/hisax/avm_a1p.c index 574e252df..d643bb32a 100644 --- a/drivers/isdn/hisax/avm_a1p.c +++ b/drivers/isdn/hisax/avm_a1p.c @@ -255,7 +255,7 @@ setup_avm_a1_pcmcia(struct IsdnCard *card) cs->BC_Write_Reg = &WriteHSCX; cs->BC_Send_Data = &hscx_fill_fifo; cs->cardmsg = &AVM_card_msg; - cs->irq_flags = IRQF_SHARED; + cs->irq_flags = SA_SHIRQ; cs->irq_func = &avm_a1p_interrupt; ISACVersion(cs, "AVM A1 PCMCIA:"); diff --git a/drivers/isdn/hisax/avm_pci.c b/drivers/isdn/hisax/avm_pci.c index 369afd3a3..4abe5ff10 100644 --- a/drivers/isdn/hisax/avm_pci.c +++ b/drivers/isdn/hisax/avm_pci.c @@ -12,6 +12,7 @@ * */ +#include #include #include "hisax.h" #include "isac.h" @@ -639,7 +640,7 @@ clear_pending_hdlc_ints(struct IsdnCardState *cs) } #endif /* 0 */ -static void +static void __init inithdlc(struct IsdnCardState *cs) { cs->bcs[0].BC_SetStack = setstack_hdlc; @@ -727,13 +728,13 @@ AVM_card_msg(struct IsdnCardState *cs, int mt, void *arg) } #ifdef CONFIG_PCI -static struct pci_dev *dev_avm __devinitdata = NULL; +static struct pci_dev *dev_avm __initdata = NULL; #endif #ifdef __ISAPNP__ -static struct pnp_card *pnp_avm_c __devinitdata = NULL; +static struct pnp_card *pnp_avm_c __initdata = NULL; #endif -int __devinit +int __init setup_avm_pcipnp(struct IsdnCard *card) { u_int val, ver; @@ -808,7 +809,7 @@ setup_avm_pcipnp(struct IsdnCard *card) printk(KERN_WARNING "FritzPCI: No PCI card found\n"); return(0); } - cs->irq_flags |= IRQF_SHARED; + cs->irq_flags |= SA_SHIRQ; #else printk(KERN_WARNING "FritzPCI: NO_PCI_BIOS\n"); return (0); diff --git a/drivers/isdn/hisax/avma1_cs.c b/drivers/isdn/hisax/avma1_cs.c index ac28e3278..969da40c4 100644 --- a/drivers/isdn/hisax/avma1_cs.c +++ b/drivers/isdn/hisax/avma1_cs.c @@ -67,8 +67,8 @@ module_param(isdnprot, int, 0); handler. */ -static int avma1cs_config(struct pcmcia_device *link); -static void avma1cs_release(struct pcmcia_device *link); +static void avma1cs_config(dev_link_t *link); +static void avma1cs_release(dev_link_t *link); /* The attach() and detach() entry points are used to create and destroy @@ -82,10 +82,10 @@ static void avma1cs_detach(struct pcmcia_device *p_dev); /* A linked list of "instances" of the skeleton device. Each actual PCMCIA card corresponds to one device instance, and is described - by one struct pcmcia_device structure (defined in ds.h). + by one dev_link_t structure (defined in ds.h). You may not want to use a linked list for this -- for example, the - memory card driver uses an array of struct pcmcia_device pointers, where minor + memory card driver uses an array of dev_link_t pointers, where minor device numbers are used to derive the corresponding array index. */ @@ -95,7 +95,7 @@ static void avma1cs_detach(struct pcmcia_device *p_dev); example, ethernet cards, modems). In other cases, there may be many actual or logical devices (SCSI adapters, memory cards with multiple partitions). The dev_node_t structures need to be kept - in a linked list starting at the 'dev' field of a struct pcmcia_device + in a linked list starting at the 'dev' field of a dev_link_t structure. We allocate them in the card's private data structure, because they generally can't be allocated dynamically. */ @@ -116,40 +116,55 @@ typedef struct local_info_t { ======================================================================*/ -static int avma1cs_probe(struct pcmcia_device *p_dev) +static int avma1cs_attach(struct pcmcia_device *p_dev) { + dev_link_t *link; local_info_t *local; DEBUG(0, "avma1cs_attach()\n"); + /* Initialize the dev_link_t structure */ + link = kmalloc(sizeof(struct dev_link_t), GFP_KERNEL); + if (!link) + return -ENOMEM; + memset(link, 0, sizeof(struct dev_link_t)); + /* Allocate space for private device-specific data */ local = kmalloc(sizeof(local_info_t), GFP_KERNEL); - if (!local) + if (!local) { + kfree(link); return -ENOMEM; - + } memset(local, 0, sizeof(local_info_t)); - p_dev->priv = local; + link->priv = local; /* The io structure describes IO port mapping */ - p_dev->io.NumPorts1 = 16; - p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_8; - p_dev->io.NumPorts2 = 16; - p_dev->io.Attributes2 = IO_DATA_PATH_WIDTH_16; - p_dev->io.IOAddrLines = 5; + link->io.NumPorts1 = 16; + link->io.Attributes1 = IO_DATA_PATH_WIDTH_8; + link->io.NumPorts2 = 16; + link->io.Attributes2 = IO_DATA_PATH_WIDTH_16; + link->io.IOAddrLines = 5; /* Interrupt setup */ - p_dev->irq.Attributes = IRQ_TYPE_EXCLUSIVE; - p_dev->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING|IRQ_FIRST_SHARED; + link->irq.Attributes = IRQ_TYPE_EXCLUSIVE; + link->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING|IRQ_FIRST_SHARED; - p_dev->irq.IRQInfo1 = IRQ_LEVEL_ID; + link->irq.IRQInfo1 = IRQ_LEVEL_ID; /* General socket configuration */ - p_dev->conf.Attributes = CONF_ENABLE_IRQ; - p_dev->conf.IntType = INT_MEMORY_AND_IO; - p_dev->conf.ConfigIndex = 1; - p_dev->conf.Present = PRESENT_OPTION; + link->conf.Attributes = CONF_ENABLE_IRQ; + link->conf.Vcc = 50; + link->conf.IntType = INT_MEMORY_AND_IO; + link->conf.ConfigIndex = 1; + link->conf.Present = PRESENT_OPTION; - return avma1cs_config(p_dev); + link->handle = p_dev; + p_dev->instance = link; + + link->state |= DEV_PRESENT | DEV_CONFIG_PENDING; + avma1cs_config(link); + + return 0; } /* avma1cs_attach */ /*====================================================================== @@ -161,11 +176,17 @@ static int avma1cs_probe(struct pcmcia_device *p_dev) ======================================================================*/ -static void avma1cs_detach(struct pcmcia_device *link) +static void avma1cs_detach(struct pcmcia_device *p_dev) { - DEBUG(0, "avma1cs_detach(0x%p)\n", link); - avma1cs_release(link); - kfree(link->priv); + dev_link_t *link = dev_to_instance(p_dev); + + DEBUG(0, "avma1cs_detach(0x%p)\n", link); + + if (link->state & DEV_CONFIG) + avma1cs_release(link); + + kfree(link->priv); + kfree(link); } /* avma1cs_detach */ /*====================================================================== @@ -176,7 +197,7 @@ static void avma1cs_detach(struct pcmcia_device *link) ======================================================================*/ -static int get_tuple(struct pcmcia_device *handle, tuple_t *tuple, +static int get_tuple(client_handle_t handle, tuple_t *tuple, cisparse_t *parse) { int i = pcmcia_get_tuple_data(handle, tuple); @@ -184,7 +205,7 @@ static int get_tuple(struct pcmcia_device *handle, tuple_t *tuple, return pcmcia_parse_tuple(handle, tuple, parse); } -static int first_tuple(struct pcmcia_device *handle, tuple_t *tuple, +static int first_tuple(client_handle_t handle, tuple_t *tuple, cisparse_t *parse) { int i = pcmcia_get_first_tuple(handle, tuple); @@ -192,7 +213,7 @@ static int first_tuple(struct pcmcia_device *handle, tuple_t *tuple, return get_tuple(handle, tuple, parse); } -static int next_tuple(struct pcmcia_device *handle, tuple_t *tuple, +static int next_tuple(client_handle_t handle, tuple_t *tuple, cisparse_t *parse) { int i = pcmcia_get_next_tuple(handle, tuple); @@ -200,8 +221,9 @@ static int next_tuple(struct pcmcia_device *handle, tuple_t *tuple, return get_tuple(handle, tuple, parse); } -static int avma1cs_config(struct pcmcia_device *link) +static void avma1cs_config(dev_link_t *link) { + client_handle_t handle; tuple_t tuple; cisparse_t parse; cistpl_cftable_entry_t *cf = &parse.cftable_entry; @@ -211,7 +233,8 @@ static int avma1cs_config(struct pcmcia_device *link) char devname[128]; IsdnCard_t icard; int busy = 0; - + + handle = link->handle; dev = link->priv; DEBUG(0, "avma1cs_config(0x%p)\n", link); @@ -222,21 +245,25 @@ static int avma1cs_config(struct pcmcia_device *link) */ do { tuple.DesiredTuple = CISTPL_CONFIG; - i = pcmcia_get_first_tuple(link, &tuple); + i = pcmcia_get_first_tuple(handle, &tuple); if (i != CS_SUCCESS) break; tuple.TupleData = buf; tuple.TupleDataMax = 64; tuple.TupleOffset = 0; - i = pcmcia_get_tuple_data(link, &tuple); + i = pcmcia_get_tuple_data(handle, &tuple); if (i != CS_SUCCESS) break; - i = pcmcia_parse_tuple(link, &tuple, &parse); + i = pcmcia_parse_tuple(handle, &tuple, &parse); if (i != CS_SUCCESS) break; link->conf.ConfigBase = parse.config.base; } while (0); if (i != CS_SUCCESS) { - cs_error(link, ParseTuple, i); - return -ENODEV; + cs_error(link->handle, ParseTuple, i); + link->state &= ~DEV_CONFIG_PENDING; + return; } + + /* Configure card */ + link->state |= DEV_CONFIG; do { @@ -247,7 +274,7 @@ static int avma1cs_config(struct pcmcia_device *link) tuple.DesiredTuple = CISTPL_VERS_1; devname[0] = 0; - if( !first_tuple(link, &tuple, &parse) && parse.version_1.ns > 1 ) { + if( !first_tuple(handle, &tuple, &parse) && parse.version_1.ns > 1 ) { strlcpy(devname,parse.version_1.str + parse.version_1.ofs[1], sizeof(devname)); } @@ -258,7 +285,7 @@ static int avma1cs_config(struct pcmcia_device *link) tuple.TupleOffset = 0; tuple.TupleDataMax = 255; tuple.Attributes = 0; tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY; - i = first_tuple(link, &tuple, &parse); + i = first_tuple(handle, &tuple, &parse); while (i == CS_SUCCESS) { if (cf->io.nwin > 0) { link->conf.ConfigIndex = cf->index; @@ -268,36 +295,36 @@ static int avma1cs_config(struct pcmcia_device *link) printk(KERN_INFO "avma1_cs: testing i/o %#x-%#x\n", link->io.BasePort1, link->io.BasePort1+link->io.NumPorts1 - 1); - i = pcmcia_request_io(link, &link->io); + i = pcmcia_request_io(link->handle, &link->io); if (i == CS_SUCCESS) goto found_port; } - i = next_tuple(link, &tuple, &parse); + i = next_tuple(handle, &tuple, &parse); } found_port: if (i != CS_SUCCESS) { - cs_error(link, RequestIO, i); + cs_error(link->handle, RequestIO, i); break; } /* * allocate an interrupt line */ - i = pcmcia_request_irq(link, &link->irq); + i = pcmcia_request_irq(link->handle, &link->irq); if (i != CS_SUCCESS) { - cs_error(link, RequestIRQ, i); - /* undo */ - pcmcia_disable_device(link); + cs_error(link->handle, RequestIRQ, i); + pcmcia_release_io(link->handle, &link->io); break; } - + /* * configure the PCMCIA socket */ - i = pcmcia_request_configuration(link, &link->conf); + i = pcmcia_request_configuration(link->handle, &link->conf); if (i != CS_SUCCESS) { - cs_error(link, RequestConfiguration, i); - pcmcia_disable_device(link); + cs_error(link->handle, RequestConfiguration, i); + pcmcia_release_io(link->handle, &link->io); + pcmcia_release_irq(link->handle, &link->irq); break; } @@ -309,12 +336,13 @@ found_port: strcpy(dev->node.dev_name, "A1"); dev->node.major = 45; dev->node.minor = 0; - link->dev_node = &dev->node; - + link->dev = &dev->node; + + link->state &= ~DEV_CONFIG_PENDING; /* If any step failed, release any partially configured state */ if (i != 0) { avma1cs_release(link); - return -ENODEV; + return; } printk(KERN_NOTICE "avma1_cs: checking at i/o %#x, irq %d\n", @@ -329,11 +357,10 @@ found_port: if (i < 0) { printk(KERN_ERR "avma1_cs: failed to initialize AVM A1 PCMCIA %d at i/o %#x\n", i, link->io.BasePort1); avma1cs_release(link); - return -ENODEV; + return; } dev->node.minor = i; - return 0; } /* avma1cs_config */ /*====================================================================== @@ -344,18 +371,47 @@ found_port: ======================================================================*/ -static void avma1cs_release(struct pcmcia_device *link) +static void avma1cs_release(dev_link_t *link) { - local_info_t *local = link->priv; + local_info_t *local = link->priv; - DEBUG(0, "avma1cs_release(0x%p)\n", link); + DEBUG(0, "avma1cs_release(0x%p)\n", link); - /* now unregister function with hisax */ - HiSax_closecard(local->node.minor); + /* no unregister function with hisax */ + HiSax_closecard(local->node.minor); - pcmcia_disable_device(link); + /* Unlink the device chain */ + link->dev = NULL; + + /* Don't bother checking to see if these succeed or not */ + pcmcia_release_configuration(link->handle); + pcmcia_release_io(link->handle, &link->io); + pcmcia_release_irq(link->handle, &link->irq); + link->state &= ~DEV_CONFIG; } /* avma1cs_release */ +static int avma1cs_suspend(struct pcmcia_device *dev) +{ + dev_link_t *link = dev_to_instance(dev); + + link->state |= DEV_SUSPEND; + if (link->state & DEV_CONFIG) + pcmcia_release_configuration(link->handle); + + return 0; +} + +static int avma1cs_resume(struct pcmcia_device *dev) +{ + dev_link_t *link = dev_to_instance(dev); + + link->state &= ~DEV_SUSPEND; + if (link->state & DEV_CONFIG) + pcmcia_request_configuration(link->handle, &link->conf); + + return 0; +} + static struct pcmcia_device_id avma1cs_ids[] = { PCMCIA_DEVICE_PROD_ID12("AVM", "ISDN A", 0x95d42008, 0xadc9d4bb), @@ -369,11 +425,13 @@ static struct pcmcia_driver avma1cs_driver = { .drv = { .name = "avma1_cs", }, - .probe = avma1cs_probe, + .probe = avma1cs_attach, .remove = avma1cs_detach, .id_table = avma1cs_ids, + .suspend = avma1cs_suspend, + .resume = avma1cs_resume, }; - + /*====================================================================*/ static int __init init_avma1_cs(void) diff --git a/drivers/isdn/hisax/bkm_a4t.c b/drivers/isdn/hisax/bkm_a4t.c index 87a630128..dcb308aeb 100644 --- a/drivers/isdn/hisax/bkm_a4t.c +++ b/drivers/isdn/hisax/bkm_a4t.c @@ -11,6 +11,7 @@ */ +#include #include #include "hisax.h" #include "isac.h" @@ -255,9 +256,9 @@ BKM_card_msg(struct IsdnCardState *cs, int mt, void *arg) return (0); } -static struct pci_dev *dev_a4t __devinitdata = NULL; +static struct pci_dev *dev_a4t __initdata = NULL; -int __devinit +int __init setup_bkm_a4t(struct IsdnCard *card) { struct IsdnCardState *cs = card->cs; @@ -335,7 +336,7 @@ setup_bkm_a4t(struct IsdnCard *card) cs->BC_Send_Data = &jade_fill_fifo; cs->cardmsg = &BKM_card_msg; cs->irq_func = &bkm_interrupt; - cs->irq_flags |= IRQF_SHARED; + cs->irq_flags |= SA_SHIRQ; ISACVersion(cs, "Telekom A4T:"); /* Jade version */ JadeVersion(cs, "Telekom A4T:"); diff --git a/drivers/isdn/hisax/bkm_a8.c b/drivers/isdn/hisax/bkm_a8.c index dae090a9a..5f21b82c8 100644 --- a/drivers/isdn/hisax/bkm_a8.c +++ b/drivers/isdn/hisax/bkm_a8.c @@ -11,6 +11,7 @@ */ +#include #include #include "hisax.h" #include "isac.h" @@ -260,7 +261,7 @@ BKM_card_msg(struct IsdnCardState *cs, int mt, void *arg) return (0); } -static int __devinit +static int __init sct_alloc_io(u_int adr, u_int len) { if (!request_region(adr, len, "scitel")) { @@ -272,16 +273,16 @@ sct_alloc_io(u_int adr, u_int len) return(0); } -static struct pci_dev *dev_a8 __devinitdata = NULL; -static u16 sub_vendor_id __devinitdata = 0; -static u16 sub_sys_id __devinitdata = 0; -static u_char pci_bus __devinitdata = 0; -static u_char pci_device_fn __devinitdata = 0; -static u_char pci_irq __devinitdata = 0; +static struct pci_dev *dev_a8 __initdata = NULL; +static u16 sub_vendor_id __initdata = 0; +static u16 sub_sys_id __initdata = 0; +static u_char pci_bus __initdata = 0; +static u_char pci_device_fn __initdata = 0; +static u_char pci_irq __initdata = 0; #endif /* CONFIG_PCI */ -int __devinit +int __init setup_sct_quadro(struct IsdnCard *card) { #ifdef CONFIG_PCI @@ -374,7 +375,7 @@ setup_sct_quadro(struct IsdnCard *card) pci_ioaddr5 &= PCI_BASE_ADDRESS_IO_MASK; /* Take over */ cs->irq = pci_irq; - cs->irq_flags |= IRQF_SHARED; + cs->irq_flags |= SA_SHIRQ; /* pci_ioaddr1 is unique to all subdevices */ /* pci_ioaddr2 is for the fourth subdevice only */ /* pci_ioaddr3 is for the third subdevice only */ diff --git a/drivers/isdn/hisax/config.c b/drivers/isdn/hisax/config.c index 9280b581f..df9d65201 100644 --- a/drivers/isdn/hisax/config.c +++ b/drivers/isdn/hisax/config.c @@ -17,6 +17,7 @@ #include #include #include +#include #include #include "hisax.h" #include @@ -24,6 +25,7 @@ #include #include #define HISAX_STATUS_BUFSIZE 4096 +#define INCLUDE_INLINE_FUNCS /* * This structure array contains one entry per card. An entry looks @@ -631,8 +633,7 @@ static int HiSax_readstatus(u_char __user *buf, int len, int id, int channel) count = cs->status_end - cs->status_read + 1; if (count >= len) count = len; - if (copy_to_user(p, cs->status_read, count)) - return -EFAULT; + copy_to_user(p, cs->status_read, count); cs->status_read += count; if (cs->status_read > cs->status_end) cs->status_read = cs->status_buf; @@ -643,8 +644,7 @@ static int HiSax_readstatus(u_char __user *buf, int len, int id, int channel) cnt = HISAX_STATUS_BUFSIZE; else cnt = count; - if (copy_to_user(p, cs->status_read, cnt)) - return -EFAULT; + copy_to_user(p, cs->status_read, cnt); p += cnt; cs->status_read += cnt % HISAX_STATUS_BUFSIZE; count -= cnt; @@ -1877,7 +1877,7 @@ static void EChannel_proc_rcv(struct hisax_d_if *d_if) #ifdef CONFIG_PCI #include -static struct pci_device_id hisax_pci_tbl[] __devinitdata = { +static struct pci_device_id hisax_pci_tbl[] __initdata = { #ifdef CONFIG_HISAX_FRITZPCI {PCI_VENDOR_ID_AVM, PCI_DEVICE_ID_AVM_A1, PCI_ANY_ID, PCI_ANY_ID}, #endif diff --git a/drivers/isdn/hisax/diva.c b/drivers/isdn/hisax/diva.c index e294fa391..b0ff1cc97 100644 --- a/drivers/isdn/hisax/diva.c +++ b/drivers/isdn/hisax/diva.c @@ -16,6 +16,7 @@ */ #include +#include #include "hisax.h" #include "isac.h" #include "hscx.h" @@ -887,13 +888,13 @@ Diva_card_msg(struct IsdnCardState *cs, int mt, void *arg) return(0); } -static struct pci_dev *dev_diva __devinitdata = NULL; -static struct pci_dev *dev_diva_u __devinitdata = NULL; -static struct pci_dev *dev_diva201 __devinitdata = NULL; -static struct pci_dev *dev_diva202 __devinitdata = NULL; +static struct pci_dev *dev_diva __initdata = NULL; +static struct pci_dev *dev_diva_u __initdata = NULL; +static struct pci_dev *dev_diva201 __initdata = NULL; +static struct pci_dev *dev_diva202 __initdata = NULL; #ifdef __ISAPNP__ -static struct isapnp_device_id diva_ids[] __devinitdata = { +static struct isapnp_device_id diva_ids[] __initdata = { { ISAPNP_VENDOR('G', 'D', 'I'), ISAPNP_FUNCTION(0x51), ISAPNP_VENDOR('G', 'D', 'I'), ISAPNP_FUNCTION(0x51), (unsigned long) "Diva picola" }, @@ -915,12 +916,12 @@ static struct isapnp_device_id diva_ids[] __devinitdata = { { 0, } }; -static struct isapnp_device_id *ipid __devinitdata = &diva_ids[0]; +static struct isapnp_device_id *ipid __initdata = &diva_ids[0]; static struct pnp_card *pnp_c __devinitdata = NULL; #endif -int __devinit +int __init setup_diva(struct IsdnCard *card) { int bytecnt = 8; @@ -1076,7 +1077,7 @@ setup_diva(struct IsdnCard *card) printk(KERN_WARNING "Diva: No IO-Adr for PCI card found\n"); return(0); } - cs->irq_flags |= IRQF_SHARED; + cs->irq_flags |= SA_SHIRQ; #else printk(KERN_WARNING "Diva: cfgreg 0 and NO_PCI_BIOS\n"); printk(KERN_WARNING "Diva: unable to config DIVA PCI\n"); diff --git a/drivers/isdn/hisax/elsa.c b/drivers/isdn/hisax/elsa.c index 3b3e318f6..110e9fd66 100644 --- a/drivers/isdn/hisax/elsa.c +++ b/drivers/isdn/hisax/elsa.c @@ -19,6 +19,7 @@ */ #include +#include #include "hisax.h" #include "arcofi.h" #include "isac.h" @@ -85,8 +86,8 @@ static const char *ITACVer[] = *** ***/ /* Config-Register (Read) */ -#define ELIRQF_TIMER_RUN 0x02 /* Bit 1 des Config-Reg */ -#define ELIRQF_TIMER_RUN_PCC8 0x01 /* Bit 0 des Config-Reg bei PCC */ +#define ELSA_TIMER_RUN 0x02 /* Bit 1 des Config-Reg */ +#define ELSA_TIMER_RUN_PCC8 0x01 /* Bit 0 des Config-Reg bei PCC */ #define ELSA_IRQ_IDX 0x38 /* Bit 3,4,5 des Config-Reg */ #define ELSA_IRQ_IDX_PCC8 0x30 /* Bit 4,5 des Config-Reg */ #define ELSA_IRQ_IDX_PC 0x0c /* Bit 2,3 des Config-Reg */ @@ -102,11 +103,12 @@ static const char *ITACVer[] = #define ELSA_S0_POWER_BAD 0x08 /* Bit 3 S0-Bus Spannung fehlt */ /* Status Flags */ -#define ELIRQF_TIMER_AKTIV 1 +#define ELSA_TIMER_AKTIV 1 #define ELSA_BAD_PWR 2 #define ELSA_ASSIGN 4 #define RS_ISR_PASS_LIMIT 256 +#define _INLINE_ inline #define FLG_MODEM_ACTIVE 1 /* IPAC AUX */ #define ELSA_IPAC_LINE_LED 0x40 /* Bit 6 Gelbe LED */ @@ -259,10 +261,10 @@ TimerRun(struct IsdnCardState *cs) v = bytein(cs->hw.elsa.cfg); if ((cs->subtyp == ELSA_QS1000) || (cs->subtyp == ELSA_QS3000)) - return (0 == (v & ELIRQF_TIMER_RUN)); + return (0 == (v & ELSA_TIMER_RUN)); else if (cs->subtyp == ELSA_PCC8) - return (v & ELIRQF_TIMER_RUN_PCC8); - return (v & ELIRQF_TIMER_RUN); + return (v & ELSA_TIMER_RUN_PCC8); + return (v & ELSA_TIMER_RUN); } /* * fast interrupt HSCX stuff goes here @@ -334,7 +336,7 @@ elsa_interrupt(int intno, void *dev_id, struct pt_regs *regs) writereg(cs->hw.elsa.ale, cs->hw.elsa.hscx, HSCX_MASK, 0xFF); writereg(cs->hw.elsa.ale, cs->hw.elsa.hscx, HSCX_MASK + 0x40, 0xFF); writereg(cs->hw.elsa.ale, cs->hw.elsa.isac, ISAC_MASK, 0xFF); - if (cs->hw.elsa.status & ELIRQF_TIMER_AKTIV) { + if (cs->hw.elsa.status & ELSA_TIMER_AKTIV) { if (!TimerRun(cs)) { /* Timer Restart */ byteout(cs->hw.elsa.timer, 0); @@ -685,7 +687,7 @@ Elsa_card_msg(struct IsdnCardState *cs, int mt, void *arg) spin_lock_irqsave(&cs->lock, flags); cs->hw.elsa.counter = 0; cs->hw.elsa.ctrl_reg |= ELSA_ENA_TIMER_INT; - cs->hw.elsa.status |= ELIRQF_TIMER_AKTIV; + cs->hw.elsa.status |= ELSA_TIMER_AKTIV; byteout(cs->hw.elsa.ctrl, cs->hw.elsa.ctrl_reg); byteout(cs->hw.elsa.timer, 0); spin_unlock_irqrestore(&cs->lock, flags); @@ -693,7 +695,7 @@ Elsa_card_msg(struct IsdnCardState *cs, int mt, void *arg) spin_lock_irqsave(&cs->lock, flags); cs->hw.elsa.ctrl_reg &= ~ELSA_ENA_TIMER_INT; byteout(cs->hw.elsa.ctrl, cs->hw.elsa.ctrl_reg); - cs->hw.elsa.status &= ~ELIRQF_TIMER_AKTIV; + cs->hw.elsa.status &= ~ELSA_TIMER_AKTIV; spin_unlock_irqrestore(&cs->lock, flags); printk(KERN_INFO "Elsa: %d timer tics in 110 msek\n", cs->hw.elsa.counter); @@ -1012,7 +1014,7 @@ setup_elsa(struct IsdnCard *card) cs->hw.elsa.timer = 0; cs->hw.elsa.trig = 0; cs->hw.elsa.ctrl = 0; - cs->irq_flags |= IRQF_SHARED; + cs->irq_flags |= SA_SHIRQ; printk(KERN_INFO "Elsa: %s defined at %#lx IRQ %d\n", Elsa_Types[cs->subtyp], @@ -1061,7 +1063,7 @@ setup_elsa(struct IsdnCard *card) test_and_set_bit(HW_IPAC, &cs->HW_Flags); cs->hw.elsa.timer = 0; cs->hw.elsa.trig = 0; - cs->irq_flags |= IRQF_SHARED; + cs->irq_flags |= SA_SHIRQ; printk(KERN_INFO "Elsa: %s defined at %#lx/0x%x IRQ %d\n", Elsa_Types[cs->subtyp], diff --git a/drivers/isdn/hisax/elsa_cs.c b/drivers/isdn/hisax/elsa_cs.c index e18e75be8..062fb8f07 100644 --- a/drivers/isdn/hisax/elsa_cs.c +++ b/drivers/isdn/hisax/elsa_cs.c @@ -94,8 +94,8 @@ module_param(protocol, int, 0); handler. */ -static int elsa_cs_config(struct pcmcia_device *link); -static void elsa_cs_release(struct pcmcia_device *link); +static void elsa_cs_config(dev_link_t *link); +static void elsa_cs_release(dev_link_t *link); /* The attach() and detach() entry points are used to create and destroy @@ -111,7 +111,7 @@ static void elsa_cs_detach(struct pcmcia_device *p_dev); example, ethernet cards, modems). In other cases, there may be many actual or logical devices (SCSI adapters, memory cards with multiple partitions). The dev_node_t structures need to be kept - in a linked list starting at the 'dev' field of a struct pcmcia_device + in a linked list starting at the 'dev' field of a dev_link_t structure. We allocate them in the card's private data structure, because they generally shouldn't be allocated dynamically. In this case, we also provide a flag to indicate if a device is @@ -121,7 +121,7 @@ static void elsa_cs_detach(struct pcmcia_device *p_dev); */ typedef struct local_info_t { - struct pcmcia_device *p_dev; + dev_link_t link; dev_node_t node; int busy; int cardnr; @@ -139,8 +139,9 @@ typedef struct local_info_t { ======================================================================*/ -static int elsa_cs_probe(struct pcmcia_device *link) +static int elsa_cs_attach(struct pcmcia_device *p_dev) { + dev_link_t *link; local_info_t *local; DEBUG(0, "elsa_cs_attach()\n"); @@ -149,11 +150,8 @@ static int elsa_cs_probe(struct pcmcia_device *link) local = kmalloc(sizeof(local_info_t), GFP_KERNEL); if (!local) return -ENOMEM; memset(local, 0, sizeof(local_info_t)); - - local->p_dev = link; - link->priv = local; - local->cardnr = -1; + link = &local->link; link->priv = local; /* Interrupt setup */ link->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING|IRQ_FIRST_SHARED; @@ -172,9 +170,16 @@ static int elsa_cs_probe(struct pcmcia_device *link) link->io.IOAddrLines = 3; link->conf.Attributes = CONF_ENABLE_IRQ; + link->conf.Vcc = 50; link->conf.IntType = INT_MEMORY_AND_IO; - return elsa_cs_config(link); + link->handle = p_dev; + p_dev->instance = link; + + link->state |= DEV_PRESENT | DEV_CONFIG_PENDING; + elsa_cs_config(link); + + return 0; } /* elsa_cs_attach */ /*====================================================================== @@ -186,16 +191,20 @@ static int elsa_cs_probe(struct pcmcia_device *link) ======================================================================*/ -static void elsa_cs_detach(struct pcmcia_device *link) +static void elsa_cs_detach(struct pcmcia_device *p_dev) { - local_info_t *info = link->priv; + dev_link_t *link = dev_to_instance(p_dev); + local_info_t *info = link->priv; - DEBUG(0, "elsa_cs_detach(0x%p)\n", link); + DEBUG(0, "elsa_cs_detach(0x%p)\n", link); - info->busy = 1; - elsa_cs_release(link); + if (link->state & DEV_CONFIG) { + info->busy = 1; + elsa_cs_release(link); + } + + kfree(info); - kfree(info); } /* elsa_cs_detach */ /*====================================================================== @@ -205,7 +214,7 @@ static void elsa_cs_detach(struct pcmcia_device *link) device available to the system. ======================================================================*/ -static int get_tuple(struct pcmcia_device *handle, tuple_t *tuple, +static int get_tuple(client_handle_t handle, tuple_t *tuple, cisparse_t *parse) { int i = pcmcia_get_tuple_data(handle, tuple); @@ -213,7 +222,7 @@ static int get_tuple(struct pcmcia_device *handle, tuple_t *tuple, return pcmcia_parse_tuple(handle, tuple, parse); } -static int first_tuple(struct pcmcia_device *handle, tuple_t *tuple, +static int first_tuple(client_handle_t handle, tuple_t *tuple, cisparse_t *parse) { int i = pcmcia_get_first_tuple(handle, tuple); @@ -221,7 +230,7 @@ static int first_tuple(struct pcmcia_device *handle, tuple_t *tuple, return get_tuple(handle, tuple, parse); } -static int next_tuple(struct pcmcia_device *handle, tuple_t *tuple, +static int next_tuple(client_handle_t handle, tuple_t *tuple, cisparse_t *parse) { int i = pcmcia_get_next_tuple(handle, tuple); @@ -229,8 +238,9 @@ static int next_tuple(struct pcmcia_device *handle, tuple_t *tuple, return get_tuple(handle, tuple, parse); } -static int elsa_cs_config(struct pcmcia_device *link) +static void elsa_cs_config(dev_link_t *link) { + client_handle_t handle; tuple_t tuple; cisparse_t parse; local_info_t *dev; @@ -240,6 +250,7 @@ static int elsa_cs_config(struct pcmcia_device *link) IsdnCard_t icard; DEBUG(0, "elsa_config(0x%p)\n", link); + handle = link->handle; dev = link->priv; /* @@ -251,7 +262,7 @@ static int elsa_cs_config(struct pcmcia_device *link) tuple.TupleDataMax = 255; tuple.TupleOffset = 0; tuple.Attributes = 0; - i = first_tuple(link, &tuple, &parse); + i = first_tuple(handle, &tuple, &parse); if (i != CS_SUCCESS) { last_fn = ParseTuple; goto cs_failed; @@ -259,29 +270,32 @@ static int elsa_cs_config(struct pcmcia_device *link) link->conf.ConfigBase = parse.config.base; link->conf.Present = parse.config.rmask[0]; + /* Configure card */ + link->state |= DEV_CONFIG; + tuple.TupleData = (cisdata_t *)buf; tuple.TupleOffset = 0; tuple.TupleDataMax = 255; tuple.Attributes = 0; tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY; - i = first_tuple(link, &tuple, &parse); + i = first_tuple(handle, &tuple, &parse); while (i == CS_SUCCESS) { if ( (cf->io.nwin > 0) && cf->io.win[0].base) { printk(KERN_INFO "(elsa_cs: looks like the 96 model)\n"); link->conf.ConfigIndex = cf->index; link->io.BasePort1 = cf->io.win[0].base; - i = pcmcia_request_io(link, &link->io); + i = pcmcia_request_io(link->handle, &link->io); if (i == CS_SUCCESS) break; } else { printk(KERN_INFO "(elsa_cs: looks like the 97 model)\n"); link->conf.ConfigIndex = cf->index; for (i = 0, j = 0x2f0; j > 0x100; j -= 0x10) { link->io.BasePort1 = j; - i = pcmcia_request_io(link, &link->io); + i = pcmcia_request_io(link->handle, &link->io); if (i == CS_SUCCESS) break; } break; } - i = next_tuple(link, &tuple, &parse); + i = next_tuple(handle, &tuple, &parse); } if (i != CS_SUCCESS) { @@ -289,14 +303,14 @@ static int elsa_cs_config(struct pcmcia_device *link) goto cs_failed; } - i = pcmcia_request_irq(link, &link->irq); + i = pcmcia_request_irq(link->handle, &link->irq); if (i != CS_SUCCESS) { link->irq.AssignedIRQ = 0; last_fn = RequestIRQ; goto cs_failed; } - i = pcmcia_request_configuration(link, &link->conf); + i = pcmcia_request_configuration(link->handle, &link->conf); if (i != CS_SUCCESS) { last_fn = RequestConfiguration; goto cs_failed; @@ -307,11 +321,14 @@ static int elsa_cs_config(struct pcmcia_device *link) sprintf(dev->node.dev_name, "elsa"); dev->node.major = dev->node.minor = 0x0; - link->dev_node = &dev->node; + link->dev = &dev->node; /* Finally, report what we've done */ - printk(KERN_INFO "%s: index 0x%02x: ", - dev->node.dev_name, link->conf.ConfigIndex); + 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); if (link->conf.Attributes & CONF_ENABLE_IRQ) printk(", irq %d", link->irq.AssignedIRQ); if (link->io.NumPorts1) @@ -322,6 +339,8 @@ static int elsa_cs_config(struct pcmcia_device *link) link->io.BasePort2+link->io.NumPorts2-1); printk("\n"); + link->state &= ~DEV_CONFIG_PENDING; + icard.para[0] = link->irq.AssignedIRQ; icard.para[1] = link->io.BasePort1; icard.protocol = protocol; @@ -335,11 +354,10 @@ static int elsa_cs_config(struct pcmcia_device *link) } else ((local_info_t*)link->priv)->cardnr = i; - return 0; + return; cs_failed: - cs_error(link, last_fn, i); + cs_error(link->handle, last_fn, i); elsa_cs_release(link); - return -ENODEV; } /* elsa_cs_config */ /*====================================================================== @@ -350,7 +368,7 @@ cs_failed: ======================================================================*/ -static void elsa_cs_release(struct pcmcia_device *link) +static void elsa_cs_release(dev_link_t *link) { local_info_t *local = link->priv; @@ -362,23 +380,39 @@ static void elsa_cs_release(struct pcmcia_device *link) HiSax_closecard(local->cardnr); } } - - pcmcia_disable_device(link); + /* Unlink the device chain */ + link->dev = NULL; + + /* Don't bother checking to see if these succeed or not */ + if (link->win) + pcmcia_release_window(link->win); + pcmcia_release_configuration(link->handle); + pcmcia_release_io(link->handle, &link->io); + pcmcia_release_irq(link->handle, &link->irq); + link->state &= ~DEV_CONFIG; } /* elsa_cs_release */ -static int elsa_suspend(struct pcmcia_device *link) +static int elsa_suspend(struct pcmcia_device *p_dev) { + dev_link_t *link = dev_to_instance(p_dev); local_info_t *dev = link->priv; + link->state |= DEV_SUSPEND; dev->busy = 1; + if (link->state & DEV_CONFIG) + pcmcia_release_configuration(link->handle); return 0; } -static int elsa_resume(struct pcmcia_device *link) +static int elsa_resume(struct pcmcia_device *p_dev) { + dev_link_t *link = dev_to_instance(p_dev); local_info_t *dev = link->priv; + link->state &= ~DEV_SUSPEND; + if (link->state & DEV_CONFIG) + pcmcia_request_configuration(link->handle, &link->conf); dev->busy = 0; return 0; @@ -396,7 +430,7 @@ static struct pcmcia_driver elsa_cs_driver = { .drv = { .name = "elsa_cs", }, - .probe = elsa_cs_probe, + .probe = elsa_cs_attach, .remove = elsa_cs_detach, .id_table = elsa_ids, .suspend = elsa_suspend, diff --git a/drivers/isdn/hisax/elsa_ser.c b/drivers/isdn/hisax/elsa_ser.c index 0279fb323..898ec0916 100644 --- a/drivers/isdn/hisax/elsa_ser.c +++ b/drivers/isdn/hisax/elsa_ser.c @@ -7,6 +7,7 @@ * */ +#include #include #include diff --git a/drivers/isdn/hisax/enternow_pci.c b/drivers/isdn/hisax/enternow_pci.c index 76c7d29d1..3341cf155 100644 --- a/drivers/isdn/hisax/enternow_pci.c +++ b/drivers/isdn/hisax/enternow_pci.c @@ -60,6 +60,7 @@ */ +#include #include "hisax.h" #include "isac.h" #include "isdnl1.h" @@ -301,10 +302,10 @@ enpci_interrupt(int intno, void *dev_id, struct pt_regs *regs) } -static struct pci_dev *dev_netjet __devinitdata = NULL; +static struct pci_dev *dev_netjet __initdata = NULL; /* called by config.c */ -int __devinit +int __init setup_enternow_pci(struct IsdnCard *card) { int bytecnt; @@ -405,7 +406,7 @@ setup_enternow_pci(struct IsdnCard *card) cs->BC_Send_Data = &netjet_fill_dma; cs->cardmsg = &enpci_card_msg; cs->irq_func = &enpci_interrupt; - cs->irq_flags |= IRQF_SHARED; + cs->irq_flags |= SA_SHIRQ; return (1); } diff --git a/drivers/isdn/hisax/gazel.c b/drivers/isdn/hisax/gazel.c index fe2937267..60b04c6d9 100644 --- a/drivers/isdn/hisax/gazel.c +++ b/drivers/isdn/hisax/gazel.c @@ -11,6 +11,7 @@ * */ +#include #include #include "hisax.h" #include "isac.h" @@ -484,7 +485,7 @@ reserve_regions(struct IsdnCard *card, struct IsdnCardState *cs) return 1; } -static int __devinit +static int __init setup_gazelisa(struct IsdnCard *card, struct IsdnCardState *cs) { printk(KERN_INFO "Gazel: ISA PnP card automatic recognition\n"); @@ -532,9 +533,9 @@ setup_gazelisa(struct IsdnCard *card, struct IsdnCardState *cs) return (0); } -static struct pci_dev *dev_tel __devinitdata = NULL; +static struct pci_dev *dev_tel __initdata = NULL; -static int __devinit +static int __init setup_gazelpci(struct IsdnCardState *cs) { u_int pci_ioaddr0 = 0, pci_ioaddr1 = 0; @@ -592,7 +593,7 @@ setup_gazelpci(struct IsdnCardState *cs) cs->hw.gazel.hscxfifo[0] = cs->hw.gazel.hscx[0]; cs->hw.gazel.hscxfifo[1] = cs->hw.gazel.hscx[1]; cs->irq = pci_irq; - cs->irq_flags |= IRQF_SHARED; + cs->irq_flags |= SA_SHIRQ; switch (seekcard) { case PCI_DEVICE_ID_PLX_R685: @@ -621,7 +622,7 @@ setup_gazelpci(struct IsdnCardState *cs) return (0); } -int __devinit +int __init setup_gazel(struct IsdnCard *card) { struct IsdnCardState *cs = card->cs; diff --git a/drivers/isdn/hisax/hfc4s8s_l1.c b/drivers/isdn/hisax/hfc4s8s_l1.c index 3a5ca8a68..e3866b0a9 100644 --- a/drivers/isdn/hisax/hfc4s8s_l1.c +++ b/drivers/isdn/hisax/hfc4s8s_l1.c @@ -22,6 +22,7 @@ #include #include +#include #include #include #include @@ -1552,7 +1553,7 @@ setup_instance(hfc4s8s_hw * hw) INIT_WORK(&hw->tqueue, (void *) (void *) hfc4s8s_bh, hw); if (request_irq - (hw->irq, hfc4s8s_interrupt, IRQF_SHARED, hw->card_name, hw)) { + (hw->irq, hfc4s8s_interrupt, SA_SHIRQ, hw->card_name, hw)) { printk(KERN_INFO "HFC-4S/8S: unable to alloc irq %d, card ignored\n", hw->irq); @@ -1703,7 +1704,7 @@ hfc4s8s_module_init(void) /* driver module exit : */ /* release the HFC-4s/8s hardware */ /*************************************/ -static void __exit +static void hfc4s8s_module_exit(void) { pci_unregister_driver(&hfc4s8s_driver); diff --git a/drivers/isdn/hisax/hfc_2bds0.c b/drivers/isdn/hisax/hfc_2bds0.c index 6360e8214..637a261c9 100644 --- a/drivers/isdn/hisax/hfc_2bds0.c +++ b/drivers/isdn/hisax/hfc_2bds0.c @@ -1015,7 +1015,7 @@ hfc_dbusy_timer(struct IsdnCardState *cs) { } -static unsigned int +static unsigned int __init *init_send_hfcd(int cnt) { int i, *send; @@ -1030,7 +1030,7 @@ static unsigned int return(send); } -void +void __init init2bds0(struct IsdnCardState *cs) { cs->setstack_d = setstack_hfcd; diff --git a/drivers/isdn/hisax/hfc_2bs0.c b/drivers/isdn/hisax/hfc_2bs0.c index d0520ad30..c964539cc 100644 --- a/drivers/isdn/hisax/hfc_2bs0.c +++ b/drivers/isdn/hisax/hfc_2bs0.c @@ -551,7 +551,7 @@ setstack_hfc(struct PStack *st, struct BCState *bcs) return (0); } -static void +static void __init init_send(struct BCState *bcs) { int i; @@ -565,7 +565,7 @@ init_send(struct BCState *bcs) bcs->hw.hfc.send[i] = 0x1fff; } -void +void __init inithfc(struct IsdnCardState *cs) { init_send(&cs->bcs[0]); diff --git a/drivers/isdn/hisax/hfc_pci.c b/drivers/isdn/hisax/hfc_pci.c index 1df60ca94..91d25acb5 100644 --- a/drivers/isdn/hisax/hfc_pci.c +++ b/drivers/isdn/hisax/hfc_pci.c @@ -16,6 +16,7 @@ */ #include +#include #include "hisax.h" #include "hfc_pci.h" #include "isdnl1.h" @@ -1581,7 +1582,7 @@ hfcpci_bh(struct IsdnCardState *cs) /********************************/ /* called for card init message */ /********************************/ -static void +static void __init inithfcpci(struct IsdnCardState *cs) { cs->bcs[0].BC_SetStack = setstack_2b; @@ -1638,11 +1639,11 @@ hfcpci_card_msg(struct IsdnCardState *cs, int mt, void *arg) /* this variable is used as card index when more than one cards are present */ -static struct pci_dev *dev_hfcpci __devinitdata = NULL; +static struct pci_dev *dev_hfcpci __initdata = NULL; #endif /* CONFIG_PCI */ -int __devinit +int __init setup_hfcpci(struct IsdnCard *card) { u_long flags; @@ -1687,7 +1688,7 @@ setup_hfcpci(struct IsdnCard *card) printk(KERN_WARNING "HFC-PCI: No IRQ for PCI card found\n"); return (0); } - cs->hw.hfcpci.pci_io = (char *)(unsigned long)dev_hfcpci->resource[1].start; + cs->hw.hfcpci.pci_io = (char *) dev_hfcpci->resource[ 1].start; printk(KERN_INFO "HiSax: HFC-PCI card manufacturer: %s card name: %s\n", id_list[i].vendor_name, id_list[i].card_name); } else { printk(KERN_WARNING "HFC-PCI: No PCI card found\n"); @@ -1732,7 +1733,7 @@ setup_hfcpci(struct IsdnCard *card) cs->BC_Read_Reg = NULL; cs->BC_Write_Reg = NULL; cs->irq_func = &hfcpci_interrupt; - cs->irq_flags |= IRQF_SHARED; + cs->irq_flags |= SA_SHIRQ; cs->hw.hfcpci.timer.function = (void *) hfcpci_Timer; cs->hw.hfcpci.timer.data = (long) cs; init_timer(&cs->hw.hfcpci.timer); diff --git a/drivers/isdn/hisax/hfc_usb.c b/drivers/isdn/hisax/hfc_usb.c index b5e571a52..262c44127 100644 --- a/drivers/isdn/hisax/hfc_usb.c +++ b/drivers/isdn/hisax/hfc_usb.c @@ -32,6 +32,7 @@ #include #include #include +#include #include #include #include diff --git a/drivers/isdn/hisax/hfcscard.c b/drivers/isdn/hisax/hfcscard.c index 4e7f47287..86ab1c13f 100644 --- a/drivers/isdn/hisax/hfcscard.c +++ b/drivers/isdn/hisax/hfcscard.c @@ -139,7 +139,7 @@ hfcs_card_msg(struct IsdnCardState *cs, int mt, void *arg) } #ifdef __ISAPNP__ -static struct isapnp_device_id hfc_ids[] __devinitdata = { +static struct isapnp_device_id hfc_ids[] __initdata = { { ISAPNP_VENDOR('A', 'N', 'X'), ISAPNP_FUNCTION(0x1114), ISAPNP_VENDOR('A', 'N', 'X'), ISAPNP_FUNCTION(0x1114), (unsigned long) "Acer P10" }, @@ -164,11 +164,11 @@ static struct isapnp_device_id hfc_ids[] __devinitdata = { { 0, } }; -static struct isapnp_device_id *ipid __devinitdata = &hfc_ids[0]; +static struct isapnp_device_id *ipid __initdata = &hfc_ids[0]; static struct pnp_card *pnp_c __devinitdata = NULL; #endif -int __devinit +int __init setup_hfcs(struct IsdnCard *card) { struct IsdnCardState *cs = card->cs; diff --git a/drivers/isdn/hisax/hisax.h b/drivers/isdn/hisax/hisax.h index 75920aa0a..11fe537e2 100644 --- a/drivers/isdn/hisax/hisax.h +++ b/drivers/isdn/hisax/hisax.h @@ -6,6 +6,7 @@ * of the GNU General Public License, incorporated herein by reference. * */ +#include #include #include #include diff --git a/drivers/isdn/hisax/hisax_debug.h b/drivers/isdn/hisax/hisax_debug.h index ceafecdb1..ba518a7a7 100644 --- a/drivers/isdn/hisax/hisax_debug.h +++ b/drivers/isdn/hisax/hisax_debug.h @@ -22,6 +22,7 @@ #ifndef __HISAX_DEBUG_H__ #define __HISAX_DEBUG_H__ +#include #ifdef CONFIG_HISAX_DEBUG diff --git a/drivers/isdn/hisax/hisax_fcpcipnp.c b/drivers/isdn/hisax/hisax_fcpcipnp.c index 1d7cf3bd6..dc7ef957e 100644 --- a/drivers/isdn/hisax/hisax_fcpcipnp.c +++ b/drivers/isdn/hisax/hisax_fcpcipnp.c @@ -387,7 +387,8 @@ static void hdlc_fill_fifo(struct fritz_bcs *bcs) DBG(0x40, "hdlc_fill_fifo"); - BUG_ON(skb->len == 0); + if (skb->len == 0) + BUG(); bcs->ctrl.sr.cmd &= ~HDLC_CMD_XME; if (bcs->tx_skb->len > bcs->fifo_size) { @@ -629,7 +630,9 @@ static void fritz_b_l2l1(struct hisax_if *ifc, int pr, void *arg) switch (pr) { case PH_DATA | REQUEST: - BUG_ON(bcs->tx_skb); + if (bcs->tx_skb) + BUG(); + bcs->tx_skb = skb; DBG_SKB(1, skb); hdlc_fill_fifo(bcs); @@ -725,11 +728,11 @@ static int __devinit fcpcipnp_setup(struct fritz_adapter *adapter) switch (adapter->type) { case AVM_FRITZ_PCIV2: - retval = request_irq(adapter->irq, fcpci2_irq, IRQF_SHARED, + retval = request_irq(adapter->irq, fcpci2_irq, SA_SHIRQ, "fcpcipnp", adapter); break; case AVM_FRITZ_PCI: - retval = request_irq(adapter->irq, fcpci_irq, IRQF_SHARED, + retval = request_irq(adapter->irq, fcpci_irq, SA_SHIRQ, "fcpcipnp", adapter); break; case AVM_FRITZ_PNP: diff --git a/drivers/isdn/hisax/hisax_isac.c b/drivers/isdn/hisax/hisax_isac.c index 81eac344b..f4972f6c1 100644 --- a/drivers/isdn/hisax/hisax_isac.c +++ b/drivers/isdn/hisax/hisax_isac.c @@ -476,10 +476,12 @@ static void isac_fill_fifo(struct isac *isac) unsigned char cmd; u_char *ptr; - BUG_ON(!isac->tx_skb); + if (!isac->tx_skb) + BUG(); count = isac->tx_skb->len; - BUG_ON(count <= 0); + if (count <= 0) + BUG(); DBG(DBG_IRQ, "count %d", count); @@ -857,7 +859,8 @@ void isac_d_l2l1(struct hisax_if *hisax_d_if, int pr, void *arg) dev_kfree_skb(skb); break; } - BUG_ON(isac->tx_skb); + if (isac->tx_skb) + BUG(); isac->tx_skb = skb; isac_fill_fifo(isac); diff --git a/drivers/isdn/hisax/icc.c b/drivers/isdn/hisax/icc.c index 2cf7b6656..c615752b9 100644 --- a/drivers/isdn/hisax/icc.c +++ b/drivers/isdn/hisax/icc.c @@ -24,10 +24,10 @@ #define DBUSY_TIMER_VALUE 80 #define ARCOFI_USE 0 -static char *ICCVer[] = +static char *ICCVer[] __initdata = {"2070 A1/A3", "2070 B1", "2070 B2/B3", "2070 V2.4"}; -void +void __init ICCVersion(struct IsdnCardState *cs, char *s) { int val; @@ -613,7 +613,7 @@ dbusy_timer_handler(struct IsdnCardState *cs) } } -void +void __init initicc(struct IsdnCardState *cs) { cs->setstack_d = setstack_icc; @@ -646,7 +646,7 @@ initicc(struct IsdnCardState *cs) ph_command(cs, ICC_CMD_DI); } -void +void __init clear_pending_icc_ints(struct IsdnCardState *cs) { int val, eval; diff --git a/drivers/isdn/hisax/icc.h b/drivers/isdn/hisax/icc.h index e7f593967..b3bb3d5de 100644 --- a/drivers/isdn/hisax/icc.h +++ b/drivers/isdn/hisax/icc.h @@ -65,7 +65,7 @@ #define ICC_IND_AIL 0xE #define ICC_IND_DC 0xF -extern void ICCVersion(struct IsdnCardState *cs, char *s); +extern void __init ICCVersion(struct IsdnCardState *cs, char *s); extern void initicc(struct IsdnCardState *cs); extern void icc_interrupt(struct IsdnCardState *cs, u_char val); extern void clear_pending_icc_ints(struct IsdnCardState *cs); diff --git a/drivers/isdn/hisax/ipacx.c b/drivers/isdn/hisax/ipacx.c index 00afd5538..2e9afae12 100644 --- a/drivers/isdn/hisax/ipacx.c +++ b/drivers/isdn/hisax/ipacx.c @@ -10,6 +10,7 @@ * */ #include +#include #include #include "hisax_if.h" #include "hisax.h" @@ -38,8 +39,8 @@ static void dbusy_timer_handler(struct IsdnCardState *cs); static void dch_empty_fifo(struct IsdnCardState *cs, int count); static void dch_fill_fifo(struct IsdnCardState *cs); static inline void dch_int(struct IsdnCardState *cs); -static void dch_setstack(struct PStack *st, struct IsdnCardState *cs); -static void dch_init(struct IsdnCardState *cs); +static void __devinit dch_setstack(struct PStack *st, struct IsdnCardState *cs); +static void __devinit dch_init(struct IsdnCardState *cs); static void bch_l2l1(struct PStack *st, int pr, void *arg); static void bch_empty_fifo(struct BCState *bcs, int count); static void bch_fill_fifo(struct BCState *bcs); @@ -48,8 +49,8 @@ static void bch_mode(struct BCState *bcs, int mode, int bc); static void bch_close_state(struct BCState *bcs); static int bch_open_state(struct IsdnCardState *cs, struct BCState *bcs); static int bch_setstack(struct PStack *st, struct BCState *bcs); -static void bch_init(struct IsdnCardState *cs, int hscx); -static void clear_pending_ints(struct IsdnCardState *cs); +static void __devinit bch_init(struct IsdnCardState *cs, int hscx); +static void __init clear_pending_ints(struct IsdnCardState *cs); //---------------------------------------------------------- // Issue Layer 1 command to chip @@ -408,7 +409,7 @@ dch_int(struct IsdnCardState *cs) //---------------------------------------------------------- //---------------------------------------------------------- -static void +static void __devinit dch_setstack(struct PStack *st, struct IsdnCardState *cs) { st->l1.l1hw = dch_l2l1; @@ -416,7 +417,7 @@ dch_setstack(struct PStack *st, struct IsdnCardState *cs) //---------------------------------------------------------- //---------------------------------------------------------- -static void +static void __devinit dch_init(struct IsdnCardState *cs) { printk(KERN_INFO "HiSax: IPACX ISDN driver v0.1.0\n"); @@ -823,7 +824,7 @@ bch_setstack(struct PStack *st, struct BCState *bcs) //---------------------------------------------------------- //---------------------------------------------------------- -static void +static void __devinit bch_init(struct IsdnCardState *cs, int hscx) { cs->bcs[hscx].BC_SetStack = bch_setstack; @@ -861,7 +862,7 @@ interrupt_ipacx(struct IsdnCardState *cs) //---------------------------------------------------------- // Clears chip interrupt status //---------------------------------------------------------- -static void +static void __init clear_pending_ints(struct IsdnCardState *cs) { int ista; @@ -883,7 +884,7 @@ clear_pending_ints(struct IsdnCardState *cs) // Does chip configuration work // Work to do depends on bit mask in part //---------------------------------------------------------- -void +void __init init_ipacx(struct IsdnCardState *cs, int part) { if (part &1) { // initialise chip diff --git a/drivers/isdn/hisax/isdnl3.c b/drivers/isdn/hisax/isdnl3.c index 281fa27d9..c9917cd21 100644 --- a/drivers/isdn/hisax/isdnl3.c +++ b/drivers/isdn/hisax/isdnl3.c @@ -18,6 +18,7 @@ #include #include "hisax.h" #include "isdnl3.h" +#include const char *l3_revision = "$Revision: 2.22.2.3 $"; diff --git a/drivers/isdn/hisax/isurf.c b/drivers/isdn/hisax/isurf.c index 715a1a8cd..33747afc9 100644 --- a/drivers/isdn/hisax/isurf.c +++ b/drivers/isdn/hisax/isurf.c @@ -196,10 +196,10 @@ isurf_auxcmd(struct IsdnCardState *cs, isdn_ctrl *ic) { } #ifdef __ISAPNP__ -static struct pnp_card *pnp_c __devinitdata = NULL; +static struct pnp_card *pnp_c __initdata = NULL; #endif -int __devinit +int __init setup_isurf(struct IsdnCard *card) { int ver; diff --git a/drivers/isdn/hisax/ix1_micro.c b/drivers/isdn/hisax/ix1_micro.c index 39717506c..908a7e144 100644 --- a/drivers/isdn/hisax/ix1_micro.c +++ b/drivers/isdn/hisax/ix1_micro.c @@ -210,7 +210,7 @@ ix1_card_msg(struct IsdnCardState *cs, int mt, void *arg) } #ifdef __ISAPNP__ -static struct isapnp_device_id itk_ids[] __devinitdata = { +static struct isapnp_device_id itk_ids[] __initdata = { { ISAPNP_VENDOR('I', 'T', 'K'), ISAPNP_FUNCTION(0x25), ISAPNP_VENDOR('I', 'T', 'K'), ISAPNP_FUNCTION(0x25), (unsigned long) "ITK micro 2" }, @@ -220,12 +220,12 @@ static struct isapnp_device_id itk_ids[] __devinitdata = { { 0, } }; -static struct isapnp_device_id *ipid __devinitdata = &itk_ids[0]; +static struct isapnp_device_id *ipid __initdata = &itk_ids[0]; static struct pnp_card *pnp_c __devinitdata = NULL; #endif -int __devinit +int __init setup_ix1micro(struct IsdnCard *card) { struct IsdnCardState *cs = card->cs; diff --git a/drivers/isdn/hisax/jade.c b/drivers/isdn/hisax/jade.c index 43d61d1bc..2659fecc2 100644 --- a/drivers/isdn/hisax/jade.c +++ b/drivers/isdn/hisax/jade.c @@ -19,7 +19,7 @@ #include -int +int __init JadeVersion(struct IsdnCardState *cs, char *s) { int ver,i; @@ -253,7 +253,7 @@ setstack_jade(struct PStack *st, struct BCState *bcs) return (0); } -void +void __init clear_pending_jade_ints(struct IsdnCardState *cs) { int val; @@ -279,7 +279,7 @@ clear_pending_jade_ints(struct IsdnCardState *cs) cs->BC_Write_Reg(cs, 1, jade_HDLC_IMR, 0xF8); } -void +void __init initjade(struct IsdnCardState *cs) { cs->bcs[0].BC_SetStack = setstack_jade; diff --git a/drivers/isdn/hisax/l3dss1.c b/drivers/isdn/hisax/l3dss1.c index 99feae8b9..e96845cdd 100644 --- a/drivers/isdn/hisax/l3dss1.c +++ b/drivers/isdn/hisax/l3dss1.c @@ -23,6 +23,7 @@ #include "isdnl3.h" #include "l3dss1.h" #include +#include extern char *HiSax_getrev(const char *revision); static const char *dss1_revision = "$Revision: 2.32.2.3 $"; diff --git a/drivers/isdn/hisax/mic.c b/drivers/isdn/hisax/mic.c index 8c8251959..fe11f226b 100644 --- a/drivers/isdn/hisax/mic.c +++ b/drivers/isdn/hisax/mic.c @@ -189,7 +189,7 @@ mic_card_msg(struct IsdnCardState *cs, int mt, void *arg) return(0); } -int __devinit +int __init setup_mic(struct IsdnCard *card) { int bytecnt; diff --git a/drivers/isdn/hisax/netjet.c b/drivers/isdn/hisax/netjet.c index 38f648f9b..47a47ef09 100644 --- a/drivers/isdn/hisax/netjet.c +++ b/drivers/isdn/hisax/netjet.c @@ -909,7 +909,7 @@ setstack_tiger(struct PStack *st, struct BCState *bcs) } -void +void __init inittiger(struct IsdnCardState *cs) { if (!(cs->bcs[0].hw.tiger.send = kmalloc(NETJET_DMA_TXSIZE * sizeof(unsigned int), diff --git a/drivers/isdn/hisax/niccy.c b/drivers/isdn/hisax/niccy.c index 489022bde..68a2159cb 100644 --- a/drivers/isdn/hisax/niccy.c +++ b/drivers/isdn/hisax/niccy.c @@ -14,6 +14,7 @@ */ +#include #include #include "hisax.h" #include "isac.h" @@ -232,12 +233,12 @@ niccy_card_msg(struct IsdnCardState *cs, int mt, void *arg) return(0); } -static struct pci_dev *niccy_dev __devinitdata = NULL; +static struct pci_dev *niccy_dev __initdata = NULL; #ifdef __ISAPNP__ static struct pnp_card *pnp_c __devinitdata = NULL; #endif -int __devinit +int __init setup_niccy(struct IsdnCard *card) { struct IsdnCardState *cs = card->cs; @@ -336,7 +337,7 @@ setup_niccy(struct IsdnCard *card) printk(KERN_WARNING "Niccy: No PCI card found\n"); return(0); } - cs->irq_flags |= IRQF_SHARED; + cs->irq_flags |= SA_SHIRQ; cs->hw.niccy.isac = pci_ioaddr + ISAC_PCI_DATA; cs->hw.niccy.isac_ale = pci_ioaddr + ISAC_PCI_ADDR; cs->hw.niccy.hscx = pci_ioaddr + HSCX_PCI_DATA; diff --git a/drivers/isdn/hisax/nj_s.c b/drivers/isdn/hisax/nj_s.c index 80025fd89..a7d3cd3f3 100644 --- a/drivers/isdn/hisax/nj_s.c +++ b/drivers/isdn/hisax/nj_s.c @@ -5,6 +5,7 @@ * */ +#include #include #include "hisax.h" #include "isac.h" @@ -148,9 +149,9 @@ NETjet_S_card_msg(struct IsdnCardState *cs, int mt, void *arg) return(0); } -static struct pci_dev *dev_netjet __devinitdata = NULL; +static struct pci_dev *dev_netjet __initdata = NULL; -int __devinit +int __init setup_netjet_s(struct IsdnCard *card) { int bytecnt,cfg; @@ -271,7 +272,7 @@ setup_netjet_s(struct IsdnCard *card) setup_isac(cs); cs->cardmsg = &NETjet_S_card_msg; cs->irq_func = &netjet_s_interrupt; - cs->irq_flags |= IRQF_SHARED; + cs->irq_flags |= SA_SHIRQ; ISACVersion(cs, "NETjet-S:"); return (1); } diff --git a/drivers/isdn/hisax/nj_u.c b/drivers/isdn/hisax/nj_u.c index 37497162d..1ae7cac98 100644 --- a/drivers/isdn/hisax/nj_u.c +++ b/drivers/isdn/hisax/nj_u.c @@ -5,6 +5,7 @@ * */ +#include #include #include "hisax.h" #include "icc.h" @@ -128,9 +129,9 @@ NETjet_U_card_msg(struct IsdnCardState *cs, int mt, void *arg) return(0); } -static struct pci_dev *dev_netjet __devinitdata = NULL; +static struct pci_dev *dev_netjet __initdata = NULL; -int __devinit +int __init setup_netjet_u(struct IsdnCard *card) { int bytecnt; @@ -237,7 +238,7 @@ setup_netjet_u(struct IsdnCard *card) cs->BC_Send_Data = &netjet_fill_dma; cs->cardmsg = &NETjet_U_card_msg; cs->irq_func = &netjet_u_interrupt; - cs->irq_flags |= IRQF_SHARED; + cs->irq_flags |= SA_SHIRQ; ICCVersion(cs, "NETspider-U:"); return (1); } diff --git a/drivers/isdn/hisax/q931.c b/drivers/isdn/hisax/q931.c index aacbf0d14..abecabf8c 100644 --- a/drivers/isdn/hisax/q931.c +++ b/drivers/isdn/hisax/q931.c @@ -1402,12 +1402,12 @@ dlogframe(struct IsdnCardState *cs, struct sk_buff *skb, int dir) } /* No, locate it in the table */ if (cset == 0) { - for (i = 0; i < IESIZE_NI1; i++) + for (i = 0; i < IESIZE; i++) if (*buf == ielist_ni1[i].nr) break; /* When not found, give appropriate msg */ - if (i != IESIZE_NI1) { + if (i != IESIZE) { dp += sprintf(dp, " %s\n", ielist_ni1[i].descr); dp += ielist_ni1[i].f(dp, buf); } else diff --git a/drivers/isdn/hisax/s0box.c b/drivers/isdn/hisax/s0box.c index e76042d32..7b63085ea 100644 --- a/drivers/isdn/hisax/s0box.c +++ b/drivers/isdn/hisax/s0box.c @@ -211,7 +211,7 @@ S0Box_card_msg(struct IsdnCardState *cs, int mt, void *arg) return(0); } -int __devinit +int __init setup_s0box(struct IsdnCard *card) { struct IsdnCardState *cs = card->cs; diff --git a/drivers/isdn/hisax/saphir.c b/drivers/isdn/hisax/saphir.c index d943d3658..821776e15 100644 --- a/drivers/isdn/hisax/saphir.c +++ b/drivers/isdn/hisax/saphir.c @@ -241,7 +241,7 @@ saphir_card_msg(struct IsdnCardState *cs, int mt, void *arg) } -int __devinit +int __init setup_saphir(struct IsdnCard *card) { struct IsdnCardState *cs = card->cs; diff --git a/drivers/isdn/hisax/sedlbauer.c b/drivers/isdn/hisax/sedlbauer.c index 8d8e8a299..8c044a6a7 100644 --- a/drivers/isdn/hisax/sedlbauer.c +++ b/drivers/isdn/hisax/sedlbauer.c @@ -39,6 +39,7 @@ */ #include +#include #include "hisax.h" #include "isac.h" #include "ipac.h" @@ -632,7 +633,7 @@ setup_sedlbauer(struct IsdnCard *card) printk(KERN_WARNING "Sedlbauer: No PCI card found\n"); return(0); } - cs->irq_flags |= IRQF_SHARED; + cs->irq_flags |= SA_SHIRQ; cs->hw.sedl.bus = SEDL_BUS_PCI; sub_vendor_id = dev_sedl->subsystem_vendor; sub_id = dev_sedl->subsystem_device; @@ -809,7 +810,7 @@ ready: cs->hw.sedl.hscx = cs->hw.sedl.cfg_reg + SEDL_HSCX_PCMCIA_HSCX; cs->hw.sedl.reset_on = cs->hw.sedl.cfg_reg + SEDL_HSCX_PCMCIA_RESET; cs->hw.sedl.reset_off = cs->hw.sedl.cfg_reg + SEDL_HSCX_PCMCIA_RESET; - cs->irq_flags |= IRQF_SHARED; + cs->irq_flags |= SA_SHIRQ; } else { cs->hw.sedl.adr = cs->hw.sedl.cfg_reg + SEDL_HSCX_ISA_ADR; cs->hw.sedl.isac = cs->hw.sedl.cfg_reg + SEDL_HSCX_ISA_ISAC; diff --git a/drivers/isdn/hisax/sedlbauer_cs.c b/drivers/isdn/hisax/sedlbauer_cs.c index f9c14a297..6f5213a18 100644 --- a/drivers/isdn/hisax/sedlbauer_cs.c +++ b/drivers/isdn/hisax/sedlbauer_cs.c @@ -95,8 +95,8 @@ module_param(protocol, int, 0); event handler. */ -static int sedlbauer_config(struct pcmcia_device *link); -static void sedlbauer_release(struct pcmcia_device *link); +static void sedlbauer_config(dev_link_t *link); +static void sedlbauer_release(dev_link_t *link); /* The attach() and detach() entry points are used to create and destroy @@ -119,7 +119,7 @@ static void sedlbauer_detach(struct pcmcia_device *p_dev); example, ethernet cards, modems). In other cases, there may be many actual or logical devices (SCSI adapters, memory cards with multiple partitions). The dev_node_t structures need to be kept - in a linked list starting at the 'dev' field of a struct pcmcia_device + in a linked list starting at the 'dev' field of a dev_link_t structure. We allocate them in the card's private data structure, because they generally shouldn't be allocated dynamically. @@ -130,7 +130,7 @@ static void sedlbauer_detach(struct pcmcia_device *p_dev); */ typedef struct local_info_t { - struct pcmcia_device *p_dev; + dev_link_t link; dev_node_t node; int stop; int cardnr; @@ -148,10 +148,11 @@ typedef struct local_info_t { ======================================================================*/ -static int sedlbauer_probe(struct pcmcia_device *link) +static int sedlbauer_attach(struct pcmcia_device *p_dev) { local_info_t *local; - + dev_link_t *link; + DEBUG(0, "sedlbauer_attach()\n"); /* Allocate space for private device-specific data */ @@ -159,12 +160,10 @@ static int sedlbauer_probe(struct pcmcia_device *link) if (!local) return -ENOMEM; memset(local, 0, sizeof(local_info_t)); local->cardnr = -1; - - local->p_dev = link; - link->priv = local; - + link = &local->link; link->priv = local; + /* Interrupt setup */ - link->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING|IRQ_FIRST_SHARED; + link->irq.Attributes = IRQ_TYPE_EXCLUSIVE; link->irq.IRQInfo1 = IRQ_LEVEL_ID; link->irq.Handler = NULL; @@ -183,10 +182,18 @@ static int sedlbauer_probe(struct pcmcia_device *link) link->io.Attributes1 = IO_DATA_PATH_WIDTH_8; link->io.IOAddrLines = 3; + link->conf.Attributes = 0; + link->conf.Vcc = 50; link->conf.IntType = INT_MEMORY_AND_IO; - return sedlbauer_config(link); + link->handle = p_dev; + p_dev->instance = link; + + link->state |= DEV_PRESENT | DEV_CONFIG_PENDING; + sedlbauer_config(link); + + return 0; } /* sedlbauer_attach */ /*====================================================================== @@ -198,15 +205,19 @@ static int sedlbauer_probe(struct pcmcia_device *link) ======================================================================*/ -static void sedlbauer_detach(struct pcmcia_device *link) +static void sedlbauer_detach(struct pcmcia_device *p_dev) { - DEBUG(0, "sedlbauer_detach(0x%p)\n", link); + dev_link_t *link = dev_to_instance(p_dev); + + DEBUG(0, "sedlbauer_detach(0x%p)\n", link); - ((local_info_t *)link->priv)->stop = 1; - sedlbauer_release(link); + if (link->state & DEV_CONFIG) { + ((local_info_t *)link->priv)->stop = 1; + sedlbauer_release(link); + } - /* This points to the parent local_info_t struct */ - kfree(link->priv); + /* This points to the parent local_info_t struct */ + kfree(link->priv); } /* sedlbauer_detach */ /*====================================================================== @@ -219,8 +230,9 @@ static void sedlbauer_detach(struct pcmcia_device *link) #define CS_CHECK(fn, ret) \ do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0) -static int sedlbauer_config(struct pcmcia_device *link) +static void sedlbauer_config(dev_link_t *link) { + client_handle_t handle = link->handle; local_info_t *dev = link->priv; tuple_t tuple; cisparse_t parse; @@ -242,13 +254,18 @@ static int sedlbauer_config(struct pcmcia_device *link) tuple.TupleData = buf; tuple.TupleDataMax = sizeof(buf); tuple.TupleOffset = 0; - 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)); + CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple)); + CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple)); + CS_CHECK(ParseTuple, pcmcia_parse_tuple(handle, &tuple, &parse)); link->conf.ConfigBase = parse.config.base; link->conf.Present = parse.config.rmask[0]; + + /* Configure card */ + link->state |= DEV_CONFIG; - CS_CHECK(GetConfigurationInfo, pcmcia_get_configuration_info(link, &conf)); + /* Look up the current Vcc */ + CS_CHECK(GetConfigurationInfo, pcmcia_get_configuration_info(handle, &conf)); + link->conf.Vcc = conf.Vcc; /* In this loop, we scan the CIS for configuration table entries, @@ -263,12 +280,12 @@ static int sedlbauer_config(struct pcmcia_device *link) will only use the CIS to fill in implementation-defined details. */ tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY; - CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(link, &tuple)); + CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple)); while (1) { cistpl_cftable_entry_t dflt = { 0 }; cistpl_cftable_entry_t *cfg = &(parse.cftable_entry); - if (pcmcia_get_tuple_data(link, &tuple) != 0 || - pcmcia_parse_tuple(link, &tuple, &parse) != 0) + if (pcmcia_get_tuple_data(handle, &tuple) != 0 || + pcmcia_parse_tuple(handle, &tuple, &parse) != 0) goto next_entry; if (cfg->flags & CISTPL_CFTABLE_DEFAULT) dflt = *cfg; @@ -292,10 +309,10 @@ static int sedlbauer_config(struct pcmcia_device *link) } if (cfg->vpp1.present & (1<conf.Vpp = + link->conf.Vpp1 = link->conf.Vpp2 = cfg->vpp1.param[CISTPL_POWER_VNOM]/10000; else if (dflt.vpp1.present & (1<conf.Vpp = + link->conf.Vpp1 = link->conf.Vpp2 = dflt.vpp1.param[CISTPL_POWER_VNOM]/10000; /* Do we need to allocate an interrupt? */ @@ -322,13 +339,13 @@ static int sedlbauer_config(struct pcmcia_device *link) link->io.NumPorts2 = io->win[1].len; } /* This reserves IO space but doesn't actually enable it */ - if (pcmcia_request_io(link, &link->io) != 0) + if (pcmcia_request_io(link->handle, &link->io) != 0) goto next_entry; } /* Now set up a common memory window, if needed. There is room - in the struct pcmcia_device structure for one memory window handle, + in the dev_link_t structure for one memory window handle, but if the base addresses need to be saved, or if multiple windows are needed, the info should go in the private data structure for this device. @@ -349,7 +366,7 @@ static int sedlbauer_config(struct pcmcia_device *link) req.Size = 0x1000; */ req.AccessSpeed = 0; - if (pcmcia_request_window(&link, &req, &link->win) != 0) + if (pcmcia_request_window(&link->handle, &req, &link->win) != 0) goto next_entry; map.Page = 0; map.CardOffset = mem->win[0].card_addr; if (pcmcia_map_mem_page(link->win, &map) != 0) @@ -357,25 +374,29 @@ static int sedlbauer_config(struct pcmcia_device *link) } /* If we got this far, we're cool! */ break; - + next_entry: - CS_CHECK(GetNextTuple, pcmcia_get_next_tuple(link, &tuple)); +/* new in dummy.cs 2001/01/28 MN + if (link->io.NumPorts1) + pcmcia_release_io(link->handle, &link->io); +*/ + CS_CHECK(GetNextTuple, pcmcia_get_next_tuple(handle, &tuple)); } - + /* Allocate an interrupt line. Note that this does not assign a handler to the interrupt, unless the 'Handler' member of the irq structure is initialized. */ if (link->conf.Attributes & CONF_ENABLE_IRQ) - CS_CHECK(RequestIRQ, pcmcia_request_irq(link, &link->irq)); + CS_CHECK(RequestIRQ, pcmcia_request_irq(link->handle, &link->irq)); /* This actually configures the PCMCIA socket -- setting up the I/O windows and the interrupt mapping, and putting the card and host interface into "Memory and IO" mode. */ - CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link, &link->conf)); + CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link->handle, &link->conf)); /* At this point, the dev_node_t structure(s) need to be @@ -383,13 +404,14 @@ static int sedlbauer_config(struct pcmcia_device *link) */ sprintf(dev->node.dev_name, "sedlbauer"); dev->node.major = dev->node.minor = 0; - link->dev_node = &dev->node; + link->dev = &dev->node; /* Finally, report what we've done */ - 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(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); if (link->conf.Attributes & CONF_ENABLE_IRQ) printk(", irq %d", link->irq.AssignedIRQ); if (link->io.NumPorts1) @@ -402,6 +424,8 @@ static int sedlbauer_config(struct pcmcia_device *link) printk(", mem 0x%06lx-0x%06lx", req.Base, req.Base+req.Size-1); printk("\n"); + + link->state &= ~DEV_CONFIG_PENDING; icard.para[0] = link->irq.AssignedIRQ; icard.para[1] = link->io.BasePort1; @@ -413,16 +437,14 @@ static int sedlbauer_config(struct pcmcia_device *link) printk(KERN_ERR "sedlbauer_cs: failed to initialize SEDLBAUER PCMCIA %d at i/o %#x\n", last_ret, link->io.BasePort1); sedlbauer_release(link); - return -ENODEV; } else ((local_info_t*)link->priv)->cardnr = last_ret; - return 0; + return; cs_failed: - cs_error(link, last_fn, last_ret); + cs_error(link->handle, last_fn, last_ret); sedlbauer_release(link); - return -ENODEV; } /* sedlbauer_config */ @@ -434,7 +456,7 @@ cs_failed: ======================================================================*/ -static void sedlbauer_release(struct pcmcia_device *link) +static void sedlbauer_release(dev_link_t *link) { local_info_t *local = link->priv; DEBUG(0, "sedlbauer_release(0x%p)\n", link); @@ -445,23 +467,46 @@ static void sedlbauer_release(struct pcmcia_device *link) HiSax_closecard(local->cardnr); } } + /* Unlink the device chain */ + link->dev = NULL; - pcmcia_disable_device(link); + /* + In a normal driver, additional code may be needed to release + other kernel data structures associated with this device. + */ + + /* Don't bother checking to see if these succeed or not */ + if (link->win) + pcmcia_release_window(link->win); + 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; } /* sedlbauer_release */ -static int sedlbauer_suspend(struct pcmcia_device *link) +static int sedlbauer_suspend(struct pcmcia_device *p_dev) { + dev_link_t *link = dev_to_instance(p_dev); local_info_t *dev = link->priv; + link->state |= DEV_SUSPEND; dev->stop = 1; + if (link->state & DEV_CONFIG) + pcmcia_release_configuration(link->handle); return 0; } -static int sedlbauer_resume(struct pcmcia_device *link) +static int sedlbauer_resume(struct pcmcia_device *p_dev) { + dev_link_t *link = dev_to_instance(p_dev); local_info_t *dev = link->priv; + link->state &= ~DEV_SUSPEND; + if (link->state & DEV_CONFIG) + pcmcia_request_configuration(link->handle, &link->conf); dev->stop = 0; return 0; @@ -485,7 +530,7 @@ static struct pcmcia_driver sedlbauer_driver = { .drv = { .name = "sedlbauer_cs", }, - .probe = sedlbauer_probe, + .probe = sedlbauer_attach, .remove = sedlbauer_detach, .id_table = sedlbauer_ids, .suspend = sedlbauer_suspend, diff --git a/drivers/isdn/hisax/sportster.c b/drivers/isdn/hisax/sportster.c index a49b694eb..cdf35dc56 100644 --- a/drivers/isdn/hisax/sportster.c +++ b/drivers/isdn/hisax/sportster.c @@ -184,7 +184,7 @@ Sportster_card_msg(struct IsdnCardState *cs, int mt, void *arg) return(0); } -static int __devinit +static int __init get_io_range(struct IsdnCardState *cs) { int i, j, adr; @@ -209,7 +209,7 @@ get_io_range(struct IsdnCardState *cs) } } -int __devinit +int __init setup_sportster(struct IsdnCard *card) { struct IsdnCardState *cs = card->cs; diff --git a/drivers/isdn/hisax/st5481.h b/drivers/isdn/hisax/st5481.h index 04416bad6..9ffaae7c6 100644 --- a/drivers/isdn/hisax/st5481.h +++ b/drivers/isdn/hisax/st5481.h @@ -13,6 +13,7 @@ #ifndef _ST5481_H_ #define _ST5481_H_ +#include // USB IDs, the Product Id is in the range 0x4810-0x481F diff --git a/drivers/isdn/hisax/st5481_b.c b/drivers/isdn/hisax/st5481_b.c index 22fd5db18..657817a59 100644 --- a/drivers/isdn/hisax/st5481_b.c +++ b/drivers/isdn/hisax/st5481_b.c @@ -356,7 +356,9 @@ void st5481_b_l2l1(struct hisax_if *ifc, int pr, void *arg) switch (pr) { case PH_DATA | REQUEST: - BUG_ON(bcs->b_out.tx_skb); + if (bcs->b_out.tx_skb) + BUG(); + bcs->b_out.tx_skb = skb; break; case PH_ACTIVATE | REQUEST: diff --git a/drivers/isdn/hisax/st5481_d.c b/drivers/isdn/hisax/st5481_d.c index 493dc9499..941f7022a 100644 --- a/drivers/isdn/hisax/st5481_d.c +++ b/drivers/isdn/hisax/st5481_d.c @@ -596,7 +596,9 @@ void st5481_d_l2l1(struct hisax_if *hisax_d_if, int pr, void *arg) break; case PH_DATA | REQUEST: DBG(2, "PH_DATA REQUEST len %d", skb->len); - BUG_ON(adapter->d_out.tx_skb); + if (adapter->d_out.tx_skb) + BUG(); + adapter->d_out.tx_skb = skb; FsmEvent(&adapter->d_out.fsm, EV_DOUT_START_XMIT, NULL); break; diff --git a/drivers/isdn/hisax/st5481_init.c b/drivers/isdn/hisax/st5481_init.c index 2716aa5c6..99cb0f3d5 100644 --- a/drivers/isdn/hisax/st5481_init.c +++ b/drivers/isdn/hisax/st5481_init.c @@ -24,6 +24,7 @@ * clean up debug */ +#include #include #include #include diff --git a/drivers/isdn/hisax/teleint.c b/drivers/isdn/hisax/teleint.c index e94dc6f5b..a2b1816af 100644 --- a/drivers/isdn/hisax/teleint.c +++ b/drivers/isdn/hisax/teleint.c @@ -261,7 +261,7 @@ TeleInt_card_msg(struct IsdnCardState *cs, int mt, void *arg) return(0); } -int __devinit +int __init setup_TeleInt(struct IsdnCard *card) { struct IsdnCardState *cs = card->cs; diff --git a/drivers/isdn/hisax/teles0.c b/drivers/isdn/hisax/teles0.c index f94af0930..2b7df8f98 100644 --- a/drivers/isdn/hisax/teles0.c +++ b/drivers/isdn/hisax/teles0.c @@ -265,7 +265,7 @@ Teles_card_msg(struct IsdnCardState *cs, int mt, void *arg) return(0); } -int __devinit +int __init setup_teles0(struct IsdnCard *card) { u_char val; diff --git a/drivers/isdn/hisax/teles3.c b/drivers/isdn/hisax/teles3.c index 5cb712437..a3eaf4d65 100644 --- a/drivers/isdn/hisax/teles3.c +++ b/drivers/isdn/hisax/teles3.c @@ -369,7 +369,6 @@ setup_teles3(struct IsdnCard *card) cs->hw.teles3.hscx[1] + 96); return (0); } - cs->irq_flags |= IRQF_SHARED; /* cardbus can share */ } else { if (cs->hw.teles3.cfg_reg) { if (cs->typ == ISDN_CTYPE_COMPAQ_ISA) { diff --git a/drivers/isdn/hisax/teles_cs.c b/drivers/isdn/hisax/teles_cs.c index afcc2aead..4e5c14c72 100644 --- a/drivers/isdn/hisax/teles_cs.c +++ b/drivers/isdn/hisax/teles_cs.c @@ -75,8 +75,8 @@ module_param(protocol, int, 0); handler. */ -static int teles_cs_config(struct pcmcia_device *link); -static void teles_cs_release(struct pcmcia_device *link); +static void teles_cs_config(dev_link_t *link); +static void teles_cs_release(dev_link_t *link); /* The attach() and detach() entry points are used to create and destroy @@ -89,10 +89,10 @@ static void teles_detach(struct pcmcia_device *p_dev); /* A linked list of "instances" of the teles_cs device. Each actual PCMCIA card corresponds to one device instance, and is described - by one struct pcmcia_device structure (defined in ds.h). + by one dev_link_t structure (defined in ds.h). You may not want to use a linked list for this -- for example, the - memory card driver uses an array of struct pcmcia_device pointers, where minor + memory card driver uses an array of dev_link_t pointers, where minor device numbers are used to derive the corresponding array index. */ @@ -102,7 +102,7 @@ static void teles_detach(struct pcmcia_device *p_dev); example, ethernet cards, modems). In other cases, there may be many actual or logical devices (SCSI adapters, memory cards with multiple partitions). The dev_node_t structures need to be kept - in a linked list starting at the 'dev' field of a struct pcmcia_device + in a linked list starting at the 'dev' field of a dev_link_t structure. We allocate them in the card's private data structure, because they generally shouldn't be allocated dynamically. In this case, we also provide a flag to indicate if a device is @@ -112,7 +112,7 @@ static void teles_detach(struct pcmcia_device *p_dev); */ typedef struct local_info_t { - struct pcmcia_device *p_dev; + dev_link_t link; dev_node_t node; int busy; int cardnr; @@ -130,8 +130,9 @@ typedef struct local_info_t { ======================================================================*/ -static int teles_probe(struct pcmcia_device *link) +static int teles_attach(struct pcmcia_device *p_dev) { + dev_link_t *link; local_info_t *local; DEBUG(0, "teles_attach()\n"); @@ -141,9 +142,7 @@ static int teles_probe(struct pcmcia_device *link) if (!local) return -ENOMEM; memset(local, 0, sizeof(local_info_t)); local->cardnr = -1; - - local->p_dev = link; - link->priv = local; + link = &local->link; link->priv = local; /* Interrupt setup */ link->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING|IRQ_FIRST_SHARED; @@ -162,9 +161,16 @@ static int teles_probe(struct pcmcia_device *link) link->io.IOAddrLines = 5; link->conf.Attributes = CONF_ENABLE_IRQ; + link->conf.Vcc = 50; link->conf.IntType = INT_MEMORY_AND_IO; - return teles_cs_config(link); + link->handle = p_dev; + p_dev->instance = link; + + link->state |= DEV_PRESENT | DEV_CONFIG_PENDING; + teles_cs_config(link); + + return 0; } /* teles_attach */ /*====================================================================== @@ -176,16 +182,20 @@ static int teles_probe(struct pcmcia_device *link) ======================================================================*/ -static void teles_detach(struct pcmcia_device *link) +static void teles_detach(struct pcmcia_device *p_dev) { - local_info_t *info = link->priv; + dev_link_t *link = dev_to_instance(p_dev); + local_info_t *info = link->priv; + + DEBUG(0, "teles_detach(0x%p)\n", link); - DEBUG(0, "teles_detach(0x%p)\n", link); + if (link->state & DEV_CONFIG) { + info->busy = 1; + teles_cs_release(link); + } - info->busy = 1; - teles_cs_release(link); + kfree(info); - kfree(info); } /* teles_detach */ /*====================================================================== @@ -195,7 +205,7 @@ static void teles_detach(struct pcmcia_device *link) device available to the system. ======================================================================*/ -static int get_tuple(struct pcmcia_device *handle, tuple_t *tuple, +static int get_tuple(client_handle_t handle, tuple_t *tuple, cisparse_t *parse) { int i = pcmcia_get_tuple_data(handle, tuple); @@ -203,7 +213,7 @@ static int get_tuple(struct pcmcia_device *handle, tuple_t *tuple, return pcmcia_parse_tuple(handle, tuple, parse); } -static int first_tuple(struct pcmcia_device *handle, tuple_t *tuple, +static int first_tuple(client_handle_t handle, tuple_t *tuple, cisparse_t *parse) { int i = pcmcia_get_first_tuple(handle, tuple); @@ -211,7 +221,7 @@ static int first_tuple(struct pcmcia_device *handle, tuple_t *tuple, return get_tuple(handle, tuple, parse); } -static int next_tuple(struct pcmcia_device *handle, tuple_t *tuple, +static int next_tuple(client_handle_t handle, tuple_t *tuple, cisparse_t *parse) { int i = pcmcia_get_next_tuple(handle, tuple); @@ -219,8 +229,9 @@ static int next_tuple(struct pcmcia_device *handle, tuple_t *tuple, return get_tuple(handle, tuple, parse); } -static int teles_cs_config(struct pcmcia_device *link) +static void teles_cs_config(dev_link_t *link) { + client_handle_t handle; tuple_t tuple; cisparse_t parse; local_info_t *dev; @@ -230,6 +241,7 @@ static int teles_cs_config(struct pcmcia_device *link) IsdnCard_t icard; DEBUG(0, "teles_config(0x%p)\n", link); + handle = link->handle; dev = link->priv; /* @@ -241,7 +253,7 @@ static int teles_cs_config(struct pcmcia_device *link) tuple.TupleDataMax = 255; tuple.TupleOffset = 0; tuple.Attributes = 0; - i = first_tuple(link, &tuple, &parse); + i = first_tuple(handle, &tuple, &parse); if (i != CS_SUCCESS) { last_fn = ParseTuple; goto cs_failed; @@ -249,29 +261,32 @@ static int teles_cs_config(struct pcmcia_device *link) link->conf.ConfigBase = parse.config.base; link->conf.Present = parse.config.rmask[0]; + /* Configure card */ + link->state |= DEV_CONFIG; + tuple.TupleData = (cisdata_t *)buf; tuple.TupleOffset = 0; tuple.TupleDataMax = 255; tuple.Attributes = 0; tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY; - i = first_tuple(link, &tuple, &parse); + i = first_tuple(handle, &tuple, &parse); while (i == CS_SUCCESS) { if ( (cf->io.nwin > 0) && cf->io.win[0].base) { printk(KERN_INFO "(teles_cs: looks like the 96 model)\n"); link->conf.ConfigIndex = cf->index; link->io.BasePort1 = cf->io.win[0].base; - i = pcmcia_request_io(link, &link->io); + i = pcmcia_request_io(link->handle, &link->io); if (i == CS_SUCCESS) break; } else { printk(KERN_INFO "(teles_cs: looks like the 97 model)\n"); link->conf.ConfigIndex = cf->index; for (i = 0, j = 0x2f0; j > 0x100; j -= 0x10) { link->io.BasePort1 = j; - i = pcmcia_request_io(link, &link->io); + i = pcmcia_request_io(link->handle, &link->io); if (i == CS_SUCCESS) break; } break; } - i = next_tuple(link, &tuple, &parse); + i = next_tuple(handle, &tuple, &parse); } if (i != CS_SUCCESS) { @@ -279,14 +294,14 @@ static int teles_cs_config(struct pcmcia_device *link) goto cs_failed; } - i = pcmcia_request_irq(link, &link->irq); + i = pcmcia_request_irq(link->handle, &link->irq); if (i != CS_SUCCESS) { link->irq.AssignedIRQ = 0; last_fn = RequestIRQ; goto cs_failed; } - i = pcmcia_request_configuration(link, &link->conf); + i = pcmcia_request_configuration(link->handle, &link->conf); if (i != CS_SUCCESS) { last_fn = RequestConfiguration; goto cs_failed; @@ -297,11 +312,14 @@ static int teles_cs_config(struct pcmcia_device *link) sprintf(dev->node.dev_name, "teles"); dev->node.major = dev->node.minor = 0x0; - link->dev_node = &dev->node; + link->dev = &dev->node; /* Finally, report what we've done */ - printk(KERN_INFO "%s: index 0x%02x:", - dev->node.dev_name, link->conf.ConfigIndex); + 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); if (link->conf.Attributes & CONF_ENABLE_IRQ) printk(", irq %d", link->irq.AssignedIRQ); if (link->io.NumPorts1) @@ -312,6 +330,8 @@ static int teles_cs_config(struct pcmcia_device *link) link->io.BasePort2+link->io.NumPorts2-1); printk("\n"); + link->state &= ~DEV_CONFIG_PENDING; + icard.para[0] = link->irq.AssignedIRQ; icard.para[1] = link->io.BasePort1; icard.protocol = protocol; @@ -322,16 +342,13 @@ static int teles_cs_config(struct pcmcia_device *link) printk(KERN_ERR "teles_cs: failed to initialize Teles PCMCIA %d at i/o %#x\n", i, link->io.BasePort1); teles_cs_release(link); - return -ENODEV; - } - - ((local_info_t*)link->priv)->cardnr = i; - return 0; + } else + ((local_info_t*)link->priv)->cardnr = i; + return; cs_failed: - cs_error(link, last_fn, i); + cs_error(link->handle, last_fn, i); teles_cs_release(link); - return -ENODEV; } /* teles_cs_config */ /*====================================================================== @@ -342,7 +359,7 @@ cs_failed: ======================================================================*/ -static void teles_cs_release(struct pcmcia_device *link) +static void teles_cs_release(dev_link_t *link) { local_info_t *local = link->priv; @@ -354,23 +371,39 @@ static void teles_cs_release(struct pcmcia_device *link) HiSax_closecard(local->cardnr); } } - - pcmcia_disable_device(link); + /* Unlink the device chain */ + link->dev = NULL; + + /* Don't bother checking to see if these succeed or not */ + if (link->win) + pcmcia_release_window(link->win); + pcmcia_release_configuration(link->handle); + pcmcia_release_io(link->handle, &link->io); + pcmcia_release_irq(link->handle, &link->irq); + link->state &= ~DEV_CONFIG; } /* teles_cs_release */ -static int teles_suspend(struct pcmcia_device *link) +static int teles_suspend(struct pcmcia_device *p_dev) { + dev_link_t *link = dev_to_instance(p_dev); local_info_t *dev = link->priv; + link->state |= DEV_SUSPEND; dev->busy = 1; + if (link->state & DEV_CONFIG) + pcmcia_release_configuration(link->handle); return 0; } -static int teles_resume(struct pcmcia_device *link) +static int teles_resume(struct pcmcia_device *p_dev) { + dev_link_t *link = dev_to_instance(p_dev); local_info_t *dev = link->priv; + link->state &= ~DEV_SUSPEND; + if (link->state & DEV_CONFIG) + pcmcia_request_configuration(link->handle, &link->conf); dev->busy = 0; return 0; @@ -388,7 +421,7 @@ static struct pcmcia_driver teles_cs_driver = { .drv = { .name = "teles_cs", }, - .probe = teles_probe, + .probe = teles_attach, .remove = teles_detach, .id_table = teles_ids, .suspend = teles_suspend, diff --git a/drivers/isdn/hisax/telespci.c b/drivers/isdn/hisax/telespci.c index dca446865..e2bb4fd8e 100644 --- a/drivers/isdn/hisax/telespci.c +++ b/drivers/isdn/hisax/telespci.c @@ -13,6 +13,7 @@ */ #include +#include #include "hisax.h" #include "isac.h" #include "hscx.h" @@ -284,9 +285,9 @@ TelesPCI_card_msg(struct IsdnCardState *cs, int mt, void *arg) return(0); } -static struct pci_dev *dev_tel __devinitdata = NULL; +static struct pci_dev *dev_tel __initdata = NULL; -int __devinit +int __init setup_telespci(struct IsdnCard *card) { struct IsdnCardState *cs = card->cs; @@ -310,9 +311,8 @@ setup_telespci(struct IsdnCard *card) } cs->hw.teles0.membase = ioremap(pci_resource_start(dev_tel, 0), PAGE_SIZE); - printk(KERN_INFO "Found: Zoran, base-address: 0x%llx, irq: 0x%x\n", - (unsigned long long)pci_resource_start(dev_tel, 0), - dev_tel->irq); + printk(KERN_INFO "Found: Zoran, base-address: 0x%lx, irq: 0x%x\n", + pci_resource_start(dev_tel, 0), dev_tel->irq); } else { printk(KERN_WARNING "TelesPCI: No PCI card found\n"); return(0); @@ -347,7 +347,7 @@ setup_telespci(struct IsdnCard *card) cs->BC_Send_Data = &hscx_fill_fifo; cs->cardmsg = &TelesPCI_card_msg; cs->irq_func = &telespci_interrupt; - cs->irq_flags |= IRQF_SHARED; + cs->irq_flags |= SA_SHIRQ; ISACVersion(cs, "TelesPCI:"); if (HscxVersion(cs, "TelesPCI:")) { printk(KERN_WARNING diff --git a/drivers/isdn/hisax/w6692.c b/drivers/isdn/hisax/w6692.c index 0595293b8..0352ee5f7 100644 --- a/drivers/isdn/hisax/w6692.c +++ b/drivers/isdn/hisax/w6692.c @@ -10,6 +10,7 @@ * */ +#include #include #include "hisax.h" #include "w6692.h" @@ -44,11 +45,11 @@ static const char *w6692_revision = "$Revision: 1.18.2.4 $"; #define DBUSY_TIMER_VALUE 80 -static char *W6692Ver[] = +static char *W6692Ver[] __initdata = {"W6692 V00", "W6692 V01", "W6692 V10", "W6692 V11"}; -static void +static void __init W6692Version(struct IsdnCardState *cs, char *s) { int val; @@ -897,7 +898,7 @@ static void resetW6692(struct IsdnCardState *cs) } } -static void initW6692(struct IsdnCardState *cs, int part) +static void __init initW6692(struct IsdnCardState *cs, int part) { if (part & 1) { cs->setstack_d = setstack_W6692; @@ -992,9 +993,9 @@ w6692_card_msg(struct IsdnCardState *cs, int mt, void *arg) static int id_idx ; -static struct pci_dev *dev_w6692 __devinitdata = NULL; +static struct pci_dev *dev_w6692 __initdata = NULL; -int __devinit +int __init setup_w6692(struct IsdnCard *card) { struct IsdnCardState *cs = card->cs; @@ -1080,7 +1081,7 @@ setup_w6692(struct IsdnCard *card) cs->BC_Send_Data = &W6692B_fill_fifo; cs->cardmsg = &w6692_card_msg; cs->irq_func = &W6692_interrupt; - cs->irq_flags |= IRQF_SHARED; + cs->irq_flags |= SA_SHIRQ; W6692Version(cs, "W6692:"); printk(KERN_INFO "W6692 ISTA=0x%X\n", ReadW6692(cs, W_ISTA)); printk(KERN_INFO "W6692 IMASK=0x%X\n", ReadW6692(cs, W_IMASK)); diff --git a/drivers/isdn/hysdn/boardergo.c b/drivers/isdn/hysdn/boardergo.c index 73afebdf8..e19a01a30 100644 --- a/drivers/isdn/hysdn/boardergo.c +++ b/drivers/isdn/hysdn/boardergo.c @@ -14,6 +14,7 @@ * */ +#include #include #include #include @@ -37,8 +38,8 @@ ergo_interrupt(int intno, void *dev_id, struct pt_regs *regs) { hysdn_card *card = dev_id; /* parameter from irq */ tErgDpram *dpr; - unsigned long flags; - unsigned char volatile b; + ulong flags; + uchar volatile b; if (!card) return IRQ_NONE; /* error -> spurious interrupt */ @@ -76,7 +77,7 @@ ergo_irq_bh(hysdn_card * card) { tErgDpram *dpr; int again; - unsigned long flags; + ulong flags; if (card->state != CARD_STATE_RUN) return; /* invalid call */ @@ -130,8 +131,8 @@ ergo_irq_bh(hysdn_card * card) static void ergo_stopcard(hysdn_card * card) { - unsigned long flags; - unsigned char val; + ulong flags; + uchar val; hysdn_net_release(card); /* first release the net device if existing */ #ifdef CONFIG_HYSDN_CAPI @@ -156,7 +157,7 @@ ergo_stopcard(hysdn_card * card) static void ergo_set_errlog_state(hysdn_card * card, int on) { - unsigned long flags; + ulong flags; if (card->state != CARD_STATE_RUN) { card->err_log_state = ERRLOG_STATE_OFF; /* must be off */ @@ -216,10 +217,9 @@ ergo_testram(hysdn_card * card) /* Negative return values are interpreted as errors. */ /*****************************************************************************/ static int -ergo_writebootimg(struct HYSDN_CARD *card, unsigned char *buf, - unsigned long offs) +ergo_writebootimg(struct HYSDN_CARD *card, uchar * buf, ulong offs) { - unsigned char *dst; + uchar *dst; tErgDpram *dpram; int cnt = (BOOT_IMG_SIZE >> 2); /* number of words to move and swap (byte order!) */ @@ -264,14 +264,14 @@ ergo_writebootimg(struct HYSDN_CARD *card, unsigned char *buf, /* case of errors a negative error value is returned. */ /********************************************************************************/ static int -ergo_writebootseq(struct HYSDN_CARD *card, unsigned char *buf, int len) +ergo_writebootseq(struct HYSDN_CARD *card, uchar * buf, int len) { tDpramBootSpooler *sp = (tDpramBootSpooler *) card->dpram; - unsigned char *dst; - unsigned char buflen; + uchar *dst; + uchar buflen; int nr_write; - unsigned char tmp_rdptr; - unsigned char wr_mirror; + uchar tmp_rdptr; + uchar wr_mirror; int i; if (card->debug_flags & LOG_POF_CARD) @@ -330,7 +330,7 @@ ergo_waitpofready(struct HYSDN_CARD *card) { tErgDpram *dpr = card->dpram; /* pointer to DPRAM structure */ int timecnt = 10000 / 50; /* timeout is 10 secs max. */ - unsigned long flags; + ulong flags; int msg_size; int i; @@ -345,7 +345,7 @@ ergo_waitpofready(struct HYSDN_CARD *card) if ((dpr->ToPcChannel != CHAN_SYSTEM) || (dpr->ToPcSize < MIN_RDY_MSG_SIZE) || (dpr->ToPcSize > MAX_RDY_MSG_SIZE) || - ((*(unsigned long *) dpr->ToPcBuf) != RDY_MAGIC)) + ((*(ulong *) dpr->ToPcBuf) != RDY_MAGIC)) break; /* an error occurred */ /* Check for additional data delivered during SysReady */ @@ -435,7 +435,7 @@ ergo_inithardware(hysdn_card * card) } ergo_stopcard(card); /* disable interrupts */ - if (request_irq(card->irq, ergo_interrupt, IRQF_SHARED, "HYSDN", card)) { + if (request_irq(card->irq, ergo_interrupt, SA_SHIRQ, "HYSDN", card)) { ergo_releasehardware(card); /* return the acquired hardware */ return (-1); } diff --git a/drivers/isdn/hysdn/boardergo.h b/drivers/isdn/hysdn/boardergo.h index c59422aa8..b56ff0889 100644 --- a/drivers/isdn/hysdn/boardergo.h +++ b/drivers/isdn/hysdn/boardergo.h @@ -23,36 +23,36 @@ /* following DPRAM layout copied from OS2-driver boarderg.h */ typedef struct ErgDpram_tag { -/*0000 */ unsigned char ToHyBuf[ERG_TO_HY_BUF_SIZE]; -/*0E00 */ unsigned char ToPcBuf[ERG_TO_PC_BUF_SIZE]; +/*0000 */ uchar ToHyBuf[ERG_TO_HY_BUF_SIZE]; +/*0E00 */ uchar ToPcBuf[ERG_TO_PC_BUF_SIZE]; - /*1C00 */ unsigned char bSoftUart[SIZE_RSV_SOFT_UART]; + /*1C00 */ uchar bSoftUart[SIZE_RSV_SOFT_UART]; /* size 0x1B0 */ - /*1DB0 *//* tErrLogEntry */ unsigned char volatile ErrLogMsg[64]; + /*1DB0 *//* tErrLogEntry */ uchar volatile ErrLogMsg[64]; /* size 64 bytes */ - /*1DB0 unsigned long ulErrType; */ - /*1DB4 unsigned long ulErrSubtype; */ - /*1DB8 unsigned long ucTextSize; */ - /*1DB9 unsigned long ucText[ERRLOG_TEXT_SIZE]; *//* ASCIIZ of len ucTextSize-1 */ + /*1DB0 ulong ulErrType; */ + /*1DB4 ulong ulErrSubtype; */ + /*1DB8 ulong ucTextSize; */ + /*1DB9 ulong ucText[ERRLOG_TEXT_SIZE]; *//* ASCIIZ of len ucTextSize-1 */ /*1DF0 */ -/*1DF0 */ unsigned short volatile ToHyChannel; -/*1DF2 */ unsigned short volatile ToHySize; - /*1DF4 */ unsigned char volatile ToHyFlag; +/*1DF0 */ word volatile ToHyChannel; +/*1DF2 */ word volatile ToHySize; + /*1DF4 */ uchar volatile ToHyFlag; /* !=0: msg for Hy waiting */ - /*1DF5 */ unsigned char volatile ToPcFlag; + /*1DF5 */ uchar volatile ToPcFlag; /* !=0: msg for PC waiting */ -/*1DF6 */ unsigned short volatile ToPcChannel; -/*1DF8 */ unsigned short volatile ToPcSize; - /*1DFA */ unsigned char bRes1DBA[0x1E00 - 0x1DFA]; +/*1DF6 */ word volatile ToPcChannel; +/*1DF8 */ word volatile ToPcSize; + /*1DFA */ uchar bRes1DBA[0x1E00 - 0x1DFA]; /* 6 bytes */ -/*1E00 */ unsigned char bRestOfEntryTbl[0x1F00 - 0x1E00]; -/*1F00 */ unsigned long TrapTable[62]; - /*1FF8 */ unsigned char bRes1FF8[0x1FFB - 0x1FF8]; +/*1E00 */ uchar bRestOfEntryTbl[0x1F00 - 0x1E00]; +/*1F00 */ ulong TrapTable[62]; + /*1FF8 */ uchar bRes1FF8[0x1FFB - 0x1FF8]; /* low part of reset vetor */ -/*1FFB */ unsigned char ToPcIntMetro; +/*1FFB */ uchar ToPcIntMetro; /* notes: * - metro has 32-bit boot ram - accessing * ToPcInt and ToHyInt would be the same; @@ -65,16 +65,16 @@ typedef struct ErgDpram_tag { * so E1 side should NOT change this byte * when writing! */ -/*1FFC */ unsigned char volatile ToHyNoDpramErrLog; +/*1FFC */ uchar volatile ToHyNoDpramErrLog; /* note: ToHyNoDpramErrLog is used to inform * boot loader, not to use DPRAM based * ErrLog; when DOS driver is rewritten * this becomes obsolete */ -/*1FFD */ unsigned char bRes1FFD; - /*1FFE */ unsigned char ToPcInt; +/*1FFD */ uchar bRes1FFD; + /*1FFE */ uchar ToPcInt; /* E1_intclear; on CHAMP2: E1_intset */ - /*1FFF */ unsigned char ToHyInt; + /*1FFF */ uchar ToHyInt; /* E1_intset; on CHAMP2: E1_intclear */ } tErgDpram; diff --git a/drivers/isdn/hysdn/hycapi.c b/drivers/isdn/hysdn/hycapi.c index 6bac43cc9..acc1d3cce 100644 --- a/drivers/isdn/hysdn/hycapi.c +++ b/drivers/isdn/hysdn/hycapi.c @@ -31,7 +31,7 @@ static char hycapi_revision[]="$Revision: 1.8.6.4 $"; unsigned int hycapi_enable = 0xffffffff; -module_param(hycapi_enable, uint, 0); +MODULE_PARM(hycapi_enable, "i"); typedef struct _hycapi_appl { unsigned int ctrl_mask; @@ -523,7 +523,7 @@ New nccis are created if necessary. *******************************************************************/ void -hycapi_rx_capipkt(hysdn_card * card, unsigned char *buf, unsigned short len) +hycapi_rx_capipkt(hysdn_card * card, uchar * buf, word len) { struct sk_buff *skb; hycapictrl_info *cinfo = card->hyctrlinfo; diff --git a/drivers/isdn/hysdn/hysdn_boot.c b/drivers/isdn/hysdn/hysdn_boot.c index 6d0eb0f42..7bfba196f 100644 --- a/drivers/isdn/hysdn/hysdn_boot.c +++ b/drivers/isdn/hysdn/hysdn_boot.c @@ -30,17 +30,17 @@ /* needed during boot and so allocated dynamically. */ /************************************************************/ struct boot_data { - unsigned short Cryptor; /* for use with Decrypt function */ - unsigned short Nrecs; /* records remaining in file */ - unsigned char pof_state;/* actual state of read handler */ - unsigned char is_crypted;/* card data is crypted */ + word Cryptor; /* for use with Decrypt function */ + word Nrecs; /* records remaining in file */ + uchar pof_state; /* actual state of read handler */ + uchar is_crypted; /* card data is crypted */ int BufSize; /* actual number of bytes bufferd */ int last_error; /* last occurred error */ - unsigned short pof_recid;/* actual pof recid */ - unsigned long pof_reclen;/* total length of pof record data */ - unsigned long pof_recoffset;/* actual offset inside pof record */ + word pof_recid; /* actual pof recid */ + ulong pof_reclen; /* total length of pof record data */ + ulong pof_recoffset; /* actual offset inside pof record */ union { - unsigned char BootBuf[BOOT_BUF_SIZE];/* buffer as byte count */ + uchar BootBuf[BOOT_BUF_SIZE]; /* buffer as byte count */ tPofRecHdr PofRecHdr; /* header for actual record/chunk */ tPofFileHdr PofFileHdr; /* header from POF file */ tPofTimeStamp PofTime; /* time information */ @@ -69,11 +69,11 @@ StartDecryption(struct boot_data *boot) static void DecryptBuf(struct boot_data *boot, int cnt) { - unsigned char *bufp = boot->buf.BootBuf; + uchar *bufp = boot->buf.BootBuf; while (cnt--) { boot->Cryptor = (boot->Cryptor >> 1) ^ ((boot->Cryptor & 1U) ? CRYPT_FEEDTERM : 0); - *bufp++ ^= (unsigned char)boot->Cryptor; + *bufp++ ^= (uchar) boot->Cryptor; } } /* DecryptBuf */ @@ -86,7 +86,7 @@ pof_handle_data(hysdn_card * card, int datlen) { struct boot_data *boot = card->boot; /* pointer to boot specific data */ long l; - unsigned char *imgp; + uchar *imgp; int img_len; /* handle the different record types */ @@ -197,7 +197,7 @@ pof_write_buffer(hysdn_card * card, int datlen) break; } /* Setup the new state and vars */ - boot->Nrecs = (unsigned short)(boot->buf.PofFileHdr.N_PofRecs); /* limited to 65535 */ + boot->Nrecs = (word) (boot->buf.PofFileHdr.N_PofRecs); /* limited to 65535 */ boot->pof_state = POF_READ_TAG_HEAD; /* now start with single tags */ boot->last_error = sizeof(tPofRecHdr); /* new length */ break; @@ -268,7 +268,7 @@ pof_write_buffer(hysdn_card * card, int datlen) /* occurred. Additionally the pointer to the buffer data area is set on success */ /*******************************************************************************/ int -pof_write_open(hysdn_card * card, unsigned char **bufp) +pof_write_open(hysdn_card * card, uchar ** bufp) { struct boot_data *boot; /* pointer to boot specific data */ @@ -335,7 +335,7 @@ pof_write_close(hysdn_card * card) /* when POF has been booted. A return value of 0 is used if no error occurred. */ /*********************************************************************************/ int -EvalSysrTokData(hysdn_card *card, unsigned char *cp, int len) +EvalSysrTokData(hysdn_card * card, uchar * cp, int len) { u_char *p; u_char crc; diff --git a/drivers/isdn/hysdn/hysdn_defs.h b/drivers/isdn/hysdn/hysdn_defs.h index 461e83159..432f6f990 100644 --- a/drivers/isdn/hysdn/hysdn_defs.h +++ b/drivers/isdn/hysdn/hysdn_defs.h @@ -14,11 +14,20 @@ #ifndef HYSDN_DEFS_H #define HYSDN_DEFS_H +#include #include #include #include #include +/****************************/ +/* storage type definitions */ +/****************************/ +#define uchar unsigned char +#define uint unsigned int +#define ulong unsigned long +#define word unsigned short + #include "ince1pc.h" #ifdef CONFIG_HYSDN_CAPI @@ -138,18 +147,18 @@ typedef struct HYSDN_CARD { /* general variables for the cards */ int myid; /* own driver card id */ - unsigned char bus; /* pci bus the card is connected to */ - unsigned char devfn; /* slot+function bit encoded */ - unsigned short subsysid;/* PCI subsystem id */ - unsigned char brdtype; /* type of card */ - unsigned int bchans; /* number of available B-channels */ - unsigned int faxchans; /* number of available fax-channels */ - unsigned char mac_addr[6];/* MAC Address read from card */ - unsigned int irq; /* interrupt number */ - unsigned int iobase; /* IO-port base address */ - unsigned long plxbase; /* PLX memory base */ - unsigned long membase; /* DPRAM memory base */ - unsigned long memend; /* DPRAM memory end */ + uchar bus; /* pci bus the card is connected to */ + uchar devfn; /* slot+function bit encoded */ + word subsysid; /* PCI subsystem id */ + uchar brdtype; /* type of card */ + uint bchans; /* number of available B-channels */ + uint faxchans; /* number of available fax-channels */ + uchar mac_addr[6]; /* MAC Address read from card */ + uint irq; /* interrupt number */ + uint iobase; /* IO-port base address */ + ulong plxbase; /* PLX memory base */ + ulong membase; /* DPRAM memory base */ + ulong memend; /* DPRAM memory end */ void *dpram; /* mapped dpram */ int state; /* actual state of card -> CARD_STATE_** */ struct HYSDN_CARD *next; /* pointer to next card */ @@ -159,26 +168,26 @@ typedef struct HYSDN_CARD { void *procconf; /* pointer to procconf filesystem specific data */ /* debugging and logging */ - unsigned char err_log_state;/* actual error log state of the card */ - unsigned long debug_flags;/* tells what should be debugged and where */ + uchar err_log_state; /* actual error log state of the card */ + ulong debug_flags; /* tells what should be debugged and where */ void (*set_errlog_state) (struct HYSDN_CARD *, int); /* interrupt handler + interrupt synchronisation */ struct work_struct irq_queue; /* interrupt task queue */ - unsigned char volatile irq_enabled;/* interrupt enabled if != 0 */ - unsigned char volatile hw_lock;/* hardware is currently locked -> no access */ + uchar volatile irq_enabled; /* interrupt enabled if != 0 */ + uchar volatile hw_lock; /* hardware is currently locked -> no access */ /* boot process */ void *boot; /* pointer to boot private data */ - int (*writebootimg) (struct HYSDN_CARD *, unsigned char *, unsigned long); - int (*writebootseq) (struct HYSDN_CARD *, unsigned char *, int); + int (*writebootimg) (struct HYSDN_CARD *, uchar *, ulong); + int (*writebootseq) (struct HYSDN_CARD *, uchar *, int); int (*waitpofready) (struct HYSDN_CARD *); int (*testram) (struct HYSDN_CARD *); /* scheduler for data transfer (only async parts) */ - unsigned char async_data[256];/* async data to be sent (normally for config) */ - unsigned short volatile async_len;/* length of data to sent */ - unsigned short volatile async_channel;/* channel number for async transfer */ + uchar async_data[256]; /* async data to be sent (normally for config) */ + word volatile async_len; /* length of data to sent */ + word volatile async_channel; /* channel number for async transfer */ int volatile async_busy; /* flag != 0 sending in progress */ int volatile net_tx_busy; /* a network packet tx is in progress */ @@ -242,18 +251,15 @@ extern int ergo_inithardware(hysdn_card * card); /* get hardware -> module init /* hysdn_boot.c */ extern int pof_write_close(hysdn_card *); /* close proc file after writing pof */ -extern int pof_write_open(hysdn_card *, unsigned char **); /* open proc file for writing pof */ +extern int pof_write_open(hysdn_card *, uchar **); /* open proc file for writing pof */ extern int pof_write_buffer(hysdn_card *, int); /* write boot data to card */ -extern int EvalSysrTokData(hysdn_card *, unsigned char *, int); /* Check Sysready Token Data */ +extern int EvalSysrTokData(hysdn_card *, uchar *, int); /* Check Sysready Token Data */ /* hysdn_sched.c */ -extern int hysdn_sched_tx(hysdn_card *, unsigned char *, - unsigned short volatile *, unsigned short volatile *, - unsigned short); -extern int hysdn_sched_rx(hysdn_card *, unsigned char *, unsigned short, - unsigned short); -extern int hysdn_tx_cfgline(hysdn_card *, unsigned char *, - unsigned short); /* send one cfg line */ +extern int hysdn_sched_tx(hysdn_card *, uchar *, word volatile *, word volatile *, + word); +extern int hysdn_sched_rx(hysdn_card *, uchar *, word, word); +extern int hysdn_tx_cfgline(hysdn_card *, uchar *, word); /* send one cfg line */ /* hysdn_net.c */ extern unsigned int hynet_enable; @@ -263,16 +269,14 @@ extern int hysdn_net_release(hysdn_card *); /* delete the device */ extern char *hysdn_net_getname(hysdn_card *); /* get name of net interface */ extern void hysdn_tx_netack(hysdn_card *); /* acknowledge a packet tx */ extern struct sk_buff *hysdn_tx_netget(hysdn_card *); /* get next network packet */ -extern void hysdn_rx_netpkt(hysdn_card *, unsigned char *, - unsigned short); /* rxed packet from network */ +extern void hysdn_rx_netpkt(hysdn_card *, uchar *, word); /* rxed packet from network */ #ifdef CONFIG_HYSDN_CAPI extern unsigned int hycapi_enable; extern int hycapi_capi_create(hysdn_card *); /* create a new capi device */ extern int hycapi_capi_release(hysdn_card *); /* delete the device */ extern int hycapi_capi_stop(hysdn_card *card); /* suspend */ -extern void hycapi_rx_capipkt(hysdn_card * card, unsigned char * buf, - unsigned short len); +extern void hycapi_rx_capipkt(hysdn_card * card, uchar * buf, word len); extern void hycapi_tx_capiack(hysdn_card * card); extern struct sk_buff *hycapi_tx_capiget(hysdn_card *card); extern int hycapi_init(void); diff --git a/drivers/isdn/hysdn/hysdn_init.c b/drivers/isdn/hysdn/hysdn_init.c index b702ed272..cb791f8e7 100644 --- a/drivers/isdn/hysdn/hysdn_init.c +++ b/drivers/isdn/hysdn/hysdn_init.c @@ -10,6 +10,7 @@ * */ +#include #include #include #include @@ -40,8 +41,8 @@ hysdn_card *card_root = NULL; /* pointer to first card */ /* the last entry contains all 0 */ /**********************************************/ static struct { - unsigned short subid; /* PCI sub id */ - unsigned char cardtyp; /* card type assigned */ + word subid; /* PCI sub id */ + uchar cardtyp; /* card type assigned */ } pci_subid_map[] = { { diff --git a/drivers/isdn/hysdn/hysdn_net.c b/drivers/isdn/hysdn/hysdn_net.c index d205249a1..aa01628d7 100644 --- a/drivers/isdn/hysdn/hysdn_net.c +++ b/drivers/isdn/hysdn/hysdn_net.c @@ -24,7 +24,7 @@ #include "hysdn_defs.h" unsigned int hynet_enable = 0xffffffff; -module_param(hynet_enable, uint, 0); +MODULE_PARM(hynet_enable, "i"); /* store the actual version for log reporting */ char *hysdn_net_revision = "$Revision: 1.8.6.4 $"; @@ -83,12 +83,12 @@ net_open(struct net_device *dev) /* Fill in the MAC-level header (if not already set) */ if (!card->mac_addr[0]) { - for (i = 0; i < ETH_ALEN - sizeof(unsigned long); i++) + for (i = 0; i < ETH_ALEN - sizeof(ulong); i++) dev->dev_addr[i] = 0xfc; if ((in_dev = dev->ip_ptr) != NULL) { struct in_ifaddr *ifa = in_dev->ifa_list; if (ifa != NULL) - memcpy(dev->dev_addr + (ETH_ALEN - sizeof(unsigned long)), &ifa->ifa_local, sizeof(unsigned long)); + memcpy(dev->dev_addr + (ETH_ALEN - sizeof(ulong)), &ifa->ifa_local, sizeof(ulong)); } } else memcpy(dev->dev_addr, card->mac_addr, ETH_ALEN); @@ -197,7 +197,7 @@ hysdn_tx_netack(hysdn_card * card) /* we got a packet from the network, go and queue it */ /*****************************************************/ void -hysdn_rx_netpkt(hysdn_card * card, unsigned char *buf, unsigned short len) +hysdn_rx_netpkt(hysdn_card * card, uchar * buf, word len) { struct net_local *lp = card->netif; struct sk_buff *skb; diff --git a/drivers/isdn/hysdn/hysdn_pof.h b/drivers/isdn/hysdn/hysdn_pof.h index a368d6cac..6cd81b9b0 100644 --- a/drivers/isdn/hysdn/hysdn_pof.h +++ b/drivers/isdn/hysdn/hysdn_pof.h @@ -47,20 +47,20 @@ /*--------------------------------------POF file record structs------------*/ typedef struct PofFileHdr_tag { /* Pof file header */ -/*00 */ unsigned long Magic __attribute__((packed)); -/*04 */ unsigned long N_PofRecs __attribute__((packed)); +/*00 */ ulong Magic __attribute__((packed)); +/*04 */ ulong N_PofRecs __attribute__((packed)); /*08 */ } tPofFileHdr; typedef struct PofRecHdr_tag { /* Pof record header */ -/*00 */ unsigned short PofRecId __attribute__((packed)); -/*02 */ unsigned long PofRecDataLen __attribute__((packed)); +/*00 */ word PofRecId __attribute__((packed)); +/*02 */ ulong PofRecDataLen __attribute__((packed)); /*06 */ } tPofRecHdr; typedef struct PofTimeStamp_tag { -/*00 */ unsigned long UnixTime __attribute__((packed)); - /*04 */ unsigned char DateTimeText[0x28] __attribute__((packed)); +/*00 */ ulong UnixTime __attribute__((packed)); + /*04 */ uchar DateTimeText[0x28] __attribute__((packed)); /* =40 */ /*2C */ } tPofTimeStamp; diff --git a/drivers/isdn/hysdn/hysdn_procconf.c b/drivers/isdn/hysdn/hysdn_procconf.c index 8e2b03889..40e56143c 100644 --- a/drivers/isdn/hysdn/hysdn_procconf.c +++ b/drivers/isdn/hysdn/hysdn_procconf.c @@ -36,9 +36,9 @@ struct conf_writedata { int buf_size; /* actual number of bytes in the buffer */ int needed_size; /* needed size when reading pof */ int state; /* actual interface states from above constants */ - unsigned char conf_line[CONF_LINE_LEN]; /* buffered conf line */ - unsigned short channel; /* active channel number */ - unsigned char *pof_buffer; /* buffer when writing pof */ + uchar conf_line[CONF_LINE_LEN]; /* buffered conf line */ + word channel; /* active channel number */ + uchar *pof_buffer; /* buffer when writing pof */ }; /***********************************************************************/ @@ -49,7 +49,7 @@ struct conf_writedata { static int process_line(struct conf_writedata *cnf) { - unsigned char *cp = cnf->conf_line; + uchar *cp = cnf->conf_line; int i; if (cnf->card->debug_flags & LOG_CNF_LINE) @@ -92,7 +92,7 @@ hysdn_conf_write(struct file *file, const char __user *buf, size_t count, loff_t { struct conf_writedata *cnf; int i; - unsigned char ch, *cp; + uchar ch, *cp; if (!count) return (0); /* nothing to handle */ @@ -390,7 +390,7 @@ int hysdn_procconf_init(void) { hysdn_card *card; - unsigned char conf_name[20]; + uchar conf_name[20]; hysdn_proc_entry = proc_mkdir(PROC_SUBDIR_NAME, proc_net); if (!hysdn_proc_entry) { @@ -423,7 +423,7 @@ void hysdn_procconf_release(void) { hysdn_card *card; - unsigned char conf_name[20]; + uchar conf_name[20]; card = card_root; /* start with first card */ while (card) { diff --git a/drivers/isdn/hysdn/hysdn_proclog.c b/drivers/isdn/hysdn/hysdn_proclog.c index c4301e833..6c26f1efa 100644 --- a/drivers/isdn/hysdn/hysdn_proclog.c +++ b/drivers/isdn/hysdn/hysdn_proclog.c @@ -28,7 +28,7 @@ static void put_log_buffer(hysdn_card * card, char *cp); /*************************************************/ struct log_data { struct log_data *next; - unsigned long usage_cnt;/* number of files still to work */ + ulong usage_cnt; /* number of files still to work */ void *proc_ctrl; /* pointer to own control procdata structure */ char log_start[2]; /* log string start (final len aligned by size) */ }; @@ -42,7 +42,7 @@ struct procdata { struct log_data *log_head, *log_tail; /* head and tail for queue */ int if_used; /* open count for interface */ int volatile del_lock; /* lock for delete operations */ - unsigned char logtmp[LOG_MAX_LINELEN]; + uchar logtmp[LOG_MAX_LINELEN]; wait_queue_head_t rd_queue; }; @@ -153,9 +153,9 @@ put_log_buffer(hysdn_card * card, char *cp) static ssize_t hysdn_log_write(struct file *file, const char __user *buf, size_t count, loff_t * off) { - unsigned long u = 0; + ulong u = 0; int found = 0; - unsigned char *cp, valbuf[128]; + uchar *cp, valbuf[128]; long base = 10; hysdn_card *card = (hysdn_card *) file->private_data; @@ -249,7 +249,7 @@ hysdn_log_open(struct inode *ino, struct file *filep) { hysdn_card *card; struct procdata *pd = NULL; - unsigned long flags; + ulong flags; lock_kernel(); card = card_root; diff --git a/drivers/isdn/hysdn/hysdn_sched.c b/drivers/isdn/hysdn/hysdn_sched.c index 1c0d54ac1..4fa3b0170 100644 --- a/drivers/isdn/hysdn/hysdn_sched.c +++ b/drivers/isdn/hysdn/hysdn_sched.c @@ -11,6 +11,7 @@ * */ +#include #include #include #include @@ -29,8 +30,7 @@ /* to keep the data until later. */ /*****************************************************************************/ int -hysdn_sched_rx(hysdn_card *card, unsigned char *buf, unsigned short len, - unsigned short chan) +hysdn_sched_rx(hysdn_card * card, uchar * buf, word len, word chan) { switch (chan) { @@ -72,9 +72,7 @@ hysdn_sched_rx(hysdn_card *card, unsigned char *buf, unsigned short len, /* sending. */ /*****************************************************************************/ int -hysdn_sched_tx(hysdn_card *card, unsigned char *buf, - unsigned short volatile *len, unsigned short volatile *chan, - unsigned short maxlen) +hysdn_sched_tx(hysdn_card * card, uchar * buf, word volatile *len, word volatile *chan, word maxlen) { struct sk_buff *skb; @@ -147,10 +145,10 @@ hysdn_sched_tx(hysdn_card *card, unsigned char *buf, /* are to be sent and this happens very seldom. */ /*****************************************************************************/ int -hysdn_tx_cfgline(hysdn_card *card, unsigned char *line, unsigned short chan) +hysdn_tx_cfgline(hysdn_card * card, uchar * line, word chan) { int cnt = 50; /* timeout intervalls */ - unsigned long flags; + ulong flags; if (card->debug_flags & LOG_SCHED_ASYN) hysdn_addlog(card, "async tx-cfg chan=%d len=%d", chan, strlen(line) + 1); diff --git a/drivers/isdn/hysdn/ince1pc.h b/drivers/isdn/hysdn/ince1pc.h index 7a36694df..4a115a87c 100644 --- a/drivers/isdn/hysdn/ince1pc.h +++ b/drivers/isdn/hysdn/ince1pc.h @@ -62,7 +62,7 @@ * s. RotlCRC algorithm * * RotlCRC algorithm: - * ucSum= 0 1 unsigned char + * ucSum= 0 1 uchar * for all NonEndTokenChunk bytes: * ROTL(ucSum,1) rotate left by 1 * ucSum += Char; add current byte with swap around @@ -85,13 +85,13 @@ typedef struct ErrLogEntry_tag { -/*00 */ unsigned long ulErrType; +/*00 */ ulong ulErrType; -/*04 */ unsigned long ulErrSubtype; +/*04 */ ulong ulErrSubtype; -/*08 */ unsigned char ucTextSize; +/*08 */ uchar ucTextSize; - /*09 */ unsigned char ucText[ERRLOG_TEXT_SIZE]; + /*09 */ uchar ucText[ERRLOG_TEXT_SIZE]; /* ASCIIZ of len ucTextSize-1 */ /*40 */ @@ -111,13 +111,13 @@ typedef struct ErrLogEntry_tag { #define DPRAM_SPOOLER_DATA_SIZE 0x20 typedef struct DpramBootSpooler_tag { -/*00 */ unsigned char Len; +/*00 */ uchar Len; -/*01 */ volatile unsigned char RdPtr; +/*01 */ volatile uchar RdPtr; -/*02 */ unsigned char WrPtr; +/*02 */ uchar WrPtr; -/*03 */ unsigned char Data[DPRAM_SPOOLER_DATA_SIZE]; +/*03 */ uchar Data[DPRAM_SPOOLER_DATA_SIZE]; /*23 */ } tDpramBootSpooler; diff --git a/drivers/isdn/i4l/Kconfig b/drivers/isdn/i4l/Kconfig index a4f7288a1..1789b607f 100644 --- a/drivers/isdn/i4l/Kconfig +++ b/drivers/isdn/i4l/Kconfig @@ -139,4 +139,3 @@ source "drivers/isdn/hysdn/Kconfig" endmenu -source "drivers/isdn/gigaset/Kconfig" diff --git a/drivers/isdn/i4l/isdn_common.c b/drivers/isdn/i4l/isdn_common.c index 69aee2602..4cd1a5a0b 100644 --- a/drivers/isdn/i4l/isdn_common.c +++ b/drivers/isdn/i4l/isdn_common.c @@ -11,6 +11,7 @@ * */ +#include #include #include #include @@ -339,16 +340,6 @@ isdn_command(isdn_ctrl *cmd) printk(KERN_WARNING "isdn_command command(%x) driver -1\n", cmd->command); return(1); } - if (!dev->drv[cmd->driver]) { - printk(KERN_WARNING "isdn_command command(%x) dev->drv[%d] NULL\n", - cmd->command, cmd->driver); - return(1); - } - if (!dev->drv[cmd->driver]->interface) { - printk(KERN_WARNING "isdn_command command(%x) dev->drv[%d]->interface NULL\n", - cmd->command, cmd->driver); - return(1); - } if (cmd->command == ISDN_CMD_SETL2) { int idx = isdn_dc2minor(cmd->driver, cmd->arg & 255); unsigned long l2prot = (cmd->arg >> 8) & 255; @@ -942,7 +933,7 @@ isdn_readbchan_tty(int di, int channel, struct tty_struct *tty, int cisco_hack) count_put = count_pull; if(count_put > 1) tty_insert_flip_string(tty, skb->data, count_put - 1); - last = skb->data[count_put - 1]; + last = skb->data[count_put] - 1; len -= count_put; #ifdef CONFIG_ISDN_AUDIO } @@ -1059,7 +1050,7 @@ isdn_info_update(void) static ssize_t isdn_read(struct file *file, char __user *buf, size_t count, loff_t * off) { - uint minor = iminor(file->f_dentry->d_inode); + uint minor = MINOR(file->f_dentry->d_inode->i_rdev); int len = 0; int drvidx; int chidx; @@ -1166,7 +1157,7 @@ isdn_read(struct file *file, char __user *buf, size_t count, loff_t * off) static ssize_t isdn_write(struct file *file, const char __user *buf, size_t count, loff_t * off) { - uint minor = iminor(file->f_dentry->d_inode); + uint minor = MINOR(file->f_dentry->d_inode->i_rdev); int drvidx; int chidx; int retval; @@ -1189,8 +1180,9 @@ isdn_write(struct file *file, const char __user *buf, size_t count, loff_t * off goto out; } chidx = isdn_minor2chan(minor); - while ((retval = isdn_writebuf_stub(drvidx, chidx, buf, count)) == 0) + while (isdn_writebuf_stub(drvidx, chidx, buf, count) != count) interruptible_sleep_on(&dev->drv[drvidx]->snd_waitq[chidx]); + retval = count; goto out; } if (minor <= ISDN_MINOR_CTRLMAX) { @@ -1228,7 +1220,7 @@ static unsigned int isdn_poll(struct file *file, poll_table * wait) { unsigned int mask = 0; - unsigned int minor = iminor(file->f_dentry->d_inode); + unsigned int minor = MINOR(file->f_dentry->d_inode->i_rdev); int drvidx = isdn_minor2drv(minor - ISDN_MINOR_CTRL); lock_kernel(); @@ -1269,7 +1261,7 @@ isdn_poll(struct file *file, poll_table * wait) static int isdn_ioctl(struct inode *inode, struct file *file, uint cmd, ulong arg) { - uint minor = iminor(inode); + uint minor = MINOR(inode->i_rdev); isdn_ctrl c; int drvidx; int chidx; @@ -1720,7 +1712,7 @@ isdn_ioctl(struct inode *inode, struct file *file, uint cmd, ulong arg) static int isdn_open(struct inode *ino, struct file *filep) { - uint minor = iminor(ino); + uint minor = MINOR(ino->i_rdev); int drvidx; int chidx; int retval = -ENODEV; @@ -1782,7 +1774,7 @@ isdn_open(struct inode *ino, struct file *filep) static int isdn_close(struct inode *ino, struct file *filep) { - uint minor = iminor(ino); + uint minor = MINOR(ino->i_rdev); lock_kernel(); if (minor == ISDN_MINOR_STATUS) { @@ -1915,11 +1907,6 @@ isdn_free_channel(int di, int ch, int usage) { int i; - if ((di < 0) || (ch < 0)) { - printk(KERN_WARNING "%s: called with invalid drv(%d) or channel(%d)\n", - __FUNCTION__, di, ch); - return; - } for (i = 0; i < ISDN_MAX_CHANNELS; i++) if (((!usage) || ((dev->usage[i] & ISDN_USAGE_MASK) == usage)) && (dev->drvmap[i] == di) && @@ -1935,8 +1922,7 @@ isdn_free_channel(int di, int ch, int usage) dev->v110[i] = NULL; // 20.10.99 JIM, try to reinitialize v110 ! isdn_info_update(); - if (dev->drv[di]) - skb_queue_purge(&dev->drv[di]->rpqueue[ch]); + skb_queue_purge(&dev->drv[di]->rpqueue[ch]); } } @@ -1968,10 +1954,9 @@ isdn_writebuf_stub(int drvidx, int chan, const u_char __user * buf, int len) struct sk_buff *skb = alloc_skb(hl + len, GFP_ATOMIC); if (!skb) - return -ENOMEM; + return 0; skb_reserve(skb, hl); - if (copy_from_user(skb_put(skb, len), buf, len)) - return -EFAULT; + copy_from_user(skb_put(skb, len), buf, len); ret = dev->drv[drvidx]->interface->writebuf_skb(drvidx, chan, 1, skb); if (ret <= 0) dev_kfree_skb(skb); diff --git a/drivers/isdn/i4l/isdn_net.c b/drivers/isdn/i4l/isdn_net.c index 43da8ae1b..96c115e13 100644 --- a/drivers/isdn/i4l/isdn_net.c +++ b/drivers/isdn/i4l/isdn_net.c @@ -22,6 +22,7 @@ * http://i4l.zabbadoz.net/i4l/cisco-hdlc.txt */ +#include #include #include #include diff --git a/drivers/isdn/i4l/isdn_ppp.c b/drivers/isdn/i4l/isdn_ppp.c index 119412d6b..b3f0e01f7 100644 --- a/drivers/isdn/i4l/isdn_ppp.c +++ b/drivers/isdn/i4l/isdn_ppp.c @@ -9,6 +9,7 @@ * */ +#include #include #include #include @@ -108,7 +109,7 @@ isdn_ppp_free(isdn_net_local * lp) { struct ippp_struct *is; - if (lp->ppp_slot < 0 || lp->ppp_slot >= ISDN_MAX_CHANNELS) { + if (lp->ppp_slot < 0 || lp->ppp_slot > ISDN_MAX_CHANNELS) { printk(KERN_ERR "%s: ppp_slot(%d) out of range\n", __FUNCTION__, lp->ppp_slot); return 0; @@ -125,7 +126,7 @@ isdn_ppp_free(isdn_net_local * lp) lp->netdev->pb->ref_ct--; spin_unlock(&lp->netdev->pb->lock); #endif /* CONFIG_ISDN_MPP */ - if (lp->ppp_slot < 0 || lp->ppp_slot >= ISDN_MAX_CHANNELS) { + if (lp->ppp_slot < 0 || lp->ppp_slot > ISDN_MAX_CHANNELS) { printk(KERN_ERR "%s: ppp_slot(%d) now invalid\n", __FUNCTION__, lp->ppp_slot); return 0; @@ -278,7 +279,7 @@ isdn_ppp_open(int min, struct file *file) int slot; struct ippp_struct *is; - if (min < 0 || min >= ISDN_MAX_CHANNELS) + if (min < 0 || min > ISDN_MAX_CHANNELS) return -ENODEV; slot = isdn_ppp_get_slot(); @@ -667,7 +668,7 @@ isdn_ppp_poll(struct file *file, poll_table * wait) if (is->debug & 0x2) printk(KERN_DEBUG "isdn_ppp_poll: minor: %d\n", - iminor(file->f_dentry->d_inode)); + MINOR(file->f_dentry->d_inode->i_rdev)); /* just registers wait_queue hook. This doesn't really wait. */ poll_wait(file, &is->wq, wait); @@ -781,8 +782,7 @@ isdn_ppp_read(int min, struct file *file, char __user *buf, int count) is->first = b; spin_unlock_irqrestore(&is->buflock, flags); - if (copy_to_user(buf, save_buf, count)) - count = -EFAULT; + copy_to_user(buf, save_buf, count); kfree(save_buf); return count; @@ -973,7 +973,8 @@ void isdn_ppp_receive(isdn_net_dev * net_dev, isdn_net_local * lp, struct sk_buf int slot; int proto; - BUG_ON(net_dev->local->master); // we're called with the master device always + if (net_dev->local->master) + BUG(); // we're called with the master device always slot = lp->ppp_slot; if (slot < 0 || slot >= ISDN_MAX_CHANNELS) { @@ -1041,7 +1042,7 @@ isdn_ppp_push_higher(isdn_net_dev * net_dev, isdn_net_local * lp, struct sk_buff if (lp->master) { // FIXME? mlp = (isdn_net_local *) lp->master->priv; slot = mlp->ppp_slot; - if (slot < 0 || slot >= ISDN_MAX_CHANNELS) { + if (slot < 0 || slot > ISDN_MAX_CHANNELS) { printk(KERN_ERR "isdn_ppp_push_higher: master->ppp_slot(%d)\n", lp->ppp_slot); goto drop_packet; @@ -1263,7 +1264,7 @@ isdn_ppp_xmit(struct sk_buff *skb, struct net_device *netdev) /* we have our lp locked from now on */ slot = lp->ppp_slot; - if (slot < 0 || slot >= ISDN_MAX_CHANNELS) { + if (slot < 0 || slot > ISDN_MAX_CHANNELS) { printk(KERN_ERR "isdn_ppp_xmit: lp->ppp_slot(%d)\n", lp->ppp_slot); kfree_skb(skb); @@ -1602,7 +1603,7 @@ static void isdn_ppp_mp_receive(isdn_net_dev * net_dev, isdn_net_local * lp, mp = net_dev->pb; stats = &mp->stats; slot = lp->ppp_slot; - if (slot < 0 || slot >= ISDN_MAX_CHANNELS) { + if (slot < 0 || slot > ISDN_MAX_CHANNELS) { printk(KERN_ERR "%s: lp->ppp_slot(%d)\n", __FUNCTION__, lp->ppp_slot); stats->frame_drops++; @@ -1639,7 +1640,7 @@ static void isdn_ppp_mp_receive(isdn_net_dev * net_dev, isdn_net_local * lp, is->last_link_seqno = minseq = newseq; for (lpq = net_dev->queue;;) { slot = lpq->ppp_slot; - if (slot < 0 || slot >= ISDN_MAX_CHANNELS) { + if (slot < 0 || slot > ISDN_MAX_CHANNELS) { printk(KERN_ERR "%s: lpq->ppp_slot(%d)\n", __FUNCTION__, lpq->ppp_slot); } else { @@ -2345,6 +2346,7 @@ static struct ippp_ccp_reset_state *isdn_ppp_ccp_reset_alloc_state(struct ippp_s rs->state = CCPResetIdle; rs->is = is; rs->id = id; + init_timer(&rs->timer); rs->timer.data = (unsigned long)rs; rs->timer.function = isdn_ppp_ccp_timer_callback; is->reset->rs[id] = rs; @@ -2525,7 +2527,8 @@ static struct sk_buff *isdn_ppp_decompress(struct sk_buff *skb,struct ippp_struc printk(KERN_DEBUG "ippp: no decompressor defined!\n"); return skb; } - BUG_ON(!stat); // if we have a compressor, stat has been set as well + if (!stat) // if we have a compressor, stat has been set as well + BUG(); if((master && *proto == PPP_COMP) || (!master && *proto == PPP_COMPFRAG) ) { // compressed packets are compressed by their protocol type @@ -2647,7 +2650,7 @@ static void isdn_ppp_receive_ccp(isdn_net_dev *net_dev, isdn_net_local *lp, printk(KERN_DEBUG "Received CCP frame from peer slot(%d)\n", lp->ppp_slot); - if (lp->ppp_slot < 0 || lp->ppp_slot >= ISDN_MAX_CHANNELS) { + if (lp->ppp_slot < 0 || lp->ppp_slot > ISDN_MAX_CHANNELS) { printk(KERN_ERR "%s: lp->ppp_slot(%d) out of range\n", __FUNCTION__, lp->ppp_slot); return; @@ -2657,7 +2660,7 @@ static void isdn_ppp_receive_ccp(isdn_net_dev *net_dev, isdn_net_local *lp, if(lp->master) { int slot = ((isdn_net_local *) (lp->master->priv))->ppp_slot; - if (slot < 0 || slot >= ISDN_MAX_CHANNELS) { + if (slot < 0 || slot > ISDN_MAX_CHANNELS) { printk(KERN_ERR "%s: slot(%d) out of range\n", __FUNCTION__, slot); return; @@ -2844,7 +2847,7 @@ static void isdn_ppp_send_ccp(isdn_net_dev *net_dev, isdn_net_local *lp, struct if (lp->master) { slot = ((isdn_net_local *) (lp->master->priv))->ppp_slot; - if (slot < 0 || slot >= ISDN_MAX_CHANNELS) { + if (slot < 0 || slot > ISDN_MAX_CHANNELS) { printk(KERN_ERR "%s: slot(%d) out of range\n", __FUNCTION__, slot); return; diff --git a/drivers/isdn/i4l/isdn_tty.c b/drivers/isdn/i4l/isdn_tty.c index 9ab66e896..aeaa1db74 100644 --- a/drivers/isdn/i4l/isdn_tty.c +++ b/drivers/isdn/i4l/isdn_tty.c @@ -11,6 +11,7 @@ */ #undef ISDN_TTY_STAT_DEBUG +#include #include #include #include "isdn_common.h" @@ -81,7 +82,7 @@ isdn_tty_try_read(modem_info * info, struct sk_buff *skb) int l = skb->len; unsigned char *dp = skb->data; while (--l) { - if (*dp == DLE) + if (*skb->data == DLE) tty_insert_flip_char(tty, DLE, 0); tty_insert_flip_char(tty, *dp++, 0); } @@ -1889,13 +1890,14 @@ isdn_tty_modem_init(void) if (!m->tty_modem) return -ENOMEM; m->tty_modem->name = "ttyI"; + m->tty_modem->devfs_name = "isdn/ttyI"; m->tty_modem->major = ISDN_TTY_MAJOR; m->tty_modem->minor_start = 0; m->tty_modem->type = TTY_DRIVER_TYPE_SERIAL; m->tty_modem->subtype = SERIAL_TYPE_NORMAL; m->tty_modem->init_termios = tty_std_termios; m->tty_modem->init_termios.c_cflag = B9600 | CS8 | CREAD | HUPCL | CLOCAL; - m->tty_modem->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_DYNAMIC_DEV; + m->tty_modem->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_NO_DEVFS; m->tty_modem->driver_name = "isdn_tty"; tty_set_operations(m->tty_modem, &modem_ops); retval = tty_register_driver(m->tty_modem); @@ -2343,15 +2345,12 @@ isdn_tty_at_cout(char *msg, modem_info * info) u_long flags; struct sk_buff *skb = NULL; char *sp = NULL; - int l; + int l = strlen(msg); if (!msg) { printk(KERN_WARNING "isdn_tty: Null-Message in isdn_tty_at_cout\n"); return; } - - l = strlen(msg); - spin_lock_irqsave(&info->readlock, flags); tty = info->tty; if ((info->flags & ISDN_ASYNC_CLOSING) || (!tty)) { @@ -2878,7 +2877,7 @@ isdn_tty_cmd_ATand(char **p, modem_info * info) p[0]++; i = 0; while (*p[0] && (strchr("0123456789,-*[]?;", *p[0])) && - (i < ISDN_LMSNLEN - 1)) + (i < ISDN_LMSNLEN)) m->lmsn[i++] = *p[0]++; m->lmsn[i] = '\0'; break; diff --git a/drivers/isdn/i4l/isdn_tty.h b/drivers/isdn/i4l/isdn_tty.h index 692c74d6b..9f0fa9501 100644 --- a/drivers/isdn/i4l/isdn_tty.h +++ b/drivers/isdn/i4l/isdn_tty.h @@ -10,6 +10,7 @@ * */ +#include #define DLE 0x10 #define ETX 0x03 diff --git a/drivers/isdn/i4l/isdn_x25iface.c b/drivers/isdn/i4l/isdn_x25iface.c index 8b3efc243..edf14a2aa 100644 --- a/drivers/isdn/i4l/isdn_x25iface.c +++ b/drivers/isdn/i4l/isdn_x25iface.c @@ -7,7 +7,7 @@ * * stuff needed to support the Linux X.25 PLP code on top of devices that * can provide a lab_b service using the concap_proto mechanism. - * This module supports a network interface which provides lapb_sematics + * This module supports a network interface wich provides lapb_sematics * -- as defined in Documentation/networking/x25-iface.txt -- to * the upper layer and assumes that the lower layer provides a reliable * data link service by means of the concap_device_ops callbacks. @@ -208,7 +208,7 @@ static int isdn_x25iface_receive(struct concap_proto *cprot, struct sk_buff *skb */ static int isdn_x25iface_connect_ind(struct concap_proto *cprot) { - struct sk_buff * skb; + struct sk_buff * skb = dev_alloc_skb(1); enum wan_states *state_p = &( ( (ix25_pdata_t*) (cprot->proto_data) ) -> state); IX25DEBUG( "isdn_x25iface_connect_ind %s \n" @@ -220,8 +220,6 @@ static int isdn_x25iface_connect_ind(struct concap_proto *cprot) return -1; } *state_p = WAN_CONNECTED; - - skb = dev_alloc_skb(1); if( skb ){ *( skb_put(skb, 1) ) = 0x01; skb->protocol = x25_type_trans(skb, cprot->net_dev); diff --git a/drivers/isdn/icn/icn.c b/drivers/isdn/icn/icn.c index 730bbd07e..6649f8bc9 100644 --- a/drivers/isdn/icn/icn.c +++ b/drivers/isdn/icn/icn.c @@ -1010,8 +1010,7 @@ icn_readstatus(u_char __user *buf, int len, icn_card * card) for (p = buf, count = 0; count < len; p++, count++) { if (card->msg_buf_read == card->msg_buf_write) return count; - if (put_user(*card->msg_buf_read++, p)) - return -EFAULT; + put_user(*card->msg_buf_read++, p); if (card->msg_buf_read > card->msg_buf_end) card->msg_buf_read = card->msg_buf; } diff --git a/drivers/isdn/isdnloop/isdnloop.c b/drivers/isdn/isdnloop/isdnloop.c index 9a66524f1..33d339700 100644 --- a/drivers/isdn/isdnloop/isdnloop.c +++ b/drivers/isdn/isdnloop/isdnloop.c @@ -9,6 +9,7 @@ * */ +#include #include #include #include @@ -21,7 +22,7 @@ static char *isdnloop_id = "loop0"; MODULE_DESCRIPTION("ISDN4Linux: Pseudo Driver that simulates an ISDN card"); MODULE_AUTHOR("Fritz Elfert"); MODULE_LICENSE("GPL"); -module_param(isdnloop_id, charp, 0); +MODULE_PARM(isdnloop_id, "s"); MODULE_PARM_DESC(isdnloop_id, "ID-String of first card"); static int isdnloop_addcard(char *); @@ -451,8 +452,7 @@ isdnloop_readstatus(u_char __user *buf, int len, isdnloop_card * card) for (p = buf, count = 0; count < len; p++, count++) { if (card->msg_buf_read == card->msg_buf_write) return count; - if (put_user(*card->msg_buf_read++, p)) - return -EFAULT; + put_user(*card->msg_buf_read++, p); if (card->msg_buf_read > card->msg_buf_end) card->msg_buf_read = card->msg_buf; } diff --git a/drivers/isdn/pcbit/drv.c b/drivers/isdn/pcbit/drv.c index 6ead5e150..94f21486b 100644 --- a/drivers/isdn/pcbit/drv.c +++ b/drivers/isdn/pcbit/drv.c @@ -725,27 +725,23 @@ static int pcbit_stat(u_char __user *buf, int len, int driver, int channel) if (stat_st < stat_end) { - if (copy_to_user(buf, statbuf + stat_st, len)) - return -EFAULT; + copy_to_user(buf, statbuf + stat_st, len); stat_st += len; } else { if (len > STATBUF_LEN - stat_st) { - if (copy_to_user(buf, statbuf + stat_st, - STATBUF_LEN - stat_st)) - return -EFAULT; - if (copy_to_user(buf, statbuf, - len - (STATBUF_LEN - stat_st))) - return -EFAULT; + copy_to_user(buf, statbuf + stat_st, + STATBUF_LEN - stat_st); + copy_to_user(buf, statbuf, + len - (STATBUF_LEN - stat_st)); stat_st = len - (STATBUF_LEN - stat_st); } else { - if (copy_to_user(buf, statbuf + stat_st, len)) - return -EFAULT; + copy_to_user(buf, statbuf + stat_st, len); stat_st += len; diff --git a/drivers/isdn/sc/init.c b/drivers/isdn/sc/init.c index a627e6802..62b7acfad 100644 --- a/drivers/isdn/sc/init.c +++ b/drivers/isdn/sc/init.c @@ -342,7 +342,7 @@ static int __init sc_init(void) */ sc_adapter[cinst]->interrupt = irq[b]; if (request_irq(sc_adapter[cinst]->interrupt, interrupt_handler, - IRQF_DISABLED, interface->id, NULL)) + SA_INTERRUPT, interface->id, NULL)) { kfree(sc_adapter[cinst]->channel); indicate_status(cinst, ISDN_STAT_UNLOAD, 0, NULL); /* Fix me */ diff --git a/drivers/isdn/sc/ioctl.c b/drivers/isdn/sc/ioctl.c index 57c4ab96d..94c9afb70 100644 --- a/drivers/isdn/sc/ioctl.c +++ b/drivers/isdn/sc/ioctl.c @@ -46,8 +46,7 @@ int sc_ioctl(int card, scs_ioctl *data) pr_debug("%s: SCIOCRESET: ioctl received\n", sc_adapter[card]->devicename); sc_adapter[card]->StartOnReset = 0; - kfree(rcvmsg); - return reset(card); + return (reset(card)); } case SCIOCLOAD: @@ -97,7 +96,6 @@ int sc_ioctl(int card, scs_ioctl *data) case SCIOCSTART: { - kfree(rcvmsg); pr_debug("%s: SCIOSTART: ioctl received\n", sc_adapter[card]->devicename); if(sc_adapter[card]->EngineUp) { @@ -185,7 +183,7 @@ int sc_ioctl(int card, scs_ioctl *data) sc_adapter[card]->devicename); spid = kmalloc(SCIOC_SPIDSIZE, GFP_KERNEL); - if (!spid) { + if(!spid) { kfree(rcvmsg); return -ENOMEM; } @@ -197,10 +195,10 @@ int sc_ioctl(int card, scs_ioctl *data) if (!status) { pr_debug("%s: SCIOCGETSPID: command successful\n", sc_adapter[card]->devicename); - } else { + } + else { pr_debug("%s: SCIOCGETSPID: command failed (status = %d)\n", sc_adapter[card]->devicename, status); - kfree(spid); kfree(rcvmsg); return status; } diff --git a/drivers/macintosh/Kconfig b/drivers/macintosh/Kconfig index d5d649f5c..12ad46273 100644 --- a/drivers/macintosh/Kconfig +++ b/drivers/macintosh/Kconfig @@ -78,27 +78,6 @@ config ADB_PMU this device; you should do so if your machine is one of those mentioned above. -config ADB_PMU_LED - bool "Support for the Power/iBook front LED" - depends on ADB_PMU - select NEW_LEDS - select LEDS_CLASS - help - Support the front LED on Power/iBooks as a generic LED that can - be triggered by any of the supported triggers. To get the - behaviour of the old CONFIG_BLK_DEV_IDE_PMAC_BLINK, select this - and the ide-disk LED trigger and configure appropriately through - sysfs. - -config ADB_PMU_LED_IDE - bool "Use front LED as IDE LED by default" - depends on ADB_PMU_LED - select LEDS_TRIGGERS - select LEDS_TRIGGER_IDE_DISK - help - This option makes the front LED default to the IDE trigger - so that it blinks on IDE activity. - config PMAC_SMU bool "Support for SMU based PowerMacs" depends on PPC_PMAC64 @@ -109,7 +88,7 @@ config PMAC_SMU config PMAC_APM_EMU tristate "APM emulation" - depends on PPC_PMAC && PPC32 && PM && ADB_PMU + depends on PPC_PMAC && PPC32 && PM config PMAC_MEDIABAY bool "Support PowerBook hotswap media bay" @@ -120,23 +99,17 @@ config PMAC_MEDIABAY devices are not fully supported in the bay as I never had one to try with +# made a separate option since backlight may end up beeing used +# on non-powerbook machines (but only on PMU based ones AFAIK) config PMAC_BACKLIGHT bool "Backlight control for LCD screens" - depends on ADB_PMU && FB = y && (BROKEN || !PPC64) - select FB_BACKLIGHT - help - Say Y here to enable Macintosh specific extensions of the generic - backlight code. With this enabled, the brightness keys on older - PowerBooks will be enabled so you can change the screen brightness. - Newer models should use an userspace daemon like pbbuttonsd. - -config PMAC_BACKLIGHT_LEGACY - bool "Provide legacy ioctl's on /dev/pmu for the backlight" - depends on PMAC_BACKLIGHT && (BROKEN || !PPC64) + depends on ADB_PMU && (BROKEN || !PPC64) help - Say Y if you want to enable legacy ioctl's on /dev/pmu. This is for - programs which use this old interface. New and updated programs - should use the backlight classes in sysfs. + Say Y here to build in code to manage the LCD backlight on a + Macintosh PowerBook. With this code, the backlight will be turned + on and off appropriately on power-management and lid-open/lid-closed + events; also, the PowerBook button device will be enabled so you can + change the screen brightness. config ADB_MACIO bool "Include MacIO (CHRP) ADB driver" @@ -198,7 +171,6 @@ config THERM_PM72 config WINDFARM tristate "New PowerMac thermal control infrastructure" - depends on PPC config WINDFARM_PM81 tristate "Support for thermal management on iMac G5" diff --git a/drivers/macintosh/Makefile b/drivers/macintosh/Makefile index b53d45f87..6081acdea 100644 --- a/drivers/macintosh/Makefile +++ b/drivers/macintosh/Makefile @@ -11,9 +11,7 @@ obj-$(CONFIG_MAC_EMUMOUSEBTN) += mac_hid.o obj-$(CONFIG_INPUT_ADBHID) += adbhid.o obj-$(CONFIG_ANSLCD) += ans-lcd.o -obj-$(CONFIG_ADB_PMU) += via-pmu.o via-pmu-event.o -obj-$(CONFIG_ADB_PMU_LED) += via-pmu-led.o -obj-$(CONFIG_PMAC_BACKLIGHT) += via-pmu-backlight.o +obj-$(CONFIG_ADB_PMU) += via-pmu.o obj-$(CONFIG_ADB_CUDA) += via-cuda.o obj-$(CONFIG_PMAC_APM_EMU) += apm_emu.o obj-$(CONFIG_PMAC_SMU) += smu.o diff --git a/drivers/macintosh/adb.c b/drivers/macintosh/adb.c index 360f93f6f..d2ead1776 100644 --- a/drivers/macintosh/adb.c +++ b/drivers/macintosh/adb.c @@ -16,6 +16,7 @@ * - move bus probe to a kernel thread */ +#include #include #include #include @@ -35,12 +36,12 @@ #include #include #include +#include #include #include #ifdef CONFIG_PPC #include -#include #endif @@ -79,7 +80,7 @@ static struct adb_driver *adb_driver_list[] = { static struct class *adb_dev_class; struct adb_driver *adb_controller; -BLOCKING_NOTIFIER_HEAD(adb_client_list); +struct notifier_block *adb_client_list = NULL; static int adb_got_sleep; static int adb_inited; static pid_t adb_probe_task_pid; @@ -293,7 +294,7 @@ int __init adb_init(void) int i; #ifdef CONFIG_PPC32 - if (!machine_is(chrp) && !machine_is(powermac)) + if ( (_machine != _MACH_chrp) && (_machine != _MACH_Pmac) ) return 0; #endif #ifdef CONFIG_MAC @@ -353,8 +354,7 @@ adb_notify_sleep(struct pmu_sleep_notifier *self, int when) /* Stop autopoll */ if (adb_controller->autopoll) adb_controller->autopoll(0); - ret = blocking_notifier_call_chain(&adb_client_list, - ADB_MSG_POWERDOWN, NULL); + ret = notifier_call_chain(&adb_client_list, ADB_MSG_POWERDOWN, NULL); if (ret & NOTIFY_STOP_MASK) { up(&adb_probe_mutex); return PBOOK_SLEEP_REFUSE; @@ -391,8 +391,7 @@ do_adb_reset_bus(void) if (adb_controller->autopoll) adb_controller->autopoll(0); - nret = blocking_notifier_call_chain(&adb_client_list, - ADB_MSG_PRE_RESET, NULL); + nret = notifier_call_chain(&adb_client_list, ADB_MSG_PRE_RESET, NULL); if (nret & NOTIFY_STOP_MASK) { if (adb_controller->autopoll) adb_controller->autopoll(autopoll_devs); @@ -427,8 +426,7 @@ do_adb_reset_bus(void) } up(&adb_handler_sem); - nret = blocking_notifier_call_chain(&adb_client_list, - ADB_MSG_POST_RESET, NULL); + nret = notifier_call_chain(&adb_client_list, ADB_MSG_POST_RESET, NULL); if (nret & NOTIFY_STOP_MASK) return -EBUSY; @@ -902,6 +900,8 @@ adbdev_init(void) return; } + devfs_mk_cdev(MKDEV(ADB_MAJOR, 0), S_IFCHR | S_IRUSR | S_IWUSR, "adb"); + adb_dev_class = class_create(THIS_MODULE, "adb"); if (IS_ERR(adb_dev_class)) return; diff --git a/drivers/macintosh/adbhid.c b/drivers/macintosh/adbhid.c index c69d23bb2..c0b46bceb 100644 --- a/drivers/macintosh/adbhid.c +++ b/drivers/macintosh/adbhid.c @@ -34,6 +34,7 @@ * Move to syfs */ +#include #include #include #include @@ -45,11 +46,14 @@ #include #include -#include #ifdef CONFIG_PPC_PMAC #include #endif +#ifdef CONFIG_PMAC_BACKLIGHT +#include +#endif + MODULE_AUTHOR("Franz Sirl "); #define KEYB_KEYREG 0 /* register # for key up/down data */ @@ -175,7 +179,7 @@ u8 adb_to_linux_keycodes[128] = { /* 0x65 */ KEY_F9, /* 67 */ /* 0x66 */ KEY_HANJA, /* 123 */ /* 0x67 */ KEY_F11, /* 87 */ - /* 0x68 */ KEY_HANGEUL, /* 122 */ + /* 0x68 */ KEY_HANGUEL, /* 122 */ /* 0x69 */ KEY_SYSRQ, /* 99 */ /* 0x6a */ 0, /* 0x6b */ KEY_SCROLLLOCK, /* 70 */ @@ -234,6 +238,11 @@ static struct adb_ids keyboard_ids; static struct adb_ids mouse_ids; static struct adb_ids buttons_ids; +#ifdef CONFIG_PMAC_BACKLIGHT +/* Exported to via-pmu.c */ +int disable_kernel_backlight = 0; +#endif /* CONFIG_PMAC_BACKLIGHT */ + /* Kind of keyboard, see Apple technote 1152 */ #define ADB_KEYBOARD_UNKNOWN 0 #define ADB_KEYBOARD_ANSI 0x0100 @@ -494,7 +503,9 @@ adbhid_buttons_input(unsigned char *data, int nb, struct pt_regs *regs, int auto case 0x1f: /* Powerbook button device */ { int down = (data[1] == (data[1] & 0xf)); - +#ifdef CONFIG_PMAC_BACKLIGHT + int backlight = get_backlight_level(); +#endif /* * XXX: Where is the contrast control for the passive? * -- Cort @@ -519,17 +530,29 @@ adbhid_buttons_input(unsigned char *data, int nb, struct pt_regs *regs, int auto case 0xa: /* brightness decrease */ #ifdef CONFIG_PMAC_BACKLIGHT - if (down) - pmac_backlight_key_down(); -#endif + if (!disable_kernel_backlight) { + if (down && backlight >= 0) { + if (backlight > BACKLIGHT_OFF) + set_backlight_level(backlight-1); + else + set_backlight_level(BACKLIGHT_OFF); + } + } +#endif /* CONFIG_PMAC_BACKLIGHT */ input_report_key(adbhid[id]->input, KEY_BRIGHTNESSDOWN, down); break; case 0x9: /* brightness increase */ #ifdef CONFIG_PMAC_BACKLIGHT - if (down) - pmac_backlight_key_up(); -#endif + if (!disable_kernel_backlight) { + if (down && backlight >= 0) { + if (backlight < BACKLIGHT_MAX) + set_backlight_level(backlight+1); + else + set_backlight_level(BACKLIGHT_MAX); + } + } +#endif /* CONFIG_PMAC_BACKLIGHT */ input_report_key(adbhid[id]->input, KEY_BRIGHTNESSUP, down); break; @@ -1183,16 +1206,15 @@ init_ms_a3(int id) static int __init adbhid_init(void) { #ifndef CONFIG_MAC - if (!machine_is(chrp) && !machine_is(powermac)) - return 0; + if ( (_machine != _MACH_chrp) && (_machine != _MACH_Pmac) ) + return 0; #endif led_request.complete = 1; adbhid_probe(); - blocking_notifier_chain_register(&adb_client_list, - &adbhid_adb_notifier); + notifier_chain_register(&adb_client_list, &adbhid_adb_notifier); return 0; } diff --git a/drivers/macintosh/apm_emu.c b/drivers/macintosh/apm_emu.c index 1293876a2..e5a2bbf99 100644 --- a/drivers/macintosh/apm_emu.c +++ b/drivers/macintosh/apm_emu.c @@ -18,6 +18,7 @@ * */ +#include #include #include diff --git a/drivers/macintosh/mac_hid.c b/drivers/macintosh/mac_hid.c index 6b129eef7..a66636116 100644 --- a/drivers/macintosh/mac_hid.c +++ b/drivers/macintosh/mac_hid.c @@ -8,6 +8,7 @@ * This file will soon be removed in favor of an uinput userspace tool. */ +#include #include #include #include diff --git a/drivers/macintosh/macio-adb.c b/drivers/macintosh/macio-adb.c index 4b08852c3..314fc0830 100644 --- a/drivers/macintosh/macio-adb.c +++ b/drivers/macintosh/macio-adb.c @@ -90,12 +90,22 @@ int macio_init(void) { struct device_node *adbs; struct resource r; - unsigned int irq; adbs = find_compatible_devices("adb", "chrp,adb0"); if (adbs == 0) return -ENXIO; +#if 0 + { int i = 0; + + printk("macio_adb_init: node = %p, addrs =", adbs->node); + while(!of_address_to_resource(adbs, i, &r)) + printk(" %x(%x)", r.start, r.end - r.start); + printk(", intrs ="); + for (i = 0; i < adbs->n_intrs; ++i) + printk(" %x", adbs->intrs[i].line); + printk("\n"); } +#endif if (of_address_to_resource(adbs, 0, &r)) return -ENXIO; adb = ioremap(r.start, sizeof(struct adb_regs)); @@ -107,9 +117,10 @@ int macio_init(void) out_8(&adb->active_lo.r, 0xff); out_8(&adb->autopoll.r, APE); - irq = irq_of_parse_and_map(adbs, 0); - if (request_irq(irq, macio_adb_interrupt, 0, "ADB", (void *)0)) { - printk(KERN_ERR "ADB: can't get irq %d\n", irq); + if (request_irq(adbs->intrs[0].line, macio_adb_interrupt, + 0, "ADB", (void *)0)) { + printk(KERN_ERR "ADB: can't get irq %d\n", + adbs->intrs[0].line); return -EAGAIN; } out_8(&adb->intr_enb.r, DFB | TAG); diff --git a/drivers/macintosh/macio_asic.c b/drivers/macintosh/macio_asic.c index 82657bc86..69596f643 100644 --- a/drivers/macintosh/macio_asic.c +++ b/drivers/macintosh/macio_asic.c @@ -17,6 +17,7 @@ * sub-devices. */ +#include #include #include #include @@ -280,128 +281,75 @@ static void macio_release_dev(struct device *dev) static int macio_resource_quirks(struct device_node *np, struct resource *res, int index) { - /* Only quirks for memory resources for now */ - if ((res->flags & IORESOURCE_MEM) == 0) - return 0; - - /* Grand Central has too large resource 0 on some machines */ - if (index == 0 && !strcmp(np->name, "gc")) - res->end = res->start + 0x1ffff; + if (res->flags & IORESOURCE_MEM) { + /* Grand Central has too large resource 0 on some machines */ + if (index == 0 && !strcmp(np->name, "gc")) + res->end = res->start + 0x1ffff; - /* Airport has bogus resource 2 */ - if (index >= 2 && !strcmp(np->name, "radio")) - return 1; + /* Airport has bogus resource 2 */ + if (index >= 2 && !strcmp(np->name, "radio")) + return 1; #ifndef CONFIG_PPC64 - /* DBDMAs may have bogus sizes */ - if ((res->start & 0x0001f000) == 0x00008000) - res->end = res->start + 0xff; + /* DBDMAs may have bogus sizes */ + if ((res->start & 0x0001f000) == 0x00008000) + res->end = res->start + 0xff; #endif /* CONFIG_PPC64 */ - /* ESCC parent eats child resources. We could have added a - * level of hierarchy, but I don't really feel the need - * for it - */ - if (!strcmp(np->name, "escc")) - return 1; - - /* ESCC has bogus resources >= 3 */ - if (index >= 3 && !(strcmp(np->name, "ch-a") && - strcmp(np->name, "ch-b"))) - return 1; - - /* Media bay has too many resources, keep only first one */ - if (index > 0 && !strcmp(np->name, "media-bay")) - return 1; - - /* Some older IDE resources have bogus sizes */ - if (!(strcmp(np->name, "IDE") && strcmp(np->name, "ATA") && - strcmp(np->type, "ide") && strcmp(np->type, "ata"))) { - if (index == 0 && (res->end - res->start) > 0xfff) - res->end = res->start + 0xfff; - if (index == 1 && (res->end - res->start) > 0xff) - res->end = res->start + 0xff; + /* ESCC parent eats child resources. We could have added a + * level of hierarchy, but I don't really feel the need + * for it + */ + if (!strcmp(np->name, "escc")) + return 1; + + /* ESCC has bogus resources >= 3 */ + if (index >= 3 && !(strcmp(np->name, "ch-a") && + strcmp(np->name, "ch-b"))) + return 1; + + /* Media bay has too many resources, keep only first one */ + if (index > 0 && !strcmp(np->name, "media-bay")) + return 1; + + /* Some older IDE resources have bogus sizes */ + if (!(strcmp(np->name, "IDE") && strcmp(np->name, "ATA") && + strcmp(np->type, "ide") && strcmp(np->type, "ata"))) { + if (index == 0 && (res->end - res->start) > 0xfff) + res->end = res->start + 0xfff; + if (index == 1 && (res->end - res->start) > 0xff) + res->end = res->start + 0xff; + } } return 0; } -static void macio_create_fixup_irq(struct macio_dev *dev, int index, - unsigned int line) -{ - unsigned int irq; - - irq = irq_create_mapping(NULL, line); - if (irq != NO_IRQ) { - dev->interrupt[index].start = irq; - dev->interrupt[index].flags = IORESOURCE_IRQ; - dev->interrupt[index].name = dev->ofdev.dev.bus_id; - } - if (dev->n_interrupts <= index) - dev->n_interrupts = index + 1; -} - -static void macio_add_missing_resources(struct macio_dev *dev) -{ - struct device_node *np = dev->ofdev.node; - unsigned int irq_base; - - /* Gatwick has some missing interrupts on child nodes */ - if (dev->bus->chip->type != macio_gatwick) - return; - - /* irq_base is always 64 on gatwick. I have no cleaner way to get - * that value from here at this point - */ - irq_base = 64; - - /* Fix SCC */ - if (strcmp(np->name, "ch-a") == 0) { - macio_create_fixup_irq(dev, 0, 15 + irq_base); - macio_create_fixup_irq(dev, 1, 4 + irq_base); - macio_create_fixup_irq(dev, 2, 5 + irq_base); - printk(KERN_INFO "macio: fixed SCC irqs on gatwick\n"); - } - - /* Fix media-bay */ - if (strcmp(np->name, "media-bay") == 0) { - macio_create_fixup_irq(dev, 0, 29 + irq_base); - printk(KERN_INFO "macio: fixed media-bay irq on gatwick\n"); - } - - /* Fix left media bay childs */ - if (dev->media_bay != NULL && strcmp(np->name, "floppy") == 0) { - macio_create_fixup_irq(dev, 0, 19 + irq_base); - macio_create_fixup_irq(dev, 1, 1 + irq_base); - printk(KERN_INFO "macio: fixed left floppy irqs\n"); - } - if (dev->media_bay != NULL && strcasecmp(np->name, "ata4") == 0) { - macio_create_fixup_irq(dev, 0, 14 + irq_base); - macio_create_fixup_irq(dev, 0, 3 + irq_base); - printk(KERN_INFO "macio: fixed left ide irqs\n"); - } -} static void macio_setup_interrupts(struct macio_dev *dev) { struct device_node *np = dev->ofdev.node; - unsigned int irq; - int i = 0, j = 0; + int i,j; - for (;;) { + /* For now, we use pre-parsed entries in the device-tree for + * interrupt routing and addresses, but we should change that + * to dynamically parsed entries and so get rid of most of the + * clutter in struct device_node + */ + for (i = j = 0; i < np->n_intrs; i++) { struct resource *res = &dev->interrupt[j]; if (j >= MACIO_DEV_COUNT_IRQS) break; - irq = irq_of_parse_and_map(np, i++); - if (irq == NO_IRQ) - break; - res->start = irq; - res->flags = IORESOURCE_IRQ; + res->start = np->intrs[i].line; + res->flags = IORESOURCE_IO; + if (np->intrs[j].sense) + res->flags |= IORESOURCE_IRQ_LOWLEVEL; + else + res->flags |= IORESOURCE_IRQ_HIGHEDGE; res->name = dev->ofdev.dev.bus_id; - if (macio_resource_quirks(np, res, i - 1)) { + if (macio_resource_quirks(np, res, i)) memset(res, 0, sizeof(struct resource)); - continue; - } else + else j++; } dev->n_interrupts = j; @@ -480,10 +428,10 @@ static struct macio_dev * macio_add_one_device(struct macio_chip *chip, /* MacIO itself has a different reg, we use it's PCI base */ if (np == chip->of_node) { - sprintf(dev->ofdev.dev.bus_id, "%1d.%08x:%.*s", + sprintf(dev->ofdev.dev.bus_id, "%1d.%08lx:%.*s", chip->lbus.index, #ifdef CONFIG_PCI - (unsigned int)pci_resource_start(chip->lbus.pdev, 0), + pci_resource_start(chip->lbus.pdev, 0), #else 0, /* NuBus may want to do something better here */ #endif @@ -498,7 +446,6 @@ static struct macio_dev * macio_add_one_device(struct macio_chip *chip, /* Setup interrupts & resources */ macio_setup_interrupts(dev); macio_setup_resources(dev, parent_res); - macio_add_missing_resources(dev); /* Register with core */ if (of_device_register(&dev->ofdev) != 0) { @@ -603,12 +550,15 @@ static void macio_pci_add_devices(struct macio_chip *chip) */ int macio_register_driver(struct macio_driver *drv) { + int count = 0; + /* initialize common driver fields */ drv->driver.name = drv->name; drv->driver.bus = &macio_bus_type; /* register with core */ - return driver_register(&drv->driver); + count = driver_register(&drv->driver); + return count ? count : 1; } /** diff --git a/drivers/macintosh/macio_sysfs.c b/drivers/macintosh/macio_sysfs.c index cae24a135..7f7d4eaca 100644 --- a/drivers/macintosh/macio_sysfs.c +++ b/drivers/macintosh/macio_sysfs.c @@ -1,3 +1,4 @@ +#include #include #include #include diff --git a/drivers/macintosh/mediabay.c b/drivers/macintosh/mediabay.c index 0acf2f7fd..8dbf2852b 100644 --- a/drivers/macintosh/mediabay.c +++ b/drivers/macintosh/mediabay.c @@ -10,6 +10,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 @@ -838,8 +839,8 @@ static int __init media_bay_init(void) media_bays[i].cd_index = -1; #endif } - if (!machine_is(powermac)) - return 0; + if (_machine != _MACH_Pmac) + return -ENODEV; macio_register_driver(&media_bay_driver); diff --git a/drivers/macintosh/smu.c b/drivers/macintosh/smu.c index 4586eb3d4..db2ae71d0 100644 --- a/drivers/macintosh/smu.c +++ b/drivers/macintosh/smu.c @@ -19,6 +19,7 @@ * the userland interface */ +#include #include #include #include @@ -34,7 +35,6 @@ #include #include #include -#include #include #include @@ -75,11 +75,9 @@ struct smu_device { struct of_device *of_dev; int doorbell; /* doorbell gpio */ u32 __iomem *db_buf; /* doorbell buffer */ - struct device_node *db_node; - unsigned int db_irq; + int db_irq; int msg; - struct device_node *msg_node; - unsigned int msg_irq; + int msg_irq; struct smu_cmd_buf *cmd_buf; /* command buffer virtual */ u32 cmd_buf_abs; /* command buffer absolute */ struct list_head cmd_list; @@ -94,8 +92,7 @@ struct smu_device { * for now, just hard code that */ static struct smu_device *smu; -static DEFINE_MUTEX(smu_part_access); -static int smu_irq_inited; +static DECLARE_MUTEX(smu_part_access); static void smu_i2c_retry(unsigned long data); @@ -260,10 +257,6 @@ int smu_queue_cmd(struct smu_cmd *cmd) smu_start_cmd(); spin_unlock_irqrestore(&smu->lock, flags); - /* Workaround for early calls when irq isn't available */ - if (!smu_irq_inited || smu->db_irq == NO_IRQ) - smu_spinwait_cmd(cmd); - return 0; } EXPORT_SYMBOL(smu_queue_cmd); @@ -485,15 +478,14 @@ int __init smu_init (void) smu->cmd_buf_abs = (u32)smu_cmdbuf_abs; smu->cmd_buf = (struct smu_cmd_buf *)abs_to_virt(smu_cmdbuf_abs); - smu->db_node = of_find_node_by_name(NULL, "smu-doorbell"); - if (smu->db_node == NULL) { + np = of_find_node_by_name(NULL, "smu-doorbell"); + if (np == NULL) { printk(KERN_ERR "SMU: Can't find doorbell GPIO !\n"); goto fail; } - data = (u32 *)get_property(smu->db_node, "reg", NULL); + data = (u32 *)get_property(np, "reg", NULL); if (data == NULL) { - of_node_put(smu->db_node); - smu->db_node = NULL; + of_node_put(np); printk(KERN_ERR "SMU: Can't find doorbell GPIO address !\n"); goto fail; } @@ -505,21 +497,27 @@ int __init smu_init (void) smu->doorbell = *data; if (smu->doorbell < 0x50) smu->doorbell += 0x50; + if (np->n_intrs > 0) + smu->db_irq = np->intrs[0].line; + + of_node_put(np); /* Now look for the smu-interrupt GPIO */ do { - smu->msg_node = of_find_node_by_name(NULL, "smu-interrupt"); - if (smu->msg_node == NULL) + np = of_find_node_by_name(NULL, "smu-interrupt"); + if (np == NULL) break; - data = (u32 *)get_property(smu->msg_node, "reg", NULL); + data = (u32 *)get_property(np, "reg", NULL); if (data == NULL) { - of_node_put(smu->msg_node); - smu->msg_node = NULL; + of_node_put(np); break; } smu->msg = *data; if (smu->msg < 0x50) smu->msg += 0x50; + if (np->n_intrs > 0) + smu->msg_irq = np->intrs[0].line; + of_node_put(np); } while(0); /* Doorbell buffer is currently hard-coded, I didn't find a proper @@ -551,26 +549,13 @@ static int smu_late_init(void) smu->i2c_timer.function = smu_i2c_retry; smu->i2c_timer.data = (unsigned long)smu; - if (smu->db_node) { - smu->db_irq = irq_of_parse_and_map(smu->db_node, 0); - if (smu->db_irq == NO_IRQ) - printk(KERN_ERR "smu: failed to map irq for node %s\n", - smu->db_node->full_name); - } - if (smu->msg_node) { - smu->msg_irq = irq_of_parse_and_map(smu->msg_node, 0); - if (smu->msg_irq == NO_IRQ) - printk(KERN_ERR "smu: failed to map irq for node %s\n", - smu->msg_node->full_name); - } - /* * Try to request the interrupts */ if (smu->db_irq != NO_IRQ) { if (request_irq(smu->db_irq, smu_db_intr, - IRQF_SHARED, "SMU doorbell", smu) < 0) { + SA_SHIRQ, "SMU doorbell", smu) < 0) { printk(KERN_WARNING "SMU: can't " "request interrupt %d\n", smu->db_irq); @@ -580,7 +565,7 @@ static int smu_late_init(void) if (smu->msg_irq != NO_IRQ) { if (request_irq(smu->msg_irq, smu_msg_intr, - IRQF_SHARED, "SMU message", smu) < 0) { + SA_SHIRQ, "SMU message", smu) < 0) { printk(KERN_WARNING "SMU: can't " "request interrupt %d\n", smu->msg_irq); @@ -588,7 +573,6 @@ static int smu_late_init(void) } } - smu_irq_inited = 1; return 0; } /* This has to be before arch_initcall as the low i2c stuff relies on the @@ -645,6 +629,8 @@ static struct of_platform_driver smu_of_platform_driver = static int __init smu_init_sysfs(void) { + int rc; + /* * Due to sysfs bogosity, a sysdev is not a real device, so * we should in fact create both if we want sysdev semantics @@ -653,7 +639,7 @@ static int __init smu_init_sysfs(void) * I'm a bit too far from figuring out how that works with those * new chipsets, but that will come back and bite us */ - of_register_driver(&smu_of_platform_driver); + rc = of_register_driver(&smu_of_platform_driver); return 0; } @@ -760,11 +746,6 @@ static void smu_i2c_low_completion(struct smu_cmd *scmd, void *misc) if (fail && --cmd->retries > 0) { DPRINTK("SMU: i2c failure, starting timer...\n"); BUG_ON(cmd != smu->cmd_i2c_cur); - if (!smu_irq_inited) { - mdelay(5); - smu_i2c_retry(0); - return; - } mod_timer(&smu->i2c_timer, jiffies + msecs_to_jiffies(5)); return; } @@ -870,7 +851,7 @@ int smu_queue_i2c(struct smu_i2c_cmd *cmd) static int smu_read_datablock(u8 *dest, unsigned int addr, unsigned int len) { - DECLARE_COMPLETION_ONSTACK(comp); + DECLARE_COMPLETION(comp); unsigned int chunk; struct smu_cmd cmd; int rc; @@ -917,7 +898,7 @@ static int smu_read_datablock(u8 *dest, unsigned int addr, unsigned int len) static struct smu_sdbp_header *smu_create_sdb_partition(int id) { - DECLARE_COMPLETION_ONSTACK(comp); + DECLARE_COMPLETION(comp); struct smu_simple_cmd cmd; unsigned int addr, len, tlen; struct smu_sdbp_header *hdr; @@ -997,11 +978,11 @@ struct smu_sdbp_header *__smu_get_sdb_partition(int id, unsigned int *size, if (interruptible) { int rc; - rc = mutex_lock_interruptible(&smu_part_access); + rc = down_interruptible(&smu_part_access); if (rc) return ERR_PTR(rc); } else - mutex_lock(&smu_part_access); + down(&smu_part_access); part = (struct smu_sdbp_header *)get_property(smu->of_node, pname, size); @@ -1011,7 +992,7 @@ struct smu_sdbp_header *__smu_get_sdb_partition(int id, unsigned int *size, if (part != NULL && size) *size = part->len << 2; } - mutex_unlock(&smu_part_access); + up(&smu_part_access); return part; } diff --git a/drivers/macintosh/therm_adt746x.c b/drivers/macintosh/therm_adt746x.c index 7f86478bd..5282fec17 100644 --- a/drivers/macintosh/therm_adt746x.c +++ b/drivers/macintosh/therm_adt746x.c @@ -9,6 +9,7 @@ * */ +#include #include #include #include diff --git a/drivers/macintosh/therm_pm72.c b/drivers/macintosh/therm_pm72.c index 20bf67244..4f50ee576 100644 --- a/drivers/macintosh/therm_pm72.c +++ b/drivers/macintosh/therm_pm72.c @@ -95,25 +95,16 @@ * - Use min/max macros here or there * - Latest darwin updated U3H min fan speed to 20% PWM * - * July. 06, 2006 : 1.3 - * - Fix setting of RPM fans on Xserve G5 (they were going too fast) - * - Add missing slots fan control loop for Xserve G5 - * - Lower fixed slots fan speed from 50% to 40% on desktop G5s. We - * still can't properly implement the control loop for these, so let's - * reduce the noise a little bit, it appears that 40% still gives us - * a pretty good air flow - * - Add code to "tickle" the FCU regulary so it doesn't think that - * we are gone while in fact, the machine just didn't need any fan - * speed change lately - * */ +#include #include #include #include #include #include #include +#include #include #include #include @@ -122,6 +113,7 @@ #include #include #include +#include #include #include #include @@ -132,7 +124,7 @@ #include "therm_pm72.h" -#define VERSION "1.3" +#define VERSION "1.2b2" #undef DEBUG @@ -157,7 +149,6 @@ static struct basckside_pid_params backside_params; static struct backside_pid_state backside_state; static struct drives_pid_state drives_state; static struct dimm_pid_state dimms_state; -static struct slots_pid_state slots_state; static int state; static int cpu_count; static int cpu_pid_type; @@ -166,8 +157,7 @@ static struct completion ctrl_complete; static int critical_state; static int rackmac; static s32 dimm_output_clamp; -static int fcu_rpm_shift; -static int fcu_tickle_ticks; + static DECLARE_MUTEX(driver_lock); /* @@ -508,20 +498,13 @@ static int start_fcu(void) rc = fan_write_reg(0x2e, &buf, 1); if (rc < 0) return -EIO; - rc = fan_read_reg(0, &buf, 1); - if (rc < 0) - return -EIO; - fcu_rpm_shift = (buf == 1) ? 2 : 3; - printk(KERN_DEBUG "FCU Initialized, RPM fan shift is %d\n", - fcu_rpm_shift); - return 0; } static int set_rpm_fan(int fan_index, int rpm) { unsigned char buf[2]; - int rc, id, min, max; + int rc, id; if (fcu_fans[fan_index].type != FCU_FAN_RPM) return -EINVAL; @@ -529,15 +512,12 @@ static int set_rpm_fan(int fan_index, int rpm) if (id == FCU_FAN_ABSENT_ID) return -EINVAL; - min = 2400 >> fcu_rpm_shift; - max = 56000 >> fcu_rpm_shift; - - if (rpm < min) - rpm = min; - else if (rpm > max) - rpm = max; - buf[0] = rpm >> (8 - fcu_rpm_shift); - buf[1] = rpm << fcu_rpm_shift; + if (rpm < 300) + rpm = 300; + else if (rpm > 8191) + rpm = 8191; + buf[0] = rpm >> 5; + buf[1] = rpm << 3; rc = fan_write_reg(0x10 + (id * 2), buf, 2); if (rc < 0) return -EIO; @@ -574,7 +554,7 @@ static int get_rpm_fan(int fan_index, int programmed) if (rc != 2) return -EIO; - return (buf[0] << (8 - fcu_rpm_shift)) | buf[1] >> fcu_rpm_shift; + return (buf[0] << 5) | buf[1] >> 3; } static int set_pwm_fan(int fan_index, int pwm) @@ -632,26 +612,6 @@ static int get_pwm_fan(int fan_index) return (buf[0] * 1000) / 2559; } -static void tickle_fcu(void) -{ - int pwm; - - pwm = get_pwm_fan(SLOTS_FAN_PWM_INDEX); - - DBG("FCU Tickle, slots fan is: %d\n", pwm); - if (pwm < 0) - pwm = 100; - - if (!rackmac) { - pwm = SLOTS_FAN_DEFAULT_PWM; - } else if (pwm < SLOTS_PID_OUTPUT_MIN) - pwm = SLOTS_PID_OUTPUT_MIN; - - /* That is hopefully enough to make the FCU happy */ - set_pwm_fan(SLOTS_FAN_PWM_INDEX, pwm); -} - - /* * Utility routine to read the CPU calibration EEPROM data * from the device-tree @@ -758,9 +718,6 @@ BUILD_SHOW_FUNC_INT(backside_fan_pwm, backside_state.pwm) BUILD_SHOW_FUNC_FIX(drives_temperature, drives_state.last_temp) BUILD_SHOW_FUNC_INT(drives_fan_rpm, drives_state.rpm) -BUILD_SHOW_FUNC_FIX(slots_temperature, slots_state.last_temp) -BUILD_SHOW_FUNC_INT(slots_fan_pwm, slots_state.pwm) - BUILD_SHOW_FUNC_FIX(dimms_temperature, dimms_state.last_temp) static DEVICE_ATTR(cpu0_temperature,S_IRUGO,show_cpu0_temperature,NULL); @@ -781,9 +738,6 @@ static DEVICE_ATTR(backside_fan_pwm,S_IRUGO,show_backside_fan_pwm,NULL); static DEVICE_ATTR(drives_temperature,S_IRUGO,show_drives_temperature,NULL); static DEVICE_ATTR(drives_fan_rpm,S_IRUGO,show_drives_fan_rpm,NULL); -static DEVICE_ATTR(slots_temperature,S_IRUGO,show_slots_temperature,NULL); -static DEVICE_ATTR(slots_fan_pwm,S_IRUGO,show_slots_fan_pwm,NULL); - static DEVICE_ATTR(dimms_temperature,S_IRUGO,show_dimms_temperature,NULL); /* @@ -1125,9 +1079,6 @@ static void do_monitor_cpu_rack(struct cpu_pid_state *state) fan_min = dimm_output_clamp; fan_min = max(fan_min, (int)state->mpu.rminn_intake_fan); - DBG(" CPU min mpu = %d, min dimm = %d\n", - state->mpu.rminn_intake_fan, dimm_output_clamp); - state->rpm = max(state->rpm, (int)fan_min); state->rpm = min(state->rpm, (int)state->mpu.rmaxn_intake_fan); state->intake_rpm = state->rpm; @@ -1426,8 +1377,7 @@ static void do_monitor_drives(struct drives_pid_state *state) DBG(" current rpm: %d\n", state->rpm); /* Get some sensor readings */ - temp = le16_to_cpu(i2c_smbus_read_word_data(state->monitor, - DS1775_TEMP)) << 8; + temp = le16_to_cpu(i2c_smbus_read_word_data(state->monitor, DS1775_TEMP)) << 8; state->last_temp = temp; DBG(" temp: %d.%03d, target: %d.%03d\n", FIX32TOPRINT(temp), FIX32TOPRINT(DRIVES_PID_INPUT_TARGET)); @@ -1628,7 +1578,7 @@ static int init_dimms_state(struct dimm_pid_state *state) } /* - * Dispose of the state data for the DIMM control loop + * Dispose of the state data for the drives control loop */ static void dispose_dimms_state(struct dimm_pid_state *state) { @@ -1641,127 +1591,6 @@ static void dispose_dimms_state(struct dimm_pid_state *state) state->monitor = NULL; } -/* - * Slots fan control loop - */ -static void do_monitor_slots(struct slots_pid_state *state) -{ - s32 temp, integral, derivative; - s64 integ_p, deriv_p, prop_p, sum; - int i, rc; - - if (--state->ticks != 0) - return; - state->ticks = SLOTS_PID_INTERVAL; - - DBG("slots:\n"); - - /* Check fan status */ - rc = get_pwm_fan(SLOTS_FAN_PWM_INDEX); - if (rc < 0) { - printk(KERN_WARNING "Error %d reading slots fan !\n", rc); - /* XXX What do we do now ? */ - } else - state->pwm = rc; - DBG(" current pwm: %d\n", state->pwm); - - /* Get some sensor readings */ - temp = le16_to_cpu(i2c_smbus_read_word_data(state->monitor, - DS1775_TEMP)) << 8; - state->last_temp = temp; - DBG(" temp: %d.%03d, target: %d.%03d\n", FIX32TOPRINT(temp), - FIX32TOPRINT(SLOTS_PID_INPUT_TARGET)); - - /* Store temperature and error in history array */ - state->cur_sample = (state->cur_sample + 1) % SLOTS_PID_HISTORY_SIZE; - state->sample_history[state->cur_sample] = temp; - state->error_history[state->cur_sample] = temp - SLOTS_PID_INPUT_TARGET; - - /* If first loop, fill the history table */ - if (state->first) { - for (i = 0; i < (SLOTS_PID_HISTORY_SIZE - 1); i++) { - state->cur_sample = (state->cur_sample + 1) % - SLOTS_PID_HISTORY_SIZE; - state->sample_history[state->cur_sample] = temp; - state->error_history[state->cur_sample] = - temp - SLOTS_PID_INPUT_TARGET; - } - state->first = 0; - } - - /* Calculate the integral term */ - sum = 0; - integral = 0; - for (i = 0; i < SLOTS_PID_HISTORY_SIZE; i++) - integral += state->error_history[i]; - integral *= SLOTS_PID_INTERVAL; - DBG(" integral: %08x\n", integral); - integ_p = ((s64)SLOTS_PID_G_r) * (s64)integral; - DBG(" integ_p: %d\n", (int)(integ_p >> 36)); - sum += integ_p; - - /* Calculate the derivative term */ - derivative = state->error_history[state->cur_sample] - - state->error_history[(state->cur_sample + SLOTS_PID_HISTORY_SIZE - 1) - % SLOTS_PID_HISTORY_SIZE]; - derivative /= SLOTS_PID_INTERVAL; - deriv_p = ((s64)SLOTS_PID_G_d) * (s64)derivative; - DBG(" deriv_p: %d\n", (int)(deriv_p >> 36)); - sum += deriv_p; - - /* Calculate the proportional term */ - prop_p = ((s64)SLOTS_PID_G_p) * (s64)(state->error_history[state->cur_sample]); - DBG(" prop_p: %d\n", (int)(prop_p >> 36)); - sum += prop_p; - - /* Scale sum */ - sum >>= 36; - - DBG(" sum: %d\n", (int)sum); - state->pwm = (s32)sum; - - state->pwm = max(state->pwm, SLOTS_PID_OUTPUT_MIN); - state->pwm = min(state->pwm, SLOTS_PID_OUTPUT_MAX); - - DBG("** DRIVES PWM: %d\n", (int)state->pwm); - set_pwm_fan(SLOTS_FAN_PWM_INDEX, state->pwm); -} - -/* - * Initialize the state structure for the slots bay fan control loop - */ -static int init_slots_state(struct slots_pid_state *state) -{ - state->ticks = 1; - state->first = 1; - state->pwm = 50; - - state->monitor = attach_i2c_chip(XSERVE_SLOTS_LM75, "slots_temp"); - if (state->monitor == NULL) - return -ENODEV; - - device_create_file(&of_dev->dev, &dev_attr_slots_temperature); - device_create_file(&of_dev->dev, &dev_attr_slots_fan_pwm); - - return 0; -} - -/* - * Dispose of the state data for the slots control loop - */ -static void dispose_slots_state(struct slots_pid_state *state) -{ - if (state->monitor == NULL) - return; - - device_remove_file(&of_dev->dev, &dev_attr_slots_temperature); - device_remove_file(&of_dev->dev, &dev_attr_slots_fan_pwm); - - detach_i2c_chip(state->monitor); - state->monitor = NULL; -} - - static int call_critical_overtemp(void) { char *argv[] = { critical_overtemp_path, NULL }; @@ -1791,17 +1620,14 @@ static int main_control_loop(void *x) goto out; } - /* Set the PCI fan once for now on non-RackMac */ - if (!rackmac) - set_pwm_fan(SLOTS_FAN_PWM_INDEX, SLOTS_FAN_DEFAULT_PWM); + /* Set the PCI fan once for now */ + set_pwm_fan(SLOTS_FAN_PWM_INDEX, SLOTS_FAN_DEFAULT_PWM); /* Initialize ADCs */ initialize_adc(&cpu_state[0]); if (cpu_state[1].monitor != NULL) initialize_adc(&cpu_state[1]); - fcu_tickle_ticks = FCU_TICKLE_TICKS; - up(&driver_lock); while (state == state_attached) { @@ -1811,12 +1637,6 @@ static int main_control_loop(void *x) down(&driver_lock); - /* Tickle the FCU just in case */ - if (--fcu_tickle_ticks < 0) { - fcu_tickle_ticks = FCU_TICKLE_TICKS; - tickle_fcu(); - } - /* First, we always calculate the new DIMMs state on an Xserve */ if (rackmac) do_monitor_dimms(&dimms_state); @@ -1837,9 +1657,7 @@ static int main_control_loop(void *x) } /* Then, the rest */ do_monitor_backside(&backside_state); - if (rackmac) - do_monitor_slots(&slots_state); - else + if (!rackmac) do_monitor_drives(&drives_state); up(&driver_lock); @@ -1881,7 +1699,6 @@ static void dispose_control_loops(void) dispose_cpu_state(&cpu_state[1]); dispose_backside_state(&backside_state); dispose_drives_state(&drives_state); - dispose_slots_state(&slots_state); dispose_dimms_state(&dimms_state); } @@ -1931,8 +1748,6 @@ static int create_control_loops(void) goto fail; if (rackmac && init_dimms_state(&dimms_state)) goto fail; - if (rackmac && init_slots_state(&slots_state)) - goto fail; if (!rackmac && init_drives_state(&drives_state)) goto fail; diff --git a/drivers/macintosh/therm_pm72.h b/drivers/macintosh/therm_pm72.h index 393cc9df9..c17e61f9c 100644 --- a/drivers/macintosh/therm_pm72.h +++ b/drivers/macintosh/therm_pm72.h @@ -93,7 +93,7 @@ static char * critical_overtemp_path = "/sbin/critical_overtemp"; * 0. This appear to be safe enough for this first version * of the driver, though I would accept any clean patch * doing a better use of the device-tree without turning the - * while i2c registration mechanism into a racy mess + * while i2c registration mecanism into a racy mess * * Note: Xserve changed this. We have some bits on the K2 bus, * which I arbitrarily set to 0x200. Ultimately, we really want @@ -105,7 +105,6 @@ static char * critical_overtemp_path = "/sbin/critical_overtemp"; #define DRIVES_DALLAS_ID 0x94 #define BACKSIDE_MAX_ID 0x98 #define XSERVE_DIMMS_LM87 0x25a -#define XSERVE_SLOTS_LM75 0x290 /* * Some MAX6690, DS1775, LM87 register definitions @@ -199,7 +198,7 @@ struct drives_pid_state #define SLOTS_FAN_PWM_DEFAULT_ID 2 #define SLOTS_FAN_PWM_INDEX 2 -#define SLOTS_FAN_DEFAULT_PWM 40 /* Do better here ! */ +#define SLOTS_FAN_DEFAULT_PWM 50 /* Do better here ! */ /* @@ -207,7 +206,7 @@ struct drives_pid_state */ #define DIMM_PID_G_d 0 #define DIMM_PID_G_p 0 -#define DIMM_PID_G_r 0x06553600 +#define DIMM_PID_G_r 0x6553600 #define DIMM_PID_INPUT_TARGET 3276800 #define DIMM_PID_INTERVAL 1 #define DIMM_PID_OUTPUT_MAX 14000 @@ -227,31 +226,6 @@ struct dimm_pid_state }; -/* - * PID factors for the Xserve Slots control loop - */ -#define SLOTS_PID_G_d 0 -#define SLOTS_PID_G_p 0 -#define SLOTS_PID_G_r 0x00100000 -#define SLOTS_PID_INPUT_TARGET 3200000 -#define SLOTS_PID_INTERVAL 1 -#define SLOTS_PID_OUTPUT_MAX 100 -#define SLOTS_PID_OUTPUT_MIN 20 -#define SLOTS_PID_HISTORY_SIZE 20 - -struct slots_pid_state -{ - int ticks; - struct i2c_client * monitor; - s32 sample_history[SLOTS_PID_HISTORY_SIZE]; - s32 error_history[SLOTS_PID_HISTORY_SIZE]; - int cur_sample; - s32 last_temp; - int first; - int pwm; -}; - - /* Desktops */ @@ -309,9 +283,6 @@ struct cpu_pid_state s32 pump_max; }; -/* Tickle FCU every 10 seconds */ -#define FCU_TICKLE_TICKS 10 - /* * Driver state */ diff --git a/drivers/macintosh/therm_windtunnel.c b/drivers/macintosh/therm_windtunnel.c index c7d1c290c..3d9dd2e16 100644 --- a/drivers/macintosh/therm_windtunnel.c +++ b/drivers/macintosh/therm_windtunnel.c @@ -27,6 +27,7 @@ * */ +#include #include #include #include diff --git a/drivers/macintosh/via-cuda.c b/drivers/macintosh/via-cuda.c index 69d5452fd..2d9d79150 100644 --- a/drivers/macintosh/via-cuda.c +++ b/drivers/macintosh/via-cuda.c @@ -9,6 +9,7 @@ * Copyright (C) 1996 Paul Mackerras. */ #include +#include #include #include #include @@ -34,6 +35,13 @@ static volatile unsigned char __iomem *via; static DEFINE_SPINLOCK(cuda_lock); +#ifdef CONFIG_MAC +#define CUDA_IRQ IRQ_MAC_ADB +#define eieio() +#else +#define CUDA_IRQ vias->intrs[0].line +#endif + /* VIA registers - spaced 0x200 bytes apart */ #define RS 0x200 /* skip between registers */ #define B 0 /* B-side data */ @@ -182,24 +190,11 @@ int __init find_via_cuda(void) static int __init via_cuda_start(void) { - unsigned int irq; - if (via == NULL) return -ENODEV; -#ifdef CONFIG_MAC - irq = IRQ_MAC_ADB; -#else /* CONFIG_MAC */ - irq = irq_of_parse_and_map(vias, 0); - if (irq == NO_IRQ) { - printk(KERN_ERR "via-cuda: can't map interrupts for %s\n", - vias->full_name); - return -ENODEV; - } -#endif /* CONFIG_MAP */ - - if (request_irq(irq, cuda_interrupt, 0, "ADB", cuda_interrupt)) { - printk(KERN_ERR "via-cuda: can't request irq %d\n", irq); + if (request_irq(CUDA_IRQ, cuda_interrupt, 0, "ADB", cuda_interrupt)) { + printk(KERN_ERR "cuda_init: can't get irq %d\n", CUDA_IRQ); return -EAGAIN; } diff --git a/drivers/macintosh/via-pmu.c b/drivers/macintosh/via-pmu.c index 14610a63f..4a478eb0e 100644 --- a/drivers/macintosh/via-pmu.c +++ b/drivers/macintosh/via-pmu.c @@ -16,10 +16,12 @@ * a sleep or a freq. switch * - Move sleep code out of here to pmac_pm, merge into new * common PM infrastructure + * - Move backlight code out as well * - Save/Restore PCI space properly * */ #include +#include #include #include #include @@ -59,9 +61,13 @@ #include #include #include +#ifdef CONFIG_PMAC_BACKLIGHT #include +#endif -#include "via-pmu-event.h" +#ifdef CONFIG_PPC32 +#include +#endif /* Some compile options */ #undef SUSPEND_USES_PMU @@ -138,13 +144,14 @@ static int data_index; static int data_len; static volatile int adb_int_pending; static volatile int disable_poll; +static struct adb_request bright_req_1, bright_req_2; static struct device_node *vias; static int pmu_kind = PMU_UNKNOWN; static int pmu_fully_inited = 0; static int pmu_has_adb; static struct device_node *gpio_node; static unsigned char __iomem *gpio_reg = NULL; -static int gpio_irq = NO_IRQ; +static int gpio_irq = -1; static int gpio_irq_enabled = -1; static volatile int pmu_suspended = 0; static spinlock_t pmu_lock; @@ -154,9 +161,7 @@ static int drop_interrupts; #if defined(CONFIG_PM) && defined(CONFIG_PPC32) static int option_lid_wakeup = 1; #endif /* CONFIG_PM && CONFIG_PPC32 */ -#if (defined(CONFIG_PM)&&defined(CONFIG_PPC32))||defined(CONFIG_PMAC_BACKLIGHT_LEGACY) static int sleep_in_progress; -#endif static unsigned long async_req_locks; static unsigned int pmu_irq_stats[11]; @@ -174,9 +179,13 @@ static int query_batt_timer = BATTERY_POLLING_COUNT; static struct adb_request batt_req; static struct proc_dir_entry *proc_pmu_batt[PMU_MAX_BATTERIES]; +#if defined(CONFIG_INPUT_ADBHID) && defined(CONFIG_PMAC_BACKLIGHT) +extern int disable_kernel_backlight; +#endif /* defined(CONFIG_INPUT_ADBHID) && defined(CONFIG_PMAC_BACKLIGHT) */ + int __fake_sleep; int asleep; -BLOCKING_NOTIFIER_HEAD(sleep_notifier_list); +struct notifier_block *sleep_notifier_list; #ifdef CONFIG_ADB static int adb_dev_map = 0; @@ -197,6 +206,10 @@ static int proc_get_info(char *page, char **start, off_t off, int count, int *eof, void *data); static int proc_get_irqstats(char *page, char **start, off_t off, int count, int *eof, void *data); +#ifdef CONFIG_PMAC_BACKLIGHT +static int pmu_set_backlight_level(int level, void* data); +static int pmu_set_backlight_enable(int on, int level, void* data); +#endif /* CONFIG_PMAC_BACKLIGHT */ static void pmu_pass_intr(unsigned char *data, int len); static int proc_get_batt(char *page, char **start, off_t off, int count, int *eof, void *data); @@ -277,6 +290,13 @@ static char *pbook_type[] = { "Core99" }; +#ifdef CONFIG_PMAC_BACKLIGHT +static struct backlight_controller pmu_backlight_controller = { + pmu_set_backlight_enable, + pmu_set_backlight_level +}; +#endif /* CONFIG_PMAC_BACKLIGHT */ + int __init find_via_pmu(void) { u64 taddr; @@ -392,21 +412,24 @@ static int __init pmu_init(void) */ static int __init via_pmu_start(void) { - unsigned int irq; - if (vias == NULL) return -ENODEV; + bright_req_1.complete = 1; + bright_req_2.complete = 1; batt_req.complete = 1; - irq = irq_of_parse_and_map(vias, 0); - if (irq == NO_IRQ) { - printk(KERN_ERR "via-pmu: can't map interruptn"); - return -ENODEV; - } - if (request_irq(irq, via_pmu_interrupt, 0, "VIA-PMU", (void *)0)) { - printk(KERN_ERR "via-pmu: can't request irq %d\n", irq); - return -ENODEV; +#ifndef CONFIG_PPC_MERGE + if (pmu_kind == PMU_KEYLARGO_BASED) + openpic_set_irq_priority(vias->intrs[0].line, + OPENPIC_PRIORITY_DEFAULT + 1); +#endif + + if (request_irq(vias->intrs[0].line, via_pmu_interrupt, 0, "VIA-PMU", + (void *)0)) { + printk(KERN_ERR "VIA-PMU: can't get irq %d\n", + vias->intrs[0].line); + return -EAGAIN; } if (pmu_kind == PMU_KEYLARGO_BASED) { @@ -414,10 +437,10 @@ static int __init via_pmu_start(void) if (gpio_node == NULL) gpio_node = of_find_node_by_name(NULL, "pmu-interrupt"); - if (gpio_node) - gpio_irq = irq_of_parse_and_map(gpio_node, 0); + if (gpio_node && gpio_node->n_intrs > 0) + gpio_irq = gpio_node->intrs[0].line; - if (gpio_irq != NO_IRQ) { + if (gpio_irq != -1) { if (request_irq(gpio_irq, gpio1_interrupt, 0, "GPIO1 ADB", (void *)0)) printk(KERN_ERR "pmu: can't get irq %d" @@ -458,9 +481,9 @@ static int __init via_pmu_dev_init(void) return -ENODEV; #ifdef CONFIG_PMAC_BACKLIGHT - /* Initialize backlight */ - pmu_backlight_init(); -#endif + /* Enable backlight */ + register_backlight_controller(&pmu_backlight_controller, NULL, "pmu"); +#endif /* CONFIG_PMAC_BACKLIGHT */ #ifdef CONFIG_PPC32 if (machine_is_compatible("AAPL,3400/2400") || @@ -1396,8 +1419,11 @@ next: else if ((1 << pirq) & PMU_INT_SNDBRT) { #ifdef CONFIG_PMAC_BACKLIGHT if (len == 3) - pmac_backlight_set_legacy_brightness_pmu(data[1] >> 4); -#endif +#ifdef CONFIG_INPUT_ADBHID + if (!disable_kernel_backlight) +#endif /* CONFIG_INPUT_ADBHID */ + set_backlight_level(data[1] >> 4); +#endif /* CONFIG_PMAC_BACKLIGHT */ } /* Tick interrupt */ else if ((1 << pirq) & PMU_INT_TICK) { @@ -1413,12 +1439,6 @@ next: if (pmu_battery_count) query_battery_state(); pmu_pass_intr(data, len); - /* len == 6 is probably a bad check. But how do I - * know what PMU versions send what events here? */ - if (len == 6) { - via_pmu_event(PMU_EVT_POWER, !!(data[1]&8)); - via_pmu_event(PMU_EVT_LID, data[1]&1); - } } else { pmu_pass_intr(data, len); } @@ -1652,6 +1672,61 @@ gpio1_interrupt(int irq, void *arg, struct pt_regs *regs) return IRQ_NONE; } +#ifdef CONFIG_PMAC_BACKLIGHT +static int backlight_to_bright[] = { + 0x7f, 0x46, 0x42, 0x3e, 0x3a, 0x36, 0x32, 0x2e, + 0x2a, 0x26, 0x22, 0x1e, 0x1a, 0x16, 0x12, 0x0e +}; + +static int +pmu_set_backlight_enable(int on, int level, void* data) +{ + struct adb_request req; + + if (vias == NULL) + return -ENODEV; + + if (on) { + pmu_request(&req, NULL, 2, PMU_BACKLIGHT_BRIGHT, + backlight_to_bright[level]); + pmu_wait_complete(&req); + } + pmu_request(&req, NULL, 2, PMU_POWER_CTRL, + PMU_POW_BACKLIGHT | (on ? PMU_POW_ON : PMU_POW_OFF)); + pmu_wait_complete(&req); + + return 0; +} + +static void +pmu_bright_complete(struct adb_request *req) +{ + if (req == &bright_req_1) + clear_bit(1, &async_req_locks); + if (req == &bright_req_2) + clear_bit(2, &async_req_locks); +} + +static int +pmu_set_backlight_level(int level, void* data) +{ + if (vias == NULL) + return -ENODEV; + + if (test_and_set_bit(1, &async_req_locks)) + return -EAGAIN; + pmu_request(&bright_req_1, pmu_bright_complete, 2, PMU_BACKLIGHT_BRIGHT, + backlight_to_bright[level]); + if (test_and_set_bit(2, &async_req_locks)) + return -EAGAIN; + pmu_request(&bright_req_2, pmu_bright_complete, 2, PMU_POWER_CTRL, + PMU_POW_BACKLIGHT | (level > BACKLIGHT_OFF ? + PMU_POW_ON : PMU_POW_OFF)); + + return 0; +} +#endif /* CONFIG_PMAC_BACKLIGHT */ + void pmu_enable_irled(int on) { @@ -1995,8 +2070,6 @@ restore_via_state(void) out_8(&via[IER], IER_SET | SR_INT | CB1_INT); } -extern void pmu_backlight_set_sleep(int sleep); - static int pmac_suspend_devices(void) { @@ -2034,11 +2107,6 @@ pmac_suspend_devices(void) return -EBUSY; } -#ifdef CONFIG_PMAC_BACKLIGHT - /* Tell backlight code not to muck around with the chip anymore */ - pmu_backlight_set_sleep(1); -#endif - /* Call platform functions marked "on sleep" */ pmac_pfunc_i2c_suspend(); pmac_pfunc_base_suspend(); @@ -2075,8 +2143,9 @@ pmac_suspend_devices(void) return -EBUSY; } - /* Wait for completion of async requests */ - while (!batt_req.complete) + /* Wait for completion of async backlight requests */ + while (!bright_req_1.complete || !bright_req_2.complete || + !batt_req.complete) pmu_poll(); /* Giveup the lazy FPU & vec so we don't have to back them @@ -2097,11 +2166,6 @@ pmac_wakeup_devices(void) { mdelay(100); -#ifdef CONFIG_PMAC_BACKLIGHT - /* Tell backlight code it can use the chip again */ - pmu_backlight_set_sleep(0); -#endif - /* Power back up system devices (including the PIC) */ device_power_up(); @@ -2137,7 +2201,8 @@ pmac_wakeup_devices(void) #define GRACKLE_NAP (1<<4) #define GRACKLE_SLEEP (1<<3) -static int powerbook_sleep_grackle(void) +int +powerbook_sleep_grackle(void) { unsigned long save_l2cr; unsigned short pmcr1; @@ -2202,7 +2267,7 @@ static int powerbook_sleep_grackle(void) _set_L2CR(save_l2cr); /* Restore userland MMU context */ - set_context(current->active_mm->context.id, current->active_mm->pgd); + set_context(current->active_mm->context, current->active_mm->pgd); /* Power things up */ pmu_unlock(); @@ -2300,7 +2365,7 @@ powerbook_sleep_Core99(void) _set_L3CR(save_l3cr); /* Restore userland MMU context */ - set_context(current->active_mm->context.id, current->active_mm->pgd); + set_context(current->active_mm->context, current->active_mm->pgd); /* Tell PMU we are ready */ pmu_unlock(); @@ -2416,7 +2481,7 @@ struct pmu_private { spinlock_t lock; #if defined(CONFIG_INPUT_ADBHID) && defined(CONFIG_PMAC_BACKLIGHT) int backlight_locker; -#endif +#endif /* defined(CONFIG_INPUT_ADBHID) && defined(CONFIG_PMAC_BACKLIGHT) */ }; static LIST_HEAD(all_pmu_pvt); @@ -2466,7 +2531,7 @@ pmu_open(struct inode *inode, struct file *file) spin_lock_irqsave(&all_pvt_lock, flags); #if defined(CONFIG_INPUT_ADBHID) && defined(CONFIG_PMAC_BACKLIGHT) pp->backlight_locker = 0; -#endif +#endif /* defined(CONFIG_INPUT_ADBHID) && defined(CONFIG_PMAC_BACKLIGHT) */ list_add(&pp->list, &all_pmu_pvt); spin_unlock_irqrestore(&all_pvt_lock, flags); file->private_data = pp; @@ -2561,12 +2626,13 @@ pmu_release(struct inode *inode, struct file *file) spin_lock_irqsave(&all_pvt_lock, flags); list_del(&pp->list); spin_unlock_irqrestore(&all_pvt_lock, flags); - #if defined(CONFIG_INPUT_ADBHID) && defined(CONFIG_PMAC_BACKLIGHT) - if (pp->backlight_locker) - pmac_backlight_enable(); -#endif - + if (pp->backlight_locker) { + spin_lock_irqsave(&pmu_lock, flags); + disable_kernel_backlight--; + spin_unlock_irqrestore(&pmu_lock, flags); + } +#endif /* defined(CONFIG_INPUT_ADBHID) && defined(CONFIG_PMAC_BACKLIGHT) */ kfree(pp); } unlock_kernel(); @@ -2611,50 +2677,42 @@ pmu_ioctl(struct inode * inode, struct file *filp, return put_user(1, argp); #endif /* CONFIG_PM && CONFIG_PPC32 */ -#ifdef CONFIG_PMAC_BACKLIGHT_LEGACY - /* Compatibility ioctl's for backlight */ +#ifdef CONFIG_PMAC_BACKLIGHT + /* Backlight should have its own device or go via + * the fbdev + */ case PMU_IOC_GET_BACKLIGHT: - { - int brightness; - if (sleep_in_progress) return -EBUSY; - - brightness = pmac_backlight_get_legacy_brightness(); - if (brightness < 0) - return brightness; - else - return put_user(brightness, argp); - - } + error = get_backlight_level(); + if (error < 0) + return error; + return put_user(error, argp); case PMU_IOC_SET_BACKLIGHT: { - int brightness; - + __u32 value; if (sleep_in_progress) return -EBUSY; - - error = get_user(brightness, argp); - if (error) - return error; - - return pmac_backlight_set_legacy_brightness(brightness); + error = get_user(value, argp); + if (!error) + error = set_backlight_level(value); + break; } #ifdef CONFIG_INPUT_ADBHID case PMU_IOC_GRAB_BACKLIGHT: { struct pmu_private *pp = filp->private_data; + unsigned long flags; if (pp->backlight_locker) return 0; - pp->backlight_locker = 1; - pmac_backlight_disable(); - + spin_lock_irqsave(&pmu_lock, flags); + disable_kernel_backlight++; + spin_unlock_irqrestore(&pmu_lock, flags); return 0; } #endif /* CONFIG_INPUT_ADBHID */ -#endif /* CONFIG_PMAC_BACKLIGHT_LEGACY */ - +#endif /* CONFIG_PMAC_BACKLIGHT */ case PMU_IOC_GET_MODEL: return put_user(pmu_kind, argp); case PMU_IOC_HAS_ADB: diff --git a/drivers/macintosh/via-pmu68k.c b/drivers/macintosh/via-pmu68k.c index 35b70323e..f08e52f21 100644 --- a/drivers/macintosh/via-pmu68k.c +++ b/drivers/macintosh/via-pmu68k.c @@ -102,7 +102,7 @@ static int pmu_kind = PMU_UNKNOWN; static int pmu_fully_inited = 0; int asleep; -BLOCKING_NOTIFIER_HEAD(sleep_notifier_list); +struct notifier_block *sleep_notifier_list; static int pmu_probe(void); static int pmu_init(void); @@ -913,8 +913,7 @@ int powerbook_sleep(void) struct adb_request sleep_req; /* Notify device drivers */ - ret = blocking_notifier_call_chain(&sleep_notifier_list, - PBOOK_SLEEP, NULL); + ret = notifier_call_chain(&sleep_notifier_list, PBOOK_SLEEP, NULL); if (ret & NOTIFY_STOP_MASK) return -EBUSY; @@ -985,7 +984,7 @@ int powerbook_sleep(void) enable_irq(i); /* Notify drivers */ - blocking_notifier_call_chain(&sleep_notifier_list, PBOOK_WAKE, NULL); + notifier_call_chain(&sleep_notifier_list, PBOOK_WAKE, NULL); /* reenable ADB autopoll */ pmu_adb_autopoll(adb_dev_map); diff --git a/drivers/macintosh/windfarm_core.c b/drivers/macintosh/windfarm_core.c index ab3faa702..6c0ba04bc 100644 --- a/drivers/macintosh/windfarm_core.c +++ b/drivers/macintosh/windfarm_core.c @@ -52,7 +52,7 @@ static LIST_HEAD(wf_controls); static LIST_HEAD(wf_sensors); static DEFINE_MUTEX(wf_lock); -static BLOCKING_NOTIFIER_HEAD(wf_client_list); +static struct notifier_block *wf_client_list; static int wf_client_count; static unsigned int wf_overtemp; static unsigned int wf_overtemp_counter; @@ -68,7 +68,7 @@ static struct platform_device wf_platform_device = { static inline void wf_notify(int event, void *param) { - blocking_notifier_call_chain(&wf_client_list, event, param); + notifier_call_chain(&wf_client_list, event, param); } int wf_critical_overtemp(void) @@ -398,7 +398,7 @@ int wf_register_client(struct notifier_block *nb) struct wf_sensor *sr; mutex_lock(&wf_lock); - rc = blocking_notifier_chain_register(&wf_client_list, nb); + rc = notifier_chain_register(&wf_client_list, nb); if (rc != 0) goto bail; wf_client_count++; @@ -417,7 +417,7 @@ EXPORT_SYMBOL_GPL(wf_register_client); int wf_unregister_client(struct notifier_block *nb) { mutex_lock(&wf_lock); - blocking_notifier_chain_unregister(&wf_client_list, nb); + notifier_chain_unregister(&wf_client_list, nb); wf_client_count++; if (wf_client_count == 0) wf_stop_thread(); diff --git a/drivers/macintosh/windfarm_cpufreq_clamp.c b/drivers/macintosh/windfarm_cpufreq_clamp.c index 900aade06..81337cd16 100644 --- a/drivers/macintosh/windfarm_cpufreq_clamp.c +++ b/drivers/macintosh/windfarm_cpufreq_clamp.c @@ -1,3 +1,4 @@ +#include #include #include #include diff --git a/drivers/macintosh/windfarm_lm75_sensor.c b/drivers/macintosh/windfarm_lm75_sensor.c index 3f7967fea..423bfa243 100644 --- a/drivers/macintosh/windfarm_lm75_sensor.c +++ b/drivers/macintosh/windfarm_lm75_sensor.c @@ -15,6 +15,7 @@ #include #include #include +#include #include #include #include diff --git a/drivers/macintosh/windfarm_max6690_sensor.c b/drivers/macintosh/windfarm_max6690_sensor.c index eae1189d6..8e99d408f 100644 --- a/drivers/macintosh/windfarm_max6690_sensor.c +++ b/drivers/macintosh/windfarm_max6690_sensor.c @@ -11,6 +11,7 @@ #include #include #include +#include #include #include diff --git a/drivers/macintosh/windfarm_smu_controls.c b/drivers/macintosh/windfarm_smu_controls.c index 21719abec..a9e88edc0 100644 --- a/drivers/macintosh/windfarm_smu_controls.c +++ b/drivers/macintosh/windfarm_smu_controls.c @@ -56,7 +56,7 @@ static int smu_set_fan(int pwm, u8 id, u16 value) { struct smu_cmd cmd; u8 buffer[16]; - DECLARE_COMPLETION_ONSTACK(comp); + DECLARE_COMPLETION(comp); int rc; /* Fill SMU command structure */ diff --git a/drivers/macintosh/windfarm_smu_sat.c b/drivers/macintosh/windfarm_smu_sat.c index e295a07a1..24e51d5e9 100644 --- a/drivers/macintosh/windfarm_smu_sat.c +++ b/drivers/macintosh/windfarm_smu_sat.c @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include diff --git a/drivers/macintosh/windfarm_smu_sensors.c b/drivers/macintosh/windfarm_smu_sensors.c index 3af5fb4a2..bed25dcf8 100644 --- a/drivers/macintosh/windfarm_smu_sensors.c +++ b/drivers/macintosh/windfarm_smu_sensors.c @@ -67,7 +67,7 @@ static void smu_ads_release(struct wf_sensor *sr) static int smu_read_adc(u8 id, s32 *value) { struct smu_simple_cmd cmd; - DECLARE_COMPLETION_ONSTACK(comp); + DECLARE_COMPLETION(comp); int rc; rc = smu_queue_simple(&cmd, SMU_CMD_READ_ADC, 1, diff --git a/drivers/md/Kconfig b/drivers/md/Kconfig index bf869ed03..ac43f9806 100644 --- a/drivers/md/Kconfig +++ b/drivers/md/Kconfig @@ -90,7 +90,7 @@ config MD_RAID10 depends on BLK_DEV_MD && EXPERIMENTAL ---help--- RAID-10 provides a combination of striping (RAID-0) and - mirroring (RAID-1) with easier configuration and more flexible + mirroring (RAID-1) with easier configuration and more flexable layout. Unlike RAID-0, but like RAID-1, RAID-10 requires all devices to be the same size (or at least, only as much as the smallest device @@ -104,8 +104,8 @@ config MD_RAID10 If unsure, say Y. -config MD_RAID456 - tristate "RAID-4/RAID-5/RAID-6 mode" +config MD_RAID5 + tristate "RAID-4/RAID-5 mode" depends on BLK_DEV_MD ---help--- A RAID-5 set of N drives with a capacity of C MB per drive provides @@ -116,51 +116,38 @@ config MD_RAID456 while a RAID-5 set distributes the parity across the drives in one of the available parity distribution methods. - A RAID-6 set of N drives with a capacity of C MB per drive - provides the capacity of C * (N - 2) MB, and protects - against a failure of any two drives. For a given sector - (row) number, (N - 2) drives contain data sectors, and two - drives contains two independent redundancy syndromes. Like - RAID-5, RAID-6 distributes the syndromes across the drives - in one of the available parity distribution methods. - Information about Software RAID on Linux is contained in the Software-RAID mini-HOWTO, available from . There you will also learn where to get the supporting user space utilities raidtools. - If you want to use such a RAID-4/RAID-5/RAID-6 set, say Y. To + If you want to use such a RAID-4/RAID-5 set, say Y. To compile this code as a module, choose M here: the module - will be called raid456. + will be called raid5. If unsure, say Y. -config MD_RAID5_RESHAPE - bool "Support adding drives to a raid-5 array (experimental)" - depends on MD_RAID456 && EXPERIMENTAL +config MD_RAID6 + tristate "RAID-6 mode" + depends on BLK_DEV_MD ---help--- - A RAID-5 set can be expanded by adding extra drives. This - requires "restriping" the array which means (almost) every - block must be written to a different place. + A RAID-6 set of N drives with a capacity of C MB per drive + provides the capacity of C * (N - 2) MB, and protects + against a failure of any two drives. For a given sector + (row) number, (N - 2) drives contain data sectors, and two + drives contains two independent redundancy syndromes. Like + RAID-5, RAID-6 distributes the syndromes across the drives + in one of the available parity distribution methods. - This option allows such restriping to be done while the array - is online. However it is still EXPERIMENTAL code. It should - work, but please be sure that you have backups. + RAID-6 requires mdadm-1.5.0 or later, available at: - You will need mdadm version 2.4.1 or later to use this - feature safely. During the early stage of reshape there is - a critical section where live data is being over-written. A - crash during this time needs extra care for recovery. The - newer mdadm takes a copy of the data in the critical section - and will restore it, if necessary, after a crash. + ftp://ftp.kernel.org/pub/linux/utils/raid/mdadm/ - The mdadm usage is e.g. - mdadm --grow /dev/md1 --raid-disks=6 - to grow '/dev/md1' to having 6 disks. + If you want to use such a RAID-6 set, say Y. To compile + this code as a module, choose M here: the module will be + called raid6. - Note: The array can only be expanded, not contracted. - There should be enough spares already present to make the new - array workable. + If unsure, say Y. config MD_MULTIPATH tristate "Multipath I/O support" @@ -221,7 +208,7 @@ config DM_SNAPSHOT tristate "Snapshot target (EXPERIMENTAL)" depends on BLK_DEV_DM && EXPERIMENTAL ---help--- - Allow volume managers to take writable snapshots of a device. + Allow volume managers to take writeable snapshots of a device. config DM_MIRROR tristate "Mirror target (EXPERIMENTAL)" diff --git a/drivers/md/Makefile b/drivers/md/Makefile index 34957a68d..d3efedf6a 100644 --- a/drivers/md/Makefile +++ b/drivers/md/Makefile @@ -8,7 +8,7 @@ dm-multipath-objs := dm-hw-handler.o dm-path-selector.o dm-mpath.o dm-snapshot-objs := dm-snap.o dm-exception-store.o dm-mirror-objs := dm-log.o dm-raid1.o md-mod-objs := md.o bitmap.o -raid456-objs := raid5.o raid6algos.o raid6recov.o raid6tables.o \ +raid6-objs := raid6main.o raid6algos.o raid6recov.o raid6tables.o \ raid6int1.o raid6int2.o raid6int4.o \ raid6int8.o raid6int16.o raid6int32.o \ raid6altivec1.o raid6altivec2.o raid6altivec4.o \ @@ -25,7 +25,8 @@ obj-$(CONFIG_MD_LINEAR) += linear.o obj-$(CONFIG_MD_RAID0) += raid0.o obj-$(CONFIG_MD_RAID1) += raid1.o obj-$(CONFIG_MD_RAID10) += raid10.o -obj-$(CONFIG_MD_RAID456) += raid456.o xor.o +obj-$(CONFIG_MD_RAID5) += raid5.o xor.o +obj-$(CONFIG_MD_RAID6) += raid6.o xor.o obj-$(CONFIG_MD_MULTIPATH) += multipath.o obj-$(CONFIG_MD_FAULTY) += faulty.o obj-$(CONFIG_BLK_DEV_MD) += md-mod.o diff --git a/drivers/md/bitmap.c b/drivers/md/bitmap.c index ecc56765d..eae4473ea 100644 --- a/drivers/md/bitmap.c +++ b/drivers/md/bitmap.c @@ -7,6 +7,7 @@ * additions, Copyright (C) 2003-2004, Paul Clements, SteelEye Technology, Inc.: * - added disk storage for bitmap * - changes to allow various bitmap chunk sizes + * - added bitmap daemon (to asynchronously clear bitmap bits from disk) */ /* @@ -14,12 +15,16 @@ * * flush after percent set rather than just time based. (maybe both). * wait if count gets too high, wake when it drops to half. + * allow bitmap to be mirrored with superblock (before or after...) + * allow hot-add to re-instate a current device. + * allow hot-add of bitmap after quiessing device */ #include #include #include #include +#include #include #include #include @@ -67,6 +72,34 @@ static inline char * bmname(struct bitmap *bitmap) } +/* + * test if the bitmap is active + */ +int bitmap_active(struct bitmap *bitmap) +{ + unsigned long flags; + int res = 0; + + if (!bitmap) + return res; + spin_lock_irqsave(&bitmap->lock, flags); + res = bitmap->flags & BITMAP_ACTIVE; + spin_unlock_irqrestore(&bitmap->lock, flags); + return res; +} + +#define WRITE_POOL_SIZE 256 +/* mempool for queueing pending writes on the bitmap file */ +static void *write_pool_alloc(gfp_t gfp_flags, void *data) +{ + return kmalloc(sizeof(struct page_list), gfp_flags); +} + +static void write_pool_free(void *ptr, void *data) +{ + kfree(ptr); +} + /* * just a placeholder - calls kmalloc for bitmap pages */ @@ -246,8 +279,6 @@ static struct page *read_sb_page(mddev_t *mddev, long offset, unsigned long inde if (sync_page_io(rdev->bdev, target, PAGE_SIZE, page, READ)) { page->index = index; - attach_page_buffers(page, NULL); /* so that free_buffer will - * quietly no-op */ return page; } } @@ -279,132 +310,77 @@ static int write_sb_page(mddev_t *mddev, long offset, struct page *page, int wai */ static int write_page(struct bitmap *bitmap, struct page *page, int wait) { - struct buffer_head *bh; + int ret = -ENOMEM; if (bitmap->file == NULL) return write_sb_page(bitmap->mddev, bitmap->offset, page, wait); - bh = page_buffers(page); - - while (bh && bh->b_blocknr) { - atomic_inc(&bitmap->pending_writes); - set_buffer_locked(bh); - set_buffer_mapped(bh); - submit_bh(WRITE, bh); - bh = bh->b_this_page; - } + flush_dcache_page(page); /* make sure visible to anyone reading the file */ - if (wait) { - wait_event(bitmap->write_wait, - atomic_read(&bitmap->pending_writes)==0); - return (bitmap->flags & BITMAP_WRITE_ERROR) ? -EIO : 0; + if (wait) + lock_page(page); + else { + if (TestSetPageLocked(page)) + return -EAGAIN; /* already locked */ + if (PageWriteback(page)) { + unlock_page(page); + return -EAGAIN; + } } - return 0; -} - -static void end_bitmap_write(struct buffer_head *bh, int uptodate) -{ - struct bitmap *bitmap = bh->b_private; - unsigned long flags; - if (!uptodate) { - spin_lock_irqsave(&bitmap->lock, flags); - bitmap->flags |= BITMAP_WRITE_ERROR; - spin_unlock_irqrestore(&bitmap->lock, flags); + ret = page->mapping->a_ops->prepare_write(bitmap->file, page, 0, PAGE_SIZE); + if (!ret) + ret = page->mapping->a_ops->commit_write(bitmap->file, page, 0, + PAGE_SIZE); + if (ret) { + unlock_page(page); + return ret; } - if (atomic_dec_and_test(&bitmap->pending_writes)) - wake_up(&bitmap->write_wait); -} - -/* copied from buffer.c */ -static void -__clear_page_buffers(struct page *page) -{ - ClearPagePrivate(page); - set_page_private(page, 0); - page_cache_release(page); -} -static void free_buffers(struct page *page) -{ - struct buffer_head *bh = page_buffers(page); - while (bh) { - struct buffer_head *next = bh->b_this_page; - free_buffer_head(bh); - bh = next; + set_page_dirty(page); /* force it to be written out */ + + if (!wait) { + /* add to list to be waited for by daemon */ + struct page_list *item = mempool_alloc(bitmap->write_pool, GFP_NOIO); + item->page = page; + get_page(page); + spin_lock(&bitmap->write_lock); + list_add(&item->list, &bitmap->complete_pages); + spin_unlock(&bitmap->write_lock); + md_wakeup_thread(bitmap->writeback_daemon); } - __clear_page_buffers(page); - put_page(page); + return write_one_page(page, wait); } -/* read a page from a file. - * We both read the page, and attach buffers to the page to record the - * address of each block (using bmap). These addresses will be used - * to write the block later, completely bypassing the filesystem. - * This usage is similar to how swap files are handled, and allows us - * to write to a file with no concerns of memory allocation failing. - */ +/* read a page from a file, pinning it into cache, and return bytes_read */ static struct page *read_page(struct file *file, unsigned long index, - struct bitmap *bitmap, - unsigned long count) + unsigned long *bytes_read) { + struct inode *inode = file->f_mapping->host; struct page *page = NULL; - struct inode *inode = file->f_dentry->d_inode; - struct buffer_head *bh; - sector_t block; + loff_t isize = i_size_read(inode); + unsigned long end_index = isize >> PAGE_SHIFT; PRINTK("read bitmap file (%dB @ %Lu)\n", (int)PAGE_SIZE, (unsigned long long)index << PAGE_SHIFT); - page = alloc_page(GFP_KERNEL); - if (!page) - page = ERR_PTR(-ENOMEM); + page = read_cache_page(inode->i_mapping, index, + (filler_t *)inode->i_mapping->a_ops->readpage, file); if (IS_ERR(page)) goto out; - - bh = alloc_page_buffers(page, 1<i_blkbits, 0); - if (!bh) { + wait_on_page_locked(page); + if (!PageUptodate(page) || PageError(page)) { put_page(page); - page = ERR_PTR(-ENOMEM); + page = ERR_PTR(-EIO); goto out; } - attach_page_buffers(page, bh); - block = index << (PAGE_SHIFT - inode->i_blkbits); - while (bh) { - if (count == 0) - bh->b_blocknr = 0; - else { - bh->b_blocknr = bmap(inode, block); - if (bh->b_blocknr == 0) { - /* Cannot use this file! */ - free_buffers(page); - page = ERR_PTR(-EINVAL); - goto out; - } - bh->b_bdev = inode->i_sb->s_bdev; - if (count < (1<i_blkbits)) - count = 0; - else - count -= (1<i_blkbits); - - bh->b_end_io = end_bitmap_write; - bh->b_private = bitmap; - atomic_inc(&bitmap->pending_writes); - set_buffer_locked(bh); - set_buffer_mapped(bh); - submit_bh(READ, bh); - } - block++; - bh = bh->b_this_page; - } - page->index = index; - wait_event(bitmap->write_wait, - atomic_read(&bitmap->pending_writes)==0); - if (bitmap->flags & BITMAP_WRITE_ERROR) { - free_buffers(page); - page = ERR_PTR(-EIO); - } + if (index > end_index) /* we have read beyond EOF */ + *bytes_read = 0; + else if (index == end_index) /* possible short read */ + *bytes_read = isize & ~PAGE_MASK; + else + *bytes_read = PAGE_SIZE; /* got a full page */ out: if (IS_ERR(page)) printk(KERN_ALERT "md: bitmap read error: (%dB @ %Lu): %ld\n", @@ -475,14 +451,16 @@ static int bitmap_read_sb(struct bitmap *bitmap) char *reason = NULL; bitmap_super_t *sb; unsigned long chunksize, daemon_sleep, write_behind; + unsigned long bytes_read; unsigned long long events; int err = -EINVAL; /* page 0 is the superblock, read it... */ if (bitmap->file) - bitmap->sb_page = read_page(bitmap->file, 0, bitmap, PAGE_SIZE); + bitmap->sb_page = read_page(bitmap->file, 0, &bytes_read); else { bitmap->sb_page = read_sb_page(bitmap->mddev, bitmap->offset, 0); + bytes_read = PAGE_SIZE; } if (IS_ERR(bitmap->sb_page)) { err = PTR_ERR(bitmap->sb_page); @@ -492,6 +470,13 @@ static int bitmap_read_sb(struct bitmap *bitmap) sb = (bitmap_super_t *)kmap_atomic(bitmap->sb_page, KM_USER0); + if (bytes_read < sizeof(*sb)) { /* short read */ + printk(KERN_INFO "%s: bitmap file superblock truncated\n", + bmname(bitmap)); + err = -ENOSPC; + goto out; + } + chunksize = le32_to_cpu(sb->chunksize); daemon_sleep = le32_to_cpu(sb->daemon_sleep); write_behind = le32_to_cpu(sb->write_behind); @@ -571,10 +556,11 @@ static void bitmap_mask_state(struct bitmap *bitmap, enum bitmap_state bits, unsigned long flags; spin_lock_irqsave(&bitmap->lock, flags); - if (!bitmap->sb_page) { /* can't set the state */ + if (!bitmap || !bitmap->sb_page) { /* can't set the state */ spin_unlock_irqrestore(&bitmap->lock, flags); return; } + get_page(bitmap->sb_page); spin_unlock_irqrestore(&bitmap->lock, flags); sb = (bitmap_super_t *)kmap_atomic(bitmap->sb_page, KM_USER0); switch (op) { @@ -585,6 +571,7 @@ static void bitmap_mask_state(struct bitmap *bitmap, enum bitmap_state bits, default: BUG(); } kunmap_atomic(sb, KM_USER0); + put_page(bitmap->sb_page); } /* @@ -637,17 +624,48 @@ static void bitmap_file_unmap(struct bitmap *bitmap) while (pages--) if (map[pages]->index != 0) /* 0 is sb_page, release it below */ - free_buffers(map[pages]); + put_page(map[pages]); kfree(map); kfree(attr); - if (sb_page) - free_buffers(sb_page); + safe_put_page(sb_page); +} + +static void bitmap_stop_daemon(struct bitmap *bitmap); + +/* dequeue the next item in a page list -- don't call from irq context */ +static struct page_list *dequeue_page(struct bitmap *bitmap) +{ + struct page_list *item = NULL; + struct list_head *head = &bitmap->complete_pages; + + spin_lock(&bitmap->write_lock); + if (list_empty(head)) + goto out; + item = list_entry(head->prev, struct page_list, list); + list_del(head->prev); +out: + spin_unlock(&bitmap->write_lock); + return item; +} + +static void drain_write_queues(struct bitmap *bitmap) +{ + struct page_list *item; + + while ((item = dequeue_page(bitmap))) { + /* don't bother to wait */ + put_page(item->page); + mempool_free(item, bitmap->write_pool); + } + + wake_up(&bitmap->write_wait); } static void bitmap_file_put(struct bitmap *bitmap) { struct file *file; + struct inode *inode; unsigned long flags; spin_lock_irqsave(&bitmap->lock, flags); @@ -655,14 +673,17 @@ static void bitmap_file_put(struct bitmap *bitmap) bitmap->file = NULL; spin_unlock_irqrestore(&bitmap->lock, flags); - if (file) - wait_event(bitmap->write_wait, - atomic_read(&bitmap->pending_writes)==0); + bitmap_stop_daemon(bitmap); + + drain_write_queues(bitmap); + bitmap_file_unmap(bitmap); if (file) { - struct inode *inode = file->f_dentry->d_inode; - invalidate_inode_pages(inode->i_mapping); + inode = file->f_mapping->host; + spin_lock(&inode->i_lock); + atomic_set(&inode->i_writecount, 1); /* allow writes again */ + spin_unlock(&inode->i_lock); fput(file); } } @@ -697,27 +718,26 @@ static void bitmap_file_kick(struct bitmap *bitmap) } enum bitmap_page_attr { - BITMAP_PAGE_DIRTY = 0, // there are set bits that need to be synced - BITMAP_PAGE_CLEAN = 1, // there are bits that might need to be cleared - BITMAP_PAGE_NEEDWRITE=2, // there are cleared bits that need to be synced + BITMAP_PAGE_DIRTY = 1, // there are set bits that need to be synced + BITMAP_PAGE_CLEAN = 2, // there are bits that might need to be cleared + BITMAP_PAGE_NEEDWRITE=4, // there are cleared bits that need to be synced }; static inline void set_page_attr(struct bitmap *bitmap, struct page *page, enum bitmap_page_attr attr) { - __set_bit((page->index<<2) + attr, bitmap->filemap_attr); + bitmap->filemap_attr[page->index] |= attr; } static inline void clear_page_attr(struct bitmap *bitmap, struct page *page, enum bitmap_page_attr attr) { - __clear_bit((page->index<<2) + attr, bitmap->filemap_attr); + bitmap->filemap_attr[page->index] &= ~attr; } -static inline unsigned long test_page_attr(struct bitmap *bitmap, struct page *page, - enum bitmap_page_attr attr) +static inline unsigned long get_page_attr(struct bitmap *bitmap, struct page *page) { - return test_bit((page->index<<2) + attr, bitmap->filemap_attr); + return bitmap->filemap_attr[page->index]; } /* @@ -741,6 +761,11 @@ static void bitmap_file_set_bit(struct bitmap *bitmap, sector_t block) page = filemap_get_page(bitmap, chunk); bit = file_page_offset(chunk); + + /* make sure the page stays cached until it gets written out */ + if (! (get_page_attr(bitmap, page) & BITMAP_PAGE_DIRTY)) + get_page(page); + /* set the bit */ kaddr = kmap_atomic(page, KM_USER0); if (bitmap->flags & BITMAP_HOSTENDIAN) @@ -760,8 +785,7 @@ static void bitmap_file_set_bit(struct bitmap *bitmap, sector_t block) * sync the dirty pages of the bitmap file to disk */ int bitmap_unplug(struct bitmap *bitmap) { - unsigned long i, flags; - int dirty, need_write; + unsigned long i, attr, flags; struct page *page; int wait = 0; int err; @@ -778,26 +802,35 @@ int bitmap_unplug(struct bitmap *bitmap) return 0; } page = bitmap->filemap[i]; - dirty = test_page_attr(bitmap, page, BITMAP_PAGE_DIRTY); - need_write = test_page_attr(bitmap, page, BITMAP_PAGE_NEEDWRITE); + attr = get_page_attr(bitmap, page); clear_page_attr(bitmap, page, BITMAP_PAGE_DIRTY); clear_page_attr(bitmap, page, BITMAP_PAGE_NEEDWRITE); - if (dirty) + if ((attr & BITMAP_PAGE_DIRTY)) wait = 1; spin_unlock_irqrestore(&bitmap->lock, flags); - if (dirty | need_write) + if (attr & (BITMAP_PAGE_DIRTY | BITMAP_PAGE_NEEDWRITE)) { err = write_page(bitmap, page, 0); + if (err == -EAGAIN) { + if (attr & BITMAP_PAGE_DIRTY) + err = write_page(bitmap, page, 1); + else + err = 0; + } + if (err) + return 1; + } } if (wait) { /* if any writes were performed, we need to wait on them */ - if (bitmap->file) - wait_event(bitmap->write_wait, - atomic_read(&bitmap->pending_writes)==0); - else + if (bitmap->file) { + spin_lock_irq(&bitmap->write_lock); + wait_event_lock_irq(bitmap->write_wait, + list_empty(&bitmap->complete_pages), bitmap->write_lock, + wake_up_process(bitmap->writeback_daemon->tsk)); + spin_unlock_irq(&bitmap->write_lock); + } else md_super_wait(bitmap->mddev); } - if (bitmap->flags & BITMAP_WRITE_ERROR) - bitmap_file_kick(bitmap); return 0; } @@ -819,7 +852,7 @@ static int bitmap_init_from_disk(struct bitmap *bitmap, sector_t start) struct page *page = NULL, *oldpage = NULL; unsigned long num_pages, bit_cnt = 0; struct file *file; - unsigned long bytes, offset; + unsigned long bytes, offset, dummy; int outofdate; int ret = -ENOSPC; void *paddr; @@ -856,12 +889,7 @@ static int bitmap_init_from_disk(struct bitmap *bitmap, sector_t start) if (!bitmap->filemap) goto out; - /* We need 4 bits per page, rounded up to a multiple of sizeof(unsigned long) */ - bitmap->filemap_attr = kzalloc( - (((num_pages*4/8)+sizeof(unsigned long)-1) - /sizeof(unsigned long)) - *sizeof(unsigned long), - GFP_KERNEL); + bitmap->filemap_attr = kzalloc(sizeof(long) * num_pages, GFP_KERNEL); if (!bitmap->filemap_attr) goto out; @@ -872,12 +900,7 @@ static int bitmap_init_from_disk(struct bitmap *bitmap, sector_t start) index = file_page_index(i); bit = file_page_offset(i); if (index != oldindex) { /* this is a new page, read it in */ - int count; /* unmap the old page, we're done with it */ - if (index == num_pages-1) - count = bytes - index * PAGE_SIZE; - else - count = PAGE_SIZE; if (index == 0) { /* * if we're here then the superblock page @@ -887,7 +910,7 @@ static int bitmap_init_from_disk(struct bitmap *bitmap, sector_t start) page = bitmap->sb_page; offset = sizeof(bitmap_super_t); } else if (file) { - page = read_page(file, index, bitmap, count); + page = read_page(file, index, &dummy); offset = 0; } else { page = read_sb_page(bitmap->mddev, bitmap->offset, index); @@ -958,11 +981,12 @@ void bitmap_write_all(struct bitmap *bitmap) /* We don't actually write all bitmap blocks here, * just flag them as needing to be written */ - int i; - for (i=0; i < bitmap->file_pages; i++) - set_page_attr(bitmap, bitmap->filemap[i], - BITMAP_PAGE_NEEDWRITE); + unsigned long chunks = bitmap->chunks; + unsigned long bytes = (chunks+7)/8 + sizeof(bitmap_super_t); + unsigned long num_pages = (bytes + PAGE_SIZE-1) / PAGE_SIZE; + while (num_pages--) + bitmap->filemap_attr[num_pages] |= BITMAP_PAGE_NEEDWRITE; } @@ -993,6 +1017,7 @@ int bitmap_daemon_work(struct bitmap *bitmap) struct page *page = NULL, *lastpage = NULL; int err = 0; int blocks; + int attr; void *paddr; if (bitmap == NULL) @@ -1014,34 +1039,43 @@ int bitmap_daemon_work(struct bitmap *bitmap) if (page != lastpage) { /* skip this page unless it's marked as needing cleaning */ - if (!test_page_attr(bitmap, page, BITMAP_PAGE_CLEAN)) { - int need_write = test_page_attr(bitmap, page, - BITMAP_PAGE_NEEDWRITE); - if (need_write) + if (!((attr=get_page_attr(bitmap, page)) & BITMAP_PAGE_CLEAN)) { + if (attr & BITMAP_PAGE_NEEDWRITE) { + get_page(page); clear_page_attr(bitmap, page, BITMAP_PAGE_NEEDWRITE); - + } spin_unlock_irqrestore(&bitmap->lock, flags); - if (need_write) { + if (attr & BITMAP_PAGE_NEEDWRITE) { switch (write_page(bitmap, page, 0)) { + case -EAGAIN: + set_page_attr(bitmap, page, BITMAP_PAGE_NEEDWRITE); + break; case 0: break; default: bitmap_file_kick(bitmap); } + put_page(page); } continue; } /* grab the new page, sync and release the old */ + get_page(page); if (lastpage != NULL) { - if (test_page_attr(bitmap, lastpage, BITMAP_PAGE_NEEDWRITE)) { + if (get_page_attr(bitmap, lastpage) & BITMAP_PAGE_NEEDWRITE) { clear_page_attr(bitmap, lastpage, BITMAP_PAGE_NEEDWRITE); spin_unlock_irqrestore(&bitmap->lock, flags); err = write_page(bitmap, lastpage, 0); + if (err == -EAGAIN) { + err = 0; + set_page_attr(bitmap, lastpage, BITMAP_PAGE_NEEDWRITE); + } } else { set_page_attr(bitmap, lastpage, BITMAP_PAGE_NEEDWRITE); spin_unlock_irqrestore(&bitmap->lock, flags); } + put_page(lastpage); if (err) bitmap_file_kick(bitmap); } else @@ -1083,19 +1117,131 @@ int bitmap_daemon_work(struct bitmap *bitmap) /* now sync the final page */ if (lastpage != NULL) { spin_lock_irqsave(&bitmap->lock, flags); - if (test_page_attr(bitmap, lastpage, BITMAP_PAGE_NEEDWRITE)) { + if (get_page_attr(bitmap, lastpage) &BITMAP_PAGE_NEEDWRITE) { clear_page_attr(bitmap, lastpage, BITMAP_PAGE_NEEDWRITE); spin_unlock_irqrestore(&bitmap->lock, flags); err = write_page(bitmap, lastpage, 0); + if (err == -EAGAIN) { + set_page_attr(bitmap, lastpage, BITMAP_PAGE_NEEDWRITE); + err = 0; + } } else { set_page_attr(bitmap, lastpage, BITMAP_PAGE_NEEDWRITE); spin_unlock_irqrestore(&bitmap->lock, flags); } + + put_page(lastpage); } return err; } +static void daemon_exit(struct bitmap *bitmap, mdk_thread_t **daemon) +{ + mdk_thread_t *dmn; + unsigned long flags; + + /* if no one is waiting on us, we'll free the md thread struct + * and exit, otherwise we let the waiter clean things up */ + spin_lock_irqsave(&bitmap->lock, flags); + if ((dmn = *daemon)) { /* no one is waiting, cleanup and exit */ + *daemon = NULL; + spin_unlock_irqrestore(&bitmap->lock, flags); + kfree(dmn); + complete_and_exit(NULL, 0); /* do_exit not exported */ + } + spin_unlock_irqrestore(&bitmap->lock, flags); +} + +static void bitmap_writeback_daemon(mddev_t *mddev) +{ + struct bitmap *bitmap = mddev->bitmap; + struct page *page; + struct page_list *item; + int err = 0; + + if (signal_pending(current)) { + printk(KERN_INFO + "%s: bitmap writeback daemon got signal, exiting...\n", + bmname(bitmap)); + err = -EINTR; + goto out; + } + if (bitmap == NULL) + /* about to be stopped. */ + return; + + PRINTK("%s: bitmap writeback daemon woke up...\n", bmname(bitmap)); + /* wait on bitmap page writebacks */ + while ((item = dequeue_page(bitmap))) { + page = item->page; + mempool_free(item, bitmap->write_pool); + PRINTK("wait on page writeback: %p\n", page); + wait_on_page_writeback(page); + PRINTK("finished page writeback: %p\n", page); + + err = PageError(page); + put_page(page); + if (err) { + printk(KERN_WARNING "%s: bitmap file writeback " + "failed (page %lu): %d\n", + bmname(bitmap), page->index, err); + bitmap_file_kick(bitmap); + goto out; + } + } + out: + wake_up(&bitmap->write_wait); + if (err) { + printk(KERN_INFO "%s: bitmap writeback daemon exiting (%d)\n", + bmname(bitmap), err); + daemon_exit(bitmap, &bitmap->writeback_daemon); + } +} + +static mdk_thread_t *bitmap_start_daemon(struct bitmap *bitmap, + void (*func)(mddev_t *), char *name) +{ + mdk_thread_t *daemon; + char namebuf[32]; + +#ifdef INJECT_FATAL_FAULT_2 + daemon = NULL; +#else + sprintf(namebuf, "%%s_%s", name); + daemon = md_register_thread(func, bitmap->mddev, namebuf); +#endif + if (!daemon) { + printk(KERN_ERR "%s: failed to start bitmap daemon\n", + bmname(bitmap)); + return ERR_PTR(-ECHILD); + } + + md_wakeup_thread(daemon); /* start it running */ + + PRINTK("%s: %s daemon (pid %d) started...\n", + bmname(bitmap), name, daemon->tsk->pid); + + return daemon; +} + +static void bitmap_stop_daemon(struct bitmap *bitmap) +{ + /* the daemon can't stop itself... it'll just exit instead... */ + if (bitmap->writeback_daemon && ! IS_ERR(bitmap->writeback_daemon) && + current->pid != bitmap->writeback_daemon->tsk->pid) { + mdk_thread_t *daemon; + unsigned long flags; + + spin_lock_irqsave(&bitmap->lock, flags); + daemon = bitmap->writeback_daemon; + bitmap->writeback_daemon = NULL; + spin_unlock_irqrestore(&bitmap->lock, flags); + if (daemon && ! IS_ERR(daemon)) + md_unregister_thread(daemon); /* destroy the thread */ + } +} + static bitmap_counter_t *bitmap_get_counter(struct bitmap *bitmap, sector_t offset, int *blocks, int create) @@ -1163,7 +1309,7 @@ int bitmap_startwrite(struct bitmap *bitmap, sector_t offset, unsigned long sect case 1: *bmc = 2; } - BUG_ON((*bmc & COUNTER_MAX) == COUNTER_MAX); + if ((*bmc & COUNTER_MAX) == COUNTER_MAX) BUG(); (*bmc)++; spin_unlock_irq(&bitmap->lock); @@ -1364,6 +1510,8 @@ static void bitmap_free(struct bitmap *bitmap) /* free all allocated memory */ + mempool_destroy(bitmap->write_pool); + if (bp) /* deallocate the page memory */ for (k = 0; k < pages; k++) if (bp[k].map && !bp[k].hijacked) @@ -1411,20 +1559,20 @@ int bitmap_create(mddev_t *mddev) return -ENOMEM; spin_lock_init(&bitmap->lock); - atomic_set(&bitmap->pending_writes, 0); - init_waitqueue_head(&bitmap->write_wait); - bitmap->mddev = mddev; + spin_lock_init(&bitmap->write_lock); + INIT_LIST_HEAD(&bitmap->complete_pages); + init_waitqueue_head(&bitmap->write_wait); + bitmap->write_pool = mempool_create(WRITE_POOL_SIZE, write_pool_alloc, + write_pool_free, NULL); + err = -ENOMEM; + if (!bitmap->write_pool) + goto error; + bitmap->file = file; bitmap->offset = mddev->bitmap_offset; - if (file) { - get_file(file); - do_sync_file_range(file, 0, LLONG_MAX, - SYNC_FILE_RANGE_WAIT_BEFORE | - SYNC_FILE_RANGE_WRITE | - SYNC_FILE_RANGE_WAIT_AFTER); - } + if (file) get_file(file); /* read superblock from bitmap file (this sets bitmap->chunksize) */ err = bitmap_read_sb(bitmap); if (err) @@ -1456,6 +1604,8 @@ int bitmap_create(mddev_t *mddev) if (!bitmap->bp) goto error; + bitmap->flags |= BITMAP_ACTIVE; + /* now that we have some pages available, initialize the in-memory * bitmap from the on-disk bitmap */ start = 0; @@ -1473,6 +1623,15 @@ int bitmap_create(mddev_t *mddev) mddev->bitmap = bitmap; + if (file) + /* kick off the bitmap writeback daemon */ + bitmap->writeback_daemon = + bitmap_start_daemon(bitmap, + bitmap_writeback_daemon, + "bitmap_wb"); + + if (IS_ERR(bitmap->writeback_daemon)) + return PTR_ERR(bitmap->writeback_daemon); mddev->thread->timeout = bitmap->daemon_sleep * HZ; return bitmap_update_sb(bitmap); @@ -1489,3 +1648,4 @@ EXPORT_SYMBOL(bitmap_start_sync); EXPORT_SYMBOL(bitmap_end_sync); EXPORT_SYMBOL(bitmap_unplug); EXPORT_SYMBOL(bitmap_close_sync); +EXPORT_SYMBOL(bitmap_daemon_work); diff --git a/drivers/md/dm-crypt.c b/drivers/md/dm-crypt.c index 31e498fd8..aa9b7728d 100644 --- a/drivers/md/dm-crypt.c +++ b/drivers/md/dm-crypt.c @@ -20,7 +20,7 @@ #include "dm.h" -#define DM_MSG_PREFIX "crypt" +#define PFX "crypt: " /* * per bio private data @@ -93,6 +93,20 @@ struct crypt_config { static kmem_cache_t *_crypt_io_pool; +/* + * Mempool alloc and free functions for the page + */ +static void *mempool_alloc_page(gfp_t gfp_mask, void *data) +{ + return alloc_page(gfp_mask); +} + +static void mempool_free_page(void *page, void *data) +{ + __free_page(page); +} + + /* * Different IV generation algorithms: * @@ -125,19 +139,19 @@ static int crypt_iv_essiv_ctr(struct crypt_config *cc, struct dm_target *ti, u8 *salt; if (opts == NULL) { - ti->error = "Digest algorithm missing for ESSIV mode"; + ti->error = PFX "Digest algorithm missing for ESSIV mode"; return -EINVAL; } /* Hash the cipher key with the given hash algorithm */ hash_tfm = crypto_alloc_tfm(opts, CRYPTO_TFM_REQ_MAY_SLEEP); if (hash_tfm == NULL) { - ti->error = "Error initializing ESSIV hash"; + ti->error = PFX "Error initializing ESSIV hash"; return -EINVAL; } if (crypto_tfm_alg_type(hash_tfm) != CRYPTO_ALG_TYPE_DIGEST) { - ti->error = "Expected digest algorithm for ESSIV hash"; + ti->error = PFX "Expected digest algorithm for ESSIV hash"; crypto_free_tfm(hash_tfm); return -EINVAL; } @@ -145,7 +159,7 @@ static int crypt_iv_essiv_ctr(struct crypt_config *cc, struct dm_target *ti, saltsize = crypto_tfm_alg_digestsize(hash_tfm); salt = kmalloc(saltsize, GFP_KERNEL); if (salt == NULL) { - ti->error = "Error kmallocing salt storage in ESSIV"; + ti->error = PFX "Error kmallocing salt storage in ESSIV"; crypto_free_tfm(hash_tfm); return -ENOMEM; } @@ -159,20 +173,20 @@ static int crypt_iv_essiv_ctr(struct crypt_config *cc, struct dm_target *ti, CRYPTO_TFM_MODE_ECB | CRYPTO_TFM_REQ_MAY_SLEEP); if (essiv_tfm == NULL) { - ti->error = "Error allocating crypto tfm for ESSIV"; + ti->error = PFX "Error allocating crypto tfm for ESSIV"; kfree(salt); return -EINVAL; } if (crypto_tfm_alg_blocksize(essiv_tfm) != crypto_tfm_alg_ivsize(cc->tfm)) { - ti->error = "Block size of ESSIV cipher does " + ti->error = PFX "Block size of ESSIV cipher does " "not match IV size of block cipher"; crypto_free_tfm(essiv_tfm); kfree(salt); return -EINVAL; } if (crypto_cipher_setkey(essiv_tfm, salt, saltsize) < 0) { - ti->error = "Failed to set key for ESSIV cipher"; + ti->error = PFX "Failed to set key for ESSIV cipher"; crypto_free_tfm(essiv_tfm); kfree(salt); return -EINVAL; @@ -518,10 +532,9 @@ static int crypt_ctr(struct dm_target *ti, unsigned int argc, char **argv) char *ivopts; unsigned int crypto_flags; unsigned int key_size; - unsigned long long tmpll; if (argc != 5) { - ti->error = "Not enough arguments"; + ti->error = PFX "Not enough arguments"; return -EINVAL; } @@ -532,21 +545,21 @@ static int crypt_ctr(struct dm_target *ti, unsigned int argc, char **argv) ivmode = strsep(&ivopts, ":"); if (tmp) - DMWARN("Unexpected additional cipher options"); + DMWARN(PFX "Unexpected additional cipher options"); key_size = strlen(argv[1]) >> 1; cc = kmalloc(sizeof(*cc) + key_size * sizeof(u8), GFP_KERNEL); if (cc == NULL) { ti->error = - "Cannot allocate transparent encryption context"; + PFX "Cannot allocate transparent encryption context"; return -ENOMEM; } cc->key_size = key_size; if ((!key_size && strcmp(argv[1], "-") != 0) || (key_size && crypt_decode_key(cc->key, argv[1], key_size) < 0)) { - ti->error = "Error decoding key"; + ti->error = PFX "Error decoding key"; goto bad1; } @@ -562,22 +575,22 @@ static int crypt_ctr(struct dm_target *ti, unsigned int argc, char **argv) else if (strcmp(chainmode, "ecb") == 0) crypto_flags = CRYPTO_TFM_MODE_ECB; else { - ti->error = "Unknown chaining mode"; + ti->error = PFX "Unknown chaining mode"; goto bad1; } if (crypto_flags != CRYPTO_TFM_MODE_ECB && !ivmode) { - ti->error = "This chaining mode requires an IV mechanism"; + ti->error = PFX "This chaining mode requires an IV mechanism"; goto bad1; } tfm = crypto_alloc_tfm(cipher, crypto_flags | CRYPTO_TFM_REQ_MAY_SLEEP); if (!tfm) { - ti->error = "Error allocating crypto tfm"; + ti->error = PFX "Error allocating crypto tfm"; goto bad1; } if (crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_CIPHER) { - ti->error = "Expected cipher algorithm"; + ti->error = PFX "Expected cipher algorithm"; goto bad2; } @@ -595,7 +608,7 @@ static int crypt_ctr(struct dm_target *ti, unsigned int argc, char **argv) else if (strcmp(ivmode, "essiv") == 0) cc->iv_gen_ops = &crypt_iv_essiv_ops; else { - ti->error = "Invalid IV mode"; + ti->error = PFX "Invalid IV mode"; goto bad2; } @@ -610,45 +623,45 @@ static int crypt_ctr(struct dm_target *ti, unsigned int argc, char **argv) else { cc->iv_size = 0; if (cc->iv_gen_ops) { - DMWARN("Selected cipher does not support IVs"); + DMWARN(PFX "Selected cipher does not support IVs"); if (cc->iv_gen_ops->dtr) cc->iv_gen_ops->dtr(cc); cc->iv_gen_ops = NULL; } } - cc->io_pool = mempool_create_slab_pool(MIN_IOS, _crypt_io_pool); + cc->io_pool = mempool_create(MIN_IOS, mempool_alloc_slab, + mempool_free_slab, _crypt_io_pool); if (!cc->io_pool) { - ti->error = "Cannot allocate crypt io mempool"; + ti->error = PFX "Cannot allocate crypt io mempool"; goto bad3; } - cc->page_pool = mempool_create_page_pool(MIN_POOL_PAGES, 0); + cc->page_pool = mempool_create(MIN_POOL_PAGES, mempool_alloc_page, + mempool_free_page, NULL); if (!cc->page_pool) { - ti->error = "Cannot allocate page mempool"; + ti->error = PFX "Cannot allocate page mempool"; goto bad4; } if (tfm->crt_cipher.cit_setkey(tfm, cc->key, key_size) < 0) { - ti->error = "Error setting key"; + ti->error = PFX "Error setting key"; goto bad5; } - if (sscanf(argv[2], "%llu", &tmpll) != 1) { - ti->error = "Invalid iv_offset sector"; + if (sscanf(argv[2], SECTOR_FORMAT, &cc->iv_offset) != 1) { + ti->error = PFX "Invalid iv_offset sector"; goto bad5; } - cc->iv_offset = tmpll; - if (sscanf(argv[4], "%llu", &tmpll) != 1) { - ti->error = "Invalid device sector"; + if (sscanf(argv[4], SECTOR_FORMAT, &cc->start) != 1) { + ti->error = PFX "Invalid device sector"; goto bad5; } - cc->start = tmpll; if (dm_get_device(ti, argv[3], cc->start, ti->len, dm_table_get_mode(ti->table), &cc->dev)) { - ti->error = "Device lookup failed"; + ti->error = PFX "Device lookup failed"; goto bad5; } @@ -657,7 +670,7 @@ static int crypt_ctr(struct dm_target *ti, unsigned int argc, char **argv) *(ivopts - 1) = ':'; cc->iv_mode = kmalloc(strlen(ivmode) + 1, GFP_KERNEL); if (!cc->iv_mode) { - ti->error = "Error kmallocing iv_mode string"; + ti->error = PFX "Error kmallocing iv_mode string"; goto bad5; } strcpy(cc->iv_mode, ivmode); @@ -890,8 +903,8 @@ static int crypt_status(struct dm_target *ti, status_type_t type, result[sz++] = '-'; } - DMEMIT(" %llu %s %llu", (unsigned long long)cc->iv_offset, - cc->dev->name, (unsigned long long)cc->start); + DMEMIT(" " SECTOR_FORMAT " %s " SECTOR_FORMAT, + cc->iv_offset, cc->dev->name, cc->start); break; } return 0; @@ -920,13 +933,13 @@ static int __init dm_crypt_init(void) _kcryptd_workqueue = create_workqueue("kcryptd"); if (!_kcryptd_workqueue) { r = -ENOMEM; - DMERR("couldn't create kcryptd"); + DMERR(PFX "couldn't create kcryptd"); goto bad1; } r = dm_register_target(&crypt_target); if (r < 0) { - DMERR("register failed %d", r); + DMERR(PFX "register failed %d", r); goto bad2; } @@ -944,7 +957,7 @@ static void __exit dm_crypt_exit(void) int r = dm_unregister_target(&crypt_target); if (r < 0) - DMERR("unregister failed %d", r); + DMERR(PFX "unregister failed %d", r); destroy_workqueue(_kcryptd_workqueue); kmem_cache_destroy(_crypt_io_pool); diff --git a/drivers/md/dm-emc.c b/drivers/md/dm-emc.c index 2a374ccb3..c7067674d 100644 --- a/drivers/md/dm-emc.c +++ b/drivers/md/dm-emc.c @@ -12,8 +12,6 @@ #include #include -#define DM_MSG_PREFIX "multipath emc" - struct emc_handler { spinlock_t lock; @@ -68,7 +66,7 @@ static struct bio *get_failover_bio(struct path *path, unsigned data_size) bio = bio_alloc(GFP_ATOMIC, 1); if (!bio) { - DMERR("get_failover_bio: bio_alloc() failed."); + DMERR("dm-emc: get_failover_bio: bio_alloc() failed."); return NULL; } @@ -80,13 +78,13 @@ static struct bio *get_failover_bio(struct path *path, unsigned data_size) page = alloc_page(GFP_ATOMIC); if (!page) { - DMERR("get_failover_bio: alloc_page() failed."); + DMERR("dm-emc: get_failover_bio: alloc_page() failed."); bio_put(bio); return NULL; } if (bio_add_page(bio, page, data_size, 0) != data_size) { - DMERR("get_failover_bio: alloc_page() failed."); + DMERR("dm-emc: get_failover_bio: alloc_page() failed."); __free_page(page); bio_put(bio); return NULL; @@ -105,7 +103,7 @@ static struct request *get_failover_req(struct emc_handler *h, /* FIXME: Figure out why it fails with GFP_ATOMIC. */ rq = blk_get_request(q, WRITE, __GFP_WAIT); if (!rq) { - DMERR("get_failover_req: blk_get_request failed"); + DMERR("dm-emc: get_failover_req: blk_get_request failed"); return NULL; } @@ -162,7 +160,7 @@ static struct request *emc_trespass_get(struct emc_handler *h, bio = get_failover_bio(path, data_size); if (!bio) { - DMERR("emc_trespass_get: no bio"); + DMERR("dm-emc: emc_trespass_get: no bio"); return NULL; } @@ -175,7 +173,7 @@ static struct request *emc_trespass_get(struct emc_handler *h, /* get request for block layer packet command */ rq = get_failover_req(h, bio, path); if (!rq) { - DMERR("emc_trespass_get: no rq"); + DMERR("dm-emc: emc_trespass_get: no rq"); free_bio(bio); return NULL; } @@ -202,18 +200,18 @@ static void emc_pg_init(struct hw_handler *hwh, unsigned bypassed, * initial state passed into us and then get an update here. */ if (!q) { - DMINFO("emc_pg_init: no queue"); + DMINFO("dm-emc: emc_pg_init: no queue"); goto fail_path; } /* FIXME: The request should be pre-allocated. */ rq = emc_trespass_get(hwh->context, path); if (!rq) { - DMERR("emc_pg_init: no rq"); + DMERR("dm-emc: emc_pg_init: no rq"); goto fail_path; } - DMINFO("emc_pg_init: sending switch-over command"); + DMINFO("dm-emc: emc_pg_init: sending switch-over command"); elv_add_request(q, rq, ELEVATOR_INSERT_FRONT, 1); return; @@ -243,18 +241,18 @@ static int emc_create(struct hw_handler *hwh, unsigned argc, char **argv) hr = 0; short_trespass = 0; } else if (argc != 2) { - DMWARN("incorrect number of arguments"); + DMWARN("dm-emc hwhandler: incorrect number of arguments"); return -EINVAL; } else { if ((sscanf(argv[0], "%u", &short_trespass) != 1) || (short_trespass > 1)) { - DMWARN("invalid trespass mode selected"); + DMWARN("dm-emc: invalid trespass mode selected"); return -EINVAL; } if ((sscanf(argv[1], "%u", &hr) != 1) || (hr > 1)) { - DMWARN("invalid honor reservation flag selected"); + DMWARN("dm-emc: invalid honor reservation flag selected"); return -EINVAL; } } @@ -266,14 +264,14 @@ static int emc_create(struct hw_handler *hwh, unsigned argc, char **argv) hwh->context = h; if ((h->short_trespass = short_trespass)) - DMWARN("short trespass command will be send"); + DMWARN("dm-emc: short trespass command will be send"); else - DMWARN("long trespass command will be send"); + DMWARN("dm-emc: long trespass command will be send"); if ((h->hr = hr)) - DMWARN("honor reservation bit will be set"); + DMWARN("dm-emc: honor reservation bit will be set"); else - DMWARN("honor reservation bit will not be set (default)"); + DMWARN("dm-emc: honor reservation bit will not be set (default)"); return 0; } @@ -338,9 +336,9 @@ static int __init dm_emc_init(void) int r = dm_register_hw_handler(&emc_hwh); if (r < 0) - DMERR("register failed %d", r); + DMERR("emc: register failed %d", r); - DMINFO("version 0.0.3 loaded"); + DMINFO("dm-emc version 0.0.3 loaded"); return r; } @@ -350,7 +348,7 @@ static void __exit dm_emc_exit(void) int r = dm_unregister_hw_handler(&emc_hwh); if (r < 0) - DMERR("unregister failed %d", r); + DMERR("emc: unregister failed %d", r); } module_init(dm_emc_init); diff --git a/drivers/md/dm-exception-store.c b/drivers/md/dm-exception-store.c index d12379b5c..ab8756a40 100644 --- a/drivers/md/dm-exception-store.c +++ b/drivers/md/dm-exception-store.c @@ -16,8 +16,6 @@ #include #include -#define DM_MSG_PREFIX "snapshots" - /*----------------------------------------------------------------- * Persistent snapshots, by persistent we mean that the snapshot * will survive a reboot. @@ -519,6 +517,16 @@ static void persistent_commit(struct exception_store *store, if (r) ps->valid = 0; + /* + * Have we completely filled the current area ? + */ + if (ps->current_committed == ps->exceptions_per_area) { + ps->current_committed = 0; + r = zero_area(ps, ps->current_area + 1); + if (r) + ps->valid = 0; + } + for (i = 0; i < ps->callback_count; i++) { cb = ps->callbacks + i; cb->callback(cb->context, r == 0 ? 1 : 0); @@ -526,16 +534,6 @@ static void persistent_commit(struct exception_store *store, ps->callback_count = 0; } - - /* - * Have we completely filled the current area ? - */ - if (ps->current_committed == ps->exceptions_per_area) { - ps->current_committed = 0; - r = zero_area(ps, ps->current_area + 1); - if (r) - ps->valid = 0; - } } static void persistent_drop(struct exception_store *store) diff --git a/drivers/md/dm-hw-handler.c b/drivers/md/dm-hw-handler.c index baafaaba4..4cc0010e0 100644 --- a/drivers/md/dm-hw-handler.c +++ b/drivers/md/dm-hw-handler.c @@ -83,7 +83,8 @@ void dm_put_hw_handler(struct hw_handler_type *hwht) if (--hwhi->use == 0) module_put(hwhi->hwht.module); - BUG_ON(hwhi->use < 0); + if (hwhi->use < 0) + BUG(); out: up_read(&_hwh_lock); diff --git a/drivers/md/dm-io.c b/drivers/md/dm-io.c index da663d2ff..4809b209f 100644 --- a/drivers/md/dm-io.c +++ b/drivers/md/dm-io.c @@ -32,6 +32,16 @@ struct io { static unsigned _num_ios; static mempool_t *_io_pool; +static void *alloc_io(gfp_t gfp_mask, void *pool_data) +{ + return kmalloc(sizeof(struct io), gfp_mask); +} + +static void free_io(void *element, void *pool_data) +{ + kfree(element); +} + static unsigned int pages_to_ios(unsigned int pages) { return 4 * pages; /* too many ? */ @@ -55,8 +65,7 @@ static int resize_pool(unsigned int new_ios) } else { /* create new pool */ - _io_pool = mempool_create_kmalloc_pool(new_ios, - sizeof(struct io)); + _io_pool = mempool_create(new_ios, alloc_io, free_io, NULL); if (!_io_pool) return -ENOMEM; diff --git a/drivers/md/dm-ioctl.c b/drivers/md/dm-ioctl.c index d13bb15a8..442e2be60 100644 --- a/drivers/md/dm-ioctl.c +++ b/drivers/md/dm-ioctl.c @@ -1,6 +1,6 @@ /* * Copyright (C) 2001, 2002 Sistina Software (UK) Limited. - * Copyright (C) 2004 - 2006 Red Hat, Inc. All rights reserved. + * Copyright (C) 2004 - 2005 Red Hat, Inc. All rights reserved. * * This file is released under the GPL. */ @@ -13,12 +13,11 @@ #include #include #include +#include #include -#include #include -#define DM_MSG_PREFIX "ioctl" #define DM_DRIVER_EMAIL "dm-devel@redhat.com" /*----------------------------------------------------------------- @@ -48,7 +47,7 @@ struct vers_iter { static struct list_head _name_buckets[NUM_BUCKETS]; static struct list_head _uuid_buckets[NUM_BUCKETS]; -static void dm_hash_remove_all(int keep_open_devices); +static void dm_hash_remove_all(void); /* * Guards access to both hash tables. @@ -67,12 +66,14 @@ static int dm_hash_init(void) { init_buckets(_name_buckets); init_buckets(_uuid_buckets); + devfs_mk_dir(DM_DIR); return 0; } static void dm_hash_exit(void) { - dm_hash_remove_all(0); + dm_hash_remove_all(); + devfs_remove(DM_DIR); } /*----------------------------------------------------------------- @@ -100,10 +101,8 @@ static struct hash_cell *__get_name_cell(const char *str) unsigned int h = hash_str(str); list_for_each_entry (hc, _name_buckets + h, name_list) - if (!strcmp(hc->name, str)) { - dm_get(hc->md); + if (!strcmp(hc->name, str)) return hc; - } return NULL; } @@ -114,10 +113,8 @@ static struct hash_cell *__get_uuid_cell(const char *str) unsigned int h = hash_str(str); list_for_each_entry (hc, _uuid_buckets + h, uuid_list) - if (!strcmp(hc->uuid, str)) { - dm_get(hc->md); + if (!strcmp(hc->uuid, str)) return hc; - } return NULL; } @@ -168,13 +165,32 @@ static void free_cell(struct hash_cell *hc) } } +/* + * devfs stuff. + */ +static int register_with_devfs(struct hash_cell *hc) +{ + struct gendisk *disk = dm_disk(hc->md); + + devfs_mk_bdev(MKDEV(disk->major, disk->first_minor), + S_IFBLK | S_IRUSR | S_IWUSR | S_IRGRP, + DM_DIR "/%s", hc->name); + return 0; +} + +static int unregister_with_devfs(struct hash_cell *hc) +{ + devfs_remove(DM_DIR"/%s", hc->name); + return 0; +} + /* * The kdev_t and uuid of a device can never change once it is * initially inserted. */ static int dm_hash_insert(const char *name, const char *uuid, struct mapped_device *md) { - struct hash_cell *cell, *hc; + struct hash_cell *cell; /* * Allocate the new cells. @@ -187,23 +203,19 @@ static int dm_hash_insert(const char *name, const char *uuid, struct mapped_devi * Insert the cell into both hash tables. */ down_write(&_hash_lock); - hc = __get_name_cell(name); - if (hc) { - dm_put(hc->md); + if (__get_name_cell(name)) goto bad; - } list_add(&cell->name_list, _name_buckets + hash_str(name)); if (uuid) { - hc = __get_uuid_cell(uuid); - if (hc) { + if (__get_uuid_cell(uuid)) { list_del(&cell->name_list); - dm_put(hc->md); goto bad; } list_add(&cell->uuid_list, _uuid_buckets + hash_str(uuid)); } + register_with_devfs(cell); dm_get(md); dm_set_mdptr(md, cell); up_write(&_hash_lock); @@ -223,6 +235,7 @@ static void __hash_remove(struct hash_cell *hc) /* remove from the dev hash */ list_del(&hc->uuid_list); list_del(&hc->name_list); + unregister_with_devfs(hc); dm_set_mdptr(hc->md, NULL); table = dm_get_table(hc->md); @@ -231,47 +244,25 @@ static void __hash_remove(struct hash_cell *hc) dm_table_put(table); } + dm_put(hc->md); if (hc->new_map) dm_table_put(hc->new_map); - dm_put(hc->md); free_cell(hc); } -static void dm_hash_remove_all(int keep_open_devices) +static void dm_hash_remove_all(void) { - int i, dev_skipped, dev_removed; + int i; struct hash_cell *hc; struct list_head *tmp, *n; down_write(&_hash_lock); - -retry: - dev_skipped = dev_removed = 0; for (i = 0; i < NUM_BUCKETS; i++) { list_for_each_safe (tmp, n, _name_buckets + i) { hc = list_entry(tmp, struct hash_cell, name_list); - - if (keep_open_devices && - dm_lock_for_deletion(hc->md)) { - dev_skipped++; - continue; - } __hash_remove(hc); - dev_removed = 1; } } - - /* - * Some mapped devices may be using other mapped devices, so if any - * still exist, repeat until we make no further progress. - */ - if (dev_skipped) { - if (dev_removed) - goto retry; - - DMWARN("remove_all left %d open device(s)", dev_skipped); - } - up_write(&_hash_lock); } @@ -297,7 +288,6 @@ static int dm_hash_rename(const char *old, const char *new) if (hc) { DMWARN("asked to rename to an already existing name %s -> %s", old, new); - dm_put(hc->md); up_write(&_hash_lock); kfree(new_name); return -EBUSY; @@ -318,11 +308,16 @@ static int dm_hash_rename(const char *old, const char *new) /* * rename and move the name cell. */ + unregister_with_devfs(hc); + list_del(&hc->name_list); old_name = hc->name; hc->name = new_name; list_add(&hc->name_list, _name_buckets + hash_str(new_name)); + /* rename the device node in devfs */ + register_with_devfs(hc); + /* * Wake up any dm event waiters. */ @@ -332,7 +327,6 @@ static int dm_hash_rename(const char *old, const char *new) dm_table_put(table); } - dm_put(hc->md); up_write(&_hash_lock); kfree(old_name); return 0; @@ -349,7 +343,7 @@ typedef int (*ioctl_fn)(struct dm_ioctl *param, size_t param_size); static int remove_all(struct dm_ioctl *param, size_t param_size) { - dm_hash_remove_all(1); + dm_hash_remove_all(); param->data_size = 0; return 0; } @@ -529,6 +523,7 @@ static int __dev_status(struct mapped_device *md, struct dm_ioctl *param) { struct gendisk *disk = dm_disk(md); struct dm_table *table; + struct block_device *bdev; param->flags &= ~(DM_SUSPEND_FLAG | DM_READONLY_FLAG | DM_ACTIVE_PRESENT_FLAG); @@ -538,12 +533,20 @@ static int __dev_status(struct mapped_device *md, struct dm_ioctl *param) param->dev = huge_encode_dev(MKDEV(disk->major, disk->first_minor)); - /* - * Yes, this will be out of date by the time it gets back - * to userland, but it is still very useful for - * debugging. - */ - param->open_count = dm_open_count(md); + if (!(param->flags & DM_SKIP_BDGET_FLAG)) { + bdev = bdget_disk(disk, 0); + if (!bdev) + return -ENXIO; + + /* + * Yes, this will be out of date by the time it gets back + * to userland, but it is still very useful for + * debugging. + */ + param->open_count = bdev->bd_openers; + bdput(bdev); + } else + param->open_count = -1; if (disk->policy) param->flags |= DM_READONLY_FLAG; @@ -563,7 +566,7 @@ static int __dev_status(struct mapped_device *md, struct dm_ioctl *param) static int dev_create(struct dm_ioctl *param, size_t param_size) { - int r, m = DM_ANY_MINOR; + int r; struct mapped_device *md; r = check_name(param->name); @@ -571,9 +574,10 @@ static int dev_create(struct dm_ioctl *param, size_t param_size) return r; if (param->flags & DM_PERSISTENT_DEV_FLAG) - m = MINOR(huge_decode_dev(param->dev)); + r = dm_create_with_minor(MINOR(huge_decode_dev(param->dev)), &md); + else + r = dm_create(&md); - r = dm_create(m, &md); if (r) return r; @@ -596,20 +600,12 @@ static int dev_create(struct dm_ioctl *param, size_t param_size) */ static struct hash_cell *__find_device_hash_cell(struct dm_ioctl *param) { - struct mapped_device *md; - void *mdptr = NULL; - if (*param->uuid) return __get_uuid_cell(param->uuid); - - if (*param->name) + else if (*param->name) return __get_name_cell(param->name); - - md = dm_get_md(huge_decode_dev(param->dev)); - if (md) - mdptr = dm_get_mdptr(md); - - return mdptr; + else + return dm_get_mdptr(huge_decode_dev(param->dev)); } static struct mapped_device *find_device(struct dm_ioctl *param) @@ -621,6 +617,7 @@ static struct mapped_device *find_device(struct dm_ioctl *param) hc = __find_device_hash_cell(param); if (hc) { md = hc->md; + dm_get(md); /* * Sneakily write in both the name and the uuid @@ -645,8 +642,6 @@ static struct mapped_device *find_device(struct dm_ioctl *param) static int dev_remove(struct dm_ioctl *param, size_t param_size) { struct hash_cell *hc; - struct mapped_device *md; - int r; down_write(&_hash_lock); hc = __find_device_hash_cell(param); @@ -657,22 +652,8 @@ static int dev_remove(struct dm_ioctl *param, size_t param_size) return -ENXIO; } - md = hc->md; - - /* - * Ensure the device is not open and nothing further can open it. - */ - r = dm_lock_for_deletion(md); - if (r) { - DMWARN("unable to remove open device %s", hc->name); - up_write(&_hash_lock); - dm_put(md); - return r; - } - __hash_remove(hc); up_write(&_hash_lock); - dm_put(md); param->data_size = 0; return 0; } @@ -709,54 +690,6 @@ static int dev_rename(struct dm_ioctl *param, size_t param_size) return dm_hash_rename(param->name, new_name); } -static int dev_set_geometry(struct dm_ioctl *param, size_t param_size) -{ - int r = -EINVAL, x; - struct mapped_device *md; - struct hd_geometry geometry; - unsigned long indata[4]; - char *geostr = (char *) param + param->data_start; - - md = find_device(param); - if (!md) - return -ENXIO; - - if (geostr < (char *) (param + 1) || - invalid_str(geostr, (void *) param + param_size)) { - DMWARN("Invalid geometry supplied."); - goto out; - } - - x = sscanf(geostr, "%lu %lu %lu %lu", indata, - indata + 1, indata + 2, indata + 3); - - if (x != 4) { - DMWARN("Unable to interpret geometry settings."); - goto out; - } - - if (indata[0] > 65535 || indata[1] > 255 || - indata[2] > 255 || indata[3] > ULONG_MAX) { - DMWARN("Geometry exceeds range limits."); - goto out; - } - - geometry.cylinders = indata[0]; - geometry.heads = indata[1]; - geometry.sectors = indata[2]; - geometry.start = indata[3]; - - r = dm_set_geometry(md, &geometry); - if (!r) - r = __dev_status(md, param); - - param->data_size = 0; - -out: - dm_put(md); - return r; -} - static int do_suspend(struct dm_ioctl *param) { int r = 0; @@ -798,6 +731,7 @@ static int do_resume(struct dm_ioctl *param) } md = hc->md; + dm_get(md); new_map = hc->new_map; hc->new_map = NULL; @@ -1041,43 +975,33 @@ static int table_load(struct dm_ioctl *param, size_t param_size) int r; struct hash_cell *hc; struct dm_table *t; - struct mapped_device *md; - md = find_device(param); - if (!md) - return -ENXIO; - - r = dm_table_create(&t, get_mode(param), param->target_count, md); + r = dm_table_create(&t, get_mode(param), param->target_count); if (r) - goto out; + return r; r = populate_table(t, param, param_size); if (r) { dm_table_put(t); - goto out; + return r; } down_write(&_hash_lock); - hc = dm_get_mdptr(md); - if (!hc || hc->md != md) { - DMWARN("device has been removed from the dev hash table."); - dm_table_put(t); + hc = __find_device_hash_cell(param); + if (!hc) { + DMWARN("device doesn't appear to be in the dev hash table."); up_write(&_hash_lock); - r = -ENXIO; - goto out; + dm_table_put(t); + return -ENXIO; } if (hc->new_map) dm_table_put(hc->new_map); hc->new_map = t; - up_write(&_hash_lock); - param->flags |= DM_INACTIVE_PRESENT_FLAG; - r = __dev_status(md, param); - -out: - dm_put(md); + r = __dev_status(hc->md, param); + up_write(&_hash_lock); return r; } @@ -1085,7 +1009,6 @@ static int table_clear(struct dm_ioctl *param, size_t param_size) { int r; struct hash_cell *hc; - struct mapped_device *md; down_write(&_hash_lock); @@ -1104,9 +1027,7 @@ static int table_clear(struct dm_ioctl *param, size_t param_size) param->flags &= ~DM_INACTIVE_PRESENT_FLAG; r = __dev_status(hc->md, param); - md = hc->md; up_write(&_hash_lock); - dm_put(md); return r; } @@ -1293,8 +1214,7 @@ static ioctl_fn lookup_ioctl(unsigned int cmd) {DM_LIST_VERSIONS_CMD, list_versions}, - {DM_TARGET_MSG_CMD, target_message}, - {DM_DEV_SET_GEOMETRY_CMD, dev_set_geometry} + {DM_TARGET_MSG_CMD, target_message} }; return (cmd >= ARRAY_SIZE(_ioctls)) ? NULL : _ioctls[cmd].fn; @@ -1472,6 +1392,7 @@ static struct file_operations _ctl_fops = { static struct miscdevice _dm_misc = { .minor = MISC_DYNAMIC_MINOR, .name = DM_NAME, + .devfs_name = "mapper/control", .fops = &_ctl_fops }; diff --git a/drivers/md/dm-linear.c b/drivers/md/dm-linear.c index 47b3c62bb..6a2cd5dc8 100644 --- a/drivers/md/dm-linear.c +++ b/drivers/md/dm-linear.c @@ -12,8 +12,6 @@ #include #include -#define DM_MSG_PREFIX "linear" - /* * Linear: maps a linear range of a device. */ @@ -28,10 +26,9 @@ struct linear_c { static int linear_ctr(struct dm_target *ti, unsigned int argc, char **argv) { struct linear_c *lc; - unsigned long long tmp; if (argc != 2) { - ti->error = "Invalid argument count"; + ti->error = "dm-linear: Invalid argument count"; return -EINVAL; } @@ -41,11 +38,10 @@ static int linear_ctr(struct dm_target *ti, unsigned int argc, char **argv) return -ENOMEM; } - if (sscanf(argv[1], "%llu", &tmp) != 1) { + if (sscanf(argv[1], SECTOR_FORMAT, &lc->start) != 1) { ti->error = "dm-linear: Invalid device sector"; goto bad; } - lc->start = tmp; if (dm_get_device(ti, argv[0], lc->start, ti->len, dm_table_get_mode(ti->table), &lc->dev)) { @@ -91,8 +87,8 @@ static int linear_status(struct dm_target *ti, status_type_t type, break; case STATUSTYPE_TABLE: - snprintf(result, maxlen, "%s %llu", lc->dev->name, - (unsigned long long)lc->start); + snprintf(result, maxlen, "%s " SECTOR_FORMAT, lc->dev->name, + lc->start); break; } return 0; @@ -113,7 +109,7 @@ int __init dm_linear_init(void) int r = dm_register_target(&linear_target); if (r < 0) - DMERR("register failed %d", r); + DMERR("linear: register failed %d", r); return r; } @@ -123,5 +119,5 @@ void dm_linear_exit(void) int r = dm_unregister_target(&linear_target); if (r < 0) - DMERR("unregister failed %d", r); + DMERR("linear: unregister failed %d", r); } diff --git a/drivers/md/dm-log.c b/drivers/md/dm-log.c index 5a110fcc7..d73779a42 100644 --- a/drivers/md/dm-log.c +++ b/drivers/md/dm-log.c @@ -12,8 +12,6 @@ #include "dm-log.h" #include "dm-io.h" -#define DM_MSG_PREFIX "mirror log" - static LIST_HEAD(_log_types); static DEFINE_SPINLOCK(_lock); @@ -32,8 +30,7 @@ int dm_unregister_dirty_log_type(struct dirty_log_type *type) spin_lock(&_lock); if (type->use_count) - DMWARN("Unregister failed: log type '%s' still in use", - type->name); + DMWARN("Attempt to unregister a log type that is still in use"); else list_del(&type->list); @@ -139,7 +136,7 @@ struct log_c { unsigned bitset_uint32_count; uint32_t *clean_bits; uint32_t *sync_bits; - uint32_t *recovering_bits; + uint32_t *recovering_bits; /* FIXME: this seems excessive */ int sync_search; @@ -150,17 +147,16 @@ struct log_c { FORCESYNC, /* Force a sync to happen */ } sync; - int failure_response; - /* * Disk log fields */ - int log_dev_failed; struct dm_dev *log_dev; struct log_header header; struct io_region header_location; struct log_header *disk_header; + + struct io_region bits_location; }; /* @@ -244,40 +240,58 @@ static inline int write_header(struct log_c *log) log->disk_header, &ebits); } +/*---------------------------------------------------------------- + * Bits IO + *--------------------------------------------------------------*/ +static int read_bits(struct log_c *log) +{ + int r; + unsigned long ebits; + + r = dm_io_sync_vm(1, &log->bits_location, READ, + log->clean_bits, &ebits); + if (r) + return r; + + return 0; +} + +static int write_bits(struct log_c *log) +{ + unsigned long ebits; + return dm_io_sync_vm(1, &log->bits_location, WRITE, + log->clean_bits, &ebits); +} + /*---------------------------------------------------------------- * core log constructor/destructor * - * argv contains 1 - 3 arguments: - * [[no]sync] [block_on_error] + * argv contains region_size followed optionally by [no]sync *--------------------------------------------------------------*/ #define BYTE_SHIFT 3 -static int create_log_context(struct dirty_log *log, struct dm_target *ti, - unsigned int argc, char **argv, - struct dm_dev *dev) +static int core_ctr(struct dirty_log *log, struct dm_target *ti, + unsigned int argc, char **argv) { - int i; enum sync sync = DEFAULTSYNC; - int failure_response = DMLOG_IOERR_IGNORE; + struct log_c *lc; uint32_t region_size; unsigned int region_count; - size_t bitset_size, buf_size; + size_t bitset_size; - if (argc < 1 || argc > 3) { + if (argc < 1 || argc > 2) { DMWARN("wrong number of arguments to mirror log"); return -EINVAL; } - for (i = 1; i < argc; i++) { - if (!strcmp(argv[i], "sync")) + if (argc > 1) { + if (!strcmp(argv[1], "sync")) sync = FORCESYNC; - else if (!strcmp(argv[i], "nosync")) + else if (!strcmp(argv[1], "nosync")) sync = NOSYNC; - else if (!strcmp(argv[i], "block_on_error")) - failure_response = DMLOG_IOERR_BLOCK; else { DMWARN("unrecognised sync argument to mirror log: %s", - argv[i]); + argv[1]); return -EINVAL; } } @@ -300,60 +314,27 @@ static int create_log_context(struct dirty_log *log, struct dm_target *ti, lc->region_size = region_size; lc->region_count = region_count; lc->sync = sync; - lc->failure_response = failure_response; /* * Work out how many "unsigned long"s we need to hold the bitset. */ bitset_size = dm_round_up(region_count, - sizeof(*lc->clean_bits) << BYTE_SHIFT); + sizeof(unsigned long) << BYTE_SHIFT); bitset_size >>= BYTE_SHIFT; - lc->bitset_uint32_count = bitset_size / sizeof(*lc->clean_bits); - - /* - * Disk log? - */ - if (!dev) { - lc->clean_bits = vmalloc(bitset_size); - if (!lc->clean_bits) { - DMWARN("couldn't allocate clean bitset"); - kfree(lc); - return -ENOMEM; - } - lc->disk_header = NULL; - } else { - lc->log_dev = dev; - lc->log_dev_failed = 0; - lc->header_location.bdev = lc->log_dev->bdev; - lc->header_location.sector = 0; - - /* - * Buffer holds both header and bitset. - */ - buf_size = dm_round_up((LOG_OFFSET << SECTOR_SHIFT) + - bitset_size, ti->limits.hardsect_size); - lc->header_location.count = buf_size >> SECTOR_SHIFT; - - lc->disk_header = vmalloc(buf_size); - if (!lc->disk_header) { - DMWARN("couldn't allocate disk log buffer"); - kfree(lc); - return -ENOMEM; - } - - lc->clean_bits = (void *)lc->disk_header + - (LOG_OFFSET << SECTOR_SHIFT); + lc->bitset_uint32_count = bitset_size / 4; + lc->clean_bits = vmalloc(bitset_size); + if (!lc->clean_bits) { + DMWARN("couldn't allocate clean bitset"); + kfree(lc); + return -ENOMEM; } - memset(lc->clean_bits, -1, bitset_size); lc->sync_bits = vmalloc(bitset_size); if (!lc->sync_bits) { DMWARN("couldn't allocate sync bitset"); - if (!dev) - vfree(lc->clean_bits); - vfree(lc->disk_header); + vfree(lc->clean_bits); kfree(lc); return -ENOMEM; } @@ -362,55 +343,41 @@ static int create_log_context(struct dirty_log *log, struct dm_target *ti, lc->recovering_bits = vmalloc(bitset_size); if (!lc->recovering_bits) { - DMWARN("couldn't allocate recovering bitset"); + DMWARN("couldn't allocate sync bitset"); vfree(lc->sync_bits); - if (!dev) - vfree(lc->clean_bits); - vfree(lc->disk_header); + vfree(lc->clean_bits); kfree(lc); return -ENOMEM; } memset(lc->recovering_bits, 0, bitset_size); lc->sync_search = 0; log->context = lc; - return 0; } -static int core_ctr(struct dirty_log *log, struct dm_target *ti, - unsigned int argc, char **argv) -{ - return create_log_context(log, ti, argc, argv, NULL); -} - -static void destroy_log_context(struct log_c *lc) -{ - vfree(lc->sync_bits); - vfree(lc->recovering_bits); - kfree(lc); -} - static void core_dtr(struct dirty_log *log) { struct log_c *lc = (struct log_c *) log->context; - vfree(lc->clean_bits); - destroy_log_context(lc); + vfree(lc->sync_bits); + vfree(lc->recovering_bits); + kfree(lc); } /*---------------------------------------------------------------- * disk log constructor/destructor * - * argv contains 2 - 4 arguments: - * [[no]sync] [block_on_error] + * argv contains log_device region_size followed optionally by [no]sync *--------------------------------------------------------------*/ static int disk_ctr(struct dirty_log *log, struct dm_target *ti, unsigned int argc, char **argv) { int r; + size_t size; + struct log_c *lc; struct dm_dev *dev; - if (argc < 2 || argc > 4) { + if (argc < 2 || argc > 3) { DMWARN("wrong number of arguments to disk mirror log"); return -EINVAL; } @@ -420,22 +387,49 @@ static int disk_ctr(struct dirty_log *log, struct dm_target *ti, if (r) return r; - r = create_log_context(log, ti, argc - 1, argv + 1, dev); + r = core_ctr(log, ti, argc - 1, argv + 1); if (r) { dm_put_device(ti, dev); return r; } + lc = (struct log_c *) log->context; + lc->log_dev = dev; + + /* setup the disk header fields */ + lc->header_location.bdev = lc->log_dev->bdev; + lc->header_location.sector = 0; + lc->header_location.count = 1; + + /* + * We can't read less than this amount, even though we'll + * not be using most of this space. + */ + lc->disk_header = vmalloc(1 << SECTOR_SHIFT); + if (!lc->disk_header) + goto bad; + + /* setup the disk bitset fields */ + lc->bits_location.bdev = lc->log_dev->bdev; + lc->bits_location.sector = LOG_OFFSET; + + size = dm_round_up(lc->bitset_uint32_count * sizeof(uint32_t), + 1 << SECTOR_SHIFT); + lc->bits_location.count = size >> SECTOR_SHIFT; return 0; + + bad: + dm_put_device(ti, lc->log_dev); + core_dtr(log); + return -ENOMEM; } static void disk_dtr(struct dirty_log *log) { struct log_c *lc = (struct log_c *) log->context; - dm_put_device(lc->ti, lc->log_dev); vfree(lc->disk_header); - destroy_log_context(lc); + core_dtr(log); } static int count_bits32(uint32_t *addr, unsigned size) @@ -448,21 +442,6 @@ static int count_bits32(uint32_t *addr, unsigned size) return count; } -static void fail_log_device(struct log_c *lc) -{ - if (lc->log_dev_failed) - return; - - lc->log_dev_failed = 1; - if (lc->failure_response == DMLOG_IOERR_BLOCK) - dm_table_event(lc->ti->table); -} - -static void restore_log_device(struct log_c *lc) -{ - lc->log_dev_failed = 0; -} - static int disk_resume(struct dirty_log *log) { int r; @@ -470,18 +449,17 @@ static int disk_resume(struct dirty_log *log) struct log_c *lc = (struct log_c *) log->context; size_t size = lc->bitset_uint32_count * sizeof(uint32_t); - /* - * Read the disk header, but only if we know it is good. - * Assume the worst in the event of failure. - */ - if (!lc->log_dev_failed && read_header(lc)) { - DMWARN("Failed to read header on mirror log device, %s", - lc->log_dev->name); - fail_log_device(lc); - lc->header.nr_regions = 0; - } + /* read the disk header */ + r = read_header(lc); + if (r) + return r; + + /* read the bits */ + r = read_bits(lc); + if (r) + return r; - /* set or clear any new bits -- device has grown */ + /* set or clear any new bits */ if (lc->sync == NOSYNC) for (i = lc->header.nr_regions; i < lc->region_count; i++) /* FIXME: amazingly inefficient */ @@ -491,28 +469,20 @@ static int disk_resume(struct dirty_log *log) /* FIXME: amazingly inefficient */ log_clear_bit(lc, lc->clean_bits, i); - /* clear any old bits -- device has shrunk */ - for (i = lc->region_count; i % (sizeof(*lc->clean_bits) << BYTE_SHIFT); i++) - log_clear_bit(lc, lc->clean_bits, i); - /* copy clean across to sync */ memcpy(lc->sync_bits, lc->clean_bits, size); lc->sync_count = count_bits32(lc->clean_bits, lc->bitset_uint32_count); - lc->sync_search = 0; + + /* write the bits */ + r = write_bits(lc); + if (r) + return r; /* set the correct number of regions in the header */ lc->header.nr_regions = lc->region_count; /* write the new header */ - r = write_header(lc); - if (r) { - DMWARN("Failed to write header on mirror log device, %s", - lc->log_dev->name); - fail_log_device(lc); - } else - restore_log_device(lc); - - return r; + return write_header(lc); } static uint32_t core_get_region_size(struct dirty_log *log) @@ -521,13 +491,6 @@ static uint32_t core_get_region_size(struct dirty_log *log) return lc->region_size; } -static int core_resume(struct dirty_log *log) -{ - struct log_c *lc = (struct log_c *) log->context; - lc->sync_search = 0; - return 0; -} - static int core_is_clean(struct dirty_log *log, region_t region) { struct log_c *lc = (struct log_c *) log->context; @@ -546,11 +509,6 @@ static int core_flush(struct dirty_log *log) return 0; } -static int disk_presuspend(struct dirty_log *log) -{ - return 0; -} - static int disk_flush(struct dirty_log *log) { int r; @@ -560,13 +518,10 @@ static int disk_flush(struct dirty_log *log) if (!lc->touched) return 0; - r = write_header(lc); - if (r) - fail_log_device(lc); - else { + r = write_bits(lc); + if (!r) lc->touched = 0; - restore_log_device(lc); - } + return r; } @@ -605,19 +560,16 @@ static int core_get_resync_work(struct dirty_log *log, region_t *region) return 1; } -static void core_set_region_sync(struct dirty_log *log, region_t region, - int in_sync) +static void core_complete_resync_work(struct dirty_log *log, region_t region, + int success) { struct log_c *lc = (struct log_c *) log->context; log_clear_bit(lc, lc->recovering_bits, region); - if (in_sync) { + if (success) { log_set_bit(lc, lc->sync_bits, region); lc->sync_count++; - } else if (log_test_bit(lc->sync_bits, region)) { - lc->sync_count--; - log_clear_bit(lc, lc->sync_bits, region); - } + } } static region_t core_get_sync_count(struct dirty_log *log) @@ -635,22 +587,16 @@ static int core_status(struct dirty_log *log, status_type_t status, char *result, unsigned int maxlen) { int sz = 0; - int params; struct log_c *lc = log->context; switch(status) { case STATUSTYPE_INFO: - DMEMIT("1 core"); break; case STATUSTYPE_TABLE: - params = (lc->sync == DEFAULTSYNC) ? 1 : 2; - params += (lc->failure_response == DMLOG_IOERR_BLOCK) ? 1 : 0; - - DMEMIT("%s %d %u ", log->type->name, params, lc->region_size); + DMEMIT("%s %u %u ", log->type->name, + lc->sync == DEFAULTSYNC ? 1 : 2, lc->region_size); DMEMIT_SYNC; - if (lc->failure_response == DMLOG_IOERR_BLOCK) - DMEMIT("block_on_error "); } return sz; @@ -660,44 +606,29 @@ static int disk_status(struct dirty_log *log, status_type_t status, char *result, unsigned int maxlen) { int sz = 0; - int params; + char buffer[16]; struct log_c *lc = log->context; switch(status) { case STATUSTYPE_INFO: - DMEMIT("3 disk %s %c", lc->log_dev->name, - lc->log_dev_failed ? 'D' : 'A'); break; case STATUSTYPE_TABLE: - params = (lc->sync == DEFAULTSYNC) ? 2 : 3; - params += (lc->failure_response == DMLOG_IOERR_BLOCK) ? 1 : 0; - - DMEMIT("%s %d %s %u ", log->type->name, - params, - lc->log_dev->name, + format_dev_t(buffer, lc->log_dev->bdev->bd_dev); + DMEMIT("%s %u %s %u ", log->type->name, + lc->sync == DEFAULTSYNC ? 2 : 3, buffer, lc->region_size); DMEMIT_SYNC; - if (lc->failure_response == DMLOG_IOERR_BLOCK) - DMEMIT("block_on_error "); } return sz; } -static int core_get_failure_response(struct dirty_log *log) -{ - struct log_c *lc = log->context; - - return lc->failure_response; -} - static struct dirty_log_type _core_type = { .name = "core", .module = THIS_MODULE, .ctr = core_ctr, .dtr = core_dtr, - .resume = core_resume, .get_region_size = core_get_region_size, .is_clean = core_is_clean, .in_sync = core_in_sync, @@ -705,10 +636,9 @@ static struct dirty_log_type _core_type = { .mark_region = core_mark_region, .clear_region = core_clear_region, .get_resync_work = core_get_resync_work, - .set_region_sync = core_set_region_sync, + .complete_resync_work = core_complete_resync_work, .get_sync_count = core_get_sync_count, .status = core_status, - .get_failure_response = core_get_failure_response, }; static struct dirty_log_type _disk_type = { @@ -716,8 +646,7 @@ static struct dirty_log_type _disk_type = { .module = THIS_MODULE, .ctr = disk_ctr, .dtr = disk_dtr, - .presuspend = disk_presuspend, - .postsuspend = disk_flush, + .suspend = disk_flush, .resume = disk_resume, .get_region_size = core_get_region_size, .is_clean = core_is_clean, @@ -726,10 +655,9 @@ static struct dirty_log_type _disk_type = { .mark_region = core_mark_region, .clear_region = core_clear_region, .get_resync_work = core_get_resync_work, - .set_region_sync = core_set_region_sync, + .complete_resync_work = core_complete_resync_work, .get_sync_count = core_get_sync_count, .status = disk_status, - .get_failure_response = core_get_failure_response, }; int __init dm_dirty_log_init(void) diff --git a/drivers/md/dm-log.h b/drivers/md/dm-log.h index baeca8e82..5ae5309eb 100644 --- a/drivers/md/dm-log.h +++ b/drivers/md/dm-log.h @@ -9,15 +9,6 @@ #include "dm.h" -/* - * Values returned by get_failure_response() - * DMLOG_IOERR_IGNORE: ignore device failures - * DMLOG_IOERR_BLOCK: issue dm event, and do not complete - * I/O until presuspend is recieved. - */ -#define DMLOG_IOERR_IGNORE 0 -#define DMLOG_IOERR_BLOCK 1 - typedef sector_t region_t; struct dirty_log_type; @@ -32,7 +23,6 @@ struct dirty_log_type { const char *name; struct module *module; unsigned int use_count; - unsigned int flags; int (*ctr)(struct dirty_log *log, struct dm_target *ti, unsigned int argc, char **argv); @@ -42,8 +32,7 @@ struct dirty_log_type { * There are times when we don't want the log to touch * the disk. */ - int (*presuspend)(struct dirty_log *log); - int (*postsuspend)(struct dirty_log *log); + int (*suspend)(struct dirty_log *log); int (*resume)(struct dirty_log *log); /* @@ -101,12 +90,12 @@ struct dirty_log_type { int (*get_resync_work)(struct dirty_log *log, region_t *region); /* - * This notifies the log that the resync status of a region - * has changed. It also clears the region from the recovering - * list (if present). + * This notifies the log that the resync of an area has + * been completed. The log should then mark this region + * as CLEAN. */ - void (*set_region_sync)(struct dirty_log *log, - region_t region, int in_sync); + void (*complete_resync_work)(struct dirty_log *log, + region_t region, int success); /* * Returns the number of regions that are in sync. @@ -118,24 +107,6 @@ struct dirty_log_type { */ int (*status)(struct dirty_log *log, status_type_t status_type, char *result, unsigned int maxlen); - - /* - * Return the code describing what to do in the event - * of a device failure. - */ - int (*get_failure_response)(struct dirty_log *log); - - /* - * Returns: 0, 1 - * - * This is necessary for cluster mirroring. It provides - * a way to detect recovery on another node, so we - * aren't writing concurrently. This function is likely - * to block (when a cluster log is used). - */ - int (*is_remote_recovering)(struct dirty_log *log, region_t region); - - int (*reserved[5])(int a); }; int dm_register_dirty_log_type(struct dirty_log_type *type); diff --git a/drivers/md/dm-mpath.c b/drivers/md/dm-mpath.c index 93f701ea8..cf70a0dc8 100644 --- a/drivers/md/dm-mpath.c +++ b/drivers/md/dm-mpath.c @@ -21,7 +21,6 @@ #include #include -#define DM_MSG_PREFIX "multipath" #define MESG_STR(x) x, sizeof(x) /* Path properties */ @@ -180,7 +179,8 @@ static struct multipath *alloc_multipath(void) m->queue_io = 1; INIT_WORK(&m->process_queued_ios, process_queued_ios, m); INIT_WORK(&m->trigger_event, trigger_event, m); - m->mpio_pool = mempool_create_slab_pool(MIN_IOS, _mpio_cache); + m->mpio_pool = mempool_create(MIN_IOS, mempool_alloc_slab, + mempool_free_slab, _mpio_cache); if (!m->mpio_pool) { kfree(m); return NULL; @@ -447,6 +447,8 @@ struct param { char *error; }; +#define ESTR(s) ("dm-multipath: " s) + static int read_param(struct param *param, char *str, unsigned *v, char **error) { if (!str || @@ -494,12 +496,12 @@ static int parse_path_selector(struct arg_set *as, struct priority_group *pg, unsigned ps_argc; static struct param _params[] = { - {0, 1024, "invalid number of path selector args"}, + {0, 1024, ESTR("invalid number of path selector args")}, }; pst = dm_get_path_selector(shift(as)); if (!pst) { - ti->error = "unknown path selector type"; + ti->error = ESTR("unknown path selector type"); return -EINVAL; } @@ -510,7 +512,7 @@ static int parse_path_selector(struct arg_set *as, struct priority_group *pg, r = pst->create(&pg->ps, ps_argc, as->argv); if (r) { dm_put_path_selector(pst); - ti->error = "path selector constructor failed"; + ti->error = ESTR("path selector constructor failed"); return r; } @@ -528,7 +530,7 @@ static struct pgpath *parse_path(struct arg_set *as, struct path_selector *ps, /* we need at least a path arg */ if (as->argc < 1) { - ti->error = "no device given"; + ti->error = ESTR("no device given"); return NULL; } @@ -539,7 +541,7 @@ static struct pgpath *parse_path(struct arg_set *as, struct path_selector *ps, r = dm_get_device(ti, shift(as), ti->begin, ti->len, dm_table_get_mode(ti->table), &p->path.dev); if (r) { - ti->error = "error getting device"; + ti->error = ESTR("error getting device"); goto bad; } @@ -561,8 +563,8 @@ static struct priority_group *parse_priority_group(struct arg_set *as, struct dm_target *ti) { static struct param _params[] = { - {1, 1024, "invalid number of paths"}, - {0, 1024, "invalid number of selector args"} + {1, 1024, ESTR("invalid number of paths")}, + {0, 1024, ESTR("invalid number of selector args")} }; int r; @@ -571,13 +573,13 @@ static struct priority_group *parse_priority_group(struct arg_set *as, if (as->argc < 2) { as->argc = 0; - ti->error = "not enough priority group aruments"; + ti->error = ESTR("not enough priority group aruments"); return NULL; } pg = alloc_priority_group(); if (!pg) { - ti->error = "couldn't allocate priority group"; + ti->error = ESTR("couldn't allocate priority group"); return NULL; } pg->m = m; @@ -632,7 +634,7 @@ static int parse_hw_handler(struct arg_set *as, struct multipath *m, unsigned hw_argc; static struct param _params[] = { - {0, 1024, "invalid number of hardware handler args"}, + {0, 1024, ESTR("invalid number of hardware handler args")}, }; r = read_param(_params, shift(as), &hw_argc, &ti->error); @@ -644,14 +646,14 @@ static int parse_hw_handler(struct arg_set *as, struct multipath *m, hwht = dm_get_hw_handler(shift(as)); if (!hwht) { - ti->error = "unknown hardware handler type"; + ti->error = ESTR("unknown hardware handler type"); return -EINVAL; } r = hwht->create(&m->hw_handler, hw_argc - 1, as->argv); if (r) { dm_put_hw_handler(hwht); - ti->error = "hardware handler constructor failed"; + ti->error = ESTR("hardware handler constructor failed"); return r; } @@ -668,7 +670,7 @@ static int parse_features(struct arg_set *as, struct multipath *m, unsigned argc; static struct param _params[] = { - {0, 1, "invalid number of feature args"}, + {0, 1, ESTR("invalid number of feature args")}, }; r = read_param(_params, shift(as), &argc, &ti->error); @@ -691,8 +693,8 @@ static int multipath_ctr(struct dm_target *ti, unsigned int argc, { /* target parameters */ static struct param _params[] = { - {1, 1024, "invalid number of priority groups"}, - {1, 1024, "invalid initial priority group number"}, + {1, 1024, ESTR("invalid number of priority groups")}, + {1, 1024, ESTR("invalid initial priority group number")}, }; int r; @@ -706,7 +708,7 @@ static int multipath_ctr(struct dm_target *ti, unsigned int argc, m = alloc_multipath(); if (!m) { - ti->error = "can't allocate multipath"; + ti->error = ESTR("can't allocate multipath"); return -EINVAL; } @@ -747,7 +749,7 @@ static int multipath_ctr(struct dm_target *ti, unsigned int argc, } if (pg_count != m->nr_priority_groups) { - ti->error = "priority group count mismatch"; + ti->error = ESTR("priority group count mismatch"); r = -EINVAL; goto bad; } @@ -807,7 +809,7 @@ static int fail_path(struct pgpath *pgpath) if (!pgpath->path.is_active) goto out; - DMWARN("Failing path %s.", pgpath->path.dev->name); + DMWARN("dm-multipath: Failing path %s.", pgpath->path.dev->name); pgpath->pg->ps.type->fail_path(&pgpath->pg->ps, &pgpath->path); pgpath->path.is_active = 0; @@ -1250,7 +1252,7 @@ static int multipath_message(struct dm_target *ti, unsigned argc, char **argv) r = dm_get_device(ti, argv[1], ti->begin, ti->len, dm_table_get_mode(ti->table), &dev); if (r) { - DMWARN("message: error getting device %s", + DMWARN("dm-multipath message: error getting device %s", argv[1]); return -EINVAL; } @@ -1309,7 +1311,7 @@ static int __init dm_multipath_init(void) return -ENOMEM; } - DMINFO("version %u.%u.%u loaded", + DMINFO("dm-multipath version %u.%u.%u loaded", multipath_target.version[0], multipath_target.version[1], multipath_target.version[2]); diff --git a/drivers/md/dm-path-selector.c b/drivers/md/dm-path-selector.c index f10a0c89b..a28c1c2b4 100644 --- a/drivers/md/dm-path-selector.c +++ b/drivers/md/dm-path-selector.c @@ -86,7 +86,8 @@ void dm_put_path_selector(struct path_selector_type *pst) if (--psi->use == 0) module_put(psi->pst.module); - BUG_ON(psi->use < 0); + if (psi->use < 0) + BUG(); out: up_read(&_ps_lock); diff --git a/drivers/md/dm-raid1.c b/drivers/md/dm-raid1.c index 8cfc33b1e..0242cc399 100644 --- a/drivers/md/dm-raid1.c +++ b/drivers/md/dm-raid1.c @@ -6,7 +6,6 @@ #include "dm.h" #include "dm-bio-list.h" -#include "dm-bio-record.h" #include "dm-io.h" #include "dm-log.h" #include "kcopyd.h" @@ -21,13 +20,8 @@ #include #include -#define DM_MSG_PREFIX "raid1" - static struct workqueue_struct *_kmirrord_wq; static struct work_struct _kmirrord_work; -DECLARE_WAIT_QUEUE_HEAD(recovery_stopped_event); - -static int dm_mirror_error_on_log_failure = 1; static inline void wake(void) { @@ -87,12 +81,10 @@ struct region_hash { struct list_head *buckets; spinlock_t region_lock; - atomic_t recovery_in_flight; struct semaphore recovery_count; struct list_head clean_regions; struct list_head quiesced_regions; struct list_head recovered_regions; - struct list_head failed_recovered_regions; }; enum { @@ -119,8 +111,7 @@ struct region { * Mirror set structures. *---------------------------------------------------------------*/ struct mirror { - atomic_t error_count; /* Error counter to flag mirror failure */ - struct mirror_set *ms; + atomic_t error_count; struct dm_dev *dev; sector_t offset; }; @@ -131,10 +122,9 @@ struct mirror_set { struct region_hash rh; struct kcopyd_client *kcopyd_client; - spinlock_t lock; /* protects the lists */ + spinlock_t lock; /* protects the next two lists */ struct bio_list reads; struct bio_list writes; - struct bio_list failures; /* recovery */ region_t nr_regions; @@ -143,8 +133,6 @@ struct mirror_set { struct mirror *default_mirror; /* Default mirror */ unsigned int nr_mirrors; - atomic_t read_count; /* Read counter for read balancing */ - struct mirror *read_mirror; /* Last mirror read. */ struct mirror mirror[0]; }; @@ -164,6 +152,16 @@ static inline sector_t region_to_sector(struct region_hash *rh, region_t region) /* FIXME move this */ static void queue_bio(struct mirror_set *ms, struct bio *bio, int rw); +static void *region_alloc(gfp_t gfp_mask, void *pool_data) +{ + return kmalloc(sizeof(struct region), gfp_mask); +} + +static void region_free(void *element, void *pool_data) +{ + kfree(element); +} + #define MIN_REGIONS 64 #define MAX_RECOVERY 1 static int rh_init(struct region_hash *rh, struct mirror_set *ms, @@ -201,14 +199,12 @@ static int rh_init(struct region_hash *rh, struct mirror_set *ms, spin_lock_init(&rh->region_lock); sema_init(&rh->recovery_count, 0); - atomic_set(&rh->recovery_in_flight, 0); INIT_LIST_HEAD(&rh->clean_regions); INIT_LIST_HEAD(&rh->quiesced_regions); INIT_LIST_HEAD(&rh->recovered_regions); - INIT_LIST_HEAD(&rh->failed_recovered_regions); - rh->region_pool = mempool_create_kmalloc_pool(MIN_REGIONS, - sizeof(struct region)); + rh->region_pool = mempool_create(MIN_REGIONS, region_alloc, + region_free, NULL); if (!rh->region_pool) { vfree(rh->buckets); rh->buckets = NULL; @@ -353,24 +349,12 @@ static void dispatch_bios(struct mirror_set *ms, struct bio_list *bio_list) } } -static void complete_resync_work(struct region *reg, int success) -{ - struct region_hash *rh = reg->rh; - - rh->log->type->set_region_sync(rh->log, reg->key, success); - if (atomic_dec_and_test(&rh->recovery_in_flight)) - wake_up_all(&recovery_stopped_event); - dispatch_bios(rh->ms, ®->delayed_bios); - up(&rh->recovery_count); -} - static void rh_update_states(struct region_hash *rh) { struct region *reg, *next; LIST_HEAD(clean); LIST_HEAD(recovered); - LIST_HEAD(failed_recovered); /* * Quickly grab the lists. @@ -394,15 +378,6 @@ static void rh_update_states(struct region_hash *rh) list_for_each_entry (reg, &recovered, list) list_del(®->hash_list); } - - if (!list_empty(&rh->failed_recovered_regions)) { - list_splice(&rh->failed_recovered_regions, &failed_recovered); - INIT_LIST_HEAD(&rh->failed_recovered_regions); - - list_for_each_entry (reg, &failed_recovered, list) - list_del(®->hash_list); - } - spin_unlock(&rh->region_lock); write_unlock_irq(&rh->hash_lock); @@ -413,12 +388,9 @@ static void rh_update_states(struct region_hash *rh) */ list_for_each_entry_safe (reg, next, &recovered, list) { rh->log->type->clear_region(rh->log, reg->key); - complete_resync_work(reg, 1); - mempool_free(reg, rh->region_pool); - } - - list_for_each_entry_safe (reg, next, &failed_recovered, list) { - complete_resync_work(reg, 0); + rh->log->type->complete_resync_work(rh->log, reg->key, 1); + dispatch_bios(rh->ms, ®->delayed_bios); + up(&rh->recovery_count); mempool_free(reg, rh->region_pool); } @@ -472,21 +444,9 @@ static void rh_dec(struct region_hash *rh, region_t region) spin_lock_irqsave(&rh->region_lock, flags); if (atomic_dec_and_test(®->pending)) { - /* - * There is no pending I/O for this region. - * We can move the region to corresponding list for next action. - * At this point, the region is not yet connected to any list. - * - * If the state is RH_NOSYNC, the region should be kept off - * from clean list. - * The hash entry for RH_NOSYNC will remain in memory - * until the region is recovered or the map is reloaded. - */ - - /* do nothing for RH_NOSYNC */ if (reg->state == RH_RECOVERING) { list_add_tail(®->list, &rh->quiesced_regions); - } else if (reg->state == RH_DIRTY) { + } else { reg->state = RH_CLEAN; list_add(®->list, &rh->clean_regions); } @@ -528,9 +488,11 @@ static int __rh_recovery_prepare(struct region_hash *rh) /* Already quiesced ? */ if (atomic_read(®->pending)) list_del_init(®->list); - else - list_move(®->list, &rh->quiesced_regions); + else { + list_del_init(®->list); + list_add(®->list, &rh->quiesced_regions); + } spin_unlock_irq(&rh->region_lock); return 1; @@ -538,21 +500,11 @@ static int __rh_recovery_prepare(struct region_hash *rh) static void rh_recovery_prepare(struct region_hash *rh) { - /* Extra reference to avoid race with rh_stop_recovery */ - atomic_inc(&rh->recovery_in_flight); - - while (!down_trylock(&rh->recovery_count)) { - atomic_inc(&rh->recovery_in_flight); + while (!down_trylock(&rh->recovery_count)) if (__rh_recovery_prepare(rh) <= 0) { - atomic_dec(&rh->recovery_in_flight); up(&rh->recovery_count); break; } - } - - /* Drop the extra reference */ - if (atomic_dec_and_test(&rh->recovery_in_flight)) - wake_up_all(&recovery_stopped_event); } /* @@ -573,26 +525,21 @@ static struct region *rh_recovery_start(struct region_hash *rh) return reg; } +/* FIXME: success ignored for now */ static void rh_recovery_end(struct region *reg, int success) { struct region_hash *rh = reg->rh; spin_lock_irq(&rh->region_lock); - if (success || - (rh->log->type->get_failure_response(rh->log) == DMLOG_IOERR_IGNORE)) - list_add(®->list, ®->rh->recovered_regions); - else { - reg->state = RH_NOSYNC; - list_add(®->list, ®->rh->failed_recovered_regions); - } + list_add(®->list, ®->rh->recovered_regions); spin_unlock_irq(&rh->region_lock); wake(); } -static int rh_flush(struct region_hash *rh) +static void rh_flush(struct region_hash *rh) { - return rh->log->type->flush(rh->log); + rh->log->type->flush(rh->log); } static void rh_delay(struct region_hash *rh, struct bio *bio) @@ -624,39 +571,24 @@ static void rh_start_recovery(struct region_hash *rh) wake(); } -struct bio_map_info { - struct mirror *bmi_m; - struct dm_bio_details bmi_bd; -}; - -static mempool_t *bio_map_info_pool = NULL; - -static void *bio_map_info_alloc(unsigned int gfp_mask, void *pool_data){ - return kmalloc(sizeof(struct bio_map_info), gfp_mask); -} - -static void bio_map_info_free(void *element, void *pool_data){ - kfree(element); -} - /* * Every mirror should look like this one. */ #define DEFAULT_MIRROR 0 /* - * This is yucky. We squirrel the mirror struct away inside - * bi_next for read/write buffers. This is safe since the bh + * This is yucky. We squirrel the mirror_set struct away inside + * bi_next for write buffers. This is safe since the bh * doesn't get submitted to the lower levels of block layer. */ -static struct mirror *bio_get_m(struct bio *bio) +static struct mirror_set *bio_get_ms(struct bio *bio) { - return (struct mirror *) bio->bi_next; + return (struct mirror_set *) bio->bi_next; } -static void bio_set_m(struct bio *bio, struct mirror *m) +static void bio_set_ms(struct bio *bio, struct mirror_set *ms) { - bio->bi_next = (struct bio *) m; + bio->bi_next = (struct bio *) ms; } /*----------------------------------------------------------------- @@ -666,38 +598,13 @@ static void bio_set_m(struct bio *bio, struct mirror *m) * are in the no-sync state. We have to recover these by * recopying from the default mirror to all the others. *---------------------------------------------------------------*/ -static void fail_mirror(struct mirror *m); static void recovery_complete(int read_err, unsigned int write_err, void *context) { struct region *reg = (struct region *) context; - struct mirror_set *ms = reg->rh->ms; - unsigned long write_error = write_err; - int m, bit = 0; - - if (read_err) { - /* Read error means the failure of default mirror. */ - DMERR("Unable to read from primary mirror during recovery"); - fail_mirror(ms->default_mirror); - } - if (write_error) { - DMERR("Write error during recovery (error = %#lx)", - write_error); - /* - * Bits correspond to devices (excluding default mirror). - * The default mirror cannot change during recovery. - */ - for (m = 0; m < ms->nr_mirrors; m++) { - if (&ms->mirror[m] == ms->default_mirror) - continue; - if (test_bit(bit, &write_error)) - fail_mirror(ms->mirror + m); - bit++; - } - } - - rh_recovery_end(reg, !(read_err || write_err)); + /* FIXME: better error handling */ + rh_recovery_end(reg, read_err || write_err); } static int recover(struct mirror_set *ms, struct region *reg) @@ -736,9 +643,7 @@ static int recover(struct mirror_set *ms, struct region *reg) } /* hand to kcopyd */ - if (ms->rh.log->type->get_failure_response(ms->rh.log) == DMLOG_IOERR_IGNORE) - set_bit(KCOPYD_IGNORE_ERROR, &flags); - + set_bit(KCOPYD_IGNORE_ERROR, &flags); r = kcopyd_copy(ms->kcopyd_client, &from, ms->nr_mirrors - 1, to, flags, recovery_complete, reg); @@ -766,212 +671,53 @@ static void do_recovery(struct mirror_set *ms) } /* - * Update the in sync flag if necessary. - * Raise an event when the mirror becomes in-sync. - * - * After recovery completes, the mirror becomes in_sync. - * Only an I/O failure can then take it back out-of-sync. + * Update the in sync flag. */ - if (log->type->get_sync_count(log) == ms->nr_regions) { - if (!ms->in_sync) { - dm_table_event(ms->ti->table); - ms->in_sync = 1; - } - } else if (ms->in_sync) - ms->in_sync = 0; + if (!ms->in_sync && + (log->type->get_sync_count(log) == ms->nr_regions)) { + /* the sync is complete */ + dm_table_event(ms->ti->table); + ms->in_sync = 1; + } } /*----------------------------------------------------------------- * Reads *---------------------------------------------------------------*/ -/* Switch to next dev, via round-robin, after MIN_READS reads */ -#define MIN_READS 128 - -/* choose_mirror - * @ms: the mirror set - * - * This function is used for read balancing. - * - * Returns: chosen mirror, or NULL on failure - */ -static struct mirror *choose_mirror(struct mirror_set *ms) -{ - struct mirror *start_mirror = ms->read_mirror; - - /* - * Perform MIN_READS on each working mirror then - * advance to the next one. start_mirror stores - * the first we tried, so we know when we're done. - */ - do { - if (likely(!atomic_read(&ms->read_mirror->error_count)) && - !atomic_dec_and_test(&ms->read_count)) - goto use_mirror; - - atomic_set(&ms->read_count, MIN_READS); - - if (ms->read_mirror-- == ms->mirror) - ms->read_mirror += ms->nr_mirrors; - } while (ms->read_mirror != start_mirror); - - /* - * We've rejected every mirror. - * Confirm the start_mirror can be used. - */ - if (unlikely(atomic_read(&ms->read_mirror->error_count))) - return NULL; - -use_mirror: - return ms->read_mirror; -} - -/* fail_mirror - * @m: mirror device to fail - * - * If the device is valid, mark it invalid. Also, - * if this is the default mirror device (i.e. the primary - * device) and the mirror set is in-sync, choose an - * alternate primary device. - * - * This function cannot block. - */ -static void fail_mirror(struct mirror *m) -{ - struct mirror_set *ms = m->ms; - struct mirror *new; - - atomic_inc(&m->error_count); - - if (atomic_read(&m->error_count) > 1) - return; - - if (m != ms->default_mirror) - return; - - /* - * If the default mirror fails, change it. - * In the case of cluster mirroring, the default - * is changed in rh_update_states. - */ - if (!ms->in_sync) { - /* - * Can not switch primary. Better to issue requests - * to same failing device than to risk returning - * corrupt data. - */ - DMERR("Primary mirror device has failed while mirror is not in-sync"); - DMERR("Unable to choose alternative primary device"); - return; - } - - for (new = ms->mirror; new < ms->mirror + ms->nr_mirrors; new++) - if (!atomic_read(&new->error_count)) { - ms->default_mirror = new; - break; - } - - if (unlikely(new == ms->mirror + ms->nr_mirrors)) - DMWARN("All sides of mirror have failed."); -} - -static int default_ok(struct mirror *m) +static struct mirror *choose_mirror(struct mirror_set *ms, sector_t sector) { - return !atomic_read(&m->ms->default_mirror->error_count); -} - -static int mirror_available(struct mirror_set *ms, struct bio *bio) -{ - region_t region = bio_to_region(&ms->rh, bio); - - if (ms->rh.log->type->in_sync(ms->rh.log, region, 0) > 0) - return choose_mirror(ms) ? 1 : 0; - - return 0; + /* FIXME: add read balancing */ + return ms->default_mirror; } /* * remap a buffer to a particular mirror. */ -static sector_t map_sector(struct mirror *m, struct bio *bio) -{ - return m->offset + (bio->bi_sector - m->ms->ti->begin); -} - -static void map_bio(struct mirror *m, struct bio *bio) +static void map_bio(struct mirror_set *ms, struct mirror *m, struct bio *bio) { bio->bi_bdev = m->dev->bdev; - bio->bi_sector = map_sector(m, bio); -} - -static void map_region(struct io_region *io, struct mirror *m, - struct bio *bio) -{ - io->bdev = m->dev->bdev; - io->sector = map_sector(m, bio); - io->count = bio->bi_size >> 9; -} - -/*----------------------------------------------------------------- - * Reads - *---------------------------------------------------------------*/ -static void read_callback(unsigned long error, void *context) -{ - struct bio *bio = (struct bio *)context; - struct mirror *m; - - m = bio_get_m(bio); - bio_set_m(bio, NULL); - - if (unlikely(error)) { - DMWARN("A read failure occurred on a mirror device."); - fail_mirror(m); - if (likely(default_ok(m)) || mirror_available(m->ms, bio)) { - DMWARN("Trying different device."); - queue_bio(m->ms, bio, bio_rw(bio)); - } else { - DMERR("No other device available, failing I/O."); - bio_endio(bio, bio->bi_size, -EIO); - } - } else - bio_endio(bio, bio->bi_size, 0); -} - -/* Asynchronous read. */ -static void read_async_bio(struct mirror *m, struct bio *bio) -{ - struct io_region io; - - map_region(&io, m, bio); - bio_set_m(bio, m); - dm_io_async_bvec(1, &io, READ, - bio->bi_io_vec + bio->bi_idx, - read_callback, bio); + bio->bi_sector = m->offset + (bio->bi_sector - ms->ti->begin); } static void do_reads(struct mirror_set *ms, struct bio_list *reads) { + region_t region; struct bio *bio; struct mirror *m; while ((bio = bio_list_pop(reads))) { + region = bio_to_region(&ms->rh, bio); + /* * We can only read balance if the region is in sync. */ - if (likely(rh_in_sync(&ms->rh, - bio_to_region(&ms->rh, bio), 0))) - m = choose_mirror(ms); - else { + if (rh_in_sync(&ms->rh, region, 0)) + m = choose_mirror(ms, bio->bi_sector); + else m = ms->default_mirror; - /* If default has failed, we give up. */ - if (unlikely(m && atomic_read(&m->error_count))) - m = NULL; - } - - if (likely(m)) - read_async_bio(m, bio); - else - bio_endio(bio, bio->bi_size, -EIO); + map_bio(ms, m, bio); + generic_make_request(bio); } } @@ -985,70 +731,15 @@ static void do_reads(struct mirror_set *ms, struct bio_list *reads) * RECOVERING: delay the io until recovery completes * NOSYNC: increment pending, just write to the default mirror *---------------------------------------------------------------*/ - -/* __bio_mark_nosync - * @ms - * @bio - * @done - * @error - * - * The bio was written on some mirror(s) but failed on other mirror(s). - * We can successfully endio the bio but should avoid the region being - * marked clean by setting the state RH_NOSYNC. - * - * This function is _not_ interrupt safe! - */ -static void __bio_mark_nosync(struct mirror_set *ms, - struct bio *bio, unsigned int done, int error) +static void write_callback(unsigned long error, void *context) { - unsigned long flags; - struct region_hash *rh = &ms->rh; - struct dirty_log *log = ms->rh.log; - struct region *reg; - region_t region = bio_to_region(rh, bio); - int recovering = 0; - - ms->in_sync = 0; - - /* We must inform the log that the sync count has changed. */ - log->type->set_region_sync(log, region, 0); - - read_lock(&rh->hash_lock); - reg = __rh_find(rh, region); - read_unlock(&rh->hash_lock); - - /* region hash entry should exist because write was in-flight */ - BUG_ON(!reg); - BUG_ON(!list_empty(®->list)); - - spin_lock_irqsave(&rh->region_lock, flags); - /* - * Possible cases: - * 1) RH_DIRTY - * 2) RH_NOSYNC: was dirty, other preceeding writes failed - * 3) RH_RECOVERING: flushing pending writes - * Either case, the region should have not been connected to list. - */ - recovering = (reg->state == RH_RECOVERING); - reg->state = RH_NOSYNC; - BUG_ON(!list_empty(®->list)); - spin_unlock_irqrestore(&rh->region_lock, flags); - - bio_endio(bio, done, error); - if (recovering) - complete_resync_work(reg, 0); -} - -static void write_callback(unsigned long error, void *context, int log_failure) -{ - unsigned int i, ret = 0; + unsigned int i; + int uptodate = 1; struct bio *bio = (struct bio *) context; struct mirror_set *ms; - int uptodate = 0; - int should_wake = 0; - ms = (bio_get_m(bio))->ms; - bio_set_m(bio, NULL); + ms = bio_get_ms(bio); + bio_set_ms(bio, NULL); /* * NOTE: We don't decrement the pending count here, @@ -1056,95 +747,47 @@ static void write_callback(unsigned long error, void *context, int log_failure) * This way we handle both writes to SYNC and NOSYNC * regions with the same code. */ - if (unlikely(error)) { - DMERR("Error during write occurred."); + if (error) { /* - * If the log is intact, we can play around with trying - * to handle the failure. Otherwise, we have to report - * the I/O as failed. + * only error the io if all mirrors failed. + * FIXME: bogus */ - if (!log_failure) { - for (i = 0; i < ms->nr_mirrors; i++) { - if (test_bit(i, &error)) - fail_mirror(ms->mirror + i); - else - uptodate = 1; + uptodate = 0; + for (i = 0; i < ms->nr_mirrors; i++) + if (!test_bit(i, &error)) { + uptodate = 1; + break; } - } - - if (likely(uptodate)) { - /* - * Need to raise event. Since raising - * events can block, we need to do it in - * the main thread. - */ - spin_lock(&ms->lock); - if (!ms->failures.head) - should_wake = 1; - bio_list_add(&ms->failures, bio); - spin_unlock(&ms->lock); - if (should_wake) - wake(); - return; - } else { - DMERR("All replicated volumes dead, failing I/O"); - /* None of the writes succeeded, fail the I/O. */ - ret = -EIO; - } } - - bio_endio(bio, bio->bi_size, ret); -} - -static void write_callback_good_log(unsigned long error, void *context) -{ - write_callback(error, context, 0); -} - -static void write_callback_bad_log(unsigned long error, void *context) -{ - write_callback(error, context, 1); + bio_endio(bio, bio->bi_size, 0); } -static void do_write(struct mirror_set *ms, struct bio *bio, int log_failure) +static void do_write(struct mirror_set *ms, struct bio *bio) { unsigned int i; - struct io_region io[ms->nr_mirrors], *dest = io; + struct io_region io[KCOPYD_MAX_REGIONS+1]; struct mirror *m; - if (log_failure && dm_mirror_error_on_log_failure) { - bio_endio(bio, bio->bi_size, -EIO); - return; - } + for (i = 0; i < ms->nr_mirrors; i++) { + m = ms->mirror + i; - for (i = 0, m = ms->mirror; i < ms->nr_mirrors; i++, m++) - map_region(dest++, m, bio); + io[i].bdev = m->dev->bdev; + io[i].sector = m->offset + (bio->bi_sector - ms->ti->begin); + io[i].count = bio->bi_size >> 9; + } - /* - * We can use the default mirror here, because we - * only need it in order to retrieve the reference - * to the mirror set in write_callback(). - */ - bio_set_m(bio, ms->default_mirror); - if (log_failure) - dm_io_async_bvec(ms->nr_mirrors, io, WRITE, - bio->bi_io_vec + bio->bi_idx, - write_callback_bad_log, bio); - else - dm_io_async_bvec(ms->nr_mirrors, io, WRITE, - bio->bi_io_vec + bio->bi_idx, - write_callback_good_log, bio); + bio_set_ms(bio, ms); + dm_io_async_bvec(ms->nr_mirrors, io, WRITE, + bio->bi_io_vec + bio->bi_idx, + write_callback, bio); } static void do_writes(struct mirror_set *ms, struct bio_list *writes) { - int state, r; + int state; struct bio *bio; struct bio_list sync, nosync, recover, *this_list = NULL; - struct bio_list requeue; - struct dirty_log *log = ms->rh.log; - region_t region; if (!writes->head) return; @@ -1155,18 +798,9 @@ static void do_writes(struct mirror_set *ms, struct bio_list *writes) bio_list_init(&sync); bio_list_init(&nosync); bio_list_init(&recover); - bio_list_init(&requeue); while ((bio = bio_list_pop(writes))) { - region = bio_to_region(&ms->rh, bio); - - if (log->type->is_remote_recovering && - log->type->is_remote_recovering(log, region)) { - bio_list_add(&requeue, bio); - continue; - } - - state = rh_state(&ms->rh, region, 1); + state = rh_state(&ms->rh, bio_to_region(&ms->rh, bio), 1); switch (state) { case RH_CLEAN: case RH_DIRTY: @@ -1185,14 +819,6 @@ static void do_writes(struct mirror_set *ms, struct bio_list *writes) bio_list_add(this_list, bio); } - /* - * Add bios that are delayed due to remote recovery - * back on to the write queue - */ - spin_lock_irq(&ms->lock); - bio_list_merge(&ms->writes, &requeue); - spin_unlock_irq(&ms->lock); - /* * Increment the pending counts for any regions that will * be written to (writes to recover regions are going to @@ -1200,86 +826,54 @@ static void do_writes(struct mirror_set *ms, struct bio_list *writes) */ rh_inc_pending(&ms->rh, &sync); rh_inc_pending(&ms->rh, &nosync); - - r = rh_flush(&ms->rh); + rh_flush(&ms->rh); /* * Dispatch io. */ while ((bio = bio_list_pop(&sync))) - do_write(ms, bio, r ? 1 : 0); + do_write(ms, bio); while ((bio = bio_list_pop(&recover))) rh_delay(&ms->rh, bio); while ((bio = bio_list_pop(&nosync))) { - map_bio(ms->default_mirror, bio); + map_bio(ms, ms->default_mirror, bio); generic_make_request(bio); } } -static void do_failures(struct mirror_set *ms, struct bio_list *failures) -{ - struct bio *bio; - struct dirty_log *log = ms->rh.log; - - if (!failures->head) - return; - - if (log->type->get_failure_response(log) == DMLOG_IOERR_BLOCK) - dm_table_event(ms->ti->table); - - while ((bio = bio_list_pop(failures))) - __bio_mark_nosync(ms, bio, bio->bi_size, 0); -} - /*----------------------------------------------------------------- * kmirrord *---------------------------------------------------------------*/ static LIST_HEAD(_mirror_sets); static DECLARE_RWSEM(_mirror_sets_lock); -static int do_mirror(struct mirror_set *ms) +static void do_mirror(struct mirror_set *ms) { - struct bio_list reads, writes, failures; + struct bio_list reads, writes; - spin_lock_irq(&ms->lock); + spin_lock(&ms->lock); reads = ms->reads; writes = ms->writes; - failures = ms->failures; bio_list_init(&ms->reads); bio_list_init(&ms->writes); - bio_list_init(&ms->failures); - spin_unlock_irq(&ms->lock); + spin_unlock(&ms->lock); rh_update_states(&ms->rh); do_recovery(ms); do_reads(ms, &reads); do_writes(ms, &writes); - do_failures(ms, &failures); - - return (ms->writes.head) ? 1 : 0; } -static int _do_work(void) +static void do_work(void *ignored) { - int more_work = 0; struct mirror_set *ms; down_read(&_mirror_sets_lock); list_for_each_entry (ms, &_mirror_sets, list) - more_work += do_mirror(ms); + do_mirror(ms); up_read(&_mirror_sets_lock); - - return more_work; -} - -static void do_work(void *ignored) -{ - while (_do_work()) { - set_current_state(TASK_INTERRUPTIBLE); - schedule_timeout(HZ/5); - } } /*----------------------------------------------------------------- @@ -1300,7 +894,7 @@ static struct mirror_set *alloc_context(unsigned int nr_mirrors, ms = kmalloc(len, GFP_KERNEL); if (!ms) { - ti->error = "Cannot allocate mirror context"; + ti->error = "dm-mirror: Cannot allocate mirror context"; return NULL; } @@ -1311,19 +905,14 @@ static struct mirror_set *alloc_context(unsigned int nr_mirrors, ms->nr_mirrors = nr_mirrors; ms->nr_regions = dm_sector_div_up(ti->len, region_size); ms->in_sync = 0; - ms->read_mirror = &ms->mirror[DEFAULT_MIRROR]; ms->default_mirror = &ms->mirror[DEFAULT_MIRROR]; if (rh_init(&ms->rh, ms, dl, region_size, ms->nr_regions)) { - ti->error = "Error creating dirty region hash"; + ti->error = "dm-mirror: Error creating dirty region hash"; kfree(ms); return NULL; } - atomic_set(&ms->read_count, MIN_READS); - - bio_list_init(&ms->failures); - return ms; } @@ -1346,23 +935,21 @@ static inline int _check_region_size(struct dm_target *ti, uint32_t size) static int get_mirror(struct mirror_set *ms, struct dm_target *ti, unsigned int mirror, char **argv) { - unsigned long long offset; + sector_t offset; - if (sscanf(argv[1], "%llu", &offset) != 1) { - ti->error = "Invalid offset"; + if (sscanf(argv[1], SECTOR_FORMAT, &offset) != 1) { + ti->error = "dm-mirror: Invalid offset"; return -EINVAL; } if (dm_get_device(ti, argv[0], offset, ti->len, dm_table_get_mode(ti->table), &ms->mirror[mirror].dev)) { - ti->error = "Device lookup failure"; + ti->error = "dm-mirror: Device lookup failure"; return -ENXIO; } ms->mirror[mirror].offset = offset; - atomic_set(&(ms->mirror[mirror].error_count), 0); - ms->mirror[mirror].ms = ms; return 0; } @@ -1395,30 +982,30 @@ static struct dirty_log *create_dirty_log(struct dm_target *ti, struct dirty_log *dl; if (argc < 2) { - ti->error = "Insufficient mirror log arguments"; + ti->error = "dm-mirror: Insufficient mirror log arguments"; return NULL; } if (sscanf(argv[1], "%u", ¶m_count) != 1) { - ti->error = "Invalid mirror log argument count"; + ti->error = "dm-mirror: Invalid mirror log argument count"; return NULL; } *args_used = 2 + param_count; if (argc < *args_used) { - ti->error = "Insufficient mirror log arguments"; + ti->error = "dm-mirror: Insufficient mirror log arguments"; return NULL; } dl = dm_create_dirty_log(argv[0], ti, param_count, argv + 2); if (!dl) { - ti->error = "Error creating mirror dirty log"; + ti->error = "dm-mirror: Error creating mirror dirty log"; return NULL; } if (!_check_region_size(ti, dl->type->get_region_size(dl))) { - ti->error = "Invalid region size"; + ti->error = "dm-mirror: Invalid region size"; dm_destroy_dirty_log(dl); return NULL; } @@ -1452,7 +1039,7 @@ static int mirror_ctr(struct dm_target *ti, unsigned int argc, char **argv) if (!argc || sscanf(argv[0], "%u", &nr_mirrors) != 1 || nr_mirrors < 2 || nr_mirrors > KCOPYD_MAX_REGIONS + 1) { - ti->error = "Invalid number of mirrors"; + ti->error = "dm-mirror: Invalid number of mirrors"; dm_destroy_dirty_log(dl); return -EINVAL; } @@ -1460,7 +1047,7 @@ static int mirror_ctr(struct dm_target *ti, unsigned int argc, char **argv) argv++, argc--; if (argc != nr_mirrors * 2) { - ti->error = "Wrong number of mirror arguments"; + ti->error = "dm-mirror: Wrong number of mirror arguments"; dm_destroy_dirty_log(dl); return -EINVAL; } @@ -1506,15 +1093,14 @@ static void mirror_dtr(struct dm_target *ti) static void queue_bio(struct mirror_set *ms, struct bio *bio, int rw) { - unsigned long flags; int should_wake = 0; struct bio_list *bl; bl = (rw == WRITE) ? &ms->writes : &ms->reads; - spin_lock_irqsave(&ms->lock, flags); + spin_lock(&ms->lock); should_wake = !(bl->head); bio_list_add(bl, bio); - spin_unlock_irqrestore(&ms->lock, flags); + spin_unlock(&ms->lock); if (should_wake) wake(); @@ -1529,64 +1115,42 @@ static int mirror_map(struct dm_target *ti, struct bio *bio, int r, rw = bio_rw(bio); struct mirror *m; struct mirror_set *ms = ti->private; - struct bio_map_info *bmi = NULL; - struct dm_bio_details *bd = NULL; + + map_context->ll = bio_to_region(&ms->rh, bio); if (rw == WRITE) { - /* Save region for mirror_end_io() handler */ - map_context->ll = bio_to_region(&ms->rh, bio); queue_bio(ms, bio, rw); return 0; } - /* All about the reads now */ - r = ms->rh.log->type->in_sync(ms->rh.log, bio_to_region(&ms->rh, bio), 0); if (r < 0 && r != -EWOULDBLOCK) return r; - if (r == -EWOULDBLOCK) + if (r == -EWOULDBLOCK) /* FIXME: ugly */ r = 0; - if (likely(r)) { - /* - * Optimize reads by avoiding to hand them to daemon. - * - * In case they fail, queue them for another shot - * in the mirror_end_io() function. - */ - m = choose_mirror(ms); - if (likely(m)) { - bmi = mempool_alloc(bio_map_info_pool, GFP_NOIO); - - if (likely(bmi)) { - /* without this, a read is not retryable */ - bd = &bmi->bmi_bd; - dm_bio_record(bd, bio); - map_context->ptr = bmi; - bmi->bmi_m = m; - } else { - /* we could fail now, but we can at least ** - ** give it a shot. The bd is only used to ** - ** retry in the event of a failure anyway. ** - ** If we fail, we can fail the I/O then. */ - map_context->ptr = NULL; - } - - map_bio(m, bio); - return 1; /* Mapped -> queue request. */ - } else - return -EIO; - } else { - /* Either not clean, or -EWOULDBLOCK */ - if (rw == READA) - return -EWOULDBLOCK; + /* + * We don't want to fast track a recovery just for a read + * ahead. So we just let it silently fail. + * FIXME: get rid of this. + */ + if (!r && rw == READA) + return -EIO; + if (!r) { + /* Pass this io over to the daemon */ queue_bio(ms, bio, rw); + return 0; } - return 0; + m = choose_mirror(ms, bio->bi_sector); + if (!m) + return -EIO; + + map_bio(ms, m, bio); + return 1; } static int mirror_end_io(struct dm_target *ti, struct bio *bio, @@ -1594,71 +1158,15 @@ static int mirror_end_io(struct dm_target *ti, struct bio *bio, { int rw = bio_rw(bio); struct mirror_set *ms = (struct mirror_set *) ti->private; - struct mirror *m = NULL; - struct dm_bio_details *bd = NULL; + region_t region = map_context->ll; /* * We need to dec pending if this was a write. */ - if (rw == WRITE) { - rh_dec(&ms->rh, map_context->ll); - return error; - } - - if (error == -EOPNOTSUPP) - goto out; - - if ((error == -EWOULDBLOCK) && bio_rw_ahead(bio)) - goto out; - - if (unlikely(error)) { - DMERR("A read failure occurred on a mirror device."); - if (!map_context->ptr) { - /* - * There wasn't enough memory to record necessary - * information for a retry or there was no other - * mirror in-sync. - */ - DMERR("Unable to retry read."); - return -EIO; - } - m = ((struct bio_map_info *)map_context->ptr)->bmi_m; - fail_mirror(m); /* Flag error on mirror. */ - - /* - * A failed read needs to get queued - * to the daemon for another shot to - * one (if any) intact mirrors. - */ - if (default_ok(m) || mirror_available(ms, bio)) { - bd = &(((struct bio_map_info *)map_context->ptr)->bmi_bd - ); - - DMWARN("Trying different device."); - dm_bio_restore(bd, bio); - mempool_free(map_context->ptr, bio_map_info_pool); - map_context->ptr = NULL; - queue_bio(ms, bio, rw); - return 1; /* We want another shot on the bio. */ - } - DMERR("All replicated volumes dead, failing I/O"); - } - -out: - if (map_context->ptr) - mempool_free(map_context->ptr, bio_map_info_pool); - - return error; -} + if (rw == WRITE) + rh_dec(&ms->rh, region); -static void mirror_presuspend(struct dm_target *ti) -{ - struct mirror_set *ms = (struct mirror_set *) ti->private; - struct dirty_log *log = ms->rh.log; - - if (log->type->presuspend && log->type->presuspend(log)) - /* FIXME: need better error handling */ - DMWARN("log presuspend failed"); + return 0; } static void mirror_postsuspend(struct dm_target *ti) @@ -1667,14 +1175,9 @@ static void mirror_postsuspend(struct dm_target *ti) struct dirty_log *log = ms->rh.log; rh_stop_recovery(&ms->rh); - - /* Wait for all I/O we generated to complete */ - wait_event(recovery_stopped_event, - !atomic_read(&ms->rh.recovery_in_flight)); - - if (log->type->postsuspend && log->type->postsuspend(log)) + if (log->type->suspend && log->type->suspend(log)) /* FIXME: need better error handling */ - DMWARN("log postsuspend failed"); + DMWARN("log suspend failed"); } static void mirror_resume(struct dm_target *ti) @@ -1690,32 +1193,27 @@ static void mirror_resume(struct dm_target *ti) static int mirror_status(struct dm_target *ti, status_type_t type, char *result, unsigned int maxlen) { - unsigned int m, sz = 0; + unsigned int m, sz; struct mirror_set *ms = (struct mirror_set *) ti->private; - char buffer[ms->nr_mirrors + 1]; + + sz = ms->rh.log->type->status(ms->rh.log, type, result, maxlen); switch (type) { case STATUSTYPE_INFO: DMEMIT("%d ", ms->nr_mirrors); - for (m = 0; m < ms->nr_mirrors; m++) { + for (m = 0; m < ms->nr_mirrors; m++) DMEMIT("%s ", ms->mirror[m].dev->name); - buffer[m] = atomic_read(&(ms->mirror[m].error_count)) ? - 'D' : 'A'; - } - buffer[m] = '\0'; - DMEMIT("%llu/%llu 1 %s ", + DMEMIT(SECTOR_FORMAT "/" SECTOR_FORMAT, ms->rh.log->type->get_sync_count(ms->rh.log), - ms->nr_regions, buffer); - ms->rh.log->type->status(ms->rh.log, type, result+sz, maxlen-sz); + ms->nr_regions); break; case STATUSTYPE_TABLE: - sz = ms->rh.log->type->status(ms->rh.log, type, result, maxlen); DMEMIT("%d ", ms->nr_mirrors); for (m = 0; m < ms->nr_mirrors; m++) - DMEMIT("%s %llu ", ms->mirror[m].dev->name, - (unsigned long long)ms->mirror[m].offset); + DMEMIT("%s " SECTOR_FORMAT " ", + ms->mirror[m].dev->name, ms->mirror[m].offset); } return 0; @@ -1723,13 +1221,12 @@ static int mirror_status(struct dm_target *ti, status_type_t type, static struct target_type mirror_target = { .name = "mirror", - .version = {1, 2, 0}, + .version = {1, 0, 1}, .module = THIS_MODULE, .ctr = mirror_ctr, .dtr = mirror_dtr, .map = mirror_map, .end_io = mirror_end_io, - .presuspend = mirror_presuspend, .postsuspend = mirror_postsuspend, .resume = mirror_resume, .status = mirror_status, @@ -1739,11 +1236,6 @@ static int __init dm_mirror_init(void) { int r; - bio_map_info_pool = mempool_create(100, bio_map_info_alloc, - bio_map_info_free, NULL); - if (!bio_map_info_pool) - return -ENOMEM; - r = dm_dirty_log_init(); if (r) return r; @@ -1752,7 +1244,7 @@ static int __init dm_mirror_init(void) if (!_kmirrord_wq) { DMERR("couldn't start kmirrord"); dm_dirty_log_exit(); - return -ENOMEM; + return r; } INIT_WORK(&_kmirrord_work, do_work, NULL); @@ -1762,15 +1254,6 @@ static int __init dm_mirror_init(void) mirror_target.name); dm_dirty_log_exit(); destroy_workqueue(_kmirrord_wq); - } else if (!dm_mirror_error_on_log_failure) { - DMWARN("Warning: dm_mirror_error_on_log_failure = 0"); - DMWARN("In this mode, the following fault sequence could cause corruption:"); - DMWARN(" 1) Log device failure"); - DMWARN(" 2) Write I/O issued"); - DMWARN(" 3) Machine failure"); - DMWARN(" 4) Log device restored"); - DMWARN(" 5) Machine reboots"); - DMWARN("If this happens, you must resync your mirror."); } return r; @@ -1792,8 +1275,6 @@ static void __exit dm_mirror_exit(void) module_init(dm_mirror_init); module_exit(dm_mirror_exit); -module_param(dm_mirror_error_on_log_failure, int, 1); -MODULE_PARM_DESC(dm_mirror_error_on_log_failure, "Set to '0' if you want writes to succeed on log device failure"); MODULE_DESCRIPTION(DM_NAME " mirror target"); MODULE_AUTHOR("Joe Thornber"); MODULE_LICENSE("GPL"); diff --git a/drivers/md/dm-round-robin.c b/drivers/md/dm-round-robin.c index c5a16c550..d0024865a 100644 --- a/drivers/md/dm-round-robin.c +++ b/drivers/md/dm-round-robin.c @@ -14,8 +14,6 @@ #include -#define DM_MSG_PREFIX "multipath round-robin" - /*----------------------------------------------------------------- * Path-handling code, paths are held in lists *---------------------------------------------------------------*/ @@ -193,9 +191,9 @@ static int __init dm_rr_init(void) int r = dm_register_path_selector(&rr_ps); if (r < 0) - DMERR("register failed %d", r); + DMERR("round-robin: register failed %d", r); - DMINFO("version 1.0.0 loaded"); + DMINFO("dm-round-robin version 1.0.0 loaded"); return r; } diff --git a/drivers/md/dm-snap.c b/drivers/md/dm-snap.c index 6578b260f..5487b7cca 100644 --- a/drivers/md/dm-snap.c +++ b/drivers/md/dm-snap.c @@ -7,6 +7,7 @@ */ #include +#include #include #include #include @@ -22,8 +23,6 @@ #include "dm-bio-list.h" #include "kcopyd.h" -#define DM_MSG_PREFIX "snapshots" - /* * The percentage increment we will wake up users at */ @@ -50,26 +49,11 @@ struct pending_exception { struct bio_list snapshot_bios; /* - * Short-term queue of pending exceptions prior to submission. - */ - struct list_head list; - - /* - * The primary pending_exception is the one that holds - * the sibling_count and the list of origin_bios for a - * group of pending_exceptions. It is always last to get freed. - * These fields get set up when writing to the origin. + * Other pending_exceptions that are processing this + * chunk. When this list is empty, we know we can + * complete the origins. */ - struct pending_exception *primary_pe; - - /* - * Number of pending_exceptions processing this chunk. - * When this drops to zero we must complete the origin bios. - * If incrementing or decrementing this, hold pe->snap->lock for - * the sibling concerned and not pe->primary_pe->snap->lock unless - * they are the same. - */ - atomic_t sibling_count; + struct list_head siblings; /* Pointer back to snapshot context */ struct dm_snapshot *snap; @@ -118,7 +102,7 @@ static int init_origin_hash(void) _origins = kmalloc(ORIGIN_HASH_SIZE * sizeof(struct list_head), GFP_KERNEL); if (!_origins) { - DMERR("unable to allocate memory"); + DMERR("Device mapper: Snapshot: unable to allocate memory"); return -ENOMEM; } @@ -393,8 +377,6 @@ static void read_snapshot_metadata(struct dm_snapshot *s) down_write(&s->lock); s->valid = 0; up_write(&s->lock); - - dm_table_event(s->table); } } @@ -413,7 +395,7 @@ static int snapshot_ctr(struct dm_target *ti, unsigned int argc, char **argv) int blocksize; if (argc < 4) { - ti->error = "requires exactly 4 arguments"; + ti->error = "dm-snapshot: requires exactly 4 arguments"; r = -EINVAL; goto bad1; } @@ -608,118 +590,78 @@ static void error_bios(struct bio *bio) } } -static inline void error_snapshot_bios(struct pending_exception *pe) -{ - error_bios(bio_list_get(&pe->snapshot_bios)); -} - static struct bio *__flush_bios(struct pending_exception *pe) { - /* - * If this pe is involved in a write to the origin and - * it is the last sibling to complete then release - * the bios for the original write to the origin. - */ + struct pending_exception *sibling; - if (pe->primary_pe && - atomic_dec_and_test(&pe->primary_pe->sibling_count)) - return bio_list_get(&pe->primary_pe->origin_bios); + if (list_empty(&pe->siblings)) + return bio_list_get(&pe->origin_bios); - return NULL; -} + sibling = list_entry(pe->siblings.next, + struct pending_exception, siblings); -static void __invalidate_snapshot(struct dm_snapshot *s, - struct pending_exception *pe, int err) -{ - if (!s->valid) - return; - - if (err == -EIO) - DMERR("Invalidating snapshot: Error reading/writing."); - else if (err == -ENOMEM) - DMERR("Invalidating snapshot: Unable to allocate exception."); - - if (pe) - remove_exception(&pe->e); - - if (s->store.drop_snapshot) - s->store.drop_snapshot(&s->store); + list_del(&pe->siblings); - s->valid = 0; + /* This is fine as long as kcopyd is single-threaded. If kcopyd + * becomes multi-threaded, we'll need some locking here. + */ + bio_list_merge(&sibling->origin_bios, &pe->origin_bios); - dm_table_event(s->table); + return NULL; } static void pending_complete(struct pending_exception *pe, int success) { struct exception *e; - struct pending_exception *primary_pe; struct dm_snapshot *s = pe->snap; struct bio *flush = NULL; - if (!success) { - /* Read/write error - snapshot is unusable */ - down_write(&s->lock); - __invalidate_snapshot(s, pe, -EIO); - flush = __flush_bios(pe); - up_write(&s->lock); - - error_snapshot_bios(pe); - goto out; - } + if (success) { + e = alloc_exception(); + if (!e) { + DMWARN("Unable to allocate exception."); + down_write(&s->lock); + s->store.drop_snapshot(&s->store); + s->valid = 0; + flush = __flush_bios(pe); + up_write(&s->lock); + + error_bios(bio_list_get(&pe->snapshot_bios)); + goto out; + } + *e = pe->e; - e = alloc_exception(); - if (!e) { + /* + * Add a proper exception, and remove the + * in-flight exception from the list. + */ down_write(&s->lock); - __invalidate_snapshot(s, pe, -ENOMEM); + insert_exception(&s->complete, e); + remove_exception(&pe->e); flush = __flush_bios(pe); - up_write(&s->lock); - error_snapshot_bios(pe); - goto out; - } - *e = pe->e; + /* Submit any pending write bios */ + up_write(&s->lock); - /* - * Add a proper exception, and remove the - * in-flight exception from the list. - */ - down_write(&s->lock); - if (!s->valid) { + flush_bios(bio_list_get(&pe->snapshot_bios)); + } else { + /* Read/write error - snapshot is unusable */ + down_write(&s->lock); + if (s->valid) + DMERR("Error reading/writing snapshot"); + s->store.drop_snapshot(&s->store); + s->valid = 0; + remove_exception(&pe->e); flush = __flush_bios(pe); up_write(&s->lock); - free_exception(e); + error_bios(bio_list_get(&pe->snapshot_bios)); - remove_exception(&pe->e); - error_snapshot_bios(pe); - goto out; + dm_table_event(s->table); } - insert_exception(&s->complete, e); - remove_exception(&pe->e); - flush = __flush_bios(pe); - - up_write(&s->lock); - - /* Submit any pending write bios */ - flush_bios(bio_list_get(&pe->snapshot_bios)); - out: - primary_pe = pe->primary_pe; - - /* - * Free the pe if it's not linked to an origin write or if - * it's not itself a primary pe. - */ - if (!primary_pe || primary_pe != pe) - free_pending_exception(pe); - - /* - * Free the primary pe if nothing references it. - */ - if (primary_pe && !atomic_read(&primary_pe->sibling_count)) - free_pending_exception(primary_pe); + free_pending_exception(pe); if (flush) flush_bios(flush); @@ -796,45 +738,38 @@ __find_pending_exception(struct dm_snapshot *s, struct bio *bio) if (e) { /* cast the exception to a pending exception */ pe = container_of(e, struct pending_exception, e); - goto out; - } - /* - * Create a new pending exception, we don't want - * to hold the lock while we do this. - */ - up_write(&s->lock); - pe = alloc_pending_exception(); - down_write(&s->lock); - - if (!s->valid) { - free_pending_exception(pe); - return NULL; - } + } else { + /* + * Create a new pending exception, we don't want + * to hold the lock while we do this. + */ + up_write(&s->lock); + pe = alloc_pending_exception(); + down_write(&s->lock); - e = lookup_exception(&s->pending, chunk); - if (e) { - free_pending_exception(pe); - pe = container_of(e, struct pending_exception, e); - goto out; - } + e = lookup_exception(&s->pending, chunk); + if (e) { + free_pending_exception(pe); + pe = container_of(e, struct pending_exception, e); + } else { + pe->e.old_chunk = chunk; + bio_list_init(&pe->origin_bios); + bio_list_init(&pe->snapshot_bios); + INIT_LIST_HEAD(&pe->siblings); + pe->snap = s; + pe->started = 0; + + if (s->store.prepare_exception(&s->store, &pe->e)) { + free_pending_exception(pe); + s->valid = 0; + return NULL; + } - pe->e.old_chunk = chunk; - bio_list_init(&pe->origin_bios); - bio_list_init(&pe->snapshot_bios); - pe->primary_pe = NULL; - atomic_set(&pe->sibling_count, 1); - pe->snap = s; - pe->started = 0; - - if (s->store.prepare_exception(&s->store, &pe->e)) { - free_pending_exception(pe); - return NULL; + insert_exception(&s->pending, &pe->e); + } } - insert_exception(&s->pending, &pe->e); - - out: return pe; } @@ -851,15 +786,13 @@ static int snapshot_map(struct dm_target *ti, struct bio *bio, { struct exception *e; struct dm_snapshot *s = (struct dm_snapshot *) ti->private; - int copy_needed = 0; int r = 1; chunk_t chunk; - struct pending_exception *pe = NULL; + struct pending_exception *pe; chunk = sector_to_chunk(s, bio->bi_sector); /* Full snapshots are not usable */ - /* To get here the table must be live so s->active is always set. */ if (!s->valid) return -EIO; @@ -877,41 +810,36 @@ static int snapshot_map(struct dm_target *ti, struct bio *bio, * to copy an exception */ down_write(&s->lock); - if (!s->valid) { - r = -EIO; - goto out_unlock; - } - /* If the block is already remapped - use that, else remap it */ e = lookup_exception(&s->complete, chunk); if (e) { remap_exception(s, e, bio); - goto out_unlock; - } - - pe = __find_pending_exception(s, bio); - if (!pe) { - __invalidate_snapshot(s, pe, -ENOMEM); - r = -EIO; - goto out_unlock; - } - - remap_exception(s, &pe->e, bio); - bio_list_add(&pe->snapshot_bios, bio); - - if (!pe->started) { - /* this is protected by snap->lock */ - pe->started = 1; - copy_needed = 1; + up_write(&s->lock); + + } else { + pe = __find_pending_exception(s, bio); + + if (!pe) { + if (s->store.drop_snapshot) + s->store.drop_snapshot(&s->store); + s->valid = 0; + r = -EIO; + up_write(&s->lock); + } else { + remap_exception(s, &pe->e, bio); + bio_list_add(&pe->snapshot_bios, bio); + + if (!pe->started) { + /* this is protected by snap->lock */ + pe->started = 1; + up_write(&s->lock); + start_copy(pe); + } else + up_write(&s->lock); + r = 0; + } } - r = 0; - - out_unlock: - up_write(&s->lock); - - if (copy_needed) - start_copy(pe); } else { /* * FIXME: this read path scares me because we @@ -923,11 +851,6 @@ static int snapshot_map(struct dm_target *ti, struct bio *bio, /* Do reads */ down_read(&s->lock); - if (!s->valid) { - up_read(&s->lock); - return -EIO; - } - /* See if it it has been remapped */ e = lookup_exception(&s->complete, chunk); if (e) @@ -965,9 +888,9 @@ static int snapshot_status(struct dm_target *ti, status_type_t type, snap->store.fraction_full(&snap->store, &numerator, &denominator); - snprintf(result, maxlen, "%llu/%llu", - (unsigned long long)numerator, - (unsigned long long)denominator); + snprintf(result, maxlen, + SECTOR_FORMAT "/" SECTOR_FORMAT, + numerator, denominator); } else snprintf(result, maxlen, "Unknown"); @@ -980,10 +903,9 @@ static int snapshot_status(struct dm_target *ti, status_type_t type, * to make private copies if the output is to * make sense. */ - snprintf(result, maxlen, "%s %s %c %llu", + snprintf(result, maxlen, "%s %s %c " SECTOR_FORMAT, snap->origin->name, snap->cow->name, - snap->type, - (unsigned long long)snap->chunk_size); + snap->type, snap->chunk_size); break; } @@ -993,27 +915,40 @@ static int snapshot_status(struct dm_target *ti, status_type_t type, /*----------------------------------------------------------------- * Origin methods *---------------------------------------------------------------*/ +static void list_merge(struct list_head *l1, struct list_head *l2) +{ + struct list_head *l1_n, *l2_p; + + l1_n = l1->next; + l2_p = l2->prev; + + l1->next = l2; + l2->prev = l1; + + l2_p->next = l1_n; + l1_n->prev = l2_p; +} + static int __origin_write(struct list_head *snapshots, struct bio *bio) { - int r = 1, first = 0; + int r = 1, first = 1; struct dm_snapshot *snap; struct exception *e; - struct pending_exception *pe, *next_pe, *primary_pe = NULL; + struct pending_exception *pe, *last = NULL; chunk_t chunk; - LIST_HEAD(pe_queue); /* Do all the snapshots on this origin */ list_for_each_entry (snap, snapshots, list) { - down_write(&snap->lock); - /* Only deal with valid and active snapshots */ if (!snap->valid || !snap->active) - goto next_snapshot; + continue; /* Nothing to do if writing beyond end of snapshot */ if (bio->bi_sector >= dm_table_get_size(snap->table)) - goto next_snapshot; + continue; + + down_write(&snap->lock); /* * Remember, different snapshots can have @@ -1025,75 +960,49 @@ static int __origin_write(struct list_head *snapshots, struct bio *bio) * Check exception table to see if block * is already remapped in this snapshot * and trigger an exception if not. - * - * sibling_count is initialised to 1 so pending_complete() - * won't destroy the primary_pe while we're inside this loop. */ e = lookup_exception(&snap->complete, chunk); - if (e) - goto next_snapshot; - - pe = __find_pending_exception(snap, bio); - if (!pe) { - __invalidate_snapshot(snap, pe, ENOMEM); - goto next_snapshot; - } - - if (!primary_pe) { - /* - * Either every pe here has same - * primary_pe or none has one yet. - */ - if (pe->primary_pe) - primary_pe = pe->primary_pe; - else { - primary_pe = pe; - first = 1; + if (!e) { + pe = __find_pending_exception(snap, bio); + if (!pe) { + snap->store.drop_snapshot(&snap->store); + snap->valid = 0; + + } else { + if (last) + list_merge(&pe->siblings, + &last->siblings); + + last = pe; + r = 0; } - - bio_list_add(&primary_pe->origin_bios, bio); - - r = 0; - } - - if (!pe->primary_pe) { - atomic_inc(&primary_pe->sibling_count); - pe->primary_pe = primary_pe; - } - - if (!pe->started) { - pe->started = 1; - list_add_tail(&pe->list, &pe_queue); } - next_snapshot: up_write(&snap->lock); } - if (!primary_pe) - goto out; - - /* - * If this is the first time we're processing this chunk and - * sibling_count is now 1 it means all the pending exceptions - * got completed while we were in the loop above, so it falls to - * us here to remove the primary_pe and submit any origin_bios. - */ - - if (first && atomic_dec_and_test(&primary_pe->sibling_count)) { - flush_bios(bio_list_get(&primary_pe->origin_bios)); - free_pending_exception(primary_pe); - /* If we got here, pe_queue is necessarily empty. */ - goto out; - } - /* * Now that we have a complete pe list we can start the copying. */ - list_for_each_entry_safe(pe, next_pe, &pe_queue, list) - start_copy(pe); + if (last) { + pe = last; + do { + down_write(&pe->snap->lock); + if (first) + bio_list_add(&pe->origin_bios, bio); + if (!pe->started) { + pe->started = 1; + up_write(&pe->snap->lock); + start_copy(pe); + } else + up_write(&pe->snap->lock); + first = 0; + pe = list_entry(pe->siblings.next, + struct pending_exception, siblings); + + } while (pe != last); + } - out: return r; } @@ -1129,7 +1038,7 @@ static int origin_ctr(struct dm_target *ti, unsigned int argc, char **argv) struct dm_dev *dev; if (argc != 1) { - ti->error = "origin: incorrect number of arguments"; + ti->error = "dm-origin: incorrect number of arguments"; return -EINVAL; } @@ -1238,7 +1147,7 @@ static int __init dm_snapshot_init(void) r = dm_register_target(&origin_target); if (r < 0) { - DMERR("Origin target register failed %d", r); + DMERR("Device mapper: Origin: register failed %d\n", r); goto bad1; } @@ -1269,7 +1178,8 @@ static int __init dm_snapshot_init(void) goto bad4; } - pending_pool = mempool_create_slab_pool(128, pending_cache); + pending_pool = mempool_create(128, mempool_alloc_slab, + mempool_free_slab, pending_cache); if (!pending_pool) { DMERR("Couldn't create pending pool."); r = -ENOMEM; diff --git a/drivers/md/dm-stripe.c b/drivers/md/dm-stripe.c index 6c29fcecd..697aacafb 100644 --- a/drivers/md/dm-stripe.c +++ b/drivers/md/dm-stripe.c @@ -12,8 +12,6 @@ #include #include -#define DM_MSG_PREFIX "striped" - struct stripe { struct dm_dev *dev; sector_t physical_start; @@ -51,9 +49,9 @@ static inline struct stripe_c *alloc_context(unsigned int stripes) static int get_stripe(struct dm_target *ti, struct stripe_c *sc, unsigned int stripe, char **argv) { - unsigned long long start; + sector_t start; - if (sscanf(argv[1], "%llu", &start) != 1) + if (sscanf(argv[1], SECTOR_FORMAT, &start) != 1) return -EINVAL; if (dm_get_device(ti, argv[0], start, sc->stripe_width, @@ -80,19 +78,19 @@ static int stripe_ctr(struct dm_target *ti, unsigned int argc, char **argv) unsigned int i; if (argc < 2) { - ti->error = "Not enough arguments"; + ti->error = "dm-stripe: Not enough arguments"; return -EINVAL; } stripes = simple_strtoul(argv[0], &end, 10); if (*end) { - ti->error = "Invalid stripe count"; + ti->error = "dm-stripe: Invalid stripe count"; return -EINVAL; } chunk_size = simple_strtoul(argv[1], &end, 10); if (*end) { - ti->error = "Invalid chunk_size"; + ti->error = "dm-stripe: Invalid chunk_size"; return -EINVAL; } @@ -101,19 +99,19 @@ static int stripe_ctr(struct dm_target *ti, unsigned int argc, char **argv) */ if (!chunk_size || (chunk_size & (chunk_size - 1)) || (chunk_size < (PAGE_SIZE >> SECTOR_SHIFT))) { - ti->error = "Invalid chunk size"; + ti->error = "dm-stripe: Invalid chunk size"; return -EINVAL; } - if (ti->len & (chunk_size - 1)) { - ti->error = "Target length not divisible by " + if (((uint32_t)ti->len) & (chunk_size - 1)) { + ti->error = "dm-stripe: Target length not divisible by " "chunk size"; return -EINVAL; } width = ti->len; if (sector_div(width, stripes)) { - ti->error = "Target length not divisible by " + ti->error = "dm-stripe: Target length not divisible by " "number of stripes"; return -EINVAL; } @@ -122,14 +120,14 @@ static int stripe_ctr(struct dm_target *ti, unsigned int argc, char **argv) * Do we have enough arguments for that many stripes ? */ if (argc != (2 + 2 * stripes)) { - ti->error = "Not enough destinations " + ti->error = "dm-stripe: Not enough destinations " "specified"; return -EINVAL; } sc = alloc_context(stripes); if (!sc) { - ti->error = "Memory allocation for striped context " + ti->error = "dm-stripe: Memory allocation for striped context " "failed"; return -ENOMEM; } @@ -151,7 +149,8 @@ static int stripe_ctr(struct dm_target *ti, unsigned int argc, char **argv) r = get_stripe(ti, sc, i, argv); if (r < 0) { - ti->error = "Couldn't parse stripe destination"; + ti->error = "dm-stripe: Couldn't parse stripe " + "destination"; while (i--) dm_put_device(ti, sc->stripe[i].dev); kfree(sc); @@ -202,11 +201,10 @@ static int stripe_status(struct dm_target *ti, break; case STATUSTYPE_TABLE: - DMEMIT("%d %llu", sc->stripes, - (unsigned long long)sc->chunk_mask + 1); + DMEMIT("%d " SECTOR_FORMAT, sc->stripes, sc->chunk_mask + 1); for (i = 0; i < sc->stripes; i++) - DMEMIT(" %s %llu", sc->stripe[i].dev->name, - (unsigned long long)sc->stripe[i].physical_start); + DMEMIT(" %s " SECTOR_FORMAT, sc->stripe[i].dev->name, + sc->stripe[i].physical_start); break; } return 0; @@ -228,7 +226,7 @@ int __init dm_stripe_init(void) r = dm_register_target(&stripe_target); if (r < 0) - DMWARN("target registration failed"); + DMWARN("striped target registration failed"); return r; } @@ -236,7 +234,7 @@ int __init dm_stripe_init(void) void dm_stripe_exit(void) { if (dm_unregister_target(&stripe_target)) - DMWARN("target unregistration failed"); + DMWARN("striped target unregistration failed"); return; } diff --git a/drivers/md/dm-table.c b/drivers/md/dm-table.c index 75fe9493e..9b1e2f5ca 100644 --- a/drivers/md/dm-table.c +++ b/drivers/md/dm-table.c @@ -14,18 +14,14 @@ #include #include #include -#include #include -#define DM_MSG_PREFIX "table" - #define MAX_DEPTH 16 #define NODE_SIZE L1_CACHE_BYTES #define KEYS_PER_NODE (NODE_SIZE / sizeof(sector_t)) #define CHILDREN_PER_NODE (KEYS_PER_NODE + 1) struct dm_table { - struct mapped_device *md; atomic_t holders; /* btree table */ @@ -101,8 +97,6 @@ static void combine_restrictions_low(struct io_restrictions *lhs, lhs->seg_boundary_mask = min_not_zero(lhs->seg_boundary_mask, rhs->seg_boundary_mask); - - lhs->no_cluster |= rhs->no_cluster; } /* @@ -210,8 +204,7 @@ static int alloc_targets(struct dm_table *t, unsigned int num) return 0; } -int dm_table_create(struct dm_table **result, int mode, - unsigned num_targets, struct mapped_device *md) +int dm_table_create(struct dm_table **result, int mode, unsigned num_targets) { struct dm_table *t = kmalloc(sizeof(*t), GFP_KERNEL); @@ -234,49 +227,10 @@ int dm_table_create(struct dm_table **result, int mode, } t->mode = mode; - t->md = md; *result = t; return 0; } -int dm_create_error_table(struct dm_table **result, struct mapped_device *md) -{ - struct dm_table *t; - sector_t dev_size = 1; - int r; - - /* - * Find current size of device. - * Default to 1 sector if inactive. - */ - t = dm_get_table(md); - if (t) { - dev_size = dm_table_get_size(t); - dm_table_put(t); - } - - r = dm_table_create(&t, FMODE_READ, 1, md); - if (r) - return r; - - r = dm_table_add_target(t, "error", 0, dev_size, NULL); - if (r) - goto out; - - r = dm_table_complete(t); - if (r) - goto out; - - *result = t; - -out: - if (r) - dm_table_put(t); - - return r; -} -EXPORT_SYMBOL_GPL(dm_create_error_table); - static void free_devices(struct list_head *devices) { struct list_head *tmp, *next; @@ -391,19 +345,20 @@ static struct dm_dev *find_device(struct list_head *l, dev_t dev) /* * Open a device so we can use it as a map destination. */ -static int open_dev(struct dm_dev *d, dev_t dev, struct mapped_device *md) +static int open_dev(struct dm_dev *d, dev_t dev) { static char *_claim_ptr = "I belong to device-mapper"; struct block_device *bdev; int r; - BUG_ON(d->bdev); + if (d->bdev) + BUG(); bdev = open_by_devnum(dev, d->mode); if (IS_ERR(bdev)) return PTR_ERR(bdev); - r = bd_claim_by_disk(bdev, _claim_ptr, dm_disk(md)); + r = bd_claim(bdev, _claim_ptr); if (r) blkdev_put(bdev); else @@ -414,12 +369,12 @@ static int open_dev(struct dm_dev *d, dev_t dev, struct mapped_device *md) /* * Close a device that we've been using. */ -static void close_dev(struct dm_dev *d, struct mapped_device *md) +static void close_dev(struct dm_dev *d) { if (!d->bdev) return; - bd_release_from_disk(d->bdev, dm_disk(md)); + bd_release(d->bdev); blkdev_put(d->bdev); d->bdev = NULL; } @@ -440,7 +395,7 @@ static int check_device_area(struct dm_dev *dd, sector_t start, sector_t len) * careful to leave things as they were if we fail to reopen the * device. */ -static int upgrade_mode(struct dm_dev *dd, int new_mode, struct mapped_device *md) +static int upgrade_mode(struct dm_dev *dd, int new_mode) { int r; struct dm_dev dd_copy; @@ -450,9 +405,9 @@ static int upgrade_mode(struct dm_dev *dd, int new_mode, struct mapped_device *m dd->mode |= new_mode; dd->bdev = NULL; - r = open_dev(dd, dev, md); + r = open_dev(dd, dev); if (!r) - close_dev(&dd_copy, md); + close_dev(&dd_copy); else *dd = dd_copy; @@ -472,7 +427,8 @@ static int __table_get_device(struct dm_table *t, struct dm_target *ti, struct dm_dev *dd; unsigned int major, minor; - BUG_ON(!t); + if (!t) + BUG(); if (sscanf(path, "%u:%u", &major, &minor) == 2) { /* Extract the major/minor numbers */ @@ -494,7 +450,7 @@ static int __table_get_device(struct dm_table *t, struct dm_target *ti, dd->mode = mode; dd->bdev = NULL; - if ((r = open_dev(dd, dev, t->md))) { + if ((r = open_dev(dd, dev))) { kfree(dd); return r; } @@ -505,7 +461,7 @@ static int __table_get_device(struct dm_table *t, struct dm_target *ti, list_add(&dd->list, &t->devices); } else if (dd->mode != (mode | dd->mode)) { - r = upgrade_mode(dd, mode, t->md); + r = upgrade_mode(dd, mode); if (r) return r; } @@ -569,8 +525,6 @@ int dm_get_device(struct dm_target *ti, const char *path, sector_t start, rs->seg_boundary_mask = min_not_zero(rs->seg_boundary_mask, q->seg_boundary_mask); - - rs->no_cluster |= !test_bit(QUEUE_FLAG_CLUSTER, &q->queue_flags); } return r; @@ -582,7 +536,7 @@ int dm_get_device(struct dm_target *ti, const char *path, sector_t start, void dm_put_device(struct dm_target *ti, struct dm_dev *dd) { if (atomic_dec_and_test(&dd->count)) { - close_dev(dd, ti->table->md); + close_dev(dd); list_del(&dd->list); kfree(dd); } @@ -630,12 +584,6 @@ int dm_split_args(int *argc, char ***argvp, char *input) unsigned array_size = 0; *argc = 0; - - if (!input) { - *argvp = NULL; - return 0; - } - argv = realloc_argv(&array_size, argv); if (!argv) return -ENOMEM; @@ -717,14 +665,15 @@ int dm_table_add_target(struct dm_table *t, const char *type, memset(tgt, 0, sizeof(*tgt)); if (!len) { - DMERR("%s: zero-length target", dm_device_name(t->md)); + tgt->error = "zero-length target"; + DMERR("%s", tgt->error); return -EINVAL; } tgt->type = dm_get_target_type(type); if (!tgt->type) { - DMERR("%s: %s: unknown target type", dm_device_name(t->md), - type); + tgt->error = "unknown target type"; + DMERR("%s", tgt->error); return -EINVAL; } @@ -761,7 +710,7 @@ int dm_table_add_target(struct dm_table *t, const char *type, return 0; bad: - DMERR("%s: %s: %s", dm_device_name(t->md), type, tgt->error); + DMERR("%s", tgt->error); dm_put_target_type(tgt->type); return r; } @@ -816,14 +765,14 @@ int dm_table_complete(struct dm_table *t) return r; } -static DEFINE_MUTEX(_event_lock); +static DECLARE_MUTEX(_event_lock); void dm_table_event_callback(struct dm_table *t, void (*fn)(void *), void *context) { - mutex_lock(&_event_lock); + down(&_event_lock); t->event_fn = fn; t->event_context = context; - mutex_unlock(&_event_lock); + up(&_event_lock); } void dm_table_event(struct dm_table *t) @@ -834,10 +783,10 @@ void dm_table_event(struct dm_table *t) */ BUG_ON(in_interrupt()); - mutex_lock(&_event_lock); + down(&_event_lock); if (t->event_fn) t->event_fn(t->event_context); - mutex_unlock(&_event_lock); + up(&_event_lock); } sector_t dm_table_get_size(struct dm_table *t) @@ -847,7 +796,7 @@ sector_t dm_table_get_size(struct dm_table *t) struct dm_target *dm_table_get_target(struct dm_table *t, unsigned int index) { - if (index >= t->num_targets) + if (index > t->num_targets) return NULL; return t->targets + index; @@ -885,11 +834,6 @@ void dm_table_set_restrictions(struct dm_table *t, struct request_queue *q) q->hardsect_size = t->limits.hardsect_size; q->max_segment_size = t->limits.max_segment_size; q->seg_boundary_mask = t->limits.seg_boundary_mask; - if (t->limits.no_cluster) - q->queue_flags &= ~(1 << QUEUE_FLAG_CLUSTER); - else - q->queue_flags |= (1 << QUEUE_FLAG_CLUSTER); - } unsigned int dm_table_get_num_targets(struct dm_table *t) @@ -1001,20 +945,12 @@ int dm_table_flush_all(struct dm_table *t) return ret; } -struct mapped_device *dm_table_get_md(struct dm_table *t) -{ - dm_get(t->md); - - return t->md; -} - EXPORT_SYMBOL(dm_vcalloc); EXPORT_SYMBOL(dm_get_device); EXPORT_SYMBOL(dm_put_device); EXPORT_SYMBOL(dm_table_event); EXPORT_SYMBOL(dm_table_get_size); EXPORT_SYMBOL(dm_table_get_mode); -EXPORT_SYMBOL(dm_table_get_md); EXPORT_SYMBOL(dm_table_put); EXPORT_SYMBOL(dm_table_get); EXPORT_SYMBOL(dm_table_unplug_all); diff --git a/drivers/md/dm-target.c b/drivers/md/dm-target.c index 477a041a4..aecd9e0c2 100644 --- a/drivers/md/dm-target.c +++ b/drivers/md/dm-target.c @@ -12,8 +12,6 @@ #include #include -#define DM_MSG_PREFIX "target" - struct tt_internal { struct target_type tt; @@ -80,7 +78,8 @@ void dm_put_target_type(struct target_type *t) if (--ti->use == 0) module_put(ti->tt.module); - BUG_ON(ti->use < 0); + if (ti->use < 0) + BUG(); up_read(&_lock); return; diff --git a/drivers/md/dm-zero.c b/drivers/md/dm-zero.c index ea569f734..51c0639b2 100644 --- a/drivers/md/dm-zero.c +++ b/drivers/md/dm-zero.c @@ -10,15 +10,13 @@ #include #include -#define DM_MSG_PREFIX "zero" - /* * Construct a dummy mapping that only returns zeros */ static int zero_ctr(struct dm_target *ti, unsigned int argc, char **argv) { if (argc != 0) { - ti->error = "No arguments required"; + ti->error = "dm-zero: No arguments required"; return -EINVAL; } @@ -62,7 +60,7 @@ static int __init dm_zero_init(void) int r = dm_register_target(&zero_target); if (r < 0) - DMERR("register failed %d", r); + DMERR("zero: register failed %d", r); return r; } @@ -72,7 +70,7 @@ static void __exit dm_zero_exit(void) int r = dm_unregister_target(&zero_target); if (r < 0) - DMERR("unregister failed %d", r); + DMERR("zero: unregister failed %d", r); } module_init(dm_zero_init) diff --git a/drivers/md/dm.c b/drivers/md/dm.c index c99bf9f01..973b6f6ff 100644 --- a/drivers/md/dm.c +++ b/drivers/md/dm.c @@ -1,6 +1,6 @@ /* * Copyright (C) 2001, 2002 Sistina Software (UK) Limited. - * Copyright (C) 2004-2006 Red Hat, Inc. All rights reserved. + * Copyright (C) 2004 Red Hat, Inc. All rights reserved. * * This file is released under the GPL. */ @@ -10,7 +10,6 @@ #include #include -#include #include #include #include @@ -18,17 +17,12 @@ #include #include #include -#include -#include - -#define DM_MSG_PREFIX "core" static const char *_name = DM_NAME; static unsigned int major = 0; static unsigned int _major = 0; -static DEFINE_SPINLOCK(_minor_lock); /* * One of these is allocated per bio. */ @@ -52,34 +46,28 @@ struct target_io { union map_info *dm_get_mapinfo(struct bio *bio) { - if (bio && bio->bi_private) - return &((struct target_io *)bio->bi_private)->info; - return NULL; + if (bio && bio->bi_private) + return &((struct target_io *)bio->bi_private)->info; + return NULL; } -#define MINOR_ALLOCED ((void *)-1) - /* * Bits for the md->flags field. */ #define DMF_BLOCK_IO 0 #define DMF_SUSPENDED 1 #define DMF_FROZEN 2 -#define DMF_FREEING 3 -#define DMF_DELETING 4 struct mapped_device { struct rw_semaphore io_lock; struct semaphore suspend_lock; rwlock_t map_lock; atomic_t holders; - atomic_t open_count; unsigned long flags; request_queue_t *queue; struct gendisk *disk; - char name[16]; void *interface_ptr; @@ -112,9 +100,6 @@ struct mapped_device { */ struct super_block *frozen_sb; struct block_device *suspended_bdev; - - /* forced geometry settings */ - struct hd_geometry geometry; }; #define MIN_IOS 256 @@ -167,7 +152,7 @@ static void local_exit(void) bioset_free(dm_set); if (unregister_blkdev(_major, _name) < 0) - DMERR("unregister_blkdev failed"); + DMERR("devfs_unregister_blkdev failed"); _major = 0; @@ -226,25 +211,9 @@ static int dm_blk_open(struct inode *inode, struct file *file) { struct mapped_device *md; - spin_lock(&_minor_lock); - md = inode->i_bdev->bd_disk->private_data; - if (!md) - goto out; - - if (test_bit(DMF_FREEING, &md->flags) || - test_bit(DMF_DELETING, &md->flags)) { - md = NULL; - goto out; - } - dm_get(md); - atomic_inc(&md->open_count); - -out: - spin_unlock(&_minor_lock); - - return md ? 0 : -ENXIO; + return 0; } static int dm_blk_close(struct inode *inode, struct file *file) @@ -252,42 +221,10 @@ static int dm_blk_close(struct inode *inode, struct file *file) struct mapped_device *md; md = inode->i_bdev->bd_disk->private_data; - atomic_dec(&md->open_count); dm_put(md); return 0; } -int dm_open_count(struct mapped_device *md) -{ - return atomic_read(&md->open_count); -} - -/* - * Guarantees nothing is using the device before it's deleted. - */ -int dm_lock_for_deletion(struct mapped_device *md) -{ - int r = 0; - - spin_lock(&_minor_lock); - - if (dm_open_count(md)) - r = -EBUSY; - else - set_bit(DMF_DELETING, &md->flags); - - spin_unlock(&_minor_lock); - - return r; -} - -static int dm_blk_getgeo(struct block_device *bdev, struct hd_geometry *geo) -{ - struct mapped_device *md = bdev->bd_disk->private_data; - - return dm_get_geometry(md, geo); -} - static inline struct dm_io *alloc_io(struct mapped_device *md) { return mempool_alloc(md->io_pool, GFP_NOIO); @@ -374,33 +311,6 @@ struct dm_table *dm_get_table(struct mapped_device *md) return t; } -/* - * Get the geometry associated with a dm device - */ -int dm_get_geometry(struct mapped_device *md, struct hd_geometry *geo) -{ - *geo = md->geometry; - - return 0; -} - -/* - * Set the geometry of a device. - */ -int dm_set_geometry(struct mapped_device *md, struct hd_geometry *geo) -{ - sector_t sz = (sector_t)geo->cylinders * geo->heads * geo->sectors; - - if (geo->start > sz) { - DMWARN("Start sector is beyond the geometry limits."); - return -EINVAL; - } - - md->geometry = *geo; - - return 0; -} - /*----------------------------------------------------------------- * CRUD START: * A more elegant soln is in the works that uses the queue @@ -424,8 +334,6 @@ static void dec_pending(struct dm_io *io, int error) /* nudge anyone waiting on suspend queue */ wake_up(&io->md->wait); - blk_add_trace_bio(io->md->queue, io->bio, BLK_TA_COMPLETE); - bio_endio(io->bio, io->bio->bi_size, io->error); free_io(io->md, io); } @@ -484,7 +392,6 @@ static void __map_bio(struct dm_target *ti, struct bio *clone, struct target_io *tio) { int r; - sector_t sector; /* * Sanity checks. @@ -500,17 +407,10 @@ static void __map_bio(struct dm_target *ti, struct bio *clone, * this io. */ atomic_inc(&tio->io->io_count); - sector = clone->bi_sector; r = ti->type->map(ti, clone, &tio->info); - if (r > 0) { + if (r > 0) /* the bio has been remapped so dispatch it */ - - blk_add_trace_remap(bdev_get_queue(clone->bi_bdev), clone, - tio->io->bio->bi_bdev->bd_dev, sector, - clone->bi_sector); - generic_make_request(clone); - } else if (r < 0) { /* error the io and bail out */ @@ -793,39 +693,43 @@ static int dm_any_congested(void *congested_data, int bdi_bits) /*----------------------------------------------------------------- * An IDR is used to keep track of allocated minor numbers. *---------------------------------------------------------------*/ +static DECLARE_MUTEX(_minor_lock); static DEFINE_IDR(_minor_idr); -static void free_minor(int minor) +static void free_minor(unsigned int minor) { - spin_lock(&_minor_lock); + down(&_minor_lock); idr_remove(&_minor_idr, minor); - spin_unlock(&_minor_lock); + up(&_minor_lock); } /* * See if the device with a specific minor # is free. */ -static int specific_minor(struct mapped_device *md, int minor) +static int specific_minor(struct mapped_device *md, unsigned int minor) { int r, m; if (minor >= (1 << MINORBITS)) return -EINVAL; - r = idr_pre_get(&_minor_idr, GFP_KERNEL); - if (!r) - return -ENOMEM; - - spin_lock(&_minor_lock); + down(&_minor_lock); if (idr_find(&_minor_idr, minor)) { r = -EBUSY; goto out; } - r = idr_get_new_above(&_minor_idr, MINOR_ALLOCED, minor, &m); - if (r) + r = idr_pre_get(&_minor_idr, GFP_KERNEL); + if (!r) { + r = -ENOMEM; + goto out; + } + + r = idr_get_new_above(&_minor_idr, md, minor, &m); + if (r) { goto out; + } if (m != minor) { idr_remove(&_minor_idr, m); @@ -834,21 +738,24 @@ static int specific_minor(struct mapped_device *md, int minor) } out: - spin_unlock(&_minor_lock); + up(&_minor_lock); return r; } -static int next_free_minor(struct mapped_device *md, int *minor) +static int next_free_minor(struct mapped_device *md, unsigned int *minor) { - int r, m; + int r; + unsigned int m; - r = idr_pre_get(&_minor_idr, GFP_KERNEL); - if (!r) - return -ENOMEM; + down(&_minor_lock); - spin_lock(&_minor_lock); + r = idr_pre_get(&_minor_idr, GFP_KERNEL); + if (!r) { + r = -ENOMEM; + goto out; + } - r = idr_get_new(&_minor_idr, MINOR_ALLOCED, &m); + r = idr_get_new(&_minor_idr, md, &m); if (r) { goto out; } @@ -862,7 +769,7 @@ static int next_free_minor(struct mapped_device *md, int *minor) *minor = m; out: - spin_unlock(&_minor_lock); + up(&_minor_lock); return r; } @@ -871,11 +778,10 @@ static struct block_device_operations dm_blk_dops; /* * Allocate and initialise a blank device with a given minor. */ -static struct mapped_device *alloc_dev(int minor) +static struct mapped_device *alloc_dev(unsigned int minor, int persistent) { int r; struct mapped_device *md = kmalloc(sizeof(*md), GFP_KERNEL); - void *old_md; if (!md) { DMWARN("unable to allocate device, out of memory."); @@ -886,10 +792,7 @@ static struct mapped_device *alloc_dev(int minor) goto bad0; /* get a minor number for the dev */ - if (minor == DM_ANY_MINOR) - r = next_free_minor(md, &minor); - else - r = specific_minor(md, minor); + r = persistent ? specific_minor(md, minor) : next_free_minor(md, &minor); if (r < 0) goto bad1; @@ -898,7 +801,6 @@ static struct mapped_device *alloc_dev(int minor) init_MUTEX(&md->suspend_lock); rwlock_init(&md->map_lock); atomic_set(&md->holders, 1); - atomic_set(&md->open_count, 0); atomic_set(&md->event_nr, 0); md->queue = blk_alloc_queue(GFP_KERNEL); @@ -913,11 +815,13 @@ static struct mapped_device *alloc_dev(int minor) md->queue->unplug_fn = dm_unplug_all; md->queue->issue_flush_fn = dm_flush_all; - md->io_pool = mempool_create_slab_pool(MIN_IOS, _io_cache); + md->io_pool = mempool_create(MIN_IOS, mempool_alloc_slab, + mempool_free_slab, _io_cache); if (!md->io_pool) goto bad2; - md->tio_pool = mempool_create_slab_pool(MIN_IOS, _tio_cache); + md->tio_pool = mempool_create(MIN_IOS, mempool_alloc_slab, + mempool_free_slab, _tio_cache); if (!md->tio_pool) goto bad3; @@ -925,10 +829,6 @@ static struct mapped_device *alloc_dev(int minor) if (!md->disk) goto bad4; - atomic_set(&md->pending, 0); - init_waitqueue_head(&md->wait); - init_waitqueue_head(&md->eventq); - md->disk->major = _major; md->disk->first_minor = minor; md->disk->fops = &dm_blk_dops; @@ -936,14 +836,10 @@ static struct mapped_device *alloc_dev(int minor) md->disk->private_data = md; sprintf(md->disk->disk_name, "dm-%d", minor); add_disk(md->disk); - format_dev_t(md->name, MKDEV(_major, minor)); - /* Populate the mapping, nobody knows we exist yet */ - spin_lock(&_minor_lock); - old_md = idr_replace(&_minor_idr, md, minor); - spin_unlock(&_minor_lock); - - BUG_ON(old_md != MINOR_ALLOCED); + atomic_set(&md->pending, 0); + init_waitqueue_head(&md->wait); + init_waitqueue_head(&md->eventq); return md; @@ -952,7 +848,7 @@ static struct mapped_device *alloc_dev(int minor) bad3: mempool_destroy(md->io_pool); bad2: - blk_cleanup_queue(md->queue); + blk_put_queue(md->queue); free_minor(minor); bad1: module_put(THIS_MODULE); @@ -963,7 +859,7 @@ static struct mapped_device *alloc_dev(int minor) static void free_dev(struct mapped_device *md) { - int minor = md->disk->first_minor; + unsigned int minor = md->disk->first_minor; if (md->suspended_bdev) { thaw_bdev(md->suspended_bdev, NULL); @@ -973,13 +869,8 @@ static void free_dev(struct mapped_device *md) mempool_destroy(md->io_pool); del_gendisk(md->disk); free_minor(minor); - - spin_lock(&_minor_lock); - md->disk->private_data = NULL; - spin_unlock(&_minor_lock); - put_disk(md->disk); - blk_cleanup_queue(md->queue); + blk_put_queue(md->queue); module_put(THIS_MODULE); kfree(md); } @@ -1010,13 +901,6 @@ static int __bind(struct mapped_device *md, struct dm_table *t) sector_t size; size = dm_table_get_size(t); - - /* - * Wipe any geometry if the size of the table changed. - */ - if (size != get_capacity(md->disk)) - memset(&md->geometry, 0, sizeof(md->geometry)); - __set_size(md, size); if (size == 0) return 0; @@ -1049,11 +933,12 @@ static void __unbind(struct mapped_device *md) /* * Constructor for a new device. */ -int dm_create(int minor, struct mapped_device **result) +static int create_aux(unsigned int minor, int persistent, + struct mapped_device **result) { struct mapped_device *md; - md = alloc_dev(minor); + md = alloc_dev(minor, persistent); if (!md) return -ENXIO; @@ -1061,6 +946,16 @@ int dm_create(int minor, struct mapped_device **result) return 0; } +int dm_create(struct mapped_device **result) +{ + return create_aux(0, 0, result); +} + +int dm_create_with_minor(unsigned int minor, struct mapped_device **result) +{ + return create_aux(minor, 1, result); +} + static struct mapped_device *dm_find_md(dev_t dev) { struct mapped_device *md; @@ -1069,18 +964,13 @@ static struct mapped_device *dm_find_md(dev_t dev) if (MAJOR(dev) != _major || minor >= (1 << MINORBITS)) return NULL; - spin_lock(&_minor_lock); + down(&_minor_lock); md = idr_find(&_minor_idr, minor); - if (md && (md == MINOR_ALLOCED || - (dm_disk(md)->first_minor != minor) || - test_bit(DMF_FREEING, &md->flags))) { + if (!md || (dm_disk(md)->first_minor != minor)) md = NULL; - goto out; - } -out: - spin_unlock(&_minor_lock); + up(&_minor_lock); return md; } @@ -1095,9 +985,15 @@ struct mapped_device *dm_get_md(dev_t dev) return md; } -void *dm_get_mdptr(struct mapped_device *md) +void *dm_get_mdptr(dev_t dev) { - return md->interface_ptr; + struct mapped_device *md; + void *mdptr = NULL; + + md = dm_find_md(dev); + if (md) + mdptr = md->interface_ptr; + return mdptr; } void dm_set_mdptr(struct mapped_device *md, void *ptr) @@ -1110,31 +1006,20 @@ void dm_get(struct mapped_device *md) atomic_inc(&md->holders); } -const char *dm_device_name(struct mapped_device *md) -{ - return md->name; -} -EXPORT_SYMBOL_GPL(dm_device_name); - void dm_put(struct mapped_device *md) { - struct dm_table *map; - - BUG_ON(test_bit(DMF_FREEING, &md->flags)); + struct dm_table *map = dm_get_table(md); - if (atomic_dec_and_lock(&md->holders, &_minor_lock)) { - map = dm_get_table(md); - idr_replace(&_minor_idr, MINOR_ALLOCED, dm_disk(md)->first_minor); - set_bit(DMF_FREEING, &md->flags); - spin_unlock(&_minor_lock); + if (atomic_dec_and_test(&md->holders)) { if (!dm_suspended(md)) { dm_table_presuspend_targets(map); dm_table_postsuspend_targets(map); } __unbind(md); - dm_table_put(map); free_dev(md); } + + dm_table_put(map); } /* @@ -1377,7 +1262,6 @@ int dm_suspended(struct mapped_device *md) static struct block_device_operations dm_blk_dops = { .open = dm_blk_open, .release = dm_blk_close, - .getgeo = dm_blk_getgeo, .owner = THIS_MODULE }; diff --git a/drivers/md/dm.h b/drivers/md/dm.h index 3c03c0eca..4eaf075da 100644 --- a/drivers/md/dm.h +++ b/drivers/md/dm.h @@ -2,7 +2,7 @@ * Internal header file for device mapper * * Copyright (C) 2001, 2002 Sistina Software - * Copyright (C) 2004-2006 Red Hat, Inc. All rights reserved. + * Copyright (C) 2004 Red Hat, Inc. All rights reserved. * * This file is released under the LGPL. */ @@ -14,17 +14,25 @@ #include #include #include -#include #define DM_NAME "device-mapper" - -#define DMERR(f, arg...) printk(KERN_ERR DM_NAME ": " DM_MSG_PREFIX ": " f "\n", ## arg) -#define DMWARN(f, arg...) printk(KERN_WARNING DM_NAME ": " DM_MSG_PREFIX ": " f "\n", ## arg) -#define DMINFO(f, arg...) printk(KERN_INFO DM_NAME ": " DM_MSG_PREFIX ": " f "\n", ## arg) +#define DMWARN(f, x...) printk(KERN_WARNING DM_NAME ": " f "\n" , ## x) +#define DMERR(f, x...) printk(KERN_ERR DM_NAME ": " f "\n" , ## x) +#define DMINFO(f, x...) printk(KERN_INFO DM_NAME ": " f "\n" , ## x) #define DMEMIT(x...) sz += ((sz >= maxlen) ? \ 0 : scnprintf(result + sz, maxlen - sz, x)) +/* + * FIXME: I think this should be with the definition of sector_t + * in types.h. + */ +#ifdef CONFIG_LBD +#define SECTOR_FORMAT "%llu" +#else +#define SECTOR_FORMAT "%lu" +#endif + #define SECTOR_SHIFT 9 /* @@ -40,16 +48,75 @@ struct dm_dev { }; struct dm_table; +struct mapped_device; /*----------------------------------------------------------------- - * Internal table functions. + * Functions for manipulating a struct mapped_device. + * Drop the reference with dm_put when you finish with the object. *---------------------------------------------------------------*/ +int dm_create(struct mapped_device **md); +int dm_create_with_minor(unsigned int minor, struct mapped_device **md); +void dm_set_mdptr(struct mapped_device *md, void *ptr); +void *dm_get_mdptr(dev_t dev); +struct mapped_device *dm_get_md(dev_t dev); + +/* + * Reference counting for md. + */ +void dm_get(struct mapped_device *md); +void dm_put(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); + +/* + * The device must be suspended before calling this method. + */ +int dm_swap_table(struct mapped_device *md, struct dm_table *t); + +/* + * Drop a reference on the table when you've finished with the + * result. + */ +struct dm_table *dm_get_table(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. + */ +struct gendisk *dm_disk(struct mapped_device *md); +int dm_suspended(struct mapped_device *md); + +/*----------------------------------------------------------------- + * Functions for manipulating a table. Tables are also reference + * counted. + *---------------------------------------------------------------*/ +int dm_table_create(struct dm_table **result, int mode, unsigned num_targets); + +void dm_table_get(struct dm_table *t); +void dm_table_put(struct dm_table *t); + +int dm_table_add_target(struct dm_table *t, const char *type, + sector_t start, sector_t len, char *params); +int dm_table_complete(struct dm_table *t); void dm_table_event_callback(struct dm_table *t, void (*fn)(void *), void *context); +void dm_table_event(struct dm_table *t); +sector_t dm_table_get_size(struct dm_table *t); struct dm_target *dm_table_get_target(struct dm_table *t, unsigned int index); struct dm_target *dm_table_find_target(struct dm_table *t, sector_t sector); void dm_table_set_restrictions(struct dm_table *t, struct request_queue *q); +unsigned int dm_table_get_num_targets(struct dm_table *t); struct list_head *dm_table_get_devices(struct dm_table *t); +int dm_table_get_mode(struct dm_table *t); void dm_table_presuspend_targets(struct dm_table *t); void dm_table_postsuspend_targets(struct dm_table *t); void dm_table_resume_targets(struct dm_table *t); @@ -67,6 +134,7 @@ void dm_put_target_type(struct target_type *t); int dm_target_iterate(void (*iter_func)(struct target_type *tt, void *param), void *param); + /*----------------------------------------------------------------- * Useful inlines. *---------------------------------------------------------------*/ @@ -124,7 +192,5 @@ void dm_stripe_exit(void); void *dm_vcalloc(unsigned long nmemb, unsigned long elem_size); union map_info *dm_get_mapinfo(struct bio *bio); -int dm_open_count(struct mapped_device *md); -int dm_lock_for_deletion(struct mapped_device *md); #endif diff --git a/drivers/md/kcopyd.c b/drivers/md/kcopyd.c index f1db6eff4..fc009cb39 100644 --- a/drivers/md/kcopyd.c +++ b/drivers/md/kcopyd.c @@ -12,6 +12,7 @@ #include #include +#include #include #include #include @@ -21,7 +22,6 @@ #include #include #include -#include #include "kcopyd.h" @@ -230,7 +230,8 @@ static int jobs_init(void) if (!_job_cache) return -ENOMEM; - _job_pool = mempool_create_slab_pool(MIN_JOBS, _job_cache); + _job_pool = mempool_create(MIN_JOBS, mempool_alloc_slab, + mempool_free_slab, _job_cache); if (!_job_pool) { kmem_cache_destroy(_job_cache); return -ENOMEM; @@ -313,7 +314,7 @@ static void complete_io(unsigned long error, void *context) if (error) { if (job->rw == WRITE) - job->write_err |= error; + job->write_err &= error; else job->read_err = 1; @@ -459,7 +460,7 @@ static void segment_complete(int read_err, job->read_err = 1; if (write_err) - job->write_err |= write_err; + job->write_err &= write_err; /* * Only dispatch more work if there hasn't been an error. @@ -581,68 +582,68 @@ int kcopyd_cancel(struct kcopyd_job *job, int block) /*----------------------------------------------------------------- * Unit setup *---------------------------------------------------------------*/ -static DEFINE_MUTEX(_client_lock); +static DECLARE_MUTEX(_client_lock); static LIST_HEAD(_clients); static void client_add(struct kcopyd_client *kc) { - mutex_lock(&_client_lock); + down(&_client_lock); list_add(&kc->list, &_clients); - mutex_unlock(&_client_lock); + up(&_client_lock); } static void client_del(struct kcopyd_client *kc) { - mutex_lock(&_client_lock); + down(&_client_lock); list_del(&kc->list); - mutex_unlock(&_client_lock); + up(&_client_lock); } -static DEFINE_MUTEX(kcopyd_init_lock); +static DECLARE_MUTEX(kcopyd_init_lock); static int kcopyd_clients = 0; static int kcopyd_init(void) { int r; - mutex_lock(&kcopyd_init_lock); + down(&kcopyd_init_lock); if (kcopyd_clients) { /* Already initialized. */ kcopyd_clients++; - mutex_unlock(&kcopyd_init_lock); + up(&kcopyd_init_lock); return 0; } r = jobs_init(); if (r) { - mutex_unlock(&kcopyd_init_lock); + up(&kcopyd_init_lock); return r; } _kcopyd_wq = create_singlethread_workqueue("kcopyd"); if (!_kcopyd_wq) { jobs_exit(); - mutex_unlock(&kcopyd_init_lock); + up(&kcopyd_init_lock); return -ENOMEM; } kcopyd_clients++; INIT_WORK(&_kcopyd_work, do_work, NULL); - mutex_unlock(&kcopyd_init_lock); + up(&kcopyd_init_lock); return 0; } static void kcopyd_exit(void) { - mutex_lock(&kcopyd_init_lock); + down(&kcopyd_init_lock); kcopyd_clients--; if (!kcopyd_clients) { jobs_exit(); destroy_workqueue(_kcopyd_wq); _kcopyd_wq = NULL; } - mutex_unlock(&kcopyd_init_lock); + up(&kcopyd_init_lock); } int kcopyd_client_create(unsigned int nr_pages, struct kcopyd_client **result) diff --git a/drivers/md/linear.c b/drivers/md/linear.c index b99c19c7e..777585458 100644 --- a/drivers/md/linear.c +++ b/drivers/md/linear.c @@ -111,7 +111,7 @@ static int linear_issue_flush(request_queue_t *q, struct gendisk *disk, return ret; } -static linear_conf_t *linear_conf(mddev_t *mddev, int raid_disks) +static int linear_run (mddev_t *mddev) { linear_conf_t *conf; dev_info_t **table; @@ -121,21 +121,20 @@ static linear_conf_t *linear_conf(mddev_t *mddev, int raid_disks) sector_t curr_offset; struct list_head *tmp; - conf = kzalloc (sizeof (*conf) + raid_disks*sizeof(dev_info_t), + conf = kzalloc (sizeof (*conf) + mddev->raid_disks*sizeof(dev_info_t), GFP_KERNEL); if (!conf) - return NULL; - + goto out; mddev->private = conf; cnt = 0; - conf->array_size = 0; + mddev->array_size = 0; ITERATE_RDEV(mddev,rdev,tmp) { int j = rdev->raid_disk; dev_info_t *disk = conf->disks + j; - if (j < 0 || j > raid_disks || disk->rdev) { + if (j < 0 || j > mddev->raid_disks || disk->rdev) { printk("linear: disk numbering problem. Aborting!\n"); goto out; } @@ -153,16 +152,16 @@ static linear_conf_t *linear_conf(mddev_t *mddev, int raid_disks) blk_queue_max_sectors(mddev->queue, PAGE_SIZE>>9); disk->size = rdev->size; - conf->array_size += rdev->size; + mddev->array_size += rdev->size; cnt++; } - if (cnt != raid_disks) { + if (cnt != mddev->raid_disks) { printk("linear: not enough drives present. Aborting!\n"); goto out; } - min_spacing = conf->array_size; + min_spacing = mddev->array_size; sector_div(min_spacing, PAGE_SIZE/sizeof(struct dev_info *)); /* min_spacing is the minimum spacing that will fit the hash @@ -171,7 +170,7 @@ static linear_conf_t *linear_conf(mddev_t *mddev, int raid_disks) * that is larger than min_spacing as use the size of that as * the actual spacing */ - conf->hash_spacing = conf->array_size; + conf->hash_spacing = mddev->array_size; for (i=0; i < cnt-1 ; i++) { sector_t sz = 0; int j; @@ -201,7 +200,7 @@ static linear_conf_t *linear_conf(mddev_t *mddev, int raid_disks) unsigned round; unsigned long base; - sz = conf->array_size >> conf->preshift; + sz = mddev->array_size >> conf->preshift; sz += 1; /* force round-up */ base = conf->hash_spacing >> conf->preshift; round = sector_div(sz, base); @@ -228,7 +227,7 @@ static linear_conf_t *linear_conf(mddev_t *mddev, int raid_disks) curr_offset = 0; i = 0; for (curr_offset = 0; - curr_offset < conf->array_size; + curr_offset < mddev->array_size; curr_offset += conf->hash_spacing) { while (i < mddev->raid_disks-1 && @@ -248,56 +247,14 @@ static linear_conf_t *linear_conf(mddev_t *mddev, int raid_disks) BUG_ON(table - conf->hash_table > nb_zone); - return conf; - -out: - kfree(conf); - return NULL; -} - -static int linear_run (mddev_t *mddev) -{ - linear_conf_t *conf; - - conf = linear_conf(mddev, mddev->raid_disks); - - if (!conf) - return 1; - mddev->private = conf; - mddev->array_size = conf->array_size; - blk_queue_merge_bvec(mddev->queue, linear_mergeable_bvec); mddev->queue->unplug_fn = linear_unplug; mddev->queue->issue_flush_fn = linear_issue_flush; return 0; -} - -static int linear_add(mddev_t *mddev, mdk_rdev_t *rdev) -{ - /* Adding a drive to a linear array allows the array to grow. - * It is permitted if the new drive has a matching superblock - * already on it, with raid_disk equal to raid_disks. - * It is achieved by creating a new linear_private_data structure - * and swapping it in in-place of the current one. - * The current one is never freed until the array is stopped. - * This avoids races. - */ - linear_conf_t *newconf; - - if (rdev->raid_disk != mddev->raid_disks) - return -EINVAL; - newconf = linear_conf(mddev,mddev->raid_disks+1); - - if (!newconf) - return -ENOMEM; - - newconf->prev = mddev_to_conf(mddev); - mddev->private = newconf; - mddev->raid_disks++; - mddev->array_size = newconf->array_size; - set_capacity(mddev->gendisk, mddev->array_size << 1); - return 0; +out: + kfree(conf); + return 1; } static int linear_stop (mddev_t *mddev) @@ -305,12 +262,8 @@ static int linear_stop (mddev_t *mddev) linear_conf_t *conf = mddev_to_conf(mddev); blk_sync_queue(mddev->queue); /* the unplug fn references 'conf'*/ - do { - linear_conf_t *t = conf->prev; - kfree(conf->hash_table); - kfree(conf); - conf = t; - } while (conf); + kfree(conf->hash_table); + kfree(conf); return 0; } @@ -407,7 +360,6 @@ static struct mdk_personality linear_personality = .run = linear_run, .stop = linear_stop, .status = linear_status, - .hot_add_disk = linear_add, }; static int __init linear_init (void) diff --git a/drivers/md/md.c b/drivers/md/md.c index 820f2ca20..2fd2cd447 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -33,16 +33,16 @@ */ #include +#include #include #include #include #include #include +#include #include /* for invalidate_bdev */ #include #include -#include -#include #include @@ -71,10 +71,6 @@ static void autostart_arrays (int part); static LIST_HEAD(pers_list); static DEFINE_SPINLOCK(pers_lock); -static void md_print_devices(void); - -#define MD_BUG(x...) { printk("md: bug in file %s, line %d\n", __FILE__, __LINE__); md_print_devices(); } - /* * Current RAID-1,4,5 parallel reconstruction 'guaranteed speed limit' * is 1000 KB/sec, so the extra system load does not show up that much. @@ -110,7 +106,7 @@ static ctl_table raid_table[] = { .procname = "speed_limit_min", .data = &sysctl_speed_limit_min, .maxlen = sizeof(int), - .mode = S_IRUGO|S_IWUSR, + .mode = 0644, .proc_handler = &proc_dointvec, }, { @@ -118,7 +114,7 @@ static ctl_table raid_table[] = { .procname = "speed_limit_max", .data = &sysctl_speed_limit_max, .maxlen = sizeof(int), - .mode = S_IRUGO|S_IWUSR, + .mode = 0644, .proc_handler = &proc_dointvec, }, { .ctl_name = 0 } @@ -129,7 +125,7 @@ static ctl_table raid_dir_table[] = { .ctl_name = DEV_RAID, .procname = "raid", .maxlen = 0, - .mode = S_IRUGO|S_IXUGO, + .mode = 0555, .child = raid_table, }, { .ctl_name = 0 } @@ -162,18 +158,7 @@ static int start_readonly; */ static DECLARE_WAIT_QUEUE_HEAD(md_event_waiters); static atomic_t md_event_count; -void md_new_event(mddev_t *mddev) -{ - atomic_inc(&md_event_count); - wake_up(&md_event_waiters); - sysfs_notify(&mddev->kobj, NULL, "sync_action"); -} -EXPORT_SYMBOL_GPL(md_new_event); - -/* Alternate version that can be called from interrupts - * when calling sysfs_notify isn't needed. - */ -static void md_new_event_inintr(mddev_t *mddev) +static void md_new_event(mddev_t *mddev) { atomic_inc(&md_event_count); wake_up(&md_event_waiters); @@ -228,11 +213,10 @@ static void mddev_put(mddev_t *mddev) return; if (!mddev->raid_disks && list_empty(&mddev->disks)) { list_del(&mddev->all_mddevs); - spin_unlock(&all_mddevs_lock); - blk_cleanup_queue(mddev->queue); + blk_put_queue(mddev->queue); kobject_unregister(&mddev->kobj); - } else - spin_unlock(&all_mddevs_lock); + } + spin_unlock(&all_mddevs_lock); } static mddev_t * mddev_find(dev_t unit) @@ -266,7 +250,7 @@ static mddev_t * mddev_find(dev_t unit) else new->md_minor = MINOR(unit) >> MdpMinorShift; - mutex_init(&new->reconfig_mutex); + init_MUTEX(&new->reconfig_sem); INIT_LIST_HEAD(&new->disks); INIT_LIST_HEAD(&new->all_mddevs); init_timer(&new->safemode_timer); @@ -279,7 +263,6 @@ static mddev_t * mddev_find(dev_t unit) kfree(new); return NULL; } - set_bit(QUEUE_FLAG_CLUSTER, &new->queue->queue_flags); blk_queue_make_request(new->queue, md_fail_request); @@ -288,17 +271,22 @@ static mddev_t * mddev_find(dev_t unit) static inline int mddev_lock(mddev_t * mddev) { - return mutex_lock_interruptible(&mddev->reconfig_mutex); + return down_interruptible(&mddev->reconfig_sem); +} + +static inline void mddev_lock_uninterruptible(mddev_t * mddev) +{ + down(&mddev->reconfig_sem); } static inline int mddev_trylock(mddev_t * mddev) { - return mutex_trylock(&mddev->reconfig_mutex); + return down_trylock(&mddev->reconfig_sem); } static inline void mddev_unlock(mddev_t * mddev) { - mutex_unlock(&mddev->reconfig_mutex); + up(&mddev->reconfig_sem); md_wakeup_thread(mddev->thread); } @@ -669,8 +657,7 @@ static int super_90_load(mdk_rdev_t *rdev, mdk_rdev_t *refdev, int minor_version } if (sb->major_version != 0 || - sb->minor_version < 90 || - sb->minor_version > 91) { + sb->minor_version != 90) { printk(KERN_WARNING "Bad version number %d.%d on %s\n", sb->major_version, sb->minor_version, b); @@ -735,7 +722,6 @@ static int super_90_validate(mddev_t *mddev, mdk_rdev_t *rdev) { mdp_disk_t *desc; mdp_super_t *sb = (mdp_super_t *)page_address(rdev->sb_page); - __u64 ev1 = md_event(sb); rdev->raid_disk = -1; rdev->flags = 0; @@ -752,24 +738,10 @@ static int super_90_validate(mddev_t *mddev, mdk_rdev_t *rdev) mddev->layout = sb->layout; mddev->raid_disks = sb->raid_disks; mddev->size = sb->size; - mddev->events = ev1; + mddev->events = md_event(sb); mddev->bitmap_offset = 0; mddev->default_bitmap_offset = MD_SB_BYTES >> 9; - if (mddev->minor_version >= 91) { - mddev->reshape_position = sb->reshape_position; - mddev->delta_disks = sb->delta_disks; - mddev->new_level = sb->new_level; - mddev->new_layout = sb->new_layout; - mddev->new_chunk = sb->new_chunk; - } else { - mddev->reshape_position = MaxSector; - mddev->delta_disks = 0; - mddev->new_level = mddev->level; - mddev->new_layout = mddev->layout; - mddev->new_chunk = mddev->chunk_size; - } - if (sb->state & (1<recovery_cp = MaxSector; else { @@ -789,8 +761,7 @@ static int super_90_validate(mddev_t *mddev, mdk_rdev_t *rdev) if (sb->state & (1<bitmap_file == NULL) { - if (mddev->level != 1 && mddev->level != 4 - && mddev->level != 5 && mddev->level != 6 + if (mddev->level != 1 && mddev->level != 5 && mddev->level != 6 && mddev->level != 10) { /* FIXME use a better test */ printk(KERN_WARNING "md: bitmaps not supported for this level.\n"); @@ -801,6 +772,7 @@ static int super_90_validate(mddev_t *mddev, mdk_rdev_t *rdev) } else if (mddev->pers == NULL) { /* Insist on good event counter while assembling */ + __u64 ev1 = md_event(sb); ++ev1; if (ev1 < mddev->events) return -EINVAL; @@ -808,21 +780,19 @@ static int super_90_validate(mddev_t *mddev, mdk_rdev_t *rdev) /* if adding to array with a bitmap, then we can accept an * older device ... but not too old. */ + __u64 ev1 = md_event(sb); if (ev1 < mddev->bitmap->events_cleared) return 0; - } else { - if (ev1 < mddev->events) - /* just a hot-add of a new device, leave raid_disk at -1 */ - return 0; - } + } else /* just a hot-add of a new device, leave raid_disk at -1 */ + return 0; if (mddev->level != LEVEL_MULTIPATH) { desc = sb->disks + rdev->desc_nr; if (desc->state & (1<flags); - else if (desc->state & (1<raid_disk < mddev->raid_disks */) { + else if (desc->state & (1<raid_disk < mddev->raid_disks) { set_bit(In_sync, &rdev->flags); rdev->raid_disk = desc->raid_disk; } @@ -865,6 +835,7 @@ static void super_90_sync(mddev_t *mddev, mdk_rdev_t *rdev) sb->md_magic = MD_SB_MAGIC; sb->major_version = mddev->major_version; + sb->minor_version = mddev->minor_version; sb->patch_version = mddev->patch_version; sb->gvalid_words = 0; /* ignored */ memcpy(&sb->set_uuid0, mddev->uuid+0, 4); @@ -883,17 +854,6 @@ static void super_90_sync(mddev_t *mddev, mdk_rdev_t *rdev) sb->events_hi = (mddev->events>>32); sb->events_lo = (u32)mddev->events; - if (mddev->reshape_position == MaxSector) - sb->minor_version = 90; - else { - sb->minor_version = 91; - sb->reshape_position = mddev->reshape_position; - sb->new_level = mddev->new_level; - sb->delta_disks = mddev->delta_disks; - sb->new_layout = mddev->new_layout; - sb->new_chunk = mddev->new_chunk; - } - mddev->minor_version = sb->minor_version; if (mddev->in_sync) { sb->recovery_cp = mddev->recovery_cp; @@ -930,9 +890,10 @@ static void super_90_sync(mddev_t *mddev, mdk_rdev_t *rdev) d->raid_disk = rdev2->raid_disk; else d->raid_disk = rdev2->desc_nr; /* compatibility */ - if (test_bit(Faulty, &rdev2->flags)) + if (test_bit(Faulty, &rdev2->flags)) { d->state = (1<flags)) { + failed++; + } else if (test_bit(In_sync, &rdev2->flags)) { d->state = (1<state |= (1<sb_size & bmask) rdev-> sb_size = (rdev->sb_size | bmask)+1; - if (sb->level == cpu_to_le32(LEVEL_MULTIPATH)) - rdev->desc_nr = -1; - else - rdev->desc_nr = le32_to_cpu(sb->dev_number); - if (refdev == 0) ret = 1; else { @@ -1110,7 +1066,6 @@ static int super_1_load(mdk_rdev_t *rdev, mdk_rdev_t *refdev, int minor_version) static int super_1_validate(mddev_t *mddev, mdk_rdev_t *rdev) { struct mdp_superblock_1 *sb = (struct mdp_superblock_1*)page_address(rdev->sb_page); - __u64 ev1 = le64_to_cpu(sb->events); rdev->raid_disk = -1; rdev->flags = 0; @@ -1126,7 +1081,7 @@ static int super_1_validate(mddev_t *mddev, mdk_rdev_t *rdev) mddev->layout = le32_to_cpu(sb->layout); mddev->raid_disks = le32_to_cpu(sb->raid_disks); mddev->size = le64_to_cpu(sb->size)/2; - mddev->events = ev1; + mddev->events = le64_to_cpu(sb->events); mddev->bitmap_offset = 0; mddev->default_bitmap_offset = 1024 >> 9; @@ -1144,22 +1099,9 @@ static int super_1_validate(mddev_t *mddev, mdk_rdev_t *rdev) } mddev->bitmap_offset = (__s32)le32_to_cpu(sb->bitmap_offset); } - if ((le32_to_cpu(sb->feature_map) & MD_FEATURE_RESHAPE_ACTIVE)) { - mddev->reshape_position = le64_to_cpu(sb->reshape_position); - mddev->delta_disks = le32_to_cpu(sb->delta_disks); - mddev->new_level = le32_to_cpu(sb->new_level); - mddev->new_layout = le32_to_cpu(sb->new_layout); - mddev->new_chunk = le32_to_cpu(sb->new_chunk)<<9; - } else { - mddev->reshape_position = MaxSector; - mddev->delta_disks = 0; - mddev->new_level = mddev->level; - mddev->new_layout = mddev->layout; - mddev->new_chunk = mddev->chunk_size; - } - } else if (mddev->pers == NULL) { /* Insist of good event counter while assembling */ + __u64 ev1 = le64_to_cpu(sb->events); ++ev1; if (ev1 < mddev->events) return -EINVAL; @@ -1167,15 +1109,15 @@ static int super_1_validate(mddev_t *mddev, mdk_rdev_t *rdev) /* If adding to array with a bitmap, then we can accept an * older device, but not too old. */ + __u64 ev1 = le64_to_cpu(sb->events); if (ev1 < mddev->bitmap->events_cleared) return 0; - } else { - if (ev1 < mddev->events) - /* just a hot-add of a new device, leave raid_disk at -1 */ - return 0; - } + } else /* just a hot-add of a new device, leave raid_disk at -1 */ + return 0; + if (mddev->level != LEVEL_MULTIPATH) { int role; + rdev->desc_nr = le32_to_cpu(sb->dev_number); role = le16_to_cpu(sb->dev_roles[rdev->desc_nr]); switch(role) { case 0xffff: /* spare */ @@ -1184,11 +1126,7 @@ static int super_1_validate(mddev_t *mddev, mdk_rdev_t *rdev) set_bit(Faulty, &rdev->flags); break; default: - if ((le32_to_cpu(sb->feature_map) & - MD_FEATURE_RECOVERY_OFFSET)) - rdev->recovery_offset = le64_to_cpu(sb->recovery_offset); - else - set_bit(In_sync, &rdev->flags); + set_bit(In_sync, &rdev->flags); rdev->raid_disk = role; break; } @@ -1212,7 +1150,6 @@ static void super_1_sync(mddev_t *mddev, mdk_rdev_t *rdev) sb->feature_map = 0; sb->pad0 = 0; - sb->recovery_offset = cpu_to_le64(0); memset(sb->pad1, 0, sizeof(sb->pad1)); memset(sb->pad2, 0, sizeof(sb->pad2)); memset(sb->pad3, 0, sizeof(sb->pad3)); @@ -1234,22 +1171,6 @@ static void super_1_sync(mddev_t *mddev, mdk_rdev_t *rdev) sb->feature_map = cpu_to_le32(MD_FEATURE_BITMAP_OFFSET); } - if (rdev->raid_disk >= 0 && - !test_bit(In_sync, &rdev->flags) && - rdev->recovery_offset > 0) { - sb->feature_map |= cpu_to_le32(MD_FEATURE_RECOVERY_OFFSET); - sb->recovery_offset = cpu_to_le64(rdev->recovery_offset); - } - - if (mddev->reshape_position != MaxSector) { - sb->feature_map |= cpu_to_le32(MD_FEATURE_RESHAPE_ACTIVE); - sb->reshape_position = cpu_to_le64(mddev->reshape_position); - sb->new_layout = cpu_to_le32(mddev->new_layout); - sb->delta_disks = cpu_to_le32(mddev->delta_disks); - sb->new_level = cpu_to_le32(mddev->new_level); - sb->new_chunk = cpu_to_le32(mddev->new_chunk>>9); - } - max_dev = 0; ITERATE_RDEV(mddev,rdev2,tmp) if (rdev2->desc_nr+1 > max_dev) @@ -1265,12 +1186,11 @@ static void super_1_sync(mddev_t *mddev, mdk_rdev_t *rdev) sb->dev_roles[i] = cpu_to_le16(0xfffe); else if (test_bit(In_sync, &rdev2->flags)) sb->dev_roles[i] = cpu_to_le16(rdev2->raid_disk); - else if (rdev2->raid_disk >= 0 && rdev2->recovery_offset > 0) - sb->dev_roles[i] = cpu_to_le16(rdev2->raid_disk); else sb->dev_roles[i] = cpu_to_le16(0xffff); } + sb->recovery_offset = cpu_to_le64(0); /* not supported yet */ sb->sb_csum = calc_sb_1_csum(sb); } @@ -1378,7 +1298,6 @@ static int bind_rdev_to_array(mdk_rdev_t * rdev, mddev_t * mddev) else ko = &rdev->bdev->bd_disk->kobj; sysfs_create_link(&rdev->kobj, ko, "block"); - bd_claim_by_disk(rdev->bdev, rdev, mddev->gendisk); return 0; } @@ -1389,7 +1308,6 @@ static void unbind_rdev_from_array(mdk_rdev_t * rdev) MD_BUG(); return; } - bd_release_from_disk(rdev->bdev, rdev->mddev->gendisk); list_del_init(&rdev->same_set); printk(KERN_INFO "md: unbind<%s>\n", bdevname(rdev->bdev,b)); rdev->mddev = NULL; @@ -1531,7 +1449,7 @@ static void print_rdev(mdk_rdev_t *rdev) printk(KERN_INFO "md: no rdev superblock!\n"); } -static void md_print_devices(void) +void md_print_devices(void) { struct list_head *tmp, *tmp2; mdk_rdev_t *rdev; @@ -1560,88 +1478,30 @@ static void md_print_devices(void) } -static void sync_sbs(mddev_t * mddev, int nospares) +static void sync_sbs(mddev_t * mddev) { - /* Update each superblock (in-memory image), but - * if we are allowed to, skip spares which already - * have the right event counter, or have one earlier - * (which would mean they aren't being marked as dirty - * with the rest of the array) - */ mdk_rdev_t *rdev; struct list_head *tmp; ITERATE_RDEV(mddev,rdev,tmp) { - if (rdev->sb_events == mddev->events || - (nospares && - rdev->raid_disk < 0 && - (rdev->sb_events&1)==0 && - rdev->sb_events+1 == mddev->events)) { - /* Don't update this superblock */ - rdev->sb_loaded = 2; - } else { - super_types[mddev->major_version]. - sync_super(mddev, rdev); - rdev->sb_loaded = 1; - } + super_types[mddev->major_version]. + sync_super(mddev, rdev); + rdev->sb_loaded = 1; } } -void md_update_sb(mddev_t * mddev) +static void md_update_sb(mddev_t * mddev) { int err; struct list_head *tmp; mdk_rdev_t *rdev; int sync_req; - int nospares = 0; repeat: spin_lock_irq(&mddev->write_lock); - - if (mddev->degraded && mddev->sb_dirty == 3) - /* If the array is degraded, then skipping spares is both - * dangerous and fairly pointless. - * Dangerous because a device that was removed from the array - * might have a event_count that still looks up-to-date, - * so it can be re-added without a resync. - * Pointless because if there are any spares to skip, - * then a recovery will happen and soon that array won't - * be degraded any more and the spare can go back to sleep then. - */ - mddev->sb_dirty = 1; - sync_req = mddev->in_sync; mddev->utime = get_seconds(); - if (mddev->sb_dirty == 3) - /* just a clean<-> dirty transition, possibly leave spares alone, - * though if events isn't the right even/odd, we will have to do - * spares after all - */ - nospares = 1; - - /* If this is just a dirty<->clean transition, and the array is clean - * and 'events' is odd, we can roll back to the previous clean state */ - if (mddev->sb_dirty == 3 - && (mddev->in_sync && mddev->recovery_cp == MaxSector) - && (mddev->events & 1)) - mddev->events--; - else { - /* otherwise we have to go forward and ... */ - mddev->events ++; - if (!mddev->in_sync || mddev->recovery_cp != MaxSector) { /* not clean */ - /* .. if the array isn't clean, insist on an odd 'events' */ - if ((mddev->events&1)==0) { - mddev->events++; - nospares = 0; - } - } else { - /* otherwise insist on an even 'events' (for clean states) */ - if ((mddev->events&1)) { - mddev->events++; - nospares = 0; - } - } - } + mddev->events ++; if (!mddev->events) { /* @@ -1653,7 +1513,7 @@ repeat: mddev->events --; } mddev->sb_dirty = 2; - sync_sbs(mddev, nospares); + sync_sbs(mddev); /* * do not write anything to disk if using @@ -1675,8 +1535,6 @@ repeat: ITERATE_RDEV(mddev,rdev,tmp) { char b[BDEVNAME_SIZE]; dprintk(KERN_INFO "md: "); - if (rdev->sb_loaded != 1) - continue; /* no noise on spare devices */ if (test_bit(Faulty, &rdev->flags)) dprintk("(skipping faulty "); @@ -1688,7 +1546,6 @@ repeat: dprintk(KERN_INFO "(write) %s's sb offset: %llu\n", bdevname(rdev->bdev,b), (unsigned long long)rdev->sb_offset); - rdev->sb_events = mddev->events; } else dprintk(")\n"); @@ -1710,7 +1567,6 @@ repeat: wake_up(&mddev->sb_wait); } -EXPORT_SYMBOL_GPL(md_update_sb); /* words written to sysfs files may, or my not, be \n terminated. * We want to accept with case. For this we use cmd_match. @@ -1752,10 +1608,6 @@ state_show(mdk_rdev_t *rdev, char *page) len += sprintf(page+len, "%sin_sync",sep); sep = ","; } - if (test_bit(WriteMostly, &rdev->flags)) { - len += sprintf(page+len, "%swrite_mostly",sep); - sep = ","; - } if (!test_bit(Faulty, &rdev->flags) && !test_bit(In_sync, &rdev->flags)) { len += sprintf(page+len, "%sspare", sep); @@ -1764,40 +1616,8 @@ state_show(mdk_rdev_t *rdev, char *page) return len+sprintf(page+len, "\n"); } -static ssize_t -state_store(mdk_rdev_t *rdev, const char *buf, size_t len) -{ - /* can write - * faulty - simulates and error - * remove - disconnects the device - * writemostly - sets write_mostly - * -writemostly - clears write_mostly - */ - int err = -EINVAL; - if (cmd_match(buf, "faulty") && rdev->mddev->pers) { - md_error(rdev->mddev, rdev); - err = 0; - } else if (cmd_match(buf, "remove")) { - if (rdev->raid_disk >= 0) - err = -EBUSY; - else { - mddev_t *mddev = rdev->mddev; - kick_rdev_from_array(rdev); - md_update_sb(mddev); - md_new_event(mddev); - err = 0; - } - } else if (cmd_match(buf, "writemostly")) { - set_bit(WriteMostly, &rdev->flags); - err = 0; - } else if (cmd_match(buf, "-writemostly")) { - clear_bit(WriteMostly, &rdev->flags); - err = 0; - } - return err ? err : len; -} -static struct rdev_sysfs_entry rdev_state = -__ATTR(state, S_IRUGO|S_IWUSR, state_show, state_store); +static struct rdev_sysfs_entry +rdev_state = __ATTR_RO(state); static ssize_t super_show(mdk_rdev_t *rdev, char *page) @@ -1828,7 +1648,7 @@ errors_store(mdk_rdev_t *rdev, const char *buf, size_t len) return -EINVAL; } static struct rdev_sysfs_entry rdev_errors = -__ATTR(errors, S_IRUGO|S_IWUSR, errors_show, errors_store); +__ATTR(errors, 0644, errors_show, errors_store); static ssize_t slot_show(mdk_rdev_t *rdev, char *page) @@ -1862,7 +1682,7 @@ slot_store(mdk_rdev_t *rdev, const char *buf, size_t len) static struct rdev_sysfs_entry rdev_slot = -__ATTR(slot, S_IRUGO|S_IWUSR, slot_show, slot_store); +__ATTR(slot, 0644, slot_show, slot_store); static ssize_t offset_show(mdk_rdev_t *rdev, char *page) @@ -1884,7 +1704,7 @@ offset_store(mdk_rdev_t *rdev, const char *buf, size_t len) } static struct rdev_sysfs_entry rdev_offset = -__ATTR(offset, S_IRUGO|S_IWUSR, offset_show, offset_store); +__ATTR(offset, 0644, offset_show, offset_store); static ssize_t rdev_size_show(mdk_rdev_t *rdev, char *page) @@ -1908,7 +1728,7 @@ rdev_size_store(mdk_rdev_t *rdev, const char *buf, size_t len) } static struct rdev_sysfs_entry rdev_size = -__ATTR(size, S_IRUGO|S_IWUSR, rdev_size_show, rdev_size_store); +__ATTR(size, 0644, rdev_size_show, rdev_size_store); static struct attribute *rdev_default_attrs[] = { &rdev_state.attr, @@ -1939,8 +1759,6 @@ rdev_attr_store(struct kobject *kobj, struct attribute *attr, if (!entry->store) return -EIO; - if (!capable(CAP_SYS_ADMIN)) - return -EACCES; return entry->store(rdev, page, length); } @@ -1994,10 +1812,8 @@ static mdk_rdev_t *md_import_device(dev_t newdev, int super_format, int super_mi kobject_init(&rdev->kobj); rdev->desc_nr = -1; - rdev->saved_raid_disk = -1; rdev->flags = 0; rdev->data_offset = 0; - rdev->sb_events = 0; atomic_set(&rdev->nr_pending, 0); atomic_set(&rdev->read_errors, 0); atomic_set(&rdev->corrected_errors, 0); @@ -2102,54 +1918,6 @@ static void analyze_sbs(mddev_t * mddev) } -static ssize_t -safe_delay_show(mddev_t *mddev, char *page) -{ - int msec = (mddev->safemode_delay*1000)/HZ; - return sprintf(page, "%d.%03d\n", msec/1000, msec%1000); -} -static ssize_t -safe_delay_store(mddev_t *mddev, const char *cbuf, size_t len) -{ - int scale=1; - int dot=0; - int i; - unsigned long msec; - char buf[30]; - char *e; - /* remove a period, and count digits after it */ - if (len >= sizeof(buf)) - return -EINVAL; - strlcpy(buf, cbuf, len); - buf[len] = 0; - for (i=0; isafemode_delay = 0; - else { - mddev->safemode_delay = (msec*HZ)/1000; - if (mddev->safemode_delay == 0) - mddev->safemode_delay = 1; - } - return len; -} -static struct md_sysfs_entry md_safe_delay = -__ATTR(safe_mode_delay, S_IRUGO|S_IWUSR,safe_delay_show, safe_delay_store); - static ssize_t level_show(mddev_t *mddev, char *page) { @@ -2183,33 +1951,7 @@ level_store(mddev_t *mddev, const char *buf, size_t len) } static struct md_sysfs_entry md_level = -__ATTR(level, S_IRUGO|S_IWUSR, level_show, level_store); - - -static ssize_t -layout_show(mddev_t *mddev, char *page) -{ - /* just a number, not meaningful for all levels */ - return sprintf(page, "%d\n", mddev->layout); -} - -static ssize_t -layout_store(mddev_t *mddev, const char *buf, size_t len) -{ - char *e; - unsigned long n = simple_strtoul(buf, &e, 10); - if (mddev->pers) - return -EBUSY; - - if (!*buf || (*e && *e != '\n')) - return -EINVAL; - - mddev->layout = n; - return len; -} -static struct md_sysfs_entry md_layout = -__ATTR(layout, S_IRUGO|S_IWUSR, layout_show, layout_store); - +__ATTR(level, 0644, level_show, level_store); static ssize_t raid_disks_show(mddev_t *mddev, char *page) @@ -2239,7 +1981,7 @@ raid_disks_store(mddev_t *mddev, const char *buf, size_t len) return rv ? rv : len; } static struct md_sysfs_entry md_raid_disks = -__ATTR(raid_disks, S_IRUGO|S_IWUSR, raid_disks_show, raid_disks_store); +__ATTR(raid_disks, 0644, raid_disks_show, raid_disks_store); static ssize_t chunk_size_show(mddev_t *mddev, char *page) @@ -2263,202 +2005,7 @@ chunk_size_store(mddev_t *mddev, const char *buf, size_t len) return len; } static struct md_sysfs_entry md_chunk_size = -__ATTR(chunk_size, S_IRUGO|S_IWUSR, chunk_size_show, chunk_size_store); - -static ssize_t -resync_start_show(mddev_t *mddev, char *page) -{ - return sprintf(page, "%llu\n", (unsigned long long)mddev->recovery_cp); -} - -static ssize_t -resync_start_store(mddev_t *mddev, const char *buf, size_t len) -{ - /* can only set chunk_size if array is not yet active */ - char *e; - unsigned long long n = simple_strtoull(buf, &e, 10); - - if (mddev->pers) - return -EBUSY; - if (!*buf || (*e && *e != '\n')) - return -EINVAL; - - mddev->recovery_cp = n; - return len; -} -static struct md_sysfs_entry md_resync_start = -__ATTR(resync_start, S_IRUGO|S_IWUSR, resync_start_show, resync_start_store); - -/* - * The array state can be: - * - * clear - * No devices, no size, no level - * Equivalent to STOP_ARRAY ioctl - * inactive - * May have some settings, but array is not active - * all IO results in error - * When written, doesn't tear down array, but just stops it - * suspended (not supported yet) - * All IO requests will block. The array can be reconfigured. - * Writing this, if accepted, will block until array is quiessent - * readonly - * no resync can happen. no superblocks get written. - * write requests fail - * read-auto - * like readonly, but behaves like 'clean' on a write request. - * - * clean - no pending writes, but otherwise active. - * When written to inactive array, starts without resync - * If a write request arrives then - * if metadata is known, mark 'dirty' and switch to 'active'. - * if not known, block and switch to write-pending - * If written to an active array that has pending writes, then fails. - * active - * fully active: IO and resync can be happening. - * When written to inactive array, starts with resync - * - * write-pending - * clean, but writes are blocked waiting for 'active' to be written. - * - * active-idle - * like active, but no writes have been seen for a while (100msec). - * - */ -enum array_state { clear, inactive, suspended, readonly, read_auto, clean, active, - write_pending, active_idle, bad_word}; -static char *array_states[] = { - "clear", "inactive", "suspended", "readonly", "read-auto", "clean", "active", - "write-pending", "active-idle", NULL }; - -static int match_word(const char *word, char **list) -{ - int n; - for (n=0; list[n]; n++) - if (cmd_match(word, list[n])) - break; - return n; -} - -static ssize_t -array_state_show(mddev_t *mddev, char *page) -{ - enum array_state st = inactive; - - if (mddev->pers) - switch(mddev->ro) { - case 1: - st = readonly; - break; - case 2: - st = read_auto; - break; - case 0: - if (mddev->in_sync) - st = clean; - else if (mddev->safemode) - st = active_idle; - else - st = active; - } - else { - if (list_empty(&mddev->disks) && - mddev->raid_disks == 0 && - mddev->size == 0) - st = clear; - else - st = inactive; - } - return sprintf(page, "%s\n", array_states[st]); -} - -static int do_md_stop(mddev_t * mddev, int ro); -static int do_md_run(mddev_t * mddev); -static int restart_array(mddev_t *mddev); - -static ssize_t -array_state_store(mddev_t *mddev, const char *buf, size_t len) -{ - int err = -EINVAL; - enum array_state st = match_word(buf, array_states); - switch(st) { - case bad_word: - break; - case clear: - /* stopping an active array */ - if (mddev->pers) { - if (atomic_read(&mddev->active) > 1) - return -EBUSY; - err = do_md_stop(mddev, 0); - } - break; - case inactive: - /* stopping an active array */ - if (mddev->pers) { - if (atomic_read(&mddev->active) > 1) - return -EBUSY; - err = do_md_stop(mddev, 2); - } - break; - case suspended: - break; /* not supported yet */ - case readonly: - if (mddev->pers) - err = do_md_stop(mddev, 1); - else { - mddev->ro = 1; - err = do_md_run(mddev); - } - break; - case read_auto: - /* stopping an active array */ - if (mddev->pers) { - err = do_md_stop(mddev, 1); - if (err == 0) - mddev->ro = 2; /* FIXME mark devices writable */ - } else { - mddev->ro = 2; - err = do_md_run(mddev); - } - break; - case clean: - if (mddev->pers) { - restart_array(mddev); - spin_lock_irq(&mddev->write_lock); - if (atomic_read(&mddev->writes_pending) == 0) { - mddev->in_sync = 1; - mddev->sb_dirty = 1; - } - spin_unlock_irq(&mddev->write_lock); - } else { - mddev->ro = 0; - mddev->recovery_cp = MaxSector; - err = do_md_run(mddev); - } - break; - case active: - if (mddev->pers) { - restart_array(mddev); - mddev->sb_dirty = 0; - wake_up(&mddev->sb_wait); - err = 0; - } else { - mddev->ro = 0; - err = do_md_run(mddev); - } - break; - case write_pending: - case active_idle: - /* these cannot be set */ - break; - } - if (err) - return err; - else - return len; -} -static struct md_sysfs_entry md_array_state = -__ATTR(array_state, S_IRUGO|S_IWUSR, array_state_show, array_state_store); +__ATTR(chunk_size, 0644, chunk_size_show, chunk_size_store); static ssize_t null_show(mddev_t *mddev, char *page) @@ -2518,7 +2065,7 @@ new_dev_store(mddev_t *mddev, const char *buf, size_t len) } static struct md_sysfs_entry md_new_device = -__ATTR(new_dev, S_IWUSR, null_show, new_dev_store); +__ATTR(new_dev, 0200, null_show, new_dev_store); static ssize_t size_show(mddev_t *mddev, char *page) @@ -2556,7 +2103,7 @@ size_store(mddev_t *mddev, const char *buf, size_t len) } static struct md_sysfs_entry md_size = -__ATTR(component_size, S_IRUGO|S_IWUSR, size_show, size_store); +__ATTR(component_size, 0644, size_show, size_store); /* Metdata version. @@ -2604,7 +2151,7 @@ metadata_store(mddev_t *mddev, const char *buf, size_t len) } static struct md_sysfs_entry md_metadata = -__ATTR(metadata_version, S_IRUGO|S_IWUSR, metadata_show, metadata_store); +__ATTR(metadata_version, 0644, metadata_show, metadata_store); static ssize_t action_show(mddev_t *mddev, char *page) @@ -2612,9 +2159,7 @@ action_show(mddev_t *mddev, char *page) char *type = "idle"; if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery) || test_bit(MD_RECOVERY_NEEDED, &mddev->recovery)) { - if (test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery)) - type = "reshape"; - else if (test_bit(MD_RECOVERY_SYNC, &mddev->recovery)) { + if (test_bit(MD_RECOVERY_SYNC, &mddev->recovery)) { if (!test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery)) type = "resync"; else if (test_bit(MD_RECOVERY_CHECK, &mddev->recovery)) @@ -2645,17 +2190,10 @@ action_store(mddev_t *mddev, const char *page, size_t len) return -EBUSY; else if (cmd_match(page, "resync") || cmd_match(page, "recover")) set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); - else if (cmd_match(page, "reshape")) { - int err; - if (mddev->pers->start_reshape == NULL) - return -EINVAL; - err = mddev->pers->start_reshape(mddev); - if (err) - return err; - } else { + else { if (cmd_match(page, "check")) set_bit(MD_RECOVERY_CHECK, &mddev->recovery); - else if (!cmd_match(page, "repair")) + else if (cmd_match(page, "repair")) return -EINVAL; set_bit(MD_RECOVERY_REQUESTED, &mddev->recovery); set_bit(MD_RECOVERY_SYNC, &mddev->recovery); @@ -2672,11 +2210,12 @@ mismatch_cnt_show(mddev_t *mddev, char *page) (unsigned long long) mddev->resync_mismatches); } -static struct md_sysfs_entry md_scan_mode = -__ATTR(sync_action, S_IRUGO|S_IWUSR, action_show, action_store); +static struct md_sysfs_entry +md_scan_mode = __ATTR(sync_action, S_IRUGO|S_IWUSR, action_show, action_store); -static struct md_sysfs_entry md_mismatches = __ATTR_RO(mismatch_cnt); +static struct md_sysfs_entry +md_mismatches = __ATTR_RO(mismatch_cnt); static ssize_t sync_min_show(mddev_t *mddev, char *page) @@ -2735,14 +2274,15 @@ static ssize_t sync_speed_show(mddev_t *mddev, char *page) { unsigned long resync, dt, db; - resync = (mddev->curr_mark_cnt - atomic_read(&mddev->recovery_active)); + resync = (mddev->curr_resync - atomic_read(&mddev->recovery_active)); dt = ((jiffies - mddev->resync_mark) / HZ); if (!dt) dt++; db = resync - (mddev->resync_mark_cnt); return sprintf(page, "%ld\n", db/dt/2); /* K/sec */ } -static struct md_sysfs_entry md_sync_speed = __ATTR_RO(sync_speed); +static struct md_sysfs_entry +md_sync_speed = __ATTR_RO(sync_speed); static ssize_t sync_completed_show(mddev_t *mddev, char *page) @@ -2758,76 +2298,16 @@ sync_completed_show(mddev_t *mddev, char *page) return sprintf(page, "%lu / %lu\n", resync, max_blocks); } -static struct md_sysfs_entry md_sync_completed = __ATTR_RO(sync_completed); - -static ssize_t -suspend_lo_show(mddev_t *mddev, char *page) -{ - return sprintf(page, "%llu\n", (unsigned long long)mddev->suspend_lo); -} - -static ssize_t -suspend_lo_store(mddev_t *mddev, const char *buf, size_t len) -{ - char *e; - unsigned long long new = simple_strtoull(buf, &e, 10); - - if (mddev->pers->quiesce == NULL) - return -EINVAL; - if (buf == e || (*e && *e != '\n')) - return -EINVAL; - if (new >= mddev->suspend_hi || - (new > mddev->suspend_lo && new < mddev->suspend_hi)) { - mddev->suspend_lo = new; - mddev->pers->quiesce(mddev, 2); - return len; - } else - return -EINVAL; -} -static struct md_sysfs_entry md_suspend_lo = -__ATTR(suspend_lo, S_IRUGO|S_IWUSR, suspend_lo_show, suspend_lo_store); - - -static ssize_t -suspend_hi_show(mddev_t *mddev, char *page) -{ - return sprintf(page, "%llu\n", (unsigned long long)mddev->suspend_hi); -} - -static ssize_t -suspend_hi_store(mddev_t *mddev, const char *buf, size_t len) -{ - char *e; - unsigned long long new = simple_strtoull(buf, &e, 10); - - if (mddev->pers->quiesce == NULL) - return -EINVAL; - if (buf == e || (*e && *e != '\n')) - return -EINVAL; - if ((new <= mddev->suspend_lo && mddev->suspend_lo >= mddev->suspend_hi) || - (new > mddev->suspend_lo && new > mddev->suspend_hi)) { - mddev->suspend_hi = new; - mddev->pers->quiesce(mddev, 1); - mddev->pers->quiesce(mddev, 0); - return len; - } else - return -EINVAL; -} -static struct md_sysfs_entry md_suspend_hi = -__ATTR(suspend_hi, S_IRUGO|S_IWUSR, suspend_hi_show, suspend_hi_store); - +static struct md_sysfs_entry +md_sync_completed = __ATTR_RO(sync_completed); static struct attribute *md_default_attrs[] = { &md_level.attr, - &md_layout.attr, &md_raid_disks.attr, &md_chunk_size.attr, &md_size.attr, - &md_resync_start.attr, &md_metadata.attr, &md_new_device.attr, - &md_safe_delay.attr, - &md_array_state.attr, NULL, }; @@ -2838,8 +2318,6 @@ static struct attribute *md_redundancy_attrs[] = { &md_sync_max.attr, &md_sync_speed.attr, &md_sync_completed.attr, - &md_suspend_lo.attr, - &md_suspend_hi.attr, NULL, }; static struct attribute_group md_redundancy_group = { @@ -2857,11 +2335,9 @@ md_attr_show(struct kobject *kobj, struct attribute *attr, char *page) if (!entry->show) return -EIO; - rv = mddev_lock(mddev); - if (!rv) { - rv = entry->show(mddev, page); - mddev_unlock(mddev); - } + mddev_lock(mddev); + rv = entry->show(mddev, page); + mddev_unlock(mddev); return rv; } @@ -2875,13 +2351,9 @@ md_attr_store(struct kobject *kobj, struct attribute *attr, if (!entry->store) return -EIO; - if (!capable(CAP_SYS_ADMIN)) - return -EACCES; - rv = mddev_lock(mddev); - if (!rv) { - rv = entry->store(mddev, page, length); - mddev_unlock(mddev); - } + mddev_lock(mddev); + rv = entry->store(mddev, page, length); + mddev_unlock(mddev); return rv; } @@ -2905,7 +2377,7 @@ int mdp_major = 0; static struct kobject *md_probe(dev_t dev, int *part, void *data) { - static DEFINE_MUTEX(disks_mutex); + static DECLARE_MUTEX(disks_sem); mddev_t *mddev = mddev_find(dev); struct gendisk *disk; int partitioned = (MAJOR(dev) != MD_MAJOR); @@ -2915,30 +2387,33 @@ static struct kobject *md_probe(dev_t dev, int *part, void *data) if (!mddev) return NULL; - mutex_lock(&disks_mutex); + down(&disks_sem); if (mddev->gendisk) { - mutex_unlock(&disks_mutex); + up(&disks_sem); mddev_put(mddev); return NULL; } disk = alloc_disk(1 << shift); if (!disk) { - mutex_unlock(&disks_mutex); + up(&disks_sem); mddev_put(mddev); return NULL; } disk->major = MAJOR(dev); disk->first_minor = unit << shift; - if (partitioned) + if (partitioned) { sprintf(disk->disk_name, "md_d%d", unit); - else + sprintf(disk->devfs_name, "md/d%d", unit); + } else { sprintf(disk->disk_name, "md%d", unit); + sprintf(disk->devfs_name, "md/%d", unit); + } disk->fops = &md_fops; disk->private_data = mddev; disk->queue = mddev->queue; add_disk(disk); mddev->gendisk = disk; - mutex_unlock(&disks_mutex); + up(&disks_sem); mddev->kobj.parent = &disk->kobj; mddev->kobj.k_name = NULL; snprintf(mddev->kobj.name, KOBJ_NAME_LEN, "%s", "md"); @@ -2947,6 +2422,8 @@ static struct kobject *md_probe(dev_t dev, int *part, void *data) return NULL; } +void md_wakeup_thread(mdk_thread_t *thread); + static void md_safemode_timeout(unsigned long data) { mddev_t *mddev = (mddev_t *) data; @@ -3059,14 +2536,6 @@ static int do_md_run(mddev_t * mddev) mddev->level = pers->level; strlcpy(mddev->clevel, pers->name, sizeof(mddev->clevel)); - if (mddev->reshape_position != MaxSector && - pers->start_reshape == NULL) { - /* This personality cannot handle reshaping... */ - mddev->pers = NULL; - module_put(pers->owner); - return -EINVAL; - } - mddev->recovery = 0; mddev->resync_max_sectors = mddev->size << 1; /* may be over-ridden by personality */ mddev->barriers_work = 1; @@ -3100,7 +2569,7 @@ static int do_md_run(mddev_t * mddev) mddev->safemode = 0; mddev->safemode_timer.function = md_safemode_timeout; mddev->safemode_timer.data = (unsigned long) mddev; - mddev->safemode_delay = (200 * HZ)/1000 +1; /* 200 msec delay */ + mddev->safemode_delay = (20 * HZ)/1000 +1; /* 20 msec delay */ mddev->in_sync = 1; ITERATE_RDEV(mddev,rdev,tmp) @@ -3111,6 +2580,7 @@ static int do_md_run(mddev_t * mddev) } set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); + md_wakeup_thread(mddev->thread); if (mddev->sb_dirty) md_update_sb(mddev); @@ -3127,37 +2597,6 @@ static int do_md_run(mddev_t * mddev) mddev->queue->queuedata = mddev; mddev->queue->make_request_fn = mddev->pers->make_request; - /* If there is a partially-recovered drive we need to - * start recovery here. If we leave it to md_check_recovery, - * it will remove the drives and not do the right thing - */ - if (mddev->degraded && !mddev->sync_thread) { - struct list_head *rtmp; - int spares = 0; - ITERATE_RDEV(mddev,rdev,rtmp) - if (rdev->raid_disk >= 0 && - !test_bit(In_sync, &rdev->flags) && - !test_bit(Faulty, &rdev->flags)) - /* complete an interrupted recovery */ - spares++; - if (spares && mddev->pers->sync_request) { - mddev->recovery = 0; - set_bit(MD_RECOVERY_RUNNING, &mddev->recovery); - mddev->sync_thread = md_register_thread(md_do_sync, - mddev, - "%s_resync"); - if (!mddev->sync_thread) { - printk(KERN_ERR "%s: could not start resync" - " thread...\n", - mdname(mddev)); - /* leave the spares where they are, it shouldn't hurt */ - mddev->recovery = 0; - } - } - } - md_wakeup_thread(mddev->thread); - md_wakeup_thread(mddev->sync_thread); /* possibly kick off a reshape */ - mddev->changed = 1; md_new_event(mddev); return 0; @@ -3191,47 +2630,18 @@ static int restart_array(mddev_t *mddev) */ set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); md_wakeup_thread(mddev->thread); - md_wakeup_thread(mddev->sync_thread); err = 0; - } else + } else { + printk(KERN_ERR "md: %s has no personality assigned.\n", + mdname(mddev)); err = -EINVAL; + } out: return err; } -/* similar to deny_write_access, but accounts for our holding a reference - * to the file ourselves */ -static int deny_bitmap_write_access(struct file * file) -{ - struct inode *inode = file->f_mapping->host; - - spin_lock(&inode->i_lock); - if (atomic_read(&inode->i_writecount) > 1) { - spin_unlock(&inode->i_lock); - return -ETXTBSY; - } - atomic_set(&inode->i_writecount, -1); - spin_unlock(&inode->i_lock); - - return 0; -} - -static void restore_bitmap_write_access(struct file *file) -{ - struct inode *inode = file->f_mapping->host; - - spin_lock(&inode->i_lock); - atomic_set(&inode->i_writecount, 1); - spin_unlock(&inode->i_lock); -} - -/* mode: - * 0 - completely stop and dis-assemble array - * 1 - switch to readonly - * 2 - stop but do not disassemble array - */ -static int do_md_stop(mddev_t * mddev, int mode) +static int do_md_stop(mddev_t * mddev, int ro) { int err = 0; struct gendisk *disk = mddev->gendisk; @@ -3243,7 +2653,6 @@ static int do_md_stop(mddev_t * mddev, int mode) } if (mddev->sync_thread) { - set_bit(MD_RECOVERY_FROZEN, &mddev->recovery); set_bit(MD_RECOVERY_INTR, &mddev->recovery); md_unregister_thread(mddev->sync_thread); mddev->sync_thread = NULL; @@ -3253,15 +2662,12 @@ static int do_md_stop(mddev_t * mddev, int mode) invalidate_partition(disk, 0); - switch(mode) { - case 1: /* readonly */ + if (ro) { err = -ENXIO; if (mddev->ro==1) goto out; mddev->ro = 1; - break; - case 0: /* disassemble */ - case 2: /* stop */ + } else { bitmap_flush(mddev); md_super_wait(mddev); if (mddev->ro) @@ -3276,20 +2682,19 @@ static int do_md_stop(mddev_t * mddev, int mode) if (mddev->ro) mddev->ro = 0; } - if (!mddev->in_sync || mddev->sb_dirty) { + if (!mddev->in_sync) { /* mark array as shutdown cleanly */ mddev->in_sync = 1; md_update_sb(mddev); } - if (mode == 1) + if (ro) set_disk_ro(disk, 1); - clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery); } /* * Free resources if final stop */ - if (mode == 0) { + if (!ro) { mdk_rdev_t *rdev; struct list_head *tmp; struct gendisk *disk; @@ -3297,7 +2702,7 @@ static int do_md_stop(mddev_t * mddev, int mode) bitmap_destroy(mddev); if (mddev->bitmap_file) { - restore_bitmap_write_access(mddev->bitmap_file); + atomic_set(&mddev->bitmap_file->f_dentry->d_inode->i_writecount, 1); fput(mddev->bitmap_file); mddev->bitmap_file = NULL; } @@ -3313,15 +2718,11 @@ static int do_md_stop(mddev_t * mddev, int mode) export_array(mddev); mddev->array_size = 0; - mddev->size = 0; - mddev->raid_disks = 0; - mddev->recovery_cp = 0; - disk = mddev->gendisk; if (disk) set_capacity(disk, 0); mddev->changed = 1; - } else if (mddev->pers) + } else printk(KERN_INFO "md: %s switched to read-only mode.\n", mdname(mddev)); err = 0; @@ -3368,6 +2769,7 @@ static void autorun_array(mddev_t *mddev) */ static void autorun_devices(int part) { + struct list_head candidates; struct list_head *tmp; mdk_rdev_t *rdev0, *rdev; mddev_t *mddev; @@ -3376,7 +2778,6 @@ static void autorun_devices(int part) printk(KERN_INFO "md: autorun ...\n"); while (!list_empty(&pending_raid_disks)) { dev_t dev; - LIST_HEAD(candidates); rdev0 = list_entry(pending_raid_disks.next, mdk_rdev_t, same_set); @@ -3724,17 +3125,6 @@ static int add_new_disk(mddev_t * mddev, mdu_disk_info_t *info) rdev->raid_disk = -1; err = bind_rdev_to_array(rdev, mddev); - if (!err && !mddev->pers->hot_remove_disk) { - /* If there is hot_add_disk but no hot_remove_disk - * then added disks for geometry changes, - * and should be added immediately. - */ - super_types[mddev->major_version]. - validate_super(mddev, rdev); - err = mddev->pers->hot_add_disk(mddev, rdev); - if (err) - unbind_rdev_from_array(rdev); - } if (err) export_rdev(rdev); @@ -3868,7 +3258,6 @@ static int hot_add_disk(mddev_t * mddev, dev_t dev) } clear_bit(In_sync, &rdev->flags); rdev->desc_nr = -1; - rdev->saved_raid_disk = -1; err = bind_rdev_to_array(rdev, mddev); if (err) goto abort_export; @@ -3906,6 +3295,23 @@ abort_export: return err; } +/* similar to deny_write_access, but accounts for our holding a reference + * to the file ourselves */ +static int deny_bitmap_write_access(struct file * file) +{ + struct inode *inode = file->f_mapping->host; + + spin_lock(&inode->i_lock); + if (atomic_read(&inode->i_writecount) > 1) { + spin_unlock(&inode->i_lock); + return -ETXTBSY; + } + atomic_set(&inode->i_writecount, -1); + spin_unlock(&inode->i_lock); + + return 0; +} + static int set_bitmap_file(mddev_t *mddev, int fd) { int err; @@ -3946,17 +3352,12 @@ static int set_bitmap_file(mddev_t *mddev, int fd) mddev->pers->quiesce(mddev, 1); if (fd >= 0) err = bitmap_create(mddev); - if (fd < 0 || err) { + if (fd < 0 || err) bitmap_destroy(mddev); - fd = -1; /* make sure to put the file */ - } mddev->pers->quiesce(mddev, 0); - } - if (fd < 0) { - if (mddev->bitmap_file) { - restore_bitmap_write_access(mddev->bitmap_file); + } else if (fd < 0) { + if (mddev->bitmap_file) fput(mddev->bitmap_file); - } mddev->bitmap_file = NULL; } @@ -4023,18 +3424,11 @@ static int set_array_info(mddev_t * mddev, mdu_array_info_t *info) mddev->default_bitmap_offset = MD_SB_BYTES >> 9; mddev->bitmap_offset = 0; - mddev->reshape_position = MaxSector; - /* * Generate a 128 bit UUID */ get_random_bytes(mddev->uuid, 16); - mddev->new_level = mddev->level; - mddev->new_chunk = mddev->chunk_size; - mddev->new_layout = mddev->layout; - mddev->delta_disks = 0; - return 0; } @@ -4090,16 +3484,14 @@ static int update_raid_disks(mddev_t *mddev, int raid_disks) { int rv; /* change the number of raid disks */ - if (mddev->pers->check_reshape == NULL) + if (mddev->pers->reshape == NULL) return -EINVAL; if (raid_disks <= 0 || raid_disks >= mddev->max_disks) return -EINVAL; - if (mddev->sync_thread || mddev->reshape_position != MaxSector) + if (mddev->sync_thread) return -EBUSY; - mddev->delta_disks = raid_disks - mddev->raid_disks; - - rv = mddev->pers->check_reshape(mddev); + rv = mddev->pers->reshape(mddev, raid_disks); return rv; } @@ -4270,7 +3662,7 @@ static int md_ioctl(struct inode *inode, struct file *file, if (cnt > 0 ) { printk(KERN_WARNING "md: %s(pid %d) used deprecated START_ARRAY ioctl. " - "This will not be supported beyond July 2006\n", + "START_ARRAY is removed in kernel 2.6.19 and above.\n", current->comm, current->pid); cnt--; } @@ -4437,6 +3829,11 @@ static int md_ioctl(struct inode *inode, struct file *file, goto done_unlock; default: + if (_IOC_TYPE(cmd) == MD_MAJOR) + printk(KERN_WARNING "md: %s(pid %d) used" + " obsolete MD ioctl, upgrade your" + " software to use new ictls.\n", + current->comm, current->pid); err = -EINVAL; goto abort_unlock; } @@ -4607,15 +4004,13 @@ void md_error(mddev_t *mddev, mdk_rdev_t *rdev) __builtin_return_address(0),__builtin_return_address(1), __builtin_return_address(2),__builtin_return_address(3)); */ - if (!mddev->pers) - return; if (!mddev->pers->error_handler) return; mddev->pers->error_handler(mddev,rdev); set_bit(MD_RECOVERY_INTR, &mddev->recovery); set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); md_wakeup_thread(mddev->thread); - md_new_event_inintr(mddev); + md_new_event(mddev); } /* seq_file implementation /proc/mdstat */ @@ -4643,10 +4038,7 @@ static void status_unused(struct seq_file *seq) static void status_resync(struct seq_file *seq, mddev_t * mddev) { - sector_t max_blocks, resync, res; - unsigned long dt, db, rt; - int scale; - unsigned int per_milli; + unsigned long max_blocks, resync, res, dt, db, rt; resync = (mddev->curr_resync - atomic_read(&mddev->recovery_active))/2; @@ -4662,22 +4054,9 @@ static void status_resync(struct seq_file *seq, mddev_t * mddev) MD_BUG(); return; } - /* Pick 'scale' such that (resync>>scale)*1000 will fit - * in a sector_t, and (max_blocks>>scale) will fit in a - * u32, as those are the requirements for sector_div. - * Thus 'scale' must be at least 10 - */ - scale = 10; - if (sizeof(sector_t) > sizeof(unsigned long)) { - while ( max_blocks/2 > (1ULL<<(scale+32))) - scale++; - } - res = (resync>>scale)*1000; - sector_div(res, (u32)((max_blocks>>scale)+1)); - - per_milli = res; + res = (resync/1024)*1000/(max_blocks/1024 + 1); { - int i, x = per_milli/50, y = 20-x; + int i, x = res/50, y = 20-x; seq_printf(seq, "["); for (i = 0; i < x; i++) seq_printf(seq, "="); @@ -4686,14 +4065,10 @@ static void status_resync(struct seq_file *seq, mddev_t * mddev) seq_printf(seq, "."); seq_printf(seq, "] "); } - seq_printf(seq, " %s =%3u.%u%% (%llu/%llu)", - (test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery)? - "reshape" : + seq_printf(seq, " %s =%3lu.%lu%% (%lu/%lu)", (test_bit(MD_RECOVERY_SYNC, &mddev->recovery) ? - "resync" : "recovery")), - per_milli/10, per_milli % 10, - (unsigned long long) resync, - (unsigned long long) max_blocks); + "resync" : "recovery"), + res/10, res % 10, resync, max_blocks); /* * We do not want to overflow, so the order of operands and @@ -4706,13 +4081,12 @@ static void status_resync(struct seq_file *seq, mddev_t * mddev) */ dt = ((jiffies - mddev->resync_mark) / HZ); if (!dt) dt++; - db = (mddev->curr_mark_cnt - atomic_read(&mddev->recovery_active)) - - mddev->resync_mark_cnt; - rt = (dt * ((unsigned long)(max_blocks-resync) / (db/2/100+1)))/100; + db = resync - (mddev->resync_mark_cnt/2); + rt = (dt * ((max_blocks-resync) / (db/100+1)))/100; seq_printf(seq, " finish=%lu.%lumin", rt / 60, (rt % 60)/6); - seq_printf(seq, " speed=%ldK/sec", db/2/dt); + seq_printf(seq, " speed=%ldK/sec", db/dt); } static void *md_seq_start(struct seq_file *seq, loff_t *pos) @@ -4807,9 +4181,8 @@ static int md_seq_show(struct seq_file *seq, void *v) return 0; } - if (mddev_lock(mddev) < 0) + if (mddev_lock(mddev)!=0) return -EINTR; - if (mddev->pers || mddev->raid_disks || !list_empty(&mddev->disks)) { seq_printf(seq, "%s : %sactive", mdname(mddev), mddev->pers ? "" : "in"); @@ -5044,7 +4417,7 @@ void md_write_start(mddev_t *mddev, struct bio *bi) spin_lock_irq(&mddev->write_lock); if (mddev->in_sync) { mddev->in_sync = 0; - mddev->sb_dirty = 3; + mddev->sb_dirty = 1; md_wakeup_thread(mddev->thread); } spin_unlock_irq(&mddev->write_lock); @@ -5057,7 +4430,7 @@ void md_write_end(mddev_t *mddev) if (atomic_dec_and_test(&mddev->writes_pending)) { if (mddev->safemode == 2) md_wakeup_thread(mddev->thread); - else if (mddev->safemode_delay) + else mod_timer(&mddev->safemode_timer, jiffies + mddev->safemode_delay); } } @@ -5066,7 +4439,7 @@ static DECLARE_WAIT_QUEUE_HEAD(resync_wait); #define SYNC_MARKS 10 #define SYNC_MARK_STEP (3*HZ) -void md_do_sync(mddev_t *mddev) +static void md_do_sync(mddev_t *mddev) { mddev_t *mddev2; unsigned int currspeed = 0, @@ -5078,14 +4451,10 @@ void md_do_sync(mddev_t *mddev) struct list_head *tmp; sector_t last_check; int skipped = 0; - struct list_head *rtmp; - mdk_rdev_t *rdev; /* just incase thread restarts... */ if (test_bit(MD_RECOVERY_DONE, &mddev->recovery)) return; - if (mddev->ro) /* never try to sync a read-only array */ - return; /* we overload curr_resync somewhat here. * 0 == not engaged in resync at all @@ -5144,30 +4513,15 @@ void md_do_sync(mddev_t *mddev) } } while (mddev->curr_resync < 2); - j = 0; if (test_bit(MD_RECOVERY_SYNC, &mddev->recovery)) { /* resync follows the size requested by the personality, * which defaults to physical size, but can be virtual size */ max_sectors = mddev->resync_max_sectors; mddev->resync_mismatches = 0; - /* we don't use the checkpoint if there's a bitmap */ - if (!mddev->bitmap && - !test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery)) - j = mddev->recovery_cp; - } else if (test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery)) - max_sectors = mddev->size << 1; - else { + } else /* recovery follows the physical size of devices */ max_sectors = mddev->size << 1; - j = MaxSector; - ITERATE_RDEV(mddev,rdev,rtmp) - if (rdev->raid_disk >= 0 && - !test_bit(Faulty, &rdev->flags) && - !test_bit(In_sync, &rdev->flags) && - rdev->recovery_offset < j) - j = rdev->recovery_offset; - } printk(KERN_INFO "md: syncing RAID array %s\n", mdname(mddev)); printk(KERN_INFO "md: minimum _guaranteed_ reconstruction speed:" @@ -5177,7 +4531,12 @@ void md_do_sync(mddev_t *mddev) speed_max(mddev)); is_mddev_idle(mddev); /* this also initializes IO event counters */ - + /* we don't use the checkpoint if there's a bitmap */ + if (test_bit(MD_RECOVERY_SYNC, &mddev->recovery) && !mddev->bitmap + && ! test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery)) + j = mddev->recovery_cp; + else + j = 0; io_sectors = 0; for (m = 0; m < SYNC_MARKS; m++) { mark[m] = jiffies; @@ -5223,7 +4582,6 @@ void md_do_sync(mddev_t *mddev) j += sectors; if (j>1) mddev->curr_resync = j; - mddev->curr_mark_cnt = io_sectors; if (last_check == 0) /* this is the earliers that rebuilt will be * visible in /proc/mdstat @@ -5297,30 +4655,15 @@ void md_do_sync(mddev_t *mddev) mddev->pers->sync_request(mddev, max_sectors, &skipped, 1); if (!test_bit(MD_RECOVERY_ERR, &mddev->recovery) && - test_bit(MD_RECOVERY_SYNC, &mddev->recovery) && - !test_bit(MD_RECOVERY_CHECK, &mddev->recovery) && - mddev->curr_resync > 2) { - if (test_bit(MD_RECOVERY_SYNC, &mddev->recovery)) { - if (test_bit(MD_RECOVERY_INTR, &mddev->recovery)) { - if (mddev->curr_resync >= mddev->recovery_cp) { - printk(KERN_INFO - "md: checkpointing recovery of %s.\n", - mdname(mddev)); - mddev->recovery_cp = mddev->curr_resync; - } - } else - mddev->recovery_cp = MaxSector; - } else { - if (!test_bit(MD_RECOVERY_INTR, &mddev->recovery)) - mddev->curr_resync = MaxSector; - ITERATE_RDEV(mddev,rdev,rtmp) - if (rdev->raid_disk >= 0 && - !test_bit(Faulty, &rdev->flags) && - !test_bit(In_sync, &rdev->flags) && - rdev->recovery_offset < mddev->curr_resync) - rdev->recovery_offset = mddev->curr_resync; - mddev->sb_dirty = 1; - } + mddev->curr_resync > 2 && + mddev->curr_resync >= mddev->recovery_cp) { + if (test_bit(MD_RECOVERY_INTR, &mddev->recovery)) { + printk(KERN_INFO + "md: checkpointing recovery of %s.\n", + mdname(mddev)); + mddev->recovery_cp = mddev->curr_resync; + } else + mddev->recovery_cp = MaxSector; } skip: @@ -5329,7 +4672,6 @@ void md_do_sync(mddev_t *mddev) set_bit(MD_RECOVERY_DONE, &mddev->recovery); md_wakeup_thread(mddev->thread); } -EXPORT_SYMBOL_GPL(md_do_sync); /* @@ -5385,14 +4727,14 @@ void md_check_recovery(mddev_t *mddev) )) return; - if (mddev_trylock(mddev)) { + if (mddev_trylock(mddev)==0) { int spares =0; spin_lock_irq(&mddev->write_lock); if (mddev->safemode && !atomic_read(&mddev->writes_pending) && !mddev->in_sync && mddev->recovery_cp == MaxSector) { mddev->in_sync = 1; - mddev->sb_dirty = 3; + mddev->sb_dirty = 1; } if (mddev->safemode == 1) mddev->safemode = 0; @@ -5441,8 +4783,6 @@ void md_check_recovery(mddev_t *mddev) clear_bit(MD_RECOVERY_INTR, &mddev->recovery); clear_bit(MD_RECOVERY_DONE, &mddev->recovery); - if (test_bit(MD_RECOVERY_FROZEN, &mddev->recovery)) - goto unlock; /* no recovery is running. * remove any failed drives, then * add spares if possible. @@ -5465,7 +4805,6 @@ void md_check_recovery(mddev_t *mddev) ITERATE_RDEV(mddev,rdev,rtmp) if (rdev->raid_disk < 0 && !test_bit(Faulty, &rdev->flags)) { - rdev->recovery_offset = 0; if (mddev->pers->hot_add_disk(mddev,rdev)) { char nm[20]; sprintf(nm, "rd%d", rdev->raid_disk); @@ -5524,10 +4863,8 @@ static int md_notify_reboot(struct notifier_block *this, printk(KERN_INFO "md: stopping all md devices.\n"); ITERATE_MDDEV(mddev,tmp) - if (mddev_trylock(mddev)) { + if (mddev_trylock(mddev)==0) do_md_stop (mddev, 1); - mddev_unlock(mddev); - } /* * certain more exotic SCSI devices are known to be * volatile wrt too early system reboots. While the @@ -5558,6 +4895,8 @@ static void md_geninit(void) static int __init md_init(void) { + int minor; + printk(KERN_INFO "md: md driver %d.%d.%d MAX_MD_DEVS=%d," " MD_SB_DISKS=%d\n", MD_MAJOR_VERSION, MD_MINOR_VERSION, @@ -5571,11 +4910,23 @@ static int __init md_init(void) unregister_blkdev(MAJOR_NR, "md"); return -1; } + devfs_mk_dir("md"); blk_register_region(MKDEV(MAJOR_NR, 0), MAX_MD_DEVS, THIS_MODULE, md_probe, NULL, NULL); blk_register_region(MKDEV(mdp_major, 0), MAX_MD_DEVS<raid_disks; @@ -480,10 +492,11 @@ static int multipath_run (mddev_t *mddev) mdname(mddev)); goto out_free_conf; } - mddev->degraded = conf->raid_disks - conf->working_disks; + mddev->degraded = conf->raid_disks = conf->working_disks; - conf->pool = mempool_create_kzalloc_pool(NR_RESERVED_BUFS, - sizeof(struct multipath_bh)); + conf->pool = mempool_create(NR_RESERVED_BUFS, + mp_pool_alloc, mp_pool_free, + NULL); if (conf->pool == NULL) { printk(KERN_ERR "multipath: couldn't allocate memory for %s\n", diff --git a/drivers/md/raid0.c b/drivers/md/raid0.c index cb8c6317e..678f4dbbe 100644 --- a/drivers/md/raid0.c +++ b/drivers/md/raid0.c @@ -331,14 +331,13 @@ static int raid0_run (mddev_t *mddev) goto out_free_conf; size = conf->strip_zone[cur].size; - conf->hash_table[0] = conf->strip_zone + cur; - for (i=1; i< nb_zone; i++) { + for (i=0; i< nb_zone; i++) { + conf->hash_table[i] = conf->strip_zone + cur; while (size <= conf->hash_spacing) { cur++; size += conf->strip_zone[cur].size; } size -= conf->hash_spacing; - conf->hash_table[i] = conf->strip_zone + cur; } if (conf->preshift) { conf->hash_spacing >>= conf->preshift; diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c index 3b4d69c05..f0b7caa4a 100644 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c @@ -315,11 +315,10 @@ static int raid1_end_write_request(struct bio *bio, unsigned int bytes_done, int if (r1_bio->bios[mirror] == bio) break; - if (error == -EOPNOTSUPP && test_bit(R1BIO_Barrier, &r1_bio->state)) { + if (error == -ENOTSUPP && test_bit(R1BIO_Barrier, &r1_bio->state)) { set_bit(BarriersNotsupp, &conf->mirrors[mirror].rdev->flags); set_bit(R1BIO_BarrierRetry, &r1_bio->state); r1_bio->mddev->barriers_work = 0; - /* Don't rdev_dec_pending in this branch - keep it for the retry */ } else { /* * this branch is our 'one mirror IO has finished' event handler: @@ -366,7 +365,6 @@ static int raid1_end_write_request(struct bio *bio, unsigned int bytes_done, int } } } - rdev_dec_pending(conf->mirrors[mirror].rdev, conf->mddev); } /* * @@ -374,26 +372,30 @@ static int raid1_end_write_request(struct bio *bio, unsigned int bytes_done, int * already. */ if (atomic_dec_and_test(&r1_bio->remaining)) { - if (test_bit(R1BIO_BarrierRetry, &r1_bio->state)) + if (test_bit(R1BIO_BarrierRetry, &r1_bio->state)) { reschedule_retry(r1_bio); - else { - /* it really is the end of this request */ - if (test_bit(R1BIO_BehindIO, &r1_bio->state)) { - /* free extra copy of the data pages */ - int i = bio->bi_vcnt; - while (i--) - safe_put_page(bio->bi_io_vec[i].bv_page); - } - /* clear the bitmap if all writes complete successfully */ - bitmap_endwrite(r1_bio->mddev->bitmap, r1_bio->sector, - r1_bio->sectors, - !test_bit(R1BIO_Degraded, &r1_bio->state), - behind); - md_write_end(r1_bio->mddev); - raid_end_bio_io(r1_bio); + /* Don't dec_pending yet, we want to hold + * the reference over the retry + */ + goto out; } + if (test_bit(R1BIO_BehindIO, &r1_bio->state)) { + /* free extra copy of the data pages */ + int i = bio->bi_vcnt; + while (i--) + safe_put_page(bio->bi_io_vec[i].bv_page); + } + /* clear the bitmap if all writes complete successfully */ + bitmap_endwrite(r1_bio->mddev->bitmap, r1_bio->sector, + r1_bio->sectors, + !test_bit(R1BIO_Degraded, &r1_bio->state), + behind); + md_write_end(r1_bio->mddev); + raid_end_bio_io(r1_bio); } + rdev_dec_pending(conf->mirrors[mirror].rdev, conf->mddev); + out: if (to_put) bio_put(to_put); @@ -751,24 +753,18 @@ static int make_request(request_queue_t *q, struct bio * bio) const int rw = bio_data_dir(bio); int do_barriers; + if (unlikely(!mddev->barriers_work && bio_barrier(bio))) { + bio_endio(bio, bio->bi_size, -EOPNOTSUPP); + return 0; + } + /* * Register the new request and wait if the reconstruction * thread has put up a bar for new requests. * Continue immediately if no resync is active currently. - * We test barriers_work *after* md_write_start as md_write_start - * may cause the first superblock write, and that will check out - * if barriers work. */ - md_write_start(mddev, bio); /* wait on superblock update early */ - if (unlikely(!mddev->barriers_work && bio_barrier(bio))) { - if (rw == WRITE) - md_write_end(mddev); - bio_endio(bio, bio->bi_size, -EOPNOTSUPP); - return 0; - } - wait_barrier(conf); disk_stat_inc(mddev->gendisk, ios[rw]); @@ -930,13 +926,10 @@ static void status(struct seq_file *seq, mddev_t *mddev) seq_printf(seq, " [%d/%d] [", conf->raid_disks, conf->working_disks); - rcu_read_lock(); - for (i = 0; i < conf->raid_disks; i++) { - mdk_rdev_t *rdev = rcu_dereference(conf->mirrors[i].rdev); + for (i = 0; i < conf->raid_disks; i++) seq_printf(seq, "%s", - rdev && test_bit(In_sync, &rdev->flags) ? "U" : "_"); - } - rcu_read_unlock(); + conf->mirrors[i].rdev && + test_bit(In_sync, &conf->mirrors[i].rdev->flags) ? "U" : "_"); seq_printf(seq, "]"); } @@ -978,6 +971,7 @@ static void error(mddev_t *mddev, mdk_rdev_t *rdev) static void print_conf(conf_t *conf) { int i; + mirror_info_t *tmp; printk("RAID1 conf printout:\n"); if (!conf) { @@ -987,17 +981,14 @@ static void print_conf(conf_t *conf) printk(" --- wd:%d rd:%d\n", conf->working_disks, conf->raid_disks); - rcu_read_lock(); for (i = 0; i < conf->raid_disks; i++) { char b[BDEVNAME_SIZE]; - mdk_rdev_t *rdev = rcu_dereference(conf->mirrors[i].rdev); - if (rdev) + tmp = conf->mirrors + i; + if (tmp->rdev) printk(" disk %d, wo:%d, o:%d, dev:%s\n", - i, !test_bit(In_sync, &rdev->flags), - !test_bit(Faulty, &rdev->flags), - bdevname(rdev->bdev,b)); + i, !test_bit(In_sync, &tmp->rdev->flags), !test_bit(Faulty, &tmp->rdev->flags), + bdevname(tmp->rdev->bdev,b)); } - rcu_read_unlock(); } static void close_sync(conf_t *conf) @@ -1013,20 +1004,20 @@ static int raid1_spare_active(mddev_t *mddev) { int i; conf_t *conf = mddev->private; + mirror_info_t *tmp; /* * Find all failed disks within the RAID1 configuration - * and mark them readable. - * Called under mddev lock, so rcu protection not needed. + * and mark them readable */ for (i = 0; i < conf->raid_disks; i++) { - mdk_rdev_t *rdev = conf->mirrors[i].rdev; - if (rdev - && !test_bit(Faulty, &rdev->flags) - && !test_bit(In_sync, &rdev->flags)) { + tmp = conf->mirrors + i; + if (tmp->rdev + && !test_bit(Faulty, &tmp->rdev->flags) + && !test_bit(In_sync, &tmp->rdev->flags)) { conf->working_disks++; mddev->degraded--; - set_bit(In_sync, &rdev->flags); + set_bit(In_sync, &tmp->rdev->flags); } } @@ -1144,19 +1135,8 @@ static int end_sync_write(struct bio *bio, unsigned int bytes_done, int error) mirror = i; break; } - if (!uptodate) { - int sync_blocks = 0; - sector_t s = r1_bio->sector; - long sectors_to_go = r1_bio->sectors; - /* make sure these bits doesn't get cleared. */ - do { - bitmap_end_sync(mddev->bitmap, s, - &sync_blocks, 1); - s += sync_blocks; - sectors_to_go -= sync_blocks; - } while (sectors_to_go > 0); + if (!uptodate) md_error(mddev, conf->mirrors[mirror].rdev); - } update_head_pos(mirror, r1_bio); @@ -1242,7 +1222,7 @@ static void sync_request_write(mddev_t *mddev, r1bio_t *r1_bio) /* ouch - failed to read all of that. * Try some synchronous reads of other devices to get * good data, much like with normal read errors. Only - * read into the pages we already have so we don't + * read into the pages we already have so they we don't * need to re-issue the read request. * We don't need to freeze the array, because being in an * active sync request, there is no normal IO, and @@ -1262,10 +1242,6 @@ static void sync_request_write(mddev_t *mddev, r1bio_t *r1_bio) s = PAGE_SIZE >> 9; do { if (r1_bio->bios[d]->bi_end_io == end_sync_read) { - /* No rcu protection needed here devices - * can only be removed when no resync is - * active, and resync is currently active - */ rdev = conf->mirrors[d].rdev; if (sync_page_io(rdev->bdev, sect + rdev->data_offset, @@ -1417,18 +1393,14 @@ static void raid1d(mddev_t *mddev) unplug = 1; } else if (test_bit(R1BIO_BarrierRetry, &r1_bio->state)) { /* some requests in the r1bio were BIO_RW_BARRIER - * requests which failed with -EOPNOTSUPP. Hohumm.. + * requests which failed with -ENOTSUPP. Hohumm.. * Better resubmit without the barrier. * We know which devices to resubmit for, because * all others have had their bios[] entry cleared. - * We already have a nr_pending reference on these rdevs. */ int i; clear_bit(R1BIO_BarrierRetry, &r1_bio->state); clear_bit(R1BIO_Barrier, &r1_bio->state); - for (i=0; i < conf->raid_disks; i++) - if (r1_bio->bios[i]) - atomic_inc(&r1_bio->remaining); for (i=0; i < conf->raid_disks; i++) if (r1_bio->bios[i]) { struct bio_vec *bvec; @@ -1472,11 +1444,6 @@ static void raid1d(mddev_t *mddev) s = PAGE_SIZE >> 9; do { - /* Note: no rcu protection needed here - * as this is synchronous in the raid1d thread - * which is the thread that might remove - * a device. If raid1d ever becomes multi-threaded.... - */ rdev = conf->mirrors[d].rdev; if (rdev && test_bit(In_sync, &rdev->flags) && @@ -1522,11 +1489,9 @@ static void raid1d(mddev_t *mddev) s<<9, conf->tmppage, READ) == 0) /* Well, this device is dead */ md_error(mddev, rdev); - else { + else atomic_add(s, &rdev->corrected_errors); - printk(KERN_INFO "raid1:%s: read error corrected (%d sectors at %llu on %s)\n", - mdname(mddev), s, (unsigned long long)(sect + rdev->data_offset), bdevname(rdev->bdev, b)); - } + } } } else { @@ -1581,7 +1546,8 @@ static int init_resync(conf_t *conf) int buffs; buffs = RESYNC_WINDOW / RESYNC_BLOCK_SIZE; - BUG_ON(conf->r1buf_pool); + if (conf->r1buf_pool) + BUG(); conf->r1buf_pool = mempool_create(buffs, r1buf_pool_alloc, r1buf_pool_free, conf->poolinfo); if (!conf->r1buf_pool) @@ -1640,13 +1606,6 @@ static sector_t sync_request(mddev_t *mddev, sector_t sector_nr, int *skipped, i return 0; } - if (mddev->bitmap == NULL && - mddev->recovery_cp == MaxSector && - !test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery) && - conf->fullsync == 0) { - *skipped = 1; - return max_sector - sector_nr; - } /* before building a request, check if we can skip these blocks.. * This call the bitmap_start_sync doesn't actually record anything */ @@ -1761,7 +1720,8 @@ static sector_t sync_request(mddev_t *mddev, sector_t sector_nr, int *skipped, i !conf->fullsync && !test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery)) break; - BUG_ON(sync_blocks < (PAGE_SIZE>>9)); + if (sync_blocks < (PAGE_SIZE>>9)) + BUG(); if (len > (sync_blocks<<9)) len = sync_blocks<<9; } @@ -1802,17 +1762,19 @@ static sector_t sync_request(mddev_t *mddev, sector_t sector_nr, int *skipped, i for (i=0; iraid_disks; i++) { bio = r1_bio->bios[i]; if (bio->bi_end_io == end_sync_read) { - md_sync_acct(bio->bi_bdev, nr_sectors); + md_sync_acct(conf->mirrors[i].rdev->bdev, nr_sectors); generic_make_request(bio); } } } else { atomic_set(&r1_bio->remaining, 1); bio = r1_bio->bios[r1_bio->read_disk]; - md_sync_acct(bio->bi_bdev, nr_sectors); + md_sync_acct(conf->mirrors[r1_bio->read_disk].rdev->bdev, + nr_sectors); generic_make_request(bio); } + return nr_sectors; } @@ -1829,11 +1791,6 @@ static int run(mddev_t *mddev) mdname(mddev), mddev->level); goto out; } - if (mddev->reshape_position != MaxSector) { - printk("raid1: %s: reshape_position set but not supported\n", - mdname(mddev)); - goto out; - } /* * copy the already verified devices into our private RAID1 * bookkeeping area. [whatever we allocate in run(), @@ -1911,8 +1868,7 @@ static int run(mddev_t *mddev) disk = conf->mirrors + i; - if (!disk->rdev || - !test_bit(In_sync, &disk->rdev->flags)) { + if (!disk->rdev) { disk->head_position = 0; mddev->degraded++; } @@ -2017,7 +1973,7 @@ static int raid1_resize(mddev_t *mddev, sector_t sectors) return 0; } -static int raid1_reshape(mddev_t *mddev) +static int raid1_reshape(mddev_t *mddev, int raid_disks) { /* We need to: * 1/ resize the r1bio_pool @@ -2034,22 +1990,10 @@ static int raid1_reshape(mddev_t *mddev) struct pool_info *newpoolinfo; mirror_info_t *newmirrors; conf_t *conf = mddev_to_conf(mddev); - int cnt, raid_disks; + int cnt; int d, d2; - /* Cannot change chunk_size, layout, or level */ - if (mddev->chunk_size != mddev->new_chunk || - mddev->layout != mddev->new_layout || - mddev->level != mddev->new_level) { - mddev->new_chunk = mddev->chunk_size; - mddev->new_layout = mddev->layout; - mddev->new_level = mddev->level; - return -EINVAL; - } - - raid_disks = mddev->raid_disks + mddev->delta_disks; - if (raid_disks < conf->raid_disks) { cnt=0; for (d= 0; d < conf->raid_disks; d++) @@ -2096,7 +2040,6 @@ static int raid1_reshape(mddev_t *mddev) mddev->degraded += (raid_disks - conf->raid_disks); conf->raid_disks = mddev->raid_disks = raid_disks; - mddev->delta_disks = 0; conf->last_used = 0; /* just make sure it is in-range */ lower_barrier(conf); @@ -2138,7 +2081,7 @@ static struct mdk_personality raid1_personality = .spare_active = raid1_spare_active, .sync_request = sync_request, .resize = raid1_resize, - .check_reshape = raid1_reshape, + .reshape = raid1_reshape, .quiesce = raid1_quiesce, }; diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c index 115a6f866..039ed49b3 100644 --- a/drivers/md/raid10.c +++ b/drivers/md/raid10.c @@ -29,7 +29,6 @@ * raid_disks * near_copies (stored in low byte of layout) * far_copies (stored in second byte of layout) - * far_offset (stored in bit 16 of layout ) * * The data to be stored is divided into chunks using chunksize. * Each device is divided into far_copies sections. @@ -37,14 +36,10 @@ * near_copies copies of each chunk is stored (each on a different drive). * The starting device for each section is offset near_copies from the starting * device of the previous section. - * Thus they are (near_copies*far_copies) of each chunk, and each is on a different + * Thus there are (near_copies*far_copies) of each chunk, and each is on a different * drive. * near_copies and far_copies must be at least one, and their product is at most * raid_disks. - * - * If far_offset is true, then the far_copies are handled a bit differently. - * The copies are still in different stripes, but instead of be very far apart - * on disk, there are adjacent stripes. */ /* @@ -362,7 +357,8 @@ static int raid10_end_write_request(struct bio *bio, unsigned int bytes_done, in * With this layout, and block is never stored twice on the one device. * * raid10_find_phys finds the sector offset of a given virtual sector - * on each device that it is on. + * on each device that it is on. If a block isn't on a device, + * that entry in the array is set to MaxSector. * * raid10_find_virt does the reverse mapping, from a device and a * sector offset to a virtual address @@ -385,8 +381,6 @@ static void raid10_find_phys(conf_t *conf, r10bio_t *r10bio) chunk *= conf->near_copies; stripe = chunk; dev = sector_div(stripe, conf->raid_disks); - if (conf->far_offset) - stripe *= conf->far_copies; sector += stripe << conf->chunk_shift; @@ -420,24 +414,16 @@ static sector_t raid10_find_virt(conf_t *conf, sector_t sector, int dev) { sector_t offset, chunk, vchunk; - offset = sector & conf->chunk_mask; - if (conf->far_offset) { - int fc; - chunk = sector >> conf->chunk_shift; - fc = sector_div(chunk, conf->far_copies); - dev -= fc * conf->near_copies; - if (dev < 0) - dev += conf->raid_disks; - } else { - while (sector > conf->stride) { - sector -= conf->stride; - if (dev < conf->near_copies) - dev += conf->raid_disks - conf->near_copies; - else - dev -= conf->near_copies; - } - chunk = sector >> conf->chunk_shift; + while (sector > conf->stride) { + sector -= conf->stride; + if (dev < conf->near_copies) + dev += conf->raid_disks - conf->near_copies; + else + dev -= conf->near_copies; } + + offset = sector & conf->chunk_mask; + chunk = sector >> conf->chunk_shift; vchunk = chunk * conf->raid_disks + dev; sector_div(vchunk, conf->near_copies); return (vchunk << conf->chunk_shift) + offset; @@ -914,12 +900,9 @@ static void status(struct seq_file *seq, mddev_t *mddev) seq_printf(seq, " %dK chunks", mddev->chunk_size/1024); if (conf->near_copies > 1) seq_printf(seq, " %d near-copies", conf->near_copies); - if (conf->far_copies > 1) { - if (conf->far_offset) - seq_printf(seq, " %d offset-copies", conf->far_copies); - else - seq_printf(seq, " %d far-copies", conf->far_copies); - } + if (conf->far_copies > 1) + seq_printf(seq, " %d far-copies", conf->far_copies); + seq_printf(seq, " [%d/%d] [", conf->raid_disks, conf->working_disks); for (i = 0; i < conf->raid_disks; i++) @@ -1134,7 +1117,8 @@ static int end_sync_read(struct bio *bio, unsigned int bytes_done, int error) for (i=0; icopies; i++) if (r10_bio->devs[i].bio == bio) break; - BUG_ON(i == conf->copies); + if (i == conf->copies) + BUG(); update_head_pos(i, r10_bio); d = r10_bio->devs[i].devnum; @@ -1424,45 +1408,36 @@ static void raid10d(mddev_t *mddev) if (s > (PAGE_SIZE>>9)) s = PAGE_SIZE >> 9; - rcu_read_lock(); do { int d = r10_bio->devs[sl].devnum; - rdev = rcu_dereference(conf->mirrors[d].rdev); + rdev = conf->mirrors[d].rdev; if (rdev && - test_bit(In_sync, &rdev->flags)) { - atomic_inc(&rdev->nr_pending); - rcu_read_unlock(); - success = sync_page_io(rdev->bdev, - r10_bio->devs[sl].addr + - sect + rdev->data_offset, - s<<9, - conf->tmppage, READ); - rdev_dec_pending(rdev, mddev); - rcu_read_lock(); - if (success) - break; + test_bit(In_sync, &rdev->flags) && + sync_page_io(rdev->bdev, + r10_bio->devs[sl].addr + + sect + rdev->data_offset, + s<<9, + conf->tmppage, READ)) + success = 1; + else { + sl++; + if (sl == conf->copies) + sl = 0; } - sl++; - if (sl == conf->copies) - sl = 0; } while (!success && sl != r10_bio->read_slot); - rcu_read_unlock(); if (success) { int start = sl; /* write it back and re-read */ - rcu_read_lock(); while (sl != r10_bio->read_slot) { int d; if (sl==0) sl = conf->copies; sl--; d = r10_bio->devs[sl].devnum; - rdev = rcu_dereference(conf->mirrors[d].rdev); + rdev = conf->mirrors[d].rdev; if (rdev && test_bit(In_sync, &rdev->flags)) { - atomic_inc(&rdev->nr_pending); - rcu_read_unlock(); atomic_add(s, &rdev->corrected_errors); if (sync_page_io(rdev->bdev, r10_bio->devs[sl].addr + @@ -1470,8 +1445,6 @@ static void raid10d(mddev_t *mddev) s<<9, conf->tmppage, WRITE) == 0) /* Well, this device is dead */ md_error(mddev, rdev); - rdev_dec_pending(rdev, mddev); - rcu_read_lock(); } } sl = start; @@ -1481,26 +1454,17 @@ static void raid10d(mddev_t *mddev) sl = conf->copies; sl--; d = r10_bio->devs[sl].devnum; - rdev = rcu_dereference(conf->mirrors[d].rdev); + rdev = conf->mirrors[d].rdev; if (rdev && test_bit(In_sync, &rdev->flags)) { - atomic_inc(&rdev->nr_pending); - rcu_read_unlock(); if (sync_page_io(rdev->bdev, r10_bio->devs[sl].addr + sect + rdev->data_offset, s<<9, conf->tmppage, READ) == 0) /* Well, this device is dead */ md_error(mddev, rdev); - else - printk(KERN_INFO "raid10:%s: read error corrected (%d sectors at %llu on %s)\n", - mdname(mddev), s, (unsigned long long)(sect+rdev->data_offset), bdevname(rdev->bdev, b)); - - rdev_dec_pending(rdev, mddev); - rcu_read_lock(); } } - rcu_read_unlock(); } else { /* Cannot read from anywhere -- bye bye array */ md_error(mddev, conf->mirrors[r10_bio->devs[r10_bio->read_slot].devnum].rdev); @@ -1554,7 +1518,8 @@ static int init_resync(conf_t *conf) int buffs; buffs = RESYNC_WINDOW / RESYNC_BLOCK_SIZE; - BUG_ON(conf->r10buf_pool); + if (conf->r10buf_pool) + BUG(); conf->r10buf_pool = mempool_create(buffs, r10buf_pool_alloc, r10buf_pool_free, conf); if (!conf->r10buf_pool) return -ENOMEM; @@ -1936,7 +1901,7 @@ static int run(mddev_t *mddev) mirror_info_t *disk; mdk_rdev_t *rdev; struct list_head *tmp; - int nc, fc, fo; + int nc, fc; sector_t stride, size; if (mddev->chunk_size == 0) { @@ -1946,9 +1911,8 @@ static int run(mddev_t *mddev) nc = mddev->layout & 255; fc = (mddev->layout >> 8) & 255; - fo = mddev->layout & (1<<16); if ((nc*fc) <2 || (nc*fc) > mddev->raid_disks || - (mddev->layout >> 17)) { + (mddev->layout >> 16)) { printk(KERN_ERR "raid10: %s: unsupported raid10 layout: 0x%8x\n", mdname(mddev), mddev->layout); goto out; @@ -1980,16 +1944,12 @@ static int run(mddev_t *mddev) conf->near_copies = nc; conf->far_copies = fc; conf->copies = nc*fc; - conf->far_offset = fo; conf->chunk_mask = (sector_t)(mddev->chunk_size>>9)-1; conf->chunk_shift = ffz(~mddev->chunk_size) - 9; - if (fo) - conf->stride = 1 << conf->chunk_shift; - else { - stride = mddev->size >> (conf->chunk_shift-1); - sector_div(stride, fc); - conf->stride = stride << conf->chunk_shift; - } + stride = mddev->size >> (conf->chunk_shift-1); + sector_div(stride, fc); + conf->stride = stride << conf->chunk_shift; + conf->r10bio_pool = mempool_create(NR_RAID10_BIOS, r10bio_pool_alloc, r10bio_pool_free, conf); if (!conf->r10bio_pool) { @@ -2041,8 +2001,7 @@ static int run(mddev_t *mddev) disk = conf->mirrors + i; - if (!disk->rdev || - !test_bit(In_sync, &disk->rdev->flags)) { + if (!disk->rdev) { disk->head_position = 0; mddev->degraded++; } @@ -2064,13 +2023,7 @@ static int run(mddev_t *mddev) /* * Ok, everything is just fine now */ - if (conf->far_offset) { - size = mddev->size >> (conf->chunk_shift-1); - size *= conf->raid_disks; - size <<= conf->chunk_shift; - sector_div(size, conf->far_copies); - } else - size = conf->stride * conf->raid_disks; + size = conf->stride * conf->raid_disks; sector_div(size, conf->near_copies); mddev->array_size = size/2; mddev->resync_max_sectors = size; @@ -2083,7 +2036,7 @@ static int run(mddev_t *mddev) * maybe... */ { - int stripe = conf->raid_disks * (mddev->chunk_size / PAGE_SIZE); + int stripe = conf->raid_disks * mddev->chunk_size / PAGE_SIZE; stripe /= conf->near_copies; if (mddev->queue->backing_dev_info.ra_pages < 2* stripe) mddev->queue->backing_dev_info.ra_pages = 2* stripe; diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index 450066007..2dba305da 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c @@ -2,11 +2,8 @@ * raid5.c : Multiple Devices driver for Linux * Copyright (C) 1996, 1997 Ingo Molnar, Miguel de Icaza, Gadi Oxman * Copyright (C) 1999, 2000 Ingo Molnar - * Copyright (C) 2002, 2003 H. Peter Anvin * - * RAID-4/5/6 management functions. - * Thanks to Penguin Computing for making the RAID-6 development possible - * by donating a test server! + * RAID-5 management functions. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -18,38 +15,14 @@ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* - * BITMAP UNPLUGGING: - * - * The sequencing for updating the bitmap reliably is a little - * subtle (and I got it wrong the first time) so it deserves some - * explanation. - * - * We group bitmap updates into batches. Each batch has a number. - * We may write out several batches at once, but that isn't very important. - * conf->bm_write is the number of the last batch successfully written. - * conf->bm_flush is the number of the last batch that was closed to - * new additions. - * When we discover that we will need to write to any block in a stripe - * (in add_stripe_bio) we update the in-memory bitmap and record in sh->bm_seq - * the number of the batch it will be in. This is bm_flush+1. - * When we are ready to do a write, if that batch hasn't been written yet, - * we plug the array and queue the stripe for later. - * When an unplug happens, we increment bm_flush, thus closing the current - * batch. - * When we notice that bm_flush > bm_write, we write out all pending updates - * to the bitmap, and advance bm_write to where bm_flush was. - * This may occasionally write a bit out twice, but is sure never to - * miss any bits. - */ +#include #include #include +#include #include #include -#include #include -#include "raid6.h" #include @@ -94,32 +67,22 @@ #define __inline__ #endif -#if !RAID6_USE_EMPTY_ZERO_PAGE -/* In .bss so it's zeroed */ -const char raid6_empty_zero_page[PAGE_SIZE] __attribute__((aligned(256))); -#endif - -static inline int raid6_next_disk(int disk, int raid_disks) -{ - disk++; - return (disk < raid_disks) ? disk : 0; -} static void print_raid5_conf (raid5_conf_t *conf); static void __release_stripe(raid5_conf_t *conf, struct stripe_head *sh) { if (atomic_dec_and_test(&sh->count)) { - BUG_ON(!list_empty(&sh->lru)); - BUG_ON(atomic_read(&conf->active_stripes)==0); + if (!list_empty(&sh->lru)) + BUG(); + if (atomic_read(&conf->active_stripes)==0) + BUG(); if (test_bit(STRIPE_HANDLE, &sh->state)) { - if (test_bit(STRIPE_DELAYED, &sh->state)) { + if (test_bit(STRIPE_DELAYED, &sh->state)) list_add_tail(&sh->lru, &conf->delayed_list); - blk_plug_device(conf->mddev->queue); - } else if (test_bit(STRIPE_BIT_DELAY, &sh->state) && - sh->bm_seq - conf->seq_write > 0) { + else if (test_bit(STRIPE_BIT_DELAY, &sh->state) && + conf->seq_write == sh->bm_seq) list_add_tail(&sh->lru, &conf->bitmap_list); - blk_plug_device(conf->mddev->queue); - } else { + else { clear_bit(STRIPE_BIT_DELAY, &sh->state); list_add_tail(&sh->lru, &conf->handle_list); } @@ -130,11 +93,11 @@ static void __release_stripe(raid5_conf_t *conf, struct stripe_head *sh) if (atomic_read(&conf->preread_active_stripes) < IO_THRESHOLD) md_wakeup_thread(conf->mddev->thread); } + list_add_tail(&sh->lru, &conf->inactive_list); atomic_dec(&conf->active_stripes); - if (!test_bit(STRIPE_EXPANDING, &sh->state)) { - list_add_tail(&sh->lru, &conf->inactive_list); + if (!conf->inactive_blocked || + atomic_read(&conf->active_stripes) < (conf->max_nr_stripes*3/4)) wake_up(&conf->wait_for_stripe); - } } } } @@ -142,7 +105,7 @@ static void release_stripe(struct stripe_head *sh) { raid5_conf_t *conf = sh->raid_conf; unsigned long flags; - + spin_lock_irqsave(&conf->device_lock, flags); __release_stripe(conf, sh); spin_unlock_irqrestore(&conf->device_lock, flags); @@ -155,7 +118,7 @@ static inline void remove_hash(struct stripe_head *sh) hlist_del_init(&sh->hash); } -static inline void insert_hash(raid5_conf_t *conf, struct stripe_head *sh) +static void insert_hash(raid5_conf_t *conf, struct stripe_head *sh) { struct hlist_head *hp = stripe_hash(conf, sh->sector); @@ -215,27 +178,27 @@ static int grow_buffers(struct stripe_head *sh, int num) static void raid5_build_block (struct stripe_head *sh, int i); -static void init_stripe(struct stripe_head *sh, sector_t sector, int pd_idx, int disks) +static void init_stripe(struct stripe_head *sh, sector_t sector, int pd_idx) { raid5_conf_t *conf = sh->raid_conf; - int i; + int disks = conf->raid_disks, i; - BUG_ON(atomic_read(&sh->count) != 0); - BUG_ON(test_bit(STRIPE_HANDLE, &sh->state)); + if (atomic_read(&sh->count) != 0) + BUG(); + if (test_bit(STRIPE_HANDLE, &sh->state)) + BUG(); CHECK_DEVLOCK(); PRINTK("init_stripe called, stripe %llu\n", (unsigned long long)sh->sector); remove_hash(sh); - + sh->sector = sector; sh->pd_idx = pd_idx; sh->state = 0; - sh->disks = disks; - - for (i = sh->disks; i--; ) { + for (i=disks; i--; ) { struct r5dev *dev = &sh->dev[i]; if (dev->toread || dev->towrite || dev->written || @@ -252,7 +215,7 @@ static void init_stripe(struct stripe_head *sh, sector_t sector, int pd_idx, int insert_hash(conf, sh); } -static struct stripe_head *__find_stripe(raid5_conf_t *conf, sector_t sector, int disks) +static struct stripe_head *__find_stripe(raid5_conf_t *conf, sector_t sector) { struct stripe_head *sh; struct hlist_node *hn; @@ -260,7 +223,7 @@ static struct stripe_head *__find_stripe(raid5_conf_t *conf, sector_t sector, in CHECK_DEVLOCK(); PRINTK("__find_stripe, sector %llu\n", (unsigned long long)sector); hlist_for_each_entry(sh, hn, stripe_hash(conf, sector), hash) - if (sh->sector == sector && sh->disks == disks) + if (sh->sector == sector) return sh; PRINTK("__stripe %llu not in cache\n", (unsigned long long)sector); return NULL; @@ -269,8 +232,8 @@ static struct stripe_head *__find_stripe(raid5_conf_t *conf, sector_t sector, in static void unplug_slaves(mddev_t *mddev); static void raid5_unplug_device(request_queue_t *q); -static struct stripe_head *get_active_stripe(raid5_conf_t *conf, sector_t sector, int disks, - int pd_idx, int noblock) +static struct stripe_head *get_active_stripe(raid5_conf_t *conf, sector_t sector, + int pd_idx, int noblock) { struct stripe_head *sh; @@ -282,7 +245,7 @@ static struct stripe_head *get_active_stripe(raid5_conf_t *conf, sector_t sector wait_event_lock_irq(conf->wait_for_stripe, conf->quiesce == 0, conf->device_lock, /* nothing */); - sh = __find_stripe(conf, sector, disks); + sh = __find_stripe(conf, sector); if (!sh) { if (!conf->inactive_blocked) sh = get_free_stripe(conf); @@ -296,19 +259,19 @@ static struct stripe_head *get_active_stripe(raid5_conf_t *conf, sector_t sector < (conf->max_nr_stripes *3/4) || !conf->inactive_blocked), conf->device_lock, - raid5_unplug_device(conf->mddev->queue) + unplug_slaves(conf->mddev); ); conf->inactive_blocked = 0; } else - init_stripe(sh, sector, pd_idx, disks); + init_stripe(sh, sector, pd_idx); } else { if (atomic_read(&sh->count)) { - BUG_ON(!list_empty(&sh->lru)); + if (!list_empty(&sh->lru)) + BUG(); } else { if (!test_bit(STRIPE_HANDLE, &sh->state)) atomic_inc(&conf->active_stripes); - if (list_empty(&sh->lru) && - !test_bit(STRIPE_EXPANDING, &sh->state)) + if (list_empty(&sh->lru)) BUG(); list_del_init(&sh->lru); } @@ -337,7 +300,6 @@ static int grow_one_stripe(raid5_conf_t *conf) kmem_cache_free(conf->slab_cache, sh); return 0; } - sh->disks = conf->raid_disks; /* we just created an active stripe so... */ atomic_set(&sh->count, 1); atomic_inc(&conf->active_stripes); @@ -351,144 +313,20 @@ static int grow_stripes(raid5_conf_t *conf, int num) kmem_cache_t *sc; int devs = conf->raid_disks; - sprintf(conf->cache_name[0], "raid5/%s", mdname(conf->mddev)); - sprintf(conf->cache_name[1], "raid5/%s-alt", mdname(conf->mddev)); - conf->active_name = 0; - sc = kmem_cache_create(conf->cache_name[conf->active_name], + sprintf(conf->cache_name, "raid5/%s", mdname(conf->mddev)); + + sc = kmem_cache_create(conf->cache_name, sizeof(struct stripe_head)+(devs-1)*sizeof(struct r5dev), 0, 0, NULL, NULL); if (!sc) return 1; conf->slab_cache = sc; - conf->pool_size = devs; - while (num--) + while (num--) { if (!grow_one_stripe(conf)) return 1; - return 0; -} - -#ifdef CONFIG_MD_RAID5_RESHAPE -static int resize_stripes(raid5_conf_t *conf, int newsize) -{ - /* Make all the stripes able to hold 'newsize' devices. - * New slots in each stripe get 'page' set to a new page. - * - * This happens in stages: - * 1/ create a new kmem_cache and allocate the required number of - * stripe_heads. - * 2/ gather all the old stripe_heads and tranfer the pages across - * to the new stripe_heads. This will have the side effect of - * freezing the array as once all stripe_heads have been collected, - * no IO will be possible. Old stripe heads are freed once their - * pages have been transferred over, and the old kmem_cache is - * freed when all stripes are done. - * 3/ reallocate conf->disks to be suitable bigger. If this fails, - * we simple return a failre status - no need to clean anything up. - * 4/ allocate new pages for the new slots in the new stripe_heads. - * If this fails, we don't bother trying the shrink the - * stripe_heads down again, we just leave them as they are. - * As each stripe_head is processed the new one is released into - * active service. - * - * Once step2 is started, we cannot afford to wait for a write, - * so we use GFP_NOIO allocations. - */ - struct stripe_head *osh, *nsh; - LIST_HEAD(newstripes); - struct disk_info *ndisks; - int err = 0; - kmem_cache_t *sc; - int i; - - if (newsize <= conf->pool_size) - return 0; /* never bother to shrink */ - - /* Step 1 */ - sc = kmem_cache_create(conf->cache_name[1-conf->active_name], - sizeof(struct stripe_head)+(newsize-1)*sizeof(struct r5dev), - 0, 0, NULL, NULL); - if (!sc) - return -ENOMEM; - - for (i = conf->max_nr_stripes; i; i--) { - nsh = kmem_cache_alloc(sc, GFP_KERNEL); - if (!nsh) - break; - - memset(nsh, 0, sizeof(*nsh) + (newsize-1)*sizeof(struct r5dev)); - - nsh->raid_conf = conf; - spin_lock_init(&nsh->lock); - - list_add(&nsh->lru, &newstripes); - } - if (i) { - /* didn't get enough, give up */ - while (!list_empty(&newstripes)) { - nsh = list_entry(newstripes.next, struct stripe_head, lru); - list_del(&nsh->lru); - kmem_cache_free(sc, nsh); - } - kmem_cache_destroy(sc); - return -ENOMEM; - } - /* Step 2 - Must use GFP_NOIO now. - * OK, we have enough stripes, start collecting inactive - * stripes and copying them over - */ - list_for_each_entry(nsh, &newstripes, lru) { - spin_lock_irq(&conf->device_lock); - wait_event_lock_irq(conf->wait_for_stripe, - !list_empty(&conf->inactive_list), - conf->device_lock, - unplug_slaves(conf->mddev) - ); - osh = get_free_stripe(conf); - spin_unlock_irq(&conf->device_lock); - atomic_set(&nsh->count, 1); - for(i=0; ipool_size; i++) - nsh->dev[i].page = osh->dev[i].page; - for( ; idev[i].page = NULL; - kmem_cache_free(conf->slab_cache, osh); - } - kmem_cache_destroy(conf->slab_cache); - - /* Step 3. - * At this point, we are holding all the stripes so the array - * is completely stalled, so now is a good time to resize - * conf->disks. - */ - ndisks = kzalloc(newsize * sizeof(struct disk_info), GFP_NOIO); - if (ndisks) { - for (i=0; iraid_disks; i++) - ndisks[i] = conf->disks[i]; - kfree(conf->disks); - conf->disks = ndisks; - } else - err = -ENOMEM; - - /* Step 4, return new stripes to service */ - while(!list_empty(&newstripes)) { - nsh = list_entry(newstripes.next, struct stripe_head, lru); - list_del_init(&nsh->lru); - for (i=conf->raid_disks; i < newsize; i++) - if (nsh->dev[i].page == NULL) { - struct page *p = alloc_page(GFP_NOIO); - nsh->dev[i].page = p; - if (!p) - err = -ENOMEM; - } - release_stripe(nsh); } - /* critical section pass, GFP_NOIO no longer needed */ - - conf->slab_cache = sc; - conf->active_name = 1-conf->active_name; - conf->pool_size = newsize; - return err; + return 0; } -#endif static int drop_one_stripe(raid5_conf_t *conf) { @@ -499,8 +337,9 @@ static int drop_one_stripe(raid5_conf_t *conf) spin_unlock_irq(&conf->device_lock); if (!sh) return 0; - BUG_ON(atomic_read(&sh->count)); - shrink_buffers(sh, conf->pool_size); + if (atomic_read(&sh->count)) + BUG(); + shrink_buffers(sh, conf->raid_disks); kmem_cache_free(conf->slab_cache, sh); atomic_dec(&conf->active_stripes); return 1; @@ -521,10 +360,8 @@ static int raid5_end_read_request(struct bio * bi, unsigned int bytes_done, { struct stripe_head *sh = bi->bi_private; raid5_conf_t *conf = sh->raid_conf; - int disks = sh->disks, i; + int disks = conf->raid_disks, i; int uptodate = test_bit(BIO_UPTODATE, &bi->bi_flags); - char b[BDEVNAME_SIZE]; - mdk_rdev_t *rdev; if (bi->bi_size) return 1; @@ -572,39 +409,25 @@ static int raid5_end_read_request(struct bio * bi, unsigned int bytes_done, set_bit(R5_UPTODATE, &sh->dev[i].flags); #endif if (test_bit(R5_ReadError, &sh->dev[i].flags)) { - rdev = conf->disks[i].rdev; - printk(KERN_INFO "raid5:%s: read error corrected (%lu sectors at %llu on %s)\n", - mdname(conf->mddev), STRIPE_SECTORS, - (unsigned long long)sh->sector + rdev->data_offset, - bdevname(rdev->bdev, b)); + printk(KERN_INFO "raid5: read error corrected!!\n"); clear_bit(R5_ReadError, &sh->dev[i].flags); clear_bit(R5_ReWrite, &sh->dev[i].flags); } if (atomic_read(&conf->disks[i].rdev->read_errors)) atomic_set(&conf->disks[i].rdev->read_errors, 0); } else { - const char *bdn = bdevname(conf->disks[i].rdev->bdev, b); int retry = 0; - rdev = conf->disks[i].rdev; - clear_bit(R5_UPTODATE, &sh->dev[i].flags); - atomic_inc(&rdev->read_errors); + atomic_inc(&conf->disks[i].rdev->read_errors); if (conf->mddev->degraded) - printk(KERN_WARNING "raid5:%s: read error not correctable (sector %llu on %s).\n", - mdname(conf->mddev), - (unsigned long long)sh->sector + rdev->data_offset, - bdn); + printk(KERN_WARNING "raid5: read error not correctable.\n"); else if (test_bit(R5_ReWrite, &sh->dev[i].flags)) /* Oh, no!!! */ - printk(KERN_WARNING "raid5:%s: read error NOT corrected!! (sector %llu on %s).\n", - mdname(conf->mddev), - (unsigned long long)sh->sector + rdev->data_offset, - bdn); - else if (atomic_read(&rdev->read_errors) + printk(KERN_WARNING "raid5: read error NOT corrected!!\n"); + else if (atomic_read(&conf->disks[i].rdev->read_errors) > conf->max_nr_stripes) printk(KERN_WARNING - "raid5:%s: Too many read errors, failing device %s.\n", - mdname(conf->mddev), bdn); + "raid5: Too many read errors, failing device.\n"); else retry = 1; if (retry) @@ -612,7 +435,7 @@ static int raid5_end_read_request(struct bio * bi, unsigned int bytes_done, else { clear_bit(R5_ReadError, &sh->dev[i].flags); clear_bit(R5_ReWrite, &sh->dev[i].flags); - md_error(conf->mddev, rdev); + md_error(conf->mddev, conf->disks[i].rdev); } } rdev_dec_pending(conf->disks[i].rdev, conf->mddev); @@ -635,7 +458,7 @@ static int raid5_end_write_request (struct bio *bi, unsigned int bytes_done, { struct stripe_head *sh = bi->bi_private; raid5_conf_t *conf = sh->raid_conf; - int disks = sh->disks, i; + int disks = conf->raid_disks, i; unsigned long flags; int uptodate = test_bit(BIO_UPTODATE, &bi->bi_flags); @@ -686,7 +509,8 @@ static void raid5_build_block (struct stripe_head *sh, int i) dev->req.bi_private = sh; dev->flags = 0; - dev->sector = compute_blocknr(sh, i); + if (i != sh->pd_idx) + dev->sector = compute_blocknr(sh, i); } static void error(mddev_t *mddev, mdk_rdev_t *rdev) @@ -713,7 +537,7 @@ static void error(mddev_t *mddev, mdk_rdev_t *rdev) " Operation continuing on %d devices\n", bdevname(rdev->bdev,b), conf->working_disks); } -} +} /* * Input: a 'big' sector number, @@ -751,12 +575,9 @@ static sector_t raid5_compute_sector(sector_t r_sector, unsigned int raid_disks, /* * Select the parity disk based on the user selected algorithm. */ - switch(conf->level) { - case 4: + if (conf->level == 4) *pd_idx = data_disks; - break; - case 5: - switch (conf->algorithm) { + else switch (conf->algorithm) { case ALGORITHM_LEFT_ASYMMETRIC: *pd_idx = data_disks - stripe % raid_disks; if (*dd_idx >= *pd_idx) @@ -778,39 +599,6 @@ static sector_t raid5_compute_sector(sector_t r_sector, unsigned int raid_disks, default: printk(KERN_ERR "raid5: unsupported algorithm %d\n", conf->algorithm); - } - break; - case 6: - - /**** FIX THIS ****/ - switch (conf->algorithm) { - case ALGORITHM_LEFT_ASYMMETRIC: - *pd_idx = raid_disks - 1 - (stripe % raid_disks); - if (*pd_idx == raid_disks-1) - (*dd_idx)++; /* Q D D D P */ - else if (*dd_idx >= *pd_idx) - (*dd_idx) += 2; /* D D P Q D */ - break; - case ALGORITHM_RIGHT_ASYMMETRIC: - *pd_idx = stripe % raid_disks; - if (*pd_idx == raid_disks-1) - (*dd_idx)++; /* Q D D D P */ - else if (*dd_idx >= *pd_idx) - (*dd_idx) += 2; /* D D P Q D */ - break; - case ALGORITHM_LEFT_SYMMETRIC: - *pd_idx = raid_disks - 1 - (stripe % raid_disks); - *dd_idx = (*pd_idx + 2 + *dd_idx) % raid_disks; - break; - case ALGORITHM_RIGHT_SYMMETRIC: - *pd_idx = stripe % raid_disks; - *dd_idx = (*pd_idx + 2 + *dd_idx) % raid_disks; - break; - default: - printk (KERN_CRIT "raid6: unsupported algorithm %d\n", - conf->algorithm); - } - break; } /* @@ -824,7 +612,7 @@ static sector_t raid5_compute_sector(sector_t r_sector, unsigned int raid_disks, static sector_t compute_blocknr(struct stripe_head *sh, int i) { raid5_conf_t *conf = sh->raid_conf; - int raid_disks = sh->disks, data_disks = raid_disks - 1; + int raid_disks = conf->raid_disks, data_disks = raid_disks - 1; sector_t new_sector = sh->sector, check; int sectors_per_chunk = conf->chunk_size >> 9; sector_t stripe; @@ -832,17 +620,12 @@ static sector_t compute_blocknr(struct stripe_head *sh, int i) int chunk_number, dummy1, dummy2, dd_idx = i; sector_t r_sector; - chunk_offset = sector_div(new_sector, sectors_per_chunk); stripe = new_sector; BUG_ON(new_sector != stripe); - if (i == sh->pd_idx) - return 0; - switch(conf->level) { - case 4: break; - case 5: - switch (conf->algorithm) { + + switch (conf->algorithm) { case ALGORITHM_LEFT_ASYMMETRIC: case ALGORITHM_RIGHT_ASYMMETRIC: if (i > sh->pd_idx) @@ -856,37 +639,7 @@ static sector_t compute_blocknr(struct stripe_head *sh, int i) break; default: printk(KERN_ERR "raid5: unsupported algorithm %d\n", - conf->algorithm); - } - break; - case 6: - data_disks = raid_disks - 2; - if (i == raid6_next_disk(sh->pd_idx, raid_disks)) - return 0; /* It is the Q disk */ - switch (conf->algorithm) { - case ALGORITHM_LEFT_ASYMMETRIC: - case ALGORITHM_RIGHT_ASYMMETRIC: - if (sh->pd_idx == raid_disks-1) - i--; /* Q D D D P */ - else if (i > sh->pd_idx) - i -= 2; /* D D P Q D */ - break; - case ALGORITHM_LEFT_SYMMETRIC: - case ALGORITHM_RIGHT_SYMMETRIC: - if (sh->pd_idx == raid_disks-1) - i--; /* Q D D D P */ - else { - /* D D P Q D */ - if (i < sh->pd_idx) - i += raid_disks; - i -= (sh->pd_idx + 2); - } - break; - default: - printk (KERN_CRIT "raid6: unsupported algorithm %d\n", conf->algorithm); - } - break; } chunk_number = stripe * data_disks + i; @@ -903,11 +656,10 @@ static sector_t compute_blocknr(struct stripe_head *sh, int i) /* - * Copy data between a page in the stripe cache, and one or more bion - * The page could align with the middle of the bio, or there could be - * several bion, each with several bio_vecs, which cover part of the page - * Multiple bion are linked together on bi_next. There may be extras - * at the end of this list. We ignore them. + * Copy data between a page in the stripe cache, and a bio. + * There are no alignment or size guarantees between the page or the + * bio except that there is some overlap. + * All iovecs in the bio must be considered. */ static void copy_data(int frombio, struct bio *bio, struct page *page, @@ -936,7 +688,7 @@ static void copy_data(int frombio, struct bio *bio, if (len > 0 && page_offset + len > STRIPE_SIZE) clen = STRIPE_SIZE - page_offset; else clen = len; - + if (clen > 0) { char *ba = __bio_kmap_atomic(bio, i, KM_USER0); if (frombio) @@ -961,7 +713,8 @@ static void copy_data(int frombio, struct bio *bio, static void compute_block(struct stripe_head *sh, int dd_idx) { - int i, count, disks = sh->disks; + raid5_conf_t *conf = sh->raid_conf; + int i, count, disks = conf->raid_disks; void *ptr[MAX_XOR_BLOCKS], *p; PRINTK("compute_block, stripe %llu, idx %d\n", @@ -988,21 +741,22 @@ static void compute_block(struct stripe_head *sh, int dd_idx) set_bit(R5_UPTODATE, &sh->dev[dd_idx].flags); } -static void compute_parity5(struct stripe_head *sh, int method) +static void compute_parity(struct stripe_head *sh, int method) { raid5_conf_t *conf = sh->raid_conf; - int i, pd_idx = sh->pd_idx, disks = sh->disks, count; + int i, pd_idx = sh->pd_idx, disks = conf->raid_disks, count; void *ptr[MAX_XOR_BLOCKS]; struct bio *chosen; - PRINTK("compute_parity5, stripe %llu, method %d\n", + PRINTK("compute_parity, stripe %llu, method %d\n", (unsigned long long)sh->sector, method); count = 1; ptr[0] = page_address(sh->dev[pd_idx].page); switch(method) { case READ_MODIFY_WRITE: - BUG_ON(!test_bit(R5_UPTODATE, &sh->dev[pd_idx].flags)); + if (!test_bit(R5_UPTODATE, &sh->dev[pd_idx].flags)) + BUG(); for (i=disks ; i-- ;) { if (i==pd_idx) continue; @@ -1015,7 +769,7 @@ static void compute_parity5(struct stripe_head *sh, int method) if (test_and_clear_bit(R5_Overlap, &sh->dev[i].flags)) wake_up(&conf->wait_for_overlap); - BUG_ON(sh->dev[i].written); + if (sh->dev[i].written) BUG(); sh->dev[i].written = chosen; check_xor(); } @@ -1031,7 +785,7 @@ static void compute_parity5(struct stripe_head *sh, int method) if (test_and_clear_bit(R5_Overlap, &sh->dev[i].flags)) wake_up(&conf->wait_for_overlap); - BUG_ON(sh->dev[i].written); + if (sh->dev[i].written) BUG(); sh->dev[i].written = chosen; } break; @@ -1082,195 +836,9 @@ static void compute_parity5(struct stripe_head *sh, int method) clear_bit(R5_UPTODATE, &sh->dev[pd_idx].flags); } -static void compute_parity6(struct stripe_head *sh, int method) -{ - raid6_conf_t *conf = sh->raid_conf; - int i, pd_idx = sh->pd_idx, qd_idx, d0_idx, disks = conf->raid_disks, count; - struct bio *chosen; - /**** FIX THIS: This could be very bad if disks is close to 256 ****/ - void *ptrs[disks]; - - qd_idx = raid6_next_disk(pd_idx, disks); - d0_idx = raid6_next_disk(qd_idx, disks); - - PRINTK("compute_parity, stripe %llu, method %d\n", - (unsigned long long)sh->sector, method); - - switch(method) { - case READ_MODIFY_WRITE: - BUG(); /* READ_MODIFY_WRITE N/A for RAID-6 */ - case RECONSTRUCT_WRITE: - for (i= disks; i-- ;) - if ( i != pd_idx && i != qd_idx && sh->dev[i].towrite ) { - chosen = sh->dev[i].towrite; - sh->dev[i].towrite = NULL; - - if (test_and_clear_bit(R5_Overlap, &sh->dev[i].flags)) - wake_up(&conf->wait_for_overlap); - - if (sh->dev[i].written) BUG(); - sh->dev[i].written = chosen; - } - break; - case CHECK_PARITY: - BUG(); /* Not implemented yet */ - } - - for (i = disks; i--;) - if (sh->dev[i].written) { - sector_t sector = sh->dev[i].sector; - struct bio *wbi = sh->dev[i].written; - while (wbi && wbi->bi_sector < sector + STRIPE_SECTORS) { - copy_data(1, wbi, sh->dev[i].page, sector); - wbi = r5_next_bio(wbi, sector); - } - - set_bit(R5_LOCKED, &sh->dev[i].flags); - set_bit(R5_UPTODATE, &sh->dev[i].flags); - } - -// switch(method) { -// case RECONSTRUCT_WRITE: -// case CHECK_PARITY: -// case UPDATE_PARITY: - /* Note that unlike RAID-5, the ordering of the disks matters greatly. */ - /* FIX: Is this ordering of drives even remotely optimal? */ - count = 0; - i = d0_idx; - do { - ptrs[count++] = page_address(sh->dev[i].page); - if (count <= disks-2 && !test_bit(R5_UPTODATE, &sh->dev[i].flags)) - printk("block %d/%d not uptodate on parity calc\n", i,count); - i = raid6_next_disk(i, disks); - } while ( i != d0_idx ); -// break; -// } - - raid6_call.gen_syndrome(disks, STRIPE_SIZE, ptrs); - - switch(method) { - case RECONSTRUCT_WRITE: - set_bit(R5_UPTODATE, &sh->dev[pd_idx].flags); - set_bit(R5_UPTODATE, &sh->dev[qd_idx].flags); - set_bit(R5_LOCKED, &sh->dev[pd_idx].flags); - set_bit(R5_LOCKED, &sh->dev[qd_idx].flags); - break; - case UPDATE_PARITY: - set_bit(R5_UPTODATE, &sh->dev[pd_idx].flags); - set_bit(R5_UPTODATE, &sh->dev[qd_idx].flags); - break; - } -} - - -/* Compute one missing block */ -static void compute_block_1(struct stripe_head *sh, int dd_idx, int nozero) -{ - raid6_conf_t *conf = sh->raid_conf; - int i, count, disks = conf->raid_disks; - void *ptr[MAX_XOR_BLOCKS], *p; - int pd_idx = sh->pd_idx; - int qd_idx = raid6_next_disk(pd_idx, disks); - - PRINTK("compute_block_1, stripe %llu, idx %d\n", - (unsigned long long)sh->sector, dd_idx); - - if ( dd_idx == qd_idx ) { - /* We're actually computing the Q drive */ - compute_parity6(sh, UPDATE_PARITY); - } else { - ptr[0] = page_address(sh->dev[dd_idx].page); - if (!nozero) memset(ptr[0], 0, STRIPE_SIZE); - count = 1; - for (i = disks ; i--; ) { - if (i == dd_idx || i == qd_idx) - continue; - p = page_address(sh->dev[i].page); - if (test_bit(R5_UPTODATE, &sh->dev[i].flags)) - ptr[count++] = p; - else - printk("compute_block() %d, stripe %llu, %d" - " not present\n", dd_idx, - (unsigned long long)sh->sector, i); - - check_xor(); - } - if (count != 1) - xor_block(count, STRIPE_SIZE, ptr); - if (!nozero) set_bit(R5_UPTODATE, &sh->dev[dd_idx].flags); - else clear_bit(R5_UPTODATE, &sh->dev[dd_idx].flags); - } -} - -/* Compute two missing blocks */ -static void compute_block_2(struct stripe_head *sh, int dd_idx1, int dd_idx2) -{ - raid6_conf_t *conf = sh->raid_conf; - int i, count, disks = conf->raid_disks; - int pd_idx = sh->pd_idx; - int qd_idx = raid6_next_disk(pd_idx, disks); - int d0_idx = raid6_next_disk(qd_idx, disks); - int faila, failb; - - /* faila and failb are disk numbers relative to d0_idx */ - /* pd_idx become disks-2 and qd_idx become disks-1 */ - faila = (dd_idx1 < d0_idx) ? dd_idx1+(disks-d0_idx) : dd_idx1-d0_idx; - failb = (dd_idx2 < d0_idx) ? dd_idx2+(disks-d0_idx) : dd_idx2-d0_idx; - - BUG_ON(faila == failb); - if ( failb < faila ) { int tmp = faila; faila = failb; failb = tmp; } - - PRINTK("compute_block_2, stripe %llu, idx %d,%d (%d,%d)\n", - (unsigned long long)sh->sector, dd_idx1, dd_idx2, faila, failb); - - if ( failb == disks-1 ) { - /* Q disk is one of the missing disks */ - if ( faila == disks-2 ) { - /* Missing P+Q, just recompute */ - compute_parity6(sh, UPDATE_PARITY); - return; - } else { - /* We're missing D+Q; recompute D from P */ - compute_block_1(sh, (dd_idx1 == qd_idx) ? dd_idx2 : dd_idx1, 0); - compute_parity6(sh, UPDATE_PARITY); /* Is this necessary? */ - return; - } - } - - /* We're missing D+P or D+D; build pointer table */ - { - /**** FIX THIS: This could be very bad if disks is close to 256 ****/ - void *ptrs[disks]; - - count = 0; - i = d0_idx; - do { - ptrs[count++] = page_address(sh->dev[i].page); - i = raid6_next_disk(i, disks); - if (i != dd_idx1 && i != dd_idx2 && - !test_bit(R5_UPTODATE, &sh->dev[i].flags)) - printk("compute_2 with missing block %d/%d\n", count, i); - } while ( i != d0_idx ); - - if ( failb == disks-2 ) { - /* We're missing D+P. */ - raid6_datap_recov(disks, STRIPE_SIZE, faila, ptrs); - } else { - /* We're missing D+D. */ - raid6_2data_recov(disks, STRIPE_SIZE, faila, failb, ptrs); - } - - /* Both the above update both missing blocks */ - set_bit(R5_UPTODATE, &sh->dev[dd_idx1].flags); - set_bit(R5_UPTODATE, &sh->dev[dd_idx2].flags); - } -} - - - /* * Each stripe/dev can have one or more bion attached. - * toread/towrite point to the first in a chain. + * toread/towrite point to the first in a chain. * The bi_next chain must be in order. */ static int add_stripe_bio(struct stripe_head *sh, struct bio *bi, int dd_idx, int forwrite) @@ -1300,7 +868,8 @@ static int add_stripe_bio(struct stripe_head *sh, struct bio *bi, int dd_idx, in if (*bip && (*bip)->bi_sector < bi->bi_sector + ((bi->bi_size)>>9)) goto overlap; - BUG_ON(*bip && bi->bi_next && (*bip) != bi->bi_next); + if (*bip && bi->bi_next && (*bip) != bi->bi_next) + BUG(); if (*bip) bi->bi_next = *bip; *bip = bi; @@ -1313,9 +882,9 @@ static int add_stripe_bio(struct stripe_head *sh, struct bio *bi, int dd_idx, in (unsigned long long)sh->sector, dd_idx); if (conf->mddev->bitmap && firstwrite) { + sh->bm_seq = conf->seq_write; bitmap_startwrite(conf->mddev->bitmap, sh->sector, STRIPE_SECTORS, 0); - sh->bm_seq = conf->seq_flush+1; set_bit(STRIPE_BIT_DELAY, &sh->state); } @@ -1341,27 +910,6 @@ static int add_stripe_bio(struct stripe_head *sh, struct bio *bi, int dd_idx, in return 0; } -static void end_reshape(raid5_conf_t *conf); - -static int page_is_zero(struct page *p) -{ - char *a = page_address(p); - return ((*(u32*)a) == 0 && - memcmp(a, a+4, STRIPE_SIZE-4)==0); -} - -static int stripe_to_pdidx(sector_t stripe, raid5_conf_t *conf, int disks) -{ - int sectors_per_chunk = conf->chunk_size >> 9; - sector_t x = stripe; - int pd_idx, dd_idx; - int chunk_offset = sector_div(x, sectors_per_chunk); - stripe = x; - raid5_compute_sector(stripe*(disks-1)*sectors_per_chunk - + chunk_offset, disks, disks-1, &dd_idx, &pd_idx, conf); - return pd_idx; -} - /* * handle_stripe - do things to a stripe. @@ -1381,14 +929,14 @@ static int stripe_to_pdidx(sector_t stripe, raid5_conf_t *conf, int disks) * */ -static void handle_stripe5(struct stripe_head *sh) +static void handle_stripe(struct stripe_head *sh) { raid5_conf_t *conf = sh->raid_conf; - int disks = sh->disks; + int disks = conf->raid_disks; struct bio *return_bi= NULL; struct bio *bi; int i; - int syncing, expanding, expanded; + int syncing; int locked=0, uptodate=0, to_read=0, to_write=0, failed=0, written=0; int non_overwrite = 0; int failed_num=0; @@ -1403,8 +951,6 @@ static void handle_stripe5(struct stripe_head *sh) clear_bit(STRIPE_DELAYED, &sh->state); syncing = test_bit(STRIPE_SYNCING, &sh->state); - expanding = test_bit(STRIPE_EXPAND_SOURCE, &sh->state); - expanded = test_bit(STRIPE_EXPAND_READY, &sh->state); /* Now to look around and see what can be done */ rcu_read_lock(); @@ -1597,14 +1143,13 @@ static void handle_stripe5(struct stripe_head *sh) * parity, or to satisfy requests * or to load a block that is being partially written. */ - if (to_read || non_overwrite || (syncing && (uptodate < disks)) || expanding) { + if (to_read || non_overwrite || (syncing && (uptodate < disks))) { for (i=disks; i--;) { dev = &sh->dev[i]; if (!test_bit(R5_LOCKED, &dev->flags) && !test_bit(R5_UPTODATE, &dev->flags) && (dev->toread || (dev->towrite && !test_bit(R5_OVERWRITE, &dev->flags)) || syncing || - expanding || (failed && (sh->dev[failed_num].toread || (sh->dev[failed_num].towrite && !test_bit(R5_OVERWRITE, &sh->dev[failed_num].flags)))) ) @@ -1713,7 +1258,7 @@ static void handle_stripe5(struct stripe_head *sh) if (locked == 0 && (rcw == 0 ||rmw == 0) && !test_bit(STRIPE_BIT_DELAY, &sh->state)) { PRINTK("Computing parity...\n"); - compute_parity5(sh, rcw==0 ? RECONSTRUCT_WRITE : READ_MODIFY_WRITE); + compute_parity(sh, rcw==0 ? RECONSTRUCT_WRITE : READ_MODIFY_WRITE); /* now every locked buffer is ready to be written */ for (i=disks; i--;) if (test_bit(R5_LOCKED, &sh->dev[i].flags)) { @@ -1740,10 +1285,14 @@ static void handle_stripe5(struct stripe_head *sh) !test_bit(STRIPE_INSYNC, &sh->state)) { set_bit(STRIPE_HANDLE, &sh->state); if (failed == 0) { - BUG_ON(uptodate != disks); - compute_parity5(sh, CHECK_PARITY); + char *pagea; + if (uptodate != disks) + BUG(); + compute_parity(sh, CHECK_PARITY); uptodate--; - if (page_is_zero(sh->dev[sh->pd_idx].page)) { + pagea = page_address(sh->dev[sh->pd_idx].page); + if ((*(u32*)pagea) == 0 && + !memcmp(pagea, pagea+4, STRIPE_SIZE-4)) { /* parity is correct (on disc, not in buffer any more) */ set_bit(STRIPE_INSYNC, &sh->state); } else { @@ -1790,75 +1339,11 @@ static void handle_stripe5(struct stripe_head *sh) set_bit(R5_Wantwrite, &dev->flags); set_bit(R5_ReWrite, &dev->flags); set_bit(R5_LOCKED, &dev->flags); - locked++; } else { /* let's read it back */ set_bit(R5_Wantread, &dev->flags); set_bit(R5_LOCKED, &dev->flags); - locked++; - } - } - - if (expanded && test_bit(STRIPE_EXPANDING, &sh->state)) { - /* Need to write out all blocks after computing parity */ - sh->disks = conf->raid_disks; - sh->pd_idx = stripe_to_pdidx(sh->sector, conf, conf->raid_disks); - compute_parity5(sh, RECONSTRUCT_WRITE); - for (i= conf->raid_disks; i--;) { - set_bit(R5_LOCKED, &sh->dev[i].flags); - locked++; - set_bit(R5_Wantwrite, &sh->dev[i].flags); } - clear_bit(STRIPE_EXPANDING, &sh->state); - } else if (expanded) { - clear_bit(STRIPE_EXPAND_READY, &sh->state); - atomic_dec(&conf->reshape_stripes); - wake_up(&conf->wait_for_overlap); - md_done_sync(conf->mddev, STRIPE_SECTORS, 1); - } - - if (expanding && locked == 0) { - /* We have read all the blocks in this stripe and now we need to - * copy some of them into a target stripe for expand. - */ - clear_bit(STRIPE_EXPAND_SOURCE, &sh->state); - for (i=0; i< sh->disks; i++) - if (i != sh->pd_idx) { - int dd_idx, pd_idx, j; - struct stripe_head *sh2; - - sector_t bn = compute_blocknr(sh, i); - sector_t s = raid5_compute_sector(bn, conf->raid_disks, - conf->raid_disks-1, - &dd_idx, &pd_idx, conf); - sh2 = get_active_stripe(conf, s, conf->raid_disks, pd_idx, 1); - if (sh2 == NULL) - /* so far only the early blocks of this stripe - * have been requested. When later blocks - * get requested, we will try again - */ - continue; - if(!test_bit(STRIPE_EXPANDING, &sh2->state) || - test_bit(R5_Expanded, &sh2->dev[dd_idx].flags)) { - /* must have already done this block */ - release_stripe(sh2); - continue; - } - memcpy(page_address(sh2->dev[dd_idx].page), - page_address(sh->dev[i].page), - STRIPE_SIZE); - set_bit(R5_Expanded, &sh2->dev[dd_idx].flags); - set_bit(R5_UPTODATE, &sh2->dev[dd_idx].flags); - for (j=0; jraid_disks; j++) - if (j != sh2->pd_idx && - !test_bit(R5_Expanded, &sh2->dev[j].flags)) - break; - if (j == conf->raid_disks) { - set_bit(STRIPE_EXPAND_READY, &sh2->state); - set_bit(STRIPE_HANDLE, &sh2->state); - } - release_stripe(sh2); - } } spin_unlock(&sh->lock); @@ -1899,7 +1384,7 @@ static void handle_stripe5(struct stripe_head *sh) rcu_read_unlock(); if (rdev) { - if (syncing || expanding || expanded) + if (syncing) md_sync_acct(rdev->bdev, STRIPE_SECTORS); bi->bi_bdev = rdev->bdev; @@ -1931,603 +1416,40 @@ static void handle_stripe5(struct stripe_head *sh) } } -static void handle_stripe6(struct stripe_head *sh, struct page *tmp_page) +static void raid5_activate_delayed(raid5_conf_t *conf) { - raid6_conf_t *conf = sh->raid_conf; - int disks = conf->raid_disks; - struct bio *return_bi= NULL; - struct bio *bi; - int i; - int syncing; - int locked=0, uptodate=0, to_read=0, to_write=0, failed=0, written=0; - int non_overwrite = 0; - int failed_num[2] = {0, 0}; - struct r5dev *dev, *pdev, *qdev; - int pd_idx = sh->pd_idx; - int qd_idx = raid6_next_disk(pd_idx, disks); - int p_failed, q_failed; - - PRINTK("handling stripe %llu, state=%#lx cnt=%d, pd_idx=%d, qd_idx=%d\n", - (unsigned long long)sh->sector, sh->state, atomic_read(&sh->count), - pd_idx, qd_idx); + if (atomic_read(&conf->preread_active_stripes) < IO_THRESHOLD) { + while (!list_empty(&conf->delayed_list)) { + struct list_head *l = conf->delayed_list.next; + struct stripe_head *sh; + sh = list_entry(l, struct stripe_head, lru); + list_del_init(l); + clear_bit(STRIPE_DELAYED, &sh->state); + if (!test_and_set_bit(STRIPE_PREREAD_ACTIVE, &sh->state)) + atomic_inc(&conf->preread_active_stripes); + list_add_tail(&sh->lru, &conf->handle_list); + } + } +} - spin_lock(&sh->lock); - clear_bit(STRIPE_HANDLE, &sh->state); - clear_bit(STRIPE_DELAYED, &sh->state); +static void activate_bit_delay(raid5_conf_t *conf) +{ + /* device_lock is held */ + struct list_head head; + list_add(&head, &conf->bitmap_list); + list_del_init(&conf->bitmap_list); + while (!list_empty(&head)) { + struct stripe_head *sh = list_entry(head.next, struct stripe_head, lru); + list_del_init(&sh->lru); + atomic_inc(&sh->count); + __release_stripe(conf, sh); + } +} - syncing = test_bit(STRIPE_SYNCING, &sh->state); - /* Now to look around and see what can be done */ - - rcu_read_lock(); - for (i=disks; i--; ) { - mdk_rdev_t *rdev; - dev = &sh->dev[i]; - clear_bit(R5_Insync, &dev->flags); - - PRINTK("check %d: state 0x%lx read %p write %p written %p\n", - i, dev->flags, dev->toread, dev->towrite, dev->written); - /* maybe we can reply to a read */ - if (test_bit(R5_UPTODATE, &dev->flags) && dev->toread) { - struct bio *rbi, *rbi2; - PRINTK("Return read for disc %d\n", i); - spin_lock_irq(&conf->device_lock); - rbi = dev->toread; - dev->toread = NULL; - if (test_and_clear_bit(R5_Overlap, &dev->flags)) - wake_up(&conf->wait_for_overlap); - spin_unlock_irq(&conf->device_lock); - while (rbi && rbi->bi_sector < dev->sector + STRIPE_SECTORS) { - copy_data(0, rbi, dev->page, dev->sector); - rbi2 = r5_next_bio(rbi, dev->sector); - spin_lock_irq(&conf->device_lock); - if (--rbi->bi_phys_segments == 0) { - rbi->bi_next = return_bi; - return_bi = rbi; - } - spin_unlock_irq(&conf->device_lock); - rbi = rbi2; - } - } - - /* now count some things */ - if (test_bit(R5_LOCKED, &dev->flags)) locked++; - if (test_bit(R5_UPTODATE, &dev->flags)) uptodate++; - - - if (dev->toread) to_read++; - if (dev->towrite) { - to_write++; - if (!test_bit(R5_OVERWRITE, &dev->flags)) - non_overwrite++; - } - if (dev->written) written++; - rdev = rcu_dereference(conf->disks[i].rdev); - if (!rdev || !test_bit(In_sync, &rdev->flags)) { - /* The ReadError flag will just be confusing now */ - clear_bit(R5_ReadError, &dev->flags); - clear_bit(R5_ReWrite, &dev->flags); - } - if (!rdev || !test_bit(In_sync, &rdev->flags) - || test_bit(R5_ReadError, &dev->flags)) { - if ( failed < 2 ) - failed_num[failed] = i; - failed++; - } else - set_bit(R5_Insync, &dev->flags); - } - rcu_read_unlock(); - PRINTK("locked=%d uptodate=%d to_read=%d" - " to_write=%d failed=%d failed_num=%d,%d\n", - locked, uptodate, to_read, to_write, failed, - failed_num[0], failed_num[1]); - /* check if the array has lost >2 devices and, if so, some requests might - * need to be failed - */ - if (failed > 2 && to_read+to_write+written) { - for (i=disks; i--; ) { - int bitmap_end = 0; - - if (test_bit(R5_ReadError, &sh->dev[i].flags)) { - mdk_rdev_t *rdev; - rcu_read_lock(); - rdev = rcu_dereference(conf->disks[i].rdev); - if (rdev && test_bit(In_sync, &rdev->flags)) - /* multiple read failures in one stripe */ - md_error(conf->mddev, rdev); - rcu_read_unlock(); - } - - spin_lock_irq(&conf->device_lock); - /* fail all writes first */ - bi = sh->dev[i].towrite; - sh->dev[i].towrite = NULL; - if (bi) { to_write--; bitmap_end = 1; } - - if (test_and_clear_bit(R5_Overlap, &sh->dev[i].flags)) - wake_up(&conf->wait_for_overlap); - - while (bi && bi->bi_sector < sh->dev[i].sector + STRIPE_SECTORS){ - struct bio *nextbi = r5_next_bio(bi, sh->dev[i].sector); - clear_bit(BIO_UPTODATE, &bi->bi_flags); - if (--bi->bi_phys_segments == 0) { - md_write_end(conf->mddev); - bi->bi_next = return_bi; - return_bi = bi; - } - bi = nextbi; - } - /* and fail all 'written' */ - bi = sh->dev[i].written; - sh->dev[i].written = NULL; - if (bi) bitmap_end = 1; - while (bi && bi->bi_sector < sh->dev[i].sector + STRIPE_SECTORS) { - struct bio *bi2 = r5_next_bio(bi, sh->dev[i].sector); - clear_bit(BIO_UPTODATE, &bi->bi_flags); - if (--bi->bi_phys_segments == 0) { - md_write_end(conf->mddev); - bi->bi_next = return_bi; - return_bi = bi; - } - bi = bi2; - } - - /* fail any reads if this device is non-operational */ - if (!test_bit(R5_Insync, &sh->dev[i].flags) || - test_bit(R5_ReadError, &sh->dev[i].flags)) { - bi = sh->dev[i].toread; - sh->dev[i].toread = NULL; - if (test_and_clear_bit(R5_Overlap, &sh->dev[i].flags)) - wake_up(&conf->wait_for_overlap); - if (bi) to_read--; - while (bi && bi->bi_sector < sh->dev[i].sector + STRIPE_SECTORS){ - struct bio *nextbi = r5_next_bio(bi, sh->dev[i].sector); - clear_bit(BIO_UPTODATE, &bi->bi_flags); - if (--bi->bi_phys_segments == 0) { - bi->bi_next = return_bi; - return_bi = bi; - } - bi = nextbi; - } - } - spin_unlock_irq(&conf->device_lock); - if (bitmap_end) - bitmap_endwrite(conf->mddev->bitmap, sh->sector, - STRIPE_SECTORS, 0, 0); - } - } - if (failed > 2 && syncing) { - md_done_sync(conf->mddev, STRIPE_SECTORS,0); - clear_bit(STRIPE_SYNCING, &sh->state); - syncing = 0; - } - - /* - * might be able to return some write requests if the parity blocks - * are safe, or on a failed drive - */ - pdev = &sh->dev[pd_idx]; - p_failed = (failed >= 1 && failed_num[0] == pd_idx) - || (failed >= 2 && failed_num[1] == pd_idx); - qdev = &sh->dev[qd_idx]; - q_failed = (failed >= 1 && failed_num[0] == qd_idx) - || (failed >= 2 && failed_num[1] == qd_idx); - - if ( written && - ( p_failed || ((test_bit(R5_Insync, &pdev->flags) - && !test_bit(R5_LOCKED, &pdev->flags) - && test_bit(R5_UPTODATE, &pdev->flags))) ) && - ( q_failed || ((test_bit(R5_Insync, &qdev->flags) - && !test_bit(R5_LOCKED, &qdev->flags) - && test_bit(R5_UPTODATE, &qdev->flags))) ) ) { - /* any written block on an uptodate or failed drive can be - * returned. Note that if we 'wrote' to a failed drive, - * it will be UPTODATE, but never LOCKED, so we don't need - * to test 'failed' directly. - */ - for (i=disks; i--; ) - if (sh->dev[i].written) { - dev = &sh->dev[i]; - if (!test_bit(R5_LOCKED, &dev->flags) && - test_bit(R5_UPTODATE, &dev->flags) ) { - /* We can return any write requests */ - int bitmap_end = 0; - struct bio *wbi, *wbi2; - PRINTK("Return write for stripe %llu disc %d\n", - (unsigned long long)sh->sector, i); - spin_lock_irq(&conf->device_lock); - wbi = dev->written; - dev->written = NULL; - while (wbi && wbi->bi_sector < dev->sector + STRIPE_SECTORS) { - wbi2 = r5_next_bio(wbi, dev->sector); - if (--wbi->bi_phys_segments == 0) { - md_write_end(conf->mddev); - wbi->bi_next = return_bi; - return_bi = wbi; - } - wbi = wbi2; - } - if (dev->towrite == NULL) - bitmap_end = 1; - spin_unlock_irq(&conf->device_lock); - if (bitmap_end) - bitmap_endwrite(conf->mddev->bitmap, sh->sector, - STRIPE_SECTORS, - !test_bit(STRIPE_DEGRADED, &sh->state), 0); - } - } - } - - /* Now we might consider reading some blocks, either to check/generate - * parity, or to satisfy requests - * or to load a block that is being partially written. - */ - if (to_read || non_overwrite || (to_write && failed) || (syncing && (uptodate < disks))) { - for (i=disks; i--;) { - dev = &sh->dev[i]; - if (!test_bit(R5_LOCKED, &dev->flags) && !test_bit(R5_UPTODATE, &dev->flags) && - (dev->toread || - (dev->towrite && !test_bit(R5_OVERWRITE, &dev->flags)) || - syncing || - (failed >= 1 && (sh->dev[failed_num[0]].toread || to_write)) || - (failed >= 2 && (sh->dev[failed_num[1]].toread || to_write)) - ) - ) { - /* we would like to get this block, possibly - * by computing it, but we might not be able to - */ - if (uptodate == disks-1) { - PRINTK("Computing stripe %llu block %d\n", - (unsigned long long)sh->sector, i); - compute_block_1(sh, i, 0); - uptodate++; - } else if ( uptodate == disks-2 && failed >= 2 ) { - /* Computing 2-failure is *very* expensive; only do it if failed >= 2 */ - int other; - for (other=disks; other--;) { - if ( other == i ) - continue; - if ( !test_bit(R5_UPTODATE, &sh->dev[other].flags) ) - break; - } - BUG_ON(other < 0); - PRINTK("Computing stripe %llu blocks %d,%d\n", - (unsigned long long)sh->sector, i, other); - compute_block_2(sh, i, other); - uptodate += 2; - } else if (test_bit(R5_Insync, &dev->flags)) { - set_bit(R5_LOCKED, &dev->flags); - set_bit(R5_Wantread, &dev->flags); -#if 0 - /* if I am just reading this block and we don't have - a failed drive, or any pending writes then sidestep the cache */ - if (sh->bh_read[i] && !sh->bh_read[i]->b_reqnext && - ! syncing && !failed && !to_write) { - sh->bh_cache[i]->b_page = sh->bh_read[i]->b_page; - sh->bh_cache[i]->b_data = sh->bh_read[i]->b_data; - } -#endif - locked++; - PRINTK("Reading block %d (sync=%d)\n", - i, syncing); - } - } - } - set_bit(STRIPE_HANDLE, &sh->state); - } - - /* now to consider writing and what else, if anything should be read */ - if (to_write) { - int rcw=0, must_compute=0; - for (i=disks ; i--;) { - dev = &sh->dev[i]; - /* Would I have to read this buffer for reconstruct_write */ - if (!test_bit(R5_OVERWRITE, &dev->flags) - && i != pd_idx && i != qd_idx - && (!test_bit(R5_LOCKED, &dev->flags) -#if 0 - || sh->bh_page[i] != bh->b_page -#endif - ) && - !test_bit(R5_UPTODATE, &dev->flags)) { - if (test_bit(R5_Insync, &dev->flags)) rcw++; - else { - PRINTK("raid6: must_compute: disk %d flags=%#lx\n", i, dev->flags); - must_compute++; - } - } - } - PRINTK("for sector %llu, rcw=%d, must_compute=%d\n", - (unsigned long long)sh->sector, rcw, must_compute); - set_bit(STRIPE_HANDLE, &sh->state); - - if (rcw > 0) - /* want reconstruct write, but need to get some data */ - for (i=disks; i--;) { - dev = &sh->dev[i]; - if (!test_bit(R5_OVERWRITE, &dev->flags) - && !(failed == 0 && (i == pd_idx || i == qd_idx)) - && !test_bit(R5_LOCKED, &dev->flags) && !test_bit(R5_UPTODATE, &dev->flags) && - test_bit(R5_Insync, &dev->flags)) { - if (test_bit(STRIPE_PREREAD_ACTIVE, &sh->state)) - { - PRINTK("Read_old stripe %llu block %d for Reconstruct\n", - (unsigned long long)sh->sector, i); - set_bit(R5_LOCKED, &dev->flags); - set_bit(R5_Wantread, &dev->flags); - locked++; - } else { - PRINTK("Request delayed stripe %llu block %d for Reconstruct\n", - (unsigned long long)sh->sector, i); - set_bit(STRIPE_DELAYED, &sh->state); - set_bit(STRIPE_HANDLE, &sh->state); - } - } - } - /* now if nothing is locked, and if we have enough data, we can start a write request */ - if (locked == 0 && rcw == 0 && - !test_bit(STRIPE_BIT_DELAY, &sh->state)) { - if ( must_compute > 0 ) { - /* We have failed blocks and need to compute them */ - switch ( failed ) { - case 0: BUG(); - case 1: compute_block_1(sh, failed_num[0], 0); break; - case 2: compute_block_2(sh, failed_num[0], failed_num[1]); break; - default: BUG(); /* This request should have been failed? */ - } - } - - PRINTK("Computing parity for stripe %llu\n", (unsigned long long)sh->sector); - compute_parity6(sh, RECONSTRUCT_WRITE); - /* now every locked buffer is ready to be written */ - for (i=disks; i--;) - if (test_bit(R5_LOCKED, &sh->dev[i].flags)) { - PRINTK("Writing stripe %llu block %d\n", - (unsigned long long)sh->sector, i); - locked++; - set_bit(R5_Wantwrite, &sh->dev[i].flags); - } - /* after a RECONSTRUCT_WRITE, the stripe MUST be in-sync */ - set_bit(STRIPE_INSYNC, &sh->state); - - if (test_and_clear_bit(STRIPE_PREREAD_ACTIVE, &sh->state)) { - atomic_dec(&conf->preread_active_stripes); - if (atomic_read(&conf->preread_active_stripes) < IO_THRESHOLD) - md_wakeup_thread(conf->mddev->thread); - } - } - } - - /* maybe we need to check and possibly fix the parity for this stripe - * Any reads will already have been scheduled, so we just see if enough data - * is available - */ - if (syncing && locked == 0 && !test_bit(STRIPE_INSYNC, &sh->state)) { - int update_p = 0, update_q = 0; - struct r5dev *dev; - - set_bit(STRIPE_HANDLE, &sh->state); - - BUG_ON(failed>2); - BUG_ON(uptodate < disks); - /* Want to check and possibly repair P and Q. - * However there could be one 'failed' device, in which - * case we can only check one of them, possibly using the - * other to generate missing data - */ - - /* If !tmp_page, we cannot do the calculations, - * but as we have set STRIPE_HANDLE, we will soon be called - * by stripe_handle with a tmp_page - just wait until then. - */ - if (tmp_page) { - if (failed == q_failed) { - /* The only possible failed device holds 'Q', so it makes - * sense to check P (If anything else were failed, we would - * have used P to recreate it). - */ - compute_block_1(sh, pd_idx, 1); - if (!page_is_zero(sh->dev[pd_idx].page)) { - compute_block_1(sh,pd_idx,0); - update_p = 1; - } - } - if (!q_failed && failed < 2) { - /* q is not failed, and we didn't use it to generate - * anything, so it makes sense to check it - */ - memcpy(page_address(tmp_page), - page_address(sh->dev[qd_idx].page), - STRIPE_SIZE); - compute_parity6(sh, UPDATE_PARITY); - if (memcmp(page_address(tmp_page), - page_address(sh->dev[qd_idx].page), - STRIPE_SIZE)!= 0) { - clear_bit(STRIPE_INSYNC, &sh->state); - update_q = 1; - } - } - if (update_p || update_q) { - conf->mddev->resync_mismatches += STRIPE_SECTORS; - if (test_bit(MD_RECOVERY_CHECK, &conf->mddev->recovery)) - /* don't try to repair!! */ - update_p = update_q = 0; - } - - /* now write out any block on a failed drive, - * or P or Q if they need it - */ - - if (failed == 2) { - dev = &sh->dev[failed_num[1]]; - locked++; - set_bit(R5_LOCKED, &dev->flags); - set_bit(R5_Wantwrite, &dev->flags); - } - if (failed >= 1) { - dev = &sh->dev[failed_num[0]]; - locked++; - set_bit(R5_LOCKED, &dev->flags); - set_bit(R5_Wantwrite, &dev->flags); - } - - if (update_p) { - dev = &sh->dev[pd_idx]; - locked ++; - set_bit(R5_LOCKED, &dev->flags); - set_bit(R5_Wantwrite, &dev->flags); - } - if (update_q) { - dev = &sh->dev[qd_idx]; - locked++; - set_bit(R5_LOCKED, &dev->flags); - set_bit(R5_Wantwrite, &dev->flags); - } - clear_bit(STRIPE_DEGRADED, &sh->state); - - set_bit(STRIPE_INSYNC, &sh->state); - } - } - - if (syncing && locked == 0 && test_bit(STRIPE_INSYNC, &sh->state)) { - md_done_sync(conf->mddev, STRIPE_SECTORS,1); - clear_bit(STRIPE_SYNCING, &sh->state); - } - - /* If the failed drives are just a ReadError, then we might need - * to progress the repair/check process - */ - if (failed <= 2 && ! conf->mddev->ro) - for (i=0; idev[failed_num[i]]; - if (test_bit(R5_ReadError, &dev->flags) - && !test_bit(R5_LOCKED, &dev->flags) - && test_bit(R5_UPTODATE, &dev->flags) - ) { - if (!test_bit(R5_ReWrite, &dev->flags)) { - set_bit(R5_Wantwrite, &dev->flags); - set_bit(R5_ReWrite, &dev->flags); - set_bit(R5_LOCKED, &dev->flags); - } else { - /* let's read it back */ - set_bit(R5_Wantread, &dev->flags); - set_bit(R5_LOCKED, &dev->flags); - } - } - } - spin_unlock(&sh->lock); - - while ((bi=return_bi)) { - int bytes = bi->bi_size; - - return_bi = bi->bi_next; - bi->bi_next = NULL; - bi->bi_size = 0; - bi->bi_end_io(bi, bytes, 0); - } - for (i=disks; i-- ;) { - int rw; - struct bio *bi; - mdk_rdev_t *rdev; - if (test_and_clear_bit(R5_Wantwrite, &sh->dev[i].flags)) - rw = 1; - else if (test_and_clear_bit(R5_Wantread, &sh->dev[i].flags)) - rw = 0; - else - continue; - - bi = &sh->dev[i].req; - - bi->bi_rw = rw; - if (rw) - bi->bi_end_io = raid5_end_write_request; - else - bi->bi_end_io = raid5_end_read_request; - - rcu_read_lock(); - rdev = rcu_dereference(conf->disks[i].rdev); - if (rdev && test_bit(Faulty, &rdev->flags)) - rdev = NULL; - if (rdev) - atomic_inc(&rdev->nr_pending); - rcu_read_unlock(); - - if (rdev) { - if (syncing) - md_sync_acct(rdev->bdev, STRIPE_SECTORS); - - bi->bi_bdev = rdev->bdev; - PRINTK("for %llu schedule op %ld on disc %d\n", - (unsigned long long)sh->sector, bi->bi_rw, i); - atomic_inc(&sh->count); - bi->bi_sector = sh->sector + rdev->data_offset; - bi->bi_flags = 1 << BIO_UPTODATE; - bi->bi_vcnt = 1; - bi->bi_max_vecs = 1; - bi->bi_idx = 0; - bi->bi_io_vec = &sh->dev[i].vec; - bi->bi_io_vec[0].bv_len = STRIPE_SIZE; - bi->bi_io_vec[0].bv_offset = 0; - bi->bi_size = STRIPE_SIZE; - bi->bi_next = NULL; - if (rw == WRITE && - test_bit(R5_ReWrite, &sh->dev[i].flags)) - atomic_add(STRIPE_SECTORS, &rdev->corrected_errors); - generic_make_request(bi); - } else { - if (rw == 1) - set_bit(STRIPE_DEGRADED, &sh->state); - PRINTK("skip op %ld on disc %d for sector %llu\n", - bi->bi_rw, i, (unsigned long long)sh->sector); - clear_bit(R5_LOCKED, &sh->dev[i].flags); - set_bit(STRIPE_HANDLE, &sh->state); - } - } -} - -static void handle_stripe(struct stripe_head *sh, struct page *tmp_page) -{ - if (sh->raid_conf->level == 6) - handle_stripe6(sh, tmp_page); - else - handle_stripe5(sh); -} - - - -static void raid5_activate_delayed(raid5_conf_t *conf) -{ - if (atomic_read(&conf->preread_active_stripes) < IO_THRESHOLD) { - while (!list_empty(&conf->delayed_list)) { - struct list_head *l = conf->delayed_list.next; - struct stripe_head *sh; - sh = list_entry(l, struct stripe_head, lru); - list_del_init(l); - clear_bit(STRIPE_DELAYED, &sh->state); - if (!test_and_set_bit(STRIPE_PREREAD_ACTIVE, &sh->state)) - atomic_inc(&conf->preread_active_stripes); - list_add_tail(&sh->lru, &conf->handle_list); - } - } -} - -static void activate_bit_delay(raid5_conf_t *conf) -{ - /* device_lock is held */ - struct list_head head; - list_add(&head, &conf->bitmap_list); - list_del_init(&conf->bitmap_list); - while (!list_empty(&head)) { - struct stripe_head *sh = list_entry(head.next, struct stripe_head, lru); - list_del_init(&sh->lru); - atomic_inc(&sh->count); - __release_stripe(conf, sh); - } -} - -static void unplug_slaves(mddev_t *mddev) -{ - raid5_conf_t *conf = mddev_to_conf(mddev); - int i; +static void unplug_slaves(mddev_t *mddev) +{ + raid5_conf_t *conf = mddev_to_conf(mddev); + int i; rcu_read_lock(); for (i=0; iraid_disks; i++) { @@ -2597,16 +1519,24 @@ static int raid5_issue_flush(request_queue_t *q, struct gendisk *disk, return ret; } -static int make_request(request_queue_t *q, struct bio * bi) +static inline void raid5_plug_device(raid5_conf_t *conf) +{ + spin_lock_irq(&conf->device_lock); + blk_plug_device(conf->mddev->queue); + spin_unlock_irq(&conf->device_lock); +} + +static int make_request (request_queue_t *q, struct bio * bi) { mddev_t *mddev = q->queuedata; raid5_conf_t *conf = mddev_to_conf(mddev); + const unsigned int raid_disks = conf->raid_disks; + const unsigned int data_disks = raid_disks - 1; unsigned int dd_idx, pd_idx; sector_t new_sector; sector_t logical_sector, last_sector; struct stripe_head *sh; const int rw = bio_data_dir(bi); - int remaining; if (unlikely(bio_barrier(bi))) { bio_endio(bi, bi->bi_size, -EOPNOTSUPP); @@ -2625,79 +1555,20 @@ static int make_request(request_queue_t *q, struct bio * bi) for (;logical_sector < last_sector; logical_sector += STRIPE_SECTORS) { DEFINE_WAIT(w); - int disks, data_disks; - - retry: - prepare_to_wait(&conf->wait_for_overlap, &w, TASK_UNINTERRUPTIBLE); - if (likely(conf->expand_progress == MaxSector)) - disks = conf->raid_disks; - else { - /* spinlock is needed as expand_progress may be - * 64bit on a 32bit platform, and so it might be - * possible to see a half-updated value - * Ofcourse expand_progress could change after - * the lock is dropped, so once we get a reference - * to the stripe that we think it is, we will have - * to check again. - */ - spin_lock_irq(&conf->device_lock); - disks = conf->raid_disks; - if (logical_sector >= conf->expand_progress) - disks = conf->previous_raid_disks; - else { - if (logical_sector >= conf->expand_lo) { - spin_unlock_irq(&conf->device_lock); - schedule(); - goto retry; - } - } - spin_unlock_irq(&conf->device_lock); - } - data_disks = disks - conf->max_degraded; + + new_sector = raid5_compute_sector(logical_sector, + raid_disks, data_disks, &dd_idx, &pd_idx, conf); - new_sector = raid5_compute_sector(logical_sector, disks, data_disks, - &dd_idx, &pd_idx, conf); PRINTK("raid5: make_request, sector %llu logical %llu\n", (unsigned long long)new_sector, (unsigned long long)logical_sector); - sh = get_active_stripe(conf, new_sector, disks, pd_idx, (bi->bi_rw&RWA_MASK)); + retry: + prepare_to_wait(&conf->wait_for_overlap, &w, TASK_UNINTERRUPTIBLE); + sh = get_active_stripe(conf, new_sector, pd_idx, (bi->bi_rw&RWA_MASK)); if (sh) { - if (unlikely(conf->expand_progress != MaxSector)) { - /* expansion might have moved on while waiting for a - * stripe, so we must do the range check again. - * Expansion could still move past after this - * test, but as we are holding a reference to - * 'sh', we know that if that happens, - * STRIPE_EXPANDING will get set and the expansion - * won't proceed until we finish with the stripe. - */ - int must_retry = 0; - spin_lock_irq(&conf->device_lock); - if (logical_sector < conf->expand_progress && - disks == conf->previous_raid_disks) - /* mismatch, need to try again */ - must_retry = 1; - spin_unlock_irq(&conf->device_lock); - if (must_retry) { - release_stripe(sh); - goto retry; - } - } - /* FIXME what if we get a false positive because these - * are being updated. - */ - if (logical_sector >= mddev->suspend_lo && - logical_sector < mddev->suspend_hi) { - release_stripe(sh); - schedule(); - goto retry; - } - - if (test_bit(STRIPE_EXPANDING, &sh->state) || - !add_stripe_bio(sh, bi, dd_idx, (bi->bi_rw&RW_MASK))) { - /* Stripe is busy expanding or - * add failed due to overlap. Flush everything + if (!add_stripe_bio(sh, bi, dd_idx, (bi->bi_rw&RW_MASK))) { + /* Add failed due to overlap. Flush everything * and wait a while */ raid5_unplug_device(mddev->queue); @@ -2706,8 +1577,10 @@ static int make_request(request_queue_t *q, struct bio * bi) goto retry; } finish_wait(&conf->wait_for_overlap, &w); - handle_stripe(sh, NULL); + raid5_plug_device(conf); + handle_stripe(sh); release_stripe(sh); + } else { /* cannot get stripe for read-ahead, just give-up */ clear_bit(BIO_UPTODATE, &bi->bi_flags); @@ -2717,182 +1590,52 @@ static int make_request(request_queue_t *q, struct bio * bi) } spin_lock_irq(&conf->device_lock); - remaining = --bi->bi_phys_segments; - spin_unlock_irq(&conf->device_lock); - if (remaining == 0) { + if (--bi->bi_phys_segments == 0) { int bytes = bi->bi_size; - if ( rw == WRITE ) + if ( bio_data_dir(bi) == WRITE ) md_write_end(mddev); bi->bi_size = 0; bi->bi_end_io(bi, bytes, 0); } - return 0; -} - -static sector_t reshape_request(mddev_t *mddev, sector_t sector_nr, int *skipped) -{ - /* reshaping is quite different to recovery/resync so it is - * handled quite separately ... here. - * - * On each call to sync_request, we gather one chunk worth of - * destination stripes and flag them as expanding. - * Then we find all the source stripes and request reads. - * As the reads complete, handle_stripe will copy the data - * into the destination stripe and release that stripe. - */ - raid5_conf_t *conf = (raid5_conf_t *) mddev->private; - struct stripe_head *sh; - int pd_idx; - sector_t first_sector, last_sector; - int raid_disks; - int data_disks; - int i; - int dd_idx; - sector_t writepos, safepos, gap; - - if (sector_nr == 0 && - conf->expand_progress != 0) { - /* restarting in the middle, skip the initial sectors */ - sector_nr = conf->expand_progress; - sector_div(sector_nr, conf->raid_disks-1); - *skipped = 1; - return sector_nr; - } - - /* we update the metadata when there is more than 3Meg - * in the block range (that is rather arbitrary, should - * probably be time based) or when the data about to be - * copied would over-write the source of the data at - * the front of the range. - * i.e. one new_stripe forward from expand_progress new_maps - * to after where expand_lo old_maps to - */ - writepos = conf->expand_progress + - conf->chunk_size/512*(conf->raid_disks-1); - sector_div(writepos, conf->raid_disks-1); - safepos = conf->expand_lo; - sector_div(safepos, conf->previous_raid_disks-1); - gap = conf->expand_progress - conf->expand_lo; - - if (writepos >= safepos || - gap > (conf->raid_disks-1)*3000*2 /*3Meg*/) { - /* Cannot proceed until we've updated the superblock... */ - wait_event(conf->wait_for_overlap, - atomic_read(&conf->reshape_stripes)==0); - mddev->reshape_position = conf->expand_progress; - mddev->sb_dirty = 1; - md_wakeup_thread(mddev->thread); - wait_event(mddev->sb_wait, mddev->sb_dirty == 0 || - kthread_should_stop()); - spin_lock_irq(&conf->device_lock); - conf->expand_lo = mddev->reshape_position; - spin_unlock_irq(&conf->device_lock); - wake_up(&conf->wait_for_overlap); - } - - for (i=0; i < conf->chunk_size/512; i+= STRIPE_SECTORS) { - int j; - int skipped = 0; - pd_idx = stripe_to_pdidx(sector_nr+i, conf, conf->raid_disks); - sh = get_active_stripe(conf, sector_nr+i, - conf->raid_disks, pd_idx, 0); - set_bit(STRIPE_EXPANDING, &sh->state); - atomic_inc(&conf->reshape_stripes); - /* If any of this stripe is beyond the end of the old - * array, then we need to zero those blocks - */ - for (j=sh->disks; j--;) { - sector_t s; - if (j == sh->pd_idx) - continue; - s = compute_blocknr(sh, j); - if (s < (mddev->array_size<<1)) { - skipped = 1; - continue; - } - memset(page_address(sh->dev[j].page), 0, STRIPE_SIZE); - set_bit(R5_Expanded, &sh->dev[j].flags); - set_bit(R5_UPTODATE, &sh->dev[j].flags); - } - if (!skipped) { - set_bit(STRIPE_EXPAND_READY, &sh->state); - set_bit(STRIPE_HANDLE, &sh->state); - } - release_stripe(sh); - } - spin_lock_irq(&conf->device_lock); - conf->expand_progress = (sector_nr + i)*(conf->raid_disks-1); spin_unlock_irq(&conf->device_lock); - /* Ok, those stripe are ready. We can start scheduling - * reads on the source stripes. - * The source stripes are determined by mapping the first and last - * block on the destination stripes. - */ - raid_disks = conf->previous_raid_disks; - data_disks = raid_disks - 1; - first_sector = - raid5_compute_sector(sector_nr*(conf->raid_disks-1), - raid_disks, data_disks, - &dd_idx, &pd_idx, conf); - last_sector = - raid5_compute_sector((sector_nr+conf->chunk_size/512) - *(conf->raid_disks-1) -1, - raid_disks, data_disks, - &dd_idx, &pd_idx, conf); - if (last_sector >= (mddev->size<<1)) - last_sector = (mddev->size<<1)-1; - while (first_sector <= last_sector) { - pd_idx = stripe_to_pdidx(first_sector, conf, conf->previous_raid_disks); - sh = get_active_stripe(conf, first_sector, - conf->previous_raid_disks, pd_idx, 0); - set_bit(STRIPE_EXPAND_SOURCE, &sh->state); - set_bit(STRIPE_HANDLE, &sh->state); - release_stripe(sh); - first_sector += STRIPE_SECTORS; - } - return conf->chunk_size>>9; + return 0; } /* FIXME go_faster isn't used */ -static inline sector_t sync_request(mddev_t *mddev, sector_t sector_nr, int *skipped, int go_faster) +static sector_t sync_request(mddev_t *mddev, sector_t sector_nr, int *skipped, int go_faster) { raid5_conf_t *conf = (raid5_conf_t *) mddev->private; struct stripe_head *sh; - int pd_idx; + int sectors_per_chunk = conf->chunk_size >> 9; + sector_t x; + unsigned long stripe; + int chunk_offset; + int dd_idx, pd_idx; + sector_t first_sector; int raid_disks = conf->raid_disks; + int data_disks = raid_disks-1; sector_t max_sector = mddev->size << 1; int sync_blocks; - int still_degraded = 0; - int i; if (sector_nr >= max_sector) { /* just being told to finish up .. nothing much to do */ unplug_slaves(mddev); - if (test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery)) { - end_reshape(conf); - return 0; - } if (mddev->curr_resync < max_sector) /* aborted */ bitmap_end_sync(mddev->bitmap, mddev->curr_resync, &sync_blocks, 1); - else /* completed sync */ + else /* compelted sync */ conf->fullsync = 0; bitmap_close_sync(mddev->bitmap); return 0; } - - if (test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery)) - return reshape_request(mddev, sector_nr, skipped); - - /* if there is too many failed drives and we are trying + /* if there is 1 or more failed drives and we are trying * to resync, then assert that we are finished, because there is * nothing we can do. */ - if (mddev->degraded >= conf->max_degraded && - test_bit(MD_RECOVERY_SYNC, &mddev->recovery)) { + if (mddev->degraded >= 1 && test_bit(MD_RECOVERY_SYNC, &mddev->recovery)) { sector_t rv = (mddev->size << 1) - sector_nr; *skipped = 1; return rv; @@ -2906,31 +1649,28 @@ static inline sector_t sync_request(mddev_t *mddev, sector_t sector_nr, int *ski return sync_blocks * STRIPE_SECTORS; /* keep things rounded to whole stripes */ } - pd_idx = stripe_to_pdidx(sector_nr, conf, raid_disks); - sh = get_active_stripe(conf, sector_nr, raid_disks, pd_idx, 1); + x = sector_nr; + chunk_offset = sector_div(x, sectors_per_chunk); + stripe = x; + BUG_ON(x != stripe); + + first_sector = raid5_compute_sector((sector_t)stripe*data_disks*sectors_per_chunk + + chunk_offset, raid_disks, data_disks, &dd_idx, &pd_idx, conf); + sh = get_active_stripe(conf, sector_nr, pd_idx, 1); if (sh == NULL) { - sh = get_active_stripe(conf, sector_nr, raid_disks, pd_idx, 0); + sh = get_active_stripe(conf, sector_nr, pd_idx, 0); /* make sure we don't swamp the stripe cache if someone else - * is trying to get access + * is trying to get access */ schedule_timeout_uninterruptible(1); } - /* Need to check if array will still be degraded after recovery/resync - * We don't need to check the 'failed' flag as when that gets set, - * recovery aborts. - */ - for (i=0; iraid_disks; i++) - if (conf->disks[i].rdev == NULL) - still_degraded = 1; - - bitmap_start_sync(mddev->bitmap, sector_nr, &sync_blocks, still_degraded); - - spin_lock(&sh->lock); + bitmap_start_sync(mddev->bitmap, sector_nr, &sync_blocks, 0); + spin_lock(&sh->lock); set_bit(STRIPE_SYNCING, &sh->state); clear_bit(STRIPE_INSYNC, &sh->state); spin_unlock(&sh->lock); - handle_stripe(sh, NULL); + handle_stripe(sh); release_stripe(sh); return STRIPE_SECTORS; @@ -2958,7 +1698,7 @@ static void raid5d (mddev_t *mddev) while (1) { struct list_head *first; - if (conf->seq_flush != conf->seq_write) { + if (conf->seq_flush - conf->seq_write > 0) { int seq = conf->seq_flush; spin_unlock_irq(&conf->device_lock); bitmap_unplug(mddev->bitmap); @@ -2981,11 +1721,12 @@ static void raid5d (mddev_t *mddev) list_del_init(first); atomic_inc(&sh->count); - BUG_ON(atomic_read(&sh->count)!= 1); + if (atomic_read(&sh->count)!= 1) + BUG(); spin_unlock_irq(&conf->device_lock); handled++; - handle_stripe(sh, conf->spare_page); + handle_stripe(sh); release_stripe(sh); spin_lock_irq(&conf->device_lock); @@ -3075,81 +1816,23 @@ static int run(mddev_t *mddev) struct disk_info *disk; struct list_head *tmp; - if (mddev->level != 5 && mddev->level != 4 && mddev->level != 6) { - printk(KERN_ERR "raid5: %s: raid level not set to 4/5/6 (%d)\n", + if (mddev->level != 5 && mddev->level != 4) { + printk(KERN_ERR "raid5: %s: raid level not set to 4/5 (%d)\n", mdname(mddev), mddev->level); return -EIO; } - if (mddev->reshape_position != MaxSector) { - /* Check that we can continue the reshape. - * Currently only disks can change, it must - * increase, and we must be past the point where - * a stripe over-writes itself - */ - sector_t here_new, here_old; - int old_disks; - - if (mddev->new_level != mddev->level || - mddev->new_layout != mddev->layout || - mddev->new_chunk != mddev->chunk_size) { - printk(KERN_ERR "raid5: %s: unsupported reshape required - aborting.\n", - mdname(mddev)); - return -EINVAL; - } - if (mddev->delta_disks <= 0) { - printk(KERN_ERR "raid5: %s: unsupported reshape (reduce disks) required - aborting.\n", - mdname(mddev)); - return -EINVAL; - } - old_disks = mddev->raid_disks - mddev->delta_disks; - /* reshape_position must be on a new-stripe boundary, and one - * further up in new geometry must map after here in old geometry. - */ - here_new = mddev->reshape_position; - if (sector_div(here_new, (mddev->chunk_size>>9)*(mddev->raid_disks-1))) { - printk(KERN_ERR "raid5: reshape_position not on a stripe boundary\n"); - return -EINVAL; - } - /* here_new is the stripe we will write to */ - here_old = mddev->reshape_position; - sector_div(here_old, (mddev->chunk_size>>9)*(old_disks-1)); - /* here_old is the first stripe that we might need to read from */ - if (here_new >= here_old) { - /* Reading from the same stripe as writing to - bad */ - printk(KERN_ERR "raid5: reshape_position too early for auto-recovery - aborting.\n"); - return -EINVAL; - } - printk(KERN_INFO "raid5: reshape will continue\n"); - /* OK, we should be able to continue; */ - } - - - mddev->private = kzalloc(sizeof (raid5_conf_t), GFP_KERNEL); + mddev->private = kzalloc(sizeof (raid5_conf_t) + + mddev->raid_disks * sizeof(struct disk_info), + GFP_KERNEL); if ((conf = mddev->private) == NULL) goto abort; - if (mddev->reshape_position == MaxSector) { - conf->previous_raid_disks = conf->raid_disks = mddev->raid_disks; - } else { - conf->raid_disks = mddev->raid_disks; - conf->previous_raid_disks = mddev->raid_disks - mddev->delta_disks; - } - - conf->disks = kzalloc(conf->raid_disks * sizeof(struct disk_info), - GFP_KERNEL); - if (!conf->disks) - goto abort; conf->mddev = mddev; if ((conf->stripe_hashtbl = kzalloc(PAGE_SIZE, GFP_KERNEL)) == NULL) goto abort; - if (mddev->level == 6) { - conf->spare_page = alloc_page(GFP_KERNEL); - if (!conf->spare_page) - goto abort; - } spin_lock_init(&conf->device_lock); init_waitqueue_head(&conf->wait_for_stripe); init_waitqueue_head(&conf->wait_for_overlap); @@ -3164,7 +1847,7 @@ static int run(mddev_t *mddev) ITERATE_RDEV(mddev,rdev,tmp) { raid_disk = rdev->raid_disk; - if (raid_disk >= conf->raid_disks + if (raid_disk >= mddev->raid_disks || raid_disk < 0) continue; disk = conf->disks + raid_disk; @@ -3180,30 +1863,21 @@ static int run(mddev_t *mddev) } } + conf->raid_disks = mddev->raid_disks; /* - * 0 for a fully functional array, 1 or 2 for a degraded array. + * 0 for a fully functional array, 1 for a degraded array. */ mddev->degraded = conf->failed_disks = conf->raid_disks - conf->working_disks; conf->mddev = mddev; conf->chunk_size = mddev->chunk_size; conf->level = mddev->level; - if (conf->level == 6) - conf->max_degraded = 2; - else - conf->max_degraded = 1; conf->algorithm = mddev->layout; conf->max_nr_stripes = NR_STRIPES; - conf->expand_progress = mddev->reshape_position; /* device size must be a multiple of chunk size */ mddev->size &= ~(mddev->chunk_size/1024 -1); mddev->resync_max_sectors = mddev->size << 1; - if (conf->level == 6 && conf->raid_disks < 4) { - printk(KERN_ERR "raid6: not enough configured devices for %s (%d, minimum 4)\n", - mdname(mddev), conf->raid_disks); - goto abort; - } if (!conf->chunk_size || conf->chunk_size % 4) { printk(KERN_ERR "raid5: invalid chunk size %d for %s\n", conf->chunk_size, mdname(mddev)); @@ -3215,14 +1889,14 @@ static int run(mddev_t *mddev) conf->algorithm, mdname(mddev)); goto abort; } - if (mddev->degraded > conf->max_degraded) { + if (mddev->degraded > 1) { printk(KERN_ERR "raid5: not enough operational devices for %s" " (%d/%d failed)\n", mdname(mddev), conf->failed_disks, conf->raid_disks); goto abort; } - if (mddev->degraded > 0 && + if (mddev->degraded == 1 && mddev->recovery_cp != MaxSector) { if (mddev->ok_start_degraded) printk(KERN_WARNING @@ -3271,25 +1945,12 @@ static int run(mddev_t *mddev) print_raid5_conf(conf); - if (conf->expand_progress != MaxSector) { - printk("...ok start reshape thread\n"); - conf->expand_lo = conf->expand_progress; - atomic_set(&conf->reshape_stripes, 0); - clear_bit(MD_RECOVERY_SYNC, &mddev->recovery); - clear_bit(MD_RECOVERY_CHECK, &mddev->recovery); - set_bit(MD_RECOVERY_RESHAPE, &mddev->recovery); - set_bit(MD_RECOVERY_RUNNING, &mddev->recovery); - mddev->sync_thread = md_register_thread(md_do_sync, mddev, - "%s_reshape"); - } - /* read-ahead size must cover two whole stripes, which is - * 2 * (datadisks) * chunksize where 'n' is the number of raid devices + * 2 * (n-1) * chunksize where 'n' is the number of raid devices */ { - int data_disks = conf->previous_raid_disks - conf->max_degraded; - int stripe = data_disks * - (mddev->chunk_size / PAGE_SIZE); + int stripe = (mddev->raid_disks-1) * mddev->chunk_size + / PAGE_SIZE; if (mddev->queue->backing_dev_info.ra_pages < 2 * stripe) mddev->queue->backing_dev_info.ra_pages = 2 * stripe; } @@ -3299,15 +1960,12 @@ static int run(mddev_t *mddev) mddev->queue->unplug_fn = raid5_unplug_device; mddev->queue->issue_flush_fn = raid5_issue_flush; - mddev->array_size = mddev->size * (conf->previous_raid_disks - - conf->max_degraded); + mddev->array_size = mddev->size * (mddev->raid_disks - 1); return 0; abort: if (conf) { print_raid5_conf(conf); - safe_put_page(conf->spare_page); - kfree(conf->disks); kfree(conf->stripe_hashtbl); kfree(conf); } @@ -3328,30 +1986,29 @@ static int stop(mddev_t *mddev) kfree(conf->stripe_hashtbl); blk_sync_queue(mddev->queue); /* the unplug fn references 'conf'*/ sysfs_remove_group(&mddev->kobj, &raid5_attrs_group); - kfree(conf->disks); kfree(conf); mddev->private = NULL; return 0; } #if RAID5_DEBUG -static void print_sh (struct seq_file *seq, struct stripe_head *sh) +static void print_sh (struct stripe_head *sh) { int i; - seq_printf(seq, "sh %llu, pd_idx %d, state %ld.\n", - (unsigned long long)sh->sector, sh->pd_idx, sh->state); - seq_printf(seq, "sh %llu, count %d.\n", - (unsigned long long)sh->sector, atomic_read(&sh->count)); - seq_printf(seq, "sh %llu, ", (unsigned long long)sh->sector); - for (i = 0; i < sh->disks; i++) { - seq_printf(seq, "(cache%d: %p %ld) ", - i, sh->dev[i].page, sh->dev[i].flags); + printk("sh %llu, pd_idx %d, state %ld.\n", + (unsigned long long)sh->sector, sh->pd_idx, sh->state); + printk("sh %llu, count %d.\n", + (unsigned long long)sh->sector, atomic_read(&sh->count)); + printk("sh %llu, ", (unsigned long long)sh->sector); + for (i = 0; i < sh->raid_conf->raid_disks; i++) { + printk("(cache%d: %p %ld) ", + i, sh->dev[i].page, sh->dev[i].flags); } - seq_printf(seq, "\n"); + printk("\n"); } -static void printall (struct seq_file *seq, raid5_conf_t *conf) +static void printall (raid5_conf_t *conf) { struct stripe_head *sh; struct hlist_node *hn; @@ -3362,7 +2019,7 @@ static void printall (struct seq_file *seq, raid5_conf_t *conf) hlist_for_each_entry(sh, hn, &conf->stripe_hashtbl[i], hash) { if (sh->raid_conf != conf) continue; - print_sh(seq, sh); + print_sh(sh); } } spin_unlock_irq(&conf->device_lock); @@ -3382,8 +2039,9 @@ static void status (struct seq_file *seq, mddev_t *mddev) test_bit(In_sync, &conf->disks[i].rdev->flags) ? "U" : "_"); seq_printf (seq, "]"); #if RAID5_DEBUG - seq_printf (seq, "\n"); - printall(seq, conf); +#define D(x) \ + seq_printf (seq, "<"#x":%d>", atomic_read(&conf->x)) + printall(conf); #endif } @@ -3467,20 +2125,14 @@ static int raid5_add_disk(mddev_t *mddev, mdk_rdev_t *rdev) int disk; struct disk_info *p; - if (mddev->degraded > conf->max_degraded) + if (mddev->degraded > 1) /* no point adding a device */ return 0; /* - * find the disk ... but prefer rdev->saved_raid_disk - * if possible. + * find the disk ... */ - if (rdev->saved_raid_disk >= 0 && - conf->disks[rdev->saved_raid_disk].rdev == NULL) - disk = rdev->saved_raid_disk; - else - disk = 0; - for ( ; disk < conf->raid_disks; disk++) + for (disk=0; disk < mddev->raid_disks; disk++) if ((p=conf->disks + disk)->rdev == NULL) { clear_bit(In_sync, &rdev->flags); rdev->raid_disk = disk; @@ -3503,10 +2155,8 @@ static int raid5_resize(mddev_t *mddev, sector_t sectors) * any io in the removed space completes, but it hardly seems * worth it. */ - raid5_conf_t *conf = mddev_to_conf(mddev); - sectors &= ~((sector_t)mddev->chunk_size/512 - 1); - mddev->array_size = (sectors * (mddev->raid_disks-conf->max_degraded))>>1; + mddev->array_size = (sectors * (mddev->raid_disks-1))>>1; set_capacity(mddev->gendisk, mddev->array_size << 1); mddev->changed = 1; if (sectors/2 > mddev->size && mddev->recovery_cp == MaxSector) { @@ -3518,158 +2168,11 @@ static int raid5_resize(mddev_t *mddev, sector_t sectors) return 0; } -#ifdef CONFIG_MD_RAID5_RESHAPE -static int raid5_check_reshape(mddev_t *mddev) -{ - raid5_conf_t *conf = mddev_to_conf(mddev); - int err; - - if (mddev->delta_disks < 0 || - mddev->new_level != mddev->level) - return -EINVAL; /* Cannot shrink array or change level yet */ - if (mddev->delta_disks == 0) - return 0; /* nothing to do */ - - /* Can only proceed if there are plenty of stripe_heads. - * We need a minimum of one full stripe,, and for sensible progress - * it is best to have about 4 times that. - * If we require 4 times, then the default 256 4K stripe_heads will - * allow for chunk sizes up to 256K, which is probably OK. - * If the chunk size is greater, user-space should request more - * stripe_heads first. - */ - if ((mddev->chunk_size / STRIPE_SIZE) * 4 > conf->max_nr_stripes || - (mddev->new_chunk / STRIPE_SIZE) * 4 > conf->max_nr_stripes) { - printk(KERN_WARNING "raid5: reshape: not enough stripes. Needed %lu\n", - (mddev->chunk_size / STRIPE_SIZE)*4); - return -ENOSPC; - } - - err = resize_stripes(conf, conf->raid_disks + mddev->delta_disks); - if (err) - return err; - - /* looks like we might be able to manage this */ - return 0; -} - -static int raid5_start_reshape(mddev_t *mddev) -{ - raid5_conf_t *conf = mddev_to_conf(mddev); - mdk_rdev_t *rdev; - struct list_head *rtmp; - int spares = 0; - int added_devices = 0; - - if (mddev->degraded || - test_bit(MD_RECOVERY_RUNNING, &mddev->recovery)) - return -EBUSY; - - ITERATE_RDEV(mddev, rdev, rtmp) - if (rdev->raid_disk < 0 && - !test_bit(Faulty, &rdev->flags)) - spares++; - - if (spares < mddev->delta_disks-1) - /* Not enough devices even to make a degraded array - * of that size - */ - return -EINVAL; - - atomic_set(&conf->reshape_stripes, 0); - spin_lock_irq(&conf->device_lock); - conf->previous_raid_disks = conf->raid_disks; - conf->raid_disks += mddev->delta_disks; - conf->expand_progress = 0; - conf->expand_lo = 0; - spin_unlock_irq(&conf->device_lock); - - /* Add some new drives, as many as will fit. - * We know there are enough to make the newly sized array work. - */ - ITERATE_RDEV(mddev, rdev, rtmp) - if (rdev->raid_disk < 0 && - !test_bit(Faulty, &rdev->flags)) { - if (raid5_add_disk(mddev, rdev)) { - char nm[20]; - set_bit(In_sync, &rdev->flags); - conf->working_disks++; - added_devices++; - rdev->recovery_offset = 0; - sprintf(nm, "rd%d", rdev->raid_disk); - sysfs_create_link(&mddev->kobj, &rdev->kobj, nm); - } else - break; - } - - mddev->degraded = (conf->raid_disks - conf->previous_raid_disks) - added_devices; - mddev->raid_disks = conf->raid_disks; - mddev->reshape_position = 0; - mddev->sb_dirty = 1; - - clear_bit(MD_RECOVERY_SYNC, &mddev->recovery); - clear_bit(MD_RECOVERY_CHECK, &mddev->recovery); - set_bit(MD_RECOVERY_RESHAPE, &mddev->recovery); - set_bit(MD_RECOVERY_RUNNING, &mddev->recovery); - mddev->sync_thread = md_register_thread(md_do_sync, mddev, - "%s_reshape"); - if (!mddev->sync_thread) { - mddev->recovery = 0; - spin_lock_irq(&conf->device_lock); - mddev->raid_disks = conf->raid_disks = conf->previous_raid_disks; - conf->expand_progress = MaxSector; - spin_unlock_irq(&conf->device_lock); - return -EAGAIN; - } - md_wakeup_thread(mddev->sync_thread); - md_new_event(mddev); - return 0; -} -#endif - -static void end_reshape(raid5_conf_t *conf) -{ - struct block_device *bdev; - - if (!test_bit(MD_RECOVERY_INTR, &conf->mddev->recovery)) { - conf->mddev->array_size = conf->mddev->size * (conf->raid_disks-1); - set_capacity(conf->mddev->gendisk, conf->mddev->array_size << 1); - conf->mddev->changed = 1; - - bdev = bdget_disk(conf->mddev->gendisk, 0); - if (bdev) { - mutex_lock(&bdev->bd_inode->i_mutex); - i_size_write(bdev->bd_inode, conf->mddev->array_size << 10); - mutex_unlock(&bdev->bd_inode->i_mutex); - bdput(bdev); - } - spin_lock_irq(&conf->device_lock); - conf->expand_progress = MaxSector; - spin_unlock_irq(&conf->device_lock); - conf->mddev->reshape_position = MaxSector; - - /* read-ahead size must cover two whole stripes, which is - * 2 * (datadisks) * chunksize where 'n' is the number of raid devices - */ - { - int data_disks = conf->previous_raid_disks - conf->max_degraded; - int stripe = data_disks * - (conf->mddev->chunk_size / PAGE_SIZE); - if (conf->mddev->queue->backing_dev_info.ra_pages < 2 * stripe) - conf->mddev->queue->backing_dev_info.ra_pages = 2 * stripe; - } - } -} - static void raid5_quiesce(mddev_t *mddev, int state) { raid5_conf_t *conf = mddev_to_conf(mddev); switch(state) { - case 2: /* resume for a suspend */ - wake_up(&conf->wait_for_overlap); - break; - case 1: /* stop all writes */ spin_lock_irq(&conf->device_lock); conf->quiesce = 1; @@ -3683,29 +2186,11 @@ static void raid5_quiesce(mddev_t *mddev, int state) spin_lock_irq(&conf->device_lock); conf->quiesce = 0; wake_up(&conf->wait_for_stripe); - wake_up(&conf->wait_for_overlap); spin_unlock_irq(&conf->device_lock); break; } } -static struct mdk_personality raid6_personality = -{ - .name = "raid6", - .level = 6, - .owner = THIS_MODULE, - .make_request = make_request, - .run = run, - .stop = stop, - .status = status, - .error_handler = error, - .hot_add_disk = raid5_add_disk, - .hot_remove_disk= raid5_remove_disk, - .spare_active = raid5_spare_active, - .sync_request = sync_request, - .resize = raid5_resize, - .quiesce = raid5_quiesce, -}; static struct mdk_personality raid5_personality = { .name = "raid5", @@ -3721,10 +2206,6 @@ static struct mdk_personality raid5_personality = .spare_active = raid5_spare_active, .sync_request = sync_request, .resize = raid5_resize, -#ifdef CONFIG_MD_RAID5_RESHAPE - .check_reshape = raid5_check_reshape, - .start_reshape = raid5_start_reshape, -#endif .quiesce = raid5_quiesce, }; @@ -3748,12 +2229,6 @@ static struct mdk_personality raid4_personality = static int __init raid5_init(void) { - int e; - - e = raid6_select_algo(); - if ( e ) - return e; - register_md_personality(&raid6_personality); register_md_personality(&raid5_personality); register_md_personality(&raid4_personality); return 0; @@ -3761,7 +2236,6 @@ static int __init raid5_init(void) static void raid5_exit(void) { - unregister_md_personality(&raid6_personality); unregister_md_personality(&raid5_personality); unregister_md_personality(&raid4_personality); } @@ -3774,10 +2248,3 @@ MODULE_ALIAS("md-raid5"); MODULE_ALIAS("md-raid4"); MODULE_ALIAS("md-level-5"); MODULE_ALIAS("md-level-4"); -MODULE_ALIAS("md-personality-8"); /* RAID6 */ -MODULE_ALIAS("md-raid6"); -MODULE_ALIAS("md-level-6"); - -/* This used to be two separate modules, they were: */ -MODULE_ALIAS("raid5"); -MODULE_ALIAS("raid6"); diff --git a/drivers/md/raid6algos.c b/drivers/md/raid6algos.c index 926576156..51c63c0cf 100644 --- a/drivers/md/raid6algos.c +++ b/drivers/md/raid6algos.c @@ -139,14 +139,15 @@ int __init raid6_select_algo(void) } } - if (best) { + if ( best ) printk("raid6: using algorithm %s (%ld MB/s)\n", best->name, (bestperf*HZ) >> (20-16+RAID6_TIME_JIFFIES_LG2)); - raid6_call = *best; - } else + else printk("raid6: Yikes! No algorithm found!\n"); + raid6_call = *best; + free_pages((unsigned long)syndromes, 1); return best ? 0 : -EINVAL; diff --git a/drivers/md/raid6main.c b/drivers/md/raid6main.c index bc69355e0..cd477ebf2 100644 --- a/drivers/md/raid6main.c +++ b/drivers/md/raid6main.c @@ -91,8 +91,10 @@ static void print_raid6_conf (raid6_conf_t *conf); static void __release_stripe(raid6_conf_t *conf, struct stripe_head *sh) { if (atomic_dec_and_test(&sh->count)) { - BUG_ON(!list_empty(&sh->lru)); - BUG_ON(atomic_read(&conf->active_stripes)==0); + if (!list_empty(&sh->lru)) + BUG(); + if (atomic_read(&conf->active_stripes)==0) + BUG(); if (test_bit(STRIPE_HANDLE, &sh->state)) { if (test_bit(STRIPE_DELAYED, &sh->state)) list_add_tail(&sh->lru, &conf->delayed_list); @@ -200,8 +202,10 @@ static void init_stripe(struct stripe_head *sh, sector_t sector, int pd_idx) raid6_conf_t *conf = sh->raid_conf; int disks = conf->raid_disks, i; - BUG_ON(atomic_read(&sh->count) != 0); - BUG_ON(test_bit(STRIPE_HANDLE, &sh->state)); + if (atomic_read(&sh->count) != 0) + BUG(); + if (test_bit(STRIPE_HANDLE, &sh->state)) + BUG(); CHECK_DEVLOCK(); PRINTK("init_stripe called, stripe %llu\n", @@ -280,11 +284,13 @@ static struct stripe_head *get_active_stripe(raid6_conf_t *conf, sector_t sector init_stripe(sh, sector, pd_idx); } else { if (atomic_read(&sh->count)) { - BUG_ON(!list_empty(&sh->lru)); + if (!list_empty(&sh->lru)) + BUG(); } else { if (!test_bit(STRIPE_HANDLE, &sh->state)) atomic_inc(&conf->active_stripes); - BUG_ON(list_empty(&sh->lru)); + if (list_empty(&sh->lru)) + BUG(); list_del_init(&sh->lru); } } @@ -325,9 +331,9 @@ static int grow_stripes(raid6_conf_t *conf, int num) kmem_cache_t *sc; int devs = conf->raid_disks; - sprintf(conf->cache_name[0], "raid6/%s", mdname(conf->mddev)); + sprintf(conf->cache_name, "raid6/%s", mdname(conf->mddev)); - sc = kmem_cache_create(conf->cache_name[0], + sc = kmem_cache_create(conf->cache_name, sizeof(struct stripe_head)+(devs-1)*sizeof(struct r5dev), 0, 0, NULL, NULL); if (!sc) @@ -347,7 +353,8 @@ static int drop_one_stripe(raid6_conf_t *conf) spin_unlock_irq(&conf->device_lock); if (!sh) return 0; - BUG_ON(atomic_read(&sh->count)); + if (atomic_read(&sh->count)) + BUG(); shrink_buffers(sh, conf->raid_disks); kmem_cache_free(conf->slab_cache, sh); atomic_dec(&conf->active_stripes); @@ -773,7 +780,7 @@ static void compute_parity(struct stripe_head *sh, int method) if (test_and_clear_bit(R5_Overlap, &sh->dev[i].flags)) wake_up(&conf->wait_for_overlap); - BUG_ON(sh->dev[i].written); + if (sh->dev[i].written) BUG(); sh->dev[i].written = chosen; } break; @@ -963,7 +970,8 @@ static int add_stripe_bio(struct stripe_head *sh, struct bio *bi, int dd_idx, in if (*bip && (*bip)->bi_sector < bi->bi_sector + ((bi->bi_size)>>9)) goto overlap; - BUG_ON(*bip && bi->bi_next && (*bip) != bi->bi_next); + if (*bip && bi->bi_next && (*bip) != bi->bi_next) + BUG(); if (*bip) bi->bi_next = *bip; *bip = bi; @@ -1898,7 +1906,8 @@ static void raid6d (mddev_t *mddev) list_del_init(first); atomic_inc(&sh->count); - BUG_ON(atomic_read(&sh->count)!= 1); + if (atomic_read(&sh->count)!= 1) + BUG(); spin_unlock_irq(&conf->device_lock); handled++; @@ -1997,14 +2006,11 @@ static int run(mddev_t *mddev) return -EIO; } - mddev->private = kzalloc(sizeof (raid6_conf_t), GFP_KERNEL); - if ((conf = mddev->private) == NULL) - goto abort; - conf->disks = kzalloc(mddev->raid_disks * sizeof(struct disk_info), + mddev->private = kzalloc(sizeof (raid6_conf_t) + + mddev->raid_disks * sizeof(struct disk_info), GFP_KERNEL); - if (!conf->disks) + if ((conf = mddev->private) == NULL) goto abort; - conf->mddev = mddev; if ((conf->stripe_hashtbl = kzalloc(PAGE_SIZE, GFP_KERNEL)) == NULL) @@ -2142,8 +2148,6 @@ static int run(mddev_t *mddev) } /* Ok, everything is just fine now */ - sysfs_create_group(&mddev->kobj, &raid6_attrs_group); - mddev->array_size = mddev->size * (mddev->raid_disks - 2); mddev->queue->unplug_fn = raid6_unplug_device; @@ -2154,7 +2158,6 @@ abort: print_raid6_conf(conf); safe_put_page(conf->spare_page); kfree(conf->stripe_hashtbl); - kfree(conf->disks); kfree(conf); } mddev->private = NULL; diff --git a/drivers/media/Kconfig b/drivers/media/Kconfig index 9f7e1fe8c..c2602b340 100644 --- a/drivers/media/Kconfig +++ b/drivers/media/Kconfig @@ -8,55 +8,22 @@ config VIDEO_DEV tristate "Video For Linux" ---help--- Support for audio/video capture and overlay devices and FM radio - cards. The exact capabilities of each device vary. + cards. The exact capabilities of each device vary. User tools for + this are available from + . This kernel includes support for the new Video for Linux Two API, (V4L2) as well as the original system. Drivers and applications need to be rewritten to use V4L2, but drivers for popular cards and applications for most video capture functions already exist. - Additional info and docs are available on the web at - - - Documentation for V4L2 is also available on the web at - . + Documentation for the original API is included in the file + . Documentation for V4L2 is + available on the web at . To compile this driver as a module, choose M here: the module will be called videodev. -config VIDEO_V4L1 - bool "Enable Video For Linux API 1 (DEPRECATED)" - depends on VIDEO_DEV - select VIDEO_V4L1_COMPAT - default y - ---help--- - Enables a compatibility API used by most V4L2 devices to allow - its usage with legacy applications that supports only V4L1 api. - - If you are unsure as to whether this is required, answer Y. - -config VIDEO_V4L1_COMPAT - bool "Enable Video For Linux API 1 compatible Layer" - depends on VIDEO_DEV - default y - ---help--- - This api were developed to be used at Kernel 2.2 and 2.4, but - lacks support for several video standards. There are several - drivers at kernel that still depends on it. - - Documentation for the original API is included in the file - . - - User tools for this are available from - . - - If you are unsure as to whether this is required, answer Y. - -config VIDEO_V4L2 - bool - depends on VIDEO_DEV - default y - source "drivers/media/video/Kconfig" source "drivers/media/radio/Kconfig" @@ -83,18 +50,5 @@ config VIDEO_IR config VIDEO_TVEEPROM tristate -config USB_DABUSB - tristate "DABUSB driver" - depends on USB - ---help--- - A Digital Audio Broadcasting (DAB) Receiver for USB and Linux - brought to you by the DAB-Team - . This driver can be taken - as an example for URB-based bulk, control, and isochronous - transactions. URB's are explained in - . - - To compile this driver as a module, choose M here: the - module will be called dabusb. - endmenu + diff --git a/drivers/media/common/Kconfig b/drivers/media/common/Kconfig index 1a04db455..6a901a026 100644 --- a/drivers/media/common/Kconfig +++ b/drivers/media/common/Kconfig @@ -1,10 +1,9 @@ config VIDEO_SAA7146 tristate - depends on I2C + select I2C config VIDEO_SAA7146_VV tristate - select VIDEO_V4L2 select VIDEO_BUF select VIDEO_VIDEOBUF select VIDEO_SAA7146 diff --git a/drivers/media/common/Makefile b/drivers/media/common/Makefile index 8e7448230..bd458cb9b 100644 --- a/drivers/media/common/Makefile +++ b/drivers/media/common/Makefile @@ -1,6 +1,5 @@ saa7146-objs := saa7146_i2c.o saa7146_core.o -saa7146_vv-objs := saa7146_fops.o saa7146_video.o saa7146_hlp.o saa7146_vbi.o -ir-common-objs := ir-functions.o ir-keymaps.o +saa7146_vv-objs := saa7146_vv_ksyms.o saa7146_fops.o saa7146_video.o saa7146_hlp.o saa7146_vbi.o obj-$(CONFIG_VIDEO_SAA7146) += saa7146.o obj-$(CONFIG_VIDEO_SAA7146_VV) += saa7146_vv.o diff --git a/drivers/media/common/ir-common.c b/drivers/media/common/ir-common.c index 84a49d2ec..97fa3fc57 100644 --- a/drivers/media/common/ir-common.c +++ b/drivers/media/common/ir-common.c @@ -1,5 +1,4 @@ /* - * $Id: ir-common.c,v 1.8 2005/02/22 12:28:40 kraxel Exp $ * * some common structs and functions to handle infrared remotes via * input layer ... @@ -23,6 +22,7 @@ #include #include +#include #include /* -------------------------------------------------------------------------- */ @@ -46,79 +46,49 @@ module_param(debug, int, 0644); /* see http://users.pandora.be/nenya/electronics/rc5/codes00.htm */ /* used by old (black) Hauppauge remotes */ IR_KEYTAB_TYPE ir_codes_rc5_tv[IR_KEYTAB_SIZE] = { - [ 0x00 ] = KEY_KP0, // 0 - [ 0x01 ] = KEY_KP1, // 1 - [ 0x02 ] = KEY_KP2, // 2 - [ 0x03 ] = KEY_KP3, // 3 - [ 0x04 ] = KEY_KP4, // 4 - [ 0x05 ] = KEY_KP5, // 5 - [ 0x06 ] = KEY_KP6, // 6 - [ 0x07 ] = KEY_KP7, // 7 - [ 0x08 ] = KEY_KP8, // 8 - [ 0x09 ] = KEY_KP9, // 9 - - [ 0x0b ] = KEY_CHANNEL, // channel / program (japan: 11) - [ 0x0c ] = KEY_POWER, // standby - [ 0x0d ] = KEY_MUTE, // mute / demute - [ 0x0f ] = KEY_TV, // display - [ 0x10 ] = KEY_VOLUMEUP, // volume + - [ 0x11 ] = KEY_VOLUMEDOWN, // volume - - [ 0x12 ] = KEY_BRIGHTNESSUP, // brightness + - [ 0x13 ] = KEY_BRIGHTNESSDOWN, // brightness - - [ 0x1e ] = KEY_SEARCH, // search + - [ 0x20 ] = KEY_CHANNELUP, // channel / program + - [ 0x21 ] = KEY_CHANNELDOWN, // channel / program - - [ 0x22 ] = KEY_CHANNEL, // alt / channel - [ 0x23 ] = KEY_LANGUAGE, // 1st / 2nd language - [ 0x26 ] = KEY_SLEEP, // sleeptimer - [ 0x2e ] = KEY_MENU, // 2nd controls (USA: menu) - [ 0x30 ] = KEY_PAUSE, // pause - [ 0x32 ] = KEY_REWIND, // rewind - [ 0x33 ] = KEY_GOTO, // go to - [ 0x35 ] = KEY_PLAY, // play - [ 0x36 ] = KEY_STOP, // stop - [ 0x37 ] = KEY_RECORD, // recording - [ 0x3c ] = KEY_TEXT, // teletext submode (Japan: 12) - [ 0x3d ] = KEY_SUSPEND, // system standby - -#if 0 /* FIXME */ - [ 0x0a ] = KEY_RESERVED, // 1/2/3 digits (japan: 10) - [ 0x0e ] = KEY_RESERVED, // P.P. (personal preference) - [ 0x14 ] = KEY_RESERVED, // colour saturation + - [ 0x15 ] = KEY_RESERVED, // colour saturation - - [ 0x16 ] = KEY_RESERVED, // bass + - [ 0x17 ] = KEY_RESERVED, // bass - - [ 0x18 ] = KEY_RESERVED, // treble + - [ 0x19 ] = KEY_RESERVED, // treble - - [ 0x1a ] = KEY_RESERVED, // balance right - [ 0x1b ] = KEY_RESERVED, // balance left - [ 0x1c ] = KEY_RESERVED, // contrast + - [ 0x1d ] = KEY_RESERVED, // contrast - - [ 0x1f ] = KEY_RESERVED, // tint/hue + - [ 0x24 ] = KEY_RESERVED, // spacial stereo on/off - [ 0x25 ] = KEY_RESERVED, // mono / stereo (USA) - [ 0x27 ] = KEY_RESERVED, // tint / hue - - [ 0x28 ] = KEY_RESERVED, // RF switch/PIP select - [ 0x29 ] = KEY_RESERVED, // vote - [ 0x2a ] = KEY_RESERVED, // timed page/channel clck - [ 0x2b ] = KEY_RESERVED, // increment (USA) - [ 0x2c ] = KEY_RESERVED, // decrement (USA) - [ 0x2d ] = KEY_RESERVED, // - [ 0x2f ] = KEY_RESERVED, // PIP shift - [ 0x31 ] = KEY_RESERVED, // erase - [ 0x34 ] = KEY_RESERVED, // wind - [ 0x38 ] = KEY_RESERVED, // external 1 - [ 0x39 ] = KEY_RESERVED, // external 2 - [ 0x3a ] = KEY_RESERVED, // PIP display mode - [ 0x3b ] = KEY_RESERVED, // view data mode / advance - [ 0x3e ] = KEY_RESERVED, // crispener on/off - [ 0x3f ] = KEY_RESERVED, // system select -#endif + /* Keys 0 to 9 */ + [ 0x00 ] = KEY_KP0, + [ 0x01 ] = KEY_KP1, + [ 0x02 ] = KEY_KP2, + [ 0x03 ] = KEY_KP3, + [ 0x04 ] = KEY_KP4, + [ 0x05 ] = KEY_KP5, + [ 0x06 ] = KEY_KP6, + [ 0x07 ] = KEY_KP7, + [ 0x08 ] = KEY_KP8, + [ 0x09 ] = KEY_KP9, + + [ 0x0b ] = KEY_CHANNEL, /* channel / program (japan: 11) */ + [ 0x0c ] = KEY_POWER, /* standby */ + [ 0x0d ] = KEY_MUTE, /* mute / demute */ + [ 0x0f ] = KEY_TV, /* display */ + [ 0x10 ] = KEY_VOLUMEUP, + [ 0x11 ] = KEY_VOLUMEDOWN, + [ 0x12 ] = KEY_BRIGHTNESSUP, + [ 0x13 ] = KEY_BRIGHTNESSDOWN, + [ 0x1e ] = KEY_SEARCH, /* search + */ + [ 0x20 ] = KEY_CHANNELUP, /* channel / program + */ + [ 0x21 ] = KEY_CHANNELDOWN, /* channel / program - */ + [ 0x22 ] = KEY_CHANNEL, /* alt / channel */ + [ 0x23 ] = KEY_LANGUAGE, /* 1st / 2nd language */ + [ 0x26 ] = KEY_SLEEP, /* sleeptimer */ + [ 0x2e ] = KEY_MENU, /* 2nd controls (USA: menu) */ + [ 0x30 ] = KEY_PAUSE, + [ 0x32 ] = KEY_REWIND, + [ 0x33 ] = KEY_GOTO, + [ 0x35 ] = KEY_PLAY, + [ 0x36 ] = KEY_STOP, + [ 0x37 ] = KEY_RECORD, /* recording */ + [ 0x3c ] = KEY_TEXT, /* teletext submode (Japan: 12) */ + [ 0x3d ] = KEY_SUSPEND, /* system standby */ + }; EXPORT_SYMBOL_GPL(ir_codes_rc5_tv); /* Table for Leadtek Winfast Remote Controls - used by both bttv and cx88 */ IR_KEYTAB_TYPE ir_codes_winfast[IR_KEYTAB_SIZE] = { + /* Keys 0 to 9 */ + [ 18 ] = KEY_KP0, [ 5 ] = KEY_KP1, [ 6 ] = KEY_KP2, [ 7 ] = KEY_KP3, @@ -128,42 +98,94 @@ IR_KEYTAB_TYPE ir_codes_winfast[IR_KEYTAB_SIZE] = { [ 13 ] = KEY_KP7, [ 14 ] = KEY_KP8, [ 15 ] = KEY_KP9, - [ 18 ] = KEY_KP0, [ 0 ] = KEY_POWER, - [ 27 ] = KEY_LANGUAGE, //MTS button - [ 2 ] = KEY_TUNER, // TV/FM + [ 2 ] = KEY_TUNER, /* TV/FM */ [ 30 ] = KEY_VIDEO, - [ 22 ] = KEY_INFO, //display button [ 4 ] = KEY_VOLUMEUP, [ 8 ] = KEY_VOLUMEDOWN, [ 12 ] = KEY_CHANNELUP, [ 16 ] = KEY_CHANNELDOWN, - [ 3 ] = KEY_ZOOM, // fullscreen - [ 31 ] = KEY_SUBTITLE, // closed caption/teletext + [ 3 ] = KEY_ZOOM, /* fullscreen */ + [ 31 ] = KEY_SUBTITLE, /* closed caption/teletext */ [ 32 ] = KEY_SLEEP, - [ 41 ] = KEY_SEARCH, //boss key [ 20 ] = KEY_MUTE, [ 43 ] = KEY_RED, [ 44 ] = KEY_GREEN, [ 45 ] = KEY_YELLOW, [ 46 ] = KEY_BLUE, - [ 24 ] = KEY_KPPLUS, //fine tune + - [ 25 ] = KEY_KPMINUS, //fine tune - - [ 42 ] = KEY_ANGLE, //picture in picture + [ 24 ] = KEY_KPPLUS, /* fine tune + */ + [ 25 ] = KEY_KPMINUS, /* fine tune - */ [ 33 ] = KEY_KPDOT, [ 19 ] = KEY_KPENTER, - [ 17 ] = KEY_AGAIN, //recall [ 34 ] = KEY_BACK, [ 35 ] = KEY_PLAYPAUSE, [ 36 ] = KEY_NEXT, - [ 37 ] = KEY_T, //time shifting [ 38 ] = KEY_STOP, - [ 39 ] = KEY_RECORD, - [ 40 ] = KEY_SHUFFLE //snapshot + [ 39 ] = KEY_RECORD }; EXPORT_SYMBOL_GPL(ir_codes_winfast); +IR_KEYTAB_TYPE ir_codes_pinnacle[IR_KEYTAB_SIZE] = { + [ 0x59 ] = KEY_MUTE, + [ 0x4a ] = KEY_POWER, + + [ 0x18 ] = KEY_TEXT, + [ 0x26 ] = KEY_TV, + [ 0x3d ] = KEY_PRINT, + + [ 0x48 ] = KEY_RED, + [ 0x04 ] = KEY_GREEN, + [ 0x11 ] = KEY_YELLOW, + [ 0x00 ] = KEY_BLUE, + + [ 0x2d ] = KEY_VOLUMEUP, + [ 0x1e ] = KEY_VOLUMEDOWN, + + [ 0x49 ] = KEY_MENU, + + [ 0x16 ] = KEY_CHANNELUP, + [ 0x17 ] = KEY_CHANNELDOWN, + + [ 0x20 ] = KEY_UP, + [ 0x21 ] = KEY_DOWN, + [ 0x22 ] = KEY_LEFT, + [ 0x23 ] = KEY_RIGHT, + [ 0x0d ] = KEY_SELECT, + + + + [ 0x08 ] = KEY_BACK, + [ 0x07 ] = KEY_REFRESH, + + [ 0x2f ] = KEY_ZOOM, + [ 0x29 ] = KEY_RECORD, + + [ 0x4b ] = KEY_PAUSE, + [ 0x4d ] = KEY_REWIND, + [ 0x2e ] = KEY_PLAY, + [ 0x4e ] = KEY_FORWARD, + [ 0x53 ] = KEY_PREVIOUS, + [ 0x4c ] = KEY_STOP, + [ 0x54 ] = KEY_NEXT, + + [ 0x69 ] = KEY_KP0, + [ 0x6a ] = KEY_KP1, + [ 0x6b ] = KEY_KP2, + [ 0x6c ] = KEY_KP3, + [ 0x6d ] = KEY_KP4, + [ 0x6e ] = KEY_KP5, + [ 0x6f ] = KEY_KP6, + [ 0x70 ] = KEY_KP7, + [ 0x71 ] = KEY_KP8, + [ 0x72 ] = KEY_KP9, + + [ 0x74 ] = KEY_CHANNEL, + [ 0x0a ] = KEY_BACKSPACE, +}; + +EXPORT_SYMBOL_GPL(ir_codes_pinnacle); + /* empty keytable, can be used as placeholder for not-yet created keytables */ IR_KEYTAB_TYPE ir_codes_empty[IR_KEYTAB_SIZE] = { [ 42 ] = KEY_COFFEE, @@ -174,45 +196,97 @@ EXPORT_SYMBOL_GPL(ir_codes_empty); * slightly different versions), shipped with cx88+ivtv cards. * almost rc5 coding, but some non-standard keys */ IR_KEYTAB_TYPE ir_codes_hauppauge_new[IR_KEYTAB_SIZE] = { - [ 0x00 ] = KEY_KP0, // 0 - [ 0x01 ] = KEY_KP1, // 1 - [ 0x02 ] = KEY_KP2, // 2 - [ 0x03 ] = KEY_KP3, // 3 - [ 0x04 ] = KEY_KP4, // 4 - [ 0x05 ] = KEY_KP5, // 5 - [ 0x06 ] = KEY_KP6, // 6 - [ 0x07 ] = KEY_KP7, // 7 - [ 0x08 ] = KEY_KP8, // 8 - [ 0x09 ] = KEY_KP9, // 9 - [ 0x0b ] = KEY_RED, // red button - [ 0x0c ] = KEY_OPTION, // black key without text - [ 0x0d ] = KEY_MENU, // menu - [ 0x0f ] = KEY_MUTE, // mute - [ 0x10 ] = KEY_VOLUMEUP, // volume + - [ 0x11 ] = KEY_VOLUMEDOWN, // volume - - [ 0x1e ] = KEY_NEXT, // skip >| - [ 0x1f ] = KEY_EXIT, // back/exit - [ 0x20 ] = KEY_CHANNELUP, // channel / program + - [ 0x21 ] = KEY_CHANNELDOWN, // channel / program - - [ 0x22 ] = KEY_CHANNEL, // source (old black remote) - [ 0x24 ] = KEY_PREVIOUS, // replay |< - [ 0x25 ] = KEY_ENTER, // OK - [ 0x26 ] = KEY_SLEEP, // minimize (old black remote) - [ 0x29 ] = KEY_BLUE, // blue key - [ 0x2e ] = KEY_GREEN, // green button - [ 0x30 ] = KEY_PAUSE, // pause - [ 0x32 ] = KEY_REWIND, // backward << - [ 0x34 ] = KEY_FASTFORWARD, // forward >> - [ 0x35 ] = KEY_PLAY, // play - [ 0x36 ] = KEY_STOP, // stop - [ 0x37 ] = KEY_RECORD, // recording - [ 0x38 ] = KEY_YELLOW, // yellow key - [ 0x3b ] = KEY_SELECT, // top right button - [ 0x3c ] = KEY_ZOOM, // full - [ 0x3d ] = KEY_POWER, // system power (green button) + /* Keys 0 to 9 */ + [ 0x00 ] = KEY_KP0, + [ 0x01 ] = KEY_KP1, + [ 0x02 ] = KEY_KP2, + [ 0x03 ] = KEY_KP3, + [ 0x04 ] = KEY_KP4, + [ 0x05 ] = KEY_KP5, + [ 0x06 ] = KEY_KP6, + [ 0x07 ] = KEY_KP7, + [ 0x08 ] = KEY_KP8, + [ 0x09 ] = KEY_KP9, + + [ 0x0a ] = KEY_TEXT, /* keypad asterisk as well */ + [ 0x0b ] = KEY_RED, /* red button */ + [ 0x0c ] = KEY_RADIO, + [ 0x0d ] = KEY_MENU, + [ 0x0e ] = KEY_SUBTITLE, /* also the # key */ + [ 0x0f ] = KEY_MUTE, + [ 0x10 ] = KEY_VOLUMEUP, + [ 0x11 ] = KEY_VOLUMEDOWN, + [ 0x12 ] = KEY_PREVIOUS, /* previous channel */ + [ 0x14 ] = KEY_UP, + [ 0x15 ] = KEY_DOWN, + [ 0x16 ] = KEY_LEFT, + [ 0x17 ] = KEY_RIGHT, + [ 0x18 ] = KEY_VIDEO, /* Videos */ + [ 0x19 ] = KEY_AUDIO, /* Music */ + /* 0x1a: Pictures - presume this means + "Multimedia Home Platform" - + no "PICTURES" key in input.h + */ + [ 0x1a ] = KEY_MHP, + + [ 0x1b ] = KEY_EPG, /* Guide */ + [ 0x1c ] = KEY_TV, + [ 0x1e ] = KEY_NEXTSONG, /* skip >| */ + [ 0x1f ] = KEY_EXIT, /* back/exit */ + [ 0x20 ] = KEY_CHANNELUP, /* channel / program + */ + [ 0x21 ] = KEY_CHANNELDOWN, /* channel / program - */ + [ 0x22 ] = KEY_CHANNEL, /* source (old black remote) */ + [ 0x24 ] = KEY_PREVIOUSSONG, /* replay |< */ + [ 0x25 ] = KEY_ENTER, /* OK */ + [ 0x26 ] = KEY_SLEEP, /* minimize (old black remote) */ + [ 0x29 ] = KEY_BLUE, /* blue key */ + [ 0x2e ] = KEY_GREEN, /* green button */ + [ 0x30 ] = KEY_PAUSE, /* pause */ + [ 0x32 ] = KEY_REWIND, /* backward << */ + [ 0x34 ] = KEY_FASTFORWARD, /* forward >> */ + [ 0x35 ] = KEY_PLAY, + [ 0x36 ] = KEY_STOP, + [ 0x37 ] = KEY_RECORD, /* recording */ + [ 0x38 ] = KEY_YELLOW, /* yellow key */ + [ 0x3b ] = KEY_SELECT, /* top right button */ + [ 0x3c ] = KEY_ZOOM, /* full */ + [ 0x3d ] = KEY_POWER, /* system power (green button) */ }; EXPORT_SYMBOL(ir_codes_hauppauge_new); +IR_KEYTAB_TYPE ir_codes_pixelview[IR_KEYTAB_SIZE] = { + [ 2 ] = KEY_KP0, + [ 1 ] = KEY_KP1, + [ 11 ] = KEY_KP2, + [ 27 ] = KEY_KP3, + [ 5 ] = KEY_KP4, + [ 9 ] = KEY_KP5, + [ 21 ] = KEY_KP6, + [ 6 ] = KEY_KP7, + [ 10 ] = KEY_KP8, + [ 18 ] = KEY_KP9, + + [ 3 ] = KEY_TUNER, /* TV/FM */ + [ 7 ] = KEY_SEARCH, /* scan */ + [ 28 ] = KEY_ZOOM, /* full screen */ + [ 30 ] = KEY_POWER, + [ 23 ] = KEY_VOLUMEDOWN, + [ 31 ] = KEY_VOLUMEUP, + [ 20 ] = KEY_CHANNELDOWN, + [ 22 ] = KEY_CHANNELUP, + [ 24 ] = KEY_MUTE, + + [ 0 ] = KEY_LIST, /* source */ + [ 19 ] = KEY_INFO, /* loop */ + [ 16 ] = KEY_LAST, /* +100 */ + [ 13 ] = KEY_CLEAR, /* reset */ + [ 12 ] = BTN_RIGHT, /* fun++ */ + [ 4 ] = BTN_LEFT, /* fun-- */ + [ 14 ] = KEY_GOTO, /* function */ + [ 15 ] = KEY_STOP, /* freeze */ +}; +EXPORT_SYMBOL(ir_codes_pixelview); + /* -------------------------------------------------------------------------- */ static void ir_input_key_event(struct input_dev *dev, struct ir_input_state *ir) @@ -225,7 +299,7 @@ static void ir_input_key_event(struct input_dev *dev, struct ir_input_state *ir) dprintk(1,"%s: key event code=%d down=%d\n", dev->name,ir->keycode,ir->keypressed); input_report_key(dev,ir->keycode,ir->keypressed); - input_sync(dev); + input_sync(dev); } /* -------------------------------------------------------------------------- */ @@ -239,7 +313,7 @@ void ir_input_init(struct input_dev *dev, struct ir_input_state *ir, if (ir_codes) memcpy(ir->ir_codes, ir_codes, sizeof(ir->ir_codes)); - init_input_dev(dev); + dev->keycode = ir->ir_codes; dev->keycodesize = sizeof(IR_KEYTAB_TYPE); dev->keycodemax = IR_KEYTAB_SIZE; @@ -276,10 +350,6 @@ void ir_input_keydown(struct input_dev *dev, struct ir_input_state *ir, ir->keypressed = 1; ir_input_key_event(dev,ir); } -#if 0 - /* maybe do something like this ??? */ - input_event(a, EV_IR, ir->ir_type, ir->ir_raw); -#endif } /* -------------------------------------------------------------------------- */ @@ -325,6 +395,72 @@ int ir_dump_samples(u32 *samples, int count) return 0; } +/* decode raw samples, pulse distance coding used by NEC remotes */ +int ir_decode_pulsedistance(u32 *samples, int count, int low, int high) +{ + int i,last,bit,len; + u32 curBit; + u32 value; + + /* find start burst */ + for (i = len = 0; i < count * 32; i++) { + bit = getbit(samples,i); + if (bit) { + len++; + } else { + if (len >= 29) + break; + len = 0; + } + } + + /* start burst to short */ + if (len < 29) + return 0xffffffff; + + /* find start silence */ + for (len = 0; i < count * 32; i++) { + bit = getbit(samples,i); + if (bit) { + break; + } else { + len++; + } + } + + /* silence to short */ + if (len < 7) + return 0xffffffff; + + /* go decoding */ + len = 0; + last = 1; + value = 0; curBit = 1; + for (; i < count * 32; i++) { + bit = getbit(samples,i); + if (last) { + if(bit) { + continue; + } else { + len = 1; + } + } else { + if (bit) { + if (len > (low + high) /2) + value |= curBit; + curBit <<= 1; + if (curBit == 1) + break; + } else { + len++; + } + } + last = bit; + } + + return value; +} + /* decode raw samples, biphase coding, used by rc5 for example */ int ir_decode_biphase(u32 *samples, int count, int low, int high) { @@ -373,9 +509,11 @@ EXPORT_SYMBOL_GPL(ir_input_keydown); EXPORT_SYMBOL_GPL(ir_extract_bits); EXPORT_SYMBOL_GPL(ir_dump_samples); EXPORT_SYMBOL_GPL(ir_decode_biphase); +EXPORT_SYMBOL_GPL(ir_decode_pulsedistance); /* * Local variables: * c-basic-offset: 8 * End: */ + diff --git a/drivers/media/common/saa7146_core.c b/drivers/media/common/saa7146_core.c index b88451e33..04c1938b9 100644 --- a/drivers/media/common/saa7146_core.c +++ b/drivers/media/common/saa7146_core.c @@ -21,7 +21,7 @@ #include LIST_HEAD(saa7146_devices); -DEFINE_MUTEX(saa7146_devices_lock); +DECLARE_MUTEX(saa7146_devices_lock); static int saa7146_num; @@ -116,7 +116,8 @@ static struct scatterlist* vmalloc_to_sg(unsigned char *virt, int nr_pages) pg = vmalloc_to_page(virt); if (NULL == pg) goto err; - BUG_ON(PageHighMem(pg)); + if (PageHighMem(pg)) + BUG(); sglist[i].page = pg; sglist[i].length = PAGE_SIZE; } @@ -363,7 +364,7 @@ static int saa7146_init_one(struct pci_dev *pci, const struct pci_device_id *ent saa7146_write(dev, MC2, 0xf8000000); /* request an interrupt for the saa7146 */ - err = request_irq(pci->irq, interrupt_hw, IRQF_SHARED | IRQF_DISABLED, + err = request_irq(pci->irq, interrupt_hw, SA_SHIRQ | SA_INTERRUPT, dev->name, dev); if (err < 0) { ERR(("request_irq() failed.\n")); @@ -401,11 +402,11 @@ static int saa7146_init_one(struct pci_dev *pci, const struct pci_device_id *ent pci_set_drvdata(pci, dev); - mutex_init(&dev->lock); + init_MUTEX(&dev->lock); spin_lock_init(&dev->int_slock); spin_lock_init(&dev->slock); - mutex_init(&dev->i2c_lock); + init_MUTEX(&dev->i2c_lock); dev->module = THIS_MODULE; init_waitqueue_head(&dev->i2c_wq); diff --git a/drivers/media/common/saa7146_fops.c b/drivers/media/common/saa7146_fops.c index 0027acc5b..f8cf73ed4 100644 --- a/drivers/media/common/saa7146_fops.c +++ b/drivers/media/common/saa7146_fops.c @@ -17,18 +17,18 @@ int saa7146_res_get(struct saa7146_fh *fh, unsigned int bit) } /* is it free? */ - mutex_lock(&dev->lock); + down(&dev->lock); if (vv->resources & bit) { DEB_D(("locked! vv->resources:0x%02x, we want:0x%02x\n",vv->resources,bit)); /* no, someone else uses it */ - mutex_unlock(&dev->lock); + up(&dev->lock); return 0; } /* it's free, grab it */ fh->resources |= bit; vv->resources |= bit; DEB_D(("res: get 0x%02x, cur:0x%02x\n",bit,vv->resources)); - mutex_unlock(&dev->lock); + up(&dev->lock); return 1; } @@ -37,28 +37,29 @@ void saa7146_res_free(struct saa7146_fh *fh, unsigned int bits) struct saa7146_dev *dev = fh->dev; struct saa7146_vv *vv = dev->vv_data; - BUG_ON((fh->resources & bits) != bits); + if ((fh->resources & bits) != bits) + BUG(); - mutex_lock(&dev->lock); + down(&dev->lock); fh->resources &= ~bits; vv->resources &= ~bits; DEB_D(("res: put 0x%02x, cur:0x%02x\n",bits,vv->resources)); - mutex_unlock(&dev->lock); + up(&dev->lock); } /********************************************************************************/ /* common dma functions */ -void saa7146_dma_free(struct saa7146_dev *dev,struct videobuf_queue *q, - struct saa7146_buf *buf) +void saa7146_dma_free(struct saa7146_dev *dev,struct saa7146_buf *buf) { DEB_EE(("dev:%p, buf:%p\n",dev,buf)); - BUG_ON(in_interrupt()); + if (in_interrupt()) + BUG(); videobuf_waiton(&buf->vb,0,0); - videobuf_dma_unmap(q, &buf->vb.dma); + videobuf_dma_pci_unmap(dev->pci, &buf->vb.dma); videobuf_dma_free(&buf->vb.dma); buf->vb.state = STATE_NEEDS_INIT; } @@ -203,7 +204,7 @@ static int fops_open(struct inode *inode, struct file *file) DEB_EE(("inode:%p, file:%p, minor:%d\n",inode,file,minor)); - if (mutex_lock_interruptible(&saa7146_devices_lock)) + if (down_interruptible(&saa7146_devices_lock)) return -ERESTARTSYS; list_for_each(list,&saa7146_devices) { @@ -275,7 +276,7 @@ out: kfree(fh); file->private_data = NULL; } - mutex_unlock(&saa7146_devices_lock); + up(&saa7146_devices_lock); return result; } @@ -286,7 +287,7 @@ static int fops_release(struct inode *inode, struct file *file) DEB_EE(("inode:%p, file:%p\n",inode,file)); - if (mutex_lock_interruptible(&saa7146_devices_lock)) + if (down_interruptible(&saa7146_devices_lock)) return -ERESTARTSYS; if( fh->type == V4L2_BUF_TYPE_VBI_CAPTURE) { @@ -302,7 +303,7 @@ static int fops_release(struct inode *inode, struct file *file) file->private_data = NULL; kfree(fh); - mutex_unlock(&saa7146_devices_lock); + up(&saa7146_devices_lock); return 0; } @@ -501,7 +502,6 @@ int saa7146_vv_init(struct saa7146_dev* dev, struct saa7146_ext_vv *ext_vv) return 0; } -EXPORT_SYMBOL_GPL(saa7146_vv_init); int saa7146_vv_release(struct saa7146_dev* dev) { @@ -516,7 +516,6 @@ int saa7146_vv_release(struct saa7146_dev* dev) return 0; } -EXPORT_SYMBOL_GPL(saa7146_vv_release); int saa7146_register_device(struct video_device **vid, struct saa7146_dev* dev, char *name, int type) @@ -555,7 +554,6 @@ int saa7146_register_device(struct video_device **vid, struct saa7146_dev* dev, *vid = vfd; return 0; } -EXPORT_SYMBOL_GPL(saa7146_register_device); int saa7146_unregister_device(struct video_device **vid, struct saa7146_dev* dev) { @@ -574,7 +572,6 @@ int saa7146_unregister_device(struct video_device **vid, struct saa7146_dev* dev return 0; } -EXPORT_SYMBOL_GPL(saa7146_unregister_device); static int __init saa7146_vv_init_module(void) { diff --git a/drivers/media/common/saa7146_hlp.c b/drivers/media/common/saa7146_hlp.c index d2905720e..33bec8a68 100644 --- a/drivers/media/common/saa7146_hlp.c +++ b/drivers/media/common/saa7146_hlp.c @@ -158,7 +158,7 @@ static int calculate_h_scale_registers(struct saa7146_dev *dev, } /* the horizontal scaling increment controls the UV filter - to reduce the bandwidth to improve the display quality, + to reduce the bandwith to improve the display quality, so set it ... */ if ( xsci == 0x400) pfuv = 0x00; @@ -641,7 +641,6 @@ void saa7146_set_hps_source_and_sync(struct saa7146_dev *dev, int source, int sy vv->current_hps_source = source; vv->current_hps_sync = sync; } -EXPORT_SYMBOL_GPL(saa7146_set_hps_source_and_sync); int saa7146_enable_overlay(struct saa7146_fh *fh) { diff --git a/drivers/media/common/saa7146_i2c.c b/drivers/media/common/saa7146_i2c.c index d9953f7a8..8aabdd8fb 100644 --- a/drivers/media/common/saa7146_i2c.c +++ b/drivers/media/common/saa7146_i2c.c @@ -279,7 +279,7 @@ int saa7146_i2c_transfer(struct saa7146_dev *dev, const struct i2c_msg *msgs, in int address_err = 0; int short_delay = 0; - if (mutex_lock_interruptible(&dev->i2c_lock)) + if (down_interruptible (&dev->i2c_lock)) return -ERESTARTSYS; for(i=0;ii2c_lock); + up(&dev->i2c_lock); return err; } diff --git a/drivers/media/common/saa7146_vbi.c b/drivers/media/common/saa7146_vbi.c index 063608462..468d3c959 100644 --- a/drivers/media/common/saa7146_vbi.c +++ b/drivers/media/common/saa7146_vbi.c @@ -236,7 +236,7 @@ static int buffer_prepare(struct videobuf_queue *q, struct videobuf_buffer *vb,e } if (buf->vb.size != size) - saa7146_dma_free(dev,q,buf); + saa7146_dma_free(dev,buf); if (STATE_NEEDS_INIT == buf->vb.state) { buf->vb.width = llength; @@ -247,7 +247,7 @@ static int buffer_prepare(struct videobuf_queue *q, struct videobuf_buffer *vb,e saa7146_pgtable_free(dev->pci, &buf->pt[2]); saa7146_pgtable_alloc(dev->pci, &buf->pt[2]); - err = videobuf_iolock(q,&buf->vb, NULL); + err = videobuf_iolock(dev->pci,&buf->vb, NULL); if (err) goto oops; err = saa7146_pgtable_build_single(dev->pci, &buf->pt[2], buf->vb.dma.sglist, buf->vb.dma.sglen); @@ -261,7 +261,7 @@ static int buffer_prepare(struct videobuf_queue *q, struct videobuf_buffer *vb,e oops: DEB_VBI(("error out.\n")); - saa7146_dma_free(dev,q,buf); + saa7146_dma_free(dev,buf); return err; } @@ -301,7 +301,7 @@ static void buffer_release(struct videobuf_queue *q, struct videobuf_buffer *vb) struct saa7146_buf *buf = (struct saa7146_buf *)vb; DEB_VBI(("vb:%p\n",vb)); - saa7146_dma_free(dev,q,buf); + saa7146_dma_free(dev,buf); } static struct videobuf_queue_ops vbi_qops = { @@ -410,7 +410,7 @@ static int vbi_open(struct saa7146_dev *dev, struct file *file) V4L2_FIELD_SEQ_TB, // FIXME: does this really work? sizeof(struct saa7146_buf), file); - mutex_init(&fh->vbi_q.lock); + init_MUTEX(&fh->vbi_q.lock); init_timer(&fh->vbi_read_timeout); fh->vbi_read_timeout.function = vbi_read_timeout; diff --git a/drivers/media/common/saa7146_video.c b/drivers/media/common/saa7146_video.c index 7e0cedc55..7ebac7949 100644 --- a/drivers/media/common/saa7146_video.c +++ b/drivers/media/common/saa7146_video.c @@ -318,7 +318,6 @@ int saa7146_start_preview(struct saa7146_fh *fh) return 0; } -EXPORT_SYMBOL_GPL(saa7146_start_preview); int saa7146_stop_preview(struct saa7146_fh *fh) { @@ -353,7 +352,6 @@ int saa7146_stop_preview(struct saa7146_fh *fh) return 0; } -EXPORT_SYMBOL_GPL(saa7146_stop_preview); static int s_fmt(struct saa7146_fh *fh, struct v4l2_format *f) { @@ -380,20 +378,20 @@ static int s_fmt(struct saa7146_fh *fh, struct v4l2_format *f) err = try_win(dev,&f->fmt.win); if (0 != err) return err; - mutex_lock(&dev->lock); + down(&dev->lock); fh->ov.win = f->fmt.win; fh->ov.nclips = f->fmt.win.clipcount; if (fh->ov.nclips > 16) fh->ov.nclips = 16; if (copy_from_user(fh->ov.clips,f->fmt.win.clips,sizeof(struct v4l2_clip)*fh->ov.nclips)) { - mutex_unlock(&dev->lock); + up(&dev->lock); return -EFAULT; } /* fh->ov.fh is used to indicate that we have valid overlay informations, too */ fh->ov.fh = fh; - mutex_unlock(&dev->lock); + up(&dev->lock); /* check if our current overlay is active */ if (IS_OVERLAY_ACTIVE(fh) != 0) { @@ -518,7 +516,7 @@ static int set_control(struct saa7146_fh *fh, struct v4l2_control *c) return -EINVAL; } - mutex_lock(&dev->lock); + down(&dev->lock); switch (ctrl->type) { case V4L2_CTRL_TYPE_BOOLEAN: @@ -562,7 +560,7 @@ static int set_control(struct saa7146_fh *fh, struct v4l2_control *c) /* fixme: we can support changing VFLIP and HFLIP here... */ if (IS_CAPTURE_ACTIVE(fh) != 0) { DEB_D(("V4L2_CID_HFLIP while active capture.\n")); - mutex_unlock(&dev->lock); + up(&dev->lock); return -EINVAL; } vv->hflip = c->value; @@ -570,7 +568,7 @@ static int set_control(struct saa7146_fh *fh, struct v4l2_control *c) case V4L2_CID_VFLIP: if (IS_CAPTURE_ACTIVE(fh) != 0) { DEB_D(("V4L2_CID_VFLIP while active capture.\n")); - mutex_unlock(&dev->lock); + up(&dev->lock); return -EINVAL; } vv->vflip = c->value; @@ -579,7 +577,7 @@ static int set_control(struct saa7146_fh *fh, struct v4l2_control *c) return -EINVAL; } } - mutex_unlock(&dev->lock); + up(&dev->lock); if (IS_OVERLAY_ACTIVE(fh) != 0) { saa7146_stop_preview(fh); @@ -941,7 +939,7 @@ int saa7146_video_do_ioctl(struct inode *inode, struct file *file, unsigned int } } - mutex_lock(&dev->lock); + down(&dev->lock); /* ok, accept it */ vv->ov_fb = *fb; @@ -950,7 +948,7 @@ int saa7146_video_do_ioctl(struct inode *inode, struct file *file, unsigned int vv->ov_fb.fmt.bytesperline = vv->ov_fb.fmt.width*fmt->depth/8; - mutex_unlock(&dev->lock); + up(&dev->lock); return 0; } @@ -1088,7 +1086,7 @@ int saa7146_video_do_ioctl(struct inode *inode, struct file *file, unsigned int } } - mutex_lock(&dev->lock); + down(&dev->lock); for(i = 0; i < dev->ext_vv_data->num_stds; i++) if (*id & dev->ext_vv_data->stds[i].id) @@ -1100,7 +1098,7 @@ int saa7146_video_do_ioctl(struct inode *inode, struct file *file, unsigned int found = 1; } - mutex_unlock(&dev->lock); + up(&dev->lock); if (vv->ov_suspend != NULL) { saa7146_start_preview(vv->ov_suspend); @@ -1190,7 +1188,6 @@ int saa7146_video_do_ioctl(struct inode *inode, struct file *file, unsigned int } return err; } -#ifdef CONFIG_VIDEO_V4L1_COMPAT case VIDIOCGMBUF: { struct video_mbuf *mbuf = arg; @@ -1204,11 +1201,11 @@ int saa7146_video_do_ioctl(struct inode *inode, struct file *file, unsigned int DEB_D(("VIDIOCGMBUF \n")); q = &fh->video_q; - mutex_lock(&q->lock); + down(&q->lock); err = videobuf_mmap_setup(q,gbuffers,gbufsize, V4L2_MEMORY_MMAP); if (err < 0) { - mutex_unlock(&q->lock); + up(&q->lock); return err; } memset(mbuf,0,sizeof(*mbuf)); @@ -1216,10 +1213,9 @@ int saa7146_video_do_ioctl(struct inode *inode, struct file *file, unsigned int mbuf->size = gbuffers * gbufsize; for (i = 0; i < gbuffers; i++) mbuf->offsets[i] = i * gbufsize; - mutex_unlock(&q->lock); + up(&q->lock); return 0; } -#endif default: return v4l_compat_translate_ioctl(inode,file,cmd,arg, saa7146_video_do_ioctl); @@ -1279,7 +1275,7 @@ static int buffer_prepare(struct videobuf_queue *q, buf->vb.field != field || buf->vb.field != fh->video_fmt.field || buf->fmt != &fh->video_fmt) { - saa7146_dma_free(dev,q,buf); + saa7146_dma_free(dev,buf); } if (STATE_NEEDS_INIT == buf->vb.state) { @@ -1308,7 +1304,7 @@ static int buffer_prepare(struct videobuf_queue *q, saa7146_pgtable_alloc(dev->pci, &buf->pt[0]); } - err = videobuf_iolock(q,&buf->vb, &vv->ov_fb); + err = videobuf_iolock(dev->pci,&buf->vb, &vv->ov_fb); if (err) goto oops; err = saa7146_pgtable_build(dev,buf); @@ -1322,7 +1318,7 @@ static int buffer_prepare(struct videobuf_queue *q, oops: DEB_D(("error out.\n")); - saa7146_dma_free(dev,q,buf); + saa7146_dma_free(dev,buf); return err; } @@ -1367,7 +1363,7 @@ static void buffer_release(struct videobuf_queue *q, struct videobuf_buffer *vb) struct saa7146_buf *buf = (struct saa7146_buf *)vb; DEB_CAP(("vbuf:%p\n",vb)); - saa7146_dma_free(dev,q,buf); + saa7146_dma_free(dev,buf); } static struct videobuf_queue_ops video_qops = { @@ -1418,7 +1414,7 @@ static int video_open(struct saa7146_dev *dev, struct file *file) sizeof(struct saa7146_buf), file); - mutex_init(&fh->video_q.lock); + init_MUTEX(&fh->video_q.lock); return 0; } diff --git a/drivers/media/dvb/Kconfig b/drivers/media/dvb/Kconfig index a97c8f5e9..3f0ec6be0 100644 --- a/drivers/media/dvb/Kconfig +++ b/drivers/media/dvb/Kconfig @@ -22,26 +22,26 @@ config DVB source "drivers/media/dvb/dvb-core/Kconfig" comment "Supported SAA7146 based PCI Adapters" - depends on DVB_CORE && PCI && I2C + depends on DVB_CORE && PCI source "drivers/media/dvb/ttpci/Kconfig" comment "Supported USB Adapters" - depends on DVB_CORE && USB && I2C + depends on DVB_CORE && USB source "drivers/media/dvb/dvb-usb/Kconfig" source "drivers/media/dvb/ttusb-budget/Kconfig" source "drivers/media/dvb/ttusb-dec/Kconfig" source "drivers/media/dvb/cinergyT2/Kconfig" comment "Supported FlexCopII (B2C2) Adapters" - depends on DVB_CORE && (PCI || USB) && I2C + depends on DVB_CORE && (PCI || USB) source "drivers/media/dvb/b2c2/Kconfig" comment "Supported BT878 Adapters" - depends on DVB_CORE && PCI && I2C + depends on DVB_CORE && PCI source "drivers/media/dvb/bt8xx/Kconfig" comment "Supported Pluto2 Adapters" - depends on DVB_CORE && PCI && I2C + depends on DVB_CORE && PCI source "drivers/media/dvb/pluto2/Kconfig" comment "Supported DVB Frontends" diff --git a/drivers/media/dvb/b2c2/Kconfig b/drivers/media/dvb/b2c2/Kconfig index 49a06fc54..2963605c0 100644 --- a/drivers/media/dvb/b2c2/Kconfig +++ b/drivers/media/dvb/b2c2/Kconfig @@ -1,7 +1,6 @@ config DVB_B2C2_FLEXCOP tristate "Technisat/B2C2 FlexCopII(b) and FlexCopIII adapters" - depends on DVB_CORE && I2C - select DVB_PLL + depends on DVB_CORE select DVB_STV0299 select DVB_MT352 select DVB_MT312 @@ -17,7 +16,7 @@ config DVB_B2C2_FLEXCOP config DVB_B2C2_FLEXCOP_PCI tristate "Technisat/B2C2 Air/Sky/Cable2PC PCI" - depends on DVB_B2C2_FLEXCOP && PCI && I2C + depends on DVB_B2C2_FLEXCOP && PCI help Support for the Air/Sky/CableStar2 PCI card (DVB/ATSC) by Technisat/B2C2. @@ -25,7 +24,7 @@ config DVB_B2C2_FLEXCOP_PCI config DVB_B2C2_FLEXCOP_USB tristate "Technisat/B2C2 Air/Sky/Cable2PC USB" - depends on DVB_B2C2_FLEXCOP && USB && I2C + depends on DVB_B2C2_FLEXCOP && USB help Support for the Air/Sky/Cable2PC USB1.1 box (DVB/ATSC) by Technisat/B2C2, diff --git a/drivers/media/dvb/b2c2/flexcop-common.h b/drivers/media/dvb/b2c2/flexcop-common.h index 5a6c4fe24..7d7e1613c 100644 --- a/drivers/media/dvb/b2c2/flexcop-common.h +++ b/drivers/media/dvb/b2c2/flexcop-common.h @@ -8,8 +8,8 @@ #ifndef __FLEXCOP_COMMON_H__ #define __FLEXCOP_COMMON_H__ +#include #include -#include #include "flexcop-reg.h" @@ -73,7 +73,8 @@ struct flexcop_device { int (*fe_sleep) (struct dvb_frontend *); struct i2c_adapter i2c_adap; - struct mutex i2c_mutex; + struct semaphore i2c_sem; + struct module *owner; /* options and status */ diff --git a/drivers/media/dvb/b2c2/flexcop-fe-tuner.c b/drivers/media/dvb/b2c2/flexcop-fe-tuner.c index 68bb56e46..9c7f12282 100644 --- a/drivers/media/dvb/b2c2/flexcop-fe-tuner.c +++ b/drivers/media/dvb/b2c2/flexcop-fe-tuner.c @@ -14,7 +14,6 @@ #include "stv0297.h" #include "mt312.h" #include "lgdt330x.h" -#include "lg_h06xf.h" #include "dvb-pll.h" /* lnb control */ @@ -167,12 +166,11 @@ static int samsung_tbmu24112_set_symbol_rate(struct dvb_frontend* fe, u32 srate, return 0; } -static int samsung_tbmu24112_tuner_set_params(struct dvb_frontend* fe, struct dvb_frontend_parameters *params) +static int samsung_tbmu24112_pll_set(struct dvb_frontend* fe, struct i2c_adapter *i2c, struct dvb_frontend_parameters* params) { u8 buf[4]; u32 div; struct i2c_msg msg = { .addr = 0x61, .flags = 0, .buf = buf, .len = sizeof(buf) }; - struct flexcop_device *fc = fe->dvb->priv; div = params->frequency / 125; @@ -183,11 +181,8 @@ static int samsung_tbmu24112_tuner_set_params(struct dvb_frontend* fe, struct dv if (params->frequency < 1500000) buf[3] |= 0x10; - if (fe->ops.i2c_gate_ctrl) - fe->ops.i2c_gate_ctrl(fe, 1); - if (i2c_transfer(&fc->i2c_adap, &msg, 1) != 1) { + if (i2c_transfer(i2c, &msg, 1) != 1) return -EIO; - } return 0; } @@ -246,6 +241,7 @@ static struct stv0299_config samsung_tbmu24112_config = { .volt13_op0_op1 = STV0299_VOLT13_OP1, .min_delay_ms = 100, .set_symbol_rate = samsung_tbmu24112_set_symbol_rate, + .pll_set = samsung_tbmu24112_pll_set, }; /* dvb-t mt352 */ @@ -268,14 +264,11 @@ static int samsung_tdtc9251dh0_demod_init(struct dvb_frontend* fe) return 0; } -static int samsung_tdtc9251dh0_calc_regs(struct dvb_frontend* fe, struct dvb_frontend_parameters *params, u8* pllbuf, int buf_len) +static int samsung_tdtc9251dh0_pll_set(struct dvb_frontend* fe, struct dvb_frontend_parameters* params, u8* pllbuf) { u32 div; unsigned char bs = 0; - if (buf_len < 5) - return -EINVAL; - #define IF_FREQUENCYx6 217 /* 6 * 36.16666666667MHz */ div = (((params->frequency + 83333) * 3) / 500000) + IF_FREQUENCYx6; @@ -283,18 +276,19 @@ static int samsung_tdtc9251dh0_calc_regs(struct dvb_frontend* fe, struct dvb_fro if (params->frequency >= 161000000 && params->frequency <= 439000000) bs = 0x0a; if (params->frequency >= 447000000 && params->frequency <= 863000000) bs = 0x08; - pllbuf[0] = 0x61; + pllbuf[0] = 0xc2; /* Note: non-linux standard PLL i2c address */ pllbuf[1] = div >> 8; pllbuf[2] = div & 0xff; pllbuf[3] = 0xcc; pllbuf[4] = bs; - return 5; + return 0; } static struct mt352_config samsung_tdtc9251dh0_config = { .demod_address = 0x0f, .demod_init = samsung_tdtc9251dh0_demod_init, + .pll_set = samsung_tdtc9251dh0_pll_set, }; static int flexcop_fe_request_firmware(struct dvb_frontend* fe, const struct firmware **fw, char* name) @@ -303,21 +297,56 @@ static int flexcop_fe_request_firmware(struct dvb_frontend* fe, const struct fir return request_firmware(fw, name, fc->dev); } -static int lgdt3303_tuner_set_params(struct dvb_frontend* fe, struct dvb_frontend_parameters *params) +static int lgdt3303_pll_set(struct dvb_frontend* fe, + struct dvb_frontend_parameters* params) { struct flexcop_device *fc = fe->dvb->priv; - return lg_h06xf_pll_set(fe, &fc->i2c_adap, params); + u8 buf[4]; + struct i2c_msg msg = + { .addr = 0x61, .flags = 0, .buf = buf, .len = 4 }; + int err; + + dvb_pll_configure(&dvb_pll_tdvs_tua6034,buf, params->frequency, 0); + dprintk(1, "%s: tuner at 0x%02x bytes: 0x%02x 0x%02x 0x%02x 0x%02x\n", + __FUNCTION__, msg.addr, buf[0],buf[1],buf[2],buf[3]); + if ((err = i2c_transfer(&fc->i2c_adap, &msg, 1)) != 1) { + printk(KERN_WARNING "lgdt3303: %s error " + "(addr %02x <- %02x, err = %i)\n", + __FUNCTION__, buf[0], buf[1], err); + if (err < 0) + return err; + else + return -EREMOTEIO; + } + + buf[0] = 0x86 | 0x18; + buf[1] = 0x50; + msg.len = 2; + if ((err = i2c_transfer(&fc->i2c_adap, &msg, 1)) != 1) { + printk(KERN_WARNING "lgdt3303: %s error " + "(addr %02x <- %02x, err = %i)\n", + __FUNCTION__, buf[0], buf[1], err); + if (err < 0) + return err; + else + return -EREMOTEIO; + } + + return 0; } static struct lgdt330x_config air2pc_atsc_hd5000_config = { .demod_address = 0x59, .demod_chip = LGDT3303, .serial_mpeg = 0x04, + .pll_set = lgdt3303_pll_set, .clock_polarity_flip = 1, }; static struct nxt200x_config samsung_tbmv_config = { .demod_address = 0x0a, + .pll_address = 0xc2, + .pll_desc = &dvb_pll_samsung_tbmv, }; static struct bcm3510_config air2pc_atsc_first_gen_config = { @@ -325,7 +354,7 @@ static struct bcm3510_config air2pc_atsc_first_gen_config = { .request_firmware = flexcop_fe_request_firmware, }; -static int skystar23_samsung_tbdu18132_tuner_set_params(struct dvb_frontend* fe, struct dvb_frontend_parameters *params) +static int skystar23_samsung_tbdu18132_pll_set(struct dvb_frontend* fe, struct dvb_frontend_parameters* params) { u8 buf[4]; u32 div; @@ -342,8 +371,6 @@ static int skystar23_samsung_tbdu18132_tuner_set_params(struct dvb_frontend* fe, if (params->frequency < 1550000) buf[3] |= 0x02; - if (fe->ops.i2c_gate_ctrl) - fe->ops.i2c_gate_ctrl(fe, 1); if (i2c_transfer(&fc->i2c_adap, &msg, 1) != 1) return -EIO; return 0; @@ -352,52 +379,9 @@ static int skystar23_samsung_tbdu18132_tuner_set_params(struct dvb_frontend* fe, static struct mt312_config skystar23_samsung_tbdu18132_config = { .demod_address = 0x0e, + .pll_set = skystar23_samsung_tbdu18132_pll_set, }; -static int alps_tdee4_stv0297_tuner_set_params(struct dvb_frontend* fe, - struct dvb_frontend_parameters *fep) -{ - struct flexcop_device *fc = fe->dvb->priv; - u8 buf[4]; - u16 div; - int ret; - -/* 62.5 kHz * 10 */ -#define REF_FREQ 625 -#define FREQ_OFFSET 36125 - - div = ((fep->frequency/1000 + FREQ_OFFSET ) * 10) / REF_FREQ; // 4 MHz = 4000 KHz - - buf[0] = (u8)( div >> 8) & 0x7f; - buf[1] = (u8) div & 0xff; - -/* F(osc) = N * Reference Freq. (62.5 kHz) - * byte 2 : 0 N14 N13 N12 N11 N10 N9 N8 - * byte 3 : N7 N6 N5 N4 N3 N2 N1 N0 - * byte 4 : 1 * * AGD R3 R2 R1 R0 - * byte 5 : C1 * RE RTS BS4 BS3 BS2 BS1 - * AGD = 1, R3 R2 R1 R0 = 0 1 0 1 => byte 4 = 1**10101 = 0x95 */ - buf[2] = 0x95; - -// Range(MHz) C1 * RE RTS BS4 BS3 BS2 BS1 Byte 5 -// 47 - 153 0 * 0 0 0 0 0 1 0x01 -// 153 - 430 0 * 0 0 0 0 1 0 0x02 -// 430 - 822 0 * 0 0 1 0 0 0 0x08 -// 822 - 862 1 * 0 0 1 0 0 0 0x88 - - if (fep->frequency <= 153000000) buf[3] = 0x01; - else if (fep->frequency <= 430000000) buf[3] = 0x02; - else if (fep->frequency <= 822000000) buf[3] = 0x08; - else buf[3] = 0x88; - - if (fe->ops.i2c_gate_ctrl) - fe->ops.i2c_gate_ctrl(fe, 1); - deb_tuner("tuner buffer for %d Hz: %x %x %x %x\n",fep->frequency, buf[0],buf[1],buf[2],buf[3]); - ret = fc->i2c_request(fc,FC_WRITE,FC_I2C_PORT_TUNER,0x61,buf[0],&buf[1],3); - deb_tuner("tuner write returned: %d\n",ret); - - return 0; -} static u8 alps_tdee4_stv0297_inittab[] = { 0x80, 0x01, @@ -506,9 +490,7 @@ int flexcop_frontend_init(struct flexcop_device *fc) /* try the sky v2.6 (stv0299/Samsung tbmu24112(sl1935)) */ if ((fc->fe = stv0299_attach(&samsung_tbmu24112_config, &fc->i2c_adap)) != NULL) { - ops = &fc->fe->ops; - - ops->tuner_ops.set_params = samsung_tbmu24112_tuner_set_params; + ops = fc->fe->ops; ops->set_voltage = flexcop_set_voltage; @@ -521,19 +503,16 @@ int flexcop_frontend_init(struct flexcop_device *fc) /* try the air dvb-t (mt352/Samsung tdtc9251dh0(??)) */ if ((fc->fe = mt352_attach(&samsung_tdtc9251dh0_config, &fc->i2c_adap)) != NULL ) { fc->dev_type = FC_AIR_DVB; - fc->fe->ops.tuner_ops.calc_regs = samsung_tdtc9251dh0_calc_regs; info("found the mt352 at i2c address: 0x%02x",samsung_tdtc9251dh0_config.demod_address); } else /* try the air atsc 2nd generation (nxt2002) */ if ((fc->fe = nxt200x_attach(&samsung_tbmv_config, &fc->i2c_adap)) != NULL) { fc->dev_type = FC_AIR_ATSC2; - dvb_pll_attach(fc->fe, 0x61, NULL, &dvb_pll_samsung_tbmv); info("found the nxt2002 at i2c address: 0x%02x",samsung_tbmv_config.demod_address); } else /* try the air atsc 3nd generation (lgdt3303) */ if ((fc->fe = lgdt330x_attach(&air2pc_atsc_hd5000_config, &fc->i2c_adap)) != NULL) { fc->dev_type = FC_AIR_ATSC3; - fc->fe->ops.tuner_ops.set_params = lgdt3303_tuner_set_params; info("found the lgdt3303 at i2c address: 0x%02x",air2pc_atsc_hd5000_config.demod_address); } else /* try the air atsc 1nd generation (bcm3510)/panasonic ct10s */ @@ -544,14 +523,11 @@ int flexcop_frontend_init(struct flexcop_device *fc) /* try the cable dvb (stv0297) */ if ((fc->fe = stv0297_attach(&alps_tdee4_stv0297_config, &fc->i2c_adap)) != NULL) { fc->dev_type = FC_CABLE; - fc->fe->ops.tuner_ops.set_params = alps_tdee4_stv0297_tuner_set_params; info("found the stv0297 at i2c address: 0x%02x",alps_tdee4_stv0297_config.demod_address); } else /* try the sky v2.3 (vp310/Samsung tbdu18132(tsa5059)) */ if ((fc->fe = vp310_mt312_attach(&skystar23_samsung_tbdu18132_config, &fc->i2c_adap)) != NULL) { - ops = &fc->fe->ops; - - ops->tuner_ops.set_params = skystar23_samsung_tbdu18132_tuner_set_params; + ops = fc->fe->ops; ops->diseqc_send_master_cmd = flexcop_diseqc_send_master_cmd; ops->diseqc_send_burst = flexcop_diseqc_send_burst; @@ -571,7 +547,7 @@ int flexcop_frontend_init(struct flexcop_device *fc) } else { if (dvb_register_frontend(&fc->dvb_adapter, fc->fe)) { err("frontend registration failed!"); - ops = &fc->fe->ops; + ops = fc->fe->ops; if (ops->release != NULL) ops->release(fc->fe); fc->fe = NULL; diff --git a/drivers/media/dvb/b2c2/flexcop-i2c.c b/drivers/media/dvb/b2c2/flexcop-i2c.c index e0bd2d8f0..56495cb6c 100644 --- a/drivers/media/dvb/b2c2/flexcop-i2c.c +++ b/drivers/media/dvb/b2c2/flexcop-i2c.c @@ -135,7 +135,7 @@ static int flexcop_master_xfer(struct i2c_adapter *i2c_adap, struct i2c_msg msgs struct flexcop_device *fc = i2c_get_adapdata(i2c_adap); int i, ret = 0; - if (mutex_lock_interruptible(&fc->i2c_mutex)) + if (down_interruptible(&fc->i2c_sem)) return -ERESTARTSYS; /* reading */ @@ -161,7 +161,7 @@ static int flexcop_master_xfer(struct i2c_adapter *i2c_adap, struct i2c_msg msgs else ret = num; - mutex_unlock(&fc->i2c_mutex); + up(&fc->i2c_sem); return ret; } @@ -180,7 +180,7 @@ int flexcop_i2c_init(struct flexcop_device *fc) { int ret; - mutex_init(&fc->i2c_mutex); + sema_init(&fc->i2c_sem,1); memset(&fc->i2c_adap, 0, sizeof(struct i2c_adapter)); strncpy(fc->i2c_adap.name, "B2C2 FlexCop device",I2C_NAME_SIZE); diff --git a/drivers/media/dvb/b2c2/flexcop-pci.c b/drivers/media/dvb/b2c2/flexcop-pci.c index eb2e6432c..9bc40bdcc 100644 --- a/drivers/media/dvb/b2c2/flexcop-pci.c +++ b/drivers/media/dvb/b2c2/flexcop-pci.c @@ -242,16 +242,19 @@ static int flexcop_pci_dma_init(struct flexcop_pci *fc_pci) if ((ret = flexcop_dma_allocate(fc_pci->pdev,&fc_pci->dma[0],FC_DEFAULT_DMA1_BUFSIZE)) != 0) return ret; - if ((ret = flexcop_dma_allocate(fc_pci->pdev,&fc_pci->dma[1],FC_DEFAULT_DMA2_BUFSIZE)) != 0) { - flexcop_dma_free(&fc_pci->dma[0]); - return ret; - } + if ((ret = flexcop_dma_allocate(fc_pci->pdev,&fc_pci->dma[1],FC_DEFAULT_DMA2_BUFSIZE)) != 0) + goto dma1_free; flexcop_sram_set_dest(fc_pci->fc_dev,FC_SRAM_DEST_MEDIA | FC_SRAM_DEST_NET, FC_SRAM_DEST_TARGET_DMA1); flexcop_sram_set_dest(fc_pci->fc_dev,FC_SRAM_DEST_CAO | FC_SRAM_DEST_CAI, FC_SRAM_DEST_TARGET_DMA2); fc_pci->init_state |= FC_PCI_DMA_INIT; + goto success; +dma1_free: + flexcop_dma_free(&fc_pci->dma[0]); + +success: return ret; } @@ -294,13 +297,13 @@ static int flexcop_pci_init(struct flexcop_pci *fc_pci) pci_set_drvdata(fc_pci->pdev, fc_pci); if ((ret = request_irq(fc_pci->pdev->irq, flexcop_pci_isr, - IRQF_SHARED, DRIVER_NAME, fc_pci)) != 0) + SA_SHIRQ, DRIVER_NAME, fc_pci)) != 0) goto err_pci_iounmap; spin_lock_init(&fc_pci->irq_lock); fc_pci->init_state |= FC_PCI_INIT; - return ret; + goto success; err_pci_iounmap: pci_iounmap(fc_pci->pdev, fc_pci->io_mem); @@ -309,6 +312,8 @@ err_pci_release_regions: pci_release_regions(fc_pci->pdev); err_pci_disable_device: pci_disable_device(fc_pci->pdev); + +success: return ret; } @@ -373,14 +378,14 @@ static int flexcop_pci_probe(struct pci_dev *pdev, const struct pci_device_id *e INIT_WORK(&fc_pci->irq_check_work, flexcop_pci_irq_check_work, fc_pci); - return ret; - + goto success; err_fc_exit: flexcop_device_exit(fc); err_pci_exit: flexcop_pci_exit(fc_pci); err_kfree: flexcop_device_kfree(fc); +success: return ret; } diff --git a/drivers/media/dvb/b2c2/flexcop-usb.c b/drivers/media/dvb/b2c2/flexcop-usb.c index 515954f96..a6c91db40 100644 --- a/drivers/media/dvb/b2c2/flexcop-usb.c +++ b/drivers/media/dvb/b2c2/flexcop-usb.c @@ -433,10 +433,11 @@ static int flexcop_usb_transfer_init(struct flexcop_usb *fc_usb) flexcop_wan_set_speed(fc_usb->fc_dev,FC_WAN_SPEED_8MBITS); flexcop_sram_ctrl(fc_usb->fc_dev,1,1,1); - return 0; - + ret = 0; + goto success; urb_error: flexcop_usb_transfer_exit(fc_usb); +success: return ret; } @@ -514,14 +515,15 @@ static int flexcop_usb_probe(struct usb_interface *intf, goto err_fc_exit; info("%s successfully initialized and connected.",DRIVER_NAME); - return 0; - + ret = 0; + goto success; err_fc_exit: flexcop_device_exit(fc); err_usb_exit: flexcop_usb_exit(fc_usb); err_kfree: flexcop_device_kfree(fc); +success: return ret; } @@ -539,7 +541,6 @@ static struct usb_device_id flexcop_usb_table [] = { { USB_DEVICE(0x0af7, 0x0101) }, { } }; -MODULE_DEVICE_TABLE (usb, flexcop_usb_table); /* usb specific object needed to register this driver with the usb subsystem */ static struct usb_driver flexcop_usb_driver = { diff --git a/drivers/media/dvb/b2c2/flexcop.c b/drivers/media/dvb/b2c2/flexcop.c index 29ec41831..56ba52470 100644 --- a/drivers/media/dvb/b2c2/flexcop.c +++ b/drivers/media/dvb/b2c2/flexcop.c @@ -67,7 +67,7 @@ static int flexcop_dvb_stop_feed(struct dvb_demux_feed *dvbdmxfeed) static int flexcop_dvb_init(struct flexcop_device *fc) { int ret; - if ((ret = dvb_register_adapter(&fc->dvb_adapter,"FlexCop Digital TV device",fc->owner,fc->dev)) < 0) { + if ((ret = dvb_register_adapter(&fc->dvb_adapter,"FlexCop Digital TV device",fc->owner)) < 0) { err("error registering DVB adapter"); return ret; } @@ -116,7 +116,7 @@ static int flexcop_dvb_init(struct flexcop_device *fc) dvb_net_init(&fc->dvb_adapter, &fc->dvbnet, &fc->demux.dmx); fc->init_state |= FC_STATE_DVB_INIT; - return 0; + goto success; err_connect_frontend: fc->demux.dmx.remove_frontend(&fc->demux.dmx,&fc->mem_frontend); @@ -129,6 +129,9 @@ err_dmx_dev: err_dmx: dvb_unregister_adapter(&fc->dvb_adapter); return ret; + +success: + return 0; } static void flexcop_dvb_exit(struct flexcop_device *fc) @@ -276,10 +279,11 @@ int flexcop_device_initialize(struct flexcop_device *fc) flexcop_device_name(fc,"initialization of","complete"); - return 0; - + ret = 0; + goto success; error: flexcop_device_exit(fc); +success: return ret; } EXPORT_SYMBOL(flexcop_device_initialize); diff --git a/drivers/media/dvb/bt8xx/Kconfig b/drivers/media/dvb/bt8xx/Kconfig index 7d0ee1ab2..2337b4171 100644 --- a/drivers/media/dvb/bt8xx/Kconfig +++ b/drivers/media/dvb/bt8xx/Kconfig @@ -1,15 +1,12 @@ config DVB_BT8XX tristate "BT8xx based PCI cards" - depends on DVB_CORE && PCI && I2C && VIDEO_BT848 - select DVB_PLL + depends on DVB_CORE && PCI && VIDEO_BT848 select DVB_MT352 select DVB_SP887X select DVB_NXT6000 select DVB_CX24110 select DVB_OR51211 select DVB_LGDT330X - select DVB_ZL10353 - select FW_LOADER help Support for PCI cards based on the Bt8xx PCI bridge. Examples are the Nebula cards, the Pinnacle PCTV cards, the Twinhan DST cards, diff --git a/drivers/media/dvb/bt8xx/Makefile b/drivers/media/dvb/bt8xx/Makefile index 9d197efb4..d188e4c67 100644 --- a/drivers/media/dvb/bt8xx/Makefile +++ b/drivers/media/dvb/bt8xx/Makefile @@ -1,3 +1,3 @@ obj-$(CONFIG_DVB_BT8XX) += bt878.o dvb-bt8xx.o dst.o dst_ca.o -EXTRA_CFLAGS = -Idrivers/media/dvb/dvb-core/ -Idrivers/media/video/bt8xx -Idrivers/media/dvb/frontends +EXTRA_CFLAGS = -Idrivers/media/dvb/dvb-core/ -Idrivers/media/video -Idrivers/media/dvb/frontends diff --git a/drivers/media/dvb/bt8xx/bt878.c b/drivers/media/dvb/bt8xx/bt878.c index 755822ee6..356f447ee 100644 --- a/drivers/media/dvb/bt8xx/bt878.c +++ b/drivers/media/dvb/bt8xx/bt878.c @@ -63,6 +63,8 @@ MODULE_PARM_DESC(debug, "Turn on/off debugging, default is 0 (off)."); int bt878_num; struct bt878 bt878[BT878_MAX]; +EXPORT_SYMBOL(bt878_debug); +EXPORT_SYMBOL(bt878_verbose); EXPORT_SYMBOL(bt878_num); EXPORT_SYMBOL(bt878); @@ -342,7 +344,7 @@ bt878_device_control(struct bt878 *bt, unsigned int cmd, union dst_gpio_packet * int retval; retval = 0; - if (mutex_lock_interruptible(&bt->gpio_lock)) + if (down_interruptible (&bt->gpio_lock)) return -ERESTARTSYS; /* special gpio signal */ switch (cmd) { @@ -373,7 +375,7 @@ bt878_device_control(struct bt878 *bt, unsigned int cmd, union dst_gpio_packet * retval = -EINVAL; break; } - mutex_unlock(&bt->gpio_lock); + up(&bt->gpio_lock); return retval; } @@ -391,9 +393,7 @@ static struct cards card_list[] __devinitdata = { { 0x07711461, BTTV_BOARD_AVDVBT_771, "AVermedia AverTV DVB-T 771" }, { 0xdb1018ac, BTTV_BOARD_DVICO_DVBT_LITE, "DViCO FusionHDTV DVB-T Lite" }, { 0xd50018ac, BTTV_BOARD_DVICO_FUSIONHDTV_5_LITE, "DViCO FusionHDTV 5 Lite" }, - { 0x20007063, BTTV_BOARD_PC_HDTV, "pcHDTV HD-2000 TV" }, - { 0x00261822, BTTV_BOARD_TWINHAN_DST, "DNTV Live! Mini" }, - + { 0x20007063, BTTV_BOARD_PC_HDTV, "pcHDTV HD-2000 TV"}, { 0, -1, NULL } }; @@ -417,11 +417,6 @@ static int __devinit bt878_probe(struct pci_dev *dev, printk(KERN_INFO "bt878: Bt878 AUDIO function found (%d).\n", bt878_num); - if (bt878_num >= BT878_MAX) { - printk(KERN_ERR "bt878: Too many devices inserted\n"); - result = -ENOMEM; - goto fail0; - } if (pci_enable_device(dev)) return -EIO; @@ -488,7 +483,7 @@ static int __devinit bt878_probe(struct pci_dev *dev, btwrite(0, BT848_INT_MASK); result = request_irq(bt->irq, bt878_irq, - IRQF_SHARED | IRQF_DISABLED, "bt878", + SA_SHIRQ | SA_INTERRUPT, "bt878", (void *) bt); if (result == -EINVAL) { printk(KERN_ERR "bt878(%d): Bad irq number or handler\n", diff --git a/drivers/media/dvb/bt8xx/bt878.h b/drivers/media/dvb/bt8xx/bt878.h index f685bc129..9faf93770 100644 --- a/drivers/media/dvb/bt8xx/bt878.h +++ b/drivers/media/dvb/bt8xx/bt878.h @@ -25,8 +25,6 @@ #include #include #include -#include - #include "bt848.h" #include "bttv.h" @@ -110,7 +108,7 @@ struct cards { extern int bt878_num; struct bt878 { - struct mutex gpio_lock; + struct semaphore gpio_lock; unsigned int nr; unsigned int bttv_nr; struct i2c_adapter *adapter; diff --git a/drivers/media/dvb/bt8xx/dst.c b/drivers/media/dvb/bt8xx/dst.c index 06ac899a9..0310e3dd0 100644 --- a/drivers/media/dvb/bt8xx/dst.c +++ b/drivers/media/dvb/bt8xx/dst.c @@ -38,10 +38,6 @@ static unsigned int dst_addons; module_param(dst_addons, int, 0644); MODULE_PARM_DESC(dst_addons, "CA daughterboard, default is 0 (No addons)"); -static unsigned int dst_algo; -module_param(dst_algo, int, 0644); -MODULE_PARM_DESC(dst_algo, "tuning algo: default is 0=(SW), 1=(HW)"); - #define HAS_LOCK 1 #define ATTEMPT_TUNE 2 #define HAS_POWER 4 @@ -51,24 +47,20 @@ MODULE_PARM_DESC(dst_algo, "tuning algo: default is 0=(SW), 1=(HW)"); #define DST_INFO 2 #define DST_DEBUG 3 -#define dprintk(x, y, z, format, arg...) do { \ - if (z) { \ - if ((x > DST_ERROR) && (x > y)) \ - printk(KERN_ERR "dst(%d) %s: " format "\n", \ - state->bt->nr, __func__ , ##arg); \ - else if ((x > DST_NOTICE) && (x > y)) \ - printk(KERN_NOTICE "dst(%d) %s: " format "\n", \ - state->bt->nr, __func__ , ##arg); \ - else if ((x > DST_INFO) && (x > y)) \ - printk(KERN_INFO "dst(%d) %s: " format "\n", \ - state->bt->nr, __func__ , ##arg); \ - else if ((x > DST_DEBUG) && (x > y)) \ - printk(KERN_DEBUG "dst(%d) %s: " format "\n", \ - state->bt->nr, __func__ , ##arg); \ - } else { \ - if (x > y) \ - printk(format, ##arg); \ - } \ +#define dprintk(x, y, z, format, arg...) do { \ + if (z) { \ + if ((x > DST_ERROR) && (x > y)) \ + printk(KERN_ERR "%s: " format "\n", __FUNCTION__ , ##arg); \ + else if ((x > DST_NOTICE) && (x > y)) \ + printk(KERN_NOTICE "%s: " format "\n", __FUNCTION__ , ##arg); \ + else if ((x > DST_INFO) && (x > y)) \ + printk(KERN_INFO "%s: " format "\n", __FUNCTION__ , ##arg); \ + else if ((x > DST_DEBUG) && (x > y)) \ + printk(KERN_DEBUG "%s: " format "\n", __FUNCTION__ , ##arg); \ + } else { \ + if (x > y) \ + printk(format, ##arg); \ + } \ } while(0) @@ -118,7 +110,7 @@ int dst_gpio_inb(struct dst_state *state, u8 *result) *result = 0; if ((err = bt878_device_control(state->bt, DST_IG_READ, &rd_packet)) < 0) { - dprintk(verbose, DST_ERROR, 1, "dst_gpio_inb error (err == %i)", err); + dprintk(verbose, DST_ERROR, 1, "dst_gpio_inb error (err == %i)\n", err); return -EREMOTEIO; } *result = (u8) rd_packet.rd.value; @@ -371,17 +363,6 @@ static int dst_set_freq(struct dst_state *state, u32 freq) state->tx_tuna[2] = (freq >> 16) & 0xff; state->tx_tuna[3] = (freq >> 8) & 0xff; state->tx_tuna[4] = (u8) freq; - } else if (state->dst_type == DST_TYPE_IS_ATSC) { - freq = freq / 1000; - if (freq < 51000 || freq > 858000) - return -EINVAL; - state->tx_tuna[2] = (freq >> 16) & 0xff; - state->tx_tuna[3] = (freq >> 8) & 0xff; - state->tx_tuna[4] = (u8) freq; - state->tx_tuna[5] = 0x00; /* ATSC */ - state->tx_tuna[6] = 0x00; - if (state->dst_hw_cap & DST_TYPE_HAS_ANALOG) - state->tx_tuna[7] = 0x00; /* Digital */ } else return -EINVAL; @@ -393,7 +374,7 @@ static int dst_set_bandwidth(struct dst_state *state, fe_bandwidth_t bandwidth) state->bandwidth = bandwidth; if (state->dst_type != DST_TYPE_IS_TERR) - return -EOPNOTSUPP; + return 0; switch (bandwidth) { case BANDWIDTH_6_MHZ: @@ -462,49 +443,37 @@ static int dst_set_symbolrate(struct dst_state *state, u32 srate) state->symbol_rate = srate; if (state->dst_type == DST_TYPE_IS_TERR) { - return -EOPNOTSUPP; + return 0; } dprintk(verbose, DST_INFO, 1, "set symrate %u", srate); srate /= 1000; - if (state->dst_type == DST_TYPE_IS_SAT) { - if (state->type_flags & DST_TYPE_HAS_SYMDIV) { - sval = srate; - sval <<= 20; - do_div(sval, 88000); - symcalc = (u32) sval; - dprintk(verbose, DST_INFO, 1, "set symcalc %u", symcalc); - state->tx_tuna[5] = (u8) (symcalc >> 12); - state->tx_tuna[6] = (u8) (symcalc >> 4); - state->tx_tuna[7] = (u8) (symcalc << 4); - } else { - state->tx_tuna[5] = (u8) (srate >> 16) & 0x7f; - state->tx_tuna[6] = (u8) (srate >> 8); - state->tx_tuna[7] = (u8) srate; - } - state->tx_tuna[8] &= ~0x20; - if (state->type_flags & DST_TYPE_HAS_OBS_REGS) { - if (srate > 8000) - state->tx_tuna[8] |= 0x20; - } - } else if (state->dst_type == DST_TYPE_IS_CABLE) { - dprintk(verbose, DST_DEBUG, 1, "%s", state->fw_name); - if (!strncmp(state->fw_name, "DCTNEW", 6)) { - state->tx_tuna[5] = (u8) (srate >> 8); - state->tx_tuna[6] = (u8) srate; - state->tx_tuna[7] = 0x00; - } else if (!strncmp(state->fw_name, "DCT-CI", 6)) { - state->tx_tuna[5] = 0x00; - state->tx_tuna[6] = (u8) (srate >> 8); - state->tx_tuna[7] = (u8) srate; - } + if (state->type_flags & DST_TYPE_HAS_SYMDIV) { + sval = srate; + sval <<= 20; + do_div(sval, 88000); + symcalc = (u32) sval; + dprintk(verbose, DST_INFO, 1, "set symcalc %u", symcalc); + state->tx_tuna[5] = (u8) (symcalc >> 12); + state->tx_tuna[6] = (u8) (symcalc >> 4); + state->tx_tuna[7] = (u8) (symcalc << 4); + } else { + state->tx_tuna[5] = (u8) (srate >> 16) & 0x7f; + state->tx_tuna[6] = (u8) (srate >> 8); + state->tx_tuna[7] = (u8) srate; + } + state->tx_tuna[8] &= ~0x20; + if (state->type_flags & DST_TYPE_HAS_OBS_REGS) { + if (srate > 8000) + state->tx_tuna[8] |= 0x20; } return 0; } + static int dst_set_modulation(struct dst_state *state, fe_modulation_t modulation) { if (state->dst_type != DST_TYPE_IS_CABLE) - return -EOPNOTSUPP; + return 0; state->modulation = modulation; switch (modulation) { @@ -521,10 +490,7 @@ static int dst_set_modulation(struct dst_state *state, fe_modulation_t modulatio state->tx_tuna[8] = 0x80; break; case QAM_256: - if (!strncmp(state->fw_name, "DCTNEW", 6)) - state->tx_tuna[8] = 0xff; - else if (!strncmp(state->fw_name, "DCT-CI", 6)) - state->tx_tuna[8] = 0x00; + state->tx_tuna[8] = 0x00; break; case QPSK: case QAM_AUTO: @@ -557,19 +523,13 @@ u8 dst_check_sum(u8 *buf, u32 len) } EXPORT_SYMBOL(dst_check_sum); -static void dst_type_flags_print(struct dst_state *state) +static void dst_type_flags_print(u32 type_flags) { - u32 type_flags = state->type_flags; - dprintk(verbose, DST_ERROR, 0, "DST type flags :"); - if (type_flags & DST_TYPE_HAS_TS188) - dprintk(verbose, DST_ERROR, 0, " 0x%x newtuner", DST_TYPE_HAS_TS188); - if (type_flags & DST_TYPE_HAS_NEWTUNE_2) - dprintk(verbose, DST_ERROR, 0, " 0x%x newtuner 2", DST_TYPE_HAS_NEWTUNE_2); + if (type_flags & DST_TYPE_HAS_NEWTUNE) + dprintk(verbose, DST_ERROR, 0, " 0x%x newtuner", DST_TYPE_HAS_NEWTUNE); if (type_flags & DST_TYPE_HAS_TS204) dprintk(verbose, DST_ERROR, 0, " 0x%x ts204", DST_TYPE_HAS_TS204); - if (type_flags & DST_TYPE_HAS_VLF) - dprintk(verbose, DST_ERROR, 0, " 0x%x VLF", DST_TYPE_HAS_VLF); if (type_flags & DST_TYPE_HAS_SYMDIV) dprintk(verbose, DST_ERROR, 0, " 0x%x symdiv", DST_TYPE_HAS_SYMDIV); if (type_flags & DST_TYPE_HAS_FW_1) @@ -582,7 +542,7 @@ static void dst_type_flags_print(struct dst_state *state) } -static int dst_type_print(struct dst_state *state, u8 type) +static int dst_type_print(u8 type) { char *otype; switch (type) { @@ -598,10 +558,6 @@ static int dst_type_print(struct dst_state *state, u8 type) otype = "cable"; break; - case DST_TYPE_IS_ATSC: - otype = "atsc"; - break; - default: dprintk(verbose, DST_INFO, 1, "invalid dst type %d", type); return -EINVAL; @@ -611,127 +567,6 @@ static int dst_type_print(struct dst_state *state, u8 type) return 0; } -struct tuner_types tuner_list[] = { - { - .tuner_type = TUNER_TYPE_L64724, - .tuner_name = "L 64724", - .board_name = "UNKNOWN", - .fw_name = "UNKNOWN" - }, - - { - .tuner_type = TUNER_TYPE_STV0299, - .tuner_name = "STV 0299", - .board_name = "VP1020", - .fw_name = "DST-MOT" - }, - - { - .tuner_type = TUNER_TYPE_STV0299, - .tuner_name = "STV 0299", - .board_name = "VP1020", - .fw_name = "DST-03T" - }, - - { - .tuner_type = TUNER_TYPE_MB86A15, - .tuner_name = "MB 86A15", - .board_name = "VP1022", - .fw_name = "DST-03T" - }, - - { - .tuner_type = TUNER_TYPE_MB86A15, - .tuner_name = "MB 86A15", - .board_name = "VP1025", - .fw_name = "DST-03T" - }, - - { - .tuner_type = TUNER_TYPE_STV0299, - .tuner_name = "STV 0299", - .board_name = "VP1030", - .fw_name = "DST-CI" - }, - - { - .tuner_type = TUNER_TYPE_STV0299, - .tuner_name = "STV 0299", - .board_name = "VP1030", - .fw_name = "DSTMCI" - }, - - { - .tuner_type = TUNER_TYPE_UNKNOWN, - .tuner_name = "UNKNOWN", - .board_name = "VP2021", - .fw_name = "DCTNEW" - }, - - { - .tuner_type = TUNER_TYPE_UNKNOWN, - .tuner_name = "UNKNOWN", - .board_name = "VP2030", - .fw_name = "DCT-CI" - }, - - { - .tuner_type = TUNER_TYPE_UNKNOWN, - .tuner_name = "UNKNOWN", - .board_name = "VP2031", - .fw_name = "DCT-CI" - }, - - { - .tuner_type = TUNER_TYPE_UNKNOWN, - .tuner_name = "UNKNOWN", - .board_name = "VP2040", - .fw_name = "DCT-CI" - }, - - { - .tuner_type = TUNER_TYPE_UNKNOWN, - .tuner_name = "UNKNOWN", - .board_name = "VP3020", - .fw_name = "DTTFTA" - }, - - { - .tuner_type = TUNER_TYPE_UNKNOWN, - .tuner_name = "UNKNOWN", - .board_name = "VP3021", - .fw_name = "DTTFTA" - }, - - { - .tuner_type = TUNER_TYPE_TDA10046, - .tuner_name = "TDA10046", - .board_name = "VP3040", - .fw_name = "DTT-CI" - }, - - { - .tuner_type = TUNER_TYPE_UNKNOWN, - .tuner_name = "UNKNOWN", - .board_name = "VP3051", - .fw_name = "DTTNXT" - }, - - { - .tuner_type = TUNER_TYPE_NXT200x, - .tuner_name = "NXT200x", - .board_name = "VP3220", - .fw_name = "ATSCDI" - }, - - { - .tuner_type = TUNER_TYPE_NXT200x, - .tuner_name = "NXT200x", - .board_name = "VP3250", - .fw_name = "ATSCAD" - }, -}; - /* Known cards list Satellite @@ -773,8 +608,7 @@ static struct dst_types dst_tlist[] = { .offset = 0, .dst_type = DST_TYPE_IS_SAT, .type_flags = DST_TYPE_HAS_SYMDIV | DST_TYPE_HAS_FW_1 | DST_TYPE_HAS_OBS_REGS, - .dst_feature = 0, - .tuner_type = 0 + .dst_feature = 0 }, /* obsolete */ { @@ -782,17 +616,15 @@ static struct dst_types dst_tlist[] = { .offset = 0, .dst_type = DST_TYPE_IS_SAT, .type_flags = DST_TYPE_HAS_SYMDIV | DST_TYPE_HAS_FW_1, - .dst_feature = 0, - .tuner_type = 0 + .dst_feature = 0 }, /* obsolete */ { .device_id = "DST-030", .offset = 0, .dst_type = DST_TYPE_IS_SAT, - .type_flags = DST_TYPE_HAS_TS204 | DST_TYPE_HAS_TS188 | DST_TYPE_HAS_FW_1, - .dst_feature = 0, - .tuner_type = 0 + .type_flags = DST_TYPE_HAS_TS204 | DST_TYPE_HAS_NEWTUNE | DST_TYPE_HAS_FW_1, + .dst_feature = 0 }, /* obsolete */ { @@ -801,8 +633,7 @@ static struct dst_types dst_tlist[] = { .dst_type = DST_TYPE_IS_SAT, .type_flags = DST_TYPE_HAS_SYMDIV | DST_TYPE_HAS_TS204 | DST_TYPE_HAS_FW_2, .dst_feature = DST_TYPE_HAS_DISEQC3 | DST_TYPE_HAS_DISEQC4 | DST_TYPE_HAS_DISEQC5 - | DST_TYPE_HAS_MAC | DST_TYPE_HAS_MOTO, - .tuner_type = TUNER_TYPE_MULTI + | DST_TYPE_HAS_MAC | DST_TYPE_HAS_MOTO }, { @@ -810,63 +641,57 @@ static struct dst_types dst_tlist[] = { .offset = 0, .dst_type = DST_TYPE_IS_SAT, .type_flags = DST_TYPE_HAS_SYMDIV | DST_TYPE_HAS_FW_1, - .dst_feature = 0, - .tuner_type = 0 + .dst_feature = 0 }, /* obsolete */ { .device_id = "DST-CI", .offset = 1, .dst_type = DST_TYPE_IS_SAT, - .type_flags = DST_TYPE_HAS_TS204 | DST_TYPE_HAS_FW_1, - .dst_feature = DST_TYPE_HAS_CA, - .tuner_type = 0 + .type_flags = DST_TYPE_HAS_TS204 | DST_TYPE_HAS_NEWTUNE | DST_TYPE_HAS_FW_1, + .dst_feature = DST_TYPE_HAS_CA }, /* An OEM board */ { .device_id = "DSTMCI", .offset = 1, .dst_type = DST_TYPE_IS_SAT, - .type_flags = DST_TYPE_HAS_TS188 | DST_TYPE_HAS_FW_2 | DST_TYPE_HAS_FW_BUILD | DST_TYPE_HAS_INC_COUNT | DST_TYPE_HAS_VLF, + .type_flags = DST_TYPE_HAS_NEWTUNE | DST_TYPE_HAS_FW_2 | DST_TYPE_HAS_FW_BUILD | DST_TYPE_HAS_INC_COUNT, .dst_feature = DST_TYPE_HAS_CA | DST_TYPE_HAS_DISEQC3 | DST_TYPE_HAS_DISEQC4 - | DST_TYPE_HAS_MOTO | DST_TYPE_HAS_MAC, - .tuner_type = TUNER_TYPE_MULTI + | DST_TYPE_HAS_MOTO | DST_TYPE_HAS_MAC }, { .device_id = "DSTFCI", .offset = 1, .dst_type = DST_TYPE_IS_SAT, - .type_flags = DST_TYPE_HAS_TS188 | DST_TYPE_HAS_FW_1, - .dst_feature = 0, - .tuner_type = 0 + .type_flags = DST_TYPE_HAS_NEWTUNE | DST_TYPE_HAS_FW_1, + .dst_feature = 0 }, /* unknown to vendor */ { .device_id = "DCT-CI", .offset = 1, .dst_type = DST_TYPE_IS_CABLE, - .type_flags = DST_TYPE_HAS_MULTI_FE | DST_TYPE_HAS_FW_1 | DST_TYPE_HAS_FW_2 | DST_TYPE_HAS_VLF, - .dst_feature = DST_TYPE_HAS_CA, - .tuner_type = 0 + .type_flags = DST_TYPE_HAS_TS204 | DST_TYPE_HAS_NEWTUNE | DST_TYPE_HAS_FW_1 + | DST_TYPE_HAS_FW_2, + .dst_feature = DST_TYPE_HAS_CA }, { .device_id = "DCTNEW", .offset = 1, .dst_type = DST_TYPE_IS_CABLE, - .type_flags = DST_TYPE_HAS_TS188 | DST_TYPE_HAS_FW_3 | DST_TYPE_HAS_FW_BUILD | DST_TYPE_HAS_MULTI_FE, - .dst_feature = 0, - .tuner_type = 0 + .type_flags = DST_TYPE_HAS_NEWTUNE | DST_TYPE_HAS_FW_3 | DST_TYPE_HAS_FW_BUILD, + .dst_feature = 0 }, { .device_id = "DTT-CI", .offset = 1, .dst_type = DST_TYPE_IS_TERR, - .type_flags = DST_TYPE_HAS_FW_2 | DST_TYPE_HAS_MULTI_FE | DST_TYPE_HAS_VLF, - .dst_feature = DST_TYPE_HAS_CA, - .tuner_type = 0 + .type_flags = DST_TYPE_HAS_TS204 | DST_TYPE_HAS_NEWTUNE | DST_TYPE_HAS_FW_2 | DST_TYPE_HAS_MULTI_FE, + .dst_feature = DST_TYPE_HAS_CA }, { @@ -874,8 +699,7 @@ static struct dst_types dst_tlist[] = { .offset = 1, .dst_type = DST_TYPE_IS_TERR, .type_flags = DST_TYPE_HAS_FW_2, - .dst_feature = 0, - .tuner_type = 0 + .dst_feature = 0 }, { @@ -883,8 +707,7 @@ static struct dst_types dst_tlist[] = { .offset = 1, .dst_type = DST_TYPE_IS_TERR, .type_flags = DST_TYPE_HAS_FW_2, - .dst_feature = DST_TYPE_HAS_ANALOG, - .tuner_type = 0 + .dst_feature = DST_TYPE_HAS_ANALOG }, { @@ -892,17 +715,15 @@ static struct dst_types dst_tlist[] = { .offset = 1, .dst_type = DST_TYPE_IS_ATSC, .type_flags = DST_TYPE_HAS_FW_2, - .dst_feature = 0, - .tuner_type = 0 + .dst_feature = 0 }, { .device_id = "ATSCAD", .offset = 1, .dst_type = DST_TYPE_IS_ATSC, - .type_flags = DST_TYPE_HAS_MULTI_FE | DST_TYPE_HAS_FW_2 | DST_TYPE_HAS_FW_BUILD, - .dst_feature = DST_TYPE_HAS_MAC | DST_TYPE_HAS_ANALOG, - .tuner_type = 0 + .type_flags = DST_TYPE_HAS_FW_2, + .dst_feature = 0 }, { } @@ -947,9 +768,6 @@ static int dst_fw_ver(struct dst_state *state) static int dst_card_type(struct dst_state *state) { - int j; - struct tuner_types *p_tuner_list = NULL; - u8 get_type[] = { 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; get_type[7] = dst_check_sum(get_type, 7); if (dst_command(state, get_type, 8) < 0) { @@ -957,17 +775,9 @@ static int dst_card_type(struct dst_state *state) return -1; } memset(&state->card_info, '\0', 8); - memcpy(&state->card_info, &state->rxbuffer, 7); + memcpy(&state->card_info, &state->rxbuffer, 8); dprintk(verbose, DST_ERROR, 1, "Device Model=[%s]", &state->card_info[0]); - for (j = 0, p_tuner_list = tuner_list; j < ARRAY_SIZE(tuner_list); j++, p_tuner_list++) { - if (!strcmp(&state->card_info[0], p_tuner_list->board_name)) { - state->tuner_type = p_tuner_list->tuner_type; - dprintk(verbose, DST_ERROR, 1, "DST has [%s] tuner, tuner type=[%d]", - p_tuner_list->tuner_name, p_tuner_list->tuner_type); - } - } - return 0; } @@ -980,64 +790,12 @@ static int dst_get_vendor(struct dst_state *state) return -1; } memset(&state->vendor, '\0', 8); - memcpy(&state->vendor, &state->rxbuffer, 7); + memcpy(&state->vendor, &state->rxbuffer, 8); dprintk(verbose, DST_ERROR, 1, "Vendor=[%s]", &state->vendor[0]); return 0; } -static void debug_dst_buffer(struct dst_state *state) -{ - int i; - - if (verbose > 2) { - printk("%s: [", __func__); - for (i = 0; i < 8; i++) - printk(" %02x", state->rxbuffer[i]); - printk("]\n"); - } -} - -static int dst_check_stv0299(struct dst_state *state) -{ - u8 check_stv0299[] = { 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; - - check_stv0299[7] = dst_check_sum(check_stv0299, 7); - if (dst_command(state, check_stv0299, 8) < 0) { - dprintk(verbose, DST_ERROR, 1, "Cmd=[0x04] failed"); - return -1; - } - debug_dst_buffer(state); - - if (memcmp(&check_stv0299, &state->rxbuffer, 8)) { - dprintk(verbose, DST_ERROR, 1, "Found a STV0299 NIM"); - state->tuner_type = TUNER_TYPE_STV0299; - return 0; - } - - return -1; -} - -static int dst_check_mb86a15(struct dst_state *state) -{ - u8 check_mb86a15[] = { 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; - - check_mb86a15[7] = dst_check_sum(check_mb86a15, 7); - if (dst_command(state, check_mb86a15, 8) < 0) { - dprintk(verbose, DST_ERROR, 1, "Cmd=[0x10], failed"); - return -1; - } - debug_dst_buffer(state); - - if (memcmp(&check_mb86a15, &state->rxbuffer, 8) < 0) { - dprintk(verbose, DST_ERROR, 1, "Found a MB86A15 NIM"); - state->tuner_type = TUNER_TYPE_MB86A15; - return 0; - } - - return -1; -} - static int dst_get_tuner_info(struct dst_state *state) { u8 get_tuner_1[] = { 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; @@ -1045,59 +803,60 @@ static int dst_get_tuner_info(struct dst_state *state) get_tuner_1[7] = dst_check_sum(get_tuner_1, 7); get_tuner_2[7] = dst_check_sum(get_tuner_2, 7); - dprintk(verbose, DST_ERROR, 1, "DST TYpe = MULTI FE"); if (state->type_flags & DST_TYPE_HAS_MULTI_FE) { - if (dst_command(state, get_tuner_1, 8) < 0) { - dprintk(verbose, DST_INFO, 1, "Cmd=[0x13], Unsupported"); - goto force; + if (dst_command(state, get_tuner_2, 8) < 0) { + dprintk(verbose, DST_INFO, 1, "Unsupported Command"); + return -1; } } else { - if (dst_command(state, get_tuner_2, 8) < 0) { - dprintk(verbose, DST_INFO, 1, "Cmd=[0xb], Unsupported"); - goto force; + if (dst_command(state, get_tuner_1, 8) < 0) { + dprintk(verbose, DST_INFO, 1, "Unsupported Command"); + return -1; } } memset(&state->board_info, '\0', 8); memcpy(&state->board_info, &state->rxbuffer, 8); if (state->type_flags & DST_TYPE_HAS_MULTI_FE) { - dprintk(verbose, DST_ERROR, 1, "DST type has TS=188"); - } - if (state->board_info[0] == 0xbc) { - if (state->type_flags != DST_TYPE_IS_ATSC) - state->type_flags |= DST_TYPE_HAS_TS188; - else - state->type_flags |= DST_TYPE_HAS_NEWTUNE_2; - - if (state->board_info[1] == 0x01) { - state->dst_hw_cap |= DST_TYPE_HAS_DBOARD; - dprintk(verbose, DST_ERROR, 1, "DST has Daughterboard"); + if (state->board_info[1] == 0x0b) { + if (state->type_flags & DST_TYPE_HAS_TS204) + state->type_flags &= ~DST_TYPE_HAS_TS204; + state->type_flags |= DST_TYPE_HAS_NEWTUNE; + dprintk(verbose, DST_INFO, 1, "DST type has TS=188"); + } else { + if (state->type_flags & DST_TYPE_HAS_NEWTUNE) + state->type_flags &= ~DST_TYPE_HAS_NEWTUNE; + state->type_flags |= DST_TYPE_HAS_TS204; + dprintk(verbose, DST_INFO, 1, "DST type has TS=204"); + } + } else { + if (state->board_info[0] == 0xbc) { + if (state->type_flags & DST_TYPE_HAS_TS204) + state->type_flags &= ~DST_TYPE_HAS_TS204; + state->type_flags |= DST_TYPE_HAS_NEWTUNE; + dprintk(verbose, DST_INFO, 1, "DST type has TS=188, Daughterboard=[%d]", state->board_info[1]); + + } else if (state->board_info[0] == 0xcc) { + if (state->type_flags & DST_TYPE_HAS_NEWTUNE) + state->type_flags &= ~DST_TYPE_HAS_NEWTUNE; + state->type_flags |= DST_TYPE_HAS_TS204; + dprintk(verbose, DST_INFO, 1, "DST type has TS=204 Daughterboard=[%d]", state->board_info[1]); } } return 0; -force: - if (!strncmp(state->fw_name, "DCT-CI", 6)) { - state->type_flags |= DST_TYPE_HAS_TS204; - dprintk(verbose, DST_ERROR, 1, "Forcing [%s] to TS188", state->fw_name); - } - - return -1; } static int dst_get_device_id(struct dst_state *state) { u8 reply; - int i, j; - struct dst_types *p_dst_type = NULL; - struct tuner_types *p_tuner_list = NULL; - + int i; + struct dst_types *p_dst_type; u8 use_dst_type = 0; u32 use_type_flags = 0; static u8 device_type[8] = {0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff}; - state->tuner_type = 0; device_type[7] = dst_check_sum(device_type, 7); if (write_dst(state, device_type, FIXED_COMM)) @@ -1129,34 +888,8 @@ static int dst_get_device_id(struct dst_state *state) /* Card capabilities */ state->dst_hw_cap = p_dst_type->dst_feature; - dprintk(verbose, DST_ERROR, 1, "Recognise [%s]", p_dst_type->device_id); - strncpy(&state->fw_name[0], p_dst_type->device_id, 6); - /* Multiple tuners */ - if (p_dst_type->tuner_type & TUNER_TYPE_MULTI) { - switch (use_dst_type) { - case DST_TYPE_IS_SAT: - /* STV0299 check */ - if (dst_check_stv0299(state) < 0) { - dprintk(verbose, DST_ERROR, 1, "Unsupported"); - state->tuner_type = TUNER_TYPE_MB86A15; - } - break; - default: - break; - } - if (dst_check_mb86a15(state) < 0) - dprintk(verbose, DST_ERROR, 1, "Unsupported"); - /* Single tuner */ - } else { - state->tuner_type = p_dst_type->tuner_type; - } - for (j = 0, p_tuner_list = tuner_list; j < ARRAY_SIZE(tuner_list); j++, p_tuner_list++) { - if (!(strncmp(p_dst_type->device_id, p_tuner_list->fw_name, 7)) && - p_tuner_list->tuner_type == state->tuner_type) { - dprintk(verbose, DST_ERROR, 1, "[%s] has a [%s]", - p_dst_type->device_id, p_tuner_list->tuner_name); - } - } + dprintk(verbose, DST_ERROR, 1, "Recognise [%s]\n", p_dst_type->device_id); + break; } } @@ -1167,26 +900,26 @@ static int dst_get_device_id(struct dst_state *state) use_dst_type = DST_TYPE_IS_SAT; use_type_flags = DST_TYPE_HAS_SYMDIV; } - dst_type_print(state, use_dst_type); + dst_type_print(use_dst_type); state->type_flags = use_type_flags; state->dst_type = use_dst_type; - dst_type_flags_print(state); + dst_type_flags_print(state->type_flags); return 0; } static int dst_probe(struct dst_state *state) { - mutex_init(&state->dst_mutex); - if (dst_addons & DST_TYPE_HAS_CA) { - if ((rdc_8820_reset(state)) < 0) { - dprintk(verbose, DST_ERROR, 1, "RDC 8820 RESET Failed."); - return -1; - } + sema_init(&state->dst_mutex, 1); + if ((rdc_8820_reset(state)) < 0) { + dprintk(verbose, DST_ERROR, 1, "RDC 8820 RESET Failed."); + return -1; + } + if (dst_addons & DST_TYPE_HAS_CA) msleep(4000); - } else { + else msleep(100); - } + if ((dst_comm_init(state)) < 0) { dprintk(verbose, DST_ERROR, 1, "DST Initialization Failed."); return -1; @@ -1198,6 +931,7 @@ static int dst_probe(struct dst_state *state) } if (dst_get_mac(state) < 0) { dprintk(verbose, DST_INFO, 1, "MAC: Unsupported command"); + return 0; } if ((state->type_flags & DST_TYPE_HAS_MULTI_FE) || (state->type_flags & DST_TYPE_HAS_FW_BUILD)) { if (dst_get_tuner_info(state) < 0) @@ -1228,13 +962,13 @@ int dst_command(struct dst_state *state, u8 *data, u8 len) { u8 reply; - mutex_lock(&state->dst_mutex); + down(&state->dst_mutex); if ((dst_comm_init(state)) < 0) { dprintk(verbose, DST_NOTICE, 1, "DST Communication Initialization Failed."); goto error; } if (write_dst(state, data, len)) { - dprintk(verbose, DST_INFO, 1, "Trying to recover.. "); + dprintk(verbose, DST_INFO, 1, "Tring to recover.. "); if ((dst_error_recovery(state)) < 0) { dprintk(verbose, DST_ERROR, 1, "Recovery Failed."); goto error; @@ -1279,11 +1013,11 @@ int dst_command(struct dst_state *state, u8 *data, u8 len) dprintk(verbose, DST_INFO, 1, "checksum failure"); goto error; } - mutex_unlock(&state->dst_mutex); + up(&state->dst_mutex); return 0; error: - mutex_unlock(&state->dst_mutex); + up(&state->dst_mutex); return -EIO; } @@ -1314,10 +1048,6 @@ static int dst_get_signal(struct dst_state *state) state->decode_lock = (state->rxbuffer[1]) ? 1 : 0; state->decode_strength = state->rxbuffer[4] << 8; state->decode_snr = state->rxbuffer[3] << 8; - } else if (state->dst_type == DST_TYPE_IS_ATSC) { - state->decode_lock = (state->rxbuffer[6] == 0x00) ? 1 : 0; - state->decode_strength = state->rxbuffer[4] << 8; - state->decode_snr = state->rxbuffer[2] << 8 | state->rxbuffer[3]; } state->cur_jiff = jiffies; } @@ -1328,13 +1058,15 @@ static int dst_tone_power_cmd(struct dst_state *state) { u8 paket[8] = { 0x00, 0x09, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00 }; - if (state->dst_type != DST_TYPE_IS_SAT) - return -EOPNOTSUPP; + if (state->dst_type == DST_TYPE_IS_TERR) + return 0; paket[4] = state->tx_tuna[4]; paket[2] = state->tx_tuna[2]; paket[3] = state->tx_tuna[3]; paket[7] = dst_check_sum (paket, 7); - return dst_command(state, paket, 8); + dst_command(state, paket, 8); + + return 0; } static int dst_get_tuna(struct dst_state *state) @@ -1346,9 +1078,8 @@ static int dst_get_tuna(struct dst_state *state) state->diseq_flags &= ~(HAS_LOCK); if (!dst_wait_dst_ready(state, NO_DELAY)) return -EIO; - if ((state->type_flags & DST_TYPE_HAS_VLF) && - !(state->dst_type == DST_TYPE_IS_ATSC)) - + if (state->type_flags & DST_TYPE_HAS_NEWTUNE) + /* how to get variable length reply ???? */ retval = read_dst(state, state->rx_tuna, 10); else retval = read_dst(state, &state->rx_tuna[2], FIXED_COMM); @@ -1356,10 +1087,7 @@ static int dst_get_tuna(struct dst_state *state) dprintk(verbose, DST_DEBUG, 1, "read not successful"); return retval; } - if ((state->type_flags & DST_TYPE_HAS_VLF) && - !(state->dst_type == DST_TYPE_IS_CABLE) && - !(state->dst_type == DST_TYPE_IS_ATSC)) { - + if (state->type_flags & DST_TYPE_HAS_NEWTUNE) { if (state->rx_tuna[9] != dst_check_sum(&state->rx_tuna[0], 9)) { dprintk(verbose, DST_INFO, 1, "checksum failure ? "); return -EIO; @@ -1400,15 +1128,12 @@ static int dst_write_tuna(struct dvb_frontend *fe) dst_set_voltage(fe, SEC_VOLTAGE_13); } state->diseq_flags &= ~(HAS_LOCK | ATTEMPT_TUNE); - mutex_lock(&state->dst_mutex); + down(&state->dst_mutex); if ((dst_comm_init(state)) < 0) { dprintk(verbose, DST_DEBUG, 1, "DST Communication initialization failed."); goto error; } -// if (state->type_flags & DST_TYPE_HAS_NEWTUNE) { - if ((state->type_flags & DST_TYPE_HAS_VLF) && - (!(state->dst_type == DST_TYPE_IS_ATSC))) { - + if (state->type_flags & DST_TYPE_HAS_NEWTUNE) { state->tx_tuna[9] = dst_check_sum(&state->tx_tuna[0], 9); retval = write_dst(state, &state->tx_tuna[0], 10); } else { @@ -1435,11 +1160,11 @@ static int dst_write_tuna(struct dvb_frontend *fe) state->diseq_flags |= ATTEMPT_TUNE; retval = dst_get_tuna(state); werr: - mutex_unlock(&state->dst_mutex); + up(&state->dst_mutex); return retval; error: - mutex_unlock(&state->dst_mutex); + up(&state->dst_mutex); return -EIO; } @@ -1463,25 +1188,23 @@ static int dst_set_diseqc(struct dvb_frontend *fe, struct dvb_diseqc_master_cmd u8 paket[8] = { 0x00, 0x08, 0x04, 0xe0, 0x10, 0x38, 0xf0, 0xec }; if (state->dst_type != DST_TYPE_IS_SAT) - return -EOPNOTSUPP; - if (cmd->msg_len > 0 && cmd->msg_len < 5) - memcpy(&paket[3], cmd->msg, cmd->msg_len); - else if (cmd->msg_len == 5 && state->dst_hw_cap & DST_TYPE_HAS_DISEQC5) - memcpy(&paket[2], cmd->msg, cmd->msg_len); - else + return 0; + if (cmd->msg_len == 0 || cmd->msg_len > 4) return -EINVAL; + memcpy(&paket[3], cmd->msg, cmd->msg_len); paket[7] = dst_check_sum(&paket[0], 7); - return dst_command(state, paket, 8); + dst_command(state, paket, 8); + return 0; } static int dst_set_voltage(struct dvb_frontend *fe, fe_sec_voltage_t voltage) { - int need_cmd, retval = 0; + int need_cmd; struct dst_state *state = fe->demodulator_priv; state->voltage = voltage; if (state->dst_type != DST_TYPE_IS_SAT) - return -EOPNOTSUPP; + return 0; need_cmd = 0; @@ -1503,9 +1226,9 @@ static int dst_set_voltage(struct dvb_frontend *fe, fe_sec_voltage_t voltage) } if (need_cmd) - retval = dst_tone_power_cmd(state); + dst_tone_power_cmd(state); - return retval; + return 0; } static int dst_set_tone(struct dvb_frontend *fe, fe_sec_tone_mode_t tone) @@ -1514,7 +1237,7 @@ static int dst_set_tone(struct dvb_frontend *fe, fe_sec_tone_mode_t tone) state->tone = tone; if (state->dst_type != DST_TYPE_IS_SAT) - return -EOPNOTSUPP; + return 0; switch (tone) { case SEC_TONE_OFF: @@ -1530,7 +1253,9 @@ static int dst_set_tone(struct dvb_frontend *fe, fe_sec_tone_mode_t tone) default: return -EINVAL; } - return dst_tone_power_cmd(state); + dst_tone_power_cmd(state); + + return 0; } static int dst_send_burst(struct dvb_frontend *fe, fe_sec_mini_cmd_t minicmd) @@ -1538,7 +1263,7 @@ static int dst_send_burst(struct dvb_frontend *fe, fe_sec_mini_cmd_t minicmd) struct dst_state *state = fe->demodulator_priv; if (state->dst_type != DST_TYPE_IS_SAT) - return -EOPNOTSUPP; + return 0; state->minicmd = minicmd; switch (minicmd) { case SEC_MINI_A: @@ -1548,7 +1273,9 @@ static int dst_send_burst(struct dvb_frontend *fe, fe_sec_mini_cmd_t minicmd) state->tx_tuna[3] = 0xff; break; } - return dst_tone_power_cmd(state); + dst_tone_power_cmd(state); + + return 0; } @@ -1560,9 +1287,8 @@ static int dst_init(struct dvb_frontend *fe) static u8 sat_tuna_204[] = { 0x00, 0x00, 0x03, 0xb6, 0x01, 0x55, 0xbd, 0x50, 0x00, 0x00 }; static u8 ter_tuna_188[] = { 0x09, 0x00, 0x03, 0xb6, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00 }; static u8 ter_tuna_204[] = { 0x00, 0x00, 0x03, 0xb6, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00 }; - static u8 cab_tuna_188[] = { 0x09, 0x00, 0x03, 0xb6, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00 }; static u8 cab_tuna_204[] = { 0x00, 0x00, 0x03, 0xb6, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00 }; - static u8 atsc_tuner[] = { 0x00, 0x00, 0x03, 0xb6, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00 }; + static u8 cab_tuna_188[] = { 0x09, 0x00, 0x03, 0xb6, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00 }; state->inversion = INVERSION_OFF; state->voltage = SEC_VOLTAGE_13; @@ -1572,13 +1298,11 @@ static int dst_init(struct dvb_frontend *fe) state->bandwidth = BANDWIDTH_7_MHZ; state->cur_jiff = jiffies; if (state->dst_type == DST_TYPE_IS_SAT) - memcpy(state->tx_tuna, ((state->type_flags & DST_TYPE_HAS_VLF) ? sat_tuna_188 : sat_tuna_204), sizeof (sat_tuna_204)); + memcpy(state->tx_tuna, ((state->type_flags & DST_TYPE_HAS_NEWTUNE) ? sat_tuna_188 : sat_tuna_204), sizeof (sat_tuna_204)); else if (state->dst_type == DST_TYPE_IS_TERR) - memcpy(state->tx_tuna, ((state->type_flags & DST_TYPE_HAS_VLF) ? ter_tuna_188 : ter_tuna_204), sizeof (ter_tuna_204)); + memcpy(state->tx_tuna, ((state->type_flags & DST_TYPE_HAS_NEWTUNE) ? ter_tuna_188 : ter_tuna_204), sizeof (ter_tuna_204)); else if (state->dst_type == DST_TYPE_IS_CABLE) - memcpy(state->tx_tuna, ((state->type_flags & DST_TYPE_HAS_VLF) ? cab_tuna_188 : cab_tuna_204), sizeof (cab_tuna_204)); - else if (state->dst_type == DST_TYPE_IS_ATSC) - memcpy(state->tx_tuna, atsc_tuner, sizeof (atsc_tuner)); + memcpy(state->tx_tuna, ((state->type_flags & DST_TYPE_HAS_NEWTUNE) ? cab_tuna_188 : cab_tuna_204), sizeof (cab_tuna_204)); return 0; } @@ -1601,55 +1325,23 @@ static int dst_read_signal_strength(struct dvb_frontend *fe, u16 *strength) { struct dst_state *state = fe->demodulator_priv; - int retval = dst_get_signal(state); + dst_get_signal(state); *strength = state->decode_strength; - return retval; + return 0; } static int dst_read_snr(struct dvb_frontend *fe, u16 *snr) { struct dst_state *state = fe->demodulator_priv; - int retval = dst_get_signal(state); + dst_get_signal(state); *snr = state->decode_snr; - return retval; -} - -static int dst_set_frontend(struct dvb_frontend *fe, struct dvb_frontend_parameters *p) -{ - int retval = -EINVAL; - struct dst_state *state = fe->demodulator_priv; - - if (p != NULL) { - retval = dst_set_freq(state, p->frequency); - if(retval != 0) - return retval; - dprintk(verbose, DST_DEBUG, 1, "Set Frequency=[%d]", p->frequency); - - if (state->dst_type == DST_TYPE_IS_SAT) { - if (state->type_flags & DST_TYPE_HAS_OBS_REGS) - dst_set_inversion(state, p->inversion); - dst_set_fec(state, p->u.qpsk.fec_inner); - dst_set_symbolrate(state, p->u.qpsk.symbol_rate); - dst_set_polarization(state); - dprintk(verbose, DST_DEBUG, 1, "Set Symbolrate=[%d]", p->u.qpsk.symbol_rate); - - } else if (state->dst_type == DST_TYPE_IS_TERR) - dst_set_bandwidth(state, p->u.ofdm.bandwidth); - else if (state->dst_type == DST_TYPE_IS_CABLE) { - dst_set_fec(state, p->u.qam.fec_inner); - dst_set_symbolrate(state, p->u.qam.symbol_rate); - dst_set_modulation(state, p->u.qam.modulation); - } - retval = dst_write_tuna(fe); - } - - return retval; + return 0; } -static int dst_tune_frontend(struct dvb_frontend* fe, +static int dst_set_frontend(struct dvb_frontend* fe, struct dvb_frontend_parameters* p, unsigned int mode_flags, int *delay, @@ -1686,11 +1378,6 @@ static int dst_tune_frontend(struct dvb_frontend* fe, return 0; } -static int dst_get_tuning_algo(struct dvb_frontend *fe) -{ - return dst_algo; -} - static int dst_get_frontend(struct dvb_frontend *fe, struct dvb_frontend_parameters *p) { struct dst_state *state = fe->demodulator_priv; @@ -1721,7 +1408,6 @@ static void dst_release(struct dvb_frontend *fe) static struct dvb_frontend_ops dst_dvbt_ops; static struct dvb_frontend_ops dst_dvbs_ops; static struct dvb_frontend_ops dst_dvbc_ops; -static struct dvb_frontend_ops dst_atsc_ops; struct dst_state *dst_attach(struct dst_state *state, struct dvb_adapter *dvb_adapter) { @@ -1731,25 +1417,24 @@ struct dst_state *dst_attach(struct dst_state *state, struct dvb_adapter *dvb_ad return NULL; } /* determine settings based on type */ - /* create dvb_frontend */ switch (state->dst_type) { case DST_TYPE_IS_TERR: - memcpy(&state->frontend.ops, &dst_dvbt_ops, sizeof(struct dvb_frontend_ops)); + memcpy(&state->ops, &dst_dvbt_ops, sizeof(struct dvb_frontend_ops)); break; case DST_TYPE_IS_CABLE: - memcpy(&state->frontend.ops, &dst_dvbc_ops, sizeof(struct dvb_frontend_ops)); + memcpy(&state->ops, &dst_dvbc_ops, sizeof(struct dvb_frontend_ops)); break; case DST_TYPE_IS_SAT: - memcpy(&state->frontend.ops, &dst_dvbs_ops, sizeof(struct dvb_frontend_ops)); - break; - case DST_TYPE_IS_ATSC: - memcpy(&state->frontend.ops, &dst_atsc_ops, sizeof(struct dvb_frontend_ops)); + memcpy(&state->ops, &dst_dvbs_ops, sizeof(struct dvb_frontend_ops)); break; default: dprintk(verbose, DST_ERROR, 1, "unknown DST type. please report to the LinuxTV.org DVB mailinglist."); kfree(state); return NULL; } + + /* create dvb_frontend */ + state->frontend.ops = &state->ops; state->frontend.demodulator_priv = state; return state; /* Manu (DST is a card not a frontend) */ @@ -1770,10 +1455,8 @@ static struct dvb_frontend_ops dst_dvbt_ops = { .release = dst_release, .init = dst_init, - .tune = dst_tune_frontend, - .set_frontend = dst_set_frontend, + .tune = dst_set_frontend, .get_frontend = dst_get_frontend, - .get_frontend_algo = dst_get_tuning_algo, .read_status = dst_read_status, .read_signal_strength = dst_read_signal_strength, .read_snr = dst_read_snr, @@ -1796,10 +1479,8 @@ static struct dvb_frontend_ops dst_dvbs_ops = { .release = dst_release, .init = dst_init, - .tune = dst_tune_frontend, - .set_frontend = dst_set_frontend, + .tune = dst_set_frontend, .get_frontend = dst_get_frontend, - .get_frontend_algo = dst_get_tuning_algo, .read_status = dst_read_status, .read_signal_strength = dst_read_signal_strength, .read_snr = dst_read_snr, @@ -1825,38 +1506,13 @@ static struct dvb_frontend_ops dst_dvbc_ops = { .release = dst_release, .init = dst_init, - .tune = dst_tune_frontend, - .set_frontend = dst_set_frontend, - .get_frontend = dst_get_frontend, - .get_frontend_algo = dst_get_tuning_algo, - .read_status = dst_read_status, - .read_signal_strength = dst_read_signal_strength, - .read_snr = dst_read_snr, -}; - -static struct dvb_frontend_ops dst_atsc_ops = { - .info = { - .name = "DST ATSC", - .type = FE_ATSC, - .frequency_stepsize = 62500, - .frequency_min = 510000000, - .frequency_max = 858000000, - .symbol_rate_min = 1000000, - .symbol_rate_max = 45000000, - .caps = FE_CAN_FEC_AUTO | FE_CAN_QAM_AUTO | FE_CAN_QAM_64 | FE_CAN_QAM_256 | FE_CAN_8VSB - }, - - .release = dst_release, - .init = dst_init, - .tune = dst_tune_frontend, - .set_frontend = dst_set_frontend, + .tune = dst_set_frontend, .get_frontend = dst_get_frontend, - .get_frontend_algo = dst_get_tuning_algo, .read_status = dst_read_status, .read_signal_strength = dst_read_signal_strength, .read_snr = dst_read_snr, }; -MODULE_DESCRIPTION("DST DVB-S/T/C/ATSC Combo Frontend driver"); +MODULE_DESCRIPTION("DST DVB-S/T/C Combo Frontend driver"); MODULE_AUTHOR("Jamie Honan, Manu Abraham"); MODULE_LICENSE("GPL"); diff --git a/drivers/media/dvb/bt8xx/dst_ca.c b/drivers/media/dvb/bt8xx/dst_ca.c index fa923b9b3..c650b4bf7 100644 --- a/drivers/media/dvb/bt8xx/dst_ca.c +++ b/drivers/media/dvb/bt8xx/dst_ca.c @@ -68,13 +68,6 @@ static int ca_set_pid(void) return -EOPNOTSUPP; } -static void put_command_and_length(u8 *data, int command, int length) -{ - data[0] = (command >> 16) & 0xff; - data[1] = (command >> 8) & 0xff; - data[2] = command & 0xff; - data[3] = length; -} static void put_checksum(u8 *check_string, int length) { @@ -88,7 +81,7 @@ static int dst_ci_command(struct dst_state* state, u8 * data, u8 *ca_string, u8 { u8 reply; - mutex_lock(&state->dst_mutex); + down(&state->dst_mutex); dst_comm_init(state); msleep(65); @@ -117,11 +110,11 @@ static int dst_ci_command(struct dst_state* state, u8 * data, u8 *ca_string, u8 goto error; } } - mutex_unlock(&state->dst_mutex); + up(&state->dst_mutex); return 0; error: - mutex_unlock(&state->dst_mutex); + up(&state->dst_mutex); return -EIO; } @@ -131,18 +124,15 @@ static int dst_put_ci(struct dst_state *state, u8 *data, int len, u8 *ca_string, u8 dst_ca_comm_err = 0; while (dst_ca_comm_err < RETRIES) { + dst_comm_init(state); dprintk(verbose, DST_CA_NOTICE, 1, " Put Command"); if (dst_ci_command(state, data, ca_string, len, read)) { // If error dst_error_recovery(state); dst_ca_comm_err++; // work required here. - } else { - break; } + break; } - if(dst_ca_comm_err == RETRIES) - return -1; - return 0; } @@ -150,7 +140,6 @@ static int dst_put_ci(struct dst_state *state, u8 *data, int len, u8 *ca_string, static int ca_get_app_info(struct dst_state *state) { - int length, str_length; static u8 command[8] = {0x07, 0x40, 0x01, 0x00, 0x01, 0x00, 0x00, 0xff}; put_checksum(&command[0], command[0]); @@ -165,68 +154,6 @@ static int ca_get_app_info(struct dst_state *state) (state->messages[10] << 8) | state->messages[11], __FUNCTION__, (char *)(&state->messages[12])); dprintk(verbose, DST_CA_INFO, 1, " =================================================================================================="); - // Transform dst message to correct application_info message - length = state->messages[5]; - str_length = length - 6; - if (str_length < 0) { - str_length = 0; - dprintk(verbose, DST_CA_ERROR, 1, "Invalid string length returned in ca_get_app_info(). Recovering."); - } - - // First, the command and length fields - put_command_and_length(&state->messages[0], CA_APP_INFO, length); - - // Copy application_type, application_manufacturer and manufacturer_code - memcpy(&state->messages[4], &state->messages[7], 5); - - // Set string length and copy string - state->messages[9] = str_length; - memcpy(&state->messages[10], &state->messages[12], str_length); - - return 0; -} - -static int ca_get_ca_info(struct dst_state *state) -{ - int srcPtr, dstPtr, i, num_ids; - static u8 slot_command[8] = {0x07, 0x40, 0x00, 0x00, 0x02, 0x00, 0x00, 0xff}; - const int in_system_id_pos = 8, out_system_id_pos = 4, in_num_ids_pos = 7; - - put_checksum(&slot_command[0], slot_command[0]); - if ((dst_put_ci(state, slot_command, sizeof (slot_command), state->messages, GET_REPLY)) < 0) { - dprintk(verbose, DST_CA_ERROR, 1, " -->dst_put_ci FAILED !"); - return -1; - } - dprintk(verbose, DST_CA_INFO, 1, " -->dst_put_ci SUCCESS !"); - - // Print raw data - dprintk(verbose, DST_CA_INFO, 0, " DST data = ["); - for (i = 0; i < state->messages[0] + 1; i++) { - dprintk(verbose, DST_CA_INFO, 0, " 0x%02x", state->messages[i]); - } - dprintk(verbose, DST_CA_INFO, 0, "]\n"); - - // Set the command and length of the output - num_ids = state->messages[in_num_ids_pos]; - if (num_ids >= 100) { - num_ids = 100; - dprintk(verbose, DST_CA_ERROR, 1, "Invalid number of ids (>100). Recovering."); - } - put_command_and_length(&state->messages[0], CA_INFO, num_ids * 2); - - dprintk(verbose, DST_CA_INFO, 0, " CA_INFO = ["); - srcPtr = in_system_id_pos; - dstPtr = out_system_id_pos; - for(i = 0; i < num_ids; i++) { - dprintk(verbose, DST_CA_INFO, 0, " 0x%02x%02x", state->messages[srcPtr + 0], state->messages[srcPtr + 1]); - // Append to output - state->messages[dstPtr + 0] = state->messages[srcPtr + 0]; - state->messages[dstPtr + 1] = state->messages[srcPtr + 1]; - srcPtr += 2; - dstPtr += 2; - } - dprintk(verbose, DST_CA_INFO, 0, "]\n"); - return 0; } @@ -247,7 +174,7 @@ static int ca_get_slot_caps(struct dst_state *state, struct ca_caps *p_ca_caps, dprintk(verbose, DST_CA_INFO, 1, " Slot cap = [%d]", slot_cap[7]); dprintk(verbose, DST_CA_INFO, 0, "===================================\n"); - for (i = 0; i < slot_cap[0] + 1; i++) + for (i = 0; i < 8; i++) dprintk(verbose, DST_CA_INFO, 0, " %d", slot_cap[i]); dprintk(verbose, DST_CA_INFO, 0, "\n"); @@ -333,11 +260,6 @@ static int ca_get_message(struct dst_state *state, struct ca_msg *p_ca_message, if (copy_to_user(arg, p_ca_message, sizeof (struct ca_msg)) ) return -EFAULT; break; - case CA_INFO: - memcpy(p_ca_message->msg, state->messages, 128); - if (copy_to_user(arg, p_ca_message, sizeof (struct ca_msg)) ) - return -EFAULT; - break; } } @@ -380,7 +302,7 @@ static int write_to_8820(struct dst_state *state, struct ca_msg *hw_buffer, u8 l rdc_reset_state(state); return -1; } - dprintk(verbose, DST_CA_NOTICE, 1, " DST-CI Command success."); + dprintk(verbose, DST_CA_NOTICE, 1, " DST-CI Command succes."); return 0; } @@ -418,7 +340,6 @@ static int debug_string(u8 *msg, u32 length, u32 offset) return 0; } - static int ca_set_pmt(struct dst_state *state, struct ca_msg *p_ca_message, struct ca_msg *hw_buffer, u8 reply, u8 query) { u32 length = 0; @@ -534,16 +455,6 @@ static int ca_send_message(struct dst_state *state, struct ca_msg *p_ca_message, } dprintk(verbose, DST_CA_INFO, 1, " -->CA_APP_INFO_ENQUIRY Success !"); break; - case CA_INFO_ENQUIRY: - dprintk(verbose, DST_CA_INFO, 1, " Getting CA Information"); - - if ((ca_get_ca_info(state)) < 0) { - dprintk(verbose, DST_CA_ERROR, 1, " -->CA_INFO_ENQUIRY Failed !"); - result = -1; - goto free_mem_and_exit; - } - dprintk(verbose, DST_CA_INFO, 1, " -->CA_INFO_ENQUIRY Success !"); - break; } } free_mem_and_exit: @@ -562,15 +473,18 @@ static int dst_ca_ioctl(struct inode *inode, struct file *file, unsigned int cmd void __user *arg = (void __user *)ioctl_arg; int result = 0; - p_ca_message = kmalloc(sizeof (struct ca_msg), GFP_KERNEL); - p_ca_slot_info = kmalloc(sizeof (struct ca_slot_info), GFP_KERNEL); - p_ca_caps = kmalloc(sizeof (struct ca_caps), GFP_KERNEL); - if (!p_ca_message || !p_ca_slot_info || !p_ca_caps) { + if ((p_ca_message = (struct ca_msg *) kmalloc(sizeof (struct ca_msg), GFP_KERNEL)) == NULL) { dprintk(verbose, DST_CA_ERROR, 1, " Memory allocation failure"); - result = -ENOMEM; - goto free_mem_and_exit; + return -ENOMEM; + } + if ((p_ca_slot_info = (struct ca_slot_info *) kmalloc(sizeof (struct ca_slot_info), GFP_KERNEL)) == NULL) { + dprintk(verbose, DST_CA_ERROR, 1, " Memory allocation failure"); + return -ENOMEM; + } + if ((p_ca_caps = (struct ca_caps *) kmalloc(sizeof (struct ca_caps), GFP_KERNEL)) == NULL) { + dprintk(verbose, DST_CA_ERROR, 1, " Memory allocation failure"); + return -ENOMEM; } - /* We have now only the standard ioctl's, the driver is upposed to handle internals. */ switch (cmd) { case CA_SEND_MSG: @@ -668,7 +582,7 @@ static int dst_ca_release(struct inode *inode, struct file *file) static ssize_t dst_ca_read(struct file *file, char __user *buffer, size_t length, loff_t *offset) { - ssize_t bytes_read = 0; + int bytes_read = 0; dprintk(verbose, DST_CA_DEBUG, 1, " Device read."); diff --git a/drivers/media/dvb/bt8xx/dst_common.h b/drivers/media/dvb/bt8xx/dst_common.h index 0677b047b..81557f38f 100644 --- a/drivers/media/dvb/bt8xx/dst_common.h +++ b/drivers/media/dvb/bt8xx/dst_common.h @@ -25,7 +25,6 @@ #include #include #include -#include #include "bt878.h" #include "dst_ca.h" @@ -42,7 +41,7 @@ #define DST_TYPE_IS_CABLE 2 #define DST_TYPE_IS_ATSC 3 -#define DST_TYPE_HAS_TS188 1 +#define DST_TYPE_HAS_NEWTUNE 1 #define DST_TYPE_HAS_TS204 2 #define DST_TYPE_HAS_SYMDIV 4 #define DST_TYPE_HAS_FW_1 8 @@ -52,9 +51,6 @@ #define DST_TYPE_HAS_OBS_REGS 128 #define DST_TYPE_HAS_INC_COUNT 256 #define DST_TYPE_HAS_MULTI_FE 512 -#define DST_TYPE_HAS_NEWTUNE_2 1024 -#define DST_TYPE_HAS_DBOARD 2048 -#define DST_TYPE_HAS_VLF 4096 /* Card capability list */ @@ -67,20 +63,6 @@ #define DST_TYPE_HAS_ANALOG 64 /* Analog inputs */ #define DST_TYPE_HAS_SESSION 128 -#define TUNER_TYPE_MULTI 1 -#define TUNER_TYPE_UNKNOWN 2 -/* DVB-S */ -#define TUNER_TYPE_L64724 4 -#define TUNER_TYPE_STV0299 8 -#define TUNER_TYPE_MB86A15 16 - -/* DVB-T */ -#define TUNER_TYPE_TDA10046 32 - -/* ATSC */ -#define TUNER_TYPE_NXT200x 64 - - #define RDC_8820_PIO_0_DISABLE 0 #define RDC_8820_PIO_0_ENABLE 1 #define RDC_8820_INT 2 @@ -101,6 +83,8 @@ struct dst_state { struct bt878* bt; + struct dvb_frontend_ops ops; + /* configuration settings */ const struct dst_config* config; @@ -136,17 +120,8 @@ struct dst_state { u8 card_info[8]; u8 vendor[8]; u8 board_info[8]; - u32 tuner_type; - char *tuner_name; - struct mutex dst_mutex; - u8 fw_name[8]; -}; -struct tuner_types { - u32 tuner_type; - char *tuner_name; - char *board_name; - char *fw_name; + struct semaphore dst_mutex; }; struct dst_types { @@ -155,7 +130,6 @@ struct dst_types { u8 dst_type; u32 type_flags; u32 dst_feature; - u32 tuner_type; }; struct dst_config diff --git a/drivers/media/dvb/bt8xx/dvb-bt8xx.c b/drivers/media/dvb/bt8xx/dvb-bt8xx.c index b715b972d..ea27b1500 100644 --- a/drivers/media/dvb/bt8xx/dvb-bt8xx.c +++ b/drivers/media/dvb/bt8xx/dvb-bt8xx.c @@ -76,13 +76,13 @@ static int dvb_bt8xx_start_feed(struct dvb_demux_feed *dvbdmxfeed) if (!dvbdmx->dmx.frontend) return -EINVAL; - mutex_lock(&card->lock); + down(&card->lock); card->nfeeds++; rc = card->nfeeds; if (card->nfeeds == 1) bt878_start(card->bt, card->gpio_mode, card->op_sync_orin, card->irq_err_ignore); - mutex_unlock(&card->lock); + up(&card->lock); return rc; } @@ -96,11 +96,11 @@ static int dvb_bt8xx_stop_feed(struct dvb_demux_feed *dvbdmxfeed) if (!dvbdmx->dmx.frontend) return -EINVAL; - mutex_lock(&card->lock); + down(&card->lock); card->nfeeds--; if (card->nfeeds == 0) bt878_stop(card->bt); - mutex_unlock(&card->lock); + up(&card->lock); return 0; } @@ -115,7 +115,7 @@ static int is_pci_slot_eq(struct pci_dev* adev, struct pci_dev* bdev) return 0; } -static struct bt878 __devinit *dvb_bt8xx_878_match(unsigned int bttv_nr, struct pci_dev* bttv_pci_dev) +static struct bt878 __init *dvb_bt8xx_878_match(unsigned int bttv_nr, struct pci_dev* bttv_pci_dev) { unsigned int card_nr; @@ -147,15 +147,12 @@ static int thomson_dtt7579_demod_init(struct dvb_frontend* fe) return 0; } -static int thomson_dtt7579_tuner_calc_regs(struct dvb_frontend* fe, struct dvb_frontend_parameters* params, u8* pllbuf, int buf_len) +static int thomson_dtt7579_pll_set(struct dvb_frontend* fe, struct dvb_frontend_parameters* params, u8* pllbuf) { u32 div; unsigned char bs = 0; unsigned char cp = 0; - if (buf_len < 5) - return -EINVAL; - div = (((params->frequency + 83333) * 3) / 500000) + IF_FREQUENCYx6; if (params->frequency < 542000000) @@ -172,25 +169,22 @@ static int thomson_dtt7579_tuner_calc_regs(struct dvb_frontend* fe, struct dvb_f else bs = 0x08; - pllbuf[0] = 0x60; + pllbuf[0] = 0xc0; // Note: non-linux standard PLL i2c address pllbuf[1] = div >> 8; pllbuf[2] = div & 0xff; pllbuf[3] = cp; pllbuf[4] = bs; - return 5; + return 0; } static struct mt352_config thomson_dtt7579_config = { .demod_address = 0x0f, .demod_init = thomson_dtt7579_demod_init, + .pll_set = thomson_dtt7579_pll_set, }; -static struct zl10353_config thomson_dtt7579_zl10353_config = { - .demod_address = 0x0f, -}; - -static int cx24108_tuner_set_params(struct dvb_frontend* fe, struct dvb_frontend_parameters* params) +static int cx24108_pll_set(struct dvb_frontend* fe, struct dvb_frontend_parameters* params) { u32 freq = params->frequency; @@ -243,30 +237,18 @@ static int cx24108_tuner_set_params(struct dvb_frontend* fe, struct dvb_frontend return 0; } -static int pinnsat_tuner_init(struct dvb_frontend* fe) +static int pinnsat_pll_init(struct dvb_frontend* fe) { - struct dvb_bt8xx_card *card = fe->dvb->priv; - - bttv_gpio_enable(card->bttv_nr, 1, 1); /* output */ - bttv_write_gpio(card->bttv_nr, 1, 1); /* relay on */ - - return 0; -} - -static int pinnsat_tuner_sleep(struct dvb_frontend* fe) -{ - struct dvb_bt8xx_card *card = fe->dvb->priv; - - bttv_write_gpio(card->bttv_nr, 1, 0); /* relay off */ - return 0; } static struct cx24110_config pctvsat_config = { .demod_address = 0x55, + .pll_init = pinnsat_pll_init, + .pll_set = cx24108_pll_set, }; -static int microtune_mt7202dtf_tuner_set_params(struct dvb_frontend* fe, struct dvb_frontend_parameters* params) +static int microtune_mt7202dtf_pll_set(struct dvb_frontend* fe, struct dvb_frontend_parameters* params) { struct dvb_bt8xx_card *card = (struct dvb_bt8xx_card *) fe->dvb->priv; u8 cfg, cpump, band_select; @@ -300,8 +282,6 @@ static int microtune_mt7202dtf_tuner_set_params(struct dvb_frontend* fe, struct data[2] = ((div >> 10) & 0x60) | cfg; data[3] = (cpump << 6) | band_select; - if (fe->ops.i2c_gate_ctrl) - fe->ops.i2c_gate_ctrl(fe, 1); i2c_transfer(card->i2c_adapter, &msg, 1); return (div * 166666 - 36000000); } @@ -315,6 +295,7 @@ static int microtune_mt7202dtf_request_firmware(struct dvb_frontend* fe, const s static struct sp887x_config microtune_mt7202dtf_config = { .demod_address = 0x70, + .pll_set = microtune_mt7202dtf_pll_set, .request_firmware = microtune_mt7202dtf_request_firmware, }; @@ -341,14 +322,12 @@ static int advbt771_samsung_tdtc9251dh0_demod_init(struct dvb_frontend* fe) return 0; } -static int advbt771_samsung_tdtc9251dh0_tuner_calc_regs(struct dvb_frontend* fe, struct dvb_frontend_parameters* params, u8* pllbuf, int buf_len) +static int advbt771_samsung_tdtc9251dh0_pll_set(struct dvb_frontend* fe, struct dvb_frontend_parameters* params, u8* pllbuf) { u32 div; unsigned char bs = 0; unsigned char cp = 0; - if (buf_len < 5) return -EINVAL; - div = (((params->frequency + 83333) * 3) / 500000) + IF_FREQUENCYx6; if (params->frequency < 150000000) @@ -389,18 +368,19 @@ static int advbt771_samsung_tdtc9251dh0_tuner_calc_regs(struct dvb_frontend* fe, else bs = 0x08; - pllbuf[0] = 0x61; + pllbuf[0] = 0xc2; // Note: non-linux standard PLL i2c address pllbuf[1] = div >> 8; pllbuf[2] = div & 0xff; pllbuf[3] = cp; pllbuf[4] = bs; - return 5; + return 0; } static struct mt352_config advbt771_samsung_tdtc9251dh0_config = { .demod_address = 0x0f, .demod_init = advbt771_samsung_tdtc9251dh0_demod_init, + .pll_set = advbt771_samsung_tdtc9251dh0_pll_set, }; static struct dst_config dst_config = { @@ -460,7 +440,7 @@ static struct or51211_config or51211_config = { .sleep = or51211_sleep, }; -static int vp3021_alps_tded4_tuner_set_params(struct dvb_frontend* fe, struct dvb_frontend_parameters* params) +static int vp3021_alps_tded4_pll_set(struct dvb_frontend* fe, struct dvb_frontend_parameters* params) { struct dvb_bt8xx_card *card = (struct dvb_bt8xx_card *) fe->dvb->priv; u8 buf[4]; @@ -483,8 +463,6 @@ static int vp3021_alps_tded4_tuner_set_params(struct dvb_frontend* fe, struct dv else return -EINVAL; - if (fe->ops.i2c_gate_ctrl) - fe->ops.i2c_gate_ctrl(fe, 1); i2c_transfer(card->i2c_adapter, &msg, 1); return 0; } @@ -492,6 +470,7 @@ static int vp3021_alps_tded4_tuner_set_params(struct dvb_frontend* fe, struct dv static struct nxt6000_config vp3021_alps_tded4_config = { .demod_address = 0x0a, .clock_inversion = 1, + .pll_set = vp3021_alps_tded4_pll_set, }; static int digitv_alps_tded4_demod_init(struct dvb_frontend* fe) @@ -512,17 +491,14 @@ static int digitv_alps_tded4_demod_init(struct dvb_frontend* fe) return 0; } -static int digitv_alps_tded4_tuner_calc_regs(struct dvb_frontend* fe, struct dvb_frontend_parameters* params, u8* pllbuf, int buf_len) +static int digitv_alps_tded4_pll_set(struct dvb_frontend* fe, struct dvb_frontend_parameters* params, u8* pllbuf) { u32 div; struct dvb_ofdm_parameters *op = ¶ms->u.ofdm; - if (buf_len < 5) - return -EINVAL; - div = (((params->frequency + 83333) * 3) / 500000) + IF_FREQUENCYx6; - pllbuf[0] = 0x61; + pllbuf[0] = 0xc2; pllbuf[1] = (div >> 8) & 0x7F; pllbuf[2] = div & 0xFF; pllbuf[3] = 0x85; @@ -539,7 +515,7 @@ static int digitv_alps_tded4_tuner_calc_regs(struct dvb_frontend* fe, struct dvb if (op->bandwidth == 8) pllbuf[4] |= 0x04; - return 5; + return 0; } static void digitv_alps_tded4_reset(struct dvb_bt8xx_card *bt) @@ -566,18 +542,43 @@ static void digitv_alps_tded4_reset(struct dvb_bt8xx_card *bt) static struct mt352_config digitv_alps_tded4_config = { .demod_address = 0x0a, .demod_init = digitv_alps_tded4_demod_init, + .pll_set = digitv_alps_tded4_pll_set, }; -static int tdvs_tua6034_tuner_set_params(struct dvb_frontend* fe, struct dvb_frontend_parameters* params) +static int tdvs_tua6034_pll_set(struct dvb_frontend* fe, struct dvb_frontend_parameters* params) { struct dvb_bt8xx_card *card = (struct dvb_bt8xx_card *) fe->dvb->priv; - return lg_h06xf_pll_set(fe, card->i2c_adapter, params); + u8 buf[4]; + struct i2c_msg msg = { .addr = 0x61, .flags = 0, .buf = buf, .len = sizeof(buf) }; + int err; + + dvb_pll_configure(&dvb_pll_tdvs_tua6034, buf, params->frequency, 0); + dprintk("%s: tuner at 0x%02x bytes: 0x%02x 0x%02x 0x%02x 0x%02x\n", + __FUNCTION__, msg.addr, buf[0],buf[1],buf[2],buf[3]); + if ((err = i2c_transfer(card->i2c_adapter, &msg, 1)) != 1) { + printk(KERN_WARNING "dvb-bt8xx: %s error " + "(addr %02x <- %02x, err = %i)\n", + __FUNCTION__, buf[0], buf[1], err); + if (err < 0) + return err; + else + return -EREMOTEIO; + } + + /* Set the Auxiliary Byte. */ + buf[2] &= ~0x20; + buf[2] |= 0x18; + buf[3] = 0x50; + i2c_transfer(card->i2c_adapter, &msg, 1); + + return 0; } static struct lgdt330x_config tdvs_tua6034_config = { .demod_address = 0x0e, .demod_chip = LGDT3303, .serial_mpeg = 0x40, /* TPSERIAL for 3303 in TOP_CONTROL */ + .pll_set = tdvs_tua6034_pll_set, }; static void lgdt330x_reset(struct dvb_bt8xx_card *bt) @@ -601,25 +602,17 @@ static void frontend_init(struct dvb_bt8xx_card *card, u32 type) switch(type) { case BTTV_BOARD_DVICO_DVBT_LITE: card->fe = mt352_attach(&thomson_dtt7579_config, card->i2c_adapter); - - if (card->fe == NULL) - card->fe = zl10353_attach(&thomson_dtt7579_zl10353_config, - card->i2c_adapter); - if (card->fe != NULL) { - card->fe->ops.tuner_ops.calc_regs = thomson_dtt7579_tuner_calc_regs; - card->fe->ops.info.frequency_min = 174000000; - card->fe->ops.info.frequency_max = 862000000; + card->fe->ops->info.frequency_min = 174000000; + card->fe->ops->info.frequency_max = 862000000; } break; case BTTV_BOARD_DVICO_FUSIONHDTV_5_LITE: lgdt330x_reset(card); card->fe = lgdt330x_attach(&tdvs_tua6034_config, card->i2c_adapter); - if (card->fe != NULL) { - card->fe->ops.tuner_ops.set_params = tdvs_tua6034_tuner_set_params; + if (card->fe != NULL) dprintk ("dvb_bt8xx: lgdt330x detected\n"); - } break; case BTTV_BOARD_NEBULA_DIGITV: @@ -632,7 +625,6 @@ static void frontend_init(struct dvb_bt8xx_card *card, u32 type) digitv_alps_tded4_reset(card); card->fe = nxt6000_attach(&vp3021_alps_tded4_config, card->i2c_adapter); if (card->fe != NULL) { - card->fe->ops.tuner_ops.set_params = vp3021_alps_tded4_tuner_set_params; dprintk ("dvb_bt8xx: an nxt6000 was detected on your digitv card\n"); break; } @@ -641,25 +633,19 @@ static void frontend_init(struct dvb_bt8xx_card *card, u32 type) digitv_alps_tded4_reset(card); card->fe = mt352_attach(&digitv_alps_tded4_config, card->i2c_adapter); - if (card->fe != NULL) { - card->fe->ops.tuner_ops.calc_regs = digitv_alps_tded4_tuner_calc_regs; + if (card->fe != NULL) dprintk ("dvb_bt8xx: an mt352 was detected on your digitv card\n"); - } break; case BTTV_BOARD_AVDVBT_761: card->fe = sp887x_attach(µtune_mt7202dtf_config, card->i2c_adapter); - if (card->fe) { - card->fe->ops.tuner_ops.set_params = microtune_mt7202dtf_tuner_set_params; - } break; case BTTV_BOARD_AVDVBT_771: card->fe = mt352_attach(&advbt771_samsung_tdtc9251dh0_config, card->i2c_adapter); if (card->fe != NULL) { - card->fe->ops.tuner_ops.calc_regs = advbt771_samsung_tdtc9251dh0_tuner_calc_regs; - card->fe->ops.info.frequency_min = 174000000; - card->fe->ops.info.frequency_max = 862000000; + card->fe->ops->info.frequency_min = 174000000; + card->fe->ops->info.frequency_max = 862000000; } break; @@ -686,11 +672,6 @@ static void frontend_init(struct dvb_bt8xx_card *card, u32 type) case BTTV_BOARD_PINNACLESAT: card->fe = cx24110_attach(&pctvsat_config, card->i2c_adapter); - if (card->fe) { - card->fe->ops.tuner_ops.init = pinnsat_tuner_init; - card->fe->ops.tuner_ops.sleep = pinnsat_tuner_sleep; - card->fe->ops.tuner_ops.set_params = cx24108_tuner_set_params; - } break; case BTTV_BOARD_PC_HDTV: @@ -707,17 +688,17 @@ static void frontend_init(struct dvb_bt8xx_card *card, u32 type) else if (dvb_register_frontend(&card->dvb_adapter, card->fe)) { printk("dvb-bt8xx: Frontend registration failed!\n"); - if (card->fe->ops.release) - card->fe->ops.release(card->fe); + if (card->fe->ops->release) + card->fe->ops->release(card->fe); card->fe = NULL; } } -static int __devinit dvb_bt8xx_load_card(struct dvb_bt8xx_card *card, u32 type) +static int __init dvb_bt8xx_load_card(struct dvb_bt8xx_card *card, u32 type) { int result; - if ((result = dvb_register_adapter(&card->dvb_adapter, card->card_name, THIS_MODULE, &card->bt->dev->dev)) < 0) { + if ((result = dvb_register_adapter(&card->dvb_adapter, card->card_name, THIS_MODULE)) < 0) { printk("dvb_bt8xx: dvb_register_adapter failed (errno = %d)\n", result); return result; } @@ -798,7 +779,7 @@ static int __devinit dvb_bt8xx_load_card(struct dvb_bt8xx_card *card, u32 type) return 0; } -static int __devinit dvb_bt8xx_probe(struct bttv_sub_device *sub) +static int dvb_bt8xx_probe(struct bttv_sub_device *sub) { struct dvb_bt8xx_card *card; struct pci_dev* bttv_pci_dev; @@ -807,7 +788,7 @@ static int __devinit dvb_bt8xx_probe(struct bttv_sub_device *sub) if (!(card = kzalloc(sizeof(struct dvb_bt8xx_card), GFP_KERNEL))) return -ENOMEM; - mutex_init(&card->lock); + init_MUTEX(&card->lock); card->bttv_nr = sub->core->nr; strncpy(card->card_name, sub->core->name, sizeof(sub->core->name)); card->i2c_adapter = &sub->core->i2c_adap; @@ -817,14 +798,14 @@ static int __devinit dvb_bt8xx_probe(struct bttv_sub_device *sub) card->gpio_mode = 0x0400c060; /* should be: BT878_A_GAIN=0,BT878_A_PWRDN,BT878_DA_DPM,BT878_DA_SBR, BT878_DA_IOM=1,BT878_DA_APP to enable serial highspeed mode. */ - card->op_sync_orin = BT878_RISC_SYNC_MASK; - card->irq_err_ignore = BT878_AFBUS | BT878_AFDSR; + card->op_sync_orin = 0; + card->irq_err_ignore = 0; break; case BTTV_BOARD_DVICO_DVBT_LITE: card->gpio_mode = 0x0400C060; - card->op_sync_orin = BT878_RISC_SYNC_MASK; - card->irq_err_ignore = BT878_AFBUS | BT878_AFDSR; + card->op_sync_orin = 0; + card->irq_err_ignore = 0; /* 26, 15, 14, 6, 5 * A_PWRDN DA_DPM DA_SBR DA_IOM_DA * DA_APP(parallel) */ @@ -839,15 +820,15 @@ static int __devinit dvb_bt8xx_probe(struct bttv_sub_device *sub) case BTTV_BOARD_NEBULA_DIGITV: case BTTV_BOARD_AVDVBT_761: card->gpio_mode = (1 << 26) | (1 << 14) | (1 << 5); - card->op_sync_orin = BT878_RISC_SYNC_MASK; - card->irq_err_ignore = BT878_AFBUS | BT878_AFDSR; + card->op_sync_orin = 0; + card->irq_err_ignore = 0; /* A_PWRDN DA_SBR DA_APP (high speed serial) */ break; case BTTV_BOARD_AVDVBT_771: //case 0x07711461: card->gpio_mode = 0x0400402B; card->op_sync_orin = BT878_RISC_SYNC_MASK; - card->irq_err_ignore = BT878_AFBUS | BT878_AFDSR; + card->irq_err_ignore = 0; /* A_PWRDN DA_SBR DA_APP[0] PKTP=10 RISC_ENABLE FIFO_ENABLE*/ break; @@ -871,8 +852,8 @@ static int __devinit dvb_bt8xx_probe(struct bttv_sub_device *sub) case BTTV_BOARD_PC_HDTV: card->gpio_mode = 0x0100EC7B; - card->op_sync_orin = BT878_RISC_SYNC_MASK; - card->irq_err_ignore = BT878_AFBUS | BT878_AFDSR; + card->op_sync_orin = 0; + card->irq_err_ignore = 0; break; default: @@ -900,7 +881,7 @@ static int __devinit dvb_bt8xx_probe(struct bttv_sub_device *sub) return -EFAULT; } - mutex_init(&card->bt->gpio_lock); + init_MUTEX(&card->bt->gpio_lock); card->bt->bttv_nr = sub->core->nr; if ( (ret = dvb_bt8xx_load_card(card, sub->core->type)) ) { diff --git a/drivers/media/dvb/bt8xx/dvb-bt8xx.h b/drivers/media/dvb/bt8xx/dvb-bt8xx.h index 4745a9017..cf035a803 100644 --- a/drivers/media/dvb/bt8xx/dvb-bt8xx.h +++ b/drivers/media/dvb/bt8xx/dvb-bt8xx.h @@ -26,7 +26,6 @@ #define DVB_BT8XX_H #include -#include #include "dvbdev.h" #include "dvb_net.h" #include "bttv.h" @@ -37,11 +36,9 @@ #include "cx24110.h" #include "or51211.h" #include "lgdt330x.h" -#include "lg_h06xf.h" -#include "zl10353.h" struct dvb_bt8xx_card { - struct mutex lock; + struct semaphore lock; int nfeeds; char card_name[32]; struct dvb_adapter dvb_adapter; diff --git a/drivers/media/dvb/cinergyT2/Kconfig b/drivers/media/dvb/cinergyT2/Kconfig index b5cdd57ec..6018fcdba 100644 --- a/drivers/media/dvb/cinergyT2/Kconfig +++ b/drivers/media/dvb/cinergyT2/Kconfig @@ -64,7 +64,7 @@ config DVB_CINERGYT2_QUERY_INTERVAL config DVB_CINERGYT2_ENABLE_RC_INPUT_DEVICE bool "Register the onboard IR Remote Control Receiver as Input Device" depends on DVB_CINERGYT2_TUNING - default y + default "yes" help Enable this option if you want to use the onboard Infrared Remote Control Receiver as Linux-Input device. diff --git a/drivers/media/dvb/cinergyT2/cinergyT2.c b/drivers/media/dvb/cinergyT2/cinergyT2.c index 001c71b6b..c4b4c5b6b 100644 --- a/drivers/media/dvb/cinergyT2/cinergyT2.c +++ b/drivers/media/dvb/cinergyT2/cinergyT2.c @@ -22,6 +22,7 @@ * */ +#include #include #include #include @@ -29,7 +30,6 @@ #include #include #include -#include #include "dmxdev.h" #include "dvb_demux.h" @@ -116,7 +116,7 @@ static struct dvb_frontend_info cinergyt2_fe_info = { struct cinergyt2 { struct dvb_demux demux; struct usb_device *udev; - struct mutex sem; + struct semaphore sem; struct dvb_adapter adapter; struct dvb_device *fedev; struct dmxdev dmxdev; @@ -345,14 +345,14 @@ static int cinergyt2_start_feed(struct dvb_demux_feed *dvbdmxfeed) struct dvb_demux *demux = dvbdmxfeed->demux; struct cinergyt2 *cinergyt2 = demux->priv; - if (cinergyt2->disconnect_pending || mutex_lock_interruptible(&cinergyt2->sem)) + if (cinergyt2->disconnect_pending || down_interruptible(&cinergyt2->sem)) return -ERESTARTSYS; if (cinergyt2->streaming == 0) cinergyt2_start_stream_xfer(cinergyt2); cinergyt2->streaming++; - mutex_unlock(&cinergyt2->sem); + up(&cinergyt2->sem); return 0; } @@ -361,13 +361,13 @@ static int cinergyt2_stop_feed(struct dvb_demux_feed *dvbdmxfeed) struct dvb_demux *demux = dvbdmxfeed->demux; struct cinergyt2 *cinergyt2 = demux->priv; - if (cinergyt2->disconnect_pending || mutex_lock_interruptible(&cinergyt2->sem)) + if (cinergyt2->disconnect_pending || down_interruptible(&cinergyt2->sem)) return -ERESTARTSYS; if (--cinergyt2->streaming == 0) cinergyt2_stop_stream_xfer(cinergyt2); - mutex_unlock(&cinergyt2->sem); + up(&cinergyt2->sem); return 0; } @@ -483,11 +483,11 @@ static int cinergyt2_open (struct inode *inode, struct file *file) struct cinergyt2 *cinergyt2 = dvbdev->priv; int err = -ERESTARTSYS; - if (cinergyt2->disconnect_pending || mutex_lock_interruptible(&cinergyt2->sem)) + if (cinergyt2->disconnect_pending || down_interruptible(&cinergyt2->sem)) return -ERESTARTSYS; if ((err = dvb_generic_open(inode, file))) { - mutex_unlock(&cinergyt2->sem); + up(&cinergyt2->sem); return err; } @@ -499,15 +499,12 @@ static int cinergyt2_open (struct inode *inode, struct file *file) atomic_inc(&cinergyt2->inuse); - mutex_unlock(&cinergyt2->sem); + up(&cinergyt2->sem); return 0; } static void cinergyt2_unregister(struct cinergyt2 *cinergyt2) { - dvb_net_release(&cinergyt2->dvbnet); - dvb_dmxdev_release(&cinergyt2->dmxdev); - dvb_dmx_release(&cinergyt2->demux); dvb_unregister_device(cinergyt2->fedev); dvb_unregister_adapter(&cinergyt2->adapter); @@ -520,7 +517,7 @@ static int cinergyt2_release (struct inode *inode, struct file *file) struct dvb_device *dvbdev = file->private_data; struct cinergyt2 *cinergyt2 = dvbdev->priv; - if (mutex_lock_interruptible(&cinergyt2->sem)) + if (down_interruptible(&cinergyt2->sem)) return -ERESTARTSYS; if (!cinergyt2->disconnect_pending && (file->f_flags & O_ACCMODE) != O_RDONLY) { @@ -529,7 +526,7 @@ static int cinergyt2_release (struct inode *inode, struct file *file) cinergyt2_sleep(cinergyt2, 1); } - mutex_unlock(&cinergyt2->sem); + up(&cinergyt2->sem); if (atomic_dec_and_test(&cinergyt2->inuse) && cinergyt2->disconnect_pending) { warn("delayed unregister in release"); @@ -543,19 +540,15 @@ static unsigned int cinergyt2_poll (struct file *file, struct poll_table_struct { struct dvb_device *dvbdev = file->private_data; struct cinergyt2 *cinergyt2 = dvbdev->priv; - unsigned int mask = 0; - if (cinergyt2->disconnect_pending || mutex_lock_interruptible(&cinergyt2->sem)) + if (cinergyt2->disconnect_pending || down_interruptible(&cinergyt2->sem)) return -ERESTARTSYS; poll_wait(file, &cinergyt2->poll_wq, wait); - if (cinergyt2->pending_fe_events != 0) - mask |= (POLLIN | POLLRDNORM | POLLPRI); - - mutex_unlock(&cinergyt2->sem); + up(&cinergyt2->sem); - return mask; + return (POLLIN | POLLRDNORM | POLLPRI); } @@ -620,7 +613,7 @@ static int cinergyt2_ioctl (struct inode *inode, struct file *file, if (copy_from_user(&p, (void __user*) arg, sizeof(p))) return -EFAULT; - if (cinergyt2->disconnect_pending || mutex_lock_interruptible(&cinergyt2->sem)) + if (cinergyt2->disconnect_pending || down_interruptible(&cinergyt2->sem)) return -ERESTARTSYS; param->cmd = CINERGYT2_EP1_SET_TUNER_PARAMETERS; @@ -636,7 +629,7 @@ static int cinergyt2_ioctl (struct inode *inode, struct file *file, (char *) param, sizeof(*param), NULL, 0); - mutex_unlock(&cinergyt2->sem); + up(&cinergyt2->sem); return (err < 0) ? err : 0; } @@ -731,7 +724,7 @@ static void cinergyt2_query_rc (void *data) struct cinergyt2_rc_event rc_events[12]; int n, len, i; - if (cinergyt2->disconnect_pending || mutex_lock_interruptible(&cinergyt2->sem)) + if (cinergyt2->disconnect_pending || down_interruptible(&cinergyt2->sem)) return; len = cinergyt2_command(cinergyt2, buf, sizeof(buf), @@ -791,7 +784,7 @@ out: schedule_delayed_work(&cinergyt2->rc_query_work, msecs_to_jiffies(RC_QUERY_INTERVAL)); - mutex_unlock(&cinergyt2->sem); + up(&cinergyt2->sem); } static int cinergyt2_register_rc(struct cinergyt2 *cinergyt2) @@ -856,7 +849,7 @@ static void cinergyt2_query (void *data) uint8_t lock_bits; uint32_t unc; - if (cinergyt2->disconnect_pending || mutex_lock_interruptible(&cinergyt2->sem)) + if (cinergyt2->disconnect_pending || down_interruptible(&cinergyt2->sem)) return; unc = s->uncorrected_block_count; @@ -875,7 +868,7 @@ static void cinergyt2_query (void *data) schedule_delayed_work(&cinergyt2->query_work, msecs_to_jiffies(QUERY_INTERVAL)); - mutex_unlock(&cinergyt2->sem); + up(&cinergyt2->sem); } static int cinergyt2_probe (struct usb_interface *intf, @@ -892,7 +885,7 @@ static int cinergyt2_probe (struct usb_interface *intf, memset (cinergyt2, 0, sizeof (struct cinergyt2)); usb_set_intfdata (intf, (void *) cinergyt2); - mutex_init(&cinergyt2->sem); + init_MUTEX(&cinergyt2->sem); init_waitqueue_head (&cinergyt2->poll_wq); INIT_WORK(&cinergyt2->query_work, cinergyt2_query, cinergyt2); @@ -905,10 +898,7 @@ static int cinergyt2_probe (struct usb_interface *intf, return -ENOMEM; } - if ((err = dvb_register_adapter(&cinergyt2->adapter, DRIVER_NAME, THIS_MODULE, &cinergyt2->udev->dev)) < 0) { - kfree(cinergyt2); - return err; - } + dvb_register_adapter(&cinergyt2->adapter, DRIVER_NAME, THIS_MODULE); cinergyt2->demux.priv = cinergyt2; cinergyt2->demux.filternum = 256; @@ -947,7 +937,6 @@ static int cinergyt2_probe (struct usb_interface *intf, return 0; bailout: - dvb_net_release(&cinergyt2->dvbnet); dvb_dmxdev_release(&cinergyt2->dmxdev); dvb_dmx_release(&cinergyt2->demux); dvb_unregister_adapter(&cinergyt2->adapter); @@ -978,7 +967,7 @@ static int cinergyt2_suspend (struct usb_interface *intf, pm_message_t state) { struct cinergyt2 *cinergyt2 = usb_get_intfdata (intf); - if (cinergyt2->disconnect_pending || mutex_lock_interruptible(&cinergyt2->sem)) + if (cinergyt2->disconnect_pending || down_interruptible(&cinergyt2->sem)) return -ERESTARTSYS; if (state.event > PM_EVENT_ON) { @@ -992,7 +981,7 @@ static int cinergyt2_suspend (struct usb_interface *intf, pm_message_t state) cinergyt2_sleep(cinergyt2, 1); } - mutex_unlock(&cinergyt2->sem); + up(&cinergyt2->sem); return 0; } @@ -1001,7 +990,7 @@ static int cinergyt2_resume (struct usb_interface *intf) struct cinergyt2 *cinergyt2 = usb_get_intfdata (intf); struct dvbt_set_parameters_msg *param = &cinergyt2->param; - if (cinergyt2->disconnect_pending || mutex_lock_interruptible(&cinergyt2->sem)) + if (cinergyt2->disconnect_pending || down_interruptible(&cinergyt2->sem)) return -ERESTARTSYS; if (!cinergyt2->sleeping) { @@ -1014,7 +1003,7 @@ static int cinergyt2_resume (struct usb_interface *intf) cinergyt2_resume_rc(cinergyt2); - mutex_unlock(&cinergyt2->sem); + up(&cinergyt2->sem); return 0; } diff --git a/drivers/media/dvb/dvb-core/Makefile b/drivers/media/dvb/dvb-core/Makefile index 0b5182835..7adb50c1e 100644 --- a/drivers/media/dvb/dvb-core/Makefile +++ b/drivers/media/dvb/dvb-core/Makefile @@ -2,8 +2,8 @@ # Makefile for the kernel DVB device drivers. # -dvb-core-objs := dvbdev.o dmxdev.o dvb_demux.o dvb_filter.o \ - dvb_ca_en50221.o dvb_frontend.o \ - dvb_net.o dvb_ringbuffer.o dvb_math.o +dvb-core-objs = dvbdev.o dmxdev.o dvb_demux.o dvb_filter.o \ + dvb_ca_en50221.o dvb_frontend.o \ + dvb_net.o dvb_ringbuffer.o obj-$(CONFIG_DVB_CORE) += dvb-core.o diff --git a/drivers/media/dvb/dvb-core/dmxdev.c b/drivers/media/dvb/dvb-core/dmxdev.c index 988499dfd..7b8373ad1 100644 --- a/drivers/media/dvb/dvb-core/dmxdev.c +++ b/drivers/media/dvb/dvb-core/dmxdev.c @@ -1,8 +1,9 @@ /* * dmxdev.c - DVB demultiplexer device * - * Copyright (C) 2000 Ralph Metzler & Marcus Metzler - * for convergence integrated media GmbH + * Copyright (C) 2000 Ralph Metzler + * & Marcus Metzler + for convergence integrated media GmbH * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -31,6 +32,7 @@ #include #include #include + #include "dmxdev.h" static int debug; @@ -40,139 +42,177 @@ MODULE_PARM_DESC(debug, "Turn on/off debugging (default:off)."); #define dprintk if (debug) printk -static int dvb_dmxdev_buffer_write(struct dvb_ringbuffer *buf, - const u8 *src, size_t len) +static inline void dvb_dmxdev_buffer_init(struct dmxdev_buffer *buffer) { - ssize_t free; + buffer->data=NULL; + buffer->size=8192; + buffer->pread=0; + buffer->pwrite=0; + buffer->error=0; + init_waitqueue_head(&buffer->queue); +} + +static inline int dvb_dmxdev_buffer_write(struct dmxdev_buffer *buf, const u8 *src, int len) +{ + int split; + int free; + int todo; if (!len) return 0; if (!buf->data) return 0; - free = dvb_ringbuffer_free(buf); - if (len > free) { + free=buf->pread-buf->pwrite; + split=0; + if (free<=0) { + free+=buf->size; + split=buf->size-buf->pwrite; + } + if (len>=free) { dprintk("dmxdev: buffer overflow\n"); - return -EOVERFLOW; + return -1; } - - return dvb_ringbuffer_write(buf, src, len); + if (split>=len) + split=0; + todo=len; + if (split) { + memcpy(buf->data + buf->pwrite, src, split); + todo-=split; + buf->pwrite=0; + } + memcpy(buf->data + buf->pwrite, src+split, todo); + buf->pwrite=(buf->pwrite+todo)%buf->size; + return len; } -static ssize_t dvb_dmxdev_buffer_read(struct dvb_ringbuffer *src, - int non_blocking, char __user *buf, - size_t count, loff_t *ppos) +static ssize_t dvb_dmxdev_buffer_read(struct dmxdev_buffer *src, + int non_blocking, char __user *buf, size_t count, loff_t *ppos) { - size_t todo; - ssize_t avail; - ssize_t ret = 0; + unsigned long todo=count; + int split, avail, error; if (!src->data) return 0; - if (src->error) { - ret = src->error; - dvb_ringbuffer_flush(src); - return ret; + if ((error=src->error)) { + src->pwrite=src->pread; + src->error=0; + return error; } - for (todo = count; todo > 0; todo -= ret) { - if (non_blocking && dvb_ringbuffer_empty(src)) { - ret = -EWOULDBLOCK; - break; - } - - ret = wait_event_interruptible(src->queue, - !dvb_ringbuffer_empty(src) || - (src->error != 0)); - if (ret < 0) - break; + if (non_blocking && (src->pwrite==src->pread)) + return -EWOULDBLOCK; - if (src->error) { - ret = src->error; - dvb_ringbuffer_flush(src); - break; - } + while (todo>0) { + if (non_blocking && (src->pwrite==src->pread)) + return (count-todo) ? (count-todo) : -EWOULDBLOCK; - avail = dvb_ringbuffer_avail(src); - if (avail > todo) - avail = todo; + if (wait_event_interruptible(src->queue, + (src->pread!=src->pwrite) || + (src->error))<0) + return count-todo; - ret = dvb_ringbuffer_read(src, buf, avail, 1); - if (ret < 0) - break; + if ((error=src->error)) { + src->pwrite=src->pread; + src->error=0; + return error; + } - buf += ret; + split=src->size; + avail=src->pwrite - src->pread; + if (avail<0) { + avail+=src->size; + split=src->size - src->pread; + } + if (avail>todo) + avail=todo; + if (splitdata+src->pread, split)) + return -EFAULT; + buf+=split; + src->pread=0; + todo-=split; + avail-=split; + } + if (avail) { + if (copy_to_user(buf, src->data+src->pread, avail)) + return -EFAULT; + src->pread = (src->pread + avail) % src->size; + todo-=avail; + buf+=avail; + } } - - return (count - todo) ? (count - todo) : ret; + return count; } -static struct dmx_frontend *get_fe(struct dmx_demux *demux, int type) +static struct dmx_frontend * get_fe(struct dmx_demux *demux, int type) { struct list_head *head, *pos; - head = demux->get_frontends(demux); + head=demux->get_frontends(demux); if (!head) return NULL; list_for_each(pos, head) - if (DMX_FE_ENTRY(pos)->source == type) + if (DMX_FE_ENTRY(pos)->source==type) return DMX_FE_ENTRY(pos); return NULL; } +static inline void dvb_dmxdev_dvr_state_set(struct dmxdev_dvr *dmxdevdvr, int state) +{ + spin_lock_irq(&dmxdevdvr->dev->lock); + dmxdevdvr->state=state; + spin_unlock_irq(&dmxdevdvr->dev->lock); +} + static int dvb_dvr_open(struct inode *inode, struct file *file) { struct dvb_device *dvbdev = file->private_data; struct dmxdev *dmxdev = dvbdev->priv; struct dmx_frontend *front; - dprintk("function : %s\n", __FUNCTION__); + dprintk ("function : %s\n", __FUNCTION__); - if (mutex_lock_interruptible(&dmxdev->mutex)) + if (down_interruptible (&dmxdev->mutex)) return -ERESTARTSYS; - if ((file->f_flags & O_ACCMODE) == O_RDWR) { - if (!(dmxdev->capabilities & DMXDEV_CAP_DUPLEX)) { - mutex_unlock(&dmxdev->mutex); + if ((file->f_flags&O_ACCMODE)==O_RDWR) { + if (!(dmxdev->capabilities&DMXDEV_CAP_DUPLEX)) { + up(&dmxdev->mutex); return -EOPNOTSUPP; } } - if ((file->f_flags & O_ACCMODE) == O_RDONLY) { - void *mem; - if (!dvbdev->readers) { - mutex_unlock(&dmxdev->mutex); - return -EBUSY; - } - mem = vmalloc(DVR_BUFFER_SIZE); - if (!mem) { - mutex_unlock(&dmxdev->mutex); - return -ENOMEM; - } - dvb_ringbuffer_init(&dmxdev->dvr_buffer, mem, DVR_BUFFER_SIZE); - dvbdev->readers--; + if ((file->f_flags&O_ACCMODE)==O_RDONLY) { + dvb_dmxdev_buffer_init(&dmxdev->dvr_buffer); + dmxdev->dvr_buffer.size=DVR_BUFFER_SIZE; + dmxdev->dvr_buffer.data=vmalloc(DVR_BUFFER_SIZE); + if (!dmxdev->dvr_buffer.data) { + up(&dmxdev->mutex); + return -ENOMEM; + } } - if ((file->f_flags & O_ACCMODE) == O_WRONLY) { - dmxdev->dvr_orig_fe = dmxdev->demux->frontend; + if ((file->f_flags&O_ACCMODE)==O_WRONLY) { + dmxdev->dvr_orig_fe=dmxdev->demux->frontend; if (!dmxdev->demux->write) { - mutex_unlock(&dmxdev->mutex); + up(&dmxdev->mutex); return -EOPNOTSUPP; } - front = get_fe(dmxdev->demux, DMX_MEMORY_FE); + front=get_fe(dmxdev->demux, DMX_MEMORY_FE); if (!front) { - mutex_unlock(&dmxdev->mutex); + up(&dmxdev->mutex); return -EINVAL; } dmxdev->demux->disconnect_frontend(dmxdev->demux); dmxdev->demux->connect_frontend(dmxdev->demux, front); } - mutex_unlock(&dmxdev->mutex); + up(&dmxdev->mutex); return 0; } @@ -181,31 +221,30 @@ static int dvb_dvr_release(struct inode *inode, struct file *file) struct dvb_device *dvbdev = file->private_data; struct dmxdev *dmxdev = dvbdev->priv; - if (mutex_lock_interruptible(&dmxdev->mutex)) + if (down_interruptible (&dmxdev->mutex)) return -ERESTARTSYS; - if ((file->f_flags & O_ACCMODE) == O_WRONLY) { + if ((file->f_flags&O_ACCMODE)==O_WRONLY) { dmxdev->demux->disconnect_frontend(dmxdev->demux); dmxdev->demux->connect_frontend(dmxdev->demux, dmxdev->dvr_orig_fe); } - if ((file->f_flags & O_ACCMODE) == O_RDONLY) { - dvbdev->readers++; + if ((file->f_flags&O_ACCMODE)==O_RDONLY) { if (dmxdev->dvr_buffer.data) { - void *mem = dmxdev->dvr_buffer.data; + void *mem=dmxdev->dvr_buffer.data; mb(); spin_lock_irq(&dmxdev->lock); - dmxdev->dvr_buffer.data = NULL; + dmxdev->dvr_buffer.data=NULL; spin_unlock_irq(&dmxdev->lock); vfree(mem); } } - mutex_unlock(&dmxdev->mutex); + up(&dmxdev->mutex); return 0; } static ssize_t dvb_dvr_write(struct file *file, const char __user *buf, - size_t count, loff_t *ppos) + size_t count, loff_t *ppos) { struct dvb_device *dvbdev = file->private_data; struct dmxdev *dmxdev = dvbdev->priv; @@ -213,62 +252,60 @@ static ssize_t dvb_dvr_write(struct file *file, const char __user *buf, if (!dmxdev->demux->write) return -EOPNOTSUPP; - if ((file->f_flags & O_ACCMODE) != O_WRONLY) + if ((file->f_flags&O_ACCMODE)!=O_WRONLY) return -EINVAL; - if (mutex_lock_interruptible(&dmxdev->mutex)) + if (down_interruptible (&dmxdev->mutex)) return -ERESTARTSYS; - ret = dmxdev->demux->write(dmxdev->demux, buf, count); - mutex_unlock(&dmxdev->mutex); + ret=dmxdev->demux->write(dmxdev->demux, buf, count); + up(&dmxdev->mutex); return ret; } static ssize_t dvb_dvr_read(struct file *file, char __user *buf, size_t count, - loff_t *ppos) + loff_t *ppos) { struct dvb_device *dvbdev = file->private_data; struct dmxdev *dmxdev = dvbdev->priv; int ret; - //mutex_lock(&dmxdev->mutex); - ret = dvb_dmxdev_buffer_read(&dmxdev->dvr_buffer, - file->f_flags & O_NONBLOCK, - buf, count, ppos); - //mutex_unlock(&dmxdev->mutex); + //down(&dmxdev->mutex); + ret= dvb_dmxdev_buffer_read(&dmxdev->dvr_buffer, + file->f_flags&O_NONBLOCK, + buf, count, ppos); + //up(&dmxdev->mutex); return ret; } -static inline void dvb_dmxdev_filter_state_set(struct dmxdev_filter - *dmxdevfilter, int state) +static inline void dvb_dmxdev_filter_state_set(struct dmxdev_filter *dmxdevfilter, int state) { spin_lock_irq(&dmxdevfilter->dev->lock); - dmxdevfilter->state = state; + dmxdevfilter->state=state; spin_unlock_irq(&dmxdevfilter->dev->lock); } -static int dvb_dmxdev_set_buffer_size(struct dmxdev_filter *dmxdevfilter, - unsigned long size) +static int dvb_dmxdev_set_buffer_size(struct dmxdev_filter *dmxdevfilter, unsigned long size) { - struct dvb_ringbuffer *buf = &dmxdevfilter->buffer; + struct dmxdev_buffer *buf=&dmxdevfilter->buffer; void *mem; - if (buf->size == size) + if (buf->size==size) return 0; - if (dmxdevfilter->state >= DMXDEV_STATE_GO) + if (dmxdevfilter->state>=DMXDEV_STATE_GO) return -EBUSY; spin_lock_irq(&dmxdevfilter->dev->lock); - mem = buf->data; - buf->data = NULL; - buf->size = size; - dvb_ringbuffer_flush(buf); + mem=buf->data; + buf->data=NULL; + buf->size=size; + buf->pwrite=buf->pread=0; spin_unlock_irq(&dmxdevfilter->dev->lock); vfree(mem); if (buf->size) { - mem = vmalloc(dmxdevfilter->buffer.size); + mem=vmalloc(dmxdevfilter->buffer.size); if (!mem) return -ENOMEM; spin_lock_irq(&dmxdevfilter->dev->lock); - buf->data = mem; + buf->data=mem; spin_unlock_irq(&dmxdevfilter->dev->lock); } return 0; @@ -276,33 +313,31 @@ static int dvb_dmxdev_set_buffer_size(struct dmxdev_filter *dmxdevfilter, static void dvb_dmxdev_filter_timeout(unsigned long data) { - struct dmxdev_filter *dmxdevfilter = (struct dmxdev_filter *)data; + struct dmxdev_filter *dmxdevfilter=(struct dmxdev_filter *)data; - dmxdevfilter->buffer.error = -ETIMEDOUT; + dmxdevfilter->buffer.error=-ETIMEDOUT; spin_lock_irq(&dmxdevfilter->dev->lock); - dmxdevfilter->state = DMXDEV_STATE_TIMEDOUT; + dmxdevfilter->state=DMXDEV_STATE_TIMEDOUT; spin_unlock_irq(&dmxdevfilter->dev->lock); wake_up(&dmxdevfilter->buffer.queue); } static void dvb_dmxdev_filter_timer(struct dmxdev_filter *dmxdevfilter) { - struct dmx_sct_filter_params *para = &dmxdevfilter->params.sec; + struct dmx_sct_filter_params *para=&dmxdevfilter->params.sec; del_timer(&dmxdevfilter->timer); if (para->timeout) { - dmxdevfilter->timer.function = dvb_dmxdev_filter_timeout; - dmxdevfilter->timer.data = (unsigned long)dmxdevfilter; - dmxdevfilter->timer.expires = - jiffies + 1 + (HZ / 2 + HZ * para->timeout) / 1000; + dmxdevfilter->timer.function=dvb_dmxdev_filter_timeout; + dmxdevfilter->timer.data=(unsigned long) dmxdevfilter; + dmxdevfilter->timer.expires=jiffies+1+(HZ/2+HZ*para->timeout)/1000; add_timer(&dmxdevfilter->timer); } } static int dvb_dmxdev_section_callback(const u8 *buffer1, size_t buffer1_len, - const u8 *buffer2, size_t buffer2_len, - struct dmx_section_filter *filter, - enum dmx_success success) + const u8 *buffer2, size_t buffer2_len, + struct dmx_section_filter *filter, enum dmx_success success) { struct dmxdev_filter *dmxdevfilter = filter->priv; int ret; @@ -312,68 +347,68 @@ static int dvb_dmxdev_section_callback(const u8 *buffer1, size_t buffer1_len, return 0; } spin_lock(&dmxdevfilter->dev->lock); - if (dmxdevfilter->state != DMXDEV_STATE_GO) { + if (dmxdevfilter->state!=DMXDEV_STATE_GO) { spin_unlock(&dmxdevfilter->dev->lock); return 0; } del_timer(&dmxdevfilter->timer); dprintk("dmxdev: section callback %02x %02x %02x %02x %02x %02x\n", buffer1[0], buffer1[1], - buffer1[2], buffer1[3], buffer1[4], buffer1[5]); - ret = dvb_dmxdev_buffer_write(&dmxdevfilter->buffer, buffer1, - buffer1_len); - if (ret == buffer1_len) { - ret = dvb_dmxdev_buffer_write(&dmxdevfilter->buffer, buffer2, - buffer2_len); + buffer1[2], buffer1[3], + buffer1[4], buffer1[5]); + ret=dvb_dmxdev_buffer_write(&dmxdevfilter->buffer, buffer1, buffer1_len); + if (ret==buffer1_len) { + ret=dvb_dmxdev_buffer_write(&dmxdevfilter->buffer, buffer2, buffer2_len); } - if (ret < 0) { - dvb_ringbuffer_flush(&dmxdevfilter->buffer); - dmxdevfilter->buffer.error = ret; + if (ret<0) { + dmxdevfilter->buffer.pwrite=dmxdevfilter->buffer.pread; + dmxdevfilter->buffer.error=-EOVERFLOW; } - if (dmxdevfilter->params.sec.flags & DMX_ONESHOT) - dmxdevfilter->state = DMXDEV_STATE_DONE; + if (dmxdevfilter->params.sec.flags&DMX_ONESHOT) + dmxdevfilter->state=DMXDEV_STATE_DONE; spin_unlock(&dmxdevfilter->dev->lock); wake_up(&dmxdevfilter->buffer.queue); return 0; } static int dvb_dmxdev_ts_callback(const u8 *buffer1, size_t buffer1_len, - const u8 *buffer2, size_t buffer2_len, - struct dmx_ts_feed *feed, - enum dmx_success success) + const u8 *buffer2, size_t buffer2_len, + struct dmx_ts_feed *feed, enum dmx_success success) { struct dmxdev_filter *dmxdevfilter = feed->priv; - struct dvb_ringbuffer *buffer; + struct dmxdev_buffer *buffer; int ret; spin_lock(&dmxdevfilter->dev->lock); - if (dmxdevfilter->params.pes.output == DMX_OUT_DECODER) { + if (dmxdevfilter->params.pes.output==DMX_OUT_DECODER) { spin_unlock(&dmxdevfilter->dev->lock); return 0; } - if (dmxdevfilter->params.pes.output == DMX_OUT_TAP) - buffer = &dmxdevfilter->buffer; + if (dmxdevfilter->params.pes.output==DMX_OUT_TAP) + buffer=&dmxdevfilter->buffer; else - buffer = &dmxdevfilter->dev->dvr_buffer; + buffer=&dmxdevfilter->dev->dvr_buffer; if (buffer->error) { spin_unlock(&dmxdevfilter->dev->lock); wake_up(&buffer->queue); return 0; } - ret = dvb_dmxdev_buffer_write(buffer, buffer1, buffer1_len); - if (ret == buffer1_len) - ret = dvb_dmxdev_buffer_write(buffer, buffer2, buffer2_len); - if (ret < 0) { - dvb_ringbuffer_flush(buffer); - buffer->error = ret; + ret=dvb_dmxdev_buffer_write(buffer, buffer1, buffer1_len); + if (ret==buffer1_len) + ret=dvb_dmxdev_buffer_write(buffer, buffer2, buffer2_len); + if (ret<0) { + buffer->pwrite=buffer->pread; + buffer->error=-EOVERFLOW; } spin_unlock(&dmxdevfilter->dev->lock); wake_up(&buffer->queue); return 0; } + /* stop feed but only mark the specified filter as stopped (state set) */ + static int dvb_dmxdev_feed_stop(struct dmxdev_filter *dmxdevfilter) { dvb_dmxdev_filter_state_set(dmxdevfilter, DMXDEV_STATE_SET); @@ -392,16 +427,20 @@ static int dvb_dmxdev_feed_stop(struct dmxdev_filter *dmxdevfilter) return 0; } + /* start feed associated with the specified filter */ + static int dvb_dmxdev_feed_start(struct dmxdev_filter *filter) { - dvb_dmxdev_filter_state_set(filter, DMXDEV_STATE_GO); + dvb_dmxdev_filter_state_set (filter, DMXDEV_STATE_GO); switch (filter->type) { case DMXDEV_TYPE_SEC: return filter->feed.sec->start_filtering(filter->feed.sec); + break; case DMXDEV_TYPE_PES: return filter->feed.ts->start_filtering(filter->feed.ts); + break; default: return -EINVAL; } @@ -409,31 +448,32 @@ static int dvb_dmxdev_feed_start(struct dmxdev_filter *filter) return 0; } + /* restart section feed if it has filters left associated with it, otherwise release the feed */ + static int dvb_dmxdev_feed_restart(struct dmxdev_filter *filter) { int i; struct dmxdev *dmxdev = filter->dev; u16 pid = filter->params.sec.pid; - for (i = 0; i < dmxdev->filternum; i++) - if (dmxdev->filter[i].state >= DMXDEV_STATE_GO && - dmxdev->filter[i].type == DMXDEV_TYPE_SEC && - dmxdev->filter[i].params.sec.pid == pid) { + for (i=0; ifilternum; i++) + if (dmxdev->filter[i].state>=DMXDEV_STATE_GO && + dmxdev->filter[i].type==DMXDEV_TYPE_SEC && + dmxdev->filter[i].pid==pid) { dvb_dmxdev_feed_start(&dmxdev->filter[i]); return 0; } - filter->dev->demux->release_section_feed(dmxdev->demux, - filter->feed.sec); + filter->dev->demux->release_section_feed(dmxdev->demux, filter->feed.sec); return 0; } static int dvb_dmxdev_filter_stop(struct dmxdev_filter *dmxdevfilter) { - if (dmxdevfilter->state < DMXDEV_STATE_GO) + if (dmxdevfilter->statetype) { @@ -443,36 +483,36 @@ static int dvb_dmxdev_filter_stop(struct dmxdev_filter *dmxdevfilter) dvb_dmxdev_feed_stop(dmxdevfilter); if (dmxdevfilter->filter.sec) dmxdevfilter->feed.sec-> - release_filter(dmxdevfilter->feed.sec, - dmxdevfilter->filter.sec); + release_filter(dmxdevfilter->feed.sec, + dmxdevfilter->filter.sec); dvb_dmxdev_feed_restart(dmxdevfilter); - dmxdevfilter->feed.sec = NULL; + dmxdevfilter->feed.sec=NULL; break; case DMXDEV_TYPE_PES: if (!dmxdevfilter->feed.ts) break; dvb_dmxdev_feed_stop(dmxdevfilter); dmxdevfilter->dev->demux-> - release_ts_feed(dmxdevfilter->dev->demux, - dmxdevfilter->feed.ts); - dmxdevfilter->feed.ts = NULL; + release_ts_feed(dmxdevfilter->dev->demux, + dmxdevfilter->feed.ts); + dmxdevfilter->feed.ts=NULL; break; default: - if (dmxdevfilter->state == DMXDEV_STATE_ALLOCATED) + if (dmxdevfilter->state==DMXDEV_STATE_ALLOCATED) return 0; return -EINVAL; } - - dvb_ringbuffer_flush(&dmxdevfilter->buffer); + dmxdevfilter->buffer.pwrite=dmxdevfilter->buffer.pread=0; return 0; } static inline int dvb_dmxdev_filter_reset(struct dmxdev_filter *dmxdevfilter) { - if (dmxdevfilter->state < DMXDEV_STATE_SET) + if (dmxdevfilter->statetype = DMXDEV_TYPE_NONE; + dmxdevfilter->type=DMXDEV_TYPE_NONE; + dmxdevfilter->pid=0xffff; dvb_dmxdev_filter_state_set(dmxdevfilter, DMXDEV_STATE_ALLOCATED); return 0; } @@ -489,33 +529,32 @@ static int dvb_dmxdev_filter_start(struct dmxdev_filter *filter) if (filter->state >= DMXDEV_STATE_GO) dvb_dmxdev_filter_stop(filter); - if (!filter->buffer.data) { + if (!(mem = filter->buffer.data)) { mem = vmalloc(filter->buffer.size); - if (!mem) - return -ENOMEM; spin_lock_irq(&filter->dev->lock); - filter->buffer.data = mem; + filter->buffer.data=mem; spin_unlock_irq(&filter->dev->lock); + if (!filter->buffer.data) + return -ENOMEM; } - dvb_ringbuffer_flush(&filter->buffer); + filter->buffer.pwrite = filter->buffer.pread = 0; switch (filter->type) { case DMXDEV_TYPE_SEC: { - struct dmx_sct_filter_params *para = &filter->params.sec; - struct dmx_section_filter **secfilter = &filter->filter.sec; - struct dmx_section_feed **secfeed = &filter->feed.sec; - - *secfilter = NULL; - *secfeed = NULL; + struct dmx_sct_filter_params *para=&filter->params.sec; + struct dmx_section_filter **secfilter=&filter->filter.sec; + struct dmx_section_feed **secfeed=&filter->feed.sec; + *secfilter=NULL; + *secfeed=NULL; /* find active filter/feed with same PID */ - for (i = 0; i < dmxdev->filternum; i++) { + for (i=0; ifilternum; i++) { if (dmxdev->filter[i].state >= DMXDEV_STATE_GO && - dmxdev->filter[i].type == DMXDEV_TYPE_SEC && - dmxdev->filter[i].params.sec.pid == para->pid) { + dmxdev->filter[i].pid == para->pid && + dmxdev->filter[i].type == DMXDEV_TYPE_SEC) { *secfeed = dmxdev->filter[i].feed.sec; break; } @@ -523,20 +562,21 @@ static int dvb_dmxdev_filter_start(struct dmxdev_filter *filter) /* if no feed found, try to allocate new one */ if (!*secfeed) { - ret = dmxdev->demux->allocate_section_feed(dmxdev->demux, - secfeed, - dvb_dmxdev_section_callback); - if (ret < 0) { - printk("DVB (%s): could not alloc feed\n", - __FUNCTION__); + ret=dmxdev->demux->allocate_section_feed(dmxdev->demux, + secfeed, + dvb_dmxdev_section_callback); + if (ret<0) { + printk ("DVB (%s): could not alloc feed\n", + __FUNCTION__); return ret; } - ret = (*secfeed)->set(*secfeed, para->pid, 32768, - (para->flags & DMX_CHECK_CRC) ? 1 : 0); - if (ret < 0) { - printk("DVB (%s): could not set feed\n", - __FUNCTION__); + ret=(*secfeed)->set(*secfeed, para->pid, 32768, + (para->flags & DMX_CHECK_CRC) ? 1 : 0); + + if (ret<0) { + printk ("DVB (%s): could not set feed\n", + __FUNCTION__); dvb_dmxdev_feed_restart(filter); return ret; } @@ -544,38 +584,41 @@ static int dvb_dmxdev_filter_start(struct dmxdev_filter *filter) dvb_dmxdev_feed_stop(filter); } - ret = (*secfeed)->allocate_filter(*secfeed, secfilter); + ret=(*secfeed)->allocate_filter(*secfeed, secfilter); + if (ret < 0) { dvb_dmxdev_feed_restart(filter); filter->feed.sec->start_filtering(*secfeed); - dprintk("could not get filter\n"); + dprintk ("could not get filter\n"); return ret; } (*secfilter)->priv = filter; memcpy(&((*secfilter)->filter_value[3]), - &(para->filter.filter[1]), DMX_FILTER_SIZE - 1); + &(para->filter.filter[1]), DMX_FILTER_SIZE-1); memcpy(&(*secfilter)->filter_mask[3], - ¶->filter.mask[1], DMX_FILTER_SIZE - 1); + ¶->filter.mask[1], DMX_FILTER_SIZE-1); memcpy(&(*secfilter)->filter_mode[3], - ¶->filter.mode[1], DMX_FILTER_SIZE - 1); + ¶->filter.mode[1], DMX_FILTER_SIZE-1); - (*secfilter)->filter_value[0] = para->filter.filter[0]; - (*secfilter)->filter_mask[0] = para->filter.mask[0]; - (*secfilter)->filter_mode[0] = para->filter.mode[0]; - (*secfilter)->filter_mask[1] = 0; - (*secfilter)->filter_mask[2] = 0; + (*secfilter)->filter_value[0]=para->filter.filter[0]; + (*secfilter)->filter_mask[0]=para->filter.mask[0]; + (*secfilter)->filter_mode[0]=para->filter.mode[0]; + (*secfilter)->filter_mask[1]=0; + (*secfilter)->filter_mask[2]=0; filter->todo = 0; - ret = filter->feed.sec->start_filtering(filter->feed.sec); + ret = filter->feed.sec->start_filtering (filter->feed.sec); + if (ret < 0) return ret; dvb_dmxdev_filter_timer(filter); break; } + case DMXDEV_TYPE_PES: { struct timespec timeout = { 0 }; @@ -587,41 +630,41 @@ static int dvb_dmxdev_filter_start(struct dmxdev_filter *filter) struct dmx_ts_feed **tsfeed = &filter->feed.ts; filter->feed.ts = NULL; - otype = para->output; + otype=para->output; - ts_pes = (enum dmx_ts_pes)para->pes_type; + ts_pes=(enum dmx_ts_pes) para->pes_type; - if (ts_pes < DMX_PES_OTHER) - ts_type = TS_DECODER; + if (ts_pesdemux->allocate_ts_feed(dmxdev->demux, - tsfeed, - dvb_dmxdev_ts_callback); - if (ret < 0) + ret=dmxdev->demux->allocate_ts_feed(dmxdev->demux, + tsfeed, + dvb_dmxdev_ts_callback); + if (ret<0) return ret; - (*tsfeed)->priv = filter; + (*tsfeed)->priv = (void *) filter; ret = (*tsfeed)->set(*tsfeed, para->pid, ts_type, ts_pes, 32768, timeout); + if (ret < 0) { - dmxdev->demux->release_ts_feed(dmxdev->demux, - *tsfeed); + dmxdev->demux->release_ts_feed(dmxdev->demux, *tsfeed); return ret; } ret = filter->feed.ts->start_filtering(filter->feed.ts); + if (ret < 0) { - dmxdev->demux->release_ts_feed(dmxdev->demux, - *tsfeed); + dmxdev->demux->release_ts_feed(dmxdev->demux, *tsfeed); return ret; } @@ -645,40 +688,41 @@ static int dvb_demux_open(struct inode *inode, struct file *file) if (!dmxdev->filter) return -EINVAL; - if (mutex_lock_interruptible(&dmxdev->mutex)) + if (down_interruptible(&dmxdev->mutex)) return -ERESTARTSYS; - for (i = 0; i < dmxdev->filternum; i++) - if (dmxdev->filter[i].state == DMXDEV_STATE_FREE) + for (i=0; ifilternum; i++) + if (dmxdev->filter[i].state==DMXDEV_STATE_FREE) break; - if (i == dmxdev->filternum) { - mutex_unlock(&dmxdev->mutex); + if (i==dmxdev->filternum) { + up(&dmxdev->mutex); return -EMFILE; } - dmxdevfilter = &dmxdev->filter[i]; - mutex_init(&dmxdevfilter->mutex); - file->private_data = dmxdevfilter; + dmxdevfilter=&dmxdev->filter[i]; + sema_init(&dmxdevfilter->mutex, 1); + dmxdevfilter->dvbdev=dmxdev->dvbdev; + file->private_data=dmxdevfilter; - dvb_ringbuffer_init(&dmxdevfilter->buffer, NULL, 8192); - dmxdevfilter->type = DMXDEV_TYPE_NONE; + dvb_dmxdev_buffer_init(&dmxdevfilter->buffer); + dmxdevfilter->type=DMXDEV_TYPE_NONE; dvb_dmxdev_filter_state_set(dmxdevfilter, DMXDEV_STATE_ALLOCATED); - dmxdevfilter->feed.ts = NULL; + dmxdevfilter->feed.ts=NULL; init_timer(&dmxdevfilter->timer); - mutex_unlock(&dmxdev->mutex); + up(&dmxdev->mutex); return 0; } -static int dvb_dmxdev_filter_free(struct dmxdev *dmxdev, - struct dmxdev_filter *dmxdevfilter) + +static int dvb_dmxdev_filter_free(struct dmxdev *dmxdev, struct dmxdev_filter *dmxdevfilter) { - if (mutex_lock_interruptible(&dmxdev->mutex)) + if (down_interruptible(&dmxdev->mutex)) return -ERESTARTSYS; - if (mutex_lock_interruptible(&dmxdevfilter->mutex)) { - mutex_unlock(&dmxdev->mutex); + if (down_interruptible(&dmxdevfilter->mutex)) { + up(&dmxdev->mutex); return -ERESTARTSYS; } @@ -686,18 +730,18 @@ static int dvb_dmxdev_filter_free(struct dmxdev *dmxdev, dvb_dmxdev_filter_reset(dmxdevfilter); if (dmxdevfilter->buffer.data) { - void *mem = dmxdevfilter->buffer.data; + void *mem=dmxdevfilter->buffer.data; spin_lock_irq(&dmxdev->lock); - dmxdevfilter->buffer.data = NULL; + dmxdevfilter->buffer.data=NULL; spin_unlock_irq(&dmxdev->lock); vfree(mem); } dvb_dmxdev_filter_state_set(dmxdevfilter, DMXDEV_STATE_FREE); wake_up(&dmxdevfilter->buffer.queue); - mutex_unlock(&dmxdevfilter->mutex); - mutex_unlock(&dmxdev->mutex); + up(&dmxdevfilter->mutex); + up(&dmxdev->mutex); return 0; } @@ -705,179 +749,184 @@ static inline void invert_mode(dmx_filter_t *filter) { int i; - for (i = 0; i < DMX_FILTER_SIZE; i++) - filter->mode[i] ^= 0xff; + for (i=0; imode[i]^=0xff; } + static int dvb_dmxdev_filter_set(struct dmxdev *dmxdev, - struct dmxdev_filter *dmxdevfilter, - struct dmx_sct_filter_params *params) + struct dmxdev_filter *dmxdevfilter, + struct dmx_sct_filter_params *params) { - dprintk("function : %s\n", __FUNCTION__); + dprintk ("function : %s\n", __FUNCTION__); dvb_dmxdev_filter_stop(dmxdevfilter); - dmxdevfilter->type = DMXDEV_TYPE_SEC; + dmxdevfilter->type=DMXDEV_TYPE_SEC; + dmxdevfilter->pid=params->pid; memcpy(&dmxdevfilter->params.sec, params, sizeof(struct dmx_sct_filter_params)); invert_mode(&dmxdevfilter->params.sec.filter); dvb_dmxdev_filter_state_set(dmxdevfilter, DMXDEV_STATE_SET); - if (params->flags & DMX_IMMEDIATE_START) + if (params->flags&DMX_IMMEDIATE_START) return dvb_dmxdev_filter_start(dmxdevfilter); return 0; } static int dvb_dmxdev_pes_filter_set(struct dmxdev *dmxdev, - struct dmxdev_filter *dmxdevfilter, - struct dmx_pes_filter_params *params) + struct dmxdev_filter *dmxdevfilter, + struct dmx_pes_filter_params *params) { dvb_dmxdev_filter_stop(dmxdevfilter); - if (params->pes_type > DMX_PES_OTHER || params->pes_type < 0) + if (params->pes_type>DMX_PES_OTHER || params->pes_type<0) return -EINVAL; - dmxdevfilter->type = DMXDEV_TYPE_PES; - memcpy(&dmxdevfilter->params, params, - sizeof(struct dmx_pes_filter_params)); + dmxdevfilter->type=DMXDEV_TYPE_PES; + dmxdevfilter->pid=params->pid; + memcpy(&dmxdevfilter->params, params, sizeof(struct dmx_pes_filter_params)); dvb_dmxdev_filter_state_set(dmxdevfilter, DMXDEV_STATE_SET); - if (params->flags & DMX_IMMEDIATE_START) + if (params->flags&DMX_IMMEDIATE_START) return dvb_dmxdev_filter_start(dmxdevfilter); return 0; } static ssize_t dvb_dmxdev_read_sec(struct dmxdev_filter *dfil, - struct file *file, char __user *buf, - size_t count, loff_t *ppos) + struct file *file, char __user *buf, size_t count, loff_t *ppos) { int result, hcount; - int done = 0; - - if (dfil->todo <= 0) { - hcount = 3 + dfil->todo; - if (hcount > count) - hcount = count; - result = dvb_dmxdev_buffer_read(&dfil->buffer, - file->f_flags & O_NONBLOCK, - buf, hcount, ppos); - if (result < 0) { - dfil->todo = 0; + int done=0; + + if (dfil->todo<=0) { + hcount=3+dfil->todo; + if (hcount>count) + hcount=count; + result=dvb_dmxdev_buffer_read(&dfil->buffer, file->f_flags&O_NONBLOCK, + buf, hcount, ppos); + if (result<0) { + dfil->todo=0; return result; } - if (copy_from_user(dfil->secheader - dfil->todo, buf, result)) + if (copy_from_user(dfil->secheader-dfil->todo, buf, result)) return -EFAULT; - buf += result; - done = result; - count -= result; - dfil->todo -= result; - if (dfil->todo > -3) + buf+=result; + done=result; + count-=result; + dfil->todo-=result; + if (dfil->todo>-3) return done; - dfil->todo = ((dfil->secheader[1] << 8) | dfil->secheader[2]) & 0xfff; + dfil->todo=((dfil->secheader[1]<<8)|dfil->secheader[2])&0xfff; if (!count) return done; } - if (count > dfil->todo) - count = dfil->todo; - result = dvb_dmxdev_buffer_read(&dfil->buffer, - file->f_flags & O_NONBLOCK, - buf, count, ppos); - if (result < 0) + if (count>dfil->todo) + count=dfil->todo; + result=dvb_dmxdev_buffer_read(&dfil->buffer, file->f_flags&O_NONBLOCK, + buf, count, ppos); + if (result<0) return result; - dfil->todo -= result; - return (result + done); + dfil->todo-=result; + return (result+done); } + static ssize_t -dvb_demux_read(struct file *file, char __user *buf, size_t count, - loff_t *ppos) +dvb_demux_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) { - struct dmxdev_filter *dmxdevfilter = file->private_data; - int ret; + struct dmxdev_filter *dmxdevfilter= file->private_data; + int ret=0; - if (mutex_lock_interruptible(&dmxdevfilter->mutex)) + if (down_interruptible(&dmxdevfilter->mutex)) return -ERESTARTSYS; - if (dmxdevfilter->type == DMXDEV_TYPE_SEC) - ret = dvb_dmxdev_read_sec(dmxdevfilter, file, buf, count, ppos); + if (dmxdevfilter->type==DMXDEV_TYPE_SEC) + ret=dvb_dmxdev_read_sec(dmxdevfilter, file, buf, count, ppos); else - ret = dvb_dmxdev_buffer_read(&dmxdevfilter->buffer, - file->f_flags & O_NONBLOCK, - buf, count, ppos); + ret=dvb_dmxdev_buffer_read(&dmxdevfilter->buffer, + file->f_flags&O_NONBLOCK, + buf, count, ppos); - mutex_unlock(&dmxdevfilter->mutex); + up(&dmxdevfilter->mutex); return ret; } + static int dvb_demux_do_ioctl(struct inode *inode, struct file *file, unsigned int cmd, void *parg) { struct dmxdev_filter *dmxdevfilter = file->private_data; - struct dmxdev *dmxdev = dmxdevfilter->dev; - unsigned long arg = (unsigned long)parg; - int ret = 0; + struct dmxdev *dmxdev=dmxdevfilter->dev; + unsigned long arg=(unsigned long) parg; + int ret=0; - if (mutex_lock_interruptible(&dmxdev->mutex)) + if (down_interruptible (&dmxdev->mutex)) return -ERESTARTSYS; switch (cmd) { case DMX_START: - if (mutex_lock_interruptible(&dmxdevfilter->mutex)) { - mutex_unlock(&dmxdev->mutex); + if (down_interruptible(&dmxdevfilter->mutex)) { + up(&dmxdev->mutex); return -ERESTARTSYS; } - if (dmxdevfilter->state < DMXDEV_STATE_SET) + if (dmxdevfilter->statemutex); + up(&dmxdevfilter->mutex); break; case DMX_STOP: - if (mutex_lock_interruptible(&dmxdevfilter->mutex)) { - mutex_unlock(&dmxdev->mutex); + if (down_interruptible(&dmxdevfilter->mutex)) { + up(&dmxdev->mutex); return -ERESTARTSYS; } - ret = dvb_dmxdev_filter_stop(dmxdevfilter); - mutex_unlock(&dmxdevfilter->mutex); + ret=dvb_dmxdev_filter_stop(dmxdevfilter); + up(&dmxdevfilter->mutex); break; case DMX_SET_FILTER: - if (mutex_lock_interruptible(&dmxdevfilter->mutex)) { - mutex_unlock(&dmxdev->mutex); + if (down_interruptible(&dmxdevfilter->mutex)) { + up(&dmxdev->mutex); return -ERESTARTSYS; } - ret = dvb_dmxdev_filter_set(dmxdev, dmxdevfilter, parg); - mutex_unlock(&dmxdevfilter->mutex); + ret = dvb_dmxdev_filter_set(dmxdev, dmxdevfilter, + (struct dmx_sct_filter_params *)parg); + up(&dmxdevfilter->mutex); break; case DMX_SET_PES_FILTER: - if (mutex_lock_interruptible(&dmxdevfilter->mutex)) { - mutex_unlock(&dmxdev->mutex); + if (down_interruptible(&dmxdevfilter->mutex)) { + up(&dmxdev->mutex); return -ERESTARTSYS; } - ret = dvb_dmxdev_pes_filter_set(dmxdev, dmxdevfilter, parg); - mutex_unlock(&dmxdevfilter->mutex); + ret=dvb_dmxdev_pes_filter_set(dmxdev, dmxdevfilter, + (struct dmx_pes_filter_params *)parg); + up(&dmxdevfilter->mutex); break; case DMX_SET_BUFFER_SIZE: - if (mutex_lock_interruptible(&dmxdevfilter->mutex)) { - mutex_unlock(&dmxdev->mutex); + if (down_interruptible(&dmxdevfilter->mutex)) { + up(&dmxdev->mutex); return -ERESTARTSYS; } - ret = dvb_dmxdev_set_buffer_size(dmxdevfilter, arg); - mutex_unlock(&dmxdevfilter->mutex); + ret=dvb_dmxdev_set_buffer_size(dmxdevfilter, arg); + up(&dmxdevfilter->mutex); + break; + + case DMX_GET_EVENT: break; case DMX_GET_PES_PIDS: if (!dmxdev->demux->get_pes_pids) { - ret = -EINVAL; + ret=-EINVAL; break; } - dmxdev->demux->get_pes_pids(dmxdev->demux, parg); + dmxdev->demux->get_pes_pids(dmxdev->demux, (u16 *)parg); break; case DMX_GET_CAPS: @@ -898,20 +947,19 @@ static int dvb_demux_do_ioctl(struct inode *inode, struct file *file, case DMX_GET_STC: if (!dmxdev->demux->get_stc) { - ret = -EINVAL; + ret=-EINVAL; break; } ret = dmxdev->demux->get_stc(dmxdev->demux, - ((struct dmx_stc *)parg)->num, - &((struct dmx_stc *)parg)->stc, - &((struct dmx_stc *)parg)->base); + ((struct dmx_stc *)parg)->num, + &((struct dmx_stc *)parg)->stc, + &((struct dmx_stc *)parg)->base); break; default: - ret = -EINVAL; - break; + ret=-EINVAL; } - mutex_unlock(&dmxdev->mutex); + up(&dmxdev->mutex); return ret; } @@ -921,7 +969,8 @@ static int dvb_demux_ioctl(struct inode *inode, struct file *file, return dvb_usercopy(inode, file, cmd, arg, dvb_demux_do_ioctl); } -static unsigned int dvb_demux_poll(struct file *file, poll_table *wait) + +static unsigned int dvb_demux_poll (struct file *file, poll_table *wait) { struct dmxdev_filter *dmxdevfilter = file->private_data; unsigned int mask = 0; @@ -939,12 +988,13 @@ static unsigned int dvb_demux_poll(struct file *file, poll_table *wait) if (dmxdevfilter->buffer.error) mask |= (POLLIN | POLLRDNORM | POLLPRI | POLLERR); - if (!dvb_ringbuffer_empty(&dmxdevfilter->buffer)) + if (dmxdevfilter->buffer.pread != dmxdevfilter->buffer.pwrite) mask |= (POLLIN | POLLRDNORM | POLLPRI); return mask; } + static int dvb_demux_release(struct inode *inode, struct file *file) { struct dmxdev_filter *dmxdevfilter = file->private_data; @@ -953,67 +1003,72 @@ static int dvb_demux_release(struct inode *inode, struct file *file) return dvb_dmxdev_filter_free(dmxdev, dmxdevfilter); } + static struct file_operations dvb_demux_fops = { - .owner = THIS_MODULE, - .read = dvb_demux_read, - .ioctl = dvb_demux_ioctl, - .open = dvb_demux_open, - .release = dvb_demux_release, - .poll = dvb_demux_poll, + .owner = THIS_MODULE, + .read = dvb_demux_read, + .ioctl = dvb_demux_ioctl, + .open = dvb_demux_open, + .release = dvb_demux_release, + .poll = dvb_demux_poll, }; + static struct dvb_device dvbdev_demux = { - .priv = NULL, - .users = 1, - .writers = 1, - .fops = &dvb_demux_fops + .priv = NULL, + .users = 1, + .writers = 1, + .fops = &dvb_demux_fops }; + static int dvb_dvr_do_ioctl(struct inode *inode, struct file *file, - unsigned int cmd, void *parg) + unsigned int cmd, void *parg) { struct dvb_device *dvbdev = file->private_data; struct dmxdev *dmxdev = dvbdev->priv; - int ret; - if (mutex_lock_interruptible(&dmxdev->mutex)) + int ret=0; + + if (down_interruptible (&dmxdev->mutex)) return -ERESTARTSYS; switch (cmd) { case DMX_SET_BUFFER_SIZE: // FIXME: implement - ret = 0; + ret=0; break; default: - ret = -EINVAL; - break; + ret=-EINVAL; } - mutex_unlock(&dmxdev->mutex); + up(&dmxdev->mutex); return ret; } + static int dvb_dvr_ioctl(struct inode *inode, struct file *file, - unsigned int cmd, unsigned long arg) + unsigned int cmd, unsigned long arg) { return dvb_usercopy(inode, file, cmd, arg, dvb_dvr_do_ioctl); } -static unsigned int dvb_dvr_poll(struct file *file, poll_table *wait) + +static unsigned int dvb_dvr_poll (struct file *file, poll_table *wait) { struct dvb_device *dvbdev = file->private_data; struct dmxdev *dmxdev = dvbdev->priv; unsigned int mask = 0; - dprintk("function : %s\n", __FUNCTION__); + dprintk ("function : %s\n", __FUNCTION__); poll_wait(file, &dmxdev->dvr_buffer.queue, wait); - if ((file->f_flags & O_ACCMODE) == O_RDONLY) { + if ((file->f_flags&O_ACCMODE) == O_RDONLY) { if (dmxdev->dvr_buffer.error) mask |= (POLLIN | POLLRDNORM | POLLPRI | POLLERR); - if (!dvb_ringbuffer_empty(&dmxdev->dvr_buffer)) + if (dmxdev->dvr_buffer.pread!=dmxdev->dvr_buffer.pwrite) mask |= (POLLIN | POLLRDNORM | POLLPRI); } else mask |= (POLLOUT | POLLWRNORM | POLLPRI); @@ -1021,62 +1076,73 @@ static unsigned int dvb_dvr_poll(struct file *file, poll_table *wait) return mask; } + static struct file_operations dvb_dvr_fops = { - .owner = THIS_MODULE, - .read = dvb_dvr_read, - .write = dvb_dvr_write, - .ioctl = dvb_dvr_ioctl, - .open = dvb_dvr_open, - .release = dvb_dvr_release, - .poll = dvb_dvr_poll, + .owner = THIS_MODULE, + .read = dvb_dvr_read, + .write = dvb_dvr_write, + .ioctl = dvb_dvr_ioctl, + .open = dvb_dvr_open, + .release = dvb_dvr_release, + .poll = dvb_dvr_poll, }; static struct dvb_device dvbdev_dvr = { - .priv = NULL, - .readers = 1, - .fops = &dvb_dvr_fops + .priv = NULL, + .users = 1, + .writers = 1, + .fops = &dvb_dvr_fops }; -int dvb_dmxdev_init(struct dmxdev *dmxdev, struct dvb_adapter *dvb_adapter) +int +dvb_dmxdev_init(struct dmxdev *dmxdev, struct dvb_adapter *dvb_adapter) { int i; if (dmxdev->demux->open(dmxdev->demux) < 0) return -EUSERS; - dmxdev->filter = vmalloc(dmxdev->filternum * sizeof(struct dmxdev_filter)); + dmxdev->filter = vmalloc(dmxdev->filternum*sizeof(struct dmxdev_filter)); if (!dmxdev->filter) return -ENOMEM; - mutex_init(&dmxdev->mutex); + dmxdev->dvr = vmalloc(dmxdev->filternum*sizeof(struct dmxdev_dvr)); + if (!dmxdev->dvr) { + vfree(dmxdev->filter); + dmxdev->filter = NULL; + return -ENOMEM; + } + + sema_init(&dmxdev->mutex, 1); spin_lock_init(&dmxdev->lock); - for (i = 0; i < dmxdev->filternum; i++) { - dmxdev->filter[i].dev = dmxdev; - dmxdev->filter[i].buffer.data = NULL; - dvb_dmxdev_filter_state_set(&dmxdev->filter[i], - DMXDEV_STATE_FREE); + for (i=0; ifilternum; i++) { + dmxdev->filter[i].dev=dmxdev; + dmxdev->filter[i].buffer.data=NULL; + dvb_dmxdev_filter_state_set(&dmxdev->filter[i], DMXDEV_STATE_FREE); + dmxdev->dvr[i].dev=dmxdev; + dmxdev->dvr[i].buffer.data=NULL; + dvb_dmxdev_dvr_state_set(&dmxdev->dvr[i], DMXDEV_STATE_FREE); } - dvb_register_device(dvb_adapter, &dmxdev->dvbdev, &dvbdev_demux, dmxdev, - DVB_DEVICE_DEMUX); - dvb_register_device(dvb_adapter, &dmxdev->dvr_dvbdev, &dvbdev_dvr, - dmxdev, DVB_DEVICE_DVR); + dvb_register_device(dvb_adapter, &dmxdev->dvbdev, &dvbdev_demux, dmxdev, DVB_DEVICE_DEMUX); + dvb_register_device(dvb_adapter, &dmxdev->dvr_dvbdev, &dvbdev_dvr, dmxdev, DVB_DEVICE_DVR); - dvb_ringbuffer_init(&dmxdev->dvr_buffer, NULL, 8192); + dvb_dmxdev_buffer_init(&dmxdev->dvr_buffer); return 0; } - EXPORT_SYMBOL(dvb_dmxdev_init); -void dvb_dmxdev_release(struct dmxdev *dmxdev) +void +dvb_dmxdev_release(struct dmxdev *dmxdev) { dvb_unregister_device(dmxdev->dvbdev); dvb_unregister_device(dmxdev->dvr_dvbdev); vfree(dmxdev->filter); - dmxdev->filter = NULL; + dmxdev->filter=NULL; + vfree(dmxdev->dvr); + dmxdev->dvr=NULL; dmxdev->demux->close(dmxdev->demux); } - EXPORT_SYMBOL(dvb_dmxdev_release); diff --git a/drivers/media/dvb/dvb-core/dmxdev.h b/drivers/media/dvb/dvb-core/dmxdev.h index d2bee9ffe..fd72920c2 100644 --- a/drivers/media/dvb/dvb-core/dmxdev.h +++ b/drivers/media/dvb/dvb-core/dmxdev.h @@ -30,15 +30,14 @@ #include #include #include -#include +#include #include #include "dvbdev.h" #include "demux.h" -#include "dvb_ringbuffer.h" -enum dmxdev_type { +enum dmxdevype { DMXDEV_TYPE_NONE, DMXDEV_TYPE_SEC, DMXDEV_TYPE_PES, @@ -53,7 +52,18 @@ enum dmxdev_state { DMXDEV_STATE_TIMEDOUT }; +struct dmxdev_buffer { + u8 *data; + int size; + int pread; + int pwrite; + wait_queue_head_t queue; + int error; +}; + struct dmxdev_filter { + struct dvb_device *dvbdev; + union { struct dmx_section_filter *sec; } filter; @@ -68,17 +78,26 @@ struct dmxdev_filter { struct dmx_pes_filter_params pes; } params; - enum dmxdev_type type; + int type; enum dmxdev_state state; struct dmxdev *dev; - struct dvb_ringbuffer buffer; + struct dmxdev_buffer buffer; - struct mutex mutex; + struct semaphore mutex; /* only for sections */ struct timer_list timer; int todo; u8 secheader[3]; + + u16 pid; +}; + + +struct dmxdev_dvr { + int state; + struct dmxdev *dev; + struct dmxdev_buffer buffer; }; @@ -87,6 +106,7 @@ struct dmxdev { struct dvb_device *dvr_dvbdev; struct dmxdev_filter *filter; + struct dmxdev_dvr *dvr; struct dmx_demux *demux; int filternum; @@ -94,10 +114,10 @@ struct dmxdev { #define DMXDEV_CAP_DUPLEX 1 struct dmx_frontend *dvr_orig_fe; - struct dvb_ringbuffer dvr_buffer; + struct dmxdev_buffer dvr_buffer; #define DVR_BUFFER_SIZE (10*188*1024) - struct mutex mutex; + struct semaphore mutex; spinlock_t lock; }; diff --git a/drivers/media/dvb/dvb-core/dvb_ca_en50221.c b/drivers/media/dvb/dvb-core/dvb_ca_en50221.c index 2a03bf53c..00347a750 100644 --- a/drivers/media/dvb/dvb-core/dvb_ca_en50221.c +++ b/drivers/media/dvb/dvb-core/dvb_ca_en50221.c @@ -1060,18 +1060,8 @@ static int dvb_ca_en50221_thread(void *data) break; case DVB_CA_SLOTSTATE_VALIDATE: - if (dvb_ca_en50221_parse_attributes(ca, slot) != 0) { - /* we need this extra check for annoying interfaces like the budget-av */ - if ((!(ca->flags & DVB_CA_EN50221_FLAG_IRQ_CAMCHANGE)) && - (ca->pub->poll_slot_status)) { - int status = ca->pub->poll_slot_status(ca->pub, slot, 0); - if (!(status & DVB_CA_EN50221_POLL_CAM_PRESENT)) { - ca->slot_info[slot].slot_state = DVB_CA_SLOTSTATE_NONE; - dvb_ca_en50221_thread_update_delay(ca); - break; - } - } - + if (dvb_ca_en50221_parse_attributes(ca, slot) + != 0) { printk("dvb_ca adapter %d: Invalid PC card inserted :(\n", ca->dvbdev->adapter->num); ca->slot_info[slot].slot_state = DVB_CA_SLOTSTATE_INVALID; @@ -1118,17 +1108,6 @@ static int dvb_ca_en50221_thread(void *data) case DVB_CA_SLOTSTATE_LINKINIT: if (dvb_ca_en50221_link_init(ca, slot) != 0) { - /* we need this extra check for annoying interfaces like the budget-av */ - if ((!(ca->flags & DVB_CA_EN50221_FLAG_IRQ_CAMCHANGE)) && - (ca->pub->poll_slot_status)) { - int status = ca->pub->poll_slot_status(ca->pub, slot, 0); - if (!(status & DVB_CA_EN50221_POLL_CAM_PRESENT)) { - ca->slot_info[slot].slot_state = DVB_CA_SLOTSTATE_NONE; - dvb_ca_en50221_thread_update_delay(ca); - break; - } - } - printk("dvb_ca adapter %d: DVB CAM link initialisation failed :(\n", ca->dvbdev->adapter->num); ca->slot_info[slot].slot_state = DVB_CA_SLOTSTATE_INVALID; dvb_ca_en50221_thread_update_delay(ca); diff --git a/drivers/media/dvb/dvb-core/dvb_demux.c b/drivers/media/dvb/dvb-core/dvb_demux.c index fcff5eab2..b4c899b15 100644 --- a/drivers/media/dvb/dvb-core/dvb_demux.c +++ b/drivers/media/dvb/dvb-core/dvb_demux.c @@ -473,7 +473,7 @@ void dvb_dmx_swfilter_204(struct dvb_demux *demux, const u8 *buf, size_t count) goto bailout; } memcpy(&demux->tsbuf[i], buf, j); - if ((demux->tsbuf[0] == 0x47) || (demux->tsbuf[0] == 0xB8)) { + if ((demux->tsbuf[0] == 0x47) | (demux->tsbuf[0] == 0xB8)) { memcpy(tmppack, demux->tsbuf, 188); if (tmppack[0] == 0xB8) tmppack[0] = 0x47; @@ -484,7 +484,7 @@ void dvb_dmx_swfilter_204(struct dvb_demux *demux, const u8 *buf, size_t count) } while (p < count) { - if ((buf[p] == 0x47) || (buf[p] == 0xB8)) { + if ((buf[p] == 0x47) | (buf[p] == 0xB8)) { if (count - p >= 204) { memcpy(tmppack, &buf[p], 188); if (tmppack[0] == 0xB8) @@ -589,18 +589,18 @@ static int dmx_ts_feed_set(struct dmx_ts_feed *ts_feed, u16 pid, int ts_type, if (pid > DMX_MAX_PID) return -EINVAL; - if (mutex_lock_interruptible(&demux->mutex)) + if (down_interruptible(&demux->mutex)) return -ERESTARTSYS; if (ts_type & TS_DECODER) { if (pes_type >= DMX_TS_PES_OTHER) { - mutex_unlock(&demux->mutex); + up(&demux->mutex); return -EINVAL; } if (demux->pesfilter[pes_type] && demux->pesfilter[pes_type] != feed) { - mutex_unlock(&demux->mutex); + up(&demux->mutex); return -EINVAL; } @@ -622,14 +622,14 @@ static int dmx_ts_feed_set(struct dmx_ts_feed *ts_feed, u16 pid, int ts_type, #else feed->buffer = vmalloc(feed->buffer_size); if (!feed->buffer) { - mutex_unlock(&demux->mutex); + up(&demux->mutex); return -ENOMEM; } #endif } feed->state = DMX_STATE_READY; - mutex_unlock(&demux->mutex); + up(&demux->mutex); return 0; } @@ -640,21 +640,21 @@ static int dmx_ts_feed_start_filtering(struct dmx_ts_feed *ts_feed) struct dvb_demux *demux = feed->demux; int ret; - if (mutex_lock_interruptible(&demux->mutex)) + if (down_interruptible(&demux->mutex)) return -ERESTARTSYS; if (feed->state != DMX_STATE_READY || feed->type != DMX_TYPE_TS) { - mutex_unlock(&demux->mutex); + up(&demux->mutex); return -EINVAL; } if (!demux->start_feed) { - mutex_unlock(&demux->mutex); + up(&demux->mutex); return -ENODEV; } if ((ret = demux->start_feed(feed)) < 0) { - mutex_unlock(&demux->mutex); + up(&demux->mutex); return ret; } @@ -662,7 +662,7 @@ static int dmx_ts_feed_start_filtering(struct dmx_ts_feed *ts_feed) ts_feed->is_filtering = 1; feed->state = DMX_STATE_GO; spin_unlock_irq(&demux->lock); - mutex_unlock(&demux->mutex); + up(&demux->mutex); return 0; } @@ -673,16 +673,16 @@ static int dmx_ts_feed_stop_filtering(struct dmx_ts_feed *ts_feed) struct dvb_demux *demux = feed->demux; int ret; - if (mutex_lock_interruptible(&demux->mutex)) + if (down_interruptible(&demux->mutex)) return -ERESTARTSYS; if (feed->state < DMX_STATE_GO) { - mutex_unlock(&demux->mutex); + up(&demux->mutex); return -EINVAL; } if (!demux->stop_feed) { - mutex_unlock(&demux->mutex); + up(&demux->mutex); return -ENODEV; } @@ -692,7 +692,7 @@ static int dmx_ts_feed_stop_filtering(struct dmx_ts_feed *ts_feed) ts_feed->is_filtering = 0; feed->state = DMX_STATE_ALLOCATED; spin_unlock_irq(&demux->lock); - mutex_unlock(&demux->mutex); + up(&demux->mutex); return ret; } @@ -704,11 +704,11 @@ static int dvbdmx_allocate_ts_feed(struct dmx_demux *dmx, struct dvb_demux *demux = (struct dvb_demux *)dmx; struct dvb_demux_feed *feed; - if (mutex_lock_interruptible(&demux->mutex)) + if (down_interruptible(&demux->mutex)) return -ERESTARTSYS; if (!(feed = dvb_dmx_feed_alloc(demux))) { - mutex_unlock(&demux->mutex); + up(&demux->mutex); return -EBUSY; } @@ -729,7 +729,7 @@ static int dvbdmx_allocate_ts_feed(struct dmx_demux *dmx, if (!(feed->filter = dvb_dmx_filter_alloc(demux))) { feed->state = DMX_STATE_FREE; - mutex_unlock(&demux->mutex); + up(&demux->mutex); return -EBUSY; } @@ -737,7 +737,7 @@ static int dvbdmx_allocate_ts_feed(struct dmx_demux *dmx, feed->filter->feed = feed; feed->filter->state = DMX_STATE_READY; - mutex_unlock(&demux->mutex); + up(&demux->mutex); return 0; } @@ -748,11 +748,11 @@ static int dvbdmx_release_ts_feed(struct dmx_demux *dmx, struct dvb_demux *demux = (struct dvb_demux *)dmx; struct dvb_demux_feed *feed = (struct dvb_demux_feed *)ts_feed; - if (mutex_lock_interruptible(&demux->mutex)) + if (down_interruptible(&demux->mutex)) return -ERESTARTSYS; if (feed->state == DMX_STATE_FREE) { - mutex_unlock(&demux->mutex); + up(&demux->mutex); return -EINVAL; } #ifndef NOBUFS @@ -770,7 +770,7 @@ static int dvbdmx_release_ts_feed(struct dmx_demux *dmx, if (feed->ts_type & TS_DECODER && feed->pes_type < DMX_TS_PES_OTHER) demux->pesfilter[feed->pes_type] = NULL; - mutex_unlock(&demux->mutex); + up(&demux->mutex); return 0; } @@ -785,12 +785,12 @@ static int dmx_section_feed_allocate_filter(struct dmx_section_feed *feed, struct dvb_demux *dvbdemux = dvbdmxfeed->demux; struct dvb_demux_filter *dvbdmxfilter; - if (mutex_lock_interruptible(&dvbdemux->mutex)) + if (down_interruptible(&dvbdemux->mutex)) return -ERESTARTSYS; dvbdmxfilter = dvb_dmx_filter_alloc(dvbdemux); if (!dvbdmxfilter) { - mutex_unlock(&dvbdemux->mutex); + up(&dvbdemux->mutex); return -EBUSY; } @@ -805,7 +805,7 @@ static int dmx_section_feed_allocate_filter(struct dmx_section_feed *feed, dvbdmxfeed->filter = dvbdmxfilter; spin_unlock_irq(&dvbdemux->lock); - mutex_unlock(&dvbdemux->mutex); + up(&dvbdemux->mutex); return 0; } @@ -819,7 +819,7 @@ static int dmx_section_feed_set(struct dmx_section_feed *feed, if (pid > 0x1fff) return -EINVAL; - if (mutex_lock_interruptible(&dvbdmx->mutex)) + if (down_interruptible(&dvbdmx->mutex)) return -ERESTARTSYS; dvb_demux_feed_add(dvbdmxfeed); @@ -833,13 +833,13 @@ static int dmx_section_feed_set(struct dmx_section_feed *feed, #else dvbdmxfeed->buffer = vmalloc(dvbdmxfeed->buffer_size); if (!dvbdmxfeed->buffer) { - mutex_unlock(&dvbdmx->mutex); + up(&dvbdmx->mutex); return -ENOMEM; } #endif dvbdmxfeed->state = DMX_STATE_READY; - mutex_unlock(&dvbdmx->mutex); + up(&dvbdmx->mutex); return 0; } @@ -871,16 +871,16 @@ static int dmx_section_feed_start_filtering(struct dmx_section_feed *feed) struct dvb_demux *dvbdmx = dvbdmxfeed->demux; int ret; - if (mutex_lock_interruptible(&dvbdmx->mutex)) + if (down_interruptible(&dvbdmx->mutex)) return -ERESTARTSYS; if (feed->is_filtering) { - mutex_unlock(&dvbdmx->mutex); + up(&dvbdmx->mutex); return -EBUSY; } if (!dvbdmxfeed->filter) { - mutex_unlock(&dvbdmx->mutex); + up(&dvbdmx->mutex); return -EINVAL; } @@ -890,14 +890,14 @@ static int dmx_section_feed_start_filtering(struct dmx_section_feed *feed) dvbdmxfeed->feed.sec.seclen = 0; if (!dvbdmx->start_feed) { - mutex_unlock(&dvbdmx->mutex); + up(&dvbdmx->mutex); return -ENODEV; } prepare_secfilters(dvbdmxfeed); if ((ret = dvbdmx->start_feed(dvbdmxfeed)) < 0) { - mutex_unlock(&dvbdmx->mutex); + up(&dvbdmx->mutex); return ret; } @@ -906,7 +906,7 @@ static int dmx_section_feed_start_filtering(struct dmx_section_feed *feed) dvbdmxfeed->state = DMX_STATE_GO; spin_unlock_irq(&dvbdmx->lock); - mutex_unlock(&dvbdmx->mutex); + up(&dvbdmx->mutex); return 0; } @@ -916,11 +916,11 @@ static int dmx_section_feed_stop_filtering(struct dmx_section_feed *feed) struct dvb_demux *dvbdmx = dvbdmxfeed->demux; int ret; - if (mutex_lock_interruptible(&dvbdmx->mutex)) + if (down_interruptible(&dvbdmx->mutex)) return -ERESTARTSYS; if (!dvbdmx->stop_feed) { - mutex_unlock(&dvbdmx->mutex); + up(&dvbdmx->mutex); return -ENODEV; } @@ -931,7 +931,7 @@ static int dmx_section_feed_stop_filtering(struct dmx_section_feed *feed) feed->is_filtering = 0; spin_unlock_irq(&dvbdmx->lock); - mutex_unlock(&dvbdmx->mutex); + up(&dvbdmx->mutex); return ret; } @@ -942,11 +942,11 @@ static int dmx_section_feed_release_filter(struct dmx_section_feed *feed, struct dvb_demux_feed *dvbdmxfeed = (struct dvb_demux_feed *)feed; struct dvb_demux *dvbdmx = dvbdmxfeed->demux; - if (mutex_lock_interruptible(&dvbdmx->mutex)) + if (down_interruptible(&dvbdmx->mutex)) return -ERESTARTSYS; if (dvbdmxfilter->feed != dvbdmxfeed) { - mutex_unlock(&dvbdmx->mutex); + up(&dvbdmx->mutex); return -EINVAL; } @@ -966,7 +966,7 @@ static int dmx_section_feed_release_filter(struct dmx_section_feed *feed, dvbdmxfilter->state = DMX_STATE_FREE; spin_unlock_irq(&dvbdmx->lock); - mutex_unlock(&dvbdmx->mutex); + up(&dvbdmx->mutex); return 0; } @@ -977,11 +977,11 @@ static int dvbdmx_allocate_section_feed(struct dmx_demux *demux, struct dvb_demux *dvbdmx = (struct dvb_demux *)demux; struct dvb_demux_feed *dvbdmxfeed; - if (mutex_lock_interruptible(&dvbdmx->mutex)) + if (down_interruptible(&dvbdmx->mutex)) return -ERESTARTSYS; if (!(dvbdmxfeed = dvb_dmx_feed_alloc(dvbdmx))) { - mutex_unlock(&dvbdmx->mutex); + up(&dvbdmx->mutex); return -EBUSY; } @@ -1006,7 +1006,7 @@ static int dvbdmx_allocate_section_feed(struct dmx_demux *demux, (*feed)->stop_filtering = dmx_section_feed_stop_filtering; (*feed)->release_filter = dmx_section_feed_release_filter; - mutex_unlock(&dvbdmx->mutex); + up(&dvbdmx->mutex); return 0; } @@ -1016,11 +1016,11 @@ static int dvbdmx_release_section_feed(struct dmx_demux *demux, struct dvb_demux_feed *dvbdmxfeed = (struct dvb_demux_feed *)feed; struct dvb_demux *dvbdmx = (struct dvb_demux *)demux; - if (mutex_lock_interruptible(&dvbdmx->mutex)) + if (down_interruptible(&dvbdmx->mutex)) return -ERESTARTSYS; if (dvbdmxfeed->state == DMX_STATE_FREE) { - mutex_unlock(&dvbdmx->mutex); + up(&dvbdmx->mutex); return -EINVAL; } #ifndef NOBUFS @@ -1033,7 +1033,7 @@ static int dvbdmx_release_section_feed(struct dmx_demux *demux, dvbdmxfeed->pid = 0xffff; - mutex_unlock(&dvbdmx->mutex); + up(&dvbdmx->mutex); return 0; } @@ -1071,10 +1071,10 @@ static int dvbdmx_write(struct dmx_demux *demux, const char *buf, size_t count) if ((!demux->frontend) || (demux->frontend->source != DMX_MEMORY_FE)) return -EINVAL; - if (mutex_lock_interruptible(&dvbdemux->mutex)) + if (down_interruptible(&dvbdemux->mutex)) return -ERESTARTSYS; dvb_dmx_swfilter(dvbdemux, buf, count); - mutex_unlock(&dvbdemux->mutex); + up(&dvbdemux->mutex); if (signal_pending(current)) return -EINTR; @@ -1126,11 +1126,11 @@ static int dvbdmx_connect_frontend(struct dmx_demux *demux, if (demux->frontend) return -EINVAL; - if (mutex_lock_interruptible(&dvbdemux->mutex)) + if (down_interruptible(&dvbdemux->mutex)) return -ERESTARTSYS; demux->frontend = frontend; - mutex_unlock(&dvbdemux->mutex); + up(&dvbdemux->mutex); return 0; } @@ -1138,11 +1138,11 @@ static int dvbdmx_disconnect_frontend(struct dmx_demux *demux) { struct dvb_demux *dvbdemux = (struct dvb_demux *)demux; - if (mutex_lock_interruptible(&dvbdemux->mutex)) + if (down_interruptible(&dvbdemux->mutex)) return -ERESTARTSYS; demux->frontend = NULL; - mutex_unlock(&dvbdemux->mutex); + up(&dvbdemux->mutex); return 0; } @@ -1215,7 +1215,7 @@ int dvb_dmx_init(struct dvb_demux *dvbdemux) dmx->disconnect_frontend = dvbdmx_disconnect_frontend; dmx->get_pes_pids = dvbdmx_get_pes_pids; - mutex_init(&dvbdemux->mutex); + sema_init(&dvbdemux->mutex, 1); spin_lock_init(&dvbdemux->lock); return 0; diff --git a/drivers/media/dvb/dvb-core/dvb_demux.h b/drivers/media/dvb/dvb-core/dvb_demux.h index 2c5f91532..0cc888339 100644 --- a/drivers/media/dvb/dvb-core/dvb_demux.h +++ b/drivers/media/dvb/dvb-core/dvb_demux.h @@ -26,7 +26,7 @@ #include #include #include -#include +#include #include "demux.h" @@ -125,7 +125,7 @@ struct dvb_demux { u8 tsbuf[204]; int tsbufp; - struct mutex mutex; + struct semaphore mutex; spinlock_t lock; }; diff --git a/drivers/media/dvb/dvb-core/dvb_frontend.c b/drivers/media/dvb/dvb-core/dvb_frontend.c index 57b34cda9..771f32d88 100644 --- a/drivers/media/dvb/dvb-core/dvb_frontend.c +++ b/drivers/media/dvb/dvb-core/dvb_frontend.c @@ -37,6 +37,7 @@ #include #include #include +#include #include "dvb_frontend.h" #include "dvbdev.h" @@ -49,14 +50,14 @@ static int dvb_powerdown_on_sleep = 1; module_param_named(frontend_debug, dvb_frontend_debug, int, 0644); MODULE_PARM_DESC(frontend_debug, "Turn on/off frontend core debugging (default:off)."); -module_param(dvb_shutdown_timeout, int, 0644); +module_param(dvb_shutdown_timeout, int, 0444); MODULE_PARM_DESC(dvb_shutdown_timeout, "wait seconds after close() before suspending hardware"); -module_param(dvb_force_auto_inversion, int, 0644); +module_param(dvb_force_auto_inversion, int, 0444); MODULE_PARM_DESC(dvb_force_auto_inversion, "0: normal (default), 1: INVERSION_AUTO forced always"); -module_param(dvb_override_tune_delay, int, 0644); +module_param(dvb_override_tune_delay, int, 0444); MODULE_PARM_DESC(dvb_override_tune_delay, "0: normal (default), >0 => delay in milliseconds to wait for lock after a tune attempt"); -module_param(dvb_powerdown_on_sleep, int, 0644); -MODULE_PARM_DESC(dvb_powerdown_on_sleep, "0: do not power down, 1: turn LNB voltage off on sleep (default)"); +module_param(dvb_powerdown_on_sleep, int, 0444); +MODULE_PARM_DESC(dvb_powerdown_on_sleep, "0: do not power down, 1: turn LNB volatage off on sleep (default)"); #define dprintk if (dvb_frontend_debug) printk @@ -72,8 +73,6 @@ MODULE_PARM_DESC(dvb_powerdown_on_sleep, "0: do not power down, 1: turn LNB volt #define FESTATE_SEARCHING_FAST (FESTATE_TUNING_FAST | FESTATE_ZIGZAG_FAST) #define FESTATE_SEARCHING_SLOW (FESTATE_TUNING_SLOW | FESTATE_ZIGZAG_SLOW) #define FESTATE_LOSTLOCK (FESTATE_ZIGZAG_FAST | FESTATE_ZIGZAG_SLOW) - -#define FE_ALGO_HW 1 /* * FESTATE_IDLE. No tuning parameters have been supplied and the loop is idling. * FESTATE_RETUNE. Parameters have been supplied, but we have not yet performed the first tune. @@ -89,7 +88,7 @@ MODULE_PARM_DESC(dvb_powerdown_on_sleep, "0: do not power down, 1: turn LNB volt * FESTATE_LOSTLOCK. When the lock has been lost, and we're searching it again. */ -static DEFINE_MUTEX(frontend_mutex); +static DECLARE_MUTEX(frontend_mutex); struct dvb_frontend_private { @@ -107,9 +106,6 @@ struct dvb_frontend_private { fe_status_t status; unsigned long tune_mode_flags; unsigned int delay; - unsigned int reinitialise; - int tone; - int voltage; /* swzigzag values */ unsigned int state; @@ -126,7 +122,6 @@ struct dvb_frontend_private { unsigned int check_wrapped; }; -static void dvb_frontend_wakeup(struct dvb_frontend *fe); static void dvb_frontend_add_event(struct dvb_frontend *fe, fe_status_t status) { @@ -153,8 +148,8 @@ static void dvb_frontend_add_event(struct dvb_frontend *fe, fe_status_t status) sizeof (struct dvb_frontend_parameters)); if (status & FE_HAS_LOCK) - if (fe->ops.get_frontend) - fe->ops.get_frontend(fe, &e->parameters); + if (fe->ops->get_frontend) + fe->ops->get_frontend(fe, &e->parameters); events->eventw = wp; @@ -213,25 +208,11 @@ static void dvb_frontend_init(struct dvb_frontend *fe) { dprintk ("DVB: initialising frontend %i (%s)...\n", fe->dvb->num, - fe->ops.info.name); - - if (fe->ops.init) - fe->ops.init(fe); - if (fe->ops.tuner_ops.init) { - fe->ops.tuner_ops.init(fe); - if (fe->ops.i2c_gate_ctrl) - fe->ops.i2c_gate_ctrl(fe, 0); - } -} - -void dvb_frontend_reinitialise(struct dvb_frontend *fe) -{ - struct dvb_frontend_private *fepriv = fe->frontend_priv; + fe->ops->info.name); - fepriv->reinitialise = 1; - dvb_frontend_wakeup(fe); + if (fe->ops->init) + fe->ops->init(fe); } -EXPORT_SYMBOL(dvb_frontend_reinitialise); static void dvb_frontend_swzigzag_update_delay(struct dvb_frontend_private *fepriv, int locked) { @@ -266,7 +247,7 @@ static int dvb_frontend_swzigzag_autotune(struct dvb_frontend *fe, int check_wra u32 original_frequency = fepriv->parameters.frequency; /* are we using autoinversion? */ - autoinversion = ((!(fe->ops.info.caps & FE_CAN_INVERSION_AUTO)) && + autoinversion = ((!(fe->ops->info.caps & FE_CAN_INVERSION_AUTO)) && (fepriv->parameters.inversion == INVERSION_AUTO)); /* setup parameters correctly */ @@ -336,8 +317,8 @@ static int dvb_frontend_swzigzag_autotune(struct dvb_frontend *fe, int check_wra fepriv->parameters.frequency += fepriv->lnb_drift; if (autoinversion) fepriv->parameters.inversion = fepriv->inversion; - if (fe->ops.set_frontend) - fe->ops.set_frontend(fe, &fepriv->parameters); + if (fe->ops->set_frontend) + fe->ops->set_frontend(fe, &fepriv->parameters); fepriv->parameters.frequency = original_frequency; fepriv->parameters.inversion = original_inversion; @@ -361,8 +342,8 @@ static void dvb_frontend_swzigzag(struct dvb_frontend *fe) /* in SCAN mode, we just set the frontend when asked and leave it alone */ if (fepriv->tune_mode_flags & FE_TUNE_MODE_ONESHOT) { if (fepriv->state & FESTATE_RETUNE) { - if (fe->ops.set_frontend) - fe->ops.set_frontend(fe, &fepriv->parameters); + if (fe->ops->set_frontend) + fe->ops->set_frontend(fe, &fepriv->parameters); fepriv->state = FESTATE_TUNED; } fepriv->delay = 3*HZ; @@ -374,8 +355,8 @@ static void dvb_frontend_swzigzag(struct dvb_frontend *fe) if (fepriv->state & FESTATE_RETUNE) { s = 0; } else { - if (fe->ops.read_status) - fe->ops.read_status(fe, &s); + if (fe->ops->read_status) + fe->ops->read_status(fe, &s); if (s != fepriv->status) { dvb_frontend_add_event(fe, s); fepriv->status = s; @@ -388,7 +369,7 @@ static void dvb_frontend_swzigzag(struct dvb_frontend *fe) fepriv->state = FESTATE_TUNED; /* if we're tuned, then we have determined the correct inversion */ - if ((!(fe->ops.info.caps & FE_CAN_INVERSION_AUTO)) && + if ((!(fe->ops->info.caps & FE_CAN_INVERSION_AUTO)) && (fepriv->parameters.inversion == INVERSION_AUTO)) { fepriv->parameters.inversion = fepriv->inversion; } @@ -412,7 +393,7 @@ static void dvb_frontend_swzigzag(struct dvb_frontend *fe) /* don't actually do anything if we're in the LOSTLOCK state, * the frontend is set to FE_CAN_RECOVER, and the max_drift is 0 */ if ((fepriv->state & FESTATE_LOSTLOCK) && - (fe->ops.info.caps & FE_CAN_RECOVER) && (fepriv->max_drift == 0)) { + (fe->ops->info.caps & FE_CAN_RECOVER) && (fepriv->max_drift == 0)) { dvb_frontend_swzigzag_update_delay(fepriv, s & FE_HAS_LOCK); return; } @@ -525,10 +506,8 @@ static int dvb_frontend_thread(void *data) fepriv->quality = 0; fepriv->delay = 3*HZ; fepriv->status = 0; - fepriv->wakeup = 0; - fepriv->reinitialise = 0; - dvb_frontend_init(fe); + fepriv->wakeup = 0; while (1) { up(&fepriv->sem); /* is locked when we enter the thread... */ @@ -546,49 +525,31 @@ static int dvb_frontend_thread(void *data) if (down_interruptible(&fepriv->sem)) break; - if (fepriv->reinitialise) { - dvb_frontend_init(fe); - if (fepriv->tone != -1) { - fe->ops.set_tone(fe, fepriv->tone); - } - if (fepriv->voltage != -1) { - fe->ops.set_voltage(fe, fepriv->voltage); - } - fepriv->reinitialise = 0; - } - /* do an iteration of the tuning loop */ - if (fe->ops.get_frontend_algo) { - if (fe->ops.get_frontend_algo(fe) == FE_ALGO_HW) { - /* have we been asked to retune? */ - params = NULL; - if (fepriv->state & FESTATE_RETUNE) { - params = &fepriv->parameters; - fepriv->state = FESTATE_TUNED; - } + if (fe->ops->tune) { + /* have we been asked to retune? */ + params = NULL; + if (fepriv->state & FESTATE_RETUNE) { + params = &fepriv->parameters; + fepriv->state = FESTATE_TUNED; + } - fe->ops.tune(fe, params, fepriv->tune_mode_flags, &fepriv->delay, &s); - if (s != fepriv->status) { - dvb_frontend_add_event(fe, s); - fepriv->status = s; - } - } else - dvb_frontend_swzigzag(fe); - } else + fe->ops->tune(fe, params, fepriv->tune_mode_flags, &fepriv->delay, &s); + if (s != fepriv->status) { + dvb_frontend_add_event(fe, s); + fepriv->status = s; + } + } else { dvb_frontend_swzigzag(fe); + } } if (dvb_shutdown_timeout) { if (dvb_powerdown_on_sleep) - if (fe->ops.set_voltage) - fe->ops.set_voltage(fe, SEC_VOLTAGE_OFF); - if (fe->ops.tuner_ops.sleep) { - fe->ops.tuner_ops.sleep(fe); - if (fe->ops.i2c_gate_ctrl) - fe->ops.i2c_gate_ctrl(fe, 0); - } - if (fe->ops.sleep) - fe->ops.sleep(fe); + if (fe->ops->set_voltage) + fe->ops->set_voltage(fe, SEC_VOLTAGE_OFF); + if (fe->ops->sleep) + fe->ops->sleep(fe); } fepriv->thread_pid = 0; @@ -740,7 +701,7 @@ static int dvb_frontend_ioctl(struct inode *inode, struct file *file, switch (cmd) { case FE_GET_INFO: { struct dvb_frontend_info* info = parg; - memcpy(info, &fe->ops.info, sizeof(struct dvb_frontend_info)); + memcpy(info, &fe->ops->info, sizeof(struct dvb_frontend_info)); /* Force the CAN_INVERSION_AUTO bit on. If the frontend doesn't * do it, it is done for it. */ @@ -760,79 +721,77 @@ static int dvb_frontend_ioctl(struct inode *inode, struct file *file, break; } - if (fe->ops.read_status) - err = fe->ops.read_status(fe, status); + if (fe->ops->read_status) + err = fe->ops->read_status(fe, status); break; } case FE_READ_BER: - if (fe->ops.read_ber) - err = fe->ops.read_ber(fe, (__u32*) parg); + if (fe->ops->read_ber) + err = fe->ops->read_ber(fe, (__u32*) parg); break; case FE_READ_SIGNAL_STRENGTH: - if (fe->ops.read_signal_strength) - err = fe->ops.read_signal_strength(fe, (__u16*) parg); + if (fe->ops->read_signal_strength) + err = fe->ops->read_signal_strength(fe, (__u16*) parg); break; case FE_READ_SNR: - if (fe->ops.read_snr) - err = fe->ops.read_snr(fe, (__u16*) parg); + if (fe->ops->read_snr) + err = fe->ops->read_snr(fe, (__u16*) parg); break; case FE_READ_UNCORRECTED_BLOCKS: - if (fe->ops.read_ucblocks) - err = fe->ops.read_ucblocks(fe, (__u32*) parg); + if (fe->ops->read_ucblocks) + err = fe->ops->read_ucblocks(fe, (__u32*) parg); break; case FE_DISEQC_RESET_OVERLOAD: - if (fe->ops.diseqc_reset_overload) { - err = fe->ops.diseqc_reset_overload(fe); + if (fe->ops->diseqc_reset_overload) { + err = fe->ops->diseqc_reset_overload(fe); fepriv->state = FESTATE_DISEQC; fepriv->status = 0; } break; case FE_DISEQC_SEND_MASTER_CMD: - if (fe->ops.diseqc_send_master_cmd) { - err = fe->ops.diseqc_send_master_cmd(fe, (struct dvb_diseqc_master_cmd*) parg); + if (fe->ops->diseqc_send_master_cmd) { + err = fe->ops->diseqc_send_master_cmd(fe, (struct dvb_diseqc_master_cmd*) parg); fepriv->state = FESTATE_DISEQC; fepriv->status = 0; } break; case FE_DISEQC_SEND_BURST: - if (fe->ops.diseqc_send_burst) { - err = fe->ops.diseqc_send_burst(fe, (fe_sec_mini_cmd_t) parg); + if (fe->ops->diseqc_send_burst) { + err = fe->ops->diseqc_send_burst(fe, (fe_sec_mini_cmd_t) parg); fepriv->state = FESTATE_DISEQC; fepriv->status = 0; } break; case FE_SET_TONE: - if (fe->ops.set_tone) { - err = fe->ops.set_tone(fe, (fe_sec_tone_mode_t) parg); - fepriv->tone = (fe_sec_tone_mode_t) parg; + if (fe->ops->set_tone) { + err = fe->ops->set_tone(fe, (fe_sec_tone_mode_t) parg); fepriv->state = FESTATE_DISEQC; fepriv->status = 0; } break; case FE_SET_VOLTAGE: - if (fe->ops.set_voltage) { - err = fe->ops.set_voltage(fe, (fe_sec_voltage_t) parg); - fepriv->voltage = (fe_sec_voltage_t) parg; + if (fe->ops->set_voltage) { + err = fe->ops->set_voltage(fe, (fe_sec_voltage_t) parg); fepriv->state = FESTATE_DISEQC; fepriv->status = 0; } break; case FE_DISHNETWORK_SEND_LEGACY_CMD: - if (fe->ops.dishnetwork_send_legacy_command) { - err = fe->ops.dishnetwork_send_legacy_command(fe, (unsigned long) parg); + if (fe->ops->dishnetwork_send_legacy_command) { + err = fe->ops->dishnetwork_send_legacy_command(fe, (unsigned long) parg); fepriv->state = FESTATE_DISEQC; fepriv->status = 0; - } else if (fe->ops.set_voltage) { + } else if (fe->ops->set_voltage) { /* * NOTE: This is a fallback condition. Some frontends * (stv0299 for instance) take longer than 8msec to @@ -862,7 +821,7 @@ static int dvb_frontend_ioctl(struct inode *inode, struct file *file, /* before sending a command, initialize by sending * a 32ms 18V to the switch */ - fe->ops.set_voltage(fe, SEC_VOLTAGE_18); + fe->ops->set_voltage(fe, SEC_VOLTAGE_18); dvb_frontend_sleep_until(&nexttime, 32000); for (i = 0; i < 9; i++) { @@ -870,7 +829,7 @@ static int dvb_frontend_ioctl(struct inode *inode, struct file *file, do_gettimeofday(&tv[i + 1]); if ((cmd & 0x01) != last) { /* set voltage to (last ? 13V : 18V) */ - fe->ops.set_voltage(fe, (last) ? SEC_VOLTAGE_13 : SEC_VOLTAGE_18); + fe->ops->set_voltage(fe, (last) ? SEC_VOLTAGE_13 : SEC_VOLTAGE_18); last = (last) ? 0 : 1; } cmd = cmd >> 1; @@ -890,13 +849,13 @@ static int dvb_frontend_ioctl(struct inode *inode, struct file *file, break; case FE_DISEQC_RECV_SLAVE_REPLY: - if (fe->ops.diseqc_recv_slave_reply) - err = fe->ops.diseqc_recv_slave_reply(fe, (struct dvb_diseqc_slave_reply*) parg); + if (fe->ops->diseqc_recv_slave_reply) + err = fe->ops->diseqc_recv_slave_reply(fe, (struct dvb_diseqc_slave_reply*) parg); break; case FE_ENABLE_HIGH_LNB_VOLTAGE: - if (fe->ops.enable_high_lnb_voltage) - err = fe->ops.enable_high_lnb_voltage(fe, (long) parg); + if (fe->ops->enable_high_lnb_voltage) + err = fe->ops->enable_high_lnb_voltage(fe, (long) parg); break; case FE_SET_FRONTEND: { @@ -914,7 +873,7 @@ static int dvb_frontend_ioctl(struct inode *inode, struct file *file, fepriv->parameters.inversion = INVERSION_AUTO; fetunesettings.parameters.inversion = INVERSION_AUTO; } - if (fe->ops.info.type == FE_OFDM) { + if (fe->ops->info.type == FE_OFDM) { /* without hierachical coding code_rate_LP is irrelevant, * so we tolerate the otherwise invalid FEC_NONE setting */ if (fepriv->parameters.u.ofdm.hierarchy_information == HIERARCHY_NONE && @@ -923,13 +882,13 @@ static int dvb_frontend_ioctl(struct inode *inode, struct file *file, } /* get frontend-specific tuning settings */ - if (fe->ops.get_tune_settings && (fe->ops.get_tune_settings(fe, &fetunesettings) == 0)) { + if (fe->ops->get_tune_settings && (fe->ops->get_tune_settings(fe, &fetunesettings) == 0)) { fepriv->min_delay = (fetunesettings.min_delay_ms * HZ) / 1000; fepriv->max_drift = fetunesettings.max_drift; fepriv->step_size = fetunesettings.step_size; } else { /* default values */ - switch(fe->ops.info.type) { + switch(fe->ops->info.type) { case FE_QPSK: fepriv->min_delay = HZ/20; fepriv->step_size = fepriv->parameters.u.qpsk.symbol_rate / 16000; @@ -944,13 +903,11 @@ static int dvb_frontend_ioctl(struct inode *inode, struct file *file, case FE_OFDM: fepriv->min_delay = HZ/20; - fepriv->step_size = fe->ops.info.frequency_stepsize * 2; - fepriv->max_drift = (fe->ops.info.frequency_stepsize * 2) + 1; + fepriv->step_size = fe->ops->info.frequency_stepsize * 2; + fepriv->max_drift = (fe->ops->info.frequency_stepsize * 2) + 1; break; case FE_ATSC: - fepriv->min_delay = HZ/20; - fepriv->step_size = 0; - fepriv->max_drift = 0; + printk("dvb-core: FE_ATSC not handled yet.\n"); break; } } @@ -970,15 +927,14 @@ static int dvb_frontend_ioctl(struct inode *inode, struct file *file, break; case FE_GET_FRONTEND: - if (fe->ops.get_frontend) { + if (fe->ops->get_frontend) { memcpy (parg, &fepriv->parameters, sizeof (struct dvb_frontend_parameters)); - err = fe->ops.get_frontend(fe, (struct dvb_frontend_parameters*) parg); + err = fe->ops->get_frontend(fe, (struct dvb_frontend_parameters*) parg); } break; case FE_SET_FRONTEND_TUNE_MODE: fepriv->tune_mode_flags = (unsigned long) parg; - err = 0; break; }; @@ -1015,18 +971,15 @@ static int dvb_frontend_open(struct inode *inode, struct file *file) return ret; if ((file->f_flags & O_ACCMODE) != O_RDONLY) { - - /* normal tune mode when opened R/W */ - fepriv->tune_mode_flags &= ~FE_TUNE_MODE_ONESHOT; - fepriv->tone = -1; - fepriv->voltage = -1; - ret = dvb_frontend_start (fe); if (ret) dvb_generic_release (inode, file); /* empty event queue */ fepriv->events.eventr = fepriv->events.eventw = 0; + + /* normal tune mode when opened R/W */ + fepriv->tune_mode_flags &= ~FE_TUNE_MODE_ONESHOT; } return ret; @@ -1068,12 +1021,12 @@ int dvb_register_frontend(struct dvb_adapter* dvb, dprintk ("%s\n", __FUNCTION__); - if (mutex_lock_interruptible(&frontend_mutex)) + if (down_interruptible (&frontend_mutex)) return -ERESTARTSYS; fe->frontend_priv = kzalloc(sizeof(struct dvb_frontend_private), GFP_KERNEL); if (fe->frontend_priv == NULL) { - mutex_unlock(&frontend_mutex); + up(&frontend_mutex); return -ENOMEM; } fepriv = fe->frontend_priv; @@ -1087,12 +1040,12 @@ int dvb_register_frontend(struct dvb_adapter* dvb, printk ("DVB: registering frontend %i (%s)...\n", fe->dvb->num, - fe->ops.info.name); + fe->ops->info.name); dvb_register_device (fe->dvb, &fepriv->dvbdev, &dvbdev_template, fe, DVB_DEVICE_FRONTEND); - mutex_unlock(&frontend_mutex); + up (&frontend_mutex); return 0; } EXPORT_SYMBOL(dvb_register_frontend); @@ -1102,21 +1055,16 @@ int dvb_unregister_frontend(struct dvb_frontend* fe) struct dvb_frontend_private *fepriv = fe->frontend_priv; dprintk ("%s\n", __FUNCTION__); - mutex_lock(&frontend_mutex); + down (&frontend_mutex); dvb_unregister_device (fepriv->dvbdev); dvb_frontend_stop (fe); - if (fe->ops.tuner_ops.release) { - fe->ops.tuner_ops.release(fe); - if (fe->ops.i2c_gate_ctrl) - fe->ops.i2c_gate_ctrl(fe, 0); - } - if (fe->ops.release) - fe->ops.release(fe); + if (fe->ops->release) + fe->ops->release(fe); else - printk("dvb_frontend: Demodulator (%s) does not have a release callback!\n", fe->ops.info.name); + printk("dvb_frontend: Demodulator (%s) does not have a release callback!\n", fe->ops->info.name); /* fe is invalid now */ kfree(fepriv); - mutex_unlock(&frontend_mutex); + up (&frontend_mutex); return 0; } EXPORT_SYMBOL(dvb_unregister_frontend); diff --git a/drivers/media/dvb/dvb-core/dvb_frontend.h b/drivers/media/dvb/dvb-core/dvb_frontend.h index 2887e2b86..70a6d14ef 100644 --- a/drivers/media/dvb/dvb-core/dvb_frontend.h +++ b/drivers/media/dvb/dvb-core/dvb_frontend.h @@ -49,44 +49,6 @@ struct dvb_frontend_tune_settings { struct dvb_frontend; -struct dvb_tuner_info { - char name[128]; - - u32 frequency_min; - u32 frequency_max; - u32 frequency_step; - - u32 bandwidth_min; - u32 bandwidth_max; - u32 bandwidth_step; -}; - -struct dvb_tuner_ops { - - struct dvb_tuner_info info; - - int (*release)(struct dvb_frontend *fe); - int (*init)(struct dvb_frontend *fe); - int (*sleep)(struct dvb_frontend *fe); - - /** This is for simple PLLs - set all parameters in one go. */ - int (*set_params)(struct dvb_frontend *fe, struct dvb_frontend_parameters *p); - - /** This is support for demods like the mt352 - fills out the supplied buffer with what to write. */ - int (*calc_regs)(struct dvb_frontend *fe, struct dvb_frontend_parameters *p, u8 *buf, int buf_len); - - int (*get_frequency)(struct dvb_frontend *fe, u32 *frequency); - int (*get_bandwidth)(struct dvb_frontend *fe, u32 *bandwidth); - -#define TUNER_STATUS_LOCKED 1 - int (*get_status)(struct dvb_frontend *fe, u32 *status); - - /** These are provided seperately from set_params in order to facilitate silicon - * tuners which require sophisticated tuning loops, controlling each parameter seperately. */ - int (*set_frequency)(struct dvb_frontend *fe, u32 frequency); - int (*set_bandwidth)(struct dvb_frontend *fe, u32 bandwidth); -}; - struct dvb_frontend_ops { struct dvb_frontend_info info; @@ -102,8 +64,6 @@ struct dvb_frontend_ops { unsigned int mode_flags, int *delay, fe_status_t *status); - /* get frontend tuning algorithm from the module */ - int (*get_frontend_algo)(struct dvb_frontend *fe); /* these two are only used for the swzigzag code */ int (*set_frontend)(struct dvb_frontend* fe, struct dvb_frontend_parameters* params); @@ -126,8 +86,6 @@ struct dvb_frontend_ops { int (*enable_high_lnb_voltage)(struct dvb_frontend* fe, long arg); int (*dishnetwork_send_legacy_command)(struct dvb_frontend* fe, unsigned long cmd); int (*i2c_gate_ctrl)(struct dvb_frontend* fe, int enable); - - struct dvb_tuner_ops tuner_ops; }; #define MAX_EVENT 8 @@ -142,12 +100,10 @@ struct dvb_fe_events { }; struct dvb_frontend { - struct dvb_frontend_ops ops; + struct dvb_frontend_ops* ops; struct dvb_adapter *dvb; void* demodulator_priv; - void* tuner_priv; void* frontend_priv; - void* misc_priv; }; extern int dvb_register_frontend(struct dvb_adapter* dvb, @@ -155,8 +111,6 @@ extern int dvb_register_frontend(struct dvb_adapter* dvb, extern int dvb_unregister_frontend(struct dvb_frontend* fe); -extern void dvb_frontend_reinitialise(struct dvb_frontend *fe); - extern void dvb_frontend_sleep_until(struct timeval *waketime, u32 add_usec); extern s32 timeval_usec_diff(struct timeval lasttime, struct timeval curtime); diff --git a/drivers/media/dvb/dvb-core/dvb_net.c b/drivers/media/dvb/dvb-core/dvb_net.c index 8859ab74f..bdc491452 100644 --- a/drivers/media/dvb/dvb-core/dvb_net.c +++ b/drivers/media/dvb/dvb-core/dvb_net.c @@ -12,7 +12,7 @@ * Hilmar Linder * and Wolfram Stering * - * ULE Decaps according to RFC 4326. + * ULE Decaps according to draft-ietf-ipdvb-ule-03.txt. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -42,9 +42,6 @@ * Bugfixes and robustness improvements. * Filtering on dest MAC addresses, if present (D-Bit = 0) * ULE_DEBUG compile-time option. - * Apr 2006: cp v3: Bugfixes and compliency with RFC 4326 (ULE) by - * Christian Praehauser , - * Paris Lodron University of Salzburg. */ /* @@ -52,6 +49,9 @@ * * Unloading does not work for 2.6.9 kernels: a refcount doesn't go to zero. * + * TS_FEED callback is called once for every single TS cell although it is + * registered (in dvb_net_feed_start()) for 100 TS cells (used for dvb_net_ule()). + * */ #include @@ -62,7 +62,6 @@ #include #include #include -#include #include "dvb_demux.h" #include "dvb_net.h" @@ -89,9 +88,6 @@ static inline __u32 iov_crc32( __u32 c, struct kvec *iov, unsigned int cnt ) #ifdef ULE_DEBUG -#define MAC_ADDR_PRINTFMT "%.2x:%.2x:%.2x:%.2x:%.2x:%.2x" -#define MAX_ADDR_PRINTFMT_ARGS(macap) (macap)[0],(macap)[1],(macap)[2],(macap)[3],(macap)[4],(macap)[5] - #define isprint(c) ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9')) static void hexdump( const unsigned char *buf, unsigned short len ) @@ -155,7 +151,8 @@ struct dvb_net_priv { unsigned char ule_bridged; /* Whether the ULE_BRIDGED extension header was found. */ int ule_sndu_remain; /* Nr. of bytes still required for current ULE SNDU. */ unsigned long ts_count; /* Current ts cell counter. */ - struct mutex mutex; + + struct semaphore mutex; }; @@ -217,8 +214,6 @@ static unsigned short dvb_net_eth_type_trans(struct sk_buff *skb, #define ULE_TEST 0 #define ULE_BRIDGED 1 -#define ULE_OPTEXTHDR_PADDING 0 - static int ule_test_sndu( struct dvb_net_priv *p ) { return -1; @@ -226,28 +221,14 @@ static int ule_test_sndu( struct dvb_net_priv *p ) static int ule_bridged_sndu( struct dvb_net_priv *p ) { - struct ethhdr *hdr = (struct ethhdr*) p->ule_next_hdr; - if(ntohs(hdr->h_proto) < 1536) { - int framelen = p->ule_sndu_len - ((p->ule_next_hdr+sizeof(struct ethhdr)) - p->ule_skb->data); - /* A frame Type < 1536 for a bridged frame, introduces a LLC Length field. */ - if(framelen != ntohs(hdr->h_proto)) { - return -1; - } - } - /* Note: - * From RFC4326: - * "A bridged SNDU is a Mandatory Extension Header of Type 1. - * It must be the final (or only) extension header specified in the header chain of a SNDU." - * The 'ule_bridged' flag will cause the extension header processing loop to terminate. + /* BRIDGE SNDU handling sucks in draft-ietf-ipdvb-ule-03.txt. + * This has to be the last extension header, otherwise it won't work. + * Blame the authors! */ p->ule_bridged = 1; return 0; } -static int ule_exthdr_padding(struct dvb_net_priv *p) -{ - return 0; -} /** Handle ULE extension headers. * Function is called after a successful CRC32 verification of an ULE SNDU to complete its decoding. @@ -261,8 +242,7 @@ static int handle_one_ule_extension( struct dvb_net_priv *p ) { [0] = ule_test_sndu, [1] = ule_bridged_sndu, [2] = NULL, }; /* Table of optional extension header handlers. The header type is the index. */ - static int (*ule_optional_ext_handlers[255])( struct dvb_net_priv *p ) = - { [0] = ule_exthdr_padding, [1] = NULL, }; + static int (*ule_optional_ext_handlers[255])( struct dvb_net_priv *p ) = { NULL, }; int ext_len = 0; unsigned char hlen = (p->ule_sndu_type & 0x0700) >> 8; @@ -273,31 +253,25 @@ static int handle_one_ule_extension( struct dvb_net_priv *p ) /* Mandatory extension header */ if (ule_mandatory_ext_handlers[htype]) { ext_len = ule_mandatory_ext_handlers[htype]( p ); - if(ext_len >= 0) { - p->ule_next_hdr += ext_len; - if (!p->ule_bridged) { - p->ule_sndu_type = ntohs(*(unsigned short *)p->ule_next_hdr); - p->ule_next_hdr += 2; - } else { - p->ule_sndu_type = ntohs(*(unsigned short *)(p->ule_next_hdr + ((p->ule_dbit ? 2 : 3) * ETH_ALEN))); - /* This assures the extension handling loop will terminate. */ - } + p->ule_next_hdr += ext_len; + if (! p->ule_bridged) { + p->ule_sndu_type = ntohs( *(unsigned short *)p->ule_next_hdr ); + p->ule_next_hdr += 2; + } else { + p->ule_sndu_type = ntohs( *(unsigned short *)(p->ule_next_hdr + ((p->ule_dbit ? 2 : 3) * ETH_ALEN)) ); + /* This assures the extension handling loop will terminate. */ } - // else: extension handler failed or SNDU should be discarded } else ext_len = -1; /* SNDU has to be discarded. */ } else { /* Optional extension header. Calculate the length. */ - ext_len = hlen << 1; + ext_len = hlen << 2; /* Process the optional extension header according to its type. */ if (ule_optional_ext_handlers[htype]) (void)ule_optional_ext_handlers[htype]( p ); p->ule_next_hdr += ext_len; - p->ule_sndu_type = ntohs( *(unsigned short *)(p->ule_next_hdr-2) ); - /* - * note: the length of the next header type is included in the - * length of THIS optional extension header - */ + p->ule_sndu_type = ntohs( *(unsigned short *)p->ule_next_hdr ); + p->ule_next_hdr += 2; } return ext_len; @@ -310,14 +284,8 @@ static int handle_ule_extensions( struct dvb_net_priv *p ) p->ule_next_hdr = p->ule_skb->data; do { l = handle_one_ule_extension( p ); - if (l < 0) - return l; /* Stop extension header processing and discard SNDU. */ + if (l == -1) return -1; /* Stop extension header processing and discard SNDU. */ total_ext_len += l; -#ifdef ULE_DEBUG - dprintk("handle_ule_extensions: ule_next_hdr=%p, ule_sndu_type=%i, " - "l=%i, total_ext_len=%i\n", p->ule_next_hdr, - (int) p->ule_sndu_type, l, total_ext_len); -#endif } while (p->ule_sndu_type < 1536); @@ -387,8 +355,8 @@ static void dvb_net_ule( struct net_device *dev, const u8 *buf, size_t buf_len ) if (priv->ule_skb) { dev_kfree_skb( priv->ule_skb ); /* Prepare for next SNDU. */ - priv->stats.rx_errors++; - priv->stats.rx_frame_errors++; + ((struct dvb_net_priv *) dev->priv)->stats.rx_errors++; + ((struct dvb_net_priv *) dev->priv)->stats.rx_frame_errors++; } reset_ule(priv); priv->need_pusi = 1; @@ -428,25 +396,27 @@ static void dvb_net_ule( struct net_device *dev, const u8 *buf, size_t buf_len ) } } + /* Check continuity counter. */ if (new_ts) { - /* Check continuity counter. */ if ((ts[3] & 0x0F) == priv->tscc) priv->tscc = (priv->tscc + 1) & 0x0F; else { /* TS discontinuity handling: */ printk(KERN_WARNING "%lu: TS discontinuity: got %#x, " - "expected %#x.\n", priv->ts_count, ts[3] & 0x0F, priv->tscc); + "exptected %#x.\n", priv->ts_count, ts[3] & 0x0F, priv->tscc); /* Drop partly decoded SNDU, reset state, resync on PUSI. */ if (priv->ule_skb) { dev_kfree_skb( priv->ule_skb ); /* Prepare for next SNDU. */ // reset_ule(priv); moved to below. - priv->stats.rx_errors++; - priv->stats.rx_frame_errors++; + ((struct dvb_net_priv *) dev->priv)->stats.rx_errors++; + ((struct dvb_net_priv *) dev->priv)->stats.rx_frame_errors++; } reset_ule(priv); /* skip to next PUSI. */ priv->need_pusi = 1; + ts += TS_SZ; + priv->ts_count++; continue; } /* If we still have an incomplete payload, but PUSI is @@ -455,7 +425,7 @@ static void dvb_net_ule( struct net_device *dev, const u8 *buf, size_t buf_len ) * cells (continuity counter wrap). */ if (ts[1] & TS_PUSI) { if (! priv->need_pusi) { - if (!(*from_where < (ts_remain-1)) || *from_where != priv->ule_sndu_remain) { + if (*from_where > 181) { /* Pointer field is invalid. Drop this TS cell and any started ULE SNDU. */ printk(KERN_WARNING "%lu: Invalid pointer " "field: %u.\n", priv->ts_count, *from_where); @@ -468,6 +438,8 @@ static void dvb_net_ule( struct net_device *dev, const u8 *buf, size_t buf_len ) } reset_ule(priv); priv->need_pusi = 1; + ts += TS_SZ; + priv->ts_count++; continue; } /* Skip pointer field (we're processing a @@ -480,8 +452,8 @@ static void dvb_net_ule( struct net_device *dev, const u8 *buf, size_t buf_len ) if (priv->ule_sndu_remain > 183) { /* Current SNDU lacks more data than there could be available in the * current TS cell. */ - priv->stats.rx_errors++; - priv->stats.rx_length_errors++; + ((struct dvb_net_priv *) dev->priv)->stats.rx_errors++; + ((struct dvb_net_priv *) dev->priv)->stats.rx_length_errors++; printk(KERN_WARNING "%lu: Expected %d more SNDU bytes, but " "got PUSI (pf %d, ts_remain %d). Flushing incomplete payload.\n", priv->ts_count, priv->ule_sndu_remain, ts[4], ts_remain); @@ -520,11 +492,10 @@ static void dvb_net_ule( struct net_device *dev, const u8 *buf, size_t buf_len ) } else priv->ule_dbit = 0; - if (priv->ule_sndu_len < 5) { + if (priv->ule_sndu_len > 32763 || + priv->ule_sndu_len < ((priv->ule_dbit) ? 4 : 4 + ETH_ALEN)) { printk(KERN_WARNING "%lu: Invalid ULE SNDU length %u. " "Resyncing.\n", priv->ts_count, priv->ule_sndu_len); - priv->stats.rx_errors++; - priv->stats.rx_length_errors++; priv->ule_sndu_len = 0; priv->need_pusi = 1; new_ts = 1; @@ -638,103 +609,58 @@ static void dvb_net_ule( struct net_device *dev, const u8 *buf, size_t buf_len ) ule_dump = 1; #endif - priv->stats.rx_errors++; - priv->stats.rx_crc_errors++; + ((struct dvb_net_priv *) dev->priv)->stats.rx_errors++; + ((struct dvb_net_priv *) dev->priv)->stats.rx_crc_errors++; dev_kfree_skb(priv->ule_skb); } else { /* CRC32 verified OK. */ - u8 dest_addr[ETH_ALEN]; - static const u8 bc_addr[ETH_ALEN] = - { [ 0 ... ETH_ALEN-1] = 0xff }; - - /* CRC32 was OK. Remove it from skb. */ - priv->ule_skb->tail -= 4; - priv->ule_skb->len -= 4; - - if (!priv->ule_dbit) { - /* - * The destination MAC address is the - * next data in the skb. It comes - * before any extension headers. - * - * Check if the payload of this SNDU - * should be passed up the stack. - */ - register int drop = 0; - if (priv->rx_mode != RX_MODE_PROMISC) { - if (priv->ule_skb->data[0] & 0x01) { - /* multicast or broadcast */ - if (memcmp(priv->ule_skb->data, bc_addr, ETH_ALEN)) { - /* multicast */ - if (priv->rx_mode == RX_MODE_MULTI) { - int i; - for(i = 0; i < priv->multi_num && memcmp(priv->ule_skb->data, priv->multi_macs[i], ETH_ALEN); i++) - ; - if (i == priv->multi_num) - drop = 1; - } else if (priv->rx_mode != RX_MODE_ALL_MULTI) - drop = 1; /* no broadcast; */ - /* else: all multicast mode: accept all multicast packets */ - } - /* else: broadcast */ - } - else if (memcmp(priv->ule_skb->data, dev->dev_addr, ETH_ALEN)) - drop = 1; - /* else: destination address matches the MAC address of our receiver device */ - } - /* else: promiscious mode; pass everything up the stack */ - - if (drop) { -#ifdef ULE_DEBUG - dprintk("Dropping SNDU: MAC destination address does not match: dest addr: "MAC_ADDR_PRINTFMT", dev addr: "MAC_ADDR_PRINTFMT"\n", - MAX_ADDR_PRINTFMT_ARGS(priv->ule_skb->data), MAX_ADDR_PRINTFMT_ARGS(dev->dev_addr)); -#endif - dev_kfree_skb(priv->ule_skb); - goto sndu_done; - } - else - { - memcpy(dest_addr, priv->ule_skb->data, ETH_ALEN); - skb_pull(priv->ule_skb, ETH_ALEN); - } - } - /* Handle ULE Extension Headers. */ if (priv->ule_sndu_type < 1536) { /* There is an extension header. Handle it accordingly. */ - int l = handle_ule_extensions(priv); + int l = handle_ule_extensions( priv ); if (l < 0) { /* Mandatory extension header unknown or TEST SNDU. Drop it. */ // printk( KERN_WARNING "Dropping SNDU, extension headers.\n" ); - dev_kfree_skb(priv->ule_skb); + dev_kfree_skb( priv->ule_skb ); goto sndu_done; } - skb_pull(priv->ule_skb, l); + skb_pull( priv->ule_skb, l ); } - /* - * Construct/assure correct ethernet header. - * Note: in bridged mode (priv->ule_bridged != - * 0) we already have the (original) ethernet - * header at the start of the payload (after - * optional dest. address and any extension - * headers). - */ - - if (!priv->ule_bridged) { - skb_push(priv->ule_skb, ETH_HLEN); - ethh = (struct ethhdr *)priv->ule_skb->data; - if (!priv->ule_dbit) { - /* dest_addr buffer is only valid if priv->ule_dbit == 0 */ - memcpy(ethh->h_dest, dest_addr, ETH_ALEN); - memset(ethh->h_source, 0, ETH_ALEN); - } - else /* zeroize source and dest */ - memset( ethh, 0, ETH_ALEN*2 ); + /* CRC32 was OK. Remove it from skb. */ + priv->ule_skb->tail -= 4; + priv->ule_skb->len -= 4; - ethh->h_proto = htons(priv->ule_sndu_type); + /* Filter on receiver's destination MAC address, if present. */ + if (!priv->ule_dbit) { + /* The destination MAC address is the next data in the skb. */ + if (memcmp( priv->ule_skb->data, dev->dev_addr, ETH_ALEN )) { + /* MAC addresses don't match. Drop SNDU. */ + // printk( KERN_WARNING "Dropping SNDU, MAC address.\n" ); + dev_kfree_skb( priv->ule_skb ); + goto sndu_done; + } + if (! priv->ule_bridged) { + skb_push( priv->ule_skb, ETH_ALEN + 2 ); + ethh = (struct ethhdr *)priv->ule_skb->data; + memcpy( ethh->h_dest, ethh->h_source, ETH_ALEN ); + memset( ethh->h_source, 0, ETH_ALEN ); + ethh->h_proto = htons( priv->ule_sndu_type ); + } else { + /* Skip the Receiver destination MAC address. */ + skb_pull( priv->ule_skb, ETH_ALEN ); + } + } else { + if (! priv->ule_bridged) { + skb_push( priv->ule_skb, ETH_HLEN ); + ethh = (struct ethhdr *)priv->ule_skb->data; + memcpy( ethh->h_dest, dev->dev_addr, ETH_ALEN ); + memset( ethh->h_source, 0, ETH_ALEN ); + ethh->h_proto = htons( priv->ule_sndu_type ); + } else { + /* skb is in correct state; nothing to do. */ + } } - /* else: skb is in correct state; nothing to do. */ priv->ule_bridged = 0; /* Stuff into kernel's protocol stack. */ @@ -743,8 +669,8 @@ static void dvb_net_ule( struct net_device *dev, const u8 *buf, size_t buf_len ) * receive the packet anyhow. */ /* if (priv->ule_dbit && skb->pkt_type == PACKET_OTHERHOST) priv->ule_skb->pkt_type = PACKET_HOST; */ - priv->stats.rx_packets++; - priv->stats.rx_bytes += priv->ule_skb->len; + ((struct dvb_net_priv *) dev->priv)->stats.rx_packets++; + ((struct dvb_net_priv *) dev->priv)->stats.rx_bytes += priv->ule_skb->len; netif_rx(priv->ule_skb); } sndu_done: @@ -964,7 +890,7 @@ static int dvb_net_feed_start(struct net_device *dev) unsigned char *mac = (unsigned char *) dev->dev_addr; dprintk("%s: rx_mode %i\n", __FUNCTION__, priv->rx_mode); - mutex_lock(&priv->mutex); + down(&priv->mutex); if (priv->tsfeed || priv->secfeed || priv->secfilter || priv->multi_secfilter[0]) printk("%s: BUG %d\n", __FUNCTION__, __LINE__); @@ -1019,7 +945,7 @@ static int dvb_net_feed_start(struct net_device *dev) dprintk("%s: start filtering\n", __FUNCTION__); priv->secfeed->start_filtering(priv->secfeed); } else if (priv->feedtype == DVB_NET_FEEDTYPE_ULE) { - struct timespec timeout = { 0, 10000000 }; // 10 msec + struct timespec timeout = { 0, 30000000 }; // 30 msec /* we have payloads encapsulated in TS */ dprintk("%s: alloc tsfeed\n", __FUNCTION__); @@ -1031,13 +957,10 @@ static int dvb_net_feed_start(struct net_device *dev) /* Set netdevice pointer for ts decaps callback. */ priv->tsfeed->priv = (void *)dev; - ret = priv->tsfeed->set(priv->tsfeed, - priv->pid, /* pid */ - TS_PACKET, /* type */ - DMX_TS_PES_OTHER, /* pes type */ + ret = priv->tsfeed->set(priv->tsfeed, priv->pid, + TS_PACKET, DMX_TS_PES_OTHER, 32768, /* circular buffer size */ - timeout /* timeout */ - ); + timeout); if (ret < 0) { printk("%s: could not set ts feed\n", dev->name); @@ -1052,7 +975,7 @@ static int dvb_net_feed_start(struct net_device *dev) ret = -EINVAL; error: - mutex_unlock(&priv->mutex); + up(&priv->mutex); return ret; } @@ -1062,7 +985,7 @@ static int dvb_net_feed_stop(struct net_device *dev) int i, ret = 0; dprintk("%s\n", __FUNCTION__); - mutex_lock(&priv->mutex); + down(&priv->mutex); if (priv->feedtype == DVB_NET_FEEDTYPE_MPE) { if (priv->secfeed) { if (priv->secfeed->is_filtering) { @@ -1104,7 +1027,7 @@ static int dvb_net_feed_stop(struct net_device *dev) printk("%s: no ts feed to stop\n", dev->name); } else ret = -EINVAL; - mutex_unlock(&priv->mutex); + up(&priv->mutex); return ret; } @@ -1130,7 +1053,7 @@ static void wq_set_multicast_list (void *data) dvb_net_feed_stop(dev); priv->rx_mode = RX_MODE_UNI; - netif_tx_lock_bh(dev); + spin_lock_bh(&dev->xmit_lock); if (dev->flags & IFF_PROMISC) { dprintk("%s: promiscuous mode\n", dev->name); @@ -1155,7 +1078,7 @@ static void wq_set_multicast_list (void *data) } } - netif_tx_unlock_bh(dev); + spin_unlock_bh(&dev->xmit_lock); dvb_net_feed_start(dev); } @@ -1286,7 +1209,7 @@ static int dvb_net_add_if(struct dvb_net *dvbnet, u16 pid, u8 feedtype) INIT_WORK(&priv->set_multicast_list_wq, wq_set_multicast_list, net); INIT_WORK(&priv->restart_net_feed_wq, wq_restart_net_feed, net); - mutex_init(&priv->mutex); + init_MUTEX(&priv->mutex); net->base_addr = pid; diff --git a/drivers/media/dvb/dvb-core/dvb_ringbuffer.c b/drivers/media/dvb/dvb-core/dvb_ringbuffer.c index c972fe014..77ad2410f 100644 --- a/drivers/media/dvb/dvb-core/dvb_ringbuffer.c +++ b/drivers/media/dvb/dvb-core/dvb_ringbuffer.c @@ -45,7 +45,6 @@ void dvb_ringbuffer_init(struct dvb_ringbuffer *rbuf, void *data, size_t len) rbuf->pread=rbuf->pwrite=0; rbuf->data=data; rbuf->size=len; - rbuf->error=0; init_waitqueue_head(&rbuf->queue); @@ -88,7 +87,6 @@ ssize_t dvb_ringbuffer_avail(struct dvb_ringbuffer *rbuf) void dvb_ringbuffer_flush(struct dvb_ringbuffer *rbuf) { rbuf->pread = rbuf->pwrite; - rbuf->error = 0; } diff --git a/drivers/media/dvb/dvb-core/dvb_ringbuffer.h b/drivers/media/dvb/dvb-core/dvb_ringbuffer.h index d97714e75..6d2560972 100644 --- a/drivers/media/dvb/dvb-core/dvb_ringbuffer.h +++ b/drivers/media/dvb/dvb-core/dvb_ringbuffer.h @@ -35,7 +35,6 @@ struct dvb_ringbuffer { ssize_t size; ssize_t pread; ssize_t pwrite; - int error; wait_queue_head_t queue; spinlock_t lock; diff --git a/drivers/media/dvb/dvb-core/dvbdev.c b/drivers/media/dvb/dvb-core/dvbdev.c index 40774feb8..54f8b9571 100644 --- a/drivers/media/dvb/dvb-core/dvbdev.c +++ b/drivers/media/dvb/dvb-core/dvbdev.c @@ -86,7 +86,7 @@ static int dvb_device_open(struct inode *inode, struct file *file) if (dvbdev && dvbdev->fops) { int err = 0; - const struct file_operations *old_fops; + struct file_operations *old_fops; file->private_data = dvbdev; old_fops = file->f_op; @@ -219,6 +219,8 @@ int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev, return -ENOMEM; } + mutex_unlock(&dvbdev_register_lock); + memcpy(dvbdev, template, sizeof(struct dvb_device)); dvbdev->type = type; dvbdev->id = id; @@ -229,10 +231,12 @@ int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev, list_add_tail (&dvbdev->list_head, &adap->device_list); - mutex_unlock(&dvbdev_register_lock); + devfs_mk_cdev(MKDEV(DVB_MAJOR, nums2minor(adap->num, type, id)), + S_IFCHR | S_IRUSR | S_IWUSR, + "dvb/adapter%d/%s%d", adap->num, dnames[type], id); class_device_create(dvb_class, NULL, MKDEV(DVB_MAJOR, nums2minor(adap->num, type, id)), - adap->device, "dvb%d.%s%d", adap->num, dnames[type], id); + NULL, "dvb%d.%s%d", adap->num, dnames[type], id); dprintk("DVB: register adapter%d/%s%d @ minor: %i (0x%02x)\n", adap->num, dnames[type], id, nums2minor(adap->num, type, id), @@ -248,6 +252,9 @@ void dvb_unregister_device(struct dvb_device *dvbdev) if (!dvbdev) return; + devfs_remove("dvb/adapter%d/%s%d", dvbdev->adapter->num, + dnames[dvbdev->type], dvbdev->id); + class_device_destroy(dvb_class, MKDEV(DVB_MAJOR, nums2minor(dvbdev->adapter->num, dvbdev->type, dvbdev->id))); @@ -278,7 +285,7 @@ skip: } -int dvb_register_adapter(struct dvb_adapter *adap, const char *name, struct module *module, struct device *device) +int dvb_register_adapter(struct dvb_adapter *adap, const char *name, struct module *module) { int num; @@ -295,10 +302,10 @@ int dvb_register_adapter(struct dvb_adapter *adap, const char *name, struct modu printk ("DVB: registering new adapter (%s).\n", name); + devfs_mk_dir("dvb/adapter%d", num); adap->num = num; adap->name = name; adap->module = module; - adap->device = device; list_add_tail (&adap->list_head, &dvb_adapter_list); @@ -311,6 +318,8 @@ EXPORT_SYMBOL(dvb_register_adapter); int dvb_unregister_adapter(struct dvb_adapter *adap) { + devfs_remove("dvb/adapter%d", adap->num); + if (mutex_lock_interruptible(&dvbdev_register_lock)) return -ERESTARTSYS; list_del (&adap->list_head); @@ -400,6 +409,8 @@ static int __init init_dvbdev(void) goto error; } + devfs_mk_dir("dvb"); + dvb_class = class_create(THIS_MODULE, "dvb"); if (IS_ERR(dvb_class)) { retval = PTR_ERR(dvb_class); @@ -416,6 +427,7 @@ error: static void __exit exit_dvbdev(void) { + devfs_remove("dvb"); class_destroy(dvb_class); cdev_del(&dvb_device_cdev); unregister_chrdev_region(MKDEV(DVB_MAJOR, 0), MAX_DVB_MINORS); diff --git a/drivers/media/dvb/dvb-core/dvbdev.h b/drivers/media/dvb/dvb-core/dvbdev.h index 7a7f75fd1..74ed5853f 100644 --- a/drivers/media/dvb/dvb-core/dvbdev.h +++ b/drivers/media/dvb/dvb-core/dvbdev.h @@ -27,6 +27,7 @@ #include #include #include +#include #include #define DVB_MAJOR 212 @@ -50,8 +51,6 @@ struct dvb_adapter { u8 proposed_mac [6]; void* priv; - struct device *device; - struct module *module; }; @@ -77,7 +76,7 @@ struct dvb_device { }; -extern int dvb_register_adapter (struct dvb_adapter *adap, const char *name, struct module *module, struct device *device); +extern int dvb_register_adapter (struct dvb_adapter *adap, const char *name, struct module *module); extern int dvb_unregister_adapter (struct dvb_adapter *adap); extern int dvb_register_device (struct dvb_adapter *adap, diff --git a/drivers/media/dvb/dvb-usb/Kconfig b/drivers/media/dvb/dvb-usb/Kconfig index 75824b771..d3df12039 100644 --- a/drivers/media/dvb/dvb-usb/Kconfig +++ b/drivers/media/dvb/dvb-usb/Kconfig @@ -1,8 +1,7 @@ config DVB_USB tristate "Support for various USB DVB devices" - depends on DVB_CORE && USB && I2C + depends on DVB_CORE && USB select FW_LOADER - select DVB_PLL help By enabling this you will be able to choose the various supported USB1.1 and USB2.0 DVB devices. @@ -89,7 +88,6 @@ config DVB_USB_CXUSB select DVB_CX22702 select DVB_LGDT330X select DVB_MT352 - select DVB_ZL10353 help Say Y here to support the Conexant USB2.0 hybrid reference design. Currently, only DVB and ATSC modes are supported, analog mode @@ -132,15 +130,6 @@ config DVB_USB_VP702X DVB-S USB2.0 receivers. -config DVB_USB_GP8PSK - tristate "GENPIX 8PSK->USB module support" - depends on DVB_USB - help - Say Y here to support the - GENPIX 8psk module - - DVB-S USB2.0 receivers. - config DVB_USB_NOVA_T_USB2 tristate "Hauppauge WinTV-NOVA-T usb2 DVB-T USB2.0 support" depends on DVB_USB diff --git a/drivers/media/dvb/dvb-usb/Makefile b/drivers/media/dvb/dvb-usb/Makefile index 9643f56c7..2dc9aad96 100644 --- a/drivers/media/dvb/dvb-usb/Makefile +++ b/drivers/media/dvb/dvb-usb/Makefile @@ -7,9 +7,6 @@ obj-$(CONFIG_DVB_USB_VP7045) += dvb-usb-vp7045.o dvb-usb-vp702x-objs = vp702x.o vp702x-fe.o obj-$(CONFIG_DVB_USB_VP702X) += dvb-usb-vp702x.o -dvb-usb-gp8psk-objs = gp8psk.o gp8psk-fe.o -obj-$(CONFIG_DVB_USB_GP8PSK) += dvb-usb-gp8psk.o - dvb-usb-dtt200u-objs = dtt200u.o dtt200u-fe.o obj-$(CONFIG_DVB_USB_DTT200U) += dvb-usb-dtt200u.o diff --git a/drivers/media/dvb/dvb-usb/cxusb.c b/drivers/media/dvb/dvb-usb/cxusb.c index ae23bdde4..356a09a69 100644 --- a/drivers/media/dvb/dvb-usb/cxusb.c +++ b/drivers/media/dvb/dvb-usb/cxusb.c @@ -27,10 +27,8 @@ #include "cx22702.h" #include "lgdt330x.h" -#include "lg_h06xf.h" #include "mt352.h" #include "mt352_priv.h" -#include "zl10353.h" /* debug */ int dvb_usb_cxusb_debug; @@ -79,23 +77,22 @@ static int cxusb_i2c_xfer(struct i2c_adapter *adap,struct i2c_msg msg[],int num) struct dvb_usb_device *d = i2c_get_adapdata(adap); int i; - if (mutex_lock_interruptible(&d->i2c_mutex) < 0) + if (down_interruptible(&d->i2c_sem) < 0) return -EAGAIN; if (num > 2) - warn("more than two i2c messages at a time is not handled yet. TODO."); + warn("more than 2 i2c messages at a time is not handled yet. TODO."); for (i = 0; i < num; i++) { - if (d->udev->descriptor.idVendor == USB_VID_MEDION) - switch (msg[i].addr) { - case 0x63: - cxusb_gpio_tuner(d,0); - break; - default: - cxusb_gpio_tuner(d,1); - break; - } + switch (msg[i].addr) { + case 0x63: + cxusb_gpio_tuner(d,0); + break; + default: + cxusb_gpio_tuner(d,1); + break; + } /* read request */ if (i+1 < num && (msg[i+1].flags & I2C_M_RD)) { @@ -111,7 +108,7 @@ static int cxusb_i2c_xfer(struct i2c_adapter *adap,struct i2c_msg msg[],int num) break; if (ibuf[0] != 0x08) - deb_i2c("i2c read may have failed\n"); + deb_info("i2c read could have been failed\n"); memcpy(msg[i+1].buf,&ibuf[1],msg[i+1].len); @@ -125,11 +122,11 @@ static int cxusb_i2c_xfer(struct i2c_adapter *adap,struct i2c_msg msg[],int num) if (cxusb_ctrl_msg(d,CMD_I2C_WRITE, obuf, 2+msg[i].len, &ibuf,1) < 0) break; if (ibuf != 0x08) - deb_i2c("i2c write may have failed\n"); + deb_info("i2c write could have been failed\n"); } } - mutex_unlock(&d->i2c_mutex); + up(&d->i2c_sem); return i; } @@ -244,45 +241,6 @@ static struct dvb_usb_rc_key dvico_mce_rc_keys[] = { { 0xfe, 0x4e, KEY_POWER }, }; -static struct dvb_usb_rc_key dvico_portable_rc_keys[] = { - { 0xfc, 0x02, KEY_SETUP }, /* Profile */ - { 0xfc, 0x43, KEY_POWER2 }, - { 0xfc, 0x06, KEY_EPG }, - { 0xfc, 0x5a, KEY_BACK }, - { 0xfc, 0x05, KEY_MENU }, - { 0xfc, 0x47, KEY_INFO }, - { 0xfc, 0x01, KEY_TAB }, - { 0xfc, 0x42, KEY_PREVIOUSSONG },/* Replay */ - { 0xfc, 0x49, KEY_VOLUMEUP }, - { 0xfc, 0x09, KEY_VOLUMEDOWN }, - { 0xfc, 0x54, KEY_CHANNELUP }, - { 0xfc, 0x0b, KEY_CHANNELDOWN }, - { 0xfc, 0x16, KEY_CAMERA }, - { 0xfc, 0x40, KEY_TUNER }, /* ATV/DTV */ - { 0xfc, 0x45, KEY_OPEN }, - { 0xfc, 0x19, KEY_1 }, - { 0xfc, 0x18, KEY_2 }, - { 0xfc, 0x1b, KEY_3 }, - { 0xfc, 0x1a, KEY_4 }, - { 0xfc, 0x58, KEY_5 }, - { 0xfc, 0x59, KEY_6 }, - { 0xfc, 0x15, KEY_7 }, - { 0xfc, 0x14, KEY_8 }, - { 0xfc, 0x17, KEY_9 }, - { 0xfc, 0x44, KEY_ANGLE }, /* Aspect */ - { 0xfc, 0x55, KEY_0 }, - { 0xfc, 0x07, KEY_ZOOM }, - { 0xfc, 0x0a, KEY_REWIND }, - { 0xfc, 0x08, KEY_PLAYPAUSE }, - { 0xfc, 0x4b, KEY_FASTFORWARD }, - { 0xfc, 0x5b, KEY_MUTE }, - { 0xfc, 0x04, KEY_STOP }, - { 0xfc, 0x56, KEY_RECORD }, - { 0xfc, 0x57, KEY_POWER }, - { 0xfc, 0x41, KEY_UNKNOWN }, /* INPUT */ - { 0xfc, 0x00, KEY_UNKNOWN }, /* HD */ -}; - static int cxusb_dee1601_demod_init(struct dvb_frontend* fe) { static u8 clock_config [] = { CLOCK_CTL, 0x38, 0x28 }; @@ -324,37 +282,32 @@ static int cxusb_mt352_demod_init(struct dvb_frontend* fe) return 0; } -static int cxusb_lgh064f_tuner_set_params(struct dvb_frontend *fe, - struct dvb_frontend_parameters *fep) -{ - struct dvb_usb_device *d = fe->dvb->priv; - return lg_h06xf_pll_set(fe, &d->i2c_adap, fep); -} - static struct cx22702_config cxusb_cx22702_config = { .demod_address = 0x63, .output_mode = CX22702_PARALLEL_OUTPUT, + + .pll_init = dvb_usb_pll_init_i2c, + .pll_set = dvb_usb_pll_set_i2c, }; static struct lgdt330x_config cxusb_lgdt3303_config = { .demod_address = 0x0e, .demod_chip = LGDT3303, + .pll_set = dvb_usb_pll_set_i2c, }; static struct mt352_config cxusb_dee1601_config = { .demod_address = 0x0f, .demod_init = cxusb_dee1601_demod_init, + .pll_set = dvb_usb_pll_set, }; -static struct zl10353_config cxusb_zl10353_dee1601_config = { - .demod_address = 0x0f, -}; - -static struct mt352_config cxusb_mt352_config = { +struct mt352_config cxusb_mt352_config = { /* used in both lgz201 and th7579 */ .demod_address = 0x0f, .demod_init = cxusb_mt352_demod_init, + .pll_set = dvb_usb_pll_set, }; /* Callbacks for DVB USB */ @@ -364,10 +317,17 @@ static int cxusb_fmd1216me_tuner_attach(struct dvb_usb_device *d) d->pll_addr = 0x61; memcpy(d->pll_init, bpll, 4); d->pll_desc = &dvb_pll_fmd1216me; + return 0; +} - d->fe->ops.tuner_ops.init = dvb_usb_tuner_init_i2c; - d->fe->ops.tuner_ops.set_params = dvb_usb_tuner_set_params_i2c; - +static int cxusb_lgh064f_tuner_attach(struct dvb_usb_device *d) +{ + u8 bpll[4] = { 0x00, 0x00, 0x18, 0x50 }; + /* bpll[2] : unset bit 3, set bits 4&5 + bpll[3] : 0x50 - digital, 0x20 - analog */ + d->pll_addr = 0x61; + memcpy(d->pll_init, bpll, 4); + d->pll_desc = &dvb_pll_tdvs_tua6034; return 0; } @@ -375,7 +335,6 @@ static int cxusb_dee1601_tuner_attach(struct dvb_usb_device *d) { d->pll_addr = 0x61; d->pll_desc = &dvb_pll_thomson_dtt7579; - d->fe->ops.tuner_ops.calc_regs = dvb_usb_tuner_calc_regs; return 0; } @@ -383,7 +342,6 @@ static int cxusb_lgz201_tuner_attach(struct dvb_usb_device *d) { d->pll_addr = 0x61; d->pll_desc = &dvb_pll_lg_z201; - d->fe->ops.tuner_ops.calc_regs = dvb_usb_tuner_calc_regs; return 0; } @@ -391,13 +349,6 @@ static int cxusb_dtt7579_tuner_attach(struct dvb_usb_device *d) { d->pll_addr = 0x60; d->pll_desc = &dvb_pll_thomson_dtt7579; - d->fe->ops.tuner_ops.calc_regs = dvb_usb_tuner_calc_regs; - return 0; -} - -static int cxusb_lgdt3303_tuner_attach(struct dvb_usb_device *d) -{ - d->fe->ops.tuner_ops.set_params = cxusb_lgh064f_tuner_set_params; return 0; } @@ -448,8 +399,7 @@ static int cxusb_dee1601_frontend_attach(struct dvb_usb_device *d) cxusb_ctrl_msg(d,CMD_DIGITAL, NULL, 0, NULL, 0); - if (((d->fe = mt352_attach(&cxusb_dee1601_config, &d->i2c_adap)) != NULL) || - ((d->fe = zl10353_attach(&cxusb_zl10353_dee1601_config, &d->i2c_adap)) != NULL)) + if ((d->fe = mt352_attach(&cxusb_dee1601_config, &d->i2c_adap)) != NULL) return 0; return -EIO; @@ -469,6 +419,7 @@ static int bluebird_patch_dvico_firmware_download(struct usb_device *udev, const if (fw->data[BLUEBIRD_01_ID_OFFSET] == (USB_VID_DVICO & 0xff) && fw->data[BLUEBIRD_01_ID_OFFSET + 1] == USB_VID_DVICO >> 8) { + /* FIXME: are we allowed to change the fw-data ? */ fw->data[BLUEBIRD_01_ID_OFFSET + 2] = udev->descriptor.idProduct + 1; fw->data[BLUEBIRD_01_ID_OFFSET + 3] = udev->descriptor.idProduct >> 8; @@ -565,15 +516,10 @@ static struct dvb_usb_properties cxusb_bluebird_lgh064f_properties = { .streaming_ctrl = cxusb_streaming_ctrl, .power_ctrl = cxusb_bluebird_power_ctrl, .frontend_attach = cxusb_lgdt3303_frontend_attach, - .tuner_attach = cxusb_lgdt3303_tuner_attach, + .tuner_attach = cxusb_lgh064f_tuner_attach, .i2c_algo = &cxusb_i2c_algo, - .rc_interval = 100, - .rc_key_map = dvico_portable_rc_keys, - .rc_key_map_size = ARRAY_SIZE(dvico_portable_rc_keys), - .rc_query = cxusb_rc_query, - .generic_bulk_ctrl_endpoint = 0x01, /* parameter for the MPEG2-data transfer */ .urb = { @@ -663,11 +609,6 @@ static struct dvb_usb_properties cxusb_bluebird_lgz201_properties = { .i2c_algo = &cxusb_i2c_algo, - .rc_interval = 100, - .rc_key_map = dvico_portable_rc_keys, - .rc_key_map_size = ARRAY_SIZE(dvico_portable_rc_keys), - .rc_query = cxusb_rc_query, - .generic_bulk_ctrl_endpoint = 0x01, /* parameter for the MPEG2-data transfer */ .urb = { @@ -708,11 +649,6 @@ static struct dvb_usb_properties cxusb_bluebird_dtt7579_properties = { .i2c_algo = &cxusb_i2c_algo, - .rc_interval = 100, - .rc_key_map = dvico_portable_rc_keys, - .rc_key_map_size = ARRAY_SIZE(dvico_portable_rc_keys), - .rc_query = cxusb_rc_query, - .generic_bulk_ctrl_endpoint = 0x01, /* parameter for the MPEG2-data transfer */ .urb = { diff --git a/drivers/media/dvb/dvb-usb/cxusb.h b/drivers/media/dvb/dvb-usb/cxusb.h index c8ef77554..087c99427 100644 --- a/drivers/media/dvb/dvb-usb/cxusb.h +++ b/drivers/media/dvb/dvb-usb/cxusb.h @@ -6,8 +6,6 @@ extern int dvb_usb_cxusb_debug; #define deb_info(args...) dprintk(dvb_usb_cxusb_debug,0x01,args) -#define deb_i2c(args...) if (d->udev->descriptor.idVendor == USB_VID_MEDION) \ - dprintk(dvb_usb_cxusb_debug,0x01,args) /* usb commands - some of it are guesses, don't have a reference yet */ #define CMD_I2C_WRITE 0x08 diff --git a/drivers/media/dvb/dvb-usb/dibusb-common.c b/drivers/media/dvb/dvb-usb/dibusb-common.c index abd75b4a3..269d899da 100644 --- a/drivers/media/dvb/dvb-usb/dibusb-common.c +++ b/drivers/media/dvb/dvb-usb/dibusb-common.c @@ -128,7 +128,7 @@ static int dibusb_i2c_xfer(struct i2c_adapter *adap,struct i2c_msg msg[],int num struct dvb_usb_device *d = i2c_get_adapdata(adap); int i; - if (mutex_lock_interruptible(&d->i2c_mutex) < 0) + if (down_interruptible(&d->i2c_sem) < 0) return -EAGAIN; if (num > 2) @@ -146,7 +146,7 @@ static int dibusb_i2c_xfer(struct i2c_adapter *adap,struct i2c_msg msg[],int num break; } - mutex_unlock(&d->i2c_mutex); + up(&d->i2c_sem); return i; } @@ -173,10 +173,11 @@ int dibusb_dib3000mc_frontend_attach(struct dvb_usb_device *d) struct dib3000_config demod_cfg; struct dibusb_state *st = d->priv; + demod_cfg.pll_set = dvb_usb_pll_set_i2c; + demod_cfg.pll_init = dvb_usb_pll_init_i2c; + for (demod_cfg.demod_address = 0x8; demod_cfg.demod_address < 0xd; demod_cfg.demod_address++) if ((d->fe = dib3000mc_attach(&demod_cfg,&d->i2c_adap,&st->ops)) != NULL) { - d->fe->ops.tuner_ops.init = dvb_usb_tuner_init_i2c; - d->fe->ops.tuner_ops.set_params = dvb_usb_tuner_set_params_i2c; d->tuner_pass_ctrl = st->ops.tuner_pass_ctrl; return 0; } @@ -189,10 +190,6 @@ int dibusb_dib3000mc_tuner_attach (struct dvb_usb_device *d) { d->pll_addr = 0x60; d->pll_desc = &dvb_pll_env57h1xd5; - - d->fe->ops.tuner_ops.init = dvb_usb_tuner_init_i2c; - d->fe->ops.tuner_ops.set_params = dvb_usb_tuner_set_params_i2c; - return 0; } EXPORT_SYMBOL(dibusb_dib3000mc_tuner_attach); diff --git a/drivers/media/dvb/dvb-usb/dibusb-mb.c b/drivers/media/dvb/dvb-usb/dibusb-mb.c index f4c45f386..dd5a13195 100644 --- a/drivers/media/dvb/dvb-usb/dibusb-mb.c +++ b/drivers/media/dvb/dvb-usb/dibusb-mb.c @@ -20,12 +20,11 @@ static int dibusb_dib3000mb_frontend_attach(struct dvb_usb_device *d) struct dibusb_state *st = d->priv; demod_cfg.demod_address = 0x8; + demod_cfg.pll_set = dvb_usb_pll_set_i2c; + demod_cfg.pll_init = dvb_usb_pll_init_i2c; - if ((d->fe = dib3000mb_attach(&demod_cfg,&d->i2c_adap,&st->ops)) == NULL) { - d->fe->ops.tuner_ops.init = dvb_usb_tuner_init_i2c; - d->fe->ops.tuner_ops.set_params = dvb_usb_tuner_set_params_i2c; + if ((d->fe = dib3000mb_attach(&demod_cfg,&d->i2c_adap,&st->ops)) == NULL) return -ENODEV; - } d->tuner_pass_ctrl = st->ops.tuner_pass_ctrl; diff --git a/drivers/media/dvb/dvb-usb/digitv.c b/drivers/media/dvb/dvb-usb/digitv.c index c14d9efb4..caa1346e3 100644 --- a/drivers/media/dvb/dvb-usb/digitv.c +++ b/drivers/media/dvb/dvb-usb/digitv.c @@ -48,7 +48,7 @@ static int digitv_i2c_xfer(struct i2c_adapter *adap,struct i2c_msg msg[],int num struct dvb_usb_device *d = i2c_get_adapdata(adap); int i; - if (mutex_lock_interruptible(&d->i2c_mutex) < 0) + if (down_interruptible(&d->i2c_sem) < 0) return -EAGAIN; if (num > 2) @@ -67,7 +67,7 @@ static int digitv_i2c_xfer(struct i2c_adapter *adap,struct i2c_msg msg[],int num break; } - mutex_unlock(&d->i2c_mutex); + up(&d->i2c_sem); return i; } @@ -112,30 +112,27 @@ static int digitv_mt352_demod_init(struct dvb_frontend *fe) static struct mt352_config digitv_mt352_config = { .demod_init = digitv_mt352_demod_init, + .pll_set = dvb_usb_pll_set, }; -static int digitv_nxt6000_tuner_set_params(struct dvb_frontend *fe, struct dvb_frontend_parameters *fep) +static int digitv_nxt6000_pll_set(struct dvb_frontend *fe, struct dvb_frontend_parameters *fep) { struct dvb_usb_device *d = fe->dvb->priv; u8 b[5]; - dvb_usb_tuner_calc_regs(fe,fep,b, 5); + dvb_usb_pll_set(fe,fep,b); return digitv_ctrl_msg(d,USB_WRITE_TUNER,0,&b[1],4,NULL,0); } static struct nxt6000_config digitv_nxt6000_config = { .clock_inversion = 1, + .pll_set = digitv_nxt6000_pll_set, }; static int digitv_frontend_attach(struct dvb_usb_device *d) { - if ((d->fe = mt352_attach(&digitv_mt352_config, &d->i2c_adap)) != NULL) { - d->fe->ops.tuner_ops.calc_regs = dvb_usb_tuner_calc_regs; + if ((d->fe = mt352_attach(&digitv_mt352_config, &d->i2c_adap)) != NULL || + (d->fe = nxt6000_attach(&digitv_nxt6000_config, &d->i2c_adap)) != NULL) return 0; - } - if ((d->fe = nxt6000_attach(&digitv_nxt6000_config, &d->i2c_adap)) != NULL) { - d->fe->ops.tuner_ops.set_params = digitv_nxt6000_tuner_set_params; - return 0; - } return -EIO; } diff --git a/drivers/media/dvb/dvb-usb/dtt200u-fe.c b/drivers/media/dvb/dvb-usb/dtt200u-fe.c index 17413adec..cd21ddbfd 100644 --- a/drivers/media/dvb/dvb-usb/dtt200u-fe.c +++ b/drivers/media/dvb/dvb-usb/dtt200u-fe.c @@ -18,6 +18,7 @@ struct dtt200u_fe_state { struct dvb_frontend_parameters fep; struct dvb_frontend frontend; + struct dvb_frontend_ops ops; }; static int dtt200u_fe_read_status(struct dvb_frontend* fe, fe_status_t *stat) @@ -162,13 +163,16 @@ struct dvb_frontend* dtt200u_fe_attach(struct dvb_usb_device *d) deb_info("attaching frontend dtt200u\n"); state->d = d; + memcpy(&state->ops,&dtt200u_fe_ops,sizeof(struct dvb_frontend_ops)); - memcpy(&state->frontend.ops,&dtt200u_fe_ops,sizeof(struct dvb_frontend_ops)); + state->frontend.ops = &state->ops; state->frontend.demodulator_priv = state; - return &state->frontend; + goto success; error: return NULL; +success: + return &state->frontend; } static struct dvb_frontend_ops dtt200u_fe_ops = { diff --git a/drivers/media/dvb/dvb-usb/dtt200u.c b/drivers/media/dvb/dvb-usb/dtt200u.c index 70afcfd14..12ebaf8bd 100644 --- a/drivers/media/dvb/dvb-usb/dtt200u.c +++ b/drivers/media/dvb/dvb-usb/dtt200u.c @@ -94,14 +94,12 @@ static int dtt200u_frontend_attach(struct dvb_usb_device *d) static struct dvb_usb_properties dtt200u_properties; static struct dvb_usb_properties wt220u_properties; -static struct dvb_usb_properties wt220u_zl0353_properties; static int dtt200u_usb_probe(struct usb_interface *intf, const struct usb_device_id *id) { if (dvb_usb_device_init(intf,&dtt200u_properties,THIS_MODULE,NULL) == 0 || - dvb_usb_device_init(intf,&wt220u_properties,THIS_MODULE,NULL) == 0 || - dvb_usb_device_init(intf,&wt220u_zl0353_properties,THIS_MODULE,NULL) == 0) + dvb_usb_device_init(intf,&wt220u_properties,THIS_MODULE,NULL) == 0) return 0; return -ENODEV; @@ -112,8 +110,6 @@ static struct usb_device_id dtt200u_usb_table [] = { { USB_DEVICE(USB_VID_WIDEVIEW, USB_PID_DTT200U_WARM) }, { USB_DEVICE(USB_VID_WIDEVIEW, USB_PID_WT220U_COLD) }, { USB_DEVICE(USB_VID_WIDEVIEW, USB_PID_WT220U_WARM) }, - { USB_DEVICE(USB_VID_WIDEVIEW, USB_PID_WT220U_ZL0353_COLD) }, - { USB_DEVICE(USB_VID_WIDEVIEW, USB_PID_WT220U_ZL0353_WARM) }, { 0 }, }; MODULE_DEVICE_TABLE(usb, dtt200u_usb_table); @@ -200,47 +196,6 @@ static struct dvb_usb_properties wt220u_properties = { } }; -static struct dvb_usb_properties wt220u_zl0353_properties = { - .caps = DVB_USB_HAS_PID_FILTER | DVB_USB_NEED_PID_FILTERING, - .pid_filter_count = 15, - - .usb_ctrl = CYPRESS_FX2, - .firmware = "dvb-usb-wt220u-zl0353-01.fw", - - .power_ctrl = dtt200u_power_ctrl, - .streaming_ctrl = dtt200u_streaming_ctrl, - .pid_filter = dtt200u_pid_filter, - .frontend_attach = dtt200u_frontend_attach, - - .rc_interval = 300, - .rc_key_map = dtt200u_rc_keys, - .rc_key_map_size = ARRAY_SIZE(dtt200u_rc_keys), - .rc_query = dtt200u_rc_query, - - .generic_bulk_ctrl_endpoint = 0x01, - - /* parameter for the MPEG2-data transfer */ - .urb = { - .type = DVB_USB_BULK, - .count = 7, - .endpoint = 0x02, - .u = { - .bulk = { - .buffersize = 4096, - } - } - }, - - .num_device_descs = 1, - .devices = { - { .name = "WideView WT-220U PenType Receiver (based on ZL353)", - .cold_ids = { &dtt200u_usb_table[4], NULL }, - .warm_ids = { &dtt200u_usb_table[5], NULL }, - }, - { NULL }, - } -}; - /* usb specific object needed to register this driver with the usb subsystem */ static struct usb_driver dtt200u_usb_driver = { .name = "dvb_usb_dtt200u", diff --git a/drivers/media/dvb/dvb-usb/dvb-usb-dvb.c b/drivers/media/dvb/dvb-usb/dvb-usb-dvb.c index ec631708c..6fa921002 100644 --- a/drivers/media/dvb/dvb-usb/dvb-usb-dvb.c +++ b/drivers/media/dvb/dvb-usb/dvb-usb-dvb.c @@ -82,7 +82,7 @@ int dvb_usb_dvb_init(struct dvb_usb_device *d) int ret; if ((ret = dvb_register_adapter(&d->dvb_adap, d->desc->name, - d->owner, &d->udev->dev)) < 0) { + d->owner)) < 0) { deb_info("dvb_register_adapter failed: error %d", ret); goto err; } @@ -121,15 +121,16 @@ int dvb_usb_dvb_init(struct dvb_usb_device *d) dvb_net_init(&d->dvb_adap, &d->dvb_net, &d->demux.dmx); - d->state |= DVB_USB_STATE_DVB; - return 0; - + goto success; err_dmx_dev: dvb_dmx_release(&d->demux); err_dmx: dvb_unregister_adapter(&d->dvb_adap); err: return ret; +success: + d->state |= DVB_USB_STATE_DVB; + return 0; } int dvb_usb_dvb_exit(struct dvb_usb_device *d) @@ -183,13 +184,13 @@ int dvb_usb_fe_init(struct dvb_usb_device* d) /* re-assign sleep and wakeup functions */ if (d->fe != NULL) { - d->fe_init = d->fe->ops.init; d->fe->ops.init = dvb_usb_fe_wakeup; - d->fe_sleep = d->fe->ops.sleep; d->fe->ops.sleep = dvb_usb_fe_sleep; + d->fe_init = d->fe->ops->init; d->fe->ops->init = dvb_usb_fe_wakeup; + d->fe_sleep = d->fe->ops->sleep; d->fe->ops->sleep = dvb_usb_fe_sleep; if (dvb_register_frontend(&d->dvb_adap, d->fe)) { err("Frontend registration failed."); - if (d->fe->ops.release) - d->fe->ops.release(d->fe); + if (d->fe->ops->release) + d->fe->ops->release(d->fe); d->fe = NULL; return -ENODEV; } diff --git a/drivers/media/dvb/dvb-usb/dvb-usb-i2c.c b/drivers/media/dvb/dvb-usb/dvb-usb-i2c.c index 6b611a725..9b254532a 100644 --- a/drivers/media/dvb/dvb-usb/dvb-usb-i2c.c +++ b/drivers/media/dvb/dvb-usb/dvb-usb-i2c.c @@ -46,7 +46,7 @@ int dvb_usb_i2c_exit(struct dvb_usb_device *d) return 0; } -int dvb_usb_tuner_init_i2c(struct dvb_frontend *fe) +int dvb_usb_pll_init_i2c(struct dvb_frontend *fe) { struct dvb_usb_device *d = fe->dvb->priv; struct i2c_msg msg = { .addr = d->pll_addr, .flags = 0, .buf = d->pll_init, .len = 4 }; @@ -63,8 +63,6 @@ int dvb_usb_tuner_init_i2c(struct dvb_frontend *fe) deb_pll("pll-buf: %x %x %x %x\n",d->pll_init[0],d->pll_init[1], d->pll_init[2],d->pll_init[3]); - if (fe->ops.i2c_gate_ctrl) - fe->ops.i2c_gate_ctrl(fe, 1); if (i2c_transfer (&d->i2c_adap, &msg, 1) != 1) { err("tuner i2c write failed for pll_init."); ret = -EREMOTEIO; @@ -75,42 +73,38 @@ int dvb_usb_tuner_init_i2c(struct dvb_frontend *fe) d->tuner_pass_ctrl(fe,0,d->pll_addr); return ret; } -EXPORT_SYMBOL(dvb_usb_tuner_init_i2c); +EXPORT_SYMBOL(dvb_usb_pll_init_i2c); -int dvb_usb_tuner_calc_regs(struct dvb_frontend *fe, struct dvb_frontend_parameters *fep, u8 *b, int buf_len) +int dvb_usb_pll_set(struct dvb_frontend *fe, struct dvb_frontend_parameters *fep, u8 b[5]) { struct dvb_usb_device *d = fe->dvb->priv; - if (buf_len != 5) - return -EINVAL; if (d->pll_desc == NULL) return 0; deb_pll("pll addr: %x, freq: %d %p\n",d->pll_addr,fep->frequency,d->pll_desc); - b[0] = d->pll_addr; + b[0] = d->pll_addr << 1; dvb_pll_configure(d->pll_desc,&b[1],fep->frequency,fep->u.ofdm.bandwidth); deb_pll("pll-buf: %x %x %x %x %x\n",b[0],b[1],b[2],b[3],b[4]); - return 5; + return 0; } -EXPORT_SYMBOL(dvb_usb_tuner_calc_regs); +EXPORT_SYMBOL(dvb_usb_pll_set); -int dvb_usb_tuner_set_params_i2c(struct dvb_frontend *fe, struct dvb_frontend_parameters *fep) +int dvb_usb_pll_set_i2c(struct dvb_frontend *fe, struct dvb_frontend_parameters *fep) { struct dvb_usb_device *d = fe->dvb->priv; int ret = 0; u8 b[5]; struct i2c_msg msg = { .addr = d->pll_addr, .flags = 0, .buf = &b[1], .len = 4 }; - dvb_usb_tuner_calc_regs(fe,fep,b,5); + dvb_usb_pll_set(fe,fep,b); if (d->tuner_pass_ctrl) d->tuner_pass_ctrl(fe,1,d->pll_addr); - if (fe->ops.i2c_gate_ctrl) - fe->ops.i2c_gate_ctrl(fe, 1); if (i2c_transfer (&d->i2c_adap, &msg, 1) != 1) { err("tuner i2c write failed for pll_set."); ret = -EREMOTEIO; @@ -122,4 +116,4 @@ int dvb_usb_tuner_set_params_i2c(struct dvb_frontend *fe, struct dvb_frontend_pa return ret; } -EXPORT_SYMBOL(dvb_usb_tuner_set_params_i2c); +EXPORT_SYMBOL(dvb_usb_pll_set_i2c); diff --git a/drivers/media/dvb/dvb-usb/dvb-usb-ids.h b/drivers/media/dvb/dvb-usb/dvb-usb-ids.h index 95698918b..4a1b9e77e 100644 --- a/drivers/media/dvb/dvb-usb/dvb-usb-ids.h +++ b/drivers/media/dvb/dvb-usb/dvb-usb-ids.h @@ -31,7 +31,6 @@ #define USB_VID_VISIONPLUS 0x13d3 #define USB_VID_TWINHAN 0x1822 #define USB_VID_ULTIMA_ELECTRONIC 0x05d8 -#define USB_VID_GENPIX 0x09c0 /* Product IDs */ #define USB_PID_ADSTECH_USB2_COLD 0xa333 @@ -84,8 +83,6 @@ #define USB_PID_DTT200U_WARM 0x0301 #define USB_PID_WT220U_COLD 0x0222 #define USB_PID_WT220U_WARM 0x0221 -#define USB_PID_WT220U_ZL0353_COLD 0x022a -#define USB_PID_WT220U_ZL0353_WARM 0x022b #define USB_PID_WINTV_NOVA_T_USB2_COLD 0x9300 #define USB_PID_WINTV_NOVA_T_USB2_WARM 0x9301 #define USB_PID_NEBULA_DIGITV 0x0201 @@ -105,6 +102,5 @@ #define USB_PID_KYE_DVB_T_WARM 0x701f #define USB_PID_PCTV_200E 0x020e #define USB_PID_PCTV_400E 0x020f -#define USB_PID_GENPIX_8PSK_COLD 0x0200 -#define USB_PID_GENPIX_8PSK_WARM 0x0201 + #endif diff --git a/drivers/media/dvb/dvb-usb/dvb-usb-init.c b/drivers/media/dvb/dvb-usb/dvb-usb-init.c index a1705ecb9..ce34a55e5 100644 --- a/drivers/media/dvb/dvb-usb/dvb-usb-init.c +++ b/drivers/media/dvb/dvb-usb/dvb-usb-init.c @@ -42,8 +42,8 @@ static int dvb_usb_init(struct dvb_usb_device *d) { int ret = 0; - mutex_init(&d->usb_mutex); - mutex_init(&d->i2c_mutex); + sema_init(&d->usb_sem, 1); + sema_init(&d->i2c_sem, 1); d->state = DVB_USB_STATE_INIT; diff --git a/drivers/media/dvb/dvb-usb/dvb-usb-urb.c b/drivers/media/dvb/dvb-usb/dvb-usb-urb.c index 9002f35aa..ee821974d 100644 --- a/drivers/media/dvb/dvb-usb/dvb-usb-urb.c +++ b/drivers/media/dvb/dvb-usb/dvb-usb-urb.c @@ -21,7 +21,7 @@ int dvb_usb_generic_rw(struct dvb_usb_device *d, u8 *wbuf, u16 wlen, u8 *rbuf, if (wbuf == NULL || wlen == 0) return -EINVAL; - if ((ret = mutex_lock_interruptible(&d->usb_mutex))) + if ((ret = down_interruptible(&d->usb_sem))) return ret; deb_xfer(">>> "); @@ -53,7 +53,7 @@ int dvb_usb_generic_rw(struct dvb_usb_device *d, u8 *wbuf, u16 wlen, u8 *rbuf, } } - mutex_unlock(&d->usb_mutex); + up(&d->usb_sem); return ret; } EXPORT_SYMBOL(dvb_usb_generic_rw); diff --git a/drivers/media/dvb/dvb-usb/dvb-usb.h b/drivers/media/dvb/dvb-usb/dvb-usb.h index 97f8ea962..d4909e5c6 100644 --- a/drivers/media/dvb/dvb-usb/dvb-usb.h +++ b/drivers/media/dvb/dvb-usb/dvb-usb.h @@ -8,10 +8,10 @@ #ifndef __DVB_USB_H__ #define __DVB_USB_H__ +#include #include #include #include -#include #include "dvb_frontend.h" #include "dvb_demux.h" @@ -227,8 +227,8 @@ struct dvb_usb_properties { * @feedcount: number of reqested feeds (used for streaming-activation) * @pid_filtering: is hardware pid_filtering used or not. * - * @usb_mutex: semaphore of USB control messages (reading needs two messages) - * @i2c_mutex: semaphore for i2c-transfers + * @usb_sem: semaphore of USB control messages (reading needs two messages) + * @i2c_sem: semaphore for i2c-transfers * * @i2c_adap: device's i2c_adapter if it uses I2CoverUSB * @pll_addr: I2C address of the tuner for programming @@ -283,10 +283,10 @@ struct dvb_usb_device { int pid_filtering; /* locking */ - struct mutex usb_mutex; + struct semaphore usb_sem; /* i2c */ - struct mutex i2c_mutex; + struct semaphore i2c_sem; struct i2c_adapter i2c_adap; /* tuner programming information */ @@ -329,9 +329,9 @@ extern int dvb_usb_generic_write(struct dvb_usb_device *, u8 *, u16); extern int dvb_usb_nec_rc_key_to_event(struct dvb_usb_device *, u8[], u32 *, int *); /* commonly used pll init and set functions */ -extern int dvb_usb_tuner_init_i2c(struct dvb_frontend *); -extern int dvb_usb_tuner_calc_regs(struct dvb_frontend *, struct dvb_frontend_parameters *, u8 *buf, int buf_len); -extern int dvb_usb_tuner_set_params_i2c(struct dvb_frontend *, struct dvb_frontend_parameters *); +extern int dvb_usb_pll_init_i2c(struct dvb_frontend *); +extern int dvb_usb_pll_set(struct dvb_frontend *, struct dvb_frontend_parameters *, u8[]); +extern int dvb_usb_pll_set_i2c(struct dvb_frontend *, struct dvb_frontend_parameters *); /* commonly used firmware download types and function */ struct hexline { diff --git a/drivers/media/dvb/dvb-usb/umt-010.c b/drivers/media/dvb/dvb-usb/umt-010.c index 97d74da0d..14f1911c7 100644 --- a/drivers/media/dvb/dvb-usb/umt-010.c +++ b/drivers/media/dvb/dvb-usb/umt-010.c @@ -57,6 +57,7 @@ static int umt_mt352_frontend_attach(struct dvb_usb_device *d) memset(&umt_config,0,sizeof(struct mt352_config)); umt_config.demod_init = umt_mt352_demod_init; umt_config.demod_address = 0xf; + umt_config.pll_set = dvb_usb_pll_set; d->fe = mt352_attach(&umt_config, &d->i2c_adap); @@ -67,7 +68,6 @@ static int umt_tuner_attach (struct dvb_usb_device *d) { d->pll_addr = 0x61; d->pll_desc = &dvb_pll_tua6034; - d->fe->ops.tuner_ops.calc_regs = dvb_usb_tuner_calc_regs; return 0; } diff --git a/drivers/media/dvb/dvb-usb/vp702x-fe.c b/drivers/media/dvb/dvb-usb/vp702x-fe.c index d4da49413..b6d95e1c9 100644 --- a/drivers/media/dvb/dvb-usb/vp702x-fe.c +++ b/drivers/media/dvb/dvb-usb/vp702x-fe.c @@ -147,9 +147,8 @@ static int vp702x_fe_set_frontend(struct dvb_frontend* fe, cmd[4] = (sr >> 4) & 0xff; cmd[5] = (sr << 4) & 0xf0; - deb_fe("setting frontend to: %u -> %u (%x) LNB-based GHz, symbolrate: %d -> %lu (%lx)\n", - fep->frequency,freq,freq, fep->u.qpsk.symbol_rate, - (unsigned long) sr, (unsigned long) sr); + deb_fe("setting frontend to: %u -> %u (%x) LNB-based GHz, symbolrate: %d -> %Lu (%Lx)\n", + fep->frequency,freq,freq, fep->u.qpsk.symbol_rate, sr, sr); /* if (fep->inversion == INVERSION_ON) cmd[6] |= 0x80; */ @@ -287,16 +286,17 @@ struct dvb_frontend * vp702x_fe_attach(struct dvb_usb_device *d) goto error; s->d = d; - - memcpy(&s->fe.ops,&vp702x_fe_ops,sizeof(struct dvb_frontend_ops)); + s->fe.ops = &vp702x_fe_ops; s->fe.demodulator_priv = s; s->lnb_buf[1] = SET_LNB_POWER; s->lnb_buf[3] = 0xff; /* 0=tone burst, 2=data burst, ff=off */ - return &s->fe; + goto success; error: return NULL; +success: + return &s->fe; } diff --git a/drivers/media/dvb/dvb-usb/vp702x.c b/drivers/media/dvb/dvb-usb/vp702x.c index b2f098a2d..4a95eca81 100644 --- a/drivers/media/dvb/dvb-usb/vp702x.c +++ b/drivers/media/dvb/dvb-usb/vp702x.c @@ -75,7 +75,7 @@ int vp702x_usb_inout_op(struct dvb_usb_device *d, u8 *o, int olen, u8 *i, int il { int ret; - if ((ret = mutex_lock_interruptible(&d->usb_mutex))) + if ((ret = down_interruptible(&d->usb_sem))) return ret; if ((ret = vp702x_usb_out_op(d,REQUEST_OUT,0,0,o,olen)) < 0) @@ -84,7 +84,7 @@ int vp702x_usb_inout_op(struct dvb_usb_device *d, u8 *o, int olen, u8 *i, int il ret = vp702x_usb_in_op(d,REQUEST_IN,0,0,i,ilen); unlock: - mutex_unlock(&d->usb_mutex); + up(&d->usb_sem); return ret; } diff --git a/drivers/media/dvb/dvb-usb/vp7045-fe.c b/drivers/media/dvb/dvb-usb/vp7045-fe.c index 8452eef90..9999336ae 100644 --- a/drivers/media/dvb/dvb-usb/vp7045-fe.c +++ b/drivers/media/dvb/dvb-usb/vp7045-fe.c @@ -23,6 +23,8 @@ struct vp7045_fe_state { struct dvb_frontend fe; + struct dvb_frontend_ops ops; + struct dvb_usb_device *d; }; @@ -149,12 +151,15 @@ struct dvb_frontend * vp7045_fe_attach(struct dvb_usb_device *d) goto error; s->d = d; - memcpy(&s->fe.ops, &vp7045_fe_ops, sizeof(struct dvb_frontend_ops)); + memcpy(&s->ops, &vp7045_fe_ops, sizeof(struct dvb_frontend_ops)); + s->fe.ops = &s->ops; s->fe.demodulator_priv = s; - return &s->fe; + goto success; error: return NULL; +success: + return &s->fe; } diff --git a/drivers/media/dvb/dvb-usb/vp7045.c b/drivers/media/dvb/dvb-usb/vp7045.c index 8ea3834a6..3835235b6 100644 --- a/drivers/media/dvb/dvb-usb/vp7045.c +++ b/drivers/media/dvb/dvb-usb/vp7045.c @@ -38,7 +38,7 @@ int vp7045_usb_op(struct dvb_usb_device *d, u8 cmd, u8 *out, int outlen, u8 *in, deb_xfer("out buffer: "); debug_dump(outbuf,outlen+1,deb_xfer); - if ((ret = mutex_lock_interruptible(&d->usb_mutex))) + if ((ret = down_interruptible(&d->usb_sem))) return ret; if (usb_control_msg(d->udev, @@ -68,7 +68,7 @@ int vp7045_usb_op(struct dvb_usb_device *d, u8 cmd, u8 *out, int outlen, u8 *in, memcpy(in,&inbuf[1],inlen); unlock: - mutex_unlock(&d->usb_mutex); + up(&d->usb_sem); return ret; } diff --git a/drivers/media/dvb/frontends/Kconfig b/drivers/media/dvb/frontends/Kconfig index db978555b..c676b1e23 100644 --- a/drivers/media/dvb/frontends/Kconfig +++ b/drivers/media/dvb/frontends/Kconfig @@ -6,43 +6,43 @@ comment "DVB-S (satellite) frontends" config DVB_STV0299 tristate "ST STV0299 based" - depends on DVB_CORE && I2C + depends on DVB_CORE help A DVB-S tuner module. Say Y when you want to support this frontend. config DVB_CX24110 tristate "Conexant CX24110 based" - depends on DVB_CORE && I2C + depends on DVB_CORE help A DVB-S tuner module. Say Y when you want to support this frontend. config DVB_CX24123 tristate "Conexant CX24123 based" - depends on DVB_CORE && I2C + depends on DVB_CORE help A DVB-S tuner module. Say Y when you want to support this frontend. config DVB_TDA8083 tristate "Philips TDA8083 based" - depends on DVB_CORE && I2C + depends on DVB_CORE help A DVB-S tuner module. Say Y when you want to support this frontend. config DVB_MT312 tristate "Zarlink VP310/MT312 based" - depends on DVB_CORE && I2C + depends on DVB_CORE help A DVB-S tuner module. Say Y when you want to support this frontend. config DVB_VES1X93 tristate "VLSI VES1893 or VES1993 based" - depends on DVB_CORE && I2C + depends on DVB_CORE help A DVB-S tuner module. Say Y when you want to support this frontend. config DVB_S5H1420 tristate "Samsung S5H1420 based" - depends on DVB_CORE && I2C + depends on DVB_CORE help A DVB-S tuner module. Say Y when you want to support this frontend. @@ -51,7 +51,7 @@ comment "DVB-T (terrestrial) frontends" config DVB_SP8870 tristate "Spase sp8870 based" - depends on DVB_CORE && I2C + depends on DVB_CORE select FW_LOADER help A DVB-T tuner module. Say Y when you want to support this frontend. @@ -63,7 +63,7 @@ config DVB_SP8870 config DVB_SP887X tristate "Spase sp887x based" - depends on DVB_CORE && I2C + depends on DVB_CORE select FW_LOADER help A DVB-T tuner module. Say Y when you want to support this frontend. @@ -75,25 +75,25 @@ config DVB_SP887X config DVB_CX22700 tristate "Conexant CX22700 based" - depends on DVB_CORE && I2C + depends on DVB_CORE help A DVB-T tuner module. Say Y when you want to support this frontend. config DVB_CX22702 tristate "Conexant cx22702 demodulator (OFDM)" - depends on DVB_CORE && I2C + depends on DVB_CORE help A DVB-T tuner module. Say Y when you want to support this frontend. config DVB_L64781 tristate "LSI L64781" - depends on DVB_CORE && I2C + depends on DVB_CORE help A DVB-T tuner module. Say Y when you want to support this frontend. config DVB_TDA1004X tristate "Philips TDA10045H/TDA10046H based" - depends on DVB_CORE && I2C + depends on DVB_CORE select FW_LOADER help A DVB-T tuner module. Say Y when you want to support this frontend. @@ -106,32 +106,26 @@ config DVB_TDA1004X config DVB_NXT6000 tristate "NxtWave Communications NXT6000 based" - depends on DVB_CORE && I2C + depends on DVB_CORE help A DVB-T tuner module. Say Y when you want to support this frontend. config DVB_MT352 tristate "Zarlink MT352 based" - depends on DVB_CORE && I2C - help - A DVB-T tuner module. Say Y when you want to support this frontend. - -config DVB_ZL10353 - tristate "Zarlink ZL10353 based" - depends on DVB_CORE && I2C + depends on DVB_CORE help A DVB-T tuner module. Say Y when you want to support this frontend. config DVB_DIB3000MB tristate "DiBcom 3000M-B" - depends on DVB_CORE && I2C + depends on DVB_CORE help A DVB-T tuner module. Designed for mobile usage. Say Y when you want to support this frontend. config DVB_DIB3000MC tristate "DiBcom 3000P/M-C" - depends on DVB_CORE && I2C + depends on DVB_CORE help A DVB-T tuner module. Designed for mobile usage. Say Y when you want to support this frontend. @@ -141,28 +135,28 @@ comment "DVB-C (cable) frontends" config DVB_VES1820 tristate "VLSI VES1820 based" - depends on DVB_CORE && I2C + depends on DVB_CORE help A DVB-C tuner module. Say Y when you want to support this frontend. config DVB_TDA10021 tristate "Philips TDA10021 based" - depends on DVB_CORE && I2C + depends on DVB_CORE help A DVB-C tuner module. Say Y when you want to support this frontend. config DVB_STV0297 tristate "ST STV0297 based" - depends on DVB_CORE && I2C + depends on DVB_CORE help A DVB-C tuner module. Say Y when you want to support this frontend. -comment "ATSC (North American/Korean Terrestrial/Cable DTV) frontends" +comment "ATSC (North American/Korean Terresterial DTV) frontends" depends on DVB_CORE config DVB_NXT200X - tristate "NxtWave Communications NXT2002/NXT2004 based" - depends on DVB_CORE && I2C + tristate "Nextwave NXT2002/NXT2004 based" + depends on DVB_CORE select FW_LOADER help An ATSC 8VSB and QAM64/256 tuner module. Say Y when you want @@ -175,35 +169,23 @@ config DVB_NXT200X or /lib/firmware (depending on configuration of firmware hotplug). config DVB_OR51211 - tristate "Oren OR51211 based" - depends on DVB_CORE && I2C + tristate "or51211 based (pcHDTV HD2000 card)" + depends on DVB_CORE select FW_LOADER help An ATSC 8VSB tuner module. Say Y when you want to support this frontend. - This driver needs external firmware. Please use the command - "/Documentation/dvb/get_dvb_firmware or51211" to - download it, and then copy it to /usr/lib/hotplug/firmware - or /lib/firmware (depending on configuration of firmware hotplug). - config DVB_OR51132 - tristate "Oren OR51132 based" - depends on DVB_CORE && I2C + tristate "OR51132 based (pcHDTV HD3000 card)" + depends on DVB_CORE select FW_LOADER help An ATSC 8VSB and QAM64/256 tuner module. Say Y when you want to support this frontend. - This driver needs external firmware. Please use the commands - "/Documentation/dvb/get_dvb_firmware or51132_vsb" and/or - "/Documentation/dvb/get_dvb_firmware or51132_qam" to - download firmwares for 8VSB and QAM64/256, respectively. Copy them to - /usr/lib/hotplug/firmware or /lib/firmware (depending on - configuration of firmware hotplug). - config DVB_BCM3510 tristate "Broadcom BCM3510" - depends on DVB_CORE && I2C + depends on DVB_CORE select FW_LOADER help An ATSC 8VSB/16VSB and QAM64/256 tuner module. Say Y when you want to @@ -211,29 +193,9 @@ config DVB_BCM3510 config DVB_LGDT330X tristate "LG Electronics LGDT3302/LGDT3303 based" - depends on DVB_CORE && I2C + depends on DVB_CORE help An ATSC 8VSB and QAM64/256 tuner module. Say Y when you want to support this frontend. - -comment "Miscellaneous devices" - depends on DVB_CORE - -config DVB_PLL - tristate - depends on DVB_CORE && I2C - -config DVB_LNBP21 - tristate "LNBP21 SEC controller" - depends on DVB_CORE && I2C - help - An SEC control chip. - -config DVB_ISL6421 - tristate "ISL6421 SEC controller" - depends on DVB_CORE && I2C - help - An SEC control chip. - endmenu diff --git a/drivers/media/dvb/frontends/Makefile b/drivers/media/dvb/frontends/Makefile index 0e4880b6d..1af769cd9 100644 --- a/drivers/media/dvb/frontends/Makefile +++ b/drivers/media/dvb/frontends/Makefile @@ -4,7 +4,7 @@ EXTRA_CFLAGS = -Idrivers/media/dvb/dvb-core/ -obj-$(CONFIG_DVB_PLL) += dvb-pll.o +obj-$(CONFIG_DVB_CORE) += dvb-pll.o obj-$(CONFIG_DVB_STV0299) += stv0299.o obj-$(CONFIG_DVB_SP8870) += sp8870.o obj-$(CONFIG_DVB_CX22700) += cx22700.o @@ -20,7 +20,6 @@ obj-$(CONFIG_DVB_TDA1004X) += tda1004x.o obj-$(CONFIG_DVB_SP887X) += sp887x.o obj-$(CONFIG_DVB_NXT6000) += nxt6000.o obj-$(CONFIG_DVB_MT352) += mt352.o -obj-$(CONFIG_DVB_ZL10353) += zl10353.o obj-$(CONFIG_DVB_CX22702) += cx22702.o obj-$(CONFIG_DVB_TDA10021) += tda10021.o obj-$(CONFIG_DVB_STV0297) += stv0297.o @@ -31,5 +30,3 @@ obj-$(CONFIG_DVB_BCM3510) += bcm3510.o obj-$(CONFIG_DVB_S5H1420) += s5h1420.o obj-$(CONFIG_DVB_LGDT330X) += lgdt330x.o obj-$(CONFIG_DVB_CX24123) += cx24123.o -obj-$(CONFIG_DVB_LNBP21) += lnbp21.o -obj-$(CONFIG_DVB_ISL6421) += isl6421.o diff --git a/drivers/media/dvb/frontends/bcm3510.c b/drivers/media/dvb/frontends/bcm3510.c index baeb311de..caaee893c 100644 --- a/drivers/media/dvb/frontends/bcm3510.c +++ b/drivers/media/dvb/frontends/bcm3510.c @@ -39,7 +39,6 @@ #include #include #include -#include #include "dvb_frontend.h" #include "bcm3510.h" @@ -48,11 +47,12 @@ struct bcm3510_state { struct i2c_adapter* i2c; + struct dvb_frontend_ops ops; const struct bcm3510_config* config; struct dvb_frontend frontend; /* demodulator private data */ - struct mutex hab_mutex; + struct semaphore hab_sem; u8 firmware_loaded:1; unsigned long next_status_check; @@ -213,7 +213,7 @@ static int bcm3510_do_hab_cmd(struct bcm3510_state *st, u8 cmd, u8 msgid, u8 *ob dbufout(ob,olen+2,deb_hab); deb_hab("\n"); - if (mutex_lock_interruptible(&st->hab_mutex) < 0) + if (down_interruptible(&st->hab_sem) < 0) return -EAGAIN; if ((ret = bcm3510_hab_send_request(st, ob, olen+2)) < 0 || @@ -226,7 +226,7 @@ static int bcm3510_do_hab_cmd(struct bcm3510_state *st, u8 cmd, u8 msgid, u8 *ob memcpy(ibuf,&ib[2],ilen); error: - mutex_unlock(&st->hab_mutex); + up(&st->hab_sem); return ret; } @@ -790,12 +790,13 @@ struct dvb_frontend* bcm3510_attach(const struct bcm3510_config *config, state->config = config; state->i2c = i2c; + memcpy(&state->ops, &bcm3510_ops, sizeof(struct dvb_frontend_ops)); /* create dvb_frontend */ - memcpy(&state->frontend.ops, &bcm3510_ops, sizeof(struct dvb_frontend_ops)); + state->frontend.ops = &state->ops; state->frontend.demodulator_priv = state; - mutex_init(&state->hab_mutex); + sema_init(&state->hab_sem, 1); if ((ret = bcm3510_readB(state,0xe0,&v)) < 0) goto error; diff --git a/drivers/media/dvb/frontends/cx22700.c b/drivers/media/dvb/frontends/cx22700.c index 13ad1bfae..755f774f6 100644 --- a/drivers/media/dvb/frontends/cx22700.c +++ b/drivers/media/dvb/frontends/cx22700.c @@ -34,6 +34,8 @@ struct cx22700_state { struct i2c_adapter* i2c; + struct dvb_frontend_ops ops; + const struct cx22700_config* config; struct dvb_frontend frontend; @@ -134,7 +136,6 @@ static int cx22700_set_tps (struct cx22700_state *state, struct dvb_ofdm_paramet return -EINVAL; if (p->code_rate_LP < FEC_1_2 || p->code_rate_LP > FEC_7_8) - return -EINVAL; if (p->code_rate_HP == FEC_4_5 || p->code_rate_LP == FEC_4_5) return -EINVAL; @@ -246,6 +247,12 @@ static int cx22700_init (struct dvb_frontend* fe) cx22700_writereg (state, 0x00, 0x01); + if (state->config->pll_init) { + cx22700_writereg (state, 0x0a, 0x00); /* open i2c bus switch */ + state->config->pll_init(fe); + cx22700_writereg (state, 0x0a, 0x01); /* close i2c bus switch */ + } + return 0; } @@ -326,11 +333,9 @@ static int cx22700_set_frontend(struct dvb_frontend* fe, struct dvb_frontend_par cx22700_writereg (state, 0x00, 0x02); /* XXX CHECKME: soft reset*/ cx22700_writereg (state, 0x00, 0x00); - if (fe->ops.tuner_ops.set_params) { - fe->ops.tuner_ops.set_params(fe, p); - if (fe->ops.i2c_gate_ctrl) fe->ops.i2c_gate_ctrl(fe, 0); - } - + cx22700_writereg (state, 0x0a, 0x00); /* open i2c bus switch */ + state->config->pll_set(fe, p); + cx22700_writereg (state, 0x0a, 0x01); /* close i2c bus switch */ cx22700_set_inversion (state, p->inversion); cx22700_set_tps (state, &p->u.ofdm); cx22700_writereg (state, 0x37, 0x01); /* PAL loop filter off */ @@ -348,17 +353,6 @@ static int cx22700_get_frontend(struct dvb_frontend* fe, struct dvb_frontend_par return cx22700_get_tps (state, &p->u.ofdm); } -static int cx22700_i2c_gate_ctrl(struct dvb_frontend* fe, int enable) -{ - struct cx22700_state* state = fe->demodulator_priv; - - if (enable) { - return cx22700_writereg(state, 0x0a, 0x00); - } else { - return cx22700_writereg(state, 0x0a, 0x01); - } -} - static int cx22700_get_tune_settings(struct dvb_frontend* fe, struct dvb_frontend_tune_settings* fesettings) { fesettings->min_delay_ms = 150; @@ -387,12 +381,13 @@ struct dvb_frontend* cx22700_attach(const struct cx22700_config* config, /* setup the state */ state->config = config; state->i2c = i2c; + memcpy(&state->ops, &cx22700_ops, sizeof(struct dvb_frontend_ops)); /* check if the demod is there */ if (cx22700_readreg(state, 0x07) < 0) goto error; /* create dvb_frontend */ - memcpy(&state->frontend.ops, &cx22700_ops, sizeof(struct dvb_frontend_ops)); + state->frontend.ops = &state->ops; state->frontend.demodulator_priv = state; return &state->frontend; @@ -418,7 +413,6 @@ static struct dvb_frontend_ops cx22700_ops = { .release = cx22700_release, .init = cx22700_init, - .i2c_gate_ctrl = cx22700_i2c_gate_ctrl, .set_frontend = cx22700_set_frontend, .get_frontend = cx22700_get_frontend, diff --git a/drivers/media/dvb/frontends/cx22700.h b/drivers/media/dvb/frontends/cx22700.h index dcd8979c1..c9145b458 100644 --- a/drivers/media/dvb/frontends/cx22700.h +++ b/drivers/media/dvb/frontends/cx22700.h @@ -29,6 +29,10 @@ struct cx22700_config { /* the demodulator's i2c address */ u8 demod_address; + + /* PLL maintenance */ + int (*pll_init)(struct dvb_frontend* fe); + int (*pll_set)(struct dvb_frontend* fe, struct dvb_frontend_parameters* params); }; extern struct dvb_frontend* cx22700_attach(const struct cx22700_config* config, diff --git a/drivers/media/dvb/frontends/cx22702.c b/drivers/media/dvb/frontends/cx22702.c index 4106d46c9..0fc899f81 100644 --- a/drivers/media/dvb/frontends/cx22702.c +++ b/drivers/media/dvb/frontends/cx22702.c @@ -40,6 +40,8 @@ struct cx22702_state { struct i2c_adapter* i2c; + struct dvb_frontend_ops ops; + /* configuration settings */ const struct cx22702_config* config; @@ -209,10 +211,22 @@ static int cx22702_set_tps (struct dvb_frontend* fe, struct dvb_frontend_paramet u8 val; struct cx22702_state* state = fe->demodulator_priv; - if (fe->ops.tuner_ops.set_params) { - fe->ops.tuner_ops.set_params(fe, p); - if (fe->ops.i2c_gate_ctrl) fe->ops.i2c_gate_ctrl(fe, 0); + /* set PLL */ + cx22702_i2c_gate_ctrl(fe, 1); + if (state->config->pll_set) { + state->config->pll_set(fe, p); + } else if (state->config->pll_desc) { + u8 pllbuf[4]; + struct i2c_msg msg = { .addr = state->config->pll_address, + .buf = pllbuf, .len = 4 }; + dvb_pll_configure(state->config->pll_desc, pllbuf, + p->frequency, + p->u.ofdm.bandwidth); + i2c_transfer(state->i2c, &msg, 1); + } else { + BUG(); } + cx22702_i2c_gate_ctrl(fe, 0); /* set inversion */ cx22702_set_inversion (state, p->inversion); @@ -344,6 +358,10 @@ static int cx22702_init (struct dvb_frontend* fe) cx22702_writereg (state, 0xf8, (state->config->output_mode << 1) & 0x02); + /* init PLL */ + if (state->config->pll_init) + state->config->pll_init(fe); + cx22702_i2c_gate_ctrl(fe, 0); return 0; @@ -477,6 +495,7 @@ struct dvb_frontend* cx22702_attach(const struct cx22702_config* config, /* setup the state */ state->config = config; state->i2c = i2c; + memcpy(&state->ops, &cx22702_ops, sizeof(struct dvb_frontend_ops)); state->prevUCBlocks = 0; /* check if the demod is there */ @@ -484,7 +503,7 @@ struct dvb_frontend* cx22702_attach(const struct cx22702_config* config, goto error; /* create dvb_frontend */ - memcpy(&state->frontend.ops, &cx22702_ops, sizeof(struct dvb_frontend_ops)); + state->frontend.ops = &state->ops; state->frontend.demodulator_priv = state; return &state->frontend; @@ -511,7 +530,6 @@ static struct dvb_frontend_ops cx22702_ops = { .release = cx22702_release, .init = cx22702_init, - .i2c_gate_ctrl = cx22702_i2c_gate_ctrl, .set_frontend = cx22702_set_tps, .get_frontend = cx22702_get_frontend, @@ -522,6 +540,7 @@ static struct dvb_frontend_ops cx22702_ops = { .read_signal_strength = cx22702_read_signal_strength, .read_snr = cx22702_read_snr, .read_ucblocks = cx22702_read_ucblocks, + .i2c_gate_ctrl = cx22702_i2c_gate_ctrl, }; module_param(debug, int, 0644); diff --git a/drivers/media/dvb/frontends/cx22702.h b/drivers/media/dvb/frontends/cx22702.h index 7f2f241e5..5633976a5 100644 --- a/drivers/media/dvb/frontends/cx22702.h +++ b/drivers/media/dvb/frontends/cx22702.h @@ -39,6 +39,13 @@ struct cx22702_config #define CX22702_PARALLEL_OUTPUT 0 #define CX22702_SERIAL_OUTPUT 1 u8 output_mode; + + /* PLL maintenance */ + u8 pll_address; + struct dvb_pll_desc *pll_desc; + + int (*pll_init)(struct dvb_frontend* fe); + int (*pll_set)(struct dvb_frontend* fe, struct dvb_frontend_parameters* params); }; extern struct dvb_frontend* cx22702_attach(const struct cx22702_config* config, diff --git a/drivers/media/dvb/frontends/cx24110.c b/drivers/media/dvb/frontends/cx24110.c index ce3c7398b..d15d32c51 100644 --- a/drivers/media/dvb/frontends/cx24110.c +++ b/drivers/media/dvb/frontends/cx24110.c @@ -36,6 +36,8 @@ struct cx24110_state { struct i2c_adapter* i2c; + struct dvb_frontend_ops ops; + const struct cx24110_config* config; struct dvb_frontend frontend; @@ -248,7 +250,7 @@ static int cx24110_set_symbolrate (struct cx24110_state* state, u32 srate) static const u32 bands[]={5000000UL,15000000UL,90999000UL/2}; int i; - dprintk("cx24110 debug: entering %s(%d)\n",__FUNCTION__,srate); +dprintk("cx24110 debug: entering %s(%d)\n",__FUNCTION__,srate); if (srate>90999000UL/2) srate=90999000UL/2; if (srate<500000) @@ -364,6 +366,8 @@ static int cx24110_initfe(struct dvb_frontend* fe) cx24110_writereg(state, cx24110_regdata[i].reg, cx24110_regdata[i].data); }; + if (state->config->pll_init) state->config->pll_init(fe); + return 0; } @@ -414,9 +418,6 @@ static int cx24110_send_diseqc_msg(struct dvb_frontend* fe, struct cx24110_state *state = fe->demodulator_priv; unsigned long timeout; - if (cmd->msg_len < 3 || cmd->msg_len > 6) - return -EINVAL; /* not implemented */ - for (i = 0; i < cmd->msg_len; i++) cx24110_writereg(state, 0x79 + i, cmd->msg[i]); @@ -535,12 +536,7 @@ static int cx24110_set_frontend(struct dvb_frontend* fe, struct dvb_frontend_par { struct cx24110_state *state = fe->demodulator_priv; - - if (fe->ops.tuner_ops.set_params) { - fe->ops.tuner_ops.set_params(fe, p); - if (fe->ops.i2c_gate_ctrl) fe->ops.i2c_gate_ctrl(fe, 0); - } - + state->config->pll_set(fe, p); cx24110_set_inversion (state, p->inversion); cx24110_set_fec (state, p->u.qpsk.fec_inner); cx24110_set_symbolrate (state, p->u.qpsk.symbol_rate); @@ -604,6 +600,7 @@ struct dvb_frontend* cx24110_attach(const struct cx24110_config* config, /* setup the state */ state->config = config; state->i2c = i2c; + memcpy(&state->ops, &cx24110_ops, sizeof(struct dvb_frontend_ops)); state->lastber = 0; state->lastbler = 0; state->lastesn0 = 0; @@ -613,7 +610,7 @@ struct dvb_frontend* cx24110_attach(const struct cx24110_config* config, if ((ret != 0x5a) && (ret != 0x69)) goto error; /* create dvb_frontend */ - memcpy(&state->frontend.ops, &cx24110_ops, sizeof(struct dvb_frontend_ops)); + state->frontend.ops = &state->ops; state->frontend.demodulator_priv = state; return &state->frontend; diff --git a/drivers/media/dvb/frontends/cx24110.h b/drivers/media/dvb/frontends/cx24110.h index b354a64e0..b63ecf264 100644 --- a/drivers/media/dvb/frontends/cx24110.h +++ b/drivers/media/dvb/frontends/cx24110.h @@ -31,6 +31,10 @@ struct cx24110_config { /* the demodulator's i2c address */ u8 demod_address; + + /* PLL maintenance */ + int (*pll_init)(struct dvb_frontend* fe); + int (*pll_set)(struct dvb_frontend* fe, struct dvb_frontend_parameters* params); }; extern struct dvb_frontend* cx24110_attach(const struct cx24110_config* config, diff --git a/drivers/media/dvb/frontends/cx24123.c b/drivers/media/dvb/frontends/cx24123.c index 1e7e79037..d661c6f9c 100644 --- a/drivers/media/dvb/frontends/cx24123.c +++ b/drivers/media/dvb/frontends/cx24123.c @@ -29,9 +29,6 @@ #include "dvb_frontend.h" #include "cx24123.h" -#define XTAL 10111000 - -static int force_band; static int debug; #define dprintk(args...) \ do { \ @@ -41,19 +38,20 @@ static int debug; struct cx24123_state { struct i2c_adapter* i2c; + struct dvb_frontend_ops ops; const struct cx24123_config* config; struct dvb_frontend frontend; u32 lastber; u16 snr; + u8 lnbreg; /* Some PLL specifics for tuning */ u32 VCAarg; u32 VGAarg; u32 bandselectarg; u32 pllarg; - u32 FILTune; /* The Demod/Tuner can't easily provide these, we cache them */ u32 currentfreq; @@ -65,33 +63,43 @@ static struct { u32 symbolrate_low; u32 symbolrate_high; + u32 VCAslope; + u32 VCAoffset; + u32 VGA1offset; + u32 VGA2offset; u32 VCAprogdata; u32 VGAprogdata; - u32 FILTune; } cx24123_AGC_vals[] = { { .symbolrate_low = 1000000, .symbolrate_high = 4999999, - /* the specs recommend other values for VGA offsets, - but tests show they are wrong */ - .VGAprogdata = (1 << 19) | (0x180 << 9) | 0x1e0, - .VCAprogdata = (2 << 19) | (0x07 << 9) | 0x07, - .FILTune = 0x27f /* 0.41 V */ + .VCAslope = 0x07, + .VCAoffset = 0x0f, + .VGA1offset = 0x1f8, + .VGA2offset = 0x1f8, + .VGAprogdata = (2 << 18) | (0x1f8 << 9) | 0x1f8, + .VCAprogdata = (4 << 18) | (0x07 << 9) | 0x07, }, { .symbolrate_low = 5000000, .symbolrate_high = 14999999, - .VGAprogdata = (1 << 19) | (0x180 << 9) | 0x1e0, - .VCAprogdata = (2 << 19) | (0x07 << 9) | 0x1f, - .FILTune = 0x317 /* 0.90 V */ + .VCAslope = 0x1f, + .VCAoffset = 0x1f, + .VGA1offset = 0x1e0, + .VGA2offset = 0x180, + .VGAprogdata = (2 << 18) | (0x180 << 9) | 0x1e0, + .VCAprogdata = (4 << 18) | (0x07 << 9) | 0x1f, }, { .symbolrate_low = 15000000, .symbolrate_high = 45000000, - .VGAprogdata = (1 << 19) | (0x100 << 9) | 0x180, - .VCAprogdata = (2 << 19) | (0x07 << 9) | 0x3f, - .FILTune = 0x145 /* 2.70 V */ + .VCAslope = 0x3f, + .VCAoffset = 0x3f, + .VGA1offset = 0x180, + .VGA2offset = 0x100, + .VGAprogdata = (2 << 18) | (0x100 << 9) | 0x180, + .VCAprogdata = (4 << 18) | (0x07 << 9) | 0x3f, }, }; @@ -104,80 +112,91 @@ static struct { u32 freq_low; u32 freq_high; + u32 bandselect; u32 VCOdivider; + u32 VCOnumber; u32 progdata; } cx24123_bandselect_vals[] = { - /* band 1 */ { .freq_low = 950000, + .freq_high = 1018999, + .bandselect = 0x40, + .VCOdivider = 4, + .VCOnumber = 7, + .progdata = (0 << 18) | (0 << 9) | 0x40, + }, + { + .freq_low = 1019000, .freq_high = 1074999, + .bandselect = 0x80, .VCOdivider = 4, - .progdata = (0 << 19) | (0 << 9) | 0x40, + .VCOnumber = 8, + .progdata = (0 << 18) | (0 << 9) | 0x80, }, - - /* band 2 */ { .freq_low = 1075000, - .freq_high = 1177999, - .VCOdivider = 4, - .progdata = (0 << 19) | (0 << 9) | 0x80, + .freq_high = 1227999, + .bandselect = 0x01, + .VCOdivider = 2, + .VCOnumber = 1, + .progdata = (0 << 18) | (1 << 9) | 0x01, }, - - /* band 3 */ { - .freq_low = 1178000, - .freq_high = 1295999, + .freq_low = 1228000, + .freq_high = 1349999, + .bandselect = 0x02, .VCOdivider = 2, - .progdata = (0 << 19) | (1 << 9) | 0x01, + .VCOnumber = 2, + .progdata = (0 << 18) | (1 << 9) | 0x02, }, - - /* band 4 */ { - .freq_low = 1296000, - .freq_high = 1431999, + .freq_low = 1350000, + .freq_high = 1481999, + .bandselect = 0x04, .VCOdivider = 2, - .progdata = (0 << 19) | (1 << 9) | 0x02, + .VCOnumber = 3, + .progdata = (0 << 18) | (1 << 9) | 0x04, }, - - /* band 5 */ { - .freq_low = 1432000, - .freq_high = 1575999, + .freq_low = 1482000, + .freq_high = 1595999, + .bandselect = 0x08, .VCOdivider = 2, - .progdata = (0 << 19) | (1 << 9) | 0x04, + .VCOnumber = 4, + .progdata = (0 << 18) | (1 << 9) | 0x08, }, - - /* band 6 */ { - .freq_low = 1576000, + .freq_low = 1596000, .freq_high = 1717999, + .bandselect = 0x10, .VCOdivider = 2, - .progdata = (0 << 19) | (1 << 9) | 0x08, + .VCOnumber = 5, + .progdata = (0 << 18) | (1 << 9) | 0x10, }, - - /* band 7 */ { .freq_low = 1718000, .freq_high = 1855999, + .bandselect = 0x20, .VCOdivider = 2, - .progdata = (0 << 19) | (1 << 9) | 0x10, + .VCOnumber = 6, + .progdata = (0 << 18) | (1 << 9) | 0x20, }, - - /* band 8 */ { .freq_low = 1856000, .freq_high = 2035999, + .bandselect = 0x40, .VCOdivider = 2, - .progdata = (0 << 19) | (1 << 9) | 0x20, + .VCOnumber = 7, + .progdata = (0 << 18) | (1 << 9) | 0x40, }, - - /* band 9 */ { .freq_low = 2036000, - .freq_high = 2150000, + .freq_high = 2149999, + .bandselect = 0x80, .VCOdivider = 2, - .progdata = (0 << 19) | (1 << 9) | 0x40, + .VCOnumber = 8, + .progdata = (0 << 18) | (1 << 9) | 0x80, }, }; @@ -188,44 +207,49 @@ static struct { { {0x00, 0x03}, /* Reset system */ {0x00, 0x00}, /* Clear reset */ - {0x03, 0x07}, /* QPSK, DVB, Auto Acquisition (default) */ - {0x04, 0x10}, /* MPEG */ - {0x05, 0x04}, /* MPEG */ - {0x06, 0x31}, /* MPEG (default) */ - {0x0b, 0x00}, /* Freq search start point (default) */ - {0x0c, 0x00}, /* Demodulator sample gain (default) */ - {0x0d, 0x02}, /* Frequency search range = Fsymbol / 4 (default) */ - {0x0e, 0x03}, /* Default non-inverted, FEC 3/4 (default) */ - {0x0f, 0xfe}, /* FEC search mask (all supported codes) */ - {0x10, 0x01}, /* Default search inversion, no repeat (default) */ - {0x16, 0x00}, /* Enable reading of frequency */ - {0x17, 0x01}, /* Enable EsNO Ready Counter */ - {0x1c, 0x80}, /* Enable error counter */ - {0x20, 0x00}, /* Tuner burst clock rate = 500KHz */ - {0x21, 0x15}, /* Tuner burst mode, word length = 0x15 */ - {0x28, 0x00}, /* Enable FILTERV with positive pol., DiSEqC 2.x off */ - {0x29, 0x00}, /* DiSEqC LNB_DC off */ - {0x2a, 0xb0}, /* DiSEqC Parameters (default) */ - {0x2b, 0x73}, /* DiSEqC Tone Frequency (default) */ - {0x2c, 0x00}, /* DiSEqC Message (0x2c - 0x31) */ + {0x01, 0x3b}, /* Apply sensible defaults, from an i2c sniffer */ + {0x03, 0x07}, + {0x04, 0x10}, + {0x05, 0x04}, + {0x06, 0x31}, + {0x0d, 0x02}, + {0x0e, 0x03}, + {0x0f, 0xfe}, + {0x10, 0x01}, + {0x14, 0x01}, + {0x15, 0x98}, + {0x16, 0x00}, + {0x17, 0x01}, + {0x1b, 0x05}, + {0x1c, 0x80}, + {0x1d, 0x00}, + {0x1e, 0x00}, + {0x20, 0x41}, + {0x21, 0x15}, + {0x27, 0x14}, + {0x28, 0x46}, + {0x29, 0x00}, + {0x2a, 0xb0}, + {0x2b, 0x73}, + {0x2c, 0x00}, {0x2d, 0x00}, {0x2e, 0x00}, {0x2f, 0x00}, {0x30, 0x00}, {0x31, 0x00}, - {0x32, 0x8c}, /* DiSEqC Parameters (default) */ - {0x33, 0x00}, /* Interrupts off (0x33 - 0x34) */ + {0x32, 0x8c}, + {0x33, 0x00}, {0x34, 0x00}, - {0x35, 0x03}, /* DiSEqC Tone Amplitude (default) */ - {0x36, 0x02}, /* DiSEqC Parameters (default) */ - {0x37, 0x3a}, /* DiSEqC Parameters (default) */ - {0x3a, 0x00}, /* Enable AGC accumulator (for signal strength) */ - {0x44, 0x00}, /* Constellation (default) */ - {0x45, 0x00}, /* Symbol count (default) */ - {0x46, 0x0d}, /* Symbol rate estimator on (default) */ - {0x56, 0x41}, /* Various (default) */ - {0x57, 0xff}, /* Error Counter Window (default) */ - {0x67, 0x83}, /* Non-DCII symbol clock */ + {0x35, 0x03}, + {0x36, 0x02}, + {0x37, 0x3a}, + {0x3a, 0x00}, /* Enable AGC accumulator */ + {0x44, 0x00}, + {0x45, 0x00}, + {0x46, 0x05}, + {0x56, 0x41}, + {0x57, 0xff}, + {0x67, 0x83}, }; static int cx24123_writereg(struct cx24123_state* state, int reg, int data) @@ -234,10 +258,6 @@ static int cx24123_writereg(struct cx24123_state* state, int reg, int data) struct i2c_msg msg = { .addr = state->config->demod_address, .flags = 0, .buf = buf, .len = 2 }; int err; - if (debug>1) - printk("cx24123: %s: write reg 0x%02x, value 0x%02x\n", - __FUNCTION__,reg, data); - if ((err = i2c_transfer(state->i2c, &msg, 1)) != 1) { printk("%s: writereg error(err == %i, reg == 0x%02x," " data == 0x%02x)\n", __FUNCTION__, err, reg, data); @@ -247,6 +267,25 @@ static int cx24123_writereg(struct cx24123_state* state, int reg, int data) return 0; } +static int cx24123_writelnbreg(struct cx24123_state* state, int reg, int data) +{ + u8 buf[] = { reg, data }; + /* fixme: put the intersil addr int the config */ + struct i2c_msg msg = { .addr = 0x08, .flags = 0, .buf = buf, .len = 2 }; + int err; + + if ((err = i2c_transfer(state->i2c, &msg, 1)) != 1) { + printk("%s: writelnbreg error (err == %i, reg == 0x%02x," + " data == 0x%02x)\n", __FUNCTION__, err, reg, data); + return -EREMOTEIO; + } + + /* cache the write, no way to read back */ + state->lnbreg = data; + + return 0; +} + static int cx24123_readreg(struct cx24123_state* state, u8 reg) { int ret; @@ -264,31 +303,27 @@ static int cx24123_readreg(struct cx24123_state* state, u8 reg) return ret; } - if (debug>1) - printk("cx24123: read reg 0x%02x, value 0x%02x\n",reg, ret); - return b1[0]; } -static int cx24123_set_inversion(struct cx24123_state* state, fe_spectral_inversion_t inversion) +static int cx24123_readlnbreg(struct cx24123_state* state, u8 reg) { - u8 nom_reg = cx24123_readreg(state, 0x0e); - u8 auto_reg = cx24123_readreg(state, 0x10); + return state->lnbreg; +} +static int cx24123_set_inversion(struct cx24123_state* state, fe_spectral_inversion_t inversion) +{ switch (inversion) { case INVERSION_OFF: - dprintk("%s: inversion off\n",__FUNCTION__); - cx24123_writereg(state, 0x0e, nom_reg & ~0x80); - cx24123_writereg(state, 0x10, auto_reg | 0x80); + cx24123_writereg(state, 0x0e, cx24123_readreg(state, 0x0e) & 0x7f); + cx24123_writereg(state, 0x10, cx24123_readreg(state, 0x10) | 0x80); break; case INVERSION_ON: - dprintk("%s: inversion on\n",__FUNCTION__); - cx24123_writereg(state, 0x0e, nom_reg | 0x80); - cx24123_writereg(state, 0x10, auto_reg | 0x80); + cx24123_writereg(state, 0x0e, cx24123_readreg(state, 0x0e) | 0x80); + cx24123_writereg(state, 0x10, cx24123_readreg(state, 0x10) | 0x80); break; case INVERSION_AUTO: - dprintk("%s: inversion auto\n",__FUNCTION__); - cx24123_writereg(state, 0x10, auto_reg & ~0x80); + cx24123_writereg(state, 0x10, cx24123_readreg(state, 0x10) & 0x7f); break; default: return -EINVAL; @@ -303,191 +338,92 @@ static int cx24123_get_inversion(struct cx24123_state* state, fe_spectral_invers val = cx24123_readreg(state, 0x1b) >> 7; - if (val == 0) { - dprintk("%s: read inversion off\n",__FUNCTION__); + if (val == 0) *inversion = INVERSION_OFF; - } else { - dprintk("%s: read inversion on\n",__FUNCTION__); + else *inversion = INVERSION_ON; - } return 0; } static int cx24123_set_fec(struct cx24123_state* state, fe_code_rate_t fec) { - u8 nom_reg = cx24123_readreg(state, 0x0e) & ~0x07; - if ( (fec < FEC_NONE) || (fec > FEC_AUTO) ) fec = FEC_AUTO; + /* Hardware has 5/11 and 3/5 but are never unused */ switch (fec) { + case FEC_NONE: + return cx24123_writereg(state, 0x0f, 0x01); case FEC_1_2: - dprintk("%s: set FEC to 1/2\n",__FUNCTION__); - cx24123_writereg(state, 0x0e, nom_reg | 0x01); - cx24123_writereg(state, 0x0f, 0x02); - break; + return cx24123_writereg(state, 0x0f, 0x02); case FEC_2_3: - dprintk("%s: set FEC to 2/3\n",__FUNCTION__); - cx24123_writereg(state, 0x0e, nom_reg | 0x02); - cx24123_writereg(state, 0x0f, 0x04); - break; + return cx24123_writereg(state, 0x0f, 0x04); case FEC_3_4: - dprintk("%s: set FEC to 3/4\n",__FUNCTION__); - cx24123_writereg(state, 0x0e, nom_reg | 0x03); - cx24123_writereg(state, 0x0f, 0x08); - break; - case FEC_4_5: - dprintk("%s: set FEC to 4/5\n",__FUNCTION__); - cx24123_writereg(state, 0x0e, nom_reg | 0x04); - cx24123_writereg(state, 0x0f, 0x10); - break; + return cx24123_writereg(state, 0x0f, 0x08); case FEC_5_6: - dprintk("%s: set FEC to 5/6\n",__FUNCTION__); - cx24123_writereg(state, 0x0e, nom_reg | 0x05); - cx24123_writereg(state, 0x0f, 0x20); - break; - case FEC_6_7: - dprintk("%s: set FEC to 6/7\n",__FUNCTION__); - cx24123_writereg(state, 0x0e, nom_reg | 0x06); - cx24123_writereg(state, 0x0f, 0x40); - break; + return cx24123_writereg(state, 0x0f, 0x20); case FEC_7_8: - dprintk("%s: set FEC to 7/8\n",__FUNCTION__); - cx24123_writereg(state, 0x0e, nom_reg | 0x07); - cx24123_writereg(state, 0x0f, 0x80); - break; + return cx24123_writereg(state, 0x0f, 0x80); case FEC_AUTO: - dprintk("%s: set FEC to auto\n",__FUNCTION__); - cx24123_writereg(state, 0x0f, 0xfe); - break; + return cx24123_writereg(state, 0x0f, 0xae); default: return -EOPNOTSUPP; } - - return 0; } static int cx24123_get_fec(struct cx24123_state* state, fe_code_rate_t *fec) { int ret; + u8 val; ret = cx24123_readreg (state, 0x1b); if (ret < 0) return ret; - ret = ret & 0x07; - - switch (ret) { + val = ret & 0x07; + switch (val) { case 1: *fec = FEC_1_2; break; - case 2: - *fec = FEC_2_3; - break; case 3: - *fec = FEC_3_4; + *fec = FEC_2_3; break; case 4: - *fec = FEC_4_5; + *fec = FEC_3_4; break; case 5: - *fec = FEC_5_6; + *fec = FEC_4_5; break; case 6: - *fec = FEC_6_7; + *fec = FEC_5_6; break; case 7: *fec = FEC_7_8; break; + case 2: /* *fec = FEC_3_5; break; */ + case 0: /* *fec = FEC_5_11; break; */ + *fec = FEC_AUTO; + break; default: - /* this can happen when there's no lock */ - *fec = FEC_NONE; + *fec = FEC_NONE; // can't happen } return 0; } -/* Approximation of closest integer of log2(a/b). It actually gives the - lowest integer i such that 2^i >= round(a/b) */ -static u32 cx24123_int_log2(u32 a, u32 b) -{ - u32 exp, nearest = 0; - u32 div = a / b; - if(a % b >= b / 2) ++div; - if(div < (1 << 31)) - { - for(exp = 1; div > exp; nearest++) - exp += exp; - } - return nearest; -} - +/* fixme: Symbol rates < 3MSps may not work because of precision loss */ static int cx24123_set_symbolrate(struct cx24123_state* state, u32 srate) { - u32 tmp, sample_rate, ratio, sample_gain; - u8 pll_mult; - - /* check if symbol rate is within limits */ - if ((srate > state->frontend.ops.info.symbol_rate_max) || - (srate < state->frontend.ops.info.symbol_rate_min)) - return -EOPNOTSUPP;; - - /* choose the sampling rate high enough for the required operation, - while optimizing the power consumed by the demodulator */ - if (srate < (XTAL*2)/2) - pll_mult = 2; - else if (srate < (XTAL*3)/2) - pll_mult = 3; - else if (srate < (XTAL*4)/2) - pll_mult = 4; - else if (srate < (XTAL*5)/2) - pll_mult = 5; - else if (srate < (XTAL*6)/2) - pll_mult = 6; - else if (srate < (XTAL*7)/2) - pll_mult = 7; - else if (srate < (XTAL*8)/2) - pll_mult = 8; - else - pll_mult = 9; - - - sample_rate = pll_mult * XTAL; + u32 val; - /* - SYSSymbolRate[21:0] = (srate << 23) / sample_rate + val = (srate / 1185) * 100; - We have to use 32 bit unsigned arithmetic without precision loss. - The maximum srate is 45000000 or 0x02AEA540. This number has - only 6 clear bits on top, hence we can shift it left only 6 bits - at a time. Borrowed from cx24110.c - */ + /* Compensate for scaling up, by removing 17 symbols per 1Msps */ + val = val - (17 * (srate / 1000000)); - tmp = srate << 6; - ratio = tmp / sample_rate; - - tmp = (tmp % sample_rate) << 6; - ratio = (ratio << 6) + (tmp / sample_rate); - - tmp = (tmp % sample_rate) << 6; - ratio = (ratio << 6) + (tmp / sample_rate); - - tmp = (tmp % sample_rate) << 5; - ratio = (ratio << 5) + (tmp / sample_rate); - - - cx24123_writereg(state, 0x01, pll_mult * 6); - - cx24123_writereg(state, 0x08, (ratio >> 16) & 0x3f ); - cx24123_writereg(state, 0x09, (ratio >> 8) & 0xff ); - cx24123_writereg(state, 0x0a, (ratio ) & 0xff ); - - /* also set the demodulator sample gain */ - sample_gain = cx24123_int_log2(sample_rate, srate); - tmp = cx24123_readreg(state, 0x0c) & ~0xe0; - cx24123_writereg(state, 0x0c, tmp | sample_gain << 5); - - dprintk("%s: srate=%d, ratio=0x%08x, sample_rate=%i sample_gain=%d\n", __FUNCTION__, srate, ratio, sample_rate, sample_gain); + cx24123_writereg(state, 0x08, (val >> 16) & 0xff ); + cx24123_writereg(state, 0x09, (val >> 8) & 0xff ); + cx24123_writereg(state, 0x0a, (val ) & 0xff ); return 0; } @@ -501,9 +437,6 @@ static int cx24123_pll_calculate(struct dvb_frontend* fe, struct dvb_frontend_pa struct cx24123_state *state = fe->demodulator_priv; u32 ndiv = 0, adiv = 0, vco_div = 0; int i = 0; - int pump = 2; - int band = 0; - int num_bands = sizeof(cx24123_bandselect_vals) / sizeof(cx24123_bandselect_vals[0]); /* Defaults for low freq, low rate */ state->VCAarg = cx24123_AGC_vals[0].VCAprogdata; @@ -511,49 +444,38 @@ static int cx24123_pll_calculate(struct dvb_frontend* fe, struct dvb_frontend_pa state->bandselectarg = cx24123_bandselect_vals[0].progdata; vco_div = cx24123_bandselect_vals[0].VCOdivider; - /* For the given symbol rate, determine the VCA, VGA and FILTUNE programming bits */ + /* For the given symbolerate, determine the VCA and VGA programming bits */ for (i = 0; i < sizeof(cx24123_AGC_vals) / sizeof(cx24123_AGC_vals[0]); i++) { if ((cx24123_AGC_vals[i].symbolrate_low <= p->u.qpsk.symbol_rate) && - (cx24123_AGC_vals[i].symbolrate_high >= p->u.qpsk.symbol_rate) ) { + (cx24123_AGC_vals[i].symbolrate_high >= p->u.qpsk.symbol_rate) ) { state->VCAarg = cx24123_AGC_vals[i].VCAprogdata; state->VGAarg = cx24123_AGC_vals[i].VGAprogdata; - state->FILTune = cx24123_AGC_vals[i].FILTune; } } - /* determine the band to use */ - if(force_band < 1 || force_band > num_bands) + /* For the given frequency, determine the bandselect programming bits */ + for (i = 0; i < sizeof(cx24123_bandselect_vals) / sizeof(cx24123_bandselect_vals[0]); i++) { - for (i = 0; i < num_bands; i++) - { - if ((cx24123_bandselect_vals[i].freq_low <= p->frequency) && - (cx24123_bandselect_vals[i].freq_high >= p->frequency) ) - band = i; + if ((cx24123_bandselect_vals[i].freq_low <= p->frequency) && + (cx24123_bandselect_vals[i].freq_high >= p->frequency) ) { + state->bandselectarg = cx24123_bandselect_vals[i].progdata; + vco_div = cx24123_bandselect_vals[i].VCOdivider; } } - else - band = force_band - 1; - - state->bandselectarg = cx24123_bandselect_vals[band].progdata; - vco_div = cx24123_bandselect_vals[band].VCOdivider; - - /* determine the charge pump current */ - if ( p->frequency < (cx24123_bandselect_vals[band].freq_low + cx24123_bandselect_vals[band].freq_high)/2 ) - pump = 0x01; - else - pump = 0x02; /* Determine the N/A dividers for the requested lband freq (in kHz). */ - /* Note: the reference divider R=10, frequency is in KHz, XTAL is in Hz */ - ndiv = ( ((p->frequency * vco_div * 10) / (2 * XTAL / 1000)) / 32) & 0x1ff; - adiv = ( ((p->frequency * vco_div * 10) / (2 * XTAL / 1000)) % 32) & 0x1f; + /* Note: 10111 (kHz) is the Crystal Freq and divider of 10. */ + ndiv = ( ((p->frequency * vco_div) / (10111 / 10) / 2) / 32) & 0x1ff; + adiv = ( ((p->frequency * vco_div) / (10111 / 10) / 2) % 32) & 0x1f; - if (adiv == 0 && ndiv > 0) - ndiv--; + if (adiv == 0) + adiv++; - /* control bits 11, refdiv 11, charge pump polarity 1, charge pump current, ndiv, adiv */ - state->pllarg = (3 << 19) | (3 << 17) | (1 << 16) | (pump << 14) | (ndiv << 5) | adiv; + /* determine the correct pll frequency values. */ + /* Command 11, refdiv 11, cpump polarity 1, cpump current 3mA 10. */ + state->pllarg = (3 << 19) | (3 << 17) | (1 << 16) | (2 << 14); + state->pllarg |= (ndiv << 5) | adiv; return 0; } @@ -567,8 +489,6 @@ static int cx24123_pll_writereg(struct dvb_frontend* fe, struct dvb_frontend_par struct cx24123_state *state = fe->demodulator_priv; unsigned long timeout; - dprintk("%s: pll writereg called, data=0x%08x\n",__FUNCTION__,data); - /* align the 21 bytes into to bit23 boundary */ data = data << 3; @@ -618,9 +538,6 @@ static int cx24123_pll_writereg(struct dvb_frontend* fe, struct dvb_frontend_par static int cx24123_pll_tune(struct dvb_frontend* fe, struct dvb_frontend_parameters *p) { struct cx24123_state *state = fe->demodulator_priv; - u8 val; - - dprintk("frequency=%i\n", p->frequency); if (cx24123_pll_calculate(fe, p) != 0) { printk("%s: cx24123_pll_calcutate failed\n",__FUNCTION__); @@ -635,14 +552,6 @@ static int cx24123_pll_tune(struct dvb_frontend* fe, struct dvb_frontend_paramet cx24123_pll_writereg(fe, p, state->bandselectarg); cx24123_pll_writereg(fe, p, state->pllarg); - /* set the FILTUNE voltage */ - val = cx24123_readreg(state, 0x28) & ~0x3; - cx24123_writereg(state, 0x27, state->FILTune >> 2); - cx24123_writereg(state, 0x28, val | (state->FILTune & 0x3)); - - dprintk("%s: pll tune VCA=%d, band=%d, pll=%d\n",__FUNCTION__,state->VCAarg, - state->bandselectarg,state->pllarg); - return 0; } @@ -651,118 +560,77 @@ static int cx24123_initfe(struct dvb_frontend* fe) struct cx24123_state *state = fe->demodulator_priv; int i; - dprintk("%s: init frontend\n",__FUNCTION__); - /* Configure the demod to a good set of defaults */ for (i = 0; i < sizeof(cx24123_regdata) / sizeof(cx24123_regdata[0]); i++) cx24123_writereg(state, cx24123_regdata[i].reg, cx24123_regdata[i].data); - return 0; -} - -static int cx24123_set_voltage(struct dvb_frontend* fe, fe_sec_voltage_t voltage) -{ - struct cx24123_state *state = fe->demodulator_priv; - u8 val; - - val = cx24123_readreg(state, 0x29) & ~0x40; + if (state->config->pll_init) + state->config->pll_init(fe); - switch (voltage) { - case SEC_VOLTAGE_13: - dprintk("%s: setting voltage 13V\n", __FUNCTION__); - return cx24123_writereg(state, 0x29, val & 0x7f); - case SEC_VOLTAGE_18: - dprintk("%s: setting voltage 18V\n", __FUNCTION__); - return cx24123_writereg(state, 0x29, val | 0x80); - default: - return -EINVAL; - }; + /* Configure the LNB for 14V */ + if (state->config->use_isl6421) + cx24123_writelnbreg(state, 0x0, 0x2a); return 0; } -/* wait for diseqc queue to become ready (or timeout) */ -static void cx24123_wait_for_diseqc(struct cx24123_state *state) -{ - unsigned long timeout = jiffies + msecs_to_jiffies(200); - while (!(cx24123_readreg(state, 0x29) & 0x40)) { - if(time_after(jiffies, timeout)) { - printk("%s: diseqc queue not ready, command may be lost.\n", __FUNCTION__); - break; - } - msleep(10); - } -} - -static int cx24123_send_diseqc_msg(struct dvb_frontend* fe, struct dvb_diseqc_master_cmd *cmd) +static int cx24123_set_voltage(struct dvb_frontend* fe, fe_sec_voltage_t voltage) { struct cx24123_state *state = fe->demodulator_priv; - int i, val, tone; - - dprintk("%s:\n",__FUNCTION__); - - /* stop continuous tone if enabled */ - tone = cx24123_readreg(state, 0x29); - if (tone & 0x10) - cx24123_writereg(state, 0x29, tone & ~0x50); - - /* wait for diseqc queue ready */ - cx24123_wait_for_diseqc(state); - - /* select tone mode */ - cx24123_writereg(state, 0x2a, cx24123_readreg(state, 0x2a) & 0xfb); - - for (i = 0; i < cmd->msg_len; i++) - cx24123_writereg(state, 0x2C + i, cmd->msg[i]); + u8 val; - val = cx24123_readreg(state, 0x29); - cx24123_writereg(state, 0x29, ((val & 0x90) | 0x40) | ((cmd->msg_len-3) & 3)); + switch (state->config->use_isl6421) { - /* wait for diseqc message to finish sending */ - cx24123_wait_for_diseqc(state); + case 1: - /* restart continuous tone if enabled */ - if (tone & 0x10) { - cx24123_writereg(state, 0x29, tone & ~0x40); + val = cx24123_readlnbreg(state, 0x0); + + switch (voltage) { + case SEC_VOLTAGE_13: + return cx24123_writelnbreg(state, 0x0, val & 0x32); /* V 13v */ + case SEC_VOLTAGE_18: + return cx24123_writelnbreg(state, 0x0, val | 0x04); /* H 18v */ + case SEC_VOLTAGE_OFF: + return cx24123_writelnbreg(state, 0x0, val & 0x30); + default: + return -EINVAL; + }; + + case 0: + + val = cx24123_readreg(state, 0x29); + + switch (voltage) { + case SEC_VOLTAGE_13: + dprintk("%s: setting voltage 13V\n", __FUNCTION__); + if (state->config->enable_lnb_voltage) + state->config->enable_lnb_voltage(fe, 1); + return cx24123_writereg(state, 0x29, val | 0x80); + case SEC_VOLTAGE_18: + dprintk("%s: setting voltage 18V\n", __FUNCTION__); + if (state->config->enable_lnb_voltage) + state->config->enable_lnb_voltage(fe, 1); + return cx24123_writereg(state, 0x29, val & 0x7f); + case SEC_VOLTAGE_OFF: + dprintk("%s: setting voltage off\n", __FUNCTION__); + if (state->config->enable_lnb_voltage) + state->config->enable_lnb_voltage(fe, 0); + return 0; + default: + return -EINVAL; + }; } return 0; } -static int cx24123_diseqc_send_burst(struct dvb_frontend* fe, fe_sec_mini_cmd_t burst) +static int cx24123_send_diseqc_msg(struct dvb_frontend* fe, + struct dvb_diseqc_master_cmd *cmd) { - struct cx24123_state *state = fe->demodulator_priv; - int val, tone; - - dprintk("%s:\n", __FUNCTION__); - - /* stop continuous tone if enabled */ - tone = cx24123_readreg(state, 0x29); - if (tone & 0x10) - cx24123_writereg(state, 0x29, tone & ~0x50); - - /* wait for diseqc queue ready */ - cx24123_wait_for_diseqc(state); - - /* select tone mode */ - cx24123_writereg(state, 0x2a, cx24123_readreg(state, 0x2a) | 0x4); - msleep(30); - val = cx24123_readreg(state, 0x29); - if (burst == SEC_MINI_A) - cx24123_writereg(state, 0x29, ((val & 0x90) | 0x40 | 0x00)); - else if (burst == SEC_MINI_B) - cx24123_writereg(state, 0x29, ((val & 0x90) | 0x40 | 0x08)); - else - return -EINVAL; + /* fixme: Implement diseqc */ + printk("%s: No support yet\n",__FUNCTION__); - cx24123_wait_for_diseqc(state); - cx24123_writereg(state, 0x2a, cx24123_readreg(state, 0x2a) & 0xfb); - - /* restart continuous tone if enabled */ - if (tone & 0x10) { - cx24123_writereg(state, 0x29, tone & ~0x40); - } - return 0; + return -ENOTSUPP; } static int cx24123_read_status(struct dvb_frontend* fe, fe_status_t* status) @@ -774,15 +642,13 @@ static int cx24123_read_status(struct dvb_frontend* fe, fe_status_t* status) *status = 0; if (lock & 0x01) - *status |= FE_HAS_SIGNAL; - if (sync & 0x02) - *status |= FE_HAS_CARRIER; + *status |= FE_HAS_CARRIER | FE_HAS_SIGNAL; if (sync & 0x04) *status |= FE_HAS_VITERBI; if (sync & 0x08) - *status |= FE_HAS_SYNC; + *status |= FE_HAS_CARRIER; if (sync & 0x80) - *status |= FE_HAS_LOCK; + *status |= FE_HAS_SYNC | FE_HAS_LOCK; return 0; } @@ -815,8 +681,6 @@ static int cx24123_read_ber(struct dvb_frontend* fe, u32* ber) else state->snr = 0; - dprintk("%s: BER = %d, S/N index = %d\n",__FUNCTION__,state->lastber, state->snr); - *ber = state->lastber; return 0; @@ -827,8 +691,6 @@ static int cx24123_read_signal_strength(struct dvb_frontend* fe, u16* signal_str struct cx24123_state *state = fe->demodulator_priv; *signal_strength = cx24123_readreg(state, 0x3b) << 8; /* larger = better */ - dprintk("%s: Signal strength = %d\n",__FUNCTION__,*signal_strength); - return 0; } @@ -837,8 +699,6 @@ static int cx24123_read_snr(struct dvb_frontend* fe, u16* snr) struct cx24123_state *state = fe->demodulator_priv; *snr = state->snr; - dprintk("%s: read S/N index = %d\n",__FUNCTION__,*snr); - return 0; } @@ -847,8 +707,6 @@ static int cx24123_read_ucblocks(struct dvb_frontend* fe, u32* ucblocks) struct cx24123_state *state = fe->demodulator_priv; *ucblocks = state->lastber; - dprintk("%s: ucblocks (ber) = %d\n",__FUNCTION__,*ucblocks); - return 0; } @@ -856,8 +714,6 @@ static int cx24123_set_frontend(struct dvb_frontend* fe, struct dvb_frontend_par { struct cx24123_state *state = fe->demodulator_priv; - dprintk("%s: set_frontend\n",__FUNCTION__); - if (state->config->set_ts_params) state->config->set_ts_params(fe, 0); @@ -881,8 +737,6 @@ static int cx24123_get_frontend(struct dvb_frontend* fe, struct dvb_frontend_par { struct cx24123_state *state = fe->demodulator_priv; - dprintk("%s: get_frontend\n",__FUNCTION__); - if (cx24123_get_inversion(state, &p->inversion) != 0) { printk("%s: Failed to get inversion status\n",__FUNCTION__); return -EREMOTEIO; @@ -902,21 +756,36 @@ static int cx24123_set_tone(struct dvb_frontend* fe, fe_sec_tone_mode_t tone) struct cx24123_state *state = fe->demodulator_priv; u8 val; - /* wait for diseqc queue ready */ - cx24123_wait_for_diseqc(state); + switch (state->config->use_isl6421) { + case 1: + + val = cx24123_readlnbreg(state, 0x0); - val = cx24123_readreg(state, 0x29) & ~0x40; + switch (tone) { + case SEC_TONE_ON: + return cx24123_writelnbreg(state, 0x0, val | 0x10); + case SEC_TONE_OFF: + return cx24123_writelnbreg(state, 0x0, val & 0x2f); + default: + printk("%s: CASE reached default with tone=%d\n", __FUNCTION__, tone); + return -EINVAL; + } - switch (tone) { - case SEC_TONE_ON: - dprintk("%s: setting tone on\n", __FUNCTION__); - return cx24123_writereg(state, 0x29, val | 0x10); - case SEC_TONE_OFF: - dprintk("%s: setting tone off\n",__FUNCTION__); - return cx24123_writereg(state, 0x29, val & 0xef); - default: - printk("%s: CASE reached default with tone=%d\n", __FUNCTION__, tone); - return -EINVAL; + case 0: + + val = cx24123_readreg(state, 0x29); + + switch (tone) { + case SEC_TONE_ON: + dprintk("%s: setting tone on\n", __FUNCTION__); + return cx24123_writereg(state, 0x29, val | 0x10); + case SEC_TONE_OFF: + dprintk("%s: setting tone off\n",__FUNCTION__); + return cx24123_writereg(state, 0x29, val & 0xef); + default: + printk("%s: CASE reached default with tone=%d\n", __FUNCTION__, tone); + return -EINVAL; + } } return 0; @@ -949,8 +818,10 @@ struct dvb_frontend* cx24123_attach(const struct cx24123_config* config, /* setup the state */ state->config = config; state->i2c = i2c; + memcpy(&state->ops, &cx24123_ops, sizeof(struct dvb_frontend_ops)); state->lastber = 0; state->snr = 0; + state->lnbreg = 0; state->VCAarg = 0; state->VGAarg = 0; state->bandselectarg = 0; @@ -966,7 +837,7 @@ struct dvb_frontend* cx24123_attach(const struct cx24123_config* config, } /* create dvb_frontend */ - memcpy(&state->frontend.ops, &cx24123_ops, sizeof(struct dvb_frontend_ops)); + state->frontend.ops = &state->ops; state->frontend.demodulator_priv = state; return &state->frontend; @@ -984,13 +855,12 @@ static struct dvb_frontend_ops cx24123_ops = { .frequency_min = 950000, .frequency_max = 2150000, .frequency_stepsize = 1011, /* kHz for QPSK frontends */ - .frequency_tolerance = 5000, + .frequency_tolerance = 29500, .symbol_rate_min = 1000000, .symbol_rate_max = 45000000, .caps = FE_CAN_INVERSION_AUTO | FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 | - FE_CAN_FEC_4_5 | FE_CAN_FEC_5_6 | FE_CAN_FEC_6_7 | - FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO | + FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO | FE_CAN_QPSK | FE_CAN_RECOVER }, @@ -1005,16 +875,12 @@ static struct dvb_frontend_ops cx24123_ops = { .read_snr = cx24123_read_snr, .read_ucblocks = cx24123_read_ucblocks, .diseqc_send_master_cmd = cx24123_send_diseqc_msg, - .diseqc_send_burst = cx24123_diseqc_send_burst, .set_tone = cx24123_set_tone, .set_voltage = cx24123_set_voltage, }; module_param(debug, int, 0644); -MODULE_PARM_DESC(debug, "Activates frontend debugging (default:0)"); - -module_param(force_band, int, 0644); -MODULE_PARM_DESC(force_band, "Force a specific band select (1-9, default:off)."); +MODULE_PARM_DESC(debug, "Turn on/off frontend debugging (default:off)."); MODULE_DESCRIPTION("DVB Frontend module for Conexant cx24123/cx24109 hardware"); MODULE_AUTHOR("Steven Toth"); diff --git a/drivers/media/dvb/frontends/cx24123.h b/drivers/media/dvb/frontends/cx24123.h index 9606f8259..0c922b5e9 100644 --- a/drivers/media/dvb/frontends/cx24123.h +++ b/drivers/media/dvb/frontends/cx24123.h @@ -28,8 +28,21 @@ struct cx24123_config /* the demodulator's i2c address */ u8 demod_address; + /* + cards like Hauppauge Nova-S Plus/Nova-SE2 use an Intersil ISL6421 chip + for LNB control, while KWorld DVB-S 100 use the LNBDC and LNBTone bits + from register 0x29 of the CX24123 demodulator + */ + int use_isl6421; + + /* PLL maintenance */ + int (*pll_init)(struct dvb_frontend* fe); + int (*pll_set)(struct dvb_frontend* fe, struct dvb_frontend_parameters* params); + /* Need to set device param for start_dma */ int (*set_ts_params)(struct dvb_frontend* fe, int is_punctured); + + void (*enable_lnb_voltage)(struct dvb_frontend* fe, int on); }; extern struct dvb_frontend* cx24123_attach(const struct cx24123_config* config, diff --git a/drivers/media/dvb/frontends/dib3000-common.h b/drivers/media/dvb/frontends/dib3000-common.h index be1c0d3e1..c31d6df15 100644 --- a/drivers/media/dvb/frontends/dib3000-common.h +++ b/drivers/media/dvb/frontends/dib3000-common.h @@ -38,6 +38,8 @@ struct dib3000_state { struct i2c_adapter* i2c; + struct dvb_frontend_ops ops; + /* configuration settings */ struct dib3000_config config; diff --git a/drivers/media/dvb/frontends/dib3000.h b/drivers/media/dvb/frontends/dib3000.h index ec927628d..2d5475b5c 100644 --- a/drivers/media/dvb/frontends/dib3000.h +++ b/drivers/media/dvb/frontends/dib3000.h @@ -30,6 +30,10 @@ struct dib3000_config { /* the demodulator's i2c address */ u8 demod_address; + + /* PLL maintenance and the i2c address of the PLL */ + int (*pll_init)(struct dvb_frontend *fe); + int (*pll_set)(struct dvb_frontend *fe, struct dvb_frontend_parameters* params); }; struct dib_fe_xfer_ops diff --git a/drivers/media/dvb/frontends/dib3000mb.c b/drivers/media/dvb/frontends/dib3000mb.c index 5302e1188..ae589adb1 100644 --- a/drivers/media/dvb/frontends/dib3000mb.c +++ b/drivers/media/dvb/frontends/dib3000mb.c @@ -21,6 +21,7 @@ * */ +#include #include #include #include @@ -59,9 +60,8 @@ static int dib3000mb_set_frontend(struct dvb_frontend* fe, fe_code_rate_t fe_cr = FEC_NONE; int search_state, seq; - if (tuner && fe->ops.tuner_ops.set_params) { - fe->ops.tuner_ops.set_params(fe, fep); - if (fe->ops.i2c_gate_ctrl) fe->ops.i2c_gate_ctrl(fe, 0); + if (tuner && state->config.pll_set) { + state->config.pll_set(fe, fep); deb_setf("bandwidth: "); switch (ofdm->bandwidth) { @@ -386,6 +386,9 @@ static int dib3000mb_fe_init(struct dvb_frontend* fe, int mobile_mode) wr(DIB3000MB_REG_DATA_IN_DIVERSITY, DIB3000MB_DATA_DIVERSITY_IN_OFF); + if (state->config.pll_init) + state->config.pll_init(fe); + return 0; } @@ -704,6 +707,7 @@ struct dvb_frontend* dib3000mb_attach(const struct dib3000_config* config, /* setup the state */ state->i2c = i2c; memcpy(&state->config,config,sizeof(struct dib3000_config)); + memcpy(&state->ops, &dib3000mb_ops, sizeof(struct dvb_frontend_ops)); /* check for the correct demod */ if (rd(DIB3000_REG_MANUFACTOR_ID) != DIB3000_I2C_ID_DIBCOM) @@ -713,7 +717,7 @@ struct dvb_frontend* dib3000mb_attach(const struct dib3000_config* config, goto error; /* create dvb_frontend */ - memcpy(&state->frontend.ops, &dib3000mb_ops, sizeof(struct dvb_frontend_ops)); + state->frontend.ops = &state->ops; state->frontend.demodulator_priv = state; /* set the xfer operations */ diff --git a/drivers/media/dvb/frontends/dib3000mc.c b/drivers/media/dvb/frontends/dib3000mc.c index 98673474a..3b303dbb6 100644 --- a/drivers/media/dvb/frontends/dib3000mc.c +++ b/drivers/media/dvb/frontends/dib3000mc.c @@ -20,6 +20,7 @@ * see Documentation/dvb/README.dibusb for more information * */ +#include #include #include #include @@ -461,9 +462,8 @@ static int dib3000mc_set_frontend(struct dvb_frontend* fe, int search_state,auto_val; u16 val; - if (tuner && fe->ops.tuner_ops.set_params) { /* initial call from dvb */ - fe->ops.tuner_ops.set_params(fe, fep); - if (fe->ops.i2c_gate_ctrl) fe->ops.i2c_gate_ctrl(fe, 0); + if (tuner && state->config.pll_set) { /* initial call from dvb */ + state->config.pll_set(fe,fep); state->last_tuned_freq = fep->frequency; // if (!scanboost) { @@ -642,6 +642,9 @@ static int dib3000mc_fe_init(struct dvb_frontend* fe, int mobile_mode) set_or(DIB3000MC_REG_CLK_CFG_7,DIB3000MC_CLK_CFG_7_DIV_IN_OFF); + if (state->config.pll_init) + state->config.pll_init(fe); + deb_info("init end\n"); return 0; } @@ -836,6 +839,7 @@ struct dvb_frontend* dib3000mc_attach(const struct dib3000_config* config, /* setup the state */ state->i2c = i2c; memcpy(&state->config,config,sizeof(struct dib3000_config)); + memcpy(&state->ops, &dib3000mc_ops, sizeof(struct dvb_frontend_ops)); /* check for the correct demod */ if (rd(DIB3000_REG_MANUFACTOR_ID) != DIB3000_I2C_ID_DIBCOM) @@ -855,7 +859,7 @@ struct dvb_frontend* dib3000mc_attach(const struct dib3000_config* config, } /* create dvb_frontend */ - memcpy(&state->frontend.ops, &dib3000mc_ops, sizeof(struct dvb_frontend_ops)); + state->frontend.ops = &state->ops; state->frontend.demodulator_priv = state; /* set the xfer operations */ @@ -872,7 +876,6 @@ error: kfree(state); return NULL; } -EXPORT_SYMBOL(dib3000mc_attach); static struct dvb_frontend_ops dib3000mc_ops = { @@ -911,3 +914,5 @@ static struct dvb_frontend_ops dib3000mc_ops = { MODULE_AUTHOR(DRIVER_AUTHOR); MODULE_DESCRIPTION(DRIVER_DESC); MODULE_LICENSE("GPL"); + +EXPORT_SYMBOL(dib3000mc_attach); diff --git a/drivers/media/dvb/frontends/dvb-pll.c b/drivers/media/dvb/frontends/dvb-pll.c index 887d6f420..e7937c63b 100644 --- a/drivers/media/dvb/frontends/dvb-pll.c +++ b/drivers/media/dvb/frontends/dvb-pll.c @@ -227,20 +227,20 @@ struct dvb_pll_desc dvb_pll_tua6034 = { EXPORT_SYMBOL(dvb_pll_tua6034); /* Infineon TUA6034 - * used in LG TDVS-H061F, LG TDVS-H062F and LG TDVS-H064F + * used in LG TDVS H061F and LG TDVS H062F */ -struct dvb_pll_desc dvb_pll_lg_tdvs_h06xf = { - .name = "LG TDVS-H06xF", +struct dvb_pll_desc dvb_pll_tdvs_tua6034 = { + .name = "LG/Infineon TUA6034", .min = 54000000, .max = 863000000, .count = 3, .entries = { - { 165000000, 44000000, 62500, 0xce, 0x01 }, - { 450000000, 44000000, 62500, 0xce, 0x02 }, + { 160000000, 44000000, 62500, 0xce, 0x01 }, + { 455000000, 44000000, 62500, 0xce, 0x02 }, { 999999999, 44000000, 62500, 0xce, 0x04 }, }, }; -EXPORT_SYMBOL(dvb_pll_lg_tdvs_h06xf); +EXPORT_SYMBOL(dvb_pll_tdvs_tua6034); /* Philips FMD1216ME * used in Medion Hybrid PCMCIA card and USB Box @@ -404,34 +404,6 @@ struct dvb_pll_desc dvb_pll_philips_td1316 = { }; EXPORT_SYMBOL(dvb_pll_philips_td1316); -/* FE6600 used on DViCO Hybrid */ -struct dvb_pll_desc dvb_pll_thomson_fe6600 = { - .name = "Thomson FE6600", - .min = 44250000, - .max = 858000000, - .count = 4, - .entries = { - { 250000000, 36213333, 166667, 0xb4, 0x12 }, - { 455000000, 36213333, 166667, 0xfe, 0x11 }, - { 775500000, 36213333, 166667, 0xbc, 0x18 }, - { 999999999, 36213333, 166667, 0xf4, 0x18 }, - } -}; -EXPORT_SYMBOL(dvb_pll_thomson_fe6600); - -struct dvb_pll_priv { - /* i2c details */ - int pll_i2c_address; - struct i2c_adapter *i2c; - - /* the PLL descriptor */ - struct dvb_pll_desc *pll_desc; - - /* cached frequency/bandwidth */ - u32 frequency; - u32 bandwidth; -}; - /* ----------------------------------------------------------- */ /* code */ @@ -456,14 +428,13 @@ int dvb_pll_configure(struct dvb_pll_desc *desc, u8 *buf, if (debug) printk("pll: %s: freq=%d bw=%d | i=%d/%d\n", desc->name, freq, bandwidth, i, desc->count); - if (i == desc->count) - return -EINVAL; + BUG_ON(i == desc->count); div = (freq + desc->entries[i].offset) / desc->entries[i].stepsize; buf[0] = div >> 8; buf[1] = div & 0xff; - buf[2] = desc->entries[i].config; - buf[3] = desc->entries[i].cb; + buf[2] = desc->entries[i].cb1; + buf[3] = desc->entries[i].cb2; if (desc->setbw) desc->setbw(buf, freq, bandwidth); @@ -476,180 +447,6 @@ int dvb_pll_configure(struct dvb_pll_desc *desc, u8 *buf, } EXPORT_SYMBOL(dvb_pll_configure); -static int dvb_pll_release(struct dvb_frontend *fe) -{ - if (fe->tuner_priv) - kfree(fe->tuner_priv); - fe->tuner_priv = NULL; - return 0; -} - -static int dvb_pll_sleep(struct dvb_frontend *fe) -{ - struct dvb_pll_priv *priv = fe->tuner_priv; - u8 buf[4]; - struct i2c_msg msg = - { .addr = priv->pll_i2c_address, .flags = 0, .buf = buf, .len = sizeof(buf) }; - int i; - int result; - - if (priv->i2c == NULL) - return -EINVAL; - - for (i = 0; i < priv->pll_desc->count; i++) { - if (priv->pll_desc->entries[i].limit == 0) - break; - } - if (i == priv->pll_desc->count) - return 0; - - buf[0] = 0; - buf[1] = 0; - buf[2] = priv->pll_desc->entries[i].config; - buf[3] = priv->pll_desc->entries[i].cb; - - if (fe->ops.i2c_gate_ctrl) - fe->ops.i2c_gate_ctrl(fe, 1); - if ((result = i2c_transfer(priv->i2c, &msg, 1)) != 1) { - return result; - } - - return 0; -} - -static int dvb_pll_set_params(struct dvb_frontend *fe, struct dvb_frontend_parameters *params) -{ - struct dvb_pll_priv *priv = fe->tuner_priv; - u8 buf[4]; - struct i2c_msg msg = - { .addr = priv->pll_i2c_address, .flags = 0, .buf = buf, .len = sizeof(buf) }; - int result; - u32 div; - int i; - u32 bandwidth = 0; - - if (priv->i2c == NULL) - return -EINVAL; - - // DVBT bandwidth only just now - if (fe->ops.info.type == FE_OFDM) { - bandwidth = params->u.ofdm.bandwidth; - } - - if ((result = dvb_pll_configure(priv->pll_desc, buf, params->frequency, bandwidth)) != 0) - return result; - - if (fe->ops.i2c_gate_ctrl) - fe->ops.i2c_gate_ctrl(fe, 1); - if ((result = i2c_transfer(priv->i2c, &msg, 1)) != 1) { - return result; - } - - // calculate the frequency we set it to - for (i = 0; i < priv->pll_desc->count; i++) { - if (params->frequency > priv->pll_desc->entries[i].limit) - continue; - break; - } - div = (params->frequency + priv->pll_desc->entries[i].offset) / priv->pll_desc->entries[i].stepsize; - priv->frequency = (div * priv->pll_desc->entries[i].stepsize) - priv->pll_desc->entries[i].offset; - priv->bandwidth = bandwidth; - - return 0; -} - -static int dvb_pll_calc_regs(struct dvb_frontend *fe, struct dvb_frontend_parameters *params, u8 *buf, int buf_len) -{ - struct dvb_pll_priv *priv = fe->tuner_priv; - int result; - u32 div; - int i; - u32 bandwidth = 0; - - if (buf_len < 5) - return -EINVAL; - - // DVBT bandwidth only just now - if (fe->ops.info.type == FE_OFDM) { - bandwidth = params->u.ofdm.bandwidth; - } - - if ((result = dvb_pll_configure(priv->pll_desc, buf+1, params->frequency, bandwidth)) != 0) - return result; - buf[0] = priv->pll_i2c_address; - - // calculate the frequency we set it to - for (i = 0; i < priv->pll_desc->count; i++) { - if (params->frequency > priv->pll_desc->entries[i].limit) - continue; - break; - } - div = (params->frequency + priv->pll_desc->entries[i].offset) / priv->pll_desc->entries[i].stepsize; - priv->frequency = (div * priv->pll_desc->entries[i].stepsize) - priv->pll_desc->entries[i].offset; - priv->bandwidth = bandwidth; - - return 5; -} - -static int dvb_pll_get_frequency(struct dvb_frontend *fe, u32 *frequency) -{ - struct dvb_pll_priv *priv = fe->tuner_priv; - *frequency = priv->frequency; - return 0; -} - -static int dvb_pll_get_bandwidth(struct dvb_frontend *fe, u32 *bandwidth) -{ - struct dvb_pll_priv *priv = fe->tuner_priv; - *bandwidth = priv->bandwidth; - return 0; -} - -static struct dvb_tuner_ops dvb_pll_tuner_ops = { - .release = dvb_pll_release, - .sleep = dvb_pll_sleep, - .set_params = dvb_pll_set_params, - .calc_regs = dvb_pll_calc_regs, - .get_frequency = dvb_pll_get_frequency, - .get_bandwidth = dvb_pll_get_bandwidth, -}; - -int dvb_pll_attach(struct dvb_frontend *fe, int pll_addr, struct i2c_adapter *i2c, struct dvb_pll_desc *desc) -{ - u8 b1 [] = { 0 }; - struct i2c_msg msg = { .addr = pll_addr, .flags = I2C_M_RD, .buf = b1, .len = 1 }; - struct dvb_pll_priv *priv = NULL; - int ret; - - if (i2c != NULL) { - if (fe->ops.i2c_gate_ctrl) - fe->ops.i2c_gate_ctrl(fe, 1); - - ret = i2c_transfer (i2c, &msg, 1); - if (ret != 1) - return -1; - if (fe->ops.i2c_gate_ctrl) - fe->ops.i2c_gate_ctrl(fe, 0); - } - - priv = kzalloc(sizeof(struct dvb_pll_priv), GFP_KERNEL); - if (priv == NULL) - return -ENOMEM; - - priv->pll_i2c_address = pll_addr; - priv->i2c = i2c; - priv->pll_desc = desc; - - memcpy(&fe->ops.tuner_ops, &dvb_pll_tuner_ops, sizeof(struct dvb_tuner_ops)); - strncpy(fe->ops.tuner_ops.info.name, desc->name, 128); - fe->ops.tuner_ops.info.frequency_min = desc->min; - fe->ops.tuner_ops.info.frequency_min = desc->max; - - fe->tuner_priv = priv; - return 0; -} -EXPORT_SYMBOL(dvb_pll_attach); - MODULE_DESCRIPTION("dvb pll library"); MODULE_AUTHOR("Gerd Knorr"); MODULE_LICENSE("GPL"); diff --git a/drivers/media/dvb/frontends/dvb-pll.h b/drivers/media/dvb/frontends/dvb-pll.h index 66361cd18..b22966e5f 100644 --- a/drivers/media/dvb/frontends/dvb-pll.h +++ b/drivers/media/dvb/frontends/dvb-pll.h @@ -5,9 +5,6 @@ #ifndef __DVB_PLL_H__ #define __DVB_PLL_H__ -#include -#include "dvb_frontend.h" - struct dvb_pll_desc { char *name; u32 min; @@ -18,8 +15,8 @@ struct dvb_pll_desc { u32 limit; u32 offset; u32 stepsize; - u8 config; - u8 cb; + u8 cb1; + u8 cb2; } entries[12]; }; @@ -34,7 +31,7 @@ extern struct dvb_pll_desc dvb_pll_unknown_1; extern struct dvb_pll_desc dvb_pll_tua6010xs; extern struct dvb_pll_desc dvb_pll_env57h1xd5; extern struct dvb_pll_desc dvb_pll_tua6034; -extern struct dvb_pll_desc dvb_pll_lg_tdvs_h06xf; +extern struct dvb_pll_desc dvb_pll_tdvs_tua6034; extern struct dvb_pll_desc dvb_pll_tda665x; extern struct dvb_pll_desc dvb_pll_fmd1216me; extern struct dvb_pll_desc dvb_pll_tded4; @@ -45,20 +42,7 @@ extern struct dvb_pll_desc dvb_pll_samsung_tbmv; extern struct dvb_pll_desc dvb_pll_philips_sd1878_tda8261; extern struct dvb_pll_desc dvb_pll_philips_td1316; -extern struct dvb_pll_desc dvb_pll_thomson_fe6600; - -extern int dvb_pll_configure(struct dvb_pll_desc *desc, u8 *buf, +int dvb_pll_configure(struct dvb_pll_desc *desc, u8 *buf, u32 freq, int bandwidth); -/** - * Attach a dvb-pll to the supplied frontend structure. - * - * @param fe Frontend to attach to. - * @param pll_addr i2c address of the PLL (if used). - * @param i2c i2c adapter to use (set to NULL if not used). - * @param desc dvb_pll_desc to use. - * @return 0 on success, nonzero on failure. - */ -extern int dvb_pll_attach(struct dvb_frontend *fe, int pll_addr, struct i2c_adapter *i2c, struct dvb_pll_desc *desc); - #endif diff --git a/drivers/media/dvb/frontends/dvb_dummy_fe.c b/drivers/media/dvb/frontends/dvb_dummy_fe.c index 6271b1e7f..645946a99 100644 --- a/drivers/media/dvb/frontends/dvb_dummy_fe.c +++ b/drivers/media/dvb/frontends/dvb_dummy_fe.c @@ -30,6 +30,7 @@ struct dvb_dummy_fe_state { + struct dvb_frontend_ops ops; struct dvb_frontend frontend; }; @@ -76,11 +77,6 @@ static int dvb_dummy_fe_get_frontend(struct dvb_frontend* fe, struct dvb_fronten static int dvb_dummy_fe_set_frontend(struct dvb_frontend* fe, struct dvb_frontend_parameters *p) { - if (fe->ops->tuner_ops->set_params) { - fe->ops->tuner_ops->set_params(fe, p); - if (fe->ops->i2c_gate_ctrl) fe->ops->i2c_gate_ctrl(fe, 0); - } - return 0; } @@ -120,8 +116,11 @@ struct dvb_frontend* dvb_dummy_fe_ofdm_attach(void) state = kmalloc(sizeof(struct dvb_dummy_fe_state), GFP_KERNEL); if (state == NULL) goto error; + /* setup the state */ + memcpy(&state->ops, &dvb_dummy_fe_ofdm_ops, sizeof(struct dvb_frontend_ops)); + /* create dvb_frontend */ - memcpy(&state->frontend.ops, &dvb_dummy_fe_ofdm_ops, sizeof(struct dvb_frontend_ops)); + state->frontend.ops = &state->ops; state->frontend.demodulator_priv = state; return &state->frontend; @@ -140,8 +139,11 @@ struct dvb_frontend* dvb_dummy_fe_qpsk_attach() state = kmalloc(sizeof(struct dvb_dummy_fe_state), GFP_KERNEL); if (state == NULL) goto error; + /* setup the state */ + memcpy(&state->ops, &dvb_dummy_fe_qpsk_ops, sizeof(struct dvb_frontend_ops)); + /* create dvb_frontend */ - memcpy(&state->frontend.ops, &dvb_dummy_fe_qpsk_ops, sizeof(struct dvb_frontend_ops)); + state->frontend.ops = &state->ops; state->frontend.demodulator_priv = state; return &state->frontend; @@ -160,8 +162,11 @@ struct dvb_frontend* dvb_dummy_fe_qam_attach() state = kmalloc(sizeof(struct dvb_dummy_fe_state), GFP_KERNEL); if (state == NULL) goto error; + /* setup the state */ + memcpy(&state->ops, &dvb_dummy_fe_qam_ops, sizeof(struct dvb_frontend_ops)); + /* create dvb_frontend */ - memcpy(&state->frontend.ops, &dvb_dummy_fe_qam_ops, sizeof(struct dvb_frontend_ops)); + state->frontend.ops = &state->ops; state->frontend.demodulator_priv = state; return &state->frontend; diff --git a/drivers/media/dvb/frontends/l64781.c b/drivers/media/dvb/frontends/l64781.c index f3bc82e44..1c7c91224 100644 --- a/drivers/media/dvb/frontends/l64781.c +++ b/drivers/media/dvb/frontends/l64781.c @@ -32,6 +32,7 @@ struct l64781_state { struct i2c_adapter* i2c; + struct dvb_frontend_ops ops; const struct l64781_config* config; struct dvb_frontend frontend; @@ -140,10 +141,7 @@ static int apply_frontend_param (struct dvb_frontend* fe, struct dvb_frontend_pa u8 val0x06; int bw = p->bandwidth - BANDWIDTH_8_MHZ; - if (fe->ops.tuner_ops.set_params) { - fe->ops.tuner_ops.set_params(fe, param); - if (fe->ops.i2c_gate_ctrl) fe->ops.i2c_gate_ctrl(fe, 0); - } + state->config->pll_set(fe, param); if (param->inversion != INVERSION_ON && param->inversion != INVERSION_OFF) @@ -465,6 +463,8 @@ static int l64781_init(struct dvb_frontend* fe) /* Everything is two's complement, soft bit and CSI_OUT too */ l64781_writereg (state, 0x1e, 0x09); + if (state->config->pll_init) state->config->pll_init(fe); + /* delay a bit after first init attempt */ if (state->first) { state->first = 0; @@ -508,6 +508,7 @@ struct dvb_frontend* l64781_attach(const struct l64781_config* config, /* setup the state */ state->config = config; state->i2c = i2c; + memcpy(&state->ops, &l64781_ops, sizeof(struct dvb_frontend_ops)); state->first = 1; /** @@ -553,7 +554,7 @@ struct dvb_frontend* l64781_attach(const struct l64781_config* config, } /* create dvb_frontend */ - memcpy(&state->frontend.ops, &l64781_ops, sizeof(struct dvb_frontend_ops)); + state->frontend.ops = &state->ops; state->frontend.demodulator_priv = state; return &state->frontend; diff --git a/drivers/media/dvb/frontends/l64781.h b/drivers/media/dvb/frontends/l64781.h index 83b8bc210..947f65f87 100644 --- a/drivers/media/dvb/frontends/l64781.h +++ b/drivers/media/dvb/frontends/l64781.h @@ -29,6 +29,10 @@ struct l64781_config { /* the demodulator's i2c address */ u8 demod_address; + + /* PLL maintenance */ + int (*pll_init)(struct dvb_frontend* fe); + int (*pll_set)(struct dvb_frontend* fe, struct dvb_frontend_parameters* params); }; diff --git a/drivers/media/dvb/frontends/lgdt330x.c b/drivers/media/dvb/frontends/lgdt330x.c index 467f1994f..8de081bf6 100644 --- a/drivers/media/dvb/frontends/lgdt330x.c +++ b/drivers/media/dvb/frontends/lgdt330x.c @@ -29,7 +29,6 @@ * DViCO FusionHDTV 5 Lite * DViCO FusionHDTV 5 USB Gold * Air2PC/AirStar 2 ATSC 3rd generation (HD5000) - * pcHDTV HD5500 * * TODO: * signal strength always returns 0. @@ -60,6 +59,7 @@ if (debug) printk(KERN_DEBUG "lgdt330x: " args); \ struct lgdt330x_state { struct i2c_adapter* i2c; + struct dvb_frontend_ops ops; /* Configuration settings */ const struct lgdt330x_config* config; @@ -216,7 +216,7 @@ static int lgdt330x_init(struct dvb_frontend* fe) AGC_DELAY0, 0x07, AGC_DELAY2, 0xfe, /* Change the value of IAGCBW[15:8] - of inner AGC loop filter bandwidth */ + of inner AGC loop filter bandwith */ AGC_LOOP_BANDWIDTH0, 0x08, AGC_LOOP_BANDWIDTH1, 0x9a }; @@ -399,10 +399,8 @@ static int lgdt330x_set_parameters(struct dvb_frontend* fe, } /* Tune to the specified frequency */ - if (fe->ops.tuner_ops.set_params) { - fe->ops.tuner_ops.set_params(fe, param); - if (fe->ops.i2c_gate_ctrl) fe->ops.i2c_gate_ctrl(fe, 0); - } + if (state->config->pll_set) + state->config->pll_set(fe, param); /* Keep track of the new frequency */ /* FIXME this is the wrong way to do this... */ @@ -668,7 +666,6 @@ static int lgdt3303_read_snr(struct dvb_frontend* fe, u16* snr) if (state->current_modulation == VSB_8) { - i2c_read_demod_bytes(state, 0x6e, buf, 5); /* Phase Tracker Mean-Square Error Register for VSB */ noise = ((buf[0] & 7) << 16) | (buf[3] << 8) | buf[4]; } else { @@ -718,19 +715,16 @@ struct dvb_frontend* lgdt330x_attach(const struct lgdt330x_config* config, /* Setup the state */ state->config = config; state->i2c = i2c; - - /* Create dvb_frontend */ switch (config->demod_chip) { case LGDT3302: - memcpy(&state->frontend.ops, &lgdt3302_ops, sizeof(struct dvb_frontend_ops)); + memcpy(&state->ops, &lgdt3302_ops, sizeof(struct dvb_frontend_ops)); break; case LGDT3303: - memcpy(&state->frontend.ops, &lgdt3303_ops, sizeof(struct dvb_frontend_ops)); + memcpy(&state->ops, &lgdt3303_ops, sizeof(struct dvb_frontend_ops)); break; default: goto error; } - state->frontend.demodulator_priv = state; /* Verify communication with demod chip */ if (i2c_read_demod_bytes(state, 2, buf, 1)) @@ -739,6 +733,9 @@ struct dvb_frontend* lgdt330x_attach(const struct lgdt330x_config* config, state->current_frequency = -1; state->current_modulation = -1; + /* Create dvb_frontend */ + state->frontend.ops = &state->ops; + state->frontend.demodulator_priv = state; return &state->frontend; error: diff --git a/drivers/media/dvb/frontends/lgdt330x.h b/drivers/media/dvb/frontends/lgdt330x.h index bad903c6f..2a6529ccc 100644 --- a/drivers/media/dvb/frontends/lgdt330x.h +++ b/drivers/media/dvb/frontends/lgdt330x.h @@ -43,6 +43,7 @@ struct lgdt330x_config /* PLL interface */ int (*pll_rf_set) (struct dvb_frontend* fe, int index); + int (*pll_set)(struct dvb_frontend* fe, struct dvb_frontend_parameters* params); /* Need to set device param for start_dma */ int (*set_ts_params)(struct dvb_frontend* fe, int is_punctured); diff --git a/drivers/media/dvb/frontends/mt312.c b/drivers/media/dvb/frontends/mt312.c index 1ef821825..d3aea83cf 100644 --- a/drivers/media/dvb/frontends/mt312.c +++ b/drivers/media/dvb/frontends/mt312.c @@ -39,6 +39,7 @@ struct mt312_state { struct i2c_adapter* i2c; + struct dvb_frontend_ops ops; /* configuration settings */ const struct mt312_config* config; struct dvb_frontend frontend; @@ -276,6 +277,12 @@ static int mt312_initfe(struct dvb_frontend* fe) if ((ret = mt312_writereg(state, CS_SW_LIM, 0x69)) < 0) return ret; + if (state->config->pll_init) { + mt312_writereg(state, GPP_CTRL, 0x40); + state->config->pll_init(fe); + mt312_writereg(state, GPP_CTRL, 0x00); + } + return 0; } @@ -470,16 +477,16 @@ static int mt312_set_frontend(struct dvb_frontend* fe, dprintk("%s: Freq %d\n", __FUNCTION__, p->frequency); - if ((p->frequency < fe->ops.info.frequency_min) - || (p->frequency > fe->ops.info.frequency_max)) + if ((p->frequency < fe->ops->info.frequency_min) + || (p->frequency > fe->ops->info.frequency_max)) return -EINVAL; if ((p->inversion < INVERSION_OFF) || (p->inversion > INVERSION_ON)) return -EINVAL; - if ((p->u.qpsk.symbol_rate < fe->ops.info.symbol_rate_min) - || (p->u.qpsk.symbol_rate > fe->ops.info.symbol_rate_max)) + if ((p->u.qpsk.symbol_rate < fe->ops->info.symbol_rate_min) + || (p->u.qpsk.symbol_rate > fe->ops->info.symbol_rate_max)) return -EINVAL; if ((p->u.qpsk.fec_inner < FEC_NONE) @@ -522,10 +529,9 @@ static int mt312_set_frontend(struct dvb_frontend* fe, return -EINVAL; } - if (fe->ops.tuner_ops.set_params) { - fe->ops.tuner_ops.set_params(fe, p); - if (fe->ops.i2c_gate_ctrl) fe->ops.i2c_gate_ctrl(fe, 0); - } + mt312_writereg(state, GPP_CTRL, 0x40); + state->config->pll_set(fe, p); + mt312_writereg(state, GPP_CTRL, 0x00); /* sr = (u16)(sr * 256.0 / 1000000.0) */ sr = mt312_div(p->u.qpsk.symbol_rate * 4, 15625); @@ -572,17 +578,6 @@ static int mt312_get_frontend(struct dvb_frontend* fe, return 0; } -static int mt312_i2c_gate_ctrl(struct dvb_frontend* fe, int enable) -{ - struct mt312_state* state = fe->demodulator_priv; - - if (enable) { - return mt312_writereg(state, GPP_CTRL, 0x40); - } else { - return mt312_writereg(state, GPP_CTRL, 0x00); - } -} - static int mt312_sleep(struct dvb_frontend* fe) { struct mt312_state *state = fe->demodulator_priv; @@ -638,7 +633,6 @@ static struct dvb_frontend_ops vp310_mt312_ops = { .init = mt312_initfe, .sleep = mt312_sleep, - .i2c_gate_ctrl = mt312_i2c_gate_ctrl, .set_frontend = mt312_set_frontend, .get_frontend = mt312_get_frontend, @@ -669,22 +663,19 @@ struct dvb_frontend* vp310_mt312_attach(const struct mt312_config* config, /* setup the state */ state->config = config; state->i2c = i2c; + memcpy(&state->ops, &vp310_mt312_ops, sizeof(struct dvb_frontend_ops)); /* check if the demod is there */ if (mt312_readreg(state, ID, &state->id) < 0) goto error; - /* create dvb_frontend */ - memcpy(&state->frontend.ops, &vp310_mt312_ops, sizeof(struct dvb_frontend_ops)); - state->frontend.demodulator_priv = state; - switch (state->id) { case ID_VP310: - strcpy(state->frontend.ops.info.name, "Zarlink VP310 DVB-S"); + strcpy(state->ops.info.name, "Zarlink VP310 DVB-S"); state->frequency = 90; break; case ID_MT312: - strcpy(state->frontend.ops.info.name, "Zarlink MT312 DVB-S"); + strcpy(state->ops.info.name, "Zarlink MT312 DVB-S"); state->frequency = 60; break; default: @@ -692,6 +683,9 @@ struct dvb_frontend* vp310_mt312_attach(const struct mt312_config* config, goto error; } + /* create dvb_frontend */ + state->frontend.ops = &state->ops; + state->frontend.demodulator_priv = state; return &state->frontend; error: diff --git a/drivers/media/dvb/frontends/mt312.h b/drivers/media/dvb/frontends/mt312.h index 666a1bd1c..074d844f0 100644 --- a/drivers/media/dvb/frontends/mt312.h +++ b/drivers/media/dvb/frontends/mt312.h @@ -32,6 +32,10 @@ struct mt312_config { /* the demodulator's i2c address */ u8 demod_address; + + /* PLL maintenance */ + int (*pll_init)(struct dvb_frontend* fe); + int (*pll_set)(struct dvb_frontend* fe, struct dvb_frontend_parameters* params); }; struct dvb_frontend* vp310_mt312_attach(const struct mt312_config* config, diff --git a/drivers/media/dvb/frontends/mt352.c b/drivers/media/dvb/frontends/mt352.c index 5de7376c9..aaaec909d 100644 --- a/drivers/media/dvb/frontends/mt352.c +++ b/drivers/media/dvb/frontends/mt352.c @@ -45,6 +45,7 @@ struct mt352_state { struct i2c_adapter* i2c; struct dvb_frontend frontend; + struct dvb_frontend_ops ops; /* configuration settings */ struct mt352_config config; @@ -285,25 +286,16 @@ static int mt352_set_parameters(struct dvb_frontend* fe, mt352_calc_nominal_rate(state, op->bandwidth, buf+4); mt352_calc_input_freq(state, buf+6); + state->config.pll_set(fe, param, buf+8); + mt352_write(fe, buf, sizeof(buf)); if (state->config.no_tuner) { - if (fe->ops.tuner_ops.set_params) { - fe->ops.tuner_ops.set_params(fe, param); - if (fe->ops.i2c_gate_ctrl) - fe->ops.i2c_gate_ctrl(fe, 0); - } - - mt352_write(fe, buf, 8); + /* start decoding */ mt352_write(fe, fsm_go, 2); } else { - if (fe->ops.tuner_ops.calc_regs) { - fe->ops.tuner_ops.calc_regs(fe, param, buf+8, 5); - buf[8] <<= 1; - mt352_write(fe, buf, sizeof(buf)); - mt352_write(fe, tuner_go, 2); - } + /* start tuning */ + mt352_write(fe, tuner_go, 2); } - return 0; } @@ -549,12 +541,13 @@ struct dvb_frontend* mt352_attach(const struct mt352_config* config, /* setup the state */ state->i2c = i2c; memcpy(&state->config,config,sizeof(struct mt352_config)); + memcpy(&state->ops, &mt352_ops, sizeof(struct dvb_frontend_ops)); /* check if the demod is there */ if (mt352_read_register(state, CHIP_ID) != ID_MT352) goto error; /* create dvb_frontend */ - memcpy(&state->frontend.ops, &mt352_ops, sizeof(struct dvb_frontend_ops)); + state->frontend.ops = &state->ops; state->frontend.demodulator_priv = state; return &state->frontend; diff --git a/drivers/media/dvb/frontends/mt352.h b/drivers/media/dvb/frontends/mt352.h index 9e7ff4b8f..03040cd59 100644 --- a/drivers/media/dvb/frontends/mt352.h +++ b/drivers/media/dvb/frontends/mt352.h @@ -49,6 +49,12 @@ struct mt352_config /* Initialise the demodulator and PLL. Cannot be NULL */ int (*demod_init)(struct dvb_frontend* fe); + + /* PLL setup - fill out the supplied 5 byte buffer with your PLL settings. + * byte0: Set to pll i2c address (nonlinux; left shifted by 1) + * byte1-4: PLL configuration. + */ + int (*pll_set)(struct dvb_frontend* fe, struct dvb_frontend_parameters* params, u8* pllbuf); }; extern struct dvb_frontend* mt352_attach(const struct mt352_config* config, diff --git a/drivers/media/dvb/frontends/nxt200x.c b/drivers/media/dvb/frontends/nxt200x.c index 87c286ee6..9e3535394 100644 --- a/drivers/media/dvb/frontends/nxt200x.c +++ b/drivers/media/dvb/frontends/nxt200x.c @@ -55,6 +55,7 @@ struct nxt200x_state { struct i2c_adapter* i2c; + struct dvb_frontend_ops ops; const struct nxt200x_config* config; struct dvb_frontend frontend; @@ -332,17 +333,17 @@ static int nxt200x_writetuner (struct nxt200x_state* state, u8* data) dprintk("%s\n", __FUNCTION__); - dprintk("Tuner Bytes: %02X %02X %02X %02X\n", data[1], data[2], data[3], data[4]); + dprintk("Tuner Bytes: %02X %02X %02X %02X\n", data[0], data[1], data[2], data[3]); /* if NXT2004, write directly to tuner. if NXT2002, write through NXT chip. * direct write is required for Philips TUV1236D and ALPS TDHU2 */ switch (state->demod_chip) { case NXT2004: - if (i2c_writebytes(state, data[0], data+1, 4)) + if (i2c_writebytes(state, state->config->pll_address, data, 4)) printk(KERN_WARNING "nxt200x: error writing to tuner\n"); /* wait until we have a lock */ while (count < 20) { - i2c_readbytes(state, data[0], &buf, 1); + i2c_readbytes(state, state->config->pll_address, &buf, 1); if (buf & 0x40) return 0; msleep(100); @@ -360,10 +361,10 @@ static int nxt200x_writetuner (struct nxt200x_state* state, u8* data) nxt200x_writebytes(state, 0x34, &buf, 1); /* write actual tuner bytes */ - nxt200x_writebytes(state, 0x36, data+1, 4); + nxt200x_writebytes(state, 0x36, data, 4); /* set tuner i2c address */ - buf = data[0] << 1; + buf = state->config->pll_address; nxt200x_writebytes(state, 0x35, &buf, 1); /* write UC Opmode to begin transfer */ @@ -533,7 +534,7 @@ static int nxt200x_setup_frontend_parameters (struct dvb_frontend* fe, struct dvb_frontend_parameters *p) { struct nxt200x_state* state = fe->demodulator_priv; - u8 buf[5]; + u8 buf[4]; /* stop the micro first */ nxt200x_microcontroller_stop(state); @@ -547,9 +548,7 @@ static int nxt200x_setup_frontend_parameters (struct dvb_frontend* fe, } /* get tuning information */ - if (fe->ops.tuner_ops.calc_regs) { - fe->ops.tuner_ops.calc_regs(fe, p, buf, 5); - } + dvb_pll_configure(state->config->pll_desc, buf, p->frequency, 0); /* set additional params */ switch (p->u.vsb.modulation) { @@ -896,9 +895,9 @@ static int nxt2002_init(struct dvb_frontend* fe) } ret = nxt2002_load_firmware(fe, fw); - release_firmware(fw); if (ret) { printk("nxt2002: Writing firmware to device failed\n"); + release_firmware(fw); return ret; } printk("nxt2002: Firmware upload complete\n"); @@ -960,9 +959,9 @@ static int nxt2004_init(struct dvb_frontend* fe) } ret = nxt2004_load_firmware(fe, fw); - release_firmware(fw); if (ret) { printk("nxt2004: Writing firmware to device failed\n"); + release_firmware(fw); return ret; } printk("nxt2004: Firmware upload complete\n"); @@ -1160,6 +1159,7 @@ struct dvb_frontend* nxt200x_attach(const struct nxt200x_config* config, /* setup the state */ state->config = config; state->i2c = i2c; + memcpy(&state->ops, &nxt200x_ops, sizeof(struct dvb_frontend_ops)); state->initialised = 0; /* read card id */ @@ -1198,7 +1198,7 @@ struct dvb_frontend* nxt200x_attach(const struct nxt200x_config* config, } /* create dvb_frontend */ - memcpy(&state->frontend.ops, &nxt200x_ops, sizeof(struct dvb_frontend_ops)); + state->frontend.ops = &state->ops; state->frontend.demodulator_priv = state; return &state->frontend; diff --git a/drivers/media/dvb/frontends/nxt200x.h b/drivers/media/dvb/frontends/nxt200x.h index 34d617358..1d9d70bc3 100644 --- a/drivers/media/dvb/frontends/nxt200x.h +++ b/drivers/media/dvb/frontends/nxt200x.h @@ -38,6 +38,10 @@ struct nxt200x_config /* the demodulator's i2c address */ u8 demod_address; + /* tuner information */ + u8 pll_address; + struct dvb_pll_desc *pll_desc; + /* used to set pll input */ int (*set_pll_input)(u8* buf, int input); diff --git a/drivers/media/dvb/frontends/nxt6000.c b/drivers/media/dvb/frontends/nxt6000.c index d313d7dcf..a16eeba00 100644 --- a/drivers/media/dvb/frontends/nxt6000.c +++ b/drivers/media/dvb/frontends/nxt6000.c @@ -33,6 +33,7 @@ struct nxt6000_state { struct i2c_adapter* i2c; + struct dvb_frontend_ops ops; /* configuration settings */ const struct nxt6000_config* config; struct dvb_frontend frontend; @@ -206,6 +207,12 @@ static void nxt6000_setup(struct dvb_frontend* fe) nxt6000_writereg(state, SUB_DIAG_MODE_SEL, 0); nxt6000_writereg(state, TS_FORMAT, 0); + + if (state->config->pll_init) { + nxt6000_writereg(state, ENABLE_TUNER_IIC, 0x01); /* open i2c bus switch */ + state->config->pll_init(fe); + nxt6000_writereg(state, ENABLE_TUNER_IIC, 0x00); /* close i2c bus switch */ + } } static void nxt6000_dump_status(struct nxt6000_state *state) @@ -462,10 +469,9 @@ static int nxt6000_set_frontend(struct dvb_frontend* fe, struct dvb_frontend_par struct nxt6000_state* state = fe->demodulator_priv; int result; - if (fe->ops.tuner_ops.set_params) { - fe->ops.tuner_ops.set_params(fe, param); - if (fe->ops.i2c_gate_ctrl) fe->ops.i2c_gate_ctrl(fe, 0); - } + nxt6000_writereg(state, ENABLE_TUNER_IIC, 0x01); /* open i2c bus switch */ + state->config->pll_set(fe, param); + nxt6000_writereg(state, ENABLE_TUNER_IIC, 0x00); /* close i2c bus switch */ if ((result = nxt6000_set_bandwidth(state, param->u.ofdm.bandwidth)) < 0) return result; @@ -526,17 +532,6 @@ static int nxt6000_fe_get_tune_settings(struct dvb_frontend* fe, struct dvb_fron return 0; } -static int nxt6000_i2c_gate_ctrl(struct dvb_frontend* fe, int enable) -{ - struct nxt6000_state* state = fe->demodulator_priv; - - if (enable) { - return nxt6000_writereg(state, ENABLE_TUNER_IIC, 0x01); - } else { - return nxt6000_writereg(state, ENABLE_TUNER_IIC, 0x00); - } -} - static struct dvb_frontend_ops nxt6000_ops; struct dvb_frontend* nxt6000_attach(const struct nxt6000_config* config, @@ -551,12 +546,13 @@ struct dvb_frontend* nxt6000_attach(const struct nxt6000_config* config, /* setup the state */ state->config = config; state->i2c = i2c; + memcpy(&state->ops, &nxt6000_ops, sizeof(struct dvb_frontend_ops)); /* check if the demod is there */ if (nxt6000_readreg(state, OFDM_MSC_REV) != NXT6000ASICDEVICE) goto error; /* create dvb_frontend */ - memcpy(&state->frontend.ops, &nxt6000_ops, sizeof(struct dvb_frontend_ops)); + state->frontend.ops = &state->ops; state->frontend.demodulator_priv = state; return &state->frontend; @@ -588,7 +584,6 @@ static struct dvb_frontend_ops nxt6000_ops = { .release = nxt6000_release, .init = nxt6000_init, - .i2c_gate_ctrl = nxt6000_i2c_gate_ctrl, .get_tune_settings = nxt6000_fe_get_tune_settings, diff --git a/drivers/media/dvb/frontends/nxt6000.h b/drivers/media/dvb/frontends/nxt6000.h index 117031d11..b7d9bead3 100644 --- a/drivers/media/dvb/frontends/nxt6000.h +++ b/drivers/media/dvb/frontends/nxt6000.h @@ -31,6 +31,10 @@ struct nxt6000_config /* should clock inversion be used? */ u8 clock_inversion:1; + + /* PLL maintenance */ + int (*pll_init)(struct dvb_frontend* fe); + int (*pll_set)(struct dvb_frontend* fe, struct dvb_frontend_parameters* params); }; extern struct dvb_frontend* nxt6000_attach(const struct nxt6000_config* config, diff --git a/drivers/media/dvb/frontends/or51132.c b/drivers/media/dvb/frontends/or51132.c index d20ab30c1..80e0f2812 100644 --- a/drivers/media/dvb/frontends/or51132.c +++ b/drivers/media/dvb/frontends/or51132.c @@ -54,6 +54,7 @@ static int debug; struct or51132_state { struct i2c_adapter* i2c; + struct dvb_frontend_ops ops; /* Configuration settings */ const struct or51132_config* config; @@ -105,8 +106,9 @@ static int or51132_load_firmware (struct dvb_frontend* fe, const struct firmware { struct or51132_state* state = fe->demodulator_priv; static u8 run_buf[] = {0x7F,0x01}; - u8 rec_buf[8]; - u8 cmd_buf[3]; + static u8 get_ver_buf[] = {0x04,0x00,0x30,0x00,0x00}; + u8 rec_buf[14]; + u8 cmd_buf[14]; u32 firmwareAsize, firmwareBsize; int i,ret; @@ -155,6 +157,7 @@ static int or51132_load_firmware (struct dvb_frontend* fe, const struct firmware cmd_buf[0] = 0x10; cmd_buf[1] = 0x10; cmd_buf[2] = 0x00; + cmd_buf[3] = 0x00; msleep(20); /* 20ms */ if ((ret = i2c_writebytes(state,state->config->demod_address, cmd_buf,3))) { @@ -164,6 +167,8 @@ static int or51132_load_firmware (struct dvb_frontend* fe, const struct firmware cmd_buf[0] = 0x04; cmd_buf[1] = 0x17; + cmd_buf[2] = 0x00; + cmd_buf[3] = 0x00; msleep(20); /* 20ms */ if ((ret = i2c_writebytes(state,state->config->demod_address, cmd_buf,2))) { @@ -173,6 +178,8 @@ static int or51132_load_firmware (struct dvb_frontend* fe, const struct firmware cmd_buf[0] = 0x00; cmd_buf[1] = 0x00; + cmd_buf[2] = 0x00; + cmd_buf[3] = 0x00; msleep(20); /* 20ms */ if ((ret = i2c_writebytes(state,state->config->demod_address, cmd_buf,2))) { @@ -182,11 +189,7 @@ static int or51132_load_firmware (struct dvb_frontend* fe, const struct firmware for(i=0;i<4;i++) { msleep(20); /* 20ms */ - /* Once upon a time, this command might have had something - to do with getting the firmware version, but it's - not used anymore: - {0x04,0x00,0x30,0x00,i+1} */ - /* Read 8 bytes, two bytes at a time */ + get_ver_buf[4] = i+1; if ((ret = i2c_readbytes(state,state->config->demod_address, &rec_buf[i*2],2))) { printk(KERN_WARNING @@ -205,6 +208,7 @@ static int or51132_load_firmware (struct dvb_frontend* fe, const struct firmware cmd_buf[0] = 0x10; cmd_buf[1] = 0x00; cmd_buf[2] = 0x00; + cmd_buf[3] = 0x00; msleep(20); /* 20ms */ if ((ret = i2c_writebytes(state,state->config->demod_address, cmd_buf,3))) { @@ -239,7 +243,7 @@ static int or51132_sleep(struct dvb_frontend* fe) static int or51132_setmode(struct dvb_frontend* fe) { struct or51132_state* state = fe->demodulator_priv; - unsigned char cmd_buf[3]; + unsigned char cmd_buf[4]; dprintk("setmode %d\n",(int)state->current_modulation); /* set operation mode in Receiver 1 register; */ @@ -259,6 +263,7 @@ static int or51132_setmode(struct dvb_frontend* fe) default: printk("setmode:Modulation set to unsupported value\n"); }; + cmd_buf[3] = 0x00; if (i2c_writebytes(state,state->config->demod_address, cmd_buf,3)) { printk(KERN_WARNING "or51132: set_mode error 1\n"); @@ -296,6 +301,7 @@ static int or51132_setmode(struct dvb_frontend* fe) default: printk("setmode: Modulation set to unsupported value\n"); }; + cmd_buf[3] = 0x00; msleep(20); /* 20ms */ if (i2c_writebytes(state,state->config->demod_address, cmd_buf,3)) { @@ -307,65 +313,52 @@ static int or51132_setmode(struct dvb_frontend* fe) return 0; } -/* Some modulations use the same firmware. This classifies modulations - by the firmware they use. */ -#define MOD_FWCLASS_UNKNOWN 0 -#define MOD_FWCLASS_VSB 1 -#define MOD_FWCLASS_QAM 2 -static int modulation_fw_class(fe_modulation_t modulation) -{ - switch(modulation) { - case VSB_8: - return MOD_FWCLASS_VSB; - case QAM_AUTO: - case QAM_64: - case QAM_256: - return MOD_FWCLASS_QAM; - default: - return MOD_FWCLASS_UNKNOWN; - } -} - static int or51132_set_parameters(struct dvb_frontend* fe, struct dvb_frontend_parameters *param) { int ret; + u8 buf[4]; struct or51132_state* state = fe->demodulator_priv; const struct firmware *fw; - const char *fwname; - int clock_mode; - - /* Upload new firmware only if we need a different one */ - if (modulation_fw_class(state->current_modulation) != - modulation_fw_class(param->u.vsb.modulation)) { - switch(modulation_fw_class(param->u.vsb.modulation)) { - case MOD_FWCLASS_VSB: - dprintk("set_parameters VSB MODE\n"); - fwname = OR51132_VSB_FIRMWARE; + /* Change only if we are actually changing the modulation */ + if (state->current_modulation != param->u.vsb.modulation) { + switch(param->u.vsb.modulation) { + case VSB_8: + dprintk("set_parameters VSB MODE\n"); + printk("or51132: Waiting for firmware upload(%s)...\n", + OR51132_VSB_FIRMWARE); + ret = request_firmware(&fw, OR51132_VSB_FIRMWARE, + &state->i2c->dev); + if (ret){ + printk(KERN_WARNING "or51132: No firmware up" + "loaded(timeout or file not found?)\n"); + return ret; + } /* Set non-punctured clock for VSB */ - clock_mode = 0; + state->config->set_ts_params(fe, 0); break; - case MOD_FWCLASS_QAM: + case QAM_AUTO: + case QAM_64: + case QAM_256: dprintk("set_parameters QAM MODE\n"); - fwname = OR51132_QAM_FIRMWARE; - + printk("or51132: Waiting for firmware upload(%s)...\n", + OR51132_QAM_FIRMWARE); + ret = request_firmware(&fw, OR51132_QAM_FIRMWARE, + &state->i2c->dev); + if (ret){ + printk(KERN_WARNING "or51132: No firmware up" + "loaded(timeout or file not found?)\n"); + return ret; + } /* Set punctured clock for QAM */ - clock_mode = 1; + state->config->set_ts_params(fe, 1); break; default: - printk("or51132: Modulation type(%d) UNSUPPORTED\n", + printk("or51132:Modulation type(%d) UNSUPPORTED\n", param->u.vsb.modulation); return -1; - } - printk("or51132: Waiting for firmware upload(%s)...\n", - fwname); - ret = request_firmware(&fw, fwname, &state->i2c->dev); - if (ret) { - printk(KERN_WARNING "or51132: No firmware up" - "loaded(timeout or file not found?)\n"); - return ret; - } + }; ret = or51132_load_firmware(fe, fw); release_firmware(fw); if (ret) { @@ -374,18 +367,18 @@ static int or51132_set_parameters(struct dvb_frontend* fe, return ret; } printk("or51132: Firmware upload complete.\n"); - state->config->set_ts_params(fe, clock_mode); - } - /* Change only if we are actually changing the modulation */ - if (state->current_modulation != param->u.vsb.modulation) { + state->current_modulation = param->u.vsb.modulation; or51132_setmode(fe); } - if (fe->ops.tuner_ops.set_params) { - fe->ops.tuner_ops.set_params(fe, param); - if (fe->ops.i2c_gate_ctrl) fe->ops.i2c_gate_ctrl(fe, 0); - } + dvb_pll_configure(state->config->pll_desc, buf, + param->frequency, 0); + dprintk("set_parameters tuner bytes: 0x%02x 0x%02x " + "0x%02x 0x%02x\n",buf[0],buf[1],buf[2],buf[3]); + if (i2c_writebytes(state, state->config->pll_address ,buf, 4)) + printk(KERN_WARNING "or51132: set_parameters error " + "writing to tuner\n"); /* Set to current mode */ or51132_setmode(fe); @@ -395,44 +388,6 @@ static int or51132_set_parameters(struct dvb_frontend* fe, return 0; } -static int or51132_get_parameters(struct dvb_frontend* fe, - struct dvb_frontend_parameters *param) -{ - struct or51132_state* state = fe->demodulator_priv; - u8 buf[2]; - - /* Receiver Status */ - buf[0]=0x04; - buf[1]=0x00; - msleep(30); /* 30ms */ - if (i2c_writebytes(state,state->config->demod_address,buf,2)) { - printk(KERN_WARNING "or51132: get_parameters write error\n"); - return -EREMOTEIO; - } - msleep(30); /* 30ms */ - if (i2c_readbytes(state,state->config->demod_address,buf,2)) { - printk(KERN_WARNING "or51132: get_parameters read error\n"); - return -EREMOTEIO; - } - switch(buf[0]) { - case 0x06: param->u.vsb.modulation = VSB_8; break; - case 0x43: param->u.vsb.modulation = QAM_64; break; - case 0x45: param->u.vsb.modulation = QAM_256; break; - default: - printk(KERN_WARNING "or51132: unknown status 0x%02x\n", - buf[0]); - return -EREMOTEIO; - } - - /* FIXME: Read frequency from frontend, take AFC into account */ - param->frequency = state->current_frequency; - - /* FIXME: How to read inversion setting? Receiver 6 register? */ - param->inversion = INVERSION_AUTO; - - return 0; -} - static int or51132_read_status(struct dvb_frontend* fe, fe_status_t* status) { struct or51132_state* state = fe->demodulator_priv; @@ -617,11 +572,12 @@ struct dvb_frontend* or51132_attach(const struct or51132_config* config, /* Setup the state */ state->config = config; state->i2c = i2c; + memcpy(&state->ops, &or51132_ops, sizeof(struct dvb_frontend_ops)); state->current_frequency = -1; state->current_modulation = -1; /* Create dvb_frontend */ - memcpy(&state->frontend.ops, &or51132_ops, sizeof(struct dvb_frontend_ops)); + state->frontend.ops = &state->ops; state->frontend.demodulator_priv = state; return &state->frontend; @@ -634,7 +590,7 @@ static struct dvb_frontend_ops or51132_ops = { .info = { .name = "Oren OR51132 VSB/QAM Frontend", - .type = FE_ATSC, + .type = FE_ATSC, .frequency_min = 44000000, .frequency_max = 958000000, .frequency_stepsize = 166666, @@ -650,7 +606,6 @@ static struct dvb_frontend_ops or51132_ops = { .sleep = or51132_sleep, .set_frontend = or51132_set_parameters, - .get_frontend = or51132_get_parameters, .get_tune_settings = or51132_get_tune_settings, .read_status = or51132_read_status, diff --git a/drivers/media/dvb/frontends/or51132.h b/drivers/media/dvb/frontends/or51132.h index 89658883a..622cdd183 100644 --- a/drivers/media/dvb/frontends/or51132.h +++ b/drivers/media/dvb/frontends/or51132.h @@ -29,6 +29,8 @@ struct or51132_config { /* The demodulator's i2c address */ u8 demod_address; + u8 pll_address; + struct dvb_pll_desc *pll_desc; /* Need to set device param for start_dma */ int (*set_ts_params)(struct dvb_frontend* fe, int is_punctured); diff --git a/drivers/media/dvb/frontends/or51211.c b/drivers/media/dvb/frontends/or51211.c index 2bf124b53..7c3aed1f5 100644 --- a/drivers/media/dvb/frontends/or51211.c +++ b/drivers/media/dvb/frontends/or51211.c @@ -54,6 +54,7 @@ static u8 cmd_buf[] = {0x04,0x01,0x50,0x80,0x06}; // ATSC struct or51211_state { struct i2c_adapter* i2c; + struct dvb_frontend_ops ops; /* Configuration settings */ const struct or51211_config* config; @@ -437,10 +438,10 @@ static int or51211_init(struct dvb_frontend* fe) } ret = or51211_load_firmware(fe, fw); - release_firmware(fw); if (ret) { printk(KERN_WARNING "or51211: Writing firmware to " "device failed!\n"); + release_firmware(fw); return ret; } printk(KERN_INFO "or51211: Firmware upload complete.\n"); @@ -584,11 +585,12 @@ struct dvb_frontend* or51211_attach(const struct or51211_config* config, /* Setup the state */ state->config = config; state->i2c = i2c; + memcpy(&state->ops, &or51211_ops, sizeof(struct dvb_frontend_ops)); state->initialized = 0; state->current_frequency = 0; /* Create dvb_frontend */ - memcpy(&state->frontend.ops, &or51211_ops, sizeof(struct dvb_frontend_ops)); + state->frontend.ops = &state->ops; state->frontend.demodulator_priv = state; return &state->frontend; diff --git a/drivers/media/dvb/frontends/s5h1420.c b/drivers/media/dvb/frontends/s5h1420.c index 2c2c344c4..d69477596 100644 --- a/drivers/media/dvb/frontends/s5h1420.c +++ b/drivers/media/dvb/frontends/s5h1420.c @@ -38,6 +38,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. struct s5h1420_state { struct i2c_adapter* i2c; + struct dvb_frontend_ops ops; const struct s5h1420_config* config; struct dvb_frontend frontend; @@ -583,6 +584,7 @@ static int s5h1420_set_frontend(struct dvb_frontend* fe, struct s5h1420_state* state = fe->demodulator_priv; int frequency_delta; struct dvb_frontend_tune_settings fesettings; + u32 tmp; /* check if we should do a fast-tune */ memcpy(&fesettings.parameters, p, sizeof(struct dvb_frontend_parameters)); @@ -594,17 +596,10 @@ static int s5h1420_set_frontend(struct dvb_frontend* fe, (state->fec_inner == p->u.qpsk.fec_inner) && (state->symbol_rate == p->u.qpsk.symbol_rate)) { - if (fe->ops.tuner_ops.set_params) { - fe->ops.tuner_ops.set_params(fe, p); - if (fe->ops.i2c_gate_ctrl) fe->ops.i2c_gate_ctrl(fe, 0); - } - if (fe->ops.tuner_ops.get_frequency) { - u32 tmp; - fe->ops.tuner_ops.get_frequency(fe, &tmp); - if (fe->ops.i2c_gate_ctrl) fe->ops.i2c_gate_ctrl(fe, 0); + if (state->config->pll_set) { + s5h1420_writereg (state, 0x02, s5h1420_readreg(state,0x02) | 1); + state->config->pll_set(fe, p, &tmp); s5h1420_setfreqoffset(state, p->frequency - tmp); - } else { - s5h1420_setfreqoffset(state, 0); } return 0; } @@ -651,9 +646,9 @@ static int s5h1420_set_frontend(struct dvb_frontend* fe, s5h1420_writereg(state, 0x05, s5h1420_readreg(state, 0x05) | 1); /* set tuner PLL */ - if (fe->ops.tuner_ops.set_params) { - fe->ops.tuner_ops.set_params(fe, p); - if (fe->ops.i2c_gate_ctrl) fe->ops.i2c_gate_ctrl(fe, 0); + if (state->config->pll_set) { + s5h1420_writereg (state, 0x02, s5h1420_readreg(state,0x02) | 1); + state->config->pll_set(fe, p, &tmp); s5h1420_setfreqoffset(state, 0); } @@ -713,17 +708,6 @@ static int s5h1420_get_tune_settings(struct dvb_frontend* fe, return 0; } -static int s5h1420_i2c_gate_ctrl(struct dvb_frontend* fe, int enable) -{ - struct s5h1420_state* state = fe->demodulator_priv; - - if (enable) { - return s5h1420_writereg (state, 0x02, s5h1420_readreg(state,0x02) | 1); - } else { - return s5h1420_writereg (state, 0x02, s5h1420_readreg(state,0x02) & 0xfe); - } -} - static int s5h1420_init (struct dvb_frontend* fe) { struct s5h1420_state* state = fe->demodulator_priv; @@ -733,6 +717,13 @@ static int s5h1420_init (struct dvb_frontend* fe) msleep(10); s5h1420_reset(state); + /* init PLL */ + if (state->config->pll_init) { + s5h1420_writereg (state, 0x02, s5h1420_readreg(state,0x02) | 1); + state->config->pll_init(fe); + s5h1420_writereg (state, 0x02, s5h1420_readreg(state,0x02) & 0xfe); + } + return 0; } @@ -765,6 +756,7 @@ struct dvb_frontend* s5h1420_attach(const struct s5h1420_config* config, /* setup the state */ state->config = config; state->i2c = i2c; + memcpy(&state->ops, &s5h1420_ops, sizeof(struct dvb_frontend_ops)); state->postlocked = 0; state->fclk = 88000000; state->tunedfreq = 0; @@ -777,7 +769,7 @@ struct dvb_frontend* s5h1420_attach(const struct s5h1420_config* config, goto error; /* create dvb_frontend */ - memcpy(&state->frontend.ops, &s5h1420_ops, sizeof(struct dvb_frontend_ops)); + state->frontend.ops = &state->ops; state->frontend.demodulator_priv = state; return &state->frontend; @@ -808,7 +800,6 @@ static struct dvb_frontend_ops s5h1420_ops = { .init = s5h1420_init, .sleep = s5h1420_sleep, - .i2c_gate_ctrl = s5h1420_i2c_gate_ctrl, .set_frontend = s5h1420_set_frontend, .get_frontend = s5h1420_get_frontend, diff --git a/drivers/media/dvb/frontends/s5h1420.h b/drivers/media/dvb/frontends/s5h1420.h index 4e39015fa..73296f13c 100644 --- a/drivers/media/dvb/frontends/s5h1420.h +++ b/drivers/media/dvb/frontends/s5h1420.h @@ -32,6 +32,10 @@ struct s5h1420_config /* does the inversion require inversion? */ u8 invert:1; + + /* PLL maintenance */ + int (*pll_init)(struct dvb_frontend* fe); + int (*pll_set)(struct dvb_frontend* fe, struct dvb_frontend_parameters* params, u32* freqout); }; extern struct dvb_frontend* s5h1420_attach(const struct s5h1420_config* config, diff --git a/drivers/media/dvb/frontends/sp8870.c b/drivers/media/dvb/frontends/sp8870.c index d98fd5c2e..73829e647 100644 --- a/drivers/media/dvb/frontends/sp8870.c +++ b/drivers/media/dvb/frontends/sp8870.c @@ -44,6 +44,8 @@ struct sp8870_state { struct i2c_adapter* i2c; + struct dvb_frontend_ops ops; + const struct sp8870_config* config; struct dvb_frontend frontend; @@ -260,10 +262,9 @@ static int sp8870_set_frontend_parameters (struct dvb_frontend* fe, sp8870_microcontroller_stop(state); // set tuner parameters - if (fe->ops.tuner_ops.set_params) { - fe->ops.tuner_ops.set_params(fe, p); - if (fe->ops.i2c_gate_ctrl) fe->ops.i2c_gate_ctrl(fe, 0); - } + sp8870_writereg(state, 0x206, 0x001); + state->config->pll_set(fe, p); + sp8870_writereg(state, 0x206, 0x000); // sample rate correction bit [23..17] sp8870_writereg(state, 0x0319, 0x000A); @@ -318,6 +319,7 @@ static int sp8870_init (struct dvb_frontend* fe) printk("sp8870: waiting for firmware upload (%s)...\n", SP8870_DEFAULT_FIRMWARE); if (state->config->request_firmware(fe, &fw, SP8870_DEFAULT_FIRMWARE)) { printk("sp8870: no firmware upload (timeout or file not found?)\n"); + release_firmware(fw); return -EIO; } @@ -326,7 +328,6 @@ static int sp8870_init (struct dvb_frontend* fe) release_firmware(fw); return -EIO; } - release_firmware(fw); printk("sp8870: firmware upload complete\n"); /* enable TS output and interface pins */ @@ -348,6 +349,13 @@ static int sp8870_init (struct dvb_frontend* fe) sp8870_writereg(state, 0x0D00, 0x010); sp8870_writereg(state, 0x0D01, 0x000); + /* setup PLL */ + if (state->config->pll_init) { + sp8870_writereg(state, 0x206, 0x001); + state->config->pll_init(fe); + sp8870_writereg(state, 0x206, 0x000); + } + return 0; } @@ -533,17 +541,6 @@ static int sp8870_get_tune_settings(struct dvb_frontend* fe, struct dvb_frontend return 0; } -static int sp8870_i2c_gate_ctrl(struct dvb_frontend* fe, int enable) -{ - struct sp8870_state* state = fe->demodulator_priv; - - if (enable) { - return sp8870_writereg(state, 0x206, 0x001); - } else { - return sp8870_writereg(state, 0x206, 0x000); - } -} - static void sp8870_release(struct dvb_frontend* fe) { struct sp8870_state* state = fe->demodulator_priv; @@ -564,13 +561,14 @@ struct dvb_frontend* sp8870_attach(const struct sp8870_config* config, /* setup the state */ state->config = config; state->i2c = i2c; + memcpy(&state->ops, &sp8870_ops, sizeof(struct dvb_frontend_ops)); state->initialised = 0; /* check if the demod is there */ if (sp8870_readreg(state, 0x0200) < 0) goto error; /* create dvb_frontend */ - memcpy(&state->frontend.ops, &sp8870_ops, sizeof(struct dvb_frontend_ops)); + state->frontend.ops = &state->ops; state->frontend.demodulator_priv = state; return &state->frontend; @@ -599,7 +597,6 @@ static struct dvb_frontend_ops sp8870_ops = { .init = sp8870_init, .sleep = sp8870_sleep, - .i2c_gate_ctrl = sp8870_i2c_gate_ctrl, .set_frontend = sp8870_set_frontend, .get_tune_settings = sp8870_get_tune_settings, diff --git a/drivers/media/dvb/frontends/sp8870.h b/drivers/media/dvb/frontends/sp8870.h index 93afbb969..f3b555dbc 100644 --- a/drivers/media/dvb/frontends/sp8870.h +++ b/drivers/media/dvb/frontends/sp8870.h @@ -31,6 +31,10 @@ struct sp8870_config /* the demodulator's i2c address */ u8 demod_address; + /* PLL maintenance */ + int (*pll_init)(struct dvb_frontend* fe); + int (*pll_set)(struct dvb_frontend* fe, struct dvb_frontend_parameters* params); + /* request firmware for device */ int (*request_firmware)(struct dvb_frontend* fe, const struct firmware **fw, char* name); }; diff --git a/drivers/media/dvb/frontends/sp887x.c b/drivers/media/dvb/frontends/sp887x.c index 5c2f8f4e0..eb8a60219 100644 --- a/drivers/media/dvb/frontends/sp887x.c +++ b/drivers/media/dvb/frontends/sp887x.c @@ -24,6 +24,7 @@ struct sp887x_state { struct i2c_adapter* i2c; + struct dvb_frontend_ops ops; const struct sp887x_config* config; struct dvb_frontend frontend; @@ -207,6 +208,15 @@ static int sp887x_initial_setup (struct dvb_frontend* fe, const struct firmware /* bit 0x010: enable data valid signal */ sp887x_writereg(state, 0xd00, 0x010); sp887x_writereg(state, 0x0d1, 0x000); + + /* setup the PLL */ + if (state->config->pll_init) { + sp887x_writereg(state, 0x206, 0x001); + state->config->pll_init(fe); + sp887x_writereg(state, 0x206, 0x000); + } + + printk ("done.\n"); return 0; }; @@ -352,16 +362,9 @@ static int sp887x_setup_frontend_parameters (struct dvb_frontend* fe, sp887x_microcontroller_stop(state); /* setup the PLL */ - if (fe->ops.tuner_ops.set_params) { - fe->ops.tuner_ops.set_params(fe, p); - if (fe->ops.i2c_gate_ctrl) fe->ops.i2c_gate_ctrl(fe, 0); - } - if (fe->ops.tuner_ops.get_frequency) { - fe->ops.tuner_ops.get_frequency(fe, &actual_freq); - if (fe->ops.i2c_gate_ctrl) fe->ops.i2c_gate_ctrl(fe, 0); - } else { - actual_freq = p->frequency; - } + sp887x_writereg(state, 0x206, 0x001); + actual_freq = state->config->pll_set(fe, p); + sp887x_writereg(state, 0x206, 0x000); /* read status reg in order to clear demodulator_priv; - - if (enable) { - return sp887x_writereg(state, 0x206, 0x001); - } else { - return sp887x_writereg(state, 0x206, 0x000); - } -} - static int sp887x_sleep(struct dvb_frontend* fe) { struct sp887x_state* state = fe->demodulator_priv; @@ -520,9 +512,9 @@ static int sp887x_init(struct dvb_frontend* fe) } ret = sp887x_initial_setup(fe, fw); - release_firmware(fw); if (ret) { printk("sp887x: writing firmware to device failed\n"); + release_firmware(fw); return ret; } printk("sp887x: firmware upload complete\n"); @@ -563,13 +555,14 @@ struct dvb_frontend* sp887x_attach(const struct sp887x_config* config, /* setup the state */ state->config = config; state->i2c = i2c; + memcpy(&state->ops, &sp887x_ops, sizeof(struct dvb_frontend_ops)); state->initialised = 0; /* check if the demod is there */ if (sp887x_readreg(state, 0x0200) < 0) goto error; /* create dvb_frontend */ - memcpy(&state->frontend.ops, &sp887x_ops, sizeof(struct dvb_frontend_ops)); + state->frontend.ops = &state->ops; state->frontend.demodulator_priv = state; return &state->frontend; @@ -596,7 +589,6 @@ static struct dvb_frontend_ops sp887x_ops = { .init = sp887x_init, .sleep = sp887x_sleep, - .i2c_gate_ctrl = sp887x_i2c_gate_ctrl, .set_frontend = sp887x_setup_frontend_parameters, .get_tune_settings = sp887x_get_tune_settings, diff --git a/drivers/media/dvb/frontends/sp887x.h b/drivers/media/dvb/frontends/sp887x.h index c44b0ebdf..6a05d8f8e 100644 --- a/drivers/media/dvb/frontends/sp887x.h +++ b/drivers/media/dvb/frontends/sp887x.h @@ -13,6 +13,12 @@ struct sp887x_config /* the demodulator's i2c address */ u8 demod_address; + /* PLL maintenance */ + int (*pll_init)(struct dvb_frontend* fe); + + /* this should return the actual frequency tuned to */ + int (*pll_set)(struct dvb_frontend* fe, struct dvb_frontend_parameters* params); + /* request firmware for device */ int (*request_firmware)(struct dvb_frontend* fe, const struct firmware **fw, char* name); }; diff --git a/drivers/media/dvb/frontends/stv0297.c b/drivers/media/dvb/frontends/stv0297.c index 1ca642490..eb15676d3 100644 --- a/drivers/media/dvb/frontends/stv0297.c +++ b/drivers/media/dvb/frontends/stv0297.c @@ -32,6 +32,7 @@ struct stv0297_state { struct i2c_adapter *i2c; + struct dvb_frontend_ops ops; const struct stv0297_config *config; struct dvb_frontend frontend; @@ -67,25 +68,19 @@ static int stv0297_readreg(struct stv0297_state *state, u8 reg) int ret; u8 b0[] = { reg }; u8 b1[] = { 0 }; - struct i2c_msg msg[] = { {.addr = state->config->demod_address,.flags = 0,.buf = b0,.len = 1}, - {.addr = state->config->demod_address,.flags = I2C_M_RD,.buf = b1,.len = 1} - }; + struct i2c_msg msg[] = { {.addr = state->config->demod_address,.flags = 0,.buf = b0,.len = + 1}, + {.addr = state->config->demod_address,.flags = I2C_M_RD,.buf = b1,.len = 1} + }; // this device needs a STOP between the register and data - if (state->config->stop_during_read) { - if ((ret = i2c_transfer(state->i2c, &msg[0], 1)) != 1) { - dprintk("%s: readreg error (reg == 0x%02x, ret == %i)\n", __FUNCTION__, reg, ret); - return -1; - } - if ((ret = i2c_transfer(state->i2c, &msg[1], 1)) != 1) { - dprintk("%s: readreg error (reg == 0x%02x, ret == %i)\n", __FUNCTION__, reg, ret); - return -1; - } - } else { - if ((ret = i2c_transfer(state->i2c, msg, 2)) != 2) { - dprintk("%s: readreg error (reg == 0x%02x, ret == %i)\n", __FUNCTION__, reg, ret); - return -1; - } + if ((ret = i2c_transfer(state->i2c, &msg[0], 1)) != 1) { + dprintk("%s: readreg error (reg == 0x%02x, ret == %i)\n", __FUNCTION__, reg, ret); + return -1; + } + if ((ret = i2c_transfer(state->i2c, &msg[1], 1)) != 1) { + dprintk("%s: readreg error (reg == 0x%02x, ret == %i)\n", __FUNCTION__, reg, ret); + return -1; } return b1[0]; @@ -112,20 +107,13 @@ static int stv0297_readregs(struct stv0297_state *state, u8 reg1, u8 * b, u8 len }; // this device needs a STOP between the register and data - if (state->config->stop_during_read) { - if ((ret = i2c_transfer(state->i2c, &msg[0], 1)) != 1) { - dprintk("%s: readreg error (reg == 0x%02x, ret == %i)\n", __FUNCTION__, reg1, ret); - return -1; - } - if ((ret = i2c_transfer(state->i2c, &msg[1], 1)) != 1) { - dprintk("%s: readreg error (reg == 0x%02x, ret == %i)\n", __FUNCTION__, reg1, ret); - return -1; - } - } else { - if ((ret = i2c_transfer(state->i2c, msg, 2)) != 2) { - dprintk("%s: readreg error (reg == 0x%02x, ret == %i)\n", __FUNCTION__, reg1, ret); - return -1; - } + if ((ret = i2c_transfer(state->i2c, &msg[0], 1)) != 1) { + dprintk("%s: readreg error (reg == 0x%02x, ret == %i)\n", __FUNCTION__, reg1, ret); + return -1; + } + if ((ret = i2c_transfer(state->i2c, &msg[1], 1)) != 1) { + dprintk("%s: readreg error (reg == 0x%02x, ret == %i)\n", __FUNCTION__, reg1, ret); + return -1; } return 0; @@ -288,14 +276,12 @@ static int stv0297_set_inversion(struct stv0297_state *state, fe_spectral_invers return 0; } -static int stv0297_i2c_gate_ctrl(struct dvb_frontend *fe, int enable) +int stv0297_enable_plli2c(struct dvb_frontend *fe) { struct stv0297_state *state = fe->demodulator_priv; - if (enable) { - stv0297_writereg(state, 0x87, 0x78); - stv0297_writereg(state, 0x86, 0xc8); - } + stv0297_writereg(state, 0x87, 0x78); + stv0297_writereg(state, 0x86, 0xc8); return 0; } @@ -310,6 +296,9 @@ static int stv0297_init(struct dvb_frontend *fe) stv0297_writereg(state, state->config->inittab[i], state->config->inittab[i+1]); msleep(200); + if (state->config->pll_init) + state->config->pll_init(fe); + return 0; } @@ -400,7 +389,7 @@ static int stv0297_set_frontend(struct dvb_frontend *fe, struct dvb_frontend_par case QAM_32: case QAM_64: delay = 100; - sweeprate = 1000; + sweeprate = 1500; break; case QAM_128: @@ -432,10 +421,7 @@ static int stv0297_set_frontend(struct dvb_frontend *fe, struct dvb_frontend_par } stv0297_init(fe); - if (fe->ops.tuner_ops.set_params) { - fe->ops.tuner_ops.set_params(fe, p); - if (fe->ops.i2c_gate_ctrl) fe->ops.i2c_gate_ctrl(fe, 0); - } + state->config->pll_set(fe, p); /* clear software interrupts */ stv0297_writereg(state, 0x82, 0x0); @@ -648,6 +634,7 @@ struct dvb_frontend *stv0297_attach(const struct stv0297_config *config, /* setup the state */ state->config = config; state->i2c = i2c; + memcpy(&state->ops, &stv0297_ops, sizeof(struct dvb_frontend_ops)); state->base_freq = 0; /* check if the demod is there */ @@ -655,7 +642,7 @@ struct dvb_frontend *stv0297_attach(const struct stv0297_config *config, goto error; /* create dvb_frontend */ - memcpy(&state->frontend.ops, &stv0297_ops, sizeof(struct dvb_frontend_ops)); + state->frontend.ops = &state->ops; state->frontend.demodulator_priv = state; return &state->frontend; @@ -681,7 +668,6 @@ static struct dvb_frontend_ops stv0297_ops = { .init = stv0297_init, .sleep = stv0297_sleep, - .i2c_gate_ctrl = stv0297_i2c_gate_ctrl, .set_frontend = stv0297_set_frontend, .get_frontend = stv0297_get_frontend, @@ -698,3 +684,4 @@ MODULE_AUTHOR("Dennis Noermann and Andrew de Quincey"); MODULE_LICENSE("GPL"); EXPORT_SYMBOL(stv0297_attach); +EXPORT_SYMBOL(stv0297_enable_plli2c); diff --git a/drivers/media/dvb/frontends/stv0297.h b/drivers/media/dvb/frontends/stv0297.h index 1da5384fb..9e53f019d 100644 --- a/drivers/media/dvb/frontends/stv0297.h +++ b/drivers/media/dvb/frontends/stv0297.h @@ -38,11 +38,13 @@ struct stv0297_config /* does the "inversion" need inverted? */ u8 invert:1; - /* set to 1 if the device requires an i2c STOP during reading */ - u8 stop_during_read:1; + /* PLL maintenance */ + int (*pll_init)(struct dvb_frontend* fe); + int (*pll_set)(struct dvb_frontend* fe, struct dvb_frontend_parameters* params); }; extern struct dvb_frontend* stv0297_attach(const struct stv0297_config* config, struct i2c_adapter* i2c); +extern int stv0297_enable_plli2c(struct dvb_frontend* fe); #endif // STV0297_H diff --git a/drivers/media/dvb/frontends/stv0299.c b/drivers/media/dvb/frontends/stv0299.c index 96648a754..5bcd00f79 100644 --- a/drivers/media/dvb/frontends/stv0299.c +++ b/drivers/media/dvb/frontends/stv0299.c @@ -56,6 +56,7 @@ struct stv0299_state { struct i2c_adapter* i2c; + struct dvb_frontend_ops ops; const struct stv0299_config* config; struct dvb_frontend frontend; @@ -130,6 +131,13 @@ static int stv0299_readregs (struct stv0299_state* state, u8 reg1, u8 *b, u8 len return ret == 2 ? 0 : ret; } +int stv0299_enable_plli2c (struct dvb_frontend* fe) +{ + struct stv0299_state* state = fe->demodulator_priv; + + return stv0299_writeregI(state, 0x05, 0xb5); /* enable i2c repeater on stv0299 */ +} + static int stv0299_set_FEC (struct stv0299_state* state, fe_code_rate_t fec) { dprintk ("%s\n", __FUNCTION__); @@ -449,6 +457,12 @@ static int stv0299_init (struct dvb_frontend* fe) for (i=0; !(state->config->inittab[i] == 0xff && state->config->inittab[i+1] == 0xff); i+=2) stv0299_writeregI(state, state->config->inittab[i], state->config->inittab[i+1]); + if (state->config->pll_init) { + stv0299_writeregI(state, 0x05, 0xb5); /* enable i2c repeater on stv0299 */ + state->config->pll_init(fe, state->i2c); + stv0299_writeregI(state, 0x05, 0x35); /* disable i2c repeater on stv0299 */ + } + return 0; } @@ -546,10 +560,9 @@ static int stv0299_set_frontend(struct dvb_frontend* fe, struct dvb_frontend_par if (state->config->invert) invval = (~invval) & 1; stv0299_writeregI(state, 0x0c, (stv0299_readreg(state, 0x0c) & 0xfe) | invval); - if (fe->ops.tuner_ops.set_params) { - fe->ops.tuner_ops.set_params(fe, p); - if (fe->ops.i2c_gate_ctrl) fe->ops.i2c_gate_ctrl(fe, 0); - } + stv0299_writeregI(state, 0x05, 0xb5); /* enable i2c repeater on stv0299 */ + state->config->pll_set(fe, state->i2c, p); + stv0299_writeregI(state, 0x05, 0x35); /* disable i2c repeater on stv0299 */ stv0299_set_FEC (state, p->u.qpsk.fec_inner); stv0299_set_symbolrate (fe, p->u.qpsk.symbol_rate); @@ -598,19 +611,6 @@ static int stv0299_sleep(struct dvb_frontend* fe) return 0; } -static int stv0299_i2c_gate_ctrl(struct dvb_frontend* fe, int enable) -{ - struct stv0299_state* state = fe->demodulator_priv; - - if (enable) { - stv0299_writeregI(state, 0x05, 0xb5); - } else { - stv0299_writeregI(state, 0x05, 0x35); - } - udelay(1); - return 0; -} - static int stv0299_get_tune_settings(struct dvb_frontend* fe, struct dvb_frontend_tune_settings* fesettings) { struct stv0299_state* state = fe->demodulator_priv; @@ -647,6 +647,7 @@ struct dvb_frontend* stv0299_attach(const struct stv0299_config* config, /* setup the state */ state->config = config; state->i2c = i2c; + memcpy(&state->ops, &stv0299_ops, sizeof(struct dvb_frontend_ops)); state->initialised = 0; state->tuner_frequency = 0; state->symbol_rate = 0; @@ -663,7 +664,7 @@ struct dvb_frontend* stv0299_attach(const struct stv0299_config* config, if (id != 0xa1 && id != 0x80) goto error; /* create dvb_frontend */ - memcpy(&state->frontend.ops, &stv0299_ops, sizeof(struct dvb_frontend_ops)); + state->frontend.ops = &state->ops; state->frontend.demodulator_priv = state; return &state->frontend; @@ -694,7 +695,6 @@ static struct dvb_frontend_ops stv0299_ops = { .init = stv0299_init, .sleep = stv0299_sleep, - .i2c_gate_ctrl = stv0299_i2c_gate_ctrl, .set_frontend = stv0299_set_frontend, .get_frontend = stv0299_get_frontend, @@ -721,8 +721,9 @@ MODULE_PARM_DESC(debug, "Turn on/off frontend debugging (default:off)."); MODULE_DESCRIPTION("ST STV0299 DVB Demodulator driver"); MODULE_AUTHOR("Ralph Metzler, Holger Waechtler, Peter Schildmann, Felix Domke, " - "Andreas Oberritter, Andrew de Quincey, Kenneth Aafly"); + "Andreas Oberritter, Andrew de Quincey, Kenneth Aafløy"); MODULE_LICENSE("GPL"); +EXPORT_SYMBOL(stv0299_enable_plli2c); EXPORT_SYMBOL(stv0299_writereg); EXPORT_SYMBOL(stv0299_attach); diff --git a/drivers/media/dvb/frontends/stv0299.h b/drivers/media/dvb/frontends/stv0299.h index 1504828e4..32c87b4c2 100644 --- a/drivers/media/dvb/frontends/stv0299.h +++ b/drivers/media/dvb/frontends/stv0299.h @@ -87,9 +87,14 @@ struct stv0299_config /* Set the symbol rate */ int (*set_symbol_rate)(struct dvb_frontend* fe, u32 srate, u32 ratio); + + /* PLL maintenance */ + int (*pll_init)(struct dvb_frontend *fe, struct i2c_adapter *i2c); + int (*pll_set)(struct dvb_frontend *fe, struct i2c_adapter *i2c, struct dvb_frontend_parameters *params); }; extern int stv0299_writereg (struct dvb_frontend* fe, u8 reg, u8 data); +extern int stv0299_enable_plli2c (struct dvb_frontend* fe); extern struct dvb_frontend* stv0299_attach(const struct stv0299_config* config, struct i2c_adapter* i2c); diff --git a/drivers/media/dvb/frontends/tda10021.c b/drivers/media/dvb/frontends/tda10021.c index 9cbd164aa..21255cac9 100644 --- a/drivers/media/dvb/frontends/tda10021.c +++ b/drivers/media/dvb/frontends/tda10021.c @@ -21,6 +21,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +#include #include #include #include @@ -35,6 +36,7 @@ struct tda10021_state { struct i2c_adapter* i2c; + struct dvb_frontend_ops ops; /* configuration settings */ const struct tda10021_config* config; struct dvb_frontend frontend; @@ -88,14 +90,6 @@ static int tda10021_writereg (struct tda10021_state* state, u8 reg, u8 data) return (ret != 1) ? -EREMOTEIO : 0; } -int tda10021_write_byte(struct dvb_frontend* fe, int reg, int data) -{ - struct tda10021_state* state = fe->demodulator_priv; - - return tda10021_writereg(state, reg, data); -} -EXPORT_SYMBOL(tda10021_write_byte); - static u8 tda10021_readreg (struct tda10021_state* state, u8 reg) { u8 b0 [] = { reg }; @@ -231,6 +225,13 @@ static int tda10021_init (struct dvb_frontend *fe) //Activate PLL tda10021_writereg(state, 0x2a, tda10021_inittab[0x2a] & 0xef); + + if (state->config->pll_init) { + lock_tuner(state); + state->config->pll_init(fe); + unlock_tuner(state); + } + return 0; } @@ -258,10 +259,9 @@ static int tda10021_set_parameters (struct dvb_frontend *fe, //printk("tda10021: set frequency to %d qam=%d symrate=%d\n", p->frequency,qam,p->u.qam.symbol_rate); - if (fe->ops.tuner_ops.set_params) { - fe->ops.tuner_ops.set_params(fe, p); - if (fe->ops.i2c_gate_ctrl) fe->ops.i2c_gate_ctrl(fe, 0); - } + lock_tuner(state); + state->config->pll_set(fe, p); + unlock_tuner(state); tda10021_set_symbolrate (state, p->u.qam.symbol_rate); tda10021_writereg (state, 0x34, state->pwm); @@ -376,18 +376,6 @@ static int tda10021_get_frontend(struct dvb_frontend* fe, struct dvb_frontend_pa return 0; } -static int tda10021_i2c_gate_ctrl(struct dvb_frontend* fe, int enable) -{ - struct tda10021_state* state = fe->demodulator_priv; - - if (enable) { - lock_tuner(state); - } else { - unlock_tuner(state); - } - return 0; -} - static int tda10021_sleep(struct dvb_frontend* fe) { struct tda10021_state* state = fe->demodulator_priv; @@ -419,6 +407,7 @@ struct dvb_frontend* tda10021_attach(const struct tda10021_config* config, /* setup the state */ state->config = config; state->i2c = i2c; + memcpy(&state->ops, &tda10021_ops, sizeof(struct dvb_frontend_ops)); state->pwm = pwm; state->reg0 = tda10021_inittab[0]; @@ -426,7 +415,7 @@ struct dvb_frontend* tda10021_attach(const struct tda10021_config* config, if ((tda10021_readreg(state, 0x1a) & 0xf0) != 0x70) goto error; /* create dvb_frontend */ - memcpy(&state->frontend.ops, &tda10021_ops, sizeof(struct dvb_frontend_ops)); + state->frontend.ops = &state->ops; state->frontend.demodulator_priv = state; return &state->frontend; @@ -459,7 +448,6 @@ static struct dvb_frontend_ops tda10021_ops = { .init = tda10021_init, .sleep = tda10021_sleep, - .i2c_gate_ctrl = tda10021_i2c_gate_ctrl, .set_frontend = tda10021_set_parameters, .get_frontend = tda10021_get_frontend, diff --git a/drivers/media/dvb/frontends/tda10021.h b/drivers/media/dvb/frontends/tda10021.h index b1df4259b..53be939e8 100644 --- a/drivers/media/dvb/frontends/tda10021.h +++ b/drivers/media/dvb/frontends/tda10021.h @@ -30,11 +30,13 @@ struct tda10021_config { /* the demodulator's i2c address */ u8 demod_address; + + /* PLL maintenance */ + int (*pll_init)(struct dvb_frontend* fe); + int (*pll_set)(struct dvb_frontend* fe, struct dvb_frontend_parameters* params); }; extern struct dvb_frontend* tda10021_attach(const struct tda10021_config* config, struct i2c_adapter* i2c, u8 pwm); -extern int tda10021_write_byte(struct dvb_frontend* fe, int reg, int data); - #endif // TDA10021_H diff --git a/drivers/media/dvb/frontends/tda1004x.c b/drivers/media/dvb/frontends/tda1004x.c index 59a2ed614..8e8df7b4c 100644 --- a/drivers/media/dvb/frontends/tda1004x.c +++ b/drivers/media/dvb/frontends/tda1004x.c @@ -47,10 +47,12 @@ enum tda1004x_demod { struct tda1004x_state { struct i2c_adapter* i2c; + struct dvb_frontend_ops ops; const struct tda1004x_config* config; struct dvb_frontend frontend; /* private demod data */ + u8 initialised; enum tda1004x_demod demod_type; }; @@ -592,6 +594,9 @@ static int tda10045_init(struct dvb_frontend* fe) dprintk("%s\n", __FUNCTION__); + if (state->initialised) + return 0; + if (tda10045_fwupload(fe)) { printk("tda1004x: firmware upload failed\n"); return -EIO; @@ -599,6 +604,13 @@ static int tda10045_init(struct dvb_frontend* fe) tda1004x_write_mask(state, TDA1004X_CONFADC1, 0x10, 0); // wake up the ADC + // Init the PLL + if (state->config->pll_init) { + tda1004x_enable_tuner_i2c(state); + state->config->pll_init(fe); + tda1004x_disable_tuner_i2c(state); + } + // tda setup tda1004x_write_mask(state, TDA1004X_CONFC4, 0x20, 0); // disable DSP watchdog timer tda1004x_write_mask(state, TDA1004X_AUTO, 8, 0); // select HP stream @@ -614,6 +626,7 @@ static int tda10045_init(struct dvb_frontend* fe) tda1004x_write_mask(state, 0x1f, 0x01, state->config->invert_oclk); + state->initialised = 1; return 0; } @@ -622,11 +635,24 @@ static int tda10046_init(struct dvb_frontend* fe) struct tda1004x_state* state = fe->demodulator_priv; dprintk("%s\n", __FUNCTION__); + if (state->initialised) + return 0; + if (tda10046_fwupload(fe)) { printk("tda1004x: firmware upload failed\n"); return -EIO; } + // Init the tuner PLL + if (state->config->pll_init) { + tda1004x_enable_tuner_i2c(state); + if (state->config->pll_init(fe)) { + printk(KERN_ERR "tda1004x: pll init failed\n"); + return -EIO; + } + tda1004x_disable_tuner_i2c(state); + } + // tda setup tda1004x_write_mask(state, TDA1004X_CONFC4, 0x20, 0); // disable DSP watchdog timer tda1004x_write_byteI(state, TDA1004X_AUTO, 0x87); // 100 ppm crystal, select HP stream @@ -671,6 +697,7 @@ static int tda10046_init(struct dvb_frontend* fe) // tda1004x_write_mask(state, 0x50, 0x80, 0x80); // handle out of guard echoes tda1004x_write_mask(state, 0x3a, 0x80, state->config->invert_oclk << 7); + state->initialised = 1; return 0; } @@ -694,10 +721,12 @@ static int tda1004x_set_fe(struct dvb_frontend* fe, } // set frequency - if (fe->ops.tuner_ops.set_params) { - fe->ops.tuner_ops.set_params(fe, fe_params); - if (fe->ops.i2c_gate_ctrl) fe->ops.i2c_gate_ctrl(fe, 0); + tda1004x_enable_tuner_i2c(state); + if (state->config->pll_set(fe, fe_params)) { + printk(KERN_ERR "tda1004x: pll set failed\n"); + return -EIO; } + tda1004x_disable_tuner_i2c(state); // Hardcoded to use auto as much as possible on the TDA10045 as it // is very unreliable if AUTO mode is _not_ used. @@ -1163,26 +1192,26 @@ static int tda1004x_sleep(struct dvb_frontend* fe) break; case TDA1004X_DEMOD_TDA10046: + if (state->config->pll_sleep != NULL) { + tda1004x_enable_tuner_i2c(state); + state->config->pll_sleep(fe); + if (state->config->if_freq != TDA10046_FREQ_052) { + /* special hack for Philips EUROPA Based boards: + * keep the I2c bridge open for tuner access in analog mode + */ + tda1004x_disable_tuner_i2c(state); + } + } /* set outputs to tristate */ tda1004x_write_byteI(state, TDA10046H_CONF_TRISTATE1, 0xff); tda1004x_write_mask(state, TDA1004X_CONFC4, 1, 1); break; } + state->initialised = 0; return 0; } -static int tda1004x_i2c_gate_ctrl(struct dvb_frontend* fe, int enable) -{ - struct tda1004x_state* state = fe->demodulator_priv; - - if (enable) { - return tda1004x_enable_tuner_i2c(state); - } else { - return tda1004x_disable_tuner_i2c(state); - } -} - static int tda1004x_get_tune_settings(struct dvb_frontend* fe, struct dvb_frontend_tune_settings* fesettings) { fesettings->min_delay_ms = 800; @@ -1216,7 +1245,6 @@ static struct dvb_frontend_ops tda10045_ops = { .init = tda10045_init, .sleep = tda1004x_sleep, - .i2c_gate_ctrl = tda1004x_i2c_gate_ctrl, .set_frontend = tda1004x_set_fe, .get_frontend = tda1004x_get_fe, @@ -1242,6 +1270,8 @@ struct dvb_frontend* tda10045_attach(const struct tda1004x_config* config, /* setup the state */ state->config = config; state->i2c = i2c; + memcpy(&state->ops, &tda10045_ops, sizeof(struct dvb_frontend_ops)); + state->initialised = 0; state->demod_type = TDA1004X_DEMOD_TDA10045; /* check if the demod is there */ @@ -1251,7 +1281,7 @@ struct dvb_frontend* tda10045_attach(const struct tda1004x_config* config, } /* create dvb_frontend */ - memcpy(&state->frontend.ops, &tda10045_ops, sizeof(struct dvb_frontend_ops)); + state->frontend.ops = &state->ops; state->frontend.demodulator_priv = state; return &state->frontend; } @@ -1274,7 +1304,6 @@ static struct dvb_frontend_ops tda10046_ops = { .init = tda10046_init, .sleep = tda1004x_sleep, - .i2c_gate_ctrl = tda1004x_i2c_gate_ctrl, .set_frontend = tda1004x_set_fe, .get_frontend = tda1004x_get_fe, @@ -1300,6 +1329,8 @@ struct dvb_frontend* tda10046_attach(const struct tda1004x_config* config, /* setup the state */ state->config = config; state->i2c = i2c; + memcpy(&state->ops, &tda10046_ops, sizeof(struct dvb_frontend_ops)); + state->initialised = 0; state->demod_type = TDA1004X_DEMOD_TDA10046; /* check if the demod is there */ @@ -1309,7 +1340,7 @@ struct dvb_frontend* tda10046_attach(const struct tda1004x_config* config, } /* create dvb_frontend */ - memcpy(&state->frontend.ops, &tda10046_ops, sizeof(struct dvb_frontend_ops)); + state->frontend.ops = &state->ops; state->frontend.demodulator_priv = state; return &state->frontend; } diff --git a/drivers/media/dvb/frontends/tda1004x.h b/drivers/media/dvb/frontends/tda1004x.h index b877b23ed..cc0c4af64 100644 --- a/drivers/media/dvb/frontends/tda1004x.h +++ b/drivers/media/dvb/frontends/tda1004x.h @@ -66,6 +66,11 @@ struct tda1004x_config /* AGC configuration */ enum tda10046_agc agc_config; + /* PLL maintenance */ + int (*pll_init)(struct dvb_frontend* fe); + void (*pll_sleep)(struct dvb_frontend* fe); + int (*pll_set)(struct dvb_frontend* fe, struct dvb_frontend_parameters* params); + /* request firmware for device */ /* set this to NULL if the card has a firmware EEPROM */ int (*request_firmware)(struct dvb_frontend* fe, const struct firmware **fw, char* name); diff --git a/drivers/media/dvb/frontends/tda8083.c b/drivers/media/dvb/frontends/tda8083.c index 3aa45ebba..91baa9ced 100644 --- a/drivers/media/dvb/frontends/tda8083.c +++ b/drivers/media/dvb/frontends/tda8083.c @@ -37,6 +37,7 @@ struct tda8083_state { struct i2c_adapter* i2c; + struct dvb_frontend_ops ops; /* configuration settings */ const struct tda8083_config* config; struct dvb_frontend frontend; @@ -292,11 +293,7 @@ static int tda8083_set_frontend(struct dvb_frontend* fe, struct dvb_frontend_par { struct tda8083_state* state = fe->demodulator_priv; - if (fe->ops.tuner_ops.set_params) { - fe->ops.tuner_ops.set_params(fe, p); - if (fe->ops.i2c_gate_ctrl) fe->ops.i2c_gate_ctrl(fe, 0); - } - + state->config->pll_set(fe, p); tda8083_set_inversion (state, p->inversion); tda8083_set_fec (state, p->u.qpsk.fec_inner); tda8083_set_symbolrate (state, p->u.qpsk.symbol_rate); @@ -337,6 +334,8 @@ static int tda8083_init(struct dvb_frontend* fe) for (i=0; i<44; i++) tda8083_writereg (state, i, tda8083_init_tab[i]); + if (state->config->pll_init) state->config->pll_init(fe); + tda8083_writereg (state, 0x00, 0x3c); tda8083_writereg (state, 0x00, 0x04); @@ -396,12 +395,13 @@ struct dvb_frontend* tda8083_attach(const struct tda8083_config* config, /* setup the state */ state->config = config; state->i2c = i2c; + memcpy(&state->ops, &tda8083_ops, sizeof(struct dvb_frontend_ops)); /* check if the demod is there */ if ((tda8083_readreg(state, 0x00)) != 0x05) goto error; /* create dvb_frontend */ - memcpy(&state->frontend.ops, &tda8083_ops, sizeof(struct dvb_frontend_ops)); + state->frontend.ops = &state->ops; state->frontend.demodulator_priv = state; return &state->frontend; diff --git a/drivers/media/dvb/frontends/tda8083.h b/drivers/media/dvb/frontends/tda8083.h index e7a48f61e..466663307 100644 --- a/drivers/media/dvb/frontends/tda8083.h +++ b/drivers/media/dvb/frontends/tda8083.h @@ -33,6 +33,10 @@ struct tda8083_config { /* the demodulator's i2c address */ u8 demod_address; + + /* PLL maintenance */ + int (*pll_init)(struct dvb_frontend* fe); + int (*pll_set)(struct dvb_frontend* fe, struct dvb_frontend_parameters* params); }; extern struct dvb_frontend* tda8083_attach(const struct tda8083_config* config, diff --git a/drivers/media/dvb/frontends/ves1820.c b/drivers/media/dvb/frontends/ves1820.c index 9b57576bf..ad8647a3c 100644 --- a/drivers/media/dvb/frontends/ves1820.c +++ b/drivers/media/dvb/frontends/ves1820.c @@ -18,6 +18,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +#include #include #include #include @@ -34,6 +35,7 @@ struct ves1820_state { struct i2c_adapter* i2c; + struct dvb_frontend_ops ops; /* configuration settings */ const struct ves1820_config* config; struct dvb_frontend frontend; @@ -202,6 +204,9 @@ static int ves1820_init(struct dvb_frontend* fe) ves1820_writereg(state, 0x34, state->pwm); + if (state->config->pll_init) + state->config->pll_init(fe); + return 0; } @@ -218,11 +223,7 @@ static int ves1820_set_parameters(struct dvb_frontend* fe, struct dvb_frontend_p if (real_qam < 0 || real_qam > 4) return -EINVAL; - if (fe->ops.tuner_ops.set_params) { - fe->ops.tuner_ops.set_params(fe, p); - if (fe->ops.i2c_gate_ctrl) fe->ops.i2c_gate_ctrl(fe, 0); - } - + state->config->pll_set(fe, p); ves1820_set_symbolrate(state, p->u.qam.symbol_rate); ves1820_writereg(state, 0x34, state->pwm); @@ -379,6 +380,7 @@ struct dvb_frontend* ves1820_attach(const struct ves1820_config* config, goto error; /* setup the state */ + memcpy(&state->ops, &ves1820_ops, sizeof(struct dvb_frontend_ops)); state->reg0 = ves1820_inittab[0]; state->config = config; state->i2c = i2c; @@ -391,12 +393,12 @@ struct dvb_frontend* ves1820_attach(const struct ves1820_config* config, if (verbose) printk("ves1820: pwm=0x%02x\n", state->pwm); + state->ops.info.symbol_rate_min = (state->config->xin / 2) / 64; /* SACLK/64 == (XIN/2)/64 */ + state->ops.info.symbol_rate_max = (state->config->xin / 2) / 4; /* SACLK/4 */ + /* create dvb_frontend */ - memcpy(&state->frontend.ops, &ves1820_ops, sizeof(struct dvb_frontend_ops)); - state->frontend.ops.info.symbol_rate_min = (state->config->xin / 2) / 64; /* SACLK/64 == (XIN/2)/64 */ - state->frontend.ops.info.symbol_rate_max = (state->config->xin / 2) / 4; /* SACLK/4 */ + state->frontend.ops = &state->ops; state->frontend.demodulator_priv = state; - return &state->frontend; error: diff --git a/drivers/media/dvb/frontends/ves1820.h b/drivers/media/dvb/frontends/ves1820.h index 520f09522..355f130b1 100644 --- a/drivers/media/dvb/frontends/ves1820.h +++ b/drivers/media/dvb/frontends/ves1820.h @@ -39,6 +39,10 @@ struct ves1820_config /* SELAGC control */ u8 selagc:1; + + /* PLL maintenance */ + int (*pll_init)(struct dvb_frontend* fe); + int (*pll_set)(struct dvb_frontend* fe, struct dvb_frontend_parameters* params); }; extern struct dvb_frontend* ves1820_attach(const struct ves1820_config* config, diff --git a/drivers/media/dvb/frontends/ves1x93.c b/drivers/media/dvb/frontends/ves1x93.c index 54d7b0757..821df8e83 100644 --- a/drivers/media/dvb/frontends/ves1x93.c +++ b/drivers/media/dvb/frontends/ves1x93.c @@ -36,6 +36,7 @@ struct ves1x93_state { struct i2c_adapter* i2c; + struct dvb_frontend_ops ops; /* configuration settings */ const struct ves1x93_config* config; struct dvb_frontend frontend; @@ -277,6 +278,12 @@ static int ves1x93_init (struct dvb_frontend* fe) } } + if (state->config->pll_init) { + ves1x93_writereg(state, 0x00, 0x11); + state->config->pll_init(fe); + ves1x93_writereg(state, 0x00, 0x01); + } + return 0; } @@ -388,10 +395,9 @@ static int ves1x93_set_frontend(struct dvb_frontend* fe, struct dvb_frontend_par { struct ves1x93_state* state = fe->demodulator_priv; - if (fe->ops.tuner_ops.set_params) { - fe->ops.tuner_ops.set_params(fe, p); - if (fe->ops.i2c_gate_ctrl) fe->ops.i2c_gate_ctrl(fe, 0); - } + ves1x93_writereg(state, 0x00, 0x11); + state->config->pll_set(fe, p); + ves1x93_writereg(state, 0x00, 0x01); ves1x93_set_inversion (state, p->inversion); ves1x93_set_fec (state, p->u.qpsk.fec_inner); ves1x93_set_symbolrate (state, p->u.qpsk.symbol_rate); @@ -436,17 +442,6 @@ static void ves1x93_release(struct dvb_frontend* fe) kfree(state); } -static int ves1x93_i2c_gate_ctrl(struct dvb_frontend* fe, int enable) -{ - struct ves1x93_state* state = fe->demodulator_priv; - - if (enable) { - return ves1x93_writereg(state, 0x00, 0x11); - } else { - return ves1x93_writereg(state, 0x00, 0x01); - } -} - static struct dvb_frontend_ops ves1x93_ops; struct dvb_frontend* ves1x93_attach(const struct ves1x93_config* config, @@ -462,6 +457,7 @@ struct dvb_frontend* ves1x93_attach(const struct ves1x93_config* config, /* setup the state */ state->config = config; state->i2c = i2c; + memcpy(&state->ops, &ves1x93_ops, sizeof(struct dvb_frontend_ops)); state->inversion = INVERSION_OFF; /* check if the demod is there + identify it */ @@ -496,7 +492,7 @@ struct dvb_frontend* ves1x93_attach(const struct ves1x93_config* config, } /* create dvb_frontend */ - memcpy(&state->frontend.ops, &ves1x93_ops, sizeof(struct dvb_frontend_ops)); + state->frontend.ops = &state->ops; state->frontend.demodulator_priv = state; return &state->frontend; @@ -527,7 +523,6 @@ static struct dvb_frontend_ops ves1x93_ops = { .init = ves1x93_init, .sleep = ves1x93_sleep, - .i2c_gate_ctrl = ves1x93_i2c_gate_ctrl, .set_frontend = ves1x93_set_frontend, .get_frontend = ves1x93_get_frontend, diff --git a/drivers/media/dvb/frontends/ves1x93.h b/drivers/media/dvb/frontends/ves1x93.h index ba88ae085..1627e37c5 100644 --- a/drivers/media/dvb/frontends/ves1x93.h +++ b/drivers/media/dvb/frontends/ves1x93.h @@ -38,6 +38,10 @@ struct ves1x93_config /* should PWM be inverted? */ u8 invert_pwm:1; + + /* PLL maintenance */ + int (*pll_init)(struct dvb_frontend* fe); + int (*pll_set)(struct dvb_frontend* fe, struct dvb_frontend_parameters* params); }; extern struct dvb_frontend* ves1x93_attach(const struct ves1x93_config* config, diff --git a/drivers/media/dvb/pluto2/Kconfig b/drivers/media/dvb/pluto2/Kconfig index 9b84b1bdc..84f8f9f52 100644 --- a/drivers/media/dvb/pluto2/Kconfig +++ b/drivers/media/dvb/pluto2/Kconfig @@ -1,8 +1,8 @@ config DVB_PLUTO2 tristate "Pluto2 cards" - depends on DVB_CORE && PCI && I2C + depends on DVB_CORE && PCI + select I2C select I2C_ALGOBIT - select DVB_PLL select DVB_TDA1004X help Support for PCI cards based on the Pluto2 FPGA like the Satelco diff --git a/drivers/media/dvb/pluto2/Makefile b/drivers/media/dvb/pluto2/Makefile index ce6a9aaf9..86ca84b2b 100644 --- a/drivers/media/dvb/pluto2/Makefile +++ b/drivers/media/dvb/pluto2/Makefile @@ -1,3 +1,3 @@ -obj-$(CONFIG_DVB_PLUTO2) += pluto2.o +obj-$(CONFIG_DVB_PLUTO2) = pluto2.o EXTRA_CFLAGS = -Idrivers/media/dvb/dvb-core/ -Idrivers/media/dvb/frontends/ diff --git a/drivers/media/dvb/pluto2/pluto2.c b/drivers/media/dvb/pluto2/pluto2.c index 2310b2bfe..1c5316e20 100644 --- a/drivers/media/dvb/pluto2/pluto2.c +++ b/drivers/media/dvb/pluto2/pluto2.c @@ -424,8 +424,8 @@ static inline u32 divide(u32 numerator, u32 denominator) } /* LG Innotek TDTE-E001P (Infineon TUA6034) */ -static int lg_tdtpe001p_tuner_set_params(struct dvb_frontend *fe, - struct dvb_frontend_parameters *p) +static int lg_tdtpe001p_pll_set(struct dvb_frontend *fe, + struct dvb_frontend_parameters *p) { struct pluto *pluto = frontend_to_pluto(fe); struct i2c_msg msg; @@ -473,8 +473,6 @@ static int lg_tdtpe001p_tuner_set_params(struct dvb_frontend *fe, msg.buf = buf; msg.len = sizeof(buf); - if (fe->ops.i2c_gate_ctrl) - fe->ops.i2c_gate_ctrl(fe, 1); ret = i2c_transfer(&pluto->i2c_adap, &msg, 1); if (ret < 0) return ret; @@ -499,6 +497,8 @@ static struct tda1004x_config pluto2_fe_config __devinitdata = { .xtal_freq = TDA10046_XTAL_16M, .agc_config = TDA10046_AGC_DEFAULT, .if_freq = TDA10046_FREQ_3617, + .pll_set = lg_tdtpe001p_pll_set, + .pll_sleep = NULL, .request_firmware = pluto2_request_firmware, }; @@ -511,12 +511,11 @@ static int __devinit frontend_init(struct pluto *pluto) dev_err(&pluto->pdev->dev, "could not attach frontend\n"); return -ENODEV; } - pluto->fe->ops.tuner_ops.set_params = lg_tdtpe001p_tuner_set_params; ret = dvb_register_frontend(&pluto->dvb_adapter, pluto->fe); if (ret < 0) { - if (pluto->fe->ops.release) - pluto->fe->ops.release(pluto->fe); + if (pluto->fe->ops->release) + pluto->fe->ops->release(pluto->fe); return ret; } @@ -616,7 +615,7 @@ static int __devinit pluto2_probe(struct pci_dev *pdev, pci_set_drvdata(pdev, pluto); - ret = request_irq(pdev->irq, pluto_irq, IRQF_SHARED, DRIVER_NAME, pluto); + ret = request_irq(pdev->irq, pluto_irq, SA_SHIRQ, DRIVER_NAME, pluto); if (ret < 0) goto err_pci_iounmap; @@ -648,7 +647,7 @@ static int __devinit pluto2_probe(struct pci_dev *pdev, goto err_pluto_hw_exit; /* dvb */ - ret = dvb_register_adapter(&pluto->dvb_adapter, DRIVER_NAME, THIS_MODULE, &pdev->dev); + ret = dvb_register_adapter(&pluto->dvb_adapter, DRIVER_NAME, THIS_MODULE); if (ret < 0) goto err_i2c_bit_del_bus; diff --git a/drivers/media/dvb/ttpci/Kconfig b/drivers/media/dvb/ttpci/Kconfig index 5fb097595..5b2aadb83 100644 --- a/drivers/media/dvb/ttpci/Kconfig +++ b/drivers/media/dvb/ttpci/Kconfig @@ -1,9 +1,9 @@ config DVB_AV7110 tristate "AV7110 cards" - depends on DVB_CORE && PCI && I2C && VIDEO_V4L1 + depends on DVB_CORE && PCI select FW_LOADER + select VIDEO_DEV select VIDEO_SAA7146_VV - select DVB_PLL select DVB_VES1820 select DVB_VES1X93 select DVB_STV0299 @@ -11,7 +11,6 @@ config DVB_AV7110 select DVB_SP8870 select DVB_STV0297 select DVB_L64781 - select DVB_LNBP21 help Support for SAA7146 and AV7110 based DVB cards as produced by Fujitsu-Siemens, Technotrend, Hauppauge and others. @@ -60,9 +59,8 @@ config DVB_AV7110_OSD config DVB_BUDGET tristate "Budget cards" - depends on DVB_CORE && PCI && I2C && VIDEO_V4L1 + depends on DVB_CORE && PCI select VIDEO_SAA7146 - select DVB_PLL select DVB_STV0299 select DVB_VES1X93 select DVB_VES1820 @@ -70,7 +68,6 @@ config DVB_BUDGET select DVB_TDA8083 select DVB_TDA10021 select DVB_S5H1420 - select DVB_LNBP21 help Support for simple SAA7146 based DVB cards (so called Budget- or Nova-PCI cards) without onboard @@ -83,13 +80,11 @@ config DVB_BUDGET config DVB_BUDGET_CI tristate "Budget cards with onboard CI connector" - depends on DVB_CORE && PCI && I2C && VIDEO_V4L1 + depends on DVB_CORE && PCI select VIDEO_SAA7146 - select DVB_PLL select DVB_STV0297 select DVB_STV0299 select DVB_TDA1004X - select DVB_LNBP21 help Support for simple SAA7146 based DVB cards (so called Budget- or Nova-PCI cards) without onboard @@ -105,9 +100,9 @@ config DVB_BUDGET_CI config DVB_BUDGET_AV tristate "Budget cards with analog video inputs" - depends on DVB_CORE && PCI && I2C && VIDEO_V4L1 + depends on DVB_CORE && PCI + select VIDEO_DEV select VIDEO_SAA7146_VV - select DVB_PLL select DVB_STV0299 select DVB_TDA1004X select DVB_TDA10021 @@ -124,9 +119,8 @@ config DVB_BUDGET_AV config DVB_BUDGET_PATCH tristate "AV7110 cards with Budget Patch" - depends on DVB_CORE && DVB_BUDGET && VIDEO_V4L1 + depends on DVB_CORE && DVB_BUDGET select DVB_AV7110 - select DVB_PLL select DVB_STV0299 select DVB_VES1X93 select DVB_TDA8083 diff --git a/drivers/media/dvb/ttpci/Makefile b/drivers/media/dvb/ttpci/Makefile index aa85ecdc6..a690730ac 100644 --- a/drivers/media/dvb/ttpci/Makefile +++ b/drivers/media/dvb/ttpci/Makefile @@ -15,9 +15,9 @@ EXTRA_CFLAGS = -Idrivers/media/dvb/dvb-core/ -Idrivers/media/dvb/frontends/ hostprogs-y := fdump -ifeq ($(CONFIG_DVB_AV7110_FIRMWARE),y) -$(obj)/av7110.o: $(obj)/av7110_firm.h +ifdef CONFIG_DVB_AV7110_FIRMWARE +$(obj)/av7110.o: $(obj)/fdump $(obj)/av7110_firm.h -$(obj)/av7110_firm.h: $(obj)/fdump +$(obj)/av7110_firm.h: $(obj)/fdump $(CONFIG_DVB_AV7110_FIRMWARE_FILE) dvb_ttpci_fw $@ endif diff --git a/drivers/media/dvb/ttpci/av7110.c b/drivers/media/dvb/ttpci/av7110.c index 4506165c5..7c6ccb96b 100644 --- a/drivers/media/dvb/ttpci/av7110.c +++ b/drivers/media/dvb/ttpci/av7110.c @@ -30,6 +30,7 @@ */ +#include #include #include #include @@ -53,6 +54,7 @@ #include #include +#include #include @@ -65,10 +67,6 @@ #include "av7110_ca.h" #include "av7110_ipack.h" -#include "bsbe1.h" -#include "lnbp21.h" -#include "bsru6.h" - #define TS_WIDTH 376 #define TS_HEIGHT 512 #define TS_BUFLEN (TS_WIDTH*TS_HEIGHT) @@ -84,9 +82,6 @@ static int hw_sections; static int rgb_on; static int volume = 255; static int budgetpatch; -static int wss_cfg_4_3 = 0x4008; -static int wss_cfg_16_9 = 0x0007; -static int tv_standard; module_param_named(debug, av7110_debug, int, 0644); MODULE_PARM_DESC(debug, "debug level (bitmask, default 0)"); @@ -105,12 +100,6 @@ module_param(volume, int, 0444); MODULE_PARM_DESC(volume, "initial volume: default 255 (range 0-255)"); module_param(budgetpatch, int, 0444); MODULE_PARM_DESC(budgetpatch, "use budget-patch hardware modification: default 0 (0 no, 1 autodetect, 2 always)"); -module_param(wss_cfg_4_3, int, 0444); -MODULE_PARM_DESC(wss_cfg_4_3, "WSS 4:3 - default 0x4008 - bit 15: disable, 14: burst mode, 13..0: wss data"); -module_param(wss_cfg_16_9, int, 0444); -MODULE_PARM_DESC(wss_cfg_16_9, "WSS 16:9 - default 0x0007 - bit 15: disable, 14: burst mode, 13..0: wss data"); -module_param(tv_standard, int, 0444); -MODULE_PARM_DESC(tv_standard, "TV standard: 0 PAL (default), 1 NTSC"); static void restart_feeds(struct av7110 *av7110); @@ -136,13 +125,6 @@ static void init_av7110_av(struct av7110 *av7110) if (ret < 0) printk("dvb-ttpci:cannot set internal volume to maximum:%d\n",ret); - ret = av7110_fw_cmd(av7110, COMTYPE_ENCODER, SetWSSConfig, 2, 2, wss_cfg_4_3); - if (ret < 0) - printk("dvb-ttpci: unable to configure 4:3 wss\n"); - ret = av7110_fw_cmd(av7110, COMTYPE_ENCODER, SetWSSConfig, 2, 3, wss_cfg_16_9); - if (ret < 0) - printk("dvb-ttpci: unable to configure 16:9 wss\n"); - ret = av7710_set_video_mode(av7110, vidmode); if (ret < 0) printk("dvb-ttpci:cannot set video mode:%d\n",ret); @@ -151,9 +133,13 @@ static void init_av7110_av(struct av7110 *av7110) /* remaining inits according to card and frontend type */ av7110->analog_tuner_flags = 0; av7110->current_input = 0; - if (dev->pci->subsystem_vendor == 0x13c2 && dev->pci->subsystem_device == 0x000a) + if (dev->pci->subsystem_vendor == 0x13c2 && dev->pci->subsystem_device == 0x000a) { + printk("dvb-ttpci: MSP3415 audio DAC @ card %d\n", + av7110->dvb_adapter.num); + av7110->adac_type = DVB_ADAC_MSP34x5; av7110_fw_cmd(av7110, COMTYPE_AUDIODAC, ADSwitch, 1, 0); // SPDIF on - if (i2c_writereg(av7110, 0x20, 0x00, 0x00) == 1) { + } + else if (i2c_writereg(av7110, 0x20, 0x00, 0x00) == 1) { printk ("dvb-ttpci: Crystal audio DAC @ card %d detected\n", av7110->dvb_adapter.num); av7110->adac_type = DVB_ADAC_CRYSTAL; @@ -256,10 +242,10 @@ static int arm_thread(void *data) if (!av7110->arm_ready) continue; - if (mutex_lock_interruptible(&av7110->dcomlock)) + if (down_interruptible(&av7110->dcomlock)) break; newloops = rdebi(av7110, DEBINOSWAP, STATUS_LOOPS, 0, 2); - mutex_unlock(&av7110->dcomlock); + up(&av7110->dcomlock); if (newloops == av7110->arm_loops || av7110->arm_errors > 3) { printk(KERN_ERR "dvb-ttpci: ARM crashed @ card %d\n", @@ -267,10 +253,10 @@ static int arm_thread(void *data) recover_arm(av7110); - if (mutex_lock_interruptible(&av7110->dcomlock)) + if (down_interruptible(&av7110->dcomlock)) break; newloops = rdebi(av7110, DEBINOSWAP, STATUS_LOOPS, 0, 2) - 1; - mutex_unlock(&av7110->dcomlock); + up(&av7110->dcomlock); } av7110->arm_loops = newloops; av7110->arm_errors = 0; @@ -755,7 +741,7 @@ int ChangePIDs(struct av7110 *av7110, u16 vpid, u16 apid, u16 ttpid, int ret = 0; dprintk(4, "%p\n", av7110); - if (mutex_lock_interruptible(&av7110->pid_mutex)) + if (down_interruptible(&av7110->pid_mutex)) return -ERESTARTSYS; if (!(vpid & 0x8000)) @@ -774,7 +760,7 @@ int ChangePIDs(struct av7110 *av7110, u16 vpid, u16 apid, u16 ttpid, ret = SetPIDs(av7110, vpid, apid, ttpid, subpid, pcrpid); } - mutex_unlock(&av7110->pid_mutex); + up(&av7110->pid_mutex); return ret; } @@ -1102,9 +1088,11 @@ static int dvb_get_stc(struct dmx_demux *demux, unsigned int num, struct av7110 *av7110; /* pointer casting paranoia... */ - BUG_ON(!demux); + if (!demux) + BUG(); dvbdemux = (struct dvb_demux *) demux->priv; - BUG_ON(!dvbdemux); + if (!dvbdemux) + BUG(); av7110 = (struct av7110 *) dvbdemux->priv; dprintk(4, "%p\n", av7110); @@ -1547,7 +1535,7 @@ static int get_firmware(struct av7110* av7110) #endif -static int alps_bsrv2_tuner_set_params(struct dvb_frontend* fe, struct dvb_frontend_parameters *params) +static int alps_bsrv2_pll_set(struct dvb_frontend* fe, struct dvb_frontend_parameters* params) { struct av7110* av7110 = (struct av7110*) fe->dvb->priv; u8 pwr = 0; @@ -1570,8 +1558,6 @@ static int alps_bsrv2_tuner_set_params(struct dvb_frontend* fe, struct dvb_front // NOTE: since we're using a prescaler of 2, we set the // divisor frequency to 62.5kHz and divide by 125 above - if (fe->ops.i2c_gate_ctrl) - fe->ops.i2c_gate_ctrl(fe, 1); if (i2c_transfer (&av7110->i2c_adap, &msg, 1) != 1) return -EIO; return 0; @@ -1581,9 +1567,212 @@ static struct ves1x93_config alps_bsrv2_config = { .demod_address = 0x08, .xin = 90100000UL, .invert_pwm = 0, + .pll_set = alps_bsrv2_pll_set, +}; + + +static u8 alps_bsru6_inittab[] = { + 0x01, 0x15, + 0x02, 0x30, + 0x03, 0x00, + 0x04, 0x7d, /* F22FR = 0x7d, F22 = f_VCO / 128 / 0x7d = 22 kHz */ + 0x05, 0x35, /* I2CT = 0, SCLT = 1, SDAT = 1 */ + 0x06, 0x40, /* DAC not used, set to high impendance mode */ + 0x07, 0x00, /* DAC LSB */ + 0x08, 0x40, /* DiSEqC off, LNB power on OP2/LOCK pin on */ + 0x09, 0x00, /* FIFO */ + 0x0c, 0x51, /* OP1 ctl = Normal, OP1 val = 1 (LNB Power ON) */ + 0x0d, 0x82, /* DC offset compensation = ON, beta_agc1 = 2 */ + 0x0e, 0x23, /* alpha_tmg = 2, beta_tmg = 3 */ + 0x10, 0x3f, // AGC2 0x3d + 0x11, 0x84, + 0x12, 0xb9, + 0x15, 0xc9, // lock detector threshold + 0x16, 0x00, + 0x17, 0x00, + 0x18, 0x00, + 0x19, 0x00, + 0x1a, 0x00, + 0x1f, 0x50, + 0x20, 0x00, + 0x21, 0x00, + 0x22, 0x00, + 0x23, 0x00, + 0x28, 0x00, // out imp: normal out type: parallel FEC mode:0 + 0x29, 0x1e, // 1/2 threshold + 0x2a, 0x14, // 2/3 threshold + 0x2b, 0x0f, // 3/4 threshold + 0x2c, 0x09, // 5/6 threshold + 0x2d, 0x05, // 7/8 threshold + 0x2e, 0x01, + 0x31, 0x1f, // test all FECs + 0x32, 0x19, // viterbi and synchro search + 0x33, 0xfc, // rs control + 0x34, 0x93, // error control + 0x0f, 0x52, + 0xff, 0xff +}; + +static int alps_bsru6_set_symbol_rate(struct dvb_frontend* fe, u32 srate, u32 ratio) +{ + u8 aclk = 0; + u8 bclk = 0; + + if (srate < 1500000) { aclk = 0xb7; bclk = 0x47; } + else if (srate < 3000000) { aclk = 0xb7; bclk = 0x4b; } + else if (srate < 7000000) { aclk = 0xb7; bclk = 0x4f; } + else if (srate < 14000000) { aclk = 0xb7; bclk = 0x53; } + else if (srate < 30000000) { aclk = 0xb6; bclk = 0x53; } + else if (srate < 45000000) { aclk = 0xb4; bclk = 0x51; } + + stv0299_writereg(fe, 0x13, aclk); + stv0299_writereg(fe, 0x14, bclk); + stv0299_writereg(fe, 0x1f, (ratio >> 16) & 0xff); + stv0299_writereg(fe, 0x20, (ratio >> 8) & 0xff); + stv0299_writereg(fe, 0x21, (ratio ) & 0xf0); + + return 0; +} + +static int alps_bsru6_pll_set(struct dvb_frontend* fe, struct i2c_adapter *i2c, struct dvb_frontend_parameters* params) +{ + int ret; + u8 data[4]; + u32 div; + struct i2c_msg msg = { .addr = 0x61, .flags = 0, .buf = data, .len = sizeof(data) }; + + if ((params->frequency < 950000) || (params->frequency > 2150000)) + return -EINVAL; + + div = (params->frequency + (125 - 1)) / 125; // round correctly + data[0] = (div >> 8) & 0x7f; + data[1] = div & 0xff; + data[2] = 0x80 | ((div & 0x18000) >> 10) | 4; + data[3] = 0xC4; + + if (params->frequency > 1530000) data[3] = 0xc0; + + ret = i2c_transfer(i2c, &msg, 1); + if (ret != 1) + return -EIO; + return 0; +} + +static struct stv0299_config alps_bsru6_config = { + + .demod_address = 0x68, + .inittab = alps_bsru6_inittab, + .mclk = 88000000UL, + .invert = 1, + .skip_reinit = 0, + .lock_output = STV0229_LOCKOUTPUT_1, + .volt13_op0_op1 = STV0299_VOLT13_OP1, + .min_delay_ms = 100, + .set_symbol_rate = alps_bsru6_set_symbol_rate, + .pll_set = alps_bsru6_pll_set, +}; + + +static u8 alps_bsbe1_inittab[] = { + 0x01, 0x15, + 0x02, 0x30, + 0x03, 0x00, + 0x04, 0x7d, /* F22FR = 0x7d, F22 = f_VCO / 128 / 0x7d = 22 kHz */ + 0x05, 0x35, /* I2CT = 0, SCLT = 1, SDAT = 1 */ + 0x06, 0x40, /* DAC not used, set to high impendance mode */ + 0x07, 0x00, /* DAC LSB */ + 0x08, 0x40, /* DiSEqC off, LNB power on OP2/LOCK pin on */ + 0x09, 0x00, /* FIFO */ + 0x0c, 0x51, /* OP1 ctl = Normal, OP1 val = 1 (LNB Power ON) */ + 0x0d, 0x82, /* DC offset compensation = ON, beta_agc1 = 2 */ + 0x0e, 0x23, /* alpha_tmg = 2, beta_tmg = 3 */ + 0x10, 0x3f, // AGC2 0x3d + 0x11, 0x84, + 0x12, 0xb9, + 0x15, 0xc9, // lock detector threshold + 0x16, 0x00, + 0x17, 0x00, + 0x18, 0x00, + 0x19, 0x00, + 0x1a, 0x00, + 0x1f, 0x50, + 0x20, 0x00, + 0x21, 0x00, + 0x22, 0x00, + 0x23, 0x00, + 0x28, 0x00, // out imp: normal out type: parallel FEC mode:0 + 0x29, 0x1e, // 1/2 threshold + 0x2a, 0x14, // 2/3 threshold + 0x2b, 0x0f, // 3/4 threshold + 0x2c, 0x09, // 5/6 threshold + 0x2d, 0x05, // 7/8 threshold + 0x2e, 0x01, + 0x31, 0x1f, // test all FECs + 0x32, 0x19, // viterbi and synchro search + 0x33, 0xfc, // rs control + 0x34, 0x93, // error control + 0x0f, 0x92, + 0xff, 0xff +}; + +static int alps_bsbe1_pll_set(struct dvb_frontend* fe, struct i2c_adapter *i2c, struct dvb_frontend_parameters* params) +{ + int ret; + u8 data[4]; + u32 div; + struct i2c_msg msg = { .addr = 0x61, .flags = 0, .buf = data, .len = sizeof(data) }; + + if ((params->frequency < 950000) || (params->frequency > 2150000)) + return -EINVAL; + + div = (params->frequency + (125 - 1)) / 125; // round correctly + data[0] = (div >> 8) & 0x7f; + data[1] = div & 0xff; + data[2] = 0x80 | ((div & 0x18000) >> 10) | 4; + data[3] = (params->frequency > 1530000) ? 0xE0 : 0xE4; + + ret = i2c_transfer(i2c, &msg, 1); + return (ret != 1) ? -EIO : 0; +} + +static struct stv0299_config alps_bsbe1_config = { + .demod_address = 0x68, + .inittab = alps_bsbe1_inittab, + .mclk = 88000000UL, + .invert = 1, + .skip_reinit = 0, + .min_delay_ms = 100, + .set_symbol_rate = alps_bsru6_set_symbol_rate, + .pll_set = alps_bsbe1_pll_set, }; -static int alps_tdbe2_tuner_set_params(struct dvb_frontend* fe, struct dvb_frontend_parameters *params) +static int lnbp21_set_voltage(struct dvb_frontend* fe, fe_sec_voltage_t voltage) +{ + struct av7110* av7110 = (struct av7110*) fe->dvb->priv; + int ret; + u8 data[1]; + struct i2c_msg msg = { .addr = 0x08, .flags = 0, .buf = data, .len = sizeof(data) }; + + switch(voltage) { + case SEC_VOLTAGE_OFF: + data[0] = 0x00; + break; + case SEC_VOLTAGE_13: + data[0] = 0x44; + break; + case SEC_VOLTAGE_18: + data[0] = 0x4c; + break; + default: + return -EINVAL; + }; + + ret = i2c_transfer(&av7110->i2c_adap, &msg, 1); + return (ret != 1) ? -EIO : 0; +} + + +static int alps_tdbe2_pll_set(struct dvb_frontend* fe, struct dvb_frontend_parameters* params) { struct av7110* av7110 = fe->dvb->priv; u32 div; @@ -1597,8 +1786,6 @@ static int alps_tdbe2_tuner_set_params(struct dvb_frontend* fe, struct dvb_front data[2] = 0x85 | ((div >> 10) & 0x60); data[3] = (params->frequency < 174000000 ? 0x88 : params->frequency < 470000000 ? 0x84 : 0x81); - if (fe->ops.i2c_gate_ctrl) - fe->ops.i2c_gate_ctrl(fe, 1); if (i2c_transfer(&av7110->i2c_adap, &msg, 1) != 1) return -EIO; return 0; @@ -1609,12 +1796,14 @@ static struct ves1820_config alps_tdbe2_config = { .xin = 57840000UL, .invert = 1, .selagc = VES1820_SELAGC_SIGNAMPERR, + .pll_set = alps_tdbe2_pll_set, }; -static int grundig_29504_451_tuner_set_params(struct dvb_frontend* fe, struct dvb_frontend_parameters *params) +static int grundig_29504_451_pll_set(struct dvb_frontend* fe, + struct dvb_frontend_parameters* params) { struct av7110* av7110 = fe->dvb->priv; u32 div; @@ -1627,8 +1816,6 @@ static int grundig_29504_451_tuner_set_params(struct dvb_frontend* fe, struct dv data[2] = 0x8e; data[3] = 0x00; - if (fe->ops.i2c_gate_ctrl) - fe->ops.i2c_gate_ctrl(fe, 1); if (i2c_transfer(&av7110->i2c_adap, &msg, 1) != 1) return -EIO; return 0; @@ -1636,11 +1823,13 @@ static int grundig_29504_451_tuner_set_params(struct dvb_frontend* fe, struct dv static struct tda8083_config grundig_29504_451_config = { .demod_address = 0x68, + .pll_set = grundig_29504_451_pll_set, }; -static int philips_cd1516_tuner_set_params(struct dvb_frontend* fe, struct dvb_frontend_parameters *params) +static int philips_cd1516_pll_set(struct dvb_frontend* fe, + struct dvb_frontend_parameters* params) { struct av7110* av7110 = fe->dvb->priv; u32 div; @@ -1655,8 +1844,6 @@ static int philips_cd1516_tuner_set_params(struct dvb_frontend* fe, struct dvb_f data[2] = 0x8e; data[3] = (f < 174000000 ? 0xa1 : f < 470000000 ? 0x92 : 0x34); - if (fe->ops.i2c_gate_ctrl) - fe->ops.i2c_gate_ctrl(fe, 1); if (i2c_transfer(&av7110->i2c_adap, &msg, 1) != 1) return -EIO; return 0; @@ -1667,11 +1854,12 @@ static struct ves1820_config philips_cd1516_config = { .xin = 57840000UL, .invert = 1, .selagc = VES1820_SELAGC_SIGNAMPERR, + .pll_set = philips_cd1516_pll_set, }; -static int alps_tdlb7_tuner_set_params(struct dvb_frontend* fe, struct dvb_frontend_parameters *params) +static int alps_tdlb7_pll_set(struct dvb_frontend* fe, struct dvb_frontend_parameters* params) { struct av7110* av7110 = fe->dvb->priv; u32 div, pwr; @@ -1690,8 +1878,6 @@ static int alps_tdlb7_tuner_set_params(struct dvb_frontend* fe, struct dvb_front data[2] = 0x85; data[3] = pwr << 6; - if (fe->ops.i2c_gate_ctrl) - fe->ops.i2c_gate_ctrl(fe, 1); if (i2c_transfer(&av7110->i2c_adap, &msg, 1) != 1) return -EIO; return 0; @@ -1707,6 +1893,7 @@ static int alps_tdlb7_request_firmware(struct dvb_frontend* fe, const struct fir static struct sp8870_config alps_tdlb7_config = { .demod_address = 0x71, + .pll_set = alps_tdlb7_pll_set, .request_firmware = alps_tdlb7_request_firmware, }; @@ -1804,7 +1991,7 @@ static u8 nexusca_stv0297_inittab[] = { 0xff, 0xff, }; -static int nexusca_stv0297_tuner_set_params(struct dvb_frontend* fe, struct dvb_frontend_parameters *params) +static int nexusca_stv0297_pll_set(struct dvb_frontend* fe, struct dvb_frontend_parameters* params) { struct av7110* av7110 = fe->dvb->priv; u32 div; @@ -1830,8 +2017,7 @@ static int nexusca_stv0297_tuner_set_params(struct dvb_frontend* fe, struct dvb_ else return -EINVAL; - if (fe->ops.i2c_gate_ctrl) - fe->ops.i2c_gate_ctrl(fe, 1); + stv0297_enable_plli2c(fe); if (i2c_transfer(&av7110->i2c_adap, &msg, 1) != 1) { printk("nexusca: pll transfer failed!\n"); return -EIO; @@ -1839,8 +2025,8 @@ static int nexusca_stv0297_tuner_set_params(struct dvb_frontend* fe, struct dvb_ // wait for PLL lock for(i = 0; i < 20; i++) { - if (fe->ops.i2c_gate_ctrl) - fe->ops.i2c_gate_ctrl(fe, 1); + + stv0297_enable_plli2c(fe); if (i2c_transfer(&av7110->i2c_adap, &readmsg, 1) == 1) if (data[0] & 0x40) break; msleep(10); @@ -1854,12 +2040,12 @@ static struct stv0297_config nexusca_stv0297_config = { .demod_address = 0x1C, .inittab = nexusca_stv0297_inittab, .invert = 1, - .stop_during_read = 1, + .pll_set = nexusca_stv0297_pll_set, }; -static int grundig_29504_401_tuner_set_params(struct dvb_frontend* fe, struct dvb_frontend_parameters *params) +static int grundig_29504_401_pll_set(struct dvb_frontend* fe, struct dvb_frontend_parameters* params) { struct av7110* av7110 = (struct av7110*) fe->dvb->priv; u32 div; @@ -1886,14 +2072,13 @@ static int grundig_29504_401_tuner_set_params(struct dvb_frontend* fe, struct dv data[2] = ((div >> 10) & 0x60) | cfg; data[3] = (cpump << 6) | band_select; - if (fe->ops.i2c_gate_ctrl) - fe->ops.i2c_gate_ctrl(fe, 1); if (i2c_transfer (&av7110->i2c_adap, &msg, 1) != 1) return -EIO; return 0; } static struct l64781_config grundig_29504_401_config = { .demod_address = 0x55, + .pll_set = grundig_29504_401_pll_set, }; @@ -1911,7 +2096,7 @@ static int av7110_fe_lock_fix(struct av7110* av7110, fe_status_t status) if (av7110->playing) return 0; - if (mutex_lock_interruptible(&av7110->pid_mutex)) + if (down_interruptible(&av7110->pid_mutex)) return -ERESTARTSYS; if (synced) { @@ -1933,7 +2118,7 @@ static int av7110_fe_lock_fix(struct av7110* av7110, fe_status_t status) if (!ret) av7110->fe_synced = synced; - mutex_unlock(&av7110->pid_mutex); + up(&av7110->pid_mutex); return ret; } @@ -2079,9 +2264,6 @@ static int frontend_init(struct av7110 *av7110) case 0x0000: // Fujitsu/Siemens DVB-Cable (ves1820/Philips CD1516(??)) av7110->fe = ves1820_attach(&philips_cd1516_config, &av7110->i2c_adap, read_pwm(av7110)); - if (av7110->fe) { - av7110->fe->ops.tuner_ops.set_params = philips_cd1516_tuner_set_params; - } break; } @@ -2094,10 +2276,9 @@ static int frontend_init(struct av7110 *av7110) // try the ALPS BSRV2 first of all av7110->fe = ves1x93_attach(&alps_bsrv2_config, &av7110->i2c_adap); if (av7110->fe) { - av7110->fe->ops.tuner_ops.set_params = alps_bsrv2_tuner_set_params; - av7110->fe->ops.diseqc_send_master_cmd = av7110_diseqc_send_master_cmd; - av7110->fe->ops.diseqc_send_burst = av7110_diseqc_send_burst; - av7110->fe->ops.set_tone = av7110_set_tone; + av7110->fe->ops->diseqc_send_master_cmd = av7110_diseqc_send_master_cmd; + av7110->fe->ops->diseqc_send_burst = av7110_diseqc_send_burst; + av7110->fe->ops->set_tone = av7110_set_tone; av7110->recover = dvb_s_recover; break; } @@ -2105,12 +2286,9 @@ static int frontend_init(struct av7110 *av7110) // try the ALPS BSRU6 now av7110->fe = stv0299_attach(&alps_bsru6_config, &av7110->i2c_adap); if (av7110->fe) { - av7110->fe->ops.tuner_ops.set_params = alps_bsru6_tuner_set_params; - av7110->fe->tuner_priv = &av7110->i2c_adap; - - av7110->fe->ops.diseqc_send_master_cmd = av7110_diseqc_send_master_cmd; - av7110->fe->ops.diseqc_send_burst = av7110_diseqc_send_burst; - av7110->fe->ops.set_tone = av7110_set_tone; + av7110->fe->ops->diseqc_send_master_cmd = av7110_diseqc_send_master_cmd; + av7110->fe->ops->diseqc_send_burst = av7110_diseqc_send_burst; + av7110->fe->ops->set_tone = av7110_set_tone; av7110->recover = dvb_s_recover; break; } @@ -2118,10 +2296,9 @@ static int frontend_init(struct av7110 *av7110) // Try the grundig 29504-451 av7110->fe = tda8083_attach(&grundig_29504_451_config, &av7110->i2c_adap); if (av7110->fe) { - av7110->fe->ops.tuner_ops.set_params = grundig_29504_451_tuner_set_params; - av7110->fe->ops.diseqc_send_master_cmd = av7110_diseqc_send_master_cmd; - av7110->fe->ops.diseqc_send_burst = av7110_diseqc_send_burst; - av7110->fe->ops.set_tone = av7110_set_tone; + av7110->fe->ops->diseqc_send_master_cmd = av7110_diseqc_send_master_cmd; + av7110->fe->ops->diseqc_send_burst = av7110_diseqc_send_burst; + av7110->fe->ops->set_tone = av7110_set_tone; av7110->recover = dvb_s_recover; break; } @@ -2132,17 +2309,11 @@ static int frontend_init(struct av7110 *av7110) /* Siemens DVB-C (full-length card) VES1820/Philips CD1516 */ av7110->fe = ves1820_attach(&philips_cd1516_config, &av7110->i2c_adap, read_pwm(av7110)); - if (av7110->fe) { - av7110->fe->ops.tuner_ops.set_params = philips_cd1516_tuner_set_params; - } break; case 0x0003: - /* Hauppauge DVB-C 2.1 VES1820/ALPS TDBE2 */ + /* Haupauge DVB-C 2.1 VES1820/ALPS TDBE2 */ av7110->fe = ves1820_attach(&alps_tdbe2_config, &av7110->i2c_adap, read_pwm(av7110)); - if (av7110->fe) { - av7110->fe->ops.tuner_ops.set_params = alps_tdbe2_tuner_set_params; - } break; } break; @@ -2151,27 +2322,20 @@ static int frontend_init(struct av7110 *av7110) // ALPS TDLB7 av7110->fe = sp8870_attach(&alps_tdlb7_config, &av7110->i2c_adap); - if (av7110->fe) { - av7110->fe->ops.tuner_ops.set_params = alps_tdlb7_tuner_set_params; - } break; case 0x0002: // Hauppauge/TT DVB-C premium rev2.X av7110->fe = ves1820_attach(&alps_tdbe2_config, &av7110->i2c_adap, read_pwm(av7110)); - if (av7110->fe) { - av7110->fe->ops.tuner_ops.set_params = alps_tdbe2_tuner_set_params; - } break; case 0x0004: // Galaxis DVB-S rev1.3 /* ALPS BSRV2 */ av7110->fe = ves1x93_attach(&alps_bsrv2_config, &av7110->i2c_adap); if (av7110->fe) { - av7110->fe->ops.tuner_ops.set_params = alps_bsrv2_tuner_set_params; - av7110->fe->ops.diseqc_send_master_cmd = av7110_diseqc_send_master_cmd; - av7110->fe->ops.diseqc_send_burst = av7110_diseqc_send_burst; - av7110->fe->ops.set_tone = av7110_set_tone; + av7110->fe->ops->diseqc_send_master_cmd = av7110_diseqc_send_master_cmd; + av7110->fe->ops->diseqc_send_burst = av7110_diseqc_send_burst; + av7110->fe->ops->set_tone = av7110_set_tone; av7110->recover = dvb_s_recover; } break; @@ -2180,10 +2344,9 @@ static int frontend_init(struct av7110 *av7110) /* Grundig 29504-451 */ av7110->fe = tda8083_attach(&grundig_29504_451_config, &av7110->i2c_adap); if (av7110->fe) { - av7110->fe->ops.tuner_ops.set_params = grundig_29504_451_tuner_set_params; - av7110->fe->ops.diseqc_send_master_cmd = av7110_diseqc_send_master_cmd; - av7110->fe->ops.diseqc_send_burst = av7110_diseqc_send_burst; - av7110->fe->ops.set_tone = av7110_set_tone; + av7110->fe->ops->diseqc_send_master_cmd = av7110_diseqc_send_master_cmd; + av7110->fe->ops->diseqc_send_burst = av7110_diseqc_send_burst; + av7110->fe->ops->set_tone = av7110_set_tone; av7110->recover = dvb_s_recover; } break; @@ -2191,20 +2354,15 @@ static int frontend_init(struct av7110 *av7110) case 0x0008: // Hauppauge/TT DVB-T av7110->fe = l64781_attach(&grundig_29504_401_config, &av7110->i2c_adap); - if (av7110->fe) { - av7110->fe->ops.tuner_ops.set_params = grundig_29504_401_tuner_set_params; - } break; case 0x000A: // Hauppauge/TT Nexus-CA rev1.X av7110->fe = stv0297_attach(&nexusca_stv0297_config, &av7110->i2c_adap); if (av7110->fe) { - av7110->fe->ops.tuner_ops.set_params = nexusca_stv0297_tuner_set_params; - /* set TDA9819 into DVB mode */ - saa7146_setgpio(av7110->dev, 1, SAA7146_GPIO_OUTLO); // TDA9819 pin9(STD) - saa7146_setgpio(av7110->dev, 3, SAA7146_GPIO_OUTLO); // TDA9819 pin30(VIF) + saa7146_setgpio(av7110->dev, 1, SAA7146_GPIO_OUTLO); // TDA9198 pin9(STD) + saa7146_setgpio(av7110->dev, 3, SAA7146_GPIO_OUTLO); // TDA9198 pin30(VIF) /* tuner on this needs a slower i2c bus speed */ av7110->dev->i2c_bitrate = SAA7146_I2C_BUS_BIT_RATE_240; @@ -2216,18 +2374,9 @@ static int frontend_init(struct av7110 *av7110) /* ALPS BSBE1 */ av7110->fe = stv0299_attach(&alps_bsbe1_config, &av7110->i2c_adap); if (av7110->fe) { - av7110->fe->ops.tuner_ops.set_params = alps_bsbe1_tuner_set_params; - av7110->fe->tuner_priv = &av7110->i2c_adap; - - if (lnbp21_attach(av7110->fe, &av7110->i2c_adap, 0, 0)) { - printk("dvb-ttpci: LNBP21 not found!\n"); - if (av7110->fe->ops.release) - av7110->fe->ops.release(av7110->fe); - av7110->fe = NULL; - } else { - av7110->fe->ops.dishnetwork_send_legacy_command = NULL; - av7110->recover = dvb_s_recover; - } + av7110->fe->ops->set_voltage = lnbp21_set_voltage; + av7110->fe->ops->dishnetwork_send_legacy_command = NULL; + av7110->recover = dvb_s_recover; } break; } @@ -2242,21 +2391,21 @@ static int frontend_init(struct av7110 *av7110) av7110->dev->pci->subsystem_vendor, av7110->dev->pci->subsystem_device); } else { - FE_FUNC_OVERRIDE(av7110->fe->ops.init, av7110->fe_init, av7110_fe_init); - FE_FUNC_OVERRIDE(av7110->fe->ops.read_status, av7110->fe_read_status, av7110_fe_read_status); - FE_FUNC_OVERRIDE(av7110->fe->ops.diseqc_reset_overload, av7110->fe_diseqc_reset_overload, av7110_fe_diseqc_reset_overload); - FE_FUNC_OVERRIDE(av7110->fe->ops.diseqc_send_master_cmd, av7110->fe_diseqc_send_master_cmd, av7110_fe_diseqc_send_master_cmd); - FE_FUNC_OVERRIDE(av7110->fe->ops.diseqc_send_burst, av7110->fe_diseqc_send_burst, av7110_fe_diseqc_send_burst); - FE_FUNC_OVERRIDE(av7110->fe->ops.set_tone, av7110->fe_set_tone, av7110_fe_set_tone); - FE_FUNC_OVERRIDE(av7110->fe->ops.set_voltage, av7110->fe_set_voltage, av7110_fe_set_voltage;) - FE_FUNC_OVERRIDE(av7110->fe->ops.dishnetwork_send_legacy_command, av7110->fe_dishnetwork_send_legacy_command, av7110_fe_dishnetwork_send_legacy_command); - FE_FUNC_OVERRIDE(av7110->fe->ops.set_frontend, av7110->fe_set_frontend, av7110_fe_set_frontend); + FE_FUNC_OVERRIDE(av7110->fe->ops->init, av7110->fe_init, av7110_fe_init); + FE_FUNC_OVERRIDE(av7110->fe->ops->read_status, av7110->fe_read_status, av7110_fe_read_status); + FE_FUNC_OVERRIDE(av7110->fe->ops->diseqc_reset_overload, av7110->fe_diseqc_reset_overload, av7110_fe_diseqc_reset_overload); + FE_FUNC_OVERRIDE(av7110->fe->ops->diseqc_send_master_cmd, av7110->fe_diseqc_send_master_cmd, av7110_fe_diseqc_send_master_cmd); + FE_FUNC_OVERRIDE(av7110->fe->ops->diseqc_send_burst, av7110->fe_diseqc_send_burst, av7110_fe_diseqc_send_burst); + FE_FUNC_OVERRIDE(av7110->fe->ops->set_tone, av7110->fe_set_tone, av7110_fe_set_tone); + FE_FUNC_OVERRIDE(av7110->fe->ops->set_voltage, av7110->fe_set_voltage, av7110_fe_set_voltage;) + FE_FUNC_OVERRIDE(av7110->fe->ops->dishnetwork_send_legacy_command, av7110->fe_dishnetwork_send_legacy_command, av7110_fe_dishnetwork_send_legacy_command); + FE_FUNC_OVERRIDE(av7110->fe->ops->set_frontend, av7110->fe_set_frontend, av7110_fe_set_frontend); ret = dvb_register_frontend(&av7110->dvb_adapter, av7110->fe); if (ret < 0) { printk("av7110: Frontend registration failed!\n"); - if (av7110->fe->ops.release) - av7110->fe->ops.release(av7110->fe); + if (av7110->fe->ops->release) + av7110->fe->ops->release(av7110->fe); av7110->fe = NULL; } } @@ -2443,7 +2592,7 @@ static int __devinit av7110_attach(struct saa7146_dev* dev, goto err_kfree_0; ret = dvb_register_adapter(&av7110->dvb_adapter, av7110->card_name, - THIS_MODULE, &dev->pci->dev); + THIS_MODULE); if (ret < 0) goto err_put_firmware_1; @@ -2565,19 +2714,16 @@ static int __devinit av7110_attach(struct saa7146_dev* dev, tasklet_init (&av7110->debi_tasklet, debiirq, (unsigned long) av7110); tasklet_init (&av7110->gpio_tasklet, gpioirq, (unsigned long) av7110); - mutex_init(&av7110->pid_mutex); + sema_init(&av7110->pid_mutex, 1); /* locks for data transfers from/to AV7110 */ spin_lock_init(&av7110->debilock); - mutex_init(&av7110->dcomlock); + sema_init(&av7110->dcomlock, 1); av7110->debitype = -1; /* default OSD window */ av7110->osdwin = 1; - mutex_init(&av7110->osd_mutex); - - /* TV standard */ - av7110->vidmode = tv_standard == 1 ? VIDEO_MODE_NTSC : VIDEO_MODE_PAL; + sema_init(&av7110->osd_sema, 1); /* ARM "watchdog" */ init_waitqueue_head(&av7110->arm_wait); diff --git a/drivers/media/dvb/ttpci/av7110.h b/drivers/media/dvb/ttpci/av7110.h index 9c79696da..fafd25fab 100644 --- a/drivers/media/dvb/ttpci/av7110.h +++ b/drivers/media/dvb/ttpci/av7110.h @@ -6,13 +6,16 @@ #include #include +#ifdef CONFIG_DEVFS_FS +#include +#endif + #include #include #include #include #include #include -#include #include "dvbdev.h" #include "demux.h" @@ -124,7 +127,7 @@ struct av7110 { /* DEBI and polled command interface */ spinlock_t debilock; - struct mutex dcomlock; + struct semaphore dcomlock; volatile int debitype; volatile int debilen; @@ -143,7 +146,7 @@ struct av7110 { int osdwin; /* currently active window */ u16 osdbpp[8]; - struct mutex osd_mutex; + struct semaphore osd_sema; /* CA */ @@ -169,7 +172,7 @@ struct av7110 { struct tasklet_struct vpe_tasklet; int fe_synced; - struct mutex pid_mutex; + struct semaphore pid_mutex; int video_blank; struct video_status videostate; diff --git a/drivers/media/dvb/ttpci/av7110_av.c b/drivers/media/dvb/ttpci/av7110_av.c index 0f3a044ae..400facec7 100644 --- a/drivers/media/dvb/ttpci/av7110_av.c +++ b/drivers/media/dvb/ttpci/av7110_av.c @@ -318,17 +318,7 @@ int av7110_set_volume(struct av7110 *av7110, int volleft, int volright) msp_writereg(av7110, MSP_WR_DSP, 0x0000, val); /* loudspeaker */ msp_writereg(av7110, MSP_WR_DSP, 0x0006, val); /* headphonesr */ return 0; - - case DVB_ADAC_MSP34x5: - vol = (volleft > volright) ? volleft : volright; - val = (vol * 0x73 / 255) << 8; - if (vol > 0) - balance = ((volright - volleft) * 127) / vol; - msp_writereg(av7110, MSP_WR_DSP, 0x0001, balance << 8); - msp_writereg(av7110, MSP_WR_DSP, 0x0000, val); /* loudspeaker */ - return 0; } - return 0; } @@ -1277,32 +1267,23 @@ static int dvb_audio_ioctl(struct inode *inode, struct file *file, switch(av7110->audiostate.channel_select) { case AUDIO_STEREO: ret = audcom(av7110, AUDIO_CMD_STEREO); - if (!ret) { + if (!ret) if (av7110->adac_type == DVB_ADAC_CRYSTAL) i2c_writereg(av7110, 0x20, 0x02, 0x49); - else if (av7110->adac_type == DVB_ADAC_MSP34x5) - msp_writereg(av7110, MSP_WR_DSP, 0x0008, 0x0220); - } break; case AUDIO_MONO_LEFT: ret = audcom(av7110, AUDIO_CMD_MONO_L); - if (!ret) { + if (!ret) if (av7110->adac_type == DVB_ADAC_CRYSTAL) i2c_writereg(av7110, 0x20, 0x02, 0x4a); - else if (av7110->adac_type == DVB_ADAC_MSP34x5) - msp_writereg(av7110, MSP_WR_DSP, 0x0008, 0x0200); - } break; case AUDIO_MONO_RIGHT: ret = audcom(av7110, AUDIO_CMD_MONO_R); - if (!ret) { + if (!ret) if (av7110->adac_type == DVB_ADAC_CRYSTAL) i2c_writereg(av7110, 0x20, 0x02, 0x45); - else if (av7110->adac_type == DVB_ADAC_MSP34x5) - msp_writereg(av7110, MSP_WR_DSP, 0x0008, 0x0210); - } break; default: @@ -1498,6 +1479,8 @@ int av7110_av_init(struct av7110 *av7110) void (*play[])(u8 *, int, void *) = { play_audio_cb, play_video_cb }; int i, ret; + av7110->vidmode = VIDEO_MODE_PAL; + for (i = 0; i < 2; i++) { struct ipack *ipack = av7110->ipack + i; diff --git a/drivers/media/dvb/ttpci/av7110_hw.c b/drivers/media/dvb/ttpci/av7110_hw.c index 75736f2fe..0bb6e74ae 100644 --- a/drivers/media/dvb/ttpci/av7110_hw.c +++ b/drivers/media/dvb/ttpci/av7110_hw.c @@ -327,10 +327,10 @@ int av7110_wait_msgstate(struct av7110 *av7110, u16 flags) start = jiffies; for (;;) { err = time_after(jiffies, start + ARM_WAIT_FREE); - if (mutex_lock_interruptible(&av7110->dcomlock)) + if (down_interruptible(&av7110->dcomlock)) return -ERESTARTSYS; stat = rdebi(av7110, DEBINOSWAP, MSGSTATE, 0, 2); - mutex_unlock(&av7110->dcomlock); + up(&av7110->dcomlock); if ((stat & flags) == 0) break; if (err) { @@ -487,11 +487,11 @@ static int av7110_send_fw_cmd(struct av7110 *av7110, u16* buf, int length) dprintk(1, "arm not ready.\n"); return -1; } - if (mutex_lock_interruptible(&av7110->dcomlock)) + if (down_interruptible(&av7110->dcomlock)) return -ERESTARTSYS; ret = __av7110_send_fw_cmd(av7110, buf, length); - mutex_unlock(&av7110->dcomlock); + up(&av7110->dcomlock); if (ret && ret!=-ERESTARTSYS) printk(KERN_ERR "dvb-ttpci: %s(): av7110_send_fw_cmd error %d\n", __FUNCTION__, ret); @@ -563,11 +563,11 @@ int av7110_fw_request(struct av7110 *av7110, u16 *request_buf, return -1; } - if (mutex_lock_interruptible(&av7110->dcomlock)) + if (down_interruptible(&av7110->dcomlock)) return -ERESTARTSYS; if ((err = __av7110_send_fw_cmd(av7110, request_buf, request_buf_len)) < 0) { - mutex_unlock(&av7110->dcomlock); + up(&av7110->dcomlock); printk(KERN_ERR "dvb-ttpci: av7110_fw_request error %d\n", err); return err; } @@ -579,7 +579,7 @@ int av7110_fw_request(struct av7110 *av7110, u16 *request_buf, break; if (err) { printk(KERN_ERR "%s: timeout waiting for COMMAND to complete\n", __FUNCTION__); - mutex_unlock(&av7110->dcomlock); + up(&av7110->dcomlock); return -ETIMEDOUT; } #ifdef _NOHANDSHAKE @@ -595,7 +595,7 @@ int av7110_fw_request(struct av7110 *av7110, u16 *request_buf, break; if (err) { printk(KERN_ERR "%s: timeout waiting for HANDSHAKE_REG\n", __FUNCTION__); - mutex_unlock(&av7110->dcomlock); + up(&av7110->dcomlock); return -ETIMEDOUT; } msleep(1); @@ -606,12 +606,12 @@ int av7110_fw_request(struct av7110 *av7110, u16 *request_buf, stat = rdebi(av7110, DEBINOSWAP, MSGSTATE, 0, 2); if (stat & GPMQOver) { printk(KERN_ERR "%s: GPMQOver\n", __FUNCTION__); - mutex_unlock(&av7110->dcomlock); + up(&av7110->dcomlock); return -1; } else if (stat & OSDQOver) { printk(KERN_ERR "%s: OSDQOver\n", __FUNCTION__); - mutex_unlock(&av7110->dcomlock); + up(&av7110->dcomlock); return -1; } #endif @@ -619,7 +619,7 @@ int av7110_fw_request(struct av7110 *av7110, u16 *request_buf, for (i = 0; i < reply_buf_len; i++) reply_buf[i] = rdebi(av7110, DEBINOSWAP, COM_BUFF + 2 * i, 0, 2); - mutex_unlock(&av7110->dcomlock); + up(&av7110->dcomlock); return 0; } @@ -735,7 +735,7 @@ static int FlushText(struct av7110 *av7110) unsigned long start; int err; - if (mutex_lock_interruptible(&av7110->dcomlock)) + if (down_interruptible(&av7110->dcomlock)) return -ERESTARTSYS; start = jiffies; while (1) { @@ -745,12 +745,12 @@ static int FlushText(struct av7110 *av7110) if (err) { printk(KERN_ERR "dvb-ttpci: %s(): timeout waiting for BUFF1_BASE == 0\n", __FUNCTION__); - mutex_unlock(&av7110->dcomlock); + up(&av7110->dcomlock); return -ETIMEDOUT; } msleep(1); } - mutex_unlock(&av7110->dcomlock); + up(&av7110->dcomlock); return 0; } @@ -761,7 +761,7 @@ static int WriteText(struct av7110 *av7110, u8 win, u16 x, u16 y, u8* buf) int length = strlen(buf) + 1; u16 cbuf[5] = { (COMTYPE_OSD << 8) + DText, 3, win, x, y }; - if (mutex_lock_interruptible(&av7110->dcomlock)) + if (down_interruptible(&av7110->dcomlock)) return -ERESTARTSYS; start = jiffies; @@ -772,7 +772,7 @@ static int WriteText(struct av7110 *av7110, u8 win, u16 x, u16 y, u8* buf) if (ret) { printk(KERN_ERR "dvb-ttpci: %s: timeout waiting for BUFF1_BASE == 0\n", __FUNCTION__); - mutex_unlock(&av7110->dcomlock); + up(&av7110->dcomlock); return -ETIMEDOUT; } msleep(1); @@ -786,7 +786,7 @@ static int WriteText(struct av7110 *av7110, u8 win, u16 x, u16 y, u8* buf) if (ret) { printk(KERN_ERR "dvb-ttpci: %s: timeout waiting for HANDSHAKE_REG\n", __FUNCTION__); - mutex_unlock(&av7110->dcomlock); + up(&av7110->dcomlock); return -ETIMEDOUT; } msleep(1); @@ -798,7 +798,7 @@ static int WriteText(struct av7110 *av7110, u8 win, u16 x, u16 y, u8* buf) if (length & 1) wdebi(av7110, DEBINOSWAP, BUFF1_BASE + i * 2, 0, 2); ret = __av7110_send_fw_cmd(av7110, cbuf, 5); - mutex_unlock(&av7110->dcomlock); + up(&av7110->dcomlock); if (ret && ret!=-ERESTARTSYS) printk(KERN_ERR "dvb-ttpci: WriteText error %d\n", ret); return ret; @@ -1062,7 +1062,7 @@ int av7110_osd_cmd(struct av7110 *av7110, osd_cmd_t *dc) { int ret; - if (mutex_lock_interruptible(&av7110->osd_mutex)) + if (down_interruptible(&av7110->osd_sema)) return -ERESTARTSYS; switch (dc->cmd) { @@ -1198,7 +1198,7 @@ int av7110_osd_cmd(struct av7110 *av7110, osd_cmd_t *dc) break; } - mutex_unlock(&av7110->osd_mutex); + up(&av7110->osd_sema); if (ret==-ERESTARTSYS) dprintk(1, "av7110_osd_cmd(%d) returns with -ERESTARTSYS\n",dc->cmd); else if (ret) diff --git a/drivers/media/dvb/ttpci/av7110_v4l.c b/drivers/media/dvb/ttpci/av7110_v4l.c index 6ffe53fdc..94cf38c7e 100644 --- a/drivers/media/dvb/ttpci/av7110_v4l.c +++ b/drivers/media/dvb/ttpci/av7110_v4l.c @@ -42,18 +42,7 @@ int msp_writereg(struct av7110 *av7110, u8 dev, u16 reg, u16 val) { u8 msg[5] = { dev, reg >> 8, reg & 0xff, val >> 8 , val & 0xff }; - struct i2c_msg msgs = { .flags = 0, .len = 5, .buf = msg }; - - switch (av7110->adac_type) { - case DVB_ADAC_MSP34x0: - msgs.addr = 0x40; - break; - case DVB_ADAC_MSP34x5: - msgs.addr = 0x42; - break; - default: - return 0; - } + struct i2c_msg msgs = { .flags = 0, .addr = 0x40, .len = 5, .buf = msg }; if (i2c_transfer(&av7110->i2c_adap, &msgs, 1) != 1) { dprintk(1, "dvb-ttpci: failed @ card %d, %u = %u\n", @@ -68,23 +57,10 @@ static int msp_readreg(struct av7110 *av7110, u8 dev, u16 reg, u16 *val) u8 msg1[3] = { dev, reg >> 8, reg & 0xff }; u8 msg2[2]; struct i2c_msg msgs[2] = { - { .flags = 0 , .len = 3, .buf = msg1 }, - { .flags = I2C_M_RD, .len = 2, .buf = msg2 } + { .flags = 0, .addr = 0x40, .len = 3, .buf = msg1 }, + { .flags = I2C_M_RD, .addr = 0x40, .len = 2, .buf = msg2 } }; - switch (av7110->adac_type) { - case DVB_ADAC_MSP34x0: - msgs[0].addr = 0x40; - msgs[1].addr = 0x40; - break; - case DVB_ADAC_MSP34x5: - msgs[0].addr = 0x42; - msgs[1].addr = 0x42; - break; - default: - return 0; - } - if (i2c_transfer(&av7110->i2c_adap, &msgs[0], 2) != 2) { dprintk(1, "dvb-ttpci: failed @ card %d, %u\n", av7110->dvb_adapter.num, reg); @@ -272,8 +248,8 @@ static int av7110_dvb_c_switch(struct saa7146_fh *fh) if (ves1820_writereg(dev, 0x09, 0x0f, 0x60)) dprintk(1, "setting band in demodulator failed.\n"); } else if (av7110->analog_tuner_flags & ANALOG_TUNER_STV0297) { - saa7146_setgpio(dev, 1, SAA7146_GPIO_OUTHI); // TDA9819 pin9(STD) - saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTHI); // TDA9819 pin30(VIF) + saa7146_setgpio(dev, 1, SAA7146_GPIO_OUTHI); // TDA9198 pin9(STD) + saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTHI); // TDA9198 pin30(VIF) } if (i2c_writereg(av7110, 0x48, 0x02, 0xd0) != 1) dprintk(1, "saa7113 write failed @ card %d", av7110->dvb_adapter.num); @@ -308,8 +284,8 @@ static int av7110_dvb_c_switch(struct saa7146_fh *fh) if (ves1820_writereg(dev, 0x09, 0x0f, 0x20)) dprintk(1, "setting band in demodulator failed.\n"); } else if (av7110->analog_tuner_flags & ANALOG_TUNER_STV0297) { - saa7146_setgpio(dev, 1, SAA7146_GPIO_OUTLO); // TDA9819 pin9(STD) - saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTLO); // TDA9819 pin30(VIF) + saa7146_setgpio(dev, 1, SAA7146_GPIO_OUTLO); // TDA9198 pin9(STD) + saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTLO); // TDA9198 pin30(VIF) } } @@ -393,11 +369,6 @@ static int av7110_ioctl(struct saa7146_fh *fh, unsigned int cmd, void *arg) fm_matrix = 0x3001; // stereo src = 0x0020; break; - case V4L2_TUNER_MODE_LANG1_LANG2: - dprintk(2, "VIDIOC_S_TUNER: V4L2_TUNER_MODE_LANG1_LANG2\n"); - fm_matrix = 0x3000; // bilingual - src = 0x0020; - break; case V4L2_TUNER_MODE_LANG1: dprintk(2, "VIDIOC_S_TUNER: V4L2_TUNER_MODE_LANG1\n"); fm_matrix = 0x3000; // mono @@ -608,11 +579,14 @@ static ssize_t av7110_vbi_write(struct file *file, const char __user *data, size return -EFAULT; if ((d.id != 0 && d.id != V4L2_SLICED_WSS_625) || d.field != 0 || d.line != 23) return -EINVAL; - if (d.id) + if (d.id) { av7110->wssData = ((d.data[1] << 8) & 0x3f00) | d.data[0]; - else - av7110->wssData = 0x8000; - rc = av7110_fw_cmd(av7110, COMTYPE_ENCODER, SetWSSConfig, 2, 1, av7110->wssData); + rc = av7110_fw_cmd(av7110, COMTYPE_ENCODER, SetWSSConfig, + 2, 1, av7110->wssData); + } else { + av7110->wssData = 0; + rc = av7110_fw_cmd(av7110, COMTYPE_ENCODER, SetWSSConfig, 1, 0); + } return (rc < 0) ? rc : count; } @@ -702,23 +676,17 @@ int av7110_init_analog_module(struct av7110 *av7110) { u16 version1, version2; - if (i2c_writereg(av7110, 0x80, 0x0, 0x80) == 1 && - i2c_writereg(av7110, 0x80, 0x0, 0) == 1) { - printk("dvb-ttpci: DVB-C analog module @ card %d detected, initializing MSP3400\n", - av7110->dvb_adapter.num); - av7110->adac_type = DVB_ADAC_MSP34x0; - } else if (i2c_writereg(av7110, 0x84, 0x0, 0x80) == 1 && - i2c_writereg(av7110, 0x84, 0x0, 0) == 1) { - printk("dvb-ttpci: DVB-C analog module @ card %d detected, initializing MSP3415\n", - av7110->dvb_adapter.num); - av7110->adac_type = DVB_ADAC_MSP34x5; - } else + if (i2c_writereg(av7110, 0x80, 0x0, 0x80) != 1 + || i2c_writereg(av7110, 0x80, 0x0, 0) != 1) return -ENODEV; + printk("dvb-ttpci: DVB-C analog module @ card %d detected, initializing MSP3400\n", + av7110->dvb_adapter.num); + av7110->adac_type = DVB_ADAC_MSP34x0; msleep(100); // the probing above resets the msp... msp_readreg(av7110, MSP_RD_DSP, 0x001e, &version1); msp_readreg(av7110, MSP_RD_DSP, 0x001f, &version2); - dprintk(1, "dvb-ttpci: @ card %d MSP34xx version 0x%04x 0x%04x\n", + dprintk(1, "dvb-ttpci: @ card %d MSP3400 version 0x%04x 0x%04x\n", av7110->dvb_adapter.num, version1, version2); msp_writereg(av7110, MSP_WR_DSP, 0x0013, 0x0c00); msp_writereg(av7110, MSP_WR_DSP, 0x0000, 0x7f00); // loudspeaker + headphone @@ -727,7 +695,7 @@ int av7110_init_analog_module(struct av7110 *av7110) msp_writereg(av7110, MSP_WR_DSP, 0x0004, 0x7f00); // loudspeaker volume msp_writereg(av7110, MSP_WR_DSP, 0x000a, 0x0220); // SCART 1 source msp_writereg(av7110, MSP_WR_DSP, 0x0007, 0x7f00); // SCART 1 volume - msp_writereg(av7110, MSP_WR_DSP, 0x000d, 0x1900); // prescale SCART + msp_writereg(av7110, MSP_WR_DSP, 0x000d, 0x4800); // prescale SCART if (i2c_writereg(av7110, 0x48, 0x01, 0x00)!=1) { INFO(("saa7113 not accessible.\n")); @@ -750,8 +718,8 @@ int av7110_init_analog_module(struct av7110 *av7110) if (ves1820_writereg(av7110->dev, 0x09, 0x0f, 0x20)) dprintk(1, "setting band in demodulator failed.\n"); } else if (av7110->analog_tuner_flags & ANALOG_TUNER_STV0297) { - saa7146_setgpio(av7110->dev, 1, SAA7146_GPIO_OUTLO); // TDA9819 pin9(STD) - saa7146_setgpio(av7110->dev, 3, SAA7146_GPIO_OUTLO); // TDA9819 pin30(VIF) + saa7146_setgpio(av7110->dev, 1, SAA7146_GPIO_OUTLO); // TDA9198 pin9(STD) + saa7146_setgpio(av7110->dev, 3, SAA7146_GPIO_OUTLO); // TDA9198 pin30(VIF) } /* init the saa7113 */ diff --git a/drivers/media/dvb/ttpci/budget-av.c b/drivers/media/dvb/ttpci/budget-av.c index 2d21fec23..adba47ce8 100644 --- a/drivers/media/dvb/ttpci/budget-av.c +++ b/drivers/media/dvb/ttpci/budget-av.c @@ -50,12 +50,6 @@ #define DEBICICAM 0x02420000 -#define SLOTSTATUS_NONE 1 -#define SLOTSTATUS_PRESENT 2 -#define SLOTSTATUS_RESET 4 -#define SLOTSTATUS_READY 8 -#define SLOTSTATUS_OCCUPIED (SLOTSTATUS_PRESENT|SLOTSTATUS_RESET|SLOTSTATUS_READY) - struct budget_av { struct budget budget; struct video_device *vd; @@ -64,20 +58,13 @@ struct budget_av { struct tasklet_struct ciintf_irq_tasklet; int slot_status; struct dvb_ca_en50221 ca; - u8 reinitialise_demod:1; - u8 tda10021_poclkp:1; - u8 tda10021_ts_enabled; - int (*tda10021_set_frontend)(struct dvb_frontend *fe, struct dvb_frontend_parameters *p); }; -static int ciintf_slot_shutdown(struct dvb_ca_en50221 *ca, int slot); - - -/* GPIO Connections: - * 0 - Vcc/Reset (Reset is controlled by capacitor). Resets the frontend *AS WELL*! - * 1 - CI memory select 0=>IO memory, 1=>Attribute Memory - * 2 - CI Card Enable (Active Low) - * 3 - CI Card Detect +/* GPIO CI Connections: + * 0 - Vcc/Reset (Reset is controlled by capacitor) + * 1 - Attribute Memory + * 2 - Card Enable (Active Low) + * 3 - Card Detect */ /**************************************************************************** @@ -142,10 +129,9 @@ static int ciintf_read_attribute_mem(struct dvb_ca_en50221 *ca, int slot, int ad udelay(1); result = ttpci_budget_debiread(&budget_av->budget, DEBICICAM, address & 0xfff, 1, 0, 1); - if (result == -ETIMEDOUT) { - ciintf_slot_shutdown(ca, slot); - printk(KERN_INFO "budget-av: cam ejected 1\n"); - } + + if (result == -ETIMEDOUT) + budget_av->slot_status = 0; return result; } @@ -161,10 +147,9 @@ static int ciintf_write_attribute_mem(struct dvb_ca_en50221 *ca, int slot, int a udelay(1); result = ttpci_budget_debiwrite(&budget_av->budget, DEBICICAM, address & 0xfff, 1, value, 0, 1); - if (result == -ETIMEDOUT) { - ciintf_slot_shutdown(ca, slot); - printk(KERN_INFO "budget-av: cam ejected 2\n"); - } + + if (result == -ETIMEDOUT) + budget_av->slot_status = 0; return result; } @@ -180,11 +165,9 @@ static int ciintf_read_cam_control(struct dvb_ca_en50221 *ca, int slot, u8 addre udelay(1); result = ttpci_budget_debiread(&budget_av->budget, DEBICICAM, address & 3, 1, 0, 0); - if ((result == -ETIMEDOUT) || ((result == 0xff) && ((address & 3) < 2))) { - ciintf_slot_shutdown(ca, slot); - printk(KERN_INFO "budget-av: cam ejected 3\n"); - return -ETIMEDOUT; - } + + if (result == -ETIMEDOUT) + budget_av->slot_status = 0; return result; } @@ -200,10 +183,9 @@ static int ciintf_write_cam_control(struct dvb_ca_en50221 *ca, int slot, u8 addr udelay(1); result = ttpci_budget_debiwrite(&budget_av->budget, DEBICICAM, address & 3, 1, value, 0, 0); - if (result == -ETIMEDOUT) { - ciintf_slot_shutdown(ca, slot); - printk(KERN_INFO "budget-av: cam ejected 5\n"); - } + + if (result == -ETIMEDOUT) + budget_av->slot_status = 0; return result; } @@ -211,12 +193,12 @@ static int ciintf_slot_reset(struct dvb_ca_en50221 *ca, int slot) { struct budget_av *budget_av = (struct budget_av *) ca->data; struct saa7146_dev *saa = budget_av->budget.dev; + int timeout = 50; // 5 seconds (4.4.6 Ready) if (slot != 0) return -EINVAL; dprintk(1, "ciintf_slot_reset\n"); - budget_av->slot_status = SLOTSTATUS_RESET; saa7146_setgpio(saa, 2, SAA7146_GPIO_OUTHI); /* disable card */ @@ -226,17 +208,17 @@ static int ciintf_slot_reset(struct dvb_ca_en50221 *ca, int slot) msleep(20); /* 20 ms Vcc settling time */ saa7146_setgpio(saa, 2, SAA7146_GPIO_OUTLO); /* enable card */ - ttpci_budget_set_video_port(saa, BUDGET_VIDEO_PORTB); - msleep(20); - /* reinitialise the frontend if necessary */ - if (budget_av->reinitialise_demod) - dvb_frontend_reinitialise(budget_av->budget.dvb_frontend); + /* This should have been based on pin 16 READY of the pcmcia port, + * but AFAICS it is not routed to the saa7146 */ + while (--timeout > 0 && ciintf_read_attribute_mem(ca, slot, 0) != 0x1d) + msleep(100); - /* set tda10021 back to original clock configuration on reset */ - if (budget_av->tda10021_poclkp) { - tda10021_write_byte(budget_av->budget.dvb_frontend, 0x12, 0xa0); - budget_av->tda10021_ts_enabled = 0; + if (timeout <= 0) + { + printk(KERN_ERR "budget-av: cam reset failed (timeout).\n"); + saa7146_setgpio(saa, 2, SAA7146_GPIO_OUTHI); /* disable card */ + return -ETIMEDOUT; } return 0; @@ -253,13 +235,7 @@ static int ciintf_slot_shutdown(struct dvb_ca_en50221 *ca, int slot) dprintk(1, "ciintf_slot_shutdown\n"); ttpci_budget_set_video_port(saa, BUDGET_VIDEO_PORTB); - budget_av->slot_status = SLOTSTATUS_NONE; - - /* set tda10021 back to original clock configuration when cam removed */ - if (budget_av->tda10021_poclkp) { - tda10021_write_byte(budget_av->budget.dvb_frontend, 0x12, 0xa0); - budget_av->tda10021_ts_enabled = 0; - } + budget_av->slot_status = 0; return 0; } @@ -274,13 +250,6 @@ static int ciintf_slot_ts_enable(struct dvb_ca_en50221 *ca, int slot) dprintk(1, "ciintf_slot_ts_enable: %d\n", budget_av->slot_status); ttpci_budget_set_video_port(saa, BUDGET_VIDEO_PORTA); - - /* tda10021 seems to need a different TS clock config when data is routed to the CAM */ - if (budget_av->tda10021_poclkp) { - tda10021_write_byte(budget_av->budget.dvb_frontend, 0x12, 0xa1); - budget_av->tda10021_ts_enabled = 1; - } - return 0; } @@ -288,61 +257,50 @@ static int ciintf_poll_slot_status(struct dvb_ca_en50221 *ca, int slot, int open { struct budget_av *budget_av = (struct budget_av *) ca->data; struct saa7146_dev *saa = budget_av->budget.dev; - int result; + int cam_present = 0; if (slot != 0) return -EINVAL; - /* test the card detect line - needs to be done carefully - * since it never goes high for some CAMs on this interface (e.g. topuptv) */ - if (budget_av->slot_status == SLOTSTATUS_NONE) { + if (!budget_av->slot_status) + { + // first of all test the card detect line saa7146_setgpio(saa, 3, SAA7146_GPIO_INPUT); udelay(1); - if (saa7146_read(saa, PSR) & MASK_06) { - if (budget_av->slot_status == SLOTSTATUS_NONE) { - budget_av->slot_status = SLOTSTATUS_PRESENT; - printk(KERN_INFO "budget-av: cam inserted A\n"); - } + if (saa7146_read(saa, PSR) & MASK_06) + { + cam_present = 1; } saa7146_setgpio(saa, 3, SAA7146_GPIO_OUTLO); - } - /* We also try and read from IO memory to work round the above detection bug. If - * there is no CAM, we will get a timeout. Only done if there is no cam - * present, since this test actually breaks some cams :( - * - * if the CI interface is not open, we also do the above test since we - * don't care if the cam has problems - we'll be resetting it on open() anyway */ - if ((budget_av->slot_status == SLOTSTATUS_NONE) || (!open)) { - saa7146_setgpio(budget_av->budget.dev, 1, SAA7146_GPIO_OUTLO); - result = ttpci_budget_debiread(&budget_av->budget, DEBICICAM, 0, 1, 0, 1); - if ((result >= 0) && (budget_av->slot_status == SLOTSTATUS_NONE)) { - budget_av->slot_status = SLOTSTATUS_PRESENT; - printk(KERN_INFO "budget-av: cam inserted B\n"); - } else if (result < 0) { - if (budget_av->slot_status != SLOTSTATUS_NONE) { - ciintf_slot_shutdown(ca, slot); - printk(KERN_INFO "budget-av: cam ejected 5\n"); - return 0; + // that is unreliable however, so try and read from IO memory + if (!cam_present) + { + saa7146_setgpio(budget_av->budget.dev, 1, SAA7146_GPIO_OUTLO); + if (ttpci_budget_debiread(&budget_av->budget, DEBICICAM, 0, 1, 0, 1) != -ETIMEDOUT) + { + cam_present = 1; } } - } - /* read from attribute memory in reset/ready state to know when the CAM is ready */ - if (budget_av->slot_status == SLOTSTATUS_RESET) { - result = ciintf_read_attribute_mem(ca, slot, 0); - if (result == 0x1d) { - budget_av->slot_status = SLOTSTATUS_READY; + // did we find something? + if (cam_present) { + printk(KERN_INFO "budget-av: cam inserted\n"); + budget_av->slot_status = 1; } - } - - /* work out correct return code */ - if (budget_av->slot_status != SLOTSTATUS_NONE) { - if (budget_av->slot_status & SLOTSTATUS_READY) { - return DVB_CA_EN50221_POLL_CAM_PRESENT | DVB_CA_EN50221_POLL_CAM_READY; + } else if (!open) { + saa7146_setgpio(budget_av->budget.dev, 1, SAA7146_GPIO_OUTLO); + if (ttpci_budget_debiread(&budget_av->budget, DEBICICAM, 0, 1, 0, 1) == -ETIMEDOUT) + { + printk(KERN_INFO "budget-av: cam ejected\n"); + saa7146_setgpio(saa, 2, SAA7146_GPIO_OUTHI); /* disable card */ + budget_av->slot_status = 0; } - return DVB_CA_EN50221_POLL_CAM_PRESENT; } + + if (budget_av->slot_status == 1) + return DVB_CA_EN50221_POLL_CAM_PRESENT | DVB_CA_EN50221_POLL_CAM_READY; + return 0; } @@ -372,8 +330,6 @@ static int ciintf_init(struct budget_av *budget_av) budget_av->ca.slot_ts_enable = ciintf_slot_ts_enable; budget_av->ca.poll_slot_status = ciintf_poll_slot_status; budget_av->ca.data = budget_av; - budget_av->budget.ci_present = 1; - budget_av->slot_status = SLOTSTATUS_NONE; if ((result = dvb_ca_en50221_init(&budget_av->budget.dvb_adapter, &budget_av->ca, 0, 1)) != 0) { @@ -382,6 +338,7 @@ static int ciintf_init(struct budget_av *budget_av) } printk(KERN_INFO "budget-av: ci interface initialised.\n"); + budget_av->budget.ci_present = 1; return 0; error: @@ -512,12 +469,12 @@ static int philips_su1278_ty_ci_set_symbol_rate(struct dvb_frontend *fe, u32 sra return 0; } -static int philips_su1278_ty_ci_tuner_set_params(struct dvb_frontend *fe, - struct dvb_frontend_parameters *params) +static int philips_su1278_ty_ci_pll_set(struct dvb_frontend *fe, + struct i2c_adapter *i2c, + struct dvb_frontend_parameters *params) { u32 div; u8 buf[4]; - struct budget *budget = (struct budget *) fe->dvb->priv; struct i2c_msg msg = {.addr = 0x61,.flags = 0,.buf = buf,.len = sizeof(buf) }; if ((params->frequency < 950000) || (params->frequency > 2150000)) @@ -541,9 +498,7 @@ static int philips_su1278_ty_ci_tuner_set_params(struct dvb_frontend *fe, else if (params->frequency < 2150000) buf[3] |= 0xC0; - if (fe->ops.i2c_gate_ctrl) - fe->ops.i2c_gate_ctrl(fe, 1); - if (i2c_transfer(&budget->i2c_adap, &msg, 1) != 1) + if (i2c_transfer(i2c, &msg, 1) != 1) return -EIO; return 0; } @@ -551,8 +506,9 @@ static int philips_su1278_ty_ci_tuner_set_params(struct dvb_frontend *fe, #define MIN2(a,b) ((a) < (b) ? (a) : (b)) #define MIN3(a,b,c) MIN2(MIN2(a,b),c) -static int philips_su1278sh2_tua6100_tuner_set_params(struct dvb_frontend *fe, - struct dvb_frontend_parameters *params) +static int philips_su1278sh2_tua6100_pll_set(struct dvb_frontend *fe, + struct i2c_adapter *i2c, + struct dvb_frontend_parameters *params) { u8 reg0 [2] = { 0x00, 0x00 }; u8 reg1 [4] = { 0x01, 0x00, 0x00, 0x00 }; @@ -562,7 +518,6 @@ static int philips_su1278sh2_tua6100_tuner_set_params(struct dvb_frontend *fe, int R, A, N, P, M; struct i2c_msg msg = {.addr = 0x60,.flags = 0,.buf = NULL,.len = 0 }; int freq = params->frequency; - struct budget *budget = (struct budget *) fe->dvb->priv; first_ZF = (freq) / 1000; @@ -662,25 +617,21 @@ static int philips_su1278sh2_tua6100_tuner_set_params(struct dvb_frontend *fe, reg0[1] |= 0x03; /* already enabled - do not reenable i2c repeater or TX fails */ - if (fe->ops.i2c_gate_ctrl) - fe->ops.i2c_gate_ctrl(fe, 1); msg.buf = reg0; msg.len = sizeof(reg0); - if (i2c_transfer(&budget->i2c_adap, &msg, 1) != 1) + if (i2c_transfer(i2c, &msg, 1) != 1) return -EIO; - if (fe->ops.i2c_gate_ctrl) - fe->ops.i2c_gate_ctrl(fe, 1); + stv0299_enable_plli2c(fe); msg.buf = reg1; msg.len = sizeof(reg1); - if (i2c_transfer(&budget->i2c_adap, &msg, 1) != 1) + if (i2c_transfer(i2c, &msg, 1) != 1) return -EIO; - if (fe->ops.i2c_gate_ctrl) - fe->ops.i2c_gate_ctrl(fe, 1); + stv0299_enable_plli2c(fe); msg.buf = reg2; msg.len = sizeof(reg2); - if (i2c_transfer(&budget->i2c_adap, &msg, 1) != 1) + if (i2c_transfer(i2c, &msg, 1) != 1) return -EIO; return 0; @@ -738,6 +689,7 @@ static struct stv0299_config typhoon_config = { .volt13_op0_op1 = STV0299_VOLT13_OP0, .min_delay_ms = 100, .set_symbol_rate = philips_su1278_ty_ci_set_symbol_rate, + .pll_set = philips_su1278_ty_ci_pll_set, }; @@ -751,6 +703,7 @@ static struct stv0299_config cinergy_1200s_config = { .volt13_op0_op1 = STV0299_VOLT13_OP0, .min_delay_ms = 100, .set_symbol_rate = philips_su1278_ty_ci_set_symbol_rate, + .pll_set = philips_su1278_ty_ci_pll_set, }; static struct stv0299_config cinergy_1200s_1894_0010_config = { @@ -763,9 +716,10 @@ static struct stv0299_config cinergy_1200s_1894_0010_config = { .volt13_op0_op1 = STV0299_VOLT13_OP0, .min_delay_ms = 100, .set_symbol_rate = philips_su1278_ty_ci_set_symbol_rate, + .pll_set = philips_su1278sh2_tua6100_pll_set, }; -static int philips_cu1216_tuner_set_params(struct dvb_frontend *fe, struct dvb_frontend_parameters *params) +static int philips_cu1216_pll_set(struct dvb_frontend *fe, struct dvb_frontend_parameters *params) { struct budget *budget = (struct budget *) fe->dvb->priv; u8 buf[4]; @@ -781,8 +735,6 @@ static int philips_cu1216_tuner_set_params(struct dvb_frontend *fe, struct dvb_f buf[3] = (params->frequency < 150000000 ? 0x01 : params->frequency < 445000000 ? 0x02 : 0x04); - if (fe->ops.i2c_gate_ctrl) - fe->ops.i2c_gate_ctrl(fe, 1); if (i2c_transfer(&budget->i2c_adap, &msg, 1) != 1) return -EIO; return 0; @@ -790,20 +742,19 @@ static int philips_cu1216_tuner_set_params(struct dvb_frontend *fe, struct dvb_f static struct tda10021_config philips_cu1216_config = { .demod_address = 0x0c, + .pll_set = philips_cu1216_pll_set, }; -static int philips_tu1216_tuner_init(struct dvb_frontend *fe) +static int philips_tu1216_pll_init(struct dvb_frontend *fe) { struct budget *budget = (struct budget *) fe->dvb->priv; static u8 tu1216_init[] = { 0x0b, 0xf5, 0x85, 0xab }; struct i2c_msg tuner_msg = {.addr = 0x60,.flags = 0,.buf = tu1216_init,.len = sizeof(tu1216_init) }; // setup PLL configuration - if (fe->ops.i2c_gate_ctrl) - fe->ops.i2c_gate_ctrl(fe, 1); if (i2c_transfer(&budget->i2c_adap, &tuner_msg, 1) != 1) return -EIO; msleep(1); @@ -811,7 +762,7 @@ static int philips_tu1216_tuner_init(struct dvb_frontend *fe) return 0; } -static int philips_tu1216_tuner_set_params(struct dvb_frontend *fe, struct dvb_frontend_parameters *params) +static int philips_tu1216_pll_set(struct dvb_frontend *fe, struct dvb_frontend_parameters *params) { struct budget *budget = (struct budget *) fe->dvb->priv; u8 tuner_buf[4]; @@ -885,8 +836,6 @@ static int philips_tu1216_tuner_set_params(struct dvb_frontend *fe, struct dvb_f tuner_buf[2] = 0xca; tuner_buf[3] = (cp << 5) | (filter << 3) | band; - if (fe->ops.i2c_gate_ctrl) - fe->ops.i2c_gate_ctrl(fe, 1); if (i2c_transfer(&budget->i2c_adap, &tuner_msg, 1) != 1) return -EIO; @@ -910,6 +859,9 @@ static struct tda1004x_config philips_tu1216_config = { .xtal_freq = TDA10046_XTAL_4M, .agc_config = TDA10046_AGC_DEFAULT, .if_freq = TDA10046_FREQ_3617, + .pll_init = philips_tu1216_pll_init, + .pll_set = philips_tu1216_pll_set, + .pll_sleep = NULL, .request_firmware = philips_tu1216_request_firmware, }; @@ -956,13 +908,13 @@ static u8 philips_sd1878_inittab[] = { 0xff, 0xff }; -static int philips_sd1878_tda8261_tuner_set_params(struct dvb_frontend *fe, - struct dvb_frontend_parameters *params) +static int philips_sd1878_tda8261_pll_set(struct dvb_frontend *fe, + struct i2c_adapter *i2c, + struct dvb_frontend_parameters *params) { u8 buf[4]; int rc; struct i2c_msg tuner_msg = {.addr=0x60,.flags=0,.buf=buf,.len=sizeof(buf)}; - struct budget *budget = (struct budget *) fe->dvb->priv; if((params->frequency < 950000) || (params->frequency > 2150000)) return -EINVAL; @@ -971,9 +923,7 @@ static int philips_sd1878_tda8261_tuner_set_params(struct dvb_frontend *fe, params->frequency, 0); if(rc < 0) return rc; - if (fe->ops.i2c_gate_ctrl) - fe->ops.i2c_gate_ctrl(fe, 1); - if(i2c_transfer(&budget->i2c_adap, &tuner_msg, 1) != 1) + if(i2c_transfer(i2c, &tuner_msg, 1) != 1) return -EIO; return 0; @@ -1016,7 +966,7 @@ static int philips_sd1878_ci_set_symbol_rate(struct dvb_frontend *fe, static struct stv0299_config philips_sd1878_config = { .demod_address = 0x68, - .inittab = philips_sd1878_inittab, + .inittab = philips_sd1878_inittab, .mclk = 88000000UL, .invert = 0, .skip_reinit = 0, @@ -1024,6 +974,7 @@ static struct stv0299_config philips_sd1878_config = { .volt13_op0_op1 = STV0299_VOLT13_OP0, .min_delay_ms = 100, .set_symbol_rate = philips_sd1878_ci_set_symbol_rate, + .pll_set = philips_sd1878_tda8261_pll_set, }; static u8 read_pwm(struct budget_av *budget_av) @@ -1049,8 +1000,6 @@ static u8 read_pwm(struct budget_av *budget_av) #define SUBID_DVBS_TV_STAR 0x0014 #define SUBID_DVBS_TV_STAR_CI 0x0016 -#define SUBID_DVBS_EASYWATCH_1 0x001a -#define SUBID_DVBS_EASYWATCH 0x001e #define SUBID_DVBC_KNC1 0x0020 #define SUBID_DVBC_KNC1_PLUS 0x0021 #define SUBID_DVBC_CINERGY1200 0x1156 @@ -1059,23 +1008,6 @@ static u8 read_pwm(struct budget_av *budget_av) #define SUBID_DVBT_KNC1 0x0030 #define SUBID_DVBT_CINERGY1200 0x1157 - -static int tda10021_set_frontend(struct dvb_frontend *fe, - struct dvb_frontend_parameters *p) -{ - struct budget_av* budget_av = fe->dvb->priv; - int result; - - result = budget_av->tda10021_set_frontend(fe, p); - if (budget_av->tda10021_ts_enabled) { - tda10021_write_byte(budget_av->budget.dvb_frontend, 0x12, 0xa1); - } else { - tda10021_write_byte(budget_av->budget.dvb_frontend, 0x12, 0xa0); - } - - return result; -} - static void frontend_init(struct budget_av *budget_av) { struct saa7146_dev * saa = budget_av->budget.dev; @@ -1084,7 +1016,6 @@ static void frontend_init(struct budget_av *budget_av) /* Enable / PowerON Frontend */ saa7146_setgpio(saa, 0, SAA7146_GPIO_OUTLO); - /* additional setup necessary for the PLUS cards */ switch (saa->pci->subsystem_device) { case SUBID_DVBS_KNC1_PLUS: case SUBID_DVBC_KNC1_PLUS: @@ -1096,84 +1027,55 @@ static void frontend_init(struct budget_av *budget_av) switch (saa->pci->subsystem_device) { case SUBID_DVBS_KNC1: - case SUBID_DVBS_EASYWATCH_1: if (saa->pci->subsystem_vendor == 0x1894) { fe = stv0299_attach(&cinergy_1200s_1894_0010_config, &budget_av->budget.i2c_adap); - if (fe) { - fe->ops.tuner_ops.set_params = philips_su1278sh2_tua6100_tuner_set_params; - } } else { fe = stv0299_attach(&typhoon_config, &budget_av->budget.i2c_adap); - if (fe) { - fe->ops.tuner_ops.set_params = philips_su1278_ty_ci_tuner_set_params; - } } break; case SUBID_DVBS_TV_STAR: case SUBID_DVBS_TV_STAR_CI: case SUBID_DVBS_CYNERGY1200N: - case SUBID_DVBS_EASYWATCH: fe = stv0299_attach(&philips_sd1878_config, &budget_av->budget.i2c_adap); - if (fe) { - fe->ops.tuner_ops.set_params = philips_sd1878_tda8261_tuner_set_params; - } break; case SUBID_DVBS_KNC1_PLUS: case SUBID_DVBS_TYPHOON: fe = stv0299_attach(&typhoon_config, &budget_av->budget.i2c_adap); - if (fe) { - fe->ops.tuner_ops.set_params = philips_su1278_ty_ci_tuner_set_params; - } break; case SUBID_DVBS_CINERGY1200: fe = stv0299_attach(&cinergy_1200s_config, &budget_av->budget.i2c_adap); - if (fe) { - fe->ops.tuner_ops.set_params = philips_su1278_ty_ci_tuner_set_params; - } break; case SUBID_DVBC_KNC1: - budget_av->reinitialise_demod = 1; + case SUBID_DVBC_KNC1_PLUS: fe = tda10021_attach(&philips_cu1216_config, &budget_av->budget.i2c_adap, read_pwm(budget_av)); - if (fe) { - fe->ops.tuner_ops.set_params = philips_cu1216_tuner_set_params; - } break; - case SUBID_DVBC_KNC1_PLUS: + case SUBID_DVBT_KNC1: + case SUBID_DVBT_KNC1_PLUS: + fe = tda10046_attach(&philips_tu1216_config, + &budget_av->budget.i2c_adap); + break; + case SUBID_DVBC_CINERGY1200: - budget_av->reinitialise_demod = 1; fe = tda10021_attach(&philips_cu1216_config, &budget_av->budget.i2c_adap, read_pwm(budget_av)); - if (fe) { - budget_av->tda10021_poclkp = 1; - budget_av->tda10021_set_frontend = fe->ops.set_frontend; - fe->ops.set_frontend = tda10021_set_frontend; - fe->ops.tuner_ops.set_params = philips_cu1216_tuner_set_params; - } break; - case SUBID_DVBT_KNC1: - case SUBID_DVBT_KNC1_PLUS: case SUBID_DVBT_CINERGY1200: - budget_av->reinitialise_demod = 1; fe = tda10046_attach(&philips_tu1216_config, &budget_av->budget.i2c_adap); - if (fe) { - fe->ops.tuner_ops.init = philips_tu1216_tuner_init; - fe->ops.tuner_ops.set_params = philips_tu1216_tuner_set_params; - } break; } @@ -1192,8 +1094,8 @@ static void frontend_init(struct budget_av *budget_av) if (dvb_register_frontend(&budget_av->budget.dvb_adapter, budget_av->budget.dvb_frontend)) { printk(KERN_ERR "budget-av: Frontend registration failed!\n"); - if (budget_av->budget.dvb_frontend->ops.release) - budget_av->budget.dvb_frontend->ops.release(budget_av->budget.dvb_frontend); + if (budget_av->budget.dvb_frontend->ops->release) + budget_av->budget.dvb_frontend->ops->release(budget_av->budget.dvb_frontend); budget_av->budget.dvb_frontend = NULL; } } @@ -1284,6 +1186,8 @@ static int budget_av_attach(struct saa7146_dev *dev, struct saa7146_pci_extensio SAA7146_HPS_SYNC_PORT_A); saa7113_setinput(budget_av, 0); + } else { + ciintf_init(budget_av); } /* fixme: find some sane values here... */ @@ -1302,9 +1206,6 @@ static int budget_av_attach(struct saa7146_dev *dev, struct saa7146_pci_extensio budget_av->budget.dvb_adapter.priv = budget_av; frontend_init(budget_av); - ciintf_init(budget_av); - - ttpci_budget_init_hooks(&budget_av->budget); return 0; } @@ -1385,8 +1286,6 @@ MAKE_BUDGET_INFO(knc1s, "KNC1 DVB-S", BUDGET_KNC1S); MAKE_BUDGET_INFO(knc1c, "KNC1 DVB-C", BUDGET_KNC1C); MAKE_BUDGET_INFO(knc1t, "KNC1 DVB-T", BUDGET_KNC1T); MAKE_BUDGET_INFO(kncxs, "KNC TV STAR DVB-S", BUDGET_TVSTAR); -MAKE_BUDGET_INFO(satewpls, "Satelco EasyWatch DVB-S light", BUDGET_TVSTAR); -MAKE_BUDGET_INFO(satewpls1, "Satelco EasyWatch DVB-S light", BUDGET_KNC1S); MAKE_BUDGET_INFO(knc1sp, "KNC1 DVB-S Plus", BUDGET_KNC1SP); MAKE_BUDGET_INFO(knc1cp, "KNC1 DVB-C Plus", BUDGET_KNC1CP); MAKE_BUDGET_INFO(knc1tp, "KNC1 DVB-T Plus", BUDGET_KNC1TP); @@ -1402,8 +1301,6 @@ static struct pci_device_id pci_tbl[] = { MAKE_EXTENSION_PCI(knc1sp, 0x1131, 0x0011), MAKE_EXTENSION_PCI(kncxs, 0x1894, 0x0014), MAKE_EXTENSION_PCI(kncxs, 0x1894, 0x0016), - MAKE_EXTENSION_PCI(satewpls, 0x1894, 0x001e), - MAKE_EXTENSION_PCI(satewpls1, 0x1894, 0x001a), MAKE_EXTENSION_PCI(knc1c, 0x1894, 0x0020), MAKE_EXTENSION_PCI(knc1cp, 0x1894, 0x0021), MAKE_EXTENSION_PCI(knc1t, 0x1894, 0x0030), diff --git a/drivers/media/dvb/ttpci/budget-ci.c b/drivers/media/dvb/ttpci/budget-ci.c index ffbbb3e34..b9b3cd9c0 100644 --- a/drivers/media/dvb/ttpci/budget-ci.c +++ b/drivers/media/dvb/ttpci/budget-ci.c @@ -42,9 +42,6 @@ #include "stv0299.h" #include "stv0297.h" #include "tda1004x.h" -#include "lnbp21.h" -#include "bsbe1.h" -#include "bsru6.h" #define DEBIADDR_IR 0x1234 #define DEBIADDR_CICONTROL 0x0000 @@ -71,7 +68,6 @@ struct budget_ci { struct tasklet_struct msp430_irq_tasklet; struct tasklet_struct ciintf_irq_tasklet; int slot_status; - int ci_irq; struct dvb_ca_en50221 ca; char ir_dev_name[50]; u8 tuner_pll_address; /* used for philips_tdm1316l configs */ @@ -277,10 +273,8 @@ static int ciintf_slot_reset(struct dvb_ca_en50221 *ca, int slot) if (slot != 0) return -EINVAL; - if (budget_ci->ci_irq) { - // trigger on RISING edge during reset so we know when READY is re-asserted - saa7146_setgpio(saa, 0, SAA7146_GPIO_IRQHI); - } + // trigger on RISING edge during reset so we know when READY is re-asserted + saa7146_setgpio(saa, 0, SAA7146_GPIO_IRQHI); budget_ci->slot_status = SLOTSTATUS_RESET; ttpci_budget_debiwrite(&budget_ci->budget, DEBICICTL, DEBIADDR_CICONTROL, 1, 0, 1, 0); msleep(1); @@ -373,50 +367,11 @@ static void ciintf_interrupt(unsigned long data) } } -static int ciintf_poll_slot_status(struct dvb_ca_en50221 *ca, int slot, int open) -{ - struct budget_ci *budget_ci = (struct budget_ci *) ca->data; - unsigned int flags; - - // ensure we don't get spurious IRQs during initialisation - if (!budget_ci->budget.ci_present) - return -EINVAL; - - // read the CAM status - flags = ttpci_budget_debiread(&budget_ci->budget, DEBICICTL, DEBIADDR_CICONTROL, 1, 1, 0); - if (flags & CICONTROL_CAMDETECT) { - // mark it as present if it wasn't before - if (budget_ci->slot_status & SLOTSTATUS_NONE) { - budget_ci->slot_status = SLOTSTATUS_PRESENT; - } - - // during a RESET, we check if we can read from IO memory to see when CAM is ready - if (budget_ci->slot_status & SLOTSTATUS_RESET) { - if (ciintf_read_attribute_mem(ca, slot, 0) == 0x1d) { - budget_ci->slot_status = SLOTSTATUS_READY; - } - } - } else { - budget_ci->slot_status = SLOTSTATUS_NONE; - } - - if (budget_ci->slot_status != SLOTSTATUS_NONE) { - if (budget_ci->slot_status & SLOTSTATUS_READY) { - return DVB_CA_EN50221_POLL_CAM_PRESENT | DVB_CA_EN50221_POLL_CAM_READY; - } - return DVB_CA_EN50221_POLL_CAM_PRESENT; - } - - return 0; -} - static int ciintf_init(struct budget_ci *budget_ci) { struct saa7146_dev *saa = budget_ci->budget.dev; int flags; int result; - int ci_version; - int ca_flags; memset(&budget_ci->ca, 0, sizeof(struct dvb_ca_en50221)); @@ -424,29 +379,16 @@ static int ciintf_init(struct budget_ci *budget_ci) saa7146_write(saa, MC1, saa7146_read(saa, MC1) | (0x800 << 16) | 0x800); // test if it is there - ci_version = ttpci_budget_debiread(&budget_ci->budget, DEBICICTL, DEBIADDR_CIVERSION, 1, 1, 0); - if ((ci_version & 0xa0) != 0xa0) { + if ((ttpci_budget_debiread(&budget_ci->budget, DEBICICTL, DEBIADDR_CIVERSION, 1, 1, 0) & 0xa0) != 0xa0) { result = -ENODEV; goto error; } - // determine whether a CAM is present or not flags = ttpci_budget_debiread(&budget_ci->budget, DEBICICTL, DEBIADDR_CICONTROL, 1, 1, 0); budget_ci->slot_status = SLOTSTATUS_NONE; if (flags & CICONTROL_CAMDETECT) budget_ci->slot_status = SLOTSTATUS_PRESENT; - // version 0xa2 of the CI firmware doesn't generate interrupts - if (ci_version == 0xa2) { - ca_flags = 0; - budget_ci->ci_irq = 0; - } else { - ca_flags = DVB_CA_EN50221_FLAG_IRQ_CAMCHANGE | - DVB_CA_EN50221_FLAG_IRQ_FR | - DVB_CA_EN50221_FLAG_IRQ_DA; - budget_ci->ci_irq = 1; - } - // register CI interface budget_ci->ca.owner = THIS_MODULE; budget_ci->ca.read_attribute_mem = ciintf_read_attribute_mem; @@ -456,27 +398,23 @@ static int ciintf_init(struct budget_ci *budget_ci) budget_ci->ca.slot_reset = ciintf_slot_reset; budget_ci->ca.slot_shutdown = ciintf_slot_shutdown; budget_ci->ca.slot_ts_enable = ciintf_slot_ts_enable; - budget_ci->ca.poll_slot_status = ciintf_poll_slot_status; budget_ci->ca.data = budget_ci; if ((result = dvb_ca_en50221_init(&budget_ci->budget.dvb_adapter, &budget_ci->ca, - ca_flags, 1)) != 0) { + DVB_CA_EN50221_FLAG_IRQ_CAMCHANGE | + DVB_CA_EN50221_FLAG_IRQ_FR | + DVB_CA_EN50221_FLAG_IRQ_DA, 1)) != 0) { printk("budget_ci: CI interface detected, but initialisation failed.\n"); goto error; } - // Setup CI slot IRQ - if (budget_ci->ci_irq) { - tasklet_init(&budget_ci->ciintf_irq_tasklet, ciintf_interrupt, (unsigned long) budget_ci); - if (budget_ci->slot_status != SLOTSTATUS_NONE) { - saa7146_setgpio(saa, 0, SAA7146_GPIO_IRQLO); - } else { - saa7146_setgpio(saa, 0, SAA7146_GPIO_IRQHI); - } - saa7146_write(saa, IER, saa7146_read(saa, IER) | MASK_03); + tasklet_init(&budget_ci->ciintf_irq_tasklet, ciintf_interrupt, (unsigned long) budget_ci); + if (budget_ci->slot_status != SLOTSTATUS_NONE) { + saa7146_setgpio(saa, 0, SAA7146_GPIO_IRQLO); + } else { + saa7146_setgpio(saa, 0, SAA7146_GPIO_IRQHI); } - - // enable interface + saa7146_write(saa, IER, saa7146_read(saa, IER) | MASK_03); ttpci_budget_debiwrite(&budget_ci->budget, DEBICICTL, DEBIADDR_CICONTROL, 1, CICONTROL_RESET, 1, 0); @@ -485,12 +423,10 @@ static int ciintf_init(struct budget_ci *budget_ci) budget_ci->budget.ci_present = 1; // forge a fake CI IRQ so the CAM state is setup correctly - if (budget_ci->ci_irq) { - flags = DVB_CA_EN50221_CAMCHANGE_REMOVED; - if (budget_ci->slot_status != SLOTSTATUS_NONE) - flags = DVB_CA_EN50221_CAMCHANGE_INSERTED; - dvb_ca_en50221_camchange_irq(&budget_ci->ca, 0, flags); - } + flags = DVB_CA_EN50221_CAMCHANGE_REMOVED; + if (budget_ci->slot_status != SLOTSTATUS_NONE) + flags = DVB_CA_EN50221_CAMCHANGE_INSERTED; + dvb_ca_en50221_camchange_irq(&budget_ci->ca, 0, flags); return 0; @@ -504,13 +440,9 @@ static void ciintf_deinit(struct budget_ci *budget_ci) struct saa7146_dev *saa = budget_ci->budget.dev; // disable CI interrupts - if (budget_ci->ci_irq) { - saa7146_write(saa, IER, saa7146_read(saa, IER) & ~MASK_03); - saa7146_setgpio(saa, 0, SAA7146_GPIO_INPUT); - tasklet_kill(&budget_ci->ciintf_irq_tasklet); - } - - // reset interface + saa7146_write(saa, IER, saa7146_read(saa, IER) & ~MASK_03); + saa7146_setgpio(saa, 0, SAA7146_GPIO_INPUT); + tasklet_kill(&budget_ci->ciintf_irq_tasklet); ttpci_budget_debiwrite(&budget_ci->budget, DEBICICTL, DEBIADDR_CICONTROL, 1, 0, 1, 0); msleep(1); ttpci_budget_debiwrite(&budget_ci->budget, DEBICICTL, DEBIADDR_CICONTROL, 1, @@ -538,10 +470,127 @@ static void budget_ci_irq(struct saa7146_dev *dev, u32 * isr) if (*isr & MASK_10) ttpci_budget_irq10_handler(dev, isr); - if ((*isr & MASK_03) && (budget_ci->budget.ci_present) && (budget_ci->ci_irq)) + if ((*isr & MASK_03) && (budget_ci->budget.ci_present)) tasklet_schedule(&budget_ci->ciintf_irq_tasklet); } + +static u8 alps_bsru6_inittab[] = { + 0x01, 0x15, + 0x02, 0x00, + 0x03, 0x00, + 0x04, 0x7d, /* F22FR = 0x7d, F22 = f_VCO / 128 / 0x7d = 22 kHz */ + 0x05, 0x35, /* I2CT = 0, SCLT = 1, SDAT = 1 */ + 0x06, 0x40, /* DAC not used, set to high impendance mode */ + 0x07, 0x00, /* DAC LSB */ + 0x08, 0x40, /* DiSEqC off, LNB power on OP2/LOCK pin on */ + 0x09, 0x00, /* FIFO */ + 0x0c, 0x51, /* OP1 ctl = Normal, OP1 val = 1 (LNB Power ON) */ + 0x0d, 0x82, /* DC offset compensation = ON, beta_agc1 = 2 */ + 0x0e, 0x23, /* alpha_tmg = 2, beta_tmg = 3 */ + 0x10, 0x3f, // AGC2 0x3d + 0x11, 0x84, + 0x12, 0xb9, + 0x15, 0xc9, // lock detector threshold + 0x16, 0x00, + 0x17, 0x00, + 0x18, 0x00, + 0x19, 0x00, + 0x1a, 0x00, + 0x1f, 0x50, + 0x20, 0x00, + 0x21, 0x00, + 0x22, 0x00, + 0x23, 0x00, + 0x28, 0x00, // out imp: normal out type: parallel FEC mode:0 + 0x29, 0x1e, // 1/2 threshold + 0x2a, 0x14, // 2/3 threshold + 0x2b, 0x0f, // 3/4 threshold + 0x2c, 0x09, // 5/6 threshold + 0x2d, 0x05, // 7/8 threshold + 0x2e, 0x01, + 0x31, 0x1f, // test all FECs + 0x32, 0x19, // viterbi and synchro search + 0x33, 0xfc, // rs control + 0x34, 0x93, // error control + 0x0f, 0x52, + 0xff, 0xff +}; + +static int alps_bsru6_set_symbol_rate(struct dvb_frontend *fe, u32 srate, u32 ratio) +{ + u8 aclk = 0; + u8 bclk = 0; + + if (srate < 1500000) { + aclk = 0xb7; + bclk = 0x47; + } else if (srate < 3000000) { + aclk = 0xb7; + bclk = 0x4b; + } else if (srate < 7000000) { + aclk = 0xb7; + bclk = 0x4f; + } else if (srate < 14000000) { + aclk = 0xb7; + bclk = 0x53; + } else if (srate < 30000000) { + aclk = 0xb6; + bclk = 0x53; + } else if (srate < 45000000) { + aclk = 0xb4; + bclk = 0x51; + } + + stv0299_writereg(fe, 0x13, aclk); + stv0299_writereg(fe, 0x14, bclk); + stv0299_writereg(fe, 0x1f, (ratio >> 16) & 0xff); + stv0299_writereg(fe, 0x20, (ratio >> 8) & 0xff); + stv0299_writereg(fe, 0x21, (ratio) & 0xf0); + + return 0; +} + +static int alps_bsru6_pll_set(struct dvb_frontend *fe, struct i2c_adapter *i2c, struct dvb_frontend_parameters *params) +{ + u8 buf[4]; + u32 div; + struct i2c_msg msg = {.addr = 0x61,.flags = 0,.buf = buf,.len = sizeof(buf) }; + + if ((params->frequency < 950000) || (params->frequency > 2150000)) + return -EINVAL; + + div = (params->frequency + (125 - 1)) / 125; // round correctly + buf[0] = (div >> 8) & 0x7f; + buf[1] = div & 0xff; + buf[2] = 0x80 | ((div & 0x18000) >> 10) | 4; + buf[3] = 0xC4; + + if (params->frequency > 1530000) + buf[3] = 0xc0; + + if (i2c_transfer(i2c, &msg, 1) != 1) + return -EIO; + return 0; +} + +static struct stv0299_config alps_bsru6_config = { + + .demod_address = 0x68, + .inittab = alps_bsru6_inittab, + .mclk = 88000000UL, + .invert = 1, + .skip_reinit = 0, + .lock_output = STV0229_LOCKOUTPUT_1, + .volt13_op0_op1 = STV0299_VOLT13_OP1, + .min_delay_ms = 100, + .set_symbol_rate = alps_bsru6_set_symbol_rate, + .pll_set = alps_bsru6_pll_set, +}; + + + + static u8 philips_su1278_tt_inittab[] = { 0x01, 0x0f, 0x02, 0x30, @@ -620,10 +669,10 @@ static int philips_su1278_tt_set_symbol_rate(struct dvb_frontend *fe, u32 srate, return 0; } -static int philips_su1278_tt_tuner_set_params(struct dvb_frontend *fe, - struct dvb_frontend_parameters *params) +static int philips_su1278_tt_pll_set(struct dvb_frontend *fe, + struct i2c_adapter *i2c, + struct dvb_frontend_parameters *params) { - struct budget_ci *budget_ci = (struct budget_ci *) fe->dvb->priv; u32 div; u8 buf[4]; struct i2c_msg msg = {.addr = 0x60,.flags = 0,.buf = buf,.len = sizeof(buf) }; @@ -649,9 +698,7 @@ static int philips_su1278_tt_tuner_set_params(struct dvb_frontend *fe, else if (params->frequency < 2150000) buf[3] |= 0xC0; - if (fe->ops.i2c_gate_ctrl) - fe->ops.i2c_gate_ctrl(fe, 1); - if (i2c_transfer(&budget_ci->budget.i2c_adap, &msg, 1) != 1) + if (i2c_transfer(i2c, &msg, 1) != 1) return -EIO; return 0; } @@ -667,11 +714,12 @@ static struct stv0299_config philips_su1278_tt_config = { .volt13_op0_op1 = STV0299_VOLT13_OP1, .min_delay_ms = 50, .set_symbol_rate = philips_su1278_tt_set_symbol_rate, + .pll_set = philips_su1278_tt_pll_set, }; -static int philips_tdm1316l_tuner_init(struct dvb_frontend *fe) +static int philips_tdm1316l_pll_init(struct dvb_frontend *fe) { struct budget_ci *budget_ci = (struct budget_ci *) fe->dvb->priv; static u8 td1316_init[] = { 0x0b, 0xf5, 0x85, 0xab }; @@ -680,8 +728,6 @@ static int philips_tdm1316l_tuner_init(struct dvb_frontend *fe) sizeof(td1316_init) }; // setup PLL configuration - if (fe->ops.i2c_gate_ctrl) - fe->ops.i2c_gate_ctrl(fe, 1); if (i2c_transfer(&budget_ci->budget.i2c_adap, &tuner_msg, 1) != 1) return -EIO; msleep(1); @@ -690,18 +736,14 @@ static int philips_tdm1316l_tuner_init(struct dvb_frontend *fe) tuner_msg.addr = 0x65; tuner_msg.buf = disable_mc44BC374c; tuner_msg.len = sizeof(disable_mc44BC374c); - if (fe->ops.i2c_gate_ctrl) - fe->ops.i2c_gate_ctrl(fe, 1); if (i2c_transfer(&budget_ci->budget.i2c_adap, &tuner_msg, 1) != 1) { - if (fe->ops.i2c_gate_ctrl) - fe->ops.i2c_gate_ctrl(fe, 1); i2c_transfer(&budget_ci->budget.i2c_adap, &tuner_msg, 1); } return 0; } -static int philips_tdm1316l_tuner_set_params(struct dvb_frontend *fe, struct dvb_frontend_parameters *params) +static int philips_tdm1316l_pll_set(struct dvb_frontend *fe, struct dvb_frontend_parameters *params) { struct budget_ci *budget_ci = (struct budget_ci *) fe->dvb->priv; u8 tuner_buf[4]; @@ -777,8 +819,6 @@ static int philips_tdm1316l_tuner_set_params(struct dvb_frontend *fe, struct dvb tuner_buf[2] = 0xca; tuner_buf[3] = (cp << 5) | (filter << 3) | band; - if (fe->ops.i2c_gate_ctrl) - fe->ops.i2c_gate_ctrl(fe, 1); if (i2c_transfer(&budget_ci->budget.i2c_adap, &tuner_msg, 1) != 1) return -EIO; @@ -802,10 +842,13 @@ static struct tda1004x_config philips_tdm1316l_config = { .xtal_freq = TDA10046_XTAL_4M, .agc_config = TDA10046_AGC_DEFAULT, .if_freq = TDA10046_FREQ_3617, + .pll_init = philips_tdm1316l_pll_init, + .pll_set = philips_tdm1316l_pll_set, + .pll_sleep = NULL, .request_firmware = philips_tdm1316l_request_firmware, }; -static int dvbc_philips_tdm1316l_tuner_set_params(struct dvb_frontend *fe, struct dvb_frontend_parameters *params) +static int dvbc_philips_tdm1316l_pll_set(struct dvb_frontend *fe, struct dvb_frontend_parameters *params) { struct budget_ci *budget_ci = (struct budget_ci *) fe->dvb->priv; u8 tuner_buf[5]; @@ -863,15 +906,13 @@ static int dvbc_philips_tdm1316l_tuner_set_params(struct dvb_frontend *fe, struc tuner_buf[3] = (cp << 5) | (filter << 3) | band; tuner_buf[4] = 0x80; - if (fe->ops.i2c_gate_ctrl) - fe->ops.i2c_gate_ctrl(fe, 1); + stv0297_enable_plli2c(fe); if (i2c_transfer(&budget_ci->budget.i2c_adap, &tuner_msg, 1) != 1) return -EIO; msleep(50); - if (fe->ops.i2c_gate_ctrl) - fe->ops.i2c_gate_ctrl(fe, 1); + stv0297_enable_plli2c(fe); if (i2c_transfer(&budget_ci->budget.i2c_adap, &tuner_msg, 1) != 1) return -EIO; @@ -977,7 +1018,7 @@ static struct stv0297_config dvbc_philips_tdm1316l_config = { .demod_address = 0x1c, .inittab = dvbc_philips_tdm1316l_inittab, .invert = 0, - .stop_during_read = 1, + .pll_set = dvbc_philips_tdm1316l_pll_set, }; @@ -990,8 +1031,6 @@ static void frontend_init(struct budget_ci *budget_ci) budget_ci->budget.dvb_frontend = stv0299_attach(&alps_bsru6_config, &budget_ci->budget.i2c_adap); if (budget_ci->budget.dvb_frontend) { - budget_ci->budget.dvb_frontend->ops.tuner_ops.set_params = alps_bsru6_tuner_set_params; - budget_ci->budget.dvb_frontend->tuner_priv = &budget_ci->budget.i2c_adap; break; } break; @@ -1000,7 +1039,6 @@ static void frontend_init(struct budget_ci *budget_ci) budget_ci->budget.dvb_frontend = stv0299_attach(&philips_su1278_tt_config, &budget_ci->budget.i2c_adap); if (budget_ci->budget.dvb_frontend) { - budget_ci->budget.dvb_frontend->ops.tuner_ops.set_params = philips_su1278_tt_tuner_set_params; break; } break; @@ -1010,7 +1048,6 @@ static void frontend_init(struct budget_ci *budget_ci) budget_ci->budget.dvb_frontend = stv0297_attach(&dvbc_philips_tdm1316l_config, &budget_ci->budget.i2c_adap); if (budget_ci->budget.dvb_frontend) { - budget_ci->budget.dvb_frontend->ops.tuner_ops.set_params = dvbc_philips_tdm1316l_tuner_set_params; break; } break; @@ -1020,8 +1057,6 @@ static void frontend_init(struct budget_ci *budget_ci) budget_ci->budget.dvb_frontend = tda10045_attach(&philips_tdm1316l_config, &budget_ci->budget.i2c_adap); if (budget_ci->budget.dvb_frontend) { - budget_ci->budget.dvb_frontend->ops.tuner_ops.init = philips_tdm1316l_tuner_init; - budget_ci->budget.dvb_frontend->ops.tuner_ops.set_params = philips_tdm1316l_tuner_set_params; break; } break; @@ -1031,28 +1066,9 @@ static void frontend_init(struct budget_ci *budget_ci) budget_ci->budget.dvb_frontend = tda10046_attach(&philips_tdm1316l_config, &budget_ci->budget.i2c_adap); if (budget_ci->budget.dvb_frontend) { - budget_ci->budget.dvb_frontend->ops.tuner_ops.init = philips_tdm1316l_tuner_init; - budget_ci->budget.dvb_frontend->ops.tuner_ops.set_params = philips_tdm1316l_tuner_set_params; break; } break; - - case 0x1017: // TT S-1500 PCI - budget_ci->budget.dvb_frontend = stv0299_attach(&alps_bsbe1_config, &budget_ci->budget.i2c_adap); - if (budget_ci->budget.dvb_frontend) { - budget_ci->budget.dvb_frontend->ops.tuner_ops.set_params = alps_bsbe1_tuner_set_params; - budget_ci->budget.dvb_frontend->tuner_priv = &budget_ci->budget.i2c_adap; - - budget_ci->budget.dvb_frontend->ops.dishnetwork_send_legacy_command = NULL; - if (lnbp21_attach(budget_ci->budget.dvb_frontend, &budget_ci->budget.i2c_adap, LNBP21_LLC, 0)) { - printk("%s: No LNBP21 found!\n", __FUNCTION__); - if (budget_ci->budget.dvb_frontend->ops.release) - budget_ci->budget.dvb_frontend->ops.release(budget_ci->budget.dvb_frontend); - budget_ci->budget.dvb_frontend = NULL; - } - } - - break; } if (budget_ci->budget.dvb_frontend == NULL) { @@ -1065,8 +1081,8 @@ static void frontend_init(struct budget_ci *budget_ci) if (dvb_register_frontend (&budget_ci->budget.dvb_adapter, budget_ci->budget.dvb_frontend)) { printk("budget-ci: Frontend registration failed!\n"); - if (budget_ci->budget.dvb_frontend->ops.release) - budget_ci->budget.dvb_frontend->ops.release(budget_ci->budget.dvb_frontend); + if (budget_ci->budget.dvb_frontend->ops->release) + budget_ci->budget.dvb_frontend->ops->release(budget_ci->budget.dvb_frontend); budget_ci->budget.dvb_frontend = NULL; } } @@ -1101,8 +1117,6 @@ static int budget_ci_attach(struct saa7146_dev *dev, struct saa7146_pci_extensio budget_ci->budget.dvb_adapter.priv = budget_ci; frontend_init(budget_ci); - ttpci_budget_init_hooks(&budget_ci->budget); - return 0; } @@ -1132,7 +1146,6 @@ static int budget_ci_detach(struct saa7146_dev *dev) static struct saa7146_extension budget_extension; -MAKE_BUDGET_INFO(ttbs2, "TT-Budget/S-1500 PCI", BUDGET_TT); MAKE_BUDGET_INFO(ttbci, "TT-Budget/WinTV-NOVA-CI PCI", BUDGET_TT_HW_DISEQC); MAKE_BUDGET_INFO(ttbt2, "TT-Budget/WinTV-NOVA-T PCI", BUDGET_TT); MAKE_BUDGET_INFO(ttbtci, "TT-Budget-T-CI PCI", BUDGET_TT); @@ -1144,7 +1157,6 @@ static struct pci_device_id pci_tbl[] = { MAKE_EXTENSION_PCI(ttbcci, 0x13c2, 0x1010), MAKE_EXTENSION_PCI(ttbt2, 0x13c2, 0x1011), MAKE_EXTENSION_PCI(ttbtci, 0x13c2, 0x1012), - MAKE_EXTENSION_PCI(ttbs2, 0x13c2, 0x1017), { .vendor = 0, } diff --git a/drivers/media/dvb/ttpci/budget-core.c b/drivers/media/dvb/ttpci/budget-core.c index e15562f81..633e68c34 100644 --- a/drivers/media/dvb/ttpci/budget-core.c +++ b/drivers/media/dvb/ttpci/budget-core.c @@ -39,21 +39,9 @@ #include "budget.h" #include "ttpci-eeprom.h" -#define TS_WIDTH (2 * TS_SIZE) -#define TS_WIDTH_ACTIVY TS_SIZE -#define TS_HEIGHT_MASK 0xf00 -#define TS_HEIGHT_MASK_ACTIVY 0xc00 -#define TS_MIN_BUFSIZE_K 188 -#define TS_MAX_BUFSIZE_K 1410 -#define TS_MAX_BUFSIZE_K_ACTIVY 564 -#define BUFFER_WARNING_WAIT (30*HZ) - int budget_debug; -static int dma_buffer_size = TS_MIN_BUFSIZE_K; module_param_named(debug, budget_debug, int, 0644); -module_param_named(bufsize, dma_buffer_size, int, 0444); MODULE_PARM_DESC(debug, "Turn on/off budget debugging (default:off)."); -MODULE_PARM_DESC(bufsize, "DMA buffer size in KB, default: 188, min: 188, max: 1410 (Activy: 564)"); /**************************************************************************** * TT budget / WinTV Nova @@ -63,6 +51,9 @@ static int stop_ts_capture(struct budget *budget) { dprintk(2, "budget: %p\n", budget); + if (--budget->feeding) + return budget->feeding; + saa7146_write(budget->dev, MC1, MASK_20); // DMA3 off SAA7146_IER_DISABLE(budget->dev, MASK_10); return 0; @@ -74,15 +65,16 @@ static int start_ts_capture(struct budget *budget) dprintk(2, "budget: %p\n", budget); - if (!budget->feeding || !budget->fe_synced) - return 0; + if (budget->feeding) + return ++budget->feeding; saa7146_write(dev, MC1, MASK_20); // DMA3 off - memset(budget->grabbing, 0x00, budget->buffer_size); + memset(budget->grabbing, 0x00, TS_HEIGHT * TS_WIDTH); saa7146_write(dev, PCI_BT_V1, 0x001c0000 | (saa7146_read(dev, PCI_BT_V1) & ~0x001f0000)); + budget->tsf = 0xff; budget->ttbp = 0; /* @@ -123,12 +115,16 @@ static int start_ts_capture(struct budget *budget) saa7146_write(dev, BASE_ODD3, 0); saa7146_write(dev, BASE_EVEN3, 0); - saa7146_write(dev, PROT_ADDR3, budget->buffer_size); + saa7146_write(dev, PROT_ADDR3, TS_WIDTH * TS_HEIGHT); saa7146_write(dev, BASE_PAGE3, budget->pt.dma | ME1 | 0x90); - saa7146_write(dev, PITCH3, budget->buffer_width); - saa7146_write(dev, NUM_LINE_BYTE3, - (budget->buffer_height << 16) | budget->buffer_width); + if (budget->card->type == BUDGET_FS_ACTIVY) { + saa7146_write(dev, PITCH3, TS_WIDTH / 2); + saa7146_write(dev, NUM_LINE_BYTE3, ((TS_HEIGHT * 2) << 16) | (TS_WIDTH / 2)); + } else { + saa7146_write(dev, PITCH3, TS_WIDTH); + saa7146_write(dev, NUM_LINE_BYTE3, (TS_HEIGHT << 16) | TS_WIDTH); + } saa7146_write(dev, MC2, (MASK_04 | MASK_20)); @@ -136,33 +132,7 @@ static int start_ts_capture(struct budget *budget) SAA7146_IER_ENABLE(budget->dev, MASK_10); /* VPE */ saa7146_write(dev, MC1, (MASK_04 | MASK_20)); /* DMA3 on */ - return 0; -} - -static int budget_read_fe_status(struct dvb_frontend *fe, fe_status_t *status) -{ - struct budget *budget = (struct budget *) fe->dvb->priv; - int synced; - int ret; - - if (budget->read_fe_status) - ret = budget->read_fe_status(fe, status); - else - ret = -EINVAL; - - if (!ret) { - synced = (*status & FE_HAS_LOCK); - if (synced != budget->fe_synced) { - budget->fe_synced = synced; - spin_lock(&budget->feedlock); - if (synced) - start_ts_capture(budget); - else - stop_ts_capture(budget); - spin_unlock(&budget->feedlock); - } - } - return ret; + return ++budget->feeding; } static void vpeirq(unsigned long data) @@ -171,12 +141,11 @@ static void vpeirq(unsigned long data) u8 *mem = (u8 *) (budget->grabbing); u32 olddma = budget->ttbp; u32 newdma = saa7146_read(budget->dev, PCI_VDP3); - u32 count; /* nearest lower position divisible by 188 */ newdma -= newdma % 188; - if (newdma >= budget->buffer_size) + if (newdma >= TS_BUFLEN) return; budget->ttbp = newdma; @@ -185,24 +154,11 @@ static void vpeirq(unsigned long data) return; if (newdma > olddma) { /* no wraparound, dump olddma..newdma */ - count = newdma - olddma; - dvb_dmx_swfilter_packets(&budget->demux, mem + olddma, count / 188); + dvb_dmx_swfilter_packets(&budget->demux, mem + olddma, (newdma - olddma) / 188); } else { /* wraparound, dump olddma..buflen and 0..newdma */ - count = budget->buffer_size - olddma; - dvb_dmx_swfilter_packets(&budget->demux, mem + olddma, count / 188); - count += newdma; + dvb_dmx_swfilter_packets(&budget->demux, mem + olddma, (TS_BUFLEN - olddma) / 188); dvb_dmx_swfilter_packets(&budget->demux, mem, newdma / 188); } - - if (count > budget->buffer_warning_threshold) - budget->buffer_warnings++; - - if (budget->buffer_warnings && time_after(jiffies, budget->buffer_warning_time)) { - printk("%s %s: used %d times >80%% of buffer (%u bytes now)\n", - budget->dev->name, __FUNCTION__, budget->buffer_warnings, count); - budget->buffer_warning_time = jiffies + BUFFER_WARNING_WAIT; - budget->buffer_warnings = 0; - } } @@ -290,7 +246,7 @@ static int budget_start_feed(struct dvb_demux_feed *feed) { struct dvb_demux *demux = feed->demux; struct budget *budget = (struct budget *) demux->priv; - int status = 0; + int status; dprintk(2, "budget: %p\n", budget); @@ -299,8 +255,7 @@ static int budget_start_feed(struct dvb_demux_feed *feed) spin_lock(&budget->feedlock); feed->pusi_seen = 0; /* have a clean section start */ - if (budget->feeding++ == 0) - status = start_ts_capture(budget); + status = start_ts_capture(budget); spin_unlock(&budget->feedlock); return status; } @@ -309,13 +264,12 @@ static int budget_stop_feed(struct dvb_demux_feed *feed) { struct dvb_demux *demux = feed->demux; struct budget *budget = (struct budget *) demux->priv; - int status = 0; + int status; dprintk(2, "budget: %p\n", budget); spin_lock(&budget->feedlock); - if (--budget->feeding == 0) - status = stop_ts_capture(budget); + status = stop_ts_capture(budget); spin_unlock(&budget->feedlock); return status; } @@ -387,10 +341,9 @@ int ttpci_budget_init(struct budget *budget, struct saa7146_dev *dev, struct saa7146_pci_extension_data *info, struct module *owner) { + int length = TS_WIDTH * TS_HEIGHT; int ret = 0; struct budget_info *bi = info->ext_priv; - int max_bufsize; - int height_mask; memset(budget, 0, sizeof(struct budget)); @@ -399,35 +352,7 @@ int ttpci_budget_init(struct budget *budget, struct saa7146_dev *dev, budget->card = bi; budget->dev = (struct saa7146_dev *) dev; - if (budget->card->type == BUDGET_FS_ACTIVY) { - budget->buffer_width = TS_WIDTH_ACTIVY; - max_bufsize = TS_MAX_BUFSIZE_K_ACTIVY; - height_mask = TS_HEIGHT_MASK_ACTIVY; - } else { - budget->buffer_width = TS_WIDTH; - max_bufsize = TS_MAX_BUFSIZE_K; - height_mask = TS_HEIGHT_MASK; - } - - if (dma_buffer_size < TS_MIN_BUFSIZE_K) - dma_buffer_size = TS_MIN_BUFSIZE_K; - else if (dma_buffer_size > max_bufsize) - dma_buffer_size = max_bufsize; - - budget->buffer_height = dma_buffer_size * 1024 / budget->buffer_width; - budget->buffer_height &= height_mask; - budget->buffer_size = budget->buffer_height * budget->buffer_width; - budget->buffer_warning_threshold = budget->buffer_size * 80/100; - budget->buffer_warnings = 0; - budget->buffer_warning_time = jiffies; - - dprintk(2, "%s: width = %d, height = %d\n", - budget->dev->name, budget->buffer_width, budget->buffer_height); - printk("%s: dma buffer size %u\n", budget->dev->name, budget->buffer_size); - - if ((ret = dvb_register_adapter(&budget->dvb_adapter, budget->card->name, owner, &budget->dev->pci->dev)) < 0) { - return ret; - } + dvb_register_adapter(&budget->dvb_adapter, budget->card->name, owner); /* set dd1 stream a & b */ saa7146_write(dev, DD1_STREAM_B, 0x00000000); @@ -467,7 +392,7 @@ int ttpci_budget_init(struct budget *budget, struct saa7146_dev *dev, ttpci_eeprom_parse_mac(&budget->i2c_adap, budget->dvb_adapter.proposed_mac); if (NULL == - (budget->grabbing = saa7146_vmalloc_build_pgtable(dev->pci, budget->buffer_size, &budget->pt))) { + (budget->grabbing = saa7146_vmalloc_build_pgtable(dev->pci, length, &budget->pt))) { ret = -ENOMEM; goto err; } @@ -495,14 +420,6 @@ err: return ret; } -void ttpci_budget_init_hooks(struct budget *budget) -{ - if (budget->dvb_frontend && !budget->read_fe_status) { - budget->read_fe_status = budget->dvb_frontend->ops.read_status; - budget->dvb_frontend->ops.read_status = budget_read_fe_status; - } -} - int ttpci_budget_deinit(struct budget *budget) { struct saa7146_dev *dev = budget->dev; @@ -541,8 +458,11 @@ void ttpci_budget_set_video_port(struct saa7146_dev *dev, int video_port) spin_lock(&budget->feedlock); budget->video_port = video_port; if (budget->feeding) { + int oldfeeding = budget->feeding; + budget->feeding = 1; stop_ts_capture(budget); start_ts_capture(budget); + budget->feeding = oldfeeding; } spin_unlock(&budget->feedlock); } @@ -550,7 +470,6 @@ void ttpci_budget_set_video_port(struct saa7146_dev *dev, int video_port) EXPORT_SYMBOL_GPL(ttpci_budget_debiread); EXPORT_SYMBOL_GPL(ttpci_budget_debiwrite); EXPORT_SYMBOL_GPL(ttpci_budget_init); -EXPORT_SYMBOL_GPL(ttpci_budget_init_hooks); EXPORT_SYMBOL_GPL(ttpci_budget_deinit); EXPORT_SYMBOL_GPL(ttpci_budget_irq10_handler); EXPORT_SYMBOL_GPL(ttpci_budget_set_video_port); diff --git a/drivers/media/dvb/ttpci/budget-patch.c b/drivers/media/dvb/ttpci/budget-patch.c index 572274418..fc416cf52 100644 --- a/drivers/media/dvb/ttpci/budget-patch.c +++ b/drivers/media/dvb/ttpci/budget-patch.c @@ -37,8 +37,6 @@ #include "ves1x93.h" #include "tda8083.h" -#include "bsru6.h" - #define budget_patch budget static struct saa7146_extension budget_extension; @@ -258,7 +256,7 @@ static int budget_patch_diseqc_send_burst(struct dvb_frontend* fe, fe_sec_mini_c return 0; } -static int alps_bsrv2_tuner_set_params(struct dvb_frontend* fe, struct dvb_frontend_parameters* params) +static int alps_bsrv2_pll_set(struct dvb_frontend* fe, struct dvb_frontend_parameters* params) { struct budget_patch* budget = (struct budget_patch*) fe->dvb->priv; u8 pwr = 0; @@ -281,10 +279,7 @@ static int alps_bsrv2_tuner_set_params(struct dvb_frontend* fe, struct dvb_front // NOTE: since we're using a prescaler of 2, we set the // divisor frequency to 62.5kHz and divide by 125 above - if (fe->ops.i2c_gate_ctrl) - fe->ops.i2c_gate_ctrl(fe, 1); - if (i2c_transfer (&budget->i2c_adap, &msg, 1) != 1) - return -EIO; + if (i2c_transfer (&budget->i2c_adap, &msg, 1) != 1) return -EIO; return 0; } @@ -292,9 +287,107 @@ static struct ves1x93_config alps_bsrv2_config = { .demod_address = 0x08, .xin = 90100000UL, .invert_pwm = 0, + .pll_set = alps_bsrv2_pll_set, +}; + +static u8 alps_bsru6_inittab[] = { + 0x01, 0x15, + 0x02, 0x00, + 0x03, 0x00, + 0x04, 0x7d, /* F22FR = 0x7d, F22 = f_VCO / 128 / 0x7d = 22 kHz */ + 0x05, 0x35, /* I2CT = 0, SCLT = 1, SDAT = 1 */ + 0x06, 0x40, /* DAC not used, set to high impendance mode */ + 0x07, 0x00, /* DAC LSB */ + 0x08, 0x40, /* DiSEqC off, LNB power on OP2/LOCK pin on */ + 0x09, 0x00, /* FIFO */ + 0x0c, 0x51, /* OP1 ctl = Normal, OP1 val = 1 (LNB Power ON) */ + 0x0d, 0x82, /* DC offset compensation = ON, beta_agc1 = 2 */ + 0x0e, 0x23, /* alpha_tmg = 2, beta_tmg = 3 */ + 0x10, 0x3f, // AGC2 0x3d + 0x11, 0x84, + 0x12, 0xb9, + 0x15, 0xc9, // lock detector threshold + 0x16, 0x00, + 0x17, 0x00, + 0x18, 0x00, + 0x19, 0x00, + 0x1a, 0x00, + 0x1f, 0x50, + 0x20, 0x00, + 0x21, 0x00, + 0x22, 0x00, + 0x23, 0x00, + 0x28, 0x00, // out imp: normal out type: parallel FEC mode:0 + 0x29, 0x1e, // 1/2 threshold + 0x2a, 0x14, // 2/3 threshold + 0x2b, 0x0f, // 3/4 threshold + 0x2c, 0x09, // 5/6 threshold + 0x2d, 0x05, // 7/8 threshold + 0x2e, 0x01, + 0x31, 0x1f, // test all FECs + 0x32, 0x19, // viterbi and synchro search + 0x33, 0xfc, // rs control + 0x34, 0x93, // error control + 0x0f, 0x52, + 0xff, 0xff +}; + +static int alps_bsru6_set_symbol_rate(struct dvb_frontend* fe, u32 srate, u32 ratio) +{ + u8 aclk = 0; + u8 bclk = 0; + + if (srate < 1500000) { aclk = 0xb7; bclk = 0x47; } + else if (srate < 3000000) { aclk = 0xb7; bclk = 0x4b; } + else if (srate < 7000000) { aclk = 0xb7; bclk = 0x4f; } + else if (srate < 14000000) { aclk = 0xb7; bclk = 0x53; } + else if (srate < 30000000) { aclk = 0xb6; bclk = 0x53; } + else if (srate < 45000000) { aclk = 0xb4; bclk = 0x51; } + + stv0299_writereg (fe, 0x13, aclk); + stv0299_writereg (fe, 0x14, bclk); + stv0299_writereg (fe, 0x1f, (ratio >> 16) & 0xff); + stv0299_writereg (fe, 0x20, (ratio >> 8) & 0xff); + stv0299_writereg (fe, 0x21, (ratio ) & 0xf0); + + return 0; +} + +static int alps_bsru6_pll_set(struct dvb_frontend* fe, struct i2c_adapter *i2c, struct dvb_frontend_parameters* params) +{ + u8 data[4]; + u32 div; + struct i2c_msg msg = { .addr = 0x61, .flags = 0, .buf = data, .len = sizeof(data) }; + + if ((params->frequency < 950000) || (params->frequency > 2150000)) return -EINVAL; + + div = (params->frequency + (125 - 1)) / 125; // round correctly + data[0] = (div >> 8) & 0x7f; + data[1] = div & 0xff; + data[2] = 0x80 | ((div & 0x18000) >> 10) | 4; + data[3] = 0xC4; + + if (params->frequency > 1530000) data[3] = 0xc0; + + if (i2c_transfer(i2c, &msg, 1) != 1) return -EIO; + return 0; +} + +static struct stv0299_config alps_bsru6_config = { + + .demod_address = 0x68, + .inittab = alps_bsru6_inittab, + .mclk = 88000000UL, + .invert = 1, + .skip_reinit = 0, + .lock_output = STV0229_LOCKOUTPUT_1, + .volt13_op0_op1 = STV0299_VOLT13_OP1, + .min_delay_ms = 100, + .set_symbol_rate = alps_bsru6_set_symbol_rate, + .pll_set = alps_bsru6_pll_set, }; -static int grundig_29504_451_tuner_set_params(struct dvb_frontend* fe, struct dvb_frontend_parameters* params) +static int grundig_29504_451_pll_set(struct dvb_frontend* fe, struct dvb_frontend_parameters* params) { struct budget_patch* budget = (struct budget_patch*) fe->dvb->priv; u32 div; @@ -307,15 +400,13 @@ static int grundig_29504_451_tuner_set_params(struct dvb_frontend* fe, struct dv data[2] = 0x8e; data[3] = 0x00; - if (fe->ops.i2c_gate_ctrl) - fe->ops.i2c_gate_ctrl(fe, 1); - if (i2c_transfer (&budget->i2c_adap, &msg, 1) != 1) - return -EIO; + if (i2c_transfer (&budget->i2c_adap, &msg, 1) != 1) return -EIO; return 0; } static struct tda8083_config grundig_29504_451_config = { .demod_address = 0x68, + .pll_set = grundig_29504_451_pll_set, }; static void frontend_init(struct budget_patch* budget) @@ -327,32 +418,27 @@ static void frontend_init(struct budget_patch* budget) // try the ALPS BSRV2 first of all budget->dvb_frontend = ves1x93_attach(&alps_bsrv2_config, &budget->i2c_adap); if (budget->dvb_frontend) { - budget->dvb_frontend->ops.tuner_ops.set_params = alps_bsrv2_tuner_set_params; - budget->dvb_frontend->ops.diseqc_send_master_cmd = budget_patch_diseqc_send_master_cmd; - budget->dvb_frontend->ops.diseqc_send_burst = budget_patch_diseqc_send_burst; - budget->dvb_frontend->ops.set_tone = budget_patch_set_tone; + budget->dvb_frontend->ops->diseqc_send_master_cmd = budget_patch_diseqc_send_master_cmd; + budget->dvb_frontend->ops->diseqc_send_burst = budget_patch_diseqc_send_burst; + budget->dvb_frontend->ops->set_tone = budget_patch_set_tone; break; } // try the ALPS BSRU6 now budget->dvb_frontend = stv0299_attach(&alps_bsru6_config, &budget->i2c_adap); if (budget->dvb_frontend) { - budget->dvb_frontend->ops.tuner_ops.set_params = alps_bsru6_tuner_set_params; - budget->dvb_frontend->tuner_priv = &budget->i2c_adap; - - budget->dvb_frontend->ops.diseqc_send_master_cmd = budget_diseqc_send_master_cmd; - budget->dvb_frontend->ops.diseqc_send_burst = budget_diseqc_send_burst; - budget->dvb_frontend->ops.set_tone = budget_set_tone; + budget->dvb_frontend->ops->diseqc_send_master_cmd = budget_diseqc_send_master_cmd; + budget->dvb_frontend->ops->diseqc_send_burst = budget_diseqc_send_burst; + budget->dvb_frontend->ops->set_tone = budget_set_tone; break; } // Try the grundig 29504-451 budget->dvb_frontend = tda8083_attach(&grundig_29504_451_config, &budget->i2c_adap); if (budget->dvb_frontend) { - budget->dvb_frontend->ops.tuner_ops.set_params = grundig_29504_451_tuner_set_params; - budget->dvb_frontend->ops.diseqc_send_master_cmd = budget_diseqc_send_master_cmd; - budget->dvb_frontend->ops.diseqc_send_burst = budget_diseqc_send_burst; - budget->dvb_frontend->ops.set_tone = budget_set_tone; + budget->dvb_frontend->ops->diseqc_send_master_cmd = budget_diseqc_send_master_cmd; + budget->dvb_frontend->ops->diseqc_send_burst = budget_diseqc_send_burst; + budget->dvb_frontend->ops->set_tone = budget_set_tone; break; } break; @@ -367,8 +453,8 @@ static void frontend_init(struct budget_patch* budget) } else { if (dvb_register_frontend(&budget->dvb_adapter, budget->dvb_frontend)) { printk("budget-av: Frontend registration failed!\n"); - if (budget->dvb_frontend->ops.release) - budget->dvb_frontend->ops.release(budget->dvb_frontend); + if (budget->dvb_frontend->ops->release) + budget->dvb_frontend->ops->release(budget->dvb_frontend); budget->dvb_frontend = NULL; } } @@ -586,17 +672,6 @@ static int budget_patch_attach (struct saa7146_dev* dev, struct saa7146_pci_exte saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTLO); // Set RPS1 Address register to point to RPS code (r108 p42) saa7146_write(dev, RPS_ADDR1, dev->d_rps1.dma_handle); - - if (!(budget = kmalloc (sizeof(struct budget_patch), GFP_KERNEL))) - return -ENOMEM; - - dprintk(2, "budget: %p\n", budget); - - if ((err = ttpci_budget_init (budget, dev, info, THIS_MODULE))) { - kfree (budget); - return err; - } - // Set Source Line Counter Threshold, using BRS (rCC p43) // It generates HS event every TS_HEIGHT lines // this is related to TS_WIDTH set in register @@ -605,20 +680,29 @@ static int budget_patch_attach (struct saa7146_dev* dev, struct saa7146_pci_exte //,then RPS_THRESH1 // should be set to trigger every TS_HEIGHT (512) lines. // - saa7146_write(dev, RPS_THRESH1, budget->buffer_height | MASK_12 ); + saa7146_write(dev, RPS_THRESH1, (TS_HEIGHT*1) | MASK_12 ); // saa7146_write(dev, RPS_THRESH0, ((TS_HEIGHT/2)<<16) |MASK_28| (TS_HEIGHT/2) |MASK_12 ); // Enable RPS1 (rFC p33) saa7146_write(dev, MC1, (MASK_13 | MASK_29)); + if (!(budget = kmalloc (sizeof(struct budget_patch), GFP_KERNEL))) + return -ENOMEM; + + dprintk(2, "budget: %p\n", budget); + + if ((err = ttpci_budget_init (budget, dev, info, THIS_MODULE))) { + kfree (budget); + return err; + } + + dev->ext_priv = budget; budget->dvb_adapter.priv = budget; frontend_init(budget); - ttpci_budget_init_hooks(budget); - return 0; } diff --git a/drivers/media/dvb/ttpci/budget.c b/drivers/media/dvb/ttpci/budget.c index 863dffb4e..fab7d8d69 100644 --- a/drivers/media/dvb/ttpci/budget.c +++ b/drivers/media/dvb/ttpci/budget.c @@ -41,8 +41,6 @@ #include "l64781.h" #include "tda8083.h" #include "s5h1420.h" -#include "lnbp21.h" -#include "bsru6.h" static void Set22K (struct budget *budget, int state) { @@ -186,7 +184,65 @@ static int budget_diseqc_send_burst(struct dvb_frontend* fe, fe_sec_mini_cmd_t m return 0; } -static int alps_bsrv2_tuner_set_params(struct dvb_frontend* fe, struct dvb_frontend_parameters* params) +static int lnbp21_set_voltage(struct dvb_frontend* fe, fe_sec_voltage_t voltage) +{ + struct budget* budget = (struct budget*) fe->dvb->priv; + u8 buf; + struct i2c_msg msg = { .addr = 0x08, .flags = I2C_M_RD, .buf = &buf, .len = sizeof(buf) }; + + if (i2c_transfer (&budget->i2c_adap, &msg, 1) != 1) return -EIO; + + switch(voltage) { + case SEC_VOLTAGE_13: + buf = (buf & 0xf7) | 0x04; + break; + + case SEC_VOLTAGE_18: + buf = (buf & 0xf7) | 0x0c; + break; + + case SEC_VOLTAGE_OFF: + buf = buf & 0xf0; + break; + } + + msg.flags = 0; + if (i2c_transfer (&budget->i2c_adap, &msg, 1) != 1) return -EIO; + + return 0; +} + +static int lnbp21_enable_high_lnb_voltage(struct dvb_frontend* fe, long arg) +{ + struct budget* budget = (struct budget*) fe->dvb->priv; + u8 buf; + struct i2c_msg msg = { .addr = 0x08, .flags = I2C_M_RD, .buf = &buf, .len = sizeof(buf) }; + + if (i2c_transfer (&budget->i2c_adap, &msg, 1) != 1) return -EIO; + + if (arg) { + buf = buf | 0x10; + } else { + buf = buf & 0xef; + } + + msg.flags = 0; + if (i2c_transfer (&budget->i2c_adap, &msg, 1) != 1) return -EIO; + + return 0; +} + +static int lnbp21_init(struct budget* budget) +{ + u8 buf = 0x00; + struct i2c_msg msg = { .addr = 0x08, .flags = 0, .buf = &buf, .len = sizeof(buf) }; + + if (i2c_transfer (&budget->i2c_adap, &msg, 1) != 1) + return -EIO; + return 0; +} + +static int alps_bsrv2_pll_set(struct dvb_frontend* fe, struct dvb_frontend_parameters* params) { struct budget* budget = (struct budget*) fe->dvb->priv; u8 pwr = 0; @@ -209,8 +265,6 @@ static int alps_bsrv2_tuner_set_params(struct dvb_frontend* fe, struct dvb_front // NOTE: since we're using a prescaler of 2, we set the // divisor frequency to 62.5kHz and divide by 125 above - if (fe->ops.i2c_gate_ctrl) - fe->ops.i2c_gate_ctrl(fe, 1); if (i2c_transfer (&budget->i2c_adap, &msg, 1) != 1) return -EIO; return 0; } @@ -220,9 +274,180 @@ static struct ves1x93_config alps_bsrv2_config = .demod_address = 0x08, .xin = 90100000UL, .invert_pwm = 0, + .pll_set = alps_bsrv2_pll_set, +}; + +static u8 alps_bsru6_inittab[] = { + 0x01, 0x15, + 0x02, 0x00, + 0x03, 0x00, + 0x04, 0x7d, /* F22FR = 0x7d, F22 = f_VCO / 128 / 0x7d = 22 kHz */ + 0x05, 0x35, /* I2CT = 0, SCLT = 1, SDAT = 1 */ + 0x06, 0x40, /* DAC not used, set to high impendance mode */ + 0x07, 0x00, /* DAC LSB */ + 0x08, 0x40, /* DiSEqC off, LNB power on OP2/LOCK pin on */ + 0x09, 0x00, /* FIFO */ + 0x0c, 0x51, /* OP1 ctl = Normal, OP1 val = 1 (LNB Power ON) */ + 0x0d, 0x82, /* DC offset compensation = ON, beta_agc1 = 2 */ + 0x0e, 0x23, /* alpha_tmg = 2, beta_tmg = 3 */ + 0x10, 0x3f, // AGC2 0x3d + 0x11, 0x84, + 0x12, 0xb9, + 0x15, 0xc9, // lock detector threshold + 0x16, 0x00, + 0x17, 0x00, + 0x18, 0x00, + 0x19, 0x00, + 0x1a, 0x00, + 0x1f, 0x50, + 0x20, 0x00, + 0x21, 0x00, + 0x22, 0x00, + 0x23, 0x00, + 0x28, 0x00, // out imp: normal out type: parallel FEC mode:0 + 0x29, 0x1e, // 1/2 threshold + 0x2a, 0x14, // 2/3 threshold + 0x2b, 0x0f, // 3/4 threshold + 0x2c, 0x09, // 5/6 threshold + 0x2d, 0x05, // 7/8 threshold + 0x2e, 0x01, + 0x31, 0x1f, // test all FECs + 0x32, 0x19, // viterbi and synchro search + 0x33, 0xfc, // rs control + 0x34, 0x93, // error control + 0x0f, 0x52, + 0xff, 0xff }; -static int alps_tdbe2_tuner_set_params(struct dvb_frontend* fe, struct dvb_frontend_parameters* params) +static int alps_bsru6_set_symbol_rate(struct dvb_frontend* fe, u32 srate, u32 ratio) +{ + u8 aclk = 0; + u8 bclk = 0; + + if (srate < 1500000) { aclk = 0xb7; bclk = 0x47; } + else if (srate < 3000000) { aclk = 0xb7; bclk = 0x4b; } + else if (srate < 7000000) { aclk = 0xb7; bclk = 0x4f; } + else if (srate < 14000000) { aclk = 0xb7; bclk = 0x53; } + else if (srate < 30000000) { aclk = 0xb6; bclk = 0x53; } + else if (srate < 45000000) { aclk = 0xb4; bclk = 0x51; } + + stv0299_writereg (fe, 0x13, aclk); + stv0299_writereg (fe, 0x14, bclk); + stv0299_writereg (fe, 0x1f, (ratio >> 16) & 0xff); + stv0299_writereg (fe, 0x20, (ratio >> 8) & 0xff); + stv0299_writereg (fe, 0x21, (ratio ) & 0xf0); + + return 0; +} + +static int alps_bsru6_pll_set(struct dvb_frontend* fe, struct i2c_adapter *i2c, struct dvb_frontend_parameters* params) +{ + u8 data[4]; + u32 div; + struct i2c_msg msg = { .addr = 0x61, .flags = 0, .buf = data, .len = sizeof(data) }; + + if ((params->frequency < 950000) || (params->frequency > 2150000)) return -EINVAL; + + div = (params->frequency + (125 - 1)) / 125; // round correctly + data[0] = (div >> 8) & 0x7f; + data[1] = div & 0xff; + data[2] = 0x80 | ((div & 0x18000) >> 10) | 4; + data[3] = 0xC4; + + if (params->frequency > 1530000) data[3] = 0xc0; + + if (i2c_transfer(i2c, &msg, 1) != 1) return -EIO; + return 0; +} + +static struct stv0299_config alps_bsru6_config = { + + .demod_address = 0x68, + .inittab = alps_bsru6_inittab, + .mclk = 88000000UL, + .invert = 1, + .skip_reinit = 0, + .lock_output = STV0229_LOCKOUTPUT_1, + .volt13_op0_op1 = STV0299_VOLT13_OP1, + .min_delay_ms = 100, + .set_symbol_rate = alps_bsru6_set_symbol_rate, + .pll_set = alps_bsru6_pll_set, +}; + +static u8 alps_bsbe1_inittab[] = { + 0x01, 0x15, + 0x02, 0x30, + 0x03, 0x00, + 0x04, 0x7d, /* F22FR = 0x7d, F22 = f_VCO / 128 / 0x7d = 22 kHz */ + 0x05, 0x35, /* I2CT = 0, SCLT = 1, SDAT = 1 */ + 0x06, 0x40, /* DAC not used, set to high impendance mode */ + 0x07, 0x00, /* DAC LSB */ + 0x08, 0x40, /* DiSEqC off, LNB power on OP2/LOCK pin on */ + 0x09, 0x00, /* FIFO */ + 0x0c, 0x51, /* OP1 ctl = Normal, OP1 val = 1 (LNB Power ON) */ + 0x0d, 0x82, /* DC offset compensation = ON, beta_agc1 = 2 */ + 0x0e, 0x23, /* alpha_tmg = 2, beta_tmg = 3 */ + 0x10, 0x3f, // AGC2 0x3d + 0x11, 0x84, + 0x12, 0xb9, + 0x15, 0xc9, // lock detector threshold + 0x16, 0x00, + 0x17, 0x00, + 0x18, 0x00, + 0x19, 0x00, + 0x1a, 0x00, + 0x1f, 0x50, + 0x20, 0x00, + 0x21, 0x00, + 0x22, 0x00, + 0x23, 0x00, + 0x28, 0x00, // out imp: normal out type: parallel FEC mode:0 + 0x29, 0x1e, // 1/2 threshold + 0x2a, 0x14, // 2/3 threshold + 0x2b, 0x0f, // 3/4 threshold + 0x2c, 0x09, // 5/6 threshold + 0x2d, 0x05, // 7/8 threshold + 0x2e, 0x01, + 0x31, 0x1f, // test all FECs + 0x32, 0x19, // viterbi and synchro search + 0x33, 0xfc, // rs control + 0x34, 0x93, // error control + 0x0f, 0x92, // 0x80 = inverse AGC + 0xff, 0xff +}; + +static int alps_bsbe1_pll_set(struct dvb_frontend* fe, struct i2c_adapter *i2c, struct dvb_frontend_parameters* params) +{ + int ret; + u8 data[4]; + u32 div; + struct i2c_msg msg = { .addr = 0x61, .flags = 0, .buf = data, .len = sizeof(data) }; + + if ((params->frequency < 950000) || (params->frequency > 2150000)) + return -EINVAL; + + div = (params->frequency + (125 - 1)) / 125; // round correctly + data[0] = (div >> 8) & 0x7f; + data[1] = div & 0xff; + data[2] = 0x80 | ((div & 0x18000) >> 10) | 4; + data[3] = (params->frequency > 1530000) ? 0xE0 : 0xE4; + + ret = i2c_transfer(i2c, &msg, 1); + return (ret != 1) ? -EIO : 0; +} + +static struct stv0299_config alps_bsbe1_config = { + .demod_address = 0x68, + .inittab = alps_bsbe1_inittab, + .mclk = 88000000UL, + .invert = 1, + .skip_reinit = 0, + .min_delay_ms = 100, + .set_symbol_rate = alps_bsru6_set_symbol_rate, + .pll_set = alps_bsbe1_pll_set, +}; + +static int alps_tdbe2_pll_set(struct dvb_frontend* fe, struct dvb_frontend_parameters* params) { struct budget* budget = (struct budget*) fe->dvb->priv; u32 div; @@ -236,8 +461,6 @@ static int alps_tdbe2_tuner_set_params(struct dvb_frontend* fe, struct dvb_front data[2] = 0x85 | ((div >> 10) & 0x60); data[3] = (params->frequency < 174000000 ? 0x88 : params->frequency < 470000000 ? 0x84 : 0x81); - if (fe->ops.i2c_gate_ctrl) - fe->ops.i2c_gate_ctrl(fe, 1); if (i2c_transfer (&budget->i2c_adap, &msg, 1) != 1) return -EIO; return 0; } @@ -247,9 +470,10 @@ static struct ves1820_config alps_tdbe2_config = { .xin = 57840000UL, .invert = 1, .selagc = VES1820_SELAGC_SIGNAMPERR, + .pll_set = alps_tdbe2_pll_set, }; -static int grundig_29504_401_tuner_set_params(struct dvb_frontend* fe, struct dvb_frontend_parameters* params) +static int grundig_29504_401_pll_set(struct dvb_frontend* fe, struct dvb_frontend_parameters* params) { struct budget* budget = (struct budget*) fe->dvb->priv; u32 div; @@ -276,17 +500,16 @@ static int grundig_29504_401_tuner_set_params(struct dvb_frontend* fe, struct dv data[2] = ((div >> 10) & 0x60) | cfg; data[3] = (cpump << 6) | band_select; - if (fe->ops.i2c_gate_ctrl) - fe->ops.i2c_gate_ctrl(fe, 1); if (i2c_transfer (&budget->i2c_adap, &msg, 1) != 1) return -EIO; return 0; } static struct l64781_config grundig_29504_401_config = { .demod_address = 0x55, + .pll_set = grundig_29504_401_pll_set, }; -static int grundig_29504_451_tuner_set_params(struct dvb_frontend* fe, struct dvb_frontend_parameters* params) +static int grundig_29504_451_pll_set(struct dvb_frontend* fe, struct dvb_frontend_parameters* params) { struct budget* budget = (struct budget*) fe->dvb->priv; u32 div; @@ -299,17 +522,16 @@ static int grundig_29504_451_tuner_set_params(struct dvb_frontend* fe, struct dv data[2] = 0x8e; data[3] = 0x00; - if (fe->ops.i2c_gate_ctrl) - fe->ops.i2c_gate_ctrl(fe, 1); if (i2c_transfer (&budget->i2c_adap, &msg, 1) != 1) return -EIO; return 0; } static struct tda8083_config grundig_29504_451_config = { .demod_address = 0x68, + .pll_set = grundig_29504_451_pll_set, }; -static int s5h1420_tuner_set_params(struct dvb_frontend* fe, struct dvb_frontend_parameters* params) +static int s5h1420_pll_set(struct dvb_frontend* fe, struct dvb_frontend_parameters* params, u32* freqout) { struct budget* budget = (struct budget*) fe->dvb->priv; u32 div; @@ -330,16 +552,16 @@ static int s5h1420_tuner_set_params(struct dvb_frontend* fe, struct dvb_frontend else data[3] = 0xc0; - if (fe->ops.i2c_gate_ctrl) - fe->ops.i2c_gate_ctrl(fe, 1); if (i2c_transfer (&budget->i2c_adap, &msg, 1) != 1) return -EIO; + *freqout = div * 1000; return 0; } static struct s5h1420_config s5h1420_config = { .demod_address = 0x53, .invert = 1, + .pll_set = s5h1420_pll_set, }; static u8 read_pwm(struct budget* budget) @@ -358,69 +580,69 @@ static u8 read_pwm(struct budget* budget) static void frontend_init(struct budget *budget) { switch(budget->dev->pci->subsystem_device) { + case 0x1017: + // try the ALPS BSBE1 now + budget->dvb_frontend = stv0299_attach(&alps_bsbe1_config, &budget->i2c_adap); + if (budget->dvb_frontend) { + budget->dvb_frontend->ops->set_voltage = lnbp21_set_voltage; + budget->dvb_frontend->ops->enable_high_lnb_voltage = lnbp21_enable_high_lnb_voltage; + budget->dvb_frontend->ops->dishnetwork_send_legacy_command = NULL; + if (lnbp21_init(budget)) { + printk("%s: No LNBP21 found!\n", __FUNCTION__); + goto error_out; + } + } + + break; case 0x1003: // Hauppauge/TT Nova budget (stv0299/ALPS BSRU6(tsa5059) OR ves1893/ALPS BSRV2(sp5659)) case 0x1013: // try the ALPS BSRV2 first of all budget->dvb_frontend = ves1x93_attach(&alps_bsrv2_config, &budget->i2c_adap); if (budget->dvb_frontend) { - budget->dvb_frontend->ops.tuner_ops.set_params = alps_bsrv2_tuner_set_params; - budget->dvb_frontend->ops.diseqc_send_master_cmd = budget_diseqc_send_master_cmd; - budget->dvb_frontend->ops.diseqc_send_burst = budget_diseqc_send_burst; - budget->dvb_frontend->ops.set_tone = budget_set_tone; + budget->dvb_frontend->ops->diseqc_send_master_cmd = budget_diseqc_send_master_cmd; + budget->dvb_frontend->ops->diseqc_send_burst = budget_diseqc_send_burst; + budget->dvb_frontend->ops->set_tone = budget_set_tone; break; } // try the ALPS BSRU6 now budget->dvb_frontend = stv0299_attach(&alps_bsru6_config, &budget->i2c_adap); - if (budget->dvb_frontend) { - budget->dvb_frontend->ops.tuner_ops.set_params = alps_bsru6_tuner_set_params; - budget->dvb_frontend->tuner_priv = &budget->i2c_adap; - break; - } break; case 0x1004: // Hauppauge/TT DVB-C budget (ves1820/ALPS TDBE2(sp5659)) budget->dvb_frontend = ves1820_attach(&alps_tdbe2_config, &budget->i2c_adap, read_pwm(budget)); - if (budget->dvb_frontend) { - budget->dvb_frontend->ops.tuner_ops.set_params = alps_tdbe2_tuner_set_params; - break; - } + if (budget->dvb_frontend) break; break; case 0x1005: // Hauppauge/TT Nova-T budget (L64781/Grundig 29504-401(tsa5060)) budget->dvb_frontend = l64781_attach(&grundig_29504_401_config, &budget->i2c_adap); - if (budget->dvb_frontend) { - budget->dvb_frontend->ops.tuner_ops.set_params = grundig_29504_401_tuner_set_params; - break; - } + if (budget->dvb_frontend) break; break; case 0x4f60: // Fujitsu Siemens Activy Budget-S PCI rev AL (stv0299/ALPS BSRU6(tsa5059)) budget->dvb_frontend = stv0299_attach(&alps_bsru6_config, &budget->i2c_adap); if (budget->dvb_frontend) { - budget->dvb_frontend->ops.tuner_ops.set_params = alps_bsru6_tuner_set_params; - budget->dvb_frontend->tuner_priv = &budget->i2c_adap; - budget->dvb_frontend->ops.set_voltage = siemens_budget_set_voltage; - budget->dvb_frontend->ops.dishnetwork_send_legacy_command = NULL; + budget->dvb_frontend->ops->set_voltage = siemens_budget_set_voltage; + budget->dvb_frontend->ops->dishnetwork_send_legacy_command = NULL; } break; case 0x4f61: // Fujitsu Siemens Activy Budget-S PCI rev GR (tda8083/Grundig 29504-451(tsa5522)) budget->dvb_frontend = tda8083_attach(&grundig_29504_451_config, &budget->i2c_adap); if (budget->dvb_frontend) { - budget->dvb_frontend->ops.tuner_ops.set_params = grundig_29504_451_tuner_set_params; - budget->dvb_frontend->ops.set_voltage = siemens_budget_set_voltage; - budget->dvb_frontend->ops.dishnetwork_send_legacy_command = NULL; + budget->dvb_frontend->ops->set_voltage = siemens_budget_set_voltage; + budget->dvb_frontend->ops->dishnetwork_send_legacy_command = NULL; } break; case 0x1016: // Hauppauge/TT Nova-S SE (samsung s5h1420/????(tda8260)) budget->dvb_frontend = s5h1420_attach(&s5h1420_config, &budget->i2c_adap); if (budget->dvb_frontend) { - budget->dvb_frontend->ops.tuner_ops.set_params = s5h1420_tuner_set_params; - if (lnbp21_attach(budget->dvb_frontend, &budget->i2c_adap, 0, 0)) { + budget->dvb_frontend->ops->set_voltage = lnbp21_set_voltage; + budget->dvb_frontend->ops->enable_high_lnb_voltage = lnbp21_enable_high_lnb_voltage; + if (lnbp21_init(budget)) { printk("%s: No LNBP21 found!\n", __FUNCTION__); goto error_out; } @@ -442,8 +664,8 @@ static void frontend_init(struct budget *budget) error_out: printk("budget: Frontend registration failed!\n"); - if (budget->dvb_frontend->ops.release) - budget->dvb_frontend->ops.release(budget->dvb_frontend); + if (budget->dvb_frontend->ops->release) + budget->dvb_frontend->ops->release(budget->dvb_frontend); budget->dvb_frontend = NULL; return; } @@ -471,8 +693,6 @@ static int budget_attach (struct saa7146_dev* dev, struct saa7146_pci_extension_ budget->dvb_adapter.priv = budget; frontend_init(budget); - ttpci_budget_init_hooks(budget); - return 0; } @@ -493,6 +713,7 @@ static int budget_detach (struct saa7146_dev* dev) static struct saa7146_extension budget_extension; +MAKE_BUDGET_INFO(ttbs2, "TT-Budget/WinTV-NOVA-S PCI (rev AL/alps bsbe1 lnbp21 frontend)", BUDGET_TT); MAKE_BUDGET_INFO(ttbs, "TT-Budget/WinTV-NOVA-S PCI", BUDGET_TT); MAKE_BUDGET_INFO(ttbc, "TT-Budget/WinTV-NOVA-C PCI", BUDGET_TT); MAKE_BUDGET_INFO(ttbt, "TT-Budget/WinTV-NOVA-T PCI", BUDGET_TT); @@ -505,6 +726,7 @@ static struct pci_device_id pci_tbl[] = { MAKE_EXTENSION_PCI(ttbc, 0x13c2, 0x1004), MAKE_EXTENSION_PCI(ttbt, 0x13c2, 0x1005), MAKE_EXTENSION_PCI(satel, 0x13c2, 0x1013), + MAKE_EXTENSION_PCI(ttbs2, 0x13c2, 0x1017), MAKE_EXTENSION_PCI(ttbs, 0x13c2, 0x1016), MAKE_EXTENSION_PCI(fsacs1,0x1131, 0x4f60), MAKE_EXTENSION_PCI(fsacs0,0x1131, 0x4f61), diff --git a/drivers/media/dvb/ttpci/budget.h b/drivers/media/dvb/ttpci/budget.h index e8a5c7917..c7bb63c4d 100644 --- a/drivers/media/dvb/ttpci/budget.h +++ b/drivers/media/dvb/ttpci/budget.h @@ -10,8 +10,6 @@ #include "dvb_net.h" #include -#include - #include extern int budget_debug; @@ -52,16 +50,13 @@ struct budget { struct dmx_frontend hw_frontend; struct dmx_frontend mem_frontend; + int fe_synced; + struct semaphore pid_mutex; + int ci_present; int video_port; - u32 buffer_width; - u32 buffer_height; - u32 buffer_size; - u32 buffer_warning_threshold; - u32 buffer_warnings; - unsigned long buffer_warning_time; - + u8 tsf; u32 ttbp; int feeding; @@ -71,9 +66,6 @@ struct budget { struct dvb_adapter dvb_adapter; struct dvb_frontend *dvb_frontend; - int (*read_fe_status)(struct dvb_frontend *fe, fe_status_t *status); - int fe_synced; - void *priv; }; @@ -85,6 +77,11 @@ static struct saa7146_pci_extension_data x_var = { \ .ext_priv = &x_var ## _info, \ .ext = &budget_extension }; +#define TS_WIDTH (376) +#define TS_HEIGHT (512) +#define TS_BUFLEN (TS_WIDTH*TS_HEIGHT) +#define TS_MAX_PACKETS (TS_BUFLEN/TS_SIZE) + #define BUDGET_TT 0 #define BUDGET_TT_HW_DISEQC 1 #define BUDGET_PATCH 3 @@ -106,7 +103,6 @@ static struct saa7146_pci_extension_data x_var = { \ extern int ttpci_budget_init(struct budget *budget, struct saa7146_dev *dev, struct saa7146_pci_extension_data *info, struct module *owner); -extern void ttpci_budget_init_hooks(struct budget *budget); extern int ttpci_budget_deinit(struct budget *budget); extern void ttpci_budget_irq10_handler(struct saa7146_dev *dev, u32 * isr); extern void ttpci_budget_set_video_port(struct saa7146_dev *dev, int video_port); diff --git a/drivers/media/dvb/ttusb-budget/Kconfig b/drivers/media/dvb/ttusb-budget/Kconfig index 46a6a60d2..914587d52 100644 --- a/drivers/media/dvb/ttusb-budget/Kconfig +++ b/drivers/media/dvb/ttusb-budget/Kconfig @@ -1,14 +1,11 @@ config DVB_TTUSB_BUDGET tristate "Technotrend/Hauppauge Nova-USB devices" - depends on DVB_CORE && USB && I2C - select DVB_PLL + depends on DVB_CORE && USB select DVB_CX22700 select DVB_TDA1004X select DVB_VES1820 select DVB_TDA8083 select DVB_STV0299 - select DVB_STV0297 - select DVB_LNBP21 help Support for external USB adapters designed by Technotrend and produced by Hauppauge, shipped under the brand name 'Nova-USB'. diff --git a/drivers/media/dvb/ttusb-budget/dvb-ttusb-budget.c b/drivers/media/dvb/ttusb-budget/dvb-ttusb-budget.c index 04cef3023..5a13c4744 100644 --- a/drivers/media/dvb/ttusb-budget/dvb-ttusb-budget.c +++ b/drivers/media/dvb/ttusb-budget/dvb-ttusb-budget.c @@ -19,7 +19,7 @@ #include #include #include -#include +#include #include "dvb_frontend.h" #include "dmxdev.h" @@ -30,20 +30,19 @@ #include "tda1004x.h" #include "stv0299.h" #include "tda8083.h" -#include "stv0297.h" -#include "lnbp21.h" #include #include #include + /* TTUSB_HWSECTIONS: the DSP supports filtering in hardware, however, since the "muxstream" is a bit braindead (no matching channel masks or no matching filter mask), we won't support this - yet. it doesn't event support negative filters, so the best way is maybe to keep TTUSB_HWSECTIONS undef'd and just - parse TS data. USB bandwidth will be a problem when having large + parse TS data. USB bandwith will be a problem when having large datastreams, especially for dvb-net, but hey, that's not my problem. TTUSB_DISEQC, TTUSB_TONE: @@ -84,8 +83,8 @@ struct ttusb { struct dvb_net dvbnet; /* and one for USB access. */ - struct mutex semi2c; - struct mutex semusb; + struct semaphore semi2c; + struct semaphore semusb; struct dvb_adapter adapter; struct usb_device *dev; @@ -126,6 +125,10 @@ struct ttusb { int revision; +#if 0 + devfs_handle_t stc_devfs_handle; +#endif + struct dvb_frontend* fe; }; @@ -147,7 +150,7 @@ static int ttusb_cmd(struct ttusb *ttusb, printk("\n"); #endif - if (mutex_lock_interruptible(&ttusb->semusb) < 0) + if (down_interruptible(&ttusb->semusb) < 0) return -EAGAIN; err = usb_bulk_msg(ttusb->dev, ttusb->bulk_out_pipe, @@ -155,13 +158,13 @@ static int ttusb_cmd(struct ttusb *ttusb, if (err != 0) { dprintk("%s: usb_bulk_msg(send) failed, err == %i!\n", __FUNCTION__, err); - mutex_unlock(&ttusb->semusb); + up(&ttusb->semusb); return err; } if (actual_len != len) { dprintk("%s: only wrote %d of %d bytes\n", __FUNCTION__, actual_len, len); - mutex_unlock(&ttusb->semusb); + up(&ttusb->semusb); return -1; } @@ -171,7 +174,7 @@ static int ttusb_cmd(struct ttusb *ttusb, if (err != 0) { printk("%s: failed, receive error %d\n", __FUNCTION__, err); - mutex_unlock(&ttusb->semusb); + up(&ttusb->semusb); return err; } #if DEBUG >= 3 @@ -182,14 +185,14 @@ static int ttusb_cmd(struct ttusb *ttusb, printk("\n"); #endif if (!needresult) - mutex_unlock(&ttusb->semusb); + up(&ttusb->semusb); return 0; } static int ttusb_result(struct ttusb *ttusb, u8 * data, int len) { memcpy(data, ttusb->last_result, len); - mutex_unlock(&ttusb->semusb); + up(&ttusb->semusb); return 0; } @@ -247,7 +250,7 @@ static int master_xfer(struct i2c_adapter* adapter, struct i2c_msg *msg, int num int i = 0; int inc; - if (mutex_lock_interruptible(&ttusb->semi2c) < 0) + if (down_interruptible(&ttusb->semi2c) < 0) return -EAGAIN; while (i < num) { @@ -281,7 +284,7 @@ static int master_xfer(struct i2c_adapter* adapter, struct i2c_msg *msg, int num i += inc; } - mutex_unlock(&ttusb->semi2c); + up(&ttusb->semi2c); return i; } @@ -484,6 +487,31 @@ static int ttusb_send_diseqc(struct dvb_frontend* fe, } #endif +static int lnbp21_set_voltage(struct dvb_frontend* fe, fe_sec_voltage_t voltage) +{ + struct ttusb* ttusb = (struct ttusb*) fe->dvb->priv; + int ret; + u8 data[1]; + struct i2c_msg msg = { .addr = 0x08, .flags = 0, .buf = data, .len = sizeof(data) }; + + switch(voltage) { + case SEC_VOLTAGE_OFF: + data[0] = 0x00; + break; + case SEC_VOLTAGE_13: + data[0] = 0x44; + break; + case SEC_VOLTAGE_18: + data[0] = 0x4c; + break; + default: + return -EINVAL; + }; + + ret = i2c_transfer(&ttusb->i2c_adap, &msg, 1); + return (ret != 1) ? -EIO : 0; +} + static int ttusb_update_lnb(struct ttusb *ttusb) { u8 b[] = { 0xaa, ++ttusb->c, 0x16, 5, /*power: */ 1, @@ -661,7 +689,8 @@ static void ttusb_process_frame(struct ttusb *ttusb, u8 * data, int len) memcpy(ttusb->muxpack + ttusb->muxpack_ptr, data, avail); ttusb->muxpack_ptr += avail; - BUG_ON(ttusb->muxpack_ptr > 264); + if (ttusb->muxpack_ptr > 264) + BUG(); data += avail; len -= avail; /* determine length */ @@ -1021,7 +1050,7 @@ static u32 functionality(struct i2c_adapter *adapter) -static int alps_tdmb7_tuner_set_params(struct dvb_frontend* fe, struct dvb_frontend_parameters* params) +static int alps_tdmb7_pll_set(struct dvb_frontend* fe, struct dvb_frontend_parameters* params) { struct ttusb* ttusb = (struct ttusb*) fe->dvb->priv; u8 data[4]; @@ -1035,21 +1064,20 @@ static int alps_tdmb7_tuner_set_params(struct dvb_frontend* fe, struct dvb_front data[2] = ((div >> 10) & 0x60) | 0x85; data[3] = params->frequency < 592000000 ? 0x40 : 0x80; - if (fe->ops.i2c_gate_ctrl) - fe->ops.i2c_gate_ctrl(fe, 1); if (i2c_transfer(&ttusb->i2c_adap, &msg, 1) != 1) return -EIO; return 0; } static struct cx22700_config alps_tdmb7_config = { .demod_address = 0x43, + .pll_set = alps_tdmb7_pll_set, }; -static int philips_tdm1316l_tuner_init(struct dvb_frontend* fe) +static int philips_tdm1316l_pll_init(struct dvb_frontend* fe) { struct ttusb* ttusb = (struct ttusb*) fe->dvb->priv; static u8 td1316_init[] = { 0x0b, 0xf5, 0x85, 0xab }; @@ -1057,8 +1085,6 @@ static int philips_tdm1316l_tuner_init(struct dvb_frontend* fe) struct i2c_msg tuner_msg = { .addr=0x60, .flags=0, .buf=td1316_init, .len=sizeof(td1316_init) }; // setup PLL configuration - if (fe->ops.i2c_gate_ctrl) - fe->ops.i2c_gate_ctrl(fe, 1); if (i2c_transfer(&ttusb->i2c_adap, &tuner_msg, 1) != 1) return -EIO; msleep(1); @@ -1066,8 +1092,6 @@ static int philips_tdm1316l_tuner_init(struct dvb_frontend* fe) tuner_msg.addr = 0x65; tuner_msg.buf = disable_mc44BC374c; tuner_msg.len = sizeof(disable_mc44BC374c); - if (fe->ops.i2c_gate_ctrl) - fe->ops.i2c_gate_ctrl(fe, 1); if (i2c_transfer(&ttusb->i2c_adap, &tuner_msg, 1) != 1) { i2c_transfer(&ttusb->i2c_adap, &tuner_msg, 1); } @@ -1075,7 +1099,7 @@ static int philips_tdm1316l_tuner_init(struct dvb_frontend* fe) return 0; } -static int philips_tdm1316l_tuner_set_params(struct dvb_frontend* fe, struct dvb_frontend_parameters* params) +static int philips_tdm1316l_pll_set(struct dvb_frontend* fe, struct dvb_frontend_parameters* params) { struct ttusb* ttusb = (struct ttusb*) fe->dvb->priv; u8 tuner_buf[4]; @@ -1135,8 +1159,6 @@ static int philips_tdm1316l_tuner_set_params(struct dvb_frontend* fe, struct dvb tuner_buf[2] = 0xca; tuner_buf[3] = (cp << 5) | (filter << 3) | band; - if (fe->ops.i2c_gate_ctrl) - fe->ops.i2c_gate_ctrl(fe, 1); if (i2c_transfer(&ttusb->i2c_adap, &tuner_msg, 1) != 1) return -EIO; @@ -1156,6 +1178,8 @@ static struct tda1004x_config philips_tdm1316l_config = { .demod_address = 0x8, .invert = 1, .invert_oclk = 0, + .pll_init = philips_tdm1316l_pll_init, + .pll_set = philips_tdm1316l_pll_set, .request_firmware = philips_tdm1316l_request_firmware, }; @@ -1277,7 +1301,7 @@ static int alps_stv0299_set_symbol_rate(struct dvb_frontend *fe, u32 srate, u32 return 0; } -static int philips_tsa5059_tuner_set_params(struct dvb_frontend *fe, struct dvb_frontend_parameters *params) +static int philips_tsa5059_pll_set(struct dvb_frontend *fe, struct i2c_adapter *i2c, struct dvb_frontend_parameters *params) { struct ttusb* ttusb = (struct ttusb*) fe->dvb->priv; u8 buf[4]; @@ -1300,9 +1324,7 @@ static int philips_tsa5059_tuner_set_params(struct dvb_frontend *fe, struct dvb_ if (ttusb->revision == TTUSB_REV_2_2) buf[3] |= 0x20; - if (fe->ops.i2c_gate_ctrl) - fe->ops.i2c_gate_ctrl(fe, 1); - if (i2c_transfer(&ttusb->i2c_adap, &msg, 1) != 1) + if (i2c_transfer(i2c, &msg, 1) != 1) return -EIO; return 0; @@ -1318,9 +1340,10 @@ static struct stv0299_config alps_stv0299_config = { .volt13_op0_op1 = STV0299_VOLT13_OP1, .min_delay_ms = 100, .set_symbol_rate = alps_stv0299_set_symbol_rate, + .pll_set = philips_tsa5059_pll_set, }; -static int ttusb_novas_grundig_29504_491_tuner_set_params(struct dvb_frontend *fe, struct dvb_frontend_parameters *params) +static int ttusb_novas_grundig_29504_491_pll_set(struct dvb_frontend *fe, struct dvb_frontend_parameters *params) { struct ttusb* ttusb = (struct ttusb*) fe->dvb->priv; u8 buf[4]; @@ -1334,8 +1357,6 @@ static int ttusb_novas_grundig_29504_491_tuner_set_params(struct dvb_frontend *f buf[2] = 0x8e; buf[3] = 0x00; - if (fe->ops.i2c_gate_ctrl) - fe->ops.i2c_gate_ctrl(fe, 1); if (i2c_transfer(&ttusb->i2c_adap, &msg, 1) != 1) return -EIO; @@ -1345,9 +1366,10 @@ static int ttusb_novas_grundig_29504_491_tuner_set_params(struct dvb_frontend *f static struct tda8083_config ttusb_novas_grundig_29504_491_config = { .demod_address = 0x68, + .pll_set = ttusb_novas_grundig_29504_491_pll_set, }; -static int alps_tdbe2_tuner_set_params(struct dvb_frontend* fe, struct dvb_frontend_parameters* params) +static int alps_tdbe2_pll_set(struct dvb_frontend* fe, struct dvb_frontend_parameters* params) { struct ttusb* ttusb = fe->dvb->priv; u32 div; @@ -1361,8 +1383,6 @@ static int alps_tdbe2_tuner_set_params(struct dvb_frontend* fe, struct dvb_front data[2] = 0x85 | ((div >> 10) & 0x60); data[3] = (params->frequency < 174000000 ? 0x88 : params->frequency < 470000000 ? 0x84 : 0x81); - if (fe->ops.i2c_gate_ctrl) - fe->ops.i2c_gate_ctrl(fe, 1); if (i2c_transfer (&ttusb->i2c_adap, &msg, 1) != 1) return -EIO; @@ -1375,6 +1395,7 @@ static struct ves1820_config alps_tdbe2_config = { .xin = 57840000UL, .invert = 1, .selagc = VES1820_SELAGC_SIGNAMPERR, + .pll_set = alps_tdbe2_pll_set, }; static u8 read_pwm(struct ttusb* ttusb) @@ -1391,174 +1412,6 @@ static u8 read_pwm(struct ttusb* ttusb) } -static int dvbc_philips_tdm1316l_tuner_set_params(struct dvb_frontend *fe, struct dvb_frontend_parameters *params) -{ - struct ttusb *ttusb = (struct ttusb *) fe->dvb->priv; - u8 tuner_buf[5]; - struct i2c_msg tuner_msg = {.addr = 0x60, - .flags = 0, - .buf = tuner_buf, - .len = sizeof(tuner_buf) }; - int tuner_frequency = 0; - u8 band, cp, filter; - - // determine charge pump - tuner_frequency = params->frequency; - if (tuner_frequency < 87000000) {return -EINVAL;} - else if (tuner_frequency < 130000000) {cp = 3; band = 1;} - else if (tuner_frequency < 160000000) {cp = 5; band = 1;} - else if (tuner_frequency < 200000000) {cp = 6; band = 1;} - else if (tuner_frequency < 290000000) {cp = 3; band = 2;} - else if (tuner_frequency < 420000000) {cp = 5; band = 2;} - else if (tuner_frequency < 480000000) {cp = 6; band = 2;} - else if (tuner_frequency < 620000000) {cp = 3; band = 4;} - else if (tuner_frequency < 830000000) {cp = 5; band = 4;} - else if (tuner_frequency < 895000000) {cp = 7; band = 4;} - else {return -EINVAL;} - - // assume PLL filter should always be 8MHz for the moment. - filter = 1; - - // calculate divisor - // (Finput + Fif)/Fref; Fif = 36125000 Hz, Fref = 62500 Hz - tuner_frequency = ((params->frequency + 36125000) / 62500); - - // setup tuner buffer - tuner_buf[0] = tuner_frequency >> 8; - tuner_buf[1] = tuner_frequency & 0xff; - tuner_buf[2] = 0xc8; - tuner_buf[3] = (cp << 5) | (filter << 3) | band; - tuner_buf[4] = 0x80; - - if (fe->ops.i2c_gate_ctrl) - fe->ops.i2c_gate_ctrl(fe, 1); - if (i2c_transfer(&ttusb->i2c_adap, &tuner_msg, 1) != 1) { - printk("dvb-ttusb-budget: dvbc_philips_tdm1316l_pll_set Error 1\n"); - return -EIO; - } - - msleep(50); - - if (fe->ops.i2c_gate_ctrl) - fe->ops.i2c_gate_ctrl(fe, 1); - if (i2c_transfer(&ttusb->i2c_adap, &tuner_msg, 1) != 1) { - printk("dvb-ttusb-budget: dvbc_philips_tdm1316l_pll_set Error 2\n"); - return -EIO; - } - - msleep(1); - - return 0; -} - -static u8 dvbc_philips_tdm1316l_inittab[] = { - 0x80, 0x21, - 0x80, 0x20, - 0x81, 0x01, - 0x81, 0x00, - 0x00, 0x09, - 0x01, 0x69, - 0x03, 0x00, - 0x04, 0x00, - 0x07, 0x00, - 0x08, 0x00, - 0x20, 0x00, - 0x21, 0x40, - 0x22, 0x00, - 0x23, 0x00, - 0x24, 0x40, - 0x25, 0x88, - 0x30, 0xff, - 0x31, 0x00, - 0x32, 0xff, - 0x33, 0x00, - 0x34, 0x50, - 0x35, 0x7f, - 0x36, 0x00, - 0x37, 0x20, - 0x38, 0x00, - 0x40, 0x1c, - 0x41, 0xff, - 0x42, 0x29, - 0x43, 0x20, - 0x44, 0xff, - 0x45, 0x00, - 0x46, 0x00, - 0x49, 0x04, - 0x4a, 0xff, - 0x4b, 0x7f, - 0x52, 0x30, - 0x55, 0xae, - 0x56, 0x47, - 0x57, 0xe1, - 0x58, 0x3a, - 0x5a, 0x1e, - 0x5b, 0x34, - 0x60, 0x00, - 0x63, 0x00, - 0x64, 0x00, - 0x65, 0x00, - 0x66, 0x00, - 0x67, 0x00, - 0x68, 0x00, - 0x69, 0x00, - 0x6a, 0x02, - 0x6b, 0x00, - 0x70, 0xff, - 0x71, 0x00, - 0x72, 0x00, - 0x73, 0x00, - 0x74, 0x0c, - 0x80, 0x00, - 0x81, 0x00, - 0x82, 0x00, - 0x83, 0x00, - 0x84, 0x04, - 0x85, 0x80, - 0x86, 0x24, - 0x87, 0x78, - 0x88, 0x00, - 0x89, 0x00, - 0x90, 0x01, - 0x91, 0x01, - 0xa0, 0x00, - 0xa1, 0x00, - 0xa2, 0x00, - 0xb0, 0x91, - 0xb1, 0x0b, - 0xc0, 0x4b, - 0xc1, 0x00, - 0xc2, 0x00, - 0xd0, 0x00, - 0xd1, 0x00, - 0xd2, 0x00, - 0xd3, 0x00, - 0xd4, 0x00, - 0xd5, 0x00, - 0xde, 0x00, - 0xdf, 0x00, - 0x61, 0x38, - 0x62, 0x0a, - 0x53, 0x13, - 0x59, 0x08, - 0x55, 0x00, - 0x56, 0x40, - 0x57, 0x08, - 0x58, 0x3d, - 0x88, 0x10, - 0xa0, 0x00, - 0xa0, 0x00, - 0xa0, 0x00, - 0xa0, 0x04, - 0xff, 0xff, -}; - -static struct stv0297_config dvbc_philips_tdm1316l_config = { - .demod_address = 0x1c, - .inittab = dvbc_philips_tdm1316l_inittab, - .invert = 0, -}; - static void frontend_init(struct ttusb* ttusb) { switch(le16_to_cpu(ttusb->dev->descriptor.idProduct)) { @@ -1566,13 +1419,11 @@ static void frontend_init(struct ttusb* ttusb) // try the stv0299 based first ttusb->fe = stv0299_attach(&alps_stv0299_config, &ttusb->i2c_adap); if (ttusb->fe != NULL) { - ttusb->fe->ops.tuner_ops.set_params = philips_tsa5059_tuner_set_params; - if(ttusb->revision == TTUSB_REV_2_2) { // ALPS BSBE1 alps_stv0299_config.inittab = alps_bsbe1_inittab; - lnbp21_attach(ttusb->fe, &ttusb->i2c_adap, 0, 0); + ttusb->fe->ops->set_voltage = lnbp21_set_voltage; } else { // ALPS BSRU6 - ttusb->fe->ops.set_voltage = ttusb_set_voltage; + ttusb->fe->ops->set_voltage = ttusb_set_voltage; } break; } @@ -1580,41 +1431,28 @@ static void frontend_init(struct ttusb* ttusb) // Grundig 29504-491 ttusb->fe = tda8083_attach(&ttusb_novas_grundig_29504_491_config, &ttusb->i2c_adap); if (ttusb->fe != NULL) { - ttusb->fe->ops.tuner_ops.set_params = ttusb_novas_grundig_29504_491_tuner_set_params; - ttusb->fe->ops.set_voltage = ttusb_set_voltage; + ttusb->fe->ops->set_voltage = ttusb_set_voltage; break; } + break; case 0x1004: // Hauppauge/TT DVB-C budget (ves1820/ALPS TDBE2(sp5659)) ttusb->fe = ves1820_attach(&alps_tdbe2_config, &ttusb->i2c_adap, read_pwm(ttusb)); - if (ttusb->fe != NULL) { - ttusb->fe->ops.tuner_ops.set_params = alps_tdbe2_tuner_set_params; + if (ttusb->fe != NULL) break; - } - - ttusb->fe = stv0297_attach(&dvbc_philips_tdm1316l_config, &ttusb->i2c_adap); - if (ttusb->fe != NULL) { - ttusb->fe->ops.tuner_ops.set_params = dvbc_philips_tdm1316l_tuner_set_params; - break; - } break; case 0x1005: // Hauppauge/TT Nova-USB-t budget (tda10046/Philips td1316(tda6651tt) OR cx22700/ALPS TDMB7(??)) // try the ALPS TDMB7 first ttusb->fe = cx22700_attach(&alps_tdmb7_config, &ttusb->i2c_adap); - if (ttusb->fe != NULL) { - ttusb->fe->ops.tuner_ops.set_params = alps_tdmb7_tuner_set_params; + if (ttusb->fe != NULL) break; - } // Philips td1316 ttusb->fe = tda10046_attach(&philips_tdm1316l_config, &ttusb->i2c_adap); - if (ttusb->fe != NULL) { - ttusb->fe->ops.tuner_ops.init = philips_tdm1316l_tuner_init; - ttusb->fe->ops.tuner_ops.set_params = philips_tdm1316l_tuner_set_params; + if (ttusb->fe != NULL) break; - } break; } @@ -1625,8 +1463,8 @@ static void frontend_init(struct ttusb* ttusb) } else { if (dvb_register_frontend(&ttusb->adapter, ttusb->fe)) { printk("dvb-ttusb-budget: Frontend registration failed!\n"); - if (ttusb->fe->ops.release) - ttusb->fe->ops.release(ttusb->fe); + if (ttusb->fe->ops->release) + ttusb->fe->ops->release(ttusb->fe); ttusb->fe = NULL; } } @@ -1657,11 +1495,8 @@ static int ttusb_probe(struct usb_interface *intf, const struct usb_device_id *i ttusb->dev = udev; ttusb->c = 0; ttusb->mux_state = 0; - mutex_init(&ttusb->semi2c); - - mutex_lock(&ttusb->semi2c); - - mutex_init(&ttusb->semusb); + sema_init(&ttusb->semi2c, 0); + sema_init(&ttusb->semusb, 1); ttusb_setup_interfaces(ttusb); @@ -1669,13 +1504,9 @@ static int ttusb_probe(struct usb_interface *intf, const struct usb_device_id *i if (ttusb_init_controller(ttusb)) printk("ttusb_init_controller: error\n"); - mutex_unlock(&ttusb->semi2c); + up(&ttusb->semi2c); - if ((result = dvb_register_adapter(&ttusb->adapter, "Technotrend/Hauppauge Nova-USB", THIS_MODULE, &udev->dev)) < 0) { - ttusb_free_iso_urbs(ttusb); - kfree(ttusb); - return result; - } + dvb_register_adapter(&ttusb->adapter, "Technotrend/Hauppauge Nova-USB", THIS_MODULE); ttusb->adapter.priv = ttusb; /* i2c */ @@ -1742,6 +1573,13 @@ static int ttusb_probe(struct usb_interface *intf, const struct usb_device_id *i return -ENODEV; } +#if 0 + ttusb->stc_devfs_handle = + devfs_register(ttusb->adapter->devfs_handle, TTUSB_BUDGET_NAME, + DEVFS_FL_DEFAULT, 0, 192, + S_IFCHR | S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP + | S_IROTH | S_IWOTH, &stc_fops, ttusb); +#endif usb_set_intfdata(intf, (void *) ttusb); frontend_init(ttusb); diff --git a/drivers/media/dvb/ttusb-dec/ttusb_dec.c b/drivers/media/dvb/ttusb-dec/ttusb_dec.c index 6c1cb770b..df831171e 100644 --- a/drivers/media/dvb/ttusb-dec/ttusb_dec.c +++ b/drivers/media/dvb/ttusb-dec/ttusb_dec.c @@ -20,8 +20,7 @@ * */ -#include - +#include #include #include #include @@ -116,7 +115,7 @@ struct ttusb_dec { unsigned int out_pipe; unsigned int irq_pipe; enum ttusb_dec_interface interface; - struct mutex usb_mutex; + struct semaphore usb_sem; void *irq_buffer; struct urb *irq_urb; @@ -125,7 +124,7 @@ struct ttusb_dec { dma_addr_t iso_dma_handle; struct urb *iso_urb[ISO_BUF_COUNT]; int iso_stream_count; - struct mutex iso_mutex; + struct semaphore iso_sem; u8 packet[MAX_PVA_LENGTH + 4]; enum ttusb_dec_packet_type packet_type; @@ -274,9 +273,9 @@ static int ttusb_dec_send_command(struct ttusb_dec *dec, const u8 command, if (!b) return -ENOMEM; - if ((result = mutex_lock_interruptible(&dec->usb_mutex))) { + if ((result = down_interruptible(&dec->usb_sem))) { kfree(b); - printk("%s: Failed to lock usb mutex.\n", __FUNCTION__); + printk("%s: Failed to down usb semaphore.\n", __FUNCTION__); return result; } @@ -301,7 +300,7 @@ static int ttusb_dec_send_command(struct ttusb_dec *dec, const u8 command, if (result) { printk("%s: command bulk message failed: error %d\n", __FUNCTION__, result); - mutex_unlock(&dec->usb_mutex); + up(&dec->usb_sem); kfree(b); return result; } @@ -312,7 +311,7 @@ static int ttusb_dec_send_command(struct ttusb_dec *dec, const u8 command, if (result) { printk("%s: result bulk message failed: error %d\n", __FUNCTION__, result); - mutex_unlock(&dec->usb_mutex); + up(&dec->usb_sem); kfree(b); return result; } else { @@ -328,7 +327,7 @@ static int ttusb_dec_send_command(struct ttusb_dec *dec, const u8 command, if (cmd_result && b[3] > 0) memcpy(cmd_result, &b[4], b[3]); - mutex_unlock(&dec->usb_mutex); + up(&dec->usb_sem); kfree(b); return 0; @@ -836,7 +835,7 @@ static void ttusb_dec_stop_iso_xfer(struct ttusb_dec *dec) dprintk("%s\n", __FUNCTION__); - if (mutex_lock_interruptible(&dec->iso_mutex)) + if (down_interruptible(&dec->iso_sem)) return; dec->iso_stream_count--; @@ -846,7 +845,7 @@ static void ttusb_dec_stop_iso_xfer(struct ttusb_dec *dec) usb_kill_urb(dec->iso_urb[i]); } - mutex_unlock(&dec->iso_mutex); + up(&dec->iso_sem); } /* Setting the interface of the DEC tends to take down the USB communications @@ -891,7 +890,7 @@ static int ttusb_dec_start_iso_xfer(struct ttusb_dec *dec) dprintk("%s\n", __FUNCTION__); - if (mutex_lock_interruptible(&dec->iso_mutex)) + if (down_interruptible(&dec->iso_sem)) return -EAGAIN; if (!dec->iso_stream_count) { @@ -912,7 +911,7 @@ static int ttusb_dec_start_iso_xfer(struct ttusb_dec *dec) i--; } - mutex_unlock(&dec->iso_mutex); + up(&dec->iso_sem); return result; } } @@ -920,7 +919,7 @@ static int ttusb_dec_start_iso_xfer(struct ttusb_dec *dec) dec->iso_stream_count++; - mutex_unlock(&dec->iso_mutex); + up(&dec->iso_sem); return 0; } @@ -1230,8 +1229,8 @@ static int ttusb_dec_init_usb(struct ttusb_dec *dec) { dprintk("%s\n", __FUNCTION__); - mutex_init(&dec->usb_mutex); - mutex_init(&dec->iso_mutex); + sema_init(&dec->usb_sem, 1); + sema_init(&dec->iso_sem, 1); dec->command_pipe = usb_sndbulkpipe(dec->udev, COMMAND_PIPE); dec->result_pipe = usb_rcvbulkpipe(dec->udev, RESULT_PIPE); @@ -1432,7 +1431,7 @@ static int ttusb_dec_init_dvb(struct ttusb_dec *dec) dprintk("%s\n", __FUNCTION__); if ((result = dvb_register_adapter(&dec->adapter, - dec->model_name, THIS_MODULE, &dec->udev->dev)) < 0) { + dec->model_name, THIS_MODULE)) < 0) { printk("%s: dvb_register_adapter failed: error %d\n", __FUNCTION__, result); @@ -1657,8 +1656,8 @@ static int ttusb_dec_probe(struct usb_interface *intf, } else { if (dvb_register_frontend(&dec->adapter, dec->fe)) { printk("budget-ci: Frontend registration failed!\n"); - if (dec->fe->ops.release) - dec->fe->ops.release(dec->fe); + if (dec->fe->ops->release) + dec->fe->ops->release(dec->fe); dec->fe = NULL; } } diff --git a/drivers/media/dvb/ttusb-dec/ttusbdecfe.c b/drivers/media/dvb/ttusb-dec/ttusbdecfe.c index 42f39a89b..a5a46175f 100644 --- a/drivers/media/dvb/ttusb-dec/ttusbdecfe.c +++ b/drivers/media/dvb/ttusb-dec/ttusbdecfe.c @@ -28,6 +28,8 @@ struct ttusbdecfe_state { + struct dvb_frontend_ops ops; + /* configuration settings */ const struct ttusbdecfe_config* config; @@ -201,9 +203,10 @@ struct dvb_frontend* ttusbdecfe_dvbt_attach(const struct ttusbdecfe_config* conf /* setup the state */ state->config = config; + memcpy(&state->ops, &ttusbdecfe_dvbt_ops, sizeof(struct dvb_frontend_ops)); /* create dvb_frontend */ - memcpy(&state->frontend.ops, &ttusbdecfe_dvbt_ops, sizeof(struct dvb_frontend_ops)); + state->frontend.ops = &state->ops; state->frontend.demodulator_priv = state; return &state->frontend; } @@ -223,9 +226,10 @@ struct dvb_frontend* ttusbdecfe_dvbs_attach(const struct ttusbdecfe_config* conf state->config = config; state->voltage = 0; state->hi_band = 0; + memcpy(&state->ops, &ttusbdecfe_dvbs_ops, sizeof(struct dvb_frontend_ops)); /* create dvb_frontend */ - memcpy(&state->frontend.ops, &ttusbdecfe_dvbs_ops, sizeof(struct dvb_frontend_ops)); + state->frontend.ops = &state->ops; state->frontend.demodulator_priv = state; return &state->frontend; } diff --git a/drivers/media/radio/Kconfig b/drivers/media/radio/Kconfig index 220076b1b..d318be383 100644 --- a/drivers/media/radio/Kconfig +++ b/drivers/media/radio/Kconfig @@ -7,7 +7,7 @@ menu "Radio Adapters" config RADIO_CADET tristate "ADS Cadet AM/FM Tuner" - depends on ISA && VIDEO_V4L1 + depends on ISA && VIDEO_DEV ---help--- Choose Y here if you have one of these AM/FM radio cards, and then fill in the port address below. @@ -25,7 +25,7 @@ config RADIO_CADET config RADIO_RTRACK tristate "AIMSlab RadioTrack (aka RadioReveal) support" - depends on ISA && VIDEO_V4L1 + depends on ISA && VIDEO_DEV ---help--- Choose Y here if you have one of these FM radio cards, and then fill in the port address below. @@ -59,7 +59,7 @@ config RADIO_RTRACK_PORT config RADIO_RTRACK2 tristate "AIMSlab RadioTrack II support" - depends on ISA && VIDEO_V4L1 + depends on ISA && VIDEO_DEV ---help--- Choose Y here if you have this FM radio card, and then fill in the port address below. @@ -82,7 +82,7 @@ config RADIO_RTRACK2_PORT config RADIO_AZTECH tristate "Aztech/Packard Bell Radio" - depends on ISA && VIDEO_V4L1 + depends on ISA && VIDEO_DEV ---help--- Choose Y here if you have one of these FM radio cards, and then fill in the port address below. @@ -106,7 +106,7 @@ config RADIO_AZTECH_PORT config RADIO_GEMTEK tristate "GemTek Radio Card support" - depends on ISA && VIDEO_V4L1 + depends on ISA && VIDEO_DEV ---help--- Choose Y here if you have this FM radio card, and then fill in the port address below. @@ -131,12 +131,12 @@ config RADIO_GEMTEK_PORT config RADIO_GEMTEK_PCI tristate "GemTek PCI Radio Card support" - depends on VIDEO_V4L1 && PCI + depends on VIDEO_DEV && PCI ---help--- Choose Y here if you have this PCI FM radio card. In order to control your radio card, you will need to use programs - that are compatible with the Video for Linux API. Information on + that are compatible with the Video for Linux API. Information on this API and pointers to "v4l" programs may be found at . @@ -145,7 +145,7 @@ config RADIO_GEMTEK_PCI config RADIO_MAXIRADIO tristate "Guillemot MAXI Radio FM 2000 radio" - depends on VIDEO_V4L1 && PCI + depends on VIDEO_DEV && PCI ---help--- Choose Y here if you have this radio card. This card may also be found as Gemtek PCI FM. @@ -160,7 +160,7 @@ config RADIO_MAXIRADIO config RADIO_MAESTRO tristate "Maestro on board radio" - depends on VIDEO_V4L1 + depends on VIDEO_DEV ---help--- Say Y here to directly support the on-board radio tuner on the Maestro 2 or 2E sound card. @@ -175,7 +175,7 @@ config RADIO_MAESTRO config RADIO_MIROPCM20 tristate "miroSOUND PCM20 radio" - depends on ISA && VIDEO_V4L1 && SOUND_ACI_MIXER + depends on ISA && VIDEO_DEV && SOUND_ACI_MIXER ---help--- Choose Y here if you have this FM radio card. You also need to say Y to "ACI mixer (miroSOUND PCM1-pro/PCM12/PCM20 radio)" (in "Sound") @@ -208,7 +208,7 @@ config RADIO_MIROPCM20_RDS config RADIO_SF16FMI tristate "SF16FMI Radio" - depends on ISA && VIDEO_V4L1 + depends on ISA && VIDEO_DEV ---help--- Choose Y here if you have one of these FM radio cards. If you compile the driver into the kernel and your card is not PnP one, you @@ -225,7 +225,7 @@ config RADIO_SF16FMI config RADIO_SF16FMR2 tristate "SF16FMR2 Radio" - depends on ISA && VIDEO_V4L1 + depends on ISA && VIDEO_DEV ---help--- Choose Y here if you have one of these FM radio cards. @@ -239,7 +239,7 @@ config RADIO_SF16FMR2 config RADIO_TERRATEC tristate "TerraTec ActiveRadio ISA Standalone" - depends on ISA && VIDEO_V4L1 + depends on ISA && VIDEO_DEV ---help--- Choose Y here if you have this FM radio card, and then fill in the port address below. (TODO) @@ -268,7 +268,7 @@ config RADIO_TERRATEC_PORT config RADIO_TRUST tristate "Trust FM radio card" - depends on ISA && VIDEO_V4L1 + depends on ISA && VIDEO_DEV help This is a driver for the Trust FM radio cards. Say Y if you have such a card and want to use it under Linux. @@ -286,7 +286,7 @@ config RADIO_TRUST_PORT config RADIO_TYPHOON tristate "Typhoon Radio (a.k.a. EcoRadio)" - depends on ISA && VIDEO_V4L1 + depends on ISA && VIDEO_DEV ---help--- Choose Y here if you have one of these FM radio cards, and then fill in the port address and the frequency used for muting below. @@ -330,7 +330,7 @@ config RADIO_TYPHOON_MUTEFREQ config RADIO_ZOLTRIX tristate "Zoltrix Radio" - depends on ISA && VIDEO_V4L1 + depends on ISA && VIDEO_DEV ---help--- Choose Y here if you have one of these FM radio cards, and then fill in the port address below. @@ -350,15 +350,5 @@ config RADIO_ZOLTRIX_PORT help Enter the I/O port of your Zoltrix radio card. -config USB_DSBR - tristate "D-Link USB FM radio support (EXPERIMENTAL)" - depends on USB && VIDEO_V4L1 && EXPERIMENTAL - ---help--- - Say Y here if you want to connect this type of radio to your - computer's USB port. Note that the audio is not digital, and - you must connect the line out connector to a sound card or a - set of speakers. - - To compile this driver as a module, choose M here: the - module will be called dsbr100. endmenu + diff --git a/drivers/media/radio/Makefile b/drivers/media/radio/Makefile index cf55a18e3..8b351945d 100644 --- a/drivers/media/radio/Makefile +++ b/drivers/media/radio/Makefile @@ -20,6 +20,3 @@ obj-$(CONFIG_RADIO_GEMTEK) += radio-gemtek.o obj-$(CONFIG_RADIO_GEMTEK_PCI) += radio-gemtek-pci.o obj-$(CONFIG_RADIO_TRUST) += radio-trust.o obj-$(CONFIG_RADIO_MAESTRO) += radio-maestro.o -obj-$(CONFIG_USB_DSBR) += dsbr100.o - -EXTRA_CFLAGS += -Isound diff --git a/drivers/media/radio/miropcm20-radio.c b/drivers/media/radio/miropcm20-radio.c index c4312fa0e..dc292da26 100644 --- a/drivers/media/radio/miropcm20-radio.c +++ b/drivers/media/radio/miropcm20-radio.c @@ -16,14 +16,13 @@ /* What ever you think about the ACI, version 0x07 is not very well! * I can't get frequency, 'tuner status', 'tuner flags' or mute/mono - * conditions... Robert + * conditions... Robert */ #include #include #include -#include -#include "oss/aci.h" +#include "../../../sound/oss/aci.h" #include "miropcm20-rds-core.h" static int radio_nr = -1; @@ -124,7 +123,7 @@ static int pcm20_do_ioctl(struct inode *inode, struct file *file, struct video_device *dev = video_devdata(file); struct pcm20_device *pcm20 = dev->priv; int i; - + switch(cmd) { case VIDIOCGCAP: @@ -140,7 +139,7 @@ static int pcm20_do_ioctl(struct inode *inode, struct file *file, case VIDIOCGTUNER: { struct video_tuner *v = arg; - if(v->tuner) /* Only 1 tuner */ + if(v->tuner) /* Only 1 tuner */ return -EINVAL; v->rangelow=87*16000; v->rangehigh=108*16000; @@ -173,7 +172,7 @@ static int pcm20_do_ioctl(struct inode *inode, struct file *file, return i; } case VIDIOCGAUDIO: - { + { struct video_audio *v = arg; memset(v,0, sizeof(*v)); v->flags=VIDEO_AUDIO_MUTABLE; @@ -184,12 +183,12 @@ static int pcm20_do_ioctl(struct inode *inode, struct file *file, v->mode|=VIDEO_SOUND_MONO; /* v->step=2048; */ strcpy(v->name, "Radio"); - return 0; + return 0; } case VIDIOCSAUDIO: { struct video_audio *v = arg; - if(v->audio) + if(v->audio) return -EINVAL; pcm20_mute(pcm20, !!(v->flags&VIDEO_AUDIO_MUTE)); @@ -238,7 +237,7 @@ static int __init pcm20_init(void) { if(video_register_device(&pcm20_radio, VFL_TYPE_RADIO, radio_nr)==-1) goto video_register_device; - + if(attach_aci_rds()<0) goto attach_aci_rds; diff --git a/drivers/media/radio/miropcm20-rds-core.c b/drivers/media/radio/miropcm20-rds-core.c index 9428d8b26..a917a90cb 100644 --- a/drivers/media/radio/miropcm20-rds-core.c +++ b/drivers/media/radio/miropcm20-rds-core.c @@ -18,39 +18,38 @@ #include #include #include -#include - +#include #include -#include "oss/aci.h" +#include "../../../sound/oss/aci.h" #include "miropcm20-rds-core.h" #define DEBUG 0 -static struct mutex aci_rds_mutex; +static struct semaphore aci_rds_sem; #define RDS_DATASHIFT 2 /* Bit 2 */ #define RDS_DATAMASK (1 << RDS_DATASHIFT) #define RDS_BUSYMASK 0x10 /* Bit 4 */ #define RDS_CLOCKMASK 0x08 /* Bit 3 */ -#define RDS_DATA(x) (((x) >> RDS_DATASHIFT) & 1) +#define RDS_DATA(x) (((x) >> RDS_DATASHIFT) & 1) #if DEBUG static void print_matrix(char array[], unsigned int length) { - int i, j; - - for (i=0; i=0; j--) { - printk("%d", (array[i] >> j) & 0x1); - } - if (i%8 == 0) - printk(" byte-border\n"); - else - printk("\n"); - } + int i, j; + + for (i=0; i=0; j--) { + printk("%d", (array[i] >> j) & 0x1); + } + if (i%8 == 0) + printk(" byte-border\n"); + else + printk("\n"); + } } #endif /* DEBUG */ @@ -114,7 +113,7 @@ static int rds_write(unsigned char cmd) { unsigned char sendbuffer[8]; int i; - + if (byte2trans(cmd, sendbuffer, 8) != 0){ return -1; } else { @@ -151,7 +150,7 @@ static int rds_read(unsigned char databuffer[], int datasize) I have to waitread() here */ if (rds_waitread() < 0) return -1; - + memset(databuffer, 0, datasize); for (i=0; i< READSIZE; i++) @@ -182,7 +181,7 @@ int aci_rds_cmd(unsigned char cmd, unsigned char databuffer[], int datasize) { int ret; - if (mutex_lock_interruptible(&aci_rds_mutex)) + if (down_interruptible(&aci_rds_sem)) return -EINTR; rds_write(cmd); @@ -193,15 +192,15 @@ int aci_rds_cmd(unsigned char cmd, unsigned char databuffer[], int datasize) else ret = 0; - mutex_unlock(&aci_rds_mutex); - + up(&aci_rds_sem); + return ret; } EXPORT_SYMBOL(aci_rds_cmd); int __init attach_aci_rds(void) { - mutex_init(&aci_rds_mutex); + init_MUTEX(&aci_rds_sem); return 0; } diff --git a/drivers/media/radio/miropcm20-rds.c b/drivers/media/radio/miropcm20-rds.c index c1b1db65e..e09214082 100644 --- a/drivers/media/radio/miropcm20-rds.c +++ b/drivers/media/radio/miropcm20-rds.c @@ -48,7 +48,7 @@ static int rds_f_release(struct inode *in, struct file *fi) static void print_matrix(char *ch, char out[]) { - int j; + int j; for (j=7; j>=0; j--) { out[7-j] = ((*ch >> j) & 0x1) + '0'; @@ -115,6 +115,7 @@ static struct file_operations rds_fops = { static struct miscdevice rds_miscdev = { .minor = MISC_DYNAMIC_MINOR, .name = "radiotext", + .devfs_name = "v4l/rds/radiotext", .fops = &rds_fops, }; diff --git a/drivers/media/radio/radio-aimslab.c b/drivers/media/radio/radio-aimslab.c index df22a582e..914deab4e 100644 --- a/drivers/media/radio/radio-aimslab.c +++ b/drivers/media/radio/radio-aimslab.c @@ -24,7 +24,7 @@ * out(port, start_increasing_volume); * wait(a_wee_while); * out(port, stop_changing_the_volume); - * + * */ #include /* Modules */ @@ -34,7 +34,6 @@ #include /* outb, outb_p */ #include /* copy to/from user */ #include /* kernel radio structs */ -#include #include /* CONFIG_RADIO_RTRACK_PORT */ #include /* Lock for the I/O */ @@ -42,9 +41,9 @@ #define CONFIG_RADIO_RTRACK_PORT -1 #endif -static int io = CONFIG_RADIO_RTRACK_PORT; +static int io = CONFIG_RADIO_RTRACK_PORT; static int radio_nr = -1; -static struct mutex lock; +static struct semaphore lock; struct rt_device { @@ -84,23 +83,23 @@ static void rt_incvol(void) static void rt_mute(struct rt_device *dev) { dev->muted = 1; - mutex_lock(&lock); + down(&lock); outb(0xd0, io); /* volume steady, off */ - mutex_unlock(&lock); + up(&lock); } static int rt_setvol(struct rt_device *dev, int vol) { int i; - mutex_lock(&lock); - + down(&lock); + if(vol == dev->curvol) { /* requested volume = current */ if (dev->muted) { /* user is unmuting the card */ dev->muted = 0; outb (0xd8, io); /* enable card */ - } - mutex_unlock(&lock); + } + up(&lock); return 0; } @@ -109,24 +108,24 @@ static int rt_setvol(struct rt_device *dev, int vol) sleep_delay(2000000); /* make sure it's totally down */ outb(0xd0, io); /* volume steady, off */ dev->curvol = 0; /* track the volume state! */ - mutex_unlock(&lock); + up(&lock); return 0; } dev->muted = 0; if(vol > dev->curvol) - for(i = dev->curvol; i < vol; i++) + for(i = dev->curvol; i < vol; i++) rt_incvol(); else - for(i = dev->curvol; i > vol; i--) + for(i = dev->curvol; i > vol; i--) rt_decvol(); dev->curvol = vol; - mutex_unlock(&lock); + up(&lock); return 0; } -/* the 128+64 on these outb's is to keep the volume stable while tuning +/* the 128+64 on these outb's is to keep the volume stable while tuning * without them, the volume _will_ creep up with each frequency change * and bit 4 (+16) is to keep the signal strength meter enabled */ @@ -141,7 +140,7 @@ static void send_0_byte(int port, struct rt_device *dev) outb_p(128+64+16+8+ 1, port); /* on + wr-enable + data low */ outb_p(128+64+16+8+2+1, port); /* clock */ } - sleep_delay(1000); + sleep_delay(1000); } static void send_1_byte(int port, struct rt_device *dev) @@ -149,13 +148,13 @@ static void send_1_byte(int port, struct rt_device *dev) if ((dev->curvol == 0) || (dev->muted)) { outb_p(128+64+16+4 +1, port); /* wr-enable+data high */ outb_p(128+64+16+4+2+1, port); /* clock */ - } + } else { outb_p(128+64+16+8+4 +1, port); /* on+wr-enable+data high */ outb_p(128+64+16+8+4+2+1, port); /* clock */ } - sleep_delay(1000); + sleep_delay(1000); } static int rt_setfreq(struct rt_device *dev, unsigned long freq) @@ -168,9 +167,9 @@ static int rt_setfreq(struct rt_device *dev, unsigned long freq) freq += 171200; /* Add 10.7 MHz IF */ freq /= 800; /* Convert to 50 kHz units */ - - mutex_lock(&lock); /* Stop other ops interfering */ - + + down(&lock); /* Stop other ops interfering */ + send_0_byte (io, dev); /* 0: LSB of frequency */ for (i = 0; i < 13; i++) /* : frequency bits (1-13) */ @@ -196,8 +195,8 @@ static int rt_setfreq(struct rt_device *dev, unsigned long freq) outb (0xd0, io); /* volume steady + sigstr */ else outb (0xd8, io); /* volume steady + sigstr + on */ - - mutex_unlock(&lock); + + up(&lock); return 0; } @@ -214,7 +213,7 @@ static int rt_do_ioctl(struct inode *inode, struct file *file, { struct video_device *dev = video_devdata(file); struct rt_device *rt=dev->priv; - + switch(cmd) { case VIDIOCGCAP: @@ -230,7 +229,7 @@ static int rt_do_ioctl(struct inode *inode, struct file *file, case VIDIOCGTUNER: { struct video_tuner *v = arg; - if(v->tuner) /* Only 1 tuner */ + if(v->tuner) /* Only 1 tuner */ return -EINVAL; v->rangelow=(87*16000); v->rangehigh=(108*16000); @@ -262,21 +261,21 @@ static int rt_do_ioctl(struct inode *inode, struct file *file, return 0; } case VIDIOCGAUDIO: - { + { struct video_audio *v = arg; memset(v,0, sizeof(*v)); v->flags|=VIDEO_AUDIO_MUTABLE|VIDEO_AUDIO_VOLUME; v->volume=rt->curvol * 6554; v->step=6554; strcpy(v->name, "Radio"); - return 0; + return 0; } case VIDIOCSAUDIO: { struct video_audio *v = arg; - if(v->audio) + if(v->audio) return -EINVAL; - if(v->flags&VIDEO_AUDIO_MUTE) + if(v->flags&VIDEO_AUDIO_MUTE) rt_mute(rt); else rt_setvol(rt,v->volume/6554); @@ -299,7 +298,7 @@ static struct file_operations rtrack_fops = { .owner = THIS_MODULE, .open = video_exclusive_open, .release = video_exclusive_release, - .ioctl = rt_ioctl, + .ioctl = rt_ioctl, .compat_ioctl = v4l_compat_ioctl32, .llseek = no_llseek, }; @@ -321,14 +320,14 @@ static int __init rtrack_init(void) return -EINVAL; } - if (!request_region(io, 2, "rtrack")) + if (!request_region(io, 2, "rtrack")) { printk(KERN_ERR "rtrack: port 0x%x already in use\n", io); return -EBUSY; } rtrack_radio.priv=&rtrack_unit; - + if(video_register_device(&rtrack_radio, VFL_TYPE_RADIO, radio_nr)==-1) { release_region(io, 2); @@ -337,10 +336,10 @@ static int __init rtrack_init(void) printk(KERN_INFO "AIMSlab RadioTrack/RadioReveal card driver.\n"); /* Set up the I/O locking */ - - mutex_init(&lock); - - /* mute card - prevents noisy bootups */ + + init_MUTEX(&lock); + + /* mute card - prevents noisy bootups */ /* this ensures that the volume is all the way down */ outb(0x48, io); /* volume down but still "on" */ diff --git a/drivers/media/radio/radio-aztech.c b/drivers/media/radio/radio-aztech.c index 95e632213..523be820f 100644 --- a/drivers/media/radio/radio-aztech.c +++ b/drivers/media/radio/radio-aztech.c @@ -1,11 +1,11 @@ -/* radio-aztech.c - Aztech radio card driver for Linux 2.2 +/* radio-aztech.c - Aztech radio card driver for Linux 2.2 * - * Adapted to support the Video for Linux API by + * Adapted to support the Video for Linux API by * Russell Kroll . Based on original tuner code by: * * Quay Ly * Donald Song - * Jason Lewis (jlewis@twilight.vtc.vsc.edu) + * Jason Lewis (jlewis@twilight.vtc.vsc.edu) * Scott McGrath (smcgrath@twilight.vtc.vsc.edu) * William McGrath (wmcgrath@twilight.vtc.vsc.edu) * @@ -31,7 +31,6 @@ #include /* outb, outb_p */ #include /* copy to/from user */ #include /* kernel radio structs */ -#include #include /* CONFIG_RADIO_AZTECH_PORT */ /* acceptable ports: 0x350 (JP3 shorted), 0x358 (JP3 open) */ @@ -40,10 +39,10 @@ #define CONFIG_RADIO_AZTECH_PORT -1 #endif -static int io = CONFIG_RADIO_AZTECH_PORT; +static int io = CONFIG_RADIO_AZTECH_PORT; static int radio_nr = -1; static int radio_wait_time = 1000; -static struct mutex lock; +static struct semaphore lock; struct az_device { @@ -54,15 +53,15 @@ struct az_device static int volconvert(int level) { - level>>=14; /* Map 16bits down to 2 bit */ - level&=3; - + level>>=14; /* Map 16bits down to 2 bit */ + level&=3; + /* convert to card-friendly values */ - switch (level) + switch (level) { - case 0: + case 0: return 0; - case 1: + case 1: return 1; case 2: return 4; @@ -88,9 +87,9 @@ static void send_1_byte (struct az_device *dev) static int az_setvol(struct az_device *dev, int vol) { - mutex_lock(&lock); + down(&lock); outb (volconvert(vol), io); - mutex_unlock(&lock); + up(&lock); return 0; } @@ -122,9 +121,9 @@ static int az_setfreq(struct az_device *dev, unsigned long frequency) frequency += 171200; /* Add 10.7 MHz IF */ frequency /= 800; /* Convert to 50 kHz units */ - - mutex_lock(&lock); - + + down(&lock); + send_0_byte (dev); /* 0: LSB of frequency */ for (i = 0; i < 13; i++) /* : frequency bits (1-13) */ @@ -152,8 +151,8 @@ static int az_setfreq(struct az_device *dev, unsigned long frequency) udelay (radio_wait_time); outb_p(128+64+volconvert(dev->curvol), io); - - mutex_unlock(&lock); + + up(&lock); return 0; } @@ -163,7 +162,7 @@ static int az_do_ioctl(struct inode *inode, struct file *file, { struct video_device *dev = video_devdata(file); struct az_device *az = dev->priv; - + switch(cmd) { case VIDIOCGCAP: @@ -179,7 +178,7 @@ static int az_do_ioctl(struct inode *inode, struct file *file, case VIDIOCGTUNER: { struct video_tuner *v = arg; - if(v->tuner) /* Only 1 tuner */ + if(v->tuner) /* Only 1 tuner */ return -EINVAL; v->rangelow=(87*16000); v->rangehigh=(108*16000); @@ -212,7 +211,7 @@ static int az_do_ioctl(struct inode *inode, struct file *file, return 0; } case VIDIOCGAUDIO: - { + { struct video_audio *v = arg; memset(v,0, sizeof(*v)); v->flags|=VIDEO_AUDIO_MUTABLE|VIDEO_AUDIO_VOLUME; @@ -223,17 +222,17 @@ static int az_do_ioctl(struct inode *inode, struct file *file, v->volume=az->curvol; v->step=16384; strcpy(v->name, "Radio"); - return 0; + return 0; } case VIDIOCSAUDIO: { struct video_audio *v = arg; - if(v->audio) + if(v->audio) return -EINVAL; az->curvol=v->volume; az->stereo=(v->mode&VIDEO_SOUND_STEREO)?1:0; - if(v->flags&VIDEO_AUDIO_MUTE) + if(v->flags&VIDEO_AUDIO_MUTE) az_setvol(az,0); else az_setvol(az,az->curvol); @@ -278,21 +277,21 @@ static int __init aztech_init(void) return -EINVAL; } - if (!request_region(io, 2, "aztech")) + if (!request_region(io, 2, "aztech")) { printk(KERN_ERR "aztech: port 0x%x already in use\n", io); return -EBUSY; } - mutex_init(&lock); + init_MUTEX(&lock); aztech_radio.priv=&aztech_unit; - + if(video_register_device(&aztech_radio, VFL_TYPE_RADIO, radio_nr)==-1) { release_region(io,2); return -EINVAL; } - + printk(KERN_INFO "Aztech radio card driver v1.00/19990224 rkroll@exploits.org\n"); /* mute card - prevents noisy bootups */ outb (0, io); diff --git a/drivers/media/radio/radio-cadet.c b/drivers/media/radio/radio-cadet.c index 8641aec7b..f1b5ac81e 100644 --- a/drivers/media/radio/radio-cadet.c +++ b/drivers/media/radio/radio-cadet.c @@ -8,7 +8,7 @@ * Russell Kroll (rkroll@exploits.org) * Quay Ly * Donald Song - * Jason Lewis (jlewis@twilight.vtc.vsc.edu) + * Jason Lewis (jlewis@twilight.vtc.vsc.edu) * Scott McGrath (smcgrath@twilight.vtc.vsc.edu) * William McGrath (wmcgrath@twilight.vtc.vsc.edu) * @@ -34,7 +34,6 @@ #include /* outb, outb_p */ #include /* copy to/from user */ #include /* kernel radio structs */ -#include #include #include @@ -56,29 +55,29 @@ static int cadet_probe(void); /* * Signal Strength Threshold Values - * The V4L API spec does not define any particular unit for the signal + * The V4L API spec does not define any particular unit for the signal * strength value. These values are in microvolts of RF at the tuner's input. */ static __u16 sigtable[2][4]={{5,10,30,150},{28,40,63,1000}}; static int cadet_getrds(void) { - int rdsstat=0; + int rdsstat=0; spin_lock(&cadet_io_lock); - outb(3,io); /* Select Decoder Control/Status */ + outb(3,io); /* Select Decoder Control/Status */ outb(inb(io+1)&0x7f,io+1); /* Reset RDS detection */ spin_unlock(&cadet_io_lock); - + msleep(100); - spin_lock(&cadet_io_lock); - outb(3,io); /* Select Decoder Control/Status */ + spin_lock(&cadet_io_lock); + outb(3,io); /* Select Decoder Control/Status */ if((inb(io+1)&0x80)!=0) { - rdsstat|=VIDEO_TUNER_RDS_ON; + rdsstat|=VIDEO_TUNER_RDS_ON; } if((inb(io+1)&0x10)!=0) { - rdsstat|=VIDEO_TUNER_MBS_ON; + rdsstat|=VIDEO_TUNER_MBS_ON; } spin_unlock(&cadet_io_lock); return rdsstat; @@ -87,49 +86,49 @@ static int cadet_getrds(void) static int cadet_getstereo(void) { int ret = 0; - if(curtuner != 0) /* Only FM has stereo capability! */ - return 0; + if(curtuner != 0) /* Only FM has stereo capability! */ + return 0; spin_lock(&cadet_io_lock); - outb(7,io); /* Select tuner control */ + outb(7,io); /* Select tuner control */ if( (inb(io+1) & 0x40) == 0) - ret = 1; - spin_unlock(&cadet_io_lock); - return ret; + ret = 1; + spin_unlock(&cadet_io_lock); + return ret; } static unsigned cadet_gettune(void) { - int curvol,i; + int curvol,i; unsigned fifo=0; - /* - * Prepare for read - */ + /* + * Prepare for read + */ spin_lock(&cadet_io_lock); - - outb(7,io); /* Select tuner control */ - curvol=inb(io+1); /* Save current volume/mute setting */ - outb(0x00,io+1); /* Ensure WRITE-ENABLE is LOW */ + + outb(7,io); /* Select tuner control */ + curvol=inb(io+1); /* Save current volume/mute setting */ + outb(0x00,io+1); /* Ensure WRITE-ENABLE is LOW */ tunestat=0xffff; - /* - * Read the shift register - */ - for(i=0;i<25;i++) { - fifo=(fifo<<1)|((inb(io+1)>>7)&0x01); - if(i<24) { - outb(0x01,io+1); + /* + * Read the shift register + */ + for(i=0;i<25;i++) { + fifo=(fifo<<1)|((inb(io+1)>>7)&0x01); + if(i<24) { + outb(0x01,io+1); tunestat&=inb(io+1); - outb(0x00,io+1); - } - } - - /* - * Restore volume/mute setting - */ - outb(curvol,io+1); + outb(0x00,io+1); + } + } + + /* + * Restore volume/mute setting + */ + outb(curvol,io+1); spin_unlock(&cadet_io_lock); return fifo; @@ -137,43 +136,43 @@ static unsigned cadet_gettune(void) static unsigned cadet_getfreq(void) { - int i; - unsigned freq=0,test,fifo=0; + int i; + unsigned freq=0,test,fifo=0; /* * Read current tuning */ fifo=cadet_gettune(); - /* - * Convert to actual frequency - */ + /* + * Convert to actual frequency + */ if(curtuner==0) { /* FM */ - test=12500; - for(i=0;i<14;i++) { - if((fifo&0x01)!=0) { - freq+=test; - } - test=test<<1; - fifo=fifo>>1; - } - freq-=10700000; /* IF frequency is 10.7 MHz */ - freq=(freq*16)/1000000; /* Make it 1/16 MHz */ + test=12500; + for(i=0;i<14;i++) { + if((fifo&0x01)!=0) { + freq+=test; + } + test=test<<1; + fifo=fifo>>1; + } + freq-=10700000; /* IF frequency is 10.7 MHz */ + freq=(freq*16)/1000000; /* Make it 1/16 MHz */ } if(curtuner==1) { /* AM */ - freq=((fifo&0x7fff)-2010)*16; + freq=((fifo&0x7fff)-2010)*16; } - return freq; + return freq; } static void cadet_settune(unsigned fifo) { - int i; - unsigned test; + int i; + unsigned test; spin_lock(&cadet_io_lock); - + outb(7,io); /* Select tuner control */ /* * Write the shift register @@ -184,7 +183,7 @@ static void cadet_settune(unsigned fifo) outb(7,io); /* Select tuner control */ outb(test,io+1); /* Initialize for write */ for(i=0;i<25;i++) { - test|=0x01; /* Toggle SCK High */ + test|=0x01; /* Toggle SCK High */ outb(test,io+1); test&=0xfe; /* Toggle SCK Low */ outb(test,io+1); @@ -197,57 +196,57 @@ static void cadet_settune(unsigned fifo) static void cadet_setfreq(unsigned freq) { - unsigned fifo; - int i,j,test; - int curvol; + unsigned fifo; + int i,j,test; + int curvol; - /* - * Formulate a fifo command - */ + /* + * Formulate a fifo command + */ fifo=0; if(curtuner==0) { /* FM */ - test=102400; - freq=(freq*1000)/16; /* Make it kHz */ - freq+=10700; /* IF is 10700 kHz */ - for(i=0;i<14;i++) { - fifo=fifo<<1; - if(freq>=test) { - fifo|=0x01; - freq-=test; - } - test=test>>1; - } + test=102400; + freq=(freq*1000)/16; /* Make it kHz */ + freq+=10700; /* IF is 10700 kHz */ + for(i=0;i<14;i++) { + fifo=fifo<<1; + if(freq>=test) { + fifo|=0x01; + freq-=test; + } + test=test>>1; + } } if(curtuner==1) { /* AM */ - fifo=(freq/16)+2010; /* Make it kHz */ + fifo=(freq/16)+2010; /* Make it kHz */ fifo|=0x100000; /* Select AM Band */ } - /* - * Save current volume/mute setting - */ + /* + * Save current volume/mute setting + */ spin_lock(&cadet_io_lock); outb(7,io); /* Select tuner control */ - curvol=inb(io+1); - spin_unlock(&cadet_io_lock); + curvol=inb(io+1); + spin_unlock(&cadet_io_lock); /* * Tune the card */ for(j=3;j>-1;j--) { - cadet_settune(fifo|(j<<16)); - - spin_lock(&cadet_io_lock); + cadet_settune(fifo|(j<<16)); + + spin_lock(&cadet_io_lock); outb(7,io); /* Select tuner control */ outb(curvol,io+1); spin_unlock(&cadet_io_lock); - + msleep(100); cadet_gettune(); if((tunestat & 0x40) == 0) { /* Tuned */ - sigstrength=sigtable[curtuner][j]; + sigstrength=sigtable[curtuner][j]; return; } } @@ -258,28 +257,28 @@ static void cadet_setfreq(unsigned freq) static int cadet_getvol(void) { int ret = 0; - + spin_lock(&cadet_io_lock); - - outb(7,io); /* Select tuner control */ - if((inb(io + 1) & 0x20) != 0) - ret = 0xffff; - - spin_unlock(&cadet_io_lock); - return ret; + + outb(7,io); /* Select tuner control */ + if((inb(io + 1) & 0x20) != 0) + ret = 0xffff; + + spin_unlock(&cadet_io_lock); + return ret; } static void cadet_setvol(int vol) { spin_lock(&cadet_io_lock); - outb(7,io); /* Select tuner control */ - if(vol>0) - outb(0x20,io+1); - else - outb(0x00,io+1); + outb(7,io); /* Select tuner control */ + if(vol>0) + outb(0x20,io+1); + else + outb(0x00,io+1); spin_unlock(&cadet_io_lock); -} +} static void cadet_handler(unsigned long data) { @@ -289,15 +288,15 @@ static void cadet_handler(unsigned long data) if(spin_trylock(&cadet_io_lock)) { - outb(0x3,io); /* Select RDS Decoder Control */ + outb(0x3,io); /* Select RDS Decoder Control */ if((inb(io+1)&0x20)!=0) { - printk(KERN_CRIT "cadet: RDS fifo overflow\n"); + printk(KERN_CRIT "cadet: RDS fifo overflow\n"); } outb(0x80,io); /* Select RDS fifo */ while((inb(io)&0x80)!=0) { - rdsbuf[rdsin]=inb(io+1); + rdsbuf[rdsin]=inb(io+1); if(rdsin==rdsout) - printk(KERN_WARNING "cadet: RDS buffer overflow\n"); + printk(KERN_WARNING "cadet: RDS buffer overflow\n"); else rdsin++; } @@ -308,9 +307,9 @@ static void cadet_handler(unsigned long data) * Service pending read */ if( rdsin!=rdsout) - wake_up_interruptible(&read_queue); + wake_up_interruptible(&read_queue); - /* + /* * Clean up and exit */ init_timer(&readtimer); @@ -325,12 +324,12 @@ static void cadet_handler(unsigned long data) static ssize_t cadet_read(struct file *file, char __user *data, size_t count, loff_t *ppos) { - int i=0; + int i=0; unsigned char readbuf[RDS_BUFFER]; - if(rdsstat==0) { + if(rdsstat==0) { spin_lock(&cadet_io_lock); - rdsstat=1; + rdsstat=1; outb(0x80,io); /* Select RDS fifo */ spin_unlock(&cadet_io_lock); init_timer(&readtimer); @@ -340,15 +339,15 @@ static ssize_t cadet_read(struct file *file, char __user *data, add_timer(&readtimer); } if(rdsin==rdsout) { - if (file->f_flags & O_NONBLOCK) - return -EWOULDBLOCK; - interruptible_sleep_on(&read_queue); - } + if (file->f_flags & O_NONBLOCK) + return -EWOULDBLOCK; + interruptible_sleep_on(&read_queue); + } while( ituner) { - case 0: - strcpy(v->name,"FM"); - v->rangelow=1400; /* 87.5 MHz */ - v->rangehigh=1728; /* 108.0 MHz */ - v->flags=0; - v->mode=0; - v->mode|=VIDEO_MODE_AUTO; - v->signal=sigstrength; - if(cadet_getstereo()==1) { - v->flags|=VIDEO_TUNER_STEREO_ON; - } + case 0: + strcpy(v->name,"FM"); + v->rangelow=1400; /* 87.5 MHz */ + v->rangehigh=1728; /* 108.0 MHz */ + v->flags=0; + v->mode=0; + v->mode|=VIDEO_MODE_AUTO; + v->signal=sigstrength; + if(cadet_getstereo()==1) { + v->flags|=VIDEO_TUNER_STEREO_ON; + } v->flags|=cadet_getrds(); - break; - case 1: - strcpy(v->name,"AM"); - v->rangelow=8320; /* 520 kHz */ - v->rangehigh=26400; /* 1650 kHz */ - v->flags=0; - v->flags|=VIDEO_TUNER_LOW; - v->mode=0; - v->mode|=VIDEO_MODE_AUTO; - v->signal=sigstrength; - break; + break; + case 1: + strcpy(v->name,"AM"); + v->rangelow=8320; /* 520 kHz */ + v->rangehigh=26400; /* 1650 kHz */ + v->flags=0; + v->flags|=VIDEO_TUNER_LOW; + v->mode=0; + v->mode|=VIDEO_MODE_AUTO; + v->signal=sigstrength; + break; } return 0; } @@ -408,49 +407,49 @@ static int cadet_do_ioctl(struct inode *inode, struct file *file, if((v->tuner<0)||(v->tuner>1)) { return -EINVAL; } - curtuner=v->tuner; + curtuner=v->tuner; return 0; } case VIDIOCGFREQ: { - unsigned long *freq = arg; + unsigned long *freq = arg; *freq = cadet_getfreq(); return 0; } case VIDIOCSFREQ: { - unsigned long *freq = arg; + unsigned long *freq = arg; if((curtuner==0)&&((*freq<1400)||(*freq>1728))) { - return -EINVAL; + return -EINVAL; } if((curtuner==1)&&((*freq<8320)||(*freq>26400))) { - return -EINVAL; + return -EINVAL; } cadet_setfreq(*freq); return 0; } case VIDIOCGAUDIO: - { + { struct video_audio *v = arg; memset(v,0, sizeof(*v)); v->flags=VIDEO_AUDIO_MUTABLE|VIDEO_AUDIO_VOLUME; if(cadet_getstereo()==0) { - v->mode=VIDEO_SOUND_MONO; + v->mode=VIDEO_SOUND_MONO; } else { v->mode=VIDEO_SOUND_STEREO; } v->volume=cadet_getvol(); v->step=0xffff; strcpy(v->name, "Radio"); - return 0; + return 0; } case VIDIOCSAUDIO: { struct video_audio *v = arg; - if(v->audio) + if(v->audio) return -EINVAL; cadet_setvol(v->volume); - if(v->flags&VIDEO_AUDIO_MUTE) + if(v->flags&VIDEO_AUDIO_MUTE) cadet_setvol(0); else cadet_setvol(0xffff); @@ -540,16 +539,16 @@ static struct pnp_driver cadet_pnp_driver = { static int cadet_probe(void) { - static int iovals[8]={0x330,0x332,0x334,0x336,0x338,0x33a,0x33c,0x33e}; + static int iovals[8]={0x330,0x332,0x334,0x336,0x338,0x33a,0x33c,0x33e}; int i; for(i=0;i<8;i++) { - io=iovals[i]; + io=iovals[i]; if (request_region(io, 2, "cadet-probe")) { - cadet_setfreq(1410); + cadet_setfreq(1410); if(cadet_getfreq()==1410) { release_region(io, 2); - return io; + return io; } release_region(io, 2); } @@ -557,7 +556,7 @@ static int cadet_probe(void) return -1; } -/* +/* * io should only be set if the user has used something like * isapnp (the userspace program) to initialize this card for us */ @@ -565,7 +564,7 @@ static int cadet_probe(void) static int __init cadet_init(void) { spin_lock_init(&cadet_io_lock); - + /* * If a probe was requested then probe ISAPnP first (safest) */ @@ -580,12 +579,12 @@ static int __init cadet_init(void) /* * Else we bail out */ - - if(io < 0) { -#ifdef MODULE + + if(io < 0) { +#ifdef MODULE printk(KERN_ERR "You must set an I/O address with io=0x???\n"); #endif - goto fail; + goto fail; } if (!request_region(io,2,"cadet")) goto fail; diff --git a/drivers/media/radio/radio-gemtek-pci.c b/drivers/media/radio/radio-gemtek-pci.c index 4c8295639..8e499b8f6 100644 --- a/drivers/media/radio/radio-gemtek-pci.c +++ b/drivers/media/radio/radio-gemtek-pci.c @@ -1,6 +1,6 @@ /* *************************************************************************** - * + * * radio-gemtek-pci.c - Gemtek PCI Radio driver * (C) 2001 Vladimir Shebordaev * @@ -31,19 +31,19 @@ * radio device driver. * * Please, let me know if this piece of code was useful :) - * + * * TODO: multiple device support and portability were not tested * *************************************************************************** */ +#include #include #include #include #include #include #include -#include #include #include @@ -69,18 +69,18 @@ #define TRUE (1) #endif -#ifndef FALSE +#ifndef FALSE #define FALSE (0) #endif struct gemtek_pci_card { struct video_device *videodev; - + u32 iobase; u32 length; u8 chiprev; u16 model; - + u32 current_frequency; u8 mute; }; @@ -96,7 +96,7 @@ static inline u8 gemtek_pci_out( u16 value, u32 port ) return (u8)value; } -#define _b0( v ) *((u8 *)&v) +#define _b0( v ) *((u8 *)&v) static void __gemtek_pci_cmd( u16 value, u32 port, u8 *last_byte, int keep ) { register u8 byte = *last_byte; @@ -104,7 +104,7 @@ static void __gemtek_pci_cmd( u16 value, u32 port, u8 *last_byte, int keep ) if ( !value ) { if ( !keep ) value = (u16)port; - byte &= 0xfd; + byte &= 0xfd; } else byte |= 2; @@ -116,7 +116,7 @@ static void __gemtek_pci_cmd( u16 value, u32 port, u8 *last_byte, int keep ) byte &= 0xfe; _b0( value ) = byte; outw( value, port ); - + *last_byte = byte; } @@ -193,13 +193,13 @@ static int gemtek_pci_do_ioctl(struct inode *inode, struct file *file, c->audios = 1; strcpy( c->name, "Gemtek PCI Radio" ); return 0; - } + } case VIDIOCGTUNER: { struct video_tuner *t = arg; - if ( t->tuner ) + if ( t->tuner ) return -EINVAL; t->rangelow = GEMTEK_PCI_RANGE_LOW; @@ -228,7 +228,7 @@ static int gemtek_pci_do_ioctl(struct inode *inode, struct file *file, case VIDIOCSFREQ: { unsigned long *freq = arg; - + if ( (*freq < GEMTEK_PCI_RANGE_LOW) || (*freq > GEMTEK_PCI_RANGE_HIGH) ) return -EINVAL; @@ -239,9 +239,9 @@ static int gemtek_pci_do_ioctl(struct inode *inode, struct file *file, return 0; } - + case VIDIOCGAUDIO: - { + { struct video_audio *a = arg; memset( a, 0, sizeof( *a ) ); @@ -249,17 +249,17 @@ static int gemtek_pci_do_ioctl(struct inode *inode, struct file *file, a->volume = 1; a->step = 65535; strcpy( a->name, "Radio" ); - return 0; + return 0; } case VIDIOCSAUDIO: { struct video_audio *a = arg; - if ( a->audio ) + if ( a->audio ) return -EINVAL; - if ( a->flags & VIDEO_AUDIO_MUTE ) + if ( a->flags & VIDEO_AUDIO_MUTE ) gemtek_pci_mute( card ); else gemtek_pci_unmute( card ); @@ -323,9 +323,9 @@ static int __devinit gemtek_pci_probe( struct pci_dev *pci_dev, const struct pci return -ENOMEM; } - if ( pci_enable_device( pci_dev ) ) + if ( pci_enable_device( pci_dev ) ) goto err_pci; - + card->iobase = pci_resource_start( pci_dev, 0 ); card->length = pci_resource_len( pci_dev, 0 ); @@ -338,7 +338,7 @@ static int __devinit gemtek_pci_probe( struct pci_dev *pci_dev, const struct pci pci_read_config_word( pci_dev, PCI_SUBSYSTEM_ID, &card->model ); pci_set_drvdata( pci_dev, card ); - + if ( (devradio = kmalloc( sizeof( struct video_device ), GFP_KERNEL )) == NULL ) { printk( KERN_ERR "gemtek_pci: out of memory\n" ); goto err_video; @@ -354,7 +354,7 @@ static int __devinit gemtek_pci_probe( struct pci_dev *pci_dev, const struct pci devradio->priv = card; gemtek_pci_mute( card ); - printk( KERN_INFO "Gemtek PCI Radio (rev. %d) found at 0x%04x-0x%04x.\n", + printk( KERN_INFO "Gemtek PCI Radio (rev. %d) found at 0x%04x-0x%04x.\n", card->chiprev, card->iobase, card->iobase + card->length - 1 ); return 0; @@ -364,7 +364,7 @@ err_video: err_pci: kfree( card ); - return -ENODEV; + return -ENODEV; } static void __devexit gemtek_pci_remove( struct pci_dev *pci_dev ) @@ -375,12 +375,12 @@ static void __devexit gemtek_pci_remove( struct pci_dev *pci_dev ) kfree( card->videodev ); release_region( card->iobase, card->length ); - + if ( mx ) gemtek_pci_mute( card ); kfree( card ); - + pci_set_drvdata( pci_dev, NULL ); } diff --git a/drivers/media/radio/radio-gemtek.c b/drivers/media/radio/radio-gemtek.c index 162f37d8b..47173be97 100644 --- a/drivers/media/radio/radio-gemtek.c +++ b/drivers/media/radio/radio-gemtek.c @@ -6,7 +6,7 @@ * Besides the protocol changes, this is mostly a copy of: * * RadioTrack II driver for Linux radio support (C) 1998 Ben Pfaff - * + * * Based on RadioTrack I/RadioReveal (C) 1997 M. Kirkwood * Converted to new API by Alan Cox * Various bugfixes and enhancements by Russell Kroll @@ -22,7 +22,6 @@ #include /* outb, outb_p */ #include /* copy to/from user */ #include /* kernel radio structs */ -#include #include /* CONFIG_RADIO_GEMTEK_PORT */ #include @@ -30,7 +29,7 @@ #define CONFIG_RADIO_GEMTEK_PORT -1 #endif -static int io = CONFIG_RADIO_GEMTEK_PORT; +static int io = CONFIG_RADIO_GEMTEK_PORT; static int radio_nr = -1; static spinlock_t lock; @@ -49,7 +48,7 @@ struct gemtek_device */ static void gemtek_mute(struct gemtek_device *dev) { - if(dev->muted) + if(dev->muted) return; spin_lock(&lock); outb(0x10, io); @@ -95,20 +94,20 @@ static int gemtek_setfreq(struct gemtek_device *dev, unsigned long freq) freq /= 100000; spin_lock(&lock); - + /* 2 start bits */ outb_p(0x03, io); udelay(5); outb_p(0x07, io); udelay(5); - /* 28 frequency bits (lsb first) */ + /* 28 frequency bits (lsb first) */ for (i = 0; i < 14; i++) if (freq & (1 << i)) one(); else zero(); - /* 36 unknown bits */ + /* 36 unknown bits */ for (i = 0; i < 11; i++) zero(); one(); @@ -124,7 +123,7 @@ static int gemtek_setfreq(struct gemtek_device *dev, unsigned long freq) udelay(5); spin_unlock(&lock); - + return 0; } @@ -160,7 +159,7 @@ static int gemtek_do_ioctl(struct inode *inode, struct file *file, case VIDIOCGTUNER: { struct video_tuner *v = arg; - if(v->tuner) /* Only 1 tuner */ + if(v->tuner) /* Only 1 tuner */ return -EINVAL; v->rangelow=87*16000; v->rangehigh=108*16000; @@ -194,25 +193,25 @@ static int gemtek_do_ioctl(struct inode *inode, struct file *file, return 0; } case VIDIOCGAUDIO: - { + { struct video_audio *v = arg; memset(v,0, sizeof(*v)); v->flags|=VIDEO_AUDIO_MUTABLE; v->volume=1; v->step=65535; strcpy(v->name, "Radio"); - return 0; + return 0; } case VIDIOCSAUDIO: { struct video_audio *v = arg; - if(v->audio) + if(v->audio) return -EINVAL; - if(v->flags&VIDEO_AUDIO_MUTE) + if(v->flags&VIDEO_AUDIO_MUTE) gemtek_mute(rt); else - gemtek_unmute(rt); + gemtek_unmute(rt); return 0; } @@ -255,14 +254,14 @@ static int __init gemtek_init(void) return -EINVAL; } - if (!request_region(io, 4, "gemtek")) + if (!request_region(io, 4, "gemtek")) { printk(KERN_ERR "gemtek: port 0x%x already in use\n", io); return -EBUSY; } gemtek_radio.priv=&gemtek_unit; - + if(video_register_device(&gemtek_radio, VFL_TYPE_RADIO, radio_nr)==-1) { release_region(io, 4); @@ -275,7 +274,7 @@ static int __init gemtek_init(void) /* this is _maybe_ unnecessary */ outb(0x01, io); - /* mute card - prevents noisy bootups */ + /* mute card - prevents noisy bootups */ gemtek_unit.muted = 0; gemtek_mute(&gemtek_unit); diff --git a/drivers/media/radio/radio-maestro.c b/drivers/media/radio/radio-maestro.c index fcfa6c9fe..36c9f5bf8 100644 --- a/drivers/media/radio/radio-maestro.c +++ b/drivers/media/radio/radio-maestro.c @@ -2,7 +2,7 @@ * (c) 2000 A. Tlalka, atlka@pg.gda.pl * Notes on the hardware * - * + Frequency control is done digitally + * + Frequency control is done digitally * + No volume control - only mute/unmute - you have to use Aux line volume * control on Maestro card to set the volume * + Radio status (tuned/not_tuned and stereo/mono) is valid some time after @@ -23,10 +23,9 @@ #include #include #include -#include +#include #include #include -#include #define DRIVER_VERSION "0.05" @@ -103,9 +102,9 @@ static struct video_device maestro_radio = { struct radio_device { u16 io, /* base of Maestro card radio io (GPIO_DATA)*/ muted, /* VIDEO_AUDIO_MUTE */ - stereo, /* VIDEO_TUNER_STEREO_ON */ + stereo, /* VIDEO_TUNER_STEREO_ON */ tuned; /* signal strength (0 or 0xffff) */ - struct mutex lock; + struct semaphore lock; }; static u32 radio_bits_get(struct radio_device *dev) @@ -122,14 +121,14 @@ static u32 radio_bits_get(struct radio_device *dev) for (l=24;l--;) { outw(STR_CLK, io); /* HI state */ udelay(2); - if(!l) + if(!l) dev->tuned = inw(io) & STR_MOST ? 0 : 0xffff; outw(0, io); /* LO state */ udelay(2); data <<= 1; /* shift data */ rdata = inw(io); if(!l) - dev->stereo = rdata & STR_MOST ? + dev->stereo = rdata & STR_MOST ? 0 : VIDEO_TUNER_STEREO_ON; else if(rdata & STR_DATA) @@ -259,9 +258,9 @@ static int radio_ioctl(struct inode *inode, struct file *file, struct radio_device *card = video_get_drvdata(dev); int ret; - mutex_lock(&card->lock); + down(&card->lock); ret = video_usercopy(inode, file, cmd, arg, radio_function); - mutex_unlock(&card->lock); + up(&card->lock); return ret; } @@ -312,7 +311,7 @@ static int __devinit maestro_probe(struct pci_dev *pdev, } radio_unit->io = pci_resource_start(pdev, 0) + GPIO_DATA; - mutex_init(&radio_unit->lock); + init_MUTEX(&radio_unit->lock); maestro_radio_inst = video_device_alloc(); if (maestro_radio_inst == NULL) { diff --git a/drivers/media/radio/radio-maxiradio.c b/drivers/media/radio/radio-maxiradio.c index f93d7afe7..c975ddd86 100644 --- a/drivers/media/radio/radio-maxiradio.c +++ b/drivers/media/radio/radio-maxiradio.c @@ -1,15 +1,15 @@ -/* - * Guillemot Maxi Radio FM 2000 PCI radio card driver for Linux +/* + * Guillemot Maxi Radio FM 2000 PCI radio card driver for Linux * (C) 2001 Dimitromanolakis Apostolos * * Based in the radio Maestro PCI driver. Actually it uses the same chip * for radio but different pci controller. * * I didn't have any specs I reversed engineered the protocol from - * the windows driver (radio.dll). + * the windows driver (radio.dll). * * The card uses the TEA5757 chip that includes a search function but it - * is useless as I haven't found any way to read back the frequency. If + * is useless as I haven't found any way to read back the frequency. If * anybody does please mail me. * * For the pdf file see: @@ -24,7 +24,7 @@ * - tiding up * - removed support for multiple devices as it didn't work anyway * - * BUGS: + * BUGS: * - card unmutes if you change frequency * */ @@ -37,11 +37,9 @@ #include #include #include -#include - +#include #include #include -#include /* version 0.75 Sun Feb 4 22:51:27 EET 2001 */ #define DRIVER_VERSION "0.75" @@ -81,7 +79,7 @@ static struct file_operations maxiradio_fops = { .owner = THIS_MODULE, .open = video_exclusive_open, .release = video_exclusive_release, - .ioctl = radio_ioctl, + .ioctl = radio_ioctl, .compat_ioctl = v4l_compat_ioctl32, .llseek = no_llseek, }; @@ -98,12 +96,12 @@ static struct radio_device { __u16 io, /* base of radio io */ muted, /* VIDEO_AUDIO_MUTE */ - stereo, /* VIDEO_TUNER_STEREO_ON */ + stereo, /* VIDEO_TUNER_STEREO_ON */ tuned; /* signal strength (0 or 0xffff) */ - + unsigned long freq; - - struct mutex lock; + + struct semaphore lock; } radio_unit = {0, 0, 0, 0, }; @@ -115,7 +113,7 @@ static void outbit(unsigned long bit, __u16 io) outb( power|wren|data|clk ,io); udelay(4); outb( power|wren|data ,io); udelay(4); } - else + else { outb( power|wren ,io); udelay(4); outb( power|wren|clk ,io); udelay(4); @@ -133,12 +131,12 @@ static void set_freq(__u16 io, __u32 data) { unsigned long int si; int bl; - + /* TEA5757 shift register bits (see pdf) */ - outbit(0,io); // 24 search + outbit(0,io); // 24 search outbit(1,io); // 23 search up/down - + outbit(0,io); // 22 stereo/mono outbit(0,io); // 21 band @@ -146,24 +144,24 @@ static void set_freq(__u16 io, __u32 data) outbit(0,io); // 19 port ? outbit(0,io); // 18 port ? - + outbit(0,io); // 17 search level outbit(0,io); // 16 search level - + si = 0x8000; for(bl = 1; bl <= 16 ; bl++) { outbit(data & si,io); si >>=1; } - + outb(power,io); } static int get_stereo(__u16 io) -{ +{ outb(power,io); udelay(4); return !(inb(io) & mo_st); } static int get_tune(__u16 io) -{ +{ outb(power+clk,io); udelay(4); return !(inb(io) & mo_st); } @@ -178,7 +176,7 @@ static inline int radio_function(struct inode *inode, struct file *file, switch(cmd) { case VIDIOCGCAP: { struct video_capability *v = arg; - + memset(v,0,sizeof(*v)); strcpy(v->name, "Maxi Radio FM2000 radio"); v->type=VID_TYPE_TUNER; @@ -187,22 +185,22 @@ static inline int radio_function(struct inode *inode, struct file *file, } case VIDIOCGTUNER: { struct video_tuner *v = arg; - + if(v->tuner) return -EINVAL; - + card->stereo = 0xffff * get_stereo(card->io); card->tuned = 0xffff * get_tune(card->io); - + v->flags = VIDEO_TUNER_LOW | card->stereo; v->signal = card->tuned; - + strcpy(v->name, "FM"); - + v->rangelow = FREQ_LO; v->rangehigh = FREQ_HI; v->mode = VIDEO_MODE_AUTO; - + return 0; } case VIDIOCSTUNER: { @@ -213,13 +211,13 @@ static inline int radio_function(struct inode *inode, struct file *file, } case VIDIOCGFREQ: { unsigned long *freq = arg; - + *freq = card->freq; return 0; } case VIDIOCSFREQ: { unsigned long *freq = arg; - + if (*freq < FREQ_LO || *freq > FREQ_HI) return -EINVAL; card->freq = *freq; @@ -227,18 +225,18 @@ static inline int radio_function(struct inode *inode, struct file *file, msleep(125); return 0; } - case VIDIOCGAUDIO: { + case VIDIOCGAUDIO: { struct video_audio *v = arg; memset(v,0,sizeof(*v)); strcpy(v->name, "Radio"); v->flags=VIDEO_AUDIO_MUTABLE | card->muted; v->mode=VIDEO_SOUND_STEREO; - return 0; + return 0; } - + case VIDIOCSAUDIO: { struct video_audio *v = arg; - + if(v->audio) return -EINVAL; card->muted = v->flags & VIDEO_AUDIO_MUTE; @@ -250,13 +248,13 @@ static inline int radio_function(struct inode *inode, struct file *file, } case VIDIOCGUNIT: { struct video_unit *v = arg; - + v->video=VIDEO_NO_UNIT; v->vbi=VIDEO_NO_UNIT; v->radio=dev->minor; v->audio=0; v->teletext=VIDEO_NO_UNIT; - return 0; + return 0; } default: return -ENOIOCTLCMD; } @@ -268,10 +266,10 @@ static int radio_ioctl(struct inode *inode, struct file *file, struct video_device *dev = video_devdata(file); struct radio_device *card=dev->priv; int ret; - - mutex_lock(&card->lock); + + down(&card->lock); ret = video_usercopy(inode, file, cmd, arg, radio_function); - mutex_unlock(&card->lock); + up(&card->lock); return ret; } @@ -283,21 +281,21 @@ MODULE_LICENSE("GPL"); static int __devinit maxiradio_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) { if(!request_region(pci_resource_start(pdev, 0), - pci_resource_len(pdev, 0), "Maxi Radio FM 2000")) { - printk(KERN_ERR "radio-maxiradio: can't reserve I/O ports\n"); - goto err_out; + pci_resource_len(pdev, 0), "Maxi Radio FM 2000")) { + printk(KERN_ERR "radio-maxiradio: can't reserve I/O ports\n"); + goto err_out; } if (pci_enable_device(pdev)) - goto err_out_free_region; + goto err_out_free_region; radio_unit.io = pci_resource_start(pdev, 0); - mutex_init(&radio_unit.lock); + init_MUTEX(&radio_unit.lock); maxiradio_radio.priv = &radio_unit; if(video_register_device(&maxiradio_radio, VFL_TYPE_RADIO, radio_nr)==-1) { - printk("radio-maxiradio: can't register device!"); - goto err_out_free_region; + printk("radio-maxiradio: can't register device!"); + goto err_out_free_region; } printk(KERN_INFO "radio-maxiradio: version " diff --git a/drivers/media/radio/radio-rtrack2.c b/drivers/media/radio/radio-rtrack2.c index 5b68ac4c7..28a47c9e7 100644 --- a/drivers/media/radio/radio-rtrack2.c +++ b/drivers/media/radio/radio-rtrack2.c @@ -1,5 +1,5 @@ /* RadioTrack II driver for Linux radio support (C) 1998 Ben Pfaff - * + * * Based on RadioTrack I/RadioReveal (C) 1997 M. Kirkwood * Converted to new API by Alan Cox * Various bugfixes and enhancements by Russell Kroll @@ -15,7 +15,6 @@ #include /* outb, outb_p */ #include /* copy to/from user */ #include /* kernel radio structs */ -#include #include /* CONFIG_RADIO_RTRACK2_PORT */ #include @@ -23,7 +22,7 @@ #define CONFIG_RADIO_RTRACK2_PORT -1 #endif -static int io = CONFIG_RADIO_RTRACK2_PORT; +static int io = CONFIG_RADIO_RTRACK2_PORT; static int radio_nr = -1; static spinlock_t lock; @@ -39,7 +38,7 @@ struct rt_device static void rt_mute(struct rt_device *dev) { - if(dev->muted) + if(dev->muted) return; spin_lock(&lock); outb(1, io); @@ -59,14 +58,14 @@ static void rt_unmute(struct rt_device *dev) static void zero(void) { - outb_p(1, io); + outb_p(1, io); outb_p(3, io); outb_p(1, io); } static void one(void) { - outb_p(5, io); + outb_p(5, io); outb_p(7, io); outb_p(5, io); } @@ -76,7 +75,7 @@ static int rt_setfreq(struct rt_device *dev, unsigned long freq) int i; freq = freq / 200 + 856; - + spin_lock(&lock); outb_p(0xc8, io); @@ -95,7 +94,7 @@ static int rt_setfreq(struct rt_device *dev, unsigned long freq) outb_p(0xc8, io); if (!dev->muted) outb_p(0, io); - + spin_unlock(&lock); return 0; } @@ -128,7 +127,7 @@ static int rt_do_ioctl(struct inode *inode, struct file *file, case VIDIOCGTUNER: { struct video_tuner *v = arg; - if(v->tuner) /* Only 1 tuner */ + if(v->tuner) /* Only 1 tuner */ return -EINVAL; v->rangelow=88*16000; v->rangehigh=108*16000; @@ -160,25 +159,25 @@ static int rt_do_ioctl(struct inode *inode, struct file *file, return 0; } case VIDIOCGAUDIO: - { + { struct video_audio *v = arg; memset(v,0, sizeof(*v)); v->flags|=VIDEO_AUDIO_MUTABLE; v->volume=1; v->step=65535; strcpy(v->name, "Radio"); - return 0; + return 0; } case VIDIOCSAUDIO: { struct video_audio *v = arg; - if(v->audio) + if(v->audio) return -EINVAL; - if(v->flags&VIDEO_AUDIO_MUTE) + if(v->flags&VIDEO_AUDIO_MUTE) rt_mute(rt); else - rt_unmute(rt); + rt_unmute(rt); return 0; } @@ -220,7 +219,7 @@ static int __init rtrack2_init(void) printk(KERN_ERR "You must set an I/O address with io=0x20c or io=0x30c\n"); return -EINVAL; } - if (!request_region(io, 4, "rtrack2")) + if (!request_region(io, 4, "rtrack2")) { printk(KERN_ERR "rtrack2: port 0x%x already in use\n", io); return -EBUSY; @@ -228,16 +227,16 @@ static int __init rtrack2_init(void) rtrack2_radio.priv=&rtrack2_unit; - spin_lock_init(&lock); + spin_lock_init(&lock); if(video_register_device(&rtrack2_radio, VFL_TYPE_RADIO, radio_nr)==-1) { release_region(io, 4); return -EINVAL; } - + printk(KERN_INFO "AIMSlab Radiotrack II card driver.\n"); - /* mute card - prevents noisy bootups */ + /* mute card - prevents noisy bootups */ outb(1, io); rtrack2_unit.muted = 1; diff --git a/drivers/media/radio/radio-sf16fmi.c b/drivers/media/radio/radio-sf16fmi.c index efee6e339..0229f792a 100644 --- a/drivers/media/radio/radio-sf16fmi.c +++ b/drivers/media/radio/radio-sf16fmi.c @@ -12,7 +12,7 @@ * Frequency control is done digitally -- ie out(port,encodefreq(95.8)); * No volume control - only mute/unmute - you have to use line volume * control on SB-part of SF16FMI - * + * */ #include /* __setup */ @@ -21,28 +21,27 @@ #include /* request_region */ #include /* udelay */ #include /* kernel radio structs */ -#include #include #include /* outb, outb_p */ #include /* copy to/from user */ -#include +#include struct fmi_device { int port; - int curvol; /* 1 or 0 */ - unsigned long curfreq; /* freq in kHz */ - __u32 flags; + int curvol; /* 1 or 0 */ + unsigned long curfreq; /* freq in kHz */ + __u32 flags; }; -static int io = -1; +static int io = -1; static int radio_nr = -1; static struct pnp_dev *dev = NULL; -static struct mutex lock; +static struct semaphore lock; /* freq is in 1/16 kHz to internal number, hw precision is 50 kHz */ /* It is only useful to give freq in intervall of 800 (=0.05Mhz), - * other bits will be truncated, e.g 92.7400016 -> 92.7, but + * other bits will be truncated, e.g 92.7400016 -> 92.7, but * 92.7400017 -> 92.75 */ #define RSF16_ENCODE(x) ((x)/800+214) @@ -52,7 +51,7 @@ static struct mutex lock; static void outbits(int bits, unsigned int data, int port) { while(bits--) { - if(data & 1) { + if(data & 1) { outb(5, port); udelay(6); outb(7, port); @@ -69,16 +68,16 @@ static void outbits(int bits, unsigned int data, int port) static inline void fmi_mute(int port) { - mutex_lock(&lock); + down(&lock); outb(0x00, port); - mutex_unlock(&lock); + up(&lock); } static inline void fmi_unmute(int port) { - mutex_lock(&lock); + down(&lock); outb(0x08, port); - mutex_unlock(&lock); + up(&lock); } static inline int fmi_setfreq(struct fmi_device *dev) @@ -86,12 +85,12 @@ static inline int fmi_setfreq(struct fmi_device *dev) int myport = dev->port; unsigned long freq = dev->curfreq; - mutex_lock(&lock); + down(&lock); outbits(16, RSF16_ENCODE(freq), myport); outbits(8, 0xC0, myport); msleep(143); /* was schedule_timeout(HZ/7) */ - mutex_unlock(&lock); + up(&lock); if (dev->curvol) fmi_unmute(myport); return 0; } @@ -102,16 +101,16 @@ static inline int fmi_getsigstr(struct fmi_device *dev) int res; int myport = dev->port; - - mutex_lock(&lock); + + down(&lock); val = dev->curvol ? 0x08 : 0x00; /* unmute/mute */ outb(val, myport); outb(val | 0x10, myport); msleep(143); /* was schedule_timeout(HZ/7) */ res = (int)inb(myport+1); outb(val, myport); - - mutex_unlock(&lock); + + up(&lock); return (res & 2) ? 0 : 0xFFFF; } @@ -120,7 +119,7 @@ static int fmi_do_ioctl(struct inode *inode, struct file *file, { struct video_device *dev = video_devdata(file); struct fmi_device *fmi=dev->priv; - + switch(cmd) { case VIDIOCGCAP: @@ -175,18 +174,18 @@ static int fmi_do_ioctl(struct inode *inode, struct file *file, return -EINVAL; /*rounding in steps of 800 to match th freq that will be used */ - fmi->curfreq = (*freq/800)*800; + fmi->curfreq = (*freq/800)*800; fmi_setfreq(fmi); return 0; } case VIDIOCGAUDIO: - { + { struct video_audio *v = arg; memset(v,0,sizeof(*v)); v->flags=( (!fmi->curvol)*VIDEO_AUDIO_MUTE | VIDEO_AUDIO_MUTABLE); strcpy(v->name, "Radio"); v->mode=VIDEO_SOUND_STEREO; - return 0; + return 0; } case VIDIOCSAUDIO: { @@ -194,19 +193,19 @@ static int fmi_do_ioctl(struct inode *inode, struct file *file, if(v->audio) return -EINVAL; fmi->curvol= v->flags&VIDEO_AUDIO_MUTE ? 0 : 1; - fmi->curvol ? + fmi->curvol ? fmi_unmute(fmi->port) : fmi_mute(fmi->port); return 0; } - case VIDIOCGUNIT: + case VIDIOCGUNIT: { - struct video_unit *v = arg; + struct video_unit *v = arg; v->video=VIDEO_NO_UNIT; v->vbi=VIDEO_NO_UNIT; v->radio=dev->minor; v->audio=0; /* How do we find out this??? */ v->teletext=VIDEO_NO_UNIT; - return 0; + return 0; } default: return -ENOIOCTLCMD; @@ -296,14 +295,14 @@ static int __init fmi_init(void) fmi_unit.curfreq = 0; fmi_unit.flags = VIDEO_TUNER_LOW; fmi_radio.priv = &fmi_unit; - - mutex_init(&lock); - + + init_MUTEX(&lock); + if (video_register_device(&fmi_radio, VFL_TYPE_RADIO, radio_nr) == -1) { release_region(io, 2); return -EINVAL; } - + printk(KERN_INFO "SF16FMx radio card driver at 0x%x\n", io); /* mute card - prevents noisy bootups */ fmi_mute(io); diff --git a/drivers/media/radio/radio-sf16fmr2.c b/drivers/media/radio/radio-sf16fmr2.c index 3483b2c7b..099ffb3b9 100644 --- a/drivers/media/radio/radio-sf16fmr2.c +++ b/drivers/media/radio/radio-sf16fmr2.c @@ -19,10 +19,9 @@ #include /* outb, outb_p */ #include /* copy to/from user */ #include /* kernel radio structs */ -#include -#include +#include -static struct mutex lock; +static struct semaphore lock; #undef DEBUG //#define DEBUG 1 @@ -203,7 +202,7 @@ static int fmr2_setvolume(struct fmr2_device *dev) } static int fmr2_do_ioctl(struct inode *inode, struct file *file, - unsigned int cmd, void *arg) + unsigned int cmd, void *arg) { struct video_device *dev = video_devdata(file); struct fmr2_device *fmr2 = dev->priv; @@ -239,9 +238,9 @@ static int fmr2_do_ioctl(struct inode *inode, struct file *file, if (fmr2->mute) v->flags |= VIDEO_AUDIO_MUTE; v->mode=VIDEO_MODE_AUTO; - mutex_lock(&lock); + down(&lock); v->signal = fmr2_getsigstr(fmr2); - mutex_unlock(&lock); + up(&lock); return 0; } case VIDIOCSTUNER: @@ -275,9 +274,9 @@ static int fmr2_do_ioctl(struct inode *inode, struct file *file, /* set card freq (if not muted) */ if (fmr2->curvol && !fmr2->mute) { - mutex_lock(&lock); + down(&lock); fmr2_setfreq(fmr2); - mutex_unlock(&lock); + up(&lock); } return 0; } @@ -319,14 +318,14 @@ static int fmr2_do_ioctl(struct inode *inode, struct file *file, else printk(KERN_DEBUG "mute\n"); #endif - mutex_lock(&lock); + down(&lock); if (fmr2->curvol && !fmr2->mute) { fmr2_setvolume(fmr2); fmr2_setfreq(fmr2); } else fmr2_mute(fmr2->port); - mutex_unlock(&lock); + up(&lock); return 0; } case VIDIOCGUNIT: @@ -345,7 +344,7 @@ static int fmr2_do_ioctl(struct inode *inode, struct file *file, } static int fmr2_ioctl(struct inode *inode, struct file *file, - unsigned int cmd, unsigned long arg) + unsigned int cmd, unsigned long arg) { return video_usercopy(inode, file, cmd, arg, fmr2_do_ioctl); } @@ -381,7 +380,7 @@ static int __init fmr2_init(void) fmr2_unit.card_type = 0; fmr2_radio.priv = &fmr2_unit; - mutex_init(&lock); + init_MUTEX(&lock); if (request_region(io, 2, "sf16fmr2")) { @@ -398,10 +397,10 @@ static int __init fmr2_init(void) printk(KERN_INFO "SF16FMR2 radio card driver at 0x%x.\n", io); debug_print((KERN_DEBUG "Mute %d Low %d\n",VIDEO_AUDIO_MUTE,VIDEO_TUNER_LOW)); /* mute card - prevents noisy bootups */ - mutex_lock(&lock); + down(&lock); fmr2_mute(io); fmr2_product_info(&fmr2_unit); - mutex_unlock(&lock); + up(&lock); debug_print((KERN_DEBUG "card_type %d\n", fmr2_unit.card_type)); return 0; } diff --git a/drivers/media/radio/radio-terratec.c b/drivers/media/radio/radio-terratec.c index dfba4ae59..fcfde2e4f 100644 --- a/drivers/media/radio/radio-terratec.c +++ b/drivers/media/radio/radio-terratec.c @@ -2,11 +2,11 @@ * (c) 1999 R. Offermanns (rolf@offermanns.de) * based on the aimslab radio driver from M. Kirkwood * many thanks to Michael Becker and Friedhelm Birth (from TerraTec) - * + * * * History: * 1999-05-21 First preview release - * + * * Notes on the hardware: * There are two "main" chips on the card: * - Philips OM5610 (http://www-us.semiconductors.philips.com/acrobat/datasheets/OM5610_2.pdf) @@ -20,7 +20,7 @@ * (as soon i have understand how to get started :) * If you can help me out with that, please contact me!! * - * + * */ #include /* Modules */ @@ -30,7 +30,6 @@ #include /* outb, outb_p */ #include /* copy to/from user */ #include /* kernel radio structs */ -#include #include /* CONFIG_RADIO_TERRATEC_PORT */ #include @@ -50,7 +49,7 @@ #define WRT_EN 0x10 /*******************************************************************/ -static int io = CONFIG_RADIO_TERRATEC_PORT; +static int io = CONFIG_RADIO_TERRATEC_PORT; static int radio_nr = -1; static spinlock_t lock; @@ -89,15 +88,15 @@ static void tt_mute(struct tt_device *dev) static int tt_setvol(struct tt_device *dev, int vol) { - + // printk(KERN_ERR "setvol called, vol = %d\n", vol); if(vol == dev->curvol) { /* requested volume = current */ if (dev->muted) { /* user is unmuting the card */ dev->muted = 0; cardWriteVol(vol); /* enable card */ - } - + } + return 0; } @@ -108,9 +107,9 @@ static int tt_setvol(struct tt_device *dev, int vol) } dev->muted = 0; - + cardWriteVol(vol); - + dev->curvol = vol; return 0; @@ -122,13 +121,13 @@ static int tt_setvol(struct tt_device *dev, int vol) /* many more or less strange things are going on here, but hey, it works :) */ static int tt_setfreq(struct tt_device *dev, unsigned long freq1) -{ +{ int freq; int i; int p; int temp; long rest; - + unsigned char buffer[25]; /* we have to bit shift 25 registers */ freq = freq1/160; /* convert the freq. to a nice to handle value */ for(i=24;i>-1;i--) @@ -143,9 +142,9 @@ static int tt_setfreq(struct tt_device *dev, unsigned long freq1) { if (rest%temp == rest) buffer[i] = 0; - else + else { - buffer[i] = 1; + buffer[i] = 1; rest = rest-temp; } i--; @@ -154,10 +153,10 @@ static int tt_setfreq(struct tt_device *dev, unsigned long freq1) } spin_lock(&lock); - + for (i=24;i>-1;i--) /* bit shift the values to the radiocard */ { - if (buffer[i]==1) + if (buffer[i]==1) { outb(WRT_EN|DATA, BASEPORT); outb(WRT_EN|DATA|CLK_ON , BASEPORT); @@ -169,11 +168,11 @@ static int tt_setfreq(struct tt_device *dev, unsigned long freq1) outb(WRT_EN|0x00|CLK_ON , BASEPORT); } } - outb(0x00, BASEPORT); - + outb(0x00, BASEPORT); + spin_unlock(&lock); - - return 0; + + return 0; } static int tt_getsigstr(struct tt_device *dev) /* TODO */ @@ -191,7 +190,7 @@ static int tt_do_ioctl(struct inode *inode, struct file *file, { struct video_device *dev = video_devdata(file); struct tt_device *tt=dev->priv; - + switch(cmd) { case VIDIOCGCAP: @@ -207,7 +206,7 @@ static int tt_do_ioctl(struct inode *inode, struct file *file, case VIDIOCGTUNER: { struct video_tuner *v = arg; - if(v->tuner) /* Only 1 tuner */ + if(v->tuner) /* Only 1 tuner */ return -EINVAL; v->rangelow=(87*16000); v->rangehigh=(108*16000); @@ -239,21 +238,21 @@ static int tt_do_ioctl(struct inode *inode, struct file *file, return 0; } case VIDIOCGAUDIO: - { + { struct video_audio *v = arg; memset(v,0, sizeof(*v)); v->flags|=VIDEO_AUDIO_MUTABLE|VIDEO_AUDIO_VOLUME; v->volume=tt->curvol * 6554; v->step=6554; strcpy(v->name, "Radio"); - return 0; + return 0; } case VIDIOCSAUDIO: { struct video_audio *v = arg; - if(v->audio) + if(v->audio) return -EINVAL; - if(v->flags&VIDEO_AUDIO_MUTE) + if(v->flags&VIDEO_AUDIO_MUTE) tt_mute(tt); else tt_setvol(tt,v->volume/6554); @@ -297,25 +296,25 @@ static int __init terratec_init(void) printk(KERN_ERR "You must set an I/O address with io=0x???\n"); return -EINVAL; } - if (!request_region(io, 2, "terratec")) + if (!request_region(io, 2, "terratec")) { printk(KERN_ERR "TerraTec: port 0x%x already in use\n", io); return -EBUSY; } terratec_radio.priv=&terratec_unit; - + spin_lock_init(&lock); - + if(video_register_device(&terratec_radio, VFL_TYPE_RADIO, radio_nr)==-1) { release_region(io,2); return -EINVAL; } - + printk(KERN_INFO "TERRATEC ActivRadio Standalone card driver.\n"); - /* mute card - prevents noisy bootups */ + /* mute card - prevents noisy bootups */ /* this ensures that the volume is all the way down */ cardWriteVol(0); @@ -335,7 +334,7 @@ static void __exit terratec_cleanup_module(void) { video_unregister_device(&terratec_radio); release_region(io,2); - printk(KERN_INFO "TERRATEC ActivRadio Standalone card driver unloaded.\n"); + printk(KERN_INFO "TERRATEC ActivRadio Standalone card driver unloaded.\n"); } module_init(terratec_init); diff --git a/drivers/media/radio/radio-trust.c b/drivers/media/radio/radio-trust.c index 8da4badc2..5a099a50d 100644 --- a/drivers/media/radio/radio-trust.c +++ b/drivers/media/radio/radio-trust.c @@ -1,14 +1,14 @@ -/* radio-trust.c - Trust FM Radio card driver for Linux 2.2 +/* radio-trust.c - Trust FM Radio card driver for Linux 2.2 * by Eric Lammerts * * Based on radio-aztech.c. Original notes: * - * Adapted to support the Video for Linux API by + * Adapted to support the Video for Linux API by * Russell Kroll . Based on original tuner code by: * * Quay Ly * Donald Song - * Jason Lewis (jlewis@twilight.vtc.vsc.edu) + * Jason Lewis (jlewis@twilight.vtc.vsc.edu) * Scott McGrath (smcgrath@twilight.vtc.vsc.edu) * William McGrath (wmcgrath@twilight.vtc.vsc.edu) * @@ -22,7 +22,6 @@ #include #include #include -#include #include /* CONFIG_RADIO_TRUST_PORT */ /* acceptable ports: 0x350 (JP3 shorted), 0x358 (JP3 open) */ @@ -31,7 +30,7 @@ #define CONFIG_RADIO_TRUST_PORT -1 #endif -static int io = CONFIG_RADIO_TRUST_PORT; +static int io = CONFIG_RADIO_TRUST_PORT; static int radio_nr = -1; static int ioval = 0xf; static __u16 curvol; @@ -136,7 +135,7 @@ static void tr_setmute(int mute) static int tr_getsigstr(void) { int i, v; - + for(i = 0, v = 0; i < 100; i++) v |= inb(io); return (v & 1)? 0 : 0xffff; } @@ -176,7 +175,7 @@ static int tr_do_ioctl(struct inode *inode, struct file *file, { struct video_tuner *v = arg; - if(v->tuner) /* Only 1 tuner */ + if(v->tuner) /* Only 1 tuner */ return -EINVAL; v->rangelow = 87500 * 16; @@ -212,28 +211,28 @@ static int tr_do_ioctl(struct inode *inode, struct file *file, return 0; } case VIDIOCGAUDIO: - { + { struct video_audio *v = arg; memset(v,0, sizeof(*v)); v->flags = VIDEO_AUDIO_MUTABLE | VIDEO_AUDIO_VOLUME | - VIDEO_AUDIO_BASS | VIDEO_AUDIO_TREBLE; + VIDEO_AUDIO_BASS | VIDEO_AUDIO_TREBLE; v->mode = curstereo? VIDEO_SOUND_STEREO : VIDEO_SOUND_MONO; v->volume = curvol * 2048; v->step = 2048; v->bass = curbass * 4370; v->treble = curtreble * 4370; - + strcpy(v->name, "Trust FM Radio"); - return 0; + return 0; } case VIDIOCSAUDIO: { struct video_audio *v = arg; - if(v->audio) + if(v->audio) return -EINVAL; - tr_setvol(v->volume); + tr_setvol(v->volume); tr_setbass(v->bass); tr_settreble(v->treble); tr_setstereo(v->mode & VIDEO_SOUND_STEREO); @@ -293,7 +292,7 @@ static int __init trust_init(void) write_i2c(2, TDA7318_ADDR, 0xe0); /* speaker att. RR = 0 dB */ write_i2c(2, TDA7318_ADDR, 0x40); /* stereo 1 input, gain = 18.75 dB */ - tr_setvol(0x8000); + tr_setvol(0x8000); tr_setbass(0x8000); tr_settreble(0x8000); tr_setstereo(1); diff --git a/drivers/media/radio/radio-typhoon.c b/drivers/media/radio/radio-typhoon.c index edd012288..8ac9a8ef9 100644 --- a/drivers/media/radio/radio-typhoon.c +++ b/drivers/media/radio/radio-typhoon.c @@ -36,7 +36,6 @@ #include /* outb, outb_p */ #include /* copy to/from user */ #include /* kernel radio structs */ -#include #include /* CONFIG_RADIO_TYPHOON_* */ #define BANNER "Typhoon Radio Card driver v0.1\n" @@ -60,7 +59,7 @@ struct typhoon_device { int muted; unsigned long curfreq; unsigned long mutefreq; - struct mutex lock; + struct semaphore lock; }; static void typhoon_setvol_generic(struct typhoon_device *dev, int vol); @@ -78,12 +77,12 @@ static int typhoon_get_info(char *buf, char **start, off_t offset, int len); static void typhoon_setvol_generic(struct typhoon_device *dev, int vol) { - mutex_lock(&dev->lock); + down(&dev->lock); vol >>= 14; /* Map 16 bit to 2 bit */ vol &= 3; outb_p(vol / 2, dev->iobase); /* Set the volume, high bit. */ outb_p(vol % 2, dev->iobase + 2); /* Set the volume, low bit. */ - mutex_unlock(&dev->lock); + up(&dev->lock); } static int typhoon_setfreq_generic(struct typhoon_device *dev, @@ -103,7 +102,7 @@ static int typhoon_setfreq_generic(struct typhoon_device *dev, * */ - mutex_lock(&dev->lock); + down(&dev->lock); x = frequency / 160; outval = (x * x + 2500) / 5000; outval = (outval * x + 5000) / 10000; @@ -113,7 +112,7 @@ static int typhoon_setfreq_generic(struct typhoon_device *dev, outb_p((outval >> 8) & 0x01, dev->iobase + 4); outb_p(outval >> 9, dev->iobase + 6); outb_p(outval & 0xff, dev->iobase + 8); - mutex_unlock(&dev->lock); + up(&dev->lock); return 0; } @@ -338,7 +337,7 @@ static int __init typhoon_init(void) #endif /* MODULE */ printk(KERN_INFO BANNER); - mutex_init(&typhoon_unit.lock); + init_MUTEX(&typhoon_unit.lock); io = typhoon_unit.iobase; if (!request_region(io, 8, "typhoon")) { printk(KERN_ERR "radio-typhoon: port 0x%x already in use\n", @@ -362,8 +361,8 @@ static int __init typhoon_init(void) #ifdef CONFIG_RADIO_TYPHOON_PROC_FS if (!create_proc_info_entry("driver/radio-typhoon", 0, NULL, - typhoon_get_info)) - printk(KERN_ERR "radio-typhoon: registering /proc/driver/radio-typhoon failed\n"); + typhoon_get_info)) + printk(KERN_ERR "radio-typhoon: registering /proc/driver/radio-typhoon failed\n"); #endif return 0; diff --git a/drivers/media/radio/radio-zoltrix.c b/drivers/media/radio/radio-zoltrix.c index 59b86a6b4..d590e80c9 100644 --- a/drivers/media/radio/radio-zoltrix.c +++ b/drivers/media/radio/radio-zoltrix.c @@ -1,7 +1,7 @@ /* zoltrix radio plus driver for Linux radio support * (c) 1998 C. van Schaik * - * BUGS + * BUGS * Due to the inconsistency in reading from the signal flags * it is difficult to get an accurate tuned signal. * @@ -14,7 +14,7 @@ * * 1999-05-06 - (C. van Schaik) * - Make signal strength and stereo scans - * kinder to cpu while in delay + * kinder to cpu while in delay * 1999-01-05 - (C. van Schaik) * - Changed tuning to 1/160Mhz accuracy * - Added stereo support @@ -33,7 +33,6 @@ #include /* outb, outb_p */ #include /* copy to/from user */ #include /* kernel radio structs */ -#include #include /* CONFIG_RADIO_ZOLTRIX_PORT */ #ifndef CONFIG_RADIO_ZOLTRIX_PORT @@ -49,7 +48,7 @@ struct zol_device { unsigned long curfreq; int muted; unsigned int stereo; - struct mutex lock; + struct semaphore lock; }; static int zol_setvol(struct zol_device *dev, int vol) @@ -58,30 +57,30 @@ static int zol_setvol(struct zol_device *dev, int vol) if (dev->muted) return 0; - mutex_lock(&dev->lock); + down(&dev->lock); if (vol == 0) { outb(0, io); outb(0, io); inb(io + 3); /* Zoltrix needs to be read to confirm */ - mutex_unlock(&dev->lock); + up(&dev->lock); return 0; } outb(dev->curvol-1, io); msleep(10); inb(io + 2); - mutex_unlock(&dev->lock); + up(&dev->lock); return 0; } static void zol_mute(struct zol_device *dev) { dev->muted = 1; - mutex_lock(&dev->lock); + down(&dev->lock); outb(0, io); outb(0, io); inb(io + 3); /* Zoltrix needs to be read to confirm */ - mutex_unlock(&dev->lock); + up(&dev->lock); } static void zol_unmute(struct zol_device *dev) @@ -105,8 +104,8 @@ static int zol_setfreq(struct zol_device *dev, unsigned long freq) bitmask = 0xc480402c10080000ull; i = 45; - mutex_lock(&dev->lock); - + down(&dev->lock); + outb(0, io); outb(0, io); inb(io + 3); /* Zoltrix needs to be read to confirm */ @@ -140,8 +139,8 @@ static int zol_setfreq(struct zol_device *dev, unsigned long freq) udelay(1000); inb(io+2); - udelay(1000); - + udelay(1000); + if (dev->muted) { outb(0, io); @@ -149,12 +148,12 @@ static int zol_setfreq(struct zol_device *dev, unsigned long freq) inb(io + 3); udelay(1000); } - - mutex_unlock(&dev->lock); - + + up(&dev->lock); + if(!dev->muted) { - zol_setvol(dev, dev->curvol); + zol_setvol(dev, dev->curvol); } return 0; } @@ -165,7 +164,7 @@ static int zol_getsigstr(struct zol_device *dev) { int a, b; - mutex_lock(&dev->lock); + down(&dev->lock); outb(0x00, io); /* This stuff I found to do nothing */ outb(dev->curvol, io); msleep(20); @@ -174,23 +173,23 @@ static int zol_getsigstr(struct zol_device *dev) msleep(10); b = inb(io); - mutex_unlock(&dev->lock); - + up(&dev->lock); + if (a != b) return (0); - if ((a == 0xcf) || (a == 0xdf) /* I found this out by playing */ + if ((a == 0xcf) || (a == 0xdf) /* I found this out by playing */ || (a == 0xef)) /* with a binary scanner on the card io */ return (1); - return (0); + return (0); } static int zol_is_stereo (struct zol_device *dev) { int x1, x2; - mutex_lock(&dev->lock); - + down(&dev->lock); + outb(0x00, io); outb(dev->curvol, io); msleep(20); @@ -199,8 +198,8 @@ static int zol_is_stereo (struct zol_device *dev) msleep(10); x2 = inb(io); - mutex_unlock(&dev->lock); - + up(&dev->lock); + if ((x1 == x2) && (x1 == 0xcf)) return 1; return 0; @@ -227,7 +226,7 @@ static int zol_do_ioctl(struct inode *inode, struct file *file, case VIDIOCGTUNER: { struct video_tuner *v = arg; - if (v->tuner) + if (v->tuner) return -EINVAL; strcpy(v->name, "FM"); v->rangelow = (int) (88.0 * 16000); @@ -351,8 +350,8 @@ static int __init zoltrix_init(void) } printk(KERN_INFO "Zoltrix Radio Plus card driver.\n"); - mutex_init(&zoltrix_unit.lock); - + init_MUTEX(&zoltrix_unit.lock); + /* mute card - prevents noisy bootups */ /* this ensures that the volume is all the way down */ diff --git a/drivers/media/video/Kconfig b/drivers/media/video/Kconfig index 94d078b77..ef42a260e 100644 --- a/drivers/media/video/Kconfig +++ b/drivers/media/video/Kconfig @@ -2,10 +2,10 @@ # Multimedia Video device configuration # -menu "Video Capture Adapters" +menu "Video For Linux" depends on VIDEO_DEV -comment "Video Capture Adapters" +comment "Video Adapters" config VIDEO_ADV_DEBUG bool "Enable advanced debug functionality" @@ -16,23 +16,34 @@ config VIDEO_ADV_DEBUG V4L devices. In doubt, say N. -config VIDEO_VIVI - tristate "Virtual Video Driver" - depends on VIDEO_V4L2 && !SPARC32 && !SPARC64 +config VIDEO_BT848 + tristate "BT848 Video For Linux" + depends on VIDEO_DEV && PCI && I2C + select I2C_ALGOBIT + select FW_LOADER + select VIDEO_BTCX select VIDEO_BUF - default n + select VIDEO_IR + select VIDEO_TUNER + select VIDEO_TVEEPROM ---help--- - Enables a virtual video driver. This device shows a color bar - and a timestamp, as a real device would generate by using V4L2 - api. - Say Y here if you want to test video apps or debug V4L devices. - In doubt, say N. + Support for BT848 based frame grabber/overlay boards. This includes + the Miro, Hauppauge and STB boards. Please read the material in + for more information. + + To compile this driver as a module, choose M here: the + module will be called bttv. -source "drivers/media/video/bt8xx/Kconfig" +config VIDEO_BT848_DVB + bool "DVB/ATSC Support for bt878 based TV cards" + depends on VIDEO_BT848 && DVB_CORE + select DVB_BT8XX + ---help--- + This adds support for DVB/ATSC cards based on the BT878 chip. config VIDEO_SAA6588 tristate "SAA6588 Radio Chip RDS decoder support on BT848 cards" - depends on I2C && VIDEO_BT848 + depends on VIDEO_DEV && I2C && VIDEO_BT848 help Support for Radio Data System (RDS) decoder. This allows seeing @@ -44,7 +55,7 @@ config VIDEO_SAA6588 config VIDEO_PMS tristate "Mediavision Pro Movie Studio Video For Linux" - depends on ISA && VIDEO_V4L1 + depends on VIDEO_DEV && ISA help Say Y if you have such a thing. @@ -53,7 +64,7 @@ config VIDEO_PMS config VIDEO_PLANB tristate "PlanB Video-In on PowerMac" - depends on PPC_PMAC && VIDEO_V4L1 && BROKEN + depends on PPC_PMAC && VIDEO_DEV && BROKEN help PlanB is the V4L driver for the PowerMac 7x00/8x00 series video input hardware. If you want to experiment with this, say Y. @@ -64,7 +75,7 @@ config VIDEO_PLANB config VIDEO_BWQCAM tristate "Quickcam BW Video For Linux" - depends on PARPORT && VIDEO_V4L1 + depends on VIDEO_DEV && PARPORT help Say Y have if you the black and white version of the QuickCam camera. See the next option for the color version. @@ -74,7 +85,7 @@ config VIDEO_BWQCAM config VIDEO_CQCAM tristate "QuickCam Colour Video For Linux (EXPERIMENTAL)" - depends on EXPERIMENTAL && PARPORT && VIDEO_V4L1 + depends on EXPERIMENTAL && VIDEO_DEV && PARPORT help This is the video4linux driver for the colour version of the Connectix QuickCam. If you have one of these cameras, say Y here, @@ -85,7 +96,7 @@ config VIDEO_CQCAM config VIDEO_W9966 tristate "W9966CF Webcam (FlyCam Supra and others) Video For Linux" - depends on PARPORT_1284 && PARPORT && VIDEO_V4L1 + depends on PARPORT_1284 && VIDEO_DEV && PARPORT help Video4linux driver for Winbond's w9966 based Webcams. Currently tested with the LifeView FlyCam Supra. @@ -98,7 +109,7 @@ config VIDEO_W9966 config VIDEO_CPIA tristate "CPiA Video For Linux" - depends on VIDEO_V4L1 + depends on VIDEO_DEV ---help--- This is the video4linux driver for cameras based on Vision's CPiA (Colour Processor Interface ASIC), such as the Creative Labs Video @@ -131,11 +142,9 @@ config VIDEO_CPIA_USB otherwise say N. This will not work with the Creative Webcam III. It is also available as a module (cpia_usb). -source "drivers/media/video/cpia2/Kconfig" - config VIDEO_SAA5246A tristate "SAA5246A, SAA5281 Teletext processor" - depends on I2C && VIDEO_V4L1 + depends on VIDEO_DEV && I2C help Support for I2C bus based teletext using the SAA5246A or SAA5281 chip. Useful only if you live in Europe. @@ -145,7 +154,7 @@ config VIDEO_SAA5246A config VIDEO_SAA5249 tristate "SAA5249 Teletext processor" - depends on VIDEO_DEV && I2C && VIDEO_V4L1 + depends on VIDEO_DEV && I2C help Support for I2C bus based teletext using the SAA5249 chip. At the moment this is only useful on some European WinTV cards. @@ -155,14 +164,14 @@ config VIDEO_SAA5249 config TUNER_3036 tristate "SAB3036 tuner" - depends on VIDEO_DEV && I2C && VIDEO_V4L1 + depends on VIDEO_DEV && I2C help Say Y here to include support for Philips SAB3036 compatible tuners. If in doubt, say N. config VIDEO_VINO tristate "SGI Vino Video For Linux (EXPERIMENTAL)" - depends on I2C && SGI_IP22 && EXPERIMENTAL && VIDEO_V4L1 + depends on VIDEO_DEV && I2C && SGI_IP22 && EXPERIMENTAL select I2C_ALGO_SGI help Say Y here to build in support for the Vino video input system found @@ -170,7 +179,7 @@ config VIDEO_VINO config VIDEO_STRADIS tristate "Stradis 4:2:2 MPEG-2 video driver (EXPERIMENTAL)" - depends on EXPERIMENTAL && PCI && VIDEO_V4L1 && !PPC64 + depends on EXPERIMENTAL && VIDEO_DEV && PCI help Say Y here to enable support for the Stradis 4:2:2 MPEG-2 video driver for PCI. There is a product page at @@ -178,7 +187,7 @@ config VIDEO_STRADIS config VIDEO_ZORAN tristate "Zoran ZR36057/36067 Video For Linux" - depends on PCI && I2C_ALGOBIT && VIDEO_V4L1 && !PPC64 + depends on VIDEO_DEV && PCI && I2C_ALGOBIT help Say Y for support for MJPEG capture cards based on the Zoran 36057/36067 PCI controller chipset. This includes the Iomega @@ -224,15 +233,9 @@ config VIDEO_ZORAN_LML33R10 support for the Linux Media Labs LML33R10 MJPEG capture/playback card. -config VIDEO_ZORAN_AVS6EYES - tristate "AverMedia 6 Eyes support (EXPERIMENTAL)" - depends on VIDEO_ZORAN && EXPERIMENTAL && VIDEO_V4L1 - help - Support for the AverMedia 6 Eyes video surveillance card. - config VIDEO_ZR36120 tristate "Zoran ZR36120/36125 Video For Linux" - depends on PCI && I2C && VIDEO_V4L1 && BROKEN + depends on VIDEO_DEV && PCI && I2C && BROKEN help Support for ZR36120/ZR36125 based frame grabber/overlay boards. This includes the Victor II, WaveWatcher, Video Wonder, Maxi-TV, @@ -244,7 +247,7 @@ config VIDEO_ZR36120 config VIDEO_MEYE tristate "Sony Vaio Picturebook Motion Eye Video For Linux" - depends on PCI && SONYPI && VIDEO_V4L1 + depends on VIDEO_DEV && PCI && SONYPI ---help--- This is the video4linux driver for the Motion Eye camera found in the Vaio Picturebook laptops. Please read the material in @@ -260,7 +263,7 @@ source "drivers/media/video/saa7134/Kconfig" config VIDEO_MXB tristate "Siemens-Nixdorf 'Multimedia eXtension Board'" - depends on PCI && VIDEO_V4L1 && I2C + depends on VIDEO_DEV && PCI select VIDEO_SAA7146_VV select VIDEO_TUNER ---help--- @@ -272,9 +275,8 @@ config VIDEO_MXB config VIDEO_DPC tristate "Philips-Semiconductors 'dpc7146 demonstration board'" - depends on PCI && VIDEO_V4L1 && I2C + depends on VIDEO_DEV && PCI select VIDEO_SAA7146_VV - select VIDEO_V4L2 ---help--- This is a video4linux driver for the 'dpc7146 demonstration board' by Philips-Semiconductors. It's the reference design @@ -287,9 +289,8 @@ config VIDEO_DPC config VIDEO_HEXIUM_ORION tristate "Hexium HV-PCI6 and Orion frame grabber" - depends on PCI && VIDEO_V4L1 && I2C + depends on VIDEO_DEV && PCI select VIDEO_SAA7146_VV - select VIDEO_V4L2 ---help--- This is a video4linux driver for the Hexium HV-PCI6 and Orion frame grabber cards by Hexium. @@ -299,9 +300,8 @@ config VIDEO_HEXIUM_ORION config VIDEO_HEXIUM_GEMINI tristate "Hexium Gemini frame grabber" - depends on PCI && VIDEO_V4L1 && I2C + depends on VIDEO_DEV && PCI select VIDEO_SAA7146_VV - select VIDEO_V4L2 ---help--- This is a video4linux driver for the Hexium Gemini frame grabber card by Hexium. Please note that the Gemini Dual @@ -312,216 +312,46 @@ config VIDEO_HEXIUM_GEMINI source "drivers/media/video/cx88/Kconfig" -config VIDEO_M32R_AR - tristate "AR devices" - depends on M32R && VIDEO_V4L1 - ---help--- - This is a video4linux driver for the Renesas AR (Artificial Retina) - camera module. - -config VIDEO_M32R_AR_M64278 - tristate "Use Colour AR module M64278(VGA)" - depends on VIDEO_M32R_AR && PLAT_M32700UT - ---help--- - Say Y here to use the Renesas M64278E-800 camera module, - which supports VGA(640x480 pixcels) size of images. - -# -# Encoder / Decoder module configuration -# - -menu "Encoders and Decoders" - depends on VIDEO_DEV - -config VIDEO_MSP3400 - tristate "Micronas MSP34xx audio decoders" - depends on VIDEO_DEV && I2C - ---help--- - Support for the Micronas MSP34xx series of audio decoders. - - To compile this driver as a module, choose M here: the - module will be called msp3400. - -config VIDEO_CS53L32A - tristate "Cirrus Logic CS53L32A audio ADC" - depends on VIDEO_DEV && I2C && EXPERIMENTAL - ---help--- - Support for the Cirrus Logic CS53L32A low voltage - stereo A/D converter. - - To compile this driver as a module, choose M here: the - module will be called cs53l32a. - -config VIDEO_TLV320AIC23B - tristate "Texas Instruments TLV320AIC23B audio codec" - depends on VIDEO_DEV && I2C && EXPERIMENTAL - ---help--- - Support for the Texas Instruments TLV320AIC23B audio codec. - - To compile this driver as a module, choose M here: the - module will be called tlv320aic23b. - -config VIDEO_WM8775 - tristate "Wolfson Microelectronics WM8775 audio ADC with input mixer" - depends on VIDEO_DEV && I2C && EXPERIMENTAL - ---help--- - Support for the Wolfson Microelectronics WM8775 high - performance stereo A/D Converter with a 4 channel input mixer. - - To compile this driver as a module, choose M here: the - module will be called wm8775. - -config VIDEO_WM8739 - tristate "Wolfson Microelectronics WM8739 stereo audio ADC" - depends on VIDEO_DEV && I2C && EXPERIMENTAL - ---help--- - Support for the Wolfson Microelectronics WM8739 - stereo A/D Converter. - - To compile this driver as a module, choose M here: the - module will be called wm8739. - -config VIDEO_CX2341X - tristate "Conexant CX2341x MPEG encoders" - depends on VIDEO_V4L2 && EXPERIMENTAL - ---help--- - Support for the Conexant CX23416 MPEG encoders - and CX23415 MPEG encoder/decoders. - - This module currently supports the encoding functions only. - - To compile this driver as a module, choose M here: the - module will be called cx2341x. - -source "drivers/media/video/cx25840/Kconfig" - -config VIDEO_SAA711X - tristate "Philips SAA7113/4/5 video decoders" - depends on VIDEO_DEV && I2C && EXPERIMENTAL - ---help--- - Support for the Philips SAA7113/4/5 video decoders. - - To compile this driver as a module, choose M here: the - module will be called saa7115. - -config VIDEO_SAA7127 - tristate "Philips SAA7127/9 digital video encoders" - depends on VIDEO_V4L2 && I2C && EXPERIMENTAL - ---help--- - Support for the Philips SAA7127/9 digital video encoders. - - To compile this driver as a module, choose M here: the - module will be called saa7127. - -config VIDEO_UPD64031A - tristate "NEC Electronics uPD64031A Ghost Reduction" - depends on VIDEO_V4L2 && I2C && EXPERIMENTAL - ---help--- - Support for the NEC Electronics uPD64031A Ghost Reduction - video chip. It is most often found in NTSC TV cards made for - Japan and is used to reduce the 'ghosting' effect that can - be present in analog TV broadcasts. - - To compile this driver as a module, choose M here: the - module will be called upd64031a. - -config VIDEO_UPD64083 - tristate "NEC Electronics uPD64083 3-Dimensional Y/C separation" - depends on VIDEO_V4L2 && I2C && EXPERIMENTAL - ---help--- - Support for the NEC Electronics uPD64083 3-Dimensional Y/C - separation video chip. It is used to improve the quality of - the colors of a composite signal. - - To compile this driver as a module, choose M here: the - module will be called upd64083. - -endmenu # encoder / decoder chips - -# -# USB Multimedia device configuration -# - -menu "V4L USB devices" - depends on USB && VIDEO_DEV - -source "drivers/media/video/pvrusb2/Kconfig" - source "drivers/media/video/em28xx/Kconfig" -source "drivers/media/video/usbvideo/Kconfig" - -source "drivers/media/video/et61x251/Kconfig" - config VIDEO_OVCAMCHIP tristate "OmniVision Camera Chip support" - depends on I2C && VIDEO_V4L1 + depends on VIDEO_DEV && I2C ---help--- Support for the OmniVision OV6xxx and OV7xxx series of camera chips. This driver is intended to be used with the ov511 and w9968cf USB camera drivers. To compile this driver as a module, choose M here: the - module will be called ovcamchip. + module will be called ovcamchip -config USB_W9968CF - tristate "USB W996[87]CF JPEG Dual Mode Camera support" - depends on USB && VIDEO_V4L1 && I2C - select VIDEO_OVCAMCHIP +config VIDEO_M32R_AR + tristate "AR devices" + depends on M32R ---help--- - Say Y here if you want support for cameras based on OV681 or - Winbond W9967CF/W9968CF JPEG USB Dual Mode Camera Chips. - - This driver has an optional plugin, which is distributed as a - separate module only (released under GPL). It allows to use higher - resolutions and framerates, but cannot be included in the official - Linux kernel for performance purposes. - - See for more info. - - To compile this driver as a module, choose M here: the - module will be called w9968cf. + This is a video4linux driver for the Renesas AR (Artificial Retina) + camera module. -config USB_OV511 - tristate "USB OV511 Camera support" - depends on USB && VIDEO_V4L1 +config VIDEO_M32R_AR_M64278 + tristate "Use Colour AR module M64278(VGA)" + depends on VIDEO_M32R_AR && PLAT_M32700UT ---help--- - Say Y here if you want to connect this type of camera to your - computer's USB port. See - for more information and for a list of supported cameras. - - To compile this driver as a module, choose M here: the - module will be called ov511. + Say Y here to use the Renesas M64278E-800 camera module, + which supports VGA(640x480 pixcels) size of images. -config USB_SE401 - tristate "USB SE401 Camera support" - depends on USB && VIDEO_V4L1 +config VIDEO_AUDIO_DECODER + tristate "Add support for additional audio chipsets" + depends on VIDEO_DEV && I2C && EXPERIMENTAL ---help--- - Say Y here if you want to connect this type of camera to your - computer's USB port. See - for more information and for a list of supported cameras. - - To compile this driver as a module, choose M here: the - module will be called se401. + Say Y here to compile drivers for WM8775 and CS53L32A audio + decoders. -source "drivers/media/video/sn9c102/Kconfig" - -config USB_STV680 - tristate "USB STV680 (Pencam) Camera support" - depends on USB && VIDEO_V4L1 +config VIDEO_DECODER + tristate "Add support for additional video chipsets" + depends on VIDEO_DEV && I2C && EXPERIMENTAL + select FW_LOADER ---help--- - Say Y here if you want to connect this type of camera to your - computer's USB port. This includes the Pencam line of cameras. - See for more information - and for a list of supported cameras. - - To compile this driver as a module, choose M here: the - module will be called stv680. - -source "drivers/media/video/zc0301/Kconfig" - -source "drivers/media/video/pwc/Kconfig" - -endmenu # V4L USB devices + Say Y here to compile drivers for SAA7115, SAA7127 and CX25840 + video decoders. endmenu diff --git a/drivers/media/video/Makefile b/drivers/media/video/Makefile index e82e511f2..faf728366 100644 --- a/drivers/media/video/Makefile +++ b/drivers/media/video/Makefile @@ -2,22 +2,21 @@ # Makefile for the video capture/playback device drivers. # +bttv-objs := bttv-driver.o bttv-cards.o bttv-if.o \ + bttv-risc.o bttv-vbi.o bttv-i2c.o bttv-gpio.o \ + bttv-input.o zoran-objs := zr36120.o zr36120_i2c.o zr36120_mem.o zr36067-objs := zoran_procfs.o zoran_device.o \ zoran_driver.o zoran_card.o tuner-objs := tuner-core.o tuner-types.o tuner-simple.o \ - mt20xx.o tda8290.o tea5767.o tda9887.o + mt20xx.o tda8290.o tea5767.o msp3400-objs := msp3400-driver.o msp3400-kthreads.o -obj-$(CONFIG_VIDEO_DEV) += videodev.o v4l2-common.o compat_ioctl32.o +obj-$(CONFIG_VIDEO_DEV) += videodev.o v4l2-common.o v4l1-compat.o compat_ioctl32.o -ifeq ($(CONFIG_VIDEO_V4L1_COMPAT),y) - obj-$(CONFIG_VIDEO_DEV) += v4l1-compat.o -endif - -obj-$(CONFIG_VIDEO_BT848) += bt8xx/ -obj-$(CONFIG_VIDEO_BT848) += tvaudio.o tda7432.o tda9875.o ir-kbd-i2c.o +obj-$(CONFIG_VIDEO_BT848) += bttv.o msp3400.o tvaudio.o \ + tda7432.o tda9875.o ir-kbd-i2c.o obj-$(CONFIG_SOUND_TVMIXER) += tvmixer.o obj-$(CONFIG_VIDEO_ZR36120) += zoran.o @@ -33,7 +32,6 @@ obj-$(CONFIG_VIDEO_ZORAN_DC30) += adv7175.o vpx3220.o zr36050.o \ zr36016.o obj-$(CONFIG_VIDEO_ZORAN_LML33) += bt819.o bt856.o zr36060.o obj-$(CONFIG_VIDEO_ZORAN_LML33R10) += saa7114.o adv7170.o zr36060.o -obj-$(CONFIG_VIDEO_ZORAN_AVS6EYES) += bt866.o ks0127.o zr36060.o obj-$(CONFIG_VIDEO_ZORAN) += zr36067.o videocodec.o obj-$(CONFIG_VIDEO_PMS) += pms.o obj-$(CONFIG_VIDEO_PLANB) += planb.o @@ -46,22 +44,16 @@ obj-$(CONFIG_VIDEO_MEYE) += meye.o obj-$(CONFIG_VIDEO_SAA7134) += ir-kbd-i2c.o saa7134/ obj-$(CONFIG_VIDEO_CX88) += cx88/ obj-$(CONFIG_VIDEO_EM28XX) += em28xx/ -obj-$(CONFIG_VIDEO_EM28XX) += tvp5150.o -obj-$(CONFIG_VIDEO_PVRUSB2) += pvrusb2/ -obj-$(CONFIG_VIDEO_MSP3400) += msp3400.o -obj-$(CONFIG_VIDEO_CS53L32A) += cs53l32a.o -obj-$(CONFIG_VIDEO_TLV320AIC23B) += tlv320aic23b.o -obj-$(CONFIG_VIDEO_WM8775) += wm8775.o -obj-$(CONFIG_VIDEO_WM8739) += wm8739.o +obj-$(CONFIG_VIDEO_EM28XX) += saa711x.o tvp5150.o +obj-$(CONFIG_VIDEO_AUDIO_DECODER) += wm8775.o cs53l32a.o obj-$(CONFIG_VIDEO_OVCAMCHIP) += ovcamchip/ -obj-$(CONFIG_VIDEO_CPIA2) += cpia2/ -obj-$(CONFIG_VIDEO_MXB) += saa7111.o tda9840.o tea6415c.o tea6420.o mxb.o +obj-$(CONFIG_VIDEO_MXB) += saa7111.o tuner.o tda9840.o tea6415c.o tea6420.o mxb.o obj-$(CONFIG_VIDEO_HEXIUM_ORION) += hexium_orion.o obj-$(CONFIG_VIDEO_HEXIUM_GEMINI) += hexium_gemini.o obj-$(CONFIG_VIDEO_DPC) += saa7111.o dpc7146.o obj-$(CONFIG_TUNER_3036) += tuner-3036.o -obj-$(CONFIG_VIDEO_TUNER) += tuner.o +obj-$(CONFIG_VIDEO_TUNER) += tuner.o tda9887.o obj-$(CONFIG_VIDEO_BUF) += video-buf.o obj-$(CONFIG_VIDEO_BUF_DVB) += video-buf-dvb.o obj-$(CONFIG_VIDEO_BTCX) += btcx-risc.o @@ -69,31 +61,6 @@ obj-$(CONFIG_VIDEO_TVEEPROM) += tveeprom.o obj-$(CONFIG_VIDEO_M32R_AR_M64278) += arv.o -obj-$(CONFIG_VIDEO_CX25840) += cx25840/ -obj-$(CONFIG_VIDEO_SAA711X) += saa7115.o -obj-$(CONFIG_VIDEO_SAA7127) += saa7127.o -obj-$(CONFIG_VIDEO_UPD64031A) += upd64031a.o -obj-$(CONFIG_VIDEO_UPD64083) += upd64083.o -obj-$(CONFIG_VIDEO_CX2341X) += cx2341x.o - -obj-$(CONFIG_USB_DABUSB) += dabusb.o -obj-$(CONFIG_USB_OV511) += ov511.o -obj-$(CONFIG_USB_SE401) += se401.o -obj-$(CONFIG_USB_STV680) += stv680.o -obj-$(CONFIG_USB_W9968CF) += w9968cf.o - -obj-$(CONFIG_USB_SN9C102) += sn9c102/ -obj-$(CONFIG_USB_ET61X251) += et61x251/ -obj-$(CONFIG_USB_PWC) += pwc/ -obj-$(CONFIG_USB_ZC0301) += zc0301/ - -obj-$(CONFIG_USB_IBMCAM) += usbvideo/ -obj-$(CONFIG_USB_KONICAWC) += usbvideo/ -obj-$(CONFIG_USB_VICAM) += usbvideo/ -obj-$(CONFIG_USB_QUICKCAM_MESSENGER) += usbvideo/ - -obj-$(CONFIG_VIDEO_VIVI) += vivi.o - -EXTRA_CFLAGS += -Idrivers/media/dvb/dvb-core -extra-cflags-$(CONFIG_VIDEO_V4L1_COMPAT) += -DCONFIG_VIDEO_V4L1_COMPAT +obj-$(CONFIG_VIDEO_DECODER) += saa7115.o cx25840/ saa7127.o +EXTRA_CFLAGS += -I$(srctree)/drivers/media/dvb/dvb-core diff --git a/drivers/media/video/adv7170.c b/drivers/media/video/adv7170.c index 48709582a..4ce07ae62 100644 --- a/drivers/media/video/adv7170.c +++ b/drivers/media/video/adv7170.c @@ -1,9 +1,9 @@ -/* +/* * adv7170 - adv7170, adv7171 video encoder driver version 0.0.1 * * Copyright (C) 2002 Maxim Yevtyushkin * - * Based on adv7176 driver by: + * Based on adv7176 driver by: * * Copyright (C) 1998 Dave Perks * Copyright (C) 1999 Wolfgang Scherr @@ -53,6 +53,7 @@ MODULE_AUTHOR("Maxim Yevtyushkin"); MODULE_LICENSE("GPL"); #include +#include #define I2C_NAME(x) (x)->name @@ -124,21 +125,24 @@ adv7170_write_block (struct i2c_client *client, if (i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { /* do raw I2C, not smbus compatible */ struct adv7170 *encoder = i2c_get_clientdata(client); + struct i2c_msg msg; u8 block_data[32]; - int block_len; + msg.addr = client->addr; + msg.flags = 0; while (len >= 2) { - block_len = 0; - block_data[block_len++] = reg = data[0]; + msg.buf = (char *) block_data; + msg.len = 0; + block_data[msg.len++] = reg = data[0]; do { - block_data[block_len++] = + block_data[msg.len++] = encoder->reg[reg++] = data[1]; len -= 2; data += 2; } while (len >= 2 && data[0] == reg && - block_len < 32); - if ((ret = i2c_master_send(client, block_data, - block_len)) < 0) + msg.len < 32); + if ((ret = i2c_transfer(client->adapter, + &msg, 1)) < 0) break; } } else { @@ -173,7 +177,7 @@ adv7170_write_block (struct i2c_client *client, static const unsigned char init_NTSC[] = { 0x00, 0x10, // MR0 0x01, 0x20, // MR1 - 0x02, 0x0e, // MR2 RTC control: bits 2 and 1 + 0x02, 0x0e, // MR2 RTC control: bits 2 and 1 0x03, 0x80, // MR3 0x04, 0x30, // MR4 0x05, 0x00, // Reserved @@ -196,7 +200,7 @@ static const unsigned char init_NTSC[] = { 0x16, 0x00, // CGMS_WSS_0 0x17, 0x00, // CGMS_WSS_1 0x18, 0x00, // CGMS_WSS_2 - 0x19, 0x00, // Teletext Ctl + 0x19, 0x00, // Teletext Ctl }; static const unsigned char init_PAL[] = { @@ -381,7 +385,7 @@ static unsigned short normal_i2c[] = }; static unsigned short ignore = I2C_CLIENT_END; - + static struct i2c_client_address_data addr_data = { .normal_i2c = normal_i2c, .probe = &ignore, diff --git a/drivers/media/video/adv7175.c b/drivers/media/video/adv7175.c index 68e7d7aff..4e218f22b 100644 --- a/drivers/media/video/adv7175.c +++ b/drivers/media/video/adv7175.c @@ -1,4 +1,4 @@ -/* +/* * adv7175 - adv7175a video encoder driver version 0.0.3 * * Copyright (C) 1998 Dave Perks @@ -49,6 +49,7 @@ MODULE_AUTHOR("Dave Perks"); MODULE_LICENSE("GPL"); #include +#include #define I2C_NAME(s) (s)->name @@ -67,6 +68,8 @@ MODULE_PARM_DESC(debug, "Debug level (0-1)"); /* ----------------------------------------------------------------------- */ struct adv7175 { + unsigned char reg[128]; + int norm; int input; int enable; @@ -92,6 +95,9 @@ adv7175_write (struct i2c_client *client, u8 reg, u8 value) { + struct adv7175 *encoder = i2c_get_clientdata(client); + + encoder->reg[reg] = value; return i2c_smbus_write_byte_data(client, reg, value); } @@ -114,21 +120,25 @@ adv7175_write_block (struct i2c_client *client, * the adapter understands raw I2C */ if (i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { /* do raw I2C, not smbus compatible */ + struct adv7175 *encoder = i2c_get_clientdata(client); + struct i2c_msg msg; u8 block_data[32]; - int block_len; + msg.addr = client->addr; + msg.flags = 0; while (len >= 2) { - block_len = 0; - block_data[block_len++] = reg = data[0]; + msg.buf = (char *) block_data; + msg.len = 0; + block_data[msg.len++] = reg = data[0]; do { - block_data[block_len++] = data[1]; - reg++; + block_data[msg.len++] = + encoder->reg[reg++] = data[1]; len -= 2; data += 2; } while (len >= 2 && data[0] == reg && - block_len < 32); - if ((ret = i2c_master_send(client, block_data, - block_len)) < 0) + msg.len < 32); + if ((ret = i2c_transfer(client->adapter, + &msg, 1)) < 0) break; } } else { @@ -161,6 +171,24 @@ set_subcarrier_freq (struct i2c_client *client, adv7175_write(client, 0x05, 0x25); } +#ifdef ENCODER_DUMP +static void +dump (struct i2c_client *client) +{ + struct adv7175 *encoder = i2c_get_clientdata(client); + int i, j; + + printk(KERN_INFO "%s: registry dump\n", I2C_NAME(client)); + for (i = 0; i < 182 / 8; i++) { + printk("%s: 0x%02x -", I2C_NAME(client), i * 8); + for (j = 0; j < 8; j++) { + printk(" 0x%02x", encoder->reg[i * 8 + j]); + } + printk("\n"); + } +} +#endif + /* ----------------------------------------------------------------------- */ // Output filter: S-Video Composite @@ -233,7 +261,7 @@ adv7175_command (struct i2c_client *client, sizeof(init_common)); adv7175_write(client, 0x07, TR0MODE | TR0RST); adv7175_write(client, 0x07, TR0MODE); - break; + break; case ENCODER_GET_CAPABILITIES: { @@ -379,6 +407,14 @@ adv7175_command (struct i2c_client *client, } break; +#ifdef ENCODER_DUMP + case ENCODER_DUMP: + { + dump(client); + } + break; +#endif + default: return -EINVAL; } @@ -399,7 +435,7 @@ static unsigned short normal_i2c[] = }; static unsigned short ignore = I2C_CLIENT_END; - + static struct i2c_client_address_data addr_data = { .normal_i2c = normal_i2c, .probe = &ignore, diff --git a/drivers/media/video/arv.c b/drivers/media/video/arv.c index 5c5e682a3..994b75fe1 100644 --- a/drivers/media/video/arv.c +++ b/drivers/media/video/arv.c @@ -18,7 +18,9 @@ * 2003-09-01: Support w3cam by Takeo Takahashi */ +#include #include +#include #include #include #include @@ -29,9 +31,8 @@ #include #include #include -#include -#include +#include #include #include #include @@ -116,7 +117,7 @@ struct ar_device { int width, height; int frame_bytes, line_bytes; wait_queue_head_t wait; - struct mutex lock; + struct semaphore lock; }; static int video_nr = -1; /* video device number (first free) */ @@ -160,39 +161,39 @@ void iic(int n, unsigned long addr, unsigned long data1, unsigned long data2, { int i; - /* Slave Address */ - ar_outl(addr, PLDI2CDATA); + /* Slave Address */ + ar_outl(addr, PLDI2CDATA); wait_for_vsync(); - /* Start */ - ar_outl(1, PLDI2CCND); + /* Start */ + ar_outl(1, PLDI2CCND); wait_acknowledge(); /* Transfer data 1 */ - ar_outl(data1, PLDI2CDATA); + ar_outl(data1, PLDI2CDATA); wait_for_vsync(); - ar_outl(PLDI2CSTEN_STEN, PLDI2CSTEN); + ar_outl(PLDI2CSTEN_STEN, PLDI2CSTEN); wait_acknowledge(); /* Transfer data 2 */ - ar_outl(data2, PLDI2CDATA); + ar_outl(data2, PLDI2CDATA); wait_for_vsync(); - ar_outl(PLDI2CSTEN_STEN, PLDI2CSTEN); + ar_outl(PLDI2CSTEN_STEN, PLDI2CSTEN); wait_acknowledge(); if (n == 3) { /* Transfer data 3 */ - ar_outl(data3, PLDI2CDATA); + ar_outl(data3, PLDI2CDATA); wait_for_vsync(); - ar_outl(PLDI2CSTEN_STEN, PLDI2CSTEN); + ar_outl(PLDI2CSTEN_STEN, PLDI2CSTEN); wait_acknowledge(); - } + } - /* Stop */ + /* Stop */ for (i = 0; i < 100; i++) cpu_relax(); - ar_outl(2, PLDI2CCND); - ar_outl(2, PLDI2CCND); + ar_outl(2, PLDI2CCND); + ar_outl(2, PLDI2CCND); while (ar_inl(PLDI2CSTS) & PLDI2CSTS_BB) cpu_relax(); @@ -203,24 +204,24 @@ void init_iic(void) { DEBUG(1, "init_iic:\n"); - /* + /* * ICU Setting (iic) */ - /* I2C Setting */ - ar_outl(0x0, PLDI2CCR); /* I2CCR Disable */ - ar_outl(0x0300, PLDI2CMOD); /* I2CMOD ACK/8b-data/7b-addr/auto */ - ar_outl(0x1, PLDI2CACK); /* I2CACK ACK */ + /* I2C Setting */ + ar_outl(0x0, PLDI2CCR); /* I2CCR Disable */ + ar_outl(0x0300, PLDI2CMOD); /* I2CMOD ACK/8b-data/7b-addr/auto */ + ar_outl(0x1, PLDI2CACK); /* I2CACK ACK */ - /* I2C CLK */ - /* 50MH-100k */ + /* I2C CLK */ + /* 50MH-100k */ if (freq == 75) { - ar_outl(369, PLDI2CFREQ); /* BCLK = 75MHz */ + ar_outl(369, PLDI2CFREQ); /* BCLK = 75MHz */ } else if (freq == 50) { ar_outl(244, PLDI2CFREQ); /* BCLK = 50MHz */ } else { ar_outl(244, PLDI2CFREQ); /* default: BCLK = 50MHz */ } - ar_outl(0x1, PLDI2CCR); /* I2CCR Enable */ + ar_outl(0x1, PLDI2CCR); /* I2CCR Enable */ } /************************************************************************** @@ -252,7 +253,7 @@ static inline void wait_for_vertical_sync(int exp_line) /* * check HCOUNT because we cannot check vertical sync. - */ + */ for (; tmout >= 0; tmout--) { l = ar_inl(ARVHCOUNT); if (l == exp_line) @@ -287,7 +288,7 @@ static ssize_t ar_read(struct file *file, char *buf, size_t count, loff_t *ppos) if (ar->mode == AR_MODE_NORMAL) arvcr1 |= ARVCR1_NORMAL; - mutex_lock(&ar->lock); + down(&ar->lock); #if USE_INT local_irq_save(flags); @@ -391,7 +392,7 @@ static ssize_t ar_read(struct file *file, char *buf, size_t count, loff_t *ppos) } DEBUG(1, "ret = %d\n", ret); out_up: - mutex_unlock(&ar->lock); + up(&ar->lock); return ret; } @@ -455,7 +456,7 @@ static int ar_do_ioctl(struct inode *inode, struct file *file, (w->width != AR_WIDTH_QVGA || w->height != AR_HEIGHT_QVGA)) return -EINVAL; - mutex_lock(&ar->lock); + down(&ar->lock); ar->width = w->width; ar->height = w->height; if (ar->width == AR_WIDTH_VGA) { @@ -472,7 +473,7 @@ static int ar_do_ioctl(struct inode *inode, struct file *file, ar->line_bytes = AR_LINE_BYTES_QVGA; ar->mode = AR_MODE_INTERLACE; } - mutex_unlock(&ar->lock); + up(&ar->lock); return 0; } case VIDIOCGFBUF: @@ -561,8 +562,8 @@ static void ar_interrupt(int irq, void *dev, struct pt_regs *regs) /* operations for interlace mode */ if ( line_count < (AR_HEIGHT_VGA/2) ) /* even line */ line_number = (line_count << 1); - else /* odd line */ - line_number = + else /* odd line */ + line_number = (((line_count - (AR_HEIGHT_VGA/2)) << 1) + 1); } else { line_number = line_count; @@ -650,7 +651,7 @@ static int ar_initialize(struct video_device *dev) cr |= ARVCR1_NORMAL; ar_outl(cr, ARVCR1); - /* + /* * Initialize IIC so that CPU can communicate with AR LSI, * and send boot commands to AR LSI. */ @@ -733,7 +734,7 @@ static int ar_initialize(struct video_device *dev) void ar_release(struct video_device *vfd) { struct ar_device *ar = vfd->priv; - mutex_lock(&ar->lock); + down(&ar->lock); video_device_release(vfd); } @@ -823,7 +824,7 @@ static int __init ar_init(void) ar->line_bytes = AR_LINE_BYTES_QVGA; ar->mode = AR_MODE_INTERLACE; } - mutex_init(&ar->lock); + init_MUTEX(&ar->lock); init_waitqueue_head(&ar->wait); #if USE_INT @@ -845,7 +846,7 @@ static int __init ar_init(void) * so register video device as a frame grabber type. * device is named "video[0-64]". * video_register_device() initializes h/w using ar_initialize(). - */ + */ if (video_register_device(ar->vdev, VFL_TYPE_GRABBER, video_nr) != 0) { /* return -1, -ENFILE(full) or others */ printk("arv: register video (Colour AR) failed.\n"); diff --git a/drivers/media/video/bt819.c b/drivers/media/video/bt819.c index e7b38fdd5..d6447791d 100644 --- a/drivers/media/video/bt819.c +++ b/drivers/media/video/bt819.c @@ -1,4 +1,4 @@ -/* +/* * bt819 - BT819A VideoStream Decoder (Rockwell Part) * * Copyright (C) 1999 Mike Bernson @@ -6,7 +6,7 @@ * * Modifications for LML33/DC10plus unified driver * Copyright (C) 2000 Serguei Miridonov - * + * * Changes by Ronald Bultje * - moved over to linux>=2.4.x i2c protocol (9/9/2002) * @@ -53,6 +53,7 @@ MODULE_AUTHOR("Mike Bernson & Dave Perks"); MODULE_LICENSE("GPL"); #include +#include #define I2C_NAME(s) (s)->name @@ -140,21 +141,24 @@ bt819_write_block (struct i2c_client *client, if (i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { /* do raw I2C, not smbus compatible */ struct bt819 *decoder = i2c_get_clientdata(client); + struct i2c_msg msg; u8 block_data[32]; - int block_len; + msg.addr = client->addr; + msg.flags = 0; while (len >= 2) { - block_len = 0; - block_data[block_len++] = reg = data[0]; + msg.buf = (char *) block_data; + msg.len = 0; + block_data[msg.len++] = reg = data[0]; do { - block_data[block_len++] = + block_data[msg.len++] = decoder->reg[reg++] = data[1]; len -= 2; data += 2; } while (len >= 2 && data[0] == reg && - block_len < 32); - if ((ret = i2c_master_send(client, block_data, - block_len)) < 0) + msg.len < 32); + if ((ret = i2c_transfer(client->adapter, + &msg, 1)) < 0) break; } } else { @@ -206,9 +210,9 @@ bt819_init (struct i2c_client *client) Bug in the bt819 stepping on my board? */ 0x14, 0x00, /* 0x14 Vertial Scaling lsb */ - 0x16, 0x07, /* 0x16 Video Timing Polarity + 0x16, 0x07, /* 0x16 Video Timing Polarity ACTIVE=active low - FIELD: high=odd, + FIELD: high=odd, vreset=active high, hreset=active high */ 0x18, 0x68, /* 0x18 AGC Delay */ @@ -497,7 +501,7 @@ static unsigned short normal_i2c[] = { }; static unsigned short ignore = I2C_CLIENT_END; - + static struct i2c_client_address_data addr_data = { .normal_i2c = normal_i2c, .probe = &ignore, diff --git a/drivers/media/video/bt832.c b/drivers/media/video/bt832.c index efe605a11..cc54b62f4 100644 --- a/drivers/media/video/bt832.c +++ b/drivers/media/video/bt832.c @@ -6,7 +6,7 @@ It outputs an 8-bit 4:2:2 YUV or YCrCb video signal which can be directly connected to bt848/bt878 GPIO pins on this purpose. (see: VLSI Vision Ltd. www.vvl.co.uk for camera datasheets) - + Supported Cards: - Pixelview Rev.4E: 0x8a GPIO 0x400000 toggles Bt832 RESET, and the chip changes to i2c 0x88 ! @@ -30,22 +30,23 @@ #include #include #include +#include +#include -#include "id.h" -#include "audiochip.h" #include "bttv.h" #include "bt832.h" MODULE_LICENSE("GPL"); /* Addresses to scan */ -static unsigned short normal_i2c[] = {I2C_CLIENT_END}; -static unsigned short normal_i2c_range[] = {I2C_BT832_ALT1>>1,I2C_BT832_ALT2>>1,I2C_CLIENT_END}; +static unsigned short normal_i2c[] = { I2C_BT832_ALT1>>1, I2C_BT832_ALT2>>1, + I2C_CLIENT_END }; I2C_CLIENT_INSMOD; -/* ---------------------------------------------------------------------- */ +int debug; /* debug output */ +module_param(debug, int, 0644); -#define dprintk if (debug) printk +/* ---------------------------------------------------------------------- */ static int bt832_detach(struct i2c_client *client); @@ -54,36 +55,39 @@ static struct i2c_driver driver; static struct i2c_client client_template; struct bt832 { - struct i2c_client client; + struct i2c_client client; }; int bt832_hexdump(struct i2c_client *i2c_client_s, unsigned char *buf) { int i,rc; buf[0]=0x80; // start at register 0 with auto-increment - if (1 != (rc = i2c_master_send(i2c_client_s,buf,1))) - printk("bt832: i2c i/o error: rc == %d (should be 1)\n",rc); + if (1 != (rc = i2c_master_send(i2c_client_s,buf,1))) + v4l_err(i2c_client_s,"i2c i/o error: rc == %d (should be 1)\n",rc); - for(i=0;i<65;i++) - buf[i]=0; - if (65 != (rc=i2c_master_recv(i2c_client_s,buf,65))) - printk("bt832: i2c i/o error: rc == %d (should be 65)\n",rc); + for(i=0;i<65;i++) + buf[i]=0; + if (65 != (rc=i2c_master_recv(i2c_client_s,buf,65))) + v4l_err(i2c_client_s,"i2c i/o error: rc == %d (should be 65)\n",rc); - // Note: On READ the first byte is the current index - // (e.g. 0x80, what we just wrote) + // Note: On READ the first byte is the current index + // (e.g. 0x80, what we just wrote) - if(1) { - int i; - printk("BT832 hexdump:\n"); - for(i=1;i<65;i++) { + if(debug>1) { + int i; + v4l_dbg(2, debug,i2c_client_s,"hexdump:"); + for(i=1;i<65;i++) { if(i!=1) { - if(((i-1)%8)==0) printk(" "); - if(((i-1)%16)==0) printk("\n"); + if(((i-1)%8)==0) printk(" "); + if(((i-1)%16)==0) { + printk("\n"); + v4l_dbg(2, debug,i2c_client_s,"hexdump:"); + } } - printk(" %02x",buf[i]); - } - printk("\n"); - } + printk(" %02x",buf[i]); + } + printk("\n"); + } return 0; } @@ -95,103 +99,88 @@ int bt832_init(struct i2c_client *i2c_client_s) buf=kmalloc(65,GFP_KERNEL); bt832_hexdump(i2c_client_s,buf); - + if(buf[0x40] != 0x31) { - printk("bt832: this i2c chip is no bt832 (id=%02x). Detaching.\n",buf[0x40]); + v4l_err(i2c_client_s,"This i2c chip is no bt832 (id=%02x). Detaching.\n",buf[0x40]); kfree(buf); return 0; } - printk("Write 0 tp VPSTATUS\n"); - buf[0]=BT832_VP_STATUS; // Reg.52 - buf[1]= 0x00; - if (2 != (rc = i2c_master_send(i2c_client_s,buf,2))) - printk("bt832: i2c i/o error VPS: rc == %d (should be 2)\n",rc); + v4l_err(i2c_client_s,"Write 0 tp VPSTATUS\n"); + buf[0]=BT832_VP_STATUS; // Reg.52 + buf[1]= 0x00; + if (2 != (rc = i2c_master_send(i2c_client_s,buf,2))) + v4l_err(i2c_client_s,"i2c i/o error VPS: rc == %d (should be 2)\n",rc); - bt832_hexdump(i2c_client_s,buf); + bt832_hexdump(i2c_client_s,buf); // Leave low power mode: - printk("Bt832: leave low power mode.\n"); + v4l_err(i2c_client_s,"leave low power mode.\n"); buf[0]=BT832_CAM_SETUP0; //0x39 57 buf[1]=0x08; if (2 != (rc = i2c_master_send(i2c_client_s,buf,2))) - printk("bt832: i2c i/o error LLPM: rc == %d (should be 2)\n",rc); + v4l_err(i2c_client_s,"i2c i/o error LLPM: rc == %d (should be 2)\n",rc); - bt832_hexdump(i2c_client_s,buf); + bt832_hexdump(i2c_client_s,buf); - printk("Write 0 tp VPSTATUS\n"); - buf[0]=BT832_VP_STATUS; // Reg.52 - buf[1]= 0x00; - if (2 != (rc = i2c_master_send(i2c_client_s,buf,2))) - printk("bt832: i2c i/o error VPS: rc == %d (should be 2)\n",rc); + v4l_info(i2c_client_s,"Write 0 tp VPSTATUS\n"); + buf[0]=BT832_VP_STATUS; // Reg.52 + buf[1]= 0x00; + if (2 != (rc = i2c_master_send(i2c_client_s,buf,2))) + v4l_err(i2c_client_s,"i2c i/o error VPS: rc == %d (should be 2)\n",rc); - bt832_hexdump(i2c_client_s,buf); + bt832_hexdump(i2c_client_s,buf); // Enable Output - printk("Enable Output\n"); + v4l_info(i2c_client_s,"Enable Output\n"); buf[0]=BT832_VP_CONTROL1; // Reg.40 buf[1]= 0x27 & (~0x01); // Default | !skip if (2 != (rc = i2c_master_send(i2c_client_s,buf,2))) - printk("bt832: i2c i/o error EO: rc == %d (should be 2)\n",rc); - - bt832_hexdump(i2c_client_s,buf); - -#if 0 - // Full 30/25 Frame rate - printk("Full 30/25 Frame rate\n"); - buf[0]=BT832_VP_CONTROL0; // Reg.39 - buf[1]= 0x00; - if (2 != (rc = i2c_master_send(i2c_client_s,buf,2))) - printk("bt832: i2c i/o error FFR: rc == %d (should be 2)\n",rc); - - bt832_hexdump(i2c_client_s,buf); -#endif - -#if 1 + v4l_err(i2c_client_s,"i2c i/o error EO: rc == %d (should be 2)\n",rc); + + bt832_hexdump(i2c_client_s,buf); + + // for testing (even works when no camera attached) - printk("bt832: *** Generate NTSC M Bars *****\n"); + v4l_info(i2c_client_s,"*** Generate NTSC M Bars *****\n"); buf[0]=BT832_VP_TESTCONTROL0; // Reg. 42 buf[1]=3; // Generate NTSC System M bars, Generate Frame timing internally - if (2 != (rc = i2c_master_send(i2c_client_s,buf,2))) - printk("bt832: i2c i/o error MBAR: rc == %d (should be 2)\n",rc); -#endif + if (2 != (rc = i2c_master_send(i2c_client_s,buf,2))) + v4l_info(i2c_client_s,"i2c i/o error MBAR: rc == %d (should be 2)\n",rc); - printk("Bt832: Camera Present: %s\n", + v4l_info(i2c_client_s,"Camera Present: %s\n", (buf[1+BT832_CAM_STATUS] & BT832_56_CAMERA_PRESENT) ? "yes":"no"); - bt832_hexdump(i2c_client_s,buf); + bt832_hexdump(i2c_client_s,buf); kfree(buf); return 1; } -static int bt832_attach(struct i2c_adapter *adap, int addr, - unsigned short flags, int kind) +static int bt832_attach(struct i2c_adapter *adap, int addr, int kind) { struct bt832 *t; - printk("bt832_attach\n"); + client_template.adapter = adap; + client_template.addr = addr; - client_template.adapter = adap; - client_template.addr = addr; + if (NULL == (t = kzalloc(sizeof(*t), GFP_KERNEL))) + return -ENOMEM; + t->client = client_template; + i2c_set_clientdata(&t->client, t); + i2c_attach_client(&t->client); - printk("bt832: chip found @ 0x%x\n", addr<<1); + v4l_info(&t->client,"chip found @ 0x%x\n", addr<<1); - if (NULL == (t = kmalloc(sizeof(*t), GFP_KERNEL))) - return -ENOMEM; - memset(t,0,sizeof(*t)); - t->client = client_template; - t->client.data = t; - i2c_attach_client(&t->client); if(! bt832_init(&t->client)) { bt832_detach(&t->client); return -1; } - + return 0; } @@ -204,9 +193,9 @@ static int bt832_probe(struct i2c_adapter *adap) static int bt832_detach(struct i2c_client *client) { - struct bt832 *t = (struct bt832*)client->data; + struct bt832 *t = i2c_get_clientdata(client); - printk("bt832: detach.\n"); + v4l_info(&t->client,"dettach\n"); i2c_detach_client(client); kfree(t); return 0; @@ -215,11 +204,12 @@ static int bt832_detach(struct i2c_client *client) static int bt832_command(struct i2c_client *client, unsigned int cmd, void *arg) { - struct bt832 *t = (struct bt832*)client->data; + struct bt832 *t = i2c_get_clientdata(client); - printk("bt832: command %x\n",cmd); + if (debug>1) + v4l_i2c_print_ioctl(&t->client,cmd); - switch (cmd) { + switch (cmd) { case BT832_HEXDUMP: { unsigned char *buf; buf=kmalloc(65,GFP_KERNEL); @@ -228,7 +218,7 @@ bt832_command(struct i2c_client *client, unsigned int cmd, void *arg) } break; case BT832_REATTACH: - printk("bt832: re-attach\n"); + v4l_info(&t->client,"re-attach\n"); i2c_del_driver(&driver); i2c_add_driver(&driver); break; @@ -239,29 +229,27 @@ bt832_command(struct i2c_client *client, unsigned int cmd, void *arg) /* ----------------------------------------------------------------------- */ static struct i2c_driver driver = { - .owner = THIS_MODULE, - .name = "i2c bt832 driver", - .id = -1, /* FIXME */ - .flags = I2C_DF_NOTIFY, - .attach_adapter = bt832_probe, - .detach_client = bt832_detach, - .command = bt832_command, + .driver = { + .name = "bt832", + }, + .id = 0, /* FIXME */ + .attach_adapter = bt832_probe, + .detach_client = bt832_detach, + .command = bt832_command, }; static struct i2c_client client_template = { - .name = "bt832", - .flags = I2C_CLIENT_ALLOW_USE, - .driver = &driver, + .name = "bt832", + .driver = &driver, }; -int bt832_init_module(void) +static int __init bt832_init_module(void) { - i2c_add_driver(&driver); - return 0; + return i2c_add_driver(&driver); } -static void bt832_cleanup_module(void) +static void __exit bt832_cleanup_module(void) { i2c_del_driver(&driver); } @@ -269,3 +257,10 @@ static void bt832_cleanup_module(void) module_init(bt832_init_module); module_exit(bt832_cleanup_module); +/* + * Overrides for Emacs so that we follow Linus's tabbing style. + * --------------------------------------------------------------------------- + * Local variables: + * c-basic-offset: 8 + * End: + */ diff --git a/drivers/media/video/bt832.h b/drivers/media/video/bt832.h index 7a98c06e0..1ce8fa71f 100644 --- a/drivers/media/video/bt832.h +++ b/drivers/media/video/bt832.h @@ -1,6 +1,6 @@ /* Bt832 CMOS Camera Video Processor (VP) - The Bt832 CMOS Camera Video Processor chip connects a Quartsight CMOS + The Bt832 CMOS Camera Video Processor chip connects a Quartsight CMOS color digital camera directly to video capture devices via an 8-bit, 4:2:2 YUV or YCrCb video interface. @@ -85,7 +85,7 @@ #define BT832_DEVICE_ID 63 # define BT832_DEVICE_ID__31 0x31 // Bt832 has ID 0x31 -/* STMicroelectronivcs VV5404 camera module +/* STMicroelectronivcs VV5404 camera module i2c: 0x20: sensor address i2c: 0xa0: eeprom for ccd defect map */ @@ -233,8 +233,8 @@ SetInterlaceMode( spec.interlace ); /* from web: Video Sampling Digital video is a sampled form of analog video. The most common sampling schemes in use today are: - Pixel Clock Horiz Horiz Vert - Rate Total Active + Pixel Clock Horiz Horiz Vert + Rate Total Active NTSC square pixel 12.27 MHz 780 640 525 NTSC CCIR-601 13.5 MHz 858 720 525 NTSC 4FSc 14.32 MHz 910 768 525 @@ -256,26 +256,26 @@ For the CCIR-601 standards, the sampling is based on a static orthogonal samplin //=========================================================================== // Timing generator SRAM table values for CCIR601 720x480 NTSC //=========================================================================== -// For NTSC CCIR656 +// For NTSC CCIR656 BYTE BtCard::SRAMTable_NTSC[] = { // SRAM Timing Table for NTSC - 0x0c, 0xc0, 0x00, - 0x00, 0x90, 0xc2, - 0x03, 0x10, 0x03, - 0x06, 0x10, 0x34, - 0x12, 0x12, 0x65, - 0x02, 0x13, 0x24, - 0x19, 0x00, 0x24, - 0x39, 0x00, 0x96, - 0x59, 0x08, 0x93, + 0x0c, 0xc0, 0x00, + 0x00, 0x90, 0xc2, + 0x03, 0x10, 0x03, + 0x06, 0x10, 0x34, + 0x12, 0x12, 0x65, + 0x02, 0x13, 0x24, + 0x19, 0x00, 0x24, + 0x39, 0x00, 0x96, + 0x59, 0x08, 0x93, 0x83, 0x08, 0x97, - 0x03, 0x50, 0x30, - 0xc0, 0x40, 0x30, - 0x86, 0x01, 0x01, - 0xa6, 0x0d, 0x62, - 0x03, 0x11, 0x61, - 0x05, 0x37, 0x30, + 0x03, 0x50, 0x30, + 0xc0, 0x40, 0x30, + 0x86, 0x01, 0x01, + 0xa6, 0x0d, 0x62, + 0x03, 0x11, 0x61, + 0x05, 0x37, 0x30, 0xac, 0x21, 0x50 }; diff --git a/drivers/media/video/bt856.c b/drivers/media/video/bt856.c index af3b61d4f..909b59353 100644 --- a/drivers/media/video/bt856.c +++ b/drivers/media/video/bt856.c @@ -1,4 +1,4 @@ -/* +/* * bt856 - BT856A Digital Video Encoder (Rockwell Part) * * Copyright (C) 1999 Mike Bernson @@ -53,6 +53,7 @@ MODULE_AUTHOR("Mike Bernson & Dave Perks"); MODULE_LICENSE("GPL"); #include +#include #define I2C_NAME(s) (s)->name @@ -70,14 +71,17 @@ MODULE_PARM_DESC(debug, "Debug level (0-1)"); /* ----------------------------------------------------------------------- */ -#define REG_OFFSET 0xDA -#define BT856_NR_REG 6 +#define REG_OFFSET 0xCE struct bt856 { - unsigned char reg[BT856_NR_REG]; + unsigned char reg[32]; int norm; int enable; + int bright; + int contrast; + int hue; + int sat; }; #define I2C_BT856 0x88 @@ -116,8 +120,8 @@ bt856_dump (struct i2c_client *client) struct bt856 *encoder = i2c_get_clientdata(client); printk(KERN_INFO "%s: register dump:", I2C_NAME(client)); - for (i = 0; i < BT856_NR_REG; i += 2) - printk(" %02x", encoder->reg[i]); + for (i = 0xd6; i <= 0xde; i += 2) + printk(" %02x", encoder->reg[i - REG_OFFSET]); printk("\n"); } @@ -285,7 +289,7 @@ bt856_command (struct i2c_client *client, static unsigned short normal_i2c[] = { I2C_BT856 >> 1, I2C_CLIENT_END }; static unsigned short ignore = I2C_CLIENT_END; - + static struct i2c_client_address_data addr_data = { .normal_i2c = normal_i2c, .probe = &ignore, diff --git a/drivers/media/video/bttv-cards.c b/drivers/media/video/bttv-cards.c index 633412270..9749d6ed6 100644 --- a/drivers/media/video/bttv-cards.c +++ b/drivers/media/video/bttv-cards.c @@ -1,5 +1,4 @@ /* - $Id: bttv-cards.c,v 1.47 2005/02/22 14:06:32 kraxel Exp $ bttv-cards.c @@ -7,7 +6,7 @@ like the big tvcards array for the most part Copyright (C) 1996,97,98 Ralph Metzler (rjkm@thp.uni-koeln.de) - & Marcus Metzler (mocm@thp.uni-koeln.de) + & Marcus Metzler (mocm@thp.uni-koeln.de) (c) 1999-2001 Gerd Knorr This program is free software; you can redistribute it and/or modify @@ -39,9 +38,7 @@ #include #include "bttvp.h" -#if 0 /* not working yet */ -#include "bt832.h" -#endif +#include /* fwd decl */ static void boot_msp34xx(struct bttv *btv, int pin); @@ -51,6 +48,7 @@ static void avermedia_eeprom(struct bttv *btv); static void osprey_eeprom(struct bttv *btv); static void modtec_eeprom(struct bttv *btv); static void init_PXC200(struct bttv *btv); +static void init_RTV24(struct bttv *btv); static void winview_audio(struct bttv *btv, struct video_audio *v, int set); static void lt9415_audio(struct bttv *btv, struct video_audio *v, int set); @@ -94,10 +92,10 @@ static void identify_by_eeprom(struct bttv *btv, static int __devinit pvr_boot(struct bttv *btv); /* config variables */ -static unsigned int triton1=0; -static unsigned int vsfx=0; +static unsigned int triton1; +static unsigned int vsfx; static unsigned int latency = UNSET; -static unsigned int no_overlay=-1; +int no_overlay=-1; static unsigned int card[BTTV_MAX] = { [ 0 ... (BTTV_MAX-1) ] = UNSET }; static unsigned int pll[BTTV_MAX] = { [ 0 ... (BTTV_MAX-1) ] = UNSET }; @@ -108,7 +106,7 @@ static struct bttv *master[BTTV_MAX] = { [ 0 ... (BTTV_MAX-1) ] = NULL }; #ifdef MODULE static unsigned int autoload = 1; #else -static unsigned int autoload = 0; +static unsigned int autoload; #endif static unsigned int gpiomask = UNSET; static unsigned int audioall = UNSET; @@ -148,159 +146,166 @@ static struct CARD { int cardnr; char *name; } cards[] __devinitdata = { - { 0x13eb0070, BTTV_HAUPPAUGE878, "Hauppauge WinTV" }, - { 0x39000070, BTTV_HAUPPAUGE878, "Hauppauge WinTV-D" }, - { 0x45000070, BTTV_HAUPPAUGEPVR, "Hauppauge WinTV/PVR" }, - { 0xff000070, BTTV_OSPREY1x0, "Osprey-100" }, - { 0xff010070, BTTV_OSPREY2x0_SVID,"Osprey-200" }, - { 0xff020070, BTTV_OSPREY500, "Osprey-500" }, - { 0xff030070, BTTV_OSPREY2000, "Osprey-2000" }, - { 0xff040070, BTTV_OSPREY540, "Osprey-540" }, - - { 0x00011002, BTTV_ATI_TVWONDER, "ATI TV Wonder" }, - { 0x00031002, BTTV_ATI_TVWONDERVE,"ATI TV Wonder/VE" }, - - { 0x6606107d, BTTV_WINFAST2000, "Leadtek WinFast TV 2000" }, - { 0x6607107d, BTTV_WINFASTVC100, "Leadtek WinFast VC 100" }, - { 0x6609107d, BTTV_WINFAST2000, "Leadtek TV 2000 XP" }, - { 0x263610b4, BTTV_STB2, "STB TV PCI FM, Gateway P/N 6000704" }, - { 0x264510b4, BTTV_STB2, "STB TV PCI FM, Gateway P/N 6000704" }, - { 0x402010fc, BTTV_GVBCTV3PCI, "I-O Data Co. GV-BCTV3/PCI" }, - { 0x405010fc, BTTV_GVBCTV4PCI, "I-O Data Co. GV-BCTV4/PCI" }, - { 0x407010fc, BTTV_GVBCTV5PCI, "I-O Data Co. GV-BCTV5/PCI" }, - { 0xd01810fc, BTTV_GVBCTV5PCI, "I-O Data Co. GV-BCTV5/PCI" }, - - { 0x001211bd, BTTV_PINNACLE, "Pinnacle PCTV" }, - // some cards ship with byteswapped IDs ... - { 0x1200bd11, BTTV_PINNACLE, "Pinnacle PCTV [bswap]" }, - { 0xff00bd11, BTTV_PINNACLE, "Pinnacle PCTV [bswap]" }, - // this seems to happen as well ... - { 0xff1211bd, BTTV_PINNACLE, "Pinnacle PCTV" }, - - { 0x3000121a, BTTV_VOODOOTV_FM, "3Dfx VoodooTV FM/ VoodooTV 200" }, - { 0x263710b4, BTTV_VOODOOTV_FM, "3Dfx VoodooTV FM/ VoodooTV 200" }, - { 0x3060121a, BTTV_STB2, "3Dfx VoodooTV 100/ STB OEM" }, - - { 0x3000144f, BTTV_MAGICTVIEW063, "(Askey Magic/others) TView99 CPH06x" }, - { 0xa005144f, BTTV_MAGICTVIEW063, "CPH06X TView99-Card" }, - { 0x3002144f, BTTV_MAGICTVIEW061, "(Askey Magic/others) TView99 CPH05x" }, - { 0x3005144f, BTTV_MAGICTVIEW061, "(Askey Magic/others) TView99 CPH061/06L (T1/LC)" }, - { 0x5000144f, BTTV_MAGICTVIEW061, "Askey CPH050" }, - { 0x300014ff, BTTV_MAGICTVIEW061, "TView 99 (CPH061)" }, - { 0x300214ff, BTTV_PHOEBE_TVMAS, "Phoebe TV Master (CPH060)" }, - - { 0x00011461, BTTV_AVPHONE98, "AVerMedia TVPhone98" }, - { 0x00021461, BTTV_AVERMEDIA98, "AVermedia TVCapture 98" }, - { 0x00031461, BTTV_AVPHONE98, "AVerMedia TVPhone98" }, - { 0x00041461, BTTV_AVERMEDIA98, "AVerMedia TVCapture 98" }, - { 0x03001461, BTTV_AVERMEDIA98, "VDOMATE TV TUNER CARD" }, - - { 0x1117153b, BTTV_TERRATVALUE, "Terratec TValue (Philips PAL B/G)" }, - { 0x1118153b, BTTV_TERRATVALUE, "Terratec TValue (Temic PAL B/G)" }, - { 0x1119153b, BTTV_TERRATVALUE, "Terratec TValue (Philips PAL I)" }, - { 0x111a153b, BTTV_TERRATVALUE, "Terratec TValue (Temic PAL I)" }, - - { 0x1123153b, BTTV_TERRATVRADIO, "Terratec TV Radio+" }, - { 0x1127153b, BTTV_TERRATV, "Terratec TV+ (V1.05)" }, - // clashes with FlyVideo - //{ 0x18521852, BTTV_TERRATV, "Terratec TV+ (V1.10)" }, - { 0x1134153b, BTTV_TERRATVALUE, "Terratec TValue (LR102)" }, - { 0x1135153b, BTTV_TERRATVALUER, "Terratec TValue Radio" }, // LR102 - { 0x5018153b, BTTV_TERRATVALUE, "Terratec TValue" }, // ?? - { 0xff3b153b, BTTV_TERRATVALUER, "Terratec TValue Radio" }, // ?? - - { 0x400015b0, BTTV_ZOLTRIX_GENIE, "Zoltrix Genie TV" }, - { 0x400a15b0, BTTV_ZOLTRIX_GENIE, "Zoltrix Genie TV" }, - { 0x400d15b0, BTTV_ZOLTRIX_GENIE, "Zoltrix Genie TV / Radio" }, - { 0x401015b0, BTTV_ZOLTRIX_GENIE, "Zoltrix Genie TV / Radio" }, - { 0x401615b0, BTTV_ZOLTRIX_GENIE, "Zoltrix Genie TV / Radio" }, - - { 0x1430aa00, BTTV_PV143, "Provideo PV143A" }, - { 0x1431aa00, BTTV_PV143, "Provideo PV143B" }, - { 0x1432aa00, BTTV_PV143, "Provideo PV143C" }, - { 0x1433aa00, BTTV_PV143, "Provideo PV143D" }, - { 0x1433aa03, BTTV_PV143, "Security Eyes" }, - - { 0x1460aa00, BTTV_PV150, "Provideo PV150A-1" }, - { 0x1461aa01, BTTV_PV150, "Provideo PV150A-2" }, - { 0x1462aa02, BTTV_PV150, "Provideo PV150A-3" }, - { 0x1463aa03, BTTV_PV150, "Provideo PV150A-4" }, - - { 0x1464aa04, BTTV_PV150, "Provideo PV150B-1" }, - { 0x1465aa05, BTTV_PV150, "Provideo PV150B-2" }, - { 0x1466aa06, BTTV_PV150, "Provideo PV150B-3" }, - { 0x1467aa07, BTTV_PV150, "Provideo PV150B-4" }, - - { 0xa132ff00, BTTV_IVC100, "IVC-100" }, - { 0xa1550000, BTTV_IVC200, "IVC-200" }, - { 0xa1550001, BTTV_IVC200, "IVC-200" }, - { 0xa1550002, BTTV_IVC200, "IVC-200" }, - { 0xa1550003, BTTV_IVC200, "IVC-200" }, - { 0xa1550100, BTTV_IVC200, "IVC-200G" }, - { 0xa1550101, BTTV_IVC200, "IVC-200G" }, - { 0xa1550102, BTTV_IVC200, "IVC-200G" }, - { 0xa1550103, BTTV_IVC200, "IVC-200G" }, - { 0xa182ff00, BTTV_IVC120, "IVC-120G" }, - { 0xa182ff01, BTTV_IVC120, "IVC-120G" }, - { 0xa182ff02, BTTV_IVC120, "IVC-120G" }, - { 0xa182ff03, BTTV_IVC120, "IVC-120G" }, - { 0xa182ff04, BTTV_IVC120, "IVC-120G" }, - { 0xa182ff05, BTTV_IVC120, "IVC-120G" }, - { 0xa182ff06, BTTV_IVC120, "IVC-120G" }, - { 0xa182ff07, BTTV_IVC120, "IVC-120G" }, - { 0xa182ff08, BTTV_IVC120, "IVC-120G" }, - { 0xa182ff09, BTTV_IVC120, "IVC-120G" }, - { 0xa182ff0a, BTTV_IVC120, "IVC-120G" }, - { 0xa182ff0b, BTTV_IVC120, "IVC-120G" }, - { 0xa182ff0c, BTTV_IVC120, "IVC-120G" }, - { 0xa182ff0d, BTTV_IVC120, "IVC-120G" }, - { 0xa182ff0e, BTTV_IVC120, "IVC-120G" }, - { 0xa182ff0f, BTTV_IVC120, "IVC-120G" }, - - { 0x41424344, BTTV_GRANDTEC, "GrandTec Multi Capture" }, - { 0x01020304, BTTV_XGUARD, "Grandtec Grand X-Guard" }, - - { 0x18501851, BTTV_CHRONOS_VS2, "FlyVideo 98 (LR50)/ Chronos Video Shuttle II" }, - { 0xa0501851, BTTV_CHRONOS_VS2, "FlyVideo 98 (LR50)/ Chronos Video Shuttle II" }, - { 0x18511851, BTTV_FLYVIDEO98EZ, "FlyVideo 98EZ (LR51)/ CyberMail AV" }, - { 0x18521852, BTTV_TYPHOON_TVIEW, "FlyVideo 98FM (LR50)/ Typhoon TView TV/FM Tuner" }, - { 0x41a0a051, BTTV_FLYVIDEO_98FM, "Lifeview FlyVideo 98 LR50 Rev Q" }, - { 0x18501f7f, BTTV_FLYVIDEO_98, "Lifeview Flyvideo 98" }, - - { 0x010115cb, BTTV_GMV1, "AG GMV1" }, - { 0x010114c7, BTTV_MODTEC_205, "Modular Technology MM201/MM202/MM205/MM210/MM215 PCTV" }, - - { 0x10b42636, BTTV_HAUPPAUGE878, "STB ???" }, - { 0x217d6606, BTTV_WINFAST2000, "Leadtek WinFast TV 2000" }, - { 0xfff6f6ff, BTTV_WINFAST2000, "Leadtek WinFast TV 2000" }, - { 0x03116000, BTTV_SENSORAY311, "Sensoray 311" }, - { 0x00790e11, BTTV_WINDVR, "Canopus WinDVR PCI" }, - { 0xa0fca1a0, BTTV_ZOLTRIX, "Face to Face Tvmax" }, - { 0x20007063, BTTV_PC_HDTV, "pcHDTV HD-2000 TV"}, - { 0x82b2aa6a, BTTV_SIMUS_GVC1100, "SIMUS GVC1100" }, - { 0x146caa0c, BTTV_PV951, "ituner spectra8" }, - { 0x200a1295, BTTV_PXC200, "ImageNation PXC200A" }, - - { 0x40111554, BTTV_PV_BT878P_9B, "Prolink Pixelview PV-BT" }, - { 0x17de0a01, BTTV_KWORLD, "Mecer TV/FM/Video Tuner" }, - - { 0x01051805, BTTV_PICOLO_TETRA_CHIP, "Picolo Tetra Chip #1" }, - { 0x01061805, BTTV_PICOLO_TETRA_CHIP, "Picolo Tetra Chip #2" }, - { 0x01071805, BTTV_PICOLO_TETRA_CHIP, "Picolo Tetra Chip #3" }, - { 0x01081805, BTTV_PICOLO_TETRA_CHIP, "Picolo Tetra Chip #4" }, - - // likely broken, vendor id doesn't match the other magic views ... - //{ 0xa0fca04f, BTTV_MAGICTVIEW063, "Guillemot Maxi TV Video 3" }, - - // DVB cards (using pci function .1 for mpeg data xfer) - { 0x01010071, BTTV_NEBULA_DIGITV, "Nebula Electronics DigiTV" }, - { 0x07611461, BTTV_AVDVBT_761, "AverMedia AverTV DVB-T 761" }, - { 0x001c11bd, BTTV_PINNACLESAT, "Pinnacle PCTV Sat" }, - { 0x002611bd, BTTV_TWINHAN_DST, "Pinnacle PCTV SAT CI" }, - { 0x00011822, BTTV_TWINHAN_DST, "Twinhan VisionPlus DVB" }, - { 0xfc00270f, BTTV_TWINHAN_DST, "ChainTech digitop DST-1000 DVB-S" }, - { 0x07711461, BTTV_AVDVBT_771, "AVermedia AverTV DVB-T 771" }, - { 0xdb1018ac, BTTV_DVICO_DVBT_LITE, "DVICO FusionHDTV DVB-T Lite" }, + { 0x13eb0070, BTTV_BOARD_HAUPPAUGE878, "Hauppauge WinTV" }, + { 0x39000070, BTTV_BOARD_HAUPPAUGE878, "Hauppauge WinTV-D" }, + { 0x45000070, BTTV_BOARD_HAUPPAUGEPVR, "Hauppauge WinTV/PVR" }, + { 0xff000070, BTTV_BOARD_OSPREY1x0, "Osprey-100" }, + { 0xff010070, BTTV_BOARD_OSPREY2x0_SVID,"Osprey-200" }, + { 0xff020070, BTTV_BOARD_OSPREY500, "Osprey-500" }, + { 0xff030070, BTTV_BOARD_OSPREY2000, "Osprey-2000" }, + { 0xff040070, BTTV_BOARD_OSPREY540, "Osprey-540" }, + { 0xff070070, BTTV_BOARD_OSPREY440, "Osprey-440" }, + + { 0x00011002, BTTV_BOARD_ATI_TVWONDER, "ATI TV Wonder" }, + { 0x00031002, BTTV_BOARD_ATI_TVWONDERVE,"ATI TV Wonder/VE" }, + + { 0x6606107d, BTTV_BOARD_WINFAST2000, "Leadtek WinFast TV 2000" }, + { 0x6607107d, BTTV_BOARD_WINFASTVC100, "Leadtek WinFast VC 100" }, + { 0x6609107d, BTTV_BOARD_WINFAST2000, "Leadtek TV 2000 XP" }, + { 0x263610b4, BTTV_BOARD_STB2, "STB TV PCI FM, Gateway P/N 6000704" }, + { 0x264510b4, BTTV_BOARD_STB2, "STB TV PCI FM, Gateway P/N 6000704" }, + { 0x402010fc, BTTV_BOARD_GVBCTV3PCI, "I-O Data Co. GV-BCTV3/PCI" }, + { 0x405010fc, BTTV_BOARD_GVBCTV4PCI, "I-O Data Co. GV-BCTV4/PCI" }, + { 0x407010fc, BTTV_BOARD_GVBCTV5PCI, "I-O Data Co. GV-BCTV5/PCI" }, + { 0xd01810fc, BTTV_BOARD_GVBCTV5PCI, "I-O Data Co. GV-BCTV5/PCI" }, + + { 0x001211bd, BTTV_BOARD_PINNACLE, "Pinnacle PCTV" }, + /* some cards ship with byteswapped IDs ... */ + { 0x1200bd11, BTTV_BOARD_PINNACLE, "Pinnacle PCTV [bswap]" }, + { 0xff00bd11, BTTV_BOARD_PINNACLE, "Pinnacle PCTV [bswap]" }, + /* this seems to happen as well ... */ + { 0xff1211bd, BTTV_BOARD_PINNACLE, "Pinnacle PCTV" }, + + { 0x3000121a, BTTV_BOARD_VOODOOTV_FM, "3Dfx VoodooTV FM/ VoodooTV 200" }, + { 0x263710b4, BTTV_BOARD_VOODOOTV_FM, "3Dfx VoodooTV FM/ VoodooTV 200" }, + { 0x3060121a, BTTV_BOARD_STB2, "3Dfx VoodooTV 100/ STB OEM" }, + + { 0x3000144f, BTTV_BOARD_MAGICTVIEW063, "(Askey Magic/others) TView99 CPH06x" }, + { 0xa005144f, BTTV_BOARD_MAGICTVIEW063, "CPH06X TView99-Card" }, + { 0x3002144f, BTTV_BOARD_MAGICTVIEW061, "(Askey Magic/others) TView99 CPH05x" }, + { 0x3005144f, BTTV_BOARD_MAGICTVIEW061, "(Askey Magic/others) TView99 CPH061/06L (T1/LC)" }, + { 0x5000144f, BTTV_BOARD_MAGICTVIEW061, "Askey CPH050" }, + { 0x300014ff, BTTV_BOARD_MAGICTVIEW061, "TView 99 (CPH061)" }, + { 0x300214ff, BTTV_BOARD_PHOEBE_TVMAS, "Phoebe TV Master (CPH060)" }, + + { 0x00011461, BTTV_BOARD_AVPHONE98, "AVerMedia TVPhone98" }, + { 0x00021461, BTTV_BOARD_AVERMEDIA98, "AVermedia TVCapture 98" }, + { 0x00031461, BTTV_BOARD_AVPHONE98, "AVerMedia TVPhone98" }, + { 0x00041461, BTTV_BOARD_AVERMEDIA98, "AVerMedia TVCapture 98" }, + { 0x03001461, BTTV_BOARD_AVERMEDIA98, "VDOMATE TV TUNER CARD" }, + + { 0x1117153b, BTTV_BOARD_TERRATVALUE, "Terratec TValue (Philips PAL B/G)" }, + { 0x1118153b, BTTV_BOARD_TERRATVALUE, "Terratec TValue (Temic PAL B/G)" }, + { 0x1119153b, BTTV_BOARD_TERRATVALUE, "Terratec TValue (Philips PAL I)" }, + { 0x111a153b, BTTV_BOARD_TERRATVALUE, "Terratec TValue (Temic PAL I)" }, + + { 0x1123153b, BTTV_BOARD_TERRATVRADIO, "Terratec TV Radio+" }, + { 0x1127153b, BTTV_BOARD_TERRATV, "Terratec TV+ (V1.05)" }, + /* clashes with FlyVideo + *{ 0x18521852, BTTV_BOARD_TERRATV, "Terratec TV+ (V1.10)" }, */ + { 0x1134153b, BTTV_BOARD_TERRATVALUE, "Terratec TValue (LR102)" }, + { 0x1135153b, BTTV_BOARD_TERRATVALUER, "Terratec TValue Radio" }, /* LR102 */ + { 0x5018153b, BTTV_BOARD_TERRATVALUE, "Terratec TValue" }, /* ?? */ + { 0xff3b153b, BTTV_BOARD_TERRATVALUER, "Terratec TValue Radio" }, /* ?? */ + + { 0x400015b0, BTTV_BOARD_ZOLTRIX_GENIE, "Zoltrix Genie TV" }, + { 0x400a15b0, BTTV_BOARD_ZOLTRIX_GENIE, "Zoltrix Genie TV" }, + { 0x400d15b0, BTTV_BOARD_ZOLTRIX_GENIE, "Zoltrix Genie TV / Radio" }, + { 0x401015b0, BTTV_BOARD_ZOLTRIX_GENIE, "Zoltrix Genie TV / Radio" }, + { 0x401615b0, BTTV_BOARD_ZOLTRIX_GENIE, "Zoltrix Genie TV / Radio" }, + + { 0x1430aa00, BTTV_BOARD_PV143, "Provideo PV143A" }, + { 0x1431aa00, BTTV_BOARD_PV143, "Provideo PV143B" }, + { 0x1432aa00, BTTV_BOARD_PV143, "Provideo PV143C" }, + { 0x1433aa00, BTTV_BOARD_PV143, "Provideo PV143D" }, + { 0x1433aa03, BTTV_BOARD_PV143, "Security Eyes" }, + + { 0x1460aa00, BTTV_BOARD_PV150, "Provideo PV150A-1" }, + { 0x1461aa01, BTTV_BOARD_PV150, "Provideo PV150A-2" }, + { 0x1462aa02, BTTV_BOARD_PV150, "Provideo PV150A-3" }, + { 0x1463aa03, BTTV_BOARD_PV150, "Provideo PV150A-4" }, + + { 0x1464aa04, BTTV_BOARD_PV150, "Provideo PV150B-1" }, + { 0x1465aa05, BTTV_BOARD_PV150, "Provideo PV150B-2" }, + { 0x1466aa06, BTTV_BOARD_PV150, "Provideo PV150B-3" }, + { 0x1467aa07, BTTV_BOARD_PV150, "Provideo PV150B-4" }, + + { 0xa132ff00, BTTV_BOARD_IVC100, "IVC-100" }, + { 0xa1550000, BTTV_BOARD_IVC200, "IVC-200" }, + { 0xa1550001, BTTV_BOARD_IVC200, "IVC-200" }, + { 0xa1550002, BTTV_BOARD_IVC200, "IVC-200" }, + { 0xa1550003, BTTV_BOARD_IVC200, "IVC-200" }, + { 0xa1550100, BTTV_BOARD_IVC200, "IVC-200G" }, + { 0xa1550101, BTTV_BOARD_IVC200, "IVC-200G" }, + { 0xa1550102, BTTV_BOARD_IVC200, "IVC-200G" }, + { 0xa1550103, BTTV_BOARD_IVC200, "IVC-200G" }, + { 0xa182ff00, BTTV_BOARD_IVC120, "IVC-120G" }, + { 0xa182ff01, BTTV_BOARD_IVC120, "IVC-120G" }, + { 0xa182ff02, BTTV_BOARD_IVC120, "IVC-120G" }, + { 0xa182ff03, BTTV_BOARD_IVC120, "IVC-120G" }, + { 0xa182ff04, BTTV_BOARD_IVC120, "IVC-120G" }, + { 0xa182ff05, BTTV_BOARD_IVC120, "IVC-120G" }, + { 0xa182ff06, BTTV_BOARD_IVC120, "IVC-120G" }, + { 0xa182ff07, BTTV_BOARD_IVC120, "IVC-120G" }, + { 0xa182ff08, BTTV_BOARD_IVC120, "IVC-120G" }, + { 0xa182ff09, BTTV_BOARD_IVC120, "IVC-120G" }, + { 0xa182ff0a, BTTV_BOARD_IVC120, "IVC-120G" }, + { 0xa182ff0b, BTTV_BOARD_IVC120, "IVC-120G" }, + { 0xa182ff0c, BTTV_BOARD_IVC120, "IVC-120G" }, + { 0xa182ff0d, BTTV_BOARD_IVC120, "IVC-120G" }, + { 0xa182ff0e, BTTV_BOARD_IVC120, "IVC-120G" }, + { 0xa182ff0f, BTTV_BOARD_IVC120, "IVC-120G" }, + + { 0x41424344, BTTV_BOARD_GRANDTEC, "GrandTec Multi Capture" }, + { 0x01020304, BTTV_BOARD_XGUARD, "Grandtec Grand X-Guard" }, + + { 0x18501851, BTTV_BOARD_CHRONOS_VS2, "FlyVideo 98 (LR50)/ Chronos Video Shuttle II" }, + { 0xa0501851, BTTV_BOARD_CHRONOS_VS2, "FlyVideo 98 (LR50)/ Chronos Video Shuttle II" }, + { 0x18511851, BTTV_BOARD_FLYVIDEO98EZ, "FlyVideo 98EZ (LR51)/ CyberMail AV" }, + { 0x18521852, BTTV_BOARD_TYPHOON_TVIEW, "FlyVideo 98FM (LR50)/ Typhoon TView TV/FM Tuner" }, + { 0x41a0a051, BTTV_BOARD_FLYVIDEO_98FM, "Lifeview FlyVideo 98 LR50 Rev Q" }, + { 0x18501f7f, BTTV_BOARD_FLYVIDEO_98, "Lifeview Flyvideo 98" }, + + { 0x010115cb, BTTV_BOARD_GMV1, "AG GMV1" }, + { 0x010114c7, BTTV_BOARD_MODTEC_205, "Modular Technology MM201/MM202/MM205/MM210/MM215 PCTV" }, + + { 0x10b42636, BTTV_BOARD_HAUPPAUGE878, "STB ???" }, + { 0x217d6606, BTTV_BOARD_WINFAST2000, "Leadtek WinFast TV 2000" }, + { 0xfff6f6ff, BTTV_BOARD_WINFAST2000, "Leadtek WinFast TV 2000" }, + { 0x03116000, BTTV_BOARD_SENSORAY311, "Sensoray 311" }, + { 0x00790e11, BTTV_BOARD_WINDVR, "Canopus WinDVR PCI" }, + { 0xa0fca1a0, BTTV_BOARD_ZOLTRIX, "Face to Face Tvmax" }, + { 0x20007063, BTTV_BOARD_PC_HDTV, "pcHDTV HD-2000 TV"}, + { 0x82b2aa6a, BTTV_BOARD_SIMUS_GVC1100, "SIMUS GVC1100" }, + { 0x146caa0c, BTTV_BOARD_PV951, "ituner spectra8" }, + { 0x200a1295, BTTV_BOARD_PXC200, "ImageNation PXC200A" }, + + { 0x40111554, BTTV_BOARD_PV_BT878P_9B, "Prolink Pixelview PV-BT" }, + { 0x17de0a01, BTTV_BOARD_KWORLD, "Mecer TV/FM/Video Tuner" }, + + { 0x01051805, BTTV_BOARD_PICOLO_TETRA_CHIP, "Picolo Tetra Chip #1" }, + { 0x01061805, BTTV_BOARD_PICOLO_TETRA_CHIP, "Picolo Tetra Chip #2" }, + { 0x01071805, BTTV_BOARD_PICOLO_TETRA_CHIP, "Picolo Tetra Chip #3" }, + { 0x01081805, BTTV_BOARD_PICOLO_TETRA_CHIP, "Picolo Tetra Chip #4" }, + + { 0x15409511, BTTV_BOARD_ACORP_Y878F, "Acorp Y878F" }, + + /* likely broken, vendor id doesn't match the other magic views ... + * { 0xa0fca04f, BTTV_BOARD_MAGICTVIEW063, "Guillemot Maxi TV Video 3" }, */ + + /* Duplicate PCI ID, reconfigure for this board during the eeprom read. + * { 0x13eb0070, BTTV_BOARD_HAUPPAUGE_IMPACTVCB, "Hauppauge ImpactVCB" }, */ + + /* DVB cards (using pci function .1 for mpeg data xfer) */ + { 0x01010071, BTTV_BOARD_NEBULA_DIGITV, "Nebula Electronics DigiTV" }, + { 0x07611461, BTTV_BOARD_AVDVBT_761, "AverMedia AverTV DVB-T 761" }, + { 0x001c11bd, BTTV_BOARD_PINNACLESAT, "Pinnacle PCTV Sat" }, + { 0x002611bd, BTTV_BOARD_TWINHAN_DST, "Pinnacle PCTV SAT CI" }, + { 0x00011822, BTTV_BOARD_TWINHAN_DST, "Twinhan VisionPlus DVB" }, + { 0xfc00270f, BTTV_BOARD_TWINHAN_DST, "ChainTech digitop DST-1000 DVB-S" }, + { 0x07711461, BTTV_BOARD_AVDVBT_771, "AVermedia AverTV DVB-T 771" }, + { 0xdb1018ac, BTTV_BOARD_DVICO_DVBT_LITE, "DViCO FusionHDTV DVB-T Lite" }, + { 0xd50018ac, BTTV_BOARD_DVICO_FUSIONHDTV_5_LITE, "DViCO FusionHDTV 5 Lite" }, { 0, -1, NULL } }; @@ -309,1878 +314,2278 @@ static struct CARD { /* array with description for bt848 / bt878 tv/grabber cards */ struct tvcard bttv_tvcards[] = { -{ -/* ---- card 0x00 ---------------------------------- */ - .name = " *** UNKNOWN/GENERIC *** ", - .video_inputs = 4, - .audio_inputs = 1, - .tuner = 0, - .svhs = 2, - .muxsel = { 2, 3, 1, 0}, - .tuner_type = -1, -},{ - .name = "MIRO PCTV", - .video_inputs = 4, - .audio_inputs = 1, - .tuner = 0, - .svhs = 2, - .gpiomask = 15, - .muxsel = { 2, 3, 1, 1}, - .audiomux = { 2, 0, 0, 0, 10}, - .needs_tvaudio = 1, - .tuner_type = -1, -},{ - .name = "Hauppauge (bt848)", - .video_inputs = 4, - .audio_inputs = 1, - .tuner = 0, - .svhs = 2, - .gpiomask = 7, - .muxsel = { 2, 3, 1, 1}, - .audiomux = { 0, 1, 2, 3, 4}, - .needs_tvaudio = 1, - .tuner_type = -1, -},{ - .name = "STB, Gateway P/N 6000699 (bt848)", - .video_inputs = 3, - .audio_inputs = 1, - .tuner = 0, - .svhs = 2, - .gpiomask = 7, - .muxsel = { 2, 3, 1, 1}, - .audiomux = { 4, 0, 2, 3, 1}, - .no_msp34xx = 1, - .needs_tvaudio = 1, - .tuner_type = TUNER_PHILIPS_NTSC, - .pll = PLL_28, - .has_radio = 1, -},{ - -/* ---- card 0x04 ---------------------------------- */ - .name = "Intel Create and Share PCI/ Smart Video Recorder III", - .video_inputs = 4, - .audio_inputs = 0, - .tuner = -1, - .svhs = 2, - .gpiomask = 0, - .muxsel = { 2, 3, 1, 1}, - .audiomux = { 0 }, - .needs_tvaudio = 0, - .tuner_type = 4, -},{ - .name = "Diamond DTV2000", - .video_inputs = 4, - .audio_inputs = 1, - .tuner = 0, - .svhs = 2, - .gpiomask = 3, - .muxsel = { 2, 3, 1, 0}, - .audiomux = { 0, 1, 0, 1, 3}, - .needs_tvaudio = 1, - .tuner_type = -1, -},{ - .name = "AVerMedia TVPhone", - .video_inputs = 3, - .audio_inputs = 1, - .tuner = 0, - .svhs = 3, - .muxsel = { 2, 3, 1, 1}, - .gpiomask = 0x0f, - .audiomux = { 0x0c, 0x04, 0x08, 0x04, 0}, - /* 0x04 for some cards ?? */ - .needs_tvaudio = 1, - .tuner_type = -1, - .audio_hook = avermedia_tvphone_audio, - .has_remote = 1, -},{ - .name = "MATRIX-Vision MV-Delta", - .video_inputs = 5, - .audio_inputs = 1, - .tuner = -1, - .svhs = 3, - .gpiomask = 0, - .muxsel = { 2, 3, 1, 0, 0}, - .audiomux = {0 }, - .needs_tvaudio = 1, - .tuner_type = -1, -},{ - -/* ---- card 0x08 ---------------------------------- */ - .name = "Lifeview FlyVideo II (Bt848) LR26 / MAXI TV Video PCI2 LR26", - .video_inputs = 4, - .audio_inputs = 1, - .tuner = 0, - .svhs = 2, - .gpiomask = 0xc00, - .muxsel = { 2, 3, 1, 1}, - .audiomux = { 0, 0xc00, 0x800, 0x400, 0xc00, 0}, - .needs_tvaudio = 1, - .pll = PLL_28, - .tuner_type = -1, -},{ - .name = "IMS/IXmicro TurboTV", - .video_inputs = 3, - .audio_inputs = 1, - .tuner = 0, - .svhs = 2, - .gpiomask = 3, - .muxsel = { 2, 3, 1, 1}, - .audiomux = { 1, 1, 2, 3, 0}, - .needs_tvaudio = 0, - .pll = PLL_28, - .tuner_type = TUNER_TEMIC_PAL, -},{ - .name = "Hauppauge (bt878)", - .video_inputs = 4, - .audio_inputs = 1, - .tuner = 0, - .svhs = 2, - .gpiomask = 0x0f, /* old: 7 */ - .muxsel = { 2, 0, 1, 1}, - .audiomux = { 0, 1, 2, 3, 4}, - .needs_tvaudio = 1, - .pll = PLL_28, - .tuner_type = -1, -},{ - .name = "MIRO PCTV pro", - .video_inputs = 3, - .audio_inputs = 1, - .tuner = 0, - .svhs = 2, - .gpiomask = 0x3014f, - .muxsel = { 2, 3, 1, 1}, - .audiomux = { 0x20001,0x10001, 0, 0,10}, - .needs_tvaudio = 1, - .tuner_type = -1, -},{ - -/* ---- card 0x0c ---------------------------------- */ - .name = "ADS Technologies Channel Surfer TV (bt848)", - .video_inputs = 3, - .audio_inputs = 1, - .tuner = 0, - .svhs = 2, - .gpiomask = 15, - .muxsel = { 2, 3, 1, 1}, - .audiomux = { 13, 14, 11, 7, 0, 0}, - .needs_tvaudio = 1, - .tuner_type = -1, -},{ - .name = "AVerMedia TVCapture 98", - .video_inputs = 3, - .audio_inputs = 4, - .tuner = 0, - .svhs = 2, - .gpiomask = 15, - .muxsel = { 2, 3, 1, 1}, - .audiomux = { 13, 14, 11, 7, 0, 0}, - .needs_tvaudio = 1, - .msp34xx_alt = 1, - .pll = PLL_28, - .tuner_type = TUNER_PHILIPS_PAL, - .audio_hook = avermedia_tv_stereo_audio, -},{ - .name = "Aimslab Video Highway Xtreme (VHX)", - .video_inputs = 3, - .audio_inputs = 1, - .tuner = 0, - .svhs = 2, - .gpiomask = 7, - .muxsel = { 2, 3, 1, 1}, - .audiomux = { 0, 2, 1, 3, 4}, /* old: { 0, 1, 2, 3, 4} */ - .needs_tvaudio = 1, - .pll = PLL_28, - .tuner_type = -1, -},{ - .name = "Zoltrix TV-Max", - .video_inputs = 3, - .audio_inputs = 1, - .tuner = 0, - .svhs = 2, - .gpiomask = 15, - .muxsel = { 2, 3, 1, 1}, - .audiomux = {0 , 0, 1 , 0, 10}, - .needs_tvaudio = 1, - .tuner_type = -1, -},{ - -/* ---- card 0x10 ---------------------------------- */ - .name = "Prolink Pixelview PlayTV (bt878)", - .video_inputs = 3, - .audio_inputs = 1, - .tuner = 0, - .svhs = 2, - .gpiomask = 0x01fe00, - .muxsel = { 2, 3, 1, 1}, -#if 0 - // old - .audiomux = { 0x01c000, 0, 0x018000, 0x014000, 0x002000, 0 }, -#else - // 2003-10-20 by "Anton A. Arapov" - .audiomux = { 0x001e00, 0, 0x018000, 0x014000, 0x002000, 0 }, -#endif - .needs_tvaudio = 1, - .pll = PLL_28, - .tuner_type = -1, -},{ - .name = "Leadtek WinView 601", - .video_inputs = 3, - .audio_inputs = 1, - .tuner = 0, - .svhs = 2, - .gpiomask = 0x8300f8, - .muxsel = { 2, 3, 1, 1,0}, - .audiomux = { 0x4fa007,0xcfa007,0xcfa007,0xcfa007,0xcfa007,0xcfa007}, - .needs_tvaudio = 1, - .tuner_type = -1, - .audio_hook = winview_audio, - .has_radio = 1, -},{ - .name = "AVEC Intercapture", - .video_inputs = 3, - .audio_inputs = 2, - .tuner = 0, - .svhs = 2, - .gpiomask = 0, - .muxsel = {2, 3, 1, 1}, - .audiomux = {1, 0, 0, 0, 0}, - .needs_tvaudio = 1, - .tuner_type = -1, -},{ - .name = "Lifeview FlyVideo II EZ /FlyKit LR38 Bt848 (capture only)", - .video_inputs = 4, - .audio_inputs = 1, - .tuner = -1, - .svhs = -1, - .gpiomask = 0x8dff00, - .muxsel = { 2, 3, 1, 1}, - .audiomux = { 0 }, - .no_msp34xx = 1, - .tuner_type = -1, -},{ - -/* ---- card 0x14 ---------------------------------- */ - .name = "CEI Raffles Card", - .video_inputs = 3, - .audio_inputs = 3, - .tuner = 0, - .svhs = 2, - .muxsel = {2, 3, 1, 1}, - .tuner_type = -1, -},{ - .name = "Lifeview FlyVideo 98/ Lucky Star Image World ConferenceTV LR50", - .video_inputs = 4, - .audio_inputs = 2, // tuner, line in - .tuner = 0, - .svhs = 2, - .gpiomask = 0x1800, - .muxsel = { 2, 3, 1, 1}, - .audiomux = { 0, 0x800, 0x1000, 0x1000, 0x1800}, - .pll = PLL_28, - .tuner_type = TUNER_PHILIPS_PAL_I, -},{ - .name = "Askey CPH050/ Phoebe Tv Master + FM", - .video_inputs = 3, - .audio_inputs = 1, - .tuner = 0, - .svhs = 2, - .gpiomask = 0xc00, - .muxsel = { 2, 3, 1, 1}, - .audiomux = {0, 1, 0x800, 0x400, 0xc00, 0}, - .needs_tvaudio = 1, - .pll = PLL_28, - .tuner_type = -1, -},{ - .name = "Modular Technology MM201/MM202/MM205/MM210/MM215 PCTV, bt878", - .video_inputs = 3, - .audio_inputs = 1, - .tuner = 0, - .svhs = -1, - .gpiomask = 7, - .muxsel = { 2, 3, -1 }, - .digital_mode = DIGITAL_MODE_CAMERA, - .audiomux = { 0, 0, 0, 0, 0 }, - .no_msp34xx = 1, - .pll = PLL_28, - .tuner_type = TUNER_ALPS_TSBB5_PAL_I, -},{ - -/* ---- card 0x18 ---------------------------------- */ - .name = "Askey CPH05X/06X (bt878) [many vendors]", - .video_inputs = 3, - .audio_inputs = 1, - .tuner = 0, - .svhs = 2, - .gpiomask = 0xe00, - .muxsel = { 2, 3, 1, 1}, - .audiomux = {0x400, 0x400, 0x400, 0x400, 0xc00}, - .needs_tvaudio = 1, - .pll = PLL_28, - .tuner_type = -1, - .has_remote = 1, -},{ - .name = "Terratec TerraTV+ Version 1.0 (Bt848)/ Terra TValue Version 1.0/ Vobis TV-Boostar", - .video_inputs = 3, - .audio_inputs = 1, - .tuner = 0, - .svhs = 2, - .gpiomask = 0x1f0fff, - .muxsel = { 2, 3, 1, 1}, - .audiomux = { 0x20000, 0x30000, 0x10000, 0, 0x40000}, - .needs_tvaudio = 0, - .tuner_type = TUNER_PHILIPS_PAL, - .audio_hook = terratv_audio, -},{ - .name = "Hauppauge WinCam newer (bt878)", - .video_inputs = 4, - .audio_inputs = 1, - .tuner = 0, - .svhs = 3, - .gpiomask = 7, - .muxsel = { 2, 0, 1, 1}, - .audiomux = { 0, 1, 2, 3, 4}, - .needs_tvaudio = 1, - .tuner_type = -1, -},{ - .name = "Lifeview FlyVideo 98/ MAXI TV Video PCI2 LR50", - .video_inputs = 4, - .audio_inputs = 2, - .tuner = 0, - .svhs = 2, - .gpiomask = 0x1800, - .muxsel = { 2, 3, 1, 1}, - .audiomux = { 0, 0x800, 0x1000, 0x1000, 0x1800}, - .pll = PLL_28, - .tuner_type = TUNER_PHILIPS_SECAM, -},{ - -/* ---- card 0x1c ---------------------------------- */ - .name = "Terratec TerraTV+ Version 1.1 (bt878)", - .video_inputs = 3, - .audio_inputs = 1, - .tuner = 0, - .svhs = 2, - .gpiomask = 0x1f0fff, - .muxsel = { 2, 3, 1, 1}, - .audiomux = { 0x20000, 0x30000, 0x10000, 0x00000, 0x40000}, - .needs_tvaudio = 0, - .tuner_type = TUNER_PHILIPS_PAL, - .audio_hook = terratv_audio, - /* GPIO wiring: - External 20 pin connector (for Active Radio Upgrade board) - gpio00: i2c-sda - gpio01: i2c-scl - gpio02: om5610-data - gpio03: om5610-clk - gpio04: om5610-wre - gpio05: om5610-stereo - gpio06: rds6588-davn - gpio07: Pin 7 n.c. - gpio08: nIOW - gpio09+10: nIOR, nSEL ?? (bt878) - gpio09: nIOR (bt848) - gpio10: nSEL (bt848) - Sound Routing: - gpio16: u2-A0 (1st 4052bt) - gpio17: u2-A1 - gpio18: u2-nEN - gpio19: u4-A0 (2nd 4052) - gpio20: u4-A1 - u4-nEN - GND - Btspy: - 00000 : Cdrom (internal audio input) - 10000 : ext. Video audio input - 20000 : TV Mono - a0000 : TV Mono/2 - 1a0000 : TV Stereo - 30000 : Radio - 40000 : Mute - */ - -},{ - /* Jannik Fritsch */ - .name = "Imagenation PXC200", - .video_inputs = 5, - .audio_inputs = 1, - .tuner = -1, - .svhs = 1, /* was: 4 */ - .gpiomask = 0, - .muxsel = { 2, 3, 1, 0, 0}, - .audiomux = { 0 }, - .needs_tvaudio = 1, - .tuner_type = -1, - .muxsel_hook = PXC200_muxsel, - -},{ - .name = "Lifeview FlyVideo 98 LR50", - .video_inputs = 4, - .audio_inputs = 1, - .tuner = 0, - .svhs = 2, - .gpiomask = 0x1800, //0x8dfe00 - .muxsel = { 2, 3, 1, 1}, - .audiomux = { 0, 0x0800, 0x1000, 0x1000, 0x1800, 0 }, - .pll = PLL_28, - .tuner_type = -1, -},{ - .name = "Formac iProTV, Formac ProTV I (bt848)", - .video_inputs = 4, - .audio_inputs = 1, - .tuner = 0, - .svhs = 3, - .gpiomask = 1, - .muxsel = { 2, 3, 1, 1}, - .audiomux = { 1, 0, 0, 0, 0 }, - .pll = PLL_28, - .tuner_type = TUNER_PHILIPS_PAL, -},{ - -/* ---- card 0x20 ---------------------------------- */ - .name = "Intel Create and Share PCI/ Smart Video Recorder III", - .video_inputs = 4, - .audio_inputs = 0, - .tuner = -1, - .svhs = 2, - .gpiomask = 0, - .muxsel = { 2, 3, 1, 1}, - .audiomux = { 0 }, - .needs_tvaudio = 0, - .tuner_type = 4, -},{ - .name = "Terratec TerraTValue Version Bt878", - .video_inputs = 3, - .audio_inputs = 1, - .tuner = 0, - .svhs = 2, - .gpiomask = 0xffff00, - .muxsel = { 2, 3, 1, 1}, - .audiomux = { 0x500, 0, 0x300, 0x900, 0x900}, - .needs_tvaudio = 1, - .pll = PLL_28, - .tuner_type = TUNER_PHILIPS_PAL, -},{ - .name = "Leadtek WinFast 2000/ WinFast 2000 XP", - .video_inputs = 4, - .audio_inputs = 1, - .tuner = 0, - .svhs = 2, - .muxsel = { 2, 3, 1, 1, 0}, // TV, CVid, SVid, CVid over SVid connector -#if 0 - .gpiomask = 0xc33000, - .audiomux = { 0x422000,0x1000,0x0000,0x620000,0x800000 }, -#else - /* Alexander Varakin [stereo version] */ - .gpiomask = 0xb33000, - .audiomux = { 0x122000,0x1000,0x0000,0x620000,0x800000 }, -#endif - /* Audio Routing for "WinFast 2000 XP" (no tv stereo !) - gpio23 -- hef4052:nEnable (0x800000) - gpio12 -- hef4052:A1 - gpio13 -- hef4052:A0 - 0x0000: external audio - 0x1000: FM - 0x2000: TV - 0x3000: n.c. - Note: There exists another variant "Winfast 2000" with tv stereo !? - Note: eeprom only contains FF and pci subsystem id 107d:6606 - */ - .needs_tvaudio = 0, - .pll = PLL_28, - .has_radio = 1, - .tuner_type = 5, // default for now, gpio reads BFFF06 for Pal bg+dk - .audio_hook = winfast2000_audio, - .has_remote = 1, -},{ - .name = "Lifeview FlyVideo 98 LR50 / Chronos Video Shuttle II", - .video_inputs = 4, - .audio_inputs = 3, - .tuner = 0, - .svhs = 2, - .gpiomask = 0x1800, - .muxsel = { 2, 3, 1, 1}, - .audiomux = { 0, 0x800, 0x1000, 0x1000, 0x1800}, - .pll = PLL_28, - .tuner_type = -1, -},{ - -/* ---- card 0x24 ---------------------------------- */ - .name = "Lifeview FlyVideo 98FM LR50 / Typhoon TView TV/FM Tuner", - .video_inputs = 4, - .audio_inputs = 3, - .tuner = 0, - .svhs = 2, - .gpiomask = 0x1800, - .muxsel = { 2, 3, 1, 1}, - .audiomux = { 0, 0x800, 0x1000, 0x1000, 0x1800, 0 }, - .pll = PLL_28, - .tuner_type = -1, - .has_radio = 1, -},{ - .name = "Prolink PixelView PlayTV pro", - .video_inputs = 3, - .audio_inputs = 1, - .tuner = 0, - .svhs = 2, - .gpiomask = 0xff, - .muxsel = { 2, 3, 1, 1 }, - .audiomux = { 0x21, 0x20, 0x24, 0x2c, 0x29, 0x29 }, - .no_msp34xx = 1, - .pll = PLL_28, - .tuner_type = -1, -},{ - .name = "Askey CPH06X TView99", - .video_inputs = 4, - .audio_inputs = 1, - .tuner = 0, - .svhs = 2, - .gpiomask = 0x551e00, - .muxsel = { 2, 3, 1, 0}, - .audiomux = { 0x551400, 0x551200, 0, 0, 0x551c00, 0x551200 }, - .needs_tvaudio = 1, - .pll = PLL_28, - .tuner_type = 1, - .has_remote = 1, -},{ - .name = "Pinnacle PCTV Studio/Rave", - .video_inputs = 3, - .audio_inputs = 1, - .tuner = 0, - .svhs = 2, - .gpiomask = 0x03000F, - .muxsel = { 2, 3, 1, 1}, - .audiomux = { 2, 0xd0001, 0, 0, 1}, - .needs_tvaudio = 0, - .pll = PLL_28, - .tuner_type = -1, -},{ - -/* ---- card 0x28 ---------------------------------- */ - .name = "STB TV PCI FM, Gateway P/N 6000704 (bt878), 3Dfx VoodooTV 100", - .video_inputs = 3, - .audio_inputs = 1, - .tuner = 0, - .svhs = 2, - .gpiomask = 7, - .muxsel = { 2, 3, 1, 1}, - .audiomux = { 4, 0, 2, 3, 1}, - .no_msp34xx = 1, - .needs_tvaudio = 1, - .tuner_type = TUNER_PHILIPS_NTSC, - .pll = PLL_28, - .has_radio = 1, -},{ - .name = "AVerMedia TVPhone 98", - .video_inputs = 3, - .audio_inputs = 4, - .tuner = 0, - .svhs = 2, - .gpiomask = 15, - .muxsel = { 2, 3, 1, 1}, - .audiomux = { 13, 4, 11, 7, 0, 0}, - .needs_tvaudio = 1, - .pll = PLL_28, - .tuner_type = -1, - .has_radio = 1, - .audio_hook = avermedia_tvphone_audio, -},{ - .name = "ProVideo PV951", /* pic16c54 */ - .video_inputs = 3, - .audio_inputs = 1, - .tuner = 0, - .svhs = 2, - .gpiomask = 0, - .muxsel = { 2, 3, 1, 1}, - .audiomux = { 0, 0, 0, 0, 0}, - .needs_tvaudio = 1, - .no_msp34xx = 1, - .pll = PLL_28, - .tuner_type = 1, -},{ - .name = "Little OnAir TV", - .video_inputs = 3, - .audio_inputs = 1, - .tuner = 0, - .svhs = 2, - .gpiomask = 0xe00b, - .muxsel = {2, 3, 1, 1}, - .audiomux = {0xff9ff6, 0xff9ff6, 0xff1ff7, 0, 0xff3ffc}, - .no_msp34xx = 1, - .tuner_type = -1, -},{ - -/* ---- card 0x2c ---------------------------------- */ - .name = "Sigma TVII-FM", - .video_inputs = 2, - .audio_inputs = 1, - .tuner = 0, - .svhs = -1, - .gpiomask = 3, - .muxsel = {2, 3, 1, 1}, - .audiomux = {1, 1, 0, 2, 3}, - .no_msp34xx = 1, - .pll = PLL_NONE, - .tuner_type = -1, -},{ - .name = "MATRIX-Vision MV-Delta 2", - .video_inputs = 5, - .audio_inputs = 1, - .tuner = -1, - .svhs = 3, - .gpiomask = 0, - .muxsel = { 2, 3, 1, 0, 0}, - .audiomux = {0 }, - .no_msp34xx = 1, - .pll = PLL_28, - .tuner_type = -1, -},{ - .name = "Zoltrix Genie TV/FM", - .video_inputs = 3, - .audio_inputs = 1, - .tuner = 0, - .svhs = 2, - .gpiomask = 0xbcf03f, - .muxsel = { 2, 3, 1, 1}, - .audiomux = { 0xbc803f, 0xbc903f, 0xbcb03f, 0, 0xbcb03f}, - .no_msp34xx = 1, - .pll = PLL_28, - .tuner_type = 21, -},{ - .name = "Terratec TV/Radio+", - .video_inputs = 3, - .audio_inputs = 1, - .tuner = 0, - .svhs = 2, - .gpiomask = 0x70000, - .muxsel = { 2, 3, 1, 1}, - .audiomux = { 0x20000, 0x30000, 0x10000, 0, 0x40000, 0x20000 }, - .needs_tvaudio = 1, - .no_msp34xx = 1, - .pll = PLL_35, - .tuner_type = 1, - .has_radio = 1, -},{ - -/* ---- card 0x30 ---------------------------------- */ - .name = "Askey CPH03x/ Dynalink Magic TView", - .video_inputs = 3, - .audio_inputs = 1, - .tuner = 0, - .svhs = 2, - .gpiomask = 15, - .muxsel = { 2, 3, 1, 1}, - .audiomux = {2,0,0,0,1}, - .needs_tvaudio = 1, - .pll = PLL_28, - .tuner_type = -1, -},{ - .name = "IODATA GV-BCTV3/PCI", - .video_inputs = 3, - .audio_inputs = 1, - .tuner = 0, - .svhs = 2, - .gpiomask = 0x010f00, - .muxsel = {2, 3, 0, 0}, - .audiomux = {0x10000, 0, 0x10000, 0, 0, 0}, - .no_msp34xx = 1, - .pll = PLL_28, - .tuner_type = TUNER_ALPS_TSHC6_NTSC, - .audio_hook = gvbctv3pci_audio, -},{ - .name = "Prolink PV-BT878P+4E / PixelView PlayTV PAK / Lenco MXTV-9578 CP", - .video_inputs = 5, - .audio_inputs = 1, - .tuner = 0, - .svhs = 3, - .gpiomask = 0xAA0000, - .muxsel = { 2,3,1,1,-1 }, - .digital_mode = DIGITAL_MODE_CAMERA, - .audiomux = { 0x20000, 0, 0x80000, 0x80000, 0xa8000, 0x46000 }, - .no_msp34xx = 1, - .pll = PLL_28, - .tuner_type = TUNER_PHILIPS_PAL_I, - .has_remote = 1, - /* GPIO wiring: (different from Rev.4C !) - GPIO17: U4.A0 (first hef4052bt) - GPIO19: U4.A1 - GPIO20: U5.A1 (second hef4052bt) - GPIO21: U4.nEN - GPIO22: BT832 Reset Line - GPIO23: A5,A0, U5,nEN - Note: At i2c=0x8a is a Bt832 chip, which changes to 0x88 after being reset via GPIO22 - */ -},{ - .name = "Eagle Wireless Capricorn2 (bt878A)", - .video_inputs = 4, - .audio_inputs = 1, - .tuner = 0, - .svhs = 2, - .gpiomask = 7, - .muxsel = { 2, 0, 1, 1}, - .audiomux = { 0, 1, 2, 3, 4}, - .pll = PLL_28, - .tuner_type = -1 /* TUNER_ALPS_TMDH2_NTSC */, -},{ - -/* ---- card 0x34 ---------------------------------- */ - /* David Härdeman */ - .name = "Pinnacle PCTV Studio Pro", - .video_inputs = 4, - .audio_inputs = 1, - .tuner = 0, - .svhs = 3, - .gpiomask = 0x03000F, - .muxsel = { 2, 3, 1, 1}, - .audiomux = { 1, 0xd0001, 0, 0, 10}, - /* sound path (5 sources): - MUX1 (mask 0x03), Enable Pin 0x08 (0=enable, 1=disable) - 0= ext. Audio IN - 1= from MUX2 - 2= Mono TV sound from Tuner - 3= not connected - MUX2 (mask 0x30000): - 0,2,3= from MSP34xx - 1= FM stereo Radio from Tuner */ - .needs_tvaudio = 0, - .pll = PLL_28, - .tuner_type = -1, -},{ - /* Claas Langbehn , - Sven Grothklags */ - .name = "Typhoon TView RDS + FM Stereo / KNC1 TV Station RDS", - .video_inputs = 4, - .audio_inputs = 3, - .tuner = 0, - .svhs = 2, - .gpiomask = 0x1c, - .muxsel = { 2, 3, 1, 1}, - .audiomux = { 0, 0, 0x10, 8, 4 }, - .needs_tvaudio = 1, - .pll = PLL_28, - .tuner_type = TUNER_PHILIPS_PAL, - .has_radio = 1, -},{ - /* Tim Röstermundt - in de.comp.os.unix.linux.hardware: - options bttv card=0 pll=1 radio=1 gpiomask=0x18e0 - audiomux=0x44c71f,0x44d71f,0,0x44d71f,0x44dfff - options tuner type=5 */ - .name = "Lifeview FlyVideo 2000 /FlyVideo A2/ Lifetec LT 9415 TV [LR90]", - .video_inputs = 4, - .audio_inputs = 1, - .tuner = 0, - .svhs = 2, - .gpiomask = 0x18e0, - .muxsel = { 2, 3, 1, 1}, - .audiomux = { 0x0000,0x0800,0x1000,0x1000,0x18e0 }, - /* For cards with tda9820/tda9821: - 0x0000: Tuner normal stereo - 0x0080: Tuner A2 SAP (second audio program = Zweikanalton) - 0x0880: Tuner A2 stereo */ - .pll = PLL_28, - .tuner_type = -1, -},{ - /* Miguel Angel Alvarez - old Easy TV BT848 version (model CPH031) */ - .name = "Askey CPH031/ BESTBUY Easy TV", - .video_inputs = 4, - .audio_inputs = 1, - .tuner = 0, - .svhs = 2, - .gpiomask = 0xF, - .muxsel = { 2, 3, 1, 0}, - .audiomux = { 2, 0, 0, 0, 10}, - .needs_tvaudio = 0, - .pll = PLL_28, - .tuner_type = TUNER_TEMIC_PAL, -},{ - -/* ---- card 0x38 ---------------------------------- */ - /* Gordon Heydon */ - .name = "GrandTec 'Grand Video Capture' (Bt848)", - .video_inputs = 2, - .audio_inputs = 0, - .tuner = -1, - .svhs = 1, - .gpiomask = 0, - .muxsel = { 3, 1 }, - .audiomux = { 0 }, - .needs_tvaudio = 0, - .no_msp34xx = 1, - .pll = PLL_35, - .tuner_type = -1, -},{ - /* Daniel Herrington */ - .name = "Askey CPH060/ Phoebe TV Master Only (No FM)", - .video_inputs = 3, - .audio_inputs = 1, - .tuner = 0, - .svhs = 2, - .gpiomask = 0xe00, - .muxsel = { 2, 3, 1, 1}, - .audiomux = { 0x400, 0x400, 0x400, 0x400, 0x800, 0x400 }, - .needs_tvaudio = 1, - .pll = PLL_28, - .tuner_type = TUNER_TEMIC_4036FY5_NTSC, -},{ - /* Matti Mottus */ - .name = "Askey CPH03x TV Capturer", - .video_inputs = 4, - .audio_inputs = 1, - .tuner = 0, - .svhs = 2, - .gpiomask = 0x03000F, - .muxsel = { 2, 3, 1, 0}, - .audiomux = { 2,0,0,0,1 }, - .pll = PLL_28, - .tuner_type = 0, -},{ - -/* ---- card 0x3c ---------------------------------- */ - /* Philip Blundell */ - .name = "Modular Technology MM100PCTV", - .video_inputs = 2, - .audio_inputs = 2, - .tuner = 0, - .svhs = -1, - .gpiomask = 11, - .muxsel = { 2, 3, 1, 1}, - .audiomux = { 2, 0, 0, 1, 8}, - .pll = PLL_35, - .tuner_type = TUNER_TEMIC_PAL, - -},{ - /* Adrian Cox - new Easy TV BT878 version (model CPH061) - special thanks to Informatica Mieres for providing the card */ - .name = "Askey CPH061/ BESTBUY Easy TV (bt878)", - .video_inputs = 3, - .audio_inputs = 2, - .tuner = 0, - .svhs = 2, - .gpiomask = 0xFF, - .muxsel = { 2, 3, 1, 0}, - .audiomux = { 1, 0, 4, 4, 9}, - .needs_tvaudio = 0, - .pll = PLL_28, - .tuner_type = TUNER_PHILIPS_PAL, -},{ - /* Lukas Gebauer */ - .name = "ATI TV-Wonder", - .video_inputs = 3, - .audio_inputs = 1, - .tuner = 0, - .svhs = 2, - .gpiomask = 0xf03f, - .muxsel = { 2, 3, 1, 0 }, - .audiomux = { 0xbffe, 0, 0xbfff, 0, 0xbffe}, - .pll = PLL_28, - .tuner_type = TUNER_TEMIC_4006FN5_MULTI_PAL, -},{ - -/* ---- card 0x40 ---------------------------------- */ - /* Lukas Gebauer */ - .name = "ATI TV-Wonder VE", - .video_inputs = 2, - .audio_inputs = 1, - .tuner = 0, - .svhs = -1, - .gpiomask = 1, - .muxsel = { 2, 3, 0, 1}, - .audiomux = { 0, 0, 1, 0, 0}, - .no_msp34xx = 1, - .pll = PLL_28, - .tuner_type = TUNER_TEMIC_4006FN5_MULTI_PAL, -},{ - /* DeeJay */ - .name = "IODATA GV-BCTV4/PCI", - .video_inputs = 3, - .audio_inputs = 1, - .tuner = 0, - .svhs = 2, - .gpiomask = 0x010f00, - .muxsel = {2, 3, 0, 0}, - .audiomux = {0x10000, 0, 0x10000, 0, 0, 0}, - .no_msp34xx = 1, - .pll = PLL_28, - .tuner_type = TUNER_SHARP_2U5JF5540_NTSC, - .audio_hook = gvbctv3pci_audio, -},{ - -/* ---- card 0x44 ---------------------------------- */ - .name = "3Dfx VoodooTV FM (Euro), VoodooTV 200 (USA)", - // try "insmod msp3400 simple=0" if you have - // sound problems with this card. - .video_inputs = 4, - .audio_inputs = 1, - .tuner = 0, - .svhs = -1, - .gpiomask = 0x4f8a00, - // 0x100000: 1=MSP enabled (0=disable again) - // 0x010000: Connected to "S0" on tda9880 (0=Pal/BG, 1=NTSC) - .audiomux = {0x947fff, 0x987fff,0x947fff,0x947fff, 0x947fff}, - // tvtuner, radio, external,internal, mute, stereo - /* tuner, Composit, SVid, Composit-on-Svid-adapter*/ - .muxsel = { 2, 3 ,0 ,1}, - .tuner_type = TUNER_MT2032, - .pll = PLL_28, - .has_radio = 1, -},{ - /* Philip Blundell */ - .name = "Active Imaging AIMMS", - .video_inputs = 1, - .audio_inputs = 0, - .tuner = -1, - .tuner_type = -1, - .pll = PLL_28, - .muxsel = { 2 }, - .gpiomask = 0 -},{ - /* Tomasz Pyra */ - .name = "Prolink Pixelview PV-BT878P+ (Rev.4C,8E)", - .video_inputs = 3, - .audio_inputs = 4, - .tuner = 0, - .svhs = 2, - .gpiomask = 15, - .muxsel = { 2, 3, 1, 1}, - .audiomux = { 0, 0, 11, 7, 13, 0}, // TV and Radio with same GPIO ! - .needs_tvaudio = 1, - .pll = PLL_28, - .tuner_type = 25, - .has_remote = 1, - /* GPIO wiring: - GPIO0: U4.A0 (hef4052bt) - GPIO1: U4.A1 - GPIO2: U4.A1 (second hef4052bt) - GPIO3: U4.nEN, U5.A0, A5.nEN - GPIO8-15: vrd866b ? - */ -},{ - .name = "Lifeview FlyVideo 98EZ (capture only) LR51", - .video_inputs = 4, - .audio_inputs = 0, - .tuner = -1, - .svhs = 2, - .muxsel = { 2, 3, 1, 1}, // AV1, AV2, SVHS, CVid adapter on SVHS - .pll = PLL_28, - .no_msp34xx = 1, -},{ - -/* ---- card 0x48 ---------------------------------- */ - /* Dariusz Kowalewski */ - .name = "Prolink Pixelview PV-BT878P+9B (PlayTV Pro rev.9B FM+NICAM)", - .video_inputs = 4, - .audio_inputs = 1, - .tuner = 0, - .svhs = 2, - .gpiomask = 0x3f, - .muxsel = { 2, 3, 1, 1 }, - .audiomux = { 0x01, 0x00, 0x03, 0x03, 0x09, 0x02 }, - .needs_tvaudio = 1, - .no_msp34xx = 1, - .no_tda9875 = 1, - .pll = PLL_28, - .tuner_type = 5, - .audio_hook = pvbt878p9b_audio, // Note: not all cards have stereo - .has_radio = 1, // Note: not all cards have radio - .has_remote = 1, - /* GPIO wiring: - GPIO0: A0 hef4052 - GPIO1: A1 hef4052 - GPIO3: nEN hef4052 - GPIO8-15: vrd866b - GPIO20,22,23: R30,R29,R28 - */ -},{ - /* Clay Kunz */ - /* you must jumper JP5 for the card to work */ - .name = "Sensoray 311", - .video_inputs = 5, - .audio_inputs = 0, - .tuner = -1, - .svhs = 4, - .gpiomask = 0, - .muxsel = { 2, 3, 1, 0, 0}, - .audiomux = { 0 }, - .needs_tvaudio = 0, - .tuner_type = -1, -},{ - /* Miguel Freitas */ - .name = "RemoteVision MX (RV605)", - .video_inputs = 16, - .audio_inputs = 0, - .tuner = -1, - .svhs = -1, - .gpiomask = 0x00, - .gpiomask2 = 0x07ff, - .muxsel = { 0x33, 0x13, 0x23, 0x43, 0xf3, 0x73, 0xe3, 0x03, - 0xd3, 0xb3, 0xc3, 0x63, 0x93, 0x53, 0x83, 0xa3 }, - .no_msp34xx = 1, - .no_tda9875 = 1, - .tuner_type = -1, - .muxsel_hook = rv605_muxsel, -},{ - .name = "Powercolor MTV878/ MTV878R/ MTV878F", - .video_inputs = 3, - .audio_inputs = 2, - .tuner = 0, - .svhs = 2, - .gpiomask = 0x1C800F, // Bit0-2: Audio select, 8-12:remote control 14:remote valid 15:remote reset - .muxsel = { 2, 1, 1, }, - .audiomux = { 0, 1, 2, 2, 4 }, - .needs_tvaudio = 0, - .tuner_type = TUNER_PHILIPS_PAL, - .pll = PLL_28, - .has_radio = 1, -},{ - -/* ---- card 0x4c ---------------------------------- */ - /* Masaki Suzuki */ - .name = "Canopus WinDVR PCI (COMPAQ Presario 3524JP, 5112JP)", - .video_inputs = 3, - .audio_inputs = 1, - .tuner = 0, - .svhs = 2, - .gpiomask = 0x140007, - .muxsel = { 2, 3, 1, 1 }, - .audiomux = { 0, 1, 2, 3, 4, 0 }, - .tuner_type = TUNER_PHILIPS_NTSC, - .audio_hook = windvr_audio, -},{ - .name = "GrandTec Multi Capture Card (Bt878)", - .video_inputs = 4, - .audio_inputs = 0, - .tuner = -1, - .svhs = -1, - .gpiomask = 0, - .muxsel = { 2, 3, 1, 0 }, - .audiomux = { 0 }, - .needs_tvaudio = 0, - .no_msp34xx = 1, - .pll = PLL_28, - .tuner_type = -1, -},{ - .name = "Jetway TV/Capture JW-TV878-FBK, Kworld KW-TV878RF", - .video_inputs = 4, - .audio_inputs = 3, - .tuner = 0, - .svhs = 2, - .gpiomask = 7, - .muxsel = { 2, 3, 1, 1 }, // Tuner, SVid, SVHS, SVid to SVHS connector - .audiomux = { 0 ,0 ,4, 4,4,4},// Yes, this tuner uses the same audio output for TV and FM radio! - // This card lacks external Audio In, so we mute it on Ext. & Int. - // The PCB can take a sbx1637/sbx1673, wiring unknown. - // This card lacks PCI subsystem ID, sigh. - // audiomux=1: lower volume, 2+3: mute - // btwincap uses 0x80000/0x80003 - .needs_tvaudio = 0, - .no_msp34xx = 1, - .pll = PLL_28, - .tuner_type = 5, // Samsung TCPA9095PC27A (BG+DK), philips compatible, w/FM, stereo and - // radio signal strength indicators work fine. - .has_radio = 1, - /* GPIO Info: - GPIO0,1: HEF4052 A0,A1 - GPIO2: HEF4052 nENABLE - GPIO3-7: n.c. - GPIO8-13: IRDC357 data0-5 (data6 n.c. ?) [chip not present on my card] - GPIO14,15: ?? - GPIO16-21: n.c. - GPIO22,23: ?? - ?? : mtu8b56ep microcontroller for IR (GPIO wiring unknown)*/ -},{ - /* Arthur Tetzlaff-Deas, DSP Design Ltd */ - .name = "DSP Design TCVIDEO", - .video_inputs = 4, - .svhs = -1, - .muxsel = { 2, 3, 1, 0}, - .pll = PLL_28, - .tuner_type = -1, -},{ - - /* ---- card 0x50 ---------------------------------- */ - .name = "Hauppauge WinTV PVR", - .video_inputs = 4, - .audio_inputs = 1, - .tuner = 0, - .svhs = 2, - .muxsel = { 2, 0, 1, 1}, - .needs_tvaudio = 1, - .pll = PLL_28, - .tuner_type = -1, - - .gpiomask = 7, - .audiomux = {7}, -},{ - .name = "IODATA GV-BCTV5/PCI", - .video_inputs = 3, - .audio_inputs = 1, - .tuner = 0, - .svhs = 2, - .gpiomask = 0x0f0f80, - .muxsel = {2, 3, 1, 0}, - .audiomux = {0x030000, 0x010000, 0, 0, 0x020000, 0}, - .no_msp34xx = 1, - .pll = PLL_28, - .tuner_type = TUNER_PHILIPS_NTSC_M, - .audio_hook = gvbctv5pci_audio, - .has_radio = 1, -},{ - .name = "Osprey 100/150 (878)", /* 0x1(2|3)-45C6-C1 */ - .video_inputs = 4, /* id-inputs-clock */ - .audio_inputs = 0, - .tuner = -1, - .svhs = 3, - .muxsel = { 3, 2, 0, 1 }, - .pll = PLL_28, - .tuner_type = -1, - .no_msp34xx = 1, - .no_tda9875 = 1, - .no_tda7432 = 1, -},{ - .name = "Osprey 100/150 (848)", /* 0x04-54C0-C1 & older boards */ - .video_inputs = 3, - .audio_inputs = 0, - .tuner = -1, - .svhs = 2, - .muxsel = { 2, 3, 1 }, - .pll = PLL_28, - .tuner_type = -1, - .no_msp34xx = 1, - .no_tda9875 = 1, - .no_tda7432 = 1, -},{ - - /* ---- card 0x54 ---------------------------------- */ - .name = "Osprey 101 (848)", /* 0x05-40C0-C1 */ - .video_inputs = 2, - .audio_inputs = 0, - .tuner = -1, - .svhs = 1, - .muxsel = { 3, 1 }, - .pll = PLL_28, - .tuner_type = -1, - .no_msp34xx = 1, - .no_tda9875 = 1, - .no_tda7432 = 1, -},{ - .name = "Osprey 101/151", /* 0x1(4|5)-0004-C4 */ - .video_inputs = 1, - .audio_inputs = 0, - .tuner = -1, - .svhs = -1, - .muxsel = { 0 }, - .pll = PLL_28, - .tuner_type = -1, - .no_msp34xx = 1, - .no_tda9875 = 1, - .no_tda7432 = 1, -},{ - .name = "Osprey 101/151 w/ svid", /* 0x(16|17|20)-00C4-C1 */ - .video_inputs = 2, - .audio_inputs = 0, - .tuner = -1, - .svhs = 1, - .muxsel = { 0, 1 }, - .pll = PLL_28, - .tuner_type = -1, - .no_msp34xx = 1, - .no_tda9875 = 1, - .no_tda7432 = 1, -},{ - .name = "Osprey 200/201/250/251", /* 0x1(8|9|E|F)-0004-C4 */ - .video_inputs = 1, - .audio_inputs = 1, - .tuner = -1, - .svhs = -1, - .muxsel = { 0 }, - .pll = PLL_28, - .tuner_type = -1, - .no_msp34xx = 1, - .no_tda9875 = 1, - .no_tda7432 = 1, -},{ - - /* ---- card 0x58 ---------------------------------- */ - .name = "Osprey 200/250", /* 0x1(A|B)-00C4-C1 */ - .video_inputs = 2, - .audio_inputs = 1, - .tuner = -1, - .svhs = 1, - .muxsel = { 0, 1 }, - .pll = PLL_28, - .tuner_type = -1, - .no_msp34xx = 1, - .no_tda9875 = 1, - .no_tda7432 = 1, -},{ - .name = "Osprey 210/220", /* 0x1(A|B)-04C0-C1 */ - .video_inputs = 2, - .audio_inputs = 1, - .tuner = -1, - .svhs = 1, - .muxsel = { 2, 3 }, - .pll = PLL_28, - .tuner_type = -1, - .no_msp34xx = 1, - .no_tda9875 = 1, - .no_tda7432 = 1, -},{ - .name = "Osprey 500", /* 500 */ - .video_inputs = 2, - .audio_inputs = 1, - .tuner = -1, - .svhs = 1, - .muxsel = { 2, 3 }, - .pll = PLL_28, - .tuner_type = -1, - .no_msp34xx = 1, - .no_tda9875 = 1, - .no_tda7432 = 1, -},{ - .name = "Osprey 540", /* 540 */ - .video_inputs = 4, - .audio_inputs = 1, - .tuner = -1, -#if 0 /* TODO ... */ - .svhs = OSPREY540_SVID_ANALOG, - .muxsel = { [OSPREY540_COMP_ANALOG] = 2, - [OSPREY540_SVID_ANALOG] = 3, }, -#endif - .pll = PLL_28, - .tuner_type = -1, - .no_msp34xx = 1, - .no_tda9875 = 1, - .no_tda7432 = 1, -#if 0 /* TODO ... */ - .muxsel_hook = osprey_540_muxsel, - .picture_hook = osprey_540_set_picture, -#endif -},{ - - /* ---- card 0x5C ---------------------------------- */ - .name = "Osprey 2000", /* 2000 */ - .video_inputs = 2, - .audio_inputs = 1, - .tuner = -1, - .svhs = 1, - .muxsel = { 2, 3 }, - .pll = PLL_28, - .tuner_type = -1, - .no_msp34xx = 1, - .no_tda9875 = 1, - .no_tda7432 = 1, /* must avoid, conflicts with the bt860 */ -},{ - /* M G Berberich */ - .name = "IDS Eagle", - .video_inputs = 4, - .audio_inputs = 0, - .tuner = -1, - .tuner_type = -1, - .svhs = -1, - .gpiomask = 0, - .muxsel = { 0, 1, 2, 3 }, - .muxsel_hook = eagle_muxsel, - .no_msp34xx = 1, - .no_tda9875 = 1, - .pll = PLL_28, -},{ - .name = "Pinnacle PCTV Sat", - .video_inputs = 2, - .audio_inputs = 0, - .svhs = 1, - .tuner = -1, - .tuner_type = -1, - .no_msp34xx = 1, - .no_tda9875 = 1, - .no_tda7432 = 1, - .gpiomask = 0x01, - .audiomux = { 0, 0, 0, 0, 1 }, - .muxsel = { 3, 0, 1, 2}, - .needs_tvaudio = 0, - .pll = PLL_28, - .no_gpioirq = 1, - .has_dvb = 1, -},{ - .name = "Formac ProTV II (bt878)", - .video_inputs = 4, - .audio_inputs = 1, - .tuner = 0, - .svhs = 3, - .gpiomask = 2, - // TV, Comp1, Composite over SVID con, SVID - .muxsel = { 2, 3, 1, 1}, - .audiomux = { 2, 2, 0, 0, 0 }, - .pll = PLL_28, - .has_radio = 1, - .tuner_type = TUNER_PHILIPS_PAL, - /* sound routing: - GPIO=0x00,0x01,0x03: mute (?) - 0x02: both TV and radio (tuner: FM1216/I) - The card has onboard audio connectors labeled "cdrom" and "board", - not soldered here, though unknown wiring. - Card lacks: external audio in, pci subsystem id. - */ -},{ - - /* ---- card 0x60 ---------------------------------- */ - .name = "MachTV", - .video_inputs = 3, - .audio_inputs = 1, - .tuner = 0, - .svhs = -1, - .gpiomask = 7, - .muxsel = { 2, 3, 1, 1}, - .audiomux = { 0, 1, 2, 3, 4}, - .needs_tvaudio = 1, - .tuner_type = 5, - .pll = 1, -},{ - .name = "Euresys Picolo", - .video_inputs = 3, - .audio_inputs = 0, - .tuner = -1, - .svhs = 2, - .gpiomask = 0, - .no_msp34xx = 1, - .no_tda9875 = 1, - .no_tda7432 = 1, - .muxsel = { 2, 0, 1}, - .pll = PLL_28, -},{ - /* Luc Van Hoeylandt */ - .name = "ProVideo PV150", /* 0x4f */ - .video_inputs = 2, - .audio_inputs = 0, - .tuner = -1, - .svhs = -1, - .gpiomask = 0, - .muxsel = { 2, 3 }, - .audiomux = { 0 }, - .needs_tvaudio = 0, - .no_msp34xx = 1, - .pll = PLL_28, - .tuner_type = -1, -},{ - /* Hiroshi Takekawa */ - /* This card lacks subsystem ID */ - .name = "AD-TVK503", /* 0x63 */ - .video_inputs = 4, - .audio_inputs = 1, - .tuner = 0, - .svhs = 2, - .gpiomask = 0x001e8007, - .muxsel = { 2, 3, 1, 0 }, - /* Tuner, Radio, external, internal, off, on */ - .audiomux = { 0x08, 0x0f, 0x0a, 0x08, 0x0f, 0x08 }, - .needs_tvaudio = 0, - .no_msp34xx = 1, - .pll = PLL_28, - .tuner_type = 2, - .audio_hook = adtvk503_audio, -},{ - - /* ---- card 0x64 ---------------------------------- */ - .name = "Hercules Smart TV Stereo", - .video_inputs = 4, - .audio_inputs = 1, - .tuner = 0, - .svhs = 2, - .gpiomask = 0x00, - .muxsel = { 2, 3, 1, 1 }, - .needs_tvaudio = 1, - .no_msp34xx = 1, - .pll = PLL_28, - .tuner_type = 5, - /* Notes: - - card lacks subsystem ID - - stereo variant w/ daughter board with tda9874a @0xb0 - - Audio Routing: - always from tda9874 independent of GPIO (?) - external line in: unknown - - Other chips: em78p156elp @ 0x96 (probably IR remote control) - hef4053 (instead 4052) for unknown function + /* ---- card 0x00 ---------------------------------- */ + [BTTV_BOARD_UNKNOWN] = { + .name = " *** UNKNOWN/GENERIC *** ", + .video_inputs = 4, + .audio_inputs = 1, + .tuner = 0, + .svhs = 2, + .muxsel = { 2, 3, 1, 0 }, + .tuner_type = -1, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + }, + [BTTV_BOARD_MIRO] = { + .name = "MIRO PCTV", + .video_inputs = 4, + .audio_inputs = 1, + .tuner = 0, + .svhs = 2, + .gpiomask = 15, + .muxsel = { 2, 3, 1, 1 }, + .audiomux = { 2, 0, 0, 0, 10 }, + .needs_tvaudio = 1, + .tuner_type = -1, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + }, + [BTTV_BOARD_HAUPPAUGE] = { + .name = "Hauppauge (bt848)", + .video_inputs = 4, + .audio_inputs = 1, + .tuner = 0, + .svhs = 2, + .gpiomask = 7, + .muxsel = { 2, 3, 1, 1 }, + .audiomux = { 0, 1, 2, 3, 4 }, + .needs_tvaudio = 1, + .tuner_type = -1, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + }, + [BTTV_BOARD_STB] = { + .name = "STB, Gateway P/N 6000699 (bt848)", + .video_inputs = 3, + .audio_inputs = 1, + .tuner = 0, + .svhs = 2, + .gpiomask = 7, + .muxsel = { 2, 3, 1, 1 }, + .audiomux = { 4, 0, 2, 3, 1 }, + .no_msp34xx = 1, + .needs_tvaudio = 1, + .tuner_type = TUNER_PHILIPS_NTSC, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + .pll = PLL_28, + .has_radio = 1, + }, + + /* ---- card 0x04 ---------------------------------- */ + [BTTV_BOARD_INTEL] = { + .name = "Intel Create and Share PCI/ Smart Video Recorder III", + .video_inputs = 4, + .audio_inputs = 0, + .tuner = -1, + .svhs = 2, + .gpiomask = 0, + .muxsel = { 2, 3, 1, 1 }, + .audiomux = { 0 }, + .needs_tvaudio = 0, + .tuner_type = 4, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + }, + [BTTV_BOARD_DIAMOND] = { + .name = "Diamond DTV2000", + .video_inputs = 4, + .audio_inputs = 1, + .tuner = 0, + .svhs = 2, + .gpiomask = 3, + .muxsel = { 2, 3, 1, 0 }, + .audiomux = { 0, 1, 0, 1, 3 }, + .needs_tvaudio = 1, + .tuner_type = -1, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + }, + [BTTV_BOARD_AVERMEDIA] = { + .name = "AVerMedia TVPhone", + .video_inputs = 3, + .audio_inputs = 1, + .tuner = 0, + .svhs = 3, + .muxsel = { 2, 3, 1, 1 }, + .gpiomask = 0x0f, + .audiomux = { 0x0c, 0x04, 0x08, 0x04, 0 }, + /* 0x04 for some cards ?? */ + .needs_tvaudio = 1, + .tuner_type = -1, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + .audio_hook = avermedia_tvphone_audio, + .has_remote = 1, + }, + [BTTV_BOARD_MATRIX_VISION] = { + .name = "MATRIX-Vision MV-Delta", + .video_inputs = 5, + .audio_inputs = 1, + .tuner = -1, + .svhs = 3, + .gpiomask = 0, + .muxsel = { 2, 3, 1, 0, 0 }, + .audiomux = { 0 }, + .needs_tvaudio = 1, + .tuner_type = -1, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + }, + + /* ---- card 0x08 ---------------------------------- */ + [BTTV_BOARD_FLYVIDEO] = { + .name = "Lifeview FlyVideo II (Bt848) LR26 / MAXI TV Video PCI2 LR26", + .video_inputs = 4, + .audio_inputs = 1, + .tuner = 0, + .svhs = 2, + .gpiomask = 0xc00, + .muxsel = { 2, 3, 1, 1 }, + .audiomux = { 0, 0xc00, 0x800, 0x400, 0xc00, 0 }, + .needs_tvaudio = 1, + .pll = PLL_28, + .tuner_type = -1, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + }, + [BTTV_BOARD_TURBOTV] = { + .name = "IMS/IXmicro TurboTV", + .video_inputs = 3, + .audio_inputs = 1, + .tuner = 0, + .svhs = 2, + .gpiomask = 3, + .muxsel = { 2, 3, 1, 1 }, + .audiomux = { 1, 1, 2, 3, 0 }, + .needs_tvaudio = 0, + .pll = PLL_28, + .tuner_type = TUNER_TEMIC_PAL, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + }, + [BTTV_BOARD_HAUPPAUGE878] = { + .name = "Hauppauge (bt878)", + .video_inputs = 4, + .audio_inputs = 1, + .tuner = 0, + .svhs = 2, + .gpiomask = 0x0f, /* old: 7 */ + .muxsel = { 2, 0, 1, 1 }, + .audiomux = { 0, 1, 2, 3, 4 }, + .needs_tvaudio = 1, + .pll = PLL_28, + .tuner_type = -1, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + }, + [BTTV_BOARD_MIROPRO] = { + .name = "MIRO PCTV pro", + .video_inputs = 3, + .audio_inputs = 1, + .tuner = 0, + .svhs = 2, + .gpiomask = 0x3014f, + .muxsel = { 2, 3, 1, 1 }, + .audiomux = { 0x20001,0x10001, 0, 0,10 }, + .needs_tvaudio = 1, + .tuner_type = -1, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + }, + + /* ---- card 0x0c ---------------------------------- */ + [BTTV_BOARD_ADSTECH_TV] = { + .name = "ADS Technologies Channel Surfer TV (bt848)", + .video_inputs = 3, + .audio_inputs = 1, + .tuner = 0, + .svhs = 2, + .gpiomask = 15, + .muxsel = { 2, 3, 1, 1 }, + .audiomux = { 13, 14, 11, 7, 0, 0 }, + .needs_tvaudio = 1, + .tuner_type = -1, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + }, + [BTTV_BOARD_AVERMEDIA98] = { + .name = "AVerMedia TVCapture 98", + .video_inputs = 3, + .audio_inputs = 4, + .tuner = 0, + .svhs = 2, + .gpiomask = 15, + .muxsel = { 2, 3, 1, 1 }, + .audiomux = { 13, 14, 11, 7, 0, 0 }, + .needs_tvaudio = 1, + .msp34xx_alt = 1, + .pll = PLL_28, + .tuner_type = TUNER_PHILIPS_PAL, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + .audio_hook = avermedia_tv_stereo_audio, + .no_gpioirq = 1, + }, + [BTTV_BOARD_VHX] = { + .name = "Aimslab Video Highway Xtreme (VHX)", + .video_inputs = 3, + .audio_inputs = 1, + .tuner = 0, + .svhs = 2, + .gpiomask = 7, + .muxsel = { 2, 3, 1, 1 }, + .audiomux = { 0, 2, 1, 3, 4 }, /* old: {0, 1, 2, 3, 4} */ + .needs_tvaudio = 1, + .pll = PLL_28, + .tuner_type = -1, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + }, + [BTTV_BOARD_ZOLTRIX] = { + .name = "Zoltrix TV-Max", + .video_inputs = 3, + .audio_inputs = 1, + .tuner = 0, + .svhs = 2, + .gpiomask = 15, + .muxsel = { 2, 3, 1, 1 }, + .audiomux = { 0 , 0, 1 , 0, 10 }, + .needs_tvaudio = 1, + .tuner_type = -1, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + }, + + /* ---- card 0x10 ---------------------------------- */ + [BTTV_BOARD_PIXVIEWPLAYTV] = { + .name = "Prolink Pixelview PlayTV (bt878)", + .video_inputs = 3, + .audio_inputs = 1, + .tuner = 0, + .svhs = 2, + .gpiomask = 0x01fe00, + .muxsel = { 2, 3, 1, 1 }, + #if 0 + /* old */ + .audiomux = { 0x01c000, 0, 0x018000, 0x014000, 0x002000, 0 }, + #else + /* 2003-10-20 by "Anton A. Arapov" */ + .audiomux = { 0x001e00, 0, 0x018000, 0x014000, 0x002000, 0 }, + #endif + .needs_tvaudio = 1, + .pll = PLL_28, + .tuner_type = -1, + }, + [BTTV_BOARD_WINVIEW_601] = { + .name = "Leadtek WinView 601", + .video_inputs = 3, + .audio_inputs = 1, + .tuner = 0, + .svhs = 2, + .gpiomask = 0x8300f8, + .muxsel = { 2, 3, 1, 1,0 }, + .audiomux = { 0x4fa007,0xcfa007,0xcfa007,0xcfa007,0xcfa007,0xcfa007 }, + .needs_tvaudio = 1, + .tuner_type = -1, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + .audio_hook = winview_audio, + .has_radio = 1, + }, + [BTTV_BOARD_AVEC_INTERCAP] = { + .name = "AVEC Intercapture", + .video_inputs = 3, + .audio_inputs = 2, + .tuner = 0, + .svhs = 2, + .gpiomask = 0, + .muxsel = { 2, 3, 1, 1 }, + .audiomux = { 1, 0, 0, 0, 0 }, + .needs_tvaudio = 1, + .tuner_type = -1, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + }, + [BTTV_BOARD_LIFE_FLYKIT] = { + .name = "Lifeview FlyVideo II EZ /FlyKit LR38 Bt848 (capture only)", + .video_inputs = 4, + .audio_inputs = 1, + .tuner = -1, + .svhs = -1, + .gpiomask = 0x8dff00, + .muxsel = { 2, 3, 1, 1 }, + .audiomux = { 0 }, + .no_msp34xx = 1, + .tuner_type = -1, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + }, + + /* ---- card 0x14 ---------------------------------- */ + [BTTV_BOARD_CEI_RAFFLES] = { + .name = "CEI Raffles Card", + .video_inputs = 3, + .audio_inputs = 3, + .tuner = 0, + .svhs = 2, + .muxsel = { 2, 3, 1, 1 }, + .tuner_type = -1, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + }, + [BTTV_BOARD_CONFERENCETV] = { + .name = "Lifeview FlyVideo 98/ Lucky Star Image World ConferenceTV LR50", + .video_inputs = 4, + .audio_inputs = 2, /* tuner, line in */ + .tuner = 0, + .svhs = 2, + .gpiomask = 0x1800, + .muxsel = { 2, 3, 1, 1 }, + .audiomux = { 0, 0x800, 0x1000, 0x1000, 0x1800 }, + .pll = PLL_28, + .tuner_type = TUNER_PHILIPS_PAL_I, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + }, + [BTTV_BOARD_PHOEBE_TVMAS] = { + .name = "Askey CPH050/ Phoebe Tv Master + FM", + .video_inputs = 3, + .audio_inputs = 1, + .tuner = 0, + .svhs = 2, + .gpiomask = 0xc00, + .muxsel = { 2, 3, 1, 1 }, + .audiomux = { 0, 1, 0x800, 0x400, 0xc00, 0 }, + .needs_tvaudio = 1, + .pll = PLL_28, + .tuner_type = -1, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + }, + [BTTV_BOARD_MODTEC_205] = { + .name = "Modular Technology MM201/MM202/MM205/MM210/MM215 PCTV, bt878", + .video_inputs = 3, + .audio_inputs = 1, + .tuner = 0, + .svhs = -1, + .gpiomask = 7, + .muxsel = { 2, 3, -1 }, + .digital_mode = DIGITAL_MODE_CAMERA, + .audiomux = { 0, 0, 0, 0, 0 }, + .no_msp34xx = 1, + .pll = PLL_28, + .tuner_type = TUNER_ALPS_TSBB5_PAL_I, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + }, + + /* ---- card 0x18 ---------------------------------- */ + [BTTV_BOARD_MAGICTVIEW061] = { + .name = "Askey CPH05X/06X (bt878) [many vendors]", + .video_inputs = 3, + .audio_inputs = 1, + .tuner = 0, + .svhs = 2, + .gpiomask = 0xe00, + .muxsel = { 2, 3, 1, 1 }, + .audiomux = {0x400, 0x400, 0x400, 0x400, 0xc00 }, + .needs_tvaudio = 1, + .pll = PLL_28, + .tuner_type = -1, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + .has_remote = 1, + }, + [BTTV_BOARD_VOBIS_BOOSTAR] = { + .name = "Terratec TerraTV+ Version 1.0 (Bt848)/ Terra TValue Version 1.0/ Vobis TV-Boostar", + .video_inputs = 3, + .audio_inputs = 1, + .tuner = 0, + .svhs = 2, + .gpiomask = 0x1f0fff, + .muxsel = { 2, 3, 1, 1 }, + .audiomux = { 0x20000, 0x30000, 0x10000, 0, 0x40000 }, + .needs_tvaudio = 0, + .tuner_type = TUNER_PHILIPS_PAL, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + .audio_hook = terratv_audio, + }, + [BTTV_BOARD_HAUPPAUG_WCAM] = { + .name = "Hauppauge WinCam newer (bt878)", + .video_inputs = 4, + .audio_inputs = 1, + .tuner = 0, + .svhs = 3, + .gpiomask = 7, + .muxsel = { 2, 0, 1, 1 }, + .audiomux = { 0, 1, 2, 3, 4 }, + .needs_tvaudio = 1, + .tuner_type = -1, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + }, + [BTTV_BOARD_MAXI] = { + .name = "Lifeview FlyVideo 98/ MAXI TV Video PCI2 LR50", + .video_inputs = 4, + .audio_inputs = 2, + .tuner = 0, + .svhs = 2, + .gpiomask = 0x1800, + .muxsel = { 2, 3, 1, 1 }, + .audiomux = { 0, 0x800, 0x1000, 0x1000, 0x1800 }, + .pll = PLL_28, + .tuner_type = TUNER_PHILIPS_SECAM, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + }, + + /* ---- card 0x1c ---------------------------------- */ + [BTTV_BOARD_TERRATV] = { + .name = "Terratec TerraTV+ Version 1.1 (bt878)", + .video_inputs = 3, + .audio_inputs = 1, + .tuner = 0, + .svhs = 2, + .gpiomask = 0x1f0fff, + .muxsel = { 2, 3, 1, 1 }, + .audiomux = { 0x20000, 0x30000, 0x10000, 0x00000, 0x40000 }, + .needs_tvaudio = 0, + .tuner_type = TUNER_PHILIPS_PAL, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + .audio_hook = terratv_audio, + /* GPIO wiring: + External 20 pin connector (for Active Radio Upgrade board) + gpio00: i2c-sda + gpio01: i2c-scl + gpio02: om5610-data + gpio03: om5610-clk + gpio04: om5610-wre + gpio05: om5610-stereo + gpio06: rds6588-davn + gpio07: Pin 7 n.c. + gpio08: nIOW + gpio09+10: nIOR, nSEL ?? (bt878) + gpio09: nIOR (bt848) + gpio10: nSEL (bt848) + Sound Routing: + gpio16: u2-A0 (1st 4052bt) + gpio17: u2-A1 + gpio18: u2-nEN + gpio19: u4-A0 (2nd 4052) + gpio20: u4-A1 + u4-nEN - GND + Btspy: + 00000 : Cdrom (internal audio input) + 10000 : ext. Video audio input + 20000 : TV Mono + a0000 : TV Mono/2 + 1a0000 : TV Stereo + 30000 : Radio + 40000 : Mute + */ + + }, + [BTTV_BOARD_PXC200] = { + /* Jannik Fritsch */ + .name = "Imagenation PXC200", + .video_inputs = 5, + .audio_inputs = 1, + .tuner = -1, + .svhs = 1, /* was: 4 */ + .gpiomask = 0, + .muxsel = { 2, 3, 1, 0, 0}, + .audiomux = { 0 }, + .needs_tvaudio = 1, + .tuner_type = -1, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + .muxsel_hook = PXC200_muxsel, + + }, + [BTTV_BOARD_FLYVIDEO_98] = { + .name = "Lifeview FlyVideo 98 LR50", + .video_inputs = 4, + .audio_inputs = 1, + .tuner = 0, + .svhs = 2, + .gpiomask = 0x1800, /* 0x8dfe00 */ + .muxsel = { 2, 3, 1, 1 }, + .audiomux = { 0, 0x0800, 0x1000, 0x1000, 0x1800, 0 }, + .pll = PLL_28, + .tuner_type = -1, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + }, + [BTTV_BOARD_IPROTV] = { + .name = "Formac iProTV, Formac ProTV I (bt848)", + .video_inputs = 4, + .audio_inputs = 1, + .tuner = 0, + .svhs = 3, + .gpiomask = 1, + .muxsel = { 2, 3, 1, 1 }, + .audiomux = { 1, 0, 0, 0, 0 }, + .pll = PLL_28, + .tuner_type = TUNER_PHILIPS_PAL, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + }, + + /* ---- card 0x20 ---------------------------------- */ + [BTTV_BOARD_INTEL_C_S_PCI] = { + .name = "Intel Create and Share PCI/ Smart Video Recorder III", + .video_inputs = 4, + .audio_inputs = 0, + .tuner = -1, + .svhs = 2, + .gpiomask = 0, + .muxsel = { 2, 3, 1, 1 }, + .audiomux = { 0 }, + .needs_tvaudio = 0, + .tuner_type = 4, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + }, + [BTTV_BOARD_TERRATVALUE] = { + .name = "Terratec TerraTValue Version Bt878", + .video_inputs = 3, + .audio_inputs = 1, + .tuner = 0, + .svhs = 2, + .gpiomask = 0xffff00, + .muxsel = { 2, 3, 1, 1 }, + .audiomux = { 0x500, 0, 0x300, 0x900, 0x900 }, + .needs_tvaudio = 1, + .pll = PLL_28, + .tuner_type = TUNER_PHILIPS_PAL, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + }, + [BTTV_BOARD_WINFAST2000] = { + .name = "Leadtek WinFast 2000/ WinFast 2000 XP", + .video_inputs = 4, + .audio_inputs = 1, + .tuner = 0, + .svhs = 2, + .muxsel = { 2, 3, 1, 1, 0 }, /* TV, CVid, SVid, CVid over SVid connector */ + #if 0 + .gpiomask = 0xc33000, + .audiomux = { 0x422000,0x1000,0x0000,0x620000,0x800000 }, + #else + /* Alexander Varakin [stereo version] */ + .gpiomask = 0xb33000, + .audiomux = { 0x122000,0x1000,0x0000,0x620000,0x800000 }, + #endif + /* Audio Routing for "WinFast 2000 XP" (no tv stereo !) + gpio23 -- hef4052:nEnable (0x800000) + gpio12 -- hef4052:A1 + gpio13 -- hef4052:A0 + 0x0000: external audio + 0x1000: FM + 0x2000: TV + 0x3000: n.c. + Note: There exists another variant "Winfast 2000" with tv stereo !? + Note: eeprom only contains FF and pci subsystem id 107d:6606 + */ + .needs_tvaudio = 0, + .pll = PLL_28, + .has_radio = 1, + .tuner_type = 5, /* default for now, gpio reads BFFF06 for Pal bg+dk */ + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + .audio_hook = winfast2000_audio, + .has_remote = 1, + }, + [BTTV_BOARD_CHRONOS_VS2] = { + .name = "Lifeview FlyVideo 98 LR50 / Chronos Video Shuttle II", + .video_inputs = 4, + .audio_inputs = 3, + .tuner = 0, + .svhs = 2, + .gpiomask = 0x1800, + .muxsel = { 2, 3, 1, 1 }, + .audiomux = { 0, 0x800, 0x1000, 0x1000, 0x1800 }, + .pll = PLL_28, + .tuner_type = -1, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + }, + + /* ---- card 0x24 ---------------------------------- */ + [BTTV_BOARD_TYPHOON_TVIEW] = { + .name = "Lifeview FlyVideo 98FM LR50 / Typhoon TView TV/FM Tuner", + .video_inputs = 4, + .audio_inputs = 3, + .tuner = 0, + .svhs = 2, + .gpiomask = 0x1800, + .muxsel = { 2, 3, 1, 1 }, + .audiomux = { 0, 0x800, 0x1000, 0x1000, 0x1800, 0 }, + .pll = PLL_28, + .tuner_type = -1, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + .has_radio = 1, + }, + [BTTV_BOARD_PXELVWPLTVPRO] = { + .name = "Prolink PixelView PlayTV pro", + .video_inputs = 3, + .audio_inputs = 1, + .tuner = 0, + .svhs = 2, + .gpiomask = 0xff, + .muxsel = { 2, 3, 1, 1 }, + .audiomux = { 0x21, 0x20, 0x24, 0x2c, 0x29, 0x29 }, + .no_msp34xx = 1, + .pll = PLL_28, + .tuner_type = -1, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + }, + [BTTV_BOARD_MAGICTVIEW063] = { + .name = "Askey CPH06X TView99", + .video_inputs = 4, + .audio_inputs = 1, + .tuner = 0, + .svhs = 2, + .gpiomask = 0x551e00, + .muxsel = { 2, 3, 1, 0 }, + .audiomux = { 0x551400, 0x551200, 0, 0, 0x551c00, 0x551200 }, + .needs_tvaudio = 1, + .pll = PLL_28, + .tuner_type = 1, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + .has_remote = 1, + }, + [BTTV_BOARD_PINNACLE] = { + .name = "Pinnacle PCTV Studio/Rave", + .video_inputs = 3, + .audio_inputs = 1, + .tuner = 0, + .svhs = 2, + .gpiomask = 0x03000F, + .muxsel = { 2, 3, 1, 1 }, + .audiomux = { 2, 0xd0001, 0, 0, 1 }, + .needs_tvaudio = 0, + .pll = PLL_28, + .tuner_type = -1, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + }, + + /* ---- card 0x28 ---------------------------------- */ + [BTTV_BOARD_STB2] = { + .name = "STB TV PCI FM, Gateway P/N 6000704 (bt878), 3Dfx VoodooTV 100", + .video_inputs = 3, + .audio_inputs = 1, + .tuner = 0, + .svhs = 2, + .gpiomask = 7, + .muxsel = { 2, 3, 1, 1 }, + .audiomux = { 4, 0, 2, 3, 1 }, + .no_msp34xx = 1, + .needs_tvaudio = 1, + .tuner_type = TUNER_PHILIPS_NTSC, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + .pll = PLL_28, + .has_radio = 1, + }, + [BTTV_BOARD_AVPHONE98] = { + .name = "AVerMedia TVPhone 98", + .video_inputs = 3, + .audio_inputs = 4, + .tuner = 0, + .svhs = 2, + .gpiomask = 15, + .muxsel = { 2, 3, 1, 1 }, + .audiomux = { 13, 4, 11, 7, 0, 0 }, + .needs_tvaudio = 1, + .pll = PLL_28, + .tuner_type = -1, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + .has_radio = 1, + .audio_hook = avermedia_tvphone_audio, + }, + [BTTV_BOARD_PV951] = { + .name = "ProVideo PV951", /* pic16c54 */ + .video_inputs = 3, + .audio_inputs = 1, + .tuner = 0, + .svhs = 2, + .gpiomask = 0, + .muxsel = { 2, 3, 1, 1}, + .audiomux = { 0, 0, 0, 0, 0}, + .needs_tvaudio = 1, + .no_msp34xx = 1, + .pll = PLL_28, + .tuner_type = 1, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + }, + [BTTV_BOARD_ONAIR_TV] = { + .name = "Little OnAir TV", + .video_inputs = 3, + .audio_inputs = 1, + .tuner = 0, + .svhs = 2, + .gpiomask = 0xe00b, + .muxsel = { 2, 3, 1, 1 }, + .audiomux = { 0xff9ff6, 0xff9ff6, 0xff1ff7, 0, 0xff3ffc }, + .no_msp34xx = 1, + .tuner_type = -1, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + }, + + /* ---- card 0x2c ---------------------------------- */ + [BTTV_BOARD_SIGMA_TVII_FM] = { + .name = "Sigma TVII-FM", + .video_inputs = 2, + .audio_inputs = 1, + .tuner = 0, + .svhs = -1, + .gpiomask = 3, + .muxsel = { 2, 3, 1, 1 }, + .audiomux = { 1, 1, 0, 2, 3 }, + .no_msp34xx = 1, + .pll = PLL_NONE, + .tuner_type = -1, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + }, + [BTTV_BOARD_MATRIX_VISION2] = { + .name = "MATRIX-Vision MV-Delta 2", + .video_inputs = 5, + .audio_inputs = 1, + .tuner = -1, + .svhs = 3, + .gpiomask = 0, + .muxsel = { 2, 3, 1, 0, 0 }, + .audiomux = { 0 }, + .no_msp34xx = 1, + .pll = PLL_28, + .tuner_type = -1, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + }, + [BTTV_BOARD_ZOLTRIX_GENIE] = { + .name = "Zoltrix Genie TV/FM", + .video_inputs = 3, + .audio_inputs = 1, + .tuner = 0, + .svhs = 2, + .gpiomask = 0xbcf03f, + .muxsel = { 2, 3, 1, 1 }, + .audiomux = { 0xbc803f, 0xbc903f, 0xbcb03f, 0, 0xbcb03f }, + .no_msp34xx = 1, + .pll = PLL_28, + .tuner_type = 21, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + }, + [BTTV_BOARD_TERRATVRADIO] = { + .name = "Terratec TV/Radio+", + .video_inputs = 3, + .audio_inputs = 1, + .tuner = 0, + .svhs = 2, + .gpiomask = 0x70000, + .muxsel = { 2, 3, 1, 1 }, + .audiomux = { 0x20000, 0x30000, 0x10000, 0, 0x40000, 0x20000 }, + .needs_tvaudio = 1, + .no_msp34xx = 1, + .pll = PLL_35, + .tuner_type = 1, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + .has_radio = 1, + }, + + /* ---- card 0x30 ---------------------------------- */ + [BTTV_BOARD_DYNALINK] = { + .name = "Askey CPH03x/ Dynalink Magic TView", + .video_inputs = 3, + .audio_inputs = 1, + .tuner = 0, + .svhs = 2, + .gpiomask = 15, + .muxsel = { 2, 3, 1, 1 }, + .audiomux = {2,0,0,0,1 }, + .needs_tvaudio = 1, + .pll = PLL_28, + .tuner_type = -1, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + }, + [BTTV_BOARD_GVBCTV3PCI] = { + .name = "IODATA GV-BCTV3/PCI", + .video_inputs = 3, + .audio_inputs = 1, + .tuner = 0, + .svhs = 2, + .gpiomask = 0x010f00, + .muxsel = {2, 3, 0, 0 }, + .audiomux = {0x10000, 0, 0x10000, 0, 0, 0 }, + .no_msp34xx = 1, + .pll = PLL_28, + .tuner_type = TUNER_ALPS_TSHC6_NTSC, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + .audio_hook = gvbctv3pci_audio, + }, + [BTTV_BOARD_PXELVWPLTVPAK] = { + .name = "Prolink PV-BT878P+4E / PixelView PlayTV PAK / Lenco MXTV-9578 CP", + .video_inputs = 5, + .audio_inputs = 1, + .tuner = 0, + .svhs = 3, + .gpiomask = 0xAA0000, + .muxsel = { 2,3,1,1,-1 }, + .digital_mode = DIGITAL_MODE_CAMERA, + .audiomux = { 0x20000, 0, 0x80000, 0x80000, 0xa8000, 0x46000 }, + .no_msp34xx = 1, + .pll = PLL_28, + .tuner_type = TUNER_PHILIPS_PAL_I, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + .has_remote = 1, + /* GPIO wiring: (different from Rev.4C !) + GPIO17: U4.A0 (first hef4052bt) + GPIO19: U4.A1 + GPIO20: U5.A1 (second hef4052bt) + GPIO21: U4.nEN + GPIO22: BT832 Reset Line + GPIO23: A5,A0, U5,nEN + Note: At i2c=0x8a is a Bt832 chip, which changes to 0x88 after being reset via GPIO22 + */ + }, + [BTTV_BOARD_EAGLE] = { + .name = "Eagle Wireless Capricorn2 (bt878A)", + .video_inputs = 4, + .audio_inputs = 1, + .tuner = 0, + .svhs = 2, + .gpiomask = 7, + .muxsel = { 2, 0, 1, 1 }, + .audiomux = { 0, 1, 2, 3, 4 }, + .pll = PLL_28, + .tuner_type = -1 /* TUNER_ALPS_TMDH2_NTSC */, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + }, + + /* ---- card 0x34 ---------------------------------- */ + [BTTV_BOARD_PINNACLEPRO] = { + /* David Härdeman */ + .name = "Pinnacle PCTV Studio Pro", + .video_inputs = 4, + .audio_inputs = 1, + .tuner = 0, + .svhs = 3, + .gpiomask = 0x03000F, + .muxsel = { 2, 3, 1, 1 }, + .audiomux = { 1, 0xd0001, 0, 0, 10 }, + /* sound path (5 sources): + MUX1 (mask 0x03), Enable Pin 0x08 (0=enable, 1=disable) + 0= ext. Audio IN + 1= from MUX2 + 2= Mono TV sound from Tuner + 3= not connected + MUX2 (mask 0x30000): + 0,2,3= from MSP34xx + 1= FM stereo Radio from Tuner */ + .needs_tvaudio = 0, + .pll = PLL_28, + .tuner_type = -1, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + }, + [BTTV_BOARD_TVIEW_RDS_FM] = { + /* Claas Langbehn , + Sven Grothklags */ + .name = "Typhoon TView RDS + FM Stereo / KNC1 TV Station RDS", + .video_inputs = 4, + .audio_inputs = 3, + .tuner = 0, + .svhs = 2, + .gpiomask = 0x1c, + .muxsel = { 2, 3, 1, 1 }, + .audiomux = { 0, 0, 0x10, 8, 4 }, + .needs_tvaudio = 1, + .pll = PLL_28, + .tuner_type = TUNER_PHILIPS_PAL, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + .has_radio = 1, + }, + [BTTV_BOARD_LIFETEC_9415] = { + /* Tim Röstermundt + in de.comp.os.unix.linux.hardware: + options bttv card=0 pll=1 radio=1 gpiomask=0x18e0 + audiomux=0x44c71f,0x44d71f,0,0x44d71f,0x44dfff + options tuner type=5 */ + .name = "Lifeview FlyVideo 2000 /FlyVideo A2/ Lifetec LT 9415 TV [LR90]", + .video_inputs = 4, + .audio_inputs = 1, + .tuner = 0, + .svhs = 2, + .gpiomask = 0x18e0, + .muxsel = { 2, 3, 1, 1 }, + .audiomux = { 0x0000,0x0800,0x1000,0x1000,0x18e0 }, + /* For cards with tda9820/tda9821: + 0x0000: Tuner normal stereo + 0x0080: Tuner A2 SAP (second audio program = Zweikanalton) + 0x0880: Tuner A2 stereo */ + .pll = PLL_28, + .tuner_type = -1, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + }, + [BTTV_BOARD_BESTBUY_EASYTV] = { + /* Miguel Angel Alvarez + old Easy TV BT848 version (model CPH031) */ + .name = "Askey CPH031/ BESTBUY Easy TV", + .video_inputs = 4, + .audio_inputs = 1, + .tuner = 0, + .svhs = 2, + .gpiomask = 0xF, + .muxsel = { 2, 3, 1, 0 }, + .audiomux = { 2, 0, 0, 0, 10 }, + .needs_tvaudio = 0, + .pll = PLL_28, + .tuner_type = TUNER_TEMIC_PAL, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + }, + + /* ---- card 0x38 ---------------------------------- */ + [BTTV_BOARD_FLYVIDEO_98FM] = { + /* Gordon Heydon */ + [BTTV_BOARD_GRANDTEC] = { + .name = "GrandTec 'Grand Video Capture' (Bt848)", + .video_inputs = 2, + .audio_inputs = 0, + .tuner = -1, + .svhs = 1, + .gpiomask = 0, + .muxsel = { 3, 1 }, + .audiomux = { 0 }, + .needs_tvaudio = 0, + .no_msp34xx = 1, + .pll = PLL_35, + .tuner_type = -1, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + }, + [BTTV_BOARD_ASKEY_CPH060] = { + /* Daniel Herrington */ + .name = "Askey CPH060/ Phoebe TV Master Only (No FM)", + .video_inputs = 3, + .audio_inputs = 1, + .tuner = 0, + .svhs = 2, + .gpiomask = 0xe00, + .muxsel = { 2, 3, 1, 1}, + .audiomux = { 0x400, 0x400, 0x400, 0x400, 0x800, 0x400 }, + .needs_tvaudio = 1, + .pll = PLL_28, + .tuner_type = TUNER_TEMIC_4036FY5_NTSC, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + }, + [BTTV_BOARD_ASKEY_CPH03X] = { + /* Matti Mottus */ + .name = "Askey CPH03x TV Capturer", + .video_inputs = 4, + .audio_inputs = 1, + .tuner = 0, + .svhs = 2, + .gpiomask = 0x03000F, + .muxsel = { 2, 3, 1, 0 }, + .audiomux = { 2, 0, 0, 0, 1 }, + .pll = PLL_28, + .tuner_type = 0, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + }, + + /* ---- card 0x3c ---------------------------------- */ + [BTTV_BOARD_MM100PCTV] = { + /* Philip Blundell */ + .name = "Modular Technology MM100PCTV", + .video_inputs = 2, + .audio_inputs = 2, + .tuner = 0, + .svhs = -1, + .gpiomask = 11, + .muxsel = { 2, 3, 1, 1 }, + .audiomux = { 2, 0, 0, 1, 8 }, + .pll = PLL_35, + .tuner_type = TUNER_TEMIC_PAL, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + }, + [BTTV_BOARD_GMV1] = { + /* Adrian Cox + new Easy TV BT878 version (model CPH061) + special thanks to Informatica Mieres for providing the card */ + .name = "Askey CPH061/ BESTBUY Easy TV (bt878)", + .video_inputs = 3, + .audio_inputs = 2, + .tuner = 0, + .svhs = 2, + .gpiomask = 0xFF, + .muxsel = { 2, 3, 1, 0 }, + .audiomux = { 1, 0, 4, 4, 9 }, + .needs_tvaudio = 0, + .pll = PLL_28, + .tuner_type = TUNER_PHILIPS_PAL, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + }, + [BTTV_BOARD_ATI_TVWONDER] = { + /* Lukas Gebauer */ + .name = "ATI TV-Wonder", + .video_inputs = 3, + .audio_inputs = 1, + .tuner = 0, + .svhs = 2, + .gpiomask = 0xf03f, + .muxsel = { 2, 3, 1, 0 }, + .audiomux = { 0xbffe, 0, 0xbfff, 0, 0xbffe }, + .pll = PLL_28, + .tuner_type = TUNER_TEMIC_4006FN5_MULTI_PAL, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + }, + + /* ---- card 0x40 ---------------------------------- */ + [BTTV_BOARD_ATI_TVWONDERVE] = { + /* Lukas Gebauer */ + .name = "ATI TV-Wonder VE", + .video_inputs = 2, + .audio_inputs = 1, + .tuner = 0, + .svhs = -1, + .gpiomask = 1, + .muxsel = { 2, 3, 0, 1 }, + .audiomux = { 0, 0, 1, 0, 0 }, + .no_msp34xx = 1, + .pll = PLL_28, + .tuner_type = TUNER_TEMIC_4006FN5_MULTI_PAL, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + }, + [BTTV_BOARD_FLYVIDEO2000] = { + /* DeeJay */ + .name = "IODATA GV-BCTV4/PCI", + .video_inputs = 3, + .audio_inputs = 1, + .tuner = 0, + .svhs = 2, + .gpiomask = 0x010f00, + .muxsel = {2, 3, 0, 0 }, + .audiomux = {0x10000, 0, 0x10000, 0, 0, 0 }, + .no_msp34xx = 1, + .pll = PLL_28, + .tuner_type = TUNER_SHARP_2U5JF5540_NTSC, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + .audio_hook = gvbctv3pci_audio, + }, + + /* ---- card 0x44 ---------------------------------- */ + [BTTV_BOARD_VOODOOTV_FM] = { + .name = "3Dfx VoodooTV FM (Euro), VoodooTV 200 (USA)", + /* try "insmod msp3400 simple=0" if you have + * sound problems with this card. */ + .video_inputs = 4, + .audio_inputs = 1, + .tuner = 0, + .svhs = -1, + .gpiomask = 0x4f8a00, + /* 0x100000: 1=MSP enabled (0=disable again) + * 0x010000: Connected to "S0" on tda9880 (0=Pal/BG, 1=NTSC) */ + .audiomux = {0x947fff, 0x987fff,0x947fff,0x947fff, 0x947fff}, + /* tvtuner, radio, external,internal, mute, stereo + * tuner, Composit, SVid, Composit-on-Svid-adapter */ + .muxsel = { 2, 3 ,0 ,1 }, + .tuner_type = TUNER_MT2032, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + .pll = PLL_28, + .has_radio = 1, + }, + [BTTV_BOARD_AIMMS] = { + /* Philip Blundell */ + .name = "Active Imaging AIMMS", + .video_inputs = 1, + .audio_inputs = 0, + .tuner = -1, + .tuner_type = -1, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + .pll = PLL_28, + .muxsel = { 2 }, + .gpiomask = 0 + }, + [BTTV_BOARD_PV_BT878P_PLUS] = { + /* Tomasz Pyra */ + .name = "Prolink Pixelview PV-BT878P+ (Rev.4C,8E)", + .video_inputs = 3, + .audio_inputs = 4, + .tuner = 0, + .svhs = 2, + .gpiomask = 15, + .muxsel = { 2, 3, 1, 1 }, + .audiomux = { 0, 0, 11, 7, 13, 0 }, /* TV and Radio with same GPIO ! */ + .needs_tvaudio = 1, + .pll = PLL_28, + .tuner_type = 25, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + .has_remote = 1, + /* GPIO wiring: + GPIO0: U4.A0 (hef4052bt) + GPIO1: U4.A1 + GPIO2: U4.A1 (second hef4052bt) + GPIO3: U4.nEN, U5.A0, A5.nEN + GPIO8-15: vrd866b ? + */ + }, + [BTTV_BOARD_FLYVIDEO98EZ] = { + .name = "Lifeview FlyVideo 98EZ (capture only) LR51", + .video_inputs = 4, + .audio_inputs = 0, + .tuner = -1, + .svhs = 2, + .muxsel = { 2, 3, 1, 1 }, /* AV1, AV2, SVHS, CVid adapter on SVHS */ + .pll = PLL_28, + .no_msp34xx = 1, + .tuner_type = UNSET, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + }, + + /* ---- card 0x48 ---------------------------------- */ + [BTTV_BOARD_PV_BT878P_9B] = { + /* Dariusz Kowalewski */ + .name = "Prolink Pixelview PV-BT878P+9B (PlayTV Pro rev.9B FM+NICAM)", + .video_inputs = 4, + .audio_inputs = 1, + .tuner = 0, + .svhs = 2, + .gpiomask = 0x3f, + .muxsel = { 2, 3, 1, 1 }, + .audiomux = { 0x01, 0x00, 0x03, 0x03, 0x09, 0x02 }, + .needs_tvaudio = 1, + .no_msp34xx = 1, + .no_tda9875 = 1, + .pll = PLL_28, + .tuner_type = 5, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + .audio_hook = pvbt878p9b_audio, /* Note: not all cards have stereo */ + .has_radio = 1, /* Note: not all cards have radio */ + .has_remote = 1, + /* GPIO wiring: + GPIO0: A0 hef4052 + GPIO1: A1 hef4052 + GPIO3: nEN hef4052 + GPIO8-15: vrd866b + GPIO20,22,23: R30,R29,R28 + */ + }, + [BTTV_BOARD_SENSORAY311] = { + /* Clay Kunz */ + /* you must jumper JP5 for the card to work */ + .name = "Sensoray 311", + .video_inputs = 5, + .audio_inputs = 0, + .tuner = -1, + .svhs = 4, + .gpiomask = 0, + .muxsel = { 2, 3, 1, 0, 0 }, + .audiomux = { 0 }, + .needs_tvaudio = 0, + .tuner_type = -1, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + }, + [BTTV_BOARD_RV605] = { + /* Miguel Freitas */ + .name = "RemoteVision MX (RV605)", + .video_inputs = 16, + .audio_inputs = 0, + .tuner = -1, + .svhs = -1, + .gpiomask = 0x00, + .gpiomask2 = 0x07ff, + .muxsel = { 0x33, 0x13, 0x23, 0x43, 0xf3, 0x73, 0xe3, 0x03, + 0xd3, 0xb3, 0xc3, 0x63, 0x93, 0x53, 0x83, 0xa3 }, + .no_msp34xx = 1, + .no_tda9875 = 1, + .tuner_type = -1, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + .muxsel_hook = rv605_muxsel, + }, + [BTTV_BOARD_POWERCLR_MTV878] = { + .name = "Powercolor MTV878/ MTV878R/ MTV878F", + .video_inputs = 3, + .audio_inputs = 2, + .tuner = 0, + .svhs = 2, + .gpiomask = 0x1C800F, /* Bit0-2: Audio select, 8-12:remote control 14:remote valid 15:remote reset */ + .muxsel = { 2, 1, 1, }, + .audiomux = { 0, 1, 2, 2, 4 }, + .needs_tvaudio = 0, + .tuner_type = TUNER_PHILIPS_PAL, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + .pll = PLL_28, + .has_radio = 1, + }, + + /* ---- card 0x4c ---------------------------------- */ + [BTTV_BOARD_WINDVR] = { + /* Masaki Suzuki */ + .name = "Canopus WinDVR PCI (COMPAQ Presario 3524JP, 5112JP)", + .video_inputs = 3, + .audio_inputs = 1, + .tuner = 0, + .svhs = 2, + .gpiomask = 0x140007, + .muxsel = { 2, 3, 1, 1 }, + .audiomux = { 0, 1, 2, 3, 4, 0 }, + .tuner_type = TUNER_PHILIPS_NTSC, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + .audio_hook = windvr_audio, + }, + [BTTV_BOARD_GRANDTEC_MULTI] = { + .name = "GrandTec Multi Capture Card (Bt878)", + .video_inputs = 4, + .audio_inputs = 0, + .tuner = -1, + .svhs = -1, + .gpiomask = 0, + .muxsel = { 2, 3, 1, 0 }, + .audiomux = { 0 }, + .needs_tvaudio = 0, + .no_msp34xx = 1, + .pll = PLL_28, + .tuner_type = -1, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + }, + [BTTV_BOARD_KWORLD] = { + .name = "Jetway TV/Capture JW-TV878-FBK, Kworld KW-TV878RF", + .video_inputs = 4, + .audio_inputs = 3, + .tuner = 0, + .svhs = 2, + .gpiomask = 7, + .muxsel = { 2, 3, 1, 1 }, /* Tuner, SVid, SVHS, SVid to SVHS connector */ + .audiomux = { 0 ,0 ,4, 4,4,4},/* Yes, this tuner uses the same audio output for TV and FM radio! + * This card lacks external Audio In, so we mute it on Ext. & Int. + * The PCB can take a sbx1637/sbx1673, wiring unknown. + * This card lacks PCI subsystem ID, sigh. + * audiomux=1: lower volume, 2+3: mute + * btwincap uses 0x80000/0x80003 + */ + .needs_tvaudio = 0, + .no_msp34xx = 1, + .pll = PLL_28, + .tuner_type = 5, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + /* Samsung TCPA9095PC27A (BG+DK), philips compatible, w/FM, stereo and + radio signal strength indicators work fine. */ + .has_radio = 1, + /* GPIO Info: + GPIO0,1: HEF4052 A0,A1 + GPIO2: HEF4052 nENABLE + GPIO3-7: n.c. + GPIO8-13: IRDC357 data0-5 (data6 n.c. ?) [chip not present on my card] + GPIO14,15: ?? + GPIO16-21: n.c. + GPIO22,23: ?? + ?? : mtu8b56ep microcontroller for IR (GPIO wiring unknown)*/ + }, + [BTTV_BOARD_DSP_TCVIDEO] = { + /* Arthur Tetzlaff-Deas, DSP Design Ltd */ + .name = "DSP Design TCVIDEO", + .video_inputs = 4, + .svhs = -1, + .muxsel = { 2, 3, 1, 0 }, + .pll = PLL_28, + .tuner_type = -1, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + }, + + /* ---- card 0x50 ---------------------------------- */ + [BTTV_BOARD_HAUPPAUGEPVR] = { + .name = "Hauppauge WinTV PVR", + .video_inputs = 4, + .audio_inputs = 1, + .tuner = 0, + .svhs = 2, + .muxsel = { 2, 0, 1, 1 }, + .needs_tvaudio = 1, + .pll = PLL_28, + .tuner_type = -1, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + + .gpiomask = 7, + .audiomux = {7}, + }, + [BTTV_BOARD_GVBCTV5PCI] = { + .name = "IODATA GV-BCTV5/PCI", + .video_inputs = 3, + .audio_inputs = 1, + .tuner = 0, + .svhs = 2, + .gpiomask = 0x0f0f80, + .muxsel = {2, 3, 1, 0 }, + .audiomux = {0x030000, 0x010000, 0, 0, 0x020000, 0}, + .no_msp34xx = 1, + .pll = PLL_28, + .tuner_type = TUNER_PHILIPS_NTSC_M, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + .audio_hook = gvbctv5pci_audio, + .has_radio = 1, + }, + [BTTV_BOARD_OSPREY1x0] = { + .name = "Osprey 100/150 (878)", /* 0x1(2|3)-45C6-C1 */ + .video_inputs = 4, /* id-inputs-clock */ + .audio_inputs = 0, + .tuner = -1, + .svhs = 3, + .muxsel = { 3, 2, 0, 1 }, + .pll = PLL_28, + .tuner_type = -1, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + .no_msp34xx = 1, + .no_tda9875 = 1, + .no_tda7432 = 1, + }, + [BTTV_BOARD_OSPREY1x0_848] = { + .name = "Osprey 100/150 (848)", /* 0x04-54C0-C1 & older boards */ + .video_inputs = 3, + .audio_inputs = 0, + .tuner = -1, + .svhs = 2, + .muxsel = { 2, 3, 1 }, + .pll = PLL_28, + .tuner_type = -1, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + .no_msp34xx = 1, + .no_tda9875 = 1, + .no_tda7432 = 1, + }, + + /* ---- card 0x54 ---------------------------------- */ + [BTTV_BOARD_OSPREY101_848] = { + .name = "Osprey 101 (848)", /* 0x05-40C0-C1 */ + .video_inputs = 2, + .audio_inputs = 0, + .tuner = -1, + .svhs = 1, + .muxsel = { 3, 1 }, + .pll = PLL_28, + .tuner_type = -1, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + .no_msp34xx = 1, + .no_tda9875 = 1, + .no_tda7432 = 1, + }, + [BTTV_BOARD_OSPREY1x1] = { + .name = "Osprey 101/151", /* 0x1(4|5)-0004-C4 */ + .video_inputs = 1, + .audio_inputs = 0, + .tuner = -1, + .svhs = -1, + .muxsel = { 0 }, + .pll = PLL_28, + .tuner_type = -1, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + .no_msp34xx = 1, + .no_tda9875 = 1, + .no_tda7432 = 1, + }, + [BTTV_BOARD_OSPREY1x1_SVID] = { + .name = "Osprey 101/151 w/ svid", /* 0x(16|17|20)-00C4-C1 */ + .video_inputs = 2, + .audio_inputs = 0, + .tuner = -1, + .svhs = 1, + .muxsel = { 0, 1 }, + .pll = PLL_28, + .tuner_type = -1, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + .no_msp34xx = 1, + .no_tda9875 = 1, + .no_tda7432 = 1, + }, + [BTTV_BOARD_OSPREY2xx] = { + .name = "Osprey 200/201/250/251", /* 0x1(8|9|E|F)-0004-C4 */ + .video_inputs = 1, + .audio_inputs = 1, + .tuner = -1, + .svhs = -1, + .muxsel = { 0 }, + .pll = PLL_28, + .tuner_type = UNSET, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + .no_msp34xx = 1, + .no_tda9875 = 1, + .no_tda7432 = 1, + }, + + /* ---- card 0x58 ---------------------------------- */ + [BTTV_BOARD_OSPREY2x0_SVID] = { + .name = "Osprey 200/250", /* 0x1(A|B)-00C4-C1 */ + .video_inputs = 2, + .audio_inputs = 1, + .tuner = -1, + .svhs = 1, + .muxsel = { 0, 1 }, + .pll = PLL_28, + .tuner_type = UNSET, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + .no_msp34xx = 1, + .no_tda9875 = 1, + .no_tda7432 = 1, + }, + [BTTV_BOARD_OSPREY2x0] = { + .name = "Osprey 210/220", /* 0x1(A|B)-04C0-C1 */ + .video_inputs = 2, + .audio_inputs = 1, + .tuner = -1, + .svhs = 1, + .muxsel = { 2, 3 }, + .pll = PLL_28, + .tuner_type = UNSET, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + .no_msp34xx = 1, + .no_tda9875 = 1, + .no_tda7432 = 1, + }, + [BTTV_BOARD_OSPREY500] = { + .name = "Osprey 500", /* 500 */ + .video_inputs = 2, + .audio_inputs = 1, + .tuner = -1, + .svhs = 1, + .muxsel = { 2, 3 }, + .pll = PLL_28, + .tuner_type = -1, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + .no_msp34xx = 1, + .no_tda9875 = 1, + .no_tda7432 = 1, + }, + [BTTV_BOARD_OSPREY540] = { + .name = "Osprey 540", /* 540 */ + .video_inputs = 4, + .audio_inputs = 1, + .tuner = -1, + #if 0 /* TODO ... */ + .svhs = OSPREY540_SVID_ANALOG, + .muxsel = { [OSPREY540_COMP_ANALOG] = 2, + [OSPREY540_SVID_ANALOG] = 3, }, + #endif + .pll = PLL_28, + .tuner_type = -1, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + .no_msp34xx = 1, + .no_tda9875 = 1, + .no_tda7432 = 1, + #if 0 /* TODO ... */ + .muxsel_hook = osprey_540_muxsel, + .picture_hook = osprey_540_set_picture, + #endif + }, + + /* ---- card 0x5C ---------------------------------- */ + [BTTV_BOARD_OSPREY2000] = { + .name = "Osprey 2000", /* 2000 */ + .video_inputs = 2, + .audio_inputs = 1, + .tuner = -1, + .svhs = 1, + .muxsel = { 2, 3 }, + .pll = PLL_28, + .tuner_type = UNSET, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + .no_msp34xx = 1, + .no_tda9875 = 1, + .no_tda7432 = 1, /* must avoid, conflicts with the bt860 */ + }, + [BTTV_BOARD_IDS_EAGLE] = { + /* M G Berberich */ + .name = "IDS Eagle", + .video_inputs = 4, + .audio_inputs = 0, + .tuner = -1, + .tuner_type = -1, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + .svhs = -1, + .gpiomask = 0, + .muxsel = { 0, 1, 2, 3 }, + .muxsel_hook = eagle_muxsel, + .no_msp34xx = 1, + .no_tda9875 = 1, + .pll = PLL_28, + }, + [BTTV_BOARD_PINNACLESAT] = { + .name = "Pinnacle PCTV Sat", + .video_inputs = 2, + .audio_inputs = 0, + .svhs = 1, + .tuner = -1, + .tuner_type = -1, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + .no_msp34xx = 1, + .no_tda9875 = 1, + .no_tda7432 = 1, + .muxsel = { 3, 0, 1, 2 }, + .pll = PLL_28, + .no_gpioirq = 1, + .has_dvb = 1, + }, + [BTTV_BOARD_FORMAC_PROTV] = { + .name = "Formac ProTV II (bt878)", + .video_inputs = 4, + .audio_inputs = 1, + .tuner = 0, + .svhs = 3, + .gpiomask = 2, + /* TV, Comp1, Composite over SVID con, SVID */ + .muxsel = { 2, 3, 1, 1 }, + .audiomux = { 2, 2, 0, 0, 0 }, + .pll = PLL_28, + .has_radio = 1, + .tuner_type = TUNER_PHILIPS_PAL, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + /* sound routing: + GPIO=0x00,0x01,0x03: mute (?) + 0x02: both TV and radio (tuner: FM1216/I) + The card has onboard audio connectors labeled "cdrom" and "board", + not soldered here, though unknown wiring. + Card lacks: external audio in, pci subsystem id. */ -},{ - .name = "Pace TV & Radio Card", - .video_inputs = 4, - .audio_inputs = 1, - .tuner = 0, - .svhs = 2, - .muxsel = { 2, 3, 1, 1}, // Tuner, CVid, SVid, CVid over SVid connector - .gpiomask = 0, - .no_tda9875 = 1, - .no_tda7432 = 1, - .tuner_type = 1, - .has_radio = 1, - .pll = PLL_28, - /* Bt878, Bt832, FI1246 tuner; no pci subsystem id - only internal line out: (4pin header) RGGL - Radio must be decoded by msp3410d (not routed through)*/ - // .digital_mode = DIGITAL_MODE_CAMERA, // todo! -},{ - /* Chris Willing */ - .name = "IVC-200", - .video_inputs = 1, - .audio_inputs = 0, - .tuner = -1, - .tuner_type = -1, - .svhs = -1, - .gpiomask = 0xdf, - .muxsel = { 2 }, - .pll = PLL_28, -},{ - .name = "Grand X-Guard / Trust 814PCI", - .video_inputs = 16, - .audio_inputs = 0, - .tuner = -1, - .svhs = -1, - .tuner_type = 4, - .gpiomask2 = 0xff, - .muxsel = { 2,2,2,2, 3,3,3,3, 1,1,1,1, 0,0,0,0 }, - .muxsel_hook = xguard_muxsel, - .no_msp34xx = 1, - .no_tda9875 = 1, - .no_tda7432 = 1, - .pll = PLL_28, -},{ - - /* ---- card 0x68 ---------------------------------- */ - .name = "Nebula Electronics DigiTV", - .video_inputs = 1, - .tuner = -1, - .svhs = -1, - .muxsel = { 2, 3, 1, 0}, - .no_msp34xx = 1, - .no_tda9875 = 1, - .no_tda7432 = 1, - .pll = PLL_28, - .tuner_type = -1, - .has_dvb = 1, - .no_gpioirq = 1, -},{ - /* Jorge Boncompte - DTI2 */ - .name = "ProVideo PV143", - .video_inputs = 4, - .audio_inputs = 0, - .tuner = -1, - .svhs = -1, - .gpiomask = 0, - .muxsel = { 2, 3, 1, 0 }, - .audiomux = { 0 }, - .needs_tvaudio = 0, - .no_msp34xx = 1, - .pll = PLL_28, - .tuner_type = -1, -},{ - /* M.Klahr@phytec.de */ - .name = "PHYTEC VD-009-X1 MiniDIN (bt878)", - .video_inputs = 4, - .audio_inputs = 0, - .tuner = -1, /* card has no tuner */ - .svhs = 3, - .gpiomask = 0x00, - .muxsel = { 2, 3, 1, 0}, - .audiomux = { 0, 0, 0, 0, 0, 0 }, /* card has no audio */ - .needs_tvaudio = 1, - .pll = PLL_28, - .tuner_type = -1, -},{ - .name = "PHYTEC VD-009-X1 Combi (bt878)", - .video_inputs = 4, - .audio_inputs = 0, - .tuner = -1, /* card has no tuner */ - .svhs = 3, - .gpiomask = 0x00, - .muxsel = { 2, 3, 1, 1}, - .audiomux = { 0, 0, 0, 0, 0, 0 }, /* card has no audio */ - .needs_tvaudio = 1, - .pll = PLL_28, - .tuner_type = -1, -},{ - - /* ---- card 0x6c ---------------------------------- */ - .name = "PHYTEC VD-009 MiniDIN (bt878)", - .video_inputs = 10, - .audio_inputs = 0, - .tuner = -1, /* card has no tuner */ - .svhs = 9, - .gpiomask = 0x00, - .gpiomask2 = 0x03, /* gpiomask2 defines the bits used to switch audio - via the upper nibble of muxsel. here: used for - xternal video-mux */ - .muxsel = { 0x02, 0x12, 0x22, 0x32, 0x03, 0x13, 0x23, 0x33, 0x01, 0x00 }, - .audiomux = { 0, 0, 0, 0, 0, 0 }, /* card has no audio */ - .needs_tvaudio = 1, - .pll = PLL_28, - .tuner_type = -1, -},{ - .name = "PHYTEC VD-009 Combi (bt878)", - .video_inputs = 10, - .audio_inputs = 0, - .tuner = -1, /* card has no tuner */ - .svhs = 9, - .gpiomask = 0x00, - .gpiomask2 = 0x03, /* gpiomask2 defines the bits used to switch audio - via the upper nibble of muxsel. here: used for - xternal video-mux */ - .muxsel = { 0x02, 0x12, 0x22, 0x32, 0x03, 0x13, 0x23, 0x33, 0x01, 0x01 }, - .audiomux = { 0, 0, 0, 0, 0, 0 }, /* card has no audio */ - .needs_tvaudio = 1, - .pll = PLL_28, - .tuner_type = -1, -},{ - .name = "IVC-100", - .video_inputs = 4, - .audio_inputs = 0, - .tuner = -1, - .tuner_type = -1, - .svhs = -1, - .gpiomask = 0xdf, - .muxsel = { 2, 3, 1, 0 }, - .pll = PLL_28, -},{ - /* IVC-120G - Alan Garfield */ - .name = "IVC-120G", - .video_inputs = 16, - .audio_inputs = 0, /* card has no audio */ - .tuner = -1, /* card has no tuner */ - .tuner_type = -1, - .svhs = -1, /* card has no svhs */ - .needs_tvaudio = 0, - .no_msp34xx = 1, - .no_tda9875 = 1, - .no_tda7432 = 1, - .gpiomask = 0x00, - .muxsel = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, - 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10 }, - .muxsel_hook = ivc120_muxsel, - .pll = PLL_28, -},{ - - /* ---- card 0x70 ---------------------------------- */ - .name = "pcHDTV HD-2000 TV", - .video_inputs = 4, - .audio_inputs = 1, - .tuner = 0, - .svhs = 2, - .muxsel = { 2, 3, 1, 0}, - .tuner_type = TUNER_PHILIPS_ATSC, - .has_dvb = 1, -},{ - .name = "Twinhan DST + clones", - .no_msp34xx = 1, - .no_tda9875 = 1, - .no_tda7432 = 1, - .tuner_type = TUNER_ABSENT, - .no_video = 1, - .has_dvb = 1, -},{ - .name = "Winfast VC100", - .video_inputs = 3, - .audio_inputs = 0, - .svhs = 1, - .tuner = -1, // no tuner - .muxsel = { 3, 1, 1, 3}, // Vid In, SVid In, Vid over SVid in connector - .no_msp34xx = 1, - .no_tda9875 = 1, - .no_tda7432 = 1, - .tuner_type = TUNER_ABSENT, - .pll = PLL_28, -},{ - .name = "Teppro TEV-560/InterVision IV-560", - .video_inputs = 3, - .audio_inputs = 1, - .tuner = 0, - .svhs = 2, - .gpiomask = 3, - .muxsel = { 2, 3, 1, 1}, - .audiomux = { 1, 1, 1, 1, 0}, - .needs_tvaudio = 1, - .tuner_type = TUNER_PHILIPS_PAL, - .pll = PLL_35, -},{ - - /* ---- card 0x74 ---------------------------------- */ - .name = "SIMUS GVC1100", - .video_inputs = 4, - .audio_inputs = 0, - .tuner = -1, - .svhs = -1, - .tuner_type = -1, - .pll = PLL_28, - .muxsel = { 2, 2, 2, 2}, - .gpiomask = 0x3F, - .muxsel_hook = gvc1100_muxsel, -},{ - /* Carlos Silva r3pek@r3pek.homelinux.org || card 0x75 */ - .name = "NGS NGSTV+", - .video_inputs = 3, - .tuner = 0, - .svhs = 2, - .gpiomask = 0x008007, - .muxsel = {2, 3, 0, 0}, - .audiomux = {0, 0, 0, 0, 0x000003, 0}, - .pll = PLL_28, - .tuner_type = TUNER_PHILIPS_PAL, - .has_remote = 1, -},{ - /* http://linuxmedialabs.com */ - .name = "LMLBT4", - .video_inputs = 4, /* IN1,IN2,IN3,IN4 */ - .audio_inputs = 0, - .tuner = -1, - .svhs = -1, - .muxsel = { 2, 3, 1, 0 }, - .no_msp34xx = 1, - .no_tda9875 = 1, - .no_tda7432 = 1, - .needs_tvaudio = 0, -},{ - /* Helmroos Harri */ - .name = "Tekram M205 PRO", - .video_inputs = 3, - .audio_inputs = 1, - .tuner = 0, - .tuner_type = TUNER_PHILIPS_PAL, - .svhs = 2, - .needs_tvaudio = 0, - .gpiomask = 0x68, - .muxsel = { 2, 3, 1}, - .audiomux = { 0x68, 0x68, 0x61, 0x61, 0x00 }, - .pll = PLL_28, -},{ - - /* ---- card 0x78 ---------------------------------- */ - /* Javier Cendan Ares */ - /* bt878 TV + FM without subsystem ID */ - .name = "Conceptronic CONTVFMi", - .video_inputs = 3, - .audio_inputs = 1, - .tuner = 0, - .svhs = 2, - .gpiomask = 0x008007, - .muxsel = { 2, 3, 1, 1 }, - .audiomux = { 0, 1, 2, 2, 3 }, - .needs_tvaudio = 0, - .pll = PLL_28, - .tuner_type = TUNER_PHILIPS_PAL, - .has_remote = 1, - .has_radio = 1, -},{ - /*Eric DEBIEF */ - /*EURESYS Picolo Tetra : 4 Conexant Fusion 878A, no audio, video input set with analog multiplexers GPIO controled*/ - /* adds picolo_tetra_muxsel(), picolo_tetra_init(), the folowing declaration strucure, and #define BTTV_PICOLO_TETRA_CHIP*/ - /*0x79 in bttv.h*/ - .name = "Euresys Picolo Tetra", - .video_inputs = 4, - .audio_inputs = 0, - .tuner = -1, - .svhs = -1, - .gpiomask = 0, - .gpiomask2 = 0x3C<<16,/*Set the GPIO[18]->GPIO[21] as output pin.==> drive the video inputs through analog multiplexers*/ - .no_msp34xx = 1, - .no_tda9875 = 1, - .no_tda7432 = 1, - .muxsel = {2,2,2,2},/*878A input is always MUX0, see above.*/ - .audiomux = { 0, 0, 0, 0, 0, 0 }, /* card has no audio */ - .pll = PLL_28, - .needs_tvaudio = 0, - .muxsel_hook = picolo_tetra_muxsel,/*Required as it doesn't follow the classic input selection policy*/ -},{ - /* Spirit TV Tuner from http://spiritmodems.com.au */ - /* Stafford Goodsell */ - .name = "Spirit TV Tuner", - .video_inputs = 3, - .audio_inputs = 1, - .tuner = 0, - .svhs = 2, - .gpiomask = 0x0000000f, - .muxsel = { 2, 1, 1 }, - .audiomux = { 0x02, 0x00, 0x00, 0x00, 0x00}, - .tuner_type = TUNER_TEMIC_PAL, - .no_msp34xx = 1, - .no_tda9875 = 1, -},{ - /* Wolfram Joost */ - .name = "AVerMedia AVerTV DVB-T 771", - .video_inputs = 2, - .svhs = 1, - .tuner = -1, - .tuner_type = TUNER_ABSENT, - .muxsel = { 3 , 3 }, - .no_msp34xx = 1, - .no_tda9875 = 1, - .no_tda7432 = 1, - .pll = PLL_28, - .has_dvb = 1, - .no_gpioirq = 1, - .has_remote = 1, -},{ - /* ---- card 0x7c ---------------------------------- */ - /* Matt Jesson */ - /* Based on the Nebula card data - added remote and new card number - BTTV_AVDVBT_761, see also ir-kbd-gpio.c */ - .name = "AverMedia AverTV DVB-T 761", - .video_inputs = 2, - .tuner = -1, - .svhs = 1, - .muxsel = { 3, 1, 2, 0}, /* Comp0, S-Video, ?, ? */ - .no_msp34xx = 1, - .no_tda9875 = 1, - .no_tda7432 = 1, - .pll = PLL_28, - .tuner_type = -1, - .has_dvb = 1, - .no_gpioirq = 1, - .has_remote = 1, -},{ - /* andre.schwarz@matrix-vision.de */ - .name = "MATRIX Vision Sigma-SQ", - .video_inputs = 16, - .audio_inputs = 0, - .tuner = -1, - .svhs = -1, - .gpiomask = 0x0, - .muxsel = { 2, 2, 2, 2, 2, 2, 2, 2, - 3, 3, 3, 3, 3, 3, 3, 3 }, - .muxsel_hook = sigmaSQ_muxsel, - .audiomux = { 0 }, - .no_msp34xx = 1, - .pll = PLL_28, - .tuner_type = -1, -},{ - /* andre.schwarz@matrix-vision.de */ - .name = "MATRIX Vision Sigma-SLC", - .video_inputs = 4, - .audio_inputs = 0, - .tuner = -1, - .svhs = -1, - .gpiomask = 0x0, - .muxsel = { 2, 2, 2, 2 }, - .muxsel_hook = sigmaSLC_muxsel, - .audiomux = { 0 }, - .no_msp34xx = 1, - .pll = PLL_28, - .tuner_type = -1, -},{ - /* BTTV_APAC_VIEWCOMP */ - /* Attila Kondoros */ - /* bt878 TV + FM 0x00000000 subsystem ID */ - .name = "APAC Viewcomp 878(AMAX)", - .video_inputs = 2, - .audio_inputs = 1, - .tuner = 0, - .svhs = -1, - .gpiomask = 0xFF, - .muxsel = { 2, 3, 1, 1}, - .audiomux = { 2, 0, 0, 0, 10}, - .needs_tvaudio = 0, - .pll = PLL_28, - .tuner_type = TUNER_PHILIPS_PAL, - .has_remote = 1, /* miniremote works, see ir-kbd-gpio.c */ - .has_radio = 1, /* not every card has radio */ -},{ - - /* ---- card 0x80 ---------------------------------- */ - /* Chris Pascoe */ - .name = "DVICO FusionHDTV DVB-T Lite", - .tuner = -1, - .no_msp34xx = 1, - .no_tda9875 = 1, - .no_tda7432 = 1, - .pll = PLL_28, - .no_video = 1, - .has_dvb = 1, - .tuner_type = -1, -},{ - /* Steven */ - .name = "V-Gear MyVCD", - .video_inputs = 3, - .audio_inputs = 1, - .tuner = 0, - .svhs = 2, - .gpiomask = 0x3f, - .muxsel = {2, 3, 1, 0}, - .audiomux = {0x31, 0x31, 0x31, 0x31, 0x31, 0x31}, - .no_msp34xx = 1, - .pll = PLL_28, - .tuner_type = TUNER_PHILIPS_NTSC_M, - .has_radio = 0, - // .has_remote = 1, -},{ - /* Rick C */ - .name = "Super TV Tuner", - .video_inputs = 4, - .audio_inputs = 1, - .tuner = 0, - .svhs = 2, - .muxsel = { 2, 3, 1, 0}, - .tuner_type = TUNER_PHILIPS_NTSC, - .gpiomask = 0x008007, - .audiomux = { 0, 0x000001,0,0, 0}, - .needs_tvaudio = 1, - .has_radio = 1, -},{ + }, + + /* ---- card 0x60 ---------------------------------- */ + [BTTV_BOARD_MACHTV] = { + .name = "MachTV", + .video_inputs = 3, + .audio_inputs = 1, + .tuner = 0, + .svhs = -1, + .gpiomask = 7, + .muxsel = { 2, 3, 1, 1}, + .audiomux = { 0, 1, 2, 3, 4}, + .needs_tvaudio = 1, + .tuner_type = 5, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + .pll = PLL_28, + }, + [BTTV_BOARD_EURESYS_PICOLO] = { + .name = "Euresys Picolo", + .video_inputs = 3, + .audio_inputs = 0, + .tuner = -1, + .svhs = 2, + .gpiomask = 0, + .no_msp34xx = 1, + .no_tda9875 = 1, + .no_tda7432 = 1, + .muxsel = { 2, 0, 1}, + .pll = PLL_28, + .tuner_type = UNSET, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + }, + [BTTV_BOARD_PV150] = { + /* Luc Van Hoeylandt */ + .name = "ProVideo PV150", /* 0x4f */ + .video_inputs = 2, + .audio_inputs = 0, + .tuner = -1, + .svhs = -1, + .gpiomask = 0, + .muxsel = { 2, 3 }, + .audiomux = { 0 }, + .needs_tvaudio = 0, + .no_msp34xx = 1, + .pll = PLL_28, + .tuner_type = UNSET, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + }, + [BTTV_BOARD_AD_TVK503] = { + /* Hiroshi Takekawa */ + /* This card lacks subsystem ID */ + .name = "AD-TVK503", /* 0x63 */ + .video_inputs = 4, + .audio_inputs = 1, + .tuner = 0, + .svhs = 2, + .gpiomask = 0x001e8007, + .muxsel = { 2, 3, 1, 0 }, + /* Tuner, Radio, external, internal, off, on */ + .audiomux = { 0x08, 0x0f, 0x0a, 0x08, 0x0f, 0x08 }, + .needs_tvaudio = 0, + .no_msp34xx = 1, + .pll = PLL_28, + .tuner_type = 2, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + .audio_hook = adtvk503_audio, + }, + + /* ---- card 0x64 ---------------------------------- */ + [BTTV_BOARD_HERCULES_SM_TV] = { + .name = "Hercules Smart TV Stereo", + .video_inputs = 4, + .audio_inputs = 1, + .tuner = 0, + .svhs = 2, + .gpiomask = 0x00, + .muxsel = { 2, 3, 1, 1 }, + .needs_tvaudio = 1, + .no_msp34xx = 1, + .pll = PLL_28, + .tuner_type = 5, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + /* Notes: + - card lacks subsystem ID + - stereo variant w/ daughter board with tda9874a @0xb0 + - Audio Routing: + always from tda9874 independent of GPIO (?) + external line in: unknown + - Other chips: em78p156elp @ 0x96 (probably IR remote control) + hef4053 (instead 4052) for unknown function + */ + }, + [BTTV_BOARD_PACETV] = { + .name = "Pace TV & Radio Card", + .video_inputs = 4, + .audio_inputs = 1, + .tuner = 0, + .svhs = 2, + .muxsel = { 2, 3, 1, 1 }, /* Tuner, CVid, SVid, CVid over SVid connector */ + .gpiomask = 0, + .no_tda9875 = 1, + .no_tda7432 = 1, + .tuner_type = 1, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + .has_radio = 1, + .pll = PLL_28, + /* Bt878, Bt832, FI1246 tuner; no pci subsystem id + only internal line out: (4pin header) RGGL + Radio must be decoded by msp3410d (not routed through)*/ + /* + .digital_mode = DIGITAL_MODE_CAMERA, todo! + */ + }, + [BTTV_BOARD_IVC200] = { + /* Chris Willing */ + .name = "IVC-200", + .video_inputs = 1, + .audio_inputs = 0, + .tuner = -1, + .tuner_type = -1, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + .svhs = -1, + .gpiomask = 0xdf, + .muxsel = { 2 }, + .pll = PLL_28, + }, + [BTTV_BOARD_XGUARD] = { + .name = "Grand X-Guard / Trust 814PCI", + .video_inputs = 16, + .audio_inputs = 0, + .tuner = -1, + .svhs = -1, + .tuner_type = 4, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + .gpiomask2 = 0xff, + .muxsel = { 2,2,2,2, 3,3,3,3, 1,1,1,1, 0,0,0,0 }, + .muxsel_hook = xguard_muxsel, + .no_msp34xx = 1, + .no_tda9875 = 1, + .no_tda7432 = 1, + .pll = PLL_28, + }, + + /* ---- card 0x68 ---------------------------------- */ + [BTTV_BOARD_NEBULA_DIGITV] = { + .name = "Nebula Electronics DigiTV", + .video_inputs = 1, + .tuner = -1, + .svhs = -1, + .muxsel = { 2, 3, 1, 0 }, + .no_msp34xx = 1, + .no_tda9875 = 1, + .no_tda7432 = 1, + .pll = PLL_28, + .tuner_type = -1, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + .has_dvb = 1, + .has_remote = 1, + .gpiomask = 0x1b, + .no_gpioirq = 1, + }, + [BTTV_BOARD_PV143] = { + /* Jorge Boncompte - DTI2 */ + .name = "ProVideo PV143", + .video_inputs = 4, + .audio_inputs = 0, + .tuner = -1, + .svhs = -1, + .gpiomask = 0, + .muxsel = { 2, 3, 1, 0 }, + .audiomux = { 0 }, + .needs_tvaudio = 0, + .no_msp34xx = 1, + .pll = PLL_28, + .tuner_type = -1, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + }, + [BTTV_BOARD_VD009X1_MINIDIN] = { + /* M.Klahr@phytec.de */ + .name = "PHYTEC VD-009-X1 MiniDIN (bt878)", + .video_inputs = 4, + .audio_inputs = 0, + .tuner = -1, /* card has no tuner */ + .svhs = 3, + .gpiomask = 0x00, + .muxsel = { 2, 3, 1, 0 }, + .audiomux = { 0, 0, 0, 0, 0, 0 }, /* card has no audio */ + .needs_tvaudio = 1, + .pll = PLL_28, + .tuner_type = -1, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + }, + [BTTV_BOARD_VD009X1_COMBI] = { + .name = "PHYTEC VD-009-X1 Combi (bt878)", + .video_inputs = 4, + .audio_inputs = 0, + .tuner = -1, /* card has no tuner */ + .svhs = 3, + .gpiomask = 0x00, + .muxsel = { 2, 3, 1, 1 }, + .audiomux = { 0, 0, 0, 0, 0, 0 }, /* card has no audio */ + .needs_tvaudio = 1, + .pll = PLL_28, + .tuner_type = -1, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + }, + + /* ---- card 0x6c ---------------------------------- */ + [BTTV_BOARD_VD009_MINIDIN] = { + .name = "PHYTEC VD-009 MiniDIN (bt878)", + .video_inputs = 10, + .audio_inputs = 0, + .tuner = -1, /* card has no tuner */ + .svhs = 9, + .gpiomask = 0x00, + .gpiomask2 = 0x03, /* gpiomask2 defines the bits used to switch audio + via the upper nibble of muxsel. here: used for + xternal video-mux */ + .muxsel = { 0x02, 0x12, 0x22, 0x32, 0x03, 0x13, 0x23, 0x33, 0x01, 0x00 }, + .audiomux = { 0, 0, 0, 0, 0, 0 }, /* card has no audio */ + .needs_tvaudio = 1, + .pll = PLL_28, + .tuner_type = -1, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + }, + [BTTV_BOARD_VD009_COMBI] = { + .name = "PHYTEC VD-009 Combi (bt878)", + .video_inputs = 10, + .audio_inputs = 0, + .tuner = -1, /* card has no tuner */ + .svhs = 9, + .gpiomask = 0x00, + .gpiomask2 = 0x03, /* gpiomask2 defines the bits used to switch audio + via the upper nibble of muxsel. here: used for + xternal video-mux */ + .muxsel = { 0x02, 0x12, 0x22, 0x32, 0x03, 0x13, 0x23, 0x33, 0x01, 0x01 }, + .audiomux = { 0, 0, 0, 0, 0, 0 }, /* card has no audio */ + .needs_tvaudio = 1, + .pll = PLL_28, + .tuner_type = -1, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + }, + [BTTV_BOARD_IVC100] = { + .name = "IVC-100", + .video_inputs = 4, + .audio_inputs = 0, + .tuner = -1, + .tuner_type = -1, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + .svhs = -1, + .gpiomask = 0xdf, + .muxsel = { 2, 3, 1, 0 }, + .pll = PLL_28, + }, + [BTTV_BOARD_IVC120] = { + /* IVC-120G - Alan Garfield */ + .name = "IVC-120G", + .video_inputs = 16, + .audio_inputs = 0, /* card has no audio */ + .tuner = -1, /* card has no tuner */ + .tuner_type = -1, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + .svhs = -1, /* card has no svhs */ + .needs_tvaudio = 0, + .no_msp34xx = 1, + .no_tda9875 = 1, + .no_tda7432 = 1, + .gpiomask = 0x00, + .muxsel = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, + 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10 }, + .muxsel_hook = ivc120_muxsel, + .pll = PLL_28, + }, + + /* ---- card 0x70 ---------------------------------- */ + [BTTV_BOARD_PC_HDTV] = { + .name = "pcHDTV HD-2000 TV", + .video_inputs = 4, + .audio_inputs = 1, + .tuner = 0, + .svhs = 2, + .muxsel = { 2, 3, 1, 0 }, + .tuner_type = TUNER_PHILIPS_ATSC, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + .has_dvb = 1, + }, + [BTTV_BOARD_TWINHAN_DST] = { + .name = "Twinhan DST + clones", + .no_msp34xx = 1, + .no_tda9875 = 1, + .no_tda7432 = 1, + .tuner_type = TUNER_ABSENT, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + .no_video = 1, + .has_dvb = 1, + }, + [BTTV_BOARD_WINFASTVC100] = { + .name = "Winfast VC100", + .video_inputs = 3, + .audio_inputs = 0, + .svhs = 1, + .tuner = -1, + .muxsel = { 3, 1, 1, 3 }, /* Vid In, SVid In, Vid over SVid in connector */ + .no_msp34xx = 1, + .no_tda9875 = 1, + .no_tda7432 = 1, + .tuner_type = TUNER_ABSENT, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + .pll = PLL_28, + }, + [BTTV_BOARD_TEV560] = { + .name = "Teppro TEV-560/InterVision IV-560", + .video_inputs = 3, + .audio_inputs = 1, + .tuner = 0, + .svhs = 2, + .gpiomask = 3, + .muxsel = { 2, 3, 1, 1 }, + .audiomux = { 1, 1, 1, 1, 0 }, + .needs_tvaudio = 1, + .tuner_type = TUNER_PHILIPS_PAL, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + .pll = PLL_35, + }, + + /* ---- card 0x74 ---------------------------------- */ + [BTTV_BOARD_SIMUS_GVC1100] = { + .name = "SIMUS GVC1100", + .video_inputs = 4, + .audio_inputs = 0, + .tuner = -1, + .svhs = -1, + .tuner_type = -1, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + .pll = PLL_28, + .muxsel = { 2, 2, 2, 2 }, + .gpiomask = 0x3F, + .muxsel_hook = gvc1100_muxsel, + }, + [BTTV_BOARD_NGSTV_PLUS] = { + /* Carlos Silva r3pek@r3pek.homelinux.org || card 0x75 */ + .name = "NGS NGSTV+", + .video_inputs = 3, + .tuner = 0, + .svhs = 2, + .gpiomask = 0x008007, + .muxsel = { 2, 3, 0, 0 }, + .audiomux = { 0, 0, 0, 0, 0x000003, 0 }, + .pll = PLL_28, + .tuner_type = TUNER_PHILIPS_PAL, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + .has_remote = 1, + }, + [BTTV_BOARD_LMLBT4] = { + /* http://linuxmedialabs.com */ + .name = "LMLBT4", + .video_inputs = 4, /* IN1,IN2,IN3,IN4 */ + .audio_inputs = 0, + .tuner = -1, + .svhs = -1, + .muxsel = { 2, 3, 1, 0 }, + .no_msp34xx = 1, + .no_tda9875 = 1, + .no_tda7432 = 1, + .needs_tvaudio = 0, + .tuner_type = -1, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + }, + [BTTV_BOARD_TEKRAM_M205] = { + /* Helmroos Harri */ + .name = "Tekram M205 PRO", + .video_inputs = 3, + .audio_inputs = 1, + .tuner = 0, + .tuner_type = TUNER_PHILIPS_PAL, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + .svhs = 2, + .needs_tvaudio = 0, + .gpiomask = 0x68, + .muxsel = { 2, 3, 1 }, + .audiomux = { 0x68, 0x68, 0x61, 0x61, 0x00 }, + .pll = PLL_28, + }, + + /* ---- card 0x78 ---------------------------------- */ + [BTTV_BOARD_CONTVFMI] = { + /* Javier Cendan Ares */ + /* bt878 TV + FM without subsystem ID */ + .name = "Conceptronic CONTVFMi", + .video_inputs = 3, + .audio_inputs = 1, + .tuner = 0, + .svhs = 2, + .gpiomask = 0x008007, + .muxsel = { 2, 3, 1, 1 }, + .audiomux = { 0, 1, 2, 2, 3 }, + .needs_tvaudio = 0, + .pll = PLL_28, + .tuner_type = TUNER_PHILIPS_PAL, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + .has_remote = 1, + .has_radio = 1, + }, + [BTTV_BOARD_PICOLO_TETRA_CHIP] = { + /*Eric DEBIEF */ + /*EURESYS Picolo Tetra : 4 Conexant Fusion 878A, no audio, video input set with analog multiplexers GPIO controled*/ + /* adds picolo_tetra_muxsel(), picolo_tetra_init(), the folowing declaration strucure, and #define BTTV_BOARD_PICOLO_TETRA_CHIP*/ + /*0x79 in bttv.h*/ + .name = "Euresys Picolo Tetra", + .video_inputs = 4, + .audio_inputs = 0, + .tuner = -1, + .svhs = -1, + .gpiomask = 0, + .gpiomask2 = 0x3C<<16,/*Set the GPIO[18]->GPIO[21] as output pin.==> drive the video inputs through analog multiplexers*/ + .no_msp34xx = 1, + .no_tda9875 = 1, + .no_tda7432 = 1, + .muxsel = {2,2,2,2},/*878A input is always MUX0, see above.*/ + .audiomux = { 0, 0, 0, 0, 0, 0 }, /* card has no audio */ + .pll = PLL_28, + .needs_tvaudio = 0, + .muxsel_hook = picolo_tetra_muxsel,/*Required as it doesn't follow the classic input selection policy*/ + .tuner_type = -1, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + }, + [BTTV_BOARD_SPIRIT_TV] = { + /* Spirit TV Tuner from http://spiritmodems.com.au */ + /* Stafford Goodsell */ + .name = "Spirit TV Tuner", + .video_inputs = 3, + .audio_inputs = 1, + .tuner = 0, + .svhs = 2, + .gpiomask = 0x0000000f, + .muxsel = { 2, 1, 1 }, + .audiomux = { 0x02, 0x00, 0x00, 0x00, 0x00 }, + .tuner_type = TUNER_TEMIC_PAL, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + .no_msp34xx = 1, + .no_tda9875 = 1, + }, + [BTTV_BOARD_AVDVBT_771] = { + /* Wolfram Joost */ + .name = "AVerMedia AVerTV DVB-T 771", + .video_inputs = 2, + .svhs = 1, + .tuner = -1, + .tuner_type = TUNER_ABSENT, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + .muxsel = { 3 , 3 }, + .no_msp34xx = 1, + .no_tda9875 = 1, + .no_tda7432 = 1, + .pll = PLL_28, + .has_dvb = 1, + .no_gpioirq = 1, + .has_remote = 1, + }, + /* ---- card 0x7c ---------------------------------- */ + [BTTV_BOARD_AVDVBT_761] = { + /* Matt Jesson */ + /* Based on the Nebula card data - added remote and new card number - BTTV_BOARD_AVDVBT_761, see also ir-kbd-gpio.c */ + .name = "AverMedia AverTV DVB-T 761", + .video_inputs = 2, + .tuner = -1, + .svhs = 1, + .muxsel = { 3, 1, 2, 0 }, /* Comp0, S-Video, ?, ? */ + .no_msp34xx = 1, + .no_tda9875 = 1, + .no_tda7432 = 1, + .pll = PLL_28, + .tuner_type = -1, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + .has_dvb = 1, + .no_gpioirq = 1, + .has_remote = 1, + }, + [BTTV_BOARD_MATRIX_VISIONSQ] = { + /* andre.schwarz@matrix-vision.de */ + .name = "MATRIX Vision Sigma-SQ", + .video_inputs = 16, + .audio_inputs = 0, + .tuner = -1, + .svhs = -1, + .gpiomask = 0x0, + .muxsel = { 2, 2, 2, 2, 2, 2, 2, 2, + 3, 3, 3, 3, 3, 3, 3, 3 }, + .muxsel_hook = sigmaSQ_muxsel, + .audiomux = { 0 }, + .no_msp34xx = 1, + .pll = PLL_28, + .tuner_type = -1, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + }, + [BTTV_BOARD_MATRIX_VISIONSLC] = { + /* andre.schwarz@matrix-vision.de */ + .name = "MATRIX Vision Sigma-SLC", + .video_inputs = 4, + .audio_inputs = 0, + .tuner = -1, + .svhs = -1, + .gpiomask = 0x0, + .muxsel = { 2, 2, 2, 2 }, + .muxsel_hook = sigmaSLC_muxsel, + .audiomux = { 0 }, + .no_msp34xx = 1, + .pll = PLL_28, + .tuner_type = -1, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + }, + /* BTTV_BOARD_APAC_VIEWCOMP */ + [BTTV_BOARD_APAC_VIEWCOMP] = { + /* Attila Kondoros */ + /* bt878 TV + FM 0x00000000 subsystem ID */ + .name = "APAC Viewcomp 878(AMAX)", + .video_inputs = 2, + .audio_inputs = 1, + .tuner = 0, + .svhs = -1, + .gpiomask = 0xFF, + .muxsel = { 2, 3, 1, 1 }, + .audiomux = { 2, 0, 0, 0, 10 }, + .needs_tvaudio = 0, + .pll = PLL_28, + .tuner_type = TUNER_PHILIPS_PAL, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + .has_remote = 1, /* miniremote works, see ir-kbd-gpio.c */ + .has_radio = 1, /* not every card has radio */ + }, + + /* ---- card 0x80 ---------------------------------- */ + [BTTV_BOARD_DVICO_DVBT_LITE] = { + /* Chris Pascoe */ + .name = "DViCO FusionHDTV DVB-T Lite", + .tuner = -1, + .no_msp34xx = 1, + .no_tda9875 = 1, + .no_tda7432 = 1, + .pll = PLL_28, + .no_video = 1, + .has_dvb = 1, + .tuner_type = -1, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + }, + [BTTV_BOARD_VGEAR_MYVCD] = { + /* Steven */ + .name = "V-Gear MyVCD", + .video_inputs = 3, + .audio_inputs = 1, + .tuner = 0, + .svhs = 2, + .gpiomask = 0x3f, + .muxsel = {2, 3, 1, 0 }, + .audiomux = {0x31, 0x31, 0x31, 0x31, 0x31, 0x31 }, + .no_msp34xx = 1, + .pll = PLL_28, + .tuner_type = TUNER_PHILIPS_NTSC_M, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + .has_radio = 0, + #if 0 + .has_remote = 1, + #endif + }, + [BTTV_BOARD_SUPER_TV] = { + /* Rick C */ + .name = "Super TV Tuner", + .video_inputs = 4, + .audio_inputs = 1, + .tuner = 0, + .svhs = 2, + .muxsel = { 2, 3, 1, 0 }, + .tuner_type = TUNER_PHILIPS_NTSC, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + .gpiomask = 0x008007, + .audiomux = { 0, 0x000001,0,0, 0 }, + .needs_tvaudio = 1, + .has_radio = 1, + }, + [BTTV_BOARD_TIBET_CS16] = { /* Chris Fanning */ .name = "Tibet Systems 'Progress DVR' CS16", .video_inputs = 16, @@ -2193,65 +2598,268 @@ struct tvcard bttv_tvcards[] = { .no_tda9875 = 1, .no_tda7432 = 1, .tuner_type = -1, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, .muxsel_hook = tibetCS16_muxsel, -}, -{ - /* Bill Brack */ - /* - * Note that, because of the card's wiring, the "master" - * BT878A chip (i.e. the one which controls the analog switch - * and must use this card type) is the 2nd one detected. The - * other 3 chips should use card type 0x85, whose description - * follows this one. There is a EEPROM on the card (which is - * connected to the I2C of one of those other chips), but is - * not currently handled. There is also a facility for a - * "monitor", which is also not currently implemented. - */ - .name = "Kodicom 4400R (master)", - .video_inputs = 16, - .audio_inputs = 0, - .tuner = -1, - .tuner_type = -1, - .svhs = -1, - /* GPIO bits 0-9 used for analog switch: - * 00 - 03: camera selector - * 04 - 06: channel (controller) selector - * 07: data (1->on, 0->off) - * 08: strobe - * 09: reset - * bit 16 is input from sync separator for the channel - */ - .gpiomask = 0x0003ff, - .no_gpioirq = 1, - .muxsel = { 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 }, - .pll = PLL_28, - .no_msp34xx = 1, - .no_tda7432 = 1, - .no_tda9875 = 1, - .muxsel_hook = kodicom4400r_muxsel, -}, -{ - /* Bill Brack */ - /* Note that, for reasons unknown, the "master" BT878A chip (i.e. the - * one which controls the analog switch, and must use the card type) - * is the 2nd one detected. The other 3 chips should use this card - * type - */ - .name = "Kodicom 4400R (slave)", - .video_inputs = 16, - .audio_inputs = 0, - .tuner = -1, - .tuner_type = -1, - .svhs = -1, - .gpiomask = 0x010000, - .no_gpioirq = 1, - .muxsel = { 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 }, - .pll = PLL_28, - .no_msp34xx = 1, - .no_tda7432 = 1, - .no_tda9875 = 1, - .muxsel_hook = kodicom4400r_muxsel, -}}; + }, + [BTTV_BOARD_KODICOM_4400R] = { + /* Bill Brack */ + /* + * Note that, because of the card's wiring, the "master" + * BT878A chip (i.e. the one which controls the analog switch + * and must use this card type) is the 2nd one detected. The + * other 3 chips should use card type 0x85, whose description + * follows this one. There is a EEPROM on the card (which is + * connected to the I2C of one of those other chips), but is + * not currently handled. There is also a facility for a + * "monitor", which is also not currently implemented. + */ + .name = "Kodicom 4400R (master)", + .video_inputs = 16, + .audio_inputs = 0, + .tuner = -1, + .tuner_type = -1, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + .svhs = -1, + /* GPIO bits 0-9 used for analog switch: + * 00 - 03: camera selector + * 04 - 06: channel (controller) selector + * 07: data (1->on, 0->off) + * 08: strobe + * 09: reset + * bit 16 is input from sync separator for the channel + */ + .gpiomask = 0x0003ff, + .no_gpioirq = 1, + .muxsel = { 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 }, + .pll = PLL_28, + .no_msp34xx = 1, + .no_tda7432 = 1, + .no_tda9875 = 1, + .muxsel_hook = kodicom4400r_muxsel, + }, + [BTTV_BOARD_KODICOM_4400R_SL] = { + /* Bill Brack */ + /* Note that, for reasons unknown, the "master" BT878A chip (i.e. the + * one which controls the analog switch, and must use the card type) + * is the 2nd one detected. The other 3 chips should use this card + * type + */ + .name = "Kodicom 4400R (slave)", + .video_inputs = 16, + .audio_inputs = 0, + .tuner = -1, + .tuner_type = -1, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + .svhs = -1, + .gpiomask = 0x010000, + .no_gpioirq = 1, + .muxsel = { 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 }, + .pll = PLL_28, + .no_msp34xx = 1, + .no_tda7432 = 1, + .no_tda9875 = 1, + .muxsel_hook = kodicom4400r_muxsel, + }, + /* ---- card 0x86---------------------------------- */ + [BTTV_BOARD_ADLINK_RTV24] = { + /* Michael Henson */ + /* Adlink RTV24 with special unlock codes */ + .name = "Adlink RTV24", + .video_inputs = 4, + .audio_inputs = 1, + .tuner = 0, + .svhs = 2, + .muxsel = { 2, 3, 1, 0 }, + .tuner_type = -1, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + .pll = PLL_28, + }, + /* ---- card 0x87---------------------------------- */ + [BTTV_BOARD_DVICO_FUSIONHDTV_5_LITE] = { + /* Michael Krufky */ + .name = "DViCO FusionHDTV 5 Lite", + .tuner = 0, + .tuner_type = TUNER_LG_TDVS_H062F, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + .video_inputs = 3, + .audio_inputs = 1, + .svhs = 2, + .muxsel = { 2, 3, 1 }, + .gpiomask = 0x00e00007, + .audiomux = { 0x00400005, 0, 0x00000001, 0, 0x00c00007, 0 }, + .no_msp34xx = 1, + .no_tda9875 = 1, + .no_tda7432 = 1, + .has_dvb = 1, + }, + /* ---- card 0x88---------------------------------- */ + [BTTV_BOARD_ACORP_Y878F] = { + /* Mauro Carvalho Chehab */ + .name = "Acorp Y878F", + .video_inputs = 3, + .audio_inputs = 1, + .tuner = 0, + .svhs = 2, + .gpiomask = 0x01fe00, + .muxsel = { 2, 3, 1, 1 }, + .audiomux = { 0x001e00, 0, 0x018000, 0x014000, 0x002000, 0 }, + .needs_tvaudio = 1, + .pll = PLL_28, + .tuner_type = TUNER_YMEC_TVF66T5_B_DFF, + .tuner_addr = 0xc1 >>1, + .radio_addr = 0xc1 >>1, + .has_radio = 1, + }, + /* ---- card 0x89 ---------------------------------- */ + [BTTV_BOARD_CONCEPTRONIC_CTVFMI2] = { + .name = "Conceptronic CTVFMi v2", + .video_inputs = 3, + .audio_inputs = 1, + .tuner = 0, + .svhs = 2, + .gpiomask = 0x001c0007, + .muxsel = { 2, 3, 1, 1 }, + .audiomux = { 0, 1, 2, 2, 3 }, + .needs_tvaudio = 0, + .pll = PLL_28, + .tuner_type = TUNER_TENA_9533_DI, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + .has_remote = 1, + .has_radio = 1, + }, + /* ---- card 0x8a ---------------------------------- */ + [BTTV_BOARD_PV_BT878P_2E] = { + .name = "Prolink Pixelview PV-BT878P+ (Rev.2E)", + .video_inputs = 5, + .audio_inputs = 1, + .tuner = 0, + .svhs = 3, + .gpiomask = 0x01fe00, + .muxsel = { 2,3,1,1,-1 }, + .digital_mode = DIGITAL_MODE_CAMERA, + .audiomux = { 0x00400, 0x10400, 0x04400, 0x80000, 0x12400, 0x46000 }, + .no_msp34xx = 1, + .pll = PLL_28, + .tuner_type = TUNER_LG_PAL_FM, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + .has_remote = 1, + }, + /* ---- card 0x8b ---------------------------------- */ + [BTTV_BOARD_PV_M4900] = { + /* Sérgio Fortier */ + .name = "Prolink PixelView PlayTV MPEG2 PV-M4900", + .video_inputs = 3, + .audio_inputs = 1, + .tuner = 0, + .svhs = 2, + .gpiomask = 0x3f, + .muxsel = { 2, 3, 1, 1 }, + .audiomux = { 0x21, 0x20, 0x24, 0x2c, 0x29, 0x29 }, + .no_msp34xx = 1, + .pll = PLL_28, + .tuner_type = TUNER_YMEC_TVF_5533MF, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + .has_radio = 1, + .has_remote = 1, + }, + /* ---- card 0x8c ---------------------------------- */ + [BTTV_BOARD_OSPREY440] = { + .name = "Osprey 440", + .video_inputs = 1, + .audio_inputs = 1, + .tuner = -1, + .svhs = 1, + .muxsel = { 2 }, + .pll = PLL_28, + .tuner_type = UNSET, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + .no_msp34xx = 1, + .no_tda9875 = 1, + .no_tda7432 = 1, + }, + /* ---- card 0x8d ---------------------------------- */ + [BTTV_BOARD_ASOUND_SKYEYE] = { + .name = "Asound Skyeye PCTV", + .video_inputs = 3, + .audio_inputs = 1, + .tuner = 0, + .svhs = 2, + .gpiomask = 15, + .muxsel = { 2, 3, 1, 1 }, + .audiomux = { 2, 0, 0, 0, 1 }, + .needs_tvaudio = 1, + .pll = PLL_28, + .tuner_type = 2, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + }, + /* ---- card 0x8e ---------------------------------- */ + [BTTV_BOARD_SABRENT_TVFM] = { + .name = "Sabrent TV-FM (bttv version)", + .video_inputs = 3, + .audio_inputs = 1, + .tuner = 0, + .svhs = 2, + .gpiomask = 0x108007, + .muxsel = { 2, 3, 1, 1 }, + .audiomux = { 100000, 100002, 100002, 100000 }, + .no_msp34xx = 1, + .no_tda9875 = 1, + .no_tda7432 = 1, + .pll = PLL_28, + .tuner_type = TUNER_TNF_5335MF, + .tuner_addr = ADDR_UNSET, + .has_radio = 1, + }, + /* ---- card 0x8f ---------------------------------- */ + [BTTV_BOARD_HAUPPAUGE_IMPACTVCB] = { + .name = "Hauppauge ImpactVCB (bt878)", + .video_inputs = 4, + .audio_inputs = 0, + .tuner = -1, + .svhs = -1, + .gpiomask = 0x0f, /* old: 7 */ + .muxsel = { 0, 1, 3, 2 }, /* Composite 0-3 */ + .no_msp34xx = 1, + .no_tda9875 = 1, + .no_tda7432 = 1, + .tuner_type = -1, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + }, + [BTTV_BOARD_MACHTV_MAGICTV] = { + /* Julian Calaby + * Slightly different from original MachTV definition (0x60) + + * FIXME: RegSpy says gpiomask should be "0x001c800f", but it + * stuffs up remote chip. Bug is a pin on the jaecs is not set + * properly (methinks) causing no keyup bits being set */ + + .name = "MagicTV", /* rebranded MachTV */ + .video_inputs = 3, + .audio_inputs = 1, + .tuner = 0, + .svhs = 2, + .gpiomask = 7, + .muxsel = { 2, 3, 1, 1 }, + .audiomux = { 0, 1, 2, 3, 4 }, + .tuner_type = TUNER_TEMIC_4009FR5_PAL, + .tuner_addr = ADDR_UNSET, + .radio_addr = ADDR_UNSET, + .pll = PLL_28, + .has_radio = 1, + .has_remote = 1, + }, +}; static const unsigned int bttv_num_tvcards = ARRAY_SIZE(bttv_tvcards); @@ -2294,7 +2902,7 @@ void __devinit bttv_idcard(struct bttv *btv) btv->c.nr, btv->cardid & 0xffff, (btv->cardid >> 16) & 0xffff); printk(KERN_DEBUG "please mail id, board name and " - "the correct card= insmod option to kraxel@bytesex.org\n"); + "the correct card= insmod option to video4linux-list@redhat.com\n"); } } @@ -2338,16 +2946,16 @@ void __devinit bttv_idcard(struct bttv *btv) */ /* Some Modular Technology cards have an eeprom, but no subsystem ID */ -void identify_by_eeprom(struct bttv *btv, unsigned char eeprom_data[256]) +static void identify_by_eeprom(struct bttv *btv, unsigned char eeprom_data[256]) { int type = -1; if (0 == strncmp(eeprom_data,"GET MM20xPCTV",13)) - type = BTTV_MODTEC_205; + type = BTTV_BOARD_MODTEC_205; else if (0 == strncmp(eeprom_data+20,"Picolo",7)) - type = BTTV_EURESYS_PICOLO; + type = BTTV_BOARD_EURESYS_PICOLO; else if (eeprom_data[0] == 0x84 && eeprom_data[2]== 0) - type = BTTV_HAUPPAUGE; /* old bt848 */ + type = BTTV_BOARD_HAUPPAUGE; /* old bt848 */ if (-1 != type) { btv->c.type = type; @@ -2362,32 +2970,32 @@ static void flyvideo_gpio(struct bttv *btv) int tuner=-1,ttype; gpio_inout(0xffffff, 0); - udelay(8); // without this we would see the 0x1800 mask + udelay(8); /* without this we would see the 0x1800 mask */ gpio = gpio_read(); /* FIXME: must restore OUR_EN ??? */ - // all cards provide GPIO info, some have an additional eeprom - // LR50: GPIO coding can be found lower right CP1 .. CP9 - // CP9=GPIO23 .. CP1=GPIO15; when OPEN, the corresponding GPIO reads 1. - // GPIO14-12: n.c. - // LR90: GP9=GPIO23 .. GP1=GPIO15 (right above the bt878) - - // lowest 3 bytes are remote control codes (no handshake needed) - // xxxFFF: No remote control chip soldered - // xxxF00(LR26/LR50), xxxFE0(LR90): Remote control chip (LVA001 or CF45) soldered - // Note: Some bits are Audio_Mask ! + /* all cards provide GPIO info, some have an additional eeprom + * LR50: GPIO coding can be found lower right CP1 .. CP9 + * CP9=GPIO23 .. CP1=GPIO15; when OPEN, the corresponding GPIO reads 1. + * GPIO14-12: n.c. + * LR90: GP9=GPIO23 .. GP1=GPIO15 (right above the bt878) + * lowest 3 bytes are remote control codes (no handshake needed) + * xxxFFF: No remote control chip soldered + * xxxF00(LR26/LR50), xxxFE0(LR90): Remote control chip (LVA001 or CF45) soldered + * Note: Some bits are Audio_Mask ! + */ ttype=(gpio&0x0f0000)>>16; switch(ttype) { - case 0x0: tuner=2; // NTSC, e.g. TPI8NSR11P + case 0x0: tuner=2; /* NTSC, e.g. TPI8NSR11P */ break; - case 0x2: tuner=39;// LG NTSC (newer TAPC series) TAPC-H701P + case 0x2: tuner=39;/* LG NTSC (newer TAPC series) TAPC-H701P */ break; - case 0x4: tuner=5; // Philips PAL TPI8PSB02P, TPI8PSB12P, TPI8PSB12D or FI1216, FM1216 + case 0x4: tuner=5; /* Philips PAL TPI8PSB02P, TPI8PSB12P, TPI8PSB12D or FI1216, FM1216 */ break; - case 0x6: tuner=37; // LG PAL (newer TAPC series) TAPC-G702P + case 0x6: tuner=37;/* LG PAL (newer TAPC series) TAPC-G702P */ break; - case 0xC: tuner=3; // Philips SECAM(+PAL) FQ1216ME or FI1216MF + case 0xC: tuner=3; /* Philips SECAM(+PAL) FQ1216ME or FI1216MF */ break; default: printk(KERN_INFO "bttv%d: FlyVideo_gpio: unknown tuner type.\n", btv->c.nr); @@ -2395,15 +3003,16 @@ static void flyvideo_gpio(struct bttv *btv) has_remote = gpio & 0x800000; has_radio = gpio & 0x400000; - // unknown 0x200000; - // unknown2 0x100000; - is_capture_only = !(gpio & 0x008000); //GPIO15 + /* unknown 0x200000; + * unknown2 0x100000; */ + is_capture_only = !(gpio & 0x008000); /* GPIO15 */ has_tda9820_tda9821 = !(gpio & 0x004000); - is_lr90 = !(gpio & 0x002000); // else LR26/LR50 (LR38/LR51 f. capture only) - // gpio & 0x001000 // output bit for audio routing + is_lr90 = !(gpio & 0x002000); /* else LR26/LR50 (LR38/LR51 f. capture only) */ + /* + * gpio & 0x001000 output bit for audio routing */ if(is_capture_only) - tuner=4; // No tuner present + tuner=4; /* No tuner present */ printk(KERN_INFO "bttv%d: FlyVideo Radio=%s RemoteControl=%s Tuner=%d gpio=0x%06x\n", btv->c.nr, has_radio? "yes":"no ", has_remote? "yes":"no ", tuner, gpio); @@ -2411,15 +3020,15 @@ static void flyvideo_gpio(struct bttv *btv) btv->c.nr, is_lr90?"yes":"no ", has_tda9820_tda9821?"yes":"no ", is_capture_only?"yes":"no "); - if(tuner!= -1) // only set if known tuner autodetected, else let insmod option through + if(tuner!= -1) /* only set if known tuner autodetected, else let insmod option through */ btv->tuner_type = tuner; btv->has_radio = has_radio; - // LR90 Audio Routing is done by 2 hef4052, so Audio_Mask has 4 bits: 0x001c80 - // LR26/LR50 only has 1 hef4052, Audio_Mask 0x000c00 - // Audio options: from tuner, from tda9821/tda9821(mono,stereo,sap), from tda9874, ext., mute + /* LR90 Audio Routing is done by 2 hef4052, so Audio_Mask has 4 bits: 0x001c80 + * LR26/LR50 only has 1 hef4052, Audio_Mask 0x000c00 + * Audio options: from tuner, from tda9821/tda9821(mono,stereo,sap), from tda9874, ext., mute */ if(has_tda9820_tda9821) btv->audio_hook = lt9415_audio; - //todo: if(has_tda9874) btv->audio_hook = fv2000s_audio; + /* todo: if(has_tda9874) btv->audio_hook = fv2000s_audio; */ } static int miro_tunermap[] = { 0,6,2,3, 4,5,6,0, 3,0,4,5, 5,2,16,1, @@ -2433,7 +3042,7 @@ static void miro_pinnacle_gpio(struct bttv *btv) char *info; gpio_inout(0xffffff, 0); - gpio = gpio_read(); + gpio = gpio_read(); id = ((gpio>>10) & 63) -1; msp = bttv_I2CRead(btv, I2C_MSP3400, "MSP34xx"); if (id < 32) { @@ -2452,10 +3061,10 @@ static void miro_pinnacle_gpio(struct bttv *btv) btv->has_radio = 0; } if (-1 != msp) { - if (btv->c.type == BTTV_MIRO) - btv->c.type = BTTV_MIROPRO; - if (btv->c.type == BTTV_PINNACLE) - btv->c.type = BTTV_PINNACLEPRO; + if (btv->c.type == BTTV_BOARD_MIRO) + btv->c.type = BTTV_BOARD_MIROPRO; + if (btv->c.type == BTTV_BOARD_PINNACLE) + btv->c.type = BTTV_BOARD_PINNACLEPRO; } printk(KERN_INFO "bttv%d: miro: id=%d tuner=%d radio=%s stereo=%s\n", @@ -2470,38 +3079,44 @@ static void miro_pinnacle_gpio(struct bttv *btv) switch (id) { case 1: info = "PAL / mono"; + btv->tda9887_conf = TDA9887_INTERCARRIER; break; case 2: info = "PAL+SECAM / stereo"; btv->has_radio = 1; + btv->tda9887_conf = TDA9887_QSS; break; case 3: info = "NTSC / stereo"; btv->has_radio = 1; + btv->tda9887_conf = TDA9887_QSS; break; case 4: info = "PAL+SECAM / mono"; + btv->tda9887_conf = TDA9887_QSS; break; case 5: info = "NTSC / mono"; + btv->tda9887_conf = TDA9887_INTERCARRIER; break; case 6: info = "NTSC / stereo"; + btv->tda9887_conf = TDA9887_INTERCARRIER; break; case 7: info = "PAL / stereo"; + btv->tda9887_conf = TDA9887_INTERCARRIER; break; default: info = "oops: unknown card"; break; } if (-1 != msp) - btv->c.type = BTTV_PINNACLEPRO; + btv->c.type = BTTV_BOARD_PINNACLEPRO; printk(KERN_INFO "bttv%d: pinnacle/mt: id=%d info=\"%s\" radio=%s\n", btv->c.nr, id, info, btv->has_radio ? "yes" : "no"); - btv->tuner_type = 33; - btv->pinnacle_id = id; + btv->tuner_type = TUNER_MT2032; } } @@ -2531,21 +3146,12 @@ static void eagle_muxsel(struct bttv *btv, unsigned int input) btaor((2)<<5, ~(3<<5), BT848_IFORM); gpio_bits(3,bttv_tvcards[btv->c.type].muxsel[input&7]); -#if 0 - /* svhs */ - /* wake chroma ADC */ - btand(~BT848_ADC_C_SLEEP, BT848_ADC); - /* set to YC video */ - btor(BT848_CONTROL_COMP, BT848_E_CONTROL); - btor(BT848_CONTROL_COMP, BT848_O_CONTROL); -#else /* composite */ /* set chroma ADC to sleep */ btor(BT848_ADC_C_SLEEP, BT848_ADC); /* set to composite video */ btand(~BT848_CONTROL_COMP, BT848_E_CONTROL); btand(~BT848_CONTROL_COMP, BT848_O_CONTROL); -#endif /* switch sync drive off */ gpio_bits(LM1882_SYNC_DRIVE,LM1882_SYNC_DRIVE); @@ -2553,7 +3159,7 @@ static void eagle_muxsel(struct bttv *btv, unsigned int input) static void gvc1100_muxsel(struct bttv *btv, unsigned int input) { - static const int masks[] = {0x30, 0x01, 0x12, 0x23}; + static const int masks[] = {0x30, 0x01, 0x12, 0x23}; gpio_write(masks[input%4]); } @@ -2619,23 +3225,28 @@ static void bttv_reset_audio(struct bttv *btv) void __devinit bttv_init_card1(struct bttv *btv) { switch (btv->c.type) { - case BTTV_HAUPPAUGE: - case BTTV_HAUPPAUGE878: - boot_msp34xx(btv,5); + case BTTV_BOARD_HAUPPAUGE: + case BTTV_BOARD_HAUPPAUGE878: + boot_msp34xx(btv,5); break; - case BTTV_VOODOOTV_FM: - boot_msp34xx(btv,20); + case BTTV_BOARD_VOODOOTV_FM: + boot_msp34xx(btv,20); break; - case BTTV_AVERMEDIA98: + case BTTV_BOARD_AVERMEDIA98: boot_msp34xx(btv,11); break; - case BTTV_HAUPPAUGEPVR: + case BTTV_BOARD_HAUPPAUGEPVR: pvr_boot(btv); break; - case BTTV_TWINHAN_DST: - case BTTV_AVDVBT_771: + case BTTV_BOARD_TWINHAN_DST: + case BTTV_BOARD_AVDVBT_771: + case BTTV_BOARD_PINNACLESAT: btv->use_i2c_hw = 1; break; + case BTTV_BOARD_ADLINK_RTV24: + init_RTV24( btv ); + break; + } if (!bttv_tvcards[btv->c.type].has_dvb) bttv_reset_audio(btv); @@ -2645,53 +3256,55 @@ void __devinit bttv_init_card1(struct bttv *btv) void __devinit bttv_init_card2(struct bttv *btv) { int tda9887; - btv->tuner_type = -1; + int addr=ADDR_UNSET; + + btv->tuner_type = -1; - if (BTTV_UNKNOWN == btv->c.type) { + if (BTTV_BOARD_UNKNOWN == btv->c.type) { bttv_readee(btv,eeprom_data,0xa0); identify_by_eeprom(btv,eeprom_data); } switch (btv->c.type) { - case BTTV_MIRO: - case BTTV_MIROPRO: - case BTTV_PINNACLE: - case BTTV_PINNACLEPRO: + case BTTV_BOARD_MIRO: + case BTTV_BOARD_MIROPRO: + case BTTV_BOARD_PINNACLE: + case BTTV_BOARD_PINNACLEPRO: /* miro/pinnacle */ miro_pinnacle_gpio(btv); break; - case BTTV_FLYVIDEO_98: - case BTTV_MAXI: - case BTTV_LIFE_FLYKIT: - case BTTV_FLYVIDEO: - case BTTV_TYPHOON_TVIEW: - case BTTV_CHRONOS_VS2: - case BTTV_FLYVIDEO_98FM: - case BTTV_FLYVIDEO2000: - case BTTV_FLYVIDEO98EZ: - case BTTV_CONFERENCETV: - case BTTV_LIFETEC_9415: + case BTTV_BOARD_FLYVIDEO_98: + case BTTV_BOARD_MAXI: + case BTTV_BOARD_LIFE_FLYKIT: + case BTTV_BOARD_FLYVIDEO: + case BTTV_BOARD_TYPHOON_TVIEW: + case BTTV_BOARD_CHRONOS_VS2: + case BTTV_BOARD_FLYVIDEO_98FM: + case BTTV_BOARD_FLYVIDEO2000: + case BTTV_BOARD_FLYVIDEO98EZ: + case BTTV_BOARD_CONFERENCETV: + case BTTV_BOARD_LIFETEC_9415: flyvideo_gpio(btv); break; - case BTTV_HAUPPAUGE: - case BTTV_HAUPPAUGE878: - case BTTV_HAUPPAUGEPVR: + case BTTV_BOARD_HAUPPAUGE: + case BTTV_BOARD_HAUPPAUGE878: + case BTTV_BOARD_HAUPPAUGEPVR: /* pick up some config infos from the eeprom */ bttv_readee(btv,eeprom_data,0xa0); - hauppauge_eeprom(btv); + hauppauge_eeprom(btv); break; - case BTTV_AVERMEDIA98: - case BTTV_AVPHONE98: + case BTTV_BOARD_AVERMEDIA98: + case BTTV_BOARD_AVPHONE98: bttv_readee(btv,eeprom_data,0xa0); avermedia_eeprom(btv); break; - case BTTV_PXC200: + case BTTV_BOARD_PXC200: init_PXC200(btv); break; - case BTTV_PICOLO_TETRA_CHIP: + case BTTV_BOARD_PICOLO_TETRA_CHIP: picolo_tetra_init(btv); break; - case BTTV_VHX: + case BTTV_BOARD_VHX: btv->has_radio = 1; btv->has_matchbox = 1; btv->mbox_we = 0x20; @@ -2700,58 +3313,58 @@ void __devinit bttv_init_card2(struct bttv *btv) btv->mbox_data = 0x10; btv->mbox_mask = 0x38; break; - case BTTV_VOBIS_BOOSTAR: - case BTTV_TERRATV: + case BTTV_BOARD_VOBIS_BOOSTAR: + case BTTV_BOARD_TERRATV: terratec_active_radio_upgrade(btv); break; - case BTTV_MAGICTVIEW061: + case BTTV_BOARD_MAGICTVIEW061: if (btv->cardid == 0x3002144f) { btv->has_radio=1; printk("bttv%d: radio detected by subsystem id (CPH05x)\n",btv->c.nr); } break; - case BTTV_STB2: - if (btv->cardid == 0x3060121a) { + case BTTV_BOARD_STB2: + if (btv->cardid == 0x3060121a) { /* Fix up entry for 3DFX VoodooTV 100, which is an OEM STB card variant. */ btv->has_radio=0; btv->tuner_type=TUNER_TEMIC_NTSC; } break; - case BTTV_OSPREY1x0: - case BTTV_OSPREY1x0_848: - case BTTV_OSPREY101_848: - case BTTV_OSPREY1x1: - case BTTV_OSPREY1x1_SVID: - case BTTV_OSPREY2xx: - case BTTV_OSPREY2x0_SVID: - case BTTV_OSPREY2x0: - case BTTV_OSPREY500: - case BTTV_OSPREY540: - case BTTV_OSPREY2000: + case BTTV_BOARD_OSPREY1x0: + case BTTV_BOARD_OSPREY1x0_848: + case BTTV_BOARD_OSPREY101_848: + case BTTV_BOARD_OSPREY1x1: + case BTTV_BOARD_OSPREY1x1_SVID: + case BTTV_BOARD_OSPREY2xx: + case BTTV_BOARD_OSPREY2x0_SVID: + case BTTV_BOARD_OSPREY2x0: + case BTTV_BOARD_OSPREY500: + case BTTV_BOARD_OSPREY540: + case BTTV_BOARD_OSPREY2000: bttv_readee(btv,eeprom_data,0xa0); - osprey_eeprom(btv); + osprey_eeprom(btv); break; - case BTTV_IDS_EAGLE: + case BTTV_BOARD_IDS_EAGLE: init_ids_eagle(btv); break; - case BTTV_MODTEC_205: + case BTTV_BOARD_MODTEC_205: bttv_readee(btv,eeprom_data,0xa0); modtec_eeprom(btv); break; - case BTTV_LMLBT4: + case BTTV_BOARD_LMLBT4: init_lmlbt4x(btv); break; - case BTTV_TIBET_CS16: + case BTTV_BOARD_TIBET_CS16: tibetCS16_init(btv); break; - case BTTV_KODICOM_4400R: + case BTTV_BOARD_KODICOM_4400R: kodicom4400r_init(btv); break; } /* pll configuration */ - if (!(btv->id==848 && btv->revision==0x11)) { + if (!(btv->id==848 && btv->revision==0x11)) { /* defaults from card list */ if (PLL_28 == bttv_tvcards[btv->c.type].pll) { btv->pll.pll_ifreq=28636363; @@ -2762,40 +3375,54 @@ void __devinit bttv_init_card2(struct bttv *btv) btv->pll.pll_crystal=BT848_IFORM_XT1; } /* insmod options can override */ - switch (pll[btv->c.nr]) { - case 0: /* none */ + switch (pll[btv->c.nr]) { + case 0: /* none */ btv->pll.pll_crystal = 0; btv->pll.pll_ifreq = 0; btv->pll.pll_ofreq = 0; - break; - case 1: /* 28 MHz */ + break; + case 1: /* 28 MHz */ case 28: - btv->pll.pll_ifreq = 28636363; + btv->pll.pll_ifreq = 28636363; btv->pll.pll_ofreq = 0; - btv->pll.pll_crystal = BT848_IFORM_XT0; - break; - case 2: /* 35 MHz */ + btv->pll.pll_crystal = BT848_IFORM_XT0; + break; + case 2: /* 35 MHz */ case 35: - btv->pll.pll_ifreq = 35468950; + btv->pll.pll_ifreq = 35468950; btv->pll.pll_ofreq = 0; - btv->pll.pll_crystal = BT848_IFORM_XT1; - break; - } - } + btv->pll.pll_crystal = BT848_IFORM_XT1; + break; + } + } btv->pll.pll_current = -1; /* tuner configuration (from card list / autodetect / insmod option) */ - if (UNSET != bttv_tvcards[btv->c.type].tuner_type) + if (ADDR_UNSET != bttv_tvcards[btv->c.type].tuner_addr) + addr = bttv_tvcards[btv->c.type].tuner_addr; + + if (UNSET != bttv_tvcards[btv->c.type].tuner_type) if(UNSET == btv->tuner_type) - btv->tuner_type = bttv_tvcards[btv->c.type].tuner_type; + btv->tuner_type = bttv_tvcards[btv->c.type].tuner_type; if (UNSET != tuner[btv->c.nr]) btv->tuner_type = tuner[btv->c.nr]; printk("bttv%d: using tuner=%d\n",btv->c.nr,btv->tuner_type); - if (btv->pinnacle_id != UNSET) - bttv_call_i2c_clients(btv,AUDC_CONFIG_PINNACLE, - &btv->pinnacle_id); - if (btv->tuner_type != UNSET) - bttv_call_i2c_clients(btv,TUNER_SET_TYPE,&btv->tuner_type); + + if (btv->tuner_type != UNSET) { + struct tuner_setup tun_setup; + + tun_setup.mode_mask = T_ANALOG_TV | T_DIGITAL_TV; + tun_setup.type = btv->tuner_type; + tun_setup.addr = addr; + + bttv_call_i2c_clients(btv, TUNER_SET_TYPE_ADDR, &tun_setup); + } + + if (btv->tda9887_conf) { + bttv_call_i2c_clients(btv, TDA9887_SET_CONFIG, + &btv->tda9887_conf); + } + btv->svhs = bttv_tvcards[btv->c.type].svhs; if (svhs[btv->c.nr] != UNSET) btv->svhs = svhs[btv->c.nr]; @@ -2806,8 +3433,8 @@ void __devinit bttv_init_card2(struct bttv *btv) btv->has_radio=1; if (bttv_tvcards[btv->c.type].has_remote) btv->has_remote=1; - if (bttv_tvcards[btv->c.type].no_gpioirq) - btv->gpioirq=0; + if (!bttv_tvcards[btv->c.type].no_gpioirq) + btv->gpioirq=1; if (bttv_tvcards[btv->c.type].audio_hook) btv->audio_hook=bttv_tvcards[btv->c.type].audio_hook; @@ -2843,11 +3470,14 @@ void __devinit bttv_init_card2(struct bttv *btv) /* tuner modules */ tda9887 = 0; - if (btv->pinnacle_id != UNSET) + if (btv->tda9887_conf) tda9887 = 1; if (0 == tda9887 && 0 == bttv_tvcards[btv->c.type].has_dvb && bttv_I2CRead(btv, I2C_TDA9887, "TDA9887") >=0) tda9887 = 1; + /* Hybrid DVB card, DOES have a tda9887 */ + if (btv->c.type == BTTV_BOARD_DVICO_FUSIONHDTV_5_LITE) + tda9887 = 1; if((btv->tuner_type == TUNER_PHILIPS_FM1216ME_MK3) || (btv->tuner_type == TUNER_PHILIPS_FM1236_MK3) || (btv->tuner_type == TUNER_PHILIPS_FM1256_IH3) || @@ -2869,11 +3499,11 @@ static void modtec_eeprom(struct bttv *btv) } else if (strncmp(&(eeprom_data[0x1e]),"Alps TSBB5",10) ==0) { btv->tuner_type=TUNER_ALPS_TSBB5_PAL_I; printk("bttv%d: Modtec: Tuner autodetected by eeprom: %s\n", - btv->c.nr,&eeprom_data[0x1e]); - } else if (strncmp(&(eeprom_data[0x1e]),"Philips FM1246",14) ==0) { - btv->tuner_type=TUNER_PHILIPS_NTSC; - printk("bttv%d: Modtec: Tuner autodetected by eeprom: %s\n", - btv->c.nr,&eeprom_data[0x1e]); + btv->c.nr,&eeprom_data[0x1e]); + } else if (strncmp(&(eeprom_data[0x1e]),"Philips FM1246",14) ==0) { + btv->tuner_type=TUNER_PHILIPS_NTSC; + printk("bttv%d: Modtec: Tuner autodetected by eeprom: %s\n", + btv->c.nr,&eeprom_data[0x1e]); } else { printk("bttv%d: Modtec: Unknown TunerString: %s\n", btv->c.nr,&eeprom_data[0x1e]); @@ -2884,9 +3514,24 @@ static void __devinit hauppauge_eeprom(struct bttv *btv) { struct tveeprom tv; - tveeprom_hauppauge_analog(&tv, eeprom_data); + tveeprom_hauppauge_analog(&btv->i2c_client, &tv, eeprom_data); btv->tuner_type = tv.tuner_type; btv->has_radio = tv.has_radio; + + printk("bttv%d: Hauppauge eeprom indicates model#%d\n", + btv->c.nr, tv.model); + + /* + * Some of the 878 boards have duplicate PCI IDs. Switch the board + * type based on model #. + */ + if(tv.model == 64900) { + printk("bttv%d: Switching board type from %s to %s\n", + btv->c.nr, + bttv_tvcards[btv->c.type].name, + bttv_tvcards[BTTV_BOARD_HAUPPAUGE_IMPACTVCB].name); + btv->c.type = BTTV_BOARD_HAUPPAUGE_IMPACTVCB; + } } static int terratec_active_radio_upgrade(struct bttv *btv) @@ -2906,7 +3551,7 @@ static int terratec_active_radio_upgrade(struct bttv *btv) btv->mbox_csel = 1 << 10; freq=88000/62.5; - tea5757_write(btv, 5 * freq + 0x358); // write 0x1ed8 + tea5757_write(btv, 5 * freq + 0x358); /* write 0x1ed8 */ if (0x1ed8 == tea5757_read(btv)) { printk("bttv%d: Terratec Active Radio Upgrade found.\n", btv->c.nr); @@ -2938,7 +3583,7 @@ static int terratec_active_radio_upgrade(struct bttv *btv) static int __devinit pvr_altera_load(struct bttv *btv, u8 *micro, u32 microlen) { u32 n; - u8 bits; + u8 bits; int i; gpio_inout(0xffffff,BTTV_ALT_DATA|BTTV_ALT_DCLK|BTTV_ALT_NCONFIG); @@ -2974,19 +3619,19 @@ static int __devinit pvr_altera_load(struct bttv *btv, u8 *micro, u32 microlen) static int __devinit pvr_boot(struct bttv *btv) { - const struct firmware *fw_entry; + const struct firmware *fw_entry; int rc; rc = request_firmware(&fw_entry, "hcwamc.rbf", &btv->c.pci->dev); if (rc != 0) { printk(KERN_WARNING "bttv%d: no altera firmware [via hotplug]\n", btv->c.nr); - return rc; - } + return rc; + } rc = pvr_altera_load(btv, fw_entry->data, fw_entry->size); printk(KERN_INFO "bttv%d: altera firmware upload %s\n", btv->c.nr, (rc < 0) ? "failed" : "ok"); - release_firmware(fw_entry); + release_firmware(fw_entry); return rc; } @@ -3000,33 +3645,33 @@ static void __devinit osprey_eeprom(struct bttv *btv) unsigned long serial = 0; if (btv->c.type == 0) { - /* this might be an antique... check for MMAC label in eeprom */ - if ((ee[0]=='M') && (ee[1]=='M') && (ee[2]=='A') && (ee[3]=='C')) { - unsigned char checksum = 0; - for (i =0; i<21; i++) + /* this might be an antique... check for MMAC label in eeprom */ + if ((ee[0]=='M') && (ee[1]=='M') && (ee[2]=='A') && (ee[3]=='C')) { + unsigned char checksum = 0; + for (i =0; i<21; i++) checksum += ee[i]; - if (checksum != ee[21]) + if (checksum != ee[21]) return; - btv->c.type = BTTV_OSPREY1x0_848; + btv->c.type = BTTV_BOARD_OSPREY1x0_848; for (i = 12; i < 21; i++) serial *= 10, serial += ee[i] - '0'; - } + } } else { unsigned short type; - int offset = 4*16; - - for(; offset < 8*16; offset += 16) { - unsigned short checksum = 0; - /* verify the checksum */ - for(i = 0; i<14; i++) checksum += ee[i+offset]; - checksum = ~checksum; /* no idea why */ - if ((((checksum>>8)&0x0FF) == ee[offset+14]) && - ((checksum & 0x0FF) == ee[offset+15])) { - break; - } - } - - if (offset >= 8*16) + int offset = 4*16; + + for(; offset < 8*16; offset += 16) { + unsigned short checksum = 0; + /* verify the checksum */ + for(i = 0; i<14; i++) checksum += ee[i+offset]; + checksum = ~checksum; /* no idea why */ + if ((((checksum>>8)&0x0FF) == ee[offset+14]) && + ((checksum & 0x0FF) == ee[offset+15])) { + break; + } + } + + if (offset >= 8*16) return; /* found a valid descriptor */ @@ -3036,48 +3681,48 @@ static void __devinit osprey_eeprom(struct bttv *btv) /* 848 based */ case 0x0004: - btv->c.type = BTTV_OSPREY1x0_848; + btv->c.type = BTTV_BOARD_OSPREY1x0_848; break; case 0x0005: - btv->c.type = BTTV_OSPREY101_848; + btv->c.type = BTTV_BOARD_OSPREY101_848; break; - /* 878 based */ + /* 878 based */ case 0x0012: case 0x0013: - btv->c.type = BTTV_OSPREY1x0; + btv->c.type = BTTV_BOARD_OSPREY1x0; break; case 0x0014: case 0x0015: - btv->c.type = BTTV_OSPREY1x1; + btv->c.type = BTTV_BOARD_OSPREY1x1; break; case 0x0016: case 0x0017: case 0x0020: - btv->c.type = BTTV_OSPREY1x1_SVID; + btv->c.type = BTTV_BOARD_OSPREY1x1_SVID; break; case 0x0018: case 0x0019: case 0x001E: case 0x001F: - btv->c.type = BTTV_OSPREY2xx; + btv->c.type = BTTV_BOARD_OSPREY2xx; break; case 0x001A: case 0x001B: - btv->c.type = BTTV_OSPREY2x0_SVID; + btv->c.type = BTTV_BOARD_OSPREY2x0_SVID; break; case 0x0040: - btv->c.type = BTTV_OSPREY500; + btv->c.type = BTTV_BOARD_OSPREY500; break; case 0x0050: case 0x0056: - btv->c.type = BTTV_OSPREY540; + btv->c.type = BTTV_BOARD_OSPREY540; /* bttv_osprey_540_init(btv); */ break; case 0x0060: case 0x0070: - btv->c.type = BTTV_OSPREY2x0; - //enable output on select control lines + btv->c.type = BTTV_BOARD_OSPREY2x0; + /* enable output on select control lines */ gpio_inout(0xffffff,0x000303); break; default: @@ -3098,35 +3743,27 @@ static void __devinit osprey_eeprom(struct bttv *btv) /* AVermedia specific stuff, from bktr_card.c */ static int tuner_0_table[] = { - TUNER_PHILIPS_NTSC, TUNER_PHILIPS_PAL /* PAL-BG*/, - TUNER_PHILIPS_PAL, TUNER_PHILIPS_PAL /* PAL-I*/, - TUNER_PHILIPS_PAL, TUNER_PHILIPS_PAL, - TUNER_PHILIPS_SECAM, TUNER_PHILIPS_SECAM, - TUNER_PHILIPS_SECAM, TUNER_PHILIPS_PAL, + TUNER_PHILIPS_NTSC, TUNER_PHILIPS_PAL /* PAL-BG*/, + TUNER_PHILIPS_PAL, TUNER_PHILIPS_PAL /* PAL-I*/, + TUNER_PHILIPS_PAL, TUNER_PHILIPS_PAL, + TUNER_PHILIPS_SECAM, TUNER_PHILIPS_SECAM, + TUNER_PHILIPS_SECAM, TUNER_PHILIPS_PAL, TUNER_PHILIPS_FM1216ME_MK3 }; -#if 0 -int tuner_0_fm_table[] = { - PHILIPS_FR1236_NTSC, PHILIPS_FR1216_PAL, - PHILIPS_FR1216_PAL, PHILIPS_FR1216_PAL, - PHILIPS_FR1216_PAL, PHILIPS_FR1216_PAL, - PHILIPS_FR1236_SECAM, PHILIPS_FR1236_SECAM, - PHILIPS_FR1236_SECAM, PHILIPS_FR1216_PAL}; -#endif static int tuner_1_table[] = { - TUNER_TEMIC_NTSC, TUNER_TEMIC_PAL, + TUNER_TEMIC_NTSC, TUNER_TEMIC_PAL, TUNER_TEMIC_PAL, TUNER_TEMIC_PAL, TUNER_TEMIC_PAL, TUNER_TEMIC_PAL, - TUNER_TEMIC_4012FY5, TUNER_TEMIC_4012FY5, //TUNER_TEMIC_SECAM - TUNER_TEMIC_4012FY5, TUNER_TEMIC_PAL}; + TUNER_TEMIC_4012FY5, TUNER_TEMIC_4012FY5, /* TUNER_TEMIC_SECAM */ + TUNER_TEMIC_4012FY5, TUNER_TEMIC_PAL}; static void __devinit avermedia_eeprom(struct bttv *btv) { - int tuner_make,tuner_tv_fm,tuner_format,tuner=0; + int tuner_make,tuner_tv_fm,tuner_format,tuner=0; tuner_make = (eeprom_data[0x41] & 0x7); - tuner_tv_fm = (eeprom_data[0x41] & 0x18) >> 3; - tuner_format = (eeprom_data[0x42] & 0xf0) >> 4; + tuner_tv_fm = (eeprom_data[0x41] & 0x18) >> 3; + tuner_format = (eeprom_data[0x42] & 0xf0) >> 4; btv->has_remote = (eeprom_data[0x42] & 0x01); if (tuner_make == 0 || tuner_make == 2) @@ -3138,7 +3775,7 @@ static void __devinit avermedia_eeprom(struct bttv *btv) if (tuner_make == 4) if(tuner_format == 0x09) - tuner = TUNER_LG_NTSC_NEW_TAPC; // TAPC-G702P + tuner = TUNER_LG_NTSC_NEW_TAPC; /* TAPC-G702P */ printk(KERN_INFO "bttv%d: Avermedia eeprom[0x%02x%02x]: tuner=", btv->c.nr,eeprom_data[0x41],eeprom_data[0x42]); @@ -3155,18 +3792,18 @@ static void __devinit avermedia_eeprom(struct bttv *btv) /* used on Voodoo TV/FM (Voodoo 200), S0 wired to 0x10000 */ void bttv_tda9880_setnorm(struct bttv *btv, int norm) { - // fix up our card entry + /* fix up our card entry */ if(norm==VIDEO_MODE_NTSC) { - bttv_tvcards[BTTV_VOODOOTV_FM].audiomux[0]=0x957fff; - bttv_tvcards[BTTV_VOODOOTV_FM].audiomux[4]=0x957fff; + bttv_tvcards[BTTV_BOARD_VOODOOTV_FM].audiomux[0]=0x957fff; + bttv_tvcards[BTTV_BOARD_VOODOOTV_FM].audiomux[4]=0x957fff; dprintk("bttv_tda9880_setnorm to NTSC\n"); } else { - bttv_tvcards[BTTV_VOODOOTV_FM].audiomux[0]=0x947fff; - bttv_tvcards[BTTV_VOODOOTV_FM].audiomux[4]=0x947fff; + bttv_tvcards[BTTV_BOARD_VOODOOTV_FM].audiomux[0]=0x947fff; + bttv_tvcards[BTTV_BOARD_VOODOOTV_FM].audiomux[4]=0x947fff; dprintk("bttv_tda9880_setnorm to PAL\n"); } - // set GPIO according + /* set GPIO according */ gpio_bits(bttv_tvcards[btv->c.type].gpiomask, bttv_tvcards[btv->c.type].audiomux[btv->audio]); } @@ -3174,7 +3811,7 @@ void bttv_tda9880_setnorm(struct bttv *btv, int norm) /* * reset/enable the MSP on some Hauppauge cards - * Thanks to Kyösti Mälkki (kmalkki@cc.hut.fi)! + * Thanks to Kyösti Mälkki (kmalkki@cc.hut.fi)! * * Hauppauge: pin 5 * Voodoo: pin 20 @@ -3185,7 +3822,7 @@ static void __devinit boot_msp34xx(struct bttv *btv, int pin) gpio_inout(mask,mask); gpio_bits(mask,0); - udelay(2500); + udelay(2500); gpio_bits(mask,mask); if (bttv_gpio) @@ -3197,36 +3834,6 @@ static void __devinit boot_msp34xx(struct bttv *btv, int pin) static void __devinit boot_bt832(struct bttv *btv) { -#if 0 /* not working yet */ - int resetbit=0; - - switch (btv->c.type) { - case BTTV_PXELVWPLTVPAK: - resetbit = 0x400000; - break; - case BTTV_MODTEC_205: - resetbit = 1<<9; - break; - default: - BUG(); - } - - request_module("bt832"); - bttv_call_i2c_clients(btv, BT832_HEXDUMP, NULL); - - printk("bttv%d: Reset Bt832 [line=0x%x]\n",btv->c.nr,resetbit); - gpio_write(0); - gpio_inout(resetbit, resetbit); - udelay(5); - gpio_bits(resetbit, resetbit); - udelay(5); - gpio_bits(resetbit, 0); - udelay(5); - - // bt832 on pixelview changes from i2c 0x8a to 0x88 after - // being reset as above. So we must follow by this: - bttv_call_i2c_clients(btv, BT832_REATTACH, NULL); -#endif } /* ----------------------------------------------------------------------- */ @@ -3291,7 +3898,7 @@ static void __devinit init_PXC200(struct bttv *btv) udelay(10); gpio_write(1<<2); - for (i = 0; i < ARRAY_SIZE(vals); i++) { + for (i = 0; i < ARRAY_SIZE(vals); i++) { tmp=bttv_I2CWrite(btv,0x1E,0,vals[i],1); if (tmp != -1) { printk(KERN_INFO @@ -3304,6 +3911,83 @@ static void __devinit init_PXC200(struct bttv *btv) } + +/* ----------------------------------------------------------------------- */ +/* + * The Adlink RTV-24 (aka Angelo) has some special initialisation to unlock + * it. This apparently involves the following procedure for each 878 chip: + * + * 1) write 0x00C3FEFF to the GPIO_OUT_EN register + * + * 2) write to GPIO_DATA + * - 0x0E + * - sleep 1ms + * - 0x10 + 0x0E + * - sleep 10ms + * - 0x0E + * read from GPIO_DATA into buf (uint_32) + * - if ( data>>18 & 0x01 != 0) || ( buf>>19 & 0x01 != 1 ) + * error. ERROR_CPLD_Check_Failed stop. + * + * 3) write to GPIO_DATA + * - write 0x4400 + 0x0E + * - sleep 10ms + * - write 0x4410 + 0x0E + * - sleep 1ms + * - write 0x0E + * read from GPIO_DATA into buf (uint_32) + * - if ( buf>>18 & 0x01 ) || ( buf>>19 && 0x01 != 0 ) + * error. ERROR_CPLD_Check_Failed. + */ +/* ----------------------------------------------------------------------- */ +static void +init_RTV24 (struct bttv *btv) +{ + uint32_t dataRead = 0; + long watchdog_value = 0x0E; + + printk (KERN_INFO + "bttv%d: Adlink RTV-24 initialisation in progress ...\n", + btv->c.nr); + + btwrite (0x00c3feff, BT848_GPIO_OUT_EN); + + btwrite (0 + watchdog_value, BT848_GPIO_DATA); + msleep (1); + btwrite (0x10 + watchdog_value, BT848_GPIO_DATA); + msleep (10); + btwrite (0 + watchdog_value, BT848_GPIO_DATA); + + dataRead = btread (BT848_GPIO_DATA); + + if ((((dataRead >> 18) & 0x01) != 0) || (((dataRead >> 19) & 0x01) != 1)) { + printk (KERN_INFO + "bttv%d: Adlink RTV-24 initialisation(1) ERROR_CPLD_Check_Failed (read %d)\n", + btv->c.nr, dataRead); + } + + btwrite (0x4400 + watchdog_value, BT848_GPIO_DATA); + msleep (10); + btwrite (0x4410 + watchdog_value, BT848_GPIO_DATA); + msleep (1); + btwrite (watchdog_value, BT848_GPIO_DATA); + msleep (1); + dataRead = btread (BT848_GPIO_DATA); + + if ((((dataRead >> 18) & 0x01) != 0) || (((dataRead >> 19) & 0x01) != 0)) { + printk (KERN_INFO + "bttv%d: Adlink RTV-24 initialisation(2) ERROR_CPLD_Check_Failed (read %d)\n", + btv->c.nr, dataRead); + + return; + } + + printk (KERN_INFO + "bttv%d: Adlink RTV-24 initialisation complete.\n", btv->c.nr); +} + + + /* ----------------------------------------------------------------------- */ /* Miro Pro radio stuff -- the tea5757 is connected to some GPIO ports */ /* @@ -3412,7 +4096,7 @@ static int tea5757_read(struct bttv *btv) udelay(10); timeout= jiffies + HZ; - // wait for DATA line to go low; error if it doesn't + /* wait for DATA line to go low; error if it doesn't */ while (bus_in(btv,btv->mbox_data) && time_before(jiffies, timeout)) schedule(); if (bus_in(btv,btv->mbox_data)) { @@ -3474,18 +4158,13 @@ void tea5757_set_freq(struct bttv *btv, unsigned short freq) { dprintk("tea5757_set_freq %d\n",freq); tea5757_write(btv, 5 * freq + 0x358); /* add 10.7MHz (see docs) */ -#if 0 - /* breaks Miro PCTV */ - value = tea5757_read(btv); - dprintk("bttv%d: tea5757 readback=0x%x\n",btv->c.nr,value); -#endif } /* ----------------------------------------------------------------------- */ /* winview */ -void winview_audio(struct bttv *btv, struct video_audio *v, int set) +static void winview_audio(struct bttv *btv, struct video_audio *v, int set) { /* PT2254A programming Jon Tombs, jon@gte.esi.us.es */ int bits_out, loops, vol, data; @@ -3544,8 +4223,8 @@ gvbctv3pci_audio(struct bttv *btv, struct video_audio *v, int set) con = 0x300; if (v->mode & VIDEO_SOUND_STEREO) con = 0x200; -// if (v->mode & VIDEO_SOUND_MONO) -// con = 0x100; +/* if (v->mode & VIDEO_SOUND_MONO) + * con = 0x100; */ gpio_bits(0x300, con); } else { v->mode = VIDEO_SOUND_STEREO | @@ -3558,13 +4237,8 @@ gvbctv5pci_audio(struct bttv *btv, struct video_audio *v, int set) { unsigned int val, con; -#if BTTV_VERSION_CODE > KERNEL_VERSION(0,8,0) if (btv->radio_user) return; -#else - if (btv->radio) - return; -#endif val = gpio_read(); if (set) { @@ -3667,33 +4341,33 @@ avermedia_tv_stereo_audio(struct bttv *btv, struct video_audio *v, int set) static void lt9415_audio(struct bttv *btv, struct video_audio *v, int set) { - int val = 0; + int val = 0; - if (gpio_read() & 0x4000) { + if (gpio_read() & 0x4000) { v->mode = VIDEO_SOUND_MONO; return; } - if (set) { - if (v->mode & VIDEO_SOUND_LANG2) /* A2 SAP */ - val = 0x0080; + if (set) { + if (v->mode & VIDEO_SOUND_LANG2) /* A2 SAP */ + val = 0x0080; if (v->mode & VIDEO_SOUND_STEREO) /* A2 stereo */ - val = 0x0880; - if ((v->mode & VIDEO_SOUND_LANG1) || + val = 0x0880; + if ((v->mode & VIDEO_SOUND_LANG1) || (v->mode & VIDEO_SOUND_MONO)) val = 0; gpio_bits(0x0880, val); - if (bttv_gpio) - bttv_gpio_tracking(btv,"lt9415"); - } else { + if (bttv_gpio) + bttv_gpio_tracking(btv,"lt9415"); + } else { /* autodetect doesn't work with this card :-( */ - v->mode = VIDEO_SOUND_MONO | VIDEO_SOUND_STEREO | + v->mode = VIDEO_SOUND_MONO | VIDEO_SOUND_STEREO | VIDEO_SOUND_LANG1 | VIDEO_SOUND_LANG2; - return; - } + return; + } } -// TDA9821 on TerraTV+ Bt848, Bt878 +/* TDA9821 on TerraTV+ Bt848, Bt878 */ static void terratv_audio(struct bttv *btv, struct video_audio *v, int set) { @@ -3753,13 +4427,8 @@ pvbt878p9b_audio(struct bttv *btv, struct video_audio *v, int set) { unsigned int val = 0; -#if BTTV_VERSION_CODE > KERNEL_VERSION(0,8,0) if (btv->radio_user) return; -#else - if (btv->radio) - return; -#endif if (set) { if (v->mode & VIDEO_SOUND_MONO) { @@ -3790,20 +4459,15 @@ fv2000s_audio(struct bttv *btv, struct video_audio *v, int set) { unsigned int val = 0xffff; -#if BTTV_VERSION_CODE > KERNEL_VERSION(0,8,0) if (btv->radio_user) return; -#else - if (btv->radio) - return; -#endif if (set) { if (v->mode & VIDEO_SOUND_MONO) { val = 0x0000; } if ((v->mode & (VIDEO_SOUND_LANG1 | VIDEO_SOUND_LANG2)) || (v->mode & VIDEO_SOUND_STEREO)) { - val = 0x1080; //-dk-???: 0x0880, 0x0080, 0x1800 ... + val = 0x1080; /*-dk-???: 0x0880, 0x0080, 0x1800 ... */ } if (val != 0xffff) { gpio_bits(0x1800, val); @@ -3823,26 +4487,26 @@ fv2000s_audio(struct bttv *btv, struct video_audio *v, int set) static void windvr_audio(struct bttv *btv, struct video_audio *v, int set) { - unsigned long val = 0; - - if (set) { - if (v->mode & VIDEO_SOUND_MONO) - val = 0x040000; - if (v->mode & VIDEO_SOUND_LANG1) - val = 0; - if (v->mode & VIDEO_SOUND_LANG2) - val = 0x100000; - if (v->mode & VIDEO_SOUND_STEREO) - val = 0; - if (val) { + unsigned long val = 0; + + if (set) { + if (v->mode & VIDEO_SOUND_MONO) + val = 0x040000; + if (v->mode & VIDEO_SOUND_LANG1) + val = 0; + if (v->mode & VIDEO_SOUND_LANG2) + val = 0x100000; + if (v->mode & VIDEO_SOUND_STEREO) + val = 0; + if (val) { gpio_bits(0x140000, val); - if (bttv_gpio) - bttv_gpio_tracking(btv,"windvr"); - } - } else { - v->mode = VIDEO_SOUND_MONO | VIDEO_SOUND_STEREO | - VIDEO_SOUND_LANG1 | VIDEO_SOUND_LANG2; - } + if (bttv_gpio) + bttv_gpio_tracking(btv,"windvr"); + } + } else { + v->mode = VIDEO_SOUND_MONO | VIDEO_SOUND_STEREO | + VIDEO_SOUND_LANG1 | VIDEO_SOUND_LANG2; + } } /* @@ -3854,10 +4518,10 @@ adtvk503_audio(struct bttv *btv, struct video_audio *v, int set) { unsigned int con = 0xffffff; - //btaor(0x1e0000, ~0x1e0000, BT848_GPIO_OUT_EN); + /* btaor(0x1e0000, ~0x1e0000, BT848_GPIO_OUT_EN); */ if (set) { - //btor(***, BT848_GPIO_OUT_EN); + /* btor(***, BT848_GPIO_OUT_EN); */ if (v->mode & VIDEO_SOUND_LANG1) con = 0x00000000; if (v->mode & VIDEO_SOUND_LANG2) @@ -4064,14 +4728,14 @@ static void kodicom4400r_init(struct bttv *btv) master[btv->c.nr+2] = btv; } -// The Grandtec X-Guard framegrabber card uses two Dual 4-channel -// video multiplexers to provide up to 16 video inputs. These -// multiplexers are controlled by the lower 8 GPIO pins of the -// bt878. The multiplexers probably Pericom PI5V331Q or similar. - -// xxx0 is pin xxx of multiplexer U5, -// yyy1 is pin yyy of multiplexer U2 +/* The Grandtec X-Guard framegrabber card uses two Dual 4-channel + * video multiplexers to provide up to 16 video inputs. These + * multiplexers are controlled by the lower 8 GPIO pins of the + * bt878. The multiplexers probably Pericom PI5V331Q or similar. + * xxx0 is pin xxx of multiplexer U5, + * yyy1 is pin yyy of multiplexer U2 + */ #define ENA0 0x01 #define ENB0 0x02 #define ENA1 0x04 @@ -4085,10 +4749,10 @@ static void kodicom4400r_init(struct bttv *btv) static void xguard_muxsel(struct bttv *btv, unsigned int input) { static const int masks[] = { - ENB0, ENB0|IN00, ENB0|IN10, ENB0|IN00|IN10, - ENA0, ENA0|IN00, ENA0|IN10, ENA0|IN00|IN10, - ENB1, ENB1|IN01, ENB1|IN11, ENB1|IN01|IN11, - ENA1, ENA1|IN01, ENA1|IN11, ENA1|IN01|IN11, + ENB0, ENB0|IN00, ENB0|IN10, ENB0|IN00|IN10, + ENA0, ENA0|IN00, ENA0|IN10, ENA0|IN00|IN10, + ENB1, ENB1|IN01, ENB1|IN11, ENB1|IN01|IN11, + ENA1, ENA1|IN01, ENA1|IN11, ENA1|IN01|IN11, }; gpio_write(masks[input%16]); } @@ -4142,14 +4806,14 @@ static void picolo_tetra_muxsel (struct bttv* btv, unsigned int input) static void ivc120_muxsel(struct bttv *btv, unsigned int input) { - // Simple maths + /* Simple maths */ int key = input % 4; int matrix = input / 4; dprintk("bttv%d: ivc120_muxsel: Input - %02d | TDA - %02d | In - %02d\n", btv->c.nr, input, matrix, key); - // Handles the input selection on the TDA8540's + /* Handles the input selection on the TDA8540's */ bttv_I2CWrite(btv, I2C_TDA8540_ALT3, 0x00, ((matrix == 3) ? (key | key << 2) : 0x00), 1); bttv_I2CWrite(btv, I2C_TDA8540_ALT4, 0x00, @@ -4159,17 +4823,17 @@ static void ivc120_muxsel(struct bttv *btv, unsigned int input) bttv_I2CWrite(btv, I2C_TDA8540_ALT6, 0x00, ((matrix == 2) ? (key | key << 2) : 0x00), 1); - // Handles the output enables on the TDA8540's + /* Handles the output enables on the TDA8540's */ bttv_I2CWrite(btv, I2C_TDA8540_ALT3, 0x02, - ((matrix == 3) ? 0x03 : 0x00), 1); // 13 - 16 + ((matrix == 3) ? 0x03 : 0x00), 1); /* 13 - 16 */ bttv_I2CWrite(btv, I2C_TDA8540_ALT4, 0x02, - ((matrix == 0) ? 0x03 : 0x00), 1); // 1-4 + ((matrix == 0) ? 0x03 : 0x00), 1); /* 1-4 */ bttv_I2CWrite(btv, I2C_TDA8540_ALT5, 0x02, - ((matrix == 1) ? 0x03 : 0x00), 1); // 5-8 + ((matrix == 1) ? 0x03 : 0x00), 1); /* 5-8 */ bttv_I2CWrite(btv, I2C_TDA8540_ALT6, 0x02, - ((matrix == 2) ? 0x03 : 0x00), 1); // 9-12 + ((matrix == 2) ? 0x03 : 0x00), 1); /* 9-12 */ - // Selects MUX0 for input on the 878 + /* Selects MUX0 for input on the 878 */ btaor((0)<<5, ~(3<<5), BT848_IFORM); } @@ -4193,10 +4857,10 @@ static void ivc120_muxsel(struct bttv *btv, unsigned int input) static void PXC200_muxsel(struct bttv *btv, unsigned int input) { - int rc; + int rc; long mux; int bitmask; - unsigned char buf[2]; + unsigned char buf[2]; /* Read PIC config to determine if this is a PXC200F */ /* PX_I2C_CMD_CFG*/ @@ -4226,14 +4890,14 @@ static void PXC200_muxsel(struct bttv *btv, unsigned int input) /* bitmask=0x30f; */ bitmask=0x302; /* check whether we have a PXC200A */ - if (btv->cardid == PX_PXC200A_CARDID) { + if (btv->cardid == PX_PXC200A_CARDID) { bitmask ^= 0x180; /* use 7 and 9, not 8 and 9 */ bitmask |= 7<<4; /* the DAC */ } btwrite(bitmask, BT848_GPIO_OUT_EN); bitmask = btread(BT848_GPIO_DATA); - if (btv->cardid == PX_PXC200A_CARDID) + if (btv->cardid == PX_PXC200A_CARDID) bitmask = (bitmask & ~0x280) | ((mux & 2) << 8) | ((mux & 1) << 7); else /* older device */ bitmask = (bitmask & ~0x300) | ((mux & 3) << 8); @@ -4246,7 +4910,7 @@ static void PXC200_muxsel(struct bttv *btv, unsigned int input) * * needed because bttv-driver sets mux before calling this function */ - if (btv->cardid == PX_PXC200A_CARDID) + if (btv->cardid == PX_PXC200A_CARDID) btaor(2<<5, ~BT848_IFORM_MUXSEL, BT848_IFORM); else /* older device */ btand(~BT848_IFORM_MUXSEL,BT848_IFORM); @@ -4273,11 +4937,6 @@ void __devinit bttv_check_chipset(void) latency = 0x0A; #endif -#if 0 - /* print which chipset we have */ - while ((dev = pci_find_class(PCI_CLASS_BRIDGE_HOST << 8,dev))) - printk(KERN_INFO "bttv: Host bridge is %s\n",pci_name(dev)); -#endif /* print warnings about any quirks found */ if (triton1) @@ -4286,17 +4945,18 @@ void __devinit bttv_check_chipset(void) printk(KERN_INFO "bttv: Host bridge needs VSFX enabled.\n"); if (pcipci_fail) { printk(KERN_WARNING "bttv: BT848 and your chipset may not work together.\n"); - if (UNSET == no_overlay) { - printk(KERN_WARNING "bttv: going to disable overlay.\n"); + if (!no_overlay) { + printk(KERN_WARNING "bttv: overlay will be disabled.\n"); no_overlay = 1; + } else { + printk(KERN_WARNING "bttv: overlay forced. Use this option at your own risk.\n"); } } if (UNSET != latency) printk(KERN_INFO "bttv: pci latency fixup [%d]\n",latency); - - while ((dev = pci_find_device(PCI_VENDOR_ID_INTEL, + while ((dev = pci_get_device(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82441, dev))) { - unsigned char b; + unsigned char b; pci_read_config_byte(dev, 0x53, &b); if (bttv_debug) printk(KERN_INFO "bttv: Host bridge: 82441FX Natoma, " @@ -4306,7 +4966,7 @@ void __devinit bttv_check_chipset(void) int __devinit bttv_handle_chipset(struct bttv *btv) { - unsigned char command; + unsigned char command; if (!triton1 && !vsfx && UNSET == latency) return 0; @@ -4327,13 +4987,13 @@ int __devinit bttv_handle_chipset(struct bttv *btv) btv->triton1 = BT848_INT_ETBF; } else { /* bt878 has a bit in the pci config space for it */ - pci_read_config_byte(btv->c.pci, BT878_DEVCTRL, &command); + pci_read_config_byte(btv->c.pci, BT878_DEVCTRL, &command); if (triton1) command |= BT878_EN_TBFX; if (vsfx) command |= BT878_EN_VSFX; - pci_write_config_byte(btv->c.pci, BT878_DEVCTRL, command); - } + pci_write_config_byte(btv->c.pci, BT878_DEVCTRL, command); + } if (UNSET != latency) pci_write_config_byte(btv->c.pci, PCI_LATENCY_TIMER, latency); return 0; diff --git a/drivers/media/video/bttv-driver.c b/drivers/media/video/bttv-driver.c index 033cc5498..578b20085 100644 --- a/drivers/media/video/bttv-driver.c +++ b/drivers/media/video/bttv-driver.c @@ -1,10 +1,9 @@ /* - $Id: bttv-driver.c,v 1.37 2005/02/21 13:57:59 kraxel Exp $ bttv - Bt848 frame grabber driver Copyright (C) 1996,97,98 Ralph Metzler - & Marcus Metzler + & Marcus Metzler (c) 1999-2002 Gerd Knorr some v4l2 code lines are taken from Justin's bttv2 driver which is @@ -35,52 +34,60 @@ #include #include #include +#include "bttvp.h" +#include + +#include #include #include -#include "bttvp.h" +#include "rds.h" + unsigned int bttv_num; /* number of Bt848s in use */ struct bttv bttvs[BTTV_MAX]; -unsigned int bttv_debug = 0; +unsigned int bttv_debug; unsigned int bttv_verbose = 1; -unsigned int bttv_gpio = 0; +unsigned int bttv_gpio; /* config variables */ #ifdef __BIG_ENDIAN static unsigned int bigendian=1; #else -static unsigned int bigendian=0; +static unsigned int bigendian; #endif static unsigned int radio[BTTV_MAX]; -static unsigned int irq_debug = 0; +static unsigned int irq_debug; static unsigned int gbuffers = 8; static unsigned int gbufsize = 0x208000; static int video_nr = -1; static int radio_nr = -1; static int vbi_nr = -1; -static int debug_latency = 0; +static int debug_latency; -static unsigned int fdsr = 0; +static unsigned int fdsr; /* options */ -static unsigned int combfilter = 0; -static unsigned int lumafilter = 0; +static unsigned int combfilter; +static unsigned int lumafilter; static unsigned int automute = 1; -static unsigned int chroma_agc = 0; +static unsigned int chroma_agc; static unsigned int adc_crush = 1; static unsigned int whitecrush_upper = 0xCF; static unsigned int whitecrush_lower = 0x7F; -static unsigned int vcr_hack = 0; -static unsigned int irq_iswitch = 0; +static unsigned int vcr_hack; +static unsigned int irq_iswitch; +static unsigned int uv_ratio = 50; +static unsigned int full_luma_range; +static unsigned int coring; +extern int no_overlay; /* API features (turn on/off stuff for testing) */ static unsigned int v4l2 = 1; - /* insmod args */ module_param(bttv_verbose, int, 0644); module_param(bttv_gpio, int, 0644); @@ -106,6 +113,9 @@ module_param(adc_crush, int, 0444); module_param(whitecrush_upper, int, 0444); module_param(whitecrush_lower, int, 0444); module_param(vcr_hack, int, 0444); +module_param(uv_ratio, int, 0444); +module_param(full_luma_range, int, 0444); +module_param(coring, int, 0444); module_param_array(radio, int, NULL, 0444); @@ -124,6 +134,9 @@ MODULE_PARM_DESC(whitecrush_upper,"sets the white crush upper value, default is MODULE_PARM_DESC(whitecrush_lower,"sets the white crush lower value, default is 127"); MODULE_PARM_DESC(vcr_hack,"enables the VCR hack (improves synch on poor VCR tapes), default is 0 (no)"); MODULE_PARM_DESC(irq_iswitch,"switch inputs in irq handler"); +MODULE_PARM_DESC(uv_ratio,"ratio between u and v gains, default is 50"); +MODULE_PARM_DESC(full_luma_range,"use the full luma range, default is 0 (no)"); +MODULE_PARM_DESC(coring,"set the luma coring level, default is 0 (no)"); MODULE_DESCRIPTION("bttv - v4l/v4l2 driver module for bt848/878 based cards"); MODULE_AUTHOR("Ralph Metzler & Marcus Metzler & Gerd Knorr"); @@ -179,8 +192,8 @@ static u8 SRAM_Table[][60] = const struct bttv_tvnorm bttv_tvnorms[] = { /* PAL-BDGHI */ - /* max. active video is actually 922, but 924 is divisible by 4 and 3! */ - /* actually, max active PAL with HSCALE=0 is 948, NTSC is 768 - nil */ + /* max. active video is actually 922, but 924 is divisible by 4 and 3! */ + /* actually, max active PAL with HSCALE=0 is 948, NTSC is 768 - nil */ { .v4l2_id = V4L2_STD_PAL, .name = "PAL", @@ -197,8 +210,11 @@ const struct bttv_tvnorm bttv_tvnorms[] = { .vdelay = 0x20, .vbipack = 255, .sram = 0, + /* ITU-R frame line number of the first VBI line + we can capture, of the first and second field. */ + .vbistart = { 7,320 }, },{ - .v4l2_id = V4L2_STD_NTSC_M, + .v4l2_id = V4L2_STD_NTSC_M | V4L2_STD_NTSC_M_KR, .name = "NTSC", .Fsc = 28636363, .swidth = 768, @@ -213,6 +229,7 @@ const struct bttv_tvnorm bttv_tvnorms[] = { .vdelay = 0x1a, .vbipack = 144, .sram = 1, + .vbistart = { 10, 273 }, },{ .v4l2_id = V4L2_STD_SECAM, .name = "SECAM", @@ -229,6 +246,7 @@ const struct bttv_tvnorm bttv_tvnorms[] = { .vdelay = 0x20, .vbipack = 255, .sram = 0, /* like PAL, correct? */ + .vbistart = { 7, 320 }, },{ .v4l2_id = V4L2_STD_PAL_Nc, .name = "PAL-Nc", @@ -245,6 +263,7 @@ const struct bttv_tvnorm bttv_tvnorms[] = { .vdelay = 0x1a, .vbipack = 144, .sram = -1, + .vbistart = { 7, 320 }, },{ .v4l2_id = V4L2_STD_PAL_M, .name = "PAL-M", @@ -261,6 +280,7 @@ const struct bttv_tvnorm bttv_tvnorms[] = { .vdelay = 0x1a, .vbipack = 144, .sram = -1, + .vbistart = { 10, 273 }, },{ .v4l2_id = V4L2_STD_PAL_N, .name = "PAL-N", @@ -277,6 +297,7 @@ const struct bttv_tvnorm bttv_tvnorms[] = { .vdelay = 0x20, .vbipack = 144, .sram = -1, + .vbistart = { 7, 320}, },{ .v4l2_id = V4L2_STD_NTSC_M_JP, .name = "NTSC-JP", @@ -293,6 +314,7 @@ const struct bttv_tvnorm bttv_tvnorms[] = { .vdelay = 0x16, .vbipack = 144, .sram = -1, + .vbistart = {10, 273}, },{ /* that one hopefully works with the strange timing * which video recorders produce when playing a NTSC @@ -313,6 +335,7 @@ const struct bttv_tvnorm bttv_tvnorms[] = { .vbipack = 255, .vtotal = 524, .sram = -1, + .vbistart = { 10, 273 }, } }; static const unsigned int BTTV_TVNORMS = ARRAY_SIZE(bttv_tvnorms); @@ -484,7 +507,10 @@ static const unsigned int BTTV_FORMATS = ARRAY_SIZE(bttv_formats); #define V4L2_CID_PRIVATE_VCR_HACK (V4L2_CID_PRIVATE_BASE + 5) #define V4L2_CID_PRIVATE_WHITECRUSH_UPPER (V4L2_CID_PRIVATE_BASE + 6) #define V4L2_CID_PRIVATE_WHITECRUSH_LOWER (V4L2_CID_PRIVATE_BASE + 7) -#define V4L2_CID_PRIVATE_LASTP1 (V4L2_CID_PRIVATE_BASE + 8) +#define V4L2_CID_PRIVATE_UV_RATIO (V4L2_CID_PRIVATE_BASE + 8) +#define V4L2_CID_PRIVATE_FULL_LUMA_RANGE (V4L2_CID_PRIVATE_BASE + 9) +#define V4L2_CID_PRIVATE_CORING (V4L2_CID_PRIVATE_BASE + 10) +#define V4L2_CID_PRIVATE_LASTP1 (V4L2_CID_PRIVATE_BASE + 11) static const struct v4l2_queryctrl no_ctl = { .name = "42", @@ -618,8 +644,32 @@ static const struct v4l2_queryctrl bttv_ctls[] = { .step = 1, .default_value = 0x7F, .type = V4L2_CTRL_TYPE_INTEGER, + },{ + .id = V4L2_CID_PRIVATE_UV_RATIO, + .name = "uv ratio", + .minimum = 0, + .maximum = 100, + .step = 1, + .default_value = 50, + .type = V4L2_CTRL_TYPE_INTEGER, + },{ + .id = V4L2_CID_PRIVATE_FULL_LUMA_RANGE, + .name = "full luma range", + .minimum = 0, + .maximum = 1, + .type = V4L2_CTRL_TYPE_BOOLEAN, + },{ + .id = V4L2_CID_PRIVATE_CORING, + .name = "coring", + .minimum = 0, + .maximum = 3, + .step = 1, + .default_value = 0, + .type = V4L2_CTRL_TYPE_INTEGER, } + + }; static const int BTTV_CTLS = ARRAY_SIZE(bttv_ctls); @@ -634,16 +684,16 @@ int check_alloc_btres(struct bttv *btv, struct bttv_fh *fh, int bit) return 1; /* is it free? */ - down(&btv->reslock); + mutex_lock(&btv->reslock); if (btv->resources & bit) { /* no, someone else uses it */ - up(&btv->reslock); + mutex_unlock(&btv->reslock); return 0; } /* it's free, grab it */ fh->resources |= bit; btv->resources |= bit; - up(&btv->reslock); + mutex_unlock(&btv->reslock); return 1; } @@ -662,16 +712,14 @@ int locked_btres(struct bttv *btv, int bit) static void free_btres(struct bttv *btv, struct bttv_fh *fh, int bits) { -#if 1 /* DEBUG */ if ((fh->resources & bits) != bits) { /* trying to free ressources not allocated by us ... */ printk("bttv: BUG! (btres)\n"); } -#endif - down(&btv->reslock); + mutex_lock(&btv->reslock); fh->resources &= ~bits; btv->resources &= ~bits; - up(&btv->reslock); + mutex_unlock(&btv->reslock); } /* ----------------------------------------------------------------------- */ @@ -689,71 +737,71 @@ void free_btres(struct bttv *btv, struct bttv_fh *fh, int bits) static void set_pll_freq(struct bttv *btv, unsigned int fin, unsigned int fout) { - unsigned char fl, fh, fi; + unsigned char fl, fh, fi; - /* prevent overflows */ - fin/=4; - fout/=4; + /* prevent overflows */ + fin/=4; + fout/=4; - fout*=12; - fi=fout/fin; + fout*=12; + fi=fout/fin; - fout=(fout%fin)*256; - fh=fout/fin; + fout=(fout%fin)*256; + fh=fout/fin; - fout=(fout%fin)*256; - fl=fout/fin; + fout=(fout%fin)*256; + fl=fout/fin; - btwrite(fl, BT848_PLL_F_LO); - btwrite(fh, BT848_PLL_F_HI); - btwrite(fi|BT848_PLL_X, BT848_PLL_XCI); + btwrite(fl, BT848_PLL_F_LO); + btwrite(fh, BT848_PLL_F_HI); + btwrite(fi|BT848_PLL_X, BT848_PLL_XCI); } static void set_pll(struct bttv *btv) { - int i; + int i; - if (!btv->pll.pll_crystal) - return; + if (!btv->pll.pll_crystal) + return; if (btv->pll.pll_ofreq == btv->pll.pll_current) { dprintk("bttv%d: PLL: no change required\n",btv->c.nr); - return; - } - - if (btv->pll.pll_ifreq == btv->pll.pll_ofreq) { - /* no PLL needed */ - if (btv->pll.pll_current == 0) - return; - vprintk(KERN_INFO "bttv%d: PLL can sleep, using XTAL (%d).\n", + return; + } + + if (btv->pll.pll_ifreq == btv->pll.pll_ofreq) { + /* no PLL needed */ + if (btv->pll.pll_current == 0) + return; + bttv_printk(KERN_INFO "bttv%d: PLL can sleep, using XTAL (%d).\n", btv->c.nr,btv->pll.pll_ifreq); - btwrite(0x00,BT848_TGCTRL); - btwrite(0x00,BT848_PLL_XCI); - btv->pll.pll_current = 0; - return; - } + btwrite(0x00,BT848_TGCTRL); + btwrite(0x00,BT848_PLL_XCI); + btv->pll.pll_current = 0; + return; + } - vprintk(KERN_INFO "bttv%d: PLL: %d => %d ",btv->c.nr, + bttv_printk(KERN_INFO "bttv%d: PLL: %d => %d ",btv->c.nr, btv->pll.pll_ifreq, btv->pll.pll_ofreq); set_pll_freq(btv, btv->pll.pll_ifreq, btv->pll.pll_ofreq); - for (i=0; i<10; i++) { + for (i=0; i<10; i++) { /* Let other people run while the PLL stabilizes */ - vprintk("."); + bttv_printk("."); msleep(10); - if (btread(BT848_DSTATUS) & BT848_DSTATUS_PLOCK) { + if (btread(BT848_DSTATUS) & BT848_DSTATUS_PLOCK) { btwrite(0,BT848_DSTATUS); - } else { - btwrite(0x08,BT848_TGCTRL); - btv->pll.pll_current = btv->pll.pll_ofreq; - vprintk(" ok\n"); - return; - } - } - btv->pll.pll_current = -1; - vprintk("failed\n"); - return; + } else { + btwrite(0x08,BT848_TGCTRL); + btv->pll.pll_current = btv->pll.pll_ofreq; + bttv_printk(" ok\n"); + return; + } + } + btv->pll.pll_current = -1; + bttv_printk("failed\n"); + return; } /* used to switch between the bt848's analog/digital video capture modes */ @@ -768,9 +816,9 @@ static void bt848A_set_timing(struct bttv *btv) btv->c.nr,table_idx); /* timing change...reset timing generator address */ - btwrite(0x00, BT848_TGCTRL); - btwrite(0x02, BT848_TGCTRL); - btwrite(0x00, BT848_TGCTRL); + btwrite(0x00, BT848_TGCTRL); + btwrite(0x02, BT848_TGCTRL); + btwrite(0x00, BT848_TGCTRL); len=SRAM_Table[table_idx][0]; for(i = 1; i <= len; i++) @@ -809,7 +857,7 @@ static void bt848_hue(struct bttv *btv, int hue) /* -128 to 127 */ value = (hue >> 8) - 128; - btwrite(value & 0xff, BT848_HUE); + btwrite(value & 0xff, BT848_HUE); } static void bt848_contrast(struct bttv *btv, int cont) @@ -821,9 +869,9 @@ static void bt848_contrast(struct bttv *btv, int cont) /* 0-511 */ value = (cont >> 7); hibit = (value >> 6) & 4; - btwrite(value & 0xff, BT848_CONTRAST_LO); - btaor(hibit, ~4, BT848_E_CONTROL); - btaor(hibit, ~4, BT848_O_CONTROL); + btwrite(value & 0xff, BT848_CONTRAST_LO); + btaor(hibit, ~4, BT848_E_CONTROL); + btaor(hibit, ~4, BT848_O_CONTROL); } static void bt848_sat(struct bttv *btv, int color) @@ -833,14 +881,14 @@ static void bt848_sat(struct bttv *btv, int color) btv->saturation = color; /* 0-511 for the color */ - val_u = color >> 7; - val_v = ((color>>7)*180L)/254; - hibits = (val_u >> 7) & 2; + val_u = ((color * btv->opt_uv_ratio) / 50) >> 7; + val_v = (((color * (100 - btv->opt_uv_ratio) / 50) >>7)*180L)/254; + hibits = (val_u >> 7) & 2; hibits |= (val_v >> 8) & 1; - btwrite(val_u & 0xff, BT848_SAT_U_LO); - btwrite(val_v & 0xff, BT848_SAT_V_LO); - btaor(hibits, ~3, BT848_E_CONTROL); - btaor(hibits, ~3, BT848_O_CONTROL); + btwrite(val_u & 0xff, BT848_SAT_U_LO); + btwrite(val_v & 0xff, BT848_SAT_V_LO); + btaor(hibits, ~3, BT848_E_CONTROL); + btaor(hibits, ~3, BT848_O_CONTROL); } /* ----------------------------------------------------------------------- */ @@ -853,7 +901,7 @@ video_mux(struct bttv *btv, unsigned int input) if (input >= bttv_tvcards[btv->c.type].video_inputs) return -EINVAL; - /* needed by RemoteVideo MX */ + /* needed by RemoteVideo MX */ mask2 = bttv_tvcards[btv->c.type].gpiomask2; if (mask2) gpio_inout(mask2,mask2); @@ -907,11 +955,6 @@ audio_mux(struct bttv *btv, int mode) i2c_mux = mux = (btv->audio & AUDIO_MUTE) ? AUDIO_OFF : btv->audio; if (btv->opt_automute && !signal && !btv->radio_user) mux = AUDIO_OFF; -#if 0 - printk("bttv%d: amux: mode=%d audio=%d signal=%s mux=%d/%d irq=%s\n", - btv->c.nr, mode, btv->audio, signal ? "yes" : "no", - mux, i2c_mux, in_interrupt() ? "yes" : "no"); -#endif val = bttv_tvcards[btv->c.type].audiomux[mux]; gpio_bits(bttv_tvcards[btv->c.type].gpiomask,val); @@ -931,7 +974,7 @@ i2c_vidiocschan(struct bttv *btv) c.norm = btv->tvnorm; c.channel = btv->input; bttv_call_i2c_clients(btv,VIDIOCSCHAN,&c); - if (btv->c.type == BTTV_VOODOOTV_FM) + if (btv->c.type == BTTV_BOARD_VOODOOTV_FM) bttv_tda9880_setnorm(btv,c.norm); } @@ -955,14 +998,9 @@ set_tvnorm(struct bttv *btv, unsigned int norm) bt848A_set_timing(btv); switch (btv->c.type) { - case BTTV_VOODOOTV_FM: + case BTTV_BOARD_VOODOOTV_FM: bttv_tda9880_setnorm(btv,norm); break; -#if 0 - case BTTV_OSPREY540: - osprey_540_set_norm(btv,norm); - break; -#endif } return 0; } @@ -1027,22 +1065,22 @@ static void init_bt848(struct bttv *btv) btwrite(BT848_COLOR_CTL_GAMMA, BT848_COLOR_CTL); btwrite(BT848_IFORM_XTAUTO | BT848_IFORM_AUTO, BT848_IFORM); - /* set planar and packed mode trigger points and */ - /* set rising edge of inverted GPINTR pin as irq trigger */ - btwrite(BT848_GPIO_DMA_CTL_PKTP_32| - BT848_GPIO_DMA_CTL_PLTP1_16| - BT848_GPIO_DMA_CTL_PLTP23_16| - BT848_GPIO_DMA_CTL_GPINTC| - BT848_GPIO_DMA_CTL_GPINTI, - BT848_GPIO_DMA_CTL); + /* set planar and packed mode trigger points and */ + /* set rising edge of inverted GPINTR pin as irq trigger */ + btwrite(BT848_GPIO_DMA_CTL_PKTP_32| + BT848_GPIO_DMA_CTL_PLTP1_16| + BT848_GPIO_DMA_CTL_PLTP23_16| + BT848_GPIO_DMA_CTL_GPINTC| + BT848_GPIO_DMA_CTL_GPINTI, + BT848_GPIO_DMA_CTL); val = btv->opt_chroma_agc ? BT848_SCLOOP_CAGC : 0; - btwrite(val, BT848_E_SCLOOP); - btwrite(val, BT848_O_SCLOOP); + btwrite(val, BT848_E_SCLOOP); + btwrite(val, BT848_O_SCLOOP); - btwrite(0x20, BT848_E_VSCALE_HI); - btwrite(0x20, BT848_O_VSCALE_HI); - btwrite(BT848_ADC_RESERVED | (btv->opt_adc_crush ? BT848_ADC_CRUSH : 0), + btwrite(0x20, BT848_E_VSCALE_HI); + btwrite(0x20, BT848_O_VSCALE_HI); + btwrite(BT848_ADC_RESERVED | (btv->opt_adc_crush ? BT848_ADC_CRUSH : 0), BT848_ADC); btwrite(whitecrush_upper, BT848_WC_UP); @@ -1061,7 +1099,7 @@ static void init_bt848(struct bttv *btv) bt848_contrast(btv, btv->contrast); bt848_sat(btv, btv->saturation); - /* interrupt */ + /* interrupt */ init_irqreg(btv); } @@ -1077,7 +1115,7 @@ static void bttv_reinit_bt848(struct bttv *btv) spin_unlock_irqrestore(&btv->s_lock,flags); init_bt848(btv); - btv->pll.pll_current = -1; + btv->pll.pll_current = -1; set_input(btv,btv->input); } @@ -1151,6 +1189,15 @@ static int get_control(struct bttv *btv, struct v4l2_control *c) case V4L2_CID_PRIVATE_WHITECRUSH_LOWER: c->value = btv->opt_whitecrush_lower; break; + case V4L2_CID_PRIVATE_UV_RATIO: + c->value = btv->opt_uv_ratio; + break; + case V4L2_CID_PRIVATE_FULL_LUMA_RANGE: + c->value = btv->opt_full_luma_range; + break; + case V4L2_CID_PRIVATE_CORING: + c->value = btv->opt_coring; + break; default: return -EINVAL; } @@ -1247,6 +1294,18 @@ static int set_control(struct bttv *btv, struct v4l2_control *c) btv->opt_whitecrush_lower = c->value; btwrite(c->value, BT848_WC_DOWN); break; + case V4L2_CID_PRIVATE_UV_RATIO: + btv->opt_uv_ratio = c->value; + bt848_sat(btv, btv->saturation); + break; + case V4L2_CID_PRIVATE_FULL_LUMA_RANGE: + btv->opt_full_luma_range = c->value; + btaor((c->value<<7), ~BT848_OFORM_RANGE, BT848_OFORM); + break; + case V4L2_CID_PRIVATE_CORING: + btv->opt_coring = c->value; + btaor((c->value<<5), ~BT848_OFORM_CORE32, BT848_OFORM); + break; default: return -EINVAL; } @@ -1349,7 +1408,7 @@ bttv_switch_overlay(struct bttv *btv, struct bttv_fh *fh, /* video4linux (1) interface */ static int bttv_prepare_buffer(struct bttv *btv, struct bttv_buffer *buf, - const struct bttv_format *fmt, + const struct bttv_format *fmt, unsigned int width, unsigned int height, enum v4l2_field field) { @@ -1461,19 +1520,11 @@ static struct videobuf_queue_ops bttv_video_qops = { .buf_release = buffer_release, }; -static const char *v4l1_ioctls[] = { - "?", "CGAP", "GCHAN", "SCHAN", "GTUNER", "STUNER", "GPICT", "SPICT", - "CCAPTURE", "GWIN", "SWIN", "GFBUF", "SFBUF", "KEY", "GFREQ", - "SFREQ", "GAUDIO", "SAUDIO", "SYNC", "MCAPTURE", "GMBUF", "GUNIT", - "GCAPTURE", "SCAPTURE", "SPLAYMODE", "SWRITEMODE", "GPLAYINFO", - "SMICROCODE", "GVBIFMT", "SVBIFMT" }; -#define V4L1_IOCTLS ARRAY_SIZE(v4l1_ioctls) - static int bttv_common_ioctls(struct bttv *btv, unsigned int cmd, void *arg) { switch (cmd) { - case BTTV_VERSION: - return BTTV_VERSION_CODE; + case BTTV_VERSION: + return BTTV_VERSION_CODE; /* *** v4l1 *** ************************************************ */ case VIDIOCGFREQ: @@ -1485,12 +1536,12 @@ static int bttv_common_ioctls(struct bttv *btv, unsigned int cmd, void *arg) case VIDIOCSFREQ: { unsigned long *freq = arg; - down(&btv->lock); + mutex_lock(&btv->lock); btv->freq=*freq; bttv_call_i2c_clients(btv,VIDIOCSFREQ,freq); if (btv->has_matchbox && btv->radio_user) tea5757_set_freq(btv,*freq); - up(&btv->lock); + mutex_unlock(&btv->lock); return 0; } @@ -1520,39 +1571,39 @@ static int bttv_common_ioctls(struct bttv *btv, unsigned int cmd, void *arg) if (v->mode >= BTTV_TVNORMS) return -EINVAL; - down(&btv->lock); + mutex_lock(&btv->lock); set_tvnorm(btv,v->mode); bttv_call_i2c_clients(btv,cmd,v); - up(&btv->lock); + mutex_unlock(&btv->lock); return 0; } - case VIDIOCGCHAN: - { - struct video_channel *v = arg; + case VIDIOCGCHAN: + { + struct video_channel *v = arg; unsigned int channel = v->channel; - if (channel >= bttv_tvcards[btv->c.type].video_inputs) - return -EINVAL; - v->tuners=0; - v->flags = VIDEO_VC_AUDIO; - v->type = VIDEO_TYPE_CAMERA; - v->norm = btv->tvnorm; + if (channel >= bttv_tvcards[btv->c.type].video_inputs) + return -EINVAL; + v->tuners=0; + v->flags = VIDEO_VC_AUDIO; + v->type = VIDEO_TYPE_CAMERA; + v->norm = btv->tvnorm; if (channel == bttv_tvcards[btv->c.type].tuner) { - strcpy(v->name,"Television"); - v->flags|=VIDEO_VC_TUNER; - v->type=VIDEO_TYPE_TV; - v->tuners=1; - } else if (channel == btv->svhs) { - strcpy(v->name,"S-Video"); - } else { - sprintf(v->name,"Composite%d",channel); + strcpy(v->name,"Television"); + v->flags|=VIDEO_VC_TUNER; + v->type=VIDEO_TYPE_TV; + v->tuners=1; + } else if (channel == btv->svhs) { + strcpy(v->name,"S-Video"); + } else { + sprintf(v->name,"Composite%d",channel); } return 0; - } - case VIDIOCSCHAN: - { - struct video_channel *v = arg; + } + case VIDIOCSCHAN: + { + struct video_channel *v = arg; unsigned int channel = v->channel; if (channel >= bttv_tvcards[btv->c.type].video_inputs) @@ -1560,21 +1611,21 @@ static int bttv_common_ioctls(struct bttv *btv, unsigned int cmd, void *arg) if (v->norm >= BTTV_TVNORMS) return -EINVAL; - down(&btv->lock); + mutex_lock(&btv->lock); if (channel == btv->input && v->norm == btv->tvnorm) { /* nothing to do */ - up(&btv->lock); + mutex_unlock(&btv->lock); return 0; } btv->tvnorm = v->norm; set_input(btv,v->channel); - up(&btv->lock); + mutex_unlock(&btv->lock); return 0; } - case VIDIOCGAUDIO: + case VIDIOCGAUDIO: { struct video_audio *v = arg; @@ -1583,14 +1634,14 @@ static int bttv_common_ioctls(struct bttv *btv, unsigned int cmd, void *arg) v->flags |= VIDEO_AUDIO_MUTABLE; v->mode = VIDEO_SOUND_MONO; - down(&btv->lock); + mutex_lock(&btv->lock); bttv_call_i2c_clients(btv,cmd,v); /* card specific hooks */ if (btv->audio_hook) btv->audio_hook(btv,v,0); - up(&btv->lock); + mutex_unlock(&btv->lock); return 0; } case VIDIOCSAUDIO: @@ -1601,7 +1652,7 @@ static int bttv_common_ioctls(struct bttv *btv, unsigned int cmd, void *arg) if (audio >= bttv_tvcards[btv->c.type].audio_inputs) return -EINVAL; - down(&btv->lock); + mutex_lock(&btv->lock); audio_mux(btv, (v->flags&VIDEO_AUDIO_MUTE) ? AUDIO_MUTE : AUDIO_UNMUTE); bttv_call_i2c_clients(btv,cmd,v); @@ -1609,7 +1660,7 @@ static int bttv_common_ioctls(struct bttv *btv, unsigned int cmd, void *arg) if (btv->audio_hook) btv->audio_hook(btv,v,1); - up(&btv->lock); + mutex_unlock(&btv->lock); return 0; } @@ -1643,10 +1694,10 @@ static int bttv_common_ioctls(struct bttv *btv, unsigned int cmd, void *arg) if (i == BTTV_TVNORMS) return -EINVAL; - down(&btv->lock); + mutex_lock(&btv->lock); set_tvnorm(btv,i); i2c_vidiocschan(btv); - up(&btv->lock); + mutex_unlock(&btv->lock); return 0; } case VIDIOC_QUERYSTD: @@ -1671,7 +1722,7 @@ static int bttv_common_ioctls(struct bttv *btv, unsigned int cmd, void *arg) memset(i,0,sizeof(*i)); i->index = n; i->type = V4L2_INPUT_TYPE_CAMERA; - i->audioset = 1; + i->audioset = 0; if (i->index == bttv_tvcards[btv->c.type].tuner) { sprintf(i->name, "Television"); i->type = V4L2_INPUT_TYPE_TUNER; @@ -1679,7 +1730,7 @@ static int bttv_common_ioctls(struct bttv *btv, unsigned int cmd, void *arg) } else if (i->index == btv->svhs) { sprintf(i->name, "S-Video"); } else { - sprintf(i->name,"Composite%d",i->index); + sprintf(i->name,"Composite%d",i->index); } if (i->index == btv->input) { __u32 dstatus = btread(BT848_DSTATUS); @@ -1704,9 +1755,9 @@ static int bttv_common_ioctls(struct bttv *btv, unsigned int cmd, void *arg) if (*i > bttv_tvcards[btv->c.type].video_inputs) return -EINVAL; - down(&btv->lock); + mutex_lock(&btv->lock); set_input(btv,*i); - up(&btv->lock); + mutex_unlock(&btv->lock); return 0; } @@ -1718,15 +1769,23 @@ static int bttv_common_ioctls(struct bttv *btv, unsigned int cmd, void *arg) return -EINVAL; if (0 != t->index) return -EINVAL; - down(&btv->lock); + mutex_lock(&btv->lock); memset(t,0,sizeof(*t)); strcpy(t->name, "Television"); t->type = V4L2_TUNER_ANALOG_TV; - t->rangehigh = 0xffffffffUL; t->capability = V4L2_TUNER_CAP_NORM; t->rxsubchans = V4L2_TUNER_SUB_MONO; if (btread(BT848_DSTATUS)&BT848_DSTATUS_HLOC) t->signal = 0xffff; + { + struct video_tuner tuner; + + memset(&tuner, 0, sizeof (tuner)); + tuner.rangehigh = 0xffffffffUL; + bttv_call_i2c_clients(btv, VIDIOCGTUNER, &tuner); + t->rangelow = tuner.rangelow; + t->rangehigh = tuner.rangehigh; + } { /* Hmmm ... */ struct video_audio va; @@ -1745,7 +1804,7 @@ static int bttv_common_ioctls(struct bttv *btv, unsigned int cmd, void *arg) } } /* FIXME: fill capability+audmode */ - up(&btv->lock); + mutex_unlock(&btv->lock); return 0; } case VIDIOC_S_TUNER: @@ -1756,7 +1815,7 @@ static int bttv_common_ioctls(struct bttv *btv, unsigned int cmd, void *arg) return -EINVAL; if (0 != t->index) return -EINVAL; - down(&btv->lock); + mutex_lock(&btv->lock); { struct video_audio va; memset(&va, 0, sizeof(struct video_audio)); @@ -1773,7 +1832,7 @@ static int bttv_common_ioctls(struct bttv *btv, unsigned int cmd, void *arg) if (btv->audio_hook) btv->audio_hook(btv,&va,1); } - up(&btv->lock); + mutex_unlock(&btv->lock); return 0; } @@ -1792,14 +1851,19 @@ static int bttv_common_ioctls(struct bttv *btv, unsigned int cmd, void *arg) if (unlikely(f->tuner != 0)) return -EINVAL; - if (unlikely(f->type != V4L2_TUNER_ANALOG_TV)) + if (unlikely (f->type != V4L2_TUNER_ANALOG_TV)) return -EINVAL; - down(&btv->lock); + mutex_lock(&btv->lock); btv->freq = f->frequency; bttv_call_i2c_clients(btv,VIDIOCSFREQ,&btv->freq); if (btv->has_matchbox && btv->radio_user) tea5757_set_freq(btv,btv->freq); - up(&btv->lock); + mutex_unlock(&btv->lock); + return 0; + } + case VIDIOC_LOG_STATUS: + { + bttv_call_i2c_clients(btv, VIDIOC_LOG_STATUS, NULL); return 0; } @@ -1902,7 +1966,6 @@ static int setup_window(struct bttv_fh *fh, struct bttv *btv, } down(&fh->cap.lock); - if (fh->ov.clips) kfree(fh->ov.clips); fh->ov.clips = clips; fh->ov.nclips = n; @@ -1976,19 +2039,33 @@ static int bttv_switch_type(struct bttv_fh *fh, enum v4l2_buf_type type) return 0; } +static void +pix_format_set_size (struct v4l2_pix_format * f, + const struct bttv_format * fmt, + unsigned int width, + unsigned int height) +{ + f->width = width; + f->height = height; + + if (fmt->flags & FORMAT_FLAGS_PLANAR) { + f->bytesperline = width; /* Y plane */ + f->sizeimage = (width * height * fmt->depth) >> 3; + } else { + f->bytesperline = (width * fmt->depth) >> 3; + f->sizeimage = height * f->bytesperline; + } +} + static int bttv_g_fmt(struct bttv_fh *fh, struct v4l2_format *f) { switch (f->type) { case V4L2_BUF_TYPE_VIDEO_CAPTURE: memset(&f->fmt.pix,0,sizeof(struct v4l2_pix_format)); - f->fmt.pix.width = fh->width; - f->fmt.pix.height = fh->height; + pix_format_set_size (&f->fmt.pix, fh->fmt, + fh->width, fh->height); f->fmt.pix.field = fh->cap.field; f->fmt.pix.pixelformat = fh->fmt->fourcc; - f->fmt.pix.bytesperline = - (f->fmt.pix.width * fh->fmt->depth) >> 3; - f->fmt.pix.sizeimage = - f->fmt.pix.height * f->fmt.pix.bytesperline; return 0; case V4L2_BUF_TYPE_VIDEO_OVERLAY: memset(&f->fmt.win,0,sizeof(struct v4l2_window)); @@ -2053,11 +2130,9 @@ static int bttv_try_fmt(struct bttv_fh *fh, struct bttv *btv, f->fmt.pix.width = maxw; if (f->fmt.pix.height > maxh) f->fmt.pix.height = maxh; - f->fmt.pix.width &= ~0x03; - f->fmt.pix.bytesperline = - (f->fmt.pix.width * fmt->depth) >> 3; - f->fmt.pix.sizeimage = - f->fmt.pix.height * f->fmt.pix.bytesperline; + pix_format_set_size (&f->fmt.pix, fmt, + f->fmt.pix.width & ~3, + f->fmt.pix.height); return 0; } @@ -2105,13 +2180,17 @@ static int bttv_s_fmt(struct bttv_fh *fh, struct bttv *btv, return 0; } case V4L2_BUF_TYPE_VIDEO_OVERLAY: + if (no_overlay > 0) { + printk ("V4L2_BUF_TYPE_VIDEO_OVERLAY: no_overlay\n"); + return -EINVAL; + } return setup_window(fh, btv, &f->fmt.win, 1); case V4L2_BUF_TYPE_VBI_CAPTURE: retval = bttv_switch_type(fh,f->type); if (0 != retval) return retval; if (locked_btres(fh->btv, RESOURCE_VBI)) - return -EBUSY; + return -EBUSY; bttv_vbi_try_fmt(fh,f); bttv_vbi_setlines(fh,btv,f->fmt.vbi.count[0]); bttv_vbi_get_fmt(fh,f); @@ -2129,29 +2208,16 @@ static int bttv_do_ioctl(struct inode *inode, struct file *file, unsigned long flags; int retval = 0; - if (bttv_debug > 1) { - switch (_IOC_TYPE(cmd)) { - case 'v': - printk("bttv%d: ioctl 0x%x (v4l1, VIDIOC%s)\n", - btv->c.nr, cmd, (_IOC_NR(cmd) < V4L1_IOCTLS) ? - v4l1_ioctls[_IOC_NR(cmd)] : "???"); - break; - case 'V': - printk("bttv%d: ioctl 0x%x (v4l2, %s)\n", - btv->c.nr, cmd, v4l2_ioctl_names[_IOC_NR(cmd)]); - break; - default: - printk("bttv%d: ioctl 0x%x (???)\n", - btv->c.nr, cmd); - } - } + if (bttv_debug > 1) + v4l_print_ioctl(btv->c.name, cmd); + if (btv->errors) bttv_reinit_bt848(btv); switch (cmd) { - case VIDIOCSFREQ: - case VIDIOCSTUNER: - case VIDIOCSCHAN: + case VIDIOCSFREQ: + case VIDIOCSTUNER: + case VIDIOCSCHAN: case VIDIOC_S_CTRL: case VIDIOC_S_STD: case VIDIOC_S_INPUT: @@ -2167,10 +2233,10 @@ static int bttv_do_ioctl(struct inode *inode, struct file *file, /* *** v4l1 *** ************************************************ */ case VIDIOCGCAP: { - struct video_capability *cap = arg; + struct video_capability *cap = arg; memset(cap,0,sizeof(*cap)); - strcpy(cap->name,btv->video_dev->name); + strcpy(cap->name,btv->video_dev->name); if (V4L2_BUF_TYPE_VBI_CAPTURE == fh->type) { /* vbi */ cap->type = VID_TYPE_TUNER|VID_TYPE_TELETEXT; @@ -2178,9 +2244,11 @@ static int bttv_do_ioctl(struct inode *inode, struct file *file, /* others */ cap->type = VID_TYPE_CAPTURE| VID_TYPE_TUNER| - VID_TYPE_OVERLAY| VID_TYPE_CLIPPING| VID_TYPE_SCALES; + if (no_overlay <= 0) + cap->type |= VID_TYPE_OVERLAY; + cap->maxwidth = bttv_tvnorms[btv->tvnorm].swidth; cap->maxheight = bttv_tvnorms[btv->tvnorm].sheight; cap->minwidth = 48; @@ -2188,7 +2256,7 @@ static int bttv_do_ioctl(struct inode *inode, struct file *file, } cap->channels = bttv_tvcards[btv->c.type].video_inputs; cap->audios = bttv_tvcards[btv->c.type].audio_inputs; - return 0; + return 0; } case VIDIOCGPICT: @@ -2219,6 +2287,15 @@ static int bttv_do_ioctl(struct inode *inode, struct file *file, retval = -EINVAL; goto fh_unlock_and_return; } + if (fmt->flags & FORMAT_FLAGS_RAW) { + /* VIDIOCMCAPTURE uses gbufsize, not RAW_BPL * + RAW_LINES * 2. F1 is stored at offset 0, F2 + at buffer size / 2. */ + fh->width = RAW_BPL; + fh->height = gbufsize / RAW_BPL; + btv->init.width = RAW_BPL; + btv->init.height = gbufsize / RAW_BPL; + } fh->ovfmt = fmt; fh->fmt = fmt; btv->init.ovfmt = fmt; @@ -2237,7 +2314,7 @@ static int bttv_do_ioctl(struct inode *inode, struct file *file, bt848_hue(btv,pic->hue); bt848_sat(btv,pic->colour); up(&fh->cap.lock); - return 0; + return 0; } case VIDIOCGWIN: @@ -2256,6 +2333,11 @@ static int bttv_do_ioctl(struct inode *inode, struct file *file, struct video_window *win = arg; struct v4l2_window w2; + if (no_overlay > 0) { + printk ("VIDIOCSWIN: no_overlay\n"); + return -EINVAL; + } + w2.field = V4L2_FIELD_ANY; w2.w.left = win->x; w2.w.top = win->y; @@ -2293,8 +2375,8 @@ static int bttv_do_ioctl(struct inode *inode, struct file *file, unsigned long end; if(!capable(CAP_SYS_ADMIN) && - !capable(CAP_SYS_RAWIO)) - return -EPERM; + !capable(CAP_SYS_RAWIO)) + return -EPERM; end = (unsigned long)fbuf->base + fbuf->height * fbuf->bytesperline; down(&fh->cap.lock); @@ -2368,7 +2450,7 @@ static int bttv_do_ioctl(struct inode *inode, struct file *file, } /* switch over */ - retval = bttv_switch_overlay(btv,fh,new); + retval = bttv_switch_overlay(btv,fh,new); up(&fh->cap.lock); return retval; } @@ -2477,10 +2559,10 @@ static int bttv_do_ioctl(struct inode *inode, struct file *file, fmt->count[0] = fmt2.fmt.vbi.count[0]; fmt->start[1] = fmt2.fmt.vbi.start[1]; fmt->count[1] = fmt2.fmt.vbi.count[1]; - if (fmt2.fmt.vbi.flags & VBI_UNSYNC) - fmt->flags |= V4L2_VBI_UNSYNC; - if (fmt2.fmt.vbi.flags & VBI_INTERLACED) - fmt->flags |= V4L2_VBI_INTERLACED; + if (fmt2.fmt.vbi.flags & V4L2_VBI_UNSYNC) + fmt->flags |= VBI_UNSYNC; + if (fmt2.fmt.vbi.flags & V4L2_VBI_INTERLACED) + fmt->flags |= VBI_INTERLACED; return 0; } case VIDIOCSVBIFMT: @@ -2507,13 +2589,13 @@ static int bttv_do_ioctl(struct inode *inode, struct file *file, return 0; } - case BTTV_VERSION: - case VIDIOCGFREQ: - case VIDIOCSFREQ: - case VIDIOCGTUNER: - case VIDIOCSTUNER: - case VIDIOCGCHAN: - case VIDIOCSCHAN: + case BTTV_VERSION: + case VIDIOCGFREQ: + case VIDIOCSFREQ: + case VIDIOCGTUNER: + case VIDIOCSTUNER: + case VIDIOCGCHAN: + case VIDIOCSCHAN: case VIDIOCGAUDIO: case VIDIOCSAUDIO: return bttv_common_ioctls(btv,cmd,arg); @@ -2525,16 +2607,20 @@ static int bttv_do_ioctl(struct inode *inode, struct file *file, if (0 == v4l2) return -EINVAL; - strcpy(cap->driver,"bttv"); - strlcpy(cap->card,btv->video_dev->name,sizeof(cap->card)); - sprintf(cap->bus_info,"PCI:%s",pci_name(btv->c.pci)); + memset(cap, 0, sizeof (*cap)); + strlcpy(cap->driver, "bttv", sizeof (cap->driver)); + strlcpy(cap->card, btv->video_dev->name, sizeof (cap->card)); + snprintf(cap->bus_info, sizeof (cap->bus_info), + "PCI:%s", pci_name(btv->c.pci)); cap->version = BTTV_VERSION_CODE; cap->capabilities = V4L2_CAP_VIDEO_CAPTURE | - V4L2_CAP_VIDEO_OVERLAY | V4L2_CAP_VBI_CAPTURE | V4L2_CAP_READWRITE | V4L2_CAP_STREAMING; + if (no_overlay <= 0) + cap->capabilities |= V4L2_CAP_VIDEO_OVERLAY; + if (bttv_tvcards[btv->c.type].tuner != UNSET && bttv_tvcards[btv->c.type].tuner != TUNER_ABSENT) cap->capabilities |= V4L2_CAP_TUNER; @@ -2661,7 +2747,6 @@ static int bttv_do_ioctl(struct inode *inode, struct file *file, fh->ov.w.height = fb->fmt.height; btv->init.ov.w.width = fb->fmt.width; btv->init.ov.w.height = fb->fmt.height; - if (fh->ov.clips) kfree(fh->ov.clips); fh->ov.clips = NULL; fh->ov.nclips = 0; @@ -2796,6 +2881,7 @@ static int bttv_do_ioctl(struct inode *inode, struct file *file, case VIDIOC_S_TUNER: case VIDIOC_G_FREQUENCY: case VIDIOC_S_FREQUENCY: + case VIDIOC_LOG_STATUS: return bttv_common_ioctls(btv,cmd,arg); default: @@ -2886,6 +2972,8 @@ static unsigned int bttv_poll(struct file *file, poll_table *wait) fh->cap.read_buf->memory = V4L2_MEMORY_USERPTR; field = videobuf_next_field(&fh->cap); if (0 != fh->cap.ops->buf_prepare(&fh->cap,fh->cap.read_buf,field)) { + kfree (fh->cap.read_buf); + fh->cap.read_buf = NULL; up(&fh->cap.lock); return POLLERR; } @@ -3021,6 +3109,7 @@ static struct file_operations bttv_fops = .open = bttv_open, .release = bttv_release, .ioctl = bttv_ioctl, + .compat_ioctl = v4l_compat_ioctl32, .llseek = no_llseek, .read = bttv_read, .mmap = bttv_mmap, @@ -3030,8 +3119,8 @@ static struct file_operations bttv_fops = static struct video_device bttv_video_template = { .name = "UNSET", - .type = VID_TYPE_CAPTURE|VID_TYPE_TUNER|VID_TYPE_OVERLAY| - VID_TYPE_CLIPPING|VID_TYPE_SCALES, + .type = VID_TYPE_CAPTURE|VID_TYPE_TUNER| + VID_TYPE_CLIPPING|VID_TYPE_SCALES, .hardware = VID_HARDWARE_BT848, .fops = &bttv_fops, .minor = -1, @@ -3067,27 +3156,28 @@ static int radio_open(struct inode *inode, struct file *file) return -ENODEV; dprintk("bttv%d: open called (radio)\n",btv->c.nr); - down(&btv->lock); - if (btv->radio_user) { - up(&btv->lock); - return -EBUSY; - } + mutex_lock(&btv->lock); + btv->radio_user++; + file->private_data = btv; - i2c_vidiocschan(btv); - bttv_call_i2c_clients(btv,AUDC_SET_RADIO,&btv->tuner_type); + bttv_call_i2c_clients(btv,AUDC_SET_RADIO,&btv->tuner_type); audio_mux(btv,AUDIO_RADIO); - up(&btv->lock); - return 0; + mutex_unlock(&btv->lock); + return 0; } static int radio_release(struct inode *inode, struct file *file) { - struct bttv *btv = file->private_data; + struct bttv *btv = file->private_data; + struct rds_command cmd; btv->radio_user--; + + bttv_call_i2c_clients(btv, RDS_CMD_CLOSE, &cmd); + return 0; } @@ -3099,41 +3189,37 @@ static int radio_do_ioctl(struct inode *inode, struct file *file, switch (cmd) { case VIDIOCGCAP: { - struct video_capability *cap = arg; + struct video_capability *cap = arg; memset(cap,0,sizeof(*cap)); - strcpy(cap->name,btv->radio_dev->name); - cap->type = VID_TYPE_TUNER; + strcpy(cap->name,btv->radio_dev->name); + cap->type = VID_TYPE_TUNER; cap->channels = 1; cap->audios = 1; - return 0; + return 0; } - case VIDIOCGTUNER: - { - struct video_tuner *v = arg; + case VIDIOCGTUNER: + { + struct video_tuner *v = arg; - if(v->tuner) - return -EINVAL; + if(v->tuner) + return -EINVAL; memset(v,0,sizeof(*v)); - strcpy(v->name, "Radio"); - /* japan: 76.0 MHz - 89.9 MHz - western europe: 87.5 MHz - 108.0 MHz - russia: 65.0 MHz - 108.0 MHz */ - v->rangelow=(int)(65*16); - v->rangehigh=(int)(108*16); - bttv_call_i2c_clients(btv,cmd,v); - return 0; - } - case VIDIOCSTUNER: + strcpy(v->name, "Radio"); + bttv_call_i2c_clients(btv,cmd,v); + return 0; + } + case VIDIOCSTUNER: /* nothing to do */ return 0; case BTTV_VERSION: - case VIDIOCGFREQ: - case VIDIOCSFREQ: + case VIDIOCGFREQ: + case VIDIOCSFREQ: case VIDIOCGAUDIO: case VIDIOCSAUDIO: + case VIDIOC_LOG_STATUS: return bttv_common_ioctls(btv,cmd,arg); default: @@ -3148,13 +3234,42 @@ static int radio_ioctl(struct inode *inode, struct file *file, return video_usercopy(inode, file, cmd, arg, radio_do_ioctl); } +static ssize_t radio_read(struct file *file, char __user *data, + size_t count, loff_t *ppos) +{ + struct bttv *btv = file->private_data; + struct rds_command cmd; + cmd.block_count = count/3; + cmd.buffer = data; + cmd.instance = file; + cmd.result = -ENODEV; + + bttv_call_i2c_clients(btv, RDS_CMD_READ, &cmd); + + return cmd.result; +} + +static unsigned int radio_poll(struct file *file, poll_table *wait) +{ + struct bttv *btv = file->private_data; + struct rds_command cmd; + cmd.instance = file; + cmd.event_list = wait; + cmd.result = -ENODEV; + bttv_call_i2c_clients(btv, RDS_CMD_POLL, &cmd); + + return cmd.result; +} + static struct file_operations radio_fops = { .owner = THIS_MODULE, .open = radio_open, + .read = radio_read, .release = radio_release, .ioctl = radio_ioctl, .llseek = no_llseek, + .poll = radio_poll, }; static struct video_device radio_template = @@ -3576,6 +3691,10 @@ static irqreturn_t bttv_irq(int irq, void *dev_id, struct pt_regs * regs) int handled = 0; btv=(struct bttv *)dev_id; + + if (btv->custom_irq) + handled = btv->custom_irq(btv); + count=0; while (1) { /* get/clear interrupt status bits */ @@ -3608,11 +3727,11 @@ static irqreturn_t bttv_irq(int irq, void *dev_id, struct pt_regs * regs) } if (astat&BT848_INT_VSYNC) - btv->field_count++; + btv->field_count++; - if (astat & BT848_INT_GPINT) { + if ((astat & BT848_INT_GPINT) && btv->remote) { wake_up(&btv->gpioq); - bttv_gpio_irq(&btv->c); + bttv_input_irq(btv); } if (astat & BT848_INT_I2CDONE) { @@ -3620,13 +3739,13 @@ static irqreturn_t bttv_irq(int irq, void *dev_id, struct pt_regs * regs) wake_up(&btv->i2c_queue); } - if ((astat & BT848_INT_RISCI) && (stat & (4<<28))) + if ((astat & BT848_INT_RISCI) && (stat & (4<<28))) bttv_irq_switch_vbi(btv); - if ((astat & BT848_INT_RISCI) && (stat & (2<<28))) + if ((astat & BT848_INT_RISCI) && (stat & (2<<28))) bttv_irq_wakeup_top(btv); - if ((astat & BT848_INT_RISCI) && (stat & (1<<28))) + if ((astat & BT848_INT_RISCI) && (stat & (1<<28))) bttv_irq_switch_video(btv); if ((astat & BT848_INT_HLOCK) && btv->opt_automute) @@ -3651,10 +3770,22 @@ static irqreturn_t bttv_irq(int irq, void *dev_id, struct pt_regs * regs) count++; if (count > 4) { - btwrite(0, BT848_INT_MASK); - printk(KERN_ERR - "bttv%d: IRQ lockup, cleared int mask [", btv->c.nr); + + if (count > 8 || !(astat & BT848_INT_GPINT)) { + btwrite(0, BT848_INT_MASK); + + printk(KERN_ERR + "bttv%d: IRQ lockup, cleared int mask [", btv->c.nr); + } else { + printk(KERN_ERR + "bttv%d: IRQ lockup, clearing GPINT from int mask [", btv->c.nr); + + btwrite(btread(BT848_INT_MASK) & (-1 ^ BT848_INT_GPINT), + BT848_INT_MASK); + }; + bttv_print_irqbits(stat,astat); + printk("]\n"); } } @@ -3715,9 +3846,15 @@ static void bttv_unregister_video(struct bttv *btv) /* register video4linux devices */ static int __devinit bttv_register_video(struct bttv *btv) { + if (no_overlay <= 0) { + bttv_video_template.type |= VID_TYPE_OVERLAY; + } else { + printk("bttv: Overlay support disabled.\n"); + } + /* video */ btv->video_dev = vdev_init(btv, &bttv_video_template, "video"); - if (NULL == btv->video_dev) + if (NULL == btv->video_dev) goto err; if (video_register_device(btv->video_dev,VFL_TYPE_GRABBER,video_nr)<0) goto err; @@ -3727,18 +3864,18 @@ static int __devinit bttv_register_video(struct bttv *btv) /* vbi */ btv->vbi_dev = vdev_init(btv, &bttv_vbi_template, "vbi"); - if (NULL == btv->vbi_dev) + if (NULL == btv->vbi_dev) goto err; - if (video_register_device(btv->vbi_dev,VFL_TYPE_VBI,vbi_nr)<0) + if (video_register_device(btv->vbi_dev,VFL_TYPE_VBI,vbi_nr)<0) goto err; printk(KERN_INFO "bttv%d: registered device vbi%d\n", btv->c.nr,btv->vbi_dev->minor & 0x1f); - if (!btv->has_radio) + if (!btv->has_radio) return 0; /* radio */ btv->radio_dev = vdev_init(btv, &radio_template, "radio"); - if (NULL == btv->radio_dev) + if (NULL == btv->radio_dev) goto err; if (video_register_device(btv->radio_dev, VFL_TYPE_RADIO,radio_nr)<0) goto err; @@ -3759,11 +3896,11 @@ static int __devinit bttv_register_video(struct bttv *btv) static void pci_set_command(struct pci_dev *dev) { #if defined(__powerpc__) - unsigned int cmd; + unsigned int cmd; - pci_read_config_dword(dev, PCI_COMMAND, &cmd); - cmd = (cmd | PCI_COMMAND_MEMORY ); - pci_write_config_dword(dev, PCI_COMMAND, cmd); + pci_read_config_dword(dev, PCI_COMMAND, &cmd); + cmd = (cmd | PCI_COMMAND_MEMORY ); + pci_write_config_dword(dev, PCI_COMMAND, cmd); #endif } @@ -3777,68 +3914,61 @@ static int __devinit bttv_probe(struct pci_dev *dev, if (bttv_num == BTTV_MAX) return -ENOMEM; printk(KERN_INFO "bttv: Bt8xx card found (%d).\n", bttv_num); - btv=&bttvs[bttv_num]; + btv=&bttvs[bttv_num]; memset(btv,0,sizeof(*btv)); btv->c.nr = bttv_num; sprintf(btv->c.name,"bttv%d",btv->c.nr); /* initialize structs / fill in defaults */ - init_MUTEX(&btv->lock); - init_MUTEX(&btv->reslock); - spin_lock_init(&btv->s_lock); - spin_lock_init(&btv->gpio_lock); - init_waitqueue_head(&btv->gpioq); - init_waitqueue_head(&btv->i2c_queue); - INIT_LIST_HEAD(&btv->c.subs); - INIT_LIST_HEAD(&btv->capture); - INIT_LIST_HEAD(&btv->vcapture); + mutex_init(&btv->lock); + mutex_init(&btv->reslock); + spin_lock_init(&btv->s_lock); + spin_lock_init(&btv->gpio_lock); + init_waitqueue_head(&btv->gpioq); + init_waitqueue_head(&btv->i2c_queue); + INIT_LIST_HEAD(&btv->c.subs); + INIT_LIST_HEAD(&btv->capture); + INIT_LIST_HEAD(&btv->vcapture); v4l2_prio_init(&btv->prio); init_timer(&btv->timeout); btv->timeout.function = bttv_irq_timeout; btv->timeout.data = (unsigned long)btv; - btv->i2c_rc = -1; - btv->tuner_type = UNSET; - btv->pinnacle_id = UNSET; + btv->i2c_rc = -1; + btv->tuner_type = UNSET; btv->new_input = UNSET; - btv->gpioirq = 1; btv->has_radio=radio[btv->c.nr]; /* pci stuff (init, get irq/mmio, ... */ btv->c.pci = dev; - btv->id = dev->device; + btv->id = dev->device; if (pci_enable_device(dev)) { - printk(KERN_WARNING "bttv%d: Can't enable device.\n", + printk(KERN_WARNING "bttv%d: Can't enable device.\n", btv->c.nr); return -EIO; } - if (pci_set_dma_mask(dev, 0xffffffff)) { - printk(KERN_WARNING "bttv%d: No suitable DMA available.\n", + if (pci_set_dma_mask(dev, DMA_32BIT_MASK)) { + printk(KERN_WARNING "bttv%d: No suitable DMA available.\n", btv->c.nr); return -EIO; - } + } if (!request_mem_region(pci_resource_start(dev,0), pci_resource_len(dev,0), btv->c.name)) { - printk(KERN_WARNING "bttv%d: can't request iomem (0x%lx).\n", + printk(KERN_WARNING "bttv%d: can't request iomem (0x%lx).\n", btv->c.nr, pci_resource_start(dev,0)); return -EBUSY; } - pci_set_master(dev); + pci_set_master(dev); pci_set_command(dev); pci_set_drvdata(dev,btv); - if (!pci_dma_supported(dev,0xffffffff)) { - printk("bttv%d: Oops: no 32bit PCI DMA ???\n", btv->c.nr); - result = -EIO; - goto fail1; - } - pci_read_config_byte(dev, PCI_CLASS_REVISION, &btv->revision); - pci_read_config_byte(dev, PCI_LATENCY_TIMER, &lat); - printk(KERN_INFO "bttv%d: Bt%d (rev %d) at %s, ", - bttv_num,btv->id, btv->revision, pci_name(dev)); - printk("irq: %d, latency: %d, mmio: 0x%lx\n", + pci_read_config_byte(dev, PCI_CLASS_REVISION, &btv->revision); + pci_read_config_byte(dev, PCI_LATENCY_TIMER, &lat); + printk(KERN_INFO "bttv%d: Bt%d (rev %d) at %s, ", + bttv_num,btv->id, btv->revision, pci_name(dev)); + printk("irq: %d, latency: %d, mmio: 0x%lx\n", btv->c.pci->irq, lat, pci_resource_start(dev,0)); schedule(); @@ -3849,23 +3979,23 @@ static int __devinit bttv_probe(struct pci_dev *dev, goto fail1; } - /* identify card */ + /* identify card */ bttv_idcard(btv); - /* disable irqs, register irq handler */ + /* disable irqs, register irq handler */ btwrite(0, BT848_INT_MASK); - result = request_irq(btv->c.pci->irq, bttv_irq, - SA_SHIRQ | SA_INTERRUPT,btv->c.name,(void *)btv); - if (result < 0) { - printk(KERN_ERR "bttv%d: can't get IRQ %d\n", + result = request_irq(btv->c.pci->irq, bttv_irq, + SA_SHIRQ | SA_INTERRUPT,btv->c.name,(void *)btv); + if (result < 0) { + printk(KERN_ERR "bttv%d: can't get IRQ %d\n", bttv_num,btv->c.pci->irq); goto fail1; - } + } if (0 != bttv_handle_chipset(btv)) { result = -EIO; goto fail2; - } + } /* init options from insmod args */ btv->opt_combfilter = combfilter; @@ -3876,6 +4006,9 @@ static int __devinit bttv_probe(struct pci_dev *dev, btv->opt_vcr_hack = vcr_hack; btv->opt_whitecrush_upper = whitecrush_upper; btv->opt_whitecrush_lower = whitecrush_lower; + btv->opt_uv_ratio = uv_ratio; + btv->opt_full_luma_range = full_luma_range; + btv->opt_coring = coring; /* fill struct bttv with some useful defaults */ btv->init.btv = btv; @@ -3888,29 +4021,29 @@ static int __devinit bttv_probe(struct pci_dev *dev, btv->input = 0; /* initialize hardware */ - if (bttv_gpio) - bttv_gpio_tracking(btv,"pre-init"); + if (bttv_gpio) + bttv_gpio_tracking(btv,"pre-init"); bttv_risc_init_main(btv); init_bt848(btv); /* gpio */ - btwrite(0x00, BT848_GPIO_REG_INP); - btwrite(0x00, BT848_GPIO_OUT_EN); - if (bttv_verbose) - bttv_gpio_tracking(btv,"init"); + btwrite(0x00, BT848_GPIO_REG_INP); + btwrite(0x00, BT848_GPIO_OUT_EN); + if (bttv_verbose) + bttv_gpio_tracking(btv,"init"); - /* needs to be done before i2c is registered */ - bttv_init_card1(btv); + /* needs to be done before i2c is registered */ + bttv_init_card1(btv); - /* register i2c + gpio */ - init_bttv_i2c(btv); + /* register i2c + gpio */ + init_bttv_i2c(btv); - /* some card-specific stuff (needs working i2c) */ - bttv_init_card2(btv); + /* some card-specific stuff (needs working i2c) */ + bttv_init_card2(btv); init_irqreg(btv); - /* register video4linux + input */ + /* register video4linux + input */ if (!bttv_tvcards[btv->c.type].no_video) { bttv_register_video(btv); bt848_bright(btv,32768); @@ -3922,17 +4055,17 @@ static int __devinit bttv_probe(struct pci_dev *dev, } /* add subdevices */ - if (btv->has_remote) - bttv_sub_add_device(&btv->c, "remote"); if (bttv_tvcards[btv->c.type].has_dvb) bttv_sub_add_device(&btv->c, "dvb"); + bttv_input_init(btv); + /* everything is fine */ bttv_num++; - return 0; + return 0; fail2: - free_irq(btv->c.pci->irq,btv); + free_irq(btv->c.pci->irq,btv); fail1: if (btv->bt848_mmio) @@ -3945,12 +4078,12 @@ static int __devinit bttv_probe(struct pci_dev *dev, static void __devexit bttv_remove(struct pci_dev *pci_dev) { - struct bttv *btv = pci_get_drvdata(pci_dev); + struct bttv *btv = pci_get_drvdata(pci_dev); if (bttv_verbose) printk("bttv%d: unloading\n",btv->c.nr); - /* shutdown everything (DMA+IRQs) */ + /* shutdown everything (DMA+IRQs) */ btand(~15, BT848_GPIO_DMA_CTL); btwrite(0, BT848_INT_MASK); btwrite(~0x0, BT848_INT_STAT); @@ -3961,9 +4094,10 @@ static void __devexit bttv_remove(struct pci_dev *pci_dev) /* tell gpio modules we are leaving ... */ btv->shutdown=1; wake_up(&btv->gpioq); + bttv_input_fini(btv); bttv_sub_del_devices(&btv->c); - /* unregister i2c_bus + input */ + /* unregister i2c_bus + input */ fini_bttv_i2c(btv); /* unregister video4linux */ @@ -3973,22 +4107,22 @@ static void __devexit bttv_remove(struct pci_dev *pci_dev) btcx_riscmem_free(btv->c.pci,&btv->main); /* free ressources */ - free_irq(btv->c.pci->irq,btv); + free_irq(btv->c.pci->irq,btv); iounmap(btv->bt848_mmio); - release_mem_region(pci_resource_start(btv->c.pci,0), - pci_resource_len(btv->c.pci,0)); + release_mem_region(pci_resource_start(btv->c.pci,0), + pci_resource_len(btv->c.pci,0)); pci_set_drvdata(pci_dev, NULL); - return; + return; } static int bttv_suspend(struct pci_dev *pci_dev, pm_message_t state) { - struct bttv *btv = pci_get_drvdata(pci_dev); + struct bttv *btv = pci_get_drvdata(pci_dev); struct bttv_buffer_set idle; unsigned long flags; - dprintk("bttv%d: suspend %d\n", btv->c.nr, state); + dprintk("bttv%d: suspend %d\n", btv->c.nr, state.event); /* stop dma + irqs */ spin_lock_irqsave(&btv->s_lock,flags); @@ -4019,17 +4153,31 @@ static int bttv_suspend(struct pci_dev *pci_dev, pm_message_t state) static int bttv_resume(struct pci_dev *pci_dev) { - struct bttv *btv = pci_get_drvdata(pci_dev); + struct bttv *btv = pci_get_drvdata(pci_dev); unsigned long flags; + int err; dprintk("bttv%d: resume\n", btv->c.nr); /* restore pci state */ if (btv->state.disabled) { - pci_enable_device(pci_dev); + err=pci_enable_device(pci_dev); + if (err) { + printk(KERN_WARNING "bttv%d: Can't enable device.\n", + btv->c.nr); + return err; + } btv->state.disabled = 0; } - pci_set_power_state(pci_dev, PCI_D0); + err=pci_set_power_state(pci_dev, PCI_D0); + if (err) { + pci_disable_device(pci_dev); + printk(KERN_WARNING "bttv%d: Can't enable device.\n", + btv->c.nr); + btv->state.disabled = 1; + return err; + } + pci_restore_state(pci_dev); /* restore bt878 state */ @@ -4050,24 +4198,24 @@ static int bttv_resume(struct pci_dev *pci_dev) } static struct pci_device_id bttv_pci_tbl[] = { - {PCI_VENDOR_ID_BROOKTREE, PCI_DEVICE_ID_BT848, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, + {PCI_VENDOR_ID_BROOKTREE, PCI_DEVICE_ID_BT848, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, {PCI_VENDOR_ID_BROOKTREE, PCI_DEVICE_ID_BT849, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, {PCI_VENDOR_ID_BROOKTREE, PCI_DEVICE_ID_BT878, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, {PCI_VENDOR_ID_BROOKTREE, PCI_DEVICE_ID_BT879, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, - {0,} + PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, + {0,} }; MODULE_DEVICE_TABLE(pci, bttv_pci_tbl); static struct pci_driver bttv_pci_driver = { - .name = "bttv", - .id_table = bttv_pci_tbl, - .probe = bttv_probe, - .remove = __devexit_p(bttv_remove), + .name = "bttv", + .id_table = bttv_pci_tbl, + .probe = bttv_probe, + .remove = __devexit_p(bttv_remove), .suspend = bttv_suspend, .resume = bttv_resume, }; @@ -4096,7 +4244,7 @@ static int bttv_init_module(void) bttv_check_chipset(); bus_register(&bttv_sub_bus_type); - return pci_module_init(&bttv_pci_driver); + return pci_register_driver(&bttv_pci_driver); } static void bttv_cleanup_module(void) diff --git a/drivers/media/video/bttv-gpio.c b/drivers/media/video/bttv-gpio.c index 77320cdf2..c4d5e2b70 100644 --- a/drivers/media/video/bttv-gpio.c +++ b/drivers/media/video/bttv-gpio.c @@ -1,5 +1,4 @@ /* - $Id: bttv-gpio.c,v 1.7 2005/02/16 12:14:10 kraxel Exp $ bttv-gpio.c -- gpio sub drivers @@ -8,7 +7,7 @@ Copyright (C) 1996,97,98 Ralph Metzler (rjkm@thp.uni-koeln.de) - & Marcus Metzler (mocm@thp.uni-koeln.de) + & Marcus Metzler (mocm@thp.uni-koeln.de) (c) 1999-2003 Gerd Knorr This program is free software; you can redistribute it and/or modify @@ -48,9 +47,29 @@ static int bttv_sub_bus_match(struct device *dev, struct device_driver *drv) return 0; } +static int bttv_sub_probe(struct device *dev) +{ + struct bttv_sub_device *sdev = to_bttv_sub_dev(dev); + struct bttv_sub_driver *sub = to_bttv_sub_drv(dev->driver); + + return sub->probe ? sub->probe(sdev) : -ENODEV; +} + +static int bttv_sub_remove(struct device *dev) +{ + struct bttv_sub_device *sdev = to_bttv_sub_dev(dev); + struct bttv_sub_driver *sub = to_bttv_sub_drv(dev->driver); + + if (sub->remove) + sub->remove(sdev); + return 0; +} + struct bus_type bttv_sub_bus_type = { - .name = "bttv-sub", - .match = &bttv_sub_bus_match, + .name = "bttv-sub", + .match = &bttv_sub_bus_match, + .probe = bttv_sub_probe, + .remove = bttv_sub_remove, }; EXPORT_SYMBOL(bttv_sub_bus_type); @@ -65,10 +84,9 @@ int bttv_sub_add_device(struct bttv_core *core, char *name) struct bttv_sub_device *sub; int err; - sub = kmalloc(sizeof(*sub),GFP_KERNEL); + sub = kzalloc(sizeof(*sub),GFP_KERNEL); if (NULL == sub) return -ENOMEM; - memset(sub,0,sizeof(*sub)); sub->core = core; sub->dev.parent = &core->pci->dev; diff --git a/drivers/media/video/bttv-i2c.c b/drivers/media/video/bttv-i2c.c index c2368bc83..614c12018 100644 --- a/drivers/media/video/bttv-i2c.c +++ b/drivers/media/video/bttv-i2c.c @@ -1,12 +1,11 @@ /* - $Id: bttv-i2c.c,v 1.18 2005/02/16 12:14:10 kraxel Exp $ bttv-i2c.c -- all the i2c code is here bttv - Bt848 frame grabber driver Copyright (C) 1996,97,98 Ralph Metzler (rjkm@thp.uni-koeln.de) - & Marcus Metzler (mocm@thp.uni-koeln.de) + & Marcus Metzler (mocm@thp.uni-koeln.de) (c) 1999-2003 Gerd Knorr This program is free software; you can redistribute it and/or modify @@ -29,10 +28,11 @@ #include #include #include -#include -#include #include "bttvp.h" +#include +#include +#include static struct i2c_algo_bit_data bttv_i2c_algo_bit_template; static struct i2c_adapter bttv_i2c_adap_sw_template; @@ -41,9 +41,9 @@ static struct i2c_client bttv_i2c_client_template; static int attach_inform(struct i2c_client *client); -static int i2c_debug = 0; -static int i2c_hw = 0; -static int i2c_scan = 0; +static int i2c_debug; +static int i2c_hw; +static int i2c_scan; module_param(i2c_debug, int, 0644); module_param(i2c_hw, int, 0444); module_param(i2c_scan, int, 0444); @@ -106,10 +106,8 @@ static struct i2c_algo_bit_data bttv_i2c_algo_bit_template = { static struct i2c_adapter bttv_i2c_adap_sw_template = { .owner = THIS_MODULE, -#ifdef I2C_CLASS_TV_ANALOG .class = I2C_CLASS_TV_ANALOG, -#endif - I2C_DEVNAME("bt848"), + .name = "bttv", .id = I2C_HW_B_BT848, .client_register = attach_inform, }; @@ -238,7 +236,7 @@ bttv_i2c_readbytes(struct bttv *btv, const struct i2c_msg *msg, int last) err: if (i2c_debug) printk(" ERR: %d\n",retval); - return retval; + return retval; } static int bttv_i2c_xfer(struct i2c_adapter *i2c_adap, struct i2c_msg *msgs, int num) @@ -270,20 +268,16 @@ static int bttv_i2c_xfer(struct i2c_adapter *i2c_adap, struct i2c_msg *msgs, int } static struct i2c_algorithm bttv_algo = { - .name = "bt878", - .id = I2C_ALGO_BIT | I2C_HW_B_BT848 /* FIXME */, .master_xfer = bttv_i2c_xfer, .algo_control = algo_control, .functionality = functionality, }; static struct i2c_adapter bttv_i2c_adap_hw_template = { - .owner = THIS_MODULE, -#ifdef I2C_CLASS_TV_ANALOG + .owner = THIS_MODULE, .class = I2C_CLASS_TV_ANALOG, -#endif - I2C_DEVNAME("bt878"), - .id = I2C_ALGO_BIT | I2C_HW_B_BT848 /* FIXME */, + .name = "bt878", + .id = I2C_HW_B_BT848 /* FIXME */, .algo = &bttv_algo, .client_register = attach_inform, }; @@ -293,17 +287,36 @@ static struct i2c_adapter bttv_i2c_adap_hw_template = { static int attach_inform(struct i2c_client *client) { - struct bttv *btv = i2c_get_adapdata(client->adapter); - - if (btv->tuner_type != UNSET) - bttv_call_i2c_clients(btv,TUNER_SET_TYPE,&btv->tuner_type); - if (btv->pinnacle_id != UNSET) - bttv_call_i2c_clients(btv,AUDC_CONFIG_PINNACLE, - &btv->pinnacle_id); - if (bttv_debug) - printk("bttv%d: i2c attach [client=%s]\n", - btv->c.nr, i2c_clientname(client)); - return 0; + struct bttv *btv = i2c_get_adapdata(client->adapter); + int addr=ADDR_UNSET; + + + if (ADDR_UNSET != bttv_tvcards[btv->c.type].tuner_addr) + addr = bttv_tvcards[btv->c.type].tuner_addr; + + + if (bttv_debug) + printk(KERN_DEBUG "bttv%d: %s i2c attach [addr=0x%x,client=%s]\n", + btv->c.nr, client->driver->driver.name, client->addr, + client->name); + if (!client->driver->command) + return 0; + + if (btv->tuner_type != UNSET) { + struct tuner_setup tun_setup; + + if ((addr==ADDR_UNSET) || + (addr==client->addr)) { + + tun_setup.mode_mask = T_ANALOG_TV | T_DIGITAL_TV | T_RADIO; + tun_setup.type = btv->tuner_type; + tun_setup.addr = addr; + bttv_call_i2c_clients(btv, TUNER_SET_TYPE_ADDR, &tun_setup); + } + + } + + return 0; } void bttv_call_i2c_clients(struct bttv *btv, unsigned int cmd, void *arg) @@ -314,50 +327,50 @@ void bttv_call_i2c_clients(struct bttv *btv, unsigned int cmd, void *arg) } static struct i2c_client bttv_i2c_client_template = { - I2C_DEVNAME("bttv internal"), + .name = "bttv internal", }; /* read I2C */ int bttv_I2CRead(struct bttv *btv, unsigned char addr, char *probe_for) { - unsigned char buffer = 0; + unsigned char buffer = 0; if (0 != btv->i2c_rc) return -1; if (bttv_verbose && NULL != probe_for) printk(KERN_INFO "bttv%d: i2c: checking for %s @ 0x%02x... ", btv->c.nr,probe_for,addr); - btv->i2c_client.addr = addr >> 1; - if (1 != i2c_master_recv(&btv->i2c_client, &buffer, 1)) { + btv->i2c_client.addr = addr >> 1; + if (1 != i2c_master_recv(&btv->i2c_client, &buffer, 1)) { if (NULL != probe_for) { if (bttv_verbose) printk("not found\n"); } else printk(KERN_WARNING "bttv%d: i2c read 0x%x: error\n", btv->c.nr,addr); - return -1; + return -1; } if (bttv_verbose && NULL != probe_for) printk("found\n"); - return buffer; + return buffer; } /* write I2C */ int bttv_I2CWrite(struct bttv *btv, unsigned char addr, unsigned char b1, - unsigned char b2, int both) + unsigned char b2, int both) { - unsigned char buffer[2]; - int bytes = both ? 2 : 1; + unsigned char buffer[2]; + int bytes = both ? 2 : 1; if (0 != btv->i2c_rc) return -1; - btv->i2c_client.addr = addr >> 1; - buffer[0] = b1; - buffer[1] = b2; - if (bytes != i2c_master_send(&btv->i2c_client, buffer, bytes)) + btv->i2c_client.addr = addr >> 1; + buffer[0] = b1; + buffer[1] = b2; + if (bytes != i2c_master_send(&btv->i2c_client, buffer, bytes)) return -1; - return 0; + return 0; } /* read EEPROM content */ @@ -371,6 +384,7 @@ void __devinit bttv_readee(struct bttv *btv, unsigned char *eedata, int addr) } static char *i2c_devs[128] = { + [ 0x1c >> 1 ] = "lgdt330x", [ 0x30 >> 1 ] = "IR (hauppauge)", [ 0x80 >> 1 ] = "msp34xx", [ 0x86 >> 1 ] = "tda9887", @@ -421,15 +435,13 @@ int __devinit init_bttv_i2c(struct bttv *btv) "bt%d #%d [%s]", btv->id, btv->c.nr, btv->use_i2c_hw ? "hw" : "sw"); - i2c_set_adapdata(&btv->c.i2c_adap, btv); - btv->i2c_client.adapter = &btv->c.i2c_adap; + i2c_set_adapdata(&btv->c.i2c_adap, btv); + btv->i2c_client.adapter = &btv->c.i2c_adap; -#ifdef I2C_CLASS_TV_ANALOG if (bttv_tvcards[btv->c.type].no_video) btv->c.i2c_adap.class &= ~I2C_CLASS_TV_ANALOG; if (bttv_tvcards[btv->c.type].has_dvb) btv->c.i2c_adap.class |= I2C_CLASS_TV_DIGITAL; -#endif if (btv->use_i2c_hw) { btv->i2c_rc = i2c_add_adapter(&btv->c.i2c_adap); diff --git a/drivers/media/video/bttv-if.c b/drivers/media/video/bttv-if.c index f7b5543a9..19b564ab0 100644 --- a/drivers/media/video/bttv-if.c +++ b/drivers/media/video/bttv-if.c @@ -1,14 +1,13 @@ /* - $Id: bttv-if.c,v 1.4 2004/11/17 18:47:47 kraxel Exp $ bttv-if.c -- old gpio interface to other kernel modules - don't use in new code, will go away in 2.7 + don't use in new code, will go away in 2.7 have a look at bttv-gpio.c instead. bttv - Bt848 frame grabber driver Copyright (C) 1996,97,98 Ralph Metzler (rjkm@thp.uni-koeln.de) - & Marcus Metzler (mocm@thp.uni-koeln.de) + & Marcus Metzler (mocm@thp.uni-koeln.de) (c) 1999-2003 Gerd Knorr This program is free software; you can redistribute it and/or modify diff --git a/drivers/media/video/bttv-risc.c b/drivers/media/video/bttv-risc.c index bdc5ce6c4..b40e9734b 100644 --- a/drivers/media/video/bttv-risc.c +++ b/drivers/media/video/bttv-risc.c @@ -1,5 +1,4 @@ /* - $Id: bttv-risc.c,v 1.10 2004/11/19 18:07:12 kraxel Exp $ bttv-risc.c -- interfaces to other kernel modules @@ -75,27 +74,27 @@ bttv_risc_packed(struct bttv *btv, struct btcx_riscmem *risc, } if (bpl <= sg_dma_len(sg)-offset) { /* fits into current chunk */ - *(rp++)=cpu_to_le32(BT848_RISC_WRITE|BT848_RISC_SOL| + *(rp++)=cpu_to_le32(BT848_RISC_WRITE|BT848_RISC_SOL| BT848_RISC_EOL|bpl); - *(rp++)=cpu_to_le32(sg_dma_address(sg)+offset); - offset+=bpl; + *(rp++)=cpu_to_le32(sg_dma_address(sg)+offset); + offset+=bpl; } else { /* scanline needs to be splitted */ - todo = bpl; - *(rp++)=cpu_to_le32(BT848_RISC_WRITE|BT848_RISC_SOL| + todo = bpl; + *(rp++)=cpu_to_le32(BT848_RISC_WRITE|BT848_RISC_SOL| (sg_dma_len(sg)-offset)); - *(rp++)=cpu_to_le32(sg_dma_address(sg)+offset); - todo -= (sg_dma_len(sg)-offset); - offset = 0; - sg++; - while (todo > sg_dma_len(sg)) { - *(rp++)=cpu_to_le32(BT848_RISC_WRITE| + *(rp++)=cpu_to_le32(sg_dma_address(sg)+offset); + todo -= (sg_dma_len(sg)-offset); + offset = 0; + sg++; + while (todo > sg_dma_len(sg)) { + *(rp++)=cpu_to_le32(BT848_RISC_WRITE| sg_dma_len(sg)); - *(rp++)=cpu_to_le32(sg_dma_address(sg)); + *(rp++)=cpu_to_le32(sg_dma_address(sg)); todo -= sg_dma_len(sg); sg++; } - *(rp++)=cpu_to_le32(BT848_RISC_WRITE|BT848_RISC_EOL| + *(rp++)=cpu_to_le32(BT848_RISC_WRITE|BT848_RISC_EOL| todo); *(rp++)=cpu_to_le32(sg_dma_address(sg)); offset += todo; @@ -202,8 +201,8 @@ bttv_risc_planar(struct bttv *btv, struct btcx_riscmem *risc, ri |= BT848_RISC_EOL; /* write risc instruction */ - *(rp++)=cpu_to_le32(ri | ylen); - *(rp++)=cpu_to_le32(((ylen >> hshift) << 16) | + *(rp++)=cpu_to_le32(ri | ylen); + *(rp++)=cpu_to_le32(((ylen >> hshift) << 16) | (ylen >> hshift)); *(rp++)=cpu_to_le32(sg_dma_address(ysg)+yoffset); yoffset += ylen; @@ -320,7 +319,7 @@ bttv_calc_geo(struct bttv *btv, struct bttv_geometry *geo, int width, int height, int interleaved, int norm) { const struct bttv_tvnorm *tvnorm = &bttv_tvnorms[norm]; - u32 xsf, sr; + u32 xsf, sr; int vdelay; int swidth = tvnorm->swidth; @@ -334,57 +333,53 @@ bttv_calc_geo(struct bttv *btv, struct bttv_geometry *geo, } vdelay = tvnorm->vdelay; -#if 0 /* FIXME */ - if (vdelay < btv->vbi.lines*2) - vdelay = btv->vbi.lines*2; -#endif - - xsf = (width*scaledtwidth)/swidth; - geo->hscale = ((totalwidth*4096UL)/xsf-4096); - geo->hdelay = tvnorm->hdelayx1; - geo->hdelay = (geo->hdelay*width)/swidth; - geo->hdelay &= 0x3fe; - sr = ((tvnorm->sheight >> (interleaved?0:1))*512)/height - 512; - geo->vscale = (0x10000UL-sr) & 0x1fff; - geo->crop = ((width>>8)&0x03) | ((geo->hdelay>>6)&0x0c) | - ((tvnorm->sheight>>4)&0x30) | ((vdelay>>2)&0xc0); - geo->vscale |= interleaved ? (BT848_VSCALE_INT<<8) : 0; - geo->vdelay = vdelay; - geo->width = width; - geo->sheight = tvnorm->sheight; + + xsf = (width*scaledtwidth)/swidth; + geo->hscale = ((totalwidth*4096UL)/xsf-4096); + geo->hdelay = tvnorm->hdelayx1; + geo->hdelay = (geo->hdelay*width)/swidth; + geo->hdelay &= 0x3fe; + sr = ((tvnorm->sheight >> (interleaved?0:1))*512)/height - 512; + geo->vscale = (0x10000UL-sr) & 0x1fff; + geo->crop = ((width>>8)&0x03) | ((geo->hdelay>>6)&0x0c) | + ((tvnorm->sheight>>4)&0x30) | ((vdelay>>2)&0xc0); + geo->vscale |= interleaved ? (BT848_VSCALE_INT<<8) : 0; + geo->vdelay = vdelay; + geo->width = width; + geo->sheight = tvnorm->sheight; geo->vtotal = tvnorm->vtotal; - if (btv->opt_combfilter) { - geo->vtc = (width < 193) ? 2 : ((width < 385) ? 1 : 0); - geo->comb = (width < 769) ? 1 : 0; - } else { - geo->vtc = 0; - geo->comb = 0; - } + if (btv->opt_combfilter) { + geo->vtc = (width < 193) ? 2 : ((width < 385) ? 1 : 0); + geo->comb = (width < 769) ? 1 : 0; + } else { + geo->vtc = 0; + geo->comb = 0; + } } static void bttv_apply_geo(struct bttv *btv, struct bttv_geometry *geo, int odd) { - int off = odd ? 0x80 : 0x00; + int off = odd ? 0x80 : 0x00; if (geo->comb) btor(BT848_VSCALE_COMB, BT848_E_VSCALE_HI+off); else btand(~BT848_VSCALE_COMB, BT848_E_VSCALE_HI+off); - btwrite(geo->vtc, BT848_E_VTC+off); - btwrite(geo->hscale >> 8, BT848_E_HSCALE_HI+off); - btwrite(geo->hscale & 0xff, BT848_E_HSCALE_LO+off); - btaor((geo->vscale>>8), 0xe0, BT848_E_VSCALE_HI+off); - btwrite(geo->vscale & 0xff, BT848_E_VSCALE_LO+off); - btwrite(geo->width & 0xff, BT848_E_HACTIVE_LO+off); - btwrite(geo->hdelay & 0xff, BT848_E_HDELAY_LO+off); - btwrite(geo->sheight & 0xff, BT848_E_VACTIVE_LO+off); - btwrite(geo->vdelay & 0xff, BT848_E_VDELAY_LO+off); - btwrite(geo->crop, BT848_E_CROP+off); + btwrite(geo->vtc, BT848_E_VTC+off); + btwrite(geo->hscale >> 8, BT848_E_HSCALE_HI+off); + btwrite(geo->hscale & 0xff, BT848_E_HSCALE_LO+off); + btaor((geo->vscale>>8), 0xe0, BT848_E_VSCALE_HI+off); + btwrite(geo->vscale & 0xff, BT848_E_VSCALE_LO+off); + btwrite(geo->width & 0xff, BT848_E_HACTIVE_LO+off); + btwrite(geo->hdelay & 0xff, BT848_E_HDELAY_LO+off); + btwrite(geo->sheight & 0xff, BT848_E_VACTIVE_LO+off); + btwrite(geo->vdelay & 0xff, BT848_E_VDELAY_LO+off); + btwrite(geo->crop, BT848_E_CROP+off); btwrite(geo->vtotal>>8, BT848_VTOTAL_HI); - btwrite(geo->vtotal & 0xff, BT848_VTOTAL_LO); + btwrite(geo->vtotal & 0xff, BT848_VTOTAL_LO); } /* ---------------------------------------------------------- */ @@ -425,7 +420,7 @@ bttv_set_dma(struct bttv *btv, int override) } else { del_timer(&btv->timeout); } - btv->main.cpu[RISC_SLOT_LOOP] = cpu_to_le32(cmd); + btv->main.cpu[RISC_SLOT_LOOP] = cpu_to_le32(cmd); btaor(capctl, ~0x0f, BT848_CAP_CTL); if (capctl) { @@ -437,7 +432,7 @@ bttv_set_dma(struct bttv *btv, int override) } else { if (!btv->dma_on) return; - btand(~3, BT848_GPIO_DMA_CTL); + btand(~3, BT848_GPIO_DMA_CTL); btv->dma_on = 0; } return; @@ -465,19 +460,19 @@ bttv_risc_init_main(struct bttv *btv) btv->main.cpu[6] = cpu_to_le32(BT848_RISC_JUMP); btv->main.cpu[7] = cpu_to_le32(btv->main.dma + (8<<2)); - btv->main.cpu[8] = cpu_to_le32(BT848_RISC_SYNC | BT848_RISC_RESYNC | + btv->main.cpu[8] = cpu_to_le32(BT848_RISC_SYNC | BT848_RISC_RESYNC | BT848_FIFO_STATUS_VRO); - btv->main.cpu[9] = cpu_to_le32(0); + btv->main.cpu[9] = cpu_to_le32(0); /* bottom field */ - btv->main.cpu[10] = cpu_to_le32(BT848_RISC_JUMP); + btv->main.cpu[10] = cpu_to_le32(BT848_RISC_JUMP); btv->main.cpu[11] = cpu_to_le32(btv->main.dma + (12<<2)); - btv->main.cpu[12] = cpu_to_le32(BT848_RISC_JUMP); + btv->main.cpu[12] = cpu_to_le32(BT848_RISC_JUMP); btv->main.cpu[13] = cpu_to_le32(btv->main.dma + (14<<2)); /* jump back to top field */ btv->main.cpu[14] = cpu_to_le32(BT848_RISC_JUMP); - btv->main.cpu[15] = cpu_to_le32(btv->main.dma + (0<<2)); + btv->main.cpu[15] = cpu_to_le32(btv->main.dma + (0<<2)); return 0; } @@ -776,13 +771,8 @@ bttv_overlay_risc(struct bttv *btv, bttv_risc_overlay(btv, &buf->bottom, fmt, ov, 0, 0); break; case V4L2_FIELD_INTERLACED: -#if 0 - bttv_risc_overlay(btv, &buf->top, fmt, ov, 1, 0); - bttv_risc_overlay(btv, &buf->bottom, fmt, ov, 0, 1); -#else bttv_risc_overlay(btv, &buf->top, fmt, ov, 0, 1); bttv_risc_overlay(btv, &buf->bottom, fmt, ov, 1, 0); -#endif break; default: BUG(); diff --git a/drivers/media/video/bttv-vbi.c b/drivers/media/video/bttv-vbi.c index 06f3e62b3..72afdd64b 100644 --- a/drivers/media/video/bttv-vbi.c +++ b/drivers/media/video/bttv-vbi.c @@ -1,5 +1,4 @@ /* - $Id: bttv-vbi.c,v 1.9 2005/01/13 17:22:33 kraxel Exp $ bttv - Bt848 frame grabber driver vbi interface @@ -32,6 +31,12 @@ #include #include "bttvp.h" +/* Offset from line sync pulse leading edge (0H) in 1 / sampling_rate: + bt8x8 /HRESET pulse starts at 0H and has length 64 / fCLKx1 (E|O_VTC + HSFMT = 0). VBI_HDELAY (always 0) is an offset from the trailing edge + of /HRESET in 1 / fCLKx1, and the sampling_rate tvnorm->Fsc is fCLKx2. */ +#define VBI_OFFSET ((64 + 0) * 2) + #define VBI_DEFLINES 16 #define VBI_MAXLINES 32 @@ -164,40 +169,30 @@ void bttv_vbi_setlines(struct bttv_fh *fh, struct bttv *btv, int lines) void bttv_vbi_try_fmt(struct bttv_fh *fh, struct v4l2_format *f) { const struct bttv_tvnorm *tvnorm; - u32 start0,start1; - s32 count0,count1,count; + s64 count0,count1,count; tvnorm = &bttv_tvnorms[fh->btv->tvnorm]; f->type = V4L2_BUF_TYPE_VBI_CAPTURE; f->fmt.vbi.sampling_rate = tvnorm->Fsc; f->fmt.vbi.samples_per_line = 2048; f->fmt.vbi.sample_format = V4L2_PIX_FMT_GREY; - f->fmt.vbi.offset = 244; + f->fmt.vbi.offset = VBI_OFFSET; f->fmt.vbi.flags = 0; - switch (fh->btv->tvnorm) { - case 1: /* NTSC */ - start0 = 10; - start1 = 273; - break; - case 0: /* PAL */ - case 2: /* SECAM */ - default: - start0 = 7; - start1 = 320; - } - count0 = (f->fmt.vbi.start[0] + f->fmt.vbi.count[0]) - start0; - count1 = (f->fmt.vbi.start[1] + f->fmt.vbi.count[1]) - start1; - count = max(count0,count1); - if (count > VBI_MAXLINES) - count = VBI_MAXLINES; - if (count < 1) - count = 1; + /* s64 to prevent overflow. */ + count0 = (s64) f->fmt.vbi.start[0] + f->fmt.vbi.count[0] + - tvnorm->vbistart[0]; + count1 = (s64) f->fmt.vbi.start[1] + f->fmt.vbi.count[1] + - tvnorm->vbistart[1]; + count = clamp (max (count0, count1), 1LL, (s64) VBI_MAXLINES); - f->fmt.vbi.start[0] = start0; - f->fmt.vbi.start[1] = start1; + f->fmt.vbi.start[0] = tvnorm->vbistart[0]; + f->fmt.vbi.start[1] = tvnorm->vbistart[1]; f->fmt.vbi.count[0] = count; f->fmt.vbi.count[1] = count; + + f->fmt.vbi.reserved[0] = 0; + f->fmt.vbi.reserved[1] = 0; } void bttv_vbi_get_fmt(struct bttv_fh *fh, struct v4l2_format *f) @@ -210,21 +205,12 @@ void bttv_vbi_get_fmt(struct bttv_fh *fh, struct v4l2_format *f) f->fmt.vbi.sampling_rate = tvnorm->Fsc; f->fmt.vbi.samples_per_line = 2048; f->fmt.vbi.sample_format = V4L2_PIX_FMT_GREY; - f->fmt.vbi.offset = 244; + f->fmt.vbi.offset = VBI_OFFSET; + f->fmt.vbi.start[0] = tvnorm->vbistart[0]; + f->fmt.vbi.start[1] = tvnorm->vbistart[1]; f->fmt.vbi.count[0] = fh->lines; f->fmt.vbi.count[1] = fh->lines; f->fmt.vbi.flags = 0; - switch (fh->btv->tvnorm) { - case 1: /* NTSC */ - f->fmt.vbi.start[0] = 10; - f->fmt.vbi.start[1] = 273; - break; - case 0: /* PAL */ - case 2: /* SECAM */ - default: - f->fmt.vbi.start[0] = 7; - f->fmt.vbi.start[1] = 319; - } } /* ----------------------------------------------------------------------- */ diff --git a/drivers/media/video/bttv.h b/drivers/media/video/bttv.h index 8322b66e0..9908c8e0c 100644 --- a/drivers/media/video/bttv.h +++ b/drivers/media/video/bttv.h @@ -1,5 +1,4 @@ /* - * $Id: bttv.h,v 1.17 2005/02/22 14:06:32 kraxel Exp $ * * bttv - Bt848 frame grabber driver * @@ -17,124 +16,157 @@ #include #include +#include +#include /* ---------------------------------------------------------- */ /* exported by bttv-cards.c */ -#define BTTV_UNKNOWN 0x00 -#define BTTV_MIRO 0x01 -#define BTTV_HAUPPAUGE 0x02 -#define BTTV_STB 0x03 -#define BTTV_INTEL 0x04 -#define BTTV_DIAMOND 0x05 -#define BTTV_AVERMEDIA 0x06 -#define BTTV_MATRIX_VISION 0x07 -#define BTTV_FLYVIDEO 0x08 -#define BTTV_TURBOTV 0x09 -#define BTTV_HAUPPAUGE878 0x0a -#define BTTV_MIROPRO 0x0b -#define BTTV_ADSTECH_TV 0x0c -#define BTTV_AVERMEDIA98 0x0d -#define BTTV_VHX 0x0e -#define BTTV_ZOLTRIX 0x0f -#define BTTV_PIXVIEWPLAYTV 0x10 -#define BTTV_WINVIEW_601 0x11 -#define BTTV_AVEC_INTERCAP 0x12 -#define BTTV_LIFE_FLYKIT 0x13 -#define BTTV_CEI_RAFFLES 0x14 -#define BTTV_CONFERENCETV 0x15 -#define BTTV_PHOEBE_TVMAS 0x16 -#define BTTV_MODTEC_205 0x17 -#define BTTV_MAGICTVIEW061 0x18 -#define BTTV_VOBIS_BOOSTAR 0x19 -#define BTTV_HAUPPAUG_WCAM 0x1a -#define BTTV_MAXI 0x1b -#define BTTV_TERRATV 0x1c -#define BTTV_PXC200 0x1d -#define BTTV_FLYVIDEO_98 0x1e -#define BTTV_IPROTV 0x1f -#define BTTV_INTEL_C_S_PCI 0x20 -#define BTTV_TERRATVALUE 0x21 -#define BTTV_WINFAST2000 0x22 -#define BTTV_CHRONOS_VS2 0x23 -#define BTTV_TYPHOON_TVIEW 0x24 -#define BTTV_PXELVWPLTVPRO 0x25 -#define BTTV_MAGICTVIEW063 0x26 -#define BTTV_PINNACLE 0x27 -#define BTTV_STB2 0x28 -#define BTTV_AVPHONE98 0x29 -#define BTTV_PV951 0x2a -#define BTTV_ONAIR_TV 0x2b -#define BTTV_SIGMA_TVII_FM 0x2c -#define BTTV_MATRIX_VISION2 0x2d -#define BTTV_ZOLTRIX_GENIE 0x2e -#define BTTV_TERRATVRADIO 0x2f -#define BTTV_DYNALINK 0x30 -#define BTTV_GVBCTV3PCI 0x31 -#define BTTV_PXELVWPLTVPAK 0x32 -#define BTTV_EAGLE 0x33 -#define BTTV_PINNACLEPRO 0x34 -#define BTTV_TVIEW_RDS_FM 0x35 -#define BTTV_LIFETEC_9415 0x36 -#define BTTV_BESTBUY_EASYTV 0x37 -#define BTTV_FLYVIDEO_98FM 0x38 -#define BTTV_GMV1 0x3d -#define BTTV_BESTBUY_EASYTV2 0x3e -#define BTTV_ATI_TVWONDER 0x3f -#define BTTV_ATI_TVWONDERVE 0x40 -#define BTTV_FLYVIDEO2000 0x41 -#define BTTV_TERRATVALUER 0x42 -#define BTTV_GVBCTV4PCI 0x43 -#define BTTV_VOODOOTV_FM 0x44 -#define BTTV_AIMMS 0x45 -#define BTTV_PV_BT878P_PLUS 0x46 -#define BTTV_FLYVIDEO98EZ 0x47 -#define BTTV_PV_BT878P_9B 0x48 -#define BTTV_SENSORAY311 0x49 -#define BTTV_RV605 0x4a -#define BTTV_WINDVR 0x4c -#define BTTV_GRANDTEC 0x4d -#define BTTV_KWORLD 0x4e -#define BTTV_HAUPPAUGEPVR 0x50 -#define BTTV_GVBCTV5PCI 0x51 -#define BTTV_OSPREY1x0 0x52 -#define BTTV_OSPREY1x0_848 0x53 -#define BTTV_OSPREY101_848 0x54 -#define BTTV_OSPREY1x1 0x55 -#define BTTV_OSPREY1x1_SVID 0x56 -#define BTTV_OSPREY2xx 0x57 -#define BTTV_OSPREY2x0_SVID 0x58 -#define BTTV_OSPREY2x0 0x59 -#define BTTV_OSPREY500 0x5a -#define BTTV_OSPREY540 0x5b -#define BTTV_OSPREY2000 0x5c -#define BTTV_IDS_EAGLE 0x5d -#define BTTV_PINNACLESAT 0x5e -#define BTTV_FORMAC_PROTV 0x5f -#define BTTV_EURESYS_PICOLO 0x61 -#define BTTV_PV150 0x62 -#define BTTV_AD_TVK503 0x63 -#define BTTV_IVC200 0x66 -#define BTTV_XGUARD 0x67 -#define BTTV_NEBULA_DIGITV 0x68 -#define BTTV_PV143 0x69 -#define BTTV_IVC100 0x6e -#define BTTV_IVC120 0x6f -#define BTTV_PC_HDTV 0x70 -#define BTTV_TWINHAN_DST 0x71 -#define BTTV_WINFASTVC100 0x72 -#define BTTV_SIMUS_GVC1100 0x74 -#define BTTV_NGSTV_PLUS 0x75 -#define BTTV_LMLBT4 0x76 -#define BTTV_PICOLO_TETRA_CHIP 0x79 -#define BTTV_AVDVBT_771 0x7b -#define BTTV_AVDVBT_761 0x7c -#define BTTV_MATRIX_VISIONSQ 0x7d -#define BTTV_MATRIX_VISIONSLC 0x7e -#define BTTV_APAC_VIEWCOMP 0x7f -#define BTTV_DVICO_DVBT_LITE 0x80 -#define BTTV_TIBET_CS16 0x83 -#define BTTV_KODICOM_4400R 0x84 +#define BTTV_BOARD_UNKNOWN 0x00 +#define BTTV_BOARD_MIRO 0x01 +#define BTTV_BOARD_HAUPPAUGE 0x02 +#define BTTV_BOARD_STB 0x03 +#define BTTV_BOARD_INTEL 0x04 +#define BTTV_BOARD_DIAMOND 0x05 +#define BTTV_BOARD_AVERMEDIA 0x06 +#define BTTV_BOARD_MATRIX_VISION 0x07 +#define BTTV_BOARD_FLYVIDEO 0x08 +#define BTTV_BOARD_TURBOTV 0x09 +#define BTTV_BOARD_HAUPPAUGE878 0x0a +#define BTTV_BOARD_MIROPRO 0x0b +#define BTTV_BOARD_ADSTECH_TV 0x0c +#define BTTV_BOARD_AVERMEDIA98 0x0d +#define BTTV_BOARD_VHX 0x0e +#define BTTV_BOARD_ZOLTRIX 0x0f +#define BTTV_BOARD_PIXVIEWPLAYTV 0x10 +#define BTTV_BOARD_WINVIEW_601 0x11 +#define BTTV_BOARD_AVEC_INTERCAP 0x12 +#define BTTV_BOARD_LIFE_FLYKIT 0x13 +#define BTTV_BOARD_CEI_RAFFLES 0x14 +#define BTTV_BOARD_CONFERENCETV 0x15 +#define BTTV_BOARD_PHOEBE_TVMAS 0x16 +#define BTTV_BOARD_MODTEC_205 0x17 +#define BTTV_BOARD_MAGICTVIEW061 0x18 +#define BTTV_BOARD_VOBIS_BOOSTAR 0x19 +#define BTTV_BOARD_HAUPPAUG_WCAM 0x1a +#define BTTV_BOARD_MAXI 0x1b +#define BTTV_BOARD_TERRATV 0x1c +#define BTTV_BOARD_PXC200 0x1d +#define BTTV_BOARD_FLYVIDEO_98 0x1e +#define BTTV_BOARD_IPROTV 0x1f +#define BTTV_BOARD_INTEL_C_S_PCI 0x20 +#define BTTV_BOARD_TERRATVALUE 0x21 +#define BTTV_BOARD_WINFAST2000 0x22 +#define BTTV_BOARD_CHRONOS_VS2 0x23 +#define BTTV_BOARD_TYPHOON_TVIEW 0x24 +#define BTTV_BOARD_PXELVWPLTVPRO 0x25 +#define BTTV_BOARD_MAGICTVIEW063 0x26 +#define BTTV_BOARD_PINNACLE 0x27 +#define BTTV_BOARD_STB2 0x28 +#define BTTV_BOARD_AVPHONE98 0x29 +#define BTTV_BOARD_PV951 0x2a +#define BTTV_BOARD_ONAIR_TV 0x2b +#define BTTV_BOARD_SIGMA_TVII_FM 0x2c +#define BTTV_BOARD_MATRIX_VISION2 0x2d +#define BTTV_BOARD_ZOLTRIX_GENIE 0x2e +#define BTTV_BOARD_TERRATVRADIO 0x2f +#define BTTV_BOARD_DYNALINK 0x30 +#define BTTV_BOARD_GVBCTV3PCI 0x31 +#define BTTV_BOARD_PXELVWPLTVPAK 0x32 +#define BTTV_BOARD_EAGLE 0x33 +#define BTTV_BOARD_PINNACLEPRO 0x34 +#define BTTV_BOARD_TVIEW_RDS_FM 0x35 +#define BTTV_BOARD_LIFETEC_9415 0x36 +#define BTTV_BOARD_BESTBUY_EASYTV 0x37 +#define BTTV_BOARD_FLYVIDEO_98FM 0x38 +#define BTTV_BOARD_GRANDTEC 0x39 +#define BTTV_BOARD_ASKEY_CPH060 0x3a +#define BTTV_BOARD_ASKEY_CPH03X 0x3b +#define BTTV_BOARD_MM100PCTV 0x3c +#define BTTV_BOARD_GMV1 0x3d +#define BTTV_BOARD_BESTBUY_EASYTV2 0x3e +#define BTTV_BOARD_ATI_TVWONDER 0x3f +#define BTTV_BOARD_ATI_TVWONDERVE 0x40 +#define BTTV_BOARD_FLYVIDEO2000 0x41 +#define BTTV_BOARD_TERRATVALUER 0x42 +#define BTTV_BOARD_GVBCTV4PCI 0x43 +#define BTTV_BOARD_VOODOOTV_FM 0x44 +#define BTTV_BOARD_AIMMS 0x45 +#define BTTV_BOARD_PV_BT878P_PLUS 0x46 +#define BTTV_BOARD_FLYVIDEO98EZ 0x47 +#define BTTV_BOARD_PV_BT878P_9B 0x48 +#define BTTV_BOARD_SENSORAY311 0x49 +#define BTTV_BOARD_RV605 0x4a +#define BTTV_BOARD_POWERCLR_MTV878 0x4b +#define BTTV_BOARD_WINDVR 0x4c +#define BTTV_BOARD_GRANDTEC_MULTI 0x4d +#define BTTV_BOARD_KWORLD 0x4e +#define BTTV_BOARD_DSP_TCVIDEO 0x4f +#define BTTV_BOARD_HAUPPAUGEPVR 0x50 +#define BTTV_BOARD_GVBCTV5PCI 0x51 +#define BTTV_BOARD_OSPREY1x0 0x52 +#define BTTV_BOARD_OSPREY1x0_848 0x53 +#define BTTV_BOARD_OSPREY101_848 0x54 +#define BTTV_BOARD_OSPREY1x1 0x55 +#define BTTV_BOARD_OSPREY1x1_SVID 0x56 +#define BTTV_BOARD_OSPREY2xx 0x57 +#define BTTV_BOARD_OSPREY2x0_SVID 0x58 +#define BTTV_BOARD_OSPREY2x0 0x59 +#define BTTV_BOARD_OSPREY500 0x5a +#define BTTV_BOARD_OSPREY540 0x5b +#define BTTV_BOARD_OSPREY2000 0x5c +#define BTTV_BOARD_IDS_EAGLE 0x5d +#define BTTV_BOARD_PINNACLESAT 0x5e +#define BTTV_BOARD_FORMAC_PROTV 0x5f +#define BTTV_BOARD_MACHTV 0x60 +#define BTTV_BOARD_EURESYS_PICOLO 0x61 +#define BTTV_BOARD_PV150 0x62 +#define BTTV_BOARD_AD_TVK503 0x63 +#define BTTV_BOARD_HERCULES_SM_TV 0x64 +#define BTTV_BOARD_PACETV 0x65 +#define BTTV_BOARD_IVC200 0x66 +#define BTTV_BOARD_XGUARD 0x67 +#define BTTV_BOARD_NEBULA_DIGITV 0x68 +#define BTTV_BOARD_PV143 0x69 +#define BTTV_BOARD_VD009X1_MINIDIN 0x6a +#define BTTV_BOARD_VD009X1_COMBI 0x6b +#define BTTV_BOARD_VD009_MINIDIN 0x6c +#define BTTV_BOARD_VD009_COMBI 0x6d +#define BTTV_BOARD_IVC100 0x6e +#define BTTV_BOARD_IVC120 0x6f +#define BTTV_BOARD_PC_HDTV 0x70 +#define BTTV_BOARD_TWINHAN_DST 0x71 +#define BTTV_BOARD_WINFASTVC100 0x72 +#define BTTV_BOARD_TEV560 0x73 +#define BTTV_BOARD_SIMUS_GVC1100 0x74 +#define BTTV_BOARD_NGSTV_PLUS 0x75 +#define BTTV_BOARD_LMLBT4 0x76 +#define BTTV_BOARD_TEKRAM_M205 0x77 +#define BTTV_BOARD_CONTVFMI 0x78 +#define BTTV_BOARD_PICOLO_TETRA_CHIP 0x79 +#define BTTV_BOARD_SPIRIT_TV 0x7a +#define BTTV_BOARD_AVDVBT_771 0x7b +#define BTTV_BOARD_AVDVBT_761 0x7c +#define BTTV_BOARD_MATRIX_VISIONSQ 0x7d +#define BTTV_BOARD_MATRIX_VISIONSLC 0x7e +#define BTTV_BOARD_APAC_VIEWCOMP 0x7f +#define BTTV_BOARD_DVICO_DVBT_LITE 0x80 +#define BTTV_BOARD_VGEAR_MYVCD 0x81 +#define BTTV_BOARD_SUPER_TV 0x82 +#define BTTV_BOARD_TIBET_CS16 0x83 +#define BTTV_BOARD_KODICOM_4400R 0x84 +#define BTTV_BOARD_KODICOM_4400R_SL 0x85 +#define BTTV_BOARD_ADLINK_RTV24 0x86 +#define BTTV_BOARD_DVICO_FUSIONHDTV_5_LITE 0x87 +#define BTTV_BOARD_ACORP_Y878F 0x88 +#define BTTV_BOARD_CONCEPTRONIC_CTVFMI2 0x89 +#define BTTV_BOARD_PV_BT878P_2E 0x8a +#define BTTV_BOARD_PV_M4900 0x8b +#define BTTV_BOARD_OSPREY440 0x8c +#define BTTV_BOARD_ASOUND_SKYEYE 0x8d +#define BTTV_BOARD_SABRENT_TVFM 0x8e +#define BTTV_BOARD_HAUPPAUGE_IMPACTVCB 0x8f +#define BTTV_BOARD_MACHTV_MAGICTV 0x90 /* i2c address list */ #define I2C_TSA5522 0xc2 @@ -175,25 +207,53 @@ struct bttv_core { struct list_head subs; /* struct bttv_sub_device */ /* device config */ - unsigned int nr; /* dev nr (for printk("bttv%d: ..."); */ + unsigned int nr; /* dev nr (for printk("bttv%d: ..."); */ unsigned int type; /* card type (pointer into tvcards[]) */ char name[8]; /* dev name */ }; struct bttv; + +struct bttv_ir { + struct input_dev *dev; + struct ir_input_state ir; + char name[32]; + char phys[32]; + + /* Usual gpio signalling */ + + u32 mask_keycode; + u32 mask_keydown; + u32 mask_keyup; + u32 polling; + u32 last_gpio; + struct work_struct work; + struct timer_list timer; + + /* RC5 gpio */ + u32 rc5_gpio; + struct timer_list timer_end; /* timer_end for code completion */ + struct timer_list timer_keyup; /* timer_end for key release */ + u32 last_rc5; /* last good rc5 code */ + u32 last_bit; /* last raw bit seen */ + u32 code; /* raw code under construction */ + struct timeval base_time; /* time of last seen code */ + int active; /* building raw code */ +}; + struct tvcard { - char *name; - unsigned int video_inputs; - unsigned int audio_inputs; - unsigned int tuner; - unsigned int svhs; + char *name; + unsigned int video_inputs; + unsigned int audio_inputs; + unsigned int tuner; + unsigned int svhs; unsigned int digital_mode; // DIGITAL_MODE_CAMERA or DIGITAL_MODE_VIDEO - u32 gpiomask; - u32 muxsel[16]; - u32 audiomux[6]; /* Tuner, Radio, external, internal, mute, stereo */ - u32 gpiomask2; /* GPIO MUX mask */ + u32 gpiomask; + u32 muxsel[16]; + u32 audiomux[6]; /* Tuner, Radio, external, internal, mute, stereo */ + u32 gpiomask2; /* GPIO MUX mask */ /* i2c audio flags */ unsigned int no_msp34xx:1; @@ -215,6 +275,9 @@ struct tvcard #define PLL_35 2 unsigned int tuner_type; + unsigned int tuner_addr; + unsigned int radio_addr; + unsigned int has_radio; void (*audio_hook)(struct bttv *btv, struct video_audio *v, int set); void (*muxsel_hook)(struct bttv *btv, unsigned int input); @@ -242,7 +305,7 @@ extern int bttv_handle_chipset(struct bttv *btv); interface below for new code */ /* returns card type + card ID (for bt878-based ones) - for possible values see lines below beginning with #define BTTV_UNKNOWN + for possible values see lines below beginning with #define BTTV_BOARD_UNKNOWN returns negative value if error occurred */ extern int bttv_get_cardinfo(unsigned int card, int *type, @@ -302,6 +365,8 @@ struct bttv_sub_device { struct bttv_sub_driver { struct device_driver drv; char wanted[BUS_ID_SIZE]; + int (*probe)(struct bttv_sub_device *sub); + void (*remove)(struct bttv_sub_device *sub); void (*gpio_irq)(struct bttv_sub_device *sub); }; #define to_bttv_sub_drv(x) container_of((x), struct bttv_sub_driver, drv) @@ -330,6 +395,10 @@ extern int bttv_I2CWrite(struct bttv *btv, unsigned char addr, unsigned char b1, unsigned char b2, int both); extern void bttv_readee(struct bttv *btv, unsigned char *eedata, int addr); +extern int bttv_input_init(struct bttv *dev); +extern void bttv_input_fini(struct bttv *dev); +extern void bttv_input_irq(struct bttv *dev); + #endif /* _BTTV_H_ */ /* * Local variables: diff --git a/drivers/media/video/bttvp.h b/drivers/media/video/bttvp.h index 1a9ba7e1c..9cb72f176 100644 --- a/drivers/media/video/bttvp.h +++ b/drivers/media/video/bttvp.h @@ -1,5 +1,4 @@ /* - $Id: bttvp.h,v 1.17 2005/02/16 12:14:10 kraxel Exp $ bttv - Bt848 frame grabber driver @@ -27,7 +26,7 @@ #define _BTTVP_H_ #include -#define BTTV_VERSION_CODE KERNEL_VERSION(0,9,15) +#define BTTV_VERSION_CODE KERNEL_VERSION(0,9,16) #include #include @@ -36,6 +35,7 @@ #include #include #include +#include #include #include @@ -46,6 +46,7 @@ #include #include + #include "bt848.h" #include "bttv.h" #include "btcx-risc.h" @@ -73,21 +74,26 @@ #define UNSET (-1U) +#define clamp(x, low, high) min (max (low, x), high) + /* ---------------------------------------------------------- */ struct bttv_tvnorm { int v4l2_id; char *name; - u32 Fsc; - u16 swidth, sheight; /* scaled standard width, height */ + u32 Fsc; + u16 swidth, sheight; /* scaled standard width, height */ u16 totalwidth; u8 adelay, bdelay, iform; u32 scaledtwidth; u16 hdelayx1, hactivex1; u16 vdelay; - u8 vbipack; + u8 vbipack; u16 vtotal; int sram; + /* ITU-R frame line number of the first VBI line we can + capture, of the first and second field. */ + u16 vbistart[2]; }; extern const struct bttv_tvnorm bttv_tvnorms[]; @@ -222,14 +228,10 @@ extern void bttv_gpio_tracking(struct bttv *btv, char *comment); extern int init_bttv_i2c(struct bttv *btv); extern int fini_bttv_i2c(struct bttv *btv); -#define vprintk if (bttv_verbose) printk +#define bttv_printk if (bttv_verbose) printk #define dprintk if (bttv_debug >= 1) printk #define d2printk if (bttv_debug >= 2) printk -/* our devices */ -#define BTTV_MAX 16 -extern unsigned int bttv_num; - #define BTTV_MAX_FBUF 0x208000 #define VBIBUF_SIZE (2048*VBI_MAXLINES*2) #define BTTV_TIMEOUT (HZ/2) /* 0.5 seconds */ @@ -245,7 +247,7 @@ struct bttv_pll_info { /* for gpio-connected remote control */ struct bttv_input { - struct input_dev dev; + struct input_dev *dev; struct ir_input_state ir; char name[32]; char phys[32]; @@ -272,12 +274,14 @@ struct bttv { /* card configuration info */ unsigned int cardid; /* pci subsystem id (bt878 based ones) */ - unsigned int tuner_type; /* tuner chip type */ - unsigned int pinnacle_id; + unsigned int tuner_type; /* tuner chip type */ + unsigned int tda9887_conf; unsigned int svhs; struct bttv_pll_info pll; int triton1; int gpioirq; + int (*custom_irq)(struct bttv *btv); + int use_i2c_hw; /* old gpio interface */ @@ -302,13 +306,13 @@ struct bttv { /* infrared remote */ int has_remote; - struct bttv_input *remote; + struct bttv_ir *remote; /* locking */ spinlock_t s_lock; - struct semaphore lock; + struct mutex lock; int resources; - struct semaphore reslock; + struct mutex reslock; #ifdef VIDIOC_G_PRIORITY struct v4l2_prio_state prio; #endif @@ -330,6 +334,9 @@ struct bttv { int opt_vcr_hack; int opt_whitecrush_upper; int opt_whitecrush_lower; + int opt_uv_ratio; + int opt_full_luma_range; + int opt_coring; /* radio data/state */ int has_radio; @@ -375,6 +382,10 @@ struct bttv { unsigned int users; struct bttv_fh init; }; + +/* our devices */ +#define BTTV_MAX 16 +extern unsigned int bttv_num; extern struct bttv bttvs[BTTV_MAX]; /* private ioctls */ diff --git a/drivers/media/video/bw-qcam.c b/drivers/media/video/bw-qcam.c index 7d0b6e59c..6bad93ef9 100644 --- a/drivers/media/video/bw-qcam.c +++ b/drivers/media/video/bw-qcam.c @@ -73,8 +73,7 @@ OTHER DEALINGS IN THE SOFTWARE. #include #include #include -#include -#include +#include #include #include "bw-qcam.h" @@ -151,7 +150,7 @@ static int qc_calibrate(struct qcam_device *q) static struct qcam_device *qcam_init(struct parport *port) { struct qcam_device *q; - + q = kmalloc(sizeof(struct qcam_device), GFP_KERNEL); if(q==NULL) return NULL; @@ -159,17 +158,17 @@ static struct qcam_device *qcam_init(struct parport *port) q->pport = port; q->pdev = parport_register_device(port, "bw-qcam", NULL, NULL, NULL, 0, NULL); - if (q->pdev == NULL) + if (q->pdev == NULL) { printk(KERN_ERR "bw-qcam: couldn't register for %s.\n", port->name); kfree(q); return NULL; } - + memcpy(&q->vdev, &qcam_template, sizeof(qcam_template)); - - mutex_init(&q->lock); + + init_MUTEX(&q->lock); q->port_mode = (QC_ANY | QC_NOTSET); q->width = 320; @@ -237,12 +236,12 @@ static int qc_waithand(struct qcam_device *q, int val) while (!((status = read_lpstatus(q)) & 8)) { /* 1000 is enough spins on the I/O for all normal - cases, at that point we start to poll slowly + cases, at that point we start to poll slowly until the camera wakes up. However, we are busy blocked until the camera responds, so setting it lower is much better for interactive response. */ - + if(runs++>maxpoll) { msleep_interruptible(5); @@ -256,12 +255,12 @@ static int qc_waithand(struct qcam_device *q, int val) while (((status = read_lpstatus(q)) & 8)) { /* 1000 is enough spins on the I/O for all normal - cases, at that point we start to poll slowly + cases, at that point we start to poll slowly until the camera wakes up. However, we are busy blocked until the camera responds, so setting it lower is much better for interactive response. */ - + if(runs++>maxpoll) { msleep_interruptible(5); @@ -283,17 +282,17 @@ static unsigned int qc_waithand2(struct qcam_device *q, int val) { unsigned int status; int runs=0; - - do + + do { status = read_lpdata(q); /* 1000 is enough spins on the I/O for all normal - cases, at that point we start to poll slowly + cases, at that point we start to poll slowly until the camera wakes up. However, we are busy blocked until the camera responds, so setting it lower is much better for interactive response. */ - + if(runs++>maxpoll) { msleep_interruptible(5); @@ -322,7 +321,7 @@ static int qc_detect(struct qcam_device *q) lastreg = reg = read_lpstatus(q) & 0xf0; - for (i = 0; i < 500; i++) + for (i = 0; i < 500; i++) { reg = read_lpstatus(q) & 0xf0; if (reg != lastreg) @@ -358,7 +357,7 @@ static int qc_detect(struct qcam_device *q) static void qc_reset(struct qcam_device *q) { - switch (q->port_mode & QC_FORCE_MASK) + switch (q->port_mode & QC_FORCE_MASK) { case QC_FORCE_UNIDIR: q->port_mode = (q->port_mode & ~QC_MODE_MASK) | QC_UNIDIR; @@ -371,7 +370,7 @@ static void qc_reset(struct qcam_device *q) case QC_ANY: write_lpcontrol(q, 0x20); write_lpdata(q, 0x75); - + if (read_lpdata(q) != 0x75) { q->port_mode = (q->port_mode & ~QC_MODE_MASK) | QC_BIDIR; } else { @@ -399,8 +398,8 @@ static void qc_reset(struct qcam_device *q) static int qc_setscanmode(struct qcam_device *q) { int old_mode = q->mode; - - switch (q->transfer_scale) + + switch (q->transfer_scale) { case 1: q->mode = 0; @@ -413,7 +412,7 @@ static int qc_setscanmode(struct qcam_device *q) break; } - switch (q->bpp) + switch (q->bpp) { case 4: break; @@ -422,7 +421,7 @@ static int qc_setscanmode(struct qcam_device *q) break; } - switch (q->port_mode & QC_MODE_MASK) + switch (q->port_mode & QC_MODE_MASK) { case QC_BIDIR: q->mode += 1; @@ -431,10 +430,10 @@ static int qc_setscanmode(struct qcam_device *q) case QC_UNIDIR: break; } - + if (q->mode != old_mode) q->status |= QC_PARAM_CHANGE; - + return 0; } @@ -452,7 +451,7 @@ static void qc_set(struct qcam_device *q) /* Set the brightness. Yes, this is repetitive, but it works. * Shorter versions seem to fail subtly. Feel free to try :-). */ /* I think the problem was in qc_command, not here -- bls */ - + qc_command(q, 0xb); qc_command(q, q->brightness); @@ -503,13 +502,13 @@ static inline int qc_readbytes(struct qcam_device *q, char buffer[]) unsigned int hi2, lo2; static int state = 0; - if (buffer == NULL) + if (buffer == NULL) { state = 0; return 0; } - - switch (q->port_mode & QC_MODE_MASK) + + switch (q->port_mode & QC_MODE_MASK) { case QC_BIDIR: /* Bi-directional Port */ write_lpcontrol(q, 0x26); @@ -518,7 +517,7 @@ static inline int qc_readbytes(struct qcam_device *q, char buffer[]) write_lpcontrol(q, 0x2e); lo2 = (qc_waithand2(q, 0) >> 1); hi2 = (read_lpstatus(q) >> 3) & 0x1f; - switch (q->bpp) + switch (q->bpp) { case 4: buffer[0] = lo & 0xf; @@ -545,7 +544,7 @@ static inline int qc_readbytes(struct qcam_device *q, char buffer[]) write_lpcontrol(q, 0xe); hi = (qc_waithand(q, 0) & 0xf0) >> 4; - switch (q->bpp) + switch (q->bpp) { case 4: buffer[0] = lo; @@ -553,7 +552,7 @@ static inline int qc_readbytes(struct qcam_device *q, char buffer[]) ret = 2; break; case 6: - switch (state) + switch (state) { case 0: buffer[0] = (lo << 2) | ((hi & 0xc) >> 2); @@ -605,13 +604,13 @@ static long qc_capture(struct qcam_device * q, char __user *buf, unsigned long l int shift=8-q->bpp; char invert; - if (q->mode == -1) + if (q->mode == -1) return -ENXIO; qc_command(q, 0x7); qc_command(q, q->mode); - if ((q->port_mode & QC_MODE_MASK) == QC_BIDIR) + if ((q->port_mode & QC_MODE_MASK) == QC_BIDIR) { write_lpcontrol(q, 0x2e); /* turn port around */ write_lpcontrol(q, 0x26); @@ -619,7 +618,7 @@ static long qc_capture(struct qcam_device * q, char __user *buf, unsigned long l write_lpcontrol(q, 0x2e); (void) qc_waithand(q, 0); } - + /* strange -- should be 15:63 below, but 4bpp is odd */ invert = (q->bpp == 4) ? 16 : 63; @@ -630,15 +629,15 @@ static long qc_capture(struct qcam_device * q, char __user *buf, unsigned long l q->transfer_scale; transperline = (transperline + divisor - 1) / divisor; - for (i = 0, yield = yieldlines; i < linestotrans; i++) + for (i = 0, yield = yieldlines; i < linestotrans; i++) { - for (pixels_read = j = 0; j < transperline; j++) + for (pixels_read = j = 0; j < transperline; j++) { bytes = qc_readbytes(q, buffer); - for (k = 0; k < bytes && (pixels_read + k) < pixels_per_line; k++) + for (k = 0; k < bytes && (pixels_read + k) < pixels_per_line; k++) { int o; - if (buffer[k] == 0 && invert == 16) + if (buffer[k] == 0 && invert == 16) { /* 4bpp is odd (again) -- inverter is 16, not 15, but output must be 0-15 -- bls */ @@ -654,7 +653,7 @@ static long qc_capture(struct qcam_device * q, char __user *buf, unsigned long l pixels_read += bytes; } (void) qc_readbytes(q, NULL); /* reset state machine */ - + /* Grabbing an entire frame from the quickcam is a lengthy process. We don't (usually) want to busy-block the processor for the entire frame. yieldlines is a module @@ -667,7 +666,7 @@ static long qc_capture(struct qcam_device * q, char __user *buf, unsigned long l } } - if ((q->port_mode & QC_MODE_MASK) == QC_BIDIR) + if ((q->port_mode & QC_MODE_MASK) == QC_BIDIR) { write_lpcontrol(q, 2); write_lpcontrol(q, 6); @@ -688,7 +687,7 @@ static int qcam_do_ioctl(struct inode *inode, struct file *file, { struct video_device *dev = video_devdata(file); struct qcam_device *qcam=(struct qcam_device *)dev; - + switch(cmd) { case VIDIOCGCAP: @@ -760,10 +759,10 @@ static int qcam_do_ioctl(struct inode *inode, struct file *file, { struct video_picture *p = arg; if(p->palette!=VIDEO_PALETTE_GREY) - return -EINVAL; + return -EINVAL; if(p->depth!=4 && p->depth!=6) return -EINVAL; - + /* * Now load the camera. */ @@ -773,9 +772,9 @@ static int qcam_do_ioctl(struct inode *inode, struct file *file, qcam->whitebal = p->whiteness>>8; qcam->bpp = p->depth; - mutex_lock(&qcam->lock); + down(&qcam->lock); qc_setscanmode(qcam); - mutex_unlock(&qcam->lock); + up(&qcam->lock); qcam->status |= QC_PARAM_CHANGE; return 0; @@ -791,11 +790,11 @@ static int qcam_do_ioctl(struct inode *inode, struct file *file, return -EINVAL; if(vw->width<80||vw->width>320) return -EINVAL; - + qcam->width = 320; qcam->height = 240; qcam->transfer_scale = 4; - + if(vw->width>=160 && vw->height>=120) { qcam->transfer_scale = 2; @@ -806,14 +805,14 @@ static int qcam_do_ioctl(struct inode *inode, struct file *file, qcam->height = 240; qcam->transfer_scale = 1; } - mutex_lock(&qcam->lock); + down(&qcam->lock); qc_setscanmode(qcam); - mutex_unlock(&qcam->lock); - + up(&qcam->lock); + /* We must update the camera before we grab. We could just have changed the grab size */ qcam->status |= QC_PARAM_CHANGE; - + /* Ok we figured out what to use from our wide choice */ return 0; } @@ -854,9 +853,9 @@ static ssize_t qcam_read(struct file *file, char __user *buf, struct qcam_device *qcam=(struct qcam_device *)v; int len; parport_claim_or_block(qcam->pdev); - - mutex_lock(&qcam->lock); - + + down(&qcam->lock); + qc_reset(qcam); /* Update the camera parameters if we need to */ @@ -864,13 +863,13 @@ static ssize_t qcam_read(struct file *file, char __user *buf, qc_set(qcam); len=qc_capture(qcam, buf,count); - - mutex_unlock(&qcam->lock); - + + up(&qcam->lock); + parport_release(qcam->pdev); return len; } - + static struct file_operations qcam_fops = { .owner = THIS_MODULE, .open = video_exclusive_open, @@ -906,11 +905,11 @@ static int init_bwqcam(struct parport *port) qcam=qcam_init(port); if(qcam==NULL) return -ENODEV; - + parport_claim_or_block(qcam->pdev); qc_reset(qcam); - + if(qc_detect(qcam)==0) { parport_release(qcam->pdev); @@ -921,9 +920,9 @@ static int init_bwqcam(struct parport *port) qc_calibrate(qcam); parport_release(qcam->pdev); - + printk(KERN_INFO "Connectix Quickcam on %s\n", qcam->pport->name); - + if(video_register_device(&qcam->vdev, VFL_TYPE_GRABBER, video_nr)==-1) { parport_unregister_device(qcam->pdev); @@ -1014,7 +1013,7 @@ static int __init init_bw_qcams(void) printk("Connectix Quickcam max-poll was above 5000. Using 5000.\n"); maxpoll = 5000; } - + if (yieldlines < 1) { printk("Connectix Quickcam yieldlines was less than 1. Using 1.\n"); yieldlines = 1; diff --git a/drivers/media/video/bw-qcam.h b/drivers/media/video/bw-qcam.h index 6701dafbc..723e8ad9e 100644 --- a/drivers/media/video/bw-qcam.h +++ b/drivers/media/video/bw-qcam.h @@ -55,7 +55,7 @@ struct qcam_device { struct video_device vdev; struct pardevice *pdev; struct parport *pport; - struct mutex lock; + struct semaphore lock; int width, height; int bpp; int mode; diff --git a/drivers/media/video/c-qcam.c b/drivers/media/video/c-qcam.c index a3989bd2f..9976db4f6 100644 --- a/drivers/media/video/c-qcam.c +++ b/drivers/media/video/c-qcam.c @@ -16,7 +16,7 @@ * * The parport parameter controls which parports will be scanned. * Scanning all parports causes some printers to print a garbage page. - * -- March 14, 1999 Billy Donahue + * -- March 14, 1999 Billy Donahue * * Fixed data format to BGR, added force_rgb parameter. Added missing * parport_unregister_driver() on module removal. @@ -34,9 +34,7 @@ #include #include #include -#include -#include - +#include #include struct qcam_device { @@ -49,7 +47,7 @@ struct qcam_device { int contrast, brightness, whitebal; int top, left; unsigned int bidirectional; - struct mutex lock; + struct semaphore lock; }; /* cameras maximum */ @@ -89,7 +87,7 @@ static inline unsigned int qcam_ready2(struct qcam_device *qcam) return (parport_read_data(qcam->pport) & 0x1)?1:0; } -static unsigned int qcam_await_ready1(struct qcam_device *qcam, +static unsigned int qcam_await_ready1(struct qcam_device *qcam, int value) { unsigned long oldjiffies = jiffies; @@ -99,7 +97,7 @@ static unsigned int qcam_await_ready1(struct qcam_device *qcam, if (qcam_ready1(qcam) == value) return 0; - /* If the camera didn't respond within 1/25 second, poll slowly + /* If the camera didn't respond within 1/25 second, poll slowly for a while. */ for (i = 0; i < 50; i++) { @@ -124,7 +122,7 @@ static unsigned int qcam_await_ready2(struct qcam_device *qcam, int value) if (qcam_ready2(qcam) == value) return 0; - /* If the camera didn't respond within 1/25 second, poll slowly + /* If the camera didn't respond within 1/25 second, poll slowly for a while. */ for (i = 0; i < 50; i++) { @@ -158,12 +156,12 @@ static int qcam_write_data(struct qcam_device *qcam, unsigned int data) unsigned int idata; parport_write_data(qcam->pport, data); idata = qcam_read_data(qcam); - if (data != idata) + if (data != idata) { - printk(KERN_WARNING "cqcam: sent %x but received %x\n", data, + printk(KERN_WARNING "cqcam: sent %x but received %x\n", data, idata); return 1; - } + } return 0; } @@ -194,12 +192,12 @@ static int qc_detect(struct qcam_device *qcam) no device was found". Fix this one day. */ if (qcam->pport->probe_info[0].class == PARPORT_CLASS_MEDIA && qcam->pport->probe_info[0].model - && !strcmp(qcam->pdev->port->probe_info[0].model, + && !strcmp(qcam->pdev->port->probe_info[0].model, "Color QuickCam 2.0")) { printk(KERN_DEBUG "QuickCam: Found by IEEE1284 probe.\n"); return 1; } - + if (probe < 2) return 0; @@ -207,11 +205,11 @@ static int qc_detect(struct qcam_device *qcam) /* look for a heartbeat */ ostat = stat = parport_read_status(qcam->pport); - for (i=0; i<250; i++) + for (i=0; i<250; i++) { mdelay(1); stat = parport_read_status(qcam->pport); - if (ostat != stat) + if (ostat != stat) { if (++count >= 3) return 1; ostat = stat; @@ -227,11 +225,11 @@ static int qc_detect(struct qcam_device *qcam) count = 0; ostat = stat = parport_read_status(qcam->pport); - for (i=0; i<250; i++) + for (i=0; i<250; i++) { mdelay(1); stat = parport_read_status(qcam->pport); - if (ostat != stat) + if (ostat != stat) { if (++count >= 3) return 1; ostat = stat; @@ -248,7 +246,7 @@ static void qc_reset(struct qcam_device *qcam) parport_write_control(qcam->pport, 0x8); mdelay(1); parport_write_control(qcam->pport, 0xc); - mdelay(1); + mdelay(1); } /* Reset the QuickCam and program for brightness, contrast, @@ -259,7 +257,7 @@ static void qc_setup(struct qcam_device *q) qc_reset(q); /* Set the brightness. */ - qcam_set(q, 11, q->brightness); + qcam_set(q, 11, q->brightness); /* Set the height and width. These refer to the actual CCD area *before* applying the selected decimation. */ @@ -273,12 +271,12 @@ static void qc_setup(struct qcam_device *q) /* Set contrast and white balance. */ qcam_set(q, 0x19, q->contrast); qcam_set(q, 0x1f, q->whitebal); - + /* Set the speed. */ qcam_set(q, 45, 2); } -/* Read some bytes from the camera and put them in the buffer. +/* Read some bytes from the camera and put them in the buffer. nbytes should be a multiple of 3, because bidirectional mode gives us three bytes at a time. */ @@ -384,7 +382,7 @@ static long qc_capture(struct qcam_device *q, char __user *buf, unsigned long le if (qcam_set(q, 7, (q->mode | (is_bi_dir?1:0)) + 1)) return -EIO; - + lines = q->height; pixelsperline = q->width; bitsperxfer = (is_bi_dir) ? 24 : 8; @@ -500,7 +498,7 @@ static int qcam_do_ioctl(struct inode *inode, struct file *file, { struct video_device *dev = video_devdata(file); struct qcam_device *qcam=(struct qcam_device *)dev; - + switch(cmd) { case VIDIOCGCAP: @@ -575,7 +573,7 @@ static int qcam_do_ioctl(struct inode *inode, struct file *file, */ if (p->depth != 24 || p->palette != VIDEO_PALETTE_RGB24) return -EINVAL; - + /* * Now load the camera. */ @@ -583,11 +581,11 @@ static int qcam_do_ioctl(struct inode *inode, struct file *file, qcam->contrast = p->contrast>>8; qcam->whitebal = p->whiteness>>8; - mutex_lock(&qcam->lock); + down(&qcam->lock); parport_claim_or_block(qcam->pdev); - qc_setup(qcam); + qc_setup(qcam); parport_release(qcam->pdev); - mutex_unlock(&qcam->lock); + up(&qcam->lock); return 0; } case VIDIOCSWIN: @@ -602,11 +600,11 @@ static int qcam_do_ioctl(struct inode *inode, struct file *file, return -EINVAL; if(vw->width<80||vw->width>320) return -EINVAL; - + qcam->width = 80; qcam->height = 60; qcam->mode = QC_DECIMATION_4; - + if(vw->width>=160 && vw->height>=120) { qcam->width = 160; @@ -628,13 +626,13 @@ static int qcam_do_ioctl(struct inode *inode, struct file *file, qcam->mode = QC_BILLIONS | QC_DECIMATION_1; } #endif - /* Ok we figured out what to use from our + /* Ok we figured out what to use from our wide choice */ - mutex_lock(&qcam->lock); + down(&qcam->lock); parport_claim_or_block(qcam->pdev); qc_setup(qcam); parport_release(qcam->pdev); - mutex_unlock(&qcam->lock); + up(&qcam->lock); return 0; } case VIDIOCGWIN: @@ -674,12 +672,12 @@ static ssize_t qcam_read(struct file *file, char __user *buf, struct qcam_device *qcam=(struct qcam_device *)v; int len; - mutex_lock(&qcam->lock); + down(&qcam->lock); parport_claim_or_block(qcam->pdev); /* Probably should have a semaphore against multiple users */ - len = qc_capture(qcam, buf,count); + len = qc_capture(qcam, buf,count); parport_release(qcam->pdev); - mutex_unlock(&qcam->lock); + up(&qcam->lock); return len; } @@ -708,7 +706,7 @@ static struct video_device qcam_template= static struct qcam_device *qcam_init(struct parport *port) { struct qcam_device *q; - + q = kmalloc(sizeof(struct qcam_device), GFP_KERNEL); if(q==NULL) return NULL; @@ -719,17 +717,17 @@ static struct qcam_device *qcam_init(struct parport *port) q->bidirectional = (q->pport->modes & PARPORT_MODE_TRISTATE)?1:0; - if (q->pdev == NULL) + if (q->pdev == NULL) { printk(KERN_ERR "c-qcam: couldn't register for %s.\n", port->name); kfree(q); return NULL; } - + memcpy(&q->vdev, &qcam_template, sizeof(qcam_template)); - mutex_init(&q->lock); + init_MUTEX(&q->lock); q->width = q->ccd_width = 320; q->height = q->ccd_height = 240; q->mode = QC_MILLIONS | QC_DECIMATION_1; @@ -767,11 +765,11 @@ static int init_cqcam(struct parport *port) qcam = qcam_init(port); if (qcam==NULL) return -ENODEV; - + parport_claim_or_block(qcam->pdev); qc_reset(qcam); - + if (probe && qc_detect(qcam)==0) { parport_release(qcam->pdev); @@ -783,7 +781,7 @@ static int init_cqcam(struct parport *port) qc_setup(qcam); parport_release(qcam->pdev); - + if (video_register_device(&qcam->vdev, VFL_TYPE_GRABBER, video_nr)==-1) { printk(KERN_ERR "Unable to register Colour QuickCam on %s\n", @@ -793,9 +791,9 @@ static int init_cqcam(struct parport *port) return -ENODEV; } - printk(KERN_INFO "video%d: Colour QuickCam found on %s\n", + printk(KERN_INFO "video%d: Colour QuickCam found on %s\n", qcam->vdev.minor, qcam->pport->name); - + qcams[num_cams++] = qcam; return 0; diff --git a/drivers/media/video/compat_ioctl32.c b/drivers/media/video/compat_ioctl32.c index b69ee1194..840fe0177 100644 --- a/drivers/media/video/compat_ioctl32.c +++ b/drivers/media/video/compat_ioctl32.c @@ -12,6 +12,7 @@ * ioctls. */ +#include #include #include #include @@ -21,7 +22,7 @@ #ifdef CONFIG_COMPAT -#ifdef CONFIG_VIDEO_V4L1_COMPAT + struct video_tuner32 { compat_int_t tuner; char name[32]; @@ -107,7 +108,6 @@ struct video_window32 { compat_caddr_t clips; compat_int_t clipcount; }; -#endif static int native_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { @@ -125,7 +125,6 @@ static int native_ioctl(struct file *file, unsigned int cmd, unsigned long arg) } -#ifdef CONFIG_VIDEO_V4L1_COMPAT /* You get back everything except the clips... */ static int put_video_window32(struct video_window *kp, struct video_window32 __user *up) { @@ -140,7 +139,6 @@ static int put_video_window32(struct video_window *kp, struct video_window32 __u return -EFAULT; return 0; } -#endif struct v4l2_clip32 { @@ -493,24 +491,6 @@ static inline int put_v4l2_input(struct v4l2_input *kp, struct v4l2_input __user return 0; } -#ifdef CONFIG_VIDEO_V4L1_COMPAT -struct video_code32 -{ - char loadwhat[16]; /* name or tag of file being passed */ - compat_int_t datasize; - unsigned char *data; -}; - -static inline int microcode32(struct video_code *kp, struct video_code32 __user *up) -{ - if(!access_ok(VERIFY_READ, up, sizeof(struct video_code32)) || - copy_from_user(kp->loadwhat, up->loadwhat, sizeof (up->loadwhat)) || - get_user(kp->datasize, &up->datasize) || - copy_from_user(kp->data, up->data, up->datasize)) - return -EFAULT; - return 0; -} - #define VIDIOCGTUNER32 _IOWR('v',4, struct video_tuner32) #define VIDIOCSTUNER32 _IOW('v',5, struct video_tuner32) #define VIDIOCGWIN32 _IOR('v',9, struct video_window32) @@ -519,9 +499,6 @@ static inline int microcode32(struct video_code *kp, struct video_code32 __user #define VIDIOCSFBUF32 _IOW('v',12, struct video_buffer32) #define VIDIOCGFREQ32 _IOR('v',14, u32) #define VIDIOCSFREQ32 _IOW('v',15, u32) -#define VIDIOCSMICROCODE32 _IOW('v',27, struct video_code32) - -#endif /* VIDIOC_ENUMINPUT32 is VIDIOC_ENUMINPUT minus 4 bytes of padding alignement */ #define VIDIOC_ENUMINPUT32 VIDIOC_ENUMINPUT - _IOC(0, 0, 0, 4) @@ -543,7 +520,6 @@ static inline int microcode32(struct video_code *kp, struct video_code32 __user #define VIDIOC_S_INPUT32 _IOWR ('V', 39, compat_int_t) #define VIDIOC_TRY_FMT32 _IOWR ('V', 64, struct v4l2_format32) -#ifdef CONFIG_VIDEO_V4L1_COMPAT enum { MaxClips = (~0U-sizeof(struct video_window))/sizeof(struct video_clip) }; @@ -608,17 +584,13 @@ static int do_set_window(struct file *file, unsigned int cmd, unsigned long arg) return native_ioctl(file, VIDIOCSWIN, (unsigned long)vw); } -#endif static int do_video_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { union { -#ifdef CONFIG_VIDEO_V4L1_COMPAT struct video_tuner vt; struct video_buffer vb; struct video_window vw; - struct video_code vc; -#endif struct v4l2_format v2f; struct v4l2_buffer v2b; struct v4l2_framebuffer v2fb; @@ -634,7 +606,6 @@ static int do_video_ioctl(struct file *file, unsigned int cmd, unsigned long arg /* First, convert the command. */ switch(cmd) { -#ifdef CONFIG_VIDEO_V4L1_COMPAT case VIDIOCGTUNER32: cmd = VIDIOCGTUNER; break; case VIDIOCSTUNER32: cmd = VIDIOCSTUNER; break; case VIDIOCGWIN32: cmd = VIDIOCGWIN; break; @@ -642,8 +613,6 @@ static int do_video_ioctl(struct file *file, unsigned int cmd, unsigned long arg case VIDIOCSFBUF32: cmd = VIDIOCSFBUF; break; case VIDIOCGFREQ32: cmd = VIDIOCGFREQ; break; case VIDIOCSFREQ32: cmd = VIDIOCSFREQ; break; - case VIDIOCSMICROCODE32: cmd = VIDIOCSMICROCODE; break; -#endif case VIDIOC_G_FMT32: cmd = VIDIOC_G_FMT; break; case VIDIOC_S_FMT32: cmd = VIDIOC_S_FMT; break; case VIDIOC_QUERYBUF32: cmd = VIDIOC_QUERYBUF; break; @@ -663,7 +632,6 @@ static int do_video_ioctl(struct file *file, unsigned int cmd, unsigned long arg }; switch(cmd) { -#ifdef CONFIG_VIDEO_V4L1_COMPAT case VIDIOCSTUNER: case VIDIOCGTUNER: err = get_video_tuner32(&karg.vt, up); @@ -677,7 +645,6 @@ static int do_video_ioctl(struct file *file, unsigned int cmd, unsigned long arg break; case VIDIOCSFREQ: -#endif case VIDIOC_S_INPUT: case VIDIOC_OVERLAY: case VIDIOC_STREAMON: @@ -731,21 +698,14 @@ static int do_video_ioctl(struct file *file, unsigned int cmd, unsigned long arg compatible_arg = 0; break; -#ifdef CONFIG_VIDEO_V4L1_COMPAT case VIDIOCGWIN: case VIDIOCGFBUF: case VIDIOCGFREQ: -#endif case VIDIOC_G_FBUF: case VIDIOC_G_INPUT: compatible_arg = 0; -#ifdef CONFIG_VIDEO_V4L1_COMPAT - case VIDIOCSMICROCODE: - err = microcode32(&karg.vc, up); - compatible_arg = 0; - break; -#endif }; + if(err) goto out; @@ -760,7 +720,6 @@ static int do_video_ioctl(struct file *file, unsigned int cmd, unsigned long arg } if(err == 0) { switch(cmd) { -#ifdef CONFIG_VIDEO_V4L1_COMPAT case VIDIOCGTUNER: err = put_video_tuner32(&karg.vt, up); break; @@ -772,7 +731,7 @@ static int do_video_ioctl(struct file *file, unsigned int cmd, unsigned long arg case VIDIOCGFBUF: err = put_video_buffer32(&karg.vb, up); break; -#endif + case VIDIOC_G_FBUF: err = put_v4l2_framebuffer32(&karg.v2fb, up); break; @@ -810,9 +769,7 @@ static int do_video_ioctl(struct file *file, unsigned int cmd, unsigned long arg err = put_v4l2_input32(&karg.v2i, up); break; -#ifdef CONFIG_VIDEO_V4L1_COMPAT case VIDIOCGFREQ: -#endif case VIDIOC_G_INPUT: err = put_user(((u32)karg.vx), (u32 __user *)up); break; @@ -830,7 +787,6 @@ long v4l_compat_ioctl32(struct file *file, unsigned int cmd, unsigned long arg) return ret; switch (cmd) { -#ifdef CONFIG_VIDEO_V4L1_COMPAT case VIDIOCSWIN32: ret = do_set_window(file, cmd, arg); break; @@ -841,7 +797,6 @@ long v4l_compat_ioctl32(struct file *file, unsigned int cmd, unsigned long arg) case VIDIOCSFBUF32: case VIDIOCGFREQ32: case VIDIOCSFREQ32: -#endif case VIDIOC_QUERYCAP: case VIDIOC_ENUM_FMT: case VIDIOC_G_FMT32: @@ -873,7 +828,6 @@ long v4l_compat_ioctl32(struct file *file, unsigned int cmd, unsigned long arg) ret = do_video_ioctl(file, cmd, arg); break; -#ifdef CONFIG_VIDEO_V4L1_COMPAT /* Little v, the video4linux ioctls (conflict?) */ case VIDIOCGCAP: case VIDIOCGCHAN: @@ -902,7 +856,6 @@ long v4l_compat_ioctl32(struct file *file, unsigned int cmd, unsigned long arg) case _IOR('v' , BASE_VIDIOCPRIVATE+7, int): ret = native_ioctl(file, cmd, (unsigned long)compat_ptr(arg)); break; -#endif default: v4l_print_ioctl("compat_ioctl32", cmd); } diff --git a/drivers/media/video/cpia.c b/drivers/media/video/cpia.c index 3b31a0dd2..85d964b5b 100644 --- a/drivers/media/video/cpia.c +++ b/drivers/media/video/cpia.c @@ -24,8 +24,9 @@ */ /* define _CPIA_DEBUG_ for verbose debug output (see cpia.h) */ -/* #define _CPIA_DEBUG_ 1 */ +/* #define _CPIA_DEBUG_ 1 */ +#include #include #include @@ -38,7 +39,7 @@ #include #include #include -#include +#include #ifdef CONFIG_KMOD #include @@ -46,23 +47,31 @@ #include "cpia.h" +#ifdef CONFIG_VIDEO_CPIA_PP +extern int cpia_pp_init(void); +#endif +#ifdef CONFIG_VIDEO_CPIA_USB +extern int cpia_usb_init(void); +#endif + static int video_nr = -1; #ifdef MODULE module_param(video_nr, int, 0); -MODULE_AUTHOR("Scott J. Bertin & Peter Pregler & Johannes Erdfelt "); +MODULE_AUTHOR("Scott J. Bertin & Peter Pregler & Johannes Erdfelt "); MODULE_DESCRIPTION("V4L-driver for Vision CPiA based cameras"); MODULE_LICENSE("GPL"); MODULE_SUPPORTED_DEVICE("video"); #endif -static unsigned short colorspace_conv; +static unsigned short colorspace_conv = 0; module_param(colorspace_conv, ushort, 0444); MODULE_PARM_DESC(colorspace_conv, - " Colorspace conversion:" - "\n 0 = disable, 1 = enable" - "\n Default value is 0" - ); + "\n Colorspace conversion:" + "\n0 = disable" + "\n1 = enable" + "\nDefault value is 0" + "\n"); #define ABOUT "V4L-Driver for Vision CPiA based cameras" @@ -180,8 +189,8 @@ enum { #define TC 94 #define EXP_ACC_DARK 50 #define EXP_ACC_LIGHT 90 -#define HIGH_COMP_102 160 -#define MAX_COMP 239 +#define HIGH_COMP_102 160 +#define MAX_COMP 239 #define DARK_TIME 3 #define LIGHT_TIME 3 @@ -199,7 +208,7 @@ static u8 flicker_jumps[2][2][4] = static void reset_camera_struct(struct cam_data *cam); static int find_over_exposure(int brightness); static void set_flicker(struct cam_params *params, volatile u32 *command_flags, - int on); + int on); /********************************************************************** @@ -253,7 +262,7 @@ static void rvfree(void *mem, unsigned long size) static struct proc_dir_entry *cpia_proc_root=NULL; static int cpia_read_proc(char *page, char **start, off_t off, - int count, int *eof, void *data) + int count, int *eof, void *data) { char *out = page; int len, tmp; @@ -267,58 +276,58 @@ static int cpia_read_proc(char *page, char **start, off_t off, out += sprintf(out, "V4L Driver version: %d.%d.%d\n", CPIA_MAJ_VER, CPIA_MIN_VER, CPIA_PATCH_VER); out += sprintf(out, "CPIA Version: %d.%02d (%d.%d)\n", - cam->params.version.firmwareVersion, - cam->params.version.firmwareRevision, - cam->params.version.vcVersion, - cam->params.version.vcRevision); + cam->params.version.firmwareVersion, + cam->params.version.firmwareRevision, + cam->params.version.vcVersion, + cam->params.version.vcRevision); out += sprintf(out, "CPIA PnP-ID: %04x:%04x:%04x\n", - cam->params.pnpID.vendor, cam->params.pnpID.product, - cam->params.pnpID.deviceRevision); + cam->params.pnpID.vendor, cam->params.pnpID.product, + cam->params.pnpID.deviceRevision); out += sprintf(out, "VP-Version: %d.%d %04x\n", - cam->params.vpVersion.vpVersion, - cam->params.vpVersion.vpRevision, - cam->params.vpVersion.cameraHeadID); - + cam->params.vpVersion.vpVersion, + cam->params.vpVersion.vpRevision, + cam->params.vpVersion.cameraHeadID); + out += sprintf(out, "system_state: %#04x\n", - cam->params.status.systemState); + cam->params.status.systemState); out += sprintf(out, "grab_state: %#04x\n", - cam->params.status.grabState); + cam->params.status.grabState); out += sprintf(out, "stream_state: %#04x\n", - cam->params.status.streamState); + cam->params.status.streamState); out += sprintf(out, "fatal_error: %#04x\n", - cam->params.status.fatalError); + cam->params.status.fatalError); out += sprintf(out, "cmd_error: %#04x\n", - cam->params.status.cmdError); + cam->params.status.cmdError); out += sprintf(out, "debug_flags: %#04x\n", - cam->params.status.debugFlags); + cam->params.status.debugFlags); out += sprintf(out, "vp_status: %#04x\n", - cam->params.status.vpStatus); + cam->params.status.vpStatus); out += sprintf(out, "error_code: %#04x\n", - cam->params.status.errorCode); + cam->params.status.errorCode); /* QX3 specific entries */ if (cam->params.qx3.qx3_detected) { out += sprintf(out, "button: %4d\n", - cam->params.qx3.button); + cam->params.qx3.button); out += sprintf(out, "cradled: %4d\n", - cam->params.qx3.cradled); + cam->params.qx3.cradled); } out += sprintf(out, "video_size: %s\n", - cam->params.format.videoSize == VIDEOSIZE_CIF ? + cam->params.format.videoSize == VIDEOSIZE_CIF ? "CIF " : "QCIF"); out += sprintf(out, "roi: (%3d, %3d) to (%3d, %3d)\n", - cam->params.roi.colStart*8, - cam->params.roi.rowStart*4, - cam->params.roi.colEnd*8, - cam->params.roi.rowEnd*4); + cam->params.roi.colStart*8, + cam->params.roi.rowStart*4, + cam->params.roi.colEnd*8, + cam->params.roi.rowEnd*4); out += sprintf(out, "actual_fps: %3d\n", cam->fps); out += sprintf(out, "transfer_rate: %4dkB/s\n", - cam->transfer_rate); - + cam->transfer_rate); + out += sprintf(out, "\nread-write\n"); out += sprintf(out, "----------------------- current min" - " max default comment\n"); + " max default comment\n"); out += sprintf(out, "brightness: %8d %8d %8d %8d\n", - cam->params.colourParams.brightness, 0, 100, 50); + cam->params.colourParams.brightness, 0, 100, 50); if (cam->params.version.firmwareVersion == 1 && cam->params.version.firmwareRevision == 2) /* 1-02 firmware limits contrast to 80 */ @@ -327,26 +336,26 @@ static int cpia_read_proc(char *page, char **start, off_t off, tmp = 96; out += sprintf(out, "contrast: %8d %8d %8d %8d" - " steps of 8\n", - cam->params.colourParams.contrast, 0, tmp, 48); + " steps of 8\n", + cam->params.colourParams.contrast, 0, tmp, 48); out += sprintf(out, "saturation: %8d %8d %8d %8d\n", - cam->params.colourParams.saturation, 0, 100, 50); + cam->params.colourParams.saturation, 0, 100, 50); tmp = (25000+5000*cam->params.sensorFps.baserate)/ (1<params.sensorFps.divisor); out += sprintf(out, "sensor_fps: %4d.%03d %8d %8d %8d\n", - tmp/1000, tmp%1000, 3, 30, 15); + tmp/1000, tmp%1000, 3, 30, 15); out += sprintf(out, "stream_start_line: %8d %8d %8d %8d\n", - 2*cam->params.streamStartLine, 0, + 2*cam->params.streamStartLine, 0, cam->params.format.videoSize == VIDEOSIZE_CIF ? 288:144, cam->params.format.videoSize == VIDEOSIZE_CIF ? 240:120); out += sprintf(out, "sub_sample: %8s %8s %8s %8s\n", - cam->params.format.subSample == SUBSAMPLE_420 ? + cam->params.format.subSample == SUBSAMPLE_420 ? "420" : "422", "420", "422", "422"); out += sprintf(out, "yuv_order: %8s %8s %8s %8s\n", - cam->params.format.yuvOrder == YUVORDER_YUYV ? + cam->params.format.yuvOrder == YUVORDER_YUYV ? "YUYV" : "UYVY", "YUYV" , "UYVY", "YUYV"); out += sprintf(out, "ecp_timing: %8s %8s %8s %8s\n", - cam->params.ecpTiming ? "slow" : "normal", "slow", + cam->params.ecpTiming ? "slow" : "normal", "slow", "normal", "normal"); if (cam->params.colourBalance.balanceMode == 2) { @@ -357,11 +366,11 @@ static int cpia_read_proc(char *page, char **start, off_t off, out += sprintf(out, "color_balance_mode: %8s %8s %8s" " %8s\n", tmpstr, "manual", "auto", "auto"); out += sprintf(out, "red_gain: %8d %8d %8d %8d\n", - cam->params.colourBalance.redGain, 0, 212, 32); + cam->params.colourBalance.redGain, 0, 212, 32); out += sprintf(out, "green_gain: %8d %8d %8d %8d\n", - cam->params.colourBalance.greenGain, 0, 212, 6); + cam->params.colourBalance.greenGain, 0, 212, 6); out += sprintf(out, "blue_gain: %8d %8d %8d %8d\n", - cam->params.colourBalance.blueGain, 0, 212, 92); + cam->params.colourBalance.blueGain, 0, 212, 92); if (cam->params.version.firmwareVersion == 1 && cam->params.version.firmwareRevision == 2) @@ -372,11 +381,11 @@ static int cpia_read_proc(char *page, char **start, off_t off, if (cam->params.exposure.gainMode == 0) out += sprintf(out, "max_gain: unknown %28s" - " powers of 2\n", tmpstr); + " powers of 2\n", tmpstr); else out += sprintf(out, "max_gain: %8d %28s" " 1,2,4 or 8 \n", - 1<<(cam->params.exposure.gainMode-1), tmpstr); + 1<<(cam->params.exposure.gainMode-1), tmpstr); switch(cam->params.exposure.expMode) { case 1: @@ -393,10 +402,10 @@ static int cpia_read_proc(char *page, char **start, off_t off, out += sprintf(out, "exposure_mode: %8s %8s %8s" " %8s\n", tmpstr, "manual", "auto", "auto"); out += sprintf(out, "centre_weight: %8s %8s %8s %8s\n", - (2-cam->params.exposure.centreWeight) ? "on" : "off", - "off", "on", "on"); + (2-cam->params.exposure.centreWeight) ? "on" : "off", + "off", "on", "on"); out += sprintf(out, "gain: %8d %8d max_gain %8d 1,2,4,8 possible\n", - 1<params.exposure.gain, 1, 1); + 1<params.exposure.gain, 1, 1); if (cam->params.version.firmwareVersion == 1 && cam->params.version.firmwareRevision == 2) /* 1-02 firmware limits fineExp/2 to 127 */ @@ -405,7 +414,7 @@ static int cpia_read_proc(char *page, char **start, off_t off, tmp = 510; out += sprintf(out, "fine_exp: %8d %8d %8d %8d\n", - cam->params.exposure.fineExp*2, 0, tmp, 0); + cam->params.exposure.fineExp*2, 0, tmp, 0); if (cam->params.version.firmwareVersion == 1 && cam->params.version.firmwareRevision == 2) /* 1-02 firmware limits coarseExpHi to 0 */ @@ -417,46 +426,46 @@ static int cpia_read_proc(char *page, char **start, off_t off, " %8d\n", cam->params.exposure.coarseExpLo+ 256*cam->params.exposure.coarseExpHi, 0, tmp, 185); out += sprintf(out, "red_comp: %8d %8d %8d %8d\n", - cam->params.exposure.redComp, COMP_RED, 255, COMP_RED); + cam->params.exposure.redComp, COMP_RED, 255, COMP_RED); out += sprintf(out, "green1_comp: %8d %8d %8d %8d\n", - cam->params.exposure.green1Comp, COMP_GREEN1, 255, + cam->params.exposure.green1Comp, COMP_GREEN1, 255, COMP_GREEN1); out += sprintf(out, "green2_comp: %8d %8d %8d %8d\n", - cam->params.exposure.green2Comp, COMP_GREEN2, 255, + cam->params.exposure.green2Comp, COMP_GREEN2, 255, COMP_GREEN2); out += sprintf(out, "blue_comp: %8d %8d %8d %8d\n", - cam->params.exposure.blueComp, COMP_BLUE, 255, COMP_BLUE); - + cam->params.exposure.blueComp, COMP_BLUE, 255, COMP_BLUE); + out += sprintf(out, "apcor_gain1: %#8x %#8x %#8x %#8x\n", - cam->params.apcor.gain1, 0, 0xff, 0x1c); + cam->params.apcor.gain1, 0, 0xff, 0x1c); out += sprintf(out, "apcor_gain2: %#8x %#8x %#8x %#8x\n", - cam->params.apcor.gain2, 0, 0xff, 0x1a); + cam->params.apcor.gain2, 0, 0xff, 0x1a); out += sprintf(out, "apcor_gain4: %#8x %#8x %#8x %#8x\n", - cam->params.apcor.gain4, 0, 0xff, 0x2d); + cam->params.apcor.gain4, 0, 0xff, 0x2d); out += sprintf(out, "apcor_gain8: %#8x %#8x %#8x %#8x\n", - cam->params.apcor.gain8, 0, 0xff, 0x2a); + cam->params.apcor.gain8, 0, 0xff, 0x2a); out += sprintf(out, "vl_offset_gain1: %8d %8d %8d %8d\n", - cam->params.vlOffset.gain1, 0, 255, 24); + cam->params.vlOffset.gain1, 0, 255, 24); out += sprintf(out, "vl_offset_gain2: %8d %8d %8d %8d\n", - cam->params.vlOffset.gain2, 0, 255, 28); + cam->params.vlOffset.gain2, 0, 255, 28); out += sprintf(out, "vl_offset_gain4: %8d %8d %8d %8d\n", - cam->params.vlOffset.gain4, 0, 255, 30); + cam->params.vlOffset.gain4, 0, 255, 30); out += sprintf(out, "vl_offset_gain8: %8d %8d %8d %8d\n", - cam->params.vlOffset.gain8, 0, 255, 30); + cam->params.vlOffset.gain8, 0, 255, 30); out += sprintf(out, "flicker_control: %8s %8s %8s %8s\n", - cam->params.flickerControl.flickerMode ? "on" : "off", + cam->params.flickerControl.flickerMode ? "on" : "off", "off", "on", "off"); out += sprintf(out, "mains_frequency: %8d %8d %8d %8d" - " only 50/60\n", - cam->mainsFreq ? 60 : 50, 50, 60, 50); + " only 50/60\n", + cam->mainsFreq ? 60 : 50, 50, 60, 50); if(cam->params.flickerControl.allowableOverExposure < 0) out += sprintf(out, "allowable_overexposure: %4dauto auto %8d auto\n", - -cam->params.flickerControl.allowableOverExposure, - 255); + -cam->params.flickerControl.allowableOverExposure, + 255); else out += sprintf(out, "allowable_overexposure: %8d auto %8d auto\n", - cam->params.flickerControl.allowableOverExposure, - 255); + cam->params.flickerControl.allowableOverExposure, + 255); out += sprintf(out, "compression_mode: "); switch(cam->params.compression.mode) { case CPIA_COMPRESSION_NONE: @@ -474,52 +483,52 @@ static int cpia_read_proc(char *page, char **start, off_t off, } out += sprintf(out, " none,auto,manual auto\n"); out += sprintf(out, "decimation_enable: %8s %8s %8s %8s\n", - cam->params.compression.decimation == - DECIMATION_ENAB ? "on":"off", "off", "on", + cam->params.compression.decimation == + DECIMATION_ENAB ? "on":"off", "off", "on", "off"); out += sprintf(out, "compression_target: %9s %9s %9s %9s\n", - cam->params.compressionTarget.frTargeting == + cam->params.compressionTarget.frTargeting == CPIA_COMPRESSION_TARGET_FRAMERATE ? "framerate":"quality", "framerate", "quality", "quality"); out += sprintf(out, "target_framerate: %8d %8d %8d %8d\n", - cam->params.compressionTarget.targetFR, 1, 30, 15); + cam->params.compressionTarget.targetFR, 1, 30, 15); out += sprintf(out, "target_quality: %8d %8d %8d %8d\n", - cam->params.compressionTarget.targetQ, 1, 64, 5); + cam->params.compressionTarget.targetQ, 1, 64, 5); out += sprintf(out, "y_threshold: %8d %8d %8d %8d\n", - cam->params.yuvThreshold.yThreshold, 0, 31, 6); + cam->params.yuvThreshold.yThreshold, 0, 31, 6); out += sprintf(out, "uv_threshold: %8d %8d %8d %8d\n", - cam->params.yuvThreshold.uvThreshold, 0, 31, 6); + cam->params.yuvThreshold.uvThreshold, 0, 31, 6); out += sprintf(out, "hysteresis: %8d %8d %8d %8d\n", - cam->params.compressionParams.hysteresis, 0, 255, 3); + cam->params.compressionParams.hysteresis, 0, 255, 3); out += sprintf(out, "threshold_max: %8d %8d %8d %8d\n", - cam->params.compressionParams.threshMax, 0, 255, 11); + cam->params.compressionParams.threshMax, 0, 255, 11); out += sprintf(out, "small_step: %8d %8d %8d %8d\n", - cam->params.compressionParams.smallStep, 0, 255, 1); + cam->params.compressionParams.smallStep, 0, 255, 1); out += sprintf(out, "large_step: %8d %8d %8d %8d\n", - cam->params.compressionParams.largeStep, 0, 255, 3); + cam->params.compressionParams.largeStep, 0, 255, 3); out += sprintf(out, "decimation_hysteresis: %8d %8d %8d %8d\n", - cam->params.compressionParams.decimationHysteresis, + cam->params.compressionParams.decimationHysteresis, 0, 255, 2); out += sprintf(out, "fr_diff_step_thresh: %8d %8d %8d %8d\n", - cam->params.compressionParams.frDiffStepThresh, + cam->params.compressionParams.frDiffStepThresh, 0, 255, 5); out += sprintf(out, "q_diff_step_thresh: %8d %8d %8d %8d\n", - cam->params.compressionParams.qDiffStepThresh, + cam->params.compressionParams.qDiffStepThresh, 0, 255, 3); out += sprintf(out, "decimation_thresh_mod: %8d %8d %8d %8d\n", - cam->params.compressionParams.decimationThreshMod, + cam->params.compressionParams.decimationThreshMod, 0, 255, 2); /* QX3 specific entries */ if (cam->params.qx3.qx3_detected) { - out += sprintf(out, "toplight: %8s %8s %8s %8s\n", - cam->params.qx3.toplight ? "on" : "off", + out += sprintf(out, "toplight: %8s %8s %8s %8s\n", + cam->params.qx3.toplight ? "on" : "off", "off", "on", "off"); - out += sprintf(out, "bottomlight: %8s %8s %8s %8s\n", - cam->params.qx3.bottomlight ? "on" : "off", + out += sprintf(out, "bottomlight: %8s %8s %8s %8s\n", + cam->params.qx3.bottomlight ? "on" : "off", "off", "on", "off"); } - + len = out - page; len -= off; if (len < count) { @@ -534,7 +543,7 @@ static int cpia_read_proc(char *page, char **start, off_t off, static int match(char *checkstr, char **buffer, unsigned long *count, - int *find_colon, int *err) + int *find_colon, int *err) { int ret, colon_found = 1; int len = strlen(checkstr); @@ -574,7 +583,7 @@ static unsigned long int value(char **buffer, unsigned long *count, int *err) } static int cpia_write_proc(struct file *file, const char __user *buf, - unsigned long count, void *data) + unsigned long count, void *data) { struct cam_data *cam = data; struct cam_params new_params; @@ -610,12 +619,12 @@ static int cpia_write_proc(struct file *file, const char __user *buf, retval = -EINVAL; goto out; } - + buffer = page; - - if (mutex_lock_interruptible(&cam->param_lock)) + + if (down_interruptible(&cam->param_lock)) return -ERESTARTSYS; - + /* * Skip over leading whitespace */ @@ -623,15 +632,15 @@ static int cpia_write_proc(struct file *file, const char __user *buf, --count; ++buffer; } - + memcpy(&new_params, &cam->params, sizeof(struct cam_params)); new_mains = cam->mainsFreq; - + #define MATCH(x) (match(x, &buffer, &count, &find_colon, &retval)) #define VALUE (value(&buffer,&count, &retval)) #define FIRMWARE_VERSION(x,y) (new_params.version.firmwareVersion == (x) && \ - new_params.version.firmwareRevision == (y)) - + new_params.version.firmwareRevision == (y)) + retval = 0; while (count && !retval) { find_colon = 1; @@ -647,7 +656,7 @@ static int cpia_write_proc(struct file *file, const char __user *buf, } command_flags |= COMMAND_SETCOLOURPARAMS; if(new_params.flickerControl.allowableOverExposure < 0) - new_params.flickerControl.allowableOverExposure = + new_params.flickerControl.allowableOverExposure = -find_over_exposure(new_params.colourParams.brightness); if(new_params.flickerControl.flickerMode != 0) command_flags |= COMMAND_SETFLICKERCTRL; @@ -712,7 +721,7 @@ static int cpia_write_proc(struct file *file, const char __user *buf, /* Either base rate would work here */ new_params.sensorFps.baserate = 1; } - new_params.flickerControl.coarseJump = + new_params.flickerControl.coarseJump = flicker_jumps[new_mains] [new_params.sensorFps.baserate] [new_params.sensorFps.divisor]; @@ -1076,7 +1085,7 @@ static int cpia_write_proc(struct file *file, const char __user *buf, } else if (MATCH("mains_frequency")) { if (!retval && MATCH("50")) { new_mains = 0; - new_params.flickerControl.coarseJump = + new_params.flickerControl.coarseJump = flicker_jumps[new_mains] [new_params.sensorFps.baserate] [new_params.sensorFps.divisor]; @@ -1084,7 +1093,7 @@ static int cpia_write_proc(struct file *file, const char __user *buf, command_flags |= COMMAND_SETFLICKERCTRL; } else if (!retval && MATCH("60")) { new_mains = 1; - new_params.flickerControl.coarseJump = + new_params.flickerControl.coarseJump = flicker_jumps[new_mains] [new_params.sensorFps.baserate] [new_params.sensorFps.divisor]; @@ -1094,7 +1103,7 @@ static int cpia_write_proc(struct file *file, const char __user *buf, retval = -EINVAL; } else if (MATCH("allowable_overexposure")) { if (!retval && MATCH("auto")) { - new_params.flickerControl.allowableOverExposure = + new_params.flickerControl.allowableOverExposure = -find_over_exposure(new_params.colourParams.brightness); if(new_params.flickerControl.flickerMode != 0) command_flags |= COMMAND_SETFLICKERCTRL; @@ -1137,10 +1146,10 @@ static int cpia_write_proc(struct file *file, const char __user *buf, command_flags |= COMMAND_SETCOMPRESSION; } else if (MATCH("compression_target")) { if (!retval && MATCH("quality")) - new_params.compressionTarget.frTargeting = + new_params.compressionTarget.frTargeting = CPIA_COMPRESSION_TARGET_QUALITY; else if (!retval && MATCH("framerate")) - new_params.compressionTarget.frTargeting = + new_params.compressionTarget.frTargeting = CPIA_COMPRESSION_TARGET_FRAMERATE; else retval = -EINVAL; @@ -1164,7 +1173,7 @@ static int cpia_write_proc(struct file *file, const char __user *buf, if (!retval) { if(val > 0 && val <= 64) new_params.compressionTarget.targetQ = val; - else + else retval = -EINVAL; } command_flags |= COMMAND_SETCOMPRESSIONTARGET; @@ -1279,19 +1288,19 @@ static int cpia_write_proc(struct file *file, const char __user *buf, } command_flags |= COMMAND_SETCOMPRESSIONPARAMS; } else if (MATCH("toplight")) { - if (!retval && MATCH("on")) + if (!retval && MATCH("on")) new_params.qx3.toplight = 1; else if (!retval && MATCH("off")) new_params.qx3.toplight = 0; - else + else retval = -EINVAL; command_flags |= COMMAND_SETLIGHTS; } else if (MATCH("bottomlight")) { - if (!retval && MATCH("on")) + if (!retval && MATCH("on")) new_params.qx3.bottomlight = 1; - else if (!retval && MATCH("off")) + else if (!retval && MATCH("off")) new_params.qx3.bottomlight = 0; - else + else retval = -EINVAL; command_flags |= COMMAND_SETLIGHTS; } else { @@ -1317,7 +1326,7 @@ static int cpia_write_proc(struct file *file, const char __user *buf, } } } -#undef MATCH +#undef MATCH #undef VALUE #undef FIRMWARE_VERSION if (!retval) { @@ -1340,24 +1349,24 @@ static int cpia_write_proc(struct file *file, const char __user *buf, retval = size; } else DBG("error: %d\n", retval); - - mutex_unlock(&cam->param_lock); - + + up(&cam->param_lock); + out: free_page((unsigned long)page); - return retval; + return retval; } static void create_proc_cpia_cam(struct cam_data *cam) { char name[7]; struct proc_dir_entry *ent; - + if (!cpia_proc_root || !cam) return; sprintf(name, "video%d", cam->vdev.minor); - + ent = create_proc_entry(name, S_IFREG|S_IRUGO|S_IWUSR, cpia_proc_root); if (!ent) return; @@ -1365,9 +1374,9 @@ static void create_proc_cpia_cam(struct cam_data *cam) ent->data = cam; ent->read_proc = cpia_read_proc; ent->write_proc = cpia_write_proc; - /* + /* size of the proc entry is 3736 bytes for the standard webcam; - the extra features of the QX3 microscope add 189 bytes. + the extra features of the QX3 microscope add 189 bytes. (we have not yet probed the camera to see which type it is). */ ent->size = 3736 + 189; @@ -1377,10 +1386,10 @@ static void create_proc_cpia_cam(struct cam_data *cam) static void destroy_proc_cpia_cam(struct cam_data *cam) { char name[7]; - + if (!cam || !cam->proc_entry) return; - + sprintf(name, "video%d", cam->vdev.minor); remove_proc_entry(name, cpia_proc_root); cam->proc_entry = NULL; @@ -1587,13 +1596,13 @@ static void set_vw_size(struct cam_data *cam) cam->vc.width = cam->vw.width; if(cam->vc.height == 0) cam->vc.height = cam->vw.height; - + cam->params.roi.colStart += cam->vc.x >> 3; cam->params.roi.colEnd = cam->params.roi.colStart + - (cam->vc.width >> 3); + (cam->vc.width >> 3); cam->params.roi.rowStart += cam->vc.y >> 2; cam->params.roi.rowEnd = cam->params.roi.rowStart + - (cam->vc.height >> 2); + (cam->vc.height >> 2); return; } @@ -1615,7 +1624,7 @@ static int allocate_frame_buf(struct cam_data *cam) static int free_frame_buf(struct cam_data *cam) { int i; - + rvfree(cam->frame_buf, FRAME_NUM*CPIA_MAX_FRAME_SIZE); cam->frame_buf = NULL; for (i=0; i < FRAME_NUM; i++) @@ -1655,10 +1664,10 @@ static int do_command(struct cam_data *cam, u16 command, u8 a, u8 b, u8 c, u8 d) case CPIA_COMMAND_GetColourParams: case CPIA_COMMAND_GetColourBalance: case CPIA_COMMAND_GetExposure: - mutex_lock(&cam->param_lock); + down(&cam->param_lock); datasize=8; break; - case CPIA_COMMAND_ReadMCPorts: + case CPIA_COMMAND_ReadMCPorts: case CPIA_COMMAND_ReadVCRegs: datasize = 4; break; @@ -1682,7 +1691,7 @@ static int do_command(struct cam_data *cam, u16 command, u8 a, u8 b, u8 c, u8 d) if (command == CPIA_COMMAND_GetColourParams || command == CPIA_COMMAND_GetColourBalance || command == CPIA_COMMAND_GetExposure) - mutex_unlock(&cam->param_lock); + up(&cam->param_lock); } else { switch(command) { case CPIA_COMMAND_GetCPIAVersion: @@ -1717,13 +1726,13 @@ static int do_command(struct cam_data *cam, u16 command, u8 a, u8 b, u8 c, u8 d) cam->params.colourParams.brightness = data[0]; cam->params.colourParams.contrast = data[1]; cam->params.colourParams.saturation = data[2]; - mutex_unlock(&cam->param_lock); + up(&cam->param_lock); break; case CPIA_COMMAND_GetColourBalance: cam->params.colourBalance.redGain = data[0]; cam->params.colourBalance.greenGain = data[1]; cam->params.colourBalance.blueGain = data[2]; - mutex_unlock(&cam->param_lock); + up(&cam->param_lock); break; case CPIA_COMMAND_GetExposure: cam->params.exposure.gain = data[0]; @@ -1734,13 +1743,13 @@ static int do_command(struct cam_data *cam, u16 command, u8 a, u8 b, u8 c, u8 d) cam->params.exposure.green1Comp = data[5]; cam->params.exposure.green2Comp = data[6]; cam->params.exposure.blueComp = data[7]; - mutex_unlock(&cam->param_lock); + up(&cam->param_lock); break; - case CPIA_COMMAND_ReadMCPorts: - if (!cam->params.qx3.qx3_detected) + case CPIA_COMMAND_ReadMCPorts: + if (!cam->params.qx3.qx3_detected) break; - /* test button press */ + /* test button press */ cam->params.qx3.button = ((data[1] & 0x02) == 0); if (cam->params.qx3.button) { /* button pressed - unlock the latch */ @@ -1761,9 +1770,9 @@ static int do_command(struct cam_data *cam, u16 command, u8 a, u8 b, u8 c, u8 d) /* send a command to the camera with an additional data transaction */ static int do_command_extended(struct cam_data *cam, u16 command, - u8 a, u8 b, u8 c, u8 d, - u8 e, u8 f, u8 g, u8 h, - u8 i, u8 j, u8 k, u8 l) + u8 a, u8 b, u8 c, u8 d, + u8 e, u8 f, u8 g, u8 h, + u8 i, u8 j, u8 k, u8 l) { int retval; u8 cmd[8], data[8]; @@ -1800,10 +1809,10 @@ static int do_command_extended(struct cam_data *cam, u16 command, #define LIMIT(x) ((((x)>0xffffff)?0xff0000:(((x)<=0xffff)?0:(x)&0xff0000))>>16) static int convert420(unsigned char *yuv, unsigned char *rgb, int out_fmt, - int linesize, int mmap_kludge) + int linesize, int mmap_kludge) { int y, u, v, r, g, b, y1; - + /* Odd lines use the same u and v as the previous line. * Because of compression, it is necessary to get this * information from the decoded image. */ @@ -1916,7 +1925,7 @@ static int convert420(unsigned char *yuv, unsigned char *rgb, int out_fmt, static int yuvconvert(unsigned char *yuv, unsigned char *rgb, int out_fmt, - int in_uyvy, int mmap_kludge) + int in_uyvy, int mmap_kludge) { int y, u, v, r, g, b, y1; @@ -2050,7 +2059,7 @@ static int parse_picture(struct cam_data *cam, int size) int rows, cols, linesize, subsample_422; /* make sure params don't change while we are decoding */ - mutex_lock(&cam->param_lock); + down(&cam->param_lock); obuf = cam->decompressed_frame.data; end_obuf = obuf+CPIA_MAX_FRAME_SIZE; @@ -2060,55 +2069,55 @@ static int parse_picture(struct cam_data *cam, int size) if ((ibuf[0] != MAGIC_0) || (ibuf[1] != MAGIC_1)) { LOG("header not found\n"); - mutex_unlock(&cam->param_lock); + up(&cam->param_lock); return -1; } if ((ibuf[16] != VIDEOSIZE_QCIF) && (ibuf[16] != VIDEOSIZE_CIF)) { LOG("wrong video size\n"); - mutex_unlock(&cam->param_lock); + up(&cam->param_lock); return -1; } - + if (ibuf[17] != SUBSAMPLE_420 && ibuf[17] != SUBSAMPLE_422) { LOG("illegal subtype %d\n",ibuf[17]); - mutex_unlock(&cam->param_lock); + up(&cam->param_lock); return -1; } subsample_422 = ibuf[17] == SUBSAMPLE_422; - + if (ibuf[18] != YUVORDER_YUYV && ibuf[18] != YUVORDER_UYVY) { LOG("illegal yuvorder %d\n",ibuf[18]); - mutex_unlock(&cam->param_lock); + up(&cam->param_lock); return -1; } in_uyvy = ibuf[18] == YUVORDER_UYVY; - + if ((ibuf[24] != cam->params.roi.colStart) || (ibuf[25] != cam->params.roi.colEnd) || (ibuf[26] != cam->params.roi.rowStart) || (ibuf[27] != cam->params.roi.rowEnd)) { LOG("ROI mismatch\n"); - mutex_unlock(&cam->param_lock); + up(&cam->param_lock); return -1; } cols = 8*(ibuf[25] - ibuf[24]); rows = 4*(ibuf[27] - ibuf[26]); - + if ((ibuf[28] != NOT_COMPRESSED) && (ibuf[28] != COMPRESSED)) { LOG("illegal compression %d\n",ibuf[28]); - mutex_unlock(&cam->param_lock); + up(&cam->param_lock); return -1; } compressed = (ibuf[28] == COMPRESSED); - + if (ibuf[29] != NO_DECIMATION && ibuf[29] != DECIMATION_ENAB) { LOG("illegal decimation %d\n",ibuf[29]); - mutex_unlock(&cam->param_lock); + up(&cam->param_lock); return -1; } - decimation = (ibuf[29] == DECIMATION_ENAB); + decimation = (ibuf[29] == DECIMATION_ENAB); cam->params.yuvThreshold.yThreshold = ibuf[30]; cam->params.yuvThreshold.uvThreshold = ibuf[31]; @@ -2121,8 +2130,8 @@ static int parse_picture(struct cam_data *cam, int size) cam->params.status.vpStatus = ibuf[38]; cam->params.status.errorCode = ibuf[39]; cam->fps = ibuf[41]; - mutex_unlock(&cam->param_lock); - + up(&cam->param_lock); + linesize = skipcount(cols, out_fmt); ibuf += FRAME_HEADER_SIZE; size -= FRAME_HEADER_SIZE; @@ -2141,14 +2150,14 @@ static int parse_picture(struct cam_data *cam, int size) if (!compressed || (compressed && !(*ibuf & 1))) { if(subsample_422 || even_line) { obuf += yuvconvert(ibuf, obuf, out_fmt, - in_uyvy, cam->mmap_kludge); + in_uyvy, cam->mmap_kludge); ibuf += 4; ll -= 4; } else { /* SUBSAMPLE_420 on an odd line */ obuf += convert420(ibuf, obuf, - out_fmt, linesize, - cam->mmap_kludge); + out_fmt, linesize, + cam->mmap_kludge); ibuf += 2; ll -= 2; } @@ -2174,7 +2183,7 @@ static int parse_picture(struct cam_data *cam, int size) if ((size > 3) && (ibuf[0] == EOI) && (ibuf[1] == EOI) && (ibuf[2] == EOI) && (ibuf[3] == EOI)) { - size -= 4; + size -= 4; break; } @@ -2195,7 +2204,7 @@ static int parse_picture(struct cam_data *cam, int size) return -1; } } - + if(decimation) { /* interpolate odd rows */ int i, j; @@ -2224,7 +2233,7 @@ static int parse_picture(struct cam_data *cam, int size) static inline int init_stream_cap(struct cam_data *cam) { return do_command(cam, CPIA_COMMAND_InitStreamCap, - 0, cam->params.streamStartLine, 0, 0); + 0, cam->params.streamStartLine, 0, 0); } @@ -2245,7 +2254,7 @@ static int find_over_exposure(int brightness) int MaxAllowableOverExposure, OverExposure; MaxAllowableOverExposure = FLICKER_MAX_EXPOSURE - brightness - - FLICKER_BRIGHTNESS_CONSTANT; + FLICKER_BRIGHTNESS_CONSTANT; if (MaxAllowableOverExposure < FLICKER_ALLOWABLE_OVER_EXPOSURE) { OverExposure = MaxAllowableOverExposure; @@ -2262,71 +2271,71 @@ static int find_over_exposure(int brightness) /* update various camera modes and settings */ static void dispatch_commands(struct cam_data *cam) { - mutex_lock(&cam->param_lock); + down(&cam->param_lock); if (cam->cmd_queue==COMMAND_NONE) { - mutex_unlock(&cam->param_lock); + up(&cam->param_lock); return; } DEB_BYTE(cam->cmd_queue); DEB_BYTE(cam->cmd_queue>>8); if (cam->cmd_queue & COMMAND_SETFORMAT) { do_command(cam, CPIA_COMMAND_SetFormat, - cam->params.format.videoSize, - cam->params.format.subSample, - cam->params.format.yuvOrder, 0); + cam->params.format.videoSize, + cam->params.format.subSample, + cam->params.format.yuvOrder, 0); do_command(cam, CPIA_COMMAND_SetROI, - cam->params.roi.colStart, cam->params.roi.colEnd, - cam->params.roi.rowStart, cam->params.roi.rowEnd); + cam->params.roi.colStart, cam->params.roi.colEnd, + cam->params.roi.rowStart, cam->params.roi.rowEnd); cam->first_frame = 1; } if (cam->cmd_queue & COMMAND_SETCOLOURPARAMS) do_command(cam, CPIA_COMMAND_SetColourParams, - cam->params.colourParams.brightness, - cam->params.colourParams.contrast, - cam->params.colourParams.saturation, 0); + cam->params.colourParams.brightness, + cam->params.colourParams.contrast, + cam->params.colourParams.saturation, 0); if (cam->cmd_queue & COMMAND_SETAPCOR) do_command(cam, CPIA_COMMAND_SetApcor, - cam->params.apcor.gain1, - cam->params.apcor.gain2, - cam->params.apcor.gain4, - cam->params.apcor.gain8); + cam->params.apcor.gain1, + cam->params.apcor.gain2, + cam->params.apcor.gain4, + cam->params.apcor.gain8); if (cam->cmd_queue & COMMAND_SETVLOFFSET) do_command(cam, CPIA_COMMAND_SetVLOffset, - cam->params.vlOffset.gain1, - cam->params.vlOffset.gain2, - cam->params.vlOffset.gain4, - cam->params.vlOffset.gain8); + cam->params.vlOffset.gain1, + cam->params.vlOffset.gain2, + cam->params.vlOffset.gain4, + cam->params.vlOffset.gain8); if (cam->cmd_queue & COMMAND_SETEXPOSURE) { do_command_extended(cam, CPIA_COMMAND_SetExposure, - cam->params.exposure.gainMode, - 1, - cam->params.exposure.compMode, - cam->params.exposure.centreWeight, - cam->params.exposure.gain, - cam->params.exposure.fineExp, - cam->params.exposure.coarseExpLo, - cam->params.exposure.coarseExpHi, - cam->params.exposure.redComp, - cam->params.exposure.green1Comp, - cam->params.exposure.green2Comp, - cam->params.exposure.blueComp); + cam->params.exposure.gainMode, + 1, + cam->params.exposure.compMode, + cam->params.exposure.centreWeight, + cam->params.exposure.gain, + cam->params.exposure.fineExp, + cam->params.exposure.coarseExpLo, + cam->params.exposure.coarseExpHi, + cam->params.exposure.redComp, + cam->params.exposure.green1Comp, + cam->params.exposure.green2Comp, + cam->params.exposure.blueComp); if(cam->params.exposure.expMode != 1) { do_command_extended(cam, CPIA_COMMAND_SetExposure, - 0, - cam->params.exposure.expMode, - 0, 0, - cam->params.exposure.gain, - cam->params.exposure.fineExp, - cam->params.exposure.coarseExpLo, - cam->params.exposure.coarseExpHi, - 0, 0, 0, 0); + 0, + cam->params.exposure.expMode, + 0, 0, + cam->params.exposure.gain, + cam->params.exposure.fineExp, + cam->params.exposure.coarseExpLo, + cam->params.exposure.coarseExpHi, + 0, 0, 0, 0); } } - + if (cam->cmd_queue & COMMAND_SETCOLOURBALANCE) { if (cam->params.colourBalance.balanceMode == 1) { do_command(cam, CPIA_COMMAND_SetColourBalance, @@ -2349,47 +2358,47 @@ static void dispatch_commands(struct cam_data *cam) if (cam->cmd_queue & COMMAND_SETCOMPRESSIONTARGET) do_command(cam, CPIA_COMMAND_SetCompressionTarget, - cam->params.compressionTarget.frTargeting, - cam->params.compressionTarget.targetFR, - cam->params.compressionTarget.targetQ, 0); + cam->params.compressionTarget.frTargeting, + cam->params.compressionTarget.targetFR, + cam->params.compressionTarget.targetQ, 0); if (cam->cmd_queue & COMMAND_SETYUVTHRESH) do_command(cam, CPIA_COMMAND_SetYUVThresh, - cam->params.yuvThreshold.yThreshold, - cam->params.yuvThreshold.uvThreshold, 0, 0); + cam->params.yuvThreshold.yThreshold, + cam->params.yuvThreshold.uvThreshold, 0, 0); if (cam->cmd_queue & COMMAND_SETCOMPRESSIONPARAMS) do_command_extended(cam, CPIA_COMMAND_SetCompressionParams, - 0, 0, 0, 0, - cam->params.compressionParams.hysteresis, - cam->params.compressionParams.threshMax, - cam->params.compressionParams.smallStep, - cam->params.compressionParams.largeStep, - cam->params.compressionParams.decimationHysteresis, - cam->params.compressionParams.frDiffStepThresh, - cam->params.compressionParams.qDiffStepThresh, - cam->params.compressionParams.decimationThreshMod); + 0, 0, 0, 0, + cam->params.compressionParams.hysteresis, + cam->params.compressionParams.threshMax, + cam->params.compressionParams.smallStep, + cam->params.compressionParams.largeStep, + cam->params.compressionParams.decimationHysteresis, + cam->params.compressionParams.frDiffStepThresh, + cam->params.compressionParams.qDiffStepThresh, + cam->params.compressionParams.decimationThreshMod); if (cam->cmd_queue & COMMAND_SETCOMPRESSION) do_command(cam, CPIA_COMMAND_SetCompression, - cam->params.compression.mode, + cam->params.compression.mode, cam->params.compression.decimation, 0, 0); if (cam->cmd_queue & COMMAND_SETSENSORFPS) do_command(cam, CPIA_COMMAND_SetSensorFPS, - cam->params.sensorFps.divisor, - cam->params.sensorFps.baserate, 0, 0); + cam->params.sensorFps.divisor, + cam->params.sensorFps.baserate, 0, 0); if (cam->cmd_queue & COMMAND_SETFLICKERCTRL) do_command(cam, CPIA_COMMAND_SetFlickerCtrl, - cam->params.flickerControl.flickerMode, - cam->params.flickerControl.coarseJump, - abs(cam->params.flickerControl.allowableOverExposure), - 0); + cam->params.flickerControl.flickerMode, + cam->params.flickerControl.coarseJump, + abs(cam->params.flickerControl.allowableOverExposure), + 0); if (cam->cmd_queue & COMMAND_SETECPTIMING) do_command(cam, CPIA_COMMAND_SetECPTiming, - cam->params.ecpTiming, 0, 0, 0); + cam->params.ecpTiming, 0, 0, 0); if (cam->cmd_queue & COMMAND_PAUSE) do_command(cam, CPIA_COMMAND_EndStreamCap, 0, 0, 0, 0); @@ -2400,24 +2409,24 @@ static void dispatch_commands(struct cam_data *cam) if (cam->cmd_queue & COMMAND_SETLIGHTS && cam->params.qx3.qx3_detected) { int p1 = (cam->params.qx3.bottomlight == 0) << 1; - int p2 = (cam->params.qx3.toplight == 0) << 3; - do_command(cam, CPIA_COMMAND_WriteVCReg, 0x90, 0x8F, 0x50, 0); - do_command(cam, CPIA_COMMAND_WriteMCPort, 2, 0, (p1|p2|0xE0), 0); + int p2 = (cam->params.qx3.toplight == 0) << 3; + do_command(cam, CPIA_COMMAND_WriteVCReg, 0x90, 0x8F, 0x50, 0); + do_command(cam, CPIA_COMMAND_WriteMCPort, 2, 0, (p1|p2|0xE0), 0); } cam->cmd_queue = COMMAND_NONE; - mutex_unlock(&cam->param_lock); + up(&cam->param_lock); return; } static void set_flicker(struct cam_params *params, volatile u32 *command_flags, - int on) + int on) { /* Everything in here is from the Windows driver */ #define FIRMWARE_VERSION(x,y) (params->version.firmwareVersion == (x) && \ - params->version.firmwareRevision == (y)) + params->version.firmwareRevision == (y)) /* define for compgain calculation */ #if 0 #define COMPGAIN(base, curexp, newexp) \ @@ -2432,7 +2441,7 @@ static void set_flicker(struct cam_params *params, volatile u32 *command_flags, (u16)(((u32)(curexp * (u8)(curcomp + 128)) / (u8)(basecomp - 128))) #endif - + int currentexp = params->exposure.coarseExpLo + params->exposure.coarseExpHi*256; int startexp; @@ -2473,7 +2482,7 @@ static void set_flicker(struct cam_params *params, volatile u32 *command_flags, } if(FIRMWARE_VERSION(1,2)) params->exposure.compMode = 0; - else + else params->exposure.compMode = 1; params->apcor.gain1 = 0x18; @@ -2524,14 +2533,14 @@ static void set_flicker(struct cam_params *params, volatile u32 *command_flags, } #define FIRMWARE_VERSION(x,y) (cam->params.version.firmwareVersion == (x) && \ - cam->params.version.firmwareRevision == (y)) + cam->params.version.firmwareRevision == (y)) /* monitor the exposure and adjust the sensor frame rate if needed */ static void monitor_exposure(struct cam_data *cam) { u8 exp_acc, bcomp, gain, coarseL, cmd[8], data[8]; int retval, light_exp, dark_exp, very_dark_exp; int old_exposure, new_exposure, framerate; - + /* get necessary stats and register settings from camera */ /* do_command can't handle this, so do it ourselves */ cmd[0] = CPIA_COMMAND_ReadVPRegs>>8; @@ -2553,19 +2562,19 @@ static void monitor_exposure(struct cam_data *cam) gain = data[2]; coarseL = data[3]; - mutex_lock(&cam->param_lock); + down(&cam->param_lock); light_exp = cam->params.colourParams.brightness + - TC - 50 + EXP_ACC_LIGHT; + TC - 50 + EXP_ACC_LIGHT; if(light_exp > 255) light_exp = 255; dark_exp = cam->params.colourParams.brightness + - TC - 50 - EXP_ACC_DARK; + TC - 50 - EXP_ACC_DARK; if(dark_exp < 0) dark_exp = 0; very_dark_exp = dark_exp/2; - + old_exposure = cam->params.exposure.coarseExpHi * 256 + - cam->params.exposure.coarseExpLo; + cam->params.exposure.coarseExpLo; if(!cam->params.flickerControl.disabled) { /* Flicker control on */ @@ -2658,11 +2667,11 @@ static void monitor_exposure(struct cam_data *cam) cam->exposure_status = EXPOSURE_NORMAL; } } - + framerate = cam->fps; if(framerate > 30 || framerate < 1) framerate = 1; - + if(!cam->params.flickerControl.disabled) { /* Flicker control on */ if((cam->exposure_status == EXPOSURE_VERY_DARK || @@ -2674,10 +2683,10 @@ static void monitor_exposure(struct cam_data *cam) ++cam->params.sensorFps.divisor; cam->cmd_queue |= COMMAND_SETSENSORFPS; - cam->params.flickerControl.coarseJump = + cam->params.flickerControl.coarseJump = flicker_jumps[cam->mainsFreq] - [cam->params.sensorFps.baserate] - [cam->params.sensorFps.divisor]; + [cam->params.sensorFps.baserate] + [cam->params.sensorFps.divisor]; cam->cmd_queue |= COMMAND_SETFLICKERCTRL; new_exposure = cam->params.flickerControl.coarseJump-1; @@ -2695,15 +2704,15 @@ static void monitor_exposure(struct cam_data *cam) cam->params.sensorFps.divisor > 0) { /* light for too long */ - int max_exp = FIRMWARE_VERSION(1,2) ? MAX_EXP_102 : MAX_EXP ; + int max_exp = FIRMWARE_VERSION(1,2) ? MAX_EXP_102 : MAX_EXP ; --cam->params.sensorFps.divisor; cam->cmd_queue |= COMMAND_SETSENSORFPS; - cam->params.flickerControl.coarseJump = + cam->params.flickerControl.coarseJump = flicker_jumps[cam->mainsFreq] - [cam->params.sensorFps.baserate] - [cam->params.sensorFps.divisor]; + [cam->params.sensorFps.baserate] + [cam->params.sensorFps.divisor]; cam->cmd_queue |= COMMAND_SETFLICKERCTRL; new_exposure = cam->params.flickerControl.coarseJump-1; @@ -2753,7 +2762,7 @@ static void monitor_exposure(struct cam_data *cam) LOG("Automatically increasing sensor_fps\n"); } } - mutex_unlock(&cam->param_lock); + up(&cam->param_lock); } /*-----------------------------------------------------------------*/ @@ -2763,36 +2772,36 @@ static void monitor_exposure(struct cam_data *cam) It also adjust the colour balance when an exposure step is detected - as long as flicker is running -*/ +*/ static void restart_flicker(struct cam_data *cam) { int cam_exposure, old_exp; if(!FIRMWARE_VERSION(1,2)) return; - mutex_lock(&cam->param_lock); + down(&cam->param_lock); if(cam->params.flickerControl.flickerMode == 0 || cam->raw_image[39] == 0) { - mutex_unlock(&cam->param_lock); + up(&cam->param_lock); return; } cam_exposure = cam->raw_image[39]*2; old_exp = cam->params.exposure.coarseExpLo + - cam->params.exposure.coarseExpHi*256; - /* - see how far away camera exposure is from a valid - flicker exposure value - */ - cam_exposure %= cam->params.flickerControl.coarseJump; + cam->params.exposure.coarseExpHi*256; + /* + see how far away camera exposure is from a valid + flicker exposure value + */ + cam_exposure %= cam->params.flickerControl.coarseJump; if(!cam->params.flickerControl.disabled && - cam_exposure <= cam->params.flickerControl.coarseJump - 3) { + cam_exposure <= cam->params.flickerControl.coarseJump - 3) { /* Flicker control auto-disabled */ cam->params.flickerControl.disabled = 1; } - + if(cam->params.flickerControl.disabled && cam->params.flickerControl.flickerMode && old_exp > cam->params.flickerControl.coarseJump + - ROUND_UP_EXP_FOR_FLICKER) { + ROUND_UP_EXP_FOR_FLICKER) { /* exposure is now high enough to switch flicker control back on */ set_flicker(&cam->params, &cam->cmd_queue, 1); @@ -2801,7 +2810,7 @@ static void restart_flicker(struct cam_data *cam) cam->exposure_status = EXPOSURE_NORMAL; } - mutex_unlock(&cam->param_lock); + up(&cam->param_lock); } #undef FIRMWARE_VERSION @@ -2809,7 +2818,7 @@ static int clear_stall(struct cam_data *cam) { /* FIXME: Does this actually work? */ LOG("Clearing stall\n"); - + cam->ops->streamRead(cam->lowlevel_data, cam->raw_image, 0); do_command(cam, CPIA_COMMAND_GetCameraStatus,0,0,0,0); return cam->params.status.streamState != STREAM_PAUSED; @@ -2869,7 +2878,7 @@ static int fetch_frame(void *data) return -EINTR; do_command(cam, CPIA_COMMAND_GetCameraStatus, - 0, 0, 0, 0); + 0, 0, 0, 0); } if(cam->params.status.streamState != STREAM_READY) { continue; @@ -2894,18 +2903,18 @@ static int fetch_frame(void *data) /* Switch flicker control back on if it got turned off */ restart_flicker(cam); - + /* If AEC is enabled, monitor the exposure and adjust the sensor frame rate if needed */ if(cam->params.exposure.expMode == 2) monitor_exposure(cam); - + /* camera idle now so dispatch queued commands */ dispatch_commands(cam); /* Update our knowledge of the camera state */ - do_command(cam, CPIA_COMMAND_GetColourBalance, 0, 0, 0, 0); - do_command(cam, CPIA_COMMAND_GetExposure, 0, 0, 0, 0); + do_command(cam, CPIA_COMMAND_GetColourBalance, 0, 0, 0, 0); + do_command(cam, CPIA_COMMAND_GetExposure, 0, 0, 0, 0); do_command(cam, CPIA_COMMAND_ReadMCPorts, 0, 0, 0, 0); /* decompress and convert image to by copying it from @@ -2924,7 +2933,7 @@ static int fetch_frame(void *data) uncompressed. */ cam->first_frame = 1; do_command(cam, CPIA_COMMAND_SetGrabMode, - CPIA_GRAB_SINGLE, 0, 0, 0); + CPIA_GRAB_SINGLE, 0, 0, 0); /* FIXME: Trial & error - need up to 70ms for the grab mode change to complete ? */ msleep_interruptible(70); @@ -2948,12 +2957,12 @@ static int fetch_frame(void *data) if (cam->first_frame) { cam->first_frame = 0; do_command(cam, CPIA_COMMAND_SetCompression, - cam->params.compression.mode, + cam->params.compression.mode, cam->params.compression.decimation, 0, 0); /* Switch from single-grab to continuous grab */ do_command(cam, CPIA_COMMAND_SetGrabMode, - CPIA_GRAB_CONTINUOUS, 0, 0, 0); + CPIA_GRAB_CONTINUOUS, 0, 0, 0); } return 0; } @@ -2968,12 +2977,12 @@ static int capture_frame(struct cam_data *cam, struct video_mmap *vm) if ((err = allocate_frame_buf(cam))) return err; } - + cam->curframe = vm->frame; cam->frame[cam->curframe].state = FRAME_READY; return fetch_frame(cam); } - + static int goto_high_power(struct cam_data *cam) { if (do_command(cam, CPIA_COMMAND_GotoHiPower, 0, 0, 0, 0)) @@ -3030,22 +3039,22 @@ static void save_camera_state(struct cam_data *cam) static int set_camera_state(struct cam_data *cam) { cam->cmd_queue = COMMAND_SETCOMPRESSION | - COMMAND_SETCOMPRESSIONTARGET | - COMMAND_SETCOLOURPARAMS | - COMMAND_SETFORMAT | - COMMAND_SETYUVTHRESH | - COMMAND_SETECPTIMING | - COMMAND_SETCOMPRESSIONPARAMS | - COMMAND_SETEXPOSURE | - COMMAND_SETCOLOURBALANCE | - COMMAND_SETSENSORFPS | - COMMAND_SETAPCOR | - COMMAND_SETFLICKERCTRL | - COMMAND_SETVLOFFSET; + COMMAND_SETCOMPRESSIONTARGET | + COMMAND_SETCOLOURPARAMS | + COMMAND_SETFORMAT | + COMMAND_SETYUVTHRESH | + COMMAND_SETECPTIMING | + COMMAND_SETCOMPRESSIONPARAMS | + COMMAND_SETEXPOSURE | + COMMAND_SETCOLOURBALANCE | + COMMAND_SETSENSORFPS | + COMMAND_SETAPCOR | + COMMAND_SETFLICKERCTRL | + COMMAND_SETVLOFFSET; do_command(cam, CPIA_COMMAND_SetGrabMode, CPIA_GRAB_SINGLE,0,0,0); dispatch_commands(cam); - + /* Wait 6 frames for the sensor to get all settings and AEC/ACB to settle */ msleep_interruptible(6*(cam->params.sensorFps.baserate ? 33 : 40) * @@ -3053,7 +3062,7 @@ static int set_camera_state(struct cam_data *cam) if(signal_pending(current)) return -EINTR; - + save_camera_state(cam); return 0; @@ -3085,9 +3094,9 @@ static int reset_camera(struct cam_data *cam) if (goto_low_power(cam)) return -ENODEV; } - + /* procedure described in developer's guide p3-28 */ - + /* Check the firmware version. */ cam->params.version.firmwareVersion = 0; get_version_information(cam); @@ -3104,14 +3113,14 @@ static int reset_camera(struct cam_data *cam) cam->params.qx3.qx3_detected = (cam->params.pnpID.vendor == 0x0813 && cam->params.pnpID.product == 0x0001); - /* The fatal error checking should be done after + /* The fatal error checking should be done after * the camera powers up (developer's guide p 3-38) */ /* Set streamState before transition to high power to avoid bug * in firmware 1-02 */ do_command(cam, CPIA_COMMAND_ModifyCameraStatus, STREAMSTATE, 0, - STREAM_NOT_READY, 0); - + STREAM_NOT_READY, 0); + /* GotoHiPower */ err = goto_high_power(cam); if (err) @@ -3133,16 +3142,16 @@ static int reset_camera(struct cam_data *cam) /* Firmware 1-02 may do this for parallel port cameras, * just clear the flags (developer's guide p 3-38) */ do_command(cam, CPIA_COMMAND_ModifyCameraStatus, - FATALERROR, ~(COM_FLAG|CPIA_FLAG), 0, 0); + FATALERROR, ~(COM_FLAG|CPIA_FLAG), 0, 0); } } - + /* Check the camera status again */ if (cam->params.status.fatalError) { if (cam->params.status.fatalError) return -EIO; } - + /* VPVersion can't be retrieved before the camera is in HiPower, * so get it here instead of in get_version_information. */ do_command(cam, CPIA_COMMAND_GetVPVersion, 0, 0, 0, 0); @@ -3177,31 +3186,31 @@ static int cpia_open(struct inode *inode, struct file *file) if (!try_module_get(cam->ops->owner)) return -ENODEV; - mutex_lock(&cam->busy_lock); + down(&cam->busy_lock); err = -ENOMEM; if (!cam->raw_image) { cam->raw_image = rvmalloc(CPIA_MAX_IMAGE_SIZE); if (!cam->raw_image) goto oops; } - + if (!cam->decompressed_frame.data) { cam->decompressed_frame.data = rvmalloc(CPIA_MAX_FRAME_SIZE); if (!cam->decompressed_frame.data) goto oops; } - + /* open cpia */ err = -ENODEV; if (cam->ops->open(cam->lowlevel_data)) goto oops; - + /* reset the camera */ if ((err = reset_camera(cam)) != 0) { cam->ops->close(cam->lowlevel_data); goto oops; } - + err = -EINTR; if(signal_pending(current)) goto oops; @@ -3215,10 +3224,10 @@ static int cpia_open(struct inode *inode, struct file *file) /* init it to something */ cam->mmap_kludge = 0; - + ++cam->open_count; file->private_data = dev; - mutex_unlock(&cam->busy_lock); + up(&cam->busy_lock); return 0; oops: @@ -3230,7 +3239,7 @@ static int cpia_open(struct inode *inode, struct file *file) rvfree(cam->raw_image, CPIA_MAX_IMAGE_SIZE); cam->raw_image = NULL; } - mutex_unlock(&cam->busy_lock); + up(&cam->busy_lock); put_cam(cam->ops); return err; } @@ -3241,10 +3250,10 @@ static int cpia_close(struct inode *inode, struct file *file) struct cam_data *cam = dev->priv; if (cam->ops) { - /* Return ownership of /proc/cpia/videoX to root */ + /* Return ownership of /proc/cpia/videoX to root */ if(cam->proc_entry) cam->proc_entry->uid = 0; - + /* save camera state for later open (developers guide ch 3.5.3) */ save_camera_state(cam); @@ -3294,24 +3303,24 @@ static ssize_t cpia_read(struct file *file, char __user *buf, int err; /* make this _really_ smp and multithread-safe */ - if (mutex_lock_interruptible(&cam->busy_lock)) + if (down_interruptible(&cam->busy_lock)) return -EINTR; if (!buf) { DBG("buf NULL\n"); - mutex_unlock(&cam->busy_lock); + up(&cam->busy_lock); return -EINVAL; } if (!count) { DBG("count 0\n"); - mutex_unlock(&cam->busy_lock); + up(&cam->busy_lock); return 0; } if (!cam->ops) { DBG("ops NULL\n"); - mutex_unlock(&cam->busy_lock); + up(&cam->busy_lock); return -ENODEV; } @@ -3320,7 +3329,7 @@ static ssize_t cpia_read(struct file *file, char __user *buf, cam->mmap_kludge=0; if((err = fetch_frame(cam)) != 0) { DBG("ERROR from fetch_frame: %d\n", err); - mutex_unlock(&cam->busy_lock); + up(&cam->busy_lock); return err; } cam->decompressed_frame.state = FRAME_UNUSED; @@ -3329,17 +3338,17 @@ static ssize_t cpia_read(struct file *file, char __user *buf, if (cam->decompressed_frame.count > count) { DBG("count wrong: %d, %lu\n", cam->decompressed_frame.count, (unsigned long) count); - mutex_unlock(&cam->busy_lock); + up(&cam->busy_lock); return -EFAULT; } if (copy_to_user(buf, cam->decompressed_frame.data, - cam->decompressed_frame.count)) { + cam->decompressed_frame.count)) { DBG("copy_to_user failed\n"); - mutex_unlock(&cam->busy_lock); + up(&cam->busy_lock); return -EFAULT; } - mutex_unlock(&cam->busy_lock); + up(&cam->busy_lock); return cam->decompressed_frame.count; } @@ -3352,9 +3361,9 @@ static int cpia_do_ioctl(struct inode *inode, struct file *file, if (!cam || !cam->ops) return -ENODEV; - + /* make this _really_ smp-safe */ - if (mutex_lock_interruptible(&cam->busy_lock)) + if (down_interruptible(&cam->busy_lock)) return -EINTR; //DBG("cpia_ioctl: %u\n", ioctlnr); @@ -3396,7 +3405,7 @@ static int cpia_do_ioctl(struct inode *inode, struct file *file, v->norm = 0; break; } - + case VIDIOCSCHAN: { struct video_channel *v = arg; @@ -3415,7 +3424,7 @@ static int cpia_do_ioctl(struct inode *inode, struct file *file, *pic = cam->vp; break; } - + case VIDIOCSPICT: { struct video_picture *vp = arg; @@ -3430,7 +3439,7 @@ static int cpia_do_ioctl(struct inode *inode, struct file *file, break; } - mutex_lock(&cam->param_lock); + down(&cam->param_lock); /* brightness, colour, contrast need no check 0-65535 */ cam->vp = *vp; /* update cam->params.colourParams */ @@ -3449,15 +3458,15 @@ static int cpia_do_ioctl(struct inode *inode, struct file *file, /* Adjust flicker control if necessary */ if(cam->params.flickerControl.allowableOverExposure < 0) - cam->params.flickerControl.allowableOverExposure = + cam->params.flickerControl.allowableOverExposure = -find_over_exposure(cam->params.colourParams.brightness); if(cam->params.flickerControl.flickerMode != 0) cam->cmd_queue |= COMMAND_SETFLICKERCTRL; - + /* queue command to update camera */ cam->cmd_queue |= COMMAND_SETCOLOURPARAMS; - mutex_unlock(&cam->param_lock); + up(&cam->param_lock); DBG("VIDIOCSPICT: %d / %d // %d / %d / %d / %d\n", vp->depth, vp->palette, vp->brightness, vp->hue, vp->colour, vp->contrast); @@ -3473,7 +3482,7 @@ static int cpia_do_ioctl(struct inode *inode, struct file *file, *vw = cam->vw; break; } - + case VIDIOCSWIN: { /* copy_from_user, check validity, copy to internal structure */ @@ -3492,26 +3501,26 @@ static int cpia_do_ioctl(struct inode *inode, struct file *file, /* we set the video window to something smaller or equal to what * is requested by the user??? */ - mutex_lock(&cam->param_lock); + down(&cam->param_lock); if (vw->width != cam->vw.width || vw->height != cam->vw.height) { int video_size = match_videosize(vw->width, vw->height); if (video_size < 0) { retval = -EINVAL; - mutex_unlock(&cam->param_lock); + up(&cam->param_lock); break; } cam->video_size = video_size; /* video size is changing, reset the subcapture area */ memset(&cam->vc, 0, sizeof(cam->vc)); - + set_vw_size(cam); DBG("%d / %d\n", cam->vw.width, cam->vw.height); cam->cmd_queue |= COMMAND_SETFORMAT; } - mutex_unlock(&cam->param_lock); + up(&cam->param_lock); /* setformat ignored by camera during streaming, * so stop/dispatch/start */ @@ -3538,7 +3547,7 @@ static int cpia_do_ioctl(struct inode *inode, struct file *file, vm->offsets[i] = CPIA_MAX_FRAME_SIZE * i; break; } - + case VIDIOCMCAPTURE: { struct video_mmap *vm = arg; @@ -3588,7 +3597,7 @@ static int cpia_do_ioctl(struct inode *inode, struct file *file, /* video size is changing, reset the subcapture area */ memset(&cam->vc, 0, sizeof(cam->vc)); - + set_vw_size(cam); cam->cmd_queue |= COMMAND_SETFORMAT; dispatch_commands(cam); @@ -3599,7 +3608,7 @@ static int cpia_do_ioctl(struct inode *inode, struct file *file, break; } - + case VIDIOCSYNC: { int *frame = arg; @@ -3640,7 +3649,7 @@ static int cpia_do_ioctl(struct inode *inode, struct file *file, *vc = cam->vc; break; - } + } case VIDIOCSCAPTURE: { @@ -3656,7 +3665,7 @@ static int cpia_do_ioctl(struct inode *inode, struct file *file, retval = -EINVAL; break; } - + /* Clip to the resolution we can set for the ROI (every 8 columns and 4 rows) */ vc->x = vc->x & ~(__u32)7; @@ -3672,25 +3681,25 @@ static int cpia_do_ioctl(struct inode *inode, struct file *file, } DBG("%d,%d/%dx%d\n", vc->x,vc->y,vc->width, vc->height); - - mutex_lock(&cam->param_lock); - + + down(&cam->param_lock); + cam->vc.x = vc->x; cam->vc.y = vc->y; cam->vc.width = vc->width; cam->vc.height = vc->height; - + set_vw_size(cam); cam->cmd_queue |= COMMAND_SETFORMAT; - mutex_unlock(&cam->param_lock); + up(&cam->param_lock); /* setformat ignored by camera during streaming, * so stop/dispatch/start */ dispatch_commands(cam); break; } - + case VIDIOCGUNIT: { struct video_unit *vu = arg; @@ -3706,7 +3715,7 @@ static int cpia_do_ioctl(struct inode *inode, struct file *file, break; } - + /* pointless to implement overlay with this camera */ case VIDIOCCAPTURE: case VIDIOCGFBUF: @@ -3727,9 +3736,9 @@ static int cpia_do_ioctl(struct inode *inode, struct file *file, break; } - mutex_unlock(&cam->busy_lock); + up(&cam->busy_lock); return retval; -} +} static int cpia_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) @@ -3750,7 +3759,7 @@ static int cpia_mmap(struct file *file, struct vm_area_struct *vma) if (!cam || !cam->ops) return -ENODEV; - + DBG("cpia_mmap: %ld\n", size); if (size > FRAME_NUM*CPIA_MAX_FRAME_SIZE) @@ -3758,14 +3767,14 @@ static int cpia_mmap(struct file *file, struct vm_area_struct *vma) if (!cam || !cam->ops) return -ENODEV; - + /* make this _really_ smp-safe */ - if (mutex_lock_interruptible(&cam->busy_lock)) + if (down_interruptible(&cam->busy_lock)) return -EINTR; if (!cam->frame_buf) { /* we do lazy allocation */ if ((retval = allocate_frame_buf(cam))) { - mutex_unlock(&cam->busy_lock); + up(&cam->busy_lock); return retval; } } @@ -3774,7 +3783,7 @@ static int cpia_mmap(struct file *file, struct vm_area_struct *vma) while (size > 0) { page = vmalloc_to_pfn((void *)pos); if (remap_pfn_range(vma, start, page, PAGE_SIZE, PAGE_SHARED)) { - mutex_unlock(&cam->busy_lock); + up(&cam->busy_lock); return -EAGAIN; } start += PAGE_SIZE; @@ -3786,7 +3795,7 @@ static int cpia_mmap(struct file *file, struct vm_area_struct *vma) } DBG("cpia_mmap: %ld\n", size); - mutex_unlock(&cam->busy_lock); + up(&cam->busy_lock); return 0; } @@ -3842,11 +3851,11 @@ static void reset_camera_struct(struct cam_data *cam) cam->params.flickerControl.flickerMode = 0; cam->params.flickerControl.disabled = 1; - cam->params.flickerControl.coarseJump = + cam->params.flickerControl.coarseJump = flicker_jumps[cam->mainsFreq] - [cam->params.sensorFps.baserate] - [cam->params.sensorFps.divisor]; - cam->params.flickerControl.allowableOverExposure = + [cam->params.sensorFps.baserate] + [cam->params.sensorFps.divisor]; + cam->params.flickerControl.allowableOverExposure = -find_over_exposure(cam->params.colourParams.brightness); cam->params.vlOffset.gain1 = 20; cam->params.vlOffset.gain2 = 24; @@ -3861,21 +3870,21 @@ static void reset_camera_struct(struct cam_data *cam) cam->params.compressionParams.qDiffStepThresh = 3; cam->params.compressionParams.decimationThreshMod = 2; /* End of default values from Software Developer's Guide */ - + cam->transfer_rate = 0; cam->exposure_status = EXPOSURE_NORMAL; - + /* Set Sensor FPS to 15fps. This seems better than 30fps * for indoor lighting. */ cam->params.sensorFps.divisor = 1; cam->params.sensorFps.baserate = 1; - + cam->params.yuvThreshold.yThreshold = 6; /* From windows driver */ cam->params.yuvThreshold.uvThreshold = 6; /* From windows driver */ - + cam->params.format.subSample = SUBSAMPLE_422; cam->params.format.yuvOrder = YUVORDER_YUYV; - + cam->params.compression.mode = CPIA_COMPRESSION_AUTO; cam->params.compressionTarget.frTargeting = CPIA_COMPRESSION_TARGET_QUALITY; @@ -3889,7 +3898,7 @@ static void reset_camera_struct(struct cam_data *cam) cam->params.qx3.cradled = 0; cam->video_size = VIDEOSIZE_CIF; - + cam->vp.colour = 32768; /* 50% */ cam->vp.hue = 32768; /* 50% */ cam->vp.brightness = 32768; /* 50% */ @@ -3902,7 +3911,7 @@ static void reset_camera_struct(struct cam_data *cam) cam->vc.y = 0; cam->vc.width = 0; cam->vc.height = 0; - + cam->vw.x = 0; cam->vw.y = 0; set_vw_size(cam); @@ -3919,7 +3928,7 @@ static void reset_camera_struct(struct cam_data *cam) /* initialize cam_data structure */ static void init_camera_struct(struct cam_data *cam, - struct cpia_camera_ops *ops ) + struct cpia_camera_ops *ops ) { int i; @@ -3927,8 +3936,8 @@ static void init_camera_struct(struct cam_data *cam, memset(cam, 0, sizeof(struct cam_data)); cam->ops = ops; - mutex_init(&cam->param_lock); - mutex_init(&cam->busy_lock); + init_MUTEX(&cam->param_lock); + init_MUTEX(&cam->busy_lock); reset_camera_struct(cam); @@ -3936,7 +3945,7 @@ static void init_camera_struct(struct cam_data *cam, memcpy(&cam->vdev, &cpia_template, sizeof(cpia_template)); cam->vdev.priv = cam; - + cam->curframe = 0; for (i = 0; i < FRAME_NUM; i++) { cam->frame[i].width = 0; @@ -3952,15 +3961,15 @@ static void init_camera_struct(struct cam_data *cam, struct cam_data *cpia_register_camera(struct cpia_camera_ops *ops, void *lowlevel) { - struct cam_data *camera; - + struct cam_data *camera; + if ((camera = kmalloc(sizeof(struct cam_data), GFP_KERNEL)) == NULL) return NULL; - + init_camera_struct( camera, ops ); camera->lowlevel_data = lowlevel; - + /* register v4l device */ if (video_register_device(&camera->vdev, VFL_TYPE_GRABBER, video_nr) == -1) { kfree(camera); @@ -3973,7 +3982,7 @@ struct cam_data *cpia_register_camera(struct cpia_camera_ops *ops, void *lowleve /* open cpia */ if (camera->ops->open(camera->lowlevel_data)) return camera; - + /* reset the camera */ if (reset_camera(camera) != 0) { camera->ops->close(camera->lowlevel_data); @@ -4013,11 +4022,11 @@ void cpia_unregister_camera(struct cam_data *cam) DBG("camera open -- setting ops to NULL\n"); cam->ops = NULL; } - + #ifdef CONFIG_PROC_FS DBG("destroying /proc/cpia/video%d\n", cam->vdev.minor); destroy_proc_cpia_cam(cam); -#endif +#endif if (!cam->open_count) { DBG("freeing camera\n"); kfree(cam); @@ -4033,12 +4042,19 @@ static int __init cpia_init(void) "allowed, it is disabled by default now. Users should fix the " "applications in case they don't work without conversion " "reenabled by setting the 'colorspace_conv' module " - "parameter to 1\n"); + "parameter to 1"); #ifdef CONFIG_PROC_FS proc_cpia_create(); #endif +#ifdef CONFIG_VIDEO_CPIA_PP + cpia_pp_init(); +#endif +#ifdef CONFIG_VIDEO_CPIA_USB + cpia_usb_init(); +#endif + return 0; } diff --git a/drivers/media/video/cpia.h b/drivers/media/video/cpia.h index 6eaa69202..f629b693e 100644 --- a/drivers/media/video/cpia.h +++ b/drivers/media/video/cpia.h @@ -45,18 +45,16 @@ #include #include -#include #include #include -#include struct cpia_camera_ops { /* open sets privdata to point to structure for this camera. - * Returns negative value on error, otherwise 0. + * Returns negative value on error, otherwise 0. */ int (*open)(void *privdata); - + /* Registers callback function cb to be called with cbdata * when an image is ready. If cb is NULL, only single image grabs * should be used. cb should immediately call streamRead to read @@ -64,8 +62,8 @@ struct cpia_camera_ops * otherwise 0. */ int (*registerCallback)(void *privdata, void (*cb)(void *cbdata), - void *cbdata); - + void *cbdata); + /* transferCmd sends commands to the camera. command MUST point to * an 8 byte buffer in kernel space. data can be NULL if no extra * data is needed. The size of the data is given by the last 2 @@ -78,30 +76,30 @@ struct cpia_camera_ops * Returns negative value on error, otherwise 0. */ int (*streamStart)(void *privdata); - + /* streamStop terminates stream capture mode. * Returns negative value on error, otherwise 0. */ int (*streamStop)(void *privdata); - + /* streamRead reads a frame from the camera. buffer points to a - * buffer large enough to hold a complete frame in kernel space. - * noblock indicates if this should be a non blocking read. + * buffer large enough to hold a complete frame in kernel space. + * noblock indicates if this should be a non blocking read. * Returns the number of bytes read, or negative value on error. - */ + */ int (*streamRead)(void *privdata, u8 *buffer, int noblock); - + /* close disables the device until open() is called again. * Returns negative value on error, otherwise 0. */ int (*close)(void *privdata); - + /* If wait_for_stream_ready is non-zero, wait until the streamState * is STREAM_READY before calling streamRead. */ int wait_for_stream_ready; - /* + /* * Used to maintain lowlevel module usage counts */ struct module *owner; @@ -216,14 +214,14 @@ struct cam_params { u8 videoSize; /* CIF/QCIF */ u8 subSample; u8 yuvOrder; - } format; - struct { /* Intel QX3 specific data */ - u8 qx3_detected; /* a QX3 is present */ - u8 toplight; /* top light lit , R/W */ - u8 bottomlight; /* bottom light lit, R/W */ - u8 button; /* snapshot button pressed (R/O) */ - u8 cradled; /* microscope is in cradle (R/O) */ - } qx3; + } format; + struct { /* Intel QX3 specific data */ + u8 qx3_detected; /* a QX3 is present */ + u8 toplight; /* top light lit , R/W */ + u8 bottomlight; /* bottom light lit, R/W */ + u8 button; /* snapshot button pressed (R/O) */ + u8 cradled; /* microscope is in cradle (R/O) */ + } qx3; struct { u8 colStart; /* skip first 8*colStart pixels */ u8 colEnd; /* finish at 8*colEnd pixels */ @@ -248,13 +246,13 @@ enum v4l_camstates { struct cam_data { struct list_head cam_data_list; - struct mutex busy_lock; /* guard against SMP multithreading */ + struct semaphore busy_lock; /* guard against SMP multithreading */ struct cpia_camera_ops *ops; /* lowlevel driver operations */ void *lowlevel_data; /* private data for lowlevel driver */ u8 *raw_image; /* buffer for raw image data */ struct cpia_frame decompressed_frame; - /* buffer to hold decompressed frame */ - int image_size; /* sizeof last decompressed image */ + /* buffer to hold decompressed frame */ + int image_size; /* sizeof last decompressed image */ int open_count; /* # of process that have camera open */ /* camera status */ @@ -263,10 +261,10 @@ struct cam_data { u8 mainsFreq; /* for flicker control */ /* proc interface */ - struct mutex param_lock; /* params lock for this camera */ + struct semaphore param_lock; /* params lock for this camera */ struct cam_params params; /* camera settings */ struct proc_dir_entry *proc_entry; /* /proc/cpia/videoX */ - + /* v4l */ int video_size; /* VIDEO_SIZE_ */ volatile enum v4l_camstates camstate; /* v4l layer status */ @@ -278,7 +276,7 @@ struct cam_data { /* mmap interface */ int curframe; /* the current frame to grab into */ u8 *frame_buf; /* frame buffer data */ - struct cpia_frame frame[FRAME_NUM]; + struct cpia_frame frame[FRAME_NUM]; /* FRAME_NUM-buffering, so we need a array */ int first_frame; @@ -425,7 +423,7 @@ void cpia_unregister_camera(struct cam_data *cam); #define DEB_BYTE(p)\ DBG("%1d %1d %1d %1d %1d %1d %1d %1d \n",\ (p)&0x80?1:0, (p)&0x40?1:0, (p)&0x20?1:0, (p)&0x10?1:0,\ - (p)&0x08?1:0, (p)&0x04?1:0, (p)&0x02?1:0, (p)&0x01?1:0); + (p)&0x08?1:0, (p)&0x04?1:0, (p)&0x02?1:0, (p)&0x01?1:0); #endif /* __KERNEL__ */ diff --git a/drivers/media/video/cpia_pp.c b/drivers/media/video/cpia_pp.c index 41f4b8d17..74cff626e 100644 --- a/drivers/media/video/cpia_pp.c +++ b/drivers/media/video/cpia_pp.c @@ -23,8 +23,9 @@ */ /* define _CPIA_DEBUG_ for verbose debug output (see cpia.h) */ -/* #define _CPIA_DEBUG_ 1 */ +/* #define _CPIA_DEBUG_ 1 */ +#include #include #include @@ -44,7 +45,7 @@ static int cpia_pp_open(void *privdata); static int cpia_pp_registerCallback(void *privdata, void (*cb) (void *cbdata), - void *cbdata); + void *cbdata); static int cpia_pp_transferCmd(void *privdata, u8 *command, u8 *data); static int cpia_pp_streamStart(void *privdata); static int cpia_pp_streamStop(void *privdata); @@ -92,7 +93,7 @@ struct pp_cam_entry { int stream_irq; }; -static struct cpia_camera_ops cpia_pp_ops = +static struct cpia_camera_ops cpia_pp_ops = { cpia_pp_open, cpia_pp_registerCallback, @@ -122,7 +123,7 @@ static void cpia_parport_disable_irq( struct parport *port ) { } /* Special CPiA PPC modes: These are invoked by using the 1284 Extensibility - * Link Flag during negotiation */ + * Link Flag during negotiation */ #define UPLOAD_FLAG 0x08 #define NIBBLE_TRANSFER 0x01 #define ECP_TRANSFER 0x03 @@ -138,17 +139,17 @@ static void cpia_parport_disable_irq( struct parport *port ) { /* CPiA nonstandard "Nibble" mode (no nDataAvail signal after each byte). */ /* The standard kernel parport_ieee1284_read_nibble() fails with the CPiA... */ -static size_t cpia_read_nibble (struct parport *port, - void *buffer, size_t len, +static size_t cpia_read_nibble (struct parport *port, + void *buffer, size_t len, int flags) { - /* adapted verbatim, with one change, from + /* adapted verbatim, with one change, from parport_ieee1284_read_nibble() in drivers/parport/ieee1284-ops.c */ unsigned char *buf = buffer; int i; unsigned char byte = 0; - + len *= 2; /* in nibbles */ for (i=0; i < len; i++) { unsigned char nibble; @@ -157,12 +158,12 @@ static size_t cpia_read_nibble (struct parport *port, * after every second nibble to signal that more * data is available. (the total number of Bytes that * should be sent is known; if too few are received, an error - * will be recorded after a timeout). + * will be recorded after a timeout). * This is incompatible with parport_ieee1284_read_nibble(), * which expects to find nFault LO after every second nibble. */ - /* Solution: modify cpia_read_nibble to only check for + /* Solution: modify cpia_read_nibble to only check for * nDataAvail before the first nibble is sent. */ @@ -215,7 +216,7 @@ static size_t cpia_read_nibble (struct parport *port, /* Second nibble */ byte |= nibble << 4; *buf++ = byte; - } else + } else byte = nibble; } @@ -237,18 +238,18 @@ static size_t cpia_read_nibble (struct parport *port, } /* CPiA nonstandard "Nibble Stream" mode (2 nibbles per cycle, instead of 1) - * (See CPiA Data sheet p. 31) - * - * "Nibble Stream" mode used by CPiA for uploads to non-ECP ports is a - * nonstandard variant of nibble mode which allows the same (mediocre) - * data flow of 8 bits per cycle as software-enabled ECP by TRISTATE-capable + * (See CPiA Data sheet p. 31) + * + * "Nibble Stream" mode used by CPiA for uploads to non-ECP ports is a + * nonstandard variant of nibble mode which allows the same (mediocre) + * data flow of 8 bits per cycle as software-enabled ECP by TRISTATE-capable * parallel ports, but works also for non-TRISTATE-capable ports. * (Standard nibble mode only send 4 bits per cycle) * */ -static size_t cpia_read_nibble_stream(struct parport *port, - void *buffer, size_t len, +static size_t cpia_read_nibble_stream(struct parport *port, + void *buffer, size_t len, int flags) { int i; @@ -259,7 +260,7 @@ static size_t cpia_read_nibble_stream(struct parport *port, unsigned char nibble[2], byte = 0; int j; - /* Image Data is complete when 4 consecutive EOI bytes (0xff) are seen */ + /* Image Data is complete when 4 consecutive EOI bytes (0xff) are seen */ if (endseen > 3 ) break; @@ -267,7 +268,7 @@ static size_t cpia_read_nibble_stream(struct parport *port, parport_frob_control (port, PARPORT_CONTROL_AUTOFD, PARPORT_CONTROL_AUTOFD); - + /* Event 9: nAck goes low. */ port->ieee1284.phase = IEEE1284_PH_REV_DATA; if (parport_wait_peripheral (port, @@ -281,7 +282,7 @@ static size_t cpia_read_nibble_stream(struct parport *port, /* Read lower nibble */ nibble[0] = parport_read_status (port) >>3; - + /* Event 10: Set nAutoFd high. */ parport_frob_control (port, PARPORT_CONTROL_AUTOFD, 0); @@ -294,10 +295,10 @@ static size_t cpia_read_nibble_stream(struct parport *port, port->name); break; } - + /* Read upper nibble */ nibble[1] = parport_read_status (port) >>3; - + /* reassemble the byte */ for (j = 0; j < 2 ; j++ ) { nibble[j] &= ~8; @@ -334,8 +335,8 @@ static void EndTransferMode(struct pp_cam_entry *cam) static int ForwardSetup(struct pp_cam_entry *cam) { int retry; - - /* The CPiA uses ECP protocol for Downloads from the Host to the camera. + + /* The CPiA uses ECP protocol for Downloads from the Host to the camera. * This will be software-emulated if ECP hardware is not present */ @@ -374,9 +375,9 @@ static int ReverseSetup(struct pp_cam_entry *cam, int extensibility) upload_mode = mode; if(extensibility) mode = UPLOAD_FLAG|transfer_mode|IEEE1284_EXT_LINK; - /* the usual camera maximum response time is 10ms, but after + /* the usual camera maximum response time is 10ms, but after * receiving some commands, it needs up to 40ms. */ - + for(retry = 0; retry < 4; ++retry) { if(!parport_negotiate(cam->port, mode)) { break; @@ -438,10 +439,10 @@ static int ReadPacket(struct pp_cam_entry *cam, u8 *packet, size_t size) /* support for CPiA variant nibble reads */ if(cam->port->ieee1284.mode == IEEE1284_MODE_NIBBLE) { - if(cpia_read_nibble(cam->port, packet, size, 0) != size) - retval = -EIO; + if(cpia_read_nibble(cam->port, packet, size, 0) != size) + retval = -EIO; } else { - if(parport_read(cam->port, packet, size) != size) + if(parport_read(cam->port, packet, size) != size) retval = -EIO; } EndTransferMode(cam); @@ -541,18 +542,18 @@ static int cpia_pp_streamRead(void *privdata, u8 *buffer, int noblock) block_size = PARPORT_CHUNK_SIZE; while( !cam->image_complete ) { cond_resched(); - + new_bytes = cpia_pp_read(cam->port, buffer, block_size ); if( new_bytes <= 0 ) { break; } i=-1; while(++iopen_count == 0) { if (parport_claim(cam->pdev)) { DBG("failed to claim the port\n"); @@ -644,12 +645,12 @@ static int cpia_pp_open(void *privdata) parport_write_control(cam->port, PARPORT_CONTROL_SELECT); udelay(50); parport_write_control(cam->port, - PARPORT_CONTROL_SELECT - | PARPORT_CONTROL_INIT); + PARPORT_CONTROL_SELECT + | PARPORT_CONTROL_INIT); } - + ++cam->open_count; - + return 0; } @@ -662,7 +663,7 @@ static int cpia_pp_registerCallback(void *privdata, void (*cb)(void *cbdata), vo { struct pp_cam_entry *cam = privdata; int retval = 0; - + if(cam->port->irq != PARPORT_IRQ_NONE) { INIT_WORK(&cam->cb_task, cb, cbdata); } else { @@ -706,9 +707,9 @@ static int cpia_pp_register(struct parport *port) LOG("failed to allocate camera structure\n"); return -ENOMEM; } - + pdev = parport_register_device(port, "cpia_pp", NULL, NULL, - NULL, 0, cam); + NULL, 0, cam); if (!pdev) { LOG("failed to parport_register_device\n"); @@ -752,19 +753,19 @@ static void cpia_pp_detach (struct parport *port) } cpia = NULL; } - spin_unlock( &cam_list_lock_pp ); + spin_unlock( &cam_list_lock_pp ); if (!cpia) { DBG("cpia_pp_detach failed to find cam_data in cam_list\n"); return; } - - cam = (struct pp_cam_entry *) cpia->lowlevel_data; + + cam = (struct pp_cam_entry *) cpia->lowlevel_data; cpia_unregister_camera(cpia); - if(cam->open_count > 0) + if(cam->open_count > 0) cpia_pp_close(cam); parport_unregister_device(cam->pdev); - cpia->lowlevel_data = NULL; + cpia->lowlevel_data = NULL; kfree(cam); } @@ -802,16 +803,16 @@ static struct parport_driver cpia_pp_driver = { .detach = cpia_pp_detach, }; -static int cpia_pp_init(void) +int cpia_pp_init(void) { - printk(KERN_INFO "%s v%d.%d.%d\n",ABOUT, + printk(KERN_INFO "%s v%d.%d.%d\n",ABOUT, CPIA_PP_MAJ_VER,CPIA_PP_MIN_VER,CPIA_PP_PATCH_VER); if(parport_nr[0] == PPCPIA_PARPORT_OFF) { printk(" disabled\n"); return 0; } - + spin_lock_init( &cam_list_lock_pp ); if (parport_register_driver (&cpia_pp_driver)) { @@ -859,8 +860,6 @@ void cleanup_module(void) static int __init cpia_pp_setup(char *str) { - int err; - if (!strncmp(str, "parport", 7)) { int n = simple_strtoul(str + 7, NULL, 10); if (parport_ptr < PARPORT_MAX) { @@ -874,11 +873,7 @@ static int __init cpia_pp_setup(char *str) parport_nr[parport_ptr++] = PPCPIA_PARPORT_NONE; } - err=cpia_pp_init(); - if (err) - return err; - - return 1; + return 0; } __setup("cpia_pp=", cpia_pp_setup); diff --git a/drivers/media/video/cpia_usb.c b/drivers/media/video/cpia_usb.c index 2ee34a3b9..03275c37c 100644 --- a/drivers/media/video/cpia_usb.c +++ b/drivers/media/video/cpia_usb.c @@ -22,7 +22,7 @@ */ /* define _CPIA_DEBUG_ for verbose debug output (see cpia.h) */ -/* #define _CPIA_DEBUG_ 1 */ +/* #define _CPIA_DEBUG_ 1 */ #include #include @@ -85,7 +85,7 @@ struct usb_cpia { static int cpia_usb_open(void *privdata); static int cpia_usb_registerCallback(void *privdata, void (*cb) (void *cbdata), - void *cbdata); + void *cbdata); static int cpia_usb_transferCmd(void *privdata, u8 *command, u8 *data); static int cpia_usb_streamStart(void *privdata); static int cpia_usb_streamStop(void *privdata); @@ -127,7 +127,7 @@ static void cpia_usb_complete(struct urb *urb, struct pt_regs *regs) ucpia->workbuff->status = FRAME_READING; ucpia->workbuff->length = 0; } - + for (i = 0; i < urb->number_of_packets; i++) { int n = urb->iso_frame_desc[i].actual_length; int st = urb->iso_frame_desc[i].status; @@ -141,9 +141,9 @@ static void cpia_usb_complete(struct urb *urb, struct pt_regs *regs) printk(KERN_DEBUG "cpia: scratch buf overflow!scr_len: %d, n: %d\n", ucpia->workbuff->length, n); return; } - + if (n) { - if ((ucpia->workbuff->length > 0) || + if ((ucpia->workbuff->length > 0) || (0x19 == cdata[0] && 0x68 == cdata[1])) { memcpy(ucpia->workbuff->data + ucpia->workbuff->length, cdata, n); ucpia->workbuff->length += n; @@ -160,7 +160,7 @@ static void cpia_usb_complete(struct urb *urb, struct pt_regs *regs) ucpia->workbuff = ucpia->workbuff->next; ucpia->workbuff->status = FRAME_EMPTY; ucpia->workbuff->length = 0; - + if (waitqueue_active(&ucpia->wq_stream)) wake_up_interruptible(&ucpia->wq_stream); } @@ -178,7 +178,7 @@ static int cpia_usb_open(void *privdata) struct usb_cpia *ucpia = (struct usb_cpia *) privdata; struct urb *urb; int ret, retval = 0, fx, err; - + if (!ucpia) return -EINVAL; @@ -191,7 +191,7 @@ static int cpia_usb_open(void *privdata) retval = -EINVAL; goto error_0; } - + ret = usb_set_interface(ucpia->dev, ucpia->iface, 3); if (ret < 0) { printk(KERN_ERR "cpia_usb_open: usb_set_interface error (ret = %d)\n", ret); @@ -286,7 +286,7 @@ error_1: error_0: kfree (ucpia->sbuf[0].data); ucpia->sbuf[0].data = NULL; - + return retval; } @@ -307,7 +307,7 @@ static int WritePacket(struct usb_device *udev, const u8 *packet, u8 *buf, size_ return usb_control_msg(udev, usb_sndctrlpipe(udev, 0), packet[1] + (packet[0] << 8), USB_TYPE_VENDOR | USB_RECIP_DEVICE, - packet[2] + (packet[3] << 8), + packet[2] + (packet[3] << 8), packet[4] + (packet[5] << 8), buf, size, 1000); } @@ -324,7 +324,7 @@ static int ReadPacket(struct usb_device *udev, u8 *packet, u8 *buf, size_t size) return usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), packet[1] + (packet[0] << 8), USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, - packet[2] + (packet[3] << 8), + packet[2] + (packet[3] << 8), packet[4] + (packet[5] << 8), buf, size, 1000); } @@ -393,7 +393,7 @@ static int cpia_usb_streamRead(void *privdata, u8 *frame, int noblock) if (!ucpia || !ucpia->present) return -1; - + if (ucpia->curbuff->status != FRAME_READY) interruptible_sleep_on(&ucpia->wq_stream); else @@ -403,7 +403,7 @@ static int cpia_usb_streamRead(void *privdata, u8 *frame, int noblock) if (!mybuff) return -1; - + if (mybuff->status != FRAME_READY || mybuff->length < 4) { DBG("Something went wrong!\n"); return -1; @@ -411,7 +411,7 @@ static int cpia_usb_streamRead(void *privdata, u8 *frame, int noblock) memcpy(frame, mybuff->data, mybuff->length); mybuff->status = FRAME_EMPTY; - + /* DBG("read done, %d bytes, Header: %x/%x, Footer: %x%x%x%x\n", */ /* mybuff->length, frame[0], frame[1], */ /* frame[mybuff->length-4], frame[mybuff->length-3], */ @@ -447,7 +447,7 @@ static void cpia_usb_free_resources(struct usb_cpia *ucpia, int try) kfree(ucpia->sbuf[1].data); ucpia->sbuf[1].data = NULL; - + if (ucpia->sbuf[0].urb) { usb_kill_urb(ucpia->sbuf[0].urb); usb_free_urb(ucpia->sbuf[0].urb); @@ -474,6 +474,12 @@ static int cpia_usb_close(void *privdata) return 0; } +int cpia_usb_init(void) +{ + /* return -ENODEV; */ + return 0; +} + /* Probing and initializing */ static int cpia_probe(struct usb_interface *intf, @@ -484,7 +490,7 @@ static int cpia_probe(struct usb_interface *intf, struct usb_cpia *ucpia; struct cam_data *cam; int ret; - + /* A multi-config CPiA camera? */ if (udev->descriptor.bNumConfigurations != 1) return -ENODEV; @@ -533,7 +539,7 @@ static int cpia_probe(struct usb_interface *intf, /* Before register_camera, important */ ucpia->present = 1; - + cam = cpia_register_camera(&cpia_usb_ops, ucpia); if (!cam) { LOG("failed to cpia_register_camera\n"); @@ -585,7 +591,7 @@ static void cpia_disconnect(struct usb_interface *intf) struct cam_data *cam = usb_get_intfdata(intf); struct usb_cpia *ucpia; struct usb_device *udev; - + usb_set_intfdata(intf, NULL); if (!cam) return; @@ -594,7 +600,7 @@ static void cpia_disconnect(struct usb_interface *intf) spin_lock( &cam_list_lock_usb ); list_del(&cam->cam_data_list); spin_unlock( &cam_list_lock_usb ); - + ucpia->present = 0; cpia_unregister_camera(cam); @@ -625,7 +631,7 @@ static void cpia_disconnect(struct usb_interface *intf) static int __init usb_cpia_init(void) { - printk(KERN_INFO "%s v%d.%d.%d\n",ABOUT, + printk(KERN_INFO "%s v%d.%d.%d\n",ABOUT, CPIA_USB_MAJ_VER,CPIA_USB_MIN_VER,CPIA_USB_PATCH_VER); spin_lock_init(&cam_list_lock_usb); diff --git a/drivers/media/video/cs53l32a.c b/drivers/media/video/cs53l32a.c index de87247c7..8739c6478 100644 --- a/drivers/media/video/cs53l32a.c +++ b/drivers/media/video/cs53l32a.c @@ -59,25 +59,25 @@ static int cs53l32a_read(struct i2c_client *client, u8 reg) static int cs53l32a_command(struct i2c_client *client, unsigned int cmd, void *arg) { - struct v4l2_routing *route = arg; + struct v4l2_audio *input = arg; struct v4l2_control *ctrl = arg; switch (cmd) { - case VIDIOC_INT_G_AUDIO_ROUTING: - route->input = (cs53l32a_read(client, 0x01) >> 4) & 3; - route->output = 0; - break; - - case VIDIOC_INT_S_AUDIO_ROUTING: + case VIDIOC_S_AUDIO: /* There are 2 physical inputs, but the second input can be placed in two modes, the first mode bypasses the PGA (gain), the second goes through the PGA. Hence there are three possible inputs to choose from. */ - if (route->input > 2) { - v4l_err(client, "Invalid input %d.\n", route->input); + if (input->index > 2) { + v4l_err(client, "Invalid input %d.\n", input->index); return -EINVAL; } - cs53l32a_write(client, 0x01, 0x01 + (route->input << 4)); + cs53l32a_write(client, 0x01, 0x01 + (input->index << 4)); + break; + + case VIDIOC_G_AUDIO: + memset(input, 0, sizeof(*input)); + input->index = (cs53l32a_read(client, 0x01) >> 4) & 3; break; case VIDIOC_G_CTRL: diff --git a/drivers/media/video/cs8420.h b/drivers/media/video/cs8420.h index 621c0c667..2b22f3a38 100644 --- a/drivers/media/video/cs8420.h +++ b/drivers/media/video/cs8420.h @@ -20,7 +20,7 @@ #define __CS8420_H__ /* Initialization Sequence */ - + static __u8 init8420[] = { 1, 0x01, 2, 0x02, 3, 0x00, 4, 0x46, 5, 0x24, 6, 0x84, 18, 0x18, 19, 0x13, diff --git a/drivers/media/video/cx25840/Makefile b/drivers/media/video/cx25840/Makefile index 6e8665be8..543ebacdc 100644 --- a/drivers/media/video/cx25840/Makefile +++ b/drivers/media/video/cx25840/Makefile @@ -1,6 +1,6 @@ cx25840-objs := cx25840-core.o cx25840-audio.o cx25840-firmware.o \ cx25840-vbi.o -obj-$(CONFIG_VIDEO_CX25840) += cx25840.o +obj-$(CONFIG_VIDEO_DECODER) += cx25840.o -EXTRA_CFLAGS += -Idrivers/media/video +EXTRA_CFLAGS += -I$(src)/.. diff --git a/drivers/media/video/cx25840/cx25840-audio.c b/drivers/media/video/cx25840/cx25840-audio.c index f897c1ebd..cb9a7981e 100644 --- a/drivers/media/video/cx25840/cx25840-audio.c +++ b/drivers/media/video/cx25840/cx25840-audio.c @@ -18,10 +18,10 @@ #include #include +#include #include -#include -#include "cx25840-core.h" +#include "cx25840.h" static int set_audclk_freq(struct i2c_client *client, u32 freq) { @@ -30,6 +30,9 @@ static int set_audclk_freq(struct i2c_client *client, u32 freq) if (freq != 32000 && freq != 44100 && freq != 48000) return -EINVAL; + /* assert soft reset */ + cx25840_and_or(client, 0x810, ~0x1, 0x01); + /* common for all inputs and rates */ /* SA_MCLK_SEL=1, SA_MCLK_DIV=0x10 */ cx25840_write(client, 0x127, 0x50); @@ -43,9 +46,6 @@ static int set_audclk_freq(struct i2c_client *client, u32 freq) /* AUX_PLL_FRAC */ cx25840_write4(client, 0x110, 0xee39bb01); - if (state->is_cx25836) - break; - /* src3/4/6_ctl = 0x0801f77f */ cx25840_write4(client, 0x900, 0x7ff70108); cx25840_write4(client, 0x904, 0x7ff70108); @@ -59,9 +59,6 @@ static int set_audclk_freq(struct i2c_client *client, u32 freq) /* AUX_PLL_FRAC */ cx25840_write4(client, 0x110, 0xd66bec00); - if (state->is_cx25836) - break; - /* src3/4/6_ctl = 0x08016d59 */ cx25840_write4(client, 0x900, 0x596d0108); cx25840_write4(client, 0x904, 0x596d0108); @@ -75,9 +72,6 @@ static int set_audclk_freq(struct i2c_client *client, u32 freq) /* AUX_PLL_FRAC */ cx25840_write4(client, 0x110, 0xe5d69800); - if (state->is_cx25836) - break; - /* src3/4/6_ctl = 0x08014faa */ cx25840_write4(client, 0x900, 0xaa4f0108); cx25840_write4(client, 0x904, 0xaa4f0108); @@ -93,9 +87,6 @@ static int set_audclk_freq(struct i2c_client *client, u32 freq) /* AUX_PLL_FRAC */ cx25840_write4(client, 0x110, 0x69082a01); - if (state->is_cx25836) - break; - /* src1_ctl = 0x08010000 */ cx25840_write4(client, 0x8f8, 0x00000108); @@ -115,9 +106,6 @@ static int set_audclk_freq(struct i2c_client *client, u32 freq) /* AUX_PLL_FRAC */ cx25840_write4(client, 0x110, 0xd66bec00); - if (state->is_cx25836) - break; - /* src1_ctl = 0x08010000 */ cx25840_write4(client, 0x8f8, 0xcd600108); @@ -134,9 +122,6 @@ static int set_audclk_freq(struct i2c_client *client, u32 freq) /* AUX_PLL_FRAC */ cx25840_write4(client, 0x110, 0xe5d69800); - if (state->is_cx25836) - break; - /* src1_ctl = 0x08010000 */ cx25840_write4(client, 0x8f8, 0x00800108); @@ -148,6 +133,9 @@ static int set_audclk_freq(struct i2c_client *client, u32 freq) } } + /* deassert soft reset */ + cx25840_and_or(client, 0x810, ~0x1, 0x00); + state->audclk_freq = freq; return 0; @@ -160,10 +148,6 @@ void cx25840_audio_set_path(struct i2c_client *client) /* stop microcontroller */ cx25840_and_or(client, 0x803, ~0x10, 0); - /* assert soft reset */ - if (!state->is_cx25836) - cx25840_and_or(client, 0x810, ~0x1, 0x01); - /* Mute everything to prevent the PFFT! */ cx25840_write(client, 0x8d3, 0x1f); @@ -177,19 +161,13 @@ void cx25840_audio_set_path(struct i2c_client *client) } else { /* Set Path1 to Analog Demod Main Channel */ cx25840_write4(client, 0x8d0, 0x7038061f); - } - set_audclk_freq(client, state->audclk_freq); - - /* deassert soft reset */ - if (!state->is_cx25836) - cx25840_and_or(client, 0x810, ~0x1, 0x00); - - if (state->aud_input != CX25840_AUDIO_SERIAL) { /* When the microcontroller detects the * audio format, it will unmute the lines */ cx25840_and_or(client, 0x803, ~0x10, 0x10); } + + set_audclk_freq(client, state->audclk_freq); } static int get_volume(struct i2c_client *client) @@ -313,25 +291,11 @@ static void set_mute(struct i2c_client *client, int mute) int cx25840_audio(struct i2c_client *client, unsigned int cmd, void *arg) { - struct cx25840_state *state = i2c_get_clientdata(client); struct v4l2_control *ctrl = arg; - int retval; switch (cmd) { case VIDIOC_INT_AUDIO_CLOCK_FREQ: - if (state->aud_input != CX25840_AUDIO_SERIAL) { - cx25840_and_or(client, 0x803, ~0x10, 0); - cx25840_write(client, 0x8d3, 0x1f); - } - if (!state->is_cx25836) - cx25840_and_or(client, 0x810, ~0x1, 1); - retval = set_audclk_freq(client, *(u32 *)arg); - if (!state->is_cx25836) - cx25840_and_or(client, 0x810, ~0x1, 0); - if (state->aud_input != CX25840_AUDIO_SERIAL) { - cx25840_and_or(client, 0x803, ~0x10, 0x10); - } - return retval; + return set_audclk_freq(client, *(u32 *)arg); case VIDIOC_G_CTRL: switch (ctrl->id) { diff --git a/drivers/media/video/cx25840/cx25840-core.c b/drivers/media/video/cx25840/cx25840-core.c index 7bb7589a0..5588b9a5c 100644 --- a/drivers/media/video/cx25840/cx25840-core.c +++ b/drivers/media/video/cx25840/cx25840-core.c @@ -10,9 +10,6 @@ * * VBI support by Hans Verkuil . * - * NTSC sliced VBI support by Christopher Neufeld - * with additional fixes by Hans Verkuil . - * * This 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 @@ -34,10 +31,10 @@ #include #include #include +#include #include -#include -#include "cx25840-core.h" +#include "cx25840.h" MODULE_DESCRIPTION("Conexant CX25840 audio/video decoder driver"); MODULE_AUTHOR("Ulf Eklund, Chris Kennedy, Hans Verkuil, Tyler Trafford"); @@ -46,7 +43,7 @@ MODULE_LICENSE("GPL"); static unsigned short normal_i2c[] = { 0x88 >> 1, I2C_CLIENT_END }; -int cx25840_debug; +static int cx25840_debug; module_param_named(debug,cx25840_debug, int, 0644); @@ -104,11 +101,11 @@ u32 cx25840_read4(struct i2c_client * client, u16 addr) if (i2c_master_recv(client, buffer, 4) < 4) return 0; - return (buffer[3] << 24) | (buffer[2] << 16) | - (buffer[1] << 8) | buffer[0]; + return (buffer[0] << 24) | (buffer[1] << 16) | + (buffer[2] << 8) | buffer[3]; } -int cx25840_and_or(struct i2c_client *client, u16 addr, unsigned and_mask, +int cx25840_and_or(struct i2c_client *client, u16 addr, u8 and_mask, u8 or_value) { return cx25840_write(client, addr, @@ -120,8 +117,7 @@ int cx25840_and_or(struct i2c_client *client, u16 addr, unsigned and_mask, static int set_input(struct i2c_client *client, enum cx25840_video_input vid_input, enum cx25840_audio_input aud_input); -static void log_audio_status(struct i2c_client *client); -static void log_video_status(struct i2c_client *client); +static void log_status(struct i2c_client *client); /* ----------------------------------------------------------------------- */ @@ -151,33 +147,6 @@ static void init_dll2(struct i2c_client *client) cx25840_write(client, 0x15d, 0xe1); } -static void cx25836_initialize(struct i2c_client *client) -{ - /* reset configuration is described on page 3-77 of the CX25836 datasheet */ - /* 2. */ - cx25840_and_or(client, 0x000, ~0x01, 0x01); - cx25840_and_or(client, 0x000, ~0x01, 0x00); - /* 3a. */ - cx25840_and_or(client, 0x15a, ~0x70, 0x00); - /* 3b. */ - cx25840_and_or(client, 0x15b, ~0x1e, 0x06); - /* 3c. */ - cx25840_and_or(client, 0x159, ~0x02, 0x02); - /* 3d. */ - /* There should be a 10-us delay here, but since the - i2c bus already has a 10-us delay we don't need to do - anything */ - /* 3e. */ - cx25840_and_or(client, 0x159, ~0x02, 0x00); - /* 3f. */ - cx25840_and_or(client, 0x159, ~0xc0, 0xc0); - /* 3g. */ - cx25840_and_or(client, 0x159, ~0x01, 0x00); - cx25840_and_or(client, 0x159, ~0x01, 0x01); - /* 3h. */ - cx25840_and_or(client, 0x15b, ~0x1e, 0x10); -} - static void cx25840_initialize(struct i2c_client *client, int loadfw) { struct cx25840_state *state = i2c_get_clientdata(client); @@ -207,9 +176,9 @@ static void cx25840_initialize(struct i2c_client *client, int loadfw) cx25840_write(client, 0x4a5, 0x00); cx25840_write(client, 0x402, 0x00); /* 8. */ - cx25840_and_or(client, 0x401, ~0x18, 0); - cx25840_and_or(client, 0x4a2, ~0x10, 0x10); - /* steps 8c and 8d are done in change_input() */ + cx25840_write(client, 0x401, 0x18); + cx25840_write(client, 0x4a2, 0x10); + cx25840_write(client, 0x402, 0x04); /* 10. */ cx25840_write(client, 0x8d3, 0x1f); cx25840_write(client, 0x8e3, 0x03); @@ -240,18 +209,17 @@ static void input_change(struct i2c_client *client) struct cx25840_state *state = i2c_get_clientdata(client); v4l2_std_id std = cx25840_get_v4lstd(client); - /* Follow step 8c and 8d of section 3.16 in the cx25840 datasheet */ - if (std & V4L2_STD_SECAM) { - cx25840_write(client, 0x402, 0); - } - else { - cx25840_write(client, 0x402, 0x04); - cx25840_write(client, 0x49f, (std & V4L2_STD_NTSC) ? 0x14 : 0x11); - } - cx25840_and_or(client, 0x401, ~0x60, 0); - cx25840_and_or(client, 0x401, ~0x60, 0x60); - - if (std & V4L2_STD_525_60) { + /* Note: perhaps V4L2_STD_PAL_M should be handled as V4L2_STD_NTSC + instead of V4L2_STD_PAL. Someone needs to test this. */ + if (std & V4L2_STD_PAL) { + /* Follow tuner change procedure for PAL */ + cx25840_write(client, 0x808, 0xff); + cx25840_write(client, 0x80b, 0x10); + } else if (std & V4L2_STD_SECAM) { + /* Select autodetect for SECAM */ + cx25840_write(client, 0x808, 0xff); + cx25840_write(client, 0x80b, 0x10); + } else if (std & V4L2_STD_NTSC) { /* Certain Hauppauge PVR150 models have a hardware bug that causes audio to drop out. For these models the audio standard must be set explicitly. @@ -270,14 +238,6 @@ static void input_change(struct i2c_client *client) cx25840_write(client, 0x808, hw_fix ? 0x1f : 0xf6); } cx25840_write(client, 0x80b, 0x00); - } else if (std & V4L2_STD_PAL) { - /* Follow tuner change procedure for PAL */ - cx25840_write(client, 0x808, 0xff); - cx25840_write(client, 0x80b, 0x10); - } else if (std & V4L2_STD_SECAM) { - /* Select autodetect for SECAM */ - cx25840_write(client, 0x808, 0xff); - cx25840_write(client, 0x80b, 0x10); } if (cx25840_read(client, 0x803) & 0x10) { @@ -348,10 +308,8 @@ static int set_input(struct i2c_client *client, enum cx25840_video_input vid_inp state->vid_input = vid_input; state->aud_input = aud_input; - if (!state->is_cx25836) { - cx25840_audio_set_path(client); - input_change(client); - } + cx25840_audio_set_path(client); + input_change(client); return 0; } @@ -385,17 +343,6 @@ static int set_v4lstd(struct i2c_client *client, v4l2_std_id std) } } - v4l_dbg(1, cx25840_debug, client, "changing video std to fmt %i\n",fmt); - - /* Follow step 9 of section 3.16 in the cx25840 datasheet. - Without this PAL may display a vertical ghosting effect. - This happens for example with the Yuan MPC622. */ - if (fmt >= 4 && fmt < 8) { - /* Set format to NTSC-M */ - cx25840_and_or(client, 0x400, ~0xf, 1); - /* Turn off LCOMB */ - cx25840_and_or(client, 0x47b, ~6, 0); - } cx25840_and_or(client, 0x400, ~0xf, fmt); cx25840_vbi_setup(client); return 0; @@ -403,7 +350,6 @@ static int set_v4lstd(struct i2c_client *client, v4l2_std_id std) v4l2_std_id cx25840_get_v4lstd(struct i2c_client * client) { - struct cx25840_state *state = i2c_get_clientdata(client); /* check VID_FMT_SEL first */ u8 fmt = cx25840_read(client, 0x400) & 0xf; @@ -413,14 +359,7 @@ v4l2_std_id cx25840_get_v4lstd(struct i2c_client * client) } switch (fmt) { - case 0x1: - { - /* if the audio std is A2-M, then this is the South Korean - NTSC standard */ - if (!state->is_cx25836 && cx25840_read(client, 0x805) == 2) - return V4L2_STD_NTSC_M_KR; - return V4L2_STD_NTSC_M; - } + case 0x1: return V4L2_STD_NTSC_M | V4L2_STD_NTSC_M_KR; case 0x2: return V4L2_STD_NTSC_M_JP; case 0x3: return V4L2_STD_NTSC_443; case 0x4: return V4L2_STD_PAL; @@ -490,8 +429,6 @@ static int set_v4lctrl(struct i2c_client *client, struct v4l2_control *ctrl) case V4L2_CID_AUDIO_TREBLE: case V4L2_CID_AUDIO_BALANCE: case V4L2_CID_AUDIO_MUTE: - if (state->is_cx25836) - return -EINVAL; return cx25840_audio(client, VIDIOC_S_CTRL, ctrl); default: @@ -526,8 +463,6 @@ static int get_v4lctrl(struct i2c_client *client, struct v4l2_control *ctrl) case V4L2_CID_AUDIO_TREBLE: case V4L2_CID_AUDIO_BALANCE: case V4L2_CID_AUDIO_MUTE: - if (state->is_cx25836) - return -EINVAL; return cx25840_audio(client, VIDIOC_G_CTRL, ctrl); default: return -EINVAL; @@ -617,12 +552,96 @@ static int set_v4lfmt(struct i2c_client *client, struct v4l2_format *fmt) /* ----------------------------------------------------------------------- */ +static struct v4l2_queryctrl cx25840_qctrl[] = { + { + .id = V4L2_CID_BRIGHTNESS, + .type = V4L2_CTRL_TYPE_INTEGER, + .name = "Brightness", + .minimum = 0, + .maximum = 255, + .step = 1, + .default_value = 128, + .flags = 0, + }, { + .id = V4L2_CID_CONTRAST, + .type = V4L2_CTRL_TYPE_INTEGER, + .name = "Contrast", + .minimum = 0, + .maximum = 127, + .step = 1, + .default_value = 64, + .flags = 0, + }, { + .id = V4L2_CID_SATURATION, + .type = V4L2_CTRL_TYPE_INTEGER, + .name = "Saturation", + .minimum = 0, + .maximum = 127, + .step = 1, + .default_value = 64, + .flags = 0, + }, { + .id = V4L2_CID_HUE, + .type = V4L2_CTRL_TYPE_INTEGER, + .name = "Hue", + .minimum = -128, + .maximum = 127, + .step = 1, + .default_value = 0, + .flags = 0, + }, { + .id = V4L2_CID_AUDIO_VOLUME, + .type = V4L2_CTRL_TYPE_INTEGER, + .name = "Volume", + .minimum = 0, + .maximum = 65535, + .step = 65535/100, + .default_value = 58880, + .flags = 0, + }, { + .id = V4L2_CID_AUDIO_BALANCE, + .type = V4L2_CTRL_TYPE_INTEGER, + .name = "Balance", + .minimum = 0, + .maximum = 65535, + .step = 65535/100, + .default_value = 32768, + .flags = 0, + }, { + .id = V4L2_CID_AUDIO_MUTE, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .name = "Mute", + .minimum = 0, + .maximum = 1, + .step = 1, + .default_value = 1, + .flags = 0, + }, { + .id = V4L2_CID_AUDIO_BASS, + .type = V4L2_CTRL_TYPE_INTEGER, + .name = "Bass", + .minimum = 0, + .maximum = 65535, + .step = 65535/100, + .default_value = 32768, + }, { + .id = V4L2_CID_AUDIO_TREBLE, + .type = V4L2_CTRL_TYPE_INTEGER, + .name = "Treble", + .minimum = 0, + .maximum = 65535, + .step = 65535/100, + .default_value = 32768, + }, +}; + +/* ----------------------------------------------------------------------- */ + static int cx25840_command(struct i2c_client *client, unsigned int cmd, void *arg) { struct cx25840_state *state = i2c_get_clientdata(client); struct v4l2_tuner *vt = arg; - struct v4l2_routing *route = arg; switch (cmd) { #ifdef CONFIG_VIDEO_ADV_DEBUG @@ -659,8 +678,8 @@ static int cx25840_command(struct i2c_client *client, unsigned int cmd, case VIDIOC_STREAMON: v4l_dbg(1, cx25840_debug, client, "enable output\n"); - cx25840_write(client, 0x115, state->is_cx25836 ? 0x0c : 0x8c); - cx25840_write(client, 0x116, state->is_cx25836 ? 0x04 : 0x07); + cx25840_write(client, 0x115, 0x8c); + cx25840_write(client, 0x116, 0x07); break; case VIDIOC_STREAMOFF: @@ -670,9 +689,7 @@ static int cx25840_command(struct i2c_client *client, unsigned int cmd, break; case VIDIOC_LOG_STATUS: - log_video_status(client); - if (!state->is_cx25836) - log_audio_status(client); + log_status(client); break; case VIDIOC_G_CTRL: @@ -684,29 +701,13 @@ static int cx25840_command(struct i2c_client *client, unsigned int cmd, case VIDIOC_QUERYCTRL: { struct v4l2_queryctrl *qc = arg; + int i; - switch (qc->id) { - case V4L2_CID_BRIGHTNESS: - case V4L2_CID_CONTRAST: - case V4L2_CID_SATURATION: - case V4L2_CID_HUE: - return v4l2_ctrl_query_fill_std(qc); - default: - break; - } - if (state->is_cx25836) - return -EINVAL; - - switch (qc->id) { - case V4L2_CID_AUDIO_VOLUME: - case V4L2_CID_AUDIO_MUTE: - case V4L2_CID_AUDIO_BALANCE: - case V4L2_CID_AUDIO_BASS: - case V4L2_CID_AUDIO_TREBLE: - return v4l2_ctrl_query_fill_std(qc); - default: - return -EINVAL; - } + for (i = 0; i < ARRAY_SIZE(cx25840_qctrl); i++) + if (qc->id && qc->id == cx25840_qctrl[i].id) { + memcpy(qc, &cx25840_qctrl[i], sizeof(*qc)); + return 0; + } return -EINVAL; } @@ -722,50 +723,48 @@ static int cx25840_command(struct i2c_client *client, unsigned int cmd, state->radio = 1; break; - case VIDIOC_INT_G_VIDEO_ROUTING: - route->input = state->vid_input; - route->output = 0; + case VIDIOC_G_INPUT: + *(int *)arg = state->vid_input; break; - case VIDIOC_INT_S_VIDEO_ROUTING: - return set_input(client, route->input, state->aud_input); + case VIDIOC_S_INPUT: + return set_input(client, *(enum cx25840_video_input *)arg, state->aud_input); - case VIDIOC_INT_G_AUDIO_ROUTING: - if (state->is_cx25836) - return -EINVAL; - route->input = state->aud_input; - route->output = 0; - break; + case VIDIOC_S_AUDIO: + { + struct v4l2_audio *input = arg; - case VIDIOC_INT_S_AUDIO_ROUTING: - if (state->is_cx25836) - return -EINVAL; - return set_input(client, state->vid_input, route->input); + return set_input(client, state->vid_input, input->index); + } + + case VIDIOC_G_AUDIO: + { + struct v4l2_audio *input = arg; + + memset(input, 0, sizeof(*input)); + input->index = state->aud_input; + break; + } case VIDIOC_S_FREQUENCY: - if (!state->is_cx25836) { - input_change(client); - } + input_change(client); break; case VIDIOC_G_TUNER: { - u8 vpres = cx25840_read(client, 0x40e) & 0x20; - u8 mode; + u8 mode = cx25840_read(client, 0x804); + u8 pref = cx25840_read(client, 0x809) & 0xf; + u8 vpres = cx25840_read(client, 0x80a) & 0x10; int val = 0; if (state->radio) break; - vt->signal = vpres ? 0xffff : 0x0; - if (state->is_cx25836) - break; - vt->capability |= V4L2_TUNER_CAP_STEREO | V4L2_TUNER_CAP_LANG1 | V4L2_TUNER_CAP_LANG2 | V4L2_TUNER_CAP_SAP; - mode = cx25840_read(client, 0x804); + vt->signal = vpres ? 0xffff : 0x0; /* get rxsubchans and audmode */ if ((mode & 0xf) == 1) @@ -774,50 +773,44 @@ static int cx25840_command(struct i2c_client *client, unsigned int cmd, val |= V4L2_TUNER_SUB_MONO; if (mode == 2 || mode == 4) - val = V4L2_TUNER_SUB_LANG1 | V4L2_TUNER_SUB_LANG2; + val |= V4L2_TUNER_SUB_LANG1 | V4L2_TUNER_SUB_LANG2; if (mode & 0x10) val |= V4L2_TUNER_SUB_SAP; vt->rxsubchans = val; - vt->audmode = state->audmode; + + switch (pref) { + case 0: + vt->audmode = V4L2_TUNER_MODE_MONO; + break; + case 1: + case 2: + vt->audmode = V4L2_TUNER_MODE_LANG2; + break; + case 4: + default: + vt->audmode = V4L2_TUNER_MODE_STEREO; + } break; } case VIDIOC_S_TUNER: - if (state->radio || state->is_cx25836) - break; - switch (vt->audmode) { case V4L2_TUNER_MODE_MONO: - /* mono -> mono - stereo -> mono - bilingual -> lang1 */ + case V4L2_TUNER_MODE_LANG1: + /* Force PREF_MODE to MONO */ cx25840_and_or(client, 0x809, ~0xf, 0x00); break; case V4L2_TUNER_MODE_STEREO: - case V4L2_TUNER_MODE_LANG1: - /* mono -> mono - stereo -> stereo - bilingual -> lang1 */ + /* Force PREF_MODE to STEREO */ cx25840_and_or(client, 0x809, ~0xf, 0x04); break; - case V4L2_TUNER_MODE_LANG1_LANG2: - /* mono -> mono - stereo -> stereo - bilingual -> lang1/lang2 */ - cx25840_and_or(client, 0x809, ~0xf, 0x07); - break; case V4L2_TUNER_MODE_LANG2: - /* mono -> mono - stereo -> stereo - bilingual -> lang2 */ + /* Force PREF_MODE to LANG2 */ cx25840_and_or(client, 0x809, ~0xf, 0x01); break; - default: - return -EINVAL; } - state->audmode = vt->audmode; break; case VIDIOC_G_FMT: @@ -827,14 +820,12 @@ static int cx25840_command(struct i2c_client *client, unsigned int cmd, return set_v4lfmt(client, (struct v4l2_format *)arg); case VIDIOC_INT_RESET: - if (state->is_cx25836) - cx25836_initialize(client); - else - cx25840_initialize(client, 0); + cx25840_initialize(client, 0); break; case VIDIOC_INT_G_CHIP_IDENT: - *(enum v4l2_chip_ident *)arg = state->id; + *(enum v4l2_chip_ident *)arg = + V4L2_IDENT_CX25840 + ((cx25840_read(client, 0x100) >> 4) & 0xf); break; default: @@ -853,7 +844,6 @@ static int cx25840_detect_client(struct i2c_adapter *adapter, int address, { struct i2c_client *client; struct cx25840_state *state; - enum v4l2_chip_ident id; u16 device_id; /* Check if the adapter supports the needed features @@ -862,11 +852,10 @@ static int cx25840_detect_client(struct i2c_adapter *adapter, int address, if (!i2c_check_functionality(adapter, I2C_FUNC_I2C)) return 0; - state = kzalloc(sizeof(struct cx25840_state), GFP_KERNEL); - if (state == 0) + client = kzalloc(sizeof(struct i2c_client), GFP_KERNEL); + if (client == 0) return -ENOMEM; - client = &state->c; client->addr = address; client->adapter = adapter; client->driver = &i2c_driver_cx25840; @@ -878,18 +867,10 @@ static int cx25840_detect_client(struct i2c_adapter *adapter, int address, device_id |= cx25840_read(client, 0x100); /* The high byte of the device ID should be - * 0x83 for the cx2583x and 0x84 for the cx2584x */ - if ((device_id & 0xff00) == 0x8300) { - id = V4L2_IDENT_CX25836 + ((device_id >> 4) & 0xf) - 6; - state->is_cx25836 = 1; - } - else if ((device_id & 0xff00) == 0x8400) { - id = V4L2_IDENT_CX25840 + ((device_id >> 4) & 0xf); - state->is_cx25836 = 0; - } - else { + * 0x84 if chip is present */ + if ((device_id & 0xff00) != 0x8400) { v4l_dbg(1, cx25840_debug, client, "cx25840 not found\n"); - kfree(state); + kfree(client); return 0; } @@ -898,19 +879,20 @@ static int cx25840_detect_client(struct i2c_adapter *adapter, int address, (device_id & 0x0f) < 3 ? (device_id & 0x0f) + 1 : 3, address << 1, adapter->name); + state = kmalloc(sizeof(struct cx25840_state), GFP_KERNEL); + if (state == NULL) { + kfree(client); + return -ENOMEM; + } + i2c_set_clientdata(client, state); + memset(state, 0, sizeof(struct cx25840_state)); state->vid_input = CX25840_COMPOSITE7; state->aud_input = CX25840_AUDIO8; state->audclk_freq = 48000; state->pvr150_workaround = 0; - state->audmode = V4L2_TUNER_MODE_LANG1; - state->vbi_line_offset = 8; - state->id = id; - if (state->is_cx25836) - cx25836_initialize(client); - else - cx25840_initialize(client, 1); + cx25840_initialize(client, 1); i2c_attach_client(client); @@ -935,6 +917,7 @@ static int cx25840_detach_client(struct i2c_client *client) } kfree(state); + kfree(client); return 0; } @@ -967,7 +950,7 @@ module_exit(m__exit); /* ----------------------------------------------------------------------- */ -static void log_video_status(struct i2c_client *client) +static void log_status(struct i2c_client *client) { static const char *const fmt_strs[] = { "0x0", @@ -979,36 +962,9 @@ static void log_video_status(struct i2c_client *client) }; struct cx25840_state *state = i2c_get_clientdata(client); + u8 microctrl_vidfmt = cx25840_read(client, 0x80a); u8 vidfmt_sel = cx25840_read(client, 0x400) & 0xf; u8 gen_stat1 = cx25840_read(client, 0x40d); - u8 gen_stat2 = cx25840_read(client, 0x40e); - int vid_input = state->vid_input; - - v4l_info(client, "Video signal: %spresent\n", - (gen_stat2 & 0x20) ? "" : "not "); - v4l_info(client, "Detected format: %s\n", - fmt_strs[gen_stat1 & 0xf]); - - v4l_info(client, "Specified standard: %s\n", - vidfmt_sel ? fmt_strs[vidfmt_sel] : "automatic detection"); - - if (vid_input >= CX25840_COMPOSITE1 && - vid_input <= CX25840_COMPOSITE8) { - v4l_info(client, "Specified video input: Composite %d\n", - vid_input - CX25840_COMPOSITE1 + 1); - } else { - v4l_info(client, "Specified video input: S-Video (Luma In%d, Chroma In%d)\n", - (vid_input & 0xf0) >> 4, (vid_input & 0xf00) >> 8); - } - - v4l_info(client, "Specified audioclock freq: %d Hz\n", state->audclk_freq); -} - -/* ----------------------------------------------------------------------- */ - -static void log_audio_status(struct i2c_client *client) -{ - struct cx25840_state *state = i2c_get_clientdata(client); u8 download_ctl = cx25840_read(client, 0x803); u8 mod_det_stat0 = cx25840_read(client, 0x804); u8 mod_det_stat1 = cx25840_read(client, 0x805); @@ -1016,9 +972,15 @@ static void log_audio_status(struct i2c_client *client) u8 pref_mode = cx25840_read(client, 0x809); u8 afc0 = cx25840_read(client, 0x80b); u8 mute_ctl = cx25840_read(client, 0x8d3); + int vid_input = state->vid_input; int aud_input = state->aud_input; char *p; + v4l_info(client, "Video signal: %spresent\n", + (microctrl_vidfmt & 0x10) ? "" : "not "); + v4l_info(client, "Detected format: %s\n", + fmt_strs[gen_stat1 & 0xf]); + switch (mod_det_stat0) { case 0x00: p = "mono"; break; case 0x01: p = "stereo"; break; @@ -1118,12 +1080,25 @@ static void log_audio_status(struct i2c_client *client) v4l_info(client, "Configured audio system: %s\n", p); } + v4l_info(client, "Specified standard: %s\n", + vidfmt_sel ? fmt_strs[vidfmt_sel] : "automatic detection"); + + if (vid_input >= CX25840_COMPOSITE1 && + vid_input <= CX25840_COMPOSITE8) { + v4l_info(client, "Specified video input: Composite %d\n", + vid_input - CX25840_COMPOSITE1 + 1); + } else { + v4l_info(client, "Specified video input: S-Video (Luma In%d, Chroma In%d)\n", + (vid_input & 0xf0) >> 4, (vid_input & 0xf00) >> 8); + } if (aud_input) { v4l_info(client, "Specified audio input: Tuner (In%d)\n", aud_input); } else { v4l_info(client, "Specified audio input: External\n"); } + v4l_info(client, "Specified audioclock freq: %d Hz\n", state->audclk_freq); + switch (pref_mode & 0xf) { case 0: p = "mono/language A"; break; case 1: p = "language B"; break; diff --git a/drivers/media/video/cx25840/cx25840-firmware.c b/drivers/media/video/cx25840/cx25840-firmware.c index 1958d4016..e1a7823d8 100644 --- a/drivers/media/video/cx25840/cx25840-firmware.c +++ b/drivers/media/video/cx25840/cx25840-firmware.c @@ -20,31 +20,37 @@ #include #include #include -#include -#include "cx25840-core.h" +#include "cx25840.h" #define FWFILE "v4l-cx25840.fw" - -/* - * Mike Isely - The FWSEND parameter controls the - * size of the firmware chunks sent down the I2C bus to the chip. - * Previously this had been set to 1024 but unfortunately some I2C - * implementations can't transfer data in such big gulps. - * Specifically, the pvrusb2 driver has a hard limit of around 60 - * bytes, due to the encapsulation there of I2C traffic into USB - * messages. So we have to significantly reduce this parameter. - */ -#define FWSEND 48 +#define FWSEND 1024 #define FWDEV(x) &((x)->adapter->dev) +static int fastfw = 1; static char *firmware = FWFILE; +module_param(fastfw, bool, 0444); module_param(firmware, charp, 0444); +MODULE_PARM_DESC(fastfw, "Load firmware fast [0=100MHz 1=333MHz (default)]"); MODULE_PARM_DESC(firmware, "Firmware image [default: " FWFILE "]"); +static void set_i2c_delay(struct i2c_client *client, int delay) +{ + struct i2c_algo_bit_data *algod = client->adapter->algo_data; + + /* We aren't guaranteed to be using algo_bit, + * so avoid the null pointer dereference + * and disable the 'fast firmware load' */ + if (algod) { + algod->udelay = delay; + } else { + fastfw = 0; + } +} + static void start_fw_load(struct i2c_client *client) { /* DL_ADDR_LB=0 DL_ADDR_HB=0 */ @@ -54,10 +60,16 @@ static void start_fw_load(struct i2c_client *client) cx25840_write(client, 0x803, 0x0b); /* AUTO_INC_DIS=1 */ cx25840_write(client, 0x000, 0x20); + + if (fastfw) + set_i2c_delay(client, 3); } static void end_fw_load(struct i2c_client *client) { + if (fastfw) + set_i2c_delay(client, 10); + /* AUTO_INC_DIS=0 */ cx25840_write(client, 0x000, 0x00); /* DL_ENABLE=0 */ @@ -84,8 +96,30 @@ static int fw_write(struct i2c_client *client, u8 * data, int size) int sent; if ((sent = i2c_master_send(client, data, size)) < size) { - v4l_err(client, "firmware load i2c failure\n"); - return -ENOSYS; + + if (fastfw) { + v4l_err(client, "333MHz i2c firmware load failed\n"); + fastfw = 0; + set_i2c_delay(client, 10); + + if (sent > 2) { + u16 dl_addr = cx25840_read(client, 0x801) << 8; + dl_addr |= cx25840_read(client, 0x800); + dl_addr -= sent - 2; + cx25840_write(client, 0x801, dl_addr >> 8); + cx25840_write(client, 0x800, dl_addr & 0xff); + } + + if (i2c_master_send(client, data, size) < size) { + v4l_err(client, "100MHz i2c firmware load failed\n"); + return -ENOSYS; + } + + } else { + v4l_err(client, "firmware load i2c failure\n"); + return -ENOSYS; + } + } return 0; diff --git a/drivers/media/video/cx25840/cx25840-vbi.c b/drivers/media/video/cx25840/cx25840-vbi.c index 6cc8bf215..04d879da7 100644 --- a/drivers/media/video/cx25840/cx25840-vbi.c +++ b/drivers/media/video/cx25840/cx25840-vbi.c @@ -19,9 +19,8 @@ #include #include #include -#include -#include "cx25840-core.h" +#include "cx25840.h" static int odd_parity(u8 c) { @@ -84,140 +83,67 @@ static int decode_vps(u8 * dst, u8 * p) void cx25840_vbi_setup(struct i2c_client *client) { - struct cx25840_state *state = i2c_get_clientdata(client); v4l2_std_id std = cx25840_get_v4lstd(client); - int hblank,hactive,burst,vblank,vactive,sc,vblank656,src_decimation; - int luma_lpf,uv_lpf, comb; - u32 pll_int,pll_frac,pll_post; - /* datasheet startup, step 8d */ if (std & ~V4L2_STD_NTSC) { + /* datasheet startup, step 8d */ cx25840_write(client, 0x49f, 0x11); - } else { - cx25840_write(client, 0x49f, 0x14); - } - if (std & V4L2_STD_625_50) { - hblank=0x084; - hactive=0x2d0; - burst=0x5d; - vblank=0x024; - vactive=0x244; - vblank656=0x28; - src_decimation=0x21f; + cx25840_write(client, 0x470, 0x84); + cx25840_write(client, 0x471, 0x00); + cx25840_write(client, 0x472, 0x2d); + cx25840_write(client, 0x473, 0x5d); + + cx25840_write(client, 0x474, 0x24); + cx25840_write(client, 0x475, 0x40); + cx25840_write(client, 0x476, 0x24); + cx25840_write(client, 0x477, 0x28); + + cx25840_write(client, 0x478, 0x1f); + cx25840_write(client, 0x479, 0x02); - luma_lpf=2; if (std & V4L2_STD_SECAM) { - uv_lpf=0; - comb=0; - sc=0x0a425f; - } else { - uv_lpf=1; - comb=0x20; - sc=0x0a8263; - } - } else { - hactive=720; - hblank=122; - vactive=487; - luma_lpf=1; - uv_lpf=1; - - src_decimation=0x21f; - if (std == V4L2_STD_PAL_M) { - vblank=20; - vblank656=24; - burst=0x61; - comb=0x20; - - sc=555452; + cx25840_write(client, 0x47a, 0x80); + cx25840_write(client, 0x47b, 0x00); + cx25840_write(client, 0x47c, 0x5f); + cx25840_write(client, 0x47d, 0x42); } else { - vblank=26; - vblank656=26; - burst=0x5b; - comb=0x66; - sc=556063; + cx25840_write(client, 0x47a, 0x90); + cx25840_write(client, 0x47b, 0x20); + cx25840_write(client, 0x47c, 0x63); + cx25840_write(client, 0x47d, 0x82); } - } - - /* DEBUG: Displays configured PLL frequency */ - pll_int=cx25840_read(client, 0x108); - pll_frac=cx25840_read4(client, 0x10c)&0x1ffffff; - pll_post=cx25840_read(client, 0x109); - v4l_dbg(1, cx25840_debug, client, - "PLL regs = int: %u, frac: %u, post: %u\n", - pll_int,pll_frac,pll_post); - - if (pll_post) { - int fin, fsc; - int pll= (28636363L*((((u64)pll_int)<<25L)+pll_frac)) >>25L; - - pll/=pll_post; - v4l_dbg(1, cx25840_debug, client, "PLL = %d.%06d MHz\n", - pll/1000000, pll%1000000); - v4l_dbg(1, cx25840_debug, client, "PLL/8 = %d.%06d MHz\n", - pll/8000000, (pll/8)%1000000); - - fin=((u64)src_decimation*pll)>>12; - v4l_dbg(1, cx25840_debug, client, "ADC Sampling freq = " - "%d.%06d MHz\n", - fin/1000000,fin%1000000); - - fsc= (((u64)sc)*pll) >> 24L; - v4l_dbg(1, cx25840_debug, client, "Chroma sub-carrier freq = " - "%d.%06d MHz\n", - fsc/1000000,fsc%1000000); - - v4l_dbg(1, cx25840_debug, client, "hblank %i, hactive %i, " - "vblank %i , vactive %i, vblank656 %i, src_dec %i," - "burst 0x%02x, luma_lpf %i, uv_lpf %i, comb 0x%02x," - " sc 0x%06x\n", - hblank, hactive, vblank, vactive, vblank656, - src_decimation, burst, luma_lpf, uv_lpf, comb, sc); - } - - /* Sets horizontal blanking delay and active lines */ - cx25840_write(client, 0x470, hblank); - cx25840_write(client, 0x471, 0xff&(((hblank>>8)&0x3)|(hactive <<4))); - cx25840_write(client, 0x472, hactive>>4); - /* Sets burst gate delay */ - cx25840_write(client, 0x473, burst); - - /* Sets vertical blanking delay and active duration */ - cx25840_write(client, 0x474, vblank); - cx25840_write(client, 0x475, 0xff&(((vblank>>8)&0x3)|(vactive <<4))); - cx25840_write(client, 0x476, vactive>>4); - cx25840_write(client, 0x477, vblank656); - - /* Sets src decimation rate */ - cx25840_write(client, 0x478, 0xff&src_decimation); - cx25840_write(client, 0x479, 0xff&(src_decimation>>8)); + cx25840_write(client, 0x47e, 0x0a); + cx25840_write(client, 0x47f, 0x01); + } else { + /* datasheet startup, step 8d */ + cx25840_write(client, 0x49f, 0x14); - /* Sets Luma and UV Low pass filters */ - cx25840_write(client, 0x47a, luma_lpf<<6|((uv_lpf<<4)&0x30)); + cx25840_write(client, 0x470, 0x7a); + cx25840_write(client, 0x471, 0x00); + cx25840_write(client, 0x472, 0x2d); + cx25840_write(client, 0x473, 0x5b); - /* Enables comb filters */ - cx25840_write(client, 0x47b, comb); + cx25840_write(client, 0x474, 0x1a); + cx25840_write(client, 0x475, 0x70); + cx25840_write(client, 0x476, 0x1e); + cx25840_write(client, 0x477, 0x1e); - /* Sets SC Step*/ - cx25840_write(client, 0x47c, sc); - cx25840_write(client, 0x47d, 0xff&sc>>8); - cx25840_write(client, 0x47e, 0xff&sc>>16); + cx25840_write(client, 0x478, 0x1f); + cx25840_write(client, 0x479, 0x02); + cx25840_write(client, 0x47a, 0x50); + cx25840_write(client, 0x47b, 0x66); - /* Sets VBI parameters */ - if (std & V4L2_STD_625_50) { - cx25840_write(client, 0x47f, 0x01); - state->vbi_line_offset = 5; - } else { + cx25840_write(client, 0x47c, 0x1f); + cx25840_write(client, 0x47d, 0x7c); + cx25840_write(client, 0x47e, 0x08); cx25840_write(client, 0x47f, 0x00); - state->vbi_line_offset = 8; } } int cx25840_vbi(struct i2c_client *client, unsigned int cmd, void *arg) { - struct cx25840_state *state = i2c_get_clientdata(client); struct v4l2_format *fmt; struct v4l2_sliced_vbi_format *svbi; @@ -255,7 +181,7 @@ int cx25840_vbi(struct i2c_client *client, unsigned int cmd, void *arg) case VIDIOC_S_FMT: { - int is_pal = !(cx25840_get_v4lstd(client) & V4L2_STD_525_60); + int is_pal = !(cx25840_get_v4lstd(client) & V4L2_STD_NTSC); int vbi_offset = is_pal ? 1 : 0; int i, x; u8 lcr[24]; @@ -284,7 +210,7 @@ int cx25840_vbi(struct i2c_client *client, unsigned int cmd, void *arg) cx25840_vbi_setup(client); /* Sliced VBI */ - cx25840_write(client, 0x404, 0x32); /* Ancillary data */ + cx25840_write(client, 0x404, 0x36); /* Ancillery data */ cx25840_write(client, 0x406, 0x13); cx25840_write(client, 0x47f, vbi_offset); @@ -321,18 +247,8 @@ int cx25840_vbi(struct i2c_client *client, unsigned int cmd, void *arg) } } - if (is_pal) { - for (x = 1, i = 0x424; i <= 0x434; i++, x++) { - cx25840_write(client, i, lcr[6 + x]); - } - } - else { - for (x = 1, i = 0x424; i <= 0x430; i++, x++) { - cx25840_write(client, i, lcr[9 + x]); - } - for (i = 0x431; i <= 0x434; i++) { - cx25840_write(client, i, 0); - } + for (x = 1, i = 0x424; i <= 0x434; i++, x++) { + cx25840_write(client, i, lcr[6 + x]); } cx25840_write(client, 0x43c, 0x16); @@ -340,7 +256,7 @@ int cx25840_vbi(struct i2c_client *client, unsigned int cmd, void *arg) if (is_pal) { cx25840_write(client, 0x474, 0x2a); } else { - cx25840_write(client, 0x474, 0x22); + cx25840_write(client, 0x474, 0x1a + 6); } break; } @@ -361,7 +277,7 @@ int cx25840_vbi(struct i2c_client *client, unsigned int cmd, void *arg) id1 = p[-1]; id2 = p[0] & 0xf; l = p[2] & 0x3f; - l += state->vbi_line_offset; + l += 5; p += 4; switch (id2) { diff --git a/drivers/media/video/cx88/Kconfig b/drivers/media/video/cx88/Kconfig index 7a94e6a11..87d79df05 100644 --- a/drivers/media/video/cx88/Kconfig +++ b/drivers/media/video/cx88/Kconfig @@ -1,7 +1,3 @@ -config VIDEO_CX88_VP3054 - tristate - depends on VIDEO_CX88_DVB && DVB_MT352 - config VIDEO_CX88 tristate "Conexant 2388x (bt878 successor) support" depends on VIDEO_DEV && PCI && I2C @@ -20,41 +16,27 @@ config VIDEO_CX88 module will be called cx8800 config VIDEO_CX88_ALSA - tristate "Conexant 2388x DMA audio support" + tristate "ALSA DMA audio support" depends on VIDEO_CX88 && SND && EXPERIMENTAL select SND_PCM ---help--- This is a video4linux driver for direct (DMA) audio on - Conexant 2388x based TV cards using ALSA. - + Conexant 2388x based TV cards. It only works with boards with function 01 enabled. To check if your board supports, use lspci -n. - If supported, you should see 14f1:8801 or 14f1:8811 + If supported, you should see 1471:8801 or 1471:8811 PCI device. To compile this driver as a module, choose M here: the module will be called cx88-alsa. -config VIDEO_CX88_BLACKBIRD - tristate "Blackbird MPEG encoder support (cx2388x + cx23416)" - depends on VIDEO_CX88 - select VIDEO_CX2341X - ---help--- - This adds support for MPEG encoder cards based on the - Blackbird reference design, using the Conexant 2388x - and 23416 chips. - - To compile this driver as a module, choose M here: the - module will be called cx88-blackbird. - config VIDEO_CX88_DVB tristate "DVB/ATSC Support for cx2388x based TV cards" depends on VIDEO_CX88 && DVB_CORE select VIDEO_BUF_DVB - select DVB_PLL ---help--- This adds support for DVB/ATSC cards based on the - Conexant 2388x chip. + Connexant 2388x chip. To compile this driver as a module, choose M here: the module will be called cx88-dvb. @@ -68,13 +50,11 @@ config VIDEO_CX88_DVB_ALL_FRONTENDS depends on VIDEO_CX88_DVB select DVB_MT352 select VIDEO_CX88_VP3054 - select DVB_ZL10353 select DVB_OR51132 select DVB_CX22702 select DVB_LGDT330X select DVB_NXT200X select DVB_CX24123 - select DVB_ISL6421 ---help--- This builds cx88-dvb with all currently supported frontend demodulators. If you wish to tweak your configuration, and @@ -91,27 +71,16 @@ config VIDEO_CX88_DVB_MT352 This adds DVB-T support for cards based on the Connexant 2388x chip and the MT352 demodulator. -config VIDEO_CX88_DVB_VP3054 - bool "VP-3054 Secondary I2C Bus Support" - default y - depends on VIDEO_CX88_DVB_MT352 - select VIDEO_CX88_VP3054 +config VIDEO_CX88_VP3054 + tristate "VP-3054 Secondary I2C Bus Support" + default m + depends on DVB_MT352 ---help--- This adds DVB-T support for cards based on the Connexant 2388x chip and the MT352 demodulator, which also require support for the VP-3054 Secondary I2C bus, such at DNTV Live! DVB-T Pro. -config VIDEO_CX88_DVB_ZL10353 - bool "Zarlink ZL10353 DVB-T Support" - default y - depends on VIDEO_CX88_DVB && !VIDEO_CX88_DVB_ALL_FRONTENDS - select DVB_ZL10353 - ---help--- - This adds DVB-T support for cards based on the - Connexant 2388x chip and the ZL10353 demodulator, - successor to the Zarlink MT352. - config VIDEO_CX88_DVB_OR51132 bool "OR51132 ATSC Support" default y @@ -153,7 +122,6 @@ config VIDEO_CX88_DVB_CX24123 default y depends on VIDEO_CX88_DVB && !VIDEO_CX88_DVB_ALL_FRONTENDS select DVB_CX24123 - select DVB_ISL6421 ---help--- This adds DVB-S support for cards based on the Connexant 2388x chip and the CX24123 demodulator. diff --git a/drivers/media/video/cx88/Makefile b/drivers/media/video/cx88/Makefile index 352b919f3..2b902784f 100644 --- a/drivers/media/video/cx88/Makefile +++ b/drivers/media/video/cx88/Makefile @@ -3,22 +3,20 @@ cx88xx-objs := cx88-cards.o cx88-core.o cx88-i2c.o cx88-tvaudio.o \ cx8800-objs := cx88-video.o cx88-vbi.o cx8802-objs := cx88-mpeg.o -obj-$(CONFIG_VIDEO_CX88) += cx88xx.o cx8800.o cx8802.o -obj-$(CONFIG_VIDEO_CX88_ALSA) += cx88-alsa.o -obj-$(CONFIG_VIDEO_CX88_BLACKBIRD) += cx88-blackbird.o +obj-$(CONFIG_VIDEO_CX88) += cx88xx.o cx8800.o cx8802.o cx88-blackbird.o obj-$(CONFIG_VIDEO_CX88_DVB) += cx88-dvb.o +obj-$(CONFIG_VIDEO_CX88_ALSA) += cx88-alsa.o obj-$(CONFIG_VIDEO_CX88_VP3054) += cx88-vp3054-i2c.o -EXTRA_CFLAGS += -Idrivers/media/video -EXTRA_CFLAGS += -Idrivers/media/dvb/dvb-core -EXTRA_CFLAGS += -Idrivers/media/dvb/frontends +EXTRA_CFLAGS += -I$(src)/.. +EXTRA_CFLAGS += -I$(srctree)/drivers/media/dvb/dvb-core +EXTRA_CFLAGS += -I$(srctree)/drivers/media/dvb/frontends extra-cflags-$(CONFIG_VIDEO_BUF_DVB) += -DHAVE_VIDEO_BUF_DVB=1 extra-cflags-$(CONFIG_DVB_CX22702) += -DHAVE_CX22702=1 extra-cflags-$(CONFIG_DVB_OR51132) += -DHAVE_OR51132=1 extra-cflags-$(CONFIG_DVB_LGDT330X) += -DHAVE_LGDT330X=1 extra-cflags-$(CONFIG_DVB_MT352) += -DHAVE_MT352=1 -extra-cflags-$(CONFIG_DVB_ZL10353) += -DHAVE_ZL10353=1 extra-cflags-$(CONFIG_DVB_NXT200X) += -DHAVE_NXT200X=1 extra-cflags-$(CONFIG_DVB_CX24123) += -DHAVE_CX24123=1 extra-cflags-$(CONFIG_VIDEO_CX88_VP3054)+= -DHAVE_VP3054_I2C=1 diff --git a/drivers/media/video/cx88/cx88-alsa.c b/drivers/media/video/cx88/cx88-alsa.c index f0340662e..2acccd6d4 100644 --- a/drivers/media/video/cx88/cx88-alsa.c +++ b/drivers/media/video/cx88/cx88-alsa.c @@ -4,7 +4,7 @@ * PCI function #1 of the cx2388x. * * (c) 2005,2006 Ricardo Cerqueira - * (c) 2005 Mauro Carvalho Chehab + * (c) 2005 Mauro Carvalho Chehab * Based on a dummy cx88 module by Gerd Knorr * Based on dummy.c by Jaroslav Kysela * @@ -63,7 +63,7 @@ struct cx88_audio_dev { /* audio controls */ int irq; - struct snd_card *card; + snd_card_t *card; spinlock_t reg_lock; @@ -82,7 +82,7 @@ struct cx88_audio_dev { struct cx88_buffer *buf; long opened; - struct snd_pcm_substream *substream; + snd_pcm_substream_t *substream; }; typedef struct cx88_audio_dev snd_cx88_card_t; @@ -96,7 +96,7 @@ typedef struct cx88_audio_dev snd_cx88_card_t; static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX; /* Index 0-MAX */ static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR; /* ID for this card */ static int enable[SNDRV_CARDS] = {1, [1 ... (SNDRV_CARDS - 1)] = 1}; -static struct snd_card *snd_cx88_cards[SNDRV_CARDS]; +static snd_card_t *snd_cx88_cards[SNDRV_CARDS]; module_param_array(enable, bool, NULL, 0444); MODULE_PARM_DESC(enable, "Enable cx88x soundcard. default enabled."); @@ -111,7 +111,7 @@ MODULE_PARM_DESC(index, "Index value for cx88x capture interface(s)."); MODULE_DESCRIPTION("ALSA driver module for cx2388x based TV cards"); MODULE_AUTHOR("Ricardo Cerqueira"); -MODULE_AUTHOR("Mauro Carvalho Chehab "); +MODULE_AUTHOR("Mauro Carvalho Chehab "); MODULE_LICENSE("GPL"); MODULE_SUPPORTED_DEVICE("{{Conexant,23881}," "{{Conexant,23882}," @@ -303,7 +303,7 @@ static int dsp_buffer_free(snd_cx88_card_t *chip) BUG_ON(!chip->dma_size); dprintk(2,"Freeing buffer\n"); - videobuf_pci_dma_unmap(chip->pci, &chip->dma_risc); + videobuf_dma_pci_unmap(chip->pci, &chip->dma_risc); videobuf_dma_free(&chip->dma_risc); btcx_riscmem_free(chip->pci,&chip->buf->risc); kfree(chip->buf); @@ -320,7 +320,7 @@ static int dsp_buffer_free(snd_cx88_card_t *chip) /* * Digital hardware definition */ -static struct snd_pcm_hardware snd_cx88_digital_hw = { +static snd_pcm_hardware_t snd_cx88_digital_hw = { .info = SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED | SNDRV_PCM_INFO_BLOCK_TRANSFER | @@ -342,16 +342,16 @@ static struct snd_pcm_hardware snd_cx88_digital_hw = { /* * audio pcm capture runtime free */ -static void snd_card_cx88_runtime_free(struct snd_pcm_runtime *runtime) +static void snd_card_cx88_runtime_free(snd_pcm_runtime_t *runtime) { } /* * audio pcm capture open callback */ -static int snd_cx88_pcm_open(struct snd_pcm_substream *substream) +static int snd_cx88_pcm_open(snd_pcm_substream_t *substream) { snd_cx88_card_t *chip = snd_pcm_substream_chip(substream); - struct snd_pcm_runtime *runtime = substream->runtime; + snd_pcm_runtime_t *runtime = substream->runtime; int err; if (test_and_set_bit(0, &chip->opened)) @@ -380,7 +380,7 @@ _error: /* * audio close callback */ -static int snd_cx88_close(struct snd_pcm_substream *substream) +static int snd_cx88_close(snd_pcm_substream_t *substream) { snd_cx88_card_t *chip = snd_pcm_substream_chip(substream); @@ -393,8 +393,8 @@ static int snd_cx88_close(struct snd_pcm_substream *substream) /* * hw_params callback */ -static int snd_cx88_hw_params(struct snd_pcm_substream * substream, - struct snd_pcm_hw_params * hw_params) +static int snd_cx88_hw_params(snd_pcm_substream_t * substream, + snd_pcm_hw_params_t * hw_params) { snd_cx88_card_t *chip = snd_pcm_substream_chip(substream); struct cx88_buffer *buf; @@ -429,7 +429,7 @@ static int snd_cx88_hw_params(struct snd_pcm_substream * substream, videobuf_dma_init_kernel(&buf->vb.dma,PCI_DMA_FROMDEVICE, (PAGE_ALIGN(buf->vb.size) >> PAGE_SHIFT)); - videobuf_pci_dma_map(chip->pci,&buf->vb.dma); + videobuf_dma_pci_map(chip->pci,&buf->vb.dma); cx88_risc_databuffer(chip->pci, &buf->risc, @@ -453,7 +453,7 @@ static int snd_cx88_hw_params(struct snd_pcm_substream * substream, /* * hw free callback */ -static int snd_cx88_hw_free(struct snd_pcm_substream * substream) +static int snd_cx88_hw_free(snd_pcm_substream_t * substream) { snd_cx88_card_t *chip = snd_pcm_substream_chip(substream); @@ -469,7 +469,7 @@ static int snd_cx88_hw_free(struct snd_pcm_substream * substream) /* * prepare callback */ -static int snd_cx88_prepare(struct snd_pcm_substream *substream) +static int snd_cx88_prepare(snd_pcm_substream_t *substream) { return 0; } @@ -478,7 +478,7 @@ static int snd_cx88_prepare(struct snd_pcm_substream *substream) /* * trigger callback */ -static int snd_cx88_card_trigger(struct snd_pcm_substream *substream, int cmd) +static int snd_cx88_card_trigger(snd_pcm_substream_t *substream, int cmd) { snd_cx88_card_t *chip = snd_pcm_substream_chip(substream); int err; @@ -505,10 +505,10 @@ static int snd_cx88_card_trigger(struct snd_pcm_substream *substream, int cmd) /* * pointer callback */ -static snd_pcm_uframes_t snd_cx88_pointer(struct snd_pcm_substream *substream) +static snd_pcm_uframes_t snd_cx88_pointer(snd_pcm_substream_t *substream) { snd_cx88_card_t *chip = snd_pcm_substream_chip(substream); - struct snd_pcm_runtime *runtime = substream->runtime; + snd_pcm_runtime_t *runtime = substream->runtime; if (chip->read_count) { chip->read_count -= snd_pcm_lib_period_bytes(substream); @@ -525,7 +525,7 @@ static snd_pcm_uframes_t snd_cx88_pointer(struct snd_pcm_substream *substream) /* * operators */ -static struct snd_pcm_ops snd_cx88_pcm_ops = { +static snd_pcm_ops_t snd_cx88_pcm_ops = { .open = snd_cx88_pcm_open, .close = snd_cx88_close, .ioctl = snd_pcm_lib_ioctl, @@ -542,7 +542,7 @@ static struct snd_pcm_ops snd_cx88_pcm_ops = { static int __devinit snd_cx88_pcm(snd_cx88_card_t *chip, int device, char *name) { int err; - struct snd_pcm *pcm; + snd_pcm_t *pcm; err = snd_pcm_new(chip->card, name, device, 0, 1, &pcm); if (err < 0) @@ -557,8 +557,7 @@ static int __devinit snd_cx88_pcm(snd_cx88_card_t *chip, int device, char *name) /**************************************************************************** CONTROL INTERFACE ****************************************************************************/ -static int snd_cx88_capture_volume_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *info) +static int snd_cx88_capture_volume_info(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t *info) { info->type = SNDRV_CTL_ELEM_TYPE_INTEGER; info->count = 1; @@ -569,8 +568,7 @@ static int snd_cx88_capture_volume_info(struct snd_kcontrol *kcontrol, } /* OK - TODO: test it */ -static int snd_cx88_capture_volume_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *value) +static int snd_cx88_capture_volume_get(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *value) { snd_cx88_card_t *chip = snd_kcontrol_chip(kcontrol); struct cx88_core *core=chip->core; @@ -581,8 +579,7 @@ static int snd_cx88_capture_volume_get(struct snd_kcontrol *kcontrol, } /* OK - TODO: test it */ -static int snd_cx88_capture_volume_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *value) +static int snd_cx88_capture_volume_put(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *value) { snd_cx88_card_t *chip = snd_kcontrol_chip(kcontrol); struct cx88_core *core=chip->core; @@ -598,7 +595,7 @@ static int snd_cx88_capture_volume_put(struct snd_kcontrol *kcontrol, return v != old_control; } -static struct snd_kcontrol_new snd_cx88_capture_volume = { +static snd_kcontrol_new_t snd_cx88_capture_volume = { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = "Capture Volume", .info = snd_cx88_capture_volume_info, @@ -616,7 +613,7 @@ static struct snd_kcontrol_new snd_cx88_capture_volume = { * Only boards with eeprom and byte 1 at eeprom=1 have it */ -static struct pci_device_id cx88_audio_pci_tbl[] __devinitdata = { +static struct pci_device_id cx88_audio_pci_tbl[] = { {0x14f1,0x8801,PCI_ANY_ID,PCI_ANY_ID,0,0,0}, {0x14f1,0x8811,PCI_ANY_ID,PCI_ANY_ID,0,0,0}, {0, } @@ -644,7 +641,7 @@ static int snd_cx88_free(snd_cx88_card_t *chip) /* * Component Destructor */ -static void snd_cx88_dev_free(struct snd_card * card) +static void snd_cx88_dev_free(snd_card_t * card) { snd_cx88_card_t *chip = card->private_data; @@ -657,9 +654,8 @@ static void snd_cx88_dev_free(struct snd_card * card) */ static int devno; -static int __devinit snd_cx88_create(struct snd_card *card, - struct pci_dev *pci, - snd_cx88_card_t **rchip) +static int __devinit snd_cx88_create(snd_card_t *card, struct pci_dev *pci, + snd_cx88_card_t **rchip) { snd_cx88_card_t *chip; struct cx88_core *core; @@ -676,11 +672,6 @@ static int __devinit snd_cx88_create(struct snd_card *card, chip = (snd_cx88_card_t *) card->private_data; core = cx88_core_get(pci); - if (NULL == core) { - err = -EINVAL; - kfree (chip); - return err; - } if (!pci_dma_supported(pci,0xffffffff)) { dprintk(0, "%s/1: Oops: no 32bit PCI DMA ???\n",core->name); @@ -696,11 +687,17 @@ static int __devinit snd_cx88_create(struct snd_card *card, chip->irq = -1; spin_lock_init(&chip->reg_lock); + cx88_reset(core); + if (NULL == core) { + err = -EINVAL; + kfree (chip); + return err; + } chip->core = core; /* get irq */ err = request_irq(chip->pci->irq, cx8801_irq, - IRQF_SHARED | IRQF_DISABLED, chip->core->name, chip); + SA_SHIRQ | SA_INTERRUPT, chip->core->name, chip); if (err < 0) { dprintk(0, "%s: can't get IRQ %d\n", chip->core->name, chip->pci->irq); @@ -712,9 +709,9 @@ static int __devinit snd_cx88_create(struct snd_card *card, pci_read_config_byte(pci, PCI_LATENCY_TIMER, &chip->pci_lat); dprintk(1,"ALSA %s/%i: found at %s, rev: %d, irq: %d, " - "latency: %d, mmio: 0x%llx\n", core->name, devno, + "latency: %d, mmio: 0x%lx\n", core->name, devno, pci_name(pci), chip->pci_rev, pci->irq, - chip->pci_lat,(unsigned long long)pci_resource_start(pci,0)); + chip->pci_lat,pci_resource_start(pci,0)); chip->irq = pci->irq; synchronize_irq(chip->irq); @@ -729,7 +726,7 @@ static int __devinit snd_cx88_create(struct snd_card *card, static int __devinit cx88_audio_initdev(struct pci_dev *pci, const struct pci_device_id *pci_id) { - struct snd_card *card; + snd_card_t *card; snd_cx88_card_t *chip; int err; @@ -766,8 +763,8 @@ static int __devinit cx88_audio_initdev(struct pci_dev *pci, strcpy (card->driver, "CX88x"); sprintf(card->shortname, "Conexant CX%x", pci->device); - sprintf(card->longname, "%s at %#llx", - card->shortname,(unsigned long long)pci_resource_start(pci, 0)); + sprintf(card->longname, "%s at %#lx", + card->shortname, pci_resource_start(pci, 0)); strcpy (card->mixername, "CX88"); dprintk (0, "%s/%i: ALSA support for cx2388x boards\n", diff --git a/drivers/media/video/cx88/cx88-blackbird.c b/drivers/media/video/cx88/cx88-blackbird.c index b60177f17..a502a4d6e 100644 --- a/drivers/media/video/cx88/cx88-blackbird.c +++ b/drivers/media/video/cx88/cx88-blackbird.c @@ -30,10 +30,9 @@ #include #include #include -#include -#include #include "cx88.h" +#include MODULE_DESCRIPTION("driver for cx2388x/cx23416 based mpeg encoder cards"); MODULE_AUTHOR("Jelle Foks , Gerd Knorr [SuSE Labs]"); @@ -54,6 +53,7 @@ static LIST_HEAD(cx8802_devlist); /* ------------------------------------------------------------------ */ +#define BLACKBIRD_FIRM_ENC_FILENAME "blackbird-fw-enc.bin" #define BLACKBIRD_FIRM_IMAGE_SIZE 256*1024 /* defines below are from ivtv-driver.h */ @@ -63,6 +63,8 @@ static LIST_HEAD(cx8802_devlist); /* Firmware API commands */ #define IVTV_API_STD_TIMEOUT 500 +#define BLACKBIRD_API_PING 0x80 +#define BLACKBIRD_API_BEGIN_CAPTURE 0x81 enum blackbird_capture_type { BLACKBIRD_MPEG_CAPTURE, BLACKBIRD_RAW_CAPTURE, @@ -76,29 +78,205 @@ enum blackbird_capture_bits { BLACKBIRD_RAW_BITS_PASSTHRU_CAPTURE = 0x08, BLACKBIRD_RAW_BITS_TO_HOST_CAPTURE = 0x10 }; +#define BLACKBIRD_API_END_CAPTURE 0x82 enum blackbird_capture_end { BLACKBIRD_END_AT_GOP, /* stop at the end of gop, generate irq */ BLACKBIRD_END_NOW, /* stop immediately, no irq */ }; +#define BLACKBIRD_API_SET_AUDIO_ID 0x89 +#define BLACKBIRD_API_SET_VIDEO_ID 0x8B +#define BLACKBIRD_API_SET_PCR_ID 0x8D +#define BLACKBIRD_API_SET_FRAMERATE 0x8F enum blackbird_framerate { BLACKBIRD_FRAMERATE_NTSC_30, /* NTSC: 30fps */ BLACKBIRD_FRAMERATE_PAL_25 /* PAL: 25fps */ }; +#define BLACKBIRD_API_SET_RESOLUTION 0x91 +#define BLACKBIRD_API_SET_VIDEO_BITRATE 0x95 +enum blackbird_video_bitrate_type { + BLACKBIRD_VIDEO_VBR, + BLACKBIRD_VIDEO_CBR +}; +#define BLACKBIRD_PEAK_RATE_DIVISOR 400 +enum blackbird_mux_rate { + BLACKBIRD_MUX_RATE_DEFAULT, + /* dvd mux rate: multiply by 400 to get the actual rate */ + BLACKBIRD_MUX_RATE_DVD = 25200 +}; +#define BLACKBIRD_API_SET_GOP_STRUCTURE 0x97 +#define BLACKBIRD_API_SET_ASPECT_RATIO 0x99 +enum blackbird_aspect_ratio { + BLACKBIRD_ASPECT_RATIO_FORBIDDEN, + BLACKBIRD_ASPECT_RATIO_1_1_SQUARE, + BLACKBIRD_ASPECT_RATIO_4_3, + BLACKBIRD_ASPECT_RATIO_16_9, + BLACKBIRD_ASPECT_RATIO_221_100, + BLACKBIRD_ASPECT_RATIO_RESERVED +}; +#define BLACKBIRD_API_SET_DNR_MODE 0x9B +enum blackbird_dnr_bits { + BLACKBIRD_DNR_BITS_MANUAL, + BLACKBIRD_DNR_BITS_AUTO_SPATIAL, + BLACKBIRD_DNR_BITS_AUTO_TEMPORAL, + BLACKBIRD_DNR_BITS_AUTO +}; +enum blackbird_median_filter { + BLACKBIRD_MEDIAN_FILTER_DISABLED, + BLACKBIRD_MEDIAN_FILTER_HORIZONTAL, + BLACKBIRD_MEDIAN_FILTER_VERTICAL, + BLACKBIRD_MEDIAN_FILTER_HV, + BLACKBIRD_MEDIAN_FILTER_DIAGONAL +}; +#define BLACKBIRD_API_SET_MANUAL_DNR 0x9D +#define BLACKBIRD_API_SET_DNR_MEDIAN 0x9F +#define BLACKBIRD_API_SET_SPATIAL_FILTER 0xA1 +enum blackbird_spatial_filter_luma { + BLACKBIRD_SPATIAL_FILTER_LUMA_DISABLED, + BLACKBIRD_SPATIAL_FILTER_LUMA_1D_HORIZ, + BLACKBIRD_SPATIAL_FILTER_LUMA_1D_VERT, + BLACKBIRD_SPATIAL_FILTER_LUMA_2D_HV, /* separable, default */ + BLACKBIRD_SPATIAL_FILTER_LUMA_2D_SYMM /* symmetric non-separable */ +}; +enum blackbird_spatial_filter_chroma { + BLACKBIRD_SPATIAL_FILTER_CHROMA_DISABLED, + BLACKBIRD_SPATIAL_FILTER_CHROMA_1D_HORIZ /* default */ +}; +#define BLACKBIRD_API_SET_3_2_PULLDOWN 0xB1 +enum blackbird_pulldown { + BLACKBIRD_3_2_PULLDOWN_DISABLED, + BLACKBIRD_3_2_PULLDOWN_ENABLED +}; +#define BLACKBIRD_API_SET_VBI_LINE_NO 0xB7 +enum blackbird_vbi_line_bits { + BLACKBIRD_VBI_LINE_BITS_TOP_FIELD, + BLACKBIRD_VBI_LINE_BITS_BOT_FIELD = (1 << 31), + BLACKBIRD_VBI_LINE_BITS_ALL_LINES = 0xFFFFFFFF +}; +enum blackbird_vbi_line { + BLACKBIRD_VBI_LINE_DISABLED, + BLACKBIRD_VBI_LINE_ENABLED +}; +enum blackbird_vbi_slicing { + BLACKBIRD_VBI_SLICING_NONE, + BLACKBIRD_VBI_SLICING_CLOSED_CAPTION +}; +#define BLACKBIRD_API_SET_STREAM_TYPE 0xB9 +enum blackbird_stream_type { + BLACKBIRD_STREAM_PROGRAM, + BLACKBIRD_STREAM_TRANSPORT, + BLACKBIRD_STREAM_MPEG1, + BLACKBIRD_STREAM_PES_AV, + BLACKBIRD_STREAM_UNKNOWN4, + BLACKBIRD_STREAM_PES_VIDEO, + BLACKBIRD_STREAM_UNKNOWN6, + BLACKBIRD_STREAM_PES_AUDIO, + BLACKBIRD_STREAM_UNKNOWN8, + BLACKBIRD_STREAM_UNKNOWN9, /* audio/pcm ? */ + BLACKBIRD_STREAM_DVD, + BLACKBIRD_STREAM_VCD, + BLACKBIRD_STREAM_UNKNOWN12 /* svcd/xvcd ? */ +}; +#define BLACKBIRD_API_SET_OUTPUT_PORT 0xBB enum blackbird_stream_port { BLACKBIRD_OUTPUT_PORT_MEMORY, BLACKBIRD_OUTPUT_PORT_STREAMING, BLACKBIRD_OUTPUT_PORT_SERIAL }; +#define BLACKBIRD_API_SET_AUDIO_PARAMS 0xBD +enum blackbird_audio_bits_sample_rate { + BLACKBIRD_AUDIO_BITS_44100HZ, + BLACKBIRD_AUDIO_BITS_48000HZ, + BLACKBIRD_AUDIO_BITS_32000HZ, + BLACKBIRD_AUDIO_BITS_RESERVED_HZ, +}; +enum blackbird_audio_bits_encoding { + BLACKBIRD_AUDIO_BITS_LAYER_1 = 0x1 << 2, + BLACKBIRD_AUDIO_BITS_LAYER_2 = 0x2 << 2, +}; +enum blackbird_audio_bits_bitrate_layer_1 { + BLACKBIRD_AUDIO_BITS_LAYER_1_FREE_FORMAT, + BLACKBIRD_AUDIO_BITS_LAYER_1_32 = 0x01 << 4, + BLACKBIRD_AUDIO_BITS_LAYER_1_64 = 0x02 << 4, + BLACKBIRD_AUDIO_BITS_LAYER_1_96 = 0x03 << 4, + BLACKBIRD_AUDIO_BITS_LAYER_1_128 = 0x04 << 4, + BLACKBIRD_AUDIO_BITS_LAYER_1_160 = 0x05 << 4, + BLACKBIRD_AUDIO_BITS_LAYER_1_192 = 0x06 << 4, + BLACKBIRD_AUDIO_BITS_LAYER_1_224 = 0x07 << 4, + BLACKBIRD_AUDIO_BITS_LAYER_1_256 = 0x08 << 4, + BLACKBIRD_AUDIO_BITS_LAYER_1_288 = 0x09 << 4, + BLACKBIRD_AUDIO_BITS_LAYER_1_320 = 0x0A << 4, + BLACKBIRD_AUDIO_BITS_LAYER_1_352 = 0x0B << 4, + BLACKBIRD_AUDIO_BITS_LAYER_1_384 = 0x0C << 4, + BLACKBIRD_AUDIO_BITS_LAYER_1_416 = 0x0D << 4, + BLACKBIRD_AUDIO_BITS_LAYER_1_448 = 0x0E << 4, +}; +enum blackbird_audio_bits_bitrate_layer_2 { + BLACKBIRD_AUDIO_BITS_LAYER_2_FREE_FORMAT, + BLACKBIRD_AUDIO_BITS_LAYER_2_32 = 0x01 << 4, + BLACKBIRD_AUDIO_BITS_LAYER_2_48 = 0x02 << 4, + BLACKBIRD_AUDIO_BITS_LAYER_2_56 = 0x03 << 4, + BLACKBIRD_AUDIO_BITS_LAYER_2_64 = 0x04 << 4, + BLACKBIRD_AUDIO_BITS_LAYER_2_80 = 0x05 << 4, + BLACKBIRD_AUDIO_BITS_LAYER_2_96 = 0x06 << 4, + BLACKBIRD_AUDIO_BITS_LAYER_2_112 = 0x07 << 4, + BLACKBIRD_AUDIO_BITS_LAYER_2_128 = 0x08 << 4, + BLACKBIRD_AUDIO_BITS_LAYER_2_160 = 0x09 << 4, + BLACKBIRD_AUDIO_BITS_LAYER_2_192 = 0x0A << 4, + BLACKBIRD_AUDIO_BITS_LAYER_2_224 = 0x0B << 4, + BLACKBIRD_AUDIO_BITS_LAYER_2_256 = 0x0C << 4, + BLACKBIRD_AUDIO_BITS_LAYER_2_320 = 0x0D << 4, + BLACKBIRD_AUDIO_BITS_LAYER_2_384 = 0x0E << 4, +}; +enum blackbird_audio_bits_mode { + BLACKBIRD_AUDIO_BITS_STEREO, + BLACKBIRD_AUDIO_BITS_JOINT_STEREO = 0x1 << 8, + BLACKBIRD_AUDIO_BITS_DUAL = 0x2 << 8, + BLACKBIRD_AUDIO_BITS_MONO = 0x3 << 8, +}; +enum blackbird_audio_bits_mode_extension { + BLACKBIRD_AUDIO_BITS_BOUND_4, + BLACKBIRD_AUDIO_BITS_BOUND_8 = 0x1 << 10, + BLACKBIRD_AUDIO_BITS_BOUND_12 = 0x2 << 10, + BLACKBIRD_AUDIO_BITS_BOUND_16 = 0x3 << 10, +}; +enum blackbird_audio_bits_emphasis { + BLACKBIRD_AUDIO_BITS_EMPHASIS_NONE, + BLACKBIRD_AUDIO_BITS_EMPHASIS_50_15 = 0x1 << 12, + BLACKBIRD_AUDIO_BITS_EMPHASIS_RESERVED = 0x2 << 12, + BLACKBIRD_AUDIO_BITS_EMPHASIS_CCITT_J17 = 0x3 << 12, +}; +enum blackbird_audio_bits_crc { + BLACKBIRD_AUDIO_BITS_CRC_OFF, + BLACKBIRD_AUDIO_BITS_CRC_ON = 0x1 << 14, +}; +enum blackbird_audio_bits_copyright { + BLACKBIRD_AUDIO_BITS_COPYRIGHT_OFF, + BLACKBIRD_AUDIO_BITS_COPYRIGHT_ON = 0x1 << 15, +}; +enum blackbird_audio_bits_original { + BLACKBIRD_AUDIO_BITS_COPY, + BLACKBIRD_AUDIO_BITS_ORIGINAL = 0x1 << 16, +}; +#define BLACKBIRD_API_HALT 0xC3 +#define BLACKBIRD_API_GET_VERSION 0xC4 +#define BLACKBIRD_API_SET_GOP_CLOSURE 0xC5 +enum blackbird_gop_closure { + BLACKBIRD_GOP_CLOSURE_OFF, + BLACKBIRD_GOP_CLOSURE_ON, +}; +#define BLACKBIRD_API_DATA_XFER_STATUS 0xC6 enum blackbird_data_xfer_status { BLACKBIRD_MORE_BUFFERS_FOLLOW, BLACKBIRD_LAST_BUFFER, }; +#define BLACKBIRD_API_PROGRAM_INDEX_INFO 0xC7 enum blackbird_picture_mask { BLACKBIRD_PICTURE_MASK_NONE, BLACKBIRD_PICTURE_MASK_I_FRAMES, BLACKBIRD_PICTURE_MASK_I_P_FRAMES = 0x3, BLACKBIRD_PICTURE_MASK_ALL_FRAMES = 0x7, }; +#define BLACKBIRD_API_SET_VBI_PARAMS 0xC8 enum blackbird_vbi_mode_bits { BLACKBIRD_VBI_BITS_SLICED, BLACKBIRD_VBI_BITS_RAW, @@ -110,23 +288,33 @@ enum blackbird_vbi_insertion_bits { BLACKBIRD_VBI_BITS_SEPARATE_STREAM_USR_DATA = 0x4 << 1, BLACKBIRD_VBI_BITS_SEPARATE_STREAM_PRV_DATA = 0x5 << 1, }; +#define BLACKBIRD_API_SET_DMA_BLOCK_SIZE 0xC9 enum blackbird_dma_unit { BLACKBIRD_DMA_BYTES, BLACKBIRD_DMA_FRAMES, }; +#define BLACKBIRD_API_DMA_TRANSFER_INFO 0xCA +#define BLACKBIRD_API_DMA_TRANSFER_STAT 0xCB enum blackbird_dma_transfer_status_bits { BLACKBIRD_DMA_TRANSFER_BITS_DONE = 0x01, BLACKBIRD_DMA_TRANSFER_BITS_ERROR = 0x04, BLACKBIRD_DMA_TRANSFER_BITS_LL_ERROR = 0x10, }; +#define BLACKBIRD_API_SET_DMA2HOST_ADDR 0xCC +#define BLACKBIRD_API_INIT_VIDEO_INPUT 0xCD +#define BLACKBIRD_API_SET_FRAMESKIP 0xD0 +#define BLACKBIRD_API_PAUSE 0xD2 enum blackbird_pause { BLACKBIRD_PAUSE_ENCODING, BLACKBIRD_RESUME_ENCODING, }; +#define BLACKBIRD_API_REFRESH_INPUT 0xD3 +#define BLACKBIRD_API_SET_COPYRIGHT 0xD4 enum blackbird_copyright { BLACKBIRD_COPYRIGHT_OFF, BLACKBIRD_COPYRIGHT_ON, }; +#define BLACKBIRD_API_SET_NOTIFICATION 0xD5 enum blackbird_notification_type { BLACKBIRD_NOTIFICATION_REFRESH, }; @@ -137,6 +325,7 @@ enum blackbird_notification_status { enum blackbird_notification_mailbox { BLACKBIRD_NOTIFICATION_NO_MAILBOX = -1, }; +#define BLACKBIRD_API_SET_CAPTURE_LINES 0xD6 enum blackbird_field1_lines { BLACKBIRD_FIELD1_SAA7114 = 0x00EF, /* 239 */ BLACKBIRD_FIELD1_SAA7115 = 0x00F0, /* 240 */ @@ -147,10 +336,12 @@ enum blackbird_field2_lines { BLACKBIRD_FIELD2_SAA7115 = 0x00F0, /* 240 */ BLACKBIRD_FIELD2_MICRONAS = 0x0106, /* 262 */ }; +#define BLACKBIRD_API_SET_CUSTOM_DATA 0xD7 enum blackbird_custom_data_type { BLACKBIRD_CUSTOM_EXTENSION_USR_DATA, BLACKBIRD_CUSTOM_PRIVATE_PACKET, }; +#define BLACKBIRD_API_MUTE_VIDEO 0xD9 enum blackbird_mute { BLACKBIRD_UNMUTE, BLACKBIRD_MUTE, @@ -165,6 +356,7 @@ enum blackbird_mute_video_shift { BLACKBIRD_MUTE_VIDEO_U_SHIFT = 16, BLACKBIRD_MUTE_VIDEO_Y_SHIFT = 24, }; +#define BLACKBIRD_API_MUTE_AUDIO 0xDA /* Registers */ #define IVTV_REG_ENC_SDRAM_REFRESH (0x07F8 /*| IVTV_REG_OFFSET*/) @@ -306,12 +498,15 @@ static int register_read(struct cx88_core *core, u32 address, u32 *value) /* ------------------------------------------------------------------ */ -static int blackbird_mbox_func(void *priv, int command, int in, int out, u32 data[CX2341X_MBOX_MAX_DATA]) +/* We don't need to call the API often, so using just one mailbox will probably suffice */ +static int blackbird_api_cmd(struct cx8802_dev *dev, u32 command, + u32 inputcnt, u32 outputcnt, ...) { - struct cx8802_dev *dev = priv; unsigned long timeout; u32 value, flag, retval; int i; + va_list args; + va_start(args, outputcnt); dprintk(1,"%s: 0x%X\n", __FUNCTION__, command); @@ -335,11 +530,12 @@ static int blackbird_mbox_func(void *priv, int command, int in, int out, u32 dat /* write command + args + fill remaining with zeros */ memory_write(dev->core, dev->mailbox + 1, command); /* command code */ memory_write(dev->core, dev->mailbox + 3, IVTV_API_STD_TIMEOUT); /* timeout */ - for (i = 0; i < in; i++) { - memory_write(dev->core, dev->mailbox + 4 + i, data[i]); - dprintk(1, "API Input %d = %d\n", i, data[i]); + for (i = 0; i < inputcnt ; i++) { + value = va_arg(args, int); + memory_write(dev->core, dev->mailbox + 4 + i, value); + dprintk(1, "API Input %d = %d\n", i, value); } - for (; i < CX2341X_MBOX_MAX_DATA; i++) + for (; i < 16 ; i++) memory_write(dev->core, dev->mailbox + 4 + i, 0); flag |= 3; /* tell 'em we're done writing */ @@ -359,10 +555,12 @@ static int blackbird_mbox_func(void *priv, int command, int in, int out, u32 dat } /* read output values */ - for (i = 0; i < out; i++) { - memory_read(dev->core, dev->mailbox + 4 + i, data + i); - dprintk(1, "API Output %d = %d\n", i, data[i]); + for (i = 0; i < outputcnt ; i++) { + int *vptr = va_arg(args, int *); + memory_read(dev->core, dev->mailbox + 4 + i, vptr); + dprintk(1, "API Output %d = %d\n", i, *vptr); } + va_end(args); memory_read(dev->core, dev->mailbox + 2, &retval); dprintk(1, "API result = %d\n",retval); @@ -371,29 +569,7 @@ static int blackbird_mbox_func(void *priv, int command, int in, int out, u32 dat memory_write(dev->core, dev->mailbox, flag); return retval; } -/* ------------------------------------------------------------------ */ - -/* We don't need to call the API often, so using just one mailbox will probably suffice */ -static int blackbird_api_cmd(struct cx8802_dev *dev, u32 command, - u32 inputcnt, u32 outputcnt, ...) -{ - u32 data[CX2341X_MBOX_MAX_DATA]; - va_list vargs; - int i, err; - va_start(vargs, outputcnt); - - for (i = 0; i < inputcnt; i++) { - data[i] = va_arg(vargs, int); - } - err = blackbird_mbox_func(dev, command, inputcnt, outputcnt, data); - for (i = 0; i < outputcnt; i++) { - int *vptr = va_arg(vargs, int *); - *vptr = data[i]; - } - va_end(vargs); - return err; -} static int blackbird_find_mailbox(struct cx8802_dev *dev) { @@ -438,13 +614,13 @@ static int blackbird_load_firmware(struct cx8802_dev *dev) if (retval < 0) dprintk(0, "Error with register_write\n"); - retval = request_firmware(&firmware, CX2341X_FIRM_ENC_FILENAME, + retval = request_firmware(&firmware, BLACKBIRD_FIRM_ENC_FILENAME, &dev->pci->dev); if (retval != 0) { dprintk(0, "ERROR: Hotplug firmware request failed (%s).\n", - CX2341X_FIRM_ENC_FILENAME); + BLACKBIRD_FIRM_ENC_FILENAME); dprintk(0, "Please fix your hotplug setup, the board will " "not work without firmware loaded!\n"); return -1; @@ -453,13 +629,11 @@ static int blackbird_load_firmware(struct cx8802_dev *dev) if (firmware->size != BLACKBIRD_FIRM_IMAGE_SIZE) { dprintk(0, "ERROR: Firmware size mismatch (have %zd, expected %d)\n", firmware->size, BLACKBIRD_FIRM_IMAGE_SIZE); - release_firmware(firmware); return -1; } if (0 != memcmp(firmware->data, magic, 8)) { dprintk(0, "ERROR: Firmware magic mismatch, wrong file?\n"); - release_firmware(firmware); return -1; } @@ -480,7 +654,6 @@ static int blackbird_load_firmware(struct cx8802_dev *dev) } if (checksum) { dprintk(0, "ERROR: Firmware load failed (checksum mismatch).\n"); - release_firmware(firmware); return -1; } release_firmware(firmware); @@ -513,19 +686,12 @@ DB* DVD | MPEG2 | 720x576PAL | CBR | 600 :Good | 6000 Kbps | 25fps | M *DB: "DirectBurn" */ -static void blackbird_codec_settings(struct cx8802_dev *dev) -{ - /* assign frame size */ - blackbird_api_cmd(dev, CX2341X_ENC_SET_FRAME_SIZE, 2, 0, - dev->height, dev->width); - - dev->params.width = dev->width; - dev->params.height = dev->height; - dev->params.is_50hz = (dev->core->tvnorm->id & V4L2_STD_625_50) != 0; - - cx2341x_update(dev, blackbird_mbox_func, NULL, &dev->params); -} - +static struct blackbird_dnr default_dnr_params = { + .mode = BLACKBIRD_DNR_BITS_MANUAL, + .type = BLACKBIRD_MEDIAN_FILTER_DISABLED, + .spatial = 0, + .temporal = 0 +}; static struct v4l2_mpeg_compression default_mpeg_params = { .st_type = V4L2_MPEG_PS_2, .st_bitrate = { @@ -546,7 +712,7 @@ static struct v4l2_mpeg_compression default_mpeg_params = { .target = 224, .max = 224 }, - .au_sample_rate = 48000, + .au_sample_rate = 44100, .au_pesid = 0, .vi_type = V4L2_MPEG_VI_2, .vi_aspect_ratio = V4L2_MPEG_ASPECT_4_3, @@ -557,13 +723,524 @@ static struct v4l2_mpeg_compression default_mpeg_params = { .max = 6000 }, .vi_frame_rate = 25, - .vi_frames_per_gop = 12, + .vi_frames_per_gop = 15, .vi_bframes_count = 2, .vi_pesid = 0, - .closed_gops = 1, + .closed_gops = 0, .pulldown = 0 }; +static enum blackbird_stream_type mpeg_stream_types[] = { + [V4L2_MPEG_SS_1] = BLACKBIRD_STREAM_MPEG1, + [V4L2_MPEG_PS_2] = BLACKBIRD_STREAM_PROGRAM, + [V4L2_MPEG_TS_2] = BLACKBIRD_STREAM_TRANSPORT, + [V4L2_MPEG_PS_DVD] = BLACKBIRD_STREAM_DVD, +}; +static enum blackbird_aspect_ratio mpeg_stream_ratios[] = { + [V4L2_MPEG_ASPECT_SQUARE] = BLACKBIRD_ASPECT_RATIO_1_1_SQUARE, + [V4L2_MPEG_ASPECT_4_3] = BLACKBIRD_ASPECT_RATIO_4_3, + [V4L2_MPEG_ASPECT_16_9] = BLACKBIRD_ASPECT_RATIO_16_9, + [V4L2_MPEG_ASPECT_1_221] = BLACKBIRD_ASPECT_RATIO_221_100, +}; +static enum blackbird_video_bitrate_type mpeg_video_bitrates[] = { + [V4L2_BITRATE_NONE] = BLACKBIRD_VIDEO_CBR, + [V4L2_BITRATE_CBR] = BLACKBIRD_VIDEO_CBR, + [V4L2_BITRATE_VBR] = BLACKBIRD_VIDEO_VBR, +}; +/* find the best layer I/II bitrate to fit a given numeric value */ +struct bitrate_bits { + u32 bits; /* layer bits for the best fit */ + u32 rate; /* actual numeric value for the layer best fit */ +}; +struct bitrate_approximation { + u32 target; /* numeric value of the rate we want */ + struct bitrate_bits layer[2]; +}; +static struct bitrate_approximation mpeg_audio_bitrates[] = { + /* target layer[0].bits layer[0].rate layer[1].bits layer[1].rate */ + { 0, { { 0, 0, }, { 0, 0, }, }, }, + { 32, { { BLACKBIRD_AUDIO_BITS_LAYER_1_32 , 32, }, { BLACKBIRD_AUDIO_BITS_LAYER_2_32 , 32, }, }, }, + { 48, { { BLACKBIRD_AUDIO_BITS_LAYER_1_64 , 64, }, { BLACKBIRD_AUDIO_BITS_LAYER_2_48 , 48, }, }, }, + { 56, { { BLACKBIRD_AUDIO_BITS_LAYER_1_64 , 64, }, { BLACKBIRD_AUDIO_BITS_LAYER_2_56 , 56, }, }, }, + { 64, { { BLACKBIRD_AUDIO_BITS_LAYER_1_64 , 64, }, { BLACKBIRD_AUDIO_BITS_LAYER_2_64 , 64, }, }, }, + { 80, { { BLACKBIRD_AUDIO_BITS_LAYER_1_96 , 96, }, { BLACKBIRD_AUDIO_BITS_LAYER_2_80 , 80, }, }, }, + { 96, { { BLACKBIRD_AUDIO_BITS_LAYER_1_96 , 96, }, { BLACKBIRD_AUDIO_BITS_LAYER_2_96 , 96, }, }, }, + { 112, { { BLACKBIRD_AUDIO_BITS_LAYER_1_128, 128, }, { BLACKBIRD_AUDIO_BITS_LAYER_2_112, 112, }, }, }, + { 128, { { BLACKBIRD_AUDIO_BITS_LAYER_1_128, 128, }, { BLACKBIRD_AUDIO_BITS_LAYER_2_128, 128, }, }, }, + { 160, { { BLACKBIRD_AUDIO_BITS_LAYER_1_160, 160, }, { BLACKBIRD_AUDIO_BITS_LAYER_2_160, 160, }, }, }, + { 192, { { BLACKBIRD_AUDIO_BITS_LAYER_1_192, 192, }, { BLACKBIRD_AUDIO_BITS_LAYER_2_192, 192, }, }, }, + { 224, { { BLACKBIRD_AUDIO_BITS_LAYER_1_224, 224, }, { BLACKBIRD_AUDIO_BITS_LAYER_2_224, 224, }, }, }, + { 256, { { BLACKBIRD_AUDIO_BITS_LAYER_1_256, 256, }, { BLACKBIRD_AUDIO_BITS_LAYER_2_256, 256, }, }, }, + { 288, { { BLACKBIRD_AUDIO_BITS_LAYER_1_288, 288, }, { BLACKBIRD_AUDIO_BITS_LAYER_2_320, 320, }, }, }, + { 320, { { BLACKBIRD_AUDIO_BITS_LAYER_1_320, 320, }, { BLACKBIRD_AUDIO_BITS_LAYER_2_320, 320, }, }, }, + { 352, { { BLACKBIRD_AUDIO_BITS_LAYER_1_352, 352, }, { BLACKBIRD_AUDIO_BITS_LAYER_2_384, 384, }, }, }, + { 384, { { BLACKBIRD_AUDIO_BITS_LAYER_1_384, 384, }, { BLACKBIRD_AUDIO_BITS_LAYER_2_384, 384, }, }, }, + { 416, { { BLACKBIRD_AUDIO_BITS_LAYER_1_416, 416, }, { BLACKBIRD_AUDIO_BITS_LAYER_2_384, 384, }, }, }, + { 448, { { BLACKBIRD_AUDIO_BITS_LAYER_1_448, 448, }, { BLACKBIRD_AUDIO_BITS_LAYER_2_384, 384, }, }, }, +}; +static const int BITRATES_SIZE = ARRAY_SIZE(mpeg_audio_bitrates); + +static void blackbird_set_default_params(struct cx8802_dev *dev) +{ + struct v4l2_mpeg_compression *params = &dev->params; + u32 au_params; + + /* assign stream type */ + if( params->st_type >= ARRAY_SIZE(mpeg_stream_types) ) + params->st_type = V4L2_MPEG_PS_2; + if( params->st_type == V4L2_MPEG_SS_1 ) + params->vi_type = V4L2_MPEG_VI_1; + else + params->vi_type = V4L2_MPEG_VI_2; + blackbird_api_cmd(dev, BLACKBIRD_API_SET_STREAM_TYPE, 1, 0, mpeg_stream_types[params->st_type]); + + /* assign framerate */ + if( params->vi_frame_rate <= 25 ) + { + params->vi_frame_rate = 25; + blackbird_api_cmd(dev, BLACKBIRD_API_SET_FRAMERATE, 1, 0, BLACKBIRD_FRAMERATE_PAL_25); + } + else + { + params->vi_frame_rate = 30; + blackbird_api_cmd(dev, BLACKBIRD_API_SET_FRAMERATE, 1, 0, BLACKBIRD_FRAMERATE_NTSC_30); + } + + /* assign aspect ratio */ + if( params->vi_aspect_ratio >= ARRAY_SIZE(mpeg_stream_ratios) ) + params->vi_aspect_ratio = V4L2_MPEG_ASPECT_4_3; + blackbird_api_cmd(dev, BLACKBIRD_API_SET_ASPECT_RATIO, 1, 0, mpeg_stream_ratios[params->vi_aspect_ratio]); + + /* assign gop properties */ + blackbird_api_cmd(dev, BLACKBIRD_API_SET_GOP_STRUCTURE, 2, 0, params->vi_frames_per_gop, params->vi_bframes_count+1); + + /* assign gop closure */ + blackbird_api_cmd(dev, BLACKBIRD_API_SET_GOP_CLOSURE, 1, 0, params->closed_gops); + + /* assign 3 2 pulldown */ + blackbird_api_cmd(dev, BLACKBIRD_API_SET_3_2_PULLDOWN, 1, 0, params->pulldown); + + /* make sure the params are within bounds */ + if( params->st_bitrate.mode >= ARRAY_SIZE(mpeg_video_bitrates) ) + params->vi_bitrate.mode = V4L2_BITRATE_NONE; + if( params->vi_bitrate.mode >= ARRAY_SIZE(mpeg_video_bitrates) ) + params->vi_bitrate.mode = V4L2_BITRATE_NONE; + if( params->au_bitrate.mode >= ARRAY_SIZE(mpeg_video_bitrates) ) + params->au_bitrate.mode = V4L2_BITRATE_NONE; + + /* assign audio properties */ + /* note: it's not necessary to set the samplerate, the mpeg encoder seems to autodetect/adjust */ + au_params = BLACKBIRD_AUDIO_BITS_STEREO | + /* BLACKBIRD_AUDIO_BITS_BOUND_4 | */ + BLACKBIRD_AUDIO_BITS_EMPHASIS_NONE | + BLACKBIRD_AUDIO_BITS_CRC_OFF | + BLACKBIRD_AUDIO_BITS_COPYRIGHT_OFF | + BLACKBIRD_AUDIO_BITS_COPY | + 0; + if( params->au_sample_rate <= 32000 ) + { + params->au_sample_rate = 32000; + au_params |= BLACKBIRD_AUDIO_BITS_32000HZ; + } + else if( params->au_sample_rate <= 44100 ) + { + params->au_sample_rate = 44100; + au_params |= BLACKBIRD_AUDIO_BITS_44100HZ; + } + else + { + params->au_sample_rate = 48000; + au_params |= BLACKBIRD_AUDIO_BITS_48000HZ; + } + if( params->au_type == V4L2_MPEG_AU_2_I ) + { + au_params |= BLACKBIRD_AUDIO_BITS_LAYER_1; + } + else + { + /* TODO: try to handle the other formats more gracefully */ + params->au_type = V4L2_MPEG_AU_2_II; + au_params |= BLACKBIRD_AUDIO_BITS_LAYER_2; + } + if( params->au_bitrate.mode ) + { + int layer; + + if( params->au_bitrate.mode == V4L2_BITRATE_CBR ) + params->au_bitrate.max = params->vi_bitrate.target; + else + params->au_bitrate.target = params->vi_bitrate.max; + + layer = params->au_type; + if( params->au_bitrate.target == 0 ) + { + /* TODO: use the minimum possible bitrate instead of 0 ? */ + au_params |= 0; + } + else if( params->au_bitrate.target >= + mpeg_audio_bitrates[BITRATES_SIZE-1].layer[layer].rate ) + { + /* clamp the bitrate to the max supported by the standard */ + params->au_bitrate.target = mpeg_audio_bitrates[BITRATES_SIZE-1].layer[layer].rate; + params->au_bitrate.max = params->au_bitrate.target; + au_params |= mpeg_audio_bitrates[BITRATES_SIZE-1].layer[layer].bits; + } + else + { + /* round up to the nearest supported bitrate */ + int i; + for(i = 1; i < BITRATES_SIZE; i++) + { + if( params->au_bitrate.target > mpeg_audio_bitrates[i-1].layer[layer].rate && + params->au_bitrate.target <= mpeg_audio_bitrates[i].layer[layer].rate ) + { + params->au_bitrate.target = mpeg_audio_bitrates[i].layer[layer].rate; + params->au_bitrate.max = params->au_bitrate.target; + au_params |= mpeg_audio_bitrates[i].layer[layer].bits; + break; + } + } + } + } + else + { + /* TODO: ??? */ + params->au_bitrate.target = params->au_bitrate.max = 0; + au_params |= 0; + } + blackbird_api_cmd(dev, BLACKBIRD_API_SET_AUDIO_PARAMS, 1, 0, au_params ); + + /* assign bitrates */ + if( params->vi_bitrate.mode ) + { + /* bitrate is set, let's figure out the cbr/vbr mess */ + if( params->vi_bitrate.max < params->vi_bitrate.target ) + { + if( params->vi_bitrate.mode == V4L2_BITRATE_CBR ) + params->vi_bitrate.max = params->vi_bitrate.target; + else + params->vi_bitrate.target = params->vi_bitrate.max; + } + } + else + { + if( params->st_bitrate.max < params->st_bitrate.target ) + { + if( params->st_bitrate.mode == V4L2_BITRATE_VBR ) + params->st_bitrate.target = params->st_bitrate.max; + else + params->st_bitrate.max = params->st_bitrate.target; + } + /* calculate vi_bitrate = st_bitrate - au_bitrate */ + params->vi_bitrate.max = params->st_bitrate.max - params->au_bitrate.max; + params->vi_bitrate.target = params->st_bitrate.target - params->au_bitrate.target; + } + blackbird_api_cmd(dev, BLACKBIRD_API_SET_VIDEO_BITRATE, 4, 0, + mpeg_video_bitrates[params->vi_bitrate.mode], + params->vi_bitrate.target * 1000, /* kbps -> bps */ + params->vi_bitrate.max * 1000 / BLACKBIRD_PEAK_RATE_DIVISOR, /* peak/400 */ + BLACKBIRD_MUX_RATE_DEFAULT /*, 0x70*/); /* encoding buffer, ckennedy */ + + /* TODO: implement the stream ID stuff: + ts_pid_pmt, ts_pid_audio, ts_pid_video, ts_pid_pcr, + ps_size, au_pesid, vi_pesid + */ +} +#define CHECK_PARAM( name ) ( dev->params.name != params->name ) +#define IF_PARAM( name ) if( CHECK_PARAM( name ) ) +#define UPDATE_PARAM( name ) dev->params.name = params->name +void blackbird_set_params(struct cx8802_dev *dev, struct v4l2_mpeg_compression *params) +{ + u32 au_params; + + /* assign stream type */ + if( params->st_type >= ARRAY_SIZE(mpeg_stream_types) ) + params->st_type = V4L2_MPEG_PS_2; + if( params->st_type == V4L2_MPEG_SS_1 ) + params->vi_type = V4L2_MPEG_VI_1; + else + params->vi_type = V4L2_MPEG_VI_2; + if( CHECK_PARAM( st_type ) || CHECK_PARAM( vi_type ) ) + { + UPDATE_PARAM( st_type ); + UPDATE_PARAM( vi_type ); + blackbird_api_cmd(dev, BLACKBIRD_API_SET_STREAM_TYPE, 1, 0, mpeg_stream_types[params->st_type]); + } + + /* assign framerate */ + if( params->vi_frame_rate <= 25 ) + params->vi_frame_rate = 25; + else + params->vi_frame_rate = 30; + IF_PARAM( vi_frame_rate ) + { + UPDATE_PARAM( vi_frame_rate ); + if( params->vi_frame_rate == 25 ) + blackbird_api_cmd(dev, BLACKBIRD_API_SET_FRAMERATE, 1, 0, BLACKBIRD_FRAMERATE_PAL_25); + else + blackbird_api_cmd(dev, BLACKBIRD_API_SET_FRAMERATE, 1, 0, BLACKBIRD_FRAMERATE_NTSC_30); + } + + /* assign aspect ratio */ + if( params->vi_aspect_ratio >= ARRAY_SIZE(mpeg_stream_ratios) ) + params->vi_aspect_ratio = V4L2_MPEG_ASPECT_4_3; + IF_PARAM( vi_aspect_ratio ) + { + UPDATE_PARAM( vi_aspect_ratio ); + blackbird_api_cmd(dev, BLACKBIRD_API_SET_ASPECT_RATIO, 1, 0, mpeg_stream_ratios[params->vi_aspect_ratio]); + } + + /* assign gop properties */ + if( CHECK_PARAM( vi_frames_per_gop ) || CHECK_PARAM( vi_bframes_count ) ) + { + UPDATE_PARAM( vi_frames_per_gop ); + UPDATE_PARAM( vi_bframes_count ); + blackbird_api_cmd(dev, BLACKBIRD_API_SET_GOP_STRUCTURE, 2, 0, params->vi_frames_per_gop, params->vi_bframes_count+1); + } + + /* assign gop closure */ + IF_PARAM( closed_gops ) + { + UPDATE_PARAM( closed_gops ); + blackbird_api_cmd(dev, BLACKBIRD_API_SET_GOP_CLOSURE, 1, 0, params->closed_gops); + } + + /* assign 3 2 pulldown */ + IF_PARAM( pulldown ) + { + UPDATE_PARAM( pulldown ); + blackbird_api_cmd(dev, BLACKBIRD_API_SET_3_2_PULLDOWN, 1, 0, params->pulldown); + } + + /* make sure the params are within bounds */ + if( params->st_bitrate.mode >= ARRAY_SIZE(mpeg_video_bitrates) ) + params->vi_bitrate.mode = V4L2_BITRATE_NONE; + if( params->vi_bitrate.mode >= ARRAY_SIZE(mpeg_video_bitrates) ) + params->vi_bitrate.mode = V4L2_BITRATE_NONE; + if( params->au_bitrate.mode >= ARRAY_SIZE(mpeg_video_bitrates) ) + params->au_bitrate.mode = V4L2_BITRATE_NONE; + + /* assign audio properties */ + /* note: it's not necessary to set the samplerate, the mpeg encoder seems to autodetect/adjust */ + au_params = BLACKBIRD_AUDIO_BITS_STEREO | + /* BLACKBIRD_AUDIO_BITS_BOUND_4 | */ + BLACKBIRD_AUDIO_BITS_EMPHASIS_NONE | + BLACKBIRD_AUDIO_BITS_CRC_OFF | + BLACKBIRD_AUDIO_BITS_COPYRIGHT_OFF | + BLACKBIRD_AUDIO_BITS_COPY | + 0; + if( params->au_sample_rate < 32000 ) + { + params->au_sample_rate = 32000; + au_params |= BLACKBIRD_AUDIO_BITS_32000HZ; + } + else if( params->au_sample_rate < 44100 ) + { + params->au_sample_rate = 44100; + au_params |= BLACKBIRD_AUDIO_BITS_44100HZ; + } + else + { + params->au_sample_rate = 48000; + au_params |= BLACKBIRD_AUDIO_BITS_48000HZ; + } + if( params->au_type == V4L2_MPEG_AU_2_I ) + { + au_params |= BLACKBIRD_AUDIO_BITS_LAYER_1; + } + else + { + /* TODO: try to handle the other formats more gracefully */ + params->au_type = V4L2_MPEG_AU_2_II; + au_params |= BLACKBIRD_AUDIO_BITS_LAYER_2; + } + if( params->au_bitrate.mode ) + { + int layer; + + if( params->au_bitrate.mode == V4L2_BITRATE_CBR ) + params->au_bitrate.max = params->vi_bitrate.target; + else + params->au_bitrate.target = params->vi_bitrate.max; + + layer = params->au_type; + if( params->au_bitrate.target == 0 ) + { + /* TODO: use the minimum possible bitrate instead of 0 ? */ + au_params |= 0; + } + else if( params->au_bitrate.target >= + mpeg_audio_bitrates[BITRATES_SIZE-1].layer[layer].rate ) + { + /* clamp the bitrate to the max supported by the standard */ + params->au_bitrate.target = mpeg_audio_bitrates[BITRATES_SIZE-1].layer[layer].rate; + params->au_bitrate.max = params->au_bitrate.target; + au_params |= mpeg_audio_bitrates[BITRATES_SIZE-1].layer[layer].bits; + } + else + { + /* round up to the nearest supported bitrate */ + int i; + for(i = 1; i < BITRATES_SIZE; i++) + { + if( params->au_bitrate.target > mpeg_audio_bitrates[i-1].layer[layer].rate && + params->au_bitrate.target <= mpeg_audio_bitrates[i].layer[layer].rate ) + { + params->au_bitrate.target = mpeg_audio_bitrates[i].layer[layer].rate; + params->au_bitrate.max = params->au_bitrate.target; + au_params |= mpeg_audio_bitrates[i].layer[layer].bits; + break; + } + } + } + } + else + { + /* TODO: ??? */ + params->au_bitrate.target = params->au_bitrate.max = 0; + au_params |= 0; + } + if( CHECK_PARAM( au_type ) || CHECK_PARAM( au_sample_rate ) + || CHECK_PARAM( au_bitrate.mode ) || CHECK_PARAM( au_bitrate.max ) + || CHECK_PARAM( au_bitrate.target ) + ) + { + UPDATE_PARAM( au_type ); + UPDATE_PARAM( au_sample_rate ); + UPDATE_PARAM( au_bitrate ); + blackbird_api_cmd(dev, BLACKBIRD_API_SET_AUDIO_PARAMS, 1, 0, au_params ); + } + + /* assign bitrates */ + if( params->vi_bitrate.mode ) + { + /* bitrate is set, let's figure out the cbr/vbr mess */ + if( params->vi_bitrate.max < params->vi_bitrate.target ) + { + if( params->vi_bitrate.mode == V4L2_BITRATE_CBR ) + params->vi_bitrate.max = params->vi_bitrate.target; + else + params->vi_bitrate.target = params->vi_bitrate.max; + } + } + else + { + if( params->st_bitrate.max < params->st_bitrate.target ) + { + if( params->st_bitrate.mode == V4L2_BITRATE_VBR ) + params->st_bitrate.target = params->st_bitrate.max; + else + params->st_bitrate.max = params->st_bitrate.target; + } + /* calculate vi_bitrate = st_bitrate - au_bitrate */ + params->vi_bitrate.max = params->st_bitrate.max - params->au_bitrate.max; + params->vi_bitrate.target = params->st_bitrate.target - params->au_bitrate.target; + } + UPDATE_PARAM( st_bitrate ); + if( CHECK_PARAM( vi_bitrate.mode ) || CHECK_PARAM( vi_bitrate.max ) + || CHECK_PARAM( vi_bitrate.target ) + ) + { + UPDATE_PARAM( vi_bitrate ); + blackbird_api_cmd(dev, BLACKBIRD_API_SET_VIDEO_BITRATE, 4, 0, + mpeg_video_bitrates[params->vi_bitrate.mode], + params->vi_bitrate.target * 1000, /* kbps -> bps */ + params->vi_bitrate.max * 1000 / BLACKBIRD_PEAK_RATE_DIVISOR, /* peak/400 */ + BLACKBIRD_MUX_RATE_DEFAULT /*, 0x70*/); /* encoding buffer, ckennedy */ + } + + /* TODO: implement the stream ID stuff: + ts_pid_pmt, ts_pid_audio, ts_pid_video, ts_pid_pcr, + ps_size, au_pesid, vi_pesid + */ + UPDATE_PARAM( ts_pid_pmt ); + UPDATE_PARAM( ts_pid_audio ); + UPDATE_PARAM( ts_pid_video ); + UPDATE_PARAM( ts_pid_pcr ); + UPDATE_PARAM( ps_size ); + UPDATE_PARAM( au_pesid ); + UPDATE_PARAM( vi_pesid ); +} + +static void blackbird_set_default_dnr_params(struct cx8802_dev *dev) +{ + /* assign dnr filter mode */ + if( dev->dnr_params.mode > BLACKBIRD_DNR_BITS_AUTO ) + dev->dnr_params.mode = BLACKBIRD_DNR_BITS_MANUAL; + if( dev->dnr_params.type > BLACKBIRD_MEDIAN_FILTER_DIAGONAL ) + dev->dnr_params.type = BLACKBIRD_MEDIAN_FILTER_DISABLED; + blackbird_api_cmd(dev, BLACKBIRD_API_SET_DNR_MODE, 2, 0, + dev->dnr_params.mode, + dev->dnr_params.type + ); + + /* assign dnr filter props*/ + if( dev->dnr_params.spatial > 15 ) + dev->dnr_params.spatial = 15; + if( dev->dnr_params.temporal > 31 ) + dev->dnr_params.temporal = 31; + blackbird_api_cmd(dev, BLACKBIRD_API_SET_MANUAL_DNR, 2, 0, + dev->dnr_params.spatial, + dev->dnr_params.temporal + ); +} +#define CHECK_DNR_PARAM( name ) ( dev->dnr_params.name != dnr_params->name ) +#define UPDATE_DNR_PARAM( name ) dev->dnr_params.name = dnr_params->name +void blackbird_set_dnr_params(struct cx8802_dev *dev, struct blackbird_dnr* dnr_params) +{ + /* assign dnr filter mode */ + /* clamp values */ + if( dnr_params->mode > BLACKBIRD_DNR_BITS_AUTO ) + dnr_params->mode = BLACKBIRD_DNR_BITS_MANUAL; + if( dnr_params->type > BLACKBIRD_MEDIAN_FILTER_DIAGONAL ) + dnr_params->type = BLACKBIRD_MEDIAN_FILTER_DISABLED; + /* check if the params actually changed */ + if( CHECK_DNR_PARAM( mode ) || CHECK_DNR_PARAM( type ) ) + { + UPDATE_DNR_PARAM( mode ); + UPDATE_DNR_PARAM( type ); + blackbird_api_cmd(dev, BLACKBIRD_API_SET_DNR_MODE, 2, 0, dnr_params->mode, dnr_params->type); + } + + /* assign dnr filter props*/ + if( dnr_params->spatial > 15 ) + dnr_params->spatial = 15; + if( dnr_params->temporal > 31 ) + dnr_params->temporal = 31; + if( CHECK_DNR_PARAM( spatial ) || CHECK_DNR_PARAM( temporal ) ) + { + UPDATE_DNR_PARAM( spatial ); + UPDATE_DNR_PARAM( temporal ); + blackbird_api_cmd(dev, BLACKBIRD_API_SET_MANUAL_DNR, 2, 0, dnr_params->spatial, dnr_params->temporal); + } +} + +static void blackbird_codec_settings(struct cx8802_dev *dev) +{ + + /* assign output port */ + blackbird_api_cmd(dev, BLACKBIRD_API_SET_OUTPUT_PORT, 1, 0, BLACKBIRD_OUTPUT_PORT_STREAMING); /* Host */ + + /* assign frame size */ + blackbird_api_cmd(dev, BLACKBIRD_API_SET_RESOLUTION, 2, 0, + dev->height, dev->width); + + /* assign coring levels (luma_h, luma_l, chroma_h, chroma_l) */ + blackbird_api_cmd(dev, BLACKBIRD_API_SET_DNR_MEDIAN, 4, 0, 0, 255, 0, 255); + + /* assign spatial filter type: luma_t: horiz_only, chroma_t: horiz_only */ + blackbird_api_cmd(dev, BLACKBIRD_API_SET_SPATIAL_FILTER, 2, 0, + BLACKBIRD_SPATIAL_FILTER_LUMA_1D_HORIZ, + BLACKBIRD_SPATIAL_FILTER_CHROMA_1D_HORIZ + ); + + /* assign frame drop rate */ + /* blackbird_api_cmd(dev, IVTV_API_ASSIGN_FRAME_DROP_RATE, 1, 0, 0); */ + + blackbird_set_default_params(dev); + blackbird_set_default_dnr_params(dev); +} + static int blackbird_initialize_codec(struct cx8802_dev *dev) { struct cx88_core *core = dev->core; @@ -571,7 +1248,7 @@ static int blackbird_initialize_codec(struct cx8802_dev *dev) int retval; dprintk(1,"Initialize codec\n"); - retval = blackbird_api_cmd(dev, CX2341X_ENC_PING_FW, 0, 0); /* ping */ + retval = blackbird_api_cmd(dev, BLACKBIRD_API_PING, 0, 0); /* ping */ if (retval < 0) { /* ping was not successful, reset and upload firmware */ cx_write(MO_SRST_IO, 0); /* SYS_RSTO=0 */ @@ -586,13 +1263,13 @@ static int blackbird_initialize_codec(struct cx8802_dev *dev) if (dev->mailbox < 0) return -1; - retval = blackbird_api_cmd(dev, CX2341X_ENC_PING_FW, 0, 0); /* ping */ + retval = blackbird_api_cmd(dev, BLACKBIRD_API_PING, 0, 0); /* ping */ if (retval < 0) { dprintk(0, "ERROR: Firmware ping failed!\n"); return -1; } - retval = blackbird_api_cmd(dev, CX2341X_ENC_GET_VERSION, 0, 1, &version); + retval = blackbird_api_cmd(dev, BLACKBIRD_API_GET_VERSION, 0, 1, &version); if (retval < 0) { dprintk(0, "ERROR: Firmware get encoder version failed!\n"); return -1; @@ -612,35 +1289,35 @@ static int blackbird_initialize_codec(struct cx8802_dev *dev) /* blackbird_api_cmd(dev, IVTV_API_ASSIGN_NUM_VSYNC_LINES, 4, 0, 0xef, 0xef); blackbird_api_cmd(dev, IVTV_API_ASSIGN_NUM_VSYNC_LINES, 4, 0, 0xf0, 0xf0); blackbird_api_cmd(dev, IVTV_API_ASSIGN_NUM_VSYNC_LINES, 4, 0, 0x180, 0x180); */ - blackbird_api_cmd(dev, CX2341X_ENC_SET_NUM_VSYNC_LINES, 2, 0, + blackbird_api_cmd(dev, BLACKBIRD_API_SET_CAPTURE_LINES, 2, 0, BLACKBIRD_FIELD1_SAA7115, - BLACKBIRD_FIELD2_SAA7115 + BLACKBIRD_FIELD1_SAA7115 ); /* blackbird_api_cmd(dev, IVTV_API_ASSIGN_PLACEHOLDER, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); */ - blackbird_api_cmd(dev, CX2341X_ENC_SET_PLACEHOLDER, 12, 0, + blackbird_api_cmd(dev, BLACKBIRD_API_SET_CUSTOM_DATA, 12, 0, BLACKBIRD_CUSTOM_EXTENSION_USR_DATA, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); /* initialize the video input */ - blackbird_api_cmd(dev, CX2341X_ENC_INITIALIZE_INPUT, 0, 0); + blackbird_api_cmd(dev, BLACKBIRD_API_INIT_VIDEO_INPUT, 0, 0); msleep(1); - blackbird_api_cmd(dev, CX2341X_ENC_MUTE_VIDEO, 1, 0, BLACKBIRD_UNMUTE); + blackbird_api_cmd(dev, BLACKBIRD_API_MUTE_VIDEO, 1, 0, BLACKBIRD_UNMUTE); msleep(1); - blackbird_api_cmd(dev, CX2341X_ENC_MUTE_AUDIO, 1, 0, BLACKBIRD_UNMUTE); + blackbird_api_cmd(dev, BLACKBIRD_API_MUTE_AUDIO, 1, 0, BLACKBIRD_UNMUTE); msleep(1); /* start capturing to the host interface */ - /* blackbird_api_cmd(dev, CX2341X_ENC_START_CAPTURE, 2, 0, 0, 0x13); */ - blackbird_api_cmd(dev, CX2341X_ENC_START_CAPTURE, 2, 0, + /* blackbird_api_cmd(dev, BLACKBIRD_API_BEGIN_CAPTURE, 2, 0, 0, 0x13); */ + blackbird_api_cmd(dev, BLACKBIRD_API_BEGIN_CAPTURE, 2, 0, BLACKBIRD_MPEG_CAPTURE, BLACKBIRD_RAW_BITS_NONE ); msleep(10); - blackbird_api_cmd(dev, CX2341X_ENC_REFRESH_INPUT, 0,0); + blackbird_api_cmd(dev, BLACKBIRD_API_REFRESH_INPUT, 0,0); return 0; } @@ -664,7 +1341,7 @@ bb_buf_prepare(struct videobuf_queue *q, struct videobuf_buffer *vb, enum v4l2_field field) { struct cx8802_fh *fh = q->priv_data; - return cx8802_buf_prepare(q, fh->dev, (struct cx88_buffer*)vb, field); + return cx8802_buf_prepare(fh->dev, (struct cx88_buffer*)vb, field); } static void @@ -677,7 +1354,8 @@ bb_buf_queue(struct videobuf_queue *q, struct videobuf_buffer *vb) static void bb_buf_release(struct videobuf_queue *q, struct videobuf_buffer *vb) { - cx88_free_buffer(q, (struct cx88_buffer*)vb); + struct cx8802_fh *fh = q->priv_data; + cx88_free_buffer(fh->dev->pci, (struct cx88_buffer*)vb); } static struct videobuf_queue_ops blackbird_qops = { @@ -689,39 +1367,6 @@ static struct videobuf_queue_ops blackbird_qops = { /* ------------------------------------------------------------------ */ -static const u32 *ctrl_classes[] = { - cx88_user_ctrls, - cx2341x_mpeg_ctrls, - NULL -}; - -static int blackbird_queryctrl(struct cx8802_dev *dev, struct v4l2_queryctrl *qctrl) -{ - qctrl->id = v4l2_ctrl_next(ctrl_classes, qctrl->id); - if (qctrl->id == 0) - return -EINVAL; - - /* Standard V4L2 controls */ - if (cx8800_ctrl_query(qctrl) == 0) - return 0; - - /* MPEG V4L2 controls */ - if (cx2341x_ctrl_query(&dev->params, qctrl)) - qctrl->flags |= V4L2_CTRL_FLAG_DISABLED; - return 0; -} - -static int blackbird_querymenu(struct cx8802_dev *dev, struct v4l2_querymenu *qmenu) -{ - struct v4l2_queryctrl qctrl; - - qctrl.id = qmenu->id; - blackbird_queryctrl(dev, &qctrl); - return v4l2_ctrl_query_menu(qmenu, &qctrl, cx2341x_ctrl_get_menu(qmenu->id)); -} - -/* ------------------------------------------------------------------ */ - static int mpeg_do_ioctl(struct inode *inode, struct file *file, unsigned int cmd, void *arg) { @@ -841,84 +1486,27 @@ static int mpeg_do_ioctl(struct inode *inode, struct file *file, { struct v4l2_mpeg_compression *f = arg; - printk(KERN_WARNING "VIDIOC_G_MPEGCOMP is obsolete. " - "Replace with VIDIOC_G_EXT_CTRLS!"); - memcpy(f,&default_mpeg_params,sizeof(*f)); + memcpy(f,&dev->params,sizeof(*f)); return 0; } case VIDIOC_S_MPEGCOMP: - printk(KERN_WARNING "VIDIOC_S_MPEGCOMP is obsolete. " - "Replace with VIDIOC_S_EXT_CTRLS!"); - return 0; - case VIDIOC_G_EXT_CTRLS: { - struct v4l2_ext_controls *f = arg; - - if (f->ctrl_class != V4L2_CTRL_CLASS_MPEG) - return -EINVAL; - return cx2341x_ext_ctrls(&dev->params, f, cmd); - } - case VIDIOC_S_EXT_CTRLS: - case VIDIOC_TRY_EXT_CTRLS: - { - struct v4l2_ext_controls *f = arg; - struct cx2341x_mpeg_params p; - int err; - - if (f->ctrl_class != V4L2_CTRL_CLASS_MPEG) - return -EINVAL; - p = dev->params; - err = cx2341x_ext_ctrls(&p, f, cmd); - if (err == 0 && cmd == VIDIOC_S_EXT_CTRLS) { - err = cx2341x_update(dev, blackbird_mbox_func, &dev->params, &p); - dev->params = p; - } - return err; - } - case VIDIOC_S_FREQUENCY: - { - blackbird_api_cmd(fh->dev, CX2341X_ENC_STOP_CAPTURE, 3, 0, - BLACKBIRD_END_NOW, - BLACKBIRD_MPEG_CAPTURE, - BLACKBIRD_RAW_BITS_NONE); - - cx88_do_ioctl(inode, file, 0, dev->core, cmd, arg, mpeg_do_ioctl); + struct v4l2_mpeg_compression *f = arg; - blackbird_initialize_codec(dev); - cx88_set_scale(dev->core, dev->width, dev->height, - fh->mpegq.field); - return 0; - } - case VIDIOC_LOG_STATUS: - { - char name[32 + 2]; - - snprintf(name, sizeof(name), "%s/2", core->name); - printk("%s/2: ============ START LOG STATUS ============\n", - core->name); - cx88_call_i2c_clients(core, VIDIOC_LOG_STATUS, 0); - cx2341x_log_status(&dev->params, name); - printk("%s/2: ============= END LOG STATUS =============\n", - core->name); + blackbird_set_params(dev, f); return 0; } - case VIDIOC_QUERYMENU: - return blackbird_querymenu(dev, arg); - case VIDIOC_QUERYCTRL: - { - struct v4l2_queryctrl *c = arg; - - if (blackbird_queryctrl(dev, c) == 0) - return 0; - return cx88_do_ioctl(inode, file, 0, dev->core, cmd, arg, mpeg_do_ioctl); - } default: - return cx88_do_ioctl(inode, file, 0, dev->core, cmd, arg, mpeg_do_ioctl); + return cx88_do_ioctl( inode, file, 0, dev->core, cmd, arg, cx88_ioctl_hook ); } return 0; } +int (*cx88_ioctl_hook)(struct inode *inode, struct file *file, + unsigned int cmd, void *arg); +unsigned int (*cx88_ioctl_translator)(unsigned int cmd); + static unsigned int mpeg_translate_ioctl(unsigned int cmd) { return cmd; @@ -927,8 +1515,8 @@ static unsigned int mpeg_translate_ioctl(unsigned int cmd) static int mpeg_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) { - cmd = mpeg_translate_ioctl( cmd ); - return video_usercopy(inode, file, cmd, arg, mpeg_do_ioctl); + cmd = cx88_ioctl_translator( cmd ); + return video_usercopy(inode, file, cmd, arg, cx88_ioctl_hook); } static int mpeg_open(struct inode *inode, struct file *file) @@ -975,14 +1563,13 @@ static int mpeg_release(struct inode *inode, struct file *file) { struct cx8802_fh *fh = file->private_data; - /* blackbird_api_cmd(fh->dev, CX2341X_ENC_STOP_CAPTURE, 3, 0, BLACKBIRD_END_NOW, 0, 0x13); */ - blackbird_api_cmd(fh->dev, CX2341X_ENC_STOP_CAPTURE, 3, 0, + /* blackbird_api_cmd(fh->dev, BLACKBIRD_API_END_CAPTURE, 3, 0, BLACKBIRD_END_NOW, 0, 0x13); */ + blackbird_api_cmd(fh->dev, BLACKBIRD_API_END_CAPTURE, 3, 0, BLACKBIRD_END_NOW, BLACKBIRD_MPEG_CAPTURE, BLACKBIRD_RAW_BITS_NONE ); - cx8802_cancel_buffers(fh->dev); /* stop mpeg capture */ if (fh->mpegq.streaming) videobuf_streamoff(&fh->mpegq); @@ -1097,13 +1684,19 @@ static int __devinit blackbird_probe(struct pci_dev *pci_dev, dev->core = core; dev->width = 720; dev->height = 576; - cx2341x_fill_defaults(&dev->params); - dev->params.port = CX2341X_PORT_STREAMING; + memcpy(&dev->params,&default_mpeg_params,sizeof(default_mpeg_params)); + memcpy(&dev->dnr_params,&default_dnr_params,sizeof(default_dnr_params)); + + if (core->board == CX88_BOARD_HAUPPAUGE_ROSLYN) { + + if (core->tuner_formats & V4L2_STD_525_60) { + dev->height = 480; + dev->params.vi_frame_rate = 30; + } else { + dev->height = 576; + dev->params.vi_frame_rate = 25; + } - if (core->tvnorm->id & V4L2_STD_525_60) { - dev->height = 480; - } else { - dev->height = 576; } err = cx8802_init_common(dev); @@ -1174,6 +1767,8 @@ static int blackbird_init(void) printk(KERN_INFO "cx2388x: snapshot date %04d-%02d-%02d\n", SNAPSHOT/10000, (SNAPSHOT/100)%100, SNAPSHOT%100); #endif + cx88_ioctl_hook = mpeg_do_ioctl; + cx88_ioctl_translator = mpeg_translate_ioctl; return pci_register_driver(&blackbird_pci_driver); } @@ -1185,6 +1780,11 @@ static void blackbird_fini(void) module_init(blackbird_init); module_exit(blackbird_fini); +EXPORT_SYMBOL(cx88_ioctl_hook); +EXPORT_SYMBOL(cx88_ioctl_translator); +EXPORT_SYMBOL(blackbird_set_params); +EXPORT_SYMBOL(blackbird_set_dnr_params); + /* ----------------------------------------------------------- */ /* * Local variables: diff --git a/drivers/media/video/cx88/cx88-cards.c b/drivers/media/video/cx88/cx88-cards.c index 14bd4863d..a24af92c7 100644 --- a/drivers/media/video/cx88/cx88-cards.c +++ b/drivers/media/video/cx88/cx88-cards.c @@ -114,7 +114,7 @@ struct cx88_board cx88_boards[] = { .radio = { .type = CX88_RADIO, .gpio0 = 0xff10, - }, + }, }, [CX88_BOARD_ATI_WONDER_PRO] = { .name = "ATI TV Wonder Pro", @@ -184,18 +184,17 @@ struct cx88_board cx88_boards[] = { .input = {{ .type = CX88_VMUX_TELEVISION, .vmux = 0, - .gpio1 = 0xe09f, + .gpio1 = 0x309f, },{ .type = CX88_VMUX_COMPOSITE1, .vmux = 1, - .gpio1 = 0xe05f, + .gpio1 = 0x305f, },{ .type = CX88_VMUX_SVIDEO, .vmux = 2, - .gpio1 = 0xe05f, + .gpio1 = 0x305f, }}, .radio = { - .gpio1 = 0xe0df, .type = CX88_RADIO, }, }, @@ -267,7 +266,7 @@ struct cx88_board cx88_boards[] = { .gpio1 = 0x00007004, .gpio2 = 0x0035d700, .gpio3 = 0x02000000, - }, + }, }, [CX88_BOARD_LEADTEK_PVR2000] = { // gpio values for PAL version from regspy by DScaler @@ -323,19 +322,19 @@ struct cx88_board cx88_boards[] = { .input = {{ .type = CX88_VMUX_TELEVISION, .vmux = 0, - .gpio0 = 0xbff0, + .gpio0 = 0xff00, },{ .type = CX88_VMUX_COMPOSITE1, .vmux = 1, - .gpio0 = 0xbff3, + .gpio0 = 0xff03, },{ .type = CX88_VMUX_SVIDEO, .vmux = 2, - .gpio0 = 0xbff3, + .gpio0 = 0xff03, }}, .radio = { .type = CX88_RADIO, - .gpio0 = 0xbff0, + .gpio0 = 0xff00, }, }, [CX88_BOARD_ASUS_PVR_416] = { @@ -413,7 +412,7 @@ struct cx88_board cx88_boards[] = { .type = CX88_VMUX_COMPOSITE1, .vmux = 1, .gpio0 = 0x000027df, - },{ + },{ .type = CX88_VMUX_SVIDEO, .vmux = 2, .gpio0 = 0x000027df, @@ -536,7 +535,7 @@ struct cx88_board cx88_boards[] = { .type = CX88_VMUX_COMPOSITE1, .vmux = 1, .gpio0 = 0x000027df, - },{ + },{ .type = CX88_VMUX_SVIDEO, .vmux = 2, .gpio0 = 0x000027df, @@ -564,7 +563,7 @@ struct cx88_board cx88_boards[] = { }, [CX88_BOARD_PCHDTV_HD3000] = { .name = "pcHDTV HD3000 HDTV", - .tuner_type = TUNER_THOMSON_DTT761X, + .tuner_type = TUNER_THOMSON_DTT7610, .radio_type = UNSET, .tuner_addr = ADDR_UNSET, .radio_addr = ADDR_UNSET, @@ -759,7 +758,7 @@ struct cx88_board cx88_boards[] = { }, [CX88_BOARD_DVICO_FUSIONHDTV_5_GOLD] = { .name = "DViCO FusionHDTV 5 Gold", - .tuner_type = TUNER_LG_TDVS_H06XF, /* TDVS-H062F */ + .tuner_type = TUNER_LG_TDVS_H062F, .radio_type = UNSET, .tuner_addr = ADDR_UNSET, .radio_addr = ADDR_UNSET, @@ -1049,166 +1048,7 @@ struct cx88_board cx88_boards[] = { }}, .dvb = 1, }, - [CX88_BOARD_KWORLD_HARDWARE_MPEG_TV_XPERT] = { - /* FIXME: Audio not working for s-video / composite inputs. */ - .name = "KWorld HardwareMpegTV XPert", - .tuner_type = TUNER_PHILIPS_TDA8290, - .radio_type = UNSET, - .tuner_addr = ADDR_UNSET, - .radio_addr = ADDR_UNSET, - .input = {{ - .type = CX88_VMUX_TELEVISION, - .vmux = 0, - .gpio0 = 0x3de2, - .gpio2 = 0x00ff, - },{ - .type = CX88_VMUX_COMPOSITE1, - .vmux = 1, - .gpio0 = 0x3de6, - },{ - .type = CX88_VMUX_SVIDEO, - .vmux = 2, - .gpio0 = 0x3de6, - }}, - .radio = { - .type = CX88_RADIO, - .gpio0 = 0x3de6, - .gpio2 = 0x00ff, - }, - .blackbird = 1, - }, - [CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_HYBRID] = { - .name = "DViCO FusionHDTV DVB-T Hybrid", - .tuner_type = TUNER_THOMSON_FE6600, - .radio_type = UNSET, - .tuner_addr = ADDR_UNSET, - .radio_addr = ADDR_UNSET, - .input = {{ - .type = CX88_VMUX_TELEVISION, - .vmux = 0, - .gpio0 = 0x0000a75f, - },{ - .type = CX88_VMUX_COMPOSITE1, - .vmux = 1, - .gpio0 = 0x0000a75b, - },{ - .type = CX88_VMUX_SVIDEO, - .vmux = 2, - .gpio0 = 0x0000a75b, - }}, - .dvb = 1, - }, - [CX88_BOARD_PCHDTV_HD5500] = { - .name = "pcHDTV HD5500 HDTV", - .tuner_type = TUNER_LG_TDVS_H06XF, /* TDVS-H064F */ - .radio_type = UNSET, - .tuner_addr = ADDR_UNSET, - .radio_addr = ADDR_UNSET, - .tda9887_conf = TDA9887_PRESENT, - .input = {{ - .type = CX88_VMUX_TELEVISION, - .vmux = 0, - .gpio0 = 0x87fd, - },{ - .type = CX88_VMUX_COMPOSITE1, - .vmux = 1, - .gpio0 = 0x87f9, - },{ - .type = CX88_VMUX_SVIDEO, - .vmux = 2, - .gpio0 = 0x87f9, - }}, - .dvb = 1, - }, - [CX88_BOARD_KWORLD_MCE200_DELUXE] = { - /* FIXME: tested TV input only, disabled composite, - svideo and radio until they can be tested also. */ - .name = "Kworld MCE 200 Deluxe", - .tuner_type = TUNER_TENA_9533_DI, - .radio_type = UNSET, - .tda9887_conf = TDA9887_PRESENT, - .tuner_addr = ADDR_UNSET, - .radio_addr = ADDR_UNSET, - .input = {{ - .type = CX88_VMUX_TELEVISION, - .vmux = 0, - .gpio0 = 0x0000BDE6 - }}, - .blackbird = 1, - }, - [CX88_BOARD_PIXELVIEW_PLAYTV_P7000] = { - /* FIXME: SVideo, Composite and FM inputs are untested */ - .name = "PixelView PlayTV P7000", - .tuner_type = TUNER_PHILIPS_FM1216ME_MK3, - .radio_type = UNSET, - .tuner_addr = ADDR_UNSET, - .radio_addr = ADDR_UNSET, - .tda9887_conf = TDA9887_PRESENT | TDA9887_PORT1_ACTIVE | - TDA9887_PORT2_ACTIVE, - .input = {{ - .type = CX88_VMUX_TELEVISION, - .vmux = 0, - .gpio0 = 0x5da6, - }}, - .blackbird = 1, - }, - [CX88_BOARD_NPGTECH_REALTV_TOP10FM] = { - .name = "NPG Tech Real TV FM Top 10", - .tuner_type = TUNER_TNF_5335MF, /* Actually a TNF9535 */ - .radio_type = UNSET, - .tuner_addr = ADDR_UNSET, - .radio_addr = ADDR_UNSET, - .input = {{ - .type = CX88_VMUX_TELEVISION, - .vmux = 0, - .gpio0 = 0x0788, - },{ - .type = CX88_VMUX_COMPOSITE1, - .vmux = 1, - .gpio0 = 0x078b, - },{ - .type = CX88_VMUX_SVIDEO, - .vmux = 2, - .gpio0 = 0x078b, - }}, - .radio = { - .type = CX88_RADIO, - .gpio0 = 0x074a, - }, - }, - [CX88_BOARD_WINFAST_DTV2000H] = { - /* video inputs and radio still in testing */ - .name = "WinFast DTV2000 H", - .tuner_type = TUNER_PHILIPS_FMD1216ME_MK3, - .radio_type = UNSET, - .tuner_addr = ADDR_UNSET, - .radio_addr = ADDR_UNSET, - .tda9887_conf = TDA9887_PRESENT, - .input = {{ - .type = CX88_VMUX_TELEVISION, - .vmux = 0, - .gpio0 = 0x00017304, - .gpio1 = 0x00008203, - .gpio2 = 0x00017304, - .gpio3 = 0x02000000, - }}, - .dvb = 1, - }, - [CX88_BOARD_GENIATECH_DVBS] = { - .name = "Geniatech DVB-S", - .tuner_type = TUNER_ABSENT, - .radio_type = UNSET, - .tuner_addr = ADDR_UNSET, - .radio_addr = ADDR_UNSET, - .input = {{ - .type = CX88_VMUX_DVB, - .vmux = 0, - },{ - .type = CX88_VMUX_COMPOSITE1, - .vmux = 1, - }}, - .dvb = 1, - }, + }; const unsigned int cx88_bcount = ARRAY_SIZE(cx88_boards); @@ -1414,50 +1254,6 @@ struct cx88_subid cx88_subids[] = { .subdevice = 0xdb11, .card = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PLUS, /* Re-branded DViCO: UltraView DVB-T Plus */ - },{ - .subvendor = 0x17de, - .subdevice = 0x0840, - .card = CX88_BOARD_KWORLD_HARDWARE_MPEG_TV_XPERT, - },{ - .subvendor = 0x18ac, - .subdevice = 0xdb40, - .card = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_HYBRID, - },{ - .subvendor = 0x18ac, - .subdevice = 0xdb44, - .card = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_HYBRID, - },{ - .subvendor = 0x7063, - .subdevice = 0x5500, - .card = CX88_BOARD_PCHDTV_HD5500, - },{ - .subvendor = 0x17de, - .subdevice = 0x0841, - .card = CX88_BOARD_KWORLD_MCE200_DELUXE, - },{ - .subvendor = 0x1822, - .subdevice = 0x0019, - .card = CX88_BOARD_DNTV_LIVE_DVB_T_PRO, - },{ - .subvendor = 0x1554, - .subdevice = 0x4813, - .card = CX88_BOARD_PIXELVIEW_PLAYTV_P7000, - },{ - .subvendor = 0x14f1, - .subdevice = 0x0842, - .card = CX88_BOARD_NPGTECH_REALTV_TOP10FM, - },{ - .subvendor = 0x107d, - .subdevice = 0x665e, - .card = CX88_BOARD_WINFAST_DTV2000H, - },{ - .subvendor = 0x18ac, - .subdevice = 0xd800, /* FusionHDTV 3 Gold (original revision) */ - .card = CX88_BOARD_DVICO_FUSIONHDTV_3_GOLD_Q, - },{ - .subvendor = 0x14f1, - .subdevice = 0x0084, - .card = CX88_BOARD_GENIATECH_DVBS, }, }; const unsigned int cx88_idcount = ARRAY_SIZE(cx88_subids); @@ -1465,7 +1261,7 @@ const unsigned int cx88_idcount = ARRAY_SIZE(cx88_subids); /* ----------------------------------------------------------------------- */ /* some leadtek specific stuff */ -static void __devinit leadtek_eeprom(struct cx88_core *core, u8 *eeprom_data) +static void leadtek_eeprom(struct cx88_core *core, u8 *eeprom_data) { /* This is just for the "Winfast 2000XP Expert" board ATM; I don't have data on * any others. @@ -1576,40 +1372,6 @@ static void gdi_eeprom(struct cx88_core *core, u8 *eeprom_data) core->has_radio = gdi_tuner[eeprom_data[0x0d]].fm; } -/* ----------------------------------------------------------------------- */ -/* some DViCO specific stuff */ - -static void dvico_fusionhdtv_hybrid_init(struct cx88_core *core) -{ - struct i2c_msg msg = { .addr = 0x45, .flags = 0 }; - int i, err; - static u8 init_bufs[13][5] = { - { 0x10, 0x00, 0x20, 0x01, 0x03 }, - { 0x10, 0x10, 0x01, 0x00, 0x21 }, - { 0x10, 0x10, 0x10, 0x00, 0xCA }, - { 0x10, 0x10, 0x12, 0x00, 0x08 }, - { 0x10, 0x10, 0x13, 0x00, 0x0A }, - { 0x10, 0x10, 0x16, 0x01, 0xC0 }, - { 0x10, 0x10, 0x22, 0x01, 0x3D }, - { 0x10, 0x10, 0x73, 0x01, 0x2E }, - { 0x10, 0x10, 0x72, 0x00, 0xC5 }, - { 0x10, 0x10, 0x71, 0x01, 0x97 }, - { 0x10, 0x10, 0x70, 0x00, 0x0F }, - { 0x10, 0x10, 0xB0, 0x00, 0x01 }, - { 0x03, 0x0C }, - }; - - for (i = 0; i < 13; i++) { - msg.buf = init_bufs[i]; - msg.len = (i != 12 ? 5 : 2); - err = i2c_transfer(&core->i2c_adap, &msg, 1); - if (err != 1) { - printk("dvico_fusionhdtv_hybrid_init buf %d failed (err = %d)!\n", i, err); - return; - } - } -} - /* ----------------------------------------------------------------------- */ void cx88_card_list(struct cx88_core *core, struct pci_dev *pci) @@ -1676,15 +1438,11 @@ void cx88_card_setup(struct cx88_core *core) case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T1: case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PLUS: case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL: - case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_HYBRID: /* GPIO0:0 is hooked to mt352 reset pin */ cx_set(MO_GP0_IO, 0x00000101); cx_clear(MO_GP0_IO, 0x00000001); msleep(1); cx_set(MO_GP0_IO, 0x00000101); - if (0 == core->i2c_rc && - core->board == CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_HYBRID) - dvico_fusionhdtv_hybrid_init(core); break; case CX88_BOARD_KWORLD_DVB_T: case CX88_BOARD_DNTV_LIVE_DVB_T: @@ -1702,7 +1460,7 @@ void cx88_card_setup(struct cx88_core *core) if (0 == core->i2c_rc) { /* enable tuner */ int i; - static const u8 buffer [] = { 0x10,0x12,0x13,0x04,0x16,0x00,0x14,0x04,0x017,0x00 }; + u8 buffer [] = { 0x10,0x12,0x13,0x04,0x16,0x00,0x14,0x04,0x017,0x00 }; core->i2c_client.addr = 0x0a; for (i = 0; i < 5; i++) @@ -1719,6 +1477,11 @@ void cx88_card_setup(struct cx88_core *core) /* ------------------------------------------------------------------ */ EXPORT_SYMBOL(cx88_boards); +EXPORT_SYMBOL(cx88_bcount); +EXPORT_SYMBOL(cx88_subids); +EXPORT_SYMBOL(cx88_idcount); +EXPORT_SYMBOL(cx88_card_list); +EXPORT_SYMBOL(cx88_card_setup); /* * Local variables: diff --git a/drivers/media/video/cx88/cx88-core.c b/drivers/media/video/cx88/cx88-core.c index 973d3f39b..3720f24a2 100644 --- a/drivers/media/video/cx88/cx88-core.c +++ b/drivers/media/video/cx88/cx88-core.c @@ -146,11 +146,9 @@ int cx88_risc_buffer(struct pci_dev *pci, struct btcx_riscmem *risc, fields++; /* estimate risc mem: worst case is one write per page border + - one write per scan line + syncs + jump (all 2 dwords). Padding - can cause next bpl to start close to a page border. First DMA - region may be smaller than PAGE_SIZE */ - instructions = fields * (1 + ((bpl + padding) * lines) / PAGE_SIZE + lines); - instructions += 2; + one write per scan line + syncs + jump (all 2 dwords) */ + instructions = (bpl * lines * fields) / PAGE_SIZE + lines * fields; + instructions += 3 + 4; if ((rc = btcx_riscmem_alloc(pci,risc,instructions*8)) < 0) return rc; @@ -165,7 +163,7 @@ int cx88_risc_buffer(struct pci_dev *pci, struct btcx_riscmem *risc, /* save pointer to jmp instruction address */ risc->jmp = rp; - BUG_ON((risc->jmp - risc->cpu + 2) * sizeof (*risc->cpu) > risc->size); + BUG_ON((risc->jmp - risc->cpu + 2) / 4 > risc->size); return 0; } @@ -178,11 +176,9 @@ int cx88_risc_databuffer(struct pci_dev *pci, struct btcx_riscmem *risc, int rc; /* estimate risc mem: worst case is one write per page border + - one write per scan line + syncs + jump (all 2 dwords). Here - there is no padding and no sync. First DMA region may be smaller - than PAGE_SIZE */ - instructions = 1 + (bpl * lines) / PAGE_SIZE + lines; - instructions += 1; + one write per scan line + syncs + jump (all 2 dwords) */ + instructions = (bpl * lines) / PAGE_SIZE + lines; + instructions += 3 + 4; if ((rc = btcx_riscmem_alloc(pci,risc,instructions*8)) < 0) return rc; @@ -192,7 +188,7 @@ int cx88_risc_databuffer(struct pci_dev *pci, struct btcx_riscmem *risc, /* save pointer to jmp instruction address */ risc->jmp = rp; - BUG_ON((risc->jmp - risc->cpu + 2) * sizeof (*risc->cpu) > risc->size); + BUG_ON((risc->jmp - risc->cpu + 2) / 4 > risc->size); return 0; } @@ -217,13 +213,14 @@ int cx88_risc_stopper(struct pci_dev *pci, struct btcx_riscmem *risc, } void -cx88_free_buffer(struct videobuf_queue *q, struct cx88_buffer *buf) +cx88_free_buffer(struct pci_dev *pci, struct cx88_buffer *buf) { - BUG_ON(in_interrupt()); + if (in_interrupt()) + BUG(); videobuf_waiton(&buf->vb,0,0); - videobuf_dma_unmap(q, &buf->vb.dma); + videobuf_dma_pci_unmap(pci, &buf->vb.dma); videobuf_dma_free(&buf->vb.dma); - btcx_riscmem_free((struct pci_dev *)q->dev, &buf->risc); + btcx_riscmem_free(pci, &buf->risc); buf->vb.state = STATE_NEEDS_INIT; } @@ -677,7 +674,7 @@ static unsigned int inline norm_htotal(struct cx88_tvnorm *norm) static unsigned int inline norm_vbipack(struct cx88_tvnorm *norm) { - return (norm->id & V4L2_STD_625_50) ? 511 : 400; + return (norm->id & V4L2_STD_625_50) ? 511 : 288; } int cx88_set_scale(struct cx88_core *core, unsigned int width, unsigned int height, @@ -932,9 +929,9 @@ int cx88_set_tvnorm(struct cx88_core *core, struct cx88_tvnorm *norm) htotal, cx_read(MO_HTOTAL), (u32)tmp64); cx_write(MO_HTOTAL, htotal); - // vbi stuff, set vbi offset to 10 (for 20 Clk*2 pixels), this makes - // the effective vbi offset ~244 samples, the same as the Bt8x8 - cx_write(MO_VBI_PACKET, (10<<11) | norm_vbipack(norm)); + // vbi stuff + cx_write(MO_VBI_PACKET, ((1 << 11) | /* (norm_vdelay(norm) << 11) | */ + norm_vbipack(norm))); // this is needed as well to set all tvnorm parameter cx88_set_scale(core, 320, 240, V4L2_FIELD_INTERLACED); @@ -1031,8 +1028,8 @@ static int get_ressources(struct cx88_core *core, struct pci_dev *pci) pci_resource_len(pci,0), core->name)) return 0; - printk(KERN_ERR "%s: can't get MMIO memory @ 0x%llx\n", - core->name,(unsigned long long)pci_resource_start(pci,0)); + printk(KERN_ERR "%s: can't get MMIO memory @ 0x%lx\n", + core->name,pci_resource_start(pci,0)); return -EBUSY; } @@ -1064,7 +1061,7 @@ struct cx88_core* cx88_core_get(struct pci_dev *pci) core->pci_bus = pci->bus->number; core->pci_slot = PCI_SLOT(pci->devfn); core->pci_irqmask = 0x00fc00; - mutex_init(&core->lock); + init_MUTEX(&core->lock); core->nr = cx88_devcount++; sprintf(core->name,"cx88[%d]",core->nr); @@ -1181,6 +1178,8 @@ EXPORT_SYMBOL(cx88_set_scale); EXPORT_SYMBOL(cx88_vdev_init); EXPORT_SYMBOL(cx88_core_get); EXPORT_SYMBOL(cx88_core_put); +EXPORT_SYMBOL(cx88_start_audio_dma); +EXPORT_SYMBOL(cx88_stop_audio_dma); /* * Local variables: diff --git a/drivers/media/video/cx88/cx88-dvb.c b/drivers/media/video/cx88/cx88-dvb.c index fd3ef4ca6..e48aa3f6e 100644 --- a/drivers/media/video/cx88/cx88-dvb.c +++ b/drivers/media/video/cx88/cx88-dvb.c @@ -40,9 +40,6 @@ # include "cx88-vp3054-i2c.h" # endif #endif -#ifdef HAVE_ZL10353 -# include "zl10353.h" -#endif #ifdef HAVE_CX22702 # include "cx22702.h" #endif @@ -51,7 +48,6 @@ #endif #ifdef HAVE_LGDT330X # include "lgdt330x.h" -# include "lg_h06xf.h" #endif #ifdef HAVE_NXT200X # include "nxt200x.h" @@ -59,7 +55,6 @@ #ifdef HAVE_CX24123 # include "cx24123.h" #endif -#include "isl6421.h" MODULE_DESCRIPTION("driver for cx2388x based DVB cards"); MODULE_AUTHOR("Chris Pascoe "); @@ -92,7 +87,7 @@ static int dvb_buf_prepare(struct videobuf_queue *q, struct videobuf_buffer *vb, enum v4l2_field field) { struct cx8802_dev *dev = q->priv_data; - return cx8802_buf_prepare(q, dev, (struct cx88_buffer*)vb,field); + return cx8802_buf_prepare(dev, (struct cx88_buffer*)vb,field); } static void dvb_buf_queue(struct videobuf_queue *q, struct videobuf_buffer *vb) @@ -103,7 +98,8 @@ static void dvb_buf_queue(struct videobuf_queue *q, struct videobuf_buffer *vb) static void dvb_buf_release(struct videobuf_queue *q, struct videobuf_buffer *vb) { - cx88_free_buffer(q, (struct cx88_buffer*)vb); + struct cx8802_dev *dev = q->priv_data; + cx88_free_buffer(dev->pci, (struct cx88_buffer*)vb); } static struct videobuf_queue_ops dvb_qops = { @@ -180,19 +176,35 @@ static int dntv_live_dvbt_demod_init(struct dvb_frontend* fe) return 0; } +static int mt352_pll_set(struct dvb_frontend* fe, + struct dvb_frontend_parameters* params, + u8* pllbuf) +{ + struct cx8802_dev *dev= fe->dvb->priv; + + pllbuf[0] = dev->core->pll_addr << 1; + dvb_pll_configure(dev->core->pll_desc, pllbuf+1, + params->frequency, + params->u.ofdm.bandwidth); + return 0; +} + static struct mt352_config dvico_fusionhdtv = { .demod_address = 0x0F, .demod_init = dvico_fusionhdtv_demod_init, + .pll_set = mt352_pll_set, }; static struct mt352_config dntv_live_dvbt_config = { .demod_address = 0x0f, .demod_init = dntv_live_dvbt_demod_init, + .pll_set = mt352_pll_set, }; static struct mt352_config dvico_fusionhdtv_dual = { .demod_address = 0x0F, .demod_init = dvico_dual_demod_init, + .pll_set = mt352_pll_set, }; #ifdef HAVE_VP3054_I2C @@ -230,8 +242,6 @@ static int philips_fmd1216_pll_init(struct dvb_frontend *fe) .buf = fmd1216_init, .len = sizeof(fmd1216_init) }; int err; - if (fe->ops.i2c_gate_ctrl) - fe->ops.i2c_gate_ctrl(fe, 1); if ((err = i2c_transfer(&dev->core->i2c_adap, &msg, 1)) != 1) { if (err < 0) return err; @@ -242,14 +252,14 @@ static int philips_fmd1216_pll_init(struct dvb_frontend *fe) return 0; } -static int dntv_live_dvbt_pro_tuner_set_params(struct dvb_frontend* fe, - struct dvb_frontend_parameters* params) +static int dntv_live_dvbt_pro_pll_set(struct dvb_frontend* fe, + struct dvb_frontend_parameters* params, + u8* pllbuf) { struct cx8802_dev *dev= fe->dvb->priv; - u8 buf[4]; struct i2c_msg msg = { .addr = dev->core->pll_addr, .flags = 0, - .buf = buf, .len = 4 }; + .buf = pllbuf+1, .len = 4 }; int err; /* Switch PLL to DVB mode */ @@ -258,16 +268,14 @@ static int dntv_live_dvbt_pro_tuner_set_params(struct dvb_frontend* fe, return err; /* Tune PLL */ - dvb_pll_configure(dev->core->pll_desc, buf, + pllbuf[0] = dev->core->pll_addr << 1; + dvb_pll_configure(dev->core->pll_desc, pllbuf+1, params->frequency, params->u.ofdm.bandwidth); - if (fe->ops.i2c_gate_ctrl) - fe->ops.i2c_gate_ctrl(fe, 1); if ((err = i2c_transfer(&dev->core->i2c_adap, &msg, 1)) != 1) { - printk(KERN_WARNING "cx88-dvb: %s error " "(addr %02x <- %02x, err = %i)\n", - __FUNCTION__, dev->core->pll_addr, buf[0], err); + __FUNCTION__, pllbuf[0], pllbuf[1], err); if (err < 0) return err; else @@ -281,63 +289,30 @@ static struct mt352_config dntv_live_dvbt_pro_config = { .demod_address = 0x0f, .no_tuner = 1, .demod_init = dntv_live_dvbt_pro_demod_init, + .pll_set = dntv_live_dvbt_pro_pll_set, }; #endif #endif -#ifdef HAVE_ZL10353 -static int dvico_hybrid_tuner_set_params(struct dvb_frontend *fe, - struct dvb_frontend_parameters *params) -{ - u8 pllbuf[4]; - struct cx8802_dev *dev= fe->dvb->priv; - struct i2c_msg msg = - { .addr = dev->core->pll_addr, .flags = 0, - .buf = pllbuf, .len = 4 }; - int err; - - dvb_pll_configure(dev->core->pll_desc, pllbuf, - params->frequency, - params->u.ofdm.bandwidth); - - if (fe->ops.i2c_gate_ctrl) - fe->ops.i2c_gate_ctrl(fe, 1); - if ((err = i2c_transfer(&dev->core->i2c_adap, &msg, 1)) != 1) { - printk(KERN_WARNING "cx88-dvb: %s error " - "(addr %02x <- %02x, err = %i)\n", - __FUNCTION__, pllbuf[0], pllbuf[1], err); - if (err < 0) - return err; - else - return -EREMOTEIO; - } - - return 0; -} - -static struct zl10353_config dvico_fusionhdtv_hybrid = { - .demod_address = 0x0F, - .no_tuner = 1, -}; - -static struct zl10353_config dvico_fusionhdtv_plus_v1_1 = { - .demod_address = 0x0F, -}; -#endif - #ifdef HAVE_CX22702 static struct cx22702_config connexant_refboard_config = { .demod_address = 0x43, .output_mode = CX22702_SERIAL_OUTPUT, + .pll_address = 0x60, + .pll_desc = &dvb_pll_thomson_dtt7579, }; static struct cx22702_config hauppauge_novat_config = { .demod_address = 0x43, .output_mode = CX22702_SERIAL_OUTPUT, + .pll_address = 0x61, + .pll_desc = &dvb_pll_thomson_dtt759x, }; static struct cx22702_config hauppauge_hvr1100_config = { .demod_address = 0x63, .output_mode = CX22702_SERIAL_OUTPUT, + .pll_address = 0x61, + .pll_desc = &dvb_pll_fmd1216me, }; #endif @@ -352,13 +327,15 @@ static int or51132_set_ts_param(struct dvb_frontend* fe, static struct or51132_config pchdtv_hd3000 = { .demod_address = 0x15, + .pll_address = 0x61, + .pll_desc = &dvb_pll_thomson_dtt7610, .set_ts_params = or51132_set_ts_param, }; #endif #ifdef HAVE_LGDT330X -static int lgdt3302_tuner_set_params(struct dvb_frontend* fe, - struct dvb_frontend_parameters* params) +static int lgdt330x_pll_set(struct dvb_frontend* fe, + struct dvb_frontend_parameters* params) { /* FIXME make this routine use the tuner-simple code. * It could probably be shared with a number of ATSC @@ -371,12 +348,12 @@ static int lgdt3302_tuner_set_params(struct dvb_frontend* fe, { .addr = dev->core->pll_addr, .flags = 0, .buf = buf, .len = 4 }; int err; + /* Put the analog decoder in standby to keep it quiet */ + cx88_call_i2c_clients (dev->core, TUNER_SET_STANDBY, NULL); + dvb_pll_configure(core->pll_desc, buf, params->frequency, 0); dprintk(1, "%s: tuner at 0x%02x bytes: 0x%02x 0x%02x 0x%02x 0x%02x\n", __FUNCTION__, msg.addr, buf[0],buf[1],buf[2],buf[3]); - - if (fe->ops.i2c_gate_ctrl) - fe->ops.i2c_gate_ctrl(fe, 1); if ((err = i2c_transfer(&core->i2c_adap, &msg, 1)) != 1) { printk(KERN_WARNING "cx88-dvb: %s error " "(addr %02x <- %02x, err = %i)\n", @@ -386,21 +363,16 @@ static int lgdt3302_tuner_set_params(struct dvb_frontend* fe, else return -EREMOTEIO; } + if (core->tuner_type == TUNER_LG_TDVS_H062F) { + /* Set the Auxiliary Byte. */ + buf[2] &= ~0x20; + buf[2] |= 0x18; + buf[3] = 0x50; + i2c_transfer(&core->i2c_adap, &msg, 1); + } return 0; } -static int lgdt3303_tuner_set_params(struct dvb_frontend* fe, - struct dvb_frontend_parameters* params) -{ - struct cx8802_dev *dev= fe->dvb->priv; - struct cx88_core *core = dev->core; - - /* Put the analog decoder in standby to keep it quiet */ - cx88_call_i2c_clients (dev->core, TUNER_SET_STANDBY, NULL); - - return lg_h06xf_pll_set(fe, &core->i2c_adap, params); -} - static int lgdt330x_pll_rf_set(struct dvb_frontend* fe, int index) { struct cx8802_dev *dev= fe->dvb->priv; @@ -428,6 +400,7 @@ static struct lgdt330x_config fusionhdtv_3_gold = { .demod_address = 0x0e, .demod_chip = LGDT3302, .serial_mpeg = 0x04, /* TPSERIAL for 3302 in TOP_CONTROL */ + .pll_set = lgdt330x_pll_set, .set_ts_params = lgdt330x_set_ts_param, }; @@ -435,13 +408,7 @@ static struct lgdt330x_config fusionhdtv_5_gold = { .demod_address = 0x0e, .demod_chip = LGDT3303, .serial_mpeg = 0x40, /* TPSERIAL for 3303 in TOP_CONTROL */ - .set_ts_params = lgdt330x_set_ts_param, -}; - -static struct lgdt330x_config pchdtv_hd5500 = { - .demod_address = 0x59, - .demod_chip = LGDT3303, - .serial_mpeg = 0x40, /* TPSERIAL for 3303 in TOP_CONTROL */ + .pll_set = lgdt330x_pll_set, .set_ts_params = lgdt330x_set_ts_param, }; #endif @@ -466,6 +433,8 @@ static int nxt200x_set_pll_input(u8* buf, int input) static struct nxt200x_config ati_hdtvwonder = { .demod_address = 0x0a, + .pll_address = 0x61, + .pll_desc = &dvb_pll_tuv1236d, .set_pll_input = nxt200x_set_pll_input, .set_ts_params = nxt200x_set_ts_param, }; @@ -480,50 +449,28 @@ static int cx24123_set_ts_param(struct dvb_frontend* fe, return 0; } -static int kworld_dvbs_100_set_voltage(struct dvb_frontend* fe, fe_sec_voltage_t voltage) +static void cx24123_enable_lnb_voltage(struct dvb_frontend* fe, int on) { struct cx8802_dev *dev= fe->dvb->priv; struct cx88_core *core = dev->core; - if (voltage == SEC_VOLTAGE_OFF) { - cx_write(MO_GP0_IO, 0x000006fB); - } else { + if (on) cx_write(MO_GP0_IO, 0x000006f9); - } - - if (core->prev_set_voltage) - return core->prev_set_voltage(fe, voltage); - return 0; -} - -static int geniatech_dvbs_set_voltage(struct dvb_frontend *fe, fe_sec_voltage_t voltage) -{ - struct cx8802_dev *dev= fe->dvb->priv; - struct cx88_core *core = dev->core; - - if (voltage == SEC_VOLTAGE_OFF) { - dprintk(1,"LNB Voltage OFF\n"); - cx_write(MO_GP0_IO, 0x0000efff); - } - - if (core->prev_set_voltage) - return core->prev_set_voltage(fe, voltage); - return 0; + else + cx_write(MO_GP0_IO, 0x000006fB); } -static struct cx24123_config geniatech_dvbs_config = { - .demod_address = 0x55, - .set_ts_params = cx24123_set_ts_param, -}; - static struct cx24123_config hauppauge_novas_config = { .demod_address = 0x55, + .use_isl6421 = 1, .set_ts_params = cx24123_set_ts_param, }; static struct cx24123_config kworld_dvbs_100_config = { .demod_address = 0x15, + .use_isl6421 = 0, .set_ts_params = cx24123_set_ts_param, + .enable_lnb_voltage = cx24123_enable_lnb_voltage, }; #endif @@ -539,11 +486,6 @@ static int dvb_register(struct cx8802_dev *dev) case CX88_BOARD_HAUPPAUGE_DVB_T1: dev->dvb.frontend = cx22702_attach(&hauppauge_novat_config, &dev->core->i2c_adap); - if (dev->dvb.frontend != NULL) { - dvb_pll_attach(dev->dvb.frontend, 0x61, - &dev->core->i2c_adap, - &dvb_pll_thomson_dtt759x); - } break; case CX88_BOARD_TERRATEC_CINERGY_1400_DVB_T1: case CX88_BOARD_CONEXANT_DVB_T1: @@ -551,92 +493,33 @@ static int dvb_register(struct cx8802_dev *dev) case CX88_BOARD_WINFAST_DTV1000: dev->dvb.frontend = cx22702_attach(&connexant_refboard_config, &dev->core->i2c_adap); - if (dev->dvb.frontend != NULL) { - dvb_pll_attach(dev->dvb.frontend, 0x60, - &dev->core->i2c_adap, - &dvb_pll_thomson_dtt7579); - } break; - case CX88_BOARD_WINFAST_DTV2000H: case CX88_BOARD_HAUPPAUGE_HVR1100: case CX88_BOARD_HAUPPAUGE_HVR1100LP: dev->dvb.frontend = cx22702_attach(&hauppauge_hvr1100_config, &dev->core->i2c_adap); - if (dev->dvb.frontend != NULL) { - dvb_pll_attach(dev->dvb.frontend, 0x61, - &dev->core->i2c_adap, - &dvb_pll_fmd1216me); - } break; #endif -#if defined(HAVE_MT352) || defined(HAVE_ZL10353) - case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PLUS: #ifdef HAVE_MT352 + case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T1: + dev->core->pll_addr = 0x61; + dev->core->pll_desc = &dvb_pll_lg_z201; dev->dvb.frontend = mt352_attach(&dvico_fusionhdtv, &dev->core->i2c_adap); - if (dev->dvb.frontend != NULL) { - dvb_pll_attach(dev->dvb.frontend, 0x60, - NULL, - &dvb_pll_thomson_dtt7579); - break; - } -#endif -#ifdef HAVE_ZL10353 - /* ZL10353 replaces MT352 on later cards */ - dev->dvb.frontend = zl10353_attach(&dvico_fusionhdtv_plus_v1_1, - &dev->core->i2c_adap); - if (dev->dvb.frontend != NULL) { - dvb_pll_attach(dev->dvb.frontend, 0x60, - NULL, - &dvb_pll_thomson_dtt7579); - } -#endif break; - case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL: -#ifdef HAVE_MT352 - /* The tin box says DEE1601, but it seems to be DTT7579 - * compatible, with a slightly different MT352 AGC gain. */ - dev->dvb.frontend = mt352_attach(&dvico_fusionhdtv_dual, - &dev->core->i2c_adap); - if (dev->dvb.frontend != NULL) { - dvb_pll_attach(dev->dvb.frontend, 0x61, - NULL, - &dvb_pll_thomson_dtt7579); - break; - } -#endif -#ifdef HAVE_ZL10353 - /* ZL10353 replaces MT352 on later cards */ - dev->dvb.frontend = zl10353_attach(&dvico_fusionhdtv_plus_v1_1, - &dev->core->i2c_adap); - if (dev->dvb.frontend != NULL) { - dvb_pll_attach(dev->dvb.frontend, 0x61, - NULL, - &dvb_pll_thomson_dtt7579); - } -#endif - break; -#endif /* HAVE_MT352 || HAVE_ZL10353 */ -#ifdef HAVE_MT352 - case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T1: + case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PLUS: + dev->core->pll_addr = 0x60; + dev->core->pll_desc = &dvb_pll_thomson_dtt7579; dev->dvb.frontend = mt352_attach(&dvico_fusionhdtv, &dev->core->i2c_adap); - if (dev->dvb.frontend != NULL) { - dvb_pll_attach(dev->dvb.frontend, 0x61, - NULL, - &dvb_pll_lg_z201); - } break; case CX88_BOARD_KWORLD_DVB_T: case CX88_BOARD_DNTV_LIVE_DVB_T: case CX88_BOARD_ADSTECH_DVB_T_PCI: + dev->core->pll_addr = 0x61; + dev->core->pll_desc = &dvb_pll_unknown_1; dev->dvb.frontend = mt352_attach(&dntv_live_dvbt_config, &dev->core->i2c_adap); - if (dev->dvb.frontend != NULL) { - dvb_pll_attach(dev->dvb.frontend, 0x61, - NULL, - &dvb_pll_unknown_1); - } break; case CX88_BOARD_DNTV_LIVE_DVB_T_PRO: #ifdef HAVE_VP3054_I2C @@ -644,34 +527,23 @@ static int dvb_register(struct cx8802_dev *dev) dev->core->pll_desc = &dvb_pll_fmd1216me; dev->dvb.frontend = mt352_attach(&dntv_live_dvbt_pro_config, &((struct vp3054_i2c_state *)dev->card_priv)->adap); - if (dev->dvb.frontend != NULL) { - dev->dvb.frontend->ops.tuner_ops.set_params = dntv_live_dvbt_pro_tuner_set_params; - } #else printk("%s: built without vp3054 support\n", dev->core->name); #endif break; -#endif -#ifdef HAVE_ZL10353 - case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_HYBRID: + case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL: + /* The tin box says DEE1601, but it seems to be DTT7579 + * compatible, with a slightly different MT352 AGC gain. */ dev->core->pll_addr = 0x61; - dev->core->pll_desc = &dvb_pll_thomson_fe6600; - dev->dvb.frontend = zl10353_attach(&dvico_fusionhdtv_hybrid, - &dev->core->i2c_adap); - if (dev->dvb.frontend != NULL) { - dev->dvb.frontend->ops.tuner_ops.set_params = dvico_hybrid_tuner_set_params; - } + dev->core->pll_desc = &dvb_pll_thomson_dtt7579; + dev->dvb.frontend = mt352_attach(&dvico_fusionhdtv_dual, + &dev->core->i2c_adap); break; #endif #ifdef HAVE_OR51132 case CX88_BOARD_PCHDTV_HD3000: dev->dvb.frontend = or51132_attach(&pchdtv_hd3000, &dev->core->i2c_adap); - if (dev->dvb.frontend != NULL) { - dvb_pll_attach(dev->dvb.frontend, 0x61, - &dev->core->i2c_adap, - &dvb_pll_thomson_dtt761x); - } break; #endif #ifdef HAVE_LGDT330X @@ -692,9 +564,6 @@ static int dvb_register(struct cx8802_dev *dev) dev->core->pll_desc = &dvb_pll_microtune_4042; dev->dvb.frontend = lgdt330x_attach(&fusionhdtv_3_gold, &dev->core->i2c_adap); - if (dev->dvb.frontend != NULL) { - dev->dvb.frontend->ops.tuner_ops.set_params = lgdt3302_tuner_set_params; - } } break; case CX88_BOARD_DVICO_FUSIONHDTV_3_GOLD_T: @@ -711,9 +580,6 @@ static int dvb_register(struct cx8802_dev *dev) dev->core->pll_desc = &dvb_pll_thomson_dtt761x; dev->dvb.frontend = lgdt330x_attach(&fusionhdtv_3_gold, &dev->core->i2c_adap); - if (dev->dvb.frontend != NULL) { - dev->dvb.frontend->ops.tuner_ops.set_params = lgdt3302_tuner_set_params; - } } break; case CX88_BOARD_DVICO_FUSIONHDTV_5_GOLD: @@ -726,28 +592,10 @@ static int dvb_register(struct cx8802_dev *dev) mdelay(100); cx_set(MO_GP0_IO, 1); mdelay(200); + dev->core->pll_addr = 0x61; + dev->core->pll_desc = &dvb_pll_tdvs_tua6034; dev->dvb.frontend = lgdt330x_attach(&fusionhdtv_5_gold, &dev->core->i2c_adap); - if (dev->dvb.frontend != NULL) { - dev->dvb.frontend->ops.tuner_ops.set_params = lgdt3303_tuner_set_params; - } - } - break; - case CX88_BOARD_PCHDTV_HD5500: - dev->ts_gen_cntrl = 0x08; - { - /* Do a hardware reset of chip before using it. */ - struct cx88_core *core = dev->core; - - cx_clear(MO_GP0_IO, 1); - mdelay(100); - cx_set(MO_GP0_IO, 1); - mdelay(200); - dev->dvb.frontend = lgdt330x_attach(&pchdtv_hd5500, - &dev->core->i2c_adap); - if (dev->dvb.frontend != NULL) { - dev->dvb.frontend->ops.tuner_ops.set_params = lgdt3303_tuner_set_params; - } } break; #endif @@ -755,11 +603,6 @@ static int dvb_register(struct cx8802_dev *dev) case CX88_BOARD_ATI_HDTVWONDER: dev->dvb.frontend = nxt200x_attach(&ati_hdtvwonder, &dev->core->i2c_adap); - if (dev->dvb.frontend != NULL) { - dvb_pll_attach(dev->dvb.frontend, 0x61, - NULL, - &dvb_pll_tuv1236d); - } break; #endif #ifdef HAVE_CX24123 @@ -767,26 +610,10 @@ static int dvb_register(struct cx8802_dev *dev) case CX88_BOARD_HAUPPAUGE_NOVASE2_S1: dev->dvb.frontend = cx24123_attach(&hauppauge_novas_config, &dev->core->i2c_adap); - if (dev->dvb.frontend) { - isl6421_attach(dev->dvb.frontend, &dev->core->i2c_adap, - 0x08, 0x00, 0x00); - } break; case CX88_BOARD_KWORLD_DVBS_100: dev->dvb.frontend = cx24123_attach(&kworld_dvbs_100_config, &dev->core->i2c_adap); - if (dev->dvb.frontend) { - dev->core->prev_set_voltage = dev->dvb.frontend->ops.set_voltage; - dev->dvb.frontend->ops.set_voltage = kworld_dvbs_100_set_voltage; - } - break; - case CX88_BOARD_GENIATECH_DVBS: - dev->dvb.frontend = cx24123_attach(&geniatech_dvbs_config, - &dev->core->i2c_adap); - if (dev->dvb.frontend) { - dev->core->prev_set_voltage = dev->dvb.frontend->ops.set_voltage; - dev->dvb.frontend->ops.set_voltage = geniatech_dvbs_set_voltage; - } break; #endif default: @@ -800,15 +627,15 @@ static int dvb_register(struct cx8802_dev *dev) } if (dev->core->pll_desc) { - dev->dvb.frontend->ops.info.frequency_min = dev->core->pll_desc->min; - dev->dvb.frontend->ops.info.frequency_max = dev->core->pll_desc->max; + dev->dvb.frontend->ops->info.frequency_min = dev->core->pll_desc->min; + dev->dvb.frontend->ops->info.frequency_max = dev->core->pll_desc->max; } /* Put the analog decoder in standby to keep it quiet */ cx88_call_i2c_clients (dev->core, TUNER_SET_STANDBY, NULL); /* register everything */ - return videobuf_dvb_register(&dev->dvb, THIS_MODULE, dev, &dev->pci->dev); + return videobuf_dvb_register(&dev->dvb, THIS_MODULE, dev); } /* ----------------------------------------------------------- */ diff --git a/drivers/media/video/cx88/cx88-i2c.c b/drivers/media/video/cx88/cx88-i2c.c index 70663805c..f720901e9 100644 --- a/drivers/media/video/cx88/cx88-i2c.c +++ b/drivers/media/video/cx88/cx88-i2c.c @@ -138,13 +138,13 @@ void cx88_call_i2c_clients(struct cx88_core *core, unsigned int cmd, void *arg) return; if (core->dvbdev) { - if (core->dvbdev->dvb.frontend->ops.i2c_gate_ctrl) - core->dvbdev->dvb.frontend->ops.i2c_gate_ctrl(core->dvbdev->dvb.frontend, 1); + if (core->dvbdev->dvb.frontend->ops->i2c_gate_ctrl) + core->dvbdev->dvb.frontend->ops->i2c_gate_ctrl(core->dvbdev->dvb.frontend, 1); i2c_clients_command(&core->i2c_adap, cmd, arg); - if (core->dvbdev->dvb.frontend->ops.i2c_gate_ctrl) - core->dvbdev->dvb.frontend->ops.i2c_gate_ctrl(core->dvbdev->dvb.frontend, 0); + if (core->dvbdev->dvb.frontend->ops->i2c_gate_ctrl) + core->dvbdev->dvb.frontend->ops->i2c_gate_ctrl(core->dvbdev->dvb.frontend, 0); } else i2c_clients_command(&core->i2c_adap, cmd, arg); } @@ -234,6 +234,7 @@ int cx88_i2c_init(struct cx88_core *core, struct pci_dev *pci) /* ----------------------------------------------------------------------- */ EXPORT_SYMBOL(cx88_call_i2c_clients); +EXPORT_SYMBOL(cx88_i2c_init); /* * Local variables: diff --git a/drivers/media/video/cx88/cx88-input.c b/drivers/media/video/cx88/cx88-input.c index c25564648..165d94862 100644 --- a/drivers/media/video/cx88/cx88-input.c +++ b/drivers/media/video/cx88/cx88-input.c @@ -34,6 +34,337 @@ /* ---------------------------------------------------------------------- */ +/* DigitalNow DNTV Live DVB-T Remote */ +static IR_KEYTAB_TYPE ir_codes_dntv_live_dvb_t[IR_KEYTAB_SIZE] = { + [0x00] = KEY_ESC, /* 'go up a level?' */ + /* Keys 0 to 9 */ + [0x0a] = KEY_KP0, + [0x01] = KEY_KP1, + [0x02] = KEY_KP2, + [0x03] = KEY_KP3, + [0x04] = KEY_KP4, + [0x05] = KEY_KP5, + [0x06] = KEY_KP6, + [0x07] = KEY_KP7, + [0x08] = KEY_KP8, + [0x09] = KEY_KP9, + + [0x0b] = KEY_TUNER, /* tv/fm */ + [0x0c] = KEY_SEARCH, /* scan */ + [0x0d] = KEY_STOP, + [0x0e] = KEY_PAUSE, + [0x0f] = KEY_LIST, /* source */ + + [0x10] = KEY_MUTE, + [0x11] = KEY_REWIND, /* backward << */ + [0x12] = KEY_POWER, + [0x13] = KEY_S, /* snap */ + [0x14] = KEY_AUDIO, /* stereo */ + [0x15] = KEY_CLEAR, /* reset */ + [0x16] = KEY_PLAY, + [0x17] = KEY_ENTER, + [0x18] = KEY_ZOOM, /* full screen */ + [0x19] = KEY_FASTFORWARD, /* forward >> */ + [0x1a] = KEY_CHANNELUP, + [0x1b] = KEY_VOLUMEUP, + [0x1c] = KEY_INFO, /* preview */ + [0x1d] = KEY_RECORD, /* record */ + [0x1e] = KEY_CHANNELDOWN, + [0x1f] = KEY_VOLUMEDOWN, +}; + +/* ---------------------------------------------------------------------- */ + +/* IO-DATA BCTV7E Remote */ +static IR_KEYTAB_TYPE ir_codes_iodata_bctv7e[IR_KEYTAB_SIZE] = { + [0x40] = KEY_TV, + [0x20] = KEY_RADIO, /* FM */ + [0x60] = KEY_EPG, + [0x00] = KEY_POWER, + + /* Keys 0 to 9 */ + [0x44] = KEY_KP0, /* 10 */ + [0x50] = KEY_KP1, + [0x30] = KEY_KP2, + [0x70] = KEY_KP3, + [0x48] = KEY_KP4, + [0x28] = KEY_KP5, + [0x68] = KEY_KP6, + [0x58] = KEY_KP7, + [0x38] = KEY_KP8, + [0x78] = KEY_KP9, + + [0x10] = KEY_L, /* Live */ + [0x08] = KEY_T, /* Time Shift */ + + [0x18] = KEY_PLAYPAUSE, /* Play */ + + [0x24] = KEY_ENTER, /* 11 */ + [0x64] = KEY_ESC, /* 12 */ + [0x04] = KEY_M, /* Multi */ + + [0x54] = KEY_VIDEO, + [0x34] = KEY_CHANNELUP, + [0x74] = KEY_VOLUMEUP, + [0x14] = KEY_MUTE, + + [0x4c] = KEY_S, /* SVIDEO */ + [0x2c] = KEY_CHANNELDOWN, + [0x6c] = KEY_VOLUMEDOWN, + [0x0c] = KEY_ZOOM, + + [0x5c] = KEY_PAUSE, + [0x3c] = KEY_C, /* || (red) */ + [0x7c] = KEY_RECORD, /* recording */ + [0x1c] = KEY_STOP, + + [0x41] = KEY_REWIND, /* backward << */ + [0x21] = KEY_PLAY, + [0x61] = KEY_FASTFORWARD, /* forward >> */ + [0x01] = KEY_NEXT, /* skip >| */ +}; + +/* ---------------------------------------------------------------------- */ + +/* ADS Tech Instant TV DVB-T PCI Remote */ +static IR_KEYTAB_TYPE ir_codes_adstech_dvb_t_pci[IR_KEYTAB_SIZE] = { + /* Keys 0 to 9 */ + [0x4d] = KEY_0, + [0x57] = KEY_1, + [0x4f] = KEY_2, + [0x53] = KEY_3, + [0x56] = KEY_4, + [0x4e] = KEY_5, + [0x5e] = KEY_6, + [0x54] = KEY_7, + [0x4c] = KEY_8, + [0x5c] = KEY_9, + + [0x5b] = KEY_POWER, + [0x5f] = KEY_MUTE, + [0x55] = KEY_GOTO, + [0x5d] = KEY_SEARCH, + [0x17] = KEY_EPG, /* Guide */ + [0x1f] = KEY_MENU, + [0x0f] = KEY_UP, + [0x46] = KEY_DOWN, + [0x16] = KEY_LEFT, + [0x1e] = KEY_RIGHT, + [0x0e] = KEY_SELECT, /* Enter */ + [0x5a] = KEY_INFO, + [0x52] = KEY_EXIT, + [0x59] = KEY_PREVIOUS, + [0x51] = KEY_NEXT, + [0x58] = KEY_REWIND, + [0x50] = KEY_FORWARD, + [0x44] = KEY_PLAYPAUSE, + [0x07] = KEY_STOP, + [0x1b] = KEY_RECORD, + [0x13] = KEY_TUNER, /* Live */ + [0x0a] = KEY_A, + [0x12] = KEY_B, + [0x03] = KEY_PROG1, /* 1 */ + [0x01] = KEY_PROG2, /* 2 */ + [0x00] = KEY_PROG3, /* 3 */ + [0x06] = KEY_DVD, + [0x48] = KEY_AUX, /* Photo */ + [0x40] = KEY_VIDEO, + [0x19] = KEY_AUDIO, /* Music */ + [0x0b] = KEY_CHANNELUP, + [0x08] = KEY_CHANNELDOWN, + [0x15] = KEY_VOLUMEUP, + [0x1c] = KEY_VOLUMEDOWN, +}; + +/* ---------------------------------------------------------------------- */ + +/* MSI TV@nywhere remote */ +static IR_KEYTAB_TYPE ir_codes_msi_tvanywhere[IR_KEYTAB_SIZE] = { + /* Keys 0 to 9 */ + [0x00] = KEY_0, + [0x01] = KEY_1, + [0x02] = KEY_2, + [0x03] = KEY_3, + [0x04] = KEY_4, + [0x05] = KEY_5, + [0x06] = KEY_6, + [0x07] = KEY_7, + [0x08] = KEY_8, + [0x09] = KEY_9, + + [0x0c] = KEY_MUTE, + [0x0f] = KEY_SCREEN, /* Full Screen */ + [0x10] = KEY_F, /* Funtion */ + [0x11] = KEY_T, /* Time shift */ + [0x12] = KEY_POWER, + [0x13] = KEY_MEDIA, /* MTS */ + [0x14] = KEY_SLOW, + [0x16] = KEY_REWIND, /* backward << */ + [0x17] = KEY_ENTER, /* Return */ + [0x18] = KEY_FASTFORWARD, /* forward >> */ + [0x1a] = KEY_CHANNELUP, + [0x1b] = KEY_VOLUMEUP, + [0x1e] = KEY_CHANNELDOWN, + [0x1f] = KEY_VOLUMEDOWN, +}; + +/* ---------------------------------------------------------------------- */ + +/* Cinergy 1400 DVB-T */ +static IR_KEYTAB_TYPE ir_codes_cinergy_1400[IR_KEYTAB_SIZE] = { + [0x01] = KEY_POWER, + [0x02] = KEY_1, + [0x03] = KEY_2, + [0x04] = KEY_3, + [0x05] = KEY_4, + [0x06] = KEY_5, + [0x07] = KEY_6, + [0x08] = KEY_7, + [0x09] = KEY_8, + [0x0a] = KEY_9, + [0x0c] = KEY_0, + + [0x0b] = KEY_VIDEO, + [0x0d] = KEY_REFRESH, + [0x0e] = KEY_SELECT, + [0x0f] = KEY_EPG, + [0x10] = KEY_UP, + [0x11] = KEY_LEFT, + [0x12] = KEY_OK, + [0x13] = KEY_RIGHT, + [0x14] = KEY_DOWN, + [0x15] = KEY_TEXT, + [0x16] = KEY_INFO, + + [0x17] = KEY_RED, + [0x18] = KEY_GREEN, + [0x19] = KEY_YELLOW, + [0x1a] = KEY_BLUE, + + [0x1b] = KEY_CHANNELUP, + [0x1c] = KEY_VOLUMEUP, + [0x1d] = KEY_MUTE, + [0x1e] = KEY_VOLUMEDOWN, + [0x1f] = KEY_CHANNELDOWN, + + [0x40] = KEY_PAUSE, + [0x4c] = KEY_PLAY, + [0x58] = KEY_RECORD, + [0x54] = KEY_PREVIOUS, + [0x48] = KEY_STOP, + [0x5c] = KEY_NEXT, +}; + +/* ---------------------------------------------------------------------- */ + +/* AVERTV STUDIO 303 Remote */ +static IR_KEYTAB_TYPE ir_codes_avertv_303[IR_KEYTAB_SIZE] = { + [ 0x2a ] = KEY_KP1, + [ 0x32 ] = KEY_KP2, + [ 0x3a ] = KEY_KP3, + [ 0x4a ] = KEY_KP4, + [ 0x52 ] = KEY_KP5, + [ 0x5a ] = KEY_KP6, + [ 0x6a ] = KEY_KP7, + [ 0x72 ] = KEY_KP8, + [ 0x7a ] = KEY_KP9, + [ 0x0e ] = KEY_KP0, + + [ 0x02 ] = KEY_POWER, + [ 0x22 ] = KEY_VIDEO, + [ 0x42 ] = KEY_AUDIO, + [ 0x62 ] = KEY_ZOOM, + [ 0x0a ] = KEY_TV, + [ 0x12 ] = KEY_CD, + [ 0x1a ] = KEY_TEXT, + + [ 0x16 ] = KEY_SUBTITLE, + [ 0x1e ] = KEY_REWIND, + [ 0x06 ] = KEY_PRINT, + + [ 0x2e ] = KEY_SEARCH, + [ 0x36 ] = KEY_SLEEP, + [ 0x3e ] = KEY_SHUFFLE, + [ 0x26 ] = KEY_MUTE, + + [ 0x4e ] = KEY_RECORD, + [ 0x56 ] = KEY_PAUSE, + [ 0x5e ] = KEY_STOP, + [ 0x46 ] = KEY_PLAY, + + [ 0x6e ] = KEY_RED, + [ 0x0b ] = KEY_GREEN, + [ 0x66 ] = KEY_YELLOW, + [ 0x03 ] = KEY_BLUE, + + [ 0x76 ] = KEY_LEFT, + [ 0x7e ] = KEY_RIGHT, + [ 0x13 ] = KEY_DOWN, + [ 0x1b ] = KEY_UP, +}; + +/* ---------------------------------------------------------------------- */ + +/* DigitalNow DNTV Live! DVB-T Pro Remote */ +static IR_KEYTAB_TYPE ir_codes_dntv_live_dvbt_pro[IR_KEYTAB_SIZE] = { + [ 0x16 ] = KEY_POWER, + [ 0x5b ] = KEY_HOME, + + [ 0x55 ] = KEY_TV, /* live tv */ + [ 0x58 ] = KEY_TUNER, /* digital Radio */ + [ 0x5a ] = KEY_RADIO, /* FM radio */ + [ 0x59 ] = KEY_DVD, /* dvd menu */ + [ 0x03 ] = KEY_1, + [ 0x01 ] = KEY_2, + [ 0x06 ] = KEY_3, + [ 0x09 ] = KEY_4, + [ 0x1d ] = KEY_5, + [ 0x1f ] = KEY_6, + [ 0x0d ] = KEY_7, + [ 0x19 ] = KEY_8, + [ 0x1b ] = KEY_9, + [ 0x0c ] = KEY_CANCEL, + [ 0x15 ] = KEY_0, + [ 0x4a ] = KEY_CLEAR, + [ 0x13 ] = KEY_BACK, + [ 0x00 ] = KEY_TAB, + [ 0x4b ] = KEY_UP, + [ 0x4e ] = KEY_LEFT, + [ 0x4f ] = KEY_OK, + [ 0x52 ] = KEY_RIGHT, + [ 0x51 ] = KEY_DOWN, + [ 0x1e ] = KEY_VOLUMEUP, + [ 0x0a ] = KEY_VOLUMEDOWN, + [ 0x02 ] = KEY_CHANNELDOWN, + [ 0x05 ] = KEY_CHANNELUP, + [ 0x11 ] = KEY_RECORD, + [ 0x14 ] = KEY_PLAY, + [ 0x4c ] = KEY_PAUSE, + [ 0x1a ] = KEY_STOP, + [ 0x40 ] = KEY_REWIND, + [ 0x12 ] = KEY_FASTFORWARD, + [ 0x41 ] = KEY_PREVIOUSSONG, /* replay |< */ + [ 0x42 ] = KEY_NEXTSONG, /* skip >| */ + [ 0x54 ] = KEY_CAMERA, /* capture */ + [ 0x50 ] = KEY_LANGUAGE, /* sap */ + [ 0x47 ] = KEY_TV2, /* pip */ + [ 0x4d ] = KEY_SCREEN, + [ 0x43 ] = KEY_SUBTITLE, + [ 0x10 ] = KEY_MUTE, + [ 0x49 ] = KEY_AUDIO, /* l/r */ + [ 0x07 ] = KEY_SLEEP, + [ 0x08 ] = KEY_VIDEO, /* a/v */ + [ 0x0e ] = KEY_PREVIOUS, /* recall */ + [ 0x45 ] = KEY_ZOOM, /* zoom + */ + [ 0x46 ] = KEY_ANGLE, /* zoom - */ + [ 0x56 ] = KEY_RED, + [ 0x57 ] = KEY_GREEN, + [ 0x5c ] = KEY_YELLOW, + [ 0x5d ] = KEY_BLUE, +}; + +/* ---------------------------------------------------------------------- */ + struct cx88_IR { struct cx88_core *core; struct input_dev *input; @@ -70,33 +401,14 @@ MODULE_PARM_DESC(ir_debug, "enable debug messages [IR]"); static void cx88_ir_handle_key(struct cx88_IR *ir) { struct cx88_core *core = ir->core; - u32 gpio, data, auxgpio; + u32 gpio, data; /* read gpio value */ gpio = cx_read(ir->gpio_addr); - if (core->board == CX88_BOARD_NPGTECH_REALTV_TOP10FM) { - /* This board apparently uses a combination of 2 GPIO - to represent the keys. Additionally, the second GPIO - can be used for parity. - - Example: - - for key "5" - gpio = 0x758, auxgpio = 0xe5 or 0xf5 - for key "Power" - gpio = 0x758, auxgpio = 0xed or 0xfd - */ - - auxgpio = cx_read(MO_GP1_IO); - /* Take out the parity part */ - gpio=(gpio & 0x7fd) + (auxgpio & 0xef); - } else - auxgpio = gpio; - if (ir->polling) { - if (ir->last_gpio == auxgpio) + if (ir->last_gpio == gpio) return; - ir->last_gpio = auxgpio; + ir->last_gpio = gpio; } /* extract data */ @@ -191,13 +503,12 @@ int cx88_ir_init(struct cx88_core *core, struct pci_dev *pci) ir_type = IR_TYPE_RC5; ir->sampling = 1; break; - case CX88_BOARD_WINFAST_DTV2000H: case CX88_BOARD_WINFAST2000XP_EXPERT: ir_codes = ir_codes_winfast; ir->gpio_addr = MO_GP0_IO; ir->mask_keycode = 0x8f8; ir->mask_keyup = 0x100; - ir->polling = 50; /* ms */ + ir->polling = 1; /* ms */ break; case CX88_BOARD_IODATA_GVBCTV7E: ir_codes = ir_codes_iodata_bctv7e; @@ -206,7 +517,6 @@ int cx88_ir_init(struct cx88_core *core, struct pci_dev *pci) ir->mask_keydown = 0x02; ir->polling = 5; /* ms */ break; - case CX88_BOARD_PROLINK_PLAYTVPVR: case CX88_BOARD_PIXELVIEW_PLAYTV_ULTRA_PRO: ir_codes = ir_codes_pixelview; ir->gpio_addr = MO_GP1_IO; @@ -214,13 +524,6 @@ int cx88_ir_init(struct cx88_core *core, struct pci_dev *pci) ir->mask_keyup = 0x80; ir->polling = 1; /* ms */ break; - case CX88_BOARD_KWORLD_LTV883: - ir_codes = ir_codes_pixelview; - ir->gpio_addr = MO_GP1_IO; - ir->mask_keycode = 0x1f; - ir->mask_keyup = 0x60; - ir->polling = 1; /* ms */ - break; case CX88_BOARD_ADSTECH_DVB_T_PCI: ir_codes = ir_codes_adstech_dvb_t_pci; ir->gpio_addr = MO_GP1_IO; @@ -248,12 +551,6 @@ int cx88_ir_init(struct cx88_core *core, struct pci_dev *pci) ir_type = IR_TYPE_PD; ir->sampling = 0xff00; /* address */ break; - case CX88_BOARD_NPGTECH_REALTV_TOP10FM: - ir_codes = ir_codes_npgtech; - ir->gpio_addr = MO_GP0_IO; - ir->mask_keycode = 0xfa; - ir->polling = 50; /* ms */ - break; } if (NULL == ir_codes) { diff --git a/drivers/media/video/cx88/cx88-mpeg.c b/drivers/media/video/cx88/cx88-mpeg.c index 138a4f692..c79cc1d2b 100644 --- a/drivers/media/video/cx88/cx88-mpeg.c +++ b/drivers/media/video/cx88/cx88-mpeg.c @@ -54,7 +54,7 @@ static int cx8802_start_dma(struct cx8802_dev *dev, { struct cx88_core *core = dev->core; - dprintk(1, "cx8802_start_dma w: %d, h: %d, f: %d\n", dev->width, dev->height, buf->vb.field); + dprintk(0, "cx8802_start_dma w: %d, h: %d, f: %d\n", dev->width, dev->height, buf->vb.field); /* setup fifo + format */ cx88_sram_channel_setup(core, &cx88_sram_channels[SRAM_CH28], @@ -76,7 +76,6 @@ static int cx8802_start_dma(struct cx8802_dev *dev, case CX88_BOARD_DVICO_FUSIONHDTV_3_GOLD_Q: case CX88_BOARD_DVICO_FUSIONHDTV_3_GOLD_T: case CX88_BOARD_DVICO_FUSIONHDTV_5_GOLD: - case CX88_BOARD_PCHDTV_HD5500: cx_write(TS_SOP_STAT, 1<<13); break; case CX88_BOARD_HAUPPAUGE_NOVASPLUS_S1: @@ -110,7 +109,7 @@ static int cx8802_start_dma(struct cx8802_dev *dev, q->count = 1; /* enable irqs */ - dprintk( 1, "setting the interrupt mask\n" ); + dprintk( 0, "setting the interrupt mask\n" ); cx_set(MO_PCI_INTMSK, core->pci_irqmask | 0x04); cx_set(MO_TS_INTMSK, 0x1f0011); @@ -123,7 +122,7 @@ static int cx8802_start_dma(struct cx8802_dev *dev, static int cx8802_stop_dma(struct cx8802_dev *dev) { struct cx88_core *core = dev->core; - dprintk( 1, "cx8802_stop_dma\n" ); + dprintk( 0, "cx8802_stop_dma\n" ); /* stop dma */ cx_clear(MO_TS_DMACNTRL, 0x11); @@ -143,43 +142,10 @@ static int cx8802_restart_queue(struct cx8802_dev *dev, struct cx88_buffer *buf; struct list_head *item; - dprintk( 1, "cx8802_restart_queue\n" ); + dprintk( 0, "cx8802_restart_queue\n" ); if (list_empty(&q->active)) { - struct cx88_buffer *prev; - prev = NULL; - - dprintk(1, "cx8802_restart_queue: queue is empty\n" ); - - for (;;) { - if (list_empty(&q->queued)) - return 0; - buf = list_entry(q->queued.next, struct cx88_buffer, vb.queue); - if (NULL == prev) { - list_del(&buf->vb.queue); - list_add_tail(&buf->vb.queue,&q->active); - cx8802_start_dma(dev, q, buf); - buf->vb.state = STATE_ACTIVE; - buf->count = q->count++; - mod_timer(&q->timeout, jiffies+BUFFER_TIMEOUT); - dprintk(1,"[%p/%d] restart_queue - first active\n", - buf,buf->vb.i); - - } else if (prev->vb.width == buf->vb.width && - prev->vb.height == buf->vb.height && - prev->fmt == buf->fmt) { - list_del(&buf->vb.queue); - list_add_tail(&buf->vb.queue,&q->active); - buf->vb.state = STATE_ACTIVE; - buf->count = q->count++; - prev->risc.jmp[1] = cpu_to_le32(buf->risc.dma); - dprintk(1,"[%p/%d] restart_queue - move to active\n", - buf,buf->vb.i); - } else { - return 0; - } - prev = buf; - } + dprintk( 0, "cx8802_restart_queue: queue is empty\n" ); return 0; } @@ -197,8 +163,8 @@ static int cx8802_restart_queue(struct cx8802_dev *dev, /* ------------------------------------------------------------------ */ -int cx8802_buf_prepare(struct videobuf_queue *q, struct cx8802_dev *dev, - struct cx88_buffer *buf, enum v4l2_field field) +int cx8802_buf_prepare(struct cx8802_dev *dev, struct cx88_buffer *buf, + enum v4l2_field field) { int size = dev->ts_packet_size * dev->ts_packet_count; int rc; @@ -213,7 +179,7 @@ int cx8802_buf_prepare(struct videobuf_queue *q, struct cx8802_dev *dev, buf->vb.size = size; buf->vb.field = field /*V4L2_FIELD_TOP*/; - if (0 != (rc = videobuf_iolock(q,&buf->vb,NULL))) + if (0 != (rc = videobuf_iolock(dev->pci,&buf->vb,NULL))) goto fail; cx88_risc_databuffer(dev->pci, &buf->risc, buf->vb.dma.sglist, @@ -223,36 +189,36 @@ int cx8802_buf_prepare(struct videobuf_queue *q, struct cx8802_dev *dev, return 0; fail: - cx88_free_buffer(q,buf); + cx88_free_buffer(dev->pci,buf); return rc; } void cx8802_buf_queue(struct cx8802_dev *dev, struct cx88_buffer *buf) { struct cx88_buffer *prev; - struct cx88_dmaqueue *cx88q = &dev->mpegq; + struct cx88_dmaqueue *q = &dev->mpegq; dprintk( 1, "cx8802_buf_queue\n" ); /* add jump to stopper */ buf->risc.jmp[0] = cpu_to_le32(RISC_JUMP | RISC_IRQ1 | RISC_CNT_INC); - buf->risc.jmp[1] = cpu_to_le32(cx88q->stopper.dma); + buf->risc.jmp[1] = cpu_to_le32(q->stopper.dma); - if (list_empty(&cx88q->active)) { - dprintk( 1, "queue is empty - first active\n" ); - list_add_tail(&buf->vb.queue,&cx88q->active); - cx8802_start_dma(dev, cx88q, buf); + if (list_empty(&q->active)) { + dprintk( 0, "queue is empty - first active\n" ); + list_add_tail(&buf->vb.queue,&q->active); + cx8802_start_dma(dev, q, buf); buf->vb.state = STATE_ACTIVE; - buf->count = cx88q->count++; - mod_timer(&cx88q->timeout, jiffies+BUFFER_TIMEOUT); - dprintk(1,"[%p/%d] %s - first active\n", + buf->count = q->count++; + mod_timer(&q->timeout, jiffies+BUFFER_TIMEOUT); + dprintk(0,"[%p/%d] %s - first active\n", buf, buf->vb.i, __FUNCTION__); } else { dprintk( 1, "queue is not empty - append to active\n" ); - prev = list_entry(cx88q->active.prev, struct cx88_buffer, vb.queue); - list_add_tail(&buf->vb.queue,&cx88q->active); + prev = list_entry(q->active.prev, struct cx88_buffer, vb.queue); + list_add_tail(&buf->vb.queue,&q->active); buf->vb.state = STATE_ACTIVE; - buf->count = cx88q->count++; + buf->count = q->count++; prev->risc.jmp[1] = cpu_to_le32(buf->risc.dma); dprintk( 1, "[%p/%d] %s - append to active\n", buf, buf->vb.i, __FUNCTION__); @@ -278,7 +244,7 @@ static void do_cancel_buffers(struct cx8802_dev *dev, char *reason, int restart) } if (restart) { - dprintk(1, "restarting queue\n" ); + dprintk(0, "restarting queue\n" ); cx8802_restart_queue(dev,q); } spin_unlock_irqrestore(&dev->slock,flags); @@ -420,9 +386,9 @@ int cx8802_init_common(struct cx8802_dev *dev) pci_read_config_byte(dev->pci, PCI_CLASS_REVISION, &dev->pci_rev); pci_read_config_byte(dev->pci, PCI_LATENCY_TIMER, &dev->pci_lat); printk(KERN_INFO "%s/2: found at %s, rev: %d, irq: %d, " - "latency: %d, mmio: 0x%llx\n", dev->core->name, + "latency: %d, mmio: 0x%lx\n", dev->core->name, pci_name(dev->pci), dev->pci_rev, dev->pci->irq, - dev->pci_lat,(unsigned long long)pci_resource_start(dev->pci,0)); + dev->pci_lat,pci_resource_start(dev->pci,0)); /* initialize driver struct */ spin_lock_init(&dev->slock); @@ -438,7 +404,7 @@ int cx8802_init_common(struct cx8802_dev *dev) /* get irq */ err = request_irq(dev->pci->irq, cx8802_irq, - IRQF_SHARED | IRQF_DISABLED, dev->core->name, dev); + SA_SHIRQ | SA_INTERRUPT, dev->core->name, dev); if (err < 0) { printk(KERN_ERR "%s: can't get IRQ %d\n", dev->core->name, dev->pci->irq); diff --git a/drivers/media/video/cx88/cx88-tvaudio.c b/drivers/media/video/cx88/cx88-tvaudio.c index cbd85feec..da8d97ce0 100644 --- a/drivers/media/video/cx88/cx88-tvaudio.c +++ b/drivers/media/video/cx88/cx88-tvaudio.c @@ -137,28 +137,21 @@ static void set_audio_finish(struct cx88_core *core, u32 ctl) { u32 volume; -#ifndef CONFIG_VIDEO_CX88_ALSA +#ifndef USING_CX88_ALSA /* restart dma; This avoids buzz in NICAM and is good in others */ cx88_stop_audio_dma(core); #endif cx_write(AUD_RATE_THRES_DMD, 0x000000C0); -#ifndef CONFIG_VIDEO_CX88_ALSA +#ifndef USING_CX88_ALSA cx88_start_audio_dma(core); #endif if (cx88_boards[core->board].blackbird) { /* sets sound input from external adc */ - switch (core->board) { - case CX88_BOARD_HAUPPAUGE_ROSLYN: - case CX88_BOARD_KWORLD_MCE200_DELUXE: - case CX88_BOARD_KWORLD_HARDWARE_MPEG_TV_XPERT: - case CX88_BOARD_PIXELVIEW_PLAYTV_P7000: - case CX88_BOARD_ASUS_PVR_416: + if (core->board == CX88_BOARD_HAUPPAUGE_ROSLYN) cx_clear(AUD_CTL, EN_I2SIN_ENABLE); - break; - default: + else cx_set(AUD_CTL, EN_I2SIN_ENABLE); - } cx_write(AUD_I2SINPUTCNTL, 4); cx_write(AUD_BAUDRATE, 1); @@ -725,7 +718,7 @@ static void set_audio_standard_FM(struct cx88_core *core, /* ----------------------------------------------------------- */ -static int cx88_detect_nicam(struct cx88_core *core) +int cx88_detect_nicam(struct cx88_core *core) { int i, j = 0; @@ -892,7 +885,6 @@ void cx88_set_stereo(struct cx88_core *core, u32 mode, int manual) set_audio_standard_BTSC(core, 1, EN_BTSC_FORCE_SAP); break; case V4L2_TUNER_MODE_STEREO: - case V4L2_TUNER_MODE_LANG1_LANG2: set_audio_standard_BTSC(core, 0, EN_BTSC_FORCE_STEREO); break; } @@ -913,7 +905,6 @@ void cx88_set_stereo(struct cx88_core *core, u32 mode, int manual) EN_NICAM_FORCE_MONO2); break; case V4L2_TUNER_MODE_STEREO: - case V4L2_TUNER_MODE_LANG1_LANG2: set_audio_standard_NICAM(core, EN_NICAM_FORCE_STEREO); break; @@ -935,7 +926,6 @@ void cx88_set_stereo(struct cx88_core *core, u32 mode, int manual) EN_A2_FORCE_MONO2); break; case V4L2_TUNER_MODE_STEREO: - case V4L2_TUNER_MODE_LANG1_LANG2: set_audio_standard_A2(core, EN_A2_FORCE_STEREO); break; diff --git a/drivers/media/video/cx88/cx88-vbi.c b/drivers/media/video/cx88/cx88-vbi.c index aa2a69770..9bc6c8995 100644 --- a/drivers/media/video/cx88/cx88-vbi.c +++ b/drivers/media/video/cx88/cx88-vbi.c @@ -34,8 +34,8 @@ void cx8800_vbi_fmt(struct cx8800_dev *dev, struct v4l2_format *f) if (dev->core->tvnorm->id & V4L2_STD_525_60) { /* ntsc */ f->fmt.vbi.sampling_rate = 28636363; - f->fmt.vbi.start[0] = 10; - f->fmt.vbi.start[1] = 273; + f->fmt.vbi.start[0] = 10 -1; + f->fmt.vbi.start[1] = 273 -1; } else if (dev->core->tvnorm->id & V4L2_STD_625_50) { /* pal */ @@ -175,7 +175,7 @@ vbi_prepare(struct videobuf_queue *q, struct videobuf_buffer *vb, buf->vb.size = size; buf->vb.field = V4L2_FIELD_SEQ_TB; - if (0 != (rc = videobuf_iolock(q,&buf->vb,NULL))) + if (0 != (rc = videobuf_iolock(dev->pci,&buf->vb,NULL))) goto fail; cx88_risc_buffer(dev->pci, &buf->risc, buf->vb.dma.sglist, @@ -187,7 +187,7 @@ vbi_prepare(struct videobuf_queue *q, struct videobuf_buffer *vb, return 0; fail: - cx88_free_buffer(q,buf); + cx88_free_buffer(dev->pci,buf); return rc; } @@ -227,8 +227,9 @@ vbi_queue(struct videobuf_queue *vq, struct videobuf_buffer *vb) static void vbi_release(struct videobuf_queue *q, struct videobuf_buffer *vb) { struct cx88_buffer *buf = container_of(vb,struct cx88_buffer,vb); + struct cx8800_fh *fh = q->priv_data; - cx88_free_buffer(q,buf); + cx88_free_buffer(fh->dev->pci,buf); } struct videobuf_queue_ops cx8800_vbi_qops = { diff --git a/drivers/media/video/cx88/cx88-video.c b/drivers/media/video/cx88/cx88-video.c index 94c92bacc..073494cea 100644 --- a/drivers/media/video/cx88/cx88-video.c +++ b/drivers/media/video/cx88/cx88-video.c @@ -35,10 +35,8 @@ #include "cx88.h" #include -#ifdef CONFIG_VIDEO_V4L1_COMPAT /* Include V4L1 specific functions. Should be removed soon */ #include -#endif MODULE_DESCRIPTION("v4l2 driver module for cx2388x based TV cards"); MODULE_AUTHOR("Gerd Knorr [SuSE Labs]"); @@ -229,7 +227,7 @@ static struct cx88_ctrl cx8800_ctls[] = { .minimum = 0x00, .maximum = 0xff, .step = 1, - .default_value = 0x7f, + .default_value = 0, .type = V4L2_CTRL_TYPE_INTEGER, }, .off = 128, @@ -257,7 +255,7 @@ static struct cx88_ctrl cx8800_ctls[] = { .minimum = 0, .maximum = 0xff, .step = 1, - .default_value = 0x7f, + .default_value = 0, .type = V4L2_CTRL_TYPE_INTEGER, }, .off = 128, @@ -302,7 +300,7 @@ static struct cx88_ctrl cx8800_ctls[] = { .minimum = 0, .maximum = 0x3f, .step = 1, - .default_value = 0x3f, + .default_value = 0x1f, .type = V4L2_CTRL_TYPE_INTEGER, }, .reg = AUD_VOL_CTL, @@ -327,51 +325,6 @@ static struct cx88_ctrl cx8800_ctls[] = { }; static const int CX8800_CTLS = ARRAY_SIZE(cx8800_ctls); -const u32 cx88_user_ctrls[] = { - V4L2_CID_USER_CLASS, - V4L2_CID_BRIGHTNESS, - V4L2_CID_CONTRAST, - V4L2_CID_SATURATION, - V4L2_CID_HUE, - V4L2_CID_AUDIO_VOLUME, - V4L2_CID_AUDIO_BALANCE, - V4L2_CID_AUDIO_MUTE, - 0 -}; -EXPORT_SYMBOL(cx88_user_ctrls); - -static const u32 *ctrl_classes[] = { - cx88_user_ctrls, - NULL -}; - -int cx8800_ctrl_query(struct v4l2_queryctrl *qctrl) -{ - int i; - - if (qctrl->id < V4L2_CID_BASE || - qctrl->id >= V4L2_CID_LASTP1) - return -EINVAL; - for (i = 0; i < CX8800_CTLS; i++) - if (cx8800_ctls[i].v.id == qctrl->id) - break; - if (i == CX8800_CTLS) { - *qctrl = no_ctl; - return 0; - } - *qctrl = cx8800_ctls[i].v; - return 0; -} -EXPORT_SYMBOL(cx8800_ctrl_query); - -static int cx88_queryctrl(struct v4l2_queryctrl *qctrl) -{ - qctrl->id = v4l2_ctrl_next(ctrl_classes, qctrl->id); - if (qctrl->id == 0) - return -EINVAL; - return cx8800_ctrl_query(qctrl); -} - /* ------------------------------------------------------------------- */ /* resource management */ @@ -383,17 +336,17 @@ static int res_get(struct cx8800_dev *dev, struct cx8800_fh *fh, unsigned int bi return 1; /* is it free? */ - mutex_lock(&core->lock); + down(&core->lock); if (dev->resources & bit) { /* no, someone else uses it */ - mutex_unlock(&core->lock); + up(&core->lock); return 0; } /* it's free, grab it */ fh->resources |= bit; dev->resources |= bit; dprintk(1,"res: get %d\n",bit); - mutex_unlock(&core->lock); + up(&core->lock); return 1; } @@ -413,13 +366,14 @@ static void res_free(struct cx8800_dev *dev, struct cx8800_fh *fh, unsigned int bits) { struct cx88_core *core = dev->core; - BUG_ON((fh->resources & bits) != bits); + if ((fh->resources & bits) != bits) + BUG(); - mutex_lock(&core->lock); + down(&core->lock); fh->resources &= ~bits; dev->resources &= ~bits; dprintk(1,"res: put %d\n",bits); - mutex_unlock(&core->lock); + up(&core->lock); } /* ------------------------------------------------------------------ */ @@ -539,7 +493,8 @@ static int restart_video_queue(struct cx8800_dev *dev, return 0; buf = list_entry(q->queued.next, struct cx88_buffer, vb.queue); if (NULL == prev) { - list_move_tail(&buf->vb.queue, &q->active); + list_del(&buf->vb.queue); + list_add_tail(&buf->vb.queue,&q->active); start_video_dma(dev, q, buf); buf->vb.state = STATE_ACTIVE; buf->count = q->count++; @@ -550,7 +505,8 @@ static int restart_video_queue(struct cx8800_dev *dev, } else if (prev->vb.width == buf->vb.width && prev->vb.height == buf->vb.height && prev->fmt == buf->fmt) { - list_move_tail(&buf->vb.queue, &q->active); + list_del(&buf->vb.queue); + list_add_tail(&buf->vb.queue,&q->active); buf->vb.state = STATE_ACTIVE; buf->count = q->count++; prev->risc.jmp[1] = cpu_to_le32(buf->risc.dma); @@ -609,7 +565,7 @@ buffer_prepare(struct videobuf_queue *q, struct videobuf_buffer *vb, if (STATE_NEEDS_INIT == buf->vb.state) { init_buffer = 1; - if (0 != (rc = videobuf_iolock(q,&buf->vb,NULL))) + if (0 != (rc = videobuf_iolock(dev->pci,&buf->vb,NULL))) goto fail; } @@ -659,7 +615,7 @@ buffer_prepare(struct videobuf_queue *q, struct videobuf_buffer *vb, return 0; fail: - cx88_free_buffer(q,buf); + cx88_free_buffer(dev->pci,buf); return rc; } @@ -716,8 +672,9 @@ buffer_queue(struct videobuf_queue *vq, struct videobuf_buffer *vb) static void buffer_release(struct videobuf_queue *q, struct videobuf_buffer *vb) { struct cx88_buffer *buf = container_of(vb,struct cx88_buffer,vb); + struct cx8800_fh *fh = q->priv_data; - cx88_free_buffer(q,buf); + cx88_free_buffer(fh->dev->pci,buf); } static struct videobuf_queue_ops cx8800_video_qops = { @@ -952,8 +909,7 @@ static int get_control(struct cx88_core *core, struct v4l2_control *ctl) value = c->sreg ? cx_sread(c->sreg) : cx_read(c->reg); switch (ctl->id) { case V4L2_CID_AUDIO_BALANCE: - ctl->value = ((value & 0x7f) < 0x40) ? ((value & 0x7f) + 0x40) - : (0x7f - (value & 0x7f)); + ctl->value = (value & 0x40) ? (value & 0x3f) : (0x40 - (value & 0x3f)); break; case V4L2_CID_AUDIO_VOLUME: ctl->value = 0x3f - (value & 0x3f); @@ -962,9 +918,9 @@ static int get_control(struct cx88_core *core, struct v4l2_control *ctl) ctl->value = ((value + (c->off << c->shift)) & c->mask) >> c->shift; break; } - dprintk(1,"get_control id=0x%X(%s) ctrl=0x%02x, reg=0x%02x val=0x%02x (mask 0x%02x)%s\n", - ctl->id, c->v.name, ctl->value, c->reg, - value,c->mask, c->sreg ? " [shadowed]" : ""); + printk("get_control id=0x%X reg=0x%02x val=0x%02x (mask 0x%02x)%s\n", + ctl->id, c->reg, ctl->value, + c->mask, c->sreg ? " [shadowed]" : ""); return 0; } @@ -990,7 +946,7 @@ static int set_control(struct cx88_core *core, struct v4l2_control *ctl) mask=c->mask; switch (ctl->id) { case V4L2_CID_AUDIO_BALANCE: - value = (ctl->value < 0x40) ? (0x7f - ctl->value) : (ctl->value - 0x40); + value = (ctl->value < 0x40) ? (0x40 - ctl->value) : ctl->value; break; case V4L2_CID_AUDIO_VOLUME: value = 0x3f - (ctl->value & 0x3f); @@ -1013,9 +969,9 @@ static int set_control(struct cx88_core *core, struct v4l2_control *ctl) value = ((ctl->value - c->off) << c->shift) & c->mask; break; } - dprintk(1,"set_control id=0x%X(%s) ctrl=0x%02x, reg=0x%02x val=0x%02x (mask 0x%02x)%s\n", - ctl->id, c->v.name, ctl->value, c->reg, value, - mask, c->sreg ? " [shadowed]" : ""); + printk("set_control id=0x%X reg=0x%02x val=0x%02x (mask 0x%02x)%s\n", + ctl->id, c->reg, value, + mask, c->sreg ? " [shadowed]" : ""); if (c->sreg) { cx_sandor(c->sreg, c->reg, mask, value); } else { @@ -1031,7 +987,8 @@ static void init_controls(struct cx88_core *core) for (i = 0; i < CX8800_CTLS; i++) { ctrl.id=cx8800_ctls[i].v.id; - ctrl.value=cx8800_ctls[i].v.default_value; + ctrl.value=cx8800_ctls[i].v.default_value + +cx8800_ctls[i].off; set_control(core, &ctrl); } } @@ -1180,6 +1137,7 @@ static int video_do_ioctl(struct inode *inode, struct file *file, V4L2_CAP_READWRITE | V4L2_CAP_STREAMING | V4L2_CAP_VBI_CAPTURE | + V4L2_CAP_VIDEO_OVERLAY | 0; if (UNSET != core->tuner_type) cap->capabilities |= V4L2_CAP_TUNER; @@ -1225,7 +1183,7 @@ static int video_do_ioctl(struct inode *inode, struct file *file, struct v4l2_format *f = arg; return cx8800_try_fmt(dev,fh,f); } -#ifdef CONFIG_VIDEO_V4L1_COMPAT +#ifdef HAVE_V4L1 /* --- streaming capture ------------------------------------- */ case VIDIOCGMBUF: { @@ -1294,17 +1252,9 @@ int cx88_do_ioctl(struct inode *inode, struct file *file, int radio, { int err; - if (video_debug) { - if (video_debug > 1) { - if (_IOC_DIR(cmd) & _IOC_WRITE) - v4l_printk_ioctl_arg("cx88(w)",cmd, arg); - else if (!_IOC_DIR(cmd) & _IOC_READ) { - v4l_print_ioctl("cx88", cmd); - } - } else - v4l_print_ioctl(core->name,cmd); - - } + dprintk( 1, "CORE IOCTL: 0x%x\n", cmd ); + if (video_debug > 1) + v4l_print_ioctl(core->name,cmd); switch (cmd) { /* ---------- tv norms ---------- */ @@ -1341,9 +1291,9 @@ int cx88_do_ioctl(struct inode *inode, struct file *file, int radio, if (i == ARRAY_SIZE(tvnorms)) return -EINVAL; - mutex_lock(&core->lock); + down(&core->lock); cx88_set_tvnorm(core,&tvnorms[i]); - mutex_unlock(&core->lock); + up(&core->lock); return 0; } @@ -1393,10 +1343,10 @@ int cx88_do_ioctl(struct inode *inode, struct file *file, int radio, if (*i >= 4) return -EINVAL; - mutex_lock(&core->lock); + down(&core->lock); cx88_newstation(core); video_mux(core,*i); - mutex_unlock(&core->lock); + up(&core->lock); return 0; } @@ -1406,8 +1356,20 @@ int cx88_do_ioctl(struct inode *inode, struct file *file, int radio, case VIDIOC_QUERYCTRL: { struct v4l2_queryctrl *c = arg; + int i; - return cx88_queryctrl(c); + if (c->id < V4L2_CID_BASE || + c->id >= V4L2_CID_LASTP1) + return -EINVAL; + for (i = 0; i < CX8800_CTLS; i++) + if (cx8800_ctls[i].v.id == c->id) + break; + if (i == CX8800_CTLS) { + *c = no_ctl; + return 0; + } + *c = cx8800_ctls[i].v; + return 0; } case VIDIOC_G_CTRL: return get_control(core,arg); @@ -1476,7 +1438,7 @@ int cx88_do_ioctl(struct inode *inode, struct file *file, int radio, return -EINVAL; if (1 == radio && f->type != V4L2_TUNER_RADIO) return -EINVAL; - mutex_lock(&core->lock); + down(&core->lock); core->freq = f->frequency; cx88_newstation(core); cx88_call_i2c_clients(core,VIDIOC_S_FREQUENCY,f); @@ -1485,7 +1447,7 @@ int cx88_do_ioctl(struct inode *inode, struct file *file, int radio, msleep (10); cx88_set_tvaudio(core); - mutex_unlock(&core->lock); + up(&core->lock); return 0; } @@ -1499,19 +1461,7 @@ int cx88_do_ioctl(struct inode *inode, struct file *file, int radio, static int video_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) { - int retval; - - retval=video_usercopy(inode, file, cmd, arg, video_do_ioctl); - - if (video_debug > 1) { - if (retval < 0) { - v4l_print_ioctl("cx88(err)", cmd); - printk(KERN_DEBUG "cx88(err): errcode=%d\n",retval); - } else if (_IOC_DIR(cmd) & _IOC_READ) - v4l_printk_ioctl_arg("cx88(r)",cmd, (void *)arg); - } - - return retval; + return video_usercopy(inode, file, cmd, arg, video_do_ioctl); } /* ----------------------------------------------------------- */ @@ -1584,7 +1534,7 @@ static int radio_do_ioctl(struct inode *inode, struct file *file, *id = 0; return 0; } -#ifdef CONFIG_VIDEO_V4L1_COMPAT +#ifdef HAVE_V4L1 case VIDIOCSTUNER: { struct video_tuner *v = arg; @@ -1879,9 +1829,9 @@ static int __devinit cx8800_initdev(struct pci_dev *pci_dev, pci_read_config_byte(pci_dev, PCI_CLASS_REVISION, &dev->pci_rev); pci_read_config_byte(pci_dev, PCI_LATENCY_TIMER, &dev->pci_lat); printk(KERN_INFO "%s/0: found at %s, rev: %d, irq: %d, " - "latency: %d, mmio: 0x%llx\n", core->name, + "latency: %d, mmio: 0x%lx\n", core->name, pci_name(pci_dev), dev->pci_rev, pci_dev->irq, - dev->pci_lat,(unsigned long long)pci_resource_start(pci_dev,0)); + dev->pci_lat,pci_resource_start(pci_dev,0)); pci_set_master(pci_dev); if (!pci_dma_supported(pci_dev,0xffffffff)) { @@ -1914,7 +1864,7 @@ static int __devinit cx8800_initdev(struct pci_dev *pci_dev, /* get irq */ err = request_irq(pci_dev->irq, cx8800_irq, - IRQF_SHARED | IRQF_DISABLED, core->name, dev); + SA_SHIRQ | SA_INTERRUPT, core->name, dev); if (err < 0) { printk(KERN_ERR "%s: can't get IRQ %d\n", core->name,pci_dev->irq); @@ -1925,6 +1875,8 @@ static int __devinit cx8800_initdev(struct pci_dev *pci_dev, /* load and configure helper modules */ if (TUNER_ABSENT != core->tuner_type) request_module("tuner"); + if (core->tda9887_conf) + request_module("tda9887"); /* register v4l devices */ dev->video_dev = cx88_vdev_init(core,dev->pci, @@ -1969,11 +1921,11 @@ static int __devinit cx8800_initdev(struct pci_dev *pci_dev, pci_set_drvdata(pci_dev,dev); /* initial device configuration */ - mutex_lock(&core->lock); + down(&core->lock); cx88_set_tvnorm(core,tvnorms); init_controls(core); video_mux(core,0); - mutex_unlock(&core->lock); + up(&core->lock); /* start tvaudio thread */ if (core->tuner_type != TUNER_ABSENT) diff --git a/drivers/media/video/cx88/cx88.h b/drivers/media/video/cx88/cx88.h index e7810955d..e9fd55b57 100644 --- a/drivers/media/video/cx88/cx88.h +++ b/drivers/media/video/cx88/cx88.h @@ -25,19 +25,17 @@ #include #include -#include #include #include +#include #include -#include #include #include "btcx-risc.h" #include "cx88-reg.h" #include -#include -#define CX88_VERSION_CODE KERNEL_VERSION(0,0,6) +#define CX88_VERSION_CODE KERNEL_VERSION(0,0,5) #ifndef TRUE # define TRUE (1==1) @@ -64,7 +62,7 @@ /* need "shadow" registers for some write-only ones ... */ #define SHADOW_AUD_VOL_CTL 1 #define SHADOW_AUD_BAL_CTL 2 -#define SHADOW_MAX 3 +#define SHADOW_MAX 2 /* FM Radio deemphasis type */ enum cx88_deemph_type { @@ -189,14 +187,6 @@ extern struct sram_channel cx88_sram_channels[]; #define CX88_BOARD_DNTV_LIVE_DVB_T_PRO 42 #define CX88_BOARD_KWORLD_DVB_T_CX22702 43 #define CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL 44 -#define CX88_BOARD_KWORLD_HARDWARE_MPEG_TV_XPERT 45 -#define CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_HYBRID 46 -#define CX88_BOARD_PCHDTV_HD5500 47 -#define CX88_BOARD_KWORLD_MCE200_DELUXE 48 -#define CX88_BOARD_PIXELVIEW_PLAYTV_P7000 49 -#define CX88_BOARD_NPGTECH_REALTV_TOP10FM 50 -#define CX88_BOARD_WINFAST_DTV2000H 51 -#define CX88_BOARD_GENIATECH_DVBS 52 enum cx88_itype { CX88_VMUX_COMPOSITE1 = 1, @@ -304,7 +294,6 @@ struct cx88_core { /* config info -- dvb */ struct dvb_pll_desc *pll_desc; unsigned int pll_addr; - int (*prev_set_voltage)(struct dvb_frontend* fe, fe_sec_voltage_t voltage); /* state info */ struct task_struct *kthread; @@ -319,7 +308,8 @@ struct cx88_core { /* IR remote control state */ struct cx88_IR *ir; - struct mutex lock; + struct semaphore lock; + /* various v4l controls */ u32 freq; @@ -400,6 +390,14 @@ struct cx8802_suspend_state { int disabled; }; +/* TODO: move this to struct v4l2_mpeg_compression ? */ +struct blackbird_dnr { + u32 mode; + u32 type; + u32 spatial; + u32 temporal; +}; + struct cx8802_dev { struct cx88_core *core; spinlock_t slock; @@ -433,7 +431,8 @@ struct cx8802_dev { unsigned char ts_gen_cntrl; /* mpeg params */ - struct cx2341x_mpeg_params params; + struct v4l2_mpeg_compression params; + struct blackbird_dnr dnr_params; }; /* ----------------------------------------------------------- */ @@ -484,7 +483,7 @@ extern int cx88_risc_stopper(struct pci_dev *pci, struct btcx_riscmem *risc, u32 reg, u32 mask, u32 value); extern void -cx88_free_buffer(struct videobuf_queue *q, struct cx88_buffer *buf); +cx88_free_buffer(struct pci_dev *pci, struct cx88_buffer *buf); extern void cx88_risc_disasm(struct cx88_core *core, struct btcx_riscmem *risc); @@ -564,6 +563,7 @@ void cx88_newstation(struct cx88_core *core); void cx88_get_stereo(struct cx88_core *core, struct v4l2_tuner *t); void cx88_set_stereo(struct cx88_core *core, u32 mode, int manual); int cx88_audio_thread(void *data); +int cx88_detect_nicam(struct cx88_core *core); /* ----------------------------------------------------------- */ /* cx88-input.c */ @@ -575,8 +575,8 @@ void cx88_ir_irq(struct cx88_core *core); /* ----------------------------------------------------------- */ /* cx88-mpeg.c */ -int cx8802_buf_prepare(struct videobuf_queue *q,struct cx8802_dev *dev, - struct cx88_buffer *buf, enum v4l2_field field); +int cx8802_buf_prepare(struct cx8802_dev *dev, struct cx88_buffer *buf, + enum v4l2_field field); void cx8802_buf_queue(struct cx8802_dev *dev, struct cx88_buffer *buf); void cx8802_cancel_buffers(struct cx8802_dev *dev); @@ -591,8 +591,16 @@ int cx8802_resume_common(struct pci_dev *pci_dev); extern int cx88_do_ioctl(struct inode *inode, struct file *file, int radio, struct cx88_core *core, unsigned int cmd, void *arg, v4l2_kioctl driver_ioctl); -extern const u32 cx88_user_ctrls[]; -extern int cx8800_ctrl_query(struct v4l2_queryctrl *qctrl); + +/* ----------------------------------------------------------- */ +/* cx88-blackbird.c */ +extern int (*cx88_ioctl_hook)(struct inode *inode, struct file *file, + unsigned int cmd, void *arg); +extern unsigned int (*cx88_ioctl_translator)(unsigned int cmd); +void blackbird_set_params(struct cx8802_dev *dev, + struct v4l2_mpeg_compression *params); +void blackbird_set_dnr_params(struct cx8802_dev *dev, + struct blackbird_dnr* dnr_params); /* * Local variables: diff --git a/drivers/media/video/dpc7146.c b/drivers/media/video/dpc7146.c index 0fcc93582..2831bdd12 100644 --- a/drivers/media/video/dpc7146.c +++ b/drivers/media/video/dpc7146.c @@ -1,6 +1,6 @@ /* dpc7146.c - v4l2 driver for the dpc7146 demonstration board - + Copyright (C) 2000-2003 Michael Hunold This program is free software; you can redistribute it and/or modify @@ -52,7 +52,7 @@ #define SAA711X_DECODED_BYTES_OF_TS_2 0x1C #define SAA711X_STATUS_BYTE 0x1F -#define DPC_BOARD_CAN_DO_VBI(dev) (dev->revision != 0) +#define DPC_BOARD_CAN_DO_VBI(dev) (dev->revision != 0) static int debug = 0; module_param(debug, int, 0); @@ -81,16 +81,16 @@ struct dpc struct video_device *video_dev; struct video_device *vbi_dev; - struct i2c_adapter i2c_adapter; + struct i2c_adapter i2c_adapter; struct i2c_client *saa7111a; - + int cur_input; /* current input */ }; /* fixme: add vbi stuff here */ static int dpc_probe(struct saa7146_dev* dev) { - struct dpc* dpc = NULL; + struct dpc* dpc = NULL; struct i2c_client *client; struct list_head *item; @@ -118,20 +118,20 @@ static int dpc_probe(struct saa7146_dev* dev) /* loop through all i2c-devices on the bus and look who is there */ list_for_each(item,&dpc->i2c_adapter.clients) { client = list_entry(item, struct i2c_client, list); - if( I2C_SAA7111A == client->addr ) + if( I2C_SAA7111A == client->addr ) dpc->saa7111a = client; } /* check if all devices are present */ if( 0 == dpc->saa7111a ) { - DEB_D(("dpc_v4l2.o: dpc_attach failed for this device.\n")); + DEB_D(("dpc_v4l2.o: dpc_attach failed for this device.\n")); i2c_del_adapter(&dpc->i2c_adapter); kfree(dpc); return -ENODEV; } - - /* all devices are present, probe was successful */ - DEB_D(("dpc_v4l2.o: dpc_probe succeeded for this device.\n")); + + /* all devices are present, probe was successful */ + DEB_D(("dpc_v4l2.o: dpc_probe succeeded for this device.\n")); /* we store the pointer in our private data field */ dev->ext_priv = dpc; @@ -182,7 +182,7 @@ static struct saa7146_ext_vv vv_data; static int dpc_attach(struct saa7146_dev* dev, struct saa7146_pci_extension_data *info) { struct dpc* dpc = (struct dpc*)dev->ext_priv; - + DEB_D(("dpc_v4l2.o: dpc_attach called.\n")); /* checking for i2c-devices can be omitted here, because we @@ -193,7 +193,7 @@ static int dpc_attach(struct saa7146_dev* dev, struct saa7146_pci_extension_data ERR(("cannot register capture v4l2 device. skipping.\n")); return -1; } - + /* initialization stuff (vbi) (only for revision > 0 and for extensions which want it)*/ if( 0 != DPC_BOARD_CAN_DO_VBI(dev)) { if( 0 != saa7146_register_device(&dpc->vbi_dev, dev, "dpc", VFL_TYPE_VBI)) { @@ -205,18 +205,18 @@ static int dpc_attach(struct saa7146_dev* dev, struct saa7146_pci_extension_data printk("dpc: found 'dpc7146 demonstration board'-%d.\n",dpc_num); dpc_num++; - + /* the rest */ dpc->cur_input = 0; dpc_init_done(dev); - + return 0; } static int dpc_detach(struct saa7146_dev* dev) { struct dpc* dpc = (struct dpc*)dev->ext_priv; - + DEB_EE(("dev:%p\n",dev)); i2c_release_client(dpc->saa7111a); @@ -238,25 +238,25 @@ static int dpc_detach(struct saa7146_dev* dev) int dpc_vbi_bypass(struct saa7146_dev* dev) { struct dpc* dpc = (struct dpc*)dev->ext_priv; - + int i = 1; /* switch bypass in saa7111a */ if ( 0 != dpc->saa7111a->driver->command(dpc->saa7111a,SAA711X_VBI_BYPASS, &i)) { printk("dpc_v4l2.o: VBI_BYPASS: could not address saa7111a.\n"); return -1; - } + } return 0; } #endif -static int dpc_ioctl(struct saa7146_fh *fh, unsigned int cmd, void *arg) +static int dpc_ioctl(struct saa7146_fh *fh, unsigned int cmd, void *arg) { struct saa7146_dev *dev = fh->dev; struct dpc* dpc = (struct dpc*)dev->ext_priv; /* - struct saa7146_vv *vv = dev->vv_data; + struct saa7146_vv *vv = dev->vv_data; */ switch(cmd) { @@ -264,11 +264,11 @@ static int dpc_ioctl(struct saa7146_fh *fh, unsigned int cmd, void *arg) { struct v4l2_input *i = arg; DEB_EE(("VIDIOC_ENUMINPUT %d.\n",i->index)); - + if( i->index < 0 || i->index >= DPC_INPUTS) { return -EINVAL; } - + memcpy(i, &dpc_inputs[i->index], sizeof(struct v4l2_input)); DEB_D(("dpc_v4l2.o: v4l2_ioctl: VIDIOC_ENUMINPUT %d.\n",i->index)); @@ -289,13 +289,13 @@ static int dpc_ioctl(struct saa7146_fh *fh, unsigned int cmd, void *arg) if (input < 0 || input >= DPC_INPUTS) { return -EINVAL; } - + dpc->cur_input = input; /* fixme: switch input here, switch audio, too! */ // saa7146_set_hps_source_and_sync(dev, input_port_selection[input].hps_source, input_port_selection[input].hps_sync); printk("dpc_v4l2.o: VIDIOC_S_INPUT: fixme switch input.\n"); - + return 0; } default: @@ -334,8 +334,8 @@ static struct saa7146_standard standard[] = { static struct saa7146_extension extension; static struct saa7146_pci_extension_data dpc = { - .ext_priv = "Multimedia eXtension Board", - .ext = &extension, + .ext_priv = "Multimedia eXtension Board", + .ext = &extension, }; static struct pci_device_id pci_tbl[] = { @@ -357,7 +357,7 @@ static struct saa7146_ext_vv vv_data = { .capabilities = V4L2_CAP_VBI_CAPTURE, .stds = &standard[0], .num_stds = sizeof(standard)/sizeof(struct saa7146_standard), - .std_callback = &std_callback, + .std_callback = &std_callback, .ioctls = &ioctls[0], .ioctl = dpc_ioctl, }; @@ -365,7 +365,7 @@ static struct saa7146_ext_vv vv_data = { static struct saa7146_extension extension = { .name = "dpc7146 demonstration board", .flags = SAA7146_USE_I2C_IRQ, - + .pci_tbl = &pci_tbl[0], .module = THIS_MODULE, @@ -375,7 +375,7 @@ static struct saa7146_extension extension = { .irq_mask = 0, .irq_func = NULL, -}; +}; static int __init dpc_init_module(void) { @@ -383,7 +383,7 @@ static int __init dpc_init_module(void) DEB_S(("failed to register extension.\n")); return -ENODEV; } - + return 0; } diff --git a/drivers/media/video/em28xx/Kconfig b/drivers/media/video/em28xx/Kconfig index dfb15bfb8..885fd0170 100644 --- a/drivers/media/video/em28xx/Kconfig +++ b/drivers/media/video/em28xx/Kconfig @@ -1,11 +1,10 @@ config VIDEO_EM28XX tristate "Empia EM2800/2820/2840 USB video capture support" - depends on VIDEO_V4L1 && USB && I2C + depends on VIDEO_DEV && USB && I2C select VIDEO_BUF select VIDEO_TUNER select VIDEO_TVEEPROM select VIDEO_IR - select VIDEO_SAA711X ---help--- This is a video4linux driver for Empia 28xx based TV cards. diff --git a/drivers/media/video/em28xx/Makefile b/drivers/media/video/em28xx/Makefile index 826d0e340..da457a05b 100644 --- a/drivers/media/video/em28xx/Makefile +++ b/drivers/media/video/em28xx/Makefile @@ -3,4 +3,4 @@ em28xx-objs := em28xx-video.o em28xx-i2c.o em28xx-cards.o em28xx-core.o \ obj-$(CONFIG_VIDEO_EM28XX) += em28xx.o -EXTRA_CFLAGS += -Idrivers/media/video +EXTRA_CFLAGS += -I$(src)/.. diff --git a/drivers/media/video/em28xx/em28xx-cards.c b/drivers/media/video/em28xx/em28xx-cards.c index ed882ebc7..58f7b4194 100644 --- a/drivers/media/video/em28xx/em28xx-cards.c +++ b/drivers/media/video/em28xx/em28xx-cards.c @@ -3,7 +3,7 @@ Copyright (C) 2005 Ludovico Cavedon Markus Rechberger - Mauro Carvalho Chehab + Mauro Carvalho Chehab Sascha Sommer This program is free software; you can redistribute it and/or modify @@ -28,12 +28,10 @@ #include #include #include -#include -#include -#include -#include #include +#include #include +#include "msp3400.h" #include "em28xx.h" @@ -48,11 +46,11 @@ struct em28xx_board em28xx_boards[] = { .decoder = EM28XX_SAA7113, .input = {{ .type = EM28XX_VMUX_COMPOSITE1, - .vmux = SAA7115_COMPOSITE0, + .vmux = 0, .amux = 1, },{ .type = EM28XX_VMUX_SVIDEO, - .vmux = SAA7115_SVIDEO3, + .vmux = 9, .amux = 1, }}, }, @@ -66,29 +64,11 @@ struct em28xx_board em28xx_boards[] = { .decoder = EM28XX_SAA7113, .input = {{ .type = EM28XX_VMUX_COMPOSITE1, - .vmux = SAA7115_COMPOSITE0, - .amux = 1, - },{ - .type = EM28XX_VMUX_SVIDEO, - .vmux = SAA7115_SVIDEO3, - .amux = 1, - }}, - }, - [EM2820_BOARD_KWORLD_PVRTV2800RF] = { - .name = "Kworld PVR TV 2800 RF", - .is_em2800 = 0, - .vchannels = 2, - .norm = VIDEO_MODE_PAL, - .tda9887_conf = TDA9887_PRESENT, - .has_tuner = 1, - .decoder = EM28XX_SAA7113, - .input = {{ - .type = EM28XX_VMUX_COMPOSITE1, - .vmux = SAA7115_COMPOSITE0, + .vmux = 0, .amux = 1, },{ .type = EM28XX_VMUX_SVIDEO, - .vmux = SAA7115_SVIDEO3, + .vmux = 9, .amux = 1, }}, }, @@ -102,15 +82,15 @@ struct em28xx_board em28xx_boards[] = { .decoder = EM28XX_SAA7113, .input = {{ .type = EM28XX_VMUX_TELEVISION, - .vmux = SAA7115_COMPOSITE2, - .amux = 1, + .vmux = 2, + .amux = 0, },{ .type = EM28XX_VMUX_COMPOSITE1, - .vmux = SAA7115_COMPOSITE0, + .vmux = 0, .amux = 1, },{ .type = EM28XX_VMUX_SVIDEO, - .vmux = SAA7115_SVIDEO3, + .vmux = 9, .amux = 1, }}, }, @@ -124,15 +104,15 @@ struct em28xx_board em28xx_boards[] = { .decoder = EM28XX_SAA7113, .input = {{ .type = EM28XX_VMUX_TELEVISION, - .vmux = SAA7115_COMPOSITE2, + .vmux = 2, .amux = 0, },{ .type = EM28XX_VMUX_COMPOSITE1, - .vmux = SAA7115_COMPOSITE0, + .vmux = 0, .amux = 1, },{ .type = EM28XX_VMUX_SVIDEO, - .vmux = SAA7115_SVIDEO3, + .vmux = 9, .amux = 1, }}, }, @@ -148,13 +128,12 @@ struct em28xx_board em28xx_boards[] = { /*FIXME: S-Video not tested */ .input = {{ .type = EM28XX_VMUX_TELEVISION, - .vmux = TVP5150_COMPOSITE0, - .amux = MSP_INPUT_DEFAULT, + .vmux = 0, + .amux = 6, },{ .type = EM28XX_VMUX_SVIDEO, - .vmux = TVP5150_SVIDEO, - .amux = MSP_INPUT(MSP_IN_SCART1, MSP_IN_TUNER1, - MSP_DSP_IN_SCART, MSP_DSP_IN_SCART), + .vmux = 2, + .amux = 1, }}, }, [EM2820_BOARD_MSI_VOX_USB_2] = { @@ -167,15 +146,15 @@ struct em28xx_board em28xx_boards[] = { .decoder = EM28XX_SAA7114, .input = {{ .type = EM28XX_VMUX_TELEVISION, - .vmux = SAA7115_COMPOSITE4, + .vmux = 4, .amux = 0, },{ .type = EM28XX_VMUX_COMPOSITE1, - .vmux = SAA7115_COMPOSITE0, + .vmux = 0, .amux = 1, },{ .type = EM28XX_VMUX_SVIDEO, - .vmux = SAA7115_SVIDEO3, + .vmux = 9, .amux = 1, }}, }, @@ -190,15 +169,15 @@ struct em28xx_board em28xx_boards[] = { .decoder = EM28XX_SAA7113, .input = {{ .type = EM28XX_VMUX_TELEVISION, - .vmux = SAA7115_COMPOSITE2, + .vmux = 2, .amux = 0, },{ .type = EM28XX_VMUX_COMPOSITE1, - .vmux = SAA7115_COMPOSITE0, + .vmux = 0, .amux = 1, },{ .type = EM28XX_VMUX_SVIDEO, - .vmux = SAA7115_SVIDEO3, + .vmux = 9, .amux = 1, }}, }, @@ -213,15 +192,15 @@ struct em28xx_board em28xx_boards[] = { .decoder = EM28XX_SAA7113, .input = {{ .type = EM28XX_VMUX_TELEVISION, - .vmux = SAA7115_COMPOSITE2, + .vmux = 2, .amux = 0, },{ .type = EM28XX_VMUX_COMPOSITE1, - .vmux = SAA7115_COMPOSITE0, + .vmux = 0, .amux = 1, },{ .type = EM28XX_VMUX_SVIDEO, - .vmux = SAA7115_SVIDEO3, + .vmux = 9, .amux = 1, }}, }, @@ -236,15 +215,15 @@ struct em28xx_board em28xx_boards[] = { .decoder = EM28XX_SAA7113, .input = {{ .type = EM28XX_VMUX_TELEVISION, - .vmux = SAA7115_COMPOSITE2, + .vmux = 2, .amux = 0, },{ .type = EM28XX_VMUX_COMPOSITE1, - .vmux = SAA7115_COMPOSITE0, + .vmux = 0, .amux = 1, },{ .type = EM28XX_VMUX_SVIDEO, - .vmux = SAA7115_SVIDEO3, + .vmux = 9, .amux = 1, }}, }, @@ -256,11 +235,11 @@ struct em28xx_board em28xx_boards[] = { .decoder = EM28XX_SAA7113, .input = {{ .type = EM28XX_VMUX_COMPOSITE1, - .vmux = SAA7115_COMPOSITE0, + .vmux = 0, .amux = 1, },{ .type = EM28XX_VMUX_SVIDEO, - .vmux = SAA7115_SVIDEO3, + .vmux = 9, .amux = 1, }}, }, @@ -278,52 +257,32 @@ struct usb_device_id em28xx_id_table [] = { { }, }; -void em28xx_pre_card_setup(struct em28xx *dev) -{ - /* request some modules */ - switch(dev->model){ - case EM2880_BOARD_TERRATEC_PRODIGY_XS: - case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900: - case EM2880_BOARD_TERRATEC_HYBRID_XS: - { - em28xx_write_regs_req(dev, 0x00, 0x08, "\x7d", 1); // reset through GPIO? - break; - } - } -} - void em28xx_card_setup(struct em28xx *dev) { /* request some modules */ - switch(dev->model){ - case EM2820_BOARD_HAUPPAUGE_WINTV_USB_2: - { - struct tveeprom tv; + if (dev->model == EM2820_BOARD_HAUPPAUGE_WINTV_USB_2) { + struct tveeprom tv; #ifdef CONFIG_MODULES - request_module("tveeprom"); - request_module("ir-kbd-i2c"); - request_module("msp3400"); + request_module("tveeprom"); + request_module("ir-kbd-i2c"); + request_module("msp3400"); #endif - /* Call first TVeeprom */ - - dev->i2c_client.addr = 0xa0 >> 1; - tveeprom_hauppauge_analog(&dev->i2c_client, &tv, dev->eedata); + /* Call first TVeeprom */ - dev->tuner_type= tv.tuner_type; - if (tv.audio_processor == AUDIO_CHIP_MSP34XX) { - dev->i2s_speed=2048000; - dev->has_msp34xx=1; - } else - dev->has_msp34xx=0; - break; - } - case EM2820_BOARD_KWORLD_PVRTV2800RF: - { - em28xx_write_regs_req(dev,0x00,0x08, "\xf9", 1); // GPIO enables sound on KWORLD PVR TV 2800RF - break; - } + dev->i2c_client.addr = 0xa0 >> 1; + tveeprom_hauppauge_analog(&dev->i2c_client, &tv, dev->eedata); + dev->tuner_type= tv.tuner_type; + if (tv.audio_processor == AUDIO_CHIP_MSP34XX) { + dev->i2s_speed=2048000; + dev->has_msp34xx=1; + } else + dev->has_msp34xx=0; } } +EXPORT_SYMBOL(em28xx_boards); +EXPORT_SYMBOL(em28xx_bcount); +EXPORT_SYMBOL(em28xx_id_table); + MODULE_DEVICE_TABLE (usb, em28xx_id_table); diff --git a/drivers/media/video/em28xx/em28xx-core.c b/drivers/media/video/em28xx/em28xx-core.c index 4350cc75b..e5ee8bceb 100644 --- a/drivers/media/video/em28xx/em28xx-core.c +++ b/drivers/media/video/em28xx/em28xx-core.c @@ -3,7 +3,7 @@ Copyright (C) 2005 Ludovico Cavedon Markus Rechberger - Mauro Carvalho Chehab + Mauro Carvalho Chehab Sascha Sommer This program is free software; you can redistribute it and/or modify @@ -317,8 +317,8 @@ int em28xx_outfmt_set_yuv422(struct em28xx *dev) return em28xx_write_regs(dev, VINCTRL_REG, "\x11", 1); } -static int em28xx_accumulator_set(struct em28xx *dev, u8 xmin, u8 xmax, - u8 ymin, u8 ymax) +int em28xx_accumulator_set(struct em28xx *dev, u8 xmin, u8 xmax, u8 ymin, + u8 ymax) { em28xx_coredbg("em28xx Scale: (%d,%d)-(%d,%d)\n", xmin, ymin, xmax, ymax); @@ -328,7 +328,7 @@ static int em28xx_accumulator_set(struct em28xx *dev, u8 xmin, u8 xmax, return em28xx_write_regs(dev, YMAX_REG, &ymax, 1); } -static int em28xx_capture_area_set(struct em28xx *dev, u8 hstart, u8 vstart, +int em28xx_capture_area_set(struct em28xx *dev, u8 hstart, u8 vstart, u16 width, u16 height) { u8 cwidth = width; @@ -345,7 +345,7 @@ static int em28xx_capture_area_set(struct em28xx *dev, u8 hstart, u8 vstart, return em28xx_write_regs(dev, OFLOW_REG, &overflow, 1); } -static int em28xx_scaler_set(struct em28xx *dev, u16 h, u16 v) +int em28xx_scaler_set(struct em28xx *dev, u16 h, u16 v) { u8 mode; /* the em2800 scaler only supports scaling down to 50% */ @@ -534,7 +534,7 @@ static inline void em28xx_isoc_video_copy(struct em28xx *dev, * em28xx_isoIrq() * handles the incoming isoc urbs and fills the frames from our inqueue */ -static void em28xx_isocIrq(struct urb *urb, struct pt_regs *regs) +void em28xx_isocIrq(struct urb *urb, struct pt_regs *regs) { struct em28xx *dev = urb->context; int i, status; diff --git a/drivers/media/video/em28xx/em28xx-i2c.c b/drivers/media/video/em28xx/em28xx-i2c.c index d829d8f8c..6ca8631bc 100644 --- a/drivers/media/video/em28xx/em28xx-i2c.c +++ b/drivers/media/video/em28xx/em28xx-i2c.c @@ -3,7 +3,7 @@ Copyright (C) 2005 Ludovico Cavedon Markus Rechberger - Mauro Carvalho Chehab + Mauro Carvalho Chehab Sascha Sommer This program is free software; you can redistribute it and/or modify @@ -399,6 +399,17 @@ static u32 functionality(struct i2c_adapter *adap) return I2C_FUNC_SMBUS_EMUL; } +#ifndef I2C_PEC +static void inc_use(struct i2c_adapter *adap) +{ + MOD_INC_USE_COUNT; +} + +static void dec_use(struct i2c_adapter *adap) +{ + MOD_DEC_USE_COUNT; +} +#endif static int em28xx_set_tuner(int check_eeprom, struct i2c_client *client) { @@ -409,6 +420,7 @@ static int em28xx_set_tuner(int check_eeprom, struct i2c_client *client) tun_setup.mode_mask = T_ANALOG_TV | T_RADIO; tun_setup.type = dev->tuner_type; tun_setup.addr = dev->tuner_addr; + em28xx_i2c_call_clients(dev, TUNER_SET_TYPE_ADDR, &tun_setup); } @@ -425,19 +437,9 @@ static int attach_inform(struct i2c_client *client) struct em28xx *dev = client->adapter->algo_data; switch (client->addr << 1) { - case 0x43: - case 0x4b: - { - struct tuner_setup tun_setup; - - tun_setup.mode_mask = T_ANALOG_TV | T_RADIO; - tun_setup.type = TUNER_TDA9887; - tun_setup.addr = client->addr; - - em28xx_i2c_call_clients(dev, TUNER_SET_TYPE_ADDR, &tun_setup); + case 0x86: em28xx_i2c_call_clients(dev, TDA9887_SET_CONFIG, &dev->tda9887_conf); break; - } case 0x42: dprintk1(1,"attach_inform: saa7114 detected.\n"); break; @@ -463,7 +465,6 @@ static int attach_inform(struct i2c_client *client) case 0xba: dprintk1(1,"attach_inform: tvp5150 detected.\n"); break; - default: dprintk1(1,"attach inform: detected I2C address %x\n", client->addr << 1); dev->tuner_addr = client->addr; @@ -480,7 +481,12 @@ static struct i2c_algorithm em28xx_algo = { }; static struct i2c_adapter em28xx_adap_template = { +#ifdef I2C_PEC .owner = THIS_MODULE, +#else + .inc_use = inc_use, + .dec_use = dec_use, +#endif .class = I2C_CLASS_TV_ANALOG, .name = "em28xx", .id = I2C_HW_B_EM28XX, diff --git a/drivers/media/video/em28xx/em28xx-input.c b/drivers/media/video/em28xx/em28xx-input.c index 3ffb5684f..30dfa5370 100644 --- a/drivers/media/video/em28xx/em28xx-input.c +++ b/drivers/media/video/em28xx/em28xx-input.c @@ -3,7 +3,7 @@ Copyright (C) 2005 Ludovico Cavedon Markus Rechberger - Mauro Carvalho Chehab + Mauro Carvalho Chehab Sascha Sommer This program is free software; you can redistribute it and/or modify @@ -43,6 +43,91 @@ MODULE_PARM_DESC(ir_debug,"enable debug messages [IR]"); #define dprintk(fmt, arg...) if (ir_debug) \ printk(KERN_DEBUG "%s/ir: " fmt, ir->c.name , ## arg) +/* ---------------------------------------------------------------------- */ + +static IR_KEYTAB_TYPE ir_codes_em_terratec[IR_KEYTAB_SIZE] = { + [ 0x01 ] = KEY_CHANNEL, + [ 0x02 ] = KEY_SELECT, + [ 0x03 ] = KEY_MUTE, + [ 0x04 ] = KEY_POWER, + [ 0x05 ] = KEY_KP1, + [ 0x06 ] = KEY_KP2, + [ 0x07 ] = KEY_KP3, + [ 0x08 ] = KEY_CHANNELUP, + [ 0x09 ] = KEY_KP4, + [ 0x0a ] = KEY_KP5, + [ 0x0b ] = KEY_KP6, + [ 0x0c ] = KEY_CHANNELDOWN, + [ 0x0d ] = KEY_KP7, + [ 0x0e ] = KEY_KP8, + [ 0x0f ] = KEY_KP9, + [ 0x10 ] = KEY_VOLUMEUP, + [ 0x11 ] = KEY_KP0, + [ 0x12 ] = KEY_MENU, + [ 0x13 ] = KEY_PRINT, + [ 0x14 ] = KEY_VOLUMEDOWN, + [ 0x16 ] = KEY_PAUSE, + [ 0x18 ] = KEY_RECORD, + [ 0x19 ] = KEY_REWIND, + [ 0x1a ] = KEY_PLAY, + [ 0x1b ] = KEY_FORWARD, + [ 0x1c ] = KEY_BACKSPACE, + [ 0x1e ] = KEY_STOP, + [ 0x40 ] = KEY_ZOOM, +}; + +static IR_KEYTAB_TYPE ir_codes_em_pinnacle_usb[IR_KEYTAB_SIZE] = { + [ 0x3a ] = KEY_KP0, + [ 0x31 ] = KEY_KP1, + [ 0x32 ] = KEY_KP2, + [ 0x33 ] = KEY_KP3, + [ 0x34 ] = KEY_KP4, + [ 0x35 ] = KEY_KP5, + [ 0x36 ] = KEY_KP6, + [ 0x37 ] = KEY_KP7, + [ 0x38 ] = KEY_KP8, + [ 0x39 ] = KEY_KP9, + + [ 0x2f ] = KEY_POWER, + + [ 0x2e ] = KEY_P, + [ 0x1f ] = KEY_L, + [ 0x2b ] = KEY_I, + + [ 0x2d ] = KEY_ZOOM, + [ 0x1e ] = KEY_ZOOM, + [ 0x1b ] = KEY_VOLUMEUP, + [ 0x0f ] = KEY_VOLUMEDOWN, + [ 0x17 ] = KEY_CHANNELUP, + [ 0x1c ] = KEY_CHANNELDOWN, + [ 0x25 ] = KEY_INFO, + + [ 0x3c ] = KEY_MUTE, + + [ 0x3d ] = KEY_LEFT, + [ 0x3b ] = KEY_RIGHT, + + [ 0x3f ] = KEY_UP, + [ 0x3e ] = KEY_DOWN, + [ 0x1a ] = KEY_PAUSE, + + [ 0x1d ] = KEY_MENU, + [ 0x19 ] = KEY_PLAY, + [ 0x16 ] = KEY_REWIND, + [ 0x13 ] = KEY_FORWARD, + [ 0x15 ] = KEY_PAUSE, + [ 0x0e ] = KEY_REWIND, + [ 0x0d ] = KEY_PLAY, + [ 0x0b ] = KEY_STOP, + [ 0x07 ] = KEY_FORWARD, + [ 0x27 ] = KEY_RECORD, + [ 0x26 ] = KEY_TUNER, + [ 0x29 ] = KEY_TEXT, + [ 0x2a ] = KEY_MEDIA, + [ 0x18 ] = KEY_EPG, + [ 0x27 ] = KEY_RECORD, +}; + /* ----------------------------------------------------------------------- */ static int get_key_terratec(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw) @@ -105,7 +190,7 @@ static int get_key_em_haup(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw) return 1; } -static int get_key_pinnacle_usb_grey(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw) +static int get_key_pinnacle_usb(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw) { unsigned char buf[3]; @@ -148,8 +233,8 @@ void em28xx_set_ir(struct em28xx * dev,struct IR_i2c *ir) snprintf(ir->c.name, sizeof(ir->c.name), "i2c IR (EM28XX Terratec)"); break; case (EM2820_BOARD_PINNACLE_USB_2): - ir->ir_codes = ir_codes_pinnacle_grey; - ir->get_key = get_key_pinnacle_usb_grey; + ir->ir_codes = ir_codes_em_pinnacle_usb; + ir->get_key = get_key_pinnacle_usb; snprintf(ir->c.name, sizeof(ir->c.name), "i2c IR (EM28XX Pinnacle PCTV)"); break; case (EM2820_BOARD_HAUPPAUGE_WINTV_USB_2): diff --git a/drivers/media/video/em28xx/em28xx-video.c b/drivers/media/video/em28xx/em28xx-video.c index 2a461dde4..5b267808a 100644 --- a/drivers/media/video/em28xx/em28xx-video.c +++ b/drivers/media/video/em28xx/em28xx-video.c @@ -3,7 +3,7 @@ Copyright (C) 2005 Ludovico Cavedon Markus Rechberger - Mauro Carvalho Chehab + Mauro Carvalho Chehab Sascha Sommer Some parts based on SN9C10x PC Camera Controllers GPL driver made @@ -28,7 +28,6 @@ #include #include #include -#include #include #include #include @@ -38,11 +37,10 @@ #include "em28xx.h" #include #include -#include #define DRIVER_AUTHOR "Ludovico Cavedon , " \ "Markus Rechberger , " \ - "Mauro Carvalho Chehab , " \ + "Mauro Carvalho Chehab , " \ "Sascha Sommer " #define DRIVER_NAME "em28xx" @@ -61,14 +59,8 @@ MODULE_LICENSE("GPL"); static LIST_HEAD(em28xx_devlist); static unsigned int card[] = {[0 ... (EM28XX_MAXBOARDS - 1)] = UNSET }; -static unsigned int video_nr[] = {[0 ... (EM28XX_MAXBOARDS - 1)] = UNSET }; -static unsigned int vbi_nr[] = {[0 ... (EM28XX_MAXBOARDS - 1)] = UNSET }; module_param_array(card, int, NULL, 0444); -module_param_array(video_nr, int, NULL, 0444); -module_param_array(vbi_nr, int, NULL, 0444); MODULE_PARM_DESC(card,"card type"); -MODULE_PARM_DESC(video_nr,"video device numbers"); -MODULE_PARM_DESC(vbi_nr,"vbi device numbers"); static int tuner = -1; module_param(tuner, int, 0444); @@ -78,9 +70,6 @@ static unsigned int video_debug = 0; module_param(video_debug,int,0644); MODULE_PARM_DESC(video_debug,"enable debug messages [video]"); -/* Bitmask marking allocated devices from 0 to EM28XX_MAXBOARDS */ -static unsigned long em28xx_devused; - /* supported tv norms */ static struct em28xx_tvnorm tvnorms[] = { { @@ -102,6 +91,23 @@ static struct em28xx_tvnorm tvnorms[] = { } }; +static const unsigned char saa7114_i2c_init[] = { + 0x00,0x00,0x01,0x08,0x02,0xc4,0x03,0x30,0x04,0x90,0x05,0x90,0x06,0xeb,0x07,0xe0, + 0x08,0x88,0x09,0x40,0x0a,0x80,0x0b,0x44,0x0c,0x40,0x0d,0x00,0x0e,0x81,0x0f,0x2a, + 0x10,0x06,0x11,0x00,0x12,0xc8,0x13,0x80,0x14,0x00,0x15,0x11,0x16,0x01,0x17,0x42, + 0x18,0x40,0x19,0x80,0x40,0x00,0x41,0xff,0x42,0xff,0x43,0xff,0x44,0xff,0x45,0xff, + 0x46,0xff,0x47,0xff,0x48,0xff,0x49,0xff,0x4a,0xff,0x4b,0xff,0x4c,0xff,0x4d,0xff, + 0x4e,0xff,0x4f,0xff,0x50,0xff,0x51,0xff,0x52,0xff,0x53,0xff,0x54,0x5f,0x55,0xff, + 0x56,0xff,0x57,0xff,0x58,0x00,0x59,0x47,0x5a,0x03,0x5b,0x03,0x5d,0x3e,0x5e,0x00, + 0x80,0x1c,0x83,0x01,0x84,0xa5,0x85,0x10,0x86,0x45,0x87,0x41,0x88,0xf0,0x88,0x00, + 0x88,0xf0,0x90,0x00,0x91,0x08,0x92,0x00,0x93,0x80,0x94,0x08,0x95,0x00,0x96,0xc0, + 0x97,0x02,0x98,0x13,0x99,0x00,0x9a,0x38,0x9b,0x01,0x9c,0x80,0x9d,0x02,0x9e,0x06, + 0x9f,0x01,0xa0,0x01,0xa1,0x00,0xa2,0x00,0xa4,0x80,0xa5,0x36,0xa6,0x36,0xa8,0x67, + 0xa9,0x04,0xaa,0x00,0xac,0x33,0xad,0x02,0xae,0x00,0xb0,0xcd,0xb1,0x04,0xb2,0xcd, + 0xb3,0x04,0xb4,0x01,0xb8,0x00,0xb9,0x00,0xba,0x00,0xbb,0x00,0xbc,0x00,0xbd,0x00, + 0xbe,0x00,0xbf,0x00 +}; + #define TVNORMS ARRAY_SIZE(tvnorms) /* supported controls */ @@ -128,6 +134,65 @@ static struct v4l2_queryctrl em28xx_qctrl[] = { } }; +/* FIXME: These are specific to saa711x - should be moved to its code */ +static struct v4l2_queryctrl saa711x_qctrl[] = { + { + .id = V4L2_CID_BRIGHTNESS, + .type = V4L2_CTRL_TYPE_INTEGER, + .name = "Brightness", + .minimum = -128, + .maximum = 127, + .step = 1, + .default_value = 0, + .flags = 0, + },{ + .id = V4L2_CID_CONTRAST, + .type = V4L2_CTRL_TYPE_INTEGER, + .name = "Contrast", + .minimum = 0x0, + .maximum = 0x1f, + .step = 0x1, + .default_value = 0x10, + .flags = 0, + },{ + .id = V4L2_CID_SATURATION, + .type = V4L2_CTRL_TYPE_INTEGER, + .name = "Saturation", + .minimum = 0x0, + .maximum = 0x1f, + .step = 0x1, + .default_value = 0x10, + .flags = 0, + },{ + .id = V4L2_CID_RED_BALANCE, + .type = V4L2_CTRL_TYPE_INTEGER, + .name = "Red chroma balance", + .minimum = -128, + .maximum = 127, + .step = 1, + .default_value = 0, + .flags = 0, + },{ + .id = V4L2_CID_BLUE_BALANCE, + .type = V4L2_CTRL_TYPE_INTEGER, + .name = "Blue chroma balance", + .minimum = -128, + .maximum = 127, + .step = 1, + .default_value = 0, + .flags = 0, + },{ + .id = V4L2_CID_GAMMA, + .type = V4L2_CTRL_TYPE_INTEGER, + .name = "Gamma", + .minimum = 0x0, + .maximum = 0x3f, + .step = 0x1, + .default_value = 0x20, + .flags = 0, + } +}; + static struct usb_driver em28xx_usb_driver; static DEFINE_MUTEX(em28xx_sysfs_lock); @@ -146,11 +211,6 @@ static int em28xx_config(struct em28xx *dev) em28xx_write_regs_req(dev, 0x00, 0x06, "\x40", 1); /* enable vbi capturing */ - -/* em28xx_write_regs_req(dev,0x00,0x0e,"\xC0",1); audio register */ -/* em28xx_write_regs_req(dev,0x00,0x0f,"\x80",1); clk register */ - em28xx_write_regs_req(dev,0x00,0x11,"\x51",1); - em28xx_audio_usb_mute(dev, 1); dev->mute = 1; /* maybe not the right place... */ dev->volume = 0x1f; @@ -170,13 +230,22 @@ static int em28xx_config(struct em28xx *dev) static void em28xx_config_i2c(struct em28xx *dev) { struct v4l2_frequency f; - struct v4l2_routing route; + struct video_decoder_init em28xx_vdi = {.data = NULL }; - route.input = INPUT(dev->ctl_input)->vmux; - route.output = 0; - em28xx_i2c_call_clients(dev, VIDIOC_INT_RESET, NULL); - em28xx_i2c_call_clients(dev, VIDIOC_INT_S_VIDEO_ROUTING, &route); - em28xx_i2c_call_clients(dev, VIDIOC_STREAMON, NULL); + + /* configure decoder */ + if(dev->model == EM2820_BOARD_MSI_VOX_USB_2){ + em28xx_vdi.data=saa7114_i2c_init; + em28xx_vdi.len=sizeof(saa7114_i2c_init); + } + + + em28xx_i2c_call_clients(dev, DECODER_INIT, &em28xx_vdi); + em28xx_i2c_call_clients(dev, DECODER_SET_INPUT, &dev->ctl_input); +/* em28xx_i2c_call_clients(dev,DECODER_SET_PICTURE, &dev->vpic); */ +/* em28xx_i2c_call_clients(dev,DECODER_SET_NORM,&dev->tvnorm->id); */ +/* em28xx_i2c_call_clients(dev,DECODER_ENABLE_OUTPUT,&output); */ +/* em28xx_i2c_call_clients(dev,DECODER_DUMP, NULL); */ /* configure tuner */ f.tuner = 0; @@ -210,34 +279,30 @@ static void em28xx_empty_framequeues(struct em28xx *dev) static void video_mux(struct em28xx *dev, int index) { - int ainput; - struct v4l2_routing route; + int input, ainput; - route.input = INPUT(index)->vmux; - route.output = 0; + input = INPUT(index)->vmux; dev->ctl_input = index; dev->ctl_ainput = INPUT(index)->amux; - em28xx_i2c_call_clients(dev, VIDIOC_INT_S_VIDEO_ROUTING, &route); + em28xx_i2c_call_clients(dev, DECODER_SET_INPUT, &input); + - em28xx_videodbg("Setting input index=%d, vmux=%d, amux=%d\n",index,route.input,dev->ctl_ainput); + em28xx_videodbg("Setting input index=%d, vmux=%d, amux=%d\n",index,input,dev->ctl_ainput); if (dev->has_msp34xx) { if (dev->i2s_speed) em28xx_i2c_call_clients(dev, VIDIOC_INT_I2S_CLOCK_FREQ, &dev->i2s_speed); - route.input = dev->ctl_ainput; - route.output = MSP_OUTPUT(MSP_SC_IN_DSP_SCART1); - /* Note: this is msp3400 specific */ - em28xx_i2c_call_clients(dev, VIDIOC_INT_S_AUDIO_ROUTING, &route); + em28xx_i2c_call_clients(dev, VIDIOC_S_AUDIO, &dev->ctl_ainput); ainput = EM28XX_AUDIO_SRC_TUNER; em28xx_audio_source(dev, ainput); } else { switch (dev->ctl_ainput) { - case 0: - ainput = EM28XX_AUDIO_SRC_TUNER; - break; - default: - ainput = EM28XX_AUDIO_SRC_LINE; + case 0: + ainput = EM28XX_AUDIO_SRC_TUNER; + break; + default: + ainput = EM28XX_AUDIO_SRC_LINE; } em28xx_audio_source(dev, ainput); } @@ -258,20 +323,13 @@ static int em28xx_v4l2_open(struct inode *inode, struct file *filp) h = list_entry(list, struct em28xx, devlist); if (h->vdev->minor == minor) { dev = h; - dev->type = V4L2_BUF_TYPE_VIDEO_CAPTURE; - } - if (h->vbi_dev->minor == minor) { - dev = h; - dev->type = V4L2_BUF_TYPE_VBI_CAPTURE; } } - if (NULL == dev) - return -ENODEV; filp->private_data=dev; - em28xx_videodbg("open minor=%d type=%s users=%d\n", - minor,v4l2_type_names[dev->type],dev->users); + + em28xx_videodbg("users=%d\n", dev->users); if (!down_read_trylock(&em28xx_disconnect)) return -ERESTARTSYS; @@ -282,36 +340,40 @@ static int em28xx_v4l2_open(struct inode *inode, struct file *filp) return -EBUSY; } - mutex_init(&dev->fileop_lock); /* to 1 == available */ +/* if(dev->vbi_dev->minor == minor){ + dev->type=V4L2_BUF_TYPE_VBI_CAPTURE; + }*/ + if (dev->vdev->minor == minor) { + dev->type = V4L2_BUF_TYPE_VIDEO_CAPTURE; + } + + init_MUTEX(&dev->fileop_lock); /* to 1 == available */ spin_lock_init(&dev->queue_lock); init_waitqueue_head(&dev->wait_frame); init_waitqueue_head(&dev->wait_stream); - mutex_lock(&dev->lock); - - if (dev->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) { - em28xx_set_alternate(dev); + down(&dev->lock); - dev->width = norm_maxw(dev); - dev->height = norm_maxh(dev); - dev->frame_size = dev->width * dev->height * 2; - dev->field_size = dev->frame_size >> 1; /*both_fileds ? dev->frame_size>>1 : dev->frame_size; */ - dev->bytesperline = dev->width * 2; - dev->hscale = 0; - dev->vscale = 0; + em28xx_set_alternate(dev); - em28xx_capture_start(dev, 1); - em28xx_resolution_set(dev); + dev->width = norm_maxw(dev); + dev->height = norm_maxh(dev); + dev->frame_size = dev->width * dev->height * 2; + dev->field_size = dev->frame_size >> 1; /*both_fileds ? dev->frame_size>>1 : dev->frame_size; */ + dev->bytesperline = dev->width * 2; + dev->hscale = 0; + dev->vscale = 0; - /* device needs to be initialized before isoc transfer */ - video_mux(dev, 0); + em28xx_capture_start(dev, 1); + em28xx_resolution_set(dev); - /* start the transfer */ - errCode = em28xx_init_isoc(dev); - if (errCode) - goto err; + /* device needs to be initialized before isoc transfer */ + video_mux(dev, 0); - } + /* start the transfer */ + errCode = em28xx_init_isoc(dev); + if (errCode) + goto err; dev->users++; filp->private_data = dev; @@ -324,8 +386,10 @@ static int em28xx_v4l2_open(struct inode *inode, struct file *filp) dev->state |= DEV_INITIALIZED; -err: - mutex_unlock(&dev->lock); + video_mux(dev, 0); + + err: + up(&dev->lock); up_read(&em28xx_disconnect); return errCode; } @@ -339,21 +403,14 @@ static void em28xx_release_resources(struct em28xx *dev) { mutex_lock(&em28xx_sysfs_lock); - /*FIXME: I2C IR should be disconnected */ - - em28xx_info("V4L2 devices /dev/video%d and /dev/vbi%d deregistered\n", - dev->vdev->minor-MINOR_VFL_TYPE_GRABBER_MIN, - dev->vbi_dev->minor-MINOR_VFL_TYPE_VBI_MIN); + em28xx_info("V4L2 device /dev/video%d deregistered\n", + dev->vdev->minor); list_del(&dev->devlist); video_unregister_device(dev->vdev); - video_unregister_device(dev->vbi_dev); +/* video_unregister_device(dev->vbi_dev); */ em28xx_i2c_unregister(dev); usb_put_dev(dev->udev); mutex_unlock(&em28xx_sysfs_lock); - - - /* Mark device as unused */ - em28xx_devused&=~(1<devno); } /* @@ -367,7 +424,7 @@ static int em28xx_v4l2_close(struct inode *inode, struct file *filp) em28xx_videodbg("users=%d\n", dev->users); - mutex_lock(&dev->lock); + down(&dev->lock); em28xx_uninit_isoc(dev); @@ -376,7 +433,7 @@ static int em28xx_v4l2_close(struct inode *inode, struct file *filp) /* the device is already disconnect, free the remaining resources */ if (dev->state & DEV_DISCONNECTED) { em28xx_release_resources(dev); - mutex_unlock(&dev->lock); + up(&dev->lock); kfree(dev); return 0; } @@ -392,7 +449,7 @@ static int em28xx_v4l2_close(struct inode *inode, struct file *filp) dev->users--; wake_up_interruptible_nr(&dev->open, 1); - mutex_unlock(&dev->lock); + up(&dev->lock); return 0; } @@ -409,54 +466,32 @@ em28xx_v4l2_read(struct file *filp, char __user * buf, size_t count, int ret = 0; struct em28xx *dev = filp->private_data; - if (dev->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) { - em28xx_videodbg("V4l2_Buf_type_videocapture is set\n"); - } - if (dev->type == V4L2_BUF_TYPE_VBI_CAPTURE) { - em28xx_videodbg("V4L2_BUF_TYPE_VBI_CAPTURE is set\n"); - em28xx_videodbg("not supported yet! ...\n"); - if (copy_to_user(buf, "", 1)) { - mutex_unlock(&dev->fileop_lock); - return -EFAULT; - } - return (1); - } - if (dev->type == V4L2_BUF_TYPE_SLICED_VBI_CAPTURE) { - em28xx_videodbg("V4L2_BUF_TYPE_SLICED_VBI_CAPTURE is set\n"); - em28xx_videodbg("not supported yet! ...\n"); - if (copy_to_user(buf, "", 1)) { - mutex_unlock(&dev->fileop_lock); - return -EFAULT; - } - return (1); - } - - if (mutex_lock_interruptible(&dev->fileop_lock)) + if (down_interruptible(&dev->fileop_lock)) return -ERESTARTSYS; if (dev->state & DEV_DISCONNECTED) { em28xx_videodbg("device not present\n"); - mutex_unlock(&dev->fileop_lock); + up(&dev->fileop_lock); return -ENODEV; } if (dev->state & DEV_MISCONFIGURED) { em28xx_videodbg("device misconfigured; close and open it again\n"); - mutex_unlock(&dev->fileop_lock); + up(&dev->fileop_lock); return -EIO; } if (dev->io == IO_MMAP) { em28xx_videodbg ("IO method is set to mmap; close and open" " the device again to choose the read method\n"); - mutex_unlock(&dev->fileop_lock); + up(&dev->fileop_lock); return -EINVAL; } if (dev->io == IO_NONE) { if (!em28xx_request_buffers(dev, EM28XX_NUM_READ_FRAMES)) { em28xx_errdev("read failed, not enough memory\n"); - mutex_unlock(&dev->fileop_lock); + up(&dev->fileop_lock); return -ENOMEM; } dev->io = IO_READ; @@ -465,13 +500,13 @@ em28xx_v4l2_read(struct file *filp, char __user * buf, size_t count, } if (!count) { - mutex_unlock(&dev->fileop_lock); + up(&dev->fileop_lock); return 0; } if (list_empty(&dev->outqueue)) { if (filp->f_flags & O_NONBLOCK) { - mutex_unlock(&dev->fileop_lock); + up(&dev->fileop_lock); return -EAGAIN; } ret = wait_event_interruptible @@ -479,11 +514,11 @@ em28xx_v4l2_read(struct file *filp, char __user * buf, size_t count, (!list_empty(&dev->outqueue)) || (dev->state & DEV_DISCONNECTED)); if (ret) { - mutex_unlock(&dev->fileop_lock); + up(&dev->fileop_lock); return ret; } if (dev->state & DEV_DISCONNECTED) { - mutex_unlock(&dev->fileop_lock); + up(&dev->fileop_lock); return -ENODEV; } } @@ -502,12 +537,12 @@ em28xx_v4l2_read(struct file *filp, char __user * buf, size_t count, count = f->buf.length; if (copy_to_user(buf, f->bufmem, count)) { - mutex_unlock(&dev->fileop_lock); + up(&dev->fileop_lock); return -EFAULT; } *f_pos += count; - mutex_unlock(&dev->fileop_lock); + up(&dev->fileop_lock); return count; } @@ -521,7 +556,7 @@ static unsigned int em28xx_v4l2_poll(struct file *filp, poll_table * wait) unsigned int mask = 0; struct em28xx *dev = filp->private_data; - if (mutex_lock_interruptible(&dev->fileop_lock)) + if (down_interruptible(&dev->fileop_lock)) return POLLERR; if (dev->state & DEV_DISCONNECTED) { @@ -547,13 +582,13 @@ static unsigned int em28xx_v4l2_poll(struct file *filp, poll_table * wait) if (!list_empty(&dev->outqueue)) mask |= POLLIN | POLLRDNORM; - mutex_unlock(&dev->fileop_lock); + up(&dev->fileop_lock); return mask; } } - mutex_unlock(&dev->fileop_lock); + up(&dev->fileop_lock); return POLLERR; } @@ -593,25 +628,25 @@ static int em28xx_v4l2_mmap(struct file *filp, struct vm_area_struct *vma) struct em28xx *dev = filp->private_data; - if (mutex_lock_interruptible(&dev->fileop_lock)) + if (down_interruptible(&dev->fileop_lock)) return -ERESTARTSYS; if (dev->state & DEV_DISCONNECTED) { em28xx_videodbg("mmap: device not present\n"); - mutex_unlock(&dev->fileop_lock); + up(&dev->fileop_lock); return -ENODEV; } if (dev->state & DEV_MISCONFIGURED) { em28xx_videodbg ("mmap: Device is misconfigured; close and " "open it again\n"); - mutex_unlock(&dev->fileop_lock); + up(&dev->fileop_lock); return -EIO; } if (dev->io != IO_MMAP || !(vma->vm_flags & VM_WRITE) || size != PAGE_ALIGN(dev->frame[0].buf.length)) { - mutex_unlock(&dev->fileop_lock); + up(&dev->fileop_lock); return -EINVAL; } @@ -621,7 +656,7 @@ static int em28xx_v4l2_mmap(struct file *filp, struct vm_area_struct *vma) } if (i == dev->num_frames) { em28xx_videodbg("mmap: user supplied mapping address is out of range\n"); - mutex_unlock(&dev->fileop_lock); + up(&dev->fileop_lock); return -EINVAL; } @@ -633,7 +668,7 @@ static int em28xx_v4l2_mmap(struct file *filp, struct vm_area_struct *vma) while (size > 0) { /* size is page-aligned */ if (vm_insert_page(vma, start, vmalloc_to_page(pos))) { em28xx_videodbg("mmap: vm_insert_page failed\n"); - mutex_unlock(&dev->fileop_lock); + up(&dev->fileop_lock); return -EAGAIN; } start += PAGE_SIZE; @@ -645,7 +680,7 @@ static int em28xx_v4l2_mmap(struct file *filp, struct vm_area_struct *vma) vma->vm_private_data = &dev->frame[i]; em28xx_vm_open(vma); - mutex_unlock(&dev->fileop_lock); + up(&dev->fileop_lock); return 0; } @@ -667,6 +702,43 @@ static int em28xx_get_ctrl(struct em28xx *dev, struct v4l2_control *ctrl) } } +/*FIXME: should be moved to saa711x */ +static int saa711x_get_ctrl(struct em28xx *dev, struct v4l2_control *ctrl) +{ + s32 tmp; + switch (ctrl->id) { + case V4L2_CID_BRIGHTNESS: + if ((tmp = em28xx_brightness_get(dev)) < 0) + return -EIO; + ctrl->value = (s32) ((s8) tmp); /* FIXME: clenaer way to extend sign? */ + return 0; + case V4L2_CID_CONTRAST: + if ((ctrl->value = em28xx_contrast_get(dev)) < 0) + return -EIO; + return 0; + case V4L2_CID_SATURATION: + if ((ctrl->value = em28xx_saturation_get(dev)) < 0) + return -EIO; + return 0; + case V4L2_CID_RED_BALANCE: + if ((tmp = em28xx_v_balance_get(dev)) < 0) + return -EIO; + ctrl->value = (s32) ((s8) tmp); /* FIXME: clenaer way to extend sign? */ + return 0; + case V4L2_CID_BLUE_BALANCE: + if ((tmp = em28xx_u_balance_get(dev)) < 0) + return -EIO; + ctrl->value = (s32) ((s8) tmp); /* FIXME: clenaer way to extend sign? */ + return 0; + case V4L2_CID_GAMMA: + if ((ctrl->value = em28xx_gamma_get(dev)) < 0) + return -EIO; + return 0; + default: + return -EINVAL; + } +} + /* * em28xx_set_ctrl() * mute or set new saturation, brightness or contrast @@ -689,6 +761,27 @@ static int em28xx_set_ctrl(struct em28xx *dev, const struct v4l2_control *ctrl) } } +/*FIXME: should be moved to saa711x */ +static int saa711x_set_ctrl(struct em28xx *dev, const struct v4l2_control *ctrl) +{ + switch (ctrl->id) { + case V4L2_CID_BRIGHTNESS: + return em28xx_brightness_set(dev, ctrl->value); + case V4L2_CID_CONTRAST: + return em28xx_contrast_set(dev, ctrl->value); + case V4L2_CID_SATURATION: + return em28xx_saturation_set(dev, ctrl->value); + case V4L2_CID_RED_BALANCE: + return em28xx_v_balance_set(dev, ctrl->value); + case V4L2_CID_BLUE_BALANCE: + return em28xx_u_balance_set(dev, ctrl->value); + case V4L2_CID_GAMMA: + return em28xx_gamma_set(dev, ctrl->value); + default: + return -EINVAL; + } +} + /* * em28xx_stream_interrupt() * stops streaming @@ -709,8 +802,7 @@ static int em28xx_stream_interrupt(struct em28xx *dev) else if (ret) { dev->state |= DEV_MISCONFIGURED; em28xx_videodbg("device is misconfigured; close and " - "open /dev/video%d again\n", - dev->vdev->minor-MINOR_VFL_TYPE_GRABBER_MIN); + "open /dev/video%d again\n", dev->vdev->minor); return ret; } @@ -761,181 +853,6 @@ static int em28xx_set_norm(struct em28xx *dev, int width, int height) return 0; } -static int em28xx_get_fmt(struct em28xx *dev, struct v4l2_format *format) -{ - em28xx_videodbg("VIDIOC_G_FMT: type=%s\n", - (format->type ==V4L2_BUF_TYPE_VIDEO_CAPTURE) ? - "V4L2_BUF_TYPE_VIDEO_CAPTURE" : - (format->type ==V4L2_BUF_TYPE_VBI_CAPTURE) ? - "V4L2_BUF_TYPE_VBI_CAPTURE" : - (format->type ==V4L2_CAP_SLICED_VBI_CAPTURE) ? - "V4L2_BUF_TYPE_SLICED_VBI_CAPTURE " : - "not supported"); - - switch (format->type) { - case V4L2_BUF_TYPE_VIDEO_CAPTURE: - { - format->fmt.pix.width = dev->width; - format->fmt.pix.height = dev->height; - format->fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV; - format->fmt.pix.bytesperline = dev->bytesperline; - format->fmt.pix.sizeimage = dev->frame_size; - format->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M; - format->fmt.pix.field = dev->interlaced ? V4L2_FIELD_INTERLACED : V4L2_FIELD_TOP; /* FIXME: TOP? NONE? BOTTOM? ALTENATE? */ - - em28xx_videodbg("VIDIOC_G_FMT: %dx%d\n", dev->width, - dev->height); - break; - } - - case V4L2_BUF_TYPE_SLICED_VBI_CAPTURE: - { - format->fmt.sliced.service_set=0; - - em28xx_i2c_call_clients(dev,VIDIOC_G_FMT,format); - - if (format->fmt.sliced.service_set==0) - return -EINVAL; - - break; - } - - default: - return -EINVAL; - } - return (0); -} - -static int em28xx_set_fmt(struct em28xx *dev, unsigned int cmd, struct v4l2_format *format) -{ - u32 i; - int ret = 0; - int width = format->fmt.pix.width; - int height = format->fmt.pix.height; - unsigned int hscale, vscale; - unsigned int maxh, maxw; - - maxw = norm_maxw(dev); - maxh = norm_maxh(dev); - - em28xx_videodbg("%s: type=%s\n", - cmd == VIDIOC_TRY_FMT ? - "VIDIOC_TRY_FMT" : "VIDIOC_S_FMT", - format->type == V4L2_BUF_TYPE_VIDEO_CAPTURE ? - "V4L2_BUF_TYPE_VIDEO_CAPTURE" : - format->type == V4L2_BUF_TYPE_VBI_CAPTURE ? - "V4L2_BUF_TYPE_VBI_CAPTURE " : - "not supported"); - - if (format->type == V4L2_BUF_TYPE_SLICED_VBI_CAPTURE) { - em28xx_i2c_call_clients(dev,VIDIOC_G_FMT,format); - - if (format->fmt.sliced.service_set==0) - return -EINVAL; - - return 0; - } - - - if (format->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) - return -EINVAL; - - em28xx_videodbg("%s: requested %dx%d\n", - cmd == VIDIOC_TRY_FMT ? - "VIDIOC_TRY_FMT" : "VIDIOC_S_FMT", - format->fmt.pix.width, format->fmt.pix.height); - - /* FIXME: Move some code away from here */ - /* width must even because of the YUYV format */ - /* height must be even because of interlacing */ - height &= 0xfffe; - width &= 0xfffe; - - if (height < 32) - height = 32; - if (height > maxh) - height = maxh; - if (width < 48) - width = 48; - if (width > maxw) - width = maxw; - - if(dev->is_em2800){ - /* the em2800 can only scale down to 50% */ - if(height % (maxh / 2)) - height=maxh; - if(width % (maxw / 2)) - width=maxw; - /* according to empiatech support */ - /* the MaxPacketSize is to small to support */ - /* framesizes larger than 640x480 @ 30 fps */ - /* or 640x576 @ 25 fps. As this would cut */ - /* of a part of the image we prefer */ - /* 360x576 or 360x480 for now */ - if(width == maxw && height == maxh) - width /= 2; - } - - if ((hscale = (((unsigned long)maxw) << 12) / width - 4096L) >= 0x4000) - hscale = 0x3fff; - - width = (((unsigned long)maxw) << 12) / (hscale + 4096L); - - if ((vscale = (((unsigned long)maxh) << 12) / height - 4096L) >= 0x4000) - vscale = 0x3fff; - - height = (((unsigned long)maxh) << 12) / (vscale + 4096L); - - format->fmt.pix.width = width; - format->fmt.pix.height = height; - format->fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV; - format->fmt.pix.bytesperline = width * 2; - format->fmt.pix.sizeimage = width * 2 * height; - format->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M; - format->fmt.pix.field = V4L2_FIELD_INTERLACED; - - em28xx_videodbg("%s: returned %dx%d (%d, %d)\n", - cmd == VIDIOC_TRY_FMT ? - "VIDIOC_TRY_FMT" :"VIDIOC_S_FMT", - format->fmt.pix.width, format->fmt.pix.height, hscale, vscale); - - if (cmd == VIDIOC_TRY_FMT) - return 0; - - for (i = 0; i < dev->num_frames; i++) - if (dev->frame[i].vma_use_count) { - em28xx_videodbg("VIDIOC_S_FMT failed. " - "Unmap the buffers first.\n"); - return -EINVAL; - } - - /* stop io in case it is already in progress */ - if (dev->stream == STREAM_ON) { - em28xx_videodbg("VIDIOC_SET_FMT: interupting stream\n"); - if ((ret = em28xx_stream_interrupt(dev))) - return ret; - } - - em28xx_release_buffers(dev); - dev->io = IO_NONE; - - /* set new image size */ - dev->width = width; - dev->height = height; - dev->frame_size = dev->width * dev->height * 2; - dev->field_size = dev->frame_size >> 1; - dev->bytesperline = dev->width * 2; - dev->hscale = hscale; - dev->vscale = vscale; - em28xx_uninit_isoc(dev); - em28xx_set_alternate(dev); - em28xx_capture_start(dev, 1); - em28xx_resolution_set(dev); - em28xx_init_isoc(dev); - - return 0; -} - /* * em28xx_v4l2_do_ioctl() * This function is _not_ called directly, but from @@ -951,302 +868,392 @@ static int em28xx_do_ioctl(struct inode *inode, struct file *filp, switch (cmd) { /* ---------- tv norms ---------- */ case VIDIOC_ENUMSTD: - { - struct v4l2_standard *e = arg; - unsigned int i; + { + struct v4l2_standard *e = arg; + unsigned int i; - i = e->index; - if (i >= TVNORMS) - return -EINVAL; - ret = v4l2_video_std_construct(e, tvnorms[e->index].id, - tvnorms[e->index].name); - e->index = i; - if (ret < 0) - return ret; - return 0; - } + i = e->index; + if (i >= TVNORMS) + return -EINVAL; + ret = v4l2_video_std_construct(e, tvnorms[e->index].id, + tvnorms[e->index].name); + e->index = i; + if (ret < 0) + return ret; + return 0; + } case VIDIOC_G_STD: - { - v4l2_std_id *id = arg; + { + v4l2_std_id *id = arg; - *id = dev->tvnorm->id; - return 0; - } + *id = dev->tvnorm->id; + return 0; + } case VIDIOC_S_STD: - { - v4l2_std_id *id = arg; - unsigned int i; + { + v4l2_std_id *id = arg; + unsigned int i; - for (i = 0; i < TVNORMS; i++) - if (*id == tvnorms[i].id) - break; - if (i == TVNORMS) for (i = 0; i < TVNORMS; i++) - if (*id & tvnorms[i].id) + if (*id == tvnorms[i].id) break; - if (i == TVNORMS) - return -EINVAL; + if (i == TVNORMS) + for (i = 0; i < TVNORMS; i++) + if (*id & tvnorms[i].id) + break; + if (i == TVNORMS) + return -EINVAL; + + down(&dev->lock); + dev->tvnorm = &tvnorms[i]; - mutex_lock(&dev->lock); - dev->tvnorm = &tvnorms[i]; + em28xx_set_norm(dev, dev->width, dev->height); - em28xx_set_norm(dev, dev->width, dev->height); +/* + dev->width=norm_maxw(dev); + dev->height=norm_maxh(dev); + dev->frame_size=dev->width*dev->height*2; + dev->field_size=dev->frame_size>>1; + dev->bytesperline=dev->width*2; + dev->hscale=0; + dev->vscale=0; - em28xx_i2c_call_clients(dev, VIDIOC_S_STD, - &dev->tvnorm->id); + em28xx_resolution_set(dev); +*/ +/* + em28xx_uninit_isoc(dev); + em28xx_set_alternate(dev); + em28xx_capture_start(dev, 1); + em28xx_resolution_set(dev); + em28xx_init_isoc(dev); +*/ + em28xx_i2c_call_clients(dev, DECODER_SET_NORM, + &tvnorms[i].mode); + em28xx_i2c_call_clients(dev, VIDIOC_S_STD, + &dev->tvnorm->id); - mutex_unlock(&dev->lock); + up(&dev->lock); - return 0; - } + return 0; + } - /* ------ input switching ---------- */ + /* ------ input switching ---------- */ case VIDIOC_ENUMINPUT: - { - struct v4l2_input *i = arg; - unsigned int n; - static const char *iname[] = { - [EM28XX_VMUX_COMPOSITE1] = "Composite1", - [EM28XX_VMUX_COMPOSITE2] = "Composite2", - [EM28XX_VMUX_COMPOSITE3] = "Composite3", - [EM28XX_VMUX_COMPOSITE4] = "Composite4", - [EM28XX_VMUX_SVIDEO] = "S-Video", - [EM28XX_VMUX_TELEVISION] = "Television", - [EM28XX_VMUX_CABLE] = "Cable TV", - [EM28XX_VMUX_DVB] = "DVB", - [EM28XX_VMUX_DEBUG] = "for debug only", - }; - - n = i->index; - if (n >= MAX_EM28XX_INPUT) - return -EINVAL; - if (0 == INPUT(n)->type) - return -EINVAL; - memset(i, 0, sizeof(*i)); - i->index = n; - i->type = V4L2_INPUT_TYPE_CAMERA; - strcpy(i->name, iname[INPUT(n)->type]); - if ((EM28XX_VMUX_TELEVISION == INPUT(n)->type) || - (EM28XX_VMUX_CABLE == INPUT(n)->type)) - i->type = V4L2_INPUT_TYPE_TUNER; - for (n = 0; n < ARRAY_SIZE(tvnorms); n++) - i->std |= tvnorms[n].id; - return 0; - } + { + struct v4l2_input *i = arg; + unsigned int n; + static const char *iname[] = { + [EM28XX_VMUX_COMPOSITE1] = "Composite1", + [EM28XX_VMUX_COMPOSITE2] = "Composite2", + [EM28XX_VMUX_COMPOSITE3] = "Composite3", + [EM28XX_VMUX_COMPOSITE4] = "Composite4", + [EM28XX_VMUX_SVIDEO] = "S-Video", + [EM28XX_VMUX_TELEVISION] = "Television", + [EM28XX_VMUX_CABLE] = "Cable TV", + [EM28XX_VMUX_DVB] = "DVB", + [EM28XX_VMUX_DEBUG] = "for debug only", + }; + + n = i->index; + if (n >= MAX_EM28XX_INPUT) + return -EINVAL; + if (0 == INPUT(n)->type) + return -EINVAL; + memset(i, 0, sizeof(*i)); + i->index = n; + i->type = V4L2_INPUT_TYPE_CAMERA; + strcpy(i->name, iname[INPUT(n)->type]); + if ((EM28XX_VMUX_TELEVISION == INPUT(n)->type) || + (EM28XX_VMUX_CABLE == INPUT(n)->type)) + i->type = V4L2_INPUT_TYPE_TUNER; + for (n = 0; n < ARRAY_SIZE(tvnorms); n++) + i->std |= tvnorms[n].id; + return 0; + } + case VIDIOC_G_INPUT: - { - int *i = arg; - *i = dev->ctl_input; + { + int *i = arg; + *i = dev->ctl_input; + + return 0; + } - return 0; - } case VIDIOC_S_INPUT: - { - int *index = arg; + { + int *index = arg; - if (*index >= MAX_EM28XX_INPUT) - return -EINVAL; - if (0 == INPUT(*index)->type) - return -EINVAL; + if (*index >= MAX_EM28XX_INPUT) + return -EINVAL; + if (0 == INPUT(*index)->type) + return -EINVAL; - mutex_lock(&dev->lock); - video_mux(dev, *index); - mutex_unlock(&dev->lock); + down(&dev->lock); + video_mux(dev, *index); + up(&dev->lock); + + return 0; + } - return 0; - } case VIDIOC_G_AUDIO: - { - struct v4l2_audio *a = arg; - unsigned int index = a->index; + { + struct v4l2_audio *a = arg; + unsigned int index = a->index; - if (a->index > 1) - return -EINVAL; - memset(a, 0, sizeof(*a)); - index = dev->ctl_ainput; + if (a->index > 1) + return -EINVAL; + memset(a, 0, sizeof(*a)); + index = dev->ctl_ainput; - if (index == 0) { - strcpy(a->name, "Television"); - } else { - strcpy(a->name, "Line In"); + if (index == 0) { + strcpy(a->name, "Television"); + } else { + strcpy(a->name, "Line In"); + } + a->capability = V4L2_AUDCAP_STEREO; + a->index = index; + return 0; } - a->capability = V4L2_AUDCAP_STEREO; - a->index = index; - return 0; - } - case VIDIOC_S_AUDIO: - { - struct v4l2_audio *a = arg; - if (a->index != dev->ctl_ainput) - return -EINVAL; + case VIDIOC_S_AUDIO: + { + struct v4l2_audio *a = arg; + if (a->index != dev->ctl_ainput) + return -EINVAL; - return 0; - } + return 0; + } - /* --- controls ---------------------------------------------- */ + /* --- controls ---------------------------------------------- */ case VIDIOC_QUERYCTRL: - { - struct v4l2_queryctrl *qc = arg; - int i, id=qc->id; - - memset(qc,0,sizeof(*qc)); - qc->id=id; - - if (!dev->has_msp34xx) { - for (i = 0; i < ARRAY_SIZE(em28xx_qctrl); i++) { - if (qc->id && qc->id == em28xx_qctrl[i].id) { - memcpy(qc, &(em28xx_qctrl[i]), - sizeof(*qc)); + { + struct v4l2_queryctrl *qc = arg; + int i, id=qc->id; + + memset(qc,0,sizeof(*qc)); + qc->id=id; + + if (!dev->has_msp34xx) { + for (i = 0; i < ARRAY_SIZE(em28xx_qctrl); i++) { + if (qc->id && qc->id == em28xx_qctrl[i].id) { + memcpy(qc, &(em28xx_qctrl[i]), + sizeof(*qc)); + return 0; + } + } + } + if (dev->decoder == EM28XX_TVP5150) { + em28xx_i2c_call_clients(dev,cmd,qc); + if (qc->type) + return 0; + else + return -EINVAL; + } + for (i = 0; i < ARRAY_SIZE(saa711x_qctrl); i++) { + if (qc->id && qc->id == saa711x_qctrl[i].id) { + memcpy(qc, &(saa711x_qctrl[i]), + sizeof(*qc)); return 0; } } - } - em28xx_i2c_call_clients(dev,cmd,qc); - if (qc->type) - return 0; - else + return -EINVAL; - } + } + case VIDIOC_G_CTRL: - { - struct v4l2_control *ctrl = arg; - int retval=-EINVAL; + { + struct v4l2_control *ctrl = arg; + int retval=-EINVAL; + + if (!dev->has_msp34xx) + retval=em28xx_get_ctrl(dev, ctrl); + if (retval==-EINVAL) { + if (dev->decoder == EM28XX_TVP5150) { + em28xx_i2c_call_clients(dev,cmd,arg); + return 0; + } + + return saa711x_get_ctrl(dev, ctrl); + } else return retval; + } - if (!dev->has_msp34xx) - retval=em28xx_get_ctrl(dev, ctrl); - if (retval==-EINVAL) { - em28xx_i2c_call_clients(dev,cmd,arg); - return 0; - } else return retval; - } case VIDIOC_S_CTRL: - { - struct v4l2_control *ctrl = arg; - u8 i; - - if (!dev->has_msp34xx){ - for (i = 0; i < ARRAY_SIZE(em28xx_qctrl); i++) { - if (ctrl->id == em28xx_qctrl[i].id) { - if (ctrl->value < - em28xx_qctrl[i].minimum - || ctrl->value > - em28xx_qctrl[i].maximum) - return -ERANGE; - return em28xx_set_ctrl(dev, ctrl); + { + struct v4l2_control *ctrl = arg; + u8 i; + + if (!dev->has_msp34xx){ + for (i = 0; i < ARRAY_SIZE(em28xx_qctrl); i++) { + if (ctrl->id == em28xx_qctrl[i].id) { + if (ctrl->value < + em28xx_qctrl[i].minimum + || ctrl->value > + em28xx_qctrl[i].maximum) + return -ERANGE; + return em28xx_set_ctrl(dev, ctrl); + } } } + + if (dev->decoder == EM28XX_TVP5150) { + em28xx_i2c_call_clients(dev,cmd,arg); + return 0; + } else if (!dev->has_msp34xx) { + for (i = 0; i < ARRAY_SIZE(em28xx_qctrl); i++) { + if (ctrl->id == em28xx_qctrl[i].id) { + if (ctrl->value < + em28xx_qctrl[i].minimum + || ctrl->value > + em28xx_qctrl[i].maximum) + return -ERANGE; + return em28xx_set_ctrl(dev, ctrl); + } + } + for (i = 0; i < ARRAY_SIZE(saa711x_qctrl); i++) { + if (ctrl->id == saa711x_qctrl[i].id) { + if (ctrl->value < + saa711x_qctrl[i].minimum + || ctrl->value > + saa711x_qctrl[i].maximum) + return -ERANGE; + return saa711x_set_ctrl(dev, ctrl); + } + } + } + + return -EINVAL; } - em28xx_i2c_call_clients(dev,cmd,arg); - return 0; - } - /* --- tuner ioctls ------------------------------------------ */ + /* --- tuner ioctls ------------------------------------------ */ case VIDIOC_G_TUNER: - { - struct v4l2_tuner *t = arg; + { + struct v4l2_tuner *t = arg; + int status = 0; - if (0 != t->index) - return -EINVAL; + if (0 != t->index) + return -EINVAL; - memset(t, 0, sizeof(*t)); - strcpy(t->name, "Tuner"); - mutex_lock(&dev->lock); - /* let clients fill in the remainder of this struct */ - em28xx_i2c_call_clients(dev, cmd, t); - mutex_unlock(&dev->lock); - em28xx_videodbg("VIDIO_G_TUNER: signal=%x, afc=%x\n", t->signal, - t->afc); - return 0; - } + memset(t, 0, sizeof(*t)); + strcpy(t->name, "Tuner"); + t->type = V4L2_TUNER_ANALOG_TV; + t->capability = V4L2_TUNER_CAP_NORM; + t->rangehigh = 0xffffffffUL; /* FIXME: set correct range */ +/* t->signal = 0xffff;*/ +/* em28xx_i2c_call_clients(dev,VIDIOC_G_TUNER,t);*/ + /* No way to get signal strength? */ + down(&dev->lock); + em28xx_i2c_call_clients(dev, DECODER_GET_STATUS, + &status); + up(&dev->lock); + t->signal = + (status & DECODER_STATUS_GOOD) != 0 ? 0xffff : 0; + + em28xx_videodbg("VIDIO_G_TUNER: signal=%x, afc=%x\n", t->signal, + t->afc); + return 0; + } case VIDIOC_S_TUNER: - { - struct v4l2_tuner *t = arg; + { + struct v4l2_tuner *t = arg; + int status = 0; - if (0 != t->index) - return -EINVAL; - mutex_lock(&dev->lock); - /* let clients handle this */ - em28xx_i2c_call_clients(dev, cmd, t); - mutex_unlock(&dev->lock); - return 0; - } + if (0 != t->index) + return -EINVAL; + memset(t, 0, sizeof(*t)); + strcpy(t->name, "Tuner"); + t->type = V4L2_TUNER_ANALOG_TV; + t->capability = V4L2_TUNER_CAP_NORM; + t->rangehigh = 0xffffffffUL; /* FIXME: set correct range */ +/* t->signal = 0xffff; */ + /* No way to get signal strength? */ + down(&dev->lock); + em28xx_i2c_call_clients(dev, DECODER_GET_STATUS, + &status); + up(&dev->lock); + t->signal = + (status & DECODER_STATUS_GOOD) != 0 ? 0xffff : 0; + + em28xx_videodbg("VIDIO_S_TUNER: signal=%x, afc=%x\n", + t->signal, t->afc); + return 0; + } case VIDIOC_G_FREQUENCY: - { - struct v4l2_frequency *f = arg; + { + struct v4l2_frequency *f = arg; - memset(f, 0, sizeof(*f)); - f->type = V4L2_TUNER_ANALOG_TV; - f->frequency = dev->ctl_freq; + memset(f, 0, sizeof(*f)); + f->type = V4L2_TUNER_ANALOG_TV; + f->frequency = dev->ctl_freq; - return 0; - } + return 0; + } case VIDIOC_S_FREQUENCY: - { - struct v4l2_frequency *f = arg; + { + struct v4l2_frequency *f = arg; - if (0 != f->tuner) - return -EINVAL; + if (0 != f->tuner) + return -EINVAL; - if (V4L2_TUNER_ANALOG_TV != f->type) - return -EINVAL; + if (V4L2_TUNER_ANALOG_TV != f->type) + return -EINVAL; + + down(&dev->lock); + dev->ctl_freq = f->frequency; + em28xx_i2c_call_clients(dev, VIDIOC_S_FREQUENCY, f); + up(&dev->lock); + return 0; + } - mutex_lock(&dev->lock); - dev->ctl_freq = f->frequency; - em28xx_i2c_call_clients(dev, VIDIOC_S_FREQUENCY, f); - mutex_unlock(&dev->lock); - return 0; - } case VIDIOC_CROPCAP: - { - struct v4l2_cropcap *cc = arg; + { + struct v4l2_cropcap *cc = arg; - if (cc->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) - return -EINVAL; - cc->bounds.left = 0; - cc->bounds.top = 0; - cc->bounds.width = dev->width; - cc->bounds.height = dev->height; - cc->defrect = cc->bounds; - cc->pixelaspect.numerator = 54; /* 4:3 FIXME: remove magic numbers */ - cc->pixelaspect.denominator = 59; - return 0; - } + if (cc->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) + return -EINVAL; + cc->bounds.left = 0; + cc->bounds.top = 0; + cc->bounds.width = dev->width; + cc->bounds.height = dev->height; + cc->defrect = cc->bounds; + cc->pixelaspect.numerator = 54; /* 4:3 FIXME: remove magic numbers */ + cc->pixelaspect.denominator = 59; + return 0; + } case VIDIOC_STREAMON: - { - int *type = arg; + { + int *type = arg; - if (*type != V4L2_BUF_TYPE_VIDEO_CAPTURE - || dev->io != IO_MMAP) - return -EINVAL; + if (*type != V4L2_BUF_TYPE_VIDEO_CAPTURE + || dev->io != IO_MMAP) + return -EINVAL; - if (list_empty(&dev->inqueue)) - return -EINVAL; + if (list_empty(&dev->inqueue)) + return -EINVAL; - dev->stream = STREAM_ON; /* FIXME: Start video capture here? */ + dev->stream = STREAM_ON; /* FIXME: Start video capture here? */ - em28xx_videodbg("VIDIOC_STREAMON: starting stream\n"); + em28xx_videodbg("VIDIOC_STREAMON: starting stream\n"); - return 0; - } + return 0; + } case VIDIOC_STREAMOFF: - { - int *type = arg; - int ret; + { + int *type = arg; + int ret; - if (*type != V4L2_BUF_TYPE_VIDEO_CAPTURE - || dev->io != IO_MMAP) - return -EINVAL; + if (*type != V4L2_BUF_TYPE_VIDEO_CAPTURE + || dev->io != IO_MMAP) + return -EINVAL; - if (dev->stream == STREAM_ON) { - em28xx_videodbg ("VIDIOC_STREAMOFF: interrupting stream\n"); - if ((ret = em28xx_stream_interrupt(dev))) - return ret; - } - em28xx_empty_framequeues(dev); + if (dev->stream == STREAM_ON) { + em28xx_videodbg ("VIDIOC_STREAMOFF: interrupting stream\n"); + if ((ret = em28xx_stream_interrupt(dev))) + return ret; + } + em28xx_empty_framequeues(dev); - return 0; - } + return 0; + } default: return v4l_compat_translate_ioctl(inode, filp, cmd, arg, driver_ioctl); @@ -1276,170 +1283,327 @@ static int em28xx_video_do_ioctl(struct inode *inode, struct file *filp, /* --- capabilities ------------------------------------------ */ case VIDIOC_QUERYCAP: { - struct v4l2_capability *cap = arg; - - memset(cap, 0, sizeof(*cap)); - strlcpy(cap->driver, "em28xx", sizeof(cap->driver)); - strlcpy(cap->card, em28xx_boards[dev->model].name, - sizeof(cap->card)); - strlcpy(cap->bus_info, dev->udev->dev.bus_id, - sizeof(cap->bus_info)); - cap->version = EM28XX_VERSION_CODE; - cap->capabilities = - V4L2_CAP_SLICED_VBI_CAPTURE | - V4L2_CAP_VIDEO_CAPTURE | - V4L2_CAP_AUDIO | - V4L2_CAP_READWRITE | V4L2_CAP_STREAMING; - if (dev->has_tuner) - cap->capabilities |= V4L2_CAP_TUNER; - return 0; - } - /* --- capture ioctls ---------------------------------------- */ + struct v4l2_capability *cap = arg; + + memset(cap, 0, sizeof(*cap)); + strlcpy(cap->driver, "em28xx", sizeof(cap->driver)); + strlcpy(cap->card, em28xx_boards[dev->model].name, + sizeof(cap->card)); + strlcpy(cap->bus_info, dev->udev->dev.bus_id, + sizeof(cap->bus_info)); + cap->version = EM28XX_VERSION_CODE; + cap->capabilities = + V4L2_CAP_VIDEO_CAPTURE | + V4L2_CAP_AUDIO | + V4L2_CAP_READWRITE | V4L2_CAP_STREAMING; + if (dev->has_tuner) + cap->capabilities |= V4L2_CAP_TUNER; + return 0; + } + + /* --- capture ioctls ---------------------------------------- */ case VIDIOC_ENUM_FMT: - { - struct v4l2_fmtdesc *fmtd = arg; + { + struct v4l2_fmtdesc *fmtd = arg; + + if (fmtd->index != 0) + return -EINVAL; + memset(fmtd, 0, sizeof(*fmtd)); + fmtd->type = V4L2_BUF_TYPE_VIDEO_CAPTURE; + strcpy(fmtd->description, "Packed YUY2"); + fmtd->pixelformat = V4L2_PIX_FMT_YUYV; + memset(fmtd->reserved, 0, sizeof(fmtd->reserved)); + return 0; + } - if (fmtd->index != 0) - return -EINVAL; - memset(fmtd, 0, sizeof(*fmtd)); - fmtd->type = V4L2_BUF_TYPE_VIDEO_CAPTURE; - strcpy(fmtd->description, "Packed YUY2"); - fmtd->pixelformat = V4L2_PIX_FMT_YUYV; - memset(fmtd->reserved, 0, sizeof(fmtd->reserved)); - return 0; - } case VIDIOC_G_FMT: - return em28xx_get_fmt(dev, (struct v4l2_format *) arg); + { + struct v4l2_format *format = arg; + + em28xx_videodbg("VIDIOC_G_FMT: type=%s\n", + format->type == + V4L2_BUF_TYPE_VIDEO_CAPTURE ? + "V4L2_BUF_TYPE_VIDEO_CAPTURE" : format->type == + V4L2_BUF_TYPE_VBI_CAPTURE ? + "V4L2_BUF_TYPE_VBI_CAPTURE " : + "not supported"); + + if (format->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) + return -EINVAL; + + format->fmt.pix.width = dev->width; + format->fmt.pix.height = dev->height; + format->fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV; + format->fmt.pix.bytesperline = dev->bytesperline; + format->fmt.pix.sizeimage = dev->frame_size; + format->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M; + format->fmt.pix.field = dev->interlaced ? V4L2_FIELD_INTERLACED : V4L2_FIELD_TOP; /* FIXME: TOP? NONE? BOTTOM? ALTENATE? */ + + em28xx_videodbg("VIDIOC_G_FMT: %dx%d\n", dev->width, + dev->height); + return 0; + } case VIDIOC_TRY_FMT: case VIDIOC_S_FMT: - return em28xx_set_fmt(dev, cmd, (struct v4l2_format *)arg); + { + struct v4l2_format *format = arg; + u32 i; + int ret = 0; + int width = format->fmt.pix.width; + int height = format->fmt.pix.height; + unsigned int hscale, vscale; + unsigned int maxh, maxw; + + maxw = norm_maxw(dev); + maxh = norm_maxh(dev); + +/* int both_fields; */ + + em28xx_videodbg("%s: type=%s\n", + cmd == + VIDIOC_TRY_FMT ? "VIDIOC_TRY_FMT" : + "VIDIOC_S_FMT", + format->type == + V4L2_BUF_TYPE_VIDEO_CAPTURE ? + "V4L2_BUF_TYPE_VIDEO_CAPTURE" : format->type == + V4L2_BUF_TYPE_VBI_CAPTURE ? + "V4L2_BUF_TYPE_VBI_CAPTURE " : + "not supported"); + + if (format->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) + return -EINVAL; - case VIDIOC_REQBUFS: - { - struct v4l2_requestbuffers *rb = arg; - u32 i; - int ret; + em28xx_videodbg("%s: requested %dx%d\n", + cmd == + VIDIOC_TRY_FMT ? "VIDIOC_TRY_FMT" : + "VIDIOC_S_FMT", format->fmt.pix.width, + format->fmt.pix.height); + + /* FIXME: Move some code away from here */ + /* width must even because of the YUYV format */ + /* height must be even because of interlacing */ + height &= 0xfffe; + width &= 0xfffe; + + if (height < 32) + height = 32; + if (height > maxh) + height = maxh; + if (width < 48) + width = 48; + if (width > maxw) + width = maxw; + + if(dev->is_em2800){ + /* the em2800 can only scale down to 50% */ + if(height % (maxh / 2)) + height=maxh; + if(width % (maxw / 2)) + width=maxw; + /* according to empiatech support */ + /* the MaxPacketSize is to small to support */ + /* framesizes larger than 640x480 @ 30 fps */ + /* or 640x576 @ 25 fps. As this would cut */ + /* of a part of the image we prefer */ + /* 360x576 or 360x480 for now */ + if(width == maxw && height == maxh) + width /= 2; + } - if (rb->type != V4L2_BUF_TYPE_VIDEO_CAPTURE || - rb->memory != V4L2_MEMORY_MMAP) - return -EINVAL; + if ((hscale = + (((unsigned long)maxw) << 12) / width - 4096L) >= + 0x4000) + hscale = 0x3fff; + width = + (((unsigned long)maxw) << 12) / (hscale + 4096L); + + if ((vscale = + (((unsigned long)maxh) << 12) / height - 4096L) >= + 0x4000) + vscale = 0x3fff; + height = + (((unsigned long)maxh) << 12) / (vscale + 4096L); + + format->fmt.pix.width = width; + format->fmt.pix.height = height; + format->fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV; + format->fmt.pix.bytesperline = width * 2; + format->fmt.pix.sizeimage = width * 2 * height; + format->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M; + format->fmt.pix.field = V4L2_FIELD_INTERLACED; + + em28xx_videodbg("%s: returned %dx%d (%d, %d)\n", + cmd == + VIDIOC_TRY_FMT ? "VIDIOC_TRY_FMT" : + "VIDIOC_S_FMT", format->fmt.pix.width, + format->fmt.pix.height, hscale, vscale); + + if (cmd == VIDIOC_TRY_FMT) + return 0; + + for (i = 0; i < dev->num_frames; i++) + if (dev->frame[i].vma_use_count) { + em28xx_videodbg("VIDIOC_S_FMT failed. " + "Unmap the buffers first.\n"); + return -EINVAL; + } - if (dev->io == IO_READ) { - em28xx_videodbg ("method is set to read;" - " close and open the device again to" - " choose the mmap I/O method\n"); - return -EINVAL; + /* stop io in case it is already in progress */ + if (dev->stream == STREAM_ON) { + em28xx_videodbg("VIDIOC_SET_FMT: interupting stream\n"); + if ((ret = em28xx_stream_interrupt(dev))) + return ret; + } + + em28xx_release_buffers(dev); + dev->io = IO_NONE; + + /* set new image size */ + dev->width = width; + dev->height = height; + dev->frame_size = dev->width * dev->height * 2; + dev->field_size = dev->frame_size >> 1; /*both_fileds ? dev->frame_size>>1 : dev->frame_size; */ + dev->bytesperline = dev->width * 2; + dev->hscale = hscale; + dev->vscale = vscale; +/* dev->both_fileds = both_fileds; */ + em28xx_uninit_isoc(dev); + em28xx_set_alternate(dev); + em28xx_capture_start(dev, 1); + em28xx_resolution_set(dev); + em28xx_init_isoc(dev); + + return 0; } - for (i = 0; i < dev->num_frames; i++) - if (dev->frame[i].vma_use_count) { - em28xx_videodbg ("VIDIOC_REQBUFS failed; previous buffers are still mapped\n"); + /* --- streaming capture ------------------------------------- */ + case VIDIOC_REQBUFS: + { + struct v4l2_requestbuffers *rb = arg; + u32 i; + int ret; + + if (rb->type != V4L2_BUF_TYPE_VIDEO_CAPTURE || + rb->memory != V4L2_MEMORY_MMAP) + return -EINVAL; + + if (dev->io == IO_READ) { + em28xx_videodbg ("method is set to read;" + " close and open the device again to" + " choose the mmap I/O method\n"); return -EINVAL; } - if (dev->stream == STREAM_ON) { - em28xx_videodbg("VIDIOC_REQBUFS: interrupting stream\n"); - if ((ret = em28xx_stream_interrupt(dev))) - return ret; - } + for (i = 0; i < dev->num_frames; i++) + if (dev->frame[i].vma_use_count) { + em28xx_videodbg ("VIDIOC_REQBUFS failed; previous buffers are still mapped\n"); + return -EINVAL; + } - em28xx_empty_framequeues(dev); + if (dev->stream == STREAM_ON) { + em28xx_videodbg("VIDIOC_REQBUFS: interrupting stream\n"); + if ((ret = em28xx_stream_interrupt(dev))) + return ret; + } - em28xx_release_buffers(dev); - if (rb->count) - rb->count = - em28xx_request_buffers(dev, rb->count); + em28xx_empty_framequeues(dev); - dev->frame_current = NULL; + em28xx_release_buffers(dev); + if (rb->count) + rb->count = + em28xx_request_buffers(dev, rb->count); + + dev->frame_current = NULL; + + em28xx_videodbg ("VIDIOC_REQBUFS: setting io method to mmap: num bufs %i\n", + rb->count); + dev->io = rb->count ? IO_MMAP : IO_NONE; + return 0; + } - em28xx_videodbg ("VIDIOC_REQBUFS: setting io method to mmap: num bufs %i\n", - rb->count); - dev->io = rb->count ? IO_MMAP : IO_NONE; - return 0; - } case VIDIOC_QUERYBUF: - { - struct v4l2_buffer *b = arg; + { + struct v4l2_buffer *b = arg; - if (b->type != V4L2_BUF_TYPE_VIDEO_CAPTURE || - b->index >= dev->num_frames || dev->io != IO_MMAP) - return -EINVAL; + if (b->type != V4L2_BUF_TYPE_VIDEO_CAPTURE || + b->index >= dev->num_frames || dev->io != IO_MMAP) + return -EINVAL; - memcpy(b, &dev->frame[b->index].buf, sizeof(*b)); + memcpy(b, &dev->frame[b->index].buf, sizeof(*b)); - if (dev->frame[b->index].vma_use_count) { - b->flags |= V4L2_BUF_FLAG_MAPPED; + if (dev->frame[b->index].vma_use_count) { + b->flags |= V4L2_BUF_FLAG_MAPPED; + } + if (dev->frame[b->index].state == F_DONE) + b->flags |= V4L2_BUF_FLAG_DONE; + else if (dev->frame[b->index].state != F_UNUSED) + b->flags |= V4L2_BUF_FLAG_QUEUED; + return 0; } - if (dev->frame[b->index].state == F_DONE) - b->flags |= V4L2_BUF_FLAG_DONE; - else if (dev->frame[b->index].state != F_UNUSED) - b->flags |= V4L2_BUF_FLAG_QUEUED; - return 0; - } case VIDIOC_QBUF: - { - struct v4l2_buffer *b = arg; - unsigned long lock_flags; + { + struct v4l2_buffer *b = arg; + unsigned long lock_flags; - if (b->type != V4L2_BUF_TYPE_VIDEO_CAPTURE || - b->index >= dev->num_frames || dev->io != IO_MMAP) { - return -EINVAL; - } + if (b->type != V4L2_BUF_TYPE_VIDEO_CAPTURE || + b->index >= dev->num_frames || dev->io != IO_MMAP) { + return -EINVAL; + } - if (dev->frame[b->index].state != F_UNUSED) { - return -EAGAIN; - } - dev->frame[b->index].state = F_QUEUED; + if (dev->frame[b->index].state != F_UNUSED) { + return -EAGAIN; + } + dev->frame[b->index].state = F_QUEUED; - /* add frame to fifo */ - spin_lock_irqsave(&dev->queue_lock, lock_flags); - list_add_tail(&dev->frame[b->index].frame, - &dev->inqueue); - spin_unlock_irqrestore(&dev->queue_lock, lock_flags); + /* add frame to fifo */ + spin_lock_irqsave(&dev->queue_lock, lock_flags); + list_add_tail(&dev->frame[b->index].frame, + &dev->inqueue); + spin_unlock_irqrestore(&dev->queue_lock, lock_flags); - return 0; - } + return 0; + } case VIDIOC_DQBUF: - { - struct v4l2_buffer *b = arg; - struct em28xx_frame_t *f; - unsigned long lock_flags; - int ret = 0; - - if (b->type != V4L2_BUF_TYPE_VIDEO_CAPTURE - || dev->io != IO_MMAP) - return -EINVAL; + { + struct v4l2_buffer *b = arg; + struct em28xx_frame_t *f; + unsigned long lock_flags; + int ret = 0; - if (list_empty(&dev->outqueue)) { - if (dev->stream == STREAM_OFF) + if (b->type != V4L2_BUF_TYPE_VIDEO_CAPTURE + || dev->io != IO_MMAP) return -EINVAL; - if (filp->f_flags & O_NONBLOCK) - return -EAGAIN; - ret = wait_event_interruptible - (dev->wait_frame, - (!list_empty(&dev->outqueue)) || - (dev->state & DEV_DISCONNECTED)); - if (ret) - return ret; - if (dev->state & DEV_DISCONNECTED) - return -ENODEV; - } - spin_lock_irqsave(&dev->queue_lock, lock_flags); - f = list_entry(dev->outqueue.next, - struct em28xx_frame_t, frame); - list_del(dev->outqueue.next); - spin_unlock_irqrestore(&dev->queue_lock, lock_flags); + if (list_empty(&dev->outqueue)) { + if (dev->stream == STREAM_OFF) + return -EINVAL; + if (filp->f_flags & O_NONBLOCK) + return -EAGAIN; + ret = wait_event_interruptible + (dev->wait_frame, + (!list_empty(&dev->outqueue)) || + (dev->state & DEV_DISCONNECTED)); + if (ret) + return ret; + if (dev->state & DEV_DISCONNECTED) + return -ENODEV; + } - f->state = F_UNUSED; - memcpy(b, &f->buf, sizeof(*b)); + spin_lock_irqsave(&dev->queue_lock, lock_flags); + f = list_entry(dev->outqueue.next, + struct em28xx_frame_t, frame); + list_del(dev->outqueue.next); + spin_unlock_irqrestore(&dev->queue_lock, lock_flags); - if (f->vma_use_count) - b->flags |= V4L2_BUF_FLAG_MAPPED; + f->state = F_UNUSED; + memcpy(b, &f->buf, sizeof(*b)); - return 0; - } + if (f->vma_use_count) + b->flags |= V4L2_BUF_FLAG_MAPPED; + + return 0; + } default: return em28xx_do_ioctl(inode, filp, dev, cmd, arg, em28xx_video_do_ioctl); @@ -1457,25 +1621,25 @@ static int em28xx_v4l2_ioctl(struct inode *inode, struct file *filp, int ret = 0; struct em28xx *dev = filp->private_data; - if (mutex_lock_interruptible(&dev->fileop_lock)) + if (down_interruptible(&dev->fileop_lock)) return -ERESTARTSYS; if (dev->state & DEV_DISCONNECTED) { em28xx_errdev("v4l2 ioctl: device not present\n"); - mutex_unlock(&dev->fileop_lock); + up(&dev->fileop_lock); return -ENODEV; } if (dev->state & DEV_MISCONFIGURED) { em28xx_errdev ("v4l2 ioctl: device is misconfigured; close and open it again\n"); - mutex_unlock(&dev->fileop_lock); + up(&dev->fileop_lock); return -EIO; } ret = video_usercopy(inode, filp, cmd, arg, em28xx_video_do_ioctl); - mutex_unlock(&dev->fileop_lock); + up(&dev->fileop_lock); return ret; } @@ -1509,7 +1673,7 @@ static int em28xx_init_dev(struct em28xx **devhandle, struct usb_device *udev, dev->udev = udev; dev->model = model; - mutex_init(&dev->lock); + init_MUTEX(&dev->lock); init_waitqueue_head(&dev->open); dev->em28xx_write_regs = em28xx_write_regs; @@ -1565,25 +1729,25 @@ static int em28xx_init_dev(struct em28xx **devhandle, struct usb_device *udev, dev->vpic.depth = 16; dev->vpic.palette = VIDEO_PALETTE_YUV422; - em28xx_pre_card_setup(dev); #ifdef CONFIG_MODULES /* request some modules */ if (dev->decoder == EM28XX_SAA7113 || dev->decoder == EM28XX_SAA7114) - request_module("saa7115"); + request_module("saa711x"); if (dev->decoder == EM28XX_TVP5150) request_module("tvp5150"); if (dev->has_tuner) request_module("tuner"); + if (dev->tda9887_conf) + request_module("tda9887"); #endif errCode = em28xx_config(dev); if (errCode) { em28xx_errdev("error configuring device\n"); - em28xx_devused&=~(1<devno); kfree(dev); return -ENOMEM; } - mutex_lock(&dev->lock); + down(&dev->lock); /* register i2c bus */ em28xx_i2c_register(dev); @@ -1593,7 +1757,7 @@ static int em28xx_init_dev(struct em28xx **devhandle, struct usb_device *udev, /* configure the device */ em28xx_config_i2c(dev); - mutex_unlock(&dev->lock); + up(&dev->lock); errCode = em28xx_config(dev); @@ -1605,31 +1769,10 @@ static int em28xx_init_dev(struct em28xx **devhandle, struct usb_device *udev, dev->vdev = video_device_alloc(); if (NULL == dev->vdev) { em28xx_errdev("cannot allocate video_device.\n"); - em28xx_devused&=~(1<devno); kfree(dev); return -ENOMEM; } - dev->vbi_dev = video_device_alloc(); - if (NULL == dev->vbi_dev) { - em28xx_errdev("cannot allocate video_device.\n"); - kfree(dev->vdev); - em28xx_devused&=~(1<devno); - kfree(dev); - return -ENOMEM; - } - - /* Fills VBI device info */ - dev->vbi_dev->type = VFL_TYPE_VBI; - dev->vbi_dev->hardware = 0; - dev->vbi_dev->fops = &em28xx_v4l_fops; - dev->vbi_dev->minor = -1; - dev->vbi_dev->dev = &dev->udev->dev; - dev->vbi_dev->release = video_device_release; - snprintf(dev->vbi_dev->name, sizeof(dev->vbi_dev->name), "%s#%d %s", - "em28xx",dev->devno,"vbi"); - - /* Fills CAPTURE device info */ dev->vdev->type = VID_TYPE_CAPTURE; if (dev->has_tuner) dev->vdev->type |= VID_TYPE_TUNER; @@ -1638,39 +1781,21 @@ static int em28xx_init_dev(struct em28xx **devhandle, struct usb_device *udev, dev->vdev->minor = -1; dev->vdev->dev = &dev->udev->dev; dev->vdev->release = video_device_release; - snprintf(dev->vdev->name, sizeof(dev->vbi_dev->name), "%s#%d %s", - "em28xx",dev->devno,"video"); - + snprintf(dev->vdev->name, sizeof(dev->vdev->name), "%s", + "em28xx video"); list_add_tail(&dev->devlist,&em28xx_devlist); /* register v4l2 device */ - mutex_lock(&dev->lock); - if ((retval = video_register_device(dev->vdev, VFL_TYPE_GRABBER, - video_nr[dev->devno]))) { + down(&dev->lock); + if ((retval = video_register_device(dev->vdev, VFL_TYPE_GRABBER, -1))) { em28xx_errdev("unable to register video device (error=%i).\n", retval); - mutex_unlock(&dev->lock); + up(&dev->lock); list_del(&dev->devlist); video_device_release(dev->vdev); - em28xx_devused&=~(1<devno); kfree(dev); return -ENODEV; } - - if (video_register_device(dev->vbi_dev, VFL_TYPE_VBI, - vbi_nr[dev->devno]) < 0) { - printk("unable to register vbi device\n"); - mutex_unlock(&dev->lock); - list_del(&dev->devlist); - video_device_release(dev->vbi_dev); - video_device_release(dev->vdev); - em28xx_devused&=~(1<devno); - kfree(dev); - return -ENODEV; - } else { - printk("registered VBI\n"); - } - if (dev->has_msp34xx) { /* Send a reset to other chips via gpio */ em28xx_write_regs_req(dev, 0x00, 0x08, "\xf7", 1); @@ -1681,11 +1806,10 @@ static int em28xx_init_dev(struct em28xx **devhandle, struct usb_device *udev, } video_mux(dev, 0); - mutex_unlock(&dev->lock); + up(&dev->lock); - em28xx_info("V4L2 device registered as /dev/video%d and /dev/vbi%d\n", - dev->vdev->minor-MINOR_VFL_TYPE_GRABBER_MIN, - dev->vbi_dev->minor-MINOR_VFL_TYPE_VBI_MIN); + em28xx_info("V4L2 device registered as /dev/video%d\n", + dev->vdev->minor); return 0; } @@ -1707,9 +1831,6 @@ static int em28xx_usb_probe(struct usb_interface *interface, udev = usb_get_dev(interface_to_usbdev(interface)); ifnum = interface->altsetting[0].desc.bInterfaceNumber; - /* Check to see next free device and mark as used */ - nr=find_first_zero_bit(&em28xx_devused,EM28XX_MAXBOARDS); - em28xx_devused|=1<altsetting[0].desc.bInterfaceClass == USB_CLASS_AUDIO) { @@ -1717,8 +1838,6 @@ static int em28xx_usb_probe(struct usb_interface *interface, udev->descriptor.idVendor,udev->descriptor.idProduct, ifnum, interface->altsetting[0].desc.bInterfaceClass); - - em28xx_devused&=~(1<bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) != USB_ENDPOINT_XFER_ISOC) { em28xx_err(DRIVER_NAME " probing error: endpoint is non-ISO endpoint!\n"); - em28xx_devused&=~(1<bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_OUT) { em28xx_err(DRIVER_NAME " probing error: endpoint is ISO OUT endpoint!\n"); - em28xx_devused&=~(1<driver_info; + nr=interface->minor; - if (nr >= EM28XX_MAXBOARDS) { + if (nr>EM28XX_MAXBOARDS) { printk (DRIVER_NAME ": Supports only %i em28xx boards.\n",EM28XX_MAXBOARDS); - em28xx_devused&=~(1<name, 29, "em28xx #%d", nr); - dev->devno=nr; - /* compute alternate max packet sizes */ uif = udev->actconfig->interface[0]; dev->num_alt=uif->num_altsetting; - em28xx_info("Alternate settings: %i\n",dev->num_alt); + printk(DRIVER_NAME ": Alternate settings: %i\n",dev->num_alt); // dev->alt_max_pkt_size = kmalloc(sizeof(*dev->alt_max_pkt_size)* dev->alt_max_pkt_size = kmalloc(32* dev->num_alt,GFP_KERNEL); if (dev->alt_max_pkt_size == NULL) { - em28xx_errdev("out of memory!\n"); - em28xx_devused&=~(1<alt_max_pkt_size[i] = (tmp & 0x07ff) * (((tmp & 0x1800) >> 11) + 1); - em28xx_info("Alternate setting %i, max size= %i\n",i, + printk(DRIVER_NAME ": Alternate setting %i, max size= %i\n",i, dev->alt_max_pkt_size[i]); } + snprintf(dev->name, 29, "em28xx #%d", nr); + if ((card[nr]>=0)&&(card[nr] insmod option to\n" "%s: workaround that. Redirect complaints to the vendor of\n" - "%s: the TV card. Generic type will be used." - "%s: Best regards,\n" + "%s: the TV card. Best regards,\n" "%s: -- tux\n", dev->name,dev->name,dev->name,dev->name,dev->name); - em28xx_errdev("%s: Here is a list of valid choices for the card= insmod option:\n", + printk("%s: Here is a list of valid choices for the card= insmod option:\n", dev->name); for (i = 0; i < em28xx_bcount; i++) { - em28xx_errdev(" card=%d -> %s\n", i, - em28xx_boards[i].name); + printk("%s: card=%d -> %s\n", + dev->name, i, em28xx_boards[i].name); } } @@ -1825,12 +1938,15 @@ static void em28xx_usb_disconnect(struct usb_interface *interface) struct em28xx *dev = usb_get_intfdata(interface); usb_set_intfdata(interface, NULL); +/*FIXME: IR should be disconnected */ + if (!dev) return; + down_write(&em28xx_disconnect); - mutex_lock(&dev->lock); + down(&dev->lock); em28xx_info("disconnecting %s\n", dev->vdev->name); @@ -1839,9 +1955,7 @@ static void em28xx_usb_disconnect(struct usb_interface *interface) if (dev->users) { em28xx_warn ("device /dev/video%d is open! Deregistration and memory " - "deallocation are deferred on close.\n", - dev->vdev->minor-MINOR_VFL_TYPE_GRABBER_MIN); - + "deallocation are deferred on close.\n", dev->vdev->minor); dev->state |= DEV_MISCONFIGURED; em28xx_uninit_isoc(dev); dev->state |= DEV_DISCONNECTED; @@ -1852,7 +1966,7 @@ static void em28xx_usb_disconnect(struct usb_interface *interface) em28xx_release_resources(dev); } - mutex_unlock(&dev->lock); + up(&dev->lock); if (!dev->users) { kfree(dev->alt_max_pkt_size); diff --git a/drivers/media/video/em28xx/em28xx.h b/drivers/media/video/em28xx/em28xx.h index d8fcc9e17..33de9d846 100644 --- a/drivers/media/video/em28xx/em28xx.h +++ b/drivers/media/video/em28xx/em28xx.h @@ -3,7 +3,7 @@ Copyright (C) 2005 Markus Rechberger Ludovico Cavedon - Mauro Carvalho Chehab + Mauro Carvalho Chehab Based on the em2800 driver from Sascha Sommer @@ -27,7 +27,6 @@ #include #include -#include #include /* Boards supported by driver */ @@ -42,10 +41,6 @@ #define EM2800_BOARD_LEADTEK_WINFAST_USBII 7 #define EM2800_BOARD_KWORLD_USB2800 8 #define EM2820_BOARD_PINNACLE_DVC_90 9 -#define EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900 10 -#define EM2880_BOARD_TERRATEC_HYBRID_XS 11 -#define EM2820_BOARD_KWORLD_PVRTV2800RF 12 -#define EM2880_BOARD_TERRATEC_PRODIGY_XS 13 #define UNSET -1 @@ -214,7 +209,6 @@ struct em28xx { /* generic device properties */ char name[30]; /* name (including minor) of the device */ int model; /* index in the device_data struct */ - int devno; /* marks the number of this device */ unsigned int is_em2800; int video_inputs; /* number of video inputs */ struct list_head devlist; @@ -262,7 +256,7 @@ struct em28xx { enum em28xx_stream_state stream; enum em28xx_io_method io; /* locks */ - struct mutex lock, fileop_lock; + struct semaphore lock, fileop_lock; spinlock_t queue_lock; struct list_head inqueue, outqueue; wait_queue_head_t open, wait_frame, wait_stream; @@ -319,14 +313,19 @@ int em28xx_audio_analog_set(struct em28xx *dev); int em28xx_colorlevels_set_default(struct em28xx *dev); int em28xx_capture_start(struct em28xx *dev, int start); int em28xx_outfmt_set_yuv422(struct em28xx *dev); +int em28xx_accumulator_set(struct em28xx *dev, u8 xmin, u8 xmax, u8 ymin, + u8 ymax); +int em28xx_capture_area_set(struct em28xx *dev, u8 hstart, u8 vstart, + u16 width, u16 height); +int em28xx_scaler_set(struct em28xx *dev, u16 h, u16 v); int em28xx_resolution_set(struct em28xx *dev); +void em28xx_isocIrq(struct urb *urb, struct pt_regs *regs); int em28xx_init_isoc(struct em28xx *dev); void em28xx_uninit_isoc(struct em28xx *dev); int em28xx_set_alternate(struct em28xx *dev); /* Provided by em28xx-cards.c */ extern int em2800_variant_detect(struct usb_device* udev,int model); -extern void em28xx_pre_card_setup(struct em28xx *dev); extern void em28xx_card_setup(struct em28xx *dev); extern struct em28xx_board em28xx_boards[]; extern struct usb_device_id em28xx_id_table[]; diff --git a/drivers/media/video/hexium_gemini.c b/drivers/media/video/hexium_gemini.c index c7fed3405..e7bbeb115 100644 --- a/drivers/media/video/hexium_gemini.c +++ b/drivers/media/video/hexium_gemini.c @@ -1,9 +1,9 @@ /* hexium_gemini.c - v4l2 driver for Hexium Gemini frame grabber cards - + Visit http://www.mihu.de/linux/saa7146/ and follow the link to "hexium" for further details about this card. - + Copyright (C) 2003 Michael Hunold This program is free software; you can redistribute it and/or modify @@ -81,7 +81,7 @@ struct hexium struct video_device *video_dev; struct i2c_adapter i2c_adapter; - + int cur_input; /* current input */ v4l2_std_id cur_std; /* current standard */ int cur_bw; /* current black/white status */ @@ -174,7 +174,7 @@ static struct saa7146_standard hexium_standards[] = { .h_offset = 1, .h_pixels = 720, .v_max_out = 576, .h_max_out = 768, } -}; +}; /* bring hardware to a sane state. this has to be done, just in case someone wants to capture from this device before it has been properly initialized. @@ -311,7 +311,7 @@ static int hexium_ioctl(struct saa7146_fh *fh, unsigned int cmd, void *arg) struct saa7146_dev *dev = fh->dev; struct hexium *hexium = (struct hexium *) dev->ext_priv; /* - struct saa7146_vv *vv = dev->vv_data; + struct saa7146_vv *vv = dev->vv_data; */ switch (cmd) { case VIDIOC_ENUMINPUT: diff --git a/drivers/media/video/hexium_orion.c b/drivers/media/video/hexium_orion.c index 137c4736d..aad4a18aa 100644 --- a/drivers/media/video/hexium_orion.c +++ b/drivers/media/video/hexium_orion.c @@ -3,7 +3,7 @@ Visit http://www.mihu.de/linux/saa7146/ and follow the link to "hexium" for further details about this card. - + Copyright (C) 2003 Michael Hunold This program is free software; you can redistribute it and/or modify @@ -69,7 +69,7 @@ struct hexium { int type; struct video_device *video_dev; - struct i2c_adapter i2c_adapter; + struct i2c_adapter i2c_adapter; int cur_input; /* current input */ }; @@ -86,7 +86,7 @@ static u8 hexium_saa7110[53]={ }; static struct { - struct hexium_data data[8]; + struct hexium_data data[8]; } hexium_input_select[] = { { { /* cvbs 1 */ @@ -153,7 +153,7 @@ static struct { { 0x30, 0x60 }, { 0x31, 0xB5 }, // ?? { 0x21, 0x03 }, - } + } }, { { /* y/c 1 */ { 0x06, 0x80 }, @@ -187,7 +187,7 @@ static struct { { 0x31, 0x75 }, { 0x21, 0x21 }, } -} +} }; static struct saa7146_standard hexium_standards[] = { @@ -207,7 +207,7 @@ static struct saa7146_standard hexium_standards[] = { .h_offset = 1, .h_pixels = 720, .v_max_out = 576, .h_max_out = 768, } -}; +}; /* this is only called for old HV-PCI6/Orion cards without eeprom */ @@ -272,7 +272,7 @@ static int hexium_probe(struct saa7146_dev *dev) return 0; } - /* check if this is an old hexium Orion card by looking at + /* check if this is an old hexium Orion card by looking at a saa7110 at address 0x4e */ if (0 == (err = i2c_smbus_xfer(&hexium->i2c_adapter, 0x4e, 0, I2C_SMBUS_READ, 0x00, I2C_SMBUS_BYTE_DATA, &data))) { printk("hexium_orion: device is a Hexium HV-PCI6/Orion (old).\n"); @@ -314,7 +314,7 @@ static int hexium_set_input(struct hexium *hexium, int input) { union i2c_smbus_data data; int i = 0; - + DEB_D((".\n")); for (i = 0; i < 8; i++) { @@ -375,7 +375,7 @@ static int hexium_ioctl(struct saa7146_fh *fh, unsigned int cmd, void *arg) struct saa7146_dev *dev = fh->dev; struct hexium *hexium = (struct hexium *) dev->ext_priv; /* - struct saa7146_vv *vv = dev->vv_data; + struct saa7146_vv *vv = dev->vv_data; */ switch (cmd) { case VIDIOC_ENUMINPUT: diff --git a/drivers/media/video/ir-kbd-i2c.c b/drivers/media/video/ir-kbd-i2c.c index fba30a40e..58b0e6982 100644 --- a/drivers/media/video/ir-kbd-i2c.c +++ b/drivers/media/video/ir-kbd-i2c.c @@ -44,17 +44,51 @@ #include #include +/* Mark Phalan */ +static IR_KEYTAB_TYPE ir_codes_pv951[IR_KEYTAB_SIZE] = { + [ 0 ] = KEY_KP0, + [ 1 ] = KEY_KP1, + [ 2 ] = KEY_KP2, + [ 3 ] = KEY_KP3, + [ 4 ] = KEY_KP4, + [ 5 ] = KEY_KP5, + [ 6 ] = KEY_KP6, + [ 7 ] = KEY_KP7, + [ 8 ] = KEY_KP8, + [ 9 ] = KEY_KP9, + + [ 18 ] = KEY_POWER, + [ 16 ] = KEY_MUTE, + [ 31 ] = KEY_VOLUMEDOWN, + [ 27 ] = KEY_VOLUMEUP, + [ 26 ] = KEY_CHANNELUP, + [ 30 ] = KEY_CHANNELDOWN, + [ 14 ] = KEY_PAGEUP, + [ 29 ] = KEY_PAGEDOWN, + [ 19 ] = KEY_SOUND, + + [ 24 ] = KEY_KPPLUSMINUS, /* CH +/- */ + [ 22 ] = KEY_SUBTITLE, /* CC */ + [ 13 ] = KEY_TEXT, /* TTX */ + [ 11 ] = KEY_TV, /* AIR/CBL */ + [ 17 ] = KEY_PC, /* PC/TV */ + [ 23 ] = KEY_OK, /* CH RTN */ + [ 25 ] = KEY_MODE, /* FUNC */ + [ 12 ] = KEY_SEARCH, /* AUTOSCAN */ + + /* Not sure what to do with these ones! */ + [ 15 ] = KEY_SELECT, /* SOURCE */ + [ 10 ] = KEY_KPPLUS, /* +100 */ + [ 20 ] = KEY_KPEQUAL, /* SYNC */ + [ 28 ] = KEY_MEDIA, /* PC/TV */ +}; + /* ----------------------------------------------------------------------- */ /* insmod parameters */ static int debug; module_param(debug, int, 0644); /* debug level (0,1,2) */ -static int hauppauge = 0; -module_param(hauppauge, int, 0644); /* Choose Hauppauge remote */ -MODULE_PARM_DESC(hauppauge, "Specify Hauppauge remote: 0=black, 1=grey (defaults to 0)"); - - #define DEVNAME "ir-kbd-i2c" #define dprintk(level, fmt, arg...) if (debug >= level) \ printk(KERN_DEBUG DEVNAME ": " fmt , ## arg) @@ -150,11 +184,12 @@ static int get_key_knc1(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw) return 1; } -/* Common (grey or coloured) pinnacle PCTV remote handling +/* The new pinnacle PCTV remote (with the colored buttons) * + * Ricardo Cerqueira */ -static int get_key_pinnacle(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw, - int parity_offset, int marker, int code_modulo) + +int get_key_pinnacle(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw) { unsigned char b[4]; unsigned int start = 0,parity = 0,code = 0; @@ -166,9 +201,9 @@ static int get_key_pinnacle(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw, } for (start = 0; start<4; start++) { - if (b[start] == marker) { - code=b[(start+parity_offset+1)%4]; - parity=b[(start+parity_offset)%4]; + if (b[start] == 0x80) { + code=b[(start+3)%4]; + parity=b[(start+2)%4]; } } @@ -180,14 +215,16 @@ static int get_key_pinnacle(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw, if (ir->old == parity) return 0; + ir->old = parity; - /* drop special codes when a key is held down a long time for the grey controller - In this case, the second bit of the code is asserted */ - if (marker == 0xfe && (code & 0x40)) - return 0; + /* Reduce code value to fit inside IR_KEYTAB_SIZE + * + * this is the only value that results in 42 unique + * codes < 128 + */ - code %= code_modulo; + code %= 0x88; *ir_raw = code; *ir_key = code; @@ -197,40 +234,7 @@ static int get_key_pinnacle(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw, return 1; } -/* The grey pinnacle PCTV remote - * - * There are one issue with this remote: - * - I2c packet does not change when the same key is pressed quickly. The workaround - * is to hold down each key for about half a second, so that another code is generated - * in the i2c packet, and the function can distinguish key presses. - * - * Sylvain Pasche - */ -int get_key_pinnacle_grey(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw) -{ - - return get_key_pinnacle(ir, ir_key, ir_raw, 1, 0xfe, 0xff); -} - -EXPORT_SYMBOL_GPL(get_key_pinnacle_grey); - - -/* The new pinnacle PCTV remote (with the colored buttons) - * - * Ricardo Cerqueira - */ -int get_key_pinnacle_color(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw) -{ - /* code_modulo parameter (0x88) is used to reduce code value to fit inside IR_KEYTAB_SIZE - * - * this is the only value that results in 42 unique - * codes < 128 - */ - - return get_key_pinnacle(ir, ir_key, ir_raw, 2, 0x80, 0x88); -} - -EXPORT_SYMBOL_GPL(get_key_pinnacle_color); +EXPORT_SYMBOL_GPL(get_key_pinnacle); /* ----------------------------------------------------------------------- */ @@ -332,11 +336,7 @@ static int ir_attach(struct i2c_adapter *adap, int addr, name = "Hauppauge"; ir->get_key = get_key_haup; ir_type = IR_TYPE_RC5; - if (hauppauge == 1) { - ir_codes = ir_codes_hauppauge_new; - } else { - ir_codes = ir_codes_rc5_tv; - } + ir_codes = ir_codes_rc5_tv; break; case 0x30: name = "KNC One"; @@ -441,9 +441,6 @@ static int ir_probe(struct i2c_adapter *adap) case I2C_HW_B_BT848: probe = probe_bttv; break; - case I2C_HW_B_CX2341X: - probe = probe_bttv; - break; case I2C_HW_SAA7134: probe = probe_saa7134; break; diff --git a/drivers/media/video/meye.c b/drivers/media/video/meye.c index e278753f8..2869464ae 100644 --- a/drivers/media/video/meye.c +++ b/drivers/media/video/meye.c @@ -26,12 +26,12 @@ * 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 @@ -925,7 +925,7 @@ static int meye_do_ioctl(struct inode *inode, struct file *file, return -EINVAL; if (p->palette != VIDEO_PALETTE_YUV422) return -EINVAL; - mutex_lock(&meye.lock); + down(&meye.lock); sonypi_camera_command(SONYPI_COMMAND_SETCAMERABRIGHTNESS, p->brightness >> 10); sonypi_camera_command(SONYPI_COMMAND_SETCAMERAHUE, @@ -935,7 +935,7 @@ static int meye_do_ioctl(struct inode *inode, struct file *file, sonypi_camera_command(SONYPI_COMMAND_SETCAMERACONTRAST, p->contrast >> 10); meye.picture = *p; - mutex_unlock(&meye.lock); + up(&meye.lock); break; } @@ -946,21 +946,21 @@ static int meye_do_ioctl(struct inode *inode, struct file *file, if (*i < 0 || *i >= gbuffers) return -EINVAL; - mutex_lock(&meye.lock); + down(&meye.lock); switch (meye.grab_buffer[*i].state) { case MEYE_BUF_UNUSED: - mutex_unlock(&meye.lock); + up(&meye.lock); return -EINVAL; case MEYE_BUF_USING: if (file->f_flags & O_NONBLOCK) { - mutex_unlock(&meye.lock); + up(&meye.lock); return -EAGAIN; } if (wait_event_interruptible(meye.proc_list, (meye.grab_buffer[*i].state != MEYE_BUF_USING))) { - mutex_unlock(&meye.lock); + up(&meye.lock); return -EINTR; } /* fall through */ @@ -968,7 +968,7 @@ static int meye_do_ioctl(struct inode *inode, struct file *file, meye.grab_buffer[*i].state = MEYE_BUF_UNUSED; kfifo_get(meye.doneq, (unsigned char *)&unused, sizeof(int)); } - mutex_unlock(&meye.lock); + up(&meye.lock); break; } @@ -987,7 +987,7 @@ static int meye_do_ioctl(struct inode *inode, struct file *file, if (meye.grab_buffer[vm->frame].state != MEYE_BUF_UNUSED) return -EBUSY; - mutex_lock(&meye.lock); + down(&meye.lock); if (vm->width == 640 && vm->height == 480) { if (meye.params.subsample) { meye.params.subsample = 0; @@ -999,7 +999,7 @@ static int meye_do_ioctl(struct inode *inode, struct file *file, restart = 1; } } else { - mutex_unlock(&meye.lock); + up(&meye.lock); return -EINVAL; } @@ -1007,7 +1007,7 @@ static int meye_do_ioctl(struct inode *inode, struct file *file, mchip_continuous_start(); meye.grab_buffer[vm->frame].state = MEYE_BUF_USING; kfifo_put(meye.grabq, (unsigned char *)&vm->frame, sizeof(int)); - mutex_unlock(&meye.lock); + up(&meye.lock); break; } @@ -1039,7 +1039,7 @@ static int meye_do_ioctl(struct inode *inode, struct file *file, return -EINVAL; if (jp->framerate > 31) return -EINVAL; - mutex_lock(&meye.lock); + down(&meye.lock); if (meye.params.subsample != jp->subsample || meye.params.quality != jp->quality) mchip_hic_stop(); /* need restart */ @@ -1050,7 +1050,7 @@ static int meye_do_ioctl(struct inode *inode, struct file *file, meye.params.agc); sonypi_camera_command(SONYPI_COMMAND_SETCAMERAPICTURE, meye.params.picture); - mutex_unlock(&meye.lock); + up(&meye.lock); break; } @@ -1068,12 +1068,12 @@ static int meye_do_ioctl(struct inode *inode, struct file *file, } if (meye.grab_buffer[*nb].state != MEYE_BUF_UNUSED) return -EBUSY; - mutex_lock(&meye.lock); + down(&meye.lock); if (meye.mchip_mode != MCHIP_HIC_MODE_CONT_COMP) mchip_cont_compression_start(); meye.grab_buffer[*nb].state = MEYE_BUF_USING; kfifo_put(meye.grabq, (unsigned char *)nb, sizeof(int)); - mutex_unlock(&meye.lock); + up(&meye.lock); break; } @@ -1084,20 +1084,20 @@ static int meye_do_ioctl(struct inode *inode, struct file *file, if (*i < 0 || *i >= gbuffers) return -EINVAL; - mutex_lock(&meye.lock); + down(&meye.lock); switch (meye.grab_buffer[*i].state) { case MEYE_BUF_UNUSED: - mutex_unlock(&meye.lock); + up(&meye.lock); return -EINVAL; case MEYE_BUF_USING: if (file->f_flags & O_NONBLOCK) { - mutex_unlock(&meye.lock); + up(&meye.lock); return -EAGAIN; } if (wait_event_interruptible(meye.proc_list, (meye.grab_buffer[*i].state != MEYE_BUF_USING))) { - mutex_unlock(&meye.lock); + up(&meye.lock); return -EINTR; } /* fall through */ @@ -1106,7 +1106,7 @@ static int meye_do_ioctl(struct inode *inode, struct file *file, kfifo_get(meye.doneq, (unsigned char *)&unused, sizeof(int)); } *i = meye.grab_buffer[*i].size; - mutex_unlock(&meye.lock); + up(&meye.lock); break; } @@ -1116,14 +1116,14 @@ static int meye_do_ioctl(struct inode *inode, struct file *file, return -EINVAL; if (meye.grab_buffer[0].state != MEYE_BUF_UNUSED) return -EBUSY; - mutex_lock(&meye.lock); + down(&meye.lock); meye.grab_buffer[0].state = MEYE_BUF_USING; mchip_take_picture(); mchip_get_picture( meye.grab_fbuffer, mchip_hsize() * mchip_vsize() * 2); meye.grab_buffer[0].state = MEYE_BUF_DONE; - mutex_unlock(&meye.lock); + up(&meye.lock); break; } @@ -1134,7 +1134,7 @@ static int meye_do_ioctl(struct inode *inode, struct file *file, return -EINVAL; if (meye.grab_buffer[0].state != MEYE_BUF_UNUSED) return -EBUSY; - mutex_lock(&meye.lock); + down(&meye.lock); meye.grab_buffer[0].state = MEYE_BUF_USING; *len = -1; while (*len == -1) { @@ -1142,7 +1142,7 @@ static int meye_do_ioctl(struct inode *inode, struct file *file, *len = mchip_compress_frame(meye.grab_fbuffer, gbufsize); } meye.grab_buffer[0].state = MEYE_BUF_DONE; - mutex_unlock(&meye.lock); + up(&meye.lock); break; } @@ -1285,7 +1285,7 @@ static int meye_do_ioctl(struct inode *inode, struct file *file, case VIDIOC_S_CTRL: { struct v4l2_control *c = arg; - mutex_lock(&meye.lock); + down(&meye.lock); switch (c->id) { case V4L2_CID_BRIGHTNESS: sonypi_camera_command( @@ -1329,17 +1329,17 @@ static int meye_do_ioctl(struct inode *inode, struct file *file, meye.params.framerate = c->value; break; default: - mutex_unlock(&meye.lock); + up(&meye.lock); return -EINVAL; } - mutex_unlock(&meye.lock); + up(&meye.lock); break; } case VIDIOC_G_CTRL: { struct v4l2_control *c = arg; - mutex_lock(&meye.lock); + down(&meye.lock); switch (c->id) { case V4L2_CID_BRIGHTNESS: c->value = meye.picture.brightness >> 10; @@ -1369,10 +1369,10 @@ static int meye_do_ioctl(struct inode *inode, struct file *file, c->value = meye.params.framerate; break; default: - mutex_unlock(&meye.lock); + up(&meye.lock); return -EINVAL; } - mutex_unlock(&meye.lock); + up(&meye.lock); break; } @@ -1469,7 +1469,7 @@ static int meye_do_ioctl(struct inode *inode, struct file *file, f->fmt.pix.field != V4L2_FIELD_NONE) return -EINVAL; f->fmt.pix.field = V4L2_FIELD_NONE; - mutex_lock(&meye.lock); + down(&meye.lock); if (f->fmt.pix.width <= 320) { f->fmt.pix.width = 320; f->fmt.pix.height = 240; @@ -1487,7 +1487,7 @@ static int meye_do_ioctl(struct inode *inode, struct file *file, meye.mchip_mode = MCHIP_HIC_MODE_CONT_COMP; break; } - mutex_unlock(&meye.lock); + up(&meye.lock); f->fmt.pix.bytesperline = f->fmt.pix.width * 2; f->fmt.pix.sizeimage = f->fmt.pix.height * f->fmt.pix.bytesperline; @@ -1509,11 +1509,11 @@ static int meye_do_ioctl(struct inode *inode, struct file *file, /* already allocated, no modifications */ break; } - mutex_lock(&meye.lock); + down(&meye.lock); if (meye.grab_fbuffer) { for (i = 0; i < gbuffers; i++) if (meye.vma_use_count[i]) { - mutex_unlock(&meye.lock); + up(&meye.lock); return -EINVAL; } rvfree(meye.grab_fbuffer, gbuffers * gbufsize); @@ -1525,12 +1525,12 @@ static int meye_do_ioctl(struct inode *inode, struct file *file, if (!meye.grab_fbuffer) { printk(KERN_ERR "meye: v4l framebuffer allocation" " failed\n"); - mutex_unlock(&meye.lock); + up(&meye.lock); return -ENOMEM; } for (i = 0; i < gbuffers; i++) meye.vma_use_count[i] = 0; - mutex_unlock(&meye.lock); + up(&meye.lock); break; } @@ -1569,12 +1569,12 @@ static int meye_do_ioctl(struct inode *inode, struct file *file, return -EINVAL; if (meye.grab_buffer[buf->index].state != MEYE_BUF_UNUSED) return -EINVAL; - mutex_lock(&meye.lock); + down(&meye.lock); buf->flags |= V4L2_BUF_FLAG_QUEUED; buf->flags &= ~V4L2_BUF_FLAG_DONE; meye.grab_buffer[buf->index].state = MEYE_BUF_USING; kfifo_put(meye.grabq, (unsigned char *)&buf->index, sizeof(int)); - mutex_unlock(&meye.lock); + up(&meye.lock); break; } @@ -1587,23 +1587,23 @@ static int meye_do_ioctl(struct inode *inode, struct file *file, if (buf->memory != V4L2_MEMORY_MMAP) return -EINVAL; - mutex_lock(&meye.lock); + down(&meye.lock); if (kfifo_len(meye.doneq) == 0 && file->f_flags & O_NONBLOCK) { - mutex_unlock(&meye.lock); + up(&meye.lock); return -EAGAIN; } if (wait_event_interruptible(meye.proc_list, kfifo_len(meye.doneq) != 0) < 0) { - mutex_unlock(&meye.lock); + up(&meye.lock); return -EINTR; } if (!kfifo_get(meye.doneq, (unsigned char *)&reqnr, sizeof(int))) { - mutex_unlock(&meye.lock); + up(&meye.lock); return -EBUSY; } if (meye.grab_buffer[reqnr].state != MEYE_BUF_DONE) { - mutex_unlock(&meye.lock); + up(&meye.lock); return -EINVAL; } buf->index = reqnr; @@ -1616,12 +1616,12 @@ static int meye_do_ioctl(struct inode *inode, struct file *file, buf->m.offset = reqnr * gbufsize; buf->length = gbufsize; meye.grab_buffer[reqnr].state = MEYE_BUF_UNUSED; - mutex_unlock(&meye.lock); + up(&meye.lock); break; } case VIDIOC_STREAMON: { - mutex_lock(&meye.lock); + down(&meye.lock); switch (meye.mchip_mode) { case MCHIP_HIC_MODE_CONT_OUT: mchip_continuous_start(); @@ -1630,23 +1630,23 @@ static int meye_do_ioctl(struct inode *inode, struct file *file, mchip_cont_compression_start(); break; default: - mutex_unlock(&meye.lock); + up(&meye.lock); return -EINVAL; } - mutex_unlock(&meye.lock); + up(&meye.lock); break; } case VIDIOC_STREAMOFF: { int i; - mutex_lock(&meye.lock); + down(&meye.lock); mchip_hic_stop(); kfifo_reset(meye.grabq); kfifo_reset(meye.doneq); for (i = 0; i < MEYE_MAX_BUFNBRS; i++) meye.grab_buffer[i].state = MEYE_BUF_UNUSED; - mutex_unlock(&meye.lock); + up(&meye.lock); break; } @@ -1672,23 +1672,23 @@ static unsigned int meye_poll(struct file *file, poll_table *wait) { unsigned int res = 0; - mutex_lock(&meye.lock); + down(&meye.lock); poll_wait(file, &meye.proc_list, wait); if (kfifo_len(meye.doneq)) res = POLLIN | POLLRDNORM; - mutex_unlock(&meye.lock); + up(&meye.lock); return res; } static void meye_vm_open(struct vm_area_struct *vma) { - long idx = (long)vma->vm_private_data; + int idx = (int)vma->vm_private_data; meye.vma_use_count[idx]++; } static void meye_vm_close(struct vm_area_struct *vma) { - long idx = (long)vma->vm_private_data; + int idx = (int)vma->vm_private_data; meye.vma_use_count[idx]--; } @@ -1704,9 +1704,9 @@ static int meye_mmap(struct file *file, struct vm_area_struct *vma) unsigned long offset = vma->vm_pgoff << PAGE_SHIFT; unsigned long page, pos; - mutex_lock(&meye.lock); + down(&meye.lock); if (size > gbuffers * gbufsize) { - mutex_unlock(&meye.lock); + up(&meye.lock); return -EINVAL; } if (!meye.grab_fbuffer) { @@ -1716,7 +1716,7 @@ static int meye_mmap(struct file *file, struct vm_area_struct *vma) meye.grab_fbuffer = rvmalloc(gbuffers*gbufsize); if (!meye.grab_fbuffer) { printk(KERN_ERR "meye: v4l framebuffer allocation failed\n"); - mutex_unlock(&meye.lock); + up(&meye.lock); return -ENOMEM; } for (i = 0; i < gbuffers; i++) @@ -1727,7 +1727,7 @@ static int meye_mmap(struct file *file, struct vm_area_struct *vma) while (size > 0) { page = vmalloc_to_pfn((void *)pos); if (remap_pfn_range(vma, start, page, PAGE_SIZE, PAGE_SHARED)) { - mutex_unlock(&meye.lock); + up(&meye.lock); return -EAGAIN; } start += PAGE_SIZE; @@ -1744,7 +1744,7 @@ static int meye_mmap(struct file *file, struct vm_area_struct *vma) vma->vm_private_data = (void *) (offset / gbufsize); meye_vm_open(vma); - mutex_unlock(&meye.lock); + up(&meye.lock); return 0; } @@ -1881,7 +1881,7 @@ static int __devinit meye_probe(struct pci_dev *pcidev, meye.mchip_irq = pcidev->irq; if (request_irq(meye.mchip_irq, meye_irq, - IRQF_DISABLED | IRQF_SHARED, "meye", meye_irq)) { + SA_INTERRUPT | SA_SHIRQ, "meye", meye_irq)) { printk(KERN_ERR "meye: request_irq failed\n"); goto outreqirq; } @@ -1913,7 +1913,7 @@ static int __devinit meye_probe(struct pci_dev *pcidev, goto outvideoreg; } - mutex_init(&meye.lock); + init_MUTEX(&meye.lock); init_waitqueue_head(&meye.proc_list); meye.picture.depth = 16; meye.picture.palette = VIDEO_PALETTE_YUV422; diff --git a/drivers/media/video/meye.h b/drivers/media/video/meye.h index ea107cb5c..e8cd897b0 100644 --- a/drivers/media/video/meye.h +++ b/drivers/media/video/meye.h @@ -36,6 +36,7 @@ #define MEYE_DRIVER_VERSION __stringify(MEYE_DRIVER_MAJORVERSION) "." \ __stringify(MEYE_DRIVER_MINORVERSION) +#include #include #include #include @@ -259,8 +260,6 @@ /* private API definitions */ #include -#include - /* Enable jpg software correction */ #define MEYE_JPEG_CORRECTION 1 @@ -302,7 +301,7 @@ struct meye { /* list of buffers */ struct meye_grab_buffer grab_buffer[MEYE_MAX_BUFNBRS]; int vma_use_count[MEYE_MAX_BUFNBRS]; /* mmap count */ - struct mutex lock; /* mutex for open/mmap... */ + struct semaphore lock; /* semaphore for open/mmap... */ struct kfifo *grabq; /* queue for buffers to be grabbed */ spinlock_t grabq_lock; /* lock protecting the queue */ struct kfifo *doneq; /* queue for grabbed buffers */ diff --git a/drivers/media/video/msp3400-driver.c b/drivers/media/video/msp3400-driver.c index cf43df3fe..69ed369c2 100644 --- a/drivers/media/video/msp3400-driver.c +++ b/drivers/media/video/msp3400-driver.c @@ -53,11 +53,10 @@ #include #include #include -#include -#include +#include #include #include -#include "msp3400-driver.h" +#include "msp3400.h" /* ---------------------------------------------------------------------- */ @@ -246,31 +245,31 @@ int msp_write_dsp(struct i2c_client *client, int addr, int val) * ----------------------------------------------------------------------- */ static int scarts[3][9] = { - /* MASK IN1 IN2 IN3 IN4 IN1_DA IN2_DA MONO MUTE */ + /* MASK IN1 IN2 IN1_DA IN2_DA IN3 IN4 MONO MUTE */ /* SCART DSP Input select */ - { 0x0320, 0x0000, 0x0200, 0x0300, 0x0020, -1, -1, 0x0100, 0x0320 }, + { 0x0320, 0x0000, 0x0200, -1, -1, 0x0300, 0x0020, 0x0100, 0x0320 }, /* SCART1 Output select */ - { 0x0c40, 0x0440, 0x0400, 0x0000, 0x0840, 0x0c00, 0x0040, 0x0800, 0x0c40 }, + { 0x0c40, 0x0440, 0x0400, 0x0c00, 0x0040, 0x0000, 0x0840, 0x0800, 0x0c40 }, /* SCART2 Output select */ - { 0x3080, 0x1000, 0x1080, 0x2080, 0x3080, 0x0000, 0x0080, 0x2000, 0x3000 }, + { 0x3080, 0x1000, 0x1080, 0x0000, 0x0080, 0x2080, 0x3080, 0x2000, 0x3000 }, }; static char *scart_names[] = { - "in1", "in2", "in3", "in4", "in1 da", "in2 da", "mono", "mute" + "mask", "in1", "in2", "in1 da", "in2 da", "in3", "in4", "mono", "mute" }; void msp_set_scart(struct i2c_client *client, int in, int out) { struct msp_state *state = i2c_get_clientdata(client); - state->in_scart = in; + state->in_scart=in; - if (in >= 0 && in <= 7 && out >= 0 && out <= 2) { - if (-1 == scarts[out][in + 1]) + if (in >= 1 && in <= 8 && out >= 0 && out <= 2) { + if (-1 == scarts[out][in]) return; - state->acb &= ~scarts[out][0]; - state->acb |= scarts[out][in + 1]; + state->acb &= ~scarts[out][SCART_MASK]; + state->acb |= scarts[out][in]; } else state->acb = 0xf60; /* Mute Input and SCART 1 Output */ @@ -279,8 +278,20 @@ void msp_set_scart(struct i2c_client *client, int in, int out) msp_write_dsp(client, 0x13, state->acb); /* Sets I2S speed 0 = 1.024 Mbps, 1 = 2.048 Mbps */ - if (state->has_i2s_conf) - msp_write_dem(client, 0x40, state->i2s_mode); + msp_write_dem(client, 0x40, state->i2s_mode); +} + +void msp_set_mute(struct i2c_client *client) +{ + struct msp_state *state = i2c_get_clientdata(client); + + v4l_dbg(1, msp_debug, client, "mute audio\n"); + msp_write_dsp(client, 0x0000, 0); + msp_write_dsp(client, 0x0007, 1); + if (state->has_scart2_out_volume) + msp_write_dsp(client, 0x0040, 1); + if (state->has_headphones) + msp_write_dsp(client, 0x0006, 0); } void msp_set_audio(struct i2c_client *client) @@ -288,19 +299,17 @@ void msp_set_audio(struct i2c_client *client) struct msp_state *state = i2c_get_clientdata(client); int bal = 0, bass, treble, loudness; int val = 0; - int reallymuted = state->muted | state->scan_in_progress; - if (!reallymuted) + if (!state->muted) val = (state->volume * 0x7f / 65535) << 8; - v4l_dbg(1, msp_debug, client, "mute=%s scanning=%s volume=%d\n", - state->muted ? "on" : "off", state->scan_in_progress ? "yes" : "no", - state->volume); + v4l_dbg(1, msp_debug, client, "mute=%s volume=%d\n", + state->muted ? "on" : "off", state->volume); msp_write_dsp(client, 0x0000, val); - msp_write_dsp(client, 0x0007, reallymuted ? 0x1 : (val | 0x1)); + msp_write_dsp(client, 0x0007, state->muted ? 0x1 : (val | 0x1)); if (state->has_scart2_out_volume) - msp_write_dsp(client, 0x0040, reallymuted ? 0x1 : (val | 0x1)); + msp_write_dsp(client, 0x0040, state->muted ? 0x1 : (val | 0x1)); if (state->has_headphones) msp_write_dsp(client, 0x0006, val); if (!state->has_sound_processing) @@ -327,6 +336,37 @@ void msp_set_audio(struct i2c_client *client) msp_write_dsp(client, 0x0033, loudness); } +int msp_modus(struct i2c_client *client) +{ + struct msp_state *state = i2c_get_clientdata(client); + + if (state->radio) { + v4l_dbg(1, msp_debug, client, "video mode selected to Radio\n"); + return 0x0003; + } + + if (state->v4l2_std & V4L2_STD_PAL) { + v4l_dbg(1, msp_debug, client, "video mode selected to PAL\n"); + +#if 1 + /* experimental: not sure this works with all chip versions */ + return 0x7003; +#else + /* previous value, try this if it breaks ... */ + return 0x1003; +#endif + } + if (state->v4l2_std & V4L2_STD_NTSC) { + v4l_dbg(1, msp_debug, client, "video mode selected to NTSC\n"); + return 0x2003; + } + if (state->v4l2_std & V4L2_STD_SECAM) { + v4l_dbg(1, msp_debug, client, "video mode selected to SECAM\n"); + return 0x0003; + } + return 0x0003; +} + /* ------------------------------------------------------------------------ */ @@ -336,6 +376,7 @@ static void msp_wake_thread(struct i2c_client *client) if (NULL == state->kthread) return; + msp_set_mute(client); state->watch_stereo = 0; state->restart = 1; wake_up_interruptible(&state->wq); @@ -362,16 +403,20 @@ int msp_sleep(struct msp_state *state, int timeout) } /* ------------------------------------------------------------------------ */ -#ifdef CONFIG_VIDEO_V4L1 -static int msp_mode_v4l2_to_v4l1(int rxsubchans, int audmode) + +static int msp_mode_v4l2_to_v4l1(int rxsubchans) { - if (rxsubchans == V4L2_TUNER_SUB_MONO) - return VIDEO_SOUND_MONO; - if (rxsubchans == V4L2_TUNER_SUB_STEREO) - return VIDEO_SOUND_STEREO; - if (audmode == V4L2_TUNER_MODE_LANG2) - return VIDEO_SOUND_LANG2; - return VIDEO_SOUND_LANG1; + int mode = 0; + + if (rxsubchans & V4L2_TUNER_SUB_STEREO) + mode |= VIDEO_SOUND_STEREO; + if (rxsubchans & V4L2_TUNER_SUB_LANG2) + mode |= VIDEO_SOUND_LANG2; + if (rxsubchans & V4L2_TUNER_SUB_LANG1) + mode |= VIDEO_SOUND_LANG1; + if (mode == 0) + mode |= VIDEO_SOUND_MONO; + return mode; } static int msp_mode_v4l1_to_v4l2(int mode) @@ -384,7 +429,98 @@ static int msp_mode_v4l1_to_v4l2(int mode) return V4L2_TUNER_MODE_LANG1; return V4L2_TUNER_MODE_MONO; } -#endif + +static void msp_any_detect_stereo(struct i2c_client *client) +{ + struct msp_state *state = i2c_get_clientdata(client); + + switch (state->opmode) { + case OPMODE_MANUAL: + case OPMODE_AUTODETECT: + autodetect_stereo(client); + break; + case OPMODE_AUTOSELECT: + msp34xxg_detect_stereo(client); + break; + } +} + +static struct v4l2_queryctrl msp_qctrl_std[] = { + { + .id = V4L2_CID_AUDIO_VOLUME, + .name = "Volume", + .minimum = 0, + .maximum = 65535, + .step = 65535/100, + .default_value = 58880, + .flags = 0, + .type = V4L2_CTRL_TYPE_INTEGER, + },{ + .id = V4L2_CID_AUDIO_MUTE, + .name = "Mute", + .minimum = 0, + .maximum = 1, + .step = 1, + .default_value = 1, + .flags = 0, + .type = V4L2_CTRL_TYPE_BOOLEAN, + }, +}; + +static struct v4l2_queryctrl msp_qctrl_sound_processing[] = { + { + .id = V4L2_CID_AUDIO_BALANCE, + .name = "Balance", + .minimum = 0, + .maximum = 65535, + .step = 65535/100, + .default_value = 32768, + .flags = 0, + .type = V4L2_CTRL_TYPE_INTEGER, + },{ + .id = V4L2_CID_AUDIO_BASS, + .name = "Bass", + .minimum = 0, + .maximum = 65535, + .step = 65535/100, + .default_value = 32768, + .type = V4L2_CTRL_TYPE_INTEGER, + },{ + .id = V4L2_CID_AUDIO_TREBLE, + .name = "Treble", + .minimum = 0, + .maximum = 65535, + .step = 65535/100, + .default_value = 32768, + .type = V4L2_CTRL_TYPE_INTEGER, + },{ + .id = V4L2_CID_AUDIO_LOUDNESS, + .name = "Loudness", + .minimum = 0, + .maximum = 1, + .step = 1, + .default_value = 1, + .flags = 0, + .type = V4L2_CTRL_TYPE_BOOLEAN, + }, +}; + + +static void msp_any_set_audmode(struct i2c_client *client, int audmode) +{ + struct msp_state *state = i2c_get_clientdata(client); + + switch (state->opmode) { + case OPMODE_MANUAL: + case OPMODE_AUTODETECT: + state->watch_stereo = 0; + msp3400c_setstereo(client, audmode); + break; + case OPMODE_AUTOSELECT: + msp34xxg_set_audmode(client, audmode); + break; + } +} static int msp_get_ctrl(struct i2c_client *client, struct v4l2_control *ctrl) { @@ -480,11 +616,52 @@ static int msp_set_ctrl(struct i2c_client *client, struct v4l2_control *ctrl) static int msp_command(struct i2c_client *client, unsigned int cmd, void *arg) { struct msp_state *state = i2c_get_clientdata(client); + u16 *sarg = arg; + int scart = 0; if (msp_debug >= 2) v4l_i2c_print_ioctl(client, cmd); switch (cmd) { + case AUDC_SET_INPUT: + if (*sarg == state->input) + break; + state->input = *sarg; + switch (*sarg) { + case AUDIO_RADIO: + /* Hauppauge uses IN2 for the radio */ + state->mode = MSP_MODE_FM_RADIO; + scart = SCART_IN2; + break; + case AUDIO_EXTERN_1: + /* IN1 is often used for external input ... */ + state->mode = MSP_MODE_EXTERN; + scart = SCART_IN1; + break; + case AUDIO_EXTERN_2: + /* ... sometimes it is IN2 through ;) */ + state->mode = MSP_MODE_EXTERN; + scart = SCART_IN2; + break; + case AUDIO_TUNER: + state->mode = -1; + break; + default: + if (*sarg & AUDIO_MUTE) + msp_set_scart(client, SCART_MUTE, 0); + break; + } + if (scart) { + state->rxsubchans = V4L2_TUNER_SUB_STEREO; + state->audmode = V4L2_TUNER_MODE_STEREO; + msp_set_scart(client, scart, 0); + msp_write_dsp(client, 0x000d, 0x1900); + if (state->opmode != OPMODE_AUTOSELECT) + msp3400c_setstereo(client, state->audmode); + } + msp_wake_thread(client); + break; + case AUDC_SET_RADIO: if (state->radio) return 0; @@ -494,8 +671,8 @@ static int msp_command(struct i2c_client *client, unsigned int cmd, void *arg) switch (state->opmode) { case OPMODE_MANUAL: /* set msp3400 to FM radio mode */ - msp3400c_set_mode(client, MSP_MODE_FM_RADIO); - msp3400c_set_carrier(client, MSP_CARRIER(10.7), + msp3400c_setmode(client, MSP_MODE_FM_RADIO); + msp3400c_setcarrier(client, MSP_CARRIER(10.7), MSP_CARRIER(10.7)); msp_set_audio(client); break; @@ -510,7 +687,6 @@ static int msp_command(struct i2c_client *client, unsigned int cmd, void *arg) /* --- v4l ioctls --- */ /* take care: bttv does userspace copying, we'll get a kernel pointer here... */ -#ifdef CONFIG_VIDEO_V4L1 case VIDIOCGAUDIO: { struct video_audio *va = arg; @@ -530,8 +706,8 @@ static int msp_command(struct i2c_client *client, unsigned int cmd, void *arg) if (state->radio) break; if (state->opmode == OPMODE_AUTOSELECT) - msp_detect_stereo(client); - va->mode = msp_mode_v4l2_to_v4l1(state->rxsubchans, state->audmode); + msp_any_detect_stereo(client); + va->mode = msp_mode_v4l2_to_v4l1(state->rxsubchans); break; } @@ -546,11 +722,8 @@ static int msp_command(struct i2c_client *client, unsigned int cmd, void *arg) state->treble = va->treble; msp_set_audio(client); - if (va->mode != 0 && state->radio == 0 && - state->audmode != msp_mode_v4l1_to_v4l2(va->mode)) { - state->audmode = msp_mode_v4l1_to_v4l2(va->mode); - msp_set_audmode(client); - } + if (va->mode != 0 && state->radio == 0) + msp_any_set_audmode(client, msp_mode_v4l1_to_v4l2(va->mode)); break; } @@ -579,16 +752,19 @@ static int msp_command(struct i2c_client *client, unsigned int cmd, void *arg) } case VIDIOCSFREQ: + case VIDIOC_S_FREQUENCY: { /* new channel -- kick audio carrier scan */ msp_wake_thread(client); break; } -#endif - case VIDIOC_S_FREQUENCY: + + /* msp34xx specific */ + case MSP_SET_MATRIX: { - /* new channel -- kick audio carrier scan */ - msp_wake_thread(client); + struct msp_matrix *mspm = arg; + + msp_set_scart(client, mspm->input, mspm->output); break; } @@ -605,46 +781,100 @@ static int msp_command(struct i2c_client *client, unsigned int cmd, void *arg) return 0; } - case VIDIOC_INT_G_AUDIO_ROUTING: + case VIDIOC_ENUMINPUT: { - struct v4l2_routing *rt = arg; + struct v4l2_input *i = arg; - *rt = state->routing; - break; + if (i->index != 0) + return -EINVAL; + + i->type = V4L2_INPUT_TYPE_TUNER; + switch (i->index) { + case AUDIO_RADIO: + strcpy(i->name, "Radio"); + break; + case AUDIO_EXTERN_1: + strcpy(i->name, "Extern 1"); + break; + case AUDIO_EXTERN_2: + strcpy(i->name, "Extern 2"); + break; + case AUDIO_TUNER: + strcpy(i->name, "Television"); + break; + default: + return -EINVAL; + } + return 0; } - case VIDIOC_INT_S_AUDIO_ROUTING: + case VIDIOC_G_AUDIO: { - struct v4l2_routing *rt = arg; - int tuner = (rt->input >> 3) & 1; - int sc_in = rt->input & 0x7; - int sc1_out = rt->output & 0xf; - int sc2_out = (rt->output >> 4) & 0xf; - u16 val, reg; - int i; - int extern_input = 1; + struct v4l2_audio *a = arg; + + memset(a, 0, sizeof(*a)); - if (state->routing.input == rt->input && - state->routing.output == rt->output) + switch (a->index) { + case AUDIO_RADIO: + strcpy(a->name, "Radio"); + break; + case AUDIO_EXTERN_1: + strcpy(a->name, "Extern 1"); + break; + case AUDIO_EXTERN_2: + strcpy(a->name, "Extern 2"); break; - state->routing = *rt; - /* check if the tuner input is used */ - for (i = 0; i < 5; i++) { - if (((rt->input >> (4 + i * 4)) & 0xf) == 0) - extern_input = 0; + case AUDIO_TUNER: + strcpy(a->name, "Television"); + break; + default: + return -EINVAL; } - if (extern_input) + + msp_any_detect_stereo(client); + if (state->audmode == V4L2_TUNER_MODE_STEREO) { + a->capability = V4L2_AUDCAP_STEREO; + } + + break; + } + + case VIDIOC_S_AUDIO: + { + struct v4l2_audio *sarg = arg; + + switch (sarg->index) { + case AUDIO_RADIO: + /* Hauppauge uses IN2 for the radio */ + state->mode = MSP_MODE_FM_RADIO; + scart = SCART_IN2; + break; + case AUDIO_EXTERN_1: + /* IN1 is often used for external input ... */ state->mode = MSP_MODE_EXTERN; - else - state->mode = MSP_MODE_AM_DETECT; - msp_set_scart(client, sc_in, 0); - msp_set_scart(client, sc1_out, 1); - msp_set_scart(client, sc2_out, 2); - msp_set_audmode(client); - reg = (state->opmode == OPMODE_AUTOSELECT) ? 0x30 : 0xbb; - val = msp_read_dem(client, reg); - msp_write_dem(client, reg, (val & ~0x100) | (tuner << 8)); - /* wake thread when a new input is chosen */ + scart = SCART_IN1; + break; + case AUDIO_EXTERN_2: + /* ... sometimes it is IN2 through ;) */ + state->mode = MSP_MODE_EXTERN; + scart = SCART_IN2; + break; + case AUDIO_TUNER: + state->mode = -1; + break; + } + if (scart) { + state->rxsubchans = V4L2_TUNER_SUB_STEREO; + state->audmode = V4L2_TUNER_MODE_STEREO; + msp_set_scart(client, scart, 0); + msp_write_dsp(client, 0x000d, 0x1900); + } + if (sarg->capability == V4L2_AUDCAP_STEREO) { + state->audmode = V4L2_TUNER_MODE_STEREO; + } else { + state->audmode &= ~V4L2_TUNER_MODE_STEREO; + } + msp_any_set_audmode(client, state->audmode); msp_wake_thread(client); break; } @@ -656,10 +886,10 @@ static int msp_command(struct i2c_client *client, unsigned int cmd, void *arg) if (state->radio) break; if (state->opmode == OPMODE_AUTOSELECT) - msp_detect_stereo(client); + msp_any_detect_stereo(client); vt->audmode = state->audmode; vt->rxsubchans = state->rxsubchans; - vt->capability |= V4L2_TUNER_CAP_STEREO | + vt->capability = V4L2_TUNER_CAP_STEREO | V4L2_TUNER_CAP_LANG1 | V4L2_TUNER_CAP_LANG2; break; } @@ -668,13 +898,48 @@ static int msp_command(struct i2c_client *client, unsigned int cmd, void *arg) { struct v4l2_tuner *vt = (struct v4l2_tuner *)arg; - if (state->radio) /* TODO: add mono/stereo support for radio */ - break; - if (state->audmode == vt->audmode) + if (state->radio) break; - state->audmode = vt->audmode; /* only set audmode */ - msp_set_audmode(client); + if (vt->audmode != -1 && vt->audmode != 0) + msp_any_set_audmode(client, vt->audmode); + break; + } + + case VIDIOC_G_AUDOUT: + { + struct v4l2_audioout *a = (struct v4l2_audioout *)arg; + int idx = a->index; + + memset(a, 0, sizeof(*a)); + + switch (idx) { + case 0: + strcpy(a->name, "Scart1 Out"); + break; + case 1: + strcpy(a->name, "Scart2 Out"); + break; + case 2: + strcpy(a->name, "I2S Out"); + break; + default: + return -EINVAL; + } + break; + + } + + case VIDIOC_S_AUDOUT: + { + struct v4l2_audioout *a = (struct v4l2_audioout *)arg; + + if (a->index < 0 || a->index > 2) + return -EINVAL; + + v4l_dbg(1, msp_debug, client, "Setting audio out on msp34xx to input %i\n", a->index); + msp_set_scart(client, state->in_scart, a->index + 1); + break; } @@ -700,25 +965,21 @@ static int msp_command(struct i2c_client *client, unsigned int cmd, void *arg) case VIDIOC_QUERYCTRL: { struct v4l2_queryctrl *qc = arg; + int i; - switch (qc->id) { - case V4L2_CID_AUDIO_VOLUME: - case V4L2_CID_AUDIO_MUTE: - return v4l2_ctrl_query_fill_std(qc); - default: - break; - } + for (i = 0; i < ARRAY_SIZE(msp_qctrl_std); i++) + if (qc->id && qc->id == msp_qctrl_std[i].id) { + memcpy(qc, &msp_qctrl_std[i], sizeof(*qc)); + return 0; + } if (!state->has_sound_processing) return -EINVAL; - switch (qc->id) { - case V4L2_CID_AUDIO_LOUDNESS: - case V4L2_CID_AUDIO_BALANCE: - case V4L2_CID_AUDIO_BASS: - case V4L2_CID_AUDIO_TREBLE: - return v4l2_ctrl_query_fill_std(qc); - default: - return -EINVAL; - } + for (i = 0; i < ARRAY_SIZE(msp_qctrl_sound_processing); i++) + if (qc->id && qc->id == msp_qctrl_sound_processing[i].id) { + memcpy(qc, &msp_qctrl_sound_processing[i], sizeof(*qc)); + return 0; + } + return -EINVAL; } case VIDIOC_G_CTRL: @@ -732,7 +993,7 @@ static int msp_command(struct i2c_client *client, unsigned int cmd, void *arg) const char *p; if (state->opmode == OPMODE_AUTOSELECT) - msp_detect_stereo(client); + msp_any_detect_stereo(client); v4l_info(client, "%s rev1 = 0x%04x rev2 = 0x%04x\n", client->name, state->rev1, state->rev2); v4l_info(client, "Audio: volume %d%s\n", @@ -754,23 +1015,17 @@ static int msp_command(struct i2c_client *client, unsigned int cmd, void *arg) case MSP_MODE_EXTERN: p = "External input"; break; default: p = "unknown"; break; } - if (state->mode == MSP_MODE_EXTERN) { - v4l_info(client, "Mode: %s\n", p); - } else if (state->opmode == OPMODE_MANUAL) { + if (state->opmode == OPMODE_MANUAL) { v4l_info(client, "Mode: %s (%s%s)\n", p, (state->rxsubchans & V4L2_TUNER_SUB_STEREO) ? "stereo" : "mono", (state->rxsubchans & V4L2_TUNER_SUB_LANG2) ? ", dual" : ""); } else { - if (state->opmode == OPMODE_AUTODETECT) - v4l_info(client, "Mode: %s\n", p); + v4l_info(client, "Mode: %s\n", p); v4l_info(client, "Standard: %s (%s%s)\n", msp_standard_std_name(state->std), (state->rxsubchans & V4L2_TUNER_SUB_STEREO) ? "stereo" : "mono", (state->rxsubchans & V4L2_TUNER_SUB_LANG2) ? ", dual" : ""); } - v4l_info(client, "Audmode: 0x%04x\n", state->audmode); - v4l_info(client, "Routing: 0x%08x (input) 0x%08x (output)\n", - state->routing.input, state->routing.output); v4l_info(client, "ACB: 0x%04x\n", state->acb); break; } @@ -839,7 +1094,6 @@ static int msp_attach(struct i2c_adapter *adapter, int address, int kind) memset(state, 0, sizeof(*state)); state->v4l2_std = V4L2_STD_NTSC; - state->audmode = V4L2_TUNER_MODE_STEREO; state->volume = 58880; /* 0db gain */ state->balance = 32768; /* 0db gain */ state->bass = 32768; @@ -849,9 +1103,6 @@ static int msp_attach(struct i2c_adapter *adapter, int address, int kind) state->muted = 0; state->i2s_mode = 0; init_waitqueue_head(&state->wq); - /* These are the reset input/output positions */ - state->routing.input = MSP_INPUT_DEFAULT; - state->routing.output = MSP_OUTPUT_DEFAULT; state->rev1 = msp_read_dsp(client, 0x1e); if (state->rev1 != -1) @@ -883,16 +1134,13 @@ static int msp_attach(struct i2c_adapter *adapter, int address, int kind) state->has_radio = msp_revision >= 'G'; /* Has headphones output: not for stripped down products */ state->has_headphones = msp_prod_lo < 5; - /* Has scart2 input: not in stripped down products of the '3' family */ - state->has_scart2 = msp_family >= 4 || msp_prod_lo < 7; - /* Has scart3 input: not in stripped down products of the '3' family */ - state->has_scart3 = msp_family >= 4 || msp_prod_lo < 5; /* Has scart4 input: not in pre D revisions, not in stripped D revs */ state->has_scart4 = msp_family >= 4 || (msp_revision >= 'D' && msp_prod_lo < 5); - /* Has scart2 output: not in stripped down products of the '3' family */ - state->has_scart2_out = msp_family >= 4 || msp_prod_lo < 5; + /* Has scart2 and scart3 inputs and scart2 output: not in stripped + down products of the '3' family */ + state->has_scart23_in_scart2_out = msp_family >= 4 || msp_prod_lo < 5; /* Has scart2 a volume control? Not in pre-D revisions. */ - state->has_scart2_out_volume = msp_revision > 'C' && state->has_scart2_out; + state->has_scart2_out_volume = msp_revision > 'C' && state->has_scart23_in_scart2_out; /* Has a configurable i2s out? */ state->has_i2s_conf = msp_revision >= 'G' && msp_prod_lo < 7; /* Has subwoofer output: not in pre-D revs and not in stripped down products */ @@ -904,8 +1152,6 @@ static int msp_attach(struct i2c_adapter *adapter, int address, int kind) state->has_virtual_dolby_surround = msp_revision == 'G' && msp_prod_lo == 1; /* Has Virtual Dolby Surround & Dolby Pro Logic: only in msp34x2 */ state->has_dolby_pro_logic = msp_revision == 'G' && msp_prod_lo == 2; - /* The msp343xG supports BTSC only and cannot do Automatic Standard Detection. */ - state->force_btsc = msp_family == 3 && msp_revision == 'G' && msp_prod_hi == 3; state->opmode = opmode; if (state->opmode == OPMODE_AUTO) { diff --git a/drivers/media/video/msp3400-kthreads.c b/drivers/media/video/msp3400-kthreads.c index 4c7f85b56..2072c3efe 100644 --- a/drivers/media/video/msp3400-kthreads.c +++ b/drivers/media/video/msp3400-kthreads.c @@ -26,10 +26,10 @@ #include #include #include -#include +#include #include #include -#include "msp3400-driver.h" +#include "msp3400.h" /* this one uses the automatic sound standard detection of newer msp34xx chip versions */ @@ -45,13 +45,11 @@ static struct { { 0x0004, MSP_CARRIER(6.5), MSP_CARRIER(6.2578125), "6.5/6.25 D/K1 Dual FM-Stereo" }, { 0x0005, MSP_CARRIER(6.5), MSP_CARRIER(6.7421875), "6.5/6.74 D/K2 Dual FM-Stereo" }, { 0x0006, MSP_CARRIER(6.5), MSP_CARRIER(6.5), "6.5 D/K FM-Mono (HDEV3)" }, - { 0x0007, MSP_CARRIER(6.5), MSP_CARRIER(5.7421875), "6.5/5.74 D/K3 Dual FM-Stereo" }, { 0x0008, MSP_CARRIER(5.5), MSP_CARRIER(5.85), "5.5/5.85 B/G NICAM FM" }, { 0x0009, MSP_CARRIER(6.5), MSP_CARRIER(5.85), "6.5/5.85 L NICAM AM" }, { 0x000a, MSP_CARRIER(6.0), MSP_CARRIER(6.55), "6.0/6.55 I NICAM FM" }, { 0x000b, MSP_CARRIER(6.5), MSP_CARRIER(5.85), "6.5/5.85 D/K NICAM FM" }, { 0x000c, MSP_CARRIER(6.5), MSP_CARRIER(5.85), "6.5/5.85 D/K NICAM FM (HDEV2)" }, - { 0x000d, MSP_CARRIER(6.5), MSP_CARRIER(5.85), "6.5/5.85 D/K NICAM FM (HDEV3)" }, { 0x0020, MSP_CARRIER(4.5), MSP_CARRIER(4.5), "4.5 M BTSC-Stereo" }, { 0x0021, MSP_CARRIER(4.5), MSP_CARRIER(4.5), "4.5 M BTSC-Mono + SAP" }, { 0x0030, MSP_CARRIER(4.5), MSP_CARRIER(4.5), "4.5 M EIA-J Japan Stereo" }, @@ -111,7 +109,7 @@ static struct msp3400c_init_data_dem { {-2, -8, -10, 10, 50, 86}, {-4, -12, -9, 23, 79, 126}, MSP_CARRIER(6.5), MSP_CARRIER(6.5), - 0x00c6, 0x0140, 0x0120, 0x7c00 + 0x00c6, 0x0140, 0x0120, 0x7c03 }, }; @@ -156,172 +154,139 @@ const char *msp_standard_std_name(int std) return "unknown"; } -static void msp_set_source(struct i2c_client *client, u16 src) -{ - struct msp_state *state = i2c_get_clientdata(client); - - if (msp_dolby) { - msp_write_dsp(client, 0x0008, 0x0520); /* I2S1 */ - msp_write_dsp(client, 0x0009, 0x0620); /* I2S2 */ - } else { - msp_write_dsp(client, 0x0008, src); - msp_write_dsp(client, 0x0009, src); - } - msp_write_dsp(client, 0x000a, src); - msp_write_dsp(client, 0x000b, src); - msp_write_dsp(client, 0x000c, src); - if (state->has_scart2_out) - msp_write_dsp(client, 0x0041, src); -} - -void msp3400c_set_carrier(struct i2c_client *client, int cdo1, int cdo2) +void msp3400c_setcarrier(struct i2c_client *client, int cdo1, int cdo2) { msp_write_dem(client, 0x0093, cdo1 & 0xfff); msp_write_dem(client, 0x009b, cdo1 >> 12); msp_write_dem(client, 0x00a3, cdo2 & 0xfff); msp_write_dem(client, 0x00ab, cdo2 >> 12); - msp_write_dem(client, 0x0056, 0); /* LOAD_REG_1/2 */ + msp_write_dem(client, 0x0056, 0); /*LOAD_REG_1/2*/ } -void msp3400c_set_mode(struct i2c_client *client, int mode) +void msp3400c_setmode(struct i2c_client *client, int type) { struct msp_state *state = i2c_get_clientdata(client); - struct msp3400c_init_data_dem *data = &msp3400c_init_data[mode]; - int tuner = (state->routing.input >> 3) & 1; int i; - v4l_dbg(1, msp_debug, client, "set_mode: %d\n", mode); - state->mode = mode; + v4l_dbg(1, msp_debug, client, "setmode: %d\n", type); + state->mode = type; + state->audmode = V4L2_TUNER_MODE_MONO; state->rxsubchans = V4L2_TUNER_SUB_MONO; - msp_write_dem(client, 0x00bb, data->ad_cv | (tuner ? 0x100 : 0)); + msp_write_dem(client, 0x00bb, msp3400c_init_data[type].ad_cv); for (i = 5; i >= 0; i--) /* fir 1 */ - msp_write_dem(client, 0x0001, data->fir1[i]); + msp_write_dem(client, 0x0001, msp3400c_init_data[type].fir1[i]); msp_write_dem(client, 0x0005, 0x0004); /* fir 2 */ msp_write_dem(client, 0x0005, 0x0040); msp_write_dem(client, 0x0005, 0x0000); for (i = 5; i >= 0; i--) - msp_write_dem(client, 0x0005, data->fir2[i]); + msp_write_dem(client, 0x0005, msp3400c_init_data[type].fir2[i]); + + msp_write_dem(client, 0x0083, msp3400c_init_data[type].mode_reg); - msp_write_dem(client, 0x0083, data->mode_reg); + msp3400c_setcarrier(client, msp3400c_init_data[type].cdo1, + msp3400c_init_data[type].cdo2); - msp3400c_set_carrier(client, data->cdo1, data->cdo2); + msp_write_dem(client, 0x0056, 0); /*LOAD_REG_1/2*/ - msp_set_source(client, data->dsp_src); - /* set prescales */ + if (msp_dolby) { + msp_write_dsp(client, 0x0008, 0x0520); /* I2S1 */ + msp_write_dsp(client, 0x0009, 0x0620); /* I2S2 */ + msp_write_dsp(client, 0x000b, msp3400c_init_data[type].dsp_src); + } else { + msp_write_dsp(client, 0x0008, msp3400c_init_data[type].dsp_src); + msp_write_dsp(client, 0x0009, msp3400c_init_data[type].dsp_src); + msp_write_dsp(client, 0x000b, msp3400c_init_data[type].dsp_src); + } + msp_write_dsp(client, 0x000a, msp3400c_init_data[type].dsp_src); + msp_write_dsp(client, 0x000e, msp3400c_init_data[type].dsp_matrix); - /* volume prescale for SCART (AM mono input) */ - msp_write_dsp(client, 0x000d, 0x1900); - msp_write_dsp(client, 0x000e, data->dsp_matrix); - if (state->has_nicam) /* nicam prescale */ - msp_write_dsp(client, 0x0010, 0x5a00); + if (state->has_nicam) { + /* nicam prescale */ + msp_write_dsp(client, 0x0010, 0x5a00); /* was: 0x3000 */ + } } -/* Set audio mode. Note that the pre-'G' models do not support BTSC+SAP, - nor do they support stereo BTSC. */ -static void msp3400c_set_audmode(struct i2c_client *client) +/* turn on/off nicam + stereo */ +void msp3400c_setstereo(struct i2c_client *client, int mode) { - static char *strmode[] = { "mono", "stereo", "lang2", "lang1", "lang1+lang2" }; + static char *strmode[] = { "mono", "stereo", "lang2", "lang1" }; struct msp_state *state = i2c_get_clientdata(client); - char *modestr = (state->audmode >= 0 && state->audmode < 5) ? - strmode[state->audmode] : "unknown"; - int src = 0; /* channel source: FM/AM, nicam or SCART */ - int audmode = state->audmode; + int nicam = 0; /* channel source: FM/AM or nicam */ + int src = 0; if (state->opmode == OPMODE_AUTOSELECT) { /* this method would break everything, let's make sure * it's never called */ - v4l_dbg(1, msp_debug, client, - "set_audmode called with mode=%d instead of set_source (ignored)\n", - state->audmode); + v4l_dbg(1, msp_debug, client, "setstereo called with mode=%d instead of set_source (ignored)\n", + mode); return; } - /* Note: for the C and D revs no NTSC stereo + SAP is possible as - the hardware does not support SAP. So the rxsubchans combination - of STEREO | LANG2 does not occur. */ - - if (state->mode != MSP_MODE_EXTERN) { - /* switch to mono if only mono is available */ - if (state->rxsubchans == V4L2_TUNER_SUB_MONO) - audmode = V4L2_TUNER_MODE_MONO; - /* if bilingual */ - else if (state->rxsubchans & V4L2_TUNER_SUB_LANG2) { - /* and mono or stereo, then fallback to lang1 */ - if (audmode == V4L2_TUNER_MODE_MONO || - audmode == V4L2_TUNER_MODE_STEREO) - audmode = V4L2_TUNER_MODE_LANG1; - } - /* if stereo, and audmode is not mono, then switch to stereo */ - else if (audmode != V4L2_TUNER_MODE_MONO) - audmode = V4L2_TUNER_MODE_STEREO; - } - /* switch demodulator */ switch (state->mode) { case MSP_MODE_FM_TERRA: - v4l_dbg(1, msp_debug, client, "FM set_audmode: %s\n", modestr); - switch (audmode) { + v4l_dbg(1, msp_debug, client, "FM setstereo: %s\n", strmode[mode]); + msp3400c_setcarrier(client, state->second, state->main); + switch (mode) { case V4L2_TUNER_MODE_STEREO: msp_write_dsp(client, 0x000e, 0x3001); break; case V4L2_TUNER_MODE_MONO: case V4L2_TUNER_MODE_LANG1: case V4L2_TUNER_MODE_LANG2: - case V4L2_TUNER_MODE_LANG1_LANG2: msp_write_dsp(client, 0x000e, 0x3000); break; } break; case MSP_MODE_FM_SAT: - v4l_dbg(1, msp_debug, client, "SAT set_audmode: %s\n", modestr); - switch (audmode) { + v4l_dbg(1, msp_debug, client, "SAT setstereo: %s\n", strmode[mode]); + switch (mode) { case V4L2_TUNER_MODE_MONO: - msp3400c_set_carrier(client, MSP_CARRIER(6.5), MSP_CARRIER(6.5)); + msp3400c_setcarrier(client, MSP_CARRIER(6.5), MSP_CARRIER(6.5)); break; case V4L2_TUNER_MODE_STEREO: - case V4L2_TUNER_MODE_LANG1_LANG2: - msp3400c_set_carrier(client, MSP_CARRIER(7.2), MSP_CARRIER(7.02)); + msp3400c_setcarrier(client, MSP_CARRIER(7.2), MSP_CARRIER(7.02)); break; case V4L2_TUNER_MODE_LANG1: - msp3400c_set_carrier(client, MSP_CARRIER(7.38), MSP_CARRIER(7.02)); + msp3400c_setcarrier(client, MSP_CARRIER(7.38), MSP_CARRIER(7.02)); break; case V4L2_TUNER_MODE_LANG2: - msp3400c_set_carrier(client, MSP_CARRIER(7.38), MSP_CARRIER(7.02)); + msp3400c_setcarrier(client, MSP_CARRIER(7.38), MSP_CARRIER(7.02)); break; } break; case MSP_MODE_FM_NICAM1: case MSP_MODE_FM_NICAM2: case MSP_MODE_AM_NICAM: - v4l_dbg(1, msp_debug, client, "NICAM set_audmode: %s\n",modestr); + v4l_dbg(1, msp_debug, client, "NICAM setstereo: %s\n",strmode[mode]); + msp3400c_setcarrier(client,state->second,state->main); if (state->nicam_on) - src = 0x0100; /* NICAM */ + nicam=0x0100; break; case MSP_MODE_BTSC: - v4l_dbg(1, msp_debug, client, "BTSC set_audmode: %s\n",modestr); + v4l_dbg(1, msp_debug, client, "BTSC setstereo: %s\n",strmode[mode]); + nicam=0x0300; break; case MSP_MODE_EXTERN: - v4l_dbg(1, msp_debug, client, "extern set_audmode: %s\n",modestr); - src = 0x0200; /* SCART */ + v4l_dbg(1, msp_debug, client, "extern setstereo: %s\n",strmode[mode]); + nicam = 0x0200; break; case MSP_MODE_FM_RADIO: - v4l_dbg(1, msp_debug, client, "FM-Radio set_audmode: %s\n",modestr); + v4l_dbg(1, msp_debug, client, "FM-Radio setstereo: %s\n",strmode[mode]); break; default: - v4l_dbg(1, msp_debug, client, "mono set_audmode\n"); + v4l_dbg(1, msp_debug, client, "mono setstereo\n"); return; } /* switch audio */ - v4l_dbg(1, msp_debug, client, "set audmode %d\n", audmode); - switch (audmode) { + switch (mode) { case V4L2_TUNER_MODE_STEREO: - case V4L2_TUNER_MODE_LANG1_LANG2: - src |= 0x0020; + src = 0x0020 | nicam; break; case V4L2_TUNER_MODE_MONO: if (state->mode == MSP_MODE_AM_NICAM) { @@ -332,18 +297,29 @@ static void msp3400c_set_audmode(struct i2c_client *client) src = 0x0200; break; } - if (state->rxsubchans & V4L2_TUNER_SUB_STEREO) - src = 0x0030; - break; case V4L2_TUNER_MODE_LANG1: + src = 0x0000 | nicam; break; case V4L2_TUNER_MODE_LANG2: - src |= 0x0010; + src = 0x0010 | nicam; break; } - v4l_dbg(1, msp_debug, client, "set_audmode final source/matrix = 0x%x\n", src); + v4l_dbg(1, msp_debug, client, "setstereo final source/matrix = 0x%x\n", src); - msp_set_source(client, src); + if (msp_dolby) { + msp_write_dsp(client, 0x0008, 0x0520); + msp_write_dsp(client, 0x0009, 0x0620); + msp_write_dsp(client, 0x000a, src); + msp_write_dsp(client, 0x000b, src); + } else { + msp_write_dsp(client, 0x0008, src); + msp_write_dsp(client, 0x0009, src); + msp_write_dsp(client, 0x000a, src); + msp_write_dsp(client, 0x000b, src); + msp_write_dsp(client, 0x000c, src); + if (state->has_scart23_in_scart2_out) + msp_write_dsp(client, 0x0041, src); + } } static void msp3400c_print_mode(struct i2c_client *client) @@ -371,12 +347,12 @@ static void msp3400c_print_mode(struct i2c_client *client) /* ----------------------------------------------------------------------- */ -static int msp3400c_detect_stereo(struct i2c_client *client) +int autodetect_stereo(struct i2c_client *client) { struct msp_state *state = i2c_get_clientdata(client); int val; int rxsubchans = state->rxsubchans; - int newnicam = state->nicam_on; + int newnicam = state->nicam_on; int update = 0; switch (state->mode) { @@ -385,8 +361,8 @@ static int msp3400c_detect_stereo(struct i2c_client *client) if (val > 32767) val -= 65536; v4l_dbg(2, msp_debug, client, "stereo detect register: %d\n", val); - if (val > 8192) { - rxsubchans = V4L2_TUNER_SUB_STEREO; + if (val > 4096) { + rxsubchans = V4L2_TUNER_SUB_STEREO | V4L2_TUNER_SUB_MONO; } else if (val < -4096) { rxsubchans = V4L2_TUNER_SUB_LANG1 | V4L2_TUNER_SUB_LANG2; } else { @@ -410,11 +386,14 @@ static int msp3400c_detect_stereo(struct i2c_client *client) break; case 1: case 9: - rxsubchans = V4L2_TUNER_SUB_MONO; + rxsubchans = V4L2_TUNER_SUB_MONO + | V4L2_TUNER_SUB_LANG1; break; case 2: case 10: - rxsubchans = V4L2_TUNER_SUB_LANG1 | V4L2_TUNER_SUB_LANG2; + rxsubchans = V4L2_TUNER_SUB_MONO + | V4L2_TUNER_SUB_LANG1 + | V4L2_TUNER_SUB_LANG2; break; default: rxsubchans = V4L2_TUNER_SUB_MONO; @@ -426,17 +405,30 @@ static int msp3400c_detect_stereo(struct i2c_client *client) rxsubchans = V4L2_TUNER_SUB_MONO; } break; + case MSP_MODE_BTSC: + val = msp_read_dem(client, 0x200); + v4l_dbg(2, msp_debug, client, "status=0x%x (pri=%s, sec=%s, %s%s%s)\n", + val, + (val & 0x0002) ? "no" : "yes", + (val & 0x0004) ? "no" : "yes", + (val & 0x0040) ? "stereo" : "mono", + (val & 0x0080) ? ", nicam 2nd mono" : "", + (val & 0x0100) ? ", bilingual/SAP" : ""); + rxsubchans = V4L2_TUNER_SUB_MONO; + if (val & 0x0040) rxsubchans |= V4L2_TUNER_SUB_STEREO; + if (val & 0x0100) rxsubchans |= V4L2_TUNER_SUB_LANG1; + break; } if (rxsubchans != state->rxsubchans) { update = 1; - v4l_dbg(1, msp_debug, client, "watch: rxsubchans %02x => %02x\n", - state->rxsubchans, rxsubchans); + v4l_dbg(1, msp_debug, client, "watch: rxsubchans %d => %d\n", + state->rxsubchans,rxsubchans); state->rxsubchans = rxsubchans; } if (newnicam != state->nicam_on) { update = 1; v4l_dbg(1, msp_debug, client, "watch: nicam %d => %d\n", - state->nicam_on, newnicam); + state->nicam_on,newnicam); state->nicam_on = newnicam; } return update; @@ -451,8 +443,13 @@ static void watch_stereo(struct i2c_client *client) { struct msp_state *state = i2c_get_clientdata(client); - if (msp_detect_stereo(client)) { - msp_set_audmode(client); + if (autodetect_stereo(client)) { + if (state->rxsubchans & V4L2_TUNER_SUB_STEREO) + msp3400c_setstereo(client, V4L2_TUNER_MODE_STEREO); + else if (state->rxsubchans & V4L2_TUNER_SUB_LANG1) + msp3400c_setstereo(client, V4L2_TUNER_MODE_LANG1); + else + msp3400c_setstereo(client, V4L2_TUNER_MODE_MONO); } if (msp_once) @@ -464,7 +461,7 @@ int msp3400c_thread(void *data) struct i2c_client *client = data; struct msp_state *state = i2c_get_clientdata(client); struct msp3400c_carrier_detect *cd; - int count, max1, max2, val1, val2, val, this; + int count, max1,max2,val1,val2, val,this; v4l_dbg(1, msp_debug, client, "msp3400 daemon started\n"); @@ -474,7 +471,7 @@ int msp3400c_thread(void *data) v4l_dbg(2, msp_debug, client, "msp3400 thread: wakeup\n"); restart: - v4l_dbg(2, msp_debug, client, "thread: restart scan\n"); + v4l_dbg(1, msp_debug, client, "thread: restart scan\n"); state->restart = 0; if (kthread_should_stop()) break; @@ -482,24 +479,19 @@ int msp3400c_thread(void *data) if (state->radio || MSP_MODE_EXTERN == state->mode) { /* no carrier scan, just unmute */ v4l_dbg(1, msp_debug, client, "thread: no carrier scan\n"); - state->scan_in_progress = 0; - state->rxsubchans = V4L2_TUNER_SUB_STEREO; msp_set_audio(client); continue; } - /* mute audio */ - state->scan_in_progress = 1; - msp_set_audio(client); - - msp3400c_set_mode(client, MSP_MODE_AM_DETECT); + /* mute */ + msp_set_mute(client); + msp3400c_setmode(client, MSP_MODE_AM_DETECT /* +1 */ ); val1 = val2 = 0; max1 = max2 = -1; state->watch_stereo = 0; - state->nicam_on = 0; - /* wait for tuner to settle down after a channel change */ - if (msp_sleep(state, 200)) + /* some time for the tuner to sync */ + if (msp_sleep(state,200)) goto restart; /* carrier detect pass #1 -- main carrier */ @@ -514,7 +506,7 @@ int msp3400c_thread(void *data) } for (this = 0; this < count; this++) { - msp3400c_set_carrier(client, cd[this].cdo, cd[this].cdo); + msp3400c_setcarrier(client, cd[this].cdo,cd[this].cdo); if (msp_sleep(state,100)) goto restart; val = msp_read_dsp(client, 0x1b); @@ -550,7 +542,7 @@ int msp3400c_thread(void *data) max2 = 0; } for (this = 0; this < count; this++) { - msp3400c_set_carrier(client, cd[this].cdo, cd[this].cdo); + msp3400c_setcarrier(client, cd[this].cdo,cd[this].cdo); if (msp_sleep(state,100)) goto restart; val = msp_read_dsp(client, 0x1b); @@ -562,19 +554,22 @@ int msp3400c_thread(void *data) } /* program the msp3400 according to the results */ - state->main = msp3400c_carrier_detect_main[max1].cdo; + state->main = msp3400c_carrier_detect_main[max1].cdo; switch (max1) { case 1: /* 5.5 */ if (max2 == 0) { /* B/G FM-stereo */ state->second = msp3400c_carrier_detect_55[max2].cdo; - msp3400c_set_mode(client, MSP_MODE_FM_TERRA); + msp3400c_setmode(client, MSP_MODE_FM_TERRA); + state->nicam_on = 0; + msp3400c_setstereo(client, V4L2_TUNER_MODE_MONO); state->watch_stereo = 1; } else if (max2 == 1 && state->has_nicam) { /* B/G NICAM */ state->second = msp3400c_carrier_detect_55[max2].cdo; - msp3400c_set_mode(client, MSP_MODE_FM_NICAM1); + msp3400c_setmode(client, MSP_MODE_FM_NICAM1); state->nicam_on = 1; + msp3400c_setcarrier(client, state->second, state->main); state->watch_stereo = 1; } else { goto no_second; @@ -583,26 +578,35 @@ int msp3400c_thread(void *data) case 2: /* 6.0 */ /* PAL I NICAM */ state->second = MSP_CARRIER(6.552); - msp3400c_set_mode(client, MSP_MODE_FM_NICAM2); + msp3400c_setmode(client, MSP_MODE_FM_NICAM2); state->nicam_on = 1; + msp3400c_setcarrier(client, state->second, state->main); state->watch_stereo = 1; break; case 3: /* 6.5 */ if (max2 == 1 || max2 == 2) { /* D/K FM-stereo */ state->second = msp3400c_carrier_detect_65[max2].cdo; - msp3400c_set_mode(client, MSP_MODE_FM_TERRA); + msp3400c_setmode(client, MSP_MODE_FM_TERRA); + state->nicam_on = 0; + msp3400c_setstereo(client, V4L2_TUNER_MODE_MONO); state->watch_stereo = 1; } else if (max2 == 0 && (state->v4l2_std & V4L2_STD_SECAM)) { /* L NICAM or AM-mono */ state->second = msp3400c_carrier_detect_65[max2].cdo; - msp3400c_set_mode(client, MSP_MODE_AM_NICAM); + msp3400c_setmode(client, MSP_MODE_AM_NICAM); + state->nicam_on = 0; + msp3400c_setstereo(client, V4L2_TUNER_MODE_MONO); + msp3400c_setcarrier(client, state->second, state->main); + /* volume prescale for SCART (AM mono input) */ + msp_write_dsp(client, 0x000d, 0x1900); state->watch_stereo = 1; } else if (max2 == 0 && state->has_nicam) { /* D/K NICAM */ state->second = msp3400c_carrier_detect_65[max2].cdo; - msp3400c_set_mode(client, MSP_MODE_FM_NICAM1); + msp3400c_setmode(client, MSP_MODE_FM_NICAM1); state->nicam_on = 1; + msp3400c_setcarrier(client, state->second, state->main); state->watch_stereo = 1; } else { goto no_second; @@ -612,26 +616,24 @@ int msp3400c_thread(void *data) default: no_second: state->second = msp3400c_carrier_detect_main[max1].cdo; - msp3400c_set_mode(client, MSP_MODE_FM_TERRA); + msp3400c_setmode(client, MSP_MODE_FM_TERRA); + state->nicam_on = 0; + msp3400c_setcarrier(client, state->second, state->main); + state->rxsubchans = V4L2_TUNER_SUB_MONO; + msp3400c_setstereo(client, V4L2_TUNER_MODE_MONO); break; } - msp3400c_set_carrier(client, state->second, state->main); /* unmute */ - state->scan_in_progress = 0; - msp3400c_set_audmode(client); msp_set_audio(client); if (msp_debug) msp3400c_print_mode(client); - /* monitor tv audio mode, the first time don't wait - so long to get a quick stereo/bilingual result */ - count = 3; + /* monitor tv audio mode */ while (state->watch_stereo) { - if (msp_sleep(state, count ? 1000 : 5000)) + if (msp_sleep(state,5000)) goto restart; - if (count) count--; watch_stereo(client); } } @@ -644,7 +646,7 @@ int msp3410d_thread(void *data) { struct i2c_client *client = data; struct msp_state *state = i2c_get_clientdata(client); - int val, i, std, count; + int val, i, std; v4l_dbg(1, msp_debug, client, "msp3410 daemon started\n"); @@ -654,7 +656,7 @@ int msp3410d_thread(void *data) v4l_dbg(2, msp_debug, client, "msp3410 thread: wakeup\n"); restart: - v4l_dbg(2, msp_debug, client, "thread: restart scan\n"); + v4l_dbg(1, msp_debug, client, "thread: restart scan\n"); state->restart = 0; if (kthread_should_stop()) break; @@ -662,30 +664,26 @@ int msp3410d_thread(void *data) if (state->mode == MSP_MODE_EXTERN) { /* no carrier scan needed, just unmute */ v4l_dbg(1, msp_debug, client, "thread: no carrier scan\n"); - state->scan_in_progress = 0; msp_set_audio(client); continue; } - /* mute audio */ - state->scan_in_progress = 1; - msp_set_audio(client); + /* put into sane state (and mute) */ + msp_reset(client); - /* start autodetect. Note: autodetect is not supported for - NTSC-M and radio, hence we force the standard in those cases. */ + /* some time for the tuner to sync */ + if (msp_sleep(state,200)) + goto restart; + + /* start autodetect */ if (state->radio) std = 0x40; else std = (state->v4l2_std & V4L2_STD_NTSC) ? 0x20 : 1; state->watch_stereo = 0; - state->nicam_on = 0; - - /* wait for tuner to settle down after a channel change */ - if (msp_sleep(state, 200)) - goto restart; if (msp_debug) - v4l_dbg(2, msp_debug, client, "setting standard: %s (0x%04x)\n", + v4l_dbg(1, msp_debug, client, "setting standard: %s (0x%04x)\n", msp_standard_std_name(std), std); if (std != 1) { @@ -702,7 +700,7 @@ int msp3410d_thread(void *data) val = msp_read_dem(client, 0x7e); if (val < 0x07ff) break; - v4l_dbg(2, msp_debug, client, "detection still in progress\n"); + v4l_dbg(1, msp_debug, client, "detection still in progress\n"); } } for (i = 0; msp_stdlist[i].name != NULL; i++) @@ -713,7 +711,6 @@ int msp3410d_thread(void *data) state->main = msp_stdlist[i].main; state->second = msp_stdlist[i].second; state->std = val; - state->rxsubchans = V4L2_TUNER_SUB_MONO; if (msp_amsound && !state->radio && (state->v4l2_std & V4L2_STD_SECAM) && (val != 0x0009)) { @@ -721,71 +718,83 @@ int msp3410d_thread(void *data) v4l_dbg(1, msp_debug, client, "autodetection failed," " switching to backup standard: %s (0x%04x)\n", msp_stdlist[8].name ? msp_stdlist[8].name : "unknown",val); - state->std = val = 0x0009; + val = 0x0009; msp_write_dem(client, 0x20, val); } + /* set various prescales */ + msp_write_dsp(client, 0x0d, 0x1900); /* scart */ + msp_write_dsp(client, 0x0e, 0x2403); /* FM */ + msp_write_dsp(client, 0x10, 0x5a00); /* nicam */ + /* set stereo */ switch (val) { case 0x0008: /* B/G NICAM */ case 0x000a: /* I NICAM */ - case 0x000b: /* D/K NICAM */ - if (val == 0x000a) - state->mode = MSP_MODE_FM_NICAM2; - else + if (val == 0x0008) state->mode = MSP_MODE_FM_NICAM1; + else + state->mode = MSP_MODE_FM_NICAM2; /* just turn on stereo */ + state->rxsubchans = V4L2_TUNER_SUB_STEREO; state->nicam_on = 1; state->watch_stereo = 1; + msp3400c_setstereo(client,V4L2_TUNER_MODE_STEREO); break; case 0x0009: state->mode = MSP_MODE_AM_NICAM; + state->rxsubchans = V4L2_TUNER_SUB_MONO; state->nicam_on = 1; + msp3400c_setstereo(client,V4L2_TUNER_MODE_MONO); state->watch_stereo = 1; break; case 0x0020: /* BTSC */ - /* The pre-'G' models only have BTSC-mono */ + /* just turn on stereo */ state->mode = MSP_MODE_BTSC; + state->rxsubchans = V4L2_TUNER_SUB_STEREO; + state->nicam_on = 0; + state->watch_stereo = 1; + msp3400c_setstereo(client,V4L2_TUNER_MODE_STEREO); break; case 0x0040: /* FM radio */ state->mode = MSP_MODE_FM_RADIO; state->rxsubchans = V4L2_TUNER_SUB_STEREO; + state->audmode = V4L2_TUNER_MODE_STEREO; + state->nicam_on = 0; + state->watch_stereo = 0; /* not needed in theory if we have radio, but short programming enables carrier mute */ - msp3400c_set_mode(client, MSP_MODE_FM_RADIO); - msp3400c_set_carrier(client, MSP_CARRIER(10.7), + msp3400c_setmode(client, MSP_MODE_FM_RADIO); + msp3400c_setcarrier(client, MSP_CARRIER(10.7), MSP_CARRIER(10.7)); + /* scart routing */ + msp_set_scart(client,SCART_IN2,0); + /* msp34xx does radio decoding */ + msp_write_dsp(client, 0x08, 0x0020); + msp_write_dsp(client, 0x09, 0x0020); + msp_write_dsp(client, 0x0b, 0x0020); break; - case 0x0002: case 0x0003: case 0x0004: case 0x0005: state->mode = MSP_MODE_FM_TERRA; + state->rxsubchans = V4L2_TUNER_SUB_MONO; + state->audmode = V4L2_TUNER_MODE_MONO; + state->nicam_on = 0; state->watch_stereo = 1; break; } - /* set various prescales */ - msp_write_dsp(client, 0x0d, 0x1900); /* scart */ - msp_write_dsp(client, 0x0e, 0x3000); /* FM */ - if (state->has_nicam) - msp_write_dsp(client, 0x10, 0x5a00); /* nicam */ - + /* unmute, restore misc registers */ + msp_set_audio(client); + msp_write_dsp(client, 0x13, state->acb); if (state->has_i2s_conf) msp_write_dem(client, 0x40, state->i2s_mode); - /* unmute */ - msp3400c_set_audmode(client); - state->scan_in_progress = 0; - msp_set_audio(client); - - /* monitor tv audio mode, the first time don't wait - so long to get a quick stereo/bilingual result */ - count = 3; + /* monitor tv audio mode */ while (state->watch_stereo) { - if (msp_sleep(state, count ? 1000 : 5000)) + if (msp_sleep(state,5000)) goto restart; - if (count) count--; watch_stereo(client); } } @@ -795,150 +804,102 @@ int msp3410d_thread(void *data) /* ----------------------------------------------------------------------- */ -/* msp34xxG + (autoselect no-thread) - * this one uses both automatic standard detection and automatic sound - * select which are available in the newer G versions - * struct msp: only norm, acb and source are really used in this mode - */ +/* msp34xxG + (autoselect no-thread) */ +/* this one uses both automatic standard detection and automatic sound */ +/* select which are available in the newer G versions */ +/* struct msp: only norm, acb and source are really used in this mode */ -static int msp34xxg_modus(struct i2c_client *client) +/* set the same 'source' for the loudspeaker, scart and quasi-peak detector + * the value for source is the same as bit 15:8 of DSP registers 0x08, + * 0x0a and 0x0c: 0=mono, 1=stereo or A|B, 2=SCART, 3=stereo or A, 4=stereo or B + * + * this function replaces msp3400c_setstereo + */ +static void msp34xxg_set_source(struct i2c_client *client, int source) { struct msp_state *state = i2c_get_clientdata(client); - if (state->radio) { - v4l_dbg(1, msp_debug, client, "selected radio modus\n"); - return 0x0001; - } - - if (state->v4l2_std & V4L2_STD_PAL) { - v4l_dbg(1, msp_debug, client, "selected PAL modus\n"); - return 0x7001; - } - if (state->v4l2_std == V4L2_STD_NTSC_M_JP) { - v4l_dbg(1, msp_debug, client, "selected M (EIA-J) modus\n"); - return 0x4001; - } - if (state->v4l2_std == V4L2_STD_NTSC_M_KR) { - v4l_dbg(1, msp_debug, client, "selected M (A2) modus\n"); - return 0x0001; - } - if (state->v4l2_std & V4L2_STD_MN) { - v4l_dbg(1, msp_debug, client, "selected M (BTSC) modus\n"); - return 0x2001; - } - if (state->v4l2_std & V4L2_STD_SECAM) { - v4l_dbg(1, msp_debug, client, "selected SECAM modus\n"); - return 0x6001; - } - return 0x0001; -} - -static void msp34xxg_set_source(struct i2c_client *client, u16 reg, int in) - { - struct msp_state *state = i2c_get_clientdata(client); - int source, matrix; - - switch (state->audmode) { - case V4L2_TUNER_MODE_MONO: - source = 0; /* mono only */ - matrix = 0x30; - break; - case V4L2_TUNER_MODE_LANG2: - source = 4; /* stereo or B */ - matrix = 0x10; - break; - case V4L2_TUNER_MODE_LANG1_LANG2: - source = 1; /* stereo or A|B */ - matrix = 0x20; - break; - case V4L2_TUNER_MODE_STEREO: - case V4L2_TUNER_MODE_LANG1: - default: - source = 3; /* stereo or A */ - matrix = 0x00; - break; - } - - if (in == MSP_DSP_IN_TUNER) - source = (source << 8) | 0x20; - /* the msp34x2g puts the MAIN_AVC, MAIN and AUX sources in 12, 13, 14 - instead of 11, 12, 13. So we add one for that msp version. */ - else if (in >= MSP_DSP_IN_MAIN_AVC && state->has_dolby_pro_logic) - source = ((in + 1) << 8) | matrix; - else - source = (in << 8) | matrix; - - v4l_dbg(1, msp_debug, client, "set source to %d (0x%x) for output %02x\n", - in, source, reg); - msp_write_dsp(client, reg, source); -} - -static void msp34xxg_set_sources(struct i2c_client *client) -{ - struct msp_state *state = i2c_get_clientdata(client); - u32 in = state->routing.input; - - msp34xxg_set_source(client, 0x0008, (in >> 4) & 0xf); - /* quasi-peak detector is set to same input as the loudspeaker (MAIN) */ - msp34xxg_set_source(client, 0x000c, (in >> 4) & 0xf); - msp34xxg_set_source(client, 0x0009, (in >> 8) & 0xf); - msp34xxg_set_source(client, 0x000a, (in >> 12) & 0xf); - if (state->has_scart2_out) - msp34xxg_set_source(client, 0x0041, (in >> 16) & 0xf); - msp34xxg_set_source(client, 0x000b, (in >> 20) & 0xf); + /* fix matrix mode to stereo and let the msp choose what + * to output according to 'source', as recommended + * for MONO (source==0) downmixing set bit[7:0] to 0x30 + */ + int value = (source & 0x07) << 8 | (source == 0 ? 0x30 : 0x20); + + v4l_dbg(1, msp_debug, client, "set source to %d (0x%x)\n", source, value); + /* Loudspeaker Output */ + msp_write_dsp(client, 0x08, value); + /* SCART1 DA Output */ + msp_write_dsp(client, 0x0a, value); + /* Quasi-peak detector */ + msp_write_dsp(client, 0x0c, value); + /* + * set identification threshold. Personally, I + * I set it to a higher value that the default + * of 0x190 to ignore noisy stereo signals. + * this needs tuning. (recommended range 0x00a0-0x03c0) + * 0x7f0 = forced mono mode + */ + /* a2 threshold for stereo/bilingual */ + msp_write_dem(client, 0x22, msp_stereo_thresh); + state->source = source; } -/* (re-)initialize the msp34xxg */ -static void msp34xxg_reset(struct i2c_client *client) +/* (re-)initialize the msp34xxg, according to the current norm in state->norm + * return 0 if it worked, -1 if it failed + */ +static int msp34xxg_reset(struct i2c_client *client) { struct msp_state *state = i2c_get_clientdata(client); - int tuner = (state->routing.input >> 3) & 1; - int modus; + int modus, std; - /* initialize std to 1 (autodetect) to signal that no standard is - selected yet. */ - state->std = 1; + if (msp_reset(client)) + return -1; - msp_reset(client); + /* make sure that input/output is muted (paranoid mode) */ + /* ACB, mute DSP input, mute SCART 1 */ + if (msp_write_dsp(client, 0x13, 0x0f20)) + return -1; if (state->has_i2s_conf) msp_write_dem(client, 0x40, state->i2s_mode); /* step-by-step initialisation, as described in the manual */ - modus = msp34xxg_modus(client); - modus |= tuner ? 0x100 : 0; - msp_write_dem(client, 0x30, modus); + modus = msp_modus(client); + if (state->radio) + std = 0x40; + else + std = (state->v4l2_std & V4L2_STD_NTSC) ? 0x20 : 1; + modus &= ~0x03; /* STATUS_CHANGE = 0 */ + modus |= 0x01; /* AUTOMATIC_SOUND_DETECTION = 1 */ + if (msp_write_dem(client, 0x30, modus)) + return -1; + if (msp_write_dem(client, 0x20, std)) + return -1; /* write the dsps that may have an influence on standard/audio autodetection right now */ - msp34xxg_set_sources(client); + msp34xxg_set_source(client, state->source); - msp_write_dsp(client, 0x0d, 0x1900); /* scart */ - msp_write_dsp(client, 0x0e, 0x3000); /* FM */ - if (state->has_nicam) - msp_write_dsp(client, 0x10, 0x5a00); /* nicam */ + /* AM/FM Prescale [15:8] 75khz deviation */ + if (msp_write_dsp(client, 0x0e, 0x3000)) + return -1; - /* set identification threshold. Personally, I - * I set it to a higher value than the default - * of 0x190 to ignore noisy stereo signals. - * this needs tuning. (recommended range 0x00a0-0x03c0) - * 0x7f0 = forced mono mode - * - * a2 threshold for stereo/bilingual. - * Note: this register is part of the Manual/Compatibility mode. - * It is supported by all 'G'-family chips. - */ - msp_write_dem(client, 0x22, msp_stereo_thresh); + /* NICAM Prescale 9db gain (as recommended) */ + if (msp_write_dsp(client, 0x10, 0x5a00)) + return -1; + + return 0; } int msp34xxg_thread(void *data) { struct i2c_client *client = data; struct msp_state *state = i2c_get_clientdata(client); - int val, i; + int val, std, i; v4l_dbg(1, msp_debug, client, "msp34xxg daemon started\n"); + state->source = 1; /* default */ for (;;) { v4l_dbg(2, msp_debug, client, "msp34xxg thread: sleep\n"); msp_sleep(state, -1); @@ -950,25 +911,14 @@ int msp34xxg_thread(void *data) if (kthread_should_stop()) break; - if (state->mode == MSP_MODE_EXTERN) { - /* no carrier scan needed, just unmute */ - v4l_dbg(1, msp_debug, client, "thread: no carrier scan\n"); - state->scan_in_progress = 0; - msp_set_audio(client); - continue; - } - /* setup the chip*/ msp34xxg_reset(client); - state->std = state->radio ? 0x40 : - (state->force_btsc && msp_standard == 1) ? 32 : msp_standard; - msp_write_dem(client, 0x20, state->std); - /* start autodetect */ - if (state->std != 1) + std = msp_standard; + if (std != 0x01) goto unmute; /* watch autodetect */ - v4l_dbg(1, msp_debug, client, "started autodetect, waiting for result\n"); + v4l_dbg(1, msp_debug, client, "triggered autodetect, waiting for result\n"); for (i = 0; i < 10; i++) { if (msp_sleep(state, 100)) goto restart; @@ -976,24 +926,20 @@ int msp34xxg_thread(void *data) /* check results */ val = msp_read_dem(client, 0x7e); if (val < 0x07ff) { - state->std = val; + std = val; break; } v4l_dbg(2, msp_debug, client, "detection still in progress\n"); } - if (state->std == 1) { + if (std == 1) { v4l_dbg(1, msp_debug, client, "detection still in progress after 10 tries. giving up.\n"); continue; } unmute: - v4l_dbg(1, msp_debug, client, "detected standard: %s (0x%04x)\n", - msp_standard_std_name(state->std), state->std); - - if (state->std == 9) { - /* AM NICAM mode */ - msp_write_dsp(client, 0x0e, 0x7c00); - } + state->std = std; + v4l_dbg(1, msp_debug, client, "current standard: %s (0x%04x)\n", + msp_standard_std_name(std), std); /* unmute: dispatch sound to scart output, set scart volume */ msp_set_audio(client); @@ -1002,93 +948,63 @@ int msp34xxg_thread(void *data) if (msp_write_dsp(client, 0x13, state->acb)) return -1; - /* the periodic stereo/SAP check is only relevant for - the 0x20 standard (BTSC) */ - if (state->std != 0x20) - continue; - - state->watch_stereo = 1; - - /* monitor tv audio mode, the first time don't wait - in order to get a quick stereo/SAP update */ - watch_stereo(client); - while (state->watch_stereo) { - watch_stereo(client); - if (msp_sleep(state, 5000)) - goto restart; - } + msp_write_dem(client, 0x40, state->i2s_mode); } v4l_dbg(1, msp_debug, client, "thread: exit\n"); return 0; } -static int msp34xxg_detect_stereo(struct i2c_client *client) +void msp34xxg_detect_stereo(struct i2c_client *client) { struct msp_state *state = i2c_get_clientdata(client); + int status = msp_read_dem(client, 0x0200); int is_bilingual = status & 0x100; int is_stereo = status & 0x40; - int oldrx = state->rxsubchans; state->rxsubchans = 0; if (is_stereo) - state->rxsubchans = V4L2_TUNER_SUB_STEREO; + state->rxsubchans |= V4L2_TUNER_SUB_STEREO; else - state->rxsubchans = V4L2_TUNER_SUB_MONO; + state->rxsubchans |= V4L2_TUNER_SUB_MONO; if (is_bilingual) { - if (state->std == 0x20) - state->rxsubchans |= V4L2_TUNER_SUB_SAP; - else - state->rxsubchans = V4L2_TUNER_SUB_LANG1 | V4L2_TUNER_SUB_LANG2; + state->rxsubchans |= V4L2_TUNER_SUB_LANG1 | V4L2_TUNER_SUB_LANG2; + /* I'm supposed to check whether it's SAP or not + * and set only LANG2/SAP in this case. Yet, the MSP + * does a lot of work to hide this and handle everything + * the same way. I don't want to work around it so unless + * this is a problem, I'll handle SAP just like lang1/lang2. + */ } v4l_dbg(1, msp_debug, client, "status=0x%x, stereo=%d, bilingual=%d -> rxsubchans=%d\n", status, is_stereo, is_bilingual, state->rxsubchans); - return (oldrx != state->rxsubchans); -} - -static void msp34xxg_set_audmode(struct i2c_client *client) -{ - struct msp_state *state = i2c_get_clientdata(client); - - if (state->std == 0x20) { - if ((state->rxsubchans & V4L2_TUNER_SUB_SAP) && - (state->audmode == V4L2_TUNER_MODE_LANG1_LANG2 || - state->audmode == V4L2_TUNER_MODE_LANG2)) { - msp_write_dem(client, 0x20, 0x21); - } else { - msp_write_dem(client, 0x20, 0x20); - } - } - - msp34xxg_set_sources(client); } -void msp_set_audmode(struct i2c_client *client) +void msp34xxg_set_audmode(struct i2c_client *client, int audmode) { struct msp_state *state = i2c_get_clientdata(client); + int source; - switch (state->opmode) { - case OPMODE_MANUAL: - case OPMODE_AUTODETECT: - msp3400c_set_audmode(client); + switch (audmode) { + case V4L2_TUNER_MODE_MONO: + source = 0; /* mono only */ break; - case OPMODE_AUTOSELECT: - msp34xxg_set_audmode(client); + case V4L2_TUNER_MODE_STEREO: + source = 1; /* stereo or A|B, see comment in msp34xxg_get_v4l2_stereo() */ + /* problem: that could also mean 2 (scart input) */ + break; + case V4L2_TUNER_MODE_LANG1: + source = 3; /* stereo or A */ + break; + case V4L2_TUNER_MODE_LANG2: + source = 4; /* stereo or B */ + break; + default: + audmode = 0; + source = 1; break; } -} - -int msp_detect_stereo(struct i2c_client *client) -{ - struct msp_state *state = i2c_get_clientdata(client); - - switch (state->opmode) { - case OPMODE_MANUAL: - case OPMODE_AUTODETECT: - return msp3400c_detect_stereo(client); - case OPMODE_AUTOSELECT: - return msp34xxg_detect_stereo(client); - } - return 0; + state->audmode = audmode; + msp34xxg_set_source(client, source); } diff --git a/drivers/media/video/msp3400.h b/drivers/media/video/msp3400.h index d70a954e1..a9ac57d07 100644 --- a/drivers/media/video/msp3400.h +++ b/drivers/media/video/msp3400.h @@ -1,23 +1,24 @@ +/* + */ + #ifndef MSP3400_H #define MSP3400_H /* ---------------------------------------------------------------------- */ -struct msp_dfpreg { - int reg; - int value; -}; - -struct msp_matrix { - int input; - int output; -}; - -#define MSP_SET_DFPREG _IOW('m',15,struct msp_dfpreg) -#define MSP_GET_DFPREG _IOW('m',16,struct msp_dfpreg) +/* This macro is allowed for *constants* only, gcc must calculate it + at compile time. Remember -- no floats in kernel mode */ +#define MSP_CARRIER(freq) ((int)((float)(freq / 18.432) * (1 << 24))) -/* ioctl for MSP_SET_MATRIX will have to be registered */ -#define MSP_SET_MATRIX _IOW('m',17,struct msp_matrix) +#define MSP_MODE_AM_DETECT 0 +#define MSP_MODE_FM_RADIO 2 +#define MSP_MODE_FM_TERRA 3 +#define MSP_MODE_FM_SAT 4 +#define MSP_MODE_FM_NICAM1 5 +#define MSP_MODE_FM_NICAM2 6 +#define MSP_MODE_AM_NICAM 7 +#define MSP_MODE_BTSC 8 +#define MSP_MODE_EXTERN 9 #define SCART_MASK 0 #define SCART_IN1 1 @@ -33,4 +34,84 @@ struct msp_matrix { #define SCART1_OUT 1 #define SCART2_OUT 2 +#define OPMODE_AUTO -1 +#define OPMODE_MANUAL 0 +#define OPMODE_AUTODETECT 1 /* use autodetect (>= msp3410 only) */ +#define OPMODE_AUTOSELECT 2 /* use autodetect & autoselect (>= msp34xxG) */ + +/* module parameters */ +extern int msp_debug; +extern int msp_once; +extern int msp_amsound; +extern int msp_standard; +extern int msp_dolby; +extern int msp_stereo_thresh; + +struct msp_state { + int rev1, rev2; + u8 has_nicam; + u8 has_radio; + u8 has_headphones; + u8 has_ntsc_jp_d_k3; + u8 has_scart4; + u8 has_scart23_in_scart2_out; + u8 has_scart2_out_volume; + u8 has_i2s_conf; + u8 has_subwoofer; + u8 has_sound_processing; + u8 has_virtual_dolby_surround; + u8 has_dolby_pro_logic; + + int radio; + int opmode; + int std; + int mode; + v4l2_std_id v4l2_std; + int nicam_on; + int acb; + int in_scart; + int i2s_mode; + int main, second; /* sound carrier */ + int input; + int source; /* see msp34xxg_set_source */ + + /* v4l2 */ + int audmode; + int rxsubchans; + + int volume, muted; + int balance, loudness; + int bass, treble; + + /* thread */ + struct task_struct *kthread; + wait_queue_head_t wq; + int restart:1; + int watch_stereo:1; +}; + +/* msp3400-driver.c */ +int msp_write_dem(struct i2c_client *client, int addr, int val); +int msp_write_dsp(struct i2c_client *client, int addr, int val); +int msp_read_dem(struct i2c_client *client, int addr); +int msp_read_dsp(struct i2c_client *client, int addr); +int msp_reset(struct i2c_client *client); +void msp_set_scart(struct i2c_client *client, int in, int out); +void msp_set_mute(struct i2c_client *client); +void msp_set_audio(struct i2c_client *client); +int msp_modus(struct i2c_client *client); +int msp_sleep(struct msp_state *state, int timeout); + +/* msp3400-kthreads.c */ +const char *msp_standard_std_name(int std); +void msp3400c_setcarrier(struct i2c_client *client, int cdo1, int cdo2); +void msp3400c_setmode(struct i2c_client *client, int type); +void msp3400c_setstereo(struct i2c_client *client, int mode); +int autodetect_stereo(struct i2c_client *client); +int msp3400c_thread(void *data); +int msp3410d_thread(void *data); +int msp34xxg_thread(void *data); +void msp34xxg_detect_stereo(struct i2c_client *client); +void msp34xxg_set_audmode(struct i2c_client *client, int audmode); + #endif /* MSP3400_H */ diff --git a/drivers/media/video/mxb.c b/drivers/media/video/mxb.c index b0aea4002..41715cacf 100644 --- a/drivers/media/video/mxb.c +++ b/drivers/media/video/mxb.c @@ -1,11 +1,11 @@ /* mxb - v4l2 driver for the Multimedia eXtension Board - + Copyright (C) 1998-2006 Michael Hunold Visit http://www.mihu.de/linux/saa7146/mxb/ for further details about this card. - + This 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 @@ -35,12 +35,12 @@ #define I2C_SAA7111 0x24 -#define MXB_BOARD_CAN_DO_VBI(dev) (dev->revision != 0) +#define MXB_BOARD_CAN_DO_VBI(dev) (dev->revision != 0) /* global variable */ static int mxb_num = 0; -/* initial frequence the tuner will be tuned to. +/* initial frequence the tuner will be tuned to. in verden (lower saxony, germany) 4148 is a channel called "phoenix" */ static int freq = 4148; @@ -55,7 +55,7 @@ MODULE_PARM_DESC(debug, "Turn on/off device debugging (default:off)."); enum { TUNER, AUX1, AUX3, AUX3_YC }; static struct v4l2_input mxb_inputs[MXB_INPUTS] = { - { TUNER, "Tuner", V4L2_INPUT_TYPE_TUNER, 1, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 }, + { TUNER, "Tuner", V4L2_INPUT_TYPE_TUNER, 1, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 }, { AUX1, "AUX1", V4L2_INPUT_TYPE_CAMERA, 2, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 }, { AUX3, "AUX3 Composite", V4L2_INPUT_TYPE_CAMERA, 4, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 }, { AUX3_YC, "AUX3 S-Video", V4L2_INPUT_TYPE_CAMERA, 4, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 }, @@ -66,7 +66,7 @@ static struct v4l2_input mxb_inputs[MXB_INPUTS] = { static struct { int hps_source; int hps_sync; -} input_port_selection[MXB_INPUTS] = { +} input_port_selection[MXB_INPUTS] = { { SAA7146_HPS_SOURCE_PORT_A, SAA7146_HPS_SYNC_PORT_A }, { SAA7146_HPS_SOURCE_PORT_A, SAA7146_HPS_SYNC_PORT_A }, { SAA7146_HPS_SOURCE_PORT_A, SAA7146_HPS_SYNC_PORT_A }, @@ -81,7 +81,7 @@ static int video_audio_connect[MXB_INPUTS] = /* these are the necessary input-output-pins for bringing one audio source (see above) to the CD-output */ static struct tea6420_multiplex TEA6420_cd[MXB_AUDIOS+1][2] = - { + { {{1,1,0},{1,1,0}}, /* Tuner */ {{5,1,0},{6,1,0}}, /* AUX 1 */ {{4,1,0},{6,1,0}}, /* AUX 2 */ @@ -122,8 +122,8 @@ static struct saa7146_extension_ioctls ioctls[] = { { VIDIOC_S_FREQUENCY, SAA7146_EXCLUSIVE }, { VIDIOC_G_AUDIO, SAA7146_EXCLUSIVE }, { VIDIOC_S_AUDIO, SAA7146_EXCLUSIVE }, - { MXB_S_AUDIO_CD, SAA7146_EXCLUSIVE }, /* custom control */ - { MXB_S_AUDIO_LINE, SAA7146_EXCLUSIVE }, /* custom control */ + { MXB_S_AUDIO_CD, SAA7146_EXCLUSIVE }, /* custom control */ + { MXB_S_AUDIO_LINE, SAA7146_EXCLUSIVE }, /* custom control */ { 0, 0 } }; @@ -132,7 +132,7 @@ struct mxb struct video_device *video_dev; struct video_device *vbi_dev; - struct i2c_adapter i2c_adapter; + struct i2c_adapter i2c_adapter; struct i2c_client* saa7111a; struct i2c_client* tda9840; @@ -198,17 +198,17 @@ static int mxb_probe(struct saa7146_dev* dev) /* loop through all i2c-devices on the bus and look who is there */ list_for_each(item,&mxb->i2c_adapter.clients) { client = list_entry(item, struct i2c_client, list); - if( I2C_ADDR_TEA6420_1 == client->addr ) + if( I2C_TEA6420_1 == client->addr ) mxb->tea6420_1 = client; - if( I2C_ADDR_TEA6420_2 == client->addr ) + if( I2C_TEA6420_2 == client->addr ) mxb->tea6420_2 = client; - if( I2C_TEA6415C_2 == client->addr ) + if( I2C_TEA6415C_2 == client->addr ) mxb->tea6415c = client; - if( I2C_ADDR_TDA9840 == client->addr ) + if( I2C_TDA9840 == client->addr ) mxb->tda9840 = client; if( I2C_SAA7111 == client->addr ) mxb->saa7111a = client; - if( 0x60 == client->addr ) + if( 0x60 == client->addr ) mxb->tuner = client; } @@ -222,7 +222,7 @@ static int mxb_probe(struct saa7146_dev* dev) return -ENODEV; } - /* all devices are present, probe was successful */ + /* all devices are present, probe was successful */ /* we store the pointer in our private data field */ dev->ext_priv = mxb; @@ -230,7 +230,7 @@ static int mxb_probe(struct saa7146_dev* dev) return 0; } -/* some init data for the saa7740, the so-called 'sound arena module'. +/* some init data for the saa7740, the so-called 'sound arena module'. there are no specs available, so we simply use some init values */ static struct { int length; @@ -330,7 +330,7 @@ static int mxb_init_done(struct saa7146_dev* dev) v4l2_std_id std = V4L2_STD_PAL_BG; int i = 0, err = 0; - struct tea6415c_multiplex vm; + struct tea6415c_multiplex vm; /* select video mode in saa7111a */ i = VIDEO_MODE_PAL; @@ -380,16 +380,16 @@ static int mxb_init_done(struct saa7146_dev* dev) vm.in = 3; vm.out = 13; mxb->tea6415c->driver->command(mxb->tea6415c,TEA6415C_SWITCH, &vm); - + /* the rest for mxb */ mxb->cur_input = 0; mxb->cur_mute = 1; mxb->cur_mode = V4L2_TUNER_MODE_STEREO; mxb->tda9840->driver->command(mxb->tda9840, TDA9840_SWITCH, &mxb->cur_mode); - + /* check if the saa7740 (aka 'sound arena module') is present - on the mxb. if so, we must initialize it. due to lack of + on the mxb. if so, we must initialize it. due to lack of informations about the saa7740, the values were reverse engineered. */ msg.addr = 0x1b; @@ -409,7 +409,7 @@ static int mxb_init_done(struct saa7146_dev* dev) break; } - msg.len = mxb_saa7740_init[i].length; + msg.len = mxb_saa7740_init[i].length; msg.buf = &mxb_saa7740_init[i].data[0]; if( 1 != (err = i2c_transfer(&mxb->i2c_adapter, &msg, 1))) { DEB_D(("failed to initialize 'sound arena module'.\n")); @@ -418,12 +418,12 @@ static int mxb_init_done(struct saa7146_dev* dev) } INFO(("'sound arena module' detected.\n")); } -err: +err: /* the rest for saa7146: you should definitely set some basic values for the input-port handling of the saa7146. */ /* ext->saa has been filled by the core driver */ - + /* some stuff is done via variables */ saa7146_set_hps_source_and_sync(dev, input_port_selection[mxb->cur_input].hps_source, input_port_selection[mxb->cur_input].hps_sync); @@ -431,7 +431,7 @@ err: /* this is ugly, but because of the fact that this is completely hardware dependend, it should be done directly... */ - saa7146_write(dev, DD1_STREAM_B, 0x00000000); + saa7146_write(dev, DD1_STREAM_B, 0x00000000); saa7146_write(dev, DD1_INIT, 0x02000200); saa7146_write(dev, MC2, (MASK_09 | MASK_25 | MASK_10 | MASK_26)); @@ -453,7 +453,7 @@ static struct saa7146_ext_vv vv_data; static int mxb_attach(struct saa7146_dev* dev, struct saa7146_pci_extension_data *info) { struct mxb* mxb = (struct mxb*)dev->ext_priv; - + DEB_EE(("dev:%p\n",dev)); /* checking for i2c-devices can be omitted here, because we @@ -464,7 +464,7 @@ static int mxb_attach(struct saa7146_dev* dev, struct saa7146_pci_extension_data ERR(("cannot register capture v4l2 device. skipping.\n")); return -1; } - + /* initialization stuff (vbi) (only for revision > 0 and for extensions which want it)*/ if( 0 != MXB_BOARD_CAN_DO_VBI(dev)) { if( 0 != saa7146_register_device(&mxb->vbi_dev, dev, "mxb", VFL_TYPE_VBI)) { @@ -513,17 +513,17 @@ static int mxb_detach(struct saa7146_dev* dev) return 0; } -static int mxb_ioctl(struct saa7146_fh *fh, unsigned int cmd, void *arg) +static int mxb_ioctl(struct saa7146_fh *fh, unsigned int cmd, void *arg) { struct saa7146_dev *dev = fh->dev; struct mxb* mxb = (struct mxb*)dev->ext_priv; - struct saa7146_vv *vv = dev->vv_data; - + struct saa7146_vv *vv = dev->vv_data; + switch(cmd) { case VIDIOC_ENUMINPUT: { struct v4l2_input *i = arg; - + DEB_EE(("VIDIOC_ENUMINPUT %d.\n",i->index)); if( i->index < 0 || i->index >= MXB_INPUTS) { return -EINVAL; @@ -559,11 +559,11 @@ static int mxb_ioctl(struct saa7146_fh *fh, unsigned int cmd, void *arg) break; } } - + if( i < 0 ) { return -EAGAIN; } - + switch (vc->id ) { case V4L2_CID_AUDIO_MUTE: { vc->value = mxb->cur_mute; @@ -571,7 +571,7 @@ static int mxb_ioctl(struct saa7146_fh *fh, unsigned int cmd, void *arg) return 0; } } - + DEB_EE(("VIDIOC_G_CTRL V4L2_CID_AUDIO_MUTE:%d.\n",vc->value)); return 0; } @@ -580,17 +580,17 @@ static int mxb_ioctl(struct saa7146_fh *fh, unsigned int cmd, void *arg) { struct v4l2_control *vc = arg; int i = 0; - + for (i = MAXCONTROLS - 1; i >= 0; i--) { if (mxb_controls[i].id == vc->id) { break; } } - + if( i < 0 ) { return -EAGAIN; } - + switch (vc->id ) { case V4L2_CID_AUDIO_MUTE: { mxb->cur_mute = vc->value; @@ -614,12 +614,12 @@ static int mxb_ioctl(struct saa7146_fh *fh, unsigned int cmd, void *arg) *input = mxb->cur_input; DEB_EE(("VIDIOC_G_INPUT %d.\n",*input)); - return 0; - } + return 0; + } case VIDIOC_S_INPUT: { int input = *(int *)arg; - struct tea6415c_multiplex vm; + struct tea6415c_multiplex vm; int i = 0; DEB_EE(("VIDIOC_S_INPUT %d.\n",input)); @@ -627,34 +627,34 @@ static int mxb_ioctl(struct saa7146_fh *fh, unsigned int cmd, void *arg) if (input < 0 || input >= MXB_INPUTS) { return -EINVAL; } - + /* fixme: locke das setzen des inputs mit hilfe des mutexes - mutex_lock(&dev->lock); + down(&dev->lock); video_mux(dev,*i); - mutex_unlock(&dev->lock); + up(&dev->lock); */ - + /* fixme: check if streaming capture if ( 0 != dev->streaming ) { DEB_D(("VIDIOC_S_INPUT illegal while streaming.\n")); return -EPERM; } */ - + mxb->cur_input = input; - + saa7146_set_hps_source_and_sync(dev, input_port_selection[input].hps_source, input_port_selection[input].hps_sync); - + /* prepare switching of tea6415c and saa7111a; have a look at the 'background'-file for further informations */ switch( input ) { - + case TUNER: { i = 0; vm.in = 3; vm.out = 17; - + if ( 0 != mxb->tea6415c->driver->command(mxb->tea6415c,TEA6415C_SWITCH, &vm)) { printk("VIDIOC_S_INPUT: could not address tea6415c #1\n"); return -EFAULT; @@ -662,7 +662,7 @@ static int mxb_ioctl(struct saa7146_fh *fh, unsigned int cmd, void *arg) /* connect tuner-output always to multicable */ vm.in = 3; vm.out = 13; - break; + break; } case AUX3_YC: { @@ -703,11 +703,11 @@ static int mxb_ioctl(struct saa7146_fh *fh, unsigned int cmd, void *arg) break; } } - + /* switch video in saa7111a */ if ( 0 != mxb->saa7111a->driver->command(mxb->saa7111a,DECODER_SET_INPUT, &i)) { printk("VIDIOC_S_INPUT: could not address saa7111a #1.\n"); - } + } /* switch the audio-source only if necessary */ if( 0 == mxb->cur_mute ) { @@ -738,11 +738,11 @@ static int mxb_ioctl(struct saa7146_fh *fh, unsigned int cmd, void *arg) t->rangehigh = 13684; /* 855.25 MHz / 62.5 kHz = 13684 */ /* FIXME: add the real signal strength here */ t->signal = 0xffff; - t->afc = 0; + t->afc = 0; mxb->tda9840->driver->command(mxb->tda9840,TDA9840_DETECT, &byte); t->audmode = mxb->cur_mode; - + if( byte < 0 ) { t->rxsubchans = V4L2_TUNER_SUB_MONO; } else { @@ -777,12 +777,12 @@ static int mxb_ioctl(struct saa7146_fh *fh, unsigned int cmd, void *arg) struct v4l2_tuner *t = arg; int result = 0; int byte = 0; - + if( 0 != t->index ) { DEB_D(("VIDIOC_S_TUNER: channel %d does not have a tuner attached.\n",t->index)); return -EINVAL; } - + switch(t->audmode) { case V4L2_TUNER_MODE_STEREO: { mxb->cur_mode = V4L2_TUNER_MODE_STEREO; @@ -790,12 +790,6 @@ static int mxb_ioctl(struct saa7146_fh *fh, unsigned int cmd, void *arg) DEB_D(("VIDIOC_S_TUNER: V4L2_TUNER_MODE_STEREO\n")); break; } - case V4L2_TUNER_MODE_LANG1_LANG2: { - mxb->cur_mode = V4L2_TUNER_MODE_LANG1_LANG2; - byte = TDA9840_SET_BOTH; - DEB_D(("VIDIOC_S_TUNER: V4L2_TUNER_MODE_LANG1_LANG2\n")); - break; - } case V4L2_TUNER_MODE_LANG1: { mxb->cur_mode = V4L2_TUNER_MODE_LANG1; byte = TDA9840_SET_LANG1; @@ -819,7 +813,7 @@ static int mxb_ioctl(struct saa7146_fh *fh, unsigned int cmd, void *arg) if( 0 != (result = mxb->tda9840->driver->command(mxb->tda9840, TDA9840_SWITCH, &byte))) { printk("VIDIOC_S_TUNER error. result:%d, byte:%d\n",result,byte); } - + return 0; } case VIDIOC_G_FREQUENCY: @@ -845,7 +839,7 @@ static int mxb_ioctl(struct saa7146_fh *fh, unsigned int cmd, void *arg) if (V4L2_TUNER_ANALOG_TV != f->type) return -EINVAL; - + if(0 != mxb->cur_input) { DEB_D(("VIDIOC_S_FREQ: channel %d does not have a tuner!\n",mxb->cur_input)); return -EINVAL; @@ -854,7 +848,7 @@ static int mxb_ioctl(struct saa7146_fh *fh, unsigned int cmd, void *arg) mxb->cur_freq = *f; DEB_EE(("VIDIOC_S_FREQUENCY: freq:0x%08x.\n", mxb->cur_freq.frequency)); - /* tune in desired frequency */ + /* tune in desired frequency */ mxb->tuner->driver->command(mxb->tuner, VIDIOC_S_FREQUENCY, &mxb->cur_freq); /* hack: changing the frequency should invalidate the vbi-counter (=> alevt) */ @@ -867,12 +861,12 @@ static int mxb_ioctl(struct saa7146_fh *fh, unsigned int cmd, void *arg) case MXB_S_AUDIO_CD: { int i = *(int*)arg; - + if( i < 0 || i >= MXB_AUDIOS ) { DEB_D(("illegal argument to MXB_S_AUDIO_CD: i:%d.\n",i)); return -EINVAL; } - + DEB_EE(("MXB_S_AUDIO_CD: i:%d.\n",i)); mxb->tea6420_1->driver->command(mxb->tea6420_1,TEA6420_SWITCH, &TEA6420_cd[i][0]); @@ -883,12 +877,12 @@ static int mxb_ioctl(struct saa7146_fh *fh, unsigned int cmd, void *arg) case MXB_S_AUDIO_LINE: { int i = *(int*)arg; - + if( i < 0 || i >= MXB_AUDIOS ) { DEB_D(("illegal argument to MXB_S_AUDIO_LINE: i:%d.\n",i)); return -EINVAL; } - + DEB_EE(("MXB_S_AUDIO_LINE: i:%d.\n",i)); mxb->tea6420_1->driver->command(mxb->tea6420_1,TEA6420_SWITCH, &TEA6420_line[i][0]); mxb->tea6420_2->driver->command(mxb->tea6420_2,TEA6420_SWITCH, &TEA6420_line[i][1]); @@ -900,13 +894,13 @@ static int mxb_ioctl(struct saa7146_fh *fh, unsigned int cmd, void *arg) struct v4l2_audio *a = arg; if( a->index < 0 || a->index > MXB_INPUTS ) { - DEB_D(("VIDIOC_G_AUDIO %d out of range.\n",a->index)); + DEB_D(("VIDIOC_G_AUDIO %d out of range.\n",a->index)); return -EINVAL; } - - DEB_EE(("VIDIOC_G_AUDIO %d.\n",a->index)); + + DEB_EE(("VIDIOC_G_AUDIO %d.\n",a->index)); memcpy(a, &mxb_audios[video_audio_connect[mxb->cur_input]], sizeof(struct v4l2_audio)); - + return 0; } case VIDIOC_S_AUDIO: @@ -914,7 +908,7 @@ static int mxb_ioctl(struct saa7146_fh *fh, unsigned int cmd, void *arg) struct v4l2_audio *a = arg; DEB_D(("VIDIOC_S_AUDIO %d.\n",a->index)); return 0; - } + } default: /* DEB2(printk("does not handle this ioctl.\n")); @@ -934,7 +928,7 @@ static int std_callback(struct saa7146_dev* dev, struct saa7146_standard *std) v4l2_std_id std = V4L2_STD_PAL_I; DEB_D(("VIDIOC_S_STD: setting mxb for PAL_I.\n")); /* set the 7146 gpio register -- I don't know what this does exactly */ - saa7146_write(dev, GPIO_CTRL, 0x00404050); + saa7146_write(dev, GPIO_CTRL, 0x00404050); /* unset the 7111 gpio register -- I don't know what this does exactly */ mxb->saa7111a->driver->command(mxb->saa7111a,DECODER_SET_GPIO, &zero); mxb->tuner->driver->command(mxb->tuner, VIDIOC_S_STD, &std); @@ -942,7 +936,7 @@ static int std_callback(struct saa7146_dev* dev, struct saa7146_standard *std) v4l2_std_id std = V4L2_STD_PAL_BG; DEB_D(("VIDIOC_S_STD: setting mxb for PAL/NTSC/SECAM.\n")); /* set the 7146 gpio register -- I don't know what this does exactly */ - saa7146_write(dev, GPIO_CTRL, 0x00404050); + saa7146_write(dev, GPIO_CTRL, 0x00404050); /* set the 7111 gpio register -- I don't know what this does exactly */ mxb->saa7111a->driver->command(mxb->saa7111a,DECODER_SET_GPIO, &one); mxb->tuner->driver->command(mxb->tuner, VIDIOC_S_STD, &std); @@ -975,8 +969,8 @@ static struct saa7146_standard standard[] = { }; static struct saa7146_pci_extension_data mxb = { - .ext_priv = "Multimedia eXtension Board", - .ext = &extension, + .ext_priv = "Multimedia eXtension Board", + .ext = &extension, }; static struct pci_device_id pci_tbl[] = { @@ -998,7 +992,7 @@ static struct saa7146_ext_vv vv_data = { .capabilities = V4L2_CAP_TUNER | V4L2_CAP_VBI_CAPTURE, .stds = &standard[0], .num_stds = sizeof(standard)/sizeof(struct saa7146_standard), - .std_callback = &std_callback, + .std_callback = &std_callback, .ioctls = &ioctls[0], .ioctl = mxb_ioctl, }; @@ -1006,7 +1000,7 @@ static struct saa7146_ext_vv vv_data = { static struct saa7146_extension extension = { .name = MXB_IDENTIFIER, .flags = SAA7146_USE_I2C_IRQ, - + .pci_tbl = &pci_tbl[0], .module = THIS_MODULE, @@ -1016,7 +1010,7 @@ static struct saa7146_extension extension = { .irq_mask = 0, .irq_func = NULL, -}; +}; static int __init mxb_init_module(void) { @@ -1024,7 +1018,7 @@ static int __init mxb_init_module(void) DEB_S(("failed to register extension.\n")); return -ENODEV; } - + return 0; } diff --git a/drivers/media/video/mxb.h b/drivers/media/video/mxb.h index 400a57ba6..2332ed5f7 100644 --- a/drivers/media/video/mxb.h +++ b/drivers/media/video/mxb.h @@ -38,5 +38,5 @@ static struct v4l2_audio mxb_audios[MXB_AUDIOS] = { .name = "CD-ROM (X10)", .capability = V4L2_AUDCAP_STEREO, } -}; +}; #endif diff --git a/drivers/media/video/ovcamchip/Makefile b/drivers/media/video/ovcamchip/Makefile index cba4cdf20..bca41ad93 100644 --- a/drivers/media/video/ovcamchip/Makefile +++ b/drivers/media/video/ovcamchip/Makefile @@ -1,4 +1,4 @@ ovcamchip-objs := ovcamchip_core.o ov6x20.o ov6x30.o ov7x10.o ov7x20.o \ - ov76be.o + ov76be.o obj-$(CONFIG_VIDEO_OVCAMCHIP) += ovcamchip.o diff --git a/drivers/media/video/ovcamchip/ovcamchip_core.c b/drivers/media/video/ovcamchip/ovcamchip_core.c index 3fe9fa04c..e76b53d59 100644 --- a/drivers/media/video/ovcamchip/ovcamchip_core.c +++ b/drivers/media/video/ovcamchip/ovcamchip_core.c @@ -266,17 +266,17 @@ static int ovcamchip_detect(struct i2c_client *c) PDEBUG(3, "Testing for 0V6xx0"); c->addr = OV6xx0_SID; if (init_camchip(c) < 0) { - return -ENODEV; + return -ENODEV; } else { if (ov6xx0_detect(c) < 0) { PERROR("Failed to init OV6xx0"); - return -EIO; + return -EIO; } } } else { if (ov7xx0_detect(c) < 0) { PERROR("Failed to init OV7xx0"); - return -EIO; + return -EIO; } } diff --git a/drivers/media/video/ovcamchip/ovcamchip_priv.h b/drivers/media/video/ovcamchip/ovcamchip_priv.h index 1231335a9..575e612a5 100644 --- a/drivers/media/video/ovcamchip/ovcamchip_priv.h +++ b/drivers/media/video/ovcamchip/ovcamchip_priv.h @@ -82,6 +82,6 @@ extern int ov_write_regvals(struct i2c_client *c, struct ovcamchip_regvals *rvals); extern int ov_write_mask(struct i2c_client *c, unsigned char reg, - unsigned char value, unsigned char mask); + unsigned char value, unsigned char mask); #endif diff --git a/drivers/media/video/planb.c b/drivers/media/video/planb.c index 3484e36b6..f3fc361be 100644 --- a/drivers/media/video/planb.c +++ b/drivers/media/video/planb.c @@ -1,4 +1,4 @@ -/* +/* planb - PlanB frame grabber driver PlanB is used in the 7x00/8x00 series of PowerMacintosh @@ -40,7 +40,6 @@ #include #include #include -#include #include #include #include @@ -49,7 +48,7 @@ #include #include #include -#include +#include #include "planb.h" #include "saa7196.h" @@ -330,12 +329,12 @@ static volatile struct dbdma_cmd *cmd_geo_setup( static inline void planb_lock(struct planb *pb) { - mutex_lock(&pb->lock); + down(&pb->lock); } static inline void planb_unlock(struct planb *pb) { - mutex_unlock(&pb->lock); + up(&pb->lock); } /***************/ @@ -585,7 +584,7 @@ finish: wake_up_interruptible(&pb->suspendq); } -static void add_clip(struct planb *pb, struct video_clip *clip) +static void add_clip(struct planb *pb, struct video_clip *clip) { volatile unsigned char *base; int xc = clip->x, yc = clip->y; @@ -759,7 +758,7 @@ static void cmd_buff(struct planb *pb) PLANB_SET(CH_SYNC)); tab_cmd_store(c1++, (unsigned)(&pb->planb_base_phys->ch1.br_sel), PLANB_SET(DMA_ABORT)); - + /* odd field data: */ jump = virt_to_bus(c1 + nlines / 2); for (i=1; i < nlines; i += stepsize, c1++) @@ -1248,7 +1247,7 @@ static volatile struct dbdma_cmd *setup_grab_cmd(int fr, struct planb *pb) tab_cmd_dbdma(c1, DBDMA_NOP | BR_IFCLR, virt_to_bus(c1-3)); c1++; tab_cmd_store(c1++, (unsigned)(&pb->planb_base_phys->ch1.br_sel), PLANB_SET(DMA_ABORT)); - + /* odd field data: */ jump_addr = c1 + TAB_FACTOR * nlines / 2; jump = virt_to_bus(jump_addr); @@ -1384,7 +1383,7 @@ static int planb_open(struct video_device *dev, int mode) pb->user++; DEBUG("PlanB: device opened\n"); - return 0; + return 0; } static void planb_close(struct video_device *dev) @@ -1425,9 +1424,9 @@ static long planb_write(struct video_device *v, const char *buf, static int planb_ioctl(struct video_device *dev, unsigned int cmd, void *arg) { struct planb *pb=(struct planb *)dev; - + switch (cmd) - { + { case VIDIOCGCAP: { struct video_capability b; @@ -1441,26 +1440,26 @@ static int planb_ioctl(struct video_device *dev, unsigned int cmd, void *arg) b.channels = 2; /* composite & svhs */ b.audios = 0; b.maxwidth = PLANB_MAXPIXELS; - b.maxheight = PLANB_MAXLINES; - b.minwidth = 32; /* wild guess */ - b.minheight = 32; - if (copy_to_user(arg,&b,sizeof(b))) - return -EFAULT; + b.maxheight = PLANB_MAXLINES; + b.minwidth = 32; /* wild guess */ + b.minheight = 32; + if (copy_to_user(arg,&b,sizeof(b))) + return -EFAULT; return 0; } case VIDIOCSFBUF: { - struct video_buffer v; + struct video_buffer v; unsigned short bpp; unsigned int fmt; DEBUG("PlanB: IOCTL VIDIOCSFBUF\n"); - if (!capable(CAP_SYS_ADMIN) + if (!capable(CAP_SYS_ADMIN) || !capable(CAP_SYS_RAWIO)) - return -EPERM; - if (copy_from_user(&v, arg,sizeof(v))) - return -EFAULT; + return -EPERM; + if (copy_from_user(&v, arg,sizeof(v))) + return -EFAULT; planb_lock(pb); switch(v.depth) { case 8: @@ -1479,7 +1478,7 @@ static int planb_ioctl(struct video_device *dev, unsigned int cmd, void *arg) break; default: planb_unlock(pb); - return -EINVAL; + return -EINVAL; } if (bpp * v.width > v.bytesperline) { planb_unlock(pb); @@ -1494,7 +1493,7 @@ static int planb_ioctl(struct video_device *dev, unsigned int cmd, void *arg) pb->win.bpl = pb->win.bpp * pb->win.swidth; pb->win.pad = v.bytesperline - pb->win.bpl; - DEBUG("PlanB: Display at %p is %d by %d, bytedepth %d," + DEBUG("PlanB: Display at %p is %d by %d, bytedepth %d," " bpl %d (+ %d)\n", v.base, v.width,v.height, pb->win.bpp, pb->win.bpl, pb->win.pad); @@ -1505,11 +1504,11 @@ static int planb_ioctl(struct video_device *dev, unsigned int cmd, void *arg) resume_overlay(pb); } planb_unlock(pb); - return 0; + return 0; } case VIDIOCGFBUF: { - struct video_buffer v; + struct video_buffer v; DEBUG("PlanB: IOCTL VIDIOCGFBUF\n"); @@ -1519,15 +1518,15 @@ static int planb_ioctl(struct video_device *dev, unsigned int cmd, void *arg) v.depth = pb->win.depth; v.bytesperline = pb->win.bpl + pb->win.pad; if (copy_to_user(arg, &v, sizeof(v))) - return -EFAULT; + return -EFAULT; return 0; } case VIDIOCCAPTURE: { int i; - if(copy_from_user(&i, arg, sizeof(i))) - return -EFAULT; + if(copy_from_user(&i, arg, sizeof(i))) + return -EFAULT; if(i==0) { DEBUG("PlanB: IOCTL VIDIOCCAPTURE Stop\n"); @@ -1696,7 +1695,7 @@ static int planb_ioctl(struct video_device *dev, unsigned int cmd, void *arg) struct video_window vw; struct video_clip clip; int i; - + DEBUG("PlanB: IOCTL VIDIOCSWIN\n"); if(copy_from_user(&vw,arg,sizeof(vw))) @@ -1750,7 +1749,7 @@ static int planb_ioctl(struct video_device *dev, unsigned int cmd, void *arg) return -EFAULT; return 0; } - case VIDIOCSYNC: { + case VIDIOCSYNC: { int i; IDEBUG("PlanB: IOCTL VIDIOCSYNC\n"); @@ -1760,42 +1759,42 @@ static int planb_ioctl(struct video_device *dev, unsigned int cmd, void *arg) IDEBUG("PlanB: sync to frame %d\n", i); - if(i > (MAX_GBUFFERS - 1) || i < 0) - return -EINVAL; + if(i > (MAX_GBUFFERS - 1) || i < 0) + return -EINVAL; chk_grab: - switch (pb->frame_stat[i]) { - case GBUFFER_UNUSED: - return -EINVAL; + switch (pb->frame_stat[i]) { + case GBUFFER_UNUSED: + return -EINVAL; case GBUFFER_GRABBING: IDEBUG("PlanB: waiting for grab" " done (%d)\n", i); - interruptible_sleep_on(&pb->capq); + interruptible_sleep_on(&pb->capq); if(signal_pending(current)) return -EINTR; goto chk_grab; - case GBUFFER_DONE: - pb->frame_stat[i] = GBUFFER_UNUSED; - break; - } - return 0; + case GBUFFER_DONE: + pb->frame_stat[i] = GBUFFER_UNUSED; + break; + } + return 0; } - case VIDIOCMCAPTURE: + case VIDIOCMCAPTURE: { - struct video_mmap vm; + struct video_mmap vm; volatile unsigned int status; IDEBUG("PlanB: IOCTL VIDIOCMCAPTURE\n"); if(copy_from_user((void *) &vm,(void *)arg,sizeof(vm))) return -EFAULT; - status = pb->frame_stat[vm.frame]; - if (status != GBUFFER_UNUSED) - return -EBUSY; + status = pb->frame_stat[vm.frame]; + if (status != GBUFFER_UNUSED) + return -EBUSY; - return vgrab(pb, &vm); + return vgrab(pb, &vm); } - + case VIDIOCGMBUF: { int i; @@ -1812,7 +1811,7 @@ chk_grab: return -EFAULT; return 0; } - + case PLANBIOCGSAAREGS: { struct planb_saa_regs preg; @@ -1829,7 +1828,7 @@ chk_grab: return -EFAULT; return 0; } - + case PLANBIOCSSAAREGS: { struct planb_saa_regs preg; @@ -1843,7 +1842,7 @@ chk_grab: saa_set (preg.addr, preg.val, pb); return 0; } - + case PLANBIOCGSTAT: { struct planb_stat_regs pstat; @@ -1860,7 +1859,7 @@ chk_grab: return -EFAULT; return 0; } - + case PLANBIOCSMODE: { int v; @@ -1986,10 +1985,10 @@ static int planb_mmap(struct vm_area_struct *vma, struct video_device *dev, cons { int i; struct planb *pb = (struct planb *)dev; - unsigned long start = (unsigned long)adr; + unsigned long start = (unsigned long)adr; if (size > MAX_GBUFFERS * PLANB_MAX_FBUF) - return -EINVAL; + return -EINVAL; if (!pb->rawbuf) { int err; if((err=grabbuf_alloc(pb))) @@ -2068,7 +2067,7 @@ static int init_planb(struct planb *pb) #endif pb->tab_size = PLANB_MAXLINES + 40; pb->suspend = 0; - mutex_init(&pb->lock); + init_MUTEX(&pb->lock); pb->ch1_cmd = 0; pb->ch2_cmd = 0; pb->mask = 0; @@ -2092,10 +2091,10 @@ static int init_planb(struct planb *pb) /* clear interrupt mask */ pb->intr_mask = PLANB_CLR_IRQ; - result = request_irq(pb->irq, planb_irq, 0, "PlanB", (void *)pb); - if (result < 0) { - if (result==-EINVAL) - printk(KERN_ERR "PlanB: Bad irq number (%d) " + result = request_irq(pb->irq, planb_irq, 0, "PlanB", (void *)pb); + if (result < 0) { + if (result==-EINVAL) + printk(KERN_ERR "PlanB: Bad irq number (%d) " "or handler\n", (int)pb->irq); else if (result==-EBUSY) printk(KERN_ERR "PlanB: I don't know why, " @@ -2103,7 +2102,7 @@ static int init_planb(struct planb *pb) return result; } disable_irq(pb->irq); - + /* Now add the template and register the device unit. */ memcpy(&pb->video_dev,&planb_template,sizeof(planb_template)); @@ -2144,7 +2143,7 @@ static int init_planb(struct planb *pb) } /* - * Scan for a PlanB controller, request the irq and map the io memory + * Scan for a PlanB controller, request the irq and map the io memory */ static int find_planb(void) @@ -2157,7 +2156,7 @@ static int find_planb(void) struct pci_dev *pdev; int rc; - if (!machine_is(powermac)) + if (_machine != _MACH_Pmac) return 0; planb_devices = find_devices("planb"); @@ -2172,9 +2171,9 @@ static int find_planb(void) pb = &planbs[0]; planb_num = 1; - if (planb_devices->n_addrs != 1) { - printk (KERN_WARNING "PlanB: expecting 1 address for planb " - "(got %d)", planb_devices->n_addrs); + if (planb_devices->n_addrs != 1) { + printk (KERN_WARNING "PlanB: expecting 1 address for planb " + "(got %d)", planb_devices->n_addrs); return 0; } @@ -2237,7 +2236,7 @@ static int find_planb(void) pb->planb_base = planb_regs; pb->planb_base_phys = (struct planb_registers *)new_base; pb->irq = irq; - + return planb_num; err_out_disable: @@ -2252,7 +2251,7 @@ static void release_planb(void) int i; struct planb *pb; - for (i=0;i - * - pms_capture: report back -EFAULT + * - pms_capture: report back -EFAULT */ #include @@ -30,9 +30,6 @@ #include #include #include -#include -#include - #include @@ -47,7 +44,7 @@ struct pms_device struct video_picture picture; int height; int width; - struct mutex lock; + struct semaphore lock; }; struct i2c_info @@ -67,14 +64,14 @@ static int standard = 0; /* 0 - auto 1 - ntsc 2 - pal 3 - secam */ /* * I/O ports and Shared Memory */ - + static int io_port = 0x250; static int data_port = 0x251; static int mem_base = 0xC8000; static void __iomem *mem; static int video_nr = -1; - + static inline void mvv_write(u8 index, u8 value) { @@ -91,9 +88,9 @@ static int pms_i2c_stat(u8 slave) { int counter; int i; - + outb(0x28, io_port); - + counter=0; while((inb(data_port)&0x01)==0) if(counter++==256) @@ -102,9 +99,9 @@ static int pms_i2c_stat(u8 slave) while((inb(data_port)&0x01)!=0) if(counter++==256) break; - + outb(slave, io_port); - + counter=0; while((inb(data_port)&0x01)==0) if(counter++==256) @@ -113,7 +110,7 @@ static int pms_i2c_stat(u8 slave) while((inb(data_port)&0x01)!=0) if(counter++==256) break; - + for(i=0;i<12;i++) { char st=inb(data_port); @@ -123,7 +120,7 @@ static int pms_i2c_stat(u8 slave) break; } outb(0x29, io_port); - return inb(data_port); + return inb(data_port); } static int pms_i2c_write(u16 slave, u16 sub, u16 data) @@ -131,19 +128,19 @@ static int pms_i2c_write(u16 slave, u16 sub, u16 data) int skip=0; int count; int i; - + for(i=0;i255) @@ -168,9 +165,9 @@ static int pms_i2c_write(u16 slave, u16 sub, u16 data) while((inb(data_port)&1)!=0) if(count>255) break; - + count=inb(data_port); - + if(count&2) return -1; return count; @@ -190,8 +187,8 @@ static int pms_i2c_read(int slave, int sub) static void pms_i2c_andor(int slave, int sub, int and, int or) { - u8 tmp; - + u8 tmp; + tmp=pms_i2c_read(slave, sub); tmp = (tmp&and)|or; pms_i2c_write(slave, sub, tmp); @@ -200,7 +197,7 @@ static void pms_i2c_andor(int slave, int sub, int and, int or) /* * Control functions */ - + static void pms_videosource(short source) { @@ -235,8 +232,8 @@ static void pms_colour(short colour) break; } } - - + + static void pms_contrast(short contrast) { switch(decoder) @@ -270,14 +267,14 @@ static void pms_format(short format) { int target; standard = format; - + if(decoder==PHILIPS1) target=0x42; else if(decoder==PHILIPS2) target=0x8A; else return; - + switch(format) { case 0: /* Auto */ @@ -303,7 +300,7 @@ static void pms_format(short format) /* * These features of the PMS card are not currently exposes. They - * could become a private v4l ioctl for PMSCONFIG or somesuch if + * could become a private v4l ioctl for PMSCONFIG or somesuch if * people need it. We also don't yet use the PMS interrupt. */ @@ -325,7 +322,7 @@ static void pms_hstart(short start) /* * Bandpass filters */ - + static void pms_bandpass(short pass) { if(decoder==PHILIPS2) @@ -494,7 +491,7 @@ static void pms_vert(u8 deciden, u8 decinum) /* * Turn 16bit ratios into best small ratio the chipset can grok */ - + static void pms_vertdeci(unsigned short decinum, unsigned short deciden) { /* Knock it down by /5 once */ @@ -547,7 +544,7 @@ static void pms_horzdeci(short decinum, short deciden) decinum=512; deciden=640; /* 768 would be ideal */ } - + while(((decinum|deciden)&1)==0) { decinum>>=1; @@ -560,7 +557,7 @@ static void pms_horzdeci(short decinum, short deciden) } if(deciden==32) deciden--; - + mvv_write(0x24, 0x80|deciden); mvv_write(0x25, decinum); } @@ -568,14 +565,14 @@ static void pms_horzdeci(short decinum, short deciden) static void pms_resolution(short width, short height) { int fg_height; - + fg_height=height; if(fg_height>280) fg_height=280; - + mvv_write(0x18, fg_height); mvv_write(0x19, fg_height>>8); - + if(standard==1) { mvv_write(0x1A, 0xFC); @@ -599,7 +596,7 @@ static void pms_resolution(short width, short height) mvv_write(0x42, 0x00); mvv_write(0x43, 0x00); mvv_write(0x44, MVVMEMORYWIDTH); - + mvv_write(0x22, width+8); mvv_write(0x23, (width+8)>> 8); @@ -619,7 +616,7 @@ static void pms_resolution(short width, short height) /* * Set Input */ - + static void pms_vcrinput(short input) { if(decoder==PHILIPS2) @@ -644,20 +641,20 @@ static int pms_capture(struct pms_device *dev, char __user *buf, int rgb555, int mvv_write(0x08,r8); /* capture rgb555/565, init DRAM, PC enable */ /* printf("%d %d %d %d %d %x %x\n",width,height,voff,nom,den,mvv_buf); */ - - for (y = 0; y < dev->height; y++ ) + + for (y = 0; y < dev->height; y++ ) { writeb(0, mem); /* synchronisiert neue Zeile */ - + /* * This is in truth a fifo, be very careful as if you * forgot this odd things will occur 8) */ - + memcpy_fromio(tmp, mem, dw+32); /* discard 16 word */ cnt -= dev->height; - while (cnt <= 0) - { + while (cnt <= 0) + { /* * Don't copy too far */ @@ -667,7 +664,7 @@ static int pms_capture(struct pms_device *dev, char __user *buf, int rgb555, int cnt += dev->height; if (copy_to_user(buf, tmp+32, dt)) return len ? len : -EFAULT; - buf += dt; + buf += dt; len += dt; } } @@ -684,7 +681,7 @@ static int pms_do_ioctl(struct inode *inode, struct file *file, { struct video_device *dev = video_devdata(file); struct pms_device *pd=(struct pms_device *)dev; - + switch(cmd) { case VIDIOCGCAP: @@ -727,10 +724,10 @@ static int pms_do_ioctl(struct inode *inode, struct file *file, struct video_channel *v = arg; if(v->channel<0 || v->channel>3) return -EINVAL; - mutex_lock(&pd->lock); + down(&pd->lock); pms_videosource(v->channel&1); pms_vcrinput(v->channel>>1); - mutex_unlock(&pd->lock); + up(&pd->lock); return 0; } case VIDIOCGTUNER: @@ -764,7 +761,7 @@ static int pms_do_ioctl(struct inode *inode, struct file *file, struct video_tuner *v = arg; if(v->tuner) return -EINVAL; - mutex_lock(&pd->lock); + down(&pd->lock); switch(v->mode) { case VIDEO_MODE_AUTO: @@ -788,10 +785,10 @@ static int pms_do_ioctl(struct inode *inode, struct file *file, pms_format(2); break; default: - mutex_unlock(&pd->lock); + up(&pd->lock); return -EINVAL; } - mutex_unlock(&pd->lock); + up(&pd->lock); return 0; } case VIDIOCGPICT: @@ -805,19 +802,19 @@ static int pms_do_ioctl(struct inode *inode, struct file *file, struct video_picture *p = arg; if(!((p->palette==VIDEO_PALETTE_RGB565 && p->depth==16) ||(p->palette==VIDEO_PALETTE_RGB555 && p->depth==15))) - return -EINVAL; + return -EINVAL; pd->picture= *p; - + /* * Now load the card. */ - mutex_lock(&pd->lock); + down(&pd->lock); pms_brightness(p->brightness>>8); pms_hue(p->hue>>8); pms_colour(p->colour>>8); - pms_contrast(p->contrast>>8); - mutex_unlock(&pd->lock); + pms_contrast(p->contrast>>8); + up(&pd->lock); return 0; } case VIDIOCSWIN: @@ -833,9 +830,9 @@ static int pms_do_ioctl(struct inode *inode, struct file *file, return -EINVAL; pd->width=vw->width; pd->height=vw->height; - mutex_lock(&pd->lock); + down(&pd->lock); pms_resolution(pd->width, pd->height); - mutex_unlock(&pd->lock); /* Ok we figured out what to use from our wide choice */ + up(&pd->lock); /* Ok we figured out what to use from our wide choice */ return 0; } case VIDIOCGWIN: @@ -874,10 +871,10 @@ static ssize_t pms_read(struct file *file, char __user *buf, struct video_device *v = video_devdata(file); struct pms_device *pd=(struct pms_device *)v; int len; - - mutex_lock(&pd->lock); + + down(&pd->lock); len=pms_capture(pd, buf, (pd->picture.depth==16)?0:1,count); - mutex_unlock(&pd->lock); + up(&pd->lock); return len; } @@ -906,13 +903,13 @@ static struct pms_device pms_device; /* * Probe for and initialise the Mediavision PMS */ - + static int init_mediavision(void) { int id; int idec, decst; int i; - + unsigned char i2c_defs[]={ 0x4C,0x30,0x00,0xE8, 0xB6,0xE2,0x00,0x00, @@ -926,7 +923,7 @@ static int init_mediavision(void) mem = ioremap(mem_base, 0x800); if (!mem) return -ENOMEM; - + if (!request_region(0x9A01, 1, "Mediavision PMS config")) { printk(KERN_WARNING "mediavision: unable to detect: 0x9A01 in use.\n"); @@ -942,18 +939,18 @@ static int init_mediavision(void) } outb(0xB8, 0x9A01); /* Unlock */ outb(io_port>>4, 0x9A01); /* Set IO port */ - - + + id=mvv_read(3); decst=pms_i2c_stat(0x43); - + if(decst!=-1) idec=2; else if(pms_i2c_stat(0xb9)!=-1) idec=3; else if(pms_i2c_stat(0x8b)!=-1) idec=1; - else + else idec=0; printk(KERN_INFO "PMS type is %d\n", idec); @@ -967,11 +964,11 @@ static int init_mediavision(void) /* * Ok we have a PMS of some sort */ - + mvv_write(0x04, mem_base>>12); /* Set the memory area */ - + /* Ok now load the defaults */ - + for(i=0;i<0x19;i++) { if(i2c_defs[i]==0xFF) @@ -979,7 +976,7 @@ static int init_mediavision(void) else pms_i2c_write(0x8A, i, i2c_defs[i]); } - + pms_i2c_write(0xB8,0x00,0x12); pms_i2c_write(0xB8,0x04,0x00); pms_i2c_write(0xB8,0x07,0x00); @@ -988,18 +985,18 @@ static int init_mediavision(void) pms_i2c_write(0xB8,0x0A,0x00); pms_i2c_write(0xB8,0x0B,0x10); pms_i2c_write(0xB8,0x10,0x03); - + mvv_write(0x01, 0x00); mvv_write(0x05, 0xA0); mvv_write(0x08, 0x25); mvv_write(0x09, 0x00); - mvv_write(0x0A, 0x20|MVVMEMORYWIDTH); - + mvv_write(0x0A, 0x20|MVVMEMORYWIDTH); + mvv_write(0x10, 0x02); mvv_write(0x1E, 0x0C); mvv_write(0x1F, 0x03); mvv_write(0x26, 0x06); - + mvv_write(0x2B, 0x00); mvv_write(0x2C, 0x20); mvv_write(0x2D, 0x00); @@ -1019,20 +1016,20 @@ static int init_mediavision(void) /* * Initialization and module stuff */ - + static int __init init_pms_cards(void) { printk(KERN_INFO "Mediavision Pro Movie Studio driver 0.02\n"); - + data_port = io_port +1; - + if(init_mediavision()) { printk(KERN_INFO "Board not found.\n"); return -ENODEV; } memcpy(&pms_device, &pms_template, sizeof(pms_template)); - mutex_init(&pms_device.lock); + init_MUTEX(&pms_device.lock); pms_device.height=240; pms_device.width=320; pms_swsense(75); diff --git a/drivers/media/video/saa5246a.c b/drivers/media/video/saa5246a.c index 59a187272..2ce010201 100644 --- a/drivers/media/video/saa5246a.c +++ b/drivers/media/video/saa5246a.c @@ -46,9 +46,6 @@ #include #include #include -#include -#include - #include "saa5246a.h" MODULE_AUTHOR("Michael Geng "); @@ -60,7 +57,7 @@ struct saa5246a_device u8 pgbuf[NUM_DAUS][VTX_VIRTUALSIZE]; int is_searching[NUM_DAUS]; struct i2c_client *client; - struct mutex lock; + struct semaphore lock; }; static struct video_device saa_template; /* Declared near bottom */ @@ -93,7 +90,7 @@ static int saa5246a_attach(struct i2c_adapter *adap, int addr, int kind) return -ENOMEM; } strlcpy(client->name, IF_NAME, I2C_NAME_SIZE); - mutex_init(&t->lock); + init_MUTEX(&t->lock); /* * Now create a video4linux device @@ -722,9 +719,9 @@ static int saa5246a_ioctl(struct inode *inode, struct file *file, int err; cmd = vtx_fix_command(cmd); - mutex_lock(&t->lock); + down(&t->lock); err = video_usercopy(inode, file, cmd, arg, do_saa5246a_ioctl); - mutex_unlock(&t->lock); + up(&t->lock); return err; } diff --git a/drivers/media/video/saa5249.c b/drivers/media/video/saa5249.c index 19a8d6569..5694eb58c 100644 --- a/drivers/media/video/saa5249.c +++ b/drivers/media/video/saa5249.c @@ -56,9 +56,6 @@ #include #include #include -#include -#include - #include #include @@ -72,7 +69,7 @@ #define NUM_BUFS 8 #define IF_NAME "SAA5249" -static const int disp_modes[8][3] = +static const int disp_modes[8][3] = { { 0x46, 0x03, 0x03 }, /* DISPOFF */ { 0x46, 0xcc, 0xcc }, /* DISPNORM */ @@ -108,7 +105,7 @@ struct saa5249_device int disp_mode; int virtual_mode; struct i2c_client *client; - struct mutex lock; + struct semaphore lock; }; @@ -151,8 +148,8 @@ static int saa5249_attach(struct i2c_adapter *adap, int addr, int kind) client=kmalloc(sizeof(*client), GFP_KERNEL); if(client==NULL) return -ENOMEM; - client_template.adapter = adap; - client_template.addr = addr; + client_template.adapter = adap; + client_template.addr = addr; memcpy(client, &client_template, sizeof(*client)); t = kzalloc(sizeof(*t), GFP_KERNEL); if(t==NULL) @@ -161,12 +158,12 @@ static int saa5249_attach(struct i2c_adapter *adap, int addr, int kind) return -ENOMEM; } strlcpy(client->name, IF_NAME, I2C_NAME_SIZE); - mutex_init(&t->lock); - + init_MUTEX(&t->lock); + /* * Now create a video4linux device */ - + vd = kmalloc(sizeof(struct video_device), GFP_KERNEL); if(vd==NULL) { @@ -176,8 +173,8 @@ static int saa5249_attach(struct i2c_adapter *adap, int addr, int kind) } i2c_set_clientdata(client, vd); memcpy(vd, &saa_template, sizeof(*vd)); - - for (pgbuf = 0; pgbuf < NUM_DAUS; pgbuf++) + + for (pgbuf = 0; pgbuf < NUM_DAUS; pgbuf++) { memset(t->vdau[pgbuf].pgbuf, ' ', sizeof(t->vdau[0].pgbuf)); memset(t->vdau[pgbuf].sregs, 0, sizeof(t->vdau[0].sregs)); @@ -187,9 +184,9 @@ static int saa5249_attach(struct i2c_adapter *adap, int addr, int kind) t->vdau[pgbuf].stopped = TRUE; t->is_searching[pgbuf] = FALSE; } - vd->priv=t; - - + vd->priv=t; + + /* * Register it */ @@ -209,7 +206,7 @@ static int saa5249_attach(struct i2c_adapter *adap, int addr, int kind) /* * We do most of the hard work when we become a device on the i2c. */ - + static int saa5249_probe(struct i2c_adapter *adap) { if (adap->class & I2C_CLASS_TV_ANALOG) @@ -230,7 +227,7 @@ static int saa5249_detach(struct i2c_client *client) /* new I2C driver support */ -static struct i2c_driver i2c_driver_videotext = +static struct i2c_driver i2c_driver_videotext = { .driver = { .name = IF_NAME, /* name */ @@ -250,7 +247,7 @@ static struct i2c_client client_template = { * delay may be longer. */ -static void jdelay(unsigned long delay) +static void jdelay(unsigned long delay) { sigset_t oldblocked = current->blocked; @@ -270,14 +267,14 @@ static void jdelay(unsigned long delay) /* * I2C interfaces */ - -static int i2c_sendbuf(struct saa5249_device *t, int reg, int count, u8 *data) + +static int i2c_sendbuf(struct saa5249_device *t, int reg, int count, u8 *data) { char buf[64]; - + buf[0] = reg; memcpy(buf+1, data, count); - + if(i2c_master_send(t->client, buf, count+1)==count+1) return 0; return -1; @@ -290,7 +287,7 @@ static int i2c_senddata(struct saa5249_device *t, ...) int ct=0; va_list argp; va_start(argp,t); - + while((v=va_arg(argp,int))!=-1) buf[ct++]=v; return i2c_sendbuf(t, buf[0], ct-1, buf+1); @@ -302,7 +299,7 @@ static int i2c_senddata(struct saa5249_device *t, ...) * Returns -1 if I²C-device didn't send acknowledge, 0 otherwise */ -static int i2c_getdata(struct saa5249_device *t, int count, u8 *buf) +static int i2c_getdata(struct saa5249_device *t, int count, u8 *buf) { if(i2c_master_recv(t->client, buf, count)!=count) return -1; @@ -321,9 +318,9 @@ static int do_saa5249_ioctl(struct inode *inode, struct file *file, struct video_device *vd = video_devdata(file); struct saa5249_device *t=vd->priv; - switch(cmd) + switch(cmd) { - case VTXIOCGETINFO: + case VTXIOCGETINFO: { vtx_info_t *info = arg; info->version_major = VTX_VER_MAJ; @@ -333,10 +330,10 @@ static int do_saa5249_ioctl(struct inode *inode, struct file *file, return 0; } - case VTXIOCCLRPAGE: + case VTXIOCCLRPAGE: { vtx_pagereq_t *req = arg; - + if (req->pgbuf < 0 || req->pgbuf >= NUM_DAUS) return -EINVAL; memset(t->vdau[req->pgbuf].pgbuf, ' ', sizeof(t->vdau[0].pgbuf)); @@ -344,17 +341,17 @@ static int do_saa5249_ioctl(struct inode *inode, struct file *file, return 0; } - case VTXIOCCLRFOUND: + case VTXIOCCLRFOUND: { vtx_pagereq_t *req = arg; - + if (req->pgbuf < 0 || req->pgbuf >= NUM_DAUS) return -EINVAL; t->vdau[req->pgbuf].clrfound = TRUE; return 0; } - case VTXIOCPAGEREQ: + case VTXIOCPAGEREQ: { vtx_pagereq_t *req = arg; if (!(req->pagemask & PGMASK_PAGE)) @@ -382,7 +379,7 @@ static int do_saa5249_ioctl(struct inode *inode, struct file *file, return 0; } - case VTXIOCGETSTAT: + case VTXIOCGETSTAT: { vtx_pagereq_t *req = arg; u8 infobits[10]; @@ -391,7 +388,7 @@ static int do_saa5249_ioctl(struct inode *inode, struct file *file, if (req->pgbuf < 0 || req->pgbuf >= NUM_DAUS) return -EINVAL; - if (!t->vdau[req->pgbuf].stopped) + if (!t->vdau[req->pgbuf].stopped) { if (i2c_senddata(t, 2, 0, -1) || i2c_sendbuf(t, 3, sizeof(t->vdau[0].sregs), t->vdau[req->pgbuf].sregs) || @@ -404,7 +401,7 @@ static int do_saa5249_ioctl(struct inode *inode, struct file *file, return -EIO; if (!(infobits[8] & 0x10) && !(infobits[7] & 0xf0) && /* check FOUND-bit */ - (memcmp(infobits, t->vdau[req->pgbuf].laststat, sizeof(infobits)) || + (memcmp(infobits, t->vdau[req->pgbuf].laststat, sizeof(infobits)) || time_after_eq(jiffies, t->vdau[req->pgbuf].expire))) { /* check if new page arrived */ if (i2c_senddata(t, 8, 0, 0, 0, -1) || @@ -412,7 +409,7 @@ static int do_saa5249_ioctl(struct inode *inode, struct file *file, return -EIO; t->vdau[req->pgbuf].expire = jiffies + PGBUF_EXPIRE; memset(t->vdau[req->pgbuf].pgbuf + VTX_PAGESIZE, ' ', VTX_VIRTUALSIZE - VTX_PAGESIZE); - if (t->virtual_mode) + if (t->virtual_mode) { /* Packet X/24 */ if (i2c_senddata(t, 8, 0, 0x20, 0, -1) || @@ -460,9 +457,9 @@ static int do_saa5249_ioctl(struct inode *inode, struct file *file, info.notfound = !!(infobits[8] & 0x10); info.pblf = !!(infobits[9] & 0x20); info.hamming = 0; - for (a = 0; a <= 7; a++) + for (a = 0; a <= 7; a++) { - if (infobits[a] & 0xf0) + if (infobits[a] & 0xf0) { info.hamming = 1; break; @@ -472,14 +469,14 @@ static int do_saa5249_ioctl(struct inode *inode, struct file *file, info.notfound = 1; if(copy_to_user(req->buffer, &info, sizeof(vtx_pageinfo_t))) return -EFAULT; - if (!info.hamming && !info.notfound) + if (!info.hamming && !info.notfound) { t->is_searching[req->pgbuf] = FALSE; } return 0; } - case VTXIOCGETPAGE: + case VTXIOCGETPAGE: { vtx_pagereq_t *req = arg; int start, end; @@ -489,15 +486,15 @@ static int do_saa5249_ioctl(struct inode *inode, struct file *file, return -EINVAL; if(copy_to_user(req->buffer, &t->vdau[req->pgbuf].pgbuf[req->start], req->end - req->start + 1)) return -EFAULT; - - /* + + /* * Always read the time directly from SAA5249 */ - - if (req->start <= 39 && req->end >= 32) + + if (req->start <= 39 && req->end >= 32) { int len; - char buf[16]; + char buf[16]; start = max(req->start, 32); end = min(req->end, 39); len=end-start+1; @@ -508,7 +505,7 @@ static int do_saa5249_ioctl(struct inode *inode, struct file *file, return -EFAULT; } /* Insert the current header if DAU is still searching for a page */ - if (req->start <= 31 && req->end >= 7 && t->is_searching[req->pgbuf]) + if (req->start <= 31 && req->end >= 7 && t->is_searching[req->pgbuf]) { char buf[32]; int len; @@ -524,7 +521,7 @@ static int do_saa5249_ioctl(struct inode *inode, struct file *file, return 0; } - case VTXIOCSTOPDAU: + case VTXIOCSTOPDAU: { vtx_pagereq_t *req = arg; @@ -535,12 +532,12 @@ static int do_saa5249_ioctl(struct inode *inode, struct file *file, return 0; } - case VTXIOCPUTPAGE: - case VTXIOCSETDISP: - case VTXIOCPUTSTAT: + case VTXIOCPUTPAGE: + case VTXIOCSETDISP: + case VTXIOCPUTSTAT: return 0; - - case VTXIOCCLRCACHE: + + case VTXIOCCLRCACHE: { if (i2c_senddata(t, 0, NUM_DAUS, 0, 8, -1) || i2c_senddata(t, 11, ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ', @@ -552,7 +549,7 @@ static int do_saa5249_ioctl(struct inode *inode, struct file *file, return 0; } - case VTXIOCSETVIRT: + case VTXIOCSETVIRT: { /* The SAA5249 has virtual-row reception turned on always */ t->virtual_mode = (int)(long)arg; @@ -613,22 +610,22 @@ static inline unsigned int vtx_fix_command(unsigned int cmd) /* * Handle the locking */ - + static int saa5249_ioctl(struct inode *inode, struct file *file, - unsigned int cmd, unsigned long arg) + unsigned int cmd, unsigned long arg) { struct video_device *vd = video_devdata(file); struct saa5249_device *t=vd->priv; int err; - + cmd = vtx_fix_command(cmd); - mutex_lock(&t->lock); + down(&t->lock); err = video_usercopy(inode,file,cmd,arg,do_saa5249_ioctl); - mutex_unlock(&t->lock); + up(&t->lock); return err; } -static int saa5249_open(struct inode *inode, struct file *file) +static int saa5249_open(struct inode *inode, struct file *file) { struct video_device *vd = video_devdata(file); struct saa5249_device *t=vd->priv; @@ -637,7 +634,7 @@ static int saa5249_open(struct inode *inode, struct file *file) err = video_exclusive_open(inode,file); if (err < 0) return err; - + if (t->client==NULL) { err = -ENODEV; goto fail; @@ -648,13 +645,13 @@ static int saa5249_open(struct inode *inode, struct file *file) i2c_senddata(t, 1, disp_modes[t->disp_mode][0], 0, -1) || /* Display TV-picture, no virtual rows */ i2c_senddata(t, 4, NUM_DAUS, disp_modes[t->disp_mode][1], disp_modes[t->disp_mode][2], 7, -1)) /* Set display to page 4 */ - + { err = -EIO; goto fail; } - for (pgbuf = 0; pgbuf < NUM_DAUS; pgbuf++) + for (pgbuf = 0; pgbuf < NUM_DAUS; pgbuf++) { memset(t->vdau[pgbuf].pgbuf, ' ', sizeof(t->vdau[0].pgbuf)); memset(t->vdau[pgbuf].sregs, 0, sizeof(t->vdau[0].sregs)); @@ -674,7 +671,7 @@ static int saa5249_open(struct inode *inode, struct file *file) -static int saa5249_release(struct inode *inode, struct file *file) +static int saa5249_release(struct inode *inode, struct file *file) { struct video_device *vd = video_devdata(file); struct saa5249_device *t=vd->priv; @@ -691,7 +688,7 @@ static int __init init_saa_5249 (void) return i2c_add_driver(&i2c_driver_videotext); } -static void __exit cleanup_saa_5249 (void) +static void __exit cleanup_saa_5249 (void) { i2c_del_driver(&i2c_driver_videotext); } diff --git a/drivers/media/video/saa6588.c b/drivers/media/video/saa6588.c index a81285ca7..d17395c4f 100644 --- a/drivers/media/video/saa6588.c +++ b/drivers/media/video/saa6588.c @@ -32,7 +32,7 @@ #include -#include +#include "rds.h" /* Addresses to scan */ static unsigned short normal_i2c[] = { diff --git a/drivers/media/video/saa7110.c b/drivers/media/video/saa7110.c index 676b9970e..7bb85a7b3 100644 --- a/drivers/media/video/saa7110.c +++ b/drivers/media/video/saa7110.c @@ -39,11 +39,11 @@ MODULE_AUTHOR("Pauline Middelink"); MODULE_LICENSE("GPL"); #include +#include #define I2C_NAME(s) (s)->name #include -#include #include static int debug = 0; @@ -108,8 +108,13 @@ saa7110_write_block (struct i2c_client *client, * the adapter understands raw I2C */ if (i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { struct saa7110 *decoder = i2c_get_clientdata(client); + struct i2c_msg msg; - ret = i2c_master_send(client, data, len); + msg.len = len; + msg.buf = (char *) data; + msg.addr = client->addr; + msg.flags = 0; + ret = i2c_transfer(client->adapter, &msg, 1); /* Cache the written data */ memcpy(decoder->reg + reg, data + 1, len - 1); @@ -140,7 +145,7 @@ saa7110_read (struct i2c_client *client) static int saa7110_selmux (struct i2c_client *client, - int chan) + int chan) { static const unsigned char modes[9][8] = { /* mode 0 */ @@ -427,13 +432,15 @@ saa7110_command (struct i2c_client *client, break; case DECODER_DUMP: - for (v = 0; v < SAA7110_NR_REG; v += 16) { + for (v = 0; v < 0x34; v += 16) { int j; - dprintk(1, KERN_DEBUG "%s: %02x:", I2C_NAME(client), + dprintk(1, KERN_INFO "%s: %03x\n", I2C_NAME(client), v); - for (j = 0; j < 16 && v + j < SAA7110_NR_REG; j++) - dprintk(1, " %02x", decoder->reg[v + j]); - dprintk(1, "\n"); + for (j = 0; j < 16; j++) { + dprintk(1, KERN_INFO " %02x", + decoder->reg[v + j]); + } + dprintk(1, KERN_INFO "\n"); } break; @@ -458,7 +465,7 @@ static unsigned short normal_i2c[] = { }; static unsigned short ignore = I2C_CLIENT_END; - + static struct i2c_client_address_data addr_data = { .normal_i2c = normal_i2c, .probe = &ignore, diff --git a/drivers/media/video/saa7111.c b/drivers/media/video/saa7111.c index 686fd4746..8c06592b3 100644 --- a/drivers/media/video/saa7111.c +++ b/drivers/media/video/saa7111.c @@ -1,4 +1,4 @@ -/* +/* * saa7111 - Philips SAA7111A video decoder driver version 0.0.3 * * Copyright (C) 1998 Dave Perks @@ -52,6 +52,7 @@ MODULE_AUTHOR("Dave Perks"); MODULE_LICENSE("GPL"); #include +#include #define I2C_NAME(s) (s)->name @@ -69,10 +70,8 @@ MODULE_PARM_DESC(debug, "Debug level (0-1)"); /* ----------------------------------------------------------------------- */ -#define SAA7111_NR_REG 0x18 - struct saa7111 { - unsigned char reg[SAA7111_NR_REG]; + unsigned char reg[32]; int norm; int input; @@ -111,21 +110,24 @@ saa7111_write_block (struct i2c_client *client, if (i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { /* do raw I2C, not smbus compatible */ struct saa7111 *decoder = i2c_get_clientdata(client); + struct i2c_msg msg; u8 block_data[32]; - int block_len; + msg.addr = client->addr; + msg.flags = 0; while (len >= 2) { - block_len = 0; - block_data[block_len++] = reg = data[0]; + msg.buf = (char *) block_data; + msg.len = 0; + block_data[msg.len++] = reg = data[0]; do { - block_data[block_len++] = + block_data[msg.len++] = decoder->reg[reg++] = data[1]; len -= 2; data += 2; } while (len >= 2 && data[0] == reg && - block_len < 32); - if ((ret = i2c_master_send(client, block_data, - block_len)) < 0) + msg.len < 32); + if ((ret = i2c_transfer(client->adapter, + &msg, 1)) < 0) break; } } else { @@ -208,7 +210,6 @@ saa7111_command (struct i2c_client *client, switch (cmd) { case 0: - break; case DECODER_INIT: { struct video_decoder_init *init = arg; @@ -226,11 +227,11 @@ saa7111_command (struct i2c_client *client, { int i; - for (i = 0; i < SAA7111_NR_REG; i += 16) { + for (i = 0; i < 32; i += 16) { int j; printk(KERN_DEBUG "%s: %03x", I2C_NAME(client), i); - for (j = 0; j < 16 && i + j < SAA7111_NR_REG; ++j) { + for (j = 0; j < 16; ++j) { printk(" %02x", saa7111_read(client, i + j)); } @@ -482,7 +483,7 @@ saa7111_command (struct i2c_client *client, static unsigned short normal_i2c[] = { I2C_SAA7111 >> 1, I2C_CLIENT_END }; static unsigned short ignore = I2C_CLIENT_END; - + static struct i2c_client_address_data addr_data = { .normal_i2c = normal_i2c, .probe = &ignore, diff --git a/drivers/media/video/saa7114.c b/drivers/media/video/saa7114.c index 90398ab82..fd0a4b4ef 100644 --- a/drivers/media/video/saa7114.c +++ b/drivers/media/video/saa7114.c @@ -1,4 +1,4 @@ -/* +/* * saa7114 - Philips SAA7114H video decoder driver version 0.0.1 * * Copyright (C) 2002 Maxim Yevtyushkin @@ -55,6 +55,7 @@ MODULE_AUTHOR("Maxim Yevtyushkin"); MODULE_LICENSE("GPL"); #include +#include #define I2C_NAME(x) (x)->name @@ -138,6 +139,9 @@ saa7114_write (struct i2c_client *client, u8 reg, u8 value) { + /*struct saa7114 *decoder = i2c_get_clientdata(client);*/ + + /*decoder->reg[reg] = value;*/ return i2c_smbus_write_byte_data(client, reg, value); } @@ -153,21 +157,25 @@ saa7114_write_block (struct i2c_client *client, * the adapter understands raw I2C */ if (i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { /* do raw I2C, not smbus compatible */ + /*struct saa7114 *decoder = i2c_get_clientdata(client);*/ + struct i2c_msg msg; u8 block_data[32]; - int block_len; + msg.addr = client->addr; + msg.flags = 0; while (len >= 2) { - block_len = 0; - block_data[block_len++] = reg = data[0]; + msg.buf = (char *) block_data; + msg.len = 0; + block_data[msg.len++] = reg = data[0]; do { - block_data[block_len++] = data[1]; - reg++; + block_data[msg.len++] = + /*decoder->reg[reg++] =*/ data[1]; len -= 2; data += 2; } while (len >= 2 && data[0] == reg && - block_len < 32); - if ((ret = i2c_master_send(client, block_data, - block_len)) < 0) + msg.len < 32); + if ((ret = i2c_transfer(client->adapter, + &msg, 1)) < 0) break; } } else { @@ -300,7 +308,7 @@ static const unsigned char init[] = { 0x55, 0xff, 0x56, 0xff, 0x57, 0xff, - 0x58, 0x40, // framing code + 0x58, 0x40, // framing code 0x59, 0x47, // horizontal offset 0x5a, 0x06, // vertical offset 0x5b, 0x83, // field offset @@ -345,7 +353,7 @@ static const unsigned char init[] = { 0x82, 0x00, 0x83, 0x00, 0x84, 0xc5, - 0x85, 0x0d, // hsync and vsync ? + 0x85, 0x0d, // hsync and vsync ? 0x86, 0x40, 0x87, 0x01, 0x88, 0x00, @@ -434,7 +442,7 @@ static const unsigned char init[] = { 0xd9, 0x04, 0xda, 0x00, // horizontal luminance phase offset 0xdb, 0x00, - 0xdc, 0x00, // horizontal chrominance scaling increment + 0xdc, 0x00, // horizontal chrominance scaling increment 0xdd, 0x02, 0xde, 0x00, // horizontal chrominance phase offset 0xdf, 0x00, @@ -754,7 +762,7 @@ saa7114_command (struct i2c_client *client, saa7114_write(client, 0x87, decoder->reg[REG_ADDR(0x87)]); saa7114_write(client, 0x88, 0xd8); // sw reset scaler - saa7114_write(client, 0x88, 0xf8); // sw reset scaler release + saa7114_write(client, 0x88, 0xf8); // sw reset scaler release saa7114_write(client, 0x80, 0x36); } @@ -813,7 +821,7 @@ static unsigned short normal_i2c[] = { I2C_SAA7114 >> 1, I2C_SAA7114A >> 1, I2C_CLIENT_END }; static unsigned short ignore = I2C_CLIENT_END; - + static struct i2c_client_address_data addr_data = { .normal_i2c = normal_i2c, .probe = &ignore, diff --git a/drivers/media/video/saa7115.c b/drivers/media/video/saa7115.c index b59c11717..ffd87ce55 100644 --- a/drivers/media/video/saa7115.c +++ b/drivers/media/video/saa7115.c @@ -1,4 +1,4 @@ -/* saa7115 - Philips SAA7113/SAA7114/SAA7115 video decoder driver +/* saa7115 - Philips SAA7114/SAA7115 video decoder driver * * Based on saa7114 driver by Maxim Yevtyushkin, which is based on * the saa7111 driver by Dave Perks. @@ -16,7 +16,6 @@ * (2/17/2003) * * VBI support (2004) and cleanups (2005) by Hans Verkuil - * SAA7113 support by Mauro Carvalho Chehab * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -40,12 +39,11 @@ #include #include #include -#include +#include #include -MODULE_DESCRIPTION("Philips SAA7113/SAA7114/SAA7115 video decoder driver"); -MODULE_AUTHOR( "Maxim Yevtyushkin, Kevin Thayer, Chris Kennedy, " - "Hans Verkuil, Mauro Carvalho Chehab"); +MODULE_DESCRIPTION("Philips SAA7114/SAA7115 video decoder driver"); +MODULE_AUTHOR("Maxim Yevtyushkin, Kevin Thayer, Chris Kennedy, Hans Verkuil"); MODULE_LICENSE("GPL"); static int debug = 0; @@ -53,10 +51,7 @@ module_param(debug, bool, 0644); MODULE_PARM_DESC(debug, "Debug level (0-1)"); -static unsigned short normal_i2c[] = { - 0x4a >> 1, 0x48 >> 1, /* SAA7113 */ - 0x42 >> 1, 0x40 >> 1, /* SAA7114 and SAA7115 */ - I2C_CLIENT_END }; +static unsigned short normal_i2c[] = { 0x42 >> 1, 0x40 >> 1, I2C_CLIENT_END }; I2C_CLIENT_INSMOD; @@ -72,10 +67,6 @@ struct saa7115_state { int sat; enum v4l2_chip_ident ident; u32 audclk_freq; - u32 crystal_freq; - u8 ucgc; - u8 cgcdiv; - u8 apll; }; /* ----------------------------------------------------------------------- */ @@ -110,12 +101,10 @@ static inline int saa7115_read(struct i2c_client *client, u8 reg) Hauppauge driver sets. */ static const unsigned char saa7115_init_auto_input[] = { - /* Front-End Part */ 0x01, 0x48, /* white peak control disabled */ 0x03, 0x20, /* was 0x30. 0x20: long vertical blanking */ 0x04, 0x90, /* analog gain set to 0 */ 0x05, 0x90, /* analog gain set to 0 */ - /* Decoder Part */ 0x06, 0xeb, /* horiz sync begin = -21 */ 0x07, 0xe0, /* horiz sync stop = -17 */ 0x0a, 0x80, /* was 0x88. decoder brightness, 0x80 is itu standard */ @@ -134,8 +123,6 @@ static const unsigned char saa7115_init_auto_input[] = { 0x1b, 0x42, /* misc chroma control 0x42 = recommended */ 0x1c, 0xa9, /* combfilter control 0xA9 = recommended */ 0x1d, 0x01, /* combfilter control 0x01 = recommended */ - - /* Power Device Control */ 0x88, 0xd0, /* reset device */ 0x88, 0xf0, /* set device programmed, all in operational mode */ 0x00, 0x00 @@ -351,34 +338,11 @@ static const unsigned char saa7115_cfg_vbi_off[] = { 0x00, 0x00 }; -static const unsigned char saa7113_init_auto_input[] = { - 0x01, 0x08, /* PH7113_INCREMENT_DELAY - (1) (1) (1) (1) IDEL3 IDEL2 IDELL1 IDEL0 */ - 0x02, 0xc2, /* PH7113_ANALOG_INPUT_CONTR_1 - FUSE1 FUSE0 GUDL1 GUDL0 MODE3 MODE2 MODE1 MODE0 */ - 0x03, 0x30, /* PH7113_ANALOG_INPUT_CONTR_2 - (1) HLNRS VBSL WPOFF HOLDG GAFIX GAI28 GAI18 */ - 0x04, 0x00, /* PH7113_ANALOG_INPUT_CONTR_3 - GAI17 GAI16 GAI15 GAI14 GAI13 GAI12 GAI11 GAI10 */ - 0x05, 0x00, /* PH7113_ANALOG_INPUT_CONTR_4 - GAI27 GAI26 GAI25 GAI24 GAI23 GAI22 GAI21 GAI20 */ - 0x06, 0x89, /* PH7113_HORIZONTAL_SYNC_START - HSB7 HSB6 HSB5 HSB4 HSB3 HSB2 HSB1 HSB0 */ - 0x07, 0x0d, /* PH7113_HORIZONTAL_SYNC_STOP - HSS7 HSS6 HSS5 HSS4 HSS3 HSS2 HSS1 HSS0 */ - 0x08, 0x88, /* PH7113_SYNC_CONTROL - AUFD FSEL FOET HTC1 HTC0 HPLL VNOI1 VNOI0 */ - 0x09, 0x01, /* PH7113_LUMINANCE_CONTROL - BYPS PREF BPSS1 BPSS0 VBLB UPTCV APER1 APER0 */ - 0x0a, 0x80, /* PH7113_LUMINANCE_BRIGHTNESS - BRIG7 BRIG6 BRIG5 BRIG4 BRIG3 BRIG2 BRIG1 BRIG0 */ - 0x0b, 0x47, /* PH7113_LUMINANCE_CONTRAST - CONT7 CONT6 CONT5 CONT4 CONT3 CONT2 CONT1 CONT0 */ - 0x0c, 0x40, /* PH7113_CHROMA_SATURATION - SATN7 SATN6 SATN5 SATN4 SATN3 SATN2 SATN1 SATN0 */ - 0x0d, 0x00, /* PH7113_CHROMA_HUE_CONTROL - HUEC7 HUEC6 HUEC5 HUEC4 HUEC3 HUEC2 HUEC1 HUEC0 */ - 0x0e, 0x01, /* PH7113_CHROMA_CONTROL - CDTO CSTD2 CSTD1 CSTD0 DCCF FCTC CHBW1 CHBW0 */ - 0x0f, 0x2a, /* PH7113_CHROMA_GAIN_CONTROL - ACGC CGAIN6 CGAIN5 CGAIN4 CGAIN3 CGAIN2 CGAIN1 CGAIN0 */ - 0x10, 0x08, /* PH7113_FORMAT_DELAY_CONTROL - OFTS1 OFTS0 HDEL1 HDEL0 VRLN YDEL2 YDEL1 YDEL0 */ - 0x11, 0x0c, /* PH7113_OUTPUT_CONTROL_1 - GPSW1 CM99 GPSW0 HLSEL OEYC OERT VIPB COLO */ - 0x12, 0x07, /* PH7113_OUTPUT_CONTROL_2 - RTSE13 RTSE12 RTSE11 RTSE10 RTSE03 RTSE02 RTSE01 RTSE00 */ - 0x13, 0x00, /* PH7113_OUTPUT_CONTROL_3 - ADLSB (1) (1) OLDSB FIDP (1) AOSL1 AOSL0 */ - 0x14, 0x00, /* RESERVED 14 - (1) (1) (1) (1) (1) (1) (1) (1) */ - 0x15, 0x00, /* PH7113_V_GATE1_START - VSTA7 VSTA6 VSTA5 VSTA4 VSTA3 VSTA2 VSTA1 VSTA0 */ - 0x16, 0x00, /* PH7113_V_GATE1_STOP - VSTO7 VSTO6 VSTO5 VSTO4 VSTO3 VSTO2 VSTO1 VSTO0 */ - 0x17, 0x00, /* PH7113_V_GATE1_MSB - (1) (1) (1) (1) (1) (1) VSTO8 VSTA8 */ - 0x00, 0x00 -}; - static const unsigned char saa7115_init_misc[] = { + 0x38, 0x03, /* audio stuff */ + 0x39, 0x10, + 0x3a, 0x08, + 0x81, 0x01, /* reg 0x15,0x16 define blanking window */ 0x82, 0x00, 0x83, 0x01, /* I port settings */ @@ -584,7 +548,6 @@ static int saa7115_set_audio_clock_freq(struct i2c_client *client, u32 freq) u32 acni; u32 hz; u64 f; - u8 acc = 0; /* reg 0x3a, audio clock control */ v4l_dbg(1, debug, client, "set audio clock freq: %d\n", freq); @@ -592,34 +555,18 @@ static int saa7115_set_audio_clock_freq(struct i2c_client *client, u32 freq) if (freq < 32000 || freq > 48000) return -EINVAL; - /* The saa7113 has no audio clock */ - if (state->ident == V4L2_IDENT_SAA7113) - return 0; - /* hz is the refresh rate times 100 */ hz = (state->std & V4L2_STD_525_60) ? 5994 : 5000; /* acpf = (256 * freq) / field_frequency == (256 * 100 * freq) / hz */ acpf = (25600 * freq) / hz; /* acni = (256 * freq * 2^23) / crystal_frequency = (freq * 2^(8+23)) / crystal_frequency = - (freq << 31) / crystal_frequency */ + (freq << 31) / 32.11 MHz */ f = freq; f = f << 31; - do_div(f, state->crystal_freq); + do_div(f, 32110000); acni = f; - if (state->ucgc) { - acpf = acpf * state->cgcdiv / 16; - acni = acni * state->cgcdiv / 16; - acc = 0x80; - if (state->cgcdiv == 3) - acc |= 0x40; - } - if (state->apll) - acc |= 0x08; - saa7115_write(client, 0x38, 0x03); - saa7115_write(client, 0x39, 0x10); - saa7115_write(client, 0x3a, acc); saa7115_write(client, 0x30, acpf & 0xff); saa7115_write(client, 0x31, (acpf >> 8) & 0xff); saa7115_write(client, 0x32, (acpf >> 16) & 0x03); @@ -730,35 +677,10 @@ static void saa7115_set_v4lstd(struct i2c_client *client, v4l2_std_id std) saa7115_writeregs(client, saa7115_cfg_50hz_video); } - /* Register 0E - Bits D6-D4 on NO-AUTO mode - (SAA7113 doesn't have auto mode) - 50 Hz / 625 lines 60 Hz / 525 lines - 000 PAL BGDHI (4.43Mhz) NTSC M (3.58MHz) - 001 NTSC 4.43 (50 Hz) PAL 4.43 (60 Hz) - 010 Combination-PAL N (3.58MHz) NTSC 4.43 (60 Hz) - 011 NTSC N (3.58MHz) PAL M (3.58MHz) - 100 reserved NTSC-Japan (3.58MHz) - */ - if (state->ident == V4L2_IDENT_SAA7113) { - u8 reg = saa7115_read(client, 0x0e) & 0x8f; - - if (std == V4L2_STD_PAL_M) { - reg |= 0x30; - } else if (std == V4L2_STD_PAL_N) { - reg |= 0x20; - } else if (std == V4L2_STD_PAL_60) { - reg |= 0x10; - } else if (std == V4L2_STD_NTSC_M_JP) { - reg |= 0x40; - } - saa7115_write(client, 0x0e, reg); - } - - state->std = std; /* restart task B if needed */ - if (taskb && state->ident != V4L2_IDENT_SAA7115) { + if (taskb && state->ident == V4L2_IDENT_SAA7114) { saa7115_writeregs(client, saa7115_cfg_vbi_on); } @@ -781,7 +703,7 @@ static void saa7115_log_status(struct i2c_client *client) int vcr; v4l_info(client, "Audio frequency: %d Hz\n", state->audclk_freq); - if (state->ident != V4L2_IDENT_SAA7115) { + if (client->name[6] == '4') { /* status for the saa7114 */ reg1f = saa7115_read(client, 0x1f); signalOk = (reg1f & 0xc1) == 0x81; @@ -829,8 +751,8 @@ static void saa7115_set_lcr(struct i2c_client *client, struct v4l2_sliced_vbi_fo u8 lcr[24]; int i, x; - /* saa7113/7114 doesn't yet support VBI */ - if (state->ident != V4L2_IDENT_SAA7115) + /* saa7114 doesn't yet support VBI */ + if (state->ident == V4L2_IDENT_SAA7114) return; for (i = 0; i <= 23; i++) @@ -1090,6 +1012,48 @@ static void saa7115_decode_vbi_line(struct i2c_client *client, /* ============ SAA7115 AUDIO settings (end) ============= */ +static struct v4l2_queryctrl saa7115_qctrl[] = { + { + .id = V4L2_CID_BRIGHTNESS, + .type = V4L2_CTRL_TYPE_INTEGER, + .name = "Brightness", + .minimum = 0, + .maximum = 255, + .step = 1, + .default_value = 128, + .flags = 0, + }, { + .id = V4L2_CID_CONTRAST, + .type = V4L2_CTRL_TYPE_INTEGER, + .name = "Contrast", + .minimum = 0, + .maximum = 127, + .step = 1, + .default_value = 64, + .flags = 0, + }, { + .id = V4L2_CID_SATURATION, + .type = V4L2_CTRL_TYPE_INTEGER, + .name = "Saturation", + .minimum = 0, + .maximum = 127, + .step = 1, + .default_value = 64, + .flags = 0, + }, { + .id = V4L2_CID_HUE, + .type = V4L2_CTRL_TYPE_INTEGER, + .name = "Hue", + .minimum = -128, + .maximum = 127, + .step = 1, + .default_value = 0, + .flags = 0, + }, +}; + +/* ----------------------------------------------------------------------- */ + static int saa7115_command(struct i2c_client *client, unsigned int cmd, void *arg) { struct saa7115_state *state = i2c_get_clientdata(client); @@ -1133,16 +1097,14 @@ static int saa7115_command(struct i2c_client *client, unsigned int cmd, void *ar case VIDIOC_QUERYCTRL: { struct v4l2_queryctrl *qc = arg; + int i; - switch (qc->id) { - case V4L2_CID_BRIGHTNESS: - case V4L2_CID_CONTRAST: - case V4L2_CID_SATURATION: - case V4L2_CID_HUE: - return v4l2_ctrl_query_fill_std(qc); - default: - return -EINVAL; - } + for (i = 0; i < ARRAY_SIZE(saa7115_qctrl); i++) + if (qc->id && qc->id == saa7115_qctrl[i].id) { + memcpy(qc, &saa7115_qctrl[i], sizeof(*qc)); + return 0; + } + return -EINVAL; } case VIDIOC_G_STD: @@ -1158,45 +1120,33 @@ static int saa7115_command(struct i2c_client *client, unsigned int cmd, void *ar state->radio = 1; break; - case VIDIOC_INT_G_VIDEO_ROUTING: - { - struct v4l2_routing *route = arg; - - route->input = state->input; - route->output = 0; + case VIDIOC_G_INPUT: + *(int *)arg = state->input; break; - } - - case VIDIOC_INT_S_VIDEO_ROUTING: - { - struct v4l2_routing *route = arg; - v4l_dbg(1, debug, client, "decoder set input %d\n", route->input); - /* saa7113 does not have these inputs */ - if (state->ident == V4L2_IDENT_SAA7113 && - (route->input == SAA7115_COMPOSITE4 || - route->input == SAA7115_COMPOSITE5)) { + case VIDIOC_S_INPUT: + v4l_dbg(1, debug, client, "decoder set input %d\n", *iarg); + /* inputs from 0-9 are available */ + if (*iarg < 0 || *iarg > 9) { return -EINVAL; } - if (route->input > SAA7115_SVIDEO3) - return -EINVAL; - if (state->input == route->input) + + if (state->input == *iarg) break; v4l_dbg(1, debug, client, "now setting %s input\n", - (route->input >= SAA7115_SVIDEO0) ? "S-Video" : "Composite"); - state->input = route->input; + *iarg >= 6 ? "S-Video" : "Composite"); + state->input = *iarg; /* select mode */ saa7115_write(client, 0x02, (saa7115_read(client, 0x02) & 0xf0) | state->input); - /* bypass chrominance trap for S-Video modes */ + /* bypass chrominance trap for modes 6..9 */ saa7115_write(client, 0x09, (saa7115_read(client, 0x09) & 0x7f) | - (state->input >= SAA7115_SVIDEO0 ? 0x80 : 0x0)); + (state->input < 6 ? 0x0 : 0x80)); break; - } case VIDIOC_STREAMON: case VIDIOC_STREAMOFF: @@ -1209,21 +1159,6 @@ static int saa7115_command(struct i2c_client *client, unsigned int cmd, void *ar } break; - case VIDIOC_INT_S_CRYSTAL_FREQ: - { - struct v4l2_crystal_freq *freq = arg; - - if (freq->freq != SAA7115_FREQ_32_11_MHZ && - freq->freq != SAA7115_FREQ_24_576_MHZ) - return -EINVAL; - state->crystal_freq = freq->freq; - state->cgcdiv = (freq->flags & SAA7115_FREQ_FL_CGCDIV) ? 3 : 4; - state->ucgc = (freq->flags & SAA7115_FREQ_FL_UCGC) ? 1 : 0; - state->apll = (freq->flags & SAA7115_FREQ_FL_APLL) ? 1 : 0; - saa7115_set_audio_clock_freq(client, state->audclk_freq); - break; - } - case VIDIOC_INT_DECODE_VBI_LINE: saa7115_decode_vbi_line(client, arg); break; @@ -1326,12 +1261,14 @@ static int saa7115_attach(struct i2c_adapter *adapter, int address, int kind) saa7115_write(client, 0, 5); chip_id = saa7115_read(client, 0) & 0x0f; - if (chip_id < 3 && chip_id > 5) { + if (chip_id != 4 && chip_id != 5) { v4l_dbg(1, debug, client, "saa7115 not found\n"); kfree(client); return 0; } - snprintf(client->name, sizeof(client->name) - 1, "saa711%d",chip_id); + if (chip_id == 4) { + snprintf(client->name, sizeof(client->name) - 1, "saa7114"); + } v4l_info(client, "saa711%d found @ 0x%x (%s)\n", chip_id, address << 1, adapter->name); state = kzalloc(sizeof(struct saa7115_state), GFP_KERNEL); @@ -1348,30 +1285,13 @@ static int saa7115_attach(struct i2c_adapter *adapter, int address, int kind) state->contrast = 64; state->hue = 0; state->sat = 64; - switch (chip_id) { - case 3: - state->ident = V4L2_IDENT_SAA7113; - break; - case 4: - state->ident = V4L2_IDENT_SAA7114; - break; - default: - state->ident = V4L2_IDENT_SAA7115; - break; - } - + state->ident = (chip_id == 4) ? V4L2_IDENT_SAA7114 : V4L2_IDENT_SAA7115; state->audclk_freq = 48000; v4l_dbg(1, debug, client, "writing init values\n"); /* init to 60hz/48khz */ - if (state->ident == V4L2_IDENT_SAA7113) { - state->crystal_freq = SAA7115_FREQ_24_576_MHZ; - saa7115_writeregs(client, saa7113_init_auto_input); - } else { - state->crystal_freq = SAA7115_FREQ_32_11_MHZ; - saa7115_writeregs(client, saa7115_init_auto_input); - } + saa7115_writeregs(client, saa7115_init_auto_input); saa7115_writeregs(client, saa7115_init_misc); saa7115_writeregs(client, saa7115_cfg_60hz_fullres_x); saa7115_writeregs(client, saa7115_cfg_60hz_fullres_y); diff --git a/drivers/media/video/saa711x.c b/drivers/media/video/saa711x.c index 708fae51e..6c161f2f5 100644 --- a/drivers/media/video/saa711x.c +++ b/drivers/media/video/saa711x.c @@ -45,6 +45,7 @@ MODULE_AUTHOR("Dave Perks, Jose Ignacio Gijon, Joerg Heckenbach, Mark McClelland MODULE_LICENSE("GPL"); #include +#include #define I2C_NAME(s) (s)->name diff --git a/drivers/media/video/saa7121.h b/drivers/media/video/saa7121.h index 66967ae37..74e37d405 100644 --- a/drivers/media/video/saa7121.h +++ b/drivers/media/video/saa7121.h @@ -64,7 +64,7 @@ #define PAL_MSB_VERTICAL 0x40 /* 7c */ /* Initialization Sequence */ - + static __u8 init7121ntsc[] = { 0x26, 0x0, 0x27, 0x0, 0x28, NTSC_BURST_START, 0x29, NTSC_BURST_END, @@ -95,7 +95,7 @@ static __u8 init7121ntsc[] = { 0x78, 0x0, 0x79, 0x0, 0x7a, NTSC_FIRST_ACTIVE, 0x7b, NTSC_LAST_ACTIVE, 0x7c, NTSC_MSB_VERTICAL, 0x7d, 0x0, 0x7e, 0x0, 0x7f, 0x0 -}; +}; #define INIT7121LEN (sizeof(init7121ntsc)/2) static __u8 init7121pal[] = { @@ -128,5 +128,5 @@ static __u8 init7121pal[] = { 0x78, 0x0, 0x79, 0x0, 0x7a, PAL_FIRST_ACTIVE, 0x7b, PAL_LAST_ACTIVE, 0x7c, PAL_MSB_VERTICAL, 0x7d, 0x0, 0x7e, 0x0, 0x7f, 0x0 -}; +}; #endif diff --git a/drivers/media/video/saa7127.c b/drivers/media/video/saa7127.c index ad401bdef..9e4c178bd 100644 --- a/drivers/media/video/saa7127.c +++ b/drivers/media/video/saa7127.c @@ -54,7 +54,6 @@ #include #include #include -#include static int debug = 0; static int test_image = 0; @@ -224,6 +223,22 @@ static struct i2c_reg_value saa7127_init_config_50hz[] = { { 0, 0 } }; +/* Enumeration for the Supported input types */ +enum saa7127_input_type { + SAA7127_INPUT_TYPE_NORMAL, + SAA7127_INPUT_TYPE_TEST_IMAGE +}; + +/* Enumeration for the Supported Output signal types */ +enum saa7127_output_type { + SAA7127_OUTPUT_TYPE_BOTH, + SAA7127_OUTPUT_TYPE_COMPOSITE, + SAA7127_OUTPUT_TYPE_SVIDEO, + SAA7127_OUTPUT_TYPE_RGB, + SAA7127_OUTPUT_TYPE_YUV_C, + SAA7127_OUTPUT_TYPE_YUV_V +}; + /* ********************************************************************** * @@ -270,7 +285,7 @@ static const char * const wss_strs[] = { "letterbox 16:9 top", "invalid", "invalid", - "16:9 full format anamorphic", + "16:9 full format anamorphic" "4:3 full format", "invalid", "invalid", @@ -547,7 +562,7 @@ static int saa7127_command(struct i2c_client *client, { struct saa7127_state *state = i2c_get_clientdata(client); struct v4l2_format *fmt = arg; - struct v4l2_routing *route = arg; + int *iarg = arg; switch (cmd) { case VIDIOC_S_STD: @@ -559,23 +574,15 @@ static int saa7127_command(struct i2c_client *client, *(v4l2_std_id *)arg = state->std; break; - case VIDIOC_INT_G_VIDEO_ROUTING: - route->input = state->input_type; - route->output = state->output_type; - break; - - case VIDIOC_INT_S_VIDEO_ROUTING: - { - int rc = 0; + case VIDIOC_S_INPUT: + if (state->input_type == *iarg) + break; + return saa7127_set_input_type(client, *iarg); - if (state->input_type != route->input) { - rc = saa7127_set_input_type(client, route->input); - } - if (rc == 0 && state->output_type != route->output) { - rc = saa7127_set_output_type(client, route->output); - } - return rc; - } + case VIDIOC_S_OUTPUT: + if (state->output_type == *iarg) + break; + return saa7127_set_output_type(client, *iarg); case VIDIOC_STREAMON: case VIDIOC_STREAMOFF: diff --git a/drivers/media/video/saa7134/Kconfig b/drivers/media/video/saa7134/Kconfig index f5543166d..e1c1805df 100644 --- a/drivers/media/video/saa7134/Kconfig +++ b/drivers/media/video/saa7134/Kconfig @@ -40,7 +40,6 @@ config VIDEO_SAA7134_DVB depends on VIDEO_SAA7134 && DVB_CORE select VIDEO_BUF_DVB select FW_LOADER - select DVB_PLL ---help--- This adds support for DVB cards based on the Philips saa7134 chip. diff --git a/drivers/media/video/saa7134/Makefile b/drivers/media/video/saa7134/Makefile index be7b9ee69..1ba998424 100644 --- a/drivers/media/video/saa7134/Makefile +++ b/drivers/media/video/saa7134/Makefile @@ -11,9 +11,9 @@ obj-$(CONFIG_VIDEO_SAA7134_OSS) += saa7134-oss.o obj-$(CONFIG_VIDEO_SAA7134_DVB) += saa7134-dvb.o -EXTRA_CFLAGS += -Idrivers/media/video -EXTRA_CFLAGS += -Idrivers/media/dvb/dvb-core -EXTRA_CFLAGS += -Idrivers/media/dvb/frontends +EXTRA_CFLAGS += -I$(src)/.. +EXTRA_CFLAGS += -I$(srctree)/drivers/media/dvb/dvb-core +EXTRA_CFLAGS += -I$(srctree)/drivers/media/dvb/frontends extra-cflags-$(CONFIG_VIDEO_BUF_DVB) += -DHAVE_VIDEO_BUF_DVB=1 extra-cflags-$(CONFIG_DVB_MT352) += -DHAVE_MT352=1 diff --git a/drivers/media/video/saa7134/saa6752hs.c b/drivers/media/video/saa7134/saa6752hs.c index afc8f352b..0e0ba5094 100644 --- a/drivers/media/video/saa7134/saa6752hs.c +++ b/drivers/media/video/saa7134/saa6752hs.c @@ -39,23 +39,6 @@ enum saa6752hs_videoformat { SAA6752HS_VF_UNKNOWN, }; -struct saa6752hs_mpeg_params { - /* transport streams */ - __u16 ts_pid_pmt; - __u16 ts_pid_audio; - __u16 ts_pid_video; - __u16 ts_pid_pcr; - - /* audio */ - enum v4l2_mpeg_audio_l2_bitrate au_l2_bitrate; - - /* video */ - enum v4l2_mpeg_video_aspect vi_aspect; - enum v4l2_mpeg_video_bitrate_mode vi_bitrate_mode; - __u32 vi_bitrate; - __u32 vi_bitrate_peak; -}; - static const struct v4l2_format v4l2_format_table[] = { [SAA6752HS_VF_D1] = @@ -72,19 +55,18 @@ static const struct v4l2_format v4l2_format_table[] = struct saa6752hs_state { struct i2c_client client; - struct v4l2_mpeg_compression old_params; - struct saa6752hs_mpeg_params params; + struct v4l2_mpeg_compression params; enum saa6752hs_videoformat video_format; v4l2_std_id standard; }; enum saa6752hs_command { SAA6752HS_COMMAND_RESET = 0, - SAA6752HS_COMMAND_STOP = 1, - SAA6752HS_COMMAND_START = 2, - SAA6752HS_COMMAND_PAUSE = 3, - SAA6752HS_COMMAND_RECONFIGURE = 4, - SAA6752HS_COMMAND_SLEEP = 5, + SAA6752HS_COMMAND_STOP = 1, + SAA6752HS_COMMAND_START = 2, + SAA6752HS_COMMAND_PAUSE = 3, + SAA6752HS_COMMAND_RECONFIGURE = 4, + SAA6752HS_COMMAND_SLEEP = 5, SAA6752HS_COMMAND_RECONFIGURE_FORCE = 6, SAA6752HS_COMMAND_MAX @@ -147,22 +129,7 @@ static u8 PMT[] = { 0x00, 0x00, 0x00, 0x00 /* CRC32 */ }; -static struct saa6752hs_mpeg_params param_defaults = -{ - .ts_pid_pmt = 16, - .ts_pid_video = 260, - .ts_pid_audio = 256, - .ts_pid_pcr = 259, - - .vi_aspect = V4L2_MPEG_VIDEO_ASPECT_4x3, - .vi_bitrate = 4000, - .vi_bitrate_peak = 6000, - .vi_bitrate_mode = V4L2_MPEG_VIDEO_BITRATE_MODE_VBR, - - .au_l2_bitrate = V4L2_MPEG_AUDIO_L2_BITRATE_256K, -}; - -static struct v4l2_mpeg_compression old_param_defaults = +static struct v4l2_mpeg_compression param_defaults = { .st_type = V4L2_MPEG_TS_2, .st_bitrate = { @@ -261,57 +228,45 @@ static int saa6752hs_chip_command(struct i2c_client* client, static int saa6752hs_set_bitrate(struct i2c_client* client, - struct saa6752hs_mpeg_params* params) + struct v4l2_mpeg_compression* params) { u8 buf[3]; - int tot_bitrate; /* set the bitrate mode */ buf[0] = 0x71; - buf[1] = (params->vi_bitrate_mode == V4L2_MPEG_VIDEO_BITRATE_MODE_VBR) ? 0 : 1; + buf[1] = (params->vi_bitrate.mode == V4L2_BITRATE_VBR) ? 0 : 1; i2c_master_send(client, buf, 2); /* set the video bitrate */ - if (params->vi_bitrate_mode == V4L2_MPEG_VIDEO_BITRATE_MODE_VBR) { + if (params->vi_bitrate.mode == V4L2_BITRATE_VBR) { /* set the target bitrate */ buf[0] = 0x80; - buf[1] = params->vi_bitrate >> 8; - buf[2] = params->vi_bitrate & 0xff; + buf[1] = params->vi_bitrate.target >> 8; + buf[2] = params->vi_bitrate.target & 0xff; i2c_master_send(client, buf, 3); /* set the max bitrate */ buf[0] = 0x81; - buf[1] = params->vi_bitrate_peak >> 8; - buf[2] = params->vi_bitrate_peak & 0xff; + buf[1] = params->vi_bitrate.max >> 8; + buf[2] = params->vi_bitrate.max & 0xff; i2c_master_send(client, buf, 3); - tot_bitrate = params->vi_bitrate_peak; } else { /* set the target bitrate (no max bitrate for CBR) */ buf[0] = 0x81; - buf[1] = params->vi_bitrate >> 8; - buf[2] = params->vi_bitrate & 0xff; + buf[1] = params->vi_bitrate.target >> 8; + buf[2] = params->vi_bitrate.target & 0xff; i2c_master_send(client, buf, 3); - tot_bitrate = params->vi_bitrate; } /* set the audio bitrate */ buf[0] = 0x94; - buf[1] = (V4L2_MPEG_AUDIO_L2_BITRATE_256K == params->au_l2_bitrate) ? 0 : 1; + buf[1] = (256 == params->au_bitrate.target) ? 0 : 1; i2c_master_send(client, buf, 2); - tot_bitrate += (V4L2_MPEG_AUDIO_L2_BITRATE_256K == params->au_l2_bitrate) ? 256 : 384; - - /* Note: the total max bitrate is determined by adding the video and audio - bitrates together and also adding an extra 768kbit/s to stay on the - safe side. If more control should be required, then an extra MPEG control - should be added. */ - tot_bitrate += 768; - if (tot_bitrate > MPEG_TOTAL_TARGET_BITRATE_MAX) - tot_bitrate = MPEG_TOTAL_TARGET_BITRATE_MAX; /* set the total bitrate */ buf[0] = 0xb1; - buf[1] = tot_bitrate >> 8; - buf[2] = tot_bitrate & 0xff; + buf[1] = params->st_bitrate.target >> 8; + buf[2] = params->st_bitrate.target & 0xff; i2c_master_send(client, buf, 3); return 0; @@ -363,188 +318,50 @@ static void saa6752hs_set_subsampling(struct i2c_client* client, } -static void saa6752hs_old_set_params(struct i2c_client* client, +static void saa6752hs_set_params(struct i2c_client* client, struct v4l2_mpeg_compression* params) { struct saa6752hs_state *h = i2c_get_clientdata(client); /* check PIDs */ - if (params->ts_pid_pmt <= MPEG_PID_MAX) { - h->old_params.ts_pid_pmt = params->ts_pid_pmt; + if (params->ts_pid_pmt <= MPEG_PID_MAX) h->params.ts_pid_pmt = params->ts_pid_pmt; - } - if (params->ts_pid_pcr <= MPEG_PID_MAX) { - h->old_params.ts_pid_pcr = params->ts_pid_pcr; + if (params->ts_pid_pcr <= MPEG_PID_MAX) h->params.ts_pid_pcr = params->ts_pid_pcr; - } - if (params->ts_pid_video <= MPEG_PID_MAX) { - h->old_params.ts_pid_video = params->ts_pid_video; + if (params->ts_pid_video <= MPEG_PID_MAX) h->params.ts_pid_video = params->ts_pid_video; - } - if (params->ts_pid_audio <= MPEG_PID_MAX) { - h->old_params.ts_pid_audio = params->ts_pid_audio; + if (params->ts_pid_audio <= MPEG_PID_MAX) h->params.ts_pid_audio = params->ts_pid_audio; - } /* check bitrate parameters */ if ((params->vi_bitrate.mode == V4L2_BITRATE_CBR) || - (params->vi_bitrate.mode == V4L2_BITRATE_VBR)) { - h->old_params.vi_bitrate.mode = params->vi_bitrate.mode; - h->params.vi_bitrate_mode = (params->vi_bitrate.mode == V4L2_BITRATE_VBR) ? - V4L2_MPEG_VIDEO_BITRATE_MODE_VBR : V4L2_MPEG_VIDEO_BITRATE_MODE_CBR; - } + (params->vi_bitrate.mode == V4L2_BITRATE_VBR)) + h->params.vi_bitrate.mode = params->vi_bitrate.mode; if (params->vi_bitrate.mode != V4L2_BITRATE_NONE) - h->old_params.st_bitrate.target = params->st_bitrate.target; + h->params.st_bitrate.target = params->st_bitrate.target; if (params->vi_bitrate.mode != V4L2_BITRATE_NONE) - h->old_params.vi_bitrate.target = params->vi_bitrate.target; + h->params.vi_bitrate.target = params->vi_bitrate.target; if (params->vi_bitrate.mode == V4L2_BITRATE_VBR) - h->old_params.vi_bitrate.max = params->vi_bitrate.max; + h->params.vi_bitrate.max = params->vi_bitrate.max; if (params->au_bitrate.mode != V4L2_BITRATE_NONE) - h->old_params.au_bitrate.target = params->au_bitrate.target; + h->params.au_bitrate.target = params->au_bitrate.target; /* aspect ratio */ if (params->vi_aspect_ratio == V4L2_MPEG_ASPECT_4_3 || - params->vi_aspect_ratio == V4L2_MPEG_ASPECT_16_9) { - h->old_params.vi_aspect_ratio = params->vi_aspect_ratio; - if (params->vi_aspect_ratio == V4L2_MPEG_ASPECT_4_3) - h->params.vi_aspect = V4L2_MPEG_VIDEO_ASPECT_4x3; - else - h->params.vi_aspect = V4L2_MPEG_VIDEO_ASPECT_16x9; - } + params->vi_aspect_ratio == V4L2_MPEG_ASPECT_16_9) + h->params.vi_aspect_ratio = params->vi_aspect_ratio; /* range checks */ - if (h->old_params.st_bitrate.target > MPEG_TOTAL_TARGET_BITRATE_MAX) - h->old_params.st_bitrate.target = MPEG_TOTAL_TARGET_BITRATE_MAX; - if (h->old_params.vi_bitrate.target > MPEG_VIDEO_TARGET_BITRATE_MAX) - h->old_params.vi_bitrate.target = MPEG_VIDEO_TARGET_BITRATE_MAX; - if (h->old_params.vi_bitrate.max > MPEG_VIDEO_MAX_BITRATE_MAX) - h->old_params.vi_bitrate.max = MPEG_VIDEO_MAX_BITRATE_MAX; - h->params.vi_bitrate = params->vi_bitrate.target; - h->params.vi_bitrate_peak = params->vi_bitrate.max; - if (h->old_params.au_bitrate.target <= 256) { - h->old_params.au_bitrate.target = 256; - h->params.au_l2_bitrate = V4L2_MPEG_AUDIO_L2_BITRATE_256K; - } - else { - h->old_params.au_bitrate.target = 384; - h->params.au_l2_bitrate = V4L2_MPEG_AUDIO_L2_BITRATE_384K; - } -} - -static int handle_ctrl(struct saa6752hs_mpeg_params *params, - struct v4l2_ext_control *ctrl, unsigned int cmd) -{ - int old = 0, new; - int set = (cmd == VIDIOC_S_EXT_CTRLS); - - new = ctrl->value; - switch (ctrl->id) { - case V4L2_CID_MPEG_STREAM_TYPE: - old = V4L2_MPEG_STREAM_TYPE_MPEG2_TS; - if (set && new != old) - return -ERANGE; - new = old; - break; - case V4L2_CID_MPEG_STREAM_PID_PMT: - old = params->ts_pid_pmt; - if (set && new > MPEG_PID_MAX) - return -ERANGE; - if (new > MPEG_PID_MAX) - new = MPEG_PID_MAX; - params->ts_pid_pmt = new; - break; - case V4L2_CID_MPEG_STREAM_PID_AUDIO: - old = params->ts_pid_audio; - if (set && new > MPEG_PID_MAX) - return -ERANGE; - if (new > MPEG_PID_MAX) - new = MPEG_PID_MAX; - params->ts_pid_audio = new; - break; - case V4L2_CID_MPEG_STREAM_PID_VIDEO: - old = params->ts_pid_video; - if (set && new > MPEG_PID_MAX) - return -ERANGE; - if (new > MPEG_PID_MAX) - new = MPEG_PID_MAX; - params->ts_pid_video = new; - break; - case V4L2_CID_MPEG_STREAM_PID_PCR: - old = params->ts_pid_pcr; - if (set && new > MPEG_PID_MAX) - return -ERANGE; - if (new > MPEG_PID_MAX) - new = MPEG_PID_MAX; - params->ts_pid_pcr = new; - break; - case V4L2_CID_MPEG_AUDIO_ENCODING: - old = V4L2_MPEG_AUDIO_ENCODING_LAYER_2; - if (set && new != old) - return -ERANGE; - new = old; - break; - case V4L2_CID_MPEG_AUDIO_L2_BITRATE: - old = params->au_l2_bitrate; - if (set && new != V4L2_MPEG_AUDIO_L2_BITRATE_256K && - new != V4L2_MPEG_AUDIO_L2_BITRATE_384K) - return -ERANGE; - if (new <= V4L2_MPEG_AUDIO_L2_BITRATE_256K) - new = V4L2_MPEG_AUDIO_L2_BITRATE_256K; - else - new = V4L2_MPEG_AUDIO_L2_BITRATE_384K; - params->au_l2_bitrate = new; - break; - case V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ: - old = V4L2_MPEG_AUDIO_SAMPLING_FREQ_48000; - if (set && new != old) - return -ERANGE; - new = old; - break; - case V4L2_CID_MPEG_VIDEO_ENCODING: - old = V4L2_MPEG_VIDEO_ENCODING_MPEG_2; - if (set && new != old) - return -ERANGE; - new = old; - break; - case V4L2_CID_MPEG_VIDEO_ASPECT: - old = params->vi_aspect; - if (set && new != V4L2_MPEG_VIDEO_ASPECT_16x9 && - new != V4L2_MPEG_VIDEO_ASPECT_4x3) - return -ERANGE; - if (new != V4L2_MPEG_VIDEO_ASPECT_16x9) - new = V4L2_MPEG_VIDEO_ASPECT_4x3; - params->vi_aspect = new; - break; - case V4L2_CID_MPEG_VIDEO_BITRATE: - old = params->vi_bitrate * 1000; - new = 1000 * (new / 1000); - if (set && new > MPEG_VIDEO_TARGET_BITRATE_MAX * 1000) - return -ERANGE; - if (new > MPEG_VIDEO_TARGET_BITRATE_MAX * 1000) - new = MPEG_VIDEO_TARGET_BITRATE_MAX * 1000; - params->vi_bitrate = new / 1000; - break; - case V4L2_CID_MPEG_VIDEO_BITRATE_PEAK: - old = params->vi_bitrate_peak * 1000; - new = 1000 * (new / 1000); - if (set && new > MPEG_VIDEO_TARGET_BITRATE_MAX * 1000) - return -ERANGE; - if (new > MPEG_VIDEO_TARGET_BITRATE_MAX * 1000) - new = MPEG_VIDEO_TARGET_BITRATE_MAX * 1000; - params->vi_bitrate_peak = new / 1000; - break; - case V4L2_CID_MPEG_VIDEO_BITRATE_MODE: - old = params->vi_bitrate_mode; - params->vi_bitrate_mode = new; - break; - default: - return -EINVAL; - } - if (cmd == VIDIOC_G_EXT_CTRLS) - ctrl->value = old; + if (h->params.st_bitrate.target > MPEG_TOTAL_TARGET_BITRATE_MAX) + h->params.st_bitrate.target = MPEG_TOTAL_TARGET_BITRATE_MAX; + if (h->params.vi_bitrate.target > MPEG_VIDEO_TARGET_BITRATE_MAX) + h->params.vi_bitrate.target = MPEG_VIDEO_TARGET_BITRATE_MAX; + if (h->params.vi_bitrate.max > MPEG_VIDEO_MAX_BITRATE_MAX) + h->params.vi_bitrate.max = MPEG_VIDEO_MAX_BITRATE_MAX; + if (h->params.au_bitrate.target <= 256) + h->params.au_bitrate.target = 256; else - ctrl->value = new; - return 0; + h->params.au_bitrate.target = 384; } static int saa6752hs_init(struct i2c_client* client) @@ -578,22 +395,22 @@ static int saa6752hs_init(struct i2c_client* client) buf[2] = 0x0D; i2c_master_send(client,buf,3); - /* Set minimum Q-scale {4} */ + /* Set minimum Q-scale {4} */ buf[0] = 0x82; buf[1] = 0x04; i2c_master_send(client,buf,2); - /* Set maximum Q-scale {12} */ + /* Set maximum Q-scale {12} */ buf[0] = 0x83; buf[1] = 0x0C; i2c_master_send(client,buf,2); - /* Set Output Protocol */ + /* Set Output Protocol */ buf[0] = 0xD0; buf[1] = 0x81; i2c_master_send(client,buf,2); - /* Set video output stream format {TS} */ + /* Set video output stream format {TS} */ buf[0] = 0xB0; buf[1] = 0x05; i2c_master_send(client,buf,2); @@ -624,7 +441,7 @@ static int saa6752hs_init(struct i2c_client* client) localPMT[sizeof(PMT) - 2] = (crc >> 8) & 0xFF; localPMT[sizeof(PMT) - 1] = crc & 0xFF; - /* Set Audio PID */ + /* Set Audio PID */ buf[0] = 0xC1; buf[1] = (h->params.ts_pid_audio >> 8) & 0xFF; buf[2] = h->params.ts_pid_audio & 0xFF; @@ -672,11 +489,11 @@ static int saa6752hs_init(struct i2c_client* client) buf[3] = 0x82; buf[4] = 0xB0; buf[5] = buf2[0]; - switch(h->params.vi_aspect) { - case V4L2_MPEG_VIDEO_ASPECT_16x9: + switch(h->params.vi_aspect_ratio) { + case V4L2_MPEG_ASPECT_16_9: buf[6] = buf2[1] | 0x40; break; - case V4L2_MPEG_VIDEO_ASPECT_4x3: + case V4L2_MPEG_ASPECT_4_3: default: buf[6] = buf2[1] & 0xBF; break; @@ -698,7 +515,6 @@ static int saa6752hs_attach(struct i2c_adapter *adap, int addr, int kind) return -ENOMEM; h->client = client_template; h->params = param_defaults; - h->old_params = old_param_defaults; h->client.adapter = adap; h->client.addr = addr; @@ -734,45 +550,20 @@ static int saa6752hs_command(struct i2c_client *client, unsigned int cmd, void *arg) { struct saa6752hs_state *h = i2c_get_clientdata(client); - struct v4l2_ext_controls *ctrls = arg; - struct v4l2_mpeg_compression *old_params = arg; - struct saa6752hs_mpeg_params params; + struct v4l2_mpeg_compression *params = arg; int err = 0; - int i; switch (cmd) { case VIDIOC_S_MPEGCOMP: - if (NULL == old_params) { + if (NULL == params) { /* apply settings and start encoder */ saa6752hs_init(client); break; } - saa6752hs_old_set_params(client, old_params); + saa6752hs_set_params(client, params); /* fall through */ case VIDIOC_G_MPEGCOMP: - *old_params = h->old_params; - break; - case VIDIOC_S_EXT_CTRLS: - if (ctrls->ctrl_class != V4L2_CTRL_CLASS_MPEG) - return -EINVAL; - if (ctrls->count == 0) { - /* apply settings and start encoder */ - saa6752hs_init(client); - break; - } - /* fall through */ - case VIDIOC_TRY_EXT_CTRLS: - case VIDIOC_G_EXT_CTRLS: - if (ctrls->ctrl_class != V4L2_CTRL_CLASS_MPEG) - return -EINVAL; - params = h->params; - for (i = 0; i < ctrls->count; i++) { - if ((err = handle_ctrl(¶ms, ctrls->controls + i, cmd))) { - ctrls->error_idx = i; - return err; - } - } - h->params = params; + *params = h->params; break; case VIDIOC_G_FMT: { diff --git a/drivers/media/video/saa7134/saa7134-alsa.c b/drivers/media/video/saa7134/saa7134-alsa.c index d73cff197..5f21416f2 100644 --- a/drivers/media/video/saa7134/saa7134-alsa.c +++ b/drivers/media/video/saa7134/saa7134-alsa.c @@ -71,7 +71,7 @@ MODULE_PARM_DESC(enable, "Enable (or not) the SAA7134 capture interface(s)."); */ typedef struct snd_card_saa7134 { - struct snd_card *card; + snd_card_t *card; spinlock_t mixer_lock; int mixer_volume[MIXER_ADDR_LAST+1][2]; int capture_source[MIXER_ADDR_LAST+1][2]; @@ -95,10 +95,10 @@ typedef struct snd_card_saa7134_pcm { spinlock_t lock; - struct snd_pcm_substream *substream; + snd_pcm_substream_t *substream; } snd_card_saa7134_pcm_t; -static struct snd_card *snd_saa7134_cards[SNDRV_CARDS]; +static snd_card_t *snd_saa7134_cards[SNDRV_CARDS]; /* @@ -251,10 +251,10 @@ out: * */ -static int snd_card_saa7134_capture_trigger(struct snd_pcm_substream * substream, +static int snd_card_saa7134_capture_trigger(snd_pcm_substream_t * substream, int cmd) { - struct snd_pcm_runtime *runtime = substream->runtime; + snd_pcm_runtime_t *runtime = substream->runtime; snd_card_saa7134_pcm_t *pcm = runtime->private_data; struct saa7134_dev *dev=pcm->dev; int err = 0; @@ -308,7 +308,8 @@ static int dsp_buffer_init(struct saa7134_dev *dev) static int dsp_buffer_free(struct saa7134_dev *dev) { - BUG_ON(!dev->dmasound.blksize); + if (!dev->dmasound.blksize) + BUG(); videobuf_dma_free(&dev->dmasound.dma); @@ -332,9 +333,9 @@ static int dsp_buffer_free(struct saa7134_dev *dev) * */ -static int snd_card_saa7134_capture_prepare(struct snd_pcm_substream * substream) +static int snd_card_saa7134_capture_prepare(snd_pcm_substream_t * substream) { - struct snd_pcm_runtime *runtime = substream->runtime; + snd_pcm_runtime_t *runtime = substream->runtime; int bswap, sign; u32 fmt, control; snd_card_saa7134_t *saa7134 = snd_pcm_substream_chip(substream); @@ -421,10 +422,9 @@ static int snd_card_saa7134_capture_prepare(struct snd_pcm_substream * substream * */ -static snd_pcm_uframes_t -snd_card_saa7134_capture_pointer(struct snd_pcm_substream * substream) +static snd_pcm_uframes_t snd_card_saa7134_capture_pointer(snd_pcm_substream_t * substream) { - struct snd_pcm_runtime *runtime = substream->runtime; + snd_pcm_runtime_t *runtime = substream->runtime; snd_card_saa7134_pcm_t *pcm = runtime->private_data; struct saa7134_dev *dev=pcm->dev; @@ -442,7 +442,7 @@ snd_card_saa7134_capture_pointer(struct snd_pcm_substream * substream) * ALSA hardware capabilities definition */ -static struct snd_pcm_hardware snd_card_saa7134_capture = +static snd_pcm_hardware_t snd_card_saa7134_capture = { .info = (SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED | SNDRV_PCM_INFO_BLOCK_TRANSFER | @@ -465,7 +465,7 @@ static struct snd_pcm_hardware snd_card_saa7134_capture = .periods_max = 1024, }; -static void snd_card_saa7134_runtime_free(struct snd_pcm_runtime *runtime) +static void snd_card_saa7134_runtime_free(snd_pcm_runtime_t *runtime) { snd_card_saa7134_pcm_t *pcm = runtime->private_data; @@ -482,8 +482,8 @@ static void snd_card_saa7134_runtime_free(struct snd_pcm_runtime *runtime) * */ -static int snd_card_saa7134_hw_params(struct snd_pcm_substream * substream, - struct snd_pcm_hw_params * hw_params) +static int snd_card_saa7134_hw_params(snd_pcm_substream_t * substream, + snd_pcm_hw_params_t * hw_params) { snd_card_saa7134_t *saa7134 = snd_pcm_substream_chip(substream); struct saa7134_dev *dev; @@ -507,7 +507,7 @@ static int snd_card_saa7134_hw_params(struct snd_pcm_substream * substream, /* release the old buffer */ if (substream->runtime->dma_area) { saa7134_pgtable_free(dev->pci, &dev->dmasound.pt); - videobuf_pci_dma_unmap(dev->pci, &dev->dmasound.dma); + videobuf_dma_pci_unmap(dev->pci, &dev->dmasound.dma); dsp_buffer_free(dev); substream->runtime->dma_area = NULL; } @@ -523,12 +523,12 @@ static int snd_card_saa7134_hw_params(struct snd_pcm_substream * substream, return err; } - if (0 != (err = videobuf_pci_dma_map(dev->pci, &dev->dmasound.dma))) { + if (0 != (err = videobuf_dma_pci_map(dev->pci, &dev->dmasound.dma))) { dsp_buffer_free(dev); return err; } if (0 != (err = saa7134_pgtable_alloc(dev->pci,&dev->dmasound.pt))) { - videobuf_pci_dma_unmap(dev->pci, &dev->dmasound.dma); + videobuf_dma_pci_unmap(dev->pci, &dev->dmasound.dma); dsp_buffer_free(dev); return err; } @@ -537,7 +537,7 @@ static int snd_card_saa7134_hw_params(struct snd_pcm_substream * substream, dev->dmasound.dma.sglen, 0))) { saa7134_pgtable_free(dev->pci, &dev->dmasound.pt); - videobuf_pci_dma_unmap(dev->pci, &dev->dmasound.dma); + videobuf_dma_pci_unmap(dev->pci, &dev->dmasound.dma); dsp_buffer_free(dev); return err; } @@ -562,7 +562,7 @@ static int snd_card_saa7134_hw_params(struct snd_pcm_substream * substream, * */ -static int snd_card_saa7134_hw_free(struct snd_pcm_substream * substream) +static int snd_card_saa7134_hw_free(snd_pcm_substream_t * substream) { snd_card_saa7134_t *saa7134 = snd_pcm_substream_chip(substream); struct saa7134_dev *dev; @@ -571,7 +571,7 @@ static int snd_card_saa7134_hw_free(struct snd_pcm_substream * substream) if (substream->runtime->dma_area) { saa7134_pgtable_free(dev->pci, &dev->dmasound.pt); - videobuf_pci_dma_unmap(dev->pci, &dev->dmasound.dma); + videobuf_dma_pci_unmap(dev->pci, &dev->dmasound.dma); dsp_buffer_free(dev); substream->runtime->dma_area = NULL; } @@ -588,7 +588,7 @@ static int snd_card_saa7134_hw_free(struct snd_pcm_substream * substream) * */ -static int snd_card_saa7134_capture_close(struct snd_pcm_substream * substream) +static int snd_card_saa7134_capture_close(snd_pcm_substream_t * substream) { return 0; } @@ -603,20 +603,20 @@ static int snd_card_saa7134_capture_close(struct snd_pcm_substream * substream) * */ -static int snd_card_saa7134_capture_open(struct snd_pcm_substream * substream) +static int snd_card_saa7134_capture_open(snd_pcm_substream_t * substream) { - struct snd_pcm_runtime *runtime = substream->runtime; + snd_pcm_runtime_t *runtime = substream->runtime; snd_card_saa7134_pcm_t *pcm; snd_card_saa7134_t *saa7134 = snd_pcm_substream_chip(substream); struct saa7134_dev *dev = saa7134->dev; int err; - mutex_lock(&dev->dmasound.lock); + down(&dev->dmasound.lock); dev->dmasound.read_count = 0; dev->dmasound.read_offset = 0; - mutex_unlock(&dev->dmasound.lock); + up(&dev->dmasound.lock); pcm = kzalloc(sizeof(*pcm), GFP_KERNEL); if (pcm == NULL) @@ -641,7 +641,7 @@ static int snd_card_saa7134_capture_open(struct snd_pcm_substream * substream) * ALSA capture callbacks definition */ -static struct snd_pcm_ops snd_card_saa7134_capture_ops = { +static snd_pcm_ops_t snd_card_saa7134_capture_ops = { .open = snd_card_saa7134_capture_open, .close = snd_card_saa7134_capture_close, .ioctl = snd_pcm_lib_ioctl, @@ -662,7 +662,7 @@ static struct snd_pcm_ops snd_card_saa7134_capture_ops = { static int snd_card_saa7134_pcm(snd_card_saa7134_t *saa7134, int device) { - struct snd_pcm *pcm; + snd_pcm_t *pcm; int err; if ((err = snd_pcm_new(saa7134->card, "SAA7134 PCM", device, 0, 1, &pcm)) < 0) @@ -680,8 +680,7 @@ static int snd_card_saa7134_pcm(snd_card_saa7134_t *saa7134, int device) .get = snd_saa7134_volume_get, .put = snd_saa7134_volume_put, \ .private_value = addr } -static int snd_saa7134_volume_info(struct snd_kcontrol * kcontrol, - struct snd_ctl_elem_info * uinfo) +static int snd_saa7134_volume_info(snd_kcontrol_t * kcontrol, snd_ctl_elem_info_t * uinfo) { uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; uinfo->count = 2; @@ -690,8 +689,7 @@ static int snd_saa7134_volume_info(struct snd_kcontrol * kcontrol, return 0; } -static int snd_saa7134_volume_get(struct snd_kcontrol * kcontrol, - struct snd_ctl_elem_value * ucontrol) +static int snd_saa7134_volume_get(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol) { snd_card_saa7134_t *chip = snd_kcontrol_chip(kcontrol); int addr = kcontrol->private_value; @@ -701,8 +699,7 @@ static int snd_saa7134_volume_get(struct snd_kcontrol * kcontrol, return 0; } -static int snd_saa7134_volume_put(struct snd_kcontrol * kcontrol, - struct snd_ctl_elem_value * ucontrol) +static int snd_saa7134_volume_put(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol) { snd_card_saa7134_t *chip = snd_kcontrol_chip(kcontrol); int change, addr = kcontrol->private_value; @@ -733,8 +730,7 @@ static int snd_saa7134_volume_put(struct snd_kcontrol * kcontrol, .get = snd_saa7134_capsrc_get, .put = snd_saa7134_capsrc_put, \ .private_value = addr } -static int snd_saa7134_capsrc_info(struct snd_kcontrol * kcontrol, - struct snd_ctl_elem_info * uinfo) +static int snd_saa7134_capsrc_info(snd_kcontrol_t * kcontrol, snd_ctl_elem_info_t * uinfo) { uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN; uinfo->count = 2; @@ -743,8 +739,7 @@ static int snd_saa7134_capsrc_info(struct snd_kcontrol * kcontrol, return 0; } -static int snd_saa7134_capsrc_get(struct snd_kcontrol * kcontrol, - struct snd_ctl_elem_value * ucontrol) +static int snd_saa7134_capsrc_get(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol) { snd_card_saa7134_t *chip = snd_kcontrol_chip(kcontrol); int addr = kcontrol->private_value; @@ -757,8 +752,7 @@ static int snd_saa7134_capsrc_get(struct snd_kcontrol * kcontrol, return 0; } -static int snd_saa7134_capsrc_put(struct snd_kcontrol * kcontrol, - struct snd_ctl_elem_value * ucontrol) +static int snd_saa7134_capsrc_put(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol) { snd_card_saa7134_t *chip = snd_kcontrol_chip(kcontrol); int change, addr = kcontrol->private_value; @@ -818,7 +812,7 @@ static int snd_saa7134_capsrc_put(struct snd_kcontrol * kcontrol, break; } - /* output xbar always main channel */ + /* output xbar always main channel */ saa_dsp_writel(dev, SAA7133_DIGITAL_OUTPUT_SEL1, 0xbbbb10); if (left || right) { // We've got data, turn the input on @@ -835,7 +829,7 @@ static int snd_saa7134_capsrc_put(struct snd_kcontrol * kcontrol, return change; } -static struct snd_kcontrol_new snd_saa7134_controls[] = { +static snd_kcontrol_new_t snd_saa7134_controls[] = { SAA713x_VOLUME("Video Volume", 0, MIXER_ADDR_TVTUNER), SAA713x_CAPSRC("Video Capture Switch", 0, MIXER_ADDR_TVTUNER), SAA713x_VOLUME("Line Volume", 1, MIXER_ADDR_LINE1), @@ -854,7 +848,7 @@ SAA713x_CAPSRC("Line Capture Switch", 2, MIXER_ADDR_LINE2), static int snd_card_saa7134_new_mixer(snd_card_saa7134_t * chip) { - struct snd_card *card = chip->card; + snd_card_t *card = chip->card; unsigned int idx; int err; @@ -868,7 +862,7 @@ static int snd_card_saa7134_new_mixer(snd_card_saa7134_t * chip) return 0; } -static void snd_saa7134_free(struct snd_card * card) +static void snd_saa7134_free(snd_card_t * card) { snd_card_saa7134_t *chip = card->private_data; @@ -895,7 +889,7 @@ static void snd_saa7134_free(struct snd_card * card) static int alsa_card_saa7134_create(struct saa7134_dev *dev, int devnum) { - struct snd_card *card; + snd_card_t *card; snd_card_saa7134_t *chip; int err; @@ -929,7 +923,7 @@ static int alsa_card_saa7134_create(struct saa7134_dev *dev, int devnum) err = request_irq(dev->pci->irq, saa7134_alsa_irq, - IRQF_SHARED | IRQF_DISABLED, dev->name, + SA_SHIRQ | SA_INTERRUPT, dev->name, (void*) &dev->dmasound); if (err < 0) { @@ -940,7 +934,7 @@ static int alsa_card_saa7134_create(struct saa7134_dev *dev, int devnum) chip->irq = dev->pci->irq; - mutex_init(&dev->dmasound.lock); + init_MUTEX(&dev->dmasound.lock); if ((err = snd_card_saa7134_new_mixer(chip)) < 0) goto __nodev; diff --git a/drivers/media/video/saa7134/saa7134-cards.c b/drivers/media/video/saa7134/saa7134-cards.c index 927413ade..c328dc666 100644 --- a/drivers/media/video/saa7134/saa7134-cards.c +++ b/drivers/media/video/saa7134/saa7134-cards.c @@ -536,7 +536,7 @@ struct saa7134_board saa7134_boards[] = { .radio = { .name = name_radio, .amux = LINE2, - }, + }, }, [SAA7134_BOARD_MD7134] = { .name = "Medion 7134", @@ -2028,7 +2028,7 @@ struct saa7134_board saa7134_boards[] = { [SAA7134_BOARD_FLYTV_DIGIMATRIX] = { .name = "FlyTV mini Asus Digimatrix", .audio_clock = 0x00200000, - .tuner_type = TUNER_LG_TALN, + .tuner_type = TUNER_LG_NTSC_TALN_MINI, .radio_type = UNSET, .tuner_addr = ADDR_UNSET, .radio_addr = ADDR_UNSET, @@ -2160,7 +2160,7 @@ struct saa7134_board saa7134_boards[] = { .radio = { .name = name_radio, .amux = LINE2, - }, + }, }, [SAA7134_BOARD_GOTVIEW_7135] = { /* Mike Baikov */ @@ -2624,7 +2624,6 @@ struct saa7134_board saa7134_boards[] = { .tuner_addr = ADDR_UNSET, .radio_addr = ADDR_UNSET, .gpiomask = 0x00200000, - .mpeg = SAA7134_MPEG_DVB, .inputs = {{ .name = name_tv, /* Analog broadcast/cable TV */ .vmux = 1, @@ -2763,7 +2762,7 @@ struct saa7134_board saa7134_boards[] = { but only one of them is currently working. */ .name = "AVerMedia A169 B", .audio_clock = 0x02187de7, - .tuner_type = TUNER_LG_TALN, + .tuner_type = TUNER_LG_NTSC_TALN_MINI, .radio_type = UNSET, .tuner_addr = ADDR_UNSET, .radio_addr = ADDR_UNSET, @@ -2775,7 +2774,7 @@ struct saa7134_board saa7134_boards[] = { /* Rickard Osser */ .name = "AVerMedia A169 B1", .audio_clock = 0x02187de7, - .tuner_type = TUNER_LG_TALN, + .tuner_type = TUNER_LG_NTSC_TALN_MINI, .radio_type = UNSET, .tuner_addr = ADDR_UNSET, .radio_addr = ADDR_UNSET, @@ -2842,55 +2841,6 @@ struct saa7134_board saa7134_boards[] = { .gpio = 0x000000, /* GPIO21=Low for FM radio antenna */ }, }, - [SAA7134_BOARD_FLYVIDEO3000_NTSC] = { - /* "Zac Bowling" */ - .name = "LifeView FlyVIDEO3000 (NTSC)", - .audio_clock = 0x00200000, - .tuner_type = TUNER_PHILIPS_NTSC, - .radio_type = UNSET, - .tuner_addr = ADDR_UNSET, - .radio_addr = ADDR_UNSET, - - .gpiomask = 0xe000, - .inputs = {{ - .name = name_tv, - .vmux = 1, - .amux = TV, - .gpio = 0x8000, - .tv = 1, - },{ - .name = name_tv_mono, - .vmux = 1, - .amux = LINE2, - .gpio = 0x0000, - .tv = 1, - },{ - .name = name_comp1, - .vmux = 0, - .amux = LINE2, - .gpio = 0x4000, - },{ - .name = name_comp2, - .vmux = 3, - .amux = LINE2, - .gpio = 0x4000, - },{ - .name = name_svideo, - .vmux = 8, - .amux = LINE2, - .gpio = 0x4000, - }}, - .radio = { - .name = name_radio, - .amux = LINE2, - .gpio = 0x2000, - }, - .mute = { - .name = name_mute, - .amux = TV, - .gpio = 0x8000, - }, - }, }; const unsigned int saa7134_bcount = ARRAY_SIZE(saa7134_boards); @@ -2947,12 +2897,6 @@ struct pci_device_id saa7134_pci_tbl[] = { .subvendor = 0x153b, .subdevice = 0x1162, .driver_data = SAA7134_BOARD_CINERGY400_CARDBUS, - },{ - .vendor = PCI_VENDOR_ID_PHILIPS, - .device = PCI_DEVICE_ID_PHILIPS_SAA7134, - .subvendor = 0x5169, - .subdevice = 0x0138, - .driver_data = SAA7134_BOARD_FLYVIDEO3000_NTSC, },{ .vendor = PCI_VENDOR_ID_PHILIPS, .device = PCI_DEVICE_ID_PHILIPS_SAA7134, @@ -3514,7 +3458,6 @@ int saa7134_board_init1(struct saa7134_dev *dev) switch (dev->board) { case SAA7134_BOARD_FLYVIDEO2000: case SAA7134_BOARD_FLYVIDEO3000: - case SAA7134_BOARD_FLYVIDEO3000_NTSC: dev->has_remote = SAA7134_REMOTE_GPIO; board_flyvideo(dev); break; @@ -3547,20 +3490,18 @@ int saa7134_board_init1(struct saa7134_dev *dev) case SAA7134_BOARD_KWORLD_TERMINATOR: case SAA7134_BOARD_SEDNA_PC_TV_CARDBUS: case SAA7134_BOARD_FLYDVBT_LR301: - case SAA7134_BOARD_FLYDVBTDUO: dev->has_remote = SAA7134_REMOTE_GPIO; break; case SAA7134_BOARD_MD5044: printk("%s: seems there are two different versions of the MD5044\n" - "%s: (with the same ID) out there. If sound doesn't work for\n" - "%s: you try the audio_clock_override=0x200000 insmod option.\n", - dev->name,dev->name,dev->name); + "%s: (with the same ID) out there. If sound doesn't work for\n" + "%s: you try the audio_clock_override=0x200000 insmod option.\n", + dev->name,dev->name,dev->name); break; case SAA7134_BOARD_CINERGY400_CARDBUS: /* power-up tuner chip */ saa_andorl(SAA7134_GPIO_GPMODE0 >> 2, 0x00040000, 0x00040000); saa_andorl(SAA7134_GPIO_GPSTATUS0 >> 2, 0x00040000, 0x00000000); - break; case SAA7134_BOARD_PINNACLE_300I_DVBT_PAL: /* this turns the remote control chip off to work around a bug in it */ saa_writeb(SAA7134_GPIO_GPMODE1, 0x80); @@ -3741,13 +3682,6 @@ int saa7134_board_init2(struct saa7134_dev *dev) i2c_transfer(&dev->i2c_adap, &msg, 1); } break; - case SAA7134_BOARD_FLYDVB_TRIO: - { - u8 data[] = { 0x3c, 0x33, 0x62}; - struct i2c_msg msg = {.addr=0x09, .flags=0, .buf=data, .len = sizeof(data)}; - i2c_transfer(&dev->i2c_adap, &msg, 1); - } - break; case SAA7134_BOARD_ADS_DUO_CARDBUS_PTV331: case SAA7134_BOARD_FLYDVBT_HYBRID_CARDBUS: /* make the tda10046 find its eeprom */ @@ -3761,7 +3695,7 @@ int saa7134_board_init2(struct saa7134_dev *dev) { /* enable tuner */ int i; - static const u8 buffer [] = { 0x10,0x12,0x13,0x04,0x16,0x00,0x14,0x04,0x017,0x00 }; + u8 buffer [] = { 0x10,0x12,0x13,0x04,0x16,0x00,0x14,0x04,0x017,0x00 }; dev->i2c_client.addr = 0x0a; for (i = 0; i < 5; i++) if (2 != i2c_master_send(&dev->i2c_client,&buffer[i*2],2)) diff --git a/drivers/media/video/saa7134/saa7134-core.c b/drivers/media/video/saa7134/saa7134-core.c index be3a81fc9..2e0c9b1b6 100644 --- a/drivers/media/video/saa7134/saa7134-core.c +++ b/drivers/media/video/saa7134/saa7134-core.c @@ -20,6 +20,7 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +#include #include #include #include @@ -31,7 +32,6 @@ #include #include #include -#include #include "saa7134-reg.h" #include "saa7134.h" @@ -66,11 +66,6 @@ static unsigned int latency = UNSET; module_param(latency, int, 0444); MODULE_PARM_DESC(latency,"pci latency timer"); -int saa7134_no_overlay=-1; -module_param_named(no_overlay, saa7134_no_overlay, int, 0444); -MODULE_PARM_DESC(no_overlay,"allow override overlay default (0 disables, 1 enables)" - " [some VIA/SIS chipsets are known to have problem with overlay]"); - static unsigned int video_nr[] = {[0 ... (SAA7134_MAXBOARDS - 1)] = UNSET }; static unsigned int vbi_nr[] = {[0 ... (SAA7134_MAXBOARDS - 1)] = UNSET }; static unsigned int radio_nr[] = {[0 ... (SAA7134_MAXBOARDS - 1)] = UNSET }; @@ -254,12 +249,13 @@ void saa7134_pgtable_free(struct pci_dev *pci, struct saa7134_pgtable *pt) /* ------------------------------------------------------------------ */ -void saa7134_dma_free(struct videobuf_queue *q,struct saa7134_buf *buf) +void saa7134_dma_free(struct saa7134_dev *dev,struct saa7134_buf *buf) { - BUG_ON(in_interrupt()); + if (in_interrupt()) + BUG(); videobuf_waiton(&buf->vb,0,0); - videobuf_dma_unmap(q, &buf->vb.dma); + videobuf_dma_pci_unmap(dev->pci, &buf->vb.dma); videobuf_dma_free(&buf->vb.dma); buf->vb.state = STATE_NEEDS_INIT; } @@ -547,8 +543,6 @@ static irqreturn_t saa7134_irq(int irq, void *dev_id, struct pt_regs *regs) if (report & SAA7134_IRQ_REPORT_GPIO16) { switch (dev->has_remote) { case SAA7134_REMOTE_GPIO: - if (!dev->remote) - break; if (dev->remote->mask_keydown & 0x10000) { saa7134_input_irq(dev); } @@ -565,8 +559,6 @@ static irqreturn_t saa7134_irq(int irq, void *dev_id, struct pt_regs *regs) if (report & SAA7134_IRQ_REPORT_GPIO18) { switch (dev->has_remote) { case SAA7134_REMOTE_GPIO: - if (!dev->remote) - break; if ((dev->remote->mask_keydown & 0x40000) || (dev->remote->mask_keyup & 0x40000)) { saa7134_input_irq(dev); @@ -621,7 +613,7 @@ static int saa7134_hwinit1(struct saa7134_dev *dev) saa_writel(SAA7134_IRQ1, 0); saa_writel(SAA7134_IRQ2, 0); - mutex_init(&dev->lock); + init_MUTEX(&dev->lock); spin_lock_init(&dev->slock); saa7134_track_gpio(dev,"pre-init"); @@ -679,7 +671,7 @@ static int saa7134_hwinit2(struct saa7134_dev *dev) SAA7134_IRQ2_INTE_PE | SAA7134_IRQ2_INTE_AR; - if (dev->has_remote == SAA7134_REMOTE_GPIO && dev->remote) { + if (dev->has_remote == SAA7134_REMOTE_GPIO) { if (dev->remote->mask_keydown & 0x10000) irq2_mask |= SAA7134_IRQ2_INTE_GPIO16; else if (dev->remote->mask_keydown & 0x40000) @@ -843,22 +835,6 @@ static int __devinit saa7134_initdev(struct pci_dev *pci_dev, latency = 0x0A; } #endif - if (pci_pci_problems & PCIPCI_FAIL) { - printk(KERN_INFO "%s: quirk: this driver and your " - "chipset may not work together" - " in overlay mode.\n",dev->name); - if (!saa7134_no_overlay) { - printk(KERN_INFO "%s: quirk: overlay " - "mode will be disabled.\n", - dev->name); - saa7134_no_overlay = 1; - } else { - printk(KERN_INFO "%s: quirk: overlay " - "mode will be forced. Use this" - " option at your own risk.\n", - dev->name); - } - } } if (UNSET != latency) { printk(KERN_INFO "%s: setting pci latency timer to %d\n", @@ -870,11 +846,11 @@ static int __devinit saa7134_initdev(struct pci_dev *pci_dev, pci_read_config_byte(pci_dev, PCI_CLASS_REVISION, &dev->pci_rev); pci_read_config_byte(pci_dev, PCI_LATENCY_TIMER, &dev->pci_lat); printk(KERN_INFO "%s: found at %s, rev: %d, irq: %d, " - "latency: %d, mmio: 0x%llx\n", dev->name, + "latency: %d, mmio: 0x%lx\n", dev->name, pci_name(pci_dev), dev->pci_rev, pci_dev->irq, - dev->pci_lat,(unsigned long long)pci_resource_start(pci_dev,0)); + dev->pci_lat,pci_resource_start(pci_dev,0)); pci_set_master(pci_dev); - if (!pci_dma_supported(pci_dev, DMA_32BIT_MASK)) { + if (!pci_dma_supported(pci_dev,0xffffffff)) { printk("%s: Oops: no 32bit PCI DMA ???\n",dev->name); err = -EIO; goto fail1; @@ -904,8 +880,8 @@ static int __devinit saa7134_initdev(struct pci_dev *pci_dev, pci_resource_len(pci_dev,0), dev->name)) { err = -EBUSY; - printk(KERN_ERR "%s: can't get MMIO memory @ 0x%llx\n", - dev->name,(unsigned long long)pci_resource_start(pci_dev,0)); + printk(KERN_ERR "%s: can't get MMIO memory @ 0x%lx\n", + dev->name,pci_resource_start(pci_dev,0)); goto fail1; } dev->lmmio = ioremap(pci_resource_start(pci_dev,0), 0x1000); @@ -923,7 +899,7 @@ static int __devinit saa7134_initdev(struct pci_dev *pci_dev, /* get irq */ err = request_irq(pci_dev->irq, saa7134_irq, - IRQF_SHARED | IRQF_DISABLED, dev->name, dev); + SA_SHIRQ | SA_INTERRUPT, dev->name, dev); if (err < 0) { printk(KERN_ERR "%s: can't get IRQ %d\n", dev->name,pci_dev->irq); @@ -941,6 +917,8 @@ static int __devinit saa7134_initdev(struct pci_dev *pci_dev, /* load i2c helpers */ if (TUNER_ABSENT != dev->tuner_type) request_module("tuner"); + if (dev->tda9887_conf) + request_module("tda9887"); if (card_is_empress(dev)) { request_module("saa6752hs"); request_module_depend("saa7134-empress",&need_empress); @@ -959,11 +937,6 @@ static int __devinit saa7134_initdev(struct pci_dev *pci_dev, v4l2_prio_init(&dev->prio); /* register v4l devices */ - if (saa7134_no_overlay <= 0) { - saa7134_video_template.type |= VID_TYPE_OVERLAY; - } else { - printk("%s: Overlay support disabled.\n",dev->name); - } dev->video_dev = vdev_init(dev,&saa7134_video_template,"video"); err = video_register_device(dev->video_dev,VFL_TYPE_GRABBER, video_nr[dev->nr]); diff --git a/drivers/media/video/saa7134/saa7134-dvb.c b/drivers/media/video/saa7134/saa7134-dvb.c index 449fe2301..746ec3156 100644 --- a/drivers/media/video/saa7134/saa7134-dvb.c +++ b/drivers/media/video/saa7134/saa7134-dvb.c @@ -132,8 +132,9 @@ static int mt352_aver777_init(struct dvb_frontend* fe) return 0; } -static int mt352_pinnacle_tuner_set_params(struct dvb_frontend* fe, - struct dvb_frontend_parameters* params) +static int mt352_pinnacle_pll_set(struct dvb_frontend* fe, + struct dvb_frontend_parameters* params, + u8* pllbuf) { u8 off[] = { 0x00, 0xf1}; u8 on[] = { 0x00, 0x71}; @@ -146,31 +147,30 @@ static int mt352_pinnacle_tuner_set_params(struct dvb_frontend* fe, f.tuner = 0; f.type = V4L2_TUNER_DIGITAL_TV; f.frequency = params->frequency / 1000 * 16 / 1000; - if (fe->ops.i2c_gate_ctrl) - fe->ops.i2c_gate_ctrl(fe, 1); i2c_transfer(&dev->i2c_adap, &msg, 1); saa7134_i2c_call_clients(dev,VIDIOC_S_FREQUENCY,&f); msg.buf = on; - if (fe->ops.i2c_gate_ctrl) - fe->ops.i2c_gate_ctrl(fe, 1); i2c_transfer(&dev->i2c_adap, &msg, 1); pinnacle_antenna_pwr(dev, antenna_pwr); /* mt352 setup */ - return mt352_pinnacle_init(fe); + mt352_pinnacle_init(fe); + pllbuf[0] = 0xc2; + pllbuf[1] = 0x00; + pllbuf[2] = 0x00; + pllbuf[3] = 0x80; + pllbuf[4] = 0x00; + return 0; } -static int mt352_aver777_tuner_calc_regs(struct dvb_frontend *fe, struct dvb_frontend_parameters *params, u8* pllbuf, int buf_len) +static int mt352_aver777_pll_set(struct dvb_frontend *fe, struct dvb_frontend_parameters *params, u8* pllbuf) { - if (buf_len < 5) - return -EINVAL; - - pllbuf[0] = 0x61; + pllbuf[0] = 0xc2; dvb_pll_configure(&dvb_pll_philips_td1316, pllbuf+1, params->frequency, params->u.ofdm.bandwidth); - return 5; + return 0; } static struct mt352_config pinnacle_300i = { @@ -179,11 +179,13 @@ static struct mt352_config pinnacle_300i = { .if2 = 36150, .no_tuner = 1, .demod_init = mt352_pinnacle_init, + .pll_set = mt352_pinnacle_pll_set, }; static struct mt352_config avermedia_777 = { .demod_address = 0xf, .demod_init = mt352_aver777_init, + .pll_set = mt352_aver777_pll_set, }; #endif @@ -266,8 +268,6 @@ static int philips_tda6651_pll_set(u8 addr, struct dvb_frontend *fe, struct dvb_ tuner_buf[2] = 0xca; tuner_buf[3] = (cp << 5) | (filter << 3) | band; - if (fe->ops.i2c_gate_ctrl) - fe->ops.i2c_gate_ctrl(fe, 1); if (i2c_transfer(&dev->i2c_adap, &tuner_msg, 1) != 1) return -EIO; msleep(1); @@ -281,8 +281,6 @@ static int philips_tda6651_pll_init(u8 addr, struct dvb_frontend *fe) struct i2c_msg tuner_msg = {.addr = addr,.flags = 0,.buf = tu1216_init,.len = sizeof(tu1216_init) }; /* setup PLL configuration */ - if (fe->ops.i2c_gate_ctrl) - fe->ops.i2c_gate_ctrl(fe, 1); if (i2c_transfer(&dev->i2c_adap, &tuner_msg, 1) != 1) return -EIO; msleep(1); @@ -292,12 +290,12 @@ static int philips_tda6651_pll_init(u8 addr, struct dvb_frontend *fe) /* ------------------------------------------------------------------ */ -static int philips_tu1216_tuner_60_init(struct dvb_frontend *fe) +static int philips_tu1216_pll_60_init(struct dvb_frontend *fe) { return philips_tda6651_pll_init(0x60, fe); } -static int philips_tu1216_tuner_60_set_params(struct dvb_frontend *fe, struct dvb_frontend_parameters *params) +static int philips_tu1216_pll_60_set(struct dvb_frontend *fe, struct dvb_frontend_parameters *params) { return philips_tda6651_pll_set(0x60, fe, params); } @@ -317,17 +315,20 @@ static struct tda1004x_config philips_tu1216_60_config = { .xtal_freq = TDA10046_XTAL_4M, .agc_config = TDA10046_AGC_DEFAULT, .if_freq = TDA10046_FREQ_3617, + .pll_init = philips_tu1216_pll_60_init, + .pll_set = philips_tu1216_pll_60_set, + .pll_sleep = NULL, .request_firmware = philips_tu1216_request_firmware, }; /* ------------------------------------------------------------------ */ -static int philips_tu1216_tuner_61_init(struct dvb_frontend *fe) +static int philips_tu1216_pll_61_init(struct dvb_frontend *fe) { return philips_tda6651_pll_init(0x61, fe); } -static int philips_tu1216_tuner_61_set_params(struct dvb_frontend *fe, struct dvb_frontend_parameters *params) +static int philips_tu1216_pll_61_set(struct dvb_frontend *fe, struct dvb_frontend_parameters *params) { return philips_tda6651_pll_set(0x61, fe, params); } @@ -340,20 +341,21 @@ static struct tda1004x_config philips_tu1216_61_config = { .xtal_freq = TDA10046_XTAL_4M, .agc_config = TDA10046_AGC_DEFAULT, .if_freq = TDA10046_FREQ_3617, + .pll_init = philips_tu1216_pll_61_init, + .pll_set = philips_tu1216_pll_61_set, + .pll_sleep = NULL, .request_firmware = philips_tu1216_request_firmware, }; /* ------------------------------------------------------------------ */ -static int philips_europa_tuner_init(struct dvb_frontend *fe) +static int philips_europa_pll_init(struct dvb_frontend *fe) { struct saa7134_dev *dev = fe->dvb->priv; static u8 msg[] = { 0x0b, 0xf5, 0x86, 0xab }; struct i2c_msg init_msg = {.addr = 0x61,.flags = 0,.buf = msg,.len = sizeof(msg) }; /* setup PLL configuration */ - if (fe->ops.i2c_gate_ctrl) - fe->ops.i2c_gate_ctrl(fe, 1); if (i2c_transfer(&dev->i2c_adap, &init_msg, 1) != 1) return -EIO; msleep(1); @@ -363,20 +365,18 @@ static int philips_europa_tuner_init(struct dvb_frontend *fe) init_msg.len = 0x02; msg[0] = 0x00; msg[1] = 0x40; - if (fe->ops.i2c_gate_ctrl) - fe->ops.i2c_gate_ctrl(fe, 1); if (i2c_transfer(&dev->i2c_adap, &init_msg, 1) != 1) return -EIO; return 0; } -static int philips_td1316_tuner_set_params(struct dvb_frontend *fe, struct dvb_frontend_parameters *params) +static int philips_td1316_pll_set(struct dvb_frontend *fe, struct dvb_frontend_parameters *params) { return philips_tda6651_pll_set(0x61, fe, params); } -static int philips_europa_tuner_sleep(struct dvb_frontend *fe) +static void philips_europa_analog(struct dvb_frontend *fe) { struct saa7134_dev *dev = fe->dvb->priv; /* this message actually turns the tuner back to analog mode */ @@ -391,20 +391,7 @@ static int philips_europa_tuner_sleep(struct dvb_frontend *fe) analog_msg.len = 0x02; msg[0] = 0x00; msg[1] = 0x14; - if (fe->ops.i2c_gate_ctrl) - fe->ops.i2c_gate_ctrl(fe, 1); i2c_transfer(&dev->i2c_adap, &analog_msg, 1); - return 0; -} - -static int philips_europa_demod_sleep(struct dvb_frontend *fe) -{ - struct saa7134_dev *dev = fe->dvb->priv; - - if (dev->original_demod_sleep) - dev->original_demod_sleep(fe); - fe->ops.i2c_gate_ctrl(fe, 1); - return 0; } static struct tda1004x_config philips_europa_config = { @@ -415,20 +402,21 @@ static struct tda1004x_config philips_europa_config = { .xtal_freq = TDA10046_XTAL_4M, .agc_config = TDA10046_AGC_IFO_AUTO_POS, .if_freq = TDA10046_FREQ_052, + .pll_init = philips_europa_pll_init, + .pll_set = philips_td1316_pll_set, + .pll_sleep = philips_europa_analog, .request_firmware = NULL, }; /* ------------------------------------------------------------------ */ -static int philips_fmd1216_tuner_init(struct dvb_frontend *fe) +static int philips_fmd1216_pll_init(struct dvb_frontend *fe) { struct saa7134_dev *dev = fe->dvb->priv; /* this message is to set up ATC and ALC */ static u8 fmd1216_init[] = { 0x0b, 0xdc, 0x9c, 0xa0 }; struct i2c_msg tuner_msg = {.addr = 0x61,.flags = 0,.buf = fmd1216_init,.len = sizeof(fmd1216_init) }; - if (fe->ops.i2c_gate_ctrl) - fe->ops.i2c_gate_ctrl(fe, 1); if (i2c_transfer(&dev->i2c_adap, &tuner_msg, 1) != 1) return -EIO; msleep(1); @@ -436,27 +424,22 @@ static int philips_fmd1216_tuner_init(struct dvb_frontend *fe) return 0; } -static int philips_fmd1216_tuner_sleep(struct dvb_frontend *fe) +static void philips_fmd1216_analog(struct dvb_frontend *fe) { struct saa7134_dev *dev = fe->dvb->priv; /* this message actually turns the tuner back to analog mode */ static u8 fmd1216_init[] = { 0x0b, 0xdc, 0x9c, 0x60 }; struct i2c_msg tuner_msg = {.addr = 0x61,.flags = 0,.buf = fmd1216_init,.len = sizeof(fmd1216_init) }; - if (fe->ops.i2c_gate_ctrl) - fe->ops.i2c_gate_ctrl(fe, 1); i2c_transfer(&dev->i2c_adap, &tuner_msg, 1); msleep(1); fmd1216_init[2] = 0x86; fmd1216_init[3] = 0x54; - if (fe->ops.i2c_gate_ctrl) - fe->ops.i2c_gate_ctrl(fe, 1); i2c_transfer(&dev->i2c_adap, &tuner_msg, 1); msleep(1); - return 0; } -static int philips_fmd1216_tuner_set_params(struct dvb_frontend *fe, struct dvb_frontend_parameters *params) +static int philips_fmd1216_pll_set(struct dvb_frontend *fe, struct dvb_frontend_parameters *params) { struct saa7134_dev *dev = fe->dvb->priv; u8 tuner_buf[4]; @@ -533,8 +516,6 @@ static int philips_fmd1216_tuner_set_params(struct dvb_frontend *fe, struct dvb_ tuner_buf[2] = 0x80 | (cp << 6) | (mode << 3) | 4; tuner_buf[3] = 0x40 | band; - if (fe->ops.i2c_gate_ctrl) - fe->ops.i2c_gate_ctrl(fe, 1); if (i2c_transfer(&dev->i2c_adap, &tuner_msg, 1) != 1) return -EIO; return 0; @@ -547,6 +528,9 @@ static struct tda1004x_config medion_cardbus = { .xtal_freq = TDA10046_XTAL_16M, .agc_config = TDA10046_AGC_IFO_AUTO_NEG, .if_freq = TDA10046_FREQ_3613, + .pll_init = philips_fmd1216_pll_init, + .pll_set = philips_fmd1216_pll_set, + .pll_sleep = philips_fmd1216_analog, .request_firmware = NULL, }; @@ -594,12 +578,12 @@ static struct tda827x_data tda827x_dvbt[] = { { .lomax = 0, .spd = 0, .bs = 0, .bp = 0, .cp = 0, .gc3 = 0, .div1p5 = 0} }; -static int philips_tda827x_tuner_init(struct dvb_frontend *fe) +static int philips_tda827x_pll_init(struct dvb_frontend *fe) { return 0; } -static int philips_tda827x_tuner_set_params(struct dvb_frontend *fe, struct dvb_frontend_parameters *params) +static int philips_tda827x_pll_set(struct dvb_frontend *fe, struct dvb_frontend_parameters *params) { struct saa7134_dev *dev = fe->dvb->priv; u8 tuner_buf[14]; @@ -646,8 +630,6 @@ static int philips_tda827x_tuner_set_params(struct dvb_frontend *fe, struct dvb_ tuner_buf[13] = 0x40; tuner_msg.len = 14; - if (fe->ops.i2c_gate_ctrl) - fe->ops.i2c_gate_ctrl(fe, 1); if (i2c_transfer(&dev->i2c_adap, &tuner_msg, 1) != 1) return -EIO; @@ -656,23 +638,18 @@ static int philips_tda827x_tuner_set_params(struct dvb_frontend *fe, struct dvb_ tuner_buf[0] = 0x30; tuner_buf[1] = 0x50 + tda827x_dvbt[i].cp; tuner_msg.len = 2; - if (fe->ops.i2c_gate_ctrl) - fe->ops.i2c_gate_ctrl(fe, 1); i2c_transfer(&dev->i2c_adap, &tuner_msg, 1); return 0; } -static int philips_tda827x_tuner_sleep(struct dvb_frontend *fe) +static void philips_tda827x_pll_sleep(struct dvb_frontend *fe) { struct saa7134_dev *dev = fe->dvb->priv; static u8 tda827x_sleep[] = { 0x30, 0xd0}; struct i2c_msg tuner_msg = {.addr = 0x60,.flags = 0,.buf = tda827x_sleep, .len = sizeof(tda827x_sleep) }; - if (fe->ops.i2c_gate_ctrl) - fe->ops.i2c_gate_ctrl(fe, 1); i2c_transfer(&dev->i2c_adap, &tuner_msg, 1); - return 0; } static struct tda1004x_config tda827x_lifeview_config = { @@ -682,6 +659,9 @@ static struct tda1004x_config tda827x_lifeview_config = { .xtal_freq = TDA10046_XTAL_16M, .agc_config = TDA10046_AGC_TDA827X, .if_freq = TDA10046_FREQ_045, + .pll_init = philips_tda827x_pll_init, + .pll_set = philips_tda827x_pll_set, + .pll_sleep = philips_tda827x_pll_sleep, .request_firmware = NULL, }; @@ -773,8 +753,6 @@ static int philips_tda827xa_pll_set(u8 addr, struct dvb_frontend *fe, struct dvb tuner_buf[12] = 0x00; tuner_buf[13] = 0x39; // lpsel msg.len = 14; - if (fe->ops.i2c_gate_ctrl) - fe->ops.i2c_gate_ctrl(fe, 1); if (i2c_transfer(&dev->i2c_adap, &msg, 1) != 1) return -EIO; @@ -782,14 +760,10 @@ static int philips_tda827xa_pll_set(u8 addr, struct dvb_frontend *fe, struct dvb msg.len = 2; reg2[0] = 0x60; reg2[1] = 0x3c; - if (fe->ops.i2c_gate_ctrl) - fe->ops.i2c_gate_ctrl(fe, 1); i2c_transfer(&dev->i2c_adap, &msg, 1); reg2[0] = 0xa0; reg2[1] = 0x40; - if (fe->ops.i2c_gate_ctrl) - fe->ops.i2c_gate_ctrl(fe, 1); i2c_transfer(&dev->i2c_adap, &msg, 1); msleep(2); @@ -797,43 +771,36 @@ static int philips_tda827xa_pll_set(u8 addr, struct dvb_frontend *fe, struct dvb reg2[0] = 0x30; reg2[1] = 0x10 + tda827xa_dvbt[i].scr; msg.len = 2; - if (fe->ops.i2c_gate_ctrl) - fe->ops.i2c_gate_ctrl(fe, 1); i2c_transfer(&dev->i2c_adap, &msg, 1); msleep(550); reg2[0] = 0x50; reg2[1] = 0x4f + (tda827xa_dvbt[i].gc3 << 4); - if (fe->ops.i2c_gate_ctrl) - fe->ops.i2c_gate_ctrl(fe, 1); i2c_transfer(&dev->i2c_adap, &msg, 1); return 0; } -static int philips_tda827xa_tuner_sleep(u8 addr, struct dvb_frontend *fe) +static void philips_tda827xa_pll_sleep(u8 addr, struct dvb_frontend *fe) { struct saa7134_dev *dev = fe->dvb->priv; static u8 tda827xa_sleep[] = { 0x30, 0x90}; struct i2c_msg tuner_msg = {.addr = addr,.flags = 0,.buf = tda827xa_sleep, .len = sizeof(tda827xa_sleep) }; - if (fe->ops.i2c_gate_ctrl) - fe->ops.i2c_gate_ctrl(fe, 1); i2c_transfer(&dev->i2c_adap, &tuner_msg, 1); - return 0; + } /* ------------------------------------------------------------------ */ -static int philips_tiger_tuner_set_params(struct dvb_frontend *fe, struct dvb_frontend_parameters *params) +static int philips_tiger_pll_set(struct dvb_frontend *fe, struct dvb_frontend_parameters *params) { int ret; struct saa7134_dev *dev = fe->dvb->priv; static u8 tda8290_close[] = { 0x21, 0xc0}; static u8 tda8290_open[] = { 0x21, 0x80}; struct i2c_msg tda8290_msg = {.addr = 0x4b,.flags = 0, .len = 2}; - /* close tda8290 i2c bridge */ tda8290_msg.buf = tda8290_close; ret = i2c_transfer(&dev->i2c_adap, &tda8290_msg, 1); @@ -847,9 +814,9 @@ static int philips_tiger_tuner_set_params(struct dvb_frontend *fe, struct dvb_fr tda8290_msg.buf = tda8290_open; i2c_transfer(&dev->i2c_adap, &tda8290_msg, 1); return ret; -} +}; -static int philips_tiger_tuner_init(struct dvb_frontend *fe) +static int philips_tiger_dvb_mode(struct dvb_frontend *fe) { struct saa7134_dev *dev = fe->dvb->priv; static u8 data[] = { 0x3c, 0x33, 0x6a}; @@ -860,15 +827,14 @@ static int philips_tiger_tuner_init(struct dvb_frontend *fe) return 0; } -static int philips_tiger_tuner_sleep(struct dvb_frontend *fe) +static void philips_tiger_analog_mode(struct dvb_frontend *fe) { struct saa7134_dev *dev = fe->dvb->priv; static u8 data[] = { 0x3c, 0x33, 0x68}; struct i2c_msg msg = {.addr=0x08, .flags=0, .buf=data, .len = sizeof(data)}; i2c_transfer(&dev->i2c_adap, &msg, 1); - philips_tda827xa_tuner_sleep( 0x61, fe); - return 0; + philips_tda827xa_pll_sleep( 0x61, fe); } static struct tda1004x_config philips_tiger_config = { @@ -878,46 +844,23 @@ static struct tda1004x_config philips_tiger_config = { .xtal_freq = TDA10046_XTAL_16M, .agc_config = TDA10046_AGC_TDA827X, .if_freq = TDA10046_FREQ_045, + .pll_init = philips_tiger_dvb_mode, + .pll_set = philips_tiger_pll_set, + .pll_sleep = philips_tiger_analog_mode, .request_firmware = NULL, }; /* ------------------------------------------------------------------ */ -static int lifeview_trio_tuner_set_params(struct dvb_frontend *fe, struct dvb_frontend_parameters *params) -{ - int ret; - - ret = philips_tda827xa_pll_set(0x60, fe, params); - return ret; -} - -static int lifeview_trio_tuner_sleep(struct dvb_frontend *fe) -{ - philips_tda827xa_tuner_sleep(0x60, fe); - return 0; -} - -static struct tda1004x_config lifeview_trio_config = { - .demod_address = 0x09, - .invert = 1, - .invert_oclk = 0, - .xtal_freq = TDA10046_XTAL_16M, - .agc_config = TDA10046_AGC_TDA827X_GPL, - .if_freq = TDA10046_FREQ_045, - .request_firmware = NULL, -}; - -/* ------------------------------------------------------------------ */ - -static int ads_duo_tuner_set_params(struct dvb_frontend *fe, struct dvb_frontend_parameters *params) +static int ads_duo_pll_set(struct dvb_frontend *fe, struct dvb_frontend_parameters *params) { int ret; ret = philips_tda827xa_pll_set(0x61, fe, params); return ret; -} +}; -static int ads_duo_tuner_init(struct dvb_frontend *fe) +static int ads_duo_dvb_mode(struct dvb_frontend *fe) { struct saa7134_dev *dev = fe->dvb->priv; /* route TDA8275a AGC input to the channel decoder */ @@ -925,13 +868,12 @@ static int ads_duo_tuner_init(struct dvb_frontend *fe) return 0; } -static int ads_duo_tuner_sleep(struct dvb_frontend *fe) +static void ads_duo_analog_mode(struct dvb_frontend *fe) { struct saa7134_dev *dev = fe->dvb->priv; /* route TDA8275a AGC input to the analog IF chip*/ saa_writeb(SAA7134_GPIO_GPSTATUS2, 0x20); - philips_tda827xa_tuner_sleep( 0x61, fe); - return 0; + philips_tda827xa_pll_sleep( 0x61, fe); } static struct tda1004x_config ads_tech_duo_config = { @@ -941,24 +883,31 @@ static struct tda1004x_config ads_tech_duo_config = { .xtal_freq = TDA10046_XTAL_16M, .agc_config = TDA10046_AGC_TDA827X_GPL, .if_freq = TDA10046_FREQ_045, + .pll_init = ads_duo_dvb_mode, + .pll_set = ads_duo_pll_set, + .pll_sleep = ads_duo_analog_mode, .request_firmware = NULL, }; /* ------------------------------------------------------------------ */ -static int tevion_dvb220rf_tuner_set_params(struct dvb_frontend *fe, struct dvb_frontend_parameters *params) +static int tevion_dvb220rf_pll_set(struct dvb_frontend *fe, struct dvb_frontend_parameters *params) { int ret; ret = philips_tda827xa_pll_set(0x60, fe, params); return ret; } -static int tevion_dvb220rf_tuner_sleep(struct dvb_frontend *fe) +static int tevion_dvb220rf_pll_init(struct dvb_frontend *fe) { - philips_tda827xa_tuner_sleep( 0x61, fe); return 0; } +static void tevion_dvb220rf_pll_sleep(struct dvb_frontend *fe) +{ + philips_tda827xa_pll_sleep( 0x61, fe); +} + static struct tda1004x_config tevion_dvbt220rf_config = { .demod_address = 0x08, .invert = 1, @@ -966,6 +915,9 @@ static struct tda1004x_config tevion_dvbt220rf_config = { .xtal_freq = TDA10046_XTAL_16M, .agc_config = TDA10046_AGC_TDA827X, .if_freq = TDA10046_FREQ_045, + .pll_init = tevion_dvb220rf_pll_init, + .pll_set = tevion_dvb220rf_pll_set, + .pll_sleep = tevion_dvb220rf_pll_sleep, .request_firmware = NULL, }; @@ -976,6 +928,8 @@ static struct tda1004x_config tevion_dvbt220rf_config = { #ifdef HAVE_NXT200X static struct nxt200x_config avertvhda180 = { .demod_address = 0x0a, + .pll_address = 0x61, + .pll_desc = &dvb_pll_tdhu2, }; static int nxt200x_set_pll_input(u8 *buf, int input) @@ -989,6 +943,8 @@ static int nxt200x_set_pll_input(u8 *buf, int input) static struct nxt200x_config kworldatsc110 = { .demod_address = 0x0a, + .pll_address = 0x61, + .pll_desc = &dvb_pll_tuv1236d, .set_pll_input = nxt200x_set_pll_input, }; #endif @@ -1014,158 +970,74 @@ static int dvb_init(struct saa7134_dev *dev) printk("%s: pinnacle 300i dvb setup\n",dev->name); dev->dvb.frontend = mt352_attach(&pinnacle_300i, &dev->i2c_adap); - if (dev->dvb.frontend) { - dev->dvb.frontend->ops.tuner_ops.set_params = mt352_pinnacle_tuner_set_params; - } break; case SAA7134_BOARD_AVERMEDIA_777: printk("%s: avertv 777 dvb setup\n",dev->name); dev->dvb.frontend = mt352_attach(&avermedia_777, &dev->i2c_adap); - if (dev->dvb.frontend) { - dev->dvb.frontend->ops.tuner_ops.calc_regs = mt352_aver777_tuner_calc_regs; - } break; #endif #ifdef HAVE_TDA1004X case SAA7134_BOARD_MD7134: dev->dvb.frontend = tda10046_attach(&medion_cardbus, &dev->i2c_adap); - if (dev->dvb.frontend) { - dev->dvb.frontend->ops.tuner_ops.init = philips_fmd1216_tuner_init; - dev->dvb.frontend->ops.tuner_ops.sleep = philips_fmd1216_tuner_sleep; - dev->dvb.frontend->ops.tuner_ops.set_params = philips_fmd1216_tuner_set_params; - } break; case SAA7134_BOARD_PHILIPS_TOUGH: dev->dvb.frontend = tda10046_attach(&philips_tu1216_60_config, &dev->i2c_adap); - if (dev->dvb.frontend) { - dev->dvb.frontend->ops.tuner_ops.init = philips_tu1216_tuner_60_init; - dev->dvb.frontend->ops.tuner_ops.set_params = philips_tu1216_tuner_60_set_params; - } break; case SAA7134_BOARD_FLYDVBTDUO: dev->dvb.frontend = tda10046_attach(&tda827x_lifeview_config, &dev->i2c_adap); - if (dev->dvb.frontend) { - dev->dvb.frontend->ops.tuner_ops.init = philips_tda827x_tuner_init; - dev->dvb.frontend->ops.tuner_ops.sleep = philips_tda827x_tuner_sleep; - dev->dvb.frontend->ops.tuner_ops.set_params = philips_tda827x_tuner_set_params; - } break; case SAA7134_BOARD_FLYDVBT_DUO_CARDBUS: dev->dvb.frontend = tda10046_attach(&tda827x_lifeview_config, &dev->i2c_adap); - if (dev->dvb.frontend) { - dev->dvb.frontend->ops.tuner_ops.init = philips_tda827x_tuner_init; - dev->dvb.frontend->ops.tuner_ops.sleep = philips_tda827x_tuner_sleep; - dev->dvb.frontend->ops.tuner_ops.set_params = philips_tda827x_tuner_set_params; - } break; case SAA7134_BOARD_PHILIPS_EUROPA: dev->dvb.frontend = tda10046_attach(&philips_europa_config, &dev->i2c_adap); - if (dev->dvb.frontend) { - dev->original_demod_sleep = dev->dvb.frontend->ops.sleep; - dev->dvb.frontend->ops.sleep = philips_europa_demod_sleep; - dev->dvb.frontend->ops.tuner_ops.init = philips_europa_tuner_init; - dev->dvb.frontend->ops.tuner_ops.sleep = philips_europa_tuner_sleep; - dev->dvb.frontend->ops.tuner_ops.set_params = philips_td1316_tuner_set_params; - } break; case SAA7134_BOARD_VIDEOMATE_DVBT_300: dev->dvb.frontend = tda10046_attach(&philips_europa_config, &dev->i2c_adap); - if (dev->dvb.frontend) { - dev->dvb.frontend->ops.tuner_ops.init = philips_europa_tuner_init; - dev->dvb.frontend->ops.tuner_ops.sleep = philips_europa_tuner_sleep; - dev->dvb.frontend->ops.tuner_ops.set_params = philips_td1316_tuner_set_params; - } break; case SAA7134_BOARD_VIDEOMATE_DVBT_200: dev->dvb.frontend = tda10046_attach(&philips_tu1216_61_config, &dev->i2c_adap); - if (dev->dvb.frontend) { - dev->dvb.frontend->ops.tuner_ops.init = philips_tu1216_tuner_61_init; - dev->dvb.frontend->ops.tuner_ops.set_params = philips_tu1216_tuner_61_set_params; - } break; case SAA7134_BOARD_PHILIPS_TIGER: dev->dvb.frontend = tda10046_attach(&philips_tiger_config, &dev->i2c_adap); - if (dev->dvb.frontend) { - dev->dvb.frontend->ops.tuner_ops.init = philips_tiger_tuner_init; - dev->dvb.frontend->ops.tuner_ops.sleep = philips_tiger_tuner_sleep; - dev->dvb.frontend->ops.tuner_ops.set_params = philips_tiger_tuner_set_params; - } break; case SAA7134_BOARD_ASUSTeK_P7131_DUAL: dev->dvb.frontend = tda10046_attach(&philips_tiger_config, &dev->i2c_adap); - if (dev->dvb.frontend) { - dev->dvb.frontend->ops.tuner_ops.init = philips_tiger_tuner_init; - dev->dvb.frontend->ops.tuner_ops.sleep = philips_tiger_tuner_sleep; - dev->dvb.frontend->ops.tuner_ops.set_params = philips_tiger_tuner_set_params; - } break; case SAA7134_BOARD_FLYDVBT_LR301: dev->dvb.frontend = tda10046_attach(&tda827x_lifeview_config, &dev->i2c_adap); - if (dev->dvb.frontend) { - dev->dvb.frontend->ops.tuner_ops.init = philips_tda827x_tuner_init; - dev->dvb.frontend->ops.tuner_ops.sleep = philips_tda827x_tuner_sleep; - dev->dvb.frontend->ops.tuner_ops.set_params = philips_tda827x_tuner_set_params; - } - break; - case SAA7134_BOARD_FLYDVB_TRIO: - dev->dvb.frontend = tda10046_attach(&lifeview_trio_config, - &dev->i2c_adap); - if (dev->dvb.frontend) { - dev->dvb.frontend->ops.tuner_ops.sleep = lifeview_trio_tuner_sleep; - dev->dvb.frontend->ops.tuner_ops.set_params = lifeview_trio_tuner_set_params; - } break; case SAA7134_BOARD_ADS_DUO_CARDBUS_PTV331: dev->dvb.frontend = tda10046_attach(&ads_tech_duo_config, &dev->i2c_adap); - if (dev->dvb.frontend) { - dev->dvb.frontend->ops.tuner_ops.init = ads_duo_tuner_init; - dev->dvb.frontend->ops.tuner_ops.sleep = ads_duo_tuner_sleep; - dev->dvb.frontend->ops.tuner_ops.set_params = ads_duo_tuner_set_params; - } break; case SAA7134_BOARD_TEVION_DVBT_220RF: dev->dvb.frontend = tda10046_attach(&tevion_dvbt220rf_config, &dev->i2c_adap); - if (dev->dvb.frontend) { - dev->dvb.frontend->ops.tuner_ops.sleep = tevion_dvb220rf_tuner_sleep; - dev->dvb.frontend->ops.tuner_ops.set_params = tevion_dvb220rf_tuner_set_params; - } break; case SAA7134_BOARD_FLYDVBT_HYBRID_CARDBUS: dev->dvb.frontend = tda10046_attach(&ads_tech_duo_config, &dev->i2c_adap); - if (dev->dvb.frontend) { - dev->dvb.frontend->ops.tuner_ops.init = ads_duo_tuner_init; - dev->dvb.frontend->ops.tuner_ops.sleep = ads_duo_tuner_sleep; - dev->dvb.frontend->ops.tuner_ops.set_params = ads_duo_tuner_set_params; - } break; #endif #ifdef HAVE_NXT200X case SAA7134_BOARD_AVERMEDIA_AVERTVHD_A180: dev->dvb.frontend = nxt200x_attach(&avertvhda180, &dev->i2c_adap); - if (dev->dvb.frontend) { - dvb_pll_attach(dev->dvb.frontend, 0x61, NULL, &dvb_pll_tdhu2); - } break; case SAA7134_BOARD_KWORLD_ATSC110: dev->dvb.frontend = nxt200x_attach(&kworldatsc110, &dev->i2c_adap); - if (dev->dvb.frontend) { - dvb_pll_attach(dev->dvb.frontend, 0x61, NULL, &dvb_pll_tuv1236d); - } break; #endif default: @@ -1179,7 +1051,7 @@ static int dvb_init(struct saa7134_dev *dev) } /* register everything else */ - return videobuf_dvb_register(&dev->dvb, THIS_MODULE, dev, &dev->pci->dev); + return videobuf_dvb_register(&dev->dvb, THIS_MODULE, dev); } static int dvb_fini(struct saa7134_dev *dev) diff --git a/drivers/media/video/saa7134/saa7134-empress.c b/drivers/media/video/saa7134/saa7134-empress.c index 65d044086..bd4c389d4 100644 --- a/drivers/media/video/saa7134/saa7134-empress.c +++ b/drivers/media/video/saa7134/saa7134-empress.c @@ -64,10 +64,8 @@ static void ts_reset_encoder(struct saa7134_dev* dev) static int ts_init_encoder(struct saa7134_dev* dev) { - struct v4l2_ext_controls ctrls = { V4L2_CTRL_CLASS_MPEG, 0 }; - ts_reset_encoder(dev); - saa7134_i2c_call_clients(dev, VIDIOC_S_EXT_CTRLS, &ctrls); + saa7134_i2c_call_clients(dev, VIDIOC_S_MPEGCOMP, NULL); dev->empress_started = 1; return 0; } @@ -91,7 +89,7 @@ static int ts_open(struct inode *inode, struct file *file) dprintk("open minor=%d\n",minor); err = -EBUSY; - if (!mutex_trylock(&dev->empress_tsq.lock)) + if (down_trylock(&dev->empress_tsq.lock)) goto done; if (dev->empress_users) goto done_up; @@ -101,7 +99,7 @@ static int ts_open(struct inode *inode, struct file *file) err = 0; done_up: - mutex_unlock(&dev->empress_tsq.lock); + up(&dev->empress_tsq.lock); done: return err; } @@ -112,7 +110,7 @@ static int ts_release(struct inode *inode, struct file *file) if (dev->empress_tsq.streaming) videobuf_streamoff(&dev->empress_tsq); - mutex_lock(&dev->empress_tsq.lock); + down(&dev->empress_tsq.lock); if (dev->empress_tsq.reading) videobuf_read_stop(&dev->empress_tsq); videobuf_mmap_free(&dev->empress_tsq); @@ -121,7 +119,7 @@ static int ts_release(struct inode *inode, struct file *file) /* stop the encoder */ ts_reset_encoder(dev); - mutex_unlock(&dev->empress_tsq.lock); + up(&dev->empress_tsq.lock); return 0; } @@ -164,7 +162,6 @@ static int ts_do_ioctl(struct inode *inode, struct file *file, unsigned int cmd, void *arg) { struct saa7134_dev *dev = file->private_data; - struct v4l2_ext_controls *ctrls = arg; if (debug > 1) v4l_print_ioctl(dev->name,cmd); @@ -281,31 +278,12 @@ static int ts_do_ioctl(struct inode *inode, struct file *file, return saa7134_common_ioctl(dev, cmd, arg); case VIDIOC_S_MPEGCOMP: - printk(KERN_WARNING "VIDIOC_S_MPEGCOMP is obsolete. " - "Replace with VIDIOC_S_EXT_CTRLS!"); saa7134_i2c_call_clients(dev, VIDIOC_S_MPEGCOMP, arg); ts_init_encoder(dev); return 0; case VIDIOC_G_MPEGCOMP: - printk(KERN_WARNING "VIDIOC_G_MPEGCOMP is obsolete. " - "Replace with VIDIOC_G_EXT_CTRLS!"); saa7134_i2c_call_clients(dev, VIDIOC_G_MPEGCOMP, arg); return 0; - case VIDIOC_S_EXT_CTRLS: - /* count == 0 is abused in saa6752hs.c, so that special - case is handled here explicitly. */ - if (ctrls->count == 0) - return 0; - if (ctrls->ctrl_class != V4L2_CTRL_CLASS_MPEG) - return -EINVAL; - saa7134_i2c_call_clients(dev, VIDIOC_S_EXT_CTRLS, arg); - ts_init_encoder(dev); - return 0; - case VIDIOC_G_EXT_CTRLS: - if (ctrls->ctrl_class != V4L2_CTRL_CLASS_MPEG) - return -EINVAL; - saa7134_i2c_call_clients(dev, VIDIOC_G_EXT_CTRLS, arg); - return 0; default: return -ENOIOCTLCMD; diff --git a/drivers/media/video/saa7134/saa7134-input.c b/drivers/media/video/saa7134/saa7134-input.c index 7c595492c..d0acb56a8 100644 --- a/drivers/media/video/saa7134/saa7134-input.c +++ b/drivers/media/video/saa7134/saa7134-input.c @@ -37,15 +37,528 @@ static unsigned int ir_debug = 0; module_param(ir_debug, int, 0644); MODULE_PARM_DESC(ir_debug,"enable debug messages [IR]"); -static int pinnacle_remote = 0; -module_param(pinnacle_remote, int, 0644); /* Choose Pinnacle PCTV remote */ -MODULE_PARM_DESC(pinnacle_remote, "Specify Pinnacle PCTV remote: 0=coloured, 1=grey (defaults to 0)"); - #define dprintk(fmt, arg...) if (ir_debug) \ printk(KERN_DEBUG "%s/ir: " fmt, dev->name , ## arg) #define i2cdprintk(fmt, arg...) if (ir_debug) \ printk(KERN_DEBUG "%s/ir: " fmt, ir->c.name , ## arg) +/* ---------------------------------------------------------------------- */ + +static IR_KEYTAB_TYPE flyvideo_codes[IR_KEYTAB_SIZE] = { + [ 15 ] = KEY_KP0, + [ 3 ] = KEY_KP1, + [ 4 ] = KEY_KP2, + [ 5 ] = KEY_KP3, + [ 7 ] = KEY_KP4, + [ 8 ] = KEY_KP5, + [ 9 ] = KEY_KP6, + [ 11 ] = KEY_KP7, + [ 12 ] = KEY_KP8, + [ 13 ] = KEY_KP9, + + [ 14 ] = KEY_MODE, // Air/Cable + [ 17 ] = KEY_VIDEO, // Video + [ 21 ] = KEY_AUDIO, // Audio + [ 0 ] = KEY_POWER, // Power + [ 24 ] = KEY_TUNER, // AV Source + [ 2 ] = KEY_ZOOM, // Fullscreen + [ 26 ] = KEY_LANGUAGE, // Stereo + [ 27 ] = KEY_MUTE, // Mute + [ 20 ] = KEY_VOLUMEUP, // Volume + + [ 23 ] = KEY_VOLUMEDOWN, // Volume - + [ 18 ] = KEY_CHANNELUP, // Channel + + [ 19 ] = KEY_CHANNELDOWN, // Channel - + [ 6 ] = KEY_AGAIN, // Recall + [ 16 ] = KEY_ENTER, // Enter +}; + +static IR_KEYTAB_TYPE flydvb_codes[IR_KEYTAB_SIZE] = { + [ 0x01 ] = KEY_ZOOM, // Full Screen + [ 0x00 ] = KEY_POWER, // Power + + [ 0x03 ] = KEY_1, + [ 0x04 ] = KEY_2, + [ 0x05 ] = KEY_3, + [ 0x07 ] = KEY_4, + [ 0x08 ] = KEY_5, + [ 0x09 ] = KEY_6, + [ 0x0b ] = KEY_7, + [ 0x0c ] = KEY_8, + [ 0x0d ] = KEY_9, + [ 0x06 ] = KEY_AGAIN, // Recall + [ 0x0f ] = KEY_0, + [ 0x10 ] = KEY_MUTE, // Mute + [ 0x02 ] = KEY_RADIO, // TV/Radio + [ 0x1b ] = KEY_LANGUAGE, // SAP (Second Audio Program) + + [ 0x14 ] = KEY_VOLUMEUP, // VOL+ + [ 0x17 ] = KEY_VOLUMEDOWN, // VOL- + [ 0x12 ] = KEY_CHANNELUP, // CH+ + [ 0x13 ] = KEY_CHANNELDOWN, // CH- + [ 0x1d ] = KEY_ENTER, // Enter + + [ 0x1a ] = KEY_MODE, // PIP + [ 0x18 ] = KEY_TUNER, // Source + + [ 0x1e ] = KEY_RECORD, // Record/Pause + [ 0x15 ] = KEY_ANGLE, // Swap (no label on key) + [ 0x1c ] = KEY_PAUSE, // Timeshift/Pause + [ 0x19 ] = KEY_BACK, // Rewind << + [ 0x0a ] = KEY_PLAYPAUSE, // Play/Pause + [ 0x1f ] = KEY_FORWARD, // Forward >> + [ 0x16 ] = KEY_PREVIOUS, // Back |<< + [ 0x11 ] = KEY_STOP, // Stop + [ 0x0e ] = KEY_NEXT, // End >>| +}; + +static IR_KEYTAB_TYPE cinergy_codes[IR_KEYTAB_SIZE] = { + [ 0 ] = KEY_KP0, + [ 1 ] = KEY_KP1, + [ 2 ] = KEY_KP2, + [ 3 ] = KEY_KP3, + [ 4 ] = KEY_KP4, + [ 5 ] = KEY_KP5, + [ 6 ] = KEY_KP6, + [ 7 ] = KEY_KP7, + [ 8 ] = KEY_KP8, + [ 9 ] = KEY_KP9, + + [ 0x0a ] = KEY_POWER, + [ 0x0b ] = KEY_PROG1, // app + [ 0x0c ] = KEY_ZOOM, // zoom/fullscreen + [ 0x0d ] = KEY_CHANNELUP, // channel + [ 0x0e ] = KEY_CHANNELDOWN, // channel- + [ 0x0f ] = KEY_VOLUMEUP, + [ 0x10 ] = KEY_VOLUMEDOWN, + [ 0x11 ] = KEY_TUNER, // AV + [ 0x12 ] = KEY_NUMLOCK, // -/-- + [ 0x13 ] = KEY_AUDIO, // audio + [ 0x14 ] = KEY_MUTE, + [ 0x15 ] = KEY_UP, + [ 0x16 ] = KEY_DOWN, + [ 0x17 ] = KEY_LEFT, + [ 0x18 ] = KEY_RIGHT, + [ 0x19 ] = BTN_LEFT, + [ 0x1a ] = BTN_RIGHT, + [ 0x1b ] = KEY_WWW, // text + [ 0x1c ] = KEY_REWIND, + [ 0x1d ] = KEY_FORWARD, + [ 0x1e ] = KEY_RECORD, + [ 0x1f ] = KEY_PLAY, + [ 0x20 ] = KEY_PREVIOUSSONG, + [ 0x21 ] = KEY_NEXTSONG, + [ 0x22 ] = KEY_PAUSE, + [ 0x23 ] = KEY_STOP, +}; + +/* Alfons Geser + * updates from Job D. R. Borges */ +static IR_KEYTAB_TYPE eztv_codes[IR_KEYTAB_SIZE] = { + [ 18 ] = KEY_POWER, + [ 1 ] = KEY_TV, // DVR + [ 21 ] = KEY_DVD, // DVD + [ 23 ] = KEY_AUDIO, // music + // DVR mode / DVD mode / music mode + + [ 27 ] = KEY_MUTE, // mute + [ 2 ] = KEY_LANGUAGE, // MTS/SAP / audio / autoseek + [ 30 ] = KEY_SUBTITLE, // closed captioning / subtitle / seek + [ 22 ] = KEY_ZOOM, // full screen + [ 28 ] = KEY_VIDEO, // video source / eject / delall + [ 29 ] = KEY_RESTART, // playback / angle / del + [ 47 ] = KEY_SEARCH, // scan / menu / playlist + [ 48 ] = KEY_CHANNEL, // CH surfing / bookmark / memo + + [ 49 ] = KEY_HELP, // help + [ 50 ] = KEY_MODE, // num/memo + [ 51 ] = KEY_ESC, // cancel + + [ 12 ] = KEY_UP, // up + [ 16 ] = KEY_DOWN, // down + [ 8 ] = KEY_LEFT, // left + [ 4 ] = KEY_RIGHT, // right + [ 3 ] = KEY_SELECT, // select + + [ 31 ] = KEY_REWIND, // rewind + [ 32 ] = KEY_PLAYPAUSE, // play/pause + [ 41 ] = KEY_FORWARD, // forward + [ 20 ] = KEY_AGAIN, // repeat + [ 43 ] = KEY_RECORD, // recording + [ 44 ] = KEY_STOP, // stop + [ 45 ] = KEY_PLAY, // play + [ 46 ] = KEY_SHUFFLE, // snapshot / shuffle + + [ 0 ] = KEY_KP0, + [ 5 ] = KEY_KP1, + [ 6 ] = KEY_KP2, + [ 7 ] = KEY_KP3, + [ 9 ] = KEY_KP4, + [ 10 ] = KEY_KP5, + [ 11 ] = KEY_KP6, + [ 13 ] = KEY_KP7, + [ 14 ] = KEY_KP8, + [ 15 ] = KEY_KP9, + + [ 42 ] = KEY_VOLUMEUP, + [ 17 ] = KEY_VOLUMEDOWN, + [ 24 ] = KEY_CHANNELUP, // CH.tracking up + [ 25 ] = KEY_CHANNELDOWN, // CH.tracking down + + [ 19 ] = KEY_KPENTER, // enter + [ 33 ] = KEY_KPDOT, // . (decimal dot) +}; + +static IR_KEYTAB_TYPE avacssmart_codes[IR_KEYTAB_SIZE] = { + [ 30 ] = KEY_POWER, // power + [ 28 ] = KEY_SEARCH, // scan + [ 7 ] = KEY_SELECT, // source + + [ 22 ] = KEY_VOLUMEUP, + [ 20 ] = KEY_VOLUMEDOWN, + [ 31 ] = KEY_CHANNELUP, + [ 23 ] = KEY_CHANNELDOWN, + [ 24 ] = KEY_MUTE, + + [ 2 ] = KEY_KP0, + [ 1 ] = KEY_KP1, + [ 11 ] = KEY_KP2, + [ 27 ] = KEY_KP3, + [ 5 ] = KEY_KP4, + [ 9 ] = KEY_KP5, + [ 21 ] = KEY_KP6, + [ 6 ] = KEY_KP7, + [ 10 ] = KEY_KP8, + [ 18 ] = KEY_KP9, + [ 16 ] = KEY_KPDOT, + + [ 3 ] = KEY_TUNER, // tv/fm + [ 4 ] = KEY_REWIND, // fm tuning left or function left + [ 12 ] = KEY_FORWARD, // fm tuning right or function right + + [ 0 ] = KEY_RECORD, + [ 8 ] = KEY_STOP, + [ 17 ] = KEY_PLAY, + + [ 25 ] = KEY_ZOOM, + [ 14 ] = KEY_MENU, // function + [ 19 ] = KEY_AGAIN, // recall + [ 29 ] = KEY_RESTART, // reset + [ 26 ] = KEY_SHUFFLE, // snapshot/shuffle + +// FIXME + [ 13 ] = KEY_F21, // mts + [ 15 ] = KEY_F22, // min +}; + +/* Alex Hermann */ +static IR_KEYTAB_TYPE md2819_codes[IR_KEYTAB_SIZE] = { + [ 40 ] = KEY_KP1, + [ 24 ] = KEY_KP2, + [ 56 ] = KEY_KP3, + [ 36 ] = KEY_KP4, + [ 20 ] = KEY_KP5, + [ 52 ] = KEY_KP6, + [ 44 ] = KEY_KP7, + [ 28 ] = KEY_KP8, + [ 60 ] = KEY_KP9, + [ 34 ] = KEY_KP0, + + [ 32 ] = KEY_TV, // TV/FM + [ 16 ] = KEY_CD, // CD + [ 48 ] = KEY_TEXT, // TELETEXT + [ 0 ] = KEY_POWER, // POWER + + [ 8 ] = KEY_VIDEO, // VIDEO + [ 4 ] = KEY_AUDIO, // AUDIO + [ 12 ] = KEY_ZOOM, // FULL SCREEN + + [ 18 ] = KEY_SUBTITLE, // DISPLAY - ??? + [ 50 ] = KEY_REWIND, // LOOP - ??? + [ 2 ] = KEY_PRINT, // PREVIEW - ??? + + [ 42 ] = KEY_SEARCH, // AUTOSCAN + [ 26 ] = KEY_SLEEP, // FREEZE - ??? + [ 58 ] = KEY_SHUFFLE, // SNAPSHOT - ??? + [ 10 ] = KEY_MUTE, // MUTE + + [ 38 ] = KEY_RECORD, // RECORD + [ 22 ] = KEY_PAUSE, // PAUSE + [ 54 ] = KEY_STOP, // STOP + [ 6 ] = KEY_PLAY, // PLAY + + [ 46 ] = KEY_RED, // + [ 33 ] = KEY_GREEN, // + [ 14 ] = KEY_YELLOW, // + [ 1 ] = KEY_BLUE, // + + [ 30 ] = KEY_VOLUMEDOWN, // VOLUME- + [ 62 ] = KEY_VOLUMEUP, // VOLUME+ + [ 17 ] = KEY_CHANNELDOWN, // CHANNEL/PAGE- + [ 49 ] = KEY_CHANNELUP // CHANNEL/PAGE+ +}; + +static IR_KEYTAB_TYPE videomate_tv_pvr_codes[IR_KEYTAB_SIZE] = { + [ 20 ] = KEY_MUTE, + [ 36 ] = KEY_ZOOM, + + [ 1 ] = KEY_DVD, + [ 35 ] = KEY_RADIO, + [ 0 ] = KEY_TV, + + [ 10 ] = KEY_REWIND, + [ 8 ] = KEY_PLAYPAUSE, + [ 15 ] = KEY_FORWARD, + + [ 2 ] = KEY_PREVIOUS, + [ 7 ] = KEY_STOP, + [ 6 ] = KEY_NEXT, + + [ 12 ] = KEY_UP, + [ 14 ] = KEY_DOWN, + [ 11 ] = KEY_LEFT, + [ 13 ] = KEY_RIGHT, + [ 17 ] = KEY_OK, + + [ 3 ] = KEY_MENU, + [ 9 ] = KEY_SETUP, + [ 5 ] = KEY_VIDEO, + [ 34 ] = KEY_CHANNEL, + + [ 18 ] = KEY_VOLUMEUP, + [ 21 ] = KEY_VOLUMEDOWN, + [ 16 ] = KEY_CHANNELUP, + [ 19 ] = KEY_CHANNELDOWN, + + [ 4 ] = KEY_RECORD, + + [ 22 ] = KEY_KP1, + [ 23 ] = KEY_KP2, + [ 24 ] = KEY_KP3, + [ 25 ] = KEY_KP4, + [ 26 ] = KEY_KP5, + [ 27 ] = KEY_KP6, + [ 28 ] = KEY_KP7, + [ 29 ] = KEY_KP8, + [ 30 ] = KEY_KP9, + [ 31 ] = KEY_KP0, + + [ 32 ] = KEY_LANGUAGE, + [ 33 ] = KEY_SLEEP, +}; + +/* Michael Tokarev + http://www.corpit.ru/mjt/beholdTV/remote_control.jpg + keytable is used by MANLI MTV00[12] and BeholdTV 40[13] at + least, and probably other cards too. + The "ascii-art picture" below (in comments, first row + is the keycode in hex, and subsequent row(s) shows + the button labels (several variants when appropriate) + helps to descide which keycodes to assign to the buttons. + */ +static IR_KEYTAB_TYPE manli_codes[IR_KEYTAB_SIZE] = { + + /* 0x1c 0x12 * + * FUNCTION POWER * + * FM (|) * + * */ + [ 0x1c ] = KEY_RADIO, /*XXX*/ + [ 0x12 ] = KEY_POWER, + + /* 0x01 0x02 0x03 * + * 1 2 3 * + * * + * 0x04 0x05 0x06 * + * 4 5 6 * + * * + * 0x07 0x08 0x09 * + * 7 8 9 * + * */ + [ 0x01 ] = KEY_KP1, + [ 0x02 ] = KEY_KP2, + [ 0x03 ] = KEY_KP3, + [ 0x04 ] = KEY_KP4, + [ 0x05 ] = KEY_KP5, + [ 0x06 ] = KEY_KP6, + [ 0x07 ] = KEY_KP7, + [ 0x08 ] = KEY_KP8, + [ 0x09 ] = KEY_KP9, + + /* 0x0a 0x00 0x17 * + * RECALL 0 +100 * + * PLUS * + * */ + [ 0x0a ] = KEY_AGAIN, /*XXX KEY_REWIND? */ + [ 0x00 ] = KEY_KP0, + [ 0x17 ] = KEY_DIGITS, /*XXX*/ + + /* 0x14 0x10 * + * MENU INFO * + * OSD */ + [ 0x14 ] = KEY_MENU, + [ 0x10 ] = KEY_INFO, + + /* 0x0b * + * Up * + * * + * 0x18 0x16 0x0c * + * Left Ok Right * + * * + * 0x015 * + * Down * + * */ + [ 0x0b ] = KEY_UP, /*XXX KEY_SCROLLUP? */ + [ 0x18 ] = KEY_LEFT, /*XXX KEY_BACK? */ + [ 0x16 ] = KEY_OK, /*XXX KEY_SELECT? KEY_ENTER? */ + [ 0x0c ] = KEY_RIGHT, /*XXX KEY_FORWARD? */ + [ 0x15 ] = KEY_DOWN, /*XXX KEY_SCROLLDOWN? */ + + /* 0x11 0x0d * + * TV/AV MODE * + * SOURCE STEREO * + * */ + [ 0x11 ] = KEY_TV, /*XXX*/ + [ 0x0d ] = KEY_MODE, /*XXX there's no KEY_STEREO */ + + /* 0x0f 0x1b 0x1a * + * AUDIO Vol+ Chan+ * + * TIMESHIFT??? * + * * + * 0x0e 0x1f 0x1e * + * SLEEP Vol- Chan- * + * */ + [ 0x0f ] = KEY_AUDIO, + [ 0x1b ] = KEY_VOLUMEUP, + [ 0x1a ] = KEY_CHANNELUP, + [ 0x0e ] = KEY_SLEEP, /*XXX maybe KEY_PAUSE */ + [ 0x1f ] = KEY_VOLUMEDOWN, + [ 0x1e ] = KEY_CHANNELDOWN, + + /* 0x13 0x19 * + * MUTE SNAPSHOT* + * */ + [ 0x13 ] = KEY_MUTE, + [ 0x19 ] = KEY_RECORD, /*XXX*/ + + // 0x1d unused ? +}; + + +/* Mike Baikov */ +static IR_KEYTAB_TYPE gotview7135_codes[IR_KEYTAB_SIZE] = { + + [ 33 ] = KEY_POWER, + [ 105] = KEY_TV, + [ 51 ] = KEY_KP0, + [ 81 ] = KEY_KP1, + [ 49 ] = KEY_KP2, + [ 113] = KEY_KP3, + [ 59 ] = KEY_KP4, + [ 88 ] = KEY_KP5, + [ 65 ] = KEY_KP6, + [ 72 ] = KEY_KP7, + [ 48 ] = KEY_KP8, + [ 83 ] = KEY_KP9, + [ 115] = KEY_AGAIN, /* LOOP */ + [ 10 ] = KEY_AUDIO, + [ 97 ] = KEY_PRINT, /* PREVIEW */ + [ 122] = KEY_VIDEO, + [ 32 ] = KEY_CHANNELUP, + [ 64 ] = KEY_CHANNELDOWN, + [ 24 ] = KEY_VOLUMEDOWN, + [ 80 ] = KEY_VOLUMEUP, + [ 16 ] = KEY_MUTE, + [ 74 ] = KEY_SEARCH, + [ 123] = KEY_SHUFFLE, /* SNAPSHOT */ + [ 34 ] = KEY_RECORD, + [ 98 ] = KEY_STOP, + [ 120] = KEY_PLAY, + [ 57 ] = KEY_REWIND, + [ 89 ] = KEY_PAUSE, + [ 25 ] = KEY_FORWARD, + [ 9 ] = KEY_ZOOM, + + [ 82 ] = KEY_F21, /* LIVE TIMESHIFT */ + [ 26 ] = KEY_F22, /* MIN TIMESHIFT */ + [ 58 ] = KEY_F23, /* TIMESHIFT */ + [ 112] = KEY_F24, /* NORMAL TIMESHIFT */ +}; + +static IR_KEYTAB_TYPE ir_codes_purpletv[IR_KEYTAB_SIZE] = { + [ 0x3 ] = KEY_POWER, + [ 0x6f ] = KEY_MUTE, + [ 0x10 ] = KEY_BACKSPACE, /* Recall */ + + [ 0x11 ] = KEY_KP0, + [ 0x4 ] = KEY_KP1, + [ 0x5 ] = KEY_KP2, + [ 0x6 ] = KEY_KP3, + [ 0x8 ] = KEY_KP4, + [ 0x9 ] = KEY_KP5, + [ 0xa ] = KEY_KP6, + [ 0xc ] = KEY_KP7, + [ 0xd ] = KEY_KP8, + [ 0xe ] = KEY_KP9, + [ 0x12 ] = KEY_KPDOT, /* 100+ */ + + [ 0x7 ] = KEY_VOLUMEUP, + [ 0xb ] = KEY_VOLUMEDOWN, + [ 0x1a ] = KEY_KPPLUS, + [ 0x18 ] = KEY_KPMINUS, + [ 0x15 ] = KEY_UP, + [ 0x1d ] = KEY_DOWN, + [ 0xf ] = KEY_CHANNELUP, + [ 0x13 ] = KEY_CHANNELDOWN, + [ 0x48 ] = KEY_ZOOM, + + [ 0x1b ] = KEY_VIDEO, /* Video source */ + [ 0x49 ] = KEY_LANGUAGE, /* MTS Select */ + [ 0x19 ] = KEY_SEARCH, /* Auto Scan */ + + [ 0x4b ] = KEY_RECORD, + [ 0x46 ] = KEY_PLAY, + [ 0x45 ] = KEY_PAUSE, /* Pause */ + [ 0x44 ] = KEY_STOP, + [ 0x40 ] = KEY_FORWARD, /* Forward ? */ + [ 0x42 ] = KEY_REWIND, /* Backward ? */ + +}; + +/* Mapping for the 28 key remote control as seen at + http://www.sednacomputer.com/photo/cardbus-tv.jpg + Pavel Mihaylov */ +static IR_KEYTAB_TYPE pctv_sedna_codes[IR_KEYTAB_SIZE] = { + [ 0 ] = KEY_KP0, + [ 1 ] = KEY_KP1, + [ 2 ] = KEY_KP2, + [ 3 ] = KEY_KP3, + [ 4 ] = KEY_KP4, + [ 5 ] = KEY_KP5, + [ 6 ] = KEY_KP6, + [ 7 ] = KEY_KP7, + [ 8 ] = KEY_KP8, + [ 9 ] = KEY_KP9, + + [ 0x0a ] = KEY_AGAIN, /* Recall */ + [ 0x0b ] = KEY_CHANNELUP, + [ 0x0c ] = KEY_VOLUMEUP, + [ 0x0d ] = KEY_MODE, /* Stereo */ + [ 0x0e ] = KEY_STOP, + [ 0x0f ] = KEY_PREVIOUSSONG, + [ 0x10 ] = KEY_ZOOM, + [ 0x11 ] = KEY_TUNER, /* Source */ + [ 0x12 ] = KEY_POWER, + [ 0x13 ] = KEY_MUTE, + [ 0x15 ] = KEY_CHANNELDOWN, + [ 0x18 ] = KEY_VOLUMEDOWN, + [ 0x19 ] = KEY_SHUFFLE, /* Snapshot */ + [ 0x1a ] = KEY_NEXTSONG, + [ 0x1b ] = KEY_TEXT, /* Time Shift */ + [ 0x1c ] = KEY_RADIO, /* FM Radio */ + [ 0x1d ] = KEY_RECORD, + [ 0x1e ] = KEY_PAUSE, +}; + + /* -------------------- GPIO generic keycode builder -------------------- */ static int build_key(struct saa7134_dev *dev) @@ -153,27 +666,27 @@ int saa7134_input_init1(struct saa7134_dev *dev) case SAA7134_BOARD_FLYVIDEO3000: case SAA7134_BOARD_FLYTVPLATINUM_FM: case SAA7134_BOARD_FLYTVPLATINUM_MINI2: - ir_codes = ir_codes_flyvideo; + ir_codes = flyvideo_codes; mask_keycode = 0xEC00000; mask_keydown = 0x0040000; break; case SAA7134_BOARD_CINERGY400: case SAA7134_BOARD_CINERGY600: case SAA7134_BOARD_CINERGY600_MK3: - ir_codes = ir_codes_cinergy; + ir_codes = cinergy_codes; mask_keycode = 0x00003f; mask_keyup = 0x040000; break; case SAA7134_BOARD_ECS_TVP3XP: case SAA7134_BOARD_ECS_TVP3XP_4CB5: - ir_codes = ir_codes_eztv; + ir_codes = eztv_codes; mask_keycode = 0x00017c; mask_keyup = 0x000002; polling = 50; // ms break; case SAA7134_BOARD_KWORLD_XPERT: case SAA7134_BOARD_AVACSSMARTTV: - ir_codes = ir_codes_pixelview; + ir_codes = avacssmart_codes; mask_keycode = 0x00001F; mask_keyup = 0x000020; polling = 50; // ms @@ -185,7 +698,7 @@ int saa7134_input_init1(struct saa7134_dev *dev) case SAA7134_BOARD_AVERMEDIA_STUDIO_305: case SAA7134_BOARD_AVERMEDIA_STUDIO_307: case SAA7134_BOARD_AVERMEDIA_GO_007_FM: - ir_codes = ir_codes_avermedia; + ir_codes = md2819_codes; mask_keycode = 0x0007C8; mask_keydown = 0x000010; polling = 50; // ms @@ -194,7 +707,7 @@ int saa7134_input_init1(struct saa7134_dev *dev) saa_setb(SAA7134_GPIO_GPSTATUS0, 0x4); break; case SAA7134_BOARD_KWORLD_TERMINATOR: - ir_codes = ir_codes_pixelview; + ir_codes = avacssmart_codes; mask_keycode = 0x00001f; mask_keyup = 0x000060; polling = 50; // ms @@ -202,19 +715,19 @@ int saa7134_input_init1(struct saa7134_dev *dev) case SAA7134_BOARD_MANLI_MTV001: case SAA7134_BOARD_MANLI_MTV002: case SAA7134_BOARD_BEHOLD_409FM: - ir_codes = ir_codes_manli; + ir_codes = manli_codes; mask_keycode = 0x001f00; mask_keyup = 0x004000; polling = 50; // ms break; case SAA7134_BOARD_SEDNA_PC_TV_CARDBUS: - ir_codes = ir_codes_pctv_sedna; + ir_codes = pctv_sedna_codes; mask_keycode = 0x001f00; mask_keyup = 0x004000; polling = 50; // ms break; case SAA7134_BOARD_GOTVIEW_7135: - ir_codes = ir_codes_gotview7135; + ir_codes = gotview7135_codes; mask_keycode = 0x0003EC; mask_keyup = 0x008000; mask_keydown = 0x000010; @@ -223,20 +736,19 @@ int saa7134_input_init1(struct saa7134_dev *dev) case SAA7134_BOARD_VIDEOMATE_TV_PVR: case SAA7134_BOARD_VIDEOMATE_GOLD_PLUS: case SAA7134_BOARD_VIDEOMATE_TV_GOLD_PLUSII: - ir_codes = ir_codes_videomate_tv_pvr; + ir_codes = videomate_tv_pvr_codes; mask_keycode = 0x00003F; mask_keyup = 0x400000; polling = 50; // ms break; case SAA7134_BOARD_VIDEOMATE_DVBT_300: case SAA7134_BOARD_VIDEOMATE_DVBT_200: - ir_codes = ir_codes_videomate_tv_pvr; + ir_codes = videomate_tv_pvr_codes; mask_keycode = 0x003F00; mask_keyup = 0x040000; break; case SAA7134_BOARD_FLYDVBT_LR301: - case SAA7134_BOARD_FLYDVBTDUO: - ir_codes = ir_codes_flydvb; + ir_codes = flydvb_codes; mask_keycode = 0x0001F00; mask_keydown = 0x0040000; break; @@ -320,13 +832,8 @@ void saa7134_set_i2c_ir(struct saa7134_dev *dev, struct IR_i2c *ir) switch (dev->board) { case SAA7134_BOARD_PINNACLE_PCTV_110i: snprintf(ir->c.name, sizeof(ir->c.name), "Pinnacle PCTV"); - if (pinnacle_remote == 0) { - ir->get_key = get_key_pinnacle_color; - ir->ir_codes = ir_codes_pinnacle_color; - } else { - ir->get_key = get_key_pinnacle_grey; - ir->ir_codes = ir_codes_pinnacle_grey; - } + ir->get_key = get_key_pinnacle; + ir->ir_codes = ir_codes_pinnacle; break; case SAA7134_BOARD_UPMOST_PURPLE_TV: snprintf(ir->c.name, sizeof(ir->c.name), "Purple TV"); diff --git a/drivers/media/video/saa7134/saa7134-oss.c b/drivers/media/video/saa7134/saa7134-oss.c index 2e3ba5f31..9a1529817 100644 --- a/drivers/media/video/saa7134/saa7134-oss.c +++ b/drivers/media/video/saa7134/saa7134-oss.c @@ -84,7 +84,8 @@ static int dsp_buffer_init(struct saa7134_dev *dev) { int err; - BUG_ON(!dev->dmasound.bufsize); + if (!dev->dmasound.bufsize) + BUG(); videobuf_dma_init(&dev->dmasound.dma); err = videobuf_dma_init_kernel(&dev->dmasound.dma, PCI_DMA_FROMDEVICE, (dev->dmasound.bufsize + PAGE_SIZE) >> PAGE_SHIFT); @@ -95,7 +96,8 @@ static int dsp_buffer_init(struct saa7134_dev *dev) static int dsp_buffer_free(struct saa7134_dev *dev) { - BUG_ON(!dev->dmasound.blksize); + if (!dev->dmasound.blksize) + BUG(); videobuf_dma_free(&dev->dmasound.dma); dev->dmasound.blocks = 0; dev->dmasound.blksize = 0; @@ -124,7 +126,7 @@ static int dsp_rec_start(struct saa7134_dev *dev) unsigned long flags; /* prepare buffer */ - if (0 != (err = videobuf_pci_dma_map(dev->pci,&dev->dmasound.dma))) + if (0 != (err = videobuf_dma_pci_map(dev->pci,&dev->dmasound.dma))) return err; if (0 != (err = saa7134_pgtable_alloc(dev->pci,&dev->dmasound.pt))) goto fail1; @@ -213,7 +215,7 @@ static int dsp_rec_start(struct saa7134_dev *dev) fail2: saa7134_pgtable_free(dev->pci,&dev->dmasound.pt); fail1: - videobuf_pci_dma_unmap(dev->pci,&dev->dmasound.dma); + videobuf_dma_pci_unmap(dev->pci,&dev->dmasound.dma); return err; } @@ -231,7 +233,7 @@ static int dsp_rec_stop(struct saa7134_dev *dev) /* unlock buffer */ saa7134_pgtable_free(dev->pci,&dev->dmasound.pt); - videobuf_pci_dma_unmap(dev->pci,&dev->dmasound.dma); + videobuf_dma_pci_unmap(dev->pci,&dev->dmasound.dma); return 0; } @@ -252,7 +254,7 @@ static int dsp_open(struct inode *inode, struct file *file) if (NULL == dev) return -ENODEV; - mutex_lock(&dev->dmasound.lock); + down(&dev->dmasound.lock); err = -EBUSY; if (dev->dmasound.users_dsp) goto fail1; @@ -268,13 +270,13 @@ static int dsp_open(struct inode *inode, struct file *file) if (0 != err) goto fail2; - mutex_unlock(&dev->dmasound.lock); + up(&dev->dmasound.lock); return 0; fail2: dev->dmasound.users_dsp--; fail1: - mutex_unlock(&dev->dmasound.lock); + up(&dev->dmasound.lock); return err; } @@ -282,13 +284,13 @@ static int dsp_release(struct inode *inode, struct file *file) { struct saa7134_dev *dev = file->private_data; - mutex_lock(&dev->dmasound.lock); + down(&dev->dmasound.lock); if (dev->dmasound.recording_on) dsp_rec_stop(dev); dsp_buffer_free(dev); dev->dmasound.users_dsp--; file->private_data = NULL; - mutex_unlock(&dev->dmasound.lock); + up(&dev->dmasound.lock); return 0; } @@ -302,7 +304,7 @@ static ssize_t dsp_read(struct file *file, char __user *buffer, int err,ret = 0; add_wait_queue(&dev->dmasound.wq, &wait); - mutex_lock(&dev->dmasound.lock); + down(&dev->dmasound.lock); while (count > 0) { /* wait for data if needed */ if (0 == dev->dmasound.read_count) { @@ -326,12 +328,12 @@ static ssize_t dsp_read(struct file *file, char __user *buffer, ret = -EAGAIN; break; } - mutex_unlock(&dev->dmasound.lock); + up(&dev->dmasound.lock); set_current_state(TASK_INTERRUPTIBLE); if (0 == dev->dmasound.read_count) schedule(); set_current_state(TASK_RUNNING); - mutex_lock(&dev->dmasound.lock); + down(&dev->dmasound.lock); if (signal_pending(current)) { if (0 == ret) ret = -EINTR; @@ -360,7 +362,7 @@ static ssize_t dsp_read(struct file *file, char __user *buffer, if (dev->dmasound.read_offset == dev->dmasound.bufsize) dev->dmasound.read_offset = 0; } - mutex_unlock(&dev->dmasound.lock); + up(&dev->dmasound.lock); remove_wait_queue(&dev->dmasound.wq, &wait); return ret; } @@ -433,13 +435,13 @@ static int dsp_ioctl(struct inode *inode, struct file *file, case SNDCTL_DSP_STEREO: if (get_user(val, p)) return -EFAULT; - mutex_lock(&dev->dmasound.lock); + down(&dev->dmasound.lock); dev->dmasound.channels = val ? 2 : 1; if (dev->dmasound.recording_on) { dsp_rec_stop(dev); dsp_rec_start(dev); } - mutex_unlock(&dev->dmasound.lock); + up(&dev->dmasound.lock); return put_user(dev->dmasound.channels-1, p); case SNDCTL_DSP_CHANNELS: @@ -447,13 +449,13 @@ static int dsp_ioctl(struct inode *inode, struct file *file, return -EFAULT; if (val != 1 && val != 2) return -EINVAL; - mutex_lock(&dev->dmasound.lock); + down(&dev->dmasound.lock); dev->dmasound.channels = val; if (dev->dmasound.recording_on) { dsp_rec_stop(dev); dsp_rec_start(dev); } - mutex_unlock(&dev->dmasound.lock); + up(&dev->dmasound.lock); /* fall through */ case SOUND_PCM_READ_CHANNELS: return put_user(dev->dmasound.channels, p); @@ -476,13 +478,13 @@ static int dsp_ioctl(struct inode *inode, struct file *file, case AFMT_U16_BE: case AFMT_S16_LE: case AFMT_S16_BE: - mutex_lock(&dev->dmasound.lock); + down(&dev->dmasound.lock); dev->dmasound.afmt = val; if (dev->dmasound.recording_on) { dsp_rec_stop(dev); dsp_rec_start(dev); } - mutex_unlock(&dev->dmasound.lock); + up(&dev->dmasound.lock); return put_user(dev->dmasound.afmt, p); default: return -EINVAL; @@ -507,10 +509,10 @@ static int dsp_ioctl(struct inode *inode, struct file *file, return 0; case SNDCTL_DSP_RESET: - mutex_lock(&dev->dmasound.lock); + down(&dev->dmasound.lock); if (dev->dmasound.recording_on) dsp_rec_stop(dev); - mutex_unlock(&dev->dmasound.lock); + up(&dev->dmasound.lock); return 0; case SNDCTL_DSP_GETBLKSIZE: return put_user(dev->dmasound.blksize, p); @@ -554,10 +556,10 @@ static unsigned int dsp_poll(struct file *file, struct poll_table_struct *wait) poll_wait(file, &dev->dmasound.wq, wait); if (0 == dev->dmasound.read_count) { - mutex_lock(&dev->dmasound.lock); + down(&dev->dmasound.lock); if (!dev->dmasound.recording_on) dsp_rec_start(dev); - mutex_unlock(&dev->dmasound.lock); + up(&dev->dmasound.lock); } else mask |= (POLLIN | POLLRDNORM); return mask; @@ -845,12 +847,12 @@ int saa7134_oss_init1(struct saa7134_dev *dev) { if ((request_irq(dev->pci->irq, saa7134_oss_irq, - IRQF_SHARED | IRQF_DISABLED, dev->name, + SA_SHIRQ | SA_INTERRUPT, dev->name, (void*) &dev->dmasound)) < 0) return -1; /* general */ - mutex_init(&dev->dmasound.lock); + init_MUTEX(&dev->dmasound.lock); init_waitqueue_head(&dev->dmasound.wq); switch (dev->pci->device) { diff --git a/drivers/media/video/saa7134/saa7134-ts.c b/drivers/media/video/saa7134/saa7134-ts.c index 60a90a261..470903e2f 100644 --- a/drivers/media/video/saa7134/saa7134-ts.c +++ b/drivers/media/video/saa7134/saa7134-ts.c @@ -89,7 +89,7 @@ static int buffer_prepare(struct videobuf_queue *q, struct videobuf_buffer *vb, return -EINVAL; if (buf->vb.size != size) { - saa7134_dma_free(q,buf); + saa7134_dma_free(dev,buf); } if (STATE_NEEDS_INIT == buf->vb.state) { @@ -98,7 +98,7 @@ static int buffer_prepare(struct videobuf_queue *q, struct videobuf_buffer *vb, buf->vb.size = size; buf->pt = &dev->ts.pt_ts; - err = videobuf_iolock(q,&buf->vb,NULL); + err = videobuf_iolock(dev->pci,&buf->vb,NULL); if (err) goto oops; err = saa7134_pgtable_build(dev->pci,buf->pt, @@ -126,7 +126,7 @@ static int buffer_prepare(struct videobuf_queue *q, struct videobuf_buffer *vb, return 0; oops: - saa7134_dma_free(q,buf); + saa7134_dma_free(dev,buf); return err; } @@ -152,9 +152,10 @@ static void buffer_queue(struct videobuf_queue *q, struct videobuf_buffer *vb) static void buffer_release(struct videobuf_queue *q, struct videobuf_buffer *vb) { + struct saa7134_dev *dev = q->priv_data; struct saa7134_buf *buf = container_of(vb,struct saa7134_buf,vb); - saa7134_dma_free(q,buf); + saa7134_dma_free(dev,buf); } struct videobuf_queue_ops saa7134_ts_qops = { diff --git a/drivers/media/video/saa7134/saa7134-tvaudio.c b/drivers/media/video/saa7134/saa7134-tvaudio.c index 0db53d192..afa4dcb3f 100644 --- a/drivers/media/video/saa7134/saa7134-tvaudio.c +++ b/drivers/media/video/saa7134/saa7134-tvaudio.c @@ -139,12 +139,6 @@ static struct saa7134_tvaudio tvaudio[] = { .carr1 = 6500, .carr2 = 5850, .mode = TVAUDIO_NICAM_AM, - },{ - .name = "SECAM-L MONO", - .std = V4L2_STD_SECAM, - .carr1 = 6500, - .carr2 = -1, - .mode = TVAUDIO_AM_MONO, },{ .name = "SECAM-D/K", .std = V4L2_STD_SECAM, @@ -340,12 +334,6 @@ static void tvaudio_setmode(struct saa7134_dev *dev, saa_writeb(SAA7134_STEREO_DAC_OUTPUT_SELECT, 0xa1); saa_writeb(SAA7134_NICAM_CONFIG, 0x00); break; - case TVAUDIO_AM_MONO: - saa_writeb(SAA7134_DEMODULATOR, 0x12); - saa_writeb(SAA7134_DCXO_IDENT_CTRL, 0x00); - saa_writeb(SAA7134_FM_DEEMPHASIS, 0x44); - saa_writeb(SAA7134_STEREO_DAC_OUTPUT_SELECT, 0xa0); - break; case TVAUDIO_FM_SAT_STEREO: /* not implemented (yet) */ break; @@ -426,7 +414,6 @@ static int tvaudio_getstereo(struct saa7134_dev *dev, struct saa7134_tvaudio *au switch (audio->mode) { case TVAUDIO_FM_MONO: - case TVAUDIO_AM_MONO: return V4L2_TUNER_SUB_MONO; case TVAUDIO_FM_K_STEREO: case TVAUDIO_FM_BG_STEREO: @@ -482,20 +469,17 @@ static int tvaudio_setstereo(struct saa7134_dev *dev, struct saa7134_tvaudio *au [ V4L2_TUNER_MODE_STEREO ] = "stereo", [ V4L2_TUNER_MODE_LANG1 ] = "lang1", [ V4L2_TUNER_MODE_LANG2 ] = "lang2", - [ V4L2_TUNER_MODE_LANG1_LANG2 ] = "lang1+lang2", }; static u32 fm[] = { [ V4L2_TUNER_MODE_MONO ] = 0x00, /* ch1 */ [ V4L2_TUNER_MODE_STEREO ] = 0x80, /* auto */ [ V4L2_TUNER_MODE_LANG1 ] = 0x00, /* ch1 */ [ V4L2_TUNER_MODE_LANG2 ] = 0x01, /* ch2 */ - [ V4L2_TUNER_MODE_LANG1_LANG2 ] = 0x80, /* auto */ }; u32 reg; switch (audio->mode) { case TVAUDIO_FM_MONO: - case TVAUDIO_AM_MONO: /* nothing to do ... */ break; case TVAUDIO_FM_K_STEREO: diff --git a/drivers/media/video/saa7134/saa7134-vbi.c b/drivers/media/video/saa7134/saa7134-vbi.c index f38366a47..f4aee0af8 100644 --- a/drivers/media/video/saa7134/saa7134-vbi.c +++ b/drivers/media/video/saa7134/saa7134-vbi.c @@ -135,7 +135,7 @@ static int buffer_prepare(struct videobuf_queue *q, return -EINVAL; if (buf->vb.size != size) - saa7134_dma_free(q,buf); + saa7134_dma_free(dev,buf); if (STATE_NEEDS_INIT == buf->vb.state) { buf->vb.width = llength; @@ -143,7 +143,7 @@ static int buffer_prepare(struct videobuf_queue *q, buf->vb.size = size; buf->pt = &fh->pt_vbi; - err = videobuf_iolock(q,&buf->vb,NULL); + err = videobuf_iolock(dev->pci,&buf->vb,NULL); if (err) goto oops; err = saa7134_pgtable_build(dev->pci,buf->pt, @@ -159,7 +159,7 @@ static int buffer_prepare(struct videobuf_queue *q, return 0; oops: - saa7134_dma_free(q,buf); + saa7134_dma_free(dev,buf); return err; } @@ -190,9 +190,11 @@ static void buffer_queue(struct videobuf_queue *q, struct videobuf_buffer *vb) static void buffer_release(struct videobuf_queue *q, struct videobuf_buffer *vb) { + struct saa7134_fh *fh = q->priv_data; + struct saa7134_dev *dev = fh->dev; struct saa7134_buf *buf = container_of(vb,struct saa7134_buf,vb); - saa7134_dma_free(q,buf); + saa7134_dma_free(dev,buf); } struct videobuf_queue_ops saa7134_vbi_qops = { diff --git a/drivers/media/video/saa7134/saa7134-video.c b/drivers/media/video/saa7134/saa7134-video.c index 2c171af9a..e97426bc8 100644 --- a/drivers/media/video/saa7134/saa7134-video.c +++ b/drivers/media/video/saa7134/saa7134-video.c @@ -31,16 +31,14 @@ #include "saa7134.h" #include -#ifdef CONFIG_VIDEO_V4L1_COMPAT /* Include V4L1 specific functions. Should be removed soon */ #include -#endif /* ------------------------------------------------------------------ */ static unsigned int video_debug = 0; static unsigned int gbuffers = 8; -static unsigned int noninterlaced = 1; +static unsigned int noninterlaced = 0; static unsigned int gbufsize = 720*576*4; static unsigned int gbufsize_max = 720*576*4; module_param(video_debug, int, 0644); @@ -48,7 +46,7 @@ MODULE_PARM_DESC(video_debug,"enable debug messages [video]"); module_param(gbuffers, int, 0444); MODULE_PARM_DESC(gbuffers,"number of capture buffers, range 2-32"); module_param(noninterlaced, int, 0644); -MODULE_PARM_DESC(noninterlaced,"capture non interlaced video"); +MODULE_PARM_DESC(noninterlaced,"video input is noninterlaced"); #define dprintk(fmt, arg...) if (video_debug) \ printk(KERN_DEBUG "%s/video: " fmt, dev->name , ## arg) @@ -462,17 +460,17 @@ static int res_get(struct saa7134_dev *dev, struct saa7134_fh *fh, unsigned int return 1; /* is it free? */ - mutex_lock(&dev->lock); + down(&dev->lock); if (dev->resources & bit) { /* no, someone else uses it */ - mutex_unlock(&dev->lock); + up(&dev->lock); return 0; } /* it's free, grab it */ fh->resources |= bit; dev->resources |= bit; dprintk("res: get %d\n",bit); - mutex_unlock(&dev->lock); + up(&dev->lock); return 1; } @@ -491,13 +489,14 @@ int res_locked(struct saa7134_dev *dev, unsigned int bit) static void res_free(struct saa7134_dev *dev, struct saa7134_fh *fh, unsigned int bits) { - BUG_ON((fh->resources & bits) != bits); + if ((fh->resources & bits) != bits) + BUG(); - mutex_lock(&dev->lock); + down(&dev->lock); fh->resources &= ~bits; dev->resources &= ~bits; dprintk("res: put %d\n",bits); - mutex_unlock(&dev->lock); + up(&dev->lock); } /* ------------------------------------------------------------------ */ @@ -995,7 +994,7 @@ static int buffer_prepare(struct videobuf_queue *q, buf->vb.size != size || buf->vb.field != field || buf->fmt != fh->fmt) { - saa7134_dma_free(q,buf); + saa7134_dma_free(dev,buf); } if (STATE_NEEDS_INIT == buf->vb.state) { @@ -1006,7 +1005,7 @@ static int buffer_prepare(struct videobuf_queue *q, buf->fmt = fh->fmt; buf->pt = &fh->pt_cap; - err = videobuf_iolock(q,&buf->vb,&dev->ovbuf); + err = videobuf_iolock(dev->pci,&buf->vb,&dev->ovbuf); if (err) goto oops; err = saa7134_pgtable_build(dev->pci,buf->pt, @@ -1021,7 +1020,7 @@ static int buffer_prepare(struct videobuf_queue *q, return 0; oops: - saa7134_dma_free(q,buf); + saa7134_dma_free(dev,buf); return err; } @@ -1047,9 +1046,10 @@ static void buffer_queue(struct videobuf_queue *q, struct videobuf_buffer *vb) static void buffer_release(struct videobuf_queue *q, struct videobuf_buffer *vb) { + struct saa7134_fh *fh = q->priv_data; struct saa7134_buf *buf = container_of(vb,struct saa7134_buf,vb); - saa7134_dma_free(q,buf); + saa7134_dma_free(fh->dev,buf); } static struct videobuf_queue_ops video_qops = { @@ -1340,21 +1340,21 @@ video_poll(struct file *file, struct poll_table_struct *wait) if (!list_empty(&fh->cap.stream)) buf = list_entry(fh->cap.stream.next, struct videobuf_buffer, stream); } else { - mutex_lock(&fh->cap.lock); + down(&fh->cap.lock); if (UNSET == fh->cap.read_off) { /* need to capture a new frame */ if (res_locked(fh->dev,RESOURCE_VIDEO)) { - mutex_unlock(&fh->cap.lock); + up(&fh->cap.lock); return POLLERR; } if (0 != fh->cap.ops->buf_prepare(&fh->cap,fh->cap.read_buf,fh->cap.field)) { - mutex_unlock(&fh->cap.lock); + up(&fh->cap.lock); return POLLERR; } fh->cap.ops->buf_queue(&fh->cap,fh->cap.read_buf); fh->cap.read_off = 0; } - mutex_unlock(&fh->cap.lock); + up(&fh->cap.lock); buf = fh->cap.read_buf; } @@ -1463,10 +1463,6 @@ static int saa7134_g_fmt(struct saa7134_dev *dev, struct saa7134_fh *fh, f->fmt.pix.height * f->fmt.pix.bytesperline; return 0; case V4L2_BUF_TYPE_VIDEO_OVERLAY: - if (saa7134_no_overlay > 0) { - printk ("V4L2_BUF_TYPE_VIDEO_OVERLAY: no_overlay\n"); - return -EINVAL; - } f->fmt.win = fh->win; return 0; case V4L2_BUF_TYPE_VBI_CAPTURE: @@ -1531,10 +1527,6 @@ static int saa7134_try_fmt(struct saa7134_dev *dev, struct saa7134_fh *fh, return 0; } case V4L2_BUF_TYPE_VIDEO_OVERLAY: - if (saa7134_no_overlay > 0) { - printk ("V4L2_BUF_TYPE_VIDEO_OVERLAY: no_overlay\n"); - return -EINVAL; - } err = verify_preview(dev,&f->fmt.win); if (0 != err) return err; @@ -1565,22 +1557,18 @@ static int saa7134_s_fmt(struct saa7134_dev *dev, struct saa7134_fh *fh, fh->cap.field = f->fmt.pix.field; return 0; case V4L2_BUF_TYPE_VIDEO_OVERLAY: - if (saa7134_no_overlay > 0) { - printk ("V4L2_BUF_TYPE_VIDEO_OVERLAY: no_overlay\n"); - return -EINVAL; - } err = verify_preview(dev,&f->fmt.win); if (0 != err) return err; - mutex_lock(&dev->lock); + down(&dev->lock); fh->win = f->fmt.win; fh->nclips = f->fmt.win.clipcount; if (fh->nclips > 8) fh->nclips = 8; if (copy_from_user(fh->clips,f->fmt.win.clips, sizeof(struct v4l2_clip)*fh->nclips)) { - mutex_unlock(&dev->lock); + up(&dev->lock); return -EFAULT; } @@ -1590,7 +1578,7 @@ static int saa7134_s_fmt(struct saa7134_dev *dev, struct saa7134_fh *fh, start_preview(dev,fh); spin_unlock_irqrestore(&dev->slock,flags); } - mutex_unlock(&dev->lock); + up(&dev->lock); return 0; case V4L2_BUF_TYPE_VBI_CAPTURE: saa7134_vbi_fmt(dev,f); @@ -1624,9 +1612,9 @@ int saa7134_common_ioctl(struct saa7134_dev *dev, return get_control(dev,arg); case VIDIOC_S_CTRL: { - mutex_lock(&dev->lock); + down(&dev->lock); err = set_control(dev,NULL,arg); - mutex_unlock(&dev->lock); + up(&dev->lock); return err; } /* --- input switching --------------------------------------- */ @@ -1676,9 +1664,9 @@ int saa7134_common_ioctl(struct saa7134_dev *dev, return -EINVAL; if (NULL == card_in(dev,*i).name) return -EINVAL; - mutex_lock(&dev->lock); + down(&dev->lock); video_mux(dev,*i); - mutex_unlock(&dev->lock); + up(&dev->lock); return 0; } @@ -1728,13 +1716,11 @@ static int video_do_ioctl(struct inode *inode, struct file *file, cap->version = SAA7134_VERSION_CODE; cap->capabilities = V4L2_CAP_VIDEO_CAPTURE | + V4L2_CAP_VIDEO_OVERLAY | V4L2_CAP_VBI_CAPTURE | V4L2_CAP_READWRITE | V4L2_CAP_STREAMING | V4L2_CAP_TUNER; - if (saa7134_no_overlay <= 0) { - cap->capabilities |= V4L2_CAP_VIDEO_OVERLAY; - } if ((tuner_type == TUNER_ABSENT) || (tuner_type == UNSET)) cap->capabilities &= ~V4L2_CAP_TUNER; @@ -1780,7 +1766,7 @@ static int video_do_ioctl(struct inode *inode, struct file *file, if (i == TVNORMS) return -EINVAL; - mutex_lock(&dev->lock); + down(&dev->lock); if (res_check(fh, RESOURCE_OVERLAY)) { spin_lock_irqsave(&dev->slock,flags); stop_preview(dev,fh); @@ -1790,7 +1776,7 @@ static int video_do_ioctl(struct inode *inode, struct file *file, } else set_tvnorm(dev,&tvnorms[i]); saa7134_tvaudio_do_scan(dev); - mutex_unlock(&dev->lock); + up(&dev->lock); return 0; } @@ -1923,13 +1909,13 @@ static int video_do_ioctl(struct inode *inode, struct file *file, return -EINVAL; if (1 == fh->radio && V4L2_TUNER_RADIO != f->type) return -EINVAL; - mutex_lock(&dev->lock); + down(&dev->lock); dev->ctl_freq = f->frequency; saa7134_i2c_call_clients(dev,VIDIOC_S_FREQUENCY,f); saa7134_tvaudio_do_scan(dev); - mutex_unlock(&dev->lock); + up(&dev->lock); return 0; } @@ -1985,10 +1971,6 @@ static int video_do_ioctl(struct inode *inode, struct file *file, switch (type) { case V4L2_BUF_TYPE_VIDEO_CAPTURE: case V4L2_BUF_TYPE_VIDEO_OVERLAY: - if (saa7134_no_overlay > 0) { - printk ("V4L2_BUF_TYPE_VIDEO_OVERLAY: no_overlay\n"); - return -EINVAL; - } if (index >= FORMATS) return -EINVAL; if (f->type == V4L2_BUF_TYPE_VIDEO_OVERLAY && @@ -2049,11 +2031,6 @@ static int video_do_ioctl(struct inode *inode, struct file *file, int *on = arg; if (*on) { - if (saa7134_no_overlay > 0) { - printk ("no_overlay\n"); - return -EINVAL; - } - if (!res_get(dev,fh,RESOURCE_OVERLAY)) return -EBUSY; spin_lock_irqsave(&dev->slock,flags); @@ -2087,7 +2064,7 @@ static int video_do_ioctl(struct inode *inode, struct file *file, struct v4l2_format *f = arg; return saa7134_try_fmt(dev,fh,f); } -#ifdef CONFIG_VIDEO_V4L1_COMPAT +#ifdef HAVE_V4L1 case VIDIOCGMBUF: { struct video_mbuf *mbuf = arg; @@ -2305,7 +2282,7 @@ static struct file_operations radio_fops = struct video_device saa7134_video_template = { .name = "saa7134-video", - .type = VID_TYPE_CAPTURE|VID_TYPE_TUNER| + .type = VID_TYPE_CAPTURE|VID_TYPE_TUNER|VID_TYPE_OVERLAY| VID_TYPE_CLIPPING|VID_TYPE_SCALES, .hardware = 0, .fops = &video_fops, diff --git a/drivers/media/video/saa7134/saa7134.h b/drivers/media/video/saa7134/saa7134.h index c04ce6152..2a4de51c8 100644 --- a/drivers/media/video/saa7134/saa7134.h +++ b/drivers/media/video/saa7134/saa7134.h @@ -29,12 +29,11 @@ #include #include #include -#include #include -#include #include +#include #include #include #include @@ -61,7 +60,6 @@ enum saa7134_tvaudio_mode { TVAUDIO_FM_K_STEREO = 4, TVAUDIO_NICAM_AM = 5, TVAUDIO_NICAM_FM = 6, - TVAUDIO_AM_MONO = 7 }; enum saa7134_audio_in { @@ -222,7 +220,6 @@ struct saa7134_format { #define SAA7134_BOARD_AVERMEDIA_A169_B1 92 #define SAA7134_BOARD_MD7134_BRIDGE_2 93 #define SAA7134_BOARD_FLYDVBT_HYBRID_CARDBUS 94 -#define SAA7134_BOARD_FLYVIDEO3000_NTSC 95 #define SAA7134_MAXBOARDS 8 #define SAA7134_INPUT_MAX 8 @@ -372,7 +369,7 @@ struct saa7134_fh { /* dmasound dsp status */ struct saa7134_dmasound { - struct mutex lock; + struct semaphore lock; int minor_mixer; int minor_dsp; unsigned int users_dsp; @@ -399,7 +396,7 @@ struct saa7134_dmasound { unsigned int read_offset; unsigned int read_count; void * priv_data; - struct snd_pcm_substream *substream; + snd_pcm_substream_t *substream; }; /* IR input */ @@ -436,7 +433,7 @@ struct saa7134_mpeg_ops { /* global device status */ struct saa7134_dev { struct list_head devlist; - struct mutex lock; + struct semaphore lock; spinlock_t slock; #ifdef VIDIOC_G_PRIORITY struct v4l2_prio_state prio; @@ -533,7 +530,6 @@ struct saa7134_dev { /* SAA7134_MPEG_DVB only */ struct videobuf_dvb dvb; - int (*original_demod_sleep)(struct dvb_frontend* fe); }; /* ----------------------------------------------------------- */ @@ -560,7 +556,6 @@ struct saa7134_dev { /* saa7134-core.c */ extern struct list_head saa7134_devlist; -extern int saa7134_no_overlay; void saa7134_track_gpio(struct saa7134_dev *dev, char *msg); @@ -582,7 +577,7 @@ void saa7134_buffer_finish(struct saa7134_dev *dev, struct saa7134_dmaqueue *q, unsigned int state); void saa7134_buffer_next(struct saa7134_dev *dev, struct saa7134_dmaqueue *q); void saa7134_buffer_timeout(unsigned long data); -void saa7134_dma_free(struct videobuf_queue *q,struct saa7134_buf *buf); +void saa7134_dma_free(struct saa7134_dev *dev,struct saa7134_buf *buf); int saa7134_set_dmabits(struct saa7134_dev *dev); diff --git a/drivers/media/video/saa7146.h b/drivers/media/video/saa7146.h index 2830b5e33..756963f01 100644 --- a/drivers/media/video/saa7146.h +++ b/drivers/media/video/saa7146.h @@ -1,7 +1,7 @@ -/* +/* saa7146.h - definitions philips saa7146 based cards Copyright (C) 1999 Nathan Laredo (laredo@gnu.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 @@ -27,7 +27,7 @@ #include -#ifndef O_NONCAP +#ifndef O_NONCAP #define O_NONCAP O_TRUNC #endif @@ -36,7 +36,7 @@ #ifdef __KERNEL__ -struct saa7146_window +struct saa7146_window { int x, y; ushort width, height; @@ -70,7 +70,7 @@ struct saa7146 int irqstate; /* irq routine is state driven */ int writemode; int playmode; - unsigned int nr; + unsigned int nr; unsigned long irq; /* IRQ used by SAA7146 card */ unsigned short id; unsigned char revision; diff --git a/drivers/media/video/saa7146reg.h b/drivers/media/video/saa7146reg.h index 80ec2c146..6cc910f50 100644 --- a/drivers/media/video/saa7146reg.h +++ b/drivers/media/video/saa7146reg.h @@ -1,7 +1,7 @@ -/* +/* saa7146.h - definitions philips saa7146 based cards Copyright (C) 1999 Nathan Laredo (laredo@gnu.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 diff --git a/drivers/media/video/saa7185.c b/drivers/media/video/saa7185.c index 9c3084108..3ed0edb87 100644 --- a/drivers/media/video/saa7185.c +++ b/drivers/media/video/saa7185.c @@ -1,4 +1,4 @@ -/* +/* * saa7185 - Philips SAA7185B video encoder driver version 0.0.3 * * Copyright (C) 1998 Dave Perks @@ -49,6 +49,7 @@ MODULE_AUTHOR("Dave Perks"); MODULE_LICENSE("GPL"); #include +#include #define I2C_NAME(s) (s)->name @@ -112,21 +113,24 @@ saa7185_write_block (struct i2c_client *client, if (i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { /* do raw I2C, not smbus compatible */ struct saa7185 *encoder = i2c_get_clientdata(client); + struct i2c_msg msg; u8 block_data[32]; - int block_len; + msg.addr = client->addr; + msg.flags = 0; while (len >= 2) { - block_len = 0; - block_data[block_len++] = reg = data[0]; + msg.buf = (char *) block_data; + msg.len = 0; + block_data[msg.len++] = reg = data[0]; do { - block_data[block_len++] = + block_data[msg.len++] = encoder->reg[reg++] = data[1]; len -= 2; data += 2; } while (len >= 2 && data[0] == reg && - block_len < 32); - if ((ret = i2c_master_send(client, block_data, - block_len)) < 0) + msg.len < 32); + if ((ret = i2c_transfer(client->adapter, + &msg, 1)) < 0) break; } } else { @@ -377,7 +381,7 @@ saa7185_command (struct i2c_client *client, static unsigned short normal_i2c[] = { I2C_SAA7185 >> 1, I2C_CLIENT_END }; static unsigned short ignore = I2C_CLIENT_END; - + static struct i2c_client_address_data addr_data = { .normal_i2c = normal_i2c, .probe = &ignore, diff --git a/drivers/media/video/saa7196.h b/drivers/media/video/saa7196.h index cd4b6354a..f92f21cfb 100644 --- a/drivers/media/video/saa7196.h +++ b/drivers/media/video/saa7196.h @@ -2,14 +2,14 @@ Definitions for the Philips SAA7196 digital video decoder, scaler, and clock generator circuit (DESCpro), as used in the PlanB video input of the Powermac 7x00/8x00 series. - + Copyright (C) 1998 Michel Lanners (mlan@cpu.lu) The register defines are shamelessly copied from the meteor driver out of NetBSD (with permission), and are copyrighted (c) 1995 Mark Tinguely and Jim Lowe (Thanks !) - + Additional debugging and coding by Takashi Oe (toe@unlinfo.unl.edu) The default values used for PlanB are my mistakes. diff --git a/drivers/media/video/stradis.c b/drivers/media/video/stradis.c index 5686547ba..9d769264a 100644 --- a/drivers/media/video/stradis.c +++ b/drivers/media/video/stradis.c @@ -1,4 +1,4 @@ -/* +/* * stradis.c - stradis 4:2:2 mpeg decoder driver * * Stradis 4:2:2 MPEG-2 Decoder Driver @@ -42,7 +42,6 @@ #include #include #include -#include #include "saa7146.h" #include "saa7146reg.h" @@ -1192,9 +1191,9 @@ static void saa7146_set_winsize(struct saa7146 *saa) } /* clip_draw_rectangle(cm,x,y,w,h) -- handle clipping an area - * bitmap is fixed width, 128 bytes (1024 pixels represented) - * arranged most-sigificant-bit-left in 32-bit words - * based on saa7146 clipping hardware, it swaps bytes if LE + * bitmap is fixed width, 128 bytes (1024 pixels represented) + * arranged most-sigificant-bit-left in 32-bit words + * based on saa7146 clipping hardware, it swaps bytes if LE * much of this makes up for egcs brain damage -- so if you * are wondering "why did he do this?" it is because the C * was adjusted to generate the optimal asm output without @@ -1260,7 +1259,7 @@ static void make_clip_tab(struct saa7146 *saa, struct video_clip *cr, int ncr) clip_draw_rectangle(clipmap, cr[i].x, cr[i].y, cr[i].width, cr[i].height); } - /* clip against viewing window AND screen + /* clip against viewing window AND screen so we do not have to rely on the user program */ clip_draw_rectangle(clipmap, (saa->win.x + width > saa->win.swidth) ? @@ -1983,7 +1982,7 @@ static int __devinit configure_saa7146(struct pci_dev *pdev, int num) memcpy(&saa->video_dev, &saa_template, sizeof(saa_template)); saawrite(0, SAA7146_IER); /* turn off all interrupts */ - retval = request_irq(saa->irq, saa7146_irq, IRQF_SHARED | IRQF_DISABLED, + retval = request_irq(saa->irq, saa7146_irq, SA_SHIRQ | SA_INTERRUPT, "stradis", saa); if (retval == -EINVAL) dev_err(&pdev->dev, "%d: Bad irq number or handler\n", num); @@ -2181,6 +2180,7 @@ static struct pci_device_id stradis_pci_tbl[] = { { 0 } }; +MODULE_DEVICE_TABLE(pci, stradis_pci_tbl); static struct pci_driver stradis_driver = { .name = "stradis", @@ -2189,7 +2189,7 @@ static struct pci_driver stradis_driver = { .remove = __devexit_p(stradis_remove) }; -static int __init stradis_init(void) +int __init stradis_init(void) { int retval; @@ -2202,7 +2202,7 @@ static int __init stradis_init(void) return retval; } -static void __exit stradis_exit(void) +void __exit stradis_exit(void) { pci_unregister_driver(&stradis_driver); printk(KERN_INFO "stradis: module cleanup complete\n"); diff --git a/drivers/media/video/tda7432.c b/drivers/media/video/tda7432.c index 78e043ac9..fc3d5824e 100644 --- a/drivers/media/video/tda7432.c +++ b/drivers/media/video/tda7432.c @@ -48,8 +48,9 @@ #include #include +#include "bttv.h" +#include #include -#include #ifndef VIDEO_AUDIO_BALANCE # define VIDEO_AUDIO_BALANCE 32 @@ -70,7 +71,7 @@ module_param(maxvol, int, S_IRUGO | S_IWUSR); /* Address to scan (I2C address of this chip) */ static unsigned short normal_i2c[] = { - I2C_ADDR_TDA7432 >> 1, + I2C_TDA7432 >> 1, I2C_CLIENT_END, }; I2C_CLIENT_INSMOD; diff --git a/drivers/media/video/tda8290.c b/drivers/media/video/tda8290.c index 027c8a074..65930a310 100644 --- a/drivers/media/video/tda8290.c +++ b/drivers/media/video/tda8290.c @@ -569,7 +569,7 @@ int tda8290_init(struct i2c_client *c) strlcpy(c->name, "tda8290+75a", sizeof(c->name)); t->tda827x_ver = 2; } - tuner_info("type set to %s\n", c->name); + tuner_info("tuner: type set to %s\n", c->name); t->set_tv_freq = set_tv_freq; t->set_radio_freq = set_radio_freq; diff --git a/drivers/media/video/tda9840.c b/drivers/media/video/tda9840.c index ef494febb..ed4c04119 100644 --- a/drivers/media/video/tda9840.c +++ b/drivers/media/video/tda9840.c @@ -24,7 +24,6 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ - #include #include #include @@ -35,7 +34,7 @@ static int debug = 0; /* insmod parameter */ module_param(debug, int, 0644); MODULE_PARM_DESC(debug, "Turn on/off device debugging (default:off)."); #define dprintk(args...) \ - do { if (debug) { printk("%s: %s()[%d]: ", KBUILD_MODNAME, __FUNCTION__, __LINE__); printk(args); } } while (0) + do { if (debug) { printk("%s: %s()[%d]: ", KBUILD_MODNAME, __FUNCTION__, __LINE__); printk(args); } } while (0) #define SWITCH 0x00 #define LEVEL_ADJUST 0x02 @@ -43,7 +42,7 @@ MODULE_PARM_DESC(debug, "Turn on/off device debugging (default:off)."); #define TEST 0x04 /* addresses to scan, found only at 0x42 (7-Bit) */ -static unsigned short normal_i2c[] = { I2C_ADDR_TDA9840, I2C_CLIENT_END }; +static unsigned short normal_i2c[] = { I2C_TDA9840, I2C_CLIENT_END }; /* magic definition of all other variables and things */ I2C_CLIENT_INSMOD; @@ -223,7 +222,7 @@ static int detach(struct i2c_client *client) static struct i2c_driver driver = { .driver = { - .name = "tda9840", + .name = "tda9840", }, .id = I2C_DRIVERID_TDA9840, .attach_adapter = attach, diff --git a/drivers/media/video/tda9840.h b/drivers/media/video/tda9840.h index 7da8432cd..28021053b 100644 --- a/drivers/media/video/tda9840.h +++ b/drivers/media/video/tda9840.h @@ -1,7 +1,7 @@ #ifndef __INCLUDED_TDA9840__ #define __INCLUDED_TDA9840__ -#define I2C_ADDR_TDA9840 0x42 +#define I2C_TDA9840 0x42 #define TDA9840_DETECT _IOR('v',1,int) /* return values for TDA9840_DETCT */ diff --git a/drivers/media/video/tda9875.c b/drivers/media/video/tda9875.c index 827633b3b..ef98c4982 100644 --- a/drivers/media/video/tda9875.c +++ b/drivers/media/video/tda9875.c @@ -26,27 +26,28 @@ #include #include #include -#include #include #include #include - -#include +#include "bttv.h" +#include static int debug; /* insmod parameter */ module_param(debug, int, S_IRUGO | S_IWUSR); MODULE_LICENSE("GPL"); + /* Addresses to scan */ static unsigned short normal_i2c[] = { - I2C_ADDR_TDA9875 >> 1, + I2C_TDA9875 >> 1, I2C_CLIENT_END }; I2C_CLIENT_INSMOD; /* This is a superset of the TDA9875 */ struct tda9875 { + int mode; int rvol, lvol; int bass, treble; struct i2c_client c; @@ -164,7 +165,7 @@ static void do_tda9875_init(struct i2c_client *client) struct tda9875 *t = i2c_get_clientdata(client); dprintk("In tda9875_init\n"); tda9875_write(client, TDA9875_CFG, 0xd0 ); /*reg de config 0 (reset)*/ - tda9875_write(client, TDA9875_MSR, 0x03 ); /* Monitor 0b00000XXX*/ + tda9875_write(client, TDA9875_MSR, 0x03 ); /* Monitor 0b00000XXX*/ tda9875_write(client, TDA9875_C1MSB, 0x00 ); /*Car1(FM) MSB XMHz*/ tda9875_write(client, TDA9875_C1MIB, 0x00 ); /*Car1(FM) MIB XMHz*/ tda9875_write(client, TDA9875_C1LSB, 0x00 ); /*Car1(FM) LSB XMHz*/ @@ -196,6 +197,7 @@ static void do_tda9875_init(struct i2c_client *client) tda9875_write(client, TDA9875_MUT, 0xcc ); /* General mute */ + t->mode=AUDIO_UNMUTE; t->lvol=t->rvol =0; /* 0dB */ t->bass=0; /* 0dB */ t->treble=0; /* 0dB */ diff --git a/drivers/media/video/tda9887.c b/drivers/media/video/tda9887.c index 8dab481d3..0d54f6c19 100644 --- a/drivers/media/video/tda9887.c +++ b/drivers/media/video/tda9887.c @@ -18,21 +18,49 @@ TDA9886 (PAL, SECAM, NTSC) TDA9887 (PAL, SECAM, NTSC, FM Radio) - Used as part of several tuners + found on: + - Pinnacle PCTV (Jul.2002 Version with MT2032, bttv) + TDA9887 (world), TDA9885 (USA) + Note: OP2 of tda988x must be set to 1, else MT2032 is disabled! + - KNC One TV-Station RDS (saa7134) + - Hauppauge PVR-150/500 (possibly more) */ -#define tda9887_info(fmt, arg...) do {\ - printk(KERN_INFO "%s %d-%04x: " fmt, t->i2c.name, \ - i2c_adapter_id(t->i2c.adapter), t->i2c.addr , ##arg); } while (0) -#define tda9887_dbg(fmt, arg...) do {\ - if (tuner_debug) \ - printk(KERN_INFO "%s %d-%04x: " fmt, t->i2c.name, \ - i2c_adapter_id(t->i2c.adapter), t->i2c.addr , ##arg); } while (0) +/* Addresses to scan */ +static unsigned short normal_i2c[] = { + 0x84 >>1, + 0x86 >>1, + 0x96 >>1, + I2C_CLIENT_END, +}; +I2C_CLIENT_INSMOD; + +/* insmod options */ +static unsigned int debug = 0; +module_param(debug, int, 0644); +MODULE_LICENSE("GPL"); /* ---------------------------------------------------------------------- */ #define UNSET (-1U) +#define tda9887_info(fmt, arg...) do {\ + printk(KERN_INFO "%s %d-%04x: " fmt, t->client.name, \ + i2c_adapter_id(t->client.adapter), t->client.addr , ##arg); } while (0) +#define tda9887_dbg(fmt, arg...) do {\ + if (debug) \ + printk(KERN_INFO "%s %d-%04x: " fmt, t->client.name, \ + i2c_adapter_id(t->client.adapter), t->client.addr , ##arg); } while (0) + +struct tda9887 { + struct i2c_client client; + v4l2_std_id std; + enum tuner_mode mode; + unsigned int config; + unsigned int using_v4l2; + unsigned int radio_mode; + unsigned char data[4]; +}; struct tvnorm { v4l2_std_id std; @@ -42,6 +70,9 @@ struct tvnorm { unsigned char e; }; +static struct i2c_driver driver; +static struct i2c_client client_template; + /* ---------------------------------------------------------------------- */ // @@ -84,7 +115,8 @@ struct tvnorm { #define cAudioGain6 0x80 // bit c7 #define cTopMask 0x1f // bit c0:4 -#define cTopDefault 0x10 // bit c0:4 +#define cTopPalSecamDefault 0x14 // bit c0:4 +#define cTopNtscRadioDefault 0x10 // bit c0:4 //// third reg (e) #define cAudioIF_4_5 0x00 // bit e0:1 @@ -122,7 +154,7 @@ static struct tvnorm tvnorms[] = { cQSS ), .c = ( cDeemphasisON | cDeemphasis50 | - cTopDefault), + cTopPalSecamDefault), .e = ( cGating_36 | cAudioIF_5_5 | cVideoIF_38_90 ), @@ -133,7 +165,7 @@ static struct tvnorm tvnorms[] = { cQSS ), .c = ( cDeemphasisON | cDeemphasis50 | - cTopDefault), + cTopPalSecamDefault), .e = ( cGating_36 | cAudioIF_6_0 | cVideoIF_38_90 ), @@ -144,7 +176,7 @@ static struct tvnorm tvnorms[] = { cQSS ), .c = ( cDeemphasisON | cDeemphasis50 | - cTopDefault), + cTopPalSecamDefault), .e = ( cGating_36 | cAudioIF_6_5 | cVideoIF_38_90 ), @@ -155,7 +187,7 @@ static struct tvnorm tvnorms[] = { cQSS ), .c = ( cDeemphasisON | cDeemphasis75 | - cTopDefault), + cTopNtscRadioDefault), .e = ( cGating_36 | cAudioIF_4_5 | cVideoIF_45_75 ), @@ -164,7 +196,7 @@ static struct tvnorm tvnorms[] = { .name = "SECAM-BGH", .b = ( cPositiveAmTV | cQSS ), - .c = ( cTopDefault), + .c = ( cTopPalSecamDefault), .e = ( cGating_36 | cAudioIF_5_5 | cVideoIF_38_90 ), @@ -173,7 +205,7 @@ static struct tvnorm tvnorms[] = { .name = "SECAM-L", .b = ( cPositiveAmTV | cQSS ), - .c = ( cTopDefault), + .c = ( cTopPalSecamDefault), .e = ( cGating_36 | cAudioIF_6_5 | cVideoIF_38_90 ), @@ -183,7 +215,7 @@ static struct tvnorm tvnorms[] = { .b = ( cOutputPort2Inactive | cPositiveAmTV | cQSS ), - .c = ( cTopDefault), + .c = ( cTopPalSecamDefault), .e = ( cGating_36 | cAudioIF_6_5 | cVideoIF_33_90 ), @@ -194,7 +226,7 @@ static struct tvnorm tvnorms[] = { cQSS ), .c = ( cDeemphasisON | cDeemphasis50 | - cTopDefault), + cTopPalSecamDefault), .e = ( cGating_36 | cAudioIF_6_5 | cVideoIF_38_90 ), @@ -205,7 +237,7 @@ static struct tvnorm tvnorms[] = { cQSS ), .c = ( cDeemphasisON | cDeemphasis75 | - cTopDefault), + cTopNtscRadioDefault), .e = ( cGating_36 | cAudioIF_4_5 | cVideoIF_45_75 ), @@ -216,7 +248,7 @@ static struct tvnorm tvnorms[] = { cQSS ), .c = ( cDeemphasisON | cDeemphasis50 | - cTopDefault), + cTopNtscRadioDefault), .e = ( cGating_36 | cAudioIF_4_5 | cVideoIF_58_75 ), @@ -229,7 +261,7 @@ static struct tvnorm radio_stereo = { cQSS ), .c = ( cDeemphasisOFF | cAudioGain6 | - cTopDefault), + cTopNtscRadioDefault), .e = ( cTunerGainLow | cAudioIF_5_5 | cRadioIF_38_90 ), @@ -241,7 +273,7 @@ static struct tvnorm radio_mono = { cQSS ), .c = ( cDeemphasisON | cDeemphasis75 | - cTopDefault), + cTopNtscRadioDefault), .e = ( cTunerGainLow | cAudioIF_5_5 | cRadioIF_38_90 ), @@ -249,7 +281,7 @@ static struct tvnorm radio_mono = { /* ---------------------------------------------------------------------- */ -static void dump_read_message(struct tuner *t, unsigned char *buf) +static void dump_read_message(struct tda9887 *t, unsigned char *buf) { static char *afc[16] = { "- 12.5 kHz", @@ -277,7 +309,7 @@ static void dump_read_message(struct tuner *t, unsigned char *buf) tda9887_info(" vfi level : %s\n", (buf[0] & 0x80) ? "high" : "low"); } -static void dump_write_message(struct tuner *t, unsigned char *buf) +static void dump_write_message(struct tda9887 *t, unsigned char *buf) { static char *sound[4] = { "AM/TV", @@ -373,13 +405,13 @@ static void dump_write_message(struct tuner *t, unsigned char *buf) /* ---------------------------------------------------------------------- */ -static int tda9887_set_tvnorm(struct tuner *t, char *buf) +static int tda9887_set_tvnorm(struct tda9887 *t, char *buf) { struct tvnorm *norm = NULL; int i; - if (t->mode == V4L2_TUNER_RADIO) { - if (t->audmode == V4L2_TUNER_MODE_MONO) + if (t->mode == T_RADIO) { + if (t->radio_mode == V4L2_TUNER_MODE_MONO) norm = &radio_mono; else norm = &radio_stereo; @@ -413,7 +445,7 @@ module_param(port2, int, 0644); module_param(qss, int, 0644); module_param(adjust, int, 0644); -static int tda9887_set_insmod(struct tuner *t, char *buf) +static int tda9887_set_insmod(struct tda9887 *t, char *buf) { if (UNSET != port1) { if (port1) @@ -442,27 +474,27 @@ static int tda9887_set_insmod(struct tuner *t, char *buf) return 0; } -static int tda9887_set_config(struct tuner *t, char *buf) +static int tda9887_set_config(struct tda9887 *t, char *buf) { - if (t->tda9887_config & TDA9887_PORT1_ACTIVE) + if (t->config & TDA9887_PORT1_ACTIVE) buf[1] &= ~cOutputPort1Inactive; - if (t->tda9887_config & TDA9887_PORT1_INACTIVE) + if (t->config & TDA9887_PORT1_INACTIVE) buf[1] |= cOutputPort1Inactive; - if (t->tda9887_config & TDA9887_PORT2_ACTIVE) + if (t->config & TDA9887_PORT2_ACTIVE) buf[1] &= ~cOutputPort2Inactive; - if (t->tda9887_config & TDA9887_PORT2_INACTIVE) + if (t->config & TDA9887_PORT2_INACTIVE) buf[1] |= cOutputPort2Inactive; - if (t->tda9887_config & TDA9887_QSS) + if (t->config & TDA9887_QSS) buf[1] |= cQSS; - if (t->tda9887_config & TDA9887_INTERCARRIER) + if (t->config & TDA9887_INTERCARRIER) buf[1] &= ~cQSS; - if (t->tda9887_config & TDA9887_AUTOMUTE) + if (t->config & TDA9887_AUTOMUTE) buf[1] |= cAutoMuteFmActive; - if (t->tda9887_config & TDA9887_DEEMPHASIS_MASK) { + if (t->config & TDA9887_DEEMPHASIS_MASK) { buf[2] &= ~0x60; - switch (t->tda9887_config & TDA9887_DEEMPHASIS_MASK) { + switch (t->config & TDA9887_DEEMPHASIS_MASK) { case TDA9887_DEEMPHASIS_NONE: buf[2] |= cDeemphasisOFF; break; @@ -474,36 +506,153 @@ static int tda9887_set_config(struct tuner *t, char *buf) break; } } - if (t->tda9887_config & TDA9887_TOP_SET) { + if (t->config & TDA9887_TOP_SET) { buf[2] &= ~cTopMask; - buf[2] |= (t->tda9887_config >> 8) & cTopMask; + buf[2] |= (t->config >> 8) & cTopMask; } - if ((t->tda9887_config & TDA9887_INTERCARRIER_NTSC) && (t->std & V4L2_STD_NTSC)) + if ((t->config & TDA9887_INTERCARRIER_NTSC) && (t->std & V4L2_STD_NTSC)) buf[1] &= ~cQSS; return 0; } /* ---------------------------------------------------------------------- */ -static int tda9887_status(struct tuner *t) +static char pal[] = "--"; +static char secam[] = "--"; +static char ntsc[] = "-"; + +module_param_string(pal, pal, sizeof(pal), 0644); +module_param_string(secam, secam, sizeof(secam), 0644); +module_param_string(ntsc, ntsc, sizeof(ntsc), 0644); + +static int tda9887_fixup_std(struct tda9887 *t) +{ + /* get more precise norm info from insmod option */ + if ((t->std & V4L2_STD_PAL) == V4L2_STD_PAL) { + switch (pal[0]) { + case 'b': + case 'B': + case 'g': + case 'G': + case 'h': + case 'H': + case 'n': + case 'N': + if (pal[1] == 'c' || pal[1] == 'C') { + tda9887_dbg("insmod fixup: PAL => PAL-Nc\n"); + t->std = V4L2_STD_PAL_Nc; + } else { + tda9887_dbg("insmod fixup: PAL => PAL-BGHN\n"); + t->std = V4L2_STD_PAL_BG | V4L2_STD_PAL_H | V4L2_STD_PAL_N; + } + break; + case 'i': + case 'I': + tda9887_dbg("insmod fixup: PAL => PAL-I\n"); + t->std = V4L2_STD_PAL_I; + break; + case 'd': + case 'D': + case 'k': + case 'K': + tda9887_dbg("insmod fixup: PAL => PAL-DK\n"); + t->std = V4L2_STD_PAL_DK; + break; + case 'm': + case 'M': + tda9887_dbg("insmod fixup: PAL => PAL-M\n"); + t->std = V4L2_STD_PAL_M; + break; + case '-': + /* default parameter, do nothing */ + break; + default: + tda9887_info("pal= argument not recognised\n"); + break; + } + } + if ((t->std & V4L2_STD_SECAM) == V4L2_STD_SECAM) { + switch (secam[0]) { + case 'b': + case 'B': + case 'g': + case 'G': + case 'h': + case 'H': + tda9887_dbg("insmod fixup: SECAM => SECAM-BGH\n"); + t->std = V4L2_STD_SECAM_B | V4L2_STD_SECAM_G | V4L2_STD_SECAM_H; + break; + case 'd': + case 'D': + case 'k': + case 'K': + tda9887_dbg("insmod fixup: SECAM => SECAM-DK\n"); + t->std = V4L2_STD_SECAM_DK; + break; + case 'l': + case 'L': + if (secam[1] == 'c' || secam[1] == 'C') { + tda9887_dbg("insmod fixup: SECAM => SECAM-L'\n"); + t->std = V4L2_STD_SECAM_LC; + } else { + tda9887_dbg("insmod fixup: SECAM => SECAM-L\n"); + t->std = V4L2_STD_SECAM_L; + } + break; + case '-': + /* default parameter, do nothing */ + break; + default: + tda9887_info("secam= argument not recognised\n"); + break; + } + } + if ((t->std & V4L2_STD_NTSC) == V4L2_STD_NTSC) { + switch (ntsc[0]) { + case 'm': + case 'M': + tda9887_dbg("insmod fixup: NTSC => NTSC-M\n"); + t->std = V4L2_STD_NTSC_M; + break; + case 'j': + case 'J': + tda9887_dbg("insmod fixup: NTSC => NTSC_M_JP\n"); + t->std = V4L2_STD_NTSC_M_JP; + break; + case 'k': + case 'K': + tda9887_dbg("insmod fixup: NTSC => NTSC_M_KR\n"); + t->std = V4L2_STD_NTSC_M_KR; + break; + case '-': + /* default parameter, do nothing */ + break; + default: + tda9887_info("ntsc= argument not recognised\n"); + break; + } + } + return 0; +} + +static int tda9887_status(struct tda9887 *t) { unsigned char buf[1]; int rc; memset(buf,0,sizeof(buf)); - if (1 != (rc = i2c_master_recv(&t->i2c,buf,1))) + if (1 != (rc = i2c_master_recv(&t->client,buf,1))) tda9887_info("i2c i/o error: rc == %d (should be 1)\n",rc); dump_read_message(t, buf); return 0; } -static void tda9887_configure(struct i2c_client *client) +static int tda9887_configure(struct tda9887 *t) { - struct tuner *t = i2c_get_clientdata(client); int rc; - memset(t->tda9887_data,0,sizeof(t->tda9887_data)); - tda9887_set_tvnorm(t,t->tda9887_data); + memset(t->data,0,sizeof(t->data)); + tda9887_set_tvnorm(t,t->data); /* A note on the port settings: These settings tend to depend on the specifics of the board. @@ -518,84 +667,249 @@ static void tda9887_configure(struct i2c_client *client) the ports should be set to active (0), but, again, that may differ depending on the precise hardware configuration. */ - t->tda9887_data[1] |= cOutputPort1Inactive; - t->tda9887_data[1] |= cOutputPort2Inactive; + t->data[1] |= cOutputPort1Inactive; + t->data[1] |= cOutputPort2Inactive; - tda9887_set_config(t,t->tda9887_data); - tda9887_set_insmod(t,t->tda9887_data); + tda9887_set_config(t,t->data); + tda9887_set_insmod(t,t->data); if (t->mode == T_STANDBY) { - t->tda9887_data[1] |= cForcedMuteAudioON; + t->data[1] |= cForcedMuteAudioON; } tda9887_dbg("writing: b=0x%02x c=0x%02x e=0x%02x\n", - t->tda9887_data[1],t->tda9887_data[2],t->tda9887_data[3]); - if (tuner_debug > 1) - dump_write_message(t, t->tda9887_data); + t->data[1],t->data[2],t->data[3]); + if (debug > 1) + dump_write_message(t, t->data); - if (4 != (rc = i2c_master_send(&t->i2c,t->tda9887_data,4))) + if (4 != (rc = i2c_master_send(&t->client,t->data,4))) tda9887_info("i2c i/o error: rc == %d (should be 4)\n",rc); - if (tuner_debug > 2) { + if (debug > 2) { msleep_interruptible(1000); tda9887_status(t); } + return 0; } /* ---------------------------------------------------------------------- */ -static void tda9887_tuner_status(struct i2c_client *client) +static int tda9887_attach(struct i2c_adapter *adap, int addr, int kind) { - struct tuner *t = i2c_get_clientdata(client); - tda9887_info("Data bytes: b=0x%02x c=0x%02x e=0x%02x\n", t->tda9887_data[1], t->tda9887_data[2], t->tda9887_data[3]); + struct tda9887 *t; + + client_template.adapter = adap; + client_template.addr = addr; + + if (NULL == (t = kzalloc(sizeof(*t), GFP_KERNEL))) + return -ENOMEM; + + t->client = client_template; + t->std = 0; + t->radio_mode = V4L2_TUNER_MODE_STEREO; + + tda9887_info("chip found @ 0x%x (%s)\n", addr<<1, adap->name); + + i2c_set_clientdata(&t->client, t); + i2c_attach_client(&t->client); + + return 0; } -static int tda9887_get_afc(struct i2c_client *client) +static int tda9887_probe(struct i2c_adapter *adap) { - struct tuner *t = i2c_get_clientdata(client); - static int AFC_BITS_2_kHz[] = { - -12500, -37500, -62500, -97500, - -112500, -137500, -162500, -187500, - 187500, 162500, 137500, 112500, - 97500 , 62500, 37500 , 12500 - }; - int afc=0; - __u8 reg = 0; + if (adap->class & I2C_CLASS_TV_ANALOG) + return i2c_probe(adap, &addr_data, tda9887_attach); + return 0; +} - if (1 == i2c_master_recv(&t->i2c,®,1)) - afc = AFC_BITS_2_kHz[(reg>>1)&0x0f]; +static int tda9887_detach(struct i2c_client *client) +{ + struct tda9887 *t = i2c_get_clientdata(client); - return afc; + i2c_detach_client(client); + kfree(t); + return 0; } -static void tda9887_standby(struct i2c_client *client) +#define SWITCH_V4L2 if (!t->using_v4l2 && debug) \ + tda9887_info("switching to v4l2\n"); \ + t->using_v4l2 = 1; +#define CHECK_V4L2 if (t->using_v4l2) { if (debug) \ + tda9887_info("ignore v4l1 call\n"); \ + return 0; } + +static int +tda9887_command(struct i2c_client *client, unsigned int cmd, void *arg) { - tda9887_configure(client); + struct tda9887 *t = i2c_get_clientdata(client); + + switch (cmd) { + + /* --- configuration --- */ + case AUDC_SET_RADIO: + { + t->mode = T_RADIO; + tda9887_configure(t); + break; + } + case TUNER_SET_STANDBY: + { + t->mode = T_STANDBY; + tda9887_configure(t); + break; + } + case TDA9887_SET_CONFIG: + { + int *i = arg; + + t->config = *i; + tda9887_configure(t); + break; + } + /* --- v4l ioctls --- */ + /* take care: bttv does userspace copying, we'll get a + kernel pointer here... */ + case VIDIOCSCHAN: + { + static const v4l2_std_id map[] = { + [ VIDEO_MODE_PAL ] = V4L2_STD_PAL, + [ VIDEO_MODE_NTSC ] = V4L2_STD_NTSC_M, + [ VIDEO_MODE_SECAM ] = V4L2_STD_SECAM, + [ 4 /* bttv */ ] = V4L2_STD_PAL_M, + [ 5 /* bttv */ ] = V4L2_STD_PAL_N, + [ 6 /* bttv */ ] = V4L2_STD_NTSC_M_JP, + }; + struct video_channel *vc = arg; + + CHECK_V4L2; + t->mode = T_ANALOG_TV; + if (vc->norm < ARRAY_SIZE(map)) + t->std = map[vc->norm]; + tda9887_fixup_std(t); + tda9887_configure(t); + break; + } + case VIDIOC_S_STD: + { + v4l2_std_id *id = arg; + + SWITCH_V4L2; + t->mode = T_ANALOG_TV; + t->std = *id; + tda9887_fixup_std(t); + tda9887_configure(t); + break; + } + case VIDIOC_S_FREQUENCY: + { + struct v4l2_frequency *f = arg; + + SWITCH_V4L2; + if (V4L2_TUNER_ANALOG_TV == f->type) { + if (t->mode == T_ANALOG_TV) + return 0; + t->mode = T_ANALOG_TV; + } + if (V4L2_TUNER_RADIO == f->type) { + if (t->mode == T_RADIO) + return 0; + t->mode = T_RADIO; + } + tda9887_configure(t); + break; + } + case VIDIOC_G_TUNER: + { + static int AFC_BITS_2_kHz[] = { + -12500, -37500, -62500, -97500, + -112500, -137500, -162500, -187500, + 187500, 162500, 137500, 112500, + 97500 , 62500, 37500 , 12500 + }; + struct v4l2_tuner* tuner = arg; + + if (t->mode == T_RADIO) { + __u8 reg = 0; + tuner->afc=0; + if (1 == i2c_master_recv(&t->client,®,1)) + tuner->afc = AFC_BITS_2_kHz[(reg>>1)&0x0f]; + } + break; + } + case VIDIOC_S_TUNER: + { + struct v4l2_tuner* tuner = arg; + + if (t->mode == T_RADIO) { + t->radio_mode = tuner->audmode; + tda9887_configure (t); + } + break; + } + case VIDIOC_LOG_STATUS: + { + tda9887_info("Data bytes: b=0x%02x c=0x%02x e=0x%02x\n", t->data[1], t->data[2], t->data[3]); + break; + } + default: + /* nothing */ + break; + } + return 0; } -static void tda9887_set_freq(struct i2c_client *client, unsigned int freq) +static int tda9887_suspend(struct device * dev, pm_message_t state) { - tda9887_configure(client); + struct i2c_client *c = container_of(dev, struct i2c_client, dev); + struct tda9887 *t = i2c_get_clientdata(c); + + tda9887_dbg("suspend\n"); + return 0; } -int tda9887_tuner_init(struct i2c_client *c) +static int tda9887_resume(struct device * dev) { - struct tuner *t = i2c_get_clientdata(c); + struct i2c_client *c = container_of(dev, struct i2c_client, dev); + struct tda9887 *t = i2c_get_clientdata(c); - strlcpy(c->name, "tda9887", sizeof(c->name)); + tda9887_dbg("resume\n"); + tda9887_configure(t); + return 0; +} - tda9887_info("tda988[5/6/7] found @ 0x%x (%s)\n", t->i2c.addr, - t->i2c.driver->driver.name); +/* ----------------------------------------------------------------------- */ + +static struct i2c_driver driver = { + .id = I2C_DRIVERID_TDA9887, + .attach_adapter = tda9887_probe, + .detach_client = tda9887_detach, + .command = tda9887_command, + .driver = { + .name = "tda9887", + .suspend = tda9887_suspend, + .resume = tda9887_resume, + }, +}; +static struct i2c_client client_template = +{ + .name = "tda9887", + .driver = &driver, +}; - t->set_tv_freq = tda9887_set_freq; - t->set_radio_freq = tda9887_set_freq; - t->standby = tda9887_standby; - t->tuner_status = tda9887_tuner_status; - t->get_afc = tda9887_get_afc; +static int __init tda9887_init_module(void) +{ + return i2c_add_driver(&driver); +} - return 0; +static void __exit tda9887_cleanup_module(void) +{ + i2c_del_driver(&driver); } +module_init(tda9887_init_module); +module_exit(tda9887_cleanup_module); + /* * Overrides for Emacs so that we follow Linus's tabbing style. * --------------------------------------------------------------------------- diff --git a/drivers/media/video/tea5767.c b/drivers/media/video/tea5767.c index d1c41781c..c2b98f81c 100644 --- a/drivers/media/video/tea5767.c +++ b/drivers/media/video/tea5767.c @@ -3,7 +3,7 @@ * I2C address is allways 0xC0. * * - * Copyright (c) 2005 Mauro Carvalho Chehab (mchehab@infradead.org) + * Copyright (c) 2005 Mauro Carvalho Chehab (mchehab@brturbo.com.br) * This code is placed under the terms of the GNU General Public License * * tea5767 autodetection thanks to Torsten Seeboth and Atsushi Nakagawa diff --git a/drivers/media/video/tea6415c.c b/drivers/media/video/tea6415c.c index 523df0b8c..bb35844e3 100644 --- a/drivers/media/video/tea6415c.c +++ b/drivers/media/video/tea6415c.c @@ -26,7 +26,6 @@ Foundation, Inc., 675 Mvss Ave, Cambridge, MA 02139, USA. */ - #include #include #include @@ -37,7 +36,7 @@ static int debug = 0; /* insmod parameter */ module_param(debug, int, 0644); MODULE_PARM_DESC(debug, "Turn on/off device debugging (default:off)."); #define dprintk(args...) \ - do { if (debug) { printk("%s: %s()[%d]: ", KBUILD_MODNAME, __FUNCTION__, __LINE__); printk(args); } } while (0) + do { if (debug) { printk("%s: %s()[%d]: ", KBUILD_MODNAME, __FUNCTION__, __LINE__); printk(args); } } while (0) #define TEA6415C_NUM_INPUTS 8 #define TEA6415C_NUM_OUTPUTS 6 @@ -108,7 +107,7 @@ static int switch_matrix(struct i2c_client *client, int i, int o) { u8 byte = 0; int ret; - + dprintk("adr:0x%02x, i:%d, o:%d\n", client->addr, i, o); /* check if the pins are valid */ @@ -192,7 +191,7 @@ static int command(struct i2c_client *client, unsigned int cmd, void *arg) static struct i2c_driver driver = { .driver = { - .name = "tea6415c", + .name = "tea6415c", }, .id = I2C_DRIVERID_TEA6415C, .attach_adapter = attach, diff --git a/drivers/media/video/tea6420.c b/drivers/media/video/tea6420.c index e0ff811fa..4dcba5a4f 100644 --- a/drivers/media/video/tea6420.c +++ b/drivers/media/video/tea6420.c @@ -26,7 +26,6 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ - #include #include #include @@ -37,10 +36,10 @@ static int debug = 0; /* insmod parameter */ module_param(debug, int, 0644); MODULE_PARM_DESC(debug, "Turn on/off device debugging (default:off)."); #define dprintk(args...) \ - do { if (debug) { printk("%s: %s()[%d]: ", KBUILD_MODNAME, __FUNCTION__, __LINE__); printk(args); } } while (0) + do { if (debug) { printk("%s: %s()[%d]: ", KBUILD_MODNAME, __FUNCTION__, __LINE__); printk(args); } } while (0) /* addresses to scan, found only at 0x4c and/or 0x4d (7-Bit) */ -static unsigned short normal_i2c[] = { I2C_ADDR_TEA6420_1, I2C_ADDR_TEA6420_2, I2C_CLIENT_END }; +static unsigned short normal_i2c[] = { I2C_TEA6420_1, I2C_TEA6420_2, I2C_CLIENT_END }; /* magic definition of all other variables and things */ I2C_CLIENT_INSMOD; @@ -84,7 +83,7 @@ static int tea6420_switch(struct i2c_client *client, int i, int o, int g) dprintk("i2c_smbus_write_byte() failed, ret:%d\n", ret); return -EIO; } - + return 0; } @@ -168,7 +167,7 @@ static int command(struct i2c_client *client, unsigned int cmd, void *arg) static struct i2c_driver driver = { .driver = { - .name = "tea6420", + .name = "tea6420", }, .id = I2C_DRIVERID_TEA6420, .attach_adapter = attach, diff --git a/drivers/media/video/tea6420.h b/drivers/media/video/tea6420.h index 5ef7c18e0..ea664df15 100644 --- a/drivers/media/video/tea6420.h +++ b/drivers/media/video/tea6420.h @@ -2,8 +2,8 @@ #define __INCLUDED_TEA6420__ /* possible addresses */ -#define I2C_ADDR_TEA6420_1 0x4c -#define I2C_ADDR_TEA6420_2 0x4d +#define I2C_TEA6420_1 0x4c +#define I2C_TEA6420_2 0x4d struct tea6420_multiplex { diff --git a/drivers/media/video/tuner-3036.c b/drivers/media/video/tuner-3036.c index bdf506e6a..c4a78e7a5 100644 --- a/drivers/media/video/tuner-3036.c +++ b/drivers/media/video/tuner-3036.c @@ -5,7 +5,7 @@ * * The SAB3036 is just about different enough from the chips that * tuner.c copes with to make it not worth the effort to crowbar - * the support into that file. So instead we have a separate driver. + * the support into that file. So instead we have a separate driver. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -25,7 +25,6 @@ #include #include -#include #include @@ -57,15 +56,15 @@ tuner_getstatus (struct i2c_client *c) #define TUNER_FL 0x80 -static int +static int tuner_islocked (struct i2c_client *c) { - return (tuner_getstatus(c) & TUNER_FL); + return (tuner_getstatus(c) & TUNER_FL); } /* ---------------------------------------------------------------------- */ -static void +static void set_tv_freq(struct i2c_client *c, int freq) { u16 div = ((freq * 20) / 16); @@ -74,26 +73,26 @@ set_tv_freq(struct i2c_client *c, int freq) if (debug) printk(KERN_DEBUG "tuner: setting frequency %dMHz, divisor %x\n", freq / 16, div); - + /* Select high tuning current */ buffer[0] = 0x29; buffer[1] = 0x3e; if (i2c_master_send(c, buffer, 2) != 2) printk("tuner: i2c i/o error 1\n"); - + buffer[0] = 0x80 | ((div>>8) & 0x7f); buffer[1] = div & 0xff; if (i2c_master_send(c, buffer, 2) != 2) printk("tuner: i2c i/o error 2\n"); - + while (!tuner_islocked(c) && time_before(jiffies, give_up)) schedule(); - + if (!tuner_islocked(c)) printk(KERN_WARNING "tuner: failed to achieve PLL lock\n"); - + /* Select low tuning current and engage AFC */ buffer[0] = 0x29; buffer[1] = 0xb2; @@ -107,7 +106,7 @@ set_tv_freq(struct i2c_client *c, int freq) /* ---------------------------------------------------------------------- */ -static int +static int tuner_attach(struct i2c_adapter *adap, int addr, int kind) { static unsigned char buffer[] = { 0x29, 0x32, 0x2a, 0, 0x2b, 0 }; @@ -117,18 +116,18 @@ tuner_attach(struct i2c_adapter *adap, int addr, int kind) if (this_adap > 0) return -1; this_adap++; - - client_template.adapter = adap; - client_template.addr = addr; + + client_template.adapter = adap; + client_template.addr = addr; client = kmalloc(sizeof(struct i2c_client), GFP_KERNEL); - if (client == NULL) - return -ENOMEM; - memcpy(client, &client_template, sizeof(struct i2c_client)); + if (client == NULL) + return -ENOMEM; + memcpy(client, &client_template, sizeof(struct i2c_client)); printk("tuner: SAB3036 found, status %02x\n", tuner_getstatus(client)); - i2c_attach_client(client); + i2c_attach_client(client); if (i2c_master_send(client, buffer, 2) != 2) printk("tuner: i2c i/o error 1\n"); @@ -139,30 +138,30 @@ tuner_attach(struct i2c_adapter *adap, int addr, int kind) return 0; } -static int +static int tuner_detach(struct i2c_client *c) { return 0; } -static int +static int tuner_command(struct i2c_client *client, unsigned int cmd, void *arg) { int *iarg = (int*)arg; - switch (cmd) + switch (cmd) { case VIDIOCSFREQ: set_tv_freq(client, *iarg); break; - + default: return -EINVAL; } return 0; } -static int +static int tuner_probe(struct i2c_adapter *adap) { this_adap = 0; @@ -173,8 +172,8 @@ tuner_probe(struct i2c_adapter *adap) /* ----------------------------------------------------------------------- */ -static struct i2c_driver -i2c_driver_tuner = +static struct i2c_driver +i2c_driver_tuner = { .driver = { .name = "sab3036", @@ -187,7 +186,7 @@ i2c_driver_tuner = static struct i2c_client client_template = { - .driver = &i2c_driver_tuner, + .driver = &i2c_driver_tuner, .name = "SAB3036", }; diff --git a/drivers/media/video/tuner-core.c b/drivers/media/video/tuner-core.c index 40590bae5..b6101bf44 100644 --- a/drivers/media/video/tuner-core.c +++ b/drivers/media/video/tuner-core.c @@ -21,6 +21,7 @@ #include #include +#include #define UNSET (-1U) @@ -40,6 +41,7 @@ static unsigned int no_autodetect = 0; static unsigned int show_i2c = 0; /* insmod options used at runtime => read/write */ +static unsigned int tuner_debug_old = 0; int tuner_debug = 0; static unsigned int tv_range[2] = { 44, 958 }; @@ -53,6 +55,8 @@ static char ntsc[] = "-"; module_param(addr, int, 0444); module_param(no_autodetect, int, 0444); module_param(show_i2c, int, 0444); +/* Note: tuner_debug is deprecated and will be removed in 2.6.17 */ +module_param_named(tuner_debug,tuner_debug_old, int, 0444); module_param_named(debug,tuner_debug, int, 0644); module_param_string(pal, pal, sizeof(pal), 0644); module_param_string(secam, secam, sizeof(secam), 0644); @@ -169,6 +173,7 @@ static void set_type(struct i2c_client *c, unsigned int type, } t->type = type; + switch (t->type) { case TUNER_MT2032: microtune_init(c); @@ -196,6 +201,14 @@ static void set_type(struct i2c_client *c, unsigned int type, i2c_master_send(c, buffer, 4); default_tuner_init(c); break; + case TUNER_LG_TDVS_H062F: + /* Set the Auxiliary Byte. */ + buffer[2] &= ~0x20; + buffer[2] |= 0x18; + buffer[3] = 0x20; + i2c_master_send(c, buffer, 4); + default_tuner_init(c); + break; case TUNER_PHILIPS_TD1316: buffer[0] = 0x0b; buffer[1] = 0xdc; @@ -204,9 +217,6 @@ static void set_type(struct i2c_client *c, unsigned int type, i2c_master_send(c,buffer,4); default_tuner_init(c); break; - case TUNER_TDA9887: - tda9887_tuner_init(c); - break; default: default_tuner_init(c); break; @@ -233,8 +243,6 @@ static void set_addr(struct i2c_client *c, struct tuner_setup *tun_setup) { struct tuner *t = i2c_get_clientdata(c); - tuner_dbg("set addr for type %i\n", t->type); - if ( t->type == UNSET && ((tun_setup->addr == ADDR_UNSET && (t->mode_mask & tun_setup->mode_mask)) || tun_setup->addr == c->addr)) { @@ -395,20 +403,19 @@ static void tuner_status(struct i2c_client *client) } tuner_info("Tuner mode: %s\n", p); tuner_info("Frequency: %lu.%02lu MHz\n", freq, freq_fraction); - tuner_info("Standard: 0x%08lx\n", (unsigned long)t->std); - if (t->mode != V4L2_TUNER_RADIO) - return; - if (t->has_signal) { - tuner_info("Signal strength: %d\n", t->has_signal(client)); - } - if (t->is_stereo) { - tuner_info("Stereo: %s\n", t->is_stereo(client) ? "yes" : "no"); + tuner_info("Standard: 0x%08llx\n", t->std); + if (t->mode == V4L2_TUNER_RADIO) { + if (t->has_signal) { + tuner_info("Signal strength: %d\n", t->has_signal(client)); + } + if (t->is_stereo) { + tuner_info("Stereo: %s\n", t->is_stereo(client) ? "yes" : "no"); + } } } - /* ---------------------------------------------------------------------- */ -/* static vars: used only in tuner_attach and tuner_probe */ +/* static var Used only in tuner_attach and tuner_probe */ static unsigned default_mode_mask; /* During client attach, set_type is called by adapter's attach_inform callback. @@ -430,7 +437,11 @@ static int tuner_attach(struct i2c_adapter *adap, int addr, int kind) t->radio_if2 = 10700 * 1000; /* 10.7MHz - FM radio */ t->audmode = V4L2_TUNER_MODE_STEREO; t->mode_mask = T_UNINITIALIZED; - t->tuner_status = tuner_status; + if (tuner_debug_old) { + tuner_debug = tuner_debug_old; + printk(KERN_ERR "tuner: tuner_debug is deprecated and will be removed in 2.6.17.\n"); + printk(KERN_ERR "tuner: use the debug option instead.\n"); + } if (show_i2c) { unsigned char buffer[16]; @@ -452,14 +463,10 @@ static int tuner_attach(struct i2c_adapter *adap, int addr, int kind) case 0x4b: /* If chip is not tda8290, don't register. since it can be tda9887*/ - if (tda8290_probe(&t->i2c) == 0) { - tuner_dbg("chip at addr %x is a tda8290\n", addr); - } else { - /* Default is being tda9887 */ - t->type = TUNER_TDA9887; - t->mode_mask = T_RADIO | T_ANALOG_TV | T_DIGITAL_TV; - t->mode = T_STANDBY; - goto register_client; + if (tda8290_probe(&t->i2c) != 0) { + tuner_dbg("chip at addr %x is not a tda8290\n", addr); + kfree(t); + return 0; } break; case 0x60: @@ -552,10 +559,10 @@ static inline int set_mode(struct i2c_client *client, struct tuner *t, int mode, static inline int check_v4l2(struct tuner *t) { - /* bttv still uses both v4l1 and v4l2 calls to the tuner (v4l2 for - TV, v4l1 for radio), until that is fixed this code is disabled. - Otherwise the radio (v4l1) wouldn't tune after using the TV (v4l2) - first. */ + if (t->using_v4l2) { + tuner_dbg ("ignore v4l1 call\n"); + return EINVAL; + } return 0; } @@ -586,11 +593,9 @@ static int tuner_command(struct i2c_client *client, unsigned int cmd, void *arg) case TUNER_SET_STANDBY: if (check_mode(t, "TUNER_SET_STANDBY") == EINVAL) return 0; - t->mode = T_STANDBY; if (t->standby) t->standby (client); break; -#ifdef CONFIG_VIDEO_V4L1 case VIDIOCSAUDIO: if (check_mode(t, "VIDIOCSAUDIO") == EINVAL) return 0; @@ -600,6 +605,9 @@ static int tuner_command(struct i2c_client *client, unsigned int cmd, void *arg) /* Should be implemented, since bttv calls it */ tuner_dbg("VIDIOCSAUDIO not implemented.\n"); break; + /* --- v4l ioctls --- */ + /* take care: bttv does userspace copying, we'll get a + kernel pointer here... */ case VIDIOCSCHAN: { static const v4l2_std_id map[] = { @@ -683,18 +691,7 @@ static int tuner_command(struct i2c_client *client, unsigned int cmd, void *arg) ? VIDEO_SOUND_STEREO : VIDEO_SOUND_MONO; return 0; } -#endif - case TDA9887_SET_CONFIG: - if (t->type == TUNER_TDA9887) { - int *i = arg; - t->tda9887_config = *i; - set_freq(client, t->tv_freq); - } - break; - /* --- v4l ioctls --- */ - /* take care: bttv does userspace copying, we'll get a - kernel pointer here... */ case VIDIOC_S_STD: { v4l2_std_id *id = arg; @@ -715,10 +712,14 @@ static int tuner_command(struct i2c_client *client, unsigned int cmd, void *arg) { struct v4l2_frequency *f = arg; - if (set_mode (client, t, f->type, "VIDIOC_S_FREQUENCY") - == EINVAL) - return 0; switch_v4l2(); + if ((V4L2_TUNER_RADIO == f->type && V4L2_TUNER_RADIO != t->mode) + || (V4L2_TUNER_DIGITAL_TV == f->type + && V4L2_TUNER_DIGITAL_TV != t->mode)) { + if (set_mode (client, t, f->type, "VIDIOC_S_FREQUENCY") + == EINVAL) + return 0; + } set_freq(client,f->frequency); break; @@ -743,33 +744,33 @@ static int tuner_command(struct i2c_client *client, unsigned int cmd, void *arg) return 0; switch_v4l2(); - tuner->type = t->mode; - if (t->get_afc) - tuner->afc=t->get_afc(client); - if (t->mode == V4L2_TUNER_ANALOG_TV) - tuner->capability |= V4L2_TUNER_CAP_NORM; - if (t->mode != V4L2_TUNER_RADIO) { - tuner->rangelow = tv_range[0] * 16; - tuner->rangehigh = tv_range[1] * 16; - break; - } + if (V4L2_TUNER_RADIO == t->mode) { - /* radio mode */ - if (t->has_signal) - tuner->signal = t->has_signal(client); + if (t->has_signal) + tuner->signal = t->has_signal(client); - tuner->rxsubchans = - V4L2_TUNER_SUB_MONO | V4L2_TUNER_SUB_STEREO; - if (t->is_stereo) { - tuner->rxsubchans = t->is_stereo(client) ? - V4L2_TUNER_SUB_STEREO : V4L2_TUNER_SUB_MONO; - } + if (t->is_stereo) { + if (t->is_stereo(client)) { + tuner->rxsubchans = + V4L2_TUNER_SUB_STEREO | + V4L2_TUNER_SUB_MONO; + } else { + tuner->rxsubchans = + V4L2_TUNER_SUB_MONO; + } + } - tuner->capability |= - V4L2_TUNER_CAP_LOW | V4L2_TUNER_CAP_STEREO; - tuner->audmode = t->audmode; - tuner->rangelow = radio_range[0] * 16000; - tuner->rangehigh = radio_range[1] * 16000; + tuner->capability |= + V4L2_TUNER_CAP_LOW | V4L2_TUNER_CAP_STEREO; + + tuner->audmode = t->audmode; + + tuner->rangelow = radio_range[0] * 16000; + tuner->rangehigh = radio_range[1] * 16000; + } else { + tuner->rangelow = tv_range[0] * 16; + tuner->rangehigh = tv_range[1] * 16; + } break; } case VIDIOC_S_TUNER: @@ -781,16 +782,14 @@ static int tuner_command(struct i2c_client *client, unsigned int cmd, void *arg) switch_v4l2(); - /* do nothing unless we're a radio tuner */ - if (t->mode != V4L2_TUNER_RADIO) - break; - t->audmode = tuner->audmode; - set_radio_freq(client, t->radio_freq); + if (V4L2_TUNER_RADIO == t->mode) { + t->audmode = tuner->audmode; + set_radio_freq(client, t->radio_freq); + } break; } case VIDIOC_LOG_STATUS: - if (t->tuner_status) - t->tuner_status(client); + tuner_status(client); break; } diff --git a/drivers/media/video/tuner-simple.c b/drivers/media/video/tuner-simple.c index a17cc8e97..4f2ff1769 100644 --- a/drivers/media/video/tuner-simple.c +++ b/drivers/media/video/tuner-simple.c @@ -7,7 +7,6 @@ #include #include #include -#include static int offset = 0; module_param(offset, int, 0666); @@ -80,6 +79,17 @@ MODULE_PARM_DESC(offset,"Allows to specify an offset for tuner"); #define TUNER_PLL_LOCKED 0x40 #define TUNER_STEREO_MK3 0x04 +#define TUNER_PARAM_ANALOG 0 /* to be removed */ +/* FIXME: + * Right now, all tuners are using the first tuner_params[] array element + * for analog mode. In the future, we will be merging similar tuner + * definitions together, such that each tuner definition will have a + * tuner_params struct for each available video standard. At that point, + * TUNER_PARAM_ANALOG will be removed, and the tuner_params[] array + * element will be chosen based on the video standard in use. + * + */ + /* ---------------------------------------------------------------------- */ static int tuner_getstatus(struct i2c_client *c) @@ -106,7 +116,7 @@ static int tuner_stereo(struct i2c_client *c) switch (t->type) { case TUNER_PHILIPS_FM1216ME_MK3: - case TUNER_PHILIPS_FM1236_MK3: + case TUNER_PHILIPS_FM1236_MK3: case TUNER_PHILIPS_FM1256_IH3: case TUNER_LG_NTSC_TAPE: stereo = ((status & TUNER_SIGNAL) == TUNER_STEREO_MK3); @@ -124,80 +134,30 @@ static int tuner_stereo(struct i2c_client *c) static void default_set_tv_freq(struct i2c_client *c, unsigned int freq) { struct tuner *t = i2c_get_clientdata(c); - u8 config, cb, tuneraddr; + u8 config, tuneraddr; u16 div; struct tunertype *tun; u8 buffer[4]; int rc, IFPCoff, i, j; - enum param_type desired_type; - struct tuner_params *params; tun = &tuners[t->type]; + j = TUNER_PARAM_ANALOG; - /* IFPCoff = Video Intermediate Frequency - Vif: - 940 =16*58.75 NTSC/J (Japan) - 732 =16*45.75 M/N STD - 704 =16*44 ATSC (at DVB code) - 632 =16*39.50 I U.K. - 622.4=16*38.90 B/G D/K I, L STD - 592 =16*37.00 D China - 590 =16.36.875 B Australia - 543.2=16*33.95 L' STD - 171.2=16*10.70 FM Radio (at set_radio_freq) - */ - - if (t->std == V4L2_STD_NTSC_M_JP) { - IFPCoff = 940; - desired_type = TUNER_PARAM_TYPE_NTSC; - } else if ((t->std & V4L2_STD_MN) && - !(t->std & ~V4L2_STD_MN)) { - IFPCoff = 732; - desired_type = TUNER_PARAM_TYPE_NTSC; - } else if (t->std == V4L2_STD_SECAM_LC) { - IFPCoff = 543; - desired_type = TUNER_PARAM_TYPE_SECAM; - } else { - IFPCoff = 623; - desired_type = TUNER_PARAM_TYPE_PAL; - } - - for (j = 0; j < tun->count-1; j++) { - if (desired_type != tun->params[j].type) - continue; - break; - } - /* use default tuner_params if desired_type not available */ - if (desired_type != tun->params[j].type) { - tuner_dbg("IFPCoff = %d: tuner_params undefined for tuner %d\n", - IFPCoff,t->type); - j = 0; - } - params = &tun->params[j]; - - for (i = 0; i < params->count; i++) { - if (freq > params->ranges[i].limit) + for (i = 0; i < tun->params[j].count; i++) { + if (freq > tun->params[j].ranges[i].limit) continue; break; } - if (i == params->count) { + if (i == tun->params[j].count) { tuner_dbg("TV frequency out of range (%d > %d)", - freq, params->ranges[i - 1].limit); - freq = params->ranges[--i].limit; + freq, tun->params[j].ranges[i - 1].limit); + freq = tun->params[j].ranges[--i].limit; } - config = params->ranges[i].config; - cb = params->ranges[i].cb; - /* i == 0 -> VHF_LO - * i == 1 -> VHF_HI - * i == 2 -> UHF */ - tuner_dbg("tv: param %d, range %d\n",j,i); - - div=freq + IFPCoff + offset; - - tuner_dbg("Freq= %d.%02d MHz, V_IF=%d.%02d MHz, Offset=%d.%02d MHz, div=%0d\n", - freq / 16, freq % 16 * 100 / 16, - IFPCoff / 16, IFPCoff % 16 * 100 / 16, - offset / 16, offset % 16 * 100 / 16, - div); + config = tun->params[j].ranges[i].cb; + /* i == 0 -> VHF_LO */ + /* i == 1 -> VHF_HI */ + /* i == 2 -> UHF */ + tuner_dbg("tv: range %d\n",i); /* tv norm specific stuff for multi-norm tuners */ switch (t->type) { @@ -205,40 +165,40 @@ static void default_set_tv_freq(struct i2c_client *c, unsigned int freq) /* 0x01 -> ??? no change ??? */ /* 0x02 -> PAL BDGHI / SECAM L */ /* 0x04 -> ??? PAL others / SECAM others ??? */ - cb &= ~0x02; + config &= ~0x02; if (t->std & V4L2_STD_SECAM) - cb |= 0x02; + config |= 0x02; break; case TUNER_TEMIC_4046FM5: - cb &= ~0x0f; + config &= ~0x0f; if (t->std & V4L2_STD_PAL_BG) { - cb |= TEMIC_SET_PAL_BG; + config |= TEMIC_SET_PAL_BG; } else if (t->std & V4L2_STD_PAL_I) { - cb |= TEMIC_SET_PAL_I; + config |= TEMIC_SET_PAL_I; } else if (t->std & V4L2_STD_PAL_DK) { - cb |= TEMIC_SET_PAL_DK; + config |= TEMIC_SET_PAL_DK; } else if (t->std & V4L2_STD_SECAM_L) { - cb |= TEMIC_SET_PAL_L; + config |= TEMIC_SET_PAL_L; } break; case TUNER_PHILIPS_FQ1216ME: - cb &= ~0x0f; + config &= ~0x0f; if (t->std & (V4L2_STD_PAL_BG|V4L2_STD_PAL_DK)) { - cb |= PHILIPS_SET_PAL_BGDK; + config |= PHILIPS_SET_PAL_BGDK; } else if (t->std & V4L2_STD_PAL_I) { - cb |= PHILIPS_SET_PAL_I; + config |= PHILIPS_SET_PAL_I; } else if (t->std & V4L2_STD_SECAM_L) { - cb |= PHILIPS_SET_PAL_L; + config |= PHILIPS_SET_PAL_L; } break; @@ -248,15 +208,15 @@ static void default_set_tv_freq(struct i2c_client *c, unsigned int freq) /* 0x01 -> ATSC antenna input 2 */ /* 0x02 -> NTSC antenna input 1 */ /* 0x03 -> NTSC antenna input 2 */ - cb &= ~0x03; + config &= ~0x03; if (!(t->std & V4L2_STD_ATSC)) - cb |= 2; + config |= 2; /* FIXME: input */ break; case TUNER_MICROTUNE_4042FI5: /* Set the charge pump for fast tuning */ - config |= TUNER_CHARGE_PUMP; + tun->params[j].config |= TUNER_CHARGE_PUMP; break; case TUNER_PHILIPS_TUV1236D: @@ -268,9 +228,9 @@ static void default_set_tv_freq(struct i2c_client *c, unsigned int freq) buffer[1] = 0x00; buffer[2] = 0x17; buffer[3] = 0x00; - cb &= ~0x40; + config &= ~0x40; if (t->std & V4L2_STD_ATSC) { - cb |= 0x40; + config |= 0x40; buffer[1] = 0x04; } /* set to the correct mode (analog or digital) */ @@ -285,75 +245,56 @@ static void default_set_tv_freq(struct i2c_client *c, unsigned int freq) break; } - if (params->cb_first_if_lower_freq && div < t->last_div) { - buffer[0] = config; - buffer[1] = cb; + /* IFPCoff = Video Intermediate Frequency - Vif: + 940 =16*58.75 NTSC/J (Japan) + 732 =16*45.75 M/N STD + 704 =16*44 ATSC (at DVB code) + 632 =16*39.50 I U.K. + 622.4=16*38.90 B/G D/K I, L STD + 592 =16*37.00 D China + 590 =16.36.875 B Australia + 543.2=16*33.95 L' STD + 171.2=16*10.70 FM Radio (at set_radio_freq) + */ + + if (t->std == V4L2_STD_NTSC_M_JP) { + IFPCoff = 940; + } else if ((t->std & V4L2_STD_MN) && + !(t->std & ~V4L2_STD_MN)) { + IFPCoff = 732; + } else if (t->std == V4L2_STD_SECAM_LC) { + IFPCoff = 543; + } else { + IFPCoff = 623; + } + + div=freq + IFPCoff + offset; + + tuner_dbg("Freq= %d.%02d MHz, V_IF=%d.%02d MHz, Offset=%d.%02d MHz, div=%0d\n", + freq / 16, freq % 16 * 100 / 16, + IFPCoff / 16, IFPCoff % 16 * 100 / 16, + offset / 16, offset % 16 * 100 / 16, + div); + + if (tuners[t->type].params->cb_first_if_lower_freq && div < t->last_div) { + buffer[0] = tun->params[j].config; + buffer[1] = config; buffer[2] = (div>>8) & 0x7f; buffer[3] = div & 0xff; } else { buffer[0] = (div>>8) & 0x7f; buffer[1] = div & 0xff; - buffer[2] = config; - buffer[3] = cb; + buffer[2] = tun->params[j].config; + buffer[3] = config; } t->last_div = div; - if (params->has_tda9887) { - int config = 0; - int is_secam_l = (t->std & (V4L2_STD_SECAM_L | V4L2_STD_SECAM_LC)) && - !(t->std & ~(V4L2_STD_SECAM_L | V4L2_STD_SECAM_LC)); - - if (t->std == V4L2_STD_SECAM_LC) { - if (params->port1_active ^ params->port1_invert_for_secam_lc) - config |= TDA9887_PORT1_ACTIVE; - if (params->port2_active ^ params->port2_invert_for_secam_lc) - config |= TDA9887_PORT2_ACTIVE; - } - else { - if (params->port1_active) - config |= TDA9887_PORT1_ACTIVE; - if (params->port2_active) - config |= TDA9887_PORT2_ACTIVE; - } - if (params->intercarrier_mode) - config |= TDA9887_INTERCARRIER; - if (is_secam_l) { - if (i == 0 && params->default_top_secam_low) - config |= TDA9887_TOP(params->default_top_secam_low); - else if (i == 1 && params->default_top_secam_mid) - config |= TDA9887_TOP(params->default_top_secam_mid); - else if (params->default_top_secam_high) - config |= TDA9887_TOP(params->default_top_secam_high); - } - else { - if (i == 0 && params->default_top_low) - config |= TDA9887_TOP(params->default_top_low); - else if (i == 1 && params->default_top_mid) - config |= TDA9887_TOP(params->default_top_mid); - else if (params->default_top_high) - config |= TDA9887_TOP(params->default_top_high); - } - i2c_clients_command(c->adapter, TDA9887_SET_CONFIG, &config); - } tuner_dbg("tv 0x%02x 0x%02x 0x%02x 0x%02x\n", buffer[0],buffer[1],buffer[2],buffer[3]); if (4 != (rc = i2c_master_send(c,buffer,4))) tuner_warn("i2c i/o error: rc == %d (should be 4)\n",rc); - switch (t->type) { - case TUNER_LG_TDVS_H06XF: - /* Set the Auxiliary Byte. */ - buffer[0] = buffer[2]; - buffer[0] &= ~0x20; - buffer[0] |= 0x18; - buffer[1] = 0x20; - tuner_dbg("tv 0x%02x 0x%02x\n",buffer[0],buffer[1]); - - if (2 != (rc = i2c_master_send(c,buffer,2))) - tuner_warn("i2c i/o error: rc == %d (should be 2)\n",rc); - break; - case TUNER_MICROTUNE_4042FI5: - { + if (t->type == TUNER_MICROTUNE_4042FI5) { // FIXME - this may also work for other tuners unsigned long timeout = jiffies + msecs_to_jiffies(1); u8 status_byte = 0; @@ -372,18 +313,16 @@ static void default_set_tv_freq(struct i2c_client *c, unsigned int freq) } /* Set the charge pump for optimized phase noise figure */ - config &= ~TUNER_CHARGE_PUMP; + tun->params[j].config &= ~TUNER_CHARGE_PUMP; buffer[0] = (div>>8) & 0x7f; buffer[1] = div & 0xff; - buffer[2] = config; - buffer[3] = cb; + buffer[2] = tun->params[j].config; + buffer[3] = config; tuner_dbg("tv 0x%02x 0x%02x 0x%02x 0x%02x\n", - buffer[0],buffer[1],buffer[2],buffer[3]); + buffer[0],buffer[1],buffer[2],buffer[3]); if (4 != (rc = i2c_master_send(c,buffer,4))) tuner_warn("i2c i/o error: rc == %d (should be 4)\n",rc); - break; - } } } @@ -394,23 +333,12 @@ static void default_set_radio_freq(struct i2c_client *c, unsigned int freq) u8 buffer[4]; u16 div; int rc, j; - enum param_type desired_type = TUNER_PARAM_TYPE_RADIO; - struct tuner_params *params; tun = &tuners[t->type]; - - for (j = 0; j < tun->count-1; j++) { - if (desired_type != tun->params[j].type) - continue; - break; - } - /* use default tuner_params if desired_type not available */ - if (desired_type != tun->params[j].type) - j = 0; + j = TUNER_PARAM_ANALOG; div = (20 * freq / 16000) + (int)(20*10.7); /* IF 10.7 MHz */ - params = &tun->params[j]; - buffer[2] = (params->ranges[0].config & ~TUNER_RATIO_MASK) | TUNER_RATIO_SELECT_50; /* 50 kHz step */ + buffer[2] = (tun->params[j].config & ~TUNER_RATIO_MASK) | TUNER_RATIO_SELECT_50; /* 50 kHz step */ switch (t->type) { case TUNER_TENA_9533_DI: @@ -423,9 +351,6 @@ static void default_set_radio_freq(struct i2c_client *c, unsigned int freq) case TUNER_LG_NTSC_TAPE: buffer[3] = 0x19; break; - case TUNER_TNF_5335MF: - buffer[3] = 0x11; - break; case TUNER_PHILIPS_FM1256_IH3: div = (20 * freq) / 16000 + (int)(33.3 * 20); /* IF 33.3 MHz */ buffer[3] = 0x19; @@ -443,7 +368,7 @@ static void default_set_radio_freq(struct i2c_client *c, unsigned int freq) } buffer[0] = (div>>8) & 0x7f; buffer[1] = div & 0xff; - if (params->cb_first_if_lower_freq && div < t->last_div) { + if (tuners[t->type].params->cb_first_if_lower_freq && div < t->last_div) { buffer[0] = buffer[2]; buffer[1] = buffer[3]; buffer[2] = (div>>8) & 0x7f; @@ -457,18 +382,6 @@ static void default_set_radio_freq(struct i2c_client *c, unsigned int freq) buffer[0],buffer[1],buffer[2],buffer[3]); t->last_div = div; - if (params->has_tda9887) { - int config = 0; - if (params->port1_active && !params->port1_fm_high_sensitivity) - config |= TDA9887_PORT1_ACTIVE; - if (params->port2_active && !params->port2_fm_high_sensitivity) - config |= TDA9887_PORT2_ACTIVE; - if (params->intercarrier_mode) - config |= TDA9887_INTERCARRIER; -/* if (params->port1_set_for_fm_mono) - config &= ~TDA9887_PORT1_ACTIVE;*/ - i2c_clients_command(c->adapter, TDA9887_SET_CONFIG, &config); - } if (4 != (rc = i2c_master_send(c,buffer,4))) tuner_warn("i2c i/o error: rc == %d (should be 4)\n",rc); } diff --git a/drivers/media/video/tuner-types.c b/drivers/media/video/tuner-types.c index c37115915..1aa0ca691 100644 --- a/drivers/media/video/tuner-types.c +++ b/drivers/media/video/tuner-types.c @@ -23,25 +23,22 @@ * Each tuner_params array may contain one or more elements, one * for each video standard. * - * FIXME: tuner_params struct contains an element, tda988x. We must - * set this for all tuners that contain a tda988x chip, and then we - * can remove this setting from the various card structs. + * FIXME: Some tuner_range definitions are duplicated, and + * should be eliminated. * - * FIXME: Right now, all tuners are using the first tuner_params[] - * array element for analog mode. In the future, we will be merging - * similar tuner definitions together, such that each tuner definition - * will have a tuner_params struct for each available video standard. - * At that point, the tuner_params[] array element will be chosen - * based on the video standard in use. + * FIXME: tunertype struct contains an element, has_tda988x. + * We must set this for all tunertypes that contain a tda988x + * chip, and then we can remove this setting from the various + * card structs. */ /* 0-9 */ /* ------------ TUNER_TEMIC_PAL - TEMIC PAL ------------ */ static struct tuner_range tuner_temic_pal_ranges[] = { - { 16 * 140.25 /*MHz*/, 0x8e, 0x02, }, - { 16 * 463.25 /*MHz*/, 0x8e, 0x04, }, - { 16 * 999.99 , 0x8e, 0x01, }, + { 16 * 140.25 /*MHz*/, 0x02, }, + { 16 * 463.25 /*MHz*/, 0x04, }, + { 16 * 999.99 , 0x01, }, }; static struct tuner_params tuner_temic_pal_params[] = { @@ -49,15 +46,16 @@ static struct tuner_params tuner_temic_pal_params[] = { .type = TUNER_PARAM_TYPE_PAL, .ranges = tuner_temic_pal_ranges, .count = ARRAY_SIZE(tuner_temic_pal_ranges), + .config = 0x8e, }, }; /* ------------ TUNER_PHILIPS_PAL_I - Philips PAL_I ------------ */ static struct tuner_range tuner_philips_pal_i_ranges[] = { - { 16 * 140.25 /*MHz*/, 0x8e, 0xa0, }, - { 16 * 463.25 /*MHz*/, 0x8e, 0x90, }, - { 16 * 999.99 , 0x8e, 0x30, }, + { 16 * 140.25 /*MHz*/, 0xa0, }, + { 16 * 463.25 /*MHz*/, 0x90, }, + { 16 * 999.99 , 0x30, }, }; static struct tuner_params tuner_philips_pal_i_params[] = { @@ -65,15 +63,16 @@ static struct tuner_params tuner_philips_pal_i_params[] = { .type = TUNER_PARAM_TYPE_PAL, .ranges = tuner_philips_pal_i_ranges, .count = ARRAY_SIZE(tuner_philips_pal_i_ranges), + .config = 0x8e, }, }; /* ------------ TUNER_PHILIPS_NTSC - Philips NTSC ------------ */ static struct tuner_range tuner_philips_ntsc_ranges[] = { - { 16 * 157.25 /*MHz*/, 0x8e, 0xa0, }, - { 16 * 451.25 /*MHz*/, 0x8e, 0x90, }, - { 16 * 999.99 , 0x8e, 0x30, }, + { 16 * 157.25 /*MHz*/, 0xa0, }, + { 16 * 451.25 /*MHz*/, 0x90, }, + { 16 * 999.99 , 0x30, }, }; static struct tuner_params tuner_philips_ntsc_params[] = { @@ -81,6 +80,7 @@ static struct tuner_params tuner_philips_ntsc_params[] = { .type = TUNER_PARAM_TYPE_NTSC, .ranges = tuner_philips_ntsc_ranges, .count = ARRAY_SIZE(tuner_philips_ntsc_ranges), + .config = 0x8e, .cb_first_if_lower_freq = 1, }, }; @@ -88,9 +88,9 @@ static struct tuner_params tuner_philips_ntsc_params[] = { /* ------------ TUNER_PHILIPS_SECAM - Philips SECAM ------------ */ static struct tuner_range tuner_philips_secam_ranges[] = { - { 16 * 168.25 /*MHz*/, 0x8e, 0xa7, }, - { 16 * 447.25 /*MHz*/, 0x8e, 0x97, }, - { 16 * 999.99 , 0x8e, 0x37, }, + { 16 * 168.25 /*MHz*/, 0xa7, }, + { 16 * 447.25 /*MHz*/, 0x97, }, + { 16 * 999.99 , 0x37, }, }; static struct tuner_params tuner_philips_secam_params[] = { @@ -98,6 +98,7 @@ static struct tuner_params tuner_philips_secam_params[] = { .type = TUNER_PARAM_TYPE_SECAM, .ranges = tuner_philips_secam_ranges, .count = ARRAY_SIZE(tuner_philips_secam_ranges), + .config = 0x8e, .cb_first_if_lower_freq = 1, }, }; @@ -105,9 +106,9 @@ static struct tuner_params tuner_philips_secam_params[] = { /* ------------ TUNER_PHILIPS_PAL - Philips PAL ------------ */ static struct tuner_range tuner_philips_pal_ranges[] = { - { 16 * 168.25 /*MHz*/, 0x8e, 0xa0, }, - { 16 * 447.25 /*MHz*/, 0x8e, 0x90, }, - { 16 * 999.99 , 0x8e, 0x30, }, + { 16 * 168.25 /*MHz*/, 0xa0, }, + { 16 * 447.25 /*MHz*/, 0x90, }, + { 16 * 999.99 , 0x30, }, }; static struct tuner_params tuner_philips_pal_params[] = { @@ -115,6 +116,7 @@ static struct tuner_params tuner_philips_pal_params[] = { .type = TUNER_PARAM_TYPE_PAL, .ranges = tuner_philips_pal_ranges, .count = ARRAY_SIZE(tuner_philips_pal_ranges), + .config = 0x8e, .cb_first_if_lower_freq = 1, }, }; @@ -122,9 +124,9 @@ static struct tuner_params tuner_philips_pal_params[] = { /* ------------ TUNER_TEMIC_NTSC - TEMIC NTSC ------------ */ static struct tuner_range tuner_temic_ntsc_ranges[] = { - { 16 * 157.25 /*MHz*/, 0x8e, 0x02, }, - { 16 * 463.25 /*MHz*/, 0x8e, 0x04, }, - { 16 * 999.99 , 0x8e, 0x01, }, + { 16 * 157.25 /*MHz*/, 0x02, }, + { 16 * 463.25 /*MHz*/, 0x04, }, + { 16 * 999.99 , 0x01, }, }; static struct tuner_params tuner_temic_ntsc_params[] = { @@ -132,15 +134,16 @@ static struct tuner_params tuner_temic_ntsc_params[] = { .type = TUNER_PARAM_TYPE_NTSC, .ranges = tuner_temic_ntsc_ranges, .count = ARRAY_SIZE(tuner_temic_ntsc_ranges), + .config = 0x8e, }, }; /* ------------ TUNER_TEMIC_PAL_I - TEMIC PAL_I ------------ */ static struct tuner_range tuner_temic_pal_i_ranges[] = { - { 16 * 170.00 /*MHz*/, 0x8e, 0x02, }, - { 16 * 450.00 /*MHz*/, 0x8e, 0x04, }, - { 16 * 999.99 , 0x8e, 0x01, }, + { 16 * 170.00 /*MHz*/, 0x02, }, + { 16 * 450.00 /*MHz*/, 0x04, }, + { 16 * 999.99 , 0x01, }, }; static struct tuner_params tuner_temic_pal_i_params[] = { @@ -148,15 +151,16 @@ static struct tuner_params tuner_temic_pal_i_params[] = { .type = TUNER_PARAM_TYPE_PAL, .ranges = tuner_temic_pal_i_ranges, .count = ARRAY_SIZE(tuner_temic_pal_i_ranges), + .config = 0x8e, }, }; /* ------------ TUNER_TEMIC_4036FY5_NTSC - TEMIC NTSC ------------ */ static struct tuner_range tuner_temic_4036fy5_ntsc_ranges[] = { - { 16 * 157.25 /*MHz*/, 0x8e, 0xa0, }, - { 16 * 463.25 /*MHz*/, 0x8e, 0x90, }, - { 16 * 999.99 , 0x8e, 0x30, }, + { 16 * 157.25 /*MHz*/, 0xa0, }, + { 16 * 463.25 /*MHz*/, 0x90, }, + { 16 * 999.99 , 0x30, }, }; static struct tuner_params tuner_temic_4036fy5_ntsc_params[] = { @@ -164,15 +168,16 @@ static struct tuner_params tuner_temic_4036fy5_ntsc_params[] = { .type = TUNER_PARAM_TYPE_NTSC, .ranges = tuner_temic_4036fy5_ntsc_ranges, .count = ARRAY_SIZE(tuner_temic_4036fy5_ntsc_ranges), + .config = 0x8e, }, }; /* ------------ TUNER_ALPS_TSBH1_NTSC - TEMIC NTSC ------------ */ static struct tuner_range tuner_alps_tsb_1_ranges[] = { - { 16 * 137.25 /*MHz*/, 0x8e, 0x01, }, - { 16 * 385.25 /*MHz*/, 0x8e, 0x02, }, - { 16 * 999.99 , 0x8e, 0x08, }, + { 16 * 137.25 /*MHz*/, 0x01, }, + { 16 * 385.25 /*MHz*/, 0x02, }, + { 16 * 999.99 , 0x08, }, }; static struct tuner_params tuner_alps_tsbh1_ntsc_params[] = { @@ -180,6 +185,7 @@ static struct tuner_params tuner_alps_tsbh1_ntsc_params[] = { .type = TUNER_PARAM_TYPE_NTSC, .ranges = tuner_alps_tsb_1_ranges, .count = ARRAY_SIZE(tuner_alps_tsb_1_ranges), + .config = 0x8e, }, }; @@ -191,15 +197,16 @@ static struct tuner_params tuner_alps_tsb_1_params[] = { .type = TUNER_PARAM_TYPE_PAL, .ranges = tuner_alps_tsb_1_ranges, .count = ARRAY_SIZE(tuner_alps_tsb_1_ranges), + .config = 0x8e, }, }; /* ------------ TUNER_ALPS_TSBB5_PAL_I - Alps PAL_I ------------ */ static struct tuner_range tuner_alps_tsb_5_pal_ranges[] = { - { 16 * 133.25 /*MHz*/, 0x8e, 0x01, }, - { 16 * 351.25 /*MHz*/, 0x8e, 0x02, }, - { 16 * 999.99 , 0x8e, 0x08, }, + { 16 * 133.25 /*MHz*/, 0x01, }, + { 16 * 351.25 /*MHz*/, 0x02, }, + { 16 * 999.99 , 0x08, }, }; static struct tuner_params tuner_alps_tsbb5_params[] = { @@ -207,6 +214,7 @@ static struct tuner_params tuner_alps_tsbb5_params[] = { .type = TUNER_PARAM_TYPE_PAL, .ranges = tuner_alps_tsb_5_pal_ranges, .count = ARRAY_SIZE(tuner_alps_tsb_5_pal_ranges), + .config = 0x8e, }, }; @@ -217,6 +225,7 @@ static struct tuner_params tuner_alps_tsbe5_params[] = { .type = TUNER_PARAM_TYPE_PAL, .ranges = tuner_alps_tsb_5_pal_ranges, .count = ARRAY_SIZE(tuner_alps_tsb_5_pal_ranges), + .config = 0x8e, }, }; @@ -227,31 +236,33 @@ static struct tuner_params tuner_alps_tsbc5_params[] = { .type = TUNER_PARAM_TYPE_PAL, .ranges = tuner_alps_tsb_5_pal_ranges, .count = ARRAY_SIZE(tuner_alps_tsb_5_pal_ranges), + .config = 0x8e, }, }; /* ------------ TUNER_TEMIC_4006FH5_PAL - TEMIC PAL ------------ */ -static struct tuner_range tuner_lg_pal_ranges[] = { - { 16 * 170.00 /*MHz*/, 0x8e, 0xa0, }, - { 16 * 450.00 /*MHz*/, 0x8e, 0x90, }, - { 16 * 999.99 , 0x8e, 0x30, }, +static struct tuner_range tuner_temic_4006fh5_pal_ranges[] = { + { 16 * 170.00 /*MHz*/, 0xa0, }, + { 16 * 450.00 /*MHz*/, 0x90, }, + { 16 * 999.99 , 0x30, }, }; static struct tuner_params tuner_temic_4006fh5_params[] = { { .type = TUNER_PARAM_TYPE_PAL, - .ranges = tuner_lg_pal_ranges, - .count = ARRAY_SIZE(tuner_lg_pal_ranges), + .ranges = tuner_temic_4006fh5_pal_ranges, + .count = ARRAY_SIZE(tuner_temic_4006fh5_pal_ranges), + .config = 0x8e, }, }; /* ------------ TUNER_ALPS_TSHC6_NTSC - Alps NTSC ------------ */ static struct tuner_range tuner_alps_tshc6_ntsc_ranges[] = { - { 16 * 137.25 /*MHz*/, 0x8e, 0x14, }, - { 16 * 385.25 /*MHz*/, 0x8e, 0x12, }, - { 16 * 999.99 , 0x8e, 0x11, }, + { 16 * 137.25 /*MHz*/, 0x14, }, + { 16 * 385.25 /*MHz*/, 0x12, }, + { 16 * 999.99 , 0x11, }, }; static struct tuner_params tuner_alps_tshc6_params[] = { @@ -259,15 +270,16 @@ static struct tuner_params tuner_alps_tshc6_params[] = { .type = TUNER_PARAM_TYPE_NTSC, .ranges = tuner_alps_tshc6_ntsc_ranges, .count = ARRAY_SIZE(tuner_alps_tshc6_ntsc_ranges), + .config = 0x8e, }, }; /* ------------ TUNER_TEMIC_PAL_DK - TEMIC PAL ------------ */ static struct tuner_range tuner_temic_pal_dk_ranges[] = { - { 16 * 168.25 /*MHz*/, 0x8e, 0xa0, }, - { 16 * 456.25 /*MHz*/, 0x8e, 0x90, }, - { 16 * 999.99 , 0x8e, 0x30, }, + { 16 * 168.25 /*MHz*/, 0xa0, }, + { 16 * 456.25 /*MHz*/, 0x90, }, + { 16 * 999.99 , 0x30, }, }; static struct tuner_params tuner_temic_pal_dk_params[] = { @@ -275,15 +287,16 @@ static struct tuner_params tuner_temic_pal_dk_params[] = { .type = TUNER_PARAM_TYPE_PAL, .ranges = tuner_temic_pal_dk_ranges, .count = ARRAY_SIZE(tuner_temic_pal_dk_ranges), + .config = 0x8e, }, }; /* ------------ TUNER_PHILIPS_NTSC_M - Philips NTSC ------------ */ static struct tuner_range tuner_philips_ntsc_m_ranges[] = { - { 16 * 160.00 /*MHz*/, 0x8e, 0xa0, }, - { 16 * 454.00 /*MHz*/, 0x8e, 0x90, }, - { 16 * 999.99 , 0x8e, 0x30, }, + { 16 * 160.00 /*MHz*/, 0xa0, }, + { 16 * 454.00 /*MHz*/, 0x90, }, + { 16 * 999.99 , 0x30, }, }; static struct tuner_params tuner_philips_ntsc_m_params[] = { @@ -291,15 +304,16 @@ static struct tuner_params tuner_philips_ntsc_m_params[] = { .type = TUNER_PARAM_TYPE_NTSC, .ranges = tuner_philips_ntsc_m_ranges, .count = ARRAY_SIZE(tuner_philips_ntsc_m_ranges), + .config = 0x8e, }, }; /* ------------ TUNER_TEMIC_4066FY5_PAL_I - TEMIC PAL_I ------------ */ static struct tuner_range tuner_temic_40x6f_5_pal_ranges[] = { - { 16 * 169.00 /*MHz*/, 0x8e, 0xa0, }, - { 16 * 454.00 /*MHz*/, 0x8e, 0x90, }, - { 16 * 999.99 , 0x8e, 0x30, }, + { 16 * 169.00 /*MHz*/, 0xa0, }, + { 16 * 454.00 /*MHz*/, 0x90, }, + { 16 * 999.99 , 0x30, }, }; static struct tuner_params tuner_temic_4066fy5_pal_i_params[] = { @@ -307,6 +321,7 @@ static struct tuner_params tuner_temic_4066fy5_pal_i_params[] = { .type = TUNER_PARAM_TYPE_PAL, .ranges = tuner_temic_40x6f_5_pal_ranges, .count = ARRAY_SIZE(tuner_temic_40x6f_5_pal_ranges), + .config = 0x8e, }, }; @@ -317,6 +332,7 @@ static struct tuner_params tuner_temic_4006fn5_multi_params[] = { .type = TUNER_PARAM_TYPE_PAL, .ranges = tuner_temic_40x6f_5_pal_ranges, .count = ARRAY_SIZE(tuner_temic_40x6f_5_pal_ranges), + .config = 0x8e, }, }; @@ -324,9 +340,9 @@ static struct tuner_params tuner_temic_4006fn5_multi_params[] = { /* ------------ TUNER_TEMIC_4009FR5_PAL - TEMIC PAL ------------ */ static struct tuner_range tuner_temic_4009f_5_pal_ranges[] = { - { 16 * 141.00 /*MHz*/, 0x8e, 0xa0, }, - { 16 * 464.00 /*MHz*/, 0x8e, 0x90, }, - { 16 * 999.99 , 0x8e, 0x30, }, + { 16 * 141.00 /*MHz*/, 0xa0, }, + { 16 * 464.00 /*MHz*/, 0x90, }, + { 16 * 999.99 , 0x30, }, }; static struct tuner_params tuner_temic_4009f_5_params[] = { @@ -334,42 +350,58 @@ static struct tuner_params tuner_temic_4009f_5_params[] = { .type = TUNER_PARAM_TYPE_PAL, .ranges = tuner_temic_4009f_5_pal_ranges, .count = ARRAY_SIZE(tuner_temic_4009f_5_pal_ranges), + .config = 0x8e, }, }; /* ------------ TUNER_TEMIC_4039FR5_NTSC - TEMIC NTSC ------------ */ -static struct tuner_range tuner_temic_4x3x_f_5_ntsc_ranges[] = { - { 16 * 158.00 /*MHz*/, 0x8e, 0xa0, }, - { 16 * 453.00 /*MHz*/, 0x8e, 0x90, }, - { 16 * 999.99 , 0x8e, 0x30, }, +static struct tuner_range tuner_temic_4039fr5_ntsc_ranges[] = { + { 16 * 158.00 /*MHz*/, 0xa0, }, + { 16 * 453.00 /*MHz*/, 0x90, }, + { 16 * 999.99 , 0x30, }, }; static struct tuner_params tuner_temic_4039fr5_params[] = { { .type = TUNER_PARAM_TYPE_NTSC, - .ranges = tuner_temic_4x3x_f_5_ntsc_ranges, - .count = ARRAY_SIZE(tuner_temic_4x3x_f_5_ntsc_ranges), + .ranges = tuner_temic_4039fr5_ntsc_ranges, + .count = ARRAY_SIZE(tuner_temic_4039fr5_ntsc_ranges), + .config = 0x8e, }, }; /* ------------ TUNER_TEMIC_4046FM5 - TEMIC PAL ------------ */ +static struct tuner_range tuner_temic_4046fm5_pal_ranges[] = { + { 16 * 169.00 /*MHz*/, 0xa0, }, + { 16 * 454.00 /*MHz*/, 0x90, }, + { 16 * 999.99 , 0x30, }, +}; + static struct tuner_params tuner_temic_4046fm5_params[] = { { .type = TUNER_PARAM_TYPE_PAL, - .ranges = tuner_temic_40x6f_5_pal_ranges, - .count = ARRAY_SIZE(tuner_temic_40x6f_5_pal_ranges), + .ranges = tuner_temic_4046fm5_pal_ranges, + .count = ARRAY_SIZE(tuner_temic_4046fm5_pal_ranges), + .config = 0x8e, }, }; /* ------------ TUNER_PHILIPS_PAL_DK - Philips PAL ------------ */ +static struct tuner_range tuner_lg_pal_ranges[] = { + { 16 * 170.00 /*MHz*/, 0xa0, }, + { 16 * 450.00 /*MHz*/, 0x90, }, + { 16 * 999.99 , 0x30, }, +}; + static struct tuner_params tuner_philips_pal_dk_params[] = { { .type = TUNER_PARAM_TYPE_PAL, .ranges = tuner_lg_pal_ranges, .count = ARRAY_SIZE(tuner_lg_pal_ranges), + .config = 0x8e, }, }; @@ -380,10 +412,7 @@ static struct tuner_params tuner_philips_fq1216me_params[] = { .type = TUNER_PARAM_TYPE_PAL, .ranges = tuner_lg_pal_ranges, .count = ARRAY_SIZE(tuner_lg_pal_ranges), - .has_tda9887 = 1, - .port1_active = 1, - .port2_active = 1, - .port2_invert_for_secam_lc = 1, + .config = 0x8e, }, }; @@ -394,6 +423,7 @@ static struct tuner_params tuner_lg_pal_i_fm_params[] = { .type = TUNER_PARAM_TYPE_PAL, .ranges = tuner_lg_pal_ranges, .count = ARRAY_SIZE(tuner_lg_pal_ranges), + .config = 0x8e, }, }; @@ -404,15 +434,16 @@ static struct tuner_params tuner_lg_pal_i_params[] = { .type = TUNER_PARAM_TYPE_PAL, .ranges = tuner_lg_pal_ranges, .count = ARRAY_SIZE(tuner_lg_pal_ranges), + .config = 0x8e, }, }; /* ------------ TUNER_LG_NTSC_FM - LGINNOTEK NTSC ------------ */ static struct tuner_range tuner_lg_ntsc_fm_ranges[] = { - { 16 * 210.00 /*MHz*/, 0x8e, 0xa0, }, - { 16 * 497.00 /*MHz*/, 0x8e, 0x90, }, - { 16 * 999.99 , 0x8e, 0x30, }, + { 16 * 210.00 /*MHz*/, 0xa0, }, + { 16 * 497.00 /*MHz*/, 0x90, }, + { 16 * 999.99 , 0x30, }, }; static struct tuner_params tuner_lg_ntsc_fm_params[] = { @@ -420,6 +451,7 @@ static struct tuner_params tuner_lg_ntsc_fm_params[] = { .type = TUNER_PARAM_TYPE_NTSC, .ranges = tuner_lg_ntsc_fm_ranges, .count = ARRAY_SIZE(tuner_lg_ntsc_fm_ranges), + .config = 0x8e, }, }; @@ -430,6 +462,7 @@ static struct tuner_params tuner_lg_pal_fm_params[] = { .type = TUNER_PARAM_TYPE_PAL, .ranges = tuner_lg_pal_ranges, .count = ARRAY_SIZE(tuner_lg_pal_ranges), + .config = 0x8e, }, }; @@ -440,6 +473,7 @@ static struct tuner_params tuner_lg_pal_params[] = { .type = TUNER_PARAM_TYPE_PAL, .ranges = tuner_lg_pal_ranges, .count = ARRAY_SIZE(tuner_lg_pal_ranges), + .config = 0x8e, }, }; @@ -451,15 +485,16 @@ static struct tuner_params tuner_temic_4009_fn5_multi_pal_fm_params[] = { .type = TUNER_PARAM_TYPE_PAL, .ranges = tuner_temic_4009f_5_pal_ranges, .count = ARRAY_SIZE(tuner_temic_4009f_5_pal_ranges), + .config = 0x8e, }, }; /* ------------ TUNER_SHARP_2U5JF5540_NTSC - SHARP NTSC ------------ */ static struct tuner_range tuner_sharp_2u5jf5540_ntsc_ranges[] = { - { 16 * 137.25 /*MHz*/, 0x8e, 0x01, }, - { 16 * 317.25 /*MHz*/, 0x8e, 0x02, }, - { 16 * 999.99 , 0x8e, 0x08, }, + { 16 * 137.25 /*MHz*/, 0x01, }, + { 16 * 317.25 /*MHz*/, 0x02, }, + { 16 * 999.99 , 0x08, }, }; static struct tuner_params tuner_sharp_2u5jf5540_params[] = { @@ -467,15 +502,16 @@ static struct tuner_params tuner_sharp_2u5jf5540_params[] = { .type = TUNER_PARAM_TYPE_NTSC, .ranges = tuner_sharp_2u5jf5540_ntsc_ranges, .count = ARRAY_SIZE(tuner_sharp_2u5jf5540_ntsc_ranges), + .config = 0x8e, }, }; /* ------------ TUNER_Samsung_PAL_TCPM9091PD27 - Samsung PAL ------------ */ static struct tuner_range tuner_samsung_pal_tcpm9091pd27_ranges[] = { - { 16 * 169 /*MHz*/, 0x8e, 0xa0, }, - { 16 * 464 /*MHz*/, 0x8e, 0x90, }, - { 16 * 999.99 , 0x8e, 0x30, }, + { 16 * 169 /*MHz*/, 0xa0, }, + { 16 * 464 /*MHz*/, 0x90, }, + { 16 * 999.99 , 0x30, }, }; static struct tuner_params tuner_samsung_pal_tcpm9091pd27_params[] = { @@ -483,6 +519,7 @@ static struct tuner_params tuner_samsung_pal_tcpm9091pd27_params[] = { .type = TUNER_PARAM_TYPE_PAL, .ranges = tuner_samsung_pal_tcpm9091pd27_ranges, .count = ARRAY_SIZE(tuner_samsung_pal_tcpm9091pd27_ranges), + .config = 0x8e, }, }; @@ -493,35 +530,50 @@ static struct tuner_params tuner_temic_4106fh5_params[] = { .type = TUNER_PARAM_TYPE_PAL, .ranges = tuner_temic_4009f_5_pal_ranges, .count = ARRAY_SIZE(tuner_temic_4009f_5_pal_ranges), + .config = 0x8e, }, }; /* ------------ TUNER_TEMIC_4012FY5 - TEMIC PAL ------------ */ +static struct tuner_range tuner_temic_4012fy5_pal_ranges[] = { + { 16 * 140.25 /*MHz*/, 0x02, }, + { 16 * 463.25 /*MHz*/, 0x04, }, + { 16 * 999.99 , 0x01, }, +}; + static struct tuner_params tuner_temic_4012fy5_params[] = { { .type = TUNER_PARAM_TYPE_PAL, - .ranges = tuner_temic_pal_ranges, - .count = ARRAY_SIZE(tuner_temic_pal_ranges), + .ranges = tuner_temic_4012fy5_pal_ranges, + .count = ARRAY_SIZE(tuner_temic_4012fy5_pal_ranges), + .config = 0x8e, }, }; /* ------------ TUNER_TEMIC_4136FY5 - TEMIC NTSC ------------ */ +static struct tuner_range tuner_temic_4136_fy5_ntsc_ranges[] = { + { 16 * 158.00 /*MHz*/, 0xa0, }, + { 16 * 453.00 /*MHz*/, 0x90, }, + { 16 * 999.99 , 0x30, }, +}; + static struct tuner_params tuner_temic_4136_fy5_params[] = { { .type = TUNER_PARAM_TYPE_NTSC, - .ranges = tuner_temic_4x3x_f_5_ntsc_ranges, - .count = ARRAY_SIZE(tuner_temic_4x3x_f_5_ntsc_ranges), + .ranges = tuner_temic_4136_fy5_ntsc_ranges, + .count = ARRAY_SIZE(tuner_temic_4136_fy5_ntsc_ranges), + .config = 0x8e, }, }; /* ------------ TUNER_LG_PAL_NEW_TAPC - LGINNOTEK PAL ------------ */ static struct tuner_range tuner_lg_new_tapc_ranges[] = { - { 16 * 170.00 /*MHz*/, 0x8e, 0x01, }, - { 16 * 450.00 /*MHz*/, 0x8e, 0x02, }, - { 16 * 999.99 , 0x8e, 0x08, }, + { 16 * 170.00 /*MHz*/, 0x01, }, + { 16 * 450.00 /*MHz*/, 0x02, }, + { 16 * 999.99 , 0x08, }, }; static struct tuner_params tuner_lg_pal_new_tapc_params[] = { @@ -529,15 +581,16 @@ static struct tuner_params tuner_lg_pal_new_tapc_params[] = { .type = TUNER_PARAM_TYPE_PAL, .ranges = tuner_lg_new_tapc_ranges, .count = ARRAY_SIZE(tuner_lg_new_tapc_ranges), + .config = 0x8e, }, }; /* ------------ TUNER_PHILIPS_FM1216ME_MK3 - Philips PAL ------------ */ static struct tuner_range tuner_fm1216me_mk3_pal_ranges[] = { - { 16 * 158.00 /*MHz*/, 0x8e, 0x01, }, - { 16 * 442.00 /*MHz*/, 0x8e, 0x02, }, - { 16 * 999.99 , 0x8e, 0x04, }, + { 16 * 158.00 /*MHz*/, 0x01, }, + { 16 * 442.00 /*MHz*/, 0x02, }, + { 16 * 999.99 , 0x04, }, }; static struct tuner_params tuner_fm1216me_mk3_params[] = { @@ -545,15 +598,8 @@ static struct tuner_params tuner_fm1216me_mk3_params[] = { .type = TUNER_PARAM_TYPE_PAL, .ranges = tuner_fm1216me_mk3_pal_ranges, .count = ARRAY_SIZE(tuner_fm1216me_mk3_pal_ranges), + .config = 0x8e, .cb_first_if_lower_freq = 1, - .has_tda9887 = 1, - .port1_active = 1, - .port2_active = 1, - .port2_invert_for_secam_lc = 1, - .port1_fm_high_sensitivity = 1, - .default_top_mid = -2, - .default_top_secam_mid = -2, - .default_top_secam_high = -2, }, }; @@ -564,6 +610,7 @@ static struct tuner_params tuner_lg_ntsc_new_tapc_params[] = { .type = TUNER_PARAM_TYPE_NTSC, .ranges = tuner_lg_new_tapc_ranges, .count = ARRAY_SIZE(tuner_lg_new_tapc_ranges), + .config = 0x8e, }, }; @@ -575,15 +622,16 @@ static struct tuner_params tuner_hitachi_ntsc_params[] = { .type = TUNER_PARAM_TYPE_NTSC, .ranges = tuner_lg_new_tapc_ranges, .count = ARRAY_SIZE(tuner_lg_new_tapc_ranges), + .config = 0x8e, }, }; /* ------------ TUNER_PHILIPS_PAL_MK - Philips PAL ------------ */ static struct tuner_range tuner_philips_pal_mk_pal_ranges[] = { - { 16 * 140.25 /*MHz*/, 0x8e, 0x01, }, - { 16 * 463.25 /*MHz*/, 0x8e, 0xc2, }, - { 16 * 999.99 , 0x8e, 0xcf, }, + { 16 * 140.25 /*MHz*/, 0x01, }, + { 16 * 463.25 /*MHz*/, 0xc2, }, + { 16 * 999.99 , 0xcf, }, }; static struct tuner_params tuner_philips_pal_mk_params[] = { @@ -591,15 +639,16 @@ static struct tuner_params tuner_philips_pal_mk_params[] = { .type = TUNER_PARAM_TYPE_PAL, .ranges = tuner_philips_pal_mk_pal_ranges, .count = ARRAY_SIZE(tuner_philips_pal_mk_pal_ranges), + .config = 0x8e, }, }; /* ------------ TUNER_PHILIPS_ATSC - Philips ATSC ------------ */ static struct tuner_range tuner_philips_atsc_ranges[] = { - { 16 * 157.25 /*MHz*/, 0x8e, 0xa0, }, - { 16 * 454.00 /*MHz*/, 0x8e, 0x90, }, - { 16 * 999.99 , 0x8e, 0x30, }, + { 16 * 157.25 /*MHz*/, 0xa0, }, + { 16 * 454.00 /*MHz*/, 0x90, }, + { 16 * 999.99 , 0x30, }, }; static struct tuner_params tuner_philips_atsc_params[] = { @@ -607,15 +656,16 @@ static struct tuner_params tuner_philips_atsc_params[] = { .type = TUNER_PARAM_TYPE_NTSC, .ranges = tuner_philips_atsc_ranges, .count = ARRAY_SIZE(tuner_philips_atsc_ranges), + .config = 0x8e, }, }; /* ------------ TUNER_PHILIPS_FM1236_MK3 - Philips NTSC ------------ */ static struct tuner_range tuner_fm1236_mk3_ntsc_ranges[] = { - { 16 * 160.00 /*MHz*/, 0x8e, 0x01, }, - { 16 * 442.00 /*MHz*/, 0x8e, 0x02, }, - { 16 * 999.99 , 0x8e, 0x04, }, + { 16 * 160.00 /*MHz*/, 0x01, }, + { 16 * 442.00 /*MHz*/, 0x02, }, + { 16 * 999.99 , 0x04, }, }; static struct tuner_params tuner_fm1236_mk3_params[] = { @@ -623,21 +673,25 @@ static struct tuner_params tuner_fm1236_mk3_params[] = { .type = TUNER_PARAM_TYPE_NTSC, .ranges = tuner_fm1236_mk3_ntsc_ranges, .count = ARRAY_SIZE(tuner_fm1236_mk3_ntsc_ranges), + .config = 0x8e, .cb_first_if_lower_freq = 1, - .has_tda9887 = 1, - .port1_active = 1, - .port2_active = 1, - .port1_fm_high_sensitivity = 1, }, }; /* ------------ TUNER_PHILIPS_4IN1 - Philips NTSC ------------ */ +static struct tuner_range tuner_philips_4in1_ntsc_ranges[] = { + { 16 * 160.00 /*MHz*/, 0x01, }, + { 16 * 442.00 /*MHz*/, 0x02, }, + { 16 * 999.99 , 0x04, }, +}; + static struct tuner_params tuner_philips_4in1_params[] = { { .type = TUNER_PARAM_TYPE_NTSC, - .ranges = tuner_fm1236_mk3_ntsc_ranges, - .count = ARRAY_SIZE(tuner_fm1236_mk3_ntsc_ranges), + .ranges = tuner_philips_4in1_ntsc_ranges, + .count = ARRAY_SIZE(tuner_philips_4in1_ntsc_ranges), + .config = 0x8e, }, }; @@ -648,17 +702,16 @@ static struct tuner_params tuner_microtune_4049_fm5_params[] = { .type = TUNER_PARAM_TYPE_PAL, .ranges = tuner_temic_4009f_5_pal_ranges, .count = ARRAY_SIZE(tuner_temic_4009f_5_pal_ranges), - .has_tda9887 = 1, - .port1_invert_for_secam_lc = 1, + .config = 0x8e, }, }; /* ------------ TUNER_PANASONIC_VP27 - Panasonic NTSC ------------ */ static struct tuner_range tuner_panasonic_vp27_ntsc_ranges[] = { - { 16 * 160.00 /*MHz*/, 0xce, 0x01, }, - { 16 * 454.00 /*MHz*/, 0xce, 0x02, }, - { 16 * 999.99 , 0xce, 0x08, }, + { 16 * 160.00 /*MHz*/, 0x01, }, + { 16 * 454.00 /*MHz*/, 0x02, }, + { 16 * 999.99 , 0x08, }, }; static struct tuner_params tuner_panasonic_vp27_params[] = { @@ -666,17 +719,16 @@ static struct tuner_params tuner_panasonic_vp27_params[] = { .type = TUNER_PARAM_TYPE_NTSC, .ranges = tuner_panasonic_vp27_ntsc_ranges, .count = ARRAY_SIZE(tuner_panasonic_vp27_ntsc_ranges), - .has_tda9887 = 1, - .intercarrier_mode = 1, + .config = 0xce, }, }; /* ------------ TUNER_TNF_8831BGFF - Philips PAL ------------ */ static struct tuner_range tuner_tnf_8831bgff_pal_ranges[] = { - { 16 * 161.25 /*MHz*/, 0x8e, 0xa0, }, - { 16 * 463.25 /*MHz*/, 0x8e, 0x90, }, - { 16 * 999.99 , 0x8e, 0x30, }, + { 16 * 161.25 /*MHz*/, 0xa0, }, + { 16 * 463.25 /*MHz*/, 0x90, }, + { 16 * 999.99 , 0x30, }, }; static struct tuner_params tuner_tnf_8831bgff_params[] = { @@ -684,15 +736,16 @@ static struct tuner_params tuner_tnf_8831bgff_params[] = { .type = TUNER_PARAM_TYPE_PAL, .ranges = tuner_tnf_8831bgff_pal_ranges, .count = ARRAY_SIZE(tuner_tnf_8831bgff_pal_ranges), + .config = 0x8e, }, }; /* ------------ TUNER_MICROTUNE_4042FI5 - Microtune NTSC ------------ */ static struct tuner_range tuner_microtune_4042fi5_ntsc_ranges[] = { - { 16 * 162.00 /*MHz*/, 0x8e, 0xa2, }, - { 16 * 457.00 /*MHz*/, 0x8e, 0x94, }, - { 16 * 999.99 , 0x8e, 0x31, }, + { 16 * 162.00 /*MHz*/, 0xa2, }, + { 16 * 457.00 /*MHz*/, 0x94, }, + { 16 * 999.99 , 0x31, }, }; static struct tuner_params tuner_microtune_4042fi5_params[] = { @@ -700,6 +753,7 @@ static struct tuner_params tuner_microtune_4042fi5_params[] = { .type = TUNER_PARAM_TYPE_NTSC, .ranges = tuner_microtune_4042fi5_ntsc_ranges, .count = ARRAY_SIZE(tuner_microtune_4042fi5_ntsc_ranges), + .config = 0x8e, }, }; @@ -707,9 +761,9 @@ static struct tuner_params tuner_microtune_4042fi5_params[] = { /* ------------ TUNER_TCL_2002N - TCL NTSC ------------ */ static struct tuner_range tuner_tcl_2002n_ntsc_ranges[] = { - { 16 * 172.00 /*MHz*/, 0x8e, 0x01, }, - { 16 * 448.00 /*MHz*/, 0x8e, 0x02, }, - { 16 * 999.99 , 0x8e, 0x08, }, + { 16 * 172.00 /*MHz*/, 0x01, }, + { 16 * 448.00 /*MHz*/, 0x02, }, + { 16 * 999.99 , 0x08, }, }; static struct tuner_params tuner_tcl_2002n_params[] = { @@ -717,26 +771,34 @@ static struct tuner_params tuner_tcl_2002n_params[] = { .type = TUNER_PARAM_TYPE_NTSC, .ranges = tuner_tcl_2002n_ntsc_ranges, .count = ARRAY_SIZE(tuner_tcl_2002n_ntsc_ranges), + .config = 0x8e, .cb_first_if_lower_freq = 1, }, }; /* ------------ TUNER_PHILIPS_FM1256_IH3 - Philips PAL ------------ */ +static struct tuner_range tuner_philips_fm1256_ih3_pal_ranges[] = { + { 16 * 160.00 /*MHz*/, 0x01, }, + { 16 * 442.00 /*MHz*/, 0x02, }, + { 16 * 999.99 , 0x04, }, +}; + static struct tuner_params tuner_philips_fm1256_ih3_params[] = { { .type = TUNER_PARAM_TYPE_PAL, - .ranges = tuner_fm1236_mk3_ntsc_ranges, - .count = ARRAY_SIZE(tuner_fm1236_mk3_ntsc_ranges), + .ranges = tuner_philips_fm1256_ih3_pal_ranges, + .count = ARRAY_SIZE(tuner_philips_fm1256_ih3_pal_ranges), + .config = 0x8e, }, }; /* ------------ TUNER_THOMSON_DTT7610 - THOMSON ATSC ------------ */ static struct tuner_range tuner_thomson_dtt7610_ntsc_ranges[] = { - { 16 * 157.25 /*MHz*/, 0x8e, 0x39, }, - { 16 * 454.00 /*MHz*/, 0x8e, 0x3a, }, - { 16 * 999.99 , 0x8e, 0x3c, }, + { 16 * 157.25 /*MHz*/, 0x39, }, + { 16 * 454.00 /*MHz*/, 0x3a, }, + { 16 * 999.99 , 0x3c, }, }; static struct tuner_params tuner_thomson_dtt7610_params[] = { @@ -744,15 +806,16 @@ static struct tuner_params tuner_thomson_dtt7610_params[] = { .type = TUNER_PARAM_TYPE_NTSC, .ranges = tuner_thomson_dtt7610_ntsc_ranges, .count = ARRAY_SIZE(tuner_thomson_dtt7610_ntsc_ranges), + .config = 0x8e, }, }; /* ------------ TUNER_PHILIPS_FQ1286 - Philips NTSC ------------ */ static struct tuner_range tuner_philips_fq1286_ntsc_ranges[] = { - { 16 * 160.00 /*MHz*/, 0x8e, 0x41, }, - { 16 * 454.00 /*MHz*/, 0x8e, 0x42, }, - { 16 * 999.99 , 0x8e, 0x04, }, + { 16 * 160.00 /*MHz*/, 0x41, }, + { 16 * 454.00 /*MHz*/, 0x42, }, + { 16 * 999.99 , 0x04, }, }; static struct tuner_params tuner_philips_fq1286_params[] = { @@ -760,15 +823,16 @@ static struct tuner_params tuner_philips_fq1286_params[] = { .type = TUNER_PARAM_TYPE_NTSC, .ranges = tuner_philips_fq1286_ntsc_ranges, .count = ARRAY_SIZE(tuner_philips_fq1286_ntsc_ranges), + .config = 0x8e, }, }; /* ------------ TUNER_TCL_2002MB - TCL PAL ------------ */ static struct tuner_range tuner_tcl_2002mb_pal_ranges[] = { - { 16 * 170.00 /*MHz*/, 0xce, 0x01, }, - { 16 * 450.00 /*MHz*/, 0xce, 0x02, }, - { 16 * 999.99 , 0xce, 0x08, }, + { 16 * 170.00 /*MHz*/, 0x01, }, + { 16 * 450.00 /*MHz*/, 0x02, }, + { 16 * 999.99 , 0x08, }, }; static struct tuner_params tuner_tcl_2002mb_params[] = { @@ -776,29 +840,24 @@ static struct tuner_params tuner_tcl_2002mb_params[] = { .type = TUNER_PARAM_TYPE_PAL, .ranges = tuner_tcl_2002mb_pal_ranges, .count = ARRAY_SIZE(tuner_tcl_2002mb_pal_ranges), + .config = 0xce, }, }; /* ------------ TUNER_PHILIPS_FQ1216AME_MK4 - Philips PAL ------------ */ -static struct tuner_range tuner_philips_fq12_6a___mk4_pal_ranges[] = { - { 16 * 160.00 /*MHz*/, 0xce, 0x01, }, - { 16 * 442.00 /*MHz*/, 0xce, 0x02, }, - { 16 * 999.99 , 0xce, 0x04, }, +static struct tuner_range tuner_philips_fq12_6a___mk4_ranges[] = { + { 16 * 160.00 /*MHz*/, 0x01, }, + { 16 * 442.00 /*MHz*/, 0x02, }, + { 16 * 999.99 , 0x04, }, }; static struct tuner_params tuner_philips_fq1216ame_mk4_params[] = { { .type = TUNER_PARAM_TYPE_PAL, - .ranges = tuner_philips_fq12_6a___mk4_pal_ranges, - .count = ARRAY_SIZE(tuner_philips_fq12_6a___mk4_pal_ranges), - .has_tda9887 = 1, - .port1_active = 1, - .port2_invert_for_secam_lc = 1, - .default_top_mid = -2, - .default_top_secam_low = -2, - .default_top_secam_mid = -2, - .default_top_secam_high = -2, + .ranges = tuner_philips_fq12_6a___mk4_ranges, + .count = ARRAY_SIZE(tuner_philips_fq12_6a___mk4_ranges), + .config = 0xce, }, }; @@ -807,27 +866,35 @@ static struct tuner_params tuner_philips_fq1216ame_mk4_params[] = { static struct tuner_params tuner_philips_fq1236a_mk4_params[] = { { .type = TUNER_PARAM_TYPE_NTSC, - .ranges = tuner_fm1236_mk3_ntsc_ranges, - .count = ARRAY_SIZE(tuner_fm1236_mk3_ntsc_ranges), + .ranges = tuner_philips_fq12_6a___mk4_ranges, + .count = ARRAY_SIZE(tuner_philips_fq12_6a___mk4_ranges), + .config = 0x8e, }, }; /* ------------ TUNER_YMEC_TVF_8531MF - Philips NTSC ------------ */ +static struct tuner_range tuner_ymec_tvf_8531mf_ntsc_ranges[] = { + { 16 * 160.00 /*MHz*/, 0xa0, }, + { 16 * 454.00 /*MHz*/, 0x90, }, + { 16 * 999.99 , 0x30, }, +}; + static struct tuner_params tuner_ymec_tvf_8531mf_params[] = { { .type = TUNER_PARAM_TYPE_NTSC, - .ranges = tuner_philips_ntsc_m_ranges, - .count = ARRAY_SIZE(tuner_philips_ntsc_m_ranges), + .ranges = tuner_ymec_tvf_8531mf_ntsc_ranges, + .count = ARRAY_SIZE(tuner_ymec_tvf_8531mf_ntsc_ranges), + .config = 0x8e, }, }; /* ------------ TUNER_YMEC_TVF_5533MF - Philips NTSC ------------ */ static struct tuner_range tuner_ymec_tvf_5533mf_ntsc_ranges[] = { - { 16 * 160.00 /*MHz*/, 0x8e, 0x01, }, - { 16 * 454.00 /*MHz*/, 0x8e, 0x02, }, - { 16 * 999.99 , 0x8e, 0x04, }, + { 16 * 160.00 /*MHz*/, 0x01, }, + { 16 * 454.00 /*MHz*/, 0x02, }, + { 16 * 999.99 , 0x04, }, }; static struct tuner_params tuner_ymec_tvf_5533mf_params[] = { @@ -835,6 +902,7 @@ static struct tuner_params tuner_ymec_tvf_5533mf_params[] = { .type = TUNER_PARAM_TYPE_NTSC, .ranges = tuner_ymec_tvf_5533mf_ntsc_ranges, .count = ARRAY_SIZE(tuner_ymec_tvf_5533mf_ntsc_ranges), + .config = 0x8e, }, }; @@ -843,9 +911,9 @@ static struct tuner_params tuner_ymec_tvf_5533mf_params[] = { /* DTT 7611 7611A 7612 7613 7613A 7614 7615 7615A */ static struct tuner_range tuner_thomson_dtt761x_ntsc_ranges[] = { - { 16 * 145.25 /*MHz*/, 0x8e, 0x39, }, - { 16 * 415.25 /*MHz*/, 0x8e, 0x3a, }, - { 16 * 999.99 , 0x8e, 0x3c, }, + { 16 * 145.25 /*MHz*/, 0x39, }, + { 16 * 415.25 /*MHz*/, 0x3a, }, + { 16 * 999.99 , 0x3c, }, }; @@ -854,72 +922,70 @@ static struct tuner_params tuner_thomson_dtt761x_params[] = { .type = TUNER_PARAM_TYPE_NTSC, .ranges = tuner_thomson_dtt761x_ntsc_ranges, .count = ARRAY_SIZE(tuner_thomson_dtt761x_ntsc_ranges), + .config = 0x8e, }, }; /* ------------ TUNER_TENA_9533_DI - Philips PAL ------------ */ -static struct tuner_range tuner_tena_9533_di_pal_ranges[] = { - { 16 * 160.25 /*MHz*/, 0x8e, 0x01, }, - { 16 * 464.25 /*MHz*/, 0x8e, 0x02, }, - { 16 * 999.99 , 0x8e, 0x04, }, +static struct tuner_range tuner_tuner_tena_9533_di_pal_ranges[] = { + { 16 * 160.25 /*MHz*/, 0x01, }, + { 16 * 464.25 /*MHz*/, 0x02, }, + { 16 * 999.99 , 0x04, }, }; static struct tuner_params tuner_tena_9533_di_params[] = { { .type = TUNER_PARAM_TYPE_PAL, - .ranges = tuner_tena_9533_di_pal_ranges, - .count = ARRAY_SIZE(tuner_tena_9533_di_pal_ranges), + .ranges = tuner_tuner_tena_9533_di_pal_ranges, + .count = ARRAY_SIZE(tuner_tuner_tena_9533_di_pal_ranges), + .config = 0x8e, }, }; /* ------------ TUNER_PHILIPS_FMD1216ME_MK3 - Philips PAL ------------ */ static struct tuner_range tuner_philips_fmd1216me_mk3_pal_ranges[] = { - { 16 * 160.00 /*MHz*/, 0x86, 0x51, }, - { 16 * 442.00 /*MHz*/, 0x86, 0x52, }, - { 16 * 999.99 , 0x86, 0x54, }, + { 16 * 160.00 /*MHz*/, 0x51, }, + { 16 * 442.00 /*MHz*/, 0x52, }, + { 16 * 999.99 , 0x54, }, }; -static struct tuner_params tuner_philips_fmd1216me_mk3_params[] = { +static struct tuner_params tuner_tuner_philips_fmd1216me_mk3_params[] = { { .type = TUNER_PARAM_TYPE_PAL, .ranges = tuner_philips_fmd1216me_mk3_pal_ranges, .count = ARRAY_SIZE(tuner_philips_fmd1216me_mk3_pal_ranges), - .has_tda9887 = 1, - .port1_active = 1, - .port2_active = 1, - .port2_fm_high_sensitivity = 1, - .port2_invert_for_secam_lc = 1, - .port1_set_for_fm_mono = 1, + .config = 0x86, }, }; -/* ------ TUNER_LG_TDVS_H06XF - LG INNOTEK / INFINEON ATSC ----- */ +/* ------------ TUNER_LG_TDVS_H062F - INFINEON ATSC ------------ */ static struct tuner_range tuner_tua6034_ntsc_ranges[] = { - { 16 * 165.00 /*MHz*/, 0x8e, 0x01 }, - { 16 * 450.00 /*MHz*/, 0x8e, 0x02 }, - { 16 * 999.99 , 0x8e, 0x04 }, + { 16 * 160.00 /*MHz*/, 0x01 }, + { 16 * 455.00 /*MHz*/, 0x02 }, + { 16 * 999.99 , 0x04 }, }; -static struct tuner_params tuner_lg_tdvs_h06xf_params[] = { +static struct tuner_params tuner_tua6034_params[] = { { .type = TUNER_PARAM_TYPE_NTSC, .ranges = tuner_tua6034_ntsc_ranges, .count = ARRAY_SIZE(tuner_tua6034_ntsc_ranges), + .config = 0x8e, }, }; /* ------------ TUNER_YMEC_TVF66T5_B_DFF - Philips PAL ------------ */ static struct tuner_range tuner_ymec_tvf66t5_b_dff_pal_ranges[] = { - { 16 * 160.25 /*MHz*/, 0x8e, 0x01, }, - { 16 * 464.25 /*MHz*/, 0x8e, 0x02, }, - { 16 * 999.99 , 0x8e, 0x08, }, + { 16 * 160.25 /*MHz*/, 0x01, }, + { 16 * 464.25 /*MHz*/, 0x02, }, + { 16 * 999.99 , 0x08, }, }; static struct tuner_params tuner_ymec_tvf66t5_b_dff_params[] = { @@ -927,41 +993,33 @@ static struct tuner_params tuner_ymec_tvf66t5_b_dff_params[] = { .type = TUNER_PARAM_TYPE_PAL, .ranges = tuner_ymec_tvf66t5_b_dff_pal_ranges, .count = ARRAY_SIZE(tuner_ymec_tvf66t5_b_dff_pal_ranges), + .config = 0x8e, }, }; /* ------------ TUNER_LG_NTSC_TALN_MINI - LGINNOTEK NTSC ------------ */ -static struct tuner_range tuner_lg_taln_ntsc_ranges[] = { - { 16 * 137.25 /*MHz*/, 0x8e, 0x01, }, - { 16 * 373.25 /*MHz*/, 0x8e, 0x02, }, - { 16 * 999.99 , 0x8e, 0x08, }, -}; - -static struct tuner_range tuner_lg_taln_pal_secam_ranges[] = { - { 16 * 150.00 /*MHz*/, 0x8e, 0x01, }, - { 16 * 425.00 /*MHz*/, 0x8e, 0x02, }, - { 16 * 999.99 , 0x8e, 0x08, }, +static struct tuner_range tuner_lg_taln_mini_ntsc_ranges[] = { + { 16 * 137.25 /*MHz*/, 0x01, }, + { 16 * 373.25 /*MHz*/, 0x02, }, + { 16 * 999.99 , 0x08, }, }; -static struct tuner_params tuner_lg_taln_params[] = { +static struct tuner_params tuner_lg_taln_mini_params[] = { { .type = TUNER_PARAM_TYPE_NTSC, - .ranges = tuner_lg_taln_ntsc_ranges, - .count = ARRAY_SIZE(tuner_lg_taln_ntsc_ranges), - },{ - .type = TUNER_PARAM_TYPE_PAL, - .ranges = tuner_lg_taln_pal_secam_ranges, - .count = ARRAY_SIZE(tuner_lg_taln_pal_secam_ranges), + .ranges = tuner_lg_taln_mini_ntsc_ranges, + .count = ARRAY_SIZE(tuner_lg_taln_mini_ntsc_ranges), + .config = 0x8e, }, }; /* ------------ TUNER_PHILIPS_TD1316 - Philips PAL ------------ */ static struct tuner_range tuner_philips_td1316_pal_ranges[] = { - { 16 * 160.00 /*MHz*/, 0xc8, 0xa1, }, - { 16 * 442.00 /*MHz*/, 0xc8, 0xa2, }, - { 16 * 999.99 , 0xc8, 0xa4, }, + { 16 * 160.00 /*MHz*/, 0xa1, }, + { 16 * 442.00 /*MHz*/, 0xa2, }, + { 16 * 999.99 , 0xa4, }, }; static struct tuner_params tuner_philips_td1316_params[] = { @@ -969,42 +1027,34 @@ static struct tuner_params tuner_philips_td1316_params[] = { .type = TUNER_PARAM_TYPE_PAL, .ranges = tuner_philips_td1316_pal_ranges, .count = ARRAY_SIZE(tuner_philips_td1316_pal_ranges), + .config = 0xc8, }, }; /* ------------ TUNER_PHILIPS_TUV1236D - Philips ATSC ------------ */ static struct tuner_range tuner_tuv1236d_ntsc_ranges[] = { - { 16 * 157.25 /*MHz*/, 0xce, 0x01, }, - { 16 * 454.00 /*MHz*/, 0xce, 0x02, }, - { 16 * 999.99 , 0xce, 0x04, }, + { 16 * 157.25 /*MHz*/, 0x01, }, + { 16 * 454.00 /*MHz*/, 0x02, }, + { 16 * 999.99 , 0x04, }, }; -static struct tuner_params tuner_tuv1236d_params[] = { +static struct tuner_params tuner_tuner_tuv1236d_params[] = { { .type = TUNER_PARAM_TYPE_NTSC, .ranges = tuner_tuv1236d_ntsc_ranges, .count = ARRAY_SIZE(tuner_tuv1236d_ntsc_ranges), + .config = 0xce, }, }; -/* ------------ TUNER_TNF_xxx5 - Texas Instruments--------- */ -/* This is known to work with Tenna TVF58t5-MFF and TVF5835 MFF - * but it is expected to work also with other Tenna/Ymec - * models based on TI SN 761677 chip on both PAL and NTSC - */ - -static struct tuner_range tuner_tnf_5335_d_if_pal_ranges[] = { - { 16 * 168.25 /*MHz*/, 0x8e, 0x01, }, - { 16 * 471.25 /*MHz*/, 0x8e, 0x02, }, - { 16 * 999.99 , 0x8e, 0x08, }, -}; +/* ------------ TUNER_TNF_5335MF - Philips NTSC ------------ */ static struct tuner_range tuner_tnf_5335mf_ntsc_ranges[] = { - { 16 * 169.25 /*MHz*/, 0x8e, 0x01, }, - { 16 * 469.25 /*MHz*/, 0x8e, 0x02, }, - { 16 * 999.99 , 0x8e, 0x08, }, + { 16 * 157.25 /*MHz*/, 0x01, }, + { 16 * 454.00 /*MHz*/, 0x02, }, + { 16 * 999.99 , 0x04, }, }; static struct tuner_params tuner_tnf_5335mf_params[] = { @@ -1012,22 +1062,17 @@ static struct tuner_params tuner_tnf_5335mf_params[] = { .type = TUNER_PARAM_TYPE_NTSC, .ranges = tuner_tnf_5335mf_ntsc_ranges, .count = ARRAY_SIZE(tuner_tnf_5335mf_ntsc_ranges), - }, - { - .type = TUNER_PARAM_TYPE_PAL, - .ranges = tuner_tnf_5335_d_if_pal_ranges, - .count = ARRAY_SIZE(tuner_tnf_5335_d_if_pal_ranges), + .config = 0x8e, }, }; /* 70-79 */ /* ------------ TUNER_SAMSUNG_TCPN_2121P30A - Samsung NTSC ------------ */ -/* '+ 4' turns on the Low Noise Amplifier */ static struct tuner_range tuner_samsung_tcpn_2121p30a_ntsc_ranges[] = { - { 16 * 130.00 /*MHz*/, 0xce, 0x01 + 4, }, - { 16 * 364.50 /*MHz*/, 0xce, 0x02 + 4, }, - { 16 * 999.99 , 0xce, 0x08 + 4, }, + { 16 * 130.00 /*MHz*/, 0x01, }, + { 16 * 364.50 /*MHz*/, 0x02, }, + { 16 * 999.99 , 0x08, }, }; static struct tuner_params tuner_samsung_tcpn_2121p30a_params[] = { @@ -1035,44 +1080,7 @@ static struct tuner_params tuner_samsung_tcpn_2121p30a_params[] = { .type = TUNER_PARAM_TYPE_NTSC, .ranges = tuner_samsung_tcpn_2121p30a_ntsc_ranges, .count = ARRAY_SIZE(tuner_samsung_tcpn_2121p30a_ntsc_ranges), - .has_tda9887 = 1, - }, -}; - -/* ------------ TUNER_THOMSON_FE6600 - DViCO Hybrid PAL ------------ */ - -static struct tuner_range tuner_thomson_fe6600_ranges[] = { - { 16 * 160.00 /*MHz*/, 0xfe, 0x11, }, - { 16 * 442.00 /*MHz*/, 0xf6, 0x12, }, - { 16 * 999.99 , 0xf6, 0x18, }, -}; - -static struct tuner_params tuner_thomson_fe6600_params[] = { - { - .type = TUNER_PARAM_TYPE_PAL, - .ranges = tuner_thomson_fe6600_ranges, - .count = ARRAY_SIZE(tuner_thomson_fe6600_ranges), - }, -}; - -/* ------------ TUNER_SAMSUNG_TCPG_6121P30A - Samsung PAL ------------ */ - -/* '+ 4' turns on the Low Noise Amplifier */ -static struct tuner_range tuner_samsung_tcpg_6121p30a_pal_ranges[] = { - { 16 * 146.25 /*MHz*/, 0xce, 0x01 + 4, }, - { 16 * 428.50 /*MHz*/, 0xce, 0x02 + 4, }, - { 16 * 999.99 , 0xce, 0x08 + 4, }, -}; - -static struct tuner_params tuner_samsung_tcpg_6121p30a_params[] = { - { - .type = TUNER_PARAM_TYPE_PAL, - .ranges = tuner_samsung_tcpg_6121p30a_pal_ranges, - .count = ARRAY_SIZE(tuner_samsung_tcpg_6121p30a_pal_ranges), - .has_tda9887 = 1, - .port1_active = 1, - .port2_active = 1, - .port2_invert_for_secam_lc = 1, + .config = 0xce, }, }; @@ -1083,22 +1091,18 @@ struct tunertype tuners[] = { [TUNER_TEMIC_PAL] = { /* TEMIC PAL */ .name = "Temic PAL (4002 FH5)", .params = tuner_temic_pal_params, - .count = ARRAY_SIZE(tuner_temic_pal_params), }, [TUNER_PHILIPS_PAL_I] = { /* Philips PAL_I */ .name = "Philips PAL_I (FI1246 and compatibles)", .params = tuner_philips_pal_i_params, - .count = ARRAY_SIZE(tuner_philips_pal_i_params), }, [TUNER_PHILIPS_NTSC] = { /* Philips NTSC */ .name = "Philips NTSC (FI1236,FM1236 and compatibles)", .params = tuner_philips_ntsc_params, - .count = ARRAY_SIZE(tuner_philips_ntsc_params), }, [TUNER_PHILIPS_SECAM] = { /* Philips SECAM */ .name = "Philips (SECAM+PAL_BG) (FI1216MF, FM1216MF, FR1216MF)", .params = tuner_philips_secam_params, - .count = ARRAY_SIZE(tuner_philips_secam_params), }, [TUNER_ABSENT] = { /* Tuner Absent */ .name = "NoTuner", @@ -1106,148 +1110,120 @@ struct tunertype tuners[] = { [TUNER_PHILIPS_PAL] = { /* Philips PAL */ .name = "Philips PAL_BG (FI1216 and compatibles)", .params = tuner_philips_pal_params, - .count = ARRAY_SIZE(tuner_philips_pal_params), }, [TUNER_TEMIC_NTSC] = { /* TEMIC NTSC */ .name = "Temic NTSC (4032 FY5)", .params = tuner_temic_ntsc_params, - .count = ARRAY_SIZE(tuner_temic_ntsc_params), }, [TUNER_TEMIC_PAL_I] = { /* TEMIC PAL_I */ .name = "Temic PAL_I (4062 FY5)", .params = tuner_temic_pal_i_params, - .count = ARRAY_SIZE(tuner_temic_pal_i_params), }, [TUNER_TEMIC_4036FY5_NTSC] = { /* TEMIC NTSC */ .name = "Temic NTSC (4036 FY5)", .params = tuner_temic_4036fy5_ntsc_params, - .count = ARRAY_SIZE(tuner_temic_4036fy5_ntsc_params), }, [TUNER_ALPS_TSBH1_NTSC] = { /* TEMIC NTSC */ .name = "Alps HSBH1", .params = tuner_alps_tsbh1_ntsc_params, - .count = ARRAY_SIZE(tuner_alps_tsbh1_ntsc_params), }, /* 10-19 */ [TUNER_ALPS_TSBE1_PAL] = { /* TEMIC PAL */ .name = "Alps TSBE1", .params = tuner_alps_tsb_1_params, - .count = ARRAY_SIZE(tuner_alps_tsb_1_params), }, [TUNER_ALPS_TSBB5_PAL_I] = { /* Alps PAL_I */ .name = "Alps TSBB5", .params = tuner_alps_tsbb5_params, - .count = ARRAY_SIZE(tuner_alps_tsbb5_params), }, [TUNER_ALPS_TSBE5_PAL] = { /* Alps PAL */ .name = "Alps TSBE5", .params = tuner_alps_tsbe5_params, - .count = ARRAY_SIZE(tuner_alps_tsbe5_params), }, [TUNER_ALPS_TSBC5_PAL] = { /* Alps PAL */ .name = "Alps TSBC5", .params = tuner_alps_tsbc5_params, - .count = ARRAY_SIZE(tuner_alps_tsbc5_params), }, [TUNER_TEMIC_4006FH5_PAL] = { /* TEMIC PAL */ .name = "Temic PAL_BG (4006FH5)", .params = tuner_temic_4006fh5_params, - .count = ARRAY_SIZE(tuner_temic_4006fh5_params), }, [TUNER_ALPS_TSHC6_NTSC] = { /* Alps NTSC */ .name = "Alps TSCH6", .params = tuner_alps_tshc6_params, - .count = ARRAY_SIZE(tuner_alps_tshc6_params), }, [TUNER_TEMIC_PAL_DK] = { /* TEMIC PAL */ .name = "Temic PAL_DK (4016 FY5)", .params = tuner_temic_pal_dk_params, - .count = ARRAY_SIZE(tuner_temic_pal_dk_params), }, [TUNER_PHILIPS_NTSC_M] = { /* Philips NTSC */ .name = "Philips NTSC_M (MK2)", .params = tuner_philips_ntsc_m_params, - .count = ARRAY_SIZE(tuner_philips_ntsc_m_params), }, [TUNER_TEMIC_4066FY5_PAL_I] = { /* TEMIC PAL_I */ .name = "Temic PAL_I (4066 FY5)", .params = tuner_temic_4066fy5_pal_i_params, - .count = ARRAY_SIZE(tuner_temic_4066fy5_pal_i_params), }, [TUNER_TEMIC_4006FN5_MULTI_PAL] = { /* TEMIC PAL */ .name = "Temic PAL* auto (4006 FN5)", .params = tuner_temic_4006fn5_multi_params, - .count = ARRAY_SIZE(tuner_temic_4006fn5_multi_params), }, /* 20-29 */ [TUNER_TEMIC_4009FR5_PAL] = { /* TEMIC PAL */ .name = "Temic PAL_BG (4009 FR5) or PAL_I (4069 FR5)", .params = tuner_temic_4009f_5_params, - .count = ARRAY_SIZE(tuner_temic_4009f_5_params), }, [TUNER_TEMIC_4039FR5_NTSC] = { /* TEMIC NTSC */ .name = "Temic NTSC (4039 FR5)", .params = tuner_temic_4039fr5_params, - .count = ARRAY_SIZE(tuner_temic_4039fr5_params), }, [TUNER_TEMIC_4046FM5] = { /* TEMIC PAL */ .name = "Temic PAL/SECAM multi (4046 FM5)", .params = tuner_temic_4046fm5_params, - .count = ARRAY_SIZE(tuner_temic_4046fm5_params), }, [TUNER_PHILIPS_PAL_DK] = { /* Philips PAL */ .name = "Philips PAL_DK (FI1256 and compatibles)", .params = tuner_philips_pal_dk_params, - .count = ARRAY_SIZE(tuner_philips_pal_dk_params), }, [TUNER_PHILIPS_FQ1216ME] = { /* Philips PAL */ .name = "Philips PAL/SECAM multi (FQ1216ME)", .params = tuner_philips_fq1216me_params, - .count = ARRAY_SIZE(tuner_philips_fq1216me_params), }, [TUNER_LG_PAL_I_FM] = { /* LGINNOTEK PAL_I */ .name = "LG PAL_I+FM (TAPC-I001D)", .params = tuner_lg_pal_i_fm_params, - .count = ARRAY_SIZE(tuner_lg_pal_i_fm_params), }, [TUNER_LG_PAL_I] = { /* LGINNOTEK PAL_I */ .name = "LG PAL_I (TAPC-I701D)", .params = tuner_lg_pal_i_params, - .count = ARRAY_SIZE(tuner_lg_pal_i_params), }, [TUNER_LG_NTSC_FM] = { /* LGINNOTEK NTSC */ .name = "LG NTSC+FM (TPI8NSR01F)", .params = tuner_lg_ntsc_fm_params, - .count = ARRAY_SIZE(tuner_lg_ntsc_fm_params), }, [TUNER_LG_PAL_FM] = { /* LGINNOTEK PAL */ .name = "LG PAL_BG+FM (TPI8PSB01D)", .params = tuner_lg_pal_fm_params, - .count = ARRAY_SIZE(tuner_lg_pal_fm_params), }, [TUNER_LG_PAL] = { /* LGINNOTEK PAL */ .name = "LG PAL_BG (TPI8PSB11D)", .params = tuner_lg_pal_params, - .count = ARRAY_SIZE(tuner_lg_pal_params), }, /* 30-39 */ [TUNER_TEMIC_4009FN5_MULTI_PAL_FM] = { /* TEMIC PAL */ .name = "Temic PAL* auto + FM (4009 FN5)", .params = tuner_temic_4009_fn5_multi_pal_fm_params, - .count = ARRAY_SIZE(tuner_temic_4009_fn5_multi_pal_fm_params), }, [TUNER_SHARP_2U5JF5540_NTSC] = { /* SHARP NTSC */ .name = "SHARP NTSC_JP (2U5JF5540)", .params = tuner_sharp_2u5jf5540_params, - .count = ARRAY_SIZE(tuner_sharp_2u5jf5540_params), }, [TUNER_Samsung_PAL_TCPM9091PD27] = { /* Samsung PAL */ .name = "Samsung PAL TCPM9091PD27", .params = tuner_samsung_pal_tcpm9091pd27_params, - .count = ARRAY_SIZE(tuner_samsung_pal_tcpm9091pd27_params), }, [TUNER_MT2032] = { /* Microtune PAL|NTSC */ .name = "MT20xx universal", @@ -1255,106 +1231,86 @@ struct tunertype tuners[] = { [TUNER_TEMIC_4106FH5] = { /* TEMIC PAL */ .name = "Temic PAL_BG (4106 FH5)", .params = tuner_temic_4106fh5_params, - .count = ARRAY_SIZE(tuner_temic_4106fh5_params), }, [TUNER_TEMIC_4012FY5] = { /* TEMIC PAL */ .name = "Temic PAL_DK/SECAM_L (4012 FY5)", .params = tuner_temic_4012fy5_params, - .count = ARRAY_SIZE(tuner_temic_4012fy5_params), }, [TUNER_TEMIC_4136FY5] = { /* TEMIC NTSC */ .name = "Temic NTSC (4136 FY5)", .params = tuner_temic_4136_fy5_params, - .count = ARRAY_SIZE(tuner_temic_4136_fy5_params), }, [TUNER_LG_PAL_NEW_TAPC] = { /* LGINNOTEK PAL */ .name = "LG PAL (newer TAPC series)", .params = tuner_lg_pal_new_tapc_params, - .count = ARRAY_SIZE(tuner_lg_pal_new_tapc_params), }, [TUNER_PHILIPS_FM1216ME_MK3] = { /* Philips PAL */ .name = "Philips PAL/SECAM multi (FM1216ME MK3)", .params = tuner_fm1216me_mk3_params, - .count = ARRAY_SIZE(tuner_fm1216me_mk3_params), }, [TUNER_LG_NTSC_NEW_TAPC] = { /* LGINNOTEK NTSC */ .name = "LG NTSC (newer TAPC series)", .params = tuner_lg_ntsc_new_tapc_params, - .count = ARRAY_SIZE(tuner_lg_ntsc_new_tapc_params), }, /* 40-49 */ [TUNER_HITACHI_NTSC] = { /* HITACHI NTSC */ .name = "HITACHI V7-J180AT", .params = tuner_hitachi_ntsc_params, - .count = ARRAY_SIZE(tuner_hitachi_ntsc_params), }, [TUNER_PHILIPS_PAL_MK] = { /* Philips PAL */ .name = "Philips PAL_MK (FI1216 MK)", .params = tuner_philips_pal_mk_params, - .count = ARRAY_SIZE(tuner_philips_pal_mk_params), }, [TUNER_PHILIPS_ATSC] = { /* Philips ATSC */ .name = "Philips 1236D ATSC/NTSC dual in", .params = tuner_philips_atsc_params, - .count = ARRAY_SIZE(tuner_philips_atsc_params), }, [TUNER_PHILIPS_FM1236_MK3] = { /* Philips NTSC */ .name = "Philips NTSC MK3 (FM1236MK3 or FM1236/F)", .params = tuner_fm1236_mk3_params, - .count = ARRAY_SIZE(tuner_fm1236_mk3_params), }, [TUNER_PHILIPS_4IN1] = { /* Philips NTSC */ .name = "Philips 4 in 1 (ATI TV Wonder Pro/Conexant)", .params = tuner_philips_4in1_params, - .count = ARRAY_SIZE(tuner_philips_4in1_params), }, [TUNER_MICROTUNE_4049FM5] = { /* Microtune PAL */ .name = "Microtune 4049 FM5", .params = tuner_microtune_4049_fm5_params, - .count = ARRAY_SIZE(tuner_microtune_4049_fm5_params), }, [TUNER_PANASONIC_VP27] = { /* Panasonic NTSC */ .name = "Panasonic VP27s/ENGE4324D", .params = tuner_panasonic_vp27_params, - .count = ARRAY_SIZE(tuner_panasonic_vp27_params), }, [TUNER_LG_NTSC_TAPE] = { /* LGINNOTEK NTSC */ .name = "LG NTSC (TAPE series)", .params = tuner_fm1236_mk3_params, - .count = ARRAY_SIZE(tuner_fm1236_mk3_params), }, [TUNER_TNF_8831BGFF] = { /* Philips PAL */ .name = "Tenna TNF 8831 BGFF)", .params = tuner_tnf_8831bgff_params, - .count = ARRAY_SIZE(tuner_tnf_8831bgff_params), }, [TUNER_MICROTUNE_4042FI5] = { /* Microtune NTSC */ .name = "Microtune 4042 FI5 ATSC/NTSC dual in", .params = tuner_microtune_4042fi5_params, - .count = ARRAY_SIZE(tuner_microtune_4042fi5_params), }, /* 50-59 */ [TUNER_TCL_2002N] = { /* TCL NTSC */ .name = "TCL 2002N", .params = tuner_tcl_2002n_params, - .count = ARRAY_SIZE(tuner_tcl_2002n_params), }, [TUNER_PHILIPS_FM1256_IH3] = { /* Philips PAL */ .name = "Philips PAL/SECAM_D (FM 1256 I-H3)", .params = tuner_philips_fm1256_ih3_params, - .count = ARRAY_SIZE(tuner_philips_fm1256_ih3_params), }, [TUNER_THOMSON_DTT7610] = { /* THOMSON ATSC */ .name = "Thomson DTT 7610 (ATSC/NTSC)", .params = tuner_thomson_dtt7610_params, - .count = ARRAY_SIZE(tuner_thomson_dtt7610_params), }, [TUNER_PHILIPS_FQ1286] = { /* Philips NTSC */ .name = "Philips FQ1286", .params = tuner_philips_fq1286_params, - .count = ARRAY_SIZE(tuner_philips_fq1286_params), }, [TUNER_PHILIPS_TDA8290] = { /* Philips PAL|NTSC */ .name = "tda8290+75", @@ -1362,27 +1318,22 @@ struct tunertype tuners[] = { [TUNER_TCL_2002MB] = { /* TCL PAL */ .name = "TCL 2002MB", .params = tuner_tcl_2002mb_params, - .count = ARRAY_SIZE(tuner_tcl_2002mb_params), }, [TUNER_PHILIPS_FQ1216AME_MK4] = { /* Philips PAL */ .name = "Philips PAL/SECAM multi (FQ1216AME MK4)", .params = tuner_philips_fq1216ame_mk4_params, - .count = ARRAY_SIZE(tuner_philips_fq1216ame_mk4_params), }, [TUNER_PHILIPS_FQ1236A_MK4] = { /* Philips NTSC */ .name = "Philips FQ1236A MK4", .params = tuner_philips_fq1236a_mk4_params, - .count = ARRAY_SIZE(tuner_philips_fq1236a_mk4_params), }, [TUNER_YMEC_TVF_8531MF] = { /* Philips NTSC */ .name = "Ymec TVision TVF-8531MF/8831MF/8731MF", .params = tuner_ymec_tvf_8531mf_params, - .count = ARRAY_SIZE(tuner_ymec_tvf_8531mf_params), }, [TUNER_YMEC_TVF_5533MF] = { /* Philips NTSC */ .name = "Ymec TVision TVF-5533MF", .params = tuner_ymec_tvf_5533mf_params, - .count = ARRAY_SIZE(tuner_ymec_tvf_5533mf_params), }, /* 60-69 */ @@ -1390,12 +1341,10 @@ struct tunertype tuners[] = { /* DTT 7611 7611A 7612 7613 7613A 7614 7615 7615A */ .name = "Thomson DTT 761X (ATSC/NTSC)", .params = tuner_thomson_dtt761x_params, - .count = ARRAY_SIZE(tuner_thomson_dtt761x_params), }, [TUNER_TENA_9533_DI] = { /* Philips PAL */ .name = "Tena TNF9533-D/IF/TNF9533-B/DF", .params = tuner_tena_9533_di_params, - .count = ARRAY_SIZE(tuner_tena_9533_di_params), }, [TUNER_TEA5767] = { /* Philips RADIO */ .name = "Philips TEA5767HN FM Radio", @@ -1403,64 +1352,37 @@ struct tunertype tuners[] = { }, [TUNER_PHILIPS_FMD1216ME_MK3] = { /* Philips PAL */ .name = "Philips FMD1216ME MK3 Hybrid Tuner", - .params = tuner_philips_fmd1216me_mk3_params, - .count = ARRAY_SIZE(tuner_philips_fmd1216me_mk3_params), + .params = tuner_tuner_philips_fmd1216me_mk3_params, }, - [TUNER_LG_TDVS_H06XF] = { /* LGINNOTEK ATSC */ - .name = "LG TDVS-H06xF", /* H061F, H062F & H064F */ - .params = tuner_lg_tdvs_h06xf_params, - .count = ARRAY_SIZE(tuner_lg_tdvs_h06xf_params), + [TUNER_LG_TDVS_H062F] = { /* LGINNOTEK ATSC */ + .name = "LG TDVS-H062F/TUA6034", + .params = tuner_tua6034_params, }, [TUNER_YMEC_TVF66T5_B_DFF] = { /* Philips PAL */ .name = "Ymec TVF66T5-B/DFF", .params = tuner_ymec_tvf66t5_b_dff_params, - .count = ARRAY_SIZE(tuner_ymec_tvf66t5_b_dff_params), }, - [TUNER_LG_TALN] = { /* LGINNOTEK NTSC / PAL / SECAM */ - .name = "LG TALN series", - .params = tuner_lg_taln_params, - .count = ARRAY_SIZE(tuner_lg_taln_params), + [TUNER_LG_NTSC_TALN_MINI] = { /* LGINNOTEK NTSC */ + .name = "LG NTSC (TALN mini series)", + .params = tuner_lg_taln_mini_params, }, [TUNER_PHILIPS_TD1316] = { /* Philips PAL */ .name = "Philips TD1316 Hybrid Tuner", .params = tuner_philips_td1316_params, - .count = ARRAY_SIZE(tuner_philips_td1316_params), }, [TUNER_PHILIPS_TUV1236D] = { /* Philips ATSC */ .name = "Philips TUV1236D ATSC/NTSC dual in", - .params = tuner_tuv1236d_params, - .count = ARRAY_SIZE(tuner_tuv1236d_params), + .params = tuner_tuner_tuv1236d_params, }, - [TUNER_TNF_5335MF] = { /* Tenna PAL/NTSC */ - .name = "Tena TNF 5335 and similar models", + [TUNER_TNF_5335MF] = { /* Philips NTSC */ + .name = "Tena TNF 5335 MF", .params = tuner_tnf_5335mf_params, - .count = ARRAY_SIZE(tuner_tnf_5335mf_params), }, /* 70-79 */ [TUNER_SAMSUNG_TCPN_2121P30A] = { /* Samsung NTSC */ .name = "Samsung TCPN 2121P30A", .params = tuner_samsung_tcpn_2121p30a_params, - .count = ARRAY_SIZE(tuner_samsung_tcpn_2121p30a_params), - }, - [TUNER_XCEIVE_XC3028] = { /* Xceive 3028 */ - .name = "Xceive xc3028", - /* see xc3028.c for details */ - }, - [TUNER_THOMSON_FE6600] = { /* Thomson PAL / DVB-T */ - .name = "Thomson FE6600", - .params = tuner_thomson_fe6600_params, - .count = ARRAY_SIZE(tuner_thomson_fe6600_params), - }, - [TUNER_SAMSUNG_TCPG_6121P30A] = { /* Samsung PAL */ - .name = "Samsung TCPG 6121P30A", - .params = tuner_samsung_tcpg_6121p30a_params, - .count = ARRAY_SIZE(tuner_samsung_tcpg_6121p30a_params), - }, - [TUNER_TDA9887] = { /* Philips TDA 9887 IF PLL Demodulator. - This chip is part of some modern tuners */ - .name = "Philips TDA988[5,6,7] IF PLL Demodulator", - /* see tda9887.c for details */ }, }; diff --git a/drivers/media/video/tvaudio.c b/drivers/media/video/tvaudio.c index 936e3f746..c8e5ad0e8 100644 --- a/drivers/media/video/tvaudio.c +++ b/drivers/media/video/tvaudio.c @@ -14,6 +14,7 @@ * */ +#include #include #include #include @@ -29,10 +30,10 @@ #include #include -#include +#include #include -#include +#include "tvaudio.h" /* ---------------------------------------------------------------------- */ /* insmod args */ @@ -101,7 +102,7 @@ struct CHIPDESC { /* input switch register + values for v4l inputs */ int inputreg; - int inputmap[4]; + int inputmap[8]; int inputmute; int inputmask; }; @@ -118,10 +119,9 @@ struct CHIPSTATE { audiocmd shadow; /* current settings */ - __u16 left,right,treble,bass,muted,mode; + __u16 left,right,treble,bass,mode; int prevmode; int radio; - int input; /* thread */ pid_t tpid; @@ -130,21 +130,20 @@ struct CHIPSTATE { struct timer_list wt; int done; int watch_stereo; - int audmode; }; /* ---------------------------------------------------------------------- */ /* i2c addresses */ static unsigned short normal_i2c[] = { - I2C_ADDR_TDA8425 >> 1, - I2C_ADDR_TEA6300 >> 1, - I2C_ADDR_TEA6420 >> 1, - I2C_ADDR_TDA9840 >> 1, - I2C_ADDR_TDA985x_L >> 1, - I2C_ADDR_TDA985x_H >> 1, - I2C_ADDR_TDA9874 >> 1, - I2C_ADDR_PIC16C54 >> 1, + I2C_TDA8425 >> 1, + I2C_TEA6300 >> 1, + I2C_TEA6420 >> 1, + I2C_TDA9840 >> 1, + I2C_TDA985x_L >> 1, + I2C_TDA985x_H >> 1, + I2C_TDA9874 >> 1, + I2C_PIC16C54 >> 1, I2C_CLIENT_END }; I2C_CLIENT_INSMOD; @@ -1101,8 +1100,9 @@ static int tda8425_shift12(int val) { return (val >> 12) | 0xf0; } static int tda8425_initialize(struct CHIPSTATE *chip) { struct CHIPDESC *desc = chiplist + chip->type; - int inputmap[4] = { /* tuner */ TDA8425_S1_CH2, /* radio */ TDA8425_S1_CH1, - /* extern */ TDA8425_S1_CH1, /* intern */ TDA8425_S1_OFF}; + int inputmap[8] = { /* tuner */ TDA8425_S1_CH2, /* radio */ TDA8425_S1_CH1, + /* extern */ TDA8425_S1_CH1, /* intern */ TDA8425_S1_OFF, + /* off */ TDA8425_S1_OFF, /* on */ TDA8425_S1_CH2}; if (chip->c.adapter->id == I2C_HW_B_RIVA) { memcpy (desc->inputmap, inputmap, sizeof (inputmap)); @@ -1268,8 +1268,8 @@ static struct CHIPDESC chiplist[] = { .name = "tda9840", .id = I2C_DRIVERID_TDA9840, .insmodopt = &tda9840, - .addr_lo = I2C_ADDR_TDA9840 >> 1, - .addr_hi = I2C_ADDR_TDA9840 >> 1, + .addr_lo = I2C_TDA9840 >> 1, + .addr_hi = I2C_TDA9840 >> 1, .registers = 5, .checkit = tda9840_checkit, @@ -1285,8 +1285,8 @@ static struct CHIPDESC chiplist[] = { .id = I2C_DRIVERID_TDA9873, .checkit = tda9873_checkit, .insmodopt = &tda9873, - .addr_lo = I2C_ADDR_TDA985x_L >> 1, - .addr_hi = I2C_ADDR_TDA985x_H >> 1, + .addr_lo = I2C_TDA985x_L >> 1, + .addr_hi = I2C_TDA985x_H >> 1, .registers = 3, .flags = CHIP_HAS_INPUTSEL, @@ -1297,7 +1297,7 @@ static struct CHIPDESC chiplist[] = { .init = { 4, { TDA9873_SW, 0xa4, 0x06, 0x03 } }, .inputreg = TDA9873_SW, .inputmute = TDA9873_MUTE | TDA9873_AUTOMUTE, - .inputmap = {0xa0, 0xa2, 0xa0, 0xa0}, + .inputmap = {0xa0, 0xa2, 0xa0, 0xa0, 0xc0}, .inputmask = TDA9873_INP_MASK|TDA9873_MUTE|TDA9873_AUTOMUTE, }, @@ -1307,8 +1307,8 @@ static struct CHIPDESC chiplist[] = { .checkit = tda9874a_checkit, .initialize = tda9874a_initialize, .insmodopt = &tda9874a, - .addr_lo = I2C_ADDR_TDA9874 >> 1, - .addr_hi = I2C_ADDR_TDA9874 >> 1, + .addr_lo = I2C_TDA9874 >> 1, + .addr_hi = I2C_TDA9874 >> 1, .getmode = tda9874a_getmode, .setmode = tda9874a_setmode, @@ -1318,8 +1318,8 @@ static struct CHIPDESC chiplist[] = { .name = "tda9850", .id = I2C_DRIVERID_TDA9850, .insmodopt = &tda9850, - .addr_lo = I2C_ADDR_TDA985x_L >> 1, - .addr_hi = I2C_ADDR_TDA985x_H >> 1, + .addr_lo = I2C_TDA985x_L >> 1, + .addr_hi = I2C_TDA985x_H >> 1, .registers = 11, .getmode = tda985x_getmode, @@ -1331,8 +1331,8 @@ static struct CHIPDESC chiplist[] = { .name = "tda9855", .id = I2C_DRIVERID_TDA9855, .insmodopt = &tda9855, - .addr_lo = I2C_ADDR_TDA985x_L >> 1, - .addr_hi = I2C_ADDR_TDA985x_H >> 1, + .addr_lo = I2C_TDA985x_L >> 1, + .addr_hi = I2C_TDA985x_H >> 1, .registers = 11, .flags = CHIP_HAS_VOLUME | CHIP_HAS_BASSTREBLE, @@ -1356,8 +1356,8 @@ static struct CHIPDESC chiplist[] = { .name = "tea6300", .id = I2C_DRIVERID_TEA6300, .insmodopt = &tea6300, - .addr_lo = I2C_ADDR_TEA6300 >> 1, - .addr_hi = I2C_ADDR_TEA6300 >> 1, + .addr_lo = I2C_TEA6300 >> 1, + .addr_hi = I2C_TEA6300 >> 1, .registers = 6, .flags = CHIP_HAS_VOLUME | CHIP_HAS_BASSTREBLE | CHIP_HAS_INPUTSEL, @@ -1378,8 +1378,8 @@ static struct CHIPDESC chiplist[] = { .id = I2C_DRIVERID_TEA6300, .initialize = tea6320_initialize, .insmodopt = &tea6320, - .addr_lo = I2C_ADDR_TEA6300 >> 1, - .addr_hi = I2C_ADDR_TEA6300 >> 1, + .addr_lo = I2C_TEA6300 >> 1, + .addr_hi = I2C_TEA6300 >> 1, .registers = 8, .flags = CHIP_HAS_VOLUME | CHIP_HAS_BASSTREBLE | CHIP_HAS_INPUTSEL, @@ -1399,8 +1399,8 @@ static struct CHIPDESC chiplist[] = { .name = "tea6420", .id = I2C_DRIVERID_TEA6420, .insmodopt = &tea6420, - .addr_lo = I2C_ADDR_TEA6420 >> 1, - .addr_hi = I2C_ADDR_TEA6420 >> 1, + .addr_lo = I2C_TEA6420 >> 1, + .addr_hi = I2C_TEA6420 >> 1, .registers = 1, .flags = CHIP_HAS_INPUTSEL, @@ -1412,8 +1412,8 @@ static struct CHIPDESC chiplist[] = { .name = "tda8425", .id = I2C_DRIVERID_TDA8425, .insmodopt = &tda8425, - .addr_lo = I2C_ADDR_TDA8425 >> 1, - .addr_hi = I2C_ADDR_TDA8425 >> 1, + .addr_lo = I2C_TDA8425 >> 1, + .addr_hi = I2C_TDA8425 >> 1, .registers = 9, .flags = CHIP_HAS_VOLUME | CHIP_HAS_BASSTREBLE | CHIP_HAS_INPUTSEL, @@ -1436,8 +1436,8 @@ static struct CHIPDESC chiplist[] = { .name = "pic16c54 (PV951)", .id = I2C_DRIVERID_PIC16C54_PV9, .insmodopt = &pic16c54, - .addr_lo = I2C_ADDR_PIC16C54 >> 1, - .addr_hi = I2C_ADDR_PIC16C54>> 1, + .addr_lo = I2C_PIC16C54 >> 1, + .addr_hi = I2C_PIC16C54>> 1, .registers = 2, .flags = CHIP_HAS_INPUTSEL, @@ -1445,7 +1445,8 @@ static struct CHIPDESC chiplist[] = { .inputmap = {PIC16C54_MISC_SND_NOTMUTE|PIC16C54_MISC_SWITCH_TUNER, PIC16C54_MISC_SND_NOTMUTE|PIC16C54_MISC_SWITCH_LINE, PIC16C54_MISC_SND_NOTMUTE|PIC16C54_MISC_SWITCH_LINE, - PIC16C54_MISC_SND_MUTE}, + PIC16C54_MISC_SND_MUTE,PIC16C54_MISC_SND_MUTE, + PIC16C54_MISC_SND_NOTMUTE}, .inputmute = PIC16C54_MISC_SND_MUTE, }, { @@ -1454,8 +1455,8 @@ static struct CHIPDESC chiplist[] = { /*.id = I2C_DRIVERID_TA8874Z, */ .checkit = ta8874z_checkit, .insmodopt = &ta8874z, - .addr_lo = I2C_ADDR_TDA9840 >> 1, - .addr_hi = I2C_ADDR_TDA9840 >> 1, + .addr_lo = I2C_TDA9840 >> 1, + .addr_hi = I2C_TDA9840 >> 1, .registers = 2, .getmode = ta8874z_getmode, @@ -1513,7 +1514,6 @@ static int chip_attach(struct i2c_adapter *adap, int addr, int kind) chip->type = desc-chiplist; chip->shadow.count = desc->registers+1; chip->prevmode = -1; - chip->audmode = V4L2_TUNER_MODE_LANG1; /* register */ i2c_attach_client(&chip->c); @@ -1581,40 +1581,28 @@ static int chip_detach(struct i2c_client *client) return 0; } -static int tvaudio_set_ctrl(struct CHIPSTATE *chip, struct v4l2_control *ctrl) -{ - struct CHIPDESC *desc = chiplist + chip->type; - - switch (ctrl->id) { - case V4L2_CID_AUDIO_MUTE: - if (ctrl->value < 0 || ctrl->value >= 2) - return -ERANGE; - chip->muted = ctrl->value; - if (chip->muted) - chip_write_masked(chip,desc->inputreg,desc->inputmute,desc->inputmask); - else - chip_write_masked(chip,desc->inputreg, - desc->inputmap[chip->input],desc->inputmask); - break; - default: - return -EINVAL; - } - return 0; -} - - /* ---------------------------------------------------------------------- */ /* video4linux interface */ static int chip_command(struct i2c_client *client, unsigned int cmd, void *arg) { + __u16 *sarg = arg; struct CHIPSTATE *chip = i2c_get_clientdata(client); struct CHIPDESC *desc = chiplist + chip->type; v4l_dbg(1, debug, &chip->c, "%s: chip_command 0x%x\n", chip->c.name, cmd); switch (cmd) { + case AUDC_SET_INPUT: + if (desc->flags & CHIP_HAS_INPUTSEL) { + if (*sarg & 0x80) + chip_write_masked(chip,desc->inputreg,desc->inputmute,desc->inputmask); + else + chip_write_masked(chip,desc->inputreg,desc->inputmap[*sarg],desc->inputmask); + } + break; + case AUDC_SET_RADIO: chip->radio = 1; chip->watch_stereo = 0; @@ -1678,46 +1666,16 @@ static int chip_command(struct i2c_client *client, break; } - case VIDIOC_S_CTRL: - return tvaudio_set_ctrl(chip, arg); - - case VIDIOC_INT_G_AUDIO_ROUTING: - { - struct v4l2_routing *rt = arg; - - rt->input = chip->input; - rt->output = 0; - break; - } - - case VIDIOC_INT_S_AUDIO_ROUTING: - { - struct v4l2_routing *rt = arg; - - if (!(desc->flags & CHIP_HAS_INPUTSEL) || rt->input >= 4) - return -EINVAL; - /* There are four inputs: tuner, radio, extern and intern. */ - chip->input = rt->input; - if (chip->muted) - break; - chip_write_masked(chip, desc->inputreg, - desc->inputmap[chip->input], desc->inputmask); - break; - } - case VIDIOC_S_TUNER: { struct v4l2_tuner *vt = arg; int mode = 0; - if (chip->radio) - break; switch (vt->audmode) { case V4L2_TUNER_MODE_MONO: mode = VIDEO_SOUND_MONO; break; case V4L2_TUNER_MODE_STEREO: - case V4L2_TUNER_MODE_LANG1_LANG2: mode = VIDEO_SOUND_STEREO; break; case V4L2_TUNER_MODE_LANG1: @@ -1727,9 +1685,8 @@ static int chip_command(struct i2c_client *client, mode = VIDEO_SOUND_LANG2; break; default: - return -EINVAL; + break; } - chip->audmode = vt->audmode; if (desc->setmode && mode) { chip->watch_stereo = 0; @@ -1747,7 +1704,7 @@ static int chip_command(struct i2c_client *client, if (chip->radio) break; - vt->audmode = chip->audmode; + vt->audmode = 0; vt->rxsubchans = 0; vt->capability = V4L2_TUNER_CAP_STEREO | V4L2_TUNER_CAP_LANG1 | V4L2_TUNER_CAP_LANG2; @@ -1759,12 +1716,19 @@ static int chip_command(struct i2c_client *client, vt->rxsubchans |= V4L2_TUNER_SUB_MONO; if (mode & VIDEO_SOUND_STEREO) vt->rxsubchans |= V4L2_TUNER_SUB_STEREO; - /* Note: for SAP it should be mono/lang2 or stereo/lang2. - When this module is converted fully to v4l2, then this - should change for those chips that can detect SAP. */ if (mode & VIDEO_SOUND_LANG1) - vt->rxsubchans = V4L2_TUNER_SUB_LANG1 | - V4L2_TUNER_SUB_LANG2; + vt->rxsubchans |= V4L2_TUNER_SUB_LANG1 | + V4L2_TUNER_SUB_LANG2; + + mode = chip->mode; + if (mode & VIDEO_SOUND_MONO) + vt->audmode = V4L2_TUNER_MODE_MONO; + if (mode & VIDEO_SOUND_STEREO) + vt->audmode = V4L2_TUNER_MODE_STEREO; + if (mode & VIDEO_SOUND_LANG1) + vt->audmode = V4L2_TUNER_MODE_LANG1; + if (mode & VIDEO_SOUND_LANG2) + vt->audmode = V4L2_TUNER_MODE_LANG2; break; } diff --git a/drivers/media/video/tveeprom.c b/drivers/media/video/tveeprom.c index d95529e8e..582551b09 100644 --- a/drivers/media/video/tveeprom.c +++ b/drivers/media/video/tveeprom.c @@ -73,14 +73,14 @@ static struct HAUPPAUGE_TUNER_FMT } hauppauge_tuner_fmt[] = { - { V4L2_STD_UNKNOWN, " UNKNOWN" }, - { V4L2_STD_UNKNOWN, " FM" }, - { V4L2_STD_B|V4L2_STD_GH, " PAL(B/G)" }, - { V4L2_STD_MN, " NTSC(M)" }, - { V4L2_STD_PAL_I, " PAL(I)" }, - { V4L2_STD_SECAM_L|V4L2_STD_SECAM_LC, " SECAM(L/L')" }, - { V4L2_STD_DK, " PAL(D/D1/K)" }, - { V4L2_STD_ATSC, " ATSC/DVB Digital" }, + { V4L2_STD_UNKNOWN," UNKNOWN" }, + { V4L2_STD_UNKNOWN," FM" }, + { V4L2_STD_PAL_BG, " PAL(B/G)" }, + { V4L2_STD_NTSC_M, " NTSC(M)" }, + { V4L2_STD_PAL_I, " PAL(I)" }, + { V4L2_STD_SECAM_L," SECAM(L/L')" }, + { V4L2_STD_PAL_DK, " PAL(D/D1/K)" }, + { V4L2_STD_ATSC, " ATSC/DVB Digital" }, }; /* This is the full list of possible tuners. Many thanks to Hauppauge for @@ -200,7 +200,7 @@ hauppauge_tuner[] = { TUNER_ABSENT, "Philips FQ1286A MK4"}, { TUNER_ABSENT, "Philips FQ1216ME MK5"}, { TUNER_ABSENT, "Philips FQ1236 MK5"}, - { TUNER_SAMSUNG_TCPG_6121P30A, "Samsung TCPG 6121P30A"}, + { TUNER_ABSENT, "Samsung TCPG_6121P30A"}, { TUNER_TCL_2002MB, "TCL 2002MB_3H"}, { TUNER_ABSENT, "TCL 2002MI_3H"}, { TUNER_TCL_2002N, "TCL 2002N 5H"}, @@ -218,8 +218,8 @@ hauppauge_tuner[] = /* 110-119 */ { TUNER_ABSENT, "Thompson DTT75105"}, { TUNER_ABSENT, "Conexant_CX24109"}, - { TUNER_TCL_2002N, "TCL M2523_5N_E"}, - { TUNER_TCL_2002MB, "TCL M2523_3DB_E"}, + { TUNER_ABSENT, "TCL M2523_5N_E"}, + { TUNER_ABSENT, "TCL M2523_3DB_E"}, { TUNER_ABSENT, "Philips 8275A"}, { TUNER_ABSENT, "Microtune MT2060"}, { TUNER_ABSENT, "Philips FM1236 MK5"}, @@ -248,32 +248,32 @@ audioIC[] = {AUDIO_CHIP_MSP34XX, "MSP3410D"}, {AUDIO_CHIP_MSP34XX, "MSP3415"}, {AUDIO_CHIP_MSP34XX, "MSP3430"}, - {AUDIO_CHIP_MSP34XX, "MSP3438"}, + {AUDIO_CHIP_UNKNOWN, "MSP3438"}, {AUDIO_CHIP_UNKNOWN, "CS5331"}, /* 10-14 */ {AUDIO_CHIP_MSP34XX, "MSP3435"}, {AUDIO_CHIP_MSP34XX, "MSP3440"}, {AUDIO_CHIP_MSP34XX, "MSP3445"}, - {AUDIO_CHIP_MSP34XX, "MSP3411"}, - {AUDIO_CHIP_MSP34XX, "MSP3416"}, + {AUDIO_CHIP_UNKNOWN, "MSP3411"}, + {AUDIO_CHIP_UNKNOWN, "MSP3416"}, /* 15-19 */ {AUDIO_CHIP_MSP34XX, "MSP3425"}, - {AUDIO_CHIP_MSP34XX, "MSP3451"}, - {AUDIO_CHIP_MSP34XX, "MSP3418"}, + {AUDIO_CHIP_UNKNOWN, "MSP3451"}, + {AUDIO_CHIP_UNKNOWN, "MSP3418"}, {AUDIO_CHIP_UNKNOWN, "Type 0x12"}, {AUDIO_CHIP_UNKNOWN, "OKI7716"}, /* 20-24 */ - {AUDIO_CHIP_MSP34XX, "MSP4410"}, - {AUDIO_CHIP_MSP34XX, "MSP4420"}, - {AUDIO_CHIP_MSP34XX, "MSP4440"}, - {AUDIO_CHIP_MSP34XX, "MSP4450"}, - {AUDIO_CHIP_MSP34XX, "MSP4408"}, + {AUDIO_CHIP_UNKNOWN, "MSP4410"}, + {AUDIO_CHIP_UNKNOWN, "MSP4420"}, + {AUDIO_CHIP_UNKNOWN, "MSP4440"}, + {AUDIO_CHIP_UNKNOWN, "MSP4450"}, + {AUDIO_CHIP_UNKNOWN, "MSP4408"}, /* 25-29 */ - {AUDIO_CHIP_MSP34XX, "MSP4418"}, - {AUDIO_CHIP_MSP34XX, "MSP4428"}, - {AUDIO_CHIP_MSP34XX, "MSP4448"}, - {AUDIO_CHIP_MSP34XX, "MSP4458"}, - {AUDIO_CHIP_MSP34XX, "Type 0x1d"}, + {AUDIO_CHIP_UNKNOWN, "MSP4418"}, + {AUDIO_CHIP_UNKNOWN, "MSP4428"}, + {AUDIO_CHIP_UNKNOWN, "MSP4448"}, + {AUDIO_CHIP_UNKNOWN, "MSP4458"}, + {AUDIO_CHIP_UNKNOWN, "Type 0x1d"}, /* 30-34 */ {AUDIO_CHIP_INTERNAL, "CX880"}, {AUDIO_CHIP_INTERNAL, "CX881"}, @@ -757,9 +757,9 @@ tveeprom_detect_client(struct i2c_adapter *adapter, static int tveeprom_attach_adapter (struct i2c_adapter *adapter) { - if (adapter->class & I2C_CLASS_TV_ANALOG) - return i2c_probe(adapter, &addr_data, tveeprom_detect_client); - return 0; + if (adapter->id != I2C_HW_B_BT848) + return 0; + return i2c_probe(adapter, &addr_data, tveeprom_detect_client); } static int diff --git a/drivers/media/video/tvmixer.c b/drivers/media/video/tvmixer.c index 1654576de..9e86caeb9 100644 --- a/drivers/media/video/tvmixer.c +++ b/drivers/media/video/tvmixer.c @@ -198,6 +198,10 @@ static int tvmixer_open(struct inode *inode, struct file *file) /* lock bttv in memory while the mixer is in use */ file->private_data = mix; +#ifndef I2C_PEC + if (client->adapter->inc_use) + client->adapter->inc_use(client->adapter); +#endif if (client->adapter->owner) try_module_get(client->adapter->owner); return 0; @@ -213,6 +217,10 @@ static int tvmixer_release(struct inode *inode, struct file *file) return -ENODEV; } +#ifndef I2C_PEC + if (client->adapter->dec_use) + client->adapter->dec_use(client->adapter); +#endif if (client->adapter->owner) module_put(client->adapter->owner); return 0; diff --git a/drivers/media/video/tvp5150.c b/drivers/media/video/tvp5150.c index b167ffab2..1864423b3 100644 --- a/drivers/media/video/tvp5150.c +++ b/drivers/media/video/tvp5150.c @@ -1,8 +1,8 @@ /* - * tvp5150 - Texas Instruments TVP5150A/AM1 video decoder driver + * tvp5150 - Texas Instruments TVP5150A(M) video decoder driver * - * Copyright (c) 2005,2006 Mauro Carvalho Chehab (mchehab@infradead.org) - * This code is placed under the terms of the GNU General Public License v2 + * Copyright (c) 2005 Mauro Carvalho Chehab (mchehab@brturbo.com.br) + * This code is placed under the terms of the GNU General Public License */ #include @@ -10,15 +10,13 @@ #include #include #include -#include #include "tvp5150_reg.h" -MODULE_DESCRIPTION("Texas Instruments TVP5150A video decoder driver"); +MODULE_DESCRIPTION("Texas Instruments TVP5150A video decoder driver"); /* standard i2c insmod options */ MODULE_AUTHOR("Mauro Carvalho Chehab"); MODULE_LICENSE("GPL"); -/* standard i2c insmod options */ static unsigned short normal_i2c[] = { 0xb8 >> 1, 0xba >> 1, @@ -31,9 +29,6 @@ static int debug = 0; module_param(debug, int, 0); MODULE_PARM_DESC(debug, "Debug level (0-1)"); -#define tvp5150_err(fmt, arg...) do { \ - printk(KERN_ERR "%s %d-%04x: " fmt, c->driver->driver.name, \ - i2c_adapter_id(c->adapter), c->addr , ## arg); } while (0) #define tvp5150_info(fmt, arg...) do { \ printk(KERN_INFO "%s %d-%04x: " fmt, c->driver->driver.name, \ i2c_adapter_id(c->adapter), c->addr , ## arg); } while (0) @@ -54,7 +49,7 @@ static struct v4l2_queryctrl tvp5150_qctrl[] = { .minimum = 0, .maximum = 255, .step = 1, - .default_value = 128, + .default_value = 0, .flags = 0, }, { .id = V4L2_CID_CONTRAST, @@ -63,7 +58,7 @@ static struct v4l2_queryctrl tvp5150_qctrl[] = { .minimum = 0, .maximum = 255, .step = 0x1, - .default_value = 128, + .default_value = 0x10, .flags = 0, }, { .id = V4L2_CID_SATURATION, @@ -72,7 +67,7 @@ static struct v4l2_queryctrl tvp5150_qctrl[] = { .minimum = 0, .maximum = 255, .step = 0x1, - .default_value = 128, + .default_value = 0x10, .flags = 0, }, { .id = V4L2_CID_HUE, @@ -81,7 +76,7 @@ static struct v4l2_queryctrl tvp5150_qctrl[] = { .minimum = -128, .maximum = 127, .step = 0x1, - .default_value = 0, + .default_value = 0x10, .flags = 0, } }; @@ -89,8 +84,8 @@ static struct v4l2_queryctrl tvp5150_qctrl[] = { struct tvp5150 { struct i2c_client *client; - v4l2_std_id norm; /* Current set standard */ - struct v4l2_routing route; + int norm; + int input; int enable; int bright; int contrast; @@ -130,180 +125,338 @@ static inline void tvp5150_write(struct i2c_client *c, unsigned char addr, tvp5150_dbg(0, "i2c i/o error: rc == %d (should be 2)\n", rc); } -static void dump_reg_range(struct i2c_client *c, char *s, u8 init, const u8 end,int max_line) -{ - int i=0; - - while (init!=(u8)(end+1)) { - if ((i%max_line) == 0) { - if (i>0) - printk("\n"); - printk("tvp5150: %s reg 0x%02x = ",s,init); - } - printk("%02x ",tvp5150_read(c, init)); - - init++; - i++; - } - printk("\n"); -} - static void dump_reg(struct i2c_client *c) { printk("tvp5150: Video input source selection #1 = 0x%02x\n", - tvp5150_read(c, TVP5150_VD_IN_SRC_SEL_1)); + tvp5150_read(c, TVP5150_VD_IN_SRC_SEL_1)); printk("tvp5150: Analog channel controls = 0x%02x\n", - tvp5150_read(c, TVP5150_ANAL_CHL_CTL)); + tvp5150_read(c, TVP5150_ANAL_CHL_CTL)); printk("tvp5150: Operation mode controls = 0x%02x\n", - tvp5150_read(c, TVP5150_OP_MODE_CTL)); + tvp5150_read(c, TVP5150_OP_MODE_CTL)); printk("tvp5150: Miscellaneous controls = 0x%02x\n", - tvp5150_read(c, TVP5150_MISC_CTL)); - printk("tvp5150: Autoswitch mask= 0x%02x\n", - tvp5150_read(c, TVP5150_AUTOSW_MSK)); + tvp5150_read(c, TVP5150_MISC_CTL)); + printk("tvp5150: Autoswitch mask: TVP5150A / TVP5150AM = 0x%02x\n", + tvp5150_read(c, TVP5150_AUTOSW_MSK)); printk("tvp5150: Color killer threshold control = 0x%02x\n", - tvp5150_read(c, TVP5150_COLOR_KIL_THSH_CTL)); - printk("tvp5150: Luminance processing controls #1 #2 and #3 = %02x %02x %02x\n", - tvp5150_read(c, TVP5150_LUMA_PROC_CTL_1), - tvp5150_read(c, TVP5150_LUMA_PROC_CTL_2), - tvp5150_read(c, TVP5150_LUMA_PROC_CTL_3)); + tvp5150_read(c, TVP5150_COLOR_KIL_THSH_CTL)); + printk("tvp5150: Luminance processing control #1 = 0x%02x\n", + tvp5150_read(c, TVP5150_LUMA_PROC_CTL_1)); + printk("tvp5150: Luminance processing control #2 = 0x%02x\n", + tvp5150_read(c, TVP5150_LUMA_PROC_CTL_2)); printk("tvp5150: Brightness control = 0x%02x\n", - tvp5150_read(c, TVP5150_BRIGHT_CTL)); + tvp5150_read(c, TVP5150_BRIGHT_CTL)); printk("tvp5150: Color saturation control = 0x%02x\n", - tvp5150_read(c, TVP5150_SATURATION_CTL)); + tvp5150_read(c, TVP5150_SATURATION_CTL)); printk("tvp5150: Hue control = 0x%02x\n", - tvp5150_read(c, TVP5150_HUE_CTL)); + tvp5150_read(c, TVP5150_HUE_CTL)); printk("tvp5150: Contrast control = 0x%02x\n", - tvp5150_read(c, TVP5150_CONTRAST_CTL)); + tvp5150_read(c, TVP5150_CONTRAST_CTL)); printk("tvp5150: Outputs and data rates select = 0x%02x\n", - tvp5150_read(c, TVP5150_DATA_RATE_SEL)); + tvp5150_read(c, TVP5150_DATA_RATE_SEL)); + printk("tvp5150: Luminance processing control #3 = 0x%02x\n", + tvp5150_read(c, TVP5150_LUMA_PROC_CTL_3)); printk("tvp5150: Configuration shared pins = 0x%02x\n", - tvp5150_read(c, TVP5150_CONF_SHARED_PIN)); - printk("tvp5150: Active video cropping start = 0x%02x%02x\n", - tvp5150_read(c, TVP5150_ACT_VD_CROP_ST_MSB), - tvp5150_read(c, TVP5150_ACT_VD_CROP_ST_LSB)); - printk("tvp5150: Active video cropping stop = 0x%02x%02x\n", - tvp5150_read(c, TVP5150_ACT_VD_CROP_STP_MSB), - tvp5150_read(c, TVP5150_ACT_VD_CROP_STP_LSB)); + tvp5150_read(c, TVP5150_CONF_SHARED_PIN)); + printk("tvp5150: Active video cropping start MSB = 0x%02x\n", + tvp5150_read(c, TVP5150_ACT_VD_CROP_ST_MSB)); + printk("tvp5150: Active video cropping start LSB = 0x%02x\n", + tvp5150_read(c, TVP5150_ACT_VD_CROP_ST_LSB)); + printk("tvp5150: Active video cropping stop MSB = 0x%02x\n", + tvp5150_read(c, TVP5150_ACT_VD_CROP_STP_MSB)); + printk("tvp5150: Active video cropping stop LSB = 0x%02x\n", + tvp5150_read(c, TVP5150_ACT_VD_CROP_STP_LSB)); printk("tvp5150: Genlock/RTC = 0x%02x\n", - tvp5150_read(c, TVP5150_GENLOCK)); + tvp5150_read(c, TVP5150_GENLOCK)); printk("tvp5150: Horizontal sync start = 0x%02x\n", - tvp5150_read(c, TVP5150_HORIZ_SYNC_START)); + tvp5150_read(c, TVP5150_HORIZ_SYNC_START)); printk("tvp5150: Vertical blanking start = 0x%02x\n", - tvp5150_read(c, TVP5150_VERT_BLANKING_START)); + tvp5150_read(c, TVP5150_VERT_BLANKING_START)); printk("tvp5150: Vertical blanking stop = 0x%02x\n", - tvp5150_read(c, TVP5150_VERT_BLANKING_STOP)); - printk("tvp5150: Chrominance processing control #1 and #2 = %02x %02x\n", - tvp5150_read(c, TVP5150_CHROMA_PROC_CTL_1), - tvp5150_read(c, TVP5150_CHROMA_PROC_CTL_2)); + tvp5150_read(c, TVP5150_VERT_BLANKING_STOP)); + printk("tvp5150: Chrominance processing control #1 = 0x%02x\n", + tvp5150_read(c, TVP5150_CHROMA_PROC_CTL_1)); + printk("tvp5150: Chrominance processing control #2 = 0x%02x\n", + tvp5150_read(c, TVP5150_CHROMA_PROC_CTL_2)); printk("tvp5150: Interrupt reset register B = 0x%02x\n", - tvp5150_read(c, TVP5150_INT_RESET_REG_B)); + tvp5150_read(c, TVP5150_INT_RESET_REG_B)); printk("tvp5150: Interrupt enable register B = 0x%02x\n", - tvp5150_read(c, TVP5150_INT_ENABLE_REG_B)); + tvp5150_read(c, TVP5150_INT_ENABLE_REG_B)); printk("tvp5150: Interrupt configuration register B = 0x%02x\n", - tvp5150_read(c, TVP5150_INTT_CONFIG_REG_B)); + tvp5150_read(c, TVP5150_INTT_CONFIG_REG_B)); printk("tvp5150: Video standard = 0x%02x\n", - tvp5150_read(c, TVP5150_VIDEO_STD)); - printk("tvp5150: Chroma gain factor: Cb=0x%02x Cr=0x%02x\n", - tvp5150_read(c, TVP5150_CB_GAIN_FACT), - tvp5150_read(c, TVP5150_CR_GAIN_FACTOR)); + tvp5150_read(c, TVP5150_VIDEO_STD)); + printk("tvp5150: Cb gain factor = 0x%02x\n", + tvp5150_read(c, TVP5150_CB_GAIN_FACT)); + printk("tvp5150: Cr gain factor = 0x%02x\n", + tvp5150_read(c, TVP5150_CR_GAIN_FACTOR)); printk("tvp5150: Macrovision on counter = 0x%02x\n", - tvp5150_read(c, TVP5150_MACROVISION_ON_CTR)); + tvp5150_read(c, TVP5150_MACROVISION_ON_CTR)); printk("tvp5150: Macrovision off counter = 0x%02x\n", - tvp5150_read(c, TVP5150_MACROVISION_OFF_CTR)); - printk("tvp5150: ITU-R BT.656.%d timing(TVP5150AM1 only)\n", - (tvp5150_read(c, TVP5150_REV_SELECT)&1)?3:4); - printk("tvp5150: Device ID = %02x%02x\n", - tvp5150_read(c, TVP5150_MSB_DEV_ID), - tvp5150_read(c, TVP5150_LSB_DEV_ID)); - printk("tvp5150: ROM version = (hex) %02x.%02x\n", - tvp5150_read(c, TVP5150_ROM_MAJOR_VER), - tvp5150_read(c, TVP5150_ROM_MINOR_VER)); - printk("tvp5150: Vertical line count = 0x%02x%02x\n", - tvp5150_read(c, TVP5150_VERT_LN_COUNT_MSB), - tvp5150_read(c, TVP5150_VERT_LN_COUNT_LSB)); + tvp5150_read(c, TVP5150_MACROVISION_OFF_CTR)); + printk("tvp5150: revision select (TVP5150AM1 only) = 0x%02x\n", + tvp5150_read(c, TVP5150_REV_SELECT)); + printk("tvp5150: MSB of device ID = 0x%02x\n", + tvp5150_read(c, TVP5150_MSB_DEV_ID)); + printk("tvp5150: LSB of device ID = 0x%02x\n", + tvp5150_read(c, TVP5150_LSB_DEV_ID)); + printk("tvp5150: ROM major version = 0x%02x\n", + tvp5150_read(c, TVP5150_ROM_MAJOR_VER)); + printk("tvp5150: ROM minor version = 0x%02x\n", + tvp5150_read(c, TVP5150_ROM_MINOR_VER)); + printk("tvp5150: Vertical line count MSB = 0x%02x\n", + tvp5150_read(c, TVP5150_VERT_LN_COUNT_MSB)); + printk("tvp5150: Vertical line count LSB = 0x%02x\n", + tvp5150_read(c, TVP5150_VERT_LN_COUNT_LSB)); printk("tvp5150: Interrupt status register B = 0x%02x\n", - tvp5150_read(c, TVP5150_INT_STATUS_REG_B)); + tvp5150_read(c, TVP5150_INT_STATUS_REG_B)); printk("tvp5150: Interrupt active register B = 0x%02x\n", - tvp5150_read(c, TVP5150_INT_ACTIVE_REG_B)); - printk("tvp5150: Status regs #1 to #5 = %02x %02x %02x %02x %02x\n", - tvp5150_read(c, TVP5150_STATUS_REG_1), - tvp5150_read(c, TVP5150_STATUS_REG_2), - tvp5150_read(c, TVP5150_STATUS_REG_3), - tvp5150_read(c, TVP5150_STATUS_REG_4), - tvp5150_read(c, TVP5150_STATUS_REG_5)); - - dump_reg_range(c,"Teletext filter 1", TVP5150_TELETEXT_FIL1_INI, - TVP5150_TELETEXT_FIL1_END,8); - dump_reg_range(c,"Teletext filter 2", TVP5150_TELETEXT_FIL2_INI, - TVP5150_TELETEXT_FIL2_END,8); - + tvp5150_read(c, TVP5150_INT_ACTIVE_REG_B)); + printk("tvp5150: Status register #1 = 0x%02x\n", + tvp5150_read(c, TVP5150_STATUS_REG_1)); + printk("tvp5150: Status register #2 = 0x%02x\n", + tvp5150_read(c, TVP5150_STATUS_REG_2)); + printk("tvp5150: Status register #3 = 0x%02x\n", + tvp5150_read(c, TVP5150_STATUS_REG_3)); + printk("tvp5150: Status register #4 = 0x%02x\n", + tvp5150_read(c, TVP5150_STATUS_REG_4)); + printk("tvp5150: Status register #5 = 0x%02x\n", + tvp5150_read(c, TVP5150_STATUS_REG_5)); + printk("tvp5150: Closed caption data registers = 0x%02x\n", + tvp5150_read(c, TVP5150_CC_DATA_REG1)); + printk("tvp5150: Closed caption data registers = 0x%02x\n", + tvp5150_read(c, TVP5150_CC_DATA_REG2)); + printk("tvp5150: Closed caption data registers = 0x%02x\n", + tvp5150_read(c, TVP5150_CC_DATA_REG3)); + printk("tvp5150: Closed caption data registers = 0x%02x\n", + tvp5150_read(c, TVP5150_CC_DATA_REG4)); + printk("tvp5150: WSS data registers = 0x%02x\n", + tvp5150_read(c, TVP5150_WSS_DATA_REG1)); + printk("tvp5150: WSS data registers = 0x%02x\n", + tvp5150_read(c, TVP5150_WSS_DATA_REG2)); + printk("tvp5150: WSS data registers = 0x%02x\n", + tvp5150_read(c, TVP5150_WSS_DATA_REG3)); + printk("tvp5150: WSS data registers = 0x%02x\n", + tvp5150_read(c, TVP5150_WSS_DATA_REG4)); + printk("tvp5150: WSS data registers = 0x%02x\n", + tvp5150_read(c, TVP5150_WSS_DATA_REG5)); + printk("tvp5150: WSS data registers = 0x%02x\n", + tvp5150_read(c, TVP5150_WSS_DATA_REG6)); + printk("tvp5150: VPS data registers = 0x%02x\n", + tvp5150_read(c, TVP5150_VPS_DATA_REG1)); + printk("tvp5150: VPS data registers = 0x%02x\n", + tvp5150_read(c, TVP5150_VPS_DATA_REG2)); + printk("tvp5150: VPS data registers = 0x%02x\n", + tvp5150_read(c, TVP5150_VPS_DATA_REG3)); + printk("tvp5150: VPS data registers = 0x%02x\n", + tvp5150_read(c, TVP5150_VPS_DATA_REG4)); + printk("tvp5150: VPS data registers = 0x%02x\n", + tvp5150_read(c, TVP5150_VPS_DATA_REG5)); + printk("tvp5150: VPS data registers = 0x%02x\n", + tvp5150_read(c, TVP5150_VPS_DATA_REG6)); + printk("tvp5150: VPS data registers = 0x%02x\n", + tvp5150_read(c, TVP5150_VPS_DATA_REG7)); + printk("tvp5150: VPS data registers = 0x%02x\n", + tvp5150_read(c, TVP5150_VPS_DATA_REG8)); + printk("tvp5150: VPS data registers = 0x%02x\n", + tvp5150_read(c, TVP5150_VPS_DATA_REG9)); + printk("tvp5150: VPS data registers = 0x%02x\n", + tvp5150_read(c, TVP5150_VPS_DATA_REG10)); + printk("tvp5150: VPS data registers = 0x%02x\n", + tvp5150_read(c, TVP5150_VPS_DATA_REG11)); + printk("tvp5150: VPS data registers = 0x%02x\n", + tvp5150_read(c, TVP5150_VPS_DATA_REG12)); + printk("tvp5150: VPS data registers = 0x%02x\n", + tvp5150_read(c, TVP5150_VPS_DATA_REG13)); + printk("tvp5150: VITC data registers = 0x%02x\n", + tvp5150_read(c, TVP5150_VITC_DATA_REG1)); + printk("tvp5150: VITC data registers = 0x%02x\n", + tvp5150_read(c, TVP5150_VITC_DATA_REG2)); + printk("tvp5150: VITC data registers = 0x%02x\n", + tvp5150_read(c, TVP5150_VITC_DATA_REG3)); + printk("tvp5150: VITC data registers = 0x%02x\n", + tvp5150_read(c, TVP5150_VITC_DATA_REG4)); + printk("tvp5150: VITC data registers = 0x%02x\n", + tvp5150_read(c, TVP5150_VITC_DATA_REG5)); + printk("tvp5150: VITC data registers = 0x%02x\n", + tvp5150_read(c, TVP5150_VITC_DATA_REG6)); + printk("tvp5150: VITC data registers = 0x%02x\n", + tvp5150_read(c, TVP5150_VITC_DATA_REG7)); + printk("tvp5150: VITC data registers = 0x%02x\n", + tvp5150_read(c, TVP5150_VITC_DATA_REG8)); + printk("tvp5150: VITC data registers = 0x%02x\n", + tvp5150_read(c, TVP5150_VITC_DATA_REG9)); + printk("tvp5150: VBI FIFO read data = 0x%02x\n", + tvp5150_read(c, TVP5150_VBI_FIFO_READ_DATA)); + printk("tvp5150: Teletext filter 1 = 0x%02x\n", + tvp5150_read(c, TVP5150_TELETEXT_FIL_1_1)); + printk("tvp5150: Teletext filter 1 = 0x%02x\n", + tvp5150_read(c, TVP5150_TELETEXT_FIL_1_2)); + printk("tvp5150: Teletext filter 1 = 0x%02x\n", + tvp5150_read(c, TVP5150_TELETEXT_FIL_1_3)); + printk("tvp5150: Teletext filter 1 = 0x%02x\n", + tvp5150_read(c, TVP5150_TELETEXT_FIL_1_4)); + printk("tvp5150: Teletext filter 1 = 0x%02x\n", + tvp5150_read(c, TVP5150_TELETEXT_FIL_1_5)); + printk("tvp5150: Teletext filter 2 = 0x%02x\n", + tvp5150_read(c, TVP5150_TELETEXT_FIL_2_1)); + printk("tvp5150: Teletext filter 2 = 0x%02x\n", + tvp5150_read(c, TVP5150_TELETEXT_FIL_2_2)); + printk("tvp5150: Teletext filter 2 = 0x%02x\n", + tvp5150_read(c, TVP5150_TELETEXT_FIL_2_3)); + printk("tvp5150: Teletext filter 2 = 0x%02x\n", + tvp5150_read(c, TVP5150_TELETEXT_FIL_2_4)); + printk("tvp5150: Teletext filter 2 = 0x%02x\n", + tvp5150_read(c, TVP5150_TELETEXT_FIL_2_5)); printk("tvp5150: Teletext filter enable = 0x%02x\n", - tvp5150_read(c, TVP5150_TELETEXT_FIL_ENA)); + tvp5150_read(c, TVP5150_TELETEXT_FIL_ENA)); printk("tvp5150: Interrupt status register A = 0x%02x\n", - tvp5150_read(c, TVP5150_INT_STATUS_REG_A)); + tvp5150_read(c, TVP5150_INT_STATUS_REG_A)); printk("tvp5150: Interrupt enable register A = 0x%02x\n", - tvp5150_read(c, TVP5150_INT_ENABLE_REG_A)); + tvp5150_read(c, TVP5150_INT_ENABLE_REG_A)); printk("tvp5150: Interrupt configuration = 0x%02x\n", - tvp5150_read(c, TVP5150_INT_CONF)); + tvp5150_read(c, TVP5150_INT_CONF)); + printk("tvp5150: VDP configuration RAM data = 0x%02x\n", + tvp5150_read(c, TVP5150_VDP_CONF_RAM_DATA)); + printk("tvp5150: Configuration RAM address low byte = 0x%02x\n", + tvp5150_read(c, TVP5150_CONF_RAM_ADDR_LOW)); + printk("tvp5150: Configuration RAM address high byte = 0x%02x\n", + tvp5150_read(c, TVP5150_CONF_RAM_ADDR_HIGH)); printk("tvp5150: VDP status register = 0x%02x\n", - tvp5150_read(c, TVP5150_VDP_STATUS_REG)); + tvp5150_read(c, TVP5150_VDP_STATUS_REG)); printk("tvp5150: FIFO word count = 0x%02x\n", - tvp5150_read(c, TVP5150_FIFO_WORD_COUNT)); + tvp5150_read(c, TVP5150_FIFO_WORD_COUNT)); printk("tvp5150: FIFO interrupt threshold = 0x%02x\n", - tvp5150_read(c, TVP5150_FIFO_INT_THRESHOLD)); + tvp5150_read(c, TVP5150_FIFO_INT_THRESHOLD)); printk("tvp5150: FIFO reset = 0x%02x\n", - tvp5150_read(c, TVP5150_FIFO_RESET)); + tvp5150_read(c, TVP5150_FIFO_RESET)); printk("tvp5150: Line number interrupt = 0x%02x\n", - tvp5150_read(c, TVP5150_LINE_NUMBER_INT)); - printk("tvp5150: Pixel alignment register = 0x%02x%02x\n", - tvp5150_read(c, TVP5150_PIX_ALIGN_REG_HIGH), - tvp5150_read(c, TVP5150_PIX_ALIGN_REG_LOW)); + tvp5150_read(c, TVP5150_LINE_NUMBER_INT)); + printk("tvp5150: Pixel alignment register low byte = 0x%02x\n", + tvp5150_read(c, TVP5150_PIX_ALIGN_REG_LOW)); + printk("tvp5150: Pixel alignment register high byte = 0x%02x\n", + tvp5150_read(c, TVP5150_PIX_ALIGN_REG_HIGH)); printk("tvp5150: FIFO output control = 0x%02x\n", - tvp5150_read(c, TVP5150_FIFO_OUT_CTRL)); - printk("tvp5150: Full field enable = 0x%02x\n", - tvp5150_read(c, TVP5150_FULL_FIELD_ENA)); + tvp5150_read(c, TVP5150_FIFO_OUT_CTRL)); + printk("tvp5150: Full field enable 1 = 0x%02x\n", + tvp5150_read(c, TVP5150_FULL_FIELD_ENA_1)); + printk("tvp5150: Full field enable 2 = 0x%02x\n", + tvp5150_read(c, TVP5150_FULL_FIELD_ENA_2)); + printk("tvp5150: Line mode registers = 0x%02x\n", + tvp5150_read(c, TVP5150_LINE_MODE_REG_1)); + printk("tvp5150: Line mode registers = 0x%02x\n", + tvp5150_read(c, TVP5150_LINE_MODE_REG_2)); + printk("tvp5150: Line mode registers = 0x%02x\n", + tvp5150_read(c, TVP5150_LINE_MODE_REG_3)); + printk("tvp5150: Line mode registers = 0x%02x\n", + tvp5150_read(c, TVP5150_LINE_MODE_REG_4)); + printk("tvp5150: Line mode registers = 0x%02x\n", + tvp5150_read(c, TVP5150_LINE_MODE_REG_5)); + printk("tvp5150: Line mode registers = 0x%02x\n", + tvp5150_read(c, TVP5150_LINE_MODE_REG_6)); + printk("tvp5150: Line mode registers = 0x%02x\n", + tvp5150_read(c, TVP5150_LINE_MODE_REG_7)); + printk("tvp5150: Line mode registers = 0x%02x\n", + tvp5150_read(c, TVP5150_LINE_MODE_REG_8)); + printk("tvp5150: Line mode registers = 0x%02x\n", + tvp5150_read(c, TVP5150_LINE_MODE_REG_9)); + printk("tvp5150: Line mode registers = 0x%02x\n", + tvp5150_read(c, TVP5150_LINE_MODE_REG_10)); + printk("tvp5150: Line mode registers = 0x%02x\n", + tvp5150_read(c, TVP5150_LINE_MODE_REG_11)); + printk("tvp5150: Line mode registers = 0x%02x\n", + tvp5150_read(c, TVP5150_LINE_MODE_REG_12)); + printk("tvp5150: Line mode registers = 0x%02x\n", + tvp5150_read(c, TVP5150_LINE_MODE_REG_13)); + printk("tvp5150: Line mode registers = 0x%02x\n", + tvp5150_read(c, TVP5150_LINE_MODE_REG_14)); + printk("tvp5150: Line mode registers = 0x%02x\n", + tvp5150_read(c, TVP5150_LINE_MODE_REG_15)); + printk("tvp5150: Line mode registers = 0x%02x\n", + tvp5150_read(c, TVP5150_LINE_MODE_REG_16)); + printk("tvp5150: Line mode registers = 0x%02x\n", + tvp5150_read(c, TVP5150_LINE_MODE_REG_17)); + printk("tvp5150: Line mode registers = 0x%02x\n", + tvp5150_read(c, TVP5150_LINE_MODE_REG_18)); + printk("tvp5150: Line mode registers = 0x%02x\n", + tvp5150_read(c, TVP5150_LINE_MODE_REG_19)); + printk("tvp5150: Line mode registers = 0x%02x\n", + tvp5150_read(c, TVP5150_LINE_MODE_REG_20)); + printk("tvp5150: Line mode registers = 0x%02x\n", + tvp5150_read(c, TVP5150_LINE_MODE_REG_21)); + printk("tvp5150: Line mode registers = 0x%02x\n", + tvp5150_read(c, TVP5150_LINE_MODE_REG_22)); + printk("tvp5150: Line mode registers = 0x%02x\n", + tvp5150_read(c, TVP5150_LINE_MODE_REG_23)); + printk("tvp5150: Line mode registers = 0x%02x\n", + tvp5150_read(c, TVP5150_LINE_MODE_REG_24)); + printk("tvp5150: Line mode registers = 0x%02x\n", + tvp5150_read(c, TVP5150_LINE_MODE_REG_25)); + printk("tvp5150: Line mode registers = 0x%02x\n", + tvp5150_read(c, TVP5150_LINE_MODE_REG_27)); + printk("tvp5150: Line mode registers = 0x%02x\n", + tvp5150_read(c, TVP5150_LINE_MODE_REG_28)); + printk("tvp5150: Line mode registers = 0x%02x\n", + tvp5150_read(c, TVP5150_LINE_MODE_REG_29)); + printk("tvp5150: Line mode registers = 0x%02x\n", + tvp5150_read(c, TVP5150_LINE_MODE_REG_30)); + printk("tvp5150: Line mode registers = 0x%02x\n", + tvp5150_read(c, TVP5150_LINE_MODE_REG_31)); + printk("tvp5150: Line mode registers = 0x%02x\n", + tvp5150_read(c, TVP5150_LINE_MODE_REG_32)); + printk("tvp5150: Line mode registers = 0x%02x\n", + tvp5150_read(c, TVP5150_LINE_MODE_REG_33)); + printk("tvp5150: Line mode registers = 0x%02x\n", + tvp5150_read(c, TVP5150_LINE_MODE_REG_34)); + printk("tvp5150: Line mode registers = 0x%02x\n", + tvp5150_read(c, TVP5150_LINE_MODE_REG_35)); + printk("tvp5150: Line mode registers = 0x%02x\n", + tvp5150_read(c, TVP5150_LINE_MODE_REG_36)); + printk("tvp5150: Line mode registers = 0x%02x\n", + tvp5150_read(c, TVP5150_LINE_MODE_REG_37)); + printk("tvp5150: Line mode registers = 0x%02x\n", + tvp5150_read(c, TVP5150_LINE_MODE_REG_38)); + printk("tvp5150: Line mode registers = 0x%02x\n", + tvp5150_read(c, TVP5150_LINE_MODE_REG_39)); + printk("tvp5150: Line mode registers = 0x%02x\n", + tvp5150_read(c, TVP5150_LINE_MODE_REG_40)); + printk("tvp5150: Line mode registers = 0x%02x\n", + tvp5150_read(c, TVP5150_LINE_MODE_REG_41)); + printk("tvp5150: Line mode registers = 0x%02x\n", + tvp5150_read(c, TVP5150_LINE_MODE_REG_42)); + printk("tvp5150: Line mode registers = 0x%02x\n", + tvp5150_read(c, TVP5150_LINE_MODE_REG_43)); + printk("tvp5150: Line mode registers = 0x%02x\n", + tvp5150_read(c, TVP5150_LINE_MODE_REG_44)); printk("tvp5150: Full field mode register = 0x%02x\n", - tvp5150_read(c, TVP5150_FULL_FIELD_MODE_REG)); - - dump_reg_range(c,"CC data", TVP5150_CC_DATA_INI, - TVP5150_CC_DATA_END,8); - - dump_reg_range(c,"WSS data", TVP5150_WSS_DATA_INI, - TVP5150_WSS_DATA_END,8); - - dump_reg_range(c,"VPS data", TVP5150_VPS_DATA_INI, - TVP5150_VPS_DATA_END,8); - - dump_reg_range(c,"VITC data", TVP5150_VITC_DATA_INI, - TVP5150_VITC_DATA_END,10); - - dump_reg_range(c,"Line mode", TVP5150_LINE_MODE_INI, - TVP5150_LINE_MODE_END,8); + tvp5150_read(c, TVP5150_FULL_FIELD_MODE_REG)); } /**************************************************************************** Basic functions ****************************************************************************/ +enum tvp5150_input { + TVP5150_ANALOG_CH0 = 0, + TVP5150_SVIDEO = 1, + TVP5150_ANALOG_CH1 = 2, + TVP5150_BLACK_SCREEN = 8 +}; -static inline void tvp5150_selmux(struct i2c_client *c) +static inline void tvp5150_selmux(struct i2c_client *c, + enum tvp5150_input input) { int opmode=0; + struct tvp5150 *decoder = i2c_get_clientdata(c); - int input = 0; - if ((decoder->route.output & TVP5150_BLACK_SCREEN) || !decoder->enable) - input = 8; + if (!decoder->enable) + input |= TVP5150_BLACK_SCREEN; switch (input) { - case TVP5150_COMPOSITE1: - input |= 2; - /* fall through */ - case TVP5150_COMPOSITE0: + case TVP5150_ANALOG_CH0: + case TVP5150_ANALOG_CH1: opmode=0x30; /* TV Mode */ break; - case TVP5150_SVIDEO: default: - input |= 1; opmode=0; /* Auto Mode */ break; } @@ -440,10 +593,10 @@ static const struct i2c_reg_value tvp5150_init_default[] = { TVP5150_FIFO_OUT_CTRL,0x01 }, { /* 0xcf */ - TVP5150_FULL_FIELD_ENA,0x00 + TVP5150_FULL_FIELD_ENA_1,0x00 }, { /* 0xd0 */ - TVP5150_LINE_MODE_INI,0x00 + TVP5150_FULL_FIELD_ENA_2,0x00 }, { /* 0xfc */ TVP5150_FULL_FIELD_MODE_REG,0x7f @@ -476,109 +629,54 @@ static const struct i2c_reg_value tvp5150_init_enable[] = { } }; -struct tvp5150_vbi_type { - unsigned int vbi_type; - unsigned int ini_line; - unsigned int end_line; - unsigned int by_field :1; -}; - struct i2c_vbi_ram_value { u16 reg; - struct tvp5150_vbi_type type; - unsigned char values[16]; + unsigned char values[26]; }; -/* This struct have the values for each supported VBI Standard - * by - tvp5150_vbi_types should follow the same order as vbi_ram_default - * value 0 means rom position 0x10, value 1 means rom position 0x30 - * and so on. There are 16 possible locations from 0 to 15. - */ - static struct i2c_vbi_ram_value vbi_ram_default[] = { - /* FIXME: Current api doesn't handle all VBI types, those not - yet supported are placed under #if 0 */ -#if 0 - {0x010, /* Teletext, SECAM, WST System A */ - {V4L2_SLICED_TELETEXT_SECAM,6,23,1}, - { 0xaa, 0xaa, 0xff, 0xff, 0xe7, 0x2e, 0x20, 0x26, - 0xe6, 0xb4, 0x0e, 0x00, 0x00, 0x00, 0x10, 0x00 } - }, -#endif - {0x030, /* Teletext, PAL, WST System B */ - {V4L2_SLICED_TELETEXT_B,6,22,1}, - { 0xaa, 0xaa, 0xff, 0xff, 0x27, 0x2e, 0x20, 0x2b, - 0xa6, 0x72, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00 } + {0x010, /* WST SECAM 6 */ + { 0xaa, 0xaa, 0xff, 0xff , 0xe7, 0x2e, 0x20, 0x26, 0xe6, 0xb4, 0x0e, 0x0, 0x0, 0x0, 0x10, 0x0 } }, -#if 0 - {0x050, /* Teletext, PAL, WST System C */ - {V4L2_SLICED_TELETEXT_PAL_C,6,22,1}, - { 0xaa, 0xaa, 0xff, 0xff, 0xe7, 0x2e, 0x20, 0x22, - 0xa6, 0x98, 0x0d, 0x00, 0x00, 0x00, 0x10, 0x00 } + {0x030, /* WST PAL B 6 */ + { 0xaa, 0xaa, 0xff, 0xff , 0x27, 0x2e, 0x20, 0x2b, 0xa6, 0x72, 0x10, 0x0, 0x0, 0x0, 0x10, 0x0 } }, - {0x070, /* Teletext, NTSC, WST System B */ - {V4L2_SLICED_TELETEXT_NTSC_B,10,21,1}, - { 0xaa, 0xaa, 0xff, 0xff, 0x27, 0x2e, 0x20, 0x23, - 0x69, 0x93, 0x0d, 0x00, 0x00, 0x00, 0x10, 0x00 } + {0x050, /* WST PAL C 6 */ + { 0xaa, 0xaa, 0xff, 0xff , 0xe7, 0x2e, 0x20, 0x22, 0xa6, 0x98, 0x0d, 0x0, 0x0, 0x0, 0x10, 0x0 } }, - {0x090, /* Tetetext, NTSC NABTS System C */ - {V4L2_SLICED_TELETEXT_NTSC_C,10,21,1}, - { 0xaa, 0xaa, 0xff, 0xff, 0xe7, 0x2e, 0x20, 0x22, - 0x69, 0x93, 0x0d, 0x00, 0x00, 0x00, 0x15, 0x00 } + {0x070, /* WST NTSC 6 */ + { 0xaa, 0xaa, 0xff, 0xff , 0x27, 0x2e, 0x20, 0x23, 0x69, 0x93, 0x0d, 0x0, 0x0, 0x0, 0x10, 0x0 } }, - {0x0b0, /* Teletext, NTSC-J, NABTS System D */ - {V4L2_SLICED_TELETEXT_NTSC_D,10,21,1}, - { 0xaa, 0xaa, 0xff, 0xff, 0xa7, 0x2e, 0x20, 0x23, - 0x69, 0x93, 0x0d, 0x00, 0x00, 0x00, 0x10, 0x00 } + {0x090, /* NABTS, NTSC 6 */ + { 0xaa, 0xaa, 0xff, 0xff , 0xe7, 0x2e, 0x20, 0x22, 0x69, 0x93, 0x0d, 0x0, 0x0, 0x0, 0x15, 0x0 } }, - {0x0d0, /* Closed Caption, PAL/SECAM */ - {V4L2_SLICED_CAPTION_625,22,22,1}, - { 0xaa, 0x2a, 0xff, 0x3f, 0x04, 0x51, 0x6e, 0x02, - 0xa6, 0x7b, 0x09, 0x00, 0x00, 0x00, 0x27, 0x00 } + {0x0b0, /* NABTS, NTSC-J 6 */ + { 0xaa, 0xaa, 0xff, 0xff , 0xa7, 0x2e, 0x20, 0x23, 0x69, 0x93, 0x0d, 0x0, 0x0, 0x0, 0x10, 0x0 } }, -#endif - {0x0f0, /* Closed Caption, NTSC */ - {V4L2_SLICED_CAPTION_525,21,21,1}, - { 0xaa, 0x2a, 0xff, 0x3f, 0x04, 0x51, 0x6e, 0x02, - 0x69, 0x8c, 0x09, 0x00, 0x00, 0x00, 0x27, 0x00 } + {0x0d0, /* CC, PAL/SECAM 6 */ + { 0xaa, 0x2a, 0xff, 0x3f , 0x04, 0x51, 0x6e, 0x02, 0xa6, 0x7b, 0x09, 0x0, 0x0, 0x0, 0x27, 0x0 } }, - {0x110, /* Wide Screen Signal, PAL/SECAM */ - {V4L2_SLICED_WSS_625,23,23,1}, - { 0x5b, 0x55, 0xc5, 0xff, 0x00, 0x71, 0x6e, 0x42, - 0xa6, 0xcd, 0x0f, 0x00, 0x00, 0x00, 0x3a, 0x00 } + {0x0f0, /* CC, NTSC 6 */ + { 0xaa, 0x2a, 0xff, 0x3f , 0x04, 0x51, 0x6e, 0x02, 0x69, 0x8c, 0x09, 0x0, 0x0, 0x0, 0x27, 0x0 } }, -#if 0 - {0x130, /* Wide Screen Signal, NTSC C */ - {V4L2_SLICED_WSS_525,20,20,1}, - { 0x38, 0x00, 0x3f, 0x00, 0x00, 0x71, 0x6e, 0x43, - 0x69, 0x7c, 0x08, 0x00, 0x00, 0x00, 0x39, 0x00 } + {0x110, /* WSS, PAL/SECAM 6 */ + { 0x5b, 0x55, 0xc5, 0xff , 0x0, 0x71, 0x6e, 0x42, 0xa6, 0xcd, 0x0f, 0x0, 0x0, 0x0, 0x3a, 0x0 } }, - {0x150, /* Vertical Interval Timecode (VITC), PAL/SECAM */ - {V4l2_SLICED_VITC_625,6,22,0}, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x8f, 0x6d, 0x49, - 0xa6, 0x85, 0x08, 0x00, 0x00, 0x00, 0x4c, 0x00 } + {0x130, /* WSS, NTSC C */ + { 0x38, 0x00, 0x3f, 0x00 , 0x0, 0x71, 0x6e, 0x43, 0x69, 0x7c, 0x08, 0x0, 0x0, 0x0, 0x39, 0x0 } }, - {0x170, /* Vertical Interval Timecode (VITC), NTSC */ - {V4l2_SLICED_VITC_525,10,20,0}, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x8f, 0x6d, 0x49, - 0x69, 0x94, 0x08, 0x00, 0x00, 0x00, 0x4c, 0x00 } + {0x150, /* VITC, PAL/SECAM 6 */ + { 0x0, 0x0, 0x0, 0x0 , 0x0, 0x8f, 0x6d, 0x49, 0xa6, 0x85, 0x08, 0x0, 0x0, 0x0, 0x4c, 0x0 } }, -#endif - {0x190, /* Video Program System (VPS), PAL */ - {V4L2_SLICED_VPS,16,16,0}, - { 0xaa, 0xaa, 0xff, 0xff, 0xba, 0xce, 0x2b, 0x0d, - 0xa6, 0xda, 0x0b, 0x00, 0x00, 0x00, 0x60, 0x00 } + {0x170, /* VITC, NTSC 6 */ + { 0x0, 0x0, 0x0, 0x0 , 0x0, 0x8f, 0x6d, 0x49, 0x69, 0x94, 0x08, 0x0, 0x0, 0x0, 0x4c, 0x0 } }, - /* 0x1d0 User programmable */ - - /* End of struct */ { (u16)-1 } }; static int tvp5150_write_inittab(struct i2c_client *c, - const struct i2c_reg_value *regs) + const struct i2c_reg_value *regs) { while (regs->reg != 0xff) { tvp5150_write(c, regs->reg, regs->value); @@ -588,15 +686,15 @@ static int tvp5150_write_inittab(struct i2c_client *c, } static int tvp5150_vdp_init(struct i2c_client *c, - const struct i2c_vbi_ram_value *regs) + const struct i2c_vbi_ram_value *regs) { unsigned int i; /* Disable Full Field */ - tvp5150_write(c, TVP5150_FULL_FIELD_ENA, 0); + tvp5150_write(c, TVP5150_FULL_FIELD_ENA_1, 0); /* Before programming, Line mode should be at 0xff */ - for (i=TVP5150_LINE_MODE_INI; i<=TVP5150_LINE_MODE_END; i++) + for (i=TVP5150_FULL_FIELD_ENA_2; i<=TVP5150_LINE_MODE_REG_44; i++) tvp5150_write(c, i, 0xff); /* Load Ram Table */ @@ -612,117 +710,6 @@ static int tvp5150_vdp_init(struct i2c_client *c, return 0; } -/* Fills VBI capabilities based on i2c_vbi_ram_value struct */ -static void tvp5150_vbi_get_cap(const struct i2c_vbi_ram_value *regs, - struct v4l2_sliced_vbi_cap *cap) -{ - int line; - - memset(cap, 0, sizeof *cap); - - while (regs->reg != (u16)-1 ) { - for (line=regs->type.ini_line;line<=regs->type.end_line;line++) { - cap->service_lines[0][line] |= regs->type.vbi_type; - } - cap->service_set |= regs->type.vbi_type; - - regs++; - } -} - -/* Set vbi processing - * type - one of tvp5150_vbi_types - * line - line to gather data - * fields: bit 0 field1, bit 1, field2 - * flags (default=0xf0) is a bitmask, were set means: - * bit 7: enable filtering null bytes on CC - * bit 6: send data also to FIFO - * bit 5: don't allow data with errors on FIFO - * bit 4: enable ECC when possible - * pix_align = pix alignment: - * LSB = field1 - * MSB = field2 - */ -static int tvp5150_set_vbi(struct i2c_client *c, - const struct i2c_vbi_ram_value *regs, - unsigned int type,u8 flags, int line, - const int fields) -{ - struct tvp5150 *decoder = i2c_get_clientdata(c); - v4l2_std_id std=decoder->norm; - u8 reg; - int pos=0; - - if (std == V4L2_STD_ALL) { - tvp5150_err("VBI can't be configured without knowing number of lines\n"); - return 0; - } else if (std && V4L2_STD_625_50) { - /* Don't follow NTSC Line number convension */ - line += 3; - } - - if (line<6||line>27) - return 0; - - while (regs->reg != (u16)-1 ) { - if ((type & regs->type.vbi_type) && - (line>=regs->type.ini_line) && - (line<=regs->type.end_line)) { - type=regs->type.vbi_type; - break; - } - - regs++; - pos++; - } - if (regs->reg == (u16)-1) - return 0; - - type=pos | (flags & 0xf0); - reg=((line-6)<<1)+TVP5150_LINE_MODE_INI; - - if (fields&1) { - tvp5150_write(c, reg, type); - } - - if (fields&2) { - tvp5150_write(c, reg+1, type); - } - - return type; -} - -static int tvp5150_get_vbi(struct i2c_client *c, - const struct i2c_vbi_ram_value *regs, int line) -{ - struct tvp5150 *decoder = i2c_get_clientdata(c); - v4l2_std_id std=decoder->norm; - u8 reg; - int pos, type=0; - - if (std == V4L2_STD_ALL) { - tvp5150_err("VBI can't be configured without knowing number of lines\n"); - return 0; - } else if (std && V4L2_STD_625_50) { - /* Don't follow NTSC Line number convension */ - line += 3; - } - - if (line<6||line>27) - return 0; - - reg=((line-6)<<1)+TVP5150_LINE_MODE_INI; - - pos=tvp5150_read(c, reg)&0x0f; - if (pos<0x0f) - type=regs[pos].type.vbi_type; - - pos=tvp5150_read(c, reg+1)&0x0f; - if (pos<0x0f) - type|=regs[pos].type.vbi_type; - - return type; -} static int tvp5150_set_std(struct i2c_client *c, v4l2_std_id std) { struct tvp5150 *decoder = i2c_get_clientdata(c); @@ -788,7 +775,7 @@ static inline void tvp5150_reset(struct i2c_client *c) tvp5150_vdp_init(c, vbi_ram_default); /* Selects decoder input */ - tvp5150_selmux(c); + tvp5150_selmux(c, decoder->input); /* Initializes TVP5150 to stream enabled values */ tvp5150_write_inittab(c, tvp5150_init_enable); @@ -856,23 +843,9 @@ static int tvp5150_command(struct i2c_client *c, case 0: case VIDIOC_INT_RESET: + case DECODER_INIT: tvp5150_reset(c); break; - case VIDIOC_INT_G_VIDEO_ROUTING: - { - struct v4l2_routing *route = arg; - - *route = decoder->route; - break; - } - case VIDIOC_INT_S_VIDEO_ROUTING: - { - struct v4l2_routing *route = arg; - - decoder->route = *route; - tvp5150_selmux(c); - break; - } case VIDIOC_S_STD: if (decoder->norm == *(v4l2_std_id *)arg) break; @@ -881,69 +854,6 @@ static int tvp5150_command(struct i2c_client *c, *(v4l2_std_id *)arg = decoder->norm; break; - case VIDIOC_G_SLICED_VBI_CAP: - { - struct v4l2_sliced_vbi_cap *cap = arg; - tvp5150_dbg(1, "VIDIOC_G_SLICED_VBI_CAP\n"); - - tvp5150_vbi_get_cap(vbi_ram_default, cap); - break; - } - case VIDIOC_S_FMT: - { - struct v4l2_format *fmt; - struct v4l2_sliced_vbi_format *svbi; - int i; - - fmt = arg; - if (fmt->type != V4L2_BUF_TYPE_SLICED_VBI_CAPTURE) - return -EINVAL; - svbi = &fmt->fmt.sliced; - if (svbi->service_set != 0) { - for (i = 0; i <= 23; i++) { - svbi->service_lines[1][i] = 0; - - svbi->service_lines[0][i]=tvp5150_set_vbi(c, - vbi_ram_default, - svbi->service_lines[0][i],0xf0,i,3); - } - /* Enables FIFO */ - tvp5150_write(c, TVP5150_FIFO_OUT_CTRL,1); - } else { - /* Disables FIFO*/ - tvp5150_write(c, TVP5150_FIFO_OUT_CTRL,0); - - /* Disable Full Field */ - tvp5150_write(c, TVP5150_FULL_FIELD_ENA, 0); - - /* Disable Line modes */ - for (i=TVP5150_LINE_MODE_INI; i<=TVP5150_LINE_MODE_END; i++) - tvp5150_write(c, i, 0xff); - } - break; - } - case VIDIOC_G_FMT: - { - struct v4l2_format *fmt; - struct v4l2_sliced_vbi_format *svbi; - - int i, mask=0; - - fmt = arg; - if (fmt->type != V4L2_BUF_TYPE_SLICED_VBI_CAPTURE) - return -EINVAL; - svbi = &fmt->fmt.sliced; - memset(svbi, 0, sizeof(*svbi)); - - for (i = 0; i <= 23; i++) { - svbi->service_lines[0][i]=tvp5150_get_vbi(c, - vbi_ram_default,i); - mask|=svbi->service_lines[0][i]; - } - svbi->service_set=mask; - break; - } - #ifdef CONFIG_VIDEO_ADV_DEBUG case VIDIOC_INT_G_REGISTER: { @@ -968,16 +878,99 @@ static int tvp5150_command(struct i2c_client *c, } #endif - case VIDIOC_LOG_STATUS: + case DECODER_DUMP: dump_reg(c); break; - case VIDIOC_G_TUNER: + case DECODER_GET_CAPABILITIES: + { + struct video_decoder_capability *cap = arg; + + cap->flags = VIDEO_DECODER_PAL | + VIDEO_DECODER_NTSC | + VIDEO_DECODER_SECAM | + VIDEO_DECODER_AUTO | VIDEO_DECODER_CCIR; + cap->inputs = 3; + cap->outputs = 1; + break; + } + case DECODER_GET_STATUS: { - struct v4l2_tuner *vt = arg; - int status = tvp5150_read(c, 0x88); + int *iarg = arg; + int status; + int res=0; + status = tvp5150_read(c, 0x88); + if(status&0x08){ + res |= DECODER_STATUS_COLOR; + } + if(status&0x04 && status&0x02){ + res |= DECODER_STATUS_GOOD; + } + *iarg=res; + break; + } + + case DECODER_SET_GPIO: + break; + + case DECODER_SET_VBI_BYPASS: + break; + + case DECODER_SET_NORM: + { + int *iarg = arg; + + switch (*iarg) { + + case VIDEO_MODE_NTSC: + break; + + case VIDEO_MODE_PAL: + break; + + case VIDEO_MODE_SECAM: + break; + + case VIDEO_MODE_AUTO: + break; + + default: + return -EINVAL; + + } + decoder->norm = *iarg; + break; + } + case DECODER_SET_INPUT: + { + int *iarg = arg; + if (*iarg < 0 || *iarg > 3) { + return -EINVAL; + } + + decoder->input = *iarg; + tvp5150_selmux(c, decoder->input); + + break; + } + case DECODER_SET_OUTPUT: + { + int *iarg = arg; + + /* not much choice of outputs */ + if (*iarg != 0) { + return -EINVAL; + } + break; + } + case DECODER_ENABLE_OUTPUT: + { + int *iarg = arg; + + decoder->enable = (*iarg != 0); + + tvp5150_selmux(c, decoder->input); - vt->signal = ((status & 0x04) && (status & 0x02)) ? 0xffff : 0x0; break; } case VIDIOC_QUERYCTRL: @@ -1023,6 +1016,35 @@ static int tvp5150_command(struct i2c_client *c, return -EINVAL; } + case DECODER_SET_PICTURE: + { + struct video_picture *pic = arg; + if (decoder->bright != pic->brightness) { + /* We want 0 to 255 we get 0-65535 */ + decoder->bright = pic->brightness; + tvp5150_write(c, TVP5150_BRIGHT_CTL, + decoder->bright >> 8); + } + if (decoder->contrast != pic->contrast) { + /* We want 0 to 255 we get 0-65535 */ + decoder->contrast = pic->contrast; + tvp5150_write(c, TVP5150_CONTRAST_CTL, + decoder->contrast >> 8); + } + if (decoder->sat != pic->colour) { + /* We want 0 to 255 we get 0-65535 */ + decoder->sat = pic->colour; + tvp5150_write(c, TVP5150_SATURATION_CTL, + decoder->contrast >> 8); + } + if (decoder->hue != pic->hue) { + /* We want -128 to 127 we get 0-65535 */ + decoder->hue = pic->hue; + tvp5150_write(c, TVP5150_HUE_CTL, + (decoder->hue - 32768) >> 8); + } + break; + } default: return -EINVAL; } @@ -1075,8 +1097,8 @@ static int tvp5150_detect_client(struct i2c_adapter *adapter, rv = i2c_attach_client(c); - core->norm = V4L2_STD_ALL; /* Default is autodetect */ - core->route.input = TVP5150_COMPOSITE1; + core->norm = V4L2_STD_ALL; + core->input = 2; core->enable = 1; core->bright = 32768; core->contrast = 32768; diff --git a/drivers/media/video/tvp5150_reg.h b/drivers/media/video/tvp5150_reg.h index 4240043c0..cd45c1ded 100644 --- a/drivers/media/video/tvp5150_reg.h +++ b/drivers/media/video/tvp5150_reg.h @@ -1,10 +1,3 @@ -/* - * tvp5150 - Texas Instruments TVP5150A/AM1 video decoder registers - * - * Copyright (c) 2005,2006 Mauro Carvalho Chehab (mchehab@infradead.org) - * This code is placed under the terms of the GNU General Public License v2 - */ - #define TVP5150_VD_IN_SRC_SEL_1 0x00 /* Video input source selection #1 */ #define TVP5150_ANAL_CHL_CTL 0x01 /* Analog channel controls */ #define TVP5150_OP_MODE_CTL 0x02 /* Operation mode controls */ @@ -71,32 +64,49 @@ #define TVP5150_STATUS_REG_4 0x8b /* Status register #4 */ #define TVP5150_STATUS_REG_5 0x8c /* Status register #5 */ /* Reserved 8Dh-8Fh */ - /* Closed caption data registers */ -#define TVP5150_CC_DATA_INI 0x90 -#define TVP5150_CC_DATA_END 0x93 - - /* WSS data registers */ -#define TVP5150_WSS_DATA_INI 0x94 -#define TVP5150_WSS_DATA_END 0x99 - -/* VPS data registers */ -#define TVP5150_VPS_DATA_INI 0x9a -#define TVP5150_VPS_DATA_END 0xa6 - -/* VITC data registers */ -#define TVP5150_VITC_DATA_INI 0xa7 -#define TVP5150_VITC_DATA_END 0xaf - +#define TVP5150_CC_DATA_REG1 0x90 /* Closed caption data registers */ +#define TVP5150_CC_DATA_REG2 0x91 /* Closed caption data registers */ +#define TVP5150_CC_DATA_REG3 0x92 /* Closed caption data registers */ +#define TVP5150_CC_DATA_REG4 0x93 /* Closed caption data registers */ +#define TVP5150_WSS_DATA_REG1 0X94 /* WSS data registers */ +#define TVP5150_WSS_DATA_REG2 0X95 /* WSS data registers */ +#define TVP5150_WSS_DATA_REG3 0X96 /* WSS data registers */ +#define TVP5150_WSS_DATA_REG4 0X97 /* WSS data registers */ +#define TVP5150_WSS_DATA_REG5 0X98 /* WSS data registers */ +#define TVP5150_WSS_DATA_REG6 0X99 /* WSS data registers */ +#define TVP5150_VPS_DATA_REG1 0x9a /* VPS data registers */ +#define TVP5150_VPS_DATA_REG2 0x9b /* VPS data registers */ +#define TVP5150_VPS_DATA_REG3 0x9c /* VPS data registers */ +#define TVP5150_VPS_DATA_REG4 0x9d /* VPS data registers */ +#define TVP5150_VPS_DATA_REG5 0x9e /* VPS data registers */ +#define TVP5150_VPS_DATA_REG6 0x9f /* VPS data registers */ +#define TVP5150_VPS_DATA_REG7 0xa0 /* VPS data registers */ +#define TVP5150_VPS_DATA_REG8 0xa1 /* VPS data registers */ +#define TVP5150_VPS_DATA_REG9 0xa2 /* VPS data registers */ +#define TVP5150_VPS_DATA_REG10 0xa3 /* VPS data registers */ +#define TVP5150_VPS_DATA_REG11 0xa4 /* VPS data registers */ +#define TVP5150_VPS_DATA_REG12 0xa5 /* VPS data registers */ +#define TVP5150_VPS_DATA_REG13 0xa6 /* VPS data registers */ +#define TVP5150_VITC_DATA_REG1 0xa7 /* VITC data registers */ +#define TVP5150_VITC_DATA_REG2 0xa8 /* VITC data registers */ +#define TVP5150_VITC_DATA_REG3 0xa9 /* VITC data registers */ +#define TVP5150_VITC_DATA_REG4 0xaa /* VITC data registers */ +#define TVP5150_VITC_DATA_REG5 0xab /* VITC data registers */ +#define TVP5150_VITC_DATA_REG6 0xac /* VITC data registers */ +#define TVP5150_VITC_DATA_REG7 0xad /* VITC data registers */ +#define TVP5150_VITC_DATA_REG8 0xae /* VITC data registers */ +#define TVP5150_VITC_DATA_REG9 0xaf /* VITC data registers */ #define TVP5150_VBI_FIFO_READ_DATA 0xb0 /* VBI FIFO read data */ - -/* Teletext filter 1 */ -#define TVP5150_TELETEXT_FIL1_INI 0xb1 -#define TVP5150_TELETEXT_FIL1_END 0xb5 - -/* Teletext filter 2 */ -#define TVP5150_TELETEXT_FIL2_INI 0xb6 -#define TVP5150_TELETEXT_FIL2_END 0xba - +#define TVP5150_TELETEXT_FIL_1_1 0xb1 /* Teletext filter 1 */ +#define TVP5150_TELETEXT_FIL_1_2 0xb2 /* Teletext filter 1 */ +#define TVP5150_TELETEXT_FIL_1_3 0xb3 /* Teletext filter 1 */ +#define TVP5150_TELETEXT_FIL_1_4 0xb4 /* Teletext filter 1 */ +#define TVP5150_TELETEXT_FIL_1_5 0xb5 /* Teletext filter 1 */ +#define TVP5150_TELETEXT_FIL_2_1 0xb6 /* Teletext filter 2 */ +#define TVP5150_TELETEXT_FIL_2_2 0xb7 /* Teletext filter 2 */ +#define TVP5150_TELETEXT_FIL_2_3 0xb8 /* Teletext filter 2 */ +#define TVP5150_TELETEXT_FIL_2_4 0xb9 /* Teletext filter 2 */ +#define TVP5150_TELETEXT_FIL_2_5 0xba /* Teletext filter 2 */ #define TVP5150_TELETEXT_FIL_ENA 0xbb /* Teletext filter enable */ /* Reserved BCh-BFh */ #define TVP5150_INT_STATUS_REG_A 0xc0 /* Interrupt status register A */ @@ -114,11 +124,50 @@ #define TVP5150_PIX_ALIGN_REG_HIGH 0xcc /* Pixel alignment register high byte */ #define TVP5150_FIFO_OUT_CTRL 0xcd /* FIFO output control */ /* Reserved CEh */ -#define TVP5150_FULL_FIELD_ENA 0xcf /* Full field enable 1 */ - -/* Line mode registers */ -#define TVP5150_LINE_MODE_INI 0xd0 -#define TVP5150_LINE_MODE_END 0xfb - +#define TVP5150_FULL_FIELD_ENA_1 0xcf /* Full field enable 1 */ +#define TVP5150_FULL_FIELD_ENA_2 0xd0 /* Full field enable 2 */ +#define TVP5150_LINE_MODE_REG_1 0xd1 /* Line mode registers */ +#define TVP5150_LINE_MODE_REG_2 0xd2 /* Line mode registers */ +#define TVP5150_LINE_MODE_REG_3 0xd3 /* Line mode registers */ +#define TVP5150_LINE_MODE_REG_4 0xd4 /* Line mode registers */ +#define TVP5150_LINE_MODE_REG_5 0xd5 /* Line mode registers */ +#define TVP5150_LINE_MODE_REG_6 0xd6 /* Line mode registers */ +#define TVP5150_LINE_MODE_REG_7 0xd7 /* Line mode registers */ +#define TVP5150_LINE_MODE_REG_8 0xd8 /* Line mode registers */ +#define TVP5150_LINE_MODE_REG_9 0xd9 /* Line mode registers */ +#define TVP5150_LINE_MODE_REG_10 0xda /* Line mode registers */ +#define TVP5150_LINE_MODE_REG_11 0xdb /* Line mode registers */ +#define TVP5150_LINE_MODE_REG_12 0xdc /* Line mode registers */ +#define TVP5150_LINE_MODE_REG_13 0xdd /* Line mode registers */ +#define TVP5150_LINE_MODE_REG_14 0xde /* Line mode registers */ +#define TVP5150_LINE_MODE_REG_15 0xdf /* Line mode registers */ +#define TVP5150_LINE_MODE_REG_16 0xe0 /* Line mode registers */ +#define TVP5150_LINE_MODE_REG_17 0xe1 /* Line mode registers */ +#define TVP5150_LINE_MODE_REG_18 0xe2 /* Line mode registers */ +#define TVP5150_LINE_MODE_REG_19 0xe3 /* Line mode registers */ +#define TVP5150_LINE_MODE_REG_20 0xe4 /* Line mode registers */ +#define TVP5150_LINE_MODE_REG_21 0xe5 /* Line mode registers */ +#define TVP5150_LINE_MODE_REG_22 0xe6 /* Line mode registers */ +#define TVP5150_LINE_MODE_REG_23 0xe7 /* Line mode registers */ +#define TVP5150_LINE_MODE_REG_24 0xe8 /* Line mode registers */ +#define TVP5150_LINE_MODE_REG_25 0xe9 /* Line mode registers */ +#define TVP5150_LINE_MODE_REG_27 0xea /* Line mode registers */ +#define TVP5150_LINE_MODE_REG_28 0xeb /* Line mode registers */ +#define TVP5150_LINE_MODE_REG_29 0xec /* Line mode registers */ +#define TVP5150_LINE_MODE_REG_30 0xed /* Line mode registers */ +#define TVP5150_LINE_MODE_REG_31 0xee /* Line mode registers */ +#define TVP5150_LINE_MODE_REG_32 0xef /* Line mode registers */ +#define TVP5150_LINE_MODE_REG_33 0xf0 /* Line mode registers */ +#define TVP5150_LINE_MODE_REG_34 0xf1 /* Line mode registers */ +#define TVP5150_LINE_MODE_REG_35 0xf2 /* Line mode registers */ +#define TVP5150_LINE_MODE_REG_36 0xf3 /* Line mode registers */ +#define TVP5150_LINE_MODE_REG_37 0xf4 /* Line mode registers */ +#define TVP5150_LINE_MODE_REG_38 0xf5 /* Line mode registers */ +#define TVP5150_LINE_MODE_REG_39 0xf6 /* Line mode registers */ +#define TVP5150_LINE_MODE_REG_40 0xf7 /* Line mode registers */ +#define TVP5150_LINE_MODE_REG_41 0xf8 /* Line mode registers */ +#define TVP5150_LINE_MODE_REG_42 0xf9 /* Line mode registers */ +#define TVP5150_LINE_MODE_REG_43 0xfa /* Line mode registers */ +#define TVP5150_LINE_MODE_REG_44 0xfb /* Line mode registers */ #define TVP5150_FULL_FIELD_MODE_REG 0xfc /* Full field mode register */ /* Reserved FDh-FFh */ diff --git a/drivers/media/video/v4l1-compat.c b/drivers/media/video/v4l1-compat.c index d7c3fcbc8..474a29bc1 100644 --- a/drivers/media/video/v4l1-compat.c +++ b/drivers/media/video/v4l1-compat.c @@ -16,6 +16,7 @@ * */ +#include #include #include @@ -31,7 +32,6 @@ #include #include #include -#include #include #include @@ -599,10 +599,6 @@ v4l_compat_translate_ioctl(struct inode *inode, dprintk("VIDIOCGPICT / VIDIOC_G_FMT: %d\n",err); break; } - - pict->depth = ((fmt2->fmt.pix.bytesperline<<3) - + (fmt2->fmt.pix.width-1) ) - /fmt2->fmt.pix.width; pict->palette = pixelformat_to_palette( fmt2->fmt.pix.pixelformat); break; diff --git a/drivers/media/video/v4l2-common.c b/drivers/media/video/v4l2-common.c index 8d972ffda..cd2c44755 100644 --- a/drivers/media/video/v4l2-common.c +++ b/drivers/media/video/v4l2-common.c @@ -44,6 +44,7 @@ * Added Gerd Knorrs v4l1 enhancements (Justin Schoeman) */ +#include #include #include #include @@ -58,7 +59,6 @@ #include #include #include -#define __OLD_VIDIOC_ /* To allow fixing old calls*/ #include #ifdef CONFIG_KMOD @@ -97,7 +97,7 @@ int v4l2_video_std_construct(struct v4l2_standard *vs, memset(vs, 0, sizeof(struct v4l2_standard)); vs->index = index; vs->id = id; - if (id & V4L2_STD_525_60) { + if (id & (V4L2_STD_NTSC | V4L2_STD_PAL_M)) { vs->frameperiod.numerator = 1001; vs->frameperiod.denominator = 30000; vs->framelines = 525; @@ -110,6 +110,7 @@ int v4l2_video_std_construct(struct v4l2_standard *vs, return 0; } + /* ----------------------------------------------------------------- */ /* priority handling */ @@ -170,7 +171,7 @@ int v4l2_prio_check(struct v4l2_prio_state *global, enum v4l2_priority *local) /* ----------------------------------------------------------------- */ -/* some arrays for pretty-printing debug messages of enum types */ +/* some arrays for pretty-printing debug messages */ char *v4l2_field_names[] = { [V4L2_FIELD_ANY] = "any", @@ -191,18 +192,10 @@ char *v4l2_type_names[] = { [V4L2_BUF_TYPE_VBI_OUTPUT] = "vbi-out", }; -static char *v4l2_memory_names[] = { - [V4L2_MEMORY_MMAP] = "mmap", - [V4L2_MEMORY_USERPTR] = "userptr", - [V4L2_MEMORY_OVERLAY] = "overlay", -}; - -#define prt_names(a,arr) (((a)>=0)&&((a)width,fmt->height,fmt->pixelformat, - prt_names(fmt->field,v4l2_field_names), - fmt->bytesperline,fmt->sizeimage,fmt->colorspace); -}; - /* Common ioctl debug function. This function can be used by external ioctl messages as well as internal V4L ioctl */ void v4l_printk_ioctl(unsigned int cmd) @@ -367,7 +343,7 @@ void v4l_printk_ioctl(unsigned int cmd) (_IOC_NR(cmd) < V4L2_INT_IOCTLS) ? v4l2_int_ioctls[_IOC_NR(cmd)] : "UNKNOWN", dir, cmd); break; -#ifdef CONFIG_VIDEO_V4L1_COMPAT +#ifdef HAVE_V4L1 case 'v': printk("v4l1 ioctl %s, dir=%s (0x%08x)\n", (_IOC_NR(cmd) < V4L1_IOCTLS) ? @@ -386,1068 +362,6 @@ void v4l_printk_ioctl(unsigned int cmd) } } -/* Common ioctl debug function. This function can be used by - external ioctl messages as well as internal V4L ioctl and its - arguments */ -void v4l_printk_ioctl_arg(char *s,unsigned int cmd, void *arg) -{ - printk(s); - printk(": "); - v4l_printk_ioctl(cmd); - switch (cmd) { - case VIDIOC_INT_G_CHIP_IDENT: - { - enum v4l2_chip_ident *p=arg; - printk ("%s: chip ident=%d\n", s, *p); - break; - } - case VIDIOC_G_PRIORITY: - case VIDIOC_S_PRIORITY: - { - enum v4l2_priority *p=arg; - printk ("%s: priority=%d\n", s, *p); - break; - } - case VIDIOC_INT_S_TUNER_MODE: - { - enum v4l2_tuner_type *p=arg; - printk ("%s: tuner type=%d\n", s, *p); - break; - } -#ifdef CONFIG_VIDEO_V4L1_COMPAT - case DECODER_SET_VBI_BYPASS: - case DECODER_ENABLE_OUTPUT: - case DECODER_GET_STATUS: - case DECODER_SET_OUTPUT: - case DECODER_SET_INPUT: - case DECODER_SET_GPIO: - case DECODER_SET_NORM: - case VIDIOCCAPTURE: - case VIDIOCSYNC: - case VIDIOCSWRITEMODE: -#endif - case TUNER_SET_TYPE_ADDR: - case TUNER_SET_STANDBY: - case TDA9887_SET_CONFIG: -#ifdef __OLD_VIDIOC_ - case VIDIOC_OVERLAY_OLD: -#endif - case VIDIOC_STREAMOFF: - case VIDIOC_G_OUTPUT: - case VIDIOC_S_OUTPUT: - case VIDIOC_STREAMON: - case VIDIOC_G_INPUT: - case VIDIOC_OVERLAY: - case VIDIOC_S_INPUT: - { - int *p=arg; - printk ("%s: value=%d\n", s, *p); - break; - } - case VIDIOC_G_AUDIO: - case VIDIOC_S_AUDIO: - case VIDIOC_ENUMAUDIO: -#ifdef __OLD_VIDIOC_ - case VIDIOC_G_AUDIO_OLD: -#endif - { - struct v4l2_audio *p=arg; - - printk ("%s: index=%d, name=%s, capability=%d, mode=%d\n", - s,p->index, p->name,p->capability, p->mode); - break; - } - case VIDIOC_G_AUDOUT: - case VIDIOC_S_AUDOUT: - case VIDIOC_ENUMAUDOUT: -#ifdef __OLD_VIDIOC_ - case VIDIOC_G_AUDOUT_OLD: -#endif - { - struct v4l2_audioout *p=arg; - printk ("%s: index=%d, name=%s, capability=%d, mode=%d\n", s, - p->index, p->name, p->capability,p->mode); - break; - } - case VIDIOC_QBUF: - case VIDIOC_DQBUF: - case VIDIOC_QUERYBUF: - { - struct v4l2_buffer *p=arg; - struct v4l2_timecode *tc=&p->timecode; - printk ("%s: %02ld:%02d:%02d.%08ld index=%d, type=%s, " - "bytesused=%d, flags=0x%08x, " - "field=%0d, sequence=%d, memory=%s, offset/userptr=0x%08lx\n", - s, - (p->timestamp.tv_sec/3600), - (int)(p->timestamp.tv_sec/60)%60, - (int)(p->timestamp.tv_sec%60), - p->timestamp.tv_usec, - p->index, - prt_names(p->type,v4l2_type_names), - p->bytesused,p->flags, - p->field,p->sequence, - prt_names(p->memory,v4l2_memory_names), - p->m.userptr); - printk ("%s: timecode= %02d:%02d:%02d type=%d, " - "flags=0x%08x, frames=%d, userbits=0x%08x\n", - s,tc->hours,tc->minutes,tc->seconds, - tc->type, tc->flags, tc->frames, *(__u32 *) tc->userbits); - break; - } - case VIDIOC_QUERYCAP: - { - struct v4l2_capability *p=arg; - printk ("%s: driver=%s, card=%s, bus=%s, version=0x%08x, " - "capabilities=0x%08x\n", s, - p->driver,p->card,p->bus_info, - p->version, - p->capabilities); - break; - } - case VIDIOC_G_CTRL: - case VIDIOC_S_CTRL: -#ifdef __OLD_VIDIOC_ - case VIDIOC_S_CTRL_OLD: -#endif - { - struct v4l2_control *p=arg; - printk ("%s: id=%d, value=%d\n", s, p->id, p->value); - break; - } - case VIDIOC_G_EXT_CTRLS: - case VIDIOC_S_EXT_CTRLS: - case VIDIOC_TRY_EXT_CTRLS: - { - struct v4l2_ext_controls *p = arg; - int i; - - printk("%s: ctrl_class=%d, count=%d\n", s, p->ctrl_class, p->count); - for (i = 0; i < p->count; i++) { - struct v4l2_ext_control *c = &p->controls[i]; - if (cmd == VIDIOC_G_EXT_CTRLS) - printk("%s: id=%d\n", s, c->id); - else - printk("%s: id=%d, value=%d\n", s, c->id, c->value); - } - break; - } - case VIDIOC_G_CROP: - case VIDIOC_S_CROP: - { - struct v4l2_crop *p=arg; - /*FIXME: Should also show rect structs */ - printk ("%s: type=%d\n", s, p->type); - break; - } - case VIDIOC_CROPCAP: -#ifdef __OLD_VIDIOC_ - case VIDIOC_CROPCAP_OLD: -#endif - { - struct v4l2_cropcap *p=arg; - /*FIXME: Should also show rect structs */ - printk ("%s: type=%d\n", s, p->type); - break; - } - case VIDIOC_INT_DECODE_VBI_LINE: - { - struct v4l2_decode_vbi_line *p=arg; - printk ("%s: is_second_field=%d, ptr=0x%08lx, line=%d, " - "type=%d\n", s, - p->is_second_field,(unsigned long)p->p,p->line,p->type); - break; - } - case VIDIOC_ENUM_FMT: - { - struct v4l2_fmtdesc *p=arg; - printk ("%s: index=%d, type=%d, flags=%d, description=%s," - " pixelformat=%d\n", s, - p->index, p->type, p->flags,p->description, - p->pixelformat); - - break; - } - case VIDIOC_G_FMT: - case VIDIOC_S_FMT: - case VIDIOC_TRY_FMT: - { - struct v4l2_format *p=arg; - printk ("%s: type=%s\n", s, - prt_names(p->type,v4l2_type_names)); - switch (p->type) { - case V4L2_BUF_TYPE_VIDEO_CAPTURE: - v4l_print_pix_fmt (s, &p->fmt.pix); - break; - default: - break; - } - } - case VIDIOC_G_FBUF: - case VIDIOC_S_FBUF: - { - struct v4l2_framebuffer *p=arg; - printk ("%s: capability=%d, flags=%d, base=0x%08lx\n", s, - p->capability,p->flags, (unsigned long)p->base); - v4l_print_pix_fmt (s, &p->fmt); - break; - } - case VIDIOC_G_FREQUENCY: - case VIDIOC_S_FREQUENCY: - { - struct v4l2_frequency *p=arg; - printk ("%s: tuner=%d, type=%d, frequency=%d\n", s, - p->tuner,p->type,p->frequency); - break; - } - case VIDIOC_ENUMINPUT: - { - struct v4l2_input *p=arg; - printk ("%s: index=%d, name=%s, type=%d, audioset=%d, " - "tuner=%d, std=%Ld, status=%d\n", s, - p->index,p->name,p->type,p->audioset, - p->tuner, - (unsigned long long)p->std, - p->status); - break; - } - case VIDIOC_G_JPEGCOMP: - case VIDIOC_S_JPEGCOMP: - { - struct v4l2_jpegcompression *p=arg; - printk ("%s: quality=%d, APPn=%d, APP_len=%d, COM_len=%d," - " jpeg_markers=%d\n", s, - p->quality,p->APPn,p->APP_len, - p->COM_len,p->jpeg_markers); - break; - } - case VIDIOC_G_MODULATOR: - case VIDIOC_S_MODULATOR: - { - struct v4l2_modulator *p=arg; - printk ("%s: index=%d, name=%s, capability=%d, rangelow=%d," - " rangehigh=%d, txsubchans=%d\n", s, - p->index, p->name,p->capability,p->rangelow, - p->rangehigh,p->txsubchans); - break; - } - case VIDIOC_G_MPEGCOMP: - case VIDIOC_S_MPEGCOMP: - { - struct v4l2_mpeg_compression *p=arg; - /*FIXME: Several fields not shown */ - printk ("%s: ts_pid_pmt=%d, ts_pid_audio=%d, ts_pid_video=%d, " - "ts_pid_pcr=%d, ps_size=%d, au_sample_rate=%d, " - "au_pesid=%c, vi_frame_rate=%d, vi_frames_per_gop=%d, " - "vi_bframes_count=%d, vi_pesid=%c\n", s, - p->ts_pid_pmt,p->ts_pid_audio, p->ts_pid_video, - p->ts_pid_pcr, p->ps_size, p->au_sample_rate, - p->au_pesid, p->vi_frame_rate, - p->vi_frames_per_gop, p->vi_bframes_count, - p->vi_pesid); - break; - } - case VIDIOC_ENUMOUTPUT: - { - struct v4l2_output *p=arg; - printk ("%s: index=%d, name=%s,type=%d, audioset=%d, " - "modulator=%d, std=%Ld\n", - s,p->index,p->name,p->type,p->audioset, - p->modulator, - (unsigned long long)p->std); - break; - } - case VIDIOC_QUERYCTRL: - { - struct v4l2_queryctrl *p=arg; - printk ("%s: id=%d, type=%d, name=%s, min/max=%d/%d," - " step=%d, default=%d, flags=0x%08x\n", s, - p->id,p->type,p->name,p->minimum,p->maximum, - p->step,p->default_value,p->flags); - break; - } - case VIDIOC_QUERYMENU: - { - struct v4l2_querymenu *p=arg; - printk ("%s: id=%d, index=%d, name=%s\n", s, - p->id,p->index,p->name); - break; - } - case VIDIOC_INT_G_REGISTER: - case VIDIOC_INT_S_REGISTER: - { - struct v4l2_register *p=arg; - printk ("%s: i2c_id=%d, reg=%lu, val=%d\n", s, - p->i2c_id,p->reg,p->val); - - break; - } - case VIDIOC_REQBUFS: - { - struct v4l2_requestbuffers *p=arg; - printk ("%s: count=%d, type=%s, memory=%s\n", s, - p->count, - prt_names(p->type,v4l2_type_names), - prt_names(p->memory,v4l2_memory_names)); - break; - } - case VIDIOC_INT_S_AUDIO_ROUTING: - case VIDIOC_INT_S_VIDEO_ROUTING: - case VIDIOC_INT_G_AUDIO_ROUTING: - case VIDIOC_INT_G_VIDEO_ROUTING: - { - struct v4l2_routing *p=arg; - printk ("%s: input=0x%x, output=0x%x\n", s, p->input, p->output); - break; - } - case VIDIOC_INT_S_CRYSTAL_FREQ: - { - struct v4l2_crystal_freq *p=arg; - printk ("%s: freq=%u, flags=0x%x\n", s, p->freq, p->flags); - break; - } - case VIDIOC_G_SLICED_VBI_CAP: - { - struct v4l2_sliced_vbi_cap *p=arg; - printk ("%s: service_set=%d\n", s, - p->service_set); - break; - } - case VIDIOC_INT_S_VBI_DATA: - case VIDIOC_INT_G_VBI_DATA: - { - struct v4l2_sliced_vbi_data *p=arg; - printk ("%s: id=%d, field=%d, line=%d\n", s, - p->id, p->field, p->line); - break; - } - case VIDIOC_ENUMSTD: - { - struct v4l2_standard *p=arg; - printk ("%s: index=%d, id=%Ld, name=%s, fps=%d/%d, " - "framelines=%d\n", s, p->index, - (unsigned long long)p->id, p->name, - p->frameperiod.numerator, - p->frameperiod.denominator, - p->framelines); - - break; - } - case VIDIOC_G_PARM: - case VIDIOC_S_PARM: -#ifdef __OLD_VIDIOC_ - case VIDIOC_S_PARM_OLD: -#endif - { - struct v4l2_streamparm *p=arg; - printk ("%s: type=%d\n", s, p->type); - - break; - } - case VIDIOC_G_TUNER: - case VIDIOC_S_TUNER: - { - struct v4l2_tuner *p=arg; - printk ("%s: index=%d, name=%s, type=%d, capability=%d, " - "rangelow=%d, rangehigh=%d, signal=%d, afc=%d, " - "rxsubchans=%d, audmode=%d\n", s, - p->index, p->name, p->type, - p->capability, p->rangelow,p->rangehigh, - p->rxsubchans, p->audmode, p->signal, - p->afc); - break; - } -#ifdef CONFIG_VIDEO_V4L1_COMPAT - case VIDIOCGVBIFMT: - case VIDIOCSVBIFMT: - { - struct vbi_format *p=arg; - printk ("%s: sampling_rate=%d, samples_per_line=%d, " - "sample_format=%d, start=%d/%d, count=%d/%d, flags=%d\n", s, - p->sampling_rate,p->samples_per_line, - p->sample_format,p->start[0],p->start[1], - p->count[0],p->count[1],p->flags); - break; - } - case VIDIOCGAUDIO: - case VIDIOCSAUDIO: - { - struct video_audio *p=arg; - printk ("%s: audio=%d, volume=%d, bass=%d, treble=%d, " - "flags=%d, name=%s, mode=%d, balance=%d, step=%d\n", - s,p->audio,p->volume,p->bass, p->treble, - p->flags,p->name,p->mode,p->balance,p->step); - break; - } - case VIDIOCGFBUF: - case VIDIOCSFBUF: - { - struct video_buffer *p=arg; - printk ("%s: base=%08lx, height=%d, width=%d, depth=%d, " - "bytesperline=%d\n", s, - (unsigned long) p->base, p->height, p->width, - p->depth,p->bytesperline); - break; - } - case VIDIOCGCAP: - { - struct video_capability *p=arg; - printk ("%s: name=%s, type=%d, channels=%d, audios=%d, " - "maxwidth=%d, maxheight=%d, minwidth=%d, minheight=%d\n", - s,p->name,p->type,p->channels,p->audios, - p->maxwidth,p->maxheight,p->minwidth, - p->minheight); - - break; - } - case VIDIOCGCAPTURE: - case VIDIOCSCAPTURE: - { - struct video_capture *p=arg; - printk ("%s: x=%d, y=%d, width=%d, height=%d, decimation=%d," - " flags=%d\n", s, - p->x, p->y,p->width, p->height, - p->decimation,p->flags); - break; - } - case VIDIOCGCHAN: - case VIDIOCSCHAN: - { - struct video_channel *p=arg; - printk ("%s: channel=%d, name=%s, tuners=%d, flags=%d, " - "type=%d, norm=%d\n", s, - p->channel,p->name,p->tuners, - p->flags,p->type,p->norm); - - break; - } - case VIDIOCSMICROCODE: - { - struct video_code *p=arg; - printk ("%s: loadwhat=%s, datasize=%d\n", s, - p->loadwhat,p->datasize); - break; - } - case DECODER_GET_CAPABILITIES: - { - struct video_decoder_capability *p=arg; - printk ("%s: flags=%d, inputs=%d, outputs=%d\n", s, - p->flags,p->inputs,p->outputs); - break; - } - case DECODER_INIT: - { - struct video_decoder_init *p=arg; - printk ("%s: len=%c\n", s, p->len); - break; - } - case VIDIOCGPLAYINFO: - { - struct video_info *p=arg; - printk ("%s: frame_count=%d, h_size=%d, v_size=%d, " - "smpte_timecode=%d, picture_type=%d, " - "temporal_reference=%d, user_data=%s\n", s, - p->frame_count, p->h_size, - p->v_size, p->smpte_timecode, - p->picture_type, p->temporal_reference, - p->user_data); - break; - } - case VIDIOCKEY: - { - struct video_key *p=arg; - printk ("%s: key=%s, flags=%d\n", s, - p->key, p->flags); - break; - } - case VIDIOCGMBUF: - { - struct video_mbuf *p=arg; - printk ("%s: size=%d, frames=%d, offsets=0x%08lx\n", s, - p->size, - p->frames, - (unsigned long)p->offsets); - break; - } - case VIDIOCMCAPTURE: - { - struct video_mmap *p=arg; - printk ("%s: frame=%d, height=%d, width=%d, format=%d\n", s, - p->frame, - p->height, p->width, - p->format); - break; - } - case VIDIOCGPICT: - case VIDIOCSPICT: - case DECODER_SET_PICTURE: - { - struct video_picture *p=arg; - - printk ("%s: brightness=%d, hue=%d, colour=%d, contrast=%d," - " whiteness=%d, depth=%d, palette=%d\n", s, - p->brightness, p->hue, p->colour, - p->contrast, p->whiteness, p->depth, - p->palette); - break; - } - case VIDIOCSPLAYMODE: - { - struct video_play_mode *p=arg; - printk ("%s: mode=%d, p1=%d, p2=%d\n", s, - p->mode,p->p1,p->p2); - break; - } - case VIDIOCGTUNER: - case VIDIOCSTUNER: - { - struct video_tuner *p=arg; - printk ("%s: tuner=%d, name=%s, rangelow=%ld, rangehigh=%ld, " - "flags=%d, mode=%d, signal=%d\n", s, - p->tuner, p->name,p->rangelow, p->rangehigh, - p->flags,p->mode, p->signal); - break; - } - case VIDIOCGUNIT: - { - struct video_unit *p=arg; - printk ("%s: video=%d, vbi=%d, radio=%d, audio=%d, " - "teletext=%d\n", s, - p->video,p->vbi,p->radio,p->audio,p->teletext); - break; - } - case VIDIOCGWIN: - case VIDIOCSWIN: - { - struct video_window *p=arg; - printk ("%s: x=%d, y=%d, width=%d, height=%d, chromakey=%d," - " flags=%d, clipcount=%d\n", s, - p->x, p->y,p->width, p->height, - p->chromakey,p->flags, - p->clipcount); - break; - } - case VIDIOCGFREQ: - case VIDIOCSFREQ: - { - unsigned long *p=arg; - printk ("%s: value=%lu\n", s, *p); - break; - } -#endif - case VIDIOC_INT_AUDIO_CLOCK_FREQ: - case VIDIOC_INT_I2S_CLOCK_FREQ: - case VIDIOC_INT_S_STANDBY: - { - u32 *p=arg; - - printk ("%s: value=%d\n", s, *p); - break; - } - case VIDIOC_G_STD: - case VIDIOC_S_STD: - case VIDIOC_QUERYSTD: - { - v4l2_std_id *p=arg; - - printk ("%s: value=%Lu\n", s, (unsigned long long)*p); - break; - } - } -} - -/* ----------------------------------------------------------------- */ - -/* Helper functions for control handling */ - -/* Check for correctness of the ctrl's value based on the data from - struct v4l2_queryctrl and the available menu items. Note that - menu_items may be NULL, in that case it is ignored. */ -int v4l2_ctrl_check(struct v4l2_ext_control *ctrl, struct v4l2_queryctrl *qctrl, - const char **menu_items) -{ - if (qctrl->flags & V4L2_CTRL_FLAG_DISABLED) - return -EINVAL; - if (qctrl->flags & V4L2_CTRL_FLAG_GRABBED) - return -EBUSY; - if (qctrl->type == V4L2_CTRL_TYPE_BUTTON || - qctrl->type == V4L2_CTRL_TYPE_INTEGER64 || - qctrl->type == V4L2_CTRL_TYPE_CTRL_CLASS) - return 0; - if (ctrl->value < qctrl->minimum || ctrl->value > qctrl->maximum) - return -ERANGE; - if (qctrl->type == V4L2_CTRL_TYPE_MENU && menu_items != NULL) { - if (menu_items[ctrl->value] == NULL || - menu_items[ctrl->value][0] == '\0') - return -EINVAL; - } - return 0; -} - -/* Returns NULL or a character pointer array containing the menu for - the given control ID. The pointer array ends with a NULL pointer. - An empty string signifies a menu entry that is invalid. This allows - drivers to disable certain options if it is not supported. */ -const char **v4l2_ctrl_get_menu(u32 id) -{ - static const char *mpeg_audio_sampling_freq[] = { - "44.1 kHz", - "48 kHz", - "32 kHz", - NULL - }; - static const char *mpeg_audio_encoding[] = { - "Layer I", - "Layer II", - "Layer III", - NULL - }; - static const char *mpeg_audio_l1_bitrate[] = { - "32 kbps", - "64 kbps", - "96 kbps", - "128 kbps", - "160 kbps", - "192 kbps", - "224 kbps", - "256 kbps", - "288 kbps", - "320 kbps", - "352 kbps", - "384 kbps", - "416 kbps", - "448 kbps", - NULL - }; - static const char *mpeg_audio_l2_bitrate[] = { - "32 kbps", - "48 kbps", - "56 kbps", - "64 kbps", - "80 kbps", - "96 kbps", - "112 kbps", - "128 kbps", - "160 kbps", - "192 kbps", - "224 kbps", - "256 kbps", - "320 kbps", - "384 kbps", - NULL - }; - static const char *mpeg_audio_l3_bitrate[] = { - "32 kbps", - "40 kbps", - "48 kbps", - "56 kbps", - "64 kbps", - "80 kbps", - "96 kbps", - "112 kbps", - "128 kbps", - "160 kbps", - "192 kbps", - "224 kbps", - "256 kbps", - "320 kbps", - NULL - }; - static const char *mpeg_audio_mode[] = { - "Stereo", - "Joint Stereo", - "Dual", - "Mono", - NULL - }; - static const char *mpeg_audio_mode_extension[] = { - "Bound 4", - "Bound 8", - "Bound 12", - "Bound 16", - NULL - }; - static const char *mpeg_audio_emphasis[] = { - "No Emphasis", - "50/15 us", - "CCITT J17", - NULL - }; - static const char *mpeg_audio_crc[] = { - "No CRC", - "16-bit CRC", - NULL - }; - static const char *mpeg_video_encoding[] = { - "MPEG-1", - "MPEG-2", - NULL - }; - static const char *mpeg_video_aspect[] = { - "1x1", - "4x3", - "16x9", - "2.21x1", - NULL - }; - static const char *mpeg_video_bitrate_mode[] = { - "Variable Bitrate", - "Constant Bitrate", - NULL - }; - static const char *mpeg_stream_type[] = { - "MPEG-2 Program Stream", - "MPEG-2 Transport Stream", - "MPEG-1 System Stream", - "MPEG-2 DVD-compatible Stream", - "MPEG-1 VCD-compatible Stream", - "MPEG-2 SVCD-compatible Stream", - NULL - }; - static const char *mpeg_stream_vbi_fmt[] = { - "No VBI", - "Private packet, IVTV format", - NULL - }; - - switch (id) { - case V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ: - return mpeg_audio_sampling_freq; - case V4L2_CID_MPEG_AUDIO_ENCODING: - return mpeg_audio_encoding; - case V4L2_CID_MPEG_AUDIO_L1_BITRATE: - return mpeg_audio_l1_bitrate; - case V4L2_CID_MPEG_AUDIO_L2_BITRATE: - return mpeg_audio_l2_bitrate; - case V4L2_CID_MPEG_AUDIO_L3_BITRATE: - return mpeg_audio_l3_bitrate; - case V4L2_CID_MPEG_AUDIO_MODE: - return mpeg_audio_mode; - case V4L2_CID_MPEG_AUDIO_MODE_EXTENSION: - return mpeg_audio_mode_extension; - case V4L2_CID_MPEG_AUDIO_EMPHASIS: - return mpeg_audio_emphasis; - case V4L2_CID_MPEG_AUDIO_CRC: - return mpeg_audio_crc; - case V4L2_CID_MPEG_VIDEO_ENCODING: - return mpeg_video_encoding; - case V4L2_CID_MPEG_VIDEO_ASPECT: - return mpeg_video_aspect; - case V4L2_CID_MPEG_VIDEO_BITRATE_MODE: - return mpeg_video_bitrate_mode; - case V4L2_CID_MPEG_STREAM_TYPE: - return mpeg_stream_type; - case V4L2_CID_MPEG_STREAM_VBI_FMT: - return mpeg_stream_vbi_fmt; - default: - return NULL; - } -} - -/* Fill in a struct v4l2_queryctrl */ -int v4l2_ctrl_query_fill(struct v4l2_queryctrl *qctrl, s32 min, s32 max, s32 step, s32 def) -{ - const char *name; - - qctrl->flags = 0; - switch (qctrl->id) { - /* USER controls */ - case V4L2_CID_USER_CLASS: name = "User Controls"; break; - case V4L2_CID_AUDIO_VOLUME: name = "Volume"; break; - case V4L2_CID_AUDIO_MUTE: name = "Mute"; break; - case V4L2_CID_AUDIO_BALANCE: name = "Balance"; break; - case V4L2_CID_AUDIO_BASS: name = "Bass"; break; - case V4L2_CID_AUDIO_TREBLE: name = "Treble"; break; - case V4L2_CID_AUDIO_LOUDNESS: name = "Loudness"; break; - case V4L2_CID_BRIGHTNESS: name = "Brightness"; break; - case V4L2_CID_CONTRAST: name = "Contrast"; break; - case V4L2_CID_SATURATION: name = "Saturation"; break; - case V4L2_CID_HUE: name = "Hue"; break; - - /* MPEG controls */ - case V4L2_CID_MPEG_CLASS: name = "MPEG Encoder Controls"; break; - case V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ: name = "Audio Sampling Frequency"; break; - case V4L2_CID_MPEG_AUDIO_ENCODING: name = "Audio Encoding Layer"; break; - case V4L2_CID_MPEG_AUDIO_L1_BITRATE: name = "Audio Layer I Bitrate"; break; - case V4L2_CID_MPEG_AUDIO_L2_BITRATE: name = "Audio Layer II Bitrate"; break; - case V4L2_CID_MPEG_AUDIO_L3_BITRATE: name = "Audio Layer III Bitrate"; break; - case V4L2_CID_MPEG_AUDIO_MODE: name = "Audio Stereo Mode"; break; - case V4L2_CID_MPEG_AUDIO_MODE_EXTENSION: name = "Audio Stereo Mode Extension"; break; - case V4L2_CID_MPEG_AUDIO_EMPHASIS: name = "Audio Emphasis"; break; - case V4L2_CID_MPEG_AUDIO_CRC: name = "Audio CRC"; break; - case V4L2_CID_MPEG_VIDEO_ENCODING: name = "Video Encoding"; break; - case V4L2_CID_MPEG_VIDEO_ASPECT: name = "Video Aspect"; break; - case V4L2_CID_MPEG_VIDEO_B_FRAMES: name = "Video B Frames"; break; - case V4L2_CID_MPEG_VIDEO_GOP_SIZE: name = "Video GOP Size"; break; - case V4L2_CID_MPEG_VIDEO_GOP_CLOSURE: name = "Video GOP Closure"; break; - case V4L2_CID_MPEG_VIDEO_PULLDOWN: name = "Video Pulldown"; break; - case V4L2_CID_MPEG_VIDEO_BITRATE_MODE: name = "Video Bitrate Mode"; break; - case V4L2_CID_MPEG_VIDEO_BITRATE: name = "Video Bitrate"; break; - case V4L2_CID_MPEG_VIDEO_BITRATE_PEAK: name = "Video Peak Bitrate"; break; - case V4L2_CID_MPEG_VIDEO_TEMPORAL_DECIMATION: name = "Video Temporal Decimation"; break; - case V4L2_CID_MPEG_STREAM_TYPE: name = "Stream Type"; break; - case V4L2_CID_MPEG_STREAM_PID_PMT: name = "Stream PMT Program ID"; break; - case V4L2_CID_MPEG_STREAM_PID_AUDIO: name = "Stream Audio Program ID"; break; - case V4L2_CID_MPEG_STREAM_PID_VIDEO: name = "Stream Video Program ID"; break; - case V4L2_CID_MPEG_STREAM_PID_PCR: name = "Stream PCR Program ID"; break; - case V4L2_CID_MPEG_STREAM_PES_ID_AUDIO: name = "Stream PES Audio ID"; break; - case V4L2_CID_MPEG_STREAM_PES_ID_VIDEO: name = "Stream PES Video ID"; break; - case V4L2_CID_MPEG_STREAM_VBI_FMT: name = "Stream VBI Format"; break; - - default: - return -EINVAL; - } - switch (qctrl->id) { - case V4L2_CID_AUDIO_MUTE: - case V4L2_CID_AUDIO_LOUDNESS: - case V4L2_CID_MPEG_VIDEO_GOP_CLOSURE: - case V4L2_CID_MPEG_VIDEO_PULLDOWN: - qctrl->type = V4L2_CTRL_TYPE_BOOLEAN; - min = 0; - max = step = 1; - break; - case V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ: - case V4L2_CID_MPEG_AUDIO_ENCODING: - case V4L2_CID_MPEG_AUDIO_L1_BITRATE: - case V4L2_CID_MPEG_AUDIO_L2_BITRATE: - case V4L2_CID_MPEG_AUDIO_L3_BITRATE: - case V4L2_CID_MPEG_AUDIO_MODE: - case V4L2_CID_MPEG_AUDIO_MODE_EXTENSION: - case V4L2_CID_MPEG_AUDIO_EMPHASIS: - case V4L2_CID_MPEG_AUDIO_CRC: - case V4L2_CID_MPEG_VIDEO_ENCODING: - case V4L2_CID_MPEG_VIDEO_ASPECT: - case V4L2_CID_MPEG_VIDEO_BITRATE_MODE: - case V4L2_CID_MPEG_STREAM_TYPE: - case V4L2_CID_MPEG_STREAM_VBI_FMT: - qctrl->type = V4L2_CTRL_TYPE_MENU; - step = 1; - break; - case V4L2_CID_USER_CLASS: - case V4L2_CID_MPEG_CLASS: - qctrl->type = V4L2_CTRL_TYPE_CTRL_CLASS; - qctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY; - min = max = step = def = 0; - break; - default: - qctrl->type = V4L2_CTRL_TYPE_INTEGER; - break; - } - switch (qctrl->id) { - case V4L2_CID_MPEG_AUDIO_ENCODING: - case V4L2_CID_MPEG_AUDIO_MODE: - case V4L2_CID_MPEG_VIDEO_BITRATE_MODE: - case V4L2_CID_MPEG_VIDEO_B_FRAMES: - case V4L2_CID_MPEG_STREAM_TYPE: - qctrl->flags |= V4L2_CTRL_FLAG_UPDATE; - break; - case V4L2_CID_AUDIO_VOLUME: - case V4L2_CID_AUDIO_BALANCE: - case V4L2_CID_AUDIO_BASS: - case V4L2_CID_AUDIO_TREBLE: - case V4L2_CID_BRIGHTNESS: - case V4L2_CID_CONTRAST: - case V4L2_CID_SATURATION: - case V4L2_CID_HUE: - qctrl->flags |= V4L2_CTRL_FLAG_SLIDER; - break; - } - qctrl->minimum = min; - qctrl->maximum = max; - qctrl->step = step; - qctrl->default_value = def; - qctrl->reserved[0] = qctrl->reserved[1] = 0; - snprintf(qctrl->name, sizeof(qctrl->name), name); - return 0; -} - -/* Fill in a struct v4l2_queryctrl with standard values based on - the control ID. */ -int v4l2_ctrl_query_fill_std(struct v4l2_queryctrl *qctrl) -{ - switch (qctrl->id) { - /* USER controls */ - case V4L2_CID_USER_CLASS: - case V4L2_CID_MPEG_CLASS: - return v4l2_ctrl_query_fill(qctrl, 0, 0, 0, 0); - case V4L2_CID_AUDIO_VOLUME: - return v4l2_ctrl_query_fill(qctrl, 0, 65535, 65535 / 100, 58880); - case V4L2_CID_AUDIO_MUTE: - case V4L2_CID_AUDIO_LOUDNESS: - return v4l2_ctrl_query_fill(qctrl, 0, 1, 1, 0); - case V4L2_CID_AUDIO_BALANCE: - case V4L2_CID_AUDIO_BASS: - case V4L2_CID_AUDIO_TREBLE: - return v4l2_ctrl_query_fill(qctrl, 0, 65535, 65535 / 100, 32768); - case V4L2_CID_BRIGHTNESS: - return v4l2_ctrl_query_fill(qctrl, 0, 255, 1, 128); - case V4L2_CID_CONTRAST: - case V4L2_CID_SATURATION: - return v4l2_ctrl_query_fill(qctrl, 0, 127, 1, 64); - case V4L2_CID_HUE: - return v4l2_ctrl_query_fill(qctrl, -128, 127, 1, 0); - - /* MPEG controls */ - case V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ: - return v4l2_ctrl_query_fill(qctrl, - V4L2_MPEG_AUDIO_SAMPLING_FREQ_44100, - V4L2_MPEG_AUDIO_SAMPLING_FREQ_32000, 1, - V4L2_MPEG_AUDIO_SAMPLING_FREQ_48000); - case V4L2_CID_MPEG_AUDIO_ENCODING: - return v4l2_ctrl_query_fill(qctrl, - V4L2_MPEG_AUDIO_ENCODING_LAYER_1, - V4L2_MPEG_AUDIO_ENCODING_LAYER_3, 1, - V4L2_MPEG_AUDIO_ENCODING_LAYER_2); - case V4L2_CID_MPEG_AUDIO_L1_BITRATE: - return v4l2_ctrl_query_fill(qctrl, - V4L2_MPEG_AUDIO_L1_BITRATE_32K, - V4L2_MPEG_AUDIO_L1_BITRATE_448K, 1, - V4L2_MPEG_AUDIO_L1_BITRATE_256K); - case V4L2_CID_MPEG_AUDIO_L2_BITRATE: - return v4l2_ctrl_query_fill(qctrl, - V4L2_MPEG_AUDIO_L2_BITRATE_32K, - V4L2_MPEG_AUDIO_L2_BITRATE_384K, 1, - V4L2_MPEG_AUDIO_L2_BITRATE_224K); - case V4L2_CID_MPEG_AUDIO_L3_BITRATE: - return v4l2_ctrl_query_fill(qctrl, - V4L2_MPEG_AUDIO_L3_BITRATE_32K, - V4L2_MPEG_AUDIO_L3_BITRATE_320K, 1, - V4L2_MPEG_AUDIO_L3_BITRATE_192K); - case V4L2_CID_MPEG_AUDIO_MODE: - return v4l2_ctrl_query_fill(qctrl, - V4L2_MPEG_AUDIO_MODE_STEREO, - V4L2_MPEG_AUDIO_MODE_MONO, 1, - V4L2_MPEG_AUDIO_MODE_STEREO); - case V4L2_CID_MPEG_AUDIO_MODE_EXTENSION: - return v4l2_ctrl_query_fill(qctrl, - V4L2_MPEG_AUDIO_MODE_EXTENSION_BOUND_4, - V4L2_MPEG_AUDIO_MODE_EXTENSION_BOUND_16, 1, - V4L2_MPEG_AUDIO_MODE_EXTENSION_BOUND_4); - case V4L2_CID_MPEG_AUDIO_EMPHASIS: - return v4l2_ctrl_query_fill(qctrl, - V4L2_MPEG_AUDIO_EMPHASIS_NONE, - V4L2_MPEG_AUDIO_EMPHASIS_CCITT_J17, 1, - V4L2_MPEG_AUDIO_EMPHASIS_NONE); - case V4L2_CID_MPEG_AUDIO_CRC: - return v4l2_ctrl_query_fill(qctrl, - V4L2_MPEG_AUDIO_CRC_NONE, - V4L2_MPEG_AUDIO_CRC_CRC16, 1, - V4L2_MPEG_AUDIO_CRC_NONE); - case V4L2_CID_MPEG_VIDEO_ENCODING: - return v4l2_ctrl_query_fill(qctrl, - V4L2_MPEG_VIDEO_ENCODING_MPEG_1, - V4L2_MPEG_VIDEO_ENCODING_MPEG_2, 1, - V4L2_MPEG_VIDEO_ENCODING_MPEG_2); - case V4L2_CID_MPEG_VIDEO_ASPECT: - return v4l2_ctrl_query_fill(qctrl, - V4L2_MPEG_VIDEO_ASPECT_1x1, - V4L2_MPEG_VIDEO_ASPECT_221x100, 1, - V4L2_MPEG_VIDEO_ASPECT_4x3); - case V4L2_CID_MPEG_VIDEO_B_FRAMES: - return v4l2_ctrl_query_fill(qctrl, 0, 33, 1, 2); - case V4L2_CID_MPEG_VIDEO_GOP_SIZE: - return v4l2_ctrl_query_fill(qctrl, 1, 34, 1, 12); - case V4L2_CID_MPEG_VIDEO_GOP_CLOSURE: - return v4l2_ctrl_query_fill(qctrl, 0, 1, 1, 1); - case V4L2_CID_MPEG_VIDEO_PULLDOWN: - return v4l2_ctrl_query_fill(qctrl, 0, 1, 1, 0); - case V4L2_CID_MPEG_VIDEO_BITRATE_MODE: - return v4l2_ctrl_query_fill(qctrl, - V4L2_MPEG_VIDEO_BITRATE_MODE_VBR, - V4L2_MPEG_VIDEO_BITRATE_MODE_CBR, 1, - V4L2_MPEG_VIDEO_BITRATE_MODE_VBR); - case V4L2_CID_MPEG_VIDEO_BITRATE: - return v4l2_ctrl_query_fill(qctrl, 0, 27000000, 1, 6000000); - case V4L2_CID_MPEG_VIDEO_BITRATE_PEAK: - return v4l2_ctrl_query_fill(qctrl, 0, 27000000, 1, 8000000); - case V4L2_CID_MPEG_VIDEO_TEMPORAL_DECIMATION: - return v4l2_ctrl_query_fill(qctrl, 0, 255, 1, 0); - case V4L2_CID_MPEG_STREAM_TYPE: - return v4l2_ctrl_query_fill(qctrl, - V4L2_MPEG_STREAM_TYPE_MPEG2_PS, - V4L2_MPEG_STREAM_TYPE_MPEG2_SVCD, 1, - V4L2_MPEG_STREAM_TYPE_MPEG2_PS); - case V4L2_CID_MPEG_STREAM_PID_PMT: - return v4l2_ctrl_query_fill(qctrl, 0, (1 << 14) - 1, 1, 16); - case V4L2_CID_MPEG_STREAM_PID_AUDIO: - return v4l2_ctrl_query_fill(qctrl, 0, (1 << 14) - 1, 1, 260); - case V4L2_CID_MPEG_STREAM_PID_VIDEO: - return v4l2_ctrl_query_fill(qctrl, 0, (1 << 14) - 1, 1, 256); - case V4L2_CID_MPEG_STREAM_PID_PCR: - return v4l2_ctrl_query_fill(qctrl, 0, (1 << 14) - 1, 1, 259); - case V4L2_CID_MPEG_STREAM_PES_ID_AUDIO: - return v4l2_ctrl_query_fill(qctrl, 0, 255, 1, 0); - case V4L2_CID_MPEG_STREAM_PES_ID_VIDEO: - return v4l2_ctrl_query_fill(qctrl, 0, 255, 1, 0); - case V4L2_CID_MPEG_STREAM_VBI_FMT: - return v4l2_ctrl_query_fill(qctrl, - V4L2_MPEG_STREAM_VBI_FMT_NONE, - V4L2_MPEG_STREAM_VBI_FMT_IVTV, 1, - V4L2_MPEG_STREAM_VBI_FMT_NONE); - default: - return -EINVAL; - } -} - -/* Fill in a struct v4l2_querymenu based on the struct v4l2_queryctrl and - the menu. The qctrl pointer may be NULL, in which case it is ignored. */ -int v4l2_ctrl_query_menu(struct v4l2_querymenu *qmenu, struct v4l2_queryctrl *qctrl, - const char **menu_items) -{ - int i; - - if (menu_items == NULL || - (qctrl && (qmenu->index < qctrl->minimum || qmenu->index > qctrl->maximum))) - return -EINVAL; - for (i = 0; i < qmenu->index && menu_items[i]; i++) ; - if (menu_items[i] == NULL || menu_items[i][0] == '\0') - return -EINVAL; - snprintf(qmenu->name, sizeof(qmenu->name), menu_items[qmenu->index]); - qmenu->reserved = 0; - return 0; -} - -/* ctrl_classes points to an array of u32 pointers, the last element is - a NULL pointer. Each u32 array is a 0-terminated array of control IDs. - Each array must be sorted low to high and belong to the same control - class. The array of u32 pointer must also be sorted, from low class IDs - to high class IDs. - - This function returns the first ID that follows after the given ID. - When no more controls are available 0 is returned. */ -u32 v4l2_ctrl_next(const u32 * const * ctrl_classes, u32 id) -{ - u32 ctrl_class; - const u32 *pctrl; - - /* if no query is desired, then just return the control ID */ - if ((id & V4L2_CTRL_FLAG_NEXT_CTRL) == 0) - return id; - if (ctrl_classes == NULL) - return 0; - id &= V4L2_CTRL_ID_MASK; - ctrl_class = V4L2_CTRL_ID2CLASS(id); - id++; /* select next control */ - /* find first class that matches (or is greater than) the class of - the ID */ - while (*ctrl_classes && V4L2_CTRL_ID2CLASS(**ctrl_classes) < ctrl_class) - ctrl_classes++; - /* no more classes */ - if (*ctrl_classes == NULL) - return 0; - pctrl = *ctrl_classes; - /* find first ctrl within the class that is >= ID */ - while (*pctrl && *pctrl < id) pctrl++; - if (*pctrl) - return *pctrl; - /* we are at the end of the controls of the current class. */ - /* continue with next class if available */ - ctrl_classes++; - if (*ctrl_classes == NULL) - return 0; - return **ctrl_classes; -} - /* ----------------------------------------------------------------- */ EXPORT_SYMBOL(v4l2_video_std_construct); @@ -1462,14 +376,6 @@ EXPORT_SYMBOL(v4l2_prio_check); EXPORT_SYMBOL(v4l2_field_names); EXPORT_SYMBOL(v4l2_type_names); EXPORT_SYMBOL(v4l_printk_ioctl); -EXPORT_SYMBOL(v4l_printk_ioctl_arg); - -EXPORT_SYMBOL(v4l2_ctrl_next); -EXPORT_SYMBOL(v4l2_ctrl_check); -EXPORT_SYMBOL(v4l2_ctrl_get_menu); -EXPORT_SYMBOL(v4l2_ctrl_query_menu); -EXPORT_SYMBOL(v4l2_ctrl_query_fill); -EXPORT_SYMBOL(v4l2_ctrl_query_fill_std); /* * Local variables: diff --git a/drivers/media/video/video-buf-dvb.c b/drivers/media/video/video-buf-dvb.c index 7ee8a53cd..0a4004a43 100644 --- a/drivers/media/video/video-buf-dvb.c +++ b/drivers/media/video/video-buf-dvb.c @@ -96,7 +96,7 @@ static int videobuf_dvb_start_feed(struct dvb_demux_feed *feed) if (!demux->dmx.frontend) return -EINVAL; - mutex_lock(&dvb->lock); + down(&dvb->lock); dvb->nfeeds++; rc = dvb->nfeeds; @@ -110,7 +110,7 @@ static int videobuf_dvb_start_feed(struct dvb_demux_feed *feed) } out: - mutex_unlock(&dvb->lock); + up(&dvb->lock); return rc; } @@ -120,14 +120,14 @@ static int videobuf_dvb_stop_feed(struct dvb_demux_feed *feed) struct videobuf_dvb *dvb = demux->priv; int err = 0; - mutex_lock(&dvb->lock); + down(&dvb->lock); dvb->nfeeds--; if (0 == dvb->nfeeds && NULL != dvb->thread) { // FIXME: cx8802_cancel_buffers(dev); err = kthread_stop(dvb->thread); dvb->thread = NULL; } - mutex_unlock(&dvb->lock); + up(&dvb->lock); return err; } @@ -135,15 +135,14 @@ static int videobuf_dvb_stop_feed(struct dvb_demux_feed *feed) int videobuf_dvb_register(struct videobuf_dvb *dvb, struct module *module, - void *adapter_priv, - struct device *device) + void *adapter_priv) { int result; - mutex_init(&dvb->lock); + init_MUTEX(&dvb->lock); /* register adapter */ - result = dvb_register_adapter(&dvb->adapter, dvb->name, module, device); + result = dvb_register_adapter(&dvb->adapter, dvb->name, module); if (result < 0) { printk(KERN_WARNING "%s: dvb_register_adapter failed (errno = %d)\n", dvb->name, result); diff --git a/drivers/media/video/video-buf.c b/drivers/media/video/video-buf.c index acc5ea936..9ef477523 100644 --- a/drivers/media/video/video-buf.c +++ b/drivers/media/video/video-buf.c @@ -1,20 +1,15 @@ /* * * generic helper functions for video4linux capture buffers, to handle - * memory management and PCI DMA. - * Right now, bttv, saa7134, saa7146 and cx88 use it. + * memory management and PCI DMA. Right now bttv + saa7134 use it. * * The functions expect the hardware being able to scatter gatter * (i.e. the buffers are not linear in physical memory, but fragmented * into PAGE_SIZE chunks). They also assume the driver does not need - * to touch the video data. - * - * device specific map/unmap/sync stuff now are mapped as operations - * to allow its usage by USB and virtual devices. + * to touch the video data (thus it is probably not useful for USB 1.1 + * as data often must be uncompressed by the drivers). * * (c) 2001-2004 Gerd Knorr [SUSE Labs] - * (c) 2006 Mauro Carvalho Chehab - * (c) 2006 Ted Walther and John Sokol * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -64,7 +59,8 @@ videobuf_vmalloc_to_sg(unsigned char *virt, int nr_pages) pg = vmalloc_to_page(virt); if (NULL == pg) goto err; - BUG_ON(PageHighMem(pg)); + if (PageHighMem(pg)) + BUG(); sglist[i].page = pg; sglist[i].length = PAGE_SIZE; } @@ -172,9 +168,6 @@ int videobuf_dma_init_kernel(struct videobuf_dmabuf *dma, int direction, dprintk(1,"vmalloc_32(%d pages) failed\n",nr_pages); return -ENOMEM; } - dprintk(1,"vmalloc is at addr 0x%08lx, size=%d\n", - (unsigned long)dma->vmalloc, - nr_pages << PAGE_SHIFT); memset(dma->vmalloc,0,nr_pages << PAGE_SHIFT); dma->nr_pages = nr_pages; return 0; @@ -194,10 +187,8 @@ int videobuf_dma_init_overlay(struct videobuf_dmabuf *dma, int direction, return 0; } -int videobuf_dma_map(struct videobuf_queue* q,struct videobuf_dmabuf *dma) +int videobuf_dma_pci_map(struct pci_dev *dev, struct videobuf_dmabuf *dma) { - void *dev=q->dev; - MAGIC_CHECK(dma->magic,MAGIC_DMABUF); BUG_ON(0 == dma->nr_pages); @@ -207,7 +198,7 @@ int videobuf_dma_map(struct videobuf_queue* q,struct videobuf_dmabuf *dma) } if (dma->vmalloc) { dma->sglist = videobuf_vmalloc_to_sg - (dma->vmalloc,dma->nr_pages); + (dma->vmalloc,dma->nr_pages); } if (dma->bus_addr) { dma->sglist = kmalloc(sizeof(struct scatterlist), GFP_KERNEL); @@ -222,14 +213,13 @@ int videobuf_dma_map(struct videobuf_queue* q,struct videobuf_dmabuf *dma) dprintk(1,"scatterlist is NULL\n"); return -ENOMEM; } + if (!dma->bus_addr) { - if (q->ops->vb_map_sg) { - dma->sglen = q->ops->vb_map_sg(dev,dma->sglist, - dma->nr_pages, dma->direction); - } + dma->sglen = pci_map_sg(dev,dma->sglist,dma->nr_pages, + dma->direction); if (0 == dma->sglen) { printk(KERN_WARNING - "%s: videobuf_map_sg failed\n",__FUNCTION__); + "%s: pci_map_sg failed\n",__FUNCTION__); kfree(dma->sglist); dma->sglist = NULL; dma->sglen = 0; @@ -239,31 +229,24 @@ int videobuf_dma_map(struct videobuf_queue* q,struct videobuf_dmabuf *dma) return 0; } -int videobuf_dma_sync(struct videobuf_queue* q,struct videobuf_dmabuf *dma) +int videobuf_dma_pci_sync(struct pci_dev *dev, struct videobuf_dmabuf *dma) { - void *dev=q->dev; - MAGIC_CHECK(dma->magic,MAGIC_DMABUF); BUG_ON(!dma->sglen); - if (!dma->bus_addr && q->ops->vb_dma_sync_sg) - q->ops->vb_dma_sync_sg(dev,dma->sglist,dma->nr_pages, - dma->direction); - + if (!dma->bus_addr) + pci_dma_sync_sg_for_cpu(dev,dma->sglist,dma->nr_pages,dma->direction); return 0; } -int videobuf_dma_unmap(struct videobuf_queue* q,struct videobuf_dmabuf *dma) +int videobuf_dma_pci_unmap(struct pci_dev *dev, struct videobuf_dmabuf *dma) { - void *dev=q->dev; - MAGIC_CHECK(dma->magic,MAGIC_DMABUF); if (!dma->sglen) return 0; - if (!dma->bus_addr && q->ops->vb_unmap_sg) - q->ops->vb_unmap_sg(dev,dma->sglist,dma->nr_pages, - dma->direction); + if (!dma->bus_addr) + pci_unmap_sg(dev,dma->sglist,dma->nr_pages,dma->direction); kfree(dma->sglist); dma->sglist = NULL; dma->sglen = 0; @@ -336,7 +319,7 @@ int videobuf_waiton(struct videobuf_buffer *vb, int non_blocking, int intr) } int -videobuf_iolock(struct videobuf_queue* q, struct videobuf_buffer *vb, +videobuf_iolock(struct pci_dev *pci, struct videobuf_buffer *vb, struct v4l2_framebuffer *fbuf) { int err,pages; @@ -375,7 +358,7 @@ videobuf_iolock(struct videobuf_queue* q, struct videobuf_buffer *vb, default: BUG(); } - err = videobuf_dma_map(q,&vb->dma); + err = videobuf_dma_pci_map(pci,&vb->dma); if (0 != err) return err; @@ -384,47 +367,9 @@ videobuf_iolock(struct videobuf_queue* q, struct videobuf_buffer *vb, /* --------------------------------------------------------------------- */ -void videobuf_queue_pci(struct videobuf_queue* q) -{ - /* If not specified, defaults to PCI map sg */ - if (!q->ops->vb_map_sg) - q->ops->vb_map_sg=(vb_map_sg_t *)pci_map_sg; - - if (!q->ops->vb_dma_sync_sg) - q->ops->vb_dma_sync_sg=(vb_map_sg_t *)pci_dma_sync_sg_for_cpu; - if (!q->ops->vb_unmap_sg) - q->ops->vb_unmap_sg=(vb_map_sg_t *)pci_unmap_sg; -} - -int videobuf_pci_dma_map(struct pci_dev *pci,struct videobuf_dmabuf *dma) -{ - struct videobuf_queue q; - struct videobuf_queue_ops qops; - - q.dev=pci; - qops.vb_map_sg=(vb_map_sg_t *)pci_map_sg; - qops.vb_unmap_sg=(vb_map_sg_t *)pci_unmap_sg; - q.ops = &qops; - - return (videobuf_dma_map(&q,dma)); -} - -int videobuf_pci_dma_unmap(struct pci_dev *pci,struct videobuf_dmabuf *dma) -{ - struct videobuf_queue q; - struct videobuf_queue_ops qops; - - q.dev=pci; - qops.vb_map_sg=(vb_map_sg_t *)pci_map_sg; - qops.vb_unmap_sg=(vb_map_sg_t *)pci_unmap_sg; - q.ops = &qops; - - return (videobuf_dma_unmap(&q,dma)); -} - void videobuf_queue_init(struct videobuf_queue* q, struct videobuf_queue_ops *ops, - void *dev, + struct pci_dev *pci, spinlock_t *irqlock, enum v4l2_buf_type type, enum v4l2_field field, @@ -433,16 +378,14 @@ void videobuf_queue_init(struct videobuf_queue* q, { memset(q,0,sizeof(*q)); q->irqlock = irqlock; - q->dev = dev; + q->pci = pci; q->type = type; q->field = field; q->msize = msize; q->ops = ops; q->priv_data = priv; - videobuf_queue_pci(q); - - mutex_init(&q->lock); + init_MUTEX(&q->lock); INIT_LIST_HEAD(&q->stream); } @@ -485,12 +428,11 @@ videobuf_queue_is_busy(struct videobuf_queue *q) void videobuf_queue_cancel(struct videobuf_queue *q) { - unsigned long flags=0; + unsigned long flags; int i; /* remove queued buffers from list */ - if (q->irqlock) - spin_lock_irqsave(q->irqlock,flags); + spin_lock_irqsave(q->irqlock,flags); for (i = 0; i < VIDEO_MAX_FRAME; i++) { if (NULL == q->bufs[i]) continue; @@ -499,8 +441,7 @@ videobuf_queue_cancel(struct videobuf_queue *q) q->bufs[i]->state = STATE_ERROR; } } - if (q->irqlock) - spin_unlock_irqrestore(q->irqlock,flags); + spin_unlock_irqrestore(q->irqlock,flags); /* free all buffers + clear queue */ for (i = 0; i < VIDEO_MAX_FRAME; i++) { @@ -594,31 +535,21 @@ videobuf_reqbufs(struct videobuf_queue *q, unsigned int size,count; int retval; - if (req->type != q->type) { - dprintk(1,"reqbufs: queue type invalid\n"); + if (req->type != q->type) return -EINVAL; - } - if (req->count < 1) { - dprintk(1,"reqbufs: count invalid (%d)\n",req->count); + if (req->count < 1) return -EINVAL; - } if (req->memory != V4L2_MEMORY_MMAP && req->memory != V4L2_MEMORY_USERPTR && - req->memory != V4L2_MEMORY_OVERLAY) { - dprintk(1,"reqbufs: memory type invalid\n"); + req->memory != V4L2_MEMORY_OVERLAY) return -EINVAL; - } - if (q->streaming) { - dprintk(1,"reqbufs: streaming already exists\n"); + if (q->streaming) return -EBUSY; - } - if (!list_empty(&q->stream)) { - dprintk(1,"reqbufs: stream running\n"); + if (!list_empty(&q->stream)) return -EBUSY; - } - mutex_lock(&q->lock); + down(&q->lock); count = req->count; if (count > VIDEO_MAX_FRAME) count = VIDEO_MAX_FRAME; @@ -629,33 +560,25 @@ videobuf_reqbufs(struct videobuf_queue *q, count, size, (count*size)>>PAGE_SHIFT); retval = videobuf_mmap_setup(q,count,size,req->memory); - if (retval < 0) { - dprintk(1,"reqbufs: mmap setup returned %d\n",retval); + if (retval < 0) goto done; - } req->count = count; done: - mutex_unlock(&q->lock); + up(&q->lock); return retval; } int videobuf_querybuf(struct videobuf_queue *q, struct v4l2_buffer *b) { - if (unlikely(b->type != q->type)) { - dprintk(1,"querybuf: Wrong type.\n"); + if (unlikely(b->type != q->type)) return -EINVAL; - } - if (unlikely(b->index < 0 || b->index >= VIDEO_MAX_FRAME)) { - dprintk(1,"querybuf: index out of range.\n"); + if (unlikely(b->index < 0 || b->index >= VIDEO_MAX_FRAME)) return -EINVAL; - } - if (unlikely(NULL == q->bufs[b->index])) { - dprintk(1,"querybuf: buffer is null.\n"); + if (unlikely(NULL == q->bufs[b->index])) return -EINVAL; - } videobuf_status(b,q->bufs[b->index],q->type); return 0; } @@ -666,45 +589,31 @@ videobuf_qbuf(struct videobuf_queue *q, { struct videobuf_buffer *buf; enum v4l2_field field; - unsigned long flags=0; + unsigned long flags; int retval; - mutex_lock(&q->lock); + down(&q->lock); retval = -EBUSY; - if (q->reading) { - dprintk(1,"qbuf: Reading running...\n"); + if (q->reading) goto done; - } retval = -EINVAL; - if (b->type != q->type) { - dprintk(1,"qbuf: Wrong type.\n"); + if (b->type != q->type) goto done; - } - if (b->index < 0 || b->index >= VIDEO_MAX_FRAME) { - dprintk(1,"qbuf: index out of range.\n"); + if (b->index < 0 || b->index >= VIDEO_MAX_FRAME) goto done; - } buf = q->bufs[b->index]; - if (NULL == buf) { - dprintk(1,"qbuf: buffer is null.\n"); + if (NULL == buf) goto done; - } MAGIC_CHECK(buf->magic,MAGIC_BUFFER); - if (buf->memory != b->memory) { - dprintk(1,"qbuf: memory type is wrong.\n"); + if (buf->memory != b->memory) goto done; - } if (buf->state == STATE_QUEUED || - buf->state == STATE_ACTIVE) { - dprintk(1,"qbuf: buffer is already queued or active.\n"); + buf->state == STATE_ACTIVE) goto done; - } if (b->flags & V4L2_BUF_FLAG_INPUT) { - if (b->input >= q->inputs) { - dprintk(1,"qbuf: wrong input.\n"); + if (b->input >= q->inputs) goto done; - } buf->input = b->input; } else { buf->input = UNSET; @@ -712,16 +621,12 @@ videobuf_qbuf(struct videobuf_queue *q, switch (b->memory) { case V4L2_MEMORY_MMAP: - if (0 == buf->baddr) { - dprintk(1,"qbuf: mmap requested but buffer addr is zero!\n"); + if (0 == buf->baddr) goto done; - } break; case V4L2_MEMORY_USERPTR: - if (b->length < buf->bsize) { - dprintk(1,"qbuf: buffer length is not enough\n"); + if (b->length < buf->bsize) goto done; - } if (STATE_NEEDS_INIT != buf->state && buf->baddr != b->m.userptr) q->ops->buf_release(q,buf); buf->baddr = b->m.userptr; @@ -730,31 +635,24 @@ videobuf_qbuf(struct videobuf_queue *q, buf->boff = b->m.offset; break; default: - dprintk(1,"qbuf: wrong memory type\n"); goto done; } - dprintk(1,"qbuf: requesting next field\n"); field = videobuf_next_field(q); retval = q->ops->buf_prepare(q,buf,field); - if (0 != retval) { - dprintk(1,"qbuf: buffer_prepare returned %d\n",retval); + if (0 != retval) goto done; - } list_add_tail(&buf->stream,&q->stream); if (q->streaming) { - if (q->irqlock) - spin_lock_irqsave(q->irqlock,flags); + spin_lock_irqsave(q->irqlock,flags); q->ops->buf_queue(q,buf); - if (q->irqlock) - spin_unlock_irqrestore(q->irqlock,flags); + spin_unlock_irqrestore(q->irqlock,flags); } - dprintk(1,"qbuf: succeded\n"); retval = 0; done: - mutex_unlock(&q->lock); + up(&q->lock); return retval; } @@ -765,41 +663,28 @@ videobuf_dqbuf(struct videobuf_queue *q, struct videobuf_buffer *buf; int retval; - mutex_lock(&q->lock); + down(&q->lock); retval = -EBUSY; - if (q->reading) { - dprintk(1,"dqbuf: Reading running...\n"); + if (q->reading) goto done; - } retval = -EINVAL; - if (b->type != q->type) { - dprintk(1,"dqbuf: Wrong type.\n"); + if (b->type != q->type) goto done; - } - if (list_empty(&q->stream)) { - dprintk(1,"dqbuf: stream running\n"); + if (list_empty(&q->stream)) goto done; - } buf = list_entry(q->stream.next, struct videobuf_buffer, stream); retval = videobuf_waiton(buf, nonblocking, 1); - if (retval < 0) { - dprintk(1,"dqbuf: waiton returned %d\n",retval); + if (retval < 0) goto done; - } switch (buf->state) { case STATE_ERROR: - dprintk(1,"dqbuf: state is error\n"); retval = -EIO; - videobuf_dma_sync(q,&buf->dma); - buf->state = STATE_IDLE; - break; + /* fall through */ case STATE_DONE: - dprintk(1,"dqbuf: state is done\n"); - videobuf_dma_sync(q,&buf->dma); + videobuf_dma_pci_sync(q->pci,&buf->dma); buf->state = STATE_IDLE; break; default: - dprintk(1,"dqbuf: state invalid\n"); retval = -EINVAL; goto done; } @@ -808,7 +693,7 @@ videobuf_dqbuf(struct videobuf_queue *q, videobuf_status(b,buf,q->type); done: - mutex_unlock(&q->lock); + up(&q->lock); return retval; } @@ -816,10 +701,10 @@ int videobuf_streamon(struct videobuf_queue *q) { struct videobuf_buffer *buf; struct list_head *list; - unsigned long flags=0; + unsigned long flags; int retval; - mutex_lock(&q->lock); + down(&q->lock); retval = -EBUSY; if (q->reading) goto done; @@ -827,18 +712,16 @@ int videobuf_streamon(struct videobuf_queue *q) if (q->streaming) goto done; q->streaming = 1; - if (q->irqlock) - spin_lock_irqsave(q->irqlock,flags); + spin_lock_irqsave(q->irqlock,flags); list_for_each(list,&q->stream) { buf = list_entry(list, struct videobuf_buffer, stream); if (buf->state == STATE_PREPARED) q->ops->buf_queue(q,buf); } - if (q->irqlock) - spin_unlock_irqrestore(q->irqlock,flags); + spin_unlock_irqrestore(q->irqlock,flags); done: - mutex_unlock(&q->lock); + up(&q->lock); return retval; } @@ -846,7 +729,7 @@ int videobuf_streamoff(struct videobuf_queue *q) { int retval = -EINVAL; - mutex_lock(&q->lock); + down(&q->lock); if (!q->streaming) goto done; videobuf_queue_cancel(q); @@ -854,7 +737,7 @@ int videobuf_streamoff(struct videobuf_queue *q) retval = 0; done: - mutex_unlock(&q->lock); + up(&q->lock); return retval; } @@ -863,7 +746,7 @@ videobuf_read_zerocopy(struct videobuf_queue *q, char __user *data, size_t count, loff_t *ppos) { enum v4l2_field field; - unsigned long flags=0; + unsigned long flags; int retval; /* setup stuff */ @@ -880,14 +763,12 @@ videobuf_read_zerocopy(struct videobuf_queue *q, char __user *data, goto done; /* start capture & wait */ - if (q->irqlock) - spin_lock_irqsave(q->irqlock,flags); + spin_lock_irqsave(q->irqlock,flags); q->ops->buf_queue(q,q->read_buf); - if (q->irqlock) - spin_unlock_irqrestore(q->irqlock,flags); + spin_unlock_irqrestore(q->irqlock,flags); retval = videobuf_waiton(q->read_buf,0,0); if (0 == retval) { - videobuf_dma_sync(q,&q->read_buf->dma); + videobuf_dma_pci_sync(q->pci,&q->read_buf->dma); if (STATE_ERROR == q->read_buf->state) retval = -EIO; else @@ -907,11 +788,11 @@ ssize_t videobuf_read_one(struct videobuf_queue *q, int nonblocking) { enum v4l2_field field; - unsigned long flags=0; + unsigned long flags; unsigned size, nbufs, bytes; int retval; - mutex_lock(&q->lock); + down(&q->lock); nbufs = 1; size = 0; q->ops->buf_setup(q,&nbufs,&size); @@ -929,7 +810,6 @@ ssize_t videobuf_read_one(struct videobuf_queue *q, /* need to capture a new frame */ retval = -ENOMEM; q->read_buf = videobuf_alloc(q->msize); - dprintk(1,"video alloc=0x%p\n", q->read_buf); if (NULL == q->read_buf) goto done; q->read_buf->memory = V4L2_MEMORY_USERPTR; @@ -941,11 +821,9 @@ ssize_t videobuf_read_one(struct videobuf_queue *q, q->read_buf = NULL; goto done; } - if (q->irqlock) - spin_lock_irqsave(q->irqlock,flags); + spin_lock_irqsave(q->irqlock,flags); q->ops->buf_queue(q,q->read_buf); - if (q->irqlock) - spin_unlock_irqrestore(q->irqlock,flags); + spin_unlock_irqrestore(q->irqlock,flags); q->read_off = 0; } @@ -953,7 +831,7 @@ ssize_t videobuf_read_one(struct videobuf_queue *q, retval = videobuf_waiton(q->read_buf, nonblocking, 1); if (0 != retval) goto done; - videobuf_dma_sync(q,&q->read_buf->dma); + videobuf_dma_pci_sync(q->pci,&q->read_buf->dma); if (STATE_ERROR == q->read_buf->state) { /* catch I/O errors */ @@ -982,14 +860,14 @@ ssize_t videobuf_read_one(struct videobuf_queue *q, } done: - mutex_unlock(&q->lock); + up(&q->lock); return retval; } int videobuf_read_start(struct videobuf_queue *q) { enum v4l2_field field; - unsigned long flags=0; + unsigned long flags; int count = 0, size = 0; int err, i; @@ -1010,12 +888,10 @@ int videobuf_read_start(struct videobuf_queue *q) return err; list_add_tail(&q->bufs[i]->stream, &q->stream); } - if (q->irqlock) - spin_lock_irqsave(q->irqlock,flags); + spin_lock_irqsave(q->irqlock,flags); for (i = 0; i < count; i++) q->ops->buf_queue(q,q->bufs[i]); - if (q->irqlock) - spin_unlock_irqrestore(q->irqlock,flags); + spin_unlock_irqrestore(q->irqlock,flags); q->reading = 1; return 0; } @@ -1043,10 +919,10 @@ ssize_t videobuf_read_stream(struct videobuf_queue *q, { unsigned int *fc, bytes; int err, retval; - unsigned long flags=0; + unsigned long flags; dprintk(2,"%s\n",__FUNCTION__); - mutex_lock(&q->lock); + down(&q->lock); retval = -EBUSY; if (q->streaming) goto done; @@ -1110,11 +986,9 @@ ssize_t videobuf_read_stream(struct videobuf_queue *q, if (q->read_off == q->read_buf->size) { list_add_tail(&q->read_buf->stream, &q->stream); - if (q->irqlock) - spin_lock_irqsave(q->irqlock,flags); + spin_lock_irqsave(q->irqlock,flags); q->ops->buf_queue(q,q->read_buf); - if (q->irqlock) - spin_unlock_irqrestore(q->irqlock,flags); + spin_unlock_irqrestore(q->irqlock,flags); q->read_buf = NULL; } if (retval < 0) @@ -1122,7 +996,7 @@ ssize_t videobuf_read_stream(struct videobuf_queue *q, } done: - mutex_unlock(&q->lock); + up(&q->lock); return retval; } @@ -1133,7 +1007,7 @@ unsigned int videobuf_poll_stream(struct file *file, struct videobuf_buffer *buf = NULL; unsigned int rc = 0; - mutex_lock(&q->lock); + down(&q->lock); if (q->streaming) { if (!list_empty(&q->stream)) buf = list_entry(q->stream.next, @@ -1161,7 +1035,7 @@ unsigned int videobuf_poll_stream(struct file *file, buf->state == STATE_ERROR) rc = POLLIN|POLLRDNORM; } - mutex_unlock(&q->lock); + up(&q->lock); return rc; } @@ -1190,7 +1064,7 @@ videobuf_vm_close(struct vm_area_struct *vma) map->count--; if (0 == map->count) { dprintk(1,"munmap %p q=%p\n",map,q); - mutex_lock(&q->lock); + down(&q->lock); for (i = 0; i < VIDEO_MAX_FRAME; i++) { if (NULL == q->bufs[i]) continue; @@ -1202,7 +1076,7 @@ videobuf_vm_close(struct vm_area_struct *vma) q->bufs[i]->baddr = 0; q->ops->buf_release(q,q->bufs[i]); } - mutex_unlock(&q->lock); + up(&q->lock); kfree(map); } return; @@ -1296,7 +1170,7 @@ int videobuf_mmap_mapper(struct videobuf_queue *q, unsigned int first,last,size,i; int retval; - mutex_lock(&q->lock); + down(&q->lock); retval = -EINVAL; if (!(vma->vm_flags & VM_WRITE)) { dprintk(1,"mmap app bug: PROT_WRITE please\n"); @@ -1364,7 +1238,7 @@ int videobuf_mmap_mapper(struct videobuf_queue *q, retval = 0; done: - mutex_unlock(&q->lock); + up(&q->lock); return retval; } @@ -1376,14 +1250,11 @@ EXPORT_SYMBOL_GPL(videobuf_dma_init); EXPORT_SYMBOL_GPL(videobuf_dma_init_user); EXPORT_SYMBOL_GPL(videobuf_dma_init_kernel); EXPORT_SYMBOL_GPL(videobuf_dma_init_overlay); -EXPORT_SYMBOL_GPL(videobuf_dma_map); -EXPORT_SYMBOL_GPL(videobuf_dma_sync); -EXPORT_SYMBOL_GPL(videobuf_dma_unmap); +EXPORT_SYMBOL_GPL(videobuf_dma_pci_map); +EXPORT_SYMBOL_GPL(videobuf_dma_pci_sync); +EXPORT_SYMBOL_GPL(videobuf_dma_pci_unmap); EXPORT_SYMBOL_GPL(videobuf_dma_free); -EXPORT_SYMBOL_GPL(videobuf_pci_dma_map); -EXPORT_SYMBOL_GPL(videobuf_pci_dma_unmap); - EXPORT_SYMBOL_GPL(videobuf_alloc); EXPORT_SYMBOL_GPL(videobuf_waiton); EXPORT_SYMBOL_GPL(videobuf_iolock); diff --git a/drivers/media/video/videocodec.c b/drivers/media/video/videocodec.c index 2ae3fb250..8f271de57 100644 --- a/drivers/media/video/videocodec.c +++ b/drivers/media/video/videocodec.c @@ -36,6 +36,7 @@ #include // kernel config is here (procfs flag) +#include #ifdef CONFIG_PROC_FS #include diff --git a/drivers/media/video/videocodec.h b/drivers/media/video/videocodec.h index 97a3bbeda..b1239ac7f 100644 --- a/drivers/media/video/videocodec.h +++ b/drivers/media/video/videocodec.h @@ -57,7 +57,7 @@ therfor they may not be initialized. The other fuctions are just for convenience, as they are for sure used by - most/all of the codecs. The last ones may be ommited, too. + most/all of the codecs. The last ones may be ommited, too. See the structure declaration below for more information and which data has to be set up for the master and the slave. @@ -75,52 +75,52 @@ /* ========================================== */ /* - ==== master setup ==== + ==== master setup ==== name -> name of the device structure for reference and debugging master_data -> data ref. for the master (e.g. the zr36055,57,67) readreg -> ref. to read-fn from register (setup by master, used by slave) writereg -> ref. to write-fn to register (setup by master, used by slave) - this two functions do the lowlevel I/O job + this two functions do the lowlevel I/O job - ==== slave functionality setup ==== - slave_data -> data ref. for the slave (e.g. the zr36050,60) + ==== slave functionality setup ==== + slave_data -> data ref. for the slave (e.g. the zr36050,60) check -> fn-ref. checks availability of an device, returns -EIO on failure or - the type on success - this makes espcecially sense if a driver module supports more than - one codec which may be quite similar to access, nevertheless it - is good for a first functionality check + the type on success + this makes espcecially sense if a driver module supports more than + one codec which may be quite similar to access, nevertheless it + is good for a first functionality check - -- main functions you always need for compression/decompression -- + -- main functions you always need for compression/decompression -- set_mode -> this fn-ref. resets the entire codec, and sets up the mode - with the last defined norm/size (or device default if not - available) - it returns 0 if the mode is possible + with the last defined norm/size (or device default if not + available) - it returns 0 if the mode is possible set_size -> this fn-ref. sets the norm and image size for - compression/decompression (returns 0 on success) - the norm param is defined in videodev.h (VIDEO_MODE_*) + compression/decompression (returns 0 on success) + the norm param is defined in videodev.h (VIDEO_MODE_*) additional setup may be available, too - but the codec should work with - some default values even without this + some default values even without this - set_data -> sets device-specific data (tables, quality etc.) - get_data -> query device-specific data (tables, quality etc.) + set_data -> sets device-specific data (tables, quality etc.) + get_data -> query device-specific data (tables, quality etc.) - if the device delivers interrupts, they may be setup/handled here - setup_interrupt -> codec irq setup (not needed for 36050/60) - handle_interrupt -> codec irq handling (not needed for 36050/60) + if the device delivers interrupts, they may be setup/handled here + setup_interrupt -> codec irq setup (not needed for 36050/60) + handle_interrupt -> codec irq handling (not needed for 36050/60) - if the device delivers pictures, they may be handled here - put_image -> puts image data to the codec (not needed for 36050/60) - get_image -> gets image data from the codec (not needed for 36050/60) - the calls include frame numbers and flags (even/odd/...) - if needed and a flag which allows blocking until its ready + if the device delivers pictures, they may be handled here + put_image -> puts image data to the codec (not needed for 36050/60) + get_image -> gets image data from the codec (not needed for 36050/60) + the calls include frame numbers and flags (even/odd/...) + if needed and a flag which allows blocking until its ready */ /* ============== */ /* user interface */ /* ============== */ -/* +/* Currently there is only a information display planned, as the layer is not visible for the user space at all. @@ -222,14 +222,14 @@ M zr36055[1] 0001 0000c001 00000000 (zr36050[1]) /* ========================= */ struct vfe_polarity { - unsigned int vsync_pol:1; - unsigned int hsync_pol:1; - unsigned int field_pol:1; - unsigned int blank_pol:1; - unsigned int subimg_pol:1; - unsigned int poe_pol:1; - unsigned int pvalid_pol:1; - unsigned int vclk_pol:1; + int vsync_pol:1; + int hsync_pol:1; + int field_pol:1; + int blank_pol:1; + int subimg_pol:1; + int poe_pol:1; + int pvalid_pol:1; + int vclk_pol:1; }; struct vfe_settings { diff --git a/drivers/media/video/videodev.c b/drivers/media/video/videodev.c index 2299e294e..078880e4c 100644 --- a/drivers/media/video/videodev.c +++ b/drivers/media/video/videodev.c @@ -1,31 +1,20 @@ /* - * Video capture interface for Linux version 2 + * Video capture interface for Linux * - * A generic video device interface for the LINUX operating system - * using a set of device structures/vectors for low level operations. + * A generic video device interface for the LINUX operating system + * using a set of device structures/vectors for low level operations. * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version - * 2 of the License, or (at your option) any later version. + * This program is 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. * - * Authors: Alan Cox, (version 1) - * Mauro Carvalho Chehab (version 2) + * Author: Alan Cox, * * Fixes: 20000516 Claudio Matsuoka * - Added procfs support */ -#define dbgarg(cmd, fmt, arg...) \ - if (vfd->debug & V4L2_DEBUG_IOCTL_ARG) \ - printk (KERN_DEBUG "%s: ", vfd->name); \ - v4l_printk_ioctl(cmd); \ - printk (KERN_DEBUG "%s: " fmt, vfd->name, ## arg); - -#define dbgarg2(fmt, arg...) \ - if (vfd->debug & V4L2_DEBUG_IOCTL_ARG) \ - printk (KERN_DEBUG "%s: " fmt, vfd->name, ## arg); - #include #include #include @@ -37,16 +26,11 @@ #include #include #include +#include #include #include -#define __OLD_VIDIOC_ /* To allow fixing old calls*/ -#include - -#ifdef CONFIG_VIDEO_V4L1 #include -#endif -#include #define VIDEO_NUM_DEVICES 256 #define VIDEO_NAME "video4linux" @@ -57,8 +41,7 @@ static ssize_t show_name(struct class_device *cd, char *buf) { - struct video_device *vfd = container_of(cd, struct video_device, - class_dev); + struct video_device *vfd = container_of(cd, struct video_device, class_dev); return sprintf(buf,"%.*s\n",(int)sizeof(vfd->name),vfd->name); } @@ -79,8 +62,7 @@ void video_device_release(struct video_device *vfd) static void video_release(struct class_device *cd) { - struct video_device *vfd = container_of(cd, struct video_device, - class_dev); + struct video_device *vfd = container_of(cd, struct video_device, class_dev); #if 1 /* needed until all drivers are fixed */ @@ -108,14 +90,14 @@ struct video_device* video_devdata(struct file *file) } /* - * Open a video device - FIXME: Obsoleted + * Open a video device. */ static int video_open(struct inode *inode, struct file *file) { unsigned int minor = iminor(inode); int err = 0; struct video_device *vfl; - const struct file_operations *old_fops; + struct file_operations *old_fops; if(minor>=VIDEO_NUM_DEVICES) return -ENODEV; @@ -148,7 +130,6 @@ static int video_open(struct inode *inode, struct file *file) * helper function -- handles userspace copying for ioctl arguments */ -#ifdef __OLD_VIDIOC_ static unsigned int video_fix_command(unsigned int cmd) { @@ -174,11 +155,7 @@ video_fix_command(unsigned int cmd) } return cmd; } -#endif -/* - * Obsolete usercopy function - Should be removed soon - */ int video_usercopy(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg, @@ -189,15 +166,8 @@ video_usercopy(struct inode *inode, struct file *file, void *mbuf = NULL; void *parg = NULL; int err = -EINVAL; - int is_ext_ctrl; - size_t ctrls_size = 0; - void __user *user_ptr = NULL; -#ifdef __OLD_VIDIOC_ cmd = video_fix_command(cmd); -#endif - is_ext_ctrl = (cmd == VIDIOC_S_EXT_CTRLS || cmd == VIDIOC_G_EXT_CTRLS || - cmd == VIDIOC_TRY_EXT_CTRLS); /* Copy arguments into temp kernel buffer */ switch (_IOC_DIR(cmd)) { @@ -223,43 +193,14 @@ video_usercopy(struct inode *inode, struct file *file, goto out; break; } - if (is_ext_ctrl) { - struct v4l2_ext_controls *p = parg; - - /* In case of an error, tell the caller that it wasn't - a specific control that caused it. */ - p->error_idx = p->count; - user_ptr = (void __user *)p->controls; - if (p->count) { - ctrls_size = sizeof(struct v4l2_ext_control) * p->count; - /* Note: v4l2_ext_controls fits in sbuf[] so mbuf is still NULL. */ - mbuf = kmalloc(ctrls_size, GFP_KERNEL); - err = -ENOMEM; - if (NULL == mbuf) - goto out_ext_ctrl; - err = -EFAULT; - if (copy_from_user(mbuf, user_ptr, ctrls_size)) - goto out_ext_ctrl; - p->controls = mbuf; - } - } /* call driver */ err = func(inode, file, cmd, parg); if (err == -ENOIOCTLCMD) err = -EINVAL; - if (is_ext_ctrl) { - struct v4l2_ext_controls *p = parg; - - p->controls = (void *)user_ptr; - if (p->count && err == 0 && copy_to_user(user_ptr, mbuf, ctrls_size)) - err = -EFAULT; - goto out_ext_ctrl; - } if (err < 0) goto out; -out_ext_ctrl: /* Copy results into user buffer */ switch (_IOC_DIR(cmd)) { @@ -277,20 +218,19 @@ out: /* * open/release helper functions -- handle exclusive opens - * Should be removed soon */ int video_exclusive_open(struct inode *inode, struct file *file) { struct video_device *vfl = video_devdata(file); int retval = 0; - mutex_lock(&vfl->lock); + down(&vfl->lock); if (vfl->users) { retval = -EBUSY; } else { vfl->users++; } - mutex_unlock(&vfl->lock); + up(&vfl->lock); return retval; } @@ -302,1184 +242,6 @@ int video_exclusive_release(struct inode *inode, struct file *file) return 0; } -static char *v4l2_memory_names[] = { - [V4L2_MEMORY_MMAP] = "mmap", - [V4L2_MEMORY_USERPTR] = "userptr", - [V4L2_MEMORY_OVERLAY] = "overlay", -}; - - -/* FIXME: Those stuff are replicated also on v4l2-common.c */ -static char *v4l2_type_names_FIXME[] = { - [V4L2_BUF_TYPE_VIDEO_CAPTURE] = "video-cap", - [V4L2_BUF_TYPE_VIDEO_OVERLAY] = "video-over", - [V4L2_BUF_TYPE_VIDEO_OUTPUT] = "video-out", - [V4L2_BUF_TYPE_VBI_CAPTURE] = "vbi-cap", - [V4L2_BUF_TYPE_VBI_OUTPUT] = "vbi-out", - [V4L2_BUF_TYPE_SLICED_VBI_OUTPUT] = "sliced-vbi-out", - [V4L2_BUF_TYPE_SLICED_VBI_CAPTURE] = "sliced-vbi-capture", - [V4L2_BUF_TYPE_PRIVATE] = "private", -}; - -static char *v4l2_field_names_FIXME[] = { - [V4L2_FIELD_ANY] = "any", - [V4L2_FIELD_NONE] = "none", - [V4L2_FIELD_TOP] = "top", - [V4L2_FIELD_BOTTOM] = "bottom", - [V4L2_FIELD_INTERLACED] = "interlaced", - [V4L2_FIELD_SEQ_TB] = "seq-tb", - [V4L2_FIELD_SEQ_BT] = "seq-bt", - [V4L2_FIELD_ALTERNATE] = "alternate", -}; - -#define prt_names(a,arr) (((a)>=0)&&((a)timecode; - - dbgarg (cmd, "%02ld:%02d:%02d.%08ld index=%d, type=%s, " - "bytesused=%d, flags=0x%08d, " - "field=%0d, sequence=%d, memory=%s, offset/userptr=0x%08lx\n", - (p->timestamp.tv_sec/3600), - (int)(p->timestamp.tv_sec/60)%60, - (int)(p->timestamp.tv_sec%60), - p->timestamp.tv_usec, - p->index, - prt_names(p->type,v4l2_type_names_FIXME), - p->bytesused,p->flags, - p->field,p->sequence, - prt_names(p->memory,v4l2_memory_names), - p->m.userptr); - dbgarg2 ("timecode= %02d:%02d:%02d type=%d, " - "flags=0x%08d, frames=%d, userbits=0x%08x\n", - tc->hours,tc->minutes,tc->seconds, - tc->type, tc->flags, tc->frames, *(__u32 *) tc->userbits); -} - -static inline void dbgrect(struct video_device *vfd, char *s, - struct v4l2_rect *r) -{ - dbgarg2 ("%sRect start at %dx%d, size= %dx%d\n", s, r->left, r->top, - r->width, r->height); -}; - -static inline void v4l_print_pix_fmt (struct video_device *vfd, - struct v4l2_pix_format *fmt) -{ - dbgarg2 ("width=%d, height=%d, format=0x%08x, field=%s, " - "bytesperline=%d sizeimage=%d, colorspace=%d\n", - fmt->width,fmt->height,fmt->pixelformat, - prt_names(fmt->field,v4l2_field_names_FIXME), - fmt->bytesperline,fmt->sizeimage,fmt->colorspace); -}; - - -static int check_fmt (struct video_device *vfd, enum v4l2_buf_type type) -{ - switch (type) { - case V4L2_BUF_TYPE_VIDEO_CAPTURE: - if (vfd->vidioc_try_fmt_cap) - return (0); - break; - case V4L2_BUF_TYPE_VIDEO_OVERLAY: - if (vfd->vidioc_try_fmt_overlay) - return (0); - break; - case V4L2_BUF_TYPE_VBI_CAPTURE: - if (vfd->vidioc_try_fmt_vbi) - return (0); - break; - case V4L2_BUF_TYPE_SLICED_VBI_OUTPUT: - if (vfd->vidioc_try_fmt_vbi_output) - return (0); - break; - case V4L2_BUF_TYPE_SLICED_VBI_CAPTURE: - if (vfd->vidioc_try_fmt_vbi_capture) - return (0); - break; - case V4L2_BUF_TYPE_VIDEO_OUTPUT: - if (vfd->vidioc_try_fmt_video_output) - return (0); - break; - case V4L2_BUF_TYPE_VBI_OUTPUT: - if (vfd->vidioc_try_fmt_vbi_output) - return (0); - break; - case V4L2_BUF_TYPE_PRIVATE: - if (vfd->vidioc_try_fmt_type_private) - return (0); - break; - } - return (-EINVAL); -} - -static int __video_do_ioctl(struct inode *inode, struct file *file, - unsigned int cmd, void *arg) -{ - struct video_device *vfd = video_devdata(file); - void *fh = file->private_data; - int ret = -EINVAL; - - if ( (vfd->debug & V4L2_DEBUG_IOCTL) && - !(vfd->debug | V4L2_DEBUG_IOCTL_ARG)) { - v4l_print_ioctl(vfd->name, cmd); - } - - switch(cmd) { - /* --- capabilities ------------------------------------------ */ - case VIDIOC_QUERYCAP: - { - struct v4l2_capability *cap = (struct v4l2_capability*)arg; - memset(cap, 0, sizeof(*cap)); - - if (!vfd->vidioc_querycap) - break; - - ret=vfd->vidioc_querycap(file, fh, cap); - if (!ret) - dbgarg (cmd, "driver=%s, card=%s, bus=%s, " - "version=0x%08x, " - "capabilities=0x%08x\n", - cap->driver,cap->card,cap->bus_info, - cap->version, - cap->capabilities); - break; - } - - /* --- priority ------------------------------------------ */ - case VIDIOC_G_PRIORITY: - { - enum v4l2_priority *p=arg; - - if (!vfd->vidioc_g_priority) - break; - ret=vfd->vidioc_g_priority(file, fh, p); - if (!ret) - dbgarg(cmd, "priority is %d\n", *p); - break; - } - case VIDIOC_S_PRIORITY: - { - enum v4l2_priority *p=arg; - - if (!vfd->vidioc_s_priority) - break; - dbgarg(cmd, "setting priority to %d\n", *p); - ret=vfd->vidioc_s_priority(file, fh, *p); - break; - } - - /* --- capture ioctls ---------------------------------------- */ - case VIDIOC_ENUM_FMT: - { - struct v4l2_fmtdesc *f = arg; - enum v4l2_buf_type type; - unsigned int index; - - index = f->index; - type = f->type; - memset(f,0,sizeof(*f)); - f->index = index; - f->type = type; - - switch (type) { - case V4L2_BUF_TYPE_VIDEO_CAPTURE: - if (vfd->vidioc_enum_fmt_cap) - ret=vfd->vidioc_enum_fmt_cap(file, fh, f); - break; - case V4L2_BUF_TYPE_VIDEO_OVERLAY: - if (vfd->vidioc_enum_fmt_overlay) - ret=vfd->vidioc_enum_fmt_overlay(file, fh, f); - break; - case V4L2_BUF_TYPE_VBI_CAPTURE: - if (vfd->vidioc_enum_fmt_vbi) - ret=vfd->vidioc_enum_fmt_vbi(file, fh, f); - break; - case V4L2_BUF_TYPE_SLICED_VBI_OUTPUT: - if (vfd->vidioc_enum_fmt_vbi_output) - ret=vfd->vidioc_enum_fmt_vbi_output(file, - fh, f); - break; - case V4L2_BUF_TYPE_SLICED_VBI_CAPTURE: - if (vfd->vidioc_enum_fmt_vbi_capture) - ret=vfd->vidioc_enum_fmt_vbi_capture(file, - fh, f); - break; - case V4L2_BUF_TYPE_VIDEO_OUTPUT: - if (vfd->vidioc_enum_fmt_video_output) - ret=vfd->vidioc_enum_fmt_video_output(file, - fh, f); - break; - case V4L2_BUF_TYPE_VBI_OUTPUT: - if (vfd->vidioc_enum_fmt_vbi_output) - ret=vfd->vidioc_enum_fmt_vbi_output(file, - fh, f); - break; - case V4L2_BUF_TYPE_PRIVATE: - if (vfd->vidioc_enum_fmt_type_private) - ret=vfd->vidioc_enum_fmt_type_private(file, - fh, f); - break; - } - if (!ret) - dbgarg (cmd, "index=%d, type=%d, flags=%d, " - "description=%s," - " pixelformat=0x%8x\n", - f->index, f->type, f->flags, - f->description, - f->pixelformat); - - break; - } - case VIDIOC_G_FMT: - { - struct v4l2_format *f = (struct v4l2_format *)arg; - enum v4l2_buf_type type=f->type; - - memset(&f->fmt.pix,0,sizeof(f->fmt.pix)); - f->type=type; - - /* FIXME: Should be one dump per type */ - dbgarg (cmd, "type=%s\n", prt_names(type, - v4l2_type_names_FIXME)); - - switch (type) { - case V4L2_BUF_TYPE_VIDEO_CAPTURE: - if (vfd->vidioc_g_fmt_cap) - ret=vfd->vidioc_g_fmt_cap(file, fh, f); - if (!ret) - v4l_print_pix_fmt(vfd,&f->fmt.pix); - break; - case V4L2_BUF_TYPE_VIDEO_OVERLAY: - if (vfd->vidioc_g_fmt_overlay) - ret=vfd->vidioc_g_fmt_overlay(file, fh, f); - break; - case V4L2_BUF_TYPE_VBI_CAPTURE: - if (vfd->vidioc_g_fmt_vbi) - ret=vfd->vidioc_g_fmt_vbi(file, fh, f); - break; - case V4L2_BUF_TYPE_SLICED_VBI_OUTPUT: - if (vfd->vidioc_g_fmt_vbi_output) - ret=vfd->vidioc_g_fmt_vbi_output(file, fh, f); - break; - case V4L2_BUF_TYPE_SLICED_VBI_CAPTURE: - if (vfd->vidioc_g_fmt_vbi_capture) - ret=vfd->vidioc_g_fmt_vbi_capture(file, fh, f); - break; - case V4L2_BUF_TYPE_VIDEO_OUTPUT: - if (vfd->vidioc_g_fmt_video_output) - ret=vfd->vidioc_g_fmt_video_output(file, - fh, f); - break; - case V4L2_BUF_TYPE_VBI_OUTPUT: - if (vfd->vidioc_g_fmt_vbi_output) - ret=vfd->vidioc_g_fmt_vbi_output(file, fh, f); - break; - case V4L2_BUF_TYPE_PRIVATE: - if (vfd->vidioc_g_fmt_type_private) - ret=vfd->vidioc_g_fmt_type_private(file, - fh, f); - break; - } - - break; - } - case VIDIOC_S_FMT: - { - struct v4l2_format *f = (struct v4l2_format *)arg; - - /* FIXME: Should be one dump per type */ - dbgarg (cmd, "type=%s\n", prt_names(f->type, - v4l2_type_names_FIXME)); - - switch (f->type) { - case V4L2_BUF_TYPE_VIDEO_CAPTURE: - v4l_print_pix_fmt(vfd,&f->fmt.pix); - if (vfd->vidioc_s_fmt_cap) - ret=vfd->vidioc_s_fmt_cap(file, fh, f); - break; - case V4L2_BUF_TYPE_VIDEO_OVERLAY: - if (vfd->vidioc_s_fmt_overlay) - ret=vfd->vidioc_s_fmt_overlay(file, fh, f); - break; - case V4L2_BUF_TYPE_VBI_CAPTURE: - if (vfd->vidioc_s_fmt_vbi) - ret=vfd->vidioc_s_fmt_vbi(file, fh, f); - break; - case V4L2_BUF_TYPE_SLICED_VBI_OUTPUT: - if (vfd->vidioc_s_fmt_vbi_output) - ret=vfd->vidioc_s_fmt_vbi_output(file, fh, f); - break; - case V4L2_BUF_TYPE_SLICED_VBI_CAPTURE: - if (vfd->vidioc_s_fmt_vbi_capture) - ret=vfd->vidioc_s_fmt_vbi_capture(file, fh, f); - break; - case V4L2_BUF_TYPE_VIDEO_OUTPUT: - if (vfd->vidioc_s_fmt_video_output) - ret=vfd->vidioc_s_fmt_video_output(file, - fh, f); - break; - case V4L2_BUF_TYPE_VBI_OUTPUT: - if (vfd->vidioc_s_fmt_vbi_output) - ret=vfd->vidioc_s_fmt_vbi_output(file, - fh, f); - break; - case V4L2_BUF_TYPE_PRIVATE: - if (vfd->vidioc_s_fmt_type_private) - ret=vfd->vidioc_s_fmt_type_private(file, - fh, f); - break; - } - break; - } - case VIDIOC_TRY_FMT: - { - struct v4l2_format *f = (struct v4l2_format *)arg; - - /* FIXME: Should be one dump per type */ - dbgarg (cmd, "type=%s\n", prt_names(f->type, - v4l2_type_names_FIXME)); - switch (f->type) { - case V4L2_BUF_TYPE_VIDEO_CAPTURE: - if (vfd->vidioc_try_fmt_cap) - ret=vfd->vidioc_try_fmt_cap(file, fh, f); - if (!ret) - v4l_print_pix_fmt(vfd,&f->fmt.pix); - break; - case V4L2_BUF_TYPE_VIDEO_OVERLAY: - if (vfd->vidioc_try_fmt_overlay) - ret=vfd->vidioc_try_fmt_overlay(file, fh, f); - break; - case V4L2_BUF_TYPE_VBI_CAPTURE: - if (vfd->vidioc_try_fmt_vbi) - ret=vfd->vidioc_try_fmt_vbi(file, fh, f); - break; - case V4L2_BUF_TYPE_SLICED_VBI_OUTPUT: - if (vfd->vidioc_try_fmt_vbi_output) - ret=vfd->vidioc_try_fmt_vbi_output(file, - fh, f); - break; - case V4L2_BUF_TYPE_SLICED_VBI_CAPTURE: - if (vfd->vidioc_try_fmt_vbi_capture) - ret=vfd->vidioc_try_fmt_vbi_capture(file, - fh, f); - break; - case V4L2_BUF_TYPE_VIDEO_OUTPUT: - if (vfd->vidioc_try_fmt_video_output) - ret=vfd->vidioc_try_fmt_video_output(file, - fh, f); - break; - case V4L2_BUF_TYPE_VBI_OUTPUT: - if (vfd->vidioc_try_fmt_vbi_output) - ret=vfd->vidioc_try_fmt_vbi_output(file, - fh, f); - break; - case V4L2_BUF_TYPE_PRIVATE: - if (vfd->vidioc_try_fmt_type_private) - ret=vfd->vidioc_try_fmt_type_private(file, - fh, f); - break; - } - - break; - } - /* FIXME: Those buf reqs could be handled here, - with some changes on videobuf to allow its header to be included at - videodev2.h or being merged at videodev2. - */ - case VIDIOC_REQBUFS: - { - struct v4l2_requestbuffers *p=arg; - - if (!vfd->vidioc_reqbufs) - break; - ret = check_fmt (vfd, p->type); - if (ret) - break; - - ret=vfd->vidioc_reqbufs(file, fh, p); - dbgarg (cmd, "count=%d, type=%s, memory=%s\n", - p->count, - prt_names(p->type,v4l2_type_names_FIXME), - prt_names(p->memory,v4l2_memory_names)); - break; - } - case VIDIOC_QUERYBUF: - { - struct v4l2_buffer *p=arg; - - if (!vfd->vidioc_querybuf) - break; - ret = check_fmt (vfd, p->type); - if (ret) - break; - - ret=vfd->vidioc_querybuf(file, fh, p); - if (!ret) - dbgbuf(cmd,vfd,p); - break; - } - case VIDIOC_QBUF: - { - struct v4l2_buffer *p=arg; - - if (!vfd->vidioc_qbuf) - break; - ret = check_fmt (vfd, p->type); - if (ret) - break; - - ret=vfd->vidioc_qbuf(file, fh, p); - if (!ret) - dbgbuf(cmd,vfd,p); - break; - } - case VIDIOC_DQBUF: - { - struct v4l2_buffer *p=arg; - if (!vfd->vidioc_dqbuf) - break; - ret = check_fmt (vfd, p->type); - if (ret) - break; - - ret=vfd->vidioc_dqbuf(file, fh, p); - if (!ret) - dbgbuf(cmd,vfd,p); - break; - } - case VIDIOC_OVERLAY: - { - int *i = arg; - - if (!vfd->vidioc_overlay) - break; - dbgarg (cmd, "value=%d\n",*i); - ret=vfd->vidioc_overlay(file, fh, *i); - break; - } -#ifdef CONFIG_VIDEO_V4L1_COMPAT - /* --- streaming capture ------------------------------------- */ - case VIDIOCGMBUF: - { - struct video_mbuf *p=arg; - - memset(p,0,sizeof(p)); - - if (!vfd->vidiocgmbuf) - break; - ret=vfd->vidiocgmbuf(file, fh, p); - if (!ret) - dbgarg (cmd, "size=%d, frames=%d, offsets=0x%08lx\n", - p->size, p->frames, - (unsigned long)p->offsets); - break; - } -#endif - case VIDIOC_G_FBUF: - { - struct v4l2_framebuffer *p=arg; - if (!vfd->vidioc_g_fbuf) - break; - ret=vfd->vidioc_g_fbuf(file, fh, arg); - if (!ret) { - dbgarg (cmd, "capability=%d, flags=%d, base=0x%08lx\n", - p->capability,p->flags, - (unsigned long)p->base); - v4l_print_pix_fmt (vfd, &p->fmt); - } - break; - } - case VIDIOC_S_FBUF: - { - struct v4l2_framebuffer *p=arg; - if (!vfd->vidioc_s_fbuf) - break; - - dbgarg (cmd, "capability=%d, flags=%d, base=0x%08lx\n", - p->capability,p->flags,(unsigned long)p->base); - v4l_print_pix_fmt (vfd, &p->fmt); - ret=vfd->vidioc_s_fbuf(file, fh, arg); - - break; - } - case VIDIOC_STREAMON: - { - enum v4l2_buf_type i = *(int *)arg; - if (!vfd->vidioc_streamon) - break; - dbgarg (cmd, "type=%s\n", prt_names(i,v4l2_type_names_FIXME)); - ret=vfd->vidioc_streamon(file, fh,i); - break; - } - case VIDIOC_STREAMOFF: - { - enum v4l2_buf_type i = *(int *)arg; - - if (!vfd->vidioc_streamoff) - break; - dbgarg (cmd, "type=%s\n", prt_names(i,v4l2_type_names_FIXME)); - ret=vfd->vidioc_streamoff(file, fh, i); - break; - } - /* ---------- tv norms ---------- */ - case VIDIOC_ENUMSTD: - { - struct v4l2_standard *p = arg; - unsigned int index = p->index; - - if (!vfd->tvnormsize) { - printk (KERN_WARNING "%s: no TV norms defined!\n", - vfd->name); - break; - } - - if (index < 0 || index >= vfd->tvnormsize) { - ret=-EINVAL; - break; - } - v4l2_video_std_construct(p, vfd->tvnorms[p->index].id, - vfd->tvnorms[p->index].name); - p->index = index; - - dbgarg (cmd, "index=%d, id=%Ld, name=%s, fps=%d/%d, " - "framelines=%d\n", p->index, - (unsigned long long)p->id, p->name, - p->frameperiod.numerator, - p->frameperiod.denominator, - p->framelines); - - ret=0; - break; - } - case VIDIOC_G_STD: - { - v4l2_std_id *id = arg; - - *id = vfd->current_norm; - - dbgarg (cmd, "value=%Lu\n", (long long unsigned) *id); - - ret=0; - break; - } - case VIDIOC_S_STD: - { - v4l2_std_id *id = arg; - unsigned int i; - - if (!vfd->tvnormsize) { - printk (KERN_WARNING "%s: no TV norms defined!\n", - vfd->name); - break; - } - - dbgarg (cmd, "value=%Lu\n", (long long unsigned) *id); - - /* First search for exact match */ - for (i = 0; i < vfd->tvnormsize; i++) - if (*id == vfd->tvnorms[i].id) - break; - /* Then for a generic video std that contains desired std */ - if (i == vfd->tvnormsize) - for (i = 0; i < vfd->tvnormsize; i++) - if (*id & vfd->tvnorms[i].id) - break; - if (i == vfd->tvnormsize) { - break; - } - - /* Calls the specific handler */ - if (vfd->vidioc_s_std) - ret=vfd->vidioc_s_std(file, fh, i); - else - ret=-EINVAL; - - /* Updates standard information */ - if (!ret) - vfd->current_norm=*id; - - break; - } - case VIDIOC_QUERYSTD: - { - v4l2_std_id *p=arg; - - if (!vfd->vidioc_querystd) - break; - ret=vfd->vidioc_querystd(file, fh, arg); - if (!ret) - dbgarg (cmd, "detected std=%Lu\n", - (unsigned long long)*p); - break; - } - /* ------ input switching ---------- */ - /* FIXME: Inputs can be handled inside videodev2 */ - case VIDIOC_ENUMINPUT: - { - struct v4l2_input *p=arg; - int i=p->index; - - if (!vfd->vidioc_enum_input) - break; - memset(p, 0, sizeof(*p)); - p->index=i; - - ret=vfd->vidioc_enum_input(file, fh, p); - if (!ret) - dbgarg (cmd, "index=%d, name=%s, type=%d, " - "audioset=%d, " - "tuner=%d, std=%Ld, status=%d\n", - p->index,p->name,p->type,p->audioset, - p->tuner, - (unsigned long long)p->std, - p->status); - break; - } - case VIDIOC_G_INPUT: - { - unsigned int *i = arg; - - if (!vfd->vidioc_g_input) - break; - ret=vfd->vidioc_g_input(file, fh, i); - if (!ret) - dbgarg (cmd, "value=%d\n",*i); - break; - } - case VIDIOC_S_INPUT: - { - unsigned int *i = arg; - - if (!vfd->vidioc_s_input) - break; - dbgarg (cmd, "value=%d\n",*i); - ret=vfd->vidioc_s_input(file, fh, *i); - break; - } - - /* ------ output switching ---------- */ - case VIDIOC_G_OUTPUT: - { - unsigned int *i = arg; - - if (!vfd->vidioc_g_output) - break; - ret=vfd->vidioc_g_output(file, fh, i); - if (!ret) - dbgarg (cmd, "value=%d\n",*i); - break; - } - case VIDIOC_S_OUTPUT: - { - unsigned int *i = arg; - - if (!vfd->vidioc_s_output) - break; - dbgarg (cmd, "value=%d\n",*i); - ret=vfd->vidioc_s_output(file, fh, *i); - break; - } - - /* --- controls ---------------------------------------------- */ - case VIDIOC_QUERYCTRL: - { - struct v4l2_queryctrl *p=arg; - - if (!vfd->vidioc_queryctrl) - break; - ret=vfd->vidioc_queryctrl(file, fh, p); - - if (!ret) - dbgarg (cmd, "id=%d, type=%d, name=%s, " - "min/max=%d/%d," - " step=%d, default=%d, flags=0x%08x\n", - p->id,p->type,p->name,p->minimum, - p->maximum,p->step,p->default_value, - p->flags); - break; - } - case VIDIOC_G_CTRL: - { - struct v4l2_control *p = arg; - - if (!vfd->vidioc_g_ctrl) - break; - dbgarg(cmd, "Enum for index=%d\n", p->id); - - ret=vfd->vidioc_g_ctrl(file, fh, p); - if (!ret) - dbgarg2 ( "id=%d, value=%d\n", p->id, p->value); - break; - } - case VIDIOC_S_CTRL: - { - struct v4l2_control *p = arg; - - if (!vfd->vidioc_s_ctrl) - break; - dbgarg (cmd, "id=%d, value=%d\n", p->id, p->value); - - ret=vfd->vidioc_s_ctrl(file, fh, p); - break; - } - case VIDIOC_G_EXT_CTRLS: - { - struct v4l2_ext_controls *p = arg; - - if (vfd->vidioc_g_ext_ctrls) { - dbgarg(cmd, "count=%d\n", p->count); - - ret=vfd->vidioc_g_ext_ctrls(file, fh, p); - } - break; - } - case VIDIOC_S_EXT_CTRLS: - { - struct v4l2_ext_controls *p = arg; - - if (vfd->vidioc_s_ext_ctrls) { - dbgarg(cmd, "count=%d\n", p->count); - - ret=vfd->vidioc_s_ext_ctrls(file, fh, p); - } - break; - } - case VIDIOC_TRY_EXT_CTRLS: - { - struct v4l2_ext_controls *p = arg; - - if (vfd->vidioc_try_ext_ctrls) { - dbgarg(cmd, "count=%d\n", p->count); - - ret=vfd->vidioc_try_ext_ctrls(file, fh, p); - } - break; - } - case VIDIOC_QUERYMENU: - { - struct v4l2_querymenu *p=arg; - if (!vfd->vidioc_querymenu) - break; - ret=vfd->vidioc_querymenu(file, fh, p); - if (!ret) - dbgarg (cmd, "id=%d, index=%d, name=%s\n", - p->id,p->index,p->name); - break; - } - /* --- audio ---------------------------------------------- */ - case VIDIOC_ENUMAUDIO: - { - struct v4l2_audio *p=arg; - - if (!vfd->vidioc_enumaudio) - break; - dbgarg(cmd, "Enum for index=%d\n", p->index); - ret=vfd->vidioc_enumaudio(file, fh, p); - if (!ret) - dbgarg2("index=%d, name=%s, capability=%d, " - "mode=%d\n",p->index,p->name, - p->capability, p->mode); - break; - } - case VIDIOC_G_AUDIO: - { - struct v4l2_audio *p=arg; - - if (!vfd->vidioc_g_audio) - break; - dbgarg(cmd, "Get for index=%d\n", p->index); - ret=vfd->vidioc_g_audio(file, fh, p); - if (!ret) - dbgarg2("index=%d, name=%s, capability=%d, " - "mode=%d\n",p->index, - p->name,p->capability, p->mode); - break; - } - case VIDIOC_S_AUDIO: - { - struct v4l2_audio *p=arg; - - if (!vfd->vidioc_s_audio) - break; - dbgarg(cmd, "index=%d, name=%s, capability=%d, " - "mode=%d\n", p->index, p->name, - p->capability, p->mode); - ret=vfd->vidioc_s_audio(file, fh, p); - break; - } - case VIDIOC_ENUMAUDOUT: - { - struct v4l2_audioout *p=arg; - - if (!vfd->vidioc_enumaudout) - break; - dbgarg(cmd, "Enum for index=%d\n", p->index); - ret=vfd->vidioc_enumaudout(file, fh, p); - if (!ret) - dbgarg2("index=%d, name=%s, capability=%d, " - "mode=%d\n", p->index, p->name, - p->capability,p->mode); - break; - } - case VIDIOC_G_AUDOUT: - { - struct v4l2_audioout *p=arg; - - if (!vfd->vidioc_g_audout) - break; - dbgarg(cmd, "Enum for index=%d\n", p->index); - ret=vfd->vidioc_g_audout(file, fh, p); - if (!ret) - dbgarg2("index=%d, name=%s, capability=%d, " - "mode=%d\n", p->index, p->name, - p->capability,p->mode); - break; - } - case VIDIOC_S_AUDOUT: - { - struct v4l2_audioout *p=arg; - - if (!vfd->vidioc_s_audout) - break; - dbgarg(cmd, "index=%d, name=%s, capability=%d, " - "mode=%d\n", p->index, p->name, - p->capability,p->mode); - - ret=vfd->vidioc_s_audout(file, fh, p); - break; - } - case VIDIOC_G_MODULATOR: - { - struct v4l2_modulator *p=arg; - if (!vfd->vidioc_g_modulator) - break; - ret=vfd->vidioc_g_modulator(file, fh, p); - if (!ret) - dbgarg(cmd, "index=%d, name=%s, " - "capability=%d, rangelow=%d," - " rangehigh=%d, txsubchans=%d\n", - p->index, p->name,p->capability, - p->rangelow, p->rangehigh, - p->txsubchans); - break; - } - case VIDIOC_S_MODULATOR: - { - struct v4l2_modulator *p=arg; - if (!vfd->vidioc_s_modulator) - break; - dbgarg(cmd, "index=%d, name=%s, capability=%d, " - "rangelow=%d, rangehigh=%d, txsubchans=%d\n", - p->index, p->name,p->capability,p->rangelow, - p->rangehigh,p->txsubchans); - ret=vfd->vidioc_s_modulator(file, fh, p); - break; - } - case VIDIOC_G_CROP: - { - struct v4l2_crop *p=arg; - if (!vfd->vidioc_g_crop) - break; - ret=vfd->vidioc_g_crop(file, fh, p); - if (!ret) { - dbgarg(cmd, "type=%d\n", p->type); - dbgrect(vfd, "", &p->c); - } - break; - } - case VIDIOC_S_CROP: - { - struct v4l2_crop *p=arg; - if (!vfd->vidioc_s_crop) - break; - dbgarg(cmd, "type=%d\n", p->type); - dbgrect(vfd, "", &p->c); - ret=vfd->vidioc_s_crop(file, fh, p); - break; - } - case VIDIOC_CROPCAP: - { - struct v4l2_cropcap *p=arg; - /*FIXME: Should also show v4l2_fract pixelaspect */ - if (!vfd->vidioc_cropcap) - break; - dbgarg(cmd, "type=%d\n", p->type); - dbgrect(vfd, "bounds ", &p->bounds); - dbgrect(vfd, "defrect ", &p->defrect); - ret=vfd->vidioc_cropcap(file, fh, p); - break; - } - case VIDIOC_G_MPEGCOMP: - { - struct v4l2_mpeg_compression *p=arg; - - /*FIXME: Several fields not shown */ - if (!vfd->vidioc_g_mpegcomp) - break; - ret=vfd->vidioc_g_mpegcomp(file, fh, p); - if (!ret) - dbgarg (cmd, "ts_pid_pmt=%d, ts_pid_audio=%d," - " ts_pid_video=%d, ts_pid_pcr=%d, " - "ps_size=%d, au_sample_rate=%d, " - "au_pesid=%c, vi_frame_rate=%d, " - "vi_frames_per_gop=%d, " - "vi_bframes_count=%d, vi_pesid=%c\n", - p->ts_pid_pmt,p->ts_pid_audio, - p->ts_pid_video,p->ts_pid_pcr, - p->ps_size, p->au_sample_rate, - p->au_pesid, p->vi_frame_rate, - p->vi_frames_per_gop, - p->vi_bframes_count, p->vi_pesid); - break; - } - case VIDIOC_S_MPEGCOMP: - { - struct v4l2_mpeg_compression *p=arg; - /*FIXME: Several fields not shown */ - if (!vfd->vidioc_s_mpegcomp) - break; - dbgarg (cmd, "ts_pid_pmt=%d, ts_pid_audio=%d, " - "ts_pid_video=%d, ts_pid_pcr=%d, ps_size=%d, " - "au_sample_rate=%d, au_pesid=%c, " - "vi_frame_rate=%d, vi_frames_per_gop=%d, " - "vi_bframes_count=%d, vi_pesid=%c\n", - p->ts_pid_pmt,p->ts_pid_audio, p->ts_pid_video, - p->ts_pid_pcr, p->ps_size, p->au_sample_rate, - p->au_pesid, p->vi_frame_rate, - p->vi_frames_per_gop, p->vi_bframes_count, - p->vi_pesid); - ret=vfd->vidioc_s_mpegcomp(file, fh, p); - break; - } - case VIDIOC_G_JPEGCOMP: - { - struct v4l2_jpegcompression *p=arg; - if (!vfd->vidioc_g_jpegcomp) - break; - ret=vfd->vidioc_g_jpegcomp(file, fh, p); - if (!ret) - dbgarg (cmd, "quality=%d, APPn=%d, " - "APP_len=%d, COM_len=%d, " - "jpeg_markers=%d\n", - p->quality,p->APPn,p->APP_len, - p->COM_len,p->jpeg_markers); - break; - } - case VIDIOC_S_JPEGCOMP: - { - struct v4l2_jpegcompression *p=arg; - if (!vfd->vidioc_g_jpegcomp) - break; - dbgarg (cmd, "quality=%d, APPn=%d, APP_len=%d, " - "COM_len=%d, jpeg_markers=%d\n", - p->quality,p->APPn,p->APP_len, - p->COM_len,p->jpeg_markers); - ret=vfd->vidioc_s_jpegcomp(file, fh, p); - break; - } - case VIDIOC_G_PARM: - { - struct v4l2_streamparm *p=arg; - if (!vfd->vidioc_g_parm) - break; - ret=vfd->vidioc_g_parm(file, fh, p); - dbgarg (cmd, "type=%d\n", p->type); - break; - } - case VIDIOC_S_PARM: - { - struct v4l2_streamparm *p=arg; - if (!vfd->vidioc_s_parm) - break; - dbgarg (cmd, "type=%d\n", p->type); - ret=vfd->vidioc_s_parm(file, fh, p); - break; - } - case VIDIOC_G_TUNER: - { - struct v4l2_tuner *p=arg; - if (!vfd->vidioc_g_tuner) - break; - ret=vfd->vidioc_g_tuner(file, fh, p); - if (!ret) - dbgarg (cmd, "index=%d, name=%s, type=%d, " - "capability=%d, rangelow=%d, " - "rangehigh=%d, signal=%d, afc=%d, " - "rxsubchans=%d, audmode=%d\n", - p->index, p->name, p->type, - p->capability, p->rangelow, - p->rangehigh, p->rxsubchans, - p->audmode, p->signal, p->afc); - break; - } - case VIDIOC_S_TUNER: - { - struct v4l2_tuner *p=arg; - if (!vfd->vidioc_s_tuner) - break; - dbgarg (cmd, "index=%d, name=%s, type=%d, " - "capability=%d, rangelow=%d, rangehigh=%d, " - "signal=%d, afc=%d, rxsubchans=%d, " - "audmode=%d\n",p->index, p->name, p->type, - p->capability, p->rangelow,p->rangehigh, - p->rxsubchans, p->audmode, p->signal, - p->afc); - ret=vfd->vidioc_s_tuner(file, fh, p); - break; - } - case VIDIOC_G_FREQUENCY: - { - struct v4l2_frequency *p=arg; - if (!vfd->vidioc_g_frequency) - break; - ret=vfd->vidioc_g_frequency(file, fh, p); - if (!ret) - dbgarg (cmd, "tuner=%d, type=%d, frequency=%d\n", - p->tuner,p->type,p->frequency); - break; - } - case VIDIOC_S_FREQUENCY: - { - struct v4l2_frequency *p=arg; - if (!vfd->vidioc_s_frequency) - break; - dbgarg (cmd, "tuner=%d, type=%d, frequency=%d\n", - p->tuner,p->type,p->frequency); - ret=vfd->vidioc_s_frequency(file, fh, p); - break; - } - case VIDIOC_G_SLICED_VBI_CAP: - { - struct v4l2_sliced_vbi_cap *p=arg; - if (!vfd->vidioc_g_sliced_vbi_cap) - break; - ret=vfd->vidioc_g_sliced_vbi_cap(file, fh, p); - if (!ret) - dbgarg (cmd, "service_set=%d\n", p->service_set); - break; - } - case VIDIOC_LOG_STATUS: - { - if (!vfd->vidioc_log_status) - break; - ret=vfd->vidioc_log_status(file, fh); - break; - } - - /* --- Others --------------------------------------------- */ - - default: - ret=v4l_compat_translate_ioctl(inode,file,cmd,arg,__video_do_ioctl); - } - - if (vfd->debug & V4L2_DEBUG_IOCTL_ARG) { - if (ret<0) { - printk ("%s: err:\n", vfd->name); - v4l_print_ioctl(vfd->name, cmd); - } - } - - return ret; -} - -int video_ioctl2 (struct inode *inode, struct file *file, - unsigned int cmd, unsigned long arg) -{ - char sbuf[128]; - void *mbuf = NULL; - void *parg = NULL; - int err = -EINVAL; - int is_ext_ctrl; - size_t ctrls_size = 0; - void __user *user_ptr = NULL; - -#ifdef __OLD_VIDIOC_ - cmd = video_fix_command(cmd); -#endif - is_ext_ctrl = (cmd == VIDIOC_S_EXT_CTRLS || cmd == VIDIOC_G_EXT_CTRLS || - cmd == VIDIOC_TRY_EXT_CTRLS); - - /* Copy arguments into temp kernel buffer */ - switch (_IOC_DIR(cmd)) { - case _IOC_NONE: - parg = NULL; - break; - case _IOC_READ: - case _IOC_WRITE: - case (_IOC_WRITE | _IOC_READ): - if (_IOC_SIZE(cmd) <= sizeof(sbuf)) { - parg = sbuf; - } else { - /* too big to allocate from stack */ - mbuf = kmalloc(_IOC_SIZE(cmd),GFP_KERNEL); - if (NULL == mbuf) - return -ENOMEM; - parg = mbuf; - } - - err = -EFAULT; - if (_IOC_DIR(cmd) & _IOC_WRITE) - if (copy_from_user(parg, (void __user *)arg, _IOC_SIZE(cmd))) - goto out; - break; - } - - if (is_ext_ctrl) { - struct v4l2_ext_controls *p = parg; - - /* In case of an error, tell the caller that it wasn't - a specific control that caused it. */ - p->error_idx = p->count; - user_ptr = (void __user *)p->controls; - if (p->count) { - ctrls_size = sizeof(struct v4l2_ext_control) * p->count; - /* Note: v4l2_ext_controls fits in sbuf[] so mbuf is still NULL. */ - mbuf = kmalloc(ctrls_size, GFP_KERNEL); - err = -ENOMEM; - if (NULL == mbuf) - goto out_ext_ctrl; - err = -EFAULT; - if (copy_from_user(mbuf, user_ptr, ctrls_size)) - goto out_ext_ctrl; - p->controls = mbuf; - } - } - - /* Handles IOCTL */ - err = __video_do_ioctl(inode, file, cmd, parg); - if (err == -ENOIOCTLCMD) - err = -EINVAL; - if (is_ext_ctrl) { - struct v4l2_ext_controls *p = parg; - - p->controls = (void *)user_ptr; - if (p->count && err == 0 && copy_to_user(user_ptr, mbuf, ctrls_size)) - err = -EFAULT; - goto out_ext_ctrl; - } - if (err < 0) - goto out; - -out_ext_ctrl: - /* Copy results into user buffer */ - switch (_IOC_DIR(cmd)) - { - case _IOC_READ: - case (_IOC_WRITE | _IOC_READ): - if (copy_to_user((void __user *)arg, parg, _IOC_SIZE(cmd))) - err = -EFAULT; - break; - } - -out: - kfree(mbuf); - return err; -} - - static struct file_operations video_fops; /** @@ -1512,34 +274,31 @@ int video_register_device(struct video_device *vfd, int type, int nr) int i=0; int base; int end; - int ret; char *name_base; switch(type) { case VFL_TYPE_GRABBER: - base=MINOR_VFL_TYPE_GRABBER_MIN; - end=MINOR_VFL_TYPE_GRABBER_MAX+1; + base=0; + end=64; name_base = "video"; break; case VFL_TYPE_VTX: - base=MINOR_VFL_TYPE_VTX_MIN; - end=MINOR_VFL_TYPE_VTX_MAX+1; + base=192; + end=224; name_base = "vtx"; break; case VFL_TYPE_VBI: - base=MINOR_VFL_TYPE_VBI_MIN; - end=MINOR_VFL_TYPE_VBI_MAX+1; + base=224; + end=256; name_base = "vbi"; break; case VFL_TYPE_RADIO: - base=MINOR_VFL_TYPE_RADIO_MIN; - end=MINOR_VFL_TYPE_RADIO_MAX+1; + base=64; + end=128; name_base = "radio"; break; default: - printk(KERN_ERR "%s called with unknown type: %d\n", - __FUNCTION__, type); return -1; } @@ -1565,7 +324,11 @@ int video_register_device(struct video_device *vfd, int type, int nr) video_device[i]=vfd; vfd->minor=i; mutex_unlock(&videodev_lock); - mutex_init(&vfd->lock); + + sprintf(vfd->devfs_name, "v4l/%s%d", name_base, i - base); + devfs_mk_cdev(MKDEV(VIDEO_MAJOR, vfd->minor), + S_IFCHR | S_IRUSR | S_IWUSR, vfd->devfs_name); + init_MUTEX(&vfd->lock); /* sysfs class */ memset(&vfd->class_dev, 0x00, sizeof(vfd->class_dev)); @@ -1573,19 +336,10 @@ int video_register_device(struct video_device *vfd, int type, int nr) vfd->class_dev.dev = vfd->dev; vfd->class_dev.class = &video_class; vfd->class_dev.devt = MKDEV(VIDEO_MAJOR, vfd->minor); - sprintf(vfd->class_dev.class_id, "%s%d", name_base, i - base); - ret = class_device_register(&vfd->class_dev); - if (ret < 0) { - printk(KERN_ERR "%s: class_device_register failed\n", - __FUNCTION__); - goto fail_minor; - } - ret = class_device_create_file(&vfd->class_dev, &class_device_attr_name); - if (ret < 0) { - printk(KERN_ERR "%s: class_device_create_file 'name' failed\n", - __FUNCTION__); - goto fail_classdev; - } + strlcpy(vfd->class_dev.class_id, vfd->devfs_name + 4, BUS_ID_SIZE); + class_device_register(&vfd->class_dev); + class_device_create_file(&vfd->class_dev, + &class_device_attr_name); #if 1 /* needed until all drivers are fixed */ @@ -1595,15 +349,6 @@ int video_register_device(struct video_device *vfd, int type, int nr) "http://lwn.net/Articles/36850/\n", vfd->name); #endif return 0; - -fail_classdev: - class_device_unregister(&vfd->class_dev); -fail_minor: - mutex_lock(&videodev_lock); - video_device[vfd->minor] = NULL; - vfd->minor = -1; - mutex_unlock(&videodev_lock); - return ret; } /** @@ -1620,14 +365,13 @@ void video_unregister_device(struct video_device *vfd) if(video_device[vfd->minor]!=vfd) panic("videodev: bad unregister"); + devfs_remove(vfd->devfs_name); video_device[vfd->minor]=NULL; class_device_unregister(&vfd->class_dev); mutex_unlock(&videodev_lock); } -/* - * Video fs operations - */ + static struct file_operations video_fops= { .owner = THIS_MODULE, @@ -1643,7 +387,7 @@ static int __init videodev_init(void) { int ret; - printk(KERN_INFO "Linux video capture interface: v2.00\n"); + printk(KERN_INFO "Linux video capture interface: v1.00\n"); if (register_chrdev(VIDEO_MAJOR, VIDEO_NAME, &video_fops)) { printk(KERN_WARNING "video_dev: unable to get major %d\n", VIDEO_MAJOR); return -EIO; @@ -1674,12 +418,11 @@ EXPORT_SYMBOL(video_devdata); EXPORT_SYMBOL(video_usercopy); EXPORT_SYMBOL(video_exclusive_open); EXPORT_SYMBOL(video_exclusive_release); -EXPORT_SYMBOL(video_ioctl2); EXPORT_SYMBOL(video_device_alloc); EXPORT_SYMBOL(video_device_release); -MODULE_AUTHOR("Alan Cox, Mauro Carvalho Chehab "); -MODULE_DESCRIPTION("Device registrar for Video4Linux drivers v2"); +MODULE_AUTHOR("Alan Cox"); +MODULE_DESCRIPTION("Device registrar for Video4Linux drivers"); MODULE_LICENSE("GPL"); diff --git a/drivers/media/video/vino.c b/drivers/media/video/vino.c index 268e69fde..c8fd82389 100644 --- a/drivers/media/video/vino.c +++ b/drivers/media/video/vino.c @@ -40,9 +40,8 @@ #include #include -#include +#include #include -#include #include #include @@ -246,7 +245,7 @@ struct vino_framebuffer_queue { struct vino_framebuffer *buffer[VINO_FRAMEBUFFER_COUNT_MAX]; spinlock_t queue_lock; - struct mutex queue_mutex; + struct semaphore queue_sem; wait_queue_head_t frame_wait_queue; }; @@ -284,7 +283,7 @@ struct vino_channel_settings { /* the driver is currently processing the queue */ int capturing; - struct mutex mutex; + struct semaphore sem; spinlock_t capture_lock; unsigned int users; @@ -1132,11 +1131,11 @@ static void vino_queue_free(struct vino_framebuffer_queue *q) if (q->type != VINO_MEMORY_MMAP) return; - mutex_lock(&q->queue_mutex); + down(&q->queue_sem); vino_queue_free_with_count(q, q->length); - mutex_unlock(&q->queue_mutex); + up(&q->queue_sem); } static int vino_queue_init(struct vino_framebuffer_queue *q, @@ -1160,7 +1159,7 @@ static int vino_queue_init(struct vino_framebuffer_queue *q, if (*length < 1) return -EINVAL; - mutex_lock(&q->queue_mutex); + down(&q->queue_sem); if (*length > VINO_FRAMEBUFFER_COUNT_MAX) *length = VINO_FRAMEBUFFER_COUNT_MAX; @@ -1212,7 +1211,7 @@ static int vino_queue_init(struct vino_framebuffer_queue *q, q->magic = VINO_QUEUE_MAGIC; } - mutex_unlock(&q->queue_mutex); + up(&q->queue_sem); return ret; } @@ -1555,12 +1554,12 @@ static void vino_update_line_size(struct vino_channel_settings *vcs) unsigned int w = vcs->clipping.right - vcs->clipping.left; unsigned int d = vcs->decimation; unsigned int bpp = vino_data_formats[vcs->data_format].bpp; - unsigned int lsize; + unsigned int lsize; dprintk("update_line_size(): before: w = %d, d = %d, " "line_size = %d\n", w, d, vcs->line_size); - /* line size must be multiple of 8 bytes */ + /* line size must be multiple of 8 bytes */ lsize = (bpp * (w / d)) & ~7; w = (lsize / bpp) * d; @@ -4046,7 +4045,7 @@ static int vino_open(struct inode *inode, struct file *file) dprintk("open(): channel = %c\n", (vcs->channel == VINO_CHANNEL_A) ? 'A' : 'B'); - mutex_lock(&vcs->mutex); + down(&vcs->sem); if (vcs->users) { dprintk("open(): driver busy\n"); @@ -4063,7 +4062,7 @@ static int vino_open(struct inode *inode, struct file *file) vcs->users++; out: - mutex_unlock(&vcs->mutex); + up(&vcs->sem); dprintk("open(): %s!\n", ret ? "failed" : "complete"); @@ -4076,7 +4075,7 @@ static int vino_close(struct inode *inode, struct file *file) struct vino_channel_settings *vcs = video_get_drvdata(dev); dprintk("close():\n"); - mutex_lock(&vcs->mutex); + down(&vcs->sem); vcs->users--; @@ -4088,7 +4087,7 @@ static int vino_close(struct inode *inode, struct file *file) vino_queue_free(&vcs->fb_queue); } - mutex_unlock(&vcs->mutex); + up(&vcs->sem); return 0; } @@ -4131,7 +4130,7 @@ static int vino_mmap(struct file *file, struct vm_area_struct *vma) // TODO: reject mmap if already mapped - if (mutex_lock_interruptible(&vcs->mutex)) + if (down_interruptible(&vcs->sem)) return -EINTR; if (vcs->reading) { @@ -4215,7 +4214,7 @@ found: vma->vm_ops = &vino_vm_ops; out: - mutex_unlock(&vcs->mutex); + up(&vcs->sem); return ret; } @@ -4375,12 +4374,12 @@ static int vino_ioctl(struct inode *inode, struct file *file, struct vino_channel_settings *vcs = video_get_drvdata(dev); int ret; - if (mutex_lock_interruptible(&vcs->mutex)) + if (down_interruptible(&vcs->sem)) return -EINTR; ret = video_usercopy(inode, file, cmd, arg, vino_do_ioctl); - mutex_unlock(&vcs->mutex); + up(&vcs->sem); return ret; } @@ -4565,10 +4564,10 @@ static int vino_init_channel_settings(struct vino_channel_settings *vcs, vcs->capturing = 0; - mutex_init(&vcs->mutex); + init_MUTEX(&vcs->sem); spin_lock_init(&vcs->capture_lock); - mutex_init(&vcs->fb_queue.queue_mutex); + init_MUTEX(&vcs->fb_queue.queue_sem); spin_lock_init(&vcs->fb_queue.queue_lock); init_waitqueue_head(&vcs->fb_queue.frame_wait_queue); diff --git a/drivers/media/video/vpx3220.c b/drivers/media/video/vpx3220.c index 1eca7e65d..d0a1e72ea 100644 --- a/drivers/media/video/vpx3220.c +++ b/drivers/media/video/vpx3220.c @@ -1,4 +1,4 @@ -/* +/* * vpx3220a, vpx3216b & vpx3214c video decoder driver version 0.0.1 * * Copyright (C) 2001 Laurent Pinchart @@ -30,11 +30,11 @@ #include #include +#include #define I2C_NAME(x) (x)->name #include -#include #include #define I2C_VPX3220 0x86 @@ -177,8 +177,8 @@ vpx3220_write_block (struct i2c_client *client, static int vpx3220_write_fp_block (struct i2c_client *client, - const u16 *data, - unsigned int len) + const u16 *data, + unsigned int len) { u8 reg; int ret = 0; @@ -317,7 +317,7 @@ vpx3220_command (struct i2c_client *client, vpx3220_write_fp_block(client, init_fp, sizeof(init_fp) >> 1); switch (decoder->norm) { - + case VIDEO_MODE_NTSC: vpx3220_write_fp_block(client, init_ntsc, sizeof(init_ntsc) >> 1); @@ -325,7 +325,7 @@ vpx3220_command (struct i2c_client *client, case VIDEO_MODE_PAL: vpx3220_write_fp_block(client, init_pal, - sizeof(init_pal) >> 1); + sizeof(init_pal) >> 1); break; case VIDEO_MODE_SECAM: vpx3220_write_fp_block(client, init_secam, @@ -333,10 +333,10 @@ vpx3220_command (struct i2c_client *client, break; default: vpx3220_write_fp_block(client, init_pal, - sizeof(init_pal) >> 1); + sizeof(init_pal) >> 1); break; } - } + } break; case DECODER_DUMP: @@ -412,7 +412,7 @@ vpx3220_command (struct i2c_client *client, /* Here we back up the input selection because it gets overwritten when we fill the registers with the - choosen video norm */ + choosen video norm */ temp_input = vpx3220_fp_read(client, 0xf2); dprintk(1, KERN_DEBUG "%s: DECODER_SET_NORM %d\n", @@ -579,7 +579,7 @@ static unsigned short normal_i2c[] = }; static unsigned short ignore = I2C_CLIENT_END; - + static struct i2c_client_address_data addr_data = { .normal_i2c = normal_i2c, .probe = &ignore, @@ -662,7 +662,7 @@ vpx3220_detect_client (struct i2c_adapter *adapter, break; default: dprintk(1, - KERN_INFO + KERN_INFO "%s: Wrong part number (0x%04x)\n", __func__, pn); kfree(client); diff --git a/drivers/media/video/w9966.c b/drivers/media/video/w9966.c index 4bdc886ab..b7b0afffd 100644 --- a/drivers/media/video/w9966.c +++ b/drivers/media/video/w9966.c @@ -26,7 +26,7 @@ Does any other model using the w9966 interface chip exist ? Todo: - + *Add a working EPP mode, since DMA ECP read isn't implemented in the parport drivers. (That's why it's so sloow) @@ -47,9 +47,9 @@ *Probably some bugs that I don't know of Please support me by sending feedback! - + Changes: - + Alan Cox: Removed RGB mode for kernel merge, added THIS_MODULE and owner support for newer module locks */ @@ -58,7 +58,6 @@ #include #include #include -#include #include //#define DEBUG // Undef me for production @@ -205,7 +204,7 @@ static struct video_device w9966_template = { */ -// Set camera phase flags, so we know what to uninit when terminating +// Set camera phase flags, so we know what to uninit when terminating static inline void w9966_setState(struct w9966_dev* cam, int mask, int val) { cam->dev_state = (cam->dev_state & ~mask) ^ val; @@ -234,7 +233,7 @@ static inline void w9966_pdev_release(struct w9966_dev* cam) parport_release(cam->pdev); w9966_setState(cam, W9966_STATE_CLAIMED, 0); } - + // Read register from W9966 interface-chip // Expects a claimed pdev // -1 on error, else register data (byte) @@ -243,7 +242,7 @@ static int w9966_rReg(struct w9966_dev* cam, int reg) // ECP, read, regtransfer, REG, REG, REG, REG, REG const unsigned char addr = 0x80 | (reg & 0x1f); unsigned char val; - + if (parport_negotiate(cam->pport, cam->ppmode | IEEE1284_ADDR) != 0) return -1; if (parport_write(cam->pport, &addr, 1) != 1) @@ -264,7 +263,7 @@ static int w9966_wReg(struct w9966_dev* cam, int reg, int data) // ECP, write, regtransfer, REG, REG, REG, REG, REG const unsigned char addr = 0xc0 | (reg & 0x1f); const unsigned char val = data; - + if (parport_negotiate(cam->pport, cam->ppmode | IEEE1284_ADDR) != 0) return -1; if (parport_write(cam->pport, &addr, 1) != 1) @@ -285,7 +284,7 @@ static int w9966_init(struct w9966_dev* cam, struct parport* port) { if (cam->dev_state != 0) return -1; - + cam->pport = port; cam->brightness = 128; cam->contrast = 64; @@ -303,7 +302,7 @@ static int w9966_init(struct w9966_dev* cam, struct parport* port) cam->ppmode = IEEE1284_MODE_EPP; else cam->ppmode = IEEE1284_MODE_ECP; - break; + break; case 1: // hw- or sw-ecp cam->ppmode = IEEE1284_MODE_ECP; break; @@ -311,7 +310,7 @@ static int w9966_init(struct w9966_dev* cam, struct parport* port) cam->ppmode = IEEE1284_MODE_EPP; break; } - + // Tell the parport driver that we exists cam->pdev = parport_register_device(port, "w9966", NULL, NULL, NULL, 0, NULL); if (cam->pdev == NULL) { @@ -321,7 +320,7 @@ static int w9966_init(struct w9966_dev* cam, struct parport* port) w9966_setState(cam, W9966_STATE_PDEV, W9966_STATE_PDEV); w9966_pdev_claim(cam); - + // Setup a default capture mode if (w9966_setup(cam, 0, 0, 1023, 1023, 200, 160) != 0) { DPRINTF("w9966_setup() failed.\n"); @@ -334,11 +333,11 @@ static int w9966_init(struct w9966_dev* cam, struct parport* port) memcpy(&cam->vdev, &w9966_template, sizeof(struct video_device)); cam->vdev.priv = cam; - if (video_register_device(&cam->vdev, VFL_TYPE_GRABBER, video_nr) == -1) + if (video_register_device(&cam->vdev, VFL_TYPE_GRABBER, video_nr) == -1) return -1; - + w9966_setState(cam, W9966_STATE_VDEV, W9966_STATE_VDEV); - + // All ok printk( "w9966cf: Found and initialized a webcam on %s.\n", @@ -392,7 +391,7 @@ static int w9966_findlen(int near, int size, int maxlen) // Only continue as long as we keep getting better values if (err > besterr) break; - + besterr = err; bestlen = len; } @@ -400,7 +399,7 @@ static int w9966_findlen(int near, int size, int maxlen) return bestlen; } -// Modify capture window (if necessary) +// Modify capture window (if necessary) // and calculate downscaling // Return -1 on error static int w9966_calcscale(int size, int min, int max, int* beg, int* end, unsigned char* factor) @@ -408,7 +407,7 @@ static int w9966_calcscale(int size, int min, int max, int* beg, int* end, unsig int maxlen = max - min; int len = *end - *beg + 1; int newlen = w9966_findlen(len, size, maxlen); - int err = newlen - len; + int err = newlen - len; // Check for bad format if (newlen > maxlen || newlen < size) @@ -453,8 +452,8 @@ static int w9966_setup(struct w9966_dev* cam, int x1, int y1, int x2, int y2, in 0x48, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x71, 0xe7, 0x00, 0x00, 0xc0 }; - - + + if (w*h*2 > W9966_SRAMSIZE) { DPRINTF("capture window exceeds SRAM size!.\n"); @@ -470,9 +469,9 @@ static int w9966_setup(struct w9966_dev* cam, int x1, int y1, int x2, int y2, in cam->width = w; cam->height = h; - enh_s = 0; + enh_s = 0; enh_e = w*h*2; - + // Modify capture window if necessary and calculate downscaling if ( w9966_calcscale(w, W9966_WND_MIN_X, W9966_WND_MAX_X, &x1, &x2, &scale_x) != 0 || @@ -483,14 +482,14 @@ static int w9966_setup(struct w9966_dev* cam, int x1, int y1, int x2, int y2, in "%dx%d, x: %d<->%d, y: %d<->%d, sx: %d/64, sy: %d/64.\n", w, h, x1, x2, y1, y2, scale_x&~0x80, scale_y&~0x80 ); - + // Setup registers regs[0x00] = 0x00; // Set normal operation regs[0x01] = 0x18; // Capture mode regs[0x02] = scale_y; // V-scaling regs[0x03] = scale_x; // H-scaling - - // Capture window + + // Capture window regs[0x04] = (x1 & 0x0ff); // X-start (8 low bits) regs[0x05] = (x1 & 0x300)>>8; // X-start (2 high bits) regs[0x06] = (y1 & 0x0ff); // Y-start (8 low bits) @@ -500,7 +499,7 @@ static int w9966_setup(struct w9966_dev* cam, int x1, int y1, int x2, int y2, in regs[0x0a] = (y2 & 0x0ff); // Y-end (8 low bits) regs[0x0c] = W9966_SRAMID; // SRAM-banks (1x 128kb) - + // Enhancement layer regs[0x0d] = (enh_s& 0x000ff); // Enh. start (0-7) regs[0x0e] = (enh_s& 0x0ff00)>>8; // Enh. start (8-15) @@ -516,7 +515,7 @@ static int w9966_setup(struct w9966_dev* cam, int x1, int y1, int x2, int y2, in regs[0x19] = 0xff; // I/O port direction control regs[0x1a] = 0xff; // I/O port data register regs[0x1b] = 0x10; // ??? - + // SAA7111 chip settings saa7111_regs[0x0a] = cam->brightness; saa7111_regs[0x0b] = cam->contrast; @@ -552,7 +551,7 @@ static inline void w9966_i2c_setsda(struct w9966_dev* cam, int state) cam->i2c_state |= W9966_I2C_W_DATA; else cam->i2c_state &= ~W9966_I2C_W_DATA; - + w9966_wReg(cam, 0x18, cam->i2c_state); udelay(5); } @@ -578,7 +577,7 @@ static inline int w9966_i2c_setscl(struct w9966_dev* cam, int state) w9966_wReg(cam, 0x18, cam->i2c_state); udelay(5); - + // we go to high, we also expect the peripheral to ack. if (state) { timeout = jiffies + 100; @@ -608,16 +607,16 @@ static int w9966_i2c_wbyte(struct w9966_dev* cam, int data) w9966_i2c_setsda(cam, (data >> i) & 0x01); if (w9966_i2c_setscl(cam, 1) == -1) - return -1; + return -1; w9966_i2c_setscl(cam, 0); } w9966_i2c_setsda(cam, 1); - + if (w9966_i2c_setscl(cam, 1) == -1) return -1; w9966_i2c_setscl(cam, 0); - + return 0; } @@ -627,8 +626,8 @@ static int w9966_i2c_wbyte(struct w9966_dev* cam, int data) static int w9966_i2c_rbyte(struct w9966_dev* cam) { unsigned char data = 0x00; - int i; - + int i; + w9966_i2c_setsda(cam, 1); for (i = 0; i < 8; i++) @@ -638,7 +637,7 @@ static int w9966_i2c_rbyte(struct w9966_dev* cam) data = data << 1; if (w9966_i2c_getsda(cam)) data |= 0x01; - + w9966_i2c_setscl(cam, 0); } return data; @@ -674,11 +673,11 @@ static int w9966_rReg_i2c(struct w9966_dev* cam, int reg) return -1; w9966_i2c_setsda(cam, 0); - + if (w9966_i2c_setscl(cam, 1) == -1) return -1; w9966_i2c_setsda(cam, 1); - + return data; } #endif @@ -700,7 +699,7 @@ static int w9966_wReg_i2c(struct w9966_dev* cam, int reg, int data) w9966_i2c_setsda(cam, 0); if (w9966_i2c_setscl(cam, 1) == -1) return -1; - + w9966_i2c_setsda(cam, 1); return 0; @@ -715,7 +714,7 @@ static int w9966_v4l_do_ioctl(struct inode *inode, struct file *file, { struct video_device *vdev = video_devdata(file); struct w9966_dev *cam = vdev->priv; - + switch(cmd) { case VIDIOCGCAP: @@ -791,14 +790,14 @@ static int w9966_v4l_do_ioctl(struct inode *inode, struct file *file, struct video_picture *vpic = arg; if (vpic->depth != 16 || vpic->palette != VIDEO_PALETTE_YUV422) return -EINVAL; - + cam->brightness = vpic->brightness >> 8; cam->hue = (vpic->hue >> 8) - 128; cam->color = vpic->colour >> 9; cam->contrast = vpic->contrast >> 9; w9966_pdev_claim(cam); - + if ( w9966_wReg_i2c(cam, 0x0a, cam->brightness) == -1 || w9966_wReg_i2c(cam, 0x0b, cam->contrast) == -1 || @@ -808,7 +807,7 @@ static int w9966_v4l_do_ioctl(struct inode *inode, struct file *file, w9966_pdev_release(cam); return -EIO; } - + w9966_pdev_release(cam); return 0; } @@ -816,13 +815,13 @@ static int w9966_v4l_do_ioctl(struct inode *inode, struct file *file, { int ret; struct video_window *vwin = arg; - + if (vwin->flags != 0) return -EINVAL; if (vwin->clipcount != 0) return -EINVAL; if (vwin->width < 2 || vwin->width > W9966_WND_MAX_W) - return -EINVAL; + return -EINVAL; if (vwin->height < 1 || vwin->height > W9966_WND_MAX_H) return -EINVAL; @@ -830,12 +829,12 @@ static int w9966_v4l_do_ioctl(struct inode *inode, struct file *file, w9966_pdev_claim(cam); ret = w9966_setup(cam, 0, 0, 1023, 1023, vwin->width, vwin->height); w9966_pdev_release(cam); - + if (ret != 0) { DPRINTF("VIDIOCSWIN: w9966_setup() failed.\n"); return -EIO; } - + return 0; } case VIDIOCGWIN: @@ -847,7 +846,7 @@ static int w9966_v4l_do_ioctl(struct inode *inode, struct file *file, return 0; } // Unimplemented - case VIDIOCCAPTURE: + case VIDIOCCAPTURE: case VIDIOCGFBUF: case VIDIOCSFBUF: case VIDIOCKEY: @@ -878,17 +877,17 @@ static ssize_t w9966_v4l_read(struct file *file, char __user *buf, unsigned char __user *dest = (unsigned char __user *)buf; unsigned long dleft = count; unsigned char *tbuf; - + // Why would anyone want more than this?? if (count > cam->width * cam->height * 2) return -EINVAL; - + w9966_pdev_claim(cam); w9966_wReg(cam, 0x00, 0x02); // Reset ECP-FIFO buffer w9966_wReg(cam, 0x00, 0x00); // Return to normal operation w9966_wReg(cam, 0x01, 0x98); // Enable capture - // write special capture-addr and negotiate into data transfer + // write special capture-addr and negotiate into data transfer if ( (parport_negotiate(cam->pport, cam->ppmode|IEEE1284_ADDR) != 0 )|| (parport_write(cam->pport, &addr, 1) != 1 )|| @@ -907,7 +906,7 @@ static ssize_t w9966_v4l_read(struct file *file, char __user *buf, while(dleft > 0) { unsigned long tsize = (dleft > W9966_RBUFFER) ? W9966_RBUFFER : dleft; - + if (parport_read(cam->pport, tbuf, tsize) < tsize) { count = -EFAULT; goto out; @@ -934,7 +933,7 @@ out: static void w9966_attach(struct parport *port) { int i; - + for (i = 0; i < W9966_MAXCAMS; i++) { if (w9966_cams[i].dev_state != 0) // Cam is already assigned diff --git a/drivers/media/video/wm8775.c b/drivers/media/video/wm8775.c index d81a88bbe..8cb64f8a8 100644 --- a/drivers/media/video/wm8775.c +++ b/drivers/media/video/wm8775.c @@ -79,26 +79,21 @@ static int wm8775_command(struct i2c_client *client, unsigned int cmd, void *arg) { struct wm8775_state *state = i2c_get_clientdata(client); - struct v4l2_routing *route = arg; + struct v4l2_audio *input = arg; struct v4l2_control *ctrl = arg; switch (cmd) { - case VIDIOC_INT_G_AUDIO_ROUTING: - route->input = state->input; - route->output = 0; - break; - - case VIDIOC_INT_S_AUDIO_ROUTING: + case VIDIOC_S_AUDIO: /* There are 4 inputs and one output. Zero or more inputs are multiplexed together to the output. Hence there are 16 combinations. If only one input is active (the normal case) then the input values 1, 2, 4 or 8 should be used. */ - if (route->input > 15) { - v4l_err(client, "Invalid input %d.\n", route->input); + if (input->index > 15) { + v4l_err(client, "Invalid input %d.\n", input->index); return -EINVAL; } - state->input = route->input; + state->input = input->index; if (state->muted) break; wm8775_write(client, R21, 0x0c0); @@ -107,6 +102,11 @@ static int wm8775_command(struct i2c_client *client, unsigned int cmd, wm8775_write(client, R21, 0x100 + state->input); break; + case VIDIOC_G_AUDIO: + memset(input, 0, sizeof(*input)); + input->index = state->input; + break; + case VIDIOC_G_CTRL: if (ctrl->id != V4L2_CID_AUDIO_MUTE) return -EINVAL; diff --git a/drivers/media/video/zoran.h b/drivers/media/video/zoran.h index 8fb4a3414..9fe6ad3b6 100644 --- a/drivers/media/video/zoran.h +++ b/drivers/media/video/zoran.h @@ -1,4 +1,4 @@ -/* +/* * zoran - Iomega Buz driver * * Copyright (C) 1999 Rainer Johanni @@ -159,7 +159,7 @@ Private IOCTL to set up for displaying MJPEG #define BUZ_MAX_FRAME 256 /* Must be a power of 2 */ #define BUZ_MASK_FRAME 255 /* Must be BUZ_MAX_FRAME-1 */ -#define BUZ_MAX_INPUT 16 +#define BUZ_MAX_INPUT 8 #if VIDEO_MAX_FRAME <= 32 # define V4L_MAX_FRAME 32 @@ -191,9 +191,6 @@ enum card_type { /* Iomega */ BUZ, - /* AverMedia */ - AVS6EYES, - /* total number of cards */ NUM_CARDS }; @@ -267,7 +264,7 @@ struct zoran_v4l_settings { }; /* whoops, this one is undeclared if !v4l2 */ -#ifndef CONFIG_VIDEO_V4L2 +#ifndef HAVE_V4L2 struct v4l2_jpegcompression { int quality; int APPn; @@ -382,9 +379,6 @@ struct card_info { /* is the /GWS line conected? */ u8 gws_not_connected; - /* avs6eyes mux setting */ - u8 input_mux; - void (*init) (struct zoran * zr); }; @@ -401,7 +395,7 @@ struct zoran { struct videocodec *codec; /* video codec */ struct videocodec *vfe; /* video front end */ - struct mutex resource_lock; /* prevent evil stuff */ + struct semaphore resource_lock; /* prevent evil stuff */ u8 initialized; /* flag if zoran has been correctly initalized */ int user; /* number of current users */ diff --git a/drivers/media/video/zoran_card.c b/drivers/media/video/zoran_card.c index f2249ed25..246e67cd8 100644 --- a/drivers/media/video/zoran_card.c +++ b/drivers/media/video/zoran_card.c @@ -4,7 +4,7 @@ * Media Labs LML33/LML33R10. * * This part handles card-specific data and detection - * + * * Copyright (C) 2000 Serguei Miridonov * * Currently maintained by: @@ -27,8 +27,7 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -#include - +#include #include #include #include @@ -39,7 +38,6 @@ #include #include #include -#include #include #include #include @@ -49,7 +47,6 @@ #include #include #include -#include #include @@ -95,11 +92,6 @@ module_param(default_input, int, 0); MODULE_PARM_DESC(default_input, "Default input (0=Composite, 1=S-Video, 2=Internal)"); -static int default_mux = 1; /* 6 Eyes input selection */ -module_param(default_mux, int, 0); -MODULE_PARM_DESC(default_mux, - "Default 6 Eyes mux setting (Input selection)"); - static int default_norm = 0; /* 0=PAL, 1=NTSC 2=SECAM */ module_param(default_norm, int, 0); MODULE_PARM_DESC(default_norm, "Default norm (0=PAL, 1=NTSC, 2=SECAM)"); @@ -308,30 +300,6 @@ lml33_init (struct zoran *zr) GPIO(zr, 2, 1); // Set Composite input/output } -static void -avs6eyes_init (struct zoran *zr) -{ - // AverMedia 6-Eyes original driver by Christer Weinigel - - // Lifted straight from Christer's old driver and - // modified slightly by Martin Samuelsson. - - int mux = default_mux; /* 1 = BT866, 7 = VID1 */ - - GPIO(zr, 4, 1); /* Bt866 SLEEP on */ - udelay(2); - - GPIO(zr, 0, 1); /* ZR36060 /RESET on */ - GPIO(zr, 1, 0); /* ZR36060 /SLEEP on */ - GPIO(zr, 2, mux & 1); /* MUX S0 */ - GPIO(zr, 3, 0); /* /FRAME on */ - GPIO(zr, 4, 0); /* Bt866 SLEEP off */ - GPIO(zr, 5, mux & 2); /* MUX S1 */ - GPIO(zr, 6, 0); /* ? */ - GPIO(zr, 7, mux & 4); /* MUX S2 */ - -} - static char * i2cid_to_modulename (u16 i2c_id) { @@ -422,14 +390,6 @@ static struct tvnorm f60sqpixel_dc10 = { 780, 640, 0, 716, 525, 480, 12 }; static struct tvnorm f50ccir601_lm33r10 = { 864, 720, 74+54, 804, 625, 576, 18 }; static struct tvnorm f60ccir601_lm33r10 = { 858, 720, 56+54, 788, 525, 480, 16 }; -/* FIXME: The ks0127 seem incapable of swapping U and V, too, which is why I - * copy Maxim's left shift hack for the 6 Eyes. - * - * Christer's driver used the unshifted norms, though... - * /Sam */ -static struct tvnorm f50ccir601_avs6eyes = { 864, 720, 74, 804, 625, 576, 18 }; -static struct tvnorm f60ccir601_avs6eyes = { 858, 720, 56, 788, 525, 480, 16 }; - static struct card_info zoran_cards[NUM_CARDS] __devinitdata = { { .type = DC10_old, @@ -458,7 +418,6 @@ static struct card_info zoran_cards[NUM_CARDS] __devinitdata = { .gpcs = { -1, 0 }, .vfe_pol = { 0, 0, 0, 0, 0, 0, 0, 0 }, .gws_not_connected = 0, - .input_mux = 0, .init = &dc10_init, }, { .type = DC10_new, @@ -485,7 +444,6 @@ static struct card_info zoran_cards[NUM_CARDS] __devinitdata = { .gpcs = { -1, 1}, .vfe_pol = { 1, 1, 1, 1, 0, 0, 0, 0 }, .gws_not_connected = 0, - .input_mux = 0, .init = &dc10plus_init, }, { .type = DC10plus, @@ -515,7 +473,6 @@ static struct card_info zoran_cards[NUM_CARDS] __devinitdata = { .gpcs = { -1, 1 }, .vfe_pol = { 1, 1, 1, 1, 0, 0, 0, 0 }, .gws_not_connected = 0, - .input_mux = 0, .init = &dc10plus_init, }, { .type = DC30, @@ -544,7 +501,6 @@ static struct card_info zoran_cards[NUM_CARDS] __devinitdata = { .gpcs = { -1, 0 }, .vfe_pol = { 0, 0, 0, 0, 0, 0, 0, 0 }, .gws_not_connected = 0, - .input_mux = 0, .init = &dc10_init, }, { .type = DC30plus, @@ -575,7 +531,6 @@ static struct card_info zoran_cards[NUM_CARDS] __devinitdata = { .gpcs = { -1, 0 }, .vfe_pol = { 0, 0, 0, 0, 0, 0, 0, 0 }, .gws_not_connected = 0, - .input_mux = 0, .init = &dc10_init, }, { .type = LML33, @@ -602,7 +557,6 @@ static struct card_info zoran_cards[NUM_CARDS] __devinitdata = { .gpcs = { 3, 1 }, .vfe_pol = { 1, 1, 0, 0, 0, 1, 0, 0 }, .gws_not_connected = 1, - .input_mux = 0, .init = &lml33_init, }, { .type = LML33R10, @@ -631,7 +585,6 @@ static struct card_info zoran_cards[NUM_CARDS] __devinitdata = { .gpcs = { 3, 1 }, .vfe_pol = { 1, 1, 0, 0, 0, 1, 0, 0 }, .gws_not_connected = 1, - .input_mux = 0, .init = &lml33_init, }, { .type = BUZ, @@ -660,49 +613,8 @@ static struct card_info zoran_cards[NUM_CARDS] __devinitdata = { .gpcs = { 3, 1 }, .vfe_pol = { 1, 1, 0, 0, 0, 1, 0, 0 }, .gws_not_connected = 1, - .input_mux = 0, .init = &buz_init, - }, { - .type = AVS6EYES, - .name = "6-Eyes", - /* AverMedia chose not to brand the 6-Eyes. Thus it - can't be autodetected, and requires card=x. */ - .vendor_id = -1, - .device_id = -1, - .i2c_decoder = I2C_DRIVERID_KS0127, - .i2c_encoder = I2C_DRIVERID_BT866, - .video_codec = CODEC_TYPE_ZR36060, - - .inputs = 10, - .input = { - { 0, "Composite 1" }, - { 1, "Composite 2" }, - { 2, "Composite 3" }, - { 4, "Composite 4" }, - { 5, "Composite 5" }, - { 6, "Composite 6" }, - { 8, "S-Video 1" }, - { 9, "S-Video 2" }, - {10, "S-Video 3" }, - {15, "YCbCr" } - }, - .norms = 2, - .tvn = { - &f50ccir601_avs6eyes, - &f60ccir601_avs6eyes, - NULL - }, - .jpeg_int = ZR36057_ISR_GIRQ1, - .vsync_int = ZR36057_ISR_GIRQ0, - .gpio = { 1, 0, 3, -1, -1, -1, -1, -1 },// Validity unknown /Sam - .gpio_pol = { 0, 0, 0, 0, 0, 0, 0, 0 }, // Validity unknown /Sam - .gpcs = { 3, 1 }, // Validity unknown /Sam - .vfe_pol = { 1, 0, 0, 0, 0, 1, 0, 0 }, // Validity unknown /Sam - .gws_not_connected = 1, - .input_mux = 1, - .init = &avs6eyes_init, } - }; /* @@ -761,7 +673,7 @@ zoran_i2c_client_register (struct i2c_client *client) KERN_DEBUG "%s: i2c_client_register() - driver id = %d\n", ZR_DEVNAME(zr), client->driver->id); - mutex_lock(&zr->resource_lock); + down(&zr->resource_lock); if (zr->user > 0) { /* we're already busy, so we keep a reference to @@ -782,7 +694,7 @@ zoran_i2c_client_register (struct i2c_client *client) } clientreg_unlock_and_return: - mutex_unlock(&zr->resource_lock); + up(&zr->resource_lock); return res; } @@ -795,7 +707,7 @@ zoran_i2c_client_unregister (struct i2c_client *client) dprintk(2, KERN_DEBUG "%s: i2c_client_unregister()\n", ZR_DEVNAME(zr)); - mutex_lock(&zr->resource_lock); + down(&zr->resource_lock); if (zr->user > 0) { res = -EBUSY; @@ -810,7 +722,7 @@ zoran_i2c_client_unregister (struct i2c_client *client) snprintf(ZR_DEVNAME(zr), sizeof(ZR_DEVNAME(zr)), "MJPEG[%d]", zr->id); } clientunreg_unlock_and_return: - mutex_unlock(&zr->resource_lock); + up(&zr->resource_lock); return res; } @@ -1083,7 +995,10 @@ test_interrupts (struct zoran *zr) static int __devinit zr36057_init (struct zoran *zr) { - int j, err; + u32 *mem; + void *vdev; + unsigned mem_needed; + int j; int two = 2; int zero = 0; @@ -1134,16 +1049,19 @@ zr36057_init (struct zoran *zr) /* allocate memory *before* doing anything to the hardware * in case allocation fails */ - zr->stat_com = kzalloc(BUZ_NUM_STAT_COM * 4, GFP_KERNEL); - zr->video_dev = kmalloc(sizeof(struct video_device), GFP_KERNEL); - if (!zr->stat_com || !zr->video_dev) { + mem_needed = BUZ_NUM_STAT_COM * 4; + mem = kzalloc(mem_needed, GFP_KERNEL); + vdev = (void *) kmalloc(sizeof(struct video_device), GFP_KERNEL); + if (!mem || !vdev) { dprintk(1, KERN_ERR "%s: zr36057_init() - kmalloc (STAT_COM) failed\n", ZR_DEVNAME(zr)); - err = -ENOMEM; - goto exit_free; + kfree(vdev); + kfree(mem); + return -ENOMEM; } + zr->stat_com = mem; for (j = 0; j < BUZ_NUM_STAT_COM; j++) { zr->stat_com[j] = 1; /* mark as unavailable to zr36057 */ } @@ -1151,11 +1069,16 @@ zr36057_init (struct zoran *zr) /* * Now add the template and register the device unit. */ + zr->video_dev = vdev; memcpy(zr->video_dev, &zoran_template, sizeof(zoran_template)); strcpy(zr->video_dev->name, ZR_DEVNAME(zr)); - err = video_register_device(zr->video_dev, VFL_TYPE_GRABBER, video_nr); - if (err < 0) - goto exit_unregister; + if (video_register_device(zr->video_dev, VFL_TYPE_GRABBER, + video_nr) < 0) { + zoran_unregister_i2c(zr); + kfree((void *) zr->stat_com); + kfree(vdev); + return -1; + } zoran_init_hardware(zr); if (*zr_debug > 2) @@ -1169,13 +1092,6 @@ zr36057_init (struct zoran *zr) zr->zoran_proc = NULL; zr->initialized = 1; return 0; - -exit_unregister: - zoran_unregister_i2c(zr); -exit_free: - kfree(zr->stat_com); - kfree(zr->video_dev); - return err; } static void @@ -1205,7 +1121,7 @@ zoran_release (struct zoran *zr) btwrite(0, ZR36057_SPGPPCR); free_irq(zr->pci_dev->irq, zr); /* unmap and free memory */ - kfree(zr->stat_com); + kfree((void *) zr->stat_com); zoran_proc_cleanup(zr); iounmap(zr->zr36057_mem); pci_disable_device(zr->pci_dev); @@ -1290,7 +1206,7 @@ find_zr36057 (void) zr->id = zoran_num; snprintf(ZR_DEVNAME(zr), sizeof(ZR_DEVNAME(zr)), "MJPEG[%u]", zr->id); spin_lock_init(&zr->spinlock); - mutex_init(&zr->resource_lock); + init_MUTEX(&zr->resource_lock); if (pci_enable_device(dev)) continue; zr->zr36057_adr = pci_resource_start(zr->pci_dev, 0); @@ -1380,7 +1296,7 @@ find_zr36057 (void) result = request_irq(zr->pci_dev->irq, zoran_irq, - IRQF_SHARED | IRQF_DISABLED, + SA_SHIRQ | SA_INTERRUPT, ZR_DEVNAME(zr), (void *) zr); if (result < 0) { diff --git a/drivers/media/video/zoran_card.h b/drivers/media/video/zoran_card.h index ad997c30b..e5b6acd3e 100644 --- a/drivers/media/video/zoran_card.h +++ b/drivers/media/video/zoran_card.h @@ -4,7 +4,7 @@ * Media Labs LML33/LML33R10. * * This part handles card-specific data and detection - * + * * Copyright (C) 2000 Serguei Miridonov * * Currently maintained by: diff --git a/drivers/media/video/zoran_device.c b/drivers/media/video/zoran_device.c index 3cbac2e8a..4e15afdec 100644 --- a/drivers/media/video/zoran_device.c +++ b/drivers/media/video/zoran_device.c @@ -4,7 +4,7 @@ * Media Labs LML33/LML33R10. * * This part handles device access (PCI/I2C/codec/...) - * + * * Copyright (C) 2000 Serguei Miridonov * * Currently maintained by: @@ -27,6 +27,7 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +#include #include #include #include @@ -491,7 +492,7 @@ zr36057_set_vfe (struct zoran *zr, /* (Ronald) don't write this if overlay_mask = NULL */ if (zr->overlay_mask) { /* Write overlay clipping mask data, but don't enable overlay clipping */ - /* RJ: since this makes only sense on the screen, we use + /* RJ: since this makes only sense on the screen, we use * zr->overlay_settings.width instead of video_width */ mask_line_size = (BUZ_MAX_WIDTH + 31) / 32; @@ -535,7 +536,7 @@ zr36057_overlay (struct zoran *zr, * All error messages are internal driver checking only! */ /* video display top and bottom registers */ - reg = (long) zr->buffer.base + + reg = (u32) zr->buffer.base + zr->overlay_settings.x * ((zr->overlay_settings.format->depth + 7) / 8) + zr->overlay_settings.y * @@ -818,12 +819,12 @@ zr36057_set_jpg (struct zoran *zr, if (zr->card.vfe_pol.hsync_pol) btor(ZR36057_VFEHCR_HSPol, ZR36057_VFEHCR); else - btand(~ZR36057_VFEHCR_HSPol, ZR36057_VFEHCR); + btand(~ZR36057_VFEHCR_HSPol, ZR36057_VFEHCR); reg = ((tvn->HSyncStart) << ZR36057_HSP_HsyncStart) | (tvn->Wt << ZR36057_HSP_LineTot); btwrite(reg, ZR36057_HSP); reg = ((zr->jpg_settings.img_x + - tvn->HStart + 4) << ZR36057_FHAP_NAX) | + tvn->HStart + 4) << ZR36057_FHAP_NAX) | (zr->jpg_settings.img_width << ZR36057_FHAP_PAX); btwrite(reg, ZR36057_FHAP); @@ -1271,15 +1272,15 @@ error_handler (struct zoran *zr, if (zr->JPEG_error != 1) { /* * First entry: error just happened during normal operation - * + * * In BUZ_MODE_MOTION_COMPRESS: - * + * * Possible glitch in TV signal. In this case we should * stop the codec and wait for good quality signal before * restarting it to avoid further problems - * + * * In BUZ_MODE_MOTION_DECOMPRESS: - * + * * Bad JPEG frame: we have to mark it as processed (codec crashed * and was not able to do it itself), and to remove it from queue. */ diff --git a/drivers/media/video/zoran_device.h b/drivers/media/video/zoran_device.h index f19705cbd..f315203d7 100644 --- a/drivers/media/video/zoran_device.h +++ b/drivers/media/video/zoran_device.h @@ -4,7 +4,7 @@ * Media Labs LML33/LML33R10. * * This part handles card-specific data and detection - * + * * Copyright (C) 2000 Serguei Miridonov * * Currently maintained by: diff --git a/drivers/media/video/zoran_driver.c b/drivers/media/video/zoran_driver.c index 5f90db278..485553be1 100644 --- a/drivers/media/video/zoran_driver.c +++ b/drivers/media/video/zoran_driver.c @@ -44,6 +44,7 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +#include #include #include #include @@ -72,7 +73,6 @@ ) #include -#include #include "videocodec.h" #include @@ -81,12 +81,11 @@ #include #include -#include #include "zoran.h" #include "zoran_device.h" #include "zoran_card.h" -#ifdef CONFIG_VIDEO_V4L2 +#ifdef HAVE_V4L2 /* we declare some card type definitions here, they mean * the same as the v4l1 ZORAN_VID_TYPE above, except it's v4l2 */ #define ZORAN_V4L2_VID_FLAGS ( \ @@ -94,7 +93,7 @@ V4L2_CAP_VIDEO_CAPTURE |\ V4L2_CAP_VIDEO_OUTPUT |\ V4L2_CAP_VIDEO_OVERLAY \ - ) + ) #endif #include @@ -103,7 +102,7 @@ const struct zoran_format zoran_formats[] = { { .name = "15-bit RGB", .palette = VIDEO_PALETTE_RGB555, -#ifdef CONFIG_VIDEO_V4L2 +#ifdef HAVE_V4L2 #ifdef __LITTLE_ENDIAN .fourcc = V4L2_PIX_FMT_RGB555, #else @@ -117,7 +116,7 @@ const struct zoran_format zoran_formats[] = { }, { .name = "16-bit RGB", .palette = VIDEO_PALETTE_RGB565, -#ifdef CONFIG_VIDEO_V4L2 +#ifdef HAVE_V4L2 #ifdef __LITTLE_ENDIAN .fourcc = V4L2_PIX_FMT_RGB565, #else @@ -131,7 +130,7 @@ const struct zoran_format zoran_formats[] = { }, { .name = "24-bit RGB", .palette = VIDEO_PALETTE_RGB24, -#ifdef CONFIG_VIDEO_V4L2 +#ifdef HAVE_V4L2 #ifdef __LITTLE_ENDIAN .fourcc = V4L2_PIX_FMT_BGR24, #else @@ -145,7 +144,7 @@ const struct zoran_format zoran_formats[] = { }, { .name = "32-bit RGB", .palette = VIDEO_PALETTE_RGB32, -#ifdef CONFIG_VIDEO_V4L2 +#ifdef HAVE_V4L2 #ifdef __LITTLE_ENDIAN .fourcc = V4L2_PIX_FMT_BGR32, #else @@ -159,17 +158,17 @@ const struct zoran_format zoran_formats[] = { }, { .name = "4:2:2, packed, YUYV", .palette = VIDEO_PALETTE_YUV422, -#ifdef CONFIG_VIDEO_V4L2 +#ifdef HAVE_V4L2 .fourcc = V4L2_PIX_FMT_YUYV, .colorspace = V4L2_COLORSPACE_SMPTE170M, #endif .depth = 16, .flags = ZORAN_FORMAT_CAPTURE | - ZORAN_FORMAT_OVERLAY, + ZORAN_FORMAT_OVERLAY, }, { .name = "Hardware-encoded Motion-JPEG", .palette = -1, -#ifdef CONFIG_VIDEO_V4L2 +#ifdef HAVE_V4L2 .fourcc = V4L2_PIX_FMT_MJPEG, .colorspace = V4L2_COLORSPACE_SMPTE170M, #endif @@ -210,7 +209,7 @@ static int lock_norm = 0; /* 1=Don't change TV standard (norm) */ module_param(lock_norm, int, 0); MODULE_PARM_DESC(lock_norm, "Users can't change norm"); -#ifdef CONFIG_VIDEO_V4L2 +#ifdef HAVE_V4L2 /* small helper function for calculating buffersizes for v4l2 * we calculate the nearest higher power-of-two, which * will be the recommended buffersize */ @@ -670,7 +669,7 @@ jpg_fbuffer_free (struct file *file) j])))); free_page((unsigned long) bus_to_virt - (le32_to_cpu + (le32_to_cpu (fh->jpg_buffers. buffer[i]. frag_tab[2 * j]))); @@ -1293,7 +1292,7 @@ zoran_open (struct inode *inode, /* see fs/device.c - the kernel already locks during open(), * so locking ourselves only causes deadlocks */ - /*mutex_lock(&zr->resource_lock);*/ + /*down(&zr->resource_lock);*/ if (!zr->decoder) { dprintk(1, @@ -1372,7 +1371,7 @@ zoran_open (struct inode *inode, if (zr->user++ == 0) first_open = 1; - /*mutex_unlock(&zr->resource_lock);*/ + /*up(&zr->resource_lock);*/ /* default setup - TODO: look at flags */ if (first_open) { /* First device open */ @@ -1402,7 +1401,7 @@ open_unlock_and_return: /* if there's no device found, we didn't obtain the lock either */ if (zr) { - /*mutex_unlock(&zr->resource_lock);*/ + /*up(&zr->resource_lock);*/ } return res; @@ -1420,7 +1419,7 @@ zoran_close (struct inode *inode, /* kernel locks (fs/device.c), so don't do that ourselves * (prevents deadlocks) */ - /*mutex_lock(&zr->resource_lock);*/ + /*down(&zr->resource_lock);*/ zoran_close_end_session(file); @@ -1467,7 +1466,7 @@ zoran_close (struct inode *inode, } module_put(THIS_MODULE); - /*mutex_unlock(&zr->resource_lock);*/ + /*up(&zr->resource_lock);*/ dprintk(4, KERN_INFO "%s: zoran_close() done\n", ZR_DEVNAME(zr)); @@ -1761,7 +1760,7 @@ setup_overlay (struct file *file, return wait_grab_pending(zr); } -#ifdef CONFIG_VIDEO_V4L2 +#ifdef HAVE_V4L2 /* get the status of a buffer in the clients buffer queue */ static int zoran_v4l2_buffer_status (struct file *file, @@ -1871,7 +1870,7 @@ zoran_v4l2_buffer_status (struct file *file, static int zoran_set_norm (struct zoran *zr, - int norm) /* VIDEO_MODE_* */ + int norm) /* VIDEO_MODE_* */ { int norm_encoder, on; @@ -2006,9 +2005,9 @@ zoran_set_input (struct zoran *zr, static int zoran_do_ioctl (struct inode *inode, - struct file *file, - unsigned int cmd, - void *arg) + struct file *file, + unsigned int cmd, + void *arg) { struct zoran_fh *fh = file->private_data; struct zoran *zr = fh->zr; @@ -2028,14 +2027,14 @@ zoran_do_ioctl (struct inode *inode, * but moving the free code outside the munmap() handler fixes * all this... If someone knows why, please explain me (Ronald) */ - if (!!mutex_trylock(&zr->resource_lock)) { + if (!down_trylock(&zr->resource_lock)) { /* we obtained it! Let's try to free some things */ if (fh->jpg_buffers.ready_to_be_freed) jpg_fbuffer_free(file); if (fh->v4l_buffers.ready_to_be_freed) v4l_fbuffer_free(file); - mutex_unlock(&zr->resource_lock); + up(&zr->resource_lock); } switch (cmd) { @@ -2047,17 +2046,17 @@ zoran_do_ioctl (struct inode *inode, dprintk(3, KERN_DEBUG "%s: VIDIOCGCAP\n", ZR_DEVNAME(zr)); memset(vcap, 0, sizeof(struct video_capability)); - strncpy(vcap->name, ZR_DEVNAME(zr), sizeof(vcap->name)-1); + strncpy(vcap->name, ZR_DEVNAME(zr), sizeof(vcap->name)); vcap->type = ZORAN_VID_TYPE; vcap->channels = zr->card.inputs; vcap->audios = 0; - mutex_lock(&zr->resource_lock); + down(&zr->resource_lock); vcap->maxwidth = BUZ_MAX_WIDTH; vcap->maxheight = BUZ_MAX_HEIGHT; vcap->minwidth = BUZ_MIN_WIDTH; vcap->minheight = BUZ_MIN_HEIGHT; - mutex_unlock(&zr->resource_lock); + up(&zr->resource_lock); return 0; } @@ -2085,9 +2084,9 @@ zoran_do_ioctl (struct inode *inode, vchan->tuners = 0; vchan->flags = 0; vchan->type = VIDEO_TYPE_CAMERA; - mutex_lock(&zr->resource_lock); + down(&zr->resource_lock); vchan->norm = zr->norm; - mutex_unlock(&zr->resource_lock); + up(&zr->resource_lock); vchan->channel = channel; return 0; @@ -2095,7 +2094,7 @@ zoran_do_ioctl (struct inode *inode, break; /* RJ: the documentation at http://roadrunner.swansea.linux.org.uk/v4lapi.shtml says: - * + * * * "The VIDIOCSCHAN ioctl takes an integer argument and switches the capture to this input." * * ^^^^^^^ * * The famos BTTV driver has it implemented with a struct video_channel argument @@ -2114,7 +2113,7 @@ zoran_do_ioctl (struct inode *inode, "%s: VIDIOCSCHAN - channel=%d, norm=%d\n", ZR_DEVNAME(zr), vchan->channel, vchan->norm); - mutex_lock(&zr->resource_lock); + down(&zr->resource_lock); if ((res = zoran_set_input(zr, vchan->channel))) goto schan_unlock_and_return; if ((res = zoran_set_norm(zr, vchan->norm))) @@ -2123,7 +2122,7 @@ zoran_do_ioctl (struct inode *inode, /* Make sure the changes come into effect */ res = wait_grab_pending(zr); schan_unlock_and_return: - mutex_unlock(&zr->resource_lock); + up(&zr->resource_lock); return res; } break; @@ -2135,7 +2134,7 @@ zoran_do_ioctl (struct inode *inode, dprintk(3, KERN_DEBUG "%s: VIDIOCGPICT\n", ZR_DEVNAME(zr)); memset(vpict, 0, sizeof(struct video_picture)); - mutex_lock(&zr->resource_lock); + down(&zr->resource_lock); vpict->hue = zr->hue; vpict->brightness = zr->brightness; vpict->contrast = zr->contrast; @@ -2146,7 +2145,7 @@ zoran_do_ioctl (struct inode *inode, } else { vpict->depth = 0; } - mutex_unlock(&zr->resource_lock); + up(&zr->resource_lock); return 0; } @@ -2181,7 +2180,7 @@ zoran_do_ioctl (struct inode *inode, return -EINVAL; } - mutex_lock(&zr->resource_lock); + down(&zr->resource_lock); decoder_command(zr, DECODER_SET_PICTURE, vpict); @@ -2192,7 +2191,7 @@ zoran_do_ioctl (struct inode *inode, fh->overlay_settings.format = &zoran_formats[i]; - mutex_unlock(&zr->resource_lock); + up(&zr->resource_lock); return 0; } @@ -2205,9 +2204,9 @@ zoran_do_ioctl (struct inode *inode, dprintk(3, KERN_DEBUG "%s: VIDIOCCAPTURE - on=%d\n", ZR_DEVNAME(zr), *on); - mutex_lock(&zr->resource_lock); + down(&zr->resource_lock); res = setup_overlay(file, *on); - mutex_unlock(&zr->resource_lock); + up(&zr->resource_lock); return res; } @@ -2220,12 +2219,12 @@ zoran_do_ioctl (struct inode *inode, dprintk(3, KERN_DEBUG "%s: VIDIOCGWIN\n", ZR_DEVNAME(zr)); memset(vwin, 0, sizeof(struct video_window)); - mutex_lock(&zr->resource_lock); + down(&zr->resource_lock); vwin->x = fh->overlay_settings.x; vwin->y = fh->overlay_settings.y; vwin->width = fh->overlay_settings.width; vwin->height = fh->overlay_settings.height; - mutex_unlock(&zr->resource_lock); + up(&zr->resource_lock); vwin->clipcount = 0; return 0; } @@ -2242,12 +2241,12 @@ zoran_do_ioctl (struct inode *inode, ZR_DEVNAME(zr), vwin->x, vwin->y, vwin->width, vwin->height, vwin->clipcount); - mutex_lock(&zr->resource_lock); + down(&zr->resource_lock); res = setup_window(file, vwin->x, vwin->y, vwin->width, vwin->height, vwin->clips, vwin->clipcount, NULL); - mutex_unlock(&zr->resource_lock); + up(&zr->resource_lock); return res; } @@ -2259,9 +2258,9 @@ zoran_do_ioctl (struct inode *inode, dprintk(3, KERN_DEBUG "%s: VIDIOCGFBUF\n", ZR_DEVNAME(zr)); - mutex_lock(&zr->resource_lock); + down(&zr->resource_lock); *vbuf = zr->buffer; - mutex_unlock(&zr->resource_lock); + up(&zr->resource_lock); return 0; } break; @@ -2288,12 +2287,12 @@ zoran_do_ioctl (struct inode *inode, return -EINVAL; } - mutex_lock(&zr->resource_lock); + down(&zr->resource_lock); res = setup_fbuffer(file, vbuf->base, &zoran_formats[i], vbuf->width, vbuf->height, vbuf->bytesperline); - mutex_unlock(&zr->resource_lock); + up(&zr->resource_lock); return res; } @@ -2306,9 +2305,9 @@ zoran_do_ioctl (struct inode *inode, dprintk(3, KERN_DEBUG "%s: VIDIOCSYNC - frame=%d\n", ZR_DEVNAME(zr), *frame); - mutex_lock(&zr->resource_lock); + down(&zr->resource_lock); res = v4l_sync(file, *frame); - mutex_unlock(&zr->resource_lock); + up(&zr->resource_lock); if (!res) zr->v4l_sync_tail++; return res; @@ -2326,9 +2325,9 @@ zoran_do_ioctl (struct inode *inode, ZR_DEVNAME(zr), vmap->frame, vmap->width, vmap->height, vmap->format); - mutex_lock(&zr->resource_lock); + down(&zr->resource_lock); res = v4l_grab(file, vmap); - mutex_unlock(&zr->resource_lock); + up(&zr->resource_lock); return res; } break; @@ -2349,7 +2348,7 @@ zoran_do_ioctl (struct inode *inode, i * fh->v4l_buffers.buffer_size; } - mutex_lock(&zr->resource_lock); + down(&zr->resource_lock); if (fh->jpg_buffers.allocated || fh->v4l_buffers.allocated) { dprintk(1, @@ -2368,7 +2367,7 @@ zoran_do_ioctl (struct inode *inode, /* The next mmap will map the V4L buffers */ fh->map_mode = ZORAN_MAP_MODE_RAW; v4l1reqbuf_unlock_and_return: - mutex_unlock(&zr->resource_lock); + up(&zr->resource_lock); return res; } @@ -2422,7 +2421,7 @@ zoran_do_ioctl (struct inode *inode, bparams->major_version = MAJOR_VERSION; bparams->minor_version = MINOR_VERSION; - mutex_lock(&zr->resource_lock); + down(&zr->resource_lock); bparams->norm = zr->norm; bparams->input = zr->input; @@ -2451,7 +2450,7 @@ zoran_do_ioctl (struct inode *inode, bparams->jpeg_markers = fh->jpg_settings.jpg_comp.jpeg_markers; - mutex_unlock(&zr->resource_lock); + up(&zr->resource_lock); bparams->VFIFO_FB = 0; @@ -2487,7 +2486,7 @@ zoran_do_ioctl (struct inode *inode, sizeof(bparams->COM_data)); settings.jpg_comp.jpeg_markers = bparams->jpeg_markers; - mutex_lock(&zr->resource_lock); + down(&zr->resource_lock); if (zr->codec_mode != BUZ_MODE_IDLE) { dprintk(1, @@ -2507,7 +2506,7 @@ zoran_do_ioctl (struct inode *inode, fh->jpg_settings = settings; sparams_unlock_and_return: - mutex_unlock(&zr->resource_lock); + up(&zr->resource_lock); return res; } @@ -2539,7 +2538,7 @@ zoran_do_ioctl (struct inode *inode, breq->size > MAX_KMALLOC_MEM) breq->size = MAX_KMALLOC_MEM; - mutex_lock(&zr->resource_lock); + down(&zr->resource_lock); if (fh->jpg_buffers.allocated || fh->v4l_buffers.allocated) { dprintk(1, @@ -2562,7 +2561,7 @@ zoran_do_ioctl (struct inode *inode, * also be *_PLAY, but it doesn't matter here */ fh->map_mode = ZORAN_MAP_MODE_JPG_REC; jpgreqbuf_unlock_and_return: - mutex_unlock(&zr->resource_lock); + up(&zr->resource_lock); return res; } @@ -2575,9 +2574,9 @@ zoran_do_ioctl (struct inode *inode, dprintk(3, KERN_DEBUG "%s: BUZIOC_QBUF_CAPT - frame=%d\n", ZR_DEVNAME(zr), *frame); - mutex_lock(&zr->resource_lock); + down(&zr->resource_lock); res = jpg_qbuf(file, *frame, BUZ_MODE_MOTION_COMPRESS); - mutex_unlock(&zr->resource_lock); + up(&zr->resource_lock); return res; } @@ -2590,9 +2589,9 @@ zoran_do_ioctl (struct inode *inode, dprintk(3, KERN_DEBUG "%s: BUZIOC_QBUF_PLAY - frame=%d\n", ZR_DEVNAME(zr), *frame); - mutex_lock(&zr->resource_lock); + down(&zr->resource_lock); res = jpg_qbuf(file, *frame, BUZ_MODE_MOTION_DECOMPRESS); - mutex_unlock(&zr->resource_lock); + up(&zr->resource_lock); return res; } @@ -2605,9 +2604,9 @@ zoran_do_ioctl (struct inode *inode, dprintk(3, KERN_DEBUG "%s: BUZIOC_SYNC\n", ZR_DEVNAME(zr)); - mutex_lock(&zr->resource_lock); + down(&zr->resource_lock); res = jpg_sync(file, bsync); - mutex_unlock(&zr->resource_lock); + up(&zr->resource_lock); return res; } @@ -2631,7 +2630,7 @@ zoran_do_ioctl (struct inode *inode, input = zr->card.input[bstat->input].muxsel; norm = VIDEO_MODE_AUTO; - mutex_lock(&zr->resource_lock); + down(&zr->resource_lock); if (zr->codec_mode != BUZ_MODE_IDLE) { dprintk(1, @@ -2656,7 +2655,7 @@ zoran_do_ioctl (struct inode *inode, decoder_command(zr, DECODER_SET_INPUT, &input); decoder_command(zr, DECODER_SET_NORM, &zr->norm); gstat_unlock_and_return: - mutex_unlock(&zr->resource_lock); + up(&zr->resource_lock); if (!res) { bstat->signal = @@ -2676,7 +2675,7 @@ zoran_do_ioctl (struct inode *inode, } break; -#ifdef CONFIG_VIDEO_V4L2 +#ifdef HAVE_V4L2 /* The new video4linux2 capture interface - much nicer than video4linux1, since * it allows for integrating the JPEG capturing calls inside standard v4l2 @@ -2689,8 +2688,8 @@ zoran_do_ioctl (struct inode *inode, dprintk(3, KERN_DEBUG "%s: VIDIOC_QUERYCAP\n", ZR_DEVNAME(zr)); memset(cap, 0, sizeof(*cap)); - strncpy(cap->card, ZR_DEVNAME(zr), sizeof(cap->card)-1); - strncpy(cap->driver, "zoran", sizeof(cap->driver)-1); + strncpy(cap->card, ZR_DEVNAME(zr), sizeof(cap->card)); + strncpy(cap->driver, "zoran", sizeof(cap->driver)); snprintf(cap->bus_info, sizeof(cap->bus_info), "PCI:%s", pci_name(zr->pci_dev)); cap->version = @@ -2742,7 +2741,7 @@ zoran_do_ioctl (struct inode *inode, memset(fmt, 0, sizeof(*fmt)); fmt->index = index; fmt->type = type; - strncpy(fmt->description, zoran_formats[i].name, sizeof(fmt->description)-1); + strncpy(fmt->description, zoran_formats[i].name, 31); fmt->pixelformat = zoran_formats[i].fourcc; if (zoran_formats[i].flags & ZORAN_FORMAT_COMPRESSED) fmt->flags |= V4L2_FMT_FLAG_COMPRESSED; @@ -2764,7 +2763,7 @@ zoran_do_ioctl (struct inode *inode, switch (fmt->type) { case V4L2_BUF_TYPE_VIDEO_OVERLAY: - mutex_lock(&zr->resource_lock); + down(&zr->resource_lock); fmt->fmt.win.w.left = fh->overlay_settings.x; fmt->fmt.win.w.top = fh->overlay_settings.y; @@ -2777,14 +2776,14 @@ zoran_do_ioctl (struct inode *inode, else fmt->fmt.win.field = V4L2_FIELD_TOP; - mutex_unlock(&zr->resource_lock); + up(&zr->resource_lock); break; case V4L2_BUF_TYPE_VIDEO_CAPTURE: case V4L2_BUF_TYPE_VIDEO_OUTPUT: - mutex_lock(&zr->resource_lock); + down(&zr->resource_lock); if (fmt->type == V4L2_BUF_TYPE_VIDEO_CAPTURE && fh->map_mode == ZORAN_MAP_MODE_RAW) { @@ -2838,7 +2837,7 @@ zoran_do_ioctl (struct inode *inode, V4L2_COLORSPACE_SMPTE170M; } - mutex_unlock(&zr->resource_lock); + up(&zr->resource_lock); break; @@ -2871,7 +2870,7 @@ zoran_do_ioctl (struct inode *inode, fmt->fmt.win.w.height, fmt->fmt.win.clipcount, fmt->fmt.win.bitmap); - mutex_lock(&zr->resource_lock); + down(&zr->resource_lock); res = setup_window(file, fmt->fmt.win.w.left, fmt->fmt.win.w.top, @@ -2881,7 +2880,7 @@ zoran_do_ioctl (struct inode *inode, fmt->fmt.win.clips, fmt->fmt.win.clipcount, fmt->fmt.win.bitmap); - mutex_unlock(&zr->resource_lock); + up(&zr->resource_lock); return res; break; @@ -2918,7 +2917,7 @@ zoran_do_ioctl (struct inode *inode, } if (fmt->fmt.pix.pixelformat == V4L2_PIX_FMT_MJPEG) { - mutex_lock(&zr->resource_lock); + down(&zr->resource_lock); settings = fh->jpg_settings; @@ -2996,7 +2995,7 @@ zoran_do_ioctl (struct inode *inode, ZORAN_MAP_MODE_JPG_REC : ZORAN_MAP_MODE_JPG_PLAY; sfmtjpg_unlock_and_return: - mutex_unlock(&zr->resource_lock); + up(&zr->resource_lock); } else { for (i = 0; i < zoran_num_formats; i++) if (fmt->fmt.pix.pixelformat == @@ -3011,7 +3010,7 @@ zoran_do_ioctl (struct inode *inode, (char *) &printformat); return -EINVAL; } - mutex_lock(&zr->resource_lock); + down(&zr->resource_lock); if (fh->jpg_buffers.allocated || (fh->v4l_buffers.allocated && fh->v4l_buffers.active != @@ -3053,7 +3052,7 @@ zoran_do_ioctl (struct inode *inode, fh->map_mode = ZORAN_MAP_MODE_RAW; sfmtv4l_unlock_and_return: - mutex_unlock(&zr->resource_lock); + up(&zr->resource_lock); } break; @@ -3078,7 +3077,7 @@ zoran_do_ioctl (struct inode *inode, dprintk(3, KERN_DEBUG "%s: VIDIOC_G_FBUF\n", ZR_DEVNAME(zr)); memset(fb, 0, sizeof(*fb)); - mutex_lock(&zr->resource_lock); + down(&zr->resource_lock); fb->base = zr->buffer.base; fb->fmt.width = zr->buffer.width; fb->fmt.height = zr->buffer.height; @@ -3087,7 +3086,7 @@ zoran_do_ioctl (struct inode *inode, fh->overlay_settings.format->fourcc; } fb->fmt.bytesperline = zr->buffer.bytesperline; - mutex_unlock(&zr->resource_lock); + up(&zr->resource_lock); fb->fmt.colorspace = V4L2_COLORSPACE_SRGB; fb->fmt.field = V4L2_FIELD_INTERLACED; fb->flags = V4L2_FBUF_FLAG_OVERLAY; @@ -3122,12 +3121,12 @@ zoran_do_ioctl (struct inode *inode, return -EINVAL; } - mutex_lock(&zr->resource_lock); + down(&zr->resource_lock); res = setup_fbuffer(file, fb->base, &zoran_formats[i], fb->fmt.width, fb->fmt.height, fb->fmt.bytesperline); - mutex_unlock(&zr->resource_lock); + up(&zr->resource_lock); return res; } @@ -3140,9 +3139,9 @@ zoran_do_ioctl (struct inode *inode, dprintk(3, KERN_DEBUG "%s: VIDIOC_PREVIEW - on=%d\n", ZR_DEVNAME(zr), *on); - mutex_lock(&zr->resource_lock); + down(&zr->resource_lock); res = setup_overlay(file, *on); - mutex_unlock(&zr->resource_lock); + up(&zr->resource_lock); return res; } @@ -3164,7 +3163,7 @@ zoran_do_ioctl (struct inode *inode, return -EINVAL; } - mutex_lock(&zr->resource_lock); + down(&zr->resource_lock); if (fh->v4l_buffers.allocated || fh->jpg_buffers.allocated) { dprintk(1, @@ -3225,7 +3224,7 @@ zoran_do_ioctl (struct inode *inode, goto v4l2reqbuf_unlock_and_return; } v4l2reqbuf_unlock_and_return: - mutex_unlock(&zr->resource_lock); + up(&zr->resource_lock); return 0; } @@ -3246,9 +3245,9 @@ zoran_do_ioctl (struct inode *inode, buf->type = type; buf->index = index; - mutex_lock(&zr->resource_lock); + down(&zr->resource_lock); res = zoran_v4l2_buffer_status(file, buf, buf->index); - mutex_unlock(&zr->resource_lock); + up(&zr->resource_lock); return res; } @@ -3263,7 +3262,7 @@ zoran_do_ioctl (struct inode *inode, KERN_DEBUG "%s: VIDIOC_QBUF - type=%d, index=%d\n", ZR_DEVNAME(zr), buf->type, buf->index); - mutex_lock(&zr->resource_lock); + down(&zr->resource_lock); switch (fh->map_mode) { case ZORAN_MAP_MODE_RAW: @@ -3323,7 +3322,7 @@ zoran_do_ioctl (struct inode *inode, goto qbuf_unlock_and_return; } qbuf_unlock_and_return: - mutex_unlock(&zr->resource_lock); + up(&zr->resource_lock); return res; } @@ -3337,7 +3336,7 @@ zoran_do_ioctl (struct inode *inode, dprintk(3, KERN_DEBUG "%s: VIDIOC_DQBUF - type=%d\n", ZR_DEVNAME(zr), buf->type); - mutex_lock(&zr->resource_lock); + down(&zr->resource_lock); switch (fh->map_mode) { case ZORAN_MAP_MODE_RAW: @@ -3411,7 +3410,7 @@ zoran_do_ioctl (struct inode *inode, goto dqbuf_unlock_and_return; } dqbuf_unlock_and_return: - mutex_unlock(&zr->resource_lock); + up(&zr->resource_lock); return res; } @@ -3423,7 +3422,7 @@ zoran_do_ioctl (struct inode *inode, dprintk(3, KERN_DEBUG "%s: VIDIOC_STREAMON\n", ZR_DEVNAME(zr)); - mutex_lock(&zr->resource_lock); + down(&zr->resource_lock); switch (fh->map_mode) { case ZORAN_MAP_MODE_RAW: /* raw capture */ @@ -3471,7 +3470,7 @@ zoran_do_ioctl (struct inode *inode, goto strmon_unlock_and_return; } strmon_unlock_and_return: - mutex_unlock(&zr->resource_lock); + up(&zr->resource_lock); return res; } @@ -3483,7 +3482,7 @@ zoran_do_ioctl (struct inode *inode, dprintk(3, KERN_DEBUG "%s: VIDIOC_STREAMOFF\n", ZR_DEVNAME(zr)); - mutex_lock(&zr->resource_lock); + down(&zr->resource_lock); switch (fh->map_mode) { case ZORAN_MAP_MODE_RAW: /* raw capture */ @@ -3541,7 +3540,7 @@ zoran_do_ioctl (struct inode *inode, goto strmoff_unlock_and_return; } strmoff_unlock_and_return: - mutex_unlock(&zr->resource_lock); + up(&zr->resource_lock); return res; } @@ -3566,16 +3565,16 @@ zoran_do_ioctl (struct inode *inode, switch (ctrl->id) { case V4L2_CID_BRIGHTNESS: - strncpy(ctrl->name, "Brightness", sizeof(ctrl->name)-1); + strncpy(ctrl->name, "Brightness", 31); break; case V4L2_CID_CONTRAST: - strncpy(ctrl->name, "Contrast", sizeof(ctrl->name)-1); + strncpy(ctrl->name, "Contrast", 31); break; case V4L2_CID_SATURATION: - strncpy(ctrl->name, "Saturation", sizeof(ctrl->name)-1); + strncpy(ctrl->name, "Saturation", 31); break; case V4L2_CID_HUE: - strncpy(ctrl->name, "Hue", sizeof(ctrl->name)-1); + strncpy(ctrl->name, "Hue", 31); break; } @@ -3601,7 +3600,7 @@ zoran_do_ioctl (struct inode *inode, ctrl->id > V4L2_CID_HUE) return -EINVAL; - mutex_lock(&zr->resource_lock); + down(&zr->resource_lock); switch (ctrl->id) { case V4L2_CID_BRIGHTNESS: ctrl->value = zr->brightness; @@ -3616,7 +3615,7 @@ zoran_do_ioctl (struct inode *inode, ctrl->value = zr->hue; break; } - mutex_unlock(&zr->resource_lock); + up(&zr->resource_lock); return 0; } @@ -3643,7 +3642,7 @@ zoran_do_ioctl (struct inode *inode, return -EINVAL; } - mutex_lock(&zr->resource_lock); + down(&zr->resource_lock); switch (ctrl->id) { case V4L2_CID_BRIGHTNESS: zr->brightness = ctrl->value; @@ -3665,7 +3664,7 @@ zoran_do_ioctl (struct inode *inode, decoder_command(zr, DECODER_SET_PICTURE, &pict); - mutex_unlock(&zr->resource_lock); + up(&zr->resource_lock); return 0; } @@ -3693,7 +3692,7 @@ zoran_do_ioctl (struct inode *inode, &caps); if (caps.flags & VIDEO_DECODER_AUTO) { std->id = V4L2_STD_ALL; - strncpy(std->name, "Autodetect", sizeof(std->name)-1); + strncpy(std->name, "Autodetect", 31); return 0; } else return -EINVAL; @@ -3701,21 +3700,21 @@ zoran_do_ioctl (struct inode *inode, switch (std->index) { case 0: std->id = V4L2_STD_PAL; - strncpy(std->name, "PAL", sizeof(std->name)-1); + strncpy(std->name, "PAL", 31); std->frameperiod.numerator = 1; std->frameperiod.denominator = 25; std->framelines = zr->card.tvn[0]->Ht; break; case 1: std->id = V4L2_STD_NTSC; - strncpy(std->name, "NTSC", sizeof(std->name)-1); + strncpy(std->name, "NTSC", 31); std->frameperiod.numerator = 1001; std->frameperiod.denominator = 30000; std->framelines = zr->card.tvn[1]->Ht; break; case 2: std->id = V4L2_STD_SECAM; - strncpy(std->name, "SECAM", sizeof(std->name)-1); + strncpy(std->name, "SECAM", 31); std->frameperiod.numerator = 1; std->frameperiod.denominator = 25; std->framelines = zr->card.tvn[2]->Ht; @@ -3733,9 +3732,9 @@ zoran_do_ioctl (struct inode *inode, dprintk(3, KERN_DEBUG "%s: VIDIOC_G_STD\n", ZR_DEVNAME(zr)); - mutex_lock(&zr->resource_lock); + down(&zr->resource_lock); norm = zr->norm; - mutex_unlock(&zr->resource_lock); + up(&zr->resource_lock); switch (norm) { case VIDEO_MODE_PAL: @@ -3777,13 +3776,13 @@ zoran_do_ioctl (struct inode *inode, return -EINVAL; } - mutex_lock(&zr->resource_lock); + down(&zr->resource_lock); if ((res = zoran_set_norm(zr, norm))) goto sstd_unlock_and_return; res = wait_grab_pending(zr); sstd_unlock_and_return: - mutex_unlock(&zr->resource_lock); + up(&zr->resource_lock); return res; } break; @@ -3810,9 +3809,9 @@ zoran_do_ioctl (struct inode *inode, inp->std = V4L2_STD_ALL; /* Get status of video decoder */ - mutex_lock(&zr->resource_lock); + down(&zr->resource_lock); decoder_command(zr, DECODER_GET_STATUS, &status); - mutex_unlock(&zr->resource_lock); + up(&zr->resource_lock); if (!(status & DECODER_STATUS_GOOD)) { inp->status |= V4L2_IN_ST_NO_POWER; @@ -3831,9 +3830,9 @@ zoran_do_ioctl (struct inode *inode, dprintk(3, KERN_DEBUG "%s: VIDIOC_G_INPUT\n", ZR_DEVNAME(zr)); - mutex_lock(&zr->resource_lock); + down(&zr->resource_lock); *input = zr->input; - mutex_unlock(&zr->resource_lock); + up(&zr->resource_lock); return 0; } @@ -3846,14 +3845,14 @@ zoran_do_ioctl (struct inode *inode, dprintk(3, KERN_DEBUG "%s: VIDIOC_S_INPUT - input=%d\n", ZR_DEVNAME(zr), *input); - mutex_lock(&zr->resource_lock); + down(&zr->resource_lock); if ((res = zoran_set_input(zr, *input))) goto sinput_unlock_and_return; /* Make sure the changes come into effect */ res = wait_grab_pending(zr); sinput_unlock_and_return: - mutex_unlock(&zr->resource_lock); + up(&zr->resource_lock); return res; } break; @@ -3871,7 +3870,7 @@ zoran_do_ioctl (struct inode *inode, memset(outp, 0, sizeof(*outp)); outp->index = 0; outp->type = V4L2_OUTPUT_TYPE_ANALOGVGAOVERLAY; - strncpy(outp->name, "Autodetect", sizeof(outp->name)-1); + strncpy(outp->name, "Autodetect", 31); return 0; } @@ -3915,7 +3914,7 @@ zoran_do_ioctl (struct inode *inode, memset(cropcap, 0, sizeof(*cropcap)); cropcap->type = type; - mutex_lock(&zr->resource_lock); + down(&zr->resource_lock); if (cropcap->type != V4L2_BUF_TYPE_VIDEO_OUTPUT && (cropcap->type != V4L2_BUF_TYPE_VIDEO_CAPTURE || @@ -3935,7 +3934,7 @@ zoran_do_ioctl (struct inode *inode, cropcap->defrect.width = BUZ_MIN_WIDTH; cropcap->defrect.height = BUZ_MIN_HEIGHT; cropcap_unlock_and_return: - mutex_unlock(&zr->resource_lock); + up(&zr->resource_lock); return res; } break; @@ -3951,7 +3950,7 @@ zoran_do_ioctl (struct inode *inode, memset(crop, 0, sizeof(*crop)); crop->type = type; - mutex_lock(&zr->resource_lock); + down(&zr->resource_lock); if (crop->type != V4L2_BUF_TYPE_VIDEO_OUTPUT && (crop->type != V4L2_BUF_TYPE_VIDEO_CAPTURE || @@ -3970,7 +3969,7 @@ zoran_do_ioctl (struct inode *inode, crop->c.height = fh->jpg_settings.img_height; gcrop_unlock_and_return: - mutex_unlock(&zr->resource_lock); + up(&zr->resource_lock); return res; } @@ -3989,7 +3988,7 @@ zoran_do_ioctl (struct inode *inode, ZR_DEVNAME(zr), crop->type, crop->c.left, crop->c.top, crop->c.width, crop->c.height); - mutex_lock(&zr->resource_lock); + down(&zr->resource_lock); if (fh->jpg_buffers.allocated || fh->v4l_buffers.allocated) { dprintk(1, @@ -4025,7 +4024,7 @@ zoran_do_ioctl (struct inode *inode, fh->jpg_settings = settings; scrop_unlock_and_return: - mutex_unlock(&zr->resource_lock); + up(&zr->resource_lock); return res; } break; @@ -4039,7 +4038,7 @@ zoran_do_ioctl (struct inode *inode, memset(params, 0, sizeof(*params)); - mutex_lock(&zr->resource_lock); + down(&zr->resource_lock); params->quality = fh->jpg_settings.jpg_comp.quality; params->APPn = fh->jpg_settings.jpg_comp.APPn; @@ -4054,7 +4053,7 @@ zoran_do_ioctl (struct inode *inode, params->jpeg_markers = fh->jpg_settings.jpg_comp.jpeg_markers; - mutex_unlock(&zr->resource_lock); + up(&zr->resource_lock); return 0; } @@ -4075,7 +4074,7 @@ zoran_do_ioctl (struct inode *inode, settings.jpg_comp = *params; - mutex_lock(&zr->resource_lock); + down(&zr->resource_lock); if (fh->v4l_buffers.active != ZORAN_FREE || fh->jpg_buffers.active != ZORAN_FREE) { @@ -4094,7 +4093,7 @@ zoran_do_ioctl (struct inode *inode, zoran_v4l2_calc_bufsize(&fh->jpg_settings); fh->jpg_settings.jpg_comp = *params = settings.jpg_comp; sjpegc_unlock_and_return: - mutex_unlock(&zr->resource_lock); + up(&zr->resource_lock); return 0; } @@ -4128,7 +4127,7 @@ zoran_do_ioctl (struct inode *inode, switch (fmt->type) { case V4L2_BUF_TYPE_VIDEO_OVERLAY: - mutex_lock(&zr->resource_lock); + down(&zr->resource_lock); if (fmt->fmt.win.w.width > BUZ_MAX_WIDTH) fmt->fmt.win.w.width = BUZ_MAX_WIDTH; @@ -4139,7 +4138,7 @@ zoran_do_ioctl (struct inode *inode, if (fmt->fmt.win.w.height < BUZ_MIN_HEIGHT) fmt->fmt.win.w.height = BUZ_MIN_HEIGHT; - mutex_unlock(&zr->resource_lock); + up(&zr->resource_lock); break; case V4L2_BUF_TYPE_VIDEO_CAPTURE: @@ -4147,7 +4146,7 @@ zoran_do_ioctl (struct inode *inode, if (fmt->fmt.pix.bytesperline > 0) return -EINVAL; - mutex_lock(&zr->resource_lock); + down(&zr->resource_lock); if (fmt->fmt.pix.pixelformat == V4L2_PIX_FMT_MJPEG) { settings = fh->jpg_settings; @@ -4230,7 +4229,7 @@ zoran_do_ioctl (struct inode *inode, goto tryfmt_unlock_and_return; } tryfmt_unlock_and_return: - mutex_unlock(&zr->resource_lock); + up(&zr->resource_lock); return res; break; @@ -4281,7 +4280,7 @@ zoran_poll (struct file *file, * if no buffers queued or so, return POLLNVAL */ - mutex_lock(&zr->resource_lock); + down(&zr->resource_lock); switch (fh->map_mode) { case ZORAN_MAP_MODE_RAW: @@ -4330,7 +4329,7 @@ zoran_poll (struct file *file, } poll_unlock_and_return: - mutex_unlock(&zr->resource_lock); + up(&zr->resource_lock); return res; } @@ -4386,7 +4385,7 @@ zoran_vm_close (struct vm_area_struct *vma) if (fh->jpg_buffers.buffer[i].map) break; if (i == fh->jpg_buffers.num_buffers) { - mutex_lock(&zr->resource_lock); + down(&zr->resource_lock); if (fh->jpg_buffers.active != ZORAN_FREE) { jpg_qbuf(file, -1, zr->codec_mode); @@ -4399,7 +4398,7 @@ zoran_vm_close (struct vm_area_struct *vma) fh->jpg_buffers.allocated = 0; fh->jpg_buffers.ready_to_be_freed = 1; - mutex_unlock(&zr->resource_lock); + up(&zr->resource_lock); } break; @@ -4422,7 +4421,7 @@ zoran_vm_close (struct vm_area_struct *vma) if (fh->v4l_buffers.buffer[i].map) break; if (i == fh->v4l_buffers.num_buffers) { - mutex_lock(&zr->resource_lock); + down(&zr->resource_lock); if (fh->v4l_buffers.active != ZORAN_FREE) { zr36057_set_memgrab(zr, 0); @@ -4435,7 +4434,7 @@ zoran_vm_close (struct vm_area_struct *vma) fh->v4l_buffers.allocated = 0; fh->v4l_buffers.ready_to_be_freed = 1; - mutex_unlock(&zr->resource_lock); + up(&zr->resource_lock); } break; @@ -4490,7 +4489,7 @@ zoran_mmap (struct file *file, case ZORAN_MAP_MODE_JPG_PLAY: /* lock */ - mutex_lock(&zr->resource_lock); + down(&zr->resource_lock); /* Map the MJPEG buffers */ if (!fh->jpg_buffers.allocated) { @@ -4580,13 +4579,13 @@ zoran_mmap (struct file *file, } jpg_mmap_unlock_and_return: - mutex_unlock(&zr->resource_lock); + up(&zr->resource_lock); break; case ZORAN_MAP_MODE_RAW: - mutex_lock(&zr->resource_lock); + down(&zr->resource_lock); /* Map the V4L buffers */ if (!fh->v4l_buffers.allocated) { @@ -4658,7 +4657,7 @@ zoran_mmap (struct file *file, break; } v4l_mmap_unlock_and_return: - mutex_unlock(&zr->resource_lock); + up(&zr->resource_lock); break; @@ -4689,7 +4688,7 @@ static struct file_operations zoran_fops = { struct video_device zoran_template __devinitdata = { .name = ZORAN_NAME, .type = ZORAN_VID_TYPE, -#ifdef CONFIG_VIDEO_V4L2 +#ifdef HAVE_V4L2 .type2 = ZORAN_V4L2_VID_FLAGS, #endif .hardware = ZORAN_HARDWARE, diff --git a/drivers/media/video/zoran_procfs.c b/drivers/media/video/zoran_procfs.c index c7f6f6488..f0d9b13c3 100644 --- a/drivers/media/video/zoran_procfs.c +++ b/drivers/media/video/zoran_procfs.c @@ -4,7 +4,7 @@ * Media Labs LML33/LML33R10. * * This part handles the procFS entries (/proc/ZORAN[%d]) - * + * * Copyright (C) 2000 Serguei Miridonov * * Currently maintained by: @@ -27,6 +27,7 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +#include #include #include #include @@ -42,7 +43,6 @@ #include #include -#include #include #include "videocodec.h" diff --git a/drivers/media/video/zoran_procfs.h b/drivers/media/video/zoran_procfs.h index f2d5b1ba4..8904fc959 100644 --- a/drivers/media/video/zoran_procfs.h +++ b/drivers/media/video/zoran_procfs.h @@ -4,7 +4,7 @@ * Media Labs LML33/LML33R10. * * This part handles card-specific data and detection - * + * * Copyright (C) 2000 Serguei Miridonov * * Currently maintained by: diff --git a/drivers/media/video/zr36016.c b/drivers/media/video/zr36016.c index 62f77584f..10130ef67 100644 --- a/drivers/media/video/zr36016.c +++ b/drivers/media/video/zr36016.c @@ -34,7 +34,7 @@ #include #include -/* includes for structures and defines regarding video +/* includes for structures and defines regarding video #include */ /* I/O commands, error codes */ @@ -143,8 +143,8 @@ zr36016_readi (struct zr36016 *ptr, static void zr36016_writei (struct zr36016 *ptr, - u16 reg, - u8 value) + u16 reg, + u8 value) { dprintk(4, "%s: writing indirect 0x%02x to 0x%04x\n", ptr->name, value, reg); @@ -192,7 +192,7 @@ zr36016_basic_test (struct zr36016 *ptr) dprintk(1, "\n"); } // for testing just write 0, then the default value to a register and read - // it back in both cases + // it back in both cases zr36016_writei(ptr, ZR016I_PAX_LO, 0x00); if (zr36016_readi(ptr, ZR016I_PAX_LO) != 0x0) { dprintk(1, @@ -232,17 +232,17 @@ zr36016_basic_test (struct zr36016 *ptr) static int zr36016_pushit (struct zr36016 *ptr, u16 startreg, u16 len, - const char *data) + const char *data) { - int i=0; + int i=0; - dprintk(4, "%s: write data block to 0x%04x (len=%d)\n", + dprintk(4, "%s: write data block to 0x%04x (len=%d)\n", ptr->name, startreg,len); - while (i #include -/* includes for structures and defines regarding video +/* includes for structures and defines regarding video #include */ /* I/O commands, error codes */ @@ -171,7 +171,7 @@ zr36050_wait_end (struct zr36050 *ptr) /* ========================================================================= Local helper function: - basic test of "connectivity", writes/reads to/from memory the SOF marker + basic test of "connectivity", writes/reads to/from memory the SOF marker ========================================================================= */ static int @@ -218,9 +218,9 @@ zr36050_basic_test (struct zr36050 *ptr) static int zr36050_pushit (struct zr36050 *ptr, - u16 startreg, - u16 len, - const char *data) + u16 startreg, + u16 len, + const char *data) { int i = 0; @@ -345,7 +345,7 @@ static const char zr36050_decimation_v[8] = { 1, 1, 1, 0, 0, 0, 0, 0 }; /* ------------------------------------------------------------------------- */ /* SOF (start of frame) segment depends on width, height and sampling ratio - of each color component */ + of each color component */ static int zr36050_set_sof (struct zr36050 *ptr) @@ -376,8 +376,8 @@ zr36050_set_sof (struct zr36050 *ptr) /* ------------------------------------------------------------------------- */ -/* SOS (start of scan) segment depends on the used scan components - of each color component */ +/* SOS (start of scan) segment depends on the used scan components + of each color component */ static int zr36050_set_sos (struct zr36050 *ptr) diff --git a/drivers/media/video/zr36057.h b/drivers/media/video/zr36057.h index 54c9362aa..159abfa03 100644 --- a/drivers/media/video/zr36057.h +++ b/drivers/media/video/zr36057.h @@ -1,4 +1,4 @@ -/* +/* * zr36057.h - zr36057 register offsets * * Copyright (C) 1998 Dave Perks @@ -27,14 +27,14 @@ #define ZR36057_VFEHCR 0x000 /* Video Front End, Horizontal Configuration Register */ #define ZR36057_VFEHCR_HSPol (1<<30) #define ZR36057_VFEHCR_HStart 10 -#define ZR36057_VFEHCR_HEnd 0 -#define ZR36057_VFEHCR_Hmask 0x3ff +#define ZR36057_VFEHCR_HEnd 0 +#define ZR36057_VFEHCR_Hmask 0x3ff #define ZR36057_VFEVCR 0x004 /* Video Front End, Vertical Configuration Register */ #define ZR36057_VFEVCR_VSPol (1<<30) #define ZR36057_VFEVCR_VStart 10 -#define ZR36057_VFEVCR_VEnd 0 -#define ZR36057_VFEVCR_Vmask 0x3ff +#define ZR36057_VFEVCR_VEnd 0 +#define ZR36057_VFEVCR_Vmask 0x3ff #define ZR36057_VFESPFR 0x008 /* Video Front End, Scaler and Pixel Format Register */ #define ZR36057_VFESPFR_ExtFl (1<<26) diff --git a/drivers/media/video/zr36060.c b/drivers/media/video/zr36060.c index 97c8f9b9d..d8dd003a7 100644 --- a/drivers/media/video/zr36060.c +++ b/drivers/media/video/zr36060.c @@ -34,7 +34,7 @@ #include #include -/* includes for structures and defines regarding video +/* includes for structures and defines regarding video #include */ /* I/O commands, error codes */ @@ -173,7 +173,7 @@ zr36060_wait_end (struct zr36060 *ptr) /* ========================================================================= Local helper function: - basic test of "connectivity", writes/reads to/from memory the SOF marker + basic test of "connectivity", writes/reads to/from memory the SOF marker ========================================================================= */ static int @@ -208,9 +208,9 @@ zr36060_basic_test (struct zr36060 *ptr) static int zr36060_pushit (struct zr36060 *ptr, - u16 startreg, - u16 len, - const char *data) + u16 startreg, + u16 len, + const char *data) { int i = 0; @@ -335,7 +335,7 @@ static const char zr36060_decimation_v[8] = { 1, 1, 1, 0, 0, 0, 0, 0 }; /* ------------------------------------------------------------------------- */ /* SOF (start of frame) segment depends on width, height and sampling ratio - of each color component */ + of each color component */ static int zr36060_set_sof (struct zr36060 *ptr) @@ -367,8 +367,8 @@ zr36060_set_sof (struct zr36060 *ptr) /* ------------------------------------------------------------------------- */ -/* SOS (start of scan) segment depends on the used scan components - of each color component */ +/* SOS (start of scan) segment depends on the used scan components + of each color component */ static int zr36060_set_sos (struct zr36060 *ptr) @@ -385,7 +385,7 @@ zr36060_set_sos (struct zr36060 *ptr) for (i = 0; i < NO_OF_COMPONENTS; i++) { sos_data[5 + (i * 2)] = i; // index sos_data[6 + (i * 2)] = (zr36060_td[i] << 4) | - zr36060_ta[i]; // AC/DC tbl.sel. + zr36060_ta[i]; // AC/DC tbl.sel. } sos_data[2 + 1 + (2 * NO_OF_COMPONENTS) + 2] = 00; // scan start sos_data[2 + 1 + (2 * NO_OF_COMPONENTS) + 3] = 0x3f; @@ -999,7 +999,7 @@ zr36060_cleanup_module (void) dprintk(1, "zr36060: something's wrong - %d codecs left somehow.\n", zr36060_codecs); - } + } /* however, we can't just stay alive */ videocodec_unregister(&zr36060_codec); diff --git a/drivers/media/video/zr36120.c b/drivers/media/video/zr36120.c index 50437383e..d4c633b8a 100644 --- a/drivers/media/video/zr36120.c +++ b/drivers/media/video/zr36120.c @@ -70,10 +70,10 @@ MODULE_AUTHOR("Pauline Middelink "); MODULE_DESCRIPTION("Zoran ZR36120 based framegrabber"); MODULE_LICENSE("GPL"); -module_param(triton1, uint, 0); -module_param_array(cardtype, uint, NULL, 0); -module_param(video_nr, int, 0); -module_param(vbi_nr, int, 0); +MODULE_PARM(triton1,"i"); +MODULE_PARM(cardtype,"1-" __MODULE_STRING(ZORAN_MAX) "i"); +MODULE_PARM(video_nr,"i"); +MODULE_PARM(vbi_nr,"i"); static int zoran_cards; static struct zoran zorans[ZORAN_MAX]; @@ -316,7 +316,7 @@ DEBUG(printk(CARD_DEBUG "%p added to queue\n",CARD,item)); item->status = FBUFFER_BUSY; if (!lastitem) ztv->workqueue = item; - else + else lastitem->next = item; lastitem = item; } @@ -516,7 +516,7 @@ DEBUG(printk(KERN_DEBUG " %d: clip(%d,%d,%d,%d)\n", i,vp->x,vp->y,vp->widt zraor((ztv->vidInterlace*ystep)<<0,~ZORAN_OCR_MASKSTRIDE,ZORAN_OCR); } -struct tvnorm +struct tvnorm { u16 Wt, Wa, Ht, Ha, HStart, VStart; }; @@ -660,7 +660,7 @@ DEBUG(printk(KERN_DEBUG " Y: scale=0, start=%d, end=%d\n", Hstart, Hend)); int HorDcm = 64-X; int hcrop1 = 2*(Wa-We)/4; /* - * BUGFIX: Juha Nurmela + * BUGFIX: Juha Nurmela * found the solution to the color phase shift. * See ChangeLog for the full explanation) */ @@ -812,12 +812,12 @@ void zoran_close(struct video_device* dev) zoran_common_close(ztv); - /* - * This is sucky but right now I can't find a good way to - * be sure its safe to free the buffer. We wait 5-6 fields - * which is more than sufficient to be sure. - */ - msleep(100); /* Wait 1/10th of a second */ + /* + * This is sucky but right now I can't find a good way to + * be sure its safe to free the buffer. We wait 5-6 fields + * which is more than sufficient to be sure. + */ + msleep(100); /* Wait 1/10th of a second */ /* free the allocated framebuffer */ bfree(ztv->fbuffer, ZORAN_MAX_FBUFSIZE); @@ -1436,7 +1436,7 @@ int zoran_ioctl(struct video_device* dev, unsigned int cmd, void *arg) /* Why isn't this in the API? * And why doesn't it take a buffer number? - case BTTV_FIELDNR: + case BTTV_FIELDNR: { unsigned long v = ztv->lastfieldnr; if (copy_to_user(arg,&v,sizeof(v))) @@ -1557,12 +1557,12 @@ void vbi_close(struct video_device *dev) zoran_common_close(ztv); - /* - * This is sucky but right now I can't find a good way to - * be sure its safe to free the buffer. We wait 5-6 fields - * which is more than sufficient to be sure. - */ - msleep(100); /* Wait 1/10th of a second */ + /* + * This is sucky but right now I can't find a good way to + * be sure its safe to free the buffer. We wait 5-6 fields + * which is more than sufficient to be sure. + */ + msleep(100); /* Wait 1/10th of a second */ for (item=ztv->readinfo; item!=ztv->readinfo+ZORAN_VBI_BUFFERS; item++) { @@ -1620,7 +1620,7 @@ long vbi_read(struct video_device* dev, char* buf, unsigned long count, int nonb write_unlock_irq(&ztv->lock); return -EWOULDBLOCK; } - + /* mark the unused buffer as wanted */ unused->status = FBUFFER_BUSY; unused->next = 0; @@ -1671,7 +1671,7 @@ long vbi_read(struct video_device* dev, char* buf, unsigned long count, int nonb if (count == 2*19*2048) { /* * Extreme HACK, old VBI programs expect 2048 points - * of data, and we only got 864 orso. Double each + * of data, and we only got 864 orso. Double each * datapoint and clear the rest of the line. * This way we have appear to have a * sample_frequency of 29.5 Mc. @@ -1858,7 +1858,7 @@ int __init find_zoran(void) DEBUG(printk(KERN_DEBUG "zoran: mapped-memory at 0x%p\n",ztv->zoran_mem)); result = request_irq(dev->irq, zoran_irq, - IRQF_SHARED|IRQF_DISABLED,"zoran", ztv); + SA_SHIRQ|SA_INTERRUPT,"zoran", ztv); if (result==-EINVAL) { iounmap(ztv->zoran_mem); @@ -1956,7 +1956,7 @@ int __init init_zoran(int card) zrand(~ZORAN_VDC_TRICOM, ZORAN_VDC); /* external FL determines TOP frame */ - zror(ZORAN_VFEC_EXTFL, ZORAN_VFEC); + zror(ZORAN_VFEC_EXTFL, ZORAN_VFEC); /* set HSpol */ if (ztv->card->hsync_pos) @@ -2012,7 +2012,7 @@ void release_zoran(int max) struct zoran *ztv; int i; - for (i=0;idev->irq,ztv); - + /* unregister i2c_bus */ i2c_unregister_bus((&ztv->i2c)); @@ -2050,7 +2050,7 @@ void __exit zr36120_exit(void) int __init zr36120_init(void) { int card; - + handle_chipset(); zoran_cards = find_zoran(); if (zoran_cards<0) @@ -2063,7 +2063,7 @@ int __init zr36120_init(void) /* only release the zorans we have registered */ release_zoran(card); return -EIO; - } + } } return 0; } diff --git a/drivers/media/video/zr36120.h b/drivers/media/video/zr36120.h index a71e485b0..571f8e84b 100644 --- a/drivers/media/video/zr36120.h +++ b/drivers/media/video/zr36120.h @@ -1,4 +1,4 @@ -/* +/* zr36120.h - Zoran 36120/36125 based framegrabbers Copyright (C) 1998-1999 Pauline Middelink (middelin@polyware.nl) @@ -89,7 +89,7 @@ struct vidinfo { ulong* overlay; /* kernel addr of overlay mask */ }; -struct zoran +struct zoran { struct video_device video_dev; #define CARD_DEBUG KERN_DEBUG "%s(%lu): " @@ -106,7 +106,7 @@ struct zoran uint norm; /* 0=PAL, 1=NTSC, 2=SECAM */ uint tuner_freq; /* Current freq in kHz */ struct video_picture picture; /* Current picture params */ - + /* videocard details */ uint swidth; /* screen width */ uint sheight; /* screen height */ diff --git a/drivers/media/video/zr36120_mem.c b/drivers/media/video/zr36120_mem.c index 416eaa93b..c87113d6c 100644 --- a/drivers/media/video/zr36120_mem.c +++ b/drivers/media/video/zr36120_mem.c @@ -18,6 +18,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +#include #include #include #include diff --git a/drivers/message/fusion/Kconfig b/drivers/message/fusion/Kconfig index ea31d8470..e67cf15e9 100644 --- a/drivers/message/fusion/Kconfig +++ b/drivers/message/fusion/Kconfig @@ -9,7 +9,6 @@ config FUSION_SPI tristate "Fusion MPT ScsiHost drivers for SPI" depends on PCI && SCSI select FUSION - select SCSI_SPI_ATTRS ---help--- SCSI HOST support for a parallel SCSI host adapters. @@ -48,8 +47,10 @@ config FUSION_SAS List of supported controllers: LSISAS1064 + LSISAS1066 LSISAS1068 LSISAS1064E + LSISAS1066E LSISAS1068E config FUSION_MAX_SGE diff --git a/drivers/message/fusion/Makefile b/drivers/message/fusion/Makefile index 341691390..33ace3732 100644 --- a/drivers/message/fusion/Makefile +++ b/drivers/message/fusion/Makefile @@ -4,11 +4,11 @@ #EXTRA_CFLAGS += -DMPT_DEBUG_MSG_FRAME #EXTRA_CFLAGS += -DMPT_DEBUG_SG #EXTRA_CFLAGS += -DMPT_DEBUG_EVENTS -#EXTRA_CFLAGS += -DMPT_DEBUG_VERBOSE_EVENTS #EXTRA_CFLAGS += -DMPT_DEBUG_INIT #EXTRA_CFLAGS += -DMPT_DEBUG_EXIT #EXTRA_CFLAGS += -DMPT_DEBUG_FAIL + # # driver/module specifics... # @@ -32,11 +32,6 @@ # For mptfc: #CFLAGS_mptfc.o += -DMPT_DEBUG_FC -# For mptsas: -#CFLAGS_mptsas.o += -DMPT_DEBUG_SAS -#CFLAGS_mptsas.o += -DMPT_DEBUG_SAS_WIDE - - #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-} LSI_LOGIC obj-$(CONFIG_FUSION_SPI) += mptbase.o mptscsih.o mptspi.o diff --git a/drivers/message/fusion/lsi/mpi.h b/drivers/message/fusion/lsi/mpi.h index 81ad77622..02cdc840a 100644 --- a/drivers/message/fusion/lsi/mpi.h +++ b/drivers/message/fusion/lsi/mpi.h @@ -6,7 +6,7 @@ * Title: MPI Message independent structures and definitions * Creation Date: July 27, 2000 * - * mpi.h Version: 01.05.11 + * mpi.h Version: 01.05.10 * * Version History * --------------- @@ -76,7 +76,6 @@ * Added EEDP IOCStatus codes. * 08-03-05 01.05.09 Bumped MPI_HEADER_VERSION_UNIT. * 08-30-05 01.05.10 Added 2 new IOCStatus codes for Target. - * 03-27-06 01.05.11 Bumped MPI_HEADER_VERSION_UNIT. * -------------------------------------------------------------------------- */ @@ -107,7 +106,7 @@ /* Note: The major versions of 0xe0 through 0xff are reserved */ /* versioning for this MPI header set */ -#define MPI_HEADER_VERSION_UNIT (0x0D) +#define MPI_HEADER_VERSION_UNIT (0x0C) #define MPI_HEADER_VERSION_DEV (0x00) #define MPI_HEADER_VERSION_UNIT_MASK (0xFF00) #define MPI_HEADER_VERSION_UNIT_SHIFT (8) diff --git a/drivers/message/fusion/lsi/mpi_cnfg.h b/drivers/message/fusion/lsi/mpi_cnfg.h index 47e13e360..b1becec27 100644 --- a/drivers/message/fusion/lsi/mpi_cnfg.h +++ b/drivers/message/fusion/lsi/mpi_cnfg.h @@ -6,7 +6,7 @@ * Title: MPI Config message, structures, and Pages * Creation Date: July 27, 2000 * - * mpi_cnfg.h Version: 01.05.12 + * mpi_cnfg.h Version: 01.05.11 * * Version History * --------------- @@ -266,16 +266,6 @@ * Added postpone SATA Init bit to SAS IO Unit Page 1 * ControlFlags. * Changed LogEntry format for Log Page 0. - * 03-27-06 01.05.12 Added two new Flags defines for Manufacturing Page 4. - * Added Manufacturing Page 7. - * Added MPI_IOCPAGE2_CAP_FLAGS_RAID_64_BIT_ADDRESSING. - * Added IOC Page 6. - * Added PrevBootDeviceForm field to CONFIG_PAGE_BIOS_2. - * Added MaxLBAHigh field to RAID Volume Page 0. - * Added Nvdata version fields to SAS IO Unit Page 0. - * Added AdditionalControlFlags, MaxTargetPortConnectTime, - * ReportDeviceMissingDelay, and IODeviceMissingDelay - * fields to SAS IO Unit Page 1. * -------------------------------------------------------------------------- */ @@ -641,11 +631,9 @@ typedef struct _CONFIG_PAGE_MANUFACTURING_4 } CONFIG_PAGE_MANUFACTURING_4, MPI_POINTER PTR_CONFIG_PAGE_MANUFACTURING_4, ManufacturingPage4_t, MPI_POINTER pManufacturingPage4_t; -#define MPI_MANUFACTURING4_PAGEVERSION (0x04) +#define MPI_MANUFACTURING4_PAGEVERSION (0x03) /* defines for the Flags field */ -#define MPI_MANPAGE4_FORCE_BAD_BLOCK_TABLE (0x80) -#define MPI_MANPAGE4_FORCE_OFFLINE_FAILOVER (0x40) #define MPI_MANPAGE4_IME_DISABLE (0x20) #define MPI_MANPAGE4_IM_DISABLE (0x10) #define MPI_MANPAGE4_IS_DISABLE (0x08) @@ -680,66 +668,6 @@ typedef struct _CONFIG_PAGE_MANUFACTURING_6 #define MPI_MANUFACTURING6_PAGEVERSION (0x00) -typedef struct _MPI_MANPAGE7_CONNECTOR_INFO -{ - U32 Pinout; /* 00h */ - U8 Connector[16]; /* 04h */ - U8 Location; /* 14h */ - U8 Reserved1; /* 15h */ - U16 Slot; /* 16h */ - U32 Reserved2; /* 18h */ -} MPI_MANPAGE7_CONNECTOR_INFO, MPI_POINTER PTR_MPI_MANPAGE7_CONNECTOR_INFO, - MpiManPage7ConnectorInfo_t, MPI_POINTER pMpiManPage7ConnectorInfo_t; - -/* defines for the Pinout field */ -#define MPI_MANPAGE7_PINOUT_SFF_8484_L4 (0x00080000) -#define MPI_MANPAGE7_PINOUT_SFF_8484_L3 (0x00040000) -#define MPI_MANPAGE7_PINOUT_SFF_8484_L2 (0x00020000) -#define MPI_MANPAGE7_PINOUT_SFF_8484_L1 (0x00010000) -#define MPI_MANPAGE7_PINOUT_SFF_8470_L4 (0x00000800) -#define MPI_MANPAGE7_PINOUT_SFF_8470_L3 (0x00000400) -#define MPI_MANPAGE7_PINOUT_SFF_8470_L2 (0x00000200) -#define MPI_MANPAGE7_PINOUT_SFF_8470_L1 (0x00000100) -#define MPI_MANPAGE7_PINOUT_SFF_8482 (0x00000002) -#define MPI_MANPAGE7_PINOUT_CONNECTION_UNKNOWN (0x00000001) - -/* defines for the Location field */ -#define MPI_MANPAGE7_LOCATION_UNKNOWN (0x01) -#define MPI_MANPAGE7_LOCATION_INTERNAL (0x02) -#define MPI_MANPAGE7_LOCATION_EXTERNAL (0x04) -#define MPI_MANPAGE7_LOCATION_SWITCHABLE (0x08) -#define MPI_MANPAGE7_LOCATION_AUTO (0x10) -#define MPI_MANPAGE7_LOCATION_NOT_PRESENT (0x20) -#define MPI_MANPAGE7_LOCATION_NOT_CONNECTED (0x80) - -/* - * Host code (drivers, BIOS, utilities, etc.) should leave this define set to - * one and check NumPhys at runtime. - */ -#ifndef MPI_MANPAGE7_CONNECTOR_INFO_MAX -#define MPI_MANPAGE7_CONNECTOR_INFO_MAX (1) -#endif - -typedef struct _CONFIG_PAGE_MANUFACTURING_7 -{ - CONFIG_PAGE_HEADER Header; /* 00h */ - U32 Reserved1; /* 04h */ - U32 Reserved2; /* 08h */ - U32 Flags; /* 0Ch */ - U8 EnclosureName[16]; /* 10h */ - U8 NumPhys; /* 20h */ - U8 Reserved3; /* 21h */ - U16 Reserved4; /* 22h */ - MPI_MANPAGE7_CONNECTOR_INFO ConnectorInfo[MPI_MANPAGE7_CONNECTOR_INFO_MAX]; /* 24h */ -} CONFIG_PAGE_MANUFACTURING_7, MPI_POINTER PTR_CONFIG_PAGE_MANUFACTURING_7, - ManufacturingPage7_t, MPI_POINTER pManufacturingPage7_t; - -#define MPI_MANUFACTURING7_PAGEVERSION (0x00) - -/* defines for the Flags field */ -#define MPI_MANPAGE7_FLAG_USE_SLOT_INFO (0x00000001) - - /**************************************************************************** * IO Unit Config Pages ****************************************************************************/ @@ -939,7 +867,7 @@ typedef struct _CONFIG_PAGE_IOC_2 } CONFIG_PAGE_IOC_2, MPI_POINTER PTR_CONFIG_PAGE_IOC_2, IOCPage2_t, MPI_POINTER pIOCPage2_t; -#define MPI_IOCPAGE2_PAGEVERSION (0x04) +#define MPI_IOCPAGE2_PAGEVERSION (0x03) /* IOC Page 2 Capabilities flags */ @@ -950,7 +878,6 @@ typedef struct _CONFIG_PAGE_IOC_2 #define MPI_IOCPAGE2_CAP_FLAGS_RAID_6_SUPPORT (0x00000010) #define MPI_IOCPAGE2_CAP_FLAGS_RAID_10_SUPPORT (0x00000020) #define MPI_IOCPAGE2_CAP_FLAGS_RAID_50_SUPPORT (0x00000040) -#define MPI_IOCPAGE2_CAP_FLAGS_RAID_64_BIT_ADDRESSING (0x10000000) #define MPI_IOCPAGE2_CAP_FLAGS_SES_SUPPORT (0x20000000) #define MPI_IOCPAGE2_CAP_FLAGS_SAFTE_SUPPORT (0x40000000) #define MPI_IOCPAGE2_CAP_FLAGS_CROSS_CHANNEL_SUPPORT (0x80000000) @@ -1048,44 +975,6 @@ typedef struct _CONFIG_PAGE_IOC_5 #define MPI_IOCPAGE5_PAGEVERSION (0x00) -typedef struct _CONFIG_PAGE_IOC_6 -{ - CONFIG_PAGE_HEADER Header; /* 00h */ - U32 CapabilitiesFlags; /* 04h */ - U8 MaxDrivesIS; /* 08h */ - U8 MaxDrivesIM; /* 09h */ - U8 MaxDrivesIME; /* 0Ah */ - U8 Reserved1; /* 0Bh */ - U8 MinDrivesIS; /* 0Ch */ - U8 MinDrivesIM; /* 0Dh */ - U8 MinDrivesIME; /* 0Eh */ - U8 Reserved2; /* 0Fh */ - U8 MaxGlobalHotSpares; /* 10h */ - U8 Reserved3; /* 11h */ - U16 Reserved4; /* 12h */ - U32 Reserved5; /* 14h */ - U32 SupportedStripeSizeMapIS; /* 18h */ - U32 SupportedStripeSizeMapIME; /* 1Ch */ - U32 Reserved6; /* 20h */ - U8 MetadataSize; /* 24h */ - U8 Reserved7; /* 25h */ - U16 Reserved8; /* 26h */ - U16 MaxBadBlockTableEntries; /* 28h */ - U16 Reserved9; /* 2Ah */ - U16 IRNvsramUsage; /* 2Ch */ - U16 Reserved10; /* 2Eh */ - U32 IRNvsramVersion; /* 30h */ - U32 Reserved11; /* 34h */ - U32 Reserved12; /* 38h */ -} CONFIG_PAGE_IOC_6, MPI_POINTER PTR_CONFIG_PAGE_IOC_6, - IOCPage6_t, MPI_POINTER pIOCPage6_t; - -#define MPI_IOCPAGE6_PAGEVERSION (0x00) - -/* IOC Page 6 Capabilities Flags */ - -#define MPI_IOCPAGE6_CAP_FLAGS_GLOBAL_HOT_SPARE (0x00000001) - /**************************************************************************** * BIOS Config Pages @@ -1329,13 +1218,13 @@ typedef struct _CONFIG_PAGE_BIOS_2 U32 Reserved5; /* 14h */ U32 Reserved6; /* 18h */ U8 BootDeviceForm; /* 1Ch */ - U8 PrevBootDeviceForm; /* 1Ch */ + U8 Reserved7; /* 1Dh */ U16 Reserved8; /* 1Eh */ MPI_BIOSPAGE2_BOOT_DEVICE BootDevice; /* 20h */ } CONFIG_PAGE_BIOS_2, MPI_POINTER PTR_CONFIG_PAGE_BIOS_2, BIOSPage2_t, MPI_POINTER pBIOSPage2_t; -#define MPI_BIOSPAGE2_PAGEVERSION (0x02) +#define MPI_BIOSPAGE2_PAGEVERSION (0x01) #define MPI_BIOSPAGE2_FORM_MASK (0x0F) #define MPI_BIOSPAGE2_FORM_ADAPTER_ORDER (0x00) @@ -2191,7 +2080,7 @@ typedef struct _CONFIG_PAGE_RAID_VOL_0 RAID_VOL0_STATUS VolumeStatus; /* 08h */ RAID_VOL0_SETTINGS VolumeSettings; /* 0Ch */ U32 MaxLBA; /* 10h */ - U32 MaxLBAHigh; /* 14h */ + U32 Reserved1; /* 14h */ U32 StripeSize; /* 18h */ U32 Reserved2; /* 1Ch */ U32 Reserved3; /* 20h */ @@ -2203,7 +2092,7 @@ typedef struct _CONFIG_PAGE_RAID_VOL_0 } CONFIG_PAGE_RAID_VOL_0, MPI_POINTER PTR_CONFIG_PAGE_RAID_VOL_0, RaidVolumePage0_t, MPI_POINTER pRaidVolumePage0_t; -#define MPI_RAIDVOLPAGE0_PAGEVERSION (0x06) +#define MPI_RAIDVOLPAGE0_PAGEVERSION (0x05) /* values for RAID Volume Page 0 InactiveStatus field */ #define MPI_RAIDVOLPAGE0_UNKNOWN_INACTIVE (0x00) @@ -2435,8 +2324,7 @@ typedef struct _MPI_SAS_IO_UNIT0_PHY_DATA typedef struct _CONFIG_PAGE_SAS_IO_UNIT_0 { CONFIG_EXTENDED_PAGE_HEADER Header; /* 00h */ - U16 NvdataVersionDefault; /* 08h */ - U16 NvdataVersionPersistent; /* 0Ah */ + U32 Reserved1; /* 08h */ U8 NumPhys; /* 0Ch */ U8 Reserved2; /* 0Dh */ U16 Reserved3; /* 0Eh */ @@ -2444,7 +2332,7 @@ typedef struct _CONFIG_PAGE_SAS_IO_UNIT_0 } CONFIG_PAGE_SAS_IO_UNIT_0, MPI_POINTER PTR_CONFIG_PAGE_SAS_IO_UNIT_0, SasIOUnitPage0_t, MPI_POINTER pSasIOUnitPage0_t; -#define MPI_SASIOUNITPAGE0_PAGEVERSION (0x04) +#define MPI_SASIOUNITPAGE0_PAGEVERSION (0x03) /* values for SAS IO Unit Page 0 PortFlags */ #define MPI_SAS_IOUNIT0_PORT_FLAGS_DISCOVERY_IN_PROGRESS (0x08) @@ -2485,13 +2373,12 @@ typedef struct _CONFIG_PAGE_SAS_IO_UNIT_0 typedef struct _MPI_SAS_IO_UNIT1_PHY_DATA { - U8 Port; /* 00h */ - U8 PortFlags; /* 01h */ - U8 PhyFlags; /* 02h */ - U8 MaxMinLinkRate; /* 03h */ - U32 ControllerPhyDeviceInfo; /* 04h */ - U16 MaxTargetPortConnectTime; /* 08h */ - U16 Reserved1; /* 0Ah */ + U8 Port; /* 00h */ + U8 PortFlags; /* 01h */ + U8 PhyFlags; /* 02h */ + U8 MaxMinLinkRate; /* 03h */ + U32 ControllerPhyDeviceInfo;/* 04h */ + U32 Reserved1; /* 08h */ } MPI_SAS_IO_UNIT1_PHY_DATA, MPI_POINTER PTR_MPI_SAS_IO_UNIT1_PHY_DATA, SasIOUnit1PhyData, MPI_POINTER pSasIOUnit1PhyData; @@ -2508,17 +2395,15 @@ typedef struct _CONFIG_PAGE_SAS_IO_UNIT_1 CONFIG_EXTENDED_PAGE_HEADER Header; /* 00h */ U16 ControlFlags; /* 08h */ U16 MaxNumSATATargets; /* 0Ah */ - U16 AdditionalControlFlags; /* 0Ch */ - U16 Reserved1; /* 0Eh */ + U32 Reserved1; /* 0Ch */ U8 NumPhys; /* 10h */ U8 SATAMaxQDepth; /* 11h */ - U8 ReportDeviceMissingDelay; /* 12h */ - U8 IODeviceMissingDelay; /* 13h */ + U16 Reserved2; /* 12h */ MPI_SAS_IO_UNIT1_PHY_DATA PhyData[MPI_SAS_IOUNIT1_PHY_MAX]; /* 14h */ } CONFIG_PAGE_SAS_IO_UNIT_1, MPI_POINTER PTR_CONFIG_PAGE_SAS_IO_UNIT_1, SasIOUnitPage1_t, MPI_POINTER pSasIOUnitPage1_t; -#define MPI_SASIOUNITPAGE1_PAGEVERSION (0x06) +#define MPI_SASIOUNITPAGE1_PAGEVERSION (0x05) /* values for SAS IO Unit Page 1 ControlFlags */ #define MPI_SAS_IOUNIT1_CONTROL_DEVICE_SELF_TEST (0x8000) @@ -2543,13 +2428,6 @@ typedef struct _CONFIG_PAGE_SAS_IO_UNIT_1 #define MPI_SAS_IOUNIT1_CONTROL_FIRST_LVL_DISC_ONLY (0x0002) #define MPI_SAS_IOUNIT1_CONTROL_CLEAR_AFFILIATION (0x0001) -/* values for SAS IO Unit Page 1 AdditionalControlFlags */ -#define MPI_SAS_IOUNIT1_ACONTROL_ALLOW_TABLE_TO_TABLE (0x0001) - -/* defines for SAS IO Unit Page 1 ReportDeviceMissingDelay */ -#define MPI_SAS_IOUNIT1_REPORT_MISSING_TIMEOUT_MASK (0x7F) -#define MPI_SAS_IOUNIT1_REPORT_MISSING_UNIT_16 (0x80) - /* values for SAS IO Unit Page 1 PortFlags */ #define MPI_SAS_IOUNIT1_PORT_FLAGS_0_TARGET_IOC_NUM (0x00) #define MPI_SAS_IOUNIT1_PORT_FLAGS_1_TARGET_IOC_NUM (0x04) diff --git a/drivers/message/fusion/lsi/mpi_history.txt b/drivers/message/fusion/lsi/mpi_history.txt index 582cfe7c2..4a5f8dd1d 100644 --- a/drivers/message/fusion/lsi/mpi_history.txt +++ b/drivers/message/fusion/lsi/mpi_history.txt @@ -6,25 +6,25 @@ Copyright (c) 2000-2005 LSI Logic Corporation. --------------------------------------- - Header Set Release Version: 01.05.13 - Header Set Release Date: 03-27-06 + Header Set Release Version: 01.05.12 + Header Set Release Date: 08-30-05 --------------------------------------- Filename Current version Prior version ---------- --------------- ------------- - mpi.h 01.05.11 01.05.10 - mpi_ioc.h 01.05.11 01.05.10 - mpi_cnfg.h 01.05.12 01.05.11 - mpi_init.h 01.05.07 01.05.06 - mpi_targ.h 01.05.06 01.05.05 + mpi.h 01.05.10 01.05.09 + mpi_ioc.h 01.05.10 01.05.09 + mpi_cnfg.h 01.05.11 01.05.10 + mpi_init.h 01.05.06 01.05.06 + mpi_targ.h 01.05.05 01.05.05 mpi_fc.h 01.05.01 01.05.01 mpi_lan.h 01.05.01 01.05.01 mpi_raid.h 01.05.02 01.05.02 mpi_tool.h 01.05.03 01.05.03 mpi_inb.h 01.05.01 01.05.01 - mpi_sas.h 01.05.03 01.05.02 - mpi_type.h 01.05.02 01.05.02 - mpi_history.txt 01.05.13 01.05.12 + mpi_sas.h 01.05.02 01.05.01 + mpi_type.h 01.05.02 01.05.01 + mpi_history.txt 01.05.12 01.05.11 * Date Version Description @@ -93,7 +93,6 @@ mpi.h * Added EEDP IOCStatus codes. * 08-03-05 01.05.09 Bumped MPI_HEADER_VERSION_UNIT. * 08-30-05 01.05.10 Added 2 new IOCStatus codes for Target. - * 03-27-06 01.05.11 Bumped MPI_HEADER_VERSION_UNIT. * -------------------------------------------------------------------------- mpi_ioc.h @@ -171,17 +170,6 @@ mpi_ioc.h * Added new ReasonCode value for SAS Device Status Change * event. * Added new family code for FC949E. - * 03-27-06 01.05.11 Added MPI_IOCFACTS_CAPABILITY_TLR. - * Added additional Reason Codes and more event data fields - * to EVENT_DATA_SAS_DEVICE_STATUS_CHANGE. - * Added EVENT_DATA_SAS_BROADCAST_PRIMITIVE structure and - * new event. - * Added MPI_EVENT_SAS_SMP_ERROR and event data structure. - * Added MPI_EVENT_SAS_INIT_DEVICE_STATUS_CHANGE and event - * data structure. - * Added MPI_EVENT_SAS_INIT_TABLE_OVERFLOW and event - * data structure. - * Added MPI_EXT_IMAGE_TYPE_INITIALIZATION. * -------------------------------------------------------------------------- mpi_cnfg.h @@ -437,16 +425,6 @@ mpi_cnfg.h * Added postpone SATA Init bit to SAS IO Unit Page 1 * ControlFlags. * Changed LogEntry format for Log Page 0. - * 03-27-06 01.05.12 Added two new Flags defines for Manufacturing Page 4. - * Added Manufacturing Page 7. - * Added MPI_IOCPAGE2_CAP_FLAGS_RAID_64_BIT_ADDRESSING. - * Added IOC Page 6. - * Added PrevBootDeviceForm field to CONFIG_PAGE_BIOS_2. - * Added MaxLBAHigh field to RAID Volume Page 0. - * Added Nvdata version fields to SAS IO Unit Page 0. - * Added AdditionalControlFlags, MaxTargetPortConnectTime, - * ReportDeviceMissingDelay, and IODeviceMissingDelay - * fields to SAS IO Unit Page 1. * -------------------------------------------------------------------------- mpi_init.h @@ -489,7 +467,6 @@ mpi_init.h * Added four new defines for SEP SlotStatus. * 08-03-05 01.05.06 Fixed some MPI_SCSIIO32_MSGFLGS_ defines to make them * unique in the first 32 characters. - * 03-27-06 01.05.07 Added Task Management type of Clear ACA. * -------------------------------------------------------------------------- mpi_targ.h @@ -534,7 +511,6 @@ mpi_targ.h * 02-22-05 01.05.03 Changed a comment. * 03-11-05 01.05.04 Removed TargetAssistExtended Request. * 06-24-05 01.05.05 Added TargetAssistExtended structures and defines. - * 03-27-06 01.05.06 Added a comment. * -------------------------------------------------------------------------- mpi_fc.h @@ -634,10 +610,6 @@ mpi_sas.h * 08-30-05 01.05.02 Added DeviceInfo bit for SEP. * Added PrimFlags and Primitive field to SAS IO Unit * Control request, and added a new operation code. - * 03-27-06 01.05.03 Added Force Full Discovery, Transmit Port Select Signal, - * and Remove Device operations to SAS IO Unit Control. - * Added DevHandle field to SAS IO Unit Control request and - * reply. * -------------------------------------------------------------------------- mpi_type.h @@ -653,20 +625,20 @@ mpi_type.h mpi_history.txt Parts list history -Filename 01.05.13 01.05.12 01.05.11 01.05.10 01.05.09 ----------- -------- -------- -------- -------- -------- -mpi.h 01.05.11 01.05.10 01.05.09 01.05.08 01.05.07 -mpi_ioc.h 01.05.11 01.05.10 01.05.09 01.05.09 01.05.08 -mpi_cnfg.h 01.05.12 01.05.11 01.05.10 01.05.09 01.05.08 -mpi_init.h 01.05.07 01.05.06 01.05.06 01.05.05 01.05.04 -mpi_targ.h 01.05.06 01.05.05 01.05.05 01.05.05 01.05.04 -mpi_fc.h 01.05.01 01.05.01 01.05.01 01.05.01 01.05.01 -mpi_lan.h 01.05.01 01.05.01 01.05.01 01.05.01 01.05.01 -mpi_raid.h 01.05.02 01.05.02 01.05.02 01.05.02 01.05.02 -mpi_tool.h 01.05.03 01.05.03 01.05.03 01.05.03 01.05.03 -mpi_inb.h 01.05.01 01.05.01 01.05.01 01.05.01 01.05.01 -mpi_sas.h 01.05.03 01.05.02 01.05.01 01.05.01 01.05.01 -mpi_type.h 01.05.02 01.05.02 01.05.01 01.05.01 01.05.01 +Filename 01.05.12 01.05.11 01.05.10 01.05.09 +---------- -------- -------- -------- -------- +mpi.h 01.05.10 01.05.09 01.05.08 01.05.07 +mpi_ioc.h 01.05.10 01.05.09 01.05.09 01.05.08 +mpi_cnfg.h 01.05.11 01.05.10 01.05.09 01.05.08 +mpi_init.h 01.05.06 01.05.06 01.05.05 01.05.04 +mpi_targ.h 01.05.05 01.05.05 01.05.05 01.05.04 +mpi_fc.h 01.05.01 01.05.01 01.05.01 01.05.01 +mpi_lan.h 01.05.01 01.05.01 01.05.01 01.05.01 +mpi_raid.h 01.05.02 01.05.02 01.05.02 01.05.02 +mpi_tool.h 01.05.03 01.05.03 01.05.03 01.05.03 +mpi_inb.h 01.05.01 01.05.01 01.05.01 01.05.01 +mpi_sas.h 01.05.02 01.05.01 01.05.01 01.05.01 +mpi_type.h 01.05.02 01.05.01 01.05.01 01.05.01 Filename 01.05.08 01.05.07 01.05.06 01.05.05 01.05.04 01.05.03 ---------- -------- -------- -------- -------- -------- -------- diff --git a/drivers/message/fusion/lsi/mpi_init.h b/drivers/message/fusion/lsi/mpi_init.h index c1c678989..68941f459 100644 --- a/drivers/message/fusion/lsi/mpi_init.h +++ b/drivers/message/fusion/lsi/mpi_init.h @@ -6,7 +6,7 @@ * Title: MPI initiator mode messages and structures * Creation Date: June 8, 2000 * - * mpi_init.h Version: 01.05.07 + * mpi_init.h Version: 01.05.06 * * Version History * --------------- @@ -52,7 +52,6 @@ * Added four new defines for SEP SlotStatus. * 08-03-05 01.05.06 Fixed some MPI_SCSIIO32_MSGFLGS_ defines to make them * unique in the first 32 characters. - * 03-27-06 01.05.07 Added Task Management type of Clear ACA. * -------------------------------------------------------------------------- */ @@ -428,7 +427,6 @@ typedef struct _MSG_SCSI_TASK_MGMT #define MPI_SCSITASKMGMT_TASKTYPE_LOGICAL_UNIT_RESET (0x05) #define MPI_SCSITASKMGMT_TASKTYPE_CLEAR_TASK_SET (0x06) #define MPI_SCSITASKMGMT_TASKTYPE_QUERY_TASK (0x07) -#define MPI_SCSITASKMGMT_TASKTYPE_CLEAR_ACA (0x08) /* MsgFlags bits */ #define MPI_SCSITASKMGMT_MSGFLAGS_TARGET_RESET_OPTION (0x00) diff --git a/drivers/message/fusion/lsi/mpi_ioc.h b/drivers/message/fusion/lsi/mpi_ioc.h index 18ba407fd..2c5f43fa7 100644 --- a/drivers/message/fusion/lsi/mpi_ioc.h +++ b/drivers/message/fusion/lsi/mpi_ioc.h @@ -6,7 +6,7 @@ * Title: MPI IOC, Port, Event, FW Download, and FW Upload messages * Creation Date: August 11, 2000 * - * mpi_ioc.h Version: 01.05.11 + * mpi_ioc.h Version: 01.05.10 * * Version History * --------------- @@ -87,17 +87,6 @@ * Added new ReasonCode value for SAS Device Status Change * event. * Added new family code for FC949E. - * 03-27-06 01.05.11 Added MPI_IOCFACTS_CAPABILITY_TLR. - * Added additional Reason Codes and more event data fields - * to EVENT_DATA_SAS_DEVICE_STATUS_CHANGE. - * Added EVENT_DATA_SAS_BROADCAST_PRIMITIVE structure and - * new event. - * Added MPI_EVENT_SAS_SMP_ERROR and event data structure. - * Added MPI_EVENT_SAS_INIT_DEVICE_STATUS_CHANGE and event - * data structure. - * Added MPI_EVENT_SAS_INIT_TABLE_OVERFLOW and event - * data structure. - * Added MPI_EXT_IMAGE_TYPE_INITIALIZATION. * -------------------------------------------------------------------------- */ @@ -283,7 +272,6 @@ typedef struct _MSG_IOC_FACTS_REPLY #define MPI_IOCFACTS_CAPABILITY_MULTICAST (0x00000100) #define MPI_IOCFACTS_CAPABILITY_SCSIIO32 (0x00000200) #define MPI_IOCFACTS_CAPABILITY_NO_SCSIIO16 (0x00000400) -#define MPI_IOCFACTS_CAPABILITY_TLR (0x00000800) /***************************************************************************** @@ -460,34 +448,30 @@ typedef struct _MSG_EVENT_ACK_REPLY /* Event */ -#define MPI_EVENT_NONE (0x00000000) -#define MPI_EVENT_LOG_DATA (0x00000001) -#define MPI_EVENT_STATE_CHANGE (0x00000002) -#define MPI_EVENT_UNIT_ATTENTION (0x00000003) -#define MPI_EVENT_IOC_BUS_RESET (0x00000004) -#define MPI_EVENT_EXT_BUS_RESET (0x00000005) -#define MPI_EVENT_RESCAN (0x00000006) -#define MPI_EVENT_LINK_STATUS_CHANGE (0x00000007) -#define MPI_EVENT_LOOP_STATE_CHANGE (0x00000008) -#define MPI_EVENT_LOGOUT (0x00000009) -#define MPI_EVENT_EVENT_CHANGE (0x0000000A) -#define MPI_EVENT_INTEGRATED_RAID (0x0000000B) -#define MPI_EVENT_SCSI_DEVICE_STATUS_CHANGE (0x0000000C) -#define MPI_EVENT_ON_BUS_TIMER_EXPIRED (0x0000000D) -#define MPI_EVENT_QUEUE_FULL (0x0000000E) -#define MPI_EVENT_SAS_DEVICE_STATUS_CHANGE (0x0000000F) -#define MPI_EVENT_SAS_SES (0x00000010) -#define MPI_EVENT_PERSISTENT_TABLE_FULL (0x00000011) -#define MPI_EVENT_SAS_PHY_LINK_STATUS (0x00000012) -#define MPI_EVENT_SAS_DISCOVERY_ERROR (0x00000013) -#define MPI_EVENT_IR_RESYNC_UPDATE (0x00000014) -#define MPI_EVENT_IR2 (0x00000015) -#define MPI_EVENT_SAS_DISCOVERY (0x00000016) -#define MPI_EVENT_SAS_BROADCAST_PRIMITIVE (0x00000017) -#define MPI_EVENT_SAS_INIT_DEVICE_STATUS_CHANGE (0x00000018) -#define MPI_EVENT_SAS_INIT_TABLE_OVERFLOW (0x00000019) -#define MPI_EVENT_SAS_SMP_ERROR (0x0000001A) -#define MPI_EVENT_LOG_ENTRY_ADDED (0x00000021) +#define MPI_EVENT_NONE (0x00000000) +#define MPI_EVENT_LOG_DATA (0x00000001) +#define MPI_EVENT_STATE_CHANGE (0x00000002) +#define MPI_EVENT_UNIT_ATTENTION (0x00000003) +#define MPI_EVENT_IOC_BUS_RESET (0x00000004) +#define MPI_EVENT_EXT_BUS_RESET (0x00000005) +#define MPI_EVENT_RESCAN (0x00000006) +#define MPI_EVENT_LINK_STATUS_CHANGE (0x00000007) +#define MPI_EVENT_LOOP_STATE_CHANGE (0x00000008) +#define MPI_EVENT_LOGOUT (0x00000009) +#define MPI_EVENT_EVENT_CHANGE (0x0000000A) +#define MPI_EVENT_INTEGRATED_RAID (0x0000000B) +#define MPI_EVENT_SCSI_DEVICE_STATUS_CHANGE (0x0000000C) +#define MPI_EVENT_ON_BUS_TIMER_EXPIRED (0x0000000D) +#define MPI_EVENT_QUEUE_FULL (0x0000000E) +#define MPI_EVENT_SAS_DEVICE_STATUS_CHANGE (0x0000000F) +#define MPI_EVENT_SAS_SES (0x00000010) +#define MPI_EVENT_PERSISTENT_TABLE_FULL (0x00000011) +#define MPI_EVENT_SAS_PHY_LINK_STATUS (0x00000012) +#define MPI_EVENT_SAS_DISCOVERY_ERROR (0x00000013) +#define MPI_EVENT_IR_RESYNC_UPDATE (0x00000014) +#define MPI_EVENT_IR2 (0x00000015) +#define MPI_EVENT_SAS_DISCOVERY (0x00000016) +#define MPI_EVENT_LOG_ENTRY_ADDED (0x00000021) /* AckRequired field values */ @@ -574,25 +558,18 @@ typedef struct _EVENT_DATA_SAS_DEVICE_STATUS_CHANGE U8 PhyNum; /* 0Eh */ U8 Reserved1; /* 0Fh */ U64 SASAddress; /* 10h */ - U8 LUN[8]; /* 18h */ - U16 TaskTag; /* 20h */ - U16 Reserved2; /* 22h */ } EVENT_DATA_SAS_DEVICE_STATUS_CHANGE, MPI_POINTER PTR_EVENT_DATA_SAS_DEVICE_STATUS_CHANGE, MpiEventDataSasDeviceStatusChange_t, MPI_POINTER pMpiEventDataSasDeviceStatusChange_t; /* MPI SAS Device Status Change Event data ReasonCode values */ -#define MPI_EVENT_SAS_DEV_STAT_RC_ADDED (0x03) -#define MPI_EVENT_SAS_DEV_STAT_RC_NOT_RESPONDING (0x04) -#define MPI_EVENT_SAS_DEV_STAT_RC_SMART_DATA (0x05) -#define MPI_EVENT_SAS_DEV_STAT_RC_NO_PERSIST_ADDED (0x06) -#define MPI_EVENT_SAS_DEV_STAT_RC_UNSUPPORTED (0x07) -#define MPI_EVENT_SAS_DEV_STAT_RC_INTERNAL_DEVICE_RESET (0x08) -#define MPI_EVENT_SAS_DEV_STAT_RC_TASK_ABORT_INTERNAL (0x09) -#define MPI_EVENT_SAS_DEV_STAT_RC_ABORT_TASK_SET_INTERNAL (0x0A) -#define MPI_EVENT_SAS_DEV_STAT_RC_CLEAR_TASK_SET_INTERNAL (0x0B) -#define MPI_EVENT_SAS_DEV_STAT_RC_QUERY_TASK_INTERNAL (0x0C) +#define MPI_EVENT_SAS_DEV_STAT_RC_ADDED (0x03) +#define MPI_EVENT_SAS_DEV_STAT_RC_NOT_RESPONDING (0x04) +#define MPI_EVENT_SAS_DEV_STAT_RC_SMART_DATA (0x05) +#define MPI_EVENT_SAS_DEV_STAT_RC_NO_PERSIST_ADDED (0x06) +#define MPI_EVENT_SAS_DEV_STAT_RC_UNSUPPORTED (0x07) +#define MPI_EVENT_SAS_DEV_STAT_RC_INTERNAL_DEVICE_RESET (0x08) /* SCSI Event data for Queue Full event */ @@ -765,27 +742,6 @@ typedef struct _EVENT_DATA_SAS_SES } EVENT_DATA_SAS_SES, MPI_POINTER PTR_EVENT_DATA_SAS_SES, MpiEventDataSasSes_t, MPI_POINTER pMpiEventDataSasSes_t; -/* SAS Broadcast Primitive Event data */ - -typedef struct _EVENT_DATA_SAS_BROADCAST_PRIMITIVE -{ - U8 PhyNum; /* 00h */ - U8 Port; /* 01h */ - U8 PortWidth; /* 02h */ - U8 Primitive; /* 04h */ -} EVENT_DATA_SAS_BROADCAST_PRIMITIVE, - MPI_POINTER PTR_EVENT_DATA_SAS_BROADCAST_PRIMITIVE, - MpiEventDataSasBroadcastPrimitive_t, - MPI_POINTER pMpiEventDataSasBroadcastPrimitive_t; - -#define MPI_EVENT_PRIMITIVE_CHANGE (0x01) -#define MPI_EVENT_PRIMITIVE_EXPANDER (0x03) -#define MPI_EVENT_PRIMITIVE_RESERVED2 (0x04) -#define MPI_EVENT_PRIMITIVE_RESERVED3 (0x05) -#define MPI_EVENT_PRIMITIVE_RESERVED4 (0x06) -#define MPI_EVENT_PRIMITIVE_CHANGE0_RESERVED (0x07) -#define MPI_EVENT_PRIMITIVE_CHANGE1_RESERVED (0x08) - /* SAS Phy Link Status Event data */ typedef struct _EVENT_DATA_SAS_PHY_LINK_STATUS @@ -848,53 +804,6 @@ typedef struct _EVENT_DATA_DISCOVERY_ERROR #define MPI_EVENT_DSCVRY_ERR_DS_MULTPL_PATHS (0x00000800) #define MPI_EVENT_DSCVRY_ERR_DS_MAX_SATA_TARGETS (0x00001000) -/* SAS SMP Error Event data */ - -typedef struct _EVENT_DATA_SAS_SMP_ERROR -{ - U8 Status; /* 00h */ - U8 Port; /* 01h */ - U8 SMPFunctionResult; /* 02h */ - U8 Reserved1; /* 03h */ - U64 SASAddress; /* 04h */ -} EVENT_DATA_SAS_SMP_ERROR, MPI_POINTER PTR_EVENT_DATA_SAS_SMP_ERROR, - MpiEventDataSasSmpError_t, MPI_POINTER pMpiEventDataSasSmpError_t; - -/* defines for the Status field of the SAS SMP Error event */ -#define MPI_EVENT_SAS_SMP_FUNCTION_RESULT_VALID (0x00) -#define MPI_EVENT_SAS_SMP_CRC_ERROR (0x01) -#define MPI_EVENT_SAS_SMP_TIMEOUT (0x02) -#define MPI_EVENT_SAS_SMP_NO_DESTINATION (0x03) -#define MPI_EVENT_SAS_SMP_BAD_DESTINATION (0x04) - -/* SAS Initiator Device Status Change Event data */ - -typedef struct _EVENT_DATA_SAS_INIT_DEV_STATUS_CHANGE -{ - U8 ReasonCode; /* 00h */ - U8 Port; /* 01h */ - U16 DevHandle; /* 02h */ - U64 SASAddress; /* 04h */ -} EVENT_DATA_SAS_INIT_DEV_STATUS_CHANGE, - MPI_POINTER PTR_EVENT_DATA_SAS_INIT_DEV_STATUS_CHANGE, - MpiEventDataSasInitDevStatusChange_t, - MPI_POINTER pMpiEventDataSasInitDevStatusChange_t; - -/* defines for the ReasonCode field of the SAS Initiator Device Status Change event */ -#define MPI_EVENT_SAS_INIT_RC_ADDED (0x01) - -/* SAS Initiator Device Table Overflow Event data */ - -typedef struct _EVENT_DATA_SAS_INIT_TABLE_OVERFLOW -{ - U8 MaxInit; /* 00h */ - U8 CurrentInit; /* 01h */ - U16 Reserved1; /* 02h */ -} EVENT_DATA_SAS_INIT_TABLE_OVERFLOW, - MPI_POINTER PTR_EVENT_DATA_SAS_INIT_TABLE_OVERFLOW, - MpiEventDataSasInitTableOverflow_t, - MPI_POINTER pMpiEventDataSasInitTableOverflow_t; - /***************************************************************************** * @@ -1104,6 +1013,5 @@ typedef struct _MPI_EXT_IMAGE_HEADER #define MPI_EXT_IMAGE_TYPE_FW (0x01) #define MPI_EXT_IMAGE_TYPE_NVDATA (0x03) #define MPI_EXT_IMAGE_TYPE_BOOTLOADER (0x04) -#define MPI_EXT_IMAGE_TYPE_INITIALIZATION (0x05) #endif diff --git a/drivers/message/fusion/lsi/mpi_log_sas.h b/drivers/message/fusion/lsi/mpi_log_sas.h index 871ebc08b..9259d1ad6 100644 --- a/drivers/message/fusion/lsi/mpi_log_sas.h +++ b/drivers/message/fusion/lsi/mpi_log_sas.h @@ -3,18 +3,43 @@ * * * Copyright 2003 LSI Logic Corporation. All rights reserved. * * * - * Description * - * ------------ * - * This include file contains SAS firmware interface IOC Log Info codes * + * This file is confidential and a trade secret of LSI Logic. The * + * receipt of or possession of this file does not convey any rights to * + * reproduce or disclose its contents or to manufacture, use, or sell * + * anything it may describe, in whole, or in part, without the specific * + * written consent of LSI Logic Corporation. * * * - *-------------------------------------------------------------------------* + *************************************************************************** + * + * Name: iopiIocLogInfo.h + * Title: SAS Firmware IOP Interface IOC Log Info Definitions + * Programmer: Guy Kendall + * Creation Date: September 24, 2003 + * + * Version History + * --------------- + * + * Last Updated + * ------------- + * Version %version: 22 % + * Date Updated %date_modified: % + * Programmer %created_by: nperucca % + * + * Date Who Description + * -------- --- ------------------------------------------------------- + * 09/24/03 GWK Initial version + * + * + * Description + * ------------ + * This include file contains SAS firmware interface IOC Log Info codes + * + *------------------------------------------------------------------------- */ #ifndef IOPI_IOCLOGINFO_H_INCLUDED #define IOPI_IOCLOGINFO_H_INCLUDED -#define SAS_LOGINFO_NEXUS_LOSS 0x31170000 -#define SAS_LOGINFO_MASK 0xFFFF0000 /****************************************************************************/ /* IOC LOGINFO defines, 0x00000000 - 0x0FFFFFFF */ @@ -32,8 +57,6 @@ #define IOC_LOGINFO_ORIGINATOR_PL (0x01000000) #define IOC_LOGINFO_ORIGINATOR_IR (0x02000000) -#define IOC_LOGINFO_ORIGINATOR_MASK (0x0F000000) - /****************************************************************************/ /* LOGINFO_CODE defines */ /****************************************************************************/ @@ -53,32 +76,13 @@ #define IOP_LOGINFO_CODE_CONFIG_INVALID_PAGE_DNM (0x00030500) /* Device Not Mapped */ #define IOP_LOGINFO_CODE_CONFIG_INVALID_PAGE_PERSIST (0x00030600) /* Persistent Page not found */ #define IOP_LOGINFO_CODE_CONFIG_INVALID_PAGE_DEFAULT (0x00030700) /* Default Page not found */ - -#define IOP_LOGINFO_CODE_DIAG_MSG_ERROR (0x00040000) /* Error handling diag msg - or'd with diag status */ - #define IOP_LOGINFO_CODE_TASK_TERMINATED (0x00050000) -#define IOP_LOGINFO_CODE_ENCL_MGMT_READ_ACTION_ERR0R (0x00060001) /* Read Action not supported for SEP msg */ -#define IOP_LOGINFO_CODE_ENCL_MGMT_INVALID_BUS_ID_ERR0R (0x00060002) /* Invalid Bus/ID in SEP msg */ - -#define IOP_LOGINFO_CODE_TARGET_ASSIST_TERMINATED (0x00070001) -#define IOP_LOGINFO_CODE_TARGET_STATUS_SEND_TERMINATED (0x00070002) -#define IOP_LOGINFO_CODE_TARGET_MODE_ABORT_ALL_IO (0x00070003) -#define IOP_LOGINFO_CODE_TARGET_MODE_ABORT_EXACT_IO (0x00070004) -#define IOP_LOGINFO_CODE_TARGET_MODE_ABORT_EXACT_IO_REQ (0x00070005) /****************************************************************************/ /* PL LOGINFO_CODE defines, valid if IOC_LOGINFO_ORIGINATOR = PL */ /****************************************************************************/ #define PL_LOGINFO_CODE_OPEN_FAILURE (0x00010000) -#define PL_LOG_INFO_CODE_OPEN_FAILURE_NO_DEST_TIME_OUT (0x00010001) -#define PL_LOGINFO_CODE_OPEN_FAILURE_BAD_DESTINATION (0x00010011) -#define PL_LOGINFO_CODE_OPEN_FAILURE_PROTOCOL_NOT_SUPPORTED (0x00010013) -#define PL_LOGINFO_CODE_OPEN_FAILURE_STP_RESOURCES_BSY (0x00010018) -#define PL_LOGINFO_CODE_OPEN_FAILURE_WRONG_DESTINATION (0x00010019) -#define PL_LOGINFO_CODE_OPEN_FAILURE_ORR_TIMEOUT (0X0001001A) -#define PL_LOGINFO_CODE_OPEN_FAILURE_PATHWAY_BLOCKED (0x0001001B) -#define PL_LOGINFO_CODE_OPEN_FAILURE_AWT_MAXED (0x0001001C) #define PL_LOGINFO_CODE_INVALID_SGL (0x00020000) #define PL_LOGINFO_CODE_WRONG_REL_OFF_OR_FRAME_LENGTH (0x00030000) #define PL_LOGINFO_CODE_FRAME_XFER_ERROR (0x00040000) @@ -93,7 +97,6 @@ #define PL_LOGINFO_CODE_SATA_LINK_DOWN (0x000D0000) #define PL_LOGINFO_CODE_DISCOVERY_SATA_INIT_W_IOS (0x000E0000) #define PL_LOGINFO_CODE_CONFIG_INVALID_PAGE (0x000F0000) -#define PL_LOGINFO_CODE_CONFIG_PL_NOT_INITIALIZED (0x000F0001) /* PL not yet initialized, can't do config page req. */ #define PL_LOGINFO_CODE_CONFIG_INVALID_PAGE_PT (0x000F0100) /* Invalid Page Type */ #define PL_LOGINFO_CODE_CONFIG_INVALID_PAGE_NUM_PHYS (0x000F0200) /* Invalid Number of Phys */ #define PL_LOGINFO_CODE_CONFIG_INVALID_PAGE_NOT_IMP (0x000F0300) /* Case Not Handled */ @@ -102,24 +105,11 @@ #define PL_LOGINFO_CODE_CONFIG_INVALID_PAGE_PHY (0x000F0600) /* Invalid Phy */ #define PL_LOGINFO_CODE_CONFIG_INVALID_PAGE_NO_OWNER (0x000F0700) /* No Owner Found */ #define PL_LOGINFO_CODE_DSCVRY_SATA_INIT_TIMEOUT (0x00100000) -#define PL_LOGINFO_CODE_RESET (0x00110000) /* See Sub-Codes below */ -#define PL_LOGINFO_CODE_ABORT (0x00120000) /* See Sub-Codes below */ +#define PL_LOGINFO_CODE_RESET (0x00110000) +#define PL_LOGINFO_CODE_ABORT (0x00120000) #define PL_LOGINFO_CODE_IO_NOT_YET_EXECUTED (0x00130000) #define PL_LOGINFO_CODE_IO_EXECUTED (0x00140000) -#define PL_LOGINFO_CODE_PERS_RESV_OUT_NOT_AFFIL_OWNER (0x00150000) -#define PL_LOGINFO_CODE_OPEN_TXDMA_ABORT (0x00160000) -#define PL_LOGINFO_CODE_IO_DEVICE_MISSING_DELAY_RETRY (0x00170000) #define PL_LOGINFO_SUB_CODE_OPEN_FAILURE (0x00000100) -#define PL_LOGINFO_SUB_CODE_OPEN_FAILURE_NO_DEST_TIMEOUT (0x00000101) -#define PL_LOGINFO_SUB_CODE_OPEN_FAILURE_ORR_TIMEOUT (0x0000011A) /* Open Reject (Retry) Timeout */ -#define PL_LOGINFO_SUB_CODE_OPEN_FAILURE_PATHWAY_BLOCKED (0x0000011B) -#define PL_LOGINFO_SUB_CODE_OPEN_FAILURE_AWT_MAXED (0x0000011C) /* Arbitration Wait Timer Maxed */ - -#define PL_LOGINFO_SUB_CODE_TARGET_BUS_RESET (0x00000120) -#define PL_LOGINFO_SUB_CODE_TRANSPORT_LAYER (0x00000130) /* Leave lower nibble (1-f) reserved. */ -#define PL_LOGINFO_SUB_CODE_PORT_LAYER (0x00000140) /* Leave lower nibble (1-f) reserved. */ - - #define PL_LOGINFO_SUB_CODE_INVALID_SGL (0x00000200) #define PL_LOGINFO_SUB_CODE_WRONG_REL_OFF_OR_FRAME_LENGTH (0x00000300) #define PL_LOGINFO_SUB_CODE_FRAME_XFER_ERROR (0x00000400) @@ -133,119 +123,36 @@ #define PL_LOGINFO_SUB_CODE_RX_FM_CURRENT_FRAME_ERROR (0x00000C00) #define PL_LOGINFO_SUB_CODE_SATA_LINK_DOWN (0x00000D00) #define PL_LOGINFO_SUB_CODE_DISCOVERY_SATA_INIT_W_IOS (0x00000E00) -#define PL_LOGINFO_SUB_CODE_DISCOVERY_REMOTE_SEP_RESET (0x00000E01) -#define PL_LOGINFO_SUB_CODE_SECOND_OPEN (0x00000F00) #define PL_LOGINFO_SUB_CODE_DSCVRY_SATA_INIT_TIMEOUT (0x00001000) #define PL_LOGINFO_CODE_ENCL_MGMT_SMP_FRAME_FAILURE (0x00200000) /* Can't get SMP Frame */ -#define PL_LOGINFO_CODE_ENCL_MGMT_SMP_READ_ERROR (0x00200010) /* Error occured on SMP Read */ -#define PL_LOGINFO_CODE_ENCL_MGMT_SMP_WRITE_ERROR (0x00200020) /* Error occured on SMP Write */ -#define PL_LOGINFO_CODE_ENCL_MGMT_NOT_SUPPORTED_ON_ENCL (0x00200040) /* Encl Mgmt services not available for this WWID */ -#define PL_LOGINFO_CODE_ENCL_MGMT_ADDR_MODE_NOT_SUPPORTED (0x00200050) /* Address Mode not suppored */ -#define PL_LOGINFO_CODE_ENCL_MGMT_BAD_SLOT_NUM (0x00200060) /* Invalid Slot Number in SEP Msg */ -#define PL_LOGINFO_CODE_ENCL_MGMT_SGPIO_NOT_PRESENT (0x00200070) /* SGPIO not present/enabled */ -#define PL_LOGINFO_CODE_ENCL_MGMT_GPIO_NOT_CONFIGURED (0x00200080) /* GPIO not configured */ -#define PL_LOGINFO_CODE_ENCL_MGMT_GPIO_FRAME_ERROR (0x00200090) /* GPIO can't allocate a frame */ -#define PL_LOGINFO_CODE_ENCL_MGMT_GPIO_CONFIG_PAGE_ERROR (0x002000A0) /* GPIO failed config page request */ -#define PL_LOGINFO_CODE_ENCL_MGMT_SES_FRAME_ALLOC_ERROR (0x002000B0) /* Can't get frame for SES command */ -#define PL_LOGINFO_CODE_ENCL_MGMT_SES_IO_ERROR (0x002000C0) /* I/O execution error */ -#define PL_LOGINFO_CODE_ENCL_MGMT_SES_RETRIES_EXHAUSTED (0x002000D0) /* SEP I/O retries exhausted */ -#define PL_LOGINFO_CODE_ENCL_MGMT_SMP_FRAME_ALLOC_ERROR (0x002000E0) /* Can't get frame for SMP command */ +#define PL_LOGINFO_CODE_ENCL_MGMT_SMP_READ_ERROR (0x00200001) /* Error occured on SMP Read */ +#define PL_LOGINFO_CODE_ENCL_MGMT_SMP_WRITE_ERROR (0x00200002) /* Error occured on SMP Write */ +#define PL_LOGINFO_CODE_ENCL_MGMT_NOT_SUPPORTED_ON_ENCL (0x00200004) /* Encl Mgmt services not available for this WWID */ +#define PL_LOGINFO_CODE_ENCL_MGMT_ADDR_MODE_NOT_SUPPORTED (0x00200005) /* Address Mode not suppored */ +#define PL_LOGINFO_CODE_ENCL_MGMT_BAD_SLOT_NUM (0x00200006) /* Invalid Slot Number in SEP Msg */ +#define PL_LOGINFO_CODE_ENCL_MGMT_SGPIO_NOT_PRESENT (0x00200007) /* SGPIO not present/enabled */ #define PL_LOGINFO_DA_SEP_NOT_PRESENT (0x00200100) /* SEP not present when msg received */ #define PL_LOGINFO_DA_SEP_SINGLE_THREAD_ERROR (0x00200101) /* Can only accept 1 msg at a time */ #define PL_LOGINFO_DA_SEP_ISTWI_INTR_IN_IDLE_STATE (0x00200102) /* ISTWI interrupt recvd. while IDLE */ #define PL_LOGINFO_DA_SEP_RECEIVED_NACK_FROM_SLAVE (0x00200103) /* SEP NACK'd, it is busy */ -#define PL_LOGINFO_DA_SEP_DID_NOT_RECEIVE_ACK (0x00200104) /* SEP didn't rcv. ACK (Last Rcvd Bit = 1) */ -#define PL_LOGINFO_DA_SEP_BAD_STATUS_HDR_CHKSUM (0x00200105) /* SEP stopped or sent bad chksum in Hdr */ -#define PL_LOGINFO_DA_SEP_STOP_ON_DATA (0x00200106) /* SEP stopped while transfering data */ -#define PL_LOGINFO_DA_SEP_STOP_ON_SENSE_DATA (0x00200107) /* SEP stopped while transfering sense data */ -#define PL_LOGINFO_DA_SEP_UNSUPPORTED_SCSI_STATUS_1 (0x00200108) /* SEP returned unknown scsi status */ -#define PL_LOGINFO_DA_SEP_UNSUPPORTED_SCSI_STATUS_2 (0x00200109) /* SEP returned unknown scsi status */ -#define PL_LOGINFO_DA_SEP_CHKSUM_ERROR_AFTER_STOP (0x0020010A) /* SEP returned bad chksum after STOP */ -#define PL_LOGINFO_DA_SEP_CHKSUM_ERROR_AFTER_STOP_GETDATA (0x0020010B) /* SEP returned bad chksum after STOP while gettin data*/ -#define PL_LOGINFO_DA_SEP_UNSUPPORTED_COMMAND (0x0020010C) /* SEP doesn't support CDB opcode */ +#define PL_LOGINFO_DA_SEP_BAD_STATUS_HDR_CHKSUM (0x00200104) /* SEP stopped or sent bad chksum in Hdr */ +#define PL_LOGINFO_DA_SEP_UNSUPPORTED_SCSI_STATUS_1 (0x00200105) /* SEP returned unknown scsi status */ +#define PL_LOGINFO_DA_SEP_UNSUPPORTED_SCSI_STATUS_2 (0x00200106) /* SEP returned unknown scsi status */ +#define PL_LOGINFO_DA_SEP_CHKSUM_ERROR_AFTER_STOP (0x00200107) /* SEP returned bad chksum after STOP */ +#define PL_LOGINFO_DA_SEP_CHKSUM_ERROR_AFTER_STOP_GETDATA (0x00200108) /* SEP returned bad chksum after STOP while gettin data*/ /****************************************************************************/ /* IR LOGINFO_CODE defines, valid if IOC_LOGINFO_ORIGINATOR = IR */ /****************************************************************************/ -#define IR_LOGINFO_RAID_ACTION_ERROR (0x00010000) -#define IR_LOGINFO_CODE_UNUSED2 (0x00020000) - -/* Amount of information passed down for Create Volume is too large */ -#define IR_LOGINFO_VOLUME_CREATE_INVALID_LENGTH (0x00010001) -/* Creation of duplicate volume attempted (Bus/Target ID checked) */ -#define IR_LOGINFO_VOLUME_CREATE_DUPLICATE (0x00010002) -/* Creation failed due to maximum number of supported volumes exceeded */ -#define IR_LOGINFO_VOLUME_CREATE_NO_SLOTS (0x00010003) -/* Creation failed due to DMA error in trying to read from host */ -#define IR_LOGINFO_VOLUME_CREATE_DMA_ERROR (0x00010004) -/* Creation failed due to invalid volume type passed down */ -#define IR_LOGINFO_VOLUME_CREATE_INVALID_VOLUME_TYPE (0x00010005) -/* Creation failed due to error reading MFG Page 4 */ -#define IR_LOGINFO_VOLUME_MFG_PAGE4_ERROR (0x00010006) -/* Creation failed when trying to create internal structures */ -#define IR_LOGINFO_VOLUME_INTERNAL_CONFIG_STRUCTURE_ERROR (0x00010007) - -/* Activation failed due to trying to activate an already active volume */ -#define IR_LOGINFO_VOLUME_ACTIVATING_AN_ACTIVE_VOLUME (0x00010010) -/* Activation failed due to trying to active unsupported volume type */ -#define IR_LOGINFO_VOLUME_ACTIVATING_INVALID_VOLUME_TYPE (0x00010011) -/* Activation failed due to trying to active too many volumes */ -#define IR_LOGINFO_VOLUME_ACTIVATING_TOO_MANY_VOLUMES (0x00010012) -/* Activation failed due to Volume ID in use already */ -#define IR_LOGINFO_VOLUME_ACTIVATING_VOLUME_ID_IN_USE (0x00010013) -/* Activation failed call to activateVolume returned failure */ -#define IR_LOGINFO_VOLUME_ACTIVATE_VOLUME_FAILED (0x00010014) -/* Activation failed trying to import the volume */ -#define IR_LOGINFO_VOLUME_ACTIVATING_IMPORT_VOLUME_FAILED (0x00010015) - -/* Phys Disk failed, too many phys disks */ -#define IR_LOGINFO_PHYSDISK_CREATE_TOO_MANY_DISKS (0x00010020) -/* Amount of information passed down for Create Pnysdisk is too large */ -#define IR_LOGINFO_PHYSDISK_CREATE_INVALID_LENGTH (0x00010021) -/* Creation failed due to DMA error in trying to read from host */ -#define IR_LOGINFO_PHYSDISK_CREATE_DMA_ERROR (0x00010022) -/* Creation failed due to invalid Bus TargetID passed down */ -#define IR_LOGINFO_PHYSDISK_CREATE_BUS_TID_INVALID (0x00010023) -/* Creation failed due to error in creating RAID Phys Disk Config Page */ -#define IR_LOGINFO_PHYSDISK_CREATE_CONFIG_PAGE_ERROR (0x00010024) - - -/* Compatibility Error : IR Disabled */ -#define IR_LOGINFO_COMPAT_ERROR_RAID_DISABLED (0x00010030) -/* Compatibility Error : Inquiry Comand failed */ -#define IR_LOGINFO_COMPAT_ERROR_INQUIRY_FAILED (0x00010031) -/* Compatibility Error : Device not direct access device */ -#define IR_LOGINFO_COMPAT_ERROR_NOT_DIRECT_ACCESS (0x00010032) -/* Compatibility Error : Removable device found */ -#define IR_LOGINFO_COMPAT_ERROR_REMOVABLE_FOUND (0x00010033) -/* Compatibility Error : Device SCSI Version not 2 or higher */ -#define IR_LOGINFO_COMPAT_ERROR_NEED_SCSI_2_OR_HIGHER (0x00010034) -/* Compatibility Error : SATA device, 48 BIT LBA not supported */ -#define IR_LOGINFO_COMPAT_ERROR_SATA_48BIT_LBA_NOT_SUPPORTED (0x00010035) -/* Compatibility Error : Device does not have 512 byte block sizes */ -#define IR_LOGINFO_COMPAT_ERROR_DEVICE_NOT_512_BYTE_BLOCK (0x00010036) -/* Compatibility Error : Volume Type check failed */ -#define IR_LOGINFO_COMPAT_ERROR_VOLUME_TYPE_CHECK_FAILED (0x00010037) -/* Compatibility Error : Volume Type is unsupported by FW */ -#define IR_LOGINFO_COMPAT_ERROR_UNSUPPORTED_VOLUME_TYPE (0x00010038) -/* Compatibility Error : Disk drive too small for use in volume */ -#define IR_LOGINFO_COMPAT_ERROR_DISK_TOO_SMALL (0x00010039) -/* Compatibility Error : Phys disk for Create Volume not found */ -#define IR_LOGINFO_COMPAT_ERROR_PHYS_DISK_NOT_FOUND (0x0001003A) -/* Compatibility Error : membership count error, too many or too few disks for volume type */ -#define IR_LOGINFO_COMPAT_ERROR_MEMBERSHIP_COUNT (0x0001003B) -/* Compatibility Error : Disk stripe sizes must be 64KB */ -#define IR_LOGINFO_COMPAT_ERROR_NON_64K_STRIPE_SIZE (0x0001003C) -/* Compatibility Error : IME size limited to < 2TB */ -#define IR_LOGINFO_COMPAT_ERROR_IME_VOL_NOT_CURRENTLY_SUPPORTED (0x0001003D) - +#define IR_LOGINFO_CODE_UNUSED1 (0x00010000) +#define IR_LOGINFO_CODE_UNUSED2 (0x00020000) /****************************************************************************/ -/* Defines for convenience */ +/* Defines for convienence */ /****************************************************************************/ #define IOC_LOGINFO_PREFIX_IOP ((MPI_IOCLOGINFO_TYPE_SAS << MPI_IOCLOGINFO_TYPE_SHIFT) | IOC_LOGINFO_ORIGINATOR_IOP) #define IOC_LOGINFO_PREFIX_PL ((MPI_IOCLOGINFO_TYPE_SAS << MPI_IOCLOGINFO_TYPE_SHIFT) | IOC_LOGINFO_ORIGINATOR_PL) diff --git a/drivers/message/fusion/lsi/mpi_sas.h b/drivers/message/fusion/lsi/mpi_sas.h index 50b8f0a8f..70514867b 100644 --- a/drivers/message/fusion/lsi/mpi_sas.h +++ b/drivers/message/fusion/lsi/mpi_sas.h @@ -6,7 +6,7 @@ * Title: MPI Serial Attached SCSI structures and definitions * Creation Date: August 19, 2004 * - * mpi_sas.h Version: 01.05.03 + * mpi_sas.h Version: 01.05.02 * * Version History * --------------- @@ -17,10 +17,6 @@ * 08-30-05 01.05.02 Added DeviceInfo bit for SEP. * Added PrimFlags and Primitive field to SAS IO Unit * Control request, and added a new operation code. - * 03-27-06 01.05.03 Added Force Full Discovery, Transmit Port Select Signal, - * and Remove Device operations to SAS IO Unit Control. - * Added DevHandle field to SAS IO Unit Control request and - * reply. * -------------------------------------------------------------------------- */ @@ -213,7 +209,7 @@ typedef struct _MSG_SAS_IOUNIT_CONTROL_REQUEST U8 Reserved1; /* 01h */ U8 ChainOffset; /* 02h */ U8 Function; /* 03h */ - U16 DevHandle; /* 04h */ + U16 Reserved2; /* 04h */ U8 Reserved3; /* 06h */ U8 MsgFlags; /* 07h */ U32 MsgContext; /* 08h */ @@ -235,9 +231,6 @@ typedef struct _MSG_SAS_IOUNIT_CONTROL_REQUEST #define MPI_SAS_OP_PHY_CLEAR_ERROR_LOG (0x08) #define MPI_SAS_OP_MAP_CURRENT (0x09) #define MPI_SAS_OP_SEND_PRIMITIVE (0x0A) -#define MPI_SAS_OP_FORCE_FULL_DISCOVERY (0x0B) -#define MPI_SAS_OP_TRANSMIT_PORT_SELECT_SIGNAL (0x0C) -#define MPI_SAS_OP_TRANSMIT_REMOVE_DEVICE (0x0D) /* values for the PrimFlags field */ #define MPI_SAS_PRIMFLAGS_SINGLE (0x08) @@ -252,7 +245,7 @@ typedef struct _MSG_SAS_IOUNIT_CONTROL_REPLY U8 Reserved1; /* 01h */ U8 MsgLength; /* 02h */ U8 Function; /* 03h */ - U16 DevHandle; /* 04h */ + U16 Reserved2; /* 04h */ U8 Reserved3; /* 06h */ U8 MsgFlags; /* 07h */ U32 MsgContext; /* 08h */ diff --git a/drivers/message/fusion/lsi/mpi_targ.h b/drivers/message/fusion/lsi/mpi_targ.h index 20b667315..3f462859c 100644 --- a/drivers/message/fusion/lsi/mpi_targ.h +++ b/drivers/message/fusion/lsi/mpi_targ.h @@ -6,7 +6,7 @@ * Title: MPI Target mode messages and structures * Creation Date: June 22, 2000 * - * mpi_targ.h Version: 01.05.06 + * mpi_targ.h Version: 01.05.05 * * Version History * --------------- @@ -54,7 +54,6 @@ * 02-22-05 01.05.03 Changed a comment. * 03-11-05 01.05.04 Removed TargetAssistExtended Request. * 06-24-05 01.05.05 Added TargetAssistExtended structures and defines. - * 03-27-06 01.05.06 Added a comment. * -------------------------------------------------------------------------- */ @@ -352,7 +351,7 @@ typedef struct _MSG_TARGET_ASSIST_REQUEST #define TARGET_ASSIST_FLAGS_CONFIRMED (0x08) #define TARGET_ASSIST_FLAGS_REPOST_CMD_BUFFER (0x80) -/* Standard Target Mode Reply message */ + typedef struct _MSG_TARGET_ERROR_REPLY { U16 Reserved; /* 00h */ diff --git a/drivers/message/fusion/mptbase.c b/drivers/message/fusion/mptbase.c index 6a035959c..642a61b6d 100644 --- a/drivers/message/fusion/mptbase.c +++ b/drivers/message/fusion/mptbase.c @@ -46,6 +46,7 @@ */ /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ +#include #include #include #include @@ -62,6 +63,9 @@ #ifdef CONFIG_MTRR #include #endif +#ifdef __sparc__ +#include /* needed for __irq_itoa() proto */ +#endif #include "mptbase.h" @@ -73,7 +77,6 @@ MODULE_AUTHOR(MODULEAUTHOR); MODULE_DESCRIPTION(my_NAME); MODULE_LICENSE("GPL"); -MODULE_VERSION(MPT_LINUX_VERSION_COMMON); /* * cmd line parameters @@ -177,7 +180,6 @@ static void mpt_sp_ioc_info(MPT_ADAPTER *ioc, u32 ioc_status, MPT_FRAME_HDR *mf) static void mpt_fc_log_info(MPT_ADAPTER *ioc, u32 log_info); static void mpt_spi_log_info(MPT_ADAPTER *ioc, u32 log_info); static void mpt_sas_log_info(MPT_ADAPTER *ioc, u32 log_info); -static int mpt_read_ioc_pg_3(MPT_ADAPTER *ioc); /* module entry point */ static int __init fusion_init (void); @@ -369,21 +371,20 @@ static irqreturn_t mpt_interrupt(int irq, void *bus_id, struct pt_regs *r) { MPT_ADAPTER *ioc = bus_id; - u32 pa = CHIPREG_READ32_dmasync(&ioc->chip->ReplyFifo); - - if (pa == 0xFFFFFFFF) - return IRQ_NONE; + u32 pa; /* * Drain the reply FIFO! */ - do { - if (pa & MPI_ADDRESS_REPLY_A_BIT) + while (1) { + pa = CHIPREG_READ32_dmasync(&ioc->chip->ReplyFifo); + if (pa == 0xFFFFFFFF) + return IRQ_HANDLED; + else if (pa & MPI_ADDRESS_REPLY_A_BIT) mpt_reply(ioc, pa); else mpt_turbo_reply(ioc, pa); - pa = CHIPREG_READ32_dmasync(&ioc->chip->ReplyFifo); - } while (pa != 0xFFFFFFFF); + } return IRQ_HANDLED; } @@ -427,7 +428,7 @@ mpt_base_reply(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *reply) results = ProcessEventNotification(ioc, pEvReply, &evHandlers); if (results != evHandlers) { /* CHECKME! Any special handling needed here? */ - devtverboseprintk((MYIOC_s_WARN_FMT "Called %d event handlers, sum results = %d\n", + devtprintk((MYIOC_s_WARN_FMT "Called %d event handlers, sum results = %d\n", ioc->name, evHandlers, results)); } @@ -437,8 +438,10 @@ mpt_base_reply(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *reply) */ if (pEvReply->MsgFlags & MPI_MSGFLAGS_CONTINUATION_REPLY) { freereq = 0; + devtprintk((MYIOC_s_WARN_FMT "EVENT_NOTIFICATION reply %p does not return Request frame\n", + ioc->name, pEvReply)); } else { - devtverboseprintk((MYIOC_s_WARN_FMT "EVENT_NOTIFICATION reply %p returns Request frame\n", + devtprintk((MYIOC_s_WARN_FMT "EVENT_NOTIFICATION reply %p returns Request frame\n", ioc->name, pEvReply)); } @@ -677,19 +680,19 @@ int mpt_device_driver_register(struct mpt_pci_driver * dd_cbfunc, int cb_idx) { MPT_ADAPTER *ioc; - const struct pci_device_id *id; - if (cb_idx < 1 || cb_idx >= MPT_MAX_PROTOCOL_DRIVERS) + if (cb_idx < 1 || cb_idx >= MPT_MAX_PROTOCOL_DRIVERS) { return -EINVAL; + } MptDeviceDriverHandlers[cb_idx] = dd_cbfunc; /* call per pci device probe entry point */ list_for_each_entry(ioc, &ioc_list, list) { - id = ioc->pcidev->driver ? - ioc->pcidev->driver->id_table : NULL; - if (dd_cbfunc->probe) - dd_cbfunc->probe(ioc->pcidev, id); + if(dd_cbfunc->probe) { + dd_cbfunc->probe(ioc->pcidev, + ioc->pcidev->driver->id_table); + } } return 0; @@ -1055,8 +1058,9 @@ mpt_host_page_alloc(MPT_ADAPTER *ioc, pIOCInit_t ioc_init) dinitprintk((MYIOC_s_INFO_FMT "host_page_buffer @ %p, dma @ %x, sz=%d bytes\n", - ioc->name, ioc->HostPageBuffer, - (u32)ioc->HostPageBuffer_dma, + ioc->name, + ioc->HostPageBuffer, + ioc->HostPageBuffer_dma, host_page_buffer_sz)); ioc->alloc_total += host_page_buffer_sz; ioc->HostPageBuffer_sz = host_page_buffer_sz; @@ -1116,6 +1120,65 @@ mpt_verify_adapter(int iocid, MPT_ADAPTER **iocpp) return -1; } +int +mpt_alt_ioc_wait(MPT_ADAPTER *ioc) +{ + int loop_count = 30 * 4; /* Wait 30 seconds */ + int status = -1; /* -1 means failed to get board READY */ + + do { + spin_lock(&ioc->initializing_hba_lock); + if (ioc->initializing_hba_lock_flag == 0) { + ioc->initializing_hba_lock_flag=1; + spin_unlock(&ioc->initializing_hba_lock); + status = 0; + break; + } + spin_unlock(&ioc->initializing_hba_lock); + set_current_state(TASK_INTERRUPTIBLE); + schedule_timeout(HZ/4); + } while (--loop_count); + + return status; +} + +/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ +/* + * mpt_bringup_adapter - This is a wrapper function for mpt_do_ioc_recovery + * @ioc: Pointer to MPT adapter structure + * @sleepFlag: Use schedule if CAN_SLEEP else use udelay. + * + * This routine performs all the steps necessary to bring the IOC + * to a OPERATIONAL state. + * + * Special Note: This function was added with spin lock's so as to allow + * the dv(domain validation) work thread to succeed on the other channel + * that maybe occuring at the same time when this function is called. + * Without this lock, the dv would fail when message frames were + * requested during hba bringup on the alternate ioc. + */ +static int +mpt_bringup_adapter(MPT_ADAPTER *ioc, int sleepFlag) +{ + int r; + + if(ioc->alt_ioc) { + if((r=mpt_alt_ioc_wait(ioc->alt_ioc)!=0)) + return r; + } + + r = mpt_do_ioc_recovery(ioc, MPT_HOSTEVENT_IOC_BRINGUP, + CAN_SLEEP); + + if(ioc->alt_ioc) { + spin_lock(&ioc->alt_ioc->initializing_hba_lock); + ioc->alt_ioc->initializing_hba_lock_flag=0; + spin_unlock(&ioc->alt_ioc->initializing_hba_lock); + } + +return r; +} + /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ /* * mpt_attach - Install a PCI intelligent MPT adapter. @@ -1183,6 +1246,8 @@ mpt_attach(struct pci_dev *pdev, const struct pci_device_id *id) ioc->pcidev = pdev; ioc->diagPending = 0; spin_lock_init(&ioc->diagLock); + spin_lock_init(&ioc->fc_rescan_work_lock); + spin_lock_init(&ioc->fc_rport_lock); spin_lock_init(&ioc->initializing_hba_lock); /* Initialize the event logging. @@ -1218,25 +1283,31 @@ mpt_attach(struct pci_dev *pdev, const struct pci_device_id *id) port = psize = 0; for (ii=0; ii < DEVICE_COUNT_RESOURCE; ii++) { if (pci_resource_flags(pdev, ii) & PCI_BASE_ADDRESS_SPACE_IO) { - if (psize) - continue; /* Get I/O space! */ port = pci_resource_start(pdev, ii); psize = pci_resource_len(pdev,ii); } else { - if (msize) - continue; /* Get memmap */ mem_phys = pci_resource_start(pdev, ii); msize = pci_resource_len(pdev,ii); + break; } } ioc->mem_size = msize; + if (ii == DEVICE_COUNT_RESOURCE) { + printk(KERN_ERR MYNAM ": ERROR - MPT adapter has no memory regions defined!\n"); + kfree(ioc); + return -EINVAL; + } + + dinitprintk((KERN_INFO MYNAM ": MPT adapter @ %lx, msize=%dd bytes\n", mem_phys, msize)); + dinitprintk((KERN_INFO MYNAM ": (port i/o @ %lx, psize=%dd bytes)\n", port, psize)); + mem = NULL; /* Get logical ptr for PciMem0 space */ /*mem = ioremap(mem_phys, msize);*/ - mem = ioremap(mem_phys, msize); + mem = ioremap(mem_phys, 0x100); if (mem == NULL) { printk(KERN_ERR MYNAM ": ERROR - Unable to map adapter memory!\n"); kfree(ioc); @@ -1336,6 +1407,11 @@ mpt_attach(struct pci_dev *pdev, const struct pci_device_id *id) ioc->bus_type = SAS; ioc->errata_flag_1064 = 1; } + else if (pdev->device == MPI_MANUFACTPAGE_DEVID_SAS1066) { + ioc->prod_name = "LSISAS1066"; + ioc->bus_type = SAS; + ioc->errata_flag_1064 = 1; + } else if (pdev->device == MPI_MANUFACTPAGE_DEVID_SAS1068) { ioc->prod_name = "LSISAS1068"; ioc->bus_type = SAS; @@ -1345,12 +1421,12 @@ mpt_attach(struct pci_dev *pdev, const struct pci_device_id *id) ioc->prod_name = "LSISAS1064E"; ioc->bus_type = SAS; } - else if (pdev->device == MPI_MANUFACTPAGE_DEVID_SAS1068E) { - ioc->prod_name = "LSISAS1068E"; + else if (pdev->device == MPI_MANUFACTPAGE_DEVID_SAS1066E) { + ioc->prod_name = "LSISAS1066E"; ioc->bus_type = SAS; } - else if (pdev->device == MPI_MANUFACTPAGE_DEVID_SAS1078) { - ioc->prod_name = "LSISAS1078"; + else if (pdev->device == MPI_MANUFACTPAGE_DEVID_SAS1068E) { + ioc->prod_name = "LSISAS1068E"; ioc->bus_type = SAS; } @@ -1369,17 +1445,52 @@ mpt_attach(struct pci_dev *pdev, const struct pci_device_id *id) /* Set lookup ptr. */ list_add_tail(&ioc->list, &ioc_list); + ioc->pci_irq = -1; + if (pdev->irq) { + if (mpt_msi_enable && !pci_enable_msi(pdev)) + printk(MYIOC_s_INFO_FMT "PCI-MSI enabled\n", ioc->name); + + r = request_irq(pdev->irq, mpt_interrupt, SA_SHIRQ, ioc->name, ioc); + + if (r < 0) { +#ifndef __sparc__ + printk(MYIOC_s_ERR_FMT "Unable to allocate interrupt %d!\n", + ioc->name, pdev->irq); +#else + printk(MYIOC_s_ERR_FMT "Unable to allocate interrupt %s!\n", + ioc->name, __irq_itoa(pdev->irq)); +#endif + list_del(&ioc->list); + iounmap(mem); + kfree(ioc); + return -EBUSY; + } + + ioc->pci_irq = pdev->irq; + + pci_set_master(pdev); /* ?? */ + pci_set_drvdata(pdev, ioc); + +#ifndef __sparc__ + dprintk((KERN_INFO MYNAM ": %s installed at interrupt %d\n", ioc->name, pdev->irq)); +#else + dprintk((KERN_INFO MYNAM ": %s installed at interrupt %s\n", ioc->name, __irq_itoa(pdev->irq))); +#endif + } + /* Check for "bound ports" (929, 929X, 1030, 1035) to reduce redundant resets. */ mpt_detect_bound_ports(ioc, pdev); - if ((r = mpt_do_ioc_recovery(ioc, MPT_HOSTEVENT_IOC_BRINGUP, - CAN_SLEEP)) != 0){ + if ((r = mpt_bringup_adapter(ioc, CAN_SLEEP)) != 0){ printk(KERN_WARNING MYNAM ": WARNING - %s did not initialize properly! (%d)\n", ioc->name, r); list_del(&ioc->list); + free_irq(ioc->pci_irq, ioc); + if (mpt_msi_enable) + pci_disable_msi(pdev); if (ioc->alt_ioc) ioc->alt_ioc->alt_ioc = NULL; iounmap(mem); @@ -1518,6 +1629,7 @@ mpt_resume(struct pci_dev *pdev) MPT_ADAPTER *ioc = pci_get_drvdata(pdev); u32 device_state = pdev->current_state; int recovery_state; + int ii; printk(MYIOC_s_INFO_FMT "pci-resume: pdev=0x%p, slot=%s, Previous operating state [D%d]\n", @@ -1531,6 +1643,14 @@ mpt_resume(struct pci_dev *pdev) CHIPREG_WRITE32(&ioc->chip->IntMask, MPI_HIM_DIM); ioc->active = 1; + /* F/W not running */ + if(!CHIPREG_READ32(&ioc->chip->Doorbell)) { + /* enable domain validation flags */ + for (ii=0; ii < MPT_MAX_SCSI_DEVICES; ii++) { + ioc->spi_data.dvStatus[ii] |= MPT_SCSICFG_NEED_DV; + } + } + printk(MYIOC_s_INFO_FMT "pci-resume: ioc-state=0x%x,doorbell=0x%x\n", ioc->name, @@ -1552,21 +1672,6 @@ mpt_resume(struct pci_dev *pdev) } #endif -static int -mpt_signal_reset(int index, MPT_ADAPTER *ioc, int reset_phase) -{ - if ((MptDriverClass[index] == MPTSPI_DRIVER && - ioc->bus_type != SPI) || - (MptDriverClass[index] == MPTFC_DRIVER && - ioc->bus_type != FC) || - (MptDriverClass[index] == MPTSAS_DRIVER && - ioc->bus_type != SAS)) - /* make sure we only call the relevant reset handler - * for the bus */ - return 0; - return (MptResetHandlers[index])(ioc, reset_phase); -} - /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ /* * mpt_do_ioc_recovery - Initialize or recover MPT adapter. @@ -1598,7 +1703,6 @@ mpt_do_ioc_recovery(MPT_ADAPTER *ioc, u32 reason, int sleepFlag) int handlers; int ret = 0; int reset_alt_ioc_active = 0; - int irq_allocated = 0; printk(KERN_INFO MYNAM ": Initiating %s %s\n", ioc->name, reason==MPT_HOSTEVENT_IOC_BRINGUP ? "bringup" : "recovery"); @@ -1682,36 +1786,6 @@ mpt_do_ioc_recovery(MPT_ADAPTER *ioc, u32 reason, int sleepFlag) } } - /* - * Device is reset now. It must have de-asserted the interrupt line - * (if it was asserted) and it should be safe to register for the - * interrupt now. - */ - if ((ret == 0) && (reason == MPT_HOSTEVENT_IOC_BRINGUP)) { - ioc->pci_irq = -1; - if (ioc->pcidev->irq) { - if (mpt_msi_enable && !pci_enable_msi(ioc->pcidev)) - printk(MYIOC_s_INFO_FMT "PCI-MSI enabled\n", - ioc->name); - rc = request_irq(ioc->pcidev->irq, mpt_interrupt, - IRQF_SHARED, ioc->name, ioc); - if (rc < 0) { - printk(MYIOC_s_ERR_FMT "Unable to allocate " - "interrupt %d!\n", ioc->name, - ioc->pcidev->irq); - if (mpt_msi_enable) - pci_disable_msi(ioc->pcidev); - return -EBUSY; - } - irq_allocated = 1; - ioc->pci_irq = ioc->pcidev->irq; - pci_set_master(ioc->pcidev); /* ?? */ - pci_set_drvdata(ioc->pcidev, ioc); - dprintk((KERN_INFO MYNAM ": %s installed at interrupt " - "%d\n", ioc->name, ioc->pcidev->irq)); - } - } - /* Prime reply & request queues! * (mucho alloc's) Must be done prior to * init as upper addresses are needed for init. @@ -1761,9 +1835,9 @@ mpt_do_ioc_recovery(MPT_ADAPTER *ioc, u32 reason, int sleepFlag) * chips (mpt_adapter_disable, * mpt_diag_reset) */ + ioc->cached_fw = NULL; ddlprintk((MYIOC_s_INFO_FMT ": mpt_upload: alt_%s has cached_fw=%p \n", ioc->name, ioc->alt_ioc->name, ioc->alt_ioc->cached_fw)); - ioc->alt_ioc->cached_fw = NULL; } } else { printk(KERN_WARNING MYNAM ": firmware upload failure!\n"); @@ -1811,7 +1885,7 @@ mpt_do_ioc_recovery(MPT_ADAPTER *ioc, u32 reason, int sleepFlag) ret = mptbase_sas_persist_operation(ioc, MPI_SAS_OP_CLEAR_NOT_PRESENT); if(ret != 0) - goto out; + return -1; } /* Find IM volumes @@ -1819,6 +1893,14 @@ mpt_do_ioc_recovery(MPT_ADAPTER *ioc, u32 reason, int sleepFlag) mpt_findImVolumes(ioc); } else if (ioc->bus_type == FC) { + /* + * Pre-fetch FC port WWN and stuff... + * (FCPortPage0_t stuff) + */ + for (ii=0; ii < ioc->facts.NumberOfPorts; ii++) { + (void) mptbase_GetFcPortPage0(ioc, ii); + } + if ((ioc->pfacts[0].ProtocolFlags & MPI_PORTFACTS_PROTOCOL_LAN) && (ioc->lan_cnfg_page0.Header.PageLength == 0)) { /* @@ -1870,26 +1952,20 @@ mpt_do_ioc_recovery(MPT_ADAPTER *ioc, u32 reason, int sleepFlag) if ((ret == 0) && MptResetHandlers[ii]) { dprintk((MYIOC_s_INFO_FMT "Calling IOC post_reset handler #%d\n", ioc->name, ii)); - rc += mpt_signal_reset(ii, ioc, MPT_IOC_POST_RESET); + rc += (*(MptResetHandlers[ii]))(ioc, MPT_IOC_POST_RESET); handlers++; } if (alt_ioc_ready && MptResetHandlers[ii]) { drsprintk((MYIOC_s_INFO_FMT "Calling alt-%s post_reset handler #%d\n", ioc->name, ioc->alt_ioc->name, ii)); - rc += mpt_signal_reset(ii, ioc->alt_ioc, MPT_IOC_POST_RESET); + rc += (*(MptResetHandlers[ii]))(ioc->alt_ioc, MPT_IOC_POST_RESET); handlers++; } } /* FIXME? Examine results here? */ } - out: - if ((ret != 0) && irq_allocated) { - free_irq(ioc->pci_irq, ioc); - if (mpt_msi_enable) - pci_disable_msi(ioc->pcidev); - } return ret; } @@ -2264,7 +2340,7 @@ MakeIocReady(MPT_ADAPTER *ioc, int force, int sleepFlag) } if (sleepFlag == CAN_SLEEP) { - msleep(1); + msleep_interruptible(1); } else { mdelay (1); /* 1 msec delay */ } @@ -2652,7 +2728,7 @@ SendIocInit(MPT_ADAPTER *ioc, int sleepFlag) state = mpt_GetIocState(ioc, 1); while (state != MPI_IOC_STATE_OPERATIONAL && --cntdn) { if (sleepFlag == CAN_SLEEP) { - msleep(1); + msleep_interruptible(1); } else { mdelay(1); } @@ -2669,7 +2745,6 @@ SendIocInit(MPT_ADAPTER *ioc, int sleepFlag) dinitprintk((MYIOC_s_INFO_FMT "INFO - Wait IOC_OPERATIONAL state (cnt=%d)\n", ioc->name, count)); - ioc->aen_event_read_flag=0; return r; } @@ -2737,8 +2812,6 @@ mpt_alloc_fw_memory(MPT_ADAPTER *ioc, int size) if (ioc->alt_ioc && ioc->alt_ioc->cached_fw) { ioc->cached_fw = ioc->alt_ioc->cached_fw; /* use alt_ioc's memory */ ioc->cached_fw_dma = ioc->alt_ioc->cached_fw_dma; - ioc->alloc_total += size; - ioc->alt_ioc->alloc_total -= size; } else { if ( (ioc->cached_fw = pci_alloc_consistent(ioc->pcidev, size, &ioc->cached_fw_dma) ) ) ioc->alloc_total += size; @@ -2907,7 +2980,7 @@ mpt_downloadboot(MPT_ADAPTER *ioc, MpiFwHeader_t *pFwHeader, int sleepFlag) /* wait 1 msec */ if (sleepFlag == CAN_SLEEP) { - msleep(1); + msleep_interruptible(1); } else { mdelay (1); } @@ -2924,7 +2997,7 @@ mpt_downloadboot(MPT_ADAPTER *ioc, MpiFwHeader_t *pFwHeader, int sleepFlag) } /* wait .1 sec */ if (sleepFlag == CAN_SLEEP) { - msleep (100); + msleep_interruptible (100); } else { mdelay (100); } @@ -3014,7 +3087,7 @@ mpt_downloadboot(MPT_ADAPTER *ioc, MpiFwHeader_t *pFwHeader, int sleepFlag) /* wait 1 msec */ if (sleepFlag == CAN_SLEEP) { - msleep (1); + msleep_interruptible (1); } else { mdelay (1); } @@ -3062,7 +3135,7 @@ mpt_downloadboot(MPT_ADAPTER *ioc, MpiFwHeader_t *pFwHeader, int sleepFlag) return 0; } if (sleepFlag == CAN_SLEEP) { - msleep (10); + msleep_interruptible (10); } else { mdelay (10); } @@ -3113,7 +3186,7 @@ KickStart(MPT_ADAPTER *ioc, int force, int sleepFlag) SendIocReset(ioc, MPI_FUNCTION_IOC_MESSAGE_UNIT_RESET, sleepFlag); if (sleepFlag == CAN_SLEEP) { - msleep (1000); + msleep_interruptible (1000); } else { mdelay (1000); } @@ -3135,7 +3208,7 @@ KickStart(MPT_ADAPTER *ioc, int force, int sleepFlag) return hard_reset_done; } if (sleepFlag == CAN_SLEEP) { - msleep (10); + msleep_interruptible (10); } else { mdelay (10); } @@ -3168,7 +3241,6 @@ KickStart(MPT_ADAPTER *ioc, int force, int sleepFlag) static int mpt_diag_reset(MPT_ADAPTER *ioc, int ignore, int sleepFlag) { - MPT_ADAPTER *iocp=NULL; u32 diag0val; u32 doorbell; int hard_reset_done = 0; @@ -3177,37 +3249,6 @@ mpt_diag_reset(MPT_ADAPTER *ioc, int ignore, int sleepFlag) u32 diag1val = 0; #endif - if (ioc->pcidev->device == MPI_MANUFACTPAGE_DEVID_SAS1078) { - drsprintk((MYIOC_s_WARN_FMT "%s: Doorbell=%p; 1078 reset " - "address=%p\n", ioc->name, __FUNCTION__, - &ioc->chip->Doorbell, &ioc->chip->Reset_1078)); - CHIPREG_WRITE32(&ioc->chip->Reset_1078, 0x07); - if (sleepFlag == CAN_SLEEP) - msleep(1); - else - mdelay(1); - - for (count = 0; count < 60; count ++) { - doorbell = CHIPREG_READ32(&ioc->chip->Doorbell); - doorbell &= MPI_IOC_STATE_MASK; - - drsprintk((MYIOC_s_INFO_FMT - "looking for READY STATE: doorbell=%x" - " count=%d\n", - ioc->name, doorbell, count)); - if (doorbell == MPI_IOC_STATE_READY) { - return 0; - } - - /* wait 1 sec */ - if (sleepFlag == CAN_SLEEP) - msleep(1000); - else - mdelay(1000); - } - return -1; - } - /* Clear any existing interrupts */ CHIPREG_WRITE32(&ioc->chip->IntStatus, 0); @@ -3238,7 +3279,7 @@ mpt_diag_reset(MPT_ADAPTER *ioc, int ignore, int sleepFlag) /* wait 100 msec */ if (sleepFlag == CAN_SLEEP) { - msleep (100); + msleep_interruptible (100); } else { mdelay (100); } @@ -3293,43 +3334,37 @@ mpt_diag_reset(MPT_ADAPTER *ioc, int ignore, int sleepFlag) if (MptResetHandlers[ii]) { dprintk((MYIOC_s_INFO_FMT "Calling IOC pre_reset handler #%d\n", ioc->name, ii)); - r += mpt_signal_reset(ii, ioc, MPT_IOC_PRE_RESET); + r += (*(MptResetHandlers[ii]))(ioc, MPT_IOC_PRE_RESET); if (ioc->alt_ioc) { dprintk((MYIOC_s_INFO_FMT "Calling alt-%s pre_reset handler #%d\n", ioc->name, ioc->alt_ioc->name, ii)); - r += mpt_signal_reset(ii, ioc->alt_ioc, MPT_IOC_PRE_RESET); + r += (*(MptResetHandlers[ii]))(ioc->alt_ioc, MPT_IOC_PRE_RESET); } } } /* FIXME? Examine results here? */ } - if (ioc->cached_fw) - iocp = ioc; - else if (ioc->alt_ioc && ioc->alt_ioc->cached_fw) - iocp = ioc->alt_ioc; - if (iocp) { + if (ioc->cached_fw) { /* If the DownloadBoot operation fails, the * IOC will be left unusable. This is a fatal error * case. _diag_reset will return < 0 */ for (count = 0; count < 30; count ++) { - diag0val = CHIPREG_READ32(&iocp->chip->Diagnostic); + diag0val = CHIPREG_READ32(&ioc->chip->Diagnostic); if (!(diag0val & MPI_DIAG_RESET_ADAPTER)) { break; } - dprintk((MYIOC_s_INFO_FMT "cached_fw: diag0val=%x count=%d\n", - iocp->name, diag0val, count)); /* wait 1 sec */ if (sleepFlag == CAN_SLEEP) { - msleep (1000); + msleep_interruptible (1000); } else { mdelay (1000); } } if ((count = mpt_downloadboot(ioc, - (MpiFwHeader_t *)iocp->cached_fw, sleepFlag)) < 0) { + (MpiFwHeader_t *)ioc->cached_fw, sleepFlag)) < 0) { printk(KERN_WARNING MYNAM ": firmware downloadboot failure (%d)!\n", count); } @@ -3351,7 +3386,7 @@ mpt_diag_reset(MPT_ADAPTER *ioc, int ignore, int sleepFlag) /* wait 1 sec */ if (sleepFlag == CAN_SLEEP) { - msleep (1000); + msleep_interruptible (1000); } else { mdelay (1000); } @@ -3385,7 +3420,7 @@ mpt_diag_reset(MPT_ADAPTER *ioc, int ignore, int sleepFlag) /* wait 100 msec */ if (sleepFlag == CAN_SLEEP) { - msleep (100); + msleep_interruptible (100); } else { mdelay (100); } @@ -3479,7 +3514,7 @@ SendIocReset(MPT_ADAPTER *ioc, u8 reset_type, int sleepFlag) } if (sleepFlag == CAN_SLEEP) { - msleep(1); + msleep_interruptible(1); } else { mdelay (1); /* 1 msec delay */ } @@ -3916,18 +3951,18 @@ WaitForDoorbellAck(MPT_ADAPTER *ioc, int howlong, int sleepFlag) if (sleepFlag == CAN_SLEEP) { while (--cntdn) { - msleep (1); intstat = CHIPREG_READ32(&ioc->chip->IntStatus); if (! (intstat & MPI_HIS_IOP_DOORBELL_STATUS)) break; + msleep_interruptible (1); count++; } } else { while (--cntdn) { - mdelay (1); intstat = CHIPREG_READ32(&ioc->chip->IntStatus); if (! (intstat & MPI_HIS_IOP_DOORBELL_STATUS)) break; + mdelay (1); count++; } } @@ -3968,7 +4003,7 @@ WaitForDoorbellInt(MPT_ADAPTER *ioc, int howlong, int sleepFlag) intstat = CHIPREG_READ32(&ioc->chip->IntStatus); if (intstat & MPI_HIS_DOORBELL_INTERRUPT) break; - msleep(1); + msleep_interruptible(1); count++; } } else { @@ -4189,6 +4224,108 @@ GetLanConfigPages(MPT_ADAPTER *ioc) return rc; } +/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ +/* + * mptbase_GetFcPortPage0 - Fetch FCPort config Page0. + * @ioc: Pointer to MPT_ADAPTER structure + * @portnum: IOC Port number + * + * Return: 0 for success + * -ENOMEM if no memory available + * -EPERM if not allowed due to ISR context + * -EAGAIN if no msg frames currently available + * -EFAULT for non-successful reply or no reply (timeout) + */ +int +mptbase_GetFcPortPage0(MPT_ADAPTER *ioc, int portnum) +{ + ConfigPageHeader_t hdr; + CONFIGPARMS cfg; + FCPortPage0_t *ppage0_alloc; + FCPortPage0_t *pp0dest; + dma_addr_t page0_dma; + int data_sz; + int copy_sz; + int rc; + int count = 400; + + + /* Get FCPort Page 0 header */ + hdr.PageVersion = 0; + hdr.PageLength = 0; + hdr.PageNumber = 0; + hdr.PageType = MPI_CONFIG_PAGETYPE_FC_PORT; + cfg.cfghdr.hdr = &hdr; + cfg.physAddr = -1; + cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER; + cfg.dir = 0; + cfg.pageAddr = portnum; + cfg.timeout = 0; + + if ((rc = mpt_config(ioc, &cfg)) != 0) + return rc; + + if (hdr.PageLength == 0) + return 0; + + data_sz = hdr.PageLength * 4; + rc = -ENOMEM; + ppage0_alloc = (FCPortPage0_t *) pci_alloc_consistent(ioc->pcidev, data_sz, &page0_dma); + if (ppage0_alloc) { + + try_again: + memset((u8 *)ppage0_alloc, 0, data_sz); + cfg.physAddr = page0_dma; + cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT; + + if ((rc = mpt_config(ioc, &cfg)) == 0) { + /* save the data */ + pp0dest = &ioc->fc_port_page0[portnum]; + copy_sz = min_t(int, sizeof(FCPortPage0_t), data_sz); + memcpy(pp0dest, ppage0_alloc, copy_sz); + + /* + * Normalize endianness of structure data, + * by byte-swapping all > 1 byte fields! + */ + pp0dest->Flags = le32_to_cpu(pp0dest->Flags); + pp0dest->PortIdentifier = le32_to_cpu(pp0dest->PortIdentifier); + pp0dest->WWNN.Low = le32_to_cpu(pp0dest->WWNN.Low); + pp0dest->WWNN.High = le32_to_cpu(pp0dest->WWNN.High); + pp0dest->WWPN.Low = le32_to_cpu(pp0dest->WWPN.Low); + pp0dest->WWPN.High = le32_to_cpu(pp0dest->WWPN.High); + pp0dest->SupportedServiceClass = le32_to_cpu(pp0dest->SupportedServiceClass); + pp0dest->SupportedSpeeds = le32_to_cpu(pp0dest->SupportedSpeeds); + pp0dest->CurrentSpeed = le32_to_cpu(pp0dest->CurrentSpeed); + pp0dest->MaxFrameSize = le32_to_cpu(pp0dest->MaxFrameSize); + pp0dest->FabricWWNN.Low = le32_to_cpu(pp0dest->FabricWWNN.Low); + pp0dest->FabricWWNN.High = le32_to_cpu(pp0dest->FabricWWNN.High); + pp0dest->FabricWWPN.Low = le32_to_cpu(pp0dest->FabricWWPN.Low); + pp0dest->FabricWWPN.High = le32_to_cpu(pp0dest->FabricWWPN.High); + pp0dest->DiscoveredPortsCount = le32_to_cpu(pp0dest->DiscoveredPortsCount); + pp0dest->MaxInitiators = le32_to_cpu(pp0dest->MaxInitiators); + + /* + * if still doing discovery, + * hang loose a while until finished + */ + if (pp0dest->PortState == MPI_FCPORTPAGE0_PORTSTATE_UNKNOWN) { + if (count-- > 0) { + msleep_interruptible(100); + goto try_again; + } + printk(MYIOC_s_INFO_FMT "Firmware discovery not" + " complete.\n", + ioc->name); + } + } + + pci_free_consistent(ioc->pcidev, data_sz, (u8 *) ppage0_alloc, page0_dma); + } + + return rc; +} + /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ /* * mptbase_sas_persist_operation - Perform operation on SAS Persitent Table @@ -4801,7 +4938,7 @@ done_and_free: return rc; } -static int +int mpt_read_ioc_pg_3(MPT_ADAPTER *ioc) { IOCPage3_t *pIoc3; @@ -4892,7 +5029,6 @@ mpt_read_ioc_pg_4(MPT_ADAPTER *ioc) pIoc4 = pci_alloc_consistent(ioc->pcidev, iocpage4sz, &ioc4_dma); if (!pIoc4) return; - ioc->alloc_total += iocpage4sz; } else { ioc4_dma = ioc->spi_data.IocPg4_dma; iocpage4sz = ioc->spi_data.IocPg4Sz; @@ -4909,7 +5045,6 @@ mpt_read_ioc_pg_4(MPT_ADAPTER *ioc) } else { pci_free_consistent(ioc->pcidev, iocpage4sz, pIoc4, ioc4_dma); ioc->spi_data.pIocPg4 = NULL; - ioc->alloc_total -= iocpage4sz; } } @@ -5011,13 +5146,13 @@ SendEventNotification(MPT_ADAPTER *ioc, u8 EvSwitch) evnp = (EventNotification_t *) mpt_get_msg_frame(mpt_base_index, ioc); if (evnp == NULL) { - devtverboseprintk((MYIOC_s_WARN_FMT "Unable to allocate event request frame!\n", + devtprintk((MYIOC_s_WARN_FMT "Unable to allocate event request frame!\n", ioc->name)); return 0; } memset(evnp, 0, sizeof(*evnp)); - devtverboseprintk((MYIOC_s_INFO_FMT "Sending EventNotification (%d) request %p\n", ioc->name, EvSwitch, evnp)); + devtprintk((MYIOC_s_INFO_FMT "Sending EventNotification (%d) request %p\n", ioc->name, EvSwitch, evnp)); evnp->Function = MPI_FUNCTION_EVENT_NOTIFICATION; evnp->ChainOffset = 0; @@ -5041,18 +5176,19 @@ SendEventAck(MPT_ADAPTER *ioc, EventNotificationReply_t *evnp) EventAck_t *pAck; if ((pAck = (EventAck_t *) mpt_get_msg_frame(mpt_base_index, ioc)) == NULL) { - dfailprintk((MYIOC_s_WARN_FMT "%s, no msg frames!!\n", - ioc->name,__FUNCTION__)); + printk(MYIOC_s_WARN_FMT "Unable to allocate event ACK " + "request frame for Event=%x EventContext=%x EventData=%x!\n", + ioc->name, evnp->Event, le32_to_cpu(evnp->EventContext), + le32_to_cpu(evnp->Data[0])); return -1; } + memset(pAck, 0, sizeof(*pAck)); - devtverboseprintk((MYIOC_s_INFO_FMT "Sending EventAck\n", ioc->name)); + dprintk((MYIOC_s_INFO_FMT "Sending EventAck\n", ioc->name)); pAck->Function = MPI_FUNCTION_EVENT_ACK; pAck->ChainOffset = 0; - pAck->Reserved[0] = pAck->Reserved[1] = 0; pAck->MsgFlags = 0; - pAck->Reserved1[0] = pAck->Reserved1[1] = pAck->Reserved1[2] = 0; pAck->Event = evnp->Event; pAck->EventContext = evnp->EventContext; @@ -5563,7 +5699,11 @@ mpt_print_ioc_summary(MPT_ADAPTER *ioc, char *buffer, int *size, int len, int sh a[5], a[4], a[3], a[2], a[1], a[0]); } +#ifndef __sparc__ y += sprintf(buffer+len+y, ", IRQ=%d", ioc->pci_irq); +#else + y += sprintf(buffer+len+y, ", IRQ=%s", __irq_itoa(ioc->pci_irq)); +#endif if (!ioc->active) y += sprintf(buffer+len+y, " (disabled)"); @@ -5622,7 +5762,7 @@ mpt_HardResetHandler(MPT_ADAPTER *ioc, int sleepFlag) /* The SCSI driver needs to adjust timeouts on all current * commands prior to the diagnostic reset being issued. - * Prevents timeouts occurring during a diagnostic reset...very bad. + * Prevents timeouts occuring during a diagnostic reset...very bad. * For all other protocol drivers, this is a no-op. */ { @@ -5633,11 +5773,11 @@ mpt_HardResetHandler(MPT_ADAPTER *ioc, int sleepFlag) if (MptResetHandlers[ii]) { dtmprintk((MYIOC_s_INFO_FMT "Calling IOC reset_setup handler #%d\n", ioc->name, ii)); - r += mpt_signal_reset(ii, ioc, MPT_IOC_SETUP_RESET); + r += (*(MptResetHandlers[ii]))(ioc, MPT_IOC_SETUP_RESET); if (ioc->alt_ioc) { dtmprintk((MYIOC_s_INFO_FMT "Calling alt-%s setup reset handler #%d\n", ioc->name, ioc->alt_ioc->name, ii)); - r += mpt_signal_reset(ii, ioc->alt_ioc, MPT_IOC_SETUP_RESET); + r += (*(MptResetHandlers[ii]))(ioc->alt_ioc, MPT_IOC_SETUP_RESET); } } } @@ -5662,13 +5802,11 @@ mpt_HardResetHandler(MPT_ADAPTER *ioc, int sleepFlag) return rc; } -# define EVENT_DESCR_STR_SZ 100 - /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ static void EventDescriptionStr(u8 event, u32 evData0, char *evStr) { - char *ds = NULL; + char *ds; switch(event) { case MPI_EVENT_NONE: @@ -5705,18 +5843,18 @@ EventDescriptionStr(u8 event, u32 evData0, char *evStr) if (evData0 == MPI_EVENT_LOOP_STATE_CHANGE_LIP) ds = "Loop State(LIP) Change"; else if (evData0 == MPI_EVENT_LOOP_STATE_CHANGE_LPE) - ds = "Loop State(LPE) Change"; /* ??? */ + ds = "Loop State(LPE) Change"; /* ??? */ else - ds = "Loop State(LPB) Change"; /* ??? */ + ds = "Loop State(LPB) Change"; /* ??? */ break; case MPI_EVENT_LOGOUT: ds = "Logout"; break; case MPI_EVENT_EVENT_CHANGE: if (evData0) - ds = "Events ON"; + ds = "Events(ON) Change"; else - ds = "Events OFF"; + ds = "Events(OFF) Change"; break; case MPI_EVENT_INTEGRATED_RAID: { @@ -5769,50 +5907,23 @@ EventDescriptionStr(u8 event, u32 evData0, char *evStr) break; case MPI_EVENT_SAS_DEVICE_STATUS_CHANGE: { - u8 id = (u8)(evData0); u8 ReasonCode = (u8)(evData0 >> 16); switch (ReasonCode) { case MPI_EVENT_SAS_DEV_STAT_RC_ADDED: - snprintf(evStr, EVENT_DESCR_STR_SZ, - "SAS Device Status Change: Added: id=%d", id); + ds = "SAS Device Status Change: Added"; break; case MPI_EVENT_SAS_DEV_STAT_RC_NOT_RESPONDING: - snprintf(evStr, EVENT_DESCR_STR_SZ, - "SAS Device Status Change: Deleted: id=%d", id); + ds = "SAS Device Status Change: Deleted"; break; case MPI_EVENT_SAS_DEV_STAT_RC_SMART_DATA: - snprintf(evStr, EVENT_DESCR_STR_SZ, - "SAS Device Status Change: SMART Data: id=%d", - id); + ds = "SAS Device Status Change: SMART Data"; break; case MPI_EVENT_SAS_DEV_STAT_RC_NO_PERSIST_ADDED: - snprintf(evStr, EVENT_DESCR_STR_SZ, - "SAS Device Status Change: No Persistancy: id=%d", id); - break; - case MPI_EVENT_SAS_DEV_STAT_RC_INTERNAL_DEVICE_RESET: - snprintf(evStr, EVENT_DESCR_STR_SZ, - "SAS Device Status Change: Internal Device Reset : id=%d", id); - break; - case MPI_EVENT_SAS_DEV_STAT_RC_TASK_ABORT_INTERNAL: - snprintf(evStr, EVENT_DESCR_STR_SZ, - "SAS Device Status Change: Internal Task Abort : id=%d", id); - break; - case MPI_EVENT_SAS_DEV_STAT_RC_ABORT_TASK_SET_INTERNAL: - snprintf(evStr, EVENT_DESCR_STR_SZ, - "SAS Device Status Change: Internal Abort Task Set : id=%d", id); - break; - case MPI_EVENT_SAS_DEV_STAT_RC_CLEAR_TASK_SET_INTERNAL: - snprintf(evStr, EVENT_DESCR_STR_SZ, - "SAS Device Status Change: Internal Clear Task Set : id=%d", id); - break; - case MPI_EVENT_SAS_DEV_STAT_RC_QUERY_TASK_INTERNAL: - snprintf(evStr, EVENT_DESCR_STR_SZ, - "SAS Device Status Change: Internal Query Task : id=%d", id); + ds = "SAS Device Status Change: No Persistancy Added"; break; default: - snprintf(evStr, EVENT_DESCR_STR_SZ, - "SAS Device Status Change: Unknown: id=%d", id); - break; + ds = "SAS Device Status Change: Unknown"; + break; } break; } @@ -5829,101 +5940,11 @@ EventDescriptionStr(u8 event, u32 evData0, char *evStr) ds = "Persistent Table Full"; break; case MPI_EVENT_SAS_PHY_LINK_STATUS: - { - u8 LinkRates = (u8)(evData0 >> 8); - u8 PhyNumber = (u8)(evData0); - LinkRates = (LinkRates & MPI_EVENT_SAS_PLS_LR_CURRENT_MASK) >> - MPI_EVENT_SAS_PLS_LR_CURRENT_SHIFT; - switch (LinkRates) { - case MPI_EVENT_SAS_PLS_LR_RATE_UNKNOWN: - snprintf(evStr, EVENT_DESCR_STR_SZ, - "SAS PHY Link Status: Phy=%d:" - " Rate Unknown",PhyNumber); - break; - case MPI_EVENT_SAS_PLS_LR_RATE_PHY_DISABLED: - snprintf(evStr, EVENT_DESCR_STR_SZ, - "SAS PHY Link Status: Phy=%d:" - " Phy Disabled",PhyNumber); - break; - case MPI_EVENT_SAS_PLS_LR_RATE_FAILED_SPEED_NEGOTIATION: - snprintf(evStr, EVENT_DESCR_STR_SZ, - "SAS PHY Link Status: Phy=%d:" - " Failed Speed Nego",PhyNumber); - break; - case MPI_EVENT_SAS_PLS_LR_RATE_SATA_OOB_COMPLETE: - snprintf(evStr, EVENT_DESCR_STR_SZ, - "SAS PHY Link Status: Phy=%d:" - " Sata OOB Completed",PhyNumber); - break; - case MPI_EVENT_SAS_PLS_LR_RATE_1_5: - snprintf(evStr, EVENT_DESCR_STR_SZ, - "SAS PHY Link Status: Phy=%d:" - " Rate 1.5 Gbps",PhyNumber); - break; - case MPI_EVENT_SAS_PLS_LR_RATE_3_0: - snprintf(evStr, EVENT_DESCR_STR_SZ, - "SAS PHY Link Status: Phy=%d:" - " Rate 3.0 Gpbs",PhyNumber); - break; - default: - snprintf(evStr, EVENT_DESCR_STR_SZ, - "SAS PHY Link Status: Phy=%d", PhyNumber); - break; - } + ds = "SAS PHY Link Status"; break; - } case MPI_EVENT_SAS_DISCOVERY_ERROR: ds = "SAS Discovery Error"; break; - case MPI_EVENT_IR_RESYNC_UPDATE: - { - u8 resync_complete = (u8)(evData0 >> 16); - snprintf(evStr, EVENT_DESCR_STR_SZ, - "IR Resync Update: Complete = %d:",resync_complete); - break; - } - case MPI_EVENT_IR2: - { - u8 ReasonCode = (u8)(evData0 >> 16); - switch (ReasonCode) { - case MPI_EVENT_IR2_RC_LD_STATE_CHANGED: - ds = "IR2: LD State Changed"; - break; - case MPI_EVENT_IR2_RC_PD_STATE_CHANGED: - ds = "IR2: PD State Changed"; - break; - case MPI_EVENT_IR2_RC_BAD_BLOCK_TABLE_FULL: - ds = "IR2: Bad Block Table Full"; - break; - case MPI_EVENT_IR2_RC_PD_INSERTED: - ds = "IR2: PD Inserted"; - break; - case MPI_EVENT_IR2_RC_PD_REMOVED: - ds = "IR2: PD Removed"; - break; - case MPI_EVENT_IR2_RC_FOREIGN_CFG_DETECTED: - ds = "IR2: Foreign CFG Detected"; - break; - case MPI_EVENT_IR2_RC_REBUILD_MEDIUM_ERROR: - ds = "IR2: Rebuild Medium Error"; - break; - default: - ds = "IR2"; - break; - } - break; - } - case MPI_EVENT_SAS_DISCOVERY: - { - if (evData0) - ds = "SAS Discovery: Start"; - else - ds = "SAS Discovery: Stop"; - break; - } - case MPI_EVENT_LOG_ENTRY_ADDED: - ds = "SAS Log Entry Added"; - break; /* * MPT base "custom" events may be added here... @@ -5932,8 +5953,7 @@ EventDescriptionStr(u8 event, u32 evData0, char *evStr) ds = "Unknown"; break; } - if (ds) - strncpy(evStr, ds, EVENT_DESCR_STR_SZ); + strcpy(evStr,ds); } /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ @@ -5955,7 +5975,7 @@ ProcessEventNotification(MPT_ADAPTER *ioc, EventNotificationReply_t *pEventReply int ii; int r = 0; int handlers = 0; - char evStr[EVENT_DESCR_STR_SZ]; + char evStr[100]; u8 event; /* @@ -5969,12 +5989,12 @@ ProcessEventNotification(MPT_ADAPTER *ioc, EventNotificationReply_t *pEventReply } EventDescriptionStr(event, evData0, evStr); - devtprintk((MYIOC_s_INFO_FMT "MPT event:(%02Xh) : %s\n", + devtprintk((MYIOC_s_INFO_FMT "MPT event (%s=%02Xh) detected!\n", ioc->name, - event, - evStr)); + evStr, + event)); -#if defined(MPT_DEBUG) || defined(MPT_DEBUG_VERBOSE_EVENTS) +#if defined(MPT_DEBUG) || defined(MPT_DEBUG_EVENTS) printk(KERN_INFO MYNAM ": Event data:\n" KERN_INFO); for (ii = 0; ii < evDataLen; ii++) printk(" %08x", le32_to_cpu(pEventReply->Data[ii])); @@ -6033,7 +6053,7 @@ ProcessEventNotification(MPT_ADAPTER *ioc, EventNotificationReply_t *pEventReply */ for (ii=MPT_MAX_PROTOCOL_DRIVERS-1; ii; ii--) { if (MptEvHandlers[ii]) { - devtverboseprintk((MYIOC_s_INFO_FMT "Routing Event to event handler #%d\n", + devtprintk((MYIOC_s_INFO_FMT "Routing Event to event handler #%d\n", ioc->name, ii)); r += (*(MptEvHandlers[ii]))(ioc, pEventReply); handlers++; @@ -6045,10 +6065,10 @@ ProcessEventNotification(MPT_ADAPTER *ioc, EventNotificationReply_t *pEventReply * If needed, send (a single) EventAck. */ if (pEventReply->AckRequired == MPI_EVENT_NOTIFICATION_ACK_REQUIRED) { - devtverboseprintk((MYIOC_s_WARN_FMT + devtprintk((MYIOC_s_WARN_FMT "EventAck required\n",ioc->name)); if ((ii = SendEventAck(ioc, pEventReply)) != 0) { - devtverboseprintk((MYIOC_s_WARN_FMT "SendEventAck returned %d\n", + devtprintk((MYIOC_s_WARN_FMT "SendEventAck returned %d\n", ioc->name, ii)); } } @@ -6063,7 +6083,7 @@ ProcessEventNotification(MPT_ADAPTER *ioc, EventNotificationReply_t *pEventReply * @ioc: Pointer to MPT_ADAPTER structure * @log_info: U32 LogInfo reply word from the IOC * - * Refer to lsi/mpi_log_fc.h. + * Refer to lsi/fc_log.h. */ static void mpt_fc_log_info(MPT_ADAPTER *ioc, u32 log_info) @@ -6160,10 +6180,8 @@ mpt_spi_log_info(MPT_ADAPTER *ioc, u32 log_info) "Invalid SAS Address", /* 01h */ NULL, /* 02h */ "Invalid Page", /* 03h */ - "Diag Message Error", /* 04h */ - "Task Terminated", /* 05h */ - "Enclosure Management", /* 06h */ - "Target Mode" /* 07h */ + NULL, /* 04h */ + "Task Terminated" /* 05h */ }; static char *pl_code_str[] = { NULL, /* 00h */ @@ -6187,9 +6205,9 @@ mpt_spi_log_info(MPT_ADAPTER *ioc, u32 log_info) "Abort", /* 12h */ "IO Not Yet Executed", /* 13h */ "IO Executed", /* 14h */ - "Persistant Reservation Out Not Affiliation Owner", /* 15h */ - "Open Transmit DMA Abort", /* 16h */ - "IO Device Missing Delay Retry", /* 17h */ + NULL, /* 15h */ + NULL, /* 16h */ + NULL, /* 17h */ NULL, /* 18h */ NULL, /* 19h */ NULL, /* 1Ah */ @@ -6269,7 +6287,7 @@ static void mpt_sp_ioc_info(MPT_ADAPTER *ioc, u32 ioc_status, MPT_FRAME_HDR *mf) { u32 status = ioc_status & MPI_IOCSTATUS_MASK; - char *desc = NULL; + char *desc = ""; switch (status) { case MPI_IOCSTATUS_INVALID_FUNCTION: /* 0x0001 */ @@ -6379,7 +6397,7 @@ mpt_sp_ioc_info(MPT_ADAPTER *ioc, u32 ioc_status, MPT_FRAME_HDR *mf) desc = "Others"; break; } - if (desc != NULL) + if (desc != "") printk(MYIOC_s_INFO_FMT "IOCStatus(0x%04x): %s\n", ioc->name, status, desc); } @@ -6413,9 +6431,13 @@ EXPORT_SYMBOL(mpt_stm_index); EXPORT_SYMBOL(mpt_HardResetHandler); EXPORT_SYMBOL(mpt_config); EXPORT_SYMBOL(mpt_findImVolumes); +EXPORT_SYMBOL(mpt_read_ioc_pg_3); EXPORT_SYMBOL(mpt_alloc_fw_memory); EXPORT_SYMBOL(mpt_free_fw_memory); EXPORT_SYMBOL(mptbase_sas_persist_operation); +EXPORT_SYMBOL(mpt_alt_ioc_wait); +EXPORT_SYMBOL(mptbase_GetFcPortPage0); + /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ /* diff --git a/drivers/message/fusion/mptbase.h b/drivers/message/fusion/mptbase.h index c537d71c1..723d54300 100644 --- a/drivers/message/fusion/mptbase.h +++ b/drivers/message/fusion/mptbase.h @@ -49,6 +49,7 @@ #define MPTBASE_H_INCLUDED /*{-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ +#include #include #include @@ -75,8 +76,8 @@ #define COPYRIGHT "Copyright (c) 1999-2005 " MODULEAUTHOR #endif -#define MPT_LINUX_VERSION_COMMON "3.04.01" -#define MPT_LINUX_PACKAGE_NAME "@(#)mptlinux-3.04.01" +#define MPT_LINUX_VERSION_COMMON "3.03.07" +#define MPT_LINUX_PACKAGE_NAME "@(#)mptlinux-3.03.07" #define WHAT_MAGIC_STRING "@" "(" "#" ")" #define show_mptmod_ver(s,ver) \ @@ -307,8 +308,7 @@ typedef struct _SYSIF_REGS u32 HostIndex; /* 50 Host Index register */ u32 Reserved4[15]; /* 54-8F */ u32 Fubar; /* 90 For Fubar usage */ - u32 Reserved5[1050];/* 94-10F8 */ - u32 Reset_1078; /* 10FC Reset 1078 */ + u32 Reserved5[27]; /* 94-FF */ } SYSIF_REGS; /* @@ -331,7 +331,6 @@ typedef struct _SYSIF_REGS * VirtDevice - FC LUN device or SCSI target device */ typedef struct _VirtTarget { - struct scsi_target *starget; u8 tflags; u8 ioc_id; u8 target_id; @@ -342,13 +341,16 @@ typedef struct _VirtTarget { u8 negoFlags; /* bit field, see above */ u8 raidVolume; /* set, if RAID Volume */ u8 type; /* byte 0 of Inquiry data */ - u8 deleted; /* target in process of being removed */ u32 num_luns; u32 luns[8]; /* Max LUNs is 256 */ + u8 inq_data[8]; } VirtTarget; typedef struct _VirtDevice { - VirtTarget *vtarget; + VirtTarget *vtarget; + u8 ioc_id; + u8 bus_id; + u8 target_id; u8 configured_lun; u32 lun; } VirtDevice; @@ -362,8 +364,6 @@ typedef struct _VirtDevice { #define MPT_TARGET_FLAGS_Q_YES 0x08 #define MPT_TARGET_FLAGS_VALID_56 0x10 #define MPT_TARGET_FLAGS_SAF_TE_ISSUED 0x20 -#define MPT_TARGET_FLAGS_RAID_COMPONENT 0x40 -#define MPT_TARGET_FLAGS_LED_ON 0x80 /* * /proc/mpt interface @@ -447,6 +447,13 @@ typedef struct _mpt_ioctl_events { * Substructure to store SCSI specific configuration page data */ /* dvStatus defines: */ +#define MPT_SCSICFG_NEGOTIATE 0x01 /* Negotiate on next IO */ +#define MPT_SCSICFG_NEED_DV 0x02 /* Schedule DV */ +#define MPT_SCSICFG_DV_PENDING 0x04 /* DV on this physical id pending */ +#define MPT_SCSICFG_DV_NOT_DONE 0x08 /* DV has not been performed */ +#define MPT_SCSICFG_BLK_NEGO 0x10 /* WriteSDP1 with WDTR and SDTR disabled */ +#define MPT_SCSICFG_RELOAD_IOC_PG3 0x20 /* IOC Pg 3 data is obsolete */ + /* Args passed to writeSDP1: */ #define MPT_SCSICFG_USE_NVRAM 0x01 /* WriteSDP1 using NVRAM */ #define MPT_SCSICFG_ALL_IDS 0x02 /* WriteSDP1 to all IDS */ /* #define MPT_SCSICFG_BLK_NEGO 0x10 WriteSDP1 with WDTR and SDTR disabled */ @@ -457,6 +464,7 @@ typedef struct _SpiCfgData { IOCPage4_t *pIocPg4; /* SEP devices addressing */ dma_addr_t IocPg4_dma; /* Phys Addr of IOCPage4 data */ int IocPg4Sz; /* IOCPage4 size */ + u8 dvStatus[MPT_MAX_SCSI_DEVICES]; u8 minSyncFactor; /* 0xFF if async */ u8 maxSyncOffset; /* 0 if async */ u8 maxBusWidth; /* 0 if narrow, 1 if wide */ @@ -466,11 +474,13 @@ typedef struct _SpiCfgData { u8 sdp0version; /* SDP0 version */ u8 sdp0length; /* SDP0 length */ u8 dvScheduled; /* 1 if scheduled */ + u8 forceDv; /* 1 to force DV scheduling */ u8 noQas; /* Disable QAS for this adapter */ u8 Saf_Te; /* 1 to force all Processors as * SAF-TE if Inquiry data length * is too short to check for SAF-TE */ + u8 mpt_dv; /* command line option: enhanced=1, basic=0 */ u8 bus_reset; /* 1 to allow bus reset */ u8 rsvd[1]; }SpiCfgData; @@ -489,17 +499,9 @@ typedef struct _RaidCfgData { int isRaid; /* bit field, 1 if RAID */ }RaidCfgData; -typedef struct _FcCfgData { - /* will ultimately hold fc_port_page0 also */ - struct { - FCPortPage1_t *data; - dma_addr_t dma; - int pg_sz; - } fc_port_page1[2]; -} FcCfgData; - #define MPT_RPORT_INFO_FLAGS_REGISTERED 0x01 /* rport registered */ #define MPT_RPORT_INFO_FLAGS_MISSING 0x02 /* missing from DevPage0 scan */ +#define MPT_RPORT_INFO_FLAGS_MAPPED_VDEV 0x04 /* target mapped in vdev */ /* * data allocated for each fc rport device @@ -511,6 +513,7 @@ struct mptfc_rport_info struct scsi_target *starget; FCDevicePage0_t pg0; u8 flags; + u8 remap_needed; }; /* @@ -576,7 +579,6 @@ typedef struct _MPT_ADAPTER SpiCfgData spi_data; /* Scsi config. data */ RaidCfgData raid_data; /* Raid config. data */ SasCfgData sas_data; /* Sas config. data */ - FcCfgData fc_data; /* Fc config. data */ MPT_IOCTL *ioctl; /* ioctl data pointer */ struct proc_dir_entry *ioc_dentry; struct _MPT_ADAPTER *alt_ioc; /* ptr to 929 bound adapter port */ @@ -629,20 +631,16 @@ typedef struct _MPT_ADAPTER struct net_device *netdev; struct list_head sas_topology; struct mutex sas_topology_mutex; - struct mutex sas_discovery_mutex; - u8 sas_discovery_runtime; - u8 sas_discovery_ignore_events; - u16 handle; - int sas_index; /* index refrencing */ MPT_SAS_MGMT sas_mgmt; - struct work_struct sas_persist_task; + int num_ports; + struct work_struct mptscsih_persistTask; - struct work_struct fc_setup_reset_work; struct list_head fc_rports; + spinlock_t fc_rport_lock; /* list and ri flags */ spinlock_t fc_rescan_work_lock; + int fc_rescan_work_count; struct work_struct fc_rescan_work; - char fc_rescan_work_q_name[KOBJ_NAME_LEN]; - struct workqueue_struct *fc_rescan_work_q; + } MPT_ADAPTER; /* @@ -730,18 +728,12 @@ typedef struct _mpt_sge { #define dhsprintk(x) #endif -#if defined(MPT_DEBUG_EVENTS) || defined(MPT_DEBUG_VERBOSE_EVENTS) +#ifdef MPT_DEBUG_EVENTS #define devtprintk(x) printk x #else #define devtprintk(x) #endif -#ifdef MPT_DEBUG_VERBOSE_EVENTS -#define devtverboseprintk(x) printk x -#else -#define devtverboseprintk(x) -#endif - #ifdef MPT_DEBUG_RESET #define drsprintk(x) printk x #else @@ -894,13 +886,6 @@ typedef struct _mpt_sge { #define DBG_DUMP_REQUEST_FRAME_HDR(mfp) #endif -// debug sas wide ports -#ifdef MPT_DEBUG_SAS_WIDE -#define dsaswideprintk(x) printk x -#else -#define dsaswideprintk(x) -#endif - /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ @@ -980,7 +965,7 @@ typedef struct _MPT_SCSI_HOST { wait_queue_head_t scandv_waitq; int scandv_wait_done; long last_queue_full; - u16 tm_iocstatus; + u8 mpt_pq_filter; } MPT_SCSI_HOST; /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ @@ -1045,7 +1030,10 @@ extern int mpt_config(MPT_ADAPTER *ioc, CONFIGPARMS *cfg); extern void mpt_alloc_fw_memory(MPT_ADAPTER *ioc, int size); extern void mpt_free_fw_memory(MPT_ADAPTER *ioc); extern int mpt_findImVolumes(MPT_ADAPTER *ioc); +extern int mpt_read_ioc_pg_3(MPT_ADAPTER *ioc); extern int mptbase_sas_persist_operation(MPT_ADAPTER *ioc, u8 persist_opcode); +extern int mptbase_GetFcPortPage0(MPT_ADAPTER *ioc, int portnum); +extern int mpt_alt_ioc_wait(MPT_ADAPTER *ioc); /* * Public data decl's... diff --git a/drivers/message/fusion/mptctl.c b/drivers/message/fusion/mptctl.c index 30975ccd9..9b64e0740 100644 --- a/drivers/message/fusion/mptctl.c +++ b/drivers/message/fusion/mptctl.c @@ -140,7 +140,7 @@ static int mptctl_ioc_reset(MPT_ADAPTER *ioc, int reset_phase); * Event Handler function */ static int mptctl_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *pEvReply); -static struct fasync_struct *async_queue=NULL; +struct fasync_struct *async_queue=NULL; /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ /* @@ -497,7 +497,7 @@ mptctl_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *pEvReply) if (event == 0x21 ) { ioc->aen_event_read_flag=1; dctlprintk(("Raised SIGIO to application\n")); - devtverboseprintk(("Raised SIGIO to application\n")); + devtprintk(("Raised SIGIO to application\n")); kill_fasync(&async_queue, SIGIO, POLL_IN); return 1; } @@ -515,7 +515,7 @@ mptctl_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *pEvReply) if (ioc->events && (ioc->eventTypes & ( 1 << event))) { ioc->aen_event_read_flag=1; dctlprintk(("Raised SIGIO to application\n")); - devtverboseprintk(("Raised SIGIO to application\n")); + devtprintk(("Raised SIGIO to application\n")); kill_fasync(&async_queue, SIGIO, POLL_IN); } return 1; @@ -2332,7 +2332,7 @@ done_free_mem: } /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ -/* Prototype Routine for the HOST INFO command. +/* Prototype Routine for the HP HOST INFO command. * * Outputs: None. * Return: 0 if successful @@ -2568,7 +2568,7 @@ mptctl_hp_hostinfo(unsigned long arg, unsigned int data_size) } /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ -/* Prototype Routine for the TARGET INFO command. +/* Prototype Routine for the HP TARGET INFO command. * * Outputs: None. * Return: 0 if successful @@ -2968,7 +2968,7 @@ static int __init mptctl_init(void) } if (mpt_event_register(mptctl_id, mptctl_event_process) == 0) { - devtverboseprintk((KERN_INFO MYNAM + devtprintk((KERN_INFO MYNAM ": Registered for IOC event notifications\n")); } diff --git a/drivers/message/fusion/mptctl.h b/drivers/message/fusion/mptctl.h index 043941882..a2f8a9799 100644 --- a/drivers/message/fusion/mptctl.h +++ b/drivers/message/fusion/mptctl.h @@ -354,6 +354,9 @@ struct mpt_ioctl_command32 { /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ +/* + * HP Specific IOCTL Defines and Structures + */ #define CPQFCTS_IOC_MAGIC 'Z' #define HP_IOC_MAGIC 'Z' @@ -361,6 +364,8 @@ struct mpt_ioctl_command32 { #define HP_GETHOSTINFO1 _IOR(HP_IOC_MAGIC, 20, hp_host_info_rev0_t) #define HP_GETTARGETINFO _IOR(HP_IOC_MAGIC, 21, hp_target_info_t) +/* All HP IOCTLs must include this header + */ typedef struct _hp_header { unsigned int iocnum; unsigned int host; diff --git a/drivers/message/fusion/mptfc.c b/drivers/message/fusion/mptfc.c index 85696f34c..c3a3499bc 100644 --- a/drivers/message/fusion/mptfc.c +++ b/drivers/message/fusion/mptfc.c @@ -77,6 +77,10 @@ MODULE_DESCRIPTION(my_NAME); MODULE_LICENSE("GPL"); /* Command line args */ +static int mpt_pq_filter = 0; +module_param(mpt_pq_filter, int, 0); +MODULE_PARM_DESC(mpt_pq_filter, " Enable peripheral qualifier filter: enable=1 (default=0)"); + #define MPTFC_DEV_LOSS_TMO (60) static int mptfc_dev_loss_tmo = MPTFC_DEV_LOSS_TMO; /* reasonable default */ module_param(mptfc_dev_loss_tmo, int, 0); @@ -128,21 +132,21 @@ static struct scsi_host_template mptfc_driver_template = { */ static struct pci_device_id mptfc_pci_table[] = { - { PCI_VENDOR_ID_LSI_LOGIC, MPI_MANUFACTPAGE_DEVICEID_FC909, + { PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_FC909, PCI_ANY_ID, PCI_ANY_ID }, - { PCI_VENDOR_ID_LSI_LOGIC, MPI_MANUFACTPAGE_DEVICEID_FC919, + { PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_FC919, PCI_ANY_ID, PCI_ANY_ID }, - { PCI_VENDOR_ID_LSI_LOGIC, MPI_MANUFACTPAGE_DEVICEID_FC929, + { PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_FC929, PCI_ANY_ID, PCI_ANY_ID }, - { PCI_VENDOR_ID_LSI_LOGIC, MPI_MANUFACTPAGE_DEVICEID_FC919X, + { PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_FC919X, PCI_ANY_ID, PCI_ANY_ID }, - { PCI_VENDOR_ID_LSI_LOGIC, MPI_MANUFACTPAGE_DEVICEID_FC929X, + { PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_FC929X, PCI_ANY_ID, PCI_ANY_ID }, - { PCI_VENDOR_ID_LSI_LOGIC, MPI_MANUFACTPAGE_DEVICEID_FC939X, + { PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_FC939X, PCI_ANY_ID, PCI_ANY_ID }, - { PCI_VENDOR_ID_LSI_LOGIC, MPI_MANUFACTPAGE_DEVICEID_FC949X, + { PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_FC949X, PCI_ANY_ID, PCI_ANY_ID }, - { PCI_VENDOR_ID_LSI_LOGIC, MPI_MANUFACTPAGE_DEVICEID_FC949E, + { PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_FC949ES, PCI_ANY_ID, PCI_ANY_ID }, {0} /* Terminating entry */ }; @@ -150,7 +154,7 @@ MODULE_DEVICE_TABLE(pci, mptfc_pci_table); static struct scsi_transport_template *mptfc_transport_template = NULL; -static struct fc_function_template mptfc_transport_functions = { +struct fc_function_template mptfc_transport_functions = { .dd_fcrport_size = 8, .show_host_node_name = 1, .show_host_port_name = 1, @@ -165,6 +169,13 @@ static struct fc_function_template mptfc_transport_functions = { }; +/* FIXME! values controlling firmware RESCAN event + * need to be set low to allow dev_loss_tmo to + * work as expected. Currently, firmware doesn't + * notify driver of RESCAN event until some number + * of seconds elapse. This value can be set via + * lsiutil. + */ static void mptfc_set_rport_loss_tmo(struct fc_rport *rport, uint32_t timeout) { @@ -301,8 +312,10 @@ mptfc_GetFcDevPage0(MPT_ADAPTER *ioc, int ioc_port, } out: - kfree(pp0_array); - kfree(p0_array); + if (pp0_array) + kfree(pp0_array); + if (p0_array) + kfree(p0_array); return rc; } @@ -328,10 +341,31 @@ mptfc_generate_rport_ids(FCDevicePage0_t *pg0, struct fc_rport_identifiers *rid) rid->port_name = ((u64)pg0->WWPN.High) << 32 | (u64)pg0->WWPN.Low; rid->port_id = pg0->PortIdentifier; rid->roles = FC_RPORT_ROLE_UNKNOWN; + rid->roles |= FC_RPORT_ROLE_FCP_TARGET; + if (pg0->Protocol & MPI_FC_DEVICE_PAGE0_PROT_FCP_INITIATOR) + rid->roles |= FC_RPORT_ROLE_FCP_INITIATOR; return 0; } +static void +mptfc_remap_sdev(struct scsi_device *sdev, void *arg) +{ + VirtDevice *vdev; + VirtTarget *vtarget; + struct scsi_target *starget; + + starget = scsi_target(sdev); + if (starget->hostdata == arg) { + vtarget = arg; + vdev = sdev->hostdata; + if (vdev) { + vdev->bus_id = vtarget->bus_id; + vdev->target_id = vtarget->target_id; + } + } +} + static void mptfc_register_dev(MPT_ADAPTER *ioc, int channel, FCDevicePage0_t *pg0) { @@ -339,18 +373,15 @@ mptfc_register_dev(MPT_ADAPTER *ioc, int channel, FCDevicePage0_t *pg0) struct fc_rport *rport; struct mptfc_rport_info *ri; int new_ri = 1; - u64 pn, nn; + u64 pn; + unsigned long flags; VirtTarget *vtarget; - u32 roles = FC_RPORT_ROLE_UNKNOWN; if (mptfc_generate_rport_ids(pg0, &rport_ids) < 0) return; - roles |= FC_RPORT_ROLE_FCP_TARGET; - if (pg0->Protocol & MPI_FC_DEVICE_PAGE0_PROT_FCP_INITIATOR) - roles |= FC_RPORT_ROLE_FCP_INITIATOR; - /* scan list looking for a match */ + spin_lock_irqsave(&ioc->fc_rport_lock, flags); list_for_each_entry(ri, &ioc->fc_rports, list) { pn = (u64)ri->pg0.WWPN.High << 32 | (u64)ri->pg0.WWPN.Low; if (pn == rport_ids.port_name) { /* match */ @@ -360,9 +391,11 @@ mptfc_register_dev(MPT_ADAPTER *ioc, int channel, FCDevicePage0_t *pg0) } } if (new_ri) { /* allocate one */ + spin_unlock_irqrestore(&ioc->fc_rport_lock, flags); ri = kzalloc(sizeof(struct mptfc_rport_info), GFP_KERNEL); if (!ri) return; + spin_lock_irqsave(&ioc->fc_rport_lock, flags); list_add_tail(&ri->list, &ioc->fc_rports); } @@ -372,11 +405,14 @@ mptfc_register_dev(MPT_ADAPTER *ioc, int channel, FCDevicePage0_t *pg0) /* MPT_RPORT_INFO_FLAGS_REGISTERED - rport not previously deleted */ if (!(ri->flags & MPT_RPORT_INFO_FLAGS_REGISTERED)) { ri->flags |= MPT_RPORT_INFO_FLAGS_REGISTERED; + spin_unlock_irqrestore(&ioc->fc_rport_lock, flags); rport = fc_remote_port_add(ioc->sh, channel, &rport_ids); + spin_lock_irqsave(&ioc->fc_rport_lock, flags); if (rport) { ri->rport = rport; if (new_ri) /* may have been reset by user */ rport->dev_loss_tmo = mptfc_dev_loss_tmo; + *((struct mptfc_rport_info **)rport->dd_data) = ri; /* * if already mapped, remap here. If not mapped, * target_alloc will allocate vtarget and map, @@ -387,22 +423,19 @@ mptfc_register_dev(MPT_ADAPTER *ioc, int channel, FCDevicePage0_t *pg0) if (vtarget) { vtarget->target_id = pg0->CurrentTargetID; vtarget->bus_id = pg0->CurrentBus; + starget_for_each_device(ri->starget, + vtarget,mptfc_remap_sdev); } + ri->remap_needed = 0; } - *((struct mptfc_rport_info **)rport->dd_data) = ri; - /* scan will be scheduled once rport becomes a target */ - fc_remote_port_rolechg(rport,roles); - - pn = (u64)ri->pg0.WWPN.High << 32 | (u64)ri->pg0.WWPN.Low; - nn = (u64)ri->pg0.WWNN.High << 32 | (u64)ri->pg0.WWNN.Low; dfcprintk ((MYIOC_s_INFO_FMT "mptfc_reg_dev.%d: %x, %llx / %llx, tid %d, " "rport tid %d, tmo %d\n", ioc->name, - ioc->sh->host_no, + oc->sh->host_no, pg0->PortIdentifier, - (unsigned long long)nn, - (unsigned long long)pn, + pg0->WWNN, + pg0->WWPN, pg0->CurrentTargetID, ri->rport->scsi_target_id, ri->rport->dev_loss_tmo)); @@ -412,6 +445,8 @@ mptfc_register_dev(MPT_ADAPTER *ioc, int channel, FCDevicePage0_t *pg0) ri = NULL; } } + spin_unlock_irqrestore(&ioc->fc_rport_lock,flags); + } /* @@ -461,6 +496,7 @@ mptfc_target_alloc(struct scsi_target *starget) vtarget->target_id = ri->pg0.CurrentTargetID; vtarget->bus_id = ri->pg0.CurrentBus; ri->starget = starget; + ri->remap_needed = 0; rc = 0; } } @@ -478,7 +514,7 @@ mptfc_target_alloc(struct scsi_target *starget) * Return non-zero if allocation fails. * Init memory once per LUN. */ -static int +int mptfc_slave_alloc(struct scsi_device *sdev) { MPT_SCSI_HOST *hd; @@ -486,10 +522,10 @@ mptfc_slave_alloc(struct scsi_device *sdev) VirtDevice *vdev; struct scsi_target *starget; struct fc_rport *rport; + unsigned long flags; - starget = scsi_target(sdev); - rport = starget_to_rport(starget); + rport = starget_to_rport(scsi_target(sdev)); if (!rport || fc_remote_port_chkready(rport)) return -ENXIO; @@ -503,41 +539,37 @@ mptfc_slave_alloc(struct scsi_device *sdev) return -ENOMEM; } + spin_lock_irqsave(&hd->ioc->fc_rport_lock,flags); sdev->hostdata = vdev; + starget = scsi_target(sdev); vtarget = starget->hostdata; if (vtarget->num_luns == 0) { vtarget->ioc_id = hd->ioc->id; - vtarget->tflags = MPT_TARGET_FLAGS_Q_YES; + vtarget->tflags = MPT_TARGET_FLAGS_Q_YES | + MPT_TARGET_FLAGS_VALID_INQUIRY; hd->Targets[sdev->id] = vtarget; } vdev->vtarget = vtarget; + vdev->ioc_id = hd->ioc->id; vdev->lun = sdev->lun; + vdev->target_id = vtarget->target_id; + vdev->bus_id = vtarget->bus_id; - vtarget->num_luns++; + spin_unlock_irqrestore(&hd->ioc->fc_rport_lock,flags); + vtarget->num_luns++; -#ifdef DMPT_DEBUG_FC - { - u64 nn, pn; - struct mptfc_rport_info *ri; - ri = *((struct mptfc_rport_info **)rport->dd_data); - pn = (u64)ri->pg0.WWPN.High << 32 | (u64)ri->pg0.WWPN.Low; - nn = (u64)ri->pg0.WWNN.High << 32 | (u64)ri->pg0.WWNN.Low; dfcprintk ((MYIOC_s_INFO_FMT "mptfc_slv_alloc.%d: num_luns %d, sdev.id %d, " "CurrentTargetID %d, %x %llx %llx\n", - hd->ioc->name, + ioc->name, sdev->host->host_no, vtarget->num_luns, sdev->id, ri->pg0.CurrentTargetID, - ri->pg0.PortIdentifier, - (unsigned long long)pn, - (unsigned long long)nn)); - } -#endif + ri->pg0.PortIdentifier, ri->pg0.WWPN, ri->pg0.WWNN)); return 0; } @@ -555,287 +587,13 @@ mptfc_qcmd(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *)) done(SCpnt); return 0; } - - /* dd_data is null until finished adding target */ ri = *((struct mptfc_rport_info **)rport->dd_data); - if (unlikely(!ri)) { - dfcprintk ((MYIOC_s_INFO_FMT - "mptfc_qcmd.%d: %d:%d, dd_data is null.\n", - ((MPT_SCSI_HOST *) SCpnt->device->host->hostdata)->ioc->name, - ((MPT_SCSI_HOST *) SCpnt->device->host->hostdata)->ioc->sh->host_no, - SCpnt->device->id,SCpnt->device->lun)); - SCpnt->result = DID_IMM_RETRY << 16; - done(SCpnt); - return 0; - } - - err = mptscsih_qcmd(SCpnt,done); -#ifdef DMPT_DEBUG_FC - if (unlikely(err)) { - dfcprintk ((MYIOC_s_INFO_FMT - "mptfc_qcmd.%d: %d:%d, mptscsih_qcmd returns non-zero, (%x).\n", - ((MPT_SCSI_HOST *) SCpnt->device->host->hostdata)->ioc->name, - ((MPT_SCSI_HOST *) SCpnt->device->host->hostdata)->ioc->sh->host_no, - SCpnt->device->id,SCpnt->device->lun,err)); - } -#endif - return err; -} - -/* - * mptfc_GetFcPortPage0 - Fetch FCPort config Page0. - * @ioc: Pointer to MPT_ADAPTER structure - * @portnum: IOC Port number - * - * Return: 0 for success - * -ENOMEM if no memory available - * -EPERM if not allowed due to ISR context - * -EAGAIN if no msg frames currently available - * -EFAULT for non-successful reply or no reply (timeout) - * -EINVAL portnum arg out of range (hardwired to two elements) - */ -static int -mptfc_GetFcPortPage0(MPT_ADAPTER *ioc, int portnum) -{ - ConfigPageHeader_t hdr; - CONFIGPARMS cfg; - FCPortPage0_t *ppage0_alloc; - FCPortPage0_t *pp0dest; - dma_addr_t page0_dma; - int data_sz; - int copy_sz; - int rc; - int count = 400; - - if (portnum > 1) - return -EINVAL; - - /* Get FCPort Page 0 header */ - hdr.PageVersion = 0; - hdr.PageLength = 0; - hdr.PageNumber = 0; - hdr.PageType = MPI_CONFIG_PAGETYPE_FC_PORT; - cfg.cfghdr.hdr = &hdr; - cfg.physAddr = -1; - cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER; - cfg.dir = 0; - cfg.pageAddr = portnum; - cfg.timeout = 0; - - if ((rc = mpt_config(ioc, &cfg)) != 0) - return rc; - - if (hdr.PageLength == 0) - return 0; - - data_sz = hdr.PageLength * 4; - rc = -ENOMEM; - ppage0_alloc = (FCPortPage0_t *) pci_alloc_consistent(ioc->pcidev, data_sz, &page0_dma); - if (ppage0_alloc) { - - try_again: - memset((u8 *)ppage0_alloc, 0, data_sz); - cfg.physAddr = page0_dma; - cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT; - - if ((rc = mpt_config(ioc, &cfg)) == 0) { - /* save the data */ - pp0dest = &ioc->fc_port_page0[portnum]; - copy_sz = min_t(int, sizeof(FCPortPage0_t), data_sz); - memcpy(pp0dest, ppage0_alloc, copy_sz); - - /* - * Normalize endianness of structure data, - * by byte-swapping all > 1 byte fields! - */ - pp0dest->Flags = le32_to_cpu(pp0dest->Flags); - pp0dest->PortIdentifier = le32_to_cpu(pp0dest->PortIdentifier); - pp0dest->WWNN.Low = le32_to_cpu(pp0dest->WWNN.Low); - pp0dest->WWNN.High = le32_to_cpu(pp0dest->WWNN.High); - pp0dest->WWPN.Low = le32_to_cpu(pp0dest->WWPN.Low); - pp0dest->WWPN.High = le32_to_cpu(pp0dest->WWPN.High); - pp0dest->SupportedServiceClass = le32_to_cpu(pp0dest->SupportedServiceClass); - pp0dest->SupportedSpeeds = le32_to_cpu(pp0dest->SupportedSpeeds); - pp0dest->CurrentSpeed = le32_to_cpu(pp0dest->CurrentSpeed); - pp0dest->MaxFrameSize = le32_to_cpu(pp0dest->MaxFrameSize); - pp0dest->FabricWWNN.Low = le32_to_cpu(pp0dest->FabricWWNN.Low); - pp0dest->FabricWWNN.High = le32_to_cpu(pp0dest->FabricWWNN.High); - pp0dest->FabricWWPN.Low = le32_to_cpu(pp0dest->FabricWWPN.Low); - pp0dest->FabricWWPN.High = le32_to_cpu(pp0dest->FabricWWPN.High); - pp0dest->DiscoveredPortsCount = le32_to_cpu(pp0dest->DiscoveredPortsCount); - pp0dest->MaxInitiators = le32_to_cpu(pp0dest->MaxInitiators); - - /* - * if still doing discovery, - * hang loose a while until finished - */ - if ((pp0dest->PortState == MPI_FCPORTPAGE0_PORTSTATE_UNKNOWN) || - (pp0dest->PortState == MPI_FCPORTPAGE0_PORTSTATE_ONLINE && - (pp0dest->Flags & MPI_FCPORTPAGE0_FLAGS_ATTACH_TYPE_MASK) - == MPI_FCPORTPAGE0_FLAGS_ATTACH_NO_INIT)) { - if (count-- > 0) { - msleep(100); - goto try_again; - } - printk(MYIOC_s_INFO_FMT "Firmware discovery not" - " complete.\n", - ioc->name); - } - } - - pci_free_consistent(ioc->pcidev, data_sz, (u8 *) ppage0_alloc, page0_dma); - } - - return rc; -} - -static int -mptfc_WriteFcPortPage1(MPT_ADAPTER *ioc, int portnum) -{ - ConfigPageHeader_t hdr; - CONFIGPARMS cfg; - int rc; - - if (portnum > 1) - return -EINVAL; - - if (!(ioc->fc_data.fc_port_page1[portnum].data)) - return -EINVAL; - - /* get fcport page 1 header */ - hdr.PageVersion = 0; - hdr.PageLength = 0; - hdr.PageNumber = 1; - hdr.PageType = MPI_CONFIG_PAGETYPE_FC_PORT; - cfg.cfghdr.hdr = &hdr; - cfg.physAddr = -1; - cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER; - cfg.dir = 0; - cfg.pageAddr = portnum; - cfg.timeout = 0; - - if ((rc = mpt_config(ioc, &cfg)) != 0) - return rc; - - if (hdr.PageLength == 0) - return -ENODEV; - - if (hdr.PageLength*4 != ioc->fc_data.fc_port_page1[portnum].pg_sz) - return -EINVAL; - - cfg.physAddr = ioc->fc_data.fc_port_page1[portnum].dma; - cfg.action = MPI_CONFIG_ACTION_PAGE_WRITE_CURRENT; - cfg.dir = 1; - - rc = mpt_config(ioc, &cfg); - - return rc; -} - -static int -mptfc_GetFcPortPage1(MPT_ADAPTER *ioc, int portnum) -{ - ConfigPageHeader_t hdr; - CONFIGPARMS cfg; - FCPortPage1_t *page1_alloc; - dma_addr_t page1_dma; - int data_sz; - int rc; - - if (portnum > 1) - return -EINVAL; - - /* get fcport page 1 header */ - hdr.PageVersion = 0; - hdr.PageLength = 0; - hdr.PageNumber = 1; - hdr.PageType = MPI_CONFIG_PAGETYPE_FC_PORT; - cfg.cfghdr.hdr = &hdr; - cfg.physAddr = -1; - cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER; - cfg.dir = 0; - cfg.pageAddr = portnum; - cfg.timeout = 0; - - if ((rc = mpt_config(ioc, &cfg)) != 0) - return rc; - - if (hdr.PageLength == 0) - return -ENODEV; - -start_over: - - if (ioc->fc_data.fc_port_page1[portnum].data == NULL) { - data_sz = hdr.PageLength * 4; - if (data_sz < sizeof(FCPortPage1_t)) - data_sz = sizeof(FCPortPage1_t); - - page1_alloc = (FCPortPage1_t *) pci_alloc_consistent(ioc->pcidev, - data_sz, - &page1_dma); - if (!page1_alloc) - return -ENOMEM; - } - else { - page1_alloc = ioc->fc_data.fc_port_page1[portnum].data; - page1_dma = ioc->fc_data.fc_port_page1[portnum].dma; - data_sz = ioc->fc_data.fc_port_page1[portnum].pg_sz; - if (hdr.PageLength * 4 > data_sz) { - ioc->fc_data.fc_port_page1[portnum].data = NULL; - pci_free_consistent(ioc->pcidev, data_sz, (u8 *) - page1_alloc, page1_dma); - goto start_over; - } - } - - memset(page1_alloc,0,data_sz); + if (unlikely(ri->remap_needed)) + return SCSI_MLQUEUE_HOST_BUSY; - cfg.physAddr = page1_dma; - cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT; - - if ((rc = mpt_config(ioc, &cfg)) == 0) { - ioc->fc_data.fc_port_page1[portnum].data = page1_alloc; - ioc->fc_data.fc_port_page1[portnum].pg_sz = data_sz; - ioc->fc_data.fc_port_page1[portnum].dma = page1_dma; - } - else { - ioc->fc_data.fc_port_page1[portnum].data = NULL; - pci_free_consistent(ioc->pcidev, data_sz, (u8 *) - page1_alloc, page1_dma); - } - - return rc; + return mptscsih_qcmd(SCpnt,done); } -static void -mptfc_SetFcPortPage1_defaults(MPT_ADAPTER *ioc) -{ - int ii; - FCPortPage1_t *pp1; - - #define MPTFC_FW_DEVICE_TIMEOUT (1) - #define MPTFC_FW_IO_PEND_TIMEOUT (1) - #define ON_FLAGS (MPI_FCPORTPAGE1_FLAGS_IMMEDIATE_ERROR_REPLY) - #define OFF_FLAGS (MPI_FCPORTPAGE1_FLAGS_VERBOSE_RESCAN_EVENTS) - - for (ii=0; iifacts.NumberOfPorts; ii++) { - if (mptfc_GetFcPortPage1(ioc, ii) != 0) - continue; - pp1 = ioc->fc_data.fc_port_page1[ii].data; - if ((pp1->InitiatorDeviceTimeout == MPTFC_FW_DEVICE_TIMEOUT) - && (pp1->InitiatorIoPendTimeout == MPTFC_FW_IO_PEND_TIMEOUT) - && ((pp1->Flags & ON_FLAGS) == ON_FLAGS) - && ((pp1->Flags & OFF_FLAGS) == 0)) - continue; - pp1->InitiatorDeviceTimeout = MPTFC_FW_DEVICE_TIMEOUT; - pp1->InitiatorIoPendTimeout = MPTFC_FW_IO_PEND_TIMEOUT; - pp1->Flags &= ~OFF_FLAGS; - pp1->Flags |= ON_FLAGS; - mptfc_WriteFcPortPage1(ioc, ii); - } -} - - static void mptfc_init_host_attr(MPT_ADAPTER *ioc,int portnum) { @@ -868,75 +626,74 @@ mptfc_init_host_attr(MPT_ADAPTER *ioc,int portnum) fc_host_tgtid_bind_type(ioc->sh) = FC_TGTID_BIND_BY_WWPN; } -static void -mptfc_setup_reset(void *arg) -{ - MPT_ADAPTER *ioc = (MPT_ADAPTER *)arg; - u64 pn; - struct mptfc_rport_info *ri; - - /* reset about to happen, delete (block) all rports */ - list_for_each_entry(ri, &ioc->fc_rports, list) { - if (ri->flags & MPT_RPORT_INFO_FLAGS_REGISTERED) { - ri->flags &= ~MPT_RPORT_INFO_FLAGS_REGISTERED; - fc_remote_port_delete(ri->rport); /* won't sleep */ - ri->rport = NULL; - - pn = (u64)ri->pg0.WWPN.High << 32 | - (u64)ri->pg0.WWPN.Low; - dfcprintk ((MYIOC_s_INFO_FMT - "mptfc_setup_reset.%d: %llx deleted\n", - ioc->name, - ioc->sh->host_no, - (unsigned long long)pn)); - } - } -} - static void mptfc_rescan_devices(void *arg) { MPT_ADAPTER *ioc = (MPT_ADAPTER *)arg; int ii; - u64 pn; + int work_to_do; + unsigned long flags; struct mptfc_rport_info *ri; - /* start by tagging all ports as missing */ - list_for_each_entry(ri, &ioc->fc_rports, list) { - if (ri->flags & MPT_RPORT_INFO_FLAGS_REGISTERED) { - ri->flags |= MPT_RPORT_INFO_FLAGS_MISSING; + do { + /* start by tagging all ports as missing */ + spin_lock_irqsave(&ioc->fc_rport_lock,flags); + list_for_each_entry(ri, &ioc->fc_rports, list) { + if (ri->flags & MPT_RPORT_INFO_FLAGS_REGISTERED) { + ri->flags |= MPT_RPORT_INFO_FLAGS_MISSING; + } + } + spin_unlock_irqrestore(&ioc->fc_rport_lock,flags); + + /* + * now rescan devices known to adapter, + * will reregister existing rports + */ + for (ii=0; ii < ioc->facts.NumberOfPorts; ii++) { + (void) mptbase_GetFcPortPage0(ioc, ii); + mptfc_init_host_attr(ioc,ii); /* refresh */ + mptfc_GetFcDevPage0(ioc,ii,mptfc_register_dev); } - } - - /* - * now rescan devices known to adapter, - * will reregister existing rports - */ - for (ii=0; ii < ioc->facts.NumberOfPorts; ii++) { - (void) mptfc_GetFcPortPage0(ioc, ii); - mptfc_init_host_attr(ioc, ii); /* refresh */ - mptfc_GetFcDevPage0(ioc, ii, mptfc_register_dev); - } - - /* delete devices still missing */ - list_for_each_entry(ri, &ioc->fc_rports, list) { - /* if newly missing, delete it */ - if (ri->flags & MPT_RPORT_INFO_FLAGS_MISSING) { - - ri->flags &= ~(MPT_RPORT_INFO_FLAGS_REGISTERED| - MPT_RPORT_INFO_FLAGS_MISSING); - fc_remote_port_delete(ri->rport); /* won't sleep */ - ri->rport = NULL; - pn = (u64)ri->pg0.WWPN.High << 32 | - (u64)ri->pg0.WWPN.Low; - dfcprintk ((MYIOC_s_INFO_FMT - "mptfc_rescan.%d: %llx deleted\n", - ioc->name, - ioc->sh->host_no, - (unsigned long long)pn)); + /* delete devices still missing */ + spin_lock_irqsave(&ioc->fc_rport_lock, flags); + list_for_each_entry(ri, &ioc->fc_rports, list) { + /* if newly missing, delete it */ + if ((ri->flags & (MPT_RPORT_INFO_FLAGS_REGISTERED | + MPT_RPORT_INFO_FLAGS_MISSING)) + == (MPT_RPORT_INFO_FLAGS_REGISTERED | + MPT_RPORT_INFO_FLAGS_MISSING)) { + + ri->flags &= ~(MPT_RPORT_INFO_FLAGS_REGISTERED| + MPT_RPORT_INFO_FLAGS_MISSING); + ri->remap_needed = 1; + fc_remote_port_delete(ri->rport); + /* + * remote port not really deleted 'cause + * binding is by WWPN and driver only + * registers FCP_TARGETs but cannot trust + * data structures. + */ + ri->rport = NULL; + dfcprintk ((MYIOC_s_INFO_FMT + "mptfc_rescan.%d: %llx deleted\n", + ioc->name, + ioc->sh->host_no, + ri->pg0.WWPN)); + } } - } + spin_unlock_irqrestore(&ioc->fc_rport_lock,flags); + + /* + * allow multiple passes as target state + * might have changed during scan + */ + spin_lock_irqsave(&ioc->fc_rescan_work_lock, flags); + if (ioc->fc_rescan_work_count > 2) /* only need one more */ + ioc->fc_rescan_work_count = 2; + work_to_do = --ioc->fc_rescan_work_count; + spin_unlock_irqrestore(&ioc->fc_rescan_work_lock, flags); + } while (work_to_do); } static int @@ -1004,9 +761,7 @@ mptfc_probe(struct pci_dev *pdev, const struct pci_device_id *id) goto out_mptfc_probe; } - spin_lock_init(&ioc->fc_rescan_work_lock); INIT_WORK(&ioc->fc_rescan_work, mptfc_rescan_devices,(void *)ioc); - INIT_WORK(&ioc->fc_setup_reset_work, mptfc_setup_reset, (void *)ioc); spin_lock_irqsave(&ioc->FreeQlock, flags); @@ -1113,6 +868,13 @@ mptfc_probe(struct pci_dev *pdev, const struct pci_device_id *id) hd->timer.data = (unsigned long) hd; hd->timer.function = mptscsih_timer_expired; + hd->mpt_pq_filter = mpt_pq_filter; + + ddvprintk((MYIOC_s_INFO_FMT + "mpt_pq_filter %x\n", + ioc->name, + mpt_pq_filter)); + init_waitqueue_head(&hd->scandv_waitq); hd->scandv_wait_done = 0; hd->last_queue_full = 0; @@ -1125,31 +887,10 @@ mptfc_probe(struct pci_dev *pdev, const struct pci_device_id *id) goto out_mptfc_probe; } - /* initialize workqueue */ - - snprintf(ioc->fc_rescan_work_q_name, KOBJ_NAME_LEN, "mptfc_wq_%d", - sh->host_no); - ioc->fc_rescan_work_q = - create_singlethread_workqueue(ioc->fc_rescan_work_q_name); - if (!ioc->fc_rescan_work_q) - goto out_mptfc_probe; - - /* - * Pre-fetch FC port WWN and stuff... - * (FCPortPage0_t stuff) - */ for (ii=0; ii < ioc->facts.NumberOfPorts; ii++) { - (void) mptfc_GetFcPortPage0(ioc, ii); + mptfc_init_host_attr(ioc,ii); + mptfc_GetFcDevPage0(ioc,ii,mptfc_register_dev); } - mptfc_SetFcPortPage1_defaults(ioc); - - /* - * scan for rports - - * by doing it via the workqueue, some locking is eliminated - */ - - queue_work(ioc->fc_rescan_work_q, &ioc->fc_rescan_work); - flush_workqueue(ioc->fc_rescan_work_q); return 0; @@ -1171,77 +912,6 @@ static struct pci_driver mptfc_driver = { #endif }; -static int -mptfc_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *pEvReply) -{ - MPT_SCSI_HOST *hd; - u8 event = le32_to_cpu(pEvReply->Event) & 0xFF; - unsigned long flags; - int rc=1; - - devtverboseprintk((MYIOC_s_INFO_FMT "MPT event (=%02Xh) routed to SCSI host driver!\n", - ioc->name, event)); - - if (ioc->sh == NULL || - ((hd = (MPT_SCSI_HOST *)ioc->sh->hostdata) == NULL)) - return 1; - - switch (event) { - case MPI_EVENT_RESCAN: - spin_lock_irqsave(&ioc->fc_rescan_work_lock, flags); - if (ioc->fc_rescan_work_q) { - queue_work(ioc->fc_rescan_work_q, - &ioc->fc_rescan_work); - } - spin_unlock_irqrestore(&ioc->fc_rescan_work_lock, flags); - break; - default: - rc = mptscsih_event_process(ioc,pEvReply); - break; - } - return rc; -} - -static int -mptfc_ioc_reset(MPT_ADAPTER *ioc, int reset_phase) -{ - int rc; - unsigned long flags; - - rc = mptscsih_ioc_reset(ioc,reset_phase); - if (rc == 0) - return rc; - - - dtmprintk((KERN_WARNING MYNAM - ": IOC %s_reset routed to FC host driver!\n", - reset_phase==MPT_IOC_SETUP_RESET ? "setup" : ( - reset_phase==MPT_IOC_PRE_RESET ? "pre" : "post"))); - - if (reset_phase == MPT_IOC_SETUP_RESET) { - spin_lock_irqsave(&ioc->fc_rescan_work_lock, flags); - if (ioc->fc_rescan_work_q) { - queue_work(ioc->fc_rescan_work_q, - &ioc->fc_setup_reset_work); - } - spin_unlock_irqrestore(&ioc->fc_rescan_work_lock, flags); - } - - else if (reset_phase == MPT_IOC_PRE_RESET) { - } - - else { /* MPT_IOC_POST_RESET */ - mptfc_SetFcPortPage1_defaults(ioc); - spin_lock_irqsave(&ioc->fc_rescan_work_lock, flags); - if (ioc->fc_rescan_work_q) { - queue_work(ioc->fc_rescan_work_q, - &ioc->fc_rescan_work); - } - spin_unlock_irqrestore(&ioc->fc_rescan_work_lock, flags); - } - return 1; -} - /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ /** * mptfc_init - Register MPT adapter(s) as SCSI host(s) with @@ -1256,8 +926,8 @@ mptfc_init(void) show_mptmod_ver(my_NAME, my_VERSION); - /* sanity check module parameters */ - if (mptfc_dev_loss_tmo <= 0) + /* sanity check module parameter */ + if (mptfc_dev_loss_tmo == 0) mptfc_dev_loss_tmo = MPTFC_DEV_LOSS_TMO; mptfc_transport_template = @@ -1270,12 +940,12 @@ mptfc_init(void) mptfcTaskCtx = mpt_register(mptscsih_taskmgmt_complete, MPTFC_DRIVER); mptfcInternalCtx = mpt_register(mptscsih_scandv_complete, MPTFC_DRIVER); - if (mpt_event_register(mptfcDoneCtx, mptfc_event_process) == 0) { - devtverboseprintk((KERN_INFO MYNAM + if (mpt_event_register(mptfcDoneCtx, mptscsih_event_process) == 0) { + devtprintk((KERN_INFO MYNAM ": Registered for IOC event notifications\n")); } - if (mpt_reset_register(mptfcDoneCtx, mptfc_ioc_reset) == 0) { + if (mpt_reset_register(mptfcDoneCtx, mptscsih_ioc_reset) == 0) { dprintk((KERN_INFO MYNAM ": Registered for IOC reset notifications\n")); } @@ -1296,19 +966,8 @@ mptfc_init(void) static void __devexit mptfc_remove(struct pci_dev *pdev) { - MPT_ADAPTER *ioc = pci_get_drvdata(pdev); - struct mptfc_rport_info *p, *n; - struct workqueue_struct *work_q; - unsigned long flags; - int ii; - - /* destroy workqueue */ - if ((work_q=ioc->fc_rescan_work_q)) { - spin_lock_irqsave(&ioc->fc_rescan_work_lock, flags); - ioc->fc_rescan_work_q = NULL; - spin_unlock_irqrestore(&ioc->fc_rescan_work_lock, flags); - destroy_workqueue(work_q); - } + MPT_ADAPTER *ioc = pci_get_drvdata(pdev); + struct mptfc_rport_info *p, *n; fc_remove_host(ioc->sh); @@ -1317,16 +976,6 @@ mptfc_remove(struct pci_dev *pdev) kfree(p); } - for (ii=0; iifacts.NumberOfPorts; ii++) { - if (ioc->fc_data.fc_port_page1[ii].data) { - pci_free_consistent(ioc->pcidev, - ioc->fc_data.fc_port_page1[ii].pg_sz, - (u8 *) ioc->fc_data.fc_port_page1[ii].data, - ioc->fc_data.fc_port_page1[ii].dma); - ioc->fc_data.fc_port_page1[ii].data = NULL; - } - } - mptscsih_remove(pdev); } diff --git a/drivers/message/fusion/mptlan.c b/drivers/message/fusion/mptlan.c index 314c3a275..73f595282 100644 --- a/drivers/message/fusion/mptlan.c +++ b/drivers/message/fusion/mptlan.c @@ -1152,7 +1152,10 @@ mpt_lan_receive_post_reply(struct net_device *dev, priv->mpt_rxfidx_tail, MPT_LAN_MAX_BUCKETS_OUT); - return -1; + panic("Damn it Jim! I'm a doctor, not a programmer! " + "Oh, wait a sec, I am a programmer. " + "And, who's Jim?!?!\n" + "Arrgghh! We've done it again!\n"); } if (remaining == 0) diff --git a/drivers/message/fusion/mptsas.c b/drivers/message/fusion/mptsas.c index f66f22031..2512d0e61 100644 --- a/drivers/message/fusion/mptsas.c +++ b/drivers/message/fusion/mptsas.c @@ -50,14 +50,11 @@ #include #include #include -#include /* for mdelay */ -#include #include #include #include #include -#include #include "mptbase.h" #include "mptscsih.h" @@ -67,19 +64,20 @@ #define my_VERSION MPT_LINUX_VERSION_COMMON #define MYNAM "mptsas" -/* - * Reserved channel for integrated raid - */ -#define MPTSAS_RAID_CHANNEL 1 - MODULE_AUTHOR(MODULEAUTHOR); MODULE_DESCRIPTION(my_NAME); MODULE_LICENSE("GPL"); +static int mpt_pq_filter; +module_param(mpt_pq_filter, int, 0); +MODULE_PARM_DESC(mpt_pq_filter, + "Enable peripheral qualifier filter: enable=1 " + "(default=0)"); + static int mpt_pt_clear; module_param(mpt_pt_clear, int, 0); MODULE_PARM_DESC(mpt_pt_clear, - " Clear persistency table: enable=1 " + "Clear persistency table: enable=1 " "(default=MPTSCSIH_PT_CLEAR=0)"); static int mptsasDoneCtx = -1; @@ -93,7 +91,6 @@ enum mptsas_hotplug_action { MPTSAS_DEL_DEVICE, MPTSAS_ADD_RAID, MPTSAS_DEL_RAID, - MPTSAS_IGNORE_EVENT, }; struct mptsas_hotplug_event { @@ -107,13 +104,6 @@ struct mptsas_hotplug_event { u16 handle; u16 parent_handle; u8 phy_id; - u8 phys_disk_num; - u8 phys_disk_num_valid; -}; - -struct mptsas_discovery_event { - struct work_struct work; - MPT_ADAPTER *ioc; }; /* @@ -127,8 +117,6 @@ struct mptsas_discovery_event { struct mptsas_devinfo { u16 handle; /* unique id to address this device */ u16 handle_parent; /* unique id to address parent device */ - u16 handle_enclosure; /* enclosure identifier of the enclosure */ - u16 slot; /* physical slot in enclosure */ u8 phy_id; /* phy number of parent device */ u8 port_id; /* sas physical port this device is assoc'd with */ @@ -139,52 +127,27 @@ struct mptsas_devinfo { u32 device_info; /* bitfield detailed info about this device */ }; -/* - * Specific details on ports, wide/narrow - */ -struct mptsas_portinfo_details{ - u16 num_phys; /* number of phys belong to this port */ - u64 phy_bitmask; /* TODO, extend support for 255 phys */ - struct sas_rphy *rphy; /* transport layer rphy object */ - struct sas_port *port; /* transport layer port object */ - struct scsi_target *starget; - struct mptsas_portinfo *port_info; -}; - struct mptsas_phyinfo { u8 phy_id; /* phy index */ - u8 port_id; /* firmware port identifier */ + u8 port_id; /* port number this phy is part of */ u8 negotiated_link_rate; /* nego'd link rate for this phy */ u8 hw_link_rate; /* hardware max/min phys link rate */ u8 programmed_link_rate; /* programmed max/min phy link rate */ - u8 sas_port_add_phy; /* flag to request sas_port_add_phy*/ struct mptsas_devinfo identify; /* point to phy device info */ struct mptsas_devinfo attached; /* point to attached device info */ - struct sas_phy *phy; /* transport layer phy object */ - struct mptsas_portinfo *portinfo; - struct mptsas_portinfo_details * port_details; + struct sas_phy *phy; + struct sas_rphy *rphy; }; struct mptsas_portinfo { struct list_head list; u16 handle; /* unique id to address this */ - u16 num_phys; /* number of phys */ + u8 num_phys; /* number of phys */ struct mptsas_phyinfo *phy_info; }; -struct mptsas_enclosure { - u64 enclosure_logical_id; /* The WWN for the enclosure */ - u16 enclosure_handle; /* unique id to address this */ - u16 flags; /* details enclosure management */ - u16 num_slot; /* num slots */ - u16 start_slot; /* first slot */ - u8 start_id; /* starting logical target id */ - u8 start_channel; /* starting logical channel id */ - u8 sep_id; /* SEP device logical target id */ - u8 sep_channel; /* SEP channel logical channel id */ -}; -#ifdef MPT_DEBUG_SAS +#ifdef SASDEBUG static void mptsas_print_phy_data(MPI_SAS_IO_UNIT0_PHY_DATA *phy_data) { printk("---- IO UNIT PAGE 0 ------------\n"); @@ -242,7 +205,6 @@ static void mptsas_print_device_pg0(SasDevicePage0_t *pg0) printk("---- SAS DEVICE PAGE 0 ---------\n"); printk("Handle=0x%X\n" ,le16_to_cpu(pg0->DevHandle)); - printk("Parent Handle=0x%X\n" ,le16_to_cpu(pg0->ParentDevHandle)); printk("Enclosure Handle=0x%X\n", le16_to_cpu(pg0->EnclosureHandle)); printk("Slot=0x%X\n", le16_to_cpu(pg0->Slot)); printk("SAS Address=0x%llX\n", le64_to_cpu(sas_address)); @@ -281,474 +243,12 @@ static void mptsas_print_expander_pg1(SasExpanderPage1_t *pg1) #define mptsas_print_expander_pg1(pg1) do { } while (0) #endif -static inline MPT_ADAPTER *phy_to_ioc(struct sas_phy *phy) -{ - struct Scsi_Host *shost = dev_to_shost(phy->dev.parent); - return ((MPT_SCSI_HOST *)shost->hostdata)->ioc; -} - -static inline MPT_ADAPTER *rphy_to_ioc(struct sas_rphy *rphy) -{ - struct Scsi_Host *shost = dev_to_shost(rphy->dev.parent->parent); - return ((MPT_SCSI_HOST *)shost->hostdata)->ioc; -} - -/* - * mptsas_find_portinfo_by_handle - * - * This function should be called with the sas_topology_mutex already held - */ -static struct mptsas_portinfo * -mptsas_find_portinfo_by_handle(MPT_ADAPTER *ioc, u16 handle) -{ - struct mptsas_portinfo *port_info, *rc=NULL; - int i; - - list_for_each_entry(port_info, &ioc->sas_topology, list) - for (i = 0; i < port_info->num_phys; i++) - if (port_info->phy_info[i].identify.handle == handle) { - rc = port_info; - goto out; - } - out: - return rc; -} /* - * Returns true if there is a scsi end device + * This is pretty ugly. We will be able to seriously clean it up + * once the DV code in mptscsih goes away and we can properly + * implement ->target_alloc. */ -static inline int -mptsas_is_end_device(struct mptsas_devinfo * attached) -{ - if ((attached->sas_address) && - (attached->device_info & - MPI_SAS_DEVICE_INFO_END_DEVICE) && - ((attached->device_info & - MPI_SAS_DEVICE_INFO_SSP_TARGET) | - (attached->device_info & - MPI_SAS_DEVICE_INFO_STP_TARGET) | - (attached->device_info & - MPI_SAS_DEVICE_INFO_SATA_DEVICE))) - return 1; - else - return 0; -} - -/* no mutex */ -static void -mptsas_port_delete(struct mptsas_portinfo_details * port_details) -{ - struct mptsas_portinfo *port_info; - struct mptsas_phyinfo *phy_info; - u8 i; - - if (!port_details) - return; - - port_info = port_details->port_info; - phy_info = port_info->phy_info; - - dsaswideprintk((KERN_DEBUG "%s: [%p]: num_phys=%02d " - "bitmask=0x%016llX\n", - __FUNCTION__, port_details, port_details->num_phys, - port_details->phy_bitmask)); - - for (i = 0; i < port_info->num_phys; i++, phy_info++) { - if(phy_info->port_details != port_details) - continue; - memset(&phy_info->attached, 0, sizeof(struct mptsas_devinfo)); - phy_info->port_details = NULL; - } - kfree(port_details); -} - -static inline struct sas_rphy * -mptsas_get_rphy(struct mptsas_phyinfo *phy_info) -{ - if (phy_info->port_details) - return phy_info->port_details->rphy; - else - return NULL; -} - -static inline void -mptsas_set_rphy(struct mptsas_phyinfo *phy_info, struct sas_rphy *rphy) -{ - if (phy_info->port_details) { - phy_info->port_details->rphy = rphy; - dsaswideprintk((KERN_DEBUG "sas_rphy_add: rphy=%p\n", rphy)); - } - -#ifdef MPT_DEBUG_SAS_WIDE - if (rphy) { - dev_printk(KERN_DEBUG, &rphy->dev, "add:"); - printk("rphy=%p release=%p\n", - rphy, rphy->dev.release); - } -#endif -} - -static inline struct sas_port * -mptsas_get_port(struct mptsas_phyinfo *phy_info) -{ - if (phy_info->port_details) - return phy_info->port_details->port; - else - return NULL; -} - -static inline void -mptsas_set_port(struct mptsas_phyinfo *phy_info, struct sas_port *port) -{ - if (phy_info->port_details) - phy_info->port_details->port = port; - -#ifdef MPT_DEBUG_SAS_WIDE - if (port) { - dev_printk(KERN_DEBUG, &port->dev, "add: "); - printk("port=%p release=%p\n", - port, port->dev.release); - } -#endif -} - -static inline struct scsi_target * -mptsas_get_starget(struct mptsas_phyinfo *phy_info) -{ - if (phy_info->port_details) - return phy_info->port_details->starget; - else - return NULL; -} - -static inline void -mptsas_set_starget(struct mptsas_phyinfo *phy_info, struct scsi_target * -starget) -{ - if (phy_info->port_details) - phy_info->port_details->starget = starget; -} - - -/* - * mptsas_setup_wide_ports - * - * Updates for new and existing narrow/wide port configuration - * in the sas_topology - */ -static void -mptsas_setup_wide_ports(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info) -{ - struct mptsas_portinfo_details * port_details; - struct mptsas_phyinfo *phy_info, *phy_info_cmp; - u64 sas_address; - int i, j; - - mutex_lock(&ioc->sas_topology_mutex); - - phy_info = port_info->phy_info; - for (i = 0 ; i < port_info->num_phys ; i++, phy_info++) { - if (phy_info->attached.handle) - continue; - port_details = phy_info->port_details; - if (!port_details) - continue; - if (port_details->num_phys < 2) - continue; - /* - * Removing a phy from a port, letting the last - * phy be removed by firmware events. - */ - dsaswideprintk((KERN_DEBUG - "%s: [%p]: deleting phy = %d\n", - __FUNCTION__, port_details, i)); - port_details->num_phys--; - port_details->phy_bitmask &= ~ (1 << phy_info->phy_id); - memset(&phy_info->attached, 0, sizeof(struct mptsas_devinfo)); - sas_port_delete_phy(port_details->port, phy_info->phy); - phy_info->port_details = NULL; - } - - /* - * Populate and refresh the tree - */ - phy_info = port_info->phy_info; - for (i = 0 ; i < port_info->num_phys ; i++, phy_info++) { - sas_address = phy_info->attached.sas_address; - dsaswideprintk((KERN_DEBUG "phy_id=%d sas_address=0x%018llX\n", - i, sas_address)); - if (!sas_address) - continue; - port_details = phy_info->port_details; - /* - * Forming a port - */ - if (!port_details) { - port_details = kzalloc(sizeof(*port_details), - GFP_KERNEL); - if (!port_details) - goto out; - port_details->num_phys = 1; - port_details->port_info = port_info; - if (phy_info->phy_id < 64 ) - port_details->phy_bitmask |= - (1 << phy_info->phy_id); - phy_info->sas_port_add_phy=1; - dsaswideprintk((KERN_DEBUG "\t\tForming port\n\t\t" - "phy_id=%d sas_address=0x%018llX\n", - i, sas_address)); - phy_info->port_details = port_details; - } - - if (i == port_info->num_phys - 1) - continue; - phy_info_cmp = &port_info->phy_info[i + 1]; - for (j = i + 1 ; j < port_info->num_phys ; j++, - phy_info_cmp++) { - if (!phy_info_cmp->attached.sas_address) - continue; - if (sas_address != phy_info_cmp->attached.sas_address) - continue; - if (phy_info_cmp->port_details == port_details ) - continue; - dsaswideprintk((KERN_DEBUG - "\t\tphy_id=%d sas_address=0x%018llX\n", - j, phy_info_cmp->attached.sas_address)); - if (phy_info_cmp->port_details) { - port_details->rphy = - mptsas_get_rphy(phy_info_cmp); - port_details->port = - mptsas_get_port(phy_info_cmp); - port_details->starget = - mptsas_get_starget(phy_info_cmp); - port_details->num_phys = - phy_info_cmp->port_details->num_phys; - if (!phy_info_cmp->port_details->num_phys) - kfree(phy_info_cmp->port_details); - } else - phy_info_cmp->sas_port_add_phy=1; - /* - * Adding a phy to a port - */ - phy_info_cmp->port_details = port_details; - if (phy_info_cmp->phy_id < 64 ) - port_details->phy_bitmask |= - (1 << phy_info_cmp->phy_id); - port_details->num_phys++; - } - } - - out: - -#ifdef MPT_DEBUG_SAS_WIDE - for (i = 0; i < port_info->num_phys; i++) { - port_details = port_info->phy_info[i].port_details; - if (!port_details) - continue; - dsaswideprintk((KERN_DEBUG - "%s: [%p]: phy_id=%02d num_phys=%02d " - "bitmask=0x%016llX\n", - __FUNCTION__, - port_details, i, port_details->num_phys, - port_details->phy_bitmask)); - dsaswideprintk((KERN_DEBUG"\t\tport = %p rphy=%p\n", - port_details->port, port_details->rphy)); - } - dsaswideprintk((KERN_DEBUG"\n")); -#endif - mutex_unlock(&ioc->sas_topology_mutex); -} - -static void -mptsas_target_reset(MPT_ADAPTER *ioc, VirtTarget * vtarget) -{ - MPT_SCSI_HOST *hd = (MPT_SCSI_HOST *)ioc->sh->hostdata; - - if (mptscsih_TMHandler(hd, - MPI_SCSITASKMGMT_TASKTYPE_TARGET_RESET, - vtarget->bus_id, vtarget->target_id, 0, 0, 5) < 0) { - hd->tmPending = 0; - hd->tmState = TM_STATE_NONE; - printk(MYIOC_s_WARN_FMT - "Error processing TaskMgmt id=%d TARGET_RESET\n", - ioc->name, vtarget->target_id); - } -} - -static int -mptsas_sas_enclosure_pg0(MPT_ADAPTER *ioc, struct mptsas_enclosure *enclosure, - u32 form, u32 form_specific) -{ - ConfigExtendedPageHeader_t hdr; - CONFIGPARMS cfg; - SasEnclosurePage0_t *buffer; - dma_addr_t dma_handle; - int error; - __le64 le_identifier; - - memset(&hdr, 0, sizeof(hdr)); - hdr.PageVersion = MPI_SASENCLOSURE0_PAGEVERSION; - hdr.PageNumber = 0; - hdr.PageType = MPI_CONFIG_PAGETYPE_EXTENDED; - hdr.ExtPageType = MPI_CONFIG_EXTPAGETYPE_ENCLOSURE; - - cfg.cfghdr.ehdr = &hdr; - cfg.physAddr = -1; - cfg.pageAddr = form + form_specific; - cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER; - cfg.dir = 0; /* read */ - cfg.timeout = 10; - - error = mpt_config(ioc, &cfg); - if (error) - goto out; - if (!hdr.ExtPageLength) { - error = -ENXIO; - goto out; - } - - buffer = pci_alloc_consistent(ioc->pcidev, hdr.ExtPageLength * 4, - &dma_handle); - if (!buffer) { - error = -ENOMEM; - goto out; - } - - cfg.physAddr = dma_handle; - cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT; - - error = mpt_config(ioc, &cfg); - if (error) - goto out_free_consistent; - - /* save config data */ - memcpy(&le_identifier, &buffer->EnclosureLogicalID, sizeof(__le64)); - enclosure->enclosure_logical_id = le64_to_cpu(le_identifier); - enclosure->enclosure_handle = le16_to_cpu(buffer->EnclosureHandle); - enclosure->flags = le16_to_cpu(buffer->Flags); - enclosure->num_slot = le16_to_cpu(buffer->NumSlots); - enclosure->start_slot = le16_to_cpu(buffer->StartSlot); - enclosure->start_id = buffer->StartTargetID; - enclosure->start_channel = buffer->StartBus; - enclosure->sep_id = buffer->SEPTargetID; - enclosure->sep_channel = buffer->SEPBus; - - out_free_consistent: - pci_free_consistent(ioc->pcidev, hdr.ExtPageLength * 4, - buffer, dma_handle); - out: - return error; -} - -static int -mptsas_slave_configure(struct scsi_device *sdev) -{ - - if (sdev->channel == MPTSAS_RAID_CHANNEL) - goto out; - - sas_read_port_mode_page(sdev); - - out: - return mptscsih_slave_configure(sdev); -} - -static int -mptsas_target_alloc(struct scsi_target *starget) -{ - struct Scsi_Host *host = dev_to_shost(&starget->dev); - MPT_SCSI_HOST *hd = (MPT_SCSI_HOST *)host->hostdata; - VirtTarget *vtarget; - u32 target_id; - u32 channel; - struct sas_rphy *rphy; - struct mptsas_portinfo *p; - int i; - - vtarget = kzalloc(sizeof(VirtTarget), GFP_KERNEL); - if (!vtarget) - return -ENOMEM; - - vtarget->starget = starget; - vtarget->ioc_id = hd->ioc->id; - vtarget->tflags = MPT_TARGET_FLAGS_Q_YES|MPT_TARGET_FLAGS_VALID_INQUIRY; - - target_id = starget->id; - channel = 0; - - hd->Targets[target_id] = vtarget; - - if (starget->channel == MPTSAS_RAID_CHANNEL) - goto out; - - rphy = dev_to_rphy(starget->dev.parent); - mutex_lock(&hd->ioc->sas_topology_mutex); - list_for_each_entry(p, &hd->ioc->sas_topology, list) { - for (i = 0; i < p->num_phys; i++) { - if (p->phy_info[i].attached.sas_address != - rphy->identify.sas_address) - continue; - target_id = p->phy_info[i].attached.id; - channel = p->phy_info[i].attached.channel; - mptsas_set_starget(&p->phy_info[i], starget); - - /* - * Exposing hidden raid components - */ - if (mptscsih_is_phys_disk(hd->ioc, target_id)) { - target_id = mptscsih_raid_id_to_num(hd, - target_id); - vtarget->tflags |= - MPT_TARGET_FLAGS_RAID_COMPONENT; - } - mutex_unlock(&hd->ioc->sas_topology_mutex); - goto out; - } - } - mutex_unlock(&hd->ioc->sas_topology_mutex); - - kfree(vtarget); - return -ENXIO; - - out: - vtarget->target_id = target_id; - vtarget->bus_id = channel; - starget->hostdata = vtarget; - return 0; -} - -static void -mptsas_target_destroy(struct scsi_target *starget) -{ - struct Scsi_Host *host = dev_to_shost(&starget->dev); - MPT_SCSI_HOST *hd = (MPT_SCSI_HOST *)host->hostdata; - struct sas_rphy *rphy; - struct mptsas_portinfo *p; - int i; - - if (!starget->hostdata) - return; - - if (starget->channel == MPTSAS_RAID_CHANNEL) - goto out; - - rphy = dev_to_rphy(starget->dev.parent); - list_for_each_entry(p, &hd->ioc->sas_topology, list) { - for (i = 0; i < p->num_phys; i++) { - if (p->phy_info[i].attached.sas_address != - rphy->identify.sas_address) - continue; - mptsas_set_starget(&p->phy_info[i], NULL); - goto out; - } - } - - out: - kfree(starget->hostdata); - starget->hostdata = NULL; -} - - static int mptsas_slave_alloc(struct scsi_device *sdev) { @@ -756,38 +256,50 @@ mptsas_slave_alloc(struct scsi_device *sdev) MPT_SCSI_HOST *hd = (MPT_SCSI_HOST *)host->hostdata; struct sas_rphy *rphy; struct mptsas_portinfo *p; + VirtTarget *vtarget; VirtDevice *vdev; struct scsi_target *starget; - int i; + int i; vdev = kzalloc(sizeof(VirtDevice), GFP_KERNEL); if (!vdev) { - printk(MYIOC_s_ERR_FMT "slave_alloc kzalloc(%zd) FAILED!\n", + printk(MYIOC_s_ERR_FMT "slave_alloc kmalloc(%zd) FAILED!\n", hd->ioc->name, sizeof(VirtDevice)); return -ENOMEM; } + vdev->ioc_id = hd->ioc->id; + sdev->hostdata = vdev; starget = scsi_target(sdev); - vdev->vtarget = starget->hostdata; + vtarget = starget->hostdata; + vdev->vtarget = vtarget; + if (vtarget->num_luns == 0) { + vtarget->tflags = MPT_TARGET_FLAGS_Q_YES|MPT_TARGET_FLAGS_VALID_INQUIRY; + hd->Targets[sdev->id] = vtarget; + } - if (sdev->channel == MPTSAS_RAID_CHANNEL) + /* + RAID volumes placed beyond the last expected port. + */ + if (sdev->channel == hd->ioc->num_ports) { + vdev->target_id = sdev->id; + vdev->bus_id = 0; + vdev->lun = 0; goto out; + } rphy = dev_to_rphy(sdev->sdev_target->dev.parent); mutex_lock(&hd->ioc->sas_topology_mutex); list_for_each_entry(p, &hd->ioc->sas_topology, list) { for (i = 0; i < p->num_phys; i++) { - if (p->phy_info[i].attached.sas_address != - rphy->identify.sas_address) - continue; - vdev->lun = sdev->lun; - /* - * Exposing hidden raid components - */ - if (mptscsih_is_phys_disk(hd->ioc, - p->phy_info[i].attached.id)) - sdev->no_uld_attach = 1; - mutex_unlock(&hd->ioc->sas_topology_mutex); - goto out; + if (p->phy_info[i].attached.sas_address == + rphy->identify.sas_address) { + vdev->target_id = + p->phy_info[i].attached.id; + vdev->bus_id = p->phy_info[i].attached.channel; + vdev->lun = sdev->lun; + mutex_unlock(&hd->ioc->sas_topology_mutex); + goto out; + } } } mutex_unlock(&hd->ioc->sas_topology_mutex); @@ -796,26 +308,70 @@ mptsas_slave_alloc(struct scsi_device *sdev) return -ENXIO; out: - vdev->vtarget->num_luns++; - sdev->hostdata = vdev; + vtarget->ioc_id = vdev->ioc_id; + vtarget->target_id = vdev->target_id; + vtarget->bus_id = vdev->bus_id; + vtarget->num_luns++; return 0; } -static int -mptsas_qcmd(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *)) +static void +mptsas_slave_destroy(struct scsi_device *sdev) { - VirtDevice *vdev = SCpnt->device->hostdata; + struct Scsi_Host *host = sdev->host; + MPT_SCSI_HOST *hd = (MPT_SCSI_HOST *)host->hostdata; + struct sas_rphy *rphy; + struct mptsas_portinfo *p; + int i; + VirtDevice *vdev; -// scsi_print_command(SCpnt); - if (vdev->vtarget->deleted) { - SCpnt->result = DID_NO_CONNECT << 16; - done(SCpnt); - return 0; + /* + * Handle hotplug removal case. + * We need to clear out attached data structure. + */ + rphy = dev_to_rphy(sdev->sdev_target->dev.parent); + + mutex_lock(&hd->ioc->sas_topology_mutex); + list_for_each_entry(p, &hd->ioc->sas_topology, list) { + for (i = 0; i < p->num_phys; i++) { + if (p->phy_info[i].attached.sas_address == + rphy->identify.sas_address) { + memset(&p->phy_info[i].attached, 0, + sizeof(struct mptsas_devinfo)); + p->phy_info[i].rphy = NULL; + goto out; + } + } } - return mptscsih_qcmd(SCpnt,done); -} + out: + mutex_unlock(&hd->ioc->sas_topology_mutex); + /* + * Issue target reset to flush firmware outstanding commands. + */ + vdev = sdev->hostdata; + if (vdev->configured_lun){ + if (mptscsih_TMHandler(hd, + MPI_SCSITASKMGMT_TASKTYPE_TARGET_RESET, + vdev->bus_id, + vdev->target_id, + 0, 0, 5 /* 5 second timeout */) + < 0){ + + /* The TM request failed! + * Fatal error case. + */ + printk(MYIOC_s_WARN_FMT + "Error processing TaskMgmt id=%d TARGET_RESET\n", + hd->ioc->name, + vdev->target_id); + hd->tmPending = 0; + hd->tmState = TM_STATE_NONE; + } + } + mptscsih_slave_destroy(sdev); +} static struct scsi_host_template mptsas_driver_template = { .module = THIS_MODULE, @@ -823,12 +379,12 @@ static struct scsi_host_template mptsas_driver_template = { .proc_info = mptscsih_proc_info, .name = "MPT SPI Host", .info = mptscsih_info, - .queuecommand = mptsas_qcmd, - .target_alloc = mptsas_target_alloc, + .queuecommand = mptscsih_qcmd, + .target_alloc = mptscsih_target_alloc, .slave_alloc = mptsas_slave_alloc, - .slave_configure = mptsas_slave_configure, - .target_destroy = mptsas_target_destroy, - .slave_destroy = mptscsih_slave_destroy, + .slave_configure = mptscsih_slave_configure, + .target_destroy = mptscsih_target_destroy, + .slave_destroy = mptsas_slave_destroy, .change_queue_depth = mptscsih_change_queue_depth, .eh_abort_handler = mptscsih_abort, .eh_device_reset_handler = mptscsih_dev_reset, @@ -843,6 +399,12 @@ static struct scsi_host_template mptsas_driver_template = { .use_clustering = ENABLE_CLUSTERING, }; +static inline MPT_ADAPTER *phy_to_ioc(struct sas_phy *phy) +{ + struct Scsi_Host *shost = dev_to_shost(phy->dev.parent); + return ((MPT_SCSI_HOST *)shost->hostdata)->ioc; +} + static int mptsas_get_linkerrors(struct sas_phy *phy) { MPT_ADAPTER *ioc = phy_to_ioc(phy); @@ -984,67 +546,8 @@ static int mptsas_phy_reset(struct sas_phy *phy, int hard_reset) return error; } -static int -mptsas_get_enclosure_identifier(struct sas_rphy *rphy, u64 *identifier) -{ - MPT_ADAPTER *ioc = rphy_to_ioc(rphy); - int i, error; - struct mptsas_portinfo *p; - struct mptsas_enclosure enclosure_info; - u64 enclosure_handle; - - mutex_lock(&ioc->sas_topology_mutex); - list_for_each_entry(p, &ioc->sas_topology, list) { - for (i = 0; i < p->num_phys; i++) { - if (p->phy_info[i].attached.sas_address == - rphy->identify.sas_address) { - enclosure_handle = p->phy_info[i]. - attached.handle_enclosure; - goto found_info; - } - } - } - mutex_unlock(&ioc->sas_topology_mutex); - return -ENXIO; - - found_info: - mutex_unlock(&ioc->sas_topology_mutex); - memset(&enclosure_info, 0, sizeof(struct mptsas_enclosure)); - error = mptsas_sas_enclosure_pg0(ioc, &enclosure_info, - (MPI_SAS_ENCLOS_PGAD_FORM_HANDLE << - MPI_SAS_ENCLOS_PGAD_FORM_SHIFT), enclosure_handle); - if (!error) - *identifier = enclosure_info.enclosure_logical_id; - return error; -} - -static int -mptsas_get_bay_identifier(struct sas_rphy *rphy) -{ - MPT_ADAPTER *ioc = rphy_to_ioc(rphy); - struct mptsas_portinfo *p; - int i, rc; - - mutex_lock(&ioc->sas_topology_mutex); - list_for_each_entry(p, &ioc->sas_topology, list) { - for (i = 0; i < p->num_phys; i++) { - if (p->phy_info[i].attached.sas_address == - rphy->identify.sas_address) { - rc = p->phy_info[i].attached.slot; - goto out; - } - } - } - rc = -ENXIO; - out: - mutex_unlock(&ioc->sas_topology_mutex); - return rc; -} - static struct sas_function_template mptsas_transport_functions = { .get_linkerrors = mptsas_get_linkerrors, - .get_enclosure_identifier = mptsas_get_enclosure_identifier, - .get_bay_identifier = mptsas_get_bay_identifier, .phy_reset = mptsas_phy_reset, }; @@ -1098,15 +601,12 @@ mptsas_sas_io_unit_pg0(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info) port_info->num_phys = buffer->NumPhys; port_info->phy_info = kcalloc(port_info->num_phys, - sizeof(*port_info->phy_info),GFP_KERNEL); + sizeof(struct mptsas_phyinfo),GFP_KERNEL); if (!port_info->phy_info) { error = -ENOMEM; goto out_free_consistent; } - if (port_info->num_phys) - port_info->handle = - le16_to_cpu(buffer->PhyData[0].ControllerDevHandle); for (i = 0; i < port_info->num_phys; i++) { mptsas_print_phy_data(&buffer->PhyData[i]); port_info->phy_info[i].phy_id = i; @@ -1114,7 +614,6 @@ mptsas_sas_io_unit_pg0(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info) buffer->PhyData[i].Port; port_info->phy_info[i].negotiated_link_rate = buffer->PhyData[i].NegotiatedLinkRate; - port_info->phy_info[i].portinfo = port_info; } out_free_consistent: @@ -1197,11 +696,7 @@ mptsas_sas_device_pg0(MPT_ADAPTER *ioc, struct mptsas_devinfo *device_info, SasDevicePage0_t *buffer; dma_addr_t dma_handle; __le64 sas_address; - int error=0; - - if (ioc->sas_discovery_runtime && - mptsas_is_end_device(device_info)) - goto out; + int error; hdr.PageVersion = MPI_SASDEVICE0_PAGEVERSION; hdr.ExtPageLength = 0; @@ -1218,7 +713,6 @@ mptsas_sas_device_pg0(MPT_ADAPTER *ioc, struct mptsas_devinfo *device_info, cfg.dir = 0; /* read */ cfg.timeout = 10; - memset(device_info, 0, sizeof(struct mptsas_devinfo)); error = mpt_config(ioc, &cfg); if (error) goto out; @@ -1245,9 +739,6 @@ mptsas_sas_device_pg0(MPT_ADAPTER *ioc, struct mptsas_devinfo *device_info, device_info->handle = le16_to_cpu(buffer->DevHandle); device_info->handle_parent = le16_to_cpu(buffer->ParentDevHandle); - device_info->handle_enclosure = - le16_to_cpu(buffer->EnclosureHandle); - device_info->slot = le16_to_cpu(buffer->Slot); device_info->phy_id = buffer->PhyNum; device_info->port_id = buffer->PhysicalPort; device_info->id = buffer->TargetID; @@ -1272,7 +763,7 @@ mptsas_sas_expander_pg0(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info, CONFIGPARMS cfg; SasExpanderPage0_t *buffer; dma_addr_t dma_handle; - int i, error; + int error; hdr.PageVersion = MPI_SASEXPANDER0_PAGEVERSION; hdr.ExtPageLength = 0; @@ -1289,7 +780,6 @@ mptsas_sas_expander_pg0(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info, cfg.dir = 0; /* read */ cfg.timeout = 10; - memset(port_info, 0, sizeof(struct mptsas_portinfo)); error = mpt_config(ioc, &cfg); if (error) goto out; @@ -1317,15 +807,12 @@ mptsas_sas_expander_pg0(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info, port_info->num_phys = buffer->NumPhys; port_info->handle = le16_to_cpu(buffer->DevHandle); port_info->phy_info = kcalloc(port_info->num_phys, - sizeof(*port_info->phy_info),GFP_KERNEL); + sizeof(struct mptsas_phyinfo),GFP_KERNEL); if (!port_info->phy_info) { error = -ENOMEM; goto out_free_consistent; } - for (i = 0; i < port_info->num_phys; i++) - port_info->phy_info[i].portinfo = port_info; - out_free_consistent: pci_free_consistent(ioc->pcidev, hdr.ExtPageLength * 4, buffer, dma_handle); @@ -1341,11 +828,7 @@ mptsas_sas_expander_pg1(MPT_ADAPTER *ioc, struct mptsas_phyinfo *phy_info, CONFIGPARMS cfg; SasExpanderPage1_t *buffer; dma_addr_t dma_handle; - int error=0; - - if (ioc->sas_discovery_runtime && - mptsas_is_end_device(&phy_info->attached)) - goto out; + int error; hdr.PageVersion = MPI_SASEXPANDER0_PAGEVERSION; hdr.ExtPageLength = 0; @@ -1397,6 +880,7 @@ mptsas_sas_expander_pg1(MPT_ADAPTER *ioc, struct mptsas_phyinfo *phy_info, phy_info->identify.handle = le16_to_cpu(buffer->OwnerDevHandle); phy_info->attached.handle = le16_to_cpu(buffer->AttachedDevHandle); + out_free_consistent: pci_free_consistent(ioc->pcidev, hdr.ExtPageLength * 4, buffer, dma_handle); @@ -1404,6 +888,26 @@ mptsas_sas_expander_pg1(MPT_ADAPTER *ioc, struct mptsas_phyinfo *phy_info, return error; } +/* + * Returns true if there is a scsi end device + */ +static inline int +mptsas_is_end_device(struct mptsas_devinfo * attached) +{ + if ((attached->handle) && + (attached->device_info & + MPI_SAS_DEVICE_INFO_END_DEVICE) && + ((attached->device_info & + MPI_SAS_DEVICE_INFO_SSP_TARGET) | + (attached->device_info & + MPI_SAS_DEVICE_INFO_STP_TARGET) | + (attached->device_info & + MPI_SAS_DEVICE_INFO_SATA_DEVICE))) + return 1; + else + return 0; +} + static void mptsas_parse_device_info(struct sas_identify *identify, struct mptsas_devinfo *device_info) @@ -1466,25 +970,14 @@ mptsas_parse_device_info(struct sas_identify *identify, static int mptsas_probe_one_phy(struct device *dev, struct mptsas_phyinfo *phy_info, int index, int local) { - MPT_ADAPTER *ioc; struct sas_phy *phy; - struct sas_port *port; - int error = 0; - - if (!dev) { - error = -ENODEV; - goto out; - } + int error; - if (!phy_info->phy) { - phy = sas_phy_alloc(dev, index); - if (!phy) { - error = -ENOMEM; - goto out; - } - } else - phy = phy_info->phy; + phy = sas_phy_alloc(dev, index); + if (!phy) + return -ENOMEM; + phy->port_identifier = phy_info->port_id; mptsas_parse_device_info(&phy->identify, &phy_info->identify); /* @@ -1565,158 +1058,57 @@ static int mptsas_probe_one_phy(struct device *dev, phy->minimum_linkrate = SAS_LINK_RATE_3_0_GBPS; break; default: - break; - } - - if (!phy_info->phy) { - - if (local) - phy->local_attached = 1; - - error = sas_phy_add(phy); - if (error) { - sas_phy_free(phy); - goto out; - } - phy_info->phy = phy; + break; } - if (!phy_info->attached.handle || - !phy_info->port_details) - goto out; - - port = mptsas_get_port(phy_info); - ioc = phy_to_ioc(phy_info->phy); - - if (phy_info->sas_port_add_phy) { + if (local) + phy->local_attached = 1; - if (!port) { - port = sas_port_alloc_num(dev); - if (!port) { - error = -ENOMEM; - goto out; - } - error = sas_port_add(port); - if (error) { - dfailprintk((MYIOC_s_ERR_FMT - "%s: exit at line=%d\n", ioc->name, - __FUNCTION__, __LINE__)); - goto out; - } - mptsas_set_port(phy_info, port); - dsaswideprintk((KERN_DEBUG - "sas_port_alloc: port=%p dev=%p port_id=%d\n", - port, dev, port->port_identifier)); - } - dsaswideprintk((KERN_DEBUG "sas_port_add_phy: phy_id=%d\n", - phy_info->phy_id)); - sas_port_add_phy(port, phy_info->phy); - phy_info->sas_port_add_phy = 0; + error = sas_phy_add(phy); + if (error) { + sas_phy_free(phy); + return error; } + phy_info->phy = phy; - if (!mptsas_get_rphy(phy_info) && port && !port->rphy) { - + if (phy_info->attached.handle) { struct sas_rphy *rphy; - struct device *parent; - struct sas_identify identify; - - parent = dev->parent->parent; - /* - * Let the hotplug_work thread handle processing - * the adding/removing of devices that occur - * after start of day. - */ - if (ioc->sas_discovery_runtime && - mptsas_is_end_device(&phy_info->attached)) - goto out; - - mptsas_parse_device_info(&identify, &phy_info->attached); - if (scsi_is_host_device(parent)) { - struct mptsas_portinfo *port_info; - int i; - - mutex_lock(&ioc->sas_topology_mutex); - port_info = mptsas_find_portinfo_by_handle(ioc, - ioc->handle); - mutex_unlock(&ioc->sas_topology_mutex); - - for (i = 0; i < port_info->num_phys; i++) - if (port_info->phy_info[i].identify.sas_address == - identify.sas_address) - goto out; - - } else if (scsi_is_sas_rphy(parent)) { - struct sas_rphy *parent_rphy = dev_to_rphy(parent); - if (identify.sas_address == - parent_rphy->identify.sas_address) - goto out; - } - switch (identify.device_type) { - case SAS_END_DEVICE: - rphy = sas_end_device_alloc(port); - break; - case SAS_EDGE_EXPANDER_DEVICE: - case SAS_FANOUT_EXPANDER_DEVICE: - rphy = sas_expander_alloc(port, identify.device_type); - break; - default: - rphy = NULL; - break; - } - if (!rphy) { - dfailprintk((MYIOC_s_ERR_FMT - "%s: exit at line=%d\n", ioc->name, - __FUNCTION__, __LINE__)); - goto out; - } + rphy = sas_rphy_alloc(phy); + if (!rphy) + return 0; /* non-fatal: an rphy can be added later */ - rphy->identify = identify; + mptsas_parse_device_info(&rphy->identify, &phy_info->attached); error = sas_rphy_add(rphy); if (error) { - dfailprintk((MYIOC_s_ERR_FMT - "%s: exit at line=%d\n", ioc->name, - __FUNCTION__, __LINE__)); sas_rphy_free(rphy); - goto out; + return error; } - mptsas_set_rphy(phy_info, rphy); + + phy_info->rphy = rphy; } - out: - return error; + return 0; } static int -mptsas_probe_hba_phys(MPT_ADAPTER *ioc) +mptsas_probe_hba_phys(MPT_ADAPTER *ioc, int *index) { - struct mptsas_portinfo *port_info, *hba; + struct mptsas_portinfo *port_info; u32 handle = 0xFFFF; int error = -ENOMEM, i; - hba = kzalloc(sizeof(*port_info), GFP_KERNEL); - if (! hba) + port_info = kzalloc(sizeof(*port_info), GFP_KERNEL); + if (!port_info) goto out; - error = mptsas_sas_io_unit_pg0(ioc, hba); + error = mptsas_sas_io_unit_pg0(ioc, port_info); if (error) goto out_free_port_info; + ioc->num_ports = port_info->num_phys; mutex_lock(&ioc->sas_topology_mutex); - ioc->handle = hba->handle; - port_info = mptsas_find_portinfo_by_handle(ioc, hba->handle); - if (!port_info) { - port_info = hba; - list_add_tail(&port_info->list, &ioc->sas_topology); - } else { - port_info->handle = hba->handle; - for (i = 0; i < hba->num_phys; i++) - port_info->phy_info[i].negotiated_link_rate = - hba->phy_info[i].negotiated_link_rate; - kfree(hba->phy_info); - kfree(hba); - hba = NULL; - } + list_add_tail(&port_info->list, &ioc->sas_topology); mutex_unlock(&ioc->sas_topology_mutex); for (i = 0; i < port_info->num_phys; i++) { @@ -1731,62 +1123,52 @@ mptsas_probe_hba_phys(MPT_ADAPTER *ioc) port_info->phy_info[i].phy_id; handle = port_info->phy_info[i].identify.handle; - if (port_info->phy_info[i].attached.handle) + if (port_info->phy_info[i].attached.handle) { mptsas_sas_device_pg0(ioc, &port_info->phy_info[i].attached, (MPI_SAS_DEVICE_PGAD_FORM_HANDLE << MPI_SAS_DEVICE_PGAD_FORM_SHIFT), port_info->phy_info[i].attached.handle); - } - - mptsas_setup_wide_ports(ioc, port_info); + } - for (i = 0; i < port_info->num_phys; i++, ioc->sas_index++) mptsas_probe_one_phy(&ioc->sh->shost_gendev, - &port_info->phy_info[i], ioc->sas_index, 1); + &port_info->phy_info[i], *index, 1); + (*index)++; + } return 0; out_free_port_info: - kfree(hba); + kfree(port_info); out: return error; } static int -mptsas_probe_expander_phys(MPT_ADAPTER *ioc, u32 *handle) +mptsas_probe_expander_phys(MPT_ADAPTER *ioc, u32 *handle, int *index) { - struct mptsas_portinfo *port_info, *p, *ex; - struct device *parent; - struct sas_rphy *rphy; + struct mptsas_portinfo *port_info, *p; int error = -ENOMEM, i, j; - ex = kzalloc(sizeof(*port_info), GFP_KERNEL); - if (!ex) + port_info = kzalloc(sizeof(*port_info), GFP_KERNEL); + if (!port_info) goto out; - error = mptsas_sas_expander_pg0(ioc, ex, + error = mptsas_sas_expander_pg0(ioc, port_info, (MPI_SAS_EXPAND_PGAD_FORM_GET_NEXT_HANDLE << MPI_SAS_EXPAND_PGAD_FORM_SHIFT), *handle); if (error) goto out_free_port_info; - *handle = ex->handle; + *handle = port_info->handle; mutex_lock(&ioc->sas_topology_mutex); - port_info = mptsas_find_portinfo_by_handle(ioc, *handle); - if (!port_info) { - port_info = ex; - list_add_tail(&port_info->list, &ioc->sas_topology); - } else { - port_info->handle = ex->handle; - kfree(ex->phy_info); - kfree(ex); - ex = NULL; - } + list_add_tail(&port_info->list, &ioc->sas_topology); mutex_unlock(&ioc->sas_topology_mutex); for (i = 0; i < port_info->num_phys; i++) { + struct device *parent; + mptsas_sas_expander_pg1(ioc, &port_info->phy_info[i], (MPI_SAS_EXPAND_PGAD_FORM_HANDLE_PHY_NUM << MPI_SAS_EXPAND_PGAD_FORM_SHIFT), (i << 16) + *handle); @@ -1807,228 +1189,85 @@ mptsas_probe_expander_phys(MPT_ADAPTER *ioc, u32 *handle) (MPI_SAS_DEVICE_PGAD_FORM_HANDLE << MPI_SAS_DEVICE_PGAD_FORM_SHIFT), port_info->phy_info[i].attached.handle); - port_info->phy_info[i].attached.phy_id = - port_info->phy_info[i].phy_id; } - } - parent = &ioc->sh->shost_gendev; - for (i = 0; i < port_info->num_phys; i++) { + /* + * If we find a parent port handle this expander is + * attached to another expander, else it hangs of the + * HBA phys. + */ + parent = &ioc->sh->shost_gendev; mutex_lock(&ioc->sas_topology_mutex); list_for_each_entry(p, &ioc->sas_topology, list) { for (j = 0; j < p->num_phys; j++) { - if (port_info->phy_info[i].identify.handle != + if (port_info->phy_info[i].identify.handle == p->phy_info[j].attached.handle) - continue; - rphy = mptsas_get_rphy(&p->phy_info[j]); - parent = &rphy->dev; + parent = &p->phy_info[j].rphy->dev; } } mutex_unlock(&ioc->sas_topology_mutex); - } - mptsas_setup_wide_ports(ioc, port_info); - - for (i = 0; i < port_info->num_phys; i++, ioc->sas_index++) mptsas_probe_one_phy(parent, &port_info->phy_info[i], - ioc->sas_index, 0); + *index, 0); + (*index)++; + } return 0; out_free_port_info: - if (ex) { - kfree(ex->phy_info); - kfree(ex); - } + kfree(port_info); out: return error; } -/* - * mptsas_delete_expander_phys - * - * - * This will traverse topology, and remove expanders - * that are no longer present - */ -static void -mptsas_delete_expander_phys(MPT_ADAPTER *ioc) -{ - struct mptsas_portinfo buffer; - struct mptsas_portinfo *port_info, *n, *parent; - struct mptsas_phyinfo *phy_info; - struct scsi_target * starget; - VirtTarget * vtarget; - struct sas_port * port; - int i; - u64 expander_sas_address; - - mutex_lock(&ioc->sas_topology_mutex); - list_for_each_entry_safe(port_info, n, &ioc->sas_topology, list) { - - if (port_info->phy_info && - (!(port_info->phy_info[0].identify.device_info & - MPI_SAS_DEVICE_INFO_SMP_TARGET))) - continue; - - if (mptsas_sas_expander_pg0(ioc, &buffer, - (MPI_SAS_EXPAND_PGAD_FORM_HANDLE << - MPI_SAS_EXPAND_PGAD_FORM_SHIFT), port_info->handle)) { - - /* - * Issue target reset to all child end devices - * then mark them deleted to prevent further - * IO going to them. - */ - phy_info = port_info->phy_info; - for (i = 0; i < port_info->num_phys; i++, phy_info++) { - starget = mptsas_get_starget(phy_info); - if (!starget) - continue; - vtarget = starget->hostdata; - if(vtarget->deleted) - continue; - vtarget->deleted = 1; - mptsas_target_reset(ioc, vtarget); - sas_port_delete(mptsas_get_port(phy_info)); - mptsas_port_delete(phy_info->port_details); - } - - /* - * Obtain the port_info instance to the parent port - */ - parent = mptsas_find_portinfo_by_handle(ioc, - port_info->phy_info[0].identify.handle_parent); - - if (!parent) - goto next_port; - - expander_sas_address = - port_info->phy_info[0].identify.sas_address; - - /* - * Delete rphys in the parent that point - * to this expander. The transport layer will - * cleanup all the children. - */ - phy_info = parent->phy_info; - for (i = 0; i < parent->num_phys; i++, phy_info++) { - port = mptsas_get_port(phy_info); - if (!port) - continue; - if (phy_info->attached.sas_address != - expander_sas_address) - continue; -#ifdef MPT_DEBUG_SAS_WIDE - dev_printk(KERN_DEBUG, &port->dev, - "delete port (%d)\n", port->port_identifier); -#endif - sas_port_delete(port); - mptsas_port_delete(phy_info->port_details); - } - next_port: - - phy_info = port_info->phy_info; - for (i = 0; i < port_info->num_phys; i++, phy_info++) - mptsas_port_delete(phy_info->port_details); - - list_del(&port_info->list); - kfree(port_info->phy_info); - kfree(port_info); - } - /* - * Free this memory allocated from inside - * mptsas_sas_expander_pg0 - */ - kfree(buffer.phy_info); - } - mutex_unlock(&ioc->sas_topology_mutex); -} - -/* - * Start of day discovery - */ static void mptsas_scan_sas_topology(MPT_ADAPTER *ioc) { u32 handle = 0xFFFF; - int i; - - mutex_lock(&ioc->sas_discovery_mutex); - mptsas_probe_hba_phys(ioc); - while (!mptsas_probe_expander_phys(ioc, &handle)) - ; - /* - Reporting RAID volumes. - */ - if (!ioc->raid_data.pIocPg2) - goto out; - if (!ioc->raid_data.pIocPg2->NumActiveVolumes) - goto out; - for (i=0; iraid_data.pIocPg2->NumActiveVolumes; i++) { - scsi_add_device(ioc->sh, MPTSAS_RAID_CHANNEL, - ioc->raid_data.pIocPg2->RaidVolume[i].VolumeID, 0); - } - out: - mutex_unlock(&ioc->sas_discovery_mutex); -} - -/* - * Work queue thread to handle Runtime discovery - * Mere purpose is the hot add/delete of expanders - *(Mutex UNLOCKED) - */ -static void -__mptsas_discovery_work(MPT_ADAPTER *ioc) -{ - u32 handle = 0xFFFF; + int index = 0; - ioc->sas_discovery_runtime=1; - mptsas_delete_expander_phys(ioc); - mptsas_probe_hba_phys(ioc); - while (!mptsas_probe_expander_phys(ioc, &handle)) + mptsas_probe_hba_phys(ioc, &index); + while (!mptsas_probe_expander_phys(ioc, &handle, &index)) ; - ioc->sas_discovery_runtime=0; -} - -/* - * Work queue thread to handle Runtime discovery - * Mere purpose is the hot add/delete of expanders - *(Mutex LOCKED) - */ -static void -mptsas_discovery_work(void * arg) -{ - struct mptsas_discovery_event *ev = arg; - MPT_ADAPTER *ioc = ev->ioc; - - mutex_lock(&ioc->sas_discovery_mutex); - __mptsas_discovery_work(ioc); - mutex_unlock(&ioc->sas_discovery_mutex); - kfree(ev); } static struct mptsas_phyinfo * -mptsas_find_phyinfo_by_sas_address(MPT_ADAPTER *ioc, u64 sas_address) +mptsas_find_phyinfo_by_parent(MPT_ADAPTER *ioc, u16 parent_handle, u8 phy_id) { struct mptsas_portinfo *port_info; + struct mptsas_devinfo device_info; struct mptsas_phyinfo *phy_info = NULL; - int i; + int i, error; + + /* + * Retrieve the parent sas_address + */ + error = mptsas_sas_device_pg0(ioc, &device_info, + (MPI_SAS_DEVICE_PGAD_FORM_HANDLE << + MPI_SAS_DEVICE_PGAD_FORM_SHIFT), + parent_handle); + if (error) { + printk("mptsas: failed to retrieve device page\n"); + return NULL; + } + /* + * The phy_info structures are never deallocated during lifetime of + * a host, so the code below is safe without additional refcounting. + */ mutex_lock(&ioc->sas_topology_mutex); list_for_each_entry(port_info, &ioc->sas_topology, list) { for (i = 0; i < port_info->num_phys; i++) { - if (port_info->phy_info[i].attached.sas_address - != sas_address) - continue; - if (!mptsas_is_end_device( - &port_info->phy_info[i].attached)) - continue; - phy_info = &port_info->phy_info[i]; - break; + if (port_info->phy_info[i].identify.sas_address == + device_info.sas_address && + port_info->phy_info[i].phy_id == phy_id) { + phy_info = &port_info->phy_info[i]; + break; + } } } mutex_unlock(&ioc->sas_topology_mutex); + return phy_info; } @@ -2039,50 +1278,24 @@ mptsas_find_phyinfo_by_target(MPT_ADAPTER *ioc, u32 id) struct mptsas_phyinfo *phy_info = NULL; int i; + /* + * The phy_info structures are never deallocated during lifetime of + * a host, so the code below is safe without additional refcounting. + */ mutex_lock(&ioc->sas_topology_mutex); list_for_each_entry(port_info, &ioc->sas_topology, list) { - for (i = 0; i < port_info->num_phys; i++) { - if (port_info->phy_info[i].attached.id != id) - continue; - if (!mptsas_is_end_device( - &port_info->phy_info[i].attached)) - continue; - phy_info = &port_info->phy_info[i]; - break; - } + for (i = 0; i < port_info->num_phys; i++) + if (mptsas_is_end_device(&port_info->phy_info[i].attached)) + if (port_info->phy_info[i].attached.id == id) { + phy_info = &port_info->phy_info[i]; + break; + } } mutex_unlock(&ioc->sas_topology_mutex); - return phy_info; -} - -/* - * Work queue thread to clear the persitency table - */ -static void -mptsas_persist_clear_table(void * arg) -{ - MPT_ADAPTER *ioc = (MPT_ADAPTER *)arg; - - mptbase_sas_persist_operation(ioc, MPI_SAS_OP_CLEAR_NOT_PRESENT); -} - -static void -mptsas_reprobe_lun(struct scsi_device *sdev, void *data) -{ - sdev->no_uld_attach = data ? 1 : 0; - scsi_device_reprobe(sdev); -} -static void -mptsas_reprobe_target(struct scsi_target *starget, int uld_attach) -{ - starget_for_each_device(starget, uld_attach ? (void *)1 : NULL, - mptsas_reprobe_lun); + return phy_info; } -/* - * Work queue thread to handle SAS hotplug events - */ static void mptsas_hotplug_work(void *arg) { @@ -2090,71 +1303,19 @@ mptsas_hotplug_work(void *arg) MPT_ADAPTER *ioc = ev->ioc; struct mptsas_phyinfo *phy_info; struct sas_rphy *rphy; - struct sas_port *port; struct scsi_device *sdev; - struct scsi_target * starget; - struct sas_identify identify; char *ds = NULL; struct mptsas_devinfo sas_device; - VirtTarget *vtarget; - VirtDevice *vdevice; - - mutex_lock(&ioc->sas_discovery_mutex); switch (ev->event_type) { case MPTSAS_DEL_DEVICE: phy_info = mptsas_find_phyinfo_by_target(ioc, ev->id); - - /* - * Sanity checks, for non-existing phys and remote rphys. - */ - if (!phy_info || !phy_info->port_details) { - dfailprintk((MYIOC_s_ERR_FMT - "%s: exit at line=%d\n", ioc->name, - __FUNCTION__, __LINE__)); - break; - } - rphy = mptsas_get_rphy(phy_info); - if (!rphy) { - dfailprintk((MYIOC_s_ERR_FMT - "%s: exit at line=%d\n", ioc->name, - __FUNCTION__, __LINE__)); - break; - } - port = mptsas_get_port(phy_info); - if (!port) { - dfailprintk((MYIOC_s_ERR_FMT - "%s: exit at line=%d\n", ioc->name, - __FUNCTION__, __LINE__)); + if (!phy_info) { + printk("mptsas: remove event for non-existant PHY.\n"); break; } - starget = mptsas_get_starget(phy_info); - if (starget) { - vtarget = starget->hostdata; - - if (!vtarget) { - dfailprintk((MYIOC_s_ERR_FMT - "%s: exit at line=%d\n", ioc->name, - __FUNCTION__, __LINE__)); - break; - } - - /* - * Handling RAID components - */ - if (ev->phys_disk_num_valid) { - vtarget->target_id = ev->phys_disk_num; - vtarget->tflags |= MPT_TARGET_FLAGS_RAID_COMPONENT; - mptsas_reprobe_target(starget, 1); - break; - } - - vtarget->deleted = 1; - mptsas_target_reset(ioc, vtarget); - } - if (phy_info->attached.device_info & MPI_SAS_DEVICE_INFO_SSP_TARGET) ds = "ssp"; if (phy_info->attached.device_info & MPI_SAS_DEVICE_INFO_STP_TARGET) @@ -2166,80 +1327,55 @@ mptsas_hotplug_work(void *arg) "removing %s device, channel %d, id %d, phy %d\n", ioc->name, ds, ev->channel, ev->id, phy_info->phy_id); -#ifdef MPT_DEBUG_SAS_WIDE - dev_printk(KERN_DEBUG, &port->dev, - "delete port (%d)\n", port->port_identifier); -#endif - sas_port_delete(port); - mptsas_port_delete(phy_info->port_details); + if (phy_info->rphy) { + sas_rphy_delete(phy_info->rphy); + phy_info->rphy = NULL; + } break; case MPTSAS_ADD_DEVICE: - if (ev->phys_disk_num_valid) - mpt_findImVolumes(ioc); - /* - * Refresh sas device pg0 data + * When there is no sas address, + * RAID volumes are being deleted, + * and hidden phy disk are being added. + * We don't know the SAS data yet, + * so lookup sas device page to get + * pertaining info */ - if (mptsas_sas_device_pg0(ioc, &sas_device, - (MPI_SAS_DEVICE_PGAD_FORM_BUS_TARGET_ID << - MPI_SAS_DEVICE_PGAD_FORM_SHIFT), ev->id)) { - dfailprintk((MYIOC_s_ERR_FMT - "%s: exit at line=%d\n", ioc->name, - __FUNCTION__, __LINE__)); - break; - } - - ssleep(2); - __mptsas_discovery_work(ioc); - - phy_info = mptsas_find_phyinfo_by_sas_address(ioc, - sas_device.sas_address); - - if (!phy_info || !phy_info->port_details) { - dfailprintk((MYIOC_s_ERR_FMT - "%s: exit at line=%d\n", ioc->name, - __FUNCTION__, __LINE__)); - break; - } - - starget = mptsas_get_starget(phy_info); - if (starget) { - vtarget = starget->hostdata; - - if (!vtarget) { - dfailprintk((MYIOC_s_ERR_FMT - "%s: exit at line=%d\n", ioc->name, - __FUNCTION__, __LINE__)); + if (!ev->sas_address) { + if (mptsas_sas_device_pg0(ioc, + &sas_device, ev->id, + (MPI_SAS_DEVICE_PGAD_FORM_BUS_TARGET_ID << + MPI_SAS_DEVICE_PGAD_FORM_SHIFT))) break; - } - /* - * Handling RAID components - */ - if (vtarget->tflags & MPT_TARGET_FLAGS_RAID_COMPONENT) { - vtarget->tflags &= ~MPT_TARGET_FLAGS_RAID_COMPONENT; - vtarget->target_id = ev->id; - mptsas_reprobe_target(starget, 0); - } - break; + ev->handle = sas_device.handle; + ev->parent_handle = sas_device.handle_parent; + ev->channel = sas_device.channel; + ev->phy_id = sas_device.phy_id; + ev->sas_address = sas_device.sas_address; + ev->device_info = sas_device.device_info; } - if (mptsas_get_rphy(phy_info)) { - dfailprintk((MYIOC_s_ERR_FMT - "%s: exit at line=%d\n", ioc->name, - __FUNCTION__, __LINE__)); + phy_info = mptsas_find_phyinfo_by_parent(ioc, + ev->parent_handle, ev->phy_id); + if (!phy_info) { + printk("mptsas: add event for non-existant PHY.\n"); break; } - port = mptsas_get_port(phy_info); - if (!port) { - dfailprintk((MYIOC_s_ERR_FMT - "%s: exit at line=%d\n", ioc->name, - __FUNCTION__, __LINE__)); + + if (phy_info->rphy) { + printk("mptsas: trying to add existing device.\n"); break; } - memcpy(&phy_info->attached, &sas_device, - sizeof(struct mptsas_devinfo)); + /* fill attached info */ + phy_info->attached.handle = ev->handle; + phy_info->attached.phy_id = ev->phy_id; + phy_info->attached.port_id = phy_info->identify.port_id; + phy_info->attached.id = ev->id; + phy_info->attached.channel = ev->channel; + phy_info->attached.sas_address = ev->sas_address; + phy_info->attached.device_info = ev->device_info; if (phy_info->attached.device_info & MPI_SAS_DEVICE_INFO_SSP_TARGET) ds = "ssp"; @@ -2252,65 +1388,61 @@ mptsas_hotplug_work(void *arg) "attaching %s device, channel %d, id %d, phy %d\n", ioc->name, ds, ev->channel, ev->id, ev->phy_id); - mptsas_parse_device_info(&identify, &phy_info->attached); - rphy = sas_end_device_alloc(port); - if (!rphy) { - dfailprintk((MYIOC_s_ERR_FMT - "%s: exit at line=%d\n", ioc->name, - __FUNCTION__, __LINE__)); + + rphy = sas_rphy_alloc(phy_info->phy); + if (!rphy) break; /* non-fatal: an rphy can be added later */ - } - rphy->identify = identify; + rphy->scsi_target_id = phy_info->attached.id; + mptsas_parse_device_info(&rphy->identify, &phy_info->attached); if (sas_rphy_add(rphy)) { - dfailprintk((MYIOC_s_ERR_FMT - "%s: exit at line=%d\n", ioc->name, - __FUNCTION__, __LINE__)); sas_rphy_free(rphy); break; } - mptsas_set_rphy(phy_info, rphy); + + phy_info->rphy = rphy; break; case MPTSAS_ADD_RAID: - sdev = scsi_device_lookup(ioc->sh, MPTSAS_RAID_CHANNEL, - ev->id, 0); + sdev = scsi_device_lookup( + ioc->sh, + ioc->num_ports, + ev->id, + 0); if (sdev) { scsi_device_put(sdev); break; } printk(MYIOC_s_INFO_FMT - "attaching raid volume, channel %d, id %d\n", - ioc->name, MPTSAS_RAID_CHANNEL, ev->id); - scsi_add_device(ioc->sh, MPTSAS_RAID_CHANNEL, ev->id, 0); + "attaching device, channel %d, id %d\n", + ioc->name, ioc->num_ports, ev->id); + scsi_add_device(ioc->sh, + ioc->num_ports, + ev->id, + 0); mpt_findImVolumes(ioc); break; case MPTSAS_DEL_RAID: - sdev = scsi_device_lookup(ioc->sh, MPTSAS_RAID_CHANNEL, - ev->id, 0); + sdev = scsi_device_lookup( + ioc->sh, + ioc->num_ports, + ev->id, + 0); if (!sdev) break; printk(MYIOC_s_INFO_FMT - "removing raid volume, channel %d, id %d\n", - ioc->name, MPTSAS_RAID_CHANNEL, ev->id); - vdevice = sdev->hostdata; - vdevice->vtarget->deleted = 1; - mptsas_target_reset(ioc, vdevice->vtarget); + "removing device, channel %d, id %d\n", + ioc->name, ioc->num_ports, ev->id); scsi_remove_device(sdev); scsi_device_put(sdev); mpt_findImVolumes(ioc); break; - case MPTSAS_IGNORE_EVENT: - default: - break; } - mutex_unlock(&ioc->sas_discovery_mutex); kfree(ev); - } static void -mptsas_send_sas_event(MPT_ADAPTER *ioc, +mptscsih_send_sas_event(MPT_ADAPTER *ioc, EVENT_DATA_SAS_DEVICE_STATUS_CHANGE *sas_event_data) { struct mptsas_hotplug_event *ev; @@ -2323,103 +1455,65 @@ mptsas_send_sas_event(MPT_ADAPTER *ioc, MPI_SAS_DEVICE_INFO_SATA_DEVICE )) == 0) return; - switch (sas_event_data->ReasonCode) { - case MPI_EVENT_SAS_DEV_STAT_RC_ADDED: - case MPI_EVENT_SAS_DEV_STAT_RC_NOT_RESPONDING: - ev = kzalloc(sizeof(*ev), GFP_ATOMIC); - if (!ev) { - printk(KERN_WARNING "mptsas: lost hotplug event\n"); - break; - } + if ((sas_event_data->ReasonCode & + (MPI_EVENT_SAS_DEV_STAT_RC_ADDED | + MPI_EVENT_SAS_DEV_STAT_RC_NOT_RESPONDING)) == 0) + return; - INIT_WORK(&ev->work, mptsas_hotplug_work, ev); - ev->ioc = ioc; - ev->handle = le16_to_cpu(sas_event_data->DevHandle); - ev->parent_handle = - le16_to_cpu(sas_event_data->ParentDevHandle); - ev->channel = sas_event_data->Bus; - ev->id = sas_event_data->TargetID; - ev->phy_id = sas_event_data->PhyNum; - memcpy(&sas_address, &sas_event_data->SASAddress, - sizeof(__le64)); - ev->sas_address = le64_to_cpu(sas_address); - ev->device_info = device_info; - - if (sas_event_data->ReasonCode & - MPI_EVENT_SAS_DEV_STAT_RC_ADDED) - ev->event_type = MPTSAS_ADD_DEVICE; - else - ev->event_type = MPTSAS_DEL_DEVICE; - schedule_work(&ev->work); - break; - case MPI_EVENT_SAS_DEV_STAT_RC_NO_PERSIST_ADDED: - /* - * Persistent table is full. - */ - INIT_WORK(&ioc->sas_persist_task, - mptsas_persist_clear_table, (void *)ioc); - schedule_work(&ioc->sas_persist_task); - break; - case MPI_EVENT_SAS_DEV_STAT_RC_SMART_DATA: - /* TODO */ - case MPI_EVENT_SAS_DEV_STAT_RC_INTERNAL_DEVICE_RESET: - /* TODO */ - default: - break; + ev = kmalloc(sizeof(*ev), GFP_ATOMIC); + if (!ev) { + printk(KERN_WARNING "mptsas: lost hotplug event\n"); + return; } + + + INIT_WORK(&ev->work, mptsas_hotplug_work, ev); + ev->ioc = ioc; + ev->handle = le16_to_cpu(sas_event_data->DevHandle); + ev->parent_handle = le16_to_cpu(sas_event_data->ParentDevHandle); + ev->channel = sas_event_data->Bus; + ev->id = sas_event_data->TargetID; + ev->phy_id = sas_event_data->PhyNum; + memcpy(&sas_address, &sas_event_data->SASAddress, sizeof(__le64)); + ev->sas_address = le64_to_cpu(sas_address); + ev->device_info = device_info; + + if (sas_event_data->ReasonCode & MPI_EVENT_SAS_DEV_STAT_RC_ADDED) + ev->event_type = MPTSAS_ADD_DEVICE; + else + ev->event_type = MPTSAS_DEL_DEVICE; + + schedule_work(&ev->work); } static void -mptsas_send_raid_event(MPT_ADAPTER *ioc, +mptscsih_send_raid_event(MPT_ADAPTER *ioc, EVENT_DATA_RAID *raid_event_data) { struct mptsas_hotplug_event *ev; - int status = le32_to_cpu(raid_event_data->SettingsStatus); - int state = (status >> 8) & 0xff; + RAID_VOL0_STATUS * volumeStatus; if (ioc->bus_type != SAS) return; - ev = kzalloc(sizeof(*ev), GFP_ATOMIC); + ev = kmalloc(sizeof(*ev), GFP_ATOMIC); if (!ev) { printk(KERN_WARNING "mptsas: lost hotplug event\n"); return; } + memset(ev,0,sizeof(struct mptsas_hotplug_event)); INIT_WORK(&ev->work, mptsas_hotplug_work, ev); ev->ioc = ioc; ev->id = raid_event_data->VolumeID; - ev->event_type = MPTSAS_IGNORE_EVENT; switch (raid_event_data->ReasonCode) { case MPI_EVENT_RAID_RC_PHYSDISK_DELETED: ev->event_type = MPTSAS_ADD_DEVICE; break; case MPI_EVENT_RAID_RC_PHYSDISK_CREATED: - ioc->raid_data.isRaid = 1; - ev->phys_disk_num_valid = 1; - ev->phys_disk_num = raid_event_data->PhysDiskNum; ev->event_type = MPTSAS_DEL_DEVICE; break; - case MPI_EVENT_RAID_RC_PHYSDISK_STATUS_CHANGED: - switch (state) { - case MPI_PD_STATE_ONLINE: - ioc->raid_data.isRaid = 1; - ev->phys_disk_num_valid = 1; - ev->phys_disk_num = raid_event_data->PhysDiskNum; - ev->event_type = MPTSAS_ADD_DEVICE; - break; - case MPI_PD_STATE_MISSING: - case MPI_PD_STATE_NOT_COMPATIBLE: - case MPI_PD_STATE_OFFLINE_AT_HOST_REQUEST: - case MPI_PD_STATE_FAILED_AT_HOST_REQUEST: - case MPI_PD_STATE_OFFLINE_FOR_ANOTHER_REASON: - ev->event_type = MPTSAS_DEL_DEVICE; - break; - default: - break; - } - break; case MPI_EVENT_RAID_RC_VOLUME_DELETED: ev->event_type = MPTSAS_DEL_RAID; break; @@ -2427,18 +1521,11 @@ mptsas_send_raid_event(MPT_ADAPTER *ioc, ev->event_type = MPTSAS_ADD_RAID; break; case MPI_EVENT_RAID_RC_VOLUME_STATUS_CHANGED: - switch (state) { - case MPI_RAIDVOL0_STATUS_STATE_FAILED: - case MPI_RAIDVOL0_STATUS_STATE_MISSING: - ev->event_type = MPTSAS_DEL_RAID; - break; - case MPI_RAIDVOL0_STATUS_STATE_OPTIMAL: - case MPI_RAIDVOL0_STATUS_STATE_DEGRADED: - ev->event_type = MPTSAS_ADD_RAID; - break; - default: - break; - } + volumeStatus = (RAID_VOL0_STATUS *) & + raid_event_data->SettingsStatus; + ev->event_type = (volumeStatus->State == + MPI_RAIDVOL0_STATUS_STATE_FAILED) ? + MPTSAS_DEL_RAID : MPTSAS_ADD_RAID; break; default: break; @@ -2446,30 +1533,15 @@ mptsas_send_raid_event(MPT_ADAPTER *ioc, schedule_work(&ev->work); } +/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ +/* work queue thread to clear the persitency table */ static void -mptsas_send_discovery_event(MPT_ADAPTER *ioc, - EVENT_DATA_SAS_DISCOVERY *discovery_data) +mptscsih_sas_persist_clear_table(void * arg) { - struct mptsas_discovery_event *ev; - - /* - * DiscoveryStatus - * - * This flag will be non-zero when firmware - * kicks off discovery, and return to zero - * once its completed. - */ - if (discovery_data->DiscoveryStatus) - return; - - ev = kzalloc(sizeof(*ev), GFP_ATOMIC); - if (!ev) - return; - INIT_WORK(&ev->work, mptsas_discovery_work, ev); - ev->ioc = ioc; - schedule_work(&ev->work); -}; + MPT_ADAPTER *ioc = (MPT_ADAPTER *)arg; + mptbase_sas_persist_operation(ioc, MPI_SAS_OP_CLEAR_NOT_PRESENT); +} static int mptsas_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *reply) @@ -2480,35 +1552,20 @@ mptsas_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *reply) if (!ioc->sh) goto out; - /* - * sas_discovery_ignore_events - * - * This flag is to prevent anymore processing of - * sas events once mptsas_remove function is called. - */ - if (ioc->sas_discovery_ignore_events) { - rc = mptscsih_event_process(ioc, reply); - goto out; - } - switch (event) { case MPI_EVENT_SAS_DEVICE_STATUS_CHANGE: - mptsas_send_sas_event(ioc, + mptscsih_send_sas_event(ioc, (EVENT_DATA_SAS_DEVICE_STATUS_CHANGE *)reply->Data); break; case MPI_EVENT_INTEGRATED_RAID: - mptsas_send_raid_event(ioc, + mptscsih_send_raid_event(ioc, (EVENT_DATA_RAID *)reply->Data); break; case MPI_EVENT_PERSISTENT_TABLE_FULL: - INIT_WORK(&ioc->sas_persist_task, - mptsas_persist_clear_table, + INIT_WORK(&ioc->mptscsih_persistTask, + mptscsih_sas_persist_clear_table, (void *)ioc); - schedule_work(&ioc->sas_persist_task); - break; - case MPI_EVENT_SAS_DISCOVERY: - mptsas_send_discovery_event(ioc, - (EVENT_DATA_SAS_DISCOVERY *)reply->Data); + schedule_work(&ioc->mptscsih_persistTask); break; default: rc = mptscsih_event_process(ioc, reply); @@ -2611,7 +1668,7 @@ mptsas_probe(struct pci_dev *pdev, const struct pci_device_id *id) INIT_LIST_HEAD(&ioc->sas_topology); mutex_init(&ioc->sas_topology_mutex); - mutex_init(&ioc->sas_discovery_mutex); + mutex_init(&ioc->sas_mgmt.mutex); init_completion(&ioc->sas_mgmt.done); @@ -2697,6 +1754,7 @@ mptsas_probe(struct pci_dev *pdev, const struct pci_device_id *id) hd->timer.data = (unsigned long) hd; hd->timer.function = mptscsih_timer_expired; + hd->mpt_pq_filter = mpt_pq_filter; ioc->sas_data.ptClear = mpt_pt_clear; if (ioc->sas_data.ptClear==1) { @@ -2704,6 +1762,12 @@ mptsas_probe(struct pci_dev *pdev, const struct pci_device_id *id) ioc, MPI_SAS_OP_CLEAR_ALL_PERSISTENT); } + ddvprintk((MYIOC_s_INFO_FMT + "mpt_pq_filter %x mpt_pq_filter %x\n", + ioc->name, + mpt_pq_filter, + mpt_pq_filter)); + init_waitqueue_head(&hd->scandv_waitq); hd->scandv_wait_done = 0; hd->last_queue_full = 0; @@ -2717,9 +1781,23 @@ mptsas_probe(struct pci_dev *pdev, const struct pci_device_id *id) mptsas_scan_sas_topology(ioc); + /* + Reporting RAID volumes. + */ + if (!ioc->raid_data.pIocPg2) + return 0; + if (!ioc->raid_data.pIocPg2->NumActiveVolumes) + return 0; + for (ii=0;iiraid_data.pIocPg2->NumActiveVolumes;ii++) { + scsi_add_device(sh, + ioc->num_ports, + ioc->raid_data.pIocPg2->RaidVolume[ii].VolumeID, + 0); + } + return 0; - out_mptsas_probe: +out_mptsas_probe: mptscsih_remove(pdev); return error; @@ -2729,17 +1807,12 @@ static void __devexit mptsas_remove(struct pci_dev *pdev) { MPT_ADAPTER *ioc = pci_get_drvdata(pdev); struct mptsas_portinfo *p, *n; - int i; - ioc->sas_discovery_ignore_events=1; sas_remove_host(ioc->sh); mutex_lock(&ioc->sas_topology_mutex); list_for_each_entry_safe(p, n, &ioc->sas_topology, list) { list_del(&p->list); - for (i = 0 ; i < p->num_phys ; i++) - mptsas_port_delete(p->phy_info[i].port_details); - kfree(p->phy_info); kfree(p); } mutex_unlock(&ioc->sas_topology_mutex); @@ -2748,15 +1821,17 @@ static void __devexit mptsas_remove(struct pci_dev *pdev) } static struct pci_device_id mptsas_pci_table[] = { - { PCI_VENDOR_ID_LSI_LOGIC, MPI_MANUFACTPAGE_DEVID_SAS1064, + { PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_SAS1064, + PCI_ANY_ID, PCI_ANY_ID }, + { PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_SAS1066, PCI_ANY_ID, PCI_ANY_ID }, - { PCI_VENDOR_ID_LSI_LOGIC, MPI_MANUFACTPAGE_DEVID_SAS1068, + { PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_SAS1068, PCI_ANY_ID, PCI_ANY_ID }, - { PCI_VENDOR_ID_LSI_LOGIC, MPI_MANUFACTPAGE_DEVID_SAS1064E, + { PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_SAS1064E, PCI_ANY_ID, PCI_ANY_ID }, - { PCI_VENDOR_ID_LSI_LOGIC, MPI_MANUFACTPAGE_DEVID_SAS1068E, + { PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_SAS1066E, PCI_ANY_ID, PCI_ANY_ID }, - { PCI_VENDOR_ID_LSI_LOGIC, MPI_MANUFACTPAGE_DEVID_SAS1078, + { PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_SAS1068E, PCI_ANY_ID, PCI_ANY_ID }, {0} /* Terminating entry */ }; @@ -2792,7 +1867,7 @@ mptsas_init(void) mptsasMgmtCtx = mpt_register(mptsas_mgmt_done, MPTSAS_DRIVER); if (mpt_event_register(mptsasDoneCtx, mptsas_event_process) == 0) { - devtverboseprintk((KERN_INFO MYNAM + devtprintk((KERN_INFO MYNAM ": Registered for IOC event notifications\n")); } diff --git a/drivers/message/fusion/mptscsih.c b/drivers/message/fusion/mptscsih.c index 30524dc54..4fee6befc 100644 --- a/drivers/message/fusion/mptscsih.c +++ b/drivers/message/fusion/mptscsih.c @@ -66,7 +66,6 @@ #include "mptbase.h" #include "mptscsih.h" -#include "lsi/mpi_log_sas.h" /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ #define my_NAME "Fusion MPT SCSI Host driver" @@ -115,6 +114,21 @@ typedef struct _internal_cmd { u8 rsvd; } INTERNAL_CMD; +typedef struct _negoparms { + u8 width; + u8 offset; + u8 factor; + u8 flags; +} NEGOPARMS; + +typedef struct _dv_parameters { + NEGOPARMS max; + NEGOPARMS now; + u8 cmd; + u8 id; + u16 pad1; +} DVPARAMETERS; + /* * Other private/forward protos... */ @@ -128,19 +142,35 @@ static void mptscsih_freeChainBuffers(MPT_ADAPTER *ioc, int req_idx); static void mptscsih_copy_sense_data(struct scsi_cmnd *sc, MPT_SCSI_HOST *hd, MPT_FRAME_HDR *mf, SCSIIOReply_t *pScsiReply); static int mptscsih_tm_pending_wait(MPT_SCSI_HOST * hd); static int mptscsih_tm_wait_for_completion(MPT_SCSI_HOST * hd, ulong timeout ); -static int SCPNT_TO_LOOKUP_IDX(struct scsi_cmnd *sc); +static u32 SCPNT_TO_LOOKUP_IDX(struct scsi_cmnd *sc); static int mptscsih_IssueTaskMgmt(MPT_SCSI_HOST *hd, u8 type, u8 channel, u8 target, u8 lun, int ctx2abort, ulong timeout); int mptscsih_ioc_reset(MPT_ADAPTER *ioc, int post_reset); int mptscsih_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *pEvReply); -static void mptscsih_initTarget(MPT_SCSI_HOST *hd, VirtTarget *vtarget, struct scsi_device *sdev); -static void mptscsih_setTargetNegoParms(MPT_SCSI_HOST *hd, VirtTarget *vtarget, struct scsi_device *sdev); +static void mptscsih_initTarget(MPT_SCSI_HOST *hd, VirtTarget *vtarget, u8 lun, char *data, int dlen); +static void mptscsih_setTargetNegoParms(MPT_SCSI_HOST *hd, VirtTarget *vtarget, char byte56); +static void mptscsih_setDevicePage1Flags (u8 width, u8 factor, u8 offset, int *requestedPtr, int *configurationPtr, u8 flags); +static void mptscsih_no_negotiate(MPT_SCSI_HOST *hd, struct scsi_cmnd *sc); +static int mptscsih_writeSDP1(MPT_SCSI_HOST *hd, int portnum, int target, int flags); static int mptscsih_writeIOCPage4(MPT_SCSI_HOST *hd, int target_id, int bus); int mptscsih_scandv_complete(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *r); static int mptscsih_do_cmd(MPT_SCSI_HOST *hd, INTERNAL_CMD *iocmd); static void mptscsih_synchronize_cache(MPT_SCSI_HOST *hd, VirtDevice *vdevice); +static void mptscsih_negotiate_to_asyn_narrow(MPT_SCSI_HOST *hd, VirtDevice *vdevice); +static int mptscsih_is_phys_disk(MPT_ADAPTER *ioc, int id); + +#ifdef MPTSCSIH_ENABLE_DOMAIN_VALIDATION +static int mptscsih_do_raid(MPT_SCSI_HOST *hd, u8 action, INTERNAL_CMD *io); +static void mptscsih_domainValidation(void *hd); +static void mptscsih_qas_check(MPT_SCSI_HOST *hd, int id); +static int mptscsih_doDv(MPT_SCSI_HOST *hd, int channel, int target); +static void mptscsih_dv_parms(MPT_SCSI_HOST *hd, DVPARAMETERS *dv,void *pPage); +static void mptscsih_fillbuf(char *buffer, int size, int index, int width); +static void mptscsih_set_dvflags_raid(MPT_SCSI_HOST *hd, int id); +static void mptscsih_set_dvflags(MPT_SCSI_HOST *hd, struct scsi_cmnd *sc); +#endif void mptscsih_remove(struct pci_dev *); void mptscsih_shutdown(struct pci_dev *); @@ -151,6 +181,16 @@ int mptscsih_resume(struct pci_dev *pdev); #define SNS_LEN(scp) sizeof((scp)->sense_buffer) +#ifdef MPTSCSIH_ENABLE_DOMAIN_VALIDATION +/* + * Domain Validation task structure + */ +static DEFINE_SPINLOCK(dvtaskQ_lock); +static int dvtaskQ_active = 0; +static int dvtaskQ_release = 0; +static struct work_struct dvTaskQ_task; +#endif + /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ /** * mptscsih_add_sge - Place a simple SGE at address pAddr. @@ -498,34 +538,6 @@ nextSGEset: return SUCCESS; } /* mptscsih_AddSGE() */ -static void -mptscsih_issue_sep_command(MPT_ADAPTER *ioc, VirtTarget *vtarget, - U32 SlotStatus) -{ - MPT_FRAME_HDR *mf; - SEPRequest_t *SEPMsg; - - if (ioc->bus_type == FC) - return; - - if ((mf = mpt_get_msg_frame(ioc->InternalCtx, ioc)) == NULL) { - dfailprintk((MYIOC_s_WARN_FMT "%s: no msg frames!!\n", - ioc->name,__FUNCTION__)); - return; - } - - SEPMsg = (SEPRequest_t *)mf; - SEPMsg->Function = MPI_FUNCTION_SCSI_ENCLOSURE_PROCESSOR; - SEPMsg->Bus = vtarget->bus_id; - SEPMsg->TargetID = vtarget->target_id; - SEPMsg->Action = MPI_SEP_REQ_ACTION_WRITE_STATUS; - SEPMsg->SlotStatus = SlotStatus; - devtverboseprintk((MYIOC_s_WARN_FMT - "Sending SEP cmd=%x id=%d bus=%d\n", - ioc->name, SlotStatus, SEPMsg->TargetID, SEPMsg->Bus)); - mpt_put_msg_frame(ioc->DoneCtx, ioc, mf); -} - /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ /* * mptscsih_io_done - Main SCSI IO callback routine registered to @@ -549,8 +561,6 @@ mptscsih_io_done(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr) SCSIIORequest_t *pScsiReq; SCSIIOReply_t *pScsiReply; u16 req_idx, req_idx_MR; - VirtDevice *vdev; - VirtTarget *vtarget; hd = (MPT_SCSI_HOST *) ioc->sh->hostdata; @@ -569,7 +579,6 @@ mptscsih_io_done(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr) } sc = hd->ScsiLookup[req_idx]; - hd->ScsiLookup[req_idx] = NULL; if (sc == NULL) { MPIHeader_t *hdr = (MPIHeader_t *)mf; @@ -585,12 +594,6 @@ mptscsih_io_done(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr) return 1; } - if ((unsigned char *)mf != sc->host_scribble) { - mptscsih_freeChainBuffers(ioc, req_idx); - return 1; - } - - sc->host_scribble = NULL; sc->result = DID_OK << 16; /* Set default reply as OK */ pScsiReq = (SCSIIORequest_t *) mf; pScsiReply = (SCSIIOReply_t *) mr; @@ -670,50 +673,23 @@ mptscsih_io_done(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr) case MPI_IOCSTATUS_SCSI_DEVICE_NOT_THERE: /* 0x0043 */ /* Spoof to SCSI Selection Timeout! */ - if (ioc->bus_type != FC) - sc->result = DID_NO_CONNECT << 16; - /* else fibre, just stall until rescan event */ - else - sc->result = DID_REQUEUE << 16; + sc->result = DID_NO_CONNECT << 16; if (hd->sel_timeout[pScsiReq->TargetID] < 0xFFFF) hd->sel_timeout[pScsiReq->TargetID]++; - - vdev = sc->device->hostdata; - if (!vdev) - break; - vtarget = vdev->vtarget; - if (vtarget->tflags & MPT_TARGET_FLAGS_LED_ON) { - mptscsih_issue_sep_command(ioc, vtarget, - MPI_SEP_REQ_SLOTSTATUS_UNCONFIGURED); - vtarget->tflags &= ~MPT_TARGET_FLAGS_LED_ON; - } break; - case MPI_IOCSTATUS_SCSI_IOC_TERMINATED: /* 0x004B */ - if ( ioc->bus_type == SAS ) { - u16 ioc_status = le16_to_cpu(pScsiReply->IOCStatus); - if (ioc_status & MPI_IOCSTATUS_FLAG_LOG_INFO_AVAILABLE) { - u32 log_info = le32_to_cpu(mr->u.reply.IOCLogInfo); - log_info &=SAS_LOGINFO_MASK; - if (log_info == SAS_LOGINFO_NEXUS_LOSS) { - sc->result = (DID_BUS_BUSY << 16); - break; - } - } - } - - /* - * Allow non-SAS & non-NEXUS_LOSS to drop into below code - */ - case MPI_IOCSTATUS_SCSI_TASK_TERMINATED: /* 0x0048 */ + case MPI_IOCSTATUS_SCSI_IOC_TERMINATED: /* 0x004B */ case MPI_IOCSTATUS_SCSI_EXT_TERMINATED: /* 0x004C */ /* Linux handles an unsolicited DID_RESET better * than an unsolicited DID_ABORT. */ sc->result = DID_RESET << 16; + /* GEM Workaround. */ + if (ioc->bus_type == SPI) + mptscsih_no_negotiate(hd, sc); break; case MPI_IOCSTATUS_SCSI_RESIDUAL_MISMATCH: /* 0x0049 */ @@ -722,7 +698,7 @@ mptscsih_io_done(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr) sc->result=DID_SOFT_ERROR << 16; else /* Sufficient data transfer occurred */ sc->result = (DID_OK << 16) | scsi_status; - dreplyprintk((KERN_NOTICE + dreplyprintk((KERN_NOTICE "RESIDUAL_MISMATCH: result=%x on id=%d\n", sc->result, sc->device->id)); break; @@ -848,6 +824,8 @@ mptscsih_io_done(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr) sc->request_bufflen, sc->sc_data_direction); } + hd->ScsiLookup[req_idx] = NULL; + sc->scsi_done(sc); /* Issue the command callback */ /* Free Chain buffers */ @@ -889,17 +867,9 @@ mptscsih_flush_running_cmds(MPT_SCSI_HOST *hd) dmfprintk(( "flush: ScsiDone (mf=%p,sc=%p)\n", mf, SCpnt)); - /* Free Chain buffers */ - mptscsih_freeChainBuffers(ioc, ii); - - /* Free Message frames */ - mpt_free_msg_frame(ioc, mf); - - if ((unsigned char *)mf != SCpnt->host_scribble) - continue; - /* Set status, free OS resources (SG DMA buffers) * Do OS callback + * Free driver resources (chain, msg buffers) */ if (SCpnt->use_sg) { pci_unmap_sg(ioc->pcidev, @@ -915,6 +885,12 @@ mptscsih_flush_running_cmds(MPT_SCSI_HOST *hd) SCpnt->result = DID_RESET << 16; SCpnt->host_scribble = NULL; + /* Free Chain buffers */ + mptscsih_freeChainBuffers(ioc, ii); + + /* Free Message frames */ + mpt_free_msg_frame(ioc, mf); + SCpnt->scsi_done(SCpnt); /* Issue the command callback */ } } @@ -945,17 +921,17 @@ mptscsih_search_running_cmds(MPT_SCSI_HOST *hd, VirtDevice *vdevice) struct scsi_cmnd *sc; dsprintk((KERN_INFO MYNAM ": search_running target %d lun %d max %d\n", - vdevice->vtarget->target_id, vdevice->lun, max)); + vdevice->target_id, vdevice->lun, max)); for (ii=0; ii < max; ii++) { if ((sc = hd->ScsiLookup[ii]) != NULL) { mf = (SCSIIORequest_t *)MPT_INDEX_2_MFPTR(hd->ioc, ii); - if (mf == NULL) - continue; + dsprintk(( "search_running: found (sc=%p, mf = %p) target %d, lun %d \n", hd->ScsiLookup[ii], mf, mf->TargetID, mf->LUN[1])); - if ((mf->TargetID != ((u8)vdevice->vtarget->target_id)) || (mf->LUN[1] != ((u8) vdevice->lun))) + + if ((mf->TargetID != ((u8)vdevice->target_id)) || (mf->LUN[1] != ((u8) vdevice->lun))) continue; /* Cleanup @@ -963,8 +939,6 @@ mptscsih_search_running_cmds(MPT_SCSI_HOST *hd, VirtDevice *vdevice) hd->ScsiLookup[ii] = NULL; mptscsih_freeChainBuffers(hd->ioc, ii); mpt_free_msg_frame(hd->ioc, (MPT_FRAME_HDR *)mf); - if ((unsigned char *)mf != sc->host_scribble) - continue; if (sc->use_sg) { pci_unmap_sg(hd->ioc->pcidev, (struct scatterlist *) sc->request_buffer, @@ -1031,6 +1005,10 @@ mptscsih_remove(struct pci_dev *pdev) MPT_ADAPTER *ioc = pci_get_drvdata(pdev); struct Scsi_Host *host = ioc->sh; MPT_SCSI_HOST *hd; +#ifdef MPTSCSIH_ENABLE_DOMAIN_VALIDATION + int count; + unsigned long flags; +#endif int sz1; if(!host) { @@ -1043,6 +1021,25 @@ mptscsih_remove(struct pci_dev *pdev) if((hd = (MPT_SCSI_HOST *)host->hostdata) == NULL) return; +#ifdef MPTSCSIH_ENABLE_DOMAIN_VALIDATION + /* Check DV thread active */ + count = 10 * HZ; + spin_lock_irqsave(&dvtaskQ_lock, flags); + if (dvtaskQ_active) { + spin_unlock_irqrestore(&dvtaskQ_lock, flags); + while(dvtaskQ_active && --count) + schedule_timeout_interruptible(1); + } else { + spin_unlock_irqrestore(&dvtaskQ_lock, flags); + } + if (!count) + printk(KERN_ERR MYNAM ": ERROR - DV thread still active!\n"); +#if defined(MPT_DEBUG_DV) || defined(MPT_DEBUG_DV_TINY) + else + printk(KERN_ERR MYNAM ": DV thread orig %d, count %d\n", 10 * HZ, count); +#endif +#endif + mptscsih_shutdown(pdev); sz1=0; @@ -1130,6 +1127,21 @@ mptscsih_resume(struct pci_dev *pdev) if(!hd) return 0; +#ifdef MPTSCSIH_ENABLE_DOMAIN_VALIDATION + { + unsigned long lflags; + spin_lock_irqsave(&dvtaskQ_lock, lflags); + if (!dvtaskQ_active) { + dvtaskQ_active = 1; + spin_unlock_irqrestore(&dvtaskQ_lock, lflags); + INIT_WORK(&dvTaskQ_task, + mptscsih_domainValidation, (void *) hd); + schedule_work(&dvTaskQ_task); + } else { + spin_unlock_irqrestore(&dvtaskQ_lock, lflags); + } + } +#endif return 0; } @@ -1305,14 +1317,6 @@ mptscsih_qcmd(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *)) return SCSI_MLQUEUE_HOST_BUSY; } - if ((hd->ioc->bus_type == SPI) && - vdev->vtarget->tflags & MPT_TARGET_FLAGS_RAID_COMPONENT && - mptscsih_raid_id_to_num(hd, SCpnt->device->id) < 0) { - SCpnt->result = DID_NO_CONNECT << 16; - done(SCpnt); - return 0; - } - /* * Put together a MPT SCSI request... */ @@ -1356,13 +1360,10 @@ mptscsih_qcmd(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *)) /* Use the above information to set up the message frame */ - pScsiReq->TargetID = (u8) vdev->vtarget->target_id; - pScsiReq->Bus = vdev->vtarget->bus_id; + pScsiReq->TargetID = (u8) vdev->target_id; + pScsiReq->Bus = vdev->bus_id; pScsiReq->ChainOffset = 0; - if (vdev->vtarget->tflags & MPT_TARGET_FLAGS_RAID_COMPONENT) - pScsiReq->Function = MPI_FUNCTION_RAID_SCSI_IO_PASSTHROUGH; - else - pScsiReq->Function = MPI_FUNCTION_SCSI_IO_REQUEST; + pScsiReq->Function = MPI_FUNCTION_SCSI_IO_REQUEST; pScsiReq->CDBLength = SCpnt->cmd_len; pScsiReq->SenseBufferLength = MPT_SENSE_BUFFER_SIZE; pScsiReq->Reserved = 0; @@ -1407,8 +1408,51 @@ mptscsih_qcmd(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *)) goto fail; } - SCpnt->host_scribble = (unsigned char *)mf; hd->ScsiLookup[my_idx] = SCpnt; + SCpnt->host_scribble = NULL; + +#ifdef MPTSCSIH_ENABLE_DOMAIN_VALIDATION + if (hd->ioc->bus_type == SPI) { + int dvStatus = hd->ioc->spi_data.dvStatus[vdev->target_id]; + int issueCmd = 1; + + if (dvStatus || hd->ioc->spi_data.forceDv) { + + if ((dvStatus & MPT_SCSICFG_NEED_DV) || + (hd->ioc->spi_data.forceDv & MPT_SCSICFG_NEED_DV)) { + unsigned long lflags; + /* Schedule DV if necessary */ + spin_lock_irqsave(&dvtaskQ_lock, lflags); + if (!dvtaskQ_active) { + dvtaskQ_active = 1; + spin_unlock_irqrestore(&dvtaskQ_lock, lflags); + INIT_WORK(&dvTaskQ_task, mptscsih_domainValidation, (void *) hd); + + schedule_work(&dvTaskQ_task); + } else { + spin_unlock_irqrestore(&dvtaskQ_lock, lflags); + } + hd->ioc->spi_data.forceDv &= ~MPT_SCSICFG_NEED_DV; + } + + /* Trying to do DV to this target, extend timeout. + * Wait to issue until flag is clear + */ + if (dvStatus & MPT_SCSICFG_DV_PENDING) { + mod_timer(&SCpnt->eh_timeout, jiffies + 40 * HZ); + issueCmd = 0; + } + + /* Set the DV flags. + */ + if (dvStatus & MPT_SCSICFG_DV_NOT_DONE) + mptscsih_set_dvflags(hd, SCpnt); + + if (!issueCmd) + goto fail; + } + } +#endif mpt_put_msg_frame(hd->ioc->DoneCtx, hd->ioc, mf); dmfprintk((MYIOC_s_INFO_FMT "Issued SCSI cmd (%p) mf=%p idx=%d\n", @@ -1595,12 +1639,6 @@ mptscsih_TMHandler(MPT_SCSI_HOST *hd, u8 type, u8 channel, u8 target, u8 lun, in rc = mpt_HardResetHandler(hd->ioc, CAN_SLEEP); } - /* - * Check IOCStatus from TM reply message - */ - if (hd->tm_iocstatus != MPI_IOCSTATUS_SUCCESS) - rc = FAILED; - dtmprintk((MYIOC_s_INFO_FMT "TMHandler rc = %d!\n", hd->ioc->name, rc)); return rc; @@ -1721,12 +1759,12 @@ int mptscsih_abort(struct scsi_cmnd * SCpnt) { MPT_SCSI_HOST *hd; + MPT_ADAPTER *ioc; MPT_FRAME_HDR *mf; u32 ctx2abort; int scpnt_idx; int retval; VirtDevice *vdev; - ulong sn = SCpnt->serial_number; /* If we can't locate our host adapter structure, return FAILED status. */ @@ -1739,6 +1777,14 @@ mptscsih_abort(struct scsi_cmnd * SCpnt) return FAILED; } + ioc = hd->ioc; + if (hd->resetPending) { + return FAILED; + } + + if (hd->timeouts < -1) + hd->timeouts++; + /* Find this command */ if ((scpnt_idx = SCPNT_TO_LOOKUP_IDX(SCpnt)) < 0) { @@ -1752,13 +1798,6 @@ mptscsih_abort(struct scsi_cmnd * SCpnt) return SUCCESS; } - if (hd->resetPending) { - return FAILED; - } - - if (hd->timeouts < -1) - hd->timeouts++; - printk(KERN_WARNING MYNAM ": %s: attempting task abort! (sc=%p)\n", hd->ioc->name, SCpnt); scsi_print_command(SCpnt); @@ -1777,13 +1816,8 @@ mptscsih_abort(struct scsi_cmnd * SCpnt) vdev = SCpnt->device->hostdata; retval = mptscsih_TMHandler(hd, MPI_SCSITASKMGMT_TASKTYPE_ABORT_TASK, - vdev->vtarget->bus_id, vdev->vtarget->target_id, vdev->lun, - ctx2abort, mptscsih_get_tm_timeout(hd->ioc)); - - if (SCPNT_TO_LOOKUP_IDX(SCpnt) == scpnt_idx && - SCpnt->serial_number == sn) { - retval = FAILED; - } + vdev->bus_id, vdev->target_id, vdev->lun, + ctx2abort, mptscsih_get_tm_timeout(ioc)); printk (KERN_WARNING MYNAM ": %s: task abort: %s (sc=%p)\n", hd->ioc->name, @@ -1833,7 +1867,7 @@ mptscsih_dev_reset(struct scsi_cmnd * SCpnt) vdev = SCpnt->device->hostdata; retval = mptscsih_TMHandler(hd, MPI_SCSITASKMGMT_TASKTYPE_TARGET_RESET, - vdev->vtarget->bus_id, vdev->vtarget->target_id, + vdev->bus_id, vdev->target_id, 0, 0, mptscsih_get_tm_timeout(hd->ioc)); printk (KERN_WARNING MYNAM ": %s: target reset: %s (sc=%p)\n", @@ -1884,7 +1918,7 @@ mptscsih_bus_reset(struct scsi_cmnd * SCpnt) vdev = SCpnt->device->hostdata; retval = mptscsih_TMHandler(hd, MPI_SCSITASKMGMT_TASKTYPE_RESET_BUS, - vdev->vtarget->bus_id, 0, 0, 0, mptscsih_get_tm_timeout(hd->ioc)); + vdev->bus_id, 0, 0, 0, mptscsih_get_tm_timeout(hd->ioc)); printk (KERN_WARNING MYNAM ": %s: bus reset: %s (sc=%p)\n", hd->ioc->name, @@ -2000,7 +2034,7 @@ mptscsih_tm_wait_for_completion(MPT_SCSI_HOST * hd, ulong timeout ) break; } spin_unlock_irqrestore(&hd->ioc->FreeQlock, flags); - msleep(250); + msleep_interruptible(250); } while (--loop_count); return status; @@ -2101,7 +2135,6 @@ mptscsih_taskmgmt_complete(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *m DBG_DUMP_TM_REPLY_FRAME((u32 *)pScsiTmReply); iocstatus = le16_to_cpu(pScsiTmReply->IOCStatus) & MPI_IOCSTATUS_MASK; - hd->tm_iocstatus = iocstatus; dtmprintk((MYIOC_s_WARN_FMT " SCSI TaskMgmt (%d) IOCStatus=%04x IOCLogInfo=%08x\n", ioc->name, tmType, iocstatus, le32_to_cpu(pScsiTmReply->IOCLogInfo))); /* Error? (anything non-zero?) */ @@ -2185,42 +2218,6 @@ mptscsih_bios_param(struct scsi_device * sdev, struct block_device *bdev, return 0; } -/* Search IOC page 3 to determine if this is hidden physical disk - * - */ -int -mptscsih_is_phys_disk(MPT_ADAPTER *ioc, int id) -{ - int i; - - if (!ioc->raid_data.isRaid || !ioc->raid_data.pIocPg3) - return 0; - for (i = 0; i < ioc->raid_data.pIocPg3->NumPhysDisks; i++) { - if (id == ioc->raid_data.pIocPg3->PhysDisk[i].PhysDiskID) - return 1; - } - return 0; -} -EXPORT_SYMBOL(mptscsih_is_phys_disk); - -int -mptscsih_raid_id_to_num(MPT_SCSI_HOST *hd, uint physdiskid) -{ - int i; - - if (!hd->ioc->raid_data.isRaid || !hd->ioc->raid_data.pIocPg3) - return -ENXIO; - - for (i = 0; i < hd->ioc->raid_data.pIocPg3->NumPhysDisks; i++) { - if (physdiskid == - hd->ioc->raid_data.pIocPg3->PhysDisk[i].PhysDiskID) - return hd->ioc->raid_data.pIocPg3->PhysDisk[i].PhysDiskNum; - } - - return -ENXIO; -} -EXPORT_SYMBOL(mptscsih_raid_id_to_num); - /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ /* * OS entry point to allow host driver to alloc memory @@ -2236,7 +2233,6 @@ mptscsih_target_alloc(struct scsi_target *starget) if (!vtarget) return -ENOMEM; starget->hostdata = vtarget; - vtarget->starget = starget; return 0; } @@ -2262,12 +2258,14 @@ mptscsih_slave_alloc(struct scsi_device *sdev) return -ENOMEM; } + vdev->ioc_id = hd->ioc->id; + vdev->target_id = sdev->id; + vdev->bus_id = sdev->channel; vdev->lun = sdev->lun; sdev->hostdata = vdev; starget = scsi_target(sdev); vtarget = starget->hostdata; - vdev->vtarget = vtarget; if (vtarget->num_luns == 0) { @@ -2276,11 +2274,14 @@ mptscsih_slave_alloc(struct scsi_device *sdev) vtarget->tflags = MPT_TARGET_FLAGS_Q_YES; vtarget->target_id = sdev->id; vtarget->bus_id = sdev->channel; - if (hd->ioc->bus_type == SPI && sdev->channel == 0 && - hd->ioc->raid_data.isRaid & (1 << sdev->id)) { - vtarget->raidVolume = 1; - ddvtprintk((KERN_INFO + if (hd->ioc->bus_type == SPI) { + if (hd->ioc->raid_data.isRaid & (1 << sdev->id)) { + vtarget->raidVolume = 1; + ddvtprintk((KERN_INFO "RAID Volume @ id %d\n", sdev->id)); + } + } else { + vtarget->tflags |= MPT_TARGET_FLAGS_VALID_INQUIRY; } } vtarget->num_luns++; @@ -2320,6 +2321,19 @@ mptscsih_slave_destroy(struct scsi_device *sdev) vtarget->luns[0] &= ~(1 << vdevice->lun); vtarget->num_luns--; if (vtarget->num_luns == 0) { + mptscsih_negotiate_to_asyn_narrow(hd, vdevice); + if (hd->ioc->bus_type == SPI) { + if (mptscsih_is_phys_disk(hd->ioc, vtarget->target_id)) { + hd->ioc->spi_data.forceDv |= MPT_SCSICFG_RELOAD_IOC_PG3; + } else { + hd->ioc->spi_data.dvStatus[vtarget->target_id] = + MPT_SCSICFG_NEGOTIATE; + if (!hd->negoNvram) { + hd->ioc->spi_data.dvStatus[vtarget->target_id] |= + MPT_SCSICFG_DV_NOT_DONE; + } + } + } hd->Targets[sdev->id] = NULL; } mptscsih_synchronize_cache(hd, vdevice); @@ -2348,13 +2362,18 @@ mptscsih_change_queue_depth(struct scsi_device *sdev, int qdepth) vtarget = starget->hostdata; if (hd->ioc->bus_type == SPI) { - if (!(vtarget->tflags & MPT_TARGET_FLAGS_Q_YES)) + if (vtarget->tflags & MPT_TARGET_FLAGS_VALID_INQUIRY) { + if (!(vtarget->tflags & MPT_TARGET_FLAGS_Q_YES)) + max_depth = 1; + else if (((vtarget->inq_data[0] & 0x1f) == 0x00) && + (vtarget->minSyncFactor <= MPT_ULTRA160 )) + max_depth = MPT_SCSI_CMD_PER_DEV_HIGH; + else + max_depth = MPT_SCSI_CMD_PER_DEV_LOW; + } else { + /* error case - No Inq. Data */ max_depth = 1; - else if (sdev->type == TYPE_DISK && - vtarget->minSyncFactor <= MPT_ULTRA160) - max_depth = MPT_SCSI_CMD_PER_DEV_HIGH; - else - max_depth = MPT_SCSI_CMD_PER_DEV_LOW; + } } else max_depth = MPT_SCSI_CMD_PER_DEV_HIGH; @@ -2408,7 +2427,8 @@ mptscsih_slave_configure(struct scsi_device *sdev) lun_index = (vdevice->lun >> 5); /* 32 luns per lun_index */ indexed_lun = (vdevice->lun % 32); vtarget->luns[lun_index] |= (1 << indexed_lun); - mptscsih_initTarget(hd, vtarget, sdev); + mptscsih_initTarget(hd, vtarget, sdev->lun, sdev->inquiry, + sdev->inquiry_len ); mptscsih_change_queue_depth(sdev, MPT_SCSI_CMD_PER_DEV_HIGH); dsprintk((MYIOC_s_INFO_FMT @@ -2480,13 +2500,6 @@ mptscsih_copy_sense_data(struct scsi_cmnd *sc, MPT_SCSI_HOST *hd, MPT_FRAME_HDR ioc->events[idx].data[1] = (sense_data[13] << 8) || sense_data[12]; ioc->eventContext++; - if (hd->ioc->pcidev->vendor == - PCI_VENDOR_ID_IBM) { - mptscsih_issue_sep_command(hd->ioc, - vdev->vtarget, MPI_SEP_REQ_SLOTSTATUS_PREDICTED_FAULT); - vdev->vtarget->tflags |= - MPT_TARGET_FLAGS_LED_ON; - } } } } else { @@ -2495,7 +2508,7 @@ mptscsih_copy_sense_data(struct scsi_cmnd *sc, MPT_SCSI_HOST *hd, MPT_FRAME_HDR } } -static int +static u32 SCPNT_TO_LOOKUP_IDX(struct scsi_cmnd *sc) { MPT_SCSI_HOST *hd; @@ -2584,6 +2597,10 @@ mptscsih_ioc_reset(MPT_ADAPTER *ioc, int reset_phase) /* 4. Renegotiate to all devices, if SPI */ + if (ioc->bus_type == SPI) { + dnegoprintk(("writeSDP1: ALL_IDS USE_NVRAM\n")); + mptscsih_writeSDP1(hd, 0, 0, MPT_SCSICFG_ALL_IDS | MPT_SCSICFG_USE_NVRAM); + } /* 5. Enable new commands to be posted */ @@ -2607,6 +2624,25 @@ mptscsih_ioc_reset(MPT_ADAPTER *ioc, int reset_phase) hd->cmdPtr = NULL; } + /* 7. SPI: Set flag to force DV and re-read IOC Page 3 + */ + if (ioc->bus_type == SPI) { + ioc->spi_data.forceDv = MPT_SCSICFG_NEED_DV | MPT_SCSICFG_RELOAD_IOC_PG3; + ddvtprintk(("Set reload IOC Pg3 Flag\n")); + } + + /* 7. FC: Rescan for blocked rports which might have returned. + */ + else if (ioc->bus_type == FC) { + int work_count; + unsigned long flags; + + spin_lock_irqsave(&ioc->fc_rescan_work_lock, flags); + work_count = ++ioc->fc_rescan_work_count; + spin_unlock_irqrestore(&ioc->fc_rescan_work_lock, flags); + if (work_count == 1) + schedule_work(&ioc->fc_rescan_work); + } dtmprintk((MYIOC_s_WARN_FMT "Post-Reset complete.\n", ioc->name)); } @@ -2620,8 +2656,10 @@ mptscsih_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *pEvReply) { MPT_SCSI_HOST *hd; u8 event = le32_to_cpu(pEvReply->Event) & 0xFF; + int work_count; + unsigned long flags; - devtverboseprintk((MYIOC_s_INFO_FMT "MPT event (=%02Xh) routed to SCSI host driver!\n", + devtprintk((MYIOC_s_INFO_FMT "MPT event (=%02Xh) routed to SCSI host driver!\n", ioc->name, event)); if (ioc->sh == NULL || @@ -2642,6 +2680,11 @@ mptscsih_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *pEvReply) break; case MPI_EVENT_RESCAN: /* 06 */ + spin_lock_irqsave(&ioc->fc_rescan_work_lock, flags); + work_count = ++ioc->fc_rescan_work_count; + spin_unlock_irqrestore(&ioc->fc_rescan_work_lock, flags); + if (work_count == 1) + schedule_work(&ioc->fc_rescan_work); break; /* @@ -2656,7 +2699,18 @@ mptscsih_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *pEvReply) break; case MPI_EVENT_INTEGRATED_RAID: /* 0B */ + { +#ifdef MPTSCSIH_ENABLE_DOMAIN_VALIDATION + pMpiEventDataRaid_t pRaidEventData = + (pMpiEventDataRaid_t) pEvReply->Data; + /* Domain Validation Needed */ + if (ioc->bus_type == SPI && + pRaidEventData->ReasonCode == + MPI_EVENT_RAID_RC_DOMAIN_VAL_NEEDED) + mptscsih_set_dvflags_raid(hd, pRaidEventData->PhysDiskNum); +#endif break; + } case MPI_EVENT_NONE: /* 00 */ case MPI_EVENT_LOG_DATA: /* 01 */ @@ -2675,7 +2729,9 @@ mptscsih_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *pEvReply) * mptscsih_initTarget - Target, LUN alloc/free functionality. * @hd: Pointer to MPT_SCSI_HOST structure * @vtarget: per target private data - * @sdev: SCSI device + * @lun: SCSI LUN id + * @data: Pointer to data + * @dlen: Number of INQUIRY bytes * * NOTE: It's only SAFE to call this routine if data points to * sane & valid STANDARD INQUIRY data! @@ -2685,46 +2741,98 @@ mptscsih_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *pEvReply) * */ static void -mptscsih_initTarget(MPT_SCSI_HOST *hd, VirtTarget *vtarget, - struct scsi_device *sdev) +mptscsih_initTarget(MPT_SCSI_HOST *hd, VirtTarget *vtarget, u8 lun, char *data, int dlen) { + SpiCfgData *pSpi; + char data_56; + int inq_len; + dinitprintk((MYIOC_s_INFO_FMT "initTarget bus=%d id=%d lun=%d hd=%p\n", hd->ioc->name, vtarget->bus_id, vtarget->target_id, lun, hd)); + /* + * If the peripheral qualifier filter is enabled then if the target reports a 0x1 + * (i.e. The targer is capable of supporting the specified peripheral device type + * on this logical unit; however, the physical device is not currently connected + * to this logical unit) it will be converted to a 0x3 (i.e. The target is not + * capable of supporting a physical device on this logical unit). This is to work + * around a bug in th emid-layer in some distributions in which the mid-layer will + * continue to try to communicate to the LUN and evntually create a dummy LUN. + */ + if (hd->mpt_pq_filter && dlen && (data[0] & 0xE0)) + data[0] |= 0x40; + /* Is LUN supported? If so, upper 2 bits will be 0 * in first byte of inquiry data. */ - if (sdev->inq_periph_qual != 0) + if (data[0] & 0xe0) return; if (vtarget == NULL) return; - vtarget->type = sdev->type; + if (data) + vtarget->type = data[0]; if (hd->ioc->bus_type != SPI) return; - if ((sdev->type == TYPE_PROCESSOR) && (hd->ioc->spi_data.Saf_Te)) { + if ((data[0] == TYPE_PROCESSOR) && (hd->ioc->spi_data.Saf_Te)) { /* Treat all Processors as SAF-TE if * command line option is set */ vtarget->tflags |= MPT_TARGET_FLAGS_SAF_TE_ISSUED; mptscsih_writeIOCPage4(hd, vtarget->target_id, vtarget->bus_id); - }else if ((sdev->type == TYPE_PROCESSOR) && + }else if ((data[0] == TYPE_PROCESSOR) && !(vtarget->tflags & MPT_TARGET_FLAGS_SAF_TE_ISSUED )) { - if (sdev->inquiry_len > 49 ) { - if (sdev->inquiry[44] == 'S' && - sdev->inquiry[45] == 'A' && - sdev->inquiry[46] == 'F' && - sdev->inquiry[47] == '-' && - sdev->inquiry[48] == 'T' && - sdev->inquiry[49] == 'E' ) { + if ( dlen > 49 ) { + vtarget->tflags |= MPT_TARGET_FLAGS_VALID_INQUIRY; + if ( data[44] == 'S' && + data[45] == 'A' && + data[46] == 'F' && + data[47] == '-' && + data[48] == 'T' && + data[49] == 'E' ) { vtarget->tflags |= MPT_TARGET_FLAGS_SAF_TE_ISSUED; mptscsih_writeIOCPage4(hd, vtarget->target_id, vtarget->bus_id); } } } - mptscsih_setTargetNegoParms(hd, vtarget, sdev); + if (!(vtarget->tflags & MPT_TARGET_FLAGS_VALID_INQUIRY)) { + inq_len = dlen < 8 ? dlen : 8; + memcpy (vtarget->inq_data, data, inq_len); + /* If have not done DV, set the DV flag. + */ + pSpi = &hd->ioc->spi_data; + if ((data[0] == TYPE_TAPE) || (data[0] == TYPE_PROCESSOR)) { + if (pSpi->dvStatus[vtarget->target_id] & MPT_SCSICFG_DV_NOT_DONE) + pSpi->dvStatus[vtarget->target_id] |= MPT_SCSICFG_NEED_DV; + } + vtarget->tflags |= MPT_TARGET_FLAGS_VALID_INQUIRY; + + data_56 = 0x0F; /* Default to full capabilities if Inq data length is < 57 */ + if (dlen > 56) { + if ( (!(vtarget->tflags & MPT_TARGET_FLAGS_VALID_56))) { + /* Update the target capabilities + */ + data_56 = data[56]; + vtarget->tflags |= MPT_TARGET_FLAGS_VALID_56; + } + } + mptscsih_setTargetNegoParms(hd, vtarget, data_56); + } else { + /* Initial Inquiry may not request enough data bytes to + * obtain byte 57. DV will; if target doesn't return + * at least 57 bytes, data[56] will be zero. */ + if (dlen > 56) { + if ( (!(vtarget->tflags & MPT_TARGET_FLAGS_VALID_56))) { + /* Update the target capabilities + */ + data_56 = data[56]; + vtarget->tflags |= MPT_TARGET_FLAGS_VALID_56; + mptscsih_setTargetNegoParms(hd, vtarget, data_56); + } + } + } } /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ @@ -2734,51 +2842,66 @@ mptscsih_initTarget(MPT_SCSI_HOST *hd, VirtTarget *vtarget, * */ static void -mptscsih_setTargetNegoParms(MPT_SCSI_HOST *hd, VirtTarget *target, - struct scsi_device *sdev) +mptscsih_setTargetNegoParms(MPT_SCSI_HOST *hd, VirtTarget *target, char byte56) { SpiCfgData *pspi_data = &hd->ioc->spi_data; int id = (int) target->target_id; int nvram; + VirtTarget *vtarget; + int ii; u8 width = MPT_NARROW; u8 factor = MPT_ASYNC; u8 offset = 0; - u8 nfactor; + u8 version, nfactor; u8 noQas = 1; target->negoFlags = pspi_data->noQas; - /* noQas == 0 => device supports QAS. */ + /* noQas == 0 => device supports QAS. Need byte 56 of Inq to determine + * support. If available, default QAS to off and allow enabling. + * If not available, default QAS to on, turn off for non-disks. + */ - if (sdev->scsi_level < SCSI_2) { + /* Set flags based on Inquiry data + */ + version = target->inq_data[2] & 0x07; + if (version < 2) { width = 0; factor = MPT_ULTRA2; offset = pspi_data->maxSyncOffset; target->tflags &= ~MPT_TARGET_FLAGS_Q_YES; } else { - if (scsi_device_wide(sdev)) { + if (target->inq_data[7] & 0x20) { width = 1; } - if (scsi_device_sync(sdev)) { + if (target->inq_data[7] & 0x10) { factor = pspi_data->minSyncFactor; - if (!scsi_device_dt(sdev)) + if (target->tflags & MPT_TARGET_FLAGS_VALID_56) { + /* bits 2 & 3 show Clocking support */ + if ((byte56 & 0x0C) == 0) factor = MPT_ULTRA2; - else { - if (!scsi_device_ius(sdev) && - !scsi_device_qas(sdev)) - factor = MPT_ULTRA160; else { - factor = MPT_ULTRA320; - if (scsi_device_qas(sdev)) { - ddvtprintk((KERN_INFO "Enabling QAS due to byte56=%02x on id=%d!\n", byte56, id)); - noQas = 0; + if ((byte56 & 0x03) == 0) + factor = MPT_ULTRA160; + else { + factor = MPT_ULTRA320; + if (byte56 & 0x02) + { + ddvtprintk((KERN_INFO "Enabling QAS due to byte56=%02x on id=%d!\n", byte56, id)); + noQas = 0; + } + if (target->inq_data[0] == TYPE_TAPE) { + if (byte56 & 0x01) + target->negoFlags |= MPT_TAPE_NEGO_IDP; + } } - if (sdev->type == TYPE_TAPE && - scsi_device_ius(sdev)) - target->negoFlags |= MPT_TAPE_NEGO_IDP; } + } else { + ddvtprintk((KERN_INFO "Enabling QAS on id=%d due to ~TARGET_FLAGS_VALID_56!\n", id)); + noQas = 0; } + offset = pspi_data->maxSyncOffset; /* If RAID, never disable QAS @@ -2796,7 +2919,7 @@ mptscsih_setTargetNegoParms(MPT_SCSI_HOST *hd, VirtTarget *target, } } - if (!sdev->tagged_supported) { + if ( (target->inq_data[7] & 0x02) == 0) { target->tflags &= ~MPT_TARGET_FLAGS_Q_YES; } @@ -2854,92 +2977,374 @@ mptscsih_setTargetNegoParms(MPT_SCSI_HOST *hd, VirtTarget *target, if ( factor > MPT_ULTRA320 ) noQas = 0; - if (noQas && (pspi_data->noQas == 0)) { - pspi_data->noQas |= MPT_TARGET_NO_NEGO_QAS; - target->negoFlags |= MPT_TARGET_NO_NEGO_QAS; - - /* Disable QAS in a mixed configuration case - */ + /* GEM, processor WORKAROUND + */ + if ((target->inq_data[0] == TYPE_PROCESSOR) || (target->inq_data[0] > 0x08)) { + target->negoFlags |= (MPT_TARGET_NO_NEGO_WIDE | MPT_TARGET_NO_NEGO_SYNC); + pspi_data->dvStatus[id] |= MPT_SCSICFG_BLK_NEGO; + } else { + if (noQas && (pspi_data->noQas == 0)) { + pspi_data->noQas |= MPT_TARGET_NO_NEGO_QAS; + target->negoFlags |= MPT_TARGET_NO_NEGO_QAS; + + /* Disable QAS in a mixed configuration case + */ + + ddvtprintk((KERN_INFO "Disabling QAS due to noQas=%02x on id=%d!\n", noQas, id)); + for (ii = 0; ii < id; ii++) { + if ( (vtarget = hd->Targets[ii]) ) { + vtarget->negoFlags |= MPT_TARGET_NO_NEGO_QAS; + mptscsih_writeSDP1(hd, 0, ii, vtarget->negoFlags); + } + } + } + } - ddvtprintk((KERN_INFO "Disabling QAS due to noQas=%02x on id=%d!\n", noQas, id)); + /* Write SDP1 on this I/O to this target */ + if (pspi_data->dvStatus[id] & MPT_SCSICFG_NEGOTIATE) { + ddvtprintk((KERN_INFO "MPT_SCSICFG_NEGOTIATE on id=%d!\n", id)); + mptscsih_writeSDP1(hd, 0, id, hd->negoNvram); + pspi_data->dvStatus[id] &= ~MPT_SCSICFG_NEGOTIATE; + } else if (pspi_data->dvStatus[id] & MPT_SCSICFG_BLK_NEGO) { + ddvtprintk((KERN_INFO "MPT_SCSICFG_BLK_NEGO on id=%d!\n", id)); + mptscsih_writeSDP1(hd, 0, id, MPT_SCSICFG_BLK_NEGO); + pspi_data->dvStatus[id] &= ~MPT_SCSICFG_BLK_NEGO; } } /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ +/* + * If no Target, bus reset on 1st I/O. Set the flag to + * prevent any future negotiations to this device. + */ +static void +mptscsih_no_negotiate(MPT_SCSI_HOST *hd, struct scsi_cmnd *sc) +{ + VirtDevice *vdev; + + if ((vdev = sc->device->hostdata) != NULL) + hd->ioc->spi_data.dvStatus[vdev->target_id] |= MPT_SCSICFG_BLK_NEGO; + return; +} /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ /* * SCSI Config Page functionality ... */ +/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ +/* mptscsih_setDevicePage1Flags - add Requested and Configuration fields flags + * based on width, factor and offset parameters. + * @width: bus width + * @factor: sync factor + * @offset: sync offset + * @requestedPtr: pointer to requested values (updated) + * @configurationPtr: pointer to configuration values (updated) + * @flags: flags to block WDTR or SDTR negotiation + * + * Return: None. + * + * Remark: Called by writeSDP1 and _dv_params + */ +static void +mptscsih_setDevicePage1Flags (u8 width, u8 factor, u8 offset, int *requestedPtr, int *configurationPtr, u8 flags) +{ + u8 nowide = flags & MPT_TARGET_NO_NEGO_WIDE; + u8 nosync = flags & MPT_TARGET_NO_NEGO_SYNC; + + *configurationPtr = 0; + *requestedPtr = width ? MPI_SCSIDEVPAGE1_RP_WIDE : 0; + *requestedPtr |= (offset << 16) | (factor << 8); + + if (width && offset && !nowide && !nosync) { + if (factor < MPT_ULTRA160) { + *requestedPtr |= (MPI_SCSIDEVPAGE1_RP_IU + MPI_SCSIDEVPAGE1_RP_DT); + if ((flags & MPT_TARGET_NO_NEGO_QAS) == 0) + *requestedPtr |= MPI_SCSIDEVPAGE1_RP_QAS; + if (flags & MPT_TAPE_NEGO_IDP) + *requestedPtr |= 0x08000000; + } else if (factor < MPT_ULTRA2) { + *requestedPtr |= MPI_SCSIDEVPAGE1_RP_DT; + } + } + + if (nowide) + *configurationPtr |= MPI_SCSIDEVPAGE1_CONF_WDTR_DISALLOWED; + + if (nosync) + *configurationPtr |= MPI_SCSIDEVPAGE1_CONF_SDTR_DISALLOWED; + + return; +} /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ -/* mptscsih_writeIOCPage4 - write IOC Page 4 - * @hd: Pointer to a SCSI Host Structure - * @target_id: write IOC Page4 for this ID & Bus +/* mptscsih_writeSDP1 - write SCSI Device Page 1 + * @hd: Pointer to a SCSI Host Strucutre + * @portnum: IOC port number + * @target_id: writeSDP1 for single ID + * @flags: MPT_SCSICFG_ALL_IDS, MPT_SCSICFG_USE_NVRAM, MPT_SCSICFG_BLK_NEGO * - * Return: -EAGAIN if unable to obtain a Message Frame + * Return: -EFAULT if read of config page header fails * or 0 if success. * + * Remark: If a target has been found, the settings from the + * target structure are used, else the device is set + * to async/narrow. + * + * Remark: Called during init and after a FW reload. * Remark: We do not wait for a return, write pages sequentially. */ static int -mptscsih_writeIOCPage4(MPT_SCSI_HOST *hd, int target_id, int bus) +mptscsih_writeSDP1(MPT_SCSI_HOST *hd, int portnum, int target_id, int flags) { MPT_ADAPTER *ioc = hd->ioc; Config_t *pReq; - IOCPage4_t *IOCPage4Ptr; + SCSIDevicePage1_t *pData; + VirtTarget *vtarget=NULL; MPT_FRAME_HDR *mf; dma_addr_t dataDma; u16 req_idx; u32 frameOffset; - u32 flagsLength; - int ii; + u32 requested, configuration, flagsLength; + int ii, nvram; + int id = 0, maxid = 0; + u8 width; + u8 factor; + u8 offset; + u8 bus = 0; + u8 negoFlags; + u8 maxwidth, maxoffset, maxfactor; + + if (ioc->spi_data.sdp1length == 0) + return 0; - /* Get a MF for this command. - */ - if ((mf = mpt_get_msg_frame(ioc->DoneCtx, ioc)) == NULL) { - dfailprintk((MYIOC_s_WARN_FMT "writeIOCPage4 : no msg frames!\n", - ioc->name)); - return -EAGAIN; + if (flags & MPT_SCSICFG_ALL_IDS) { + id = 0; + maxid = ioc->sh->max_id - 1; + } else if (ioc->sh) { + id = target_id; + maxid = min_t(int, id, ioc->sh->max_id - 1); } - /* Set the request and the data pointers. - * Place data at end of MF. - */ - pReq = (Config_t *)mf; - - req_idx = le16_to_cpu(mf->u.frame.hwhdr.msgctxu.fld.req_idx); - frameOffset = ioc->req_sz - sizeof(IOCPage4_t); + for (; id <= maxid; id++) { - /* Complete the request frame (same for all requests). - */ - pReq->Action = MPI_CONFIG_ACTION_PAGE_WRITE_CURRENT; - pReq->Reserved = 0; - pReq->ChainOffset = 0; - pReq->Function = MPI_FUNCTION_CONFIG; - pReq->ExtPageLength = 0; - pReq->ExtPageType = 0; - pReq->MsgFlags = 0; - for (ii=0; ii < 8; ii++) { - pReq->Reserved2[ii] = 0; - } + if (id == ioc->pfacts[portnum].PortSCSIID) + continue; - IOCPage4Ptr = ioc->spi_data.pIocPg4; - dataDma = ioc->spi_data.IocPg4_dma; - ii = IOCPage4Ptr->ActiveSEP++; - IOCPage4Ptr->SEP[ii].SEPTargetID = target_id; - IOCPage4Ptr->SEP[ii].SEPBus = bus; - pReq->Header = IOCPage4Ptr->Header; - pReq->PageAddress = cpu_to_le32(target_id | (bus << 8 )); + /* Use NVRAM to get adapter and target maximums + * Data over-riden by target structure information, if present + */ + maxwidth = ioc->spi_data.maxBusWidth; + maxoffset = ioc->spi_data.maxSyncOffset; + maxfactor = ioc->spi_data.minSyncFactor; + if (ioc->spi_data.nvram && (ioc->spi_data.nvram[id] != MPT_HOST_NVRAM_INVALID)) { + nvram = ioc->spi_data.nvram[id]; + + if (maxwidth) + maxwidth = nvram & MPT_NVRAM_WIDE_DISABLE ? 0 : 1; + + if (maxoffset > 0) { + maxfactor = (nvram & MPT_NVRAM_SYNC_MASK) >> 8; + if (maxfactor == 0) { + /* Key for async */ + maxfactor = MPT_ASYNC; + maxoffset = 0; + } else if (maxfactor < ioc->spi_data.minSyncFactor) { + maxfactor = ioc->spi_data.minSyncFactor; + } + } else + maxfactor = MPT_ASYNC; + } - /* Add a SGE to the config request. - */ - flagsLength = MPT_SGE_FLAGS_SSIMPLE_WRITE | - (IOCPage4Ptr->Header.PageLength + ii) * 4; + /* Set the negotiation flags. + */ + negoFlags = ioc->spi_data.noQas; + if (!maxwidth) + negoFlags |= MPT_TARGET_NO_NEGO_WIDE; - mpt_add_sge((char *)&pReq->PageBufferSGE, flagsLength, dataDma); + if (!maxoffset) + negoFlags |= MPT_TARGET_NO_NEGO_SYNC; - dinitprintk((MYIOC_s_INFO_FMT + if (flags & MPT_SCSICFG_USE_NVRAM) { + width = maxwidth; + factor = maxfactor; + offset = maxoffset; + } else { + width = 0; + factor = MPT_ASYNC; + offset = 0; + //negoFlags = 0; + //negoFlags = MPT_TARGET_NO_NEGO_SYNC; + } + + /* If id is not a raid volume, get the updated + * transmission settings from the target structure. + */ + if (hd->Targets && (vtarget = hd->Targets[id]) && !vtarget->raidVolume) { + width = vtarget->maxWidth; + factor = vtarget->minSyncFactor; + offset = vtarget->maxOffset; + negoFlags = vtarget->negoFlags; + } + +#ifdef MPTSCSIH_ENABLE_DOMAIN_VALIDATION + /* Force to async and narrow if DV has not been executed + * for this ID + */ + if ((hd->ioc->spi_data.dvStatus[id] & MPT_SCSICFG_DV_NOT_DONE) != 0) { + width = 0; + factor = MPT_ASYNC; + offset = 0; + } +#endif + + if (flags & MPT_SCSICFG_BLK_NEGO) + negoFlags |= MPT_TARGET_NO_NEGO_WIDE | MPT_TARGET_NO_NEGO_SYNC; + + mptscsih_setDevicePage1Flags(width, factor, offset, + &requested, &configuration, negoFlags); + dnegoprintk(("writeSDP1: id=%d width=%d factor=%x offset=%x negoFlags=%x request=%x config=%x\n", + target_id, width, factor, offset, negoFlags, requested, configuration)); + + /* Get a MF for this command. + */ + if ((mf = mpt_get_msg_frame(ioc->DoneCtx, ioc)) == NULL) { + dfailprintk((MYIOC_s_WARN_FMT "write SDP1: no msg frames!\n", + ioc->name)); + return -EAGAIN; + } + + ddvprintk((MYIOC_s_INFO_FMT "WriteSDP1 (mf=%p, id=%d, req=0x%x, cfg=0x%x)\n", + hd->ioc->name, mf, id, requested, configuration)); + + + /* Set the request and the data pointers. + * Request takes: 36 bytes (32 bit SGE) + * SCSI Device Page 1 requires 16 bytes + * 40 + 16 <= size of SCSI IO Request = 56 bytes + * and MF size >= 64 bytes. + * Place data at end of MF. + */ + pReq = (Config_t *)mf; + + req_idx = le16_to_cpu(mf->u.frame.hwhdr.msgctxu.fld.req_idx); + frameOffset = ioc->req_sz - sizeof(SCSIDevicePage1_t); + + pData = (SCSIDevicePage1_t *)((u8 *) mf + frameOffset); + dataDma = ioc->req_frames_dma + (req_idx * ioc->req_sz) + frameOffset; + + /* Complete the request frame (same for all requests). + */ + pReq->Action = MPI_CONFIG_ACTION_PAGE_WRITE_CURRENT; + pReq->Reserved = 0; + pReq->ChainOffset = 0; + pReq->Function = MPI_FUNCTION_CONFIG; + pReq->ExtPageLength = 0; + pReq->ExtPageType = 0; + pReq->MsgFlags = 0; + for (ii=0; ii < 8; ii++) { + pReq->Reserved2[ii] = 0; + } + pReq->Header.PageVersion = ioc->spi_data.sdp1version; + pReq->Header.PageLength = ioc->spi_data.sdp1length; + pReq->Header.PageNumber = 1; + pReq->Header.PageType = MPI_CONFIG_PAGETYPE_SCSI_DEVICE; + pReq->PageAddress = cpu_to_le32(id | (bus << 8 )); + + /* Add a SGE to the config request. + */ + flagsLength = MPT_SGE_FLAGS_SSIMPLE_WRITE | ioc->spi_data.sdp1length * 4; + + mpt_add_sge((char *)&pReq->PageBufferSGE, flagsLength, dataDma); + + /* Set up the common data portion + */ + pData->Header.PageVersion = pReq->Header.PageVersion; + pData->Header.PageLength = pReq->Header.PageLength; + pData->Header.PageNumber = pReq->Header.PageNumber; + pData->Header.PageType = pReq->Header.PageType; + pData->RequestedParameters = cpu_to_le32(requested); + pData->Reserved = 0; + pData->Configuration = cpu_to_le32(configuration); + + dprintk((MYIOC_s_INFO_FMT + "write SDP1: id %d pgaddr 0x%x req 0x%x config 0x%x\n", + ioc->name, id, (id | (bus<<8)), + requested, configuration)); + + mpt_put_msg_frame(ioc->DoneCtx, ioc, mf); + } + + return 0; +} + +/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ +/* mptscsih_writeIOCPage4 - write IOC Page 4 + * @hd: Pointer to a SCSI Host Structure + * @target_id: write IOC Page4 for this ID & Bus + * + * Return: -EAGAIN if unable to obtain a Message Frame + * or 0 if success. + * + * Remark: We do not wait for a return, write pages sequentially. + */ +static int +mptscsih_writeIOCPage4(MPT_SCSI_HOST *hd, int target_id, int bus) +{ + MPT_ADAPTER *ioc = hd->ioc; + Config_t *pReq; + IOCPage4_t *IOCPage4Ptr; + MPT_FRAME_HDR *mf; + dma_addr_t dataDma; + u16 req_idx; + u32 frameOffset; + u32 flagsLength; + int ii; + + /* Get a MF for this command. + */ + if ((mf = mpt_get_msg_frame(ioc->DoneCtx, ioc)) == NULL) { + dfailprintk((MYIOC_s_WARN_FMT "writeIOCPage4 : no msg frames!\n", + ioc->name)); + return -EAGAIN; + } + + /* Set the request and the data pointers. + * Place data at end of MF. + */ + pReq = (Config_t *)mf; + + req_idx = le16_to_cpu(mf->u.frame.hwhdr.msgctxu.fld.req_idx); + frameOffset = ioc->req_sz - sizeof(IOCPage4_t); + + /* Complete the request frame (same for all requests). + */ + pReq->Action = MPI_CONFIG_ACTION_PAGE_WRITE_CURRENT; + pReq->Reserved = 0; + pReq->ChainOffset = 0; + pReq->Function = MPI_FUNCTION_CONFIG; + pReq->ExtPageLength = 0; + pReq->ExtPageType = 0; + pReq->MsgFlags = 0; + for (ii=0; ii < 8; ii++) { + pReq->Reserved2[ii] = 0; + } + + IOCPage4Ptr = ioc->spi_data.pIocPg4; + dataDma = ioc->spi_data.IocPg4_dma; + ii = IOCPage4Ptr->ActiveSEP++; + IOCPage4Ptr->SEP[ii].SEPTargetID = target_id; + IOCPage4Ptr->SEP[ii].SEPBus = bus; + pReq->Header = IOCPage4Ptr->Header; + pReq->PageAddress = cpu_to_le32(target_id | (bus << 8 )); + + /* Add a SGE to the config request. + */ + flagsLength = MPT_SGE_FLAGS_SSIMPLE_WRITE | + (IOCPage4Ptr->Header.PageLength + ii) * 4; + + mpt_add_sge((char *)&pReq->PageBufferSGE, flagsLength, dataDma); + + dinitprintk((MYIOC_s_INFO_FMT "writeIOCPage4: MaxSEP=%d ActiveSEP=%d id=%d bus=%d\n", ioc->name, IOCPage4Ptr->MaxSEP, IOCPage4Ptr->ActiveSEP, target_id, bus)); @@ -3060,7 +3465,6 @@ mptscsih_scandv_complete(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr) completionCode = MPT_SCANDV_GOOD; else completionCode = MPT_SCANDV_SOME_ERROR; - memcpy(hd->pLocal->sense, pr, sizeof(hd->pLocal->sense)); } else if (pReply->SCSIState & MPI_SCSI_STATE_AUTOSENSE_VALID) { u8 *sense_data; @@ -3174,6 +3578,78 @@ mptscsih_timer_expired(unsigned long data) return; } +#ifdef MPTSCSIH_ENABLE_DOMAIN_VALIDATION +/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ +/* mptscsih_do_raid - Format and Issue a RAID volume request message. + * @hd: Pointer to scsi host structure + * @action: What do be done. + * @id: Logical target id. + * @bus: Target locations bus. + * + * Returns: < 0 on a fatal error + * 0 on success + * + * Remark: Wait to return until reply processed by the ISR. + */ +static int +mptscsih_do_raid(MPT_SCSI_HOST *hd, u8 action, INTERNAL_CMD *io) +{ + MpiRaidActionRequest_t *pReq; + MPT_FRAME_HDR *mf; + int in_isr; + + in_isr = in_interrupt(); + if (in_isr) { + dprintk((MYIOC_s_WARN_FMT "Internal raid request not allowed in ISR context!\n", + hd->ioc->name)); + return -EPERM; + } + + /* Get and Populate a free Frame + */ + if ((mf = mpt_get_msg_frame(hd->ioc->InternalCtx, hd->ioc)) == NULL) { + ddvprintk((MYIOC_s_WARN_FMT "_do_raid: no msg frames!\n", + hd->ioc->name)); + return -EAGAIN; + } + pReq = (MpiRaidActionRequest_t *)mf; + pReq->Action = action; + pReq->Reserved1 = 0; + pReq->ChainOffset = 0; + pReq->Function = MPI_FUNCTION_RAID_ACTION; + pReq->VolumeID = io->id; + pReq->VolumeBus = io->bus; + pReq->PhysDiskNum = io->physDiskNum; + pReq->MsgFlags = 0; + pReq->Reserved2 = 0; + pReq->ActionDataWord = 0; /* Reserved for this action */ + //pReq->ActionDataSGE = 0; + + mpt_add_sge((char *)&pReq->ActionDataSGE, + MPT_SGE_FLAGS_SSIMPLE_READ | 0, (dma_addr_t) -1); + + ddvprintk((MYIOC_s_INFO_FMT "RAID Volume action %x id %d\n", + hd->ioc->name, action, io->id)); + + hd->pLocal = NULL; + hd->timer.expires = jiffies + HZ*10; /* 10 second timeout */ + hd->scandv_wait_done = 0; + + /* Save cmd pointer, for resource free if timeout or + * FW reload occurs + */ + hd->cmdPtr = mf; + + add_timer(&hd->timer); + mpt_put_msg_frame(hd->ioc->InternalCtx, hd->ioc, mf); + wait_event(hd->scandv_waitq, hd->scandv_wait_done); + + if ((hd->pLocal == NULL) || (hd->pLocal->completion != MPT_SCANDV_GOOD)) + return -1; + + return 0; +} +#endif /* ~MPTSCSIH_ENABLE_DOMAIN_VALIDATION */ /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ /** @@ -3425,6 +3901,93 @@ mptscsih_do_cmd(MPT_SCSI_HOST *hd, INTERNAL_CMD *io) return rc; } +/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ +/** + * mptscsih_negotiate_to_asyn_narrow - Restore devices to default state + * @hd: Pointer to a SCSI HOST structure + * @vtarget: per device private data + * + * Uses the ISR, but with special processing. + * MUST be single-threaded. + * + */ +static void +mptscsih_negotiate_to_asyn_narrow(MPT_SCSI_HOST *hd, VirtDevice *vdevice) +{ + VirtTarget *vtarget = vdevice->vtarget; + MPT_ADAPTER *ioc= hd->ioc; + SCSIDevicePage1_t *pcfg1Data; + CONFIGPARMS cfg; + dma_addr_t cfg1_dma_addr; + ConfigPageHeader_t header; + int id; + int requested, configuration, data,i; + u8 flags, factor; + + if ((ioc->bus_type != SPI) || + (!vdevice->configured_lun)) + return; + + if (!ioc->spi_data.sdp1length) + return; + + pcfg1Data = (SCSIDevicePage1_t *)pci_alloc_consistent(ioc->pcidev, + ioc->spi_data.sdp1length * 4, &cfg1_dma_addr); + + if (pcfg1Data == NULL) + return; + + header.PageVersion = ioc->spi_data.sdp1version; + header.PageLength = ioc->spi_data.sdp1length; + header.PageNumber = 1; + header.PageType = MPI_CONFIG_PAGETYPE_SCSI_DEVICE; + cfg.cfghdr.hdr = &header; + cfg.physAddr = cfg1_dma_addr; + cfg.action = MPI_CONFIG_ACTION_PAGE_WRITE_CURRENT; + cfg.dir = 1; + cfg.timeout = 0; + + if (vtarget->raidVolume && ioc->raid_data.pIocPg3) { + for (i = 0; i < ioc->raid_data.pIocPg3->NumPhysDisks; i++) { + id = ioc->raid_data.pIocPg3->PhysDisk[i].PhysDiskID; + flags = hd->ioc->spi_data.noQas; + if (hd->ioc->spi_data.nvram && (hd->ioc->spi_data.nvram[id] != MPT_HOST_NVRAM_INVALID)) { + data = hd->ioc->spi_data.nvram[id]; + if (data & MPT_NVRAM_WIDE_DISABLE) + flags |= MPT_TARGET_NO_NEGO_WIDE; + factor = (data & MPT_NVRAM_SYNC_MASK) >> MPT_NVRAM_SYNC_SHIFT; + if ((factor == 0) || (factor == MPT_ASYNC)) + flags |= MPT_TARGET_NO_NEGO_SYNC; + } + mptscsih_setDevicePage1Flags(0, MPT_ASYNC, 0, &requested, + &configuration, flags); + dnegoprintk(("nego asyn narrow: id=%d width=0 factor=MPT_ASYNC " + "offset=0 negoFlags=%x request=%x config=%x\n", + id, flags, requested, configuration)); + pcfg1Data->RequestedParameters = cpu_to_le32(requested); + pcfg1Data->Reserved = 0; + pcfg1Data->Configuration = cpu_to_le32(configuration); + cfg.pageAddr = (vtarget->bus_id<<8) | id; + mpt_config(hd->ioc, &cfg); + } + } else { + flags = vtarget->negoFlags; + mptscsih_setDevicePage1Flags(0, MPT_ASYNC, 0, &requested, + &configuration, flags); + dnegoprintk(("nego asyn narrow: id=%d width=0 factor=MPT_ASYNC " + "offset=0 negoFlags=%x request=%x config=%x\n", + vtarget->target_id, flags, requested, configuration)); + pcfg1Data->RequestedParameters = cpu_to_le32(requested); + pcfg1Data->Reserved = 0; + pcfg1Data->Configuration = cpu_to_le32(configuration); + cfg.pageAddr = (vtarget->bus_id<<8) | vtarget->target_id; + mpt_config(hd->ioc, &cfg); + } + + if (pcfg1Data) + pci_free_consistent(ioc->pcidev, header.PageLength * 4, pcfg1Data, cfg1_dma_addr); +} + /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ /** * mptscsih_synchronize_cache - Send SYNCHRONIZE_CACHE to all disks. @@ -3451,15 +4014,1637 @@ mptscsih_synchronize_cache(MPT_SCSI_HOST *hd, VirtDevice *vdevice) iocmd.data_dma = -1; iocmd.size = 0; iocmd.rsvd = iocmd.rsvd2 = 0; - iocmd.bus = vdevice->vtarget->bus_id; - iocmd.id = vdevice->vtarget->target_id; + iocmd.bus = vdevice->bus_id; + iocmd.id = vdevice->target_id; iocmd.lun = (u8)vdevice->lun; - if ((vdevice->vtarget->type == TYPE_DISK) && + if ((vdevice->vtarget->type & TYPE_DISK) && (vdevice->configured_lun)) mptscsih_do_cmd(hd, &iocmd); } +/* Search IOC page 3 to determine if this is hidden physical disk + */ +static int +mptscsih_is_phys_disk(MPT_ADAPTER *ioc, int id) +{ + int i; + + if (!ioc->raid_data.isRaid || !ioc->raid_data.pIocPg3) + return 0; + + for (i = 0; i < ioc->raid_data.pIocPg3->NumPhysDisks; i++) { + if (id == ioc->raid_data.pIocPg3->PhysDisk[i].PhysDiskID) + return 1; + } + + return 0; +} + +#ifdef MPTSCSIH_ENABLE_DOMAIN_VALIDATION +/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ +/** + * mptscsih_domainValidation - Top level handler for domain validation. + * @hd: Pointer to MPT_SCSI_HOST structure. + * + * Uses the ISR, but with special processing. + * Called from schedule, should not be in interrupt mode. + * While thread alive, do dv for all devices needing dv + * + * Return: None. + */ +static void +mptscsih_domainValidation(void *arg) +{ + MPT_SCSI_HOST *hd; + MPT_ADAPTER *ioc; + unsigned long flags; + int id, maxid, dvStatus, did; + int ii, isPhysDisk; + + spin_lock_irqsave(&dvtaskQ_lock, flags); + dvtaskQ_active = 1; + if (dvtaskQ_release) { + dvtaskQ_active = 0; + spin_unlock_irqrestore(&dvtaskQ_lock, flags); + return; + } + spin_unlock_irqrestore(&dvtaskQ_lock, flags); + + /* For this ioc, loop through all devices and do dv to each device. + * When complete with this ioc, search through the ioc list, and + * for each scsi ioc found, do dv for all devices. Exit when no + * device needs dv. + */ + did = 1; + while (did) { + did = 0; + list_for_each_entry(ioc, &ioc_list, list) { + spin_lock_irqsave(&dvtaskQ_lock, flags); + if (dvtaskQ_release) { + dvtaskQ_active = 0; + spin_unlock_irqrestore(&dvtaskQ_lock, flags); + return; + } + spin_unlock_irqrestore(&dvtaskQ_lock, flags); + + msleep(250); + + /* DV only to SPI adapters */ + if (ioc->bus_type != SPI) + continue; + + /* Make sure everything looks ok */ + if (ioc->sh == NULL) + continue; + + hd = (MPT_SCSI_HOST *) ioc->sh->hostdata; + if (hd == NULL) + continue; + + if ((ioc->spi_data.forceDv & MPT_SCSICFG_RELOAD_IOC_PG3) != 0) { + mpt_read_ioc_pg_3(ioc); + if (ioc->raid_data.pIocPg3) { + Ioc3PhysDisk_t *pPDisk = ioc->raid_data.pIocPg3->PhysDisk; + int numPDisk = ioc->raid_data.pIocPg3->NumPhysDisks; + + while (numPDisk) { + if (ioc->spi_data.dvStatus[pPDisk->PhysDiskID] & MPT_SCSICFG_DV_NOT_DONE) + ioc->spi_data.dvStatus[pPDisk->PhysDiskID] |= MPT_SCSICFG_NEED_DV; + + pPDisk++; + numPDisk--; + } + } + ioc->spi_data.forceDv &= ~MPT_SCSICFG_RELOAD_IOC_PG3; + } + + maxid = min_t(int, ioc->sh->max_id, MPT_MAX_SCSI_DEVICES); + + for (id = 0; id < maxid; id++) { + spin_lock_irqsave(&dvtaskQ_lock, flags); + if (dvtaskQ_release) { + dvtaskQ_active = 0; + spin_unlock_irqrestore(&dvtaskQ_lock, flags); + return; + } + spin_unlock_irqrestore(&dvtaskQ_lock, flags); + dvStatus = hd->ioc->spi_data.dvStatus[id]; + + if (dvStatus & MPT_SCSICFG_NEED_DV) { + did++; + hd->ioc->spi_data.dvStatus[id] |= MPT_SCSICFG_DV_PENDING; + hd->ioc->spi_data.dvStatus[id] &= ~MPT_SCSICFG_NEED_DV; + + msleep(250); + + /* If hidden phys disk, block IO's to all + * raid volumes + * else, process normally + */ + isPhysDisk = mptscsih_is_phys_disk(ioc, id); + if (isPhysDisk) { + for (ii=0; ii < MPT_MAX_SCSI_DEVICES; ii++) { + if (hd->ioc->raid_data.isRaid & (1 << ii)) { + hd->ioc->spi_data.dvStatus[ii] |= MPT_SCSICFG_DV_PENDING; + } + } + } + + if(mpt_alt_ioc_wait(hd->ioc)!=0) { + ddvprintk((MYIOC_s_WARN_FMT "alt_ioc busy!\n", + hd->ioc->name)); + continue; + } + + if (mptscsih_doDv(hd, 0, id) == 1) { + /* Untagged device was busy, try again + */ + hd->ioc->spi_data.dvStatus[id] |= MPT_SCSICFG_NEED_DV; + hd->ioc->spi_data.dvStatus[id] &= ~MPT_SCSICFG_DV_PENDING; + } else { + /* DV is complete. Clear flags. + */ + hd->ioc->spi_data.dvStatus[id] &= ~(MPT_SCSICFG_DV_NOT_DONE | MPT_SCSICFG_DV_PENDING); + } + + spin_lock(&hd->ioc->initializing_hba_lock); + hd->ioc->initializing_hba_lock_flag=0; + spin_unlock(&hd->ioc->initializing_hba_lock); + + if (isPhysDisk) { + for (ii=0; ii < MPT_MAX_SCSI_DEVICES; ii++) { + if (hd->ioc->raid_data.isRaid & (1 << ii)) { + hd->ioc->spi_data.dvStatus[ii] &= ~MPT_SCSICFG_DV_PENDING; + } + } + } + + if (hd->ioc->spi_data.noQas) + mptscsih_qas_check(hd, id); + } + } + } + } + + spin_lock_irqsave(&dvtaskQ_lock, flags); + dvtaskQ_active = 0; + spin_unlock_irqrestore(&dvtaskQ_lock, flags); + + return; +} + +/* Write SDP1 if no QAS has been enabled + */ +static void +mptscsih_qas_check(MPT_SCSI_HOST *hd, int id) +{ + VirtTarget *vtarget; + int ii; + + if (hd->Targets == NULL) + return; + + for (ii=0; ii < MPT_MAX_SCSI_DEVICES; ii++) { + if (ii == id) + continue; + + if ((hd->ioc->spi_data.dvStatus[ii] & MPT_SCSICFG_DV_NOT_DONE) != 0) + continue; + + vtarget = hd->Targets[ii]; + + if ((vtarget != NULL) && (!vtarget->raidVolume)) { + if ((vtarget->negoFlags & hd->ioc->spi_data.noQas) == 0) { + vtarget->negoFlags |= hd->ioc->spi_data.noQas; + dnegoprintk(("writeSDP1: id=%d flags=0\n", id)); + mptscsih_writeSDP1(hd, 0, ii, 0); + } + } else { + if (mptscsih_is_phys_disk(hd->ioc, ii) == 1) { + dnegoprintk(("writeSDP1: id=%d SCSICFG_USE_NVRAM\n", id)); + mptscsih_writeSDP1(hd, 0, ii, MPT_SCSICFG_USE_NVRAM); + } + } + } + return; +} + + + +#define MPT_GET_NVRAM_VALS 0x01 +#define MPT_UPDATE_MAX 0x02 +#define MPT_SET_MAX 0x04 +#define MPT_SET_MIN 0x08 +#define MPT_FALLBACK 0x10 +#define MPT_SAVE 0x20 + +/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ +/** + * mptscsih_doDv - Perform domain validation to a target. + * @hd: Pointer to MPT_SCSI_HOST structure. + * @portnum: IOC port number. + * @target: Physical ID of this target + * + * Uses the ISR, but with special processing. + * MUST be single-threaded. + * Test will exit if target is at async & narrow. + * + * Return: None. + */ +static int +mptscsih_doDv(MPT_SCSI_HOST *hd, int bus_number, int id) +{ + MPT_ADAPTER *ioc = hd->ioc; + VirtTarget *vtarget; + SCSIDevicePage1_t *pcfg1Data; + SCSIDevicePage0_t *pcfg0Data; + u8 *pbuf1; + u8 *pbuf2; + u8 *pDvBuf; + dma_addr_t dvbuf_dma = -1; + dma_addr_t buf1_dma = -1; + dma_addr_t buf2_dma = -1; + dma_addr_t cfg1_dma_addr = -1; + dma_addr_t cfg0_dma_addr = -1; + ConfigPageHeader_t header1; + ConfigPageHeader_t header0; + DVPARAMETERS dv; + INTERNAL_CMD iocmd; + CONFIGPARMS cfg; + int dv_alloc = 0; + int rc, sz = 0; + int bufsize = 0; + int dataBufSize = 0; + int echoBufSize = 0; + int notDone; + int patt; + int repeat; + int retcode = 0; + int nfactor = MPT_ULTRA320; + char firstPass = 1; + char doFallback = 0; + char readPage0; + char bus, lun; + char inq0 = 0; + + if (ioc->spi_data.sdp1length == 0) + return 0; + + if (ioc->spi_data.sdp0length == 0) + return 0; + + /* If multiple buses are used, require that the initiator + * id be the same on all buses. + */ + if (id == ioc->pfacts[0].PortSCSIID) + return 0; + + lun = 0; + bus = (u8) bus_number; + ddvtprintk((MYIOC_s_NOTE_FMT + "DV started: bus=%d, id=%d dv @ %p\n", + ioc->name, bus, id, &dv)); + + /* Prep DV structure + */ + memset (&dv, 0, sizeof(DVPARAMETERS)); + dv.id = id; + + /* Populate tmax with the current maximum + * transfer parameters for this target. + * Exit if narrow and async. + */ + dv.cmd = MPT_GET_NVRAM_VALS; + mptscsih_dv_parms(hd, &dv, NULL); + + /* Prep SCSI IO structure + */ + iocmd.id = id; + iocmd.bus = bus; + iocmd.lun = lun; + iocmd.flags = 0; + iocmd.physDiskNum = -1; + iocmd.rsvd = iocmd.rsvd2 = 0; + + vtarget = hd->Targets[id]; + + /* Use tagged commands if possible. + */ + if (vtarget) { + if (vtarget->tflags & MPT_TARGET_FLAGS_Q_YES) + iocmd.flags |= MPT_ICFLAG_TAGGED_CMD; + else { + if (hd->ioc->facts.FWVersion.Word < 0x01000600) + return 0; + + if ((hd->ioc->facts.FWVersion.Word >= 0x01010000) && + (hd->ioc->facts.FWVersion.Word < 0x01010B00)) + return 0; + } + } + + /* Prep cfg structure + */ + cfg.pageAddr = (bus<<8) | id; + cfg.cfghdr.hdr = NULL; + + /* Prep SDP0 header + */ + header0.PageVersion = ioc->spi_data.sdp0version; + header0.PageLength = ioc->spi_data.sdp0length; + header0.PageNumber = 0; + header0.PageType = MPI_CONFIG_PAGETYPE_SCSI_DEVICE; + + /* Prep SDP1 header + */ + header1.PageVersion = ioc->spi_data.sdp1version; + header1.PageLength = ioc->spi_data.sdp1length; + header1.PageNumber = 1; + header1.PageType = MPI_CONFIG_PAGETYPE_SCSI_DEVICE; + + if (header0.PageLength & 1) + dv_alloc = (header0.PageLength * 4) + 4; + + dv_alloc += (2048 + (header1.PageLength * 4)); + + pDvBuf = pci_alloc_consistent(ioc->pcidev, dv_alloc, &dvbuf_dma); + if (pDvBuf == NULL) + return 0; + + sz = 0; + pbuf1 = (u8 *)pDvBuf; + buf1_dma = dvbuf_dma; + sz +=1024; + + pbuf2 = (u8 *) (pDvBuf + sz); + buf2_dma = dvbuf_dma + sz; + sz +=1024; + + pcfg0Data = (SCSIDevicePage0_t *) (pDvBuf + sz); + cfg0_dma_addr = dvbuf_dma + sz; + sz += header0.PageLength * 4; + + /* 8-byte alignment + */ + if (header0.PageLength & 1) + sz += 4; + + pcfg1Data = (SCSIDevicePage1_t *) (pDvBuf + sz); + cfg1_dma_addr = dvbuf_dma + sz; + + /* Skip this ID? Set cfg.cfghdr.hdr to force config page write + */ + { + SpiCfgData *pspi_data = &hd->ioc->spi_data; + if (pspi_data->nvram && (pspi_data->nvram[id] != MPT_HOST_NVRAM_INVALID)) { + /* Set the factor from nvram */ + nfactor = (pspi_data->nvram[id] & MPT_NVRAM_SYNC_MASK) >> 8; + if (nfactor < pspi_data->minSyncFactor ) + nfactor = pspi_data->minSyncFactor; + + if (!(pspi_data->nvram[id] & MPT_NVRAM_ID_SCAN_ENABLE) || + (pspi_data->PortFlags == MPI_SCSIPORTPAGE2_PORT_FLAGS_OFF_DV) ) { + + ddvprintk((MYIOC_s_NOTE_FMT "DV Skipped: bus, id, lun (%d, %d, %d)\n", + ioc->name, bus, id, lun)); + + dv.cmd = MPT_SET_MAX; + mptscsih_dv_parms(hd, &dv, (void *)pcfg1Data); + cfg.cfghdr.hdr = &header1; + + /* Save the final negotiated settings to + * SCSI device page 1. + */ + cfg.physAddr = cfg1_dma_addr; + cfg.action = MPI_CONFIG_ACTION_PAGE_WRITE_CURRENT; + cfg.dir = 1; + mpt_config(hd->ioc, &cfg); + goto target_done; + } + } + } + + /* Finish iocmd inititialization - hidden or visible disk? */ + if (ioc->raid_data.pIocPg3) { + /* Search IOC page 3 for matching id + */ + Ioc3PhysDisk_t *pPDisk = ioc->raid_data.pIocPg3->PhysDisk; + int numPDisk = ioc->raid_data.pIocPg3->NumPhysDisks; + + while (numPDisk) { + if (pPDisk->PhysDiskID == id) { + /* match */ + iocmd.flags |= MPT_ICFLAG_PHYS_DISK; + iocmd.physDiskNum = pPDisk->PhysDiskNum; + + /* Quiesce the IM + */ + if (mptscsih_do_raid(hd, MPI_RAID_ACTION_QUIESCE_PHYS_IO, &iocmd) < 0) { + ddvprintk((MYIOC_s_ERR_FMT "RAID Queisce FAILED!\n", ioc->name)); + goto target_done; + } + break; + } + pPDisk++; + numPDisk--; + } + } + + /* RAID Volume ID's may double for a physical device. If RAID but + * not a physical ID as well, skip DV. + */ + if ((hd->ioc->raid_data.isRaid & (1 << id)) && !(iocmd.flags & MPT_ICFLAG_PHYS_DISK)) + goto target_done; + + + /* Basic Test. + * Async & Narrow - Inquiry + * Async & Narrow - Inquiry + * Maximum transfer rate - Inquiry + * Compare buffers: + * If compare, test complete. + * If miscompare and first pass, repeat + * If miscompare and not first pass, fall back and repeat + */ + hd->pLocal = NULL; + readPage0 = 0; + sz = SCSI_MAX_INQUIRY_BYTES; + rc = MPT_SCANDV_GOOD; + while (1) { + ddvprintk((MYIOC_s_NOTE_FMT "DV: Start Basic test on id=%d\n", ioc->name, id)); + retcode = 0; + dv.cmd = MPT_SET_MIN; + mptscsih_dv_parms(hd, &dv, (void *)pcfg1Data); + + cfg.cfghdr.hdr = &header1; + cfg.physAddr = cfg1_dma_addr; + cfg.action = MPI_CONFIG_ACTION_PAGE_WRITE_CURRENT; + cfg.dir = 1; + if (mpt_config(hd->ioc, &cfg) != 0) + goto target_done; + + /* Wide - narrow - wide workaround case + */ + if ((rc == MPT_SCANDV_ISSUE_SENSE) && dv.max.width) { + /* Send an untagged command to reset disk Qs corrupted + * when a parity error occurs on a Request Sense. + */ + if ((hd->ioc->facts.FWVersion.Word >= 0x01000600) || + ((hd->ioc->facts.FWVersion.Word >= 0x01010000) && + (hd->ioc->facts.FWVersion.Word < 0x01010B00)) ) { + + iocmd.cmd = REQUEST_SENSE; + iocmd.data_dma = buf1_dma; + iocmd.data = pbuf1; + iocmd.size = 0x12; + if (mptscsih_do_cmd(hd, &iocmd) < 0) + goto target_done; + else { + if (hd->pLocal == NULL) + goto target_done; + rc = hd->pLocal->completion; + if ((rc == MPT_SCANDV_GOOD) || (rc == MPT_SCANDV_SENSE)) { + dv.max.width = 0; + doFallback = 0; + } else + goto target_done; + } + } else + goto target_done; + } + + iocmd.cmd = INQUIRY; + iocmd.data_dma = buf1_dma; + iocmd.data = pbuf1; + iocmd.size = sz; + memset(pbuf1, 0x00, sz); + if (mptscsih_do_cmd(hd, &iocmd) < 0) + goto target_done; + else { + if (hd->pLocal == NULL) + goto target_done; + rc = hd->pLocal->completion; + if (rc == MPT_SCANDV_GOOD) { + if (hd->pLocal->scsiStatus == SAM_STAT_BUSY) { + if ((iocmd.flags & MPT_ICFLAG_TAGGED_CMD) == 0) + retcode = 1; + else + retcode = 0; + + goto target_done; + } + } else if (rc == MPT_SCANDV_SENSE) { + ; + } else { + /* If first command doesn't complete + * with a good status or with a check condition, + * exit. + */ + goto target_done; + } + } + + /* Reset the size for disks + */ + inq0 = (*pbuf1) & 0x1F; + if ((inq0 == 0) && vtarget && !vtarget->raidVolume) { + sz = 0x40; + iocmd.size = sz; + } + + /* Another GEM workaround. Check peripheral device type, + * if PROCESSOR, quit DV. + */ + if (inq0 == TYPE_PROCESSOR) { + mptscsih_initTarget(hd, + vtarget, + lun, + pbuf1, + sz); + goto target_done; + } + + if (inq0 > 0x08) + goto target_done; + + if (mptscsih_do_cmd(hd, &iocmd) < 0) + goto target_done; + + if (sz == 0x40) { + if ((vtarget->maxWidth == 1) && (vtarget->maxOffset) && (nfactor < 0x0A) + && (vtarget->minSyncFactor > 0x09)) { + if ((pbuf1[56] & 0x04) == 0) + ; + else if ((pbuf1[56] & 0x01) == 1) { + vtarget->minSyncFactor = + nfactor > MPT_ULTRA320 ? nfactor : MPT_ULTRA320; + } else { + vtarget->minSyncFactor = + nfactor > MPT_ULTRA160 ? nfactor : MPT_ULTRA160; + } + + dv.max.factor = vtarget->minSyncFactor; + + if ((pbuf1[56] & 0x02) == 0) { + vtarget->negoFlags |= MPT_TARGET_NO_NEGO_QAS; + hd->ioc->spi_data.noQas = MPT_TARGET_NO_NEGO_QAS; + ddvprintk((MYIOC_s_NOTE_FMT + "DV: Start Basic noQas on id=%d due to pbuf1[56]=%x\n", + ioc->name, id, pbuf1[56])); + } + } + } + + if (doFallback) + dv.cmd = MPT_FALLBACK; + else + dv.cmd = MPT_SET_MAX; + + mptscsih_dv_parms(hd, &dv, (void *)pcfg1Data); + if (mpt_config(hd->ioc, &cfg) != 0) + goto target_done; + + if ((!dv.now.width) && (!dv.now.offset)) + goto target_done; + + iocmd.cmd = INQUIRY; + iocmd.data_dma = buf2_dma; + iocmd.data = pbuf2; + iocmd.size = sz; + memset(pbuf2, 0x00, sz); + if (mptscsih_do_cmd(hd, &iocmd) < 0) + goto target_done; + else if (hd->pLocal == NULL) + goto target_done; + else { + /* Save the return code. + * If this is the first pass, + * read SCSI Device Page 0 + * and update the target max parameters. + */ + rc = hd->pLocal->completion; + doFallback = 0; + if (rc == MPT_SCANDV_GOOD) { + if (!readPage0) { + u32 sdp0_info; + u32 sdp0_nego; + + cfg.cfghdr.hdr = &header0; + cfg.physAddr = cfg0_dma_addr; + cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT; + cfg.dir = 0; + + if (mpt_config(hd->ioc, &cfg) != 0) + goto target_done; + + sdp0_info = le32_to_cpu(pcfg0Data->Information) & 0x0E; + sdp0_nego = (le32_to_cpu(pcfg0Data->NegotiatedParameters) & 0xFF00 ) >> 8; + + /* Quantum and Fujitsu workarounds. + * Quantum: PPR U320 -> PPR reply with Ultra2 and wide + * Fujitsu: PPR U320 -> Msg Reject and Ultra2 and wide + * Resetart with a request for U160. + */ + if ((dv.now.factor == MPT_ULTRA320) && (sdp0_nego == MPT_ULTRA2)) { + doFallback = 1; + } else { + dv.cmd = MPT_UPDATE_MAX; + mptscsih_dv_parms(hd, &dv, (void *)pcfg0Data); + /* Update the SCSI device page 1 area + */ + pcfg1Data->RequestedParameters = pcfg0Data->NegotiatedParameters; + readPage0 = 1; + } + } + + /* Quantum workaround. Restart this test will the fallback + * flag set. + */ + if (doFallback == 0) { + if (memcmp(pbuf1, pbuf2, sz) != 0) { + if (!firstPass) + doFallback = 1; + } else { + ddvprintk((MYIOC_s_NOTE_FMT + "DV:Inquiry compared id=%d, calling initTarget\n", ioc->name, id)); + hd->ioc->spi_data.dvStatus[id] &= ~MPT_SCSICFG_DV_NOT_DONE; + mptscsih_initTarget(hd, + vtarget, + lun, + pbuf1, + sz); + break; /* test complete */ + } + } + + + } else if (rc == MPT_SCANDV_ISSUE_SENSE) + doFallback = 1; /* set fallback flag */ + else if ((rc == MPT_SCANDV_DID_RESET) || + (rc == MPT_SCANDV_SENSE) || + (rc == MPT_SCANDV_FALLBACK)) + doFallback = 1; /* set fallback flag */ + else + goto target_done; + + firstPass = 0; + } + } + ddvprintk((MYIOC_s_NOTE_FMT "DV: Basic test on id=%d completed OK.\n", ioc->name, id)); + + if (ioc->spi_data.mpt_dv == 0) + goto target_done; + + inq0 = (*pbuf1) & 0x1F; + + /* Continue only for disks + */ + if (inq0 != 0) + goto target_done; + + if ( ioc->spi_data.PortFlags == MPI_SCSIPORTPAGE2_PORT_FLAGS_BASIC_DV_ONLY ) + goto target_done; + + /* Start the Enhanced Test. + * 0) issue TUR to clear out check conditions + * 1) read capacity of echo (regular) buffer + * 2) reserve device + * 3) do write-read-compare data pattern test + * 4) release + * 5) update nego parms to target struct + */ + cfg.cfghdr.hdr = &header1; + cfg.physAddr = cfg1_dma_addr; + cfg.action = MPI_CONFIG_ACTION_PAGE_WRITE_CURRENT; + cfg.dir = 1; + + iocmd.cmd = TEST_UNIT_READY; + iocmd.data_dma = -1; + iocmd.data = NULL; + iocmd.size = 0; + notDone = 1; + while (notDone) { + if (mptscsih_do_cmd(hd, &iocmd) < 0) + goto target_done; + + if (hd->pLocal == NULL) + goto target_done; + + rc = hd->pLocal->completion; + if (rc == MPT_SCANDV_GOOD) + notDone = 0; + else if (rc == MPT_SCANDV_SENSE) { + u8 skey = hd->pLocal->sense[2] & 0x0F; + u8 asc = hd->pLocal->sense[12]; + u8 ascq = hd->pLocal->sense[13]; + ddvprintk((MYIOC_s_INFO_FMT + "SenseKey:ASC:ASCQ = (%x:%02x:%02x)\n", + ioc->name, skey, asc, ascq)); + + if (skey == UNIT_ATTENTION) + notDone++; /* repeat */ + else if ((skey == NOT_READY) && + (asc == 0x04)&&(ascq == 0x01)) { + /* wait then repeat */ + mdelay (2000); + notDone++; + } else if ((skey == NOT_READY) && (asc == 0x3A)) { + /* no medium, try read test anyway */ + notDone = 0; + } else { + /* All other errors are fatal. + */ + ddvprintk((MYIOC_s_INFO_FMT "DV: fatal error.", + ioc->name)); + goto target_done; + } + } else + goto target_done; + } + + iocmd.cmd = READ_BUFFER; + iocmd.data_dma = buf1_dma; + iocmd.data = pbuf1; + iocmd.size = 4; + iocmd.flags |= MPT_ICFLAG_BUF_CAP; + + dataBufSize = 0; + echoBufSize = 0; + for (patt = 0; patt < 2; patt++) { + if (patt == 0) + iocmd.flags |= MPT_ICFLAG_ECHO; + else + iocmd.flags &= ~MPT_ICFLAG_ECHO; + + notDone = 1; + while (notDone) { + bufsize = 0; + + /* If not ready after 8 trials, + * give up on this device. + */ + if (notDone > 8) + goto target_done; + + if (mptscsih_do_cmd(hd, &iocmd) < 0) + goto target_done; + else if (hd->pLocal == NULL) + goto target_done; + else { + rc = hd->pLocal->completion; + ddvprintk(("ReadBuffer Comp Code %d", rc)); + ddvprintk((" buff: %0x %0x %0x %0x\n", + pbuf1[0], pbuf1[1], pbuf1[2], pbuf1[3])); + + if (rc == MPT_SCANDV_GOOD) { + notDone = 0; + if (iocmd.flags & MPT_ICFLAG_ECHO) { + bufsize = ((pbuf1[2] & 0x1F) <<8) | pbuf1[3]; + if (pbuf1[0] & 0x01) + iocmd.flags |= MPT_ICFLAG_EBOS; + } else { + bufsize = pbuf1[1]<<16 | pbuf1[2]<<8 | pbuf1[3]; + } + } else if (rc == MPT_SCANDV_SENSE) { + u8 skey = hd->pLocal->sense[2] & 0x0F; + u8 asc = hd->pLocal->sense[12]; + u8 ascq = hd->pLocal->sense[13]; + ddvprintk((MYIOC_s_INFO_FMT + "SenseKey:ASC:ASCQ = (%x:%02x:%02x)\n", + ioc->name, skey, asc, ascq)); + if (skey == ILLEGAL_REQUEST) { + notDone = 0; + } else if (skey == UNIT_ATTENTION) { + notDone++; /* repeat */ + } else if ((skey == NOT_READY) && + (asc == 0x04)&&(ascq == 0x01)) { + /* wait then repeat */ + mdelay (2000); + notDone++; + } else { + /* All other errors are fatal. + */ + ddvprintk((MYIOC_s_INFO_FMT "DV: fatal error.", + ioc->name)); + goto target_done; + } + } else { + /* All other errors are fatal + */ + goto target_done; + } + } + } + + if (iocmd.flags & MPT_ICFLAG_ECHO) + echoBufSize = bufsize; + else + dataBufSize = bufsize; + } + sz = 0; + iocmd.flags &= ~MPT_ICFLAG_BUF_CAP; + + /* Use echo buffers if possible, + * Exit if both buffers are 0. + */ + if (echoBufSize > 0) { + iocmd.flags |= MPT_ICFLAG_ECHO; + if (dataBufSize > 0) + bufsize = min(echoBufSize, dataBufSize); + else + bufsize = echoBufSize; + } else if (dataBufSize == 0) + goto target_done; + + ddvprintk((MYIOC_s_INFO_FMT "%s Buffer Capacity %d\n", ioc->name, + (iocmd.flags & MPT_ICFLAG_ECHO) ? "Echo" : " ", bufsize)); + + /* Data buffers for write-read-compare test max 1K. + */ + sz = min(bufsize, 1024); + + /* --- loop ---- + * On first pass, always issue a reserve. + * On additional loops, only if a reset has occurred. + * iocmd.flags indicates if echo or regular buffer + */ + for (patt = 0; patt < 4; patt++) { + ddvprintk(("Pattern %d\n", patt)); + if ((iocmd.flags & MPT_ICFLAG_RESERVED) && (iocmd.flags & MPT_ICFLAG_DID_RESET)) { + iocmd.cmd = TEST_UNIT_READY; + iocmd.data_dma = -1; + iocmd.data = NULL; + iocmd.size = 0; + if (mptscsih_do_cmd(hd, &iocmd) < 0) + goto target_done; + + iocmd.cmd = RELEASE; + iocmd.data_dma = -1; + iocmd.data = NULL; + iocmd.size = 0; + if (mptscsih_do_cmd(hd, &iocmd) < 0) + goto target_done; + else if (hd->pLocal == NULL) + goto target_done; + else { + rc = hd->pLocal->completion; + ddvprintk(("Release rc %d\n", rc)); + if (rc == MPT_SCANDV_GOOD) + iocmd.flags &= ~MPT_ICFLAG_RESERVED; + else + goto target_done; + } + iocmd.flags &= ~MPT_ICFLAG_RESERVED; + } + iocmd.flags &= ~MPT_ICFLAG_DID_RESET; + + if (iocmd.flags & MPT_ICFLAG_EBOS) + goto skip_Reserve; + + repeat = 5; + while (repeat && (!(iocmd.flags & MPT_ICFLAG_RESERVED))) { + iocmd.cmd = RESERVE; + iocmd.data_dma = -1; + iocmd.data = NULL; + iocmd.size = 0; + if (mptscsih_do_cmd(hd, &iocmd) < 0) + goto target_done; + else if (hd->pLocal == NULL) + goto target_done; + else { + rc = hd->pLocal->completion; + if (rc == MPT_SCANDV_GOOD) { + iocmd.flags |= MPT_ICFLAG_RESERVED; + } else if (rc == MPT_SCANDV_SENSE) { + /* Wait if coming ready + */ + u8 skey = hd->pLocal->sense[2] & 0x0F; + u8 asc = hd->pLocal->sense[12]; + u8 ascq = hd->pLocal->sense[13]; + ddvprintk((MYIOC_s_INFO_FMT + "DV: Reserve Failed: ", ioc->name)); + ddvprintk(("SenseKey:ASC:ASCQ = (%x:%02x:%02x)\n", + skey, asc, ascq)); + + if ((skey == NOT_READY) && (asc == 0x04)&& + (ascq == 0x01)) { + /* wait then repeat */ + mdelay (2000); + notDone++; + } else { + ddvprintk((MYIOC_s_INFO_FMT + "DV: Reserved Failed.", ioc->name)); + goto target_done; + } + } else { + ddvprintk((MYIOC_s_INFO_FMT "DV: Reserved Failed.", + ioc->name)); + goto target_done; + } + } + } + +skip_Reserve: + mptscsih_fillbuf(pbuf1, sz, patt, 1); + iocmd.cmd = WRITE_BUFFER; + iocmd.data_dma = buf1_dma; + iocmd.data = pbuf1; + iocmd.size = sz; + if (mptscsih_do_cmd(hd, &iocmd) < 0) + goto target_done; + else if (hd->pLocal == NULL) + goto target_done; + else { + rc = hd->pLocal->completion; + if (rc == MPT_SCANDV_GOOD) + ; /* Issue read buffer */ + else if (rc == MPT_SCANDV_DID_RESET) { + /* If using echo buffers, reset to data buffers. + * Else do Fallback and restart + * this test (re-issue reserve + * because of bus reset). + */ + if ((iocmd.flags & MPT_ICFLAG_ECHO) && (dataBufSize >= bufsize)) { + iocmd.flags &= ~MPT_ICFLAG_ECHO; + } else { + dv.cmd = MPT_FALLBACK; + mptscsih_dv_parms(hd, &dv, (void *)pcfg1Data); + + if (mpt_config(hd->ioc, &cfg) != 0) + goto target_done; + + if ((!dv.now.width) && (!dv.now.offset)) + goto target_done; + } + + iocmd.flags |= MPT_ICFLAG_DID_RESET; + patt = -1; + continue; + } else if (rc == MPT_SCANDV_SENSE) { + /* Restart data test if UA, else quit. + */ + u8 skey = hd->pLocal->sense[2] & 0x0F; + ddvprintk((MYIOC_s_INFO_FMT + "SenseKey:ASC:ASCQ = (%x:%02x:%02x)\n", ioc->name, skey, + hd->pLocal->sense[12], hd->pLocal->sense[13])); + if (skey == UNIT_ATTENTION) { + patt = -1; + continue; + } else if (skey == ILLEGAL_REQUEST) { + if (iocmd.flags & MPT_ICFLAG_ECHO) { + if (dataBufSize >= bufsize) { + iocmd.flags &= ~MPT_ICFLAG_ECHO; + patt = -1; + continue; + } + } + goto target_done; + } + else + goto target_done; + } else { + /* fatal error */ + goto target_done; + } + } + + iocmd.cmd = READ_BUFFER; + iocmd.data_dma = buf2_dma; + iocmd.data = pbuf2; + iocmd.size = sz; + if (mptscsih_do_cmd(hd, &iocmd) < 0) + goto target_done; + else if (hd->pLocal == NULL) + goto target_done; + else { + rc = hd->pLocal->completion; + if (rc == MPT_SCANDV_GOOD) { + /* If buffers compare, + * go to next pattern, + * else, do a fallback and restart + * data transfer test. + */ + if (memcmp (pbuf1, pbuf2, sz) == 0) { + ; /* goto next pattern */ + } else { + /* Miscompare with Echo buffer, go to data buffer, + * if that buffer exists. + * Miscompare with Data buffer, check first 4 bytes, + * some devices return capacity. Exit in this case. + */ + if (iocmd.flags & MPT_ICFLAG_ECHO) { + if (dataBufSize >= bufsize) + iocmd.flags &= ~MPT_ICFLAG_ECHO; + else + goto target_done; + } else { + if (dataBufSize == (pbuf2[1]<<16 | pbuf2[2]<<8 | pbuf2[3])) { + /* Argh. Device returning wrong data. + * Quit DV for this device. + */ + goto target_done; + } + + /* Had an actual miscompare. Slow down.*/ + dv.cmd = MPT_FALLBACK; + mptscsih_dv_parms(hd, &dv, (void *)pcfg1Data); + + if (mpt_config(hd->ioc, &cfg) != 0) + goto target_done; + + if ((!dv.now.width) && (!dv.now.offset)) + goto target_done; + } + + patt = -1; + continue; + } + } else if (rc == MPT_SCANDV_DID_RESET) { + /* Do Fallback and restart + * this test (re-issue reserve + * because of bus reset). + */ + dv.cmd = MPT_FALLBACK; + mptscsih_dv_parms(hd, &dv, (void *)pcfg1Data); + + if (mpt_config(hd->ioc, &cfg) != 0) + goto target_done; + + if ((!dv.now.width) && (!dv.now.offset)) + goto target_done; + + iocmd.flags |= MPT_ICFLAG_DID_RESET; + patt = -1; + continue; + } else if (rc == MPT_SCANDV_SENSE) { + /* Restart data test if UA, else quit. + */ + u8 skey = hd->pLocal->sense[2] & 0x0F; + ddvprintk((MYIOC_s_INFO_FMT + "SenseKey:ASC:ASCQ = (%x:%02x:%02x)\n", ioc->name, skey, + hd->pLocal->sense[12], hd->pLocal->sense[13])); + if (skey == UNIT_ATTENTION) { + patt = -1; + continue; + } + else + goto target_done; + } else { + /* fatal error */ + goto target_done; + } + } + + } /* --- end of patt loop ---- */ + +target_done: + if (iocmd.flags & MPT_ICFLAG_RESERVED) { + iocmd.cmd = RELEASE; + iocmd.data_dma = -1; + iocmd.data = NULL; + iocmd.size = 0; + if (mptscsih_do_cmd(hd, &iocmd) < 0) + printk(MYIOC_s_INFO_FMT "DV: Release failed. id %d", + ioc->name, id); + else if (hd->pLocal) { + if (hd->pLocal->completion == MPT_SCANDV_GOOD) + iocmd.flags &= ~MPT_ICFLAG_RESERVED; + } else { + printk(MYIOC_s_INFO_FMT "DV: Release failed. id %d", + ioc->name, id); + } + } + + + /* Set if cfg1_dma_addr contents is valid + */ + if ((cfg.cfghdr.hdr != NULL) && (retcode == 0)){ + /* If disk, not U320, disable QAS + */ + if ((inq0 == 0) && (dv.now.factor > MPT_ULTRA320)) { + hd->ioc->spi_data.noQas = MPT_TARGET_NO_NEGO_QAS; + ddvprintk((MYIOC_s_NOTE_FMT + "noQas set due to id=%d has factor=%x\n", ioc->name, id, dv.now.factor)); + } + + dv.cmd = MPT_SAVE; + mptscsih_dv_parms(hd, &dv, (void *)pcfg1Data); + + /* Double writes to SDP1 can cause problems, + * skip save of the final negotiated settings to + * SCSI device page 1. + * + cfg.cfghdr.hdr = &header1; + cfg.physAddr = cfg1_dma_addr; + cfg.action = MPI_CONFIG_ACTION_PAGE_WRITE_CURRENT; + cfg.dir = 1; + mpt_config(hd->ioc, &cfg); + */ + } + + /* If this is a RAID Passthrough, enable internal IOs + */ + if (iocmd.flags & MPT_ICFLAG_PHYS_DISK) { + if (mptscsih_do_raid(hd, MPI_RAID_ACTION_ENABLE_PHYS_IO, &iocmd) < 0) + ddvprintk((MYIOC_s_ERR_FMT "RAID Enable FAILED!\n", ioc->name)); + } + + /* Done with the DV scan of the current target + */ + if (pDvBuf) + pci_free_consistent(ioc->pcidev, dv_alloc, pDvBuf, dvbuf_dma); + + ddvtprintk((MYIOC_s_INFO_FMT "DV Done id=%d\n", + ioc->name, id)); + + return retcode; +} + +/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ +/* mptscsih_dv_parms - perform a variety of operations on the + * parameters used for negotiation. + * @hd: Pointer to a SCSI host. + * @dv: Pointer to a structure that contains the maximum and current + * negotiated parameters. + */ +static void +mptscsih_dv_parms(MPT_SCSI_HOST *hd, DVPARAMETERS *dv,void *pPage) +{ + VirtTarget *vtarget; + SCSIDevicePage0_t *pPage0; + SCSIDevicePage1_t *pPage1; + int val = 0, data, configuration; + u8 width = 0; + u8 offset = 0; + u8 factor = 0; + u8 negoFlags = 0; + u8 cmd = dv->cmd; + u8 id = dv->id; + + switch (cmd) { + case MPT_GET_NVRAM_VALS: + ddvprintk((MYIOC_s_NOTE_FMT "Getting NVRAM: ", + hd->ioc->name)); + /* Get the NVRAM values and save in tmax + * If not an LVD bus, the adapter minSyncFactor has been + * already throttled back. + */ + negoFlags = hd->ioc->spi_data.noQas; + if ((hd->Targets)&&((vtarget = hd->Targets[(int)id]) != NULL) && !vtarget->raidVolume) { + width = vtarget->maxWidth; + offset = vtarget->maxOffset; + factor = vtarget->minSyncFactor; + negoFlags |= vtarget->negoFlags; + } else { + if (hd->ioc->spi_data.nvram && (hd->ioc->spi_data.nvram[id] != MPT_HOST_NVRAM_INVALID)) { + data = hd->ioc->spi_data.nvram[id]; + width = data & MPT_NVRAM_WIDE_DISABLE ? 0 : 1; + if ((offset = hd->ioc->spi_data.maxSyncOffset) == 0) + factor = MPT_ASYNC; + else { + factor = (data & MPT_NVRAM_SYNC_MASK) >> MPT_NVRAM_SYNC_SHIFT; + if ((factor == 0) || (factor == MPT_ASYNC)){ + factor = MPT_ASYNC; + offset = 0; + } + } + } else { + width = MPT_NARROW; + offset = 0; + factor = MPT_ASYNC; + } + + /* Set the negotiation flags */ + if (!width) + negoFlags |= MPT_TARGET_NO_NEGO_WIDE; + + if (!offset) + negoFlags |= MPT_TARGET_NO_NEGO_SYNC; + } + + /* limit by adapter capabilities */ + width = min(width, hd->ioc->spi_data.maxBusWidth); + offset = min(offset, hd->ioc->spi_data.maxSyncOffset); + factor = max(factor, hd->ioc->spi_data.minSyncFactor); + + /* Check Consistency */ + if (offset && (factor < MPT_ULTRA2) && !width) + factor = MPT_ULTRA2; + + dv->max.width = width; + dv->max.offset = offset; + dv->max.factor = factor; + dv->max.flags = negoFlags; + ddvprintk((" id=%d width=%d factor=%x offset=%x flags=%x\n", + id, width, factor, offset, negoFlags)); + break; + + case MPT_UPDATE_MAX: + ddvprintk((MYIOC_s_NOTE_FMT + "Updating with SDP0 Data: ", hd->ioc->name)); + /* Update tmax values with those from Device Page 0.*/ + pPage0 = (SCSIDevicePage0_t *) pPage; + if (pPage0) { + val = le32_to_cpu(pPage0->NegotiatedParameters); + dv->max.width = val & MPI_SCSIDEVPAGE0_NP_WIDE ? 1 : 0; + dv->max.offset = (val&MPI_SCSIDEVPAGE0_NP_NEG_SYNC_OFFSET_MASK) >> 16; + dv->max.factor = (val&MPI_SCSIDEVPAGE0_NP_NEG_SYNC_PERIOD_MASK) >> 8; + } + + dv->now.width = dv->max.width; + dv->now.offset = dv->max.offset; + dv->now.factor = dv->max.factor; + ddvprintk(("id=%d width=%d factor=%x offset=%x flags=%x\n", + id, dv->now.width, dv->now.factor, dv->now.offset, dv->now.flags)); + break; + + case MPT_SET_MAX: + ddvprintk((MYIOC_s_NOTE_FMT "Setting Max: ", + hd->ioc->name)); + /* Set current to the max values. Update the config page.*/ + dv->now.width = dv->max.width; + dv->now.offset = dv->max.offset; + dv->now.factor = dv->max.factor; + dv->now.flags = dv->max.flags; + + pPage1 = (SCSIDevicePage1_t *)pPage; + if (pPage1) { + mptscsih_setDevicePage1Flags (dv->now.width, dv->now.factor, + dv->now.offset, &val, &configuration, dv->now.flags); + dnegoprintk(("Setting Max: id=%d width=%d factor=%x offset=%x negoFlags=%x request=%x config=%x\n", + id, dv->now.width, dv->now.factor, dv->now.offset, dv->now.flags, val, configuration)); + pPage1->RequestedParameters = cpu_to_le32(val); + pPage1->Reserved = 0; + pPage1->Configuration = cpu_to_le32(configuration); + } + + ddvprintk(("id=%d width=%d factor=%x offset=%x negoFlags=%x request=%x configuration=%x\n", + id, dv->now.width, dv->now.factor, dv->now.offset, dv->now.flags, val, configuration)); + break; + + case MPT_SET_MIN: + ddvprintk((MYIOC_s_NOTE_FMT "Setting Min: ", + hd->ioc->name)); + /* Set page to asynchronous and narrow + * Do not update now, breaks fallback routine. */ + width = MPT_NARROW; + offset = 0; + factor = MPT_ASYNC; + negoFlags = dv->max.flags; + + pPage1 = (SCSIDevicePage1_t *)pPage; + if (pPage1) { + mptscsih_setDevicePage1Flags (width, factor, + offset, &val, &configuration, negoFlags); + dnegoprintk(("Setting Min: id=%d width=%d factor=%x offset=%x negoFlags=%x request=%x config=%x\n", + id, width, factor, offset, negoFlags, val, configuration)); + pPage1->RequestedParameters = cpu_to_le32(val); + pPage1->Reserved = 0; + pPage1->Configuration = cpu_to_le32(configuration); + } + ddvprintk(("id=%d width=%d factor=%x offset=%x request=%x config=%x negoFlags=%x\n", + id, width, factor, offset, val, configuration, negoFlags)); + break; + + case MPT_FALLBACK: + ddvprintk((MYIOC_s_NOTE_FMT + "Fallback: Start: offset %d, factor %x, width %d \n", + hd->ioc->name, dv->now.offset, + dv->now.factor, dv->now.width)); + width = dv->now.width; + offset = dv->now.offset; + factor = dv->now.factor; + if ((offset) && (dv->max.width)) { + if (factor < MPT_ULTRA160) + factor = MPT_ULTRA160; + else if (factor < MPT_ULTRA2) { + factor = MPT_ULTRA2; + width = MPT_WIDE; + } else if ((factor == MPT_ULTRA2) && width) { + factor = MPT_ULTRA2; + width = MPT_NARROW; + } else if (factor < MPT_ULTRA) { + factor = MPT_ULTRA; + width = MPT_WIDE; + } else if ((factor == MPT_ULTRA) && width) { + width = MPT_NARROW; + } else if (factor < MPT_FAST) { + factor = MPT_FAST; + width = MPT_WIDE; + } else if ((factor == MPT_FAST) && width) { + factor = MPT_FAST; + width = MPT_NARROW; + } else if (factor < MPT_SCSI) { + factor = MPT_SCSI; + width = MPT_WIDE; + } else if ((factor == MPT_SCSI) && width) { + factor = MPT_SCSI; + width = MPT_NARROW; + } else { + factor = MPT_ASYNC; + offset = 0; + } + + } else if (offset) { + width = MPT_NARROW; + if (factor < MPT_ULTRA) + factor = MPT_ULTRA; + else if (factor < MPT_FAST) + factor = MPT_FAST; + else if (factor < MPT_SCSI) + factor = MPT_SCSI; + else { + factor = MPT_ASYNC; + offset = 0; + } + + } else { + width = MPT_NARROW; + factor = MPT_ASYNC; + } + dv->max.flags |= MPT_TARGET_NO_NEGO_QAS; + dv->max.flags &= ~MPT_TAPE_NEGO_IDP; + + dv->now.width = width; + dv->now.offset = offset; + dv->now.factor = factor; + dv->now.flags = dv->max.flags; + + pPage1 = (SCSIDevicePage1_t *)pPage; + if (pPage1) { + mptscsih_setDevicePage1Flags (width, factor, offset, &val, + &configuration, dv->now.flags); + dnegoprintk(("Finish: id=%d width=%d offset=%d factor=%x negoFlags=%x request=%x config=%x\n", + id, width, offset, factor, dv->now.flags, val, configuration)); + + pPage1->RequestedParameters = cpu_to_le32(val); + pPage1->Reserved = 0; + pPage1->Configuration = cpu_to_le32(configuration); + } + + ddvprintk(("Finish: id=%d offset=%d factor=%x width=%d request=%x config=%x\n", + id, dv->now.offset, dv->now.factor, dv->now.width, val, configuration)); + break; + + case MPT_SAVE: + ddvprintk((MYIOC_s_NOTE_FMT + "Saving to Target structure: ", hd->ioc->name)); + ddvprintk(("id=%d width=%x factor=%x offset=%d flags=%x\n", + id, dv->now.width, dv->now.factor, dv->now.offset, dv->now.flags)); + + /* Save these values to target structures + * or overwrite nvram (phys disks only). + */ + + if ((hd->Targets)&&((vtarget = hd->Targets[(int)id]) != NULL) && !vtarget->raidVolume ) { + vtarget->maxWidth = dv->now.width; + vtarget->maxOffset = dv->now.offset; + vtarget->minSyncFactor = dv->now.factor; + vtarget->negoFlags = dv->now.flags; + } else { + /* Preserv all flags, use + * read-modify-write algorithm + */ + if (hd->ioc->spi_data.nvram) { + data = hd->ioc->spi_data.nvram[id]; + + if (dv->now.width) + data &= ~MPT_NVRAM_WIDE_DISABLE; + else + data |= MPT_NVRAM_WIDE_DISABLE; + + if (!dv->now.offset) + factor = MPT_ASYNC; + + data &= ~MPT_NVRAM_SYNC_MASK; + data |= (dv->now.factor << MPT_NVRAM_SYNC_SHIFT) & MPT_NVRAM_SYNC_MASK; + + hd->ioc->spi_data.nvram[id] = data; + } + } + break; + } +} + +/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ +/* mptscsih_fillbuf - fill a buffer with a special data pattern + * cleanup. For bus scan only. + * + * @buffer: Pointer to data buffer to be filled. + * @size: Number of bytes to fill + * @index: Pattern index + * @width: bus width, 0 (8 bits) or 1 (16 bits) + */ +static void +mptscsih_fillbuf(char *buffer, int size, int index, int width) +{ + char *ptr = buffer; + int ii; + char byte; + short val; + + switch (index) { + case 0: + + if (width) { + /* Pattern: 0000 FFFF 0000 FFFF + */ + for (ii=0; ii < size; ii++, ptr++) { + if (ii & 0x02) + *ptr = 0xFF; + else + *ptr = 0x00; + } + } else { + /* Pattern: 00 FF 00 FF + */ + for (ii=0; ii < size; ii++, ptr++) { + if (ii & 0x01) + *ptr = 0xFF; + else + *ptr = 0x00; + } + } + break; + + case 1: + if (width) { + /* Pattern: 5555 AAAA 5555 AAAA 5555 + */ + for (ii=0; ii < size; ii++, ptr++) { + if (ii & 0x02) + *ptr = 0xAA; + else + *ptr = 0x55; + } + } else { + /* Pattern: 55 AA 55 AA 55 + */ + for (ii=0; ii < size; ii++, ptr++) { + if (ii & 0x01) + *ptr = 0xAA; + else + *ptr = 0x55; + } + } + break; + + case 2: + /* Pattern: 00 01 02 03 04 05 + * ... FE FF 00 01.. + */ + for (ii=0; ii < size; ii++, ptr++) + *ptr = (char) ii; + break; + + case 3: + if (width) { + /* Wide Pattern: FFFE 0001 FFFD 0002 + * ... 4000 DFFF 8000 EFFF + */ + byte = 0; + for (ii=0; ii < size/2; ii++) { + /* Create the base pattern + */ + val = (1 << byte); + /* every 64 (0x40) bytes flip the pattern + * since we fill 2 bytes / iteration, + * test for ii = 0x20 + */ + if (ii & 0x20) + val = ~(val); + + if (ii & 0x01) { + *ptr = (char)( (val & 0xFF00) >> 8); + ptr++; + *ptr = (char)(val & 0xFF); + byte++; + byte &= 0x0F; + } else { + val = ~val; + *ptr = (char)( (val & 0xFF00) >> 8); + ptr++; + *ptr = (char)(val & 0xFF); + } + + ptr++; + } + } else { + /* Narrow Pattern: FE 01 FD 02 FB 04 + * .. 7F 80 01 FE 02 FD ... 80 7F + */ + byte = 0; + for (ii=0; ii < size; ii++, ptr++) { + /* Base pattern - first 32 bytes + */ + if (ii & 0x01) { + *ptr = (1 << byte); + byte++; + byte &= 0x07; + } else { + *ptr = (char) (~(1 << byte)); + } + + /* Flip the pattern every 32 bytes + */ + if (ii & 0x20) + *ptr = ~(*ptr); + } + } + break; + } +} + +/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ +/* If DV disabled (negoNvram set to USE_NVARM) or if not LUN 0, return. + * Else set the NEED_DV flag after Read Capacity Issued (disks) + * or Mode Sense (cdroms). + * + * Tapes, initTarget will set this flag on completion of Inquiry command. + * Called only if DV_NOT_DONE flag is set + */ +static void +mptscsih_set_dvflags(MPT_SCSI_HOST *hd, struct scsi_cmnd *sc) +{ + MPT_ADAPTER *ioc = hd->ioc; + u8 cmd; + SpiCfgData *pSpi; + + ddvtprintk((MYIOC_s_NOTE_FMT + " set_dvflags: id=%d lun=%d negoNvram=%x cmd=%x\n", + hd->ioc->name, sc->device->id, sc->device->lun , hd->negoNvram, sc->cmnd[0])); + + if ((sc->device->lun != 0) || (hd->negoNvram != 0)) + return; + + cmd = sc->cmnd[0]; + + if ((cmd == READ_CAPACITY) || (cmd == MODE_SENSE)) { + pSpi = &ioc->spi_data; + if ((ioc->raid_data.isRaid & (1 << sc->device->id)) && ioc->raid_data.pIocPg3) { + /* Set NEED_DV for all hidden disks + */ + Ioc3PhysDisk_t *pPDisk = ioc->raid_data.pIocPg3->PhysDisk; + int numPDisk = ioc->raid_data.pIocPg3->NumPhysDisks; + + while (numPDisk) { + pSpi->dvStatus[pPDisk->PhysDiskID] |= MPT_SCSICFG_NEED_DV; + ddvtprintk(("NEED_DV set for phys disk id %d\n", pPDisk->PhysDiskID)); + pPDisk++; + numPDisk--; + } + } + pSpi->dvStatus[sc->device->id] |= MPT_SCSICFG_NEED_DV; + ddvtprintk(("NEED_DV set for visible disk id %d\n", sc->device->id)); + } +} + +/* mptscsih_raid_set_dv_flags() + * + * New or replaced disk. Set DV flag and schedule DV. + */ +static void +mptscsih_set_dvflags_raid(MPT_SCSI_HOST *hd, int id) +{ + MPT_ADAPTER *ioc = hd->ioc; + SpiCfgData *pSpi = &ioc->spi_data; + Ioc3PhysDisk_t *pPDisk; + int numPDisk; + + if (hd->negoNvram != 0) + return; + + ddvtprintk(("DV requested for phys disk id %d\n", id)); + if (ioc->raid_data.pIocPg3) { + pPDisk = ioc->raid_data.pIocPg3->PhysDisk; + numPDisk = ioc->raid_data.pIocPg3->NumPhysDisks; + while (numPDisk) { + if (id == pPDisk->PhysDiskNum) { + pSpi->dvStatus[pPDisk->PhysDiskID] = + (MPT_SCSICFG_NEED_DV | MPT_SCSICFG_DV_NOT_DONE); + pSpi->forceDv = MPT_SCSICFG_NEED_DV; + ddvtprintk(("NEED_DV set for phys disk id %d\n", + pPDisk->PhysDiskID)); + break; + } + pPDisk++; + numPDisk--; + } + + if (numPDisk == 0) { + /* The physical disk that needs DV was not found + * in the stored IOC Page 3. The driver must reload + * this page. DV routine will set the NEED_DV flag for + * all phys disks that have DV_NOT_DONE set. + */ + pSpi->forceDv = MPT_SCSICFG_NEED_DV | MPT_SCSICFG_RELOAD_IOC_PG3; + ddvtprintk(("phys disk %d not found. Setting reload IOC Pg3 Flag\n",id)); + } + } +} +#endif /* ~MPTSCSIH_ENABLE_DOMAIN_VALIDATION */ + EXPORT_SYMBOL(mptscsih_remove); EXPORT_SYMBOL(mptscsih_shutdown); #ifdef CONFIG_PM diff --git a/drivers/message/fusion/mptscsih.h b/drivers/message/fusion/mptscsih.h index 14a5b6c2e..44b248d51 100644 --- a/drivers/message/fusion/mptscsih.h +++ b/drivers/message/fusion/mptscsih.h @@ -60,6 +60,16 @@ #define MPT_SCSI_MAX_SECTORS 8192 +/* To disable domain validation, uncomment the + * following line. No effect for FC devices. + * For SCSI devices, driver will negotiate to + * NVRAM settings (if available) or to maximum adapter + * capabilities. + */ + +#define MPTSCSIH_ENABLE_DOMAIN_VALIDATION + + /* SCSI driver setup structure. Settings can be overridden * by command line options. */ @@ -99,5 +109,3 @@ extern int mptscsih_ioc_reset(MPT_ADAPTER *ioc, int post_reset); extern int mptscsih_change_queue_depth(struct scsi_device *sdev, int qdepth); extern void mptscsih_timer_expired(unsigned long data); extern int mptscsih_TMHandler(MPT_SCSI_HOST *hd, u8 type, u8 channel, u8 target, u8 lun, int ctx2abort, ulong timeout); -extern int mptscsih_raid_id_to_num(MPT_SCSI_HOST *hd, uint physdiskid); -extern int mptscsih_is_phys_disk(MPT_ADAPTER *ioc, int id); diff --git a/drivers/message/fusion/mptspi.c b/drivers/message/fusion/mptspi.c index e4cc3dd5f..f148dfa39 100644 --- a/drivers/message/fusion/mptspi.c +++ b/drivers/message/fusion/mptspi.c @@ -56,15 +56,12 @@ #include /* notifier code */ #include #include -#include #include #include #include #include #include -#include -#include #include "mptbase.h" #include "mptscsih.h" @@ -79,312 +76,32 @@ MODULE_DESCRIPTION(my_NAME); MODULE_LICENSE("GPL"); /* Command line args */ +#ifdef MPTSCSIH_ENABLE_DOMAIN_VALIDATION +static int mpt_dv = MPTSCSIH_DOMAIN_VALIDATION; +module_param(mpt_dv, int, 0); +MODULE_PARM_DESC(mpt_dv, " DV Algorithm: enhanced=1, basic=0 (default=MPTSCSIH_DOMAIN_VALIDATION=1)"); + +static int mpt_width = MPTSCSIH_MAX_WIDTH; +module_param(mpt_width, int, 0); +MODULE_PARM_DESC(mpt_width, " Max Bus Width: wide=1, narrow=0 (default=MPTSCSIH_MAX_WIDTH=1)"); + +static ushort mpt_factor = MPTSCSIH_MIN_SYNC; +module_param(mpt_factor, ushort, 0); +MODULE_PARM_DESC(mpt_factor, " Min Sync Factor (default=MPTSCSIH_MIN_SYNC=0x08)"); +#endif + static int mpt_saf_te = MPTSCSIH_SAF_TE; module_param(mpt_saf_te, int, 0); MODULE_PARM_DESC(mpt_saf_te, " Force enabling SEP Processor: enable=1 (default=MPTSCSIH_SAF_TE=0)"); -static void mptspi_write_offset(struct scsi_target *, int); -static void mptspi_write_width(struct scsi_target *, int); -static int mptspi_write_spi_device_pg1(struct scsi_target *, - struct _CONFIG_PAGE_SCSI_DEVICE_1 *); - -static struct scsi_transport_template *mptspi_transport_template = NULL; +static int mpt_pq_filter = 0; +module_param(mpt_pq_filter, int, 0); +MODULE_PARM_DESC(mpt_pq_filter, " Enable peripheral qualifier filter: enable=1 (default=0)"); static int mptspiDoneCtx = -1; static int mptspiTaskCtx = -1; static int mptspiInternalCtx = -1; /* Used only for internal commands */ -static int mptspi_target_alloc(struct scsi_target *starget) -{ - struct Scsi_Host *shost = dev_to_shost(&starget->dev); - struct _MPT_SCSI_HOST *hd = (struct _MPT_SCSI_HOST *)shost->hostdata; - int ret; - - if (hd == NULL) - return -ENODEV; - - ret = mptscsih_target_alloc(starget); - if (ret) - return ret; - - /* if we're a device on virtual channel 1 and we're not part - * of an array, just return here (otherwise the setup below - * may actually affect a real physical device on channel 0 */ - if (starget->channel == 1 && - mptscsih_raid_id_to_num(hd, starget->id) < 0) - return 0; - - if (hd->ioc->spi_data.nvram && - hd->ioc->spi_data.nvram[starget->id] != MPT_HOST_NVRAM_INVALID) { - u32 nvram = hd->ioc->spi_data.nvram[starget->id]; - spi_min_period(starget) = (nvram & MPT_NVRAM_SYNC_MASK) >> MPT_NVRAM_SYNC_SHIFT; - spi_max_width(starget) = nvram & MPT_NVRAM_WIDE_DISABLE ? 0 : 1; - } else { - spi_min_period(starget) = hd->ioc->spi_data.minSyncFactor; - spi_max_width(starget) = hd->ioc->spi_data.maxBusWidth; - } - spi_max_offset(starget) = hd->ioc->spi_data.maxSyncOffset; - - spi_offset(starget) = 0; - mptspi_write_width(starget, 0); - - return 0; -} - -static int mptspi_read_spi_device_pg0(struct scsi_target *starget, - struct _CONFIG_PAGE_SCSI_DEVICE_0 *pass_pg0) -{ - struct Scsi_Host *shost = dev_to_shost(&starget->dev); - struct _MPT_SCSI_HOST *hd = (struct _MPT_SCSI_HOST *)shost->hostdata; - struct _MPT_ADAPTER *ioc = hd->ioc; - struct _CONFIG_PAGE_SCSI_DEVICE_0 *pg0; - dma_addr_t pg0_dma; - int size; - struct _x_config_parms cfg; - struct _CONFIG_PAGE_HEADER hdr; - int err = -EBUSY; - - /* No SPI parameters for RAID devices */ - if (starget->channel == 0 && - (hd->ioc->raid_data.isRaid & (1 << starget->id))) - return -1; - - size = ioc->spi_data.sdp0length * 4; - /* - if (ioc->spi_data.sdp0length & 1) - size += size + 4; - size += 2048; - */ - - pg0 = dma_alloc_coherent(&ioc->pcidev->dev, size, &pg0_dma, GFP_KERNEL); - if (pg0 == NULL) { - starget_printk(KERN_ERR, starget, "dma_alloc_coherent for parameters failed\n"); - return -EINVAL; - } - - memset(&hdr, 0, sizeof(hdr)); - - hdr.PageVersion = ioc->spi_data.sdp0version; - hdr.PageLength = ioc->spi_data.sdp0length; - hdr.PageNumber = 0; - hdr.PageType = MPI_CONFIG_PAGETYPE_SCSI_DEVICE; - - memset(&cfg, 0, sizeof(cfg)); - - cfg.cfghdr.hdr = &hdr; - cfg.physAddr = pg0_dma; - cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT; - cfg.dir = 0; - cfg.pageAddr = starget->id; - - if (mpt_config(ioc, &cfg)) { - starget_printk(KERN_ERR, starget, "mpt_config failed\n"); - goto out_free; - } - err = 0; - memcpy(pass_pg0, pg0, size); - - out_free: - dma_free_coherent(&ioc->pcidev->dev, size, pg0, pg0_dma); - return err; -} - -static u32 mptspi_getRP(struct scsi_target *starget) -{ - u32 nego = 0; - - nego |= spi_iu(starget) ? MPI_SCSIDEVPAGE1_RP_IU : 0; - nego |= spi_dt(starget) ? MPI_SCSIDEVPAGE1_RP_DT : 0; - nego |= spi_qas(starget) ? MPI_SCSIDEVPAGE1_RP_QAS : 0; - nego |= spi_hold_mcs(starget) ? MPI_SCSIDEVPAGE1_RP_HOLD_MCS : 0; - nego |= spi_wr_flow(starget) ? MPI_SCSIDEVPAGE1_RP_WR_FLOW : 0; - nego |= spi_rd_strm(starget) ? MPI_SCSIDEVPAGE1_RP_RD_STRM : 0; - nego |= spi_rti(starget) ? MPI_SCSIDEVPAGE1_RP_RTI : 0; - nego |= spi_pcomp_en(starget) ? MPI_SCSIDEVPAGE1_RP_PCOMP_EN : 0; - - nego |= (spi_period(starget) << MPI_SCSIDEVPAGE1_RP_SHIFT_MIN_SYNC_PERIOD) & MPI_SCSIDEVPAGE1_RP_MIN_SYNC_PERIOD_MASK; - nego |= (spi_offset(starget) << MPI_SCSIDEVPAGE1_RP_SHIFT_MAX_SYNC_OFFSET) & MPI_SCSIDEVPAGE1_RP_MAX_SYNC_OFFSET_MASK; - nego |= spi_width(starget) ? MPI_SCSIDEVPAGE1_RP_WIDE : 0; - - return nego; -} - -static void mptspi_read_parameters(struct scsi_target *starget) -{ - int nego; - struct _CONFIG_PAGE_SCSI_DEVICE_0 pg0; - - mptspi_read_spi_device_pg0(starget, &pg0); - - nego = le32_to_cpu(pg0.NegotiatedParameters); - - spi_iu(starget) = (nego & MPI_SCSIDEVPAGE0_NP_IU) ? 1 : 0; - spi_dt(starget) = (nego & MPI_SCSIDEVPAGE0_NP_DT) ? 1 : 0; - spi_qas(starget) = (nego & MPI_SCSIDEVPAGE0_NP_QAS) ? 1 : 0; - spi_wr_flow(starget) = (nego & MPI_SCSIDEVPAGE0_NP_WR_FLOW) ? 1 : 0; - spi_rd_strm(starget) = (nego & MPI_SCSIDEVPAGE0_NP_RD_STRM) ? 1 : 0; - spi_rti(starget) = (nego & MPI_SCSIDEVPAGE0_NP_RTI) ? 1 : 0; - spi_pcomp_en(starget) = (nego & MPI_SCSIDEVPAGE0_NP_PCOMP_EN) ? 1 : 0; - spi_hold_mcs(starget) = (nego & MPI_SCSIDEVPAGE0_NP_HOLD_MCS) ? 1 : 0; - spi_period(starget) = (nego & MPI_SCSIDEVPAGE0_NP_NEG_SYNC_PERIOD_MASK) >> MPI_SCSIDEVPAGE0_NP_SHIFT_SYNC_PERIOD; - spi_offset(starget) = (nego & MPI_SCSIDEVPAGE0_NP_NEG_SYNC_OFFSET_MASK) >> MPI_SCSIDEVPAGE0_NP_SHIFT_SYNC_OFFSET; - spi_width(starget) = (nego & MPI_SCSIDEVPAGE0_NP_WIDE) ? 1 : 0; -} - -static int -mptscsih_quiesce_raid(MPT_SCSI_HOST *hd, int quiesce, int disk) -{ - MpiRaidActionRequest_t *pReq; - MPT_FRAME_HDR *mf; - - /* Get and Populate a free Frame - */ - if ((mf = mpt_get_msg_frame(hd->ioc->InternalCtx, hd->ioc)) == NULL) { - ddvprintk((MYIOC_s_WARN_FMT "_do_raid: no msg frames!\n", - hd->ioc->name)); - return -EAGAIN; - } - pReq = (MpiRaidActionRequest_t *)mf; - if (quiesce) - pReq->Action = MPI_RAID_ACTION_QUIESCE_PHYS_IO; - else - pReq->Action = MPI_RAID_ACTION_ENABLE_PHYS_IO; - pReq->Reserved1 = 0; - pReq->ChainOffset = 0; - pReq->Function = MPI_FUNCTION_RAID_ACTION; - pReq->VolumeID = disk; - pReq->VolumeBus = 0; - pReq->PhysDiskNum = 0; - pReq->MsgFlags = 0; - pReq->Reserved2 = 0; - pReq->ActionDataWord = 0; /* Reserved for this action */ - - mpt_add_sge((char *)&pReq->ActionDataSGE, - MPT_SGE_FLAGS_SSIMPLE_READ | 0, (dma_addr_t) -1); - - ddvprintk((MYIOC_s_INFO_FMT "RAID Volume action %x id %d\n", - hd->ioc->name, action, io->id)); - - hd->pLocal = NULL; - hd->timer.expires = jiffies + HZ*10; /* 10 second timeout */ - hd->scandv_wait_done = 0; - - /* Save cmd pointer, for resource free if timeout or - * FW reload occurs - */ - hd->cmdPtr = mf; - - add_timer(&hd->timer); - mpt_put_msg_frame(hd->ioc->InternalCtx, hd->ioc, mf); - wait_event(hd->scandv_waitq, hd->scandv_wait_done); - - if ((hd->pLocal == NULL) || (hd->pLocal->completion != 0)) - return -1; - - return 0; -} - -static void mptspi_dv_device(struct _MPT_SCSI_HOST *hd, - struct scsi_device *sdev) -{ - VirtTarget *vtarget = scsi_target(sdev)->hostdata; - - /* no DV on RAID devices */ - if (sdev->channel == 0 && - (hd->ioc->raid_data.isRaid & (1 << sdev->id))) - return; - - /* If this is a piece of a RAID, then quiesce first */ - if (sdev->channel == 1 && - mptscsih_quiesce_raid(hd, 1, vtarget->target_id) < 0) { - starget_printk(KERN_ERR, scsi_target(sdev), - "Integrated RAID quiesce failed\n"); - return; - } - - spi_dv_device(sdev); - - if (sdev->channel == 1 && - mptscsih_quiesce_raid(hd, 0, vtarget->target_id) < 0) - starget_printk(KERN_ERR, scsi_target(sdev), - "Integrated RAID resume failed\n"); - - mptspi_read_parameters(sdev->sdev_target); - spi_display_xfer_agreement(sdev->sdev_target); - mptspi_read_parameters(sdev->sdev_target); -} - -static int mptspi_slave_alloc(struct scsi_device *sdev) -{ - int ret; - MPT_SCSI_HOST *hd = (MPT_SCSI_HOST *)sdev->host->hostdata; - /* gcc doesn't see that all uses of this variable occur within - * the if() statements, so stop it from whining */ - int physdisknum = 0; - - if (sdev->channel == 1) { - physdisknum = mptscsih_raid_id_to_num(hd, sdev->id); - - if (physdisknum < 0) - return physdisknum; - } - - ret = mptscsih_slave_alloc(sdev); - - if (ret) - return ret; - - if (sdev->channel == 1) { - VirtDevice *vdev = sdev->hostdata; - sdev->no_uld_attach = 1; - vdev->vtarget->tflags |= MPT_TARGET_FLAGS_RAID_COMPONENT; - /* The real channel for this device is zero */ - vdev->vtarget->bus_id = 0; - /* The actual physdisknum (for RAID passthrough) */ - vdev->vtarget->target_id = physdisknum; - } - - return 0; -} - -static int mptspi_slave_configure(struct scsi_device *sdev) -{ - int ret = mptscsih_slave_configure(sdev); - struct _MPT_SCSI_HOST *hd = - (struct _MPT_SCSI_HOST *)sdev->host->hostdata; - - if (ret) - return ret; - - if ((sdev->channel == 1 || - !(hd->ioc->raid_data.isRaid & (1 << sdev->id))) && - !spi_initial_dv(sdev->sdev_target)) - mptspi_dv_device(hd, sdev); - - return 0; -} - -static void mptspi_slave_destroy(struct scsi_device *sdev) -{ - struct scsi_target *starget = scsi_target(sdev); - VirtTarget *vtarget = starget->hostdata; - VirtDevice *vdevice = sdev->hostdata; - - /* Will this be the last lun on a non-raid device? */ - if (vtarget->num_luns == 1 && vdevice->configured_lun) { - struct _CONFIG_PAGE_SCSI_DEVICE_1 pg1; - - /* Async Narrow */ - pg1.RequestedParameters = 0; - pg1.Reserved = 0; - pg1.Configuration = 0; - - mptspi_write_spi_device_pg1(starget, &pg1); - } - - mptscsih_slave_destroy(sdev); -} - static struct scsi_host_template mptspi_driver_template = { .module = THIS_MODULE, .proc_name = "mptspi", @@ -392,11 +109,11 @@ static struct scsi_host_template mptspi_driver_template = { .name = "MPT SPI Host", .info = mptscsih_info, .queuecommand = mptscsih_qcmd, - .target_alloc = mptspi_target_alloc, - .slave_alloc = mptspi_slave_alloc, - .slave_configure = mptspi_slave_configure, + .target_alloc = mptscsih_target_alloc, + .slave_alloc = mptscsih_slave_alloc, + .slave_configure = mptscsih_slave_configure, .target_destroy = mptscsih_target_destroy, - .slave_destroy = mptspi_slave_destroy, + .slave_destroy = mptscsih_slave_destroy, .change_queue_depth = mptscsih_change_queue_depth, .eh_abort_handler = mptscsih_abort, .eh_device_reset_handler = mptscsih_dev_reset, @@ -411,440 +128,20 @@ static struct scsi_host_template mptspi_driver_template = { .use_clustering = ENABLE_CLUSTERING, }; -static int mptspi_write_spi_device_pg1(struct scsi_target *starget, - struct _CONFIG_PAGE_SCSI_DEVICE_1 *pass_pg1) -{ - struct Scsi_Host *shost = dev_to_shost(&starget->dev); - struct _MPT_SCSI_HOST *hd = (struct _MPT_SCSI_HOST *)shost->hostdata; - struct _MPT_ADAPTER *ioc = hd->ioc; - struct _CONFIG_PAGE_SCSI_DEVICE_1 *pg1; - dma_addr_t pg1_dma; - int size; - struct _x_config_parms cfg; - struct _CONFIG_PAGE_HEADER hdr; - int err = -EBUSY; - - /* don't allow updating nego parameters on RAID devices */ - if (starget->channel == 0 && - (hd->ioc->raid_data.isRaid & (1 << starget->id))) - return -1; - - size = ioc->spi_data.sdp1length * 4; - - pg1 = dma_alloc_coherent(&ioc->pcidev->dev, size, &pg1_dma, GFP_KERNEL); - if (pg1 == NULL) { - starget_printk(KERN_ERR, starget, "dma_alloc_coherent for parameters failed\n"); - return -EINVAL; - } - - memset(&hdr, 0, sizeof(hdr)); - - hdr.PageVersion = ioc->spi_data.sdp1version; - hdr.PageLength = ioc->spi_data.sdp1length; - hdr.PageNumber = 1; - hdr.PageType = MPI_CONFIG_PAGETYPE_SCSI_DEVICE; - - memset(&cfg, 0, sizeof(cfg)); - - cfg.cfghdr.hdr = &hdr; - cfg.physAddr = pg1_dma; - cfg.action = MPI_CONFIG_ACTION_PAGE_WRITE_CURRENT; - cfg.dir = 1; - cfg.pageAddr = starget->id; - - memcpy(pg1, pass_pg1, size); - - pg1->Header.PageVersion = hdr.PageVersion; - pg1->Header.PageLength = hdr.PageLength; - pg1->Header.PageNumber = hdr.PageNumber; - pg1->Header.PageType = hdr.PageType; - - if (mpt_config(ioc, &cfg)) { - starget_printk(KERN_ERR, starget, "mpt_config failed\n"); - goto out_free; - } - err = 0; - - out_free: - dma_free_coherent(&ioc->pcidev->dev, size, pg1, pg1_dma); - return err; -} - -static void mptspi_write_offset(struct scsi_target *starget, int offset) -{ - struct _CONFIG_PAGE_SCSI_DEVICE_1 pg1; - u32 nego; - - if (offset < 0) - offset = 0; - - if (offset > 255) - offset = 255; - - if (spi_offset(starget) == -1) - mptspi_read_parameters(starget); - - spi_offset(starget) = offset; - - nego = mptspi_getRP(starget); - - pg1.RequestedParameters = cpu_to_le32(nego); - pg1.Reserved = 0; - pg1.Configuration = 0; - - mptspi_write_spi_device_pg1(starget, &pg1); -} - -static void mptspi_write_period(struct scsi_target *starget, int period) -{ - struct _CONFIG_PAGE_SCSI_DEVICE_1 pg1; - u32 nego; - - if (period < 8) - period = 8; - - if (period > 255) - period = 255; - - if (spi_period(starget) == -1) - mptspi_read_parameters(starget); - - if (period == 8) { - spi_iu(starget) = 1; - spi_dt(starget) = 1; - } else if (period == 9) { - spi_dt(starget) = 1; - } - - spi_period(starget) = period; - - nego = mptspi_getRP(starget); - - pg1.RequestedParameters = cpu_to_le32(nego); - pg1.Reserved = 0; - pg1.Configuration = 0; - - mptspi_write_spi_device_pg1(starget, &pg1); -} - -static void mptspi_write_dt(struct scsi_target *starget, int dt) -{ - struct _CONFIG_PAGE_SCSI_DEVICE_1 pg1; - u32 nego; - - if (spi_period(starget) == -1) - mptspi_read_parameters(starget); - - if (!dt && spi_period(starget) < 10) - spi_period(starget) = 10; - - spi_dt(starget) = dt; - - nego = mptspi_getRP(starget); - - - pg1.RequestedParameters = cpu_to_le32(nego); - pg1.Reserved = 0; - pg1.Configuration = 0; - - mptspi_write_spi_device_pg1(starget, &pg1); -} - -static void mptspi_write_iu(struct scsi_target *starget, int iu) -{ - struct _CONFIG_PAGE_SCSI_DEVICE_1 pg1; - u32 nego; - - if (spi_period(starget) == -1) - mptspi_read_parameters(starget); - - if (!iu && spi_period(starget) < 9) - spi_period(starget) = 9; - - spi_iu(starget) = iu; - - nego = mptspi_getRP(starget); - - pg1.RequestedParameters = cpu_to_le32(nego); - pg1.Reserved = 0; - pg1.Configuration = 0; - - mptspi_write_spi_device_pg1(starget, &pg1); -} - -#define MPTSPI_SIMPLE_TRANSPORT_PARM(parm) \ -static void mptspi_write_##parm(struct scsi_target *starget, int parm)\ -{ \ - struct _CONFIG_PAGE_SCSI_DEVICE_1 pg1; \ - u32 nego; \ - \ - spi_##parm(starget) = parm; \ - \ - nego = mptspi_getRP(starget); \ - \ - pg1.RequestedParameters = cpu_to_le32(nego); \ - pg1.Reserved = 0; \ - pg1.Configuration = 0; \ - \ - mptspi_write_spi_device_pg1(starget, &pg1); \ -} - -MPTSPI_SIMPLE_TRANSPORT_PARM(rd_strm) -MPTSPI_SIMPLE_TRANSPORT_PARM(wr_flow) -MPTSPI_SIMPLE_TRANSPORT_PARM(rti) -MPTSPI_SIMPLE_TRANSPORT_PARM(hold_mcs) -MPTSPI_SIMPLE_TRANSPORT_PARM(pcomp_en) - -static void mptspi_write_qas(struct scsi_target *starget, int qas) -{ - struct _CONFIG_PAGE_SCSI_DEVICE_1 pg1; - struct Scsi_Host *shost = dev_to_shost(&starget->dev); - struct _MPT_SCSI_HOST *hd = (struct _MPT_SCSI_HOST *)shost->hostdata; - VirtTarget *vtarget = starget->hostdata; - u32 nego; - - if ((vtarget->negoFlags & MPT_TARGET_NO_NEGO_QAS) || - hd->ioc->spi_data.noQas) - spi_qas(starget) = 0; - else - spi_qas(starget) = qas; - - nego = mptspi_getRP(starget); - - pg1.RequestedParameters = cpu_to_le32(nego); - pg1.Reserved = 0; - pg1.Configuration = 0; - - mptspi_write_spi_device_pg1(starget, &pg1); -} - -static void mptspi_write_width(struct scsi_target *starget, int width) -{ - struct _CONFIG_PAGE_SCSI_DEVICE_1 pg1; - u32 nego; - - if (!width) { - spi_dt(starget) = 0; - if (spi_period(starget) < 10) - spi_period(starget) = 10; - } - - spi_width(starget) = width; - - nego = mptspi_getRP(starget); - - pg1.RequestedParameters = cpu_to_le32(nego); - pg1.Reserved = 0; - pg1.Configuration = 0; - - mptspi_write_spi_device_pg1(starget, &pg1); -} - -struct work_queue_wrapper { - struct work_struct work; - struct _MPT_SCSI_HOST *hd; - int disk; -}; - -static void mpt_work_wrapper(void *data) -{ - struct work_queue_wrapper *wqw = (struct work_queue_wrapper *)data; - struct _MPT_SCSI_HOST *hd = wqw->hd; - struct Scsi_Host *shost = hd->ioc->sh; - struct scsi_device *sdev; - int disk = wqw->disk; - struct _CONFIG_PAGE_IOC_3 *pg3; - - kfree(wqw); - - mpt_findImVolumes(hd->ioc); - pg3 = hd->ioc->raid_data.pIocPg3; - if (!pg3) - return; - - shost_for_each_device(sdev,shost) { - struct scsi_target *starget = scsi_target(sdev); - VirtTarget *vtarget = starget->hostdata; - - /* only want to search RAID components */ - if (sdev->channel != 1) - continue; - - /* The target_id is the raid PhysDiskNum, even if - * starget->id is the actual target address */ - if(vtarget->target_id != disk) - continue; - - starget_printk(KERN_INFO, vtarget->starget, - "Integrated RAID requests DV of new device\n"); - mptspi_dv_device(hd, sdev); - } - shost_printk(KERN_INFO, shost, - "Integrated RAID detects new device %d\n", disk); - scsi_scan_target(&hd->ioc->sh->shost_gendev, 1, disk, 0, 1); -} - - -static void mpt_dv_raid(struct _MPT_SCSI_HOST *hd, int disk) -{ - struct work_queue_wrapper *wqw = kmalloc(sizeof(*wqw), GFP_ATOMIC); - - if (!wqw) { - shost_printk(KERN_ERR, hd->ioc->sh, - "Failed to act on RAID event for physical disk %d\n", - disk); - return; - } - INIT_WORK(&wqw->work, mpt_work_wrapper, wqw); - wqw->hd = hd; - wqw->disk = disk; - - schedule_work(&wqw->work); -} - -static int -mptspi_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *pEvReply) -{ - u8 event = le32_to_cpu(pEvReply->Event) & 0xFF; - struct _MPT_SCSI_HOST *hd = (struct _MPT_SCSI_HOST *)ioc->sh->hostdata; - - if (hd && event == MPI_EVENT_INTEGRATED_RAID) { - int reason - = (le32_to_cpu(pEvReply->Data[0]) & 0x00FF0000) >> 16; - - if (reason == MPI_EVENT_RAID_RC_DOMAIN_VAL_NEEDED) { - int disk = (le32_to_cpu(pEvReply->Data[0]) & 0xFF000000) >> 24; - mpt_dv_raid(hd, disk); - } - } - return mptscsih_event_process(ioc, pEvReply); -} - -static int -mptspi_deny_binding(struct scsi_target *starget) -{ - struct _MPT_SCSI_HOST *hd = - (struct _MPT_SCSI_HOST *)dev_to_shost(starget->dev.parent)->hostdata; - return ((hd->ioc->raid_data.isRaid & (1 << starget->id)) && - starget->channel == 0) ? 1 : 0; -} - -static struct spi_function_template mptspi_transport_functions = { - .get_offset = mptspi_read_parameters, - .set_offset = mptspi_write_offset, - .show_offset = 1, - .get_period = mptspi_read_parameters, - .set_period = mptspi_write_period, - .show_period = 1, - .get_width = mptspi_read_parameters, - .set_width = mptspi_write_width, - .show_width = 1, - .get_iu = mptspi_read_parameters, - .set_iu = mptspi_write_iu, - .show_iu = 1, - .get_dt = mptspi_read_parameters, - .set_dt = mptspi_write_dt, - .show_dt = 1, - .get_qas = mptspi_read_parameters, - .set_qas = mptspi_write_qas, - .show_qas = 1, - .get_wr_flow = mptspi_read_parameters, - .set_wr_flow = mptspi_write_wr_flow, - .show_wr_flow = 1, - .get_rd_strm = mptspi_read_parameters, - .set_rd_strm = mptspi_write_rd_strm, - .show_rd_strm = 1, - .get_rti = mptspi_read_parameters, - .set_rti = mptspi_write_rti, - .show_rti = 1, - .get_pcomp_en = mptspi_read_parameters, - .set_pcomp_en = mptspi_write_pcomp_en, - .show_pcomp_en = 1, - .get_hold_mcs = mptspi_read_parameters, - .set_hold_mcs = mptspi_write_hold_mcs, - .show_hold_mcs = 1, - .deny_binding = mptspi_deny_binding, -}; /**************************************************************************** * Supported hardware */ static struct pci_device_id mptspi_pci_table[] = { - { PCI_VENDOR_ID_LSI_LOGIC, MPI_MANUFACTPAGE_DEVID_53C1030, + { PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_53C1030, PCI_ANY_ID, PCI_ANY_ID }, - { PCI_VENDOR_ID_LSI_LOGIC, MPI_MANUFACTPAGE_DEVID_53C1035, + { PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_1030_53C1035, PCI_ANY_ID, PCI_ANY_ID }, {0} /* Terminating entry */ }; MODULE_DEVICE_TABLE(pci, mptspi_pci_table); - -/* - * renegotiate for a given target - */ -static void -mptspi_dv_renegotiate_work(void *data) -{ - struct work_queue_wrapper *wqw = (struct work_queue_wrapper *)data; - struct _MPT_SCSI_HOST *hd = wqw->hd; - struct scsi_device *sdev; - - kfree(wqw); - - shost_for_each_device(sdev, hd->ioc->sh) - mptspi_dv_device(hd, sdev); -} - -static void -mptspi_dv_renegotiate(struct _MPT_SCSI_HOST *hd) -{ - struct work_queue_wrapper *wqw = kmalloc(sizeof(*wqw), GFP_ATOMIC); - - if (!wqw) - return; - - INIT_WORK(&wqw->work, mptspi_dv_renegotiate_work, wqw); - wqw->hd = hd; - - schedule_work(&wqw->work); -} - -/* - * spi module reset handler - */ -static int -mptspi_ioc_reset(MPT_ADAPTER *ioc, int reset_phase) -{ - struct _MPT_SCSI_HOST *hd = (struct _MPT_SCSI_HOST *)ioc->sh->hostdata; - int rc; - - rc = mptscsih_ioc_reset(ioc, reset_phase); - - if (reset_phase == MPT_IOC_POST_RESET) - mptspi_dv_renegotiate(hd); - - return rc; -} - -#ifdef CONFIG_PM -/* - * spi module resume handler - */ -static int -mptspi_resume(struct pci_dev *pdev) -{ - MPT_ADAPTER *ioc = pci_get_drvdata(pdev); - struct _MPT_SCSI_HOST *hd = (struct _MPT_SCSI_HOST *)ioc->sh->hostdata; - int rc; - - rc = mptscsih_resume(pdev); - mptspi_dv_renegotiate(hd); - - return rc; -} -#endif - /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ /* @@ -945,14 +242,7 @@ mptspi_probe(struct pci_dev *pdev, const struct pci_device_id *id) sh->max_id = MPT_MAX_SCSI_DEVICES; sh->max_lun = MPT_LAST_LUN + 1; - /* - * If RAID Firmware Detected, setup virtual channel - */ - if ((ioc->facts.ProductID & MPI_FW_HEADER_PID_PROD_MASK) - > MPI_FW_HEADER_PID_PROD_TARGET_SCSI) - sh->max_channel = 1; - else - sh->max_channel = 0; + sh->max_channel = 0; sh->this_id = ioc->pfacts[0].PortSCSIID; /* Required entry. @@ -1011,8 +301,7 @@ mptspi_probe(struct pci_dev *pdev, const struct pci_device_id *id) * indicates a device exists. * max_id = 1 + maximum id (hosts.h) */ - hd->Targets = kcalloc(sh->max_id * (sh->max_channel + 1), - sizeof(void *), GFP_ATOMIC); + hd->Targets = kcalloc(sh->max_id, sizeof(void *), GFP_ATOMIC); if (!hd->Targets) { error = -ENOMEM; goto out_mptspi_probe; @@ -1043,23 +332,51 @@ mptspi_probe(struct pci_dev *pdev, const struct pci_device_id *id) hd->timer.function = mptscsih_timer_expired; ioc->spi_data.Saf_Te = mpt_saf_te; + hd->mpt_pq_filter = mpt_pq_filter; + +#ifdef MPTSCSIH_ENABLE_DOMAIN_VALIDATION + if (ioc->spi_data.maxBusWidth > mpt_width) + ioc->spi_data.maxBusWidth = mpt_width; + if (ioc->spi_data.minSyncFactor < mpt_factor) + ioc->spi_data.minSyncFactor = mpt_factor; + if (ioc->spi_data.minSyncFactor == MPT_ASYNC) { + ioc->spi_data.maxSyncOffset = 0; + } + ioc->spi_data.mpt_dv = mpt_dv; + hd->negoNvram = 0; + ddvprintk((MYIOC_s_INFO_FMT + "dv %x width %x factor %x saf_te %x mpt_pq_filter %x\n", + ioc->name, + mpt_dv, + mpt_width, + mpt_factor, + mpt_saf_te, + mpt_pq_filter)); +#else hd->negoNvram = MPT_SCSICFG_USE_NVRAM; ddvprintk((MYIOC_s_INFO_FMT - "saf_te %x\n", + "saf_te %x mpt_pq_filter %x\n", ioc->name, - mpt_saf_te)); + mpt_saf_te, + mpt_pq_filter)); +#endif + + ioc->spi_data.forceDv = 0; ioc->spi_data.noQas = 0; + for (ii=0; ii < MPT_MAX_SCSI_DEVICES; ii++) + ioc->spi_data.dvStatus[ii] = + MPT_SCSICFG_NEGOTIATE; + + for (ii=0; ii < MPT_MAX_SCSI_DEVICES; ii++) + ioc->spi_data.dvStatus[ii] |= + MPT_SCSICFG_DV_NOT_DONE; + init_waitqueue_head(&hd->scandv_waitq); hd->scandv_wait_done = 0; hd->last_queue_full = 0; - /* Some versions of the firmware don't support page 0; without - * that we can't get the parameters */ - if (hd->ioc->spi_data.sdp0length != 0) - sh->transportt = mptspi_transport_template; - error = scsi_add_host (sh, &ioc->pcidev->dev); if(error) { dprintk((KERN_ERR MYNAM @@ -1092,7 +409,7 @@ static struct pci_driver mptspi_driver = { .shutdown = mptscsih_shutdown, #ifdef CONFIG_PM .suspend = mptscsih_suspend, - .resume = mptspi_resume, + .resume = mptscsih_resume, #endif }; @@ -1106,22 +423,19 @@ static struct pci_driver mptspi_driver = { static int __init mptspi_init(void) { - show_mptmod_ver(my_NAME, my_VERSION); - mptspi_transport_template = spi_attach_transport(&mptspi_transport_functions); - if (!mptspi_transport_template) - return -ENODEV; + show_mptmod_ver(my_NAME, my_VERSION); mptspiDoneCtx = mpt_register(mptscsih_io_done, MPTSPI_DRIVER); mptspiTaskCtx = mpt_register(mptscsih_taskmgmt_complete, MPTSPI_DRIVER); mptspiInternalCtx = mpt_register(mptscsih_scandv_complete, MPTSPI_DRIVER); - if (mpt_event_register(mptspiDoneCtx, mptspi_event_process) == 0) { - devtverboseprintk((KERN_INFO MYNAM + if (mpt_event_register(mptspiDoneCtx, mptscsih_event_process) == 0) { + devtprintk((KERN_INFO MYNAM ": Registered for IOC event notifications\n")); } - if (mpt_reset_register(mptspiDoneCtx, mptspi_ioc_reset) == 0) { + if (mpt_reset_register(mptspiDoneCtx, mptscsih_ioc_reset) == 0) { dprintk((KERN_INFO MYNAM ": Registered for IOC reset notifications\n")); } @@ -1151,7 +465,6 @@ mptspi_exit(void) mpt_deregister(mptspiInternalCtx); mpt_deregister(mptspiTaskCtx); mpt_deregister(mptspiDoneCtx); - spi_release_transport(mptspi_transport_template); } module_init(mptspi_init); diff --git a/drivers/message/i2o/core.h b/drivers/message/i2o/core.h index dc388a3ff..184974cc7 100644 --- a/drivers/message/i2o/core.h +++ b/drivers/message/i2o/core.h @@ -38,9 +38,6 @@ extern struct device_attribute i2o_device_attrs[]; extern void i2o_device_remove(struct i2o_device *); extern int i2o_device_parse_lct(struct i2o_controller *); -int i2o_parm_issue(struct i2o_device *i2o_dev, int cmd, void *oplist, - int oplen, void *reslist, int reslen); - /* IOP */ extern struct i2o_controller *i2o_iop_alloc(void); diff --git a/drivers/message/i2o/debug.c b/drivers/message/i2o/debug.c index 8abe45e49..40d4ea898 100644 --- a/drivers/message/i2o/debug.c +++ b/drivers/message/i2o/debug.c @@ -1,3 +1,4 @@ +#include #include #include #include @@ -418,53 +419,58 @@ void i2o_dump_hrt(struct i2o_controller *c) d = (u8 *) (rows + 2); state = p[1] << 8 | p[0]; - printk("TID %04X:[", state & 0xFFF); + printk(KERN_DEBUG "TID %04X:[", state & 0xFFF); state >>= 12; if (state & (1 << 0)) - printk("H"); /* Hidden */ + printk(KERN_DEBUG "H"); /* Hidden */ if (state & (1 << 2)) { - printk("P"); /* Present */ + printk(KERN_DEBUG "P"); /* Present */ if (state & (1 << 1)) - printk("C"); /* Controlled */ + printk(KERN_DEBUG "C"); /* Controlled */ } if (state > 9) - printk("*"); /* Hard */ + printk(KERN_DEBUG "*"); /* Hard */ - printk("]:"); + printk(KERN_DEBUG "]:"); switch (p[3] & 0xFFFF) { case 0: /* Adapter private bus - easy */ - printk("Local bus %d: I/O at 0x%04X Mem 0x%08X", p[2], + printk(KERN_DEBUG + "Local bus %d: I/O at 0x%04X Mem 0x%08X", p[2], d[1] << 8 | d[0], *(u32 *) (d + 4)); break; case 1: /* ISA bus */ - printk("ISA %d: CSN %d I/O at 0x%04X Mem 0x%08X", p[2], + printk(KERN_DEBUG + "ISA %d: CSN %d I/O at 0x%04X Mem 0x%08X", p[2], d[2], d[1] << 8 | d[0], *(u32 *) (d + 4)); break; case 2: /* EISA bus */ - printk("EISA %d: Slot %d I/O at 0x%04X Mem 0x%08X", + printk(KERN_DEBUG + "EISA %d: Slot %d I/O at 0x%04X Mem 0x%08X", p[2], d[3], d[1] << 8 | d[0], *(u32 *) (d + 4)); break; case 3: /* MCA bus */ - printk("MCA %d: Slot %d I/O at 0x%04X Mem 0x%08X", p[2], + printk(KERN_DEBUG + "MCA %d: Slot %d I/O at 0x%04X Mem 0x%08X", p[2], d[3], d[1] << 8 | d[0], *(u32 *) (d + 4)); break; case 4: /* PCI bus */ - printk("PCI %d: Bus %d Device %d Function %d", p[2], + printk(KERN_DEBUG + "PCI %d: Bus %d Device %d Function %d", p[2], d[2], d[1], d[0]); break; case 0x80: /* Other */ default: - printk("Unsupported bus type."); + printk(KERN_DEBUG "Unsupported bus type."); break; } - printk("\n"); + printk(KERN_DEBUG "\n"); rows += length; } } diff --git a/drivers/message/i2o/exec-osm.c b/drivers/message/i2o/exec-osm.c index 7bd4d85d0..04e035744 100644 --- a/drivers/message/i2o/exec-osm.c +++ b/drivers/message/i2o/exec-osm.c @@ -58,13 +58,6 @@ struct i2o_exec_wait { spinlock_t lock; /* lock before modifying */ }; -/* Work struct needed to handle LCT NOTIFY replies */ -struct i2o_exec_lct_notify_work { - struct work_struct work; /* work struct */ - struct i2o_controller *c; /* controller on which the LCT NOTIFY - was received */ -}; - /* Exec OSM class handling definition */ static struct i2o_class_id i2o_exec_class_id[] = { {I2O_CLASS_EXECUTIVE}, @@ -360,12 +353,9 @@ static int i2o_exec_remove(struct device *dev) * new LCT and if the buffer for the LCT was to small sends a LCT NOTIFY * again, otherwise send LCT NOTIFY to get informed on next LCT change. */ -static void i2o_exec_lct_modified(struct i2o_exec_lct_notify_work *work) +static void i2o_exec_lct_modified(struct i2o_controller *c) { u32 change_ind = 0; - struct i2o_controller *c = work->c; - - kfree(work); if (i2o_device_parse_lct(c) != -EAGAIN) change_ind = c->lct->change_ind + 1; @@ -418,7 +408,7 @@ static int i2o_exec_reply(struct i2o_controller *c, u32 m, return i2o_msg_post_wait_complete(c, m, msg, context); if ((le32_to_cpu(msg->u.head[1]) >> 24) == I2O_CMD_LCT_NOTIFY) { - struct i2o_exec_lct_notify_work *work; + struct work_struct *work; pr_debug("%s: LCT notify received\n", c->name); @@ -426,11 +416,8 @@ static int i2o_exec_reply(struct i2o_controller *c, u32 m, if (!work) return -ENOMEM; - work->c = c; - - INIT_WORK(&work->work, (void (*)(void *))i2o_exec_lct_modified, - work); - queue_work(i2o_exec_driver.event_queue, &work->work); + INIT_WORK(work, (void (*)(void *))i2o_exec_lct_modified, c); + queue_work(i2o_exec_driver.event_queue, work); return 1; } diff --git a/drivers/message/i2o/i2o_block.c b/drivers/message/i2o/i2o_block.c index 1ddc2fb42..b09fb6307 100644 --- a/drivers/message/i2o/i2o_block.c +++ b/drivers/message/i2o/i2o_block.c @@ -1089,6 +1089,7 @@ static int i2o_block_probe(struct device *dev) gd = i2o_blk_dev->gd; gd->first_minor = unit << 4; sprintf(gd->disk_name, "i2o/hd%c", 'a' + unit); + sprintf(gd->devfs_name, "i2o/hd%c", 'a' + unit); gd->driverfs_dev = &i2o_dev->device; /* setup request queue */ @@ -1178,9 +1179,10 @@ static int __init i2o_block_init(void) goto exit; } - i2o_blk_req_pool.pool = - mempool_create_slab_pool(I2O_BLOCK_REQ_MEMPOOL_SIZE, - i2o_blk_req_pool.slab); + i2o_blk_req_pool.pool = mempool_create(I2O_BLOCK_REQ_MEMPOOL_SIZE, + mempool_alloc_slab, + mempool_free_slab, + i2o_blk_req_pool.slab); if (!i2o_blk_req_pool.pool) { osm_err("can't init request mempool\n"); rc = -ENOMEM; diff --git a/drivers/message/i2o/i2o_config.c b/drivers/message/i2o/i2o_config.c index 7d23e082b..89daf67b7 100644 --- a/drivers/message/i2o/i2o_config.c +++ b/drivers/message/i2o/i2o_config.c @@ -36,10 +36,10 @@ #include -#include "core.h" - #define SG_TABLESIZE 30 +extern int i2o_parm_issue(struct i2o_device *, int, void *, int, void *, int); + static int i2o_cfg_ioctl(struct inode *, struct file *, unsigned int, unsigned long); diff --git a/drivers/message/i2o/i2o_proc.c b/drivers/message/i2o/i2o_proc.c index 3d2e76eea..2a0c42b8c 100644 --- a/drivers/message/i2o/i2o_proc.c +++ b/drivers/message/i2o/i2o_proc.c @@ -56,7 +56,7 @@ typedef struct _i2o_proc_entry_t { char *name; /* entry name */ mode_t mode; /* mode */ - const struct file_operations *fops; /* open function */ + struct file_operations *fops; /* open function */ } i2o_proc_entry; /* global I2O /proc/i2o entry */ diff --git a/drivers/message/i2o/i2o_scsi.c b/drivers/message/i2o/i2o_scsi.c index 6ebf38213..c08ddac37 100644 --- a/drivers/message/i2o/i2o_scsi.c +++ b/drivers/message/i2o/i2o_scsi.c @@ -65,7 +65,9 @@ #include #include #include +#include #include +#include #define OSM_NAME "scsi-osm" #define OSM_VERSION "1.316" @@ -586,7 +588,6 @@ static int i2o_scsi_queuecommand(struct scsi_cmnd *SCpnt, mptr = &msg->body[0]; -#if 0 /* this code can't work */ #ifdef CONFIG_I2O_EXT_ADAPTEC if (c->adaptec) { u32 adpt_flags = 0; @@ -623,7 +624,6 @@ static int i2o_scsi_queuecommand(struct scsi_cmnd *SCpnt, *mptr++ = cpu_to_le32(I2O_VENDOR_DPT << 16 | I2O_CMD_SCSI_EXEC); *mptr++ = cpu_to_le32(adpt_flags | tid); } -#endif #endif msg->u.head[1] = cpu_to_le32(cmd | HOST_TID << 12 | tid); diff --git a/drivers/message/i2o/iop.c b/drivers/message/i2o/iop.c index 3305c1237..febbdd4e0 100644 --- a/drivers/message/i2o/iop.c +++ b/drivers/message/i2o/iop.c @@ -683,10 +683,9 @@ static int i2o_iop_systab_set(struct i2o_controller *c) c->mem_alloc = 1; sb->current_mem_size = 1 + res->end - res->start; sb->current_mem_base = res->start; - osm_info("%s: allocated %llu bytes of PCI memory at " - "0x%016llX.\n", c->name, - (unsigned long long)(1 + res->end - res->start), - (unsigned long long)res->start); + osm_info("%s: allocated %ld bytes of PCI memory at " + "0x%08lX.\n", c->name, + 1 + res->end - res->start, res->start); } } @@ -705,10 +704,9 @@ static int i2o_iop_systab_set(struct i2o_controller *c) c->io_alloc = 1; sb->current_io_size = 1 + res->end - res->start; sb->current_mem_base = res->start; - osm_info("%s: allocated %llu bytes of PCI I/O at " - "0x%016llX.\n", c->name, - (unsigned long long)(1 + res->end - res->start), - (unsigned long long)res->start); + osm_info("%s: allocated %ld bytes of PCI I/O at 0x%08lX" + ".\n", c->name, 1 + res->end - res->start, + res->start); } } @@ -1241,6 +1239,7 @@ EXPORT_SYMBOL(i2o_cntxt_list_remove); EXPORT_SYMBOL(i2o_cntxt_list_get_ptr); #endif EXPORT_SYMBOL(i2o_msg_get_wait); +EXPORT_SYMBOL(i2o_msg_nop); EXPORT_SYMBOL(i2o_find_iop); EXPORT_SYMBOL(i2o_iop_find_device); EXPORT_SYMBOL(i2o_event_register); diff --git a/drivers/message/i2o/pci.c b/drivers/message/i2o/pci.c index 1b58444d5..4f1515cae 100644 --- a/drivers/message/i2o/pci.c +++ b/drivers/message/i2o/pci.c @@ -274,7 +274,7 @@ static int i2o_pci_irq_enable(struct i2o_controller *c) writel(0xffffffff, c->irq_mask); if (pdev->irq) { - rc = request_irq(pdev->irq, i2o_pci_interrupt, IRQF_SHARED, + rc = request_irq(pdev->irq, i2o_pci_interrupt, SA_SHIRQ, c->name, c); if (rc < 0) { printk(KERN_ERR "%s: unable to allocate interrupt %d." diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig index fc3c8854f..550f29744 100644 --- a/drivers/mfd/Kconfig +++ b/drivers/mfd/Kconfig @@ -3,7 +3,6 @@ # menu "Multimedia Capabilities Port drivers" - depends on ARCH_SA1100 config MCP tristate diff --git a/drivers/mfd/ucb1x00-core.c b/drivers/mfd/ucb1x00-core.c index 2bf32721e..aff83f966 100644 --- a/drivers/mfd/ucb1x00-core.c +++ b/drivers/mfd/ucb1x00-core.c @@ -16,6 +16,7 @@ * Note that all locks are private to this file. Nothing else may * touch them. */ +#include #include #include #include @@ -419,10 +420,8 @@ static int ucb1x00_detect_irq(struct ucb1x00 *ucb) unsigned long mask; mask = probe_irq_on(); - if (!mask) { - probe_irq_off(mask); + if (!mask) return NO_IRQ; - } /* * Enable the ADC interrupt. @@ -479,7 +478,7 @@ static int ucb1x00_probe(struct mcp *mcp) mcp_enable(mcp); id = mcp_reg_read(mcp, UCB_ID); - if (id != UCB_ID_1200 && id != UCB_ID_1300 && id != UCB_ID_TC35143) { + if (id != UCB_ID_1200 && id != UCB_ID_1300) { printk(KERN_WARNING "UCB1x00 ID not found: %04x\n", id); goto err_disable; } @@ -508,7 +507,7 @@ static int ucb1x00_probe(struct mcp *mcp) goto err_free; } - ret = request_irq(ucb->irq, ucb1x00_irq, IRQF_TRIGGER_RISING, + ret = request_irq(ucb->irq, ucb1x00_irq, SA_TRIGGER_RISING, "UCB1x00", ucb); if (ret) { printk(KERN_ERR "ucb1x00: unable to grab irq%d: %d\n", diff --git a/drivers/mfd/ucb1x00-ts.c b/drivers/mfd/ucb1x00-ts.c index 027768144..79fd062cc 100644 --- a/drivers/mfd/ucb1x00-ts.c +++ b/drivers/mfd/ucb1x00-ts.c @@ -17,6 +17,7 @@ * pin should provide pulses even when the LCD is blanked, otherwise * a pen touch needed to unblank the LCD will never be read. */ +#include #include #include #include diff --git a/drivers/mfd/ucb1x00.h b/drivers/mfd/ucb1x00.h index ca8df8072..9c9a647d8 100644 --- a/drivers/mfd/ucb1x00.h +++ b/drivers/mfd/ucb1x00.h @@ -94,7 +94,6 @@ #define UCB_ID 0x0c #define UCB_ID_1200 0x1004 #define UCB_ID_1300 0x1005 -#define UCB_ID_TC35143 0x9712 #define UCB_MODE 0x0d #define UCB_MODE_DYN_VFLAG_ENA (1 << 12) diff --git a/drivers/misc/ibmasm/heartbeat.c b/drivers/misc/ibmasm/heartbeat.c index 7fd7a43e3..f295401fa 100644 --- a/drivers/misc/ibmasm/heartbeat.c +++ b/drivers/misc/ibmasm/heartbeat.c @@ -52,13 +52,12 @@ static struct notifier_block panic_notifier = { panic_happened, NULL, 1 }; void ibmasm_register_panic_notifier(void) { - atomic_notifier_chain_register(&panic_notifier_list, &panic_notifier); + notifier_chain_register(&panic_notifier_list, &panic_notifier); } void ibmasm_unregister_panic_notifier(void) { - atomic_notifier_chain_unregister(&panic_notifier_list, - &panic_notifier); + notifier_chain_unregister(&panic_notifier_list, &panic_notifier); } diff --git a/drivers/misc/ibmasm/ibmasm.h b/drivers/misc/ibmasm/ibmasm.h index 634d538cc..6aba41954 100644 --- a/drivers/misc/ibmasm/ibmasm.h +++ b/drivers/misc/ibmasm/ibmasm.h @@ -29,6 +29,7 @@ #include #include #include +#include #include #include #include diff --git a/drivers/misc/ibmasm/ibmasmfs.c b/drivers/misc/ibmasm/ibmasmfs.c index b99dc507d..5c550fcac 100644 --- a/drivers/misc/ibmasm/ibmasmfs.c +++ b/drivers/misc/ibmasm/ibmasmfs.c @@ -90,11 +90,10 @@ static void ibmasmfs_create_files (struct super_block *sb, struct dentry *root); static int ibmasmfs_fill_super (struct super_block *sb, void *data, int silent); -static int ibmasmfs_get_super(struct file_system_type *fst, - int flags, const char *name, void *data, - struct vfsmount *mnt) +static struct super_block *ibmasmfs_get_super(struct file_system_type *fst, + int flags, const char *name, void *data) { - return get_sb_single(fst, flags, data, ibmasmfs_fill_super, mnt); + return get_sb_single(fst, flags, data, ibmasmfs_fill_super); } static struct super_operations ibmasmfs_s_ops = { @@ -102,7 +101,7 @@ static struct super_operations ibmasmfs_s_ops = { .drop_inode = generic_delete_inode, }; -static const struct file_operations *ibmasmfs_dir_ops = &simple_dir_operations; +static struct file_operations *ibmasmfs_dir_ops = &simple_dir_operations; static struct file_system_type ibmasmfs_type = { .owner = THIS_MODULE, @@ -147,6 +146,7 @@ static struct inode *ibmasmfs_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; } @@ -174,7 +174,7 @@ static struct dentry *ibmasmfs_create_file (struct super_block *sb, } inode->i_fop = fops; - inode->i_private = data; + inode->u.generic_ip = data; d_add(dentry, inode); return dentry; @@ -243,7 +243,7 @@ static int command_file_open(struct inode *inode, struct file *file) { struct ibmasmfs_command_data *command_data; - if (!inode->i_private) + if (!inode->u.generic_ip) return -ENODEV; command_data = kmalloc(sizeof(struct ibmasmfs_command_data), GFP_KERNEL); @@ -251,7 +251,7 @@ static int command_file_open(struct inode *inode, struct file *file) return -ENOMEM; command_data->command = NULL; - command_data->sp = inode->i_private; + command_data->sp = inode->u.generic_ip; file->private_data = command_data; return 0; } @@ -350,10 +350,10 @@ static int event_file_open(struct inode *inode, struct file *file) struct ibmasmfs_event_data *event_data; struct service_processor *sp; - if (!inode->i_private) + if (!inode->u.generic_ip) return -ENODEV; - sp = inode->i_private; + sp = inode->u.generic_ip; event_data = kmalloc(sizeof(struct ibmasmfs_event_data), GFP_KERNEL); if (!event_data) @@ -438,14 +438,14 @@ static int r_heartbeat_file_open(struct inode *inode, struct file *file) { struct ibmasmfs_heartbeat_data *rhbeat; - if (!inode->i_private) + if (!inode->u.generic_ip) return -ENODEV; rhbeat = kmalloc(sizeof(struct ibmasmfs_heartbeat_data), GFP_KERNEL); if (!rhbeat) return -ENOMEM; - rhbeat->sp = inode->i_private; + rhbeat->sp = (struct service_processor *)inode->u.generic_ip; rhbeat->active = 0; ibmasm_init_reverse_heartbeat(rhbeat->sp, &rhbeat->heartbeat); file->private_data = rhbeat; @@ -507,7 +507,7 @@ static ssize_t r_heartbeat_file_write(struct file *file, const char __user *buf, static int remote_settings_file_open(struct inode *inode, struct file *file) { - file->private_data = inode->i_private; + file->private_data = inode->u.generic_ip; return 0; } diff --git a/drivers/misc/ibmasm/module.c b/drivers/misc/ibmasm/module.c index 2f3bddfab..1fdf03fd2 100644 --- a/drivers/misc/ibmasm/module.c +++ b/drivers/misc/ibmasm/module.c @@ -85,7 +85,7 @@ static int __devinit ibmasm_init_one(struct pci_dev *pdev, const struct pci_devi } memset(sp, 0, sizeof(struct service_processor)); - spin_lock_init(&sp->lock); + sp->lock = SPIN_LOCK_UNLOCKED; INIT_LIST_HEAD(&sp->command_queue); pci_set_drvdata(pdev, (void *)sp); @@ -113,7 +113,7 @@ static int __devinit ibmasm_init_one(struct pci_dev *pdev, const struct pci_devi goto error_ioremap; } - result = request_irq(sp->irq, ibmasm_interrupt_handler, IRQF_SHARED, sp->devname, (void*)sp); + result = request_irq(sp->irq, ibmasm_interrupt_handler, SA_SHIRQ, sp->devname, (void*)sp); if (result) { dev_err(sp->dev, "Failed to register interrupt handler\n"); goto error_request_irq; diff --git a/drivers/mmc/Kconfig b/drivers/mmc/Kconfig index 45bcf098e..5d397b7a5 100644 --- a/drivers/mmc/Kconfig +++ b/drivers/mmc/Kconfig @@ -49,28 +49,6 @@ config MMC_PXA If unsure, say N. -config MMC_SDHCI - tristate "Secure Digital Host Controller Interface support (EXPERIMENTAL)" - depends on PCI && MMC && EXPERIMENTAL - help - This select the generic Secure Digital Host Controller Interface. - It is used by manufacturers such as Texas Instruments(R), Ricoh(R) - and Toshiba(R). Most controllers found in laptops are of this type. - If you have a controller with this interface, say Y or M here. - - If unsure, say N. - -config MMC_OMAP - tristate "TI OMAP Multimedia Card Interface support" - depends on ARCH_OMAP && MMC - select TPS65010 if MACH_OMAP_H2 - help - This selects the TI OMAP Multimedia card Interface. - If you have an OMAP board with a Multimedia Card slot, - say Y or M here. - - If unsure, say N. - config MMC_WBSD tristate "Winbond W83L51xD SD/MMC Card Interface support" depends on MMC && ISA_DMA_API @@ -84,29 +62,11 @@ config MMC_WBSD config MMC_AU1X tristate "Alchemy AU1XX0 MMC Card Interface support" - depends on MMC && SOC_AU1200 + depends on SOC_AU1X00 && MMC help This selects the AMD Alchemy(R) Multimedia card interface. If you have a Alchemy platform with a MMC slot, say Y or M here. If unsure, say N. -config MMC_AT91RM9200 - tristate "AT91RM9200 SD/MMC Card Interface support" - depends on ARCH_AT91RM9200 && MMC - help - This selects the AT91RM9200 MCI controller. - - If unsure, say N. - -config MMC_IMX - tristate "Motorola i.MX Multimedia Card Interface support" - depends on ARCH_IMX && MMC - help - This selects the Motorola i.MX Multimedia card Interface. - If you have a i.MX platform with a Multimedia Card slot, - say Y or M here. - - If unsure, say N. - endmenu diff --git a/drivers/mmc/Makefile b/drivers/mmc/Makefile index d2957e35c..e351e7114 100644 --- a/drivers/mmc/Makefile +++ b/drivers/mmc/Makefile @@ -17,15 +17,7 @@ obj-$(CONFIG_MMC_BLOCK) += mmc_block.o # obj-$(CONFIG_MMC_ARMMMCI) += mmci.o obj-$(CONFIG_MMC_PXA) += pxamci.o -obj-$(CONFIG_MMC_IMX) += imxmmc.o -obj-$(CONFIG_MMC_SDHCI) += sdhci.o obj-$(CONFIG_MMC_WBSD) += wbsd.o obj-$(CONFIG_MMC_AU1X) += au1xmmc.o -obj-$(CONFIG_MMC_OMAP) += omap.o -obj-$(CONFIG_MMC_AT91RM9200) += at91_mci.o mmc_core-y := mmc.o mmc_queue.o mmc_sysfs.o - -ifeq ($(CONFIG_MMC_DEBUG),y) -EXTRA_CFLAGS += -DDEBUG -endif diff --git a/drivers/mmc/au1xmmc.c b/drivers/mmc/au1xmmc.c index fb606165a..8d84b045b 100644 --- a/drivers/mmc/au1xmmc.c +++ b/drivers/mmc/au1xmmc.c @@ -34,6 +34,7 @@ * So we use the timer to check the status manually. */ +#include #include #include #include @@ -55,11 +56,12 @@ #define DRIVER_NAME "au1xxx-mmc" /* Set this to enable special debugging macros */ +/* #define MMC_DEBUG */ -#ifdef DEBUG -#define DBG(fmt, idx, args...) printk("au1xx(%d): DEBUG: " fmt, idx, ##args) +#ifdef MMC_DEBUG +#define DEBUG(fmt, idx, args...) printk("au1xx(%d): DEBUG: " fmt, idx, ##args) #else -#define DBG(fmt, idx, args...) +#define DEBUG(fmt, idx, args...) #endif const struct { @@ -85,7 +87,7 @@ struct au1xmmc_host *au1xmmc_hosts[AU1XMMC_CONTROLLER_COUNT]; static int dma = 1; #ifdef MODULE -module_param(dma, bool, 0); +MODULE_PARM(dma, "i"); MODULE_PARM_DESC(dma, "Use DMA engine for data transfers (0 = disabled)"); #endif @@ -309,7 +311,7 @@ static void au1xmmc_data_complete(struct au1xmmc_host *host, u32 status) } else data->bytes_xfered = - (data->blocks * data->blksz) - + (data->blocks * (1 << data->blksz_bits)) - host->pio.len; } @@ -422,18 +424,18 @@ static void au1xmmc_receive_pio(struct au1xmmc_host *host) break; if (status & SD_STATUS_RC) { - DBG("RX CRC Error [%d + %d].\n", host->id, + DEBUG("RX CRC Error [%d + %d].\n", host->id, host->pio.len, count); break; } if (status & SD_STATUS_RO) { - DBG("RX Overrun [%d + %d]\n", host->id, + DEBUG("RX Overrun [%d + %d]\n", host->id, host->pio.len, count); break; } else if (status & SD_STATUS_RU) { - DBG("RX Underrun [%d + %d]\n", host->id, + DEBUG("RX Underrun [%d + %d]\n", host->id, host->pio.len, count); break; } @@ -574,7 +576,7 @@ static int au1xmmc_prepare_data(struct au1xmmc_host *host, struct mmc_data *data) { - int datalen = data->blocks * data->blksz; + int datalen = data->blocks * (1 << data->blksz_bits); if (dma != 0) host->flags |= HOST_F_DMA; @@ -595,7 +597,7 @@ au1xmmc_prepare_data(struct au1xmmc_host *host, struct mmc_data *data) if (host->dma.len == 0) return MMC_ERR_TIMEOUT; - au_writel(data->blksz - 1, HOST_BLKSIZE(host)); + au_writel((1 << data->blksz_bits) - 1, HOST_BLKSIZE(host)); if (host->flags & HOST_F_DMA) { int i; @@ -719,6 +721,10 @@ static void au1xmmc_set_ios(struct mmc_host* mmc, struct mmc_ios* ios) { struct au1xmmc_host *host = mmc_priv(mmc); + DEBUG("set_ios (power=%u, clock=%uHz, vdd=%u, mode=%u)\n", + host->id, ios->power_mode, ios->clock, ios->vdd, + ios->bus_mode); + if (ios->power_mode == MMC_POWER_OFF) au1xmmc_set_power(host, 0); else if (ios->power_mode == MMC_POWER_ON) { @@ -804,7 +810,7 @@ static irqreturn_t au1xmmc_irq(int irq, void *dev_id, struct pt_regs *regs) au1xmmc_receive_pio(host); } else if (status & 0x203FBC70) { - DBG("Unhandled status %8.8x\n", host->id, status); + DEBUG("Unhandled status %8.8x\n", host->id, status); handled = 0; } @@ -833,7 +839,7 @@ static void au1xmmc_poll_event(unsigned long arg) if (host->mrq != NULL) { u32 status = au_readl(HOST_STATUS(host)); - DBG("PENDING - %8.8x\n", host->id, status); + DEBUG("PENDING - %8.8x\n", host->id, status); } mod_timer(&host->timer, jiffies + AU1XMMC_DETECT_TIMEOUT); @@ -886,7 +892,7 @@ static int __devinit au1xmmc_probe(struct platform_device *pdev) int i, ret = 0; /* THe interrupt is shared among all controllers */ - ret = request_irq(AU1100_SD_IRQ, au1xmmc_irq, IRQF_DISABLED, "MMC", 0); + ret = request_irq(AU1100_SD_IRQ, au1xmmc_irq, SA_INTERRUPT, "MMC", 0); if (ret) { printk(DRIVER_NAME "ERROR: Couldn't get int %d: %d\n", diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c index 74eaaee66..1888060c5 100644 --- a/drivers/mmc/mmc.c +++ b/drivers/mmc/mmc.c @@ -9,6 +9,7 @@ * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. */ +#include #include #include #include @@ -26,6 +27,12 @@ #include "mmc.h" +#ifdef CONFIG_MMC_DEBUG +#define DBG(x...) printk(KERN_DEBUG x) +#else +#define DBG(x...) do { } while (0) +#endif + #define CMD_RETRIES 3 /* @@ -58,23 +65,20 @@ static const unsigned int tacc_mant[] = { /** - * mmc_request_done - finish processing an MMC request - * @host: MMC host which completed request - * @mrq: MMC request which request + * mmc_request_done - finish processing an MMC command + * @host: MMC host which completed command + * @mrq: MMC request which completed * * MMC drivers should call this function when they have completed - * their processing of a request. + * their processing of a command. This should be called before the + * data part of the command has completed. */ void mmc_request_done(struct mmc_host *host, struct mmc_request *mrq) { struct mmc_command *cmd = mrq->cmd; - int err = cmd->error; - - pr_debug("%s: req done (CMD%u): %d/%d/%d: %08x %08x %08x %08x\n", - mmc_hostname(host), cmd->opcode, err, - mrq->data ? mrq->data->error : 0, - mrq->stop ? mrq->stop->error : 0, - cmd->resp[0], cmd->resp[1], cmd->resp[2], cmd->resp[3]); + int err = mrq->cmd->error; + DBG("MMC: req done (%02x): %d: %08x %08x %08x %08x\n", cmd->opcode, + err, cmd->resp[0], cmd->resp[1], cmd->resp[2], cmd->resp[3]); if (err && cmd->retries) { cmd->retries--; @@ -98,9 +102,8 @@ EXPORT_SYMBOL(mmc_request_done); void mmc_start_request(struct mmc_host *host, struct mmc_request *mrq) { - pr_debug("%s: starting CMD%u arg %08x flags %08x\n", - mmc_hostname(host), mrq->cmd->opcode, - mrq->cmd->arg, mrq->cmd->flags); + DBG("MMC: starting cmd %02x arg %08x flags %08x\n", + mrq->cmd->opcode, mrq->cmd->arg, mrq->cmd->flags); WARN_ON(host->card_busy == NULL); @@ -128,7 +131,7 @@ static void mmc_wait_done(struct mmc_request *mrq) int mmc_wait_for_req(struct mmc_host *host, struct mmc_request *mrq) { - DECLARE_COMPLETION_ONSTACK(complete); + DECLARE_COMPLETION(complete); mrq->done_data = &complete; mrq->done = mmc_wait_done; @@ -247,55 +250,6 @@ int mmc_wait_for_app_cmd(struct mmc_host *host, unsigned int rca, EXPORT_SYMBOL(mmc_wait_for_app_cmd); -/** - * mmc_set_data_timeout - set the timeout for a data command - * @data: data phase for command - * @card: the MMC card associated with the data transfer - * @write: flag to differentiate reads from writes - */ -void mmc_set_data_timeout(struct mmc_data *data, const struct mmc_card *card, - int write) -{ - unsigned int mult; - - /* - * SD cards use a 100 multiplier rather than 10 - */ - mult = mmc_card_sd(card) ? 100 : 10; - - /* - * Scale up the multiplier (and therefore the timeout) by - * the r2w factor for writes. - */ - if (write) - mult <<= card->csd.r2w_factor; - - data->timeout_ns = card->csd.tacc_ns * mult; - data->timeout_clks = card->csd.tacc_clks * mult; - - /* - * SD cards also have an upper limit on the timeout. - */ - if (mmc_card_sd(card)) { - unsigned int timeout_us, limit_us; - - timeout_us = data->timeout_ns / 1000; - timeout_us += data->timeout_clks * 1000 / - (card->host->ios.clock / 1000); - - if (write) - limit_us = 250000; - else - limit_us = 100000; - - if (timeout_us > limit_us) { - data->timeout_ns = limit_us * 1000; - data->timeout_clks = 0; - } - } -} -EXPORT_SYMBOL(mmc_set_data_timeout); - static int mmc_select_card(struct mmc_host *host, struct mmc_card *card); /** @@ -363,18 +317,6 @@ void mmc_release_host(struct mmc_host *host) EXPORT_SYMBOL(mmc_release_host); -static inline void mmc_set_ios(struct mmc_host *host) -{ - struct mmc_ios *ios = &host->ios; - - pr_debug("%s: clock %uHz busmode %u powermode %u cs %u Vdd %u width %u\n", - mmc_hostname(host), ios->clock, ios->bus_mode, - ios->power_mode, ios->chip_select, ios->vdd, - ios->bus_width); - - host->ops->set_ios(host, ios); -} - static int mmc_select_card(struct mmc_host *host, struct mmc_card *card) { int err; @@ -427,7 +369,7 @@ static int mmc_select_card(struct mmc_host *host, struct mmc_card *card) } } - mmc_set_ios(host); + host->ops->set_ios(host, &host->ios); return MMC_ERR_NONE; } @@ -478,7 +420,7 @@ static u32 mmc_select_voltage(struct mmc_host *host, u32 ocr) ocr = 3 << bit; host->ios.vdd = bit; - mmc_set_ios(host); + host->ops->set_ios(host, &host->ios); } else { ocr = 0; } @@ -612,7 +554,6 @@ static void mmc_decode_csd(struct mmc_card *card) csd->read_partial = UNSTUFF_BITS(resp, 79, 1); csd->write_misalign = UNSTUFF_BITS(resp, 78, 1); csd->read_misalign = UNSTUFF_BITS(resp, 77, 1); - csd->r2w_factor = UNSTUFF_BITS(resp, 26, 3); csd->write_blkbits = UNSTUFF_BITS(resp, 22, 4); csd->write_partial = UNSTUFF_BITS(resp, 21, 1); } else { @@ -647,7 +588,6 @@ static void mmc_decode_csd(struct mmc_card *card) csd->read_partial = UNSTUFF_BITS(resp, 79, 1); csd->write_misalign = UNSTUFF_BITS(resp, 78, 1); csd->read_misalign = UNSTUFF_BITS(resp, 77, 1); - csd->r2w_factor = UNSTUFF_BITS(resp, 26, 3); csd->write_blkbits = UNSTUFF_BITS(resp, 22, 4); csd->write_partial = UNSTUFF_BITS(resp, 21, 1); } @@ -731,7 +671,7 @@ static void mmc_idle_cards(struct mmc_host *host) struct mmc_command cmd; host->ios.chip_select = MMC_CS_HIGH; - mmc_set_ios(host); + host->ops->set_ios(host, &host->ios); mmc_delay(1); @@ -744,7 +684,7 @@ static void mmc_idle_cards(struct mmc_host *host) mmc_delay(1); host->ios.chip_select = MMC_CS_DONTCARE; - mmc_set_ios(host); + host->ops->set_ios(host, &host->ios); mmc_delay(1); } @@ -769,13 +709,13 @@ static void mmc_power_up(struct mmc_host *host) host->ios.chip_select = MMC_CS_DONTCARE; host->ios.power_mode = MMC_POWER_UP; host->ios.bus_width = MMC_BUS_WIDTH_1; - mmc_set_ios(host); + host->ops->set_ios(host, &host->ios); mmc_delay(1); host->ios.clock = host->f_min; host->ios.power_mode = MMC_POWER_ON; - mmc_set_ios(host); + host->ops->set_ios(host, &host->ios); mmc_delay(2); } @@ -788,7 +728,7 @@ static void mmc_power_off(struct mmc_host *host) host->ios.chip_select = MMC_CS_DONTCARE; host->ios.power_mode = MMC_POWER_OFF; host->ios.bus_width = MMC_BUS_WIDTH_1; - mmc_set_ios(host); + host->ops->set_ios(host, &host->ios); } static int mmc_send_op_cond(struct mmc_host *host, u32 ocr, u32 *rocr) @@ -957,9 +897,11 @@ static void mmc_read_scrs(struct mmc_host *host) { int err; struct mmc_card *card; + struct mmc_request mrq; struct mmc_command cmd; struct mmc_data data; + struct scatterlist sg; list_for_each_entry(card, &host->cards, node) { @@ -994,10 +936,9 @@ static void mmc_read_scrs(struct mmc_host *host) memset(&data, 0, sizeof(struct mmc_data)); - mmc_set_data_timeout(&data, card, 0); - + data.timeout_ns = card->csd.tacc_ns * 10; + data.timeout_clks = card->csd.tacc_clks * 10; data.blksz_bits = 3; - data.blksz = 1 << 3; data.blocks = 1; data.flags = MMC_DATA_READ; data.sg = &sg; @@ -1035,9 +976,8 @@ static unsigned int mmc_calculate_clock(struct mmc_host *host) if (!mmc_card_dead(card) && max_dtr > card->csd.max_dtr) max_dtr = card->csd.max_dtr; - pr_debug("%s: selected %d.%03dMHz transfer rate\n", - mmc_hostname(host), - max_dtr / 1000000, (max_dtr / 1000) % 1000); + DBG("MMC: selected %d.%03dMHz transfer rate\n", + max_dtr / 1000000, (max_dtr / 1000) % 1000); return max_dtr; } @@ -1111,7 +1051,7 @@ static void mmc_setup(struct mmc_host *host) } else { host->ios.bus_mode = MMC_BUSMODE_OPENDRAIN; host->ios.clock = host->f_min; - mmc_set_ios(host); + host->ops->set_ios(host, &host->ios); /* * We should remember the OCR mask from the existing @@ -1147,7 +1087,7 @@ static void mmc_setup(struct mmc_host *host) * Ok, now switch to push-pull mode. */ host->ios.bus_mode = MMC_BUSMODE_PUSHPULL; - mmc_set_ios(host); + host->ops->set_ios(host, &host->ios); mmc_read_csds(host); @@ -1193,7 +1133,7 @@ static void mmc_rescan(void *data) * attached cards and the host support. */ host->ios.clock = mmc_calculate_clock(host); - mmc_set_ios(host); + host->ops->set_ios(host, &host->ios); } mmc_release_host(host); diff --git a/drivers/mmc/mmc_block.c b/drivers/mmc/mmc_block.c index a0e0dad1b..79b2eff2b 100644 --- a/drivers/mmc/mmc_block.c +++ b/drivers/mmc/mmc_block.c @@ -27,10 +27,10 @@ #include #include #include +#include #include #include -#include #include #include @@ -172,15 +172,14 @@ static int mmc_blk_issue_rq(struct mmc_queue *mq, struct request *req) brq.cmd.arg = req->sector << 9; brq.cmd.flags = MMC_RSP_R1 | MMC_CMD_ADTC; + brq.data.timeout_ns = card->csd.tacc_ns * 10; + brq.data.timeout_clks = card->csd.tacc_clks * 10; brq.data.blksz_bits = md->block_bits; - brq.data.blksz = 1 << md->block_bits; brq.data.blocks = req->nr_sectors >> (md->block_bits - 9); brq.stop.opcode = MMC_STOP_TRANSMISSION; brq.stop.arg = 0; brq.stop.flags = MMC_RSP_R1B | MMC_CMD_AC; - mmc_set_data_timeout(&brq.data, card, rq_data_dir(req) != READ); - if (rq_data_dir(req) == READ) { brq.cmd.opcode = brq.data.blocks > 1 ? MMC_READ_MULTIPLE_BLOCK : MMC_READ_SINGLE_BLOCK; brq.data.flags |= MMC_DATA_READ; @@ -362,6 +361,7 @@ static struct mmc_blk_data *mmc_blk_alloc(struct mmc_card *card) */ sprintf(md->disk->disk_name, "mmcblk%d", devidx); + sprintf(md->disk->devfs_name, "mmc/blk%d", devidx); blk_queue_hardsect_size(md->queue.queue, 1 << md->block_bits); @@ -507,6 +507,7 @@ static int __init mmc_blk_init(void) if (major == 0) major = res; + devfs_mk_dir("mmc"); return mmc_register_driver(&mmc_driver); out: @@ -516,6 +517,7 @@ static int __init mmc_blk_init(void) static void __exit mmc_blk_exit(void) { mmc_unregister_driver(&mmc_driver); + devfs_remove("mmc"); unregister_blkdev(major, "mmc"); } diff --git a/drivers/mmc/mmc_queue.c b/drivers/mmc/mmc_queue.c index 74f8cdeef..0b9682e9a 100644 --- a/drivers/mmc/mmc_queue.c +++ b/drivers/mmc/mmc_queue.c @@ -79,8 +79,7 @@ static int mmc_queue_thread(void *d) spin_lock_irq(q->queue_lock); set_current_state(TASK_INTERRUPTIBLE); if (!blk_queue_plugged(q)) - req = elv_next_request(q); - mq->req = req; + mq->req = req = elv_next_request(q); spin_unlock_irq(q->queue_lock); if (!req) { diff --git a/drivers/mmc/mmci.c b/drivers/mmc/mmci.c index 1886562ab..9fef29d97 100644 --- a/drivers/mmc/mmci.c +++ b/drivers/mmc/mmci.c @@ -7,6 +7,7 @@ * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. */ +#include #include #include #include @@ -32,8 +33,12 @@ #define DRIVER_NAME "mmci-pl18x" +#ifdef CONFIG_MMC_DEBUG #define DBG(host,fmt,args...) \ pr_debug("%s: %s: " fmt, mmc_hostname(host->mmc), __func__ , args) +#else +#define DBG(host,fmt,args...) do { } while (0) +#endif static unsigned int fmax = 515633; @@ -401,6 +406,9 @@ static void mmci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) struct mmci_host *host = mmc_priv(mmc); u32 clk = 0, pwr = 0; + DBG(host, "clock %uHz busmode %u powermode %u Vdd %u\n", + ios->clock, ios->bus_mode, ios->power_mode, ios->vdd); + if (ios->clock) { if (ios->clock >= host->mclk) { clk = MCI_CLK_BYPASS; @@ -531,11 +539,11 @@ static int mmci_probe(struct amba_device *dev, void *id) writel(0, host->base + MMCIMASK1); writel(0xfff, host->base + MMCICLEAR); - ret = request_irq(dev->irq[0], mmci_irq, IRQF_SHARED, DRIVER_NAME " (cmd)", host); + ret = request_irq(dev->irq[0], mmci_irq, SA_SHIRQ, DRIVER_NAME " (cmd)", host); if (ret) goto unmap; - ret = request_irq(dev->irq[1], mmci_pio_irq, IRQF_SHARED, DRIVER_NAME " (pio)", host); + ret = request_irq(dev->irq[1], mmci_pio_irq, SA_SHIRQ, DRIVER_NAME " (pio)", host); if (ret) goto irq0_free; @@ -545,9 +553,9 @@ static int mmci_probe(struct amba_device *dev, void *id) mmc_add_host(mmc); - printk(KERN_INFO "%s: MMCI rev %x cfg %02x at 0x%016llx irq %d,%d\n", + printk(KERN_INFO "%s: MMCI rev %x cfg %02x at 0x%08lx irq %d,%d\n", mmc_hostname(mmc), amba_rev(dev), amba_config(dev), - (unsigned long long)dev->res.start, dev->irq[0], dev->irq[1]); + dev->res.start, dev->irq[0], dev->irq[1]); init_timer(&host->timer); host->timer.data = (unsigned long)host; diff --git a/drivers/mmc/pxamci.c b/drivers/mmc/pxamci.c index ef3509084..285d7d068 100644 --- a/drivers/mmc/pxamci.c +++ b/drivers/mmc/pxamci.c @@ -16,6 +16,7 @@ * 1 and 3 byte data transfers not supported * max block length up to 1023 */ +#include #include #include #include @@ -36,6 +37,12 @@ #include "pxamci.h" +#ifdef CONFIG_MMC_DEBUG +#define DBG(x...) printk(KERN_DEBUG x) +#else +#define DBG(x...) do { } while (0) +#endif + #define DRIVER_NAME "pxa2xx-mci" #define NR_SG 1 @@ -64,6 +71,11 @@ struct pxamci_host { unsigned int dma_dir; }; +static inline unsigned int ns_to_clocks(unsigned int ns) +{ + return (ns * (CLOCKRATE / 1000000) + 999) / 1000; +} + static void pxamci_stop_clock(struct pxamci_host *host) { if (readl(host->base + MMC_STAT) & STAT_CLK_EN) { @@ -107,7 +119,6 @@ static void pxamci_disable_irq(struct pxamci_host *host, unsigned int mask) static void pxamci_setup_data(struct pxamci_host *host, struct mmc_data *data) { unsigned int nob = data->blocks; - unsigned long long clks; unsigned int timeout; u32 dcmd; int i; @@ -118,11 +129,9 @@ static void pxamci_setup_data(struct pxamci_host *host, struct mmc_data *data) nob = 0xffff; writel(nob, host->base + MMC_NOB); - writel(data->blksz, host->base + MMC_BLKLEN); + writel(1 << data->blksz_bits, host->base + MMC_BLKLEN); - clks = (unsigned long long)data->timeout_ns * CLOCKRATE; - do_div(clks, 1000000000UL); - timeout = (unsigned int)clks + (data->timeout_clks << host->clkrt); + timeout = ns_to_clocks(data->timeout_ns) + data->timeout_clks; writel((timeout + 255) / 256, host->base + MMC_RDTO); if (data->flags & MMC_DATA_READ) { @@ -197,6 +206,7 @@ static void pxamci_start_cmd(struct pxamci_host *host, struct mmc_command *cmd, static void pxamci_finish_request(struct pxamci_host *host, struct mmc_request *mrq) { + DBG("PXAMCI: request done\n"); host->mrq = NULL; host->cmd = NULL; host->data = NULL; @@ -242,7 +252,7 @@ static int pxamci_cmd_done(struct pxamci_host *host, unsigned int stat) if ((cmd->resp[0] & 0x80000000) == 0) cmd->error = MMC_ERR_BADCRC; } else { - pr_debug("ignoring CRC from command %d - *risky*\n",cmd->opcode); + DBG("ignoring CRC from command %d - *risky*\n",cmd->opcode); } #else cmd->error = MMC_ERR_BADCRC; @@ -282,14 +292,14 @@ static int pxamci_data_done(struct pxamci_host *host, unsigned int stat) * data blocks as being in error. */ if (data->error == MMC_ERR_NONE) - data->bytes_xfered = data->blocks * data->blksz; + data->bytes_xfered = data->blocks << data->blksz_bits; else data->bytes_xfered = 0; pxamci_disable_irq(host, DATA_TRAN_DONE); host->data = NULL; - if (host->mrq->stop) { + if (host->mrq->stop && data->error == MMC_ERR_NONE) { pxamci_stop_clock(host); pxamci_start_cmd(host, host->mrq->stop, 0); } else { @@ -307,10 +317,12 @@ static irqreturn_t pxamci_irq(int irq, void *devid, struct pt_regs *regs) ireg = readl(host->base + MMC_I_REG); + DBG("PXAMCI: irq %08x\n", ireg); + if (ireg) { unsigned stat = readl(host->base + MMC_STAT); - pr_debug("PXAMCI: irq %08x stat %08x\n", ireg, stat); + DBG("PXAMCI: stat %08x\n", stat); if (ireg & END_CMD_RES) handled |= pxamci_cmd_done(host, stat); @@ -364,6 +376,10 @@ static void pxamci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) { struct pxamci_host *host = mmc_priv(mmc); + DBG("pxamci_set_ios: clock %u power %u vdd %u.%02u\n", + ios->clock, ios->power_mode, ios->vdd / 100, + ios->vdd % 100); + if (ios->clock) { unsigned int clk = CLOCKRATE / ios->clock; if (CLOCKRATE / clk > ios->clock) @@ -389,8 +405,8 @@ static void pxamci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) host->cmdat |= CMDAT_INIT; } - pr_debug("PXAMCI: clkrt = %x cmdat = %x\n", - host->clkrt, host->cmdat); + DBG("pxamci_set_ios: clkrt = %x cmdat = %x\n", + host->clkrt, host->cmdat); } static struct mmc_host_ops pxamci_ops = { @@ -422,7 +438,7 @@ static int pxamci_probe(struct platform_device *pdev) r = platform_get_resource(pdev, IORESOURCE_MEM, 0); irq = platform_get_irq(pdev, 0); - if (!r || irq < 0) + if (!r || irq == NO_IRQ) return -ENXIO; r = request_mem_region(r->start, SZ_4K, DRIVER_NAME); diff --git a/drivers/mmc/wbsd.c b/drivers/mmc/wbsd.c index c351c6d1a..3be397d43 100644 --- a/drivers/mmc/wbsd.c +++ b/drivers/mmc/wbsd.c @@ -21,6 +21,7 @@ * - On APIC systems the FIFO empty interrupt is sometimes lost. */ +#include #include #include #include @@ -41,12 +42,17 @@ #include "wbsd.h" #define DRIVER_NAME "wbsd" -#define DRIVER_VERSION "1.6" +#define DRIVER_VERSION "1.5" +#ifdef CONFIG_MMC_DEBUG #define DBG(x...) \ - pr_debug(DRIVER_NAME ": " x) + printk(KERN_DEBUG DRIVER_NAME ": " x) #define DBGF(f, x...) \ - pr_debug(DRIVER_NAME " [%s()]: " f, __func__ , ##x) + printk(KERN_DEBUG DRIVER_NAME " [%s()]: " f, __func__ , ##x) +#else +#define DBG(x...) do { } while (0) +#define DBGF(x...) do { } while (0) +#endif /* * Device resources @@ -661,14 +667,14 @@ static void wbsd_prepare_data(struct wbsd_host *host, struct mmc_data *data) unsigned long dmaflags; DBGF("blksz %04x blks %04x flags %08x\n", - data->blksz, data->blocks, data->flags); + 1 << data->blksz_bits, data->blocks, data->flags); DBGF("tsac %d ms nsac %d clk\n", data->timeout_ns / 1000000, data->timeout_clks); /* * Calculate size. */ - host->size = data->blocks * data->blksz; + host->size = data->blocks << data->blksz_bits; /* * Check timeout values for overflow. @@ -695,12 +701,12 @@ static void wbsd_prepare_data(struct wbsd_host *host, struct mmc_data *data) * Two bytes are needed for each data line. */ if (host->bus_width == MMC_BUS_WIDTH_1) { - blksize = data->blksz + 2; + blksize = (1 << data->blksz_bits) + 2; wbsd_write_index(host, WBSD_IDX_PBSMSB, (blksize >> 4) & 0xF0); wbsd_write_index(host, WBSD_IDX_PBSLSB, blksize & 0xFF); } else if (host->bus_width == MMC_BUS_WIDTH_4) { - blksize = data->blksz + 2 * 4; + blksize = (1 << data->blksz_bits) + 2 * 4; wbsd_write_index(host, WBSD_IDX_PBSMSB, ((blksize >> 4) & 0xF0) | WBSD_DATA_WIDTH); @@ -930,6 +936,10 @@ static void wbsd_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) struct wbsd_host *host = mmc_priv(mmc); u8 clk, setup, pwr; + DBGF("clock %uHz busmode %u powermode %u cs %u Vdd %u width %u\n", + ios->clock, ios->bus_mode, ios->power_mode, ios->chip_select, + ios->vdd, ios->bus_width); + spin_lock_bh(&host->lock); /* @@ -1439,13 +1449,13 @@ static int __devinit wbsd_scan(struct wbsd_host *host) static int __devinit wbsd_request_region(struct wbsd_host *host, int base) { - if (base & 0x7) + if (io & 0x7) return -EINVAL; if (!request_region(base, 8, DRIVER_NAME)) return -EIO; - host->base = base; + host->base = io; return 0; } @@ -1553,7 +1563,7 @@ static int __devinit wbsd_request_irq(struct wbsd_host *host, int irq) * Allocate interrupt. */ - ret = request_irq(irq, wbsd_irq, IRQF_SHARED, DRIVER_NAME, host); + ret = request_irq(irq, wbsd_irq, SA_SHIRQ, DRIVER_NAME, host); if (ret) return ret; @@ -1773,7 +1783,7 @@ static int __devinit wbsd_init(struct device *dev, int base, int irq, int dma, /* * Request resources. */ - ret = wbsd_request_resources(host, base, irq, dma); + ret = wbsd_request_resources(host, io, irq, dma); if (ret) { wbsd_release_resources(host); wbsd_free_mmc(dev); @@ -1861,7 +1871,6 @@ static void __devexit wbsd_shutdown(struct device *dev, int pnp) static int __devinit wbsd_probe(struct platform_device *dev) { - /* Use the module parameters for resources */ return wbsd_init(&dev->dev, io, irq, dma, 0); } diff --git a/drivers/mtd/Kconfig b/drivers/mtd/Kconfig index 1344ad7a4..f6b775e63 100644 --- a/drivers/mtd/Kconfig +++ b/drivers/mtd/Kconfig @@ -78,7 +78,7 @@ config MTD_REDBOOT_DIRECTORY_BLOCK option. The option specifies which Flash sectors holds the RedBoot - partition table. A zero or positive value gives an absolute + partition table. A zero or positive value gives an absolete erase block number. A negative value specifies a number of sectors before the end of the device. @@ -86,14 +86,14 @@ config MTD_REDBOOT_DIRECTORY_BLOCK block and "-2" means the penultimate block. config MTD_REDBOOT_PARTS_UNALLOCATED - bool "Include unallocated flash regions" + bool " Include unallocated flash regions" depends on MTD_REDBOOT_PARTS help If you need to register each unallocated flash region as a MTD 'partition', enable this option. config MTD_REDBOOT_PARTS_READONLY - bool "Force read-only for RedBoot system images" + bool " Force read-only for RedBoot system images" depends on MTD_REDBOOT_PARTS help If you need to force read-only for 'RedBoot', 'RedBoot Config' and @@ -103,7 +103,7 @@ config MTD_CMDLINE_PARTS bool "Command line partition table parsing" depends on MTD_PARTITIONS = "y" ---help--- - Allow generic configuration of the MTD partition tables via the kernel + Allow generic configuration of the MTD paritition tables via the kernel command line. Multiple flash resources are supported for hardware where different kinds of flash memory are available. diff --git a/drivers/mtd/chips/Kconfig b/drivers/mtd/chips/Kconfig index 6d8f30deb..205bb7083 100644 --- a/drivers/mtd/chips/Kconfig +++ b/drivers/mtd/chips/Kconfig @@ -25,11 +25,13 @@ config MTD_JEDECPROBE compatible with the Common Flash Interface, but will use the common CFI-targetted flash drivers for any chips which are identified which are in fact compatible in all but the probe method. This actually - covers most AMD/Fujitsu-compatible chips and also non-CFI - Intel chips. + covers most AMD/Fujitsu-compatible chips, and will shortly cover also + non-CFI Intel chips (that code is in MTD CVS and should shortly be sent + for inclusion in Linus' tree) config MTD_GEN_PROBE tristate + select OBSOLETE_INTERMODULE config MTD_CFI_ADV_OPTIONS bool "Flash chip driver advanced configuration options" @@ -199,6 +201,27 @@ config MTD_CFI_AMDSTD provides support for one of those command sets, used on chips including the AMD Am29LV320. +config MTD_CFI_AMDSTD_RETRY + int "Retry failed commands (erase/program)" + depends on MTD_CFI_AMDSTD + default "0" + help + Some chips, when attached to a shared bus, don't properly filter + bus traffic that is destined to other devices. This broken + behavior causes erase and program sequences to be aborted when + the sequences are mixed with traffic for other devices. + + SST49LF040 (and related) chips are know to be broken. + +config MTD_CFI_AMDSTD_RETRY_MAX + int "Max retries of failed commands (erase/program)" + depends on MTD_CFI_AMDSTD_RETRY + default "0" + help + If you have an SST49LF040 (or related chip) then this value should + be set to at least 1. This can also be adjusted at driver load + time with the retry_cmd_max module parameter. + config MTD_CFI_STAA tristate "Support for ST (Advanced Architecture) flash chips" depends on MTD_GEN_PROBE diff --git a/drivers/mtd/chips/Makefile b/drivers/mtd/chips/Makefile index 75bc1c2a0..8afe3092c 100644 --- a/drivers/mtd/chips/Makefile +++ b/drivers/mtd/chips/Makefile @@ -3,6 +3,13 @@ # # $Id: Makefile.common,v 1.5 2005/11/07 11:14:22 gleixner Exp $ +# *** BIG UGLY NOTE *** +# +# The removal of get_module_symbol() and replacement with +# inter_module_register() et al has introduced a link order dependency +# here where previously there was none. We now have to ensure that +# the CFI command set drivers are linked before gen_probe.o + obj-$(CONFIG_MTD) += chipreg.o obj-$(CONFIG_MTD_AMDSTD) += amd_flash.o obj-$(CONFIG_MTD_CFI) += cfi_probe.o diff --git a/drivers/mtd/chips/amd_flash.c b/drivers/mtd/chips/amd_flash.c index 16eaca69f..fdb91b6f1 100644 --- a/drivers/mtd/chips/amd_flash.c +++ b/drivers/mtd/chips/amd_flash.c @@ -97,6 +97,7 @@ struct amd_flash_private { int interleave; int numchips; unsigned long chipshift; +// const char *im_name; struct flchip chips[0]; }; @@ -130,6 +131,12 @@ static struct mtd_chip_driver amd_flash_chipdrv = { .module = THIS_MODULE }; + + +static const char im_name[] = "amd_flash"; + + + static inline __u32 wide_read(struct map_info *map, __u32 addr) { if (map->buswidth == 1) { @@ -657,7 +664,7 @@ static struct mtd_info *amd_flash_probe(struct map_info *map) printk("%s: Probing for AMD compatible flash...\n", map->name); if ((table_pos[0] = probe_new_chip(mtd, 0, NULL, &temp, table, - ARRAY_SIZE(table))) + sizeof(table)/sizeof(table[0]))) == -1) { printk(KERN_WARNING "%s: Found no AMD compatible device at location zero\n", @@ -689,7 +696,7 @@ static struct mtd_info *amd_flash_probe(struct map_info *map) base += (1 << temp.chipshift)) { int numchips = temp.numchips; table_pos[numchips] = probe_new_chip(mtd, base, chips, - &temp, table, ARRAY_SIZE(table)); + &temp, table, sizeof(table)/sizeof(table[0])); } mtd->eraseregions = kmalloc(sizeof(struct mtd_erase_region_info) * @@ -730,7 +737,6 @@ static struct mtd_info *amd_flash_probe(struct map_info *map) offset += dev_size; } mtd->type = MTD_NORFLASH; - mtd->writesize = 1; mtd->flags = MTD_CAP_NORFLASH; mtd->name = map->name; mtd->erase = amd_flash_erase; diff --git a/drivers/mtd/chips/cfi_cmdset_0001.c b/drivers/mtd/chips/cfi_cmdset_0001.c index 7ea49a0d5..1c074d63f 100644 --- a/drivers/mtd/chips/cfi_cmdset_0001.c +++ b/drivers/mtd/chips/cfi_cmdset_0001.c @@ -331,6 +331,13 @@ read_pri_intelext(struct map_info *map, __u16 adr) return extp; } +/* This routine is made available to other mtd code via + * inter_module_register. It must only be accessed through + * inter_module_get which will bump the use count of this module. The + * addresses passed back in cfi are valid as long as the use count of + * this module is non-zero, i.e. between inter_module_get and + * inter_module_put. Keith Owens 29 Oct 2000. + */ struct mtd_info *cfi_cmdset_0001(struct map_info *map, int primary) { struct cfi_private *cfi = map->fldrv_priv; @@ -357,7 +364,6 @@ struct mtd_info *cfi_cmdset_0001(struct map_info *map, int primary) mtd->resume = cfi_intelext_resume; mtd->flags = MTD_CAP_NORFLASH; mtd->name = map->name; - mtd->writesize = 1; mtd->reboot_notifier.notifier_call = cfi_intelext_reboot; @@ -400,7 +406,7 @@ struct mtd_info *cfi_cmdset_0001(struct map_info *map, int primary) for (i=0; i< cfi->numchips; i++) { cfi->chips[i].word_write_time = 1<cfiq->WordWriteTimeoutTyp; cfi->chips[i].buffer_write_time = 1<cfiq->BufWriteTimeoutTyp; - cfi->chips[i].erase_time = 1000<cfiq->BlockEraseTimeoutTyp; + cfi->chips[i].erase_time = 1<cfiq->BlockEraseTimeoutTyp; cfi->chips[i].ref_point_counter = 0; init_waitqueue_head(&(cfi->chips[i].wq)); } @@ -409,11 +415,6 @@ struct mtd_info *cfi_cmdset_0001(struct map_info *map, int primary) return cfi_intelext_setup(mtd); } -struct mtd_info *cfi_cmdset_0003(struct map_info *map, int primary) __attribute__((alias("cfi_cmdset_0001"))); -struct mtd_info *cfi_cmdset_0200(struct map_info *map, int primary) __attribute__((alias("cfi_cmdset_0001"))); -EXPORT_SYMBOL_GPL(cfi_cmdset_0001); -EXPORT_SYMBOL_GPL(cfi_cmdset_0003); -EXPORT_SYMBOL_GPL(cfi_cmdset_0200); static struct mtd_info *cfi_intelext_setup(struct mtd_info *mtd) { @@ -546,12 +547,12 @@ static int cfi_intelext_partition_fixup(struct mtd_info *mtd, if (extp->MinorVersion >= '4') { struct cfi_intelext_programming_regioninfo *prinfo; prinfo = (struct cfi_intelext_programming_regioninfo *)&extp->extra[offs]; - mtd->writesize = cfi->interleave << prinfo->ProgRegShift; + MTD_PROGREGION_SIZE(mtd) = cfi->interleave << prinfo->ProgRegShift; MTD_PROGREGION_CTRLMODE_VALID(mtd) = cfi->interleave * prinfo->ControlValid; MTD_PROGREGION_CTRLMODE_INVALID(mtd) = cfi->interleave * prinfo->ControlInvalid; - mtd->flags &= ~MTD_BIT_WRITEABLE; + mtd->flags |= MTD_PROGRAM_REGIONS; printk(KERN_DEBUG "%s: program region size/ctrl_valid/ctrl_inval = %d/%d/%d\n", - map->name, mtd->writesize, + map->name, MTD_PROGREGION_SIZE(mtd), MTD_PROGREGION_CTRLMODE_VALID(mtd), MTD_PROGREGION_CTRLMODE_INVALID(mtd)); } @@ -895,33 +896,26 @@ static void __xipram xip_enable(struct map_info *map, struct flchip *chip, /* * When a delay is required for the flash operation to complete, the - * xip_wait_for_operation() function is polling for both the given timeout - * and pending (but still masked) hardware interrupts. Whenever there is an - * interrupt pending then the flash erase or write operation is suspended, - * array mode restored and interrupts unmasked. Task scheduling might also - * happen at that point. The CPU eventually returns from the interrupt or - * the call to schedule() and the suspended flash operation is resumed for - * the remaining of the delay period. + * xip_udelay() function is polling for both the given timeout and pending + * (but still masked) hardware interrupts. Whenever there is an interrupt + * pending then the flash erase or write operation is suspended, array mode + * restored and interrupts unmasked. Task scheduling might also happen at that + * point. The CPU eventually returns from the interrupt or the call to + * schedule() and the suspended flash operation is resumed for the remaining + * of the delay period. * * Warning: this function _will_ fool interrupt latency tracing tools. */ -static int __xipram xip_wait_for_operation( - struct map_info *map, struct flchip *chip, - unsigned long adr, unsigned int chip_op_time ) +static void __xipram xip_udelay(struct map_info *map, struct flchip *chip, + unsigned long adr, int usec) { struct cfi_private *cfi = map->fldrv_priv; struct cfi_pri_intelext *cfip = cfi->cmdset_priv; map_word status, OK = CMD(0x80); - unsigned long usec, suspended, start, done; + unsigned long suspended, start = xip_currtime(); flstate_t oldstate, newstate; - start = xip_currtime(); - usec = chip_op_time * 8; - if (usec == 0) - usec = 500000; - done = 0; - do { cpu_relax(); if (xip_irqpending() && cfip && @@ -938,9 +932,9 @@ static int __xipram xip_wait_for_operation( * we resume the whole thing at once). Yes, it * can happen! */ - usec -= done; map_write(map, CMD(0xb0), adr); map_write(map, CMD(0x70), adr); + usec -= xip_elapsed_since(start); suspended = xip_currtime(); do { if (xip_elapsed_since(suspended) > 100000) { @@ -950,7 +944,7 @@ static int __xipram xip_wait_for_operation( * This is a critical error but there * is not much we can do here. */ - return -EIO; + return; } status = map_read(map, adr); } while (!map_word_andequal(map, status, OK, OK)); @@ -1010,106 +1004,65 @@ static int __xipram xip_wait_for_operation( xip_cpu_idle(); } status = map_read(map, adr); - done = xip_elapsed_since(start); } while (!map_word_andequal(map, status, OK, OK) - && done < usec); - - return (done >= usec) ? -ETIME : 0; + && xip_elapsed_since(start) < usec); } +#define UDELAY(map, chip, adr, usec) xip_udelay(map, chip, adr, usec) + /* * The INVALIDATE_CACHED_RANGE() macro is normally used in parallel while * the flash is actively programming or erasing since we have to poll for * the operation to complete anyway. We can't do that in a generic way with * a XIP setup so do it before the actual flash operation in this case - * and stub it out from INVAL_CACHE_AND_WAIT. + * and stub it out from INVALIDATE_CACHE_UDELAY. */ #define XIP_INVAL_CACHED_RANGE(map, from, size) \ INVALIDATE_CACHED_RANGE(map, from, size) -#define INVAL_CACHE_AND_WAIT(map, chip, cmd_adr, inval_adr, inval_len, usec) \ - xip_wait_for_operation(map, chip, cmd_adr, usec) +#define INVALIDATE_CACHE_UDELAY(map, chip, cmd_adr, adr, len, usec) \ + UDELAY(map, chip, cmd_adr, usec) + +/* + * Extra notes: + * + * Activating this XIP support changes the way the code works a bit. For + * example the code to suspend the current process when concurrent access + * happens is never executed because xip_udelay() will always return with the + * same chip state as it was entered with. This is why there is no care for + * the presence of add_wait_queue() or schedule() calls from within a couple + * xip_disable()'d areas of code, like in do_erase_oneblock for example. + * The queueing and scheduling are always happening within xip_udelay(). + * + * Similarly, get_chip() and put_chip() just happen to always be executed + * with chip->state set to FL_READY (or FL_XIP_WHILE_*) where flash state + * is in array mode, therefore never executing many cases therein and not + * causing any problem with XIP. + */ #else #define xip_disable(map, chip, adr) #define xip_enable(map, chip, adr) #define XIP_INVAL_CACHED_RANGE(x...) -#define INVAL_CACHE_AND_WAIT inval_cache_and_wait_for_operation - -static int inval_cache_and_wait_for_operation( - struct map_info *map, struct flchip *chip, - unsigned long cmd_adr, unsigned long inval_adr, int inval_len, - unsigned int chip_op_time) -{ - struct cfi_private *cfi = map->fldrv_priv; - map_word status, status_OK = CMD(0x80); - int chip_state = chip->state; - unsigned int timeo, sleep_time; - - spin_unlock(chip->mutex); - if (inval_len) - INVALIDATE_CACHED_RANGE(map, inval_adr, inval_len); - spin_lock(chip->mutex); - - /* set our timeout to 8 times the expected delay */ - timeo = chip_op_time * 8; - if (!timeo) - timeo = 500000; - sleep_time = chip_op_time / 2; - - for (;;) { - status = map_read(map, cmd_adr); - if (map_word_andequal(map, status, status_OK, status_OK)) - break; - - if (!timeo) { - map_write(map, CMD(0x70), cmd_adr); - chip->state = FL_STATUS; - return -ETIME; - } - /* OK Still waiting. Drop the lock, wait a while and retry. */ - spin_unlock(chip->mutex); - if (sleep_time >= 1000000/HZ) { - /* - * Half of the normal delay still remaining - * can be performed with a sleeping delay instead - * of busy waiting. - */ - msleep(sleep_time/1000); - timeo -= sleep_time; - sleep_time = 1000000/HZ; - } else { - udelay(1); - cond_resched(); - timeo--; - } - spin_lock(chip->mutex); - - if (chip->state != chip_state) { - /* Someone's suspended the operation: sleep */ - DECLARE_WAITQUEUE(wait, current); - set_current_state(TASK_UNINTERRUPTIBLE); - add_wait_queue(&chip->wq, &wait); - spin_unlock(chip->mutex); - schedule(); - remove_wait_queue(&chip->wq, &wait); - spin_lock(chip->mutex); - } - } - - /* Done and happy. */ - chip->state = FL_STATUS; - return 0; -} +#define UDELAY(map, chip, adr, usec) \ +do { \ + spin_unlock(chip->mutex); \ + cfi_udelay(usec); \ + spin_lock(chip->mutex); \ +} while (0) + +#define INVALIDATE_CACHE_UDELAY(map, chip, cmd_adr, adr, len, usec) \ +do { \ + spin_unlock(chip->mutex); \ + INVALIDATE_CACHED_RANGE(map, adr, len); \ + cfi_udelay(usec); \ + spin_lock(chip->mutex); \ +} while (0) #endif -#define WAIT_TIMEOUT(map, chip, adr, udelay) \ - INVAL_CACHE_AND_WAIT(map, chip, adr, 0, 0, udelay); - - static int do_point_onechip (struct map_info *map, struct flchip *chip, loff_t adr, size_t len) { unsigned long cmd_addr; @@ -1299,11 +1252,14 @@ static int __xipram do_write_oneword(struct map_info *map, struct flchip *chip, unsigned long adr, map_word datum, int mode) { struct cfi_private *cfi = map->fldrv_priv; - map_word status, write_cmd; - int ret=0; + map_word status, status_OK, write_cmd; + unsigned long timeo; + int z, ret=0; adr += chip->start; + /* Let's determine those according to the interleave only once */ + status_OK = CMD(0x80); switch (mode) { case FL_WRITING: write_cmd = (cfi->cfiq->P_ID != 0x0200) ? CMD(0x40) : CMD(0x41); @@ -1329,17 +1285,57 @@ static int __xipram do_write_oneword(struct map_info *map, struct flchip *chip, map_write(map, datum, adr); chip->state = mode; - ret = INVAL_CACHE_AND_WAIT(map, chip, adr, - adr, map_bankwidth(map), - chip->word_write_time); - if (ret) { - xip_enable(map, chip, adr); - printk(KERN_ERR "%s: word write error (status timeout)\n", map->name); - goto out; + INVALIDATE_CACHE_UDELAY(map, chip, adr, + adr, map_bankwidth(map), + chip->word_write_time); + + timeo = jiffies + (HZ/2); + z = 0; + for (;;) { + if (chip->state != mode) { + /* Someone's suspended the write. Sleep */ + DECLARE_WAITQUEUE(wait, current); + + set_current_state(TASK_UNINTERRUPTIBLE); + add_wait_queue(&chip->wq, &wait); + spin_unlock(chip->mutex); + schedule(); + remove_wait_queue(&chip->wq, &wait); + timeo = jiffies + (HZ / 2); /* FIXME */ + spin_lock(chip->mutex); + continue; + } + + status = map_read(map, adr); + if (map_word_andequal(map, status, status_OK, status_OK)) + break; + + /* OK Still waiting */ + if (time_after(jiffies, timeo)) { + map_write(map, CMD(0x70), adr); + chip->state = FL_STATUS; + xip_enable(map, chip, adr); + printk(KERN_ERR "%s: word write error (status timeout)\n", map->name); + ret = -EIO; + goto out; + } + + /* Latency issues. Drop the lock, wait a while and retry */ + z++; + UDELAY(map, chip, adr, 1); + } + if (!z) { + chip->word_write_time--; + if (!chip->word_write_time) + chip->word_write_time = 1; } + if (z > 1) + chip->word_write_time++; + + /* Done and happy. */ + chip->state = FL_STATUS; /* check for errors */ - status = map_read(map, adr); if (map_word_bitsset(map, status, CMD(0x1a))) { unsigned long chipstatus = MERGESTATUS(status); @@ -1456,9 +1452,9 @@ static int __xipram do_write_buffer(struct map_info *map, struct flchip *chip, unsigned long *pvec_seek, int len) { struct cfi_private *cfi = map->fldrv_priv; - map_word status, write_cmd, datum; - unsigned long cmd_adr; - int ret, wbufsize, word_gap, words; + map_word status, status_OK, write_cmd, datum; + unsigned long cmd_adr, timeo; + int wbufsize, z, ret=0, word_gap, words; const struct kvec *vec; unsigned long vec_seek; @@ -1467,6 +1463,7 @@ static int __xipram do_write_buffer(struct map_info *map, struct flchip *chip, cmd_adr = adr & ~(wbufsize-1); /* Let's determine this according to the interleave only once */ + status_OK = CMD(0x80); write_cmd = (cfi->cfiq->P_ID != 0x0200) ? CMD(0xe8) : CMD(0xe9); spin_lock(chip->mutex); @@ -1480,14 +1477,12 @@ static int __xipram do_write_buffer(struct map_info *map, struct flchip *chip, ENABLE_VPP(map); xip_disable(map, chip, cmd_adr); - /* §4.8 of the 28FxxxJ3A datasheet says "Any time SR.4 and/or SR.5 is set + /* §4.8 of the 28FxxxJ3A datasheet says "Any time SR.4 and/or SR.5 is set [...], the device will not accept any more Write to Buffer commands". So we must check here and reset those bits if they're set. Otherwise we're just pissing in the wind */ - if (chip->state != FL_STATUS) { + if (chip->state != FL_STATUS) map_write(map, CMD(0x70), cmd_adr); - chip->state = FL_STATUS; - } status = map_read(map, cmd_adr); if (map_word_bitsset(map, status, CMD(0x30))) { xip_enable(map, chip, cmd_adr); @@ -1498,20 +1493,32 @@ static int __xipram do_write_buffer(struct map_info *map, struct flchip *chip, } chip->state = FL_WRITING_TO_BUFFER; - map_write(map, write_cmd, cmd_adr); - ret = WAIT_TIMEOUT(map, chip, cmd_adr, 0); - if (ret) { - /* Argh. Not ready for write to buffer */ - map_word Xstatus = map_read(map, cmd_adr); - map_write(map, CMD(0x70), cmd_adr); - chip->state = FL_STATUS; + + z = 0; + for (;;) { + map_write(map, write_cmd, cmd_adr); + status = map_read(map, cmd_adr); - map_write(map, CMD(0x50), cmd_adr); - map_write(map, CMD(0x70), cmd_adr); - xip_enable(map, chip, cmd_adr); - printk(KERN_ERR "%s: Chip not ready for buffer write. Xstatus = %lx, status = %lx\n", - map->name, Xstatus.x[0], status.x[0]); - goto out; + if (map_word_andequal(map, status, status_OK, status_OK)) + break; + + UDELAY(map, chip, cmd_adr, 1); + + if (++z > 20) { + /* Argh. Not ready for write to buffer */ + map_word Xstatus; + map_write(map, CMD(0x70), cmd_adr); + chip->state = FL_STATUS; + Xstatus = map_read(map, cmd_adr); + /* Odd. Clear status bits */ + map_write(map, CMD(0x50), cmd_adr); + map_write(map, CMD(0x70), cmd_adr); + xip_enable(map, chip, cmd_adr); + printk(KERN_ERR "%s: Chip not ready for buffer write. status = %lx, Xstatus = %lx\n", + map->name, status.x[0], Xstatus.x[0]); + ret = -EIO; + goto out; + } } /* Figure out the number of words to write */ @@ -1566,19 +1573,56 @@ static int __xipram do_write_buffer(struct map_info *map, struct flchip *chip, map_write(map, CMD(0xd0), cmd_adr); chip->state = FL_WRITING; - ret = INVAL_CACHE_AND_WAIT(map, chip, cmd_adr, - adr, len, - chip->buffer_write_time); - if (ret) { - map_write(map, CMD(0x70), cmd_adr); - chip->state = FL_STATUS; - xip_enable(map, chip, cmd_adr); - printk(KERN_ERR "%s: buffer write error (status timeout)\n", map->name); - goto out; + INVALIDATE_CACHE_UDELAY(map, chip, cmd_adr, + adr, len, + chip->buffer_write_time); + + timeo = jiffies + (HZ/2); + z = 0; + for (;;) { + if (chip->state != FL_WRITING) { + /* Someone's suspended the write. Sleep */ + DECLARE_WAITQUEUE(wait, current); + set_current_state(TASK_UNINTERRUPTIBLE); + add_wait_queue(&chip->wq, &wait); + spin_unlock(chip->mutex); + schedule(); + remove_wait_queue(&chip->wq, &wait); + timeo = jiffies + (HZ / 2); /* FIXME */ + spin_lock(chip->mutex); + continue; + } + + status = map_read(map, cmd_adr); + if (map_word_andequal(map, status, status_OK, status_OK)) + break; + + /* OK Still waiting */ + if (time_after(jiffies, timeo)) { + map_write(map, CMD(0x70), cmd_adr); + chip->state = FL_STATUS; + xip_enable(map, chip, cmd_adr); + printk(KERN_ERR "%s: buffer write error (status timeout)\n", map->name); + ret = -EIO; + goto out; + } + + /* Latency issues. Drop the lock, wait a while and retry */ + z++; + UDELAY(map, chip, cmd_adr, 1); } + if (!z) { + chip->buffer_write_time--; + if (!chip->buffer_write_time) + chip->buffer_write_time = 1; + } + if (z > 1) + chip->buffer_write_time++; + + /* Done and happy. */ + chip->state = FL_STATUS; /* check for errors */ - status = map_read(map, cmd_adr); if (map_word_bitsset(map, status, CMD(0x1a))) { unsigned long chipstatus = MERGESTATUS(status); @@ -1649,11 +1693,6 @@ static int cfi_intelext_writev (struct mtd_info *mtd, const struct kvec *vecs, if (chipnum == cfi->numchips) return 0; } - - /* Be nice and reschedule with the chip in a usable state for other - processes. */ - cond_resched(); - } while (len); return 0; @@ -1674,12 +1713,17 @@ static int __xipram do_erase_oneblock(struct map_info *map, struct flchip *chip, unsigned long adr, int len, void *thunk) { struct cfi_private *cfi = map->fldrv_priv; - map_word status; + map_word status, status_OK; + unsigned long timeo; int retries = 3; - int ret; + DECLARE_WAITQUEUE(wait, current); + int ret = 0; adr += chip->start; + /* Let's determine this according to the interleave only once */ + status_OK = CMD(0x80); + retry: spin_lock(chip->mutex); ret = get_chip(map, chip, adr, FL_ERASING); @@ -1701,15 +1745,48 @@ static int __xipram do_erase_oneblock(struct map_info *map, struct flchip *chip, chip->state = FL_ERASING; chip->erase_suspended = 0; - ret = INVAL_CACHE_AND_WAIT(map, chip, adr, - adr, len, - chip->erase_time); - if (ret) { - map_write(map, CMD(0x70), adr); - chip->state = FL_STATUS; - xip_enable(map, chip, adr); - printk(KERN_ERR "%s: block erase error: (status timeout)\n", map->name); - goto out; + INVALIDATE_CACHE_UDELAY(map, chip, adr, + adr, len, + chip->erase_time*1000/2); + + /* FIXME. Use a timer to check this, and return immediately. */ + /* Once the state machine's known to be working I'll do that */ + + timeo = jiffies + (HZ*20); + for (;;) { + if (chip->state != FL_ERASING) { + /* Someone's suspended the erase. Sleep */ + set_current_state(TASK_UNINTERRUPTIBLE); + add_wait_queue(&chip->wq, &wait); + spin_unlock(chip->mutex); + schedule(); + remove_wait_queue(&chip->wq, &wait); + spin_lock(chip->mutex); + continue; + } + if (chip->erase_suspended) { + /* This erase was suspended and resumed. + Adjust the timeout */ + timeo = jiffies + (HZ*20); /* FIXME */ + chip->erase_suspended = 0; + } + + status = map_read(map, adr); + if (map_word_andequal(map, status, status_OK, status_OK)) + break; + + /* OK Still waiting */ + if (time_after(jiffies, timeo)) { + map_write(map, CMD(0x70), adr); + chip->state = FL_STATUS; + xip_enable(map, chip, adr); + printk(KERN_ERR "%s: block erase error: (status timeout)\n", map->name); + ret = -EIO; + goto out; + } + + /* Latency issues. Drop the lock, wait a while and retry */ + UDELAY(map, chip, adr, 1000000/HZ); } /* We've broken this before. It doesn't hurt to be safe */ @@ -1738,6 +1815,7 @@ static int __xipram do_erase_oneblock(struct map_info *map, struct flchip *chip, ret = -EIO; } else if (chipstatus & 0x20 && retries--) { printk(KERN_DEBUG "block erase failed at 0x%08lx: status 0x%lx. Retrying...\n", adr, chipstatus); + timeo = jiffies + HZ; put_chip(map, chip, adr); spin_unlock(chip->mutex); goto retry; @@ -1843,11 +1921,15 @@ static int __xipram do_xxlock_oneblock(struct map_info *map, struct flchip *chip { struct cfi_private *cfi = map->fldrv_priv; struct cfi_pri_intelext *extp = cfi->cmdset_priv; - int udelay; + map_word status, status_OK; + unsigned long timeo = jiffies + HZ; int ret; adr += chip->start; + /* Let's determine this according to the interleave only once */ + status_OK = CMD(0x80); + spin_lock(chip->mutex); ret = get_chip(map, chip, adr, FL_LOCKING); if (ret) { @@ -1872,21 +1954,41 @@ static int __xipram do_xxlock_oneblock(struct map_info *map, struct flchip *chip * If Instant Individual Block Locking supported then no need * to delay. */ - udelay = (!extp || !(extp->FeatureSupport & (1 << 5))) ? 1000000/HZ : 0; - ret = WAIT_TIMEOUT(map, chip, adr, udelay); - if (ret) { - map_write(map, CMD(0x70), adr); - chip->state = FL_STATUS; - xip_enable(map, chip, adr); - printk(KERN_ERR "%s: block unlock error: (status timeout)\n", map->name); - goto out; + if (!extp || !(extp->FeatureSupport & (1 << 5))) + UDELAY(map, chip, adr, 1000000/HZ); + + /* FIXME. Use a timer to check this, and return immediately. */ + /* Once the state machine's known to be working I'll do that */ + + timeo = jiffies + (HZ*20); + for (;;) { + + status = map_read(map, adr); + if (map_word_andequal(map, status, status_OK, status_OK)) + break; + + /* OK Still waiting */ + if (time_after(jiffies, timeo)) { + map_write(map, CMD(0x70), adr); + chip->state = FL_STATUS; + xip_enable(map, chip, adr); + printk(KERN_ERR "%s: block unlock error: (status timeout)\n", map->name); + put_chip(map, chip, adr); + spin_unlock(chip->mutex); + return -EIO; + } + + /* Latency issues. Drop the lock, wait a while and retry */ + UDELAY(map, chip, adr, 1); } + /* Done and happy. */ + chip->state = FL_STATUS; xip_enable(map, chip, adr); -out: put_chip(map, chip, adr); + put_chip(map, chip, adr); spin_unlock(chip->mutex); - return ret; + return 0; } static int cfi_intelext_lock(struct mtd_info *mtd, loff_t ofs, size_t len) @@ -2343,8 +2445,28 @@ static void cfi_intelext_destroy(struct mtd_info *mtd) kfree(mtd->eraseregions); } +static char im_name_0001[] = "cfi_cmdset_0001"; +static char im_name_0003[] = "cfi_cmdset_0003"; +static char im_name_0200[] = "cfi_cmdset_0200"; + +static int __init cfi_intelext_init(void) +{ + inter_module_register(im_name_0001, THIS_MODULE, &cfi_cmdset_0001); + inter_module_register(im_name_0003, THIS_MODULE, &cfi_cmdset_0001); + inter_module_register(im_name_0200, THIS_MODULE, &cfi_cmdset_0001); + return 0; +} + +static void __exit cfi_intelext_exit(void) +{ + inter_module_unregister(im_name_0001); + inter_module_unregister(im_name_0003); + inter_module_unregister(im_name_0200); +} + +module_init(cfi_intelext_init); +module_exit(cfi_intelext_exit); + MODULE_LICENSE("GPL"); MODULE_AUTHOR("David Woodhouse et al."); MODULE_DESCRIPTION("MTD chip driver for Intel/Sharp flash chips"); -MODULE_ALIAS("cfi_cmdset_0003"); -MODULE_ALIAS("cfi_cmdset_0200"); diff --git a/drivers/mtd/chips/cfi_cmdset_0002.c b/drivers/mtd/chips/cfi_cmdset_0002.c index a482e8922..aed10bd5c 100644 --- a/drivers/mtd/chips/cfi_cmdset_0002.c +++ b/drivers/mtd/chips/cfi_cmdset_0002.c @@ -21,6 +21,7 @@ * */ +#include #include #include #include @@ -45,11 +46,9 @@ #define MAX_WORD_RETRIES 3 #define MANUFACTURER_AMD 0x0001 -#define MANUFACTURER_ATMEL 0x001F #define MANUFACTURER_SST 0x00BF #define SST49LF004B 0x0060 #define SST49LF008A 0x005a -#define AT49BV6416 0x00d6 static int cfi_amdstd_read (struct mtd_info *, loff_t, size_t, size_t *, u_char *); static int cfi_amdstd_write_words(struct mtd_info *, loff_t, size_t, size_t *, const u_char *); @@ -70,9 +69,6 @@ static int get_chip(struct map_info *map, struct flchip *chip, unsigned long adr static void put_chip(struct map_info *map, struct flchip *chip, unsigned long adr); #include "fwh_lock.h" -static int cfi_atmel_lock(struct mtd_info *mtd, loff_t ofs, size_t len); -static int cfi_atmel_unlock(struct mtd_info *mtd, loff_t ofs, size_t len); - static struct mtd_chip_driver cfi_amdstd_chipdrv = { .probe = NULL, /* Not usable directly */ .destroy = cfi_amdstd_destroy, @@ -166,26 +162,6 @@ static void fixup_use_write_buffers(struct mtd_info *mtd, void *param) } } -/* Atmel chips don't use the same PRI format as AMD chips */ -static void fixup_convert_atmel_pri(struct mtd_info *mtd, void *param) -{ - struct map_info *map = mtd->priv; - struct cfi_private *cfi = map->fldrv_priv; - struct cfi_pri_amdstd *extp = cfi->cmdset_priv; - struct cfi_pri_atmel atmel_pri; - - memcpy(&atmel_pri, extp, sizeof(atmel_pri)); - memset((char *)extp + 5, 0, sizeof(*extp) - 5); - - if (atmel_pri.Features & 0x02) - extp->EraseSuspend = 2; - - if (atmel_pri.BottomBoot) - extp->TopBottom = 2; - else - extp->TopBottom = 3; -} - static void fixup_use_secsi(struct mtd_info *mtd, void *param) { /* Setup for chips with a secsi area */ @@ -204,16 +180,6 @@ static void fixup_use_erase_chip(struct mtd_info *mtd, void *param) } -/* - * Some Atmel chips (e.g. the AT49BV6416) power-up with all sectors - * locked by default. - */ -static void fixup_use_atmel_lock(struct mtd_info *mtd, void *param) -{ - mtd->lock = cfi_atmel_lock; - mtd->unlock = cfi_atmel_unlock; -} - static struct cfi_fixup cfi_fixup_table[] = { #ifdef AMD_BOOTLOC_BUG { CFI_MFR_AMD, CFI_ID_ANY, fixup_amd_bootblock, NULL }, @@ -227,7 +193,6 @@ static struct cfi_fixup cfi_fixup_table[] = { #if !FORCE_WORD_WRITE { CFI_MFR_ANY, CFI_ID_ANY, fixup_use_write_buffers, NULL, }, #endif - { CFI_MFR_ATMEL, CFI_ID_ANY, fixup_convert_atmel_pri, NULL }, { 0, 0, NULL, NULL } }; static struct cfi_fixup jedec_fixup_table[] = { @@ -243,7 +208,6 @@ static struct cfi_fixup fixup_table[] = { * we know that is the case. */ { CFI_MFR_ANY, CFI_ID_ANY, fixup_use_erase_chip, NULL }, - { CFI_MFR_ATMEL, AT49BV6416, fixup_use_atmel_lock, NULL }, { 0, 0, NULL, NULL } }; @@ -272,7 +236,6 @@ struct mtd_info *cfi_cmdset_0002(struct map_info *map, int primary) mtd->resume = cfi_amdstd_resume; mtd->flags = MTD_CAP_NORFLASH; mtd->name = map->name; - mtd->writesize = 1; if (cfi->cfi_mode==CFI_MODE_CFI){ unsigned char bootloc; @@ -363,7 +326,7 @@ struct mtd_info *cfi_cmdset_0002(struct map_info *map, int primary) return cfi_amdstd_setup(mtd); } -EXPORT_SYMBOL_GPL(cfi_cmdset_0002); + static struct mtd_info *cfi_amdstd_setup(struct mtd_info *mtd) { @@ -1644,80 +1607,6 @@ static int cfi_amdstd_erase_chip(struct mtd_info *mtd, struct erase_info *instr) return 0; } -static int do_atmel_lock(struct map_info *map, struct flchip *chip, - unsigned long adr, int len, void *thunk) -{ - struct cfi_private *cfi = map->fldrv_priv; - int ret; - - spin_lock(chip->mutex); - ret = get_chip(map, chip, adr + chip->start, FL_LOCKING); - if (ret) - goto out_unlock; - chip->state = FL_LOCKING; - - DEBUG(MTD_DEBUG_LEVEL3, "MTD %s(): LOCK 0x%08lx len %d\n", - __func__, adr, len); - - cfi_send_gen_cmd(0xAA, cfi->addr_unlock1, chip->start, map, cfi, - cfi->device_type, NULL); - cfi_send_gen_cmd(0x55, cfi->addr_unlock2, chip->start, map, cfi, - cfi->device_type, NULL); - cfi_send_gen_cmd(0x80, cfi->addr_unlock1, chip->start, map, cfi, - cfi->device_type, NULL); - cfi_send_gen_cmd(0xAA, cfi->addr_unlock1, chip->start, map, cfi, - cfi->device_type, NULL); - cfi_send_gen_cmd(0x55, cfi->addr_unlock2, chip->start, map, cfi, - cfi->device_type, NULL); - map_write(map, CMD(0x40), chip->start + adr); - - chip->state = FL_READY; - put_chip(map, chip, adr + chip->start); - ret = 0; - -out_unlock: - spin_unlock(chip->mutex); - return ret; -} - -static int do_atmel_unlock(struct map_info *map, struct flchip *chip, - unsigned long adr, int len, void *thunk) -{ - struct cfi_private *cfi = map->fldrv_priv; - int ret; - - spin_lock(chip->mutex); - ret = get_chip(map, chip, adr + chip->start, FL_UNLOCKING); - if (ret) - goto out_unlock; - chip->state = FL_UNLOCKING; - - DEBUG(MTD_DEBUG_LEVEL3, "MTD %s(): LOCK 0x%08lx len %d\n", - __func__, adr, len); - - cfi_send_gen_cmd(0xAA, cfi->addr_unlock1, chip->start, map, cfi, - cfi->device_type, NULL); - map_write(map, CMD(0x70), adr); - - chip->state = FL_READY; - put_chip(map, chip, adr + chip->start); - ret = 0; - -out_unlock: - spin_unlock(chip->mutex); - return ret; -} - -static int cfi_atmel_lock(struct mtd_info *mtd, loff_t ofs, size_t len) -{ - return cfi_varsize_frob(mtd, do_atmel_lock, ofs, len, NULL); -} - -static int cfi_atmel_unlock(struct mtd_info *mtd, loff_t ofs, size_t len) -{ - return cfi_varsize_frob(mtd, do_atmel_unlock, ofs, len, NULL); -} - static void cfi_amdstd_sync (struct mtd_info *mtd) { @@ -1869,6 +1758,25 @@ static void cfi_amdstd_destroy(struct mtd_info *mtd) kfree(mtd->eraseregions); } +static char im_name[]="cfi_cmdset_0002"; + + +static int __init cfi_amdstd_init(void) +{ + inter_module_register(im_name, THIS_MODULE, &cfi_cmdset_0002); + return 0; +} + + +static void __exit cfi_amdstd_exit(void) +{ + inter_module_unregister(im_name); +} + + +module_init(cfi_amdstd_init); +module_exit(cfi_amdstd_exit); + MODULE_LICENSE("GPL"); MODULE_AUTHOR("Crossnet Co. et al."); MODULE_DESCRIPTION("MTD chip driver for AMD/Fujitsu flash chips"); diff --git a/drivers/mtd/chips/cfi_cmdset_0020.c b/drivers/mtd/chips/cfi_cmdset_0020.c index fae70a5db..0807c1c91 100644 --- a/drivers/mtd/chips/cfi_cmdset_0020.c +++ b/drivers/mtd/chips/cfi_cmdset_0020.c @@ -162,7 +162,6 @@ struct mtd_info *cfi_cmdset_0020(struct map_info *map, int primary) return cfi_staa_setup(map); } -EXPORT_SYMBOL_GPL(cfi_cmdset_0020); static struct mtd_info *cfi_staa_setup(struct map_info *map) { @@ -238,8 +237,9 @@ static struct mtd_info *cfi_staa_setup(struct map_info *map) mtd->unlock = cfi_staa_unlock; mtd->suspend = cfi_staa_suspend; mtd->resume = cfi_staa_resume; - mtd->flags = MTD_CAP_NORFLASH & ~MTD_BIT_WRITEABLE; - mtd->writesize = 8; /* FIXME: Should be 0 for STMicro flashes w/out ECC */ + mtd->flags = MTD_CAP_NORFLASH; + mtd->flags |= MTD_ECC; /* FIXME: Not all STMicro flashes have this */ + mtd->eccsize = 8; /* FIXME: Should be 0 for STMicro flashes w/out ECC */ map->fldrv = &cfi_staa_chipdrv; __module_get(THIS_MODULE); mtd->name = map->name; @@ -1410,4 +1410,20 @@ static void cfi_staa_destroy(struct mtd_info *mtd) kfree(cfi); } +static char im_name[]="cfi_cmdset_0020"; + +static int __init cfi_staa_init(void) +{ + inter_module_register(im_name, THIS_MODULE, &cfi_cmdset_0020); + return 0; +} + +static void __exit cfi_staa_exit(void) +{ + inter_module_unregister(im_name); +} + +module_init(cfi_staa_init); +module_exit(cfi_staa_exit); + MODULE_LICENSE("GPL"); diff --git a/drivers/mtd/chips/cfi_probe.c b/drivers/mtd/chips/cfi_probe.c index 60e11a0ad..e636aa86b 100644 --- a/drivers/mtd/chips/cfi_probe.c +++ b/drivers/mtd/chips/cfi_probe.c @@ -4,6 +4,7 @@ $Id: cfi_probe.c,v 1.86 2005/11/29 14:48:31 gleixner Exp $ */ +#include #include #include #include @@ -348,12 +349,12 @@ static void print_cfi_ident(struct cfi_ident *cfip) else printk("No Vpp line\n"); - printk("Typical byte/word write timeout: %d µs\n", 1<WordWriteTimeoutTyp); - printk("Maximum byte/word write timeout: %d µs\n", (1<WordWriteTimeoutMax) * (1<WordWriteTimeoutTyp)); + printk("Typical byte/word write timeout: %d µs\n", 1<WordWriteTimeoutTyp); + printk("Maximum byte/word write timeout: %d µs\n", (1<WordWriteTimeoutMax) * (1<WordWriteTimeoutTyp)); if (cfip->BufWriteTimeoutTyp || cfip->BufWriteTimeoutMax) { - printk("Typical full buffer write timeout: %d µs\n", 1<BufWriteTimeoutTyp); - printk("Maximum full buffer write timeout: %d µs\n", (1<BufWriteTimeoutMax) * (1<BufWriteTimeoutTyp)); + printk("Typical full buffer write timeout: %d µs\n", 1<BufWriteTimeoutTyp); + printk("Maximum full buffer write timeout: %d µs\n", (1<BufWriteTimeoutMax) * (1<BufWriteTimeoutTyp)); } else printk("Full buffer write not supported\n"); diff --git a/drivers/mtd/chips/chipreg.c b/drivers/mtd/chips/chipreg.c index 2174c9754..c2127840a 100644 --- a/drivers/mtd/chips/chipreg.c +++ b/drivers/mtd/chips/chipreg.c @@ -6,6 +6,7 @@ */ #include +#include #include #include #include diff --git a/drivers/mtd/chips/gen_probe.c b/drivers/mtd/chips/gen_probe.c index cdb0f590b..41bd59d20 100644 --- a/drivers/mtd/chips/gen_probe.c +++ b/drivers/mtd/chips/gen_probe.c @@ -37,15 +37,8 @@ struct mtd_info *mtd_do_chip_probe(struct map_info *map, struct chip_probe *cp) if (!mtd) mtd = check_cmd_set(map, 0); /* Then the secondary */ - if (mtd) { - if (mtd->size > map->size) { - printk(KERN_WARNING "Reducing visibility of %ldKiB chip to %ldKiB\n", - (unsigned long)mtd->size >> 10, - (unsigned long)map->size >> 10); - mtd->size = map->size; - } + if (mtd) return mtd; - } printk(KERN_WARNING"gen_probe: No supported Vendor Command Set found\n"); @@ -107,12 +100,7 @@ static struct cfi_private *genprobe_ident_chips(struct map_info *map, struct chi * Align bitmap storage size to full byte. */ max_chips = map->size >> cfi.chipshift; - if (!max_chips) { - printk(KERN_WARNING "NOR chip too large to fit in mapping. Attempting to cope...\n"); - max_chips = 1; - } - - mapsize = (max_chips + BITS_PER_LONG-1) / BITS_PER_LONG; + mapsize = (max_chips / 8) + ((max_chips % 8) ? 1 : 0); chip_map = kmalloc(mapsize, GFP_KERNEL); if (!chip_map) { printk(KERN_WARNING "%s: kmalloc failed for CFI chip map\n", map->name); @@ -206,28 +194,25 @@ static inline struct mtd_info *cfi_cmdset_unknown(struct map_info *map, { struct cfi_private *cfi = map->fldrv_priv; __u16 type = primary?cfi->cfiq->P_ID:cfi->cfiq->A_ID; -#ifdef CONFIG_MODULES - char probename[16+sizeof(MODULE_SYMBOL_PREFIX)]; +#if defined(CONFIG_MODULES) && defined(HAVE_INTER_MODULE) + char probename[32]; cfi_cmdset_fn_t *probe_function; - sprintf(probename, MODULE_SYMBOL_PREFIX "cfi_cmdset_%4.4X", type); + sprintf(probename, "cfi_cmdset_%4.4X", type); - probe_function = __symbol_get(probename); - if (!probe_function) { - request_module(probename + sizeof(MODULE_SYMBOL_PREFIX) - 1); - probe_function = __symbol_get(probename); - } + probe_function = inter_module_get_request(probename, probename); if (probe_function) { struct mtd_info *mtd; mtd = (*probe_function)(map, primary); /* If it was happy, it'll have increased its own use count */ - symbol_put_addr(probe_function); + inter_module_put(probename); return mtd; } #endif - printk(KERN_NOTICE "Support for command set %04X not present\n", type); + printk(KERN_NOTICE "Support for command set %04X not present\n", + type); return NULL; } @@ -241,8 +226,12 @@ static struct mtd_info *check_cmd_set(struct map_info *map, int primary) return NULL; switch(type){ - /* We need these for the !CONFIG_MODULES case, - because symbol_get() doesn't work there */ + /* Urgh. Ifdefs. The version with weak symbols was + * _much_ nicer. Shame it didn't seem to work on + * anything but x86, really. + * But we can't rely in inter_module_get() because + * that'd mean we depend on link order. + */ #ifdef CONFIG_MTD_CFI_INTELEXT case 0x0001: case 0x0003: @@ -257,9 +246,9 @@ static struct mtd_info *check_cmd_set(struct map_info *map, int primary) case 0x0020: return cfi_cmdset_0020(map, primary); #endif - default: - return cfi_cmdset_unknown(map, primary); } + + return cfi_cmdset_unknown(map, primary); } MODULE_LICENSE("GPL"); diff --git a/drivers/mtd/chips/jedec.c b/drivers/mtd/chips/jedec.c index 2c3f01919..c40b48dab 100644 --- a/drivers/mtd/chips/jedec.c +++ b/drivers/mtd/chips/jedec.c @@ -256,7 +256,6 @@ static struct mtd_info *jedec_probe(struct map_info *map) MTD->name = map->name; MTD->type = MTD_NORFLASH; MTD->flags = MTD_CAP_NORFLASH; - MTD->writesize = 1; MTD->erasesize = SectorSize*(map->buswidth); // printk("MTD->erasesize is %x\n",(unsigned int)MTD->erasesize); MTD->size = priv->size; diff --git a/drivers/mtd/chips/jedec_probe.c b/drivers/mtd/chips/jedec_probe.c index 1154dac71..edb306c03 100644 --- a/drivers/mtd/chips/jedec_probe.c +++ b/drivers/mtd/chips/jedec_probe.c @@ -8,6 +8,7 @@ Occasionally maintained by Thayne Harbaugh tharbaugh at lnxi dot com */ +#include #include #include #include @@ -33,7 +34,6 @@ #define MANUFACTURER_MACRONIX 0x00C2 #define MANUFACTURER_NEC 0x0010 #define MANUFACTURER_PMC 0x009D -#define MANUFACTURER_SHARP 0x00b0 #define MANUFACTURER_SST 0x00BF #define MANUFACTURER_ST 0x0020 #define MANUFACTURER_TOSHIBA 0x0098 @@ -111,7 +111,6 @@ #define MX29LV040C 0x004F #define MX29LV160T 0x22C4 #define MX29LV160B 0x2249 -#define MX29F040 0x00A4 #define MX29F016 0x00AD #define MX29F002T 0x00B0 #define MX29F004T 0x0045 @@ -125,9 +124,6 @@ #define PM49FL004 0x006E #define PM49FL008 0x006A -/* Sharp */ -#define LH28F640BF 0x00b0 - /* ST - www.st.com */ #define M29W800DT 0x00D7 #define M29W800DB 0x005B @@ -1172,19 +1168,6 @@ static const struct amd_flash_info jedec_table[] = { ERASEINFO(0x10000,31) } }, { - .mfr_id = MANUFACTURER_MACRONIX, - .dev_id = MX29F040, - .name = "Macronix MX29F040", - .uaddr = { - [0] = MTD_UADDR_0x0555_0x02AA /* x8 */ - }, - .DevSize = SIZE_512KiB, - .CmdSet = P_ID_AMD_STD, - .NumEraseRegions= 1, - .regions = { - ERASEINFO(0x10000,8), - } - }, { .mfr_id = MANUFACTURER_MACRONIX, .dev_id = MX29F016, .name = "Macronix MX29F016", @@ -1284,19 +1267,6 @@ static const struct amd_flash_info jedec_table[] = { .regions = { ERASEINFO( 0x01000, 256 ) } - }, { - .mfr_id = MANUFACTURER_SHARP, - .dev_id = LH28F640BF, - .name = "LH28F640BF", - .uaddr = { - [0] = MTD_UADDR_UNNECESSARY, /* x8 */ - }, - .DevSize = SIZE_4MiB, - .CmdSet = P_ID_INTEL_STD, - .NumEraseRegions= 1, - .regions = { - ERASEINFO(0x40000,16), - } }, { .mfr_id = MANUFACTURER_SST, .dev_id = SST39LF512, @@ -2065,7 +2035,7 @@ static int jedec_probe_chip(struct map_info *map, __u32 base, DEBUG(MTD_DEBUG_LEVEL3, "Search for id:(%02x %02x) interleave(%d) type(%d)\n", cfi->mfr, cfi->id, cfi_interleave(cfi), cfi->device_type); - for (i = 0; i < ARRAY_SIZE(jedec_table); i++) { + for (i=0; iwrite = map_absent_write; mtd->sync = map_absent_sync; mtd->flags = 0; - mtd->erasesize = PAGE_SIZE; - mtd->writesize = 1; + mtd->erasesize = PAGE_SIZE; __module_get(THIS_MODULE); return mtd; diff --git a/drivers/mtd/chips/map_ram.c b/drivers/mtd/chips/map_ram.c index 3a66680ab..bd2e876a8 100644 --- a/drivers/mtd/chips/map_ram.c +++ b/drivers/mtd/chips/map_ram.c @@ -70,8 +70,7 @@ static struct mtd_info *map_ram_probe(struct map_info *map) mtd->read = mapram_read; mtd->write = mapram_write; mtd->sync = mapram_nop; - mtd->flags = MTD_CAP_RAM; - mtd->writesize = 1; + mtd->flags = MTD_CAP_RAM | MTD_VOLATILE; mtd->erasesize = PAGE_SIZE; while(mtd->size & (mtd->erasesize - 1)) diff --git a/drivers/mtd/chips/map_rom.c b/drivers/mtd/chips/map_rom.c index 1b328b137..624c12c23 100644 --- a/drivers/mtd/chips/map_rom.c +++ b/drivers/mtd/chips/map_rom.c @@ -46,8 +46,9 @@ static struct mtd_info *map_rom_probe(struct map_info *map) mtd->write = maprom_write; mtd->sync = maprom_nop; mtd->flags = MTD_CAP_ROM; - mtd->erasesize = map->size; - mtd->writesize = 1; + mtd->erasesize = 131072; + while(mtd->size & (mtd->erasesize - 1)) + mtd->erasesize >>= 1; __module_get(THIS_MODULE); return mtd; diff --git a/drivers/mtd/chips/sharp.c b/drivers/mtd/chips/sharp.c index 967abbecd..36f61a6a7 100644 --- a/drivers/mtd/chips/sharp.c +++ b/drivers/mtd/chips/sharp.c @@ -64,7 +64,7 @@ #undef AUTOUNLOCK /* automatically unlocks blocks before erasing */ -static struct mtd_info *sharp_probe(struct map_info *); +struct mtd_info *sharp_probe(struct map_info *); static int sharp_probe_map(struct map_info *map,struct mtd_info *mtd); @@ -96,6 +96,7 @@ struct sharp_info{ struct flchip chips[1]; }; +struct mtd_info *sharp_probe(struct map_info *map); static void sharp_destroy(struct mtd_info *mtd); static struct mtd_chip_driver sharp_chipdrv = { @@ -106,7 +107,7 @@ static struct mtd_chip_driver sharp_chipdrv = { }; -static struct mtd_info *sharp_probe(struct map_info *map) +struct mtd_info *sharp_probe(struct map_info *map) { struct mtd_info *mtd = NULL; struct sharp_info *sharp = NULL; @@ -140,7 +141,6 @@ static struct mtd_info *sharp_probe(struct map_info *map) mtd->suspend = sharp_suspend; mtd->resume = sharp_resume; mtd->flags = MTD_CAP_NORFLASH; - mtd->writesize = 1; mtd->name = map->name; memset(sharp, 0, sizeof(*sharp)); @@ -581,7 +581,7 @@ static void sharp_destroy(struct mtd_info *mtd) } -static int __init sharp_probe_init(void) +int __init sharp_probe_init(void) { printk("MTD Sharp chip driver \n"); diff --git a/drivers/mtd/cmdlinepart.c b/drivers/mtd/cmdlinepart.c index a7a7bfe33..6b8bb2e4d 100644 --- a/drivers/mtd/cmdlinepart.c +++ b/drivers/mtd/cmdlinepart.c @@ -42,8 +42,7 @@ /* special size referring to all the remaining space in a partition */ -#define SIZE_REMAINING UINT_MAX -#define OFFSET_CONTINUOUS UINT_MAX +#define SIZE_REMAINING 0xffffffff struct cmdline_mtd_partition { struct cmdline_mtd_partition *next; @@ -76,7 +75,7 @@ static struct mtd_partition * newpart(char *s, { struct mtd_partition *parts; unsigned long size; - unsigned long offset = OFFSET_CONTINUOUS; + unsigned long offset = 0; char *name; int name_len; unsigned char *extra_mem; @@ -315,7 +314,7 @@ static int parse_cmdline_partitions(struct mtd_info *master, { for(i = 0, offset = 0; i < part->num_parts; i++) { - if (part->parts[i].offset == OFFSET_CONTINUOUS) + if (!part->parts[i].offset) part->parts[i].offset = offset; else offset = part->parts[i].offset; diff --git a/drivers/mtd/devices/Kconfig b/drivers/mtd/devices/Kconfig index 16c02b5cc..dd628cb51 100644 --- a/drivers/mtd/devices/Kconfig +++ b/drivers/mtd/devices/Kconfig @@ -47,11 +47,6 @@ config MTD_MS02NV accelerator. Say Y here if you have a DECstation 5000/2x0 or a DECsystem 5900 equipped with such a module. - If you want to compile this driver as a module ( = code which can be - inserted in and removed from the running kernel whenever you want), - say M here and read . The module will - be called ms02-nv.o. - config MTD_DATAFLASH tristate "Support for AT45xxx DataFlash" depends on MTD && SPI_MASTER && EXPERIMENTAL @@ -134,8 +129,8 @@ config MTDRAM_ABS_POS allocating space from Linux's available memory. Otherwise, leave this set to zero. Most people will want to leave this as zero. -config MTD_BLOCK2MTD - tristate "MTD using block device" +config MTD_BLKMTD + tristate "MTD emulation using block device" depends on MTD help This driver allows a block device to appear as an MTD. It would @@ -146,6 +141,15 @@ config MTD_BLOCK2MTD Testing MTD users (eg JFFS2) on large media and media that might be removed during a write (using the floppy drive). +config MTD_BLOCK2MTD + tristate "MTD using block device (rewrite)" + depends on MTD && EXPERIMENTAL + help + This driver is basically the same at MTD_BLKMTD above, but + experienced some interface changes plus serious speedups. In + the long term, it should replace MTD_BLKMTD. Right now, you + shouldn't entrust important data to it yet. + comment "Disk-On-Chip Device Drivers" config MTD_DOC2000 @@ -214,6 +218,7 @@ config MTD_DOC2001PLUS config MTD_DOCPROBE tristate select MTD_DOCECC + select OBSOLETE_INTERMODULE config MTD_DOCECC tristate diff --git a/drivers/mtd/devices/Makefile b/drivers/mtd/devices/Makefile index 0f788d5c4..7c5ed2178 100644 --- a/drivers/mtd/devices/Makefile +++ b/drivers/mtd/devices/Makefile @@ -3,6 +3,13 @@ # # $Id: Makefile.common,v 1.7 2004/12/22 17:51:15 joern Exp $ +# *** BIG UGLY NOTE *** +# +# The removal of get_module_symbol() and replacement with +# inter_module_register() et al has introduced a link order dependency +# here where previously there was none. We now have to ensure that +# doc200[01].o are linked before docprobe.o + obj-$(CONFIG_MTD_DOC2000) += doc2000.o obj-$(CONFIG_MTD_DOC2001) += doc2001.o obj-$(CONFIG_MTD_DOC2001PLUS) += doc2001plus.o @@ -14,6 +21,7 @@ obj-$(CONFIG_MTD_PMC551) += pmc551.o obj-$(CONFIG_MTD_MS02NV) += ms02-nv.o obj-$(CONFIG_MTD_MTDRAM) += mtdram.o obj-$(CONFIG_MTD_LART) += lart.o +obj-$(CONFIG_MTD_BLKMTD) += blkmtd.o obj-$(CONFIG_MTD_BLOCK2MTD) += block2mtd.o obj-$(CONFIG_MTD_DATAFLASH) += mtd_dataflash.o obj-$(CONFIG_MTD_M25P80) += m25p80.o diff --git a/drivers/mtd/devices/blkmtd.c b/drivers/mtd/devices/blkmtd.c index 662e80780..04f864d23 100644 --- a/drivers/mtd/devices/blkmtd.c +++ b/drivers/mtd/devices/blkmtd.c @@ -1,5 +1,5 @@ /* - * $Id: blkmtd.c,v 1.24 2004/11/16 18:29:01 dwmw2 Exp $ + * $Id: blkmtd.c,v 1.27 2005/11/07 11:14:24 gleixner Exp $ * * blkmtd.c - use a block device as a fake MTD * @@ -39,7 +39,7 @@ /* Default erase size in K, always make it a multiple of PAGE_SIZE */ #define CONFIG_MTD_BLKDEV_ERASESIZE (128 << 10) /* 128KiB */ -#define VERSION "$Revision: 1.24 $" +#define VERSION "$Revision: 1.27 $" /* Info for the block device */ struct blkmtd_dev { @@ -113,11 +113,11 @@ static int bi_write_complete(struct bio *bio, unsigned int bytes_done, int error ClearPageUptodate(page); SetPageError(page); } - ClearPageDirty(page); + clear_page_dirty(page); unlock_page(page); page_cache_release(page); } while (bvec >= bio->bi_io_vec); - + complete((struct completion*)bio->bi_private); return 0; } @@ -135,7 +135,7 @@ static int blkmtd_readpage(struct blkmtd_dev *dev, struct page *page) unlock_page(page); return 0; } - + ClearPageUptodate(page); ClearPageError(page); @@ -289,7 +289,7 @@ static int write_pages(struct blkmtd_dev *dev, const u_char *buf, loff_t to, BUG(); } memcpy(page_address(page)+offset, buf, start_len); - SetPageDirty(page); + set_page_dirty(page); SetPageUptodate(page); buf += start_len; thislen = start_len; @@ -336,7 +336,7 @@ static int write_pages(struct blkmtd_dev *dev, const u_char *buf, loff_t to, } pagenr++; pagecnt--; - SetPageDirty(page); + set_page_dirty(page); SetPageUptodate(page); pagesc--; thislen += PAGE_SIZE; @@ -357,7 +357,7 @@ static int write_pages(struct blkmtd_dev *dev, const u_char *buf, loff_t to, BUG(); } memcpy(page_address(page), buf, end_len); - SetPageDirty(page); + set_page_dirty(page); SetPageUptodate(page); DEBUG(3, "blkmtd: write: writing out partial end\n"); thislen += end_len; @@ -539,11 +539,8 @@ static void free_device(struct blkmtd_dev *dev) { DEBUG(2, "blkmtd: free_device() dev = %p\n", dev); if(dev) { - if(dev->mtd_info.eraseregions) - kfree(dev->mtd_info.eraseregions); - if(dev->mtd_info.name) - kfree(dev->mtd_info.name); - + kfree(dev->mtd_info.eraseregions); + kfree(dev->mtd_info.name); if(dev->blkdev) { invalidate_inode_pages(dev->blkdev->bd_inode->i_mapping); close_bdev_excl(dev->blkdev); @@ -710,7 +707,7 @@ static struct blkmtd_dev *add_device(char *devname, int readonly, int erase_size dev->mtd_info.erasesize >> 10, readonly ? "(read-only)" : ""); } - + return dev; devinit_err: diff --git a/drivers/mtd/devices/block2mtd.c b/drivers/mtd/devices/block2mtd.c index 401c6a294..7ff403b2a 100644 --- a/drivers/mtd/devices/block2mtd.c +++ b/drivers/mtd/devices/block2mtd.c @@ -4,10 +4,11 @@ * block2mtd.c - create an mtd from a block device * * Copyright (C) 2001,2002 Simon Evans - * Copyright (C) 2004-2006 Jörn Engel + * Copyright (C) 2004,2005 Jörn Engel * * Licence: GPL */ +#include #include #include #include @@ -17,8 +18,6 @@ #include #include #include -#include -#include #define VERSION "$Revision: 1.30 $" @@ -32,7 +31,7 @@ struct block2mtd_dev { struct list_head list; struct block_device *blkdev; struct mtd_info mtd; - struct mutex write_mutex; + struct semaphore write_mutex; }; @@ -135,9 +134,9 @@ static int block2mtd_erase(struct mtd_info *mtd, struct erase_info *instr) int err; instr->state = MTD_ERASING; - mutex_lock(&dev->write_mutex); + down(&dev->write_mutex); err = _block2mtd_erase(dev, from, len); - mutex_unlock(&dev->write_mutex); + up(&dev->write_mutex); if (err) { ERROR("erase failed err = %d", err); instr->state = MTD_ERASE_FAILED; @@ -237,8 +236,6 @@ static int _block2mtd_write(struct block2mtd_dev *dev, const u_char *buf, } return 0; } - - static int block2mtd_write(struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen, const u_char *buf) { @@ -252,9 +249,9 @@ static int block2mtd_write(struct mtd_info *mtd, loff_t to, size_t len, if (to + len > mtd->size) len = mtd->size - to; - mutex_lock(&dev->write_mutex); + down(&dev->write_mutex); err = _block2mtd_write(dev, buf, to, len, retlen); - mutex_unlock(&dev->write_mutex); + up(&dev->write_mutex); if (err > 0) err = 0; return err; @@ -302,19 +299,6 @@ static struct block2mtd_dev *add_device(char *devname, int erase_size) /* Get a handle on the device */ bdev = open_bdev_excl(devname, O_RDWR, NULL); -#ifndef MODULE - if (IS_ERR(bdev)) { - - /* We might not have rootfs mounted at this point. Try - to resolve the device name by other means. */ - - dev_t dev = name_to_dev_t(devname); - if (dev != 0) { - bdev = open_by_devnum(dev, FMODE_WRITE | FMODE_READ); - } - } -#endif - if (IS_ERR(bdev)) { ERROR("error: cannot open device %s", devname); goto devinit_err; @@ -326,7 +310,7 @@ static struct block2mtd_dev *add_device(char *devname, int erase_size) goto devinit_err; } - mutex_init(&dev->write_mutex); + init_MUTEX(&dev->write_mutex); /* Setup the MTD structure */ /* make the name contain the block device in */ @@ -339,7 +323,6 @@ static struct block2mtd_dev *add_device(char *devname, int erase_size) dev->mtd.size = dev->blkdev->bd_inode->i_size & PAGE_MASK; dev->mtd.erasesize = erase_size; - dev->mtd.writesize = 1; dev->mtd.type = MTD_RAM; dev->mtd.flags = MTD_CAP_RAM; dev->mtd.erase = block2mtd_erase; @@ -347,6 +330,7 @@ static struct block2mtd_dev *add_device(char *devname, int erase_size) dev->mtd.writev = default_mtd_writev; dev->mtd.sync = block2mtd_sync; dev->mtd.read = block2mtd_read; + dev->mtd.readv = default_mtd_readv; dev->mtd.priv = dev; dev->mtd.owner = THIS_MODULE; @@ -366,12 +350,6 @@ devinit_err: } -/* This function works similar to reguler strtoul. In addition, it - * allows some suffixes for a more human-readable number format: - * ki, Ki, kiB, KiB - multiply result with 1024 - * Mi, MiB - multiply result with 1024^2 - * Gi, GiB - multiply result with 1024^3 - */ static int ustrtoul(const char *cp, char **endp, unsigned int base) { unsigned long result = simple_strtoul(cp, endp, base); @@ -380,16 +358,11 @@ static int ustrtoul(const char *cp, char **endp, unsigned int base) result *= 1024; case 'M': result *= 1024; - case 'K': case 'k': result *= 1024; /* By dwmw2 editorial decree, "ki", "Mi" or "Gi" are to be used. */ - if ((*endp)[1] == 'i') { - if ((*endp)[2] == 'B') - (*endp) += 3; - else - (*endp) += 2; - } + if ((*endp)[1] == 'i') + (*endp) += 2; } return result; } @@ -409,6 +382,26 @@ static int parse_num(size_t *num, const char *token) } +static int parse_name(char **pname, const char *token, size_t limit) +{ + size_t len; + char *name; + + len = strlen(token) + 1; + if (len > limit) + return -ENOSPC; + + name = kmalloc(len, GFP_KERNEL); + if (!name) + return -ENOMEM; + + strcpy(name, token); + + *pname = name; + return 0; +} + + static inline void kill_final_newline(char *str) { char *newline = strrchr(str, '\n'); @@ -422,16 +415,9 @@ static inline void kill_final_newline(char *str) return 0; \ } while (0) -#ifndef MODULE -static int block2mtd_init_called = 0; -static __initdata char block2mtd_paramline[80 + 12]; /* 80 for device, 12 for erase size */ -#endif - - -static int block2mtd_setup2(const char *val) +static int block2mtd_setup(const char *val, struct kernel_param *kp) { - char buf[80 + 12]; /* 80 for device, 12 for erase size */ - char *str = buf; + char buf[80+12], *str=buf; /* 80 for device, 12 for erase size */ char *token[2]; char *name; size_t erase_size = PAGE_SIZE; @@ -443,7 +429,7 @@ static int block2mtd_setup2(const char *val) strcpy(str, val); kill_final_newline(str); - for (i = 0; i < 2; i++) + for (i=0; i<2; i++) token[i] = strsep(&str, ","); if (str) @@ -452,16 +438,18 @@ static int block2mtd_setup2(const char *val) if (!token[0]) parse_err("no argument"); - name = token[0]; - if (strlen(name) + 1 > 80) - parse_err("device name too long"); + ret = parse_name(&name, token[0], 80); + if (ret == -ENOMEM) + parse_err("out of memory"); + if (ret == -ENOSPC) + parse_err("name too long"); + if (ret) + return 0; if (token[1]) { ret = parse_num(&erase_size, token[1]); - if (ret) { - kfree(name); + if (ret) parse_err("illegal erase size"); - } } add_device(name, erase_size); @@ -470,48 +458,13 @@ static int block2mtd_setup2(const char *val) } -static int block2mtd_setup(const char *val, struct kernel_param *kp) -{ -#ifdef MODULE - return block2mtd_setup2(val); -#else - /* If more parameters are later passed in via - /sys/module/block2mtd/parameters/block2mtd - and block2mtd_init() has already been called, - we can parse the argument now. */ - - if (block2mtd_init_called) - return block2mtd_setup2(val); - - /* During early boot stage, we only save the parameters - here. We must parse them later: if the param passed - from kernel boot command line, block2mtd_setup() is - called so early that it is not possible to resolve - the device (even kmalloc() fails). Deter that work to - block2mtd_setup2(). */ - - strlcpy(block2mtd_paramline, val, sizeof(block2mtd_paramline)); - - return 0; -#endif -} - - module_param_call(block2mtd, block2mtd_setup, NULL, NULL, 0200); MODULE_PARM_DESC(block2mtd, "Device to use. \"block2mtd=[,]\""); static int __init block2mtd_init(void) { - int ret = 0; INFO("version " VERSION); - -#ifndef MODULE - if (strlen(block2mtd_paramline)) - ret = block2mtd_setup2(block2mtd_paramline); - block2mtd_init_called = 1; -#endif - - return ret; + return 0; } diff --git a/drivers/mtd/devices/doc2000.c b/drivers/mtd/devices/doc2000.c index 603a7951a..e4345cf74 100644 --- a/drivers/mtd/devices/doc2000.c +++ b/drivers/mtd/devices/doc2000.c @@ -20,7 +20,6 @@ #include #include #include -#include #include #include @@ -55,10 +54,17 @@ static int doc_read(struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf); static int doc_write(struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen, const u_char *buf); -static int doc_read_oob(struct mtd_info *mtd, loff_t ofs, - struct mtd_oob_ops *ops); -static int doc_write_oob(struct mtd_info *mtd, loff_t ofs, - struct mtd_oob_ops *ops); +static int doc_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); +static int doc_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 doc_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 doc_read_oob(struct mtd_info *mtd, loff_t ofs, size_t len, + size_t *retlen, u_char *buf); +static int doc_write_oob(struct mtd_info *mtd, loff_t ofs, size_t len, + size_t *retlen, const u_char *buf); static int doc_write_oob_nolock(struct mtd_info *mtd, loff_t ofs, size_t len, size_t *retlen, const u_char *buf); static int doc_erase (struct mtd_info *mtd, struct erase_info *instr); @@ -510,9 +516,16 @@ static int DoC2k_is_alias(struct DiskOnChip *doc1, struct DiskOnChip *doc2) return retval; } -/* This routine is found from the docprobe code by symbol_get(), - * which will bump the use count of this module. */ -void DoC2k_init(struct mtd_info *mtd) +static const char im_name[] = "DoC2k_init"; + +/* This routine is made available to other mtd code via + * inter_module_register. It must only be accessed through + * inter_module_get which will bump the use count of this module. The + * addresses passed back in mtd are valid as long as the use count of + * this module is non-zero, i.e. between inter_module_get and + * inter_module_put. Keith Owens 29 Oct 2000. + */ +static void DoC2k_init(struct mtd_info *mtd) { struct DiskOnChip *this = mtd->priv; struct DiskOnChip *old = NULL; @@ -572,7 +585,7 @@ void DoC2k_init(struct mtd_info *mtd) mtd->ecctype = MTD_ECC_RS_DiskOnChip; mtd->size = 0; mtd->erasesize = 0; - mtd->writesize = 512; + mtd->oobblock = 512; mtd->oobsize = 16; mtd->owner = THIS_MODULE; mtd->erase = doc_erase; @@ -580,6 +593,9 @@ void DoC2k_init(struct mtd_info *mtd) mtd->unpoint = NULL; mtd->read = doc_read; mtd->write = doc_write; + mtd->read_ecc = doc_read_ecc; + mtd->write_ecc = doc_write_ecc; + mtd->writev_ecc = doc_writev_ecc; mtd->read_oob = doc_read_oob; mtd->write_oob = doc_write_oob; mtd->sync = NULL; @@ -589,7 +605,7 @@ void DoC2k_init(struct mtd_info *mtd) this->curfloor = -1; this->curchip = -1; - mutex_init(&this->lock); + init_MUTEX(&this->lock); /* Ident all the chips present. */ DoC_ScanChips(this, maxchips); @@ -606,15 +622,21 @@ void DoC2k_init(struct mtd_info *mtd) return; } } -EXPORT_SYMBOL_GPL(DoC2k_init); static int doc_read(struct mtd_info *mtd, loff_t from, size_t len, size_t * retlen, u_char * buf) +{ + /* Just a special case of doc_read_ecc */ + return doc_read_ecc(mtd, from, len, retlen, buf, NULL, NULL); +} + +static int doc_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) { struct DiskOnChip *this = mtd->priv; void __iomem *docptr = this->virtadr; struct Nand *mychip; - unsigned char syndrome[6], eccbuf[6]; + unsigned char syndrome[6]; volatile char dummy; int i, len256 = 0, ret=0; size_t left = len; @@ -623,7 +645,7 @@ static int doc_read(struct mtd_info *mtd, loff_t from, size_t len, if (from >= this->totlen) return -EINVAL; - mutex_lock(&this->lock); + down(&this->lock); *retlen = 0; while (left) { @@ -662,9 +684,15 @@ static int doc_read(struct mtd_info *mtd, loff_t from, size_t len, DoC_Address(this, ADDR_COLUMN_PAGE, from, CDSN_CTRL_WP, CDSN_CTRL_ECC_IO); - /* Prime the ECC engine */ - WriteDOC(DOC_ECC_RESET, docptr, ECCConf); - WriteDOC(DOC_ECC_EN, docptr, ECCConf); + if (eccbuf) { + /* Prime the ECC engine */ + WriteDOC(DOC_ECC_RESET, docptr, ECCConf); + WriteDOC(DOC_ECC_EN, docptr, ECCConf); + } else { + /* disable the ECC engine */ + WriteDOC(DOC_ECC_RESET, docptr, ECCConf); + WriteDOC(DOC_ECC_DIS, docptr, ECCConf); + } /* treat crossing 256-byte sector for 2M x 8bits devices */ if (this->page256 && from + len > (from | 0xff) + 1) { @@ -681,59 +709,58 @@ static int doc_read(struct mtd_info *mtd, loff_t from, size_t len, /* Let the caller know we completed it */ *retlen += len; - /* Read the ECC data through the DiskOnChip ECC logic */ - /* Note: this will work even with 2M x 8bit devices as */ - /* they have 8 bytes of OOB per 256 page. mf. */ - DoC_ReadBuf(this, eccbuf, 6); - - /* Flush the pipeline */ - if (DoC_is_Millennium(this)) { - dummy = ReadDOC(docptr, ECCConf); - dummy = ReadDOC(docptr, ECCConf); - i = ReadDOC(docptr, ECCConf); - } else { - dummy = ReadDOC(docptr, 2k_ECCStatus); - dummy = ReadDOC(docptr, 2k_ECCStatus); - i = ReadDOC(docptr, 2k_ECCStatus); - } + if (eccbuf) { + /* Read the ECC data through the DiskOnChip ECC logic */ + /* Note: this will work even with 2M x 8bit devices as */ + /* they have 8 bytes of OOB per 256 page. mf. */ + DoC_ReadBuf(this, eccbuf, 6); + + /* Flush the pipeline */ + if (DoC_is_Millennium(this)) { + dummy = ReadDOC(docptr, ECCConf); + dummy = ReadDOC(docptr, ECCConf); + i = ReadDOC(docptr, ECCConf); + } else { + dummy = ReadDOC(docptr, 2k_ECCStatus); + dummy = ReadDOC(docptr, 2k_ECCStatus); + i = ReadDOC(docptr, 2k_ECCStatus); + } - /* Check the ECC Status */ - if (i & 0x80) { - int nb_errors; - /* There was an ECC error */ + /* Check the ECC Status */ + if (i & 0x80) { + int nb_errors; + /* There was an ECC error */ #ifdef ECC_DEBUG - printk(KERN_ERR "DiskOnChip ECC Error: Read at %lx\n", (long)from); + printk(KERN_ERR "DiskOnChip ECC Error: Read at %lx\n", (long)from); #endif - /* Read the ECC syndrom through the DiskOnChip ECC - logic. These syndrome will be all ZERO when there - is no error */ - for (i = 0; i < 6; i++) { - syndrome[i] = - ReadDOC(docptr, ECCSyndrome0 + i); - } - nb_errors = doc_decode_ecc(buf, syndrome); + /* Read the ECC syndrom through the DiskOnChip ECC logic. + These syndrome will be all ZERO when there is no error */ + for (i = 0; i < 6; i++) { + syndrome[i] = + ReadDOC(docptr, ECCSyndrome0 + i); + } + nb_errors = doc_decode_ecc(buf, syndrome); #ifdef ECC_DEBUG - printk(KERN_ERR "Errors corrected: %x\n", nb_errors); + printk(KERN_ERR "Errors corrected: %x\n", nb_errors); #endif - if (nb_errors < 0) { - /* We return error, but have actually done the - read. Not that this can be told to - user-space, via sys_read(), but at least - MTD-aware stuff can know about it by - checking *retlen */ - ret = -EIO; + if (nb_errors < 0) { + /* We return error, but have actually done the read. Not that + this can be told to user-space, via sys_read(), but at least + MTD-aware stuff can know about it by checking *retlen */ + ret = -EIO; + } } - } #ifdef PSYCHO_DEBUG - printk(KERN_DEBUG "ECC DATA at %lxB: %2.2X %2.2X %2.2X %2.2X %2.2X %2.2X\n", - (long)from, eccbuf[0], eccbuf[1], eccbuf[2], - eccbuf[3], eccbuf[4], eccbuf[5]); + printk(KERN_DEBUG "ECC DATA at %lxB: %2.2X %2.2X %2.2X %2.2X %2.2X %2.2X\n", + (long)from, eccbuf[0], eccbuf[1], eccbuf[2], + eccbuf[3], eccbuf[4], eccbuf[5]); #endif - /* disable the ECC engine */ - WriteDOC(DOC_ECC_DIS, docptr , ECCConf); + /* disable the ECC engine */ + WriteDOC(DOC_ECC_DIS, docptr , ECCConf); + } /* according to 11.4.1, we need to wait for the busy line * drop if we read to the end of the page. */ @@ -747,18 +774,25 @@ static int doc_read(struct mtd_info *mtd, loff_t from, size_t len, buf += len; } - mutex_unlock(&this->lock); + up(&this->lock); return ret; } static int doc_write(struct mtd_info *mtd, loff_t to, size_t len, size_t * retlen, const u_char * buf) +{ + char eccbuf[6]; + return doc_write_ecc(mtd, to, len, retlen, buf, eccbuf, NULL); +} + +static int doc_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) { struct DiskOnChip *this = mtd->priv; int di; /* Yes, DI is a hangover from when I was disassembling the binary driver */ void __iomem *docptr = this->virtadr; - unsigned char eccbuf[6]; volatile char dummy; int len256 = 0; struct Nand *mychip; @@ -769,7 +803,7 @@ static int doc_write(struct mtd_info *mtd, loff_t to, size_t len, if (to >= this->totlen) return -EINVAL; - mutex_lock(&this->lock); + down(&this->lock); *retlen = 0; while (left) { @@ -812,9 +846,15 @@ static int doc_write(struct mtd_info *mtd, loff_t to, size_t len, DoC_Command(this, NAND_CMD_SEQIN, 0); DoC_Address(this, ADDR_COLUMN_PAGE, to, 0, CDSN_CTRL_ECC_IO); - /* Prime the ECC engine */ - WriteDOC(DOC_ECC_RESET, docptr, ECCConf); - WriteDOC(DOC_ECC_EN | DOC_ECC_RW, docptr, ECCConf); + if (eccbuf) { + /* Prime the ECC engine */ + WriteDOC(DOC_ECC_RESET, docptr, ECCConf); + WriteDOC(DOC_ECC_EN | DOC_ECC_RW, docptr, ECCConf); + } else { + /* disable the ECC engine */ + WriteDOC(DOC_ECC_RESET, docptr, ECCConf); + WriteDOC(DOC_ECC_DIS, docptr, ECCConf); + } /* treat crossing 256-byte sector for 2M x 8bits devices */ if (this->page256 && to + len > (to | 0xff) + 1) { @@ -833,7 +873,7 @@ static int doc_write(struct mtd_info *mtd, loff_t to, size_t len, printk(KERN_ERR "Error programming flash\n"); /* Error in programming */ *retlen = 0; - mutex_unlock(&this->lock); + up(&this->lock); return -EIO; } @@ -844,35 +884,39 @@ static int doc_write(struct mtd_info *mtd, loff_t to, size_t len, DoC_WriteBuf(this, &buf[len256], len - len256); - WriteDOC(CDSN_CTRL_ECC_IO | CDSN_CTRL_CE, docptr, CDSNControl); - - if (DoC_is_Millennium(this)) { - WriteDOC(0, docptr, NOP); - WriteDOC(0, docptr, NOP); - WriteDOC(0, docptr, NOP); - } else { - WriteDOC_(0, docptr, this->ioreg); - WriteDOC_(0, docptr, this->ioreg); - WriteDOC_(0, docptr, this->ioreg); - } + if (eccbuf) { + WriteDOC(CDSN_CTRL_ECC_IO | CDSN_CTRL_CE, docptr, + CDSNControl); + + if (DoC_is_Millennium(this)) { + WriteDOC(0, docptr, NOP); + WriteDOC(0, docptr, NOP); + WriteDOC(0, docptr, NOP); + } else { + WriteDOC_(0, docptr, this->ioreg); + WriteDOC_(0, docptr, this->ioreg); + WriteDOC_(0, docptr, this->ioreg); + } - WriteDOC(CDSN_CTRL_ECC_IO | CDSN_CTRL_FLASH_IO | CDSN_CTRL_CE, docptr, - CDSNControl); + WriteDOC(CDSN_CTRL_ECC_IO | CDSN_CTRL_FLASH_IO | CDSN_CTRL_CE, docptr, + CDSNControl); - /* Read the ECC data through the DiskOnChip ECC logic */ - for (di = 0; di < 6; di++) { - eccbuf[di] = ReadDOC(docptr, ECCSyndrome0 + di); - } + /* Read the ECC data through the DiskOnChip ECC logic */ + for (di = 0; di < 6; di++) { + eccbuf[di] = ReadDOC(docptr, ECCSyndrome0 + di); + } - /* Reset the ECC engine */ - WriteDOC(DOC_ECC_DIS, docptr, ECCConf); + /* Reset the ECC engine */ + WriteDOC(DOC_ECC_DIS, docptr, ECCConf); #ifdef PSYCHO_DEBUG - printk - ("OOB data at %lx is %2.2X %2.2X %2.2X %2.2X %2.2X %2.2X\n", - (long) to, eccbuf[0], eccbuf[1], eccbuf[2], eccbuf[3], - eccbuf[4], eccbuf[5]); + printk + ("OOB data at %lx is %2.2X %2.2X %2.2X %2.2X %2.2X %2.2X\n", + (long) to, eccbuf[0], eccbuf[1], eccbuf[2], eccbuf[3], + eccbuf[4], eccbuf[5]); #endif + } + DoC_Command(this, NAND_CMD_PAGEPROG, 0); DoC_Command(this, NAND_CMD_STATUS, CDSN_CTRL_WP); @@ -891,7 +935,7 @@ static int doc_write(struct mtd_info *mtd, loff_t to, size_t len, printk(KERN_ERR "Error programming flash\n"); /* Error in programming */ *retlen = 0; - mutex_unlock(&this->lock); + up(&this->lock); return -EIO; } @@ -912,7 +956,7 @@ static int doc_write(struct mtd_info *mtd, loff_t to, size_t len, ret = doc_write_oob_nolock(mtd, to, 8, &dummy, x); if (ret) { - mutex_unlock(&this->lock); + up(&this->lock); return ret; } } @@ -922,24 +966,78 @@ static int doc_write(struct mtd_info *mtd, loff_t to, size_t len, buf += len; } - mutex_unlock(&this->lock); + up(&this->lock); return 0; } -static int doc_read_oob(struct mtd_info *mtd, loff_t ofs, - struct mtd_oob_ops *ops) +static int doc_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 char static_buf[512]; + static DECLARE_MUTEX(writev_buf_sem); + + size_t totretlen = 0; + size_t thisvecofs = 0; + int ret= 0; + + down(&writev_buf_sem); + + while(count) { + size_t thislen, thisretlen; + unsigned char *buf; + + buf = vecs->iov_base + thisvecofs; + thislen = vecs->iov_len - thisvecofs; + + + if (thislen >= 512) { + thislen = thislen & ~(512-1); + thisvecofs += thislen; + } else { + /* Not enough to fill a page. Copy into buf */ + memcpy(static_buf, buf, thislen); + buf = &static_buf[thislen]; + + while(count && thislen < 512) { + vecs++; + count--; + thisvecofs = min((512-thislen), vecs->iov_len); + memcpy(buf, vecs->iov_base, thisvecofs); + thislen += thisvecofs; + buf += thisvecofs; + } + buf = static_buf; + } + if (count && thisvecofs == vecs->iov_len) { + thisvecofs = 0; + vecs++; + count--; + } + ret = doc_write_ecc(mtd, to, thislen, &thisretlen, buf, eccbuf, oobsel); + + totretlen += thisretlen; + + if (ret || thisretlen != thislen) + break; + + to += thislen; + } + + up(&writev_buf_sem); + *retlen = totretlen; + return ret; +} + + +static int doc_read_oob(struct mtd_info *mtd, loff_t ofs, size_t len, + size_t * retlen, u_char * buf) { struct DiskOnChip *this = mtd->priv; int len256 = 0, ret; struct Nand *mychip; - uint8_t *buf = ops->oobbuf; - size_t len = ops->len; - - BUG_ON(ops->mode != MTD_OOB_PLACE); - - ofs += ops->ooboffs; - mutex_lock(&this->lock); + down(&this->lock); mychip = &this->chips[ofs >> this->chipshift]; @@ -978,14 +1076,14 @@ static int doc_read_oob(struct mtd_info *mtd, loff_t ofs, DoC_ReadBuf(this, &buf[len256], len - len256); - ops->retlen = len; + *retlen = len; /* Reading the full OOB data drops us off of the end of the page, * causing the flash device to go into busy mode, so we need * to wait until ready 11.4.1 and Toshiba TC58256FT docs */ ret = DoC_WaitReady(this); - mutex_unlock(&this->lock); + up(&this->lock); return ret; } @@ -1093,20 +1191,17 @@ static int doc_write_oob_nolock(struct mtd_info *mtd, loff_t ofs, size_t len, } -static int doc_write_oob(struct mtd_info *mtd, loff_t ofs, - struct mtd_oob_ops *ops) +static int doc_write_oob(struct mtd_info *mtd, loff_t ofs, size_t len, + size_t * retlen, const u_char * buf) { - struct DiskOnChip *this = mtd->priv; - int ret; + struct DiskOnChip *this = mtd->priv; + int ret; - BUG_ON(ops->mode != MTD_OOB_PLACE); + down(&this->lock); + ret = doc_write_oob_nolock(mtd, ofs, len, retlen, buf); - mutex_lock(&this->lock); - ret = doc_write_oob_nolock(mtd, ofs + ops->ooboffs, ops->len, - &ops->retlen, ops->oobbuf); - - mutex_unlock(&this->lock); - return ret; + up(&this->lock); + return ret; } static int doc_erase(struct mtd_info *mtd, struct erase_info *instr) @@ -1119,10 +1214,10 @@ static int doc_erase(struct mtd_info *mtd, struct erase_info *instr) struct Nand *mychip; int status; - mutex_lock(&this->lock); + down(&this->lock); if (ofs & (mtd->erasesize-1) || len & (mtd->erasesize-1)) { - mutex_unlock(&this->lock); + up(&this->lock); return -EINVAL; } @@ -1170,7 +1265,7 @@ static int doc_erase(struct mtd_info *mtd, struct erase_info *instr) callback: mtd_erase_callback(instr); - mutex_unlock(&this->lock); + up(&this->lock); return 0; } @@ -1181,6 +1276,12 @@ static int doc_erase(struct mtd_info *mtd, struct erase_info *instr) * ****************************************************************************/ +static int __init init_doc2000(void) +{ + inter_module_register(im_name, THIS_MODULE, &DoC2k_init); + return 0; +} + static void __exit cleanup_doc2000(void) { struct mtd_info *mtd; @@ -1196,9 +1297,11 @@ static void __exit cleanup_doc2000(void) kfree(this->chips); kfree(mtd); } + inter_module_unregister(im_name); } module_exit(cleanup_doc2000); +module_init(init_doc2000); MODULE_LICENSE("GPL"); MODULE_AUTHOR("David Woodhouse et al."); diff --git a/drivers/mtd/devices/doc2001.c b/drivers/mtd/devices/doc2001.c index 0e2a9326f..681a9c73a 100644 --- a/drivers/mtd/devices/doc2001.c +++ b/drivers/mtd/devices/doc2001.c @@ -37,10 +37,16 @@ static int doc_read(struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf); static int doc_write(struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen, const u_char *buf); -static int doc_read_oob(struct mtd_info *mtd, loff_t ofs, - struct mtd_oob_ops *ops); -static int doc_write_oob(struct mtd_info *mtd, loff_t ofs, - struct mtd_oob_ops *ops); +static int doc_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); +static int doc_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 doc_read_oob(struct mtd_info *mtd, loff_t ofs, size_t len, + size_t *retlen, u_char *buf); +static int doc_write_oob(struct mtd_info *mtd, loff_t ofs, size_t len, + size_t *retlen, const u_char *buf); static int doc_erase (struct mtd_info *mtd, struct erase_info *instr); static struct mtd_info *docmillist = NULL; @@ -318,9 +324,16 @@ static int DoCMil_is_alias(struct DiskOnChip *doc1, struct DiskOnChip *doc2) return retval; } -/* This routine is found from the docprobe code by symbol_get(), - * which will bump the use count of this module. */ -void DoCMil_init(struct mtd_info *mtd) +static const char im_name[] = "DoCMil_init"; + +/* This routine is made available to other mtd code via + * inter_module_register. It must only be accessed through + * inter_module_get which will bump the use count of this module. The + * addresses passed back in mtd are valid as long as the use count of + * this module is non-zero, i.e. between inter_module_get and + * inter_module_put. Keith Owens 29 Oct 2000. + */ +static void DoCMil_init(struct mtd_info *mtd) { struct DiskOnChip *this = mtd->priv; struct DiskOnChip *old = NULL; @@ -355,7 +368,7 @@ void DoCMil_init(struct mtd_info *mtd) /* FIXME: erase size is not always 8KiB */ mtd->erasesize = 0x2000; - mtd->writesize = 512; + mtd->oobblock = 512; mtd->oobsize = 16; mtd->owner = THIS_MODULE; mtd->erase = doc_erase; @@ -363,6 +376,8 @@ void DoCMil_init(struct mtd_info *mtd) mtd->unpoint = NULL; mtd->read = doc_read; mtd->write = doc_write; + mtd->read_ecc = doc_read_ecc; + mtd->write_ecc = doc_write_ecc; mtd->read_oob = doc_read_oob; mtd->write_oob = doc_write_oob; mtd->sync = NULL; @@ -386,14 +401,21 @@ void DoCMil_init(struct mtd_info *mtd) return; } } -EXPORT_SYMBOL_GPL(DoCMil_init); static int doc_read (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf) +{ + /* Just a special case of doc_read_ecc */ + return doc_read_ecc(mtd, from, len, retlen, buf, NULL, NULL); +} + +static int doc_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 i, ret; volatile char dummy; - unsigned char syndrome[6], eccbuf[6]; + unsigned char syndrome[6]; struct DiskOnChip *this = mtd->priv; void __iomem *docptr = this->virtadr; struct Nand *mychip = &this->chips[from >> (this->chipshift)]; @@ -423,9 +445,15 @@ static int doc_read (struct mtd_info *mtd, loff_t from, size_t len, DoC_Address(docptr, 3, from, CDSN_CTRL_WP, 0x00); DoC_WaitReady(docptr); - /* init the ECC engine, see Reed-Solomon EDC/ECC 11.1 .*/ - WriteDOC (DOC_ECC_RESET, docptr, ECCConf); - WriteDOC (DOC_ECC_EN, docptr, ECCConf); + if (eccbuf) { + /* init the ECC engine, see Reed-Solomon EDC/ECC 11.1 .*/ + WriteDOC (DOC_ECC_RESET, docptr, ECCConf); + WriteDOC (DOC_ECC_EN, docptr, ECCConf); + } else { + /* disable the ECC engine */ + WriteDOC (DOC_ECC_RESET, docptr, ECCConf); + WriteDOC (DOC_ECC_DIS, docptr, ECCConf); + } /* Read the data via the internal pipeline through CDSN IO register, see Pipelined Read Operations 11.3 */ @@ -445,56 +473,58 @@ static int doc_read (struct mtd_info *mtd, loff_t from, size_t len, *retlen = len; ret = 0; - /* Read the ECC data from Spare Data Area, - see Reed-Solomon EDC/ECC 11.1 */ - dummy = ReadDOC(docptr, ReadPipeInit); + if (eccbuf) { + /* Read the ECC data from Spare Data Area, + see Reed-Solomon EDC/ECC 11.1 */ + dummy = ReadDOC(docptr, ReadPipeInit); #ifndef USE_MEMCPY - for (i = 0; i < 5; i++) { - /* N.B. you have to increase the source address in this way or the - ECC logic will not work properly */ - eccbuf[i] = ReadDOC(docptr, Mil_CDSN_IO + i); - } + for (i = 0; i < 5; i++) { + /* N.B. you have to increase the source address in this way or the + ECC logic will not work properly */ + eccbuf[i] = ReadDOC(docptr, Mil_CDSN_IO + i); + } #else - memcpy_fromio(eccbuf, docptr + DoC_Mil_CDSN_IO, 5); + memcpy_fromio(eccbuf, docptr + DoC_Mil_CDSN_IO, 5); #endif - eccbuf[5] = ReadDOC(docptr, LastDataRead); + eccbuf[5] = ReadDOC(docptr, LastDataRead); - /* Flush the pipeline */ - dummy = ReadDOC(docptr, ECCConf); - dummy = ReadDOC(docptr, ECCConf); + /* Flush the pipeline */ + dummy = ReadDOC(docptr, ECCConf); + dummy = ReadDOC(docptr, ECCConf); - /* Check the ECC Status */ - if (ReadDOC(docptr, ECCConf) & 0x80) { - int nb_errors; - /* There was an ECC error */ + /* Check the ECC Status */ + if (ReadDOC(docptr, ECCConf) & 0x80) { + int nb_errors; + /* There was an ECC error */ #ifdef ECC_DEBUG - printk("DiskOnChip ECC Error: Read at %lx\n", (long)from); + printk("DiskOnChip ECC Error: Read at %lx\n", (long)from); #endif - /* Read the ECC syndrom through the DiskOnChip ECC logic. - These syndrome will be all ZERO when there is no error */ - for (i = 0; i < 6; i++) { - syndrome[i] = ReadDOC(docptr, ECCSyndrome0 + i); - } - nb_errors = doc_decode_ecc(buf, syndrome); + /* Read the ECC syndrom through the DiskOnChip ECC logic. + These syndrome will be all ZERO when there is no error */ + for (i = 0; i < 6; i++) { + syndrome[i] = ReadDOC(docptr, ECCSyndrome0 + i); + } + nb_errors = doc_decode_ecc(buf, syndrome); #ifdef ECC_DEBUG - printk("ECC Errors corrected: %x\n", nb_errors); + printk("ECC Errors corrected: %x\n", nb_errors); #endif - if (nb_errors < 0) { - /* We return error, but have actually done the read. Not that - this can be told to user-space, via sys_read(), but at least - MTD-aware stuff can know about it by checking *retlen */ - ret = -EIO; + if (nb_errors < 0) { + /* We return error, but have actually done the read. Not that + this can be told to user-space, via sys_read(), but at least + MTD-aware stuff can know about it by checking *retlen */ + ret = -EIO; + } } - } #ifdef PSYCHO_DEBUG - printk("ECC DATA at %lx: %2.2X %2.2X %2.2X %2.2X %2.2X %2.2X\n", - (long)from, eccbuf[0], eccbuf[1], eccbuf[2], eccbuf[3], - eccbuf[4], eccbuf[5]); + printk("ECC DATA at %lx: %2.2X %2.2X %2.2X %2.2X %2.2X %2.2X\n", + (long)from, eccbuf[0], eccbuf[1], eccbuf[2], eccbuf[3], + eccbuf[4], eccbuf[5]); #endif - /* disable the ECC engine */ - WriteDOC(DOC_ECC_DIS, docptr , ECCConf); + /* disable the ECC engine */ + WriteDOC(DOC_ECC_DIS, docptr , ECCConf); + } return ret; } @@ -502,8 +532,15 @@ static int doc_read (struct mtd_info *mtd, loff_t from, size_t len, static int doc_write (struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen, const u_char *buf) { - int i,ret = 0; char eccbuf[6]; + return doc_write_ecc(mtd, to, len, retlen, buf, eccbuf, NULL); +} + +static int doc_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 i,ret = 0; volatile char dummy; struct DiskOnChip *this = mtd->priv; void __iomem *docptr = this->virtadr; @@ -544,9 +581,15 @@ static int doc_write (struct mtd_info *mtd, loff_t to, size_t len, DoC_Address(docptr, 3, to, 0x00, 0x00); DoC_WaitReady(docptr); - /* init the ECC engine, see Reed-Solomon EDC/ECC 11.1 .*/ - WriteDOC (DOC_ECC_RESET, docptr, ECCConf); - WriteDOC (DOC_ECC_EN | DOC_ECC_RW, docptr, ECCConf); + if (eccbuf) { + /* init the ECC engine, see Reed-Solomon EDC/ECC 11.1 .*/ + WriteDOC (DOC_ECC_RESET, docptr, ECCConf); + WriteDOC (DOC_ECC_EN | DOC_ECC_RW, docptr, ECCConf); + } else { + /* disable the ECC engine */ + WriteDOC (DOC_ECC_RESET, docptr, ECCConf); + WriteDOC (DOC_ECC_DIS, docptr, ECCConf); + } /* Write the data via the internal pipeline through CDSN IO register, see Pipelined Write Operations 11.2 */ @@ -561,44 +604,46 @@ static int doc_write (struct mtd_info *mtd, loff_t to, size_t len, #endif WriteDOC(0x00, docptr, WritePipeTerm); - /* Write ECC data to flash, the ECC info is generated by the DiskOnChip ECC logic - see Reed-Solomon EDC/ECC 11.1 */ - WriteDOC(0, docptr, NOP); - WriteDOC(0, docptr, NOP); - WriteDOC(0, docptr, NOP); + if (eccbuf) { + /* Write ECC data to flash, the ECC info is generated by the DiskOnChip ECC logic + see Reed-Solomon EDC/ECC 11.1 */ + WriteDOC(0, docptr, NOP); + WriteDOC(0, docptr, NOP); + WriteDOC(0, docptr, NOP); - /* Read the ECC data through the DiskOnChip ECC logic */ - for (i = 0; i < 6; i++) { - eccbuf[i] = ReadDOC(docptr, ECCSyndrome0 + i); - } + /* Read the ECC data through the DiskOnChip ECC logic */ + for (i = 0; i < 6; i++) { + eccbuf[i] = ReadDOC(docptr, ECCSyndrome0 + i); + } - /* ignore the ECC engine */ - WriteDOC(DOC_ECC_DIS, docptr , ECCConf); + /* ignore the ECC engine */ + WriteDOC(DOC_ECC_DIS, docptr , ECCConf); #ifndef USE_MEMCPY - /* Write the ECC data to flash */ - for (i = 0; i < 6; i++) { - /* N.B. you have to increase the source address in this way or the - ECC logic will not work properly */ - WriteDOC(eccbuf[i], docptr, Mil_CDSN_IO + i); - } + /* Write the ECC data to flash */ + for (i = 0; i < 6; i++) { + /* N.B. you have to increase the source address in this way or the + ECC logic will not work properly */ + WriteDOC(eccbuf[i], docptr, Mil_CDSN_IO + i); + } #else - memcpy_toio(docptr + DoC_Mil_CDSN_IO, eccbuf, 6); + memcpy_toio(docptr + DoC_Mil_CDSN_IO, eccbuf, 6); #endif - /* write the block status BLOCK_USED (0x5555) at the end of ECC data - FIXME: this is only a hack for programming the IPL area for LinuxBIOS - and should be replace with proper codes in user space utilities */ - WriteDOC(0x55, docptr, Mil_CDSN_IO); - WriteDOC(0x55, docptr, Mil_CDSN_IO + 1); + /* write the block status BLOCK_USED (0x5555) at the end of ECC data + FIXME: this is only a hack for programming the IPL area for LinuxBIOS + and should be replace with proper codes in user space utilities */ + WriteDOC(0x55, docptr, Mil_CDSN_IO); + WriteDOC(0x55, docptr, Mil_CDSN_IO + 1); - WriteDOC(0x00, docptr, WritePipeTerm); + WriteDOC(0x00, docptr, WritePipeTerm); #ifdef PSYCHO_DEBUG - printk("OOB data at %lx is %2.2X %2.2X %2.2X %2.2X %2.2X %2.2X\n", - (long) to, eccbuf[0], eccbuf[1], eccbuf[2], eccbuf[3], - eccbuf[4], eccbuf[5]); + printk("OOB data at %lx is %2.2X %2.2X %2.2X %2.2X %2.2X %2.2X\n", + (long) to, eccbuf[0], eccbuf[1], eccbuf[2], eccbuf[3], + eccbuf[4], eccbuf[5]); #endif + } /* Commit the Page Program command and wait for ready see Software Requirement 11.4 item 1.*/ @@ -625,8 +670,8 @@ static int doc_write (struct mtd_info *mtd, loff_t to, size_t len, return ret; } -static int doc_read_oob(struct mtd_info *mtd, loff_t ofs, - struct mtd_oob_ops *ops) +static int doc_read_oob(struct mtd_info *mtd, loff_t ofs, size_t len, + size_t *retlen, u_char *buf) { #ifndef USE_MEMCPY int i; @@ -635,12 +680,6 @@ static int doc_read_oob(struct mtd_info *mtd, loff_t ofs, struct DiskOnChip *this = mtd->priv; void __iomem *docptr = this->virtadr; struct Nand *mychip = &this->chips[ofs >> this->chipshift]; - uint8_t *buf = ops->oobbuf; - size_t len = ops->len; - - BUG_ON(ops->mode != MTD_OOB_PLACE); - - ofs += ops->ooboffs; /* Find the chip which is to be used and select it */ if (this->curfloor != mychip->floor) { @@ -677,13 +716,13 @@ static int doc_read_oob(struct mtd_info *mtd, loff_t ofs, #endif buf[len - 1] = ReadDOC(docptr, LastDataRead); - ops->retlen = len; + *retlen = len; return 0; } -static int doc_write_oob(struct mtd_info *mtd, loff_t ofs, - struct mtd_oob_ops *ops) +static int doc_write_oob(struct mtd_info *mtd, loff_t ofs, size_t len, + size_t *retlen, const u_char *buf) { #ifndef USE_MEMCPY int i; @@ -693,12 +732,6 @@ static int doc_write_oob(struct mtd_info *mtd, loff_t ofs, struct DiskOnChip *this = mtd->priv; void __iomem *docptr = this->virtadr; struct Nand *mychip = &this->chips[ofs >> this->chipshift]; - uint8_t *buf = ops->oobbuf; - size_t len = ops->len; - - BUG_ON(ops->mode != MTD_OOB_PLACE); - - ofs += ops->ooboffs; /* Find the chip which is to be used and select it */ if (this->curfloor != mychip->floor) { @@ -750,12 +783,12 @@ static int doc_write_oob(struct mtd_info *mtd, loff_t ofs, if (ReadDOC(docptr, Mil_CDSN_IO) & 1) { printk("Error programming oob data\n"); /* FIXME: implement Bad Block Replacement (in nftl.c ??) */ - ops->retlen = 0; + *retlen = 0; ret = -EIO; } dummy = ReadDOC(docptr, LastDataRead); - ops->retlen = len; + *retlen = len; return ret; } @@ -823,6 +856,12 @@ int doc_erase (struct mtd_info *mtd, struct erase_info *instr) * ****************************************************************************/ +static int __init init_doc2001(void) +{ + inter_module_register(im_name, THIS_MODULE, &DoCMil_init); + return 0; +} + static void __exit cleanup_doc2001(void) { struct mtd_info *mtd; @@ -838,9 +877,11 @@ static void __exit cleanup_doc2001(void) kfree(this->chips); kfree(mtd); } + inter_module_unregister(im_name); } module_exit(cleanup_doc2001); +module_init(init_doc2001); MODULE_LICENSE("GPL"); MODULE_AUTHOR("David Woodhouse et al."); diff --git a/drivers/mtd/devices/doc2001plus.c b/drivers/mtd/devices/doc2001plus.c index 92dbb47f2..5f57f29ef 100644 --- a/drivers/mtd/devices/doc2001plus.c +++ b/drivers/mtd/devices/doc2001plus.c @@ -41,10 +41,16 @@ static int doc_read(struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf); static int doc_write(struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen, const u_char *buf); -static int doc_read_oob(struct mtd_info *mtd, loff_t ofs, - struct mtd_oob_ops *ops); -static int doc_write_oob(struct mtd_info *mtd, loff_t ofs, - struct mtd_oob_ops *ops); +static int doc_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); +static int doc_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 doc_read_oob(struct mtd_info *mtd, loff_t ofs, size_t len, + size_t *retlen, u_char *buf); +static int doc_write_oob(struct mtd_info *mtd, loff_t ofs, size_t len, + size_t *retlen, const u_char *buf); static int doc_erase (struct mtd_info *mtd, struct erase_info *instr); static struct mtd_info *docmilpluslist = NULL; @@ -441,9 +447,16 @@ static int DoCMilPlus_is_alias(struct DiskOnChip *doc1, struct DiskOnChip *doc2) return retval; } -/* This routine is found from the docprobe code by symbol_get(), - * which will bump the use count of this module. */ -void DoCMilPlus_init(struct mtd_info *mtd) +static const char im_name[] = "DoCMilPlus_init"; + +/* This routine is made available to other mtd code via + * inter_module_register. It must only be accessed through + * inter_module_get which will bump the use count of this module. The + * addresses passed back in mtd are valid as long as the use count of + * this module is non-zero, i.e. between inter_module_get and + * inter_module_put. Keith Owens 29 Oct 2000. + */ +static void DoCMilPlus_init(struct mtd_info *mtd) { struct DiskOnChip *this = mtd->priv; struct DiskOnChip *old = NULL; @@ -477,7 +490,7 @@ void DoCMilPlus_init(struct mtd_info *mtd) mtd->size = 0; mtd->erasesize = 0; - mtd->writesize = 512; + mtd->oobblock = 512; mtd->oobsize = 16; mtd->owner = THIS_MODULE; mtd->erase = doc_erase; @@ -485,6 +498,8 @@ void DoCMilPlus_init(struct mtd_info *mtd) mtd->unpoint = NULL; mtd->read = doc_read; mtd->write = doc_write; + mtd->read_ecc = doc_read_ecc; + mtd->write_ecc = doc_write_ecc; mtd->read_oob = doc_read_oob; mtd->write_oob = doc_write_oob; mtd->sync = NULL; @@ -509,7 +524,6 @@ void DoCMilPlus_init(struct mtd_info *mtd) return; } } -EXPORT_SYMBOL_GPL(DoCMilPlus_init); #if 0 static int doc_dumpblk(struct mtd_info *mtd, loff_t from) @@ -588,11 +602,19 @@ static int doc_dumpblk(struct mtd_info *mtd, loff_t from) static int doc_read(struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf) +{ + /* Just a special case of doc_read_ecc */ + return doc_read_ecc(mtd, from, len, retlen, buf, NULL, NULL); +} + +static int doc_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 ret, i; volatile char dummy; loff_t fofs; - unsigned char syndrome[6], eccbuf[6]; + unsigned char syndrome[6]; struct DiskOnChip *this = mtd->priv; void __iomem * docptr = this->virtadr; struct Nand *mychip = &this->chips[from >> (this->chipshift)]; @@ -630,51 +652,56 @@ static int doc_read(struct mtd_info *mtd, loff_t from, size_t len, WriteDOC(0, docptr, Mplus_FlashControl); DoC_WaitReady(docptr); - /* init the ECC engine, see Reed-Solomon EDC/ECC 11.1 .*/ - WriteDOC(DOC_ECC_RESET, docptr, Mplus_ECCConf); - WriteDOC(DOC_ECC_EN, docptr, Mplus_ECCConf); + if (eccbuf) { + /* init the ECC engine, see Reed-Solomon EDC/ECC 11.1 .*/ + WriteDOC(DOC_ECC_RESET, docptr, Mplus_ECCConf); + WriteDOC(DOC_ECC_EN, docptr, Mplus_ECCConf); + } else { + /* disable the ECC engine */ + WriteDOC(DOC_ECC_RESET, docptr, Mplus_ECCConf); + } /* Let the caller know we completed it */ *retlen = len; - ret = 0; + ret = 0; ReadDOC(docptr, Mplus_ReadPipeInit); ReadDOC(docptr, Mplus_ReadPipeInit); - /* Read the data via the internal pipeline through CDSN IO - register, see Pipelined Read Operations 11.3 */ - MemReadDOC(docptr, buf, len); + if (eccbuf) { + /* Read the data via the internal pipeline through CDSN IO + register, see Pipelined Read Operations 11.3 */ + MemReadDOC(docptr, buf, len); - /* Read the ECC data following raw data */ - MemReadDOC(docptr, eccbuf, 4); - eccbuf[4] = ReadDOC(docptr, Mplus_LastDataRead); - eccbuf[5] = ReadDOC(docptr, Mplus_LastDataRead); + /* Read the ECC data following raw data */ + MemReadDOC(docptr, eccbuf, 4); + eccbuf[4] = ReadDOC(docptr, Mplus_LastDataRead); + eccbuf[5] = ReadDOC(docptr, Mplus_LastDataRead); - /* Flush the pipeline */ - dummy = ReadDOC(docptr, Mplus_ECCConf); - dummy = ReadDOC(docptr, Mplus_ECCConf); + /* Flush the pipeline */ + dummy = ReadDOC(docptr, Mplus_ECCConf); + dummy = ReadDOC(docptr, Mplus_ECCConf); - /* Check the ECC Status */ - if (ReadDOC(docptr, Mplus_ECCConf) & 0x80) { - int nb_errors; - /* There was an ECC error */ + /* Check the ECC Status */ + if (ReadDOC(docptr, Mplus_ECCConf) & 0x80) { + int nb_errors; + /* There was an ECC error */ #ifdef ECC_DEBUG - printk("DiskOnChip ECC Error: Read at %lx\n", (long)from); + printk("DiskOnChip ECC Error: Read at %lx\n", (long)from); #endif - /* Read the ECC syndrom through the DiskOnChip ECC logic. - These syndrome will be all ZERO when there is no error */ - for (i = 0; i < 6; i++) - syndrome[i] = ReadDOC(docptr, Mplus_ECCSyndrome0 + i); + /* Read the ECC syndrom through the DiskOnChip ECC logic. + These syndrome will be all ZERO when there is no error */ + for (i = 0; i < 6; i++) + syndrome[i] = ReadDOC(docptr, Mplus_ECCSyndrome0 + i); - nb_errors = doc_decode_ecc(buf, syndrome); + nb_errors = doc_decode_ecc(buf, syndrome); #ifdef ECC_DEBUG - printk("ECC Errors corrected: %x\n", nb_errors); + printk("ECC Errors corrected: %x\n", nb_errors); #endif - if (nb_errors < 0) { - /* We return error, but have actually done the - read. Not that this can be told to user-space, via - sys_read(), but at least MTD-aware stuff can know - about it by checking *retlen */ + if (nb_errors < 0) { + /* We return error, but have actually done the read. Not that + this can be told to user-space, via sys_read(), but at least + MTD-aware stuff can know about it by checking *retlen */ #ifdef ECC_DEBUG printk("%s(%d): Millennium Plus ECC error (from=0x%x:\n", __FILE__, __LINE__, (int)from); @@ -688,16 +715,24 @@ static int doc_read(struct mtd_info *mtd, loff_t from, size_t len, eccbuf[3], eccbuf[4], eccbuf[5]); #endif ret = -EIO; + } } - } #ifdef PSYCHO_DEBUG - printk("ECC DATA at %lx: %2.2X %2.2X %2.2X %2.2X %2.2X %2.2X\n", - (long)from, eccbuf[0], eccbuf[1], eccbuf[2], eccbuf[3], - eccbuf[4], eccbuf[5]); + printk("ECC DATA at %lx: %2.2X %2.2X %2.2X %2.2X %2.2X %2.2X\n", + (long)from, eccbuf[0], eccbuf[1], eccbuf[2], eccbuf[3], + eccbuf[4], eccbuf[5]); #endif - /* disable the ECC engine */ - WriteDOC(DOC_ECC_DIS, docptr , Mplus_ECCConf); + + /* disable the ECC engine */ + WriteDOC(DOC_ECC_DIS, docptr , Mplus_ECCConf); + } else { + /* Read the data via the internal pipeline through CDSN IO + register, see Pipelined Read Operations 11.3 */ + MemReadDOC(docptr, buf, len-2); + buf[len-2] = ReadDOC(docptr, Mplus_LastDataRead); + buf[len-1] = ReadDOC(docptr, Mplus_LastDataRead); + } /* Disable flash internally */ WriteDOC(0, docptr, Mplus_FlashSelect); @@ -707,11 +742,18 @@ static int doc_read(struct mtd_info *mtd, loff_t from, size_t len, static int doc_write(struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen, const u_char *buf) +{ + char eccbuf[6]; + return doc_write_ecc(mtd, to, len, retlen, buf, eccbuf, NULL); +} + +static int doc_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 i, before, ret = 0; loff_t fto; volatile char dummy; - char eccbuf[6]; struct DiskOnChip *this = mtd->priv; void __iomem * docptr = this->virtadr; struct Nand *mychip = &this->chips[to >> (this->chipshift)]; @@ -761,42 +803,46 @@ static int doc_write(struct mtd_info *mtd, loff_t to, size_t len, /* Disable the ECC engine */ WriteDOC(DOC_ECC_RESET, docptr, Mplus_ECCConf); - if (before) { - /* Write the block status BLOCK_USED (0x5555) */ - WriteDOC(0x55, docptr, Mil_CDSN_IO); - WriteDOC(0x55, docptr, Mil_CDSN_IO); - } + if (eccbuf) { + if (before) { + /* Write the block status BLOCK_USED (0x5555) */ + WriteDOC(0x55, docptr, Mil_CDSN_IO); + WriteDOC(0x55, docptr, Mil_CDSN_IO); + } - /* init the ECC engine, see Reed-Solomon EDC/ECC 11.1 .*/ - WriteDOC(DOC_ECC_EN | DOC_ECC_RW, docptr, Mplus_ECCConf); + /* init the ECC engine, see Reed-Solomon EDC/ECC 11.1 .*/ + WriteDOC(DOC_ECC_EN | DOC_ECC_RW, docptr, Mplus_ECCConf); + } MemWriteDOC(docptr, (unsigned char *) buf, len); - /* Write ECC data to flash, the ECC info is generated by - the DiskOnChip ECC logic see Reed-Solomon EDC/ECC 11.1 */ - DoC_Delay(docptr, 3); + if (eccbuf) { + /* Write ECC data to flash, the ECC info is generated by + the DiskOnChip ECC logic see Reed-Solomon EDC/ECC 11.1 */ + DoC_Delay(docptr, 3); - /* Read the ECC data through the DiskOnChip ECC logic */ - for (i = 0; i < 6; i++) - eccbuf[i] = ReadDOC(docptr, Mplus_ECCSyndrome0 + i); + /* Read the ECC data through the DiskOnChip ECC logic */ + for (i = 0; i < 6; i++) + eccbuf[i] = ReadDOC(docptr, Mplus_ECCSyndrome0 + i); - /* disable the ECC engine */ - WriteDOC(DOC_ECC_DIS, docptr, Mplus_ECCConf); + /* disable the ECC engine */ + WriteDOC(DOC_ECC_DIS, docptr, Mplus_ECCConf); - /* Write the ECC data to flash */ - MemWriteDOC(docptr, eccbuf, 6); + /* Write the ECC data to flash */ + MemWriteDOC(docptr, eccbuf, 6); - if (!before) { - /* Write the block status BLOCK_USED (0x5555) */ - WriteDOC(0x55, docptr, Mil_CDSN_IO+6); - WriteDOC(0x55, docptr, Mil_CDSN_IO+7); - } + if (!before) { + /* Write the block status BLOCK_USED (0x5555) */ + WriteDOC(0x55, docptr, Mil_CDSN_IO+6); + WriteDOC(0x55, docptr, Mil_CDSN_IO+7); + } #ifdef PSYCHO_DEBUG - printk("OOB data at %lx is %2.2X %2.2X %2.2X %2.2X %2.2X %2.2X\n", - (long) to, eccbuf[0], eccbuf[1], eccbuf[2], eccbuf[3], - eccbuf[4], eccbuf[5]); + printk("OOB data at %lx is %2.2X %2.2X %2.2X %2.2X %2.2X %2.2X\n", + (long) to, eccbuf[0], eccbuf[1], eccbuf[2], eccbuf[3], + eccbuf[4], eccbuf[5]); #endif + } WriteDOC(0x00, docptr, Mplus_WritePipeTerm); WriteDOC(0x00, docptr, Mplus_WritePipeTerm); @@ -830,20 +876,14 @@ static int doc_write(struct mtd_info *mtd, loff_t to, size_t len, return ret; } -static int doc_read_oob(struct mtd_info *mtd, loff_t ofs, - struct mtd_oob_ops *ops) +static int doc_read_oob(struct mtd_info *mtd, loff_t ofs, size_t len, + size_t *retlen, u_char *buf) { loff_t fofs, base; struct DiskOnChip *this = mtd->priv; void __iomem * docptr = this->virtadr; struct Nand *mychip = &this->chips[ofs >> this->chipshift]; size_t i, size, got, want; - uint8_t *buf = ops->oobbuf; - size_t len = ops->len; - - BUG_ON(ops->mode != MTD_OOB_PLACE); - - ofs += ops->ooboffs; DoC_CheckASIC(docptr); @@ -909,12 +949,12 @@ static int doc_read_oob(struct mtd_info *mtd, loff_t ofs, /* Disable flash internally */ WriteDOC(0, docptr, Mplus_FlashSelect); - ops->retlen = len; + *retlen = len; return 0; } -static int doc_write_oob(struct mtd_info *mtd, loff_t ofs, - struct mtd_oob_ops *ops) +static int doc_write_oob(struct mtd_info *mtd, loff_t ofs, size_t len, + size_t *retlen, const u_char *buf) { volatile char dummy; loff_t fofs, base; @@ -923,12 +963,6 @@ static int doc_write_oob(struct mtd_info *mtd, loff_t ofs, struct Nand *mychip = &this->chips[ofs >> this->chipshift]; size_t i, size, got, want; int ret = 0; - uint8_t *buf = ops->oobbuf; - size_t len = ops->len; - - BUG_ON(ops->mode != MTD_OOB_PLACE); - - ofs += ops->ooboffs; DoC_CheckASIC(docptr); @@ -1004,7 +1038,7 @@ static int doc_write_oob(struct mtd_info *mtd, loff_t ofs, printk("MTD: Error 0x%x programming oob at 0x%x\n", dummy, (int)ofs); /* FIXME: implement Bad Block Replacement */ - ops->retlen = 0; + *retlen = 0; ret = -EIO; } dummy = ReadDOC(docptr, Mplus_LastDataRead); @@ -1017,7 +1051,7 @@ static int doc_write_oob(struct mtd_info *mtd, loff_t ofs, /* Disable flash internally */ WriteDOC(0, docptr, Mplus_FlashSelect); - ops->retlen = len; + *retlen = len; return ret; } @@ -1088,6 +1122,12 @@ int doc_erase(struct mtd_info *mtd, struct erase_info *instr) * ****************************************************************************/ +static int __init init_doc2001plus(void) +{ + inter_module_register(im_name, THIS_MODULE, &DoCMilPlus_init); + return 0; +} + static void __exit cleanup_doc2001plus(void) { struct mtd_info *mtd; @@ -1103,9 +1143,11 @@ static void __exit cleanup_doc2001plus(void) kfree(this->chips); kfree(mtd); } + inter_module_unregister(im_name); } module_exit(cleanup_doc2001plus); +module_init(init_doc2001plus); MODULE_LICENSE("GPL"); MODULE_AUTHOR("Greg Ungerer et al."); diff --git a/drivers/mtd/devices/docprobe.c b/drivers/mtd/devices/docprobe.c index 78872c3f3..13178b9dd 100644 --- a/drivers/mtd/devices/docprobe.c +++ b/drivers/mtd/devices/docprobe.c @@ -40,6 +40,7 @@ */ #define DOC_SINGLE_DRIVER +#include #include #include #include @@ -230,10 +231,6 @@ static inline int __init doccheck(void __iomem *potential, unsigned long physadr static int docfound; -extern void DoC2k_init(struct mtd_info *); -extern void DoCMil_init(struct mtd_info *); -extern void DoCMilPlus_init(struct mtd_info *); - static void __init DoC_Probe(unsigned long physadr) { void __iomem *docptr; @@ -242,6 +239,8 @@ static void __init DoC_Probe(unsigned long physadr) int ChipID; char namebuf[15]; char *name = namebuf; + char *im_funcname = NULL; + char *im_modname = NULL; void (*initroutine)(struct mtd_info *) = NULL; docptr = ioremap(physadr, DOC_IOREMAP_LEN); @@ -279,33 +278,41 @@ static void __init DoC_Probe(unsigned long physadr) switch(ChipID) { case DOC_ChipID_Doc2kTSOP: name="2000 TSOP"; - initroutine = symbol_request(DoC2k_init); + im_funcname = "DoC2k_init"; + im_modname = "doc2000"; break; case DOC_ChipID_Doc2k: name="2000"; - initroutine = symbol_request(DoC2k_init); + im_funcname = "DoC2k_init"; + im_modname = "doc2000"; break; case DOC_ChipID_DocMil: name="Millennium"; #ifdef DOC_SINGLE_DRIVER - initroutine = symbol_request(DoC2k_init); + im_funcname = "DoC2k_init"; + im_modname = "doc2000"; #else - initroutine = symbol_request(DoCMil_init); + im_funcname = "DoCMil_init"; + im_modname = "doc2001"; #endif /* DOC_SINGLE_DRIVER */ break; case DOC_ChipID_DocMilPlus16: case DOC_ChipID_DocMilPlus32: name="MillenniumPlus"; - initroutine = symbol_request(DoCMilPlus_init); + im_funcname = "DoCMilPlus_init"; + im_modname = "doc2001plus"; break; } + if (im_funcname) + initroutine = inter_module_get_request(im_funcname, im_modname); + if (initroutine) { (*initroutine)(mtd); - symbol_put_addr(initroutine); + inter_module_put(im_funcname); return; } printk(KERN_NOTICE "Cannot find driver for DiskOnChip %s at 0x%lX\n", name, physadr); diff --git a/drivers/mtd/devices/lart.c b/drivers/mtd/devices/lart.c index 4ea50a1dd..1e876fcb0 100644 --- a/drivers/mtd/devices/lart.c +++ b/drivers/mtd/devices/lart.c @@ -581,6 +581,8 @@ static int flash_write (struct mtd_info *mtd,loff_t to,size_t len,size_t *retlen /***************************************************************************************************/ +#define NB_OF(x) (sizeof (x) / sizeof (x[0])) + static struct mtd_info mtd; static struct mtd_erase_region_info erase_regions[] = { @@ -635,11 +637,10 @@ int __init lart_flash_init (void) printk ("%s: This looks like a LART board to me.\n",module_name); mtd.name = module_name; mtd.type = MTD_NORFLASH; - mtd.writesize = 1; mtd.flags = MTD_CAP_NORFLASH; mtd.size = FLASH_BLOCKSIZE_PARAM * FLASH_NUMBLOCKS_16m_PARAM + FLASH_BLOCKSIZE_MAIN * FLASH_NUMBLOCKS_16m_MAIN; mtd.erasesize = FLASH_BLOCKSIZE_MAIN; - mtd.numeraseregions = ARRAY_SIZE(erase_regions); + mtd.numeraseregions = NB_OF (erase_regions); mtd.eraseregions = erase_regions; mtd.erase = flash_erase; mtd.read = flash_read; @@ -669,9 +670,9 @@ int __init lart_flash_init (void) result,mtd.eraseregions[result].numblocks); #ifdef HAVE_PARTITIONS - printk ("\npartitions = %d\n", ARRAY_SIZE(lart_partitions)); + printk ("\npartitions = %d\n",NB_OF (lart_partitions)); - for (result = 0; result < ARRAY_SIZE(lart_partitions); result++) + for (result = 0; result < NB_OF (lart_partitions); result++) printk (KERN_DEBUG "\n\n" "lart_partitions[%d].name = %s\n" @@ -686,7 +687,7 @@ int __init lart_flash_init (void) #ifndef HAVE_PARTITIONS result = add_mtd_device (&mtd); #else - result = add_mtd_partitions (&mtd,lart_partitions, ARRAY_SIZE(lart_partitions)); + result = add_mtd_partitions (&mtd,lart_partitions,NB_OF (lart_partitions)); #endif return (result); diff --git a/drivers/mtd/devices/m25p80.c b/drivers/mtd/devices/m25p80.c index ef4a731ca..d5f24089b 100644 --- a/drivers/mtd/devices/m25p80.c +++ b/drivers/mtd/devices/m25p80.c @@ -186,7 +186,7 @@ static int m25p80_erase(struct mtd_info *mtd, struct erase_info *instr) struct m25p *flash = mtd_to_m25p(mtd); u32 addr,len; - DEBUG(MTD_DEBUG_LEVEL2, "%s: %s %s 0x%08x, len %d\n", + DEBUG(MTD_DEBUG_LEVEL2, "%s: %s %s 0x%08x, len %zd\n", flash->spi->dev.bus_id, __FUNCTION__, "at", (u32)instr->addr, instr->len); @@ -406,13 +406,13 @@ struct flash_info { static struct flash_info __devinitdata m25p_data [] = { /* REVISIT: fill in JEDEC ids, for parts that have them */ - { "m25p05", 0x05, 0x2010, 32 * 1024, 2 }, - { "m25p10", 0x10, 0x2011, 32 * 1024, 4 }, - { "m25p20", 0x11, 0x2012, 64 * 1024, 4 }, - { "m25p40", 0x12, 0x2013, 64 * 1024, 8 }, + { "m25p05", 0x05, 0x0000, 32 * 1024, 2 }, + { "m25p10", 0x10, 0x0000, 32 * 1024, 4 }, + { "m25p20", 0x11, 0x0000, 64 * 1024, 4 }, + { "m25p40", 0x12, 0x0000, 64 * 1024, 8 }, { "m25p80", 0x13, 0x0000, 64 * 1024, 16 }, - { "m25p16", 0x14, 0x2015, 64 * 1024, 32 }, - { "m25p32", 0x15, 0x2016, 64 * 1024, 64 }, + { "m25p16", 0x14, 0x0000, 64 * 1024, 32 }, + { "m25p32", 0x15, 0x0000, 64 * 1024, 64 }, { "m25p64", 0x16, 0x2017, 64 * 1024, 128 }, }; @@ -465,7 +465,6 @@ static int __devinit m25p_probe(struct spi_device *spi) flash->mtd.name = spi->dev.bus_id; flash->mtd.type = MTD_NORFLASH; - flash->mtd.writesize = 1; flash->mtd.flags = MTD_CAP_NORFLASH; flash->mtd.size = info->sector_size * info->n_sectors; flash->mtd.erasesize = info->sector_size; diff --git a/drivers/mtd/devices/ms02-nv.c b/drivers/mtd/devices/ms02-nv.c index 08dfb899b..0ff2e4378 100644 --- a/drivers/mtd/devices/ms02-nv.c +++ b/drivers/mtd/devices/ms02-nv.c @@ -219,13 +219,12 @@ static int __init ms02nv_init_one(ulong addr) mp->uaddr = phys_to_virt(fixaddr); mtd->type = MTD_RAM; - mtd->flags = MTD_CAP_RAM; + mtd->flags = MTD_CAP_RAM | MTD_XIP; mtd->size = fixsize; mtd->name = (char *)ms02nv_name; mtd->owner = THIS_MODULE; mtd->read = ms02nv_read; mtd->write = ms02nv_write; - mtd->writesize = 1; ret = -EIO; if (add_mtd_device(mtd)) { @@ -309,7 +308,7 @@ static int __init ms02nv_init(void) break; } - for (i = 0; i < ARRAY_SIZE(ms02nv_addrs); i++) + for (i = 0; i < (sizeof(ms02nv_addrs) / sizeof(*ms02nv_addrs)); i++) if (!ms02nv_init_one(ms02nv_addrs[i] << stride)) count++; diff --git a/drivers/mtd/devices/mtd_dataflash.c b/drivers/mtd/devices/mtd_dataflash.c index 5db716045..dabffa280 100644 --- a/drivers/mtd/devices/mtd_dataflash.c +++ b/drivers/mtd/devices/mtd_dataflash.c @@ -9,6 +9,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 @@ -477,7 +478,6 @@ add_dataflash(struct spi_device *spi, char *name, device->name = (pdata && pdata->name) ? pdata->name : priv->name; device->size = nr_pages * pagesize; device->erasesize = pagesize; - device->writesize = pagesize; device->owner = THIS_MODULE; device->type = MTD_DATAFLASH; device->flags = MTD_CAP_NORFLASH; @@ -536,7 +536,7 @@ static int __devinit dataflash_probe(struct spi_device *spi) if (status <= 0 || status == 0xff) { DEBUG(MTD_DEBUG_LEVEL1, "%s: status error %d\n", spi->dev.bus_id, status); - if (status == 0xff) + if (status == 0 || status == 0xff) status = -ENODEV; return status; } diff --git a/drivers/mtd/devices/mtdram.c b/drivers/mtd/devices/mtdram.c index e427c82d5..1443117fd 100644 --- a/drivers/mtd/devices/mtdram.c +++ b/drivers/mtd/devices/mtdram.c @@ -10,6 +10,7 @@ * */ +#include #include #include #include @@ -105,7 +106,6 @@ int mtdram_init_device(struct mtd_info *mtd, void *mapped_address, mtd->type = MTD_RAM; mtd->flags = MTD_CAP_RAM; mtd->size = size; - mtd->writesize = 1; mtd->erasesize = MTDRAM_ERASE_SIZE; mtd->priv = mapped_address; diff --git a/drivers/mtd/devices/phram.c b/drivers/mtd/devices/phram.c index 6c7337f9e..e8685ee6c 100644 --- a/drivers/mtd/devices/phram.c +++ b/drivers/mtd/devices/phram.c @@ -1,8 +1,8 @@ /** * $Id: phram.c,v 1.16 2005/11/07 11:14:25 gleixner Exp $ * - * Copyright (c) ???? Jochen Schäuble - * Copyright (c) 2003-2004 Jörn Engel + * Copyright (c) ???? Jochen Schäuble + * Copyright (c) 2003-2004 Jörn Engel * * Usage: * @@ -142,7 +142,7 @@ static int register_device(char *name, unsigned long start, unsigned long len) new->mtd.name = name; new->mtd.size = len; - new->mtd.flags = MTD_CAP_RAM; + new->mtd.flags = MTD_CAP_RAM | MTD_ERASEABLE | MTD_VOLATILE; new->mtd.erase = phram_erase; new->mtd.point = phram_point; new->mtd.unpoint = phram_unpoint; @@ -151,7 +151,6 @@ static int register_device(char *name, unsigned long start, unsigned long len) new->mtd.owner = THIS_MODULE; new->mtd.type = MTD_RAM; new->mtd.erasesize = PAGE_SIZE; - new->mtd.writesize = 1; ret = -EAGAIN; if (add_mtd_device(&new->mtd)) { @@ -267,16 +266,12 @@ static int phram_setup(const char *val, struct kernel_param *kp) return 0; ret = parse_num32(&start, token[1]); - if (ret) { - kfree(name); + if (ret) parse_err("illegal start address\n"); - } ret = parse_num32(&len, token[2]); - if (ret) { - kfree(name); + if (ret) parse_err("illegal device length\n"); - } register_device(name, start, len); @@ -301,5 +296,5 @@ module_init(init_phram); module_exit(cleanup_phram); MODULE_LICENSE("GPL"); -MODULE_AUTHOR("Jörn Engel "); +MODULE_AUTHOR("Jörn Engel "); MODULE_DESCRIPTION("MTD driver for physical RAM"); diff --git a/drivers/mtd/devices/pmc551.c b/drivers/mtd/devices/pmc551.c index 2c0149708..666cce1bf 100644 --- a/drivers/mtd/devices/pmc551.c +++ b/drivers/mtd/devices/pmc551.c @@ -82,6 +82,7 @@ * * Comb the init routine. It's still a bit cludgy on a few things. */ +#include #include #include #include @@ -99,6 +100,10 @@ #include #include +#ifndef CONFIG_PCI +#error Enable PCI in your kernel config +#endif + #include #include #include @@ -546,11 +551,11 @@ static u32 fixup_pmc551 (struct pci_dev *dev) /* * Some screen fun */ - printk(KERN_DEBUG "pmc551: %d%c (0x%x) of %sprefetchable memory at 0x%llx\n", + printk(KERN_DEBUG "pmc551: %d%c (0x%x) of %sprefetchable memory at 0x%lx\n", (size<1024)?size:(size<1048576)?size>>10:size>>20, (size<1024)?'B':(size<1048576)?'K':'M', size, ((dcmd&(0x1<<3)) == 0)?"non-":"", - (unsigned long long)((dev->resource[0].start)&PCI_BASE_ADDRESS_MEM_MASK)); + (dev->resource[0].start)&PCI_BASE_ADDRESS_MEM_MASK ); /* * Check to see the state of the memory @@ -680,8 +685,8 @@ static int __init init_pmc551(void) break; } - printk(KERN_NOTICE "pmc551: Found PCI V370PDC at 0x%llx\n", - (unsigned long long)PCI_Device->resource[0].start); + printk(KERN_NOTICE "pmc551: Found PCI V370PDC at 0x%lX\n", + PCI_Device->resource[0].start); /* * The PMC551 device acts VERY weird if you don't init it @@ -773,8 +778,7 @@ static int __init init_pmc551(void) mtd->type = MTD_RAM; mtd->name = "PMC551 RAM board"; mtd->erasesize = 0x10000; - mtd->writesize = 1; - mtd->owner = THIS_MODULE; + mtd->owner = THIS_MODULE; if (add_mtd_device(mtd)) { printk(KERN_NOTICE "pmc551: Failed to register new device\n"); diff --git a/drivers/mtd/devices/slram.c b/drivers/mtd/devices/slram.c index 542a0c009..6faee6c69 100644 --- a/drivers/mtd/devices/slram.c +++ b/drivers/mtd/devices/slram.c @@ -200,7 +200,8 @@ static int register_device(char *name, unsigned long start, unsigned long length (*curmtd)->mtdinfo->name = name; (*curmtd)->mtdinfo->size = length; - (*curmtd)->mtdinfo->flags = MTD_CAP_RAM; + (*curmtd)->mtdinfo->flags = MTD_CLEAR_BITS | MTD_SET_BITS | + MTD_WRITEB_WRITEABLE | MTD_VOLATILE | MTD_CAP_RAM; (*curmtd)->mtdinfo->erase = slram_erase; (*curmtd)->mtdinfo->point = slram_point; (*curmtd)->mtdinfo->unpoint = slram_unpoint; @@ -209,7 +210,6 @@ static int register_device(char *name, unsigned long start, unsigned long length (*curmtd)->mtdinfo->owner = THIS_MODULE; (*curmtd)->mtdinfo->type = MTD_RAM; (*curmtd)->mtdinfo->erasesize = SLRAM_BLK_SZ; - (*curmtd)->mtdinfo->writesize = 1; if (add_mtd_device((*curmtd)->mtdinfo)) { E("slram: Failed to register new device\n"); diff --git a/drivers/mtd/inftlcore.c b/drivers/mtd/inftlcore.c index 411653580..8a5448901 100644 --- a/drivers/mtd/inftlcore.c +++ b/drivers/mtd/inftlcore.c @@ -24,6 +24,7 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +#include #include #include #include @@ -35,7 +36,6 @@ #include #include #include -#include #include #include #include @@ -47,6 +47,9 @@ */ #define MAX_LOOPS 10000 +extern void INFTL_dumptables(struct INFTLrecord *inftl); +extern void INFTL_dumpVUchains(struct INFTLrecord *inftl); + static void inftl_add_mtd(struct mtd_blktrans_ops *tr, struct mtd_info *mtd) { struct INFTLrecord *inftl; @@ -79,12 +82,14 @@ static void inftl_add_mtd(struct mtd_blktrans_ops *tr, struct mtd_info *mtd) inftl->mbd.devnum = -1; inftl->mbd.blksize = 512; inftl->mbd.tr = tr; + memcpy(&inftl->oobinfo, &mtd->oobinfo, sizeof(struct nand_oobinfo)); + inftl->oobinfo.useecc = MTD_NANDECC_PLACEONLY; - if (INFTL_mount(inftl) < 0) { + if (INFTL_mount(inftl) < 0) { printk(KERN_WARNING "INFTL: could not mount device\n"); kfree(inftl); return; - } + } /* OK, it's a new one. Set up all the data structures. */ @@ -127,7 +132,7 @@ static void inftl_add_mtd(struct mtd_blktrans_ops *tr, struct mtd_info *mtd) return; } #ifdef PSYCHO_DEBUG - printk(KERN_INFO "INFTL: Found new inftl%c\n", inftl->mbd.devnum + 'a'); + printk(KERN_INFO "INFTL: Found new nftl%c\n", nftl->mbd.devnum + 'a'); #endif return; } @@ -149,69 +154,6 @@ static void inftl_remove_dev(struct mtd_blktrans_dev *dev) * Actual INFTL access routines. */ -/* - * Read oob data from flash - */ -int inftl_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 inftl_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 inftl_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; -} - /* * INFTL_findfreeblock: Find a free Erase Unit on the INFTL partition. * This function is used when the give Virtual Unit Chain. @@ -259,11 +201,10 @@ static u16 INFTL_foldchain(struct INFTLrecord *inftl, unsigned thisVUC, unsigned u16 BlockMap[MAX_SECTORS_PER_UNIT]; unsigned char BlockDeleted[MAX_SECTORS_PER_UNIT]; unsigned int thisEUN, prevEUN, status; - struct mtd_info *mtd = inftl->mbd.mtd; int block, silly; unsigned int targetEUN; struct inftl_oob oob; - size_t retlen; + size_t retlen; DEBUG(MTD_DEBUG_LEVEL3, "INFTL: INFTL_foldchain(inftl=%p,thisVUC=%d," "pending=%d)\n", inftl, thisVUC, pendingblock); @@ -283,18 +224,18 @@ static u16 INFTL_foldchain(struct INFTLrecord *inftl, unsigned thisVUC, unsigned * 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; while (thisEUN < inftl->nb_blocks) { for (block = 0; block < inftl->EraseSize/SECTORSIZE; block ++) { if ((BlockMap[block] != 0xffff) || BlockDeleted[block]) continue; - if (inftl_read_oob(mtd, (thisEUN * inftl->EraseSize) - + (block * SECTORSIZE), 16, &retlen, - (char *)&oob) < 0) + if (MTD_READOOB(inftl->mbd.mtd, (thisEUN * inftl->EraseSize) + + (block * SECTORSIZE), 16 , &retlen, + (char *)&oob) < 0) status = SECTOR_IGNORE; else - status = oob.b.Status | oob.b.Status1; + status = oob.b.Status | oob.b.Status1; switch(status) { case SECTOR_FREE: @@ -344,31 +285,29 @@ static u16 INFTL_foldchain(struct INFTLrecord *inftl, unsigned thisVUC, unsigned continue; } - /* + /* * 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(mtd, (inftl->EraseSize * BlockMap[block]) + - (block * SECTORSIZE), SECTORSIZE, &retlen, - movebuf); - if (ret < 0 && ret != -EUCLEAN) { - ret = mtd->read(mtd, - (inftl->EraseSize * BlockMap[block]) + - (block * SECTORSIZE), SECTORSIZE, - &retlen, movebuf); + if (BlockMap[block] == BLOCK_NIL) + continue; + + ret = MTD_READ(inftl->mbd.mtd, (inftl->EraseSize * + BlockMap[block]) + (block * SECTORSIZE), SECTORSIZE, + &retlen, movebuf); + if (ret < 0) { + ret = MTD_READ(inftl->mbd.mtd, (inftl->EraseSize * + BlockMap[block]) + (block * SECTORSIZE), + SECTORSIZE, &retlen, movebuf); if (ret != -EIO) - DEBUG(MTD_DEBUG_LEVEL1, "INFTL: error went " - "away on retry?\n"); - } - memset(&oob, 0xff, sizeof(struct inftl_oob)); - oob.b.Status = oob.b.Status1 = SECTOR_USED; - - inftl_write(inftl->mbd.mtd, (inftl->EraseSize * targetEUN) + - (block * SECTORSIZE), SECTORSIZE, &retlen, - movebuf, (char *)&oob); + DEBUG(MTD_DEBUG_LEVEL1, "INFTL: error went " + "away on retry?\n"); + } + memset(&oob, 0xff, sizeof(struct inftl_oob)); + oob.b.Status = oob.b.Status1 = SECTOR_USED; + MTD_WRITEECC(inftl->mbd.mtd, (inftl->EraseSize * targetEUN) + + (block * SECTORSIZE), SECTORSIZE, &retlen, + movebuf, (char *)&oob, &inftl->oobinfo); } /* @@ -393,17 +332,17 @@ static u16 INFTL_foldchain(struct INFTLrecord *inftl, unsigned thisVUC, unsigned if (thisEUN == targetEUN) break; - if (INFTL_formatblock(inftl, thisEUN) < 0) { + if (INFTL_formatblock(inftl, thisEUN) < 0) { /* * Could not erase : mark block as reserved. */ inftl->PUtable[thisEUN] = BLOCK_RESERVED; - } else { + } else { /* Correctly erased : mark it as free */ inftl->PUtable[thisEUN] = BLOCK_FREE; inftl->PUtable[prevEUN] = BLOCK_NIL; inftl->numfreeEUNs++; - } + } } return targetEUN; @@ -479,7 +418,6 @@ static inline u16 INFTL_findwriteunit(struct INFTLrecord *inftl, unsigned block) unsigned int thisVUC = block / (inftl->EraseSize / SECTORSIZE); unsigned int thisEUN, writeEUN, prev_block, status; unsigned long blockofs = (block * SECTORSIZE) & (inftl->EraseSize -1); - struct mtd_info *mtd = inftl->mbd.mtd; struct inftl_oob oob; struct inftl_bci bci; unsigned char anac, nacs, parity; @@ -499,10 +437,10 @@ static inline u16 INFTL_findwriteunit(struct INFTLrecord *inftl, unsigned block) silly = MAX_LOOPS; while (thisEUN <= inftl->lastEUN) { - inftl_read_oob(mtd, (thisEUN * inftl->EraseSize) + - blockofs, 8, &retlen, (char *)&bci); + MTD_READOOB(inftl->mbd.mtd, (thisEUN * inftl->EraseSize) + + blockofs, 8, &retlen, (char *)&bci); - status = bci.Status | bci.Status1; + status = bci.Status | bci.Status1; DEBUG(MTD_DEBUG_LEVEL3, "INFTL: status of block %d in " "EUN %d is %x\n", block , writeEUN, status); @@ -587,8 +525,8 @@ hitused: nacs = 0; thisEUN = inftl->VUtable[thisVUC]; if (thisEUN != BLOCK_NIL) { - inftl_read_oob(mtd, thisEUN * inftl->EraseSize - + 8, 8, &retlen, (char *)&oob.u); + MTD_READOOB(inftl->mbd.mtd, thisEUN * inftl->EraseSize + + 8, 8, &retlen, (char *)&oob.u); anac = oob.u.a.ANAC + 1; nacs = oob.u.a.NACs + 1; } @@ -609,8 +547,8 @@ hitused: oob.u.a.parityPerField = parity; oob.u.a.discarded = 0xaa; - inftl_write_oob(mtd, writeEUN * inftl->EraseSize + 8, 8, - &retlen, (char *)&oob.u); + MTD_WRITEOOB(inftl->mbd.mtd, writeEUN * inftl->EraseSize + 8, 8, + &retlen, (char *)&oob.u); /* Also back up header... */ oob.u.b.virtualUnitNo = cpu_to_le16(thisVUC); @@ -620,8 +558,8 @@ hitused: oob.u.b.parityPerField = parity; oob.u.b.discarded = 0xaa; - inftl_write_oob(mtd, writeEUN * inftl->EraseSize + - SECTORSIZE * 4 + 8, 8, &retlen, (char *)&oob.u); + MTD_WRITEOOB(inftl->mbd.mtd, writeEUN * inftl->EraseSize + + SECTORSIZE * 4 + 8, 8, &retlen, (char *)&oob.u); inftl->PUtable[writeEUN] = inftl->VUtable[thisVUC]; inftl->VUtable[thisVUC] = writeEUN; @@ -641,7 +579,6 @@ hitused: */ static void INFTL_trydeletechain(struct INFTLrecord *inftl, unsigned thisVUC) { - struct mtd_info *mtd = inftl->mbd.mtd; unsigned char BlockUsed[MAX_SECTORS_PER_UNIT]; unsigned char BlockDeleted[MAX_SECTORS_PER_UNIT]; unsigned int thisEUN, status; @@ -672,9 +609,9 @@ static void INFTL_trydeletechain(struct INFTLrecord *inftl, unsigned thisVUC) if (BlockUsed[block] || BlockDeleted[block]) continue; - if (inftl_read_oob(mtd, (thisEUN * inftl->EraseSize) - + (block * SECTORSIZE), 8 , &retlen, - (char *)&bci) < 0) + if (MTD_READOOB(inftl->mbd.mtd, (thisEUN * inftl->EraseSize) + + (block * SECTORSIZE), 8 , &retlen, + (char *)&bci) < 0) status = SECTOR_IGNORE; else status = bci.Status | bci.Status1; @@ -736,12 +673,12 @@ static void INFTL_trydeletechain(struct INFTLrecord *inftl, unsigned thisVUC) DEBUG(MTD_DEBUG_LEVEL3, "Deleting EUN %d from VUC %d\n", thisEUN, thisVUC); - if (INFTL_formatblock(inftl, thisEUN) < 0) { + if (INFTL_formatblock(inftl, thisEUN) < 0) { /* * Could not erase : mark block as reserved. */ inftl->PUtable[thisEUN] = BLOCK_RESERVED; - } else { + } else { /* Correctly erased : mark it as free */ inftl->PUtable[thisEUN] = BLOCK_FREE; inftl->numfreeEUNs++; @@ -763,7 +700,6 @@ static int INFTL_deleteblock(struct INFTLrecord *inftl, unsigned block) { unsigned int thisEUN = inftl->VUtable[block / (inftl->EraseSize / SECTORSIZE)]; unsigned long blockofs = (block * SECTORSIZE) & (inftl->EraseSize - 1); - struct mtd_info *mtd = inftl->mbd.mtd; unsigned int status; int silly = MAX_LOOPS; size_t retlen; @@ -773,8 +709,8 @@ static int INFTL_deleteblock(struct INFTLrecord *inftl, unsigned block) "block=%d)\n", inftl, block); while (thisEUN < inftl->nb_blocks) { - if (inftl_read_oob(mtd, (thisEUN * inftl->EraseSize) + - blockofs, 8, &retlen, (char *)&bci) < 0) + if (MTD_READOOB(inftl->mbd.mtd, (thisEUN * inftl->EraseSize) + + blockofs, 8, &retlen, (char *)&bci) < 0) status = SECTOR_IGNORE; else status = bci.Status | bci.Status1; @@ -808,10 +744,10 @@ foundit: if (thisEUN != BLOCK_NIL) { loff_t ptr = (thisEUN * inftl->EraseSize) + blockofs; - if (inftl_read_oob(mtd, ptr, 8, &retlen, (char *)&bci) < 0) + if (MTD_READOOB(inftl->mbd.mtd, ptr, 8, &retlen, (char *)&bci) < 0) return -EIO; bci.Status = bci.Status1 = SECTOR_DELETED; - if (inftl_write_oob(mtd, ptr, 8, &retlen, (char *)&bci) < 0) + if (MTD_WRITEOOB(inftl->mbd.mtd, ptr, 8, &retlen, (char *)&bci) < 0) return -EIO; INFTL_trydeletechain(inftl, block / (inftl->EraseSize / SECTORSIZE)); } @@ -851,10 +787,9 @@ static int inftl_writeblock(struct mtd_blktrans_dev *mbd, unsigned long block, memset(&oob, 0xff, sizeof(struct inftl_oob)); oob.b.Status = oob.b.Status1 = SECTOR_USED; - - inftl_write(inftl->mbd.mtd, (writeEUN * inftl->EraseSize) + - blockofs, SECTORSIZE, &retlen, (char *)buffer, - (char *)&oob); + MTD_WRITEECC(inftl->mbd.mtd, (writeEUN * inftl->EraseSize) + + blockofs, SECTORSIZE, &retlen, (char *)buffer, + (char *)&oob, &inftl->oobinfo); /* * need to write SECTOR_USED flags since they are not written * in mtd_writeecc @@ -872,18 +807,17 @@ static int inftl_readblock(struct mtd_blktrans_dev *mbd, unsigned long block, struct INFTLrecord *inftl = (void *)mbd; unsigned int thisEUN = inftl->VUtable[block / (inftl->EraseSize / SECTORSIZE)]; unsigned long blockofs = (block * SECTORSIZE) & (inftl->EraseSize - 1); - struct mtd_info *mtd = inftl->mbd.mtd; - unsigned int status; + unsigned int status; int silly = MAX_LOOPS; - struct inftl_bci bci; + struct inftl_bci bci; size_t retlen; DEBUG(MTD_DEBUG_LEVEL3, "INFTL: inftl_readblock(inftl=%p,block=%ld," "buffer=%p)\n", inftl, block, buffer); while (thisEUN < inftl->nb_blocks) { - if (inftl_read_oob(mtd, (thisEUN * inftl->EraseSize) + - blockofs, 8, &retlen, (char *)&bci) < 0) + if (MTD_READOOB(inftl->mbd.mtd, (thisEUN * inftl->EraseSize) + + blockofs, 8, &retlen, (char *)&bci) < 0) status = SECTOR_IGNORE; else status = bci.Status | bci.Status1; @@ -919,12 +853,10 @@ foundit: /* The requested block is not on the media, return all 0x00 */ memset(buffer, 0, SECTORSIZE); } else { - size_t retlen; + size_t retlen; loff_t ptr = (thisEUN * inftl->EraseSize) + blockofs; - int ret = mtd->read(mtd, ptr, SECTORSIZE, &retlen, buffer); - - /* Handle corrected bit flips gracefully */ - if (ret < 0 && ret != -EUCLEAN) + if (MTD_READ(inftl->mbd.mtd, ptr, SECTORSIZE, &retlen, + buffer)) return -EIO; } return 0; @@ -953,6 +885,8 @@ static struct mtd_blktrans_ops inftl_tr = { .owner = THIS_MODULE, }; +extern char inftlmountrev[]; + static int __init init_inftl(void) { printk(KERN_INFO "INFTL: inftlcore.c $Revision: 1.19 $, " diff --git a/drivers/mtd/inftlmount.c b/drivers/mtd/inftlmount.c index 8f6006f1a..43fdc9433 100644 --- a/drivers/mtd/inftlmount.c +++ b/drivers/mtd/inftlmount.c @@ -43,11 +43,6 @@ char inftlmountrev[]="$Revision: 1.18 $"; -extern int inftl_read_oob(struct mtd_info *mtd, loff_t offs, size_t len, - size_t *retlen, uint8_t *buf); -extern int inftl_write_oob(struct mtd_info *mtd, loff_t offs, size_t len, - size_t *retlen, uint8_t *buf); - /* * find_boot_record: Find the INFTL Media Header and its Spare copy which * contains the various device information of the INFTL partition and @@ -62,7 +57,6 @@ static int find_boot_record(struct INFTLrecord *inftl) unsigned int i, block; u8 buf[SECTORSIZE]; struct INFTLMediaHeader *mh = &inftl->MediaHdr; - struct mtd_info *mtd = inftl->mbd.mtd; struct INFTLPartition *ip; size_t retlen; @@ -86,8 +80,8 @@ static int find_boot_record(struct INFTLrecord *inftl) * Check for BNAND header first. Then whinge if it's found * but later checks fail. */ - ret = mtd->read(mtd, block * inftl->EraseSize, - SECTORSIZE, &retlen, buf); + ret = MTD_READ(inftl->mbd.mtd, block * inftl->EraseSize, + SECTORSIZE, &retlen, buf); /* We ignore ret in case the ECC of the MediaHeader is invalid (which is apparently acceptable) */ if (retlen != SECTORSIZE) { @@ -112,9 +106,8 @@ static int find_boot_record(struct INFTLrecord *inftl) } /* To be safer with BIOS, also use erase mark as discriminant */ - if ((ret = inftl_read_oob(mtd, block * inftl->EraseSize + - SECTORSIZE + 8, 8, &retlen, - (char *)&h1) < 0)) { + if ((ret = MTD_READOOB(inftl->mbd.mtd, block * inftl->EraseSize + + SECTORSIZE + 8, 8, &retlen, (char *)&h1) < 0)) { printk(KERN_WARNING "INFTL: ANAND header found at " "0x%x in mtd%d, but OOB data read failed " "(err %d)\n", block * inftl->EraseSize, @@ -130,8 +123,8 @@ static int find_boot_record(struct INFTLrecord *inftl) memcpy(mh, buf, sizeof(struct INFTLMediaHeader)); /* Read the spare media header at offset 4096 */ - mtd->read(mtd, block * inftl->EraseSize + 4096, - SECTORSIZE, &retlen, buf); + MTD_READ(inftl->mbd.mtd, block * inftl->EraseSize + 4096, + SECTORSIZE, &retlen, buf); if (retlen != SECTORSIZE) { printk(KERN_WARNING "INFTL: Unable to read spare " "Media Header\n"); @@ -240,7 +233,7 @@ static int find_boot_record(struct INFTLrecord *inftl) */ instr->addr = ip->Reserved0 * inftl->EraseSize; instr->len = inftl->EraseSize; - mtd->erase(mtd, instr); + MTD_ERASE(inftl->mbd.mtd, instr); } if ((ip->lastUnit - ip->firstUnit + 1) < ip->virtualUnits) { printk(KERN_WARNING "INFTL: Media Header " @@ -357,21 +350,21 @@ static int check_free_sectors(struct INFTLrecord *inftl, unsigned int address, int len, int check_oob) { u8 buf[SECTORSIZE + inftl->mbd.mtd->oobsize]; - struct mtd_info *mtd = inftl->mbd.mtd; size_t retlen; int i; + DEBUG(MTD_DEBUG_LEVEL3, "INFTL: check_free_sectors(inftl=%p," + "address=0x%x,len=%d,check_oob=%d)\n", inftl, + address, len, check_oob); + for (i = 0; i < len; i += SECTORSIZE) { - if (mtd->read(mtd, address, SECTORSIZE, &retlen, buf)) + if (MTD_READECC(inftl->mbd.mtd, address, SECTORSIZE, &retlen, buf, &buf[SECTORSIZE], &inftl->oobinfo) < 0) return -1; if (memcmpb(buf, 0xff, SECTORSIZE) != 0) return -1; if (check_oob) { - if(inftl_read_oob(mtd, address, mtd->oobsize, - &retlen, &buf[SECTORSIZE]) < 0) - return -1; - if (memcmpb(buf + SECTORSIZE, 0xff, mtd->oobsize) != 0) + if (memcmpb(buf + SECTORSIZE, 0xff, inftl->mbd.mtd->oobsize) != 0) return -1; } address += SECTORSIZE; @@ -394,7 +387,6 @@ int INFTL_formatblock(struct INFTLrecord *inftl, int block) size_t retlen; struct inftl_unittail uci; struct erase_info *instr = &inftl->instr; - struct mtd_info *mtd = inftl->mbd.mtd; int physblock; DEBUG(MTD_DEBUG_LEVEL3, "INFTL: INFTL_formatblock(inftl=%p," @@ -412,9 +404,8 @@ int INFTL_formatblock(struct INFTLrecord *inftl, int block) /* Erase one physical eraseblock at a time, even though the NAND api allows us to group them. This way we if we have a failure, we can mark only the failed block in the bbt. */ - for (physblock = 0; physblock < inftl->EraseSize; - physblock += instr->len, instr->addr += instr->len) { - mtd->erase(inftl->mbd.mtd, instr); + for (physblock = 0; physblock < inftl->EraseSize; physblock += instr->len, instr->addr += instr->len) { + MTD_ERASE(inftl->mbd.mtd, instr); if (instr->state == MTD_ERASE_FAILED) { printk(KERN_WARNING "INFTL: error while formatting block %d\n", @@ -423,10 +414,10 @@ int INFTL_formatblock(struct INFTLrecord *inftl, int block) } /* - * Check the "freeness" of Erase Unit before updating metadata. - * FixMe: is this check really necessary? Since we have check - * the return code after the erase operation. - */ + * Check the "freeness" of Erase Unit before updating metadata. + * FixMe: is this check really necessary? Since we have check the + * return code after the erase operation. + */ if (check_free_sectors(inftl, instr->addr, instr->len, 1) != 0) goto fail; } @@ -438,7 +429,8 @@ int INFTL_formatblock(struct INFTLrecord *inftl, int block) uci.Reserved[2] = 0; uci.Reserved[3] = 0; instr->addr = block * inftl->EraseSize + SECTORSIZE * 2; - if (inftl_write_oob(mtd, instr->addr + 8, 8, &retlen, (char *)&uci) < 0) + if (MTD_WRITEOOB(inftl->mbd.mtd, instr->addr + + 8, 8, &retlen, (char *)&uci) < 0) goto fail; return 0; fail: @@ -557,7 +549,6 @@ void INFTL_dumpVUchains(struct INFTLrecord *s) int INFTL_mount(struct INFTLrecord *s) { - struct mtd_info *mtd = s->mbd.mtd; unsigned int block, first_block, prev_block, last_block; unsigned int first_logical_block, logical_block, erase_mark; int chain_length, do_format_chain; @@ -616,11 +607,10 @@ int INFTL_mount(struct INFTLrecord *s) break; } - if (inftl_read_oob(mtd, block * s->EraseSize + 8, - 8, &retlen, (char *)&h0) < 0 || - inftl_read_oob(mtd, block * s->EraseSize + - 2 * SECTORSIZE + 8, 8, &retlen, - (char *)&h1) < 0) { + if (MTD_READOOB(s->mbd.mtd, block * s->EraseSize + 8, + 8, &retlen, (char *)&h0) < 0 || + MTD_READOOB(s->mbd.mtd, block * s->EraseSize + + 2 * SECTORSIZE + 8, 8, &retlen, (char *)&h1) < 0) { /* Should never happen? */ do_format_chain++; break; diff --git a/drivers/mtd/maps/Kconfig b/drivers/mtd/maps/Kconfig index 64d1b6a6c..7abd7fee0 100644 --- a/drivers/mtd/maps/Kconfig +++ b/drivers/mtd/maps/Kconfig @@ -13,13 +13,13 @@ config MTD_COMPLEX_MAPPINGS config MTD_PHYSMAP tristate "CFI Flash device in physical memory map" - depends on MTD_CFI || MTD_JEDECPROBE || MTD_ROM + depends on MTD_CFI help - This provides a 'mapping' driver which allows the NOR Flash and - ROM driver code to communicate with chips which are mapped - physically into the CPU's memory. You will need to configure - the physical address and size of the flash chips on your - particular board as well as the bus width, either statically + This provides a 'mapping' driver which allows the CFI probe and + command set driver code to communicate with flash chips which + are mapped physically into the CPU's memory. You will need to + configure the physical address and size of the flash chips on + your particular board as well as the bus width, either statically with config options or at run-time. config MTD_PHYSMAP_START @@ -37,7 +37,7 @@ config MTD_PHYSMAP_START config MTD_PHYSMAP_LEN hex "Physical length of flash mapping" depends on MTD_PHYSMAP - default "0" + default "0x4000000" help This is the total length of the mapping of the flash chips on your particular board. If there is space, or aliases, in the @@ -78,7 +78,7 @@ config MTD_PNC2000 config MTD_SC520CDP tristate "CFI Flash device mapped on AMD SC520 CDP" - depends on X86 && MTD_CFI && MTD_CONCAT + depends on X86 && MTD_CFI help The SC520 CDP board has two banks of CFI-compliant chips and one Dual-in-line JEDEC chip. This 'mapping' driver supports that @@ -109,7 +109,7 @@ config MTD_TS5500 mtd1 allows you to reprogram your BIOS. BE VERY CAREFUL. Note that jumper 3 ("Write Enable Drive A") must be set - otherwise detection won't succeed. + otherwise detection won't succeeed. config MTD_SBC_GXX tristate "CFI Flash device mapped on Arcom SBC-GXx boards" @@ -200,8 +200,8 @@ config MTD_TSUNAMI Support for the flash chip on Tsunami TIG bus. config MTD_LASAT - tristate "LASAT flash device" - depends on LASAT && MTD_CFI + tristate "Flash chips on LASAT board" + depends on LASAT help Support for the flash chips on the Lasat 100 and 200 boards. @@ -212,7 +212,7 @@ config MTD_NETtel Support for flash chips on NETtel/SecureEdge/SnapGear boards. config MTD_ALCHEMY - tristate "AMD Alchemy Pb1xxx/Db1xxx/RDK MTD support" + tristate ' AMD Alchemy Pb1xxx/Db1xxx/RDK MTD support' depends on SOC_AU1X00 help Flash memory access on AMD Alchemy Pb/Db/RDK Reference Boards @@ -561,6 +561,7 @@ config MTD_PCMCIA config MTD_PCMCIA_ANONYMOUS bool "Use PCMCIA MTD drivers for anonymous PCMCIA cards" depends on MTD_PCMCIA + default N help If this option is enabled, PCMCIA cards which do not report anything about themselves are assumed to be MTD cards. diff --git a/drivers/mtd/maps/alchemy-flash.c b/drivers/mtd/maps/alchemy-flash.c index 7fc8097e4..a57791a6c 100644 --- a/drivers/mtd/maps/alchemy-flash.c +++ b/drivers/mtd/maps/alchemy-flash.c @@ -7,6 +7,7 @@ * */ +#include #include #include #include @@ -125,6 +126,8 @@ static struct mtd_partition alchemy_partitions[] = { } }; +#define NB_OF(x) (sizeof(x)/sizeof(x[0])) + static struct mtd_info *mymtd; int __init alchemy_mtd_init(void) @@ -151,7 +154,7 @@ int __init alchemy_mtd_init(void) * Static partition definition selection */ parts = alchemy_partitions; - nb_parts = ARRAY_SIZE(alchemy_partitions); + nb_parts = NB_OF(alchemy_partitions); alchemy_map.size = window_size; /* diff --git a/drivers/mtd/maps/amd76xrom.c b/drivers/mtd/maps/amd76xrom.c index 447955be1..c350878d4 100644 --- a/drivers/mtd/maps/amd76xrom.c +++ b/drivers/mtd/maps/amd76xrom.c @@ -14,6 +14,7 @@ #include #include #include +#include #include #include #include @@ -122,10 +123,9 @@ static int __devinit amd76xrom_init_one (struct pci_dev *pdev, window->rsrc.parent = NULL; printk(KERN_ERR MOD_NAME " %s(): Unable to register resource" - " 0x%.16llx-0x%.16llx - kernel bug?\n", + " 0x%.08lx-0x%.08lx - kernel bug?\n", __func__, - (unsigned long long)window->rsrc.start, - (unsigned long long)window->rsrc.end); + window->rsrc.start, window->rsrc.end); } #if 0 diff --git a/drivers/mtd/maps/ceiva.c b/drivers/mtd/maps/ceiva.c index 0402c21e2..5a95ab370 100644 --- a/drivers/mtd/maps/ceiva.c +++ b/drivers/mtd/maps/ceiva.c @@ -14,6 +14,7 @@ * $Id: ceiva.c,v 1.11 2004/09/16 23:27:12 gleixner Exp $ */ +#include #include #include #include diff --git a/drivers/mtd/maps/cfi_flagadm.c b/drivers/mtd/maps/cfi_flagadm.c index 92b5d883d..6a8c0415b 100644 --- a/drivers/mtd/maps/cfi_flagadm.c +++ b/drivers/mtd/maps/cfi_flagadm.c @@ -1,5 +1,5 @@ /* - * Copyright © 2001 Flaga hf. Medical Devices, Kári Davíðsson + * Copyright © 2001 Flaga hf. Medical Devices, Kári Davíðsson * * $Id: cfi_flagadm.c,v 1.15 2005/11/07 11:14:26 gleixner Exp $ * @@ -86,7 +86,7 @@ struct mtd_partition flagadm_parts[] = { } }; -#define PARTITION_COUNT ARRAY_SIZE(flagadm_parts) +#define PARTITION_COUNT (sizeof(flagadm_parts)/sizeof(struct mtd_partition)) static struct mtd_info *mymtd; @@ -135,5 +135,5 @@ module_exit(cleanup_flagadm); MODULE_LICENSE("GPL"); -MODULE_AUTHOR("Kári Davíðsson "); +MODULE_AUTHOR("Kári Davíðsson "); MODULE_DESCRIPTION("MTD map driver for Flaga digital module"); diff --git a/drivers/mtd/maps/cstm_mips_ixx.c b/drivers/mtd/maps/cstm_mips_ixx.c index aa56defb9..a370953c1 100644 --- a/drivers/mtd/maps/cstm_mips_ixx.c +++ b/drivers/mtd/maps/cstm_mips_ixx.c @@ -38,6 +38,7 @@ #include #include #include +#include #include #if defined(CONFIG_MIPS_ITE8172) || defined(CONFIG_MIPS_IVR) diff --git a/drivers/mtd/maps/dbox2-flash.c b/drivers/mtd/maps/dbox2-flash.c index 92a9c7fac..49d90542f 100644 --- a/drivers/mtd/maps/dbox2-flash.c +++ b/drivers/mtd/maps/dbox2-flash.c @@ -12,6 +12,7 @@ #include #include #include +#include #include /* partition_info gives details on the logical partitions that the split the @@ -56,7 +57,7 @@ static struct mtd_partition partition_info[]= { } }; -#define NUM_PARTITIONS ARRAY_SIZE(partition_info) +#define NUM_PARTITIONS (sizeof(partition_info) / sizeof(partition_info[0])) #define WINDOW_ADDR 0x10000000 #define WINDOW_SIZE 0x800000 @@ -121,5 +122,5 @@ module_exit(cleanup_dbox2_flash); MODULE_LICENSE("GPL"); -MODULE_AUTHOR("Kári Davíðsson , Bastian Blank , Alexander Wild "); +MODULE_AUTHOR("Kári Davíðsson , Bastian Blank , Alexander Wild "); MODULE_DESCRIPTION("MTD map driver for D-Box 2 board"); diff --git a/drivers/mtd/maps/dc21285.c b/drivers/mtd/maps/dc21285.c index b32bb9347..8b3784e2d 100644 --- a/drivers/mtd/maps/dc21285.c +++ b/drivers/mtd/maps/dc21285.c @@ -7,6 +7,7 @@ * * $Id: dc21285.c,v 1.24 2005/11/07 11:14:26 gleixner Exp $ */ +#include #include #include #include diff --git a/drivers/mtd/maps/dilnetpc.c b/drivers/mtd/maps/dilnetpc.c index b1104fe1f..b51c75781 100644 --- a/drivers/mtd/maps/dilnetpc.c +++ b/drivers/mtd/maps/dilnetpc.c @@ -25,6 +25,7 @@ * and http://www.ssv-embedded.de/ssv/pc104/p170.htm */ +#include #include #include #include @@ -217,8 +218,8 @@ static void dnp_set_vpp(struct map_info *not_used, int on) { if(--vpp_counter == 0) setcsc(CSC_RBWR, getcsc(CSC_RBWR) | 0x4); - else - BUG_ON(vpp_counter < 0); + else if(vpp_counter < 0) + BUG(); } spin_unlock_irq(&dnpc_spin); } @@ -239,8 +240,8 @@ static void adnp_set_vpp(struct map_info *not_used, int on) { if(--vpp_counter == 0) setcsc(CSC_RBWR, getcsc(CSC_RBWR) | 0x8); - else - BUG_ON(vpp_counter < 0); + else if(vpp_counter < 0) + BUG(); } spin_unlock_irq(&dnpc_spin); } @@ -299,7 +300,7 @@ static struct mtd_partition partition_info[]= }, }; -#define NUM_PARTITIONS ARRAY_SIZE(partition_info) +#define NUM_PARTITIONS (sizeof(partition_info)/sizeof(partition_info[0])) static struct mtd_info *mymtd; static struct mtd_info *lowlvl_parts[NUM_PARTITIONS]; @@ -344,7 +345,7 @@ static struct mtd_partition higlvl_partition_info[]= }, }; -#define NUM_HIGHLVL_PARTITIONS ARRAY_SIZE(higlvl_partition_info) +#define NUM_HIGHLVL_PARTITIONS (sizeof(higlvl_partition_info)/sizeof(partition_info[0])) static int dnp_adnp_probe(void) diff --git a/drivers/mtd/maps/dmv182.c b/drivers/mtd/maps/dmv182.c index a43c49905..b993ac01a 100644 --- a/drivers/mtd/maps/dmv182.c +++ b/drivers/mtd/maps/dmv182.c @@ -16,6 +16,7 @@ * option) any later version. */ +#include #include #include #include @@ -98,7 +99,7 @@ static struct mtd_info *this_mtd; static int __init init_svme182(void) { struct mtd_partition *partitions; - int num_parts = ARRAY_SIZE(svme182_partitions); + int num_parts = sizeof(svme182_partitions) / sizeof(struct mtd_partition); partitions = svme182_partitions; diff --git a/drivers/mtd/maps/ebony.c b/drivers/mtd/maps/ebony.c index 641e1dd84..60a6e51d6 100644 --- a/drivers/mtd/maps/ebony.c +++ b/drivers/mtd/maps/ebony.c @@ -20,6 +20,7 @@ #include #include #include +#include #include #include #include diff --git a/drivers/mtd/maps/edb7312.c b/drivers/mtd/maps/edb7312.c index 1c5b97c89..b48a3473f 100644 --- a/drivers/mtd/maps/edb7312.c +++ b/drivers/mtd/maps/edb7312.c @@ -17,6 +17,7 @@ #include #include #include +#include #ifdef CONFIG_MTD_PARTITIONS #include diff --git a/drivers/mtd/maps/h720x-flash.c b/drivers/mtd/maps/h720x-flash.c index 6dde3182d..319094821 100644 --- a/drivers/mtd/maps/h720x-flash.c +++ b/drivers/mtd/maps/h720x-flash.c @@ -8,6 +8,7 @@ * 2003 Thomas Gleixner */ +#include #include #include #include @@ -58,7 +59,7 @@ static struct mtd_partition h720x_partitions[] = { } }; -#define NUM_PARTITIONS ARRAY_SIZE(h720x_partitions) +#define NUM_PARTITIONS (sizeof(h720x_partitions)/sizeof(h720x_partitions[0])) static int nr_mtd_parts; static struct mtd_partition *mtd_parts; diff --git a/drivers/mtd/maps/ichxrom.c b/drivers/mtd/maps/ichxrom.c index db4b570d8..ea5073781 100644 --- a/drivers/mtd/maps/ichxrom.c +++ b/drivers/mtd/maps/ichxrom.c @@ -14,6 +14,7 @@ #include #include #include +#include #include #include #include @@ -176,10 +177,9 @@ static int __devinit ichxrom_init_one (struct pci_dev *pdev, window->rsrc.parent = NULL; printk(KERN_DEBUG MOD_NAME ": %s(): Unable to register resource" - " 0x%.16llx-0x%.16llx - kernel bug?\n", + " 0x%.08lx-0x%.08lx - kernel bug?\n", __func__, - (unsigned long long)window->rsrc.start, - (unsigned long long)window->rsrc.end); + window->rsrc.start, window->rsrc.end); } /* Map the firmware hub into my address space. */ diff --git a/drivers/mtd/maps/impa7.c b/drivers/mtd/maps/impa7.c index a0b4dc715..ba7f40311 100644 --- a/drivers/mtd/maps/impa7.c +++ b/drivers/mtd/maps/impa7.c @@ -17,6 +17,7 @@ #include #include #include +#include #ifdef CONFIG_MTD_PARTITIONS #include diff --git a/drivers/mtd/maps/integrator-flash.c b/drivers/mtd/maps/integrator-flash.c index c8db01b3e..a3ba52fbd 100644 --- a/drivers/mtd/maps/integrator-flash.c +++ b/drivers/mtd/maps/integrator-flash.c @@ -26,6 +26,7 @@ ======================================================================*/ +#include #include #include #include diff --git a/drivers/mtd/maps/ipaq-flash.c b/drivers/mtd/maps/ipaq-flash.c index f27c13279..b8ccb0a95 100644 --- a/drivers/mtd/maps/ipaq-flash.c +++ b/drivers/mtd/maps/ipaq-flash.c @@ -8,6 +8,7 @@ * $Id: ipaq-flash.c,v 1.5 2005/11/07 11:14:27 gleixner Exp $ */ +#include #include #include #include diff --git a/drivers/mtd/maps/ixp2000.c b/drivers/mtd/maps/ixp2000.c index c26488a17..2c9cc7f37 100644 --- a/drivers/mtd/maps/ixp2000.c +++ b/drivers/mtd/maps/ixp2000.c @@ -42,6 +42,7 @@ struct ixp2000_flash_info { struct map_info map; struct mtd_partition *partitions; struct resource *res; + int nr_banks; }; static inline unsigned long flash_bank_setup(struct map_info *map, unsigned long ofs) @@ -182,6 +183,7 @@ static int ixp2000_flash_probe(struct platform_device *dev) */ info->map.phys = NO_XIP; + info->nr_banks = ixp_data->nr_banks; info->map.size = ixp_data->nr_banks * window_size; info->map.bankwidth = 1; diff --git a/drivers/mtd/maps/l440gx.c b/drivers/mtd/maps/l440gx.c index 6b784ef5e..851bf9576 100644 --- a/drivers/mtd/maps/l440gx.c +++ b/drivers/mtd/maps/l440gx.c @@ -13,6 +13,7 @@ #include #include #include +#include #define PIIXE_IOBASE_RESOURCE 11 diff --git a/drivers/mtd/maps/lasat.c b/drivers/mtd/maps/lasat.c index 1c13d2dc0..c658d4045 100644 --- a/drivers/mtd/maps/lasat.c +++ b/drivers/mtd/maps/lasat.c @@ -19,6 +19,7 @@ #include #include #include +#include #include static struct mtd_info *lasat_mtd; diff --git a/drivers/mtd/maps/mpc1211.c b/drivers/mtd/maps/mpc1211.c index 45a00fac8..4685e8e13 100644 --- a/drivers/mtd/maps/mpc1211.c +++ b/drivers/mtd/maps/mpc1211.c @@ -15,6 +15,7 @@ #include #include #include +#include static struct mtd_info *flash_mtd; static struct mtd_partition *parsed_parts; diff --git a/drivers/mtd/maps/mtx-1_flash.c b/drivers/mtd/maps/mtx-1_flash.c index d884f2be2..d1e66e186 100644 --- a/drivers/mtd/maps/mtx-1_flash.c +++ b/drivers/mtd/maps/mtx-1_flash.c @@ -4,10 +4,11 @@ * $Id: mtx-1_flash.c,v 1.2 2005/11/07 11:14:27 gleixner Exp $ * * (C) 2005 Bruno Randolf - * (C) 2005 Jörn Engel + * (C) 2005 Jörn Engel * */ +#include #include #include #include diff --git a/drivers/mtd/maps/netsc520.c b/drivers/mtd/maps/netsc520.c index ed2154701..33060a315 100644 --- a/drivers/mtd/maps/netsc520.c +++ b/drivers/mtd/maps/netsc520.c @@ -76,7 +76,7 @@ static struct mtd_partition partition_info[]={ .size = 0x80000 }, }; -#define NUM_PARTITIONS ARRAY_SIZE(partition_info) +#define NUM_PARTITIONS (sizeof(partition_info)/sizeof(partition_info[0])) #define WINDOW_SIZE 0x00100000 #define WINDOW_ADDR 0x00200000 @@ -88,7 +88,7 @@ static struct map_info netsc520_map = { .phys = WINDOW_ADDR, }; -#define NUM_FLASH_BANKS ARRAY_SIZE(netsc520_map) +#define NUM_FLASH_BANKS (sizeof(netsc520_map)/sizeof(struct map_info)) static struct mtd_info *mymtd; diff --git a/drivers/mtd/maps/nettel.c b/drivers/mtd/maps/nettel.c index 0994b5b2e..632eb2aa9 100644 --- a/drivers/mtd/maps/nettel.c +++ b/drivers/mtd/maps/nettel.c @@ -20,8 +20,6 @@ #include #include #include -#include -#include #include /****************************************************************************/ @@ -130,7 +128,8 @@ static struct mtd_partition nettel_amd_partitions[] = { } }; -#define NUM_AMD_PARTITIONS ARRAY_SIZE(nettel_amd_partitions) +#define NUM_AMD_PARTITIONS \ + (sizeof(nettel_amd_partitions)/sizeof(nettel_amd_partitions[0])) /****************************************************************************/ @@ -190,7 +189,7 @@ int nettel_eraseconfig(void) set_current_state(TASK_INTERRUPTIBLE); add_wait_queue(&wait_q, &wait); - ret = mtd->erase(mtd, &nettel_erase); + ret = MTD_ERASE(mtd, &nettel_erase); if (ret) { set_current_state(TASK_RUNNING); remove_wait_queue(&wait_q, &wait); diff --git a/drivers/mtd/maps/ocotea.c b/drivers/mtd/maps/ocotea.c index 2f07602ba..c223514ca 100644 --- a/drivers/mtd/maps/ocotea.c +++ b/drivers/mtd/maps/ocotea.c @@ -18,6 +18,7 @@ #include #include #include +#include #include #include #include @@ -57,6 +58,8 @@ static struct mtd_partition ocotea_large_partitions[] = { } }; +#define NB_OF(x) (sizeof(x)/sizeof(x[0])) + int __init init_ocotea(void) { u8 fpga0_reg; @@ -94,7 +97,7 @@ int __init init_ocotea(void) if (flash) { flash->owner = THIS_MODULE; add_mtd_partitions(flash, ocotea_small_partitions, - ARRAY_SIZE(ocotea_small_partitions)); + NB_OF(ocotea_small_partitions)); } else { printk("map probe failed for flash\n"); return -ENXIO; @@ -115,7 +118,7 @@ int __init init_ocotea(void) if (flash) { flash->owner = THIS_MODULE; add_mtd_partitions(flash, ocotea_large_partitions, - ARRAY_SIZE(ocotea_large_partitions)); + NB_OF(ocotea_large_partitions)); } else { printk("map probe failed for flash\n"); return -ENXIO; diff --git a/drivers/mtd/maps/omap-toto-flash.c b/drivers/mtd/maps/omap-toto-flash.c index e6e391efb..dc3765270 100644 --- a/drivers/mtd/maps/omap-toto-flash.c +++ b/drivers/mtd/maps/omap-toto-flash.c @@ -8,6 +8,7 @@ * $Id: omap-toto-flash.c,v 1.5 2005/11/07 11:14:27 gleixner Exp $ */ +#include #include #include #include diff --git a/drivers/mtd/maps/pci.c b/drivers/mtd/maps/pci.c index d2ab1bae9..21822c2ed 100644 --- a/drivers/mtd/maps/pci.c +++ b/drivers/mtd/maps/pci.c @@ -334,6 +334,9 @@ mtd_pci_probe(struct pci_dev *dev, const struct pci_device_id *id) return 0; release: + if (mtd) + map_destroy(mtd); + if (map) { map->exit(dev, map); kfree(map); diff --git a/drivers/mtd/maps/pcmciamtd.c b/drivers/mtd/maps/pcmciamtd.c index c861134cb..f0f8916da 100644 --- a/drivers/mtd/maps/pcmciamtd.c +++ b/drivers/mtd/maps/pcmciamtd.c @@ -28,7 +28,7 @@ #ifdef CONFIG_MTD_DEBUG static int debug = CONFIG_MTD_DEBUG_VERBOSE; -module_param(debug, int, 0); +MODULE_PARM(debug, "i"); MODULE_PARM_DESC(debug, "Set Debug Level 0=quiet, 5=noisy"); #undef DEBUG #define DEBUG(n, format, arg...) \ @@ -54,7 +54,7 @@ static const int debug = 0; #define MAX_PCMCIA_ADDR 0x4000000 struct pcmciamtd_dev { - struct pcmcia_device *p_dev; + dev_link_t link; /* PCMCIA link */ dev_node_t node; /* device node */ caddr_t win_base; /* ioremapped address of PCMCIA window */ unsigned int win_size; /* size of window */ @@ -89,17 +89,17 @@ static int mem_type; MODULE_LICENSE("GPL"); MODULE_AUTHOR("Simon Evans "); MODULE_DESCRIPTION(DRIVER_DESC); -module_param(bankwidth, int, 0); +MODULE_PARM(bankwidth, "i"); MODULE_PARM_DESC(bankwidth, "Set bankwidth (1=8 bit, 2=16 bit, default=2)"); -module_param(mem_speed, int, 0); +MODULE_PARM(mem_speed, "i"); MODULE_PARM_DESC(mem_speed, "Set memory access speed in ns"); -module_param(force_size, int, 0); +MODULE_PARM(force_size, "i"); MODULE_PARM_DESC(force_size, "Force size of card in MiB (1-64)"); -module_param(setvpp, int, 0); +MODULE_PARM(setvpp, "i"); MODULE_PARM_DESC(setvpp, "Set Vpp (0=Never, 1=On writes, 2=Always on, default=0)"); -module_param(vpp, int, 0); +MODULE_PARM(vpp, "i"); MODULE_PARM_DESC(vpp, "Vpp value in 1/10ths eg 33=3.3V 120=12V (Dangerous)"); -module_param(mem_type, int, 0); +MODULE_PARM(mem_type, "i"); MODULE_PARM_DESC(mem_type, "Set Memory type (0=Flash, 1=RAM, 2=ROM, default=0)"); @@ -111,8 +111,8 @@ static caddr_t remap_window(struct map_info *map, unsigned long to) memreq_t mrq; int ret; - if (!pcmcia_dev_present(dev->p_dev)) { - DEBUG(1, "device removed"); + if(!(dev->link.state & DEV_PRESENT)) { + DEBUG(1, "device removed state = 0x%4.4X", dev->link.state); return 0; } @@ -122,7 +122,7 @@ static caddr_t remap_window(struct map_info *map, unsigned long to) dev->offset, mrq.CardOffset); mrq.Page = 0; if( (ret = pcmcia_map_mem_page(win, &mrq)) != CS_SUCCESS) { - cs_error(dev->p_dev, MapMemPage, ret); + cs_error(dev->link.handle, MapMemPage, ret); return NULL; } dev->offset = mrq.CardOffset; @@ -238,7 +238,7 @@ static void pcmcia_copy_to_remap(struct map_info *map, unsigned long to, const v /* read/write{8,16} copy_{from,to} routines with direct access */ -#define DEV_REMOVED(x) (!(pcmcia_dev_present(((struct pcmciamtd_dev *)map->map_priv_1)->p_dev))) +#define DEV_REMOVED(x) (!(*(u_int *)x->map_priv_1 & DEV_PRESENT)) static map_word pcmcia_read8(struct map_info *map, unsigned long ofs) { @@ -319,7 +319,7 @@ static void pcmcia_copy_to(struct map_info *map, unsigned long to, const void *f static void pcmciamtd_set_vpp(struct map_info *map, int on) { struct pcmciamtd_dev *dev = (struct pcmciamtd_dev *)map->map_priv_1; - struct pcmcia_device *link = dev->p_dev; + dev_link_t *link = &dev->link; modconf_t mod; int ret; @@ -328,9 +328,9 @@ static void pcmciamtd_set_vpp(struct map_info *map, int on) mod.Vpp1 = mod.Vpp2 = on ? dev->vpp : 0; DEBUG(2, "dev = %p on = %d vpp = %d\n", dev, on, dev->vpp); - ret = pcmcia_modify_configuration(link, &mod); + ret = pcmcia_modify_configuration(link->handle, &mod); if(ret != CS_SUCCESS) { - cs_error(link, ModifyConfiguration, ret); + cs_error(link->handle, ModifyConfiguration, ret); } } @@ -340,7 +340,7 @@ static void pcmciamtd_set_vpp(struct map_info *map, int on) * still open, this will be postponed until it is closed. */ -static void pcmciamtd_release(struct pcmcia_device *link) +static void pcmciamtd_release(dev_link_t *link) { struct pcmciamtd_dev *dev = link->priv; @@ -353,11 +353,12 @@ static void pcmciamtd_release(struct pcmcia_device *link) } pcmcia_release_window(link->win); } - pcmcia_disable_device(link); + pcmcia_release_configuration(link->handle); + link->state &= ~DEV_CONFIG; } -static void card_settings(struct pcmciamtd_dev *dev, struct pcmcia_device *link, int *new_name) +static void card_settings(struct pcmciamtd_dev *dev, dev_link_t *link, int *new_name) { int rc; tuple_t tuple; @@ -370,16 +371,16 @@ static void card_settings(struct pcmciamtd_dev *dev, struct pcmcia_device *link, tuple.TupleOffset = 0; tuple.DesiredTuple = RETURN_FIRST_TUPLE; - rc = pcmcia_get_first_tuple(link, &tuple); + rc = pcmcia_get_first_tuple(link->handle, &tuple); while(rc == CS_SUCCESS) { - rc = pcmcia_get_tuple_data(link, &tuple); + rc = pcmcia_get_tuple_data(link->handle, &tuple); if(rc != CS_SUCCESS) { - cs_error(link, GetTupleData, rc); + cs_error(link->handle, GetTupleData, rc); break; } - rc = pcmcia_parse_tuple(link, &tuple, &parse); + rc = pcmcia_parse_tuple(link->handle, &tuple, &parse); if(rc != CS_SUCCESS) { - cs_error(link, ParseTuple, rc); + cs_error(link->handle, ParseTuple, rc); break; } @@ -450,7 +451,7 @@ static void card_settings(struct pcmciamtd_dev *dev, struct pcmcia_device *link, DEBUG(2, "Unknown tuple code %d", tuple.TupleCode); } - rc = pcmcia_get_next_tuple(link, &tuple); + rc = pcmcia_get_next_tuple(link->handle, &tuple); } if(!dev->pcmcia_map.size) dev->pcmcia_map.size = MAX_PCMCIA_ADDR; @@ -487,7 +488,7 @@ static void card_settings(struct pcmciamtd_dev *dev, struct pcmcia_device *link, #define CS_CHECK(fn, ret) \ do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0) -static int pcmciamtd_config(struct pcmcia_device *link) +static void pcmciamtd_config(dev_link_t *link) { struct pcmciamtd_dev *dev = link->priv; struct mtd_info *mtd = NULL; @@ -503,10 +504,13 @@ static int pcmciamtd_config(struct pcmcia_device *link) DEBUG(3, "link=0x%p", link); + /* Configure card */ + link->state |= DEV_CONFIG; + DEBUG(2, "Validating CIS"); - ret = pcmcia_validate_cis(link, &cisinfo); + ret = pcmcia_validate_cis(link->handle, &cisinfo); if(ret != CS_SUCCESS) { - cs_error(link, GetTupleData, ret); + cs_error(link->handle, GetTupleData, ret); } else { DEBUG(2, "ValidateCIS found %d chains", cisinfo.Chains); } @@ -534,7 +538,7 @@ static int pcmciamtd_config(struct pcmcia_device *link) req.Attributes |= (dev->pcmcia_map.bankwidth == 1) ? WIN_DATA_WIDTH_8 : WIN_DATA_WIDTH_16; req.Base = 0; req.AccessSpeed = mem_speed; - link->win = (window_handle_t)link; + link->win = (window_handle_t)link->handle; req.Size = (force_size) ? force_size << 20 : MAX_PCMCIA_ADDR; dev->win_size = 0; @@ -542,7 +546,7 @@ static int pcmciamtd_config(struct pcmcia_device *link) int ret; DEBUG(2, "requesting window with size = %dKiB memspeed = %d", req.Size >> 10, req.AccessSpeed); - ret = pcmcia_request_window(&link, &req, &link->win); + ret = pcmcia_request_window(&link->handle, &req, &link->win); DEBUG(2, "ret = %d dev->win_size = %d", ret, dev->win_size); if(ret) { req.Size >>= 1; @@ -558,19 +562,19 @@ static int pcmciamtd_config(struct pcmcia_device *link) if(!dev->win_size) { err("Cant allocate memory window"); pcmciamtd_release(link); - return -ENODEV; + return; } DEBUG(1, "Allocated a window of %dKiB", dev->win_size >> 10); /* Get write protect status */ - CS_CHECK(GetStatus, pcmcia_get_status(link, &status)); + CS_CHECK(GetStatus, pcmcia_get_status(link->handle, &status)); DEBUG(2, "status value: 0x%x window handle = 0x%8.8lx", status.CardState, (unsigned long)link->win); dev->win_base = ioremap(req.Base, req.Size); if(!dev->win_base) { err("ioremap(%lu, %u) failed", req.Base, req.Size); pcmciamtd_release(link); - return -ENODEV; + return; } DEBUG(1, "mapped window dev = %p req.base = 0x%lx base = %p size = 0x%x", dev, req.Base, dev->win_base, req.Size); @@ -580,14 +584,17 @@ static int pcmciamtd_config(struct pcmcia_device *link) dev->pcmcia_map.map_priv_2 = (unsigned long)link->win; DEBUG(2, "Getting configuration"); - CS_CHECK(GetConfigurationInfo, pcmcia_get_configuration_info(link, &t)); + CS_CHECK(GetConfigurationInfo, pcmcia_get_configuration_info(link->handle, &t)); DEBUG(2, "Vcc = %d Vpp1 = %d Vpp2 = %d", t.Vcc, t.Vpp1, t.Vpp2); dev->vpp = (vpp) ? vpp : t.Vpp1; link->conf.Attributes = 0; + link->conf.Vcc = t.Vcc; if(setvpp == 2) { - link->conf.Vpp = dev->vpp; + link->conf.Vpp1 = dev->vpp; + link->conf.Vpp2 = dev->vpp; } else { - link->conf.Vpp = 0; + link->conf.Vpp1 = 0; + link->conf.Vpp2 = 0; } link->conf.IntType = INT_MEMORY; @@ -599,10 +606,9 @@ static int pcmciamtd_config(struct pcmcia_device *link) link->conf.ConfigIndex = 0; link->conf.Present = t.Present; DEBUG(2, "Setting Configuration"); - ret = pcmcia_request_configuration(link, &link->conf); + ret = pcmcia_request_configuration(link->handle, &link->conf); if(ret != CS_SUCCESS) { - cs_error(link, RequestConfiguration, ret); - return -ENODEV; + cs_error(link->handle, RequestConfiguration, ret); } if(mem_type == 1) { @@ -610,7 +616,7 @@ static int pcmciamtd_config(struct pcmcia_device *link) } else if(mem_type == 2) { mtd = do_map_probe("map_rom", &dev->pcmcia_map); } else { - for(i = 0; i < ARRAY_SIZE(probes); i++) { + for(i = 0; i < sizeof(probes) / sizeof(char *); i++) { DEBUG(1, "Trying %s", probes[i]); mtd = do_map_probe(probes[i], &dev->pcmcia_map); if(mtd) @@ -623,7 +629,7 @@ static int pcmciamtd_config(struct pcmcia_device *link) if(!mtd) { DEBUG(1, "Cant find an MTD"); pcmciamtd_release(link); - return -ENODEV; + return; } dev->mtd_info = mtd; @@ -648,6 +654,7 @@ static int pcmciamtd_config(struct pcmcia_device *link) use the faster non-remapping read/write functions */ if(mtd->size <= dev->win_size) { DEBUG(1, "Using non remapping memory functions"); + dev->pcmcia_map.map_priv_1 = (unsigned long)&(dev->link.state); dev->pcmcia_map.map_priv_2 = (unsigned long)dev->win_base; if (dev->pcmcia_map.bankwidth == 1) { dev->pcmcia_map.read = pcmcia_read8; @@ -665,18 +672,19 @@ static int pcmciamtd_config(struct pcmcia_device *link) dev->mtd_info = NULL; err("Couldnt register MTD device"); pcmciamtd_release(link); - return -ENODEV; + return; } snprintf(dev->node.dev_name, sizeof(dev->node.dev_name), "mtd%d", mtd->index); info("mtd%d: %s", mtd->index, mtd->name); - link->dev_node = &dev->node; - return 0; + link->state &= ~DEV_CONFIG_PENDING; + link->dev = &dev->node; + return; cs_failed: - cs_error(link, last_fn, last_ret); + cs_error(link->handle, last_fn, last_ret); err("CS Error, exiting"); pcmciamtd_release(link); - return -ENODEV; + return; } @@ -705,19 +713,21 @@ static int pcmciamtd_resume(struct pcmcia_device *dev) * when the device is released. */ -static void pcmciamtd_detach(struct pcmcia_device *link) +static void pcmciamtd_detach(struct pcmcia_device *p_dev) { - struct pcmciamtd_dev *dev = link->priv; + dev_link_t *link = dev_to_instance(p_dev); DEBUG(3, "link=0x%p", link); - if(dev->mtd_info) { - del_mtd_device(dev->mtd_info); - map_destroy(dev->mtd_info); - info("mtd%d: Removed", dev->mtd_info->index); - } + if(link->state & DEV_CONFIG) { + struct pcmciamtd_dev *dev = link->priv; + if(dev->mtd_info) { + del_mtd_device(dev->mtd_info); + info("mtd%d: Removed", dev->mtd_info->index); + } - pcmciamtd_release(link); + pcmciamtd_release(link); + } } @@ -726,9 +736,10 @@ static void pcmciamtd_detach(struct pcmcia_device *link) * with Card Services. */ -static int pcmciamtd_probe(struct pcmcia_device *link) +static int pcmciamtd_attach(struct pcmcia_device *p_dev) { struct pcmciamtd_dev *dev; + dev_link_t *link; /* Create new memory card device */ dev = kmalloc(sizeof(*dev), GFP_KERNEL); @@ -736,13 +747,20 @@ static int pcmciamtd_probe(struct pcmcia_device *link) DEBUG(1, "dev=0x%p", dev); memset(dev, 0, sizeof(*dev)); - dev->p_dev = link; + link = &dev->link; link->priv = dev; link->conf.Attributes = 0; link->conf.IntType = INT_MEMORY; - return pcmciamtd_config(link); + link->next = NULL; + link->handle = p_dev; + p_dev->instance = link; + + link->state |= DEV_PRESENT | DEV_CONFIG_PENDING; + pcmciamtd_config(link); + + return 0; } static struct pcmcia_device_id pcmciamtd_ids[] = { @@ -776,7 +794,7 @@ static struct pcmcia_driver pcmciamtd_driver = { .drv = { .name = "pcmciamtd" }, - .probe = pcmciamtd_probe, + .probe = pcmciamtd_attach, .remove = pcmciamtd_detach, .owner = THIS_MODULE, .id_table = pcmciamtd_ids, diff --git a/drivers/mtd/maps/physmap.c b/drivers/mtd/maps/physmap.c index 7799a25a7..f49ebc3c4 100644 --- a/drivers/mtd/maps/physmap.c +++ b/drivers/mtd/maps/physmap.c @@ -14,228 +14,112 @@ #include #include #include -#include -#include +#include #include #include +#include #include #include -#include - -struct physmap_flash_info { - struct mtd_info *mtd; - struct map_info map; - struct resource *res; -#ifdef CONFIG_MTD_PARTITIONS - int nr_parts; - struct mtd_partition *parts; -#endif -}; +static struct mtd_info *mymtd; -static int physmap_flash_remove(struct platform_device *dev) -{ - struct physmap_flash_info *info; - struct physmap_flash_data *physmap_data; - - info = platform_get_drvdata(dev); - if (info == NULL) - return 0; - platform_set_drvdata(dev, NULL); - - physmap_data = dev->dev.platform_data; +struct map_info physmap_map = { + .name = "phys_mapped_flash", + .phys = CONFIG_MTD_PHYSMAP_START, + .size = CONFIG_MTD_PHYSMAP_LEN, + .bankwidth = CONFIG_MTD_PHYSMAP_BANKWIDTH, +}; - if (info->mtd != NULL) { #ifdef CONFIG_MTD_PARTITIONS - if (info->nr_parts) { - del_mtd_partitions(info->mtd); - kfree(info->parts); - } else if (physmap_data->nr_parts) { - del_mtd_partitions(info->mtd); - } else { - del_mtd_device(info->mtd); - } -#else - del_mtd_device(info->mtd); -#endif - map_destroy(info->mtd); - } +static struct mtd_partition *mtd_parts; +static int mtd_parts_nb; - if (info->map.virt != NULL) - iounmap((void *)info->map.virt); +static int num_physmap_partitions; +static struct mtd_partition *physmap_partitions; - if (info->res != NULL) { - release_resource(info->res); - kfree(info->res); - } +static const char *part_probes[] __initdata = {"cmdlinepart", "RedBoot", NULL}; - return 0; +void physmap_set_partitions(struct mtd_partition *parts, int num_parts) +{ + physmap_partitions=parts; + num_physmap_partitions=num_parts; } +#endif /* CONFIG_MTD_PARTITIONS */ -static const char *rom_probe_types[] = { "cfi_probe", "jedec_probe", "map_rom", NULL }; -#ifdef CONFIG_MTD_PARTITIONS -static const char *part_probe_types[] = { "cmdlinepart", "RedBoot", NULL }; -#endif - -static int physmap_flash_probe(struct platform_device *dev) +static int __init init_physmap(void) { - struct physmap_flash_data *physmap_data; - struct physmap_flash_info *info; - const char **probe_type; - int err; - - physmap_data = dev->dev.platform_data; - if (physmap_data == NULL) - return -ENODEV; - - printk(KERN_NOTICE "physmap platform flash device: %.8llx at %.8llx\n", - (unsigned long long)dev->resource->end - dev->resource->start + 1, - (unsigned long long)dev->resource->start); - - info = kmalloc(sizeof(struct physmap_flash_info), GFP_KERNEL); - if (info == NULL) { - err = -ENOMEM; - goto err_out; - } - memset(info, 0, sizeof(*info)); + static const char *rom_probe_types[] = { "cfi_probe", "jedec_probe", "map_rom", NULL }; + const char **type; - platform_set_drvdata(dev, info); + printk(KERN_NOTICE "physmap flash device: %lx at %lx\n", physmap_map.size, physmap_map.phys); + physmap_map.virt = ioremap(physmap_map.phys, physmap_map.size); - info->res = request_mem_region(dev->resource->start, - dev->resource->end - dev->resource->start + 1, - dev->dev.bus_id); - if (info->res == NULL) { - dev_err(&dev->dev, "Could not reserve memory region\n"); - err = -ENOMEM; - goto err_out; + if (!physmap_map.virt) { + printk("Failed to ioremap\n"); + return -EIO; } - info->map.name = dev->dev.bus_id; - info->map.phys = dev->resource->start; - info->map.size = dev->resource->end - dev->resource->start + 1; - info->map.bankwidth = physmap_data->width; - info->map.set_vpp = physmap_data->set_vpp; - - info->map.virt = ioremap(info->map.phys, info->map.size); - if (info->map.virt == NULL) { - dev_err(&dev->dev, "Failed to ioremap flash region\n"); - err = EIO; - goto err_out; - } + simple_map_init(&physmap_map); - simple_map_init(&info->map); - - probe_type = rom_probe_types; - for (; info->mtd == NULL && *probe_type != NULL; probe_type++) - info->mtd = do_map_probe(*probe_type, &info->map); - if (info->mtd == NULL) { - dev_err(&dev->dev, "map_probe failed\n"); - err = -ENXIO; - goto err_out; + mymtd = NULL; + type = rom_probe_types; + for(; !mymtd && *type; type++) { + mymtd = do_map_probe(*type, &physmap_map); } - info->mtd->owner = THIS_MODULE; + if (mymtd) { + mymtd->owner = THIS_MODULE; #ifdef CONFIG_MTD_PARTITIONS - err = parse_mtd_partitions(info->mtd, part_probe_types, &info->parts, 0); - if (err > 0) { - add_mtd_partitions(info->mtd, info->parts, err); - return 0; - } - - if (physmap_data->nr_parts) { - printk(KERN_NOTICE "Using physmap partition information\n"); - add_mtd_partitions(info->mtd, physmap_data->parts, - physmap_data->nr_parts); - return 0; - } -#endif + mtd_parts_nb = parse_mtd_partitions(mymtd, part_probes, + &mtd_parts, 0); - add_mtd_device(info->mtd); - return 0; - -err_out: - physmap_flash_remove(dev); - return err; -} - -static struct platform_driver physmap_flash_driver = { - .probe = physmap_flash_probe, - .remove = physmap_flash_remove, - .driver = { - .name = "physmap-flash", - }, -}; + if (mtd_parts_nb > 0) + { + add_mtd_partitions (mymtd, mtd_parts, mtd_parts_nb); + return 0; + } + if (num_physmap_partitions != 0) + { + printk(KERN_NOTICE + "Using physmap partition definition\n"); + add_mtd_partitions (mymtd, physmap_partitions, num_physmap_partitions); + return 0; + } -#ifdef CONFIG_MTD_PHYSMAP_LEN -#if CONFIG_MTD_PHYSMAP_LEN != 0 -#warning using PHYSMAP compat code -#define PHYSMAP_COMPAT -#endif #endif + add_mtd_device(mymtd); -#ifdef PHYSMAP_COMPAT -static struct physmap_flash_data physmap_flash_data = { - .width = CONFIG_MTD_PHYSMAP_BANKWIDTH, -}; - -static struct resource physmap_flash_resource = { - .start = CONFIG_MTD_PHYSMAP_START, - .end = CONFIG_MTD_PHYSMAP_START + CONFIG_MTD_PHYSMAP_LEN - 1, - .flags = IORESOURCE_MEM, -}; - -static struct platform_device physmap_flash = { - .name = "physmap-flash", - .id = 0, - .dev = { - .platform_data = &physmap_flash_data, - }, - .num_resources = 1, - .resource = &physmap_flash_resource, -}; - -void physmap_configure(unsigned long addr, unsigned long size, - int bankwidth, void (*set_vpp)(struct map_info *, int)) -{ - physmap_flash_resource.start = addr; - physmap_flash_resource.end = addr + size - 1; - physmap_flash_data.width = bankwidth; - physmap_flash_data.set_vpp = set_vpp; -} + return 0; + } -#ifdef CONFIG_MTD_PARTITIONS -void physmap_set_partitions(struct mtd_partition *parts, int num_parts) -{ - physmap_flash_data.nr_parts = num_parts; - physmap_flash_data.parts = parts; + iounmap(physmap_map.virt); + return -ENXIO; } -#endif -#endif -static int __init physmap_init(void) +static void __exit cleanup_physmap(void) { - int err; - - err = platform_driver_register(&physmap_flash_driver); -#ifdef PHYSMAP_COMPAT - if (err == 0) - platform_device_register(&physmap_flash); +#ifdef CONFIG_MTD_PARTITIONS + if (mtd_parts_nb) { + del_mtd_partitions(mymtd); + kfree(mtd_parts); + } else if (num_physmap_partitions) { + del_mtd_partitions(mymtd); + } else { + del_mtd_device(mymtd); + } +#else + del_mtd_device(mymtd); #endif + map_destroy(mymtd); - return err; + iounmap(physmap_map.virt); + physmap_map.virt = NULL; } -static void __exit physmap_exit(void) -{ -#ifdef PHYSMAP_COMPAT - platform_device_unregister(&physmap_flash); -#endif - platform_driver_unregister(&physmap_flash_driver); -} +module_init(init_physmap); +module_exit(cleanup_physmap); -module_init(physmap_init); -module_exit(physmap_exit); MODULE_LICENSE("GPL"); MODULE_AUTHOR("David Woodhouse "); diff --git a/drivers/mtd/maps/redwood.c b/drivers/mtd/maps/redwood.c index ec8fdae1d..5b76ed886 100644 --- a/drivers/mtd/maps/redwood.c +++ b/drivers/mtd/maps/redwood.c @@ -13,6 +13,7 @@ * or implied. */ +#include #include #include #include @@ -120,7 +121,8 @@ struct map_info redwood_flash_map = { }; -#define NUM_REDWOOD_FLASH_PARTITIONS ARRAY_SIZE(redwood_flash_partitions) +#define NUM_REDWOOD_FLASH_PARTITIONS \ + (sizeof(redwood_flash_partitions)/sizeof(redwood_flash_partitions[0])) static struct mtd_info *redwood_mtd; diff --git a/drivers/mtd/maps/sa1100-flash.c b/drivers/mtd/maps/sa1100-flash.c index 950bf1c57..5cefb0156 100644 --- a/drivers/mtd/maps/sa1100-flash.c +++ b/drivers/mtd/maps/sa1100-flash.c @@ -5,6 +5,7 @@ * * $Id: sa1100-flash.c,v 1.51 2005/11/07 11:14:28 gleixner Exp $ */ +#include #include #include #include diff --git a/drivers/mtd/maps/sbc8240.c b/drivers/mtd/maps/sbc8240.c index 7d0fcf8f4..225cdd9ba 100644 --- a/drivers/mtd/maps/sbc8240.c +++ b/drivers/mtd/maps/sbc8240.c @@ -18,6 +18,7 @@ * Both parts are JEDEC compatible. */ +#include #include #include #include @@ -65,7 +66,7 @@ static struct map_info sbc8240_map[2] = { } }; -#define NUM_FLASH_BANKS ARRAY_SIZE(sbc8240_map) +#define NUM_FLASH_BANKS (sizeof(sbc8240_map) / sizeof(struct map_info)) /* * The following defines the partition layout of SBC8240 boards. @@ -124,6 +125,8 @@ static struct mtd_partition sbc8240_fs_partitions [] = { } }; +#define NB_OF(x) (sizeof (x) / sizeof (x[0])) + /* trivial struct to describe partition information */ struct mtd_part_def { @@ -187,10 +190,10 @@ int __init init_sbc8240_mtd (void) #ifdef CONFIG_MTD_PARTITIONS sbc8240_part_banks[0].mtd_part = sbc8240_uboot_partitions; sbc8240_part_banks[0].type = "static image"; - sbc8240_part_banks[0].nums = ARRAY_SIZE(sbc8240_uboot_partitions); + sbc8240_part_banks[0].nums = NB_OF(sbc8240_uboot_partitions); sbc8240_part_banks[1].mtd_part = sbc8240_fs_partitions; sbc8240_part_banks[1].type = "static file system"; - sbc8240_part_banks[1].nums = ARRAY_SIZE(sbc8240_fs_partitions); + sbc8240_part_banks[1].nums = NB_OF(sbc8240_fs_partitions); for (i = 0; i < NUM_FLASH_BANKS; i++) { diff --git a/drivers/mtd/maps/sc520cdp.c b/drivers/mtd/maps/sc520cdp.c index 9b50cfc35..ed92afadd 100644 --- a/drivers/mtd/maps/sc520cdp.c +++ b/drivers/mtd/maps/sc520cdp.c @@ -25,6 +25,7 @@ * For details see http://www.amd.com/products/epd/desiging/evalboards/18.elansc520/520_cdp_brief/index.html */ +#include #include #include #include @@ -106,7 +107,7 @@ static struct map_info sc520cdp_map[] = { }, }; -#define NUM_FLASH_BANKS ARRAY_SIZE(sc520cdp_map) +#define NUM_FLASH_BANKS (sizeof(sc520cdp_map)/sizeof(struct map_info)) static struct mtd_info *mymtd[NUM_FLASH_BANKS]; static struct mtd_info *merged_mtd; diff --git a/drivers/mtd/maps/scb2_flash.c b/drivers/mtd/maps/scb2_flash.c index dcfb85840..97a8dfd69 100644 --- a/drivers/mtd/maps/scb2_flash.c +++ b/drivers/mtd/maps/scb2_flash.c @@ -53,6 +53,7 @@ #include #include #include +#include #include #include diff --git a/drivers/mtd/maps/scx200_docflash.c b/drivers/mtd/maps/scx200_docflash.c index 7391fd544..2c91dff8b 100644 --- a/drivers/mtd/maps/scx200_docflash.c +++ b/drivers/mtd/maps/scx200_docflash.c @@ -8,6 +8,7 @@ */ #include +#include #include #include #include @@ -69,7 +70,7 @@ static struct mtd_partition partition_info[] = { .size = 0x80000 }, }; -#define NUM_PARTITIONS ARRAY_SIZE(partition_info) +#define NUM_PARTITIONS (sizeof(partition_info)/sizeof(partition_info[0])) #endif @@ -163,9 +164,8 @@ static int __init init_scx200_docflash(void) outl(pmr, scx200_cb_base + SCx200_PMR); } - printk(KERN_INFO NAME ": DOCCS mapped at 0x%llx-0x%llx, width %d\n", - (unsigned long long)docmem.start, - (unsigned long long)docmem.end, width); + printk(KERN_INFO NAME ": DOCCS mapped at 0x%lx-0x%lx, width %d\n", + docmem.start, docmem.end, width); scx200_docflash_map.size = size; if (width == 8) diff --git a/drivers/mtd/maps/sharpsl-flash.c b/drivers/mtd/maps/sharpsl-flash.c index 12fe53c0d..999f4bb3d 100644 --- a/drivers/mtd/maps/sharpsl-flash.c +++ b/drivers/mtd/maps/sharpsl-flash.c @@ -49,6 +49,8 @@ static struct mtd_partition sharpsl_partitions[1] = { } }; +#define NB_OF(x) (sizeof(x)/sizeof(x[0])) + int __init init_sharpsl(void) { struct mtd_partition *parts; @@ -90,7 +92,7 @@ int __init init_sharpsl(void) } parts = sharpsl_partitions; - nb_parts = ARRAY_SIZE(sharpsl_partitions); + nb_parts = NB_OF(sharpsl_partitions); printk(KERN_NOTICE "Using %s partision definition\n", part_type); add_mtd_partitions(mymtd, parts, nb_parts); diff --git a/drivers/mtd/maps/solutionengine.c b/drivers/mtd/maps/solutionengine.c index d76ceef45..c53c2c369 100644 --- a/drivers/mtd/maps/solutionengine.c +++ b/drivers/mtd/maps/solutionengine.c @@ -16,6 +16,7 @@ #include #include #include +#include #include static struct mtd_info *flash_mtd; diff --git a/drivers/mtd/maps/sun_uflash.c b/drivers/mtd/maps/sun_uflash.c index 4db2055ce..0758cb1d0 100644 --- a/drivers/mtd/maps/sun_uflash.c +++ b/drivers/mtd/maps/sun_uflash.c @@ -18,7 +18,6 @@ #include #include #include -#include #include #include @@ -31,141 +30,146 @@ #define UFLASH_WINDOW_SIZE 0x200000 #define UFLASH_BUSWIDTH 1 /* EBus is 8-bit */ -MODULE_AUTHOR("Eric Brower "); -MODULE_DESCRIPTION("User-programmable flash device on Sun Microsystems boardsets"); -MODULE_SUPPORTED_DEVICE("userflash"); -MODULE_LICENSE("GPL"); -MODULE_VERSION("2.0"); +MODULE_AUTHOR + ("Eric Brower "); +MODULE_DESCRIPTION + ("User-programmable flash device on Sun Microsystems boardsets"); +MODULE_SUPPORTED_DEVICE + ("userflash"); +MODULE_LICENSE + ("GPL"); static LIST_HEAD(device_list); struct uflash_dev { - char *name; /* device name */ + char * name; /* device name */ struct map_info map; /* mtd map info */ - struct mtd_info *mtd; /* mtd info */ + struct mtd_info * mtd; /* mtd info */ + struct list_head list; }; struct map_info uflash_map_templ = { - .name = "SUNW,???-????", - .size = UFLASH_WINDOW_SIZE, - .bankwidth = UFLASH_BUSWIDTH, + .name = "SUNW,???-????", + .size = UFLASH_WINDOW_SIZE, + .bankwidth = UFLASH_BUSWIDTH, }; -int uflash_devinit(struct linux_ebus_device *edev, struct device_node *dp) +int uflash_devinit(struct linux_ebus_device* edev) { - struct uflash_dev *up; - struct resource *res; + int iTmp, nregs; + struct linux_prom_registers regs[2]; + struct uflash_dev *pdev; + + iTmp = prom_getproperty( + edev->prom_node, "reg", (void *)regs, sizeof(regs)); + if ((iTmp % sizeof(regs[0])) != 0) { + printk("%s: Strange reg property size %d\n", + UFLASH_DEVNAME, iTmp); + return -ENODEV; + } - res = &edev->resource[0]; + nregs = iTmp / sizeof(regs[0]); - if (edev->num_addrs != 1) { + if (nregs != 1) { /* Non-CFI userflash device-- once I find one we * can work on supporting it. */ - printk("%s: unsupported device at 0x%llx (%d regs): " \ + printk("%s: unsupported device at 0x%lx (%d regs): " \ "email ebrower@usa.net\n", - dp->full_name, (unsigned long long)res->start, - edev->num_addrs); - + UFLASH_DEVNAME, edev->resource[0].start, nregs); return -ENODEV; } - up = kzalloc(sizeof(struct uflash_dev), GFP_KERNEL); - if (!up) - return -ENOMEM; + if(0 == (pdev = kmalloc(sizeof(struct uflash_dev), GFP_KERNEL))) { + printk("%s: unable to kmalloc new device\n", UFLASH_DEVNAME); + return(-ENOMEM); + } /* copy defaults and tweak parameters */ - memcpy(&up->map, &uflash_map_templ, sizeof(uflash_map_templ)); - up->map.size = (res->end - res->start) + 1UL; - - up->name = of_get_property(dp, "model", NULL); - if (up->name && 0 < strlen(up->name)) - up->map.name = up->name; - - up->map.phys = res->start; - - up->map.virt = ioremap_nocache(res->start, up->map.size); - if (!up->map.virt) { - printk("%s: Failed to map device.\n", dp->full_name); - kfree(up); - - return -EINVAL; + memcpy(&pdev->map, &uflash_map_templ, sizeof(uflash_map_templ)); + pdev->map.size = regs[0].reg_size; + + iTmp = prom_getproplen(edev->prom_node, "model"); + pdev->name = kmalloc(iTmp, GFP_KERNEL); + prom_getstring(edev->prom_node, "model", pdev->name, iTmp); + if(0 != pdev->name && 0 < strlen(pdev->name)) { + pdev->map.name = pdev->name; + } + pdev->map.phys = edev->resource[0].start; + pdev->map.virt = ioremap_nocache(edev->resource[0].start, pdev->map.size); + if(0 == pdev->map.virt) { + printk("%s: failed to map device\n", __FUNCTION__); + kfree(pdev->name); + kfree(pdev); + return(-1); } - simple_map_init(&up->map); + simple_map_init(&pdev->map); /* MTD registration */ - up->mtd = do_map_probe("cfi_probe", &up->map); - if (!up->mtd) { - iounmap(up->map.virt); - kfree(up); - - return -ENXIO; + pdev->mtd = do_map_probe("cfi_probe", &pdev->map); + if(0 == pdev->mtd) { + iounmap(pdev->map.virt); + kfree(pdev->name); + kfree(pdev); + return(-ENXIO); } - up->mtd->owner = THIS_MODULE; + list_add(&pdev->list, &device_list); - add_mtd_device(up->mtd); + pdev->mtd->owner = THIS_MODULE; - dev_set_drvdata(&edev->ofdev.dev, up); - - return 0; + add_mtd_device(pdev->mtd); + return(0); } -static int __devinit uflash_probe(struct of_device *dev, const struct of_device_id *match) +static int __init uflash_init(void) { - struct linux_ebus_device *edev = to_ebus_device(&dev->dev); - struct device_node *dp = dev->node; + struct linux_ebus *ebus = NULL; + struct linux_ebus_device *edev = NULL; + + for_each_ebus(ebus) { + for_each_ebusdev(edev, ebus) { + if (!strcmp(edev->prom_name, UFLASH_OBPNAME)) { + if(0 > prom_getproplen(edev->prom_node, "user")) { + DEBUG(2, "%s: ignoring device at 0x%lx\n", + UFLASH_DEVNAME, edev->resource[0].start); + } else { + uflash_devinit(edev); + } + } + } + } - if (of_find_property(dp, "user", NULL)) + if(list_empty(&device_list)) { + printk("%s: unable to locate device\n", UFLASH_DEVNAME); return -ENODEV; - - return uflash_devinit(edev, dp); -} - -static int __devexit uflash_remove(struct of_device *dev) -{ - struct uflash_dev *up = dev_get_drvdata(&dev->dev); - - if (up->mtd) { - del_mtd_device(up->mtd); - map_destroy(up->mtd); } - if (up->map.virt) { - iounmap(up->map.virt); - up->map.virt = NULL; - } - - kfree(up); - - return 0; + return(0); } -static struct of_device_id uflash_match[] = { - { - .name = UFLASH_OBPNAME, - }, - {}, -}; - -MODULE_DEVICE_TABLE(of, uflash_match); - -static struct of_platform_driver uflash_driver = { - .name = UFLASH_DEVNAME, - .match_table = uflash_match, - .probe = uflash_probe, - .remove = __devexit_p(uflash_remove), -}; - -static int __init uflash_init(void) +static void __exit uflash_cleanup(void) { - return of_register_driver(&uflash_driver, &ebus_bus_type); -} - -static void __exit uflash_exit(void) -{ - of_unregister_driver(&uflash_driver); + struct list_head *udevlist; + struct uflash_dev *udev; + + list_for_each(udevlist, &device_list) { + udev = list_entry(udevlist, struct uflash_dev, list); + DEBUG(2, "%s: removing device %s\n", + UFLASH_DEVNAME, udev->name); + + if(0 != udev->mtd) { + del_mtd_device(udev->mtd); + map_destroy(udev->mtd); + } + if(0 != udev->map.virt) { + iounmap(udev->map.virt); + udev->map.virt = NULL; + } + kfree(udev->name); + kfree(udev); + } } module_init(uflash_init); -module_exit(uflash_exit); +module_exit(uflash_cleanup); diff --git a/drivers/mtd/maps/tqm834x.c b/drivers/mtd/maps/tqm834x.c index 58e5912bd..c7ae9a515 100644 --- a/drivers/mtd/maps/tqm834x.c +++ b/drivers/mtd/maps/tqm834x.c @@ -11,6 +11,7 @@ * */ +#include #include #include #include diff --git a/drivers/mtd/maps/tqm8xxl.c b/drivers/mtd/maps/tqm8xxl.c index 19578ba84..a43517053 100644 --- a/drivers/mtd/maps/tqm8xxl.c +++ b/drivers/mtd/maps/tqm8xxl.c @@ -22,6 +22,7 @@ * Thus, we choose CONFIG_MTD_CFI_I2 & CONFIG_MTD_CFI_B4 at * kernel configuration. */ +#include #include #include #include diff --git a/drivers/mtd/maps/ts5500_flash.c b/drivers/mtd/maps/ts5500_flash.c index b47270e85..4b372bcb1 100644 --- a/drivers/mtd/maps/ts5500_flash.c +++ b/drivers/mtd/maps/ts5500_flash.c @@ -26,6 +26,7 @@ * $Id: ts5500_flash.c,v 1.5 2005/11/07 11:14:28 gleixner Exp $ */ +#include #include #include #include @@ -63,7 +64,7 @@ static struct mtd_partition ts5500_partitions[] = { } }; -#define NUM_PARTITIONS ARRAY_SIZE(ts5500_partitions) +#define NUM_PARTITIONS (sizeof(ts5500_partitions)/sizeof(struct mtd_partition)) static struct mtd_info *mymtd; diff --git a/drivers/mtd/maps/uclinux.c b/drivers/mtd/maps/uclinux.c index 389fea28b..79d92808b 100644 --- a/drivers/mtd/maps/uclinux.c +++ b/drivers/mtd/maps/uclinux.c @@ -10,6 +10,7 @@ /****************************************************************************/ +#include #include #include #include @@ -36,7 +37,7 @@ struct mtd_partition uclinux_romfs[] = { { .name = "ROMfs" } }; -#define NUM_PARTITIONS ARRAY_SIZE(uclinux_romfs) +#define NUM_PARTITIONS (sizeof(uclinux_romfs) / sizeof(uclinux_romfs[0])) /****************************************************************************/ diff --git a/drivers/mtd/maps/vmax301.c b/drivers/mtd/maps/vmax301.c index b3e487395..e0063941c 100644 --- a/drivers/mtd/maps/vmax301.c +++ b/drivers/mtd/maps/vmax301.c @@ -182,7 +182,7 @@ int __init init_vmax301(void) } } - if (!vmax_mtd[0] && !vmax_mtd[1]) { + if (!vmax_mtd[1] && !vmax_mtd[2]) { iounmap((void *)iomapadr); return -ENXIO; } diff --git a/drivers/mtd/maps/walnut.c b/drivers/mtd/maps/walnut.c index ec80eec37..f46bec661 100644 --- a/drivers/mtd/maps/walnut.c +++ b/drivers/mtd/maps/walnut.c @@ -20,6 +20,7 @@ #include #include #include +#include #include #include #include diff --git a/drivers/mtd/maps/wr_sbc82xx_flash.c b/drivers/mtd/maps/wr_sbc82xx_flash.c index ac5b8105b..60c197ec4 100644 --- a/drivers/mtd/maps/wr_sbc82xx_flash.c +++ b/drivers/mtd/maps/wr_sbc82xx_flash.c @@ -17,6 +17,7 @@ #include #include #include +#include #include #include diff --git a/drivers/mtd/mtd_blkdevs.c b/drivers/mtd/mtd_blkdevs.c index 458d3c8ae..7f3ff500b 100644 --- a/drivers/mtd/mtd_blkdevs.c +++ b/drivers/mtd/mtd_blkdevs.c @@ -19,12 +19,12 @@ #include #include #include -#include +#include #include static LIST_HEAD(blktrans_majors); -extern struct mutex mtd_table_mutex; +extern struct semaphore mtd_table_mutex; extern struct mtd_info *mtd_table[]; struct mtd_blkcore_priv { @@ -122,9 +122,9 @@ static int mtd_blktrans_thread(void *arg) spin_unlock_irq(rq->queue_lock); - mutex_lock(&dev->lock); + down(&dev->sem); res = do_blktrans_request(tr, dev, req); - mutex_unlock(&dev->lock); + up(&dev->sem); spin_lock_irq(rq->queue_lock); @@ -235,8 +235,8 @@ int add_mtd_blktrans_dev(struct mtd_blktrans_dev *new) int last_devnum = -1; struct gendisk *gd; - if (!!mutex_trylock(&mtd_table_mutex)) { - mutex_unlock(&mtd_table_mutex); + if (!down_trylock(&mtd_table_mutex)) { + up(&mtd_table_mutex); BUG(); } @@ -267,7 +267,7 @@ int add_mtd_blktrans_dev(struct mtd_blktrans_dev *new) return -EBUSY; } - mutex_init(&new->lock); + init_MUTEX(&new->sem); list_add_tail(&new->list, &tr->devs); added: if (!tr->writesect) @@ -313,8 +313,8 @@ int add_mtd_blktrans_dev(struct mtd_blktrans_dev *new) int del_mtd_blktrans_dev(struct mtd_blktrans_dev *old) { - if (!!mutex_trylock(&mtd_table_mutex)) { - mutex_unlock(&mtd_table_mutex); + if (!down_trylock(&mtd_table_mutex)) { + up(&mtd_table_mutex); BUG(); } @@ -378,14 +378,14 @@ int register_mtd_blktrans(struct mtd_blktrans_ops *tr) memset(tr->blkcore_priv, 0, sizeof(*tr->blkcore_priv)); - mutex_lock(&mtd_table_mutex); + down(&mtd_table_mutex); ret = register_blkdev(tr->major, tr->name); if (ret) { printk(KERN_WARNING "Unable to register %s block device on major %d: %d\n", tr->name, tr->major, ret); kfree(tr->blkcore_priv); - mutex_unlock(&mtd_table_mutex); + up(&mtd_table_mutex); return ret; } spin_lock_init(&tr->blkcore_priv->queue_lock); @@ -396,7 +396,7 @@ int register_mtd_blktrans(struct mtd_blktrans_ops *tr) if (!tr->blkcore_priv->rq) { unregister_blkdev(tr->major, tr->name); kfree(tr->blkcore_priv); - mutex_unlock(&mtd_table_mutex); + up(&mtd_table_mutex); return -ENOMEM; } @@ -407,7 +407,7 @@ int register_mtd_blktrans(struct mtd_blktrans_ops *tr) blk_cleanup_queue(tr->blkcore_priv->rq); unregister_blkdev(tr->major, tr->name); kfree(tr->blkcore_priv); - mutex_unlock(&mtd_table_mutex); + up(&mtd_table_mutex); return ret; } @@ -419,7 +419,7 @@ int register_mtd_blktrans(struct mtd_blktrans_ops *tr) tr->add_mtd(tr, mtd_table[i]); } - mutex_unlock(&mtd_table_mutex); + up(&mtd_table_mutex); return 0; } @@ -428,7 +428,7 @@ int deregister_mtd_blktrans(struct mtd_blktrans_ops *tr) { struct list_head *this, *next; - mutex_lock(&mtd_table_mutex); + down(&mtd_table_mutex); /* Clean up the kernel thread */ tr->blkcore_priv->exiting = 1; @@ -446,11 +446,12 @@ int deregister_mtd_blktrans(struct mtd_blktrans_ops *tr) blk_cleanup_queue(tr->blkcore_priv->rq); unregister_blkdev(tr->major, tr->name); - mutex_unlock(&mtd_table_mutex); + up(&mtd_table_mutex); kfree(tr->blkcore_priv); - BUG_ON(!list_empty(&tr->devs)); + if (!list_empty(&tr->devs)) + BUG(); return 0; } diff --git a/drivers/mtd/mtdblock.c b/drivers/mtd/mtdblock.c index 04ed34694..e84756644 100644 --- a/drivers/mtd/mtdblock.c +++ b/drivers/mtd/mtdblock.c @@ -7,6 +7,7 @@ * (C) 1999-2003 David Woodhouse */ +#include #include #include #include @@ -18,13 +19,11 @@ #include #include -#include - static struct mtdblk_dev { struct mtd_info *mtd; int count; - struct mutex cache_mutex; + struct semaphore cache_sem; unsigned char *cache_data; unsigned long cache_offset; unsigned int cache_size; @@ -70,7 +69,7 @@ static int erase_write (struct mtd_info *mtd, unsigned long pos, set_current_state(TASK_INTERRUPTIBLE); add_wait_queue(&wait_q, &wait); - ret = mtd->erase(mtd, &erase); + ret = MTD_ERASE(mtd, &erase); if (ret) { set_current_state(TASK_RUNNING); remove_wait_queue(&wait_q, &wait); @@ -87,7 +86,7 @@ static int erase_write (struct mtd_info *mtd, unsigned long pos, * Next, writhe data to flash. */ - ret = mtd->write(mtd, pos, len, &retlen, buf); + ret = MTD_WRITE (mtd, pos, len, &retlen, buf); if (ret) return ret; if (retlen != len) @@ -137,7 +136,7 @@ static int do_cached_write (struct mtdblk_dev *mtdblk, unsigned long pos, mtd->name, pos, len); if (!sect_size) - return mtd->write(mtd, pos, len, &retlen, buf); + return MTD_WRITE (mtd, pos, len, &retlen, buf); while (len > 0) { unsigned long sect_start = (pos/sect_size)*sect_size; @@ -169,8 +168,7 @@ static int do_cached_write (struct mtdblk_dev *mtdblk, unsigned long pos, mtdblk->cache_offset != sect_start) { /* fill the cache with the current sector */ mtdblk->cache_state = STATE_EMPTY; - ret = mtd->read(mtd, sect_start, sect_size, - &retlen, mtdblk->cache_data); + ret = MTD_READ(mtd, sect_start, sect_size, &retlen, mtdblk->cache_data); if (ret) return ret; if (retlen != sect_size) @@ -207,7 +205,7 @@ static int do_cached_read (struct mtdblk_dev *mtdblk, unsigned long pos, mtd->name, pos, len); if (!sect_size) - return mtd->read(mtd, pos, len, &retlen, buf); + return MTD_READ (mtd, pos, len, &retlen, buf); while (len > 0) { unsigned long sect_start = (pos/sect_size)*sect_size; @@ -226,7 +224,7 @@ static int do_cached_read (struct mtdblk_dev *mtdblk, unsigned long pos, mtdblk->cache_offset == sect_start) { memcpy (buf, mtdblk->cache_data + offset, size); } else { - ret = mtd->read(mtd, pos, size, &retlen, buf); + ret = MTD_READ (mtd, pos, size, &retlen, buf); if (ret) return ret; if (retlen != size) @@ -286,9 +284,10 @@ static int mtdblock_open(struct mtd_blktrans_dev *mbd) mtdblk->count = 1; mtdblk->mtd = mtd; - mutex_init(&mtdblk->cache_mutex); + init_MUTEX (&mtdblk->cache_sem); mtdblk->cache_state = STATE_EMPTY; - if ( !(mtdblk->mtd->flags & MTD_NO_ERASE) && mtdblk->mtd->erasesize) { + if ((mtdblk->mtd->flags & MTD_CAP_RAM) != MTD_CAP_RAM && + mtdblk->mtd->erasesize) { mtdblk->cache_size = mtdblk->mtd->erasesize; mtdblk->cache_data = NULL; } @@ -307,9 +306,9 @@ static int mtdblock_release(struct mtd_blktrans_dev *mbd) DEBUG(MTD_DEBUG_LEVEL1, "mtdblock_release\n"); - mutex_lock(&mtdblk->cache_mutex); + down(&mtdblk->cache_sem); write_cached_data(mtdblk); - mutex_unlock(&mtdblk->cache_mutex); + up(&mtdblk->cache_sem); if (!--mtdblk->count) { /* It was the last usage. Free the device */ @@ -328,9 +327,9 @@ static int mtdblock_flush(struct mtd_blktrans_dev *dev) { struct mtdblk_dev *mtdblk = mtdblks[dev->devnum]; - mutex_lock(&mtdblk->cache_mutex); + down(&mtdblk->cache_sem); write_cached_data(mtdblk); - mutex_unlock(&mtdblk->cache_mutex); + up(&mtdblk->cache_sem); if (mtdblk->mtd->sync) mtdblk->mtd->sync(mtdblk->mtd); diff --git a/drivers/mtd/mtdblock_ro.c b/drivers/mtd/mtdblock_ro.c index 29563ed25..0c830ba41 100644 --- a/drivers/mtd/mtdblock_ro.c +++ b/drivers/mtd/mtdblock_ro.c @@ -45,7 +45,9 @@ static void mtdblock_add_mtd(struct mtd_blktrans_ops *tr, struct mtd_info *mtd) dev->blksize = 512; dev->size = mtd->size >> 9; dev->tr = tr; - dev->readonly = 1; + if ((mtd->flags & (MTD_CLEAR_BITS|MTD_SET_BITS|MTD_WRITEABLE)) != + (MTD_CLEAR_BITS|MTD_SET_BITS|MTD_WRITEABLE)) + dev->readonly = 1; add_mtd_blktrans_dev(dev); } diff --git a/drivers/mtd/mtdchar.c b/drivers/mtd/mtdchar.c index 5b6acfcb2..6f044584b 100644 --- a/drivers/mtd/mtdchar.c +++ b/drivers/mtd/mtdchar.c @@ -5,6 +5,7 @@ * */ +#include #include #include #include @@ -48,33 +49,42 @@ static struct mtd_notifier notifier = { }; /* - * Data structure to hold the pointer to the mtd device as well - * as mode information ofr various use cases. + * We use file->private_data to store a pointer to the MTDdevice. + * Since alighment is at least 32 bits, we have 2 bits free for OTP + * modes as well. */ -struct mtd_file_info { - struct mtd_info *mtd; - enum mtd_file_modes mode; -}; + +#define TO_MTD(file) (struct mtd_info *)((long)((file)->private_data) & ~3L) + +#define MTD_MODE_OTP_FACT 1 +#define MTD_MODE_OTP_USER 2 +#define MTD_MODE(file) ((long)((file)->private_data) & 3) + +#define SET_MTD_MODE(file, mode) \ + do { long __p = (long)((file)->private_data); \ + (file)->private_data = (void *)((__p & ~3L) | mode); } while (0) static loff_t mtd_lseek (struct file *file, loff_t offset, int orig) { - struct mtd_file_info *mfi = file->private_data; - struct mtd_info *mtd = mfi->mtd; + struct mtd_info *mtd = TO_MTD(file); switch (orig) { - case SEEK_SET: + case 0: + /* SEEK_SET */ break; - case SEEK_CUR: + case 1: + /* SEEK_CUR */ offset += file->f_pos; break; - case SEEK_END: + case 2: + /* SEEK_END */ offset += mtd->size; break; default: return -EINVAL; } - if (offset >= 0 && offset <= mtd->size) + if (offset >= 0 && offset < mtd->size) return file->f_pos = offset; return -EINVAL; @@ -87,7 +97,6 @@ static int mtd_open(struct inode *inode, struct file *file) int minor = iminor(inode); int devnum = minor >> 1; struct mtd_info *mtd; - struct mtd_file_info *mfi; DEBUG(MTD_DEBUG_LEVEL0, "MTD_open\n"); @@ -108,20 +117,14 @@ static int mtd_open(struct inode *inode, struct file *file) return -ENODEV; } + file->private_data = mtd; + /* You can't open it RW if it's not a writeable device */ if ((file->f_mode & 2) && !(mtd->flags & MTD_WRITEABLE)) { put_mtd_device(mtd); return -EACCES; } - mfi = kzalloc(sizeof(*mfi), GFP_KERNEL); - if (!mfi) { - put_mtd_device(mtd); - return -ENOMEM; - } - mfi->mtd = mtd; - file->private_data = mfi; - return 0; } /* mtd_open */ @@ -129,17 +132,16 @@ static int mtd_open(struct inode *inode, struct file *file) static int mtd_close(struct inode *inode, struct file *file) { - struct mtd_file_info *mfi = file->private_data; - struct mtd_info *mtd = mfi->mtd; + struct mtd_info *mtd; DEBUG(MTD_DEBUG_LEVEL0, "MTD_close\n"); + mtd = TO_MTD(file); + if (mtd->sync) mtd->sync(mtd); put_mtd_device(mtd); - file->private_data = NULL; - kfree(mfi); return 0; } /* mtd_close */ @@ -151,8 +153,7 @@ static int mtd_close(struct inode *inode, struct file *file) static ssize_t mtd_read(struct file *file, char __user *buf, size_t count,loff_t *ppos) { - struct mtd_file_info *mfi = file->private_data; - struct mtd_info *mtd = mfi->mtd; + struct mtd_info *mtd = TO_MTD(file); size_t retlen=0; size_t total_retlen=0; int ret=0; @@ -169,58 +170,36 @@ static ssize_t mtd_read(struct file *file, char __user *buf, size_t count,loff_t /* FIXME: Use kiovec in 2.5 to lock down the user's buffers and pass them directly to the MTD functions */ - - if (count > MAX_KMALLOC_SIZE) - kbuf=kmalloc(MAX_KMALLOC_SIZE, GFP_KERNEL); - else - kbuf=kmalloc(count, GFP_KERNEL); - - if (!kbuf) - return -ENOMEM; - while (count) { - if (count > MAX_KMALLOC_SIZE) len = MAX_KMALLOC_SIZE; else len = count; - switch (mfi->mode) { - case MTD_MODE_OTP_FACTORY: + kbuf=kmalloc(len,GFP_KERNEL); + if (!kbuf) + return -ENOMEM; + + switch (MTD_MODE(file)) { + case MTD_MODE_OTP_FACT: ret = mtd->read_fact_prot_reg(mtd, *ppos, len, &retlen, kbuf); break; case MTD_MODE_OTP_USER: ret = mtd->read_user_prot_reg(mtd, *ppos, len, &retlen, kbuf); break; - case MTD_MODE_RAW: - { - struct mtd_oob_ops ops; - - ops.mode = MTD_OOB_RAW; - ops.datbuf = kbuf; - ops.oobbuf = NULL; - ops.len = len; - - ret = mtd->read_oob(mtd, *ppos, &ops); - retlen = ops.retlen; - break; - } default: - ret = mtd->read(mtd, *ppos, len, &retlen, kbuf); + ret = MTD_READ(mtd, *ppos, len, &retlen, kbuf); } /* Nand returns -EBADMSG on ecc errors, but it returns * the data. For our userspace tools it is important * to dump areas with ecc errors ! - * For kernel internal usage it also might return -EUCLEAN - * to signal the caller that a bitflip has occured and has - * been corrected by the ECC algorithm. * Userspace software which accesses NAND this way * must be aware of the fact that it deals with NAND */ - if (!ret || (ret == -EUCLEAN) || (ret == -EBADMSG)) { + if (!ret || (ret == -EBADMSG)) { *ppos += retlen; if (copy_to_user(buf, kbuf, retlen)) { - kfree(kbuf); + kfree(kbuf); return -EFAULT; } else @@ -236,16 +215,15 @@ static ssize_t mtd_read(struct file *file, char __user *buf, size_t count,loff_t return ret; } + kfree(kbuf); } - kfree(kbuf); return total_retlen; } /* mtd_read */ static ssize_t mtd_write(struct file *file, const char __user *buf, size_t count,loff_t *ppos) { - struct mtd_file_info *mfi = file->private_data; - struct mtd_info *mtd = mfi->mtd; + struct mtd_info *mtd = TO_MTD(file); char *kbuf; size_t retlen; size_t total_retlen=0; @@ -263,28 +241,25 @@ static ssize_t mtd_write(struct file *file, const char __user *buf, size_t count if (!count) return 0; - if (count > MAX_KMALLOC_SIZE) - kbuf=kmalloc(MAX_KMALLOC_SIZE, GFP_KERNEL); - else - kbuf=kmalloc(count, GFP_KERNEL); - - if (!kbuf) - return -ENOMEM; - while (count) { - if (count > MAX_KMALLOC_SIZE) len = MAX_KMALLOC_SIZE; else len = count; + kbuf=kmalloc(len,GFP_KERNEL); + if (!kbuf) { + printk("kmalloc is null\n"); + return -ENOMEM; + } + if (copy_from_user(kbuf, buf, len)) { kfree(kbuf); return -EFAULT; } - switch (mfi->mode) { - case MTD_MODE_OTP_FACTORY: + switch (MTD_MODE(file)) { + case MTD_MODE_OTP_FACT: ret = -EROFS; break; case MTD_MODE_OTP_USER: @@ -294,21 +269,6 @@ static ssize_t mtd_write(struct file *file, const char __user *buf, size_t count } ret = mtd->write_user_prot_reg(mtd, *ppos, len, &retlen, kbuf); break; - - case MTD_MODE_RAW: - { - struct mtd_oob_ops ops; - - ops.mode = MTD_OOB_RAW; - ops.datbuf = kbuf; - ops.oobbuf = NULL; - ops.len = len; - - ret = mtd->write_oob(mtd, *ppos, &ops); - retlen = ops.retlen; - break; - } - default: ret = (*(mtd->write))(mtd, *ppos, len, &retlen, kbuf); } @@ -322,9 +282,10 @@ static ssize_t mtd_write(struct file *file, const char __user *buf, size_t count kfree(kbuf); return ret; } + + kfree(kbuf); } - kfree(kbuf); return total_retlen; } /* mtd_write */ @@ -338,45 +299,13 @@ static void mtdchar_erase_callback (struct erase_info *instr) wake_up((wait_queue_head_t *)instr->priv); } -#if defined(CONFIG_MTD_OTP) || defined(CONFIG_MTD_ONENAND_OTP) -static int otp_select_filemode(struct mtd_file_info *mfi, int mode) -{ - struct mtd_info *mtd = mfi->mtd; - int ret = 0; - - switch (mode) { - case MTD_OTP_FACTORY: - if (!mtd->read_fact_prot_reg) - ret = -EOPNOTSUPP; - else - mfi->mode = MTD_MODE_OTP_FACTORY; - break; - case MTD_OTP_USER: - if (!mtd->read_fact_prot_reg) - ret = -EOPNOTSUPP; - else - mfi->mode = MTD_MODE_OTP_USER; - break; - default: - ret = -EINVAL; - case MTD_OTP_OFF: - break; - } - return ret; -} -#else -# define otp_select_filemode(f,m) -EOPNOTSUPP -#endif - static int mtd_ioctl(struct inode *inode, struct file *file, u_int cmd, u_long arg) { - struct mtd_file_info *mfi = file->private_data; - struct mtd_info *mtd = mfi->mtd; + struct mtd_info *mtd = TO_MTD(file); void __user *argp = (void __user *)arg; int ret = 0; u_long size; - struct mtd_info_user info; DEBUG(MTD_DEBUG_LEVEL0, "MTD_ioctl\n"); @@ -412,15 +341,7 @@ static int mtd_ioctl(struct inode *inode, struct file *file, } case MEMGETINFO: - info.type = mtd->type; - info.flags = mtd->flags; - info.size = mtd->size; - info.erasesize = mtd->erasesize; - info.writesize = mtd->writesize; - info.oobsize = mtd->oobsize; - info.ecctype = mtd->ecctype; - info.eccsize = mtd->eccsize; - if (copy_to_user(argp, &info, sizeof(struct mtd_info_user))) + if (copy_to_user(argp, mtd, sizeof(struct mtd_info_user))) return -EFAULT; break; @@ -479,7 +400,8 @@ static int mtd_ioctl(struct inode *inode, struct file *file, case MEMWRITEOOB: { struct mtd_oob_buf buf; - struct mtd_oob_ops ops; + void *databuf; + ssize_t retlen; if(!(file->f_mode & 2)) return -EPERM; @@ -487,7 +409,7 @@ static int mtd_ioctl(struct inode *inode, struct file *file, if (copy_from_user(&buf, argp, sizeof(struct mtd_oob_buf))) return -EFAULT; - if (buf.length > 4096) + if (buf.length > 0x4096) return -EINVAL; if (!mtd->write_oob) @@ -499,32 +421,21 @@ static int mtd_ioctl(struct inode *inode, struct file *file, if (ret) return ret; - ops.len = buf.length; - ops.ooblen = buf.length; - ops.ooboffs = buf.start & (mtd->oobsize - 1); - ops.datbuf = NULL; - ops.mode = MTD_OOB_PLACE; - - if (ops.ooboffs && ops.len > (mtd->oobsize - ops.ooboffs)) - return -EINVAL; - - ops.oobbuf = kmalloc(buf.length, GFP_KERNEL); - if (!ops.oobbuf) + databuf = kmalloc(buf.length, GFP_KERNEL); + if (!databuf) return -ENOMEM; - if (copy_from_user(ops.oobbuf, buf.ptr, buf.length)) { - kfree(ops.oobbuf); + if (copy_from_user(databuf, buf.ptr, buf.length)) { + kfree(databuf); return -EFAULT; } - buf.start &= ~(mtd->oobsize - 1); - ret = mtd->write_oob(mtd, buf.start, &ops); + ret = (mtd->write_oob)(mtd, buf.start, buf.length, &retlen, databuf); - if (copy_to_user(argp + sizeof(uint32_t), &ops.retlen, - sizeof(uint32_t))) + if (copy_to_user(argp + sizeof(uint32_t), &retlen, sizeof(uint32_t))) ret = -EFAULT; - kfree(ops.oobbuf); + kfree(databuf); break; } @@ -532,12 +443,13 @@ static int mtd_ioctl(struct inode *inode, struct file *file, case MEMREADOOB: { struct mtd_oob_buf buf; - struct mtd_oob_ops ops; + void *databuf; + ssize_t retlen; if (copy_from_user(&buf, argp, sizeof(struct mtd_oob_buf))) return -EFAULT; - if (buf.length > 4096) + if (buf.length > 0x4096) return -EINVAL; if (!mtd->read_oob) @@ -545,32 +457,22 @@ static int mtd_ioctl(struct inode *inode, struct file *file, else ret = access_ok(VERIFY_WRITE, buf.ptr, buf.length) ? 0 : -EFAULT; + if (ret) return ret; - ops.len = buf.length; - ops.ooblen = buf.length; - ops.ooboffs = buf.start & (mtd->oobsize - 1); - ops.datbuf = NULL; - ops.mode = MTD_OOB_PLACE; - - if (ops.ooboffs && ops.len > (mtd->oobsize - ops.ooboffs)) - return -EINVAL; - - ops.oobbuf = kmalloc(buf.length, GFP_KERNEL); - if (!ops.oobbuf) + databuf = kmalloc(buf.length, GFP_KERNEL); + if (!databuf) return -ENOMEM; - buf.start &= ~(mtd->oobsize - 1); - ret = mtd->read_oob(mtd, buf.start, &ops); + ret = (mtd->read_oob)(mtd, buf.start, buf.length, &retlen, databuf); - if (put_user(ops.retlen, (uint32_t __user *)argp)) + if (put_user(retlen, (uint32_t __user *)argp)) ret = -EFAULT; - else if (ops.retlen && copy_to_user(buf.ptr, ops.oobbuf, - ops.retlen)) + else if (retlen && copy_to_user(buf.ptr, databuf, retlen)) ret = -EFAULT; - kfree(ops.oobbuf); + kfree(databuf); break; } @@ -602,22 +504,16 @@ static int mtd_ioctl(struct inode *inode, struct file *file, break; } - /* Legacy interface */ - case MEMGETOOBSEL: + case MEMSETOOBSEL: { - struct nand_oobinfo oi; - - if (!mtd->ecclayout) - return -EOPNOTSUPP; - if (mtd->ecclayout->eccbytes > ARRAY_SIZE(oi.eccpos)) - return -EINVAL; - - oi.useecc = MTD_NANDECC_AUTOPLACE; - memcpy(&oi.eccpos, mtd->ecclayout->eccpos, sizeof(oi.eccpos)); - memcpy(&oi.oobfree, mtd->ecclayout->oobfree, - sizeof(oi.oobfree)); + if (copy_from_user(&mtd->oobinfo, argp, sizeof(struct nand_oobinfo))) + return -EFAULT; + break; + } - if (copy_to_user(argp, &oi, sizeof(struct nand_oobinfo))) + case MEMGETOOBSEL: + { + if (copy_to_user(argp, &(mtd->oobinfo), sizeof(struct nand_oobinfo))) return -EFAULT; break; } @@ -648,17 +544,31 @@ static int mtd_ioctl(struct inode *inode, struct file *file, break; } -#if defined(CONFIG_MTD_OTP) || defined(CONFIG_MTD_ONENAND_OTP) +#ifdef CONFIG_MTD_OTP case OTPSELECT: { int mode; if (copy_from_user(&mode, argp, sizeof(int))) return -EFAULT; - - mfi->mode = MTD_MODE_NORMAL; - - ret = otp_select_filemode(mfi, mode); - + SET_MTD_MODE(file, 0); + switch (mode) { + case MTD_OTP_FACTORY: + if (!mtd->read_fact_prot_reg) + ret = -EOPNOTSUPP; + else + SET_MTD_MODE(file, MTD_MODE_OTP_FACT); + break; + case MTD_OTP_USER: + if (!mtd->read_fact_prot_reg) + ret = -EOPNOTSUPP; + else + SET_MTD_MODE(file, MTD_MODE_OTP_USER); + break; + default: + ret = -EINVAL; + case MTD_OTP_OFF: + break; + } file->f_pos = 0; break; } @@ -670,8 +580,8 @@ static int mtd_ioctl(struct inode *inode, struct file *file, if (!buf) return -ENOMEM; ret = -EOPNOTSUPP; - switch (mfi->mode) { - case MTD_MODE_OTP_FACTORY: + switch (MTD_MODE(file)) { + case MTD_MODE_OTP_FACT: if (mtd->get_fact_prot_info) ret = mtd->get_fact_prot_info(mtd, buf, 4096); break; @@ -679,8 +589,6 @@ static int mtd_ioctl(struct inode *inode, struct file *file, if (mtd->get_user_prot_info) ret = mtd->get_user_prot_info(mtd, buf, 4096); break; - default: - break; } if (ret >= 0) { if (cmd == OTPGETREGIONCOUNT) { @@ -699,7 +607,7 @@ static int mtd_ioctl(struct inode *inode, struct file *file, { struct otp_info info; - if (mfi->mode != MTD_MODE_OTP_USER) + if (MTD_MODE(file) != MTD_MODE_OTP_USER) return -EINVAL; if (copy_from_user(&info, argp, sizeof(info))) return -EFAULT; @@ -710,49 +618,6 @@ static int mtd_ioctl(struct inode *inode, struct file *file, } #endif - case ECCGETLAYOUT: - { - if (!mtd->ecclayout) - return -EOPNOTSUPP; - - if (copy_to_user(argp, &mtd->ecclayout, - sizeof(struct nand_ecclayout))) - return -EFAULT; - break; - } - - case ECCGETSTATS: - { - if (copy_to_user(argp, &mtd->ecc_stats, - sizeof(struct mtd_ecc_stats))) - return -EFAULT; - break; - } - - case MTDFILEMODE: - { - mfi->mode = 0; - - switch(arg) { - case MTD_MODE_OTP_FACTORY: - case MTD_MODE_OTP_USER: - ret = otp_select_filemode(mfi, arg); - break; - - case MTD_MODE_RAW: - if (!mtd->read_oob || !mtd->write_oob) - return -EOPNOTSUPP; - mfi->mode = arg; - - case MTD_MODE_NORMAL: - break; - default: - ret = -EINVAL; - } - file->f_pos = 0; - break; - } - default: ret = -ENOTTY; } diff --git a/drivers/mtd/mtdconcat.c b/drivers/mtd/mtdconcat.c index 1fea631b5..b1bf8c411 100644 --- a/drivers/mtd/mtdconcat.c +++ b/drivers/mtd/mtdconcat.c @@ -19,8 +19,6 @@ #include #include -#include - /* * Our storage structure: * Subdev points to an array of pointers to struct mtd_info objects @@ -56,7 +54,7 @@ concat_read(struct mtd_info *mtd, loff_t from, size_t len, size_t * retlen, u_char * buf) { struct mtd_concat *concat = CONCAT(mtd); - int ret = 0, err; + int err = -EINVAL; int i; *retlen = 0; @@ -80,29 +78,19 @@ concat_read(struct mtd_info *mtd, loff_t from, size_t len, err = subdev->read(subdev, from, size, &retsize, buf); - /* Save information about bitflips! */ - if (unlikely(err)) { - if (err == -EBADMSG) { - mtd->ecc_stats.failed++; - ret = err; - } else if (err == -EUCLEAN) { - mtd->ecc_stats.corrected++; - /* Do not overwrite -EBADMSG !! */ - if (!ret) - ret = err; - } else - return err; - } + if (err) + break; *retlen += retsize; len -= size; if (len == 0) - return ret; + break; + err = -EINVAL; buf += size; from = 0; } - return -EINVAL; + return err; } static int @@ -153,185 +141,211 @@ concat_write(struct mtd_info *mtd, loff_t to, size_t len, } static int -concat_writev(struct mtd_info *mtd, const struct kvec *vecs, - unsigned long count, loff_t to, size_t * retlen) +concat_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) { struct mtd_concat *concat = CONCAT(mtd); - struct kvec *vecs_copy; - unsigned long entry_low, entry_high; - size_t total_len = 0; - int i; int err = -EINVAL; - - if (!(mtd->flags & MTD_WRITEABLE)) - return -EROFS; + int i; *retlen = 0; - /* Calculate total length of data */ - for (i = 0; i < count; i++) - total_len += vecs[i].iov_len; + for (i = 0; i < concat->num_subdev; i++) { + struct mtd_info *subdev = concat->subdev[i]; + size_t size, retsize; - /* Do not allow write past end of device */ - if ((to + total_len) > mtd->size) - return -EINVAL; + if (from >= subdev->size) { + /* Not destined for this subdev */ + size = 0; + from -= subdev->size; + continue; + } - /* Check alignment */ - if (mtd->writesize > 1) { - loff_t __to = to; - if (do_div(__to, mtd->writesize) || (total_len % mtd->writesize)) - return -EINVAL; + if (from + len > subdev->size) + /* First part goes into this subdev */ + size = subdev->size - from; + else + /* Entire transaction goes into this subdev */ + size = len; + + if (subdev->read_ecc) + err = subdev->read_ecc(subdev, from, size, + &retsize, buf, eccbuf, oobsel); + else + err = -EINVAL; + + if (err) + break; + + *retlen += retsize; + len -= size; + if (len == 0) + break; + + err = -EINVAL; + buf += size; + if (eccbuf) { + eccbuf += subdev->oobsize; + /* in nand.c at least, eccbufs are + tagged with 2 (int)eccstatus'; we + must account for these */ + eccbuf += 2 * (sizeof (int)); + } + from = 0; } + return err; +} - /* make a copy of vecs */ - vecs_copy = kmalloc(sizeof(struct kvec) * count, GFP_KERNEL); - if (!vecs_copy) - return -ENOMEM; - memcpy(vecs_copy, vecs, sizeof(struct kvec) * count); +static int +concat_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) +{ + struct mtd_concat *concat = CONCAT(mtd); + int err = -EINVAL; + int i; + + if (!(mtd->flags & MTD_WRITEABLE)) + return -EROFS; + + *retlen = 0; - entry_low = 0; for (i = 0; i < concat->num_subdev; i++) { struct mtd_info *subdev = concat->subdev[i]; - size_t size, wsize, retsize, old_iov_len; + size_t size, retsize; if (to >= subdev->size) { + size = 0; to -= subdev->size; continue; } - - size = min(total_len, (size_t)(subdev->size - to)); - wsize = size; /* store for future use */ - - entry_high = entry_low; - while (entry_high < count) { - if (size <= vecs_copy[entry_high].iov_len) - break; - size -= vecs_copy[entry_high++].iov_len; - } - - old_iov_len = vecs_copy[entry_high].iov_len; - vecs_copy[entry_high].iov_len = size; + if (to + len > subdev->size) + size = subdev->size - to; + else + size = len; if (!(subdev->flags & MTD_WRITEABLE)) err = -EROFS; + else if (subdev->write_ecc) + err = subdev->write_ecc(subdev, to, size, + &retsize, buf, eccbuf, oobsel); else - err = subdev->writev(subdev, &vecs_copy[entry_low], - entry_high - entry_low + 1, to, &retsize); - - vecs_copy[entry_high].iov_len = old_iov_len - size; - vecs_copy[entry_high].iov_base += size; - - entry_low = entry_high; + err = -EINVAL; if (err) break; *retlen += retsize; - total_len -= wsize; - - if (total_len == 0) + len -= size; + if (len == 0) break; err = -EINVAL; + buf += size; + if (eccbuf) + eccbuf += subdev->oobsize; to = 0; } - - kfree(vecs_copy); return err; } static int -concat_read_oob(struct mtd_info *mtd, loff_t from, struct mtd_oob_ops *ops) +concat_read_oob(struct mtd_info *mtd, loff_t from, size_t len, + size_t * retlen, u_char * buf) { struct mtd_concat *concat = CONCAT(mtd); - struct mtd_oob_ops devops = *ops; - int i, err, ret = 0; + int err = -EINVAL; + int i; - ops->retlen = 0; + *retlen = 0; for (i = 0; i < concat->num_subdev; i++) { struct mtd_info *subdev = concat->subdev[i]; + size_t size, retsize; if (from >= subdev->size) { + /* Not destined for this subdev */ + size = 0; from -= subdev->size; continue; } + if (from + len > subdev->size) + /* First part goes into this subdev */ + size = subdev->size - from; + else + /* Entire transaction goes into this subdev */ + size = len; - /* partial read ? */ - if (from + devops.len > subdev->size) - devops.len = subdev->size - from; - - err = subdev->read_oob(subdev, from, &devops); - ops->retlen += devops.retlen; - - /* Save information about bitflips! */ - if (unlikely(err)) { - if (err == -EBADMSG) { - mtd->ecc_stats.failed++; - ret = err; - } else if (err == -EUCLEAN) { - mtd->ecc_stats.corrected++; - /* Do not overwrite -EBADMSG !! */ - if (!ret) - ret = err; - } else - return err; - } + if (subdev->read_oob) + err = subdev->read_oob(subdev, from, size, + &retsize, buf); + else + err = -EINVAL; - devops.len = ops->len - ops->retlen; - if (!devops.len) - return ret; + if (err) + break; - if (devops.datbuf) - devops.datbuf += devops.retlen; - if (devops.oobbuf) - devops.oobbuf += devops.ooblen; + *retlen += retsize; + len -= size; + if (len == 0) + break; + err = -EINVAL; + buf += size; from = 0; } - return -EINVAL; + return err; } static int -concat_write_oob(struct mtd_info *mtd, loff_t to, struct mtd_oob_ops *ops) +concat_write_oob(struct mtd_info *mtd, loff_t to, size_t len, + size_t * retlen, const u_char * buf) { struct mtd_concat *concat = CONCAT(mtd); - struct mtd_oob_ops devops = *ops; - int i, err; + int err = -EINVAL; + int i; if (!(mtd->flags & MTD_WRITEABLE)) return -EROFS; - ops->retlen = 0; + *retlen = 0; for (i = 0; i < concat->num_subdev; i++) { struct mtd_info *subdev = concat->subdev[i]; + size_t size, retsize; if (to >= subdev->size) { + size = 0; to -= subdev->size; continue; } + if (to + len > subdev->size) + size = subdev->size - to; + else + size = len; - /* partial write ? */ - if (to + devops.len > subdev->size) - devops.len = subdev->size - to; + if (!(subdev->flags & MTD_WRITEABLE)) + err = -EROFS; + else if (subdev->write_oob) + err = subdev->write_oob(subdev, to, size, &retsize, + buf); + else + err = -EINVAL; - err = subdev->write_oob(subdev, to, &devops); - ops->retlen += devops.retlen; if (err) - return err; + break; - devops.len = ops->len - ops->retlen; - if (!devops.len) - return 0; + *retlen += retsize; + len -= size; + if (len == 0) + break; - if (devops.datbuf) - devops.datbuf += devops.retlen; - if (devops.oobbuf) - devops.oobbuf += devops.ooblen; + err = -EINVAL; + buf += size; to = 0; } - return -EINVAL; + return err; } static void concat_erase_callback(struct erase_info *instr) @@ -463,7 +477,8 @@ static int concat_erase(struct mtd_info *mtd, struct erase_info *instr) } /* must never happen since size limit has been verified above */ - BUG_ON(i >= concat->num_subdev); + if (i >= concat->num_subdev) + BUG(); /* now do the erase: */ err = 0; @@ -485,7 +500,8 @@ static int concat_erase(struct mtd_info *mtd, struct erase_info *instr) if ((err = concat_dev_erase(subdev, erase))) { /* sanity check: should never happen since * block alignment has been checked above */ - BUG_ON(err == -EINVAL); + if (err == -EINVAL) + BUG(); if (erase->fail_addr != 0xffffffff) instr->fail_addr = erase->fail_addr + offset; break; @@ -622,60 +638,6 @@ static void concat_resume(struct mtd_info *mtd) } } -static int concat_block_isbad(struct mtd_info *mtd, loff_t ofs) -{ - struct mtd_concat *concat = CONCAT(mtd); - int i, res = 0; - - if (!concat->subdev[0]->block_isbad) - return res; - - if (ofs > mtd->size) - return -EINVAL; - - for (i = 0; i < concat->num_subdev; i++) { - struct mtd_info *subdev = concat->subdev[i]; - - if (ofs >= subdev->size) { - ofs -= subdev->size; - continue; - } - - res = subdev->block_isbad(subdev, ofs); - break; - } - - return res; -} - -static int concat_block_markbad(struct mtd_info *mtd, loff_t ofs) -{ - struct mtd_concat *concat = CONCAT(mtd); - int i, err = -EINVAL; - - if (!concat->subdev[0]->block_markbad) - return 0; - - if (ofs > mtd->size) - return -EINVAL; - - for (i = 0; i < concat->num_subdev; i++) { - struct mtd_info *subdev = concat->subdev[i]; - - if (ofs >= subdev->size) { - ofs -= subdev->size; - continue; - } - - err = subdev->block_markbad(subdev, ofs); - if (!err) - mtd->ecc_stats.badblocks++; - break; - } - - return err; -} - /* * This function constructs a virtual MTD device by concatenating * num_devs MTD devices. A pointer to the new device object is @@ -717,22 +679,18 @@ struct mtd_info *mtd_concat_create(struct mtd_info *subdev[], /* subdevices to c concat->mtd.flags = subdev[0]->flags; concat->mtd.size = subdev[0]->size; concat->mtd.erasesize = subdev[0]->erasesize; - concat->mtd.writesize = subdev[0]->writesize; + concat->mtd.oobblock = subdev[0]->oobblock; concat->mtd.oobsize = subdev[0]->oobsize; concat->mtd.ecctype = subdev[0]->ecctype; concat->mtd.eccsize = subdev[0]->eccsize; - if (subdev[0]->writev) - concat->mtd.writev = concat_writev; + if (subdev[0]->read_ecc) + concat->mtd.read_ecc = concat_read_ecc; + if (subdev[0]->write_ecc) + concat->mtd.write_ecc = concat_write_ecc; if (subdev[0]->read_oob) concat->mtd.read_oob = concat_read_oob; if (subdev[0]->write_oob) concat->mtd.write_oob = concat_write_oob; - if (subdev[0]->block_isbad) - concat->mtd.block_isbad = concat_block_isbad; - if (subdev[0]->block_markbad) - concat->mtd.block_markbad = concat_block_markbad; - - concat->mtd.ecc_stats.badblocks = subdev[0]->ecc_stats.badblocks; concat->subdev[0] = subdev[0]; @@ -761,12 +719,12 @@ struct mtd_info *mtd_concat_create(struct mtd_info *subdev[], /* subdevices to c subdev[i]->flags & MTD_WRITEABLE; } concat->mtd.size += subdev[i]->size; - concat->mtd.ecc_stats.badblocks += - subdev[i]->ecc_stats.badblocks; - if (concat->mtd.writesize != subdev[i]->writesize || + if (concat->mtd.oobblock != subdev[i]->oobblock || concat->mtd.oobsize != subdev[i]->oobsize || concat->mtd.ecctype != subdev[i]->ecctype || concat->mtd.eccsize != subdev[i]->eccsize || + !concat->mtd.read_ecc != !subdev[i]->read_ecc || + !concat->mtd.write_ecc != !subdev[i]->write_ecc || !concat->mtd.read_oob != !subdev[i]->read_oob || !concat->mtd.write_oob != !subdev[i]->write_oob) { kfree(concat); @@ -778,11 +736,14 @@ struct mtd_info *mtd_concat_create(struct mtd_info *subdev[], /* subdevices to c } - concat->mtd.ecclayout = subdev[0]->ecclayout; - concat->num_subdev = num_devs; concat->mtd.name = name; + /* + * NOTE: for now, we do not provide any readv()/writev() methods + * because they are messy to implement and they are not + * used to a great extent anyway. + */ concat->mtd.erase = concat_erase; concat->mtd.read = concat_read; concat->mtd.write = concat_write; diff --git a/drivers/mtd/mtdcore.c b/drivers/mtd/mtdcore.c index 168d3ba06..dade02ab0 100644 --- a/drivers/mtd/mtdcore.c +++ b/drivers/mtd/mtdcore.c @@ -6,6 +6,7 @@ * */ +#include #include #include #include @@ -18,13 +19,15 @@ #include #include #include +#ifdef CONFIG_PROC_FS #include +#endif #include /* These are exported solely for the purpose of mtd_blkdevs.c. You should not use them for _anything_ else */ -DEFINE_MUTEX(mtd_table_mutex); +DECLARE_MUTEX(mtd_table_mutex); struct mtd_info *mtd_table[MAX_MTD_DEVICES]; EXPORT_SYMBOL_GPL(mtd_table_mutex); @@ -46,8 +49,7 @@ int add_mtd_device(struct mtd_info *mtd) { int i; - BUG_ON(mtd->writesize == 0); - mutex_lock(&mtd_table_mutex); + down(&mtd_table_mutex); for (i=0; i < MAX_MTD_DEVICES; i++) if (!mtd_table[i]) { @@ -65,7 +67,7 @@ int add_mtd_device(struct mtd_info *mtd) not->add(mtd); } - mutex_unlock(&mtd_table_mutex); + up(&mtd_table_mutex); /* We _know_ we aren't being removed, because our caller is still holding us here. So none of this try_ nonsense, and no bitching about it @@ -74,7 +76,7 @@ int add_mtd_device(struct mtd_info *mtd) return 0; } - mutex_unlock(&mtd_table_mutex); + up(&mtd_table_mutex); return 1; } @@ -92,7 +94,7 @@ int del_mtd_device (struct mtd_info *mtd) { int ret; - mutex_lock(&mtd_table_mutex); + down(&mtd_table_mutex); if (mtd_table[mtd->index] != mtd) { ret = -ENODEV; @@ -116,7 +118,7 @@ int del_mtd_device (struct mtd_info *mtd) ret = 0; } - mutex_unlock(&mtd_table_mutex); + up(&mtd_table_mutex); return ret; } @@ -133,7 +135,7 @@ void register_mtd_user (struct mtd_notifier *new) { int i; - mutex_lock(&mtd_table_mutex); + down(&mtd_table_mutex); list_add(&new->list, &mtd_notifiers); @@ -143,7 +145,7 @@ void register_mtd_user (struct mtd_notifier *new) if (mtd_table[i]) new->add(mtd_table[i]); - mutex_unlock(&mtd_table_mutex); + up(&mtd_table_mutex); } /** @@ -160,7 +162,7 @@ int unregister_mtd_user (struct mtd_notifier *old) { int i; - mutex_lock(&mtd_table_mutex); + down(&mtd_table_mutex); module_put(THIS_MODULE); @@ -169,7 +171,7 @@ int unregister_mtd_user (struct mtd_notifier *old) old->remove(mtd_table[i]); list_del(&old->list); - mutex_unlock(&mtd_table_mutex); + up(&mtd_table_mutex); return 0; } @@ -191,7 +193,7 @@ struct mtd_info *get_mtd_device(struct mtd_info *mtd, int num) struct mtd_info *ret = NULL; int i; - mutex_lock(&mtd_table_mutex); + down(&mtd_table_mutex); if (num == -1) { for (i=0; i< MAX_MTD_DEVICES; i++) @@ -209,7 +211,7 @@ struct mtd_info *get_mtd_device(struct mtd_info *mtd, int num) if (ret) ret->usecount++; - mutex_unlock(&mtd_table_mutex); + up(&mtd_table_mutex); return ret; } @@ -217,9 +219,9 @@ void put_mtd_device(struct mtd_info *mtd) { int c; - mutex_lock(&mtd_table_mutex); + down(&mtd_table_mutex); c = --mtd->usecount; - mutex_unlock(&mtd_table_mutex); + up(&mtd_table_mutex); BUG_ON(c < 0); module_put(mtd->owner); @@ -254,6 +256,37 @@ int default_mtd_writev(struct mtd_info *mtd, const struct kvec *vecs, return ret; } + +/* default_mtd_readv - default mtd readv method for MTD devices that dont + * implement their own + */ + +int default_mtd_readv(struct mtd_info *mtd, struct kvec *vecs, + unsigned long count, loff_t from, size_t *retlen) +{ + unsigned long i; + size_t totlen = 0, thislen; + int ret = 0; + + if(!mtd->read) { + ret = -EIO; + } else { + for (i=0; iread(mtd, from, vecs[i].iov_len, &thislen, vecs[i].iov_base); + totlen += thislen; + if (ret || thislen != vecs[i].iov_len) + break; + from += vecs[i].iov_len; + } + } + if (retlen) + *retlen = totlen; + return ret; +} + + EXPORT_SYMBOL(add_mtd_device); EXPORT_SYMBOL(del_mtd_device); EXPORT_SYMBOL(get_mtd_device); @@ -261,12 +294,12 @@ EXPORT_SYMBOL(put_mtd_device); EXPORT_SYMBOL(register_mtd_user); EXPORT_SYMBOL(unregister_mtd_user); EXPORT_SYMBOL(default_mtd_writev); - -#ifdef CONFIG_PROC_FS +EXPORT_SYMBOL(default_mtd_readv); /*====================================================================*/ /* Support for /proc/mtd */ +#ifdef CONFIG_PROC_FS static struct proc_dir_entry *proc_mtd; static inline int mtd_proc_info (char *buf, int i) @@ -286,7 +319,7 @@ static int mtd_read_proc (char *page, char **start, off_t off, int count, int len, l, i; off_t begin = 0; - mutex_lock(&mtd_table_mutex); + down(&mtd_table_mutex); len = sprintf(page, "dev: size erasesize name\n"); for (i=0; i< MAX_MTD_DEVICES; i++) { @@ -304,34 +337,38 @@ static int mtd_read_proc (char *page, char **start, off_t off, int count, *eof = 1; done: - mutex_unlock(&mtd_table_mutex); + up(&mtd_table_mutex); if (off >= len+begin) return 0; *start = page + (off-begin); return ((count < begin+len-off) ? count : begin+len-off); } +#endif /* CONFIG_PROC_FS */ + /*====================================================================*/ /* Init code */ static int __init init_mtd(void) { +#ifdef CONFIG_PROC_FS if ((proc_mtd = create_proc_entry( "mtd", 0, NULL ))) proc_mtd->read_proc = mtd_read_proc; +#endif return 0; } static void __exit cleanup_mtd(void) { +#ifdef CONFIG_PROC_FS if (proc_mtd) remove_proc_entry( "mtd", NULL); +#endif } module_init(init_mtd); module_exit(cleanup_mtd); -#endif /* CONFIG_PROC_FS */ - MODULE_LICENSE("GPL"); MODULE_AUTHOR("David Woodhouse "); diff --git a/drivers/mtd/mtdpart.c b/drivers/mtd/mtdpart.c index 06a930372..99395911d 100644 --- a/drivers/mtd/mtdpart.c +++ b/drivers/mtd/mtdpart.c @@ -16,6 +16,7 @@ #include #include #include +#include #include #include #include @@ -50,21 +51,16 @@ static int part_read (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf) { struct mtd_part *part = PART(mtd); - int res; - if (from >= mtd->size) len = 0; else if (from + len > mtd->size) len = mtd->size - from; - res = part->master->read (part->master, from + part->offset, - len, retlen, buf); - if (unlikely(res)) { - if (res == -EUCLEAN) - mtd->ecc_stats.corrected++; - if (res == -EBADMSG) - mtd->ecc_stats.failed++; - } - return res; + if (part->master->read_ecc == NULL) + return part->master->read (part->master, from + part->offset, + len, retlen, buf); + else + return part->master->read_ecc (part->master, from + part->offset, + len, retlen, buf, NULL, &mtd->oobinfo); } static int part_point (struct mtd_info *mtd, loff_t from, size_t len, @@ -78,7 +74,6 @@ static int part_point (struct mtd_info *mtd, loff_t from, size_t len, return part->master->point (part->master, from + part->offset, len, retlen, buf); } - static void part_unpoint (struct mtd_info *mtd, u_char *addr, loff_t from, size_t len) { struct mtd_part *part = PART(mtd); @@ -86,25 +81,31 @@ static void part_unpoint (struct mtd_info *mtd, u_char *addr, loff_t from, size_ part->master->unpoint (part->master, addr, from + part->offset, len); } -static int part_read_oob(struct mtd_info *mtd, loff_t from, - struct mtd_oob_ops *ops) + +static int part_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) { struct mtd_part *part = PART(mtd); - int res; - + if (oobsel == NULL) + oobsel = &mtd->oobinfo; if (from >= mtd->size) - return -EINVAL; - if (from + ops->len > mtd->size) - return -EINVAL; - res = part->master->read_oob(part->master, from + part->offset, ops); + len = 0; + else if (from + len > mtd->size) + len = mtd->size - from; + return part->master->read_ecc (part->master, from + part->offset, + len, retlen, buf, eccbuf, oobsel); +} - if (unlikely(res)) { - if (res == -EUCLEAN) - mtd->ecc_stats.corrected++; - if (res == -EBADMSG) - mtd->ecc_stats.failed++; - } - return res; +static int part_read_oob (struct mtd_info *mtd, loff_t from, size_t len, + size_t *retlen, u_char *buf) +{ + struct mtd_part *part = PART(mtd); + if (from >= mtd->size) + len = 0; + else if (from + len > mtd->size) + len = mtd->size - from; + return part->master->read_oob (part->master, from + part->offset, + len, retlen, buf); } static int part_read_user_prot_reg (struct mtd_info *mtd, loff_t from, size_t len, @@ -147,23 +148,44 @@ static int part_write (struct mtd_info *mtd, loff_t to, size_t len, len = 0; else if (to + len > mtd->size) len = mtd->size - to; - return part->master->write (part->master, to + part->offset, - len, retlen, buf); + if (part->master->write_ecc == NULL) + return part->master->write (part->master, to + part->offset, + len, retlen, buf); + else + return part->master->write_ecc (part->master, to + part->offset, + len, retlen, buf, NULL, &mtd->oobinfo); + } -static int part_write_oob(struct mtd_info *mtd, loff_t to, - struct mtd_oob_ops *ops) +static int part_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) { struct mtd_part *part = PART(mtd); - if (!(mtd->flags & MTD_WRITEABLE)) return -EROFS; + if (oobsel == NULL) + oobsel = &mtd->oobinfo; + if (to >= mtd->size) + len = 0; + else if (to + len > mtd->size) + len = mtd->size - to; + return part->master->write_ecc (part->master, to + part->offset, + len, retlen, buf, eccbuf, oobsel); +} +static int part_write_oob (struct mtd_info *mtd, loff_t to, size_t len, + size_t *retlen, const u_char *buf) +{ + struct mtd_part *part = PART(mtd); + if (!(mtd->flags & MTD_WRITEABLE)) + return -EROFS; if (to >= mtd->size) - return -EINVAL; - if (to + ops->len > mtd->size) - return -EINVAL; - return part->master->write_oob(part->master, to + part->offset, ops); + len = 0; + else if (to + len > mtd->size) + len = mtd->size - to; + return part->master->write_oob (part->master, to + part->offset, + len, retlen, buf); } static int part_write_user_prot_reg (struct mtd_info *mtd, loff_t from, size_t len, @@ -186,8 +208,52 @@ static int part_writev (struct mtd_info *mtd, const struct kvec *vecs, struct mtd_part *part = PART(mtd); if (!(mtd->flags & MTD_WRITEABLE)) return -EROFS; - return part->master->writev (part->master, vecs, count, + if (part->master->writev_ecc == NULL) + return part->master->writev (part->master, vecs, count, to + part->offset, retlen); + else + return part->master->writev_ecc (part->master, vecs, count, + to + part->offset, retlen, + NULL, &mtd->oobinfo); +} + +static int part_readv (struct mtd_info *mtd, struct kvec *vecs, + unsigned long count, loff_t from, size_t *retlen) +{ + struct mtd_part *part = PART(mtd); + if (part->master->readv_ecc == NULL) + return part->master->readv (part->master, vecs, count, + from + part->offset, retlen); + else + return part->master->readv_ecc (part->master, vecs, count, + from + part->offset, retlen, + NULL, &mtd->oobinfo); +} + +static int part_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) +{ + struct mtd_part *part = PART(mtd); + if (!(mtd->flags & MTD_WRITEABLE)) + return -EROFS; + if (oobsel == NULL) + oobsel = &mtd->oobinfo; + return part->master->writev_ecc (part->master, vecs, count, + to + part->offset, retlen, + eccbuf, oobsel); +} + +static int part_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) +{ + struct mtd_part *part = PART(mtd); + if (oobsel == NULL) + oobsel = &mtd->oobinfo; + return part->master->readv_ecc (part->master, vecs, count, + from + part->offset, retlen, + eccbuf, oobsel); } static int part_erase (struct mtd_info *mtd, struct erase_info *instr) @@ -263,17 +329,12 @@ static int part_block_isbad (struct mtd_info *mtd, loff_t ofs) static int part_block_markbad (struct mtd_info *mtd, loff_t ofs) { struct mtd_part *part = PART(mtd); - int res; - if (!(mtd->flags & MTD_WRITEABLE)) return -EROFS; if (ofs >= mtd->size) return -EINVAL; ofs += part->offset; - res = part->master->block_markbad(part->master, ofs); - if (!res) - mtd->ecc_stats.badblocks++; - return res; + return part->master->block_markbad(part->master, ofs); } /* @@ -337,7 +398,7 @@ int add_mtd_partitions(struct mtd_info *master, slave->mtd.type = master->type; slave->mtd.flags = master->flags & ~parts[i].mask_flags; slave->mtd.size = parts[i].size; - slave->mtd.writesize = master->writesize; + slave->mtd.oobblock = master->oobblock; slave->mtd.oobsize = master->oobsize; slave->mtd.ecctype = master->ecctype; slave->mtd.eccsize = master->eccsize; @@ -354,6 +415,10 @@ int add_mtd_partitions(struct mtd_info *master, slave->mtd.unpoint = part_unpoint; } + if (master->read_ecc) + slave->mtd.read_ecc = part_read_ecc; + if (master->write_ecc) + slave->mtd.write_ecc = part_write_ecc; if (master->read_oob) slave->mtd.read_oob = part_read_oob; if (master->write_oob) @@ -378,6 +443,12 @@ int add_mtd_partitions(struct mtd_info *master, } if (master->writev) slave->mtd.writev = part_writev; + if (master->readv) + slave->mtd.readv = part_readv; + if (master->writev_ecc) + slave->mtd.writev_ecc = part_writev_ecc; + if (master->readv_ecc) + slave->mtd.readv_ecc = part_readv_ecc; if (master->lock) slave->mtd.lock = part_lock; if (master->unlock) @@ -457,17 +528,8 @@ int add_mtd_partitions(struct mtd_info *master, parts[i].name); } - slave->mtd.ecclayout = master->ecclayout; - if (master->block_isbad) { - uint32_t offs = 0; - - while(offs < slave->mtd.size) { - if (master->block_isbad(master, - offs + slave->offset)) - slave->mtd.ecc_stats.badblocks++; - offs += slave->mtd.erasesize; - } - } + /* copy oobinfo from master */ + memcpy(&slave->mtd.oobinfo, &master->oobinfo, sizeof(slave->mtd.oobinfo)); if(parts[i].mtdp) { /* store the object pointer (caller may or may not register it */ diff --git a/drivers/mtd/nand/Kconfig b/drivers/mtd/nand/Kconfig index c99302ed3..cfe288a6e 100644 --- a/drivers/mtd/nand/Kconfig +++ b/drivers/mtd/nand/Kconfig @@ -11,7 +11,7 @@ config MTD_NAND help This enables support for accessing all type of NAND flash devices. For further information see - . + . config MTD_NAND_VERIFY_WRITE bool "Verify NAND page writes" @@ -23,14 +23,6 @@ config MTD_NAND_VERIFY_WRITE device thinks the write was successful, a bit could have been flipped accidentaly due to device wear or something else. -config MTD_NAND_ECC_SMC - bool "NAND ECC Smart Media byte order" - depends on MTD_NAND - default n - help - Software ECC according to the Smart Media Specification. - The original Linux implementation had byte 0 and 1 swapped. - config MTD_NAND_AUTCPU12 tristate "SmartMediaCard on autronix autcpu12 board" depends on MTD_NAND && ARCH_AUTCPU12 @@ -57,24 +49,12 @@ config MTD_NAND_SPIA help If you had to ask, you don't have one. Say 'N'. -config MTD_NAND_AMS_DELTA - tristate "NAND Flash device on Amstrad E3" - depends on MACH_AMS_DELTA && MTD_NAND - help - Support for NAND flash on Amstrad E3 (Delta). - config MTD_NAND_TOTO tristate "NAND Flash device on TOTO board" - depends on ARCH_OMAP && MTD_NAND && BROKEN + depends on ARCH_OMAP && MTD_NAND help Support for NAND flash on Texas Instruments Toto platform. -config MTD_NAND_TS7250 - tristate "NAND Flash device on TS-7250 board" - depends on MACH_TS72XX && MTD_NAND - help - Support for NAND flash on Technologic Systems TS-7250 platform. - config MTD_NAND_IDS tristate @@ -96,7 +76,7 @@ config MTD_NAND_RTC_FROM4 config MTD_NAND_PPCHAMELEONEVB tristate "NAND Flash device on PPChameleonEVB board" - depends on PPCHAMELEONEVB && MTD_NAND && BROKEN + depends on PPCHAMELEONEVB && MTD_NAND help This enables the NAND flash driver on the PPChameleon EVB Board. @@ -107,7 +87,7 @@ config MTD_NAND_S3C2410 This enables the NAND flash controller on the S3C2410 and S3C2440 SoCs - No board specific support is done by this driver, each board + No board specfic support is done by this driver, each board must advertise a platform_device for the driver to attach. config MTD_NAND_S3C2410_DEBUG @@ -129,22 +109,6 @@ config MTD_NAND_S3C2410_HWECC currently not be able to switch to software, as there is no implementation for ECC method used by the S3C2410 -config MTD_NAND_NDFC - tristate "NDFC NanD Flash Controller" - depends on MTD_NAND && 44x - help - NDFC Nand Flash Controllers are integrated in EP44x SoCs - -config MTD_NAND_S3C2410_CLKSTOP - bool "S3C2410 NAND IDLE clock stop" - depends on MTD_NAND_S3C2410 - default n - help - Stop the clock to the NAND controller when there is no chip - selected to save power. This will mean there is a small delay - when the is NAND chip selected or released, but will save - approximately 5mA of power when there is nothing happening. - config MTD_NAND_DISKONCHIP tristate "DiskOnChip 2000, Millennium and Millennium Plus (NAND reimplementation) (EXPERIMENTAL)" depends on MTD_NAND && EXPERIMENTAL @@ -219,24 +183,11 @@ config MTD_NAND_SHARPSL tristate "Support for NAND Flash on Sharp SL Series (C7xx + others)" depends on MTD_NAND && ARCH_PXA -config MTD_NAND_CS553X - tristate "NAND support for CS5535/CS5536 (AMD Geode companion chip)" - depends on MTD_NAND && X86_32 && (X86_PC || X86_GENERICARCH) - help - The CS553x companion chips for the AMD Geode processor - include NAND flash controllers with built-in hardware ECC - capabilities; enabling this option will allow you to use - these. The driver will check the MSRs to verify that the - controller is enabled for NAND, and currently requires that - the controller be in MMIO mode. - - If you say "m", the module will be called "cs553x_nand.ko". - config MTD_NAND_NANDSIM tristate "Support for NAND Flash Simulator" depends on MTD_NAND && MTD_PARTITIONS help - The simulator may simulate various NAND flash chips for the + The simulator may simulate verious NAND flash chips for the MTD nand layer. endmenu diff --git a/drivers/mtd/nand/Makefile b/drivers/mtd/nand/Makefile index f74759351..41742026a 100644 --- a/drivers/mtd/nand/Makefile +++ b/drivers/mtd/nand/Makefile @@ -7,7 +7,6 @@ obj-$(CONFIG_MTD_NAND) += nand.o nand_ecc.o obj-$(CONFIG_MTD_NAND_IDS) += nand_ids.o obj-$(CONFIG_MTD_NAND_SPIA) += spia.o -obj-$(CONFIG_MTD_NAND_AMS_DELTA) += ams-delta.o obj-$(CONFIG_MTD_NAND_TOTO) += toto.o obj-$(CONFIG_MTD_NAND_AUTCPU12) += autcpu12.o obj-$(CONFIG_MTD_NAND_EDB7312) += edb7312.o @@ -18,9 +17,6 @@ obj-$(CONFIG_MTD_NAND_DISKONCHIP) += diskonchip.o obj-$(CONFIG_MTD_NAND_H1900) += h1910.o obj-$(CONFIG_MTD_NAND_RTC_FROM4) += rtc_from4.o obj-$(CONFIG_MTD_NAND_SHARPSL) += sharpsl.o -obj-$(CONFIG_MTD_NAND_TS7250) += ts7250.o obj-$(CONFIG_MTD_NAND_NANDSIM) += nandsim.o -obj-$(CONFIG_MTD_NAND_CS553X) += cs553x_nand.o -obj-$(CONFIG_MTD_NAND_NDFC) += ndfc.o nand-objs = nand_base.o nand_bbt.o diff --git a/drivers/mtd/nand/au1550nd.c b/drivers/mtd/nand/au1550nd.c index 31228334d..201e1362d 100644 --- a/drivers/mtd/nand/au1550nd.c +++ b/drivers/mtd/nand/au1550nd.c @@ -14,7 +14,6 @@ #include #include #include -#include #include #include #include @@ -39,22 +38,25 @@ */ static struct mtd_info *au1550_mtd = NULL; static void __iomem *p_nand; -static int nand_width = 1; /* default x8 */ -static void (*au1550_write_byte)(struct mtd_info *, u_char); +static int nand_width = 1; /* default x8*/ /* * Define partitions for flash device */ static const struct mtd_partition partition_info[] = { { - .name = "NAND FS 0", - .offset = 0, - .size = 8 * 1024 * 1024}, + .name = "NAND FS 0", + .offset = 0, + .size = 8*1024*1024 + }, { - .name = "NAND FS 1", - .offset = MTDPART_OFS_APPEND, - .size = MTDPART_SIZ_FULL} + .name = "NAND FS 1", + .offset = MTDPART_OFS_APPEND, + .size = MTDPART_SIZ_FULL + } }; +#define NB_OF(x) (sizeof(x)/sizeof(x[0])) + /** * au_read_byte - read one byte from the chip @@ -129,6 +131,21 @@ static u16 au_read_word(struct mtd_info *mtd) return ret; } +/** + * au_write_word - write one word to the chip + * @mtd: MTD device structure + * @word: data word to write + * + * write function for 16bit buswith without + * endianess conversion + */ +static void au_write_word(struct mtd_info *mtd, u16 word) +{ + struct nand_chip *this = mtd->priv; + writew(word, this->IO_ADDR_W); + au_sync(); +} + /** * au_write_buf - write buffer to chip * @mtd: MTD device structure @@ -142,7 +159,7 @@ static void au_write_buf(struct mtd_info *mtd, const u_char *buf, int len) int i; struct nand_chip *this = mtd->priv; - for (i = 0; i < len; i++) { + for (i=0; iIO_ADDR_W); au_sync(); } @@ -161,7 +178,7 @@ static void au_read_buf(struct mtd_info *mtd, u_char *buf, int len) int i; struct nand_chip *this = mtd->priv; - for (i = 0; i < len; i++) { + for (i=0; iIO_ADDR_R); au_sync(); } @@ -180,7 +197,7 @@ static int au_verify_buf(struct mtd_info *mtd, const u_char *buf, int len) int i; struct nand_chip *this = mtd->priv; - for (i = 0; i < len; i++) { + for (i=0; iIO_ADDR_R)) return -EFAULT; au_sync(); @@ -204,7 +221,7 @@ static void au_write_buf16(struct mtd_info *mtd, const u_char *buf, int len) u16 *p = (u16 *) buf; len >>= 1; - for (i = 0; i < len; i++) { + for (i=0; iIO_ADDR_W); au_sync(); } @@ -226,7 +243,7 @@ static void au_read_buf16(struct mtd_info *mtd, u_char *buf, int len) u16 *p = (u16 *) buf; len >>= 1; - for (i = 0; i < len; i++) { + for (i=0; iIO_ADDR_R); au_sync(); } @@ -247,7 +264,7 @@ static int au_verify_buf16(struct mtd_info *mtd, const u_char *buf, int len) u16 *p = (u16 *) buf; len >>= 1; - for (i = 0; i < len; i++) { + for (i=0; iIO_ADDR_R)) return -EFAULT; au_sync(); @@ -255,52 +272,32 @@ static int au_verify_buf16(struct mtd_info *mtd, const u_char *buf, int len) return 0; } -/* 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 -/* 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 -/* 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 static void au1550_hwcontrol(struct mtd_info *mtd, int cmd) { register struct nand_chip *this = mtd->priv; - switch (cmd) { + switch(cmd){ - case NAND_CTL_SETCLE: - this->IO_ADDR_W = p_nand + MEM_STNAND_CMD; - break; - - case NAND_CTL_CLRCLE: - this->IO_ADDR_W = p_nand + MEM_STNAND_DATA; - break; - - case NAND_CTL_SETALE: - this->IO_ADDR_W = p_nand + MEM_STNAND_ADDR; - break; + case NAND_CTL_SETCLE: this->IO_ADDR_W = p_nand + MEM_STNAND_CMD; break; + case NAND_CTL_CLRCLE: this->IO_ADDR_W = p_nand + MEM_STNAND_DATA; break; + case NAND_CTL_SETALE: this->IO_ADDR_W = p_nand + MEM_STNAND_ADDR; break; case NAND_CTL_CLRALE: this->IO_ADDR_W = p_nand + MEM_STNAND_DATA; - /* FIXME: Nobody knows why this is necessary, + /* FIXME: Nobody knows why this is neccecary, * but it works only that way */ udelay(1); break; case NAND_CTL_SETNCE: /* assert (force assert) chip enable */ - au_writel((1 << (4 + NAND_CS)), MEM_STNDCTL); + au_writel((1<<(4+NAND_CS)) , MEM_STNDCTL); break; break; case NAND_CTL_CLRNCE: - /* deassert chip enable */ - au_writel(0, MEM_STNDCTL); + /* deassert chip enable */ + au_writel(0, MEM_STNDCTL); break; break; } @@ -317,200 +314,69 @@ int au1550_device_ready(struct mtd_info *mtd) return ret; } -/** - * au1550_select_chip - control -CE line - * Forbid driving -CE manually permitting the NAND controller to do this. - * Keeping -CE asserted during the whole sector reads interferes with the - * NOR flash and PCMCIA drivers as it causes contention on the static bus. - * We only have to hold -CE low for the NAND read commands since the flash - * chip needs it to be asserted during chip not ready time but the NAND - * controller keeps it released. - * - * @mtd: MTD device structure - * @chip: chipnumber to select, -1 for deselect - */ -static void au1550_select_chip(struct mtd_info *mtd, int chip) -{ -} - -/** - * au1550_command - Send command to NAND device - * @mtd: MTD device structure - * @command: the command to be sent - * @column: the column address for this command, -1 if none - * @page_addr: the page address for this command, -1 if none - */ -static void au1550_command(struct mtd_info *mtd, unsigned command, int column, int page_addr) -{ - register struct nand_chip *this = mtd->priv; - int ce_override = 0, i; - ulong flags; - - /* Begin command latch cycle */ - au1550_hwcontrol(mtd, NAND_CTL_SETCLE); - /* - * Write out the command to the device. - */ - if (command == NAND_CMD_SEQIN) { - int readcmd; - - if (column >= mtd->writesize) { - /* OOB area */ - column -= mtd->writesize; - readcmd = NAND_CMD_READOOB; - } else if (column < 256) { - /* First 256 bytes --> READ0 */ - readcmd = NAND_CMD_READ0; - } else { - column -= 256; - readcmd = NAND_CMD_READ1; - } - au1550_write_byte(mtd, readcmd); - } - au1550_write_byte(mtd, command); - - /* Set ALE and clear CLE to start address cycle */ - au1550_hwcontrol(mtd, NAND_CTL_CLRCLE); - - if (column != -1 || page_addr != -1) { - au1550_hwcontrol(mtd, NAND_CTL_SETALE); - - /* Serially input address */ - if (column != -1) { - /* Adjust columns for 16 bit buswidth */ - if (this->options & NAND_BUSWIDTH_16) - column >>= 1; - au1550_write_byte(mtd, column); - } - if (page_addr != -1) { - au1550_write_byte(mtd, (u8)(page_addr & 0xff)); - - if (command == NAND_CMD_READ0 || - command == NAND_CMD_READ1 || - command == NAND_CMD_READOOB) { - /* - * NAND controller will release -CE after - * the last address byte is written, so we'll - * have to forcibly assert it. No interrupts - * are allowed while we do this as we don't - * want the NOR flash or PCMCIA drivers to - * steal our precious bytes of data... - */ - ce_override = 1; - local_irq_save(flags); - au1550_hwcontrol(mtd, NAND_CTL_SETNCE); - } - - au1550_write_byte(mtd, (u8)(page_addr >> 8)); - - /* One more address cycle for devices > 32MiB */ - if (this->chipsize > (32 << 20)) - au1550_write_byte(mtd, (u8)((page_addr >> 16) & 0x0f)); - } - /* Latch in address */ - au1550_hwcontrol(mtd, NAND_CTL_CLRALE); - } - - /* - * Program and erase have their own busy handlers. - * Status and sequential in need no delay. - */ - switch (command) { - - case NAND_CMD_PAGEPROG: - case NAND_CMD_ERASE1: - case NAND_CMD_ERASE2: - case NAND_CMD_SEQIN: - case NAND_CMD_STATUS: - return; - - case NAND_CMD_RESET: - break; - - case NAND_CMD_READ0: - case NAND_CMD_READ1: - case NAND_CMD_READOOB: - /* Check if we're really driving -CE low (just in case) */ - if (unlikely(!ce_override)) - break; - - /* Apply a short delay always to ensure that we do wait tWB. */ - ndelay(100); - /* Wait for a chip to become ready... */ - for (i = this->chip_delay; !this->dev_ready(mtd) && i > 0; --i) - udelay(1); - - /* Release -CE and re-enable interrupts. */ - au1550_hwcontrol(mtd, NAND_CTL_CLRNCE); - local_irq_restore(flags); - return; - } - /* Apply this short delay always to ensure that we do wait tWB. */ - ndelay(100); - - while(!this->dev_ready(mtd)); -} - - /* * Main initialization routine */ -static int __init au1xxx_nand_init(void) +int __init au1xxx_nand_init (void) { struct nand_chip *this; - u16 boot_swapboot = 0; /* default value */ + u16 boot_swapboot = 0; /* default value */ int retval; u32 mem_staddr; u32 nand_phys; /* Allocate memory for MTD device structure and private data */ - au1550_mtd = kmalloc(sizeof(struct mtd_info) + sizeof(struct nand_chip), GFP_KERNEL); + au1550_mtd = kmalloc (sizeof(struct mtd_info) + + sizeof (struct nand_chip), GFP_KERNEL); if (!au1550_mtd) { - printk("Unable to allocate NAND MTD dev structure.\n"); + printk ("Unable to allocate NAND MTD dev structure.\n"); return -ENOMEM; } /* Get pointer to private data */ - this = (struct nand_chip *)(&au1550_mtd[1]); + this = (struct nand_chip *) (&au1550_mtd[1]); /* Initialize structures */ - memset(au1550_mtd, 0, sizeof(struct mtd_info)); - memset(this, 0, sizeof(struct nand_chip)); + memset((char *) au1550_mtd, 0, sizeof(struct mtd_info)); + memset((char *) this, 0, sizeof(struct nand_chip)); /* Link the private data with the MTD structure */ au1550_mtd->priv = this; - au1550_mtd->owner = THIS_MODULE; - /* MEM_STNDCTL: disable ints, disable nand boot */ - au_writel(0, MEM_STNDCTL); + /* disable interrupts */ + au_writel(au_readl(MEM_STNDCTL) & ~(1<<8), MEM_STNDCTL); + + /* disable NAND boot */ + au_writel(au_readl(MEM_STNDCTL) & ~(1<<0), MEM_STNDCTL); #ifdef CONFIG_MIPS_PB1550 /* set gpio206 high */ - au_writel(au_readl(GPIO2_DIR) & ~(1 << 6), GPIO2_DIR); + au_writel(au_readl(GPIO2_DIR) & ~(1<<6), GPIO2_DIR); - boot_swapboot = (au_readl(MEM_STSTAT) & (0x7 << 1)) | ((bcsr->status >> 6) & 0x1); + boot_swapboot = (au_readl(MEM_STSTAT) & (0x7<<1)) | + ((bcsr->status >> 6) & 0x1); switch (boot_swapboot) { - case 0: - case 2: - case 8: - case 0xC: - case 0xD: - /* x16 NAND Flash */ - nand_width = 0; - break; - case 1: - case 9: - case 3: - case 0xE: - case 0xF: - /* x8 NAND Flash */ - nand_width = 1; - break; - default: - printk("Pb1550 NAND: bad boot:swap\n"); - retval = -EINVAL; - goto outmem; + case 0: + case 2: + case 8: + case 0xC: + case 0xD: + /* x16 NAND Flash */ + nand_width = 0; + break; + case 1: + case 9: + case 3: + case 0xE: + case 0xF: + /* x8 NAND Flash */ + nand_width = 1; + break; + default: + printk("Pb1550 NAND: bad boot:swap\n"); + retval = -EINVAL; + goto outmem; } #endif @@ -560,22 +426,21 @@ static int __init au1xxx_nand_init(void) /* make controller and MTD agree */ if (NAND_CS == 0) - nand_width = au_readl(MEM_STCFG0) & (1 << 22); + nand_width = au_readl(MEM_STCFG0) & (1<<22); if (NAND_CS == 1) - nand_width = au_readl(MEM_STCFG1) & (1 << 22); + nand_width = au_readl(MEM_STCFG1) & (1<<22); if (NAND_CS == 2) - nand_width = au_readl(MEM_STCFG2) & (1 << 22); + nand_width = au_readl(MEM_STCFG2) & (1<<22); if (NAND_CS == 3) - nand_width = au_readl(MEM_STCFG3) & (1 << 22); + nand_width = au_readl(MEM_STCFG3) & (1<<22); + /* Set address of hardware control function */ + this->hwcontrol = au1550_hwcontrol; this->dev_ready = au1550_device_ready; - this->select_chip = au1550_select_chip; - this->cmdfunc = au1550_command; - /* 30 us command delay time */ this->chip_delay = 30; - this->ecc.mode = NAND_ECC_SOFT; + this->eccmode = NAND_ECC_SOFT; this->options = NAND_NO_AUTOINCR; @@ -583,28 +448,29 @@ static int __init au1xxx_nand_init(void) this->options |= NAND_BUSWIDTH_16; this->read_byte = (!nand_width) ? au_read_byte16 : au_read_byte; - au1550_write_byte = (!nand_width) ? au_write_byte16 : au_write_byte; + this->write_byte = (!nand_width) ? au_write_byte16 : au_write_byte; + this->write_word = au_write_word; this->read_word = au_read_word; this->write_buf = (!nand_width) ? au_write_buf16 : au_write_buf; this->read_buf = (!nand_width) ? au_read_buf16 : au_read_buf; this->verify_buf = (!nand_width) ? au_verify_buf16 : au_verify_buf; /* Scan to find existence of the device */ - if (nand_scan(au1550_mtd, 1)) { + if (nand_scan (au1550_mtd, 1)) { retval = -ENXIO; goto outio; } /* Register the partitions */ - add_mtd_partitions(au1550_mtd, partition_info, ARRAY_SIZE(partition_info)); + add_mtd_partitions(au1550_mtd, partition_info, NB_OF(partition_info)); return 0; outio: - iounmap((void *)p_nand); + iounmap ((void *)p_nand); outmem: - kfree(au1550_mtd); + kfree (au1550_mtd); return retval; } @@ -613,21 +479,22 @@ module_init(au1xxx_nand_init); /* * Clean up routine */ -static void __exit au1550_cleanup(void) +#ifdef MODULE +static void __exit au1550_cleanup (void) { - struct nand_chip *this = (struct nand_chip *)&au1550_mtd[1]; + struct nand_chip *this = (struct nand_chip *) &au1550_mtd[1]; /* Release resources, unregister device */ - nand_release(au1550_mtd); + nand_release (au1550_mtd); /* Free the MTD device structure */ - kfree(au1550_mtd); + kfree (au1550_mtd); /* Unmap */ - iounmap((void *)p_nand); + iounmap ((void *)p_nand); } - module_exit(au1550_cleanup); +#endif MODULE_LICENSE("GPL"); MODULE_AUTHOR("Embedded Edge, LLC"); diff --git a/drivers/mtd/nand/autcpu12.c b/drivers/mtd/nand/autcpu12.c index fe94ae9ae..a3c7fea40 100644 --- a/drivers/mtd/nand/autcpu12.c +++ b/drivers/mtd/nand/autcpu12.c @@ -4,7 +4,7 @@ * Copyright (c) 2002 Thomas Gleixner * * Derived from drivers/mtd/spia.c - * Copyright (C) 2000 Steven J. Hill (sjhill@realitydiluted.com) + * Copyright (C) 2000 Steven J. Hill (sjhill@realitydiluted.com) * * $Id: autcpu12.c,v 1.23 2005/11/07 11:14:30 gleixner Exp $ * @@ -42,7 +42,12 @@ * MTD structure for AUTCPU12 board */ static struct mtd_info *autcpu12_mtd = NULL; -static void __iomem *autcpu12_fio_base; + +static int autcpu12_io_base = CS89712_VIRT_BASE; +static int autcpu12_fio_pbase = AUTCPU12_PHYS_SMC; +static int autcpu12_fio_ctrl = AUTCPU12_SMC_SELECT_OFFSET; +static int autcpu12_pedr = AUTCPU12_SMC_PORT_OFFSET; +static void __iomem * autcpu12_fio_base; /* * Define partitions for flash devices @@ -89,131 +94,108 @@ static struct mtd_partition partition_info128k[] = { #define NUM_PARTITIONS128K 2 /* * hardware specific access to control-lines - * - * ALE bit 4 autcpu12_pedr - * CLE bit 5 autcpu12_pedr - * NCE bit 0 fio_ctrl - * - */ -static void autcpu12_hwcontrol(struct mtd_info *mtd, int cmd, - unsigned int ctrl) +*/ +static void autcpu12_hwcontrol(struct mtd_info *mtd, int cmd) { - struct nand_chip *chip = mtd->priv; - if (ctrl & NAND_CTRL_CHANGE) { - void __iomem *addr - unsigned char bits; + switch(cmd){ - addr = CS89712_VIRT_BASE + AUTCPU12_SMC_PORT_OFFSET; - bits = (ctrl & NAND_CLE) << 4; - bits |= (ctrl & NAND_ALE) << 2; - writeb((readb(addr) & ~0x30) | bits, addr); + case NAND_CTL_SETCLE: (*(volatile unsigned char *) (autcpu12_io_base + autcpu12_pedr)) |= AUTCPU12_SMC_CLE; break; + case NAND_CTL_CLRCLE: (*(volatile unsigned char *) (autcpu12_io_base + autcpu12_pedr)) &= ~AUTCPU12_SMC_CLE; break; - addr = autcpu12_fio_base + AUTCPU12_SMC_SELECT_OFFSET; - writeb((readb(addr) & ~0x1) | (ctrl & NAND_NCE), addr); - } + case NAND_CTL_SETALE: (*(volatile unsigned char *) (autcpu12_io_base + autcpu12_pedr)) |= AUTCPU12_SMC_ALE; break; + case NAND_CTL_CLRALE: (*(volatile unsigned char *) (autcpu12_io_base + autcpu12_pedr)) &= ~AUTCPU12_SMC_ALE; break; - if (cmd != NAND_CMD_NONE) - writeb(cmd, chip->IO_ADDR_W); + case NAND_CTL_SETNCE: (*(volatile unsigned char *) (autcpu12_fio_base + autcpu12_fio_ctrl)) = 0x01; break; + case NAND_CTL_CLRNCE: (*(volatile unsigned char *) (autcpu12_fio_base + autcpu12_fio_ctrl)) = 0x00; break; + } } /* - * read device ready pin - */ +* read device ready pin +*/ int autcpu12_device_ready(struct mtd_info *mtd) { - void __iomem *addr = CS89712_VIRT_BASE + AUTCPU12_SMC_PORT_OFFSET; - return readb(addr) & AUTCPU12_SMC_RDY; + return ( (*(volatile unsigned char *) (autcpu12_io_base + autcpu12_pedr)) & AUTCPU12_SMC_RDY) ? 1 : 0; + } /* * Main initialization routine */ -static int __init autcpu12_init(void) +int __init autcpu12_init (void) { struct nand_chip *this; int err = 0; /* Allocate memory for MTD device structure and private data */ - autcpu12_mtd = kmalloc(sizeof(struct mtd_info) + sizeof(struct nand_chip), - GFP_KERNEL); + autcpu12_mtd = kmalloc (sizeof(struct mtd_info) + sizeof (struct nand_chip), + GFP_KERNEL); if (!autcpu12_mtd) { - printk("Unable to allocate AUTCPU12 NAND MTD device structure.\n"); + printk ("Unable to allocate AUTCPU12 NAND MTD device structure.\n"); err = -ENOMEM; goto out; } /* map physical adress */ - autcpu12_fio_base = ioremap(AUTCPU12_PHYS_SMC, SZ_1K); - if (!autcpu12_fio_base) { + autcpu12_fio_base = ioremap(autcpu12_fio_pbase,SZ_1K); + if(!autcpu12_fio_base){ printk("Ioremap autcpu12 SmartMedia Card failed\n"); err = -EIO; goto out_mtd; } /* Get pointer to private data */ - this = (struct nand_chip *)(&autcpu12_mtd[1]); + this = (struct nand_chip *) (&autcpu12_mtd[1]); /* Initialize structures */ - memset(autcpu12_mtd, 0, sizeof(struct mtd_info)); - memset(this, 0, sizeof(struct nand_chip)); + memset((char *) autcpu12_mtd, 0, sizeof(struct mtd_info)); + memset((char *) this, 0, sizeof(struct nand_chip)); /* Link the private data with the MTD structure */ autcpu12_mtd->priv = this; - autcpu12_mtd->owner = THIS_MODULE; /* Set address of NAND IO lines */ this->IO_ADDR_R = autcpu12_fio_base; this->IO_ADDR_W = autcpu12_fio_base; - this->cmd_ctrl = autcpu12_hwcontrol; + this->hwcontrol = autcpu12_hwcontrol; this->dev_ready = autcpu12_device_ready; /* 20 us command delay time */ this->chip_delay = 20; - this->ecc.mode = NAND_ECC_SOFT; + this->eccmode = NAND_ECC_SOFT; /* Enable the following for a flash based bad block table */ /* - this->options = NAND_USE_FLASH_BBT; - */ + this->options = NAND_USE_FLASH_BBT; + */ this->options = NAND_USE_FLASH_BBT; /* Scan to find existance of the device */ - if (nand_scan(autcpu12_mtd, 1)) { + if (nand_scan (autcpu12_mtd, 1)) { err = -ENXIO; goto out_ior; } /* Register the partitions */ - switch (autcpu12_mtd->size) { - case SZ_16M: - add_mtd_partitions(autcpu12_mtd, partition_info16k, - NUM_PARTITIONS16K); - break; - case SZ_32M: - add_mtd_partitions(autcpu12_mtd, partition_info32k, - NUM_PARTITIONS32K); - break; - case SZ_64M: - add_mtd_partitions(autcpu12_mtd, partition_info64k, - NUM_PARTITIONS64K); - break; - case SZ_128M: - add_mtd_partitions(autcpu12_mtd, partition_info128k, - NUM_PARTITIONS128K); - break; - default: - printk("Unsupported SmartMedia device\n"); + switch(autcpu12_mtd->size){ + case SZ_16M: add_mtd_partitions(autcpu12_mtd, partition_info16k, NUM_PARTITIONS16K); break; + case SZ_32M: add_mtd_partitions(autcpu12_mtd, partition_info32k, NUM_PARTITIONS32K); break; + case SZ_64M: add_mtd_partitions(autcpu12_mtd, partition_info64k, NUM_PARTITIONS64K); break; + case SZ_128M: add_mtd_partitions(autcpu12_mtd, partition_info128k, NUM_PARTITIONS128K); break; + default: { + printk ("Unsupported SmartMedia device\n"); err = -ENXIO; goto out_ior; + } } goto out; - out_ior: - iounmap(autcpu12_fio_base); - out_mtd: - kfree(autcpu12_mtd); - out: +out_ior: + iounmap((void *)autcpu12_fio_base); +out_mtd: + kfree (autcpu12_mtd); +out: return err; } @@ -222,19 +204,20 @@ module_init(autcpu12_init); /* * Clean up routine */ -static void __exit autcpu12_cleanup(void) +#ifdef MODULE +static void __exit autcpu12_cleanup (void) { /* Release resources, unregister device */ - nand_release(autcpu12_mtd); + nand_release (autcpu12_mtd); /* unmap physical adress */ - iounmap(autcpu12_fio_base); + iounmap((void *)autcpu12_fio_base); /* Free the MTD device structure */ - kfree(autcpu12_mtd); + kfree (autcpu12_mtd); } - module_exit(autcpu12_cleanup); +#endif MODULE_LICENSE("GPL"); MODULE_AUTHOR("Thomas Gleixner "); diff --git a/drivers/mtd/nand/diskonchip.c b/drivers/mtd/nand/diskonchip.c index 6107f5328..ec5e45e4e 100644 --- a/drivers/mtd/nand/diskonchip.c +++ b/drivers/mtd/nand/diskonchip.c @@ -58,10 +58,10 @@ static unsigned long __initdata doc_locations[] = { 0xe4000000, #elif defined(CONFIG_MOMENCO_OCELOT) 0x2f000000, - 0xff000000, + 0xff000000, #elif defined(CONFIG_MOMENCO_OCELOT_G) || defined (CONFIG_MOMENCO_OCELOT_C) - 0xff000000, -#else + 0xff000000, +##else #warning Unknown architecture for DiskOnChip. No default probe locations defined #endif 0xffffffff }; @@ -73,7 +73,7 @@ struct doc_priv { unsigned long physadr; u_char ChipID; u_char CDSNControl; - int chips_per_floor; /* The number of chips detected on each floor */ + int chips_per_floor; /* The number of chips detected on each floor */ int curfloor; int curchip; int mh0_page; @@ -84,7 +84,6 @@ struct doc_priv { /* This is the syndrome computed by the HW ecc generator upon reading an empty page, one with all 0xff for data and stored ecc code. */ static u_char empty_read_syndrome[6] = { 0x26, 0xff, 0x6d, 0x47, 0x73, 0x7a }; - /* This is the ecc value computed by the HW ecc generator upon writing an empty page, one with all 0xff for data. */ static u_char empty_write_ecc[6] = { 0x4b, 0x00, 0xe2, 0x0e, 0x93, 0xf7 }; @@ -95,29 +94,28 @@ static u_char empty_write_ecc[6] = { 0x4b, 0x00, 0xe2, 0x0e, 0x93, 0xf7 }; #define DoC_is_Millennium(doc) ((doc)->ChipID == DOC_ChipID_DocMil) #define DoC_is_2000(doc) ((doc)->ChipID == DOC_ChipID_Doc2k) -static void doc200x_hwcontrol(struct mtd_info *mtd, int cmd, - unsigned int bitmask); +static void doc200x_hwcontrol(struct mtd_info *mtd, int cmd); static void doc200x_select_chip(struct mtd_info *mtd, int chip); -static int debug = 0; +static int debug=0; module_param(debug, int, 0); -static int try_dword = 1; +static int try_dword=1; module_param(try_dword, int, 0); -static int no_ecc_failures = 0; +static int no_ecc_failures=0; module_param(no_ecc_failures, int, 0); -static int no_autopart = 0; +static int no_autopart=0; module_param(no_autopart, int, 0); -static int show_firmware_partition = 0; +static int show_firmware_partition=0; module_param(show_firmware_partition, int, 0); #ifdef MTD_NAND_DISKONCHIP_BBTWRITE -static int inftl_bbt_write = 1; +static int inftl_bbt_write=1; #else -static int inftl_bbt_write = 0; +static int inftl_bbt_write=0; #endif module_param(inftl_bbt_write, int, 0); @@ -125,6 +123,7 @@ static unsigned long doc_config_location = CONFIG_MTD_NAND_DISKONCHIP_PROBE_ADDR module_param(doc_config_location, ulong, 0); MODULE_PARM_DESC(doc_config_location, "Physical memory address at which to probe for DiskOnChip"); + /* Sector size for HW ECC */ #define SECTOR_SIZE 512 /* The sector bytes are packed into NB_DATA 10 bit words */ @@ -148,7 +147,7 @@ static struct rs_control *rs_decoder; * some comments, improved a minor bit and converted it to make use * of the generic Reed-Solomon libary. tglx */ -static int doc_ecc_decode(struct rs_control *rs, uint8_t *data, uint8_t *ecc) +static int doc_ecc_decode (struct rs_control *rs, uint8_t *data, uint8_t *ecc) { int i, j, nerr, errpos[8]; uint8_t parity; @@ -169,18 +168,18 @@ static int doc_ecc_decode(struct rs_control *rs, uint8_t *data, uint8_t *ecc) * s[i] = ds[3]x^3 + ds[2]x^2 + ds[1]x^1 + ds[0] * where x = alpha^(FCR + i) */ - for (j = 1; j < NROOTS; j++) { - if (ds[j] == 0) + for(j = 1; j < NROOTS; j++) { + if(ds[j] == 0) continue; tmp = rs->index_of[ds[j]]; - for (i = 0; i < NROOTS; i++) + for(i = 0; i < NROOTS; i++) s[i] ^= rs->alpha_to[rs_modnn(rs, tmp + (FCR + i) * j)]; } /* Calc s[i] = s[i] / alpha^(v + i) */ for (i = 0; i < NROOTS; i++) { if (syn[i]) - syn[i] = rs_modnn(rs, rs->index_of[s[i]] + (NN - FCR - i)); + syn[i] = rs_modnn(rs, rs->index_of[s[i]] + (NN - FCR - i)); } /* Call the decoder library */ nerr = decode_rs16(rs, NULL, NULL, 1019, syn, 0, errpos, 0, errval); @@ -194,7 +193,7 @@ static int doc_ecc_decode(struct rs_control *rs, uint8_t *data, uint8_t *ecc) * but they are given by the design of the de/encoder circuit * in the DoC ASIC's. */ - for (i = 0; i < nerr; i++) { + for(i = 0;i < nerr; i++) { int index, bitpos, pos = 1015 - errpos[i]; uint8_t val; if (pos >= NB_DATA && pos < 1019) @@ -206,7 +205,8 @@ static int doc_ecc_decode(struct rs_control *rs, uint8_t *data, uint8_t *ecc) can be modified since pos is even */ index = (pos >> 3) ^ 1; bitpos = pos & 7; - if ((index >= 0 && index < SECTOR_SIZE) || index == (SECTOR_SIZE + 1)) { + if ((index >= 0 && index < SECTOR_SIZE) || + index == (SECTOR_SIZE + 1)) { val = (uint8_t) (errval[i] >> (2 + bitpos)); parity ^= val; if (index < SECTOR_SIZE) @@ -216,8 +216,9 @@ static int doc_ecc_decode(struct rs_control *rs, uint8_t *data, uint8_t *ecc) bitpos = (bitpos + 10) & 7; if (bitpos == 0) bitpos = 8; - if ((index >= 0 && index < SECTOR_SIZE) || index == (SECTOR_SIZE + 1)) { - val = (uint8_t) (errval[i] << (8 - bitpos)); + if ((index >= 0 && index < SECTOR_SIZE) || + index == (SECTOR_SIZE + 1)) { + val = (uint8_t)(errval[i] << (8 - bitpos)); parity ^= val; if (index < SECTOR_SIZE) data[index] ^= val; @@ -249,11 +250,10 @@ static void DoC_Delay(struct doc_priv *doc, unsigned short cycles) /* DOC_WaitReady: Wait for RDY line to be asserted by the flash chip */ static int _DoC_WaitReady(struct doc_priv *doc) { - void __iomem *docptr = doc->virtadr; + void __iomem *docptr = doc->virtadr; unsigned long timeo = jiffies + (HZ * 10); - if (debug) - printk("_DoC_WaitReady...\n"); + if(debug) printk("_DoC_WaitReady...\n"); /* Out-of-line routine to wait for chip response */ if (DoC_is_MillenniumPlus(doc)) { while ((ReadDOC(docptr, Mplus_FlashControl) & CDSN_CTRL_FR_B_MASK) != CDSN_CTRL_FR_B_MASK) { @@ -280,7 +280,7 @@ static int _DoC_WaitReady(struct doc_priv *doc) static inline int DoC_WaitReady(struct doc_priv *doc) { - void __iomem *docptr = doc->virtadr; + void __iomem *docptr = doc->virtadr; int ret = 0; if (DoC_is_MillenniumPlus(doc)) { @@ -298,8 +298,7 @@ static inline int DoC_WaitReady(struct doc_priv *doc) DoC_Delay(doc, 2); } - if (debug) - printk("DoC_WaitReady OK\n"); + if(debug) printk("DoC_WaitReady OK\n"); return ret; } @@ -307,10 +306,9 @@ static void doc2000_write_byte(struct mtd_info *mtd, u_char datum) { struct nand_chip *this = mtd->priv; struct doc_priv *doc = this->priv; - void __iomem *docptr = doc->virtadr; + void __iomem *docptr = doc->virtadr; - if (debug) - printk("write_byte %02x\n", datum); + if(debug)printk("write_byte %02x\n", datum); WriteDOC(datum, docptr, CDSNSlowIO); WriteDOC(datum, docptr, 2k_CDSN_IO); } @@ -319,78 +317,77 @@ static u_char doc2000_read_byte(struct mtd_info *mtd) { struct nand_chip *this = mtd->priv; struct doc_priv *doc = this->priv; - void __iomem *docptr = doc->virtadr; + void __iomem *docptr = doc->virtadr; u_char ret; ReadDOC(docptr, CDSNSlowIO); DoC_Delay(doc, 2); ret = ReadDOC(docptr, 2k_CDSN_IO); - if (debug) - printk("read_byte returns %02x\n", ret); + if (debug) printk("read_byte returns %02x\n", ret); return ret; } -static void doc2000_writebuf(struct mtd_info *mtd, const u_char *buf, int len) +static void doc2000_writebuf(struct mtd_info *mtd, + const u_char *buf, int len) { struct nand_chip *this = mtd->priv; struct doc_priv *doc = this->priv; - void __iomem *docptr = doc->virtadr; + void __iomem *docptr = doc->virtadr; int i; - if (debug) - printk("writebuf of %d bytes: ", len); - for (i = 0; i < len; i++) { + if (debug)printk("writebuf of %d bytes: ", len); + for (i=0; i < len; i++) { WriteDOC_(buf[i], docptr, DoC_2k_CDSN_IO + i); if (debug && i < 16) printk("%02x ", buf[i]); } - if (debug) - printk("\n"); + if (debug) printk("\n"); } -static void doc2000_readbuf(struct mtd_info *mtd, u_char *buf, int len) +static void doc2000_readbuf(struct mtd_info *mtd, + u_char *buf, int len) { struct nand_chip *this = mtd->priv; struct doc_priv *doc = this->priv; - void __iomem *docptr = doc->virtadr; - int i; + void __iomem *docptr = doc->virtadr; + int i; - if (debug) - printk("readbuf of %d bytes: ", len); + if (debug)printk("readbuf of %d bytes: ", len); - for (i = 0; i < len; i++) { + for (i=0; i < len; i++) { buf[i] = ReadDOC(docptr, 2k_CDSN_IO + i); } } -static void doc2000_readbuf_dword(struct mtd_info *mtd, u_char *buf, int len) +static void doc2000_readbuf_dword(struct mtd_info *mtd, + u_char *buf, int len) { struct nand_chip *this = mtd->priv; struct doc_priv *doc = this->priv; - void __iomem *docptr = doc->virtadr; - int i; + void __iomem *docptr = doc->virtadr; + int i; - if (debug) - printk("readbuf_dword of %d bytes: ", len); + if (debug) printk("readbuf_dword of %d bytes: ", len); - if (unlikely((((unsigned long)buf) | len) & 3)) { - for (i = 0; i < len; i++) { - *(uint8_t *) (&buf[i]) = ReadDOC(docptr, 2k_CDSN_IO + i); + if (unlikely((((unsigned long)buf)|len) & 3)) { + for (i=0; i < len; i++) { + *(uint8_t *)(&buf[i]) = ReadDOC(docptr, 2k_CDSN_IO + i); } } else { - for (i = 0; i < len; i += 4) { - *(uint32_t *) (&buf[i]) = readl(docptr + DoC_2k_CDSN_IO + i); + for (i=0; i < len; i+=4) { + *(uint32_t*)(&buf[i]) = readl(docptr + DoC_2k_CDSN_IO + i); } } } -static int doc2000_verifybuf(struct mtd_info *mtd, const u_char *buf, int len) +static int doc2000_verifybuf(struct mtd_info *mtd, + const u_char *buf, int len) { struct nand_chip *this = mtd->priv; struct doc_priv *doc = this->priv; - void __iomem *docptr = doc->virtadr; + void __iomem *docptr = doc->virtadr; int i; - for (i = 0; i < len; i++) + for (i=0; i < len; i++) if (buf[i] != ReadDOC(docptr, 2k_CDSN_IO)) return -EFAULT; return 0; @@ -403,10 +400,12 @@ static uint16_t __init doc200x_ident_chip(struct mtd_info *mtd, int nr) uint16_t ret; doc200x_select_chip(mtd, nr); - doc200x_hwcontrol(mtd, NAND_CMD_READID, - NAND_CTRL_CLE | NAND_CTRL_CHANGE); - doc200x_hwcontrol(mtd, 0, NAND_CTRL_ALE | NAND_CTRL_CHANGE); - doc200x_hwcontrol(mtd, NAND_CMD_NONE, NAND_NCE | NAND_CTRL_CHANGE); + doc200x_hwcontrol(mtd, NAND_CTL_SETCLE); + this->write_byte(mtd, NAND_CMD_READID); + doc200x_hwcontrol(mtd, NAND_CTL_CLRCLE); + doc200x_hwcontrol(mtd, NAND_CTL_SETALE); + this->write_byte(mtd, 0); + doc200x_hwcontrol(mtd, NAND_CTL_CLRALE); /* We cant' use dev_ready here, but at least we wait for the * command to complete @@ -424,11 +423,12 @@ static uint16_t __init doc200x_ident_chip(struct mtd_info *mtd, int nr) } ident; void __iomem *docptr = doc->virtadr; - doc200x_hwcontrol(mtd, NAND_CMD_READID, - NAND_CTRL_CLE | NAND_CTRL_CHANGE); - doc200x_hwcontrol(mtd, 0, NAND_CTRL_ALE | NAND_CTRL_CHANGE); - doc200x_hwcontrol(mtd, NAND_CMD_NONE, - NAND_NCE | NAND_CTRL_CHANGE); + doc200x_hwcontrol(mtd, NAND_CTL_SETCLE); + doc2000_write_byte(mtd, NAND_CMD_READID); + doc200x_hwcontrol(mtd, NAND_CTL_CLRCLE); + doc200x_hwcontrol(mtd, NAND_CTL_SETALE); + doc2000_write_byte(mtd, 0); + doc200x_hwcontrol(mtd, NAND_CTL_CLRALE); udelay(50); @@ -464,7 +464,7 @@ static void __init doc2000_count_chips(struct mtd_info *mtd) printk(KERN_DEBUG "Detected %d chips per floor.\n", i); } -static int doc200x_wait(struct mtd_info *mtd, struct nand_chip *this) +static int doc200x_wait(struct mtd_info *mtd, struct nand_chip *this, int state) { struct doc_priv *doc = this->priv; @@ -482,7 +482,7 @@ static void doc2001_write_byte(struct mtd_info *mtd, u_char datum) { struct nand_chip *this = mtd->priv; struct doc_priv *doc = this->priv; - void __iomem *docptr = doc->virtadr; + void __iomem *docptr = doc->virtadr; WriteDOC(datum, docptr, CDSNSlowIO); WriteDOC(datum, docptr, Mil_CDSN_IO); @@ -493,7 +493,7 @@ static u_char doc2001_read_byte(struct mtd_info *mtd) { struct nand_chip *this = mtd->priv; struct doc_priv *doc = this->priv; - void __iomem *docptr = doc->virtadr; + void __iomem *docptr = doc->virtadr; //ReadDOC(docptr, CDSNSlowIO); /* 11.4.5 -- delay twice to allow extended length cycle */ @@ -503,47 +503,50 @@ static u_char doc2001_read_byte(struct mtd_info *mtd) return ReadDOC(docptr, LastDataRead); } -static void doc2001_writebuf(struct mtd_info *mtd, const u_char *buf, int len) +static void doc2001_writebuf(struct mtd_info *mtd, + const u_char *buf, int len) { struct nand_chip *this = mtd->priv; struct doc_priv *doc = this->priv; - void __iomem *docptr = doc->virtadr; + void __iomem *docptr = doc->virtadr; int i; - for (i = 0; i < len; i++) + for (i=0; i < len; i++) WriteDOC_(buf[i], docptr, DoC_Mil_CDSN_IO + i); /* Terminate write pipeline */ WriteDOC(0x00, docptr, WritePipeTerm); } -static void doc2001_readbuf(struct mtd_info *mtd, u_char *buf, int len) +static void doc2001_readbuf(struct mtd_info *mtd, + u_char *buf, int len) { struct nand_chip *this = mtd->priv; struct doc_priv *doc = this->priv; - void __iomem *docptr = doc->virtadr; + void __iomem *docptr = doc->virtadr; int i; /* Start read pipeline */ ReadDOC(docptr, ReadPipeInit); - for (i = 0; i < len - 1; i++) + for (i=0; i < len-1; i++) buf[i] = ReadDOC(docptr, Mil_CDSN_IO + (i & 0xff)); /* Terminate read pipeline */ buf[i] = ReadDOC(docptr, LastDataRead); } -static int doc2001_verifybuf(struct mtd_info *mtd, const u_char *buf, int len) +static int doc2001_verifybuf(struct mtd_info *mtd, + const u_char *buf, int len) { struct nand_chip *this = mtd->priv; struct doc_priv *doc = this->priv; - void __iomem *docptr = doc->virtadr; + void __iomem *docptr = doc->virtadr; int i; /* Start read pipeline */ ReadDOC(docptr, ReadPipeInit); - for (i = 0; i < len - 1; i++) + for (i=0; i < len-1; i++) if (buf[i] != ReadDOC(docptr, Mil_CDSN_IO)) { ReadDOC(docptr, LastDataRead); return i; @@ -557,90 +560,87 @@ static u_char doc2001plus_read_byte(struct mtd_info *mtd) { struct nand_chip *this = mtd->priv; struct doc_priv *doc = this->priv; - void __iomem *docptr = doc->virtadr; + void __iomem *docptr = doc->virtadr; u_char ret; - ReadDOC(docptr, Mplus_ReadPipeInit); - ReadDOC(docptr, Mplus_ReadPipeInit); - ret = ReadDOC(docptr, Mplus_LastDataRead); - if (debug) - printk("read_byte returns %02x\n", ret); + ReadDOC(docptr, Mplus_ReadPipeInit); + ReadDOC(docptr, Mplus_ReadPipeInit); + ret = ReadDOC(docptr, Mplus_LastDataRead); + if (debug) printk("read_byte returns %02x\n", ret); return ret; } -static void doc2001plus_writebuf(struct mtd_info *mtd, const u_char *buf, int len) +static void doc2001plus_writebuf(struct mtd_info *mtd, + const u_char *buf, int len) { struct nand_chip *this = mtd->priv; struct doc_priv *doc = this->priv; - void __iomem *docptr = doc->virtadr; + void __iomem *docptr = doc->virtadr; int i; - if (debug) - printk("writebuf of %d bytes: ", len); - for (i = 0; i < len; i++) { + if (debug)printk("writebuf of %d bytes: ", len); + for (i=0; i < len; i++) { WriteDOC_(buf[i], docptr, DoC_Mil_CDSN_IO + i); if (debug && i < 16) printk("%02x ", buf[i]); } - if (debug) - printk("\n"); + if (debug) printk("\n"); } -static void doc2001plus_readbuf(struct mtd_info *mtd, u_char *buf, int len) +static void doc2001plus_readbuf(struct mtd_info *mtd, + u_char *buf, int len) { struct nand_chip *this = mtd->priv; struct doc_priv *doc = this->priv; - void __iomem *docptr = doc->virtadr; + void __iomem *docptr = doc->virtadr; int i; - if (debug) - printk("readbuf of %d bytes: ", len); + if (debug)printk("readbuf of %d bytes: ", len); /* Start read pipeline */ ReadDOC(docptr, Mplus_ReadPipeInit); ReadDOC(docptr, Mplus_ReadPipeInit); - for (i = 0; i < len - 2; i++) { + for (i=0; i < len-2; i++) { buf[i] = ReadDOC(docptr, Mil_CDSN_IO); if (debug && i < 16) printk("%02x ", buf[i]); } /* Terminate read pipeline */ - buf[len - 2] = ReadDOC(docptr, Mplus_LastDataRead); + buf[len-2] = ReadDOC(docptr, Mplus_LastDataRead); if (debug && i < 16) - printk("%02x ", buf[len - 2]); - buf[len - 1] = ReadDOC(docptr, Mplus_LastDataRead); + printk("%02x ", buf[len-2]); + buf[len-1] = ReadDOC(docptr, Mplus_LastDataRead); if (debug && i < 16) - printk("%02x ", buf[len - 1]); - if (debug) - printk("\n"); + printk("%02x ", buf[len-1]); + if (debug) printk("\n"); } -static int doc2001plus_verifybuf(struct mtd_info *mtd, const u_char *buf, int len) +static int doc2001plus_verifybuf(struct mtd_info *mtd, + const u_char *buf, int len) { struct nand_chip *this = mtd->priv; struct doc_priv *doc = this->priv; - void __iomem *docptr = doc->virtadr; + void __iomem *docptr = doc->virtadr; int i; - if (debug) - printk("verifybuf of %d bytes: ", len); + if (debug)printk("verifybuf of %d bytes: ", len); /* Start read pipeline */ ReadDOC(docptr, Mplus_ReadPipeInit); ReadDOC(docptr, Mplus_ReadPipeInit); - for (i = 0; i < len - 2; i++) + for (i=0; i < len-2; i++) if (buf[i] != ReadDOC(docptr, Mil_CDSN_IO)) { ReadDOC(docptr, Mplus_LastDataRead); ReadDOC(docptr, Mplus_LastDataRead); return i; } - if (buf[len - 2] != ReadDOC(docptr, Mplus_LastDataRead)) - return len - 2; - if (buf[len - 1] != ReadDOC(docptr, Mplus_LastDataRead)) - return len - 1; + if (buf[len-2] != ReadDOC(docptr, Mplus_LastDataRead)) + return len-2; + if (buf[len-1] != ReadDOC(docptr, Mplus_LastDataRead)) + return len-1; return 0; } @@ -648,11 +648,10 @@ static void doc2001plus_select_chip(struct mtd_info *mtd, int chip) { struct nand_chip *this = mtd->priv; struct doc_priv *doc = this->priv; - void __iomem *docptr = doc->virtadr; + void __iomem *docptr = doc->virtadr; int floor = 0; - if (debug) - printk("select chip (%d)\n", chip); + if(debug)printk("select chip (%d)\n", chip); if (chip == -1) { /* Disable flash internally */ @@ -661,7 +660,7 @@ static void doc2001plus_select_chip(struct mtd_info *mtd, int chip) } floor = chip / doc->chips_per_floor; - chip -= (floor * doc->chips_per_floor); + chip -= (floor * doc->chips_per_floor); /* Assert ChipEnable and deassert WriteProtect */ WriteDOC((DOC_FLASH_CE), docptr, Mplus_FlashSelect); @@ -675,61 +674,72 @@ static void doc200x_select_chip(struct mtd_info *mtd, int chip) { struct nand_chip *this = mtd->priv; struct doc_priv *doc = this->priv; - void __iomem *docptr = doc->virtadr; + void __iomem *docptr = doc->virtadr; int floor = 0; - if (debug) - printk("select chip (%d)\n", chip); + if(debug)printk("select chip (%d)\n", chip); if (chip == -1) return; floor = chip / doc->chips_per_floor; - chip -= (floor * doc->chips_per_floor); + chip -= (floor * doc->chips_per_floor); /* 11.4.4 -- deassert CE before changing chip */ - doc200x_hwcontrol(mtd, NAND_CMD_NONE, 0 | NAND_CTRL_CHANGE); + doc200x_hwcontrol(mtd, NAND_CTL_CLRNCE); WriteDOC(floor, docptr, FloorSelect); WriteDOC(chip, docptr, CDSNDeviceSelect); - doc200x_hwcontrol(mtd, NAND_CMD_NONE, NAND_NCE | NAND_CTRL_CHANGE); + doc200x_hwcontrol(mtd, NAND_CTL_SETNCE); doc->curchip = chip; doc->curfloor = floor; } -#define CDSN_CTRL_MSK (CDSN_CTRL_CE | CDSN_CTRL_CLE | CDSN_CTRL_ALE) - -static void doc200x_hwcontrol(struct mtd_info *mtd, int cmd, - unsigned int ctrl) +static void doc200x_hwcontrol(struct mtd_info *mtd, int cmd) { struct nand_chip *this = mtd->priv; struct doc_priv *doc = this->priv; - void __iomem *docptr = doc->virtadr; + void __iomem *docptr = doc->virtadr; - if (ctrl & NAND_CTRL_CHANGE) { - doc->CDSNControl &= ~CDSN_CTRL_MSK; - doc->CDSNControl |= ctrl & CDSN_CTRL_MSK; - if (debug) - printk("hwcontrol(%d): %02x\n", cmd, doc->CDSNControl); - WriteDOC(doc->CDSNControl, docptr, CDSNControl); - /* 11.4.3 -- 4 NOPs after CSDNControl write */ - DoC_Delay(doc, 4); - } - if (cmd != NAND_CMD_NONE) { - if (DoC_is_2000(doc)) - doc2000_write_byte(mtd, cmd); - else - doc2001_write_byte(mtd, cmd); + switch(cmd) { + case NAND_CTL_SETNCE: + doc->CDSNControl |= CDSN_CTRL_CE; + break; + case NAND_CTL_CLRNCE: + doc->CDSNControl &= ~CDSN_CTRL_CE; + break; + case NAND_CTL_SETCLE: + doc->CDSNControl |= CDSN_CTRL_CLE; + break; + case NAND_CTL_CLRCLE: + doc->CDSNControl &= ~CDSN_CTRL_CLE; + break; + case NAND_CTL_SETALE: + doc->CDSNControl |= CDSN_CTRL_ALE; + break; + case NAND_CTL_CLRALE: + doc->CDSNControl &= ~CDSN_CTRL_ALE; + break; + case NAND_CTL_SETWP: + doc->CDSNControl |= CDSN_CTRL_WP; + break; + case NAND_CTL_CLRWP: + doc->CDSNControl &= ~CDSN_CTRL_WP; + break; } + if (debug)printk("hwcontrol(%d): %02x\n", cmd, doc->CDSNControl); + WriteDOC(doc->CDSNControl, docptr, CDSNControl); + /* 11.4.3 -- 4 NOPs after CSDNControl write */ + DoC_Delay(doc, 4); } -static void doc2001plus_command(struct mtd_info *mtd, unsigned command, int column, int page_addr) +static void doc2001plus_command (struct mtd_info *mtd, unsigned command, int column, int page_addr) { struct nand_chip *this = mtd->priv; struct doc_priv *doc = this->priv; - void __iomem *docptr = doc->virtadr; + void __iomem *docptr = doc->virtadr; /* * Must terminate write pipeline before sending any commands @@ -746,9 +756,9 @@ static void doc2001plus_command(struct mtd_info *mtd, unsigned command, int colu if (command == NAND_CMD_SEQIN) { int readcmd; - if (column >= mtd->writesize) { + if (column >= mtd->oobblock) { /* OOB area */ - column -= mtd->writesize; + column -= mtd->oobblock; readcmd = NAND_CMD_READOOB; } else if (column < 256) { /* First 256 bytes --> READ0 */ @@ -772,26 +782,25 @@ static void doc2001plus_command(struct mtd_info *mtd, unsigned command, int colu WriteDOC(column, docptr, Mplus_FlashAddress); } if (page_addr != -1) { - WriteDOC((unsigned char)(page_addr & 0xff), docptr, Mplus_FlashAddress); - WriteDOC((unsigned char)((page_addr >> 8) & 0xff), docptr, Mplus_FlashAddress); + WriteDOC((unsigned char) (page_addr & 0xff), docptr, Mplus_FlashAddress); + WriteDOC((unsigned char) ((page_addr >> 8) & 0xff), docptr, Mplus_FlashAddress); /* One more address cycle for higher density devices */ if (this->chipsize & 0x0c000000) { - WriteDOC((unsigned char)((page_addr >> 16) & 0x0f), docptr, Mplus_FlashAddress); + WriteDOC((unsigned char) ((page_addr >> 16) & 0x0f), docptr, Mplus_FlashAddress); printk("high density\n"); } } WriteDOC(0, docptr, Mplus_WritePipeTerm); WriteDOC(0, docptr, Mplus_WritePipeTerm); /* deassert ALE */ - if (command == NAND_CMD_READ0 || command == NAND_CMD_READ1 || - command == NAND_CMD_READOOB || command == NAND_CMD_READID) + if (command == NAND_CMD_READ0 || command == NAND_CMD_READ1 || command == NAND_CMD_READOOB || command == NAND_CMD_READID) WriteDOC(0, docptr, Mplus_FlashControl); } /* * program and erase have their own busy handlers * status and sequential in needs no delay - */ + */ switch (command) { case NAND_CMD_PAGEPROG: @@ -808,57 +817,55 @@ static void doc2001plus_command(struct mtd_info *mtd, unsigned command, int colu WriteDOC(NAND_CMD_STATUS, docptr, Mplus_FlashCmd); WriteDOC(0, docptr, Mplus_WritePipeTerm); WriteDOC(0, docptr, Mplus_WritePipeTerm); - while (!(this->read_byte(mtd) & 0x40)) ; + while ( !(this->read_byte(mtd) & 0x40)); return; - /* This applies to read commands */ + /* This applies to read commands */ default: /* * If we don't have access to the busy pin, we apply the given * command delay - */ + */ if (!this->dev_ready) { - udelay(this->chip_delay); + udelay (this->chip_delay); return; } } /* Apply this short delay always to ensure that we do wait tWB in * any case on any machine. */ - ndelay(100); + ndelay (100); /* wait until command is processed */ - while (!this->dev_ready(mtd)) ; + while (!this->dev_ready(mtd)); } static int doc200x_dev_ready(struct mtd_info *mtd) { struct nand_chip *this = mtd->priv; struct doc_priv *doc = this->priv; - void __iomem *docptr = doc->virtadr; + void __iomem *docptr = doc->virtadr; if (DoC_is_MillenniumPlus(doc)) { /* 11.4.2 -- must NOP four times before checking FR/B# */ DoC_Delay(doc, 4); if ((ReadDOC(docptr, Mplus_FlashControl) & CDSN_CTRL_FR_B_MASK) != CDSN_CTRL_FR_B_MASK) { - if (debug) + if(debug) printk("not ready\n"); return 0; } - if (debug) - printk("was ready\n"); + if (debug)printk("was ready\n"); return 1; } else { /* 11.4.2 -- must NOP four times before checking FR/B# */ DoC_Delay(doc, 4); if (!(ReadDOC(docptr, CDSNControl) & CDSN_CTRL_FR_B)) { - if (debug) + if(debug) printk("not ready\n"); return 0; } /* 11.4.2 -- Must NOP twice if it's ready */ DoC_Delay(doc, 2); - if (debug) - printk("was ready\n"); + if (debug)printk("was ready\n"); return 1; } } @@ -874,10 +881,10 @@ static void doc200x_enable_hwecc(struct mtd_info *mtd, int mode) { struct nand_chip *this = mtd->priv; struct doc_priv *doc = this->priv; - void __iomem *docptr = doc->virtadr; + void __iomem *docptr = doc->virtadr; /* Prime the ECC engine */ - switch (mode) { + switch(mode) { case NAND_ECC_READ: WriteDOC(DOC_ECC_RESET, docptr, ECCConf); WriteDOC(DOC_ECC_EN, docptr, ECCConf); @@ -893,10 +900,10 @@ static void doc2001plus_enable_hwecc(struct mtd_info *mtd, int mode) { struct nand_chip *this = mtd->priv; struct doc_priv *doc = this->priv; - void __iomem *docptr = doc->virtadr; + void __iomem *docptr = doc->virtadr; /* Prime the ECC engine */ - switch (mode) { + switch(mode) { case NAND_ECC_READ: WriteDOC(DOC_ECC_RESET, docptr, Mplus_ECCConf); WriteDOC(DOC_ECC_EN, docptr, Mplus_ECCConf); @@ -909,11 +916,12 @@ static void doc2001plus_enable_hwecc(struct mtd_info *mtd, int mode) } /* This code is only called on write */ -static int doc200x_calculate_ecc(struct mtd_info *mtd, const u_char *dat, unsigned char *ecc_code) +static int doc200x_calculate_ecc(struct mtd_info *mtd, const u_char *dat, + unsigned char *ecc_code) { struct nand_chip *this = mtd->priv; struct doc_priv *doc = this->priv; - void __iomem *docptr = doc->virtadr; + void __iomem *docptr = doc->virtadr; int i; int emptymatch = 1; @@ -953,8 +961,7 @@ static int doc200x_calculate_ecc(struct mtd_info *mtd, const u_char *dat, unsign often. It could be optimized away by examining the data in the writebuf routine, and remembering the result. */ for (i = 0; i < 512; i++) { - if (dat[i] == 0xff) - continue; + if (dat[i] == 0xff) continue; emptymatch = 0; break; } @@ -962,20 +969,17 @@ static int doc200x_calculate_ecc(struct mtd_info *mtd, const u_char *dat, unsign /* If emptymatch still =1, we do have an all-0xff data buffer. Return all-0xff ecc value instead of the computed one, so it'll look just like a freshly-erased page. */ - if (emptymatch) - memset(ecc_code, 0xff, 6); + if (emptymatch) memset(ecc_code, 0xff, 6); #endif return 0; } -static int doc200x_correct_data(struct mtd_info *mtd, u_char *dat, - u_char *read_ecc, u_char *isnull) +static int doc200x_correct_data(struct mtd_info *mtd, u_char *dat, u_char *read_ecc, u_char *calc_ecc) { int i, ret = 0; struct nand_chip *this = mtd->priv; struct doc_priv *doc = this->priv; - void __iomem *docptr = doc->virtadr; - uint8_t calc_ecc[6]; + void __iomem *docptr = doc->virtadr; volatile u_char dummy; int emptymatch = 1; @@ -1008,20 +1012,18 @@ static int doc200x_correct_data(struct mtd_info *mtd, u_char *dat, all-0xff data and stored ecc block. Check the stored ecc. */ if (emptymatch) { for (i = 0; i < 6; i++) { - if (read_ecc[i] == 0xff) - continue; + if (read_ecc[i] == 0xff) continue; emptymatch = 0; break; } } /* If emptymatch still =1, check the data block. */ if (emptymatch) { - /* Note: this somewhat expensive test should not be triggered - often. It could be optimized away by examining the data in - the readbuf routine, and remembering the result. */ + /* Note: this somewhat expensive test should not be triggered + often. It could be optimized away by examining the data in + the readbuf routine, and remembering the result. */ for (i = 0; i < 512; i++) { - if (dat[i] == 0xff) - continue; + if (dat[i] == 0xff) continue; emptymatch = 0; break; } @@ -1030,8 +1032,7 @@ static int doc200x_correct_data(struct mtd_info *mtd, u_char *dat, erased block, in which case the ECC will not come out right. We'll suppress the error and tell the caller everything's OK. Because it is. */ - if (!emptymatch) - ret = doc_ecc_decode(rs_decoder, dat, calc_ecc); + if (!emptymatch) ret = doc_ecc_decode (rs_decoder, dat, calc_ecc); if (ret > 0) printk(KERN_ERR "doc200x_correct_data corrected %d errors\n", ret); } @@ -1058,10 +1059,11 @@ static int doc200x_correct_data(struct mtd_info *mtd, u_char *dat, * safer. The only problem with it is that any code that parses oobfree must * be able to handle out-of-order segments. */ -static struct nand_ecclayout doc200x_oobinfo = { - .eccbytes = 6, - .eccpos = {0, 1, 2, 3, 4, 5}, - .oobfree = {{8, 8}, {6, 2}} +static struct nand_oobinfo doc200x_oobinfo = { + .useecc = MTD_NANDECC_AUTOPLACE, + .eccbytes = 6, + .eccpos = {0, 1, 2, 3, 4, 5}, + .oobfree = { {8, 8}, {6, 2} } }; /* Find the (I)NFTL Media Header, and optionally also the mirror media header. @@ -1070,7 +1072,8 @@ static struct nand_ecclayout doc200x_oobinfo = { either "ANAND" or "BNAND". If findmirror=1, also look for the mirror media header. The page #s of the found media headers are placed in mh0_page and mh1_page in the DOC private structure. */ -static int __init find_media_headers(struct mtd_info *mtd, u_char *buf, const char *id, int findmirror) +static int __init find_media_headers(struct mtd_info *mtd, u_char *buf, + const char *id, int findmirror) { struct nand_chip *this = mtd->priv; struct doc_priv *doc = this->priv; @@ -1079,19 +1082,17 @@ static int __init find_media_headers(struct mtd_info *mtd, u_char *buf, const ch size_t retlen; for (offs = 0; offs < mtd->size; offs += mtd->erasesize) { - ret = mtd->read(mtd, offs, mtd->writesize, &retlen, buf); - if (retlen != mtd->writesize) - continue; + ret = mtd->read(mtd, offs, mtd->oobblock, &retlen, buf); + if (retlen != mtd->oobblock) continue; if (ret) { - printk(KERN_WARNING "ECC error scanning DOC at 0x%x\n", offs); + printk(KERN_WARNING "ECC error scanning DOC at 0x%x\n", + offs); } - if (memcmp(buf, id, 6)) - continue; + if (memcmp(buf, id, 6)) continue; printk(KERN_INFO "Found DiskOnChip %s Media Header at 0x%x\n", id, offs); if (doc->mh0_page == -1) { doc->mh0_page = offs >> this->page_shift; - if (!findmirror) - return 1; + if (!findmirror) return 1; continue; } doc->mh1_page = offs >> this->page_shift; @@ -1104,8 +1105,8 @@ static int __init find_media_headers(struct mtd_info *mtd, u_char *buf, const ch /* Only one mediaheader was found. We want buf to contain a mediaheader on return, so we'll have to re-read the one we found. */ offs = doc->mh0_page << this->page_shift; - ret = mtd->read(mtd, offs, mtd->writesize, &retlen, buf); - if (retlen != mtd->writesize) { + ret = mtd->read(mtd, offs, mtd->oobblock, &retlen, buf); + if (retlen != mtd->oobblock) { /* Insanity. Give up. */ printk(KERN_ERR "Read DiskOnChip Media Header once, but can't reread it???\n"); return 0; @@ -1113,7 +1114,8 @@ static int __init find_media_headers(struct mtd_info *mtd, u_char *buf, const ch return 1; } -static inline int __init nftl_partscan(struct mtd_info *mtd, struct mtd_partition *parts) +static inline int __init nftl_partscan(struct mtd_info *mtd, + struct mtd_partition *parts) { struct nand_chip *this = mtd->priv; struct doc_priv *doc = this->priv; @@ -1125,14 +1127,13 @@ static inline int __init nftl_partscan(struct mtd_info *mtd, struct mtd_partitio unsigned blocks, maxblocks; int offs, numheaders; - buf = kmalloc(mtd->writesize, GFP_KERNEL); + buf = kmalloc(mtd->oobblock, GFP_KERNEL); if (!buf) { printk(KERN_ERR "DiskOnChip mediaheader kmalloc failed!\n"); return 0; } - if (!(numheaders = find_media_headers(mtd, buf, "ANAND", 1))) - goto out; - mh = (struct NFTLMediaHeader *)buf; + if (!(numheaders=find_media_headers(mtd, buf, "ANAND", 1))) goto out; + mh = (struct NFTLMediaHeader *) buf; mh->NumEraseUnits = le16_to_cpu(mh->NumEraseUnits); mh->FirstPhysicalEUN = le16_to_cpu(mh->FirstPhysicalEUN); @@ -1154,8 +1155,8 @@ static inline int __init nftl_partscan(struct mtd_info *mtd, struct mtd_partitio /* Auto-determine UnitSizeFactor. The constraints are: - There can be at most 32768 virtual blocks. - There can be at most (virtual block size - page size) - virtual blocks (because MediaHeader+BBT must fit in 1). - */ + virtual blocks (because MediaHeader+BBT must fit in 1). + */ mh->UnitSizeFactor = 0xff; while (blocks > maxblocks) { blocks >>= 1; @@ -1210,13 +1211,14 @@ static inline int __init nftl_partscan(struct mtd_info *mtd, struct mtd_partitio } ret = numparts; - out: +out: kfree(buf); return ret; } /* This is a stripped-down copy of the code in inftlmount.c */ -static inline int __init inftl_partscan(struct mtd_info *mtd, struct mtd_partition *parts) +static inline int __init inftl_partscan(struct mtd_info *mtd, + struct mtd_partition *parts) { struct nand_chip *this = mtd->priv; struct doc_priv *doc = this->priv; @@ -1233,16 +1235,15 @@ static inline int __init inftl_partscan(struct mtd_info *mtd, struct mtd_partiti if (inftl_bbt_write) end -= (INFTL_BBT_RESERVED_BLOCKS << this->phys_erase_shift); - buf = kmalloc(mtd->writesize, GFP_KERNEL); + buf = kmalloc(mtd->oobblock, GFP_KERNEL); if (!buf) { printk(KERN_ERR "DiskOnChip mediaheader kmalloc failed!\n"); return 0; } - if (!find_media_headers(mtd, buf, "BNAND", 0)) - goto out; + if (!find_media_headers(mtd, buf, "BNAND", 0)) goto out; doc->mh1_page = doc->mh0_page + (4096 >> this->page_shift); - mh = (struct INFTLMediaHeader *)buf; + mh = (struct INFTLMediaHeader *) buf; mh->NoOfBootImageBlocks = le32_to_cpu(mh->NoOfBootImageBlocks); mh->NoOfBinaryPartitions = le32_to_cpu(mh->NoOfBinaryPartitions); @@ -1318,10 +1319,8 @@ static inline int __init inftl_partscan(struct mtd_info *mtd, struct mtd_partiti parts[numparts].offset = ip->firstUnit << vshift; parts[numparts].size = (1 + ip->lastUnit - ip->firstUnit) << vshift; numparts++; - if (ip->lastUnit > lastvunit) - lastvunit = ip->lastUnit; - if (ip->flags & INFTL_LAST) - break; + if (ip->lastUnit > lastvunit) lastvunit = ip->lastUnit; + if (ip->flags & INFTL_LAST) break; } lastvunit++; if ((lastvunit << vshift) < end) { @@ -1331,7 +1330,7 @@ static inline int __init inftl_partscan(struct mtd_info *mtd, struct mtd_partiti numparts++; } ret = numparts; - out: +out: kfree(buf); return ret; } @@ -1343,12 +1342,11 @@ static int __init nftl_scan_bbt(struct mtd_info *mtd) struct doc_priv *doc = this->priv; struct mtd_partition parts[2]; - memset((char *)parts, 0, sizeof(parts)); + memset((char *) parts, 0, sizeof(parts)); /* On NFTL, we have to find the media headers before we can read the BBTs, since they're stored in the media header eraseblocks. */ numparts = nftl_partscan(mtd, parts); - if (!numparts) - return -EIO; + if (!numparts) return -EIO; this->bbt_td->options = NAND_BBT_ABSPAGE | NAND_BBT_8BIT | NAND_BBT_SAVECONTENT | NAND_BBT_WRITE | NAND_BBT_VERSION; @@ -1395,7 +1393,8 @@ static int __init inftl_scan_bbt(struct mtd_info *mtd) this->bbt_td->pages[0] = 2; this->bbt_md = NULL; } else { - this->bbt_td->options = NAND_BBT_LASTBLOCK | NAND_BBT_8BIT | NAND_BBT_VERSION; + this->bbt_td->options = NAND_BBT_LASTBLOCK | NAND_BBT_8BIT | + NAND_BBT_VERSION; if (inftl_bbt_write) this->bbt_td->options |= NAND_BBT_WRITE; this->bbt_td->offs = 8; @@ -1405,7 +1404,8 @@ static int __init inftl_scan_bbt(struct mtd_info *mtd) this->bbt_td->reserved_block_code = 0x01; this->bbt_td->pattern = "MSYS_BBT"; - this->bbt_md->options = NAND_BBT_LASTBLOCK | NAND_BBT_8BIT | NAND_BBT_VERSION; + this->bbt_md->options = NAND_BBT_LASTBLOCK | NAND_BBT_8BIT | + NAND_BBT_VERSION; if (inftl_bbt_write) this->bbt_md->options |= NAND_BBT_WRITE; this->bbt_md->offs = 8; @@ -1420,13 +1420,12 @@ static int __init inftl_scan_bbt(struct mtd_info *mtd) At least as nand_bbt.c is currently written. */ if ((ret = nand_scan_bbt(mtd, NULL))) return ret; - memset((char *)parts, 0, sizeof(parts)); + memset((char *) parts, 0, sizeof(parts)); numparts = inftl_partscan(mtd, parts); /* At least for now, require the INFTL Media Header. We could probably do without it for non-INFTL use, since all it gives us is autopartitioning, but I want to give it more thought. */ - if (!numparts) - return -EIO; + if (!numparts) return -EIO; add_mtd_device(mtd); #ifdef CONFIG_MTD_PARTITIONS if (!no_autopart) @@ -1440,6 +1439,7 @@ static inline int __init doc2000_init(struct mtd_info *mtd) struct nand_chip *this = mtd->priv; struct doc_priv *doc = this->priv; + this->write_byte = doc2000_write_byte; this->read_byte = doc2000_read_byte; this->write_buf = doc2000_writebuf; this->read_buf = doc2000_readbuf; @@ -1457,6 +1457,7 @@ static inline int __init doc2001_init(struct mtd_info *mtd) struct nand_chip *this = mtd->priv; struct doc_priv *doc = this->priv; + this->write_byte = doc2001_write_byte; this->read_byte = doc2001_read_byte; this->write_buf = doc2001_writebuf; this->read_buf = doc2001_readbuf; @@ -1488,15 +1489,16 @@ static inline int __init doc2001plus_init(struct mtd_info *mtd) struct nand_chip *this = mtd->priv; struct doc_priv *doc = this->priv; + this->write_byte = NULL; this->read_byte = doc2001plus_read_byte; this->write_buf = doc2001plus_writebuf; this->read_buf = doc2001plus_readbuf; this->verify_buf = doc2001plus_verifybuf; this->scan_bbt = inftl_scan_bbt; - this->cmd_ctrl = NULL; + this->hwcontrol = NULL; this->select_chip = doc2001plus_select_chip; this->cmdfunc = doc2001plus_command; - this->ecc.hwctl = doc2001plus_enable_hwecc; + this->enable_hwecc = doc2001plus_enable_hwecc; doc->chips_per_floor = 1; mtd->name = "DiskOnChip Millennium Plus"; @@ -1533,16 +1535,20 @@ static int __init doc_probe(unsigned long physadr) save_control = ReadDOC(virtadr, DOCControl); /* Reset the DiskOnChip ASIC */ - WriteDOC(DOC_MODE_CLR_ERR | DOC_MODE_MDWREN | DOC_MODE_RESET, virtadr, DOCControl); - WriteDOC(DOC_MODE_CLR_ERR | DOC_MODE_MDWREN | DOC_MODE_RESET, virtadr, DOCControl); + WriteDOC(DOC_MODE_CLR_ERR | DOC_MODE_MDWREN | DOC_MODE_RESET, + virtadr, DOCControl); + WriteDOC(DOC_MODE_CLR_ERR | DOC_MODE_MDWREN | DOC_MODE_RESET, + virtadr, DOCControl); /* Enable the DiskOnChip ASIC */ - WriteDOC(DOC_MODE_CLR_ERR | DOC_MODE_MDWREN | DOC_MODE_NORMAL, virtadr, DOCControl); - WriteDOC(DOC_MODE_CLR_ERR | DOC_MODE_MDWREN | DOC_MODE_NORMAL, virtadr, DOCControl); + WriteDOC(DOC_MODE_CLR_ERR | DOC_MODE_MDWREN | DOC_MODE_NORMAL, + virtadr, DOCControl); + WriteDOC(DOC_MODE_CLR_ERR | DOC_MODE_MDWREN | DOC_MODE_NORMAL, + virtadr, DOCControl); ChipID = ReadDOC(virtadr, ChipID); - switch (ChipID) { + switch(ChipID) { case DOC_ChipID_Doc2k: reg = DoC_2k_ECCStatus; break; @@ -1558,13 +1564,15 @@ static int __init doc_probe(unsigned long physadr) ReadDOC(virtadr, Mplus_Power); /* Reset the Millennium Plus ASIC */ - tmp = DOC_MODE_RESET | DOC_MODE_MDWREN | DOC_MODE_RST_LAT | DOC_MODE_BDECT; + tmp = DOC_MODE_RESET | DOC_MODE_MDWREN | DOC_MODE_RST_LAT | + DOC_MODE_BDECT; WriteDOC(tmp, virtadr, Mplus_DOCControl); WriteDOC(~tmp, virtadr, Mplus_CtrlConfirm); mdelay(1); /* Enable the Millennium Plus ASIC */ - tmp = DOC_MODE_NORMAL | DOC_MODE_MDWREN | DOC_MODE_RST_LAT | DOC_MODE_BDECT; + tmp = DOC_MODE_NORMAL | DOC_MODE_MDWREN | DOC_MODE_RST_LAT | + DOC_MODE_BDECT; WriteDOC(tmp, virtadr, Mplus_DOCControl); WriteDOC(~tmp, virtadr, Mplus_CtrlConfirm); mdelay(1); @@ -1588,7 +1596,7 @@ static int __init doc_probe(unsigned long physadr) goto notfound; } /* Check the TOGGLE bit in the ECC register */ - tmp = ReadDOC_(virtadr, reg) & DOC_TOGGLE_BIT; + tmp = ReadDOC_(virtadr, reg) & DOC_TOGGLE_BIT; tmpb = ReadDOC_(virtadr, reg) & DOC_TOGGLE_BIT; tmpc = ReadDOC_(virtadr, reg) & DOC_TOGGLE_BIT; if ((tmp == tmpb) || (tmp != tmpc)) { @@ -1618,11 +1626,11 @@ static int __init doc_probe(unsigned long physadr) if (ChipID == DOC_ChipID_DocMilPlus16) { WriteDOC(~newval, virtadr, Mplus_AliasResolution); oldval = ReadDOC(doc->virtadr, Mplus_AliasResolution); - WriteDOC(newval, virtadr, Mplus_AliasResolution); // restore it + WriteDOC(newval, virtadr, Mplus_AliasResolution); // restore it } else { WriteDOC(~newval, virtadr, AliasResolution); oldval = ReadDOC(doc->virtadr, AliasResolution); - WriteDOC(newval, virtadr, AliasResolution); // restore it + WriteDOC(newval, virtadr, AliasResolution); // restore it } newval = ~newval; if (oldval == newval) { @@ -1634,8 +1642,10 @@ static int __init doc_probe(unsigned long physadr) printk(KERN_NOTICE "DiskOnChip found at 0x%lx\n", physadr); len = sizeof(struct mtd_info) + - sizeof(struct nand_chip) + sizeof(struct doc_priv) + (2 * sizeof(struct nand_bbt_descr)); - mtd = kmalloc(len, GFP_KERNEL); + sizeof(struct nand_chip) + + sizeof(struct doc_priv) + + (2 * sizeof(struct nand_bbt_descr)); + mtd = kmalloc(len, GFP_KERNEL); if (!mtd) { printk(KERN_ERR "DiskOnChip kmalloc (%d bytes) failed!\n", len); ret = -ENOMEM; @@ -1653,19 +1663,17 @@ static int __init doc_probe(unsigned long physadr) nand->priv = doc; nand->select_chip = doc200x_select_chip; - nand->cmd_ctrl = doc200x_hwcontrol; + nand->hwcontrol = doc200x_hwcontrol; nand->dev_ready = doc200x_dev_ready; nand->waitfunc = doc200x_wait; nand->block_bad = doc200x_block_bad; - nand->ecc.hwctl = doc200x_enable_hwecc; - nand->ecc.calculate = doc200x_calculate_ecc; - nand->ecc.correct = doc200x_correct_data; + nand->enable_hwecc = doc200x_enable_hwecc; + nand->calculate_ecc = doc200x_calculate_ecc; + nand->correct_data = doc200x_correct_data; - nand->ecc.layout = &doc200x_oobinfo; - nand->ecc.mode = NAND_ECC_HW_SYNDROME; - nand->ecc.size = 512; - nand->ecc.bytes = 6; - nand->options = NAND_USE_FLASH_BBT; + nand->autooob = &doc200x_oobinfo; + nand->eccmode = NAND_ECC_HW6_512; + nand->options = NAND_USE_FLASH_BBT | NAND_HWECC_SYNDROME; doc->physadr = physadr; doc->virtadr = virtadr; @@ -1699,18 +1707,18 @@ static int __init doc_probe(unsigned long physadr) doclist = mtd; return 0; - notfound: +notfound: /* Put back the contents of the DOCControl register, in case it's not actually a DiskOnChip. */ WriteDOC(save_control, virtadr, DOCControl); - fail: +fail: iounmap(virtadr); return ret; } static void release_nanddoc(void) { - struct mtd_info *mtd, *nextmtd; + struct mtd_info *mtd, *nextmtd; struct nand_chip *nand; struct doc_priv *doc; @@ -1739,8 +1747,8 @@ static int __init init_nanddoc(void) * generator polinomial degree = 4 */ rs_decoder = init_rs(10, 0x409, FCR, 1, NROOTS); - if (!rs_decoder) { - printk(KERN_ERR "DiskOnChip: Could not create a RS decoder\n"); + if (!rs_decoder) { + printk (KERN_ERR "DiskOnChip: Could not create a RS decoder\n"); return -ENOMEM; } @@ -1750,7 +1758,7 @@ static int __init init_nanddoc(void) if (ret < 0) goto outerr; } else { - for (i = 0; (doc_locations[i] != 0xffffffff); i++) { + for (i=0; (doc_locations[i] != 0xffffffff); i++) { doc_probe(doc_locations[i]); } } @@ -1762,7 +1770,7 @@ static int __init init_nanddoc(void) goto outerr; } return 0; - outerr: +outerr: free_rs(rs_decoder); return ret; } diff --git a/drivers/mtd/nand/edb7312.c b/drivers/mtd/nand/edb7312.c index 516c0e5e5..9b1fd2f38 100644 --- a/drivers/mtd/nand/edb7312.c +++ b/drivers/mtd/nand/edb7312.c @@ -1,7 +1,7 @@ /* * drivers/mtd/nand/edb7312.c * - * Copyright (C) 2002 Marius Gröger (mag@sysgo.de) + * Copyright (C) 2002 Marius Gröger (mag@sysgo.de) * * Derived from drivers/mtd/nand/autcpu12.c * Copyright (c) 2001 Thomas Gleixner (gleixner@autronix.de) @@ -25,7 +25,7 @@ #include #include #include -#include /* for CLPS7111_VIRT_BASE */ +#include /* for CLPS7111_VIRT_BASE */ #include #include @@ -54,45 +54,51 @@ static struct mtd_info *ep7312_mtd = NULL; */ static unsigned long ep7312_fio_pbase = EP7312_FIO_PBASE; -static void __iomem *ep7312_pxdr = (void __iomem *)EP7312_PXDR; -static void __iomem *ep7312_pxddr = (void __iomem *)EP7312_PXDDR; +static void __iomem * ep7312_pxdr = (void __iomem *) EP7312_PXDR; +static void __iomem * ep7312_pxddr = (void __iomem *) EP7312_PXDDR; #ifdef CONFIG_MTD_PARTITIONS /* * Define static partitions for flash device */ static struct mtd_partition partition_info[] = { - {.name = "EP7312 Nand Flash", - .offset = 0, - .size = 8 * 1024 * 1024} + { .name = "EP7312 Nand Flash", + .offset = 0, + .size = 8*1024*1024 } }; - #define NUM_PARTITIONS 1 #endif + /* * hardware specific access to control-lines - * - * NAND_NCE: bit 0 -> bit 7 - * NAND_CLE: bit 1 -> bit 4 - * NAND_ALE: bit 2 -> bit 5 */ -static void ep7312_hwcontrol(struct mtd_info *mtd, int cmd, unsigned int ctrl) +static void ep7312_hwcontrol(struct mtd_info *mtd, int cmd) { - struct nand_chip *chip = mtd->priv; - - if (ctrl & NAND_CTRL_CHANGE) { - unsigned char bits; - - bits = (ctrl & (NAND_CLE | NAND_ALE)) << 3; - bits = (ctrl & NAND_NCE) << 7; - - clps_writeb((clps_readb(ep7312_pxdr) & 0xB0) | 0x10, - ep7312_pxdr); + switch(cmd) { + + case NAND_CTL_SETCLE: + clps_writeb(clps_readb(ep7312_pxdr) | 0x10, ep7312_pxdr); + break; + case NAND_CTL_CLRCLE: + clps_writeb(clps_readb(ep7312_pxdr) & ~0x10, ep7312_pxdr); + break; + + case NAND_CTL_SETALE: + clps_writeb(clps_readb(ep7312_pxdr) | 0x20, ep7312_pxdr); + break; + case NAND_CTL_CLRALE: + clps_writeb(clps_readb(ep7312_pxdr) & ~0x20, ep7312_pxdr); + break; + + case NAND_CTL_SETNCE: + clps_writeb((clps_readb(ep7312_pxdr) | 0x80) & ~0x40, ep7312_pxdr); + break; + case NAND_CTL_CLRNCE: + clps_writeb((clps_readb(ep7312_pxdr) | 0x80) | 0x40, ep7312_pxdr); + break; } - if (cmd != NAND_CMD_NONE) - writeb(cmd, chip->IO_ADDR_W); } /* @@ -102,7 +108,6 @@ static int ep7312_device_ready(struct mtd_info *mtd) { return 1; } - #ifdef CONFIG_MTD_PARTITIONS const char *part_probes[] = { "cmdlinepart", NULL }; #endif @@ -110,16 +115,18 @@ const char *part_probes[] = { "cmdlinepart", NULL }; /* * Main initialization routine */ -static int __init ep7312_init(void) +static int __init ep7312_init (void) { struct nand_chip *this; const char *part_type = 0; int mtd_parts_nb = 0; struct mtd_partition *mtd_parts = 0; - void __iomem *ep7312_fio_base; + void __iomem * ep7312_fio_base; /* Allocate memory for MTD device structure and private data */ - ep7312_mtd = kmalloc(sizeof(struct mtd_info) + sizeof(struct nand_chip), GFP_KERNEL); + ep7312_mtd = kmalloc(sizeof(struct mtd_info) + + sizeof(struct nand_chip), + GFP_KERNEL); if (!ep7312_mtd) { printk("Unable to allocate EDB7312 NAND MTD device structure.\n"); return -ENOMEM; @@ -127,22 +134,21 @@ static int __init ep7312_init(void) /* map physical adress */ ep7312_fio_base = ioremap(ep7312_fio_pbase, SZ_1K); - if (!ep7312_fio_base) { + if(!ep7312_fio_base) { printk("ioremap EDB7312 NAND flash failed\n"); kfree(ep7312_mtd); return -EIO; } /* Get pointer to private data */ - this = (struct nand_chip *)(&ep7312_mtd[1]); + this = (struct nand_chip *) (&ep7312_mtd[1]); /* Initialize structures */ - memset(ep7312_mtd, 0, sizeof(struct mtd_info)); - memset(this, 0, sizeof(struct nand_chip)); + memset((char *) ep7312_mtd, 0, sizeof(struct mtd_info)); + memset((char *) this, 0, sizeof(struct nand_chip)); /* Link the private data with the MTD structure */ ep7312_mtd->priv = this; - ep7312_mtd->owner = THIS_MODULE; /* * Set GPIO Port B control register so that the pins are configured @@ -153,20 +159,22 @@ static int __init ep7312_init(void) /* insert callbacks */ this->IO_ADDR_R = ep7312_fio_base; this->IO_ADDR_W = ep7312_fio_base; - this->cmd_ctrl = ep7312_hwcontrol; + this->hwcontrol = ep7312_hwcontrol; this->dev_ready = ep7312_device_ready; /* 15 us command delay time */ this->chip_delay = 15; /* Scan to find existence of the device */ - if (nand_scan(ep7312_mtd, 1)) { + if (nand_scan (ep7312_mtd, 1)) { iounmap((void *)ep7312_fio_base); - kfree(ep7312_mtd); + kfree (ep7312_mtd); return -ENXIO; } + #ifdef CONFIG_MTD_PARTITIONS ep7312_mtd->name = "edb7312-nand"; - mtd_parts_nb = parse_mtd_partitions(ep7312_mtd, part_probes, &mtd_parts, 0); + mtd_parts_nb = parse_mtd_partitions(ep7312_mtd, part_probes, + &mtd_parts, 0); if (mtd_parts_nb > 0) part_type = "command line"; else @@ -185,23 +193,24 @@ static int __init ep7312_init(void) /* Return happy */ return 0; } - module_init(ep7312_init); /* * Clean up routine */ -static void __exit ep7312_cleanup(void) +static void __exit ep7312_cleanup (void) { - struct nand_chip *this = (struct nand_chip *)&ep7312_mtd[1]; + struct nand_chip *this = (struct nand_chip *) &ep7312_mtd[1]; /* Release resources, unregister device */ - nand_release(ap7312_mtd); + nand_release (ap7312_mtd); + + /* Free internal data buffer */ + kfree (this->data_buf); /* Free the MTD device structure */ - kfree(ep7312_mtd); + kfree (ep7312_mtd); } - module_exit(ep7312_cleanup); MODULE_LICENSE("GPL"); diff --git a/drivers/mtd/nand/h1910.c b/drivers/mtd/nand/h1910.c index 2d585d2d0..f68f7a99a 100644 --- a/drivers/mtd/nand/h1910.c +++ b/drivers/mtd/nand/h1910.c @@ -4,7 +4,7 @@ * Copyright (C) 2003 Joshua Wise (joshua@joshuawise.com) * * Derived from drivers/mtd/nand/edb7312.c - * Copyright (C) 2002 Marius Gröger (mag@sysgo.de) + * Copyright (C) 2002 Marius Gröger (mag@sysgo.de) * Copyright (c) 2001 Thomas Gleixner (gleixner@autronix.de) * * $Id: h1910.c,v 1.6 2005/11/07 11:14:30 gleixner Exp $ @@ -26,7 +26,7 @@ #include #include #include -#include /* for CLPS7111_VIRT_BASE */ +#include /* for CLPS7111_VIRT_BASE */ #include #include #include @@ -45,29 +45,47 @@ static struct mtd_info *h1910_nand_mtd = NULL; * Define static partitions for flash device */ static struct mtd_partition partition_info[] = { - {name:"h1910 NAND Flash", - offset:0, - size:16 * 1024 * 1024} + { name: "h1910 NAND Flash", + offset: 0, + size: 16*1024*1024 } }; - #define NUM_PARTITIONS 1 #endif + /* * hardware specific access to control-lines - * - * NAND_NCE: bit 0 - don't care - * NAND_CLE: bit 1 - address bit 2 - * NAND_ALE: bit 2 - address bit 3 */ -static void h1910_hwcontrol(struct mtd_info *mtd, int cmd, - unsigned int ctrl) +static void h1910_hwcontrol(struct mtd_info *mtd, int cmd) { - struct nand_chip *chip = mtd->priv; - - if (cmd != NAND_CMD_NONE) - writeb(cmd, chip->IO_ADDR_W | ((ctrl & 0x6) << 1)); + struct nand_chip* this = (struct nand_chip *) (mtd->priv); + + switch(cmd) { + + case NAND_CTL_SETCLE: + this->IO_ADDR_R |= (1 << 2); + this->IO_ADDR_W |= (1 << 2); + break; + case NAND_CTL_CLRCLE: + this->IO_ADDR_R &= ~(1 << 2); + this->IO_ADDR_W &= ~(1 << 2); + break; + + case NAND_CTL_SETALE: + this->IO_ADDR_R |= (1 << 3); + this->IO_ADDR_W |= (1 << 3); + break; + case NAND_CTL_CLRALE: + this->IO_ADDR_R &= ~(1 << 3); + this->IO_ADDR_W &= ~(1 << 3); + break; + + case NAND_CTL_SETNCE: + break; + case NAND_CTL_CLRNCE: + break; + } } /* @@ -83,7 +101,7 @@ static int h1910_device_ready(struct mtd_info *mtd) /* * Main initialization routine */ -static int __init h1910_init(void) +static int __init h1910_init (void) { struct nand_chip *this; const char *part_type = 0; @@ -101,23 +119,24 @@ static int __init h1910_init(void) } /* Allocate memory for MTD device structure and private data */ - h1910_nand_mtd = kmalloc(sizeof(struct mtd_info) + sizeof(struct nand_chip), GFP_KERNEL); + h1910_nand_mtd = kmalloc(sizeof(struct mtd_info) + + sizeof(struct nand_chip), + GFP_KERNEL); if (!h1910_nand_mtd) { printk("Unable to allocate h1910 NAND MTD device structure.\n"); - iounmap((void *)nandaddr); + iounmap ((void *) nandaddr); return -ENOMEM; } /* Get pointer to private data */ - this = (struct nand_chip *)(&h1910_nand_mtd[1]); + this = (struct nand_chip *) (&h1910_nand_mtd[1]); /* Initialize structures */ - memset(h1910_nand_mtd, 0, sizeof(struct mtd_info)); - memset(this, 0, sizeof(struct nand_chip)); + memset((char *) h1910_nand_mtd, 0, sizeof(struct mtd_info)); + memset((char *) this, 0, sizeof(struct nand_chip)); /* Link the private data with the MTD structure */ h1910_nand_mtd->priv = this; - h1910_nand_mtd->owner = THIS_MODULE; /* * Enable VPEN @@ -127,28 +146,31 @@ static int __init h1910_init(void) /* insert callbacks */ this->IO_ADDR_R = nandaddr; this->IO_ADDR_W = nandaddr; - this->cmd_ctrl = h1910_hwcontrol; + this->hwcontrol = h1910_hwcontrol; this->dev_ready = NULL; /* unknown whether that was correct or not so we will just do it like this */ /* 15 us command delay time */ this->chip_delay = 50; - this->ecc.mode = NAND_ECC_SOFT; + this->eccmode = NAND_ECC_SOFT; this->options = NAND_NO_AUTOINCR; /* Scan to find existence of the device */ - if (nand_scan(h1910_nand_mtd, 1)) { + if (nand_scan (h1910_nand_mtd, 1)) { printk(KERN_NOTICE "No NAND device - returning -ENXIO\n"); - kfree(h1910_nand_mtd); - iounmap((void *)nandaddr); + kfree (h1910_nand_mtd); + iounmap ((void *) nandaddr); return -ENXIO; } + #ifdef CONFIG_MTD_CMDLINE_PARTS - mtd_parts_nb = parse_cmdline_partitions(h1910_nand_mtd, &mtd_parts, "h1910-nand"); + mtd_parts_nb = parse_cmdline_partitions(h1910_nand_mtd, &mtd_parts, + "h1910-nand"); 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; mtd_parts_nb = NUM_PARTITIONS; part_type = "static"; @@ -161,26 +183,24 @@ static int __init h1910_init(void) /* Return happy */ return 0; } - module_init(h1910_init); /* * Clean up routine */ -static void __exit h1910_cleanup(void) +static void __exit h1910_cleanup (void) { - struct nand_chip *this = (struct nand_chip *)&h1910_nand_mtd[1]; + struct nand_chip *this = (struct nand_chip *) &h1910_nand_mtd[1]; /* Release resources, unregister device */ - nand_release(h1910_nand_mtd); + nand_release (h1910_nand_mtd); /* Release io resource */ - iounmap((void *)this->IO_ADDR_W); + iounmap ((void *) this->IO_ADDR_W); /* Free the MTD device structure */ - kfree(h1910_nand_mtd); + kfree (h1910_nand_mtd); } - module_exit(h1910_cleanup); MODULE_LICENSE("GPL"); diff --git a/drivers/mtd/nand/nand_base.c b/drivers/mtd/nand/nand_base.c index 975b2ef61..5d222460b 100644 --- a/drivers/mtd/nand/nand_base.c +++ b/drivers/mtd/nand/nand_base.c @@ -10,31 +10,67 @@ * http://www.linux-mtd.infradead.org/tech/nand.html * * Copyright (C) 2000 Steven J. Hill (sjhill@realitydiluted.com) - * 2002-2006 Thomas Gleixner (tglx@linutronix.de) + * 2002 Thomas Gleixner (tglx@linutronix.de) * - * Credits: + * 02-08-2004 tglx: support for strange chips, which cannot auto increment + * pages on read / read_oob + * + * 03-17-2004 tglx: Check ready before auto increment check. Simon Bayes + * pointed this out, as he marked an auto increment capable chip + * as NOAUTOINCR in the board driver. + * Make reads over block boundaries work too + * + * 04-14-2004 tglx: first working version for 2k page size chips + * + * 05-19-2004 tglx: Basic support for Renesas AG-AND chips + * + * 09-24-2004 tglx: add support for hardware controllers (e.g. ECC) shared + * among multiple independend devices. Suggestions and initial patch + * from Ben Dooks + * + * 12-05-2004 dmarlin: add workaround for Renesas AG-AND chips "disturb" issue. + * Basically, any block not rewritten may lose data when surrounding blocks + * are rewritten many times. JFFS2 ensures this doesn't happen for blocks + * it uses, but the Bad Block Table(s) may not be rewritten. To ensure they + * do not lose data, force them to be rewritten when some of the surrounding + * blocks are erased. Rather than tracking a specific nearby block (which + * could itself go bad), use a page address 'mask' to select several blocks + * in the same area, and rewrite the BBT when any of them are erased. + * + * 01-03-2005 dmarlin: added support for the device recovery command sequence for Renesas + * AG-AND chips. If there was a sudden loss of power during an erase operation, + * a "device recovery" operation must be performed when power is restored + * to ensure correct operation. + * + * 01-20-2005 dmarlin: added support for optional hardware specific callback routine to + * perform extra error status checks on erase and write failures. This required + * adding a wrapper function for nand_read_ecc. + * + * 08-20-2005 vwool: suspend/resume added + * + * Credits: * David Woodhouse for adding multichip support * * Aleph One Ltd. and Toby Churchill Ltd. for supporting the * rework for 2K page size chips * - * TODO: + * TODO: * Enable cached programming for 2k page size chips * Check, if mtd->ecctype should be set to MTD_ECC_HW * if we have HW ecc support. * The AG-AND chips have nice features for speed improvement, * which are not supported yet. Read / program 4 pages in one go. * + * $Id: nand_base.c,v 1.150 2005/09/15 13:58:48 vwool 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 * published by the Free Software Foundation. * */ -#include #include #include -#include #include #include #include @@ -44,7 +80,6 @@ #include #include #include -#include #include #ifdef CONFIG_MTD_PARTITIONS @@ -52,46 +87,75 @@ #endif /* Define default oob placement schemes for large and small page devices */ -static struct nand_ecclayout nand_oob_8 = { +static struct nand_oobinfo nand_oob_8 = { + .useecc = MTD_NANDECC_AUTOPLACE, .eccbytes = 3, .eccpos = {0, 1, 2}, - .oobfree = { - {.offset = 3, - .length = 2}, - {.offset = 6, - .length = 2}} + .oobfree = { {3, 2}, {6, 2} } }; -static struct nand_ecclayout nand_oob_16 = { +static struct nand_oobinfo nand_oob_16 = { + .useecc = MTD_NANDECC_AUTOPLACE, .eccbytes = 6, .eccpos = {0, 1, 2, 3, 6, 7}, - .oobfree = { - {.offset = 8, - . length = 8}} + .oobfree = { {8, 8} } }; -static struct nand_ecclayout nand_oob_64 = { +static struct nand_oobinfo nand_oob_64 = { + .useecc = MTD_NANDECC_AUTOPLACE, .eccbytes = 24, .eccpos = { - 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63}, - .oobfree = { - {.offset = 2, - .length = 38}} + 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63}, + .oobfree = { {2, 38} } }; -static int nand_get_device(struct nand_chip *chip, struct mtd_info *mtd, - int new_state); - -static int nand_do_write_oob(struct mtd_info *mtd, loff_t to, - struct mtd_oob_ops *ops); +/* This is used for padding purposes in nand_write_oob */ +static u_char ffchars[] = { + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +}; /* - * For devices which display every fart in the system on a seperate LED. Is - * compiled away when LED support is disabled. + * NAND low-level MTD interface functions */ -DEFINE_LED_TRIGGER(nand_led_trigger); +static void nand_write_buf(struct mtd_info *mtd, const u_char *buf, int len); +static void nand_read_buf(struct mtd_info *mtd, u_char *buf, int len); +static int nand_verify_buf(struct mtd_info *mtd, const u_char *buf, int len); + +static int nand_read (struct mtd_info *mtd, loff_t from, size_t len, size_t * retlen, u_char * buf); +static int nand_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); +static int nand_read_oob (struct mtd_info *mtd, loff_t from, size_t len, size_t * retlen, u_char * buf); +static int nand_write (struct mtd_info *mtd, loff_t to, size_t len, size_t * retlen, const u_char * buf); +static int nand_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 nand_write_oob (struct mtd_info *mtd, loff_t to, size_t len, size_t * retlen, const u_char *buf); +static int nand_writev (struct mtd_info *mtd, const struct kvec *vecs, + unsigned long count, loff_t to, size_t * retlen); +static int nand_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 nand_erase (struct mtd_info *mtd, struct erase_info *instr); +static void nand_sync (struct mtd_info *mtd); + +/* Some internal functions */ +static int nand_write_page (struct mtd_info *mtd, struct nand_chip *this, int page, u_char *oob_buf, + struct nand_oobinfo *oobsel, int mode); +#ifdef CONFIG_MTD_NAND_VERIFY_WRITE +static int nand_verify_pages (struct mtd_info *mtd, struct nand_chip *this, int page, int numpages, + u_char *oob_buf, struct nand_oobinfo *oobsel, int chipnr, int oobmode); +#else +#define nand_verify_pages(...) (0) +#endif + +static int nand_get_device (struct nand_chip *this, struct mtd_info *mtd, int new_state); /** * nand_release_device - [GENERIC] release chip @@ -99,19 +163,27 @@ DEFINE_LED_TRIGGER(nand_led_trigger); * * Deselect, release chip lock and wake up anyone waiting on the device */ -static void nand_release_device(struct mtd_info *mtd) +static void nand_release_device (struct mtd_info *mtd) { - struct nand_chip *chip = mtd->priv; + struct nand_chip *this = mtd->priv; /* De-select the NAND device */ - chip->select_chip(mtd, -1); - - /* Release the controller and the chip */ - spin_lock(&chip->controller->lock); - chip->controller->active = NULL; - chip->state = FL_READY; - wake_up(&chip->controller->wq); - spin_unlock(&chip->controller->lock); + this->select_chip(mtd, -1); + + if (this->controller) { + /* Release the controller and the chip */ + spin_lock(&this->controller->lock); + this->controller->active = NULL; + this->state = FL_READY; + wake_up(&this->controller->wq); + spin_unlock(&this->controller->lock); + } else { + /* Release the chip */ + spin_lock(&this->chip_lock); + this->state = FL_READY; + wake_up(&this->wq); + spin_unlock(&this->chip_lock); + } } /** @@ -120,10 +192,23 @@ static void nand_release_device(struct mtd_info *mtd) * * Default read function for 8bit buswith */ -static uint8_t nand_read_byte(struct mtd_info *mtd) +static u_char nand_read_byte(struct mtd_info *mtd) +{ + struct nand_chip *this = mtd->priv; + return readb(this->IO_ADDR_R); +} + +/** + * nand_write_byte - [DEFAULT] write one byte to the chip + * @mtd: MTD device structure + * @byte: pointer to data byte to write + * + * Default write function for 8it buswith + */ +static void nand_write_byte(struct mtd_info *mtd, u_char byte) { - struct nand_chip *chip = mtd->priv; - return readb(chip->IO_ADDR_R); + struct nand_chip *this = mtd->priv; + writeb(byte, this->IO_ADDR_W); } /** @@ -133,10 +218,24 @@ static uint8_t nand_read_byte(struct mtd_info *mtd) * Default read function for 16bit buswith with * endianess conversion */ -static uint8_t nand_read_byte16(struct mtd_info *mtd) +static u_char nand_read_byte16(struct mtd_info *mtd) +{ + struct nand_chip *this = mtd->priv; + return (u_char) cpu_to_le16(readw(this->IO_ADDR_R)); +} + +/** + * nand_write_byte16 - [DEFAULT] write one byte endianess aware to the chip + * @mtd: MTD device structure + * @byte: pointer to data byte to write + * + * Default write function for 16bit buswith with + * endianess conversion + */ +static void nand_write_byte16(struct mtd_info *mtd, u_char byte) { - struct nand_chip *chip = mtd->priv; - return (uint8_t) cpu_to_le16(readw(chip->IO_ADDR_R)); + struct nand_chip *this = mtd->priv; + writew(le16_to_cpu((u16) byte), this->IO_ADDR_W); } /** @@ -148,26 +247,40 @@ static uint8_t nand_read_byte16(struct mtd_info *mtd) */ static u16 nand_read_word(struct mtd_info *mtd) { - struct nand_chip *chip = mtd->priv; - return readw(chip->IO_ADDR_R); + struct nand_chip *this = mtd->priv; + return readw(this->IO_ADDR_R); +} + +/** + * nand_write_word - [DEFAULT] write one word to the chip + * @mtd: MTD device structure + * @word: data word to write + * + * Default write function for 16bit buswith without + * endianess conversion + */ +static void nand_write_word(struct mtd_info *mtd, u16 word) +{ + struct nand_chip *this = mtd->priv; + writew(word, this->IO_ADDR_W); } /** * nand_select_chip - [DEFAULT] control CE line * @mtd: MTD device structure - * @chipnr: chipnumber to select, -1 for deselect + * @chip: chipnumber to select, -1 for deselect * * Default select function for 1 chip devices. */ -static void nand_select_chip(struct mtd_info *mtd, int chipnr) +static void nand_select_chip(struct mtd_info *mtd, int chip) { - struct nand_chip *chip = mtd->priv; - - switch (chipnr) { + struct nand_chip *this = mtd->priv; + switch(chip) { case -1: - chip->cmd_ctrl(mtd, NAND_CMD_NONE, 0 | NAND_CTRL_CHANGE); + this->hwcontrol(mtd, NAND_CTL_CLRNCE); break; case 0: + this->hwcontrol(mtd, NAND_CTL_SETNCE); break; default: @@ -183,13 +296,13 @@ static void nand_select_chip(struct mtd_info *mtd, int chipnr) * * Default write function for 8bit buswith */ -static void nand_write_buf(struct mtd_info *mtd, const uint8_t *buf, int len) +static void nand_write_buf(struct mtd_info *mtd, const u_char *buf, int len) { int i; - struct nand_chip *chip = mtd->priv; + struct nand_chip *this = mtd->priv; - for (i = 0; i < len; i++) - writeb(buf[i], chip->IO_ADDR_W); + for (i=0; iIO_ADDR_W); } /** @@ -200,13 +313,13 @@ static void nand_write_buf(struct mtd_info *mtd, const uint8_t *buf, int len) * * Default read function for 8bit buswith */ -static void nand_read_buf(struct mtd_info *mtd, uint8_t *buf, int len) +static void nand_read_buf(struct mtd_info *mtd, u_char *buf, int len) { int i; - struct nand_chip *chip = mtd->priv; + struct nand_chip *this = mtd->priv; - for (i = 0; i < len; i++) - buf[i] = readb(chip->IO_ADDR_R); + for (i=0; iIO_ADDR_R); } /** @@ -217,14 +330,15 @@ static void nand_read_buf(struct mtd_info *mtd, uint8_t *buf, int len) * * Default verify function for 8bit buswith */ -static int nand_verify_buf(struct mtd_info *mtd, const uint8_t *buf, int len) +static int nand_verify_buf(struct mtd_info *mtd, const u_char *buf, int len) { int i; - struct nand_chip *chip = mtd->priv; + struct nand_chip *this = mtd->priv; - for (i = 0; i < len; i++) - if (buf[i] != readb(chip->IO_ADDR_R)) + for (i=0; iIO_ADDR_R)) return -EFAULT; + return 0; } @@ -236,15 +350,15 @@ static int nand_verify_buf(struct mtd_info *mtd, const uint8_t *buf, int len) * * Default write function for 16bit buswith */ -static void nand_write_buf16(struct mtd_info *mtd, const uint8_t *buf, int len) +static void nand_write_buf16(struct mtd_info *mtd, const u_char *buf, int len) { int i; - struct nand_chip *chip = mtd->priv; + struct nand_chip *this = mtd->priv; u16 *p = (u16 *) buf; len >>= 1; - for (i = 0; i < len; i++) - writew(p[i], chip->IO_ADDR_W); + for (i=0; iIO_ADDR_W); } @@ -256,15 +370,15 @@ static void nand_write_buf16(struct mtd_info *mtd, const uint8_t *buf, int len) * * Default read function for 16bit buswith */ -static void nand_read_buf16(struct mtd_info *mtd, uint8_t *buf, int len) +static void nand_read_buf16(struct mtd_info *mtd, u_char *buf, int len) { int i; - struct nand_chip *chip = mtd->priv; + struct nand_chip *this = mtd->priv; u16 *p = (u16 *) buf; len >>= 1; - for (i = 0; i < len; i++) - p[i] = readw(chip->IO_ADDR_R); + for (i=0; iIO_ADDR_R); } /** @@ -275,15 +389,15 @@ static void nand_read_buf16(struct mtd_info *mtd, uint8_t *buf, int len) * * Default verify function for 16bit buswith */ -static int nand_verify_buf16(struct mtd_info *mtd, const uint8_t *buf, int len) +static int nand_verify_buf16(struct mtd_info *mtd, const u_char *buf, int len) { int i; - struct nand_chip *chip = mtd->priv; + struct nand_chip *this = mtd->priv; u16 *p = (u16 *) buf; len >>= 1; - for (i = 0; i < len; i++) - if (p[i] != readw(chip->IO_ADDR_R)) + for (i=0; iIO_ADDR_R)) return -EFAULT; return 0; @@ -300,37 +414,38 @@ static int nand_verify_buf16(struct mtd_info *mtd, const uint8_t *buf, int len) static int nand_block_bad(struct mtd_info *mtd, loff_t ofs, int getchip) { int page, chipnr, res = 0; - struct nand_chip *chip = mtd->priv; + struct nand_chip *this = mtd->priv; u16 bad; if (getchip) { - page = (int)(ofs >> chip->page_shift); - chipnr = (int)(ofs >> chip->chip_shift); + page = (int)(ofs >> this->page_shift); + chipnr = (int)(ofs >> this->chip_shift); - nand_get_device(chip, mtd, FL_READING); + /* Grab the lock and see if the device is available */ + nand_get_device (this, mtd, FL_READING); /* Select the NAND device */ - chip->select_chip(mtd, chipnr); + this->select_chip(mtd, chipnr); } else - page = (int)ofs; + page = (int) ofs; - if (chip->options & NAND_BUSWIDTH_16) { - chip->cmdfunc(mtd, NAND_CMD_READOOB, chip->badblockpos & 0xFE, - page & chip->pagemask); - bad = cpu_to_le16(chip->read_word(mtd)); - if (chip->badblockpos & 0x1) + if (this->options & NAND_BUSWIDTH_16) { + this->cmdfunc (mtd, NAND_CMD_READOOB, this->badblockpos & 0xFE, page & this->pagemask); + bad = cpu_to_le16(this->read_word(mtd)); + if (this->badblockpos & 0x1) bad >>= 8; if ((bad & 0xFF) != 0xff) res = 1; } else { - chip->cmdfunc(mtd, NAND_CMD_READOOB, chip->badblockpos, - page & chip->pagemask); - if (chip->read_byte(mtd) != 0xff) + this->cmdfunc (mtd, NAND_CMD_READOOB, this->badblockpos, page & this->pagemask); + if (this->read_byte(mtd) != 0xff) res = 1; } - if (getchip) + if (getchip) { + /* Deselect and wake up anyone waiting on the device */ nand_release_device(mtd); + } return res; } @@ -345,33 +460,23 @@ static int nand_block_bad(struct mtd_info *mtd, loff_t ofs, int getchip) */ static int nand_default_block_markbad(struct mtd_info *mtd, loff_t ofs) { - struct nand_chip *chip = mtd->priv; - uint8_t buf[2] = { 0, 0 }; - int block, ret; + struct nand_chip *this = mtd->priv; + u_char buf[2] = {0, 0}; + size_t retlen; + int block; /* Get block number */ - block = ((int)ofs) >> chip->bbt_erase_shift; - if (chip->bbt) - chip->bbt[block >> 2] |= 0x01 << ((block & 0x03) << 1); + block = ((int) ofs) >> this->bbt_erase_shift; + if (this->bbt) + this->bbt[block >> 2] |= 0x01 << ((block & 0x03) << 1); /* Do we have a flash based bad block table ? */ - if (chip->options & NAND_USE_FLASH_BBT) - ret = nand_update_bbt(mtd, ofs); - else { - /* We write two bytes, so we dont have to mess with 16 bit - * access - */ - ofs += mtd->oobsize; - chip->ops.len = 2; - chip->ops.datbuf = NULL; - chip->ops.oobbuf = buf; - chip->ops.ooboffs = chip->badblockpos & ~0x01; + if (this->options & NAND_USE_FLASH_BBT) + return nand_update_bbt (mtd, ofs); - ret = nand_do_write_oob(mtd, ofs, &chip->ops); - } - if (!ret) - mtd->ecc_stats.badblocks++; - return ret; + /* We write two bytes, so we dont have to mess with 16 bit access */ + ofs += mtd->oobsize + (this->badblockpos & ~0x01); + return nand_write_oob (mtd, ofs , 2, &retlen, buf); } /** @@ -381,12 +486,12 @@ static int nand_default_block_markbad(struct mtd_info *mtd, loff_t ofs) * * The function expects, that the device is already selected */ -static int nand_check_wp(struct mtd_info *mtd) +static int nand_check_wp (struct mtd_info *mtd) { - struct nand_chip *chip = mtd->priv; + struct nand_chip *this = mtd->priv; /* Check the WP bit */ - chip->cmdfunc(mtd, NAND_CMD_STATUS, -1, -1); - return (chip->read_byte(mtd) & NAND_STATUS_WP) ? 0 : 1; + this->cmdfunc (mtd, NAND_CMD_STATUS, -1, -1); + return (this->read_byte(mtd) & NAND_STATUS_WP) ? 0 : 1; } /** @@ -399,16 +504,15 @@ static int nand_check_wp(struct mtd_info *mtd) * Check, if the block is bad. Either by reading the bad block table or * calling of the scan function. */ -static int nand_block_checkbad(struct mtd_info *mtd, loff_t ofs, int getchip, - int allowbbt) +static int nand_block_checkbad (struct mtd_info *mtd, loff_t ofs, int getchip, int allowbbt) { - struct nand_chip *chip = mtd->priv; + struct nand_chip *this = mtd->priv; - if (!chip->bbt) - return chip->block_bad(mtd, ofs, getchip); + if (!this->bbt) + return this->block_bad(mtd, ofs, getchip); /* Return info from the table */ - return nand_isbad_bbt(mtd, ofs, allowbbt); + return nand_isbad_bbt (mtd, ofs, allowbbt); } /* @@ -417,17 +521,15 @@ static int nand_block_checkbad(struct mtd_info *mtd, loff_t ofs, int getchip, */ static void nand_wait_ready(struct mtd_info *mtd) { - struct nand_chip *chip = mtd->priv; - unsigned long timeo = jiffies + 2; + struct nand_chip *this = mtd->priv; + unsigned long timeo = jiffies + 2; - led_trigger_event(nand_led_trigger, LED_FULL); /* wait until command is processed or timeout occures */ do { - if (chip->dev_ready(mtd)) - break; + if (this->dev_ready(mtd)) + return; touch_softlockup_watchdog(); } while (time_before(jiffies, timeo)); - led_trigger_event(nand_led_trigger, LED_OFF); } /** @@ -440,21 +542,21 @@ static void nand_wait_ready(struct mtd_info *mtd) * Send command to NAND device. This function is used for small page * devices (256/512 Bytes per page) */ -static void nand_command(struct mtd_info *mtd, unsigned int command, - int column, int page_addr) +static void nand_command (struct mtd_info *mtd, unsigned command, int column, int page_addr) { - register struct nand_chip *chip = mtd->priv; - int ctrl = NAND_CTRL_CLE | NAND_CTRL_CHANGE; + register struct nand_chip *this = mtd->priv; + /* Begin command latch cycle */ + this->hwcontrol(mtd, NAND_CTL_SETCLE); /* * Write out the command to the device. */ if (command == NAND_CMD_SEQIN) { int readcmd; - if (column >= mtd->writesize) { + if (column >= mtd->oobblock) { /* OOB area */ - column -= mtd->writesize; + column -= mtd->oobblock; readcmd = NAND_CMD_READOOB; } else if (column < 256) { /* First 256 bytes --> READ0 */ @@ -463,37 +565,38 @@ static void nand_command(struct mtd_info *mtd, unsigned int command, column -= 256; readcmd = NAND_CMD_READ1; } - chip->cmd_ctrl(mtd, readcmd, ctrl); - ctrl &= ~NAND_CTRL_CHANGE; + this->write_byte(mtd, readcmd); } - chip->cmd_ctrl(mtd, command, ctrl); + this->write_byte(mtd, command); - /* - * Address cycle, when necessary - */ - ctrl = NAND_CTRL_ALE | NAND_CTRL_CHANGE; - /* Serially input address */ - if (column != -1) { - /* Adjust columns for 16 bit buswidth */ - if (chip->options & NAND_BUSWIDTH_16) - column >>= 1; - chip->cmd_ctrl(mtd, column, ctrl); - ctrl &= ~NAND_CTRL_CHANGE; - } - if (page_addr != -1) { - chip->cmd_ctrl(mtd, page_addr, ctrl); - ctrl &= ~NAND_CTRL_CHANGE; - chip->cmd_ctrl(mtd, page_addr >> 8, ctrl); - /* One more address cycle for devices > 32MiB */ - if (chip->chipsize > (32 << 20)) - chip->cmd_ctrl(mtd, page_addr >> 16, ctrl); + /* Set ALE and clear CLE to start address cycle */ + this->hwcontrol(mtd, NAND_CTL_CLRCLE); + + if (column != -1 || page_addr != -1) { + this->hwcontrol(mtd, NAND_CTL_SETALE); + + /* Serially input address */ + if (column != -1) { + /* Adjust columns for 16 bit buswidth */ + if (this->options & NAND_BUSWIDTH_16) + column >>= 1; + this->write_byte(mtd, column); + } + if (page_addr != -1) { + this->write_byte(mtd, (unsigned char) (page_addr & 0xff)); + this->write_byte(mtd, (unsigned char) ((page_addr >> 8) & 0xff)); + /* One more address cycle for devices > 32MiB */ + if (this->chipsize > (32 << 20)) + this->write_byte(mtd, (unsigned char) ((page_addr >> 16) & 0x0f)); + } + /* Latch in address */ + this->hwcontrol(mtd, NAND_CTL_CLRALE); } - chip->cmd_ctrl(mtd, NAND_CMD_NONE, NAND_NCE | NAND_CTRL_CHANGE); /* * program and erase have their own busy handlers * status and sequential in needs no delay - */ + */ switch (command) { case NAND_CMD_PAGEPROG: @@ -504,30 +607,29 @@ static void nand_command(struct mtd_info *mtd, unsigned int command, return; case NAND_CMD_RESET: - if (chip->dev_ready) + if (this->dev_ready) break; - udelay(chip->chip_delay); - chip->cmd_ctrl(mtd, NAND_CMD_STATUS, - NAND_CTRL_CLE | NAND_CTRL_CHANGE); - chip->cmd_ctrl(mtd, - NAND_CMD_NONE, NAND_NCE | NAND_CTRL_CHANGE); - while (!(chip->read_byte(mtd) & NAND_STATUS_READY)) ; + udelay(this->chip_delay); + this->hwcontrol(mtd, NAND_CTL_SETCLE); + this->write_byte(mtd, NAND_CMD_STATUS); + this->hwcontrol(mtd, NAND_CTL_CLRCLE); + while ( !(this->read_byte(mtd) & NAND_STATUS_READY)); return; - /* This applies to read commands */ + /* This applies to read commands */ default: /* * If we don't have access to the busy pin, we apply the given * command delay - */ - if (!chip->dev_ready) { - udelay(chip->chip_delay); + */ + if (!this->dev_ready) { + udelay (this->chip_delay); return; } } /* Apply this short delay always to ensure that we do wait tWB in * any case on any machine. */ - ndelay(100); + ndelay (100); nand_wait_ready(mtd); } @@ -539,48 +641,50 @@ static void nand_command(struct mtd_info *mtd, unsigned int command, * @column: the column address for this command, -1 if none * @page_addr: the page address for this command, -1 if none * - * Send command to NAND device. This is the version for the new large page - * devices We dont have the separate regions as we have in the small page - * devices. We must emulate NAND_CMD_READOOB to keep the code compatible. + * Send command to NAND device. This is the version for the new large page devices + * We dont have the seperate regions as we have in the small page devices. + * We must emulate NAND_CMD_READOOB to keep the code compatible. + * */ -static void nand_command_lp(struct mtd_info *mtd, unsigned int command, - int column, int page_addr) +static void nand_command_lp (struct mtd_info *mtd, unsigned command, int column, int page_addr) { - register struct nand_chip *chip = mtd->priv; + register struct nand_chip *this = mtd->priv; /* Emulate NAND_CMD_READOOB */ if (command == NAND_CMD_READOOB) { - column += mtd->writesize; + column += mtd->oobblock; command = NAND_CMD_READ0; } - /* Command latch cycle */ - chip->cmd_ctrl(mtd, command & 0xff, - NAND_NCE | NAND_CLE | NAND_CTRL_CHANGE); + + /* Begin command latch cycle */ + this->hwcontrol(mtd, NAND_CTL_SETCLE); + /* Write out the command to the device. */ + this->write_byte(mtd, (command & 0xff)); + /* End command latch cycle */ + this->hwcontrol(mtd, NAND_CTL_CLRCLE); if (column != -1 || page_addr != -1) { - int ctrl = NAND_CTRL_CHANGE | NAND_NCE | NAND_ALE; + this->hwcontrol(mtd, NAND_CTL_SETALE); /* Serially input address */ if (column != -1) { /* Adjust columns for 16 bit buswidth */ - if (chip->options & NAND_BUSWIDTH_16) + if (this->options & NAND_BUSWIDTH_16) column >>= 1; - chip->cmd_ctrl(mtd, column, ctrl); - ctrl &= ~NAND_CTRL_CHANGE; - chip->cmd_ctrl(mtd, column >> 8, ctrl); + this->write_byte(mtd, column & 0xff); + this->write_byte(mtd, column >> 8); } if (page_addr != -1) { - chip->cmd_ctrl(mtd, page_addr, ctrl); - chip->cmd_ctrl(mtd, page_addr >> 8, - NAND_NCE | NAND_ALE); + this->write_byte(mtd, (unsigned char) (page_addr & 0xff)); + this->write_byte(mtd, (unsigned char) ((page_addr >> 8) & 0xff)); /* One more address cycle for devices > 128MiB */ - if (chip->chipsize > (128 << 20)) - chip->cmd_ctrl(mtd, page_addr >> 16, - NAND_NCE | NAND_ALE); + if (this->chipsize > (128 << 20)) + this->write_byte(mtd, (unsigned char) ((page_addr >> 16) & 0xff)); } + /* Latch in address */ + this->hwcontrol(mtd, NAND_CTL_CLRALE); } - chip->cmd_ctrl(mtd, NAND_CMD_NONE, NAND_NCE | NAND_CTRL_CHANGE); /* * program and erase have their own busy handlers @@ -593,96 +697,95 @@ static void nand_command_lp(struct mtd_info *mtd, unsigned int command, case NAND_CMD_ERASE1: case NAND_CMD_ERASE2: case NAND_CMD_SEQIN: - case NAND_CMD_RNDIN: case NAND_CMD_STATUS: case NAND_CMD_DEPLETE1: return; - /* - * read error status commands require only a short delay - */ + /* + * read error status commands require only a short delay + */ case NAND_CMD_STATUS_ERROR: case NAND_CMD_STATUS_ERROR0: case NAND_CMD_STATUS_ERROR1: case NAND_CMD_STATUS_ERROR2: case NAND_CMD_STATUS_ERROR3: - udelay(chip->chip_delay); + udelay(this->chip_delay); return; case NAND_CMD_RESET: - if (chip->dev_ready) + if (this->dev_ready) break; - udelay(chip->chip_delay); - chip->cmd_ctrl(mtd, NAND_CMD_STATUS, - NAND_NCE | NAND_CLE | NAND_CTRL_CHANGE); - chip->cmd_ctrl(mtd, NAND_CMD_NONE, - NAND_NCE | NAND_CTRL_CHANGE); - while (!(chip->read_byte(mtd) & NAND_STATUS_READY)) ; - return; - - case NAND_CMD_RNDOUT: - /* No ready / busy check necessary */ - chip->cmd_ctrl(mtd, NAND_CMD_RNDOUTSTART, - NAND_NCE | NAND_CLE | NAND_CTRL_CHANGE); - chip->cmd_ctrl(mtd, NAND_CMD_NONE, - NAND_NCE | NAND_CTRL_CHANGE); + udelay(this->chip_delay); + this->hwcontrol(mtd, NAND_CTL_SETCLE); + this->write_byte(mtd, NAND_CMD_STATUS); + this->hwcontrol(mtd, NAND_CTL_CLRCLE); + while ( !(this->read_byte(mtd) & NAND_STATUS_READY)); return; case NAND_CMD_READ0: - chip->cmd_ctrl(mtd, NAND_CMD_READSTART, - NAND_NCE | NAND_CLE | NAND_CTRL_CHANGE); - chip->cmd_ctrl(mtd, NAND_CMD_NONE, - NAND_NCE | NAND_CTRL_CHANGE); - - /* This applies to read commands */ + /* Begin command latch cycle */ + this->hwcontrol(mtd, NAND_CTL_SETCLE); + /* Write out the start read command */ + this->write_byte(mtd, NAND_CMD_READSTART); + /* End command latch cycle */ + this->hwcontrol(mtd, NAND_CTL_CLRCLE); + /* Fall through into ready check */ + + /* This applies to read commands */ default: /* * If we don't have access to the busy pin, we apply the given * command delay - */ - if (!chip->dev_ready) { - udelay(chip->chip_delay); + */ + if (!this->dev_ready) { + udelay (this->chip_delay); return; } } /* Apply this short delay always to ensure that we do wait tWB in * any case on any machine. */ - ndelay(100); + ndelay (100); nand_wait_ready(mtd); } /** * nand_get_device - [GENERIC] Get chip for selected access - * @chip: the nand chip descriptor + * @this: the nand chip descriptor * @mtd: MTD device structure * @new_state: the state which is requested * * Get the device and lock it for exclusive access */ -static int -nand_get_device(struct nand_chip *chip, struct mtd_info *mtd, int new_state) +static int nand_get_device (struct nand_chip *this, struct mtd_info *mtd, int new_state) { - spinlock_t *lock = &chip->controller->lock; - wait_queue_head_t *wq = &chip->controller->wq; - DECLARE_WAITQUEUE(wait, current); - retry: + struct nand_chip *active; + spinlock_t *lock; + wait_queue_head_t *wq; + DECLARE_WAITQUEUE (wait, current); + + lock = (this->controller) ? &this->controller->lock : &this->chip_lock; + wq = (this->controller) ? &this->controller->wq : &this->wq; +retry: + active = this; spin_lock(lock); /* Hardware controller shared among independend devices */ - /* Hardware controller shared among independend devices */ - if (!chip->controller->active) - chip->controller->active = chip; - - if (chip->controller->active == chip && chip->state == FL_READY) { - chip->state = new_state; + if (this->controller) { + if (this->controller->active) + active = this->controller->active; + else + this->controller->active = this; + } + if (active == this && this->state == FL_READY) { + this->state = new_state; spin_unlock(lock); return 0; } if (new_state == FL_PM_SUSPENDED) { spin_unlock(lock); - return (chip->state == FL_PM_SUSPENDED) ? 0 : -EAGAIN; + return (this->state == FL_PM_SUSPENDED) ? 0 : -EAGAIN; } set_current_state(TASK_UNINTERRUPTIBLE); add_wait_queue(wq, &wait); @@ -695,341 +798,537 @@ nand_get_device(struct nand_chip *chip, struct mtd_info *mtd, int new_state) /** * nand_wait - [DEFAULT] wait until the command is done * @mtd: MTD device structure - * @chip: NAND chip structure + * @this: NAND chip structure + * @state: state to select the max. timeout value * * Wait for command done. This applies to erase and program only * Erase can take up to 400ms and program up to 20ms according to * general NAND and SmartMedia specs - */ -static int nand_wait(struct mtd_info *mtd, struct nand_chip *chip) + * +*/ +static int nand_wait(struct mtd_info *mtd, struct nand_chip *this, int state) { - unsigned long timeo = jiffies; - int status, state = chip->state; + unsigned long timeo = jiffies; + int status; if (state == FL_ERASING) - timeo += (HZ * 400) / 1000; + timeo += (HZ * 400) / 1000; else - timeo += (HZ * 20) / 1000; - - led_trigger_event(nand_led_trigger, LED_FULL); + timeo += (HZ * 20) / 1000; /* Apply this short delay always to ensure that we do wait tWB in * any case on any machine. */ - ndelay(100); + ndelay (100); - if ((state == FL_ERASING) && (chip->options & NAND_IS_AND)) - chip->cmdfunc(mtd, NAND_CMD_STATUS_MULTI, -1, -1); + if ((state == FL_ERASING) && (this->options & NAND_IS_AND)) + this->cmdfunc (mtd, NAND_CMD_STATUS_MULTI, -1, -1); else - chip->cmdfunc(mtd, NAND_CMD_STATUS, -1, -1); + this->cmdfunc (mtd, NAND_CMD_STATUS, -1, -1); while (time_before(jiffies, timeo)) { - if (chip->dev_ready) { - if (chip->dev_ready(mtd)) + /* Check, if we were interrupted */ + if (this->state != state) + return 0; + + if (this->dev_ready) { + if (this->dev_ready(mtd)) break; } else { - if (chip->read_byte(mtd) & NAND_STATUS_READY) + if (this->read_byte(mtd) & NAND_STATUS_READY) break; } cond_resched(); } - led_trigger_event(nand_led_trigger, LED_OFF); - - status = (int)chip->read_byte(mtd); + status = (int) this->read_byte(mtd); return status; } /** - * nand_read_page_raw - [Intern] read raw page data without ecc - * @mtd: mtd info structure - * @chip: nand chip info structure - * @buf: buffer to store read data + * nand_write_page - [GENERIC] write one page + * @mtd: MTD device structure + * @this: NAND chip structure + * @page: startpage inside the chip, must be called with (page & this->pagemask) + * @oob_buf: out of band data buffer + * @oobsel: out of band selecttion structre + * @cached: 1 = enable cached programming if supported by chip + * + * Nand_page_program function is used for write and writev ! + * This function will always program a full page of data + * If you call it with a non page aligned buffer, you're lost :) + * + * Cached programming is not supported yet. */ -static int nand_read_page_raw(struct mtd_info *mtd, struct nand_chip *chip, - uint8_t *buf) +static int nand_write_page (struct mtd_info *mtd, struct nand_chip *this, int page, + u_char *oob_buf, struct nand_oobinfo *oobsel, int cached) { - chip->read_buf(mtd, buf, mtd->writesize); - chip->read_buf(mtd, chip->oob_poi, mtd->oobsize); - return 0; -} + int i, status; + u_char ecc_code[32]; + int eccmode = oobsel->useecc ? this->eccmode : NAND_ECC_NONE; + int *oob_config = oobsel->eccpos; + int datidx = 0, eccidx = 0, eccsteps = this->eccsteps; + int eccbytes = 0; + + /* FIXME: Enable cached programming */ + cached = 0; -/** - * nand_read_page_swecc - {REPLACABLE] software ecc based page read function - * @mtd: mtd info structure - * @chip: nand chip info structure - * @buf: buffer to store read data - */ -static int nand_read_page_swecc(struct mtd_info *mtd, struct nand_chip *chip, - uint8_t *buf) -{ - int i, eccsize = chip->ecc.size; - int eccbytes = chip->ecc.bytes; - int eccsteps = chip->ecc.steps; - uint8_t *p = buf; - uint8_t *ecc_calc = chip->buffers.ecccalc; - uint8_t *ecc_code = chip->buffers.ecccode; - int *eccpos = chip->ecc.layout->eccpos; + /* Send command to begin auto page programming */ + this->cmdfunc (mtd, NAND_CMD_SEQIN, 0x00, page); - nand_read_page_raw(mtd, chip, buf); + /* Write out complete page of data, take care of eccmode */ + switch (eccmode) { + /* No ecc, write all */ + case NAND_ECC_NONE: + printk (KERN_WARNING "Writing data without ECC to NAND-FLASH is not recommended\n"); + this->write_buf(mtd, this->data_poi, mtd->oobblock); + break; + + /* Software ecc 3/256, write all */ + case NAND_ECC_SOFT: + for (; eccsteps; eccsteps--) { + this->calculate_ecc(mtd, &this->data_poi[datidx], ecc_code); + for (i = 0; i < 3; i++, eccidx++) + oob_buf[oob_config[eccidx]] = ecc_code[i]; + datidx += this->eccsize; + } + this->write_buf(mtd, this->data_poi, mtd->oobblock); + break; + default: + eccbytes = this->eccbytes; + for (; eccsteps; eccsteps--) { + /* enable hardware ecc logic for write */ + this->enable_hwecc(mtd, NAND_ECC_WRITE); + this->write_buf(mtd, &this->data_poi[datidx], this->eccsize); + this->calculate_ecc(mtd, &this->data_poi[datidx], ecc_code); + for (i = 0; i < eccbytes; i++, eccidx++) + oob_buf[oob_config[eccidx]] = ecc_code[i]; + /* If the hardware ecc provides syndromes then + * the ecc code must be written immidiately after + * the data bytes (words) */ + if (this->options & NAND_HWECC_SYNDROME) + this->write_buf(mtd, ecc_code, eccbytes); + datidx += this->eccsize; + } + break; + } - for (i = 0; eccsteps; eccsteps--, i += eccbytes, p += eccsize) - chip->ecc.calculate(mtd, p, &ecc_calc[i]); + /* Write out OOB data */ + if (this->options & NAND_HWECC_SYNDROME) + this->write_buf(mtd, &oob_buf[oobsel->eccbytes], mtd->oobsize - oobsel->eccbytes); + else + this->write_buf(mtd, oob_buf, mtd->oobsize); - for (i = 0; i < chip->ecc.total; i++) - ecc_code[i] = chip->oob_poi[eccpos[i]]; + /* Send command to actually program the data */ + this->cmdfunc (mtd, cached ? NAND_CMD_CACHEDPROG : NAND_CMD_PAGEPROG, -1, -1); - eccsteps = chip->ecc.steps; - p = buf; + if (!cached) { + /* call wait ready function */ + status = this->waitfunc (mtd, this, FL_WRITING); - for (i = 0 ; eccsteps; eccsteps--, i += eccbytes, p += eccsize) { - int stat; + /* See if operation failed and additional status checks are available */ + if ((status & NAND_STATUS_FAIL) && (this->errstat)) { + status = this->errstat(mtd, this, FL_WRITING, status, page); + } - stat = chip->ecc.correct(mtd, p, &ecc_code[i], &ecc_calc[i]); - if (stat == -1) - mtd->ecc_stats.failed++; - else - mtd->ecc_stats.corrected += stat; + /* See if device thinks it succeeded */ + if (status & NAND_STATUS_FAIL) { + DEBUG (MTD_DEBUG_LEVEL0, "%s: " "Failed write, page 0x%08x, ", __FUNCTION__, page); + return -EIO; + } + } else { + /* FIXME: Implement cached programming ! */ + /* wait until cache is ready*/ + // status = this->waitfunc (mtd, this, FL_CACHEDRPG); } return 0; } +#ifdef CONFIG_MTD_NAND_VERIFY_WRITE /** - * nand_read_page_hwecc - {REPLACABLE] hardware ecc based page read function - * @mtd: mtd info structure - * @chip: nand chip info structure - * @buf: buffer to store read data + * nand_verify_pages - [GENERIC] verify the chip contents after a write + * @mtd: MTD device structure + * @this: NAND chip structure + * @page: startpage inside the chip, must be called with (page & this->pagemask) + * @numpages: number of pages to verify + * @oob_buf: out of band data buffer + * @oobsel: out of band selecttion structre + * @chipnr: number of the current chip + * @oobmode: 1 = full buffer verify, 0 = ecc only * - * Not for syndrome calculating ecc controllers which need a special oob layout + * The NAND device assumes that it is always writing to a cleanly erased page. + * Hence, it performs its internal write verification only on bits that + * transitioned from 1 to 0. The device does NOT verify the whole page on a + * byte by byte basis. It is possible that the page was not completely erased + * or the page is becoming unusable due to wear. The read with ECC would catch + * the error later when the ECC page check fails, but we would rather catch + * it early in the page write stage. Better to write no data than invalid data. */ -static int nand_read_page_hwecc(struct mtd_info *mtd, struct nand_chip *chip, - uint8_t *buf) +static int nand_verify_pages (struct mtd_info *mtd, struct nand_chip *this, int page, int numpages, + u_char *oob_buf, struct nand_oobinfo *oobsel, int chipnr, int oobmode) { - int i, eccsize = chip->ecc.size; - int eccbytes = chip->ecc.bytes; - int eccsteps = chip->ecc.steps; - uint8_t *p = buf; - uint8_t *ecc_calc = chip->buffers.ecccalc; - uint8_t *ecc_code = chip->buffers.ecccode; - int *eccpos = chip->ecc.layout->eccpos; - - for (i = 0; eccsteps; eccsteps--, i += eccbytes, p += eccsize) { - chip->ecc.hwctl(mtd, NAND_ECC_READ); - chip->read_buf(mtd, p, eccsize); - chip->ecc.calculate(mtd, p, &ecc_calc[i]); - } - chip->read_buf(mtd, chip->oob_poi, mtd->oobsize); + int i, j, datidx = 0, oobofs = 0, res = -EIO; + int eccsteps = this->eccsteps; + int hweccbytes; + u_char oobdata[64]; + + hweccbytes = (this->options & NAND_HWECC_SYNDROME) ? (oobsel->eccbytes / eccsteps) : 0; + + /* Send command to read back the first page */ + this->cmdfunc (mtd, NAND_CMD_READ0, 0, page); + + for(;;) { + for (j = 0; j < eccsteps; j++) { + /* Loop through and verify the data */ + if (this->verify_buf(mtd, &this->data_poi[datidx], mtd->eccsize)) { + DEBUG (MTD_DEBUG_LEVEL0, "%s: " "Failed write verify, page 0x%08x ", __FUNCTION__, page); + goto out; + } + datidx += mtd->eccsize; + /* Have we a hw generator layout ? */ + if (!hweccbytes) + continue; + if (this->verify_buf(mtd, &this->oob_buf[oobofs], hweccbytes)) { + DEBUG (MTD_DEBUG_LEVEL0, "%s: " "Failed write verify, page 0x%08x ", __FUNCTION__, page); + goto out; + } + oobofs += hweccbytes; + } - for (i = 0; i < chip->ecc.total; i++) - ecc_code[i] = chip->oob_poi[eccpos[i]]; + /* check, if we must compare all data or if we just have to + * compare the ecc bytes + */ + if (oobmode) { + if (this->verify_buf(mtd, &oob_buf[oobofs], mtd->oobsize - hweccbytes * eccsteps)) { + DEBUG (MTD_DEBUG_LEVEL0, "%s: " "Failed write verify, page 0x%08x ", __FUNCTION__, page); + goto out; + } + } else { + /* Read always, else autoincrement fails */ + this->read_buf(mtd, oobdata, mtd->oobsize - hweccbytes * eccsteps); + + if (oobsel->useecc != MTD_NANDECC_OFF && !hweccbytes) { + int ecccnt = oobsel->eccbytes; + + for (i = 0; i < ecccnt; i++) { + int idx = oobsel->eccpos[i]; + if (oobdata[idx] != oob_buf[oobofs + idx] ) { + DEBUG (MTD_DEBUG_LEVEL0, + "%s: Failed ECC write " + "verify, page 0x%08x, " "%6i bytes were succesful\n", __FUNCTION__, page, i); + goto out; + } + } + } + } + oobofs += mtd->oobsize - hweccbytes * eccsteps; + page++; + numpages--; + + /* Apply delay or wait for ready/busy pin + * Do this before the AUTOINCR check, so no problems + * arise if a chip which does auto increment + * is marked as NOAUTOINCR by the board driver. + * Do this also before returning, so the chip is + * ready for the next command. + */ + if (!this->dev_ready) + udelay (this->chip_delay); + else + nand_wait_ready(mtd); - eccsteps = chip->ecc.steps; - p = buf; + /* All done, return happy */ + if (!numpages) + return 0; - for (i = 0 ; eccsteps; eccsteps--, i += eccbytes, p += eccsize) { - int stat; - stat = chip->ecc.correct(mtd, p, &ecc_code[i], &ecc_calc[i]); - if (stat == -1) - mtd->ecc_stats.failed++; - else - mtd->ecc_stats.corrected += stat; + /* Check, if the chip supports auto page increment */ + if (!NAND_CANAUTOINCR(this)) + this->cmdfunc (mtd, NAND_CMD_READ0, 0x00, page); } - return 0; + /* + * Terminate the read command. We come here in case of an error + * So we must issue a reset command. + */ +out: + this->cmdfunc (mtd, NAND_CMD_RESET, -1, -1); + return res; } +#endif /** - * nand_read_page_syndrome - {REPLACABLE] hardware ecc syndrom based page read - * @mtd: mtd info structure - * @chip: nand chip info structure - * @buf: buffer to store read data + * nand_read - [MTD Interface] MTD compability function for nand_do_read_ecc + * @mtd: MTD device structure + * @from: offset to read from + * @len: number of bytes to read + * @retlen: pointer to variable to store the number of read bytes + * @buf: the databuffer to put data * - * The hw generator calculates the error syndrome automatically. Therefor - * we need a special oob layout and handling. + * This function simply calls nand_do_read_ecc with oob buffer and oobsel = NULL + * and flags = 0xff */ -static int nand_read_page_syndrome(struct mtd_info *mtd, struct nand_chip *chip, - uint8_t *buf) +static int nand_read (struct mtd_info *mtd, loff_t from, size_t len, size_t * retlen, u_char * buf) { - int i, eccsize = chip->ecc.size; - int eccbytes = chip->ecc.bytes; - int eccsteps = chip->ecc.steps; - uint8_t *p = buf; - uint8_t *oob = chip->oob_poi; - - for (i = 0; eccsteps; eccsteps--, i += eccbytes, p += eccsize) { - int stat; - - chip->ecc.hwctl(mtd, NAND_ECC_READ); - chip->read_buf(mtd, p, eccsize); - - if (chip->ecc.prepad) { - chip->read_buf(mtd, oob, chip->ecc.prepad); - oob += chip->ecc.prepad; - } - - chip->ecc.hwctl(mtd, NAND_ECC_READSYN); - chip->read_buf(mtd, oob, eccbytes); - stat = chip->ecc.correct(mtd, p, oob, NULL); - - if (stat == -1) - mtd->ecc_stats.failed++; - else - mtd->ecc_stats.corrected += stat; - - oob += eccbytes; - - if (chip->ecc.postpad) { - chip->read_buf(mtd, oob, chip->ecc.postpad); - oob += chip->ecc.postpad; - } - } - - /* Calculate remaining oob bytes */ - i = mtd->oobsize - (oob - chip->oob_poi); - if (i) - chip->read_buf(mtd, oob, i); - - return 0; + return nand_do_read_ecc (mtd, from, len, retlen, buf, NULL, &mtd->oobinfo, 0xff); } + /** - * nand_transfer_oob - [Internal] Transfer oob to client buffer - * @chip: nand chip structure - * @oob: oob destination address - * @ops: oob ops structure + * nand_read_ecc - [MTD Interface] MTD compability function for nand_do_read_ecc + * @mtd: MTD device structure + * @from: offset to read from + * @len: number of bytes to read + * @retlen: pointer to variable to store the number of read bytes + * @buf: the databuffer to put data + * @oob_buf: filesystem supplied oob data buffer + * @oobsel: oob selection structure + * + * This function simply calls nand_do_read_ecc with flags = 0xff */ -static uint8_t *nand_transfer_oob(struct nand_chip *chip, uint8_t *oob, - struct mtd_oob_ops *ops) +static int nand_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) { - size_t len = ops->ooblen; - - switch(ops->mode) { - - case MTD_OOB_PLACE: - case MTD_OOB_RAW: - memcpy(oob, chip->oob_poi + ops->ooboffs, len); - return oob + len; - - case MTD_OOB_AUTO: { - struct nand_oobfree *free = chip->ecc.layout->oobfree; - uint32_t boffs = 0, roffs = ops->ooboffs; - size_t bytes = 0; - - for(; free->length && len; free++, len -= bytes) { - /* Read request not from offset 0 ? */ - if (unlikely(roffs)) { - if (roffs >= free->length) { - roffs -= free->length; - continue; - } - boffs = free->offset + roffs; - bytes = min_t(size_t, len, - (free->length - roffs)); - roffs = 0; - } else { - bytes = min_t(size_t, len, free->length); - boffs = free->offset; - } - memcpy(oob, chip->oob_poi + boffs, bytes); - oob += bytes; - } - return oob; - } - default: - BUG(); - } - return NULL; + /* use userspace supplied oobinfo, if zero */ + if (oobsel == NULL) + oobsel = &mtd->oobinfo; + return nand_do_read_ecc(mtd, from, len, retlen, buf, oob_buf, oobsel, 0xff); } + /** - * nand_do_read_ops - [Internal] Read data with ECC - * + * nand_do_read_ecc - [MTD Interface] Read data with ECC * @mtd: MTD device structure * @from: offset to read from - * @ops: oob ops structure + * @len: number of bytes to read + * @retlen: pointer to variable to store the number of read bytes + * @buf: the databuffer to put data + * @oob_buf: filesystem supplied oob data buffer (can be NULL) + * @oobsel: oob selection structure + * @flags: flag to indicate if nand_get_device/nand_release_device should be preformed + * and how many corrected error bits are acceptable: + * bits 0..7 - number of tolerable errors + * bit 8 - 0 == do not get/release chip, 1 == get/release chip * - * Internal function. Called with chip held. + * NAND read with ECC */ -static int nand_do_read_ops(struct mtd_info *mtd, loff_t from, - struct mtd_oob_ops *ops) +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) { - int chipnr, page, realpage, col, bytes, aligned; - struct nand_chip *chip = mtd->priv; - struct mtd_ecc_stats stats; - int blkcheck = (1 << (chip->phys_erase_shift - chip->page_shift)) - 1; - int sndcmd = 1; - int ret = 0; - uint32_t readlen = ops->len; - uint8_t *bufpoi, *oob, *buf; - stats = mtd->ecc_stats; + int i, j, col, realpage, page, end, ecc, chipnr, sndcmd = 1; + int read = 0, oob = 0, ecc_status = 0, ecc_failed = 0; + struct nand_chip *this = mtd->priv; + u_char *data_poi, *oob_data = oob_buf; + u_char ecc_calc[32]; + u_char ecc_code[32]; + int eccmode, eccsteps; + int *oob_config, datidx; + int blockcheck = (1 << (this->phys_erase_shift - this->page_shift)) - 1; + int eccbytes; + int compareecc = 1; + int oobreadlen; + + + DEBUG (MTD_DEBUG_LEVEL3, "nand_read_ecc: 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, "nand_read_ecc: Attempt read beyond end of device\n"); + *retlen = 0; + return -EINVAL; + } + + /* Grab the lock and see if the device is available */ + if (flags & NAND_GET_DEVICE) + nand_get_device (this, mtd, FL_READING); + + /* Autoplace of oob data ? Use the default placement scheme */ + if (oobsel->useecc == MTD_NANDECC_AUTOPLACE) + oobsel = this->autooob; + + eccmode = oobsel->useecc ? this->eccmode : NAND_ECC_NONE; + oob_config = oobsel->eccpos; + + /* Select the NAND device */ + chipnr = (int)(from >> this->chip_shift); + this->select_chip(mtd, chipnr); + + /* First we calculate the starting page */ + realpage = (int) (from >> this->page_shift); + page = realpage & this->pagemask; + + /* Get raw starting column */ + col = from & (mtd->oobblock - 1); + + end = mtd->oobblock; + ecc = this->eccsize; + eccbytes = this->eccbytes; - chipnr = (int)(from >> chip->chip_shift); - chip->select_chip(mtd, chipnr); + if ((eccmode == NAND_ECC_NONE) || (this->options & NAND_HWECC_SYNDROME)) + compareecc = 0; - realpage = (int)(from >> chip->page_shift); - page = realpage & chip->pagemask; + oobreadlen = mtd->oobsize; + if (this->options & NAND_HWECC_SYNDROME) + oobreadlen -= oobsel->eccbytes; + + /* Loop until all data read */ + while (read < len) { + + int aligned = (!col && (len - read) >= end); + /* + * If the read is not page aligned, we have to read into data buffer + * due to ecc, else we read into return buffer direct + */ + if (aligned) + data_poi = &buf[read]; + else + data_poi = this->data_buf; - col = (int)(from & (mtd->writesize - 1)); - chip->oob_poi = chip->buffers.oobrbuf; + /* Check, if we have this page in the buffer + * + * FIXME: Make it work when we must provide oob data too, + * check the usage of data_buf oob field + */ + if (realpage == this->pagebuf && !oob_buf) { + /* aligned read ? */ + if (aligned) + memcpy (data_poi, this->data_buf, end); + goto readdata; + } - buf = ops->datbuf; - oob = ops->oobbuf; + /* Check, if we must send the read command */ + if (sndcmd) { + this->cmdfunc (mtd, NAND_CMD_READ0, 0x00, page); + sndcmd = 0; + } - while(1) { - bytes = min(mtd->writesize - col, readlen); - aligned = (bytes == mtd->writesize); + /* get oob area, if we have no oob buffer from fs-driver */ + if (!oob_buf || oobsel->useecc == MTD_NANDECC_AUTOPLACE || + oobsel->useecc == MTD_NANDECC_AUTOPL_USR) + oob_data = &this->data_buf[end]; - /* Is the current page in the buffer ? */ - if (realpage != chip->pagebuf || oob) { - bufpoi = aligned ? buf : chip->buffers.databuf; + eccsteps = this->eccsteps; - if (likely(sndcmd)) { - chip->cmdfunc(mtd, NAND_CMD_READ0, 0x00, page); - sndcmd = 0; + switch (eccmode) { + case NAND_ECC_NONE: { /* No ECC, Read in a page */ + static unsigned long lastwhinge = 0; + if ((lastwhinge / HZ) != (jiffies / HZ)) { + printk (KERN_WARNING "Reading data from NAND FLASH without ECC is not recommended\n"); + lastwhinge = jiffies; } + this->read_buf(mtd, data_poi, end); + break; + } - /* Now read the page into the buffer */ - ret = chip->ecc.read_page(mtd, chip, bufpoi); - if (ret < 0) - break; + case NAND_ECC_SOFT: /* Software ECC 3/256: Read in a page + oob data */ + this->read_buf(mtd, data_poi, end); + for (i = 0, datidx = 0; eccsteps; eccsteps--, i+=3, datidx += ecc) + this->calculate_ecc(mtd, &data_poi[datidx], &ecc_calc[i]); + break; - /* Transfer not aligned data */ - if (!aligned) { - chip->pagebuf = realpage; - memcpy(buf, chip->buffers.databuf + col, bytes); + default: + for (i = 0, datidx = 0; eccsteps; eccsteps--, i+=eccbytes, datidx += ecc) { + this->enable_hwecc(mtd, NAND_ECC_READ); + this->read_buf(mtd, &data_poi[datidx], ecc); + + /* HW ecc with syndrome calculation must read the + * syndrome from flash immidiately after the data */ + if (!compareecc) { + /* Some hw ecc generators need to know when the + * syndrome is read from flash */ + this->enable_hwecc(mtd, NAND_ECC_READSYN); + this->read_buf(mtd, &oob_data[i], eccbytes); + /* We calc error correction directly, it checks the hw + * generator for an error, reads back the syndrome and + * does the error correction on the fly */ + ecc_status = this->correct_data(mtd, &data_poi[datidx], &oob_data[i], &ecc_code[i]); + if ((ecc_status == -1) || (ecc_status > (flags && 0xff))) { + DEBUG (MTD_DEBUG_LEVEL0, "nand_read_ecc: " + "Failed ECC read, page 0x%08x on chip %d\n", page, chipnr); + ecc_failed++; + } + } else { + this->calculate_ecc(mtd, &data_poi[datidx], &ecc_calc[i]); + } } + break; + } + + /* read oobdata */ + this->read_buf(mtd, &oob_data[mtd->oobsize - oobreadlen], oobreadlen); + + /* Skip ECC check, if not requested (ECC_NONE or HW_ECC with syndromes) */ + if (!compareecc) + goto readoob; + + /* Pick the ECC bytes out of the oob data */ + for (j = 0; j < oobsel->eccbytes; j++) + ecc_code[j] = oob_data[oob_config[j]]; - buf += bytes; + /* correct data, if neccecary */ + for (i = 0, j = 0, datidx = 0; i < this->eccsteps; i++, datidx += ecc) { + ecc_status = this->correct_data(mtd, &data_poi[datidx], &ecc_code[j], &ecc_calc[j]); - if (unlikely(oob)) { - /* Raw mode does data:oob:data:oob */ - if (ops->mode != MTD_OOB_RAW) - oob = nand_transfer_oob(chip, oob, ops); - else - buf = nand_transfer_oob(chip, buf, ops); + /* Get next chunk of ecc bytes */ + j += eccbytes; + + /* Check, if we have a fs supplied oob-buffer, + * This is the legacy mode. Used by YAFFS1 + * Should go away some day + */ + if (oob_buf && oobsel->useecc == MTD_NANDECC_PLACE) { + int *p = (int *)(&oob_data[mtd->oobsize]); + p[i] = ecc_status; } - if (!(chip->options & NAND_NO_READRDY)) { - /* - * Apply delay or wait for ready/busy pin. Do - * this before the AUTOINCR check, so no - * problems arise if a chip which does auto - * increment is marked as NOAUTOINCR by the - * board driver. - */ - if (!chip->dev_ready) - udelay(chip->chip_delay); - else - nand_wait_ready(mtd); + if ((ecc_status == -1) || (ecc_status > (flags && 0xff))) { + DEBUG (MTD_DEBUG_LEVEL0, "nand_read_ecc: " "Failed ECC read, page 0x%08x\n", page); + ecc_failed++; } - } else { - memcpy(buf, chip->buffers.databuf + col, bytes); - buf += bytes; } - readlen -= bytes; + readoob: + /* check, if we have a fs supplied oob-buffer */ + if (oob_buf) { + /* without autoplace. Legacy mode used by YAFFS1 */ + switch(oobsel->useecc) { + case MTD_NANDECC_AUTOPLACE: + case MTD_NANDECC_AUTOPL_USR: + /* Walk through the autoplace chunks */ + for (i = 0; oobsel->oobfree[i][1]; i++) { + int from = oobsel->oobfree[i][0]; + int num = oobsel->oobfree[i][1]; + memcpy(&oob_buf[oob], &oob_data[from], num); + oob += num; + } + break; + case MTD_NANDECC_PLACE: + /* YAFFS1 legacy mode */ + oob_data += this->eccsteps * sizeof (int); + default: + oob_data += mtd->oobsize; + } + } + readdata: + /* Partial page read, transfer data into fs buffer */ + if (!aligned) { + for (j = col; j < end && read < len; j++) + buf[read++] = data_poi[j]; + this->pagebuf = realpage; + } else + read += mtd->oobblock; + + /* Apply delay or wait for ready/busy pin + * Do this before the AUTOINCR check, so no problems + * arise if a chip which does auto increment + * is marked as NOAUTOINCR by the board driver. + */ + if (!this->dev_ready) + udelay (this->chip_delay); + else + nand_wait_ready(mtd); - if (!readlen) + if (read == len) break; /* For subsequent reads align to page boundary. */ @@ -1037,777 +1336,701 @@ static int nand_do_read_ops(struct mtd_info *mtd, loff_t from, /* Increment page address */ realpage++; - page = realpage & chip->pagemask; + page = realpage & this->pagemask; /* Check, if we cross a chip boundary */ if (!page) { chipnr++; - chip->select_chip(mtd, -1); - chip->select_chip(mtd, chipnr); + this->select_chip(mtd, -1); + this->select_chip(mtd, chipnr); } - /* Check, if the chip supports auto page increment * or if we have hit a block boundary. - */ - if (!NAND_CANAUTOINCR(chip) || !(page & blkcheck)) + */ + if (!NAND_CANAUTOINCR(this) || !(page & blockcheck)) sndcmd = 1; } - ops->retlen = ops->len - (size_t) readlen; - - if (ret) - return ret; - - if (mtd->ecc_stats.failed - stats.failed) - return -EBADMSG; + /* Deselect and wake up anyone waiting on the device */ + if (flags & NAND_GET_DEVICE) + nand_release_device(mtd); - return mtd->ecc_stats.corrected - stats.corrected ? -EUCLEAN : 0; + /* + * Return success, if no ECC failures, else -EBADMSG + * fs driver will take care of that, because + * retlen == desired len and result == -EBADMSG + */ + *retlen = read; + return ecc_failed ? -EBADMSG : 0; } /** - * nand_read - [MTD Interface] MTD compability function for nand_do_read_ecc + * nand_read_oob - [MTD Interface] NAND read out-of-band * @mtd: MTD device structure * @from: offset to read from * @len: number of bytes to read * @retlen: pointer to variable to store the number of read bytes * @buf: the databuffer to put data * - * Get hold of the chip and call nand_do_read + * NAND read out-of-band data from the spare area */ -static int nand_read(struct mtd_info *mtd, loff_t from, size_t len, - size_t *retlen, uint8_t *buf) +static int nand_read_oob (struct mtd_info *mtd, loff_t from, size_t len, size_t * retlen, u_char * buf) { - struct nand_chip *chip = mtd->priv; - int ret; + int i, col, page, chipnr; + struct nand_chip *this = mtd->priv; + int blockcheck = (1 << (this->phys_erase_shift - this->page_shift)) - 1; + + DEBUG (MTD_DEBUG_LEVEL3, "nand_read_oob: from = 0x%08x, len = %i\n", (unsigned int) from, (int) len); + + /* Shift to get page */ + page = (int)(from >> this->page_shift); + chipnr = (int)(from >> this->chip_shift); + + /* Mask to get column */ + col = from & (mtd->oobsize - 1); + + /* Initialize return length value */ + *retlen = 0; /* Do not allow reads past end of device */ - if ((from + len) > mtd->size) + if ((from + len) > mtd->size) { + DEBUG (MTD_DEBUG_LEVEL0, "nand_read_oob: Attempt read beyond end of device\n"); + *retlen = 0; return -EINVAL; - if (!len) - return 0; + } - nand_get_device(chip, mtd, FL_READING); + /* Grab the lock and see if the device is available */ + nand_get_device (this, mtd , FL_READING); + + /* Select the NAND device */ + this->select_chip(mtd, chipnr); - chip->ops.len = len; - chip->ops.datbuf = buf; - chip->ops.oobbuf = NULL; + /* Send the read command */ + this->cmdfunc (mtd, NAND_CMD_READOOB, col, page & this->pagemask); + /* + * Read the data, if we read more than one page + * oob data, let the device transfer the data ! + */ + i = 0; + while (i < len) { + int thislen = mtd->oobsize - col; + thislen = min_t(int, thislen, len); + this->read_buf(mtd, &buf[i], thislen); + i += thislen; + + /* Read more ? */ + if (i < len) { + page++; + col = 0; + + /* Check, if we cross a chip boundary */ + if (!(page & this->pagemask)) { + chipnr++; + this->select_chip(mtd, -1); + this->select_chip(mtd, chipnr); + } - ret = nand_do_read_ops(mtd, from, &chip->ops); + /* Apply delay or wait for ready/busy pin + * Do this before the AUTOINCR check, so no problems + * arise if a chip which does auto increment + * is marked as NOAUTOINCR by the board driver. + */ + if (!this->dev_ready) + udelay (this->chip_delay); + else + nand_wait_ready(mtd); - *retlen = chip->ops.retlen; + /* Check, if the chip supports auto page increment + * or if we have hit a block boundary. + */ + if (!NAND_CANAUTOINCR(this) || !(page & blockcheck)) { + /* For subsequent page reads set offset to 0 */ + this->cmdfunc (mtd, NAND_CMD_READOOB, 0x0, page & this->pagemask); + } + } + } + /* Deselect and wake up anyone waiting on the device */ nand_release_device(mtd); - return ret; + /* Return happy */ + *retlen = len; + return 0; } /** - * nand_read_oob_std - [REPLACABLE] the most common OOB data read function - * @mtd: mtd info structure - * @chip: nand chip info structure - * @page: page number to read - * @sndcmd: flag whether to issue read command or not + * nand_read_raw - [GENERIC] Read raw data including oob into buffer + * @mtd: MTD device structure + * @buf: temporary buffer + * @from: offset to read from + * @len: number of bytes to read + * @ooblen: number of oob data bytes to read + * + * Read raw data including oob into buffer */ -static int nand_read_oob_std(struct mtd_info *mtd, struct nand_chip *chip, - int page, int sndcmd) +int nand_read_raw (struct mtd_info *mtd, uint8_t *buf, loff_t from, size_t len, size_t ooblen) { - if (sndcmd) { - chip->cmdfunc(mtd, NAND_CMD_READOOB, 0, page); - sndcmd = 0; - } - chip->read_buf(mtd, chip->oob_poi, mtd->oobsize); - return sndcmd; -} - -/** - * nand_read_oob_syndrome - [REPLACABLE] OOB data read function for HW ECC - * with syndromes - * @mtd: mtd info structure - * @chip: nand chip info structure - * @page: page number to read - * @sndcmd: flag whether to issue read command or not - */ -static int nand_read_oob_syndrome(struct mtd_info *mtd, struct nand_chip *chip, - int page, int sndcmd) -{ - uint8_t *buf = chip->oob_poi; - int length = mtd->oobsize; - int chunk = chip->ecc.bytes + chip->ecc.prepad + chip->ecc.postpad; - int eccsize = chip->ecc.size; - uint8_t *bufpoi = buf; - int i, toread, sndrnd = 0, pos; - - chip->cmdfunc(mtd, NAND_CMD_READ0, chip->ecc.size, page); - for (i = 0; i < chip->ecc.steps; i++) { - if (sndrnd) { - pos = eccsize + i * (eccsize + chunk); - if (mtd->writesize > 512) - chip->cmdfunc(mtd, NAND_CMD_RNDOUT, pos, -1); - else - chip->cmdfunc(mtd, NAND_CMD_READ0, pos, page); - } else - sndrnd = 1; - toread = min_t(int, length, chunk); - chip->read_buf(mtd, bufpoi, toread); - bufpoi += toread; - length -= toread; - } - if (length > 0) - chip->read_buf(mtd, bufpoi, length); - - return 1; -} - -/** - * nand_write_oob_std - [REPLACABLE] the most common OOB data write function - * @mtd: mtd info structure - * @chip: nand chip info structure - * @page: page number to write - */ -static int nand_write_oob_std(struct mtd_info *mtd, struct nand_chip *chip, - int page) -{ - int status = 0; - const uint8_t *buf = chip->oob_poi; - int length = mtd->oobsize; - - chip->cmdfunc(mtd, NAND_CMD_SEQIN, mtd->writesize, page); - chip->write_buf(mtd, buf, length); - /* Send command to program the OOB data */ - chip->cmdfunc(mtd, NAND_CMD_PAGEPROG, -1, -1); - - status = chip->waitfunc(mtd, chip); - - return status & NAND_STATUS_FAIL ? -EIO : 0; -} - -/** - * nand_write_oob_syndrome - [REPLACABLE] OOB data write function for HW ECC - * with syndrome - only for large page flash ! - * @mtd: mtd info structure - * @chip: nand chip info structure - * @page: page number to write - */ -static int nand_write_oob_syndrome(struct mtd_info *mtd, - struct nand_chip *chip, int page) -{ - int chunk = chip->ecc.bytes + chip->ecc.prepad + chip->ecc.postpad; - int eccsize = chip->ecc.size, length = mtd->oobsize; - int i, len, pos, status = 0, sndcmd = 0, steps = chip->ecc.steps; - const uint8_t *bufpoi = chip->oob_poi; - - /* - * data-ecc-data-ecc ... ecc-oob - * or - * data-pad-ecc-pad-data-pad .... ecc-pad-oob - */ - if (!chip->ecc.prepad && !chip->ecc.postpad) { - pos = steps * (eccsize + chunk); - steps = 0; - } else - pos = eccsize; + struct nand_chip *this = mtd->priv; + int page = (int) (from >> this->page_shift); + int chip = (int) (from >> this->chip_shift); + int sndcmd = 1; + int cnt = 0; + int pagesize = mtd->oobblock + mtd->oobsize; + int blockcheck = (1 << (this->phys_erase_shift - this->page_shift)) - 1; - chip->cmdfunc(mtd, NAND_CMD_SEQIN, pos, page); - for (i = 0; i < steps; i++) { - if (sndcmd) { - if (mtd->writesize <= 512) { - uint32_t fill = 0xFFFFFFFF; - - len = eccsize; - while (len > 0) { - int num = min_t(int, len, 4); - chip->write_buf(mtd, (uint8_t *)&fill, - num); - len -= num; - } - } else { - pos = eccsize + i * (eccsize + chunk); - chip->cmdfunc(mtd, NAND_CMD_RNDIN, pos, -1); - } - } else - sndcmd = 1; - len = min_t(int, length, chunk); - chip->write_buf(mtd, bufpoi, len); - bufpoi += len; - length -= len; + /* Do not allow reads past end of device */ + if ((from + len) > mtd->size) { + DEBUG (MTD_DEBUG_LEVEL0, "nand_read_raw: Attempt read beyond end of device\n"); + return -EINVAL; } - if (length > 0) - chip->write_buf(mtd, bufpoi, length); - - chip->cmdfunc(mtd, NAND_CMD_PAGEPROG, -1, -1); - status = chip->waitfunc(mtd, chip); - - return status & NAND_STATUS_FAIL ? -EIO : 0; -} - -/** - * nand_do_read_oob - [Intern] NAND read out-of-band - * @mtd: MTD device structure - * @from: offset to read from - * @ops: oob operations description structure - * - * NAND read out-of-band data from the spare area - */ -static int nand_do_read_oob(struct mtd_info *mtd, loff_t from, - struct mtd_oob_ops *ops) -{ - int page, realpage, chipnr, sndcmd = 1; - struct nand_chip *chip = mtd->priv; - int blkcheck = (1 << (chip->phys_erase_shift - chip->page_shift)) - 1; - int readlen = ops->len; - uint8_t *buf = ops->oobbuf; - - DEBUG(MTD_DEBUG_LEVEL3, "nand_read_oob: from = 0x%08Lx, len = %i\n", - (unsigned long long)from, readlen); - - chipnr = (int)(from >> chip->chip_shift); - chip->select_chip(mtd, chipnr); - /* Shift to get page */ - realpage = (int)(from >> chip->page_shift); - page = realpage & chip->pagemask; + /* Grab the lock and see if the device is available */ + nand_get_device (this, mtd , FL_READING); - chip->oob_poi = chip->buffers.oobrbuf; + this->select_chip (mtd, chip); - while(1) { - sndcmd = chip->ecc.read_oob(mtd, chip, page, sndcmd); - buf = nand_transfer_oob(chip, buf, ops); + /* Add requested oob length */ + len += ooblen; - if (!(chip->options & NAND_NO_READRDY)) { - /* - * Apply delay or wait for ready/busy pin. Do this - * before the AUTOINCR check, so no problems arise if a - * chip which does auto increment is marked as - * NOAUTOINCR by the board driver. - */ - if (!chip->dev_ready) - udelay(chip->chip_delay); - else - nand_wait_ready(mtd); - } + while (len) { + if (sndcmd) + this->cmdfunc (mtd, NAND_CMD_READ0, 0, page & this->pagemask); + sndcmd = 0; - readlen -= ops->ooblen; - if (!readlen) - break; + this->read_buf (mtd, &buf[cnt], pagesize); - /* Increment page address */ - realpage++; + len -= pagesize; + cnt += pagesize; + page++; - page = realpage & chip->pagemask; - /* Check, if we cross a chip boundary */ - if (!page) { - chipnr++; - chip->select_chip(mtd, -1); - chip->select_chip(mtd, chipnr); - } + if (!this->dev_ready) + udelay (this->chip_delay); + else + nand_wait_ready(mtd); - /* Check, if the chip supports auto page increment - * or if we have hit a block boundary. - */ - if (!NAND_CANAUTOINCR(chip) || !(page & blkcheck)) + /* Check, if the chip supports auto page increment */ + if (!NAND_CANAUTOINCR(this) || !(page & blockcheck)) sndcmd = 1; } - ops->retlen = ops->len; + /* Deselect and wake up anyone waiting on the device */ + nand_release_device(mtd); return 0; } + /** - * nand_read_oob - [MTD Interface] NAND read data and/or out-of-band + * nand_prepare_oobbuf - [GENERIC] Prepare the out of band buffer * @mtd: MTD device structure - * @from: offset to read from - * @ops: oob operation description structure + * @fsbuf: buffer given by fs driver + * @oobsel: out of band selection structre + * @autoplace: 1 = place given buffer into the oob bytes + * @numpages: number of pages to prepare * - * NAND read data and/or out-of-band data - */ -static int nand_read_oob(struct mtd_info *mtd, loff_t from, - struct mtd_oob_ops *ops) + * Return: + * 1. Filesystem buffer available and autoplacement is off, + * return filesystem buffer + * 2. No filesystem buffer or autoplace is off, return internal + * buffer + * 3. Filesystem buffer is given and autoplace selected + * put data from fs buffer into internal buffer and + * retrun internal buffer + * + * Note: The internal buffer is filled with 0xff. This must + * be done only once, when no autoplacement happens + * Autoplacement sets the buffer dirty flag, which + * forces the 0xff fill before using the buffer again. + * +*/ +static u_char * nand_prepare_oobbuf (struct mtd_info *mtd, u_char *fsbuf, struct nand_oobinfo *oobsel, + int autoplace, int numpages) { - int (*read_page)(struct mtd_info *mtd, struct nand_chip *chip, - uint8_t *buf) = NULL; - struct nand_chip *chip = mtd->priv; - int ret = -ENOTSUPP; - - ops->retlen = 0; - - /* Do not allow reads past end of device */ - if ((from + ops->len) > mtd->size) { - DEBUG(MTD_DEBUG_LEVEL0, "nand_read_oob: " - "Attempt read beyond end of device\n"); - return -EINVAL; + struct nand_chip *this = mtd->priv; + int i, len, ofs; + + /* Zero copy fs supplied buffer */ + if (fsbuf && !autoplace) + return fsbuf; + + /* Check, if the buffer must be filled with ff again */ + if (this->oobdirty) { + memset (this->oob_buf, 0xff, + mtd->oobsize << (this->phys_erase_shift - this->page_shift)); + this->oobdirty = 0; } - nand_get_device(chip, mtd, FL_READING); - - switch(ops->mode) { - case MTD_OOB_PLACE: - case MTD_OOB_AUTO: - break; - - case MTD_OOB_RAW: - /* Replace the read_page algorithm temporary */ - read_page = chip->ecc.read_page; - chip->ecc.read_page = nand_read_page_raw; - break; - - default: - goto out; + /* If we have no autoplacement or no fs buffer use the internal one */ + if (!autoplace || !fsbuf) + return this->oob_buf; + + /* Walk through the pages and place the data */ + this->oobdirty = 1; + ofs = 0; + while (numpages--) { + for (i = 0, len = 0; len < mtd->oobavail; i++) { + int to = ofs + oobsel->oobfree[i][0]; + int num = oobsel->oobfree[i][1]; + memcpy (&this->oob_buf[to], fsbuf, num); + len += num; + fsbuf += num; + } + ofs += mtd->oobavail; } - - if (!ops->datbuf) - ret = nand_do_read_oob(mtd, from, ops); - else - ret = nand_do_read_ops(mtd, from, ops); - - if (unlikely(ops->mode == MTD_OOB_RAW)) - chip->ecc.read_page = read_page; - out: - nand_release_device(mtd); - return ret; + return this->oob_buf; } +#define NOTALIGNED(x) (x & (mtd->oobblock-1)) != 0 /** - * nand_write_page_raw - [Intern] raw page write function - * @mtd: mtd info structure - * @chip: nand chip info structure - * @buf: data buffer - */ -static void nand_write_page_raw(struct mtd_info *mtd, struct nand_chip *chip, - const uint8_t *buf) -{ - chip->write_buf(mtd, buf, mtd->writesize); - chip->write_buf(mtd, chip->oob_poi, mtd->oobsize); -} - -/** - * nand_write_page_swecc - {REPLACABLE] software ecc based page write function - * @mtd: mtd info structure - * @chip: nand chip info structure - * @buf: data buffer - */ -static void nand_write_page_swecc(struct mtd_info *mtd, struct nand_chip *chip, - const uint8_t *buf) -{ - int i, eccsize = chip->ecc.size; - int eccbytes = chip->ecc.bytes; - int eccsteps = chip->ecc.steps; - uint8_t *ecc_calc = chip->buffers.ecccalc; - const uint8_t *p = buf; - int *eccpos = chip->ecc.layout->eccpos; - - /* Software ecc calculation */ - for (i = 0; eccsteps; eccsteps--, i += eccbytes, p += eccsize) - chip->ecc.calculate(mtd, p, &ecc_calc[i]); - - for (i = 0; i < chip->ecc.total; i++) - chip->oob_poi[eccpos[i]] = ecc_calc[i]; - - nand_write_page_raw(mtd, chip, buf); -} - -/** - * nand_write_page_hwecc - {REPLACABLE] hardware ecc based page write function - * @mtd: mtd info structure - * @chip: nand chip info structure - * @buf: data buffer - */ -static void nand_write_page_hwecc(struct mtd_info *mtd, struct nand_chip *chip, - const uint8_t *buf) + * nand_write - [MTD Interface] compability function for nand_write_ecc + * @mtd: MTD device structure + * @to: offset to write to + * @len: number of bytes to write + * @retlen: pointer to variable to store the number of written bytes + * @buf: the data to write + * + * This function simply calls nand_write_ecc with oob buffer and oobsel = NULL + * +*/ +static int nand_write (struct mtd_info *mtd, loff_t to, size_t len, size_t * retlen, const u_char * buf) { - int i, eccsize = chip->ecc.size; - int eccbytes = chip->ecc.bytes; - int eccsteps = chip->ecc.steps; - uint8_t *ecc_calc = chip->buffers.ecccalc; - const uint8_t *p = buf; - int *eccpos = chip->ecc.layout->eccpos; - - for (i = 0; eccsteps; eccsteps--, i += eccbytes, p += eccsize) { - chip->ecc.hwctl(mtd, NAND_ECC_WRITE); - chip->write_buf(mtd, p, eccsize); - chip->ecc.calculate(mtd, p, &ecc_calc[i]); - } - - for (i = 0; i < chip->ecc.total; i++) - chip->oob_poi[eccpos[i]] = ecc_calc[i]; - - chip->write_buf(mtd, chip->oob_poi, mtd->oobsize); + return (nand_write_ecc (mtd, to, len, retlen, buf, NULL, NULL)); } /** - * nand_write_page_syndrome - {REPLACABLE] hardware ecc syndrom based page write - * @mtd: mtd info structure - * @chip: nand chip info structure - * @buf: data buffer + * nand_write_ecc - [MTD Interface] NAND write with ECC + * @mtd: MTD device structure + * @to: offset to write to + * @len: number of bytes to write + * @retlen: pointer to variable to store the number of written bytes + * @buf: the data to write + * @eccbuf: filesystem supplied oob data buffer + * @oobsel: oob selection structure * - * The hw generator calculates the error syndrome automatically. Therefor - * we need a special oob layout and handling. + * NAND write with ECC */ -static void nand_write_page_syndrome(struct mtd_info *mtd, - struct nand_chip *chip, const uint8_t *buf) +static int nand_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 i, eccsize = chip->ecc.size; - int eccbytes = chip->ecc.bytes; - int eccsteps = chip->ecc.steps; - const uint8_t *p = buf; - uint8_t *oob = chip->oob_poi; + int startpage, page, ret = -EIO, oob = 0, written = 0, chipnr; + int autoplace = 0, numpages, totalpages; + struct nand_chip *this = mtd->priv; + u_char *oobbuf, *bufstart; + int ppblock = (1 << (this->phys_erase_shift - this->page_shift)); - for (i = 0; eccsteps; eccsteps--, i += eccbytes, p += eccsize) { + DEBUG (MTD_DEBUG_LEVEL3, "nand_write_ecc: to = 0x%08x, len = %i\n", (unsigned int) to, (int) len); - chip->ecc.hwctl(mtd, NAND_ECC_WRITE); - chip->write_buf(mtd, p, eccsize); + /* Initialize retlen, in case of early exit */ + *retlen = 0; - if (chip->ecc.prepad) { - chip->write_buf(mtd, oob, chip->ecc.prepad); - oob += chip->ecc.prepad; - } - - chip->ecc.calculate(mtd, p, oob); - chip->write_buf(mtd, oob, eccbytes); - oob += eccbytes; - - if (chip->ecc.postpad) { - chip->write_buf(mtd, oob, chip->ecc.postpad); - oob += chip->ecc.postpad; - } + /* Do not allow write past end of device */ + if ((to + len) > mtd->size) { + DEBUG (MTD_DEBUG_LEVEL0, "nand_write_ecc: Attempt to write past end of page\n"); + return -EINVAL; } - /* Calculate remaining oob bytes */ - i = mtd->oobsize - (oob - chip->oob_poi); - if (i) - chip->write_buf(mtd, oob, i); -} - -/** - * nand_write_page - [INTERNAL] write one page - * @mtd: MTD device structure - * @chip: NAND chip descriptor - * @buf: the data to write - * @page: page number to write - * @cached: cached programming - */ -static int nand_write_page(struct mtd_info *mtd, struct nand_chip *chip, - const uint8_t *buf, int page, int cached) -{ - int status; + /* reject writes, which are not page aligned */ + if (NOTALIGNED (to) || NOTALIGNED(len)) { + printk (KERN_NOTICE "nand_write_ecc: Attempt to write not page aligned data\n"); + return -EINVAL; + } - chip->cmdfunc(mtd, NAND_CMD_SEQIN, 0x00, page); + /* Grab the lock and see if the device is available */ + nand_get_device (this, mtd, FL_WRITING); - chip->ecc.write_page(mtd, chip, buf); + /* Calculate chipnr */ + chipnr = (int)(to >> this->chip_shift); + /* Select the NAND device */ + this->select_chip(mtd, chipnr); - /* - * Cached progamming disabled for now, Not sure if its worth the - * trouble. The speed gain is not very impressive. (2.3->2.6Mib/s) - */ - cached = 0; + /* Check, if it is write protected */ + if (nand_check_wp(mtd)) + goto out; - if (!cached || !(chip->options & NAND_CACHEPRG)) { + /* if oobsel is NULL, use chip defaults */ + if (oobsel == NULL) + oobsel = &mtd->oobinfo; - chip->cmdfunc(mtd, NAND_CMD_PAGEPROG, -1, -1); - status = chip->waitfunc(mtd, chip); - /* - * See if operation failed and additional status checks are - * available - */ - if ((status & NAND_STATUS_FAIL) && (chip->errstat)) - status = chip->errstat(mtd, chip, FL_WRITING, status, - page); - - if (status & NAND_STATUS_FAIL) - return -EIO; - } else { - chip->cmdfunc(mtd, NAND_CMD_CACHEDPROG, -1, -1); - status = chip->waitfunc(mtd, chip); + /* Autoplace of oob data ? Use the default placement scheme */ + if (oobsel->useecc == MTD_NANDECC_AUTOPLACE) { + oobsel = this->autooob; + autoplace = 1; } + if (oobsel->useecc == MTD_NANDECC_AUTOPL_USR) + autoplace = 1; -#ifdef CONFIG_MTD_NAND_VERIFY_WRITE - /* Send command to read back the data */ - chip->cmdfunc(mtd, NAND_CMD_READ0, 0, page); - - if (chip->verify_buf(mtd, buf, mtd->writesize)) - return -EIO; -#endif - return 0; -} + /* Setup variables and oob buffer */ + totalpages = len >> this->page_shift; + page = (int) (to >> this->page_shift); + /* Invalidate the page cache, if we write to the cached page */ + if (page <= this->pagebuf && this->pagebuf < (page + totalpages)) + this->pagebuf = -1; + + /* Set it relative to chip */ + page &= this->pagemask; + startpage = page; + /* Calc number of pages we can write in one go */ + numpages = min (ppblock - (startpage & (ppblock - 1)), totalpages); + oobbuf = nand_prepare_oobbuf (mtd, eccbuf, oobsel, autoplace, numpages); + bufstart = (u_char *)buf; + + /* Loop until all data is written */ + while (written < len) { + + this->data_poi = (u_char*) &buf[written]; + /* Write one page. If this is the last page to write + * or the last page in this block, then use the + * real pageprogram command, else select cached programming + * if supported by the chip. + */ + ret = nand_write_page (mtd, this, page, &oobbuf[oob], oobsel, (--numpages > 0)); + if (ret) { + DEBUG (MTD_DEBUG_LEVEL0, "nand_write_ecc: write_page failed %d\n", ret); + goto out; + } + /* Next oob page */ + oob += mtd->oobsize; + /* Update written bytes count */ + written += mtd->oobblock; + if (written == len) + goto cmp; -/** - * nand_fill_oob - [Internal] Transfer client buffer to oob - * @chip: nand chip structure - * @oob: oob data buffer - * @ops: oob ops structure - */ -static uint8_t *nand_fill_oob(struct nand_chip *chip, uint8_t *oob, - struct mtd_oob_ops *ops) -{ - size_t len = ops->ooblen; - - switch(ops->mode) { - - case MTD_OOB_PLACE: - case MTD_OOB_RAW: - memcpy(chip->oob_poi + ops->ooboffs, oob, len); - return oob + len; - - case MTD_OOB_AUTO: { - struct nand_oobfree *free = chip->ecc.layout->oobfree; - uint32_t boffs = 0, woffs = ops->ooboffs; - size_t bytes = 0; - - for(; free->length && len; free++, len -= bytes) { - /* Write request not from offset 0 ? */ - if (unlikely(woffs)) { - if (woffs >= free->length) { - woffs -= free->length; - continue; - } - boffs = free->offset + woffs; - bytes = min_t(size_t, len, - (free->length - woffs)); - woffs = 0; - } else { - bytes = min_t(size_t, len, free->length); - boffs = free->offset; + /* Increment page address */ + page++; + + /* Have we hit a block boundary ? Then we have to verify and + * if verify is ok, we have to setup the oob buffer for + * the next pages. + */ + if (!(page & (ppblock - 1))){ + int ofs; + this->data_poi = bufstart; + ret = nand_verify_pages (mtd, this, startpage, + page - startpage, + oobbuf, oobsel, chipnr, (eccbuf != NULL)); + if (ret) { + DEBUG (MTD_DEBUG_LEVEL0, "nand_write_ecc: verify_pages failed %d\n", ret); + goto out; + } + *retlen = written; + + ofs = autoplace ? mtd->oobavail : mtd->oobsize; + if (eccbuf) + eccbuf += (page - startpage) * ofs; + totalpages -= page - startpage; + numpages = min (totalpages, ppblock); + page &= this->pagemask; + startpage = page; + oobbuf = nand_prepare_oobbuf (mtd, eccbuf, oobsel, + autoplace, numpages); + oob = 0; + /* Check, if we cross a chip boundary */ + if (!page) { + chipnr++; + this->select_chip(mtd, -1); + this->select_chip(mtd, chipnr); } - memcpy(chip->oob_poi + boffs, oob, bytes); - oob += bytes; } - return oob; - } - default: - BUG(); } - return NULL; + /* Verify the remaining pages */ +cmp: + this->data_poi = bufstart; + ret = nand_verify_pages (mtd, this, startpage, totalpages, + oobbuf, oobsel, chipnr, (eccbuf != NULL)); + if (!ret) + *retlen = written; + else + DEBUG (MTD_DEBUG_LEVEL0, "nand_write_ecc: verify_pages failed %d\n", ret); + +out: + /* Deselect and wake up anyone waiting on the device */ + nand_release_device(mtd); + + return ret; } -#define NOTALIGNED(x) (x & (mtd->writesize-1)) != 0 /** - * nand_do_write_ops - [Internal] NAND write with ECC + * nand_write_oob - [MTD Interface] NAND write out-of-band * @mtd: MTD device structure * @to: offset to write to - * @ops: oob operations description structure + * @len: number of bytes to write + * @retlen: pointer to variable to store the number of written bytes + * @buf: the data to write * - * NAND write with ECC + * NAND write out-of-band */ -static int nand_do_write_ops(struct mtd_info *mtd, loff_t to, - struct mtd_oob_ops *ops) +static int nand_write_oob (struct mtd_info *mtd, loff_t to, size_t len, size_t * retlen, const u_char * buf) { - int chipnr, realpage, page, blockmask; - struct nand_chip *chip = mtd->priv; - uint32_t writelen = ops->len; - uint8_t *oob = ops->oobbuf; - uint8_t *buf = ops->datbuf; - int bytes = mtd->writesize; - int ret; + int column, page, status, ret = -EIO, chipnr; + struct nand_chip *this = mtd->priv; - ops->retlen = 0; + DEBUG (MTD_DEBUG_LEVEL3, "nand_write_oob: to = 0x%08x, len = %i\n", (unsigned int) to, (int) len); - /* reject writes, which are not page aligned */ - if (NOTALIGNED(to) || NOTALIGNED(ops->len)) { - printk(KERN_NOTICE "nand_write: " - "Attempt to write not page aligned data\n"); - return -EINVAL; - } + /* Shift to get page */ + page = (int) (to >> this->page_shift); + chipnr = (int) (to >> this->chip_shift); - if (!writelen) - return 0; + /* Mask to get column */ + column = to & (mtd->oobsize - 1); - chipnr = (int)(to >> chip->chip_shift); - chip->select_chip(mtd, chipnr); + /* Initialize return length value */ + *retlen = 0; - /* Check, if it is write protected */ - if (nand_check_wp(mtd)) - return -EIO; + /* Do not allow write past end of page */ + if ((column + len) > mtd->oobsize) { + DEBUG (MTD_DEBUG_LEVEL0, "nand_write_oob: Attempt to write past end of page\n"); + return -EINVAL; + } - realpage = (int)(to >> chip->page_shift); - page = realpage & chip->pagemask; - blockmask = (1 << (chip->phys_erase_shift - chip->page_shift)) - 1; + /* Grab the lock and see if the device is available */ + nand_get_device (this, mtd, FL_WRITING); - /* Invalidate the page cache, when we write to the cached page */ - if (to <= (chip->pagebuf << chip->page_shift) && - (chip->pagebuf << chip->page_shift) < (to + ops->len)) - chip->pagebuf = -1; + /* Select the NAND device */ + this->select_chip(mtd, chipnr); - chip->oob_poi = chip->buffers.oobwbuf; + /* Reset the chip. Some chips (like the Toshiba TC5832DC found + in one of my DiskOnChip 2000 test units) will clear the whole + data page too if we don't do this. I have no clue why, but + I seem to have 'fixed' it in the doc2000 driver in + August 1999. dwmw2. */ + this->cmdfunc(mtd, NAND_CMD_RESET, -1, -1); - while(1) { - int cached = writelen > bytes && page != blockmask; + /* Check, if it is write protected */ + if (nand_check_wp(mtd)) + goto out; - if (unlikely(oob)) - oob = nand_fill_oob(chip, oob, ops); + /* Invalidate the page cache, if we write to the cached page */ + if (page == this->pagebuf) + this->pagebuf = -1; + + if (NAND_MUST_PAD(this)) { + /* Write out desired data */ + this->cmdfunc (mtd, NAND_CMD_SEQIN, mtd->oobblock, page & this->pagemask); + /* prepad 0xff for partial programming */ + this->write_buf(mtd, ffchars, column); + /* write data */ + this->write_buf(mtd, buf, len); + /* postpad 0xff for partial programming */ + this->write_buf(mtd, ffchars, mtd->oobsize - (len+column)); + } else { + /* Write out desired data */ + this->cmdfunc (mtd, NAND_CMD_SEQIN, mtd->oobblock + column, page & this->pagemask); + /* write data */ + this->write_buf(mtd, buf, len); + } + /* Send command to program the OOB data */ + this->cmdfunc (mtd, NAND_CMD_PAGEPROG, -1, -1); - ret = nand_write_page(mtd, chip, buf, page, cached); - if (ret) - break; + status = this->waitfunc (mtd, this, FL_WRITING); - writelen -= bytes; - if (!writelen) - break; + /* See if device thinks it succeeded */ + if (status & NAND_STATUS_FAIL) { + DEBUG (MTD_DEBUG_LEVEL0, "nand_write_oob: " "Failed write, page 0x%08x\n", page); + ret = -EIO; + goto out; + } + /* Return happy */ + *retlen = len; - buf += bytes; - realpage++; +#ifdef CONFIG_MTD_NAND_VERIFY_WRITE + /* Send command to read back the data */ + this->cmdfunc (mtd, NAND_CMD_READOOB, column, page & this->pagemask); - page = realpage & chip->pagemask; - /* Check, if we cross a chip boundary */ - if (!page) { - chipnr++; - chip->select_chip(mtd, -1); - chip->select_chip(mtd, chipnr); - } + if (this->verify_buf(mtd, buf, len)) { + DEBUG (MTD_DEBUG_LEVEL0, "nand_write_oob: " "Failed write verify, page 0x%08x\n", page); + ret = -EIO; + goto out; } +#endif + ret = 0; +out: + /* Deselect and wake up anyone waiting on the device */ + nand_release_device(mtd); - if (unlikely(oob)) - memset(chip->oob_poi, 0xff, mtd->oobsize); - - ops->retlen = ops->len - writelen; return ret; } + /** - * nand_write - [MTD Interface] NAND write with ECC + * nand_writev - [MTD Interface] compabilty function for nand_writev_ecc * @mtd: MTD device structure + * @vecs: the iovectors to write + * @count: number of vectors * @to: offset to write to - * @len: number of bytes to write * @retlen: pointer to variable to store the number of written bytes - * @buf: the data to write * - * NAND write with ECC + * NAND write with kvec. This just calls the ecc function */ -static int nand_write(struct mtd_info *mtd, loff_t to, size_t len, - size_t *retlen, const uint8_t *buf) +static int nand_writev (struct mtd_info *mtd, const struct kvec *vecs, unsigned long count, + loff_t to, size_t * retlen) { - struct nand_chip *chip = mtd->priv; - int ret; - - /* Do not allow reads past end of device */ - if ((to + len) > mtd->size) - return -EINVAL; - if (!len) - return 0; - - nand_get_device(chip, mtd, FL_WRITING); - - chip->ops.len = len; - chip->ops.datbuf = (uint8_t *)buf; - chip->ops.oobbuf = NULL; - - ret = nand_do_write_ops(mtd, to, &chip->ops); - - *retlen = chip->ops.retlen; - - nand_release_device(mtd); - - return ret; + return (nand_writev_ecc (mtd, vecs, count, to, retlen, NULL, NULL)); } /** - * nand_do_write_oob - [MTD Interface] NAND write out-of-band + * nand_writev_ecc - [MTD Interface] write with iovec with ecc * @mtd: MTD device structure + * @vecs: the iovectors to write + * @count: number of vectors * @to: offset to write to - * @ops: oob operation description structure + * @retlen: pointer to variable to store the number of written bytes + * @eccbuf: filesystem supplied oob data buffer + * @oobsel: oob selection structure * - * NAND write out-of-band + * NAND write with iovec with ecc */ -static int nand_do_write_oob(struct mtd_info *mtd, loff_t to, - struct mtd_oob_ops *ops) +static int nand_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) { - int chipnr, page, status; - struct nand_chip *chip = mtd->priv; + int i, page, len, total_len, ret = -EIO, written = 0, chipnr; + int oob, numpages, autoplace = 0, startpage; + struct nand_chip *this = mtd->priv; + int ppblock = (1 << (this->phys_erase_shift - this->page_shift)); + u_char *oobbuf, *bufstart; - DEBUG(MTD_DEBUG_LEVEL3, "nand_write_oob: to = 0x%08x, len = %i\n", - (unsigned int)to, (int)ops->len); + /* Preset written len for early exit */ + *retlen = 0; + + /* Calculate total length of data */ + total_len = 0; + for (i = 0; i < count; i++) + total_len += (int) vecs[i].iov_len; + + DEBUG (MTD_DEBUG_LEVEL3, + "nand_writev: to = 0x%08x, len = %i, count = %ld\n", (unsigned int) to, (unsigned int) total_len, count); /* Do not allow write past end of page */ - if ((ops->ooboffs + ops->len) > mtd->oobsize) { - DEBUG(MTD_DEBUG_LEVEL0, "nand_write_oob: " - "Attempt to write past end of page\n"); + if ((to + total_len) > mtd->size) { + DEBUG (MTD_DEBUG_LEVEL0, "nand_writev: Attempted write past end of device\n"); return -EINVAL; } - chipnr = (int)(to >> chip->chip_shift); - chip->select_chip(mtd, chipnr); + /* reject writes, which are not page aligned */ + if (NOTALIGNED (to) || NOTALIGNED(total_len)) { + printk (KERN_NOTICE "nand_write_ecc: Attempt to write not page aligned data\n"); + return -EINVAL; + } - /* Shift to get page */ - page = (int)(to >> chip->page_shift); + /* Grab the lock and see if the device is available */ + nand_get_device (this, mtd, FL_WRITING); - /* - * Reset the chip. Some chips (like the Toshiba TC5832DC found in one - * of my DiskOnChip 2000 test units) will clear the whole data page too - * if we don't do this. I have no clue why, but I seem to have 'fixed' - * it in the doc2000 driver in August 1999. dwmw2. - */ - chip->cmdfunc(mtd, NAND_CMD_RESET, -1, -1); + /* Get the current chip-nr */ + chipnr = (int) (to >> this->chip_shift); + /* Select the NAND device */ + this->select_chip(mtd, chipnr); /* Check, if it is write protected */ if (nand_check_wp(mtd)) - return -EROFS; - - /* Invalidate the page cache, if we write to the cached page */ - if (page == chip->pagebuf) - chip->pagebuf = -1; - - chip->oob_poi = chip->buffers.oobwbuf; - memset(chip->oob_poi, 0xff, mtd->oobsize); - nand_fill_oob(chip, ops->oobbuf, ops); - status = chip->ecc.write_oob(mtd, chip, page & chip->pagemask); - memset(chip->oob_poi, 0xff, mtd->oobsize); - - if (status) - return status; - - ops->retlen = ops->len; - - return 0; -} - -/** - * nand_write_oob - [MTD Interface] NAND write data and/or out-of-band - * @mtd: MTD device structure - * @to: offset to write to - * @ops: oob operation description structure - */ -static int nand_write_oob(struct mtd_info *mtd, loff_t to, - struct mtd_oob_ops *ops) -{ - void (*write_page)(struct mtd_info *mtd, struct nand_chip *chip, - const uint8_t *buf) = NULL; - struct nand_chip *chip = mtd->priv; - int ret = -ENOTSUPP; + goto out; - ops->retlen = 0; + /* if oobsel is NULL, use chip defaults */ + if (oobsel == NULL) + oobsel = &mtd->oobinfo; - /* Do not allow writes past end of device */ - if ((to + ops->len) > mtd->size) { - DEBUG(MTD_DEBUG_LEVEL0, "nand_read_oob: " - "Attempt read beyond end of device\n"); - return -EINVAL; + /* Autoplace of oob data ? Use the default placement scheme */ + if (oobsel->useecc == MTD_NANDECC_AUTOPLACE) { + oobsel = this->autooob; + autoplace = 1; } + if (oobsel->useecc == MTD_NANDECC_AUTOPL_USR) + autoplace = 1; - nand_get_device(chip, mtd, FL_WRITING); + /* Setup start page */ + page = (int) (to >> this->page_shift); + /* Invalidate the page cache, if we write to the cached page */ + if (page <= this->pagebuf && this->pagebuf < ((to + total_len) >> this->page_shift)) + this->pagebuf = -1; - switch(ops->mode) { - case MTD_OOB_PLACE: - case MTD_OOB_AUTO: - break; + startpage = page & this->pagemask; - case MTD_OOB_RAW: - /* Replace the write_page algorithm temporary */ - write_page = chip->ecc.write_page; - chip->ecc.write_page = nand_write_page_raw; - break; + /* Loop until all kvec' data has been written */ + len = 0; + while (count) { + /* If the given tuple is >= pagesize then + * write it out from the iov + */ + if ((vecs->iov_len - len) >= mtd->oobblock) { + /* Calc number of pages we can write + * out of this iov in one go */ + numpages = (vecs->iov_len - len) >> this->page_shift; + /* Do not cross block boundaries */ + numpages = min (ppblock - (startpage & (ppblock - 1)), numpages); + oobbuf = nand_prepare_oobbuf (mtd, NULL, oobsel, autoplace, numpages); + bufstart = (u_char *)vecs->iov_base; + bufstart += len; + this->data_poi = bufstart; + oob = 0; + for (i = 1; i <= numpages; i++) { + /* Write one page. If this is the last page to write + * then use the real pageprogram command, else select + * cached programming if supported by the chip. + */ + ret = nand_write_page (mtd, this, page & this->pagemask, + &oobbuf[oob], oobsel, i != numpages); + if (ret) + goto out; + this->data_poi += mtd->oobblock; + len += mtd->oobblock; + oob += mtd->oobsize; + page++; + } + /* Check, if we have to switch to the next tuple */ + if (len >= (int) vecs->iov_len) { + vecs++; + len = 0; + count--; + } + } else { + /* We must use the internal buffer, read data out of each + * tuple until we have a full page to write + */ + int cnt = 0; + while (cnt < mtd->oobblock) { + if (vecs->iov_base != NULL && vecs->iov_len) + this->data_buf[cnt++] = ((u_char *) vecs->iov_base)[len++]; + /* Check, if we have to switch to the next tuple */ + if (len >= (int) vecs->iov_len) { + vecs++; + len = 0; + count--; + } + } + this->pagebuf = page; + this->data_poi = this->data_buf; + bufstart = this->data_poi; + numpages = 1; + oobbuf = nand_prepare_oobbuf (mtd, NULL, oobsel, autoplace, numpages); + ret = nand_write_page (mtd, this, page & this->pagemask, + oobbuf, oobsel, 0); + if (ret) + goto out; + page++; + } - default: - goto out; - } + this->data_poi = bufstart; + ret = nand_verify_pages (mtd, this, startpage, numpages, oobbuf, oobsel, chipnr, 0); + if (ret) + goto out; - if (!ops->datbuf) - ret = nand_do_write_oob(mtd, to, ops); - else - ret = nand_do_write_ops(mtd, to, ops); + written += mtd->oobblock * numpages; + /* All done ? */ + if (!count) + break; - if (unlikely(ops->mode == MTD_OOB_RAW)) - chip->ecc.write_page = write_page; - out: + startpage = page & this->pagemask; + /* Check, if we cross a chip boundary */ + if (!startpage) { + chipnr++; + this->select_chip(mtd, -1); + this->select_chip(mtd, chipnr); + } + } + ret = 0; +out: + /* Deselect and wake up anyone waiting on the device */ nand_release_device(mtd); + + *retlen = written; return ret; } @@ -1818,12 +2041,12 @@ static int nand_write_oob(struct mtd_info *mtd, loff_t to, * * Standard erase command for NAND chips */ -static void single_erase_cmd(struct mtd_info *mtd, int page) +static void single_erase_cmd (struct mtd_info *mtd, int page) { - struct nand_chip *chip = mtd->priv; + struct nand_chip *this = mtd->priv; /* Send commands to erase a block */ - chip->cmdfunc(mtd, NAND_CMD_ERASE1, -1, page); - chip->cmdfunc(mtd, NAND_CMD_ERASE2, -1, -1); + this->cmdfunc (mtd, NAND_CMD_ERASE1, -1, page); + this->cmdfunc (mtd, NAND_CMD_ERASE2, -1, -1); } /** @@ -1834,15 +2057,15 @@ static void single_erase_cmd(struct mtd_info *mtd, int page) * AND multi block erase command function * Erase 4 consecutive blocks */ -static void multi_erase_cmd(struct mtd_info *mtd, int page) +static void multi_erase_cmd (struct mtd_info *mtd, int page) { - struct nand_chip *chip = mtd->priv; + struct nand_chip *this = mtd->priv; /* Send commands to erase a block */ - chip->cmdfunc(mtd, NAND_CMD_ERASE1, -1, page++); - chip->cmdfunc(mtd, NAND_CMD_ERASE1, -1, page++); - chip->cmdfunc(mtd, NAND_CMD_ERASE1, -1, page++); - chip->cmdfunc(mtd, NAND_CMD_ERASE1, -1, page); - chip->cmdfunc(mtd, NAND_CMD_ERASE2, -1, -1); + this->cmdfunc (mtd, NAND_CMD_ERASE1, -1, page++); + this->cmdfunc (mtd, NAND_CMD_ERASE1, -1, page++); + this->cmdfunc (mtd, NAND_CMD_ERASE1, -1, page++); + this->cmdfunc (mtd, NAND_CMD_ERASE1, -1, page); + this->cmdfunc (mtd, NAND_CMD_ERASE2, -1, -1); } /** @@ -1852,82 +2075,79 @@ static void multi_erase_cmd(struct mtd_info *mtd, int page) * * Erase one ore more blocks */ -static int nand_erase(struct mtd_info *mtd, struct erase_info *instr) +static int nand_erase (struct mtd_info *mtd, struct erase_info *instr) { - return nand_erase_nand(mtd, instr, 0); + return nand_erase_nand (mtd, instr, 0); } #define BBT_PAGE_MASK 0xffffff3f /** - * nand_erase_nand - [Internal] erase block(s) + * nand_erase_intern - [NAND Interface] erase block(s) * @mtd: MTD device structure * @instr: erase instruction * @allowbbt: allow erasing the bbt area * * Erase one ore more blocks */ -int nand_erase_nand(struct mtd_info *mtd, struct erase_info *instr, - int allowbbt) +int nand_erase_nand (struct mtd_info *mtd, struct erase_info *instr, int allowbbt) { int page, len, status, pages_per_block, ret, chipnr; - struct nand_chip *chip = mtd->priv; - int rewrite_bbt[NAND_MAX_CHIPS]={0}; - unsigned int bbt_masked_page = 0xffffffff; + struct nand_chip *this = mtd->priv; + int rewrite_bbt[NAND_MAX_CHIPS]={0}; /* flags to indicate the page, if bbt needs to be rewritten. */ + unsigned int bbt_masked_page; /* bbt mask to compare to page being erased. */ + /* It is used to see if the current page is in the same */ + /* 256 block group and the same bank as the bbt. */ - DEBUG(MTD_DEBUG_LEVEL3, "nand_erase: start = 0x%08x, len = %i\n", - (unsigned int)instr->addr, (unsigned int)instr->len); + DEBUG (MTD_DEBUG_LEVEL3, + "nand_erase: start = 0x%08x, len = %i\n", (unsigned int) instr->addr, (unsigned int) instr->len); /* Start address must align on block boundary */ - if (instr->addr & ((1 << chip->phys_erase_shift) - 1)) { - DEBUG(MTD_DEBUG_LEVEL0, "nand_erase: Unaligned address\n"); + if (instr->addr & ((1 << this->phys_erase_shift) - 1)) { + DEBUG (MTD_DEBUG_LEVEL0, "nand_erase: Unaligned address\n"); return -EINVAL; } /* Length must align on block boundary */ - if (instr->len & ((1 << chip->phys_erase_shift) - 1)) { - DEBUG(MTD_DEBUG_LEVEL0, "nand_erase: " - "Length not block aligned\n"); + if (instr->len & ((1 << this->phys_erase_shift) - 1)) { + DEBUG (MTD_DEBUG_LEVEL0, "nand_erase: Length not block aligned\n"); return -EINVAL; } /* Do not allow erase past end of device */ if ((instr->len + instr->addr) > mtd->size) { - DEBUG(MTD_DEBUG_LEVEL0, "nand_erase: " - "Erase past end of device\n"); + DEBUG (MTD_DEBUG_LEVEL0, "nand_erase: Erase past end of device\n"); return -EINVAL; } instr->fail_addr = 0xffffffff; /* Grab the lock and see if the device is available */ - nand_get_device(chip, mtd, FL_ERASING); + nand_get_device (this, mtd, FL_ERASING); /* Shift to get first page */ - page = (int)(instr->addr >> chip->page_shift); - chipnr = (int)(instr->addr >> chip->chip_shift); + page = (int) (instr->addr >> this->page_shift); + chipnr = (int) (instr->addr >> this->chip_shift); /* Calculate pages in each block */ - pages_per_block = 1 << (chip->phys_erase_shift - chip->page_shift); + pages_per_block = 1 << (this->phys_erase_shift - this->page_shift); /* Select the NAND device */ - chip->select_chip(mtd, chipnr); + this->select_chip(mtd, chipnr); + /* Check the WP bit */ /* Check, if it is write protected */ if (nand_check_wp(mtd)) { - DEBUG(MTD_DEBUG_LEVEL0, "nand_erase: " - "Device is write protected!!!\n"); + DEBUG (MTD_DEBUG_LEVEL0, "nand_erase: Device is write protected!!!\n"); instr->state = MTD_ERASE_FAILED; goto erase_exit; } - /* - * If BBT requires refresh, set the BBT page mask to see if the BBT - * should be rewritten. Otherwise the mask is set to 0xffffffff which - * can not be matched. This is also done when the bbt is actually - * erased to avoid recusrsive updates - */ - if (chip->options & BBT_AUTO_REFRESH && !allowbbt) - bbt_masked_page = chip->bbt_td->pages[chipnr] & BBT_PAGE_MASK; + /* if BBT requires refresh, set the BBT page mask to see if the BBT should be rewritten */ + if (this->options & BBT_AUTO_REFRESH) { + bbt_masked_page = this->bbt_td->pages[chipnr] & BBT_PAGE_MASK; + } else { + bbt_masked_page = 0xffffffff; /* should not match anything */ + } /* Loop through the pages */ len = instr->len; @@ -1935,77 +2155,64 @@ int nand_erase_nand(struct mtd_info *mtd, struct erase_info *instr, instr->state = MTD_ERASING; while (len) { - /* - * heck if we have a bad block, we do not erase bad blocks ! - */ - if (nand_block_checkbad(mtd, ((loff_t) page) << - chip->page_shift, 0, allowbbt)) { - printk(KERN_WARNING "nand_erase: attempt to erase a " - "bad block at page 0x%08x\n", page); + /* Check if we have a bad block, we do not erase bad blocks ! */ + if (nand_block_checkbad(mtd, ((loff_t) page) << this->page_shift, 0, allowbbt)) { + printk (KERN_WARNING "nand_erase: attempt to erase a bad block at page 0x%08x\n", page); instr->state = MTD_ERASE_FAILED; goto erase_exit; } - /* - * Invalidate the page cache, if we erase the block which - * contains the current cached page - */ - if (page <= chip->pagebuf && chip->pagebuf < - (page + pages_per_block)) - chip->pagebuf = -1; + /* Invalidate the page cache, if we erase the block which contains + the current cached page */ + if (page <= this->pagebuf && this->pagebuf < (page + pages_per_block)) + this->pagebuf = -1; - chip->erase_cmd(mtd, page & chip->pagemask); + this->erase_cmd (mtd, page & this->pagemask); - status = chip->waitfunc(mtd, chip); + status = this->waitfunc (mtd, this, FL_ERASING); - /* - * See if operation failed and additional status checks are - * available - */ - if ((status & NAND_STATUS_FAIL) && (chip->errstat)) - status = chip->errstat(mtd, chip, FL_ERASING, - status, page); + /* See if operation failed and additional status checks are available */ + if ((status & NAND_STATUS_FAIL) && (this->errstat)) { + status = this->errstat(mtd, this, FL_ERASING, status, page); + } /* See if block erase succeeded */ if (status & NAND_STATUS_FAIL) { - DEBUG(MTD_DEBUG_LEVEL0, "nand_erase: " - "Failed erase, page 0x%08x\n", page); + DEBUG (MTD_DEBUG_LEVEL0, "nand_erase: " "Failed erase, page 0x%08x\n", page); instr->state = MTD_ERASE_FAILED; - instr->fail_addr = (page << chip->page_shift); + instr->fail_addr = (page << this->page_shift); goto erase_exit; } - /* - * If BBT requires refresh, set the BBT rewrite flag to the - * page being erased - */ - if (bbt_masked_page != 0xffffffff && - (page & BBT_PAGE_MASK) == bbt_masked_page) - rewrite_bbt[chipnr] = (page << chip->page_shift); + /* if BBT requires refresh, set the BBT rewrite flag to the page being erased */ + if (this->options & BBT_AUTO_REFRESH) { + if (((page & BBT_PAGE_MASK) == bbt_masked_page) && + (page != this->bbt_td->pages[chipnr])) { + rewrite_bbt[chipnr] = (page << this->page_shift); + } + } /* Increment page address and decrement length */ - len -= (1 << chip->phys_erase_shift); + len -= (1 << this->phys_erase_shift); page += pages_per_block; /* Check, if we cross a chip boundary */ - if (len && !(page & chip->pagemask)) { + if (len && !(page & this->pagemask)) { chipnr++; - chip->select_chip(mtd, -1); - chip->select_chip(mtd, chipnr); + this->select_chip(mtd, -1); + this->select_chip(mtd, chipnr); + + /* if BBT requires refresh and BBT-PERCHIP, + * set the BBT page mask to see if this BBT should be rewritten */ + if ((this->options & BBT_AUTO_REFRESH) && (this->bbt_td->options & NAND_BBT_PERCHIP)) { + bbt_masked_page = this->bbt_td->pages[chipnr] & BBT_PAGE_MASK; + } - /* - * If BBT requires refresh and BBT-PERCHIP, set the BBT - * page mask to see if this BBT should be rewritten - */ - if (bbt_masked_page != 0xffffffff && - (chip->bbt_td->options & NAND_BBT_PERCHIP)) - bbt_masked_page = chip->bbt_td->pages[chipnr] & - BBT_PAGE_MASK; } } instr->state = MTD_ERASE_DONE; - erase_exit: +erase_exit: ret = instr->state == MTD_ERASE_DONE ? 0 : -EIO; /* Do call back function */ @@ -2015,21 +2222,16 @@ int nand_erase_nand(struct mtd_info *mtd, struct erase_info *instr, /* Deselect and wake up anyone waiting on the device */ nand_release_device(mtd); - /* - * If BBT requires refresh and erase was successful, rewrite any - * selected bad block tables - */ - if (bbt_masked_page == 0xffffffff || ret) - return ret; - - for (chipnr = 0; chipnr < chip->numchips; chipnr++) { - if (!rewrite_bbt[chipnr]) - continue; - /* update the BBT for chip */ - DEBUG(MTD_DEBUG_LEVEL0, "nand_erase_nand: nand_update_bbt " - "(%d:0x%0x 0x%0x)\n", chipnr, rewrite_bbt[chipnr], - chip->bbt_td->pages[chipnr]); - nand_update_bbt(mtd, rewrite_bbt[chipnr]); + /* if BBT requires refresh and erase was successful, rewrite any selected bad block tables */ + if ((this->options & BBT_AUTO_REFRESH) && (!ret)) { + for (chipnr = 0; chipnr < this->numchips; chipnr++) { + if (rewrite_bbt[chipnr]) { + /* update the BBT for chip */ + DEBUG (MTD_DEBUG_LEVEL0, "nand_erase_nand: nand_update_bbt (%d:0x%0x 0x%0x)\n", + chipnr, rewrite_bbt[chipnr], this->bbt_td->pages[chipnr]); + nand_update_bbt (mtd, rewrite_bbt[chipnr]); + } + } } /* Return more or less happy */ @@ -2042,50 +2244,51 @@ int nand_erase_nand(struct mtd_info *mtd, struct erase_info *instr, * * Sync is actually a wait for chip ready function */ -static void nand_sync(struct mtd_info *mtd) +static void nand_sync (struct mtd_info *mtd) { - struct nand_chip *chip = mtd->priv; + struct nand_chip *this = mtd->priv; - DEBUG(MTD_DEBUG_LEVEL3, "nand_sync: called\n"); + DEBUG (MTD_DEBUG_LEVEL3, "nand_sync: called\n"); /* Grab the lock and see if the device is available */ - nand_get_device(chip, mtd, FL_SYNCING); + nand_get_device (this, mtd, FL_SYNCING); /* Release it and go back */ - nand_release_device(mtd); + nand_release_device (mtd); } + /** - * nand_block_isbad - [MTD Interface] Check if block at offset is bad + * nand_block_isbad - [MTD Interface] Check whether the block at the given offset is bad * @mtd: MTD device structure - * @offs: offset relative to mtd start + * @ofs: offset relative to mtd start */ -static int nand_block_isbad(struct mtd_info *mtd, loff_t offs) +static int nand_block_isbad (struct mtd_info *mtd, loff_t ofs) { /* Check for invalid offset */ - if (offs > mtd->size) + if (ofs > mtd->size) return -EINVAL; - return nand_block_checkbad(mtd, offs, 1, 0); + return nand_block_checkbad (mtd, ofs, 1, 0); } /** - * nand_block_markbad - [MTD Interface] Mark block at the given offset as bad + * nand_block_markbad - [MTD Interface] Mark the block at the given offset as bad * @mtd: MTD device structure * @ofs: offset relative to mtd start */ -static int nand_block_markbad(struct mtd_info *mtd, loff_t ofs) +static int nand_block_markbad (struct mtd_info *mtd, loff_t ofs) { - struct nand_chip *chip = mtd->priv; + struct nand_chip *this = mtd->priv; int ret; - if ((ret = nand_block_isbad(mtd, ofs))) { - /* If it was bad already, return success and do nothing. */ + if ((ret = nand_block_isbad(mtd, ofs))) { + /* If it was bad already, return success and do nothing. */ if (ret > 0) return 0; - return ret; - } + return ret; + } - return chip->block_markbad(mtd, ofs); + return this->block_markbad(mtd, ofs); } /** @@ -2094,9 +2297,9 @@ static int nand_block_markbad(struct mtd_info *mtd, loff_t ofs) */ static int nand_suspend(struct mtd_info *mtd) { - struct nand_chip *chip = mtd->priv; + struct nand_chip *this = mtd->priv; - return nand_get_device(chip, mtd, FL_PM_SUSPENDED); + return nand_get_device (this, mtd, FL_PM_SUSPENDED); } /** @@ -2105,385 +2308,373 @@ static int nand_suspend(struct mtd_info *mtd) */ static void nand_resume(struct mtd_info *mtd) { - struct nand_chip *chip = mtd->priv; + struct nand_chip *this = mtd->priv; - if (chip->state == FL_PM_SUSPENDED) + if (this->state == FL_PM_SUSPENDED) nand_release_device(mtd); else - printk(KERN_ERR "nand_resume() called for a chip which is not " - "in suspended state\n"); + printk(KERN_ERR "resume() called for the chip which is not " + "in suspended state\n"); + } -/* - * Set default functions + +/** + * nand_scan - [NAND Interface] Scan for the NAND device + * @mtd: MTD device structure + * @maxchips: Number of chips to scan for + * + * This fills out all the not initialized function pointers + * with the defaults. + * The flash ID is read and the mtd/chip structures are + * filled with the appropriate values. Buffers are allocated if + * they are not provided by the board driver + * */ -static void nand_set_defaults(struct nand_chip *chip, int busw) +int nand_scan (struct mtd_info *mtd, int maxchips) { + int i, nand_maf_id, nand_dev_id, busw, maf_id; + struct nand_chip *this = mtd->priv; + + /* Get buswidth to select the correct functions*/ + busw = this->options & NAND_BUSWIDTH_16; + /* check for proper chip_delay setup, set 20us if not */ - if (!chip->chip_delay) - chip->chip_delay = 20; + if (!this->chip_delay) + this->chip_delay = 20; /* check, if a user supplied command function given */ - if (chip->cmdfunc == NULL) - chip->cmdfunc = nand_command; + if (this->cmdfunc == NULL) + this->cmdfunc = nand_command; /* check, if a user supplied wait function given */ - if (chip->waitfunc == NULL) - chip->waitfunc = nand_wait; - - if (!chip->select_chip) - chip->select_chip = nand_select_chip; - if (!chip->read_byte) - chip->read_byte = busw ? nand_read_byte16 : nand_read_byte; - if (!chip->read_word) - chip->read_word = nand_read_word; - if (!chip->block_bad) - chip->block_bad = nand_block_bad; - if (!chip->block_markbad) - chip->block_markbad = nand_default_block_markbad; - if (!chip->write_buf) - chip->write_buf = busw ? nand_write_buf16 : nand_write_buf; - if (!chip->read_buf) - chip->read_buf = busw ? nand_read_buf16 : nand_read_buf; - if (!chip->verify_buf) - chip->verify_buf = busw ? nand_verify_buf16 : nand_verify_buf; - if (!chip->scan_bbt) - chip->scan_bbt = nand_default_bbt; - - if (!chip->controller) { - chip->controller = &chip->hwcontrol; - spin_lock_init(&chip->controller->lock); - init_waitqueue_head(&chip->controller->wq); - } - -} - -/* - * Get the flash and manufacturer id and lookup if the type is supported - */ -static struct nand_flash_dev *nand_get_flash_type(struct mtd_info *mtd, - struct nand_chip *chip, - int busw, int *maf_id) -{ - struct nand_flash_dev *type = NULL; - int i, dev_id, maf_idx; + if (this->waitfunc == NULL) + this->waitfunc = nand_wait; + + if (!this->select_chip) + this->select_chip = nand_select_chip; + if (!this->write_byte) + this->write_byte = busw ? nand_write_byte16 : nand_write_byte; + if (!this->read_byte) + this->read_byte = busw ? nand_read_byte16 : nand_read_byte; + if (!this->write_word) + this->write_word = nand_write_word; + if (!this->read_word) + this->read_word = nand_read_word; + if (!this->block_bad) + this->block_bad = nand_block_bad; + if (!this->block_markbad) + this->block_markbad = nand_default_block_markbad; + if (!this->write_buf) + this->write_buf = busw ? nand_write_buf16 : nand_write_buf; + if (!this->read_buf) + this->read_buf = busw ? nand_read_buf16 : nand_read_buf; + if (!this->verify_buf) + this->verify_buf = busw ? nand_verify_buf16 : nand_verify_buf; + if (!this->scan_bbt) + this->scan_bbt = nand_default_bbt; /* Select the device */ - chip->select_chip(mtd, 0); + this->select_chip(mtd, 0); /* Send the command for reading device ID */ - chip->cmdfunc(mtd, NAND_CMD_READID, 0x00, -1); + this->cmdfunc (mtd, NAND_CMD_READID, 0x00, -1); /* Read manufacturer and device IDs */ - *maf_id = chip->read_byte(mtd); - dev_id = chip->read_byte(mtd); + nand_maf_id = this->read_byte(mtd); + nand_dev_id = this->read_byte(mtd); - /* Lookup the flash id */ + /* Print and store flash device information */ for (i = 0; nand_flash_ids[i].name != NULL; i++) { - if (dev_id == nand_flash_ids[i].id) { - type = &nand_flash_ids[i]; - break; - } - } - - if (!type) - return ERR_PTR(-ENODEV); - - if (!mtd->name) - mtd->name = type->name; - - chip->chipsize = type->chipsize << 20; - - /* Newer devices have all the information in additional id bytes */ - if (!type->pagesize) { - int extid; - /* The 3rd id byte contains non relevant data ATM */ - extid = chip->read_byte(mtd); - /* The 4th id byte is the important one */ - extid = chip->read_byte(mtd); - /* Calc pagesize */ - mtd->writesize = 1024 << (extid & 0x3); - extid >>= 2; - /* Calc oobsize */ - mtd->oobsize = (8 << (extid & 0x01)) * (mtd->writesize >> 9); - extid >>= 2; - /* Calc blocksize. Blocksize is multiples of 64KiB */ - mtd->erasesize = (64 * 1024) << (extid & 0x03); - extid >>= 2; - /* Get buswidth information */ - busw = (extid & 0x01) ? NAND_BUSWIDTH_16 : 0; - - } else { - /* - * Old devices have chip data hardcoded in the device id table - */ - mtd->erasesize = type->erasesize; - mtd->writesize = type->pagesize; - mtd->oobsize = mtd->writesize / 32; - busw = type->options & NAND_BUSWIDTH_16; - } - - /* Try to identify manufacturer */ - for (maf_idx = 0; nand_manuf_ids[maf_idx].id != 0x0; maf_idx++) { - if (nand_manuf_ids[maf_idx].id == *maf_id) - break; - } - - /* - * Check, if buswidth is correct. Hardware drivers should set - * chip correct ! - */ - if (busw != (chip->options & NAND_BUSWIDTH_16)) { - printk(KERN_INFO "NAND device: Manufacturer ID:" - " 0x%02x, Chip ID: 0x%02x (%s %s)\n", *maf_id, - dev_id, nand_manuf_ids[maf_idx].name, mtd->name); - printk(KERN_WARNING "NAND bus width %d instead %d bit\n", - (chip->options & NAND_BUSWIDTH_16) ? 16 : 8, - busw ? 16 : 8); - return ERR_PTR(-EINVAL); - } - - /* Calculate the address shift from the page size */ - chip->page_shift = ffs(mtd->writesize) - 1; - /* Convert chipsize to number of pages per chip -1. */ - chip->pagemask = (chip->chipsize >> chip->page_shift) - 1; - - chip->bbt_erase_shift = chip->phys_erase_shift = - ffs(mtd->erasesize) - 1; - chip->chip_shift = ffs(chip->chipsize) - 1; - /* Set the bad block position */ - chip->badblockpos = mtd->writesize > 512 ? - NAND_LARGE_BADBLOCK_POS : NAND_SMALL_BADBLOCK_POS; - - /* Get chip options, preserve non chip based options */ - chip->options &= ~NAND_CHIPOPTIONS_MSK; - chip->options |= type->options & NAND_CHIPOPTIONS_MSK; - - /* - * Set chip as a default. Board drivers can override it, if necessary - */ - chip->options |= NAND_NO_AUTOINCR; + if (nand_dev_id != nand_flash_ids[i].id) + continue; - /* Check if chip is a not a samsung device. Do not clear the - * options for chips which are not having an extended id. - */ - if (*maf_id != NAND_MFR_SAMSUNG && !type->pagesize) - chip->options &= ~NAND_SAMSUNG_LP_OPTIONS; + if (!mtd->name) mtd->name = nand_flash_ids[i].name; + this->chipsize = nand_flash_ids[i].chipsize << 20; + + /* New devices have all the information in additional id bytes */ + if (!nand_flash_ids[i].pagesize) { + int extid; + /* The 3rd id byte contains non relevant data ATM */ + extid = this->read_byte(mtd); + /* The 4th id byte is the important one */ + extid = this->read_byte(mtd); + /* Calc pagesize */ + mtd->oobblock = 1024 << (extid & 0x3); + extid >>= 2; + /* Calc oobsize */ + mtd->oobsize = (8 << (extid & 0x01)) * (mtd->oobblock >> 9); + extid >>= 2; + /* Calc blocksize. Blocksize is multiples of 64KiB */ + mtd->erasesize = (64 * 1024) << (extid & 0x03); + extid >>= 2; + /* Get buswidth information */ + busw = (extid & 0x01) ? NAND_BUSWIDTH_16 : 0; - /* Check for AND chips with 4 page planes */ - if (chip->options & NAND_4PAGE_ARRAY) - chip->erase_cmd = multi_erase_cmd; - else - chip->erase_cmd = single_erase_cmd; + } else { + /* Old devices have this data hardcoded in the + * device id table */ + mtd->erasesize = nand_flash_ids[i].erasesize; + mtd->oobblock = nand_flash_ids[i].pagesize; + mtd->oobsize = mtd->oobblock / 32; + busw = nand_flash_ids[i].options & NAND_BUSWIDTH_16; + } - /* Do not replace user supplied command function ! */ - if (mtd->writesize > 512 && chip->cmdfunc == nand_command) - chip->cmdfunc = nand_command_lp; + /* Try to identify manufacturer */ + for (maf_id = 0; nand_manuf_ids[maf_id].id != 0x0; maf_id++) { + if (nand_manuf_ids[maf_id].id == nand_maf_id) + break; + } - printk(KERN_INFO "NAND device: Manufacturer ID:" - " 0x%02x, Chip ID: 0x%02x (%s %s)\n", *maf_id, dev_id, - nand_manuf_ids[maf_idx].name, type->name); + /* Check, if buswidth is correct. Hardware drivers should set + * this correct ! */ + if (busw != (this->options & NAND_BUSWIDTH_16)) { + printk (KERN_INFO "NAND device: Manufacturer ID:" + " 0x%02x, Chip ID: 0x%02x (%s %s)\n", nand_maf_id, nand_dev_id, + nand_manuf_ids[maf_id].name , mtd->name); + printk (KERN_WARNING + "NAND bus width %d instead %d bit\n", + (this->options & NAND_BUSWIDTH_16) ? 16 : 8, + busw ? 16 : 8); + this->select_chip(mtd, -1); + return 1; + } - return type; -} + /* Calculate the address shift from the page size */ + this->page_shift = ffs(mtd->oobblock) - 1; + this->bbt_erase_shift = this->phys_erase_shift = ffs(mtd->erasesize) - 1; + this->chip_shift = ffs(this->chipsize) - 1; + + /* Set the bad block position */ + this->badblockpos = mtd->oobblock > 512 ? + NAND_LARGE_BADBLOCK_POS : NAND_SMALL_BADBLOCK_POS; + + /* Get chip options, preserve non chip based options */ + this->options &= ~NAND_CHIPOPTIONS_MSK; + this->options |= nand_flash_ids[i].options & NAND_CHIPOPTIONS_MSK; + /* Set this as a default. Board drivers can override it, if neccecary */ + this->options |= NAND_NO_AUTOINCR; + /* Check if this is a not a samsung device. Do not clear the options + * for chips which are not having an extended id. + */ + if (nand_maf_id != NAND_MFR_SAMSUNG && !nand_flash_ids[i].pagesize) + this->options &= ~NAND_SAMSUNG_LP_OPTIONS; -/* module_text_address() isn't exported, and it's mostly a pointless - test if this is a module _anyway_ -- they'd have to try _really_ hard - to call us from in-kernel code if the core NAND support is modular. */ -#ifdef MODULE -#define caller_is_module() (1) -#else -#define caller_is_module() \ - module_text_address((unsigned long)__builtin_return_address(0)) -#endif + /* Check for AND chips with 4 page planes */ + if (this->options & NAND_4PAGE_ARRAY) + this->erase_cmd = multi_erase_cmd; + else + this->erase_cmd = single_erase_cmd; -/** - * nand_scan - [NAND Interface] Scan for the NAND device - * @mtd: MTD device structure - * @maxchips: Number of chips to scan for - * - * This fills out all the uninitialized function pointers - * with the defaults. - * The flash ID is read and the mtd/chip structures are - * filled with the appropriate values. - * The mtd->owner field must be set to the module of the caller - * - */ -int nand_scan(struct mtd_info *mtd, int maxchips) -{ - int i, busw, nand_maf_id; - struct nand_chip *chip = mtd->priv; - struct nand_flash_dev *type; + /* Do not replace user supplied command function ! */ + if (mtd->oobblock > 512 && this->cmdfunc == nand_command) + this->cmdfunc = nand_command_lp; - /* Many callers got this wrong, so check for it for a while... */ - if (!mtd->owner && caller_is_module()) { - printk(KERN_CRIT "nand_scan() called with NULL mtd->owner!\n"); - BUG(); + printk (KERN_INFO "NAND device: Manufacturer ID:" + " 0x%02x, Chip ID: 0x%02x (%s %s)\n", nand_maf_id, nand_dev_id, + nand_manuf_ids[maf_id].name , nand_flash_ids[i].name); + break; } - /* Get buswidth to select the correct functions */ - busw = chip->options & NAND_BUSWIDTH_16; - /* Set the default functions */ - nand_set_defaults(chip, busw); - - /* Read the flash type */ - type = nand_get_flash_type(mtd, chip, busw, &nand_maf_id); - - if (IS_ERR(type)) { - printk(KERN_WARNING "No NAND device found!!!\n"); - chip->select_chip(mtd, -1); - return PTR_ERR(type); + if (!nand_flash_ids[i].name) { + printk (KERN_WARNING "No NAND device found!!!\n"); + this->select_chip(mtd, -1); + return 1; } - /* Check for a chip array */ - for (i = 1; i < maxchips; i++) { - chip->select_chip(mtd, i); + for (i=1; i < maxchips; i++) { + this->select_chip(mtd, i); + /* Send the command for reading device ID */ - chip->cmdfunc(mtd, NAND_CMD_READID, 0x00, -1); + this->cmdfunc (mtd, NAND_CMD_READID, 0x00, -1); + /* Read manufacturer and device IDs */ - if (nand_maf_id != chip->read_byte(mtd) || - type->id != chip->read_byte(mtd)) + if (nand_maf_id != this->read_byte(mtd) || + nand_dev_id != this->read_byte(mtd)) break; } if (i > 1) printk(KERN_INFO "%d NAND chips detected\n", i); - /* Store the number of chips and calc total size for mtd */ - chip->numchips = i; - mtd->size = i * chip->chipsize; + /* Allocate buffers, if neccecary */ + if (!this->oob_buf) { + size_t len; + len = mtd->oobsize << (this->phys_erase_shift - this->page_shift); + this->oob_buf = kmalloc (len, GFP_KERNEL); + if (!this->oob_buf) { + printk (KERN_ERR "nand_scan(): Cannot allocate oob_buf\n"); + return -ENOMEM; + } + this->options |= NAND_OOBBUF_ALLOC; + } - /* Preset the internal oob write buffer */ - memset(chip->buffers.oobwbuf, 0xff, mtd->oobsize); + if (!this->data_buf) { + size_t len; + len = mtd->oobblock + mtd->oobsize; + this->data_buf = kmalloc (len, GFP_KERNEL); + if (!this->data_buf) { + if (this->options & NAND_OOBBUF_ALLOC) + kfree (this->oob_buf); + printk (KERN_ERR "nand_scan(): Cannot allocate data_buf\n"); + return -ENOMEM; + } + this->options |= NAND_DATABUF_ALLOC; + } - /* - * If no default placement scheme is given, select an appropriate one - */ - if (!chip->ecc.layout) { + /* Store the number of chips and calc total size for mtd */ + this->numchips = i; + mtd->size = i * this->chipsize; + /* Convert chipsize to number of pages per chip -1. */ + this->pagemask = (this->chipsize >> this->page_shift) - 1; + /* Preset the internal oob buffer */ + memset(this->oob_buf, 0xff, mtd->oobsize << (this->phys_erase_shift - this->page_shift)); + + /* If no default placement scheme is given, select an + * appropriate one */ + if (!this->autooob) { + /* Select the appropriate default oob placement scheme for + * placement agnostic filesystems */ switch (mtd->oobsize) { case 8: - chip->ecc.layout = &nand_oob_8; + this->autooob = &nand_oob_8; break; case 16: - chip->ecc.layout = &nand_oob_16; + this->autooob = &nand_oob_16; break; case 64: - chip->ecc.layout = &nand_oob_64; + this->autooob = &nand_oob_64; break; default: - printk(KERN_WARNING "No oob scheme defined for " - "oobsize %d\n", mtd->oobsize); + printk (KERN_WARNING "No oob scheme defined for oobsize %d\n", + mtd->oobsize); BUG(); } } + /* The number of bytes available for the filesystem to place fs dependend + * oob data */ + mtd->oobavail = 0; + for (i = 0; this->autooob->oobfree[i][1]; i++) + mtd->oobavail += this->autooob->oobfree[i][1]; + /* - * check ECC mode, default to software if 3byte/512byte hardware ECC is - * selected and we have 256 byte pagesize fallback to software ECC - */ - switch (chip->ecc.mode) { - case NAND_ECC_HW: - /* Use standard hwecc read page function ? */ - if (!chip->ecc.read_page) - chip->ecc.read_page = nand_read_page_hwecc; - if (!chip->ecc.write_page) - chip->ecc.write_page = nand_write_page_hwecc; - if (!chip->ecc.read_oob) - chip->ecc.read_oob = nand_read_oob_std; - if (!chip->ecc.write_oob) - chip->ecc.write_oob = nand_write_oob_std; - - case NAND_ECC_HW_SYNDROME: - if (!chip->ecc.calculate || !chip->ecc.correct || - !chip->ecc.hwctl) { - printk(KERN_WARNING "No ECC functions supplied, " - "Hardware ECC not possible\n"); - BUG(); - } - /* Use standard syndrome read/write page function ? */ - if (!chip->ecc.read_page) - chip->ecc.read_page = nand_read_page_syndrome; - if (!chip->ecc.write_page) - chip->ecc.write_page = nand_write_page_syndrome; - if (!chip->ecc.read_oob) - chip->ecc.read_oob = nand_read_oob_syndrome; - if (!chip->ecc.write_oob) - chip->ecc.write_oob = nand_write_oob_syndrome; - - if (mtd->writesize >= chip->ecc.size) - break; - printk(KERN_WARNING "%d byte HW ECC not possible on " - "%d byte page size, fallback to SW ECC\n", - chip->ecc.size, mtd->writesize); - chip->ecc.mode = NAND_ECC_SOFT; + * check ECC mode, default to software + * if 3byte/512byte hardware ECC is selected and we have 256 byte pagesize + * fallback to software ECC + */ + this->eccsize = 256; /* set default eccsize */ + this->eccbytes = 3; + + switch (this->eccmode) { + case NAND_ECC_HW12_2048: + if (mtd->oobblock < 2048) { + printk(KERN_WARNING "2048 byte HW ECC not possible on %d byte page size, fallback to SW ECC\n", + mtd->oobblock); + this->eccmode = NAND_ECC_SOFT; + this->calculate_ecc = nand_calculate_ecc; + this->correct_data = nand_correct_data; + } else + this->eccsize = 2048; + break; - case NAND_ECC_SOFT: - chip->ecc.calculate = nand_calculate_ecc; - chip->ecc.correct = nand_correct_data; - chip->ecc.read_page = nand_read_page_swecc; - chip->ecc.write_page = nand_write_page_swecc; - chip->ecc.read_oob = nand_read_oob_std; - chip->ecc.write_oob = nand_write_oob_std; - chip->ecc.size = 256; - chip->ecc.bytes = 3; + case NAND_ECC_HW3_512: + case NAND_ECC_HW6_512: + case NAND_ECC_HW8_512: + if (mtd->oobblock == 256) { + printk (KERN_WARNING "512 byte HW ECC not possible on 256 Byte pagesize, fallback to SW ECC \n"); + this->eccmode = NAND_ECC_SOFT; + this->calculate_ecc = nand_calculate_ecc; + this->correct_data = nand_correct_data; + } else + this->eccsize = 512; /* set eccsize to 512 */ + break; + + case NAND_ECC_HW3_256: break; case NAND_ECC_NONE: - printk(KERN_WARNING "NAND_ECC_NONE selected by board driver. " - "This is not recommended !!\n"); - chip->ecc.read_page = nand_read_page_raw; - chip->ecc.write_page = nand_write_page_raw; - chip->ecc.read_oob = nand_read_oob_std; - chip->ecc.write_oob = nand_write_oob_std; - chip->ecc.size = mtd->writesize; - chip->ecc.bytes = 0; + printk (KERN_WARNING "NAND_ECC_NONE selected by board driver. This is not recommended !!\n"); + this->eccmode = NAND_ECC_NONE; break; + + case NAND_ECC_SOFT: + this->calculate_ecc = nand_calculate_ecc; + this->correct_data = nand_correct_data; + break; + default: - printk(KERN_WARNING "Invalid NAND_ECC_MODE %d\n", - chip->ecc.mode); + printk (KERN_WARNING "Invalid NAND_ECC_MODE %d\n", this->eccmode); BUG(); } - /* - * The number of bytes available for a client to place data into - * the out of band area - */ - chip->ecc.layout->oobavail = 0; - for (i = 0; chip->ecc.layout->oobfree[i].length; i++) - chip->ecc.layout->oobavail += - chip->ecc.layout->oobfree[i].length; - - /* - * Set the number of read / write steps for one page depending on ECC - * mode - */ - chip->ecc.steps = mtd->writesize / chip->ecc.size; - if(chip->ecc.steps * chip->ecc.size != mtd->writesize) { - printk(KERN_WARNING "Invalid ecc parameters\n"); + /* Check hardware ecc function availability and adjust number of ecc bytes per + * calculation step + */ + switch (this->eccmode) { + case NAND_ECC_HW12_2048: + this->eccbytes += 4; + case NAND_ECC_HW8_512: + this->eccbytes += 2; + case NAND_ECC_HW6_512: + this->eccbytes += 3; + case NAND_ECC_HW3_512: + case NAND_ECC_HW3_256: + if (this->calculate_ecc && this->correct_data && this->enable_hwecc) + break; + printk (KERN_WARNING "No ECC functions supplied, Hardware ECC not possible\n"); BUG(); } - chip->ecc.total = chip->ecc.steps * chip->ecc.bytes; - /* Initialize state */ - chip->state = FL_READY; + mtd->eccsize = this->eccsize; + + /* Set the number of read / write steps for one page to ensure ECC generation */ + switch (this->eccmode) { + case NAND_ECC_HW12_2048: + this->eccsteps = mtd->oobblock / 2048; + break; + case NAND_ECC_HW3_512: + case NAND_ECC_HW6_512: + case NAND_ECC_HW8_512: + this->eccsteps = mtd->oobblock / 512; + break; + case NAND_ECC_HW3_256: + case NAND_ECC_SOFT: + this->eccsteps = mtd->oobblock / 256; + break; + + case NAND_ECC_NONE: + this->eccsteps = 1; + break; + } + + /* Initialize state, waitqueue and spinlock */ + this->state = FL_READY; + init_waitqueue_head (&this->wq); + spin_lock_init (&this->chip_lock); /* De-select the device */ - chip->select_chip(mtd, -1); + this->select_chip(mtd, -1); /* Invalidate the pagebuffer reference */ - chip->pagebuf = -1; + this->pagebuf = -1; /* Fill in remaining MTD driver data */ mtd->type = MTD_NANDFLASH; - mtd->flags = MTD_CAP_NANDFLASH; + mtd->flags = MTD_CAP_NANDFLASH | MTD_ECC; mtd->ecctype = MTD_ECC_SW; mtd->erase = nand_erase; mtd->point = NULL; mtd->unpoint = NULL; mtd->read = nand_read; mtd->write = nand_write; + mtd->read_ecc = nand_read_ecc; + mtd->write_ecc = nand_write_ecc; mtd->read_oob = nand_read_oob; mtd->write_oob = nand_write_oob; + mtd->readv = NULL; + mtd->writev = nand_writev; + mtd->writev_ecc = nand_writev_ecc; mtd->sync = nand_sync; mtd->lock = NULL; mtd->unlock = NULL; @@ -2492,53 +2683,47 @@ int nand_scan(struct mtd_info *mtd, int maxchips) mtd->block_isbad = nand_block_isbad; mtd->block_markbad = nand_block_markbad; - /* propagate ecc.layout to mtd_info */ - mtd->ecclayout = chip->ecc.layout; + /* and make the autooob the default one */ + memcpy(&mtd->oobinfo, this->autooob, sizeof(mtd->oobinfo)); + + mtd->owner = THIS_MODULE; /* Check, if we should skip the bad block table scan */ - if (chip->options & NAND_SKIP_BBTSCAN) + if (this->options & NAND_SKIP_BBTSCAN) return 0; /* Build bad block table */ - return chip->scan_bbt(mtd); + return this->scan_bbt (mtd); } /** * nand_release - [NAND Interface] Free resources held by the NAND device * @mtd: MTD device structure */ -void nand_release(struct mtd_info *mtd) +void nand_release (struct mtd_info *mtd) { - struct nand_chip *chip = mtd->priv; + struct nand_chip *this = mtd->priv; #ifdef CONFIG_MTD_PARTITIONS /* Deregister partitions */ - del_mtd_partitions(mtd); + del_mtd_partitions (mtd); #endif /* Deregister the device */ - del_mtd_device(mtd); + del_mtd_device (mtd); /* Free bad block table memory */ - kfree(chip->bbt); -} - -EXPORT_SYMBOL_GPL(nand_scan); -EXPORT_SYMBOL_GPL(nand_release); - -static int __init nand_base_init(void) -{ - led_trigger_register_simple("nand-disk", &nand_led_trigger); - return 0; -} - -static void __exit nand_base_exit(void) -{ - led_trigger_unregister_simple(nand_led_trigger); + kfree (this->bbt); + /* Buffer allocated by nand_scan ? */ + if (this->options & NAND_OOBBUF_ALLOC) + kfree (this->oob_buf); + /* Buffer allocated by nand_scan ? */ + if (this->options & NAND_DATABUF_ALLOC) + kfree (this->data_buf); } -module_init(nand_base_init); -module_exit(nand_base_exit); +EXPORT_SYMBOL_GPL (nand_scan); +EXPORT_SYMBOL_GPL (nand_release); -MODULE_LICENSE("GPL"); -MODULE_AUTHOR("Steven J. Hill , Thomas Gleixner "); -MODULE_DESCRIPTION("Generic NAND flash driver code"); +MODULE_LICENSE ("GPL"); +MODULE_AUTHOR ("Steven J. Hill , Thomas Gleixner "); +MODULE_DESCRIPTION ("Generic NAND flash driver code"); diff --git a/drivers/mtd/nand/nand_bbt.c b/drivers/mtd/nand/nand_bbt.c index a612c4ea8..ca286999f 100644 --- a/drivers/mtd/nand/nand_bbt.c +++ b/drivers/mtd/nand/nand_bbt.c @@ -48,7 +48,7 @@ * * Following assumptions are made: * - bbts start at a page boundary, if autolocated on a block boundary - * - the space necessary for a bbt in FLASH does not exceed a block boundary + * - the space neccecary for a bbt in FLASH does not exceed a block boundary * */ @@ -60,7 +60,7 @@ #include #include #include -#include + /** * check_pattern - [GENERIC] check if a pattern is in the buffer @@ -75,7 +75,7 @@ * pattern area contain 0xff * */ -static int check_pattern(uint8_t *buf, int len, int paglen, struct nand_bbt_descr *td) +static int check_pattern (uint8_t *buf, int len, int paglen, struct nand_bbt_descr *td) { int i, end = 0; uint8_t *p = buf; @@ -116,7 +116,7 @@ static int check_pattern(uint8_t *buf, int len, int paglen, struct nand_bbt_desc * no optional empty check * */ -static int check_short_pattern(uint8_t *buf, struct nand_bbt_descr *td) +static int check_short_pattern (uint8_t *buf, struct nand_bbt_descr *td) { int i; uint8_t *p = buf; @@ -142,8 +142,8 @@ static int check_short_pattern(uint8_t *buf, struct nand_bbt_descr *td) * Read the bad block table starting from page. * */ -static int read_bbt(struct mtd_info *mtd, uint8_t *buf, int page, int num, - int bits, int offs, int reserved_block_code) +static int read_bbt (struct mtd_info *mtd, uint8_t *buf, int page, int num, + int bits, int offs, int reserved_block_code) { int res, i, j, act = 0; struct nand_chip *this = mtd->priv; @@ -152,17 +152,17 @@ static int read_bbt(struct mtd_info *mtd, uint8_t *buf, int page, int num, uint8_t msk = (uint8_t) ((1 << bits) - 1); totlen = (num * bits) >> 3; - from = ((loff_t) page) << this->page_shift; + from = ((loff_t)page) << this->page_shift; while (totlen) { - len = min(totlen, (size_t) (1 << this->bbt_erase_shift)); - res = mtd->read(mtd, from, len, &retlen, buf); + len = min (totlen, (size_t) (1 << this->bbt_erase_shift)); + res = mtd->read_ecc (mtd, from, len, &retlen, buf, NULL, this->autooob); if (res < 0) { if (retlen != len) { - printk(KERN_INFO "nand_bbt: Error reading bad block table\n"); + printk (KERN_INFO "nand_bbt: Error reading bad block table\n"); return res; } - printk(KERN_WARNING "nand_bbt: ECC error while reading bad block table\n"); + printk (KERN_WARNING "nand_bbt: ECC error while reading bad block table\n"); } /* Analyse data */ @@ -172,23 +172,22 @@ static int read_bbt(struct mtd_info *mtd, uint8_t *buf, int page, int num, uint8_t tmp = (dat >> j) & msk; if (tmp == msk) continue; - if (reserved_block_code && (tmp == reserved_block_code)) { - printk(KERN_DEBUG "nand_read_bbt: Reserved block at 0x%08x\n", - ((offs << 2) + (act >> 1)) << this->bbt_erase_shift); + if (reserved_block_code && + (tmp == reserved_block_code)) { + printk (KERN_DEBUG "nand_read_bbt: Reserved block at 0x%08x\n", + ((offs << 2) + (act >> 1)) << this->bbt_erase_shift); this->bbt[offs + (act >> 3)] |= 0x2 << (act & 0x06); - mtd->ecc_stats.bbtblocks++; continue; } /* Leave it for now, if its matured we can move this * message to MTD_DEBUG_LEVEL0 */ - printk(KERN_DEBUG "nand_read_bbt: Bad block at 0x%08x\n", - ((offs << 2) + (act >> 1)) << this->bbt_erase_shift); + printk (KERN_DEBUG "nand_read_bbt: Bad block at 0x%08x\n", + ((offs << 2) + (act >> 1)) << this->bbt_erase_shift); /* Factory marked bad or worn out ? */ if (tmp == 0) this->bbt[offs + (act >> 3)] |= 0x3 << (act & 0x06); else this->bbt[offs + (act >> 3)] |= 0x1 << (act & 0x06); - mtd->ecc_stats.badblocks++; } } totlen -= len; @@ -208,7 +207,7 @@ static int read_bbt(struct mtd_info *mtd, uint8_t *buf, int page, int num, * Read the bad block table for all chips starting at a given page * We assume that the bbt bits are in consecutive order. */ -static int read_abs_bbt(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_descr *td, int chip) +static int read_abs_bbt (struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_descr *td, int chip) { struct nand_chip *this = mtd->priv; int res = 0, i; @@ -232,42 +231,6 @@ static int read_abs_bbt(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_desc return 0; } -/* - * Scan read raw data from flash - */ -static int scan_read_raw(struct mtd_info *mtd, uint8_t *buf, loff_t offs, - size_t len) -{ - struct mtd_oob_ops ops; - - ops.mode = MTD_OOB_RAW; - ops.ooboffs = 0; - ops.ooblen = mtd->oobsize; - ops.oobbuf = buf; - ops.datbuf = buf; - ops.len = len; - - return mtd->read_oob(mtd, offs, &ops); -} - -/* - * Scan write data with oob to flash - */ -static int scan_write_bbt(struct mtd_info *mtd, loff_t offs, size_t len, - uint8_t *buf, uint8_t *oob) -{ - struct mtd_oob_ops ops; - - ops.mode = MTD_OOB_PLACE; - ops.ooboffs = 0; - ops.ooblen = mtd->oobsize; - ops.datbuf = buf; - ops.oobbuf = oob; - ops.len = len; - - return mtd->write_oob(mtd, offs, &ops); -} - /** * read_abs_bbts - [GENERIC] Read the bad block table(s) for all chips starting at a given page * @mtd: MTD device structure @@ -279,83 +242,26 @@ static int scan_write_bbt(struct mtd_info *mtd, loff_t offs, size_t len, * We assume that the bbt bits are in consecutive order. * */ -static int read_abs_bbts(struct mtd_info *mtd, uint8_t *buf, - struct nand_bbt_descr *td, struct nand_bbt_descr *md) +static int read_abs_bbts (struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_descr *td, + struct nand_bbt_descr *md) { struct nand_chip *this = mtd->priv; /* Read the primary version, if available */ if (td->options & NAND_BBT_VERSION) { - scan_read_raw(mtd, buf, td->pages[0] << this->page_shift, - mtd->writesize); - td->version[0] = buf[mtd->writesize + td->veroffs]; - printk(KERN_DEBUG "Bad block table at page %d, version 0x%02X\n", - td->pages[0], td->version[0]); + nand_read_raw (mtd, buf, td->pages[0] << this->page_shift, mtd->oobblock, mtd->oobsize); + td->version[0] = buf[mtd->oobblock + td->veroffs]; + printk (KERN_DEBUG "Bad block table at page %d, version 0x%02X\n", td->pages[0], td->version[0]); } /* Read the mirror version, if available */ if (md && (md->options & NAND_BBT_VERSION)) { - scan_read_raw(mtd, buf, md->pages[0] << this->page_shift, - mtd->writesize); - md->version[0] = buf[mtd->writesize + md->veroffs]; - printk(KERN_DEBUG "Bad block table at page %d, version 0x%02X\n", - md->pages[0], md->version[0]); - } - return 1; -} - -/* - * Scan a given block full - */ -static int scan_block_full(struct mtd_info *mtd, struct nand_bbt_descr *bd, - loff_t offs, uint8_t *buf, size_t readlen, - int scanlen, int len) -{ - int ret, j; - - ret = scan_read_raw(mtd, buf, offs, readlen); - if (ret) - return ret; - - for (j = 0; j < len; j++, buf += scanlen) { - if (check_pattern(buf, scanlen, mtd->writesize, bd)) - return 1; + nand_read_raw (mtd, buf, md->pages[0] << this->page_shift, mtd->oobblock, mtd->oobsize); + md->version[0] = buf[mtd->oobblock + md->veroffs]; + printk (KERN_DEBUG "Bad block table at page %d, version 0x%02X\n", md->pages[0], md->version[0]); } - return 0; -} - -/* - * Scan a given block partially - */ -static int scan_block_fast(struct mtd_info *mtd, struct nand_bbt_descr *bd, - loff_t offs, uint8_t *buf, int len) -{ - struct mtd_oob_ops ops; - int j, ret; - - ops.len = mtd->oobsize; - ops.ooblen = mtd->oobsize; - ops.oobbuf = buf; - ops.ooboffs = 0; - ops.datbuf = NULL; - ops.mode = MTD_OOB_PLACE; - - for (j = 0; j < len; j++) { - /* - * Read the full oob until read_oob is fixed to - * handle single byte reads for 16 bit - * buswidth - */ - ret = mtd->read_oob(mtd, offs, &ops); - if (ret) - return ret; - - if (check_short_pattern(buf, bd)) - return 1; - offs += mtd->writesize; - } - return 0; + return 1; } /** @@ -369,16 +275,15 @@ static int scan_block_fast(struct mtd_info *mtd, struct nand_bbt_descr *bd, * Create a bad block table by scanning the device * for the given good/bad block identify pattern */ -static int create_bbt(struct mtd_info *mtd, uint8_t *buf, - struct nand_bbt_descr *bd, int chip) +static int create_bbt (struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_descr *bd, int chip) { struct nand_chip *this = mtd->priv; - int i, numblocks, len, scanlen; + int i, j, numblocks, len, scanlen; int startblock; loff_t from; - size_t readlen; + size_t readlen, ooblen; - printk(KERN_INFO "Scanning device for bad blocks\n"); + printk (KERN_INFO "Scanning device for bad blocks\n"); if (bd->options & NAND_BBT_SCANALLPAGES) len = 1 << (this->bbt_erase_shift - this->page_shift); @@ -391,24 +296,25 @@ static int create_bbt(struct mtd_info *mtd, uint8_t *buf, if (!(bd->options & NAND_BBT_SCANEMPTY)) { /* We need only read few bytes from the OOB area */ - scanlen = 0; + scanlen = ooblen = 0; readlen = bd->len; } else { /* Full page content should be read */ - scanlen = mtd->writesize + mtd->oobsize; - readlen = len * mtd->writesize; + scanlen = mtd->oobblock + mtd->oobsize; + readlen = len * mtd->oobblock; + ooblen = len * mtd->oobsize; } if (chip == -1) { - /* Note that numblocks is 2 * (real numblocks) here, see i+=2 - * below as it makes shifting and masking less painful */ + /* Note that numblocks is 2 * (real numblocks) here, see i+=2 below as it + * makes shifting and masking less painful */ numblocks = mtd->size >> (this->bbt_erase_shift - 1); startblock = 0; from = 0; } else { if (chip >= this->numchips) { - printk(KERN_WARNING "create_bbt(): chipnr (%d) > available chips (%d)\n", - chip + 1, this->numchips); + printk (KERN_WARNING "create_bbt(): chipnr (%d) > available chips (%d)\n", + chip + 1, this->numchips); return -EINVAL; } numblocks = this->chipsize >> (this->bbt_erase_shift - 1); @@ -420,22 +326,36 @@ static int create_bbt(struct mtd_info *mtd, uint8_t *buf, for (i = startblock; i < numblocks;) { int ret; - if (bd->options & NAND_BBT_SCANALLPAGES) - ret = scan_block_full(mtd, bd, from, buf, readlen, - scanlen, len); - else - ret = scan_block_fast(mtd, bd, from, buf, len); - - if (ret < 0) - return ret; - - if (ret) { - this->bbt[i >> 3] |= 0x03 << (i & 0x6); - printk(KERN_WARNING "Bad eraseblock %d at 0x%08x\n", - i >> 1, (unsigned int)from); - mtd->ecc_stats.badblocks++; + if (bd->options & NAND_BBT_SCANEMPTY) + if ((ret = nand_read_raw (mtd, buf, from, readlen, ooblen))) + return ret; + + for (j = 0; j < len; j++) { + if (!(bd->options & NAND_BBT_SCANEMPTY)) { + size_t retlen; + + /* Read the full oob until read_oob is fixed to + * handle single byte reads for 16 bit buswidth */ + ret = mtd->read_oob(mtd, from + j * mtd->oobblock, + mtd->oobsize, &retlen, buf); + if (ret) + return ret; + + if (check_short_pattern (buf, bd)) { + this->bbt[i >> 3] |= 0x03 << (i & 0x6); + printk (KERN_WARNING "Bad eraseblock %d at 0x%08x\n", + i >> 1, (unsigned int) from); + break; + } + } else { + if (check_pattern (&buf[j * scanlen], scanlen, mtd->oobblock, bd)) { + this->bbt[i >> 3] |= 0x03 << (i & 0x6); + printk (KERN_WARNING "Bad eraseblock %d at 0x%08x\n", + i >> 1, (unsigned int) from); + break; + } + } } - i += 2; from += (1 << this->bbt_erase_shift); } @@ -454,23 +374,22 @@ static int create_bbt(struct mtd_info *mtd, uint8_t *buf, * block. * If the option NAND_BBT_PERCHIP is given, each chip is searched * for a bbt, which contains the bad block information of this chip. - * This is necessary to provide support for certain DOC devices. + * This is neccecary to provide support for certain DOC devices. * * The bbt ident pattern resides in the oob area of the first page * in a block. */ -static int search_bbt(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_descr *td) +static int search_bbt (struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_descr *td) { struct nand_chip *this = mtd->priv; int i, chips; int bits, startblock, block, dir; - int scanlen = mtd->writesize + mtd->oobsize; + int scanlen = mtd->oobblock + mtd->oobsize; int bbtblocks; - int blocktopage = this->bbt_erase_shift - this->page_shift; /* Search direction top -> down ? */ if (td->options & NAND_BBT_LASTBLOCK) { - startblock = (mtd->size >> this->bbt_erase_shift) - 1; + startblock = (mtd->size >> this->bbt_erase_shift) -1; dir = -1; } else { startblock = 0; @@ -496,16 +415,13 @@ static int search_bbt(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_descr td->pages[i] = -1; /* Scan the maximum number of blocks */ for (block = 0; block < td->maxblocks; block++) { - int actblock = startblock + dir * block; - loff_t offs = actblock << this->bbt_erase_shift; - /* Read first page */ - scan_read_raw(mtd, buf, offs, mtd->writesize); - if (!check_pattern(buf, scanlen, mtd->writesize, td)) { - td->pages[i] = actblock << blocktopage; + nand_read_raw (mtd, buf, actblock << this->bbt_erase_shift, mtd->oobblock, mtd->oobsize); + if (!check_pattern(buf, scanlen, mtd->oobblock, td)) { + td->pages[i] = actblock << (this->bbt_erase_shift - this->page_shift); if (td->options & NAND_BBT_VERSION) { - td->version[i] = buf[mtd->writesize + td->veroffs]; + td->version[i] = buf[mtd->oobblock + td->veroffs]; } break; } @@ -515,10 +431,9 @@ static int search_bbt(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_descr /* Check, if we found a bbt for each requested chip */ for (i = 0; i < chips; i++) { if (td->pages[i] == -1) - printk(KERN_WARNING "Bad block table not found for chip %d\n", i); + printk (KERN_WARNING "Bad block table not found for chip %d\n", i); else - printk(KERN_DEBUG "Bad block table found at page %d, version 0x%02X\n", td->pages[i], - td->version[i]); + printk (KERN_DEBUG "Bad block table found at page %d, version 0x%02X\n", td->pages[i], td->version[i]); } return 0; } @@ -532,19 +447,21 @@ static int search_bbt(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_descr * * Search and read the bad block table(s) */ -static int search_read_bbts(struct mtd_info *mtd, uint8_t * buf, struct nand_bbt_descr *td, struct nand_bbt_descr *md) +static int search_read_bbts (struct mtd_info *mtd, uint8_t *buf, + struct nand_bbt_descr *td, struct nand_bbt_descr *md) { /* Search the primary table */ - search_bbt(mtd, buf, td); + search_bbt (mtd, buf, td); /* Search the mirror table */ if (md) - search_bbt(mtd, buf, md); + search_bbt (mtd, buf, md); /* Force result check */ return 1; } + /** * write_bbt - [GENERIC] (Re)write the bad block table * @@ -557,31 +474,25 @@ static int search_read_bbts(struct mtd_info *mtd, uint8_t * buf, struct nand_bbt * (Re)write the bad block table * */ -static int write_bbt(struct mtd_info *mtd, uint8_t *buf, - struct nand_bbt_descr *td, struct nand_bbt_descr *md, - int chipsel) +static int write_bbt (struct mtd_info *mtd, uint8_t *buf, + struct nand_bbt_descr *td, struct nand_bbt_descr *md, int chipsel) { struct nand_chip *this = mtd->priv; + struct nand_oobinfo oobinfo; struct erase_info einfo; int i, j, res, chip = 0; int bits, startblock, dir, page, offs, numblocks, sft, sftmsk; - int nrchips, bbtoffs, pageoffs, ooboffs; + int nrchips, bbtoffs, pageoffs; uint8_t msk[4]; uint8_t rcode = td->reserved_block_code; size_t retlen, len = 0; loff_t to; - struct mtd_oob_ops ops; - - ops.ooblen = mtd->oobsize; - ops.ooboffs = 0; - ops.datbuf = NULL; - ops.mode = MTD_OOB_PLACE; if (!rcode) rcode = 0xff; /* Write bad block table per chip rather than per device ? */ if (td->options & NAND_BBT_PERCHIP) { - numblocks = (int)(this->chipsize >> this->bbt_erase_shift); + numblocks = (int) (this->chipsize >> this->bbt_erase_shift); /* Full device write or specific chip ? */ if (chipsel == -1) { nrchips = this->numchips; @@ -590,7 +501,7 @@ static int write_bbt(struct mtd_info *mtd, uint8_t *buf, chip = chipsel; } } else { - numblocks = (int)(mtd->size >> this->bbt_erase_shift); + numblocks = (int) (mtd->size >> this->bbt_erase_shift); nrchips = 1; } @@ -619,38 +530,27 @@ static int write_bbt(struct mtd_info *mtd, uint8_t *buf, for (i = 0; i < td->maxblocks; i++) { int block = startblock + dir * i; /* Check, if the block is bad */ - switch ((this->bbt[block >> 2] >> - (2 * (block & 0x03))) & 0x03) { + switch ((this->bbt[block >> 2] >> (2 * (block & 0x03))) & 0x03) { case 0x01: case 0x03: continue; } - page = block << - (this->bbt_erase_shift - this->page_shift); + page = block << (this->bbt_erase_shift - this->page_shift); /* Check, if the block is used by the mirror table */ if (!md || md->pages[chip] != page) goto write; } - printk(KERN_ERR "No space left to write bad block table\n"); + printk (KERN_ERR "No space left to write bad block table\n"); return -ENOSPC; - write: +write: /* Set up shift count and masks for the flash table */ bits = td->options & NAND_BBT_NRBITS_MSK; - msk[2] = ~rcode; switch (bits) { - case 1: sft = 3; sftmsk = 0x07; msk[0] = 0x00; msk[1] = 0x01; - msk[3] = 0x01; - break; - case 2: sft = 2; sftmsk = 0x06; msk[0] = 0x00; msk[1] = 0x01; - msk[3] = 0x03; - break; - case 4: sft = 1; sftmsk = 0x04; msk[0] = 0x00; msk[1] = 0x0C; - msk[3] = 0x0f; - break; - case 8: sft = 0; sftmsk = 0x00; msk[0] = 0x00; msk[1] = 0x0F; - msk[3] = 0xff; - break; + case 1: sft = 3; sftmsk = 0x07; msk[0] = 0x00; msk[1] = 0x01; msk[2] = ~rcode; msk[3] = 0x01; break; + case 2: sft = 2; sftmsk = 0x06; msk[0] = 0x00; msk[1] = 0x01; msk[2] = ~rcode; msk[3] = 0x03; break; + case 4: sft = 1; sftmsk = 0x04; msk[0] = 0x00; msk[1] = 0x0C; msk[2] = ~rcode; msk[3] = 0x0f; break; + case 8: sft = 0; sftmsk = 0x00; msk[0] = 0x00; msk[1] = 0x0F; msk[2] = ~rcode; msk[3] = 0xff; break; default: return -EINVAL; } @@ -658,92 +558,82 @@ static int write_bbt(struct mtd_info *mtd, uint8_t *buf, to = ((loff_t) page) << this->page_shift; + memcpy (&oobinfo, this->autooob, sizeof(oobinfo)); + oobinfo.useecc = MTD_NANDECC_PLACEONLY; + /* Must we save the block contents ? */ if (td->options & NAND_BBT_SAVECONTENT) { /* Make it block aligned */ to &= ~((loff_t) ((1 << this->bbt_erase_shift) - 1)); len = 1 << this->bbt_erase_shift; - res = mtd->read(mtd, to, len, &retlen, buf); + res = mtd->read_ecc (mtd, to, len, &retlen, buf, &buf[len], &oobinfo); if (res < 0) { if (retlen != len) { - printk(KERN_INFO "nand_bbt: Error " - "reading block for writing " - "the bad block table\n"); + printk (KERN_INFO "nand_bbt: Error reading block for writing the bad block table\n"); return res; } - printk(KERN_WARNING "nand_bbt: ECC error " - "while reading block for writing " - "bad block table\n"); + printk (KERN_WARNING "nand_bbt: ECC error while reading block for writing bad block table\n"); } - /* Read oob data */ - ops.len = (len >> this->page_shift) * mtd->oobsize; - ops.oobbuf = &buf[len]; - res = mtd->read_oob(mtd, to + mtd->writesize, &ops); - if (res < 0 || ops.retlen != ops.len) - goto outerr; - /* Calc the byte offset in the buffer */ pageoffs = page - (int)(to >> this->page_shift); offs = pageoffs << this->page_shift; /* Preset the bbt area with 0xff */ - memset(&buf[offs], 0xff, (size_t) (numblocks >> sft)); - ooboffs = len + (pageoffs * mtd->oobsize); - + memset (&buf[offs], 0xff, (size_t)(numblocks >> sft)); + /* Preset the bbt's oob area with 0xff */ + memset (&buf[len + pageoffs * mtd->oobsize], 0xff, + ((len >> this->page_shift) - pageoffs) * mtd->oobsize); + if (td->options & NAND_BBT_VERSION) { + buf[len + (pageoffs * mtd->oobsize) + td->veroffs] = td->version[chip]; + } } else { /* Calc length */ len = (size_t) (numblocks >> sft); /* Make it page aligned ! */ - len = (len + (mtd->writesize - 1)) & - ~(mtd->writesize - 1); + len = (len + (mtd->oobblock-1)) & ~(mtd->oobblock-1); /* Preset the buffer with 0xff */ - memset(buf, 0xff, len + - (len >> this->page_shift)* mtd->oobsize); + memset (buf, 0xff, len + (len >> this->page_shift) * mtd->oobsize); offs = 0; - ooboffs = len; /* Pattern is located in oob area of first page */ - memcpy(&buf[ooboffs + td->offs], td->pattern, td->len); + memcpy (&buf[len + td->offs], td->pattern, td->len); + if (td->options & NAND_BBT_VERSION) { + buf[len + td->veroffs] = td->version[chip]; + } } - if (td->options & NAND_BBT_VERSION) - buf[ooboffs + td->veroffs] = td->version[chip]; - /* walk through the memory table */ - for (i = 0; i < numblocks;) { + for (i = 0; i < numblocks; ) { uint8_t dat; dat = this->bbt[bbtoffs + (i >> 2)]; - for (j = 0; j < 4; j++, i++) { + for (j = 0; j < 4; j++ , i++) { int sftcnt = (i << (3 - sft)) & sftmsk; /* Do not store the reserved bbt blocks ! */ - buf[offs + (i >> sft)] &= - ~(msk[dat & 0x03] << sftcnt); + buf[offs + (i >> sft)] &= ~(msk[dat & 0x03] << sftcnt); dat >>= 2; } } - memset(&einfo, 0, sizeof(einfo)); + memset (&einfo, 0, sizeof (einfo)); einfo.mtd = mtd; - einfo.addr = (unsigned long)to; + einfo.addr = (unsigned long) to; einfo.len = 1 << this->bbt_erase_shift; - res = nand_erase_nand(mtd, &einfo, 1); - if (res < 0) - goto outerr; - - res = scan_write_bbt(mtd, to, len, buf, &buf[len]); - if (res < 0) - goto outerr; + res = nand_erase_nand (mtd, &einfo, 1); + if (res < 0) { + printk (KERN_WARNING "nand_bbt: Error during block erase: %d\n", res); + return res; + } - printk(KERN_DEBUG "Bad block table written to 0x%08x, version " - "0x%02X\n", (unsigned int)to, td->version[chip]); + res = mtd->write_ecc (mtd, to, len, &retlen, buf, &buf[len], &oobinfo); + if (res < 0) { + printk (KERN_WARNING "nand_bbt: Error while writing bad block table %d\n", res); + return res; + } + printk (KERN_DEBUG "Bad block table written to 0x%08x, version 0x%02X\n", + (unsigned int) to, td->version[chip]); /* Mark it as used */ td->pages[chip] = page; } return 0; - - outerr: - printk(KERN_WARNING - "nand_bbt: Error while writing bad block table %d\n", res); - return res; } /** @@ -754,27 +644,27 @@ static int write_bbt(struct mtd_info *mtd, uint8_t *buf, * The function creates a memory based bbt by scanning the device * for manufacturer / software marked good / bad blocks */ -static inline int nand_memory_bbt(struct mtd_info *mtd, struct nand_bbt_descr *bd) +static inline int nand_memory_bbt (struct mtd_info *mtd, struct nand_bbt_descr *bd) { struct nand_chip *this = mtd->priv; bd->options &= ~NAND_BBT_SCANEMPTY; - return create_bbt(mtd, this->buffers.databuf, bd, -1); + return create_bbt (mtd, this->data_buf, bd, -1); } /** - * check_create - [GENERIC] create and write bbt(s) if necessary + * check_create - [GENERIC] create and write bbt(s) if neccecary * @mtd: MTD device structure * @buf: temporary buffer * @bd: descriptor for the good/bad block search pattern * * The function checks the results of the previous call to read_bbt - * and creates / updates the bbt(s) if necessary - * Creation is necessary if no bbt was found for the chip/device - * Update is necessary if one of the tables is missing or the + * and creates / updates the bbt(s) if neccecary + * Creation is neccecary if no bbt was found for the chip/device + * Update is neccecary if one of the tables is missing or the * version nr. of one table is less than the other */ -static int check_create(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_descr *bd) +static int check_create (struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_descr *bd) { int i, chips, writeops, chipsel, res; struct nand_chip *this = mtd->priv; @@ -842,35 +732,35 @@ static int check_create(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_desc rd = td; goto writecheck; } - create: +create: /* Create the bad block table by scanning the device ? */ if (!(td->options & NAND_BBT_CREATE)) continue; /* Create the table in memory by scanning the chip(s) */ - create_bbt(mtd, buf, bd, chipsel); + create_bbt (mtd, buf, bd, chipsel); td->version[i] = 1; if (md) md->version[i] = 1; - writecheck: +writecheck: /* read back first ? */ if (rd) - read_abs_bbt(mtd, buf, rd, chipsel); + read_abs_bbt (mtd, buf, rd, chipsel); /* If they weren't versioned, read both. */ if (rd2) - read_abs_bbt(mtd, buf, rd2, chipsel); + read_abs_bbt (mtd, buf, rd2, chipsel); /* Write the bad block table to the device ? */ if ((writeops & 0x01) && (td->options & NAND_BBT_WRITE)) { - res = write_bbt(mtd, buf, td, md, chipsel); + res = write_bbt (mtd, buf, td, md, chipsel); if (res < 0) return res; } /* Write the mirror bad block table to the device ? */ if ((writeops & 0x02) && md && (md->options & NAND_BBT_WRITE)) { - res = write_bbt(mtd, buf, md, td, chipsel); + res = write_bbt (mtd, buf, md, td, chipsel); if (res < 0) return res; } @@ -887,7 +777,7 @@ static int check_create(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_desc * accidental erasures / writes. The regions are identified by * the mark 0x02. */ -static void mark_bbt_region(struct mtd_info *mtd, struct nand_bbt_descr *td) +static void mark_bbt_region (struct mtd_info *mtd, struct nand_bbt_descr *td) { struct nand_chip *this = mtd->priv; int i, j, chips, block, nrblocks, update; @@ -905,8 +795,7 @@ static void mark_bbt_region(struct mtd_info *mtd, struct nand_bbt_descr *td) for (i = 0; i < chips; i++) { if ((td->options & NAND_BBT_ABSPAGE) || !(td->options & NAND_BBT_WRITE)) { - if (td->pages[i] == -1) - continue; + if (td->pages[i] == -1) continue; block = td->pages[i] >> (this->bbt_erase_shift - this->page_shift); block <<= 1; oldval = this->bbt[(block >> 3)]; @@ -926,8 +815,7 @@ static void mark_bbt_region(struct mtd_info *mtd, struct nand_bbt_descr *td) oldval = this->bbt[(block >> 3)]; newval = oldval | (0x2 << (block & 0x06)); this->bbt[(block >> 3)] = newval; - if (oldval != newval) - update = 1; + if (oldval != newval) update = 1; block += 2; } /* If we want reserved blocks to be recorded to flash, and some @@ -952,7 +840,7 @@ static void mark_bbt_region(struct mtd_info *mtd, struct nand_bbt_descr *td) * by calling the nand_free_bbt function. * */ -int nand_scan_bbt(struct mtd_info *mtd, struct nand_bbt_descr *bd) +int nand_scan_bbt (struct mtd_info *mtd, struct nand_bbt_descr *bd) { struct nand_chip *this = mtd->priv; int len, res = 0; @@ -962,21 +850,21 @@ int nand_scan_bbt(struct mtd_info *mtd, struct nand_bbt_descr *bd) len = mtd->size >> (this->bbt_erase_shift + 2); /* Allocate memory (2bit per block) */ - this->bbt = kmalloc(len, GFP_KERNEL); + this->bbt = kmalloc (len, GFP_KERNEL); if (!this->bbt) { - printk(KERN_ERR "nand_scan_bbt: Out of memory\n"); + printk (KERN_ERR "nand_scan_bbt: Out of memory\n"); return -ENOMEM; } /* Clear the memory bad block table */ - memset(this->bbt, 0x00, len); + memset (this->bbt, 0x00, len); /* If no primary table decriptor is given, scan the device * to build a memory based bad block table */ if (!td) { if ((res = nand_memory_bbt(mtd, bd))) { - printk(KERN_ERR "nand_bbt: Can't scan flash and build the RAM-based BBT\n"); - kfree(this->bbt); + printk (KERN_ERR "nand_bbt: Can't scan flash and build the RAM-based BBT\n"); + kfree (this->bbt); this->bbt = NULL; } return res; @@ -985,34 +873,35 @@ int nand_scan_bbt(struct mtd_info *mtd, struct nand_bbt_descr *bd) /* Allocate a temporary buffer for one eraseblock incl. oob */ len = (1 << this->bbt_erase_shift); len += (len >> this->page_shift) * mtd->oobsize; - buf = vmalloc(len); + buf = kmalloc (len, GFP_KERNEL); if (!buf) { - printk(KERN_ERR "nand_bbt: Out of memory\n"); - kfree(this->bbt); + printk (KERN_ERR "nand_bbt: Out of memory\n"); + kfree (this->bbt); this->bbt = NULL; return -ENOMEM; } /* Is the bbt at a given page ? */ if (td->options & NAND_BBT_ABSPAGE) { - res = read_abs_bbts(mtd, buf, td, md); + res = read_abs_bbts (mtd, buf, td, md); } else { /* Search the bad block table using a pattern in oob */ - res = search_read_bbts(mtd, buf, td, md); + res = search_read_bbts (mtd, buf, td, md); } if (res) - res = check_create(mtd, buf, bd); + res = check_create (mtd, buf, bd); /* Prevent the bbt regions from erasing / writing */ - mark_bbt_region(mtd, td); + mark_bbt_region (mtd, td); if (md) - mark_bbt_region(mtd, md); + mark_bbt_region (mtd, md); - vfree(buf); + kfree (buf); return res; } + /** * nand_update_bbt - [NAND Interface] update bad block table(s) * @mtd: MTD device structure @@ -1020,7 +909,7 @@ int nand_scan_bbt(struct mtd_info *mtd, struct nand_bbt_descr *bd) * * The function updates the bad block table(s) */ -int nand_update_bbt(struct mtd_info *mtd, loff_t offs) +int nand_update_bbt (struct mtd_info *mtd, loff_t offs) { struct nand_chip *this = mtd->priv; int len, res = 0, writeops = 0; @@ -1036,9 +925,9 @@ int nand_update_bbt(struct mtd_info *mtd, loff_t offs) /* Allocate a temporary buffer for one eraseblock incl. oob */ len = (1 << this->bbt_erase_shift); len += (len >> this->page_shift) * mtd->oobsize; - buf = kmalloc(len, GFP_KERNEL); + buf = kmalloc (len, GFP_KERNEL); if (!buf) { - printk(KERN_ERR "nand_update_bbt: Out of memory\n"); + printk (KERN_ERR "nand_update_bbt: Out of memory\n"); return -ENOMEM; } @@ -1046,7 +935,7 @@ int nand_update_bbt(struct mtd_info *mtd, loff_t offs) /* Do we have a bbt per chip ? */ if (td->options & NAND_BBT_PERCHIP) { - chip = (int)(offs >> this->chip_shift); + chip = (int) (offs >> this->chip_shift); chipsel = chip; } else { chip = 0; @@ -1059,17 +948,17 @@ int nand_update_bbt(struct mtd_info *mtd, loff_t offs) /* Write the bad block table to the device ? */ if ((writeops & 0x01) && (td->options & NAND_BBT_WRITE)) { - res = write_bbt(mtd, buf, td, md, chipsel); + res = write_bbt (mtd, buf, td, md, chipsel); if (res < 0) goto out; } /* Write the mirror bad block table to the device ? */ if ((writeops & 0x02) && md && (md->options & NAND_BBT_WRITE)) { - res = write_bbt(mtd, buf, md, td, chipsel); + res = write_bbt (mtd, buf, md, td, chipsel); } - out: - kfree(buf); +out: + kfree (buf); return res; } @@ -1092,14 +981,14 @@ static struct nand_bbt_descr largepage_memorybased = { }; static struct nand_bbt_descr smallpage_flashbased = { - .options = NAND_BBT_SCAN2NDPAGE, + .options = NAND_BBT_SCANEMPTY | NAND_BBT_SCANALLPAGES, .offs = 5, .len = 1, .pattern = scan_ff_pattern }; static struct nand_bbt_descr largepage_flashbased = { - .options = NAND_BBT_SCAN2NDPAGE, + .options = NAND_BBT_SCANEMPTY | NAND_BBT_SCANALLPAGES, .offs = 0, .len = 2, .pattern = scan_ff_pattern @@ -1147,7 +1036,7 @@ static struct nand_bbt_descr bbt_mirror_descr = { * support for the device and calls the nand_scan_bbt function * */ -int nand_default_bbt(struct mtd_info *mtd) +int nand_default_bbt (struct mtd_info *mtd) { struct nand_chip *this = mtd->priv; @@ -1157,7 +1046,7 @@ int nand_default_bbt(struct mtd_info *mtd) * of the good / bad information, so we _must_ store * this information in a good / bad table during * startup - */ + */ if (this->options & NAND_IS_AND) { /* Use the default pattern descriptors */ if (!this->bbt_td) { @@ -1165,9 +1054,10 @@ int nand_default_bbt(struct mtd_info *mtd) this->bbt_md = &bbt_mirror_descr; } this->options |= NAND_USE_FLASH_BBT; - return nand_scan_bbt(mtd, &agand_flashbased); + return nand_scan_bbt (mtd, &agand_flashbased); } + /* Is a flash based bad block table requested ? */ if (this->options & NAND_USE_FLASH_BBT) { /* Use the default pattern descriptors */ @@ -1176,17 +1066,18 @@ int nand_default_bbt(struct mtd_info *mtd) this->bbt_md = &bbt_mirror_descr; } if (!this->badblock_pattern) { - this->badblock_pattern = (mtd->writesize > 512) ? &largepage_flashbased : &smallpage_flashbased; + this->badblock_pattern = (mtd->oobblock > 512) ? + &largepage_flashbased : &smallpage_flashbased; } } else { this->bbt_td = NULL; this->bbt_md = NULL; if (!this->badblock_pattern) { - this->badblock_pattern = (mtd->writesize > 512) ? - &largepage_memorybased : &smallpage_memorybased; + this->badblock_pattern = (mtd->oobblock > 512) ? + &largepage_memorybased : &smallpage_memorybased; } } - return nand_scan_bbt(mtd, this->badblock_pattern); + return nand_scan_bbt (mtd, this->badblock_pattern); } /** @@ -1196,29 +1087,26 @@ int nand_default_bbt(struct mtd_info *mtd) * @allowbbt: allow access to bad block table region * */ -int nand_isbad_bbt(struct mtd_info *mtd, loff_t offs, int allowbbt) +int nand_isbad_bbt (struct mtd_info *mtd, loff_t offs, int allowbbt) { struct nand_chip *this = mtd->priv; int block; - uint8_t res; + uint8_t res; /* Get block number * 2 */ - block = (int)(offs >> (this->bbt_erase_shift - 1)); + block = (int) (offs >> (this->bbt_erase_shift - 1)); res = (this->bbt[block >> 3] >> (block & 0x06)) & 0x03; - DEBUG(MTD_DEBUG_LEVEL2, "nand_isbad_bbt(): bbt info for offs 0x%08x: (block %d) 0x%02x\n", - (unsigned int)offs, block >> 1, res); + DEBUG (MTD_DEBUG_LEVEL2, "nand_isbad_bbt(): bbt info for offs 0x%08x: (block %d) 0x%02x\n", + (unsigned int)offs, block >> 1, res); switch ((int)res) { - case 0x00: - return 0; - case 0x01: - return 1; - case 0x02: - return allowbbt ? 0 : 1; + case 0x00: return 0; + case 0x01: return 1; + case 0x02: return allowbbt ? 0 : 1; } return 1; } -EXPORT_SYMBOL(nand_scan_bbt); -EXPORT_SYMBOL(nand_default_bbt); +EXPORT_SYMBOL (nand_scan_bbt); +EXPORT_SYMBOL (nand_default_bbt); diff --git a/drivers/mtd/nand/nand_ecc.c b/drivers/mtd/nand/nand_ecc.c index dd438ca47..40ac90915 100644 --- a/drivers/mtd/nand/nand_ecc.c +++ b/drivers/mtd/nand/nand_ecc.c @@ -7,8 +7,6 @@ * Copyright (C) 2000-2004 Steven J. Hill (sjhill@realitydiluted.com) * Toshiba America Electronics Components, Inc. * - * Copyright (C) 2006 Thomas Gleixner - * * $Id: nand_ecc.c,v 1.15 2005/11/07 11:14:30 gleixner Exp $ * * This file is free software; you can redistribute it and/or modify it @@ -64,75 +62,90 @@ static const u_char nand_ecc_precalc_table[] = { 0x00, 0x55, 0x56, 0x03, 0x59, 0x0c, 0x0f, 0x5a, 0x5a, 0x0f, 0x0c, 0x59, 0x03, 0x56, 0x55, 0x00 }; + /** - * nand_calculate_ecc - [NAND Interface] Calculate 3-byte ECC for 256-byte block + * nand_trans_result - [GENERIC] create non-inverted ECC + * @reg2: line parity reg 2 + * @reg3: line parity reg 3 + * @ecc_code: ecc + * + * Creates non-inverted ECC code from line parity + */ +static void nand_trans_result(u_char reg2, u_char reg3, + u_char *ecc_code) +{ + u_char a, b, i, tmp1, tmp2; + + /* Initialize variables */ + a = b = 0x80; + tmp1 = tmp2 = 0; + + /* Calculate first ECC byte */ + for (i = 0; i < 4; i++) { + if (reg3 & a) /* LP15,13,11,9 --> ecc_code[0] */ + tmp1 |= b; + b >>= 1; + if (reg2 & a) /* LP14,12,10,8 --> ecc_code[0] */ + tmp1 |= b; + b >>= 1; + a >>= 1; + } + + /* Calculate second ECC byte */ + b = 0x80; + for (i = 0; i < 4; i++) { + if (reg3 & a) /* LP7,5,3,1 --> ecc_code[1] */ + tmp2 |= b; + b >>= 1; + if (reg2 & a) /* LP6,4,2,0 --> ecc_code[1] */ + tmp2 |= b; + b >>= 1; + a >>= 1; + } + + /* Store two of the ECC bytes */ + ecc_code[0] = tmp1; + ecc_code[1] = tmp2; +} + +/** + * nand_calculate_ecc - [NAND Interface] Calculate 3 byte ECC code for 256 byte block * @mtd: MTD block structure * @dat: raw data * @ecc_code: buffer for ECC */ -int nand_calculate_ecc(struct mtd_info *mtd, const u_char *dat, - u_char *ecc_code) +int nand_calculate_ecc(struct mtd_info *mtd, const u_char *dat, u_char *ecc_code) { - uint8_t idx, reg1, reg2, reg3, tmp1, tmp2; - int i; + u_char idx, reg1, reg2, reg3; + int j; /* Initialize variables */ reg1 = reg2 = reg3 = 0; + ecc_code[0] = ecc_code[1] = ecc_code[2] = 0; /* Build up column parity */ - for(i = 0; i < 256; i++) { + for(j = 0; j < 256; j++) { + /* Get CP0 - CP5 from table */ - idx = nand_ecc_precalc_table[*dat++]; + idx = nand_ecc_precalc_table[dat[j]]; reg1 ^= (idx & 0x3f); /* All bit XOR = 1 ? */ if (idx & 0x40) { - reg3 ^= (uint8_t) i; - reg2 ^= ~((uint8_t) i); + reg3 ^= (u_char) j; + reg2 ^= ~((u_char) j); } } /* Create non-inverted ECC code from line parity */ - tmp1 = (reg3 & 0x80) >> 0; /* B7 -> B7 */ - tmp1 |= (reg2 & 0x80) >> 1; /* B7 -> B6 */ - tmp1 |= (reg3 & 0x40) >> 1; /* B6 -> B5 */ - tmp1 |= (reg2 & 0x40) >> 2; /* B6 -> B4 */ - tmp1 |= (reg3 & 0x20) >> 2; /* B5 -> B3 */ - tmp1 |= (reg2 & 0x20) >> 3; /* B5 -> B2 */ - tmp1 |= (reg3 & 0x10) >> 3; /* B4 -> B1 */ - tmp1 |= (reg2 & 0x10) >> 4; /* B4 -> B0 */ - - tmp2 = (reg3 & 0x08) << 4; /* B3 -> B7 */ - tmp2 |= (reg2 & 0x08) << 3; /* B3 -> B6 */ - tmp2 |= (reg3 & 0x04) << 3; /* B2 -> B5 */ - tmp2 |= (reg2 & 0x04) << 2; /* B2 -> B4 */ - tmp2 |= (reg3 & 0x02) << 2; /* B1 -> B3 */ - tmp2 |= (reg2 & 0x02) << 1; /* B1 -> B2 */ - tmp2 |= (reg3 & 0x01) << 1; /* B0 -> B1 */ - tmp2 |= (reg2 & 0x01) << 0; /* B7 -> B0 */ + nand_trans_result(reg2, reg3, ecc_code); /* Calculate final ECC code */ -#ifdef CONFIG_NAND_ECC_SMC - ecc_code[0] = ~tmp2; - ecc_code[1] = ~tmp1; -#else - ecc_code[0] = ~tmp1; - ecc_code[1] = ~tmp2; -#endif + ecc_code[0] = ~ecc_code[0]; + ecc_code[1] = ~ecc_code[1]; ecc_code[2] = ((~reg1) << 2) | 0x03; - return 0; } -EXPORT_SYMBOL(nand_calculate_ecc); - -static inline int countbits(uint32_t byte) -{ - int res = 0; - - for (;byte; byte >>= 1) - res += byte & 0x01; - return res; -} /** * nand_correct_data - [NAND Interface] Detect and correct bit error(s) @@ -143,54 +156,93 @@ static inline int countbits(uint32_t byte) * * Detect and correct a 1 bit error for 256 byte block */ -int nand_correct_data(struct mtd_info *mtd, u_char *dat, - u_char *read_ecc, u_char *calc_ecc) +int nand_correct_data(struct mtd_info *mtd, u_char *dat, u_char *read_ecc, u_char *calc_ecc) { - uint8_t s0, s1, s2; - -#ifdef CONFIG_NAND_ECC_SMC - s0 = calc_ecc[0] ^ read_ecc[0]; - s1 = calc_ecc[1] ^ read_ecc[1]; - s2 = calc_ecc[2] ^ read_ecc[2]; -#else - s1 = calc_ecc[0] ^ read_ecc[0]; - s0 = calc_ecc[1] ^ read_ecc[1]; - s2 = calc_ecc[2] ^ read_ecc[2]; -#endif - if ((s0 | s1 | s2) == 0) - return 0; - - /* Check for a single bit error */ - if( ((s0 ^ (s0 >> 1)) & 0x55) == 0x55 && - ((s1 ^ (s1 >> 1)) & 0x55) == 0x55 && - ((s2 ^ (s2 >> 1)) & 0x54) == 0x54) { - - uint32_t byteoffs, bitnum; - - byteoffs = (s1 << 0) & 0x80; - byteoffs |= (s1 << 1) & 0x40; - byteoffs |= (s1 << 2) & 0x20; - byteoffs |= (s1 << 3) & 0x10; - - byteoffs |= (s0 >> 4) & 0x08; - byteoffs |= (s0 >> 3) & 0x04; - byteoffs |= (s0 >> 2) & 0x02; - byteoffs |= (s0 >> 1) & 0x01; + u_char a, b, c, d1, d2, d3, add, bit, i; - bitnum = (s2 >> 5) & 0x04; - bitnum |= (s2 >> 4) & 0x02; - bitnum |= (s2 >> 3) & 0x01; + /* Do error detection */ + d1 = calc_ecc[0] ^ read_ecc[0]; + d2 = calc_ecc[1] ^ read_ecc[1]; + d3 = calc_ecc[2] ^ read_ecc[2]; - dat[byteoffs] ^= (1 << bitnum); - - return 1; + if ((d1 | d2 | d3) == 0) { + /* No errors */ + return 0; + } + else { + a = (d1 ^ (d1 >> 1)) & 0x55; + b = (d2 ^ (d2 >> 1)) & 0x55; + c = (d3 ^ (d3 >> 1)) & 0x54; + + /* Found and will correct single bit error in the data */ + if ((a == 0x55) && (b == 0x55) && (c == 0x54)) { + c = 0x80; + add = 0; + a = 0x80; + for (i=0; i<4; i++) { + if (d1 & c) + add |= a; + c >>= 2; + a >>= 1; + } + c = 0x80; + for (i=0; i<4; i++) { + if (d2 & c) + add |= a; + c >>= 2; + a >>= 1; + } + bit = 0; + b = 0x04; + c = 0x80; + for (i=0; i<3; i++) { + if (d3 & c) + bit |= b; + c >>= 2; + b >>= 1; + } + b = 0x01; + a = dat[add]; + a ^= (b << bit); + dat[add] = a; + return 1; + } + else { + i = 0; + while (d1) { + if (d1 & 0x01) + ++i; + d1 >>= 1; + } + while (d2) { + if (d2 & 0x01) + ++i; + d2 >>= 1; + } + while (d3) { + if (d3 & 0x01) + ++i; + d3 >>= 1; + } + if (i == 1) { + /* ECC Code Error Correction */ + read_ecc[0] = calc_ecc[0]; + read_ecc[1] = calc_ecc[1]; + read_ecc[2] = calc_ecc[2]; + return 2; + } + else { + /* Uncorrectable Error */ + return -1; + } + } } - if(countbits(s0 | ((uint32_t)s1 << 8) | ((uint32_t)s2 <<16)) == 1) - return 1; - + /* Should never happen */ return -1; } + +EXPORT_SYMBOL(nand_calculate_ecc); EXPORT_SYMBOL(nand_correct_data); MODULE_LICENSE("GPL"); diff --git a/drivers/mtd/nand/nand_ids.c b/drivers/mtd/nand/nand_ids.c index 2e2cdf2fc..dbc7e55a4 100644 --- a/drivers/mtd/nand/nand_ids.c +++ b/drivers/mtd/nand/nand_ids.c @@ -18,110 +18,99 @@ * Name. ID code, pagesize, chipsize in MegaByte, eraseblock size, * options * -* Pagesize; 0, 256, 512 -* 0 get this information from the extended chip ID +* Pagesize; 0, 256, 512 +* 0 get this information from the extended chip ID + 256 256 Byte page size * 512 512 Byte page size */ struct nand_flash_dev nand_flash_ids[] = { - {"NAND 1MiB 5V 8-bit", 0x6e, 256, 1, 0x1000, 0}, - {"NAND 2MiB 5V 8-bit", 0x64, 256, 2, 0x1000, 0}, - {"NAND 4MiB 5V 8-bit", 0x6b, 512, 4, 0x2000, 0}, - {"NAND 1MiB 3,3V 8-bit", 0xe8, 256, 1, 0x1000, 0}, - {"NAND 1MiB 3,3V 8-bit", 0xec, 256, 1, 0x1000, 0}, - {"NAND 2MiB 3,3V 8-bit", 0xea, 256, 2, 0x1000, 0}, - {"NAND 4MiB 3,3V 8-bit", 0xd5, 512, 4, 0x2000, 0}, - {"NAND 4MiB 3,3V 8-bit", 0xe3, 512, 4, 0x2000, 0}, - {"NAND 4MiB 3,3V 8-bit", 0xe5, 512, 4, 0x2000, 0}, - {"NAND 8MiB 3,3V 8-bit", 0xd6, 512, 8, 0x2000, 0}, - - {"NAND 8MiB 1,8V 8-bit", 0x39, 512, 8, 0x2000, 0}, - {"NAND 8MiB 3,3V 8-bit", 0xe6, 512, 8, 0x2000, 0}, - {"NAND 8MiB 1,8V 16-bit", 0x49, 512, 8, 0x2000, NAND_BUSWIDTH_16}, - {"NAND 8MiB 3,3V 16-bit", 0x59, 512, 8, 0x2000, NAND_BUSWIDTH_16}, - - {"NAND 16MiB 1,8V 8-bit", 0x33, 512, 16, 0x4000, 0}, - {"NAND 16MiB 3,3V 8-bit", 0x73, 512, 16, 0x4000, 0}, - {"NAND 16MiB 1,8V 16-bit", 0x43, 512, 16, 0x4000, NAND_BUSWIDTH_16}, - {"NAND 16MiB 3,3V 16-bit", 0x53, 512, 16, 0x4000, NAND_BUSWIDTH_16}, - - {"NAND 32MiB 1,8V 8-bit", 0x35, 512, 32, 0x4000, 0}, - {"NAND 32MiB 3,3V 8-bit", 0x75, 512, 32, 0x4000, 0}, - {"NAND 32MiB 1,8V 16-bit", 0x45, 512, 32, 0x4000, NAND_BUSWIDTH_16}, - {"NAND 32MiB 3,3V 16-bit", 0x55, 512, 32, 0x4000, NAND_BUSWIDTH_16}, - - {"NAND 64MiB 1,8V 8-bit", 0x36, 512, 64, 0x4000, 0}, - {"NAND 64MiB 3,3V 8-bit", 0x76, 512, 64, 0x4000, 0}, - {"NAND 64MiB 1,8V 16-bit", 0x46, 512, 64, 0x4000, NAND_BUSWIDTH_16}, - {"NAND 64MiB 3,3V 16-bit", 0x56, 512, 64, 0x4000, NAND_BUSWIDTH_16}, - - {"NAND 128MiB 1,8V 8-bit", 0x78, 512, 128, 0x4000, 0}, - {"NAND 128MiB 1,8V 8-bit", 0x39, 512, 128, 0x4000, 0}, - {"NAND 128MiB 3,3V 8-bit", 0x79, 512, 128, 0x4000, 0}, - {"NAND 128MiB 1,8V 16-bit", 0x72, 512, 128, 0x4000, NAND_BUSWIDTH_16}, - {"NAND 128MiB 1,8V 16-bit", 0x49, 512, 128, 0x4000, NAND_BUSWIDTH_16}, - {"NAND 128MiB 3,3V 16-bit", 0x74, 512, 128, 0x4000, NAND_BUSWIDTH_16}, - {"NAND 128MiB 3,3V 16-bit", 0x59, 512, 128, 0x4000, NAND_BUSWIDTH_16}, - - {"NAND 256MiB 3,3V 8-bit", 0x71, 512, 256, 0x4000, 0}, - - /* - * These are the new chips with large page size. The pagesize and the - * erasesize is determined from the extended id bytes - */ -#define LP_OPTIONS (NAND_SAMSUNG_LP_OPTIONS | NAND_NO_READRDY | NAND_NO_AUTOINCR) -#define LP_OPTIONS16 (LP_OPTIONS | NAND_BUSWIDTH_16) - + {"NAND 1MiB 5V 8-bit", 0x6e, 256, 1, 0x1000, 0}, + {"NAND 2MiB 5V 8-bit", 0x64, 256, 2, 0x1000, 0}, + {"NAND 4MiB 5V 8-bit", 0x6b, 512, 4, 0x2000, 0}, + {"NAND 1MiB 3,3V 8-bit", 0xe8, 256, 1, 0x1000, 0}, + {"NAND 1MiB 3,3V 8-bit", 0xec, 256, 1, 0x1000, 0}, + {"NAND 2MiB 3,3V 8-bit", 0xea, 256, 2, 0x1000, 0}, + {"NAND 4MiB 3,3V 8-bit", 0xd5, 512, 4, 0x2000, 0}, + {"NAND 4MiB 3,3V 8-bit", 0xe3, 512, 4, 0x2000, 0}, + {"NAND 4MiB 3,3V 8-bit", 0xe5, 512, 4, 0x2000, 0}, + {"NAND 8MiB 3,3V 8-bit", 0xd6, 512, 8, 0x2000, 0}, + + {"NAND 8MiB 1,8V 8-bit", 0x39, 512, 8, 0x2000, 0}, + {"NAND 8MiB 3,3V 8-bit", 0xe6, 512, 8, 0x2000, 0}, + {"NAND 8MiB 1,8V 16-bit", 0x49, 512, 8, 0x2000, NAND_BUSWIDTH_16}, + {"NAND 8MiB 3,3V 16-bit", 0x59, 512, 8, 0x2000, NAND_BUSWIDTH_16}, + + {"NAND 16MiB 1,8V 8-bit", 0x33, 512, 16, 0x4000, 0}, + {"NAND 16MiB 3,3V 8-bit", 0x73, 512, 16, 0x4000, 0}, + {"NAND 16MiB 1,8V 16-bit", 0x43, 512, 16, 0x4000, NAND_BUSWIDTH_16}, + {"NAND 16MiB 3,3V 16-bit", 0x53, 512, 16, 0x4000, NAND_BUSWIDTH_16}, + + {"NAND 32MiB 1,8V 8-bit", 0x35, 512, 32, 0x4000, 0}, + {"NAND 32MiB 3,3V 8-bit", 0x75, 512, 32, 0x4000, 0}, + {"NAND 32MiB 1,8V 16-bit", 0x45, 512, 32, 0x4000, NAND_BUSWIDTH_16}, + {"NAND 32MiB 3,3V 16-bit", 0x55, 512, 32, 0x4000, NAND_BUSWIDTH_16}, + + {"NAND 64MiB 1,8V 8-bit", 0x36, 512, 64, 0x4000, 0}, + {"NAND 64MiB 3,3V 8-bit", 0x76, 512, 64, 0x4000, 0}, + {"NAND 64MiB 1,8V 16-bit", 0x46, 512, 64, 0x4000, NAND_BUSWIDTH_16}, + {"NAND 64MiB 3,3V 16-bit", 0x56, 512, 64, 0x4000, NAND_BUSWIDTH_16}, + + {"NAND 128MiB 1,8V 8-bit", 0x78, 512, 128, 0x4000, 0}, + {"NAND 128MiB 1,8V 8-bit", 0x39, 512, 128, 0x4000, 0}, + {"NAND 128MiB 3,3V 8-bit", 0x79, 512, 128, 0x4000, 0}, + {"NAND 128MiB 1,8V 16-bit", 0x72, 512, 128, 0x4000, NAND_BUSWIDTH_16}, + {"NAND 128MiB 1,8V 16-bit", 0x49, 512, 128, 0x4000, NAND_BUSWIDTH_16}, + {"NAND 128MiB 3,3V 16-bit", 0x74, 512, 128, 0x4000, NAND_BUSWIDTH_16}, + {"NAND 128MiB 3,3V 16-bit", 0x59, 512, 128, 0x4000, NAND_BUSWIDTH_16}, + + {"NAND 256MiB 3,3V 8-bit", 0x71, 512, 256, 0x4000, 0}, + + /* These are the new chips with large page size. The pagesize + * and the erasesize is determined from the extended id bytes + */ /*512 Megabit */ - {"NAND 64MiB 1,8V 8-bit", 0xA2, 0, 64, 0, LP_OPTIONS}, - {"NAND 64MiB 3,3V 8-bit", 0xF2, 0, 64, 0, LP_OPTIONS}, - {"NAND 64MiB 1,8V 16-bit", 0xB2, 0, 64, 0, LP_OPTIONS16}, - {"NAND 64MiB 3,3V 16-bit", 0xC2, 0, 64, 0, LP_OPTIONS16}, + {"NAND 64MiB 1,8V 8-bit", 0xA2, 0, 64, 0, NAND_SAMSUNG_LP_OPTIONS | NAND_NO_AUTOINCR}, + {"NAND 64MiB 3,3V 8-bit", 0xF2, 0, 64, 0, NAND_SAMSUNG_LP_OPTIONS | NAND_NO_AUTOINCR}, + {"NAND 64MiB 1,8V 16-bit", 0xB2, 0, 64, 0, NAND_SAMSUNG_LP_OPTIONS | NAND_BUSWIDTH_16 | NAND_NO_AUTOINCR}, + {"NAND 64MiB 3,3V 16-bit", 0xC2, 0, 64, 0, NAND_SAMSUNG_LP_OPTIONS | NAND_BUSWIDTH_16 | NAND_NO_AUTOINCR}, /* 1 Gigabit */ - {"NAND 128MiB 1,8V 8-bit", 0xA1, 0, 128, 0, LP_OPTIONS}, - {"NAND 128MiB 3,3V 8-bit", 0xF1, 0, 128, 0, LP_OPTIONS}, - {"NAND 128MiB 1,8V 16-bit", 0xB1, 0, 128, 0, LP_OPTIONS16}, - {"NAND 128MiB 3,3V 16-bit", 0xC1, 0, 128, 0, LP_OPTIONS16}, + {"NAND 128MiB 1,8V 8-bit", 0xA1, 0, 128, 0, NAND_SAMSUNG_LP_OPTIONS | NAND_NO_AUTOINCR}, + {"NAND 128MiB 3,3V 8-bit", 0xF1, 0, 128, 0, NAND_SAMSUNG_LP_OPTIONS | NAND_NO_AUTOINCR}, + {"NAND 128MiB 1,8V 16-bit", 0xB1, 0, 128, 0, NAND_SAMSUNG_LP_OPTIONS | NAND_BUSWIDTH_16 | NAND_NO_AUTOINCR}, + {"NAND 128MiB 3,3V 16-bit", 0xC1, 0, 128, 0, NAND_SAMSUNG_LP_OPTIONS | NAND_BUSWIDTH_16 | NAND_NO_AUTOINCR}, /* 2 Gigabit */ - {"NAND 256MiB 1,8V 8-bit", 0xAA, 0, 256, 0, LP_OPTIONS}, - {"NAND 256MiB 3,3V 8-bit", 0xDA, 0, 256, 0, LP_OPTIONS}, - {"NAND 256MiB 1,8V 16-bit", 0xBA, 0, 256, 0, LP_OPTIONS16}, - {"NAND 256MiB 3,3V 16-bit", 0xCA, 0, 256, 0, LP_OPTIONS16}, + {"NAND 256MiB 1,8V 8-bit", 0xAA, 0, 256, 0, NAND_SAMSUNG_LP_OPTIONS | NAND_NO_AUTOINCR}, + {"NAND 256MiB 3,3V 8-bit", 0xDA, 0, 256, 0, NAND_SAMSUNG_LP_OPTIONS | NAND_NO_AUTOINCR}, + {"NAND 256MiB 1,8V 16-bit", 0xBA, 0, 256, 0, NAND_SAMSUNG_LP_OPTIONS | NAND_BUSWIDTH_16 | NAND_NO_AUTOINCR}, + {"NAND 256MiB 3,3V 16-bit", 0xCA, 0, 256, 0, NAND_SAMSUNG_LP_OPTIONS | NAND_BUSWIDTH_16 | NAND_NO_AUTOINCR}, /* 4 Gigabit */ - {"NAND 512MiB 1,8V 8-bit", 0xAC, 0, 512, 0, LP_OPTIONS}, - {"NAND 512MiB 3,3V 8-bit", 0xDC, 0, 512, 0, LP_OPTIONS}, - {"NAND 512MiB 1,8V 16-bit", 0xBC, 0, 512, 0, LP_OPTIONS16}, - {"NAND 512MiB 3,3V 16-bit", 0xCC, 0, 512, 0, LP_OPTIONS16}, + {"NAND 512MiB 1,8V 8-bit", 0xAC, 0, 512, 0, NAND_SAMSUNG_LP_OPTIONS | NAND_NO_AUTOINCR}, + {"NAND 512MiB 3,3V 8-bit", 0xDC, 0, 512, 0, NAND_SAMSUNG_LP_OPTIONS | NAND_NO_AUTOINCR}, + {"NAND 512MiB 1,8V 16-bit", 0xBC, 0, 512, 0, NAND_SAMSUNG_LP_OPTIONS | NAND_BUSWIDTH_16 | NAND_NO_AUTOINCR}, + {"NAND 512MiB 3,3V 16-bit", 0xCC, 0, 512, 0, NAND_SAMSUNG_LP_OPTIONS | NAND_BUSWIDTH_16 | NAND_NO_AUTOINCR}, /* 8 Gigabit */ - {"NAND 1GiB 1,8V 8-bit", 0xA3, 0, 1024, 0, LP_OPTIONS}, - {"NAND 1GiB 3,3V 8-bit", 0xD3, 0, 1024, 0, LP_OPTIONS}, - {"NAND 1GiB 1,8V 16-bit", 0xB3, 0, 1024, 0, LP_OPTIONS16}, - {"NAND 1GiB 3,3V 16-bit", 0xC3, 0, 1024, 0, LP_OPTIONS16}, + {"NAND 1GiB 1,8V 8-bit", 0xA3, 0, 1024, 0, NAND_SAMSUNG_LP_OPTIONS | NAND_NO_AUTOINCR}, + {"NAND 1GiB 3,3V 8-bit", 0xD3, 0, 1024, 0, NAND_SAMSUNG_LP_OPTIONS | NAND_NO_AUTOINCR}, + {"NAND 1GiB 1,8V 16-bit", 0xB3, 0, 1024, 0, NAND_SAMSUNG_LP_OPTIONS | NAND_BUSWIDTH_16 | NAND_NO_AUTOINCR}, + {"NAND 1GiB 3,3V 16-bit", 0xC3, 0, 1024, 0, NAND_SAMSUNG_LP_OPTIONS | NAND_BUSWIDTH_16 | NAND_NO_AUTOINCR}, /* 16 Gigabit */ - {"NAND 2GiB 1,8V 8-bit", 0xA5, 0, 2048, 0, LP_OPTIONS}, - {"NAND 2GiB 3,3V 8-bit", 0xD5, 0, 2048, 0, LP_OPTIONS}, - {"NAND 2GiB 1,8V 16-bit", 0xB5, 0, 2048, 0, LP_OPTIONS16}, - {"NAND 2GiB 3,3V 16-bit", 0xC5, 0, 2048, 0, LP_OPTIONS16}, - - /* - * Renesas AND 1 Gigabit. Those chips do not support extended id and - * have a strange page/block layout ! The chosen minimum erasesize is - * 4 * 2 * 2048 = 16384 Byte, as those chips have an array of 4 page - * planes 1 block = 2 pages, but due to plane arrangement the blocks - * 0-3 consists of page 0 + 4,1 + 5, 2 + 6, 3 + 7 Anyway JFFS2 would - * increase the eraseblock size so we chose a combined one which can be - * erased in one go There are more speed improvements for reads and - * writes possible, but not implemented now + {"NAND 2GiB 1,8V 8-bit", 0xA5, 0, 2048, 0, NAND_SAMSUNG_LP_OPTIONS | NAND_NO_AUTOINCR}, + {"NAND 2GiB 3,3V 8-bit", 0xD5, 0, 2048, 0, NAND_SAMSUNG_LP_OPTIONS | NAND_NO_AUTOINCR}, + {"NAND 2GiB 1,8V 16-bit", 0xB5, 0, 2048, 0, NAND_SAMSUNG_LP_OPTIONS | NAND_BUSWIDTH_16 | NAND_NO_AUTOINCR}, + {"NAND 2GiB 3,3V 16-bit", 0xC5, 0, 2048, 0, NAND_SAMSUNG_LP_OPTIONS | NAND_BUSWIDTH_16 | NAND_NO_AUTOINCR}, + + /* Renesas AND 1 Gigabit. Those chips do not support extended id and have a strange page/block layout ! + * The chosen minimum erasesize is 4 * 2 * 2048 = 16384 Byte, as those chips have an array of 4 page planes + * 1 block = 2 pages, but due to plane arrangement the blocks 0-3 consists of page 0 + 4,1 + 5, 2 + 6, 3 + 7 + * Anyway JFFS2 would increase the eraseblock size so we chose a combined one which can be erased in one go + * There are more speed improvements for reads and writes possible, but not implemented now */ - {"AND 128MiB 3,3V 8-bit", 0x01, 2048, 128, 0x4000, - NAND_IS_AND | NAND_NO_AUTOINCR |NAND_NO_READRDY | NAND_4PAGE_ARRAY | - BBT_AUTO_REFRESH - }, + {"AND 128MiB 3,3V 8-bit", 0x01, 2048, 128, 0x4000, NAND_IS_AND | NAND_NO_AUTOINCR | NAND_4PAGE_ARRAY | BBT_AUTO_REFRESH}, {NULL,} }; @@ -136,13 +125,13 @@ struct nand_manufacturers nand_manuf_ids[] = { {NAND_MFR_NATIONAL, "National"}, {NAND_MFR_RENESAS, "Renesas"}, {NAND_MFR_STMICRO, "ST Micro"}, - {NAND_MFR_HYNIX, "Hynix"}, + {NAND_MFR_HYNIX, "Hynix"}, {0x0, "Unknown"} }; -EXPORT_SYMBOL(nand_manuf_ids); -EXPORT_SYMBOL(nand_flash_ids); +EXPORT_SYMBOL (nand_manuf_ids); +EXPORT_SYMBOL (nand_flash_ids); -MODULE_LICENSE("GPL"); -MODULE_AUTHOR("Thomas Gleixner "); -MODULE_DESCRIPTION("Nand device & manufacturer IDs"); +MODULE_LICENSE ("GPL"); +MODULE_AUTHOR ("Thomas Gleixner "); +MODULE_DESCRIPTION ("Nand device & manufacturer ID's"); diff --git a/drivers/mtd/nand/nandsim.c b/drivers/mtd/nand/nandsim.c index 545ff252d..a0af92cc7 100644 --- a/drivers/mtd/nand/nandsim.c +++ b/drivers/mtd/nand/nandsim.c @@ -25,6 +25,7 @@ * $Id: nandsim.c,v 1.8 2005/03/19 15:33:56 dedekind Exp $ */ +#include #include #include #include @@ -368,7 +369,7 @@ init_nandsim(struct mtd_info *mtd) /* Initialize the NAND flash parameters */ ns->busw = chip->options & NAND_BUSWIDTH_16 ? 16 : 8; ns->geom.totsz = mtd->size; - ns->geom.pgsz = mtd->writesize; + ns->geom.pgsz = mtd->oobblock; ns->geom.oobsz = mtd->oobsize; ns->geom.secsz = mtd->erasesize; ns->geom.pgszoob = ns->geom.pgsz + ns->geom.oobsz; @@ -1070,6 +1071,68 @@ 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) { @@ -1296,18 +1359,6 @@ 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) { @@ -1325,6 +1376,17 @@ ns_nand_read_word(struct mtd_info *mtd) 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) { @@ -1452,14 +1514,16 @@ static int __init ns_init_module(void) /* * Register simulator's callbacks. */ - chip->cmd_ctrl = ns_hwcontrol; + chip->hwcontrol = ns_hwcontrol; chip->read_byte = ns_nand_read_byte; chip->dev_ready = ns_device_ready; + 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->ecc.mode = NAND_ECC_SOFT; + chip->eccmode = NAND_ECC_SOFT; chip->options |= NAND_SKIP_BBTSCAN; /* @@ -1482,8 +1546,6 @@ static 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) diff --git a/drivers/mtd/nand/ppchameleonevb.c b/drivers/mtd/nand/ppchameleonevb.c index 22fa65c12..91a95f34a 100644 --- a/drivers/mtd/nand/ppchameleonevb.c +++ b/drivers/mtd/nand/ppchameleonevb.c @@ -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,96 +80,82 @@ __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, - unsigned int ctrl) +static void ppchameleon_hwcontrol(struct mtd_info *mtdinfo, int cmd) { - 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: + 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, - unsigned int ctrl) +static void ppchameleonevb_hwcontrol(struct mtd_info *mtdinfo, int cmd) { - 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; - } + 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 @@ -178,15 +164,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 @@ -199,7 +185,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; @@ -208,11 +194,13 @@ 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; @@ -220,65 +208,63 @@ 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(ppchameleon_mtd, 0, sizeof(struct mtd_info)); - memset(this, 0, sizeof(struct nand_chip)); + memset((char *) ppchameleon_mtd, 0, sizeof(struct mtd_info)); + memset((char *) 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->cmd_ctrl = ppchameleon_hwcontrol; + this->hwcontrol = ppchameleon_hwcontrol; #ifdef USE_READY_BUSY_PIN this->dev_ready = ppchameleon_device_ready; #endif this->chip_delay = NAND_BIG_DELAY_US; /* ECC mode */ - this->ecc.mode = NAND_ECC_SOFT; + this->eccmode = 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) @@ -289,11 +275,12 @@ 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 @@ -306,12 +293,13 @@ 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; @@ -319,76 +307,77 @@ static int __init ppchameleonevb_init(void) /* 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(ppchameleonevb_mtd, 0, sizeof(struct mtd_info)); - memset(this, 0, sizeof(struct nand_chip)); + memset((char *) ppchameleonevb_mtd, 0, sizeof(struct mtd_info)); + memset((char *) 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->cmd_ctrl = ppchameleonevb_hwcontrol; + this->hwcontrol = ppchameleonevb_hwcontrol; #ifdef USE_READY_BUSY_PIN this->dev_ready = ppchameleonevb_device_ready; #endif this->chip_delay = NAND_SMALL_DELAY_US; /* ECC mode */ - this->ecc.mode = NAND_ECC_SOFT; + this->eccmode = 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"; @@ -401,19 +390,18 @@ static int __init ppchameleonevb_init(void) /* 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]; diff --git a/drivers/mtd/nand/rtc_from4.c b/drivers/mtd/nand/rtc_from4.c index f8c496453..4129c03df 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,6 +134,8 @@ static struct nand_bbt_descr rtc_from4_bbt_mirror_descr = { .pattern = mirror_pattern }; + + #ifdef RTC_FROM4_HWECC /* the Reed Solomon control structure */ @@ -142,14 +144,15 @@ static struct rs_control *rs_decoder; /* * hardware specific Out Of Band information */ -static struct nand_ecclayout rtc_from4_nand_oobinfo = { +static struct nand_oobinfo rtc_from4_nand_oobinfo = { + .useecc = MTD_NANDECC_AUTOPLACE, .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 @@ -159,42 +162,44 @@ static struct nand_ecclayout 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 @@ -207,20 +212,35 @@ 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, - unsigned int ctrl) +static void rtc_from4_hwcontrol(struct mtd_info *mtd, int cmd) { - struct nand_chip *chip = (mtd->priv); + struct nand_chip* this = (struct nand_chip *) (mtd->priv); + + switch(cmd) { - if (cmd == NAND_CMD_NONE) - return; + 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 (ctrl & NAND_CLE) - writeb(cmd, chip->IO_ADDR_W | RTC_FROM4_CLE); - else - writeb(cmd, chip->IO_ADDR_W | RTC_FROM4_ALE); + case NAND_CTL_SETNCE: + break; + case NAND_CTL_CLRNCE: + break; + + } } + /* * rtc_from4_nand_select_chip - hardware specific chip select * @mtd: MTD device structure @@ -232,25 +252,26 @@ 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 @@ -269,6 +290,7 @@ 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 @@ -284,23 +306,24 @@ 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 @@ -312,35 +335,39 @@ 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 @@ -356,7 +383,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; @@ -368,6 +395,7 @@ 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 @@ -386,7 +414,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)); @@ -396,18 +424,23 @@ 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++) { @@ -420,14 +453,16 @@ 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 @@ -443,66 +478,54 @@ 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))) - 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); + 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 */ + } + } } - } 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)) { - /* 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; + 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); + } } - - /* 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 */ } @@ -510,32 +533,33 @@ static int rtc_from4_errstat(struct mtd_info *mtd, struct nand_chip *this, } #endif + /* * Main initialization routine */ -static int __init rtc_from4_init(void) +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(rtc_from4_mtd, 0, sizeof(struct mtd_info)); - memset(this, 0, sizeof(struct nand_chip)); + memset((char *) rtc_from4_mtd, 0, sizeof(struct mtd_info)); + memset((char *) 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; @@ -556,9 +580,9 @@ static 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->cmd_ctrl = rtc_from4_hwcontrol; + this->hwcontrol = 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 */ @@ -567,20 +591,19 @@ static int __init rtc_from4_init(void) #ifdef RTC_FROM4_HWECC printk(KERN_INFO "rtc_from4_init: using hardware ECC detection.\n"); - this->ecc.mode = NAND_ECC_HW_SYNDROME; - this->ecc.size = 512; - this->ecc.bytes = 8; + this->eccmode = NAND_ECC_HW8_512; + this->options |= NAND_HWECC_SYNDROME; /* 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->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; + 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; #else printk(KERN_INFO "rtc_from4_init: using software ECC detection.\n"); - this->ecc.mode = NAND_ECC_SOFT; + this->eccmode = NAND_ECC_SOFT; #endif /* set the bad block tables to support debugging */ @@ -594,7 +617,7 @@ static 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); } @@ -620,7 +643,7 @@ static 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; @@ -629,19 +652,20 @@ static int __init rtc_from4_init(void) /* Return happy */ return 0; } - module_init(rtc_from4_init); + /* * Clean up routine */ -static void __exit rtc_from4_cleanup(void) +#ifdef MODULE +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 */ @@ -650,9 +674,10 @@ 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 @@ -63,26 +65,22 @@ #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_ecclayout nand_hw_eccoob = { - .eccbytes = 3, - .eccpos = {0, 1, 2}, - .oobfree = {{8, 8}} +static struct nand_oobinfo nand_hw_eccoob = { + .useecc = MTD_NANDECC_AUTOPLACE, + .eccbytes = 3, + .eccpos = {0, 1, 2 }, + .oobfree = { {8, 8} } }; /* controller and mtd information */ @@ -97,12 +95,6 @@ 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 { @@ -116,11 +108,9 @@ struct s3c2410_nand_info { struct resource *area; struct clk *clk; void __iomem *regs; - void __iomem *sel_reg; - int sel_bit; int mtd_count; - enum s3c_cpu_type cpu_type; + unsigned char is_s3c2440; }; /* conversion functions */ @@ -145,16 +135,11 @@ 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 s3c_nand_calc_rate(int wanted, unsigned long clk, int max) +static int s3c2410_nand_calc_rate(int wanted, unsigned long clk, int max) { int result; @@ -164,7 +149,8 @@ static int s3c_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; } @@ -183,53 +169,46 @@ 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 = 0; + unsigned long cfg; /* calculate the timing information for the controller */ clkrate /= 1000; /* turn clock into kHz for ease of use */ if (plat != NULL) { - 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); + 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); } else { /* default timings */ - tacls = tacls_max; + tacls = 4; twrph0 = 8; twrph1 = 8; } if (tacls < 0 || twrph0 < 0 || twrph1 < 0) { - dev_err(info->device, "cannot get suitable timings\n"); + printk(KERN_ERR PFX "cannot get timings suitable for board\n"); return -EINVAL; } - 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)); + 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)); - 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); + 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); } - dev_dbg(info->device, "NF_CONF is 0x%lx\n", cfg); + pr_debug(PFX "NF_CONF is 0x%lx\n", cfg); writel(cfg, info->regs + S3C2410_NFCONF); return 0; @@ -242,71 +221,99 @@ 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; - if (chip != -1 && allow_clk_stop(info)) - clk_enable(info->clk); + bit = (info->is_s3c2440) ? S3C2440_NFCONT_nFCE : S3C2410_NFCONF_nFCE; + reg = info->regs+((info->is_s3c2440) ? S3C2440_NFCONT:S3C2410_NFCONF); - cur = readl(info->sel_reg); + cur = readl(reg); if (chip == -1) { - cur |= info->sel_bit; + cur |= bit; } else { if (nmtd->set != NULL && chip > nmtd->set->nr_chips) { - dev_err(info->device, "invalid chip %d\n", chip); + printk(KERN_ERR PFX "chip %d out of range\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 &= ~info->sel_bit; + cur &= ~bit; } - writel(cur, info->sel_reg); - - if (chip == -1 && allow_clk_stop(info)) - clk_disable(info->clk); + writel(cur, reg); } -/* s3c2410_nand_hwcontrol +/* 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. * - * Issue command and address cycles to the chip */ -static void s3c2410_nand_hwcontrol(struct mtd_info *mtd, int cmd, - unsigned int ctrl) +static void s3c2410_nand_hwcontrol(struct mtd_info *mtd, int cmd) { struct s3c2410_nand_info *info = s3c2410_nand_mtd_toinfo(mtd); - - if (cmd == NAND_CMD_NONE) - return; - - if (ctrl & NAND_CLE) - writeb(cmd, info->regs + S3C2410_NFCMD); - else - writeb(cmd, info->regs + S3C2410_NFADDR); + 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; + } } /* command and control functions */ -static void s3c2440_nand_hwcontrol(struct mtd_info *mtd, int cmd, - unsigned int ctrl) +static void s3c2440_nand_hwcontrol(struct mtd_info *mtd, int cmd) { struct s3c2410_nand_info *info = s3c2410_nand_mtd_toinfo(mtd); + struct nand_chip *chip = mtd->priv; - if (cmd == NAND_CMD_NONE) - return; + 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 (ctrl & NAND_CLE) - writeb(cmd, info->regs + S3C2440_NFCMD); - else - writeb(cmd, info->regs + S3C2440_NFADDR); + /* NAND_CTL_CLRCLE: */ + /* NAND_CTL_CLRALE: */ + default: + chip->IO_ADDR_W = info->regs + S3C2440_NFDATA; + break; + } } /* s3c2410_nand_devready() @@ -317,32 +324,28 @@ 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); - 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; + if (info->is_s3c2440) + return readb(info->regs + S3C2440_NFSTAT) & S3C2440_NFSTAT_READY; + return readb(info->regs + S3C2410_NFSTAT) & S3C2410_NFSTAT_BUSY; } -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 */ @@ -375,7 +378,8 @@ 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); @@ -383,12 +387,15 @@ static int s3c2410_nand_calculate_ecc(struct mtd_info *mtd, const u_char *dat, u 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); @@ -397,11 +404,13 @@ static int s3c2440_nand_calculate_ecc(struct mtd_info *mtd, const u_char *dat, u 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 */ @@ -412,7 +421,8 @@ 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); @@ -449,8 +459,7 @@ static int s3c2410_nand_remove(struct platform_device *pdev) /* free the common resources */ if (info->clk != NULL && !IS_ERR(info->clk)) { - if (!allow_clk_stop(info)) - clk_disable(info->clk); + clk_disable(info->clk); clk_put(info->clk); } @@ -479,7 +488,9 @@ 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); @@ -503,8 +514,11 @@ 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; @@ -513,66 +527,29 @@ static void s3c2410_nand_init_chip(struct s3c2410_nand_info *info, chip->options = 0; chip->controller = &info->controller; - 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; + 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; + } nmtd->info = info; nmtd->mtd.priv = chip; - nmtd->mtd.owner = THIS_MODULE; nmtd->set = set; if (hardware_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; - + 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; } } else { - chip->ecc.mode = NAND_ECC_SOFT; + chip->eccmode = NAND_ECC_SOFT; } } @@ -584,8 +561,7 @@ 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, - enum s3c_cpu_type cpu_type) +static int s3c24xx_nand_probe(struct platform_device *pdev, int is_s3c2440) { struct s3c2410_platform_nand *plat = to_nand_plat(pdev); struct s3c2410_nand_info *info; @@ -640,7 +616,7 @@ static int s3c24xx_nand_probe(struct platform_device *pdev, info->device = &pdev->dev; info->platform = plat; info->regs = ioremap(res->start, size); - info->cpu_type = cpu_type; + info->is_s3c2440 = is_s3c2440; if (info->regs == NULL) { dev_err(&pdev->dev, "cannot reserve register region\n"); @@ -678,11 +654,13 @@ static int s3c24xx_nand_probe(struct platform_device *pdev, 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); @@ -692,11 +670,6 @@ static int s3c24xx_nand_probe(struct platform_device *pdev, 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; @@ -708,63 +681,21 @@ static int s3c24xx_nand_probe(struct platform_device *pdev, 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, TYPE_S3C2410); + return s3c24xx_nand_probe(dev, 0); } static int s3c2440_nand_probe(struct platform_device *dev) { - return s3c24xx_nand_probe(dev, TYPE_S3C2440); -} - -static int s3c2412_nand_probe(struct platform_device *dev) -{ - return s3c24xx_nand_probe(dev, TYPE_S3C2412); + return s3c24xx_nand_probe(dev, 1); } 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, @@ -774,37 +705,22 @@ 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 51c7288ab..1924a4f13 100755 --- a/drivers/mtd/nand/sharpsl.c +++ b/drivers/mtd/nand/sharpsl.c @@ -46,6 +46,7 @@ static int sharpsl_phys_base = 0x0C000000; #define FLCLE (1 << 1) #define FLCE0 (1 << 0) + /* * MTD structure for SharpSL */ @@ -59,47 +60,50 @@ 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, - unsigned int ctrl) +static void +sharpsl_nand_hwcontrol(struct mtd_info* mtd, int cmd) { - 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); + 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; } - - if (cmd != NAND_CMD_NONE) - writeb(cmd, chip->IO_ADDR_W); } static uint8_t scan_ff_pattern[] = { 0xff, 0xff }; @@ -118,26 +122,31 @@ static struct nand_bbt_descr sharpsl_akita_bbt = { .pattern = scan_ff_pattern }; -static struct nand_ecclayout akita_oobinfo = { +static struct nand_oobinfo akita_oobinfo = { + .useecc = MTD_NANDECC_AUTOPLACE, .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}} + 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) +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); @@ -145,44 +154,47 @@ static int 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 */ -static int __init sharpsl_nand_init(void) +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(sharpsl_mtd, 0, sizeof(struct mtd_info)); - memset(this, 0, sizeof(struct nand_chip)); + memset((char *) sharpsl_mtd, 0, sizeof(struct mtd_info)); + memset((char *) 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 @@ -193,25 +205,23 @@ static int __init sharpsl_nand_init(void) this->IO_ADDR_R = FLASHIO; this->IO_ADDR_W = FLASHIO; /* Set address of hardware control function */ - this->cmd_ctrl = sharpsl_nand_hwcontrol; + this->hwcontrol = 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->ecc.mode = NAND_ECC_HW; - this->ecc.size = 256; - this->ecc.bytes = 3; + this->eccmode = NAND_ECC_HW3_256; this->badblock_pattern = &sharpsl_bbt; if (machine_is_akita() || machine_is_borzoi()) { this->badblock_pattern = &sharpsl_akita_bbt; - this->ecc.layout = &akita_oobinfo; + this->autooob = &akita_oobinfo; } - this->ecc.hwctl = sharpsl_nand_enable_hwecc; - this->ecc.calculate = sharpsl_nand_calculate_ecc; - this->ecc.correct = nand_correct_data; + this->enable_hwecc = sharpsl_nand_enable_hwecc; + this->calculate_ecc = sharpsl_nand_calculate_ecc; + this->correct_data = 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); @@ -220,39 +230,47 @@ static int __init 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=30 * 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; + sharpsl_partition_info[1].size=53 * 1024 * 1024; } else if (machine_is_spitz()) { - sharpsl_partition_info[1].size = 5 * 1024 * 1024; + sharpsl_partition_info[1].size=5 * 1024 * 1024; } else if (machine_is_akita()) { - sharpsl_partition_info[1].size = 58 * 1024 * 1024; + sharpsl_partition_info[1].size=58 * 1024 * 1024; } else if (machine_is_borzoi()) { - sharpsl_partition_info[1].size = 32 * 1024 * 1024; + sharpsl_partition_info[1].size=32 * 1024 * 1024; } } + if (machine_is_husky() || machine_is_borzoi() || machine_is_akita()) { + /* Need to use small eraseblock size for backward compatibility */ + sharpsl_mtd->flags |= MTD_NO_VIRTBLOCKS; + } + add_mtd_partitions(sharpsl_mtd, sharpsl_partition_info, nr_partitions); /* 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); @@ -261,8 +279,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 1f6d429b1..9cf1ce718 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,84 +69,79 @@ 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 + /* * hardware specific access to control-lines - * - * 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; +*/ +static void spia_hwcontrol(struct mtd_info *mtd, int cmd){ - if (ctrl & NAND_CTRL_CHANGE) { - void __iomem *addr = spia_io_base + spia_pedr; - unsigned char bits; + switch(cmd){ - bits = (ctrl & NAND_CNE) << 2; - bits |= (ctrl & NAND_CLE | NAND_ALE) >> 1; - writeb((readb(addr) & ~0x7) | bits, addr); - } + 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; + + 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; - if (cmd != NAND_CMD_NONE) - writeb(cmd, chip->IO_ADDR_W); + 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; + } } /* * Main initialization routine */ -static int __init spia_init(void) +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(spia_mtd, 0, sizeof(struct mtd_info)); - memset(this, 0, sizeof(struct nand_chip)); + memset((char *) spia_mtd, 0, sizeof(struct mtd_info)); + memset((char *) 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->cmd_ctrl = spia_hwcontrol; + this->hwcontrol = 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; } @@ -156,22 +151,22 @@ static int __init spia_init(void) /* Return happy */ return 0; } - module_init(spia_init); /* * Clean up routine */ -static void __exit spia_cleanup(void) +#ifdef MODULE +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 #include -#define CONFIG_NAND_WORKAROUND 1 - /* * MTD structure for TOTO board */ @@ -41,6 +39,25 @@ 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 */ @@ -74,110 +91,91 @@ static struct mtd_partition partition_info32M[] = { #define NUM_PARTITIONS32M 3 #define NUM_PARTITIONS64M 4 - /* * 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; +*/ - if (ctrl & NAND_CTRL_CHANGE) { - unsigned long bits; +static void toto_hwcontrol(struct mtd_info *mtd, int cmd) +{ - /* hopefully enough time for tc make proceding write to clear */ - udelay(1); + udelay(1); /* hopefully enough time for tc make proceding write to clear */ + switch(cmd){ - bits = (~ctrl & NAND_NCE) << 14; - bits |= (ctrl & NAND_CLE) << 12; - bits |= (ctrl & NAND_ALE) >> 1; + case NAND_CTL_SETCLE: T_NAND_CTL_SETCLE(cmd); break; + case NAND_CTL_CLRCLE: T_NAND_CTL_CLRCLE(cmd); break; -#warning Wild guess as gpiosetout() is nowhere defined in the kernel source - tglx - gpiosetout(0x5002, bits); + case NAND_CTL_SETALE: T_NAND_CTL_SETALE(cmd); break; + case NAND_CTL_CLRALE: T_NAND_CTL_CLRALE(cmd); break; -#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); + case NAND_CTL_SETNCE: T_NAND_CTL_SETNCE(cmd); break; + case NAND_CTL_CLRNCE: T_NAND_CTL_CLRNCE(cmd); break; } - - if (cmd != NAND_CMD_NONE) - writeb(cmd, chip->IO_ADDR_W); + udelay(1); /* allow time to ensure gpio state to over take memory write */ } /* * Main initialization routine */ -static int __init toto_init(void) +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(toto_mtd, 0, sizeof(struct mtd_info)); - memset(this, 0, sizeof(struct nand_chip)); + memset((char *) toto_mtd, 0, sizeof(struct mtd_info)); + memset((char *) 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->cmd_ctrl = toto_hwcontrol; + this->hwcontrol = toto_hwcontrol; this->dev_ready = NULL; /* 25 us command delay time */ this->chip_delay = 30; - this->ecc.mode = NAND_ECC_SOFT; + this->eccmode = 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_mtd: - kfree(toto_mtd); - out: +out_buf: + kfree (this->data_buf); +out_mtd: + kfree (toto_mtd); +out: return err; } @@ -186,21 +184,20 @@ 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 dd5cea8b4..d7cd5fa16 100644 --- a/drivers/mtd/nftlcore.c +++ b/drivers/mtd/nftlcore.c @@ -11,6 +11,7 @@ #define PRERELEASE +#include #include #include #include @@ -69,6 +70,8 @@ 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"); @@ -133,69 +136,6 @@ 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 */ @@ -245,7 +185,6 @@ 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]; @@ -255,7 +194,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)); @@ -271,21 +210,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 ++) { - nftl_read_oob(mtd, (thisEUN * nftl->EraseSize) + - (block * 512), 16 , &retlen, - (char *)&oob); + MTD_READOOB(nftl->mbd.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, @@ -294,7 +233,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) { @@ -389,15 +328,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; - nftl_write_oob(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; + MTD_WRITEOOB(nftl->mbd.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. @@ -414,33 +353,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(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"); - } + 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"); + } memset(&oob, 0xff, sizeof(struct nftl_oob)); oob.b.Status = oob.b.Status1 = SECTOR_USED; - - nftl_write(nftl->mbd.mtd, (nftl->EraseSize * targetEUN) + - (block * 512), 512, &retlen, movebuf, (char *)&oob); + MTD_WRITEECC(nftl->mbd.mtd, (nftl->EraseSize * targetEUN) + (block * 512), + 512, &retlen, movebuf, (char *)&oob, &nftl->oobinfo); } - /* 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; - nftl_write_oob(mtd, (nftl->EraseSize * targetEUN) + 8, - 8, &retlen, (char *)&oob.u); + MTD_WRITEOOB(nftl->mbd.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. */ @@ -457,18 +396,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 */ @@ -534,7 +473,6 @@ 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; @@ -551,22 +489,21 @@ 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; - nftl_read_oob(mtd, - (writeEUN * nftl->EraseSize) + blockofs, - 8, &retlen, (char *)&bci); + MTD_READOOB(nftl->mbd.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; @@ -637,10 +574,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 */ @@ -648,29 +585,29 @@ static inline u16 NFTL_findwriteunit(struct NFTLrecord *nftl, unsigned block) nftl->ReplUnitTable[writeEUN] = BLOCK_NIL; /* ... and on the flash itself */ - nftl_read_oob(mtd, writeEUN * nftl->EraseSize + 8, 8, - &retlen, (char *)&oob.u); + MTD_READOOB(nftl->mbd.mtd, writeEUN * nftl->EraseSize + 8, 8, + &retlen, (char *)&oob.u); oob.u.a.VirtUnitNum = oob.u.a.SpareVirtUnitNum = cpu_to_le16(thisVUC); - nftl_write_oob(mtd, writeEUN * nftl->EraseSize + 8, 8, - &retlen, (char *)&oob.u); + MTD_WRITEOOB(nftl->mbd.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 */ - nftl_read_oob(mtd, (lastEUN * nftl->EraseSize) + 8, - 8, &retlen, (char *)&oob.u); + MTD_READOOB(nftl->mbd.mtd, (lastEUN * nftl->EraseSize) + 8, + 8, &retlen, (char *)&oob.u); oob.u.a.ReplUnitNum = oob.u.a.SpareReplUnitNum = cpu_to_le16(writeEUN); - nftl_write_oob(mtd, (lastEUN * nftl->EraseSize) + 8, - 8, &retlen, (char *)&oob.u); + MTD_WRITEOOB(nftl->mbd.mtd, (lastEUN * nftl->EraseSize) + 8, + 8, &retlen, (char *)&oob.u); } return writeEUN; @@ -702,9 +639,10 @@ 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 */ @@ -713,22 +651,20 @@ 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 (nftl_read_oob(mtd, (thisEUN * nftl->EraseSize) + - blockofs, 8, &retlen, - (char *)&bci) < 0) + if (MTD_READOOB(nftl->mbd.mtd, (thisEUN * nftl->EraseSize) + blockofs, + 8, &retlen, (char *)&bci) < 0) status = SECTOR_IGNORE; else status = bci.Status | bci.Status1; @@ -758,7 +694,7 @@ static int nftl_readblock(struct mtd_blktrans_dev *mbd, unsigned long block, } thisEUN = nftl->ReplUnitTable[thisEUN]; } - } + } the_end: if (lastgoodEUN == BLOCK_NIL) { @@ -767,9 +703,7 @@ static int nftl_readblock(struct mtd_blktrans_dev *mbd, unsigned long block, } else { loff_t ptr = (lastgoodEUN * nftl->EraseSize) + blockofs; size_t retlen; - int res = mtd->read(mtd, ptr, 512, &retlen, buffer); - - if (res < 0 && res != -EUCLEAN) + if (MTD_READ(nftl->mbd.mtd, ptr, 512, &retlen, buffer)) return -EIO; } return 0; diff --git a/drivers/mtd/nftlmount.c b/drivers/mtd/nftlmount.c index 067262ee8..3b104ebb2 100644 --- a/drivers/mtd/nftlmount.c +++ b/drivers/mtd/nftlmount.c @@ -33,11 +33,6 @@ 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[] @@ -50,7 +45,6 @@ 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. @@ -71,8 +65,7 @@ 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(mtd, block * nftl->EraseSize, SECTORSIZE, - &retlen, buf); + ret = MTD_READ(nftl->mbd.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) { @@ -97,9 +90,8 @@ static int find_boot_record(struct NFTLrecord *nftl) } /* To be safer with BIOS, also use erase mark as discriminant */ - if ((ret = nftl_read_oob(mtd, block * nftl->EraseSize + - SECTORSIZE + 8, 8, &retlen, - (char *)&h1) < 0)) { + if ((ret = MTD_READOOB(nftl->mbd.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; @@ -117,8 +109,8 @@ static int find_boot_record(struct NFTLrecord *nftl) } /* Finally reread to check ECC */ - if ((ret = mtd->read(mtd, block * nftl->EraseSize, SECTORSIZE, - &retlen, buf) < 0)) { + if ((ret = MTD_READECC(nftl->mbd.mtd, block * nftl->EraseSize, SECTORSIZE, + &retlen, buf, (char *)&oob, NULL) < 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; @@ -236,9 +228,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->read(nftl->mbd.mtd, block * nftl->EraseSize + - i + SECTORSIZE, SECTORSIZE, &retlen, - buf)) < 0) { + if ((ret = MTD_READECC(nftl->mbd.mtd, block * nftl->EraseSize + + i + SECTORSIZE, SECTORSIZE, &retlen, buf, + (char *)&oob, NULL)) < 0) { printk(KERN_NOTICE "Read of bad sector table failed (err %d)\n", ret); kfree(nftl->ReplUnitTable); @@ -276,22 +268,18 @@ 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) { - u8 buf[SECTORSIZE + nftl->mbd.mtd->oobsize]; - struct mtd_info *mtd = nftl->mbd.mtd; - size_t retlen; int i; + size_t retlen; + u8 buf[SECTORSIZE + nftl->mbd.mtd->oobsize]; for (i = 0; i < len; i += SECTORSIZE) { - if (mtd->read(mtd, address, SECTORSIZE, &retlen, buf)) + if (MTD_READECC(nftl->mbd.mtd, address, SECTORSIZE, &retlen, buf, &buf[SECTORSIZE], &nftl->oobinfo) < 0) return -1; if (memcmpb(buf, 0xff, SECTORSIZE) != 0) return -1; if (check_oob) { - if(nftl_read_oob(mtd, address, mtd->oobsize, - &retlen, &buf[SECTORSIZE]) < 0) - return -1; - if (memcmpb(buf + SECTORSIZE, 0xff, mtd->oobsize) != 0) + if (memcmpb(buf + SECTORSIZE, 0xff, nftl->mbd.mtd->oobsize) != 0) return -1; } address += SECTORSIZE; @@ -313,11 +301,10 @@ 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 (nftl_read_oob(mtd, block * nftl->EraseSize + SECTORSIZE + 8, - 8, &retlen, (char *)&uci) < 0) + if (MTD_READOOB(nftl->mbd.mtd, block * nftl->EraseSize + SECTORSIZE + 8, + 8, &retlen, (char *)&uci) < 0) goto default_uci1; erase_mark = le16_to_cpu ((uci.EraseMark | uci.EraseMark1)); @@ -334,7 +321,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(mtd, instr); + MTD_ERASE(nftl->mbd.mtd, instr); if (instr->state == MTD_ERASE_FAILED) { printk("Error while formatting block %d\n", block); @@ -356,8 +343,8 @@ int NFTL_formatblock(struct NFTLrecord *nftl, int block) goto fail; uci.WearInfo = le32_to_cpu(nb_erases); - if (nftl_write_oob(mtd, block * nftl->EraseSize + SECTORSIZE + - 8, 8, &retlen, (char *)&uci) < 0) + if (MTD_WRITEOOB(nftl->mbd.mtd, block * nftl->EraseSize + SECTORSIZE + 8, 8, + &retlen, (char *)&uci) < 0) goto fail; return 0; fail: @@ -378,7 +365,6 @@ 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; @@ -388,9 +374,8 @@ 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 (nftl_read_oob(mtd, - block * nftl->EraseSize + i * SECTORSIZE, - 8, &retlen, (char *)&bci) < 0) + if (MTD_READOOB(nftl->mbd.mtd, block * nftl->EraseSize + i * SECTORSIZE, + 8, &retlen, (char *)&bci) < 0) status = SECTOR_IGNORE; else status = bci.Status | bci.Status1; @@ -409,10 +394,9 @@ 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; - nftl_write_oob(mtd, block * - nftl->EraseSize + - i * SECTORSIZE, 8, - &retlen, (char *)&bci); + MTD_WRITEOOB(nftl->mbd.mtd, + block * nftl->EraseSize + i * SECTORSIZE, + 8, &retlen, (char *)&bci); } break; default: @@ -497,14 +481,13 @@ 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 (nftl_read_oob(mtd, block * nftl->EraseSize + SECTORSIZE + 8, 8, - &retlen, (char *)&h1) < 0) + if (MTD_READOOB(nftl->mbd.mtd, block * nftl->EraseSize + SECTORSIZE + 8, 8, + &retlen, (char *)&h1) < 0) return -1; erase_mark = le16_to_cpu ((h1.EraseMark | h1.EraseMark1)); @@ -518,9 +501,8 @@ 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 (nftl_write_oob(mtd, - block * nftl->EraseSize + SECTORSIZE + 8, 8, - &retlen, (char *)&h1) < 0) + if (MTD_WRITEOOB(nftl->mbd.mtd, block * nftl->EraseSize + SECTORSIZE + 8, 8, + &retlen, (char *)&h1) < 0) return -1; } else { #if 0 @@ -531,8 +513,8 @@ static int check_and_mark_free_block(struct NFTLrecord *nftl, int block) SECTORSIZE, 0) != 0) return -1; - if (nftl_read_oob(mtd, block * nftl->EraseSize + i, - 16, &retlen, buf) < 0) + if (MTD_READOOB(nftl->mbd.mtd, block * nftl->EraseSize + i, + 16, &retlen, buf) < 0) return -1; if (i == SECTORSIZE) { /* skip erase mark */ @@ -558,12 +540,11 @@ 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 (nftl_read_oob(mtd, block * nftl->EraseSize + 2 * SECTORSIZE + 8, - 8, &retlen, (char *)&uci) < 0) + if (MTD_READOOB(nftl->mbd.mtd, block * nftl->EraseSize + 2 * SECTORSIZE + 8, + 8, &retlen, (char *)&uci) < 0) return 0; return le16_to_cpu((uci.FoldMark | uci.FoldMark1)); @@ -577,7 +558,6 @@ 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 */ @@ -602,13 +582,10 @@ int NFTL_mount(struct NFTLrecord *s) for (;;) { /* read the block header. If error, we format the chain */ - 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) { + 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) { s->ReplUnitTable[block] = BLOCK_NIL; do_format_chain = 1; break; diff --git a/drivers/mtd/onenand/Kconfig b/drivers/mtd/onenand/Kconfig index 5930a0373..126ff6bf6 100644 --- a/drivers/mtd/onenand/Kconfig +++ b/drivers/mtd/onenand/Kconfig @@ -29,20 +29,6 @@ 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 84ec40d25..a53a73fc2 100644 --- a/drivers/mtd/onenand/onenand_base.c +++ b/drivers/mtd/onenand/onenand_base.c @@ -23,7 +23,8 @@ /** * onenand_oob_64 - oob info for large (2KB) page */ -static struct nand_ecclayout onenand_oob_64 = { +static struct nand_oobinfo onenand_oob_64 = { + .useecc = MTD_NANDECC_AUTOPLACE, .eccbytes = 20, .eccpos = { 8, 9, 10, 11, 12, @@ -33,14 +34,14 @@ static struct nand_ecclayout onenand_oob_64 = { }, .oobfree = { {2, 3}, {14, 2}, {18, 3}, {30, 2}, - {34, 3}, {46, 2}, {50, 3}, {62, 2} - } + {24, 3}, {46, 2}, {40, 3}, {62, 2} } }; /** * onenand_oob_32 - oob info for middle (1KB) page */ -static struct nand_ecclayout onenand_oob_32 = { +static struct nand_oobinfo onenand_oob_32 = { + .useecc = MTD_NANDECC_AUTOPLACE, .eccbytes = 10, .eccpos = { 8, 9, 10, 11, 12, @@ -189,7 +190,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, block_cmd = 0; + int value, readcmd = 0; int block, page; /* Now we use page size operation */ int sectors = 4, count = 4; @@ -205,8 +206,6 @@ 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; @@ -234,12 +233,6 @@ 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) { @@ -308,7 +301,6 @@ 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); @@ -352,7 +344,7 @@ static inline int onenand_bufferram_offset(struct mtd_info *mtd, int area) if (ONENAND_CURRENT_BUFFERRAM(this)) { if (area == ONENAND_DATARAM) - return mtd->writesize; + return mtd->oobblock; if (area == ONENAND_SPARERAM) return mtd->oobsize; } @@ -380,17 +372,6 @@ 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; @@ -418,17 +399,6 @@ 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); @@ -456,22 +426,6 @@ 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; @@ -595,28 +549,31 @@ static void onenand_release_device(struct mtd_info *mtd) } /** - * onenand_read - [MTD Interface] Read data from flash + * onenand_read_ecc - [MTD Interface] Read data with 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 + * @param oob_buf filesystem supplied oob data buffer + * @param oobsel oob selection structure * - * Read with ecc -*/ -static int onenand_read(struct mtd_info *mtd, loff_t from, size_t len, - size_t *retlen, u_char *buf) + * 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) { struct onenand_chip *this = mtd->priv; int read = 0, column; int thislen; int ret = 0; - DEBUG(MTD_DEBUG_LEVEL3, "onenand_read: from = 0x%08x, len = %i\n", (unsigned int) from, (int) len); + DEBUG(MTD_DEBUG_LEVEL3, "onenand_read_ecc: 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: Attempt read beyond end of device\n"); + DEBUG(MTD_DEBUG_LEVEL0, "onenand_read_ecc: Attempt read beyond end of device\n"); *retlen = 0; return -EINVAL; } @@ -627,14 +584,14 @@ static int onenand_read(struct mtd_info *mtd, loff_t from, size_t len, /* TODO handling oob */ while (read < len) { - thislen = min_t(int, mtd->writesize, len - read); + thislen = min_t(int, mtd->oobblock, len - read); - column = from & (mtd->writesize - 1); - if (column + thislen > mtd->writesize) - thislen = mtd->writesize - column; + column = from & (mtd->oobblock - 1); + if (column + thislen > mtd->oobblock) + thislen = mtd->oobblock - column; if (!onenand_check_bufferram(mtd, from)) { - this->command(mtd, ONENAND_CMD_READ, from, mtd->writesize); + this->command(mtd, ONENAND_CMD_READ, from, mtd->oobblock); ret = this->wait(mtd, FL_READING); /* First copy data and check return value for ECC handling */ @@ -649,7 +606,7 @@ static int onenand_read(struct mtd_info *mtd, loff_t from, size_t len, break; if (ret) { - DEBUG(MTD_DEBUG_LEVEL0, "onenand_read: read failed = %d\n", ret); + DEBUG(MTD_DEBUG_LEVEL0, "onenand_read_ecc: read failed = %d\n", ret); goto out; } @@ -671,7 +628,23 @@ out: } /** - * onenand_do_read_oob - [MTD Interface] OneNAND read out-of-band + * 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 * @param mtd MTD device structure * @param from offset to read from * @param len number of bytes to read @@ -680,8 +653,8 @@ out: * * OneNAND read out-of-band data from the spare area */ -int onenand_do_read_oob(struct mtd_info *mtd, loff_t from, size_t len, - size_t *retlen, u_char *buf) +static int onenand_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; @@ -731,7 +704,7 @@ int onenand_do_read_oob(struct mtd_info *mtd, loff_t from, size_t len, /* Read more? */ if (read < len) { /* Page size */ - from += mtd->writesize; + from += mtd->oobblock; column = 0; } } @@ -744,52 +717,7 @@ 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 @@ -803,7 +731,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->writesize); + this->command(mtd, ONENAND_CMD_READ, addr, mtd->oobblock); ret = this->wait(mtd, FL_READING); if (ret) @@ -813,51 +741,53 @@ 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->writesize; + dataram1 = dataram0 + mtd->oobblock; - if (memcmp(dataram0, dataram1, mtd->writesize)) + if (memcmp(dataram0, dataram1, mtd->oobblock)) return -EBADMSG; return 0; } #else #define onenand_verify_page(...) (0) -#define onenand_verify_oob(...) (0) #endif -#define NOTALIGNED(x) ((x & (mtd->writesize - 1)) != 0) +#define NOTALIGNED(x) ((x & (mtd->oobblock - 1)) != 0) /** - * onenand_write - [MTD Interface] write buffer to FLASH + * onenand_write_ecc - [MTD Interface] OneNAND write with 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 + * @param eccbuf filesystem supplied oob data buffer + * @param oobsel oob selection structure * - * Write with ECC + * OneNAND write with ECC */ -static int onenand_write(struct mtd_info *mtd, loff_t to, size_t len, - size_t *retlen, const u_char *buf) +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) { struct onenand_chip *this = mtd->priv; int written = 0; int ret = 0; - DEBUG(MTD_DEBUG_LEVEL3, "onenand_write: to = 0x%08x, len = %i\n", (unsigned int) to, (int) len); + DEBUG(MTD_DEBUG_LEVEL3, "onenand_write_ecc: 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: Attempt write to past end of device\n"); + DEBUG(MTD_DEBUG_LEVEL0, "onenand_write_ecc: 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: Attempt to write not page aligned data\n"); + DEBUG(MTD_DEBUG_LEVEL0, "onenand_write_ecc: Attempt to write not page aligned data\n"); return -EINVAL; } @@ -866,20 +796,20 @@ static int onenand_write(struct mtd_info *mtd, loff_t to, size_t len, /* Loop until all data write */ while (written < len) { - int thislen = min_t(int, mtd->writesize, len - written); + int thislen = min_t(int, mtd->oobblock, len - written); - this->command(mtd, ONENAND_CMD_BUFFERRAM, to, mtd->writesize); + this->command(mtd, ONENAND_CMD_BUFFERRAM, to, mtd->oobblock); 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->writesize); + 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_write: write filaed %d\n", ret); + DEBUG(MTD_DEBUG_LEVEL0, "onenand_write_ecc: write filaed %d\n", ret); goto out; } @@ -888,7 +818,7 @@ static int onenand_write(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: verify failed %d\n", ret); + DEBUG(MTD_DEBUG_LEVEL0, "onenand_write_ecc: verify failed %d\n", ret); goto out; } @@ -909,7 +839,24 @@ out: } /** - * onenand_do_write_oob - [Internal] OneNAND write out-of-band + * 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 * @param mtd MTD device structure * @param to offset to write to * @param len number of bytes to write @@ -918,11 +865,11 @@ out: * * OneNAND write out-of-band */ -static int onenand_do_write_oob(struct mtd_info *mtd, loff_t to, size_t len, - size_t *retlen, const u_char *buf) +static int onenand_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, ret = 0; + int column, status; int written = 0; DEBUG(MTD_DEBUG_LEVEL3, "onenand_write_oob: to = 0x%08x, len = %i\n", (unsigned int) to, (int) len); @@ -947,27 +894,16 @@ static int onenand_do_write_oob(struct mtd_info *mtd, loff_t to, size_t len, this->command(mtd, ONENAND_CMD_BUFFERRAM, to, mtd->oobsize); - /* 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->write_bufferram(mtd, ONENAND_SPARERAM, ffchars, 0, mtd->oobsize); + this->write_bufferram(mtd, ONENAND_SPARERAM, buf, column, thislen); this->command(mtd, ONENAND_CMD_PROGOOB, to, mtd->oobsize); onenand_update_bufferram(mtd, to, 0); - 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); + status = this->wait(mtd, FL_WRITING); + if (status) goto out; - } written += thislen; @@ -984,22 +920,145 @@ out: *retlen = written; - return ret; + return 0; } /** - * 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 + * 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 */ -static int onenand_write_oob(struct mtd_info *mtd, loff_t to, - struct mtd_oob_ops *ops) +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) { - BUG_ON(ops->mode != MTD_OOB_PLACE); + 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); - return onenand_do_write_oob(mtd, to + ops->ooboffs, ops->len, - &ops->retlen, ops->oobbuf); + 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); } /** @@ -1168,7 +1227,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 onenand_do_write_oob(mtd, ofs , 2, &retlen, buf); + return mtd->write_oob(mtd, ofs , 2, &retlen, buf); } /** @@ -1265,304 +1324,6 @@ 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 @@ -1662,15 +1423,15 @@ static int onenand_probe(struct mtd_info *mtd) /* OneNAND page size & block size */ /* The data buffer size is equal to page size */ - mtd->writesize = this->read_word(this->base + ONENAND_REG_DATA_BUFFER_SIZE); - mtd->oobsize = mtd->writesize >> 5; + mtd->oobblock = this->read_word(this->base + ONENAND_REG_DATA_BUFFER_SIZE); + mtd->oobsize = mtd->oobblock >> 5; /* Pagers per block is always 64 in OneNAND */ - mtd->erasesize = mtd->writesize << 6; + mtd->erasesize = mtd->oobblock << 6; this->erase_shift = ffs(mtd->erasesize) - 1; - this->page_shift = ffs(mtd->writesize) - 1; + this->page_shift = ffs(mtd->oobblock) - 1; this->ppb_shift = (this->erase_shift - this->page_shift); - this->page_mask = (mtd->erasesize / mtd->writesize) - 1; + this->page_mask = (mtd->erasesize / mtd->oobblock) - 1; /* REVIST: Multichip handling */ @@ -1714,6 +1475,7 @@ 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 @@ -1760,7 +1522,7 @@ int onenand_scan(struct mtd_info *mtd, int maxchips) /* Allocate buffers, if necessary */ if (!this->page_buf) { size_t len; - len = mtd->writesize + mtd->oobsize; + len = mtd->oobblock + mtd->oobsize; this->page_buf = kmalloc(len, GFP_KERNEL); if (!this->page_buf) { printk(KERN_ERR "onenand_scan(): Can't allocate page_buf\n"); @@ -1775,42 +1537,40 @@ int onenand_scan(struct mtd_info *mtd, int maxchips) switch (mtd->oobsize) { case 64: - this->ecclayout = &onenand_oob_64; + this->autooob = &onenand_oob_64; break; case 32: - this->ecclayout = &onenand_oob_32; + this->autooob = &onenand_oob_32; break; default: printk(KERN_WARNING "No OOB scheme defined for oobsize %d\n", mtd->oobsize); /* To prevent kernel oops */ - this->ecclayout = &onenand_oob_32; + this->autooob = &onenand_oob_32; break; } - mtd->ecclayout = this->ecclayout; + memcpy(&mtd->oobinfo, this->autooob, sizeof(mtd->oobinfo)); /* Fill in remaining MTD driver data */ mtd->type = MTD_NANDFLASH; - mtd->flags = MTD_CAP_NANDFLASH; + mtd->flags = MTD_CAP_NANDFLASH | MTD_ECC; 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; -#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->readv = NULL; + mtd->readv_ecc = NULL; + mtd->writev = onenand_writev; + mtd->writev_ecc = onenand_writev_ecc; 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 1b00dac3d..4510d3361 100644 --- a/drivers/mtd/onenand/onenand_bbt.c +++ b/drivers/mtd/onenand/onenand_bbt.c @@ -17,9 +17,6 @@ #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 @@ -90,13 +87,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 = onenand_do_read_oob(mtd, from + j * mtd->writesize + bd->offs, - readlen, &retlen, &buf[0]); + ret = mtd->read_oob(mtd, from + j * mtd->oobblock + bd->offs, + readlen, &retlen, &buf[0]); if (ret) return ret; - if (check_short_pattern(&buf[j * scanlen], scanlen, mtd->writesize, bd)) { + if (check_short_pattern(&buf[j * scanlen], scanlen, mtd->oobblock, 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 5b58523e4..8815c8dbe 100644 --- a/drivers/mtd/redboot.c +++ b/drivers/mtd/redboot.c @@ -1,5 +1,5 @@ /* - * $Id: redboot.c,v 1.21 2006/03/30 18:34:37 bjd Exp $ + * $Id: redboot.c,v 1.19 2005/12/01 10:03:51 dwmw2 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 - 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 + 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 }; struct fis_list { @@ -85,6 +85,10 @@ static int parse_redboot_partitions(struct mtd_info *master, numslots = (master->erasesize / sizeof(struct fis_image_desc)); for (i = 0; i < numslots; i++) { + if (buf[i].name[0] == 0xff) { + i = numslots; + break; + } if (!memcmp(buf[i].name, "FIS directory", 14)) { /* This is apparently the FIS directory entry for the * FIS directory itself. The FIS directory size is @@ -124,7 +128,7 @@ static int parse_redboot_partitions(struct mtd_info *master, struct fis_list *new_fl, **prev; if (buf[i].name[0] == 0xff) - continue; + break; if (!redboot_checksum(&buf[i])) break; diff --git a/drivers/mtd/rfd_ftl.c b/drivers/mtd/rfd_ftl.c index fa4362fb4..a3e00a463 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.8 2006/01/15 12:51:44 sean Exp $ + * $Id: rfd_ftl.c,v 1.5 2005/11/07 11:14:21 gleixner 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,7 +61,6 @@ struct block { BLOCK_OK, BLOCK_ERASING, BLOCK_ERASED, - BLOCK_UNUSED, BLOCK_FAILED } state; int free_sectors; @@ -100,8 +99,10 @@ 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_UNUSED; - return -ENOENT; + block->state = BLOCK_ERASED; /* assumption */ + block->free_sectors = part->data_sectors_per_block; + part->reserved_block = block_no; + return 1; } block->state = BLOCK_OK; @@ -123,7 +124,7 @@ static int build_block_map(struct partition *part, int block_no) entry = 0; if (entry >= part->sector_count) { - printk(KERN_WARNING PREFIX + printk(KERN_NOTICE PREFIX "'%s': unit #%d: entry %d corrupt, " "sector %d out of range\n", part->mbd.mtd->name, block_no, i, entry); @@ -131,7 +132,7 @@ static int build_block_map(struct partition *part, int block_no) } if (part->sector_map[entry] != -1) { - printk(KERN_WARNING PREFIX + printk(KERN_NOTICE PREFIX "'%s': more than one entry for sector %d\n", part->mbd.mtd->name, entry); part->errors = 1; @@ -166,7 +167,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; @@ -225,7 +226,7 @@ static int scan_header(struct partition *part) } if (part->reserved_block == -1) { - printk(KERN_WARNING PREFIX "'%s': no empty erase unit found\n", + printk(KERN_NOTICE PREFIX "'%s': no empty erase unit found\n", part->mbd.mtd->name); part->errors = 1; @@ -314,7 +315,7 @@ static void erase_callback(struct erase_info *erase) rc = -EIO; if (rc) { - printk(KERN_ERR PREFIX "'%s': unable to write RFD " + printk(KERN_NOTICE PREFIX "'%s': unable to write RFD " "header at 0x%lx\n", part->mbd.mtd->name, part->blocks[i].offset); @@ -347,7 +348,7 @@ static int erase_block(struct partition *part, int block) rc = part->mbd.mtd->erase(part->mbd.mtd, erase); if (rc) { - printk(KERN_ERR PREFIX "erase of region %x,%x on '%s' " + printk(KERN_WARNING PREFIX "erase of region %x,%x on '%s' " "failed\n", erase->addr, erase->len, part->mbd.mtd->name); kfree(erase); @@ -382,7 +383,7 @@ static int move_block_contents(struct partition *part, int block_no, u_long *old rc = -EIO; if (rc) { - printk(KERN_ERR PREFIX "error reading '%s' at " + printk(KERN_NOTICE PREFIX "error reading '%s' at " "0x%lx\n", part->mbd.mtd->name, part->blocks[block_no].offset); @@ -422,7 +423,7 @@ static int move_block_contents(struct partition *part, int block_no, u_long *old rc = -EIO; if (rc) { - printk(KERN_ERR PREFIX "'%s': Unable to " + printk(KERN_NOTICE PREFIX "'%s': Unable to " "read sector for relocation\n", part->mbd.mtd->name); @@ -519,7 +520,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(struct partition *part) +static int find_free_block(const struct partition *part) { int block, stop; @@ -532,9 +533,6 @@ static int find_free_block(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; @@ -543,7 +541,7 @@ static int find_free_block(struct partition *part) return -1; } -static int find_writable_block(struct partition *part, u_long *old_sector) +static int find_writeable_block(struct partition *part, u_long *old_sector) { int rc, block; size_t retlen; @@ -572,7 +570,7 @@ static int find_writable_block(struct partition *part, u_long *old_sector) rc = -EIO; if (rc) { - printk(KERN_ERR PREFIX "'%s': unable to read header at " + printk(KERN_NOTICE PREFIX "'%s': unable to read header at " "0x%lx\n", part->mbd.mtd->name, part->blocks[block].offset); goto err; @@ -604,7 +602,7 @@ static int mark_sector_deleted(struct partition *part, u_long old_addr) rc = -EIO; if (rc) { - printk(KERN_ERR PREFIX "error writing '%s' at " + printk(KERN_WARNING PREFIX "error writing '%s' at " "0x%lx\n", part->mbd.mtd->name, addr); if (rc) goto err; @@ -654,7 +652,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_writable_block(part, old_addr); + rc = find_writeable_block(part, old_addr); if (rc) goto err; } @@ -677,7 +675,7 @@ static int do_writesect(struct mtd_blktrans_dev *dev, u_long sector, char *buf, rc = -EIO; if (rc) { - printk(KERN_ERR PREFIX "error writing '%s' at 0x%lx\n", + printk(KERN_WARNING PREFIX "error writing '%s' at 0x%lx\n", part->mbd.mtd->name, addr); if (rc) goto err; @@ -697,7 +695,7 @@ static int do_writesect(struct mtd_blktrans_dev *dev, u_long sector, char *buf, rc = -EIO; if (rc) { - printk(KERN_ERR PREFIX "error writing '%s' at 0x%lx\n", + printk(KERN_WARNING PREFIX "error writing '%s' at 0x%lx\n", part->mbd.mtd->name, addr); if (rc) goto err; @@ -778,7 +776,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_WARNING PREFIX "please provide block_size"); + printk(KERN_NOTICE PREFIX "please provide block_size"); return; } else @@ -793,8 +791,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_WARNING PREFIX "'%s': errors found, " - "setting read-only\n", mtd->name); + printk(KERN_NOTICE PREFIX "'%s': errors found, " + "setting read-only", mtd->name); part->mbd.readonly = 1; } diff --git a/drivers/net/3c501.c b/drivers/net/3c501.c index d7b115a35..f6d51ce34 100644 --- a/drivers/net/3c501.c +++ b/drivers/net/3c501.c @@ -120,6 +120,7 @@ static const char version[] = #include #include #include +#include /* for CONFIG_IP_MULTICAST */ #include #include #include @@ -507,11 +508,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 surprise interrupts late both because the SMP IRQ delivery + * We sometimes get suprise 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. */ @@ -908,7 +909,7 @@ MODULE_PARM_DESC(irq, "EtherLink IRQ number"); * here also causes the module to be unloaded */ -int __init init_module(void) +int 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 cb5ef7545..dcc98afa6 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 __init +int init_module(void) { struct net_device *dev; diff --git a/drivers/net/3c505.c b/drivers/net/3c505.c index 19c0b856c..111601ca4 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 init_module(void) +int init_module(void) { int this_dev, found = 0; diff --git a/drivers/net/3c507.c b/drivers/net/3c507.c index 603904925..4db828939 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 init_module(void) +int 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 cbdae54f7..830528dce 100644 --- a/drivers/net/3c509.c +++ b/drivers/net/3c509.c @@ -68,6 +68,7 @@ /* Maximum events (Rx packets, etc.) to handle at each interrupt. */ static int max_interrupt_work = 10; +#include #include #ifdef CONFIG_MCA #include @@ -99,10 +100,6 @@ static int max_interrupt_work = 10; static char versionA[] __initdata = DRV_NAME ".c:" DRV_VERSION " " DRV_RELDATE " becker@scyld.com\n"; static char versionB[] __initdata = "http://www.scyld.com/network/3c509.html\n"; -#if defined(CONFIG_PM) && (defined(CONFIG_MCA) || defined(CONFIG_EISA)) -#define EL3_SUSPEND -#endif - #ifdef EL3_DEBUG static int el3_debug = EL3_DEBUG; #else @@ -177,6 +174,9 @@ struct el3_private { /* skb send-queue */ int head, size; struct sk_buff *queue[SKB_QUEUE_SIZE]; +#ifdef CONFIG_PM_LEGACY + struct pm_dev *pmdev; +#endif enum { EL3_MCA, EL3_PNP, @@ -201,15 +201,11 @@ static void el3_tx_timeout (struct net_device *dev); static void el3_down(struct net_device *dev); static void el3_up(struct net_device *dev); static struct ethtool_ops ethtool_ops; -#ifdef EL3_SUSPEND -static int el3_suspend(struct device *, pm_message_t); -static int el3_resume(struct device *); -#else -#define el3_suspend NULL -#define el3_resume NULL +#ifdef CONFIG_PM_LEGACY +static int el3_suspend(struct pm_dev *pdev); +static int el3_resume(struct pm_dev *pdev); +static int el3_pm_callback(struct pm_dev *pdev, pm_request_t rqst, void *data); #endif - - /* generic device remove for all device types */ #if defined(CONFIG_EISA) || defined(CONFIG_MCA) static int el3_device_remove (struct device *device); @@ -233,9 +229,7 @@ static struct eisa_driver el3_eisa_driver = { .driver = { .name = "3c509", .probe = el3_eisa_probe, - .remove = __devexit_p (el3_device_remove), - .suspend = el3_suspend, - .resume = el3_resume, + .remove = __devexit_p (el3_device_remove) } }; #endif @@ -268,8 +262,6 @@ static struct mca_driver el3_mca_driver = { .bus = &mca_bus_type, .probe = el3_mca_probe, .remove = __devexit_p(el3_device_remove), - .suspend = el3_suspend, - .resume = el3_resume, }, }; #endif /* CONFIG_MCA */ @@ -370,6 +362,10 @@ static void el3_common_remove (struct net_device *dev) struct el3_private *lp = netdev_priv(dev); (void) lp; /* Keep gcc quiet... */ +#ifdef CONFIG_PM_LEGACY + if (lp->pmdev) + pm_unregister(lp->pmdev); +#endif #if defined(__ISAPNP__) if (lp->type == EL3_PNP) pnp_device_detach(to_pnp_dev(lp->dev)); @@ -576,6 +572,16 @@ no_pnp: if (err) goto out1; +#ifdef CONFIG_PM_LEGACY + /* register power management */ + lp->pmdev = pm_register(PM_ISA_DEV, card_idx, el3_pm_callback); + if (lp->pmdev) { + struct pm_dev *p; + p = lp->pmdev; + p->data = (struct net_device *)dev; + } +#endif + el3_cards++; lp->next_dev = el3_root_dev; el3_root_dev = dev; @@ -1474,17 +1480,20 @@ el3_up(struct net_device *dev) } /* Power Management support functions */ -#ifdef EL3_SUSPEND +#ifdef CONFIG_PM_LEGACY static int -el3_suspend(struct device *pdev, pm_message_t state) +el3_suspend(struct pm_dev *pdev) { unsigned long flags; struct net_device *dev; struct el3_private *lp; int ioaddr; - dev = pdev->driver_data; + if (!pdev && !pdev->data) + return -EINVAL; + + dev = (struct net_device *)pdev->data; lp = netdev_priv(dev); ioaddr = dev->base_addr; @@ -1501,14 +1510,17 @@ el3_suspend(struct device *pdev, pm_message_t state) } static int -el3_resume(struct device *pdev) +el3_resume(struct pm_dev *pdev) { unsigned long flags; struct net_device *dev; struct el3_private *lp; int ioaddr; - dev = pdev->driver_data; + if (!pdev && !pdev->data) + return -EINVAL; + + dev = (struct net_device *)pdev->data; lp = netdev_priv(dev); ioaddr = dev->base_addr; @@ -1524,7 +1536,20 @@ el3_resume(struct device *pdev) return 0; } -#endif /* EL3_SUSPEND */ +static int +el3_pm_callback(struct pm_dev *pdev, pm_request_t rqst, void *data) +{ + switch (rqst) { + case PM_SUSPEND: + return el3_suspend(pdev); + + case PM_RESUME: + return el3_resume(pdev); + } + return 0; +} + +#endif /* CONFIG_PM_LEGACY */ /* Parameters that may be passed into the module. */ static int debug = -1; diff --git a/drivers/net/3c515.c b/drivers/net/3c515.c index aedfddf20..91d1c4c24 100644 --- a/drivers/net/3c515.c +++ b/drivers/net/3c515.c @@ -57,6 +57,7 @@ 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 @@ -760,7 +761,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, IRQF_SHARED, + } else if (request_irq(dev->irq, &corkscrew_interrupt, SA_SHIRQ, vp->product_name, dev)) { return -EAGAIN; } @@ -1003,8 +1004,7 @@ 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; - int i; + unsigned long flags, 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 5dfd97f0b..9e1fe2e04 100644 --- a/drivers/net/3c523.c +++ b/drivers/net/3c523.c @@ -105,7 +105,6 @@ #include #include #include -#include #include #include @@ -289,7 +288,7 @@ static int elmc_open(struct net_device *dev) elmc_id_attn586(); /* disable interrupts */ - ret = request_irq(dev->irq, &elmc_interrupt, IRQF_SHARED | IRQF_SAMPLE_RANDOM, + ret = request_irq(dev->irq, &elmc_interrupt, SA_SHIRQ | SA_SAMPLE_RANDOM, dev->name, dev); if (ret) { printk(KERN_ERR "%s: couldn't get irq %d\n", dev->name, dev->irq); @@ -659,7 +658,7 @@ static int init586(struct net_device *dev) s = jiffies; /* warning: only active with interrupts on !! */ while (!(cfg_cmd->cmd_status & STAT_COMPL)) { - if (time_after(jiffies, s + 30*HZ/100)) + if (jiffies - s > 30*HZ/100) break; } @@ -685,7 +684,7 @@ static int init586(struct net_device *dev) s = jiffies; while (!(ias_cmd->cmd_status & STAT_COMPL)) { - if (time_after(jiffies, s + 30*HZ/100)) + if (jiffies - s > 30*HZ/100) break; } @@ -710,7 +709,7 @@ static int init586(struct net_device *dev) s = jiffies; while (!(tdr_cmd->cmd_status & STAT_COMPL)) { - if (time_after(jiffies, s + 30*HZ/100)) { + if (jiffies - s > 30*HZ/100) { printk(KERN_WARNING "%s: %d Problems while running the TDR.\n", dev->name, __LINE__); result = 1; break; @@ -799,7 +798,7 @@ static int init586(struct net_device *dev) elmc_id_attn586(); s = jiffies; while (!(mc_cmd->cmd_status & STAT_COMPL)) { - if (time_after(jiffies, s + 30*HZ/100)) + if (jiffies - s > 30*HZ/100) break; } if (!(mc_cmd->cmd_status & STAT_COMPL)) { @@ -1277,7 +1276,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 init_module(void) +int init_module(void) { int this_dev,found = 0; diff --git a/drivers/net/3c527.c b/drivers/net/3c527.c index 03c0f7176..6db3301e7 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, IRQF_SHARED | IRQF_SAMPLE_RANDOM, DRV_NAME, dev); + err = request_irq(dev->irq, &mc32_interrupt, SA_SHIRQ | SA_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,7 +1031,8 @@ static int mc32_send_packet(struct sk_buff *skb, struct net_device *dev) return 1; } - if (skb_padto(skb, ETH_ZLEN)) { + skb = skb_padto(skb, ETH_ZLEN); + if (skb == NULL) { netif_wake_queue(dev); return 0; } @@ -1645,7 +1646,7 @@ static struct net_device *this_device; * insmod multiple modules for now but it's a hack. */ -int __init init_module(void) +int 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 80e8ca013..7f47124f1 100644 --- a/drivers/net/3c59x.c +++ b/drivers/net/3c59x.c @@ -17,6 +17,172 @@ 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. */ /* @@ -30,6 +196,8 @@ #define DRV_NAME "3c59x" +#define DRV_VERSION "LK1.1.19" +#define DRV_RELDATE "10 Nov 2002" @@ -70,6 +238,7 @@ static int vortex_debug = VORTEX_DEBUG; static int vortex_debug = 1; #endif +#include #include #include #include @@ -89,7 +258,6 @@ static int vortex_debug = 1; #include #include #include -#include #include /* For NR_IRQS only. */ #include #include @@ -106,8 +274,10 @@ static char version[] __devinitdata = DRV_NAME ": Donald Becker and others. www.scyld.com/network/vortex.html\n"; MODULE_AUTHOR("Donald Becker "); -MODULE_DESCRIPTION("3Com 3c59x/3c9xx ethernet driver "); +MODULE_DESCRIPTION("3Com 3c59x/3c9xx ethernet driver " + DRV_VERSION " " DRV_RELDATE); MODULE_LICENSE("GPL"); +MODULE_VERSION(DRV_VERSION); /* Operational parameter that usually are not changed. */ @@ -208,7 +378,8 @@ limit of 4K. of the drivers, and will likely be provided by some future kernel. */ enum pci_flags_bit { - PCI_USES_MASTER=4, + 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 { IS_VORTEX=1, IS_BOOMERANG=2, IS_CYCLONE=4, IS_TORNADO=8, @@ -278,95 +449,95 @@ static struct vortex_chip_info { int io_size; } vortex_info_tbl[] __devinitdata = { {"3c590 Vortex 10Mbps", - PCI_USES_MASTER, IS_VORTEX, 32, }, + PCI_USES_IO|PCI_USES_MASTER, IS_VORTEX, 32, }, {"3c592 EISA 10Mbps Demon/Vortex", /* AKPM: from Don's 3c59x_cb.c 0.49H */ - PCI_USES_MASTER, IS_VORTEX, 32, }, + PCI_USES_IO|PCI_USES_MASTER, IS_VORTEX, 32, }, {"3c597 EISA Fast Demon/Vortex", /* AKPM: from Don's 3c59x_cb.c 0.49H */ - PCI_USES_MASTER, IS_VORTEX, 32, }, + PCI_USES_IO|PCI_USES_MASTER, IS_VORTEX, 32, }, {"3c595 Vortex 100baseTx", - PCI_USES_MASTER, IS_VORTEX, 32, }, + PCI_USES_IO|PCI_USES_MASTER, IS_VORTEX, 32, }, {"3c595 Vortex 100baseT4", - PCI_USES_MASTER, IS_VORTEX, 32, }, + PCI_USES_IO|PCI_USES_MASTER, IS_VORTEX, 32, }, {"3c595 Vortex 100base-MII", - PCI_USES_MASTER, IS_VORTEX, 32, }, + PCI_USES_IO|PCI_USES_MASTER, IS_VORTEX, 32, }, {"3c900 Boomerang 10baseT", - PCI_USES_MASTER, IS_BOOMERANG|EEPROM_RESET, 64, }, + PCI_USES_IO|PCI_USES_MASTER, IS_BOOMERANG|EEPROM_RESET, 64, }, {"3c900 Boomerang 10Mbps Combo", - PCI_USES_MASTER, IS_BOOMERANG|EEPROM_RESET, 64, }, + PCI_USES_IO|PCI_USES_MASTER, IS_BOOMERANG|EEPROM_RESET, 64, }, {"3c900 Cyclone 10Mbps TPO", /* AKPM: from Don's 0.99M */ - PCI_USES_MASTER, IS_CYCLONE|HAS_HWCKSM, 128, }, + PCI_USES_IO|PCI_USES_MASTER, IS_CYCLONE|HAS_HWCKSM, 128, }, {"3c900 Cyclone 10Mbps Combo", - PCI_USES_MASTER, IS_CYCLONE|HAS_HWCKSM, 128, }, + PCI_USES_IO|PCI_USES_MASTER, IS_CYCLONE|HAS_HWCKSM, 128, }, {"3c900 Cyclone 10Mbps TPC", /* AKPM: from Don's 0.99M */ - PCI_USES_MASTER, IS_CYCLONE|HAS_HWCKSM, 128, }, + PCI_USES_IO|PCI_USES_MASTER, IS_CYCLONE|HAS_HWCKSM, 128, }, {"3c900B-FL Cyclone 10base-FL", - PCI_USES_MASTER, IS_CYCLONE|HAS_HWCKSM, 128, }, + PCI_USES_IO|PCI_USES_MASTER, IS_CYCLONE|HAS_HWCKSM, 128, }, {"3c905 Boomerang 100baseTx", - PCI_USES_MASTER, IS_BOOMERANG|HAS_MII|EEPROM_RESET, 64, }, + PCI_USES_IO|PCI_USES_MASTER, IS_BOOMERANG|HAS_MII|EEPROM_RESET, 64, }, {"3c905 Boomerang 100baseT4", - PCI_USES_MASTER, IS_BOOMERANG|HAS_MII|EEPROM_RESET, 64, }, + PCI_USES_IO|PCI_USES_MASTER, IS_BOOMERANG|HAS_MII|EEPROM_RESET, 64, }, {"3c905B Cyclone 100baseTx", - PCI_USES_MASTER, IS_CYCLONE|HAS_NWAY|HAS_HWCKSM|EXTRA_PREAMBLE, 128, }, + PCI_USES_IO|PCI_USES_MASTER, IS_CYCLONE|HAS_NWAY|HAS_HWCKSM|EXTRA_PREAMBLE, 128, }, {"3c905B Cyclone 10/100/BNC", - PCI_USES_MASTER, IS_CYCLONE|HAS_NWAY|HAS_HWCKSM, 128, }, + PCI_USES_IO|PCI_USES_MASTER, IS_CYCLONE|HAS_NWAY|HAS_HWCKSM, 128, }, {"3c905B-FX Cyclone 100baseFx", - PCI_USES_MASTER, IS_CYCLONE|HAS_HWCKSM, 128, }, + PCI_USES_IO|PCI_USES_MASTER, IS_CYCLONE|HAS_HWCKSM, 128, }, {"3c905C Tornado", - PCI_USES_MASTER, IS_TORNADO|HAS_NWAY|HAS_HWCKSM|EXTRA_PREAMBLE, 128, }, + PCI_USES_IO|PCI_USES_MASTER, IS_TORNADO|HAS_NWAY|HAS_HWCKSM|EXTRA_PREAMBLE, 128, }, {"3c920B-EMB-WNM (ATI Radeon 9100 IGP)", - PCI_USES_MASTER, IS_TORNADO|HAS_MII|HAS_HWCKSM, 128, }, + PCI_USES_IO|PCI_USES_MASTER, IS_TORNADO|HAS_MII|HAS_HWCKSM, 128, }, {"3c980 Cyclone", - PCI_USES_MASTER, IS_CYCLONE|HAS_HWCKSM, 128, }, + PCI_USES_IO|PCI_USES_MASTER, IS_CYCLONE|HAS_HWCKSM, 128, }, {"3c980C Python-T", - PCI_USES_MASTER, IS_CYCLONE|HAS_NWAY|HAS_HWCKSM, 128, }, + PCI_USES_IO|PCI_USES_MASTER, IS_CYCLONE|HAS_NWAY|HAS_HWCKSM, 128, }, {"3cSOHO100-TX Hurricane", - PCI_USES_MASTER, IS_CYCLONE|HAS_NWAY|HAS_HWCKSM, 128, }, + PCI_USES_IO|PCI_USES_MASTER, IS_CYCLONE|HAS_NWAY|HAS_HWCKSM, 128, }, {"3c555 Laptop Hurricane", - PCI_USES_MASTER, IS_CYCLONE|EEPROM_8BIT|HAS_HWCKSM, 128, }, + PCI_USES_IO|PCI_USES_MASTER, IS_CYCLONE|EEPROM_8BIT|HAS_HWCKSM, 128, }, {"3c556 Laptop Tornado", - PCI_USES_MASTER, IS_TORNADO|HAS_NWAY|EEPROM_8BIT|HAS_CB_FNS|INVERT_MII_PWR| + PCI_USES_IO|PCI_USES_MASTER, IS_TORNADO|HAS_NWAY|EEPROM_8BIT|HAS_CB_FNS|INVERT_MII_PWR| HAS_HWCKSM, 128, }, {"3c556B Laptop Hurricane", - PCI_USES_MASTER, IS_TORNADO|HAS_NWAY|EEPROM_OFFSET|HAS_CB_FNS|INVERT_MII_PWR| + PCI_USES_IO|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_MASTER, IS_BOOMERANG|HAS_MII|EEPROM_8BIT, 128, }, + PCI_USES_IO|PCI_USES_MASTER, IS_BOOMERANG|HAS_MII|EEPROM_8BIT, 128, }, {"3c575 Boomerang CardBus", - PCI_USES_MASTER, IS_BOOMERANG|HAS_MII|EEPROM_8BIT, 128, }, + PCI_USES_IO|PCI_USES_MASTER, IS_BOOMERANG|HAS_MII|EEPROM_8BIT, 128, }, {"3CCFE575BT Cyclone CardBus", - PCI_USES_MASTER, IS_CYCLONE|HAS_NWAY|HAS_CB_FNS|EEPROM_8BIT| + PCI_USES_IO|PCI_USES_MASTER, IS_CYCLONE|HAS_NWAY|HAS_CB_FNS|EEPROM_8BIT| INVERT_LED_PWR|HAS_HWCKSM, 128, }, {"3CCFE575CT Tornado CardBus", - PCI_USES_MASTER, IS_TORNADO|HAS_NWAY|HAS_CB_FNS|EEPROM_8BIT|INVERT_MII_PWR| + PCI_USES_IO|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_MASTER, IS_CYCLONE|HAS_NWAY|HAS_CB_FNS|EEPROM_8BIT|INVERT_MII_PWR| + PCI_USES_IO|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_MASTER, IS_CYCLONE|HAS_NWAY|HAS_CB_FNS|EEPROM_8BIT|INVERT_MII_PWR| + PCI_USES_IO|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_MASTER, IS_TORNADO|HAS_NWAY|HAS_CB_FNS|EEPROM_8BIT|INVERT_MII_PWR| + PCI_USES_IO|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_MASTER, IS_TORNADO|HAS_NWAY|HAS_HWCKSM, 128, }, + PCI_USES_IO|PCI_USES_MASTER, IS_TORNADO|HAS_NWAY|HAS_HWCKSM, 128, }, {"3c920 Tornado", - PCI_USES_MASTER, IS_TORNADO|HAS_NWAY|HAS_HWCKSM, 128, }, + PCI_USES_IO|PCI_USES_MASTER, IS_TORNADO|HAS_NWAY|HAS_HWCKSM, 128, }, {"3c982 Hydra Dual Port A", - PCI_USES_MASTER, IS_TORNADO|HAS_HWCKSM|HAS_NWAY, 128, }, + PCI_USES_IO|PCI_USES_MASTER, IS_TORNADO|HAS_HWCKSM|HAS_NWAY, 128, }, {"3c982 Hydra Dual Port B", - PCI_USES_MASTER, IS_TORNADO|HAS_HWCKSM|HAS_NWAY, 128, }, + PCI_USES_IO|PCI_USES_MASTER, IS_TORNADO|HAS_HWCKSM|HAS_NWAY, 128, }, {"3c905B-T4", - PCI_USES_MASTER, IS_CYCLONE|HAS_NWAY|HAS_HWCKSM|EXTRA_PREAMBLE, 128, }, + PCI_USES_IO|PCI_USES_MASTER, IS_CYCLONE|HAS_NWAY|HAS_HWCKSM|EXTRA_PREAMBLE, 128, }, {"3c920B-EMB-WNM Tornado", - PCI_USES_MASTER, IS_TORNADO|HAS_NWAY|HAS_HWCKSM, 128, }, + PCI_USES_IO|PCI_USES_MASTER, IS_TORNADO|HAS_NWAY|HAS_HWCKSM, 128, }, {NULL,}, /* NULL terminated list. */ }; @@ -620,7 +791,7 @@ struct vortex_private { int options; /* User-settable misc. driver options. */ unsigned int media_override:4, /* Passed-in media type. */ default_media:4, /* Read from the EEPROM/Wn3_Config. */ - full_duplex:1, autoselect:1, + full_duplex:1, force_fd:1, autoselect:1, bus_master:1, /* Vortex can only do a fragment bus-m. */ full_bus_master_tx:1, full_bus_master_rx:2, /* Boomerang */ flow_ctrl:1, /* Use 802.3x flow control (PAUSE only) */ @@ -670,7 +841,7 @@ enum xcvr_types { XCVR_100baseFx, XCVR_MII=6, XCVR_NWAY=8, XCVR_ExtMII=9, XCVR_Default=10, }; -static const struct media_table { +static struct media_table { char *name; unsigned int media_bits:16, /* Bits to set in Wn4_Media register. */ mask:8, /* The transceiver-present bit in Wn3_Config.*/ @@ -732,6 +903,7 @@ static void acpi_set_WOL(struct net_device *dev); static struct ethtool_ops vortex_ethtool_ops; static void set_8021q_mode(struct net_device *dev, int enable); + /* This driver uses 'options' to pass the media type, full-duplex flag, etc. */ /* Option count limit only -- unlimited interfaces are supported. */ #define MAX_UNITS 8 @@ -746,6 +918,8 @@ static int global_full_duplex = -1; static int global_enable_wol = -1; static int global_use_mmio = -1; +/* #define dev_alloc_skb dev_alloc_skb_debug */ + /* Variables to work-around the Compaq PCI BIOS32 problem. */ static int compaq_ioaddr, compaq_irq, compaq_device_id = 0x5900; static struct net_device *compaq_net_device; @@ -801,7 +975,7 @@ static void poll_vortex(struct net_device *dev) #ifdef CONFIG_PM -static int vortex_suspend(struct pci_dev *pdev, pm_message_t state) +static int vortex_suspend (struct pci_dev *pdev, pm_message_t state) { struct net_device *dev = pci_get_drvdata(pdev); @@ -819,7 +993,7 @@ static int vortex_suspend(struct pci_dev *pdev, pm_message_t state) return 0; } -static int vortex_resume(struct pci_dev *pdev) +static int vortex_resume (struct pci_dev *pdev) { struct net_device *dev = pci_get_drvdata(pdev); struct vortex_private *vp = netdev_priv(dev); @@ -830,7 +1004,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, IRQF_SHARED, dev->name, dev)) { + &boomerang_interrupt : &vortex_interrupt, SA_SHIRQ, dev->name, dev)) { printk(KERN_WARNING "%s: Could not reserve IRQ %d\n", dev->name, dev->irq); pci_disable_device(pdev); return -EBUSY; @@ -852,8 +1026,8 @@ static struct eisa_device_id vortex_eisa_ids[] = { { "" } }; -static int vortex_eisa_probe(struct device *device); -static int vortex_eisa_remove(struct device *device); +static int vortex_eisa_probe (struct device *device); +static int vortex_eisa_remove (struct device *device); static struct eisa_driver vortex_eisa_driver = { .id_table = vortex_eisa_ids, @@ -864,12 +1038,12 @@ static struct eisa_driver vortex_eisa_driver = { } }; -static int vortex_eisa_probe(struct device *device) +static int vortex_eisa_probe (struct device *device) { void __iomem *ioaddr; struct eisa_device *edev; - edev = to_eisa_device(device); + edev = to_eisa_device (device); if (!request_region(edev->base_addr, VORTEX_TOTAL_SIZE, DRV_NAME)) return -EBUSY; @@ -878,7 +1052,7 @@ static int vortex_eisa_probe(struct device *device) if (vortex_probe1(device, ioaddr, ioread16(ioaddr + 0xC88) >> 12, edev->id.driver_data, vortex_cards_found)) { - release_region(edev->base_addr, VORTEX_TOTAL_SIZE); + release_region (edev->base_addr, VORTEX_TOTAL_SIZE); return -ENODEV; } @@ -887,15 +1061,15 @@ static int vortex_eisa_probe(struct device *device) return 0; } -static int vortex_eisa_remove(struct device *device) +static int vortex_eisa_remove (struct device *device) { struct eisa_device *edev; struct net_device *dev; struct vortex_private *vp; void __iomem *ioaddr; - edev = to_eisa_device(device); - dev = eisa_get_drvdata(edev); + edev = to_eisa_device (device); + dev = eisa_get_drvdata (edev); if (!dev) { printk("vortex_eisa_remove called for Compaq device!\n"); @@ -905,34 +1079,30 @@ static int vortex_eisa_remove(struct device *device) vp = netdev_priv(dev); ioaddr = vp->ioaddr; - unregister_netdev(dev); - iowrite16(TotalReset|0x14, ioaddr + EL3_CMD); - release_region(dev->base_addr, VORTEX_TOTAL_SIZE); + unregister_netdev (dev); + iowrite16 (TotalReset|0x14, ioaddr + EL3_CMD); + release_region (dev->base_addr, VORTEX_TOTAL_SIZE); - free_netdev(dev); + free_netdev (dev); return 0; } #endif /* returns count found (>= 0), or negative on error */ -static int __init vortex_eisa_init(void) +static int __init vortex_eisa_init (void) { int eisa_found = 0; int orig_cards_found = vortex_cards_found; #ifdef CONFIG_EISA - int err; - - err = eisa_driver_register (&vortex_eisa_driver); - if (!err) { - /* - * Because of the way EISA bus is probed, we cannot assume - * any device have been found when we exit from - * eisa_driver_register (the bus root driver may not be - * initialized yet). So we blindly assume something was - * found, and let the sysfs magic happend... - */ - eisa_found = 1; + if (eisa_driver_register (&vortex_eisa_driver) >= 0) { + /* Because of the way EISA bus is probed, we cannot assume + * any device have been found when we exit from + * eisa_driver_register (the bus root driver may not be + * initialized yet). So we blindly assume something was + * found, and let the sysfs magic happend... */ + + eisa_found = 1; } #endif @@ -946,7 +1116,7 @@ static int __init vortex_eisa_init(void) } /* returns count (>= 0), or negative on error */ -static int __devinit vortex_init_one(struct pci_dev *pdev, +static int __devinit vortex_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) { int rc, unit, pci_bar; @@ -954,7 +1124,7 @@ static int __devinit vortex_init_one(struct pci_dev *pdev, void __iomem *ioaddr; /* wake up and enable device */ - rc = pci_enable_device(pdev); + rc = pci_enable_device (pdev); if (rc < 0) goto out; @@ -976,7 +1146,7 @@ static int __devinit vortex_init_one(struct pci_dev *pdev, rc = vortex_probe1(&pdev->dev, ioaddr, pdev->irq, ent->driver_data, unit); if (rc < 0) { - pci_disable_device(pdev); + pci_disable_device (pdev); goto out; } @@ -1061,7 +1231,7 @@ static int __devinit vortex_probe1(struct device *gendev, if (print_info) printk (KERN_INFO "See Documentation/networking/vortex.txt\n"); - printk(KERN_INFO "%s: 3Com %s %s at %p.\n", + printk(KERN_INFO "%s: 3Com %s %s at %p. Vers " DRV_VERSION "\n", print_name, pdev ? "PCI" : "EISA", vci->name, @@ -1091,7 +1261,7 @@ static int __devinit vortex_probe1(struct device *gendev, /* enable bus-mastering if necessary */ if (vci->flags & PCI_USES_MASTER) - pci_set_master(pdev); + pci_set_master (pdev); if (vci->drv_flags & IS_VORTEX) { u8 pci_latency; @@ -1135,7 +1305,7 @@ static int __devinit vortex_probe1(struct device *gendev, if (pdev) pci_set_drvdata(pdev, dev); if (edev) - eisa_set_drvdata(edev, dev); + eisa_set_drvdata (edev, dev); vp->media_override = 7; if (option >= 0) { @@ -1160,7 +1330,7 @@ static int __devinit vortex_probe1(struct device *gendev, vp->enable_wol = 1; } - vp->mii.force_media = vp->full_duplex; + vp->force_fd = vp->full_duplex; vp->options = option; /* Read the station address from the EEPROM. */ EL3WINDOW(0); @@ -1214,12 +1384,17 @@ 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; @@ -1240,10 +1415,8 @@ static int __devinit vortex_probe1(struct device *gendev, } if (print_info) { - printk(KERN_INFO "%s: CardBus functions mapped " - "%16.16llx->%p\n", - print_name, - (unsigned long long)pci_resource_start(pdev, 2), + printk(KERN_INFO "%s: CardBus functions mapped %8.8lx->%p\n", + print_name, pci_resource_start(pdev, 2), vp->cb_fn_base); } EL3WINDOW(2); @@ -1272,7 +1445,7 @@ static int __devinit vortex_probe1(struct device *gendev, } { - static const char * const ram_split[] = {"5:3", "3:1", "1:1", "3:5"}; + static const char * ram_split[] = {"5:3", "3:1", "1:1", "3:5"}; unsigned int config; EL3WINDOW(3); vp->available_media = ioread16(ioaddr + Wn3_Options); @@ -1446,47 +1619,13 @@ issue_and_wait(struct net_device *dev, int cmd) dev->name, cmd, ioread16(ioaddr + EL3_STATUS)); } -static void -vortex_set_duplex(struct net_device *dev) -{ - struct vortex_private *vp = netdev_priv(dev); - void __iomem *ioaddr = vp->ioaddr; - - printk(KERN_INFO "%s: setting %s-duplex.\n", - dev->name, (vp->full_duplex) ? "full" : "half"); - - EL3WINDOW(3); - /* Set the full-duplex bit. */ - iowrite16(((vp->info1 & 0x8000) || vp->full_duplex ? 0x20 : 0) | - (vp->large_frames ? 0x40 : 0) | - ((vp->full_duplex && vp->flow_ctrl && vp->partner_flow_ctrl) ? - 0x100 : 0), - ioaddr + Wn3_MAC_Ctrl); -} - -static void vortex_check_media(struct net_device *dev, unsigned int init) -{ - struct vortex_private *vp = netdev_priv(dev); - unsigned int ok_to_print = 0; - - if (vortex_debug > 3) - ok_to_print = 1; - - if (mii_check_media(&vp->mii, ok_to_print, init)) { - vp->full_duplex = vp->mii.full_duplex; - vortex_set_duplex(dev); - } else if (init) { - vortex_set_duplex(dev); - } -} - static void vortex_up(struct net_device *dev) { struct vortex_private *vp = netdev_priv(dev); void __iomem *ioaddr = vp->ioaddr; unsigned int config; - int i, mii_reg1, mii_reg5; + int i; if (VORTEX_PCI(vp)) { pci_set_power_state(VORTEX_PCI(vp), PCI_D0); /* Go active */ @@ -1540,22 +1679,47 @@ vortex_up(struct net_device *dev) printk(KERN_DEBUG "%s: Initial media type %s.\n", dev->name, media_tbl[dev->if_port].name); - vp->full_duplex = vp->mii.force_media; + vp->full_duplex = vp->force_fd; config = BFINS(config, dev->if_port, 20, 4); if (vortex_debug > 6) printk(KERN_DEBUG "vortex_up(): writing 0x%x to InternalConfig\n", config); iowrite32(config, ioaddr + Wn3_Config); if (dev->if_port == XCVR_MII || dev->if_port == XCVR_NWAY) { + int mii_reg1, mii_reg5; EL3WINDOW(4); + /* Read BMSR (reg1) only to clear old status. */ mii_reg1 = mdio_read(dev, vp->phys[0], MII_BMSR); mii_reg5 = mdio_read(dev, vp->phys[0], MII_LPA); + if (mii_reg5 == 0xffff || mii_reg5 == 0x0000) { + netif_carrier_off(dev); /* No MII device or no link partner report */ + } else { + mii_reg5 &= vp->advertising; + if ((mii_reg5 & 0x0100) != 0 /* 100baseTx-FD */ + || (mii_reg5 & 0x00C0) == 0x0040) /* 10T-FD, but not 100-HD */ + vp->full_duplex = 1; + netif_carrier_on(dev); + } vp->partner_flow_ctrl = ((mii_reg5 & 0x0400) != 0); + if (vortex_debug > 1) + printk(KERN_INFO "%s: MII #%d status %4.4x, link partner capability %4.4x," + " info1 %04x, setting %s-duplex.\n", + dev->name, vp->phys[0], + mii_reg1, mii_reg5, + vp->info1, ((vp->info1 & 0x8000) || vp->full_duplex) ? "full" : "half"); + EL3WINDOW(3); + } - vortex_check_media(dev, 1); + /* Set the full-duplex bit. */ + iowrite16( ((vp->info1 & 0x8000) || vp->full_duplex ? 0x20 : 0) | + (vp->large_frames ? 0x40 : 0) | + ((vp->full_duplex && vp->flow_ctrl && vp->partner_flow_ctrl) ? 0x100 : 0), + ioaddr + Wn3_MAC_Ctrl); + + if (vortex_debug > 1) { + printk(KERN_DEBUG "%s: vortex_up() InternalConfig %8.8x.\n", + dev->name, config); } - else - vortex_set_duplex(dev); issue_and_wait(dev, TxReset); /* @@ -1563,7 +1727,6 @@ vortex_up(struct net_device *dev) */ issue_and_wait(dev, RxReset|0x04); - iowrite16(SetStatusEnb | 0x00, ioaddr + EL3_CMD); if (vortex_debug > 1) { @@ -1637,6 +1800,7 @@ vortex_up(struct net_device *dev) set_8021q_mode(dev, 1); iowrite16(StatsEnable, ioaddr + EL3_CMD); /* Turn on statistics. */ +// issue_and_wait(dev, SetTxStart|0x07ff); iowrite16(RxEnable, ioaddr + EL3_CMD); /* Enable the receiver. */ iowrite16(TxEnable, ioaddr + EL3_CMD); /* Enable transmitter. */ /* Allow status bits to be seen. */ @@ -1667,7 +1831,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, IRQF_SHARED, dev->name, dev))) { + &boomerang_interrupt : &vortex_interrupt, SA_SHIRQ, dev->name, dev))) { printk(KERN_ERR "%s: Could not reserve IRQ %d\n", dev->name, dev->irq); goto out; } @@ -1723,7 +1887,7 @@ vortex_timer(unsigned long data) void __iomem *ioaddr = vp->ioaddr; int next_tick = 60*HZ; int ok = 0; - int media_status, old_window; + int media_status, mii_status, old_window; if (vortex_debug > 2) { printk(KERN_DEBUG "%s: Media selection timer tick happened, %s.\n", @@ -1731,7 +1895,9 @@ vortex_timer(unsigned long data) printk(KERN_DEBUG "dev->watchdog_timeo=%d\n", dev->watchdog_timeo); } - disable_irq_lockdep(dev->irq); + if (vp->medialock) + goto leave_media_alone; + disable_irq(dev->irq); old_window = ioread16(ioaddr + EL3_CMD) >> 13; EL3WINDOW(4); media_status = ioread16(ioaddr + Wn4_Media); @@ -1753,9 +1919,44 @@ vortex_timer(unsigned long data) break; case XCVR_MII: case XCVR_NWAY: { - ok = 1; spin_lock_bh(&vp->lock); - vortex_check_media(dev, 0); + mii_status = mdio_read(dev, vp->phys[0], MII_BMSR); + if (!(mii_status & BMSR_LSTATUS)) { + /* Re-read to get actual link status */ + mii_status = mdio_read(dev, vp->phys[0], MII_BMSR); + } + ok = 1; + if (vortex_debug > 2) + printk(KERN_DEBUG "%s: MII transceiver has status %4.4x.\n", + dev->name, mii_status); + if (mii_status & BMSR_LSTATUS) { + int mii_reg5 = mdio_read(dev, vp->phys[0], MII_LPA); + if (! vp->force_fd && mii_reg5 != 0xffff) { + int duplex; + + mii_reg5 &= vp->advertising; + duplex = (mii_reg5&0x0100) || (mii_reg5 & 0x01C0) == 0x0040; + if (vp->full_duplex != duplex) { + vp->full_duplex = duplex; + printk(KERN_INFO "%s: Setting %s-duplex based on MII " + "#%d link partner capability of %4.4x.\n", + dev->name, vp->full_duplex ? "full" : "half", + vp->phys[0], mii_reg5); + /* Set the full-duplex bit. */ + EL3WINDOW(3); + iowrite16( (vp->full_duplex ? 0x20 : 0) | + (vp->large_frames ? 0x40 : 0) | + ((vp->full_duplex && vp->flow_ctrl && vp->partner_flow_ctrl) ? 0x100 : 0), + ioaddr + Wn3_MAC_Ctrl); + if (vortex_debug > 1) + printk(KERN_DEBUG "Setting duplex in Wn3_MAC_Ctrl\n"); + /* AKPM: bug: should reset Tx and Rx after setting Duplex. Page 180 */ + } + } + netif_carrier_on(dev); + } else { + netif_carrier_off(dev); + } spin_unlock_bh(&vp->lock); } break; @@ -1765,14 +1966,7 @@ vortex_timer(unsigned long data) dev->name, media_tbl[dev->if_port].name, media_status); ok = 1; } - - if (!netif_carrier_ok(dev)) - next_tick = 5*HZ; - - if (vp->medialock) - goto leave_media_alone; - - if (!ok) { + if ( ! ok) { unsigned int config; do { @@ -1805,14 +1999,14 @@ vortex_timer(unsigned long data) printk(KERN_DEBUG "wrote 0x%08x to Wn3_Config\n", config); /* AKPM: FIXME: Should reset Rx & Tx here. P60 of 3c90xc.pdf */ } + EL3WINDOW(old_window); + enable_irq(dev->irq); leave_media_alone: if (vortex_debug > 2) printk(KERN_DEBUG "%s: Media selection timer finished, %s.\n", dev->name, media_tbl[dev->if_port].name); - EL3WINDOW(old_window); - enable_irq_lockdep(dev->irq); mod_timer(&vp->timer, RUN_AT(next_tick)); if (vp->deferred) iowrite16(FakeIntr, ioaddr + EL3_CMD); @@ -1915,14 +2109,16 @@ vortex_error(struct net_device *dev, int status) } if (tx_status & 0x14) vp->stats.tx_fifo_errors++; if (tx_status & 0x38) vp->stats.tx_aborted_errors++; - if (tx_status & 0x08) vp->xstats.tx_max_collisions++; iowrite8(0, ioaddr + TxStatus); if (tx_status & 0x30) { /* txJabber or txUnderrun */ do_tx_reset = 1; - } else if ((tx_status & 0x08) && (vp->drv_flags & MAX_COLLISION_RESET)) { /* maxCollisions */ - do_tx_reset = 1; - reset_mask = 0x0108; /* Reset interface logic, but not download logic */ - } else { /* Merely re-enable the transmitter. */ + } else if (tx_status & 0x08) { /* maxCollisions */ + vp->xstats.tx_max_collisions++; + if (vp->drv_flags & MAX_COLLISION_RESET) { + do_tx_reset = 1; + reset_mask = 0x0108; /* Reset interface logic, but not download logic */ + } + } else { /* Merely re-enable the transmitter. */ iowrite16(TxEnable, ioaddr + EL3_CMD); } } @@ -2005,7 +2201,7 @@ vortex_start_xmit(struct sk_buff *skb, struct net_device *dev) if (vp->bus_master) { /* Set the bus-master controller to transfer the packet. */ int len = (skb->len + 3) & ~3; - iowrite32(vp->tx_skb_dma = pci_map_single(VORTEX_PCI(vp), skb->data, len, PCI_DMA_TODEVICE), + iowrite32( vp->tx_skb_dma = pci_map_single(VORTEX_PCI(vp), skb->data, len, PCI_DMA_TODEVICE), ioaddr + Wn7_MasterAddr); iowrite16(len, ioaddr + Wn7_MasterLen); vp->tx_skb = skb; @@ -2528,7 +2724,7 @@ boomerang_rx(struct net_device *dev) skb = dev_alloc_skb(PKT_BUF_SZ); if (skb == NULL) { static unsigned long last_jif; - if (time_after(jiffies, last_jif + 10 * HZ)) { + if ((jiffies - last_jif) > 10 * HZ) { printk(KERN_WARNING "%s: memory shortage\n", dev->name); last_jif = jiffies; } @@ -2782,6 +2978,20 @@ static int vortex_nway_reset(struct net_device *dev) return rc; } +static u32 vortex_get_link(struct net_device *dev) +{ + struct vortex_private *vp = netdev_priv(dev); + void __iomem *ioaddr = vp->ioaddr; + unsigned long flags; + int rc; + + spin_lock_irqsave(&vp->lock, flags); + EL3WINDOW(4); + rc = mii_link_ok(&vp->mii); + spin_unlock_irqrestore(&vp->lock, flags); + return rc; +} + static int vortex_get_settings(struct net_device *dev, struct ethtool_cmd *cmd) { struct vortex_private *vp = netdev_priv(dev); @@ -2862,6 +3072,7 @@ static void vortex_get_drvinfo(struct net_device *dev, struct vortex_private *vp = netdev_priv(dev); strcpy(info->driver, DRV_NAME); + strcpy(info->version, DRV_VERSION); if (VORTEX_PCI(vp)) { strcpy(info->bus_info, pci_name(VORTEX_PCI(vp))); } else { @@ -2882,9 +3093,9 @@ static struct ethtool_ops vortex_ethtool_ops = { .get_stats_count = vortex_get_stats_count, .get_settings = vortex_get_settings, .set_settings = vortex_set_settings, - .get_link = ethtool_op_get_link, + .get_link = vortex_get_link, .nway_reset = vortex_nway_reset, - .get_perm_addr = ethtool_op_get_perm_addr, + .get_perm_addr = ethtool_op_get_perm_addr, }; #ifdef CONFIG_PCI @@ -3085,7 +3296,7 @@ static void mdio_write(struct net_device *dev, int phy_id, int location, int val } return; } - + /* ACPI: Advanced Configuration and Power Interface. */ /* Set Wake-On-LAN mode and put the board into D3 (power-down) state. */ static void acpi_set_WOL(struct net_device *dev) @@ -3109,7 +3320,7 @@ static void acpi_set_WOL(struct net_device *dev) } -static void __devexit vortex_remove_one(struct pci_dev *pdev) +static void __devexit vortex_remove_one (struct pci_dev *pdev) { struct net_device *dev = pci_get_drvdata(pdev); struct vortex_private *vp; @@ -3165,7 +3376,7 @@ static int vortex_have_pci; static int vortex_have_eisa; -static int __init vortex_init(void) +static int __init vortex_init (void) { int pci_rc, eisa_rc; @@ -3181,14 +3392,14 @@ static int __init vortex_init(void) } -static void __exit vortex_eisa_cleanup(void) +static void __exit vortex_eisa_cleanup (void) { struct vortex_private *vp; void __iomem *ioaddr; #ifdef CONFIG_EISA /* Take care of the EISA devices */ - eisa_driver_unregister(&vortex_eisa_driver); + eisa_driver_unregister (&vortex_eisa_driver); #endif if (compaq_net_device) { @@ -3196,24 +3407,33 @@ static void __exit vortex_eisa_cleanup(void) ioaddr = ioport_map(compaq_net_device->base_addr, VORTEX_TOTAL_SIZE); - unregister_netdev(compaq_net_device); - iowrite16(TotalReset, ioaddr + EL3_CMD); + unregister_netdev (compaq_net_device); + iowrite16 (TotalReset, ioaddr + EL3_CMD); release_region(compaq_net_device->base_addr, VORTEX_TOTAL_SIZE); - free_netdev(compaq_net_device); + free_netdev (compaq_net_device); } } -static void __exit vortex_cleanup(void) +static void __exit vortex_cleanup (void) { if (vortex_have_pci) - pci_unregister_driver(&vortex_driver); + pci_unregister_driver (&vortex_driver); if (vortex_have_eisa) - vortex_eisa_cleanup(); + vortex_eisa_cleanup (); } module_init(vortex_init); module_exit(vortex_cleanup); + + +/* + * Local variables: + * c-indent-level: 4 + * c-basic-offset: 4 + * tab-width: 4 + * End: + */ diff --git a/drivers/net/7990.c b/drivers/net/7990.c index 86633c5f1..18b027e73 100644 --- a/drivers/net/7990.c +++ b/drivers/net/7990.c @@ -29,7 +29,7 @@ #include #include #include -#include +#include /* Used for the temporal inet entries and routing */ #include #include diff --git a/drivers/net/8139cp.c b/drivers/net/8139cp.c index 1428bb771..dd410496a 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,6 +52,7 @@ #define DRV_RELDATE "Mar 22, 2004" +#include #include #include #include @@ -400,11 +401,6 @@ 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, @@ -465,7 +461,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; @@ -514,7 +510,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))) @@ -543,7 +539,8 @@ rx_status_loop: unsigned buflen; skb = cp->rx_skb[rx_tail].skb; - BUG_ON(!skb); + if (!skb) + BUG(); desc = &cp->rx_ring[rx_tail]; status = le32_to_cpu(desc->opts1); @@ -726,7 +723,8 @@ static void cp_tx (struct cp_private *cp) break; skb = cp->tx_skb[tx_tail].skb; - BUG_ON(!skb); + if (!skb) + BUG(); pci_unmap_single(cp->pdev, cp->tx_skb[tx_tail].mapping, cp->tx_skb[tx_tail].len, PCI_DMA_TODEVICE); @@ -796,7 +794,7 @@ static int cp_start_xmit (struct sk_buff *skb, struct net_device *dev) entry = cp->tx_head; eor = (entry == (CP_TX_RING_SIZE - 1)) ? RingEnd : 0; if (dev->features & NETIF_F_TSO) - mss = skb_shinfo(skb)->gso_size; + mss = skb_shinfo(skb)->tso_size; if (skb_shinfo(skb)->nr_frags == 0) { struct cp_desc *txd = &cp->tx_ring[entry]; @@ -1065,7 +1063,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); @@ -1203,7 +1201,7 @@ static int cp_open (struct net_device *dev) cp_init_hw(cp); - rc = request_irq(dev->irq, cp_interrupt, IRQF_SHARED, dev->name, dev); + rc = request_irq(dev->irq, cp_interrupt, SA_SHIRQ, dev->name, dev); if (rc) goto err_out_hw; @@ -1278,7 +1276,7 @@ static int cp_change_mtu(struct net_device *dev, int new_mtu) } #endif /* BROKEN */ -static const char mii_2_8139_map[8] = { +static char mii_2_8139_map[8] = { BasicModeCtrl, BasicModeStatus, 0, @@ -1355,7 +1353,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; @@ -1552,7 +1550,8 @@ static void cp_get_ethtool_stats (struct net_device *dev, tmp_stats[i++] = le16_to_cpu(nic_stats->tx_abort); tmp_stats[i++] = le16_to_cpu(nic_stats->tx_underrun); tmp_stats[i++] = cp->cp_stats.rx_frags; - BUG_ON(i != CP_NUM_STATS); + if (i != CP_NUM_STATS) + BUG(); pci_free_consistent(cp->pdev, sizeof(*nic_stats), nic_stats, dma); } @@ -1581,9 +1580,6 @@ 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) @@ -1619,32 +1615,24 @@ 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) -#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) +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); + 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 command bits out. */ - for (i = cmd_len - 1; i >= 0; i--) { - int dataval = (cmd & (1 << i)) ? EE_DATA_WRITE : 0; + /* Shift the read command bits out. */ + for (i = 4 + addr_len; i >= 0; i--) { + int dataval = (read_cmd & (1 << i)) ? EE_DATA_WRITE : 0; writeb (EE_ENB | dataval, ee_addr); eeprom_delay (); writeb (EE_ENB | dataval | EE_SHIFT_CLK, ee_addr); @@ -1652,33 +1640,6 @@ static void eeprom_cmd(void __iomem *ee_addr, int cmd, int cmd_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); @@ -1690,125 +1651,13 @@ static u16 read_eeprom (void __iomem *ioaddr, int location, int addr_len) eeprom_delay (); } - eeprom_cmd_end(ee_addr); + /* Terminate the EEPROM access. */ + writeb (~EE_CS, ee_addr); + eeprom_delay (); 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) { @@ -1822,7 +1671,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; - resource_size_t pciaddr; + long pciaddr; unsigned int addr_len, i, pci_using_dac; u8 pci_rev; @@ -1836,10 +1685,9 @@ 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) { - 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"); + 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"); return -ENODEV; } @@ -1877,13 +1725,14 @@ 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; - dev_err(&pdev->dev, "no MMIO resource\n"); + printk(KERN_ERR PFX "no MMIO resource for pci dev %s\n", + pci_name(pdev)); goto err_out_res; } if (pci_resource_len(pdev, 1) < CP_REGS_SIZE) { rc = -EIO; - dev_err(&pdev->dev, "MMIO resource (%llx) too small\n", - (unsigned long long)pci_resource_len(pdev, 1)); + printk(KERN_ERR PFX "MMIO resource (%lx) too small on pci dev %s\n", + pci_resource_len(pdev, 1), pci_name(pdev)); goto err_out_res; } @@ -1897,15 +1746,14 @@ 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) { - dev_err(&pdev->dev, - "No usable DMA configuration, aborting.\n"); + printk(KERN_ERR PFX "No usable DMA configuration, " + "aborting.\n"); goto err_out_res; } rc = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK); if (rc) { - dev_err(&pdev->dev, - "No usable consistent DMA configuration, " - "aborting.\n"); + printk(KERN_ERR PFX "No usable consistent DMA configuration, " + "aborting.\n"); goto err_out_res; } } @@ -1916,9 +1764,8 @@ 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; - dev_err(&pdev->dev, "Cannot map PCI MMIO (%Lx@%Lx)\n", - (unsigned long long)pci_resource_len(pdev, 1), - (unsigned long long)pciaddr); + printk(KERN_ERR PFX "Cannot map PCI MMIO (%lx@%lx) on pci dev %s\n", + pci_resource_len(pdev, 1), pciaddr, pci_name(pdev)); goto err_out_res; } dev->base_addr = (unsigned long) regs; @@ -1987,8 +1834,7 @@ 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; @@ -2010,11 +1856,11 @@ static void cp_remove_one (struct pci_dev *pdev) struct net_device *dev = pci_get_drvdata(pdev); struct cp_private *cp = netdev_priv(dev); - BUG_ON(!dev); + if (!dev) + BUG(); 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); @@ -2077,7 +1923,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 e4f4eaff7..2beac55b5 100644 --- a/drivers/net/8139too.c +++ b/drivers/net/8139too.c @@ -93,6 +93,7 @@ #define DRV_VERSION "0.9.27" +#include #include #include #include @@ -164,7 +165,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) @@ -228,7 +229,7 @@ typedef enum { /* indexed by board_t, above */ -static const struct { +static struct { const char *name; u32 hw_flags; } board_info[] __devinitdata = { @@ -256,7 +257,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 :-( */ @@ -768,7 +769,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) { - dev_err(&pdev->dev, "Unable to alloc new net device\n"); + printk (KERN_ERR PFX "%s: Unable to alloc new net device\n", pci_name(pdev)); return -ENOMEM; } SET_MODULE_OWNER(dev); @@ -800,31 +801,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)) { - dev_err(&pdev->dev, "region #0 not a PIO resource, aborting\n"); + printk (KERN_ERR PFX "%s: region #0 not a PIO resource, aborting\n", pci_name(pdev)); rc = -ENODEV; goto err_out; } /* check for weird/broken PCI region reporting */ if (pio_len < RTL_MIN_IO_SIZE) { - dev_err(&pdev->dev, "Invalid PCI I/O region size(s), aborting\n"); + printk (KERN_ERR PFX "%s: Invalid PCI I/O region size(s), aborting\n", pci_name(pdev)); rc = -ENODEV; goto err_out; } #else /* make sure PCI base addr 1 is MMIO */ if (!(mmio_flags & IORESOURCE_MEM)) { - dev_err(&pdev->dev, "region #1 not an MMIO resource, aborting\n"); + printk (KERN_ERR PFX "%s: region #1 not an MMIO resource, aborting\n", pci_name(pdev)); rc = -ENODEV; goto err_out; } if (mmio_len < RTL_MIN_IO_SIZE) { - dev_err(&pdev->dev, "Invalid PCI mem region size(s), aborting\n"); + printk (KERN_ERR PFX "%s: Invalid PCI mem region size(s), aborting\n", pci_name(pdev)); rc = -ENODEV; goto err_out; } #endif - rc = pci_request_regions (pdev, DRV_NAME); + rc = pci_request_regions (pdev, "8139too"); if (rc) goto err_out; disable_dev_on_err = 1; @@ -835,7 +836,7 @@ static int __devinit rtl8139_init_board (struct pci_dev *pdev, #ifdef USE_IO_OPS ioaddr = ioport_map(pio_start, pio_len); if (!ioaddr) { - dev_err(&pdev->dev, "cannot map PIO, aborting\n"); + printk (KERN_ERR PFX "%s: cannot map PIO, aborting\n", pci_name(pdev)); rc = -EIO; goto err_out; } @@ -846,7 +847,7 @@ static int __devinit rtl8139_init_board (struct pci_dev *pdev, /* ioremap MMIO region */ ioaddr = pci_iomap(pdev, 1, 0); if (ioaddr == NULL) { - dev_err(&pdev->dev, "cannot remap MMIO, aborting\n"); + printk (KERN_ERR PFX "%s: cannot remap MMIO, aborting\n", pci_name(pdev)); rc = -EIO; goto err_out; } @@ -860,7 +861,8 @@ static int __devinit rtl8139_init_board (struct pci_dev *pdev, /* check for missing/broken hardware */ if (RTL_R32 (TxConfig) == 0xFFFFFFFF) { - dev_err(&pdev->dev, "Chip not responding, ignoring board\n"); + printk (KERN_ERR PFX "%s: Chip not responding, ignoring board\n", + pci_name(pdev)); rc = -EIO; goto err_out; } @@ -874,10 +876,9 @@ static int __devinit rtl8139_init_board (struct pci_dev *pdev, } /* if unknown chip, assume array element #0, original RTL-8139 in this case */ - 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)); + 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)); tp->chipset = 0; match: @@ -954,11 +955,9 @@ 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) { - 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"); + 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"); } i = rtl8139_init_board (pdev, &dev); @@ -1132,7 +1131,7 @@ static void __devexit rtl8139_remove_one (struct pci_dev *pdev) No extra delay is needed with 33Mhz PCI, but 66Mhz may change this. */ -#define eeprom_delay() (void)RTL_R32(Cfg9346) +#define eeprom_delay() RTL_R32(Cfg9346) /* The EEPROM commands include the alway-set leading bit. */ #define EE_WRITE_CMD (5) @@ -1193,7 +1192,7 @@ static int __devinit read_eeprom (void __iomem *ioaddr, int location, int addr_l #define mdio_delay() RTL_R8(Config4) -static const char mii_2_8139_map[8] = { +static char mii_2_8139_map[8] = { BasicModeCtrl, BasicModeStatus, 0, @@ -1312,7 +1311,7 @@ static int rtl8139_open (struct net_device *dev) int retval; void __iomem *ioaddr = tp->mmio_addr; - retval = request_irq (dev->irq, rtl8139_interrupt, IRQF_SHARED, dev->name, dev); + retval = request_irq (dev->irq, rtl8139_interrupt, SA_SHIRQ, dev->name, dev); if (retval) return retval; @@ -1342,9 +1341,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 %#llx IRQ %d" - " GP Pins %2.2x %s-duplex.\n", dev->name, - (unsigned long long)pci_resource_start (tp->pci_dev, 1), + 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), dev->irq, RTL_R8 (MediaStatus), tp->mii.full_duplex ? "full" : "half"); @@ -1606,7 +1605,7 @@ static void rtl8139_thread (void *_data) if (tp->watchdog_fired) { tp->watchdog_fired = 0; rtl8139_tx_timeout_task(_data); - } else if (rtnl_trylock()) { + } else if (rtnl_shlock_nowait() == 0) { rtl8139_thread_iter (dev, tp, tp->mmio_addr); rtnl_unlock (); } else { @@ -1709,7 +1708,6 @@ 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; @@ -1726,7 +1724,7 @@ static int rtl8139_start_xmit (struct sk_buff *skb, struct net_device *dev) return 0; } - spin_lock_irqsave(&tp->lock, flags); + spin_lock_irq(&tp->lock); RTL_W32_F (TxStatus0 + (entry * sizeof (u32)), tp->tx_flag | max(len, (unsigned int)ETH_ZLEN)); @@ -1737,7 +1735,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_irqrestore(&tp->lock, flags); + spin_unlock_irq(&tp->lock); if (netif_msg_tx_queued(tp)) printk (KERN_DEBUG "%s: Queued Tx packet size %u to slot %d.\n", @@ -1826,7 +1824,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++; @@ -1946,7 +1944,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; @@ -2033,7 +2031,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); @@ -2160,13 +2158,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 257d3bce3..13b745b39 100644 --- a/drivers/net/82596.c +++ b/drivers/net/82596.c @@ -40,6 +40,7 @@ */ +#include #include #include #include @@ -613,7 +614,7 @@ static void rebuild_rx_bufs(struct net_device *dev) static int init_i596_mem(struct net_device *dev) { struct i596_private *lp = dev->priv; -#if !defined(ENABLE_MVME16x_NET) && !defined(ENABLE_BVME6000_NET) || defined(ENABLE_APRICOT) +#if !defined(ENABLE_MVME16x_NET) && !defined(ENABLE_BVME6000_NET) short ioaddr = dev->base_addr; #endif unsigned long flags; @@ -899,7 +900,7 @@ memory_squeeze: } -static void i596_cleanup_cmd(struct net_device *dev, struct i596_private *lp) +static inline void i596_cleanup_cmd(struct net_device *dev, struct i596_private *lp) { struct i596_cmd *ptr; @@ -932,8 +933,7 @@ static void i596_cleanup_cmd(struct net_device *dev, struct i596_private *lp) lp->scb.cmd = I596_NULL; } -static void i596_reset(struct net_device *dev, struct i596_private *lp, - int ioaddr) +static inline void i596_reset(struct net_device *dev, struct i596_private *lp, int ioaddr) { unsigned long flags; @@ -1070,7 +1070,8 @@ static int i596_start_xmit(struct sk_buff *skb, struct net_device *dev) skb->len, (unsigned int)skb->data)); if (skb->len < ETH_ZLEN) { - if (skb_padto(skb, ETH_ZLEN)) + skb = skb_padto(skb, ETH_ZLEN); + if (skb == NULL) return 0; length = ETH_ZLEN; } @@ -1579,7 +1580,7 @@ static int debug = -1; module_param(debug, int, 0); MODULE_PARM_DESC(debug, "i82596 debug mask"); -int __init init_module(void) +int init_module(void) { if (debug >= 0) i596_debug = debug; @@ -1589,7 +1590,7 @@ int __init init_module(void) return 0; } -void __exit cleanup_module(void) +void cleanup_module(void) { unregister_netdev(dev_82596); #ifdef __mc68000__ diff --git a/drivers/net/8390.c b/drivers/net/8390.c index d2935ae39..f87027420 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_lockdep(dev->irq); + disable_irq_nosync(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_lockdep(dev->irq); + enable_irq(dev->irq); netif_wake_queue(dev); } @@ -275,14 +275,12 @@ 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) { - memset(buf, 0, ETH_ZLEN); /* more efficient than doing just the needed bits */ - memcpy(buf, data, skb->len); + skb = skb_padto(skb, ETH_ZLEN); + if (skb == NULL) + return 0; send_length = ETH_ZLEN; - data = buf; } /* Mask interrupts from the ethercard. @@ -349,7 +347,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, data, output_page); + ei_block_output(dev, send_length, skb->data, output_page); if (! ei_local->txing) { diff --git a/drivers/net/8390.h b/drivers/net/8390.h index a9a58f518..599b68d8c 100644 --- a/drivers/net/8390.h +++ b/drivers/net/8390.h @@ -7,6 +7,7 @@ #ifndef _8390_h #define _8390_h +#include #include #include #include @@ -133,7 +134,7 @@ struct ei_device { #define inb_p(_p) inb(_p) #define outb_p(_v,_p) outb(_v,_p) -#elif defined(CONFIG_NE_H8300) || defined(CONFIG_NE_H8300_MODULE) +#elif defined(CONFIG_NET_CBUS) || defined(CONFIG_NE_H8300) || defined(CONFIG_NE_H8300_MODULE) #define EI_SHIFT(x) (ei_local->reg_offset[x]) #else #define EI_SHIFT(x) (x) diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig index a2bd81192..aa633fa95 100644 --- a/drivers/net/Kconfig +++ b/drivers/net/Kconfig @@ -66,7 +66,7 @@ config BONDING 'Trunking' by Sun, 802.3ad by the IEEE, and 'Bonding' in Linux. The driver supports multiple bonding modes to allow for both high - performance and high availability operation. + perfomance and high availability operation. Refer to for more information. @@ -447,7 +447,6 @@ 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 @@ -699,8 +698,8 @@ config VORTEX depends on NET_VENDOR_3COM && (PCI || EISA) select MII ---help--- - This option enables driver support for a large number of 10Mbps and - 10/100Mbps EISA, PCI and PCMCIA 3Com network cards: + This option enables driver support for a large number of 10mbps and + 10/100mbps EISA, PCI and PCMCIA 3Com network cards: "Vortex" (Fast EtherLink 3c590/3c592/3c595/3c597) EISA and PCI "Boomerang" (EtherLink XL 3c900 or 3c905) PCI @@ -854,17 +853,6 @@ 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 @@ -877,22 +865,6 @@ 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 @@ -1049,7 +1021,7 @@ config EEXPRESS_PRO depends on NET_ISA ---help--- If you have a network (Ethernet) card of this type, say Y. This - driver supports Intel i82595{FX,TX} based boards. Note however + driver supports intel i82595{FX,TX} based boards. Note however that the EtherExpress PRO/100 Ethernet card has its own separate driver. Please read the Ethernet-HOWTO, available from . @@ -1236,7 +1208,7 @@ config IBM_EMAC_RX_SKB_HEADROOM help Additional receive skb headroom. Note, that driver will always reserve at least 2 bytes to make IP header - aligned, so usually there is no need to add any additional + aligned, so usualy there is no need to add any additional headroom. If unsure, set to 0. @@ -1387,8 +1359,8 @@ config APRICOT called apricot. config B44 - tristate "Broadcom 4400 ethernet support" - depends on NET_PCI && PCI + tristate "Broadcom 4400 ethernet support (EXPERIMENTAL)" + depends on NET_PCI && PCI && EXPERIMENTAL select MII help If you have a network (Ethernet) controller of this type, say Y and @@ -1400,8 +1372,8 @@ config B44 called b44. config FORCEDETH - tristate "nForce Ethernet support" - depends on NET_PCI && PCI + tristate "Reverse Engineered nForce Ethernet support (EXPERIMENTAL)" + depends on NET_PCI && PCI && EXPERIMENTAL help If you have a network (Ethernet) controller of this type, say Y and read the Ethernet-HOWTO, available from @@ -1642,7 +1614,11 @@ config SIS900 ---help--- This is a driver for the Fast Ethernet PCI network cards based on the SiS 900 and SiS 7016 chips. The SiS 900 core is also embedded in - SiS 630 and SiS 540 chipsets. + SiS 630 and SiS 540 chipsets. If you have one of those, say Y and + read the Ethernet-HOWTO, available at + . Please read + and comments at the + beginning of for more information. This driver also supports AMD 79C901 HomePNA so that you can use your phone line as a network cable. @@ -1724,20 +1700,6 @@ 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 @@ -1956,7 +1918,7 @@ config E1000_DISABLE_PACKET_SPLIT depends on E1000 help Say Y here if you want to use the legacy receive path for PCI express - hardware. + hadware. If in doubt, say N. @@ -1972,7 +1934,7 @@ config MYRI_SBUS will be called myri_sbus. This is recommended. config NS83820 - tristate "National Semiconductor DP83820 support" + tristate "National Semiconduct DP83820 support" depends on PCI help This is a driver for the National Semiconductor DP83820 series @@ -2205,8 +2167,6 @@ 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. @@ -2215,55 +2175,26 @@ config BNX2 config SPIDER_NET tristate "Spider Gigabit Ethernet driver" - depends on PCI && PPC_IBM_CELL_BLADE - select FW_LOADER + depends on PCI && PPC_CELL help This driver supports the Gigabit Ethernet chips present on the Cell Processor-Based Blades from IBM. config GIANFAR tristate "Gianfar Ethernet" - depends on 85xx || 83xx || PPC_86xx + depends on 85xx || 83xx select PHYLIB help - This driver supports the Gigabit TSEC on the MPC83xx, MPC85xx, - and MPC86xx family of chips, and the FEC on the 8540. + This driver supports the Gigabit TSEC on the MPC85xx + 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 - select MII help This driver supports the gigabit Ethernet on the Marvell MV643XX chipset which is used in the Momenco Ocelot C and Jaguar ATX and @@ -2382,30 +2313,15 @@ 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 +if !UML source "drivers/net/tokenring/Kconfig" source "drivers/net/wireless/Kconfig" source "drivers/net/pcmcia/Kconfig" +endif source "drivers/net/wan/Kconfig" @@ -2598,7 +2514,7 @@ config PPP_FILTER Say Y here if you want to be able to filter the packets passing over PPP interfaces. This allows you to control which packets count as activity (i.e. which packets will reset the idle timer or bring up - a demand-dialed link) and which packets are to be dropped entirely. + a demand-dialled link) and which packets are to be dropped entirely. You need to say Y here if you wish to use the pass-filter and active-filter options to pppd. @@ -2786,8 +2702,8 @@ config SHAPER for more information. An alternative to this traffic shaper is the experimental - Class-Based Queuing (CBQ) scheduling support which you get if you - say Y to "QoS and/or fair queuing" above. + Class-Based Queueing (CBQ) scheduling support which you get if you + say Y to "QoS and/or fair queueing" above. To compile this driver as a module, choose M here: the module will be called shaper. If unsure, say N. diff --git a/drivers/net/Makefile b/drivers/net/Makefile index 7454d25e8..00e72b12f 100644 --- a/drivers/net/Makefile +++ b/drivers/net/Makefile @@ -18,9 +18,6 @@ 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 # @@ -61,8 +58,8 @@ obj-$(CONFIG_STNIC) += stnic.o 8390.o obj-$(CONFIG_FEALNX) += fealnx.o obj-$(CONFIG_TIGON3) += tg3.o obj-$(CONFIG_BNX2) += bnx2.o -spidernet-y += spider_net.o spider_net_ethtool.o -obj-$(CONFIG_SPIDER_NET) += spidernet.o sungem_phy.o +spidernet-y += spider_net.o spider_net_ethtool.o sungem_phy.o +obj-$(CONFIG_SPIDER_NET) += spidernet.o obj-$(CONFIG_TC35815) += tc35815.o obj-$(CONFIG_SKGE) += skge.o obj-$(CONFIG_SKY2) += sky2.o @@ -148,7 +145,6 @@ obj-$(CONFIG_EL3) += 3c509.o obj-$(CONFIG_3C515) += 3c515.o obj-$(CONFIG_EEXPRESS) += eexpress.o obj-$(CONFIG_EEXPRESS_PRO) += eepro.o -obj-$(CONFIG_MAMBO_NET) += mambonet.o obj-$(CONFIG_8139CP) += 8139cp.o obj-$(CONFIG_8139TOO) += 8139too.o obj-$(CONFIG_ZNET) += znet.o @@ -191,15 +187,12 @@ 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 a8c245a82..60304f7e7 100644 --- a/drivers/net/Space.c +++ b/drivers/net/Space.c @@ -27,6 +27,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 diff --git a/drivers/net/a2065.c b/drivers/net/a2065.c index f4ea62641..8e538a6d7 100644 --- a/drivers/net/a2065.c +++ b/drivers/net/a2065.c @@ -48,6 +48,7 @@ #include #include #include +#include #include #include #include @@ -495,7 +496,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, IRQF_SHARED, + ret = request_irq(IRQ_AMIGA_PORTS, lance_interrupt, SA_SHIRQ, dev->name, dev); if (ret) return ret; @@ -572,7 +573,8 @@ static int lance_start_xmit (struct sk_buff *skb, struct net_device *dev) if (len < ETH_ZLEN) { len = ETH_ZLEN; - if (skb_padto(skb, ETH_ZLEN)) + skb = skb_padto(skb, ETH_ZLEN); + if (skb == NULL) return 0; } @@ -827,7 +829,7 @@ static void __devexit a2065_remove_one(struct zorro_dev *z) static int __init a2065_init_module(void) { - return zorro_register_driver(&a2065_driver); + return zorro_module_init(&a2065_driver); } static void __exit a2065_cleanup_module(void) diff --git a/drivers/net/ac3200.c b/drivers/net/ac3200.c index 0fbbcb75a..7952dc6d7 100644 --- a/drivers/net/ac3200.c +++ b/drivers/net/ac3200.c @@ -370,7 +370,8 @@ MODULE_PARM_DESC(mem, "Memory base address(es)"); MODULE_DESCRIPTION("Ansel AC3200 EISA ethernet driver"); MODULE_LICENSE("GPL"); -int __init init_module(void) +int +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 1c01e9b3d..b508812e9 100644 --- a/drivers/net/acenic.c +++ b/drivers/net/acenic.c @@ -50,6 +50,7 @@ * Grant Grundler : PCI write posting fixes. */ +#include #include #include #include @@ -578,7 +579,11 @@ static int __devinit acenic_probe_one(struct pci_dev *pdev, } printk("Gigabit Ethernet at 0x%08lx, ", dev->base_addr); - printk("irq %d\n", pdev->irq); +#ifdef __sparc__ + printk("irq %s\n", __irq_itoa(pdev->irq)); +#else + printk("irq %i\n", pdev->irq); +#endif #ifdef CONFIG_ACENIC_OMIT_TIGON_I if ((readl(&ap->regs->HostCtrl) >> 28) == 4) { @@ -1194,7 +1199,7 @@ static int __devinit ace_init(struct net_device *dev) goto init_error; } - ecode = request_irq(pdev->irq, ace_interrupt, IRQF_SHARED, + ecode = request_irq(pdev->irq, ace_interrupt, SA_SHIRQ, 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 62ec8ceee..a97107023 100644 --- a/drivers/net/acenic.h +++ b/drivers/net/acenic.h @@ -1,6 +1,7 @@ #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 ec146f60d..6d625d595 100644 --- a/drivers/net/acenic_firmware.h +++ b/drivers/net/acenic_firmware.h @@ -1,3 +1,4 @@ +#include /* * Declare these here even if Tigon I support is disabled to avoid * the compiler complaining about undefined symbols. @@ -4396,7 +4397,7 @@ static u32 tigonFwText[(MAX_TEXT_LEN/4) + 1] __devinitdata = { 0x3c010001, 0x220821, 0xac317e30, 0x8fbf0024, 0x8fb40020, 0x8fb3001c, 0x8fb20018, 0x8fb10014, 0x8fb00010, 0x3e00008, 0x27bd0028, 0x0 }; -static u32 tigonFwRodata[(MAX_RODATA_LEN/4) + 1] __devinitdata = { +static u32 tigonFwRodata[(MAX_RODATA_LEN/4) + 1] __initdata = { 0x24486561, 0x6465723a, 0x202f7072, 0x6f6a6563, 0x74732f72, 0x63732f73, 0x772f6765, 0x2f2e2f6e, 0x69632f66, 0x772f636f, 0x6d6d6f6e, @@ -4570,7 +4571,7 @@ static u32 tigonFwRodata[(MAX_RODATA_LEN/4) + 1] __devinitdata = { 0x0, 0x14c38, 0x14c38, 0x14b80, 0x14bc4, 0x14c38, 0x14c38, 0x0, 0x0, 0x0 }; -static u32 tigonFwData[(MAX_DATA_LEN/4) + 1] __devinitdata = { +static u32 tigonFwData[(MAX_DATA_LEN/4) + 1] __initdata = { 0x416c7465, 0x6f6e2041, 0x63654e49, 0x43205600, 0x416c7465, 0x6f6e2041, 0x63654e49, 0x43205600, 0x42424242, @@ -4611,7 +4612,7 @@ static u32 tigonFwData[(MAX_DATA_LEN/4) + 1] __devinitdata = { #define tigon2FwSbssLen 0xcc #define tigon2FwBssAddr 0x00016f50 #define tigon2FwBssLen 0x20c0 -static u32 tigon2FwText[(MAX_TEXT_LEN/4) + 1] __devinitdata = { +static u32 tigon2FwText[(MAX_TEXT_LEN/4) + 1] __initdata = { 0x0, 0x10000003, 0x0, 0xd, 0xd, 0x3c1d0001, 0x8fbd6d20, 0x3a0f021, 0x3c100000, @@ -9153,7 +9154,7 @@ static u32 tigon2FwText[(MAX_TEXT_LEN/4) + 1] __devinitdata = { 0x24020001, 0x8f430328, 0x1021, 0x24630001, 0x3e00008, 0xaf430328, 0x3e00008, 0x0, 0x0, 0x0, 0x0, 0x0 }; -static u32 tigon2FwRodata[(MAX_RODATA_LEN/4) + 1] __devinitdata = { +static u32 tigon2FwRodata[(MAX_RODATA_LEN/4) + 1] __initdata = { 0x24486561, 0x6465723a, 0x202f7072, 0x6f6a6563, 0x74732f72, 0x63732f73, 0x772f6765, 0x2f2e2f6e, 0x69632f66, 0x77322f63, 0x6f6d6d6f, @@ -9424,7 +9425,7 @@ static u32 tigon2FwRodata[(MAX_RODATA_LEN/4) + 1] __devinitdata = { 0x14ed8, 0x14b8c, 0x14bd8, 0x14c24, 0x14ed8, 0x7365746d, 0x61636163, 0x74000000, 0x0, 0x0 }; -static u32 tigon2FwData[(MAX_DATA_LEN/4) + 1] __devinitdata = { +static u32 tigon2FwData[(MAX_DATA_LEN/4) + 1] __initdata = { 0x1, 0x1, 0x1, 0xc001fc, 0x3ffc, 0xc00000, 0x416c7465, 0x6f6e2041, 0x63654e49, diff --git a/drivers/net/amd8111e.c b/drivers/net/amd8111e.c index ed322a769..d9ba8be72 100755 --- a/drivers/net/amd8111e.c +++ b/drivers/net/amd8111e.c @@ -69,6 +69,7 @@ Revision History: */ +#include #include #include #include @@ -1376,7 +1377,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, IRQF_SHARED, + if(dev->irq ==0 || request_irq(dev->irq, amd8111e_interrupt, SA_SHIRQ, dev->name, dev)) return -EAGAIN; diff --git a/drivers/net/apne.c b/drivers/net/apne.c index 9cc13a025..a94216b87 100644 --- a/drivers/net/apne.c +++ b/drivers/net/apne.c @@ -36,7 +36,6 @@ #include #include #include -#include #include #include @@ -217,7 +216,7 @@ static int __init apne_probe1(struct net_device *dev, int ioaddr) outb(inb(ioaddr + NE_RESET), ioaddr + NE_RESET); while ((inb(ioaddr + NE_EN0_ISR) & ENISR_RESET) == 0) - if (time_after(jiffies, reset_start_time + 2*HZ/100)) { + if (jiffies - reset_start_time > 2*HZ/100) { printk(" not found (no reset ack).\n"); return -ENODEV; } @@ -313,7 +312,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, IRQF_SHARED, DRV_NAME, dev); + i = request_irq(IRQ_AMIGA_PORTS, apne_interrupt, SA_SHIRQ, DRV_NAME, dev); if (i) return i; for(i = 0; i < ETHER_ADDR_LEN; i++) { @@ -383,7 +382,7 @@ apne_reset_8390(struct net_device *dev) /* This check _should_not_ be necessary, omit eventually. */ while ((inb(NE_BASE+NE_EN0_ISR) & ENISR_RESET) == 0) - if (time_after(jiffies, reset_start_time + 2*HZ/100)) { + if (jiffies - reset_start_time > 2*HZ/100) { printk("%s: ne_reset_8390() did not complete.\n", dev->name); break; } @@ -531,7 +530,7 @@ apne_block_output(struct net_device *dev, int count, dma_start = jiffies; while ((inb(NE_BASE + NE_EN0_ISR) & ENISR_RDC) == 0) - if (time_after(jiffies, dma_start + 2*HZ/100)) { /* 20ms */ + if (jiffies - dma_start > 2*HZ/100) { /* 20ms */ printk("%s: timeout waiting for Tx RDC.\n", dev->name); apne_reset_8390(dev); NS8390_init(dev,1); diff --git a/drivers/net/appletalk/Kconfig b/drivers/net/appletalk/Kconfig index 0a0e0cd81..b14e89004 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 - tristate "Appletalk interfaces support" + bool "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 ae7f82834..9edaa1832 100644 --- a/drivers/net/appletalk/cops.c +++ b/drivers/net/appletalk/cops.c @@ -48,6 +48,7 @@ static const char *version = * the driver figure it out. */ +#include #include #include #include @@ -1030,7 +1031,7 @@ module_param(io, int, 0); module_param(irq, int, 0); module_param(board_type, int, 0); -int __init init_module(void) +int 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 b02005087..31cf8c9c9 100644 --- a/drivers/net/appletalk/cops_ffdrv.h +++ b/drivers/net/appletalk/cops_ffdrv.h @@ -24,6 +24,7 @@ * - Jay Schulist */ +#include #ifdef CONFIG_COPS_DAYNA diff --git a/drivers/net/appletalk/cops_ltdrv.h b/drivers/net/appletalk/cops_ltdrv.h index c699b1ad3..4afb8e18b 100644 --- a/drivers/net/appletalk/cops_ltdrv.h +++ b/drivers/net/appletalk/cops_ltdrv.h @@ -23,6 +23,7 @@ * - Jay Schulist */ +#include #ifdef CONFIG_COPS_TANGENT diff --git a/drivers/net/appletalk/ipddp.c b/drivers/net/appletalk/ipddp.c index 7f7dd4502..1a44a79ed 100644 --- a/drivers/net/appletalk/ipddp.c +++ b/drivers/net/appletalk/ipddp.c @@ -23,6 +23,7 @@ * of the GNU General Public License, incorporated herein by reference. */ +#include #include #include #include diff --git a/drivers/net/arcnet/Kconfig b/drivers/net/arcnet/Kconfig index 7284ccad0..948de2532 100644 --- a/drivers/net/arcnet/Kconfig +++ b/drivers/net/arcnet/Kconfig @@ -68,10 +68,10 @@ config ARCNET_CAP packet is stuffed with an extra 4 byte "cookie" which doesn't actually appear on the network. After transmit the driver will send back a packet with protocol byte 0 containing the status of the - transmission: + transmition: 0=no hardware acknowledge 1=excessive nak - 2=transmission accepted by the receiver hardware + 2=transmition accepted by the reciever hardware Received packets are also stuffed with the extra 4 bytes but it will be random data. diff --git a/drivers/net/arcnet/arc-rawmode.c b/drivers/net/arcnet/arc-rawmode.c index e7555d4e6..e1ea29b0c 100644 --- a/drivers/net/arcnet/arc-rawmode.c +++ b/drivers/net/arcnet/arc-rawmode.c @@ -42,7 +42,7 @@ static int build_header(struct sk_buff *skb, struct net_device *dev, static int prepare_tx(struct net_device *dev, struct archdr *pkt, int length, int bufnum); -static struct ArcProto rawmode_proto = +struct ArcProto rawmode_proto = { .suffix = 'r', .mtu = XMTU, diff --git a/drivers/net/arcnet/arc-rimi.c b/drivers/net/arcnet/arc-rimi.c index 8c8d6c453..38c3f033f 100644 --- a/drivers/net/arcnet/arc-rimi.c +++ b/drivers/net/arcnet/arc-rimi.c @@ -97,44 +97,25 @@ static int __init arcrimi_probe(struct net_device *dev) "must specify the shmem and irq!\n"); return -ENODEV; } - if (dev->dev_addr[0] == 0) { - BUGMSG(D_NORMAL, "You need to specify your card's station " - "ID!\n"); - return -ENODEV; - } /* - * Grab the memory region at mem_start for MIRROR_SIZE bytes. + * Grab the memory region at mem_start for BUFFER_SIZE bytes. * Later in arcrimi_found() the real size will be determined * and this reserve will be released and the correct size * will be taken. */ - if (!request_mem_region(dev->mem_start, MIRROR_SIZE, "arcnet (90xx)")) { + if (!request_mem_region(dev->mem_start, BUFFER_SIZE, "arcnet (90xx)")) { BUGMSG(D_NORMAL, "Card memory already allocated\n"); return -ENODEV; } + if (dev->dev_addr[0] == 0) { + release_mem_region(dev->mem_start, BUFFER_SIZE); + BUGMSG(D_NORMAL, "You need to specify your card's station " + "ID!\n"); + return -ENODEV; + } return arcrimi_found(dev); } -static int check_mirror(unsigned long addr, size_t size) -{ - void __iomem *p; - int res = -1; - - if (!request_mem_region(addr, size, "arcnet (90xx)")) - return -1; - - p = ioremap(addr, size); - if (p) { - if (readb(p) == TESTvalue) - res = 1; - else - res = 0; - iounmap(p); - } - - release_mem_region(addr, size); - return res; -} /* * Set up the struct net_device associated with this card. Called after @@ -144,28 +125,19 @@ static int __init arcrimi_found(struct net_device *dev) { struct arcnet_local *lp; unsigned long first_mirror, last_mirror, shmem; - void __iomem *p; int mirror_size; int err; - p = ioremap(dev->mem_start, MIRROR_SIZE); - if (!p) { - release_mem_region(dev->mem_start, MIRROR_SIZE); - BUGMSG(D_NORMAL, "Can't ioremap\n"); - return -ENODEV; - } - /* reserve the irq */ if (request_irq(dev->irq, &arcnet_interrupt, 0, "arcnet (RIM I)", dev)) { - iounmap(p); - release_mem_region(dev->mem_start, MIRROR_SIZE); + release_mem_region(dev->mem_start, BUFFER_SIZE); BUGMSG(D_NORMAL, "Can't get IRQ %d!\n", dev->irq); return -ENODEV; } shmem = dev->mem_start; - writeb(TESTvalue, p); - writeb(dev->dev_addr[0], p + 1); /* actually the node ID */ + isa_writeb(TESTvalue, shmem); + isa_writeb(dev->dev_addr[0], shmem + 1); /* actually the node ID */ /* find the real shared memory start/end points, including mirrors */ @@ -174,18 +146,17 @@ static int __init arcrimi_found(struct net_device *dev) * 2k (or there are no mirrors at all) but on some, it's 4k. */ mirror_size = MIRROR_SIZE; - if (readb(p) == TESTvalue - && check_mirror(shmem - MIRROR_SIZE, MIRROR_SIZE) == 0 - && check_mirror(shmem - 2 * MIRROR_SIZE, MIRROR_SIZE) == 1) - mirror_size = 2 * MIRROR_SIZE; + if (isa_readb(shmem) == TESTvalue + && isa_readb(shmem - mirror_size) != TESTvalue + && isa_readb(shmem - 2 * mirror_size) == TESTvalue) + mirror_size *= 2; - first_mirror = shmem - mirror_size; - while (check_mirror(first_mirror, mirror_size) == 1) + first_mirror = last_mirror = shmem; + while (isa_readb(first_mirror) == TESTvalue) first_mirror -= mirror_size; first_mirror += mirror_size; - last_mirror = shmem + mirror_size; - while (check_mirror(last_mirror, mirror_size) == 1) + while (isa_readb(last_mirror) == TESTvalue) last_mirror += mirror_size; last_mirror -= mirror_size; @@ -210,8 +181,7 @@ static int __init arcrimi_found(struct net_device *dev) * with the correct size. There is a VERY slim chance this could * fail. */ - iounmap(p); - release_mem_region(shmem, MIRROR_SIZE); + release_mem_region(shmem, BUFFER_SIZE); if (!request_mem_region(dev->mem_start, dev->mem_end - dev->mem_start + 1, "arcnet (90xx)")) { diff --git a/drivers/net/arcnet/arcnet.c b/drivers/net/arcnet/arcnet.c index 5a9500525..12ef52c19 100644 --- a/drivers/net/arcnet/arcnet.c +++ b/drivers/net/arcnet/arcnet.c @@ -44,6 +44,7 @@ #define VERSION "arcnet: v3.93 BETA 2000/04/29 - by Avery Pennarun et al.\n" #include +#include #include #include #include @@ -51,7 +52,6 @@ #include #include #include -#include /* "do nothing" functions for protocol drivers */ static void null_rx(struct net_device *dev, int bufnum, @@ -61,7 +61,6 @@ static int null_build_header(struct sk_buff *skb, struct net_device *dev, static int null_prepare_tx(struct net_device *dev, struct archdr *pkt, int length, int bufnum); -static void arcnet_rx(struct net_device *dev, int bufnum); /* * one ArcProto per possible proto ID. None of the elements of @@ -72,7 +71,7 @@ static void arcnet_rx(struct net_device *dev, int bufnum); struct ArcProto *arc_proto_map[256], *arc_proto_default, *arc_bcast_proto, *arc_raw_proto; -static struct ArcProto arc_proto_null = +struct ArcProto arc_proto_null = { .suffix = '?', .mtu = XMTU, @@ -91,6 +90,7 @@ EXPORT_SYMBOL(arc_proto_map); EXPORT_SYMBOL(arc_proto_default); EXPORT_SYMBOL(arc_bcast_proto); EXPORT_SYMBOL(arc_raw_proto); +EXPORT_SYMBOL(arc_proto_null); EXPORT_SYMBOL(arcnet_unregister_proto); EXPORT_SYMBOL(arcnet_debug); EXPORT_SYMBOL(alloc_arcdev); @@ -118,7 +118,7 @@ static int __init arcnet_init(void) arcnet_debug = debug; - printk("arcnet loaded.\n"); + printk(VERSION); #ifdef ALPHA_WARNING BUGLVL(D_EXTRA) { @@ -178,8 +178,8 @@ EXPORT_SYMBOL(arcnet_dump_skb); * Dump the contents of an ARCnet buffer */ #if (ARCNET_DEBUG_MAX & (D_RX | D_TX)) -static void arcnet_dump_packet(struct net_device *dev, int bufnum, - char *desc, int take_arcnet_lock) +void arcnet_dump_packet(struct net_device *dev, int bufnum, char *desc, + int take_arcnet_lock) { struct arcnet_local *lp = dev->priv; int i, length; @@ -208,10 +208,7 @@ static void arcnet_dump_packet(struct net_device *dev, int bufnum, } -#else - -#define arcnet_dump_packet(dev, bufnum, desc,take_arcnet_lock) do { } while (0) - +EXPORT_SYMBOL(arcnet_dump_packet); #endif @@ -736,7 +733,7 @@ static void arcnet_timeout(struct net_device *dev) spin_unlock_irqrestore(&lp->lock, flags); - if (time_after(jiffies, lp->last_timeout + 10*HZ)) { + if (jiffies - lp->last_timeout > 10*HZ) { BUGMSG(D_EXTRA, "tx timed out%s (status=%Xh, intmask=%Xh, dest=%02Xh)\n", msg, status, lp->intmask, lp->lasttrans_dest); lp->last_timeout = jiffies; @@ -764,7 +761,8 @@ irqreturn_t arcnet_interrupt(int irq, void *dev_id, struct pt_regs *regs) BUGMSG(D_DURING, "in arcnet_interrupt\n"); lp = dev->priv; - BUG_ON(!lp); + if (!lp) + BUG(); spin_lock(&lp->lock); @@ -998,7 +996,7 @@ irqreturn_t arcnet_interrupt(int irq, void *dev_id, struct pt_regs *regs) * This is a generic packet receiver that calls arcnet??_rx depending on the * protocol ID found. */ -static void arcnet_rx(struct net_device *dev, int bufnum) +void arcnet_rx(struct net_device *dev, int bufnum) { struct arcnet_local *lp = dev->priv; struct archdr pkt; diff --git a/drivers/net/arcnet/com20020-pci.c b/drivers/net/arcnet/com20020-pci.c index 979a33df0..96636ca87 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, IRQF_SHARED)) != 0) + if ((err = com20020_found(dev, SA_SHIRQ)) != 0) goto out_port; return 0; diff --git a/drivers/net/arcnet/com90xx.c b/drivers/net/arcnet/com90xx.c index 0d45553ff..6c2c9b9ac 100644 --- a/drivers/net/arcnet/com90xx.c +++ b/drivers/net/arcnet/com90xx.c @@ -53,7 +53,7 @@ /* Internal function declarations */ -static int com90xx_found(int ioaddr, int airq, u_long shmem, void __iomem *); +static int com90xx_found(int ioaddr, int airq, u_long shmem); static void com90xx_command(struct net_device *dev, int command); static int com90xx_status(struct net_device *dev); static void com90xx_setmask(struct net_device *dev, int mask); @@ -116,26 +116,14 @@ static void __init com90xx_probe(void) unsigned long airqmask; int ports[(0x3f0 - 0x200) / 16 + 1] = {0}; - unsigned long *shmems; - void __iomem **iomem; + u_long shmems[(0xFF800 - 0xA0000) / 2048 + 1] = + {0}; int numports, numshmems, *port; u_long *p; - int index; if (!io && !irq && !shmem && !*device && com90xx_skip_probe) return; - shmems = kzalloc(((0x100000-0xa0000) / 0x800) * sizeof(unsigned long), - GFP_KERNEL); - if (!shmems) - return; - iomem = kzalloc(((0x100000-0xa0000) / 0x800) * sizeof(void __iomem *), - GFP_KERNEL); - if (!iomem) { - kfree(shmems); - return; - } - BUGLVL(D_NORMAL) printk(VERSION); /* set up the arrays where we'll store the possible probe addresses */ @@ -191,8 +179,6 @@ static void __init com90xx_probe(void) if (!numports) { BUGMSG2(D_NORMAL, "S1: No ARCnet cards found.\n"); - kfree(shmems); - kfree(iomem); return; } /* Stage 2: we have now reset any possible ARCnet cards, so we can't @@ -216,8 +202,8 @@ static void __init com90xx_probe(void) * 0xD1 byte in the right place, or are read-only. */ numprint = -1; - for (index = 0, p = &shmems[0]; index < numshmems; p++, index++) { - void __iomem *base; + for (p = &shmems[0]; p < shmems + numshmems; p++) { + u_long ptr = *p; numprint++; numprint %= 8; @@ -227,49 +213,38 @@ static void __init com90xx_probe(void) } BUGMSG2(D_INIT, "%lXh ", *p); - if (!request_mem_region(*p, MIRROR_SIZE, "arcnet (90xx)")) { + if (!request_mem_region(*p, BUFFER_SIZE, "arcnet (90xx)")) { BUGMSG2(D_INIT_REASONS, "(request_mem_region)\n"); BUGMSG2(D_INIT_REASONS, "Stage 3: "); BUGLVL(D_INIT_REASONS) numprint = 0; - goto out; - } - base = ioremap(*p, MIRROR_SIZE); - if (!base) { - BUGMSG2(D_INIT_REASONS, "(ioremap)\n"); - BUGMSG2(D_INIT_REASONS, "Stage 3: "); - BUGLVL(D_INIT_REASONS) numprint = 0; - goto out1; + *p-- = shmems[--numshmems]; + continue; } - if (readb(base) != TESTvalue) { + if (isa_readb(ptr) != TESTvalue) { BUGMSG2(D_INIT_REASONS, "(%02Xh != %02Xh)\n", - readb(base), TESTvalue); + isa_readb(ptr), TESTvalue); BUGMSG2(D_INIT_REASONS, "S3: "); BUGLVL(D_INIT_REASONS) numprint = 0; - goto out2; + release_mem_region(*p, BUFFER_SIZE); + *p-- = shmems[--numshmems]; + continue; } /* By writing 0x42 to the TESTvalue location, we also make * sure no "mirror" shmem areas show up - if they occur * in another pass through this loop, they will be discarded * because *cptr != TESTvalue. */ - writeb(0x42, base); - if (readb(base) != 0x42) { + isa_writeb(0x42, ptr); + if (isa_readb(ptr) != 0x42) { BUGMSG2(D_INIT_REASONS, "(read only)\n"); BUGMSG2(D_INIT_REASONS, "S3: "); - goto out2; + release_mem_region(*p, BUFFER_SIZE); + *p-- = shmems[--numshmems]; + continue; } BUGMSG2(D_INIT_REASONS, "\n"); BUGMSG2(D_INIT_REASONS, "S3: "); BUGLVL(D_INIT_REASONS) numprint = 0; - iomem[index] = base; - continue; - out2: - iounmap(base); - out1: - release_mem_region(*p, MIRROR_SIZE); - out: - *p-- = shmems[--numshmems]; - index--; } BUGMSG2(D_INIT, "\n"); @@ -277,8 +252,6 @@ static void __init com90xx_probe(void) BUGMSG2(D_NORMAL, "S3: No ARCnet cards found.\n"); for (port = &ports[0]; port < ports + numports; port++) release_region(*port, ARCNET_TOTAL_SIZE); - kfree(shmems); - kfree(iomem); return; } /* Stage 4: something of a dummy, to report the shmems that are @@ -378,32 +351,30 @@ static void __init com90xx_probe(void) mdelay(RESETtime); } else { /* just one shmem and port, assume they match */ - writeb(TESTvalue, iomem[0]); + isa_writeb(TESTvalue, shmems[0]); } #else inb(_RESET); mdelay(RESETtime); #endif - for (index = 0; index < numshmems; index++) { - u_long ptr = shmems[index]; - void __iomem *base = iomem[index]; + for (p = &shmems[0]; p < shmems + numshmems; p++) { + u_long ptr = *p; - if (readb(base) == TESTvalue) { /* found one */ + if (isa_readb(ptr) == TESTvalue) { /* found one */ BUGMSG2(D_INIT, "%lXh)\n", *p); openparen = 0; /* register the card */ - if (com90xx_found(*port, airq, ptr, base) == 0) + if (com90xx_found(*port, airq, *p) == 0) found = 1; numprint = -1; /* remove shmem from the list */ - shmems[index] = shmems[--numshmems]; - iomem[index] = iomem[numshmems]; + *p = shmems[--numshmems]; break; /* go to the next I/O port */ } else { - BUGMSG2(D_INIT_REASONS, "%Xh-", readb(base)); + BUGMSG2(D_INIT_REASONS, "%Xh-", isa_readb(ptr)); } } @@ -420,40 +391,17 @@ static void __init com90xx_probe(void) BUGLVL(D_INIT_REASONS) printk("\n"); /* Now put back TESTvalue on all leftover shmems. */ - for (index = 0; index < numshmems; index++) { - writeb(TESTvalue, iomem[index]); - iounmap(iomem[index]); - release_mem_region(shmems[index], MIRROR_SIZE); + for (p = &shmems[0]; p < shmems + numshmems; p++) { + isa_writeb(TESTvalue, *p); + release_mem_region(*p, BUFFER_SIZE); } - kfree(shmems); - kfree(iomem); } -static int check_mirror(unsigned long addr, size_t size) -{ - void __iomem *p; - int res = -1; - - if (!request_mem_region(addr, size, "arcnet (90xx)")) - return -1; - - p = ioremap(addr, size); - if (p) { - if (readb(p) == TESTvalue) - res = 1; - else - res = 0; - iounmap(p); - } - - release_mem_region(addr, size); - return res; -} /* Set up the struct net_device associated with this card. Called after * probing succeeds. */ -static int __init com90xx_found(int ioaddr, int airq, u_long shmem, void __iomem *p) +static int __init com90xx_found(int ioaddr, int airq, u_long shmem) { struct net_device *dev = NULL; struct arcnet_local *lp; @@ -464,8 +412,7 @@ static int __init com90xx_found(int ioaddr, int airq, u_long shmem, void __iomem dev = alloc_arcdev(device); if (!dev) { BUGMSG2(D_NORMAL, "com90xx: Can't allocate device!\n"); - iounmap(p); - release_mem_region(shmem, MIRROR_SIZE); + release_mem_region(shmem, BUFFER_SIZE); return -ENOMEM; } lp = dev->priv; @@ -476,27 +423,24 @@ static int __init com90xx_found(int ioaddr, int airq, u_long shmem, void __iomem * 2k (or there are no mirrors at all) but on some, it's 4k. */ mirror_size = MIRROR_SIZE; - if (readb(p) == TESTvalue && - check_mirror(shmem - MIRROR_SIZE, MIRROR_SIZE) == 0 && - check_mirror(shmem - 2 * MIRROR_SIZE, MIRROR_SIZE) == 1) - mirror_size = 2 * MIRROR_SIZE; + if (isa_readb(shmem) == TESTvalue + && isa_readb(shmem - mirror_size) != TESTvalue + && isa_readb(shmem - 2 * mirror_size) == TESTvalue) + mirror_size *= 2; - first_mirror = shmem - mirror_size; - while (check_mirror(first_mirror, mirror_size) == 1) + first_mirror = last_mirror = shmem; + while (isa_readb(first_mirror) == TESTvalue) first_mirror -= mirror_size; first_mirror += mirror_size; - last_mirror = shmem + mirror_size; - while (check_mirror(last_mirror, mirror_size) == 1) + while (isa_readb(last_mirror) == TESTvalue) last_mirror += mirror_size; last_mirror -= mirror_size; dev->mem_start = first_mirror; dev->mem_end = last_mirror + MIRROR_SIZE - 1; - iounmap(p); - release_mem_region(shmem, MIRROR_SIZE); - + release_mem_region(shmem, BUFFER_SIZE); if (!request_mem_region(dev->mem_start, dev->mem_end - dev->mem_start + 1, "arcnet (90xx)")) goto err_free_dev; diff --git a/drivers/net/arcnet/rfc1051.c b/drivers/net/arcnet/rfc1051.c index 6d6c69f03..6d7913704 100644 --- a/drivers/net/arcnet/rfc1051.c +++ b/drivers/net/arcnet/rfc1051.c @@ -43,7 +43,7 @@ static int prepare_tx(struct net_device *dev, struct archdr *pkt, int length, int bufnum); -static struct ArcProto rfc1051_proto = +struct ArcProto rfc1051_proto = { .suffix = 's', .mtu = XMTU - RFC1051_HDR_SIZE, diff --git a/drivers/net/arcnet/rfc1201.c b/drivers/net/arcnet/rfc1201.c index bee34226a..6b6ae4bf3 100644 --- a/drivers/net/arcnet/rfc1201.c +++ b/drivers/net/arcnet/rfc1201.c @@ -43,7 +43,7 @@ static int prepare_tx(struct net_device *dev, struct archdr *pkt, int length, int bufnum); static int continue_tx(struct net_device *dev, int bufnum); -static struct ArcProto rfc1201_proto = +struct ArcProto rfc1201_proto = { .suffix = 'a', .mtu = 1500, /* could be more, but some receivers can't handle it... */ diff --git a/drivers/net/ariadne.c b/drivers/net/ariadne.c index cc721addd..9fe93acfc 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, IRQF_SHARED, + i = request_irq(IRQ_AMIGA_PORTS, ariadne_interrupt, SA_SHIRQ, dev->name, dev); if (i) return i; @@ -607,7 +607,8 @@ 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) { - if (skb_padto(skb, ETH_ZLEN)) + skb = skb_padto(skb, ETH_ZLEN); + if (skb == NULL) return 0; len = ETH_ZLEN; } @@ -863,7 +864,7 @@ static void __devexit ariadne_remove_one(struct zorro_dev *z) static int __init ariadne_init_module(void) { - return zorro_register_driver(&ariadne_driver); + return zorro_module_init(&ariadne_driver); } static void __exit ariadne_cleanup_module(void) diff --git a/drivers/net/arm/Kconfig b/drivers/net/arm/Kconfig index 77fe20dbe..625184b65 100644 --- a/drivers/net/arm/Kconfig +++ b/drivers/net/arm/Kconfig @@ -31,11 +31,3 @@ config ARM_ETHERH help If you have an Acorn system with one of these network cards, you should say Y to this option if you wish to use it with Linux. - -config ARM_AT91_ETHER - tristate "AT91RM9200 Ethernet support" - depends on NET_ETHERNET && ARM && ARCH_AT91RM9200 - select MII - help - If you wish to compile a kernel for the AT91RM9200 and enable - ethernet support, then you should always answer Y to this. diff --git a/drivers/net/arm/Makefile b/drivers/net/arm/Makefile index 42c95b79c..bc263edf0 100644 --- a/drivers/net/arm/Makefile +++ b/drivers/net/arm/Makefile @@ -7,4 +7,3 @@ obj-$(CONFIG_ARM_AM79C961A) += am79c961a.o obj-$(CONFIG_ARM_ETHERH) += etherh.o obj-$(CONFIG_ARM_ETHER3) += ether3.o obj-$(CONFIG_ARM_ETHER1) += ether1.o -obj-$(CONFIG_ARM_AT91_ETHER) += at91_ether.o diff --git a/drivers/net/arm/am79c961a.c b/drivers/net/arm/am79c961a.c index 09d5c3f26..53e3afc1b 100644 --- a/drivers/net/arm/am79c961a.c +++ b/drivers/net/arm/am79c961a.c @@ -696,9 +696,7 @@ static int __init am79c961_probe(struct platform_device *pdev) dev->base_addr = res->start; dev->irq = platform_get_irq(pdev, 0); - ret = -ENODEV; - if (dev->irq < 0) - goto nodev; + ret = -ENODEV; if (!request_region(dev->base_addr, 0x18, dev->name)) goto nodev; diff --git a/drivers/net/arm/ether1.c b/drivers/net/arm/ether1.c index 312955d07..36475eb27 100644 --- a/drivers/net/arm/ether1.c +++ b/drivers/net/arm/ether1.c @@ -700,7 +700,8 @@ ether1_sendpacket (struct sk_buff *skb, struct net_device *dev) } if (skb->len < ETH_ZLEN) { - if (skb_padto(skb, ETH_ZLEN)) + skb = skb_padto(skb, ETH_ZLEN); + if (skb == NULL) goto out; } diff --git a/drivers/net/arm/ether3.c b/drivers/net/arm/ether3.c index 081074180..f1d5b1027 100644 --- a/drivers/net/arm/ether3.c +++ b/drivers/net/arm/ether3.c @@ -518,7 +518,8 @@ ether3_sendpacket(struct sk_buff *skb, struct net_device *dev) length = (length + 1) & ~1; if (length != skb->len) { - if (skb_padto(skb, length)) + skb = skb_padto(skb, length); + if (skb == NULL) goto out; } diff --git a/drivers/net/arm/etherh.c b/drivers/net/arm/etherh.c index d52deb8d2..6a93b666e 100644 --- a/drivers/net/arm/etherh.c +++ b/drivers/net/arm/etherh.c @@ -46,7 +46,6 @@ #include #include #include -#include #include #include @@ -356,7 +355,7 @@ etherh_block_output (struct net_device *dev, int count, const unsigned char *buf dma_start = jiffies; while ((readb (addr + EN0_ISR) & ENISR_RDC) == 0) - if (time_after(jiffies, dma_start + 2*HZ/100)) { /* 20ms */ + if (jiffies - dma_start > 2*HZ/100) { /* 20ms */ printk(KERN_ERR "%s: timeout waiting for TX RDC\n", dev->name); etherh_reset (dev); diff --git a/drivers/net/at1700.c b/drivers/net/at1700.c index 4ca061c2d..e613cc289 100644 --- a/drivers/net/at1700.c +++ b/drivers/net/at1700.c @@ -35,6 +35,7 @@ response to inb()s from other device probes! */ +#include #include #include #include @@ -901,7 +902,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 init_module(void) +int init_module(void) { if (io == 0) printk("at1700: You should not use auto-probing with insmod!\n"); diff --git a/drivers/net/atari_bionet.c b/drivers/net/atari_bionet.c index 5e5f80b99..0095384ff 100644 --- a/drivers/net/atari_bionet.c +++ b/drivers/net/atari_bionet.c @@ -123,7 +123,7 @@ static char version[] = * Global variable 'bionet_debug'. Can be set at load time by 'insmod' */ unsigned int bionet_debug = NET_DEBUG; -module_param(bionet_debug, int, 0); +MODULE_PARM(bionet_debug, "i"); MODULE_PARM_DESC(bionet_debug, "bionet debug level (0-2)"); MODULE_LICENSE("GPL"); diff --git a/drivers/net/atari_pamsnet.c b/drivers/net/atari_pamsnet.c index d6039e62d..8b997809f 100644 --- a/drivers/net/atari_pamsnet.c +++ b/drivers/net/atari_pamsnet.c @@ -119,7 +119,7 @@ static char *version = * Global variable 'pamsnet_debug'. Can be set at load time by 'insmod' */ unsigned int pamsnet_debug = NET_DEBUG; -module_param(pamsnet_debug, int, 0); +MODULE_PARM(pamsnet_debug, "i"); MODULE_PARM_DESC(pamsnet_debug, "pamsnet debug enable (0-1)"); MODULE_LICENSE("GPL"); diff --git a/drivers/net/atarilance.c b/drivers/net/atarilance.c index 91783a800..e01b6a78e 100644 --- a/drivers/net/atarilance.c +++ b/drivers/net/atarilance.c @@ -78,7 +78,7 @@ static int lance_debug = LANCE_DEBUG; #else static int lance_debug = 1; #endif -module_param(lance_debug, int, 0); +MODULE_PARM(lance_debug, "i"); MODULE_PARM_DESC(lance_debug, "atarilance debug level (0-3)"); MODULE_LICENSE("GPL"); @@ -804,7 +804,8 @@ static int lance_start_xmit( struct sk_buff *skb, struct net_device *dev ) ++len; if (len > skb->len) { - if (skb_padto(skb, len)) + skb = skb_padto(skb, len); + if (skb == NULL) return 0; } diff --git a/drivers/net/au1000_eth.c b/drivers/net/au1000_eth.c index 55f6e3f65..cd0b1dccf 100644 --- a/drivers/net/au1000_eth.c +++ b/drivers/net/au1000_eth.c @@ -2,16 +2,13 @@ * * Alchemy Au1x00 ethernet driver * - * Copyright 2001-2003, 2006 MontaVista Software Inc. + * Copyright 2001,2002,2003 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 * @@ -35,6 +32,7 @@ * */ +#include #include #include #include @@ -54,8 +52,6 @@ #include #include #include -#include -#include #include #include #include @@ -71,7 +67,7 @@ static int au1000_debug = 5; static int au1000_debug = 3; #endif -#define DRV_NAME "au1000_eth" +#define DRV_NAME "au1000eth" #define DRV_VERSION "1.5" #define DRV_AUTHOR "Pete Popov " #define DRV_DESC "Au1xxx on-chip Ethernet driver" @@ -83,7 +79,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(int port_num); +static struct net_device * au1000_probe(u32 ioaddr, int irq, int port_num); static int au1000_init(struct net_device *); static int au1000_open(struct net_device *); static int au1000_close(struct net_device *); @@ -91,15 +87,19 @@ 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 inline void update_tx_stats(struct net_device *, u32, u32); +static inline void update_rx_stats(struct net_device *, u32); +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 au1000_adjust_link(struct net_device *); -static void enable_mac(struct net_device *, int); +static void dump_mii(struct net_device *dev, int phy_id); // 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); @@ -127,83 +127,705 @@ 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]; -/* - * 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. +/* FIXME + * All of the PHY code really should be detached from the MAC + * code. */ -/* autodetection defaults */ -#undef AU1XXX_PHY_SEARCH_HIGHEST_ADDR -#define AU1XXX_PHY1_SEARCH_ON_MAC0 +/* Default advertise */ +#define GENMII_DEFAULT_ADVERTISE \ + ADVERTISED_10baseT_Half | ADVERTISED_10baseT_Full | \ + ADVERTISED_100baseT_Half | ADVERTISED_100baseT_Full | \ + ADVERTISED_Autoneg -/* 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 - */ +#define GENMII_DEFAULT_FEATURES \ + SUPPORTED_10baseT_Half | SUPPORTED_10baseT_Full | \ + SUPPORTED_100baseT_Half | SUPPORTED_100baseT_Full | \ + SUPPORTED_Autoneg -#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 +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); -# define AU1XXX_PHY0_ADDR 5 -# define AU1XXX_PHY0_BUSID 0 -# undef AU1XXX_PHY0_IRQ + if (au1000_debug > 4) + dump_mii(dev, phy_addr); + return 0; +} -# undef AU1XXX_PHY1_ADDR -# undef AU1XXX_PHY1_BUSID -# undef AU1XXX_PHY1_IRQ +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 defined(AU1XXX_PHY0_BUSID) && (AU1XXX_PHY0_BUSID > 0) -# error MAC0-associated PHY attached 2nd MACs MII bus not supported yet + 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; +} + +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 -/* - * MII operations - */ -static int mdio_read(struct net_device *dev, int phy_addr, int reg) +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, +}; + +struct phy_ops ks8995m_ops = { + ks8995m_init, + ks8995m_reset, + ks8995m_status, +}; + +struct phy_ops smsc_83C185_ops = { + smsc_83C185_init, + smsc_83C185_reset, + smsc_83C185_status, +}; + +#ifdef CONFIG_MIPS_BOSPORUS +struct phy_ops stub_ops = { + stub_init, + stub_reset, + stub_status, +}; +#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 }, +#endif + {0,}, +}; + +static int mdio_read(struct net_device *dev, int phy_id, int reg) { struct au1000_private *aup = (struct au1000_private *) dev->priv; - volatile u32 *const mii_control_reg = &aup->mac->mii_control; - volatile u32 *const mii_data_reg = &aup->mac->mii_data; + volatile u32 *mii_control_reg; + volatile u32 *mii_data_reg; 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) { @@ -214,7 +836,7 @@ static int mdio_read(struct net_device *dev, int phy_addr, int reg) } mii_control = MAC_SET_MII_SELECT_REG(reg) | - MAC_SET_MII_SELECT_PHY(phy_addr) | MAC_MII_READ; + MAC_SET_MII_SELECT_PHY(phy_id) | MAC_MII_READ; *mii_control_reg = mii_control; @@ -230,14 +852,32 @@ static int mdio_read(struct net_device *dev, int phy_addr, int reg) return (int)*mii_data_reg; } -static void mdio_write(struct net_device *dev, int phy_addr, int reg, u16 value) +static void mdio_write(struct net_device *dev, int phy_id, int reg, u16 value) { struct au1000_private *aup = (struct au1000_private *) dev->priv; - volatile u32 *const mii_control_reg = &aup->mac->mii_control; - volatile u32 *const mii_data_reg = &aup->mac->mii_data; + volatile u32 *mii_control_reg; + volatile u32 *mii_data_reg; 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) { @@ -248,145 +888,165 @@ static void mdio_write(struct net_device *dev, int phy_addr, int reg, u16 value) } mii_control = MAC_SET_MII_SELECT_REG(reg) | - MAC_SET_MII_SELECT_PHY(phy_addr) | MAC_MII_WRITE; + MAC_SET_MII_SELECT_PHY(phy_id) | 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 int mdiobus_write(struct mii_bus *bus, int phy_addr, int regnum, - u16 value) -{ - struct net_device *const dev = bus->priv; - - 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 mdiobus_reset(struct mii_bus *bus) +static void dump_mii(struct net_device *dev, int phy_id) { - struct net_device *const dev = bus->priv; + int i, val; - enable_mac(dev, 0); /* make sure the MAC associated with this - * mii_bus is enabled */ - return 0; + 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); + } } -static int mii_probe (struct net_device *dev) +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) */ + struct au1000_private *aup = (struct au1000_private *) dev->priv; int phy_addr; +#ifdef CONFIG_MIPS_BOSPORUS + int phy_found=0; +#endif - /* 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 - } - -# 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 */ + /* 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; - phydev = tmp_phydev; - break; /* found it */ + #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; + } } } -# endif /* defined(AU1XXX_PHY1_SEARCH_OTHER_BUS) */ +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; -#endif /* defined(AU1XXX_PHY_STATIC_CONFIG) */ - if (!phydev) { - printk (KERN_ERR DRV_NAME ":%s: no PHY found\n", dev->name); - return -1; + 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; + } + } } - - /* 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); + if (aup->mac_id == 0) { + /* the Bosporus phy responds to addresses 0-5 but + * 5 is the correct one. + */ + aup->phy_addr = 5; } +#endif - /* 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; + if (aup->mii->chip_info == NULL) { + printk(KERN_ERR "%s: Au1x No known MII transceivers found!\n", + dev->name); + return -1; + } - 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); + printk(KERN_INFO "%s: Using %s as default\n", + dev->name, aup->mii->chip_info->name); return 0; } @@ -438,38 +1098,35 @@ static void hard_stop(struct net_device *dev) au_sync_delay(10); } -static void enable_mac(struct net_device *dev, int force_reset) + +static void reset_mac(struct net_device *dev) { - unsigned long flags; + int i; + u32 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); + } - if(force_reset || (!aup->mac_enabled)) { + 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 */ *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); + *aup->enable = 0; au_sync_delay(2); - - aup->mac_enabled = 1; + #ifdef CONFIG_BCM5222_DUAL_PHY } - - 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); - + #endif aup->tx_full = 0; for (i = 0; i < NUM_RX_DMA; i++) { /* reset control bits */ @@ -479,27 +1136,10 @@ static void reset_mac_unlocked(struct net_device *dev) /* reset control bits */ aup->tx_dma_ring[i]->buff_stat &= ~0xf; } - - 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 * of the rx and tx MAC DMA registers so they are fixed by the hardware -- @@ -521,27 +1161,12 @@ 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] = { -#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 -}; +} iflist[2]; static int num_ifs; @@ -552,14 +1177,58 @@ 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; - num_ifs = NUM_ETH_INTERFACES - ni; - + 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; + } for(i = 0; i < num_ifs; i++) { - dev = au1000_probe(i); + dev = au1000_probe(iflist[i].base_addr, iflist[i].irq, i); iflist[i].dev = dev; if (dev) found_one++; @@ -569,31 +1238,178 @@ static int __init au1000_init_module(void) return 0; } -/* - * ethtool operations - */ +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); -static int au1000_get_settings(struct net_device *dev, struct ethtool_cmd *cmd) + return 0; +} + +static int au1000_setup_forced(struct net_device *dev, int speed, int fd) { 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); - if (aup->phy_dev) - return phy_ethtool_gset(aup->phy_dev, cmd); + /* 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 -EINVAL; + return 0; } -static int au1000_set_settings(struct net_device *dev, struct ethtool_cmd *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); +} + +static int au1000_get_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; +} - if (!capable(CAP_NET_ADMIN)) - return -EPERM; +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 (aup->phy_dev) - return phy_ethtool_sset(aup->phy_dev, cmd); +static int au1000_nway_reset(struct net_device *dev) +{ + struct au1000_private *aup = (struct au1000_private *)dev->priv; - return -EINVAL; + if (!aup->want_autoneg) + return -EINVAL; + spin_lock_irq(&aup->lock); + au1000_start_link(dev, NULL); + spin_unlock_irq(&aup->lock); + return 0; } static void @@ -608,14 +1424,21 @@ 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, - .get_link = ethtool_op_get_link, + .nway_reset = au1000_nway_reset, + .get_link = au1000_get_link }; -static struct net_device * au1000_probe(int port_num) +static struct net_device * +au1000_probe(u32 ioaddr, int irq, int port_num) { static unsigned version_printed = 0; struct au1000_private *aup = NULL; @@ -623,115 +1446,106 @@ static struct net_device * au1000_probe(int port_num) db_dest_t *pDB, *pDBfree; char *pmac, *argptr; char ethaddr[6]; - int irq, i, err; - u32 base, macen; - - if (port_num >= NUM_ETH_INTERFACES) - return NULL; - - base = CPHYSADDR(iflist[port_num].base_addr ); - macen = CPHYSADDR(iflist[port_num].macen_addr); - irq = iflist[port_num].irq; + int i, err; - if (!request_mem_region( base, MAC_IOSIZE, "Au1x00 ENET") || - !request_mem_region(macen, 4, "Au1x00 ENET")) + if (!request_mem_region(CPHYSADDR(ioaddr), MAC_IOSIZE, "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 "%s: alloc_etherdev failed\n", DRV_NAME); + printk (KERN_ERR "au1000 eth: alloc_etherdev failed\n"); return NULL; } - if ((err = register_netdev(dev)) != 0) { - printk(KERN_ERR "%s: Cannot register net device, error %d\n", - DRV_NAME, err); + if ((err = register_netdev(dev))) { + printk(KERN_ERR "Au1x_eth Cannot register net device err %d\n", + err); free_netdev(dev); return NULL; } - printk("%s: Au1xx0 Ethernet found at 0x%x, irq %d\n", - dev->name, base, irq); + printk("%s: Au1x Ethernet found at 0x%x, irq %d\n", + dev->name, ioaddr, 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( base, MAC_IOSIZE); - release_mem_region(macen, 4); + release_mem_region(CPHYSADDR(ioaddr), MAC_IOSIZE); return NULL; } /* aup->mac is the base address of the MAC's registers */ - aup->mac = (volatile mac_reg_t *)iflist[port_num].base_addr; - + aup->mac = (volatile mac_reg_t *)((unsigned long)ioaddr); /* Setup some variables for quick register address access */ - 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) + if (ioaddr == iflist[0].base_addr) + { + /* check env variables first */ + if (!get_ethernet_addr(ethaddr)) { 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); - } else if (port_num == 1) + 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; 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); + } - /* - * 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); + /* 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; if (mii_probe(dev) != 0) { goto err_out; @@ -768,7 +1582,7 @@ static struct net_device * au1000_probe(int port_num) } spin_lock_init(&aup->lock); - dev->base_addr = base; + dev->base_addr = ioaddr; dev->irq = irq; dev->open = au1000_open; dev->hard_start_xmit = au1000_tx; @@ -777,6 +1591,7 @@ static struct net_device * au1000_probe(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; @@ -792,7 +1607,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]); @@ -801,12 +1616,13 @@ 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( base, MAC_IOSIZE); - release_mem_region(macen, 4); + release_mem_region(CPHYSADDR(ioaddr), MAC_IOSIZE); return NULL; } @@ -825,15 +1641,20 @@ 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); - /* bring the device out of reset */ - enable_mac(dev, 1); - 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); + aup->mac->control = 0; aup->tx_head = (aup->tx_dma_ring[0]->buff_stat & 0xC) >> 2; aup->tx_tail = aup->tx_head; @@ -848,16 +1669,12 @@ static int au1000_init(struct net_device *dev) } au_sync(); - control = MAC_RX_ENABLE | MAC_TX_ENABLE; + aup->phy_ops->phy_status(dev, aup->phy_addr, &link, &speed); + control = MAC_DISABLE_RX_OWN | MAC_RX_ENABLE | MAC_TX_ENABLE; #ifndef CONFIG_CPU_LITTLE_ENDIAN control |= MAC_BIG_ENDIAN; #endif - 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 */ + if (link && (dev->if_port == IF_PORT_100BASEFX)) { control |= MAC_FULL_DUPLEX; } @@ -869,84 +1686,57 @@ static int au1000_init(struct net_device *dev) return 0; } -static void -au1000_adjust_link(struct net_device *dev) +static void au1000_timer(unsigned long data) { + struct net_device *dev = (struct net_device *)data; struct au1000_private *aup = (struct au1000_private *) dev->priv; - struct phy_device *phydev = aup->phy_dev; - unsigned long flags; - - int status_change = 0; - - BUG_ON(!aup->phy_dev); + unsigned char if_port; + u16 link, speed; - spin_lock_irqsave(&aup->lock, flags); - - if (phydev->link && (aup->old_speed != phydev->speed)) { - // speed changed + if (!dev) { + /* fatal error, don't restart the timer */ + printk(KERN_ERR "au1000_timer error: NULL dev\n"); + return; + } - 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; + 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); + } } - - aup->old_speed = phydev->speed; - - status_change = 1; } - if (phydev->link && (aup->old_duplex != phydev->duplex)) { - // duplex mode changed - - /* switching duplex mode requires to disable rx and tx! */ + if (link && (dev->if_port != if_port) && + (dev->if_port != IF_PORT_UNKNOWN)) { hard_stop(dev); - - 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; + 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); } - - aup->old_link = phydev->link; - status_change = 1; + else { + aup->mac->control &= ~MAC_FULL_DUPLEX; + au_sync_delay(1); + } + enable_rx_tx(dev); } - spin_unlock_irqrestore(&aup->lock, flags); + aup->timer.expires = RUN_AT((1*HZ)); + aup->timer.data = (unsigned long)dev; + aup->timer.function = &au1000_timer; /* timer handler */ + add_timer(&aup->timer); - 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) @@ -957,26 +1747,25 @@ 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 (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); + 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; } - netif_start_queue(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); if (au1000_debug > 4) printk("%s: open: Initialization done.\n", dev->name); @@ -986,19 +1775,16 @@ static int au1000_open(struct net_device *dev) static int au1000_close(struct net_device *dev) { - unsigned long flags; - struct au1000_private *const aup = (struct au1000_private *) dev->priv; + u32 flags; + struct au1000_private *aup = (struct au1000_private *) dev->priv; if (au1000_debug > 4) printk("%s: close: dev=%p\n", dev->name, dev); - if (aup->phy_dev) - phy_stop(aup->phy_dev); + reset_mac(dev); spin_lock_irqsave(&aup->lock, flags); - - reset_mac_unlocked (dev); - + /* stop the device */ netif_stop_queue(dev); @@ -1020,29 +1806,37 @@ static void __exit au1000_cleanup_module(void) if (dev) { aup = (struct au1000_private *) dev->priv; unregister_netdev(dev); - for (j = 0; j < NUM_RX_DMA; j++) + kfree(aup->mii); + 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); - release_mem_region(dev->base_addr, MAC_IOSIZE); - release_mem_region(CPHYSADDR(iflist[i].macen_addr), 4); + } + dma_free_noncoherent(NULL, + MAX_BUF_SIZE * (NUM_TX_BUFFS+NUM_RX_BUFFS), + (void *)aup->vaddr, + aup->dma_addr); free_netdev(dev); + release_mem_region(CPHYSADDR(iflist[i].base_addr), MAC_IOSIZE); } } } -static void update_tx_stats(struct net_device *dev, u32 status) + +static inline void +update_tx_stats(struct net_device *dev, u32 status, u32 pkt_len) { struct au1000_private *aup = (struct au1000_private *) dev->priv; struct net_device_stats *ps = &aup->stats; + ps->tx_packets++; + ps->tx_bytes += pkt_len; + if (status & TX_FRAME_ABORTED) { - if (!aup->phy_dev || (DUPLEX_FULL == aup->phy_dev->duplex)) { + if (dev->if_port == IF_PORT_100BASEFX) { if (status & (TX_JAB_TIMEOUT | TX_UNDERRUN)) { /* any other tx errors are only valid * in half duplex mode */ @@ -1073,7 +1867,7 @@ static void au1000_tx_ack(struct net_device *dev) ptxd = aup->tx_dma_ring[aup->tx_tail]; while (ptxd->buff_stat & TX_T_DONE) { - update_tx_stats(dev, ptxd->status); + update_tx_stats(dev, ptxd->status, ptxd->len & 0x3ff); ptxd->buff_stat &= ~TX_T_DONE; ptxd->len = 0; au_sync(); @@ -1095,7 +1889,6 @@ static void au1000_tx_ack(struct net_device *dev) static int au1000_tx(struct sk_buff *skb, struct net_device *dev) { struct au1000_private *aup = (struct au1000_private *) dev->priv; - struct net_device_stats *ps = &aup->stats; volatile tx_dma_t *ptxd; u32 buff_stat; db_dest_t *pDB; @@ -1115,7 +1908,7 @@ static int au1000_tx(struct sk_buff *skb, struct net_device *dev) return 1; } else if (buff_stat & TX_T_DONE) { - update_tx_stats(dev, ptxd->status); + update_tx_stats(dev, ptxd->status, ptxd->len & 0x3ff); ptxd->len = 0; } @@ -1135,9 +1928,6 @@ static int au1000_tx(struct sk_buff *skb, struct net_device *dev) else ptxd->len = skb->len; - ps->tx_packets++; - ps->tx_bytes += ptxd->len; - ptxd->buff_stat = pDB->dma_addr | TX_DMA_ENABLE; au_sync(); dev_kfree_skb(skb); @@ -1146,6 +1936,7 @@ static int au1000_tx(struct sk_buff *skb, struct net_device *dev) return 0; } + static inline void update_rx_stats(struct net_device *dev, u32 status) { struct au1000_private *aup = (struct au1000_private *) dev->priv; @@ -1283,6 +2074,23 @@ static void au1000_tx_timeout(struct net_device *dev) netif_wake_queue(dev); } + +static unsigned const ethernet_polynomial = 0x04c11db7U; +static inline u32 ether_crc(int length, unsigned char *data) +{ + int crc = -1; + + while(--length >= 0) { + unsigned char current_octet = *data++; + int bit; + for (bit = 0; bit < 8; bit++, current_octet >>= 1) + crc = (crc << 1) ^ + ((crc < 0) ^ (current_octet & 1) ? + ethernet_polynomial : 0); + } + return crc; +} + static void set_rx_mode(struct net_device *dev) { struct au1000_private *aup = (struct au1000_private *) dev->priv; @@ -1316,15 +2124,126 @@ 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 (!netif_running(dev)) return -EINVAL; + 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 (!aup->phy_dev) return -EINVAL; // PHY not controllable + 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); - return phy_mii_ioctl(aup->phy_dev, if_mii(rq), cmd); + 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; } 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 41c2f848d..7f9326e39 100644 --- a/drivers/net/au1000_eth.h +++ b/drivers/net/au1000_eth.h @@ -40,6 +40,120 @@ #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. @@ -86,6 +200,7 @@ 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]; @@ -98,15 +213,8 @@ struct au1000_private { u32 tx_full; int mac_id; - - 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; + mii_phy_t *mii; + struct phy_ops *phy_ops; /* These variables are just for quick access to certain regs addresses. */ volatile mac_reg_t *mac; /* mac registers */ @@ -115,6 +223,14 @@ 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 e83c73e98..c3267e4e1 100644 --- a/drivers/net/b44.c +++ b/drivers/net/b44.c @@ -2,7 +2,6 @@ * * Copyright (C) 2002 David S. Miller (davem@redhat.com) * Fixed by Pekka Pietikainen (pp@ee.oulu.fi) - * Copyright (C) 2006 Broadcom Corporation. * * Distribute under GPL. */ @@ -29,8 +28,8 @@ #define DRV_MODULE_NAME "b44" #define PFX DRV_MODULE_NAME ": " -#define DRV_MODULE_VERSION "1.01" -#define DRV_MODULE_RELDATE "Jun 16, 2006" +#define DRV_MODULE_VERSION "0.97" +#define DRV_MODULE_RELDATE "Nov 30, 2005" #define B44_DEF_MSG_ENABLE \ (NETIF_MSG_DRV | \ @@ -75,15 +74,6 @@ /* 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"; @@ -95,7 +85,6 @@ MODULE_VERSION(DRV_MODULE_VERSION); static int b44_debug = -1; /* -1 == use B44_DEF_MSG_ENABLE as value */ module_param(b44_debug, int, 0); MODULE_PARM_DESC(b44_debug, "B44 bitmapped debugging message enable value"); -MODULE_VERSION(DRV_MODULE_VERSION); static struct pci_device_id b44_pci_tbl[] = { { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_BCM4401, @@ -111,7 +100,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 *, int); +static void b44_init_hw(struct b44 *); static int dma_desc_align_mask; static int dma_desc_sync_size; @@ -147,7 +136,7 @@ static inline unsigned long br32(const struct b44 *bp, unsigned long reg) return readl(bp->regs + reg); } -static inline void bw32(const struct b44 *bp, +static inline void bw32(const struct b44 *bp, unsigned long reg, unsigned long val) { writel(val, bp->regs + reg); @@ -297,13 +286,13 @@ static void __b44_cam_write(struct b44 *bp, unsigned char *data, int index) val |= ((u32) data[4]) << 8; val |= ((u32) data[5]) << 0; bw32(bp, B44_CAM_DATA_LO, val); - val = (CAM_DATA_HI_VALID | + val = (CAM_DATA_HI_VALID | (((u32) data[0]) << 8) | (((u32) data[1]) << 0)); bw32(bp, B44_CAM_DATA_HI, val); bw32(bp, B44_CAM_CTRL, (CAM_CTRL_WRITE | (index << CAM_CTRL_INDEX_SHIFT))); - b44_wait_bit(bp, B44_CAM_CTRL, CAM_CTRL_BUSY, 100, 1); + b44_wait_bit(bp, B44_CAM_CTRL, CAM_CTRL_BUSY, 100, 1); } static inline void __b44_disable_ints(struct b44 *bp) @@ -421,18 +410,25 @@ static void __b44_set_flow_ctrl(struct b44 *bp, u32 pause_flags) static void b44_set_flow_ctrl(struct b44 *bp, u32 local, u32 remote) { - u32 pause_enab = 0; + u32 pause_enab = bp->flags & (B44_FLAG_TX_PAUSE | + B44_FLAG_RX_PAUSE); - /* The driver supports only rx pause by default because - the b44 mac tx pause mechanism generates excessive - pause frames. - Use ethtool to turn on b44 tx pause if necessary. - */ - if ((local & ADVERTISE_PAUSE_CAP) && - (local & ADVERTISE_PAUSE_ASYM)){ - if ((remote & LPA_PAUSE_ASYM) && - !(remote & LPA_PAUSE_CAP)) - pause_enab |= B44_FLAG_RX_PAUSE; + if (local & ADVERTISE_PAUSE_CAP) { + if (local & ADVERTISE_PAUSE_ASYM) { + if (remote & LPA_PAUSE_CAP) + pause_enab |= (B44_FLAG_TX_PAUSE | + B44_FLAG_RX_PAUSE); + else if (remote & LPA_PAUSE_ASYM) + pause_enab |= B44_FLAG_RX_PAUSE; + } else { + if (remote & LPA_PAUSE_CAP) + pause_enab |= (B44_FLAG_TX_PAUSE | + B44_FLAG_RX_PAUSE); + } + } else if (local & ADVERTISE_PAUSE_ASYM) { + if ((remote & LPA_PAUSE_CAP) && + (remote & LPA_PAUSE_ASYM)) + pause_enab |= B44_FLAG_TX_PAUSE; } __b44_set_flow_ctrl(bp, pause_enab); @@ -612,7 +608,8 @@ static void b44_tx(struct b44 *bp) struct ring_info *rp = &bp->tx_buffers[cons]; struct sk_buff *skb = rp->skb; - BUG_ON(skb == NULL); + if (unlikely(skb == NULL)) + BUG(); pci_unmap_single(bp->pdev, pci_unmap_addr(rp, mapping), @@ -660,11 +657,9 @@ static int b44_alloc_rx_skb(struct b44 *bp, int src_idx, u32 dest_idx_unmasked) /* Hardware bug work-around, the chip is unable to do PCI DMA to/from anything above 1GB :-( */ - if (dma_mapping_error(mapping) || - mapping + RX_PKT_BUF_SZ > B44_DMA_MASK) { + if (mapping + RX_PKT_BUF_SZ > B44_DMA_MASK) { /* Sigh... */ - if (!dma_mapping_error(mapping)) - pci_unmap_single(bp->pdev, mapping, RX_PKT_BUF_SZ,PCI_DMA_FROMDEVICE); + pci_unmap_single(bp->pdev, mapping, RX_PKT_BUF_SZ,PCI_DMA_FROMDEVICE); dev_kfree_skb_any(skb); skb = __dev_alloc_skb(RX_PKT_BUF_SZ,GFP_DMA); if (skb == NULL) @@ -672,10 +667,8 @@ static int b44_alloc_rx_skb(struct b44 *bp, int src_idx, u32 dest_idx_unmasked) mapping = pci_map_single(bp->pdev, skb->data, RX_PKT_BUF_SZ, PCI_DMA_FROMDEVICE); - if (dma_mapping_error(mapping) || - mapping + RX_PKT_BUF_SZ > B44_DMA_MASK) { - if (!dma_mapping_error(mapping)) - pci_unmap_single(bp->pdev, mapping, RX_PKT_BUF_SZ,PCI_DMA_FROMDEVICE); + if (mapping + RX_PKT_BUF_SZ > B44_DMA_MASK) { + pci_unmap_single(bp->pdev, mapping, RX_PKT_BUF_SZ,PCI_DMA_FROMDEVICE); dev_kfree_skb_any(skb); return -ENOMEM; } @@ -883,7 +876,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, 1); + b44_init_hw(bp); netif_wake_queue(bp->dev); spin_unlock_irq(&bp->lock); done = 1; @@ -952,7 +945,7 @@ static void b44_tx_timeout(struct net_device *dev) b44_halt(bp); b44_init_rings(bp); - b44_init_hw(bp, 1); + b44_init_hw(bp); spin_unlock_irq(&bp->lock); @@ -981,10 +974,9 @@ static int b44_start_xmit(struct sk_buff *skb, struct net_device *dev) } mapping = pci_map_single(bp->pdev, skb->data, len, PCI_DMA_TODEVICE); - if (dma_mapping_error(mapping) || mapping + len > B44_DMA_MASK) { + if (mapping + len > B44_DMA_MASK) { /* Chip can't handle DMA to/from >1GB, use bounce buffer */ - if (!dma_mapping_error(mapping)) - pci_unmap_single(bp->pdev, mapping, len, PCI_DMA_TODEVICE); + pci_unmap_single(bp->pdev, mapping, len, PCI_DMA_TODEVICE); bounce_skb = __dev_alloc_skb(TX_PKT_BUF_SZ, GFP_ATOMIC|GFP_DMA); @@ -993,9 +985,8 @@ static int b44_start_xmit(struct sk_buff *skb, struct net_device *dev) mapping = pci_map_single(bp->pdev, bounce_skb->data, len, PCI_DMA_TODEVICE); - if (dma_mapping_error(mapping) || mapping + len > B44_DMA_MASK) { - if (!dma_mapping_error(mapping)) - pci_unmap_single(bp->pdev, mapping, + if (mapping + len > B44_DMA_MASK) { + pci_unmap_single(bp->pdev, mapping, len, PCI_DMA_TODEVICE); dev_kfree_skb_any(bounce_skb); goto err_out; @@ -1069,11 +1060,11 @@ 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, 1); + b44_init_hw(bp); spin_unlock_irq(&bp->lock); b44_enable_ints(bp); - + return 0; } @@ -1219,8 +1210,7 @@ static int b44_alloc_consistent(struct b44 *bp) DMA_TABLE_BYTES, DMA_BIDIRECTIONAL); - if (dma_mapping_error(rx_ring_dma) || - rx_ring_dma + size > B44_DMA_MASK) { + if (rx_ring_dma + size > B44_DMA_MASK) { kfree(rx_ring); goto out_err; } @@ -1246,8 +1236,7 @@ static int b44_alloc_consistent(struct b44 *bp) DMA_TABLE_BYTES, DMA_TO_DEVICE); - if (dma_mapping_error(tx_ring_dma) || - tx_ring_dma + size > B44_DMA_MASK) { + if (tx_ring_dma + size > B44_DMA_MASK) { kfree(tx_ring); goto out_err; } @@ -1350,9 +1339,6 @@ static int b44_set_mac_addr(struct net_device *dev, void *p) if (netif_running(dev)) return -EBUSY; - if (!is_valid_ether_addr(addr->sa_data)) - return -EINVAL; - memcpy(dev->dev_addr, addr->sa_data, dev->addr_len); spin_lock_irq(&bp->lock); @@ -1366,15 +1352,13 @@ 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, int full_reset) +static void b44_init_hw(struct b44 *bp) { u32 val; b44_chip_reset(bp); - if (full_reset) { - b44_phy_reset(bp); - b44_setup_phy(bp); - } + 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); @@ -1388,21 +1372,16 @@ static void b44_init_hw(struct b44 *bp, int full_reset) bw32(bp, B44_TXMAXLEN, bp->dev->mtu + ETH_HLEN + 8 + RX_HEADER_LEN); bw32(bp, B44_TX_WMARK, 56); /* XXX magic */ - 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_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); - } else { - bw32(bp, B44_DMARX_CTRL, (DMARX_CTRL_ENABLE | - (bp->rx_offset << DMARX_CTRL_ROSHIFT))); - } + bw32(bp, B44_MIB_CTRL, MIB_CTRL_CLR_ON_READ); val = br32(bp, B44_ENET_CTRL); bw32(bp, B44_ENET_CTRL, (val | ENET_CTRL_ENABLE)); @@ -1418,11 +1397,11 @@ static int b44_open(struct net_device *dev) goto out; b44_init_rings(bp); - b44_init_hw(bp, 1); + b44_init_hw(bp); b44_check_phy(bp); - err = request_irq(dev->irq, b44_interrupt, IRQF_SHARED, dev->name, dev); + err = request_irq(dev->irq, b44_interrupt, SA_SHIRQ, dev->name, dev); if (unlikely(err < 0)) { b44_chip_reset(bp); b44_free_rings(bp); @@ -1467,140 +1446,6 @@ 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); @@ -1626,11 +1471,6 @@ 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; @@ -1711,9 +1551,9 @@ static void __b44_set_rx_mode(struct net_device *dev) val |= RXCONFIG_ALLMULTI; else i = __b44_load_mcast(bp, dev); - + for (; i < 64; i++) { - __b44_cam_write(bp, zero, i); + __b44_cam_write(bp, zero, i); } bw32(bp, B44_RXCONFIG, val); val = br32(bp, B44_CAM_CTRL); @@ -1776,6 +1616,8 @@ 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 | @@ -1803,12 +1645,6 @@ 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; @@ -1818,6 +1654,9 @@ 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 & @@ -1834,39 +1673,28 @@ 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 | - B44_FLAG_100_BASE_T | - B44_FLAG_FULL_DUPLEX | - B44_FLAG_ADV_10HALF | + bp->flags &= ~B44_FLAG_FORCE_LINK; + bp->flags &= ~(B44_FLAG_ADV_10HALF | B44_FLAG_ADV_10FULL | B44_FLAG_ADV_100HALF | 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; - } + 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; } 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; } - if (netif_running(dev)) - b44_setup_phy(bp); + b44_setup_phy(bp); spin_unlock_irq(&bp->lock); @@ -1902,12 +1730,12 @@ static int b44_set_ringparam(struct net_device *dev, b44_halt(bp); b44_init_rings(bp); - b44_init_hw(bp, 1); + b44_init_hw(bp); netif_wake_queue(bp->dev); spin_unlock_irq(&bp->lock); b44_enable_ints(bp); - + return 0; } @@ -1945,14 +1773,14 @@ 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, 1); + b44_init_hw(bp); } else { __b44_set_flow_ctrl(bp, bp->flags); } spin_unlock_irq(&bp->lock); b44_enable_ints(bp); - + return 0; } @@ -1987,40 +1815,12 @@ 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, @@ -2076,12 +1876,6 @@ static int __devinit b44_get_invariants(struct b44 *bp) bp->dev->dev_addr[3] = eeprom[80]; bp->dev->dev_addr[4] = eeprom[83]; bp->dev->dev_addr[5] = eeprom[82]; - - if (!is_valid_ether_addr(&bp->dev->dev_addr[0])){ - printk(KERN_ERR PFX "Invalid MAC address found in EEPROM\n"); - return -EINVAL; - } - memcpy(bp->dev->perm_addr, bp->dev->dev_addr, bp->dev->addr_len); bp->phy_addr = eeprom[90] & 0x1f; @@ -2096,13 +1890,9 @@ static int __devinit b44_get_invariants(struct b44 *bp) bp->core_unit = ssb_core_unit(bp); bp->dma_offset = SB_PCI_DMA; - /* XXX - really required? + /* 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; } @@ -2121,14 +1911,13 @@ static int __devinit b44_init_one(struct pci_dev *pdev, err = pci_enable_device(pdev); if (err) { - dev_err(&pdev->dev, "Cannot enable PCI device, " + printk(KERN_ERR PFX "Cannot enable PCI device, " "aborting.\n"); return err; } if (!(pci_resource_flags(pdev, 0) & IORESOURCE_MEM)) { - dev_err(&pdev->dev, - "Cannot find proper PCI device " + printk(KERN_ERR PFX "Cannot find proper PCI device " "base address, aborting.\n"); err = -ENODEV; goto err_out_disable_pdev; @@ -2136,8 +1925,8 @@ static int __devinit b44_init_one(struct pci_dev *pdev, err = pci_request_regions(pdev, DRV_MODULE_NAME); if (err) { - dev_err(&pdev->dev, - "Cannot obtain PCI resources, aborting.\n"); + printk(KERN_ERR PFX "Cannot obtain PCI resources, " + "aborting.\n"); goto err_out_disable_pdev; } @@ -2145,13 +1934,15 @@ static int __devinit b44_init_one(struct pci_dev *pdev, err = pci_set_dma_mask(pdev, (u64) B44_DMA_MASK); if (err) { - dev_err(&pdev->dev, "No usable DMA configuration, aborting.\n"); + printk(KERN_ERR PFX "No usable DMA configuration, " + "aborting.\n"); goto err_out_free_res; } - + err = pci_set_consistent_dma_mask(pdev, (u64) B44_DMA_MASK); if (err) { - dev_err(&pdev->dev, "No usable DMA configuration, aborting.\n"); + printk(KERN_ERR PFX "No usable DMA configuration, " + "aborting.\n"); goto err_out_free_res; } @@ -2160,7 +1951,7 @@ static int __devinit b44_init_one(struct pci_dev *pdev, dev = alloc_etherdev(sizeof(*bp)); if (!dev) { - dev_err(&pdev->dev, "Etherdev alloc failed, aborting.\n"); + printk(KERN_ERR PFX "Etherdev alloc failed, aborting.\n"); err = -ENOMEM; goto err_out_free_res; } @@ -2181,7 +1972,8 @@ static int __devinit b44_init_one(struct pci_dev *pdev, bp->regs = ioremap(b44reg_base, b44reg_len); if (bp->regs == 0UL) { - dev_err(&pdev->dev, "Cannot map device registers, aborting.\n"); + printk(KERN_ERR PFX "Cannot map device registers, " + "aborting.\n"); err = -ENOMEM; goto err_out_free_dev; } @@ -2211,8 +2003,8 @@ static int __devinit b44_init_one(struct pci_dev *pdev, err = b44_get_invariants(bp); if (err) { - dev_err(&pdev->dev, - "Problem fetching invariants of chip, aborting.\n"); + printk(KERN_ERR PFX "Problem fetching invariants of chip, " + "aborting.\n"); goto err_out_iounmap; } @@ -2232,7 +2024,8 @@ static int __devinit b44_init_one(struct pci_dev *pdev, err = register_netdev(dev); if (err) { - dev_err(&pdev->dev, "Cannot register net device, aborting.\n"); + printk(KERN_ERR PFX "Cannot register net device, " + "aborting.\n"); goto err_out_iounmap; } @@ -2240,11 +2033,6 @@ static int __devinit b44_init_one(struct pci_dev *pdev, pci_save_state(bp->pdev); - /* Chip reset provides power to the b44 MAC & PCI cores, which - * is necessary for MAC register access. - */ - b44_chip_reset(bp); - printk(KERN_INFO "%s: Broadcom 4400 10/100BaseT Ethernet ", dev->name); for (i = 0; i < 6; i++) printk("%2.2x%c", dev->dev_addr[i], @@ -2290,20 +2078,16 @@ static int b44_suspend(struct pci_dev *pdev, pm_message_t state) del_timer_sync(&bp->timer); - spin_lock_irq(&bp->lock); + spin_lock_irq(&bp->lock); b44_halt(bp); - netif_carrier_off(bp->dev); + netif_carrier_off(bp->dev); netif_device_detach(bp->dev); b44_free_rings(bp); 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; } @@ -2320,13 +2104,13 @@ static int b44_resume(struct pci_dev *pdev) if (!netif_running(dev)) return 0; - if (request_irq(dev->irq, b44_interrupt, IRQF_SHARED, dev->name, dev)) + if (request_irq(dev->irq, b44_interrupt, SA_SHIRQ, 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, 1); + b44_init_hw(bp); netif_device_attach(bp->dev); spin_unlock_irq(&bp->lock); diff --git a/drivers/net/b44.h b/drivers/net/b44.h index 4944507fa..b17866297 100644 --- a/drivers/net/b44.h +++ b/drivers/net/b44.h @@ -24,9 +24,6 @@ #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 */ @@ -267,8 +264,6 @@ #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 @@ -425,7 +420,6 @@ 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 @@ -441,7 +435,6 @@ 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 6fad83f24..bbca8ae80 100644 --- a/drivers/net/bmac.c +++ b/drivers/net/bmac.c @@ -7,6 +7,7 @@ * 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 652eb05a6..a24200d0a 100644 --- a/drivers/net/bnx2.c +++ b/drivers/net/bnx2.c @@ -9,62 +9,20 @@ * Written by: Michael Chan (mchan@broadcom.com) */ - -#include -#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 -#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.44" -#define DRV_MODULE_RELDATE "August 10, 2006" +#define DRV_MODULE_VERSION "1.4.31" +#define DRV_MODULE_RELDATE "January 19, 2006" #define RUN_AT(x) (jiffies + (x)) /* Time in jiffies before concluding the transmitter is hung. */ #define TX_TIMEOUT (5*HZ) -static const char version[] __devinitdata = +static char version[] __devinitdata = "Broadcom NetXtreme II Gigabit Ethernet Driver " DRV_MODULE_NAME " v" DRV_MODULE_VERSION " (" DRV_MODULE_RELDATE ")\n"; MODULE_AUTHOR("Michael Chan "); @@ -88,7 +46,7 @@ typedef enum { } board_t; /* indexed by board_t, above */ -static const struct { +static struct { char *name; } board_info[] __devinitdata = { { "Broadcom NetXtreme II BCM5706 1000Base-T" }, @@ -209,10 +167,8 @@ MODULE_DEVICE_TABLE(pci, bnx2_pci_tbl); static inline u32 bnx2_tx_avail(struct bnx2 *bp) { - u32 diff; + u32 diff = TX_RING_IDX(bp->tx_prod) - TX_RING_IDX(bp->tx_cons); - 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); @@ -357,6 +313,8 @@ bnx2_disable_int(struct bnx2 *bp) static void bnx2_enable_int(struct bnx2 *bp) { + u32 val; + REG_WR(bp, BNX2_PCICFG_INT_ACK_CMD, BNX2_PCICFG_INT_ACK_CMD_INDEX_VALID | BNX2_PCICFG_INT_ACK_CMD_MASK_INT | bp->last_status_idx); @@ -364,7 +322,8 @@ bnx2_enable_int(struct bnx2 *bp) REG_WR(bp, BNX2_PCICFG_INT_ACK_CMD, BNX2_PCICFG_INT_ACK_CMD_INDEX_VALID | bp->last_status_idx); - REG_WR(bp, BNX2_HC_COMMAND, bp->hc_cmd | BNX2_HC_COMMAND_COAL_NOW); + val = REG_RD(bp, BNX2_HC_COMMAND); + REG_WR(bp, BNX2_HC_COMMAND, val | BNX2_HC_COMMAND_COAL_NOW); } static void @@ -401,13 +360,15 @@ bnx2_netif_start(struct bnx2 *bp) static void bnx2_free_mem(struct bnx2 *bp) { - int i; - + if (bp->stats_blk) { + pci_free_consistent(bp->pdev, sizeof(struct statistics_block), + bp->stats_blk, bp->stats_blk_mapping); + bp->stats_blk = NULL; + } if (bp->status_blk) { - pci_free_consistent(bp->pdev, bp->status_stats_size, + pci_free_consistent(bp->pdev, sizeof(struct status_block), bp->status_blk, bp->status_blk_mapping); bp->status_blk = NULL; - bp->stats_blk = NULL; } if (bp->tx_desc_ring) { pci_free_consistent(bp->pdev, @@ -417,28 +378,25 @@ bnx2_free_mem(struct bnx2 *bp) } kfree(bp->tx_buf_ring); bp->tx_buf_ring = NULL; - for (i = 0; i < bp->rx_max_ring; i++) { - if (bp->rx_desc_ring[i]) - pci_free_consistent(bp->pdev, - sizeof(struct rx_bd) * RX_DESC_CNT, - bp->rx_desc_ring[i], - bp->rx_desc_mapping[i]); - bp->rx_desc_ring[i] = NULL; - } - vfree(bp->rx_buf_ring); + if (bp->rx_desc_ring) { + pci_free_consistent(bp->pdev, + sizeof(struct rx_bd) * RX_DESC_CNT, + bp->rx_desc_ring, bp->rx_desc_mapping); + bp->rx_desc_ring = NULL; + } + kfree(bp->rx_buf_ring); bp->rx_buf_ring = NULL; } static int bnx2_alloc_mem(struct bnx2 *bp) { - int i, status_blk_size; - - bp->tx_buf_ring = kzalloc(sizeof(struct sw_bd) * TX_DESC_CNT, - GFP_KERNEL); + bp->tx_buf_ring = kmalloc(sizeof(struct sw_bd) * TX_DESC_CNT, + GFP_KERNEL); if (bp->tx_buf_ring == NULL) return -ENOMEM; + memset(bp->tx_buf_ring, 0, sizeof(struct sw_bd) * TX_DESC_CNT); bp->tx_desc_ring = pci_alloc_consistent(bp->pdev, sizeof(struct tx_bd) * TX_DESC_CNT, @@ -446,40 +404,34 @@ bnx2_alloc_mem(struct bnx2 *bp) if (bp->tx_desc_ring == NULL) goto alloc_mem_err; - bp->rx_buf_ring = vmalloc(sizeof(struct sw_bd) * RX_DESC_CNT * - bp->rx_max_ring); + bp->rx_buf_ring = kmalloc(sizeof(struct sw_bd) * RX_DESC_CNT, + GFP_KERNEL); if (bp->rx_buf_ring == NULL) goto alloc_mem_err; - memset(bp->rx_buf_ring, 0, sizeof(struct sw_bd) * RX_DESC_CNT * - bp->rx_max_ring); - - for (i = 0; i < bp->rx_max_ring; i++) { - bp->rx_desc_ring[i] = - pci_alloc_consistent(bp->pdev, - sizeof(struct rx_bd) * RX_DESC_CNT, - &bp->rx_desc_mapping[i]); - if (bp->rx_desc_ring[i] == NULL) - goto alloc_mem_err; - - } - - /* Combine status and statistics blocks into one allocation. */ - status_blk_size = L1_CACHE_ALIGN(sizeof(struct status_block)); - bp->status_stats_size = status_blk_size + - sizeof(struct statistics_block); + memset(bp->rx_buf_ring, 0, sizeof(struct sw_bd) * RX_DESC_CNT); + bp->rx_desc_ring = pci_alloc_consistent(bp->pdev, + sizeof(struct rx_bd) * + RX_DESC_CNT, + &bp->rx_desc_mapping); + if (bp->rx_desc_ring == NULL) + goto alloc_mem_err; - bp->status_blk = pci_alloc_consistent(bp->pdev, bp->status_stats_size, + bp->status_blk = pci_alloc_consistent(bp->pdev, + sizeof(struct status_block), &bp->status_blk_mapping); if (bp->status_blk == NULL) goto alloc_mem_err; - memset(bp->status_blk, 0, bp->status_stats_size); + memset(bp->status_blk, 0, sizeof(struct status_block)); - bp->stats_blk = (void *) ((unsigned long) bp->status_blk + - status_blk_size); + bp->stats_blk = pci_alloc_consistent(bp->pdev, + sizeof(struct statistics_block), + &bp->stats_blk_mapping); + if (bp->stats_blk == NULL) + goto alloc_mem_err; - bp->stats_blk_mapping = bp->status_blk_mapping + status_blk_size; + memset(bp->stats_blk, 0, sizeof(struct statistics_block)); return 0; @@ -1568,10 +1520,10 @@ bnx2_alloc_rx_skb(struct bnx2 *bp, u16 index) struct sk_buff *skb; struct sw_bd *rx_buf = &bp->rx_buf_ring[index]; dma_addr_t mapping; - struct rx_bd *rxbd = &bp->rx_desc_ring[RX_RING(index)][RX_IDX(index)]; + struct rx_bd *rxbd = &bp->rx_desc_ring[index]; unsigned long align; - skb = netdev_alloc_skb(bp->dev, bp->rx_buf_size); + skb = dev_alloc_skb(bp->rx_buf_size); if (skb == NULL) { return -ENOMEM; } @@ -1580,6 +1532,7 @@ 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); @@ -1640,7 +1593,7 @@ bnx2_tx_int(struct bnx2 *bp) skb = tx_buf->skb; #ifdef BCM_TSO /* partial BD completions possible with TSO packets */ - if (skb_is_gso(skb)) { + if (skb_shinfo(skb)->tso_size) { u16 last_idx, last_ring_idx; last_idx = sw_cons + @@ -1676,7 +1629,7 @@ bnx2_tx_int(struct bnx2 *bp) tx_free_bd += last + 1; - dev_kfree_skb(skb); + dev_kfree_skb_irq(skb); hw_cons = bp->hw_tx_cons = sblk->status_tx_quick_consumer_index0; @@ -1687,20 +1640,15 @@ 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)) && - (bnx2_tx_avail(bp) > bp->tx_wake_thresh)) { - netif_tx_lock(bp->dev); + if (unlikely(netif_queue_stopped(bp->dev))) { + spin_lock(&bp->tx_lock); if ((netif_queue_stopped(bp->dev)) && - (bnx2_tx_avail(bp) > bp->tx_wake_thresh)) + (bnx2_tx_avail(bp) > MAX_SKB_FRAGS)) { + netif_wake_queue(bp->dev); - netif_tx_unlock(bp->dev); + } + spin_unlock(&bp->tx_lock); } } @@ -1708,30 +1656,23 @@ static inline void bnx2_reuse_rx_skb(struct bnx2 *bp, struct sk_buff *skb, u16 cons, u16 prod) { - struct sw_bd *cons_rx_buf, *prod_rx_buf; - struct rx_bd *cons_bd, *prod_bd; - - cons_rx_buf = &bp->rx_buf_ring[cons]; - prod_rx_buf = &bp->rx_buf_ring[prod]; + struct sw_bd *cons_rx_buf = &bp->rx_buf_ring[cons]; + struct sw_bd *prod_rx_buf = &bp->rx_buf_ring[prod]; + struct rx_bd *cons_bd = &bp->rx_desc_ring[cons]; + struct rx_bd *prod_bd = &bp->rx_desc_ring[prod]; pci_dma_sync_single_for_device(bp->pdev, pci_unmap_addr(cons_rx_buf, mapping), bp->rx_offset + RX_COPY_THRESH, PCI_DMA_FROMDEVICE); - bp->rx_prod_bseq += bp->rx_buf_use_size; - - prod_rx_buf->skb = skb; - - if (cons == prod) - return; - + prod_rx_buf->skb = cons_rx_buf->skb; pci_unmap_addr_set(prod_rx_buf, mapping, pci_unmap_addr(cons_rx_buf, mapping)); - cons_bd = &bp->rx_desc_ring[RX_RING(cons)][RX_IDX(cons)]; - prod_bd = &bp->rx_desc_ring[RX_RING(prod)][RX_IDX(prod)]; - prod_bd->rx_bd_haddr_hi = cons_bd->rx_bd_haddr_hi; - prod_bd->rx_bd_haddr_lo = cons_bd->rx_bd_haddr_lo; + memcpy(prod_bd, cons_bd, 8); + + bp->rx_prod_bseq += bp->rx_buf_use_size; + } static int @@ -1758,19 +1699,14 @@ bnx2_rx_int(struct bnx2 *bp, int budget) u32 status; struct sw_bd *rx_buf; struct sk_buff *skb; - dma_addr_t dma_addr; sw_ring_cons = RX_RING_IDX(sw_cons); sw_ring_prod = RX_RING_IDX(sw_prod); rx_buf = &bp->rx_buf_ring[sw_ring_cons]; skb = rx_buf->skb; - - rx_buf->skb = NULL; - - dma_addr = pci_unmap_addr(rx_buf, mapping); - - pci_dma_sync_single_for_cpu(bp->pdev, dma_addr, + pci_dma_sync_single_for_cpu(bp->pdev, + pci_unmap_addr(rx_buf, mapping), bp->rx_offset + RX_COPY_THRESH, PCI_DMA_FROMDEVICE); rx_hdr = (struct l2_fhdr *) skb->data; @@ -1792,7 +1728,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 = netdev_alloc_skb(bp->dev, len + 2); + new_skb = dev_alloc_skb(len + 2); if (new_skb == NULL) goto reuse_rx; @@ -1803,6 +1739,7 @@ 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); @@ -1810,7 +1747,8 @@ bnx2_rx_int(struct bnx2 *bp, int budget) skb = new_skb; } else if (bnx2_alloc_rx_skb(bp, sw_ring_prod) == 0) { - pci_unmap_single(bp->pdev, dma_addr, + pci_unmap_single(bp->pdev, + pci_unmap_addr(rx_buf, mapping), bp->rx_buf_use_size, PCI_DMA_FROMDEVICE); skb_reserve(skb, bp->rx_offset); @@ -1826,9 +1764,9 @@ reuse_rx: skb->protocol = eth_type_trans(skb, bp->dev); if ((len > (bp->dev->mtu + ETH_HLEN)) && - (ntohs(skb->protocol) != 0x8100)) { + (htons(skb->protocol) != 0x8100)) { - dev_kfree_skb(skb); + dev_kfree_skb_irq(skb); goto next_rx; } @@ -1856,6 +1794,8 @@ reuse_rx: rx_pkt++; next_rx: + rx_buf->skb = NULL; + sw_cons = NEXT_RX_BD(sw_cons); sw_prod = NEXT_RX_BD(sw_prod); @@ -1966,13 +1906,6 @@ bnx2_poll(struct net_device *dev, int *budget) spin_lock(&bp->phy_lock); bnx2_phy_int(bp); spin_unlock(&bp->phy_lock); - - /* This is needed to take care of transient status - * during link changes. - */ - REG_WR(bp, BNX2_HC_COMMAND, - bp->hc_cmd | BNX2_HC_COMMAND_COAL_NOW_WO_INT); - REG_RD(bp, BNX2_HC_COMMAND); } if (bp->status_blk->status_tx_quick_consumer_index0 != bp->hw_tx_cons) @@ -2015,7 +1948,7 @@ bnx2_poll(struct net_device *dev, int *budget) return 1; } -/* Called with rtnl_lock from vlan functions and also netif_tx_lock +/* Called with rtnl_lock from vlan functions and also dev->xmit_lock * from set_multicast. */ static void @@ -2089,92 +2022,6 @@ 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) @@ -2184,9 +2031,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, cpu_to_le32(*rv2p_code)); + REG_WR(bp, BNX2_RV2P_INSTR_HIGH, *rv2p_code); rv2p_code++; - REG_WR(bp, BNX2_RV2P_INSTR_LOW, cpu_to_le32(*rv2p_code)); + REG_WR(bp, BNX2_RV2P_INSTR_LOW, *rv2p_code); rv2p_code++; if (rv2p_proc == RV2P_PROC1) { @@ -2226,7 +2073,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, cpu_to_le32(fw->text[j])); + REG_WR_IND(bp, offset, fw->text[j]); } } @@ -2282,32 +2129,15 @@ load_cpu_fw(struct bnx2 *bp, struct cpu_reg *cpu_reg, struct fw_info *fw) REG_WR_IND(bp, cpu_reg->mode, val); } -static int +static void 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. */ - 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); + load_rv2p_fw(bp, bnx2_rv2p_proc1, sizeof(bnx2_rv2p_proc1), RV2P_PROC1); + load_rv2p_fw(bp, bnx2_rv2p_proc2, sizeof(bnx2_rv2p_proc2), RV2P_PROC2); /* Initialize the RX Processor. */ cpu_reg.mode = BNX2_RXP_CPU_MODE; @@ -2331,13 +2161,7 @@ bnx2_init_cpus(struct bnx2 *bp) fw.text_addr = bnx2_RXP_b06FwTextAddr; fw.text_len = bnx2_RXP_b06FwTextLen; fw.text_index = 0; - - rc = bnx2_gunzip(bp, bnx2_RXP_b06FwText, sizeof(bnx2_RXP_b06FwText), - &text, &text_len); - if (rc) - goto init_cpu_err; - - fw.text = text; + fw.text = bnx2_RXP_b06FwText; fw.data_addr = bnx2_RXP_b06FwDataAddr; fw.data_len = bnx2_RXP_b06FwDataLen; @@ -2383,13 +2207,7 @@ bnx2_init_cpus(struct bnx2 *bp) fw.text_addr = bnx2_TXP_b06FwTextAddr; fw.text_len = bnx2_TXP_b06FwTextLen; fw.text_index = 0; - - rc = bnx2_gunzip(bp, bnx2_TXP_b06FwText, sizeof(bnx2_TXP_b06FwText), - &text, &text_len); - if (rc) - goto init_cpu_err; - - fw.text = text; + fw.text = bnx2_TXP_b06FwText; fw.data_addr = bnx2_TXP_b06FwDataAddr; fw.data_len = bnx2_TXP_b06FwDataLen; @@ -2435,13 +2253,7 @@ bnx2_init_cpus(struct bnx2 *bp) fw.text_addr = bnx2_TPAT_b06FwTextAddr; fw.text_len = bnx2_TPAT_b06FwTextLen; fw.text_index = 0; - - rc = bnx2_gunzip(bp, bnx2_TPAT_b06FwText, sizeof(bnx2_TPAT_b06FwText), - &text, &text_len); - if (rc) - goto init_cpu_err; - - fw.text = text; + fw.text = bnx2_TPAT_b06FwText; fw.data_addr = bnx2_TPAT_b06FwDataAddr; fw.data_len = bnx2_TPAT_b06FwDataLen; @@ -2487,13 +2299,7 @@ bnx2_init_cpus(struct bnx2 *bp) fw.text_addr = bnx2_COM_b06FwTextAddr; fw.text_len = bnx2_COM_b06FwTextLen; fw.text_index = 0; - - rc = bnx2_gunzip(bp, bnx2_COM_b06FwText, sizeof(bnx2_COM_b06FwText), - &text, &text_len); - if (rc) - goto init_cpu_err; - - fw.text = text; + fw.text = bnx2_COM_b06FwText; fw.data_addr = bnx2_COM_b06FwDataAddr; fw.data_len = bnx2_COM_b06FwDataLen; @@ -2517,9 +2323,6 @@ bnx2_init_cpus(struct bnx2 *bp) load_cpu_fw(bp, &cpu_reg, &fw); -init_cpu_err: - bnx2_gunzip_end(bp); - return rc; } static int @@ -3081,7 +2884,7 @@ bnx2_nvram_write(struct bnx2 *bp, u32 offset, u8 *data_buf, int buf_size) { u32 written, offset32, len32; - u8 *buf, start[4], end[4], *flash_buffer = NULL; + u8 *buf, start[4], end[4]; int rc = 0; int align_start, align_end; @@ -3121,19 +2924,12 @@ bnx2_nvram_write(struct bnx2 *bp, u32 offset, u8 *data_buf, memcpy(buf + align_start, data_buf, buf_size); } - if (bp->flash_info->buffered == 0) { - flash_buffer = kmalloc(264, GFP_KERNEL); - if (flash_buffer == NULL) { - rc = -ENOMEM; - goto nvram_write_end; - } - } - written = 0; while ((written < len32) && (rc == 0)) { u32 page_start, page_end, data_start, data_end; u32 addr, cmd_flags; int i; + u8 flash_buffer[264]; /* Find the page_start addr */ page_start = offset32 + written; @@ -3204,7 +3000,7 @@ bnx2_nvram_write(struct bnx2 *bp, u32 offset, u8 *data_buf, } /* Loop to write the new data from data_start to data_end */ - for (addr = data_start; addr < data_end; addr += 4, i += 4) { + for (addr = data_start; addr < data_end; addr += 4, i++) { if ((addr == page_end - 4) || ((bp->flash_info->buffered) && (addr == data_end - 4))) { @@ -3252,9 +3048,6 @@ bnx2_nvram_write(struct bnx2 *bp, u32 offset, u8 *data_buf, } nvram_write_end: - if (bp->flash_info->buffered == 0) - kfree(flash_buffer); - if (align_start || align_end) kfree(buf); return rc; @@ -3392,9 +3185,7 @@ bnx2_init_chip(struct bnx2 *bp) * context block must have already been enabled. */ bnx2_init_context(bp); - if ((rc = bnx2_init_cpus(bp)) != 0) - return rc; - + bnx2_init_cpus(bp); bnx2_init_nvram(bp); bnx2_set_mac_addr(bp); @@ -3496,8 +3287,6 @@ bnx2_init_chip(struct bnx2 *bp) udelay(20); - bp->hc_cmd = REG_RD(bp, BNX2_HC_COMMAND); - return rc; } @@ -3508,8 +3297,6 @@ 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; @@ -3553,35 +3340,27 @@ bnx2_init_rx_ring(struct bnx2 *bp) bp->hw_rx_cons = 0; bp->rx_prod_bseq = 0; - for (i = 0; i < bp->rx_max_ring; i++) { - int j; - - rxbd = &bp->rx_desc_ring[i][0]; - for (j = 0; j < MAX_RX_DESC_CNT; j++, rxbd++) { - rxbd->rx_bd_len = bp->rx_buf_use_size; - rxbd->rx_bd_flags = RX_BD_FLAGS_START | RX_BD_FLAGS_END; - } - if (i == (bp->rx_max_ring - 1)) - j = 0; - else - j = i + 1; - rxbd->rx_bd_haddr_hi = (u64) bp->rx_desc_mapping[j] >> 32; - rxbd->rx_bd_haddr_lo = (u64) bp->rx_desc_mapping[j] & - 0xffffffff; + rxbd = &bp->rx_desc_ring[0]; + for (i = 0; i < MAX_RX_DESC_CNT; i++, rxbd++) { + rxbd->rx_bd_len = bp->rx_buf_use_size; + rxbd->rx_bd_flags = RX_BD_FLAGS_START | RX_BD_FLAGS_END; } + rxbd->rx_bd_haddr_hi = (u64) bp->rx_desc_mapping >> 32; + rxbd->rx_bd_haddr_lo = (u64) bp->rx_desc_mapping & 0xffffffff; + val = BNX2_L2CTX_CTX_TYPE_CTX_BD_CHN_TYPE_VALUE; val |= BNX2_L2CTX_CTX_TYPE_SIZE_L2; val |= 0x02 << 8; CTX_WR(bp, GET_CID_ADDR(RX_CID), BNX2_L2CTX_CTX_TYPE, val); - val = (u64) bp->rx_desc_mapping[0] >> 32; + val = (u64) bp->rx_desc_mapping >> 32; CTX_WR(bp, GET_CID_ADDR(RX_CID), BNX2_L2CTX_NX_BDHADDR_HI, val); - val = (u64) bp->rx_desc_mapping[0] & 0xffffffff; + val = (u64) bp->rx_desc_mapping & 0xffffffff; CTX_WR(bp, GET_CID_ADDR(RX_CID), BNX2_L2CTX_NX_BDHADDR_LO, val); - for (i = 0; i < bp->rx_ring_size; i++) { + for ( ;ring_prod < bp->rx_ring_size; ) { if (bnx2_alloc_rx_skb(bp, ring_prod) < 0) { break; } @@ -3595,29 +3374,6 @@ bnx2_init_rx_ring(struct bnx2 *bp) REG_WR(bp, MB_RX_CID_ADDR + BNX2_L2CTX_HOST_BSEQ, bp->rx_prod_bseq); } -static void -bnx2_set_rx_ring_size(struct bnx2 *bp, u32 size) -{ - u32 num_rings, max; - - bp->rx_ring_size = size; - num_rings = 1; - while (size > MAX_RX_DESC_CNT) { - size -= MAX_RX_DESC_CNT; - num_rings++; - } - /* round to next power of 2 */ - max = MAX_RX_RINGS; - while ((max & num_rings) == 0) - max >>= 1; - - if (num_rings != max) - max <<= 1; - - bp->rx_max_ring = max; - bp->rx_max_ring_idx = (bp->rx_max_ring * RX_DESC_CNT) - 1; -} - static void bnx2_free_tx_skbs(struct bnx2 *bp) { @@ -3649,7 +3405,7 @@ bnx2_free_tx_skbs(struct bnx2 *bp) skb_shinfo(skb)->frags[j].size, PCI_DMA_TODEVICE); } - dev_kfree_skb(skb); + dev_kfree_skb_any(skb); i += j + 1; } @@ -3663,7 +3419,7 @@ bnx2_free_rx_skbs(struct bnx2 *bp) if (bp->rx_buf_ring == NULL) return; - for (i = 0; i < bp->rx_max_ring_idx; i++) { + for (i = 0; i < RX_DESC_CNT; i++) { struct sw_bd *rx_buf = &bp->rx_buf_ring[i]; struct sk_buff *skb = rx_buf->skb; @@ -3675,7 +3431,7 @@ bnx2_free_rx_skbs(struct bnx2 *bp) rx_buf->skb = NULL; - dev_kfree_skb(skb); + dev_kfree_skb_any(skb); } } @@ -3696,9 +3452,7 @@ bnx2_reset_nic(struct bnx2 *bp, u32 reset_code) if (rc) return rc; - if ((rc = bnx2_init_chip(bp)) != 0) - return rc; - + bnx2_init_chip(bp); bnx2_init_tx_ring(bp); bnx2_init_rx_ring(bp); return 0; @@ -3722,7 +3476,7 @@ bnx2_test_registers(struct bnx2 *bp) { int ret; int i; - static const struct { + static struct { u16 offset; u16 flags; u32 rw_mask; @@ -3752,9 +3506,74 @@ bnx2_test_registers(struct bnx2 *bp) { 0x0c00, 0, 0x00000000, 0x00000001 }, { 0x0c04, 0, 0x00000000, 0x03ff0001 }, { 0x0c08, 0, 0x0f0ff073, 0x00000000 }, + { 0x0c0c, 0, 0x00ffffff, 0x00000000 }, + { 0x0c30, 0, 0x00000000, 0xffffffff }, + { 0x0c34, 0, 0x00000000, 0xffffffff }, + { 0x0c38, 0, 0x00000000, 0xffffffff }, + { 0x0c3c, 0, 0x00000000, 0xffffffff }, + { 0x0c40, 0, 0x00000000, 0xffffffff }, + { 0x0c44, 0, 0x00000000, 0xffffffff }, + { 0x0c48, 0, 0x00000000, 0x0007ffff }, + { 0x0c4c, 0, 0x00000000, 0xffffffff }, + { 0x0c50, 0, 0x00000000, 0xffffffff }, + { 0x0c54, 0, 0x00000000, 0xffffffff }, + { 0x0c58, 0, 0x00000000, 0xffffffff }, + { 0x0c5c, 0, 0x00000000, 0xffffffff }, + { 0x0c60, 0, 0x00000000, 0xffffffff }, + { 0x0c64, 0, 0x00000000, 0xffffffff }, + { 0x0c68, 0, 0x00000000, 0xffffffff }, + { 0x0c6c, 0, 0x00000000, 0xffffffff }, + { 0x0c70, 0, 0x00000000, 0xffffffff }, + { 0x0c74, 0, 0x00000000, 0xffffffff }, + { 0x0c78, 0, 0x00000000, 0xffffffff }, + { 0x0c7c, 0, 0x00000000, 0xffffffff }, + { 0x0c80, 0, 0x00000000, 0xffffffff }, + { 0x0c84, 0, 0x00000000, 0xffffffff }, + { 0x0c88, 0, 0x00000000, 0xffffffff }, + { 0x0c8c, 0, 0x00000000, 0xffffffff }, + { 0x0c90, 0, 0x00000000, 0xffffffff }, + { 0x0c94, 0, 0x00000000, 0xffffffff }, + { 0x0c98, 0, 0x00000000, 0xffffffff }, + { 0x0c9c, 0, 0x00000000, 0xffffffff }, + { 0x0ca0, 0, 0x00000000, 0xffffffff }, + { 0x0ca4, 0, 0x00000000, 0xffffffff }, + { 0x0ca8, 0, 0x00000000, 0x0007ffff }, + { 0x0cac, 0, 0x00000000, 0xffffffff }, + { 0x0cb0, 0, 0x00000000, 0xffffffff }, + { 0x0cb4, 0, 0x00000000, 0xffffffff }, + { 0x0cb8, 0, 0x00000000, 0xffffffff }, + { 0x0cbc, 0, 0x00000000, 0xffffffff }, + { 0x0cc0, 0, 0x00000000, 0xffffffff }, + { 0x0cc4, 0, 0x00000000, 0xffffffff }, + { 0x0cc8, 0, 0x00000000, 0xffffffff }, + { 0x0ccc, 0, 0x00000000, 0xffffffff }, + { 0x0cd0, 0, 0x00000000, 0xffffffff }, + { 0x0cd4, 0, 0x00000000, 0xffffffff }, + { 0x0cd8, 0, 0x00000000, 0xffffffff }, + { 0x0cdc, 0, 0x00000000, 0xffffffff }, + { 0x0ce0, 0, 0x00000000, 0xffffffff }, + { 0x0ce4, 0, 0x00000000, 0xffffffff }, + { 0x0ce8, 0, 0x00000000, 0xffffffff }, + { 0x0cec, 0, 0x00000000, 0xffffffff }, + { 0x0cf0, 0, 0x00000000, 0xffffffff }, + { 0x0cf4, 0, 0x00000000, 0xffffffff }, + { 0x0cf8, 0, 0x00000000, 0xffffffff }, + { 0x0cfc, 0, 0x00000000, 0xffffffff }, + { 0x0d00, 0, 0x00000000, 0xffffffff }, + { 0x0d04, 0, 0x00000000, 0xffffffff }, { 0x1000, 0, 0x00000000, 0x00000001 }, { 0x1004, 0, 0x00000000, 0x000f0001 }, + { 0x1044, 0, 0x00000000, 0xffc003ff }, + { 0x1080, 0, 0x00000000, 0x0001ffff }, + { 0x1084, 0, 0x00000000, 0xffffffff }, + { 0x1088, 0, 0x00000000, 0xffffffff }, + { 0x108c, 0, 0x00000000, 0xffffffff }, + { 0x1090, 0, 0x00000000, 0xffffffff }, + { 0x1094, 0, 0x00000000, 0xffffffff }, + { 0x1098, 0, 0x00000000, 0xffffffff }, + { 0x109c, 0, 0x00000000, 0xffffffff }, + { 0x10a0, 0, 0x00000000, 0xffffffff }, { 0x1408, 0, 0x01c00800, 0x00000000 }, { 0x149c, 0, 0x8000ffff, 0x00000000 }, @@ -3766,9 +3585,111 @@ bnx2_test_registers(struct bnx2 *bp) { 0x14c4, 0, 0x00003fff, 0x00000000 }, { 0x14cc, 0, 0x00000000, 0x00000001 }, { 0x14d0, 0, 0xffffffff, 0x00000000 }, + { 0x1500, 0, 0x00000000, 0xffffffff }, + { 0x1504, 0, 0x00000000, 0xffffffff }, + { 0x1508, 0, 0x00000000, 0xffffffff }, + { 0x150c, 0, 0x00000000, 0xffffffff }, + { 0x1510, 0, 0x00000000, 0xffffffff }, + { 0x1514, 0, 0x00000000, 0xffffffff }, + { 0x1518, 0, 0x00000000, 0xffffffff }, + { 0x151c, 0, 0x00000000, 0xffffffff }, + { 0x1520, 0, 0x00000000, 0xffffffff }, + { 0x1524, 0, 0x00000000, 0xffffffff }, + { 0x1528, 0, 0x00000000, 0xffffffff }, + { 0x152c, 0, 0x00000000, 0xffffffff }, + { 0x1530, 0, 0x00000000, 0xffffffff }, + { 0x1534, 0, 0x00000000, 0xffffffff }, + { 0x1538, 0, 0x00000000, 0xffffffff }, + { 0x153c, 0, 0x00000000, 0xffffffff }, + { 0x1540, 0, 0x00000000, 0xffffffff }, + { 0x1544, 0, 0x00000000, 0xffffffff }, + { 0x1548, 0, 0x00000000, 0xffffffff }, + { 0x154c, 0, 0x00000000, 0xffffffff }, + { 0x1550, 0, 0x00000000, 0xffffffff }, + { 0x1554, 0, 0x00000000, 0xffffffff }, + { 0x1558, 0, 0x00000000, 0xffffffff }, + { 0x1600, 0, 0x00000000, 0xffffffff }, + { 0x1604, 0, 0x00000000, 0xffffffff }, + { 0x1608, 0, 0x00000000, 0xffffffff }, + { 0x160c, 0, 0x00000000, 0xffffffff }, + { 0x1610, 0, 0x00000000, 0xffffffff }, + { 0x1614, 0, 0x00000000, 0xffffffff }, + { 0x1618, 0, 0x00000000, 0xffffffff }, + { 0x161c, 0, 0x00000000, 0xffffffff }, + { 0x1620, 0, 0x00000000, 0xffffffff }, + { 0x1624, 0, 0x00000000, 0xffffffff }, + { 0x1628, 0, 0x00000000, 0xffffffff }, + { 0x162c, 0, 0x00000000, 0xffffffff }, + { 0x1630, 0, 0x00000000, 0xffffffff }, + { 0x1634, 0, 0x00000000, 0xffffffff }, + { 0x1638, 0, 0x00000000, 0xffffffff }, + { 0x163c, 0, 0x00000000, 0xffffffff }, + { 0x1640, 0, 0x00000000, 0xffffffff }, + { 0x1644, 0, 0x00000000, 0xffffffff }, + { 0x1648, 0, 0x00000000, 0xffffffff }, + { 0x164c, 0, 0x00000000, 0xffffffff }, + { 0x1650, 0, 0x00000000, 0xffffffff }, + { 0x1654, 0, 0x00000000, 0xffffffff }, { 0x1800, 0, 0x00000000, 0x00000001 }, { 0x1804, 0, 0x00000000, 0x00000003 }, + { 0x1840, 0, 0x00000000, 0xffffffff }, + { 0x1844, 0, 0x00000000, 0xffffffff }, + { 0x1848, 0, 0x00000000, 0xffffffff }, + { 0x184c, 0, 0x00000000, 0xffffffff }, + { 0x1850, 0, 0x00000000, 0xffffffff }, + { 0x1900, 0, 0x7ffbffff, 0x00000000 }, + { 0x1904, 0, 0xffffffff, 0x00000000 }, + { 0x190c, 0, 0xffffffff, 0x00000000 }, + { 0x1914, 0, 0xffffffff, 0x00000000 }, + { 0x191c, 0, 0xffffffff, 0x00000000 }, + { 0x1924, 0, 0xffffffff, 0x00000000 }, + { 0x192c, 0, 0xffffffff, 0x00000000 }, + { 0x1934, 0, 0xffffffff, 0x00000000 }, + { 0x193c, 0, 0xffffffff, 0x00000000 }, + { 0x1944, 0, 0xffffffff, 0x00000000 }, + { 0x194c, 0, 0xffffffff, 0x00000000 }, + { 0x1954, 0, 0xffffffff, 0x00000000 }, + { 0x195c, 0, 0xffffffff, 0x00000000 }, + { 0x1964, 0, 0xffffffff, 0x00000000 }, + { 0x196c, 0, 0xffffffff, 0x00000000 }, + { 0x1974, 0, 0xffffffff, 0x00000000 }, + { 0x197c, 0, 0xffffffff, 0x00000000 }, + { 0x1980, 0, 0x0700ffff, 0x00000000 }, + + { 0x1c00, 0, 0x00000000, 0x00000001 }, + { 0x1c04, 0, 0x00000000, 0x00000003 }, + { 0x1c08, 0, 0x0000000f, 0x00000000 }, + { 0x1c40, 0, 0x00000000, 0xffffffff }, + { 0x1c44, 0, 0x00000000, 0xffffffff }, + { 0x1c48, 0, 0x00000000, 0xffffffff }, + { 0x1c4c, 0, 0x00000000, 0xffffffff }, + { 0x1c50, 0, 0x00000000, 0xffffffff }, + { 0x1d00, 0, 0x7ffbffff, 0x00000000 }, + { 0x1d04, 0, 0xffffffff, 0x00000000 }, + { 0x1d0c, 0, 0xffffffff, 0x00000000 }, + { 0x1d14, 0, 0xffffffff, 0x00000000 }, + { 0x1d1c, 0, 0xffffffff, 0x00000000 }, + { 0x1d24, 0, 0xffffffff, 0x00000000 }, + { 0x1d2c, 0, 0xffffffff, 0x00000000 }, + { 0x1d34, 0, 0xffffffff, 0x00000000 }, + { 0x1d3c, 0, 0xffffffff, 0x00000000 }, + { 0x1d44, 0, 0xffffffff, 0x00000000 }, + { 0x1d4c, 0, 0xffffffff, 0x00000000 }, + { 0x1d54, 0, 0xffffffff, 0x00000000 }, + { 0x1d5c, 0, 0xffffffff, 0x00000000 }, + { 0x1d64, 0, 0xffffffff, 0x00000000 }, + { 0x1d6c, 0, 0xffffffff, 0x00000000 }, + { 0x1d74, 0, 0xffffffff, 0x00000000 }, + { 0x1d7c, 0, 0xffffffff, 0x00000000 }, + { 0x1d80, 0, 0x0700ffff, 0x00000000 }, + + { 0x2004, 0, 0x00000000, 0x0337000f }, + { 0x2008, 0, 0xffffffff, 0x00000000 }, + { 0x200c, 0, 0xffffffff, 0x00000000 }, + { 0x2010, 0, 0xffffffff, 0x00000000 }, + { 0x2014, 0, 0x801fff80, 0x00000000 }, + { 0x2018, 0, 0x000003ff, 0x00000000 }, { 0x2800, 0, 0x00000000, 0x00000001 }, { 0x2804, 0, 0x00000000, 0x00003f01 }, @@ -3786,6 +3707,16 @@ bnx2_test_registers(struct bnx2 *bp) { 0x2c00, 0, 0x00000000, 0x00000011 }, { 0x2c04, 0, 0x00000000, 0x00030007 }, + { 0x3000, 0, 0x00000000, 0x00000001 }, + { 0x3004, 0, 0x00000000, 0x007007ff }, + { 0x3008, 0, 0x00000003, 0x00000000 }, + { 0x300c, 0, 0xffffffff, 0x00000000 }, + { 0x3010, 0, 0xffffffff, 0x00000000 }, + { 0x3014, 0, 0xffffffff, 0x00000000 }, + { 0x3034, 0, 0xffffffff, 0x00000000 }, + { 0x3038, 0, 0xffffffff, 0x00000000 }, + { 0x3050, 0, 0x00000001, 0x00000000 }, + { 0x3c00, 0, 0x00000000, 0x00000001 }, { 0x3c04, 0, 0x00000000, 0x00070000 }, { 0x3c08, 0, 0x00007f71, 0x07f00000 }, @@ -3795,11 +3726,88 @@ bnx2_test_registers(struct bnx2 *bp) { 0x3c18, 0, 0x00000000, 0xffffffff }, { 0x3c1c, 0, 0xfffff000, 0x00000000 }, { 0x3c20, 0, 0xffffff00, 0x00000000 }, + { 0x3c24, 0, 0xffffffff, 0x00000000 }, + { 0x3c28, 0, 0xffffffff, 0x00000000 }, + { 0x3c2c, 0, 0xffffffff, 0x00000000 }, + { 0x3c30, 0, 0xffffffff, 0x00000000 }, + { 0x3c34, 0, 0xffffffff, 0x00000000 }, + { 0x3c38, 0, 0xffffffff, 0x00000000 }, + { 0x3c3c, 0, 0xffffffff, 0x00000000 }, + { 0x3c40, 0, 0xffffffff, 0x00000000 }, + { 0x3c44, 0, 0xffffffff, 0x00000000 }, + { 0x3c48, 0, 0xffffffff, 0x00000000 }, + { 0x3c4c, 0, 0xffffffff, 0x00000000 }, + { 0x3c50, 0, 0xffffffff, 0x00000000 }, + { 0x3c54, 0, 0xffffffff, 0x00000000 }, + { 0x3c58, 0, 0xffffffff, 0x00000000 }, + { 0x3c5c, 0, 0xffffffff, 0x00000000 }, + { 0x3c60, 0, 0xffffffff, 0x00000000 }, + { 0x3c64, 0, 0xffffffff, 0x00000000 }, + { 0x3c68, 0, 0xffffffff, 0x00000000 }, + { 0x3c6c, 0, 0xffffffff, 0x00000000 }, + { 0x3c70, 0, 0xffffffff, 0x00000000 }, + { 0x3c74, 0, 0x0000003f, 0x00000000 }, + { 0x3c78, 0, 0x00000000, 0x00000000 }, + { 0x3c7c, 0, 0x00000000, 0x00000000 }, + { 0x3c80, 0, 0x3fffffff, 0x00000000 }, + { 0x3c84, 0, 0x0000003f, 0x00000000 }, + { 0x3c88, 0, 0x00000000, 0xffffffff }, + { 0x3c8c, 0, 0x00000000, 0xffffffff }, + + { 0x4000, 0, 0x00000000, 0x00000001 }, + { 0x4004, 0, 0x00000000, 0x00030000 }, + { 0x4008, 0, 0x00000ff0, 0x00000000 }, + { 0x400c, 0, 0xffffffff, 0x00000000 }, + { 0x4088, 0, 0x00000000, 0x00070303 }, + + { 0x4400, 0, 0x00000000, 0x00000001 }, + { 0x4404, 0, 0x00000000, 0x00003f01 }, + { 0x4408, 0, 0x7fff00ff, 0x00000000 }, + { 0x440c, 0, 0xffffffff, 0x00000000 }, + { 0x4410, 0, 0xffff, 0x0000 }, + { 0x4414, 0, 0xffff, 0x0000 }, + { 0x4418, 0, 0xffff, 0x0000 }, + { 0x441c, 0, 0xffff, 0x0000 }, + { 0x4428, 0, 0xffffffff, 0x00000000 }, + { 0x442c, 0, 0xffffffff, 0x00000000 }, + { 0x4430, 0, 0xffffffff, 0x00000000 }, + { 0x4434, 0, 0xffffffff, 0x00000000 }, + { 0x4438, 0, 0xffffffff, 0x00000000 }, + { 0x443c, 0, 0xffffffff, 0x00000000 }, + { 0x4440, 0, 0xffffffff, 0x00000000 }, + { 0x4444, 0, 0xffffffff, 0x00000000 }, + + { 0x4c00, 0, 0x00000000, 0x00000001 }, + { 0x4c04, 0, 0x00000000, 0x0000003f }, + { 0x4c08, 0, 0xffffffff, 0x00000000 }, + { 0x4c0c, 0, 0x0007fc00, 0x00000000 }, + { 0x4c10, 0, 0x80003fe0, 0x00000000 }, + { 0x4c14, 0, 0xffffffff, 0x00000000 }, + { 0x4c44, 0, 0x00000000, 0x9fff9fff }, + { 0x4c48, 0, 0x00000000, 0xb3009fff }, + { 0x4c4c, 0, 0x00000000, 0x77f33b30 }, + { 0x4c50, 0, 0x00000000, 0xffffffff }, { 0x5004, 0, 0x00000000, 0x0000007f }, { 0x5008, 0, 0x0f0007ff, 0x00000000 }, { 0x500c, 0, 0xf800f800, 0x07ff07ff }, + { 0x5400, 0, 0x00000008, 0x00000001 }, + { 0x5404, 0, 0x00000000, 0x0000003f }, + { 0x5408, 0, 0x0000001f, 0x00000000 }, + { 0x540c, 0, 0xffffffff, 0x00000000 }, + { 0x5410, 0, 0xffffffff, 0x00000000 }, + { 0x5414, 0, 0x0000ffff, 0x00000000 }, + { 0x5418, 0, 0x0000ffff, 0x00000000 }, + { 0x541c, 0, 0x0000ffff, 0x00000000 }, + { 0x5420, 0, 0x0000ffff, 0x00000000 }, + { 0x5428, 0, 0x000000ff, 0x00000000 }, + { 0x542c, 0, 0xff00ffff, 0x00000000 }, + { 0x5430, 0, 0x001fff80, 0x00000000 }, + { 0x5438, 0, 0xffffffff, 0x00000000 }, + { 0x543c, 0, 0xffffffff, 0x00000000 }, + { 0x5440, 0, 0xf800f800, 0x07ff07ff }, + { 0x5c00, 0, 0x00000000, 0x00000001 }, { 0x5c04, 0, 0x00000000, 0x0003000f }, { 0x5c08, 0, 0x00000003, 0x00000000 }, @@ -3883,7 +3891,7 @@ reg_test_err: static int bnx2_do_mem_test(struct bnx2 *bp, u32 start, u32 size) { - static const u32 test_pattern[] = { 0x00000000, 0xffffffff, 0x55555555, + static u32 test_pattern[] = { 0x00000000, 0xffffffff, 0x55555555, 0xaaaaaaaa , 0xaa55aa55, 0x55aa55aa }; int i; @@ -3908,7 +3916,7 @@ bnx2_test_memory(struct bnx2 *bp) { int ret = 0; int i; - static const struct { + static struct { u32 offset; u32 len; } mem_tbl[] = { @@ -3941,6 +3949,7 @@ bnx2_run_loopback(struct bnx2 *bp, int loopback_mode) struct sk_buff *skb, *rx_skb; unsigned char *packet; u16 rx_start_idx, rx_idx; + u32 val; dma_addr_t map; struct tx_bd *txbd; struct sw_bd *rx_buf; @@ -3959,7 +3968,7 @@ bnx2_run_loopback(struct bnx2 *bp, int loopback_mode) return -EINVAL; pkt_size = 1514; - skb = netdev_alloc_skb(bp->dev, pkt_size); + skb = dev_alloc_skb(pkt_size); if (!skb) return -ENOMEM; packet = skb_put(skb, pkt_size); @@ -3971,9 +3980,8 @@ bnx2_run_loopback(struct bnx2 *bp, int loopback_mode) map = pci_map_single(bp->pdev, skb->data, pkt_size, PCI_DMA_TODEVICE); - REG_WR(bp, BNX2_HC_COMMAND, - bp->hc_cmd | BNX2_HC_COMMAND_COAL_NOW_WO_INT); - + val = REG_RD(bp, BNX2_HC_COMMAND); + REG_WR(bp, BNX2_HC_COMMAND, val | BNX2_HC_COMMAND_COAL_NOW_WO_INT); REG_RD(bp, BNX2_HC_COMMAND); udelay(5); @@ -3997,15 +4005,14 @@ bnx2_run_loopback(struct bnx2 *bp, int loopback_mode) udelay(100); - REG_WR(bp, BNX2_HC_COMMAND, - bp->hc_cmd | BNX2_HC_COMMAND_COAL_NOW_WO_INT); - + val = REG_RD(bp, BNX2_HC_COMMAND); + REG_WR(bp, BNX2_HC_COMMAND, val | BNX2_HC_COMMAND_COAL_NOW_WO_INT); REG_RD(bp, BNX2_HC_COMMAND); udelay(5); pci_unmap_single(bp->pdev, map, pkt_size, PCI_DMA_TODEVICE); - dev_kfree_skb(skb); + dev_kfree_skb_irq(skb); if (bp->status_blk->status_tx_quick_consumer_index0 != bp->tx_prod) { goto loopback_test_done; @@ -4135,6 +4142,7 @@ static int bnx2_test_intr(struct bnx2 *bp) { int i; + u32 val; u16 status_idx; if (!netif_running(bp->dev)) @@ -4143,7 +4151,8 @@ bnx2_test_intr(struct bnx2 *bp) status_idx = REG_RD(bp, BNX2_PCICFG_INT_ACK_CMD) & 0xffff; /* This register is not touched during run-time. */ - REG_WR(bp, BNX2_HC_COMMAND, bp->hc_cmd | BNX2_HC_COMMAND_COAL_NOW); + val = REG_RD(bp, BNX2_HC_COMMAND); + REG_WR(bp, BNX2_HC_COMMAND, val | BNX2_HC_COMMAND_COAL_NOW); REG_RD(bp, BNX2_HC_COMMAND); for (i = 0; i < 10; i++) { @@ -4176,8 +4185,6 @@ 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)) { @@ -4267,11 +4274,11 @@ bnx2_open(struct net_device *dev) } else { rc = request_irq(bp->pdev->irq, bnx2_interrupt, - IRQF_SHARED, dev->name, dev); + SA_SHIRQ, dev->name, dev); } } else { - rc = request_irq(bp->pdev->irq, bnx2_interrupt, IRQF_SHARED, + rc = request_irq(bp->pdev->irq, bnx2_interrupt, SA_SHIRQ, dev->name, dev); } if (rc) { @@ -4318,7 +4325,7 @@ bnx2_open(struct net_device *dev) if (!rc) { rc = request_irq(bp->pdev->irq, bnx2_interrupt, - IRQF_SHARED, dev->name, dev); + SA_SHIRQ, dev->name, dev); } if (rc) { bnx2_free_skbs(bp); @@ -4396,9 +4403,11 @@ bnx2_vlan_rx_kill_vid(struct net_device *dev, uint16_t vid) } #endif -/* Called with netif_tx_lock. - * bnx2_tx_int() runs without netif_tx_lock unless it needs to call - * netif_wake_queue(). +/* Called with dev->xmit_lock. + * hard_start_xmit is pseudo-lockless - a lock is only required when + * the tx queue is full. This way, we get the benefit of lockless + * operations most of the time without the complexities to handle + * netif_stop_queue/wake_queue race conditions. */ static int bnx2_start_xmit(struct sk_buff *skb, struct net_device *dev) @@ -4432,7 +4441,7 @@ bnx2_start_xmit(struct sk_buff *skb, struct net_device *dev) (TX_BD_FLAGS_VLAN_TAG | (vlan_tx_tag_get(skb) << 16)); } #ifdef BCM_TSO - if ((mss = skb_shinfo(skb)->gso_size) && + if ((mss = skb_shinfo(skb)->tso_size) && (skb->len > (bp->dev->mtu + ETH_HLEN))) { u32 tcp_opt_len, ip_tcp_len; @@ -4452,7 +4461,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 = htons(mss + ip_tcp_len + tcp_opt_len); + skb->nh.iph->tot_len = ntohs(mss + ip_tcp_len + tcp_opt_len); skb->h.th->check = ~csum_tcpudp_magic(skb->nh.iph->saddr, skb->nh.iph->daddr, @@ -4517,9 +4526,12 @@ 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) > bp->tx_wake_thresh) + + if (bnx2_tx_avail(bp) > MAX_SKB_FRAGS) netif_wake_queue(dev); + spin_unlock(&bp->tx_lock); } return NETDEV_TX_OK; @@ -4542,7 +4554,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_LNK_DN; + reset_code = BNX2_DRV_MSG_CODE_UNLOAD; else if (bp->wol) reset_code = BNX2_DRV_MSG_CODE_SUSPEND_WOL; else @@ -4643,10 +4655,6 @@ 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; } @@ -4786,64 +4794,6 @@ bnx2_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info) info->fw_version[5] = 0; } -#define BNX2_REGDUMP_LEN (32 * 1024) - -static int -bnx2_get_regs_len(struct net_device *dev) -{ - return BNX2_REGDUMP_LEN; -} - -static void -bnx2_get_regs(struct net_device *dev, struct ethtool_regs *regs, void *_p) -{ - u32 *p = _p, i, offset; - u8 *orig_p = _p; - struct bnx2 *bp = netdev_priv(dev); - u32 reg_boundaries[] = { 0x0000, 0x0098, 0x0400, 0x045c, - 0x0800, 0x0880, 0x0c00, 0x0c10, - 0x0c30, 0x0d08, 0x1000, 0x101c, - 0x1040, 0x1048, 0x1080, 0x10a4, - 0x1400, 0x1490, 0x1498, 0x14f0, - 0x1500, 0x155c, 0x1580, 0x15dc, - 0x1600, 0x1658, 0x1680, 0x16d8, - 0x1800, 0x1820, 0x1840, 0x1854, - 0x1880, 0x1894, 0x1900, 0x1984, - 0x1c00, 0x1c0c, 0x1c40, 0x1c54, - 0x1c80, 0x1c94, 0x1d00, 0x1d84, - 0x2000, 0x2030, 0x23c0, 0x2400, - 0x2800, 0x2820, 0x2830, 0x2850, - 0x2b40, 0x2c10, 0x2fc0, 0x3058, - 0x3c00, 0x3c94, 0x4000, 0x4010, - 0x4080, 0x4090, 0x43c0, 0x4458, - 0x4c00, 0x4c18, 0x4c40, 0x4c54, - 0x4fc0, 0x5010, 0x53c0, 0x5444, - 0x5c00, 0x5c18, 0x5c80, 0x5c90, - 0x5fc0, 0x6000, 0x6400, 0x6428, - 0x6800, 0x6848, 0x684c, 0x6860, - 0x6888, 0x6910, 0x8000 }; - - regs->version = 0; - - memset(p, 0, BNX2_REGDUMP_LEN); - - if (!netif_running(bp->dev)) - return; - - i = 0; - offset = reg_boundaries[0]; - p += offset; - while (offset < BNX2_REGDUMP_LEN) { - *p++ = REG_RD(bp, offset); - offset += 4; - if (offset == reg_boundaries[i + 1]) { - offset = reg_boundaries[i + 2]; - p = (u32 *) (orig_p + offset); - i += 2; - } - } -} - static void bnx2_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol) { @@ -5029,7 +4979,7 @@ bnx2_get_ringparam(struct net_device *dev, struct ethtool_ringparam *ering) { struct bnx2 *bp = netdev_priv(dev); - ering->rx_max_pending = MAX_TOTAL_RX_DESC_CNT; + ering->rx_max_pending = MAX_RX_DESC_CNT; ering->rx_mini_max_pending = 0; ering->rx_jumbo_max_pending = 0; @@ -5046,28 +4996,17 @@ bnx2_set_ringparam(struct net_device *dev, struct ethtool_ringparam *ering) { struct bnx2 *bp = netdev_priv(dev); - if ((ering->rx_pending > MAX_TOTAL_RX_DESC_CNT) || + if ((ering->rx_pending > MAX_RX_DESC_CNT) || (ering->tx_pending > MAX_TX_DESC_CNT) || (ering->tx_pending <= MAX_SKB_FRAGS)) { return -EINVAL; } - if (netif_running(bp->dev)) { - bnx2_netif_stop(bp); - bnx2_reset_chip(bp, BNX2_DRV_MSG_CODE_RESET); - bnx2_free_skbs(bp); - bnx2_free_mem(bp); - } - - bnx2_set_rx_ring_size(bp, ering->rx_pending); + bp->rx_ring_size = ering->rx_pending; bp->tx_ring_size = ering->tx_pending; if (netif_running(bp->dev)) { - int rc; - - rc = bnx2_alloc_mem(bp); - if (rc) - return rc; + bnx2_netif_stop(bp); bnx2_init_nic(bp); bnx2_netif_start(bp); } @@ -5129,17 +5068,7 @@ bnx2_set_rx_csum(struct net_device *dev, u32 data) return 0; } -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 +#define BNX2_NUM_STATS 45 static struct { char string[ETH_GSTRING_LEN]; @@ -5189,12 +5118,11 @@ 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) -static const unsigned long bnx2_stats_offset_arr[BNX2_NUM_STATS] = { +static unsigned long bnx2_stats_offset_arr[BNX2_NUM_STATS] = { STATS_OFFSET32(stat_IfHCInOctets_hi), STATS_OFFSET32(stat_IfHCInBadOctets_hi), STATS_OFFSET32(stat_IfHCOutOctets_hi), @@ -5240,7 +5168,6 @@ 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 @@ -5251,7 +5178,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] = { @@ -5259,7 +5186,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 @@ -5433,8 +5360,6 @@ static struct ethtool_ops bnx2_ethtool_ops = { .get_settings = bnx2_get_settings, .set_settings = bnx2_set_settings, .get_drvinfo = bnx2_get_drvinfo, - .get_regs_len = bnx2_get_regs_len, - .get_regs = bnx2_get_regs, .get_wol = bnx2_get_wol, .set_wol = bnx2_set_wol, .nway_reset = bnx2_nway_reset, @@ -5456,7 +5381,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 = bnx2_set_tso, + .set_tso = ethtool_op_set_tso, #endif .self_test_count = bnx2_self_test_count, .self_test = bnx2_self_test, @@ -5577,20 +5502,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) { - dev_err(&pdev->dev, "Cannot enable PCI device, aborting."); + printk(KERN_ERR PFX "Cannot enable PCI device, aborting."); goto err_out; } if (!(pci_resource_flags(pdev, 0) & IORESOURCE_MEM)) { - dev_err(&pdev->dev, - "Cannot find PCI device base address, aborting.\n"); + printk(KERN_ERR PFX "Cannot find PCI device base address, " + "aborting.\n"); rc = -ENODEV; goto err_out_disable; } rc = pci_request_regions(pdev, DRV_MODULE_NAME); if (rc) { - dev_err(&pdev->dev, "Cannot obtain PCI resources, aborting.\n"); + printk(KERN_ERR PFX "Cannot obtain PCI resources, aborting.\n"); goto err_out_disable; } @@ -5598,15 +5523,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) { - dev_err(&pdev->dev, - "Cannot find power management capability, aborting.\n"); + printk(KERN_ERR PFX "Cannot find power management capability, " + "aborting.\n"); rc = -EIO; goto err_out_release; } bp->pcix_cap = pci_find_capability(pdev, PCI_CAP_ID_PCIX); if (bp->pcix_cap == 0) { - dev_err(&pdev->dev, "Cannot find PCIX capability, aborting.\n"); + printk(KERN_ERR PFX "Cannot find PCIX capability, aborting.\n"); rc = -EIO; goto err_out_release; } @@ -5614,14 +5539,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) { - dev_err(&pdev->dev, - "pci_set_consistent_dma_mask failed, aborting.\n"); + printk(KERN_ERR PFX "pci_set_consistent_dma_mask " + "failed, aborting.\n"); rc = -EIO; goto err_out_release; } } else if (pci_set_dma_mask(pdev, DMA_32BIT_MASK) != 0) { - dev_err(&pdev->dev, "System does not support DMA, aborting.\n"); + printk(KERN_ERR PFX "System does not support DMA, aborting.\n"); rc = -EIO; goto err_out_release; } @@ -5630,6 +5555,7 @@ 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); @@ -5640,7 +5566,7 @@ bnx2_init_board(struct pci_dev *pdev, struct net_device *dev) bp->regview = ioremap_nocache(dev->base_addr, mem_len); if (!bp->regview) { - dev_err(&pdev->dev, "Cannot map register space, aborting.\n"); + printk(KERN_ERR PFX "Cannot map register space, aborting.\n"); rc = -ENOMEM; goto err_out_release; } @@ -5712,8 +5638,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)) { - dev_err(&pdev->dev, - "5706 A1 can only be used in a PCIX bus, aborting.\n"); + printk(KERN_ERR PFX "5706 A1 can only be used in a PCIX bus, " + "aborting.\n"); goto err_out_unmap; } @@ -5734,7 +5660,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) { - dev_err(&pdev->dev, "Firmware not running, aborting.\n"); + printk(KERN_ERR PFX "Firmware not running, aborting.\n"); rc = -ENODEV; goto err_out_unmap; } @@ -5752,7 +5678,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, 255); + bp->rx_ring_size = 100; bp->rx_csum = 1; @@ -5788,9 +5714,7 @@ bnx2_init_board(struct pci_dev *pdev, struct net_device *dev) } } - if ((CHIP_ID(bp) == CHIP_ID_5708_A0) || - (CHIP_ID(bp) == CHIP_ID_5708_B0) || - (CHIP_ID(bp) == CHIP_ID_5708_B1)) + if (CHIP_NUM(bp) == CHIP_NUM_5708) bp->flags |= NO_WOL_FLAG; if (CHIP_ID(bp) == CHIP_ID_5706_A0) { @@ -5896,7 +5820,7 @@ bnx2_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) #endif if ((rc = register_netdev(dev))) { - dev_err(&pdev->dev, "Cannot register net device\n"); + printk(KERN_ERR PFX "Cannot register net device\n"); if (bp->regview) iounmap(bp->regview); pci_release_regions(pdev); @@ -5936,7 +5860,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 | NETIF_F_TSO_ECN; + dev->features |= NETIF_F_TSO; #endif netif_carrier_off(bp->dev); @@ -5973,12 +5897,11 @@ bnx2_suspend(struct pci_dev *pdev, pm_message_t state) if (!netif_running(dev)) return 0; - flush_scheduled_work(); bnx2_netif_stop(bp); netif_device_detach(dev); del_timer_sync(&bp->timer); if (bp->flags & NO_WOL_FLAG) - reset_code = BNX2_DRV_MSG_CODE_UNLOAD_LNK_DN; + reset_code = BNX2_DRV_MSG_CODE_UNLOAD; 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 fe804763c..9f691cbd6 100644 --- a/drivers/net/bnx2.h +++ b/drivers/net/bnx2.h @@ -13,6 +13,45 @@ #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 +#include + /* Hardware data structures and register definitions automatically * generated from RTL code. Do not modify. */ @@ -231,7 +270,6 @@ struct statistics_block { u32 stat_GenStat13; u32 stat_GenStat14; u32 stat_GenStat15; - u32 stat_FwRxDrop; }; @@ -3482,8 +3520,6 @@ struct l2_fhdr { #define BNX2_COM_SCRATCH 0x00120000 -#define BNX2_FW_RX_DROP_COUNT 0x00120084 - /* * cp_reg definition @@ -3750,21 +3786,14 @@ struct l2_fhdr { #define DMA_READ_CHANS 5 #define DMA_WRITE_CHANS 3 -/* 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_BITS 12 #define BCM_PAGE_SIZE (1 << BCM_PAGE_BITS) #define TX_DESC_CNT (BCM_PAGE_SIZE / sizeof(struct tx_bd)) #define MAX_TX_DESC_CNT (TX_DESC_CNT - 1) -#define 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)) ? \ @@ -3776,10 +3805,8 @@ struct l2_fhdr { (MAX_RX_DESC_CNT - 1)) ? \ (x) + 2 : (x) + 1 -#define RX_RING_IDX(x) ((x) & bp->rx_max_ring_idx) +#define RX_RING_IDX(x) ((x) & MAX_RX_DESC_CNT) -#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 @@ -3876,22 +3903,15 @@ struct bnx2 { struct status_block *status_blk; u32 last_status_idx; - 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. */ + struct tx_bd *tx_desc_ring; + struct sw_bd *tx_buf_ring; + u32 tx_prod_bseq; + u16 tx_prod; + u16 tx_cons; + int tx_ring_size; - u32 tx_prod_bseq __attribute__((aligned(L1_CACHE_BYTES))); - u16 tx_prod; - - u16 tx_cons __attribute__((aligned(L1_CACHE_BYTES))); - u16 hw_tx_cons; + u16 hw_tx_cons; + u16 hw_rx_cons; #ifdef BCM_VLAN struct vlan_group *vlgrp; @@ -3900,25 +3920,19 @@ struct bnx2 { u32 rx_offset; u32 rx_buf_use_size; /* useable size */ u32 rx_buf_size; /* with alignment */ - u32 rx_max_ring_idx; - + struct rx_bd *rx_desc_ring; + struct sw_bd *rx_buf_ring; u32 rx_prod_bseq; u16 rx_prod; u16 rx_cons; - u16 hw_rx_cons; u32 rx_csum; - 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; + /* Only used to synchronize netif_stop_queue/wake_queue when tx */ + /* ring is full */ + spinlock_t tx_lock; - /* End of fields used in the performance code paths. */ + /* End of fileds used in the performance code paths. */ char *name; @@ -3931,6 +3945,15 @@ struct bnx2 { /* 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 +#define ASF_ENABLE_FLAG 0x40 + u32 phy_flags; #define PHY_SERDES_FLAG 1 #define PHY_CRC_FIX_FLAG 2 @@ -3981,9 +4004,8 @@ struct bnx2 { dma_addr_t tx_desc_mapping; - int rx_max_ring; int rx_ring_size; - dma_addr_t rx_desc_mapping[MAX_RX_RINGS]; + dma_addr_t rx_desc_mapping; u16 tx_quick_cons_trip; u16 tx_quick_cons_trip_int; @@ -4007,7 +4029,6 @@ struct bnx2 { struct statistics_block *stats_blk; dma_addr_t stats_blk_mapping; - u32 hc_cmd; u32 rx_mode; u16 req_line_speed; @@ -4052,11 +4073,6 @@ struct bnx2 { 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); @@ -4172,7 +4188,6 @@ 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 diff --git a/drivers/net/bnx2_fw.h b/drivers/net/bnx2_fw.h index 2d753dca0..0c21bd849 100644 --- a/drivers/net/bnx2_fw.h +++ b/drivers/net/bnx2_fw.h @@ -7,662 +7,964 @@ * the Free Software Foundation, except as noted below. * * This file contains firmware data derived from proprietary unpublished - * source code, Copyright (c) 2004, 2005, 2006 Broadcom Corporation. + * source code, Copyright (c) 2004, 2005 Broadcom Corporation. * * Permission is hereby granted for the distribution of this firmware data * in hexadecimal or equivalent format, provided this copyright notice is * accompanying it. */ -static 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 = 0x1; +static int bnx2_COM_b06FwReleaseMinor = 0x0; +static int bnx2_COM_b06FwReleaseFix = 0x0; +static u32 bnx2_COM_b06FwStartAddr = 0x080008b4; +static u32 bnx2_COM_b06FwTextAddr = 0x08000000; +static int bnx2_COM_b06FwTextLen = 0x57bc; +static u32 bnx2_COM_b06FwDataAddr = 0x08005840; +static int bnx2_COM_b06FwDataLen = 0x0; +static u32 bnx2_COM_b06FwRodataAddr = 0x080057c0; +static int bnx2_COM_b06FwRodataLen = 0x58; +static u32 bnx2_COM_b06FwBssAddr = 0x08005860; +static int bnx2_COM_b06FwBssLen = 0x88; +static u32 bnx2_COM_b06FwSbssAddr = 0x08005840; +static int bnx2_COM_b06FwSbssLen = 0x1c; +static u32 bnx2_COM_b06FwText[(0x57bc/4) + 1] = { + 0x0a00022d, 0x00000000, 0x00000000, 0x0000000d, 0x636f6d20, 0x322e352e, + 0x38000000, 0x02050802, 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, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 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, 0x24425840, + 0x3c030800, 0x246358e8, 0xac400000, 0x0043202b, 0x1480fffd, 0x24420004, + 0x3c1d0800, 0x37bd7ffc, 0x03a0f021, 0x3c100800, 0x261008b4, 0x3c1c0800, + 0x279c5840, 0x0e0002f7, 0x00000000, 0x0000000d, 0x27bdffe8, 0x3c1a8000, + 0x3c020008, 0x0342d825, 0x3c036010, 0xafbf0010, 0x8c655000, 0x3c020800, + 0x24470f30, 0x3c040800, 0x24865860, 0x2402ff7f, 0x00a22824, 0x34a5380c, + 0xac655000, 0x00002821, 0x24020037, 0x24030c80, 0xaf420008, 0xaf430024, + 0xacc70000, 0x24a50001, 0x2ca20016, 0x1440fffc, 0x24c60004, 0x24845860, + 0x3c020800, 0x24420f3c, 0x3c030800, 0x24630e2c, 0xac820004, 0x3c020800, + 0x24420a2c, 0x3c050800, 0x24a51268, 0xac82000c, 0x3c020800, 0x244243dc, + 0xac830008, 0x3c030800, 0x24633698, 0xac820014, 0x3c020800, 0x24423c24, + 0xac830018, 0xac83001c, 0x3c030800, 0x24630f44, 0xac820024, 0x3c020800, + 0x244243ac, 0xac83002c, 0x3c030800, 0x246343cc, 0xac820030, 0x3c020800, + 0x244242f0, 0xac830034, 0x3c030800, 0x24633d78, 0xac82003c, 0x3c020800, + 0x24420fd4, 0xac850010, 0xac850020, 0xac830040, 0x0e0010b7, 0xac820050, + 0x8fbf0010, 0x03e00008, 0x27bd0018, 0x27bdffe0, 0xafb00010, 0x27500100, + 0xafbf0018, 0xafb10014, 0x9203000b, 0x24020003, 0x1462005b, 0x96110008, + 0x32220001, 0x10400009, 0x27430080, 0x8e020000, 0x96040014, 0x000211c2, + 0x00021040, 0x00621821, 0xa4640000, 0x0a0002d0, 0x3c020800, 0x3c020800, + 0x8c430020, 0x1060002a, 0x3c030800, 0x0e00148e, 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, + 0x946258ce, 0x8f840018, 0x3c032000, 0x00431025, 0xac82001c, 0x0e0014cc, + 0x24040001, 0x3c030800, 0x8c620040, 0x24420001, 0xac620040, 0x3c020800, + 0x8c430044, 0x32240004, 0x24630001, 0x10800017, 0xac430044, 0x8f4202b8, + 0x04430007, 0x8e020020, 0x3c040800, 0x8c830060, 0x24020001, 0x24630001, + 0x0a0002f2, 0xac830060, 0x3c060800, 0x8cc4005c, 0xaf420280, 0x96030016, + 0x00001021, 0xa7430284, 0x8e050004, 0x24840001, 0x3c031000, 0xaf450288, + 0xaf4302b8, 0x0a0002f2, 0xacc4005c, 0x32220002, 0x0a0002f2, 0x0002102b, + 0x3c026000, 0xac400808, 0x0000000d, 0x00001021, 0x8fbf0018, 0x8fb10014, + 0x8fb00010, 0x03e00008, 0x27bd0020, 0x27bdffc8, 0xafbf0034, 0xafbe0030, + 0xafb7002c, 0xafb60028, 0xafb50024, 0xafb40020, 0xafb3001c, 0xafb20018, + 0xafb10014, 0x0e000244, 0xafb00010, 0x3c170800, 0x3c160800, 0x24110020, + 0x24150030, 0x2794000c, 0x27930008, 0x3c124000, 0x3c1e0800, 0x8f820004, + 0x3c040800, 0x8c830020, 0x10430005, 0x8ee200a4, 0xaf830004, 0x0e001593, + 0x00000000, 0x8ee200a4, 0x8ec300a0, 0x10430004, 0x26c400a0, 0x94820002, + 0xa742009e, 0xaee300a4, 0x8f500000, 0x32020007, 0x1040ffee, 0x32020001, + 0x1040002c, 0x32020002, 0x8f420100, 0xaf420020, 0x8f430104, 0xaf4300a8, + 0x9342010b, 0x93630000, 0x306300ff, 0x10710005, 0x304400ff, 0x10750006, + 0x2c820016, 0x0a000333, 0x00000000, 0xaf940000, 0x0a000334, 0x2c820016, + 0xaf930000, 0x0a000334, 0x00000000, 0xaf800000, 0x14400005, 0x00041880, + 0x0e0003cc, 0x00000000, 0x0a000340, 0x00000000, 0x3c020800, 0x24425860, + 0x00621821, 0x8c620000, 0x0040f809, 0x00000000, 0x10400005, 0x3c030800, + 0x8f420104, 0x3c016020, 0xac220014, 0x3c030800, 0x8c620034, 0xaf520138, + 0x24420001, 0xac620034, 0x32020002, 0x1040001a, 0x32020004, 0x8f420140, + 0xaf420020, 0x93630000, 0x306300ff, 0x10710005, 0x00000000, 0x10750006, + 0x00000000, 0x0a00035d, 0x00000000, 0xaf940000, 0x0a00035e, 0x00000000, + 0xaf930000, 0x0a00035e, 0x00000000, 0xaf800000, 0x0e000c7b, 0x00000000, + 0x3c040800, 0x8c820038, 0xaf520178, 0x24420001, 0xac820038, 0x32020004, + 0x1040ffa4, 0x00000000, 0x8f420180, 0xaf420020, 0x93630000, 0x306300ff, + 0x10710005, 0x00000000, 0x10750006, 0x00000000, 0x0a000378, 0x00000000, + 0xaf940000, 0x0a000379, 0x00000000, 0xaf930000, 0x0a000379, 0x00000000, + 0xaf800000, 0x8f430180, 0x24020f00, 0x14620005, 0x00000000, 0x8f420188, + 0xa742009c, 0x0a000387, 0x8fc2003c, 0x93620000, 0x14510004, 0x8fc2003c, + 0x0e000bad, 0x00000000, 0x8fc2003c, 0xaf5201b8, 0x24420001, 0x0a00030b, + 0xafc2003c, 0x27bdffe8, 0xafbf0010, 0x97420108, 0x24033000, 0x30447000, + 0x10830016, 0x28823001, 0x10400007, 0x24024000, 0x1080000b, 0x24022000, + 0x1082000c, 0x00000000, 0x0a0003b3, 0x00000000, 0x10820010, 0x24025000, + 0x10820012, 0x00000000, 0x0a0003b3, 0x00000000, 0x0000000d, 0x0a0003b5, + 0x00001021, 0x0e000442, 0x00000000, 0x0a0003b6, 0x8fbf0010, 0x0e00041a, + 0x00000000, 0x0a0003b5, 0x00001021, 0x0e000669, 0x00000000, 0x0a0003b5, + 0x00001021, 0x0e001467, 0x00000000, 0x0a0003b5, 0x00001021, 0x0000000d, + 0x00001021, 0x8fbf0010, 0x03e00008, 0x27bd0018, 0x93620000, 0x24030020, + 0x304400ff, 0x10830005, 0x24020030, 0x10820007, 0x00000000, 0x0a0003c9, + 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, 0x0e00148e, 0x00000000, 0x8f830018, 0x8e020018, 0xac620000, + 0x8f840018, 0x9602000c, 0xac820004, 0x8f830018, 0xac600008, 0x8f820018, + 0xac40000c, 0x8f830018, 0xac600010, 0x8f820018, 0xac400014, 0x8f840018, + 0x3c026000, 0x8c434448, 0xac830018, 0x96020008, 0x3c030800, 0x946458ce, + 0x8f850018, 0x00021400, 0x00441025, 0x24040001, 0x0e0014cc, 0xaca2001c, + 0x8fbf0014, 0x8fb00010, 0x03e00008, 0x27bd0018, 0x27bdffe8, 0xafb00010, + 0x27500100, 0xafbf0014, 0x92020009, 0x14400003, 0x3c020800, 0x0a00046c, + 0x24020001, 0x8c430020, 0x1060001f, 0x00001021, 0x0e00148e, 0x00000000, + 0x8f830018, 0x8e020018, 0xac620000, 0x8f840018, 0x9602000c, 0xac820004, + 0x8f830018, 0xac600008, 0x8f820018, 0xac40000c, 0x8f830018, 0xac600010, + 0x8f820018, 0xac400014, 0x8f840018, 0x3c026000, 0x8c434448, 0xac830018, + 0x96020008, 0x3c030800, 0x946458ce, 0x8f850018, 0x00021400, 0x00441025, + 0x24040001, 0x0e0014cc, 0xaca2001c, 0x00001021, 0x8fbf0014, 0x8fb00010, + 0x03e00008, 0x27bd0018, 0x3c0b0800, 0x8d6808b0, 0x3c070800, 0x24e700b0, + 0x00084900, 0x01271821, 0xac640000, 0x93620005, 0x97660008, 0x00e95021, + 0x93630023, 0x9364003f, 0x25080001, 0x00021600, 0x00063400, 0x00461025, + 0x00031a00, 0x00431025, 0x00822025, 0xad440004, 0x9362007e, 0x9366007f, + 0x8f630178, 0x9364007a, 0x00021600, 0x00063400, 0x00461025, 0x00031a00, + 0x00431025, 0x00822025, 0xad440008, 0x93620080, 0x9363007d, 0x3108007f, + 0x01403821, 0xad6808b0, 0x00021600, 0x00031c00, 0x00431025, 0x00451025, + 0x03e00008, 0xace2000c, 0x27bdffb8, 0xafb3002c, 0x00009821, 0xafbe0040, + 0x0000f021, 0xafb50034, 0x27550100, 0xafbf0044, 0xafb7003c, 0xafb60038, + 0xafb40030, 0xafb20028, 0xafb10024, 0xafb00020, 0xafa00010, 0xafa00014, + 0x96a20008, 0x8f540100, 0x8eb10018, 0x30420001, 0x10400037, 0x02a0b821, + 0x8f630054, 0x2622ffff, 0x00431023, 0x18400006, 0x00000000, 0x0000000d, + 0x00000000, 0x2400015c, 0x0a0004e5, 0x00002021, 0x8f62004c, 0x02221023, + 0x18400028, 0x00002021, 0x93650120, 0x93640121, 0x3c030800, 0x8c62008c, + 0x308400ff, 0x24420001, 0x30a500ff, 0x00803821, 0x1485000b, 0xac62008c, + 0x3c040800, 0x8c830090, 0x24630001, 0xac830090, 0x93620122, 0x30420001, + 0x00021023, 0x30420005, 0x0a0004e5, 0x34440004, 0x27660100, 0x00041080, + 0x00c21021, 0x8c430000, 0x02231823, 0x04600004, 0x24820001, 0x30440007, + 0x1485fff9, 0x00041080, 0x10870007, 0x3c030800, 0xa3640121, 0x8c620094, + 0x24040005, 0x24420001, 0x0a0004e5, 0xac620094, 0x24040004, 0x00809821, + 0x9362003f, 0x304400ff, 0x38830016, 0x2c630001, 0x38820010, 0x2c420001, + 0x00621825, 0x1460000c, 0x24020001, 0x38830008, 0x2c630001, 0x38820014, + 0x2c420001, 0x00621825, 0x14600005, 0x24020001, 0x24020012, 0x14820002, + 0x00001021, 0x24020001, 0x10400009, 0x00000000, 0x8ea20020, 0x8f630040, + 0x0040b021, 0x00431023, 0x5c400010, 0x8f760040, 0x0a000511, 0x00000000, + 0x9343010b, 0x24020004, 0x1462000a, 0x8eb60020, 0x8f630040, 0x3c021000, + 0x00761823, 0x0043102a, 0x10400004, 0x00000000, 0x0000000d, 0x00000000, + 0x240002fa, 0x9343010b, 0x24020004, 0x5462000b, 0x96a20008, 0x24020001, + 0xafa20010, 0x96a20008, 0x24030001, 0xafa30018, 0x8eb2001c, 0x36730002, + 0x30420020, 0x0a000526, 0xafa20014, 0x36730080, 0x30420002, 0x10400003, + 0xafa00018, 0x0a000526, 0x8eb2001c, 0x8eb20014, 0x2402fffb, 0x02628024, + 0x1200002a, 0x3c030800, 0x8c620030, 0x02021024, 0x10400026, 0x3c020800, + 0x8c430020, 0x10600024, 0x32620004, 0x0e00148e, 0x00000000, 0x8f830018, + 0x8f420100, 0xac620000, 0x8f840018, 0x02401821, 0x32620002, 0xac900004, + 0x8f840018, 0x54400001, 0x02c01821, 0xac830008, 0x8f830018, 0x8ee20020, + 0xac62000c, 0x8f840018, 0x8f620040, 0xac820010, 0x8f830018, 0x8ee20018, + 0xac620014, 0x8f850018, 0x3c026000, 0x8c434448, 0x24040001, 0x3c020800, + 0xaca30018, 0x944358ce, 0x8f850018, 0x3c024010, 0x00621825, 0x0e0014cc, + 0xaca3001c, 0x32620004, 0x10400063, 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, + 0xaf710064, 0x3c023fff, 0x0a000580, 0x3442ffff, 0x8f62005c, 0x02221023, + 0x04400011, 0x00000000, 0x8f65005c, 0x8f630064, 0x9764003c, 0x3c023fff, + 0x3442ffff, 0xaf710064, 0x00a32823, 0x00852821, 0x0045102b, 0x10400004, + 0x02251021, 0x3c053fff, 0x34a5ffff, 0x02251021, 0xaf62005c, 0x24070001, + 0xaf71004c, 0x8f620054, 0x16220005, 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, 0x93620082, 0x30420080, 0x50400001, 0xa3600081, 0x3c028000, + 0x34420001, 0x02821025, 0xaf420020, 0x9363007e, 0x9362007a, 0x10620004, + 0x00000000, 0x0e0013c4, 0x00000000, 0x00403821, 0x54e00001, 0x241e0001, + 0x8f700040, 0x8f620040, 0x14520003, 0x00521023, 0x0a0005bf, 0x00001021, + 0x28420001, 0x10400041, 0x8fa20010, 0x0e000fae, 0x02402021, 0xaf720040, + 0x9362003e, 0x30420001, 0x1440000b, 0x3c029000, 0x93620022, 0x24420001, + 0xa3620022, 0x93630022, 0x3c020800, 0x8c440098, 0x0064182b, 0x14600027, + 0x3c020800, 0x3c029000, 0x34420001, 0x02821025, 0xaf420020, 0x3c038000, + 0x8f420020, 0x00431024, 0x1440fffd, 0x00000000, 0x9362007d, 0x3c038000, + 0x34420001, 0xa362007d, 0x8f640074, 0x34630001, 0x02831825, 0xaf430020, + 0x04810006, 0x3c038000, 0x02802021, 0x0e000470, 0x24050273, 0x0a0005f2, + 0x24050001, 0x8f4201f8, 0x00431024, 0x1440fffd, 0x24020002, 0x3c031000, + 0xaf5401c0, 0xa34201c4, 0xaf4301f8, 0x24050001, 0x24020001, 0xa7620012, + 0xa3600022, 0x0a0005fe, 0x2ca20001, 0x9743007a, 0x9444002a, 0x00002821, + 0x00641821, 0x3063fffe, 0xa7630012, 0x2ca20001, 0x00021023, 0x03c2f024, + 0x8fa20010, 0x10400004, 0x8fa30014, 0x0e0013c1, 0x00000000, 0x8fa30014, + 0x10600003, 0x00000000, 0x0e0010eb, 0x00000000, 0x13c0001f, 0x3c029000, + 0x34420001, 0x02821025, 0xaf420020, 0x3c038000, 0x8f420020, 0x00431024, + 0x1440fffd, 0x00000000, 0x9362007d, 0x3c038000, 0xa362007d, 0x8f640074, + 0x34630001, 0x02831825, 0xaf430020, 0x04810006, 0x3c038000, 0x02802021, + 0x0e000470, 0x2405036c, 0x0a00062b, 0x8fa20018, 0x8f4201f8, 0x00431024, + 0x1440fffd, 0x24020002, 0x3c031000, 0xaf5401c0, 0xa34201c4, 0xaf4301f8, + 0x8fa20018, 0x5040002f, 0x96a20008, 0x8f620048, 0x8f630024, 0x00761821, + 0xaf630048, 0x9764003c, 0x00501023, 0x0044102b, 0x10400025, 0x3c029000, + 0x34420001, 0x3c040800, 0x8c830080, 0x8f450100, 0x3c068000, 0x24630001, + 0x00a21025, 0xac830080, 0xaf420020, 0x8f420020, 0x00461024, 0x1440fffd, + 0x00000000, 0x9362007d, 0x3c038000, 0x34420004, 0xa362007d, 0x8f640074, + 0x34630001, 0x00a31825, 0xaf430020, 0x04810006, 0x3c038000, 0x00a02021, + 0x0e000470, 0x2405038a, 0x0a00065b, 0x96a20008, 0x8f4201f8, 0x00431024, + 0x1440fffd, 0x24020002, 0x3c031000, 0xaf4501c0, 0xa34201c4, 0xaf4301f8, + 0x96a20008, 0x8fbf0044, 0x8fbe0040, 0x8fb7003c, 0x8fb60038, 0x8fb50034, + 0x8fb40030, 0x8fb3002c, 0x8fb20028, 0x8fb10024, 0x8fb00020, 0x00021042, + 0x30420001, 0x03e00008, 0x27bd0048, 0x27bdffe0, 0xafbf0018, 0x97420108, + 0x24030019, 0x304400ff, 0x10830065, 0x2882001a, 0x1040001a, 0x2882000a, + 0x1040000f, 0x28820008, 0x10400040, 0x24020001, 0x1082003a, 0x28820002, + 0x50400005, 0x24020006, 0x10800032, 0x3c026000, 0x0a0006fb, 0x00000000, + 0x1082003d, 0x00000000, 0x0a0006fb, 0x00000000, 0x2402000b, 0x10820044, + 0x2882000b, 0x1440004b, 0x2402000e, 0x10820045, 0x00000000, 0x0a0006fb, + 0x00000000, 0x24020020, 0x10820062, 0x28820021, 0x1040000e, 0x2402001c, + 0x1082004c, 0x2882001d, 0x10400005, 0x2402001b, 0x10820043, 0x00000000, + 0x0a0006fb, 0x00000000, 0x2402001f, 0x10820050, 0x00000000, 0x0a0006fb, + 0x00000000, 0x240200c1, 0x10820042, 0x288200c2, 0x10400005, 0x24020080, + 0x10820021, 0x00000000, 0x0a0006fb, 0x00000000, 0x240200c2, 0x1082003d, + 0x240200c9, 0x50820049, 0xafa00010, 0x0a0006fb, 0x00000000, 0x0e001163, + 0xac400808, 0x0a0006fd, 0x8fbf0018, 0x3c026000, 0x8c444448, 0x3c030800, + 0xac640064, 0x0e001163, 0x00000000, 0x3c026000, 0x8c444448, 0x3c030800, + 0x0a0006fc, 0xac640068, 0x8f440100, 0x0e0006ff, 0x00000000, 0x3c026000, + 0x8c444448, 0x3c030800, 0x0a0006fc, 0xac64006c, 0x0e001191, 0x00000000, + 0x0a0006fd, 0x8fbf0018, 0x8f440100, 0x0e0011bb, 0x00000000, 0x0a0006fd, + 0x8fbf0018, 0x0e001202, 0x00000000, 0x0a0006fd, 0x8fbf0018, 0x0000000d, + 0x0a0006fd, 0x8fbf0018, 0x0e000826, 0x00000000, 0x0a0006fd, 0x8fbf0018, + 0x8f440100, 0x0e001264, 0x00000000, 0x0a0006fd, 0x8fbf0018, 0x0e00134e, + 0x00000000, 0x0a0006fd, 0x8fbf0018, 0x0e00087c, 0x27440100, 0x0a0006fd, + 0x8fbf0018, 0x8f640040, 0x0e000fae, 0x00000000, 0x0a0006fd, 0x8fbf0018, + 0x8f440100, 0x0e001059, 0x00000000, 0x0a0006fd, 0x8fbf0018, 0x0e001417, + 0x00000000, 0x0a0006fd, 0x8fbf0018, 0xafa00014, 0x8f440100, 0x8f450118, + 0x8f46011c, 0x0e001439, 0x8f470120, 0x0a0006fd, 0x8fbf0018, 0x0000000d, + 0x8fbf0018, 0x03e00008, 0x27bd0020, 0x27bdffe8, 0xafbf0010, 0x9742010c, + 0x1440005e, 0x00803821, 0x3c029000, 0x34420001, 0x00e21025, 0xaf420020, + 0x3c038000, 0x8f420020, 0x00431024, 0x1440fffd, 0x00000000, 0x93620023, + 0x30420010, 0x14400026, 0x3c030800, 0x8f630074, 0x3c027fff, 0x3442ffff, + 0x00621824, 0xaf630074, 0x93620005, 0x34420001, 0xa3620005, 0x8f63004c, + 0x8f620054, 0x10620021, 0x24040001, 0x9762006a, 0x00022880, 0x50a00001, + 0x24050001, 0x97630068, 0x93640081, 0x3c020800, 0x8c46004c, 0x00652821, + 0x00852804, 0x00c5102b, 0x54400001, 0x00a03021, 0x3c020800, 0x8c440050, + 0x00c4182b, 0x54600001, 0x00c02021, 0x8f420074, 0x2403fffe, 0x00832824, + 0x00a21021, 0xaf62000c, 0x0a00073d, 0x24040001, 0x8c6200a8, 0x00002021, + 0x24420001, 0xac6200a8, 0x0000000d, 0x00000000, 0x2400044d, 0x3c028000, + 0x34420001, 0x00e21025, 0xaf420020, 0x1080001f, 0x3c029000, 0x34420001, + 0x00e21025, 0xaf420020, 0x3c038000, 0x8f420020, 0x00431024, 0x1440fffd, + 0x00000000, 0x9362007d, 0x3c038000, 0xa362007d, 0x8f640074, 0x34630001, + 0x00e31825, 0xaf430020, 0x04810006, 0x3c038000, 0x00e02021, 0x0e000470, + 0x24050455, 0x0a000761, 0x00000000, 0x8f4201f8, 0x00431024, 0x1440fffd, + 0x24020002, 0x3c031000, 0xaf4701c0, 0xa34201c4, 0xaf4301f8, 0x0e001163, + 0x00000000, 0x8fbf0010, 0x03e00008, 0x27bd0018, 0x27bdffd8, 0xafbf0024, + 0xafb40020, 0xafb3001c, 0xafb20018, 0xafb10014, 0xafb00010, 0x93630005, + 0x00809821, 0x24020030, 0x30630030, 0x146200ac, 0x00a0a021, 0x3c020800, + 0x8c430020, 0x106000a6, 0x00000000, 0x0e00148e, 0x00000000, 0x8f830018, + 0xac730000, 0x936200c4, 0x30420002, 0x10400004, 0x24020001, 0x8f830018, + 0x0a000784, 0x00000000, 0x8f830018, 0x24020003, 0xac620004, 0x8f6200dc, + 0x8f630040, 0x00431023, 0x18400004, 0x00000000, 0x0000000d, 0x00000000, + 0x24000509, 0x8f840018, 0x8f6200dc, 0xac820008, 0x8f830018, 0xac60000c, + 0x8f820018, 0xac400010, 0x8f830018, 0x8f62004c, 0x3c100800, 0xac620014, + 0x8f850018, 0x3c026000, 0x8c434448, 0x261258c0, 0x00002021, 0xaca30018, + 0x9642000e, 0x8f850018, 0x3c034010, 0x00431025, 0x0e0014cc, 0xaca2001c, + 0x8f830018, 0xac730000, 0x9362003e, 0x9363003f, 0x8f840018, 0x00021200, + 0x00621825, 0xac830004, 0x93620081, 0x93630082, 0x8f840018, 0x00021600, + 0x00031c00, 0x00431025, 0xac820008, 0x8f830018, 0x8f620040, 0xac62000c, + 0x8f840018, 0x8f620048, 0xac820010, 0x8f71004c, 0x8f820018, 0xac510014, + 0x8f620050, 0x8f850018, 0x00401821, 0x02221023, 0x5c400001, 0x02201821, + 0x00002021, 0xaca30018, 0x9642000e, 0x8f850018, 0x3c03c00b, 0x00431025, + 0x0e0014cc, 0xaca2001c, 0x8f620054, 0x8f840018, 0x00401821, 0x02221023, + 0x5c400001, 0x02201821, 0xac830000, 0x8f840018, 0x8f630058, 0xac830004, + 0x93620023, 0x30420010, 0x10400004, 0x00000000, 0x8f830018, 0x0a0007dd, + 0x8f620148, 0x8f830018, 0x8f62005c, 0xac620008, 0x8f830018, 0x8f620060, + 0xac62000c, 0x8f840018, 0x8f620064, 0xac820010, 0x97630068, 0x9762006a, + 0x8f840018, 0x00031c00, 0x00431025, 0xac820014, 0x8f850018, 0x00002021, + 0x2402ffff, 0x260358c0, 0xaca20018, 0x9462000e, 0x8f850018, 0x3c03c00c, + 0x00431025, 0x0e0014cc, 0xaca2001c, 0x8f840018, 0x8f630018, 0xac830000, + 0x936200c4, 0x30420002, 0x10400006, 0x00000000, 0x976200c8, 0x8f830018, + 0x3042ffff, 0x0a000803, 0xac620004, 0x8f820018, 0xac400004, 0x8f830018, + 0x8f62006c, 0xac620008, 0x8f840018, 0x8f6200dc, 0xac82000c, 0x8f830018, + 0xac600010, 0x93620005, 0x8f830018, 0x00021600, 0x00541025, 0xac620014, + 0x8f850018, 0x3c026000, 0x8c434448, 0x24040001, 0x260258c0, 0xaca30018, + 0x9443000e, 0x8f850018, 0x3c02400d, 0x00621825, 0x0e0014cc, 0xaca3001c, + 0x0e00122e, 0x02602021, 0x8fbf0024, 0x8fb40020, 0x8fb3001c, 0x8fb20018, + 0x8fb10014, 0x8fb00010, 0x03e00008, 0x27bd0028, 0x27bdffe0, 0xafb00010, + 0x27500100, 0xafbf0018, 0xafb10014, 0x9603000c, 0x240200c1, 0x54620024, + 0x8e040000, 0x3c029000, 0x8f450100, 0x34420001, 0x3c038000, 0x00a21025, + 0xaf420020, 0x8f420020, 0x00431024, 0x1440fffd, 0x00000000, 0x9362007d, + 0x3c038000, 0x34420004, 0xa362007d, 0x8f640074, 0x34630001, 0x00a31825, + 0xaf430020, 0x04810006, 0x3c038000, 0x00a02021, 0x0e000470, 0x240505b2, + 0x0a000878, 0x8fbf0018, 0x8f4201f8, 0x00431024, 0x1440fffd, 0x24020002, + 0x3c031000, 0xaf4501c0, 0xa34201c4, 0xaf4301f8, 0x0a000878, 0x8fbf0018, + 0x8f65004c, 0x24060001, 0x0e0012a3, 0x240705be, 0x3c020800, 0x8c430020, + 0x9611000c, 0x1060001d, 0x8e100000, 0x0e00148e, 0x00000000, 0x8f820018, + 0xac500000, 0x8f840018, 0x00111400, 0xac820004, 0x8f830018, 0xac600008, + 0x8f820018, 0xac40000c, 0x8f830018, 0xac600010, 0x8f840018, 0x240205c1, + 0xac820014, 0x8f850018, 0x3c026000, 0x8c434448, 0x24040001, 0x3c020800, + 0xaca30018, 0x944358ce, 0x8f850018, 0x3c024019, 0x00621825, 0x0e0014cc, + 0xaca3001c, 0x8fbf0018, 0x8fb10014, 0x8fb00010, 0x03e00008, 0x27bd0020, + 0x27bdffb0, 0xafb5003c, 0x0000a821, 0xafbe0048, 0x0000f021, 0xafb70044, + 0x0000b821, 0xafb30034, 0x00009821, 0xafb60040, 0x0080b021, 0xafbf004c, + 0xafb40038, 0xafb20030, 0xafb1002c, 0xafb00028, 0xafa00010, 0x8f620040, + 0x8ec30014, 0x96d1000c, 0x00431023, 0x04410025, 0x8ed40000, 0x32220401, + 0x1040030c, 0x3c029000, 0x34420001, 0x02821025, 0xaf420020, 0x3c038000, + 0x8f420020, 0x00431024, 0x1440fffd, 0x00000000, 0x9362007d, 0x3c038000, + 0x34420004, 0xa362007d, 0x8f640074, 0x34630001, 0x02831825, 0xaf430020, + 0x04810006, 0x3c038000, 0x02802021, 0x0e000470, 0x24050664, 0x0a000ba2, + 0x8fbf004c, 0x8f4201f8, 0x00431024, 0x1440fffd, 0x24020002, 0x3c031000, + 0xaf5401c0, 0xa34201c4, 0xaf4301f8, 0x0a000ba2, 0x8fbf004c, 0x32220010, + 0x1040006b, 0x00003021, 0x9362003f, 0x92c6000f, 0x304500ff, 0x24c3fff8, + 0x2c62000f, 0x10400057, 0x3c020800, 0x244257c0, 0x00031880, 0x00621821, + 0x8c640000, 0x00800008, 0x00000000, 0x38a20012, 0x0a000924, 0x0002a82b, + 0x2402000e, 0x14a20004, 0x2402000c, 0x24150001, 0x0a000924, 0x24060010, + 0x10a20049, 0x38a30010, 0x2c630001, 0x38a20016, 0x2c420001, 0x00621825, + 0x1460004d, 0x0000a821, 0x24020014, 0x10a2004a, 0x00000000, 0x0000000d, + 0x00000000, 0x2400069c, 0x0a000924, 0x0000a821, 0x24020016, 0x14a20005, + 0x2402000c, 0x24150001, 0x24060010, 0x0a000924, 0x3231fffd, 0x10a20032, + 0x38a30010, 0x2c630001, 0x38a2000e, 0x2c420001, 0x00621825, 0x14600036, + 0x0000a821, 0x24020014, 0x14a20003, 0x24150001, 0x0a000924, 0x24060012, + 0x0000000d, 0x00000000, 0x240006bc, 0x0a000924, 0x0000a821, 0x2402000e, + 0x14a20004, 0x24020016, 0x24150001, 0x0a000924, 0x3231fffb, 0x14a20004, + 0x24020014, 0x24150001, 0x0a000924, 0x3231fffd, 0x54a20013, 0x92c2000e, + 0x24150001, 0x24060012, 0x0a000924, 0x3231fffd, 0x2402000c, 0x54a2000c, + 0x92c2000e, 0x92c3000e, 0x2402000a, 0x10620005, 0x24150001, 0x0000000d, + 0x00000000, 0x240006e8, 0x24150001, 0x0a000924, 0x24060014, 0x92c2000e, + 0x14a20003, 0x00000000, 0x0a000924, 0x24150001, 0x10a6ffc1, 0x24020012, + 0x10a20005, 0x0000a821, 0x0000000d, 0x00000000, 0x24000704, 0x0000a821, + 0x12a00022, 0x32220004, 0x10400002, 0x24020001, 0xafa20010, 0x32230102, + 0x24020002, 0x1462000f, 0x00000000, 0x92c2000a, 0x30420020, 0x1440000b, + 0x00000000, 0x8f630048, 0x8f620040, 0x14620004, 0x00000000, 0x8f620048, + 0x24420001, 0xaf620048, 0x8f620040, 0x24420001, 0xaf620040, 0xa366003f, + 0x38c30012, 0x2c630001, 0x38c20010, 0x2c420001, 0x00621825, 0x10600005, + 0x3c030800, 0x8c620074, 0x24420001, 0x0e00140d, 0xac620074, 0x32220040, + 0x32230020, 0xafa30020, 0x32230080, 0xafa30024, 0x32230001, 0xafa30018, + 0x32230008, 0xafa3001c, 0x32230100, 0x104000c4, 0xafa30014, 0x8ec60010, + 0x8f630054, 0x24c2ffff, 0x00431023, 0x18400006, 0x00000000, 0x0000000d, + 0x00000000, 0x2400015c, 0x0a000989, 0x00009021, 0x8f62004c, 0x00c21023, + 0x18400028, 0x00009021, 0x93650120, 0x93640121, 0x3c030800, 0x8c62008c, + 0x308400ff, 0x24420001, 0x30a500ff, 0x00804021, 0x1485000b, 0xac62008c, + 0x3c040800, 0x8c830090, 0x24630001, 0xac830090, 0x93620122, 0x30420001, + 0x00021023, 0x30420005, 0x0a000989, 0x34520004, 0x27670100, 0x00041080, + 0x00e21021, 0x8c430000, 0x00c31823, 0x04600004, 0x24820001, 0x30440007, + 0x1485fff9, 0x00041080, 0x10880007, 0x3c030800, 0xa3640121, 0x8c620094, + 0x24120005, 0x24420001, 0x0a000989, 0xac620094, 0x24120004, 0x32420001, + 0x10400021, 0x3c020800, 0x8c430020, 0x8ed00000, 0x1060001c, 0x8ed30010, + 0x0e00148e, 0x00000000, 0x8f820018, 0xac500000, 0x8f840018, 0x24020001, + 0xac820004, 0x8f830018, 0xac600008, 0x8f820018, 0xac40000c, 0x8f830018, + 0xac600010, 0x8f820018, 0xac530014, 0x8f850018, 0x3c026000, 0x8c434448, + 0x24040001, 0x3c020800, 0xaca30018, 0x944358ce, 0x8f850018, 0x3c024010, + 0x00621825, 0x0e0014cc, 0xaca3001c, 0x24130001, 0x32420004, 0x10400068, + 0x00003821, 0x3c029000, 0x8ec60010, 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, 0xaf660064, 0x3c023fff, + 0x0a0009da, 0x3442ffff, 0x8f62005c, 0x00c21023, 0x04400011, 0x00000000, + 0x8f65005c, 0x8f630064, 0x9764003c, 0x3c023fff, 0x3442ffff, 0xaf660064, + 0x00a32823, 0x00852821, 0x0045102b, 0x10400004, 0x00c51021, 0x3c053fff, + 0x34a5ffff, 0x00c51021, 0xaf62005c, 0x24070001, 0xaf66004c, 0x8fa20010, + 0x10400003, 0x00000000, 0xaf660050, 0xaf660054, 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, 0x93620082, 0x30420080, + 0x50400001, 0xa3600081, 0x3c028000, 0x34420001, 0x02821025, 0xaf420020, + 0x9363007e, 0x9362007a, 0x10620005, 0x00e0b821, 0x0e0013c4, 0x00000000, + 0x00403821, 0x00e0b821, 0x8fa30020, 0x10600009, 0x8fa20010, 0x8ec20018, + 0xaf620018, 0x8ec3001c, 0xaf63001c, 0x8ec20020, 0x24170001, 0xaf620058, + 0x8fa20010, 0x10400057, 0x8fa30024, 0x93620023, 0x30420040, 0x10400053, + 0x00000000, 0x16600021, 0x3c120800, 0x8e420020, 0x8f70004c, 0x1040001e, + 0x24130001, 0x0e00148e, 0x00000000, 0x8f820018, 0xac540000, 0x8f840018, + 0x24020001, 0xac820004, 0x8f830018, 0xac600008, 0x8f820018, 0xac40000c, + 0x8f830018, 0xac600010, 0x8f820018, 0xac500014, 0x8f850018, 0x3c026000, + 0x8c434448, 0x24040001, 0x3c020800, 0xaca30018, 0x944358ce, 0x8f850018, + 0x3c024010, 0x00621825, 0xaca3001c, 0x0e0014cc, 0x24130001, 0x8e420020, + 0x1040001c, 0x8ed00000, 0x0e00148e, 0x00000000, 0x8f820018, 0xac500000, + 0x8f830018, 0xac600004, 0x8f820018, 0xac400008, 0x8f830018, 0xac60000c, + 0x8f820018, 0xac400010, 0x8f830018, 0x24020798, 0xac620014, 0x8f850018, + 0x3c026000, 0x8c434448, 0x24040001, 0x3c020800, 0xaca30018, 0x944358ce, + 0x8f850018, 0x3c024019, 0x00621825, 0x0e0014cc, 0xaca3001c, 0x3c029000, + 0x34420001, 0x02821025, 0xaf420020, 0x3c038000, 0x8f420020, 0x00431024, + 0x1440fffd, 0x24020001, 0xaf62000c, 0x93630023, 0x3c028000, 0x34420001, + 0x02821025, 0x306300bf, 0xa3630023, 0xaf420020, 0x8fa30024, 0x10600012, + 0x8fa30018, 0x9362007c, 0x24420001, 0xa362007c, 0x9363007e, 0x9362007a, + 0x1462000b, 0x8fa30018, 0x9362007c, 0x3c030800, 0x8c640024, 0x0044102b, + 0x14400005, 0x8fa30018, 0x0e0013c4, 0x00000000, 0x02e2b825, 0x8fa30018, + 0x3062ffff, 0x10400003, 0x32220200, 0x0a000a94, 0x241e0004, 0x10400003, + 0x00000000, 0x241e0040, 0x24170001, 0x12a000d0, 0x32220002, 0x104000cf, + 0x8fa2001c, 0x92c2000a, 0x30420002, 0x5040003b, 0x92c2000a, 0x93620023, + 0x30420008, 0x54400037, 0x92c2000a, 0x3c020800, 0x8c430020, 0x10600023, + 0x3c029000, 0x0e00148e, 0x00000000, 0x8f840018, 0x8ec30000, 0xac830000, + 0x92c2000a, 0x8f830018, 0x00021600, 0xac620004, 0x8f840018, 0x8f620040, + 0xac820008, 0x8f850018, 0x8f63004c, 0xaca3000c, 0x9362003f, 0x8f840018, + 0x304200ff, 0xac820010, 0x8f830018, 0x3c026000, 0xac600014, 0x8f850018, + 0x8c434448, 0x24040001, 0x3c020800, 0xaca30018, 0x944358ce, 0x8f850018, + 0x3c02401a, 0x00621825, 0x0e0014cc, 0xaca3001c, 0x3c029000, 0x34420001, + 0x02821025, 0xaf420020, 0x3c038000, 0x8f420020, 0x00431024, 0x1440fffd, + 0x00000000, 0x93630023, 0x3c028000, 0x34420001, 0x02821025, 0x34630008, + 0xa3630023, 0xaf420020, 0x92c2000a, 0x30420020, 0x1040008e, 0x8fa2001c, + 0x93620023, 0x30420001, 0x14400035, 0x3c020800, 0x8c430020, 0x10600023, + 0x3c029000, 0x0e00148e, 0x00000000, 0x8f840018, 0x8ec30000, 0xac830000, + 0x92c2000a, 0x8f830018, 0x00021600, 0xac620004, 0x8f840018, 0x8f620040, + 0xac820008, 0x8f850018, 0x8f63004c, 0xaca3000c, 0x9362003f, 0x8f840018, + 0x304200ff, 0xac820010, 0x8f830018, 0x3c026000, 0xac600014, 0x8f850018, + 0x8c434448, 0x24040001, 0x3c020800, 0xaca30018, 0x944358ce, 0x8f850018, + 0x3c02401a, 0x00621825, 0x0e0014cc, 0xaca3001c, 0x3c029000, 0x34420001, + 0x02821025, 0xaf420020, 0x3c038000, 0x8f420020, 0x00431024, 0x1440fffd, + 0x00000000, 0x93630023, 0x3c028000, 0x34420001, 0x02821025, 0x34630001, + 0xa3630023, 0xaf420020, 0x93620023, 0x30420040, 0x10400052, 0x8fa2001c, + 0x16600020, 0x3c120800, 0x8e420020, 0x8f70004c, 0x1040003c, 0x3c029000, + 0x0e00148e, 0x00000000, 0x8f820018, 0xac540000, 0x8f840018, 0x24020001, + 0xac820004, 0x8f830018, 0xac600008, 0x8f820018, 0xac40000c, 0x8f830018, + 0xac600010, 0x8f820018, 0xac500014, 0x8f850018, 0x3c026000, 0x8c434448, + 0x24040001, 0x3c020800, 0xaca30018, 0x944358ce, 0x8f850018, 0x3c024010, + 0x00621825, 0x0e0014cc, 0xaca3001c, 0x8e420020, 0x1040001e, 0x3c029000, + 0x0e00148e, 0x00000000, 0x8f820018, 0xac540000, 0x8f840018, 0x3c02008d, + 0xac820004, 0x8f830018, 0xac600008, 0x8f820018, 0xac40000c, 0x8f830018, + 0xac600010, 0x8f840018, 0x240207ee, 0xac820014, 0x8f850018, 0x3c026000, + 0x8c434448, 0x24040001, 0x3c020800, 0xaca30018, 0x944358ce, 0x8f850018, + 0x3c024019, 0x00621825, 0x0e0014cc, 0xaca3001c, 0x3c029000, 0x34420001, + 0x02821025, 0xaf420020, 0x3c038000, 0x8f420020, 0x00431024, 0x1440fffd, + 0x00000000, 0x93630023, 0x3c028000, 0x34420001, 0x02821025, 0x306300bf, + 0xa3630023, 0xaf420020, 0x8fa2001c, 0x1040000e, 0x8fa20014, 0x92c2000a, + 0xa3620082, 0x57c00005, 0x37de0008, 0x8fa30014, 0x10600004, 0x00000000, + 0x37de0008, 0x0a000b75, 0x24170001, 0x0e0012cf, 0x02802021, 0x8fa20014, + 0x10400003, 0x00000000, 0x37de0010, 0x24170001, 0x12e00020, 0x3c029000, + 0x34420001, 0x02821025, 0xaf420020, 0x3c038000, 0x8f420020, 0x00431024, + 0x1440fffd, 0x00000000, 0x9362007d, 0x3c038000, 0x03c21025, 0xa362007d, + 0x8f640074, 0x34630001, 0x02831825, 0xaf430020, 0x04810006, 0x3c038000, + 0x02802021, 0x0e000470, 0x2405082a, 0x0a000b9b, 0x00000000, 0x8f4201f8, + 0x00431024, 0x1440fffd, 0x24020002, 0x3c031000, 0xaf5401c0, 0xa34201c4, + 0xaf4301f8, 0x9363003f, 0x24020012, 0x14620004, 0x8fbf004c, 0x0e00140d, + 0x00000000, 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, 0x0a000c2c, 0x00000000, 0x10620027, + 0x3c020400, 0x1062003e, 0x02002021, 0x0a000c2c, 0x00000000, 0x0e000c31, + 0x02002021, 0x0a000c2e, 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, 0x0e000766, + 0x24055854, 0x0a000c2e, 0x8fbf0014, 0x93620005, 0x30420001, 0x1040003f, + 0x3c029000, 0x34420001, 0x02021025, 0xaf420020, 0x3c038000, 0x8f420020, + 0x00431024, 0x1440fffd, 0x00000000, 0x93620023, 0x34420004, 0xa3620023, + 0x93630005, 0x3c048000, 0x3c020800, 0x306300fe, 0xa3630005, 0x8c430020, + 0x34840001, 0x02042025, 0x0a000c0a, 0xaf440020, 0x00002821, 0x00003021, + 0x0e000fb1, 0x240708d9, 0x3c020800, 0x8c430020, 0x10600023, 0x8fbf0014, + 0x0e00148e, 0x00000000, 0x8f820018, 0xac500000, 0x93630082, 0x9362003f, + 0x8f840018, 0x00031a00, 0x00431025, 0xac820004, 0x8f830018, 0xac600008, + 0x8f820018, 0xac40000c, 0x8f830018, 0xac600010, 0x8f820018, 0xac400014, + 0x8f850018, 0x3c026000, 0x8c434448, 0x24040001, 0x3c020800, 0xaca30018, + 0x944358ce, 0x8f850018, 0x3c02400a, 0x00621825, 0x0e0014cc, 0xaca3001c, + 0x0a000c2e, 0x8fbf0014, 0x0000000d, 0x8fbf0014, 0x8fb00010, 0x03e00008, + 0x27bd0018, 0x27bdffe8, 0xafbf0010, 0x8f420188, 0x00803021, 0x93640000, + 0x24030020, 0x00021402, 0x10830008, 0x304500ff, 0x3c036018, 0x8c625000, + 0x34420400, 0xac625000, 0x0000000d, 0x00000000, 0x24000955, 0x9363003f, + 0x24020012, 0x14620023, 0x3c029000, 0x34420001, 0x3c038000, 0x00c21025, + 0xaf650178, 0xa365007a, 0xaf420020, 0x8f420020, 0x00431024, 0x1440fffd, + 0x00000000, 0x9362007d, 0x3c038000, 0xa362007d, 0x8f640074, 0x34630001, + 0x00c31825, 0xaf430020, 0x04810006, 0x3c038000, 0x00c02021, 0x0e000470, + 0x24050963, 0x0a000c79, 0x8fbf0010, 0x8f4201f8, 0x00431024, 0x1440fffd, + 0x24020002, 0x3c031000, 0xaf4601c0, 0xa34201c4, 0xaf4301f8, 0x0a000c79, + 0x8fbf0010, 0x9362007e, 0x1445000e, 0x00000000, 0x8f620178, 0x1045000b, + 0x00000000, 0x8f820000, 0xaf650178, 0x8f660178, 0x8f440180, 0x8f65004c, + 0x8c430000, 0x0060f809, 0x30c600ff, 0x0a000c79, 0x8fbf0010, 0xaf650178, + 0x8fbf0010, 0x03e00008, 0x27bd0018, 0x27bdffe8, 0xafbf0010, 0x93630000, + 0x24020020, 0x10620005, 0x00000000, 0x93630000, 0x24020030, 0x1462004d, + 0x8fbf0010, 0x93420148, 0x2444ffff, 0x2c830005, 0x10600047, 0x3c020800, + 0x24425800, 0x00041880, 0x00621821, 0x8c640000, 0x00800008, 0x00000000, + 0x8f430144, 0x8f62000c, 0x14620006, 0x24020001, 0xaf62000c, 0x0e000d59, + 0x00000000, 0x0a000cd1, 0x8fbf0010, 0x8f62000c, 0x0a000cca, 0x00000000, + 0x97630010, 0x8f420144, 0x14430006, 0x24020001, 0xa7620010, 0x0e00137a, + 0x00000000, 0x0a000cd1, 0x8fbf0010, 0x97620010, 0x0a000cca, 0x00000000, + 0x97630012, 0x8f420144, 0x14430006, 0x24020001, 0xa7620012, 0x0e001395, + 0x00000000, 0x0a000cd1, 0x8fbf0010, 0x97620012, 0x0a000cca, 0x00000000, + 0x97630014, 0x8f420144, 0x14430006, 0x24020001, 0xa7620014, 0x0e0013bb, + 0x00000000, 0x0a000cd1, 0x8fbf0010, 0x97620014, 0x0a000cca, 0x00000000, + 0x97630016, 0x8f420144, 0x14430006, 0x24020001, 0xa7620016, 0x0e0013be, + 0x00000000, 0x0a000cd1, 0x8fbf0010, 0x97620016, 0x14400006, 0x8fbf0010, + 0x3c030800, 0x8c620070, 0x24420001, 0xac620070, 0x8fbf0010, 0x03e00008, + 0x27bd0018, 0x27bdffe0, 0x3c029000, 0xafbf001c, 0xafb20018, 0xafb10014, + 0xafb00010, 0x8f500140, 0x34420001, 0x3c038000, 0x02021025, 0xaf420020, + 0x8f420020, 0x00431024, 0x1440fffd, 0x24020012, 0x24030080, 0xa362003f, + 0xa3630082, 0x93620023, 0x30420040, 0x10400007, 0x00008821, 0x93620023, + 0x24110001, 0x304200bf, 0xa3620023, 0x0a000cf0, 0x3c028000, 0x3c028000, + 0x34420001, 0x3c039000, 0x34630001, 0x3c048000, 0x02021025, 0x02031825, + 0xaf420020, 0xaf430020, 0x8f420020, 0x00441024, 0x1440fffd, 0x00000000, + 0x9362007d, 0x3c038000, 0x34420020, 0xa362007d, 0x8f640074, 0x34630001, + 0x02031825, 0xaf430020, 0x04810006, 0x3c038000, 0x02002021, 0x0e000470, + 0x24050a63, 0x0a000d13, 0x00000000, 0x8f4201f8, 0x00431024, 0x1440fffd, + 0x24020002, 0x3c031000, 0xaf5001c0, 0xa34201c4, 0xaf4301f8, 0x1220003f, + 0x3c120800, 0x8e420020, 0x8f71004c, 0x1040003c, 0x8fbf001c, 0x0e00148e, + 0x00000000, 0x8f820018, 0xac500000, 0x8f840018, 0x24020001, 0xac820004, + 0x8f830018, 0xac600008, 0x8f820018, 0xac40000c, 0x8f830018, 0xac600010, + 0x8f820018, 0xac510014, 0x8f850018, 0x3c026000, 0x8c434448, 0x24040001, + 0x3c020800, 0xaca30018, 0x944358ce, 0x8f850018, 0x3c024010, 0x00621825, + 0x0e0014cc, 0xaca3001c, 0x8e420020, 0x1040001e, 0x8fbf001c, 0x0e00148e, + 0x00000000, 0x8f820018, 0xac500000, 0x8f840018, 0x3c02008d, 0xac820004, + 0x8f830018, 0xac600008, 0x8f820018, 0xac40000c, 0x8f830018, 0xac600010, + 0x8f840018, 0x24020a6a, 0xac820014, 0x8f850018, 0x3c026000, 0x8c434448, + 0x24040001, 0x3c020800, 0xaca30018, 0x944358ce, 0x8f850018, 0x3c024019, + 0x00621825, 0x0e0014cc, 0xaca3001c, 0x8fbf001c, 0x8fb20018, 0x8fb10014, + 0x8fb00010, 0x03e00008, 0x27bd0020, 0x27bdffe8, 0xafbf0010, 0x93620081, + 0x3c030800, 0x8c640048, 0x0044102b, 0x14400005, 0x00000000, 0x0e000cd3, + 0x00000000, 0x0a000da4, 0x8fbf0010, 0x93620081, 0x24420001, 0x0e0013c4, + 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, 0x10e00021, 0x3c029000, 0x8f450140, 0x34420001, 0x3c038000, + 0x00a21025, 0xaf420020, 0x8f420020, 0x00431024, 0x1440fffd, 0x00000000, + 0x9362007d, 0x3c038000, 0x34420004, 0xa362007d, 0x8f640074, 0x34630001, + 0x00a31825, 0xaf430020, 0x04810006, 0x3c038000, 0x00a02021, 0x0e000470, + 0x24050a92, 0x0a000da4, 0x8fbf0010, 0x8f4201f8, 0x00431024, 0x1440fffd, + 0x24020002, 0x3c031000, 0xaf4501c0, 0xa34201c4, 0xaf4301f8, 0x8fbf0010, + 0x03e00008, 0x27bd0018, 0x27bdffd8, 0xafb3001c, 0x27530100, 0xafbf0024, + 0xafb40020, 0xafb20018, 0xafb10014, 0xafb00010, 0x96620008, 0x3c140800, + 0x8f520100, 0x30420001, 0x104000da, 0x00000000, 0x8e700018, 0x8f630054, + 0x2602ffff, 0x00431023, 0x18400006, 0x00000000, 0x0000000d, 0x00000000, + 0x2400015c, 0x0a000dea, 0x00008821, 0x8f62004c, 0x02021023, 0x18400028, + 0x00008821, 0x93650120, 0x93640121, 0x3c030800, 0x8c62008c, 0x308400ff, + 0x24420001, 0x30a500ff, 0x00803821, 0x1485000b, 0xac62008c, 0x3c040800, + 0x8c830090, 0x24630001, 0xac830090, 0x93620122, 0x30420001, 0x00021023, + 0x30420005, 0x0a000dea, 0x34510004, 0x27660100, 0x00041080, 0x00c21021, + 0x8c430000, 0x02031823, 0x04600004, 0x24820001, 0x30440007, 0x1485fff9, + 0x00041080, 0x10870007, 0x3c030800, 0xa3640121, 0x8c620094, 0x24110005, + 0x24420001, 0x0a000dea, 0xac620094, 0x24110004, 0x32220001, 0x1040001e, + 0x8e820020, 0x1040001d, 0x32220004, 0x0e00148e, 0x00000000, 0x8f820018, + 0xac520000, 0x8f840018, 0x24020001, 0xac820004, 0x8f830018, 0xac600008, + 0x8f820018, 0xac40000c, 0x8f830018, 0xac600010, 0x8f820018, 0xac500014, + 0x8f850018, 0x3c026000, 0x8c434448, 0x24040001, 0x3c020800, 0xaca30018, + 0x944358ce, 0x8f850018, 0x3c024010, 0x00621825, 0x0e0014cc, 0xaca3001c, + 0x32220004, 0x10400081, 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, 0x0a000e37, 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, + 0x93620082, 0x30420080, 0x50400001, 0xa3600081, 0x3c028000, 0x34420001, + 0x02421025, 0xaf420020, 0x9363007e, 0x9362007a, 0x10620004, 0x00000000, + 0x0e0013c4, 0x00000000, 0x00403821, 0x10e0001f, 0x3c029000, 0x34420001, + 0x02421025, 0xaf420020, 0x3c038000, 0x8f420020, 0x00431024, 0x1440fffd, + 0x00000000, 0x9362007d, 0x3c038000, 0xa362007d, 0x8f640074, 0x34630001, + 0x02431825, 0xaf430020, 0x04810006, 0x3c038000, 0x02402021, 0x0e000470, + 0x24050b3d, 0x0a000e8d, 0x00000000, 0x8f4201f8, 0x00431024, 0x1440fffd, + 0x24020002, 0x3c031000, 0xaf5201c0, 0xa34201c4, 0xaf4301f8, 0x9342010b, + 0x9343010b, 0x8e820020, 0x27500100, 0x38630006, 0x10400029, 0x2c710001, + 0x0e00148e, 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, 0x944358ce, + 0x8f840018, 0x0a000eb8, 0x3c024013, 0x944358ce, 0x8f840018, 0x3c024014, + 0x00621825, 0xac83001c, 0x0e0014cc, 0x24040001, 0x8e700014, 0x8f620040, + 0x14500003, 0x00501023, 0x0a000ec3, 0x00001021, 0x28420001, 0x1040003a, + 0x00000000, 0x0e000fae, 0x02002021, 0xaf700040, 0x9362003e, 0x30420001, + 0x1440000b, 0x3c029000, 0x93620022, 0x24420001, 0xa3620022, 0x93630022, + 0x3c020800, 0x8c440098, 0x0064182b, 0x14600025, 0x3c020800, 0x3c029000, + 0x34420001, 0x02421025, 0xaf420020, 0x3c038000, 0x8f420020, 0x00431024, + 0x1440fffd, 0x00000000, 0x9362007d, 0x3c038000, 0x34420001, 0xa362007d, + 0x8f640074, 0x34630001, 0x02431825, 0xaf430020, 0x04810006, 0x3c038000, + 0x02402021, 0x0e000470, 0x24050273, 0x0a000ef6, 0x24020001, 0x8f4201f8, + 0x00431024, 0x1440fffd, 0x24020002, 0x3c031000, 0xaf5201c0, 0xa34201c4, + 0xaf4301f8, 0x24020001, 0xa7620012, 0x0a000efe, 0xa3600022, 0x9743007a, + 0x9444002a, 0x00641821, 0x3063fffe, 0xa7630012, 0x97420108, 0x8fbf0024, + 0x8fb40020, 0x8fb3001c, 0x8fb20018, 0x8fb10014, 0x8fb00010, 0x00021042, + 0x30420001, 0x03e00008, 0x27bd0028, 0x27bdffe0, 0xafb20018, 0x3c120800, + 0x8e420020, 0xafb00010, 0x27500100, 0xafbf001c, 0x10400046, 0xafb10014, + 0x0e00148e, 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, + 0x245158c0, 0xaca30018, 0x9623000e, 0x8f850018, 0x3c024016, 0x00621825, + 0x0e0014cc, 0xaca3001c, 0x96030008, 0x30630010, 0x1060001c, 0x8e420020, + 0x1040001a, 0x8e100000, 0x0e00148e, 0x00000000, 0x8f820018, 0xac500000, + 0x8f830018, 0xac600004, 0x8f820018, 0xac400008, 0x8f830018, 0xac60000c, + 0x8f820018, 0xac400010, 0x8f830018, 0xac600014, 0x8f850018, 0x3c036000, + 0x8c634448, 0x24040001, 0xaca30018, 0x9622000e, 0x8f850018, 0x3c034015, + 0x00431025, 0x0e0014cc, 0xaca2001c, 0x00001021, 0x8fbf001c, 0x8fb20018, + 0x8fb10014, 0x8fb00010, 0x03e00008, 0x27bd0020, 0x27bdffe0, 0xafb20018, + 0x3c120800, 0x8e420020, 0xafb00010, 0x27500100, 0xafbf001c, 0x10400041, + 0xafb10014, 0x0e00148e, 0x00000000, 0x8f830018, 0x8e020000, 0xac620000, + 0x8f840018, 0x24020100, 0xac820004, 0x8f830018, 0x8e02001c, 0xac620008, + 0x8f840018, 0x8e020018, 0xac82000c, 0x8f830018, 0x96020012, 0xac620010, + 0x8f840018, 0x96020008, 0xac820014, 0x8f850018, 0x3c026000, 0x8c434448, + 0x24040001, 0x3c020800, 0x245158c0, 0xaca30018, 0x9623000e, 0x8f850018, + 0x3c024017, 0x00621825, 0x0e0014cc, 0xaca3001c, 0x96030008, 0x30630010, + 0x1060001c, 0x8e420020, 0x1040001a, 0x8e100000, 0x0e00148e, 0x00000000, + 0x8f820018, 0xac500000, 0x8f830018, 0xac600004, 0x8f820018, 0xac400008, + 0x8f830018, 0xac60000c, 0x8f820018, 0xac400010, 0x8f830018, 0xac600014, + 0x8f850018, 0x3c036000, 0x8c634448, 0x24040001, 0xaca30018, 0x9622000e, + 0x8f850018, 0x3c034015, 0x00431025, 0x0e0014cc, 0xaca2001c, 0x00001021, + 0x8fbf001c, 0x8fb20018, 0x8fb10014, 0x8fb00010, 0x03e00008, 0x27bd0020, + 0x27bdfff0, 0x03e00008, 0x27bd0010, 0x27bdffd0, 0xafb10014, 0x00808821, + 0xafb40020, 0x00c0a021, 0xafbf0028, 0xafb50024, 0xafb3001c, 0xafb20018, + 0xafb00010, 0x93620023, 0x00e0a821, 0x30420040, 0x1040003e, 0x30b3ffff, + 0x3c120800, 0x8e420020, 0x1040003a, 0x8f70004c, 0x0e00148e, 0x00000000, + 0x8f820018, 0xac510000, 0x8f840018, 0x24020001, 0xac820004, 0x8f830018, + 0xac600008, 0x8f820018, 0xac40000c, 0x8f830018, 0xac600010, 0x8f820018, + 0x24040001, 0xac500014, 0x8f850018, 0x3c026000, 0x8c434448, 0x3c020800, + 0x245058c0, 0xaca30018, 0x9603000e, 0x8f850018, 0x3c024010, 0x00621825, + 0x0e0014cc, 0xaca3001c, 0x8e430020, 0x1060001b, 0x00000000, 0x0e00148e, + 0x00000000, 0x8f820018, 0xac510000, 0x8f840018, 0x3c02008d, 0xac820004, + 0x8f830018, 0xac600008, 0x8f820018, 0xac40000c, 0x8f830018, 0xac600010, + 0x8f820018, 0xac550014, 0x8f850018, 0x3c036000, 0x8c634448, 0x24040001, + 0xaca30018, 0x9602000e, 0x8f850018, 0x3c034019, 0x00431025, 0x0e0014cc, + 0xaca2001c, 0x93620023, 0x30420020, 0x14400003, 0x3c120800, 0x1280003f, + 0x3c029000, 0x8e420020, 0x8f70004c, 0x1040003b, 0x3c029000, 0x0e00148e, + 0x00000000, 0x8f820018, 0xac510000, 0x8f840018, 0x24020001, 0xac820004, + 0x8f830018, 0xac600008, 0x8f820018, 0xac40000c, 0x8f830018, 0xac600010, + 0x8f820018, 0x24040001, 0xac500014, 0x8f850018, 0x3c026000, 0x8c434448, + 0x3c020800, 0x245058c0, 0xaca30018, 0x9603000e, 0x8f850018, 0x3c024010, + 0x00621825, 0x0e0014cc, 0xaca3001c, 0x8e430020, 0x1060001c, 0x3c029000, + 0x0e00148e, 0x00000000, 0x8f820018, 0xac510000, 0x8f840018, 0x00131400, + 0xac820004, 0x8f830018, 0xac750008, 0x8f820018, 0xac40000c, 0x8f830018, + 0xac600010, 0x8f820018, 0xac400014, 0x8f850018, 0x3c036000, 0x8c634448, + 0x24040001, 0xaca30018, 0x9602000e, 0x8f850018, 0x3c03401b, 0x00431025, + 0x0e0014cc, 0xaca2001c, 0x3c029000, 0x34420001, 0x02221025, 0xaf420020, + 0x3c038000, 0x8f420020, 0x00431024, 0x1440fffd, 0x00000000, 0x93630023, + 0x3c028000, 0x34420001, 0x02221025, 0x8fbf0028, 0x8fb50024, 0x8fb40020, + 0x8fb3001c, 0x8fb20018, 0x8fb10014, 0x8fb00010, 0x3063009f, 0xa3630023, + 0xaf420020, 0x03e00008, 0x27bd0030, 0x27bdffe0, 0xafb10014, 0x27510100, + 0x3c029000, 0x34420001, 0xafb00010, 0x00808021, 0x02021025, 0x3c038000, + 0xafbf0018, 0xaf420020, 0x8f420020, 0x00431024, 0x1440fffd, 0x00000000, + 0xa7600008, 0x8f63005c, 0x3c028000, 0x34420001, 0xaf630148, 0x8f640050, + 0x02021025, 0x3c039000, 0xaf64017c, 0xaf420020, 0x8f450100, 0x34630001, + 0x3c048000, 0x00a31825, 0xaf430020, 0x8f420020, 0x00441024, 0x1440fffd, + 0x00000000, 0x9362007d, 0x3c038000, 0x34420001, 0xa362007d, 0x8f640074, + 0x34630001, 0x00a31825, 0xaf430020, 0x04810006, 0x3c038000, 0x00a02021, + 0x0e000470, 0x24050de5, 0x0a001093, 0x3c020800, 0x8f4201f8, 0x00431024, + 0x1440fffd, 0x24020002, 0x3c031000, 0xaf4501c0, 0xa34201c4, 0xaf4301f8, + 0x3c020800, 0x8c430020, 0x1060001e, 0x8fbf0018, 0x0e00148e, 0x00000000, + 0x8f830018, 0xac700000, 0x9622000c, 0x8f840018, 0x00021400, 0xac820004, + 0x8f830018, 0xac600008, 0x8f820018, 0xac40000c, 0x8f830018, 0xac600010, + 0x8f820018, 0xac400014, 0x8f850018, 0x3c026000, 0x8c434448, 0x24040001, + 0x3c020800, 0xaca30018, 0x944358ce, 0x8f850018, 0x3c02401f, 0x00621825, + 0x0e0014cc, 0xaca3001c, 0x8fbf0018, 0x8fb10014, 0x8fb00010, 0x03e00008, + 0x27bd0020, 0x3c020800, 0x24424c3c, 0xaf82000c, 0x03e00008, 0x00000000, + 0x27bdffe8, 0xafb00010, 0x27500100, 0xafbf0014, 0x8e02001c, 0x14400003, + 0x3c020800, 0x0000000d, 0x3c020800, 0x8c430020, 0x10600020, 0x00001021, + 0x0e00148e, 0x00000000, 0x8f830018, 0x8e020000, 0xac620000, 0x8f840018, + 0x8e02001c, 0xac820004, 0x8f830018, 0xac600008, 0x8f840018, 0x8e020018, + 0xac82000c, 0x8f850018, 0x96020012, 0xaca20010, 0x8f830018, 0x3c026000, + 0xac600014, 0x8f840018, 0x8c434448, 0x3c020800, 0xac830018, 0x944358ce, + 0x8f840018, 0x3c024012, 0x00621825, 0xac83001c, 0x0e0014cc, 0x24040001, + 0x00001021, 0x8fbf0014, 0x8fb00010, 0x03e00008, 0x27bd0018, 0x3c020800, + 0x97430078, 0x9444002e, 0x00001021, 0x00641821, 0x3063fffe, 0x03e00008, + 0xa7630010, 0x27bdfff0, 0x00001021, 0x03e00008, 0x27bd0010, 0x8f420100, + 0x34420001, 0xaf4200a4, 0x03e00008, 0x00001021, 0x27bdffe0, 0xafbf0018, + 0xafb10014, 0xafb00010, 0x9362007e, 0x30d000ff, 0x16020031, 0x00808821, + 0x8f620178, 0x1602002e, 0x00000000, 0x9362007f, 0x1602002b, 0x00000000, + 0x9362007a, 0x16020004, 0x00000000, 0x0000000d, 0x00000000, 0x240009d2, + 0x0e0013e6, 0x00000000, 0x3c039000, 0x34630001, 0x3c048000, 0x02231825, + 0xa370007a, 0xaf430020, 0x8f420020, 0x00441024, 0x1440fffd, 0x00000000, + 0x9362007d, 0x3c038000, 0xa362007d, 0x8f640074, 0x34630001, 0x02231825, + 0xaf430020, 0x04810006, 0x3c038000, 0x02202021, 0x0e000470, 0x240509dd, + 0x0a001138, 0x8fbf0018, 0x8f4201f8, 0x00431024, 0x1440fffd, 0x24020002, + 0x3c031000, 0xaf5101c0, 0xa34201c4, 0xaf4301f8, 0x0a001138, 0x8fbf0018, + 0x0000000d, 0x00000000, 0x240009e2, 0x8fbf0018, 0x8fb10014, 0x8fb00010, + 0x03e00008, 0x27bd0020, 0x27bdffe8, 0x30a500ff, 0x3c029000, 0x34420001, + 0x00803821, 0x00e21025, 0x3c038000, 0xafbf0010, 0xaf420020, 0x8f420020, + 0x00431024, 0x1440fffd, 0x00000000, 0x9362007d, 0x3c038000, 0x00a21025, + 0xa362007d, 0x8f640074, 0x34630001, 0x00e31825, 0xaf430020, 0x04810006, + 0x3c038000, 0x00e02021, 0x0e000470, 0x00c02821, 0x0a001161, 0x8fbf0010, + 0x8f4201f8, 0x00431024, 0x1440fffd, 0x24020002, 0x3c031000, 0xaf4701c0, + 0xa34201c4, 0xaf4301f8, 0x8fbf0010, 0x03e00008, 0x27bd0018, 0x3c020800, + 0x8c430020, 0x27bdffe8, 0xafb00010, 0x27500100, 0x10600024, 0xafbf0014, + 0x0e00148e, 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, 0x946458ce, 0x8f850018, + 0x00021400, 0x00441025, 0x24040001, 0x0e0014cc, 0xaca2001c, 0x8fbf0014, + 0x8fb00010, 0x03e00008, 0x27bd0018, 0x3c020800, 0x8c430020, 0x27bdffe8, + 0xafb00010, 0x27500100, 0x10600020, 0xafbf0014, 0x0e00148e, 0x00000000, + 0x8f820018, 0xac400000, 0x8f830018, 0xac600004, 0x8f820018, 0xac400008, + 0x8f830018, 0xac60000c, 0x9602000c, 0x9603000e, 0x8f840018, 0x00021400, + 0x00431025, 0xac820010, 0x8f830018, 0x3c026000, 0xac600014, 0x8f840018, + 0x8c434448, 0xac830018, 0x96020008, 0x3c030800, 0x946458ce, 0x8f850018, + 0x00021400, 0x00441025, 0x24040001, 0x0e0014cc, 0xaca2001c, 0x8fbf0014, + 0x8fb00010, 0x03e00008, 0x27bd0018, 0x27bdffe8, 0xafb00010, 0x27500100, + 0xafbf0014, 0x9602000c, 0x10400024, 0x00802821, 0x3c020800, 0x8c430020, + 0x1060003a, 0x8fbf0014, 0x0e00148e, 0x00000000, 0x8f840018, 0x8e030000, + 0xac830000, 0x9602000c, 0x8f840018, 0x00021400, 0xac820004, 0x8f830018, + 0xac600008, 0x8f820018, 0xac40000c, 0x8f830018, 0xac600010, 0x8f820018, + 0xac400014, 0x8f850018, 0x3c026000, 0x8c434448, 0x24040001, 0x3c020800, + 0xaca30018, 0x944358ce, 0x8f850018, 0x3c02400b, 0x00621825, 0x0e0014cc, + 0xaca3001c, 0x0a0011ff, 0x8fbf0014, 0x93620005, 0x30420010, 0x14400015, + 0x3c029000, 0x34420001, 0x00a21025, 0xaf420020, 0x3c038000, 0x8f420020, + 0x00431024, 0x1440fffd, 0x00000000, 0x3c038000, 0x93620005, 0x34630001, + 0x00a02021, 0x00a31825, 0x24055852, 0x34420010, 0xa3620005, 0x0e000766, + 0xaf430020, 0x0a0011ff, 0x8fbf0014, 0x0000000d, 0x8fbf0014, 0x8fb00010, + 0x03e00008, 0x27bd0018, 0x3c020800, 0x8c430020, 0x27bdffe8, 0xafb00010, + 0x27500100, 0x10600022, 0xafbf0014, 0x0e00148e, 0x00000000, 0x8f840018, + 0x8e020004, 0xac820000, 0x9603000c, 0x9762002c, 0x8f840018, 0x00031c00, + 0x00431025, 0xac820004, 0x8f830018, 0xac600008, 0x8f820018, 0xac40000c, + 0x8f830018, 0xac600010, 0x8f820018, 0xac400014, 0x8f850018, 0x3c026000, + 0x8c434448, 0x24040001, 0x3c020800, 0xaca30018, 0x944358ce, 0x8f850018, + 0x3c02400e, 0x00621825, 0x0e0014cc, 0xaca3001c, 0x0e00122e, 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, 0x0e00148e, 0x00000000, 0x8f820018, 0xac510000, 0x8f840018, + 0x00101400, 0xac820004, 0x8f830018, 0xac600008, 0x8f820018, 0xac40000c, + 0x8f830018, 0xac600010, 0x8f820018, 0xac520014, 0x8f840018, 0x3c026000, + 0x8c434448, 0x3c020800, 0xac830018, 0x944358ce, 0x8f840018, 0x3c024019, + 0x00621825, 0xac83001c, 0x0e0014cc, 0x24040001, 0x8fbf001c, 0x8fb20018, + 0x8fb10014, 0x8fb00010, 0x03e00008, 0x27bd0020, 0x27bdffe8, 0x27450100, + 0xafbf0010, 0x94a3000c, 0x240200c1, 0x14620031, 0x00803021, 0x3c029000, + 0x34420001, 0x00c21025, 0xaf420020, 0x3c038000, 0x8f420020, 0x00431024, + 0x1440fffd, 0x3c028000, 0x34420001, 0x3c049000, 0x34840001, 0x3c058000, + 0x24030012, 0x00c21025, 0x00c42025, 0xa363003f, 0xaf420020, 0xaf440020, + 0x8f420020, 0x00451024, 0x1440fffd, 0x00000000, 0x9362007d, 0x3c038000, + 0x34420020, 0xa362007d, 0x8f640074, 0x34630001, 0x00c31825, 0xaf430020, + 0x04810006, 0x3c038000, 0x00c02021, 0x0e000470, 0x24050906, 0x0a0012a1, + 0x8fbf0010, 0x8f4201f8, 0x00431024, 0x1440fffd, 0x24020002, 0x3c031000, + 0xaf4601c0, 0xa34201c4, 0xaf4301f8, 0x0a0012a1, 0x8fbf0010, 0x00c02021, + 0x94a5000c, 0x24060001, 0x0e000fb1, 0x2407090e, 0x8fbf0010, 0x03e00008, + 0x27bd0018, 0x3c020800, 0x8c430020, 0x27bdffe0, 0xafb00010, 0x00808021, + 0xafb20018, 0x00a09021, 0xafb10014, 0x30d100ff, 0x1060001c, 0xafbf001c, + 0x0e00148e, 0x00000000, 0x8f820018, 0xac500000, 0x8f840018, 0x24020001, + 0xac820004, 0x8f830018, 0xac600008, 0x8f820018, 0xac40000c, 0x8f830018, + 0xac600010, 0x8f820018, 0xac520014, 0x8f840018, 0x3c026000, 0x8c434448, + 0x3c020800, 0xac830018, 0x944358ce, 0x8f840018, 0x3c024010, 0x00621825, + 0xac83001c, 0x0e0014cc, 0x02202021, 0x8fbf001c, 0x8fb20018, 0x8fb10014, + 0x8fb00010, 0x03e00008, 0x27bd0020, 0x27bdffe8, 0xafbf0014, 0xafb00010, + 0x93620005, 0x30420001, 0x10400036, 0x00808021, 0x3c029000, 0x34420001, + 0x02021025, 0xaf420020, 0x3c038000, 0x8f420020, 0x00431024, 0x1440fffd, + 0x00000000, 0x93620023, 0x34420004, 0xa3620023, 0x93630005, 0x3c048000, + 0x3c020800, 0x306300fe, 0xa3630005, 0x8c430020, 0x34840001, 0x02042025, + 0xaf440020, 0x10600020, 0x8fbf0014, 0x0e00148e, 0x00000000, 0x8f820018, + 0xac500000, 0x93630082, 0x9362003f, 0x8f840018, 0x00031a00, 0x00431025, + 0xac820004, 0x8f830018, 0xac600008, 0x8f820018, 0xac40000c, 0x8f830018, + 0xac600010, 0x8f820018, 0xac400014, 0x8f840018, 0x3c026000, 0x8c434448, + 0x3c020800, 0xac830018, 0x944358ce, 0x8f840018, 0x3c02400a, 0x00621825, + 0xac83001c, 0x0e0014cc, 0x24040001, 0x8fbf0014, 0x8fb00010, 0x03e00008, + 0x27bd0018, 0x3c020800, 0x8c430020, 0x27bdffe0, 0xafb10014, 0x00808821, + 0xafb20018, 0x00a09021, 0xafb00010, 0x30d000ff, 0x1060002f, 0xafbf001c, + 0x0e00148e, 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, 0x944358ce, 0x8f840018, 0x3c024011, + 0x00621825, 0xac83001c, 0x0e0014cc, 0x24040001, 0x8fbf001c, 0x8fb20018, + 0x8fb10014, 0x8fb00010, 0x03e00008, 0x27bd0020, 0x27bdffe8, 0xafbf0014, + 0xafb00010, 0x8f440100, 0x27500100, 0x8f650050, 0x0e0010fc, 0x9206001b, + 0x3c020800, 0x8c430020, 0x1060001d, 0x8e100018, 0x0e00148e, 0x00000000, + 0x8f840018, 0x8f420100, 0xac820000, 0x8f830018, 0xac700004, 0x8f840018, + 0x8f620050, 0xac820008, 0x8f830018, 0xac60000c, 0x8f820018, 0xac400010, + 0x8f830018, 0x3c026000, 0xac600014, 0x8f850018, 0x8c434448, 0x24040001, + 0x3c020800, 0xaca30018, 0x944358ce, 0x8f850018, 0x3c02401c, 0x00621825, + 0x0e0014cc, 0xaca3001c, 0x8fbf0014, 0x8fb00010, 0x03e00008, 0x27bd0018, + 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, 0x27bdffe8, 0x3c029000, 0xafbf0010, + 0x8f450140, 0x34420001, 0x3c038000, 0x00a21025, 0xaf420020, 0x8f420020, + 0x00431024, 0x1440fffd, 0x00000000, 0x9362007d, 0x3c038000, 0x34420001, + 0xa362007d, 0x8f640074, 0x34630001, 0x00a31825, 0xaf430020, 0x04810006, + 0x3c038000, 0x00a02021, 0x0e000470, 0x24050ac7, 0x0a0013b9, 0x8fbf0010, + 0x8f4201f8, 0x00431024, 0x1440fffd, 0x24020002, 0x3c031000, 0xaf4501c0, + 0xa34201c4, 0xaf4301f8, 0x8fbf0010, 0x03e00008, 0x27bd0018, 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, + 0x9362007e, 0x8f630178, 0x304200ff, 0x14430006, 0x00000000, 0x9363000b, + 0x24020001, 0x24630001, 0x03e00008, 0xa363000b, 0x03e00008, 0x00001021, + 0x9362000b, 0x10400023, 0x00001021, 0xa360000b, 0x9362003f, 0x304400ff, + 0x3883000e, 0x2c630001, 0x38820010, 0x2c420001, 0x00621825, 0x14600017, + 0x00001821, 0x24020012, 0x10820014, 0x00000000, 0x9363007e, 0x9362007a, + 0x14620007, 0x00000000, 0x9362007e, 0x24030001, 0x24420001, 0xa362007e, + 0x03e00008, 0x00601021, 0x9362007e, 0x8f630178, 0x304200ff, 0x14430005, + 0x00001821, 0x9362000b, 0x24030001, 0x24420001, 0xa362000b, 0x03e00008, + 0x00601021, 0x03e00008, 0x00000000, 0x24040001, 0xaf64000c, 0x8f6300dc, + 0x8f6200cc, 0x50620001, 0xa7640010, 0xa7640012, 0xa7640014, 0x03e00008, + 0xa7640016, 0x3c020800, 0x8c430020, 0x27bdffe8, 0x1060001b, 0xafbf0010, + 0x0e00148e, 0x00000000, 0x8f820018, 0xac400000, 0x8f830018, 0xac600004, + 0x8f820018, 0xac400008, 0x8f830018, 0xac60000c, 0x8f820018, 0xac400010, + 0x8f830018, 0x3c026000, 0xac600014, 0x8f840018, 0x8c434448, 0x3c020800, + 0xac830018, 0x944358ce, 0x8f840018, 0x3c024020, 0x00621825, 0xac83001c, + 0x0e0014cc, 0x24040001, 0x8fbf0010, 0x03e00008, 0x27bd0018, 0x3c020800, + 0x8c430020, 0x27bdffe0, 0xafb00010, 0x00a08021, 0xafb10014, 0x00c08821, + 0xafb20018, 0x00e09021, 0x1060001e, 0xafbf001c, 0x0e00148e, 0x00000000, + 0x8f840018, 0x8f420100, 0xac820000, 0x8f830018, 0xac700004, 0x8f820018, + 0xac510008, 0x8f830018, 0xac72000c, 0x8f840018, 0x8fa20030, 0xac820010, + 0x8f830018, 0x8fa20034, 0xac620014, 0x8f840018, 0x3c026000, 0x8c434448, + 0x3c020800, 0xac830018, 0x944358ce, 0x8f840018, 0x3c0240c9, 0x00621825, + 0xac83001c, 0x0e0014cc, 0x24040001, 0x8fbf001c, 0x8fb20018, 0x8fb10014, + 0x8fb00010, 0x03e00008, 0x27bd0020, 0x3c020800, 0x8c430020, 0x27bdffe8, + 0xafb00010, 0x27500100, 0x1060001d, 0xafbf0014, 0x0e00148e, 0x00000000, + 0x8f830018, 0x8e020004, 0xac620000, 0x8f840018, 0x8e020018, 0xac820004, + 0x8f850018, 0x8e020000, 0xaca20008, 0x8f830018, 0xac60000c, 0x8f820018, + 0xac400010, 0x8f830018, 0xac600014, 0x8f820018, 0xac400018, 0x96030008, + 0x3c020800, 0x944458ce, 0x8f850018, 0x00031c00, 0x00641825, 0x24040001, + 0x0e0014cc, 0xaca3001c, 0x8fbf0014, 0x8fb00010, 0x03e00008, 0x27bd0018, + 0x3c060800, 0x24c558c0, 0x3c02000a, 0x03421821, 0x94640006, 0x94a2000a, + 0x00441023, 0x00021400, 0x00021c03, 0x04610006, 0xa4a40006, 0x0000000d, + 0x00000000, 0x2400005a, 0x0a0014a3, 0x24020001, 0x8f820014, 0x0062102b, + 0x14400002, 0x00001021, 0x24020001, 0x304200ff, 0x1040001c, 0x274a0400, + 0x3c07000a, 0x3c020800, 0x244558c0, 0x94a9000a, 0x8f880014, 0x03471021, + 0x94430006, 0x00402021, 0xa4a30006, 0x94820006, 0xa4a20006, 0x01221023, + 0x00021400, 0x00021403, 0x04410006, 0x0048102b, 0x0000000d, 0x00000000, + 0x2400005a, 0x0a0014be, 0x24020001, 0x14400002, 0x00001021, 0x24020001, + 0x304200ff, 0x1440ffec, 0x03471021, 0x24c458c0, 0x8c820010, 0xaf420038, + 0x8c830014, 0x3c020005, 0xaf43003c, 0xaf420030, 0xaf800010, 0xaf8a0018, + 0x03e00008, 0x00000000, 0x27bdffe0, 0x8f820010, 0x8f850018, 0x3c070800, + 0x24e858c0, 0xafbf001c, 0xafb20018, 0xafb10014, 0xafb00010, 0x9503000a, + 0x8d060014, 0x00009021, 0x309000ff, 0x00e08821, 0x24420001, 0x24a50020, + 0x24630001, 0xaf820010, 0xaf850018, 0xa503000a, 0x24c30020, 0x3c028000, + 0x04c10007, 0xad030014, 0x00621024, 0x14400005, 0x262258c0, 0x8d020010, + 0x24420001, 0xad020010, 0x262258c0, 0x9444000a, 0x94450018, 0x0010102b, + 0x00a41826, 0x2c630001, 0x00621825, 0x1060001c, 0x3c030006, 0x8f820010, + 0x24120001, 0x00021140, 0x00431025, 0xaf420030, 0x00000000, 0x00000000, + 0x00000000, 0x27450400, 0x8f420000, 0x30420010, 0x1040fffd, 0x262258c0, + 0x9444000a, 0x94430018, 0xaf800010, 0xaf850018, 0x14830012, 0x262758c0, + 0x0e00155a, 0x00000000, 0x1600000e, 0x262758c0, 0x0e00148e, 0x00000000, + 0x0a001517, 0x262758c0, 0x00041c00, 0x00031c03, 0x00051400, 0x00021403, + 0x00621823, 0x18600002, 0x3c026000, 0xac400808, 0x262758c0, 0x94e2000e, + 0x94e3000c, 0x24420001, 0xa4e2000e, 0x3042ffff, 0x50430001, 0xa4e0000e, + 0x12000005, 0x3c02000a, 0x94e2000a, 0xa74200a2, 0x0a001554, 0x02401021, + 0x03421821, 0x94640006, 0x94e2000a, 0x00441023, 0x00021400, 0x00021c03, + 0x04610006, 0xa4e40006, 0x0000000d, 0x00000000, 0x2400005a, 0x0a001536, + 0x24020001, 0x8f820014, 0x0062102b, 0x14400002, 0x00001021, 0x24020001, + 0x304200ff, 0x1040001b, 0x3c020800, 0x3c06000a, 0x244558c0, 0x94a8000a, + 0x8f870014, 0x03461021, 0x94430006, 0x00402021, 0xa4a30006, 0x94820006, + 0xa4a20006, 0x01021023, 0x00021400, 0x00021403, 0x04410006, 0x0047102b, + 0x0000000d, 0x00000000, 0x2400005a, 0x0a001550, 0x24020001, 0x14400002, + 0x00001021, 0x24020001, 0x304200ff, 0x1440ffec, 0x03461021, 0x02401021, + 0x8fbf001c, 0x8fb20018, 0x8fb10014, 0x8fb00010, 0x03e00008, 0x27bd0020, + 0x3c020800, 0x244558c0, 0x94a3001a, 0x8ca40024, 0x00403021, 0x000318c0, + 0x00832021, 0xaf44003c, 0x8ca20020, 0xaf420038, 0x3c020050, 0x34420008, + 0xaf420030, 0x00000000, 0x00000000, 0x00000000, 0x8f420000, 0x30420020, + 0x1040fffd, 0x00000000, 0x8f430400, 0x24c658c0, 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, + 0x261058c0, 0x3c05000a, 0x02002021, 0x03452821, 0xafbf0014, 0x0e0015b0, + 0x2406000a, 0x96020002, 0x9603001e, 0x3042000f, 0x24420003, 0x00431804, + 0x24027fff, 0x0043102b, 0xaf830014, 0x10400004, 0x00000000, 0x0000000d, + 0x00000000, 0x24000043, 0x0e00155a, 0x00000000, 0x8fbf0014, 0x8fb00010, + 0x03e00008, 0x27bd0018, 0x10c00007, 0x00000000, 0x8ca20000, 0x24c6ffff, + 0x24a50004, 0xac820000, 0x14c0fffb, 0x24840004, 0x03e00008, 0x00000000, + 0x0a0015c1, 0x00a01021, 0xac860000, 0x00000000, 0x00000000, 0x24840004, + 0x00a01021, 0x1440fffa, 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] = { @@ -687,368 +989,952 @@ 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_RXP_b06FwText[(0x588c/4) + 1] = { + 0x0a000c61, 0x00000000, 0x00000000, 0x0000000d, 0x72787020, 0x322e362e, + 0x31000000, 0x02060103, 0x00000000, 0x0000000d, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 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, 0x244258e0, 0x3c030800, 0x24636ca4, 0xac400000, 0x0043202b, + 0x1480fffd, 0x24420004, 0x3c1d0800, 0x37bd7ffc, 0x03a0f021, 0x3c100800, + 0x26103184, 0x3c1c0800, 0x279c58e0, 0x0e00104a, 0x00000000, 0x0000000d, + 0x27bdffe8, 0xafb00010, 0xafbf0014, 0x0e000f1d, 0x00808021, 0x1440000d, + 0x00000000, 0x8f820010, 0x10400005, 0x00000000, 0x9743011c, 0x9742011e, + 0x0a000c89, 0x00021400, 0x9743011e, 0x9742011c, 0x00021400, 0x00621825, + 0xaf830004, 0x8f840008, 0x3c020020, 0x34424000, 0x00821824, 0x54620004, + 0x3c020020, 0x8f820014, 0x0a000c9a, 0x34421000, 0x34428000, 0x00821824, + 0x14620004, 0x00000000, 0x8f820014, 0x34428000, 0xaf820014, 0x8f820008, + 0x9743010c, 0x00403021, 0x30421000, 0x10400010, 0x3069ffff, 0x30c20020, + 0x1440000e, 0x24070005, 0x3c021000, 0x00c21024, 0x10400009, 0x3c030dff, + 0x3463ffff, 0x3c020e00, 0x00c21024, 0x0062182b, 0x50600004, 0x24070001, + 0x0a000cb2, 0x3c020800, 0x24070001, 0x3c020800, 0x8c430034, 0x1460001d, + 0x00405821, 0x8f820014, 0x30424000, 0x1440001a, 0x3c020001, 0x3c021f01, + 0x00c24024, 0x3c031000, 0x15030015, 0x3c020001, 0x31220200, 0x14400012, + 0x3c020001, 0x9744010e, 0x24020003, 0xa342018b, 0x97850016, 0x24020002, + 0x34e30002, 0xaf400180, 0xa742018c, 0xa7430188, 0x24840004, 0x30a5bfff, + 0xa744018e, 0xa74501a6, 0xaf4801b8, 0x0a000f19, 0x00001021, 0x3c020001, + 0x00c21024, 0x1040002f, 0x00000000, 0x9742010e, 0x3c038000, 0x3046ffff, + 0x8f4201b8, 0x00431024, 0x1440fffd, 0x24020003, 0xa342018b, 0x9784000a, + 0x8f850004, 0x8f870014, 0x24020080, 0x24030002, 0xaf420180, 0x24020003, + 0xa743018c, 0xa746018e, 0xa7420188, 0x30e28000, 0xa7440190, 0x1040000c, + 0xaf4501a8, 0x93420116, 0x304200fc, 0x005a1021, 0x24424004, 0x8c430000, + 0x3063ffff, 0x14600004, 0x3c02ffff, 0x34427fff, 0x00e21024, 0xaf820014, + 0x97820016, 0x9743010c, 0x8f440104, 0x3042bfff, 0x00031c00, 0x3084ffff, + 0x00641825, 0xa74201a6, 0xaf4301ac, 0x3c021000, 0xaf4201b8, 0x0a000f19, + 0x00001021, 0x8f820014, 0x30434000, 0x10600016, 0x00404021, 0x3c020f00, + 0x00c21024, 0x14400012, 0x00000000, 0x93420116, 0x34424000, 0x03421821, + 0x94650002, 0x2ca21389, 0x1040000b, 0x3c020800, 0x24425900, 0x00051942, + 0x00031880, 0x00621821, 0x30a5001f, 0x8c640000, 0x24020001, 0x00a21004, + 0x00822024, 0x02048025, 0x12000030, 0x3c021000, 0x9742010e, 0x34e80002, + 0x3c038000, 0x24420004, 0x3046ffff, 0x8f4201b8, 0x00431024, 0x1440fffd, + 0x24020003, 0xa342018b, 0x9784000a, 0x8f850004, 0x8f870014, 0x24020180, + 0x24030002, 0xaf420180, 0xa743018c, 0xa746018e, 0xa7480188, 0x30e28000, + 0xa7440190, 0x1040000c, 0xaf4501a8, 0x93420116, 0x304200fc, 0x005a1021, + 0x24424004, 0x8c430000, 0x3063ffff, 0x14600004, 0x3c02ffff, 0x34427fff, + 0x00e21024, 0xaf820014, 0x97820016, 0x9743010c, 0x8f440104, 0x3042bfff, + 0x00031c00, 0x3084ffff, 0x00641825, 0xa74201a6, 0xaf4301ac, 0x3c021000, + 0xaf4201b8, 0x0a000f19, 0x00001021, 0x00c21024, 0x104000c0, 0x3c020800, + 0x8c430030, 0x10600037, 0x31024000, 0x10400035, 0x3c030f00, 0x00c31824, + 0x3c020100, 0x0043102b, 0x14400031, 0x3c030800, 0x9742010e, 0x34e80002, + 0x3c038000, 0x24420004, 0x3046ffff, 0x8f4201b8, 0x00431024, 0x1440fffd, + 0x24020003, 0xa342018b, 0x9784000a, 0x8f850004, 0x8f870014, 0x24020080, + 0x24030002, 0xaf420180, 0xa743018c, 0xa746018e, 0xa7480188, 0x30e28000, + 0xa7440190, 0x1040000c, 0xaf4501a8, 0x93420116, 0x304200fc, 0x005a1021, + 0x24424004, 0x8c430000, 0x3063ffff, 0x14600004, 0x3c02ffff, 0x34427fff, + 0x00e21024, 0xaf820014, 0x97820016, 0x9743010c, 0x8f440104, 0x3042bfff, + 0x00031c00, 0x3084ffff, 0x00641825, 0xa74201a6, 0xaf4301ac, 0x3c021000, + 0xaf4201b8, 0x0a000f19, 0x00001021, 0x3c030800, 0x8c620024, 0x30420008, + 0x10400035, 0x34ea0002, 0x3c020f00, 0x00c21024, 0x14400032, 0x8d620034, + 0x31220200, 0x1040002f, 0x8d620034, 0x9742010e, 0x30e8fffb, 0x3c038000, + 0x24420004, 0x3046ffff, 0x8f4201b8, 0x00431024, 0x1440fffd, 0x24020003, + 0xa342018b, 0x9784000a, 0x8f850004, 0x8f870014, 0x24020180, 0x24030002, + 0xaf420180, 0xa743018c, 0xa746018e, 0xa7480188, 0x30e28000, 0xa7440190, + 0x1040000c, 0xaf4501a8, 0x93420116, 0x304200fc, 0x005a1021, 0x24424004, + 0x8c430000, 0x3063ffff, 0x14600004, 0x3c02ffff, 0x34427fff, 0x00e21024, + 0xaf820014, 0x97820016, 0x9743010c, 0x8f440104, 0x3042bfff, 0x00031c00, + 0x3084ffff, 0x00641825, 0xa74201a6, 0xaf4301ac, 0x3c021000, 0xaf4201b8, + 0x8d620034, 0x8f860008, 0x10400012, 0x30c20100, 0x10400010, 0x3c020f00, + 0x00c21024, 0x3c030200, 0x1043000c, 0x3c020800, 0x8c430038, 0x8f840004, + 0x3c020800, 0x2442003c, 0x2463ffff, 0x00832024, 0x00822021, 0x90830000, + 0x24630004, 0x0a000de1, 0x000329c0, 0x00000000, 0x00061602, 0x3042000f, + 0x000229c0, 0x3c04fc00, 0x00441021, 0x3c030300, 0x0062182b, 0x50600001, + 0x24050800, 0x9742010e, 0x3148ffff, 0x3c038000, 0x24420004, 0x3046ffff, + 0x8f4201b8, 0x00431024, 0x1440fffd, 0x24020003, 0xa342018b, 0x9783000a, + 0x8f840004, 0x8f870014, 0x24020002, 0xaf450180, 0xa742018c, 0xa746018e, + 0xa7480188, 0x30e28000, 0xa7430190, 0x1040000c, 0xaf4401a8, 0x93420116, + 0x304200fc, 0x005a1021, 0x24424004, 0x8c430000, 0x3063ffff, 0x14600004, + 0x3c02ffff, 0x34427fff, 0x00e21024, 0xaf820014, 0x97820016, 0x9743010c, + 0x8f440104, 0x3042bfff, 0x00031c00, 0x3084ffff, 0x00641825, 0xa74201a6, + 0xaf4301ac, 0x3c021000, 0xaf4201b8, 0x0a000f19, 0x00001021, 0x8f424000, + 0x30420100, 0x104000d5, 0x3c020800, 0x8c440024, 0x24030001, 0x1483002f, + 0x00405021, 0x9742010e, 0x34e70002, 0x3c038000, 0x24420004, 0x3045ffff, + 0x8f4201b8, 0x00431024, 0x1440fffd, 0x24020003, 0xa342018b, 0x9783000a, + 0x8f840004, 0x8f860014, 0x24020002, 0xaf400180, 0xa742018c, 0xa745018e, + 0xa7470188, 0x30c28000, 0xa7430190, 0x1040000c, 0xaf4401a8, 0x93420116, + 0x304200fc, 0x005a1021, 0x24424004, 0x8c430000, 0x3063ffff, 0x14600004, + 0x3c02ffff, 0x34427fff, 0x00c21024, 0xaf820014, 0x97820016, 0x9743010c, + 0x8f440104, 0x3042bfff, 0x00031c00, 0x3084ffff, 0x00641825, 0xa74201a6, + 0xaf4301ac, 0x3c021000, 0xaf4201b8, 0x0a000f19, 0x00001021, 0x30820001, + 0x1040002e, 0x30eb0004, 0x9742010e, 0x30e9fffb, 0x3c038000, 0x24420004, + 0x3045ffff, 0x8f4201b8, 0x00431024, 0x1440fffd, 0x24020003, 0xa342018b, + 0x9783000a, 0x8f840004, 0x8f860014, 0x24020002, 0xaf400180, 0xa742018c, + 0xa745018e, 0xa7470188, 0x30c28000, 0xa7430190, 0x1040000c, 0xaf4401a8, + 0x93420116, 0x304200fc, 0x005a1021, 0x24424004, 0x8c430000, 0x3063ffff, + 0x14600004, 0x3c02ffff, 0x34427fff, 0x00c21024, 0xaf820014, 0x97820016, + 0x9743010c, 0x8f440104, 0x3042bfff, 0x00031c00, 0x3084ffff, 0x00641825, + 0xa74201a6, 0xaf4301ac, 0x3c021000, 0xaf4201b8, 0x3127ffff, 0x8d420024, + 0x30420004, 0x10400030, 0x8d420024, 0x9742010e, 0x30e9fffb, 0x3c038000, + 0x24420004, 0x3046ffff, 0x8f4201b8, 0x00431024, 0x1440fffd, 0x24020003, + 0xa342018b, 0x9784000a, 0x8f850004, 0x8f880014, 0x24020100, 0x24030002, + 0xaf420180, 0xa743018c, 0xa746018e, 0xa7470188, 0x31028000, 0xa7440190, + 0x1040000c, 0xaf4501a8, 0x93420116, 0x304200fc, 0x005a1021, 0x24424004, + 0x8c430000, 0x3063ffff, 0x14600004, 0x3c02ffff, 0x34427fff, 0x01021024, + 0xaf820014, 0x97820016, 0x9743010c, 0x8f440104, 0x3042bfff, 0x00031c00, + 0x3084ffff, 0x00641825, 0xa74201a6, 0xaf4301ac, 0x3c021000, 0xaf4201b8, + 0x3127ffff, 0x8d420024, 0x30420008, 0x1040002d, 0x00000000, 0x9742010e, + 0x3c038000, 0x24420004, 0x3046ffff, 0x8f4201b8, 0x00431024, 0x1440fffd, + 0x24020003, 0xa342018b, 0x9784000a, 0x8f850004, 0x8f880014, 0x24020180, + 0x24030002, 0xaf420180, 0xa743018c, 0xa746018e, 0xa7470188, 0x31028000, + 0xa7440190, 0x1040000c, 0xaf4501a8, 0x93420116, 0x304200fc, 0x005a1021, + 0x24424004, 0x8c430000, 0x3063ffff, 0x14600004, 0x3c02ffff, 0x34427fff, + 0x01021024, 0xaf820014, 0x97820016, 0x9743010c, 0x8f440104, 0x3042bfff, + 0x00031c00, 0x3084ffff, 0x00641825, 0xa74201a6, 0xaf4301ac, 0x3c021000, + 0xaf4201b8, 0x15600041, 0x00001021, 0x27440180, 0x3c038000, 0x8f4201b8, + 0x00431024, 0x1440fffd, 0x24022000, 0x24030002, 0xa4820008, 0xa083000b, + 0xa4800010, 0x3c021000, 0xaf4201b8, 0x0a000f19, 0x00001021, 0x3c030800, + 0x8c620024, 0x30420001, 0x1040002e, 0x00001021, 0x9742010e, 0x34e70002, + 0x3c038000, 0x24420004, 0x3045ffff, 0x8f4201b8, 0x00431024, 0x1440fffd, + 0x24020003, 0xa342018b, 0x9783000a, 0x8f840004, 0x8f860014, 0x24020002, + 0xaf400180, 0xa742018c, 0xa745018e, 0xa7470188, 0x30c28000, 0xa7430190, + 0x1040000c, 0xaf4401a8, 0x93420116, 0x304200fc, 0x005a1021, 0x24424004, + 0x8c430000, 0x3063ffff, 0x14600004, 0x3c02ffff, 0x34427fff, 0x00c21024, + 0xaf820014, 0x97820016, 0x9743010c, 0x8f440104, 0x3042bfff, 0x00031c00, + 0x3084ffff, 0x00641825, 0xa74201a6, 0xaf4301ac, 0x3c021000, 0xaf4201b8, + 0x00001021, 0x8fbf0014, 0x8fb00010, 0x03e00008, 0x27bd0018, 0x8f4b0070, + 0x93420112, 0x8f840008, 0x00022882, 0x30820100, 0x14400003, 0x24a30003, + 0x03e00008, 0x00001021, 0x30824000, 0x10400010, 0x27424000, 0x00031880, + 0x00431021, 0x8c470000, 0x24a30004, 0x00031880, 0x27424000, 0x00431021, + 0x8c490000, 0x93430116, 0x27424000, 0x306300fc, 0x00431021, 0x8c4a0000, + 0x0a000f45, 0x3c030800, 0x30822000, 0x1040ffea, 0x00031880, 0x27424000, + 0x00431021, 0x8c470000, 0x24a30004, 0x00031880, 0x27424000, 0x00431021, + 0x8c490000, 0x00005021, 0x3c030800, 0x24680100, 0x00071602, 0x00021080, + 0x00481021, 0x8c460000, 0x00071b82, 0x306303fc, 0x01031821, 0x8c640400, + 0x00071182, 0x304203fc, 0x01021021, 0x8c450800, 0x30e300ff, 0x00031880, + 0x01031821, 0x00091602, 0x00021080, 0x01021021, 0x00c43026, 0x8c640c00, + 0x8c431000, 0x00c53026, 0x00091382, 0x304203fc, 0x01021021, 0x8c451400, + 0x312200ff, 0x00021080, 0x01021021, 0x00c43026, 0x00c33026, 0x00091982, + 0x306303fc, 0x01031821, 0x8c641800, 0x8c431c00, 0x00c53026, 0x00c43026, + 0x11400015, 0x00c33026, 0x000a1602, 0x00021080, 0x01021021, 0x8c432000, + 0x000a1382, 0x304203fc, 0x01021021, 0x8c452400, 0x314200ff, 0x00021080, + 0x01021021, 0x00c33026, 0x000a1982, 0x306303fc, 0x01031821, 0x8c642800, + 0x8c432c00, 0x00c53026, 0x00c43026, 0x00c33026, 0x8f430070, 0x3c050800, + 0x8ca43100, 0x2c820020, 0x10400008, 0x006b5823, 0x3c020800, 0x24423104, + 0x00041880, 0x00621821, 0x24820001, 0xac6b0000, 0xaca23100, 0xaf860004, + 0x03e00008, 0x24020001, 0x27bdffe8, 0xafbf0010, 0x8f460128, 0x8f840010, + 0xaf460020, 0x8f450104, 0x8f420100, 0x24030800, 0xaf850008, 0xaf820014, + 0xaf4301b8, 0x1080000a, 0x3c020800, 0x8c430034, 0x10600007, 0x30a22000, + 0x10400005, 0x34a30100, 0x8f82000c, 0xaf830008, 0x24420001, 0xaf82000c, + 0x3c020800, 0x8c4300c0, 0x10600006, 0x3c030800, 0x8c6200c4, 0x24040001, + 0x24420001, 0x0a000fd5, 0xac6200c4, 0x8f820008, 0x3c030010, 0x00431024, + 0x14400009, 0x3c02001f, 0x3c030800, 0x8c620020, 0x00002021, 0x24420001, + 0x0e000c78, 0xac620020, 0x0a000fd5, 0x00402021, 0x3442ff00, 0x14c20009, + 0x2403bfff, 0x3c030800, 0x8c620020, 0x24040001, 0x24420001, 0x0e000c78, + 0xac620020, 0x0a000fd5, 0x00402021, 0x8f820014, 0x00431024, 0x14400006, + 0x00000000, 0xaf400048, 0x0e0011a9, 0xaf400040, 0x0a000fd5, 0x00402021, + 0x0e001563, 0x00000000, 0x00402021, 0x10800005, 0x3c024000, 0x8f430124, + 0x3c026020, 0xac430014, 0x3c024000, 0xaf420138, 0x00000000, 0x8fbf0010, + 0x03e00008, 0x27bd0018, 0x27bdffe0, 0xafbf0018, 0xafb10014, 0xafb00010, + 0x8f420140, 0xaf420020, 0x8f430148, 0x3c027000, 0x00621824, 0x3c023000, + 0x10620021, 0x0043102b, 0x14400006, 0x3c024000, 0x3c022000, 0x10620009, + 0x3c024000, 0x0a001040, 0x00000000, 0x10620045, 0x3c025000, 0x10620047, + 0x3c024000, 0x0a001040, 0x00000000, 0x27440180, 0x3c038000, 0x8f4201b8, + 0x00431024, 0x1440fffd, 0x00000000, 0x8f420148, 0x24030002, 0xa083000b, + 0x00021402, 0xa4820008, 0x8f430148, 0xa4830010, 0x8f420144, 0x3c031000, + 0xac820024, 0xaf4301b8, 0x0a001040, 0x3c024000, 0x8f420148, 0x24030002, + 0x3044ffff, 0x00021402, 0x305000ff, 0x1203000c, 0x27510180, 0x2a020003, + 0x10400005, 0x24020003, 0x0600001d, 0x36053000, 0x0a001027, 0x3c038000, + 0x12020007, 0x00000000, 0x0a001034, 0x00000000, 0x0e00112c, 0x00000000, + 0x0a001025, 0x00402021, 0x0e00113e, 0x00000000, 0x00402021, 0x36053000, + 0x3c038000, 0x8f4201b8, 0x00431024, 0x1440fffd, 0x24020002, 0xa6250008, + 0xa222000b, 0xa6240010, 0x8f420144, 0x3c031000, 0xae220024, 0xaf4301b8, + 0x0a001040, 0x3c024000, 0x0000000d, 0x00000000, 0x240002bf, 0x0a001040, + 0x3c024000, 0x0e001441, 0x00000000, 0x0a001040, 0x3c024000, 0x0e0015ea, + 0x00000000, 0x3c024000, 0xaf420178, 0x00000000, 0x8fbf0018, 0x8fb10014, + 0x8fb00010, 0x03e00008, 0x27bd0020, 0x24020800, 0x03e00008, 0xaf4201b8, + 0x27bdffe8, 0x3c04600c, 0xafbf0014, 0xafb00010, 0x8c825000, 0x3c1a8000, + 0x2403ff7f, 0x3c106000, 0x00431024, 0x3442380c, 0x24030003, 0xac825000, + 0x3c020008, 0xaf430008, 0x8e040808, 0x0342d825, 0x8e020808, 0x3c030800, + 0xac600020, 0x3084fff0, 0x2c840001, 0x3042fff0, 0x38420010, 0x2c420001, + 0xaf840010, 0xaf820000, 0x0e00160c, 0x00000000, 0x0e001561, 0x00000000, + 0x3c020400, 0x3442000c, 0x3c03ffff, 0x34630806, 0xae021948, 0xae03194c, + 0x8e021980, 0x34420200, 0xae021980, 0x8f500000, 0x32020003, 0x1040fffd, + 0x32020001, 0x10400004, 0x32020002, 0x0e000f92, 0x00000000, 0x32020002, + 0x1040fff6, 0x00000000, 0x0e000fe0, 0x00000000, 0x0a001071, 0x00000000, + 0x27bdffe8, 0x3c04600c, 0xafbf0014, 0xafb00010, 0x8c825000, 0x3c1a8000, + 0x2403ff7f, 0x3c106000, 0x00431024, 0x3442380c, 0x24030003, 0xac825000, + 0x3c020008, 0xaf430008, 0x8e040808, 0x0342d825, 0x8e020808, 0x3c030800, + 0xac600020, 0x3084fff0, 0x2c840001, 0x3042fff0, 0x38420010, 0x2c420001, + 0xaf840010, 0xaf820000, 0x0e00160c, 0x00000000, 0x0e001561, 0x00000000, + 0x3c020400, 0x3442000c, 0x3c03ffff, 0x34630806, 0xae021948, 0xae03194c, + 0x8e021980, 0x8fbf0014, 0x34420200, 0xae021980, 0x8fb00010, 0x03e00008, + 0x27bd0018, 0x00804821, 0x30a5ffff, 0x30c6ffff, 0x30e7ffff, 0x3c038000, + 0x8f4201b8, 0x00431024, 0x1440fffd, 0x24020003, 0xa342018b, 0x9783000a, + 0x8f840004, 0x8f880014, 0xaf490180, 0xa745018c, 0xa746018e, 0xa7470188, + 0x31028000, 0xa7430190, 0x1040000c, 0xaf4401a8, 0x93420116, 0x304200fc, + 0x005a1021, 0x24424004, 0x8c430000, 0x3063ffff, 0x14600004, 0x3c02ffff, + 0x34427fff, 0x01021024, 0xaf820014, 0x97820016, 0x9743010c, 0x8f440104, + 0x3042bfff, 0x00031c00, 0x3084ffff, 0x00641825, 0xa74201a6, 0xaf4301ac, + 0x3c021000, 0xaf4201b8, 0x03e00008, 0x00000000, 0x27440180, 0x3c038000, + 0x8f4201b8, 0x00431024, 0x1440fffd, 0x24022000, 0x24030002, 0xa4820008, + 0xa083000b, 0xa4800010, 0x3c021000, 0xaf4201b8, 0x03e00008, 0x00000000, + 0x27440180, 0x3c038000, 0x8f4201b8, 0x00431024, 0x1440fffd, 0x00000000, + 0x8f420148, 0x24030002, 0xa083000b, 0x00021402, 0xa4820008, 0x8f430148, + 0xa4830010, 0x8f420144, 0x3c031000, 0xac820024, 0x03e00008, 0xaf4301b8, + 0x27bdffe0, 0xafbf0018, 0xafb10014, 0xafb00010, 0x8f420148, 0x24030002, + 0x3044ffff, 0x00021402, 0x305000ff, 0x1203000c, 0x27510180, 0x2a020003, + 0x10400005, 0x24020003, 0x0600001d, 0x36053000, 0x0a001117, 0x3c038000, + 0x12020007, 0x00000000, 0x0a001124, 0x00000000, 0x0e00112c, 0x00000000, + 0x0a001115, 0x00402021, 0x0e00113e, 0x00000000, 0x00402021, 0x36053000, + 0x3c038000, 0x8f4201b8, 0x00431024, 0x1440fffd, 0x24020002, 0xa6250008, + 0xa222000b, 0xa6240010, 0x8f420144, 0x3c031000, 0xae220024, 0xaf4301b8, + 0x0a001128, 0x8fbf0018, 0x0000000d, 0x00000000, 0x240002bf, 0x8fbf0018, + 0x8fb10014, 0x8fb00010, 0x03e00008, 0x27bd0020, 0x3084ffff, 0x2c821389, + 0x1040000d, 0x00001021, 0x3c030800, 0x24635900, 0x00042942, 0x00052880, + 0x00a32821, 0x3086001f, 0x8ca40000, 0x24030001, 0x00c31804, 0x00832025, + 0x03e00008, 0xaca40000, 0x03e00008, 0x24020091, 0x3084ffff, 0x2c821389, + 0x1040000e, 0x00001021, 0x3c030800, 0x24635900, 0x00042942, 0x00052880, + 0x00a32821, 0x3086001f, 0x24030001, 0x8ca40000, 0x00c31804, 0x00031827, + 0x00832024, 0x03e00008, 0xaca40000, 0x03e00008, 0x24020091, 0x9482000c, + 0x24870014, 0x00021302, 0x00021080, 0x00824021, 0x00e8182b, 0x1060004f, + 0x00000000, 0x90e30000, 0x2c620009, 0x10400047, 0x3c020800, 0x24425890, + 0x00031880, 0x00621821, 0x8c640000, 0x00800008, 0x00000000, 0x0a0011a4, + 0x24e70001, 0x90e30001, 0x2402000a, 0x54620024, 0x01003821, 0x01071023, + 0x2c42000a, 0x54400020, 0x01003821, 0x3c050800, 0x8ca26c98, 0x24e70002, + 0x34420100, 0xaca26c98, 0x90e30000, 0x90e20001, 0x90e40002, 0x90e60003, + 0x24e70004, 0x24a56c98, 0x00031e00, 0x00021400, 0x00621825, 0x00042200, + 0x00641825, 0x00661825, 0xaca30004, 0x90e20000, 0x90e30001, 0x90e40002, + 0x90e60003, 0x24e70004, 0x00021600, 0x00031c00, 0x00431025, 0x00042200, + 0x00441025, 0x00461025, 0x0a0011a4, 0xaca20008, 0x90e30001, 0x24020004, + 0x1062000e, 0x00601021, 0x0a00119e, 0x01001021, 0x90e30001, 0x24020003, + 0x10620008, 0x00601021, 0x0a00119e, 0x01001021, 0x90e30001, 0x24020002, + 0x14620003, 0x01001021, 0x00601021, 0x00e21021, 0x0a0011a4, 0x00403821, + 0x90e20001, 0x0a0011a4, 0x00e23821, 0x01003821, 0x00e8102b, 0x5440ffb4, + 0x90e30000, 0x03e00008, 0x24020001, 0x27bdff90, 0x3c030800, 0xafbf006c, + 0xafbe0068, 0xafb70064, 0xafb60060, 0xafb5005c, 0xafb40058, 0xafb30054, + 0xafb20050, 0xafb1004c, 0xafb00048, 0xac606c98, 0x93620023, 0x30420010, + 0x1440027c, 0x24020001, 0x93420116, 0x93630005, 0x34424000, 0x30630001, + 0x14600005, 0x0342b021, 0x0e0015e0, 0x00000000, 0x0a001436, 0x8fbf006c, + 0x93420112, 0x8f430104, 0x3c040020, 0x34424000, 0x00641824, 0x10600012, + 0x03422821, 0x27450180, 0x3c038000, 0x8f4201b8, 0x00431024, 0x1440fffd, + 0x00000000, 0x8f420128, 0xaca20000, 0x8f640040, 0x24030008, 0x240240c1, + 0xa4a20008, 0x24020002, 0xa0a2000b, 0x3c021000, 0x0a0011f1, 0xa0a3000a, + 0x8f420104, 0x3c030040, 0x00431024, 0x1040001d, 0x3c038000, 0x27450180, + 0x8f4201b8, 0x00431024, 0x1440fffd, 0x00000000, 0x8f420128, 0xaca20000, + 0x8f640040, 0x24030010, 0x240240c1, 0xa4a20008, 0x24020002, 0xa0a3000a, + 0x24030008, 0xa0a2000b, 0x3c021000, 0xa4a30010, 0xa0a00012, 0xa0a00013, + 0xaca00014, 0xaca00024, 0xaca00028, 0xaca0002c, 0xaca40018, 0x0e0015e0, + 0xaf4201b8, 0x0a001436, 0x8fbf006c, 0x8f820000, 0x10400016, 0x00000000, + 0x8f420104, 0x3c030001, 0x00431024, 0x10400011, 0x00000000, 0x8ca3000c, + 0x8f620030, 0x1462022d, 0x24020001, 0x8ca30010, 0x8f62002c, 0x14620229, + 0x24020001, 0x9763003a, 0x96c20000, 0x14430225, 0x24020001, 0x97630038, + 0x96c20002, 0x14430221, 0x24020001, 0xaf400048, 0xaf400054, 0xaf400040, + 0x8f740040, 0x8f650048, 0x00b43023, 0x04c10004, 0x00000000, 0x0000000d, + 0x00000000, 0x240001af, 0x9742011a, 0x3052ffff, 0x12400004, 0x8ed30004, + 0x02721021, 0x0a001228, 0x2451ffff, 0x02608821, 0x92d7000d, 0xa7a00020, + 0xa3a0001a, 0xafa00028, 0x9362003f, 0x32e30004, 0x1060003a, 0x305000ff, + 0x24040012, 0x16040006, 0x24020001, 0x3c040800, 0x8c830028, 0x24630001, + 0x0a001328, 0xac830028, 0x8f620044, 0x16620010, 0x27a60010, 0x27450180, + 0x3c038000, 0x2402001a, 0xa7a20020, 0x24020020, 0xafb40028, 0xa3b00022, + 0xa3a40023, 0xa3a2001a, 0x8f4201b8, 0x00431024, 0x1440fffd, 0x00000000, + 0x0a00130d, 0x00000000, 0x8f620044, 0x02621023, 0x0440001a, 0x02651023, + 0x044100d9, 0x24020001, 0x3c020800, 0x8c4300d8, 0x10600004, 0x24020001, + 0xa7a20020, 0x0a00125e, 0xafb40028, 0x2402001a, 0xa7a20020, 0x24020020, + 0xafb40028, 0xa3b00022, 0xa3a40023, 0xa3a2001a, 0x27a60010, 0x27450180, + 0x3c038000, 0x8f4201b8, 0x00431024, 0x1440fffd, 0x00000000, 0x0a00130d, + 0x00000000, 0x0a001328, 0x24020001, 0x0293f023, 0x1bc00016, 0x025e102a, + 0x54400007, 0x32f700fe, 0x57d2000f, 0x027e9821, 0x32e20001, 0x5440000c, + 0x027e9821, 0x32f700fe, 0x0240f021, 0x3c040800, 0x8c8300c8, 0x00009021, + 0x24020001, 0xa7a20020, 0xafb40028, 0x24630001, 0x0a001282, 0xac8300c8, + 0x025e1023, 0x0a001282, 0x3052ffff, 0x0000f021, 0x24a2ffff, 0x02221823, + 0x1860001f, 0x0072102a, 0x54400019, 0x00a08821, 0x97a20020, 0x3c040800, + 0x8c8300cc, 0xafb40028, 0x34420001, 0x24630001, 0xa7a20020, 0x02741026, + 0x2c420001, 0xac8300cc, 0x2cc30001, 0x00431024, 0x1440000a, 0x02401821, + 0x27a60010, 0x27450180, 0x3c038000, 0x8f4201b8, 0x00431024, 0x1440fffd, + 0x00000000, 0x0a00130d, 0x00000000, 0x00a08821, 0x02431023, 0x3052ffff, + 0x0a0012ae, 0x32f700f6, 0x02741023, 0x18400008, 0x97a20020, 0x3c040800, + 0x8c8300d4, 0xafb30028, 0x34420400, 0x24630001, 0xa7a20020, 0xac8300d4, + 0x32e20002, 0x1040001c, 0x32e20010, 0x8f620044, 0x1662000d, 0x27a60010, + 0x97a20020, 0x27450180, 0x3c038000, 0xafb40028, 0x34420001, 0xa7a20020, + 0x8f4201b8, 0x00431024, 0x1440fffd, 0x00000000, 0x0a00130d, 0x00000000, + 0x97a20020, 0x27450180, 0x3c038000, 0xafb40028, 0x34420001, 0xa7a20020, + 0x8f4201b8, 0x00431024, 0x1440fffd, 0x00000000, 0x0a00130d, 0x00000000, + 0x54400003, 0x8ed50008, 0x0a001328, 0x24020001, 0x8f630054, 0x26a2ffff, + 0x00431023, 0x18400011, 0x27a60010, 0x97a20020, 0x3c040800, 0x8c8300d0, + 0x27450180, 0x3c078000, 0xafb40028, 0x34420001, 0x24630001, 0xa7a20020, + 0xac8300d0, 0x8f4201b8, 0x00471024, 0x1440fffd, 0x00000000, 0x0a00130d, + 0x00000000, 0x32e20020, 0x10400011, 0x00000000, 0x96c20012, 0x0052102b, + 0x10400008, 0x97a20020, 0x96d20012, 0x12400003, 0x02721021, 0x0a0012f2, + 0x2451ffff, 0x02608821, 0x97a20020, 0x93a3001a, 0x34420008, 0x34630004, + 0xa7a20020, 0xa3a3001a, 0x8f420104, 0x3c030080, 0x00431024, 0x10400037, + 0x3a03000a, 0x0e001151, 0x02c02021, 0x24030002, 0x1443002b, 0x3c030800, + 0x27a60010, 0x97a20020, 0x27450180, 0x3c038000, 0xafb40028, 0x34420001, + 0xa7a20020, 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, 0x8cc4002c, 0x24020001, 0x3c031000, + 0xaca4002c, 0xaf4301b8, 0xaf400044, 0xaf400050, 0x0a001436, 0x8fbf006c, + 0x8c626c98, 0x30420100, 0x10400003, 0x24636c98, 0x8c620004, 0xaf62017c, + 0x3a03000a, 0x2c630001, 0x3a02000c, 0x2c420001, 0x00621825, 0x14600003, + 0x2402000e, 0x56020030, 0x00009021, 0x52400008, 0x96c4000e, 0x12400004, + 0xa7b20040, 0x02721021, 0x0a001343, 0x2451ffff, 0x02608821, 0x96c4000e, + 0x93630035, 0x8f62004c, 0x00642004, 0x00952021, 0x00821023, 0x18400015, + 0x00000000, 0x8f620018, 0x02621023, 0x1c400015, 0x97a20020, 0x8f620018, + 0x1662001c, 0x00000000, 0x8f62001c, 0x02a21023, 0x1c40000e, 0x97a20020, + 0x8f62001c, 0x16a20015, 0x00000000, 0x8f620058, 0x00821023, 0x18400011, + 0x97a20020, 0x0a001364, 0xafb10028, 0x8f620058, 0x00821023, 0x0441000b, + 0x97a20020, 0xafb10028, 0xafb30034, 0xafb50038, 0xafa4003c, 0x34420020, + 0x0a00136d, 0xa7a20020, 0x02809821, 0x02608821, 0x8f640058, 0x8f62004c, + 0x02a21023, 0x18400009, 0x00000000, 0x8f620054, 0x02a21023, 0x1c400005, + 0x97a20020, 0xafb10028, 0xafb50024, 0x0a001385, 0x34420040, 0x9742011a, + 0x1440000c, 0x24020014, 0x8f620058, 0x14820009, 0x24020014, 0x8f63004c, + 0x8f620054, 0x10620004, 0x97a20020, 0xafb10028, 0x34420080, 0xa7a20020, + 0x24020014, 0x1202000a, 0x2a020015, 0x10400005, 0x2402000c, 0x12020006, + 0x32e20001, 0x0a0013c6, 0x00000000, 0x24020016, 0x16020035, 0x32e20001, + 0x8f620084, 0x24420001, 0x16a20031, 0x32e20001, 0x24020014, 0x12020021, + 0x2a020015, 0x10400005, 0x2402000c, 0x12020008, 0x32e20001, 0x0a0013c6, + 0x00000000, 0x24020016, 0x1202000c, 0x32e20001, 0x0a0013c6, 0x00000000, + 0x97a30020, 0x2402000e, 0xafb10028, 0xa3b00022, 0xa3a20023, 0xafb50024, + 0x34630054, 0x0a0013c5, 0xa7a30020, 0x97a20020, 0x93a4001a, 0x24030010, + 0xafb10028, 0xa3b00022, 0xa3a30023, 0xafb50024, 0x3442005d, 0x34840002, + 0xa7a20020, 0x0a0013c5, 0xa3a4001a, 0x97a20020, 0x24030012, 0xa3a30023, + 0x93a3001a, 0xafb10028, 0xa3b00022, 0xafb50024, 0x3042fffe, 0x3442005c, + 0x34630002, 0xa7a20020, 0xa3a3001a, 0x32e20001, 0x10400030, 0x2402000c, + 0x12020013, 0x2a02000d, 0x10400005, 0x2402000a, 0x12020008, 0x97a20020, + 0x0a0013f8, 0x32e20009, 0x2402000e, 0x1202001b, 0x32e20009, 0x0a0013f9, + 0x0002102b, 0x93a4001a, 0x24030008, 0xafb10028, 0xa3b00022, 0xa3a30023, + 0x0a0013f4, 0x34420013, 0x97a30020, 0x30620004, 0x14400005, 0x93a2001a, + 0x3463001b, 0xa7a30020, 0x0a0013e7, 0x24030016, 0x3463001b, 0xa7a30020, + 0x24030010, 0xafb10028, 0xa3b00022, 0xa3a30023, 0x34420002, 0x0a0013f7, + 0xa3a2001a, 0x97a20020, 0x93a4001a, 0x24030010, 0xafb10028, 0xa3b00022, + 0xa3a30023, 0x3442001b, 0x34840002, 0xa7a20020, 0xa3a4001a, 0x32e20009, + 0x0002102b, 0x00021023, 0x30420007, 0x12400015, 0x34450003, 0x8f820018, + 0x24030800, 0x27440180, 0x24420001, 0xaf820018, 0x24020004, 0xaf4301b8, + 0xa4850008, 0xa082000b, 0x93430120, 0x00003021, 0x3c021000, 0xa492000e, + 0xac950024, 0xac930028, 0x007e1821, 0xa483000c, 0xaf4201b8, 0x0a001413, + 0x97a20020, 0x24060001, 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, + 0x00c01021, 0x8fbf006c, 0x8fbe0068, 0x8fb70064, 0x8fb60060, 0x8fb5005c, + 0x8fb40058, 0x8fb30054, 0x8fb20050, 0x8fb1004c, 0x8fb00048, 0x03e00008, + 0x27bd0070, 0x8f470140, 0x8f460148, 0x3c028000, 0x00c24024, 0x00062c02, + 0x30a300ff, 0x24020019, 0x106200e7, 0x27440180, 0x2862001a, 0x1040001f, + 0x24020008, 0x106200be, 0x28620009, 0x1040000d, 0x24020001, 0x10620046, + 0x28620002, 0x50400005, 0x24020006, 0x1060002e, 0x00a01821, 0x0a00155e, + 0x00000000, 0x1062005b, 0x00a01821, 0x0a00155e, 0x00000000, 0x2402000b, + 0x10620084, 0x2862000c, 0x10400005, 0x24020009, 0x106200bc, 0x00061c02, + 0x0a00155e, 0x00000000, 0x2402000e, 0x106200b7, 0x00061c02, 0x0a00155e, + 0x00000000, 0x28620021, 0x10400009, 0x2862001f, 0x104000c1, 0x2402001b, + 0x106200bf, 0x2402001c, 0x1062009a, 0x00061c02, 0x0a00155e, 0x00000000, + 0x240200c2, 0x106200ca, 0x286200c3, 0x10400005, 0x24020080, 0x1062005a, + 0x00a01821, 0x0a00155e, 0x00000000, 0x240200c9, 0x106200cd, 0x30c5ffff, + 0x0a00155e, 0x00000000, 0x3c058000, 0x8f4201b8, 0x00451024, 0x1440fffd, + 0x24020001, 0xa4830008, 0x24030002, 0xac870000, 0xac800004, 0xa082000a, + 0xa083000b, 0xa4860010, 0x8f430144, 0x3c021000, 0xac800028, 0xac830024, + 0x3c036000, 0xaf4201b8, 0x03e00008, 0xac600808, 0x11000009, 0x00a01821, + 0x3c020800, 0x24030002, 0xa0436c88, 0x24426c88, 0xac470008, 0x8f430144, + 0x03e00008, 0xac430004, 0x3c058000, 0x8f4201b8, 0x00451024, 0x1440fffd, + 0x24020002, 0xac800000, 0xac870004, 0xa4830008, 0xa082000a, 0xa082000b, + 0xa4860010, 0xac800024, 0x8f420144, 0x3c031000, 0xac820028, 0x3c026000, + 0xaf4301b8, 0x03e00008, 0xac400808, 0x3c080800, 0x3c058000, 0x8f4201b8, + 0x00451024, 0x1440fffd, 0x00000000, 0xac870000, 0x91026c88, 0x00002821, + 0x10400002, 0x25076c88, 0x8ce50008, 0xac850004, 0xa4830008, 0x91036c88, + 0x24020002, 0xa082000b, 0xa4860010, 0x34630001, 0xa083000a, 0x8f420144, + 0xac820024, 0x91036c88, 0x10600002, 0x00001021, 0x8ce20004, 0xac820028, + 0x3c021000, 0xaf4201b8, 0x3c026000, 0xa1006c88, 0x03e00008, 0xac400808, + 0x3c058000, 0x8f4201b8, 0x00451024, 0x1440fffd, 0x24020002, 0xa082000b, + 0xa4830008, 0xa4860010, 0x8f420144, 0x3c031000, 0xa4820012, 0x03e00008, + 0xaf4301b8, 0x30c2ffff, 0x14400028, 0x00061c02, 0x93620005, 0x30420004, + 0x14400020, 0x3c029000, 0x34420001, 0x00e21025, 0xaf420020, 0x3c038000, + 0x8f420020, 0x00431024, 0x1440fffd, 0x00000000, 0x93620005, 0x3c038000, + 0x34630001, 0x00e31825, 0x34420004, 0xa3620005, 0xaf430020, 0x93620005, + 0x30420004, 0x14400003, 0x3c038000, 0x0000000d, 0x3c038000, 0x8f4201b8, + 0x00431024, 0x1440fffd, 0x24020005, 0x3c031000, 0xac870000, 0xa082000b, + 0xaf4301b8, 0x0a00150d, 0x00061c02, 0x0000000d, 0x03e00008, 0x00000000, + 0x00061c02, 0x3c058000, 0x8f4201b8, 0x00451024, 0x1440fffd, 0x24020001, + 0xa4830008, 0x24030002, 0xac870000, 0xac800004, 0xa082000a, 0xa083000b, + 0xa4860010, 0x8f430144, 0x3c021000, 0xac800028, 0xac830024, 0x03e00008, + 0xaf4201b8, 0x3c058000, 0x8f4201b8, 0x00451024, 0x1440fffd, 0x24020002, + 0xac800000, 0xac870004, 0xa4830008, 0xa082000a, 0xa082000b, 0xa4860010, + 0xac800024, 0x8f420144, 0x3c031000, 0xac820028, 0x03e00008, 0xaf4301b8, + 0x00061c02, 0x3c058000, 0x8f4201b8, 0x00451024, 0x1440fffd, 0x24020001, + 0xa4830008, 0x24030002, 0xa082000a, 0x3c021000, 0xac870000, 0xac800004, + 0xa083000b, 0xa4860010, 0xac800024, 0xac800028, 0x03e00008, 0xaf4201b8, + 0x00a01821, 0x3c058000, 0x8f4201b8, 0x00451024, 0x1440fffd, 0x24020002, + 0xac870000, 0xac800004, 0xa4830008, 0xa080000a, 0x0a001518, 0xa082000b, + 0x8f440144, 0x3c038000, 0x8f4201b8, 0x00431024, 0x1440fffd, 0x24020002, + 0x240340c9, 0xaf470180, 0xa342018b, 0x3c021000, 0xa7430188, 0xaf4401a4, + 0xaf4501a8, 0xaf4001ac, 0x03e00008, 0xaf4201b8, 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, 0x3c038000, 0x8f4201b8, 0x00431024, 0x1440fffd, 0x24020002, + 0x240340c9, 0xaf440180, 0xa342018b, 0x3c021000, 0xa7430188, 0xaf4501a4, + 0xaf4601a8, 0xaf4701ac, 0x03e00008, 0xaf4201b8, 0x3c029000, 0x34420001, + 0x00822025, 0xaf440020, 0x3c038000, 0x8f420020, 0x00431024, 0x1440fffd, + 0x00000000, 0x03e00008, 0x00000000, 0x3c028000, 0x34420001, 0x00822025, + 0x03e00008, 0xaf440020, 0x308600ff, 0x27450180, 0x3c038000, 0x8f4201b8, + 0x00431024, 0x1440fffd, 0x00000000, 0x8f420128, 0xaca20000, 0x8f640040, + 0x24030008, 0x240240c1, 0xa4a20008, 0x24020002, 0xa0a2000b, 0x3c021000, + 0xa0a6000a, 0xa4a30010, 0xa0a00012, 0xa0a00013, 0xaca00014, 0xaca00024, + 0xaca00028, 0xaca0002c, 0xaca40018, 0x03e00008, 0xaf4201b8, 0x24020001, + 0xacc40000, 0x03e00008, 0xa4e50000, 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, 0x0e001047, 0x00000000, + 0x00002021, 0x0e000c78, 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, 0x0a001609, 0xa0a2000a, + 0xa0a0000a, 0x3c021000, 0x03e00008, 0xaf4201b8, 0x03e00008, 0x00001021, + 0x10c00007, 0x00000000, 0x8ca20000, 0x24c6ffff, 0x24a50004, 0xac820000, + 0x14c0fffb, 0x24840004, 0x03e00008, 0x00000000, 0x0a00161f, 0x00a01021, + 0xac860000, 0x00000000, 0x00000000, 0x24840004, 0x00a01021, 0x1440fffa, + 0x24a5ffff, 0x03e00008, 0x00000000, 0x00000000 }; static u32 bnx2_RXP_b06FwData[(0x0/4) + 1] = { 0x0 }; static u32 bnx2_RXP_b06FwRodata[(0x28/4) + 1] = { @@ -1057,908 +1943,1550 @@ static u32 bnx2_RXP_b06FwRodata[(0x28/4) + 1] = { static u32 bnx2_RXP_b06FwBss[(0x13a4/4) + 1] = { 0x0 }; static u32 bnx2_RXP_b06FwSbss[(0x1c/4) + 1] = { 0x0 }; -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_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 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_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 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_TPAT_b06FwReleaseMajor = 0x1; +static int bnx2_TPAT_b06FwReleaseMinor = 0x0; +static int bnx2_TPAT_b06FwReleaseFix = 0x0; +static u32 bnx2_TPAT_b06FwStartAddr = 0x08000860; +static u32 bnx2_TPAT_b06FwTextAddr = 0x08000800; +static int bnx2_TPAT_b06FwTextLen = 0x122c; +static u32 bnx2_TPAT_b06FwDataAddr = 0x08001a60; +static int bnx2_TPAT_b06FwDataLen = 0x0; +static u32 bnx2_TPAT_b06FwRodataAddr = 0x00000000; +static int bnx2_TPAT_b06FwRodataLen = 0x0; +static u32 bnx2_TPAT_b06FwBssAddr = 0x08001aa0; +static int bnx2_TPAT_b06FwBssLen = 0x250; +static u32 bnx2_TPAT_b06FwSbssAddr = 0x08001a60; +static int bnx2_TPAT_b06FwSbssLen = 0x34; +static u32 bnx2_TPAT_b06FwText[(0x122c/4) + 1] = { + 0x0a000218, 0x00000000, 0x00000000, 0x0000000d, 0x74706174, 0x20322e35, + 0x2e313100, 0x02050b01, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x10000003, 0x00000000, 0x0000000d, 0x0000000d, 0x3c020800, + 0x24421a60, 0x3c030800, 0x24631cf0, 0xac400000, 0x0043202b, 0x1480fffd, + 0x24420004, 0x3c1d0800, 0x37bd2ffc, 0x03a0f021, 0x3c100800, 0x26100860, + 0x3c1c0800, 0x279c1a60, 0x0e000546, 0x00000000, 0x0000000d, 0x8f820010, + 0x8c450008, 0x24030800, 0xaf430178, 0x97430104, 0x3c020008, 0xaf420140, + 0x8f820024, 0x30420001, 0x10400007, 0x3069ffff, 0x24020002, 0x2523fffe, + 0xa7420146, 0xa7430148, 0x0a000242, 0x3c020800, 0xa7400146, 0x3c020800, + 0x8c43083c, 0x1460000e, 0x24020f00, 0x8f820024, 0x30430020, 0x0003182b, + 0x00031823, 0x30650009, 0x30420c00, 0x24030400, 0x14430002, 0x34a40001, + 0x34a40005, 0xa744014a, 0x0a000264, 0x3c020800, 0x8f830014, 0x14620008, + 0x00000000, 0x8f820024, 0x30420020, 0x0002102b, 0x00021023, 0x3042000d, + 0x0a000262, 0x34420005, 0x8f820024, 0x30420020, 0x0002102b, 0x00021023, + 0x30420009, 0x34420001, 0xa742014a, 0x3c020800, 0x8c430820, 0x8f840024, + 0x3c020048, 0x00621825, 0x30840006, 0x24020002, 0x1082000d, 0x2c820003, + 0x50400005, 0x24020004, 0x10800012, 0x3c020001, 0x0a000284, 0x00000000, + 0x10820007, 0x24020006, 0x1482000f, 0x3c020111, 0x0a00027c, 0x00621025, + 0x0a00027b, 0x3c020101, 0x3c020011, 0x00621025, 0x24030001, 0xaf421000, + 0xaf830020, 0x0a000284, 0x00000000, 0x00621025, 0xaf421000, 0xaf800020, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x8f830020, 0x1060003f, + 0x3c048000, 0x8f421000, 0x00441024, 0x1040fffd, 0x00000000, 0x10600039, + 0x00000000, 0x8f421000, 0x3c030020, 0x00431024, 0x10400034, 0x00000000, + 0x97421014, 0x14400031, 0x00000000, 0x97421008, 0x8f840010, 0x24420006, + 0x00024082, 0x00081880, 0x00643821, 0x8ce50000, 0x30430003, 0x30420001, + 0x10400004, 0x00000000, 0x0000000d, 0x0a0002c3, 0x00081080, 0x5460000f, + 0x30a5ffff, 0x3c06ffff, 0x00a62824, 0x0005182b, 0x00a61026, 0x0002102b, + 0x00621824, 0x10600004, 0x00000000, 0x0000000d, 0x00000000, 0x240001fb, + 0x8ce20000, 0x0a0002c2, 0x00462825, 0x0005182b, 0x38a2ffff, 0x0002102b, + 0x00621824, 0x10600004, 0x00000000, 0x0000000d, 0x00000000, 0x24000205, + 0x8ce20000, 0x3445ffff, 0x00081080, 0x00441021, 0x3c030800, 0xac450000, + 0x8c620830, 0x24420001, 0xac620830, 0x8f840018, 0x01202821, 0x24820008, + 0x30421fff, 0x24434000, 0x0343d821, 0x30a30007, 0xaf84000c, 0xaf820018, + 0xaf420084, 0x10600002, 0x24a20007, 0x3045fff8, 0x8f820030, 0x8f840000, + 0x00451821, 0xaf82001c, 0x0064102b, 0xaf830030, 0x14400002, 0x00641023, + 0xaf820030, 0x8f840030, 0x34028000, 0x00821021, 0x03421821, 0x3c021000, + 0xaf830010, 0xaf440080, 0x03e00008, 0xaf420178, 0x8f830024, 0x27bdffe0, + 0xafbf0018, 0xafb10014, 0x30620200, 0x14400004, 0xafb00010, 0x0000000d, + 0x00000000, 0x24000242, 0x00031a82, 0x30630003, 0x000310c0, 0x00431021, + 0x00021080, 0x00431021, 0x00021080, 0x3c030800, 0x24631aa0, 0x00438821, + 0x8e240000, 0x10800004, 0x00000000, 0x0000000d, 0x00000000, 0x2400024d, + 0x8f850010, 0x24020001, 0xae220000, 0x8ca70008, 0xa2200007, 0x8f620004, + 0x26300014, 0x02002021, 0x00021402, 0xa2220004, 0x304600ff, 0x24c60005, + 0x0e000673, 0x00063082, 0x8f620004, 0xa6220008, 0x8f430108, 0x3c021000, + 0x00621824, 0x10600008, 0x00000000, 0x97420104, 0x92230007, 0x2442ffec, + 0x3045ffff, 0x34630002, 0x0a000321, 0xa2230007, 0x97420104, 0x2442fff0, + 0x3045ffff, 0x8f620004, 0x3042ffff, 0x2c420013, 0x54400005, 0x92230007, + 0x92220007, 0x34420001, 0xa2220007, 0x92230007, 0x24020001, 0x10620009, + 0x28620002, 0x14400014, 0x24020002, 0x10620012, 0x24020003, 0x1062000a, + 0x00000000, 0x0a000342, 0x00000000, 0x8f820010, 0x8c43000c, 0x3c04ffff, + 0x00641824, 0x00651825, 0x0a000342, 0xac43000c, 0x8f820010, 0x8c430010, + 0x3c04ffff, 0x00641824, 0x00651825, 0xac430010, 0x8f620004, 0x3042ffff, + 0x24420002, 0x00021083, 0xa2220005, 0x304500ff, 0x8f820010, 0x3c04ffff, + 0x00052880, 0x00a22821, 0x8ca70000, 0x96220008, 0x97430104, 0x00e42024, + 0x24420002, 0x00621823, 0x00833825, 0xaca70000, 0x92240005, 0x00041080, + 0x02021021, 0x90430000, 0x3c05fff6, 0x34a5ffff, 0x3063000f, 0x00832021, + 0xa2240006, 0x308200ff, 0x24420003, 0x00021080, 0x02021021, 0x8c460000, + 0x308300ff, 0x8f820010, 0x3c04ff3f, 0x00031880, 0x00c53824, 0x00621821, + 0xae26000c, 0xac67000c, 0x8e22000c, 0x92230006, 0x3484ffff, 0x00441024, + 0x24630003, 0x00031880, 0x02031821, 0x00e42024, 0xae22000c, 0xac640000, + 0x92220006, 0x24420004, 0x00021080, 0x02021021, 0x94470002, 0xac470000, + 0x92230006, 0x8f820010, 0x00031880, 0x00621821, 0x24020010, 0xac670010, + 0x24030002, 0xa7420140, 0xa7400142, 0xa7400144, 0xa7430146, 0x97420104, + 0x24030001, 0x2442fffe, 0xa7420148, 0xa743014a, 0x8f820024, 0x24030002, + 0x30440006, 0x1083000d, 0x2c820003, 0x10400005, 0x24020004, 0x10800011, + 0x3c020009, 0x0a0003a5, 0x00000000, 0x10820007, 0x24020006, 0x1482000d, + 0x3c020119, 0x0a00039f, 0x24030001, 0x0a00039e, 0x3c020109, 0x3c020019, + 0x24030001, 0xaf421000, 0xaf830020, 0x0a0003a5, 0x00000000, 0xaf421000, + 0xaf800020, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x92220004, + 0x24030008, 0x8f840020, 0x24420002, 0x30420007, 0x00621823, 0x30630007, + 0x10800006, 0xae230010, 0x3c038000, 0x8f421000, 0x00431024, 0x1040fffd, + 0x00000000, 0x8f820018, 0xaf82000c, 0x24420010, 0x30421fff, 0xaf820018, + 0xaf420084, 0x97430104, 0x24424000, 0x0342d821, 0x3063ffff, 0x30620007, + 0x10400002, 0x24620007, 0x3043fff8, 0x8f820030, 0x8f840000, 0x00431821, + 0xaf82001c, 0x0064102b, 0xaf830030, 0x14400002, 0x00641023, 0xaf820030, + 0x8f840030, 0x34028000, 0x8fbf0018, 0x8fb10014, 0x8fb00010, 0x00821021, + 0x03421821, 0x3c021000, 0xaf830010, 0xaf440080, 0xaf420178, 0x03e00008, + 0x27bd0020, 0x8f830024, 0x27bdffe0, 0xafbf0018, 0xafb10014, 0x30620200, + 0x14400004, 0xafb00010, 0x0000000d, 0x00000000, 0x240002e4, 0x00031a82, + 0x30630003, 0x000310c0, 0x00431021, 0x00021080, 0x00431021, 0x00021080, + 0x3c030800, 0x24631aa0, 0x00438021, 0x8e040000, 0x14800004, 0x00000000, + 0x0000000d, 0x00000000, 0x240002e9, 0x8f620004, 0x04410008, 0x26050014, + 0x92020006, 0x8e03000c, 0x24420003, 0x00021080, 0x00a21021, 0xac430000, + 0xae000000, 0x92020005, 0x24420001, 0x00021080, 0x00a21021, 0x8c430000, + 0x3c040001, 0x00641821, 0xac430000, 0x92060004, 0x27710008, 0x02202021, + 0x24c60005, 0x0e000673, 0x00063082, 0x92040006, 0x3c057fff, 0x8f620004, + 0x00042080, 0x00912021, 0x8c830004, 0x34a5ffff, 0x00451024, 0x00621821, + 0xac830004, 0x92050005, 0x3c07ffff, 0x92040004, 0x00052880, 0x00b12821, + 0x8ca30000, 0x97420104, 0x96060008, 0x00671824, 0x00441021, 0x00461023, + 0x3042ffff, 0x00621825, 0xaca30000, 0x92030007, 0x24020001, 0x1062000a, + 0x28620002, 0x1440001d, 0x2402000a, 0x24020002, 0x10620019, 0x24020003, + 0x1062000e, 0x2402000a, 0x0a000447, 0x00000000, 0x92020004, 0x97430104, + 0x8e24000c, 0x00621821, 0x2463fff2, 0x3063ffff, 0x00872024, 0x00832025, + 0xae24000c, 0x0a000447, 0x2402000a, 0x92020004, 0x97430104, 0x8e240010, + 0x00621821, 0x2463ffee, 0x3063ffff, 0x00872024, 0x00832025, 0xae240010, + 0x2402000a, 0xa7420140, 0x96030012, 0x8f840024, 0xa7430142, 0x92020004, + 0xa7420144, 0xa7400146, 0x97430104, 0x30840006, 0x24020001, 0xa7430148, + 0xa742014a, 0x24020002, 0x1082000d, 0x2c820003, 0x10400005, 0x24020004, + 0x10800011, 0x3c020041, 0x0a00046c, 0x00000000, 0x10820007, 0x24020006, + 0x1482000d, 0x3c020151, 0x0a000466, 0x24030001, 0x0a000465, 0x3c020141, + 0x3c020051, 0x24030001, 0xaf421000, 0xaf830020, 0x0a00046c, 0x00000000, + 0xaf421000, 0xaf800020, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x8f820020, 0x8f840018, 0x10400006, 0x92030004, 0x3c058000, 0x8f421000, + 0x00451024, 0x1040fffd, 0x00000000, 0x2463000a, 0x30620007, 0x10400002, + 0x24620007, 0x304303f8, 0x00831021, 0x30421fff, 0xaf84000c, 0xaf820018, + 0xaf420084, 0x97430104, 0x24424000, 0x0342d821, 0x3063ffff, 0x30620007, + 0x10400002, 0x24620007, 0x3043fff8, 0x8f820030, 0x8f840000, 0x00431821, + 0xaf82001c, 0x0064102b, 0xaf830030, 0x14400002, 0x00641023, 0xaf820030, + 0x8f840030, 0x34028000, 0x8fbf0018, 0x8fb10014, 0x8fb00010, 0x00821021, + 0x03421821, 0x3c021000, 0xaf830010, 0xaf440080, 0xaf420178, 0x03e00008, + 0x27bd0020, 0x8f620000, 0x97430104, 0x3c048000, 0x3045ffff, 0x3066ffff, + 0x8f420178, 0x00441024, 0x1440fffd, 0x2402000a, 0x30a30007, 0xa7420140, + 0x24020008, 0x00431023, 0x30420007, 0x24a3fffe, 0xa7420142, 0xa7430144, + 0xa7400146, 0xa7460148, 0x8f420108, 0x8f830024, 0x30420020, 0x0002102b, + 0x00021023, 0x30420009, 0x34420001, 0x30630006, 0xa742014a, 0x24020002, + 0x1062000d, 0x2c620003, 0x10400005, 0x24020004, 0x10600011, 0x3c020041, + 0x0a0004d6, 0x00000000, 0x10620007, 0x24020006, 0x1462000d, 0x3c020151, + 0x0a0004d0, 0x24030001, 0x0a0004cf, 0x3c020141, 0x3c020051, 0x24030001, + 0xaf421000, 0xaf830020, 0x0a0004d6, 0x00000000, 0xaf421000, 0xaf800020, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x8f820020, 0x24a30008, + 0x8f850018, 0x10400006, 0x30c6ffff, 0x3c048000, 0x8f421000, 0x00441024, + 0x1040fffd, 0x00000000, 0x3063ffff, 0x30620007, 0x10400002, 0x24620007, + 0x3043fff8, 0x00a31021, 0x30421fff, 0x24434000, 0x0343d821, 0x00c02021, + 0x30830007, 0xaf85000c, 0xaf820018, 0xaf420084, 0x10600002, 0x24820007, + 0x3044fff8, 0x8f820030, 0x8f850000, 0x00441821, 0xaf82001c, 0x0065102b, + 0xaf830030, 0x14400002, 0x00651023, 0xaf820030, 0x8f840030, 0x34028000, + 0x3c030800, 0x8c650834, 0x00821021, 0x03421821, 0xaf830010, 0xaf440080, + 0x10a00006, 0x2402000e, 0x9383002f, 0x14620004, 0x3c021000, 0x2402043f, + 0xa7420148, 0x3c021000, 0x03e00008, 0xaf420178, 0x8f820024, 0x30424000, + 0x10400005, 0x24020800, 0x0000000d, 0x00000000, 0x2400040e, 0x24020800, + 0xaf420178, 0x97440104, 0x3c030008, 0xaf430140, 0x8f820024, 0x30420001, + 0x10400006, 0x3085ffff, 0x24020002, 0x24a3fffe, 0xa7420146, 0x0a000526, + 0xa7430148, 0xa7400146, 0x8f840018, 0x2402000d, 0xa742014a, 0x24830008, + 0x30631fff, 0x24624000, 0x0342d821, 0x30a20007, 0xaf84000c, 0xaf830018, + 0xaf430084, 0x10400002, 0x24a20007, 0x3045fff8, 0x8f820030, 0x8f840000, + 0x00451821, 0xaf82001c, 0x0064102b, 0xaf830030, 0x14400002, 0x00641023, + 0xaf820030, 0x8f840030, 0x34028000, 0x00821021, 0x03421821, 0x3c021000, + 0xaf830010, 0xaf440080, 0x03e00008, 0xaf420178, 0x27bdffe8, 0x3c046008, + 0xafbf0014, 0xafb00010, 0x8c825000, 0x3c1a8000, 0x2403ff7f, 0x375b4000, + 0x00431024, 0x3442380c, 0xac825000, 0x8f430008, 0x3c100800, 0x37428000, + 0x34630001, 0xaf430008, 0xaf820010, 0x3c02601c, 0xaf800018, 0xaf400080, + 0xaf400084, 0x8c450008, 0x3c036000, 0x8c620808, 0x3c040800, 0x3c030080, + 0xac830820, 0x3042fff0, 0x38420010, 0x2c420001, 0xaf850000, 0xaf820004, + 0x0e000658, 0x00000000, 0x8f420000, 0x30420001, 0x1040fffb, 0x00000000, + 0x8f430108, 0x8f440100, 0x30622000, 0xaf830024, 0xaf840014, 0x10400004, + 0x8e02082c, 0x24420001, 0x0a0005c6, 0xae02082c, 0x30620200, 0x14400003, + 0x24020f00, 0x14820027, 0x24020d00, 0x97420104, 0x1040001c, 0x30624000, + 0x14400005, 0x00000000, 0x0e00022f, 0x00000000, 0x0a0005bb, 0x00000000, + 0x8f620008, 0x8f630000, 0x24020030, 0x00031e02, 0x306300f0, 0x10620007, + 0x28620031, 0x1440002f, 0x24020040, 0x10620007, 0x00000000, 0x0a0005bb, + 0x00000000, 0x0e0002e8, 0x00000000, 0x0a0005bb, 0x00000000, 0x0e0003db, + 0x00000000, 0x0a0005bb, 0x00000000, 0x30620040, 0x1440002b, 0x00000000, + 0x0000000d, 0x00000000, 0x240004b2, 0x0a0005c6, 0x00000000, 0x1482000f, + 0x30620006, 0x97420104, 0x10400005, 0x30620040, 0x0e000510, 0x00000000, + 0x0a0005bb, 0x00000000, 0x1440001b, 0x00000000, 0x0000000d, 0x00000000, + 0x240004c4, 0x0a0005c6, 0x00000000, 0x1040000e, 0x30621000, 0x10400005, + 0x00000000, 0x0e000688, 0x00000000, 0x0a0005bb, 0x00000000, 0x0e0004a1, + 0x00000000, 0x8f82002c, 0x24420001, 0xaf82002c, 0x0a0005c6, 0x00000000, + 0x30620040, 0x14400004, 0x00000000, 0x0000000d, 0x00000000, 0x240004db, + 0x8f420138, 0x3c034000, 0x00431025, 0xaf420138, 0x0a000566, 0x00000000, + 0x3c046008, 0x8c835000, 0x3c1a8000, 0x2402ff7f, 0x375b4000, 0x00621824, + 0x3463380c, 0xac835000, 0x8f420008, 0x3c056000, 0x3c03601c, 0x34420001, + 0xaf420008, 0x37428000, 0xaf800018, 0xaf820010, 0xaf400080, 0xaf400084, + 0x8c660008, 0x8ca20808, 0x3c040800, 0x3c030080, 0xac830820, 0x3042fff0, + 0x38420010, 0x2c420001, 0xaf860000, 0xaf820004, 0x03e00008, 0x00000000, + 0x3084ffff, 0x30820007, 0x10400002, 0x24820007, 0x3044fff8, 0x8f820018, + 0x00441821, 0x30631fff, 0x24644000, 0x0344d821, 0xaf82000c, 0xaf830018, + 0x03e00008, 0xaf430084, 0x3084ffff, 0x30820007, 0x10400002, 0x24820007, + 0x3044fff8, 0x8f820030, 0x8f830000, 0x00442021, 0xaf82001c, 0x0083102b, + 0xaf840030, 0x14400002, 0x00831023, 0xaf820030, 0x8f820030, 0x34038000, + 0x00431821, 0x03432021, 0xaf840010, 0x03e00008, 0xaf420080, 0x8f830024, + 0x24020002, 0x30630006, 0x1062000d, 0x2c620003, 0x50400005, 0x24020004, + 0x10600012, 0x3c020001, 0x0a00062a, 0x00000000, 0x10620007, 0x24020006, + 0x1462000f, 0x3c020111, 0x0a000622, 0x00821025, 0x0a000621, 0x3c020101, + 0x3c020011, 0x00821025, 0x24030001, 0xaf421000, 0xaf830020, 0x0a00062a, + 0x00000000, 0x00821025, 0xaf421000, 0xaf800020, 0x00000000, 0x00000000, + 0x00000000, 0x03e00008, 0x00000000, 0x8f820020, 0x10400005, 0x3c038000, + 0x8f421000, 0x00431024, 0x1040fffd, 0x00000000, 0x03e00008, 0x00000000, + 0x8f820024, 0x27bdffe8, 0x30424000, 0x14400005, 0xafbf0010, 0x0e00022f, + 0x00000000, 0x0a000656, 0x8fbf0010, 0x8f620008, 0x8f630000, 0x24020030, + 0x00031e02, 0x306300f0, 0x10620008, 0x28620031, 0x1440000d, 0x8fbf0010, + 0x24020040, 0x10620007, 0x00000000, 0x0a000656, 0x00000000, 0x0e0002e8, + 0x00000000, 0x0a000656, 0x8fbf0010, 0x0e0003db, 0x00000000, 0x8fbf0010, + 0x03e00008, 0x27bd0018, 0x8f840028, 0x1080000f, 0x3c026000, 0x8c430c3c, + 0x30630fff, 0xaf830008, 0x14600011, 0x3082000f, 0x10400005, 0x308200f0, + 0x10400003, 0x30820f00, 0x14400006, 0x00000000, 0x0000000d, 0x00000000, + 0x2400051a, 0x03e00008, 0x00000000, 0x0000000d, 0x00000000, 0x2400051f, + 0x03e00008, 0x00000000, 0xaf830028, 0x03e00008, 0x00000000, 0x10c00007, + 0x00000000, 0x8ca20000, 0x24c6ffff, 0x24a50004, 0xac820000, 0x14c0fffb, + 0x24840004, 0x03e00008, 0x00000000, 0x0a000684, 0x00a01021, 0xac860000, + 0x00000000, 0x00000000, 0x24840004, 0x00a01021, 0x1440fffa, 0x24a5ffff, + 0x03e00008, 0x00000000, 0x0000000d, 0x03e00008, 0x00000000, 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 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 int bnx2_TXP_b06FwReleaseMajor = 0x1; +static int bnx2_TXP_b06FwReleaseMinor = 0x0; +static int bnx2_TXP_b06FwReleaseFix = 0x0; +static u32 bnx2_TXP_b06FwStartAddr = 0x080034b0; +static u32 bnx2_TXP_b06FwTextAddr = 0x08000000; +static int bnx2_TXP_b06FwTextLen = 0x5748; +static u32 bnx2_TXP_b06FwDataAddr = 0x08005760; +static int bnx2_TXP_b06FwDataLen = 0x0; +static u32 bnx2_TXP_b06FwRodataAddr = 0x00000000; +static int bnx2_TXP_b06FwRodataLen = 0x0; +static u32 bnx2_TXP_b06FwBssAddr = 0x080057a0; +static int bnx2_TXP_b06FwBssLen = 0x1c4; +static u32 bnx2_TXP_b06FwSbssAddr = 0x08005760; +static int bnx2_TXP_b06FwSbssLen = 0x38; +static u32 bnx2_TXP_b06FwText[(0x5748/4) + 1] = { + 0x0a000d2c, 0x00000000, 0x00000000, 0x0000000d, 0x74787020, 0x322e352e, + 0x38000000, 0x02050800, 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, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 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, + 0x24425760, 0x3c030800, 0x24635964, 0xac400000, 0x0043202b, 0x1480fffd, + 0x24420004, 0x3c1d0800, 0x37bd7ffc, 0x03a0f021, 0x3c100800, 0x261034b0, + 0x3c1c0800, 0x279c5760, 0x0e000f5b, 0x00000000, 0x0000000d, 0x8f840014, + 0x27bdffe8, 0xafb10014, 0xafb00010, 0x8f460104, 0x8f830008, 0x8c8500ac, + 0xaf430080, 0x948200a8, 0xa7420e10, 0x948300aa, 0xa7430e12, 0x8c8200ac, + 0xaf420e18, 0x97430e10, 0xa7430e14, 0x97420e12, 0x00008021, 0xa7420e16, + 0x8f430e18, 0x00006021, 0x00c53023, 0xaf430e1c, 0x10c001a2, 0x2d820001, + 0x3c0e1000, 0x2419fff8, 0x24110010, 0x240f0f00, 0x3c188100, 0x93620008, + 0x10400009, 0x00000000, 0x97620010, 0x00c2102b, 0x14400005, 0x00000000, + 0x97620010, 0x3042ffff, 0x0a000d6d, 0xaf420e00, 0xaf460e00, 0x8f420000, + 0x30420008, 0x1040fffd, 0x00000000, 0x97420e08, 0x8f450e04, 0x3044ffff, + 0x30820001, 0x14400005, 0x00000000, 0x14a00005, 0x3083a040, 0x0a000f34, + 0x00000000, 0x0000000d, 0x3083a040, 0x24020040, 0x1462004f, 0x3082a000, + 0x308a0036, 0x8f88000c, 0x30890008, 0x24020800, 0xaf420178, 0x01001821, + 0x9742008a, 0x00431023, 0x2442ffff, 0x30421fff, 0x2c420008, 0x1440fffa, + 0x00a06021, 0x8f820018, 0x00cc3023, 0x24070001, 0x8f830008, 0x304b00ff, + 0x24420001, 0xaf820018, 0x25024000, 0x106f0005, 0x03422021, 0x93820012, + 0x30420007, 0x00021240, 0x34470001, 0x000b1400, 0x3c030100, 0x00431025, + 0xac820000, 0x8f830018, 0x00ea3825, 0x1120000f, 0xac830004, 0x97430e0a, + 0x8f84000c, 0x00ee3825, 0x2402000e, 0x00781825, 0xaf430160, 0x25830006, + 0x24840008, 0x30841fff, 0xa742015a, 0xa7430158, 0xaf84000c, 0x0a000db7, + 0x00000000, 0x8f83000c, 0x25820002, 0xa7420158, 0x24630008, 0x30631fff, + 0xaf83000c, 0x54c0000f, 0x8f420e14, 0x8f820008, 0x504f0002, 0x24100001, + 0x34e70040, 0x97420e10, 0x97430e12, 0x8f850014, 0x00021400, 0x00621825, + 0xaca300a8, 0x8f840014, 0x8f420e18, 0xac8200ac, 0x8f420e14, 0x8f430e1c, + 0xaf420144, 0xaf430148, 0xa34b0152, 0xaf470154, 0x0a000efb, 0xaf4e0178, + 0x10400165, 0x00000000, 0x93620008, 0x50400008, 0xafa60008, 0x97620010, + 0x00a2102b, 0x10400003, 0x30820040, 0x1040015c, 0x00000000, 0xafa60008, + 0xa7840010, 0xaf850004, 0x93620008, 0x1440005f, 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, 0x0a000e06, 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, 0x10600007, 0x3045ffff, 0x00a9102b, 0x14400005, 0x0125102b, + 0x3c068000, 0x0a000e3a, 0x00005821, 0x0125102b, 0x544000c7, 0x00006021, + 0x97420e14, 0xa7420e10, 0x97430e16, 0xa7430e12, 0x8f420e1c, 0xaf420e18, + 0xaf450e00, 0x8f420000, 0x30420008, 0x1040fffd, 0x00000000, 0x97420e08, + 0x00a04821, 0xa7820010, 0x8f430e04, 0x00003021, 0x240b0001, 0xaf830004, + 0x97620010, 0x0a000e4c, 0x304dffff, 0x8f890004, 0x97820010, 0x30420040, + 0x10400004, 0x01206821, 0x3c068000, 0x0a000e4c, 0x00005821, 0x97630010, + 0x8f820004, 0x10430003, 0x00003021, 0x0a000eee, 0x00006021, 0x240b0001, + 0x8d820000, 0x00491023, 0x1440000d, 0xad820000, 0x8f620014, 0x34420040, + 0xaf620014, 0x97430e10, 0x97420e12, 0x8f840014, 0x00031c00, 0x00431025, + 0xac8200a8, 0x8f830014, 0x8f420e18, 0xac6200ac, 0x93620008, 0x1440003e, + 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, 0x3063ffff, 0xa7430144, 0x97420e16, 0xa7420146, + 0xaf450148, 0xa34a0152, 0x8f82000c, 0x308400ff, 0xa744015a, 0xaf460160, + 0xa7480158, 0xaf470154, 0xaf4e0178, 0x00511021, 0x30421fff, 0xaf82000c, + 0x0a000ed9, 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, 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, 0x01206021, + 0x1580000c, 0x8fa60008, 0x97420e14, 0x97430e16, 0x8f850014, 0x00021400, + 0x00621825, 0xaca300a8, 0x8f840014, 0x8f420e1c, 0xac8200ac, 0x0a000efd, + 0x2d820001, 0x14c0fe65, 0x2d820001, 0x00501025, 0x10400058, 0x24020f00, + 0x8f830008, 0x14620023, 0x3c048000, 0x11800009, 0x3c038000, 0x97420e08, + 0x30420040, 0x14400005, 0x00000000, 0x0000000d, 0x00000000, 0x2400032c, + 0x3c038000, 0x8f420178, 0x00431024, 0x1440fffd, 0x00000000, 0x97420e10, + 0x3c030500, 0x00431025, 0xaf42014c, 0x97430e14, 0xa7430144, 0x97420e16, + 0xa7420146, 0x8f430e1c, 0x24022000, 0xaf430148, 0x3c031000, 0xa3400152, + 0xa740015a, 0xaf400160, 0xa7400158, 0xaf420154, 0xaf430178, 0x8f830008, + 0x3c048000, 0x8f420178, 0x00441024, 0x1440fffd, 0x24020f00, 0x10620016, + 0x00000000, 0x97420e14, 0xa7420144, 0x97430e16, 0xa7430146, 0x8f420e1c, + 0x3c031000, 0xaf420148, 0x0a000f51, 0x24020240, 0x97420e14, 0x97430e16, + 0x8f840014, 0x00021400, 0x00621825, 0xac8300a8, 0x8f850014, 0x8f420e1c, + 0x00006021, 0xaca200ac, 0x0a000efd, 0x2d820001, 0xaf40014c, 0x11800007, + 0x00000000, 0x97420e10, 0xa7420144, 0x97430e12, 0xa7430146, 0x0a000f4e, + 0x8f420e18, 0x97420e14, 0xa7420144, 0x97430e16, 0xa7430146, 0x8f420e1c, + 0xaf420148, 0x24020040, 0x3c031000, 0xa3400152, 0xa740015a, 0xaf400160, + 0xa7400158, 0xaf420154, 0xaf430178, 0x8fb10014, 0x8fb00010, 0x03e00008, + 0x27bd0018, 0x27bdffd0, 0x3c1a8000, 0x3c0420ff, 0x3484fffd, 0x3c020008, + 0x03421821, 0xafbf002c, 0xafb60028, 0xafb50024, 0xafb40020, 0xafb3001c, + 0xafb20018, 0xafb10014, 0xafb00010, 0xaf830014, 0xaf440e00, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x3c0200ff, 0x3442fffd, + 0x3c046004, 0xaf420e00, 0x8c835000, 0x24160800, 0x24150d00, 0x3c140800, + 0x24130f00, 0x3c120800, 0x3c114000, 0x2402ff7f, 0x00621824, 0x3463380c, + 0x24020009, 0xac835000, 0xaf420008, 0xaf800018, 0xaf80000c, 0x0e001559, + 0x00000000, 0x0e000ff0, 0x00000000, 0x3c020800, 0x245057c0, 0x8f420000, + 0x30420001, 0x1040fffd, 0x00000000, 0x8f440100, 0xaf840008, 0xaf440020, + 0xaf560178, 0x93430108, 0xa3830012, 0x93820012, 0x30420001, 0x10400008, + 0x00000000, 0x93820012, 0x30420006, 0x00021100, 0x0e000d43, 0x0050d821, + 0x0a000fac, 0x00000000, 0x14950005, 0x00000000, 0x0e000d43, 0x269b5840, + 0x0a000fac, 0x00000000, 0x14930005, 0x00000000, 0x0e000d43, 0x265b5860, + 0x0a000fac, 0x00000000, 0x0e0010ea, 0x00000000, 0xaf510138, 0x0a000f89, + 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, 0x0e001559, + 0x00000000, 0x0e000ff0, 0x00000000, 0x8fbf0010, 0x03e00008, 0x27bd0018, + 0x27bdffe8, 0x3c02000a, 0x03421821, 0x3c040800, 0x24845880, 0x24050019, + 0xafbf0010, 0xaf830024, 0x0e001565, 0x00003021, 0x3c050800, 0x3c020800, + 0x24425330, 0xaca258e8, 0x24a558e8, 0x3c020800, 0x244254f8, 0x3c030800, + 0x2463550c, 0x3c040800, 0xaca20004, 0x3c020800, 0x24425338, 0xaca30008, + 0xac825900, 0x24845900, 0x3c020800, 0x244253c4, 0x3c070800, 0x24e75404, + 0x3c060800, 0x24c65520, 0x3c050800, 0x24a55438, 0x3c030800, 0xac820004, + 0x3c020800, 0x24425528, 0xac870008, 0xac86000c, 0xac850010, 0xac625920, + 0x24635920, 0x8fbf0010, 0x3c020800, 0x24425540, 0xac620004, 0x3c020800, + 0xac670008, 0xac66000c, 0xac650010, 0xac400048, 0x03e00008, 0x27bd0018, + 0x974309da, 0x00804021, 0xad030000, 0x8f4209dc, 0xad020004, 0x8f4309e0, + 0xad030008, 0x934409d9, 0x24020001, 0x30840003, 0x1082001f, 0x30a900ff, + 0x28820002, 0x10400005, 0x24020002, 0x10800009, 0x3c0a0800, 0x0a001078, + 0x93420934, 0x1082000b, 0x24020003, 0x10820026, 0x3c0a0800, 0x0a001078, + 0x93420934, 0x974209e4, 0x00021400, 0x34420800, 0xad02000c, 0x0a001077, + 0x25080010, 0x974209e4, 0x00021400, 0x34428100, 0xad02000c, 0x974309e8, + 0x3c0a0800, 0x00031c00, 0x34630800, 0xad030010, 0x0a001077, 0x25080014, + 0x974409e4, 0x3c050800, 0x24a25880, 0x9443001c, 0x94460014, 0x94470010, + 0x00a05021, 0x24020800, 0xad000010, 0xad020014, 0x00042400, 0x00661821, + 0x00671823, 0x2463fff2, 0x00832025, 0xad04000c, 0x0a001077, 0x25080018, + 0x974209e4, 0x3c050800, 0x00021400, 0x34428100, 0xad02000c, 0x974409e8, + 0x24a25880, 0x9443001c, 0x94460014, 0x94470010, 0x00a05021, 0x24020800, + 0xad000014, 0xad020018, 0x00042400, 0x00661821, 0x00671823, 0x2463ffee, + 0x00832025, 0xad040010, 0x2508001c, 0x93420934, 0x93450921, 0x3c074000, + 0x25445880, 0x94830018, 0x94860014, 0x00021082, 0x00021600, 0x00052c00, + 0x00a72825, 0x00451025, 0x00661821, 0x00431025, 0xad020000, 0x9783002c, + 0x974209ea, 0x00621821, 0x00031c00, 0xad030004, 0x9782002c, 0x24420001, + 0x30427fff, 0xa782002c, 0x93430920, 0x3c020006, 0x00031e00, 0x00621825, + 0xad030008, 0x8f42092c, 0xad02000c, 0x8f430930, 0xad030010, 0x8f440938, + 0x25080014, 0xad040000, 0x8f820020, 0x11200004, 0xad020004, 0x8f420940, + 0x0a0010a1, 0x2442ffff, 0x8f420940, 0xad020008, 0x8f440948, 0x8f420940, + 0x93430936, 0x00823023, 0x00663006, 0x3402ffff, 0x0046102b, 0x54400001, + 0x3406ffff, 0x93420937, 0x25445880, 0x90830024, 0xad000010, 0x00021700, + 0x34630010, 0x00031c00, 0x00431025, 0x00461025, 0xad02000c, 0x8c830008, + 0x14600031, 0x25080014, 0x3c020800, 0x8c430048, 0x1060002d, 0x00000000, + 0x9342010b, 0xad020000, 0x8f830000, 0x8c6200b0, 0xad020004, 0x8f830000, + 0x8c6200b4, 0xad020008, 0x8f830000, 0x8c6200c0, 0xad02000c, 0x8f830000, + 0x8c6200c4, 0xad020010, 0x8f830000, 0x8c6200c8, 0xad020014, 0x8f830000, + 0x8c6200cc, 0xad020018, 0x8f830000, 0x8c6200e0, 0xad02001c, 0x8f830000, + 0x8c6200e8, 0xad020020, 0x8f830000, 0x8c6200f0, 0x3c04600e, 0xad020024, + 0x8c8200d0, 0xad020028, 0x8c8300d4, 0xad03002c, 0x8f820028, 0x3c046012, + 0xad020030, 0x8c8200a8, 0xad020034, 0x8c8300ac, 0x3c026000, 0xad030038, + 0x8c434448, 0xad03003c, 0x03e00008, 0x01001021, 0x27bdffa8, 0x3c020008, + 0x03423021, 0xafbf0054, 0xafbe0050, 0xafb7004c, 0xafb60048, 0xafb50044, + 0xafb40040, 0xafb3003c, 0xafb20038, 0xafb10034, 0xafb00030, 0xaf860000, + 0x24020040, 0xaf420814, 0xaf400810, 0x8f420944, 0x8f430950, 0x8f440954, + 0x8f45095c, 0xaf820034, 0xaf830020, 0xaf84001c, 0xaf850030, 0x90c20000, + 0x24030020, 0x304400ff, 0x10830005, 0x24020030, 0x10820022, 0x3c030800, + 0x0a001139, 0x8c62002c, 0x24020088, 0xaf420818, 0x3c020800, 0x244258e8, + 0xafa20020, 0x93430109, 0x3c020800, 0x10600009, 0x24575900, 0x3c026000, + 0x24030100, 0xac43081c, 0x3c030001, 0xac43081c, 0x0000000d, 0x00000000, + 0x24000376, 0x9342010a, 0x30420080, 0x14400021, 0x24020800, 0x3c026000, + 0x24030100, 0xac43081c, 0x3c030001, 0xac43081c, 0x0000000d, 0x00000000, + 0x2400037d, 0x0a001141, 0x24020800, 0x93430109, 0x3063007f, 0x00031140, + 0x000318c0, 0x00431021, 0x24430088, 0xaf430818, 0x0000000d, 0x3c020800, + 0x24425940, 0x3c030800, 0x24775950, 0x0a001140, 0xafa20020, 0x24420001, + 0xac62002c, 0x0000000d, 0x00000000, 0x24000395, 0x0a0014c1, 0x8fbf0054, + 0x24020800, 0xaf420178, 0x8f450104, 0x8f420988, 0x00a21023, 0x58400005, + 0x8f4309a0, 0x0000000d, 0x00000000, 0x240003b1, 0x8f4309a0, 0x3c100800, + 0xae0358b0, 0x8f4209a4, 0x8f830020, 0x260458b0, 0x2491ffd0, 0xae220034, + 0x00a21023, 0xae230028, 0xac82ffd0, 0x8fa30020, 0x8c620000, 0x0040f809, + 0x0200b021, 0x00409021, 0x32440010, 0x32420002, 0x10400007, 0xafa40024, + 0x8e220020, 0x32530040, 0x2403ffbf, 0x00431024, 0x0a001493, 0xae220020, + 0x32420020, 0x10400002, 0x3c020800, 0x24575920, 0x32420001, 0x14400007, + 0x00000000, 0x8f820008, 0xaf420080, 0x8ec358b0, 0xaf430e10, 0x8e220034, + 0xaf420e18, 0x9343010b, 0x93420905, 0x30420008, 0x1040003c, 0x307400ff, + 0x8f820000, 0x8c430074, 0x0460000a, 0x00000000, 0x3c026000, 0x24030100, + 0xac43081c, 0x3c030001, 0xac43081c, 0x0000000d, 0x00000000, 0x240003ed, + 0x8f820000, 0x9044007b, 0x9343010a, 0x14830027, 0x32530040, 0x00003821, + 0x24052000, 0x3c090800, 0x3c038000, 0x8f420178, 0x00431024, 0x1440fffd, + 0x8ec258b0, 0x26c458b0, 0x2484ffd0, 0xaf420144, 0x8c820034, 0x3c030100, + 0xaf420148, 0x24020047, 0xaf43014c, 0xa3420152, 0x8d230030, 0x3c021000, + 0xa7470158, 0xaf450154, 0xaf420178, 0x8c860034, 0x24630001, 0xad230030, + 0x9342010a, 0x3c030047, 0xafa50014, 0x00021600, 0x00431025, 0x00471025, + 0xafa20010, 0x9343010b, 0xafa30018, 0x8f440100, 0x8f450104, 0x0e00159b, + 0x3c070100, 0x3c050800, 0x24a25880, 0x0a001250, 0x8c430020, 0x32820002, + 0x10400050, 0x00000000, 0x0e0015b9, 0x32530040, 0x3c039000, 0x34630001, + 0x8f820008, 0x3c048000, 0x00431025, 0xaf420020, 0x8f420020, 0x00441024, + 0x1440fffd, 0x00000000, 0x8f830000, 0x90620005, 0x34420008, 0xa0620005, + 0x8f840000, 0x8c820074, 0x3c038000, 0x00431025, 0xac820074, 0x90830000, + 0x24020020, 0x10620004, 0x00000000, 0x0000000d, 0x00000000, 0x2400040b, + 0x8f830008, 0x3c028000, 0x34420001, 0x00621825, 0xaf430020, 0x9084007b, + 0x9342010a, 0x14820028, 0x3c030800, 0x00003821, 0x24052000, 0x3c090800, + 0x3c038000, 0x8f420178, 0x00431024, 0x1440fffd, 0x8ec258b0, 0x26c458b0, + 0x2484ffd0, 0xaf420144, 0x8c820034, 0x3c030100, 0xaf420148, 0x24020046, + 0xaf43014c, 0xa3420152, 0x8d230030, 0x3c021000, 0xa7470158, 0xaf450154, + 0xaf420178, 0x8c860034, 0x24630001, 0xad230030, 0x9342010a, 0x3c030046, + 0xafa50014, 0x00021600, 0x00431025, 0x00471025, 0xafa20010, 0x9343010b, + 0xafa30018, 0x8f440100, 0x8f450104, 0x0e00159b, 0x3c070100, 0x3c030800, + 0x24625880, 0x0a001250, 0x8c430020, 0x93420108, 0x30420010, 0x50400056, + 0x9343093f, 0x8f860000, 0x90c2007f, 0x8cc30178, 0x304800ff, 0x15030004, + 0x00000000, 0x0000000d, 0x00000000, 0x24000425, 0x90c2007e, 0x90c40080, + 0x00081c00, 0x00021600, 0x00431025, 0x00042200, 0x90c3007a, 0x90c5000a, + 0x00441025, 0x11050028, 0x00623825, 0xa0c8000a, 0x00004021, 0x24056000, + 0x3c090800, 0x3c038000, 0x8f420178, 0x00431024, 0x1440fffd, 0x8ec258b0, + 0x26c458b0, 0x2484ffd0, 0xaf420144, 0x8c820034, 0xaf420148, 0x24020052, + 0xaf47014c, 0xa3420152, 0x8d230030, 0x3c021000, 0xa7480158, 0xaf450154, + 0xaf420178, 0x8c860034, 0x24630001, 0xad230030, 0x9342010a, 0x3c030052, + 0xafa50014, 0x00021600, 0x00431025, 0x00481025, 0xafa20010, 0x9343010b, + 0xafa30018, 0x8f440100, 0x0e00159b, 0x8f450104, 0x0a00124a, 0x00000000, + 0x3c026000, 0x24030100, 0xac43081c, 0x3c030001, 0xac43081c, 0x0000000d, + 0x00000000, 0x2400043e, 0x16800009, 0x3c050800, 0x3c040800, 0x24825880, + 0x8c430020, 0x32530040, 0x2404ffbf, 0x00641824, 0x0a001493, 0xac430020, + 0x8ca25880, 0x10400005, 0x3c030800, 0x8c620034, 0xaca05880, 0x24420001, + 0xac620034, 0x9343093f, 0x24020012, 0x5462000e, 0x97420908, 0x32820038, + 0x14400009, 0x3c030800, 0x8f830000, 0x8c62004c, 0xac62005c, 0x3c020800, + 0x24445880, 0x8c820020, 0x0a001285, 0x32530040, 0xac605880, 0x97420908, + 0x5440001c, 0x97420908, 0x3c039000, 0x34630001, 0x8f820008, 0x32530040, + 0x3c048000, 0x00431025, 0xaf420020, 0x8f420020, 0x00441024, 0x1440fffd, + 0x3c028000, 0x8f840000, 0x8f850008, 0x8c830050, 0x34420001, 0x00a22825, + 0xaf830020, 0xac830070, 0xac83005c, 0xaf450020, 0x3c050800, 0x24a45880, + 0x8c820020, 0x2403ffbf, 0x00431024, 0x0a001493, 0xac820020, 0x000211c0, + 0xaf420024, 0x97420908, 0x3c030080, 0x34630003, 0x000211c0, 0xaf42080c, + 0xaf43081c, 0x974209ec, 0x8f4309a4, 0xa782002c, 0x3c020800, 0x24445880, + 0xac83002c, 0x93420937, 0x93430934, 0x00021080, 0x00621821, 0xa4830018, + 0x934209d8, 0x32850038, 0xafa50028, 0x00621821, 0xa483001a, 0x934209d8, + 0x93430934, 0x3c1e0800, 0x00809821, 0x00431021, 0x24420010, 0xa4820016, + 0x24020006, 0xae620020, 0x8fa20028, 0x10400003, 0x0000a821, 0x0a0012f0, + 0x24120008, 0x8f420958, 0x8f830020, 0x8f840030, 0x00431023, 0x00832023, + 0x04800003, 0xae620004, 0x04410003, 0x0082102b, 0x0a0012bc, 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, 0x240004cd, + 0x24150001, 0x8ee20004, 0x0040f809, 0x00000000, 0x02429025, 0x32420002, + 0x5040001d, 0x8f470940, 0x12a00006, 0x8ec258b0, 0x8f830000, 0xac6200a8, + 0x8f840000, 0x8e620034, 0xac8200ac, 0x32420004, 0x50400013, 0x8f470940, + 0x3c020800, 0x3283007d, 0x10600110, 0x24575920, 0x32820001, 0x50400006, + 0x36520002, 0x8f830034, 0x8f420940, 0x10620109, 0x00000000, 0x36520002, + 0x24020008, 0xa6600010, 0xa6620012, 0xae600008, 0xa2600024, 0x8f470940, + 0x3c030800, 0x24685880, 0x8d02002c, 0x8d050008, 0x95040010, 0x9506000a, + 0x95030026, 0x00451021, 0x00862021, 0x00641821, 0xaf870034, 0xad02002c, + 0x32820030, 0x10400008, 0xa5030014, 0x91020024, 0x32910040, 0x34420004, + 0xa1020024, 0xaf400048, 0x0a001345, 0x3c040800, 0x93420923, 0x30420002, + 0x10400029, 0x32910040, 0x8f830000, 0x8f840020, 0x8c620084, 0x00441023, + 0x0442000a, 0x3c039000, 0x95020014, 0x8c630084, 0x00821021, 0x00621823, + 0x1c600004, 0x3c039000, 0x91020024, 0x34420001, 0xa1020024, 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, 0x24865880, 0x94c20010, 0x94c3001a, 0x8cc40008, 0x00432821, + 0x14800006, 0xa4c5001c, 0x3c020800, 0x8c430048, 0x10600002, 0x24a20040, + 0xa4c2001c, 0x27d05880, 0x9604001c, 0x96020012, 0x00822021, 0x24840002, + 0x0e000faf, 0x3084ffff, 0x8f850018, 0x00a01821, 0xa2030025, 0x8ee60008, + 0x00402021, 0x24a50001, 0xaf850018, 0x00c0f809, 0x00000000, 0x00402021, + 0x0e001026, 0x02202821, 0x8ee3000c, 0x0060f809, 0x00402021, 0x9604001c, + 0x96020012, 0x00822021, 0x24840002, 0x0e000fc5, 0x3084ffff, 0x8fc25880, + 0x8e030008, 0x00431023, 0x14400012, 0xafc25880, 0x54600006, 0x8e020020, + 0x3243004a, 0x24020002, 0x14620005, 0x00000000, 0x8e020020, 0x34420040, + 0x0a001382, 0xae020020, 0x52a00006, 0x36520002, 0x8e020030, 0xaf420e10, + 0x8e030034, 0xaf430e18, 0x36520002, 0x52a00008, 0x96670014, 0x8f830000, + 0x8f420e10, 0xac6200a8, 0x8f840000, 0x8f420e18, 0xac8200ac, 0x96670014, + 0x92680024, 0x24020040, 0xaf420814, 0x8f830020, 0x8f82001c, 0x00671821, + 0x00621023, 0xaf830020, 0x18400008, 0x00000000, 0x8f820000, 0xaf83001c, + 0xac430054, 0x54e00005, 0xaf400040, 0x0a0013a0, 0x8f42095c, 0x54e00001, + 0xaf400044, 0x8f42095c, 0x31030008, 0xaf820030, 0x1060001a, 0x00000000, + 0x8f840000, 0x90820120, 0x90830121, 0x304600ff, 0x00c31823, 0x30630007, + 0x24020007, 0x1062000e, 0x00000000, 0x90820122, 0x304200fe, 0xa0820122, + 0x8f850000, 0x00061880, 0x8f840020, 0x24a20100, 0x00431021, 0x24c30001, + 0x30630007, 0xac440000, 0x0a0013bd, 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, 0x8f820020, + 0x3c050800, 0x24b05880, 0xae020028, 0x8ee30010, 0x0060f809, 0x00000000, + 0x8f820028, 0x24420001, 0xaf820028, 0x12a00005, 0xaf40004c, 0x8f420e10, + 0xae020030, 0x8f430e18, 0xae030034, 0x1220fea7, 0x24020006, 0x8f870024, + 0x9786002c, 0x8f830000, 0x8f820034, 0x8f840020, 0x8f85001c, 0x32530040, + 0xa4e6002c, 0xac620044, 0x32420008, 0xac640050, 0xac650054, 0x1040007a, + 0x32820020, 0x10400027, 0x32910010, 0x00003821, 0x24052000, 0x3c090800, + 0x3c038000, 0x8f420178, 0x00431024, 0x1440fffd, 0x8ec258b0, 0x26c458b0, + 0x2484ffd0, 0xaf420144, 0x8c820034, 0x3c030400, 0xaf420148, 0x24020041, + 0xaf43014c, 0xa3420152, 0x8d230030, 0x3c021000, 0xa7470158, 0xaf450154, + 0xaf420178, 0x8c860034, 0x24630001, 0xad230030, 0x9342010a, 0x3c030041, + 0xafa50014, 0x00021600, 0x00431025, 0x00471025, 0xafa20010, 0x9343010b, + 0xafa30018, 0x8f440100, 0x8f450104, 0x0e00159b, 0x3c070400, 0x12200028, + 0x00003821, 0x24052000, 0x3c090800, 0x3c038000, 0x8f420178, 0x00431024, + 0x1440fffd, 0x8ec258b0, 0x26c458b0, 0x2484ffd0, 0xaf420144, 0x8c820034, + 0x3c030300, 0xaf420148, 0x2402004e, 0xaf43014c, 0xa3420152, 0x8d230030, + 0x3c021000, 0xa7470158, 0xaf450154, 0xaf420178, 0x8c860034, 0x24630001, + 0xad230030, 0x9342010a, 0x3c03004e, 0xafa50014, 0x00021600, 0x00431025, + 0x00471025, 0xafa20010, 0x9343010b, 0xafa30018, 0x8f440100, 0x8f450104, + 0x0e00159b, 0x3c070300, 0x0a00148b, 0x8fa20024, 0x32820008, 0x10400026, + 0x24052000, 0x00003821, 0x3c090800, 0x3c038000, 0x8f420178, 0x00431024, + 0x1440fffd, 0x8ec258b0, 0x26c458b0, 0x2484ffd0, 0xaf420144, 0x8c820034, + 0x3c030200, 0xaf420148, 0x2402004b, 0xaf43014c, 0xa3420152, 0x8d230030, + 0x3c021000, 0xa7470158, 0xaf450154, 0xaf420178, 0x8c860034, 0x24630001, + 0xad230030, 0x9342010a, 0x3c03004b, 0xafa50014, 0x00021600, 0x00431025, + 0x00471025, 0xafa20010, 0x9343010b, 0xafa30018, 0x8f440100, 0x8f450104, + 0x0e00159b, 0x3c070200, 0x8fa20024, 0x14400004, 0x8fa30020, 0x32420010, + 0x10400004, 0x00000000, 0x8c620004, 0x0040f809, 0x00000000, 0x12600006, + 0x8fa40020, 0x8c820008, 0x0040f809, 0x00000000, 0x0a0014c1, 0x8fbf0054, + 0x3c030800, 0x8c6258a0, 0x30420040, 0x14400023, 0x8fbf0054, 0x00002821, + 0x24040040, 0x8f870020, 0x3c038000, 0x8f420178, 0x00431024, 0x1440fffd, + 0x8ec258b0, 0x26c358b0, 0x2463ffd0, 0xaf420144, 0x8c620034, 0xaf420148, + 0x24020049, 0xaf47014c, 0xa3420152, 0x3c021000, 0xa7450158, 0xaf440154, + 0xaf420178, 0x8c660034, 0x9342010a, 0x3c030049, 0xafa40014, 0x00021600, + 0x00431025, 0x00451025, 0xafa20010, 0x9343010b, 0xafa30018, 0x8f440100, + 0x0e00159b, 0x8f450104, 0x8fbf0054, 0x8fbe0050, 0x8fb7004c, 0x8fb60048, + 0x8fb50044, 0x8fb40040, 0x8fb3003c, 0x8fb20038, 0x8fb10034, 0x8fb00030, + 0x03e00008, 0x27bd0058, 0x03e00008, 0x00001021, 0x3c020800, 0x24435880, + 0x8c650004, 0x8c445880, 0x0085182b, 0x10600002, 0x00403021, 0x00802821, + 0x9744093c, 0x00a4102b, 0x54400001, 0x00a02021, 0x93420923, 0x0004182b, + 0x00021042, 0x30420001, 0x00431024, 0x1040000d, 0x24c25880, 0x8f850000, + 0x8f830020, 0x8ca20084, 0x00431023, 0x04420007, 0x24c25880, 0x8ca20084, + 0x00641821, 0x00431023, 0x28420001, 0x00822023, 0x24c25880, 0xac440008, + 0xa4400026, 0x03e00008, 0x00001021, 0x8f850004, 0x97840010, 0x3c030800, + 0x24635880, 0x24020008, 0xa4620012, 0x8f820004, 0xa4600010, 0x000420c2, + 0x30840008, 0x2c420001, 0x00021023, 0x30420006, 0xac650008, 0x03e00008, + 0xa0640024, 0x3c020800, 0x24425880, 0x90450025, 0x9443001c, 0x3c021100, + 0xac800004, 0x00052c00, 0x24630002, 0x00621825, 0x00a32825, 0x24820008, + 0x03e00008, 0xac850000, 0x27bdffd8, 0x3c020800, 0x24425880, 0xafbf0020, + 0x90480025, 0x8c440008, 0x8c460020, 0x8f870020, 0x3c030800, 0x3c058000, + 0x8f420178, 0x00451024, 0x1440fffd, 0x8c6258b0, 0x246358b0, 0x2469ffd0, + 0xaf420144, 0x8d220034, 0x30c32000, 0xaf420148, 0x3c021000, 0xaf47014c, + 0xa3480152, 0xa7440158, 0xaf460154, 0xaf420178, 0x10600004, 0x3c030800, + 0x8c620030, 0x24420001, 0xac620030, 0x9342010a, 0x00081c00, 0x3084ffff, + 0xafa60014, 0x00021600, 0x00431025, 0x00441025, 0xafa20010, 0x9343010b, + 0xafa30018, 0x8f440100, 0x8f450104, 0x0e00159b, 0x8d260034, 0x8fbf0020, + 0x03e00008, 0x27bd0028, 0x0000000d, 0x00000000, 0x2400019d, 0x03e00008, + 0x00000000, 0x0000000d, 0x00000000, 0x240001a9, 0x03e00008, 0x00000000, + 0x03e00008, 0x00000000, 0x3c020800, 0x24425880, 0xac400008, 0xa4400026, + 0x03e00008, 0x24020001, 0x3c020800, 0x24425880, 0x24030008, 0xac400008, + 0xa4400010, 0xa4430012, 0xa0400024, 0x03e00008, 0x24020004, 0x03e00008, + 0x00001021, 0x10c00007, 0x00000000, 0x8ca20000, 0x24c6ffff, 0x24a50004, + 0xac820000, 0x14c0fffb, 0x24840004, 0x03e00008, 0x00000000, 0x0a00156c, + 0x00a01021, 0xac860000, 0x00000000, 0x00000000, 0x24840004, 0x00a01021, + 0x1440fffa, 0x24a5ffff, 0x03e00008, 0x00000000, 0x3c0a0800, 0x8d490068, + 0x3c050800, 0x24a52098, 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, 0x25080080, + 0x000a4940, 0x01281021, 0x01091821, 0xac440000, 0x00601021, 0xac650004, + 0xac460008, 0xac67000c, 0xac4c0010, 0xac6d0014, 0x3c036000, 0xac4e0018, + 0x8c654448, 0x3c040800, 0x8c820064, 0x254a0001, 0x314a00ff, 0x01094021, + 0xad6a0060, 0x24420001, 0xac820064, 0x03e00008, 0xad05001c, 0x3c030800, + 0x3c090800, 0x8d250070, 0x246330b0, 0x8f460100, 0x00053900, 0x00e31021, + 0xac460000, 0x8f440104, 0x00671021, 0xac440004, 0x8f460108, 0x8f840014, + 0x24a50001, 0xac460008, 0x8c880074, 0x3c060800, 0x8cc20074, 0x30a5003f, + 0x00671821, 0xad250070, 0x24420001, 0xacc20074, 0x03e00008, 0xac68000c, + 0x00000000 }; static u32 bnx2_TXP_b06FwData[(0x0/4) + 1] = { 0x0 }; static u32 bnx2_TXP_b06FwRodata[(0x0/4) + 1] = { 0x0 }; diff --git a/drivers/net/bonding/bond_3ad.c b/drivers/net/bonding/bond_3ad.c index 6a407070c..f3f582546 100644 --- a/drivers/net/bonding/bond_3ad.c +++ b/drivers/net/bonding/bond_3ad.c @@ -2294,34 +2294,6 @@ void bond_3ad_handle_link_change(struct slave *slave, char link) port->sm_vars |= AD_PORT_BEGIN; } -/* - * set link state for bonding master: if we have an active partnered - * aggregator, we're up, if not, we're down. Presumes that we cannot - * have an active aggregator if there are no slaves with link up. - * - * Called by bond_set_carrier(). Return zero if carrier state does not - * change, nonzero if it does. - */ -int bond_3ad_set_carrier(struct bonding *bond) -{ - struct aggregator *agg; - - agg = __get_active_agg(&(SLAVE_AD_INFO(bond->first_slave).aggregator)); - if (agg && MAC_ADDRESS_COMPARE(&agg->partner_system, &null_mac_addr)) { - if (!netif_carrier_ok(bond->dev)) { - netif_carrier_on(bond->dev); - return 1; - } - return 0; - } - - if (netif_carrier_ok(bond->dev)) { - netif_carrier_off(bond->dev); - return 1; - } - return 0; -} - /** * bond_3ad_get_active_agg_info - get information of the active aggregator * @bond: bonding struct to work on diff --git a/drivers/net/bonding/bond_3ad.h b/drivers/net/bonding/bond_3ad.h index 6ad5ad6e6..5ee2cef5b 100644 --- a/drivers/net/bonding/bond_3ad.h +++ b/drivers/net/bonding/bond_3ad.h @@ -283,6 +283,5 @@ void bond_3ad_handle_link_change(struct slave *slave, char link); int bond_3ad_get_active_agg_info(struct bonding *bond, struct ad_info *ad_info); int bond_3ad_xmit_xor(struct sk_buff *skb, struct net_device *dev); int bond_3ad_lacpdu_recv(struct sk_buff *skb, struct net_device *dev, struct packet_type* ptype, struct net_device *orig_dev); -int bond_3ad_set_carrier(struct bonding *bond); #endif //__BOND_3AD_H__ diff --git a/drivers/net/bonding/bond_alb.c b/drivers/net/bonding/bond_alb.c index e83bc825f..f2a63186a 100644 --- a/drivers/net/bonding/bond_alb.c +++ b/drivers/net/bonding/bond_alb.c @@ -1261,7 +1261,7 @@ int bond_alb_xmit(struct sk_buff *skb, struct net_device *bond_dev) struct ethhdr *eth_data; struct alb_bond_info *bond_info = &(BOND_ALB_INFO(bond)); struct slave *tx_slave = NULL; - static const u32 ip_bcast = 0xffffffff; + static u32 ip_bcast = 0xffffffff; int hash_size = 0; int do_tx_balance = 1; u32 hash_index = 0; diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c index cf906d73c..bcf9f17da 100644 --- a/drivers/net/bonding/bond_main.c +++ b/drivers/net/bonding/bond_main.c @@ -33,6 +33,7 @@ //#define BONDING_DEBUG 1 +#include #include #include #include @@ -130,7 +131,7 @@ MODULE_PARM_DESC(arp_ip_target, "arp targets in n.n.n.n form"); /*----------------------------- Global variables ----------------------------*/ -static const char * const version = +static const char *version = DRV_DESCRIPTION ": v" DRV_VERSION " (" DRV_RELDATE ")\n"; LIST_HEAD(bond_dev_list); @@ -557,42 +558,6 @@ out: /*------------------------------- Link status -------------------------------*/ -/* - * Set the carrier state for the master according to the state of its - * slaves. If any slaves are up, the master is up. In 802.3ad mode, - * do special 802.3ad magic. - * - * Returns zero if carrier state does not change, nonzero if it does. - */ -static int bond_set_carrier(struct bonding *bond) -{ - struct slave *slave; - int i; - - if (bond->slave_cnt == 0) - goto down; - - if (bond->params.mode == BOND_MODE_8023AD) - return bond_3ad_set_carrier(bond); - - bond_for_each_slave(bond, slave, i) { - if (slave->link == BOND_LINK_UP) { - if (!netif_carrier_ok(bond->dev)) { - netif_carrier_on(bond->dev); - return 1; - } - return 0; - } - } - -down: - if (netif_carrier_ok(bond->dev)) { - netif_carrier_off(bond->dev); - return 1; - } - return 0; -} - /* * Get link speed and duplex from the slave's base driver * using ethtool. If for some reason the call fails or the @@ -1075,10 +1040,6 @@ void bond_change_active_slave(struct bonding *bond, struct slave *new_active) if ((bond->params.mode == BOND_MODE_TLB) || (bond->params.mode == BOND_MODE_ALB)) { bond_alb_handle_active_change(bond, new_active); - if (old_active) - bond_set_slave_inactive_flags(old_active); - if (new_active) - bond_set_slave_active_flags(new_active); } else { bond->curr_active_slave = new_active; } @@ -1109,24 +1070,10 @@ void bond_change_active_slave(struct bonding *bond, struct slave *new_active) void bond_select_active_slave(struct bonding *bond) { struct slave *best_slave; - int rv; best_slave = bond_find_best_slave(bond); if (best_slave != bond->curr_active_slave) { bond_change_active_slave(bond, best_slave); - rv = bond_set_carrier(bond); - if (!rv) - return; - - if (netif_carrier_ok(bond->dev)) { - printk(KERN_INFO DRV_NAME - ": %s: first active interface up!\n", - bond->dev->name); - } else { - printk(KERN_INFO DRV_NAME ": %s: " - "now running without any active interface !\n", - bond->dev->name); - } } } @@ -1198,7 +1145,8 @@ int bond_sethwaddr(struct net_device *bond_dev, struct net_device *slave_dev) } #define BOND_INTERSECT_FEATURES \ - (NETIF_F_SG | NETIF_F_ALL_CSUM | NETIF_F_TSO | NETIF_F_UFO) + (NETIF_F_SG|NETIF_F_IP_CSUM|NETIF_F_NO_CSUM|NETIF_F_HW_CSUM|\ + NETIF_F_TSO|NETIF_F_UFO) /* * Compute the common dev->feature set available to all slaves. Some @@ -1216,7 +1164,9 @@ static int bond_compute_features(struct bonding *bond) features &= (slave->dev->features & BOND_INTERSECT_FEATURES); if ((features & NETIF_F_SG) && - !(features & NETIF_F_ALL_CSUM)) + !(features & (NETIF_F_IP_CSUM | + NETIF_F_NO_CSUM | + NETIF_F_HW_CSUM))) features &= ~NETIF_F_SG; /* @@ -1493,25 +1443,20 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev) switch (bond->params.mode) { case BOND_MODE_ACTIVEBACKUP: - /* if we're in active-backup mode, we need one and - * only one active interface. The backup interfaces - * will have their SLAVE_INACTIVE flag set because we - * need them to be drop all packets. Thus, since we - * guarantee that curr_active_slave always point to - * the last usable interface, we just have to verify - * this interface's flag. + /* if we're in active-backup mode, we need one and only one active + * interface. The backup interfaces will have their NOARP flag set + * because we need them to be completely deaf and not to respond to + * any ARP request on the network to avoid fooling a switch. Thus, + * since we guarantee that curr_active_slave always point to the last + * usable interface, we just have to verify this interface's flag. */ if (((!bond->curr_active_slave) || - (bond->curr_active_slave->dev->priv_flags & IFF_SLAVE_INACTIVE)) && + (bond->curr_active_slave->dev->flags & IFF_NOARP)) && (new_slave->link != BOND_LINK_DOWN)) { + dprintk("This is the first active slave\n"); /* first slave or no active slave yet, and this link is OK, so make this interface the active one */ bond_change_active_slave(bond, new_slave); - printk(KERN_INFO DRV_NAME - ": %s: first active interface up!\n", - bond->dev->name); - netif_carrier_on(bond->dev); - } else { dprintk("This is just a backup slave\n"); bond_set_slave_inactive_flags(new_slave); @@ -1547,8 +1492,6 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev) * is OK, so make this interface the active one */ bond_change_active_slave(bond, new_slave); - } else { - bond_set_slave_inactive_flags(new_slave); } break; default: @@ -1567,8 +1510,6 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev) break; } /* switch(bond_mode) */ - bond_set_carrier(bond); - write_unlock_bh(&bond->lock); res = bond_create_slave_symlinks(bond_dev, slave_dev); @@ -1708,12 +1649,18 @@ int bond_release(struct net_device *bond_dev, struct net_device *slave_dev) bond_alb_deinit_slave(bond, slave); } - if (oldcurrent == slave) + if (oldcurrent == slave) { bond_select_active_slave(bond); - if (bond->slave_cnt == 0) { - bond_set_carrier(bond); + if (!bond->curr_active_slave) { + printk(KERN_INFO DRV_NAME + ": %s: now running without any active " + "interface !\n", + bond_dev->name); + } + } + if (bond->slave_cnt == 0) { /* if the last slave was removed, zero the mac address * of the master so it will be set by the application * to the mac address of the first slave @@ -1777,8 +1724,13 @@ int bond_release(struct net_device *bond_dev, struct net_device *slave_dev) addr.sa_family = slave_dev->type; dev_set_mac_address(slave_dev, &addr); - slave_dev->priv_flags &= ~(IFF_MASTER_8023AD | IFF_MASTER_ALB | - IFF_SLAVE_INACTIVE); + /* restore the original state of the + * IFF_NOARP flag that might have been + * set by bond_set_slave_inactive_flags() + */ + if ((slave->original_flags & IFF_NOARP) == 0) { + slave_dev->flags &= ~IFF_NOARP; + } kfree(slave); @@ -1797,8 +1749,6 @@ static int bond_release_all(struct net_device *bond_dev) write_lock_bh(&bond->lock); - netif_carrier_off(bond_dev); - if (bond->slave_cnt == 0) { goto out; } @@ -1866,8 +1816,12 @@ static int bond_release_all(struct net_device *bond_dev) addr.sa_family = slave_dev->type; dev_set_mac_address(slave_dev, &addr); - slave_dev->priv_flags &= ~(IFF_MASTER_8023AD | IFF_MASTER_ALB | - IFF_SLAVE_INACTIVE); + /* restore the original state of the IFF_NOARP flag that might have + * been set by bond_set_slave_inactive_flags() + */ + if ((slave->original_flags & IFF_NOARP) == 0) { + slave_dev->flags &= ~IFF_NOARP; + } kfree(slave); @@ -2235,9 +2189,15 @@ void bond_mii_monitor(struct net_device *bond_dev) bond_select_active_slave(bond); + if (oldcurrent && !bond->curr_active_slave) { + printk(KERN_INFO DRV_NAME + ": %s: now running without any active " + "interface !\n", + bond_dev->name); + } + write_unlock(&bond->curr_slave_lock); - } else - bond_set_carrier(bond); + } re_arm: if (bond->params.miimon) { @@ -2541,6 +2501,13 @@ void bond_loadbalance_arp_mon(struct net_device *bond_dev) bond_select_active_slave(bond); + if (oldcurrent && !bond->curr_active_slave) { + printk(KERN_INFO DRV_NAME + ": %s: now running without any active " + "interface !\n", + bond_dev->name); + } + write_unlock(&bond->curr_slave_lock); } @@ -2614,15 +2581,12 @@ void bond_activebackup_arp_mon(struct net_device *bond_dev) bond->current_arp_slave = NULL; } - bond_set_carrier(bond); - if (slave == bond->curr_active_slave) { printk(KERN_INFO DRV_NAME ": %s: %s is up and now the " "active interface\n", bond_dev->name, slave->dev->name); - netif_carrier_on(bond->dev); } else { printk(KERN_INFO DRV_NAME ": %s: backup interface %s is " @@ -2882,8 +2846,7 @@ static void bond_info_show_master(struct seq_file *seq) (curr) ? curr->dev->name : "None"); } - seq_printf(seq, "MII Status: %s\n", netif_carrier_ok(bond->dev) ? - "up" : "down"); + seq_printf(seq, "MII Status: %s\n", (curr) ? "up" : "down"); seq_printf(seq, "MII Polling Interval (ms): %d\n", bond->params.miimon); seq_printf(seq, "Up Delay (ms): %d\n", bond->params.updelay * bond->params.miimon); @@ -3198,7 +3161,7 @@ static int bond_slave_netdev_event(unsigned long event, struct net_device *slave * bond_netdev_event: handle netdev notifier chain events. * * This function receives events for the netdev chain. The caller (an - * ioctl handler calling blocking_notifier_call_chain) holds the necessary + * ioctl handler calling notifier_call_chain) holds the necessary * locks for us to safely manipulate the slave devices (RTNL lock, * dev_probe_lock). */ @@ -3547,7 +3510,7 @@ static int bond_do_ioctl(struct net_device *bond_dev, struct ifreq *ifr, int cmd mii->val_out = 0; read_lock_bh(&bond->lock); read_lock(&bond->curr_slave_lock); - if (netif_carrier_ok(bond->dev)) { + if (bond->curr_active_slave) { mii->val_out = BMSR_LSTATUS; } read_unlock(&bond->curr_slave_lock); @@ -4098,17 +4061,14 @@ void bond_set_mode_ops(struct bonding *bond, int mode) bond_dev->hard_start_xmit = bond_xmit_broadcast; break; case BOND_MODE_8023AD: - bond_set_master_3ad_flags(bond); bond_dev->hard_start_xmit = bond_3ad_xmit_xor; if (bond->params.xmit_policy == BOND_XMIT_POLICY_LAYER34) bond->xmit_hash_policy = bond_xmit_hash_policy_l34; else bond->xmit_hash_policy = bond_xmit_hash_policy_l2; break; - case BOND_MODE_ALB: - bond_set_master_alb_flags(bond); - /* FALLTHRU */ case BOND_MODE_TLB: + case BOND_MODE_ALB: bond_dev->hard_start_xmit = bond_alb_xmit; bond_dev->set_mac_address = bond_alb_set_mac_address; break; @@ -4187,7 +4147,7 @@ static int bond_init(struct net_device *bond_dev, struct bond_params *params) */ bond_dev->features |= NETIF_F_VLAN_CHALLENGED; - /* don't acquire bond device's netif_tx_lock when + /* don't acquire bond device's xmit_lock when * transmitting */ bond_dev->features |= NETIF_F_LLTX; @@ -4532,8 +4492,6 @@ 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. @@ -4569,14 +4527,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; - netif_carrier_off(bond_dev); - rtnl_unlock(); /* allows sysfs registration of net device */ res = bond_create_sysfs_entry(bond_dev->priv); goto done; diff --git a/drivers/net/bonding/bond_sysfs.c b/drivers/net/bonding/bond_sysfs.c index cfe4dc3a9..041bcc583 100644 --- a/drivers/net/bonding/bond_sysfs.c +++ b/drivers/net/bonding/bond_sysfs.c @@ -20,6 +20,7 @@ * file called LICENSE. * */ +#include #include #include #include @@ -423,12 +424,6 @@ static ssize_t bonding_store_mode(struct class_device *cd, const char *buf, size ret = -EINVAL; goto out; } else { - if (bond->params.mode == BOND_MODE_8023AD) - bond_unset_master_3ad_flags(bond); - - if (bond->params.mode == BOND_MODE_ALB) - bond_unset_master_alb_flags(bond); - bond->params.mode = new_value; bond_set_mode_ops(bond, bond->params.mode); printk(KERN_INFO DRV_NAME ": %s: setting mode to %s (%d).\n", diff --git a/drivers/net/bonding/bonding.h b/drivers/net/bonding/bonding.h index 0bdfe2c71..3dd78d048 100644 --- a/drivers/net/bonding/bonding.h +++ b/drivers/net/bonding/bonding.h @@ -22,8 +22,8 @@ #include "bond_3ad.h" #include "bond_alb.h" -#define DRV_VERSION "3.0.3" -#define DRV_RELDATE "March 23, 2006" +#define DRV_VERSION "3.0.1" +#define DRV_RELDATE "January 9, 2006" #define DRV_NAME "bonding" #define DRV_DESCRIPTION "Ethernet Channel Bonding Driver" @@ -230,37 +230,14 @@ static inline struct bonding *bond_get_bond_by_slave(struct slave *slave) static inline void bond_set_slave_inactive_flags(struct slave *slave) { - struct bonding *bond = slave->dev->master->priv; - if (bond->params.mode != BOND_MODE_TLB && - bond->params.mode != BOND_MODE_ALB) - slave->state = BOND_STATE_BACKUP; - slave->dev->priv_flags |= IFF_SLAVE_INACTIVE; + slave->state = BOND_STATE_BACKUP; + slave->dev->flags |= IFF_NOARP; } static inline void bond_set_slave_active_flags(struct slave *slave) { slave->state = BOND_STATE_ACTIVE; - slave->dev->priv_flags &= ~IFF_SLAVE_INACTIVE; -} - -static inline void bond_set_master_3ad_flags(struct bonding *bond) -{ - bond->dev->priv_flags |= IFF_MASTER_8023AD; -} - -static inline void bond_unset_master_3ad_flags(struct bonding *bond) -{ - bond->dev->priv_flags &= ~IFF_MASTER_8023AD; -} - -static inline void bond_set_master_alb_flags(struct bonding *bond) -{ - bond->dev->priv_flags |= IFF_MASTER_ALB; -} - -static inline void bond_unset_master_alb_flags(struct bonding *bond) -{ - bond->dev->priv_flags &= ~IFF_MASTER_ALB; + slave->dev->flags &= ~IFF_NOARP; } struct vlan_entry *bond_next_vlan(struct bonding *bond, struct vlan_entry *curr); diff --git a/drivers/net/cassini.c b/drivers/net/cassini.c index a31544ccb..6e295fce5 100644 --- a/drivers/net/cassini.c +++ b/drivers/net/cassini.c @@ -66,6 +66,7 @@ * by default, the selective clear mask is set up to process rx packets. */ +#include #include #include @@ -90,7 +91,6 @@ #include #include #include -#include #include @@ -191,15 +191,12 @@ static char version[] __devinitdata = DRV_MODULE_NAME ".c:v" DRV_MODULE_VERSION " (" DRV_MODULE_RELDATE ")\n"; -static int cassini_debug = -1; /* -1 == use CAS_DEF_MSG_ENABLE as value */ -static int link_mode; - MODULE_AUTHOR("Adrian Sun (asun@darksunrising.com)"); MODULE_DESCRIPTION("Sun Cassini(+) ethernet driver"); MODULE_LICENSE("GPL"); -module_param(cassini_debug, int, 0); +MODULE_PARM(cassini_debug, "i"); MODULE_PARM_DESC(cassini_debug, "Cassini bitmapped debugging message enable value"); -module_param(link_mode, int, 0); +MODULE_PARM(link_mode, "i"); MODULE_PARM_DESC(link_mode, "default link mode"); /* @@ -211,7 +208,7 @@ MODULE_PARM_DESC(link_mode, "default link mode"); * Value in seconds, for user input. */ static int linkdown_timeout = DEFAULT_LINKDOWN_TIMEOUT; -module_param(linkdown_timeout, int, 0); +MODULE_PARM(linkdown_timeout, "i"); MODULE_PARM_DESC(linkdown_timeout, "min reset interval in sec. for PCS linkdown issue; disabled if not positive"); @@ -223,6 +220,8 @@ MODULE_PARM_DESC(linkdown_timeout, static int link_transition_timeout; +static int cassini_debug = -1; /* -1 == use CAS_DEF_MSG_ENABLE as value */ +static int link_mode; static u16 link_modes[] __devinitdata = { BMCR_ANENABLE, /* 0 : autoneg */ @@ -2914,7 +2913,8 @@ static int cas_start_xmit(struct sk_buff *skb, struct net_device *dev) */ static int ring; - if (skb_padto(skb, cp->min_frame_size)) + skb = skb_padto(skb, cp->min_frame_size); + if (!skb) return 0; /* XXX: we need some higher-level QoS hooks to steer packets to @@ -3892,7 +3892,7 @@ static void cas_reset(struct cas *cp, int blkflag) spin_unlock(&cp->stat_lock[N_TX_RINGS]); } -/* Shut down the chip, must be called with pm_mutex held. */ +/* Shut down the chip, must be called with pm_sem held. */ static void cas_shutdown(struct cas *cp) { unsigned long flags; @@ -4311,11 +4311,11 @@ static int cas_open(struct net_device *dev) int hw_was_up, err; unsigned long flags; - mutex_lock(&cp->pm_mutex); + down(&cp->pm_sem); hw_was_up = cp->hw_running; - /* The power-management mutex protects the hw_running + /* The power-management semaphore protects the hw_running * etc. state so it is safe to do this bit without cp->lock */ if (!cp->hw_running) { @@ -4349,7 +4349,7 @@ static int cas_open(struct net_device *dev) * mapping to expose them */ if (request_irq(cp->pdev->irq, cas_interrupt, - IRQF_SHARED, dev->name, (void *) dev)) { + SA_SHIRQ, dev->name, (void *) dev)) { printk(KERN_ERR "%s: failed to request irq !\n", cp->dev->name); err = -EAGAIN; @@ -4364,7 +4364,7 @@ static int cas_open(struct net_device *dev) cas_unlock_all_restore(cp, flags); netif_start_queue(dev); - mutex_unlock(&cp->pm_mutex); + up(&cp->pm_sem); return 0; err_spare: @@ -4372,7 +4372,7 @@ err_spare: cas_free_rxds(cp); err_tx_tiny: cas_tx_tiny_free(cp); - mutex_unlock(&cp->pm_mutex); + up(&cp->pm_sem); return err; } @@ -4382,7 +4382,7 @@ static int cas_close(struct net_device *dev) struct cas *cp = netdev_priv(dev); /* Make sure we don't get distracted by suspend/resume */ - mutex_lock(&cp->pm_mutex); + down(&cp->pm_sem); netif_stop_queue(dev); @@ -4399,7 +4399,7 @@ static int cas_close(struct net_device *dev) cas_spare_free(cp); cas_free_rxds(cp); cas_tx_tiny_free(cp); - mutex_unlock(&cp->pm_mutex); + up(&cp->pm_sem); return 0; } @@ -4834,10 +4834,10 @@ static int cas_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) unsigned long flags; int rc = -EOPNOTSUPP; - /* Hold the PM mutex while doing ioctl's or we may collide + /* Hold the PM semaphore while doing ioctl's or we may collide * with open/close and power management and oops. */ - mutex_lock(&cp->pm_mutex); + down(&cp->pm_sem); switch (cmd) { case SIOCGMIIPHY: /* Get address of MII PHY in use. */ data->phy_id = cp->phy_addr; @@ -4867,7 +4867,7 @@ static int cas_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) break; }; - mutex_unlock(&cp->pm_mutex); + up(&cp->pm_sem); return rc; } @@ -4875,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_len; + unsigned long casreg_base, casreg_len; struct net_device *dev; struct cas *cp; int i, err, pci_using_dac; @@ -4887,12 +4887,13 @@ static int __devinit cas_init_one(struct pci_dev *pdev, err = pci_enable_device(pdev); if (err) { - dev_err(&pdev->dev, "Cannot enable PCI device, aborting.\n"); + printk(KERN_ERR PFX "Cannot enable PCI device, " + "aborting.\n"); return err; } if (!(pci_resource_flags(pdev, 0) & IORESOURCE_MEM)) { - dev_err(&pdev->dev, "Cannot find proper PCI device " + printk(KERN_ERR PFX "Cannot find proper PCI device " "base address, aborting.\n"); err = -ENODEV; goto err_out_disable_pdev; @@ -4900,7 +4901,7 @@ static int __devinit cas_init_one(struct pci_dev *pdev, dev = alloc_etherdev(sizeof(*cp)); if (!dev) { - dev_err(&pdev->dev, "Etherdev alloc failed, aborting.\n"); + printk(KERN_ERR PFX "Etherdev alloc failed, aborting.\n"); err = -ENOMEM; goto err_out_disable_pdev; } @@ -4909,7 +4910,8 @@ static int __devinit cas_init_one(struct pci_dev *pdev, err = pci_request_regions(pdev, dev->name); if (err) { - dev_err(&pdev->dev, "Cannot obtain PCI resources, aborting.\n"); + printk(KERN_ERR PFX "Cannot obtain PCI resources, " + "aborting.\n"); goto err_out_free_netdev; } pci_set_master(pdev); @@ -4939,7 +4941,7 @@ static int __devinit cas_init_one(struct pci_dev *pdev, if (pci_write_config_byte(pdev, PCI_CACHE_LINE_SIZE, cas_cacheline_size)) { - dev_err(&pdev->dev, "Could not set PCI cache " + printk(KERN_ERR PFX "Could not set PCI cache " "line size\n"); goto err_write_cacheline; } @@ -4953,7 +4955,7 @@ static int __devinit cas_init_one(struct pci_dev *pdev, err = pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK); if (err < 0) { - dev_err(&pdev->dev, "Unable to obtain 64-bit DMA " + printk(KERN_ERR PFX "Unable to obtain 64-bit DMA " "for consistent allocations\n"); goto err_out_free_res; } @@ -4961,13 +4963,14 @@ static int __devinit cas_init_one(struct pci_dev *pdev, } else { err = pci_set_dma_mask(pdev, DMA_32BIT_MASK); if (err) { - dev_err(&pdev->dev, "No usable DMA configuration, " + printk(KERN_ERR PFX "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); @@ -4991,7 +4994,7 @@ static int __devinit cas_init_one(struct pci_dev *pdev, spin_lock_init(&cp->tx_lock[i]); } spin_lock_init(&cp->stat_lock[N_TX_RINGS]); - mutex_init(&cp->pm_mutex); + init_MUTEX(&cp->pm_sem); init_timer(&cp->link_timer); cp->link_timer.function = cas_link_timer; @@ -5019,9 +5022,10 @@ static int __devinit cas_init_one(struct pci_dev *pdev, cp->timer_ticks = 0; /* give us access to cassini registers */ - cp->regs = pci_iomap(pdev, 0, casreg_len); + cp->regs = ioremap(casreg_base, casreg_len); if (cp->regs == 0UL) { - dev_err(&pdev->dev, "Cannot map device registers, aborting.\n"); + printk(KERN_ERR PFX "Cannot map device registers, " + "aborting.\n"); goto err_out_free_res; } cp->casreg_len = casreg_len; @@ -5037,7 +5041,8 @@ 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) { - dev_err(&pdev->dev, "Cannot allocate init block, aborting.\n"); + printk(KERN_ERR PFX "Cannot allocate init block, " + "aborting.\n"); goto err_out_iounmap; } @@ -5081,7 +5086,8 @@ static int __devinit cas_init_one(struct pci_dev *pdev, dev->features |= NETIF_F_HIGHDMA; if (register_netdev(dev)) { - dev_err(&pdev->dev, "Cannot register net device, aborting.\n"); + printk(KERN_ERR PFX "Cannot register net device, " + "aborting.\n"); goto err_out_free_consistent; } @@ -5110,12 +5116,12 @@ err_out_free_consistent: cp->init_block, cp->block_dvma); err_out_iounmap: - mutex_lock(&cp->pm_mutex); + down(&cp->pm_sem); if (cp->hw_running) cas_shutdown(cp); - mutex_unlock(&cp->pm_mutex); + up(&cp->pm_sem); - pci_iounmap(pdev, cp->regs); + iounmap(cp->regs); err_out_free_res: @@ -5146,11 +5152,11 @@ static void __devexit cas_remove_one(struct pci_dev *pdev) cp = netdev_priv(dev); unregister_netdev(dev); - mutex_lock(&cp->pm_mutex); + down(&cp->pm_sem); flush_scheduled_work(); if (cp->hw_running) cas_shutdown(cp); - mutex_unlock(&cp->pm_mutex); + up(&cp->pm_sem); #if 1 if (cp->orig_cacheline_size) { @@ -5163,7 +5169,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); - pci_iounmap(pdev, cp->regs); + iounmap(cp->regs); free_netdev(dev); pci_release_regions(pdev); pci_disable_device(pdev); @@ -5177,7 +5183,10 @@ static int cas_suspend(struct pci_dev *pdev, pm_message_t state) struct cas *cp = netdev_priv(dev); unsigned long flags; - mutex_lock(&cp->pm_mutex); + /* We hold the PM semaphore during entire driver + * sleep time + */ + down(&cp->pm_sem); /* If the driver is opened, we stop the DMA */ if (cp->opened) { @@ -5197,7 +5206,6 @@ static int cas_suspend(struct pci_dev *pdev, pm_message_t state) if (cp->hw_running) cas_shutdown(cp); - mutex_unlock(&cp->pm_mutex); return 0; } @@ -5209,7 +5217,6 @@ static int cas_resume(struct pci_dev *pdev) printk(KERN_INFO "%s: resuming\n", dev->name); - mutex_lock(&cp->pm_mutex); cas_hard_reset(cp); if (cp->opened) { unsigned long flags; @@ -5222,7 +5229,7 @@ static int cas_resume(struct pci_dev *pdev) netif_device_attach(dev); } - mutex_unlock(&cp->pm_mutex); + up(&cp->pm_sem); return 0; } #endif /* CONFIG_PM */ diff --git a/drivers/net/cassini.h b/drivers/net/cassini.h index ab55c7ee1..88063ef16 100644 --- a/drivers/net/cassini.h +++ b/drivers/net/cassini.h @@ -4284,7 +4284,7 @@ struct cas { * (ie. not power managed) */ int hw_running; int opened; - struct mutex pm_mutex; /* open/close/suspend/resume */ + struct semaphore pm_sem; /* open/close/suspend/resume */ struct cas_init_block *init_block; struct cas_tx_desc *init_txds[MAX_TX_RINGS]; diff --git a/drivers/net/chelsio/Makefile b/drivers/net/chelsio/Makefile index 54c78d94f..91e927827 100644 --- a/drivers/net/chelsio/Makefile +++ b/drivers/net/chelsio/Makefile @@ -4,7 +4,7 @@ obj-$(CONFIG_CHELSIO_T1) += cxgb.o -EXTRA_CFLAGS += -Idrivers/net/chelsio $(DEBUG_FLAGS) +EXTRA_CFLAGS += -I$(TOPDIR)/drivers/net/chelsio $(DEBUG_FLAGS) cxgb-objs := cxgb2.o espi.o pm3393.o sge.o subr.o mv88x201x.o diff --git a/drivers/net/chelsio/common.h b/drivers/net/chelsio/common.h index 5d9dd1442..bf3e7b6a7 100644 --- a/drivers/net/chelsio/common.h +++ b/drivers/net/chelsio/common.h @@ -39,6 +39,7 @@ #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 e67872433..349ebe783 100644 --- a/drivers/net/chelsio/cxgb2.c +++ b/drivers/net/chelsio/cxgb2.c @@ -37,6 +37,7 @@ ****************************************************************************/ #include "common.h" +#include #include #include #include @@ -123,7 +124,7 @@ MODULE_LICENSE("GPL"); static int dflt_msg_enable = DFLT_MSG_ENABLE; -module_param(dflt_msg_enable, int, 0); +MODULE_PARM(dflt_msg_enable, "i"); MODULE_PARM_DESC(dflt_msg_enable, "Chelsio T1 message enable bitmap"); @@ -218,7 +219,7 @@ static int cxgb_up(struct adapter *adapter) t1_interrupts_clear(adapter); if ((err = request_irq(adapter->pdev->irq, - t1_select_intr_handler(adapter), IRQF_SHARED, + t1_select_intr_handler(adapter), SA_SHIRQ, adapter->name, adapter))) { goto out_err; } diff --git a/drivers/net/chelsio/espi.c b/drivers/net/chelsio/espi.c index 542e5e065..e824acaf1 100644 --- a/drivers/net/chelsio/espi.c +++ b/drivers/net/chelsio/espi.c @@ -87,9 +87,15 @@ static int tricn_write(adapter_t *adapter, int bundle_addr, int module_addr, static int tricn_init(adapter_t *adapter) { int i = 0; + int sme = 1; int stat = 0; int timeout = 0; int is_ready = 0; + int dynamic_deskew = 0; + + if (dynamic_deskew) + sme = 0; + /* 1 */ timeout=1000; @@ -107,9 +113,11 @@ static int tricn_init(adapter_t *adapter) } /* 2 */ - tricn_write(adapter, 0, 0, 0, TRICN_CNFG, 0x81); - tricn_write(adapter, 0, 1, 0, TRICN_CNFG, 0x81); - tricn_write(adapter, 0, 2, 0, TRICN_CNFG, 0x81); + if (sme) { + tricn_write(adapter, 0, 0, 0, TRICN_CNFG, 0x81); + tricn_write(adapter, 0, 1, 0, TRICN_CNFG, 0x81); + tricn_write(adapter, 0, 2, 0, TRICN_CNFG, 0x81); + } for (i=1; i<= 8; i++) tricn_write(adapter, 0, 0, i, TRICN_CNFG, 0xf1); for (i=1; i<= 2; i++) tricn_write(adapter, 0, 1, i, TRICN_CNFG, 0xf1); for (i=1; i<= 3; i++) tricn_write(adapter, 0, 2, i, TRICN_CNFG, 0xe1); diff --git a/drivers/net/chelsio/sge.c b/drivers/net/chelsio/sge.c index 61b3754f5..30ff8ea1a 100644 --- a/drivers/net/chelsio/sge.c +++ b/drivers/net/chelsio/sge.c @@ -39,6 +39,7 @@ #include "common.h" +#include #include #include #include @@ -1092,7 +1093,8 @@ static int process_responses(struct adapter *adapter, int budget) if (likely(e->DataValid)) { struct freelQ *fl = &sge->freelQ[e->FreelistQid]; - BUG_ON(!e->Sop || !e->Eop); + if (unlikely(!e->Sop || !e->Eop)) + BUG(); if (unlikely(e->Offload)) unexpected_offload(adapter, fl); else @@ -1417,7 +1419,7 @@ int t1_start_xmit(struct sk_buff *skb, struct net_device *dev) struct cpl_tx_pkt *cpl; #ifdef NETIF_F_TSO - if (skb_is_gso(skb)) { + if (skb_shinfo(skb)->tso_size) { int eth_type; struct cpl_tx_pkt_lso *hdr; @@ -1432,7 +1434,7 @@ int t1_start_xmit(struct sk_buff *skb, struct net_device *dev) hdr->ip_hdr_words = skb->nh.iph->ihl; hdr->tcp_hdr_words = skb->h.th->doff; hdr->eth_type_mss = htons(MK_ETH_TYPE_MSS(eth_type, - skb_shinfo(skb)->gso_size)); + skb_shinfo(skb)->tso_size)); hdr->len = htonl(skb->len - sizeof(*hdr)); cpl = (struct cpl_tx_pkt *)hdr; sge->stats.tx_lso_pkts++; diff --git a/drivers/net/chelsio/subr.c b/drivers/net/chelsio/subr.c index 12e4e96db..1ebb5d149 100644 --- a/drivers/net/chelsio/subr.c +++ b/drivers/net/chelsio/subr.c @@ -686,7 +686,7 @@ int t1_init_hw_modules(adapter_t *adapter) */ static void __devinit get_pci_mode(adapter_t *adapter, struct chelsio_pci_params *p) { - static const unsigned short speed_map[] = { 33, 66, 100, 133 }; + static unsigned short speed_map[] = { 33, 66, 100, 133 }; u32 pci_mode; pci_read_config_dword(adapter->pdev, A_PCICFG_MODE, &pci_mode); diff --git a/drivers/net/cris/eth_v10.c b/drivers/net/cris/eth_v10.c index 0eb1f8787..64105e4ea 100644 --- a/drivers/net/cris/eth_v10.c +++ b/drivers/net/cris/eth_v10.c @@ -218,6 +218,7 @@ * */ +#include #include @@ -671,7 +672,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, - IRQF_SAMPLE_RANDOM, cardname, (void *)dev)) { + SA_SAMPLE_RANDOM, cardname, (void *)dev)) { goto grace_exit0; } diff --git a/drivers/net/cs89x0.c b/drivers/net/cs89x0.c index 2dcca79b1..ef54ebeb2 100644 --- a/drivers/net/cs89x0.c +++ b/drivers/net/cs89x0.c @@ -100,6 +100,7 @@ /* Always include 'config.h' first in case the user wants to turn on or override something. */ +#include #include /* @@ -1905,7 +1906,8 @@ MODULE_LICENSE("GPL"); */ -int __init init_module(void) +int +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 968fe11a0..bd954aaa6 100644 --- a/drivers/net/cs89x0.h +++ b/drivers/net/cs89x0.h @@ -14,6 +14,7 @@ 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 6ad579612..f130bdab3 100644 --- a/drivers/net/declance.c +++ b/drivers/net/declance.c @@ -42,6 +42,7 @@ * bits. macro */ +#include #include #include #include @@ -703,8 +704,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); @@ -884,7 +885,8 @@ static int lance_start_xmit(struct sk_buff *skb, struct net_device *dev) len = skblen; if (len < ETH_ZLEN) { - if (skb_padto(skb, ETH_ZLEN)) + skb = skb_padto(skb, ETH_ZLEN); + if (skb == NULL) return 0; len = ETH_ZLEN; } @@ -1253,7 +1255,7 @@ static int __init dec_lance_init(const int type, const int slot) return 0; err_out_free_dev: - free_netdev(dev); + kfree(dev); err_out: return ret; @@ -1299,7 +1301,6 @@ 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 91cc8cbdd..5acd35c31 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, IRQF_SHARED, dev->name, dev); + ret = request_irq(dev->irq, dfx_interrupt, SA_SHIRQ, 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 b1cbe9924..03804cc38 100644 --- a/drivers/net/depca.c +++ b/drivers/net/depca.c @@ -235,6 +235,7 @@ ========================================================================= */ +#include #include #include #include @@ -937,8 +938,11 @@ static int depca_start_xmit(struct sk_buff *skb, struct net_device *dev) if (skb->len < 1) goto out; - if (skb_padto(skb, ETH_ZLEN)) - goto out; + if (skb->len < ETH_ZLEN) { + skb = skb_padto(skb, ETH_ZLEN); + if (skb == NULL) + goto out; + } netif_stop_queue(dev); @@ -1408,7 +1412,7 @@ static int __init depca_mca_probe(struct device *device) irq = 11; break; default: - printk("%s: mca_probe IRQ error. You should never get here (%d).\n", mdev->name, where); + printk("%s: mca_probe IRQ error. You should never get here (%d).\n", dev->name, where); return -EINVAL; } diff --git a/drivers/net/dgrs.c b/drivers/net/dgrs.c index fa4f09432..70b47e4c4 100644 --- a/drivers/net/dgrs.c +++ b/drivers/net/dgrs.c @@ -993,7 +993,7 @@ dgrs_download(struct net_device *dev0) int is; unsigned long i; - static const int iv2is[16] = { + static int iv2is[16] = { 0, 0, 0, ES4H_IS_INT3, 0, ES4H_IS_INT5, 0, ES4H_IS_INT7, 0, 0, ES4H_IS_INT10, ES4H_IS_INT11, @@ -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, IRQF_SHARED, "RightSwitch", dev); + rc = request_irq(dev->irq, &dgrs_intr, SA_SHIRQ, "RightSwitch", dev); if (rc) goto err_out; @@ -1551,7 +1551,7 @@ MODULE_PARM_DESC(nicmode, "Digi RightSwitch operating mode (1: switch, 2: multi- static int __init dgrs_init_module (void) { int i; - int err; + int cardcount = 0; /* * Command line variable overrides @@ -1593,13 +1593,13 @@ static int __init dgrs_init_module (void) * Find and configure all the cards */ #ifdef CONFIG_EISA - err = eisa_driver_register(&dgrs_eisa_driver); - if (err) - return err; + cardcount = eisa_driver_register(&dgrs_eisa_driver); + if (cardcount < 0) + return cardcount; #endif - err = pci_register_driver(&dgrs_pci_driver); - if (err) - return err; + cardcount = pci_register_driver(&dgrs_pci_driver); + if (cardcount) + return cardcount; return 0; } diff --git a/drivers/net/dgrs_firmware.c b/drivers/net/dgrs_firmware.c index 8c20d4c99..1e49e1e1f 100644 --- a/drivers/net/dgrs_firmware.c +++ b/drivers/net/dgrs_firmware.c @@ -1,4 +1,4 @@ -static const int dgrs_firmnum = 550; +static int dgrs_firmnum = 550; static char dgrs_firmver[] = "$Version$"; static char dgrs_firmdate[] = "11/16/96 03:45:15"; static unsigned char dgrs_code[] __initdata = { @@ -9963,4 +9963,4 @@ static unsigned char dgrs_code[] __initdata = { 109,46,99,0,114,99,0,0,48,120,0,0, 0,0,0,0,0,0,0,0,0,0,0,0 } ; -static const int dgrs_ncode = 119520 ; +static int dgrs_ncode = 119520 ; diff --git a/drivers/net/dl2k.c b/drivers/net/dl2k.c index 402961e68..fb9dae302 100644 --- a/drivers/net/dl2k.c +++ b/drivers/net/dl2k.c @@ -9,12 +9,50 @@ 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.18" -#define DRV_RELDATE "2006/06/27" +#define DRV_VERSION "v1.17b" +#define DRV_RELDATE "2006/03/10" #include "dl2k.h" -#include static char version[] __devinitdata = KERN_INFO DRV_NAME " " DRV_VERSION " " DRV_RELDATE "\n"; @@ -52,8 +90,8 @@ module_param(tx_coalesce, int, 0); /* HW xmit count each TxDMAComplete */ #define EnableInt() \ writew(DEFAULT_INTR, ioaddr + IntEnable) -static const int max_intrloop = 50; -static const int multicast_filter_limit = 0x40; +static int max_intrloop = 50; +static int multicast_filter_limit = 0x40; static int rio_open (struct net_device *dev); static void rio_timer (unsigned long data); @@ -351,7 +389,7 @@ parse_eeprom (struct net_device *dev) for (i = 0; i < 6; i++) dev->dev_addr[i] = psrom->mac_addr[i]; - /* Parse Software Information Block */ + /* Parse Software Infomation Block */ i = 0x30; psib = (u8 *) sromdata; do { @@ -401,7 +439,7 @@ rio_open (struct net_device *dev) int i; u16 macctrl; - i = request_irq (dev->irq, &rio_interrupt, IRQF_SHARED, dev->name, dev); + i = request_irq (dev->irq, &rio_interrupt, SA_SHIRQ, dev->name, dev); if (i) return i; @@ -727,7 +765,7 @@ rio_free_tx (struct net_device *dev, int irq) break; skb = np->tx_skbuff[entry]; pci_unmap_single (np->pdev, - np->tx_ring[entry].fraginfo & DMA_48BIT_MASK, + np->tx_ring[entry].fraginfo & 0xffffffffffff, skb->len, PCI_DMA_TODEVICE); if (irq) dev_kfree_skb_irq (skb); @@ -855,7 +893,7 @@ receive_packet (struct net_device *dev) /* Small skbuffs for short packets */ if (pkt_len > copy_thresh) { pci_unmap_single (np->pdev, - desc->fraginfo & DMA_48BIT_MASK, + desc->fraginfo & 0xffffffffffff, np->rx_buf_sz, PCI_DMA_FROMDEVICE); skb_put (skb = np->rx_skbuff[entry], pkt_len); @@ -863,7 +901,7 @@ receive_packet (struct net_device *dev) } else if ((skb = dev_alloc_skb (pkt_len + 2)) != NULL) { pci_dma_sync_single_for_cpu(np->pdev, desc->fraginfo & - DMA_48BIT_MASK, + 0xffffffffffff, np->rx_buf_sz, PCI_DMA_FROMDEVICE); skb->dev = dev; @@ -875,7 +913,7 @@ receive_packet (struct net_device *dev) skb_put (skb, pkt_len); pci_dma_sync_single_for_device(np->pdev, desc->fraginfo & - DMA_48BIT_MASK, + 0xffffffffffff, np->rx_buf_sz, PCI_DMA_FROMDEVICE); } @@ -1762,7 +1800,7 @@ rio_close (struct net_device *dev) skb = np->rx_skbuff[i]; if (skb) { pci_unmap_single(np->pdev, - np->rx_ring[i].fraginfo & DMA_48BIT_MASK, + np->rx_ring[i].fraginfo & 0xffffffffffff, skb->len, PCI_DMA_FROMDEVICE); dev_kfree_skb (skb); np->rx_skbuff[i] = NULL; @@ -1772,7 +1810,7 @@ rio_close (struct net_device *dev) skb = np->tx_skbuff[i]; if (skb) { pci_unmap_single(np->pdev, - np->tx_ring[i].fraginfo & DMA_48BIT_MASK, + np->tx_ring[i].fraginfo & 0xffffffffffff, skb->len, PCI_DMA_TODEVICE); dev_kfree_skb (skb); np->tx_skbuff[i] = NULL; diff --git a/drivers/net/dl2k.h b/drivers/net/dl2k.h index 53449207e..6e75482d7 100644 --- a/drivers/net/dl2k.h +++ b/drivers/net/dl2k.h @@ -683,6 +683,11 @@ 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) @@ -690,10 +695,9 @@ struct netdev_private { class_mask of the class are honored during the comparison. driver_data Data private to the driver. */ - -static const struct pci_device_id rio_pci_tbl[] = { - {0x1186, 0x4000, PCI_ANY_ID, PCI_ANY_ID, }, - { } +static struct pci_device_id rio_pci_tbl[] = { + {0x1186, 0x4000, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, + {0,} }; 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 a860ebbbf..24996da4c 100644 --- a/drivers/net/dm9000.c +++ b/drivers/net/dm9000.c @@ -339,17 +339,6 @@ 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 * @@ -377,8 +366,8 @@ dm9000_release_board(struct platform_device *pdev, struct board_info *db) kfree(db->data_req); } - if (db->addr_req != NULL) { - release_resource(db->addr_req); + if (db->addr_res != NULL) { + release_resource(db->addr_res); kfree(db->addr_req); } } @@ -421,7 +410,10 @@ dm9000_probe(struct platform_device *pdev) if (pdev->num_resources < 2) { ret = -ENODEV; goto out; - } else if (pdev->num_resources == 2) { + } + + switch (pdev->num_resources) { + case 2: base = pdev->resource[0].start; if (!request_mem_region(base, 4, ndev->name)) { @@ -431,16 +423,17 @@ dm9000_probe(struct platform_device *pdev) ndev->base_addr = base; ndev->irq = pdev->resource[1].start; - db->io_addr = (void __iomem *)base; - db->io_data = (void __iomem *)(base + 4); + db->io_addr = (void *)base; + db->io_data = (void *)(base + 4); - } else { + break; + + case 3: db->addr_res = platform_get_resource(pdev, IORESOURCE_MEM, 0); db->data_res = platform_get_resource(pdev, IORESOURCE_MEM, 1); db->irq_res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); - if (db->addr_res == NULL || db->data_res == NULL || - db->irq_res == NULL) { + if (db->addr_res == NULL || db->data_res == NULL) { printk(KERN_ERR PFX "insufficient resources\n"); ret = -ENOENT; goto out; @@ -489,6 +482,7 @@ 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 */ @@ -549,9 +543,6 @@ 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); @@ -573,13 +564,6 @@ 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); @@ -617,7 +601,7 @@ dm9000_open(struct net_device *dev) PRINTK2("entering dm9000_open\n"); - if (request_irq(dev->irq, &dm9000_interrupt, IRQF_SHARED, dev->name, dev)) + if (request_irq(dev->irq, &dm9000_interrupt, SA_SHIRQ, dev->name, dev)) return -EAGAIN; /* Initialize DM9000 board */ @@ -679,6 +663,7 @@ 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); } /* @@ -782,7 +767,7 @@ dm9000_stop(struct net_device *ndev) * receive the packet to upper layer, free the transmitted packet */ -static void +void dm9000_tx_done(struct net_device *dev, board_info_t * db) { int tx_status = ior(db, DM9000_NSR); /* Got TX status */ @@ -1202,14 +1187,13 @@ 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 2146cf744..dd8c15ac5 100644 --- a/drivers/net/dummy.c +++ b/drivers/net/dummy.c @@ -28,6 +28,7 @@ Alan Cox, 30th May 1994 */ +#include #include #include #include @@ -132,7 +133,6 @@ 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 ce850f107..f57a85fed 100644 --- a/drivers/net/e100.c +++ b/drivers/net/e100.c @@ -138,6 +138,7 @@ * - Stratus87247: protect MDI control register manipulations */ +#include #include #include #include @@ -173,11 +174,8 @@ 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, \ @@ -600,8 +598,8 @@ static void e100_enable_irq(struct nic *nic) spin_lock_irqsave(&nic->cmd_lock, flags); writeb(irq_mask_none, &nic->csr->scb.cmd_hi); - e100_write_flush(nic); spin_unlock_irqrestore(&nic->cmd_lock, flags); + e100_write_flush(nic); } static void e100_disable_irq(struct nic *nic) @@ -610,8 +608,8 @@ static void e100_disable_irq(struct nic *nic) spin_lock_irqsave(&nic->cmd_lock, flags); writeb(irq_mask_all, &nic->csr->scb.cmd_hi); - e100_write_flush(nic); spin_unlock_irqrestore(&nic->cmd_lock, flags); + e100_write_flush(nic); } static void e100_hw_reset(struct nic *nic) @@ -759,8 +757,7 @@ 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"); - if (!eeprom_bad_csum_allow) - return -EAGAIN; + return -EAGAIN; } return 0; @@ -1585,8 +1582,8 @@ static void e100_watchdog(unsigned long data) * interrupt mask bit and the SW Interrupt generation bit */ spin_lock_irq(&nic->cmd_lock); writeb(readb(&nic->csr->scb.cmd_hi) | irq_sw_gen,&nic->csr->scb.cmd_hi); - e100_write_flush(nic); spin_unlock_irq(&nic->cmd_lock); + e100_write_flush(nic); e100_update_stats(nic); e100_adjust_adaptive_ifs(nic, cmd.speed, cmd.duplex); @@ -2067,7 +2064,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, IRQF_SHARED, + if((err = request_irq(nic->pdev->irq, e100_intr, SA_SHIRQ, nic->netdev->name, nic->netdev))) goto err_no_irq; netif_wake_queue(nic->netdev); @@ -2681,9 +2678,9 @@ static int __devinit e100_probe(struct pci_dev *pdev, goto err_out_free; } - DPRINTK(PROBE, INFO, "addr 0x%llx, irq %d, " + DPRINTK(PROBE, INFO, "addr 0x%lx, irq %d, " "MAC addr %02X:%02X:%02X:%02X:%02X:%02X\n", - (unsigned long long)pci_resource_start(pdev, 0), pdev->irq, + 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]); @@ -2783,80 +2780,6 @@ 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, @@ -2868,7 +2791,6 @@ 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 5dea2b7de..ca9f89552 100644 --- a/drivers/net/e1000/Makefile +++ b/drivers/net/e1000/Makefile @@ -1,7 +1,7 @@ ################################################################################ # # -# Copyright(c) 1999 - 2006 Intel Corporation. All rights reserved. +# Copyright(c) 1999 - 2003 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,7 +22,6 @@ # # 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 d304297c4..99baf0e09 100644 --- a/drivers/net/e1000/e1000.h +++ b/drivers/net/e1000/e1000.h @@ -1,7 +1,7 @@ /******************************************************************************* - Copyright(c) 1999 - 2006 Intel Corporation. All rights reserved. + Copyright(c) 1999 - 2005 Intel Corporation. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free @@ -22,7 +22,6 @@ Contact Information: Linux NICS - e1000-devel Mailing List Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 *******************************************************************************/ @@ -34,6 +33,7 @@ #define _E1000_H_ #include +#include #include #include #include @@ -68,6 +68,7 @@ #ifdef NETIF_F_TSO #include #endif +#include #include #include #include @@ -82,6 +83,10 @@ struct e1000_adapter; #include "e1000_hw.h" +#ifdef CONFIG_E1000_MQ +#include +#include +#endif #ifdef DBG #define E1000_DBG(args...) printk(KERN_DEBUG "e1000: " args) @@ -110,14 +115,9 @@ 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 @@ -145,7 +145,6 @@ 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 @@ -170,6 +169,12 @@ struct e1000_buffer { uint16_t next_to_watch; }; +#ifdef CONFIG_E1000_MQ +struct e1000_queue_stats { + uint64_t packets; + uint64_t bytes; +}; +#endif struct e1000_ps_page { struct page *ps_page[PS_PAGE_BUFFERS]; }; struct e1000_ps_page_dma { uint64_t ps_page_dma[PS_PAGE_BUFFERS]; }; @@ -193,7 +198,12 @@ struct e1000_tx_ring { spinlock_t tx_lock; uint16_t tdh; uint16_t tdt; + boolean_t last_tx_tso; + +#ifdef CONFIG_E1000_MQ + struct e1000_queue_stats tx_stats; +#endif }; struct e1000_rx_ring { @@ -220,6 +230,9 @@ struct e1000_rx_ring { uint16_t rdh; uint16_t rdt; +#ifdef CONFIG_E1000_MQ + struct e1000_queue_stats rx_stats; +#endif }; #define E1000_DESC_UNUSED(R) \ @@ -247,7 +260,6 @@ struct e1000_adapter { uint32_t rx_buffer_len; uint32_t part_num; uint32_t wol; - uint32_t ksp3_port_a; uint32_t smartspeed; uint32_t en_mng_pt; uint16_t link_speed; @@ -257,7 +269,8 @@ struct e1000_adapter { spinlock_t tx_queue_lock; #endif atomic_t irq_sem; - struct work_struct reset_task; + struct work_struct tx_timeout_task; + struct work_struct watchdog_task; uint8_t fc_autoneg; struct timer_list blink_timer; @@ -265,6 +278,9 @@ struct e1000_adapter { /* TX */ struct e1000_tx_ring *tx_ring; /* One per active queue */ +#ifdef CONFIG_E1000_MQ + struct e1000_tx_ring **cpu_tx_ring; /* per-cpu */ +#endif unsigned long tx_queue_len; uint32_t txd_cmd; uint32_t tx_int_delay; @@ -285,18 +301,23 @@ struct e1000_adapter { /* RX */ #ifdef CONFIG_E1000_NAPI boolean_t (*clean_rx) (struct e1000_adapter *adapter, - struct e1000_rx_ring *rx_ring, - int *work_done, int work_to_do); + struct e1000_rx_ring *rx_ring, + int *work_done, int work_to_do); #else boolean_t (*clean_rx) (struct e1000_adapter *adapter, - struct e1000_rx_ring *rx_ring); + struct e1000_rx_ring *rx_ring); #endif void (*alloc_rx_buf) (struct e1000_adapter *adapter, - struct e1000_rx_ring *rx_ring, - int cleaned_count); + struct e1000_rx_ring *rx_ring, + int cleaned_count); struct e1000_rx_ring *rx_ring; /* One per active queue */ #ifdef CONFIG_E1000_NAPI struct net_device *polling_netdev; /* One per active queue */ +#endif +#ifdef CONFIG_E1000_MQ + struct net_device **cpu_netdev; /* per-cpu */ + struct call_async_data_struct rx_sched_call_data; + cpumask_t cpumask; #endif int num_tx_queues; int num_rx_queues; @@ -332,43 +353,10 @@ struct e1000_adapter { struct e1000_rx_ring test_rx_ring; - uint32_t *config_space; + u32 *config_space; int msg_enable; #ifdef CONFIG_PCI_MSI boolean_t have_msi; #endif - /* to not mess up cache alignment, always add to the bottom */ -#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[]; -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); -void e1000_free_all_rx_resources(struct e1000_adapter *adapter); -void e1000_update_stats(struct e1000_adapter *adapter); -int e1000_set_spd_dplx(struct e1000_adapter *adapter, uint16_t spddplx); - -/* e1000_ethtool.c */ -void e1000_set_ethtool_ops(struct net_device *netdev); - -/* e1000_param.c */ -void e1000_check_options(struct e1000_adapter *adapter); - - #endif /* _E1000_H_ */ diff --git a/drivers/net/e1000/e1000_ethtool.c b/drivers/net/e1000/e1000_ethtool.c index 88a82ba88..5cedc8178 100644 --- a/drivers/net/e1000/e1000_ethtool.c +++ b/drivers/net/e1000/e1000_ethtool.c @@ -1,7 +1,7 @@ /******************************************************************************* - Copyright(c) 1999 - 2006 Intel Corporation. All rights reserved. + Copyright(c) 1999 - 2005 Intel Corporation. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free @@ -22,7 +22,6 @@ Contact Information: Linux NICS - e1000-devel Mailing List Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 *******************************************************************************/ @@ -33,6 +32,19 @@ #include +extern char e1000_driver_name[]; +extern char e1000_driver_version[]; + +extern int e1000_up(struct e1000_adapter *adapter); +extern void e1000_down(struct e1000_adapter *adapter); +extern void e1000_reset(struct e1000_adapter *adapter); +extern int e1000_set_spd_dplx(struct e1000_adapter *adapter, uint16_t spddplx); +extern int e1000_setup_all_rx_resources(struct e1000_adapter *adapter); +extern int e1000_setup_all_tx_resources(struct e1000_adapter *adapter); +extern void e1000_free_all_rx_resources(struct e1000_adapter *adapter); +extern void e1000_free_all_tx_resources(struct e1000_adapter *adapter); +extern void e1000_update_stats(struct e1000_adapter *adapter); + struct e1000_stats { char stat_string[ETH_GSTRING_LEN]; int sizeof_stat; @@ -48,6 +60,7 @@ static const struct e1000_stats e1000_gstrings_stats[] = { { "tx_bytes", E1000_STAT(net_stats.tx_bytes) }, { "rx_errors", E1000_STAT(net_stats.rx_errors) }, { "tx_errors", E1000_STAT(net_stats.tx_errors) }, + { "rx_dropped", E1000_STAT(net_stats.rx_dropped) }, { "tx_dropped", E1000_STAT(net_stats.tx_dropped) }, { "multicast", E1000_STAT(net_stats.multicast) }, { "collisions", E1000_STAT(net_stats.collisions) }, @@ -55,6 +68,7 @@ static const struct e1000_stats e1000_gstrings_stats[] = { { "rx_over_errors", E1000_STAT(net_stats.rx_over_errors) }, { "rx_crc_errors", E1000_STAT(net_stats.rx_crc_errors) }, { "rx_frame_errors", E1000_STAT(net_stats.rx_frame_errors) }, + { "rx_fifo_errors", E1000_STAT(net_stats.rx_fifo_errors) }, { "rx_no_buffer_count", E1000_STAT(stats.rnbc) }, { "rx_missed_errors", E1000_STAT(net_stats.rx_missed_errors) }, { "tx_aborted_errors", E1000_STAT(net_stats.tx_aborted_errors) }, @@ -83,7 +97,14 @@ static const struct e1000_stats e1000_gstrings_stats[] = { { "alloc_rx_buff_failed", E1000_STAT(alloc_rx_buff_failed) }, }; +#ifdef CONFIG_E1000_MQ +#define E1000_QUEUE_STATS_LEN \ + (((struct e1000_adapter *)netdev->priv)->num_tx_queues + \ + ((struct e1000_adapter *)netdev->priv)->num_rx_queues) \ + * (sizeof(struct e1000_queue_stats) / sizeof(uint64_t)) +#else #define E1000_QUEUE_STATS_LEN 0 +#endif #define E1000_GLOBAL_STATS_LEN \ sizeof(e1000_gstrings_stats) / sizeof(struct e1000_stats) #define E1000_STATS_LEN (E1000_GLOBAL_STATS_LEN + E1000_QUEUE_STATS_LEN) @@ -109,8 +130,7 @@ 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) { @@ -204,9 +224,11 @@ e1000_set_settings(struct net_device *netdev, struct ethtool_cmd *ecmd) /* reset the link */ - if (netif_running(adapter->netdev)) - e1000_reinit_locked(adapter); - else + if (netif_running(adapter->netdev)) { + e1000_down(adapter); + e1000_reset(adapter); + e1000_up(adapter); + } else e1000_reset(adapter); return 0; @@ -253,9 +275,10 @@ e1000_set_pauseparam(struct net_device *netdev, hw->original_fc = hw->fc; if (adapter->fc_autoneg == AUTONEG_ENABLE) { - if (netif_running(adapter->netdev)) - e1000_reinit_locked(adapter); - else + if (netif_running(adapter->netdev)) { + e1000_down(adapter); + e1000_up(adapter); + } else e1000_reset(adapter); } else return ((hw->media_type == e1000_media_type_fiber) ? @@ -277,9 +300,10 @@ 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_reinit_locked(adapter); - else + if (netif_running(netdev)) { + e1000_down(adapter); + e1000_up(adapter); + } else e1000_reset(adapter); return 0; } @@ -322,9 +346,6 @@ e1000_set_tso(struct net_device *netdev, uint32_t data) netdev->features |= NETIF_F_TSO; else netdev->features &= ~NETIF_F_TSO; - - DPRINTK(PROBE, INFO, "TSO is %s\n", data ? "Enabled" : "Disabled"); - adapter->tso_force = TRUE; return 0; } #endif /* NETIF_F_TSO */ @@ -573,8 +594,6 @@ e1000_get_drvinfo(struct net_device *netdev, case e1000_82571: 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, @@ -623,15 +642,9 @@ e1000_set_ringparam(struct net_device *netdev, struct e1000_rx_ring *rxdr, *rx_old, *rx_new; int i, err, tx_ring_size, rx_ring_size; - if ((ring->rx_mini_pending) || (ring->rx_jumbo_pending)) - return -EINVAL; - 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); @@ -656,6 +669,9 @@ e1000_set_ringparam(struct net_device *netdev, txdr = adapter->tx_ring; rxdr = adapter->rx_ring; + if ((ring->rx_mini_pending) || (ring->rx_jumbo_pending)) + return -EINVAL; + rxdr->count = max(ring->rx_pending,(uint32_t)E1000_MIN_RXD); rxdr->count = min(rxdr->count,(uint32_t)(mac_type < e1000_82544 ? E1000_MAX_RXD : E1000_MAX_82544_RXD)); @@ -692,11 +708,9 @@ e1000_set_ringparam(struct net_device *netdev, adapter->rx_ring = rx_new; adapter->tx_ring = tx_new; if ((err = e1000_up(adapter))) - goto err_setup; + return err; } - clear_bit(__E1000_RESETTING, &adapter->flags); - return 0; err_setup_tx: e1000_free_all_rx_resources(adapter); @@ -704,8 +718,6 @@ 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; } @@ -755,11 +767,9 @@ e1000_reg_test(struct e1000_adapter *adapter, uint64_t *data) /* there are several bits on newer hardware that are r/w */ case e1000_82571: case e1000_82572: - case e1000_80003es2lan: toggle = 0x7FFFF3FF; break; case e1000_82573: - case e1000_ich8lan: toggle = 0x7FFFF033; break; default: @@ -779,12 +789,11 @@ e1000_reg_test(struct e1000_adapter *adapter, uint64_t *data) } /* restore previous status */ E1000_WRITE_REG(&adapter->hw, STATUS, before); - 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(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); @@ -797,22 +806,20 @@ e1000_reg_test(struct e1000_adapter *adapter, uint64_t *data) REG_PATTERN_TEST(TDLEN, 0x000FFF80, 0x000FFFFF); REG_SET_AND_CHECK(RCTL, 0xFFFFFFFF, 0x00000000); - before = (adapter->hw.mac_type == e1000_ich8lan ? - 0x06C3B33E : 0x06DFB3FE); - REG_SET_AND_CHECK(RCTL, before, 0x003FFFFB); + REG_SET_AND_CHECK(RCTL, 0x06DFB3FE, 0x003FFFFB); REG_SET_AND_CHECK(TCTL, 0xFFFFFFFF, 0x00000000); if (adapter->hw.mac_type >= e1000_82543) { - REG_SET_AND_CHECK(RCTL, before, 0xFFFFFFFF); + REG_SET_AND_CHECK(RCTL, 0x06DFB3FE, 0xFFFFFFFF); REG_PATTERN_TEST(RDBAL, 0xFFFFFFF0, 0xFFFFFFFF); - if (adapter->hw.mac_type != e1000_ich8lan) - REG_PATTERN_TEST(TXCW, 0xC000FFFF, 0x0000FFFF); + REG_PATTERN_TEST(TXCW, 0xC000FFFF, 0x0000FFFF); REG_PATTERN_TEST(TDBAL, 0xFFFFFFF0, 0xFFFFFFFF); REG_PATTERN_TEST(TIDV, 0x0000FFFF, 0x0000FFFF); - value = (adapter->hw.mac_type == e1000_ich8lan ? - E1000_RAR_ENTRIES_ICH8LAN : E1000_RAR_ENTRIES); - for (i = 0; i < value; i++) { + + for (i = 0; i < E1000_RAR_ENTRIES; i++) { + REG_PATTERN_TEST(RA + ((i << 1) << 2), 0xFFFFFFFF, + 0xFFFFFFFF); REG_PATTERN_TEST(RA + (((i << 1) + 1) << 2), 0x8003FFFF, 0xFFFFFFFF); } @@ -826,9 +833,7 @@ e1000_reg_test(struct e1000_adapter *adapter, uint64_t *data) } - value = (adapter->hw.mac_type == e1000_ich8lan ? - E1000_MC_TBL_SIZE_ICH8LAN : E1000_MC_TBL_SIZE); - for (i = 0; i < value; i++) + for (i = 0; i < E1000_MC_TBL_SIZE; i++) REG_PATTERN_TEST(MTA + (i << 2), 0xFFFFFFFF, 0xFFFFFFFF); *data = 0; @@ -876,22 +881,19 @@ 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, IRQF_PROBE_SHARED, - netdev->name, netdev)) { + if (!request_irq(irq, &e1000_test_intr, 0, netdev->name, netdev)) { shared_int = FALSE; - } else if (request_irq(irq, &e1000_test_intr, IRQF_SHARED, + } else if (request_irq(irq, &e1000_test_intr, SA_SHIRQ, netdev->name, netdev)){ *data = 1; return -1; } - DPRINTK(PROBE,INFO, "testing %s interrupt\n", - (shared_int ? "shared" : "unshared")); /* Disable all the interrupts */ E1000_WRITE_REG(&adapter->hw, IMC, 0xFFFFFFFF); @@ -900,27 +902,25 @@ 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 @@ -939,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 @@ -1256,36 +1256,17 @@ e1000_integrated_phy_loopback(struct e1000_adapter *adapter) e1000_write_phy_reg(&adapter->hw, PHY_CTRL, 0x9140); /* autoneg off */ e1000_write_phy_reg(&adapter->hw, PHY_CTRL, 0x8140); - } else if (adapter->hw.phy_type == e1000_phy_gg82563) { - e1000_write_phy_reg(&adapter->hw, - GG82563_PHY_KMRN_MODE_CTRL, - 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); - - 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 */ - } + 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) { @@ -1344,8 +1325,6 @@ e1000_set_phy_loopback(struct e1000_adapter *adapter) case e1000_82571: case e1000_82572: case e1000_82573: - case e1000_80003es2lan: - case e1000_ich8lan: return e1000_integrated_phy_loopback(adapter); break; @@ -1426,11 +1405,6 @@ e1000_loopback_cleanup(struct e1000_adapter *adapter) case e1000_82546_rev_3: default: hw->autoneg = TRUE; - if (hw->phy_type == e1000_phy_gg82563) { - e1000_write_phy_reg(hw, - GG82563_PHY_KMRN_MODE_CTRL, - 0x180); - } e1000_read_phy_reg(hw, PHY_CTRL, &phy_reg); if (phy_reg & MII_CR_LOOPBACK) { phy_reg &= ~MII_CR_LOOPBACK; @@ -1597,7 +1571,6 @@ 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 */ @@ -1612,8 +1585,7 @@ e1000_diag_test(struct net_device *netdev, eth_test->flags |= ETH_TEST_FL_FAILED; if (if_running) - /* indicate we're in test mode */ - dev_close(netdev); + e1000_down(adapter); else e1000_reset(adapter); @@ -1638,9 +1610,8 @@ e1000_diag_test(struct net_device *netdev, adapter->hw.autoneg = autoneg; e1000_reset(adapter); - clear_bit(__E1000_DRIVER_TESTING, &adapter->flags); if (if_running) - dev_open(netdev); + e1000_up(adapter); } else { /* Online tests */ if (e1000_link_test(adapter, &data[4])) @@ -1651,8 +1622,6 @@ 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); } @@ -1671,26 +1640,10 @@ e1000_get_wol(struct net_device *netdev, struct ethtool_wolinfo *wol) case E1000_DEV_ID_82546EB_QUAD_COPPER: case E1000_DEV_ID_82545EM_FIBER: case E1000_DEV_ID_82545EM_COPPER: - case E1000_DEV_ID_82546GB_QUAD_COPPER: wol->supported = 0; wol->wolopts = 0; return; - case E1000_DEV_ID_82546GB_QUAD_COPPER_KSP3: - /* device id 10B5 port-A supports wol */ - if (!adapter->ksp3_port_a) { - wol->supported = 0; - return; - } - /* KSP3 does not suppport UCAST wake-ups for any interface */ - wol->supported = WAKE_MCAST | WAKE_BCAST | WAKE_MAGIC; - - if (adapter->wol & E1000_WUFC_EX) - DPRINTK(DRV, ERR, "Interface does not support " - "directed (unicast) frame wake-up packets\n"); - wol->wolopts = 0; - goto do_defaults; - case E1000_DEV_ID_82546EB_FIBER: case E1000_DEV_ID_82546GB_FIBER: case E1000_DEV_ID_82571EB_FIBER: @@ -1705,9 +1658,8 @@ e1000_get_wol(struct net_device *netdev, struct ethtool_wolinfo *wol) default: wol->supported = WAKE_UCAST | WAKE_MCAST | WAKE_BCAST | WAKE_MAGIC; - wol->wolopts = 0; -do_defaults: + wol->wolopts = 0; if (adapter->wol & E1000_WUFC_EX) wol->wolopts |= WAKE_UCAST; if (adapter->wol & E1000_WUFC_MC) @@ -1732,22 +1684,10 @@ e1000_set_wol(struct net_device *netdev, struct ethtool_wolinfo *wol) case E1000_DEV_ID_82543GC_COPPER: case E1000_DEV_ID_82544EI_FIBER: case E1000_DEV_ID_82546EB_QUAD_COPPER: - case E1000_DEV_ID_82546GB_QUAD_COPPER: case E1000_DEV_ID_82545EM_FIBER: case E1000_DEV_ID_82545EM_COPPER: return wol->wolopts ? -EOPNOTSUPP : 0; - case E1000_DEV_ID_82546GB_QUAD_COPPER_KSP3: - /* device id 10B5 port-A supports wol */ - if (!adapter->ksp3_port_a) - return wol->wolopts ? -EOPNOTSUPP : 0; - - if (wol->wolopts & WAKE_UCAST) { - DPRINTK(DRV, ERR, "Interface does not support " - "directed (unicast) frame wake-up packets\n"); - return -EOPNOTSUPP; - } - case E1000_DEV_ID_82546EB_FIBER: case E1000_DEV_ID_82546GB_FIBER: case E1000_DEV_ID_82571EB_FIBER: @@ -1812,18 +1752,21 @@ 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.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); + } else if (adapter->hw.mac_type < e1000_82573) { + E1000_WRITE_REG(&adapter->hw, LEDCTL, + (E1000_LEDCTL_LED2_BLINK_RATE | + E1000_LEDCTL_LED0_BLINK | E1000_LEDCTL_LED2_BLINK | + (E1000_LEDCTL_MODE_LED_ON << E1000_LEDCTL_LED2_MODE_SHIFT) | + (E1000_LEDCTL_MODE_LINK_ACTIVITY << E1000_LEDCTL_LED0_MODE_SHIFT) | + (E1000_LEDCTL_MODE_LED_OFF << E1000_LEDCTL_LED1_MODE_SHIFT))); msleep_interruptible(data * 1000); - del_timer_sync(&adapter->blink_timer); - e1000_write_phy_reg(&(adapter->hw), IFE_PHY_SPECIAL_CONTROL_LED, 0); } else { - e1000_blink_led_start(&adapter->hw); + 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))); msleep_interruptible(data * 1000); } @@ -1838,8 +1781,10 @@ static int e1000_nway_reset(struct net_device *netdev) { struct e1000_adapter *adapter = netdev_priv(netdev); - if (netif_running(netdev)) - e1000_reinit_locked(adapter); + if (netif_running(netdev)) { + e1000_down(adapter); + e1000_up(adapter); + } return 0; } @@ -1854,6 +1799,11 @@ e1000_get_ethtool_stats(struct net_device *netdev, struct ethtool_stats *stats, uint64_t *data) { struct e1000_adapter *adapter = netdev_priv(netdev); +#ifdef CONFIG_E1000_MQ + uint64_t *queue_stat; + int stat_count = sizeof(struct e1000_queue_stats) / sizeof(uint64_t); + int j, k; +#endif int i; e1000_update_stats(adapter); @@ -1862,12 +1812,29 @@ e1000_get_ethtool_stats(struct net_device *netdev, data[i] = (e1000_gstrings_stats[i].sizeof_stat == sizeof(uint64_t)) ? *(uint64_t *)p : *(uint32_t *)p; } +#ifdef CONFIG_E1000_MQ + for (j = 0; j < adapter->num_tx_queues; j++) { + queue_stat = (uint64_t *)&adapter->tx_ring[j].tx_stats; + for (k = 0; k < stat_count; k++) + data[i + k] = queue_stat[k]; + i += k; + } + for (j = 0; j < adapter->num_rx_queues; j++) { + queue_stat = (uint64_t *)&adapter->rx_ring[j].rx_stats; + for (k = 0; k < stat_count; k++) + data[i + k] = queue_stat[k]; + i += k; + } +#endif /* BUG_ON(i != E1000_STATS_LEN); */ } static void e1000_get_strings(struct net_device *netdev, uint32_t stringset, uint8_t *data) { +#ifdef CONFIG_E1000_MQ + struct e1000_adapter *adapter = netdev_priv(netdev); +#endif uint8_t *p = data; int i; @@ -1882,6 +1849,20 @@ e1000_get_strings(struct net_device *netdev, uint32_t stringset, uint8_t *data) ETH_GSTRING_LEN); p += ETH_GSTRING_LEN; } +#ifdef CONFIG_E1000_MQ + for (i = 0; i < adapter->num_tx_queues; i++) { + sprintf(p, "tx_queue_%u_packets", i); + p += ETH_GSTRING_LEN; + sprintf(p, "tx_queue_%u_bytes", i); + p += ETH_GSTRING_LEN; + } + for (i = 0; i < adapter->num_rx_queues; i++) { + sprintf(p, "rx_queue_%u_packets", i); + p += ETH_GSTRING_LEN; + sprintf(p, "rx_queue_%u_bytes", i); + p += ETH_GSTRING_LEN; + } +#endif /* BUG_ON(p - data != E1000_STATS_LEN * ETH_GSTRING_LEN); */ break; } diff --git a/drivers/net/e1000/e1000_hw.c b/drivers/net/e1000/e1000_hw.c index b3b919116..beeec0fbb 100644 --- a/drivers/net/e1000/e1000_hw.c +++ b/drivers/net/e1000/e1000_hw.c @@ -1,7 +1,7 @@ /******************************************************************************* - Copyright(c) 1999 - 2006 Intel Corporation. All rights reserved. + Copyright(c) 1999 - 2005 Intel Corporation. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free @@ -22,7 +22,6 @@ Contact Information: Linux NICS - e1000-devel Mailing List Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 *******************************************************************************/ @@ -101,36 +100,6 @@ 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, - 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 @@ -184,19 +153,6 @@ 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; - break; - } /* Fall Through */ default: /* Should never have loaded on this device */ @@ -368,7 +324,6 @@ 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: @@ -378,7 +333,6 @@ 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: @@ -392,7 +346,6 @@ e1000_set_mac_type(struct e1000_hw *hw) case E1000_DEV_ID_82572EI_COPPER: case E1000_DEV_ID_82572EI_FIBER: case E1000_DEV_ID_82572EI_SERDES: - case E1000_DEV_ID_82572EI: hw->mac_type = e1000_82572; break; case E1000_DEV_ID_82573E: @@ -400,32 +353,12 @@ 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 */ case e1000_82571: case e1000_82572: case e1000_82573: @@ -466,7 +399,6 @@ e1000_set_media_type(struct e1000_hw *hw) case E1000_DEV_ID_82546GB_SERDES: case E1000_DEV_ID_82571EB_SERDES: case E1000_DEV_ID_82572EI_SERDES: - case E1000_DEV_ID_80003ES2LAN_SERDES_DPT: hw->media_type = e1000_media_type_internal_serdes; break; default: @@ -475,7 +407,6 @@ 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. @@ -580,14 +511,6 @@ 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- @@ -611,20 +534,6 @@ 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; @@ -666,8 +575,6 @@ 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) /* We don't want to continue accessing MAC registers. */ @@ -709,12 +616,6 @@ 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; } @@ -740,7 +641,6 @@ e1000_init_hw(struct e1000_hw *hw) uint16_t cmd_mmrbc; uint16_t stat_mmrbc; uint32_t mta_size; - uint32_t reg_data; uint32_t ctrl_ext; DEBUGFUNC("e1000_init_hw"); @@ -757,12 +657,9 @@ e1000_init_hw(struct e1000_hw *hw) /* Disabling VLAN filtering. */ DEBUGOUT("Initializing the IEEE VLAN\n"); - /* 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); - } + 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) { @@ -790,14 +687,8 @@ e1000_init_hw(struct e1000_hw *hw) /* Zero out the Multicast HASH table */ DEBUGOUT("Zeroing the MTA\n"); mta_size = E1000_MC_TBL_SIZE; - if (hw->mac_type == e1000_ich8lan) - mta_size = E1000_MC_TBL_SIZE_ICH8LAN; - for(i = 0; i < mta_size; i++) { + 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 @@ -835,10 +726,6 @@ 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); @@ -852,8 +739,6 @@ 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; } @@ -861,41 +746,18 @@ 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) { default: break; - case e1000_80003es2lan: - /* Enable retransmit on late collisions */ - reg_data = E1000_READ_REG(hw, TCTL); - reg_data |= E1000_TCTL_RTLC; - E1000_WRITE_REG(hw, TCTL, reg_data); - - /* Configure Gigabit Carry Extend Padding */ - reg_data = E1000_READ_REG(hw, TCTL_EXT); - reg_data &= ~E1000_TCTL_EXT_GCEX_MASK; - reg_data |= DEFAULT_80003ES2LAN_TCTL_EXT_GCEX; - E1000_WRITE_REG(hw, TCTL_EXT, reg_data); - - /* Configure Transmit Inter-Packet Gap */ - reg_data = E1000_READ_REG(hw, TIPG); - reg_data &= ~E1000_TIPG_IPGT_MASK; - reg_data |= DEFAULT_80003ES2LAN_TIPG_IPGT_1000; - E1000_WRITE_REG(hw, TIPG, reg_data); - - reg_data = E1000_READ_REG_ARRAY(hw, FFLT, 0x0001); - reg_data &= ~0x00100000; - E1000_WRITE_REG_ARRAY(hw, FFLT, 0x0001, reg_data); - /* 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) - ctrl |= E1000_TXDCTL_COUNT_DESC; + ctrl &= ~E1000_TXDCTL_WTHRESH; + ctrl |= E1000_TXDCTL_COUNT_DESC | E1000_TXDCTL_FULL_TX_DESC_WB; + ctrl |= (1 << 22); E1000_WRITE_REG(hw, TXDCTL1, ctrl); break; } @@ -915,11 +777,6 @@ 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); @@ -963,7 +820,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; @@ -1007,7 +864,6 @@ 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; @@ -1050,13 +906,7 @@ e1000_setup_link(struct e1000_hw *hw) * signal detection. So this should be done before e1000_setup_pcs_link() * or e1000_phy_setup() is called. */ - if (hw->mac_type == e1000_82543) { - ret_val = e1000_read_eeprom(hw, EEPROM_INIT_CONTROL2_REG, - 1, &eeprom_data); - if (ret_val) { - DEBUGOUT("EEPROM Read Error\n"); - return -E1000_ERR_EEPROM; - } + if(hw->mac_type == e1000_82543) { ctrl_ext = ((eeprom_data & EEPROM_WORD0F_SWPDIO_EXT) << SWDPIO__EXT_SHIFT); E1000_WRITE_REG(hw, CTRL_EXT, ctrl_ext); @@ -1074,12 +924,9 @@ e1000_setup_link(struct e1000_hw *hw) */ DEBUGOUT("Initializing the Flow Control address, type and timer regs\n"); - /* 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, FCAL, FLOW_CONTROL_ADDRESS_LOW); + E1000_WRITE_REG(hw, FCAH, FLOW_CONTROL_ADDRESS_HIGH); + E1000_WRITE_REG(hw, FCT, FLOW_CONTROL_TYPE); E1000_WRITE_REG(hw, FCTTV, hw->fc_pause_time); @@ -1334,7 +1181,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"); @@ -1343,13 +1190,12 @@ 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); @@ -1462,153 +1308,6 @@ e1000_copper_link_igp_setup(struct e1000_hw *hw) return E1000_SUCCESS; } -/******************************************************************** -* Copper link setup for e1000_phy_gg82563 series. -* -* hw - Struct containing variables accessed by shared code -*********************************************************************/ -static int32_t -e1000_copper_link_ggp_setup(struct e1000_hw *hw) -{ - int32_t ret_val; - uint16_t phy_data; - uint32_t reg_data; - - 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); - if(ret_val) - return ret_val; - - phy_data |= GG82563_MSCR_ASSERT_CRS_ON_TX; - /* Use 25MHz for both link down and 1000BASE-T for Tx clock */ - phy_data |= GG82563_MSCR_TX_CLK_1000MBPS_25MHZ; - - ret_val = e1000_write_phy_reg(hw, GG82563_PHY_MAC_SPEC_CTRL, - phy_data); - if(ret_val) - return ret_val; - - /* Options: - * MDI/MDI-X = 0 (default) - * 0 - Auto for all speeds - * 1 - MDI mode - * 2 - MDI-X mode - * 3 - Auto for 1000Base-T only (MDI-X for 10/100Base-T modes) - */ - ret_val = e1000_read_phy_reg(hw, GG82563_PHY_SPEC_CTRL, &phy_data); - if(ret_val) - return ret_val; - - phy_data &= ~GG82563_PSCR_CROSSOVER_MODE_MASK; - - switch (hw->mdix) { - case 1: - phy_data |= GG82563_PSCR_CROSSOVER_MODE_MDI; - break; - case 2: - phy_data |= GG82563_PSCR_CROSSOVER_MODE_MDIX; - break; - case 0: - default: - phy_data |= GG82563_PSCR_CROSSOVER_MODE_AUTO; - break; - } - - /* Options: - * disable_polarity_correction = 0 (default) - * Automatic Correction for Reversed Cable Polarity - * 0 - Disabled - * 1 - Enabled - */ - phy_data &= ~GG82563_PSCR_POLARITY_REVERSAL_DISABLE; - if(hw->disable_polarity_correction == 1) - phy_data |= GG82563_PSCR_POLARITY_REVERSAL_DISABLE; - ret_val = e1000_write_phy_reg(hw, GG82563_PHY_SPEC_CTRL, phy_data); - - if(ret_val) - return ret_val; - - /* SW Reset the PHY so all changes take effect */ - ret_val = e1000_phy_reset(hw); - if (ret_val) { - DEBUGOUT("Error Resetting the PHY\n"); - return ret_val; - } - } /* phy_reset_disable */ - - if (hw->mac_type == e1000_80003es2lan) { - /* Bypass RX and TX FIFO's */ - ret_val = e1000_write_kmrn_reg(hw, E1000_KUMCTRLSTA_OFFSET_FIFO_CTRL, - E1000_KUMCTRLSTA_FIFO_CTRL_RX_BYPASS | - E1000_KUMCTRLSTA_FIFO_CTRL_TX_BYPASS); - if (ret_val) - return ret_val; - - ret_val = e1000_read_phy_reg(hw, GG82563_PHY_SPEC_CTRL_2, &phy_data); - if (ret_val) - return ret_val; - - phy_data &= ~GG82563_PSCR2_REVERSE_AUTO_NEG; - ret_val = e1000_write_phy_reg(hw, GG82563_PHY_SPEC_CTRL_2, phy_data); - - if (ret_val) - return ret_val; - - reg_data = E1000_READ_REG(hw, CTRL_EXT); - reg_data &= ~(E1000_CTRL_EXT_LINK_MODE_MASK); - E1000_WRITE_REG(hw, CTRL_EXT, reg_data); - - ret_val = e1000_read_phy_reg(hw, GG82563_PHY_PWR_MGMT_CTRL, - &phy_data); - if (ret_val) - return ret_val; - - /* Do not init these registers when the HW is in IAMT mode, since the - * firmware will have already initialized them. We only initialize - * them if the HW is not in IAMT mode. - */ - if (e1000_check_mng_mode(hw) == FALSE) { - /* Enable Electrical Idle on the PHY */ - phy_data |= GG82563_PMCR_ENABLE_ELECTRICAL_IDLE; - ret_val = e1000_write_phy_reg(hw, GG82563_PHY_PWR_MGMT_CTRL, - phy_data); - if (ret_val) - return ret_val; - - ret_val = e1000_read_phy_reg(hw, GG82563_PHY_KMRN_MODE_CTRL, - &phy_data); - if (ret_val) - return ret_val; - - phy_data &= ~GG82563_KMCR_PASS_FALSE_CARRIER; - - ret_val = e1000_write_phy_reg(hw, GG82563_PHY_KMRN_MODE_CTRL, - phy_data); - if (ret_val) - return ret_val; - } - - /* Workaround: Disable padding in Kumeran interface in the MAC - * and in the PHY to avoid CRC errors. - */ - ret_val = e1000_read_phy_reg(hw, GG82563_PHY_INBAND_CTRL, - &phy_data); - if (ret_val) - return ret_val; - phy_data |= GG82563_ICR_DIS_PADDING; - ret_val = e1000_write_phy_reg(hw, GG82563_PHY_INBAND_CTRL, - phy_data); - if (ret_val) - return ret_val; - } - - return E1000_SUCCESS; -} /******************************************************************** * Copper link setup for e1000_phy_m88 series. @@ -1625,7 +1324,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) @@ -1667,40 +1366,28 @@ 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; - - if (hw->phy_revision < M88E1011_I_REV_4) { - /* 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; + /* 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; - 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 | + phy_data |= M88E1000_EPSCR_TX_CLK_25; + + if (hw->phy_revision < M88E1011_I_REV_4) { + /* Configure Master and Slave downshift values */ + phy_data &= ~(M88E1000_EPSCR_MASTER_DOWNSHIFT_MASK | M88E1000_EPSCR_SLAVE_DOWNSHIFT_MASK); - phy_data |= (M88E1000_EPSCR_MASTER_DOWNSHIFT_1X | + 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 */ @@ -1738,10 +1425,6 @@ 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) { @@ -1787,7 +1470,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 ******************************************************************************/ @@ -1796,7 +1479,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 { @@ -1820,7 +1503,7 @@ e1000_copper_link_postconfig(struct e1000_hw *hw) return ret_val; } } - + return E1000_SUCCESS; } @@ -1835,51 +1518,15 @@ e1000_setup_copper_link(struct e1000_hw *hw) int32_t ret_val; uint16_t i; uint16_t phy_data; - uint16_t reg_data; 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) return ret_val; - switch (hw->mac_type) { - case e1000_80003es2lan: - /* 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); - if (ret_val) - return ret_val; - break; - default: - break; - } - 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) @@ -1888,18 +1535,14 @@ e1000_setup_copper_link(struct e1000_hw *hw) ret_val = e1000_copper_link_mgp_setup(hw); if(ret_val) return ret_val; - } else if (hw->phy_type == e1000_phy_gg82563) { - ret_val = e1000_copper_link_ggp_setup(hw); - if(ret_val) - return ret_val; } 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. */ @@ -1927,7 +1570,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; } @@ -1938,79 +1581,6 @@ e1000_setup_copper_link(struct e1000_hw *hw) return E1000_SUCCESS; } -/****************************************************************************** -* Configure the MAC-to-PHY interface for 10/100Mbps -* -* hw - Struct containing variables accessed by shared code -******************************************************************************/ -static int32_t -e1000_configure_kmrn_for_10_100(struct e1000_hw *hw, uint16_t duplex) -{ - int32_t ret_val = E1000_SUCCESS; - uint32_t tipg; - uint16_t reg_data; - - DEBUGFUNC("e1000_configure_kmrn_for_10_100"); - - reg_data = E1000_KUMCTRLSTA_HD_CTRL_10_100_DEFAULT; - ret_val = e1000_write_kmrn_reg(hw, E1000_KUMCTRLSTA_OFFSET_HD_CTRL, - reg_data); - if (ret_val) - return ret_val; - - /* Configure Transmit Inter-Packet Gap */ - tipg = E1000_READ_REG(hw, TIPG); - tipg &= ~E1000_TIPG_IPGT_MASK; - 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; -} - -static int32_t -e1000_configure_kmrn_for_1000(struct e1000_hw *hw) -{ - int32_t ret_val = E1000_SUCCESS; - uint16_t reg_data; - uint32_t tipg; - - DEBUGFUNC("e1000_configure_kmrn_for_1000"); - - reg_data = E1000_KUMCTRLSTA_HD_CTRL_1000_DEFAULT; - ret_val = e1000_write_kmrn_reg(hw, E1000_KUMCTRLSTA_OFFSET_HD_CTRL, - reg_data); - if (ret_val) - return ret_val; - - /* Configure Transmit Inter-Packet Gap */ - tipg = E1000_READ_REG(hw, TIPG); - tipg &= ~E1000_TIPG_IPGT_MASK; - 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; -} - /****************************************************************************** * Configures PHY autoneg and flow control advertisement settings * @@ -2030,13 +1600,10 @@ e1000_phy_setup_autoneg(struct e1000_hw *hw) 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; + /* Read the MII 1000Base-T Control Register (Address 9). */ + ret_val = e1000_read_phy_reg(hw, PHY_1000T_CTRL, &mii_1000t_ctrl_reg); + if(ret_val) + return ret_val; /* Need to parse both autoneg_advertised and fc and set up * the appropriate PHY registers. First we will parse for @@ -2087,9 +1654,6 @@ 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 @@ -2151,11 +1715,9 @@ e1000_phy_setup_autoneg(struct e1000_hw *hw) DEBUGOUT1("Auto-Neg Advertising %x\n", mii_autoneg_adv_reg); - 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; - } + ret_val = e1000_write_phy_reg(hw, PHY_1000T_CTRL, mii_1000t_ctrl_reg); + if(ret_val) + return ret_val; return E1000_SUCCESS; } @@ -2240,8 +1802,7 @@ e1000_phy_force_speed_duplex(struct e1000_hw *hw) /* Write the configured values back to the Device Control Reg. */ E1000_WRITE_REG(hw, CTRL, ctrl); - if ((hw->phy_type == e1000_phy_m88) || - (hw->phy_type == e1000_phy_gg82563)) { + if (hw->phy_type == e1000_phy_m88) { ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_CTRL, &phy_data); if(ret_val) return ret_val; @@ -2258,18 +1819,6 @@ 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. @@ -2322,8 +1871,7 @@ e1000_phy_force_speed_duplex(struct e1000_hw *hw) msec_delay(100); } if((i == 0) && - ((hw->phy_type == e1000_phy_m88) || - (hw->phy_type == e1000_phy_gg82563))) { + (hw->phy_type == e1000_phy_m88)) { /* We didn't get link. Reset the DSP and wait again for link. */ ret_val = e1000_phy_reset_dsp(hw); if(ret_val) { @@ -2382,27 +1930,6 @@ e1000_phy_force_speed_duplex(struct e1000_hw *hw) if(ret_val) return ret_val; } - } else if (hw->phy_type == e1000_phy_gg82563) { - /* The TX_CLK of the Extended PHY Specific Control Register defaults - * to 2.5MHz on a reset. We need to re-force it back to 25MHz, if - * we're not in a forced 10/duplex configuration. */ - ret_val = e1000_read_phy_reg(hw, GG82563_PHY_MAC_SPEC_CTRL, &phy_data); - if (ret_val) - return ret_val; - - phy_data &= ~GG82563_MSCR_TX_CLK_MASK; - if ((hw->forced_speed_duplex == e1000_10_full) || - (hw->forced_speed_duplex == e1000_10_half)) - phy_data |= GG82563_MSCR_TX_CLK_10MBPS_2_5MHZ; - else - phy_data |= GG82563_MSCR_TX_CLK_100MBPS_25MHZ; - - /* Also due to the reset, we need to enable CRS on Tx. */ - phy_data |= GG82563_MSCR_ASSERT_CRS_ON_TX; - - ret_val = e1000_write_phy_reg(hw, GG82563_PHY_MAC_SPEC_CTRL, phy_data); - if (ret_val) - return ret_val; } return E1000_SUCCESS; } @@ -2454,7 +1981,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; @@ -2473,9 +2000,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); @@ -2674,10 +2201,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.\n"); + DEBUGOUT("Flow Control = FULL.\r\n"); } else { hw->fc = e1000_fc_rx_pause; - DEBUGOUT("Flow Control = RX PAUSE frames only.\n"); + DEBUGOUT("Flow Control = RX PAUSE frames only.\r\n"); } } /* For receiving PAUSE frames ONLY. @@ -2693,7 +2220,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.\n"); + DEBUGOUT("Flow Control = TX PAUSE frames only.\r\n"); } /* For transmitting PAUSE frames ONLY. * @@ -2708,7 +2235,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.\n"); + DEBUGOUT("Flow Control = RX PAUSE frames only.\r\n"); } /* Per the IEEE spec, at this point flow control should be * disabled. However, we want to consider that we could @@ -2734,10 +2261,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.\n"); + DEBUGOUT("Flow Control = NONE.\r\n"); } else { hw->fc = e1000_fc_rx_pause; - DEBUGOUT("Flow Control = RX PAUSE frames only.\n"); + DEBUGOUT("Flow Control = RX PAUSE frames only.\r\n"); } /* Now we need to do one last check... If we auto- @@ -2762,7 +2289,7 @@ e1000_config_fc_after_link_up(struct e1000_hw *hw) return ret_val; } } else { - DEBUGOUT("Copper PHY and Auto Neg has not completed.\n"); + DEBUGOUT("Copper PHY and Auto Neg has not completed.\r\n"); } } return E1000_SUCCESS; @@ -2902,12 +2429,8 @@ e1000_check_for_link(struct e1000_hw *hw) */ if(hw->tbi_compatibility_en) { uint16_t speed, duplex; - 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) { + e1000_get_speed_and_duplex(hw, &speed, &duplex); + if(speed != SPEED_1000) { /* If link speed is not set to gigabit speed, we do not need * to enable TBI compatibility. */ @@ -2949,7 +2472,7 @@ e1000_check_for_link(struct e1000_hw *hw) hw->autoneg_failed = 1; return 0; } - DEBUGOUT("NOT RXing /C/, disable AutoNeg and force link.\n"); + DEBUGOUT("NOT RXing /C/, disable AutoNeg and force link.\r\n"); /* Disable auto-negotiation in the TXCW register */ E1000_WRITE_REG(hw, TXCW, (hw->txcw & ~E1000_TXCW_ANE)); @@ -2974,7 +2497,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.\n"); + DEBUGOUT("RXing /C/, enable AutoNeg and stop forcing link.\r\n"); E1000_WRITE_REG(hw, TXCW, hw->txcw); E1000_WRITE_REG(hw, CTRL, (ctrl & ~E1000_CTRL_SLU)); @@ -3037,13 +2560,13 @@ e1000_get_speed_and_duplex(struct e1000_hw *hw, if(status & E1000_STATUS_FD) { *duplex = FULL_DUPLEX; - DEBUGOUT("Full Duplex\n"); + DEBUGOUT("Full Duplex\r\n"); } else { *duplex = HALF_DUPLEX; - DEBUGOUT(" Half Duplex\n"); + DEBUGOUT(" Half Duplex\r\n"); } } else { - DEBUGOUT("1000 Mbs, Full Duplex\n"); + DEBUGOUT("1000 Mbs, Full Duplex\r\n"); *speed = SPEED_1000; *duplex = FULL_DUPLEX; } @@ -3069,22 +2592,6 @@ e1000_get_speed_and_duplex(struct e1000_hw *hw, } } - 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, *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; - } - return E1000_SUCCESS; } @@ -3260,142 +2767,34 @@ e1000_shift_in_mdi_bits(struct e1000_hw *hw) return data; } -static int32_t -e1000_swfw_sync_acquire(struct e1000_hw *hw, uint16_t mask) +/***************************************************************************** +* Reads the value from a PHY register, if the value is on a specific non zero +* page, sets the page first. +* hw - Struct containing variables accessed by shared code +* reg_addr - address of the PHY register to read +******************************************************************************/ +int32_t +e1000_read_phy_reg(struct e1000_hw *hw, + uint32_t reg_addr, + uint16_t *phy_data) { - uint32_t swfw_sync = 0; - uint32_t swmask = mask; - uint32_t fwmask = mask << 16; - int32_t timeout = 200; - - 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); - - while(timeout) { - if (e1000_get_hw_eeprom_semaphore(hw)) - return -E1000_ERR_SWFW_SYNC; - - swfw_sync = E1000_READ_REG(hw, SW_FW_SYNC); - if (!(swfw_sync & (fwmask | swmask))) { - break; - } + uint32_t ret_val; - /* firmware currently using resource (fwmask) */ - /* or other software thread currently using resource (swmask) */ - e1000_put_hw_eeprom_semaphore(hw); - msec_delay_irq(5); - timeout--; - } + DEBUGFUNC("e1000_read_phy_reg"); - if (!timeout) { - DEBUGOUT("Driver can't access resource, SW_FW_SYNC timeout.\n"); - return -E1000_ERR_SWFW_SYNC; + if((hw->phy_type == e1000_phy_igp || + hw->phy_type == e1000_phy_igp_2) && + (reg_addr > MAX_PHY_MULTI_PAGE_REG)) { + ret_val = e1000_write_phy_reg_ex(hw, IGP01E1000_PHY_PAGE_SELECT, + (uint16_t)reg_addr); + if(ret_val) { + return ret_val; + } } - swfw_sync |= swmask; - E1000_WRITE_REG(hw, SW_FW_SYNC, swfw_sync); + ret_val = e1000_read_phy_reg_ex(hw, MAX_PHY_REG_ADDRESS & reg_addr, + phy_data); - e1000_put_hw_eeprom_semaphore(hw); - return E1000_SUCCESS; -} - -static void -e1000_swfw_sync_release(struct e1000_hw *hw, uint16_t mask) -{ - uint32_t swfw_sync; - uint32_t swmask = 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; - } - - /* if (e1000_get_hw_eeprom_semaphore(hw)) - * return -E1000_ERR_SWFW_SYNC; */ - while (e1000_get_hw_eeprom_semaphore(hw) != E1000_SUCCESS); - /* empty */ - - swfw_sync = E1000_READ_REG(hw, SW_FW_SYNC); - swfw_sync &= ~swmask; - E1000_WRITE_REG(hw, SW_FW_SYNC, swfw_sync); - - e1000_put_hw_eeprom_semaphore(hw); -} - -/***************************************************************************** -* Reads the value from a PHY register, if the value is on a specific non zero -* page, sets the page first. -* hw - Struct containing variables accessed by shared code -* reg_addr - address of the PHY register to read -******************************************************************************/ -int32_t -e1000_read_phy_reg(struct e1000_hw *hw, - uint32_t reg_addr, - uint16_t *phy_data) -{ - uint32_t ret_val; - uint16_t swfw; - - DEBUGFUNC("e1000_read_phy_reg"); - - if ((hw->mac_type == e1000_80003es2lan) && - (E1000_READ_REG(hw, STATUS) & E1000_STATUS_FUNC_1)) { - swfw = E1000_SWFW_PHY1_SM; - } else { - swfw = E1000_SWFW_PHY0_SM; - } - if (e1000_swfw_sync_acquire(hw, swfw)) - return -E1000_ERR_SWFW_SYNC; - - 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, - (uint16_t)reg_addr); - if(ret_val) { - e1000_swfw_sync_release(hw, swfw); - return ret_val; - } - } else if (hw->phy_type == e1000_phy_gg82563) { - if (((reg_addr & MAX_PHY_REG_ADDRESS) > MAX_PHY_MULTI_PAGE_REG) || - (hw->mac_type == e1000_80003es2lan)) { - /* Select Configuration Page */ - if ((reg_addr & MAX_PHY_REG_ADDRESS) < GG82563_MIN_ALT_REG) { - ret_val = e1000_write_phy_reg_ex(hw, GG82563_PHY_PAGE_SELECT, - (uint16_t)((uint16_t)reg_addr >> GG82563_PAGE_SHIFT)); - } else { - /* Use Alternative Page Select register to access - * registers 30 and 31 - */ - ret_val = e1000_write_phy_reg_ex(hw, - GG82563_PHY_PAGE_SELECT_ALT, - (uint16_t)((uint16_t)reg_addr >> GG82563_PAGE_SHIFT)); - } - - if (ret_val) { - e1000_swfw_sync_release(hw, swfw); - return ret_val; - } - } - } - - ret_val = e1000_read_phy_reg_ex(hw, MAX_PHY_REG_ADDRESS & reg_addr, - phy_data); - - e1000_swfw_sync_release(hw, swfw); return ret_val; } @@ -3486,56 +2885,22 @@ e1000_write_phy_reg(struct e1000_hw *hw, uint16_t phy_data) { uint32_t ret_val; - uint16_t swfw; DEBUGFUNC("e1000_write_phy_reg"); - if ((hw->mac_type == e1000_80003es2lan) && - (E1000_READ_REG(hw, STATUS) & E1000_STATUS_FUNC_1)) { - swfw = E1000_SWFW_PHY1_SM; - } else { - swfw = E1000_SWFW_PHY0_SM; - } - if (e1000_swfw_sync_acquire(hw, swfw)) - return -E1000_ERR_SWFW_SYNC; - - if ((hw->phy_type == e1000_phy_igp || - hw->phy_type == e1000_phy_igp_3 || + if((hw->phy_type == e1000_phy_igp || hw->phy_type == e1000_phy_igp_2) && (reg_addr > MAX_PHY_MULTI_PAGE_REG)) { ret_val = e1000_write_phy_reg_ex(hw, IGP01E1000_PHY_PAGE_SELECT, (uint16_t)reg_addr); if(ret_val) { - e1000_swfw_sync_release(hw, swfw); return ret_val; } - } else if (hw->phy_type == e1000_phy_gg82563) { - if (((reg_addr & MAX_PHY_REG_ADDRESS) > MAX_PHY_MULTI_PAGE_REG) || - (hw->mac_type == e1000_80003es2lan)) { - /* Select Configuration Page */ - if ((reg_addr & MAX_PHY_REG_ADDRESS) < GG82563_MIN_ALT_REG) { - ret_val = e1000_write_phy_reg_ex(hw, GG82563_PHY_PAGE_SELECT, - (uint16_t)((uint16_t)reg_addr >> GG82563_PAGE_SHIFT)); - } else { - /* Use Alternative Page Select register to access - * registers 30 and 31 - */ - ret_val = e1000_write_phy_reg_ex(hw, - GG82563_PHY_PAGE_SELECT_ALT, - (uint16_t)((uint16_t)reg_addr >> GG82563_PAGE_SHIFT)); - } - - if (ret_val) { - e1000_swfw_sync_release(hw, swfw); - return ret_val; - } - } } ret_val = e1000_write_phy_reg_ex(hw, MAX_PHY_REG_ADDRESS & reg_addr, phy_data); - e1000_swfw_sync_release(hw, swfw); return ret_val; } @@ -3602,65 +2967,6 @@ e1000_write_phy_reg_ex(struct e1000_hw *hw, return E1000_SUCCESS; } -static int32_t -e1000_read_kmrn_reg(struct e1000_hw *hw, - uint32_t reg_addr, - uint16_t *data) -{ - uint32_t reg_val; - uint16_t swfw; - DEBUGFUNC("e1000_read_kmrn_reg"); - - if ((hw->mac_type == e1000_80003es2lan) && - (E1000_READ_REG(hw, STATUS) & E1000_STATUS_FUNC_1)) { - swfw = E1000_SWFW_PHY1_SM; - } else { - swfw = E1000_SWFW_PHY0_SM; - } - if (e1000_swfw_sync_acquire(hw, swfw)) - return -E1000_ERR_SWFW_SYNC; - - /* Write register address */ - reg_val = ((reg_addr << E1000_KUMCTRLSTA_OFFSET_SHIFT) & - E1000_KUMCTRLSTA_OFFSET) | - E1000_KUMCTRLSTA_REN; - E1000_WRITE_REG(hw, KUMCTRLSTA, reg_val); - udelay(2); - - /* Read the data returned */ - reg_val = E1000_READ_REG(hw, KUMCTRLSTA); - *data = (uint16_t)reg_val; - - e1000_swfw_sync_release(hw, swfw); - return E1000_SUCCESS; -} - -static int32_t -e1000_write_kmrn_reg(struct e1000_hw *hw, - uint32_t reg_addr, - uint16_t data) -{ - uint32_t reg_val; - uint16_t swfw; - DEBUGFUNC("e1000_write_kmrn_reg"); - - if ((hw->mac_type == e1000_80003es2lan) && - (E1000_READ_REG(hw, STATUS) & E1000_STATUS_FUNC_1)) { - swfw = E1000_SWFW_PHY1_SM; - } else { - swfw = E1000_SWFW_PHY0_SM; - } - if (e1000_swfw_sync_acquire(hw, swfw)) - return -E1000_ERR_SWFW_SYNC; - - reg_val = ((reg_addr << E1000_KUMCTRLSTA_OFFSET_SHIFT) & - E1000_KUMCTRLSTA_OFFSET) | data; - E1000_WRITE_REG(hw, KUMCTRLSTA, reg_val); - udelay(2); - - e1000_swfw_sync_release(hw, swfw); - return E1000_SUCCESS; -} /****************************************************************************** * Returns the PHY to the power-on reset state @@ -3673,7 +2979,6 @@ e1000_phy_hw_reset(struct e1000_hw *hw) uint32_t ctrl, ctrl_ext; uint32_t led_ctrl; int32_t ret_val; - uint16_t swfw; DEBUGFUNC("e1000_phy_hw_reset"); @@ -3686,37 +2991,26 @@ e1000_phy_hw_reset(struct e1000_hw *hw) DEBUGOUT("Resetting Phy...\n"); if(hw->mac_type > e1000_82543) { - if ((hw->mac_type == e1000_80003es2lan) && - (E1000_READ_REG(hw, STATUS) & E1000_STATUS_FUNC_1)) { - swfw = E1000_SWFW_PHY1_SM; - } else { - swfw = E1000_SWFW_PHY0_SM; - } - if (e1000_swfw_sync_acquire(hw, swfw)) { - e1000_release_software_semaphore(hw); - return -E1000_ERR_SWFW_SYNC; - } /* 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. + * for 10ms after the deassertion. */ ctrl = E1000_READ_REG(hw, CTRL); E1000_WRITE_REG(hw, CTRL, ctrl | E1000_CTRL_PHY_RST); E1000_WRITE_FLUSH(hw); - - 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_irq(10); - e1000_swfw_sync_release(hw, swfw); + msec_delay(10); } else { /* Read the Extended Device Control Register, assert the PHY_RESET_DIR * bit to put the PHY into reset. Then, take it out of reset. @@ -3743,14 +3037,7 @@ e1000_phy_hw_reset(struct e1000_hw *hw) /* Wait for FW to finish PHY configuration. */ 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; } @@ -3779,11 +3066,9 @@ 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); @@ -3805,121 +3090,12 @@ 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 ******************************************************************************/ -int32_t +static int32_t e1000_detect_gig_phy(struct e1000_hw *hw) { int32_t phy_init_status, ret_val; @@ -3931,25 +3107,16 @@ 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; } - /* ESB-2 PHY reads require e1000_phy_gg82563 to be set because of a work- - * around that forces PHY page 0 to be set or the reads fail. The rest of - * the code in this routine uses e1000_read_phy_reg to read the PHY ID. - * So for ESB-2 we need to have this set so our reads won't fail. If the - * attached PHY is not a e1000_phy_gg82563, the routines below will figure - * this out as well. */ - if (hw->mac_type == e1000_80003es2lan) - hw->phy_type = e1000_phy_gg82563; - /* 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); @@ -3984,15 +3151,6 @@ e1000_detect_gig_phy(struct e1000_hw *hw) case e1000_82573: if(hw->phy_id == M88E1111_I_PHY_ID) match = TRUE; break; - 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; @@ -4019,10 +3177,8 @@ e1000_phy_reset_dsp(struct e1000_hw *hw) DEBUGFUNC("e1000_phy_reset_dsp"); do { - if (hw->phy_type != e1000_phy_gg82563) { - ret_val = e1000_write_phy_reg(hw, 29, 0x001d); - if(ret_val) break; - } + ret_val = e1000_write_phy_reg(hw, 29, 0x001d); + if(ret_val) break; ret_val = e1000_write_phy_reg(hw, 30, 0x00c1); if(ret_val) break; ret_val = e1000_write_phy_reg(hw, 30, 0x0000); @@ -4107,53 +3263,6 @@ 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. * @@ -4187,7 +3296,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); @@ -4201,17 +3310,8 @@ e1000_phy_m88_get_info(struct e1000_hw *hw, /* Cable Length Estimation and Local/Remote Receiver Information * are only valid at 1000 Mbps. */ - if (hw->phy_type != e1000_phy_gg82563) { - phy_info->cable_length = ((phy_data & M88E1000_PSSR_CABLE_LENGTH) >> - M88E1000_PSSR_CABLE_LENGTH_SHIFT); - } else { - ret_val = e1000_read_phy_reg(hw, GG82563_PHY_DSP_DISTANCE, - &phy_data); - if (ret_val) - return ret_val; - - phy_info->cable_length = phy_data & GG82563_DSPD_CABLE_LENGTH; - } + phy_info->cable_length = ((phy_data & M88E1000_PSSR_CABLE_LENGTH) >> + M88E1000_PSSR_CABLE_LENGTH_SHIFT); ret_val = e1000_read_phy_reg(hw, PHY_1000T_STATUS, &phy_data); if(ret_val) @@ -4269,12 +3369,9 @@ e1000_phy_get_info(struct e1000_hw *hw, return -E1000_ERR_CONFIG; } - if (hw->phy_type == e1000_phy_igp || - hw->phy_type == e1000_phy_igp_3 || + if(hw->phy_type == e1000_phy_igp || 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); } @@ -4295,8 +3392,7 @@ e1000_validate_mdi_setting(struct e1000_hw *hw) /****************************************************************************** * Sets up eeprom variables in the hw struct. Must be called after mac_type - * is configured. Additionally, if this is ICH8, the flash controller GbE - * registers must be mapped, or this will crash. + * is configured. * * hw - Struct containing variables accessed by shared code *****************************************************************************/ @@ -4409,49 +3505,6 @@ e1000_init_eeprom_params(struct e1000_hw *hw) E1000_WRITE_REG(hw, EECD, eecd); } break; - case e1000_80003es2lan: - eeprom->type = e1000_eeprom_spi; - eeprom->opcode_bits = 8; - eeprom->delay_usec = 1; - if (eecd & E1000_EECD_ADDR_BITS) { - eeprom->page_size = 32; - eeprom->address_bits = 16; - } else { - eeprom->page_size = 8; - eeprom->address_bits = 8; - } - eeprom->use_eerd = TRUE; - eeprom->use_eewr = 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; } @@ -4632,8 +3685,9 @@ e1000_acquire_eeprom(struct e1000_hw *hw) DEBUGFUNC("e1000_acquire_eeprom"); - if (e1000_swfw_sync_acquire(hw, E1000_SWFW_EEP_SM)) - return -E1000_ERR_SWFW_SYNC; + if(e1000_get_hw_eeprom_semaphore(hw)) + return -E1000_ERR_EEPROM; + eecd = E1000_READ_REG(hw, EECD); if (hw->mac_type != e1000_82573) { @@ -4652,7 +3706,7 @@ e1000_acquire_eeprom(struct e1000_hw *hw) eecd &= ~E1000_EECD_REQ; E1000_WRITE_REG(hw, EECD, eecd); DEBUGOUT("Could not acquire EEPROM grant\n"); - e1000_swfw_sync_release(hw, E1000_SWFW_EEP_SM); + e1000_put_hw_eeprom_semaphore(hw); return -E1000_ERR_EEPROM; } } @@ -4775,7 +3829,7 @@ e1000_release_eeprom(struct e1000_hw *hw) E1000_WRITE_REG(hw, EECD, eecd); } - e1000_swfw_sync_release(hw, E1000_SWFW_EEP_SM); + e1000_put_hw_eeprom_semaphore(hw); } /****************************************************************************** @@ -4854,8 +3908,6 @@ e1000_read_eeprom(struct e1000_hw *hw, if (e1000_is_onboard_nvm_eeprom(hw) == TRUE && hw->eeprom.use_eerd == FALSE) { switch (hw->mac_type) { - case e1000_80003es2lan: - break; default: /* Prepare the EEPROM for reading */ if (e1000_acquire_eeprom(hw) != E1000_SUCCESS) @@ -4872,10 +3924,7 @@ e1000_read_eeprom(struct e1000_hw *hw, return ret_val; } - if (eeprom->type == e1000_eeprom_ich8) - return e1000_read_eeprom_ich8(hw, offset, words, data); - - if (eeprom->type == e1000_eeprom_spi) { + if(eeprom->type == e1000_eeprom_spi) { uint16_t word_in; uint8_t read_opcode = EEPROM_READ_OPCODE_SPI; @@ -4947,14 +3996,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; } @@ -4976,29 +4025,25 @@ e1000_write_eeprom_eewr(struct e1000_hw *hw, uint32_t i = 0; int32_t error = 0; - if (e1000_swfw_sync_acquire(hw, E1000_SWFW_EEP_SM)) - 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; } @@ -5017,7 +4062,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) { @@ -5040,12 +4085,7 @@ e1000_is_onboard_nvm_eeprom(struct e1000_hw *hw) { uint32_t eecd = 0; - DEBUGFUNC("e1000_is_onboard_nvm_eeprom"); - - if (hw->mac_type == e1000_ich8lan) - return FALSE; - - if (hw->mac_type == e1000_82573) { + if(hw->mac_type == e1000_82573) { eecd = E1000_READ_REG(hw, EECD); /* Isolate bits 15 & 16 */ @@ -5095,22 +4135,8 @@ e1000_validate_eeprom_checksum(struct e1000_hw *hw) } } - 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) { + 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; } @@ -5136,7 +4162,6 @@ 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; @@ -5155,14 +4180,6 @@ 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; } @@ -5202,9 +4219,6 @@ 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; @@ -5392,17 +4406,11 @@ e1000_commit_shadow_ram(struct e1000_hw *hw) uint32_t flop = 0; uint32_t i = 0; int32_t error = E1000_SUCCESS; - 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; + + /* The flop register will be used to determine if flash type is STM */ + flop = E1000_READ_REG(hw, FLOP); if (hw->mac_type == e1000_82573) { - /* 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) { @@ -5436,108 +4444,8 @@ e1000_commit_shadow_ram(struct e1000_hw *hw) } } - 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; -} + return error; +} /****************************************************************************** * Reads the adapter's part number from the EEPROM @@ -5603,7 +4511,6 @@ e1000_read_mac_addr(struct e1000_hw * hw) case e1000_82546: case e1000_82546_rev_3: case e1000_82571: - case e1000_80003es2lan: if(E1000_READ_REG(hw, STATUS) & E1000_STATUS_FUNC_1) hw->perm_mac_addr[5] ^= 0x01; break; @@ -5643,19 +4550,15 @@ 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. * @@ -5670,7 +4573,6 @@ 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, @@ -5682,7 +4584,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. */ @@ -5691,8 +4593,6 @@ 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. */ @@ -5701,19 +4601,14 @@ 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 */ @@ -5770,46 +4665,24 @@ e1000_hash_mc_addr(struct e1000_hw *hw, * LSB MSB */ case 0: - 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)); - } + /* [47:36] i.e. 0x563 for above example address */ + hash_value = ((mc_addr[4] >> 4) | (((uint16_t) mc_addr[5]) << 4)); break; case 1: - 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)); - } + /* [46:35] i.e. 0xAC6 for above example address */ + hash_value = ((mc_addr[4] >> 3) | (((uint16_t) mc_addr[5]) << 5)); break; case 2: - 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)); - } + /* [45:34] i.e. 0x5D8 for above example address */ + hash_value = ((mc_addr[4] >> 2) | (((uint16_t) mc_addr[5]) << 6)); break; case 3: - 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)); - } + /* [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; } @@ -5837,8 +4710,6 @@ 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); @@ -5852,12 +4723,9 @@ 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); } } @@ -5881,42 +4749,11 @@ e1000_rar_set(struct e1000_hw *hw, rar_low = ((uint32_t) addr[0] | ((uint32_t) addr[1] << 8) | ((uint32_t) addr[2] << 16) | ((uint32_t) addr[3] << 24)); - rar_high = ((uint32_t) addr[4] | ((uint32_t) addr[5] << 8)); - /* Disable Rx and flush all Rx frames before enabling RSS to avoid Rx - * unit hang. - * - * Description: - * If there are any Rx frames queued up or otherwise present in the HW - * before RSS is enabled, and then we enable RSS, the HW Rx unit will - * hang. To work around this issue, we have to disable receives and - * flush out all Rx frames before we enable RSS. To do so, we modify we - * redirect all Rx traffic to manageability and then reset the HW. - * This flushes away Rx frames, and (since the redirections to - * manageability persists across resets) keeps new ones from coming in - * while we work. Then, we clear the Address Valid AV bit for all MAC - * addresses and undo the re-direction to manageability. - * Now, frames are coming in again, but the MAC won't accept them, so - * far so good. We now proceed to initialize RSS (if necessary) and - * configure the Rx unit. Last, we re-enable the AV bits and continue - * on our merry way. - */ - switch (hw->mac_type) { - case e1000_82571: - case e1000_82572: - case e1000_80003es2lan: - if (hw->leave_av_bit_off == TRUE) - break; - default: - /* Indicate to hardware the Address is Valid. */ - rar_high |= E1000_RAH_AV; - break; - } + rar_high = ((uint32_t) addr[4] | ((uint32_t) addr[5] << 8) | E1000_RAH_AV); 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); } /****************************************************************************** @@ -5933,18 +4770,12 @@ e1000_write_vfta(struct e1000_hw *hw, { uint32_t temp; - if (hw->mac_type == e1000_ich8lan) - return; - - if ((hw->mac_type == e1000_82544) && ((offset & 0x1) == 1)) { + 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); } } @@ -5961,9 +4792,6 @@ 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 @@ -5983,7 +4811,6 @@ 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); } } @@ -6013,18 +4840,9 @@ e1000_id_led_init(struct e1000_hw * hw) DEBUGOUT("EEPROM Read Error\n"); return -E1000_ERR_EEPROM; } - - 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++) { + if((eeprom_data== ID_LED_RESERVED_0000) || + (eeprom_data == ID_LED_RESERVED_FFFF)) 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: @@ -6119,44 +4937,6 @@ 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. * @@ -6187,10 +4967,6 @@ 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; @@ -6235,10 +5011,7 @@ 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->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) { + } else if(hw->media_type == e1000_media_type_copper) { E1000_WRITE_REG(hw, LEDCTL, hw->ledctl_mode2); return E1000_SUCCESS; } @@ -6286,10 +5059,7 @@ 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->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) { + } else if(hw->media_type == e1000_media_type_copper) { E1000_WRITE_REG(hw, LEDCTL, hw->ledctl_mode1); return E1000_SUCCESS; } @@ -6327,16 +5097,12 @@ 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); @@ -6356,16 +5122,12 @@ 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); @@ -6388,9 +5150,6 @@ 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); @@ -6571,8 +5330,6 @@ 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; hw->bus_width = e1000_bus_width_pciex_4; @@ -6609,6 +5366,8 @@ 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. @@ -6616,7 +5375,6 @@ 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) @@ -6672,6 +5430,8 @@ 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; @@ -6715,37 +5475,7 @@ e1000_get_cable_length(struct e1000_hw *hw, return -E1000_ERR_PHY; break; } - } else if (hw->phy_type == e1000_phy_gg82563) { - ret_val = e1000_read_phy_reg(hw, GG82563_PHY_DSP_DISTANCE, - &phy_data); - if (ret_val) - return ret_val; - cable_length = phy_data & GG82563_DSPD_CABLE_LENGTH; - - switch (cable_length) { - case e1000_gg_cable_length_60: - *min_length = 0; - *max_length = e1000_igp_cable_length_60; - break; - case e1000_gg_cable_length_60_115: - *min_length = e1000_igp_cable_length_60; - *max_length = e1000_igp_cable_length_115; - break; - case e1000_gg_cable_length_115_150: - *min_length = e1000_igp_cable_length_115; - *max_length = e1000_igp_cable_length_150; - break; - case e1000_gg_cable_length_150: - *min_length = e1000_igp_cable_length_150; - *max_length = e1000_igp_cable_length_180; - break; - default: - return -E1000_ERR_PHY; - 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, @@ -6758,23 +5488,23 @@ e1000_get_cable_length(struct e1000_hw *hw, if(ret_val) return ret_val; - cur_agc_value = phy_data >> IGP01E1000_AGC_LENGTH_SHIFT; + cur_agc = phy_data >> IGP01E1000_AGC_LENGTH_SHIFT; - /* Value bound check. */ - if ((cur_agc_value >= IGP01E1000_AGC_LENGTH_TABLE_SIZE - 1) || - (cur_agc_value == 0)) + /* Array bound check. */ + if((cur_agc >= IGP01E1000_AGC_LENGTH_TABLE_SIZE - 1) || + (cur_agc == 0)) return -E1000_ERR_PHY; - agc_value += cur_agc_value; + agc_value += cur_agc; /* Update minimal AGC value. */ - if (min_agc_value > cur_agc_value) - min_agc_value = cur_agc_value; + if(min_agc > cur_agc) + min_agc = cur_agc; } /* Remove the minimal AGC result for length < 50m */ - if (agc_value < IGP01E1000_PHY_CHANNEL_NUM * e1000_igp_cable_length_50) { - agc_value -= min_agc_value; + if(agc_value < IGP01E1000_PHY_CHANNEL_NUM * e1000_igp_cable_length_50) { + agc_value -= min_agc; /* Get the average length of the remaining 3 channels */ agc_value /= (IGP01E1000_PHY_CHANNEL_NUM - 1); @@ -6790,10 +5520,7 @@ 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 || - 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; + } else if (hw->phy_type == e1000_phy_igp_2) { uint16_t agc_reg_array[IGP02E1000_PHY_CHANNEL_NUM] = {IGP02E1000_PHY_AGC_A, IGP02E1000_PHY_AGC_B, @@ -6808,27 +5535,19 @@ 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_index = (phy_data >> IGP02E1000_AGC_LENGTH_SHIFT) & - IGP02E1000_AGC_LENGTH_MASK; - - /* Array index bound check. */ - if ((cur_agc_index >= IGP02E1000_AGC_LENGTH_TABLE_SIZE) || - (cur_agc_index == 0)) - return -E1000_ERR_PHY; + cur_agc = (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_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]; + 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; + + agc_value += e1000_igp_2_cable_length_table[cur_agc]; } - agc_value -= (e1000_igp_2_cable_length_table[min_agc_index] + - e1000_igp_2_cable_length_table[max_agc_index]); + agc_value -= (e1000_igp_2_cable_length_table[min_agc] + e1000_igp_2_cable_length_table[max_agc]); agc_value /= (IGP02E1000_PHY_CHANNEL_NUM - 2); /* Calculate cable length with the error range of +/- 10 meters. */ @@ -6865,8 +5584,7 @@ e1000_check_polarity(struct e1000_hw *hw, DEBUGFUNC("e1000_check_polarity"); - if ((hw->phy_type == e1000_phy_m88) || - (hw->phy_type == e1000_phy_gg82563)) { + if(hw->phy_type == e1000_phy_m88) { /* return the Polarity bit in the Status register. */ ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_STATUS, &phy_data); @@ -6874,8 +5592,7 @@ 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 || - hw->phy_type == e1000_phy_igp_3 || + } else if(hw->phy_type == e1000_phy_igp || hw->phy_type == e1000_phy_igp_2) { /* Read the Status register to check the speed */ ret_val = e1000_read_phy_reg(hw, IGP01E1000_PHY_PORT_STATUS, @@ -6901,13 +5618,6 @@ 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; } @@ -6920,7 +5630,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 @@ -6935,8 +5645,7 @@ e1000_check_downshift(struct e1000_hw *hw) DEBUGFUNC("e1000_check_downshift"); - if (hw->phy_type == e1000_phy_igp || - hw->phy_type == e1000_phy_igp_3 || + if(hw->phy_type == e1000_phy_igp || hw->phy_type == e1000_phy_igp_2) { ret_val = e1000_read_phy_reg(hw, IGP01E1000_PHY_LINK_HEALTH, &phy_data); @@ -6944,8 +5653,7 @@ e1000_check_downshift(struct e1000_hw *hw) return ret_val; hw->speed_downgraded = (phy_data & IGP01E1000_PLHR_SS_DOWNGRADE) ? 1 : 0; - } else if ((hw->phy_type == e1000_phy_m88) || - (hw->phy_type == e1000_phy_gg82563)) { + } else if(hw->phy_type == e1000_phy_m88) { ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_STATUS, &phy_data); if(ret_val) @@ -6953,9 +5661,6 @@ 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; @@ -7000,9 +5705,7 @@ e1000_config_dsp_after_link_change(struct e1000_hw *hw, if(speed == SPEED_1000) { - ret_val = e1000_get_cable_length(hw, &min_length, &max_length); - if (ret_val) - return ret_val; + e1000_get_cable_length(hw, &min_length, &max_length); if((hw->dsp_config_state == e1000_dsp_config_enabled) && min_length >= e1000_igp_cable_length_50) { @@ -7210,27 +5913,20 @@ 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 - && hw->phy_type != e1000_phy_igp_3) + if(hw->phy_type != e1000_phy_igp && hw->phy_type != e1000_phy_igp_2) return E1000_SUCCESS; /* During driver activity LPLU should not be used or it will attain link * from the lowest speeds starting from 10Mbps. The capability is used for * Dx transitions and states */ - 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) @@ -7245,16 +5941,11 @@ 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 @@ -7290,22 +5981,17 @@ 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 */ @@ -7340,7 +6026,6 @@ 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"); @@ -7348,24 +6033,15 @@ 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 @@ -7397,16 +6073,11 @@ e1000_set_d0_lplu_state(struct e1000_hw *hw, } else { - - 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; + + 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); @@ -7495,7 +6166,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); @@ -7514,7 +6185,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. ****************************************************************************/ @@ -7538,7 +6209,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; } @@ -7645,10 +6316,8 @@ 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; } @@ -7680,18 +6349,15 @@ 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 (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)) + if((fwsm & E1000_FWSM_MODE_MASK) == + (E1000_MNG_IAMT_MODE << E1000_FWSM_MODE_SHIFT)) return TRUE; return FALSE; @@ -7931,6 +6597,7 @@ e1000_set_pci_express_master_disable(struct e1000_hw *hw) E1000_WRITE_REG(hw, CTRL, ctrl); } +#if 0 /*************************************************************************** * * Enables PCI-Express master access. @@ -7940,7 +6607,6 @@ e1000_set_pci_express_master_disable(struct e1000_hw *hw) * returns: - none. * ***************************************************************************/ -#if 0 void e1000_enable_pciex_master(struct e1000_hw *hw) { @@ -8020,11 +6686,8 @@ e1000_get_auto_rd_done(struct e1000_hw *hw) case e1000_82571: case e1000_82572: case e1000_82573: - case e1000_80003es2lan: - case e1000_ich8lan: - while (timeout) { - if (E1000_READ_REG(hw, EECD) & E1000_EECD_AUTO_RD) - break; + while(timeout) { + if (E1000_READ_REG(hw, EECD) & E1000_EECD_AUTO_RD) break; else msec_delay(1); timeout--; } @@ -8064,13 +6727,8 @@ e1000_get_phy_cfg_done(struct e1000_hw *hw) switch (hw->mac_type) { default: - msec_delay_irq(10); + msec_delay(10); break; - case e1000_80003es2lan: - /* Separate *_CFG_DONE_* bit for each port */ - if (E1000_READ_REG(hw, STATUS) & E1000_STATUS_FUNC_1) - cfg_mask = E1000_EEPROM_CFG_DONE_PORT_1; - /* Fall Through */ case e1000_82571: case e1000_82572: while (timeout) { @@ -8088,6 +6746,12 @@ e1000_get_phy_cfg_done(struct e1000_hw *hw) break; } + /* PHY configuration from NVM just starts after EECD_AUTO_RD sets to high. + * Need to wait for PHY configuration completion before accessing NVM + * and PHY. */ + if (hw->mac_type == e1000_82573) + msec_delay(25); + return E1000_SUCCESS; } @@ -8113,11 +6777,6 @@ e1000_get_hw_eeprom_semaphore(struct e1000_hw *hw) if(!hw->eeprom_semaphore_present) return E1000_SUCCESS; - if (hw->mac_type == e1000_80003es2lan) { - /* Get the SW semaphore. */ - if (e1000_get_software_semaphore(hw) != E1000_SUCCESS) - return -E1000_ERR_EEPROM; - } /* Get the FW semaphore. */ timeout = hw->eeprom.word_size + 1; @@ -8163,75 +6822,10 @@ e1000_put_hw_eeprom_semaphore(struct e1000_hw *hw) return; swsm = E1000_READ_REG(hw, SWSM); - if (hw->mac_type == e1000_80003es2lan) { - /* Release both semaphores. */ - swsm &= ~(E1000_SWSM_SMBI | E1000_SWSM_SWESMBI); - } else swsm &= ~(E1000_SWSM_SWESMBI); E1000_WRITE_REG(hw, SWSM, swsm); } -/*************************************************************************** - * - * Obtaining software semaphore bit (SMBI) before resetting PHY. - * - * hw: Struct containing variables accessed by shared code - * - * returns: - E1000_ERR_RESET if fail to obtain semaphore. - * E1000_SUCCESS at any other case. - * - ***************************************************************************/ -static int32_t -e1000_get_software_semaphore(struct e1000_hw *hw) -{ - int32_t timeout = hw->eeprom.word_size + 1; - uint32_t swsm; - - DEBUGFUNC("e1000_get_software_semaphore"); - - if (hw->mac_type != e1000_80003es2lan) - return E1000_SUCCESS; - - while(timeout) { - swsm = E1000_READ_REG(hw, SWSM); - /* If SMBI bit cleared, it is now set and we hold the semaphore */ - if(!(swsm & E1000_SWSM_SMBI)) - break; - msec_delay_irq(1); - timeout--; - } - - if(!timeout) { - DEBUGOUT("Driver can't access device - SMBI bit is set.\n"); - return -E1000_ERR_RESET; - } - - return E1000_SUCCESS; -} - -/*************************************************************************** - * - * Release semaphore bit (SMBI). - * - * hw: Struct containing variables accessed by shared code - * - ***************************************************************************/ -static void -e1000_release_software_semaphore(struct e1000_hw *hw) -{ - uint32_t swsm; - - DEBUGFUNC("e1000_release_software_semaphore"); - - if (hw->mac_type != e1000_80003es2lan) - return; - - swsm = E1000_READ_REG(hw, SWSM); - /* Release the SW semaphores.*/ - swsm &= ~E1000_SWSM_SMBI; - E1000_WRITE_REG(hw, SWSM, swsm); -} - /****************************************************************************** * Checks if PHY reset is blocked due to SOL/IDER session, for example. * Returning E1000_BLK_PHY_RESET isn't necessarily an error. But it's up to @@ -8247,13 +6841,6 @@ 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); @@ -8275,13 +6862,10 @@ e1000_arc_subsystem_valid(struct e1000_hw *hw) case e1000_82571: case e1000_82572: case e1000_82573: - case e1000_80003es2lan: fwsm = E1000_READ_REG(hw, FWSM); if((fwsm & E1000_FWSM_MODE_MASK) != 0) return TRUE; break; - case e1000_ich8lan: - return TRUE; default: break; } @@ -8289,854 +6873,4 @@ 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 375b95518..f1219dd9d 100644 --- a/drivers/net/e1000/e1000_hw.h +++ b/drivers/net/e1000/e1000_hw.h @@ -1,7 +1,7 @@ /******************************************************************************* - Copyright(c) 1999 - 2006 Intel Corporation. All rights reserved. + Copyright(c) 1999 - 2005 Intel Corporation. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free @@ -22,7 +22,6 @@ Contact Information: Linux NICS - e1000-devel Mailing List Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 *******************************************************************************/ @@ -61,8 +60,6 @@ typedef enum { e1000_82571, e1000_82572, e1000_82573, - e1000_80003es2lan, - e1000_ich8lan, e1000_num_macs } e1000_mac_type; @@ -71,7 +68,6 @@ 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; @@ -100,11 +96,6 @@ 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, @@ -147,13 +138,6 @@ typedef enum { e1000_cable_length_undefined = 0xFF } e1000_cable_length; -typedef enum { - e1000_gg_cable_length_60 = 0, - e1000_gg_cable_length_60_115 = 1, - e1000_gg_cable_length_115_150 = 2, - e1000_gg_cable_length_150 = 4 -} e1000_gg_cable_length; - typedef enum { e1000_igp_cable_length_10 = 10, e1000_igp_cable_length_20 = 20, @@ -224,9 +208,6 @@ typedef enum { e1000_phy_m88 = 0, e1000_phy_igp, e1000_phy_igp_2, - e1000_phy_gg82563, - e1000_phy_igp_3, - e1000_phy_ife, e1000_phy_undefined = 0xFF } e1000_phy_type; @@ -300,7 +281,6 @@ typedef enum { #define E1000_ERR_MASTER_REQUESTS_PENDING 10 #define E1000_ERR_HOST_INTERFACE_COMMAND 11 #define E1000_BLK_PHY_RESET 12 -#define E1000_ERR_SWFW_SYNC 13 /* Function prototypes */ /* Initialization */ @@ -322,7 +302,6 @@ 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); @@ -339,7 +318,6 @@ 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 */ @@ -384,7 +362,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); @@ -395,8 +373,11 @@ 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); @@ -407,7 +388,6 @@ 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 */ @@ -421,16 +401,15 @@ 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 @@ -454,7 +433,6 @@ 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 @@ -466,28 +444,16 @@ 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 #define E1000_DEV_ID_82572EI_COPPER 0x107D #define E1000_DEV_ID_82572EI_FIBER 0x107E #define E1000_DEV_ID_82572EI_SERDES 0x107F -#define E1000_DEV_ID_82572EI 0x10B9 #define E1000_DEV_ID_82573E 0x108B #define E1000_DEV_ID_82573E_IAMT 0x108C #define E1000_DEV_ID_82573L 0x109A #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 @@ -558,14 +524,6 @@ 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 @@ -573,7 +531,6 @@ 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 @@ -795,9 +752,6 @@ 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 { @@ -807,7 +761,6 @@ 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 { @@ -818,7 +771,6 @@ 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 */ @@ -877,7 +829,6 @@ 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 */ @@ -899,15 +850,12 @@ struct e1000_ffvt_entry { #define E1000_TXCW 0x00178 /* TX Configuration Word - RW */ #define E1000_RXCW 0x00180 /* RX Configuration Word - RO */ #define E1000_TCTL 0x00400 /* TX Control - RW */ -#define E1000_TCTL_EXT 0x00404 /* Extended TX Control - RW */ #define E1000_TIPG 0x00410 /* TX Inter-packet gap -RW */ #define E1000_TBT 0x00448 /* TX Burst Timer - RW */ #define E1000_AIT 0x00458 /* Adaptive Interframe Spacing Throttle - RW */ #define E1000_LEDCTL 0x00E00 /* LED Control - RW */ #define E1000_EXTCNF_CTRL 0x00F00 /* Extended Configuration Control */ #define E1000_EXTCNF_SIZE 0x00F08 /* Extended Configuration Size */ -#define E1000_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 */ @@ -935,13 +883,11 @@ 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 queue 0 - RW */ -#define E1000_RXDCTL1 0x02928 /* RX Descriptor Control queue 1 - RW */ +#define E1000_RXDCTL 0x02828 /* RX Descriptor Control - RW */ #define E1000_RADV 0x0282C /* RX Interrupt Absolute Delay Timer - RW */ #define E1000_RSRPD 0x02C00 /* RX Small Packet Detect - RW */ #define E1000_RAID 0x02C08 /* Receive Ack Interrupt Delay - RW */ #define E1000_TXDMAC 0x03000 /* TX DMA Control - RW */ -#define E1000_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,11 +996,6 @@ struct e1000_ffvt_entry { #define E1000_FFMT 0x09000 /* Flexible Filter Mask Table - RW Array */ #define E1000_FFVT 0x09800 /* Flexible Filter Value Table - RW Array */ -#define E1000_KUMCTRLSTA 0x00034 /* MAC-PHY interface - RW */ -#define E1000_MDPHYA 0x0003C /* PHY address - RW */ -#define E1000_MANC2H 0x05860 /* Managment Control To Host - RW */ -#define E1000_SW_FW_SYNC 0x05B5C /* Software-Firmware Synchronization - RW */ - #define E1000_GCR 0x05B00 /* PCI-Ex Control */ #define E1000_GSCL_1 0x05B10 /* PCI-Ex Statistic Control #1 */ #define E1000_GSCL_2 0x05B14 /* PCI-Ex Statistic Control #2 */ @@ -1088,7 +1029,6 @@ 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 @@ -1112,19 +1052,6 @@ 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 @@ -1138,7 +1065,6 @@ struct e1000_ffvt_entry { #define E1000_82542_RXCW E1000_RXCW #define E1000_82542_MTA 0x00200 #define E1000_82542_TCTL E1000_TCTL -#define E1000_82542_TCTL_EXT E1000_TCTL_EXT #define E1000_82542_TIPG E1000_TIPG #define E1000_82542_TDBAL 0x00420 #define E1000_82542_TDBAH 0x00424 @@ -1162,14 +1088,11 @@ 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 @@ -1289,8 +1212,6 @@ struct e1000_ffvt_entry { #define E1000_82542_RSSRK E1000_RSSRK #define E1000_82542_RSSIM E1000_RSSIM #define E1000_82542_RSSIR E1000_RSSIR -#define E1000_82542_KUMCTRLSTA E1000_KUMCTRLSTA -#define E1000_82542_SW_FW_SYNC E1000_SW_FW_SYNC /* Statistics counters collected by the MAC */ struct e1000_hw_stats { @@ -1365,16 +1286,13 @@ struct e1000_hw_stats { /* Structure containing variables used by the shared code (e1000_hw.c) */ struct e1000_hw { - uint8_t *hw_addr; + uint8_t __iomem *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; @@ -1385,8 +1303,6 @@ struct e1000_hw { e1000_ffe_config ffe_config_state; 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; @@ -1445,8 +1361,6 @@ struct e1000_hw { boolean_t ifs_params_forced; boolean_t in_ifs_mode; boolean_t mng_reg_access_disabled; - boolean_t leave_av_bit_off; - boolean_t kmrn_lock_loss_workaround_disabled; }; @@ -1479,8 +1393,6 @@ struct e1000_hw { #define E1000_CTRL_FRCDPX 0x00001000 /* Force Duplex */ #define E1000_CTRL_D_UD_EN 0x00002000 /* Dock/Undock enable */ #define E1000_CTRL_D_UD_POLARITY 0x00004000 /* Defined polarity of Dock/Undock indication in SDP[0] */ -#define E1000_CTRL_FORCE_PHY_RESET 0x00008000 /* Reset both PHY ports, through PHYRST_N pin */ -#define E1000_CTRL_EXT_LINK_EN 0x00010000 /* enable link status from external LINK_0 and LINK_1 pins */ #define E1000_CTRL_SWDPIN0 0x00040000 /* SWDPIN 0 value */ #define E1000_CTRL_SWDPIN1 0x00080000 /* SWDPIN 1 value */ #define E1000_CTRL_SWDPIN2 0x00100000 /* SWDPIN 2 value */ @@ -1495,7 +1407,6 @@ 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 */ @@ -1510,8 +1421,6 @@ 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. */ @@ -1520,16 +1429,6 @@ struct e1000_hw { #define E1000_STATUS_BUS64 0x00001000 /* In 64 bit slot */ #define E1000_STATUS_PCIX_MODE 0x00002000 /* PCI-X mode */ #define E1000_STATUS_PCIX_SPEED 0x0000C000 /* PCI-X bus speed */ -#define E1000_STATUS_BMC_SKU_0 0x00100000 /* BMC USB redirect disabled */ -#define E1000_STATUS_BMC_SKU_1 0x00200000 /* BMC SRAM disabled */ -#define E1000_STATUS_BMC_SKU_2 0x00400000 /* BMC SDRAM disabled */ -#define E1000_STATUS_BMC_CRYPTO 0x00800000 /* BMC crypto disabled */ -#define E1000_STATUS_BMC_LITE 0x01000000 /* BMC external code execution disabled */ -#define E1000_STATUS_RGMII_ENABLE 0x02000000 /* RGMII disabled */ -#define E1000_STATUS_FUSE_8 0x04000000 -#define E1000_STATUS_FUSE_9 0x08000000 -#define E1000_STATUS_SERDES0_DIS 0x10000000 /* SERDES disabled on port 0 */ -#define E1000_STATUS_SERDES1_DIS 0x20000000 /* SERDES disabled on port 1 */ /* Constants used to intrepret the masked PCI-X bus speed. */ #define E1000_STATUS_PCIX_SPEED_66 0x00000000 /* PCI-X bus speed 50-66 MHz */ @@ -1569,10 +1468,6 @@ 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 */ @@ -1611,19 +1506,15 @@ struct e1000_hw { #define E1000_CTRL_EXT_LINK_MODE_MASK 0x00C00000 #define E1000_CTRL_EXT_LINK_MODE_GMII 0x00000000 #define E1000_CTRL_EXT_LINK_MODE_TBI 0x00C00000 -#define E1000_CTRL_EXT_LINK_MODE_KMRN 0x00000000 -#define E1000_CTRL_EXT_LINK_MODE_SERDES 0x00C00000 #define E1000_CTRL_EXT_WR_WMARK_MASK 0x03000000 #define E1000_CTRL_EXT_WR_WMARK_256 0x00000000 #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 */ -#define E1000_CRTL_EXT_PB_PAREN 0x01000000 /* packet buffer parity error detection enabled */ -#define E1000_CTRL_EXT_DF_PAREN 0x02000000 /* descriptor FIFO parity error detection enable */ -#define E1000_CTRL_EXT_GHOST_PAREN 0x40000000 /* MDI Control */ #define E1000_MDIC_DATA_MASK 0x0000FFFF @@ -1637,51 +1528,6 @@ struct e1000_hw { #define E1000_MDIC_INT_EN 0x20000000 #define E1000_MDIC_ERROR 0x40000000 -#define E1000_KUMCTRLSTA_MASK 0x0000FFFF -#define E1000_KUMCTRLSTA_OFFSET 0x001F0000 -#define E1000_KUMCTRLSTA_OFFSET_SHIFT 16 -#define E1000_KUMCTRLSTA_REN 0x00200000 - -#define E1000_KUMCTRLSTA_OFFSET_FIFO_CTRL 0x00000000 -#define E1000_KUMCTRLSTA_OFFSET_CTRL 0x00000001 -#define E1000_KUMCTRLSTA_OFFSET_INB_CTRL 0x00000002 -#define E1000_KUMCTRLSTA_OFFSET_DIAG 0x00000003 -#define E1000_KUMCTRLSTA_OFFSET_TIMEOUTS 0x00000004 -#define E1000_KUMCTRLSTA_OFFSET_INB_PARAM 0x00000009 -#define E1000_KUMCTRLSTA_OFFSET_HD_CTRL 0x00000010 -#define E1000_KUMCTRLSTA_OFFSET_M2P_SERDES 0x0000001E -#define E1000_KUMCTRLSTA_OFFSET_M2P_MODES 0x0000001F - -/* FIFO Control */ -#define E1000_KUMCTRLSTA_FIFO_CTRL_RX_BYPASS 0x00000008 -#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 @@ -1744,16 +1590,6 @@ struct e1000_hw { #define E1000_ICR_MNG 0x00040000 /* Manageability event */ #define E1000_ICR_DOCK 0x00080000 /* Dock/Undock */ #define E1000_ICR_INT_ASSERTED 0x80000000 /* If this bit asserted, the driver should claim the interrupt */ -#define E1000_ICR_RXD_FIFO_PAR0 0x00100000 /* queue 0 Rx descriptor FIFO parity error */ -#define E1000_ICR_TXD_FIFO_PAR0 0x00200000 /* queue 0 Tx descriptor FIFO parity error */ -#define E1000_ICR_HOST_ARB_PAR 0x00400000 /* host arb read buffer parity error */ -#define E1000_ICR_PB_PAR 0x00800000 /* packet buffer parity error */ -#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 */ @@ -1774,15 +1610,6 @@ struct e1000_hw { #define E1000_ICS_ACK E1000_ICR_ACK /* Receive Ack frame */ #define E1000_ICS_MNG E1000_ICR_MNG /* Manageability event */ #define E1000_ICS_DOCK E1000_ICR_DOCK /* Dock/Undock */ -#define E1000_ICS_RXD_FIFO_PAR0 E1000_ICR_RXD_FIFO_PAR0 /* queue 0 Rx descriptor FIFO parity error */ -#define E1000_ICS_TXD_FIFO_PAR0 E1000_ICR_TXD_FIFO_PAR0 /* queue 0 Tx descriptor FIFO parity error */ -#define E1000_ICS_HOST_ARB_PAR E1000_ICR_HOST_ARB_PAR /* host arb read buffer parity error */ -#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 */ @@ -1803,15 +1630,6 @@ struct e1000_hw { #define E1000_IMS_ACK E1000_ICR_ACK /* Receive Ack frame */ #define E1000_IMS_MNG E1000_ICR_MNG /* Manageability event */ #define E1000_IMS_DOCK E1000_ICR_DOCK /* Dock/Undock */ -#define E1000_IMS_RXD_FIFO_PAR0 E1000_ICR_RXD_FIFO_PAR0 /* queue 0 Rx descriptor FIFO parity error */ -#define E1000_IMS_TXD_FIFO_PAR0 E1000_ICR_TXD_FIFO_PAR0 /* queue 0 Tx descriptor FIFO parity error */ -#define E1000_IMS_HOST_ARB_PAR E1000_ICR_HOST_ARB_PAR /* host arb read buffer parity error */ -#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 */ @@ -1832,15 +1650,6 @@ struct e1000_hw { #define E1000_IMC_ACK E1000_ICR_ACK /* Receive Ack frame */ #define E1000_IMC_MNG E1000_ICR_MNG /* Manageability event */ #define E1000_IMC_DOCK E1000_ICR_DOCK /* Dock/Undock */ -#define E1000_IMC_RXD_FIFO_PAR0 E1000_ICR_RXD_FIFO_PAR0 /* queue 0 Rx descriptor FIFO parity error */ -#define E1000_IMC_TXD_FIFO_PAR0 E1000_ICR_TXD_FIFO_PAR0 /* queue 0 Tx descriptor FIFO parity error */ -#define E1000_IMC_HOST_ARB_PAR E1000_ICR_HOST_ARB_PAR /* host arb read buffer parity error */ -#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 */ @@ -1899,7 +1708,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 @@ -1910,12 +1719,6 @@ struct e1000_hw { #define E1000_PSRCTL_BSIZE2_SHIFT 6 /* Shift _left_ 6 */ #define E1000_PSRCTL_BSIZE3_SHIFT 14 /* Shift _left_ 14 */ -/* SW_W_SYNC definitions */ -#define E1000_SWFW_EEP_SM 0x0001 -#define E1000_SWFW_PHY0_SM 0x0002 -#define E1000_SWFW_PHY1_SM 0x0004 -#define E1000_SWFW_MAC_CSR_SM 0x0008 - /* Receive Descriptor */ #define E1000_RDT_DELAY 0x0000ffff /* Delay timer (1=1024us) */ #define E1000_RDT_FPDB 0x80000000 /* Flush descriptor block */ @@ -1994,11 +1797,6 @@ struct e1000_hw { #define E1000_TCTL_RTLC 0x01000000 /* Re-transmit on late collision */ #define E1000_TCTL_NRTU 0x02000000 /* No Re-transmit on underrun */ #define E1000_TCTL_MULR 0x10000000 /* Multiple request support */ -/* Extended Transmit Control */ -#define E1000_TCTL_EXT_BST_MASK 0x000003FF /* Backoff Slot Time */ -#define E1000_TCTL_EXT_GCEX_MASK 0x000FFC00 /* Gigabit Carry Extend Padding */ - -#define DEFAULT_80003ES2LAN_TCTL_EXT_GCEX 0x00010000 /* Receive Checksum Control */ #define E1000_RXCSUM_PCSS_MASK 0x000000FF /* Packet Checksum Start */ @@ -2015,10 +1813,9 @@ 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_EX 0x00040000 +#define E1000_MRQC_RSS_FIELD_IPV6_TCP 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 */ @@ -2077,7 +1874,6 @@ struct e1000_hw { #define E1000_MANC_TCO_RESET 0x00010000 /* TCO Reset Occurred */ #define E1000_MANC_RCV_TCO_EN 0x00020000 /* Receive TCO Packets Enabled */ #define E1000_MANC_REPORT_STATUS 0x00040000 /* Status Reporting Enabled */ -#define E1000_MANC_RCV_ALL 0x00080000 /* Receive All Enabled */ #define E1000_MANC_BLK_PHY_RST_ON_IDE 0x00040000 /* Block phy resets */ #define E1000_MANC_EN_MAC_ADDR_FILTER 0x00100000 /* Enable MAC address * filtering */ @@ -2108,15 +1904,6 @@ 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 */ @@ -2175,21 +1962,19 @@ struct e1000_host_command_info { /* PCI-Ex registers */ /* PCI-Ex Control Register */ -#define E1000_GCR_RXD_NO_SNOOP 0x00000001 -#define E1000_GCR_RXDSCW_NO_SNOOP 0x00000002 -#define E1000_GCR_RXDSCR_NO_SNOOP 0x00000004 -#define E1000_GCR_TXD_NO_SNOOP 0x00000008 -#define E1000_GCR_TXDSCW_NO_SNOOP 0x00000010 -#define E1000_GCR_TXDSCR_NO_SNOOP 0x00000020 - -#define PCI_EX_NO_SNOOP_ALL (E1000_GCR_RXD_NO_SNOOP | \ - E1000_GCR_RXDSCW_NO_SNOOP | \ - E1000_GCR_RXDSCR_NO_SNOOP | \ - E1000_GCR_TXD_NO_SNOOP | \ - E1000_GCR_TXDSCW_NO_SNOOP | \ - E1000_GCR_TXDSCR_NO_SNOOP) - -#define PCI_EX_82566_SNOOP_ALL PCI_EX_NO_SNOOP_ALL +#define E1000_GCR_RXD_NO_SNOOP 0x00000001 +#define E1000_GCR_RXDSCW_NO_SNOOP 0x00000002 +#define E1000_GCR_RXDSCR_NO_SNOOP 0x00000004 +#define E1000_GCR_TXD_NO_SNOOP 0x00000008 +#define E1000_GCR_TXDSCW_NO_SNOOP 0x00000010 +#define E1000_GCR_TXDSCR_NO_SNOOP 0x00000020 + +#define PCI_EX_NO_SNOOP_ALL (E1000_GCR_RXD_NO_SNOOP | \ + E1000_GCR_RXDSCW_NO_SNOOP | \ + E1000_GCR_RXDSCR_NO_SNOOP | \ + E1000_GCR TXD_NO_SNOOP | \ + E1000_GCR_TXDSCW_NO_SNOOP | \ + E1000_GCR_TXDSCR_NO_SNOOP) #define E1000_GCR_L1_ACT_WITHOUT_L0S_RX 0x08000000 /* Function Active and Power State to MNG */ @@ -2249,31 +2034,21 @@ 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 #define EEPROM_CHECKSUM_REG 0x003F #define E1000_EEPROM_CFG_DONE 0x00040000 /* MNG config cycle done */ -#define E1000_EEPROM_CFG_DONE_PORT_1 0x00080000 /* ...for second port */ /* 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 @@ -2308,14 +2083,6 @@ 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 /* For checksumming, the sum of all words in the EEPROM should equal 0xBABA. */ #define EEPROM_SUM 0xBABA @@ -2359,11 +2126,8 @@ struct e1000_host_command_info { #define DEFAULT_82542_TIPG_IPGR2 10 #define DEFAULT_82543_TIPG_IPGR2 6 -#define DEFAULT_80003ES2LAN_TIPG_IPGR2 7 #define E1000_TIPG_IPGR2_SHIFT 20 -#define DEFAULT_80003ES2LAN_TIPG_IPGT_10_100 0x00000009 -#define DEFAULT_80003ES2LAN_TIPG_IPGT_1000 0x00000008 #define E1000_TXDMAC_DPP 0x00000001 /* Adaptive IFS defines */ @@ -2387,29 +2151,23 @@ 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 0x0FFF0000 +#define E1000_EXTCNF_CTRL_EXT_CNF_POINTER 0x1FFF0000 #define E1000_EXTCNF_SIZE_EXT_PHY_LENGTH 0x000000FF #define E1000_EXTCNF_SIZE_EXT_DOCK_LENGTH 0x0000FF00 #define E1000_EXTCNF_SIZE_EXT_PCIE_LENGTH 0x00FF0000 -#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 @@ -2464,7 +2222,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 100 +#define PHY_CFG_TIMEOUT 40 #define E1000_TX_BUFFER_SIZE ((uint32_t)1514) @@ -2610,78 +2368,6 @@ struct e1000_host_command_info { #define IGP01E1000_ANALOG_REGS_PAGE 0x20C0 -/* Bits... - * 15-5: page - * 4-0: register offset - */ -#define GG82563_PAGE_SHIFT 5 -#define GG82563_REG(page, reg) \ - (((page) << GG82563_PAGE_SHIFT) | ((reg) & MAX_PHY_REG_ADDRESS)) -#define GG82563_MIN_ALT_REG 30 - -/* GG82563 Specific Registers */ -#define GG82563_PHY_SPEC_CTRL \ - GG82563_REG(0, 16) /* PHY Specific Control */ -#define GG82563_PHY_SPEC_STATUS \ - GG82563_REG(0, 17) /* PHY Specific Status */ -#define GG82563_PHY_INT_ENABLE \ - GG82563_REG(0, 18) /* Interrupt Enable */ -#define GG82563_PHY_SPEC_STATUS_2 \ - GG82563_REG(0, 19) /* PHY Specific Status 2 */ -#define GG82563_PHY_RX_ERR_CNTR \ - GG82563_REG(0, 21) /* Receive Error Counter */ -#define GG82563_PHY_PAGE_SELECT \ - GG82563_REG(0, 22) /* Page Select */ -#define GG82563_PHY_SPEC_CTRL_2 \ - GG82563_REG(0, 26) /* PHY Specific Control 2 */ -#define GG82563_PHY_PAGE_SELECT_ALT \ - GG82563_REG(0, 29) /* Alternate Page Select */ -#define GG82563_PHY_TEST_CLK_CTRL \ - GG82563_REG(0, 30) /* Test Clock Control (use reg. 29 to select) */ - -#define GG82563_PHY_MAC_SPEC_CTRL \ - GG82563_REG(2, 21) /* MAC Specific Control Register */ -#define GG82563_PHY_MAC_SPEC_CTRL_2 \ - GG82563_REG(2, 26) /* MAC Specific Control 2 */ - -#define GG82563_PHY_DSP_DISTANCE \ - GG82563_REG(5, 26) /* DSP Distance */ - -/* Page 193 - Port Control Registers */ -#define GG82563_PHY_KMRN_MODE_CTRL \ - GG82563_REG(193, 16) /* Kumeran Mode Control */ -#define GG82563_PHY_PORT_RESET \ - GG82563_REG(193, 17) /* Port Reset */ -#define GG82563_PHY_REVISION_ID \ - GG82563_REG(193, 18) /* Revision ID */ -#define GG82563_PHY_DEVICE_ID \ - GG82563_REG(193, 19) /* Device ID */ -#define GG82563_PHY_PWR_MGMT_CTRL \ - GG82563_REG(193, 20) /* Power Management Control */ -#define GG82563_PHY_RATE_ADAPT_CTRL \ - GG82563_REG(193, 25) /* Rate Adaptation Control */ - -/* Page 194 - KMRN Registers */ -#define GG82563_PHY_KMRN_FIFO_CTRL_STAT \ - GG82563_REG(194, 16) /* FIFO's Control/Status */ -#define GG82563_PHY_KMRN_CTRL \ - GG82563_REG(194, 17) /* Control */ -#define GG82563_PHY_INBAND_CTRL \ - GG82563_REG(194, 18) /* Inband Control */ -#define GG82563_PHY_KMRN_DIAGNOSTIC \ - GG82563_REG(194, 19) /* Diagnostic */ -#define GG82563_PHY_ACK_TIMEOUTS \ - GG82563_REG(194, 20) /* Acknowledge Timeouts */ -#define GG82563_PHY_ADV_ABILITY \ - GG82563_REG(194, 21) /* Advertised Ability */ -#define GG82563_PHY_LINK_PARTNER_ADV_ABILITY \ - GG82563_REG(194, 23) /* Link Partner Advertised Ability */ -#define GG82563_PHY_ADV_NEXT_PAGE \ - GG82563_REG(194, 24) /* Advertised Next Page */ -#define GG82563_PHY_LINK_PARTNER_ADV_NEXT_PAGE \ - GG82563_REG(194, 25) /* Link Partner Advertised Next page */ -#define GG82563_PHY_KMRN_MISC \ - GG82563_REG(194, 26) /* Misc. */ /* PHY Control Register */ #define MII_CR_SPEED_SELECT_MSB 0x0040 /* bits 6,13: 10=1000, 01=100, 00=10 */ @@ -2892,17 +2578,6 @@ 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 @@ -3006,113 +2681,6 @@ struct e1000_host_command_info { #define IGP01E1000_ANALOG_FUSE_FINE_1 0x0080 #define IGP01E1000_ANALOG_FUSE_FINE_10 0x0500 -/* GG82563 PHY Specific Status Register (Page 0, Register 16 */ -#define GG82563_PSCR_DISABLE_JABBER 0x0001 /* 1=Disable Jabber */ -#define GG82563_PSCR_POLARITY_REVERSAL_DISABLE 0x0002 /* 1=Polarity Reversal Disabled */ -#define GG82563_PSCR_POWER_DOWN 0x0004 /* 1=Power Down */ -#define GG82563_PSCR_COPPER_TRANSMITER_DISABLE 0x0008 /* 1=Transmitter Disabled */ -#define GG82563_PSCR_CROSSOVER_MODE_MASK 0x0060 -#define GG82563_PSCR_CROSSOVER_MODE_MDI 0x0000 /* 00=Manual MDI configuration */ -#define GG82563_PSCR_CROSSOVER_MODE_MDIX 0x0020 /* 01=Manual MDIX configuration */ -#define GG82563_PSCR_CROSSOVER_MODE_AUTO 0x0060 /* 11=Automatic crossover */ -#define GG82563_PSCR_ENALBE_EXTENDED_DISTANCE 0x0080 /* 1=Enable Extended Distance */ -#define GG82563_PSCR_ENERGY_DETECT_MASK 0x0300 -#define GG82563_PSCR_ENERGY_DETECT_OFF 0x0000 /* 00,01=Off */ -#define GG82563_PSCR_ENERGY_DETECT_RX 0x0200 /* 10=Sense on Rx only (Energy Detect) */ -#define GG82563_PSCR_ENERGY_DETECT_RX_TM 0x0300 /* 11=Sense and Tx NLP */ -#define GG82563_PSCR_FORCE_LINK_GOOD 0x0400 /* 1=Force Link Good */ -#define GG82563_PSCR_DOWNSHIFT_ENABLE 0x0800 /* 1=Enable Downshift */ -#define GG82563_PSCR_DOWNSHIFT_COUNTER_MASK 0x7000 -#define GG82563_PSCR_DOWNSHIFT_COUNTER_SHIFT 12 - -/* PHY Specific Status Register (Page 0, Register 17) */ -#define GG82563_PSSR_JABBER 0x0001 /* 1=Jabber */ -#define GG82563_PSSR_POLARITY 0x0002 /* 1=Polarity Reversed */ -#define GG82563_PSSR_LINK 0x0008 /* 1=Link is Up */ -#define GG82563_PSSR_ENERGY_DETECT 0x0010 /* 1=Sleep, 0=Active */ -#define GG82563_PSSR_DOWNSHIFT 0x0020 /* 1=Downshift */ -#define GG82563_PSSR_CROSSOVER_STATUS 0x0040 /* 1=MDIX, 0=MDI */ -#define GG82563_PSSR_RX_PAUSE_ENABLED 0x0100 /* 1=Receive Pause Enabled */ -#define GG82563_PSSR_TX_PAUSE_ENABLED 0x0200 /* 1=Transmit Pause Enabled */ -#define GG82563_PSSR_LINK_UP 0x0400 /* 1=Link Up */ -#define GG82563_PSSR_SPEED_DUPLEX_RESOLVED 0x0800 /* 1=Resolved */ -#define GG82563_PSSR_PAGE_RECEIVED 0x1000 /* 1=Page Received */ -#define GG82563_PSSR_DUPLEX 0x2000 /* 1-Full-Duplex */ -#define GG82563_PSSR_SPEED_MASK 0xC000 -#define GG82563_PSSR_SPEED_10MBPS 0x0000 /* 00=10Mbps */ -#define GG82563_PSSR_SPEED_100MBPS 0x4000 /* 01=100Mbps */ -#define GG82563_PSSR_SPEED_1000MBPS 0x8000 /* 10=1000Mbps */ - -/* PHY Specific Status Register 2 (Page 0, Register 19) */ -#define GG82563_PSSR2_JABBER 0x0001 /* 1=Jabber */ -#define GG82563_PSSR2_POLARITY_CHANGED 0x0002 /* 1=Polarity Changed */ -#define GG82563_PSSR2_ENERGY_DETECT_CHANGED 0x0010 /* 1=Energy Detect Changed */ -#define GG82563_PSSR2_DOWNSHIFT_INTERRUPT 0x0020 /* 1=Downshift Detected */ -#define GG82563_PSSR2_MDI_CROSSOVER_CHANGE 0x0040 /* 1=Crossover Changed */ -#define GG82563_PSSR2_FALSE_CARRIER 0x0100 /* 1=False Carrier */ -#define GG82563_PSSR2_SYMBOL_ERROR 0x0200 /* 1=Symbol Error */ -#define GG82563_PSSR2_LINK_STATUS_CHANGED 0x0400 /* 1=Link Status Changed */ -#define GG82563_PSSR2_AUTO_NEG_COMPLETED 0x0800 /* 1=Auto-Neg Completed */ -#define GG82563_PSSR2_PAGE_RECEIVED 0x1000 /* 1=Page Received */ -#define GG82563_PSSR2_DUPLEX_CHANGED 0x2000 /* 1=Duplex Changed */ -#define GG82563_PSSR2_SPEED_CHANGED 0x4000 /* 1=Speed Changed */ -#define GG82563_PSSR2_AUTO_NEG_ERROR 0x8000 /* 1=Auto-Neg Error */ - -/* PHY Specific Control Register 2 (Page 0, Register 26) */ -#define GG82563_PSCR2_10BT_POLARITY_FORCE 0x0002 /* 1=Force Negative Polarity */ -#define GG82563_PSCR2_1000MB_TEST_SELECT_MASK 0x000C -#define GG82563_PSCR2_1000MB_TEST_SELECT_NORMAL 0x0000 /* 00,01=Normal Operation */ -#define GG82563_PSCR2_1000MB_TEST_SELECT_112NS 0x0008 /* 10=Select 112ns Sequence */ -#define GG82563_PSCR2_1000MB_TEST_SELECT_16NS 0x000C /* 11=Select 16ns Sequence */ -#define GG82563_PSCR2_REVERSE_AUTO_NEG 0x2000 /* 1=Reverse Auto-Negotiation */ -#define GG82563_PSCR2_1000BT_DISABLE 0x4000 /* 1=Disable 1000BASE-T */ -#define GG82563_PSCR2_TRANSMITER_TYPE_MASK 0x8000 -#define GG82563_PSCR2_TRANSMITTER_TYPE_CLASS_B 0x0000 /* 0=Class B */ -#define GG82563_PSCR2_TRANSMITTER_TYPE_CLASS_A 0x8000 /* 1=Class A */ - -/* MAC Specific Control Register (Page 2, Register 21) */ -/* Tx clock speed for Link Down and 1000BASE-T for the following speeds */ -#define GG82563_MSCR_TX_CLK_MASK 0x0007 -#define GG82563_MSCR_TX_CLK_10MBPS_2_5MHZ 0x0004 -#define GG82563_MSCR_TX_CLK_100MBPS_25MHZ 0x0005 -#define GG82563_MSCR_TX_CLK_1000MBPS_2_5MHZ 0x0006 -#define GG82563_MSCR_TX_CLK_1000MBPS_25MHZ 0x0007 - -#define GG82563_MSCR_ASSERT_CRS_ON_TX 0x0010 /* 1=Assert */ - -/* DSP Distance Register (Page 5, Register 26) */ -#define GG82563_DSPD_CABLE_LENGTH 0x0007 /* 0 = <50M; - 1 = 50-80M; - 2 = 80-110M; - 3 = 110-140M; - 4 = >140M */ - -/* Kumeran Mode Control Register (Page 193, Register 16) */ -#define GG82563_KMCR_PHY_LEDS_EN 0x0020 /* 1=PHY LEDs, 0=Kumeran Inband LEDs */ -#define GG82563_KMCR_FORCE_LINK_UP 0x0040 /* 1=Force Link Up */ -#define GG82563_KMCR_SUPPRESS_SGMII_EPD_EXT 0x0080 -#define GG82563_KMCR_MDIO_BUS_SPEED_SELECT_MASK 0x0400 -#define GG82563_KMCR_MDIO_BUS_SPEED_SELECT 0x0400 /* 1=6.25MHz, 0=0.8MHz */ -#define GG82563_KMCR_PASS_FALSE_CARRIER 0x0800 - -/* Power Management Control Register (Page 193, Register 20) */ -#define GG82563_PMCR_ENABLE_ELECTRICAL_IDLE 0x0001 /* 1=Enalbe SERDES Electrical Idle */ -#define GG82563_PMCR_DISABLE_PORT 0x0002 /* 1=Disable Port */ -#define GG82563_PMCR_DISABLE_SERDES 0x0004 /* 1=Disable SERDES */ -#define GG82563_PMCR_REVERSE_AUTO_NEG 0x0008 /* 1=Enable Reverse Auto-Negotiation */ -#define GG82563_PMCR_DISABLE_1000_NON_D0 0x0010 /* 1=Disable 1000Mbps Auto-Neg in non D0 */ -#define GG82563_PMCR_DISABLE_1000 0x0020 /* 1=Disable 1000Mbps Auto-Neg Always */ -#define GG82563_PMCR_REVERSE_AUTO_NEG_D0A 0x0040 /* 1=Enable D0a Reverse Auto-Negotiation */ -#define GG82563_PMCR_FORCE_POWER_STATE 0x0080 /* 1=Force Power State */ -#define GG82563_PMCR_PROGRAMMED_POWER_STATE_MASK 0x0300 -#define GG82563_PMCR_PROGRAMMED_POWER_STATE_DR 0x0000 /* 00=Dr */ -#define GG82563_PMCR_PROGRAMMED_POWER_STATE_D0U 0x0100 /* 01=D0u */ -#define GG82563_PMCR_PROGRAMMED_POWER_STATE_D0A 0x0200 /* 10=D0a */ -#define GG82563_PMCR_PROGRAMMED_POWER_STATE_D3 0x0300 /* 11=D3 */ - -/* In-Band Control Register (Page 194, Register 18) */ -#define GG82563_ICR_DIS_PADDING 0x0010 /* Disable Padding Use */ - /* Bit definitions for valid PHY IDs. */ /* I = Integrated @@ -3127,222 +2695,6 @@ struct e1000_host_command_info { #define M88E1011_I_REV_4 0x04 #define M88E1111_I_PHY_ID 0x01410CC0 #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 diff --git a/drivers/net/e1000/e1000_main.c b/drivers/net/e1000/e1000_main.c index aefcba701..fa2940260 100644 --- a/drivers/net/e1000/e1000_main.c +++ b/drivers/net/e1000/e1000_main.c @@ -1,7 +1,7 @@ /******************************************************************************* - Copyright(c) 1999 - 2006 Intel Corporation. All rights reserved. + Copyright(c) 1999 - 2005 Intel Corporation. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free @@ -22,13 +22,80 @@ 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 + * 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) + * 6.2.14 9/15/05 + * o In AMT enabled configurations, set/reset DRV_LOAD bit on interface + * open/close + * 6.2.13 9/14/05 + * o Invoke e1000_check_mng_mode only for 8257x controllers since it + * accesses the FWSM that is not supported in other controllers + * 6.2.12 9/9/05 + * o Add support for device id E1000_DEV_ID_82546GB_QUAD_COPPER + * o set RCTL:SECRC only for controllers newer than 82543. + * o When the n/w interface comes down reset DRV_LOAD bit to notify f/w. + * This code was moved from e1000_remove to e1000_close + * 6.2.10 9/6/05 + * o Fix error in updating RDT in el1000_alloc_rx_buffers[_ps] -- one off. + * o Enable fc by default on 82573 controllers (do not read eeprom) + * o Fix rx_errors statistic not to include missed_packet_count + * o Fix rx_dropped statistic not to include missed_packet_count + (Padraig Brady) + * 6.2.9 8/30/05 + * o Remove call to update statistics from the controller ib e1000_get_stats + * 6.2.8 8/30/05 + * o Improved algorithm for rx buffer allocation/rdt update + * o Flow control watermarks relative to rx PBA size + * o Simplified 'Tx Hung' detect logic + * 6.2.7 8/17/05 + * o Report rx buffer allocation failures and tx timeout counts in stats + * 6.2.6 8/16/05 + * o Implement workaround for controller erratum -- linear non-tso packet + * following a TSO gets written back prematurely + * 6.2.5 8/15/05 + * o Set netdev->tx_queue_len based on link speed/duplex settings. + * o Fix net_stats.rx_fifo_errors + * o Do not power off PHY if SoL/IDER session is active + * 6.2.4 8/10/05 + * o Fix loopback test setup/cleanup for 82571/3 controllers + * o Fix parsing of outgoing packets (e1000_transfer_dhcp_info) to treat + * all packets as raw + * o Prevent operations that will cause the PHY to be reset if SoL/IDER + * sessions are active and log a message + * 6.2.2 7/21/05 + * o used fixed size descriptors for all MTU sizes, reduces memory load + * 6.1.2 4/13/05 + * o Fixed ethtool diagnostics + * o Enabled flow control to take default eeprom settings + * o Added stats_lock around e1000_read_phy_reg commands to avoid concurrent + * calls, one from mii_ioctl and other from within update_stats while + * processing MIIREG ioctl. + */ + char e1000_driver_name[] = "e1000"; static char e1000_driver_string[] = "Intel(R) PRO/1000 Network Driver"; #ifndef CONFIG_E1000_NAPI @@ -36,9 +103,9 @@ static char e1000_driver_string[] = "Intel(R) PRO/1000 Network Driver"; #else #define DRIVERNAPI "-NAPI" #endif -#define DRV_VERSION "7.1.9-k4"DRIVERNAPI +#define DRV_VERSION "6.3.9-k4"DRIVERNAPI char e1000_driver_version[] = DRV_VERSION; -static char e1000_copyright[] = "Copyright (c) 1999-2006 Intel Corporation."; +static char e1000_copyright[] = "Copyright (c) 1999-2005 Intel Corporation."; /* e1000_pci_tbl - PCI Device ID Table * @@ -73,11 +140,6 @@ 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), @@ -95,28 +157,32 @@ static struct pci_device_id e1000_pci_tbl[] = { INTEL_E1000_ETHERNET_DEVICE(0x108A), INTEL_E1000_ETHERNET_DEVICE(0x108B), INTEL_E1000_ETHERNET_DEVICE(0x108C), - INTEL_E1000_ETHERNET_DEVICE(0x1096), - INTEL_E1000_ETHERNET_DEVICE(0x1098), INTEL_E1000_ETHERNET_DEVICE(0x1099), 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,} }; MODULE_DEVICE_TABLE(pci, e1000_pci_tbl); +int e1000_up(struct e1000_adapter *adapter); +void e1000_down(struct e1000_adapter *adapter); +void e1000_reset(struct e1000_adapter *adapter); +int e1000_set_spd_dplx(struct e1000_adapter *adapter, uint16_t spddplx); +int e1000_setup_all_tx_resources(struct e1000_adapter *adapter); +int e1000_setup_all_rx_resources(struct e1000_adapter *adapter); +void e1000_free_all_tx_resources(struct e1000_adapter *adapter); +void e1000_free_all_rx_resources(struct e1000_adapter *adapter); static int e1000_setup_tx_resources(struct e1000_adapter *adapter, - struct e1000_tx_ring *txdr); + struct e1000_tx_ring *txdr); static int e1000_setup_rx_resources(struct e1000_adapter *adapter, - struct e1000_rx_ring *rxdr); + struct e1000_rx_ring *rxdr); static void e1000_free_tx_resources(struct e1000_adapter *adapter, - struct e1000_tx_ring *tx_ring); + struct e1000_tx_ring *tx_ring); static void e1000_free_rx_resources(struct e1000_adapter *adapter, - struct e1000_rx_ring *rx_ring); + struct e1000_rx_ring *rx_ring); +void e1000_update_stats(struct e1000_adapter *adapter); /* Local Function Prototypes */ @@ -125,6 +191,9 @@ static void e1000_exit_module(void); static int e1000_probe(struct pci_dev *pdev, const struct pci_device_id *ent); static void __devexit e1000_remove(struct pci_dev *pdev); static int e1000_alloc_queues(struct e1000_adapter *adapter); +#ifdef CONFIG_E1000_MQ +static void e1000_setup_queue_mapping(struct e1000_adapter *adapter); +#endif static int e1000_sw_init(struct e1000_adapter *adapter); static int e1000_open(struct net_device *netdev); static int e1000_close(struct net_device *netdev); @@ -140,6 +209,7 @@ 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); @@ -171,40 +241,38 @@ static void e1000_alloc_rx_buffers_ps(struct e1000_adapter *adapter, static int e1000_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd); static int e1000_mii_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd); +void e1000_set_ethtool_ops(struct net_device *netdev); static void e1000_enter_82542_rst(struct e1000_adapter *adapter); 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_tx_timeout_task(struct net_device *dev); static void e1000_smartspeed(struct e1000_adapter *adapter); -static int e1000_82547_fifo_workaround(struct e1000_adapter *adapter, - struct sk_buff *skb); +static inline 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); -static int e1000_suspend(struct pci_dev *pdev, pm_message_t state); #ifdef CONFIG_PM +static int e1000_suspend(struct pci_dev *pdev, pm_message_t state); static int e1000_resume(struct pci_dev *pdev); #endif -static void e1000_shutdown(struct pci_dev *pdev); #ifdef CONFIG_NET_POLL_CONTROLLER /* for netdump / net console */ 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); +#ifdef CONFIG_E1000_MQ +/* for multiple Rx queues */ +void e1000_rx_schedule(void *data); +#endif -static struct pci_error_handlers e1000_err_handler = { - .error_detected = e1000_io_error_detected, - .slot_reset = e1000_io_slot_reset, - .resume = e1000_io_resume, -}; +/* Exported from other modules */ + +extern void e1000_check_options(struct e1000_adapter *adapter); static struct pci_driver e1000_driver = { .name = e1000_driver_name, @@ -212,12 +280,10 @@ static struct pci_driver e1000_driver = { .probe = e1000_probe, .remove = __devexit_p(e1000_remove), /* Power Managment Hooks */ - .suspend = e1000_suspend, #ifdef CONFIG_PM - .resume = e1000_resume, + .suspend = e1000_suspend, + .resume = e1000_resume #endif - .shutdown = e1000_shutdown, - .err_handler = &e1000_err_handler }; MODULE_AUTHOR("Intel Corporation, "); @@ -267,50 +333,12 @@ 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 void +static inline void e1000_irq_disable(struct e1000_adapter *adapter) { atomic_inc(&adapter->irq_sem); @@ -324,7 +352,7 @@ e1000_irq_disable(struct e1000_adapter *adapter) * @adapter: board private structure **/ -static void +static inline void e1000_irq_enable(struct e1000_adapter *adapter) { if (likely(atomic_dec_and_test(&adapter->irq_sem))) { @@ -352,8 +380,7 @@ e1000_update_mng_vlan(struct e1000_adapter *adapter) (vid != old_vid) && !adapter->vlgrp->vlan_devices[old_vid]) e1000_vlan_rx_kill_vid(netdev, old_vid); - } else - adapter->mng_vlan_id = vid; + } } } @@ -365,21 +392,19 @@ 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 void +static inline 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); @@ -388,11 +413,6 @@ 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; } @@ -403,23 +423,21 @@ 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 void +static inline 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); @@ -429,11 +447,6 @@ 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; } @@ -443,10 +456,18 @@ int e1000_up(struct e1000_adapter *adapter) { struct net_device *netdev = adapter->netdev; - int i; + int i, err; /* 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); @@ -463,6 +484,28 @@ 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; + } + +#ifdef CONFIG_E1000_MQ + e1000_setup_queue_mapping(adapter); +#endif + adapter->tx_queue_len = netdev->tx_queue_len; mod_timer(&adapter->watchdog_timer, jiffies); @@ -475,60 +518,23 @@ 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); - +#ifdef CONFIG_E1000_MQ + while (atomic_read(&adapter->rx_sched_call_data.count) != 0); +#endif + 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); @@ -545,17 +551,23 @@ e1000_down(struct e1000_adapter *adapter) e1000_reset(adapter); e1000_clean_all_tx_rings(adapter); e1000_clean_all_rx_rings(adapter); -} -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); + /* 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 @@ -575,15 +587,11 @@ e1000_reset(struct e1000_adapter *adapter) break; case e1000_82571: case e1000_82572: - case e1000_80003es2lan: pba = E1000_PBA_38K; break; case e1000_82573: pba = E1000_PBA_12K; break; - case e1000_ich8lan: - pba = E1000_PBA_8K; - break; default: pba = E1000_PBA_48K; break; @@ -608,19 +616,10 @@ 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; - if (adapter->hw.mac_type == e1000_80003es2lan) - adapter->hw.fc_pause_time = 0xFFFF; - else - adapter->hw.fc_pause_time = E1000_FC_PAUSE_TIME; + adapter->hw.fc_pause_time = E1000_FC_PAUSE_TIME; adapter->hw.fc_send_xon = 1; adapter->hw.fc = adapter->hw.original_fc; @@ -636,23 +635,6 @@ 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); @@ -679,22 +661,18 @@ 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 */ int i, err, pci_using_dac; uint16_t eeprom_data; uint16_t eeprom_apme_mask = E1000_EEPROM_APME; if ((err = pci_enable_device(pdev))) return err; - if (!(err = pci_set_dma_mask(pdev, DMA_64BIT_MASK)) && - !(err = pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK))) { + if (!(err = pci_set_dma_mask(pdev, DMA_64BIT_MASK))) { pci_using_dac = 1; } else { - if ((err = pci_set_dma_mask(pdev, DMA_32BIT_MASK)) && - (err = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK))) { + if ((err = pci_set_dma_mask(pdev, DMA_32BIT_MASK))) { E1000_ERR("No usable DMA configuration, aborting\n"); return err; } @@ -774,39 +752,15 @@ 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) - adapter->ksp3_port_a = 1; - e1000_ksp3_port_a++; - /* Reset for multiple KP3 adapters */ - if (e1000_ksp3_port_a == 4) - e1000_ksp3_port_a = 0; - if (adapter->hw.mac_type >= e1000_82543) { netdev->features = NETIF_F_SG | NETIF_F_HW_CSUM | 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 @@ -822,17 +776,11 @@ e1000_probe(struct pci_dev *pdev, if (pci_using_dac) netdev->features |= NETIF_F_HIGHDMA; - netdev->features |= NETIF_F_LLTX; - + /* hard_start_xmit is safe against parallel locking */ + 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 */ @@ -871,12 +819,15 @@ 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; - INIT_WORK(&adapter->reset_task, - (void (*)(void *))e1000_reset_task, netdev); + INIT_WORK(&adapter->tx_timeout_task, + (void (*)(void *))e1000_tx_timeout_task, netdev); /* we're going to reset, so assume we have no link for now */ @@ -900,15 +851,9 @@ 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: - case e1000_80003es2lan: if (E1000_READ_REG(&adapter->hw, STATUS) & E1000_STATUS_FUNC_1){ e1000_read_eeprom(&adapter->hw, EEPROM_INIT_CONTROL3_PORT_B, 1, &eeprom_data); @@ -964,9 +909,6 @@ 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); @@ -1000,7 +942,6 @@ 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) { @@ -1016,7 +957,7 @@ e1000_remove(struct pci_dev *pdev) unregister_netdev(netdev); #ifdef CONFIG_E1000_NAPI for (i = 0; i < adapter->num_rx_queues; i++) - dev_put(&adapter->polling_netdev[i]); + __dev_put(&adapter->polling_netdev[i]); #endif if (!e1000_check_phy_reset_block(&adapter->hw)) @@ -1029,10 +970,12 @@ 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); +#ifdef CONFIG_E1000_MQ + free_percpu(adapter->cpu_netdev); + free_percpu(adapter->cpu_tx_ring); +#endif free_netdev(netdev); pci_disable_device(pdev); @@ -1068,8 +1011,8 @@ e1000_sw_init(struct e1000_adapter *adapter) pci_read_config_word(pdev, PCI_COMMAND, &hw->pci_cmd_word); - adapter->rx_buffer_len = MAXIMUM_ETHERNET_VLAN_SIZE; - adapter->rx_ps_bsize0 = E1000_RXBUFFER_128; + adapter->rx_buffer_len = E1000_RXBUFFER_2048; + adapter->rx_ps_bsize0 = E1000_RXBUFFER_256; hw->max_frame_size = netdev->mtu + ENET_HEADER_SIZE + ETHERNET_FCS_SIZE; hw->min_frame_size = MINIMUM_ETHERNET_FRAME_SIZE; @@ -1081,6 +1024,13 @@ 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; @@ -1106,8 +1056,40 @@ e1000_sw_init(struct e1000_adapter *adapter) hw->master_slave = E1000_MASTER_SLAVE; } +#ifdef CONFIG_E1000_MQ + /* Number of supported queues */ + switch (hw->mac_type) { + case e1000_82571: + case e1000_82572: + /* These controllers support 2 tx queues, but with a single + * qdisc implementation, multiple tx queues aren't quite as + * interesting. If we can find a logical way of mapping + * flows to a queue, then perhaps we can up the num_tx_queue + * count back to its default. Until then, we run the risk of + * terrible performance due to SACK overload. */ + adapter->num_tx_queues = 1; + adapter->num_rx_queues = 2; + break; + default: + adapter->num_tx_queues = 1; + adapter->num_rx_queues = 1; + break; + } + adapter->num_rx_queues = min(adapter->num_rx_queues, num_online_cpus()); + adapter->num_tx_queues = min(adapter->num_tx_queues, num_online_cpus()); + DPRINTK(DRV, INFO, "Multiqueue Enabled: Rx Queue count = %u %s\n", + adapter->num_rx_queues, + ((adapter->num_rx_queues == 1) + ? ((num_online_cpus() > 1) + ? "(due to unsupported feature in current adapter)" + : "(due to unsupported system configuration)") + : "")); + DPRINTK(DRV, INFO, "Multiqueue Enabled: Tx Queue count = %u\n", + adapter->num_tx_queues); +#else adapter->num_tx_queues = 1; adapter->num_rx_queues = 1; +#endif if (e1000_alloc_queues(adapter)) { DPRINTK(PROBE, ERR, "Unable to allocate memory for queues\n"); @@ -1170,9 +1152,51 @@ e1000_alloc_queues(struct e1000_adapter *adapter) memset(adapter->polling_netdev, 0, size); #endif +#ifdef CONFIG_E1000_MQ + adapter->rx_sched_call_data.func = e1000_rx_schedule; + adapter->rx_sched_call_data.info = adapter->netdev; + + adapter->cpu_netdev = alloc_percpu(struct net_device *); + adapter->cpu_tx_ring = alloc_percpu(struct e1000_tx_ring *); +#endif + return E1000_SUCCESS; } +#ifdef CONFIG_E1000_MQ +static void __devinit +e1000_setup_queue_mapping(struct e1000_adapter *adapter) +{ + int i, cpu; + + adapter->rx_sched_call_data.func = e1000_rx_schedule; + adapter->rx_sched_call_data.info = adapter->netdev; + cpus_clear(adapter->rx_sched_call_data.cpumask); + + adapter->cpu_netdev = alloc_percpu(struct net_device *); + adapter->cpu_tx_ring = alloc_percpu(struct e1000_tx_ring *); + + lock_cpu_hotplug(); + i = 0; + for_each_online_cpu(cpu) { + *per_cpu_ptr(adapter->cpu_tx_ring, cpu) = &adapter->tx_ring[i % adapter->num_tx_queues]; + /* This is incomplete because we'd like to assign separate + * physical cpus to these netdev polling structures and + * avoid saturating a subset of cpus. + */ + if (i < adapter->num_rx_queues) { + *per_cpu_ptr(adapter->cpu_netdev, cpu) = &adapter->polling_netdev[i]; + adapter->rx_ring[i].cpu = cpu; + cpu_set(cpu, adapter->cpumask); + } else + *per_cpu_ptr(adapter->cpu_netdev, cpu) = NULL; + + i++; + } + unlock_cpu_hotplug(); +} +#endif + /** * e1000_open - Called when a network interface is made active * @netdev: network interface device structure @@ -1192,10 +1216,6 @@ 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))) @@ -1206,12 +1226,6 @@ 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; @@ -1255,10 +1269,7 @@ 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); @@ -1283,7 +1294,7 @@ e1000_close(struct net_device *netdev) * @start: address of beginning of memory * @len: length of memory **/ -static boolean_t +static inline boolean_t e1000_check_64k_bound(struct e1000_adapter *adapter, void *start, unsigned long len) { @@ -1316,7 +1327,8 @@ e1000_setup_tx_resources(struct e1000_adapter *adapter, int size; size = sizeof(struct e1000_buffer) * txdr->count; - txdr->buffer_info = vmalloc(size); + + txdr->buffer_info = vmalloc_node(size, pcibus_to_node(pdev->bus)); if (!txdr->buffer_info) { DPRINTK(PROBE, ERR, "Unable to allocate memory for the transmit descriptor ring\n"); @@ -1423,18 +1435,30 @@ e1000_configure_tx(struct e1000_adapter *adapter) /* Setup the HW Tx Head and Tail descriptor pointers */ switch (adapter->num_tx_queues) { + case 2: + tdba = adapter->tx_ring[1].dma; + tdlen = adapter->tx_ring[1].count * + sizeof(struct e1000_tx_desc); + E1000_WRITE_REG(hw, TDBAL1, (tdba & 0x00000000ffffffffULL)); + E1000_WRITE_REG(hw, TDBAH1, (tdba >> 32)); + E1000_WRITE_REG(hw, TDLEN1, tdlen); + E1000_WRITE_REG(hw, TDH1, 0); + E1000_WRITE_REG(hw, TDT1, 0); + adapter->tx_ring[1].tdh = E1000_TDH1; + adapter->tx_ring[1].tdt = E1000_TDT1; + /* Fall Through */ case 1: default: tdba = adapter->tx_ring[0].dma; tdlen = adapter->tx_ring[0].count * sizeof(struct e1000_tx_desc); - E1000_WRITE_REG(hw, TDLEN, tdlen); - E1000_WRITE_REG(hw, TDBAH, (tdba >> 32)); E1000_WRITE_REG(hw, TDBAL, (tdba & 0x00000000ffffffffULL)); - E1000_WRITE_REG(hw, TDT, 0); + E1000_WRITE_REG(hw, TDBAH, (tdba >> 32)); + E1000_WRITE_REG(hw, TDLEN, tdlen); 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); + E1000_WRITE_REG(hw, TDT, 0); + adapter->tx_ring[0].tdh = E1000_TDH; + adapter->tx_ring[0].tdt = E1000_TDT; break; } @@ -1453,10 +1477,6 @@ e1000_configure_tx(struct e1000_adapter *adapter) ipgr1 = DEFAULT_82542_TIPG_IPGR1; ipgr2 = DEFAULT_82542_TIPG_IPGR2; break; - case e1000_80003es2lan: - ipgr1 = DEFAULT_82543_TIPG_IPGR1; - ipgr2 = DEFAULT_80003ES2LAN_TIPG_IPGR2; - break; default: ipgr1 = DEFAULT_82543_TIPG_IPGR1; ipgr2 = DEFAULT_82543_TIPG_IPGR2; @@ -1477,13 +1497,10 @@ e1000_configure_tx(struct e1000_adapter *adapter) tctl = E1000_READ_REG(hw, TCTL); tctl &= ~E1000_TCTL_CT; - tctl |= E1000_TCTL_PSP | E1000_TCTL_RTLC | + tctl |= E1000_TCTL_EN | E1000_TCTL_PSP | E1000_TCTL_RTLC | (E1000_COLLISION_THRESHOLD << E1000_CT_SHIFT); -#ifdef DISABLE_MULR - /* disable Multiple Reads for debugging */ - tctl &= ~E1000_TCTL_MULR; -#endif + E1000_WRITE_REG(hw, TCTL, tctl); if (hw->mac_type == e1000_82571 || hw->mac_type == e1000_82572) { tarc = E1000_READ_REG(hw, TARC0); @@ -1496,15 +1513,6 @@ e1000_configure_tx(struct e1000_adapter *adapter) else tarc |= (1 << 28); E1000_WRITE_REG(hw, TARC1, tarc); - } else if (hw->mac_type == e1000_80003es2lan) { - tarc = E1000_READ_REG(hw, TARC0); - tarc |= 1; - if (hw->media_type == e1000_media_type_internal_serdes) - tarc |= (1 << 20); - E1000_WRITE_REG(hw, TARC0, tarc); - tarc = E1000_READ_REG(hw, TARC1); - tarc |= 1; - E1000_WRITE_REG(hw, TARC1, tarc); } e1000_config_collision_dist(hw); @@ -1523,9 +1531,6 @@ e1000_configure_tx(struct e1000_adapter *adapter) if (hw->mac_type == e1000_82544 && hw->bus_type == e1000_bus_type_pcix) adapter->pcix_82544 = 1; - - E1000_WRITE_REG(hw, TCTL, tctl); - } /** @@ -1544,7 +1549,7 @@ e1000_setup_rx_resources(struct e1000_adapter *adapter, int size, desc_len; size = sizeof(struct e1000_buffer) * rxdr->count; - rxdr->buffer_info = vmalloc(size); + rxdr->buffer_info = vmalloc_node(size, pcibus_to_node(pdev->bus)); if (!rxdr->buffer_info) { DPRINTK(PROBE, ERR, "Unable to allocate memory for the receive descriptor ring\n"); @@ -1686,6 +1691,9 @@ 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 @@ -1697,21 +1705,14 @@ e1000_setup_rctl(struct e1000_adapter *adapter) rctl |= E1000_RCTL_LPE; /* Setup buffer sizes */ - 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; + 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) { case E1000_RXBUFFER_2048: default: rctl |= E1000_RCTL_SZ_2048; @@ -1726,6 +1727,7 @@ e1000_setup_rctl(struct e1000_adapter *adapter) case E1000_RXBUFFER_16384: rctl |= E1000_RCTL_SZ_16384; break; + } } #ifndef CONFIG_E1000_DISABLE_PACKET_SPLIT @@ -1751,7 +1753,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; + rctl |= E1000_RCTL_DTYP_PS | E1000_RCTL_SECRC; psrctl |= adapter->rx_ps_bsize0 >> E1000_PSRCTL_BSIZE0_SHIFT; @@ -1788,9 +1790,12 @@ e1000_configure_rx(struct e1000_adapter *adapter) uint64_t rdba; struct e1000_hw *hw = &adapter->hw; uint32_t rdlen, rctl, rxcsum, ctrl_ext; +#ifdef CONFIG_E1000_MQ + uint32_t reta, mrqc; + int i; +#endif if (adapter->rx_ps_pages) { - /* this is a 32 byte descriptor */ rdlen = adapter->rx_ring[0].count * sizeof(union e1000_rx_desc_packet_split); adapter->clean_rx = e1000_clean_rx_irq_ps; @@ -1819,7 +1824,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_INT_TIMER_CLR; + ctrl_ext |= E1000_CTRL_EXT_CANC; #ifdef CONFIG_E1000_NAPI /* Auto-Mask interrupts upon ICR read. */ ctrl_ext |= E1000_CTRL_EXT_IAME; @@ -1832,19 +1837,71 @@ e1000_configure_rx(struct e1000_adapter *adapter) /* Setup the HW Rx Head and Tail Descriptor Pointers and * the Base and Length of the Rx Descriptor Ring */ switch (adapter->num_rx_queues) { +#ifdef CONFIG_E1000_MQ + case 2: + rdba = adapter->rx_ring[1].dma; + E1000_WRITE_REG(hw, RDBAL1, (rdba & 0x00000000ffffffffULL)); + E1000_WRITE_REG(hw, RDBAH1, (rdba >> 32)); + E1000_WRITE_REG(hw, RDLEN1, rdlen); + E1000_WRITE_REG(hw, RDH1, 0); + E1000_WRITE_REG(hw, RDT1, 0); + adapter->rx_ring[1].rdh = E1000_RDH1; + adapter->rx_ring[1].rdt = E1000_RDT1; + /* Fall Through */ +#endif case 1: default: rdba = adapter->rx_ring[0].dma; - E1000_WRITE_REG(hw, RDLEN, rdlen); - E1000_WRITE_REG(hw, RDBAH, (rdba >> 32)); E1000_WRITE_REG(hw, RDBAL, (rdba & 0x00000000ffffffffULL)); - E1000_WRITE_REG(hw, RDT, 0); + E1000_WRITE_REG(hw, RDBAH, (rdba >> 32)); + E1000_WRITE_REG(hw, RDLEN, rdlen); 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); + E1000_WRITE_REG(hw, RDT, 0); + adapter->rx_ring[0].rdh = E1000_RDH; + adapter->rx_ring[0].rdt = E1000_RDT; break; } +#ifdef CONFIG_E1000_MQ + if (adapter->num_rx_queues > 1) { + uint32_t random[10]; + + get_random_bytes(&random[0], 40); + + if (hw->mac_type <= e1000_82572) { + E1000_WRITE_REG(hw, RSSIR, 0); + E1000_WRITE_REG(hw, RSSIM, 0); + } + + switch (adapter->num_rx_queues) { + case 2: + default: + reta = 0x00800080; + mrqc = E1000_MRQC_ENABLE_RSS_2Q; + break; + } + + /* Fill out redirection table */ + for (i = 0; i < 32; i++) + E1000_WRITE_REG_ARRAY(hw, RETA, i, reta); + /* Fill out hash function seeds */ + for (i = 0; i < 10; i++) + E1000_WRITE_REG_ARRAY(hw, RSSRK, i, random[i]); + + mrqc |= (E1000_MRQC_RSS_FIELD_IPV4 | + E1000_MRQC_RSS_FIELD_IPV4_TCP); + E1000_WRITE_REG(hw, MRQC, mrqc); + } + + /* Multiqueue and packet checksumming are mutually exclusive. */ + if (hw->mac_type >= e1000_82571) { + rxcsum = E1000_READ_REG(hw, RXCSUM); + rxcsum |= E1000_RXCSUM_PCSD; + E1000_WRITE_REG(hw, RXCSUM, rxcsum); + } + +#else + /* Enable 82543 Receive Checksum Offload for TCP and UDP */ if (hw->mac_type >= e1000_82543) { rxcsum = E1000_READ_REG(hw, RXCSUM); @@ -1863,6 +1920,10 @@ e1000_configure_rx(struct e1000_adapter *adapter) } E1000_WRITE_REG(hw, RXCSUM, rxcsum); } +#endif /* CONFIG_E1000_MQ */ + + if (hw->mac_type == e1000_82573) + E1000_WRITE_REG(hw, ERT, 0x0100); /* Enable Receives */ E1000_WRITE_REG(hw, RCTL, rctl); @@ -1908,7 +1969,7 @@ e1000_free_all_tx_resources(struct e1000_adapter *adapter) e1000_free_tx_resources(adapter, &adapter->tx_ring[i]); } -static void +static inline void e1000_unmap_and_free_tx_resource(struct e1000_adapter *adapter, struct e1000_buffer *buffer_info) { @@ -2203,12 +2264,6 @@ 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) @@ -2247,18 +2302,14 @@ 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 < mta_reg_count; i++) { + for (i = 0; i < E1000_NUM_MTA_REGISTERS; i++) E1000_WRITE_REG_ARRAY(hw, MTA, i, 0); - E1000_WRITE_FLUSH(hw); - } /* load any remaining addresses into the hash table */ @@ -2331,19 +2382,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; - 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"); - } + uint32_t link; + + e1000_check_for_link(&adapter->hw); if (adapter->hw.mac_type == e1000_82573) { e1000_enable_tx_pkt_filtering(&adapter->hw); if (adapter->mng_vlan_id != adapter->hw.mng_cookie.vlan_id) @@ -2358,7 +2409,6 @@ e1000_watchdog(unsigned long data) if (link) { if (!netif_carrier_ok(netdev)) { - boolean_t txb2b = 1; e1000_get_speed_and_duplex(&adapter->hw, &adapter->link_speed, &adapter->link_duplex); @@ -2368,60 +2418,20 @@ e1000_watchdog(unsigned long data) adapter->link_duplex == FULL_DUPLEX ? "Full Duplex" : "Half Duplex"); - /* tweak tx_queue_len according to speed/duplex - * and adjust the timeout factor */ + /* tweak tx_queue_len according to speed/duplex */ netdev->tx_queue_len = adapter->tx_queue_len; adapter->tx_timeout_factor = 1; - switch (adapter->link_speed) { - case SPEED_10: - txb2b = 0; - netdev->tx_queue_len = 10; - adapter->tx_timeout_factor = 8; - break; - case SPEED_100: - txb2b = 0; - netdev->tx_queue_len = 100; - /* maybe add some timeout factor ? */ - break; - } - - if ((adapter->hw.mac_type == e1000_82571 || - adapter->hw.mac_type == e1000_82572) && - txb2b == 0) { -#define SPEED_MODE_BIT (1 << 21) - uint32_t tarc0; - tarc0 = E1000_READ_REG(&adapter->hw, TARC0); - tarc0 &= ~SPEED_MODE_BIT; - E1000_WRITE_REG(&adapter->hw, TARC0, tarc0); - } - -#ifdef NETIF_F_TSO - /* disable TSO for pcie and 10/100 speeds, to avoid - * some hardware issues */ - if (!adapter->tso_force && - adapter->hw.bus_type == e1000_bus_type_pci_express){ + if (adapter->link_duplex == HALF_DUPLEX) { switch (adapter->link_speed) { case SPEED_10: - case SPEED_100: - DPRINTK(PROBE,INFO, - "10/100 speed: disabling TSO\n"); - netdev->features &= ~NETIF_F_TSO; - break; - case SPEED_1000: - netdev->features |= NETIF_F_TSO; + netdev->tx_queue_len = 10; + adapter->tx_timeout_factor = 8; break; - default: - /* oops */ + case SPEED_100: + netdev->tx_queue_len = 100; break; } } -#endif - - /* enable transmits in the hardware, need to do this - * after setting TARC0 */ - tctl = E1000_READ_REG(&adapter->hw, TCTL); - tctl |= E1000_TCTL_EN; - E1000_WRITE_REG(&adapter->hw, TCTL, tctl); netif_carrier_on(netdev); netif_wake_queue(netdev); @@ -2436,16 +2446,6 @@ e1000_watchdog(unsigned long data) netif_carrier_off(netdev); netif_stop_queue(netdev); mod_timer(&adapter->phy_info_timer, jiffies + 2 * HZ); - - /* 80003ES2LAN workaround-- - * For packet buffer work-around on link down event; - * disable receives in the ISR and - * reset device here in the watchdog - */ - if (adapter->hw.mac_type == e1000_80003es2lan) { - /* reset device */ - schedule_work(&adapter->reset_task); - } } e1000_smartspeed(adapter); @@ -2465,14 +2465,16 @@ e1000_watchdog(unsigned long data) e1000_update_adaptive(&adapter->hw); +#ifdef CONFIG_E1000_MQ + txdr = *per_cpu_ptr(adapter->cpu_tx_ring, smp_processor_id()); +#endif if (!netif_carrier_ok(netdev)) { if (E1000_DESC_UNUSED(txdr) + 1 < txdr->count) { /* We've lost link, so the controller stops DMA, * but we've got queued Tx work that's never going * to get done, so reset controller to flush Tx. * (Do the reset outside of interrupt context). */ - adapter->tx_timeout_count++; - schedule_work(&adapter->reset_task); + schedule_work(&adapter->tx_timeout_task); } } @@ -2511,7 +2513,7 @@ e1000_watchdog(unsigned long data) #define E1000_TX_FLAGS_VLAN_MASK 0xffff0000 #define E1000_TX_FLAGS_VLAN_SHIFT 16 -static int +static inline int e1000_tso(struct e1000_adapter *adapter, struct e1000_tx_ring *tx_ring, struct sk_buff *skb) { @@ -2524,7 +2526,7 @@ e1000_tso(struct e1000_adapter *adapter, struct e1000_tx_ring *tx_ring, uint8_t ipcss, ipcso, tucss, tucso, hdr_len; int err; - if (skb_is_gso(skb)) { + if (skb_shinfo(skb)->tso_size) { if (skb_header_cloned(skb)) { err = pskb_expand_head(skb, 0, 0, GFP_ATOMIC); if (err) @@ -2532,8 +2534,8 @@ 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 == htons(ETH_P_IP)) { + mss = skb_shinfo(skb)->tso_size; + if (skb->protocol == ntohs(ETH_P_IP)) { skb->nh.iph->tot_len = 0; skb->nh.iph->check = 0; skb->h.th->check = @@ -2591,7 +2593,7 @@ e1000_tso(struct e1000_adapter *adapter, struct e1000_tx_ring *tx_ring, return FALSE; } -static boolean_t +static inline boolean_t e1000_tx_csum(struct e1000_adapter *adapter, struct e1000_tx_ring *tx_ring, struct sk_buff *skb) { @@ -2627,7 +2629,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<data_len && tx_ring->last_tx_tso && - !skb_is_gso(skb)) { + !skb_shinfo(skb)->tso_size) { tx_ring->last_tx_tso = 0; size -= 4; } @@ -2736,7 +2738,7 @@ e1000_tx_map(struct e1000_adapter *adapter, struct e1000_tx_ring *tx_ring, return count; } -static void +static inline void e1000_tx_queue(struct e1000_adapter *adapter, struct e1000_tx_ring *tx_ring, int tx_flags, int count) { @@ -2800,7 +2802,7 @@ e1000_tx_queue(struct e1000_adapter *adapter, struct e1000_tx_ring *tx_ring, #define E1000_FIFO_HDR 0x10 #define E1000_82547_PAD_LEN 0x3E0 -static int +static inline int e1000_82547_fifo_workaround(struct e1000_adapter *adapter, struct sk_buff *skb) { uint32_t fifo_space = adapter->tx_fifo_size - adapter->tx_fifo_head; @@ -2827,7 +2829,7 @@ no_fifo_stall_required: } #define MINIMUM_DHCP_PACKET_SIZE 282 -static int +static inline int e1000_transfer_dhcp_info(struct e1000_adapter *adapter, struct sk_buff *skb) { struct e1000_hw *hw = &adapter->hw; @@ -2838,7 +2840,7 @@ e1000_transfer_dhcp_info(struct e1000_adapter *adapter, struct sk_buff *skb) E1000_MNG_DHCP_COOKIE_STATUS_VLAN_SUPPORT)) ) return 0; } - if (skb->len > MINIMUM_DHCP_PACKET_SIZE) { + if ((skb->len > MINIMUM_DHCP_PACKET_SIZE) && (!skb->protocol)) { struct ethhdr *eth = (struct ethhdr *) skb->data; if ((htons(ETH_P_IP) == eth->h_proto)) { const struct iphdr *ip = @@ -2875,11 +2877,15 @@ 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; +#ifdef CONFIG_E1000_MQ + tx_ring = *per_cpu_ptr(adapter->cpu_tx_ring, smp_processor_id()); +#else tx_ring = adapter->tx_ring; +#endif if (unlikely(skb->len <= 0)) { dev_kfree_skb_any(skb); @@ -2887,8 +2893,8 @@ 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 + mss = skb_shinfo(skb)->tso_size; + /* 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 @@ -2899,30 +2905,21 @@ e1000_xmit_frame(struct sk_buff *skb, struct net_device *netdev) max_per_txd = min(mss << 2, max_per_txd); max_txd_pwr = fls(max_per_txd) - 1; - /* TSO Workaround for 82571/2/3 Controllers -- if skb->data + /* TSO Workaround for 82571/2 Controllers -- if skb->data * points to just header, pull a few bytes of payload from * frags into skb->data */ hdr_len = ((skb->h.raw - skb->data) + (skb->h.th->doff << 2)); - if (skb->data_len && (hdr_len == (skb->len - skb->data_len))) { - switch (adapter->hw.mac_type) { - unsigned int pull_size; - 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)) { - DPRINTK(DRV, ERR, - "__pskb_pull_tail failed.\n"); - dev_kfree_skb_any(skb); - return NETDEV_TX_OK; - } - len = skb->len - skb->data_len; - break; - default: - /* do nothing */ - break; + if (skb->data_len && (hdr_len == (skb->len - skb->data_len)) && + (adapter->hw.mac_type == e1000_82571 || + adapter->hw.mac_type == e1000_82572)) { + unsigned int pull_size; + pull_size = min((unsigned int)4, skb->data_len); + if (!__pskb_pull_tail(skb, pull_size)) { + printk(KERN_ERR "__pskb_pull_tail failed.\n"); + dev_kfree_skb_any(skb); + return NETDEV_TX_OK; } + len = skb->len - skb->data_len; } } @@ -2937,7 +2934,8 @@ e1000_xmit_frame(struct sk_buff *skb, struct net_device *netdev) #ifdef NETIF_F_TSO /* Controller Erratum workaround */ - if (!skb->data_len && tx_ring->last_tx_tso && !skb_is_gso(skb)) + if (!skb->data_len && tx_ring->last_tx_tso && + !skb_shinfo(skb)->tso_size) count++; #endif @@ -2960,9 +2958,7 @@ e1000_xmit_frame(struct sk_buff *skb, struct net_device *netdev) if (adapter->pcix_82544) count += nr_frags; - - if (adapter->hw.tx_pkt_filtering && - (adapter->hw.mac_type == e1000_82573)) + if (adapter->hw.tx_pkt_filtering && (adapter->hw.mac_type == e1000_82573) ) e1000_transfer_dhcp_info(adapter, skb); local_irq_save(flags); @@ -3012,7 +3008,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 == htons(ETH_P_IP))) + if (likely(skb->protocol == ntohs(ETH_P_IP))) tx_flags |= E1000_TX_FLAGS_IPV4; e1000_tx_queue(adapter, tx_ring, tx_flags, @@ -3040,16 +3036,17 @@ e1000_tx_timeout(struct net_device *netdev) struct e1000_adapter *adapter = netdev_priv(netdev); /* Do the reset outside of interrupt context */ - adapter->tx_timeout_count++; - schedule_work(&adapter->reset_task); + schedule_work(&adapter->tx_timeout_task); } static void -e1000_reset_task(struct net_device *netdev) +e1000_tx_timeout_task(struct net_device *netdev) { struct e1000_adapter *adapter = netdev_priv(netdev); - e1000_reinit_locked(adapter); + adapter->tx_timeout_count++; + e1000_down(adapter); + e1000_up(adapter); } /** @@ -3082,7 +3079,6 @@ e1000_change_mtu(struct net_device *netdev, int new_mtu) { struct e1000_adapter *adapter = netdev_priv(netdev); int max_frame = new_mtu + ENET_HEADER_SIZE + ETHERNET_FCS_SIZE; - uint16_t eeprom_data = 0; if ((max_frame < MINIMUM_ETHERNET_FRAME_SIZE) || (max_frame > MAX_JUMBO_FRAME_SIZE)) { @@ -3092,30 +3088,16 @@ e1000_change_mtu(struct net_device *netdev, int new_mtu) /* Adapter-specific max frame size limits. */ switch (adapter->hw.mac_type) { - case e1000_undefined ... e1000_82542_rev2_1: - case e1000_ich8lan: + case e1000_82542_rev2_0: + case e1000_82542_rev2_1: + case e1000_82573: if (max_frame > MAXIMUM_ETHERNET_FRAME_SIZE) { DPRINTK(PROBE, ERR, "Jumbo Frames not supported.\n"); return -EINVAL; } break; - case e1000_82573: - /* only enable jumbo frames if ASPM is disabled completely - * this means both bits must be zero in 0x1A bits 3:2 */ - e1000_read_eeprom(&adapter->hw, EEPROM_INIT_3GIO_3, 1, - &eeprom_data); - if (eeprom_data & EEPROM_WORD1A_ASPM_MASK) { - if (max_frame > MAXIMUM_ETHERNET_FRAME_SIZE) { - DPRINTK(PROBE, ERR, - "Jumbo Frames not supported.\n"); - return -EINVAL; - } - break; - } - /* fall through to get support */ case e1000_82571: case e1000_82572: - case e1000_80003es2lan: #define MAX_STD_JUMBO_FRAME_SIZE 9234 if (max_frame > MAX_STD_JUMBO_FRAME_SIZE) { DPRINTK(PROBE, ERR, "MTU > 9216 not supported.\n"); @@ -3127,36 +3109,34 @@ e1000_change_mtu(struct net_device *netdev, int new_mtu) break; } - /* 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; + + 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; + } + } netdev->mtu = new_mtu; - if (netif_running(netdev)) - e1000_reinit_locked(adapter); + if (netif_running(netdev)) { + e1000_down(adapter); + e1000_up(adapter); + } adapter->hw.max_frame_size = max_frame; @@ -3172,21 +3152,11 @@ 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, @@ -3201,15 +3171,12 @@ 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); @@ -3237,16 +3204,12 @@ 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); @@ -3268,8 +3231,6 @@ 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); @@ -3277,7 +3238,6 @@ 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 */ @@ -3291,14 +3251,11 @@ e1000_update_stats(struct e1000_adapter *adapter) /* Rx Errors */ - /* RLEC on some newer hardware can be incorrect so build - * our own version based on RUC and ROC */ adapter->net_stats.rx_errors = adapter->stats.rxerrc + adapter->stats.crcerrs + adapter->stats.algnerrc + - adapter->stats.ruc + adapter->stats.roc + - adapter->stats.cexterr; - adapter->net_stats.rx_length_errors = adapter->stats.ruc + - adapter->stats.roc; + adapter->stats.rlec + adapter->stats.cexterr; + adapter->net_stats.rx_dropped = 0; + adapter->net_stats.rx_length_errors = adapter->stats.rlec; adapter->net_stats.rx_crc_errors = adapter->stats.crcerrs; adapter->net_stats.rx_frame_errors = adapter->stats.algnerrc; adapter->net_stats.rx_missed_errors = adapter->stats.mpc; @@ -3331,6 +3288,29 @@ e1000_update_stats(struct e1000_adapter *adapter) spin_unlock_irqrestore(&adapter->stats_lock, flags); } +#ifdef CONFIG_E1000_MQ +void +e1000_rx_schedule(void *data) +{ + struct net_device *poll_dev, *netdev = data; + struct e1000_adapter *adapter = netdev->priv; + int this_cpu = get_cpu(); + + poll_dev = *per_cpu_ptr(adapter->cpu_netdev, this_cpu); + if (poll_dev == NULL) { + put_cpu(); + return; + } + + if (likely(netif_rx_schedule_prep(poll_dev))) + __netif_rx_schedule(poll_dev); + else + e1000_irq_enable(adapter); + + put_cpu(); +} +#endif + /** * e1000_intr - Interrupt Handler * @irq: interrupt number @@ -3344,7 +3324,7 @@ e1000_intr(int irq, void *data, struct pt_regs *regs) struct net_device *netdev = data; struct e1000_adapter *adapter = netdev_priv(netdev); struct e1000_hw *hw = &adapter->hw; - uint32_t rctl, icr = E1000_READ_REG(hw, ICR); + uint32_t icr = E1000_READ_REG(hw, ICR); #ifndef CONFIG_E1000_NAPI int i; #else @@ -3366,17 +3346,6 @@ e1000_intr(int irq, void *data, struct pt_regs *regs) if (unlikely(icr & (E1000_ICR_RXSEQ | E1000_ICR_LSC))) { hw->get_link_status = 1; - /* 80003ES2LAN workaround-- - * For packet buffer work-around on link down event; - * disable receives here in the ISR and - * reset adapter in watchdog - */ - if (netif_carrier_ok(netdev) && - (adapter->hw.mac_type == e1000_80003es2lan)) { - /* disable receives */ - rctl = E1000_READ_REG(hw, RCTL); - E1000_WRITE_REG(hw, RCTL, rctl & ~E1000_RCTL_EN); - } mod_timer(&adapter->watchdog_timer, jiffies); } @@ -3386,11 +3355,26 @@ 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(netdev))) - __netif_rx_schedule(netdev); +#ifdef CONFIG_E1000_MQ + if (atomic_read(&adapter->rx_sched_call_data.count) == 0) { + /* We must setup the cpumask once count == 0 since + * each cpu bit is cleared when the work is done. */ + adapter->rx_sched_call_data.cpumask = adapter->cpumask; + atomic_add(adapter->num_rx_queues - 1, &adapter->irq_sem); + atomic_set(&adapter->rx_sched_call_data.count, + adapter->num_rx_queues); + smp_call_async_mask(&adapter->rx_sched_call_data); + } else { + printk("call_data.count == %u\n", atomic_read(&adapter->rx_sched_call_data.count)); + } +#else /* if !CONFIG_E1000_MQ */ + if (likely(netif_rx_schedule_prep(&adapter->polling_netdev[0]))) + __netif_rx_schedule(&adapter->polling_netdev[0]); else e1000_irq_enable(adapter); -#else +#endif /* CONFIG_E1000_MQ */ + +#else /* if !CONFIG_E1000_NAPI */ /* Writing IMC and IMS is needed for 82547. * Due to Hub Link bus being occupied, an interrupt * de-assertion message is not able to be sent. @@ -3414,7 +3398,7 @@ e1000_intr(int irq, void *data, struct pt_regs *regs) if (hw->mac_type == e1000_82547 || hw->mac_type == e1000_82547_rev_2) e1000_irq_enable(adapter); -#endif +#endif /* CONFIG_E1000_NAPI */ return IRQ_HANDLED; } @@ -3430,26 +3414,35 @@ 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, work_done = 0; + int tx_cleaned = 0, i = 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(poll_dev)) + if (!netif_carrier_ok(adapter->netdev)) goto quit_polling; - /* 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); - } + while (poll_dev != &adapter->polling_netdev[i]) { + i++; + if (unlikely(i == adapter->num_rx_queues)) + BUG(); + } + + 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[0], + adapter->clean_rx(adapter, &adapter->rx_ring[i], &work_done, work_to_do); *budget -= work_done; @@ -3457,7 +3450,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(poll_dev)) { + !netif_running(adapter->netdev)) { quit_polling: netif_rx_complete(poll_dev); e1000_irq_enable(adapter); @@ -3481,9 +3474,6 @@ e1000_clean_tx_irq(struct e1000_adapter *adapter, struct e1000_tx_desc *tx_desc, *eop_desc; struct e1000_buffer *buffer_info; unsigned int i, eop; -#ifdef CONFIG_E1000_NAPI - unsigned int count = 0; -#endif boolean_t cleaned = FALSE; i = tx_ring->next_to_clean; @@ -3496,33 +3486,32 @@ e1000_clean_tx_irq(struct e1000_adapter *adapter, buffer_info = &tx_ring->buffer_info[i]; cleaned = (i == eop); +#ifdef CONFIG_E1000_MQ + tx_ring->tx_stats.bytes += buffer_info->length; +#endif e1000_unmap_and_free_tx_resource(adapter, buffer_info); memset(tx_desc, 0, sizeof(struct e1000_tx_desc)); if (unlikely(++i == tx_ring->count)) i = 0; } +#ifdef CONFIG_E1000_MQ + tx_ring->tx_stats.packets++; +#endif eop = tx_ring->buffer_info[i].next_to_watch; eop_desc = E1000_TX_DESC(*tx_ring, eop); -#ifdef CONFIG_E1000_NAPI -#define E1000_TX_WEIGHT 64 - /* weight of a sort for tx, to avoid endless transmit cleanup */ - if (count++ == E1000_TX_WEIGHT) break; -#endif } tx_ring->next_to_clean = i; -#define TX_WAKE_THRESHOLD 32 + spin_lock(&tx_ring->tx_lock); + if (unlikely(cleaned && netif_queue_stopped(netdev) && - 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); - } + netif_carrier_ok(netdev))) + netif_wake_queue(netdev); + + spin_unlock(&tx_ring->tx_lock); if (adapter->detect_tx_hung) { /* Detect a transmit hang in hardware, this serializes the @@ -3530,7 +3519,7 @@ e1000_clean_tx_irq(struct e1000_adapter *adapter, adapter->detect_tx_hung = FALSE; if (tx_ring->buffer_info[eop].dma && time_after(jiffies, tx_ring->buffer_info[eop].time_stamp + - (adapter->tx_timeout_factor * HZ)) + adapter->tx_timeout_factor * HZ) && !(E1000_READ_REG(&adapter->hw, STATUS) & E1000_STATUS_TXOFF)) { @@ -3570,7 +3559,7 @@ e1000_clean_tx_irq(struct e1000_adapter *adapter, * @sk_buff: socket buffer with received data **/ -static void +static inline void e1000_rx_checksum(struct e1000_adapter *adapter, uint32_t status_err, uint32_t csum, struct sk_buff *skb) @@ -3644,7 +3633,7 @@ e1000_clean_rx_irq(struct e1000_adapter *adapter, buffer_info = &rx_ring->buffer_info[i]; while (rx_desc->status & E1000_RXD_STAT_DD) { - struct sk_buff *skb; + struct sk_buff *skb, *next_skb; u8 status; #ifdef CONFIG_E1000_NAPI if (*work_done >= work_to_do) @@ -3655,13 +3644,10 @@ e1000_clean_rx_irq(struct e1000_adapter *adapter, skb = buffer_info->skb; buffer_info->skb = NULL; - prefetch(skb->data - NET_IP_ALIGN); - if (++i == rx_ring->count) i = 0; next_rxd = E1000_RX_DESC(*rx_ring, i); - prefetch(next_rxd); - next_buffer = &rx_ring->buffer_info[i]; + next_skb = next_buffer->skb; cleaned = TRUE; cleaned_count++; @@ -3672,15 +3658,11 @@ 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); - /* recycle */ - buffer_info-> skb = skb; + dev_kfree_skb_irq(skb); goto next_desc; } @@ -3696,8 +3678,7 @@ e1000_clean_rx_irq(struct e1000_adapter *adapter, flags); length--; } else { - /* recycle */ - buffer_info->skb = skb; + dev_kfree_skb_irq(skb); goto next_desc; } } @@ -3708,7 +3689,7 @@ e1000_clean_rx_irq(struct e1000_adapter *adapter, #define E1000_CB_LENGTH 256 if (length < E1000_CB_LENGTH) { struct sk_buff *new_skb = - netdev_alloc_skb(netdev, length + NET_IP_ALIGN); + dev_alloc_skb(length + NET_IP_ALIGN); if (new_skb) { skb_reserve(new_skb, NET_IP_ALIGN); new_skb->dev = netdev; @@ -3752,6 +3733,10 @@ e1000_clean_rx_irq(struct e1000_adapter *adapter, } #endif /* CONFIG_E1000_NAPI */ netdev->last_rx = jiffies; +#ifdef CONFIG_E1000_MQ + rx_ring->rx_stats.packets++; + rx_ring->rx_stats.bytes += length; +#endif next_desc: rx_desc->status = 0; @@ -3762,7 +3747,6 @@ next_desc: cleaned_count = 0; } - /* use prefetched values */ rx_desc = next_rxd; buffer_info = next_buffer; } @@ -3796,7 +3780,7 @@ e1000_clean_rx_irq_ps(struct e1000_adapter *adapter, struct e1000_buffer *buffer_info, *next_buffer; struct e1000_ps_page *ps_page; struct e1000_ps_page_dma *ps_page_dma; - struct sk_buff *skb; + struct sk_buff *skb, *next_skb; unsigned int i, j; uint32_t length, staterr; int cleaned_count = 0; @@ -3817,14 +3801,10 @@ e1000_clean_rx_irq_ps(struct e1000_adapter *adapter, #endif skb = buffer_info->skb; - /* in the packet split case this is header only */ - prefetch(skb->data - NET_IP_ALIGN); - if (++i == rx_ring->count) i = 0; next_rxd = E1000_RX_DESC_PS(*rx_ring, i); - prefetch(next_rxd); - next_buffer = &rx_ring->buffer_info[i]; + next_skb = next_buffer->skb; cleaned = TRUE; cleaned_count++; @@ -3856,55 +3836,24 @@ e1000_clean_rx_irq_ps(struct e1000_adapter *adapter, /* Good Receive */ skb_put(skb, length); - { - /* this looks ugly, but it seems compiler issues make it - more efficient than reusing j */ - int l1 = le16_to_cpu(rx_desc->wb.upper.length[0]); - - /* page alloc/put takes too long and effects small packet - * throughput, so unsplit small packets and save the alloc/put*/ - if (l1 && ((length + l1) <= adapter->rx_ps_bsize0)) { - u8 *vaddr; - /* 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, - ps_page_dma->ps_page_dma[0], - PAGE_SIZE, - PCI_DMA_FROMDEVICE); - vaddr = kmap_atomic(ps_page->ps_page[0], - KM_SKB_DATA_SOFTIRQ); - memcpy(skb->tail, vaddr, l1); - kunmap_atomic(vaddr, KM_SKB_DATA_SOFTIRQ); - 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); - goto copydone; - } /* if */ - } - for (j = 0; j < adapter->rx_ps_pages; j++) { - if (!(length= le16_to_cpu(rx_desc->wb.upper.length[j]))) + if (!(length = le16_to_cpu(rx_desc->wb.upper.length[j]))) break; + pci_unmap_page(pdev, ps_page_dma->ps_page_dma[j], PAGE_SIZE, PCI_DMA_FROMDEVICE); ps_page_dma->ps_page_dma[j] = 0; - skb_fill_page_desc(skb, j, ps_page->ps_page[j], 0, - length); + skb_shinfo(skb)->frags[j].page = + ps_page->ps_page[j]; ps_page->ps_page[j] = NULL; + skb_shinfo(skb)->frags[j].page_offset = 0; + skb_shinfo(skb)->frags[j].size = length; + skb_shinfo(skb)->nr_frags++; skb->len += length; skb->data_len += length; 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); skb->protocol = eth_type_trans(skb, netdev); @@ -3930,6 +3879,10 @@ copydone: } #endif /* CONFIG_E1000_NAPI */ netdev->last_rx = jiffies; +#ifdef CONFIG_E1000_MQ + rx_ring->rx_stats.packets++; + rx_ring->rx_stats.bytes += length; +#endif next_desc: rx_desc->wb.middle.status_error &= cpu_to_le32(~0xFF); @@ -3941,7 +3894,6 @@ next_desc: cleaned_count = 0; } - /* use prefetched values */ rx_desc = next_rxd; buffer_info = next_buffer; @@ -3979,12 +3931,13 @@ e1000_alloc_rx_buffers(struct e1000_adapter *adapter, while (cleaned_count--) { if (!(skb = buffer_info->skb)) - skb = netdev_alloc_skb(netdev, bufsz); + skb = dev_alloc_skb(bufsz); else { skb_trim(skb, 0); goto map_skb; } + if (unlikely(!skb)) { /* Better luck next round */ adapter->alloc_rx_buff_failed++; @@ -3997,7 +3950,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 = netdev_alloc_skb(netdev, bufsz); + skb = dev_alloc_skb(bufsz); /* Failed allocation, critical failure */ if (!skb) { dev_kfree_skb(oldskb); @@ -4121,8 +4074,7 @@ e1000_alloc_rx_buffers_ps(struct e1000_adapter *adapter, rx_desc->read.buffer_addr[j+1] = ~0; } - skb = netdev_alloc_skb(netdev, - adapter->rx_ps_bsize0 + NET_IP_ALIGN); + skb = dev_alloc_skb(adapter->rx_ps_bsize0 + NET_IP_ALIGN); if (unlikely(!skb)) { adapter->alloc_rx_buff_failed++; @@ -4291,7 +4243,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.media_type == e1000_media_type_copper) { + if (adapter->hw.phy_type == e1000_phy_m88) { switch (data->reg_num) { case PHY_CTRL: if (mii_reg & MII_CR_POWER_DOWN) @@ -4307,8 +4259,8 @@ e1000_mii_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd) else spddplx = SPEED_10; spddplx += (mii_reg & 0x100) - ? DUPLEX_FULL : - DUPLEX_HALF; + ? FULL_DUPLEX : + HALF_DUPLEX; retval = e1000_set_spd_dplx(adapter, spddplx); if (retval) { @@ -4318,9 +4270,10 @@ e1000_mii_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd) return retval; } } - if (netif_running(adapter->netdev)) - e1000_reinit_locked(adapter); - else + if (netif_running(adapter->netdev)) { + e1000_down(adapter); + e1000_up(adapter); + } else e1000_reset(adapter); break; case M88E1000_PHY_SPEC_CTRL: @@ -4337,9 +4290,10 @@ 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_reinit_locked(adapter); - else + if (netif_running(adapter->netdev)) { + e1000_down(adapter); + e1000_up(adapter); + } else e1000_reset(adapter); break; } @@ -4386,13 +4340,11 @@ 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) @@ -4415,21 +4367,18 @@ 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; @@ -4438,7 +4387,6 @@ 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); @@ -4542,8 +4490,8 @@ e1000_set_spd_dplx(struct e1000_adapter *adapter, uint16_t spddplx) } #ifdef CONFIG_PM -/* Save/restore 16 or 64 dwords of PCI config space depending on which - * bus we're on (PCI(X) vs. PCI-E) +/* these functions save and restore 16 or 64 dwords (64-256 bytes) of config + * space versus the 64 bytes that pci_[save|restore]_state handle */ #define PCIE_CONFIG_SPACE_LEN 256 #define PCI_CONFIG_SPACE_LEN 64 @@ -4553,7 +4501,6 @@ e1000_pci_save_state(struct e1000_adapter *adapter) struct pci_dev *dev = adapter->pdev; int size; int i; - if (adapter->hw.mac_type >= e1000_82571) size = PCIE_CONFIG_SPACE_LEN; else @@ -4577,10 +4524,8 @@ e1000_pci_restore_state(struct e1000_adapter *adapter) struct pci_dev *dev = adapter->pdev; int size; int i; - if (adapter->config_space == NULL) return; - if (adapter->hw.mac_type >= e1000_82571) size = PCIE_CONFIG_SPACE_LEN; else @@ -4600,20 +4545,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)) { - WARN_ON(test_bit(__E1000_RESETTING, &adapter->flags)); + if (netif_running(netdev)) e1000_down(adapter); - } #ifdef CONFIG_PM - /* Implement our own version of pci_save_state(pdev) because pci- - * express adapters have 256-byte config spaces. */ + /* implement our own version of pci_save_state(pdev) because pci + * express adapters have larger 256 byte config spaces */ retval = e1000_pci_save_state(adapter); if (retval) return retval; @@ -4658,41 +4599,47 @@ 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); - pci_enable_wake(pdev, PCI_D3hot, 1); - pci_enable_wake(pdev, PCI_D3cold, 1); + 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"); } else { E1000_WRITE_REG(&adapter->hw, WUC, 0); E1000_WRITE_REG(&adapter->hw, WUFC, 0); - pci_enable_wake(pdev, PCI_D3hot, 0); - pci_enable_wake(pdev, PCI_D3cold, 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); /* 4 == D3 cold */ + if (retval) + DPRINTK(PROBE, ERR, "Error enabling D3 cold wake\n"); } - /* 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); - pci_enable_wake(pdev, PCI_D3hot, 1); - pci_enable_wake(pdev, PCI_D3cold, 1); + 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"); } } - if (adapter->hw.phy_type == e1000_phy_igp_3) - e1000_phy_powerdown_workaround(&adapter->hw); - - if (netif_running(netdev)) - e1000_free_irq(adapter); - /* 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); - pci_set_power_state(pdev, pci_choose_state(pdev, state)); + retval = pci_set_power_state(pdev, pci_choose_state(pdev, state)); + if (retval) + DPRINTK(PROBE, ERR, "Error in setting power state\n"); return 0; } @@ -4703,20 +4650,23 @@ 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; - pci_set_power_state(pdev, PCI_D0); + retval = pci_set_power_state(pdev, PCI_D0); + if (retval) + DPRINTK(PROBE, ERR, "Error in setting power state\n"); e1000_pci_restore_state(adapter); ret_val = pci_enable_device(pdev); pci_set_master(pdev); - pci_enable_wake(pdev, PCI_D3hot, 0); - pci_enable_wake(pdev, PCI_D3cold, 0); - - if (netif_running(netdev) && (ret_val = e1000_request_irq(adapter))) - return ret_val; + 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"); - e1000_power_up_phy(adapter); e1000_reset(adapter); E1000_WRITE_REG(&adapter->hw, WUS, ~0); @@ -4725,9 +4675,7 @@ 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); @@ -4745,12 +4693,6 @@ e1000_resume(struct pci_dev *pdev) return 0; } #endif - -static void e1000_shutdown(struct pci_dev *pdev) -{ - e1000_suspend(pdev, PMSG_SUSPEND); -} - #ifdef CONFIG_NET_POLL_CONTROLLER /* * Polling 'interrupt' - used by things like netconsole to send skbs @@ -4761,7 +4703,6 @@ 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); @@ -4772,101 +4713,4 @@ 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 2d3e8b06c..9790db974 100644 --- a/drivers/net/e1000/e1000_osdep.h +++ b/drivers/net/e1000/e1000_osdep.h @@ -1,7 +1,7 @@ /******************************************************************************* - Copyright(c) 1999 - 2006 Intel Corporation. All rights reserved. + Copyright(c) 1999 - 2005 Intel Corporation. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free @@ -22,7 +22,6 @@ Contact Information: Linux NICS - e1000-devel Mailing List Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 *******************************************************************************/ @@ -127,17 +126,4 @@ 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 0ef413172..3768d83cd 100644 --- a/drivers/net/e1000/e1000_param.c +++ b/drivers/net/e1000/e1000_param.c @@ -1,7 +1,7 @@ /******************************************************************************* - Copyright(c) 1999 - 2006 Intel Corporation. All rights reserved. + Copyright(c) 1999 - 2005 Intel Corporation. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free @@ -22,7 +22,6 @@ Contact Information: Linux NICS - e1000-devel Mailing List Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 *******************************************************************************/ @@ -45,16 +44,6 @@ */ #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; \ @@ -193,24 +182,6 @@ 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 @@ -297,7 +268,7 @@ e1000_validate_option(int *value, struct e1000_option *opt, BUG(); } - DPRINTK(PROBE, INFO, "Invalid %s value specified (%i) %s\n", + DPRINTK(PROBE, INFO, "Invalid %s specified (%i) %s\n", opt->name, *value, opt->err); *value = opt->def; return -1; @@ -324,7 +295,6 @@ 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 */ @@ -342,9 +312,14 @@ e1000_check_options(struct e1000_adapter *adapter) opt.arg.r.max = mac_type < e1000_82544 ? E1000_MAX_TXD : E1000_MAX_82544_TXD; - tx_ring->count = TxDescriptors[bd]; - e1000_validate_option(&tx_ring->count, &opt, adapter); - E1000_ROUNDUP(tx_ring->count, REQ_TX_DESCRIPTOR_MULTIPLE); + 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; + } for (i = 0; i < adapter->num_tx_queues; i++) tx_ring[i].count = tx_ring->count; } @@ -363,9 +338,14 @@ e1000_check_options(struct e1000_adapter *adapter) opt.arg.r.max = mac_type < e1000_82544 ? E1000_MAX_RXD : E1000_MAX_82544_RXD; - rx_ring->count = RxDescriptors[bd]; - e1000_validate_option(&rx_ring->count, &opt, adapter); - E1000_ROUNDUP(rx_ring->count, REQ_RX_DESCRIPTOR_MULTIPLE); + 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; + } for (i = 0; i < adapter->num_rx_queues; i++) rx_ring[i].count = rx_ring->count; } @@ -377,9 +357,13 @@ e1000_check_options(struct e1000_adapter *adapter) .def = OPTION_ENABLED }; - int rx_csum = XsumRX[bd]; - e1000_validate_option(&rx_csum, &opt, adapter); - adapter->rx_csum = rx_csum; + 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; + } } { /* Flow Control */ @@ -399,9 +383,13 @@ e1000_check_options(struct e1000_adapter *adapter) .p = fc_list }} }; - int fc = FlowControl[bd]; - e1000_validate_option(&fc, &opt, adapter); - adapter->hw.fc = adapter->hw.original_fc = fc; + 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; + } } { /* Transmit Interrupt Delay */ struct e1000_option opt = { @@ -413,8 +401,13 @@ e1000_check_options(struct e1000_adapter *adapter) .max = MAX_TXDELAY }} }; - adapter->tx_int_delay = TxIntDelay[bd]; - e1000_validate_option(&adapter->tx_int_delay, &opt, adapter); + 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; + } } { /* Transmit Absolute Interrupt Delay */ struct e1000_option opt = { @@ -426,9 +419,13 @@ e1000_check_options(struct e1000_adapter *adapter) .max = MAX_TXABSDELAY }} }; - adapter->tx_abs_int_delay = TxAbsIntDelay[bd]; - e1000_validate_option(&adapter->tx_abs_int_delay, &opt, - adapter); + 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; + } } { /* Receive Interrupt Delay */ struct e1000_option opt = { @@ -440,8 +437,13 @@ e1000_check_options(struct e1000_adapter *adapter) .max = MAX_RXDELAY }} }; - adapter->rx_int_delay = RxIntDelay[bd]; - e1000_validate_option(&adapter->rx_int_delay, &opt, adapter); + 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; + } } { /* Receive Absolute Interrupt Delay */ struct e1000_option opt = { @@ -453,9 +455,13 @@ e1000_check_options(struct e1000_adapter *adapter) .max = MAX_RXABSDELAY }} }; - adapter->rx_abs_int_delay = RxAbsIntDelay[bd]; - e1000_validate_option(&adapter->rx_abs_int_delay, &opt, - adapter); + 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; + } } { /* Interrupt Throttling Rate */ struct e1000_option opt = { @@ -467,44 +473,26 @@ e1000_check_options(struct e1000_adapter *adapter) .max = MAX_ITR }} }; - 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; + 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; } } - { /* 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: @@ -530,18 +518,17 @@ static void __devinit e1000_check_fiber_options(struct e1000_adapter *adapter) { int bd = adapter->bd_number; - bd = bd > E1000_MAX_NIC ? E1000_MAX_NIC : bd; - if ((Speed[bd] != OPTION_UNSET)) { + if (num_Speed > bd) { DPRINTK(PROBE, INFO, "Speed not valid for fiber adapters, " "parameter ignored\n"); } - if ((Duplex[bd] != OPTION_UNSET)) { + if (num_Duplex > bd) { DPRINTK(PROBE, INFO, "Duplex not valid for fiber adapters, " "parameter ignored\n"); } - if ((AutoNeg[bd] != OPTION_UNSET) && (AutoNeg[bd] != 0x20)) { + if ((num_AutoNeg > bd) && (AutoNeg[bd] != 0x20)) { DPRINTK(PROBE, INFO, "AutoNeg other than 1000/Full is " "not valid for fiber adapters, " "parameter ignored\n"); @@ -560,7 +547,6 @@ 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, "" }, @@ -577,8 +563,12 @@ e1000_check_copper_options(struct e1000_adapter *adapter) .p = speed_list }} }; - speed = Speed[bd]; - e1000_validate_option(&speed, &opt, adapter); + if (num_Speed > bd) { + speed = Speed[bd]; + e1000_validate_option(&speed, &opt, adapter); + } else { + speed = opt.def; + } } { /* Duplex */ struct e1000_opt_list dplx_list[] = {{ 0, "" }, @@ -600,11 +590,15 @@ e1000_check_copper_options(struct e1000_adapter *adapter) "Speed/Duplex/AutoNeg parameter ignored.\n"); return; } - dplx = Duplex[bd]; - e1000_validate_option(&dplx, &opt, adapter); + if (num_Duplex > bd) { + dplx = Duplex[bd]; + e1000_validate_option(&dplx, &opt, adapter); + } else { + dplx = opt.def; + } } - if (AutoNeg[bd] != OPTION_UNSET && (speed != 0 || dplx != 0)) { + if ((num_AutoNeg > bd) && (speed != 0 || dplx != 0)) { DPRINTK(PROBE, INFO, "AutoNeg specified along with Speed or Duplex, " "parameter ignored\n"); @@ -653,15 +647,19 @@ e1000_check_copper_options(struct e1000_adapter *adapter) .p = an_list }} }; - an = AutoNeg[bd]; - e1000_validate_option(&an, &opt, adapter); + if (num_AutoNeg > bd) { + an = AutoNeg[bd]; + e1000_validate_option(&an, &opt, adapter); + } else { + an = opt.def; + } adapter->hw.autoneg_advertised = an; } switch (speed + dplx) { case 0: adapter->hw.autoneg = adapter->fc_autoneg = 1; - if (Speed[bd] != OPTION_UNSET || Duplex[bd] != OPTION_UNSET) + if ((num_Speed > bd) && (speed != 0 || dplx != 0)) DPRINTK(PROBE, INFO, "Speed and duplex autonegotiation enabled\n"); break; diff --git a/drivers/net/e2100.c b/drivers/net/e2100.c index e4e733a38..e5c5cd2a2 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 init_module(void) +int +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 8dc61d65d..a806dfe54 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, IRQF_SHARED, "bogus", dev) != EBUSY) { + if (request_irq (*irqp, NULL, SA_SHIRQ, "bogus", dev) != EBUSY) { unsigned long irq_mask; /* Twinkle the interrupt, and check if it's seen */ irq_mask = probe_irq_on(); @@ -1154,7 +1154,8 @@ 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) { - if (skb_padto(skb, ETH_ZLEN)) + skb = skb_padto(skb, ETH_ZLEN); + if (skb == NULL) return 0; length = ETH_ZLEN; } @@ -1807,7 +1808,8 @@ 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 init_module(void) +int +init_module(void) { struct net_device *dev; int i; diff --git a/drivers/net/eepro100.c b/drivers/net/eepro100.c index e445988c9..8c62ced2c 100644 --- a/drivers/net/eepro100.c +++ b/drivers/net/eepro100.c @@ -27,7 +27,7 @@ rx_align support: enables rx DMA without causing unaligned accesses. */ -static const char * const version = +static const char *version = "eepro100.c:v1.09j-t 9/29/99 Donald Becker http://www.scyld.com/network/eepro100.html\n" "eepro100.c: $Revision: 1.36 $ 2000/11/17 Modified by Andrey V. Savochkin and others\n"; @@ -87,6 +87,7 @@ 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 @@ -277,6 +278,11 @@ 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 { @@ -463,7 +469,7 @@ static const char i82558_config_cmd[CONFIG_DATA_SIZE] = { 0x31, 0x05, }; /* PHY media interface chips. */ -static const char * const phys[] = { +static const char *phys[] = { "None", "i82553-A/B", "i82553-C", "i82503", "DP83840", "80c240", "80c24", "i82555", "unknown-8", "unknown-9", "DP83840A", "unknown-11", @@ -555,12 +561,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")) { - dev_err(&pdev->dev, "eepro100: cannot reserve I/O ports\n"); + printk (KERN_ERR "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")) { - dev_err(&pdev->dev, "eepro100: cannot reserve MMIO region\n"); + printk (KERN_ERR "eepro100: cannot reserve MMIO region\n"); goto err_out_free_pio_region; } @@ -573,7 +579,7 @@ static int __devinit eepro100_init_one (struct pci_dev *pdev, ioaddr = pci_iomap(pdev, pci_bar, 0); if (!ioaddr) { - dev_err(&pdev->dev, "eepro100: cannot remap IO\n"); + printk (KERN_ERR "eepro100: cannot remap IO\n"); goto err_out_free_mmio_region; } @@ -977,7 +983,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, IRQF_SHARED, dev->name, dev); + retval = request_irq(dev->irq, &speedo_interrupt, SA_SHIRQ, dev->name, dev); if (retval) { return retval; } diff --git a/drivers/net/eexpress.c b/drivers/net/eexpress.c index 0701c1d81..82bd356e4 100644 --- a/drivers/net/eexpress.c +++ b/drivers/net/eexpress.c @@ -97,6 +97,7 @@ #define LOCKUP16 0 #endif +#include #include #include #include @@ -676,7 +677,8 @@ static int eexp_xmit(struct sk_buff *buf, struct net_device *dev) #endif if (buf->len < ETH_ZLEN) { - if (skb_padto(buf, ETH_ZLEN)) + buf = skb_padto(buf, ETH_ZLEN); + if (buf == NULL) return 0; length = ETH_ZLEN; } @@ -1698,7 +1700,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 init_module(void) +int 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 a67650ccf..f119ec4e8 100644 --- a/drivers/net/epic100.c +++ b/drivers/net/epic100.c @@ -19,15 +19,62 @@ 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 "2.0" -#define DRV_RELDATE "June 27, 2006" +#define DRV_VERSION "1.11+LK1.1.14+AC1.1.14" +#define DRV_RELDATE "June 2, 2004" /* The user-configurable values. These may be modified when a driver module is loaded.*/ @@ -67,6 +114,7 @@ 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 @@ -143,10 +191,23 @@ 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, @@ -157,15 +218,20 @@ 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", TYPE2_INTR | NO_MII | MII_PWRDWN }, - { "SMSC EPIC/100 83c170", TYPE2_INTR }, - { "SMSC EPIC/C 83c175", TYPE2_INTR | MII_PWRDWN }, +static 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 }, }; @@ -178,7 +244,7 @@ static struct pci_device_id epic_pci_tbl[] = { }; MODULE_DEVICE_TABLE (pci, epic_pci_tbl); - + #ifndef USE_IO_OPS #undef inb #undef inw @@ -225,7 +291,7 @@ enum CommandBits { RxDone | RxStarted | RxEarlyWarn | RxOverflow | RxFull) #define EpicNormalEvent (0x0000ffff & ~EpicNapiEvent) -static const u16 media2miictl[16] = { +static u16 media2miictl[16] = { 0, 0x0C00, 0x0C00, 0x2000, 0x0100, 0x2100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; @@ -304,7 +370,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) @@ -326,20 +392,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) < EPIC_TOTAL_SIZE) { - dev_err(&pdev->dev, "no PCI region space\n"); + 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); ret = -ENODEV; goto err_out_disable; } - + pci_set_master(pdev); ret = pci_request_regions(pdev, DRV_NAME); @@ -350,7 +416,7 @@ static int __devinit epic_init_one (struct pci_dev *pdev, dev = alloc_etherdev(sizeof (*ep)); if (!dev) { - dev_err(&pdev->dev, "no memory for eth device\n"); + printk (KERN_ERR "card %d: no memory for eth device\n", card_idx); goto err_out_free_res; } SET_MODULE_OWNER(dev); @@ -362,7 +428,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) { - dev_err(&pdev->dev, "ioremap failed\n"); + printk (KERN_ERR DRV_NAME " %d: ioremap failed\n", card_idx); goto err_out_free_netdev; } #endif @@ -422,7 +488,8 @@ 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) { - dev_printk(KERN_DEBUG, &pdev->dev, "EEPROM contents:\n"); + printk(KERN_DEBUG DRV_NAME "(%s): EEPROM contents\n", + pci_name(pdev)); for (i = 0; i < 64; i++) printk(" %4.4x%s", read_eeprom(ioaddr, i), i % 16 == 15 ? "\n" : ""); @@ -431,7 +498,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; @@ -444,23 +511,21 @@ 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; - dev_info(&pdev->dev, - "MII transceiver #%d control " - "%4.4x status %4.4x.\n", - phy, mdio_read(dev, phy, 0), mii_status); + 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); } } ep->mii_phy_cnt = phy_idx; if (phy_idx != 0) { phy = ep->phys[0]; ep->mii.advertising = mdio_read(dev, phy, MII_ADVERTISE); - dev_info(&pdev->dev, - "Autonegotiation advertising %4.4x link " + printk(KERN_INFO DRV_NAME "(%s): Autonegotiation advertising %4.4x link " "partner %4.4x.\n", - ep->mii.advertising, mdio_read(dev, phy, 5)); + pci_name(pdev), ep->mii.advertising, mdio_read(dev, phy, 5)); } else if ( ! (ep->chip_flags & NO_MII)) { - dev_warn(&pdev->dev, - "***WARNING***: No MII transceiver found!\n"); + printk(KERN_WARNING DRV_NAME "(%s): ***WARNING***: No MII transceiver found!\n", + pci_name(pdev)); /* Use the known PHY address of the EPII. */ ep->phys[0] = 3; } @@ -475,7 +540,8 @@ 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; - dev_info(&pdev->dev, "Forced full duplex requested.\n"); + printk(KERN_INFO DRV_NAME "(%s): Forced full duplex operation requested.\n", + pci_name(pdev)); } dev->if_port = ep->default_port = option; @@ -521,7 +587,7 @@ err_out_disable: pci_disable_device(pdev); goto out; } - + /* Serial EEPROM section. */ /* EEPROM_Ctrl bits. */ @@ -643,7 +709,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; @@ -651,7 +717,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; @@ -662,7 +728,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, IRQF_SHARED, dev->name, dev))) + if ((retval = request_irq(dev->irq, &epic_interrupt, SA_SHIRQ, dev->name, dev))) return retval; epic_init_ring(dev); @@ -694,7 +760,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); @@ -737,7 +803,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) @@ -765,7 +831,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. */ @@ -921,7 +987,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; } @@ -936,7 +1002,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); } @@ -947,7 +1013,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; @@ -960,9 +1026,12 @@ 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_padto(skb, ETH_ZLEN)) - return 0; + + if (skb->len < ETH_ZLEN) { + skb = skb_padto(skb, ETH_ZLEN); + if (skb == NULL) + return 0; + } /* Caution: the write order is important here, set the field with the "ownership" bit last. */ @@ -973,7 +1042,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 */ @@ -1057,7 +1126,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; @@ -1212,8 +1281,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; @@ -1238,7 +1307,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++; } @@ -1334,7 +1403,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); } @@ -1345,7 +1414,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); } @@ -1538,7 +1607,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/eql.c b/drivers/net/eql.c index 815436c61..aa1569182 100644 --- a/drivers/net/eql.c +++ b/drivers/net/eql.c @@ -203,7 +203,8 @@ static int eql_open(struct net_device *dev) printk(KERN_INFO "%s: remember to turn off Van-Jacobson compression on " "your slave devices.\n", dev->name); - BUG_ON(!list_empty(&eql->queue.all_slaves)); + if (!list_empty(&eql->queue.all_slaves)) + BUG(); eql->min_slaves = 1; eql->max_slaves = EQL_DEFAULT_MAX_SLAVES; /* 4 usually... */ diff --git a/drivers/net/es3210.c b/drivers/net/es3210.c index fd7b32a24..6b0ab1eac 100644 --- a/drivers/net/es3210.c +++ b/drivers/net/es3210.c @@ -421,7 +421,8 @@ MODULE_PARM_DESC(mem, "memory base address(es)"); MODULE_DESCRIPTION("Racal-Interlan ES3210 EISA ethernet driver"); MODULE_LICENSE("GPL"); -int __init init_module(void) +int +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 ca42efa91..f32a6b3ac 100644 --- a/drivers/net/eth16i.c +++ b/drivers/net/eth16i.c @@ -161,7 +161,6 @@ static char *version = #include #include #include -#include #include #include @@ -755,7 +754,7 @@ static void eth16i_set_port(int ioaddr, int porttype) static int eth16i_send_probe_packet(int ioaddr, unsigned char *b, int l) { - unsigned long starttime; + int starttime; outb(0xff, ioaddr + TX_STATUS_REG); @@ -766,7 +765,7 @@ static int eth16i_send_probe_packet(int ioaddr, unsigned char *b, int l) outb(TX_START | 1, ioaddr + TRANSMIT_START_REG); while( (inb(ioaddr + TX_STATUS_REG) & 0x80) == 0) { - if( time_after(jiffies, starttime + TX_TIMEOUT)) { + if( (jiffies - starttime) > TX_TIMEOUT) { return -1; } } @@ -776,18 +775,18 @@ static int eth16i_send_probe_packet(int ioaddr, unsigned char *b, int l) static int eth16i_receive_probe_packet(int ioaddr) { - unsigned long starttime; + int starttime; starttime = jiffies; while((inb(ioaddr + TX_STATUS_REG) & 0x20) == 0) { - if( time_after(jiffies, starttime + TX_TIMEOUT)) { + if( (jiffies - starttime) > TX_TIMEOUT) { if(eth16i_debug > 1) printk(KERN_DEBUG "Timeout occurred waiting transmit packet received\n"); starttime = jiffies; while((inb(ioaddr + RX_STATUS_REG) & 0x80) == 0) { - if( time_after(jiffies, starttime + TX_TIMEOUT)) { + if( (jiffies - starttime) > TX_TIMEOUT) { if(eth16i_debug > 1) printk(KERN_DEBUG "Timeout occurred waiting receive packet\n"); return -1; @@ -1064,7 +1063,8 @@ static int eth16i_tx(struct sk_buff *skb, struct net_device *dev) unsigned long flags; if (length < ETH_ZLEN) { - if (skb_padto(skb, ETH_ZLEN)) + skb = skb_padto(skb, ETH_ZLEN); + if (skb == NULL) return 0; length = ETH_ZLEN; } @@ -1434,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 init_module(void) +int 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 567e27413..55dbe9a3f 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[] = +static char version[] __devinitdata = KERN_INFO DRV_NAME ".c:v" DRV_VERSION " " DRV_RELDATE "\n"; @@ -124,8 +124,16 @@ 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)"); -enum { - MIN_REGION_SIZE = 136, +#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, }; /* A chip capabilities table, matching the entries in pci_tbl[] above. */ @@ -148,13 +156,14 @@ enum phy_type_flags { struct chip_info { char *chip_name; + int io_size; int flags; }; -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 }, +static 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}, }; /* Offsets to the Command and Status Registers. */ @@ -505,14 +514,13 @@ static int __devinit fealnx_init_one(struct pci_dev *pdev, len = pci_resource_len(pdev, bar); if (len < MIN_REGION_SIZE) { - dev_err(&pdev->dev, - "region size %ld too small, aborting\n", len); + printk(KERN_ERR "%s: region size %ld too small, aborting\n", + boardname, len); return -ENODEV; } i = pci_request_regions(pdev, boardname); - if (i) - return i; + if (i) return i; irq = pdev->irq; @@ -578,9 +586,9 @@ static int __devinit fealnx_init_one(struct pci_dev *pdev, if (mii_status != 0xffff && mii_status != 0x0000) { np->phys[phy_idx++] = phy; - dev_info(&pdev->dev, - "MII PHY found at address %d, status " - "0x%4.4x.\n", phy, mii_status); + printk(KERN_INFO + "%s: MII PHY found at address %d, status " + "0x%4.4x.\n", dev->name, phy, mii_status); /* get phy type */ { unsigned int data; @@ -603,10 +611,10 @@ static int __devinit fealnx_init_one(struct pci_dev *pdev, } np->mii_cnt = phy_idx; - if (phy_idx == 0) - dev_warn(&pdev->dev, - "MII PHY not found -- this device may " - "not operate correctly.\n"); + if (phy_idx == 0) { + printk(KERN_WARNING "%s: MII PHY not found -- this device may " + "not operate correctly.\n", dev->name); + } } else { np->phys[0] = 32; /* 89/6/23 add, (begin) */ @@ -632,7 +640,7 @@ static int __devinit fealnx_init_one(struct pci_dev *pdev, np->mii.full_duplex = full_duplex[card_idx]; if (np->mii.full_duplex) { - dev_info(&pdev->dev, "Media type forced to Full Duplex.\n"); + printk(KERN_INFO "%s: Media type forced to Full Duplex.\n", dev->name); /* 89/6/13 add, (begin) */ // if (np->PHYType==MarvellPHY) if ((np->PHYType == MarvellPHY) || (np->PHYType == LevelOnePHY)) { @@ -836,7 +844,7 @@ static int netdev_open(struct net_device *dev) iowrite32(0x00000001, ioaddr + BCR); /* Reset */ - if (request_irq(dev->irq, &intr_handler, IRQF_SHARED, dev->name, dev)) + if (request_irq(dev->irq, &intr_handler, SA_SHIRQ, dev->name, dev)) return -EAGAIN; for (i = 0; i < 3; i++) diff --git a/drivers/net/fec.c b/drivers/net/fec.c index 9b4030031..bd6983d1a 100644 --- a/drivers/net/fec.c +++ b/drivers/net/fec.c @@ -22,9 +22,10 @@ * Copyright (c) 2001-2005 Greg Ungerer (gerg@snapgear.com) * * Bug fixes and cleanup by Philippe De Muyter (phdm@macqel.be) - * Copyright (c) 2004-2006 Macq Electronique SA. + * Copyright (c) 2004-2005 Macq Electronique SA. */ +#include #include #include #include @@ -50,7 +51,7 @@ #if defined(CONFIG_M523x) || defined(CONFIG_M527x) || \ defined(CONFIG_M5272) || defined(CONFIG_M528x) || \ - defined(CONFIG_M520x) || defined(CONFIG_M532x) + defined(CONFIG_M520x) #include #include #include "fec.h" @@ -79,8 +80,6 @@ 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 @@ -144,7 +143,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 constants too large" +#error "FEC: descriptor ring size contants too large" #endif /* Interrupt events/masks. @@ -168,12 +167,12 @@ typedef struct { /* - * The 5270/5271/5280/5282/532x RX control register also contains maximum frame + * The 5270/5271/5280/5282 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_M532x) + defined(CONFIG_M520x) #define OPT_FRAME_SIZE (PKT_MAXBUF_SIZE << 16) #else #define OPT_FRAME_SIZE 0 @@ -309,7 +308,6 @@ 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; @@ -322,9 +320,8 @@ 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 (status & BD_ENET_TX_READY) { + if (bdp->cbd_sc & BD_ENET_TX_READY) { /* Ooops. All transmit buffers are full. Bail out. * This should not happen, since dev->tbusy should be set. */ @@ -335,7 +332,7 @@ fec_enet_start_xmit(struct sk_buff *skb, struct net_device *dev) /* Clear all of the status flags. */ - status &= ~BD_ENET_TX_STATS; + bdp->cbd_sc &= ~BD_ENET_TX_STATS; /* Set buffer length and buffer pointer. */ @@ -369,22 +366,21 @@ fec_enet_start_xmit(struct sk_buff *skb, struct net_device *dev) spin_lock_irq(&fep->lock); - /* 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. + /* 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. */ - status |= (BD_ENET_TX_READY | BD_ENET_TX_INTR + bdp->cbd_sc |= (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 = 0; + fecp->fec_x_des_active = 0x01000000; /* If this was the last BD in the ring, start at the beginning again. */ - if (status & BD_ENET_TX_WRAP) { + if (bdp->cbd_sc & BD_ENET_TX_WRAP) { bdp = fep->tx_bd_base; } else { bdp++; @@ -495,44 +491,43 @@ 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 (((status = bdp->cbd_sc) & BD_ENET_TX_READY) == 0) { + while ((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 (status & (BD_ENET_TX_HB | BD_ENET_TX_LC | + if (bdp->cbd_sc & (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 (status & BD_ENET_TX_HB) /* No heartbeat */ + if (bdp->cbd_sc & BD_ENET_TX_HB) /* No heartbeat */ fep->stats.tx_heartbeat_errors++; - if (status & BD_ENET_TX_LC) /* Late collision */ + if (bdp->cbd_sc & BD_ENET_TX_LC) /* Late collision */ fep->stats.tx_window_errors++; - if (status & BD_ENET_TX_RL) /* Retrans limit */ + if (bdp->cbd_sc & BD_ENET_TX_RL) /* Retrans limit */ fep->stats.tx_aborted_errors++; - if (status & BD_ENET_TX_UN) /* Underrun */ + if (bdp->cbd_sc & BD_ENET_TX_UN) /* Underrun */ fep->stats.tx_fifo_errors++; - if (status & BD_ENET_TX_CSL) /* Carrier lost */ + if (bdp->cbd_sc & BD_ENET_TX_CSL) /* Carrier lost */ fep->stats.tx_carrier_errors++; } else { fep->stats.tx_packets++; } #ifndef final_version - if (status & BD_ENET_TX_READY) + if (bdp->cbd_sc & 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 (status & BD_ENET_TX_DEF) + if (bdp->cbd_sc & BD_ENET_TX_DEF) fep->stats.collisions++; /* Free the sk buffer associated with this last transmit. @@ -543,7 +538,7 @@ fec_enet_tx(struct net_device *dev) /* Update pointer to next buffer descriptor to be transmitted. */ - if (status & BD_ENET_TX_WRAP) + if (bdp->cbd_sc & BD_ENET_TX_WRAP) bdp = fep->tx_bd_base; else bdp++; @@ -573,14 +568,9 @@ 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; @@ -590,13 +580,13 @@ fec_enet_rx(struct net_device *dev) */ bdp = fep->cur_rx; -while (!((status = bdp->cbd_sc) & BD_ENET_RX_EMPTY)) { +while (!(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 ((status & BD_ENET_RX_LAST) == 0) + if ((bdp->cbd_sc & BD_ENET_RX_LAST) == 0) printk("FEC ENET: rcv is not +last\n"); #endif @@ -604,26 +594,26 @@ while (!((status = bdp->cbd_sc) & BD_ENET_RX_EMPTY)) { goto rx_processing_done; /* Check for errors. */ - if (status & (BD_ENET_RX_LG | BD_ENET_RX_SH | BD_ENET_RX_NO | + if (bdp->cbd_sc & (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 (status & (BD_ENET_RX_LG | BD_ENET_RX_SH)) { + if (bdp->cbd_sc & (BD_ENET_RX_LG | BD_ENET_RX_SH)) { /* Frame too long or too short. */ fep->stats.rx_length_errors++; } - if (status & BD_ENET_RX_NO) /* Frame alignment */ + if (bdp->cbd_sc & BD_ENET_RX_NO) /* Frame alignment */ fep->stats.rx_frame_errors++; - if (status & BD_ENET_RX_CR) /* CRC Error */ + 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 */ 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 (status & BD_ENET_RX_CL) { + if (bdp->cbd_sc & BD_ENET_RX_CL) { fep->stats.rx_errors++; fep->stats.rx_frame_errors++; goto rx_processing_done; @@ -649,7 +639,9 @@ while (!((status = bdp->cbd_sc) & BD_ENET_RX_EMPTY)) { } else { skb->dev = dev; skb_put(skb,pkt_len-4); /* Make room */ - eth_copy_and_sum(skb, data, pkt_len-4, 0); + eth_copy_and_sum(skb, + (unsigned char *)__va(bdp->cbd_bufaddr), + pkt_len-4, 0); skb->protocol=eth_type_trans(skb,dev); netif_rx(skb); } @@ -657,16 +649,15 @@ while (!((status = bdp->cbd_sc) & BD_ENET_RX_EMPTY)) { /* Clear the status flags for this buffer. */ - status &= ~BD_ENET_RX_STATS; + bdp->cbd_sc &= ~BD_ENET_RX_STATS; /* Mark the buffer empty. */ - status |= BD_ENET_RX_EMPTY; - bdp->cbd_sc = status; + bdp->cbd_sc |= BD_ENET_RX_EMPTY; /* Update BD pointer to next entry. */ - if (status & BD_ENET_RX_WRAP) + if (bdp->cbd_sc & BD_ENET_RX_WRAP) bdp = fep->rx_bd_base; else bdp++; @@ -676,9 +667,9 @@ while (!((status = 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 = 0; + fecp->fec_r_des_active = 0x01000000; #endif - } /* while (!((status = bdp->cbd_sc) & BD_ENET_RX_EMPTY)) */ + } /* while (!(bdp->cbd_sc & BD_ENET_RX_EMPTY)) */ fep->cur_rx = (cbd_t *)bdp; #if 0 @@ -689,12 +680,11 @@ while (!((status = 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 = 0; + fecp->fec_r_des_active = 0x01000000; #endif } -/* called from interrupt context */ static void fec_enet_mii(struct net_device *dev) { @@ -706,12 +696,10 @@ 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"); - goto unlock; + return; } if (mip->mii_func != NULL) @@ -723,9 +711,6 @@ 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 @@ -743,7 +728,8 @@ mii_queue(struct net_device *dev, int regval, void (*func)(uint, struct net_devi retval = 0; - spin_lock_irqsave(&fep->lock,flags); + save_flags(flags); + cli(); if ((mip = mii_free) != NULL) { mii_free = mip->mii_next; @@ -763,7 +749,7 @@ mii_queue(struct net_device *dev, int regval, void (*func)(uint, struct net_devi retval = 1; } - spin_unlock_irqrestore(&fep->lock,flags); + restore_flags(flags); return(retval); } @@ -1230,7 +1216,7 @@ static phy_info_t const * const phy_info[] = { }; /* ------------------------------------------------------------------------- */ -#if !defined(CONFIG_M532x) + #ifdef CONFIG_RPXCLASSIC static void mii_link_interrupt(void *dev_id); @@ -1238,7 +1224,6 @@ 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) @@ -1399,13 +1384,13 @@ static void __inline__ fec_request_intrs(struct net_device *dev) { volatile unsigned char *icrp; volatile unsigned long *imrp; - int i, ilip; + int i; b = (fep->index) ? MCFICM_INTC1 : MCFICM_INTC0; icrp = (volatile unsigned char *) (MCF_IPSBAR + b + MCFINTC_ICR0); - for (i = 23, ilip = 0x28; (i < 36); i++) - icrp[i] = ilip--; + for (i = 23; (i < 36); i++) + icrp[i] = 0x23; imrp = (volatile unsigned long *) (MCF_IPSBAR + b + MCFINTC_IMRH); @@ -1633,159 +1618,6 @@ 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 /* @@ -2153,12 +1985,9 @@ fec_enet_open(struct net_device *dev) mii_do_cmd(dev, fep->phy->config); mii_do_cmd(dev, phy_cmd_config); /* display configuration */ - /* 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. + /* 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 */ while(!fep->sequence_done) schedule(); @@ -2424,11 +2253,15 @@ 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 = 0; + fecp->fec_r_des_active = 0x01000000; dev->base_addr = (unsigned long)fecp; @@ -2448,11 +2281,6 @@ 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. */ @@ -2484,6 +2312,11 @@ 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; @@ -2575,12 +2408,7 @@ 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 = 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); + fecp->fec_r_des_active = 0x01000000; } static void @@ -2592,16 +2420,9 @@ fec_stop(struct net_device *dev) fep = netdev_priv(dev); fecp = fep->hwp; - /* - ** 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"); - } + fecp->fec_x_cntrl = 0x01; /* Graceful transmit stop */ + + while(!(fecp->fec_ievent & FEC_ENET_GRA)); /* Whack a reset. We should wait for this. */ diff --git a/drivers/net/fec.h b/drivers/net/fec.h index 1d4216069..965c5c49f 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_M532x) + defined(CONFIG_M520x) /* * 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 790d9dbe4..29c275e1d 100644 --- a/drivers/net/fec_8xx/fec_8xx-netta.c +++ b/drivers/net/fec_8xx/fec_8xx-netta.c @@ -2,6 +2,7 @@ * 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 282b1452c..b4f3a9f8a 100644 --- a/drivers/net/fec_8xx/fec_main.c +++ b/drivers/net/fec_8xx/fec_main.c @@ -10,6 +10,7 @@ * Released under the GPL */ +#include #include #include #include @@ -54,11 +55,11 @@ MODULE_AUTHOR("Pantelis Antoniou "); MODULE_DESCRIPTION("Motorola 8xx FEC ethernet driver"); MODULE_LICENSE("GPL"); -int fec_8xx_debug = -1; /* -1 == use FEC_8XX_DEF_MSG_ENABLE as value */ -module_param(fec_8xx_debug, int, 0); +MODULE_PARM(fec_8xx_debug, "i"); 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 d3c16b85d..3b44ac1a7 100644 --- a/drivers/net/fec_8xx/fec_mii.c +++ b/drivers/net/fec_8xx/fec_mii.c @@ -10,6 +10,7 @@ * Released under the GPL */ +#include #include #include #include diff --git a/drivers/net/forcedeth.c b/drivers/net/forcedeth.c index c7605867e..3682ec61e 100644 --- a/drivers/net/forcedeth.c +++ b/drivers/net/forcedeth.c @@ -102,13 +102,6 @@ * 0.47: 26 Oct 2005: Add phyaddr 0 in phy scan. * 0.48: 24 Dec 2005: Disable TSO, bugfix for pci_map_single * 0.49: 10 Dec 2005: Fix tso for large buffers. - * 0.50: 20 Jan 2006: Add 8021pq tagging support. - * 0.51: 20 Jan 2006: Add 64bit consistent memory allocation for rings. - * 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. @@ -120,7 +113,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.56" +#define FORCEDETH_VERSION "0.49" #define DRV_NAME "forcedeth" #include @@ -138,7 +131,6 @@ #include #include #include -#include #include #include @@ -161,13 +153,6 @@ #define DEV_HAS_LARGEDESC 0x0004 /* device supports jumbo frames and needs packet format 2 */ #define DEV_HAS_HIGH_DMA 0x0008 /* device supports 64bit dma */ #define DEV_HAS_CHECKSUM 0x0010 /* device supports tx and rx checksum offloads */ -#define DEV_HAS_VLAN 0x0020 /* device supports vlan tagging and striping */ -#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, @@ -181,17 +166,14 @@ enum { #define NVREG_IRQ_TX_OK 0x0010 #define NVREG_IRQ_TIMER 0x0020 #define NVREG_IRQ_LINK 0x0040 -#define NVREG_IRQ_RX_FORCED 0x0080 -#define NVREG_IRQ_TX_FORCED 0x0100 +#define NVREG_IRQ_TX_ERROR 0x0080 +#define NVREG_IRQ_TX1 0x0100 #define NVREG_IRQMASK_THROUGHPUT 0x00df #define NVREG_IRQMASK_CPU 0x0040 -#define NVREG_IRQ_TX_ALL (NVREG_IRQ_TX_ERR|NVREG_IRQ_TX_OK|NVREG_IRQ_TX_FORCED) -#define NVREG_IRQ_RX_ALL (NVREG_IRQ_RX_ERROR|NVREG_IRQ_RX|NVREG_IRQ_RX_NOBUF|NVREG_IRQ_RX_FORCED) -#define NVREG_IRQ_OTHER (NVREG_IRQ_TIMER|NVREG_IRQ_LINK) #define NVREG_IRQ_UNKNOWN (~(NVREG_IRQ_RX_ERROR|NVREG_IRQ_RX|NVREG_IRQ_RX_NOBUF|NVREG_IRQ_TX_ERR| \ - NVREG_IRQ_TX_OK|NVREG_IRQ_TIMER|NVREG_IRQ_LINK|NVREG_IRQ_RX_FORCED| \ - NVREG_IRQ_TX_FORCED)) + NVREG_IRQ_TX_OK|NVREG_IRQ_TIMER|NVREG_IRQ_LINK|NVREG_IRQ_TX_ERROR| \ + NVREG_IRQ_TX1)) NvRegUnknownSetupReg6 = 0x008, #define NVREG_UNKSETUP6_VAL 3 @@ -203,28 +185,19 @@ enum { NvRegPollingInterval = 0x00c, #define NVREG_POLL_DEFAULT_THROUGHPUT 970 #define NVREG_POLL_DEFAULT_CPU 13 - NvRegMSIMap0 = 0x020, - NvRegMSIMap1 = 0x024, - 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 - NvRegMacReset = 0x3c, -#define NVREG_MAC_RESET_ASSERT 0x0F3 NvRegTransmitterControl = 0x084, #define NVREG_XMITCTL_START 0x01 NvRegTransmitterStatus = 0x088, #define NVREG_XMITSTAT_BUSY 0x01 NvRegPacketFilterFlags = 0x8c, -#define NVREG_PFF_PAUSE_RX 0x08 -#define NVREG_PFF_ALWAYS 0x7F0000 +#define NVREG_PFF_ALWAYS 0x7F0008 #define NVREG_PFF_PROMISC 0x80 #define NVREG_PFF_MYADDR 0x20 -#define NVREG_PFF_LOOPBACK 0x10 NvRegOffloadConfig = 0x90, #define NVREG_OFFLOAD_HOMEPHY 0x601 @@ -240,12 +213,10 @@ enum { #define NVREG_RNDSEED_FORCE2 0x2d00 #define NVREG_RNDSEED_FORCE3 0x7400 - 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 + NvRegUnknownSetupReg1 = 0xA0, +#define NVREG_UNKSETUP1_VAL 0x16070f + NvRegUnknownSetupReg2 = 0xA4, +#define NVREG_UNKSETUP2_VAL 0x16 NvRegMacAddrA = 0xA8, NvRegMacAddrB = 0xAC, NvRegMulticastAddrA = 0xB0, @@ -271,10 +242,8 @@ enum { #define NVREG_LINKSPEED_MASK (0xFFF) NvRegUnknownSetupReg5 = 0x130, #define NVREG_UNKSETUP5_BIT31 (1<<31) - 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 + NvRegUnknownSetupReg3 = 0x13c, +#define NVREG_UNKSETUP3_VAL1 0x200010 NvRegTxRxControl = 0x144, #define NVREG_TXRXCTL_KICK 0x0001 #define NVREG_TXRXCTL_BIT1 0x0002 @@ -285,13 +254,6 @@ enum { #define NVREG_TXRXCTL_DESC_1 0 #define NVREG_TXRXCTL_DESC_2 0x02100 #define NVREG_TXRXCTL_DESC_3 0x02200 -#define NVREG_TXRXCTL_VLANSTRIP 0x00040 -#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 @@ -341,42 +303,6 @@ 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, - NvRegMSIXMap1 = 0x3e4, - NvRegMSIXIrqStatus = 0x3f0, - - NvRegPowerState2 = 0x600, -#define NVREG_POWERSTATE2_POWERUP_MASK 0x0F11 -#define NVREG_POWERSTATE2_POWERUP_REV_A3 0x0001 }; /* Big endian: should work, but is untested */ @@ -388,7 +314,7 @@ struct ring_desc { struct ring_desc_ex { u32 PacketBufferHigh; u32 PacketBufferLow; - u32 TxVlan; + u32 Reserved; u32 FlagLen; }; @@ -429,8 +355,6 @@ typedef union _ring_type { #define NV_TX2_CHECKSUM_L3 (1<<27) #define NV_TX2_CHECKSUM_L4 (1<<26) -#define NV_TX3_VLAN_TAG_PRESENT (1<<18) - #define NV_RX_DESCRIPTORVALID (1<<16) #define NV_RX_MISSEDFRAME (1<<17) #define NV_RX_SUBSTRACT1 (1<<18) @@ -461,12 +385,8 @@ typedef union _ring_type { #define NV_RX2_ERROR (1<<30) #define NV_RX2_AVAIL (1<<31) -#define NV_RX3_VLAN_TAG_PRESENT (1<<16) -#define NV_RX3_VLAN_TAG_MASK (0x0000FFFF) - /* Miscelaneous hardware related defines: */ -#define NV_PCI_REGSZ_VER1 0x270 -#define NV_PCI_REGSZ_VER2 0x604 +#define NV_PCI_REGSZ 0x270 /* various timeout delays: all in usec */ #define NV_TXRX_RESET_DELAY 4 @@ -483,7 +403,6 @@ typedef union _ring_type { #define NV_MIIBUSY_DELAY 50 #define NV_MIIPHY_DELAY 10 #define NV_MIIPHY_DELAYMAX 10000 -#define NV_MAC_RESET_DELAY 64 #define NV_WAKEUPPATTERNS 5 #define NV_WAKEUPMASKENTRIES 4 @@ -491,18 +410,16 @@ typedef union _ring_type { /* General driver defaults */ #define NV_WATCHDOG_TIMEO (5*HZ) -#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 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 TX_LIMIT_DIFFERENCE 1 +#define TX_LIMIT_STOP 255 +#define TX_LIMIT_START 254 /* rx/tx mac addr + type + vlan + align + slack*/ #define NV_RX_HEADERS (64) @@ -516,9 +433,8 @@ 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 @@ -551,121 +467,14 @@ typedef union _ring_type { #define PHY_1000 0x2 #define PHY_HALF 0x100 -#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 -#define NV_MSI_X_VECTORS_MASK 0x000f -#define NV_MSI_CAPABLE 0x0010 -#define NV_MSI_X_CAPABLE 0x0020 -#define NV_MSI_ENABLED 0x0040 -#define NV_MSI_X_ENABLED 0x0080 - -#define NV_MSI_X_VECTOR_ALL 0x0 -#define NV_MSI_X_VECTOR_RX 0x0 -#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) " } -}; +/* 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 -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: @@ -673,9 +482,9 @@ static const struct register_test nv_registers_test[] = { * critical parts: * - rx is (pseudo-) lockless: it relies on the single-threading provided * by the arch code for interrupts. - * - tx setup is lockless: it relies on netif_tx_lock. Actual submission + * - tx setup is lockless: it relies on dev->xmit_lock. Actual submission * needs dev->priv->lock :-( - * - set_multicast_list: preparation lockless, relies on netif_tx_lock. + * - set_multicast_list: preparation lockless, relies on dev->xmit_lock. */ /* in dev: base, irq */ @@ -685,7 +494,6 @@ 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; @@ -695,7 +503,6 @@ struct fe_priv { int wolenabled; unsigned int phy_oui; u16 gigabit; - int intr_test; /* General data: RO fields */ dma_addr_t ring_addr; @@ -704,9 +511,6 @@ struct fe_priv { u32 irqmask; u32 desc_ver; u32 txrxctl_bits; - u32 vlanctl_bits; - u32 driver_data; - u32 register_size; void __iomem *base; @@ -715,15 +519,12 @@ struct fe_priv { */ ring_type rx_ring; unsigned int cur_rx, refill_rx; - struct sk_buff **rx_skbuff; - dma_addr_t *rx_dma; + struct sk_buff *rx_skbuff[RX_RING]; + dma_addr_t rx_dma[RX_RING]; 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); @@ -735,23 +536,10 @@ struct fe_priv { */ ring_type tx_ring; unsigned int next_tx, nic_tx; - struct sk_buff **tx_skbuff; - dma_addr_t *tx_dma; - unsigned int *tx_dma_len; + struct sk_buff *tx_skbuff[TX_RING]; + dma_addr_t tx_dma[TX_RING]; + unsigned int tx_dma_len[TX_RING]; u32 tx_flags; - int tx_ring_size; - int tx_limit_start; - int tx_limit_stop; - - /* vlan fields */ - struct vlan_group *vlangrp; - - /* msi/msi-x fields */ - u32 msi_flags; - struct msix_entry msi_x_entry[NV_MSI_X_MAX_VECTORS]; - - /* flow control */ - u32 pause_flags; }; /* @@ -762,14 +550,12 @@ 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. */ -enum { - NV_OPTIMIZATION_MODE_THROUGHPUT, - NV_OPTIMIZATION_MODE_CPU -}; +#define NV_OPTIMIZATION_MODE_THROUGHPUT 0 +#define NV_OPTIMIZATION_MODE_CPU 1 static int optimization_mode = NV_OPTIMIZATION_MODE_THROUGHPUT; /* @@ -781,33 +567,6 @@ static int optimization_mode = NV_OPTIMIZATION_MODE_THROUGHPUT; */ static int poll_interval = -1; -/* - * MSI interrupts - */ -enum { - NV_MSI_INT_DISABLED, - NV_MSI_INT_ENABLED -}; -static int msi = NV_MSI_INT_ENABLED; - -/* - * MSIX interrupts - */ -enum { - NV_MSIX_INT_DISABLED, - NV_MSIX_INT_ENABLED -}; -static int msix = NV_MSIX_INT_ENABLED; - -/* - * DMA 64bit - */ -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) { return netdev_priv(dev); @@ -853,124 +612,6 @@ static int reg_delay(struct net_device *dev, int offset, u32 mask, u32 target, return 0; } -#define NV_SETUP_RX_RING 0x01 -#define NV_SETUP_TX_RING 0x02 - -static void setup_hw_rings(struct net_device *dev, int rxtx_flags) -{ - struct fe_priv *np = get_nvpriv(dev); - u8 __iomem *base = get_hwbase(dev); - - if (np->desc_ver == DESC_VER_1 || np->desc_ver == DESC_VER_2) { - if (rxtx_flags & NV_SETUP_RX_RING) { - 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 + np->rx_ring_size*sizeof(struct ring_desc)), base + NvRegTxRingPhysAddr); - } - } else { - if (rxtx_flags & NV_SETUP_RX_RING) { - writel((u32) cpu_to_le64(np->ring_addr), base + NvRegRxRingPhysAddr); - 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 + 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); - - if (!(np->msi_flags & NV_MSI_X_ENABLED) || - ((np->msi_flags & NV_MSI_X_ENABLED) && - ((np->msi_flags & NV_MSI_X_VECTORS_MASK) == 0x1))) - return 0; - else - return 1; -} - -static void nv_enable_irq(struct net_device *dev) -{ - struct fe_priv *np = get_nvpriv(dev); - - if (!using_multi_irqs(dev)) { - if (np->msi_flags & NV_MSI_X_ENABLED) - enable_irq(np->msi_x_entry[NV_MSI_X_VECTOR_ALL].vector); - else - enable_irq(dev->irq); - } else { - enable_irq(np->msi_x_entry[NV_MSI_X_VECTOR_RX].vector); - enable_irq(np->msi_x_entry[NV_MSI_X_VECTOR_TX].vector); - enable_irq(np->msi_x_entry[NV_MSI_X_VECTOR_OTHER].vector); - } -} - -static void nv_disable_irq(struct net_device *dev) -{ - struct fe_priv *np = get_nvpriv(dev); - - 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); - else - disable_irq(dev->irq); - } else { - disable_irq(np->msi_x_entry[NV_MSI_X_VECTOR_RX].vector); - disable_irq(np->msi_x_entry[NV_MSI_X_VECTOR_TX].vector); - disable_irq(np->msi_x_entry[NV_MSI_X_VECTOR_OTHER].vector); - } -} - -/* In MSIX mode, a write to irqmask behaves as XOR */ -static void nv_enable_hw_interrupts(struct net_device *dev, u32 mask) -{ - u8 __iomem *base = get_hwbase(dev); - - writel(mask, base + NvRegIrqMask); -} - -static void nv_disable_hw_interrupts(struct net_device *dev, u32 mask) -{ - struct fe_priv *np = get_nvpriv(dev); - u8 __iomem *base = get_hwbase(dev); - - if (np->msi_flags & NV_MSI_X_ENABLED) { - writel(mask, base + NvRegIrqMask); - } else { - if (np->msi_flags & NV_MSI_ENABLED) - writel(0, base + NvRegMSIIrqMask); - writel(0, base + NvRegIrqMask); - } -} - #define MII_READ (-1) /* mii_rw: read/write a register on the PHY. * @@ -1054,7 +695,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|ADVERTISE_PAUSE_ASYM|ADVERTISE_PAUSE_CAP); + reg |= (ADVERTISE_10HALF|ADVERTISE_10FULL|ADVERTISE_100HALF|ADVERTISE_100FULL|0x800|0x400); 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; @@ -1067,14 +708,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_CTRL1000, MII_READ); + mii_control_1000 = mii_rw(dev, np->phyaddr, MII_1000BT_CR, 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_CTRL1000, mii_control_1000)) { + if (mii_rw(dev, np->phyaddr, MII_1000BT_CR, mii_control_1000)) { printk(KERN_INFO "%s: phy init failed.\n", pci_name(np->pci_dev)); return PHY_ERROR; } @@ -1112,8 +753,6 @@ 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); @@ -1194,24 +833,6 @@ static void nv_txrx_reset(struct net_device *dev) pci_push(base); } -static void nv_mac_reset(struct net_device *dev) -{ - struct fe_priv *np = netdev_priv(dev); - u8 __iomem *base = get_hwbase(dev); - - dprintk(KERN_DEBUG "%s: nv_mac_reset\n", dev->name); - writel(NVREG_TXRXCTL_BIT2 | NVREG_TXRXCTL_RESET | np->txrxctl_bits, base + NvRegTxRxControl); - pci_push(base); - writel(NVREG_MAC_RESET_ASSERT, base + NvRegMacReset); - pci_push(base); - udelay(NV_MAC_RESET_DELAY); - writel(0, base + NvRegMacReset); - pci_push(base); - udelay(NV_MAC_RESET_DELAY); - writel(NVREG_TXRXCTL_BIT2 | np->txrxctl_bits, base + NvRegTxRxControl); - pci_push(base); -} - /* * nv_get_stats: dev->get_stats function * Get latest stats value from the nic. @@ -1243,7 +864,7 @@ static int nv_alloc_rx(struct net_device *dev) while (np->cur_rx != refill_rx) { struct sk_buff *skb; - nr = refill_rx % np->rx_ring_size; + nr = refill_rx % RX_RING; if (np->rx_skbuff[nr] == NULL) { skb = dev_alloc_skb(np->rx_buf_sz + NV_RX_ALLOC_PAD); @@ -1272,7 +893,7 @@ static int nv_alloc_rx(struct net_device *dev) refill_rx++; } np->refill_rx = refill_rx; - if (np->cur_rx - refill_rx == np->rx_ring_size) + if (np->cur_rx - refill_rx == RX_RING) return 1; return 0; } @@ -1282,38 +903,24 @@ static void nv_do_rx_refill(unsigned long data) struct net_device *dev = (struct net_device *) data; struct fe_priv *np = netdev_priv(dev); - 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); - else - disable_irq(dev->irq); - } else { - disable_irq(np->msi_x_entry[NV_MSI_X_VECTOR_RX].vector); - } + disable_irq(dev->irq); if (nv_alloc_rx(dev)) { - spin_lock_irq(&np->lock); + spin_lock(&np->lock); if (!np->in_shutdown) mod_timer(&np->oom_kick, jiffies + OOM_REFILL); - spin_unlock_irq(&np->lock); - } - if (!using_multi_irqs(dev)) { - if (np->msi_flags & NV_MSI_X_ENABLED) - enable_irq(np->msi_x_entry[NV_MSI_X_VECTOR_ALL].vector); - else - enable_irq(dev->irq); - } else { - enable_irq(np->msi_x_entry[NV_MSI_X_VECTOR_RX].vector); + spin_unlock(&np->lock); } + enable_irq(dev->irq); } -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 = np->rx_ring_size; + np->cur_rx = RX_RING; np->refill_rx = 0; - for (i = 0; i < np->rx_ring_size; i++) + for (i = 0; i < RX_RING; i++) if (np->desc_ver == DESC_VER_1 || np->desc_ver == DESC_VER_2) np->rx_ring.orig[i].FlagLen = 0; else @@ -1326,7 +933,7 @@ static void nv_init_tx(struct net_device *dev) int i; np->next_tx = np->nic_tx = 0; - for (i = 0; i < np->tx_ring_size; i++) { + for (i = 0; i < TX_RING; i++) { if (np->desc_ver == DESC_VER_1 || np->desc_ver == DESC_VER_2) np->tx_ring.orig[i].FlagLen = 0; else @@ -1358,7 +965,7 @@ static int nv_release_txskb(struct net_device *dev, unsigned int skbnr) } if (np->tx_skbuff[skbnr]) { - dev_kfree_skb_any(np->tx_skbuff[skbnr]); + dev_kfree_skb_irq(np->tx_skbuff[skbnr]); np->tx_skbuff[skbnr] = NULL; return 1; } else { @@ -1370,8 +977,8 @@ static void nv_drain_tx(struct net_device *dev) { struct fe_priv *np = netdev_priv(dev); unsigned int i; - - for (i = 0; i < np->tx_ring_size; i++) { + + for (i = 0; i < TX_RING; i++) { if (np->desc_ver == DESC_VER_1 || np->desc_ver == DESC_VER_2) np->tx_ring.orig[i].FlagLen = 0; else @@ -1385,7 +992,7 @@ static void nv_drain_rx(struct net_device *dev) { struct fe_priv *np = netdev_priv(dev); int i; - for (i = 0; i < np->rx_ring_size; i++) { + for (i = 0; i < RX_RING; i++) { if (np->desc_ver == DESC_VER_1 || np->desc_ver == DESC_VER_2) np->rx_ring.orig[i].FlagLen = 0; else @@ -1409,7 +1016,7 @@ static void drain_ring(struct net_device *dev) /* * nv_start_xmit: dev->hard_start_xmit function - * Called with netif_tx_lock held. + * Called with dev->xmit_lock held. */ static int nv_start_xmit(struct sk_buff *skb, struct net_device *dev) { @@ -1417,14 +1024,13 @@ 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) % np->tx_ring_size; - unsigned int start_nr = np->next_tx % np->tx_ring_size; + unsigned int nr = (np->next_tx - 1) % TX_RING; + unsigned int start_nr = np->next_tx % TX_RING; unsigned int i; u32 offset = 0; u32 bcnt; u32 size = skb->len-skb->data_len; u32 entries = (size >> NV_TX2_TSO_MAX_SHIFT) + ((size & (NV_TX2_TSO_MAX_SIZE-1)) ? 1 : 0); - u32 tx_flags_vlan = 0; /* add fragments to entries count */ for (i = 0; i < fragments; i++) { @@ -1434,7 +1040,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) > np->tx_limit_stop) { + if ((np->next_tx - np->nic_tx + entries - 1) > TX_LIMIT_STOP) { spin_unlock_irq(&np->lock); netif_stop_queue(dev); return NETDEV_TX_BUSY; @@ -1443,7 +1049,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) % np->tx_ring_size; + nr = (nr + 1) % TX_RING; np->tx_dma[nr] = pci_map_single(np->pci_dev, skb->data + offset, bcnt, PCI_DMA_TODEVICE); @@ -1470,7 +1076,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) % np->tx_ring_size; + nr = (nr + 1) % TX_RING; np->tx_dma[nr] = pci_map_page(np->pci_dev, frag->page, frag->page_offset+offset, bcnt, PCI_DMA_TODEVICE); @@ -1499,24 +1105,18 @@ static int nv_start_xmit(struct sk_buff *skb, struct net_device *dev) np->tx_skbuff[nr] = skb; #ifdef NETIF_F_TSO - if (skb_is_gso(skb)) - tx_flags_extra = NV_TX2_TSO | (skb_shinfo(skb)->gso_size << NV_TX2_TSO_SHIFT); + if (skb_shinfo(skb)->tso_size) + tx_flags_extra = NV_TX2_TSO | (skb_shinfo(skb)->tso_size << NV_TX2_TSO_SHIFT); else #endif tx_flags_extra = (skb->ip_summed == CHECKSUM_HW ? (NV_TX2_CHECKSUM_L3|NV_TX2_CHECKSUM_L4) : 0); - /* vlan tag */ - if (np->vlangrp && vlan_tx_tag_present(skb)) { - tx_flags_vlan = NV_TX3_VLAN_TAG_PRESENT | vlan_tx_tag_get(skb); - } - /* set tx flags */ if (np->desc_ver == DESC_VER_1 || np->desc_ver == DESC_VER_2) { np->tx_ring.orig[start_nr].FlagLen |= cpu_to_le32(tx_flags | tx_flags_extra); } 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); @@ -1552,7 +1152,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 % np->tx_ring_size; + i = np->nic_tx % TX_RING; if (np->desc_ver == DESC_VER_1 || np->desc_ver == DESC_VER_2) Flags = le32_to_cpu(np->tx_ring.orig[i].FlagLen); @@ -1591,32 +1191,27 @@ 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 < np->tx_limit_start) + if (np->next_tx - np->nic_tx < TX_LIMIT_START) netif_wake_queue(dev); } /* * nv_tx_timeout: dev->tx_timeout function - * Called with netif_tx_lock held. + * Called with dev->xmit_lock held. */ static void nv_tx_timeout(struct net_device *dev) { struct fe_priv *np = netdev_priv(dev); u8 __iomem *base = get_hwbase(dev); - u32 status; - - if (np->msi_flags & NV_MSI_X_ENABLED) - status = readl(base + NvRegMSIXIrqStatus) & NVREG_IRQSTAT_MASK; - else - status = readl(base + NvRegIrqStatus) & NVREG_IRQSTAT_MASK; - printk(KERN_INFO "%s: Got tx_timeout. irq: %08x\n", dev->name, status); + printk(KERN_INFO "%s: Got tx_timeout. irq: %08x\n", dev->name, + readl(base + NvRegIrqStatus) & NVREG_IRQSTAT_MASK); { int i; @@ -1625,7 +1220,7 @@ static void nv_tx_timeout(struct net_device *dev) dev->name, (unsigned long)np->ring_addr, np->next_tx, np->nic_tx); printk(KERN_INFO "%s: Dumping tx registers\n", dev->name); - for (i=0;i<=np->register_size;i+= 32) { + for (i=0;i<0x400;i+= 32) { printk(KERN_INFO "%3x: %08x %08x %08x %08x %08x %08x %08x %08x\n", i, readl(base + i + 0), readl(base + i + 4), @@ -1634,10 +1229,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) { + for (i=0;idesc_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), @@ -1648,7 +1243,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), @@ -1678,7 +1273,10 @@ static void nv_tx_timeout(struct net_device *dev) printk(KERN_DEBUG "%s: tx_timeout: dead entries!\n", dev->name); nv_drain_tx(dev); np->next_tx = np->nic_tx = 0; - setup_hw_rings(dev, NV_SETUP_TX_RING); + if (np->desc_ver == DESC_VER_1 || np->desc_ver == DESC_VER_2) + writel((u32) (np->ring_addr + RX_RING*sizeof(struct ring_desc)), base + NvRegTxRingPhysAddr); + else + writel((u32) (np->ring_addr + RX_RING*sizeof(struct ring_desc_ex)), base + NvRegTxRingPhysAddr); netif_wake_queue(dev); } @@ -1744,23 +1342,21 @@ static void nv_rx_process(struct net_device *dev) { struct fe_priv *np = netdev_priv(dev); u32 Flags; - u32 vlanflags = 0; for (;;) { struct sk_buff *skb; int len; int i; - if (np->cur_rx - np->refill_rx >= np->rx_ring_size) + if (np->cur_rx - np->refill_rx >= RX_RING) break; /* we scanned the whole ring - do not continue */ - i = np->cur_rx % np->rx_ring_size; + i = np->cur_rx % RX_RING; 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); } else { Flags = le32_to_cpu(np->rx_ring.ex[i].FlagLen); len = nv_descr_getlength_ex(&np->rx_ring.ex[i], np->desc_ver); - vlanflags = le32_to_cpu(np->rx_ring.ex[i].PacketBufferLow); } dprintk(KERN_DEBUG "%s: nv_rx_process: looking at packet %d, Flags 0x%x.\n", @@ -1860,16 +1456,14 @@ static void nv_rx_process(struct net_device *dev) } } } - 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); - } + 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 */ @@ -1880,11 +1474,7 @@ static void nv_rx_process(struct net_device *dev) skb->protocol = eth_type_trans(skb, dev); dprintk(KERN_DEBUG "%s: nv_rx_process: packet %d with %d bytes, proto %d accepted.\n", dev->name, np->cur_rx, len, skb->protocol); - if (np->vlangrp && (vlanflags & NV_RX3_VLAN_TAG_PRESENT)) { - vlan_hwaccel_rx(skb, np->vlangrp, vlanflags & NV_RX3_VLAN_TAG_MASK); - } else { - netif_rx(skb); - } + netif_rx(skb); dev->last_rx = jiffies; np->stats.rx_packets++; np->stats.rx_bytes += len; @@ -1933,8 +1523,8 @@ 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. */ - nv_disable_irq(dev); - netif_tx_lock_bh(dev); + disable_irq(dev->irq); + spin_lock_bh(&dev->xmit_lock); spin_lock(&np->lock); /* stop engines */ nv_stop_rx(dev); @@ -1944,15 +1534,22 @@ 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_init_ring(dev)) { + if (nv_alloc_rx(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), + writel((u32) np->ring_addr, base + NvRegRxRingPhysAddr); + if (np->desc_ver == DESC_VER_1 || np->desc_ver == DESC_VER_2) + writel((u32) (np->ring_addr + RX_RING*sizeof(struct ring_desc)), base + NvRegTxRingPhysAddr); + else + writel((u32) (np->ring_addr + RX_RING*sizeof(struct ring_desc_ex)), base + NvRegTxRingPhysAddr); + writel( ((RX_RING-1) << NVREG_RINGSZ_RXSHIFT) + ((TX_RING-1) << NVREG_RINGSZ_TXSHIFT), base + NvRegRingSizes); pci_push(base); writel(NVREG_TXRXCTL_KICK|np->txrxctl_bits, get_hwbase(dev) + NvRegTxRxControl); @@ -1962,8 +1559,8 @@ static int nv_change_mtu(struct net_device *dev, int new_mtu) nv_start_rx(dev); nv_start_tx(dev); spin_unlock(&np->lock); - netif_tx_unlock_bh(dev); - nv_enable_irq(dev); + spin_unlock_bh(&dev->xmit_lock); + enable_irq(dev->irq); } return 0; } @@ -1997,7 +1594,7 @@ static int nv_set_mac_address(struct net_device *dev, void *addr) memcpy(dev->dev_addr, macaddr->sa_data, ETH_ALEN); if (netif_running(dev)) { - netif_tx_lock_bh(dev); + spin_lock_bh(&dev->xmit_lock); spin_lock_irq(&np->lock); /* stop rx engine */ @@ -2009,7 +1606,7 @@ static int nv_set_mac_address(struct net_device *dev, void *addr) /* restart rx engine */ nv_start_rx(dev); spin_unlock_irq(&np->lock); - netif_tx_unlock_bh(dev); + spin_unlock_bh(&dev->xmit_lock); } else { nv_copy_mac_to_hw(dev); } @@ -2018,7 +1615,7 @@ static int nv_set_mac_address(struct net_device *dev, void *addr) /* * nv_set_multicast: dev->set_multicast function - * Called with netif_tx_lock held. + * Called with dev->xmit_lock held. */ static void nv_set_multicast(struct net_device *dev) { @@ -2026,16 +1623,16 @@ static void nv_set_multicast(struct net_device *dev) u8 __iomem *base = get_hwbase(dev); u32 addr[2]; u32 mask[2]; - u32 pff = readl(base + NvRegPacketFilterFlags) & NVREG_PFF_PAUSE_RX; + u32 pff; 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]; @@ -2080,35 +1677,6 @@ 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 @@ -2124,14 +1692,12 @@ static int nv_update_linkspeed(struct net_device *dev) { struct fe_priv *np = netdev_priv(dev); u8 __iomem *base = get_hwbase(dev); - int adv = 0; - int lpa = 0; - int adv_lpa, adv_pause, lpa_pause; + int adv, lpa; int newls = np->linkspeed; int newdup = np->duplex; int mii_status; int retval = 0; - u32 control_1000, status_1000, phyreg, pause_flags, txreg; + u32 control_1000, status_1000, phyreg; /* BMSR_LSTATUS is latched, read it twice: * we want the current value. @@ -2177,15 +1743,10 @@ 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_CTRL1000, MII_READ); - status_1000 = mii_rw(dev, np->phyaddr, MII_STAT1000, MII_READ); + control_1000 = mii_rw(dev, np->phyaddr, MII_1000BT_CR, MII_READ); + status_1000 = mii_rw(dev, np->phyaddr, MII_1000BT_SR, MII_READ); if ((control_1000 & ADVERTISE_1000FULL) && (status_1000 & LPA_1000FULL)) { @@ -2197,22 +1758,27 @@ 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 */ - adv_lpa = lpa & adv; - if (adv_lpa & LPA_100FULL) { + lpa = lpa & adv; + if (lpa & LPA_100FULL) { newls = NVREG_LINKSPEED_FORCE|NVREG_LINKSPEED_100; newdup = 1; - } else if (adv_lpa & LPA_100HALF) { + } else if (lpa & LPA_100HALF) { newls = NVREG_LINKSPEED_FORCE|NVREG_LINKSPEED_100; newdup = 0; - } else if (adv_lpa & LPA_10FULL) { + } else if (lpa & LPA_10FULL) { newls = NVREG_LINKSPEED_FORCE|NVREG_LINKSPEED_10; newdup = 1; - } else if (adv_lpa & LPA_10HALF) { + } else if (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, adv_lpa); + dprintk(KERN_DEBUG "%s: bad ability %04x - falling back to 10HD.\n", dev->name, lpa); newls = NVREG_LINKSPEED_FORCE|NVREG_LINKSPEED_10; newdup = 0; } @@ -2249,72 +1815,12 @@ 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; } @@ -2360,13 +1866,8 @@ static irqreturn_t nv_nic_irq(int foo, void *data, struct pt_regs *regs) dprintk(KERN_DEBUG "%s: nv_nic_irq\n", dev->name); for (i=0; ; i++) { - if (!(np->msi_flags & NV_MSI_X_ENABLED)) { - events = readl(base + NvRegIrqStatus) & NVREG_IRQSTAT_MASK; - writel(NVREG_IRQSTAT_MASK, base + NvRegIrqStatus); - } else { - events = readl(base + NvRegMSIXIrqStatus) & NVREG_IRQSTAT_MASK; - writel(NVREG_IRQSTAT_MASK, base + NvRegMSIXIrqStatus); - } + events = readl(base + NvRegIrqStatus) & NVREG_IRQSTAT_MASK; + writel(NVREG_IRQSTAT_MASK, base + NvRegIrqStatus); pci_push(base); dprintk(KERN_DEBUG "%s: irq: %08x\n", dev->name, events); if (!(events & np->irqmask)) @@ -2375,7 +1876,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); @@ -2383,7 +1884,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); @@ -2406,16 +1907,11 @@ static irqreturn_t nv_nic_irq(int foo, void *data, struct pt_regs *regs) if (i > max_interrupt_work) { spin_lock(&np->lock); /* disable interrupts on the nic */ - if (!(np->msi_flags & NV_MSI_X_ENABLED)) - writel(0, base + NvRegIrqMask); - else - writel(np->irqmask, base + NvRegIrqMask); + writel(0, base + NvRegIrqMask); pci_push(base); - if (!np->in_shutdown) { - np->nic_poll_irq = np->irqmask; + if (!np->in_shutdown) mod_timer(&np->nic_poll, jiffies + POLL_WAIT); - } printk(KERN_DEBUG "%s: too many iterations (%d) in nv_nic_irq.\n", dev->name, i); spin_unlock(&np->lock); break; @@ -2427,486 +1923,67 @@ static irqreturn_t nv_nic_irq(int foo, void *data, struct pt_regs *regs) return IRQ_RETVAL(i); } -static irqreturn_t nv_nic_irq_tx(int foo, void *data, struct pt_regs *regs) +static void nv_do_nic_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); - u32 events; - int i; - unsigned long flags; - - dprintk(KERN_DEBUG "%s: nv_nic_irq_tx\n", dev->name); - - for (i=0; ; i++) { - events = readl(base + NvRegMSIXIrqStatus) & NVREG_IRQ_TX_ALL; - writel(NVREG_IRQ_TX_ALL, base + NvRegMSIXIrqStatus); - pci_push(base); - dprintk(KERN_DEBUG "%s: tx irq: %08x\n", dev->name, events); - if (!(events & np->irqmask)) - break; - spin_lock_irqsave(&np->lock, flags); - nv_tx_done(dev); - spin_unlock_irqrestore(&np->lock, flags); + disable_irq(dev->irq); + /* FIXME: Do we need synchronize_irq(dev->irq) here? */ + /* + * reenable interrupts on the nic, we have to do this before calling + * nv_nic_irq because that may decide to do otherwise + */ + writel(np->irqmask, base + NvRegIrqMask); + pci_push(base); + nv_nic_irq((int) 0, (void *) data, (struct pt_regs *) NULL); + enable_irq(dev->irq); +} - 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_irqsave(&np->lock, flags); - /* disable interrupts on the nic */ - writel(NVREG_IRQ_TX_ALL, base + NvRegIrqMask); - pci_push(base); +#ifdef CONFIG_NET_POLL_CONTROLLER +static void nv_poll_controller(struct net_device *dev) +{ + nv_do_nic_poll((unsigned long) dev); +} +#endif - if (!np->in_shutdown) { - np->nic_poll_irq |= NVREG_IRQ_TX_ALL; - 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_irqrestore(&np->lock, flags); - break; - } +static void nv_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info) +{ + struct fe_priv *np = netdev_priv(dev); + strcpy(info->driver, "forcedeth"); + strcpy(info->version, FORCEDETH_VERSION); + strcpy(info->bus_info, pci_name(np->pci_dev)); +} - } - dprintk(KERN_DEBUG "%s: nv_nic_irq_tx completed\n", dev->name); +static void nv_get_wol(struct net_device *dev, struct ethtool_wolinfo *wolinfo) +{ + struct fe_priv *np = netdev_priv(dev); + wolinfo->supported = WAKE_MAGIC; - return IRQ_RETVAL(i); + spin_lock_irq(&np->lock); + if (np->wolenabled) + wolinfo->wolopts = WAKE_MAGIC; + spin_unlock_irq(&np->lock); } -static irqreturn_t nv_nic_irq_rx(int foo, void *data, struct pt_regs *regs) +static int nv_set_wol(struct net_device *dev, struct ethtool_wolinfo *wolinfo) { - struct net_device *dev = (struct net_device *) data; struct fe_priv *np = netdev_priv(dev); u8 __iomem *base = get_hwbase(dev); - u32 events; - int i; - unsigned long flags; - dprintk(KERN_DEBUG "%s: nv_nic_irq_rx\n", dev->name); - - for (i=0; ; i++) { - events = readl(base + NvRegMSIXIrqStatus) & NVREG_IRQ_RX_ALL; - writel(NVREG_IRQ_RX_ALL, base + NvRegMSIXIrqStatus); - pci_push(base); - 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_irqsave(&np->lock, flags); - if (!np->in_shutdown) - mod_timer(&np->oom_kick, jiffies + OOM_REFILL); - spin_unlock_irqrestore(&np->lock, flags); - } - - if (i > max_interrupt_work) { - spin_lock_irqsave(&np->lock, flags); - /* disable interrupts on the nic */ - writel(NVREG_IRQ_RX_ALL, base + NvRegIrqMask); - pci_push(base); - - if (!np->in_shutdown) { - np->nic_poll_irq |= NVREG_IRQ_RX_ALL; - 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_irqrestore(&np->lock, flags); - break; - } - - } - dprintk(KERN_DEBUG "%s: nv_nic_irq_rx completed\n", dev->name); - - return IRQ_RETVAL(i); -} - -static irqreturn_t nv_nic_irq_other(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; - int i; - unsigned long flags; - - dprintk(KERN_DEBUG "%s: nv_nic_irq_other\n", dev->name); - - for (i=0; ; i++) { - events = readl(base + NvRegMSIXIrqStatus) & NVREG_IRQ_OTHER; - writel(NVREG_IRQ_OTHER, base + NvRegMSIXIrqStatus); - pci_push(base); - dprintk(KERN_DEBUG "%s: irq: %08x\n", dev->name, events); - if (!(events & np->irqmask)) - break; - - if (events & NVREG_IRQ_LINK) { - spin_lock_irqsave(&np->lock, flags); - nv_link_irq(dev); - spin_unlock_irqrestore(&np->lock, flags); - } - if (np->need_linktimer && time_after(jiffies, np->link_timeout)) { - spin_lock_irqsave(&np->lock, flags); - nv_linkchange(dev); - spin_unlock_irqrestore(&np->lock, flags); - np->link_timeout = jiffies + LINK_TIMEOUT; - } - if (events & (NVREG_IRQ_UNKNOWN)) { - printk(KERN_DEBUG "%s: received irq with unknown events 0x%x. Please report\n", - dev->name, events); - } - if (i > max_interrupt_work) { - spin_lock_irqsave(&np->lock, flags); - /* disable interrupts on the nic */ - writel(NVREG_IRQ_OTHER, base + NvRegIrqMask); - pci_push(base); - - if (!np->in_shutdown) { - np->nic_poll_irq |= NVREG_IRQ_OTHER; - 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_irqrestore(&np->lock, flags); - break; - } - - } - dprintk(KERN_DEBUG "%s: nv_nic_irq_other completed\n", dev->name); - - 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) { - pci_intx(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); - pci_intx(np->pci_dev, 1); - 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); - pci_intx(np->pci_dev, 1); - np->msi_flags &= ~NV_MSI_ENABLED; - } - } -} - -static void nv_do_nic_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); - u32 mask = 0; - - /* - * First disable irq(s) and then - * reenable interrupts on the nic, we have to do this before calling - * nv_nic_irq because that may decide to do otherwise - */ - - if (!using_multi_irqs(dev)) { - if (np->msi_flags & NV_MSI_X_ENABLED) - disable_irq_lockdep(np->msi_x_entry[NV_MSI_X_VECTOR_ALL].vector); - else - disable_irq_lockdep(dev->irq); - mask = np->irqmask; - } else { - if (np->nic_poll_irq & NVREG_IRQ_RX_ALL) { - 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_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_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(0, dev, NULL); - if (np->msi_flags & NV_MSI_X_ENABLED) - enable_irq_lockdep(np->msi_x_entry[NV_MSI_X_VECTOR_ALL].vector); - else - enable_irq_lockdep(dev->irq); - } else { - if (np->nic_poll_irq & NVREG_IRQ_RX_ALL) { - 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(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(0, dev, NULL); - enable_irq_lockdep(np->msi_x_entry[NV_MSI_X_VECTOR_OTHER].vector); - } - } -} - -#ifdef CONFIG_NET_POLL_CONTROLLER -static void nv_poll_controller(struct net_device *dev) -{ - nv_do_nic_poll((unsigned long) dev); -} -#endif - -static void nv_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"); - strcpy(info->version, FORCEDETH_VERSION); - strcpy(info->bus_info, pci_name(np->pci_dev)); -} - -static void nv_get_wol(struct net_device *dev, struct ethtool_wolinfo *wolinfo) -{ - struct fe_priv *np = netdev_priv(dev); - wolinfo->supported = WAKE_MAGIC; - - spin_lock_irq(&np->lock); - if (np->wolenabled) - wolinfo->wolopts = WAKE_MAGIC; - spin_unlock_irq(&np->lock); -} - -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; - - if (wolinfo->wolopts == 0) { - np->wolenabled = 0; - } 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); - } - return 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); + np->wolenabled = 1; + } + spin_unlock_irq(&np->lock); + return 0; +} static int nv_get_settings(struct net_device *dev, struct ethtool_cmd *ecmd) { @@ -2918,17 +1995,9 @@ 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 */ - if (nv_update_linkspeed(dev)) { - if (!netif_carrier_ok(dev)) - netif_carrier_on(dev); - } else { - if (netif_carrier_ok(dev)) - netif_carrier_off(dev); - } + nv_update_linkspeed(dev); } - - if (netif_carrier_ok(dev)) { - switch(np->linkspeed & (NVREG_LINKSPEED_MASK)) { + switch(np->linkspeed & (NVREG_LINKSPEED_MASK)) { case NVREG_LINKSPEED_10: ecmd->speed = SPEED_10; break; @@ -2938,14 +2007,10 @@ 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; @@ -2953,20 +2018,23 @@ 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); - 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; - } + } 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; } + ecmd->supported = (SUPPORTED_Autoneg | SUPPORTED_10baseT_Half | SUPPORTED_10baseT_Full | SUPPORTED_100baseT_Half | SUPPORTED_100baseT_Full | @@ -2979,859 +2047,161 @@ static int nv_get_settings(struct net_device *dev, struct ethtool_cmd *ecmd) /* ignore maxtxpkt, maxrxpkt for now */ spin_unlock_irq(&np->lock); - return 0; -} - -static int nv_set_settings(struct net_device *dev, struct ethtool_cmd *ecmd) -{ - struct fe_priv *np = netdev_priv(dev); - - if (ecmd->port != PORT_MII) - return -EINVAL; - if (ecmd->transceiver != XCVR_EXTERNAL) - return -EINVAL; - if (ecmd->phy_address != np->phyaddr) { - /* TODO: support switching between multiple phys. Should be - * trivial, but not enabled due to lack of test hardware. */ - return -EINVAL; - } - if (ecmd->autoneg == AUTONEG_ENABLE) { - u32 mask; - - mask = ADVERTISED_10baseT_Half | ADVERTISED_10baseT_Full | - ADVERTISED_100baseT_Half | ADVERTISED_100baseT_Full; - if (np->gigabit == PHY_GIGABIT) - mask |= ADVERTISED_1000baseT_Full; - - if ((ecmd->advertising & mask) == 0) - return -EINVAL; - - } else if (ecmd->autoneg == AUTONEG_DISABLE) { - /* Note: autonegotiation disable, speed 1000 intentionally - * forbidden - noone should need that. */ - - if (ecmd->speed != SPEED_10 && ecmd->speed != SPEED_100) - return -EINVAL; - if (ecmd->duplex != DUPLEX_HALF && ecmd->duplex != DUPLEX_FULL) - return -EINVAL; - } else { - 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); - } - - if (ecmd->autoneg == AUTONEG_ENABLE) { - int adv, bmcr; - - np->autoneg = 1; - - /* advertise only what has been requested */ - adv = mii_rw(dev, np->phyaddr, MII_ADVERTISE, MII_READ); - 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) - adv |= ADVERTISE_10FULL; - if (ecmd->advertising & ADVERTISED_100baseT_Half) - 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_CTRL1000, MII_READ); - adv &= ~ADVERTISE_1000FULL; - if (ecmd->advertising & ADVERTISED_1000baseT_Full) - adv |= ADVERTISE_1000FULL; - 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); - - } else { - int adv, bmcr; - - np->autoneg = 0; - - adv = mii_rw(dev, np->phyaddr, MII_ADVERTISE, MII_READ); - 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) - adv |= ADVERTISE_10FULL; - if (ecmd->speed == SPEED_100 && ecmd->duplex == DUPLEX_HALF) - 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_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; + return 0; } -static int nv_loopback_test(struct net_device *dev) +static int nv_set_settings(struct net_device *dev, struct ethtool_cmd *ecmd) { 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); + if (ecmd->port != PORT_MII) + return -EINVAL; + if (ecmd->transceiver != XCVR_EXTERNAL) + return -EINVAL; + if (ecmd->phy_address != np->phyaddr) { + /* TODO: support switching between multiple phys. Should be + * trivial, but not enabled due to lack of test hardware. */ + return -EINVAL; } + if (ecmd->autoneg == AUTONEG_ENABLE) { + u32 mask; - /* 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); + mask = ADVERTISED_10baseT_Half | ADVERTISED_10baseT_Full | + ADVERTISED_100baseT_Half | ADVERTISED_100baseT_Full; + if (np->gigabit == PHY_GIGABIT) + mask |= ADVERTISED_1000baseT_Full; - /* restart rx engine */ - nv_start_rx(dev); - nv_start_tx(dev); + if ((ecmd->advertising & mask) == 0) + return -EINVAL; - /* 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); + } else if (ecmd->autoneg == AUTONEG_DISABLE) { + /* Note: autonegotiation disable, speed 1000 intentionally + * forbidden - noone should need that. */ - 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); + if (ecmd->speed != SPEED_10 && ecmd->speed != SPEED_100) + return -EINVAL; + if (ecmd->duplex != DUPLEX_HALF && ecmd->duplex != DUPLEX_FULL) + return -EINVAL; } 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); + return -EINVAL; } - writel(NVREG_TXRXCTL_KICK|np->txrxctl_bits, get_hwbase(dev) + NvRegTxRxControl); - pci_push(get_hwbase(dev)); - msleep(500); + spin_lock_irq(&np->lock); + if (ecmd->autoneg == AUTONEG_ENABLE) { + int adv, bmcr; - /* 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); + np->autoneg = 1; - } else { - Flags = le32_to_cpu(np->rx_ring.ex[0].FlagLen); - len = nv_descr_getlength_ex(&np->rx_ring.ex[0], np->desc_ver); - } + /* advertise only what has been requested */ + adv = mii_rw(dev, np->phyaddr, MII_ADVERTISE, MII_READ); + adv &= ~(ADVERTISE_ALL | ADVERTISE_100BASE4); + if (ecmd->advertising & ADVERTISED_10baseT_Half) + adv |= ADVERTISE_10HALF; + if (ecmd->advertising & ADVERTISED_10baseT_Full) + adv |= ADVERTISE_10FULL; + if (ecmd->advertising & ADVERTISED_100baseT_Half) + adv |= ADVERTISE_100HALF; + if (ecmd->advertising & ADVERTISED_100baseT_Full) + adv |= ADVERTISE_100FULL; + mii_rw(dev, np->phyaddr, MII_ADVERTISE, adv); - 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; + if (np->gigabit == PHY_GIGABIT) { + adv = mii_rw(dev, np->phyaddr, MII_1000BT_CR, MII_READ); + adv &= ~ADVERTISE_1000FULL; + if (ecmd->advertising & ADVERTISED_1000baseT_Full) + adv |= ADVERTISE_1000FULL; + mii_rw(dev, np->phyaddr, MII_1000BT_CR, adv); } - } - 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; - } - } - } + bmcr = mii_rw(dev, np->phyaddr, MII_BMCR, MII_READ); + bmcr |= (BMCR_ANENABLE | BMCR_ANRESTART); + mii_rw(dev, np->phyaddr, MII_BMCR, bmcr); + } else { - dprintk(KERN_DEBUG "%s: loopback - did not receive test packet\n", dev->name); - } + int adv, bmcr; - pci_unmap_page(np->pci_dev, test_dma_addr, - tx_skb->end-tx_skb->data, - PCI_DMA_TODEVICE); - dev_kfree_skb_any(tx_skb); + np->autoneg = 0; - /* 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); + adv = mii_rw(dev, np->phyaddr, MII_ADVERTISE, MII_READ); + adv &= ~(ADVERTISE_ALL | ADVERTISE_100BASE4); + if (ecmd->speed == SPEED_10 && ecmd->duplex == DUPLEX_HALF) + adv |= ADVERTISE_10HALF; + if (ecmd->speed == SPEED_10 && ecmd->duplex == DUPLEX_FULL) + adv |= ADVERTISE_10FULL; + if (ecmd->speed == SPEED_100 && ecmd->duplex == DUPLEX_HALF) + adv |= ADVERTISE_100HALF; + if (ecmd->speed == SPEED_100 && ecmd->duplex == DUPLEX_FULL) + adv |= ADVERTISE_100FULL; + mii_rw(dev, np->phyaddr, MII_ADVERTISE, adv); + np->fixed_mode = adv; - if (netif_running(dev)) { - writel(misc1_flags, base + NvRegMisc1); - writel(filter_flags, base + NvRegPacketFilterFlags); - nv_enable_irq(dev); + 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); + } + + 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); + + if (netif_running(dev)) { + /* Wait a bit and then reconfigure the nic. */ + udelay(10); + nv_linkchange(dev); + } } + spin_unlock_irq(&np->lock); - return ret; + return 0; +} + +#define FORCEDETH_REGS_VER 1 +#define FORCEDETH_REGS_SIZE 0x400 /* 256 32-bit registers */ + +static int nv_get_regs_len(struct net_device *dev) +{ + return FORCEDETH_REGS_SIZE; } -static void nv_self_test(struct net_device *dev, struct ethtool_test *test, u64 *buffer) +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); - int result; - memset(buffer, 0, nv_self_test_count(dev)*sizeof(u64)); - - if (!nv_link_test(dev)) { - test->flags |= ETH_TEST_FL_FAILED; - buffer[0] = 1; - } + u32 *rbuf = buf; + int i; - 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); - } + regs->version = FORCEDETH_REGS_VER; + spin_lock_irq(&np->lock); + for (i=0;ilock); +} - if (!nv_register_test(dev)) { - test->flags |= ETH_TEST_FL_FAILED; - buffer[1] = 1; - } +static int nv_nway_reset(struct net_device *dev) +{ + struct fe_priv *np = netdev_priv(dev); + int ret; - result = nv_interrupt_test(dev); - if (result != 1) { - test->flags |= ETH_TEST_FL_FAILED; - buffer[2] = 1; - } - if (result == 0) { - /* bail out */ - return; - } + spin_lock_irq(&np->lock); + if (np->autoneg) { + int bmcr; - if (!nv_loopback_test(dev)) { - test->flags |= ETH_TEST_FL_FAILED; - buffer[3] = 1; - } + 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)) { - /* 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); - } + ret = 0; + } else { + ret = -EINVAL; } -} + spin_unlock_irq(&np->lock); -static void nv_get_strings(struct net_device *dev, u32 stringset, u8 *buffer) -{ - 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; - } + return ret; } static struct ethtool_ops ops = { @@ -3845,65 +2215,17 @@ static struct ethtool_ops ops = { .get_regs = nv_get_regs, .nway_reset = nv_nway_reset, .get_perm_addr = ethtool_op_get_perm_addr, - .get_tso = ethtool_op_get_tso, - .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) -{ - struct fe_priv *np = get_nvpriv(dev); - - spin_lock_irq(&np->lock); - - /* save vlan group */ - np->vlangrp = grp; - - if (grp) { - /* enable vlan on MAC */ - np->txrxctl_bits |= NVREG_TXRXCTL_VLANSTRIP | NVREG_TXRXCTL_VLANINS; - } else { - /* disable vlan on MAC */ - np->txrxctl_bits &= ~NVREG_TXRXCTL_VLANSTRIP; - np->txrxctl_bits &= ~NVREG_TXRXCTL_VLANINS; - } - - writel(np->txrxctl_bits, get_hwbase(dev) + NvRegTxRxControl); - - spin_unlock_irq(&np->lock); -}; - -static void nv_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid) -{ - /* nothing to do */ }; static int nv_open(struct net_device *dev) { struct fe_priv *np = netdev_priv(dev); u8 __iomem *base = get_hwbase(dev); - int ret = 1; - int oom, i; + int ret, oom, i; dprintk(KERN_DEBUG "nv_open: begin\n"); /* 1) erase previous misconfiguration */ - if (np->driver_data & DEV_HAS_POWER_CNTRL) - nv_mac_reset(dev); /* 4.1-1: stop adapter: ignored, 4.3 seems to be overkill */ writel(NVREG_MCASTADDRA_FORCE, base + NvRegMulticastAddrA); writel(0, base + NvRegMulticastAddrB); @@ -3916,9 +2238,6 @@ 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); @@ -3934,18 +2253,18 @@ static int nv_open(struct net_device *dev) nv_copy_mac_to_hw(dev); /* 4) give hw rings */ - 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), + writel((u32) np->ring_addr, base + NvRegRxRingPhysAddr); + if (np->desc_ver == DESC_VER_1 || np->desc_ver == DESC_VER_2) + writel((u32) (np->ring_addr + RX_RING*sizeof(struct ring_desc)), base + NvRegTxRingPhysAddr); + else + writel((u32) (np->ring_addr + RX_RING*sizeof(struct ring_desc_ex)), base + NvRegTxRingPhysAddr); + writel( ((RX_RING-1) << NVREG_RINGSZ_RXSHIFT) + ((TX_RING-1) << NVREG_RINGSZ_TXSHIFT), base + NvRegRingSizes); /* 5) continue setup */ writel(np->linkspeed, base + NvRegLinkSpeed); - 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(NVREG_UNKSETUP3_VAL1, base + NvRegUnknownSetupReg3); writel(np->txrxctl_bits, base + NvRegTxRxControl); - writel(np->vlanctl_bits, base + NvRegVlanControl); pci_push(base); writel(NVREG_TXRXCTL_BIT1|np->txrxctl_bits, base + NvRegTxRxControl); reg_delay(dev, NvRegUnknownSetupReg5, NVREG_UNKSETUP5_BIT31, NVREG_UNKSETUP5_BIT31, @@ -3965,8 +2284,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_TX_DEFERRAL_DEFAULT, base + NvRegTxDeferral); - writel(NVREG_RX_DEFERRAL_DEFAULT, base + NvRegRxDeferral); + writel(NVREG_UNKSETUP1_VAL, base + NvRegUnknownSetupReg1); + writel(NVREG_UNKSETUP2_VAL, base + NvRegUnknownSetupReg2); if (poll_interval == -1) { if (optimization_mode == NV_OPTIMIZATION_MODE_THROUGHPUT) writel(NVREG_POLL_DEFAULT_THROUGHPUT, base + NvRegPollingInterval); @@ -3980,8 +2299,7 @@ static int nv_open(struct net_device *dev) base + NvRegAdapterControl); writel(NVREG_MIISPEED_BIT8|NVREG_MIIDELAY, base + NvRegMIISpeed); writel(NVREG_UNKSETUP4_VAL, base + NvRegUnknownSetupReg4); - if (np->wolenabled) - writel(NVREG_WAKEUPFLAGS_ENABLE , base + NvRegWakeUpFlags); + writel(NVREG_WAKEUPFLAGS_VAL, base + NvRegWakeUpFlags); i = readl(base + NvRegPowerState); if ( (i & NVREG_POWERSTATE_POWEREDUP) == 0) @@ -3991,18 +2309,18 @@ static int nv_open(struct net_device *dev) udelay(10); writel(readl(base + NvRegPowerState) | NVREG_POWERSTATE_VALID, base + NvRegPowerState); - nv_disable_hw_interrupts(dev, np->irqmask); + writel(0, base + NvRegIrqMask); pci_push(base); writel(NVREG_MIISTAT_MASK2, base + NvRegMIIStatus); writel(NVREG_IRQSTAT_MASK, base + NvRegIrqStatus); pci_push(base); - if (nv_request_irq(dev, 0)) { + ret = request_irq(dev->irq, &nv_nic_irq, SA_SHIRQ, dev->name, dev); + if (ret) goto out_drain; - } /* ask for interrupts */ - nv_enable_hw_interrupts(dev, np->irqmask); + writel(np->irqmask, base + NvRegIrqMask); spin_lock_irq(&np->lock); writel(NVREG_MCASTADDRA_FORCE, base + NvRegMulticastAddrA); @@ -4034,11 +2352,6 @@ 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; @@ -4059,7 +2372,6 @@ 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); @@ -4069,13 +2381,13 @@ static int nv_close(struct net_device *dev) /* disable interrupts on the nic or we will lock up */ base = get_hwbase(dev); - nv_disable_hw_interrupts(dev, np->irqmask); + writel(0, base + NvRegIrqMask); pci_push(base); dprintk(KERN_INFO "%s: Irqmask is zero again\n", dev->name); spin_unlock_irq(&np->lock); - nv_free_irq(dev); + free_irq(dev->irq, dev); drain_ring(dev); @@ -4100,7 +2412,6 @@ static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_i unsigned long addr; u8 __iomem *base; int err, i; - u32 powerstate; dev = alloc_etherdev(sizeof(struct fe_priv)); err = -ENOMEM; @@ -4119,9 +2430,6 @@ 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) { @@ -4136,11 +2444,6 @@ 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|DEV_HAS_STATISTICS)) - np->register_size = NV_PCI_REGSZ_VER2; - else - np->register_size = NV_PCI_REGSZ_VER1; - err = -EINVAL; addr = 0; for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) { @@ -4149,7 +2452,7 @@ static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_i pci_resource_len(pci_dev, i), pci_resource_flags(pci_dev, i)); if (pci_resource_flags(pci_dev, i) & IORESOURCE_MEM && - pci_resource_len(pci_dev, i) >= np->register_size) { + pci_resource_len(pci_dev, i) >= NV_PCI_REGSZ) { addr = pci_resource_start(pci_dev, i); break; } @@ -4160,27 +2463,17 @@ static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_i goto out_relreg; } - /* copy of driver data */ - np->driver_data = id->driver_data; - /* handle different descriptor versions */ if (id->driver_data & DEV_HAS_HIGH_DMA) { /* packet format 3: supports 40-bit addressing */ np->desc_ver = DESC_VER_3; - np->txrxctl_bits = NVREG_TXRXCTL_DESC_3; - 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)); - } + if (pci_set_dma_mask(pci_dev, 0x0000007fffffffffULL)) { + 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; } + np->txrxctl_bits = NVREG_TXRXCTL_DESC_3; } else if (id->driver_data & DEV_HAS_LARGEDESC) { /* packet format 2: supports jumbo frames */ np->desc_ver = DESC_VER_2; @@ -4203,68 +2496,29 @@ static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_i #endif } - np->vlanctl_bits = 0; - if (id->driver_data & DEV_HAS_VLAN) { - np->vlanctl_bits = NVREG_VLANCONTROL_ENABLE; - dev->features |= NETIF_F_HW_VLAN_RX | NETIF_F_HW_VLAN_TX; - dev->vlan_rx_register = nv_vlan_rx_register; - dev->vlan_rx_kill_vid = nv_vlan_rx_kill_vid; - } - - np->msi_flags = 0; - if ((id->driver_data & DEV_HAS_MSI) && msi) { - np->msi_flags |= NV_MSI_CAPABLE; - } - 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); + np->base = ioremap(addr, NV_PCI_REGSZ); if (!np->base) goto out_relreg; dev->base_addr = (unsigned long)np->base; 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) * (np->rx_ring_size + np->tx_ring_size), + sizeof(struct ring_desc) * (RX_RING + TX_RING), &np->ring_addr); if (!np->rx_ring.orig) goto out_unmap; - np->tx_ring.orig = &np->rx_ring.orig[np->rx_ring_size]; + np->tx_ring.orig = &np->rx_ring.orig[RX_RING]; } else { np->rx_ring.ex = pci_alloc_consistent(pci_dev, - sizeof(struct ring_desc_ex) * (np->rx_ring_size + np->tx_ring_size), + sizeof(struct ring_desc_ex) * (RX_RING + TX_RING), &np->ring_addr); if (!np->rx_ring.ex) goto out_unmap; - np->tx_ring.ex = &np->rx_ring.ex[np->rx_ring_size]; + np->tx_ring.ex = &np->rx_ring.ex[RX_RING]; } - 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; @@ -4319,34 +2573,15 @@ static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_i writel(0, base + NvRegWakeUpFlags); np->wolenabled = 0; - if (id->driver_data & DEV_HAS_POWER_CNTRL) { - u8 revision_id; - pci_read_config_byte(pci_dev, PCI_REVISION_ID, &revision_id); - - /* take phy and nic out of low power mode */ - powerstate = readl(base + NvRegPowerState2); - powerstate &= ~NVREG_POWERSTATE2_POWERUP_MASK; - if ((id->device == PCI_DEVICE_ID_NVIDIA_NVENET_12 || - id->device == PCI_DEVICE_ID_NVIDIA_NVENET_13) && - revision_id >= 0xA3) - powerstate |= NVREG_POWERSTATE2_POWERUP_REV_A3; - writel(powerstate, base + NvRegPowerState2); - } - if (np->desc_ver == DESC_VER_1) { np->tx_flags = NV_TX_VALID; } else { np->tx_flags = NV_TX2_VALID; } - if (optimization_mode == NV_OPTIMIZATION_MODE_THROUGHPUT) { + if (optimization_mode == NV_OPTIMIZATION_MODE_THROUGHPUT) np->irqmask = NVREG_IRQMASK_THROUGHPUT; - if (np->msi_flags & NV_MSI_X_CAPABLE) /* set number of vectors */ - np->msi_flags |= 0x0003; - } else { + else np->irqmask = NVREG_IRQMASK_CPU; - if (np->msi_flags & NV_MSI_X_CAPABLE) /* set number of vectors */ - np->msi_flags |= 0x0001; - } if (id->driver_data & DEV_NEED_TIMERIRQ) np->irqmask |= NVREG_IRQ_TIMER; @@ -4386,9 +2621,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_error; + goto out_freering; } - + /* reset it */ phy_init(dev); @@ -4400,7 +2635,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_error; + goto out_freering; } printk(KERN_INFO "%s: forcedeth.c: subsystem: %05x:%04x bound to %s\n", dev->name, pci_dev->subsystem_vendor, pci_dev->subsystem_device, @@ -4408,10 +2643,14 @@ static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_i return 0; -out_error: - pci_set_drvdata(pci_dev, NULL); out_freering: - free_rings(dev); + 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); + pci_set_drvdata(pci_dev, NULL); out_unmap: iounmap(get_hwbase(dev)); out_relreg: @@ -4427,11 +2666,15 @@ 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 */ - free_rings(dev); + 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); iounmap(get_hwbase(dev)); pci_release_regions(pci_dev); pci_disable_device(pci_dev); @@ -4439,50 +2682,6 @@ static void __devexit nv_remove(struct pci_dev *pci_dev) pci_set_drvdata(pci_dev, NULL); } - -#ifdef CONFIG_PM - -static int nv_suspend(struct pci_dev *pdev, pm_message_t state) -{ - struct net_device *dev = pci_get_drvdata(pdev); - struct fe_priv *np = netdev_priv(dev); - - if (!netif_running(dev)) - goto out; - - netif_device_detach(dev); - - // Gross. - nv_close(dev); - - pci_save_state(pdev); - pci_enable_wake(pdev, pci_choose_state(pdev, state), np->wolenabled); - pci_set_power_state(pdev, pci_choose_state(pdev, state)); -out: - return 0; -} - -static int nv_resume(struct pci_dev *pdev) -{ - struct net_device *dev = pci_get_drvdata(pdev); - int rc = 0; - - if (!netif_running(dev)) - goto out; - - netif_device_attach(dev); - - pci_set_power_state(pdev, PCI_D0); - pci_restore_state(pdev); - pci_enable_wake(pdev, PCI_D0, 0); - - rc = nv_open(dev); -out: - return rc; -} - -#endif /* CONFIG_PM */ - static struct pci_device_id pci_tbl[] = { { /* nForce Ethernet Controller */ PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_1), @@ -4530,51 +2729,19 @@ static struct pci_device_id pci_tbl[] = { }, { /* MCP51 Ethernet Controller */ PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_12), - .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_HIGH_DMA|DEV_HAS_POWER_CNTRL, + .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_HIGH_DMA, }, { /* MCP51 Ethernet Controller */ PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_13), - .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_HIGH_DMA|DEV_HAS_POWER_CNTRL, + .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_HIGH_DMA, }, { /* 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|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS|DEV_HAS_TEST_EXTENDED, + .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_LARGEDESC|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA, }, { /* 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|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, + .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_LARGEDESC|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA, }, {0,}, }; @@ -4584,10 +2751,6 @@ static struct pci_driver driver = { .id_table = pci_tbl, .probe = nv_probe, .remove = __devexit_p(nv_remove), -#ifdef CONFIG_PM - .suspend = nv_suspend, - .resume = nv_resume, -#endif }; @@ -4608,12 +2771,6 @@ 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(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 02d4dc18b..d6dd3f2fb 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 mii-fec.o -obj-$(CONFIG_CPM2) += mac-fcc.o mii-bitbang.o +obj-$(CONFIG_8xx) += mac-fec.o mac-scc.o +obj-$(CONFIG_8260) += mac-fcc.o -fs_enet-objs := fs_enet-main.o +fs_enet-objs := fs_enet-main.o fs_enet-mii.o mii-bitbang.o mii-fixed.o diff --git a/drivers/net/fs_enet/fs_enet-main.c b/drivers/net/fs_enet/fs_enet-main.c index df62506a1..f5d49a110 100644 --- a/drivers/net/fs_enet/fs_enet-main.c +++ b/drivers/net/fs_enet/fs_enet-main.c @@ -15,6 +15,7 @@ * kind, whether express or implied. */ +#include #include #include #include @@ -37,7 +38,6 @@ #include #include #include -#include #include #include @@ -58,11 +58,11 @@ MODULE_DESCRIPTION("Freescale Ethernet Driver"); MODULE_LICENSE("GPL"); MODULE_VERSION(DRV_MODULE_VERSION); -int fs_enet_debug = -1; /* -1 == use FS_ENET_DEF_MSG_ENABLE as value */ -module_param(fs_enet_debug, int, 0); +MODULE_PARM(fs_enet_debug, "i"); MODULE_PARM_DESC(fs_enet_debug, "Freescale bitmapped debugging message enable value"); +int fs_enet_debug = -1; /* -1 == use FS_ENET_DEF_MSG_ENABLE as value */ static void fs_set_multicast_list(struct net_device *dev) { @@ -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, IRQF_SHARED, name, dev); + return request_irq(irq, irqf, SA_SHIRQ, name, dev); } static void fs_free_irq(struct net_device *dev, int irq) @@ -683,6 +683,35 @@ 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); @@ -694,13 +723,10 @@ 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); @@ -708,112 +734,35 @@ 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 FS_ENET IRQ!", dev->name); + ": %s Could not allocate FEC IRQ!", dev->name); return -EINVAL; } - err = fs_init_phy(dev); - if(err) - return err; + /* 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; + } + } - phy_start(fep->phydev); + fs_mii_startup(dev); + netif_carrier_off(dev); + fs_mii_link_status_change_check(dev, 1); return 0; } @@ -821,19 +770,20 @@ 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); - phy_stop(fep->phydev); + fs_mii_shutdown(dev); spin_lock_irqsave(&fep->lock, flags); (*fep->ops->stop)(dev); spin_unlock_irqrestore(&fep->lock, flags); /* release any irqs */ - phy_disconnect(fep->phydev); - fep->phydev = NULL; + if (fpi->phy_irq != -1) + fs_free_irq(dev, fpi->phy_irq); fs_free_irq(dev, fep->interrupt); return 0; @@ -881,19 +831,33 @@ 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); - return phy_ethtool_gset(fep->phydev, cmd); + 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; } static int fs_set_settings(struct net_device *dev, struct ethtool_cmd *cmd) { struct fs_enet_private *fep = netdev_priv(dev); - phy_ethtool_sset(fep->phydev, cmd); - return 0; + 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; } static int fs_nway_reset(struct net_device *dev) { - return 0; + struct fs_enet_private *fep = netdev_priv(dev); + return mii_nway_restart(&fep->mii_if); } static u32 fs_get_msglevel(struct net_device *dev) @@ -935,7 +899,7 @@ static int fs_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) return -EINVAL; spin_lock_irqsave(&fep->lock, flags); - rc = phy_mii_ioctl(fep->phydev, mii, cmd); + rc = generic_mii_ioctl(&fep->mii_if, mii, cmd, NULL); spin_unlock_irqrestore(&fep->lock, flags); return rc; } @@ -1067,6 +1031,12 @@ 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; @@ -1104,6 +1074,8 @@ 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), @@ -1225,39 +1197,17 @@ static int __init fs_init(void) r = setup_immap(); if (r != 0) return r; - -#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); + r = driver_register(&fs_enet_fec_driver); if (r != 0) goto err; -#endif -#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); + r = driver_register(&fs_enet_fcc_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.h b/drivers/net/fs_enet/fs_enet.h index 95022c005..e7ec96c96 100644 --- a/drivers/net/fs_enet/fs_enet.h +++ b/drivers/net/fs_enet/fs_enet.h @@ -5,7 +5,6 @@ #include #include #include -#include #include @@ -13,30 +12,12 @@ #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); @@ -44,7 +25,6 @@ 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); @@ -120,6 +100,10 @@ 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 */ @@ -146,8 +130,7 @@ struct fs_enet_private { struct fs_enet_mii_bus *mii_bus; int interrupt; - struct phy_device *phydev; - int oldduplex, oldspeed, oldlink; /* current settings */ + int duplex, speed; /* current settings */ /* event masks */ u32 ev_napi_rx; /* mask of NAPI rx events */ @@ -185,9 +168,15 @@ struct fs_enet_private { }; /***************************************************************************/ -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); + +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); void fs_init_bds(struct net_device *dev); void fs_cleanup_bds(struct net_device *dev); @@ -205,6 +194,7 @@ 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 1ff2597b8..e67b1d066 100644 --- a/drivers/net/fs_enet/mac-fcc.c +++ b/drivers/net/fs_enet/mac-fcc.c @@ -12,6 +12,7 @@ * kind, whether express or implied. */ +#include #include #include #include @@ -34,7 +35,6 @@ #include #include #include -#include #include #include @@ -118,37 +118,25 @@ static int do_pd_setup(struct fs_enet_private *fep) /* Fill out IRQ field */ fep->interrupt = platform_get_irq(pdev, 0); - if (fep->interrupt < 0) - return -EINVAL; /* Attach the memory for the FCC Parameter RAM */ r = platform_get_resource_byname(pdev, IORESOURCE_MEM, "fcc_pram"); - fep->fcc.ep = (void *)ioremap(r->start, r->end - r->start + 1); + fep->fcc.ep = (void *)r->start; + if (fep->fcc.ep == NULL) return -EINVAL; r = platform_get_resource_byname(pdev, IORESOURCE_MEM, "fcc_regs"); - fep->fcc.fccp = (void *)ioremap(r->start, r->end - r->start + 1); + fep->fcc.fccp = (void *)r->start; + if (fep->fcc.fccp == NULL) return -EINVAL; - 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); - } + fep->fcc.fcccp = (void *)fep->fpi->fcc_regs_c; if (fep->fcc.fcccp == NULL) return -EINVAL; - fep->fcc.mem = (void *)fep->fpi->mem_offset; - if (fep->fcc.mem == NULL) - return -EINVAL; - return 0; } @@ -166,6 +154,8 @@ 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; @@ -403,7 +393,7 @@ static void restart(struct net_device *dev) /* adjust to speed (for RMII mode) */ if (fpi->use_rmii) { - if (fep->phydev->speed == 100) + if (fep->speed == 100) C8(fcccp, fcc_gfemr, 0x20); else S8(fcccp, fcc_gfemr, 0x20); @@ -429,7 +419,7 @@ static void restart(struct net_device *dev) S32(fccp, fcc_fpsmr, FCC_PSMR_RMII); /* adjust to duplex mode */ - if (fep->phydev->duplex) + if (fep->duplex) S32(fccp, fcc_fpsmr, FCC_PSMR_FDE | FCC_PSMR_LPB); else C32(fccp, fcc_fpsmr, FCC_PSMR_FDE | FCC_PSMR_LPB); @@ -495,10 +485,7 @@ static void rx_bd_done(struct net_device *dev) static void tx_kickstart(struct net_device *dev) { - struct fs_enet_private *fep = netdev_priv(dev); - fcc_t *fccp = fep->fcc.fccp; - - S32(fccp, fcc_ftodr, 0x80); + /* nothing */ } 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 c2c5fd419..2e8f44469 100644 --- a/drivers/net/fs_enet/mac-fec.c +++ b/drivers/net/fs_enet/mac-fec.c @@ -12,6 +12,7 @@ * kind, whether express or implied. */ +#include #include #include #include @@ -46,7 +47,6 @@ #endif #include "fs_enet.h" -#include "fec.h" /*************************************************/ @@ -76,8 +76,50 @@ /* 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 @@ -102,8 +144,6 @@ static int do_pd_setup(struct fs_enet_private *fep) /* Fill out IRQ field */ fep->interrupt = platform_get_irq_byname(pdev,"interrupt"); - if (fep->interrupt < 0) - return -EINVAL; r = platform_get_resource_byname(pdev, IORESOURCE_MEM, "regs"); fep->fec.fecp =(void*)r->start; @@ -262,15 +302,13 @@ 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) | @@ -311,12 +349,12 @@ static void restart(struct net_device *dev) FW(fecp, fun_code, 0x78000000); /* - * Set MII speed. + * Set MII speed. */ - FW(fecp, mii_speed, fec_inf->mii_speed); + FW(fecp, mii_speed, fep->mii_bus->fec.mii_speed); /* - * Clear any outstanding interrupt. + * Clear any outstanding interrupt. */ FW(fecp, ievent, 0xffc0); FW(fecp, ivec, (fep->interrupt / 2) << 29); @@ -351,12 +389,11 @@ 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->phydev->duplex) { + if (fep->duplex) { FC(fecp, r_cntrl, FEC_RCNTRL_DRT); FS(fecp, x_cntrl, FEC_TCNTRL_FDEN); /* FD enable */ } else { @@ -380,11 +417,9 @@ 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 fec_info* feci= fep->phydev->bus->priv; - + struct fs_enet_mii_bus *bus = fep->mii_bus; + const struct fs_mii_bus_info *bi = bus->bus_info; int i; if ((FR(fecp, ecntrl) & FEC_ECNTRL_ETHER_EN) == 0) @@ -408,11 +443,11 @@ static void stop(struct net_device *dev) fs_cleanup_bds(dev); /* shut down FEC1? that's where the mii bus is */ - if (fpi->has_phy) { + if (fep->fec.idx == 0 && bus->refs > 1 && bi->method == fsmii_fec) { 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, feci->mii_speed); + FW(fecp, mii_speed, bus->fec.mii_speed); } } @@ -547,3 +582,73 @@ 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 95ec5872c..a3897fda7 100644 --- a/drivers/net/fs_enet/mac-scc.c +++ b/drivers/net/fs_enet/mac-scc.c @@ -12,6 +12,7 @@ * kind, whether express or implied. */ +#include #include #include #include @@ -117,8 +118,6 @@ static int do_pd_setup(struct fs_enet_private *fep) /* Fill out IRQ field */ fep->interrupt = platform_get_irq_byname(pdev, "interrupt"); - if (fep->interrupt < 0) - return -EINVAL; r = platform_get_resource_byname(pdev, IORESOURCE_MEM, "regs"); fep->scc.sccp = (void *)r->start; @@ -369,7 +368,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->phydev->duplex) + if (fep->duplex) S16(sccp, scc_psmr, SCC_PSMR_LPB | SCC_PSMR_FDE); S32(sccp, scc_gsmrl, SCC_GSMRL_ENR | SCC_GSMRL_ENT); @@ -500,8 +499,6 @@ 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 0b9b8b5c8..24a5e2e23 100644 --- a/drivers/net/fs_enet/mii-bitbang.c +++ b/drivers/net/fs_enet/mii-bitbang.c @@ -13,6 +13,7 @@ */ +#include #include #include #include @@ -33,7 +34,6 @@ #include #include #include -#include #include #include @@ -41,25 +41,129 @@ #include "fs_enet.h" -static int bitbang_prep_bit(u8 **datp, u8 *mskp, - struct fs_mii_bit *mii_bit) +#ifdef CONFIG_8xx +static int bitbang_prep_bit(u8 **dirp, u8 **datp, u8 *mskp, int port, int bit) { - void *dat; + immap_t *im = (immap_t *)fs_enet_immap; + void *dir, *dat, *ppar; int adv; u8 msk; - dat = (void*) mii_bit->offset; + 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; + } - adv = mii_bit->bit >> 3; + adv = bit >> 3; + dir = (char *)dir + adv; dat = (char *)dat + adv; + ppar = (char *)ppar + adv; - msk = 1 << (7 - (mii_bit->bit & 7)); + 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 static inline void bb_set(u8 *p, u8 m) { @@ -76,44 +180,44 @@ static inline int bb_read(u8 *p, u8 m) return (in_8(p) & m) != 0; } -static inline void mdio_active(struct bb_info *bitbang) +static inline void mdio_active(struct fs_enet_mii_bus *bus) { - bb_set(bitbang->mdio_dir, bitbang->mdio_dir_msk); + bb_set(bus->bitbang.mdio_dir, bus->bitbang.mdio_msk); } -static inline void mdio_tristate(struct bb_info *bitbang ) +static inline void mdio_tristate(struct fs_enet_mii_bus *bus) { - bb_clr(bitbang->mdio_dir, bitbang->mdio_dir_msk); + bb_clr(bus->bitbang.mdio_dir, bus->bitbang.mdio_msk); } -static inline int mdio_read(struct bb_info *bitbang ) +static inline int mdio_read(struct fs_enet_mii_bus *bus) { - return bb_read(bitbang->mdio_dat, bitbang->mdio_dat_msk); + return bb_read(bus->bitbang.mdio_dat, bus->bitbang.mdio_msk); } -static inline void mdio(struct bb_info *bitbang , int what) +static inline void mdio(struct fs_enet_mii_bus *bus, int what) { if (what) - bb_set(bitbang->mdio_dat, bitbang->mdio_dat_msk); + bb_set(bus->bitbang.mdio_dat, bus->bitbang.mdio_msk); else - bb_clr(bitbang->mdio_dat, bitbang->mdio_dat_msk); + bb_clr(bus->bitbang.mdio_dat, bus->bitbang.mdio_msk); } -static inline void mdc(struct bb_info *bitbang , int what) +static inline void mdc(struct fs_enet_mii_bus *bus, int what) { if (what) - bb_set(bitbang->mdc_dat, bitbang->mdc_msk); + bb_set(bus->bitbang.mdc_dat, bus->bitbang.mdc_msk); else - bb_clr(bitbang->mdc_dat, bitbang->mdc_msk); + bb_clr(bus->bitbang.mdc_dat, bus->bitbang.mdc_msk); } -static inline void mii_delay(struct bb_info *bitbang ) +static inline void mii_delay(struct fs_enet_mii_bus *bus) { - udelay(bitbang->delay); + udelay(bus->bus_info->i.bitbang.delay); } /* Utility to send the preamble, address, and register (common to read and write). */ -static void bitbang_pre(struct bb_info *bitbang , int read, u8 addr, u8 reg) +static void bitbang_pre(struct fs_enet_mii_bus *bus, int read, u8 addr, u8 reg) { int j; @@ -125,284 +229,177 @@ static void bitbang_pre(struct bb_info *bitbang , int read, u8 addr, u8 reg) * but it is safer and will be much more robust. */ - mdio_active(bitbang); - mdio(bitbang, 1); + mdio_active(bus); + mdio(bus, 1); for (j = 0; j < 32; j++) { - mdc(bitbang, 0); - mii_delay(bitbang); - mdc(bitbang, 1); - mii_delay(bitbang); + mdc(bus, 0); + mii_delay(bus); + mdc(bus, 1); + mii_delay(bus); } /* send the start bit (01) and the read opcode (10) or write (10) */ - 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); + 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); /* send the PHY address */ for (j = 0; j < 5; j++) { - mdc(bitbang, 0); - mdio(bitbang, (addr & 0x10) != 0); - mii_delay(bitbang); - mdc(bitbang, 1); - mii_delay(bitbang); + mdc(bus, 0); + mdio(bus, (addr & 0x10) != 0); + mii_delay(bus); + mdc(bus, 1); + mii_delay(bus); addr <<= 1; } /* send the register address */ for (j = 0; j < 5; j++) { - mdc(bitbang, 0); - mdio(bitbang, (reg & 0x10) != 0); - mii_delay(bitbang); - mdc(bitbang, 1); - mii_delay(bitbang); + mdc(bus, 0); + mdio(bus, (reg & 0x10) != 0); + mii_delay(bus); + mdc(bus, 1); + mii_delay(bus); reg <<= 1; } } -static int fs_enet_mii_bb_read(struct mii_bus *bus , int phy_id, int location) +static int mii_read(struct fs_enet_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(bitbang, 1, addr, reg); + bitbang_pre(bus, 1, addr, reg); /* tri-state our MDIO I/O pin so we can read */ - mdc(bitbang, 0); - mdio_tristate(bitbang); - mii_delay(bitbang); - mdc(bitbang, 1); - mii_delay(bitbang); + mdc(bus, 0); + mdio_tristate(bus); + mii_delay(bus); + mdc(bus, 1); + mii_delay(bus); /* check the turnaround bit: the PHY should be driving it to zero */ - if (mdio_read(bitbang) != 0) { + if (mdio_read(bus) != 0) { /* PHY didn't drive TA low */ for (j = 0; j < 32; j++) { - mdc(bitbang, 0); - mii_delay(bitbang); - mdc(bitbang, 1); - mii_delay(bitbang); + mdc(bus, 0); + mii_delay(bus); + mdc(bus, 1); + mii_delay(bus); } ret = -1; goto out; } - mdc(bitbang, 0); - mii_delay(bitbang); + mdc(bus, 0); + mii_delay(bus); /* read 16 bits of register data, MSB first */ rdreg = 0; for (j = 0; j < 16; j++) { - mdc(bitbang, 1); - mii_delay(bitbang); + mdc(bus, 1); + mii_delay(bus); rdreg <<= 1; - rdreg |= mdio_read(bitbang); - mdc(bitbang, 0); - mii_delay(bitbang); + rdreg |= mdio_read(bus); + mdc(bus, 0); + mii_delay(bus); } - mdc(bitbang, 1); - mii_delay(bitbang); - mdc(bitbang, 0); - mii_delay(bitbang); - mdc(bitbang, 1); - mii_delay(bitbang); + mdc(bus, 1); + mii_delay(bus); + mdc(bus, 0); + mii_delay(bus); + mdc(bus, 1); + mii_delay(bus); ret = rdreg; out: return ret; } -static int fs_enet_mii_bb_write(struct mii_bus *bus, int phy_id, int location, u16 val) +static void mii_write(struct fs_enet_mii_bus *bus, int phy_id, int location, int val) { int j; - struct bb_info* bitbang = bus->priv; - u8 addr = phy_id & 0xff; u8 reg = location & 0xff; u16 value = val & 0xffff; - bitbang_pre(bitbang, 0, addr, reg); + bitbang_pre(bus, 0, addr, reg); /* send the turnaround (10) */ - 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); + 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); /* write 16 bits of register data, MSB first */ for (j = 0; j < 16; j++) { - mdc(bitbang, 0); - mdio(bitbang, (value & 0x8000) != 0); - mii_delay(bitbang); - mdc(bitbang, 1); - mii_delay(bitbang); + mdc(bus, 0); + mdio(bus, (value & 0x8000) != 0); + mii_delay(bus); + mdc(bus, 1); + mii_delay(bus); value <<= 1; } /* * Tri-state the MDIO line. */ - mdio_tristate(bitbang); - mdc(bitbang, 0); - mii_delay(bitbang); - mdc(bitbang, 1); - mii_delay(bitbang); - return 0; + mdio_tristate(bus); + mdc(bus, 0); + mii_delay(bus); + mdc(bus, 1); + mii_delay(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) +int fs_mii_bitbang_init(struct fs_enet_mii_bus *bus) { + const struct fs_mii_bus_info *bi = bus->bus_info; int r; - bitbang->delay = fmpi->delay; - - r = bitbang_prep_bit(&bitbang->mdio_dir, - &bitbang->mdio_dir_msk, - &fmpi->mdio_dir); + 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); if (r != 0) return r; - r = bitbang_prep_bit(&bitbang->mdio_dat, - &bitbang->mdio_dat_msk, - &fmpi->mdio_dat); + 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); if (r != 0) return r; - r = bitbang_prep_bit(&bitbang->mdc_dat, - &bitbang->mdc_msk, - &fmpi->mdc_dat); - if (r != 0) - return r; + bus->mii_read = mii_read; + bus->mii_write = mii_write; 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/gianfar.c b/drivers/net/gianfar.c index ebbbd6ca6..0e8e3fcde 100644 --- a/drivers/net/gianfar.c +++ b/drivers/net/gianfar.c @@ -64,6 +64,7 @@ * The driver then cleans up the buffer. */ +#include #include #include #include @@ -192,12 +193,8 @@ static int gfar_probe(struct platform_device *pdev) priv->interruptTransmit = platform_get_irq_byname(pdev, "tx"); priv->interruptReceive = platform_get_irq_byname(pdev, "rx"); priv->interruptError = platform_get_irq_byname(pdev, "error"); - if (priv->interruptTransmit < 0 || priv->interruptReceive < 0 || priv->interruptError < 0) - goto regs_fail; } else { priv->interruptTransmit = platform_get_irq(pdev, 0); - if (priv->interruptTransmit < 0) - goto regs_fail; } /* get a pointer to the register memory */ @@ -209,8 +206,7 @@ static int gfar_probe(struct platform_device *pdev) goto regs_fail; } - spin_lock_init(&priv->txlock); - spin_lock_init(&priv->rxlock); + spin_lock_init(&priv->lock); platform_set_drvdata(pdev, dev); @@ -515,13 +511,11 @@ void stop_gfar(struct net_device *dev) phy_stop(priv->phydev); /* Lock it down */ - spin_lock_irqsave(&priv->txlock, flags); - spin_lock(&priv->rxlock); + spin_lock_irqsave(&priv->lock, flags); gfar_halt(dev); - spin_unlock(&priv->rxlock); - spin_unlock_irqrestore(&priv->txlock, flags); + spin_unlock_irqrestore(&priv->lock, flags); /* Free the IRQs */ if (priv->einfo->device_flags & FSL_GIANFAR_DEV_HAS_MULTI_INTR) { @@ -607,15 +601,14 @@ void gfar_start(struct net_device *dev) tempval |= DMACTRL_INIT_SETTINGS; gfar_write(&priv->regs->dmactrl, tempval); + /* Clear THLT, so that the DMA starts polling now */ + gfar_write(®s->tstat, TSTAT_CLEAR_THALT); + /* Make sure we aren't stopped */ tempval = gfar_read(&priv->regs->dmactrl); tempval &= ~(DMACTRL_GRS | DMACTRL_GTS); gfar_write(&priv->regs->dmactrl, tempval); - /* Clear THLT/RHLT, so that the DMA starts polling now */ - gfar_write(®s->tstat, TSTAT_CLEAR_THALT); - gfar_write(®s->rstat, RSTAT_CLEAR_RHALT); - /* Unmask the interrupts we look for */ gfar_write(®s->imask, IMASK_DEFAULT); } @@ -931,13 +924,12 @@ static int gfar_start_xmit(struct sk_buff *skb, struct net_device *dev) struct txfcb *fcb = NULL; struct txbd8 *txbdp; u16 status; - unsigned long flags; /* Update transmit stats */ priv->stats.tx_bytes += skb->len; /* Lock priv now */ - spin_lock_irqsave(&priv->txlock, flags); + spin_lock_irq(&priv->lock); /* Point at the first free tx descriptor */ txbdp = priv->cur_tx; @@ -1008,7 +1000,7 @@ static int gfar_start_xmit(struct sk_buff *skb, struct net_device *dev) gfar_write(&priv->regs->tstat, TSTAT_CLEAR_THALT); /* Unlock priv */ - spin_unlock_irqrestore(&priv->txlock, flags); + spin_unlock_irq(&priv->lock); return 0; } @@ -1053,7 +1045,7 @@ static void gfar_vlan_rx_register(struct net_device *dev, unsigned long flags; u32 tempval; - spin_lock_irqsave(&priv->rxlock, flags); + spin_lock_irqsave(&priv->lock, flags); priv->vlgrp = grp; @@ -1080,7 +1072,7 @@ static void gfar_vlan_rx_register(struct net_device *dev, gfar_write(&priv->regs->rctrl, tempval); } - spin_unlock_irqrestore(&priv->rxlock, flags); + spin_unlock_irqrestore(&priv->lock, flags); } @@ -1089,12 +1081,12 @@ static void gfar_vlan_rx_kill_vid(struct net_device *dev, uint16_t vid) struct gfar_private *priv = netdev_priv(dev); unsigned long flags; - spin_lock_irqsave(&priv->rxlock, flags); + spin_lock_irqsave(&priv->lock, flags); if (priv->vlgrp) priv->vlgrp->vlan_devices[vid] = NULL; - spin_unlock_irqrestore(&priv->rxlock, flags); + spin_unlock_irqrestore(&priv->lock, flags); } @@ -1183,7 +1175,7 @@ static irqreturn_t gfar_transmit(int irq, void *dev_id, struct pt_regs *regs) gfar_write(&priv->regs->ievent, IEVENT_TX_MASK); /* Lock priv */ - spin_lock(&priv->txlock); + spin_lock(&priv->lock); bdp = priv->dirty_tx; while ((bdp->status & TXBD_READY) == 0) { /* If dirty_tx and cur_tx are the same, then either the */ @@ -1228,7 +1220,7 @@ static irqreturn_t gfar_transmit(int irq, void *dev_id, struct pt_regs *regs) else gfar_write(&priv->regs->txic, 0); - spin_unlock(&priv->txlock); + spin_unlock(&priv->lock); return IRQ_HANDLED; } @@ -1309,10 +1301,9 @@ irqreturn_t gfar_receive(int irq, void *dev_id, struct pt_regs *regs) { struct net_device *dev = (struct net_device *) dev_id; struct gfar_private *priv = netdev_priv(dev); + #ifdef CONFIG_GFAR_NAPI u32 tempval; -#else - unsigned long flags; #endif /* Clear IEVENT, so rx interrupt isn't called again @@ -1335,7 +1326,7 @@ irqreturn_t gfar_receive(int irq, void *dev_id, struct pt_regs *regs) } #else - spin_lock_irqsave(&priv->rxlock, flags); + spin_lock(&priv->lock); gfar_clean_rx_ring(dev, priv->rx_ring_size); /* If we are coalescing interrupts, update the timer */ @@ -1346,7 +1337,7 @@ irqreturn_t gfar_receive(int irq, void *dev_id, struct pt_regs *regs) else gfar_write(&priv->regs->rxic, 0); - spin_unlock_irqrestore(&priv->rxlock, flags); + spin_unlock(&priv->lock); #endif return IRQ_HANDLED; @@ -1495,6 +1486,13 @@ int gfar_clean_rx_ring(struct net_device *dev, int rx_work_limit) /* Update the current rxbd pointer to be the next one */ priv->cur_rx = bdp; + /* If no packets have arrived since the + * last one we processed, clear the IEVENT RX and + * BSY bits so that another interrupt won't be + * generated when we set IMASK */ + if (bdp->status & RXBD_EMPTY) + gfar_write(&priv->regs->ievent, IEVENT_RX_MASK); + return howmany; } @@ -1514,7 +1512,7 @@ static int gfar_poll(struct net_device *dev, int *budget) rx_work_limit -= howmany; *budget -= howmany; - if (rx_work_limit > 0) { + if (rx_work_limit >= 0) { netif_rx_complete(dev); /* Clear the halt bit in RSTAT */ @@ -1531,8 +1529,7 @@ static int gfar_poll(struct net_device *dev, int *budget) gfar_write(&priv->regs->rxic, 0); } - /* Return 1 if there's more work to do */ - return (rx_work_limit > 0) ? 0 : 1; + return (rx_work_limit < 0) ? 1 : 0; } #endif @@ -1628,7 +1625,7 @@ static void adjust_link(struct net_device *dev) struct phy_device *phydev = priv->phydev; int new_state = 0; - spin_lock_irqsave(&priv->txlock, flags); + spin_lock_irqsave(&priv->lock, flags); if (phydev->link) { u32 tempval = gfar_read(®s->maccfg2); u32 ecntrl = gfar_read(®s->ecntrl); @@ -1693,7 +1690,7 @@ static void adjust_link(struct net_device *dev) if (new_state && netif_msg_link(priv)) phy_print_status(phydev); - spin_unlock_irqrestore(&priv->txlock, flags); + spin_unlock_irqrestore(&priv->lock, flags); } /* Update the hash table based on the current list of multicast diff --git a/drivers/net/gianfar.h b/drivers/net/gianfar.h index f87bbc408..d37d5401b 100644 --- a/drivers/net/gianfar.h +++ b/drivers/net/gianfar.h @@ -22,6 +22,7 @@ #ifndef __GIANFAR_H #define __GIANFAR_H +#include #include #include #include @@ -655,62 +656,43 @@ struct gfar { * the buffer descriptor determines the actual condition. */ struct gfar_private { - /* Fields controlled by TX lock */ - spinlock_t txlock; - - /* Pointer to the array of skbuffs */ + /* pointers to arrays of skbuffs for tx and rx */ struct sk_buff ** tx_skbuff; + struct sk_buff ** rx_skbuff; - /* next free skb in the array */ + /* indices pointing to the next free sbk in skb arrays */ u16 skb_curtx; + u16 skb_currx; - /* First skb in line to be transmitted */ + /* index of the first skb which hasn't been transmitted + * yet. */ u16 skb_dirtytx; /* Configuration info for the coalescing features */ unsigned char txcoalescing; unsigned short txcount; unsigned short txtime; - - /* Buffer descriptor pointers */ - struct txbd8 *tx_bd_base; /* First tx buffer descriptor */ - struct txbd8 *cur_tx; /* Next free ring entry */ - struct txbd8 *dirty_tx; /* First buffer in line - to be transmitted */ - unsigned int tx_ring_size; - - /* RX Locked fields */ - spinlock_t rxlock; - - /* skb array and index */ - struct sk_buff ** rx_skbuff; - u16 skb_currx; - - /* RX Coalescing values */ unsigned char rxcoalescing; unsigned short rxcount; unsigned short rxtime; - struct rxbd8 *rx_bd_base; /* First Rx buffers */ + /* GFAR addresses */ + struct rxbd8 *rx_bd_base; /* Base addresses of Rx and Tx Buffers */ + struct txbd8 *tx_bd_base; struct rxbd8 *cur_rx; /* Next free rx ring entry */ - - /* RX parameters */ - unsigned int rx_ring_size; + struct txbd8 *cur_tx; /* Next free ring entry */ + struct txbd8 *dirty_tx; /* The Ring entry to be freed. */ + struct gfar __iomem *regs; /* Pointer to the GFAR memory mapped Registers */ + u32 __iomem *hash_regs[16]; + int hash_width; + struct net_device_stats stats; /* linux network statistics */ + struct gfar_extra_stats extra_stats; + spinlock_t lock; unsigned int rx_buffer_size; unsigned int rx_stash_size; unsigned int rx_stash_index; - - struct vlan_group *vlgrp; - - /* Unprotected fields */ - /* Pointer to the GFAR memory mapped Registers */ - struct gfar __iomem *regs; - - /* Hash registers and their width */ - u32 __iomem *hash_regs[16]; - int hash_width; - - /* global parameters */ + unsigned int tx_ring_size; + unsigned int rx_ring_size; unsigned int fifo_threshold; unsigned int fifo_starve; unsigned int fifo_starve_off; @@ -720,15 +702,13 @@ struct gfar_private { extended_hash:1, bd_stash_en:1; unsigned short padding; - + struct vlan_group *vlgrp; + /* Info structure initialized by board setup code */ unsigned int interruptTransmit; unsigned int interruptReceive; unsigned int interruptError; - - /* info structure initialized by platform code */ struct gianfar_platform_data *einfo; - /* PHY stuff */ struct phy_device *phydev; struct mii_bus *mii_bus; int oldspeed; @@ -736,10 +716,6 @@ struct gfar_private { int oldlink; uint32_t msg_enable; - - /* Network Statistics */ - struct net_device_stats stats; - struct gfar_extra_stats extra_stats; }; static inline u32 gfar_read(volatile unsigned __iomem *addr) diff --git a/drivers/net/gianfar_ethtool.c b/drivers/net/gianfar_ethtool.c index e0f505285..5de7b2e25 100644 --- a/drivers/net/gianfar_ethtool.c +++ b/drivers/net/gianfar_ethtool.c @@ -15,6 +15,7 @@ * by reference. */ +#include #include #include #include @@ -454,14 +455,10 @@ static int gfar_sringparam(struct net_device *dev, struct ethtool_ringparam *rva /* Halt TX and RX, and process the frames which * have already been received */ - spin_lock_irqsave(&priv->txlock, flags); - spin_lock(&priv->rxlock); - + spin_lock_irqsave(&priv->lock, flags); gfar_halt(dev); gfar_clean_rx_ring(dev, priv->rx_ring_size); - - spin_unlock(&priv->rxlock); - spin_unlock_irqrestore(&priv->txlock, flags); + spin_unlock_irqrestore(&priv->lock, flags); /* Now we take down the rings to rebuild them */ stop_gfar(dev); @@ -491,14 +488,10 @@ static int gfar_set_rx_csum(struct net_device *dev, uint32_t data) /* Halt TX and RX, and process the frames which * have already been received */ - spin_lock_irqsave(&priv->txlock, flags); - spin_lock(&priv->rxlock); - + spin_lock_irqsave(&priv->lock, flags); gfar_halt(dev); gfar_clean_rx_ring(dev, priv->rx_ring_size); - - spin_unlock(&priv->rxlock); - spin_unlock_irqrestore(&priv->txlock, flags); + spin_unlock_irqrestore(&priv->lock, flags); /* Now we take down the rings to rebuild them */ stop_gfar(dev); @@ -530,7 +523,7 @@ static int gfar_set_tx_csum(struct net_device *dev, uint32_t data) if (!(priv->einfo->device_flags & FSL_GIANFAR_DEV_HAS_CSUM)) return -EOPNOTSUPP; - spin_lock_irqsave(&priv->txlock, flags); + spin_lock_irqsave(&priv->lock, flags); gfar_halt(dev); if (data) @@ -539,7 +532,7 @@ static int gfar_set_tx_csum(struct net_device *dev, uint32_t data) dev->features &= ~NETIF_F_IP_CSUM; gfar_start(dev); - spin_unlock_irqrestore(&priv->txlock, flags); + spin_unlock_irqrestore(&priv->lock, flags); return 0; } diff --git a/drivers/net/gianfar_mii.c b/drivers/net/gianfar_mii.c index c92e65984..c6b725529 100644 --- a/drivers/net/gianfar_mii.c +++ b/drivers/net/gianfar_mii.c @@ -16,6 +16,7 @@ * */ +#include #include #include #include diff --git a/drivers/net/gianfar_sysfs.c b/drivers/net/gianfar_sysfs.c index e8a18f18d..51ef181b1 100644 --- a/drivers/net/gianfar_sysfs.c +++ b/drivers/net/gianfar_sysfs.c @@ -19,6 +19,7 @@ * Sysfs file creation and management */ +#include #include #include #include @@ -81,7 +82,7 @@ static ssize_t gfar_set_bd_stash(struct class_device *cdev, else return count; - spin_lock_irqsave(&priv->rxlock, flags); + spin_lock_irqsave(&priv->lock, flags); /* Set the new stashing value */ priv->bd_stash_en = new_setting; @@ -95,7 +96,7 @@ static ssize_t gfar_set_bd_stash(struct class_device *cdev, gfar_write(&priv->regs->attr, temp); - spin_unlock_irqrestore(&priv->rxlock, flags); + spin_unlock_irqrestore(&priv->lock, flags); return count; } @@ -117,7 +118,7 @@ static ssize_t gfar_set_rx_stash_size(struct class_device *cdev, u32 temp; unsigned long flags; - spin_lock_irqsave(&priv->rxlock, flags); + spin_lock_irqsave(&priv->lock, flags); if (length > priv->rx_buffer_size) return count; @@ -141,7 +142,7 @@ static ssize_t gfar_set_rx_stash_size(struct class_device *cdev, gfar_write(&priv->regs->attr, temp); - spin_unlock_irqrestore(&priv->rxlock, flags); + spin_unlock_irqrestore(&priv->lock, flags); return count; } @@ -165,7 +166,7 @@ static ssize_t gfar_set_rx_stash_index(struct class_device *cdev, u32 temp; unsigned long flags; - spin_lock_irqsave(&priv->rxlock, flags); + spin_lock_irqsave(&priv->lock, flags); if (index > priv->rx_stash_size) return count; @@ -179,7 +180,7 @@ static ssize_t gfar_set_rx_stash_index(struct class_device *cdev, temp |= ATTRELI_EI(index); gfar_write(&priv->regs->attreli, flags); - spin_unlock_irqrestore(&priv->rxlock, flags); + spin_unlock_irqrestore(&priv->lock, flags); return count; } @@ -204,7 +205,7 @@ static ssize_t gfar_set_fifo_threshold(struct class_device *cdev, if (length > GFAR_MAX_FIFO_THRESHOLD) return count; - spin_lock_irqsave(&priv->txlock, flags); + spin_lock_irqsave(&priv->lock, flags); priv->fifo_threshold = length; @@ -213,7 +214,7 @@ static ssize_t gfar_set_fifo_threshold(struct class_device *cdev, temp |= length; gfar_write(&priv->regs->fifo_tx_thr, temp); - spin_unlock_irqrestore(&priv->txlock, flags); + spin_unlock_irqrestore(&priv->lock, flags); return count; } @@ -239,7 +240,7 @@ static ssize_t gfar_set_fifo_starve(struct class_device *cdev, if (num > GFAR_MAX_FIFO_STARVE) return count; - spin_lock_irqsave(&priv->txlock, flags); + spin_lock_irqsave(&priv->lock, flags); priv->fifo_starve = num; @@ -248,7 +249,7 @@ static ssize_t gfar_set_fifo_starve(struct class_device *cdev, temp |= num; gfar_write(&priv->regs->fifo_tx_starve, temp); - spin_unlock_irqrestore(&priv->txlock, flags); + spin_unlock_irqrestore(&priv->lock, flags); return count; } @@ -273,7 +274,7 @@ static ssize_t gfar_set_fifo_starve_off(struct class_device *cdev, if (num > GFAR_MAX_FIFO_STARVE_OFF) return count; - spin_lock_irqsave(&priv->txlock, flags); + spin_lock_irqsave(&priv->lock, flags); priv->fifo_starve_off = num; @@ -282,7 +283,7 @@ static ssize_t gfar_set_fifo_starve_off(struct class_device *cdev, temp |= num; gfar_write(&priv->regs->fifo_tx_starve_shutoff, temp); - spin_unlock_irqrestore(&priv->txlock, flags); + spin_unlock_irqrestore(&priv->lock, flags); return count; } diff --git a/drivers/net/gt96100eth.c b/drivers/net/gt96100eth.c index 2b4db7414..5958a6314 100644 --- a/drivers/net/gt96100eth.c +++ b/drivers/net/gt96100eth.c @@ -114,8 +114,8 @@ static int max_interrupt_work = 32; static char mac0[18] = "00.02.03.04.05.06"; static char mac1[18] = "00.01.02.03.04.05"; -module_param_string(mac0, mac0, 18, 0); -module_param_string(mac1, mac0, 18, 0); +MODULE_PARM(mac0, "c18"); +MODULE_PARM(mac1, "c18"); MODULE_PARM_DESC(mac0, "MAC address for GT96100 ethernet port 0"); MODULE_PARM_DESC(mac1, "MAC address for GT96100 ethernet port 1"); @@ -699,6 +699,7 @@ 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; @@ -1029,7 +1030,7 @@ gt96100_open(struct net_device *dev) } if ((retval = request_irq(dev->irq, >96100_interrupt, - IRQF_SHARED, dev->name, dev))) { + SA_SHIRQ, dev->name, dev))) { err("unable to get IRQ %d\n", dev->irq); return retval; } @@ -1530,7 +1531,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, GT96100_ETH_IO_SIZE); + release_region(gtif->iobase, gp->io_size); } } } diff --git a/drivers/net/gt96100eth.h b/drivers/net/gt96100eth.h index 3b62a87c7..395869c5e 100644 --- a/drivers/net/gt96100eth.h +++ b/drivers/net/gt96100eth.h @@ -27,6 +27,7 @@ #ifndef _GT96100ETH_H #define _GT96100ETH_H +#include #include #define dbg(lvl, format, arg...) \ @@ -331,6 +332,7 @@ 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; @@ -339,6 +341,7 @@ 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 409c6aab0..bc9a3bf8d 100644 --- a/drivers/net/hamachi.c +++ b/drivers/net/hamachi.c @@ -20,15 +20,22 @@ 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 "2.0" -#define DRV_RELDATE "June 27, 2006" +#define DRV_VERSION "1.01+LK1.0.1" +#define DRV_RELDATE "5/18/2001" /* A few user-configurable values. */ @@ -420,7 +427,7 @@ that case. static void hamachi_timer(unsigned long data); enum capability_flags {CanHaveMII=1, }; -static const struct chip_info { +static struct chip_info { u16 vendor_id, device_id, device_id_mask, pad; const char *name; void (*media_timer)(unsigned long data); @@ -601,8 +608,7 @@ 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); @@ -865,7 +871,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, IRQF_SHARED, dev->name, dev); + i = request_irq(dev->irq, &hamachi_interrupt, SA_SHIRQ, dev->name, dev); if (i) return i; diff --git a/drivers/net/hamradio/6pack.c b/drivers/net/hamradio/6pack.c index 86b3bb9be..d1f689586 100644 --- a/drivers/net/hamradio/6pack.c +++ b/drivers/net/hamradio/6pack.c @@ -12,6 +12,7 @@ * Fred N. van Kempen, */ +#include #include #include #include @@ -307,9 +308,9 @@ static int sp_set_mac_address(struct net_device *dev, void *addr) { struct sockaddr_ax25 *sa = addr; - netif_tx_lock_bh(dev); + spin_lock_irq(&dev->xmit_lock); memcpy(dev->dev_addr, &sa->sax25_call, AX25_ADDR_LEN); - netif_tx_unlock_bh(dev); + spin_unlock_irq(&dev->xmit_lock); return 0; } @@ -766,9 +767,9 @@ static int sixpack_ioctl(struct tty_struct *tty, struct file *file, break; } - netif_tx_lock_bh(dev); + spin_lock_irq(&dev->xmit_lock); memcpy(dev->dev_addr, &addr, AX25_ADDR_LEN); - netif_tx_unlock_bh(dev); + spin_unlock_irq(&dev->xmit_lock); err = 0; break; @@ -914,7 +915,7 @@ static void decode_prio_command(struct sixpack *sp, unsigned char cmd) printk(KERN_DEBUG "6pack: protocol violation\n"); else sp->status = 0; - cmd &= !SIXP_RX_DCD_MASK; + cmd &= ~SIXP_RX_DCD_MASK; } sp->status = cmd & SIXP_PRIO_DATA_MASK; } else { /* output watchdog char if idle */ diff --git a/drivers/net/hamradio/baycom_epp.c b/drivers/net/hamradio/baycom_epp.c index 9220de9f4..e4188d082 100644 --- a/drivers/net/hamradio/baycom_epp.c +++ b/drivers/net/hamradio/baycom_epp.c @@ -905,7 +905,7 @@ static int epp_open(struct net_device *dev) /* autoprobe baud rate */ tstart = jiffies; i = 0; - while (time_before(jiffies, tstart + HZ/3)) { + while ((signed)(jiffies-tstart-HZ/3) < 0) { if (pp->ops->epp_read_addr(pp, &stat, 1, 0) != 1) goto epptimeout; if ((stat & (EPP_NRAEF|EPP_NRHF)) == EPP_NRHF) { diff --git a/drivers/net/hamradio/baycom_ser_fdx.c b/drivers/net/hamradio/baycom_ser_fdx.c index 55906c7b4..232793d2c 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, IRQF_DISABLED | IRQF_SHARED, + if (request_irq(dev->irq, ser12_interrupt, SA_INTERRUPT | SA_SHIRQ, "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 de95de898..be596a3eb 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, IRQF_DISABLED | IRQF_SHARED, + if (request_irq(dev->irq, ser12_interrupt, SA_INTERRUPT | SA_SHIRQ, "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 889f33813..cb43a9d28 100644 --- a/drivers/net/hamradio/bpqether.c +++ b/drivers/net/hamradio/bpqether.c @@ -54,6 +54,7 @@ * BPQ 004 Joerg(DL1BKE) Fixed to not lock up on ifconfig. */ +#include #include #include #include @@ -122,12 +123,6 @@ 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; /* ------------------------------------------------------------------------ */ @@ -534,7 +529,6 @@ 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 c9a46b899..c8dc40214 100644 --- a/drivers/net/hamradio/dmascc.c +++ b/drivers/net/hamradio/dmascc.c @@ -280,7 +280,7 @@ static unsigned long rand; MODULE_AUTHOR("Klaus Kudielka"); MODULE_DESCRIPTION("Driver for high-speed SCC boards"); -module_param_array(io, int, NULL, 0); +MODULE_PARM(io, "1-" __MODULE_STRING(MAX_NUM_DEVS) "i"); MODULE_LICENSE("GPL"); static void __exit dmascc_exit(void) @@ -436,7 +436,7 @@ static int __init dmascc_init(void) module_init(dmascc_init); module_exit(dmascc_exit); -static void __init dev_setup(struct net_device *dev) +static void dev_setup(struct net_device *dev) { dev->type = ARPHRD_AX25; dev->hard_header_len = AX25_MAX_HEADER_LEN; @@ -582,6 +582,7 @@ static int __init setup_adapter(int card_base, int type, int n) INIT_WORK(&priv->rx_work, rx_bh, priv); dev->priv = priv; sprintf(dev->name, "dmascc%i", 2 * n + i); + SET_MODULE_OWNER(dev); dev->base_addr = card_base; dev->irq = irq; dev->open = scc_open; diff --git a/drivers/net/hamradio/mkiss.c b/drivers/net/hamradio/mkiss.c index d8715b200..dc5e9d59d 100644 --- a/drivers/net/hamradio/mkiss.c +++ b/drivers/net/hamradio/mkiss.c @@ -16,6 +16,7 @@ * Copyright (C) 2004, 05 Ralf Baechle DL5RB * Copyright (C) 2004, 05 Thomas Osterried DL9SAU */ +#include #include #include #include @@ -356,9 +357,9 @@ static int ax_set_mac_address(struct net_device *dev, void *addr) { struct sockaddr_ax25 *sa = addr; - netif_tx_lock_bh(dev); + spin_lock_irq(&dev->xmit_lock); memcpy(dev->dev_addr, &sa->sax25_call, AX25_ADDR_LEN); - netif_tx_unlock_bh(dev); + spin_unlock_irq(&dev->xmit_lock); return 0; } @@ -885,9 +886,9 @@ static int mkiss_ioctl(struct tty_struct *tty, struct file *file, break; } - netif_tx_lock_bh(dev); + spin_lock_irq(&dev->xmit_lock); memcpy(dev->dev_addr, addr, AX25_ADDR_LEN); - netif_tx_unlock_bh(dev); + spin_unlock_irq(&dev->xmit_lock); err = 0; break; @@ -1011,7 +1012,7 @@ static void __exit mkiss_exit_driver(void) MODULE_AUTHOR("Ralf Baechle DL5RB "); MODULE_DESCRIPTION("KISS driver for AX.25 over TTYs"); -module_param(crc_force, int, 0); +MODULE_PARM(crc_force, "i"); MODULE_PARM_DESC(crc_force, "crc [0 = auto | 1 = none | 2 = flexnet | 3 = smack]"); MODULE_LICENSE("GPL"); MODULE_ALIAS_LDISC(N_AX25); diff --git a/drivers/net/hamradio/scc.c b/drivers/net/hamradio/scc.c index df4b68142..6ace0e914 100644 --- a/drivers/net/hamradio/scc.c +++ b/drivers/net/hamradio/scc.c @@ -148,6 +148,7 @@ /* ----------------------------------------------------------------------- */ +#include #include #include #include @@ -1549,6 +1550,7 @@ static unsigned char ax25_nocall[AX25_ADDR_LEN] = static void scc_net_setup(struct net_device *dev) { + SET_MODULE_OWNER(dev); dev->tx_queue_len = 16; /* should be enough... */ dev->open = scc_net_open; @@ -1736,7 +1738,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, IRQF_DISABLED, "AX.25 SCC", NULL)) + if (request_irq(hwcfg.irq, scc_isr, SA_INTERRUPT, "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 f98f5777d..fe22479eb 100644 --- a/drivers/net/hamradio/yam.c +++ b/drivers/net/hamradio/yam.c @@ -42,6 +42,7 @@ /*****************************************************************************/ +#include #include #include #include @@ -873,7 +874,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, IRQF_DISABLED | IRQF_SHARED, dev->name, dev)) { + if (request_irq(dev->irq, yam_interrupt, SA_INTERRUPT | SA_SHIRQ, dev->name, dev)) { printk(KERN_ERR "%s: irq %d busy\n", dev->name, dev->irq); ret = -EBUSY; goto out_release_base; @@ -1097,6 +1098,7 @@ static void yam_setup(struct net_device *dev) dev->base_addr = yp->iobase; dev->irq = yp->irq; + SET_MODULE_OWNER(dev); dev->open = yam_open; dev->stop = yam_close; diff --git a/drivers/net/hp-plus.c b/drivers/net/hp-plus.c index e26a3e407..74e167e7d 100644 --- a/drivers/net/hp-plus.c +++ b/drivers/net/hp-plus.c @@ -250,12 +250,6 @@ static int __init hpp_probe1(struct net_device *dev, int ioaddr) ei_status.block_output = &hpp_mem_block_output; ei_status.get_8390_hdr = &hpp_mem_get_8390_hdr; dev->mem_start = mem_start; - ei_status.mem = ioremap(mem_start, - (HP_STOP_PG - HP_START_PG)*256); - if (!ei_status.mem) { - retval = -ENOMEM; - goto out; - } ei_status.rmem_start = dev->mem_start + TX_PAGES/2*256; dev->mem_end = ei_status.rmem_end = dev->mem_start + (HP_STOP_PG - HP_START_PG)*256; @@ -268,10 +262,8 @@ static int __init hpp_probe1(struct net_device *dev, int ioaddr) retval = register_netdev(dev); if (retval) - goto out1; + goto out; return 0; -out1: - iounmap(ei_status.mem); out: release_region(ioaddr, HP_IO_EXTENT); return retval; @@ -380,7 +372,7 @@ hpp_mem_get_8390_hdr(struct net_device *dev, struct e8390_pkt_hdr *hdr, int ring outw((ring_page<<8), ioaddr + HPP_IN_ADDR); outw(option_reg & ~(MemDisable + BootROMEnb), ioaddr + HPP_OPTION); - memcpy_fromio(hdr, ei_status.mem, sizeof(struct e8390_pkt_hdr)); + isa_memcpy_fromio(hdr, dev->mem_start, sizeof(struct e8390_pkt_hdr)); outw(option_reg, ioaddr + HPP_OPTION); hdr->count = (le16_to_cpu(hdr->count) + 3) & ~3; /* Round up allocation. */ } @@ -399,7 +391,7 @@ hpp_mem_block_input(struct net_device *dev, int count, struct sk_buff *skb, int Also note that we *can't* use eth_io_copy_and_sum() because it will not always copy "count" bytes (e.g. padded IP). */ - memcpy_fromio(skb->data, ei_status.mem, count); + isa_memcpy_fromio(skb->data, dev->mem_start, count); outw(option_reg, ioaddr + HPP_OPTION); } @@ -424,7 +416,7 @@ hpp_mem_block_output(struct net_device *dev, int count, outw(start_page << 8, ioaddr + HPP_OUT_ADDR); outw(option_reg & ~(MemDisable + BootROMEnb), ioaddr + HPP_OPTION); - memcpy_toio(ei_status.mem, buf, (count + 3) & ~3); + isa_memcpy_toio(dev->mem_start, buf, (count + 3) & ~3); outw(option_reg, ioaddr + HPP_OPTION); return; @@ -446,7 +438,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 __init +int init_module(void) { struct net_device *dev; @@ -478,7 +470,6 @@ init_module(void) static void cleanup_card(struct net_device *dev) { /* NB: hpp_close() handles free_irq */ - iounmap(ei_status.mem); release_region(dev->base_addr - NIC_OFFSET, HP_IO_EXTENT); } diff --git a/drivers/net/hp.c b/drivers/net/hp.c index 551a71b3c..cf9fb3698 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 __init +static void 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 __init +int init_module(void) { struct net_device *dev; diff --git a/drivers/net/hp100.c b/drivers/net/hp100.c index ff5a67d61..55c7ed608 100644 --- a/drivers/net/hp100.c +++ b/drivers/net/hp100.c @@ -111,10 +111,10 @@ #include #include #include +#include /* for CONFIG_PCI */ #include #include #include -#include #include @@ -1078,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 ? IRQF_SHARED : IRQF_DISABLED, + HP100_BUS_EISA ? SA_SHIRQ : SA_INTERRUPT, "hp100", dev)) { printk("hp100: %s: unable to get IRQ %d\n", dev->name, dev->irq); return -EAGAIN; @@ -1486,8 +1486,11 @@ static int hp100_start_xmit_bm(struct sk_buff *skb, struct net_device *dev) if (skb->len <= 0) return 0; - if (lp->chip == HP100_CHIPID_SHASTA && skb_padto(skb, ETH_ZLEN)) - return 0; + if (skb->len < ETH_ZLEN && lp->chip == HP100_CHIPID_SHASTA) { + skb = skb_padto(skb, ETH_ZLEN); + if (skb == NULL) + return 0; + } /* Get Tx ring tail pointer */ if (lp->txrtail->next == lp->txrhead) { @@ -1496,7 +1499,7 @@ static int hp100_start_xmit_bm(struct sk_buff *skb, struct net_device *dev) printk("hp100: %s: start_xmit_bm: No TX PDL available.\n", dev->name); #endif /* not waited long enough since last tx? */ - if (time_before(jiffies, dev->trans_start + HZ)) + if (jiffies - dev->trans_start < HZ) return -EAGAIN; if (hp100_check_lan(dev)) @@ -1649,7 +1652,7 @@ static int hp100_start_xmit(struct sk_buff *skb, struct net_device *dev) printk("hp100: %s: start_xmit: tx free mem = 0x%x\n", dev->name, i); #endif /* not waited long enough since last failed tx try? */ - if (time_before(jiffies, dev->trans_start + HZ)) { + if (jiffies - dev->trans_start < HZ) { #ifdef HP100_DEBUG printk("hp100: %s: trans_start timing problem\n", dev->name); @@ -1715,10 +1718,17 @@ static int hp100_start_xmit(struct sk_buff *skb, struct net_device *dev) hp100_outw(i, FRAGMENT_LEN); /* and first/only fragment length */ if (lp->mode == 2) { /* memory mapped */ - /* Note: The J2585B needs alignment to 32bits here! */ - memcpy_toio(lp->mem_ptr_virt, skb->data, (skb->len + 3) & ~3); - if (!ok_flag) - memset_io(lp->mem_ptr_virt, 0, HP100_MIN_PACKET_SIZE - skb->len); + if (lp->mem_ptr_virt) { /* high pci memory was remapped */ + /* Note: The J2585B needs alignment to 32bits here! */ + memcpy_toio(lp->mem_ptr_virt, skb->data, (skb->len + 3) & ~3); + if (!ok_flag) + memset_io(lp->mem_ptr_virt, 0, HP100_MIN_PACKET_SIZE - skb->len); + } else { + /* Note: The J2585B needs alignment to 32bits here! */ + isa_memcpy_toio(lp->mem_ptr_phys, skb->data, (skb->len + 3) & ~3); + if (!ok_flag) + isa_memset_io(lp->mem_ptr_phys, 0, HP100_MIN_PACKET_SIZE - skb->len); + } } else { /* programmed i/o */ outsl(ioaddr + HP100_REG_DATA32, skb->data, (skb->len + 3) >> 2); @@ -1788,7 +1798,10 @@ static void hp100_rx(struct net_device *dev) /* First we get the header, which contains information about the */ /* actual length of the received packet. */ if (lp->mode == 2) { /* memory mapped mode */ - header = readl(lp->mem_ptr_virt); + if (lp->mem_ptr_virt) /* if memory was remapped */ + header = readl(lp->mem_ptr_virt); + else + header = isa_readl(lp->mem_ptr_phys); } else /* programmed i/o */ header = hp100_inl(DATA32); @@ -1820,9 +1833,13 @@ static void hp100_rx(struct net_device *dev) ptr = skb->data; /* Now transfer the data from the card into that area */ - if (lp->mode == 2) - memcpy_fromio(ptr, lp->mem_ptr_virt,pkt_len); - else /* io mapped */ + if (lp->mode == 2) { + if (lp->mem_ptr_virt) + memcpy_fromio(ptr, lp->mem_ptr_virt,pkt_len); + /* Note alignment to 32bit transfers */ + else + isa_memcpy_fromio(ptr, lp->mem_ptr_phys, pkt_len); + } else /* io mapped */ insl(ioaddr + HP100_REG_DATA32, ptr, pkt_len >> 2); skb->protocol = eth_type_trans(skb, dev); diff --git a/drivers/net/hplance.c b/drivers/net/hplance.c index 685693464..d8410634b 100644 --- a/drivers/net/hplance.c +++ b/drivers/net/hplance.c @@ -217,7 +217,7 @@ static int hplance_close(struct net_device *dev) int __init hplance_init_module(void) { - return dio_register_driver(&hplance_driver); + return dio_module_init(&hplance_driver); } void __exit hplance_cleanup_module(void) diff --git a/drivers/net/hydra.c b/drivers/net/hydra.c index 91326ea3e..6e0ca7340 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, IRQF_SHARED, "Hydra Ethernet", + if (request_irq(IRQ_AMIGA_PORTS, ei_interrupt, SA_SHIRQ, "Hydra Ethernet", dev)) { free_netdev(dev); return -EAGAIN; @@ -242,7 +242,7 @@ static void __devexit hydra_remove_one(struct zorro_dev *z) static int __init hydra_init_module(void) { - return zorro_register_driver(&hydra_driver); + return zorro_module_init(&hydra_driver); } static void __exit hydra_cleanup_module(void) diff --git a/drivers/net/ibm_emac/ibm_emac.h b/drivers/net/ibm_emac/ibm_emac.h index 97ed22bb4..c2dae6092 100644 --- a/drivers/net/ibm_emac/ibm_emac.h +++ b/drivers/net/ibm_emac/ibm_emac.h @@ -20,6 +20,7 @@ #ifndef __IBM_EMAC_H_ #define __IBM_EMAC_H_ +#include #include /* This is a simple check to prevent use of this driver on non-tested SoCs */ diff --git a/drivers/net/ibm_emac/ibm_emac_core.c b/drivers/net/ibm_emac/ibm_emac_core.c index 82468e2dc..591c5864f 100644 --- a/drivers/net/ibm_emac/ibm_emac_core.c +++ b/drivers/net/ibm_emac/ibm_emac_core.c @@ -19,6 +19,7 @@ * */ +#include #include #include #include @@ -203,7 +204,7 @@ static inline int emac_phy_gpcs(int phy_mode) static inline void emac_tx_enable(struct ocp_enet_private *dev) { - struct emac_regs __iomem *p = dev->emacp; + struct emac_regs *p = dev->emacp; unsigned long flags; u32 r; @@ -219,7 +220,7 @@ static inline void emac_tx_enable(struct ocp_enet_private *dev) static void emac_tx_disable(struct ocp_enet_private *dev) { - struct emac_regs __iomem *p = dev->emacp; + struct emac_regs *p = dev->emacp; unsigned long flags; u32 r; @@ -243,7 +244,7 @@ static void emac_tx_disable(struct ocp_enet_private *dev) static void emac_rx_enable(struct ocp_enet_private *dev) { - struct emac_regs __iomem *p = dev->emacp; + struct emac_regs *p = dev->emacp; unsigned long flags; u32 r; @@ -274,7 +275,7 @@ static void emac_rx_enable(struct ocp_enet_private *dev) static void emac_rx_disable(struct ocp_enet_private *dev) { - struct emac_regs __iomem *p = dev->emacp; + struct emac_regs *p = dev->emacp; unsigned long flags; u32 r; @@ -298,7 +299,7 @@ static void emac_rx_disable(struct ocp_enet_private *dev) static inline void emac_rx_disable_async(struct ocp_enet_private *dev) { - struct emac_regs __iomem *p = dev->emacp; + struct emac_regs *p = dev->emacp; unsigned long flags; u32 r; @@ -314,7 +315,7 @@ static inline void emac_rx_disable_async(struct ocp_enet_private *dev) static int emac_reset(struct ocp_enet_private *dev) { - struct emac_regs __iomem *p = dev->emacp; + struct emac_regs *p = dev->emacp; unsigned long flags; int n = 20; @@ -347,7 +348,7 @@ static int emac_reset(struct ocp_enet_private *dev) static void emac_hash_mc(struct ocp_enet_private *dev) { - struct emac_regs __iomem *p = dev->emacp; + struct emac_regs *p = dev->emacp; u16 gaht[4] = { 0 }; struct dev_mc_list *dmi; @@ -392,7 +393,7 @@ static inline int emac_opb_mhz(void) /* BHs disabled */ static int emac_configure(struct ocp_enet_private *dev) { - struct emac_regs __iomem *p = dev->emacp; + struct emac_regs *p = dev->emacp; struct net_device *ndev = dev->ndev; int gige; u32 r; @@ -554,7 +555,7 @@ static void emac_full_tx_reset(struct net_device *ndev) static int __emac_mdio_read(struct ocp_enet_private *dev, u8 id, u8 reg) { - struct emac_regs __iomem *p = dev->emacp; + struct emac_regs *p = dev->emacp; u32 r; int n; @@ -603,7 +604,7 @@ static int __emac_mdio_read(struct ocp_enet_private *dev, u8 id, u8 reg) static void __emac_mdio_write(struct ocp_enet_private *dev, u8 id, u8 reg, u16 val) { - struct emac_regs __iomem *p = dev->emacp; + struct emac_regs *p = dev->emacp; int n; DBG2("%d: mdio_write(%02x,%02x,%04x)" NL, dev->def->index, id, reg, @@ -665,7 +666,7 @@ static void emac_mdio_write(struct net_device *ndev, int id, int reg, int val) static void emac_set_multicast_list(struct net_device *ndev) { struct ocp_enet_private *dev = ndev->priv; - struct emac_regs __iomem *p = dev->emacp; + struct emac_regs *p = dev->emacp; u32 rmr = emac_iff2rmr(ndev); DBG("%d: multicast %08x" NL, dev->def->index, rmr); @@ -824,7 +825,7 @@ static void emac_clean_rx_ring(struct ocp_enet_private *dev) } static inline int emac_alloc_rx_skb(struct ocp_enet_private *dev, int slot, - gfp_t flags) + int flags) { struct sk_buff *skb = alloc_skb(dev->rx_skb_size, flags); if (unlikely(!skb)) @@ -1046,7 +1047,7 @@ static inline u16 emac_tx_csum(struct ocp_enet_private *dev, static inline int emac_xmit_finish(struct ocp_enet_private *dev, int len) { - struct emac_regs __iomem *p = dev->emacp; + struct emac_regs *p = dev->emacp; struct net_device *ndev = dev->ndev; /* Send the packet out */ @@ -1518,7 +1519,7 @@ static void emac_rxde(void *param) 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 emac_regs *p = dev->emacp; struct ibm_emac_error_stats *st = &dev->estats; u32 isr = in_be32(&p->isr); @@ -1618,17 +1619,17 @@ static void emac_remove(struct ocp_device *ocpdev) DBG("%d: remove" NL, dev->def->index); - ocp_set_drvdata(ocpdev, NULL); + ocp_set_drvdata(ocpdev, 0); unregister_netdev(dev->ndev); tah_fini(dev->tah_dev); rgmii_fini(dev->rgmii_dev, dev->rgmii_input); zmii_fini(dev->zmii_dev, dev->zmii_input); - emac_dbg_register(dev->def->index, NULL); + emac_dbg_register(dev->def->index, 0); mal_unregister_commac(dev->mal, &dev->commac); - iounmap(dev->emacp); + iounmap((void *)dev->emacp); kfree(dev->ndev); } @@ -2047,7 +2048,9 @@ static int __init emac_probe(struct ocp_device *ocpdev) goto out4; /* Map EMAC regs */ - dev->emacp = ioremap(dev->def->paddr, sizeof(struct emac_regs)); + dev->emacp = + (struct emac_regs *)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); @@ -2207,7 +2210,7 @@ static int __init emac_probe(struct ocp_device *ocpdev) return 0; out6: - iounmap(dev->emacp); + iounmap((void *)dev->emacp); out5: tah_fini(dev->tah_dev); out4: diff --git a/drivers/net/ibm_emac/ibm_emac_core.h b/drivers/net/ibm_emac/ibm_emac_core.h index dabb94afe..911abbaf4 100644 --- a/drivers/net/ibm_emac/ibm_emac_core.h +++ b/drivers/net/ibm_emac/ibm_emac_core.h @@ -20,6 +20,7 @@ #ifndef __IBM_EMAC_CORE_H_ #define __IBM_EMAC_CORE_H_ +#include #include #include #include @@ -154,7 +155,7 @@ struct ibm_emac_error_stats { struct ocp_enet_private { struct net_device *ndev; /* 0 */ - struct emac_regs __iomem *emacp; + struct emac_regs *emacp; struct mal_descriptor *tx_desc; int tx_cnt; diff --git a/drivers/net/ibm_emac/ibm_emac_debug.c b/drivers/net/ibm_emac/ibm_emac_debug.c index c36459080..75d3b8639 100644 --- a/drivers/net/ibm_emac/ibm_emac_debug.c +++ b/drivers/net/ibm_emac/ibm_emac_debug.c @@ -12,6 +12,7 @@ * option) any later version. * */ +#include #include #include #include @@ -57,7 +58,7 @@ static void emac_desc_dump(int idx, struct ocp_enet_private *p) static void emac_mac_dump(int idx, struct ocp_enet_private *dev) { - struct emac_regs __iomem *p = dev->emacp; + struct emac_regs *p = dev->emacp; printk("** EMAC%d registers **\n" "MR0 = 0x%08x MR1 = 0x%08x TMR0 = 0x%08x TMR1 = 0x%08x\n" diff --git a/drivers/net/ibm_emac/ibm_emac_debug.h b/drivers/net/ibm_emac/ibm_emac_debug.h index 576138949..e85fbe0a8 100644 --- a/drivers/net/ibm_emac/ibm_emac_debug.h +++ b/drivers/net/ibm_emac/ibm_emac_debug.h @@ -15,6 +15,7 @@ #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 af50e7b2e..da88d4308 100644 --- a/drivers/net/ibm_emac/ibm_emac_mal.c +++ b/drivers/net/ibm_emac/ibm_emac_mal.c @@ -19,6 +19,7 @@ * option) any later version. * */ +#include #include #include #include diff --git a/drivers/net/ibm_emac/ibm_emac_mal.h b/drivers/net/ibm_emac/ibm_emac_mal.h index f73f10a0a..2a2d3b24b 100644 --- a/drivers/net/ibm_emac/ibm_emac_mal.h +++ b/drivers/net/ibm_emac/ibm_emac_mal.h @@ -19,6 +19,7 @@ #ifndef __IBM_EMAC_MAL_H_ #define __IBM_EMAC_MAL_H_ +#include #include #include #include diff --git a/drivers/net/ibm_emac/ibm_emac_phy.c b/drivers/net/ibm_emac/ibm_emac_phy.c index 4a9702406..67935dd33 100644 --- a/drivers/net/ibm_emac/ibm_emac_phy.c +++ b/drivers/net/ibm_emac/ibm_emac_phy.c @@ -12,6 +12,7 @@ * (c) 2004-2005, Eugene Surovegin * */ +#include #include #include #include diff --git a/drivers/net/ibm_emac/ibm_emac_rgmii.c b/drivers/net/ibm_emac/ibm_emac_rgmii.c index 53d281cb9..f0b1ffb2d 100644 --- a/drivers/net/ibm_emac/ibm_emac_rgmii.c +++ b/drivers/net/ibm_emac/ibm_emac_rgmii.c @@ -16,6 +16,7 @@ * 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 94abde55e..a1ffb8a44 100644 --- a/drivers/net/ibm_emac/ibm_emac_rgmii.h +++ b/drivers/net/ibm_emac/ibm_emac_rgmii.h @@ -21,6 +21,7 @@ #ifndef _IBM_EMAC_RGMII_H_ #define _IBM_EMAC_RGMII_H_ +#include /* RGMII bridge */ struct rgmii_regs { @@ -30,7 +31,7 @@ struct rgmii_regs { /* RGMII device */ struct ibm_ocp_rgmii { - struct rgmii_regs __iomem *base; + struct rgmii_regs *base; int users; /* number of EMACs using this RGMII bridge */ }; diff --git a/drivers/net/ibm_emac/ibm_emac_tah.c b/drivers/net/ibm_emac/ibm_emac_tah.c index e287b451b..af08afc22 100644 --- a/drivers/net/ibm_emac/ibm_emac_tah.c +++ b/drivers/net/ibm_emac/ibm_emac_tah.c @@ -13,6 +13,7 @@ * 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 38153945a..9299b5dd7 100644 --- a/drivers/net/ibm_emac/ibm_emac_tah.h +++ b/drivers/net/ibm_emac/ibm_emac_tah.h @@ -17,6 +17,7 @@ #ifndef _IBM_EMAC_TAH_H #define _IBM_EMAC_TAH_H +#include #include #include diff --git a/drivers/net/ibm_emac/ibm_emac_zmii.c b/drivers/net/ibm_emac/ibm_emac_zmii.c index 37dc8f342..35c118507 100644 --- a/drivers/net/ibm_emac/ibm_emac_zmii.c +++ b/drivers/net/ibm_emac/ibm_emac_zmii.c @@ -16,6 +16,7 @@ * option) any later version. * */ +#include #include #include #include @@ -79,7 +80,7 @@ static inline u32 zmii_mode_mask(int mode, int input) static int __init zmii_init(struct ocp_device *ocpdev, int input, int *mode) { struct ibm_ocp_zmii *dev = ocp_get_drvdata(ocpdev); - struct zmii_regs __iomem *p; + struct zmii_regs *p; ZMII_DBG("%d: init(%d, %d)" NL, ocpdev->def->index, input, *mode); @@ -93,7 +94,8 @@ static int __init zmii_init(struct ocp_device *ocpdev, int input, int *mode) } dev->mode = PHY_MODE_NA; - p = ioremap(ocpdev->def->paddr, sizeof(struct zmii_regs)); + p = (struct zmii_regs *)ioremap(ocpdev->def->paddr, + sizeof(struct zmii_regs)); if (!p) { printk(KERN_ERR "zmii%d: could not ioremap device registers!\n", @@ -229,7 +231,7 @@ void __exit __zmii_fini(struct ocp_device *ocpdev, int input) if (!--dev->users) { /* Free everything if this is the last user */ ocp_set_drvdata(ocpdev, NULL); - iounmap(dev->base); + iounmap((void *)dev->base); kfree(dev); } } diff --git a/drivers/net/ibm_emac/ibm_emac_zmii.h b/drivers/net/ibm_emac/ibm_emac_zmii.h index 972e3a44a..0bb26062c 100644 --- a/drivers/net/ibm_emac/ibm_emac_zmii.h +++ b/drivers/net/ibm_emac/ibm_emac_zmii.h @@ -19,6 +19,7 @@ #ifndef _IBM_EMAC_ZMII_H_ #define _IBM_EMAC_ZMII_H_ +#include #include #include @@ -31,7 +32,7 @@ struct zmii_regs { /* ZMII device */ struct ibm_ocp_zmii { - struct zmii_regs __iomem *base; + struct zmii_regs *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 */ diff --git a/drivers/net/ibmlana.c b/drivers/net/ibmlana.c index 2a95d72fa..01ad90421 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, IRQF_SHARED | IRQF_SAMPLE_RANDOM, dev->name, dev); + result = request_irq(priv->realirq, irq_handler, SA_SHIRQ | SA_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 6b58bab9e..458ee226e 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 0464e78f7..ceb98fd39 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,6 +33,7 @@ - possibly remove procfs support */ +#include #include #include #include @@ -60,7 +61,7 @@ #undef DEBUG #define ibmveth_printk(fmt, args...) \ - printk(KERN_DEBUG "%s: " fmt, __FILE__, ## args) + printk(KERN_INFO "%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) @@ -78,7 +79,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); @@ -95,7 +96,6 @@ 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,13 +133,12 @@ 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, u32 pool_active) +static void ibmveth_init_buffer_pool(struct ibmveth_buff_pool *pool, u32 pool_index, u32 pool_size, u32 buff_size) { 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 */ @@ -147,13 +146,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; @@ -181,6 +180,7 @@ 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,11 +231,11 @@ 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) { + + if(lpar_rc != H_Success) { pool->free_map[free_index] = index; pool->skbuff[index] = NULL; pool->consumer_index--; @@ -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,6 +301,7 @@ 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 */ @@ -371,8 +372,8 @@ 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) { + + 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); } @@ -406,7 +407,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)) { @@ -432,9 +433,7 @@ static void ibmveth_cleanup(struct ibmveth_adapter *adapter) } for(i = 0; irx_buff_pool[i].active) - ibmveth_free_buffer_pool(adapter, - &adapter->rx_buff_pool[i]); + ibmveth_free_buffer_pool(adapter, &adapter->rx_buff_pool[i]); } static int ibmveth_open(struct net_device *netdev) @@ -451,10 +450,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); @@ -490,6 +489,9 @@ 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; @@ -502,14 +504,14 @@ 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, adapter->filter_list_dma, mac_address); - if(lpar_rc != H_SUCCESS) { + if(lpar_rc != H_Success) { ibmveth_error_printk("h_register_logical_lan failed with %ld\n", lpar_rc); ibmveth_error_printk("buffer TCE:0x%lx filter TCE:0x%lx rxq desc:0x%lx MAC:0x%lx\n", adapter->buffer_list_dma, @@ -517,18 +519,7 @@ static int ibmveth_open(struct net_device *netdev) rxq_desc.desc, mac_address); ibmveth_cleanup(adapter); - 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 ; - } + return -ENONET; } ibmveth_debug_printk("registering irq 0x%x\n", netdev->irq); @@ -536,7 +527,7 @@ static int ibmveth_open(struct net_device *netdev) ibmveth_error_printk("unable to request irq 0x%x, rc %d\n", netdev->irq, rc); do { rc = h_free_logical_lan(adapter->vdev->unit_address); - } while (H_IS_LONG_BUSY(rc) || (rc == H_BUSY)); + } while (H_isLongBusy(rc) || (rc == H_Busy)); ibmveth_cleanup(adapter); return rc; @@ -556,19 +547,18 @@ static int ibmveth_close(struct net_device *netdev) { struct ibmveth_adapter *adapter = netdev->priv; long lpar_rc; - + ibmveth_debug_printk("close starting\n"); - if (!adapter->pool_config) - netif_stop_queue(netdev); + netif_stop_queue(netdev); free_irq(netdev->irq, netdev); do { lpar_rc = h_free_logical_lan(adapter->vdev->unit_address); - } while (H_IS_LONG_BUSY(lpar_rc) || (lpar_rc == H_BUSY)); + } while (H_isLongBusy(lpar_rc) || (lpar_rc == H_Busy)); - if(lpar_rc != H_SUCCESS) + if(lpar_rc != H_Success) { ibmveth_error_printk("h_free_logical_lan failed with %lx, continuing with close\n", lpar_rc); @@ -703,9 +693,9 @@ static int ibmveth_start_xmit(struct sk_buff *skb, struct net_device *netdev) desc[4].desc, desc[5].desc, correlator); - } while ((lpar_rc == H_BUSY) && (retry_count--)); - - if(lpar_rc != H_SUCCESS && lpar_rc != H_DROPPED) { + } 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); for(i = 0; i < 6; i++) { @@ -790,20 +780,20 @@ 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 */ lpar_rc = h_vio_signal(adapter->vdev->unit_address, VIO_IRQ_ENABLE); - ibmveth_assert(lpar_rc == H_SUCCESS); + ibmveth_assert(lpar_rc == H_Success); netif_rx_complete(netdev); if(ibmveth_rxq_pending_buffer(adapter) && netif_rx_reschedule(netdev, frames_processed)) { lpar_rc = h_vio_signal(adapter->vdev->unit_address, VIO_IRQ_DISABLE); - ibmveth_assert(lpar_rc == H_SUCCESS); + ibmveth_assert(lpar_rc == H_Success); more_work = 1; goto restart_poll; } @@ -816,14 +806,14 @@ 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; if(netif_rx_schedule_prep(netdev)) { lpar_rc = h_vio_signal(adapter->vdev->unit_address, VIO_IRQ_DISABLE); - ibmveth_assert(lpar_rc == H_SUCCESS); + ibmveth_assert(lpar_rc == H_Success); __netif_rx_schedule(netdev); } return IRQ_HANDLED; @@ -845,7 +835,7 @@ static void ibmveth_set_multicast_list(struct net_device *netdev) IbmVethMcastEnableRecv | IbmVethMcastDisableFiltering, 0); - if(lpar_rc != H_SUCCESS) { + if(lpar_rc != H_Success) { ibmveth_error_printk("h_multicast_ctrl rc=%ld when entering promisc mode\n", lpar_rc); } } else { @@ -857,7 +847,7 @@ static void ibmveth_set_multicast_list(struct net_device *netdev) IbmVethMcastDisableFiltering | IbmVethMcastClearFilterTable, 0); - if(lpar_rc != H_SUCCESS) { + if(lpar_rc != H_Success) { ibmveth_error_printk("h_multicast_ctrl rc=%ld when attempting to clear filter table\n", lpar_rc); } /* add the addresses to the filter table */ @@ -868,16 +858,16 @@ static void ibmveth_set_multicast_list(struct net_device *netdev) lpar_rc = h_multicast_ctrl(adapter->vdev->unit_address, IbmVethMcastAddFilter, mcast_addr); - if(lpar_rc != H_SUCCESS) { + if(lpar_rc != H_Success) { 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, 0); - if(lpar_rc != H_SUCCESS) { + if(lpar_rc != H_Success) { ibmveth_error_printk("h_multicast_ctrl rc=%ld when enabling filtering\n", lpar_rc); } } @@ -886,22 +876,46 @@ 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 < IBMVETH_MAX_MTU) + if ((new_mtu < 68) || + (new_mtu > (pool_size[IbmVethNumBufferPools-1]) - IBMVETH_BUFF_OH)) return -EINVAL; - /* Look for an active buffer pool that can hold the new MTU */ for(i = 0; irx_buff_pool[i].active) - continue; - if (new_mtu_oh < adapter->rx_buff_pool[i].buff_size) { - dev->mtu = new_mtu; - return 0; + int activate = 0; + if (new_mtu > (pool_size[i] - IBMVETH_BUFF_OH)) { + activate = 1; + prev_smaller= 1; + } else { + if (prev_smaller) + activate = 1; + prev_smaller= 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]); + } + } - return -EINVAL; + + /* 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; } static int __devinit ibmveth_probe(struct vio_dev *dev, const struct vio_device_id *id) @@ -914,7 +928,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); @@ -923,7 +937,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 " @@ -931,7 +945,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) @@ -946,14 +960,13 @@ 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) @@ -963,7 +976,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; @@ -976,21 +989,14 @@ 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].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); - } + for(i = 0; irx_buff_pool[i], i, + pool_count[i], pool_size[i]); ibmveth_debug_printk("adapter @ 0x%p\n", adapter); @@ -1019,10 +1025,6 @@ 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); @@ -1046,7 +1048,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; @@ -1061,18 +1063,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", @@ -1081,7 +1083,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); @@ -1093,7 +1095,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 = { @@ -1151,11 +1153,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) @@ -1167,132 +1169,6 @@ 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"}, { "", "" } @@ -1322,7 +1198,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 8385bf836..46919a814 100644 --- a/drivers/net/ibmveth.h +++ b/drivers/net/ibmveth.h @@ -75,13 +75,10 @@ #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) @@ -97,7 +94,6 @@ struct ibmveth_buff_pool { dma_addr_t *dma_addr; struct sk_buff **skbuff; int active; - struct kobject kobj; }; struct ibmveth_rx_q { @@ -122,7 +118,6 @@ 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; @@ -139,7 +134,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; @@ -148,7 +143,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 43e3f33ed..31fb2d75d 100644 --- a/drivers/net/ifb.c +++ b/drivers/net/ifb.c @@ -27,6 +27,7 @@ */ +#include #include #include #include @@ -75,13 +76,13 @@ static void ri_tasklet(unsigned long dev) dp->st_task_enter++; if ((skb = skb_peek(&dp->tq)) == NULL) { dp->st_txq_refl_try++; - if (netif_tx_trylock(_dev)) { + if (spin_trylock(&_dev->xmit_lock)) { dp->st_rxq_enter++; while ((skb = skb_dequeue(&dp->rq)) != NULL) { skb_queue_tail(&dp->tq, skb); dp->st_rx2tx_tran++; } - netif_tx_unlock(_dev); + spin_unlock(&_dev->xmit_lock); } else { /* reschedule */ dp->st_rxq_notenter++; @@ -109,7 +110,7 @@ static void ri_tasklet(unsigned long dev) } } - if (netif_tx_trylock(_dev)) { + if (spin_trylock(&_dev->xmit_lock)) { dp->st_rxq_check++; if ((skb = skb_peek(&dp->rq)) == NULL) { dp->tasklet_pending = 0; @@ -117,10 +118,10 @@ static void ri_tasklet(unsigned long dev) netif_wake_queue(_dev); } else { dp->st_rxq_rsch++; - netif_tx_unlock(_dev); + spin_unlock(&_dev->xmit_lock); goto resched; } - netif_tx_unlock(_dev); + spin_unlock(&_dev->xmit_lock); } else { resched: dp->tasklet_pending = 1; @@ -271,7 +272,6 @@ 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 68d8af7df..9b8295ee0 100644 --- a/drivers/net/ioc3-eth.c +++ b/drivers/net/ioc3-eth.c @@ -30,6 +30,7 @@ #define IOC3_NAME "ioc3-eth" #define IOC3_VERSION "2.6.3-3" +#include #include #include #include @@ -43,7 +44,6 @@ #include #include #include -#include #ifdef CONFIG_SERIAL_8250 #include @@ -144,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 <<= 57; /* Shift to PCI64_ATTR_VIRTUAL */ + vdev <<= 58; /* Shift to PCI64_ATTR_VIRTUAL */ return vdev | (0xaUL << PCI64_ATTR_TARG_SHFT) | PCI64_ATTR_PREF | ((unsigned long)ptr & TO_PHYS_MASK); @@ -1063,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, IRQF_SHARED, ioc3_str, dev)) { + if (request_irq(dev->irq, ioc3_interrupt, SA_SHIRQ, ioc3_str, dev)) { printk(KERN_ERR "%s: Can't get irq %d\n", dev->name, dev->irq); return -EAGAIN; @@ -1195,17 +1195,17 @@ static int ioc3_probe(struct pci_dev *pdev, const struct pci_device_id *ent) int err, pci_using_dac; /* Configure DMA attributes. */ - err = pci_set_dma_mask(pdev, DMA_64BIT_MASK); + err = pci_set_dma_mask(pdev, 0xffffffffffffffffULL); if (!err) { pci_using_dac = 1; - err = pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK); + err = pci_set_consistent_dma_mask(pdev, 0xffffffffffffffffULL); if (err < 0) { printk(KERN_ERR "%s: Unable to obtain 64 bit DMA " "for consistent allocations\n", pci_name(pdev)); goto out; } } else { - err = pci_set_dma_mask(pdev, DMA_32BIT_MASK); + err = pci_set_dma_mask(pdev, 0xffffffffULL); if (err) { printk(KERN_ERR "%s: No usable DMA configuration, " "aborting.\n", pci_name(pdev)); diff --git a/drivers/net/irda/Kconfig b/drivers/net/irda/Kconfig index e9e6d99a9..7a081346f 100644 --- a/drivers/net/irda/Kconfig +++ b/drivers/net/irda/Kconfig @@ -33,7 +33,7 @@ config DONGLE config ESI_DONGLE tristate "ESI JetEye PC dongle" - depends on IRTTY_SIR && DONGLE && IRDA + depends on DONGLE && IRDA help Say Y here if you want to build support for the Extended Systems JetEye PC dongle. To compile it as a module, choose M here. The ESI @@ -44,7 +44,7 @@ config ESI_DONGLE config ACTISYS_DONGLE tristate "ACTiSYS IR-220L and IR220L+ dongle" - depends on IRTTY_SIR && DONGLE && IRDA + depends on DONGLE && IRDA help Say Y here if you want to build support for the ACTiSYS IR-220L and IR220L+ dongles. To compile it as a module, choose M here. The @@ -55,7 +55,7 @@ config ACTISYS_DONGLE config TEKRAM_DONGLE tristate "Tekram IrMate 210B dongle" - depends on IRTTY_SIR && DONGLE && IRDA + depends on DONGLE && IRDA help Say Y here if you want to build support for the Tekram IrMate 210B dongle. To compile it as a module, choose M here. The Tekram dongle @@ -64,17 +64,9 @@ config TEKRAM_DONGLE dongles you will have to start irattach like this: "irattach -d tekram". -config TOIM3232_DONGLE - tristate "TOIM3232 IrDa dongle" - depends on IRTTY_SIR && DONGLE && IRDA - help - Say Y here if you want to build support for the Vishay/Temic - TOIM3232 and TOIM4232 based dongles. - To compile it as a module, choose M here. - config LITELINK_DONGLE tristate "Parallax LiteLink dongle" - depends on IRTTY_SIR && DONGLE && IRDA + depends on DONGLE && IRDA help Say Y here if you want to build support for the Parallax Litelink dongle. To compile it as a module, choose M here. The Parallax @@ -85,7 +77,7 @@ config LITELINK_DONGLE config MA600_DONGLE tristate "Mobile Action MA600 dongle" - depends on IRTTY_SIR && DONGLE && IRDA && EXPERIMENTAL + depends on DONGLE && IRDA && EXPERIMENTAL help Say Y here if you want to build support for the Mobile Action MA600 dongle. To compile it as a module, choose M here. The MA600 dongle @@ -98,7 +90,7 @@ config MA600_DONGLE config GIRBIL_DONGLE tristate "Greenwich GIrBIL dongle" - depends on IRTTY_SIR && DONGLE && IRDA && EXPERIMENTAL + depends on DONGLE && IRDA && EXPERIMENTAL help Say Y here if you want to build support for the Greenwich GIrBIL dongle. If you want to compile it as a module, choose M here. @@ -109,7 +101,7 @@ config GIRBIL_DONGLE config MCP2120_DONGLE tristate "Microchip MCP2120" - depends on IRTTY_SIR && DONGLE && IRDA && EXPERIMENTAL + depends on DONGLE && IRDA && EXPERIMENTAL help Say Y here if you want to build support for the Microchip MCP2120 dongle. If you want to compile it as a module, choose M here. @@ -123,7 +115,7 @@ config MCP2120_DONGLE config OLD_BELKIN_DONGLE tristate "Old Belkin dongle" - depends on IRTTY_SIR && DONGLE && IRDA && EXPERIMENTAL + depends on DONGLE && IRDA && EXPERIMENTAL help Say Y here if you want to build support for the Adaptec Airport 1000 and 2000 dongles. If you want to compile it as a module, choose @@ -132,7 +124,7 @@ config OLD_BELKIN_DONGLE config ACT200L_DONGLE tristate "ACTiSYS IR-200L dongle" - depends on IRTTY_SIR && DONGLE && IRDA && EXPERIMENTAL + depends on DONGLE && IRDA && EXPERIMENTAL help Say Y here if you want to build support for the ACTiSYS IR-200L dongle. If you want to compile it as a module, choose M here. @@ -291,7 +283,7 @@ config USB_IRDA Say Y here if you want to build support for the USB IrDA FIR Dongle device driver. To compile it as a module, choose M here: the module will be called irda-usb. IrDA-USB support the various IrDA USB - dongles available and most of their peculiarities. Those dongles + dongles available and most of their pecularities. Those dongles plug in the USB port of your computer, are plug and play, and support SIR and FIR (4Mbps) speeds. On the other hand, those dongles tend to be less efficient than a FIR chipset. @@ -350,7 +342,7 @@ config TOSHIBA_FIR config AU1000_FIR tristate "Alchemy Au1000 SIR/FIR" - depends on SOC_AU1000 && IRDA + depends on MIPS_AU1000 && IRDA config SMC_IRCC_FIR tristate "SMSC IrCC (EXPERIMENTAL)" @@ -368,7 +360,7 @@ config ALI_FIR help Say Y here if you want to build support for the ALi M5123 FIR Controller. The ALi M5123 FIR Controller is embedded in ALi M1543C, - M1535, M1535D, M1535+, M1535D South Bridge. This driver supports + M1535, M1535D, M1535+, M1535D Sourth Bridge. This driver supports SIR, MIR and FIR (4Mbps) speeds. To compile it as a module, choose M here: the module will be called @@ -417,20 +409,5 @@ 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 5be09f1b9..72cbfdc9c 100644 --- a/drivers/net/irda/Makefile +++ b/drivers/net/irda/Makefile @@ -19,7 +19,6 @@ 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 @@ -44,7 +43,6 @@ obj-$(CONFIG_OLD_BELKIN_DONGLE) += old_belkin-sir.o obj-$(CONFIG_MCP2120_DONGLE) += mcp2120-sir.o obj-$(CONFIG_ACT200L_DONGLE) += act200l-sir.o obj-$(CONFIG_MA600_DONGLE) += ma600-sir.o -obj-$(CONFIG_TOIM3232_DONGLE) += toim3232-sir.o # The SIR helper module -sir-dev-objs := sir_dev.o sir_dongle.o +sir-dev-objs := sir_dev.o sir_dongle.o sir_kthread.o diff --git a/drivers/net/irda/ali-ircc.c b/drivers/net/irda/ali-ircc.c index e3c8cd5ec..2e7882eb7 100644 --- a/drivers/net/irda/ali-ircc.c +++ b/drivers/net/irda/ali-ircc.c @@ -34,12 +34,14 @@ #include #include #include -#include #include #include #include +#include +#include + #include #include #include @@ -49,19 +51,7 @@ #define CHIP_IO_EXTENT 8 #define BROKEN_DONGLE_ID -#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, - }, -}; +static char *driver_name = "ali-ircc"; /* Module parameters */ static int qos_mtt_bits = 0x07; /* 1 ms or more */ @@ -107,7 +97,10 @@ 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 */ @@ -146,21 +139,12 @@ static int __init ali_ircc_init(void) { ali_chip_t *chip; chipio_t info; - int ret; + int ret = -ENODEV; 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++) @@ -230,10 +214,6 @@ static int __init ali_ircc_init(void) } IRDA_DEBUG(2, "%s(), ----------------- End -----------------\n", __FUNCTION__); - - if (ret) - platform_driver_unregister(&ali_ircc_driver); - return ret; } @@ -248,14 +228,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__); } @@ -269,6 +249,7 @@ 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; @@ -303,8 +284,7 @@ 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, - ALI_IRCC_DRIVER_NAME)) { + if (!request_region(self->io.fir_base, self->io.fir_ext, driver_name)) { IRDA_WARNING("%s(), can't get iobase of 0x%03x\n", __FUNCTION__, self->io.fir_base); err = -ENODEV; @@ -374,10 +354,13 @@ 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__, - ALI_IRCC_DRIVER_NAME, dongle_types[dongle_id]); + IRDA_MESSAGE("%s(), %s, Found dongle: %s\n", __FUNCTION__, 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__); @@ -565,11 +548,12 @@ 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", - ALI_IRCC_DRIVER_NAME, version); + IRDA_ERROR("%s, Wrong chip version %02x\n", 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); @@ -599,8 +583,7 @@ static int ali_ircc_setup(chipio_t *info) /* Switch to SIR space */ FIR2SIR(iobase); - IRDA_MESSAGE("%s, driver loaded (Benjamin Kong)\n", - ALI_IRCC_DRIVER_NAME); + IRDA_MESSAGE("%s, driver loaded (Benjamin Kong)\n", driver_name); /* Enable receive interrupts */ // outb(UART_IER_RDI, iobase+UART_IER); //benjamin 2000/11/23 01:25PM @@ -664,8 +647,7 @@ 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", - ALI_IRCC_DRIVER_NAME, irq); + IRDA_WARNING("%s: irq %d for unknown device.\n", driver_name, irq); return IRQ_NONE; } @@ -1346,8 +1328,7 @@ 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", - ALI_IRCC_DRIVER_NAME, + IRDA_WARNING("%s, unable to allocate irq=%d\n", driver_name, self->io.irq); return -EAGAIN; } @@ -1357,8 +1338,7 @@ 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", - ALI_IRCC_DRIVER_NAME, + IRDA_WARNING("%s, unable to allocate dma=%d\n", driver_name, self->io.dma); free_irq(self->io.irq, self); return -EAGAIN; @@ -2128,38 +2108,61 @@ static struct net_device_stats *ali_ircc_net_get_stats(struct net_device *dev) return &self->stats; } -static int ali_ircc_suspend(struct platform_device *dev, pm_message_t state) +static void ali_ircc_suspend(struct ali_ircc_cb *self) { - struct ali_ircc_cb *self = platform_get_drvdata(dev); + IRDA_DEBUG(2, "%s(), ---------------- Start ----------------\n", __FUNCTION__ ); - IRDA_MESSAGE("%s, Suspending\n", ALI_IRCC_DRIVER_NAME); + IRDA_MESSAGE("%s, Suspending\n", driver_name); if (self->io.suspended) - return 0; + return; ali_ircc_net_close(self->netdev); self->io.suspended = 1; - return 0; + IRDA_DEBUG(2, "%s(), ----------------- End ------------------\n", __FUNCTION__ ); } -static int ali_ircc_resume(struct platform_device *dev) +static void ali_ircc_wakeup(struct ali_ircc_cb *self) { - struct ali_ircc_cb *self = platform_get_drvdata(dev); + IRDA_DEBUG(2, "%s(), ---------------- Start ----------------\n", __FUNCTION__ ); if (!self->io.suspended) - return 0; + return; ali_ircc_net_open(self->netdev); - IRDA_MESSAGE("%s, Waking up\n", ALI_IRCC_DRIVER_NAME); + IRDA_MESSAGE("%s, Waking up\n", 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 7b2b4135b..e6b198576 100644 --- a/drivers/net/irda/au1k_ir.c +++ b/drivers/net/irda/au1k_ir.c @@ -18,6 +18,7 @@ * 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 33c07d527..3137592d6 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, - IRQF_SHARED | IRQF_DISABLED, dev->name, (void *) self)) + SA_SHIRQ | SA_INTERRUPT, 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 = IRQF_SHARED | IRQF_DISABLED; + self->io.irqflags = SA_SHIRQ | SA_INTERRUPT; self->speed = self->io.speed = 9600; self->async = 0; @@ -1778,7 +1778,7 @@ static struct pci_driver donauboe_pci_driver = { static int __init donauboe_init (void) { - return pci_register_driver(&donauboe_pci_driver); + return pci_module_init(&donauboe_pci_driver); } static void __exit diff --git a/drivers/net/irda/ep7211_ir.c b/drivers/net/irda/ep7211_ir.c index 4cba38f7e..31896262d 100644 --- a/drivers/net/irda/ep7211_ir.c +++ b/drivers/net/irda/ep7211_ir.c @@ -8,7 +8,6 @@ #include #include #include -#include #include #include @@ -24,8 +23,6 @@ static void ep7211_ir_close(dongle_t *self); static int ep7211_ir_change_speed(struct irda_task *task); static int ep7211_ir_reset(struct irda_task *task); -static DEFINE_SPINLOCK(ep7211_lock); - static struct dongle_reg dongle = { .type = IRDA_EP7211_IR, .open = ep7211_ir_open, @@ -39,7 +36,7 @@ static void ep7211_ir_open(dongle_t *self, struct qos_info *qos) { unsigned int syscon1, flags; - spin_lock_irqsave(&ep7211_lock, flags); + save_flags(flags); cli(); /* Turn on the SIR encoder. */ syscon1 = clps_readl(SYSCON1); @@ -49,14 +46,14 @@ static void ep7211_ir_open(dongle_t *self, struct qos_info *qos) /* XXX: We should disable modem status interrupts on the first UART (interrupt #14). */ - spin_unlock_irqrestore(&ep7211_lock, flags); + restore_flags(flags); } static void ep7211_ir_close(dongle_t *self) { unsigned int syscon1, flags; - spin_lock_irqsave(&ep7211_lock, flags); + save_flags(flags); cli(); /* Turn off the SIR encoder. */ syscon1 = clps_readl(SYSCON1); @@ -66,7 +63,7 @@ static void ep7211_ir_close(dongle_t *self) /* XXX: If we've disabled the modem status interrupts, we should reset them back to their original state. */ - spin_unlock_irqrestore(&ep7211_lock, flags); + restore_flags(flags); } /* diff --git a/drivers/net/irda/irda-usb.c b/drivers/net/irda/irda-usb.c index 2a0d538b3..6e2ec56cd 100644 --- a/drivers/net/irda/irda-usb.c +++ b/drivers/net/irda/irda-usb.c @@ -1,7 +1,7 @@ /***************************************************************************** * * Filename: irda-usb.c - * Version: 0.10 + * Version: 0.9b * Description: IrDA-USB Driver * Status: Experimental * Author: Dag Brattli @@ -9,9 +9,6 @@ * Copyright (C) 2000, Roman Weissgaerber * Copyright (C) 2001, Dag Brattli * Copyright (C) 2001, Jean Tourrilhes - * Copyright (C) 2004, SigmaTel, Inc. - * Copyright (C) 2005, Milan Beno - * Copyright (C) 2006, Nick Fedchik * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -64,7 +61,6 @@ #include #include #include -#include #include "irda-usb.h" @@ -82,12 +78,8 @@ static struct usb_device_id dongles[] = { { USB_DEVICE(0x50f, 0x180), .driver_info = IUC_SPEED_BUG | IUC_NO_WINDOW }, /* 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_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, + USB_DEVICE_ID_MATCH_INT_SUBCLASS, .bInterfaceClass = USB_CLASS_APP_SPEC, .bInterfaceSubClass = USB_CLASS_IRDA, .driver_info = IUC_DEFAULT, }, @@ -107,7 +99,6 @@ MODULE_DEVICE_TABLE(usb, dongles); /*------------------------------------------------------------------*/ -static void irda_usb_init_qos(struct irda_usb_cb *self) ; static struct irda_class_desc *irda_usb_find_class_desc(struct usb_interface *intf); static void irda_usb_disconnect(struct usb_interface *intf); static void irda_usb_change_speed_xbofs(struct irda_usb_cb *self); @@ -150,24 +141,7 @@ static void irda_usb_build_header(struct irda_usb_cb *self, __u8 *header, int force) { - /* Here we check if we have an STIR421x chip, - * and if either speed or xbofs (or both) needs - * to be changed. - */ - if (self->capability & IUC_STIR421X && - ((self->new_speed != -1) || (self->new_xbofs != -1))) { - - /* With STIR421x, speed and xBOFs must be set at the same - * time, even if only one of them changes. - */ - if (self->new_speed == -1) - self->new_speed = self->speed ; - - if (self->new_xbofs == -1) - self->new_xbofs = self->xbofs ; - } - - /* Set the link speed */ + /* Set the negotiated link speed */ if (self->new_speed != -1) { /* Hum... Ugly hack :-( * Some device are not compliant with the spec and change @@ -217,11 +191,7 @@ static void irda_usb_build_header(struct irda_usb_cb *self, *header = SPEED_4000000; self->new_xbofs = 0; break; - case 16000000: - *header = SPEED_16000000; - self->new_xbofs = 0; - break; - } + } } else /* No change */ *header = 0; @@ -265,32 +235,6 @@ static void irda_usb_build_header(struct irda_usb_cb *self, } } -/* -* calculate turnaround time for SigmaTel header -*/ -static __u8 get_turnaround_time(struct sk_buff *skb) -{ - int turnaround_time = irda_get_mtt(skb); - - if ( turnaround_time == 0 ) - return 0; - else if ( turnaround_time <= 10 ) - return 1; - else if ( turnaround_time <= 50 ) - return 2; - else if ( turnaround_time <= 100 ) - return 3; - else if ( turnaround_time <= 500 ) - return 4; - else if ( turnaround_time <= 1000 ) - return 5; - else if ( turnaround_time <= 5000 ) - return 6; - else - return 7; -} - - /*------------------------------------------------------------------*/ /* * Send a command to change the speed of the dongle @@ -318,18 +262,12 @@ 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_STIR421X) { - if (frame[0] == 0) return ; // do nothing if no change - frame[1] = 0; // other parameters don't change here - frame[2] = 0; - } - /* Submit the 0 length IrDA frame to trigger new speed settings */ usb_fill_bulk_urb(urb, self->usbdev, usb_sndbulkpipe(self->usbdev, self->bulk_out_ep), frame, IRDA_USB_SPEED_MTU, speed_bulk_callback, self); - urb->transfer_buffer_length = self->header_length; + urb->transfer_buffer_length = USB_IRDA_HEADER; urb->transfer_flags = 0; /* Irq disabled -> GFP_ATOMIC */ @@ -445,35 +383,16 @@ static int irda_usb_hard_xmit(struct sk_buff *skb, struct net_device *netdev) * allocation will be done lower in skb_push(). * Also, we don't use directly skb_cow(), because it require * headroom >= 16, which force unnecessary copies - Jean II */ - if (skb_headroom(skb) < self->header_length) { + if (skb_headroom(skb) < USB_IRDA_HEADER) { IRDA_DEBUG(0, "%s(), Insuficient skb headroom.\n", __FUNCTION__); - if (skb_cow(skb, self->header_length)) { + if (skb_cow(skb, USB_IRDA_HEADER)) { IRDA_WARNING("%s(), failed skb_cow() !!!\n", __FUNCTION__); goto drop; } } /* Change setting for next frame */ - - if (self->capability & IUC_STIR421X) { - __u8 turnaround_time; - __u8* frame; - turnaround_time = get_turnaround_time( skb ); - frame= skb_push(skb, self->header_length); - irda_usb_build_header(self, frame, 0); - frame[2] = turnaround_time; - if ((skb->len != 0) && - ((skb->len % 128) == 0) && - ((skb->len % 512) != 0)) { - /* add extra byte for special SigmaTel feature */ - frame[1] = 1; - skb_put(skb, 1); - } else { - frame[1] = 0; - } - } else { - irda_usb_build_header(self, skb_push(skb, self->header_length), 0); - } + irda_usb_build_header(self, skb_push(skb, USB_IRDA_HEADER), 0); /* FIXME: Make macro out of this one */ ((struct irda_skb_cb *)skb->cb)->context = self; @@ -876,7 +795,7 @@ static void irda_usb_receive(struct urb *urb, struct pt_regs *regs) } /* Check for empty frames */ - if (urb->actual_length <= self->header_length) { + if (urb->actual_length <= USB_IRDA_HEADER) { IRDA_WARNING("%s(), empty frame!\n", __FUNCTION__); goto done; } @@ -897,14 +816,7 @@ 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_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++; /* We could deliver the current skb, but this would stall @@ -933,7 +845,7 @@ static void irda_usb_receive(struct urb *urb, struct pt_regs *regs) /* Set proper length on skb & remove USB-IrDA header */ skb_put(dataskb, urb->actual_length); - skb_pull(dataskb, self->header_length); + skb_pull(dataskb, USB_IRDA_HEADER); /* Ask the networking layer to queue the packet for the IrDA stack */ dataskb->dev = self->netdev; @@ -1025,143 +937,6 @@ static int irda_usb_is_receiving(struct irda_usb_cb *self) return 0; /* For now */ } -#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 - -/* - * 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 int stir421x_fw_upload(struct irda_usb_cb *self, - unsigned char *patch, - const unsigned int patch_len) -{ - 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; - } - - 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; - 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; -} - - /********************** IRDA DEVICE CALLBACKS **********************/ /* * Main calls from the IrDA/Network subsystem. @@ -1197,11 +972,6 @@ static int irda_usb_net_open(struct net_device *netdev) return -1; } - if(self->needspatch) { - IRDA_WARNING("%s(), device needs patch\n", __FUNCTION__) ; - return -EIO ; - } - /* Initialise default speed and xbofs value * (IrLAP will change that soon) */ self->speed = -1; @@ -1280,7 +1050,7 @@ static int irda_usb_net_close(struct net_device *netdev) del_timer(&self->rx_defer_timer); /* Deallocate all the Rx path buffers (URBs and skb) */ - for (i = 0; i < self->max_rx_urb; i++) { + for (i = 0; i < IU_MAX_RX_URBS; i++) { struct urb *urb = self->rx_urb[i]; struct sk_buff *skb = (struct sk_buff *) urb->context; /* Cancel the receive command */ @@ -1656,22 +1426,8 @@ static int irda_usb_probe(struct usb_interface *intf, spin_lock_init(&self->lock); init_timer(&self->rx_defer_timer); - self->capability = id->driver_info; - self->needspatch = ((self->capability & IUC_STIR421X) != 0); - /* Create all of the needed urbs */ - if (self->capability & IUC_STIR421X) { - self->max_rx_urb = IU_SIGMATEL_MAX_RX_URBS; - self->header_length = USB_IRDA_STIR421X_HEADER; - } else { - self->max_rx_urb = IU_MAX_RX_URBS; - self->header_length = USB_IRDA_HEADER; - } - - self->rx_urb = kzalloc(self->max_rx_urb * sizeof(struct urb *), - GFP_KERNEL); - - for (i = 0; i < self->max_rx_urb; i++) { + for (i = 0; i < IU_MAX_RX_URBS; i++) { self->rx_urb[i] = usb_alloc_urb(0, GFP_KERNEL); if (!self->rx_urb[i]) { goto err_out_1; @@ -1723,28 +1479,17 @@ static int irda_usb_probe(struct usb_interface *intf, goto err_out_3; } - self->usbdev = dev; - /* Find IrDA class descriptor */ irda_desc = irda_usb_find_class_desc(intf); ret = -ENODEV; if (irda_desc == NULL) goto err_out_3; - if (self->needspatch) { - ret = usb_control_msg (self->usbdev, usb_sndctrlpipe (self->usbdev, 0), - 0x02, 0x40, 0, 0, NULL, 0, 500); - if (ret < 0) { - IRDA_DEBUG (0, "usb_control_msg failed %d\n", ret); - goto err_out_3; - } else { - mdelay(10); - } - } - self->irda_desc = irda_desc; self->present = 1; self->netopen = 0; + self->capability = id->driver_info; + self->usbdev = dev; self->usbintf = intf; /* Allocate the buffer for speed changes */ @@ -1763,32 +1508,8 @@ static int irda_usb_probe(struct usb_interface *intf, IRDA_MESSAGE("IrDA: Registered device %s\n", net->name); usb_set_intfdata(intf, self); - - if (self->needspatch) { - /* Now we fetch and upload the firmware patch */ - ret = stir421x_patch_device(self); - self->needspatch = (ret < 0); - if (self->needspatch) { - IRDA_ERROR("STIR421X: Couldn't upload patch\n"); - goto err_out_5; - } - - /* replace IrDA class descriptor with what patched device is now reporting */ - irda_desc = irda_usb_find_class_desc (self->usbintf); - if (irda_desc == NULL) { - ret = -ENODEV; - goto err_out_5; - } - if (self->irda_desc) - kfree (self->irda_desc); - self->irda_desc = irda_desc; - irda_usb_init_qos(self); - } - return 0; -err_out_5: - unregister_netdev(self->netdev); err_out_4: kfree(self->speed_buff); err_out_3: @@ -1797,7 +1518,7 @@ err_out_3: err_out_2: usb_free_urb(self->tx_urb); err_out_1: - for (i = 0; i < self->max_rx_urb; i++) { + for (i = 0; i < IU_MAX_RX_URBS; i++) { if (self->rx_urb[i]) usb_free_urb(self->rx_urb[i]); } @@ -1850,7 +1571,7 @@ static void irda_usb_disconnect(struct usb_interface *intf) /*netif_device_detach(self->netdev);*/ netif_stop_queue(self->netdev); /* Stop all the receive URBs. Must be synchronous. */ - for (i = 0; i < self->max_rx_urb; i++) + for (i = 0; i < IU_MAX_RX_URBS; i++) usb_kill_urb(self->rx_urb[i]); /* Cancel Tx and speed URB. * Make sure it's synchronous to avoid races. */ @@ -1865,9 +1586,8 @@ static void irda_usb_disconnect(struct usb_interface *intf) self->usbintf = NULL; /* Clean up our urbs */ - for (i = 0; i < self->max_rx_urb; i++) + for (i = 0; i < IU_MAX_RX_URBS; i++) usb_free_urb(self->rx_urb[i]); - kfree(self->rx_urb); /* Clean up Tx and speed URB */ usb_free_urb(self->tx_urb); usb_free_urb(self->speed_urb); @@ -1928,6 +1648,6 @@ module_exit(usb_irda_cleanup); */ module_param(qos_mtt_bits, int, 0); MODULE_PARM_DESC(qos_mtt_bits, "Minimum Turn Time"); -MODULE_AUTHOR("Roman Weissgaerber , Dag Brattli , Jean Tourrilhes and Nick Fedchik "); -MODULE_DESCRIPTION("IrDA-USB Dongle Driver"); +MODULE_AUTHOR("Roman Weissgaerber , Dag Brattli and Jean Tourrilhes "); +MODULE_DESCRIPTION("IrDA-USB Dongle Driver"); MODULE_LICENSE("GPL"); diff --git a/drivers/net/irda/irda-usb.h b/drivers/net/irda/irda-usb.h index 6b2271f18..4026af42d 100644 --- a/drivers/net/irda/irda-usb.h +++ b/drivers/net/irda/irda-usb.h @@ -1,7 +1,7 @@ /***************************************************************************** * * Filename: irda-usb.h - * Version: 0.10 + * Version: 0.9b * Description: IrDA-USB Driver * Status: Experimental * Author: Dag Brattli @@ -9,9 +9,6 @@ * Copyright (C) 2001, Roman Weissgaerber * Copyright (C) 2000, Dag Brattli * Copyright (C) 2001, Jean Tourrilhes - * Copyright (C) 2004, SigmaTel, Inc. - * Copyright (C) 2005, Milan Beno - * Copyright (C) 2006, Nick FEdchik * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -82,16 +79,15 @@ /* Inbound header */ #define MEDIA_BUSY 0x80 -#define SPEED_2400 0x01 -#define SPEED_9600 0x02 -#define SPEED_19200 0x03 -#define SPEED_38400 0x04 -#define SPEED_57600 0x05 -#define SPEED_115200 0x06 -#define SPEED_576000 0x07 -#define SPEED_1152000 0x08 -#define SPEED_4000000 0x09 -#define SPEED_16000000 0x0a +#define SPEED_2400 0x01 +#define SPEED_9600 0x02 +#define SPEED_19200 0x03 +#define SPEED_38400 0x04 +#define SPEED_57600 0x05 +#define SPEED_115200 0x06 +#define SPEED_576000 0x07 +#define SPEED_1152000 0x08 +#define SPEED_4000000 0x09 /* Basic capabilities */ #define IUC_DEFAULT 0x00 /* Basic device compliant with 1.0 spec */ @@ -104,15 +100,11 @@ #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_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_STIR421X_HEADER 0x03 -#define IU_SIGMATEL_MAX_RX_URBS (IU_MAX_ACTIVE_RX_URBS + \ - USB_IRDA_STIR421X_HEADER) +#define USB_IRDA_HEADER 0x01 +#define USB_CLASS_IRDA 0x02 /* USB_CLASS_APP_SPEC subclass */ +#define USB_DT_IRDA 0x21 struct irda_class_desc { __u8 bLength; @@ -131,7 +123,6 @@ struct irda_class_desc { * (6.2.5, USB-IrDA class spec 1.0) */ #define IU_REQ_GET_CLASS_DESC 0x06 -#define STIR421X_MAX_PATCH_DOWNLOAD_SIZE 1023 struct irda_usb_cb { struct irda_class_desc *irda_desc; @@ -145,8 +136,7 @@ struct irda_usb_cb { __u16 bulk_out_mtu; /* Max Tx packet size in bytes */ __u8 bulk_int_ep; /* Interrupt Endpoint assignments */ - __u8 max_rx_urb; - struct urb **rx_urb; /* URBs used to receive data frames */ + struct urb *rx_urb[IU_MAX_RX_URBS]; /* URBs used to receive data frames */ struct urb *idle_rx_urb; /* Pointer to idle URB in Rx path */ struct urb *tx_urb; /* URB used to send data frames */ struct urb *speed_urb; /* URB used to send speed commands */ @@ -167,9 +157,6 @@ struct irda_usb_cb { __u32 speed; /* Current speed */ __s32 new_speed; /* speed we need to set */ - __u8 header_length; /* USB-IrDA frame header size */ - int needspatch; /* device needs firmware patch */ - struct timer_list rx_defer_timer; /* Wait for Rx error to clear */ }; diff --git a/drivers/net/irda/irport.c b/drivers/net/irda/irport.c index 44efd49bf..6070195b8 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 acquired. + * This is ugly, and unsafe is the spinlock is not already aquired. * This will be fixed when irda-task get rewritten. * Jean II */ if (!spin_is_locked(&self->lock)) { @@ -1118,9 +1118,9 @@ static void __exit irport_cleanup(void) } } -module_param_array(io, int, NULL, 0); +MODULE_PARM(io, "1-4i"); MODULE_PARM_DESC(io, "Base I/O addresses"); -module_param_array(irq, int, NULL, 0); +MODULE_PARM(irq, "1-4i"); MODULE_PARM_DESC(irq, "IRQ lines"); MODULE_AUTHOR("Dag Brattli "); diff --git a/drivers/net/irda/irtty-sir.c b/drivers/net/irda/irtty-sir.c index 6a98b7ae4..101750bf2 100644 --- a/drivers/net/irda/irtty-sir.c +++ b/drivers/net/irda/irtty-sir.c @@ -33,7 +33,6 @@ #include #include #include -#include #include #include @@ -339,7 +338,7 @@ static inline void irtty_stop_receiver(struct tty_struct *tty, int stop) /*****************************************************************/ /* serialize ldisc open/close with sir_dev */ -static DEFINE_MUTEX(irtty_mutex); +static DECLARE_MUTEX(irtty_sem); /* notifier from sir_dev when irda% device gets opened (ifup) */ @@ -349,11 +348,11 @@ static int irtty_start_dev(struct sir_dev *dev) struct tty_struct *tty; /* serialize with ldisc open/close */ - mutex_lock(&irtty_mutex); + down(&irtty_sem); priv = dev->priv; if (unlikely(!priv || priv->magic!=IRTTY_MAGIC)) { - mutex_unlock(&irtty_mutex); + up(&irtty_sem); return -ESTALE; } @@ -364,7 +363,7 @@ static int irtty_start_dev(struct sir_dev *dev) /* Make sure we can receive more data */ irtty_stop_receiver(tty, FALSE); - mutex_unlock(&irtty_mutex); + up(&irtty_sem); return 0; } @@ -376,11 +375,11 @@ static int irtty_stop_dev(struct sir_dev *dev) struct tty_struct *tty; /* serialize with ldisc open/close */ - mutex_lock(&irtty_mutex); + down(&irtty_sem); priv = dev->priv; if (unlikely(!priv || priv->magic!=IRTTY_MAGIC)) { - mutex_unlock(&irtty_mutex); + up(&irtty_sem); return -ESTALE; } @@ -391,7 +390,7 @@ static int irtty_stop_dev(struct sir_dev *dev) if (tty->driver->stop) tty->driver->stop(tty); - mutex_unlock(&irtty_mutex); + up(&irtty_sem); return 0; } @@ -515,13 +514,13 @@ static int irtty_open(struct tty_struct *tty) priv->dev = dev; /* serialize with start_dev - in case we were racing with ifup */ - mutex_lock(&irtty_mutex); + down(&irtty_sem); dev->priv = priv; tty->disc_data = priv; tty->receive_room = 65536; - mutex_unlock(&irtty_mutex); + up(&irtty_sem); IRDA_DEBUG(0, "%s - %s: irda line discipline opened\n", __FUNCTION__, tty->name); diff --git a/drivers/net/irda/nsc-ircc.c b/drivers/net/irda/nsc-ircc.c index cb62f2a96..ee717d0e9 100644 --- a/drivers/net/irda/nsc-ircc.c +++ b/drivers/net/irda/nsc-ircc.c @@ -12,7 +12,6 @@ * Copyright (c) 1998-2000 Dag Brattli * Copyright (c) 1998 Lichen Wang, * Copyright (c) 1998 Actisys Corp., www.actisys.com - * Copyright (c) 2000-2004 Jean Tourrilhes * All Rights Reserved * * This program is free software; you can redistribute it and/or @@ -54,13 +53,14 @@ #include #include #include -#include -#include #include #include #include +#include +#include + #include #include #include @@ -72,27 +72,14 @@ static char *driver_name = "nsc-ircc"; -/* Power Management */ -#define NSC_IRCC_DRIVER_NAME "nsc-ircc" -static int nsc_ircc_suspend(struct platform_device *dev, pm_message_t state); -static int nsc_ircc_resume(struct platform_device *dev); - -static struct platform_driver nsc_ircc_driver = { - .suspend = nsc_ircc_suspend, - .resume = nsc_ircc_resume, - .driver = { - .name = NSC_IRCC_DRIVER_NAME, - }, -}; - /* Module parameters */ static int qos_mtt_bits = 0x07; /* 1 ms or more */ static int dongle_id; /* Use BIOS settions by default, but user may supply module parameters */ -static unsigned int io[] = { ~0, ~0, ~0, ~0, ~0 }; -static unsigned int irq[] = { 0, 0, 0, 0, 0 }; -static unsigned int dma[] = { 0, 0, 0, 0, 0 }; +static unsigned int io[] = { ~0, ~0, ~0, ~0 }; +static unsigned int irq[] = { 0, 0, 0, 0, 0 }; +static unsigned int dma[] = { 0, 0, 0, 0, 0 }; static int nsc_ircc_probe_108(nsc_chip_t *chip, chipio_t *info); static int nsc_ircc_probe_338(nsc_chip_t *chip, chipio_t *info); @@ -100,7 +87,6 @@ static int nsc_ircc_probe_39x(nsc_chip_t *chip, chipio_t *info); static int nsc_ircc_init_108(nsc_chip_t *chip, chipio_t *info); static int nsc_ircc_init_338(nsc_chip_t *chip, chipio_t *info); static int nsc_ircc_init_39x(nsc_chip_t *chip, chipio_t *info); -static int nsc_ircc_pnp_probe(struct pnp_dev *dev, const struct pnp_device_id *id); /* These are the known NSC chips */ static nsc_chip_t chips[] = { @@ -115,16 +101,11 @@ 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 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 } }; -static struct nsc_ircc_cb *dev_self[] = { NULL, NULL, NULL, NULL, NULL }; +/* Max 4 instances for now */ +static struct nsc_ircc_cb *dev_self[] = { NULL, NULL, NULL, NULL }; static char *dongle_types[] = { "Differential serial interface", @@ -145,24 +126,8 @@ static char *dongle_types[] = { "No dongle connected", }; -/* PNP probing */ -static chipio_t pnp_info; -static const struct pnp_device_id nsc_ircc_pnp_table[] = { - { .id = "NSC6001", .driver_data = 0 }, - { .id = "IBM0071", .driver_data = 0 }, - { } -}; - -MODULE_DEVICE_TABLE(pnp, nsc_ircc_pnp_table); - -static struct pnp_driver nsc_ircc_pnp_driver = { - .name = "nsc-ircc", - .id_table = nsc_ircc_pnp_table, - .probe = nsc_ircc_pnp_probe, -}; - /* Some prototypes */ -static int nsc_ircc_open(chipio_t *info); +static int nsc_ircc_open(int i, chipio_t *info); static int nsc_ircc_close(struct nsc_ircc_cb *self); static int nsc_ircc_setup(chipio_t *info); static void nsc_ircc_pio_receive(struct nsc_ircc_cb *self); @@ -181,10 +146,7 @@ static int nsc_ircc_net_open(struct net_device *dev); static int nsc_ircc_net_close(struct net_device *dev); static int nsc_ircc_net_ioctl(struct net_device *dev, struct ifreq *rq, int cmd); static struct net_device_stats *nsc_ircc_net_get_stats(struct net_device *dev); - -/* Globals */ -static int pnp_registered; -static int pnp_succeeded; +static int nsc_ircc_pmproc(struct pm_dev *dev, pm_request_t rqst, void *data); /* * Function nsc_ircc_init () @@ -196,36 +158,28 @@ static int __init nsc_ircc_init(void) { chipio_t info; nsc_chip_t *chip; - int ret; + int ret = -ENODEV; int cfg_base; int cfg, id; int reg; int i = 0; - ret = platform_driver_register(&nsc_ircc_driver); - if (ret) { - IRDA_ERROR("%s, Can't register driver!\n", driver_name); - return ret; - } - - /* Register with PnP subsystem to detect disable ports */ - ret = pnp_register_driver(&nsc_ircc_pnp_driver); - - if (!ret) - pnp_registered = 1; - - ret = -ENODEV; - /* Probe for all the NSC chipsets we know about */ - for (chip = chips; chip->name ; chip++) { + for (chip=chips; chip->name ; chip++) { IRDA_DEBUG(2, "%s(), Probing for %s ...\n", __FUNCTION__, chip->name); /* Try all config registers for this chip */ - for (cfg = 0; cfg < ARRAY_SIZE(chip->cfg); cfg++) { + for (cfg=0; cfg<3; cfg++) { cfg_base = chip->cfg[cfg]; if (!cfg_base) continue; + + memset(&info, 0, sizeof(chipio_t)); + info.cfg_base = cfg_base; + info.fir_base = io[i]; + info.dma = dma[i]; + info.irq = irq[i]; /* Read index register */ reg = inb(cfg_base); @@ -240,65 +194,24 @@ static int __init nsc_ircc_init(void) if ((id & chip->cid_mask) == chip->cid_value) { IRDA_DEBUG(2, "%s() Found %s chip, revision=%d\n", __FUNCTION__, chip->name, id & ~chip->cid_mask); + /* + * If the user supplies the base address, then + * we init the chip, if not we probe the values + * set by the BIOS + */ + if (io[i] < 0x2000) { + chip->init(chip, &info); + } else + chip->probe(chip, &info); - /* - * If we found a correct PnP setting, - * we first try it. - */ - if (pnp_succeeded) { - memset(&info, 0, sizeof(chipio_t)); - info.cfg_base = cfg_base; - info.fir_base = pnp_info.fir_base; - info.dma = pnp_info.dma; - info.irq = pnp_info.irq; - - if (info.fir_base < 0x2000) { - IRDA_MESSAGE("%s, chip->init\n", driver_name); - chip->init(chip, &info); - } else - chip->probe(chip, &info); - - if (nsc_ircc_open(&info) >= 0) - ret = 0; - } - - /* - * Opening based on PnP values failed. - * Let's fallback to user values, or probe - * the chip. - */ - if (ret) { - IRDA_DEBUG(2, "%s, PnP init failed\n", driver_name); - memset(&info, 0, sizeof(chipio_t)); - info.cfg_base = cfg_base; - info.fir_base = io[i]; - info.dma = dma[i]; - info.irq = irq[i]; - - /* - * If the user supplies the base address, then - * we init the chip, if not we probe the values - * set by the BIOS - */ - if (io[i] < 0x2000) { - chip->init(chip, &info); - } else - chip->probe(chip, &info); - - if (nsc_ircc_open(&info) >= 0) - ret = 0; - } + if (nsc_ircc_open(i, &info) == 0) + ret = 0; i++; } else { IRDA_DEBUG(2, "%s(), Wrong chip id=0x%02x\n", __FUNCTION__, id); } } - } - - if (ret) { - platform_driver_unregister(&nsc_ircc_driver); - pnp_unregister_driver(&nsc_ircc_pnp_driver); - pnp_registered = 0; + } return ret; @@ -314,17 +227,12 @@ static void __exit nsc_ircc_cleanup(void) { int i; - for (i = 0; i < ARRAY_SIZE(dev_self); i++) { + pm_unregister_all(nsc_ircc_pmproc); + + for (i=0; i < 4; i++) { if (dev_self[i]) nsc_ircc_close(dev_self[i]); } - - platform_driver_unregister(&nsc_ircc_driver); - - if (pnp_registered) - pnp_unregister_driver(&nsc_ircc_pnp_driver); - - pnp_registered = 0; } /* @@ -333,26 +241,16 @@ static void __exit nsc_ircc_cleanup(void) * Open driver instance * */ -static int __init nsc_ircc_open(chipio_t *info) +static int __init nsc_ircc_open(int i, chipio_t *info) { struct net_device *dev; struct nsc_ircc_cb *self; + struct pm_dev *pmdev; void *ret; - int err, chip_index; + int err; IRDA_DEBUG(2, "%s()\n", __FUNCTION__); - - for (chip_index = 0; chip_index < ARRAY_SIZE(dev_self); chip_index++) { - if (!dev_self[chip_index]) - break; - } - - if (chip_index == ARRAY_SIZE(dev_self)) { - IRDA_ERROR("%s(), maximum number of supported chips reached!\n", __FUNCTION__); - return -ENOMEM; - } - IRDA_MESSAGE("%s, Found chip at base=0x%03x\n", driver_name, info->cfg_base); @@ -373,8 +271,8 @@ static int __init nsc_ircc_open(chipio_t *info) spin_lock_init(&self->lock); /* Need to store self somewhere */ - dev_self[chip_index] = self; - self->index = chip_index; + dev_self[i] = self; + self->index = i; /* Initialize IO */ self->io.cfg_base = info->cfg_base; @@ -453,7 +351,7 @@ static int __init nsc_ircc_open(chipio_t *info) /* Check if user has supplied a valid dongle id or not */ if ((dongle_id <= 0) || - (dongle_id >= ARRAY_SIZE(dongle_types))) { + (dongle_id >= (sizeof(dongle_types) / sizeof(dongle_types[0]))) ) { dongle_id = nsc_ircc_read_dongle_id(self->io.fir_base); IRDA_MESSAGE("%s, Found dongle: %s\n", driver_name, @@ -466,18 +364,11 @@ static int __init nsc_ircc_open(chipio_t *info) self->io.dongle_id = dongle_id; nsc_ircc_init_dongle_interface(self->io.fir_base, dongle_id); - self->pldev = platform_device_register_simple(NSC_IRCC_DRIVER_NAME, - self->index, NULL, 0); - if (IS_ERR(self->pldev)) { - err = PTR_ERR(self->pldev); - goto out5; - } - platform_set_drvdata(self->pldev, self); - - return chip_index; + pmdev = pm_register(PM_SYS_DEV, PM_SYS_IRDA, nsc_ircc_pmproc); + if (pmdev) + pmdev->data = self; - out5: - unregister_netdev(dev); + return 0; out4: dma_free_coherent(NULL, self->tx_buff.truesize, self->tx_buff.head, self->tx_buff_dma); @@ -488,7 +379,7 @@ static int __init nsc_ircc_open(chipio_t *info) release_region(self->io.fir_base, self->io.fir_ext); out1: free_netdev(dev); - dev_self[chip_index] = NULL; + dev_self[i] = NULL; return err; } @@ -508,8 +399,6 @@ static int __exit nsc_ircc_close(struct nsc_ircc_cb *self) iobase = self->io.fir_base; - platform_device_unregister(self->pldev); - /* Remove netdevice */ unregister_netdev(self->netdev); @@ -816,7 +705,7 @@ static int nsc_ircc_init_39x(nsc_chip_t *chip, chipio_t *info) int cfg_base = info->cfg_base; int enabled; - /* User is sure about his config... accept it. */ + /* User is shure about his config... accept it. */ IRDA_DEBUG(2, "%s(): nsc_ircc_init_39x (user settings): " "io=0x%04x, irq=%d, dma=%d\n", __FUNCTION__, info->fir_base, info->irq, info->dma); @@ -917,43 +806,6 @@ static int nsc_ircc_probe_39x(nsc_chip_t *chip, chipio_t *info) return 0; } -/* PNP probing */ -static int nsc_ircc_pnp_probe(struct pnp_dev *dev, const struct pnp_device_id *id) -{ - memset(&pnp_info, 0, sizeof(chipio_t)); - pnp_info.irq = -1; - pnp_info.dma = -1; - pnp_succeeded = 1; - - /* There don't seem to be any way to get the cfg_base. - * On my box, cfg_base is in the PnP descriptor of the - * motherboard. Oh well... Jean II */ - - if (pnp_port_valid(dev, 0) && - !(pnp_port_flags(dev, 0) & IORESOURCE_DISABLED)) - pnp_info.fir_base = pnp_port_start(dev, 0); - - if (pnp_irq_valid(dev, 0) && - !(pnp_irq_flags(dev, 0) & IORESOURCE_DISABLED)) - pnp_info.irq = pnp_irq(dev, 0); - - if (pnp_dma_valid(dev, 0) && - !(pnp_dma_flags(dev, 0) & IORESOURCE_DISABLED)) - pnp_info.dma = pnp_dma(dev, 0); - - IRDA_DEBUG(0, "%s() : From PnP, found firbase 0x%03X ; irq %d ; dma %d.\n", - __FUNCTION__, pnp_info.fir_base, pnp_info.irq, pnp_info.dma); - - if((pnp_info.fir_base == 0) || - (pnp_info.irq == -1) || (pnp_info.dma == -1)) { - /* Returning an error will disable the device. Yuck ! */ - //return -EINVAL; - pnp_succeeded = 0; - } - - return 0; -} - /* * Function nsc_ircc_setup (info) * @@ -2309,83 +2161,45 @@ static struct net_device_stats *nsc_ircc_net_get_stats(struct net_device *dev) return &self->stats; } -static int nsc_ircc_suspend(struct platform_device *dev, pm_message_t state) +static void nsc_ircc_suspend(struct nsc_ircc_cb *self) { - struct nsc_ircc_cb *self = platform_get_drvdata(dev); - int bank; - unsigned long flags; - int iobase = self->io.fir_base; + IRDA_MESSAGE("%s, Suspending\n", driver_name); if (self->io.suspended) - return 0; - - IRDA_DEBUG(1, "%s, Suspending\n", driver_name); - - rtnl_lock(); - if (netif_running(self->netdev)) { - netif_device_detach(self->netdev); - spin_lock_irqsave(&self->lock, flags); - /* Save current bank */ - bank = inb(iobase+BSR); + return; - /* Disable interrupts */ - switch_bank(iobase, BANK0); - outb(0, iobase+IER); - - /* Restore bank register */ - outb(bank, iobase+BSR); + nsc_ircc_net_close(self->netdev); - spin_unlock_irqrestore(&self->lock, flags); - free_irq(self->io.irq, self->netdev); - disable_dma(self->io.dma); - } self->io.suspended = 1; - rtnl_unlock(); - - return 0; } -static int nsc_ircc_resume(struct platform_device *dev) +static void nsc_ircc_wakeup(struct nsc_ircc_cb *self) { - struct nsc_ircc_cb *self = platform_get_drvdata(dev); - unsigned long flags; - if (!self->io.suspended) - return 0; + return; - IRDA_DEBUG(1, "%s, Waking up\n", driver_name); - - rtnl_lock(); nsc_ircc_setup(&self->io); - nsc_ircc_init_dongle_interface(self->io.fir_base, self->io.dongle_id); - - if (netif_running(self->netdev)) { - if (request_irq(self->io.irq, nsc_ircc_interrupt, 0, - self->netdev->name, self->netdev)) { - IRDA_WARNING("%s, unable to allocate irq=%d\n", - driver_name, self->io.irq); - - /* - * Don't fail resume process, just kill this - * network interface - */ - unregister_netdevice(self->netdev); - } else { - spin_lock_irqsave(&self->lock, flags); - nsc_ircc_change_speed(self, self->io.speed); - spin_unlock_irqrestore(&self->lock, flags); - netif_device_attach(self->netdev); - } + nsc_ircc_net_open(self->netdev); + + IRDA_MESSAGE("%s, Waking up\n", driver_name); - } else { - spin_lock_irqsave(&self->lock, flags); - nsc_ircc_change_speed(self, 9600); - spin_unlock_irqrestore(&self->lock, flags); - } self->io.suspended = 0; - rtnl_unlock(); +} - return 0; +static int nsc_ircc_pmproc(struct pm_dev *dev, pm_request_t rqst, void *data) +{ + struct nsc_ircc_cb *self = (struct nsc_ircc_cb*) dev->data; + if (self) { + switch (rqst) { + case PM_SUSPEND: + nsc_ircc_suspend(self); + break; + case PM_RESUME: + nsc_ircc_wakeup(self); + break; + } + } + return 0; } MODULE_AUTHOR("Dag Brattli "); diff --git a/drivers/net/irda/nsc-ircc.h b/drivers/net/irda/nsc-ircc.h index dacf671ab..6edf7e514 100644 --- a/drivers/net/irda/nsc-ircc.h +++ b/drivers/net/irda/nsc-ircc.h @@ -269,7 +269,7 @@ struct nsc_ircc_cb { __u32 new_speed; int index; /* Instance index */ - struct platform_device *pldev; + struct pm_dev *dev; }; static inline void switch_bank(int iobase, int bank) diff --git a/drivers/net/irda/pxaficp_ir.c b/drivers/net/irda/pxaficp_ir.c index afb19e8d9..e1aa99105 100644 --- a/drivers/net/irda/pxaficp_ir.c +++ b/drivers/net/irda/pxaficp_ir.c @@ -12,6 +12,7 @@ * 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 8d5a288d7..63d38fbbd 100644 --- a/drivers/net/irda/sa1100_ir.c +++ b/drivers/net/irda/sa1100_ir.c @@ -18,6 +18,7 @@ * power_leve:level - set the transmitter power level * tx_lpm:0|1 - set transmit low power mode */ +#include #include #include #include @@ -694,7 +695,8 @@ static int sa1100_irda_hard_xmit(struct sk_buff *skb, struct net_device *dev) /* * We must not be transmitting... */ - BUG_ON(si->txskb); + if (si->txskb) + BUG(); netif_stop_queue(dev); diff --git a/drivers/net/irda/sir-dev.h b/drivers/net/irda/sir-dev.h index 9fa294a54..f69fb4cec 100644 --- a/drivers/net/irda/sir-dev.h +++ b/drivers/net/irda/sir-dev.h @@ -15,14 +15,23 @@ #define IRDA_SIR_H #include -#include #include #include // iobuff_t +/* FIXME: unify irda_request with sir_fsm! */ + +struct irda_request { + struct list_head lh_request; + unsigned long pending; + void (*func)(void *); + void *data; + struct timer_list timer; +}; + struct sir_fsm { struct semaphore sem; - struct work_struct work; + struct irda_request rq; unsigned state, substate; int param; int result; diff --git a/drivers/net/irda/sir_dev.c b/drivers/net/irda/sir_dev.c index 3b5854d10..ea7c9464d 100644 --- a/drivers/net/irda/sir_dev.c +++ b/drivers/net/irda/sir_dev.c @@ -23,298 +23,6 @@ #include "sir-dev.h" - -static struct workqueue_struct *irda_sir_wq; - -/* STATE MACHINE */ - -/* substate handler of the config-fsm to handle the cases where we want - * to wait for transmit completion before changing the port configuration - */ - -static int sirdev_tx_complete_fsm(struct sir_dev *dev) -{ - struct sir_fsm *fsm = &dev->fsm; - unsigned next_state, delay; - unsigned bytes_left; - - do { - next_state = fsm->substate; /* default: stay in current substate */ - delay = 0; - - switch(fsm->substate) { - - case SIRDEV_STATE_WAIT_XMIT: - if (dev->drv->chars_in_buffer) - bytes_left = dev->drv->chars_in_buffer(dev); - else - bytes_left = 0; - if (!bytes_left) { - next_state = SIRDEV_STATE_WAIT_UNTIL_SENT; - break; - } - - if (dev->speed > 115200) - delay = (bytes_left*8*10000) / (dev->speed/100); - else if (dev->speed > 0) - delay = (bytes_left*10*10000) / (dev->speed/100); - else - delay = 0; - /* expected delay (usec) until remaining bytes are sent */ - if (delay < 100) { - udelay(delay); - delay = 0; - break; - } - /* sleep some longer delay (msec) */ - delay = (delay+999) / 1000; - break; - - case SIRDEV_STATE_WAIT_UNTIL_SENT: - /* block until underlaying hardware buffer are empty */ - if (dev->drv->wait_until_sent) - dev->drv->wait_until_sent(dev); - next_state = SIRDEV_STATE_TX_DONE; - break; - - case SIRDEV_STATE_TX_DONE: - return 0; - - default: - IRDA_ERROR("%s - undefined state\n", __FUNCTION__); - return -EINVAL; - } - fsm->substate = next_state; - } while (delay == 0); - return delay; -} - -/* - * Function sirdev_config_fsm - * - * State machine to handle the configuration of the device (and attached dongle, if any). - * This handler is scheduled for execution in kIrDAd context, so we can sleep. - * however, kIrDAd is shared by all sir_dev devices so we better don't sleep there too - * long. Instead, for longer delays we start a timer to reschedule us later. - * On entry, fsm->sem is always locked and the netdev xmit queue stopped. - * Both must be unlocked/restarted on completion - but only on final exit. - */ - -static void sirdev_config_fsm(void *data) -{ - struct sir_dev *dev = data; - struct sir_fsm *fsm = &dev->fsm; - int next_state; - int ret = -1; - unsigned delay; - - IRDA_DEBUG(2, "%s(), <%ld>\n", __FUNCTION__, jiffies); - - do { - IRDA_DEBUG(3, "%s - state=0x%04x / substate=0x%04x\n", - __FUNCTION__, fsm->state, fsm->substate); - - next_state = fsm->state; - delay = 0; - - switch(fsm->state) { - - case SIRDEV_STATE_DONGLE_OPEN: - if (dev->dongle_drv != NULL) { - ret = sirdev_put_dongle(dev); - if (ret) { - fsm->result = -EINVAL; - next_state = SIRDEV_STATE_ERROR; - break; - } - } - - /* Initialize dongle */ - ret = sirdev_get_dongle(dev, fsm->param); - if (ret) { - fsm->result = ret; - next_state = SIRDEV_STATE_ERROR; - break; - } - - /* Dongles are powered through the modem control lines which - * were just set during open. Before resetting, let's wait for - * the power to stabilize. This is what some dongle drivers did - * in open before, while others didn't - should be safe anyway. - */ - - delay = 50; - fsm->substate = SIRDEV_STATE_DONGLE_RESET; - next_state = SIRDEV_STATE_DONGLE_RESET; - - fsm->param = 9600; - - break; - - case SIRDEV_STATE_DONGLE_CLOSE: - /* shouldn't we just treat this as success=? */ - if (dev->dongle_drv == NULL) { - fsm->result = -EINVAL; - next_state = SIRDEV_STATE_ERROR; - break; - } - - ret = sirdev_put_dongle(dev); - if (ret) { - fsm->result = ret; - next_state = SIRDEV_STATE_ERROR; - break; - } - next_state = SIRDEV_STATE_DONE; - break; - - case SIRDEV_STATE_SET_DTR_RTS: - ret = sirdev_set_dtr_rts(dev, - (fsm->param&0x02) ? TRUE : FALSE, - (fsm->param&0x01) ? TRUE : FALSE); - next_state = SIRDEV_STATE_DONE; - break; - - case SIRDEV_STATE_SET_SPEED: - fsm->substate = SIRDEV_STATE_WAIT_XMIT; - next_state = SIRDEV_STATE_DONGLE_CHECK; - break; - - case SIRDEV_STATE_DONGLE_CHECK: - ret = sirdev_tx_complete_fsm(dev); - if (ret < 0) { - fsm->result = ret; - next_state = SIRDEV_STATE_ERROR; - break; - } - if ((delay=ret) != 0) - break; - - if (dev->dongle_drv) { - fsm->substate = SIRDEV_STATE_DONGLE_RESET; - next_state = SIRDEV_STATE_DONGLE_RESET; - } - else { - dev->speed = fsm->param; - next_state = SIRDEV_STATE_PORT_SPEED; - } - break; - - case SIRDEV_STATE_DONGLE_RESET: - if (dev->dongle_drv->reset) { - ret = dev->dongle_drv->reset(dev); - if (ret < 0) { - fsm->result = ret; - next_state = SIRDEV_STATE_ERROR; - break; - } - } - else - ret = 0; - if ((delay=ret) == 0) { - /* set serial port according to dongle default speed */ - if (dev->drv->set_speed) - dev->drv->set_speed(dev, dev->speed); - fsm->substate = SIRDEV_STATE_DONGLE_SPEED; - next_state = SIRDEV_STATE_DONGLE_SPEED; - } - break; - - case SIRDEV_STATE_DONGLE_SPEED: - if (dev->dongle_drv->reset) { - ret = dev->dongle_drv->set_speed(dev, fsm->param); - if (ret < 0) { - fsm->result = ret; - next_state = SIRDEV_STATE_ERROR; - break; - } - } - else - ret = 0; - if ((delay=ret) == 0) - next_state = SIRDEV_STATE_PORT_SPEED; - break; - - case SIRDEV_STATE_PORT_SPEED: - /* Finally we are ready to change the serial port speed */ - if (dev->drv->set_speed) - dev->drv->set_speed(dev, dev->speed); - dev->new_speed = 0; - next_state = SIRDEV_STATE_DONE; - break; - - case SIRDEV_STATE_DONE: - /* Signal network layer so it can send more frames */ - netif_wake_queue(dev->netdev); - next_state = SIRDEV_STATE_COMPLETE; - break; - - default: - IRDA_ERROR("%s - undefined state\n", __FUNCTION__); - fsm->result = -EINVAL; - /* fall thru */ - - case SIRDEV_STATE_ERROR: - IRDA_ERROR("%s - error: %d\n", __FUNCTION__, fsm->result); - -#if 0 /* don't enable this before we have netdev->tx_timeout to recover */ - netif_stop_queue(dev->netdev); -#else - netif_wake_queue(dev->netdev); -#endif - /* fall thru */ - - case SIRDEV_STATE_COMPLETE: - /* config change finished, so we are not busy any longer */ - sirdev_enable_rx(dev); - up(&fsm->sem); - return; - } - fsm->state = next_state; - } while(!delay); - - queue_delayed_work(irda_sir_wq, &fsm->work, msecs_to_jiffies(delay)); -} - -/* schedule some device configuration task for execution by kIrDAd - * on behalf of the above state machine. - * can be called from process or interrupt/tasklet context. - */ - -int sirdev_schedule_request(struct sir_dev *dev, int initial_state, unsigned param) -{ - struct sir_fsm *fsm = &dev->fsm; - - IRDA_DEBUG(2, "%s - state=0x%04x / param=%u\n", __FUNCTION__, initial_state, param); - - if (down_trylock(&fsm->sem)) { - if (in_interrupt() || in_atomic() || irqs_disabled()) { - IRDA_DEBUG(1, "%s(), state machine busy!\n", __FUNCTION__); - return -EWOULDBLOCK; - } else - down(&fsm->sem); - } - - if (fsm->state == SIRDEV_STATE_DEAD) { - /* race with sirdev_close should never happen */ - IRDA_ERROR("%s(), instance staled!\n", __FUNCTION__); - up(&fsm->sem); - return -ESTALE; /* or better EPIPE? */ - } - - netif_stop_queue(dev->netdev); - atomic_set(&dev->enable_rx, 0); - - fsm->state = initial_state; - fsm->param = param; - fsm->result = 0; - - INIT_WORK(&fsm->work, sirdev_config_fsm, dev); - queue_work(irda_sir_wq, &fsm->work); - return 0; -} - - /***************************************************************************/ void sirdev_enable_rx(struct sir_dev *dev) @@ -911,6 +619,10 @@ struct sir_dev * sirdev_get_instance(const struct sir_driver *drv, const char *n spin_lock_init(&dev->tx_lock); init_MUTEX(&dev->fsm.sem); + INIT_LIST_HEAD(&dev->fsm.rq.lh_request); + dev->fsm.rq.pending = 0; + init_timer(&dev->fsm.rq.timer); + dev->drv = drv; dev->netdev = ndev; @@ -970,22 +682,3 @@ int sirdev_put_instance(struct sir_dev *dev) } EXPORT_SYMBOL(sirdev_put_instance); -static int __init sir_wq_init(void) -{ - irda_sir_wq = create_singlethread_workqueue("irda_sir_wq"); - if (!irda_sir_wq) - return -ENOMEM; - return 0; -} - -static void __exit sir_wq_exit(void) -{ - destroy_workqueue(irda_sir_wq); -} - -module_init(sir_wq_init); -module_exit(sir_wq_exit); - -MODULE_AUTHOR("Martin Diehl "); -MODULE_DESCRIPTION("IrDA SIR core"); -MODULE_LICENSE("GPL"); diff --git a/drivers/net/irda/sir_dongle.c b/drivers/net/irda/sir_dongle.c index d7e32d955..8d225921a 100644 --- a/drivers/net/irda/sir_dongle.c +++ b/drivers/net/irda/sir_dongle.c @@ -16,7 +16,6 @@ #include #include #include -#include #include @@ -29,7 +28,7 @@ */ static LIST_HEAD(dongle_list); /* list of registered dongle drivers */ -static DEFINE_MUTEX(dongle_list_lock); /* protects the list */ +static DECLARE_MUTEX(dongle_list_lock); /* protects the list */ int irda_register_dongle(struct dongle_driver *new) { @@ -39,25 +38,25 @@ int irda_register_dongle(struct dongle_driver *new) IRDA_DEBUG(0, "%s : registering dongle \"%s\" (%d).\n", __FUNCTION__, new->driver_name, new->type); - mutex_lock(&dongle_list_lock); + down(&dongle_list_lock); list_for_each(entry, &dongle_list) { drv = list_entry(entry, struct dongle_driver, dongle_list); if (new->type == drv->type) { - mutex_unlock(&dongle_list_lock); + up(&dongle_list_lock); return -EEXIST; } } list_add(&new->dongle_list, &dongle_list); - mutex_unlock(&dongle_list_lock); + up(&dongle_list_lock); return 0; } EXPORT_SYMBOL(irda_register_dongle); int irda_unregister_dongle(struct dongle_driver *drv) { - mutex_lock(&dongle_list_lock); + down(&dongle_list_lock); list_del(&drv->dongle_list); - mutex_unlock(&dongle_list_lock); + up(&dongle_list_lock); return 0; } EXPORT_SYMBOL(irda_unregister_dongle); @@ -76,7 +75,7 @@ int sirdev_get_dongle(struct sir_dev *dev, IRDA_DONGLE type) return -EBUSY; /* serialize access to the list of registered dongles */ - mutex_lock(&dongle_list_lock); + down(&dongle_list_lock); list_for_each(entry, &dongle_list) { drv = list_entry(entry, struct dongle_driver, dongle_list); @@ -110,14 +109,14 @@ int sirdev_get_dongle(struct sir_dev *dev, IRDA_DONGLE type) if (!drv->open || (err=drv->open(dev))!=0) goto out_reject; /* failed to open driver */ - mutex_unlock(&dongle_list_lock); + up(&dongle_list_lock); return 0; out_reject: dev->dongle_drv = NULL; module_put(drv->owner); out_unlock: - mutex_unlock(&dongle_list_lock); + up(&dongle_list_lock); return err; } diff --git a/drivers/net/irda/sir_kthread.c b/drivers/net/irda/sir_kthread.c index 18cea1099..e3904d6bf 100644 --- a/drivers/net/irda/sir_kthread.c +++ b/drivers/net/irda/sir_kthread.c @@ -135,8 +135,7 @@ static int irda_thread(void *startup) remove_wait_queue(&irda_rq_queue.kick, &wait); /* make swsusp happy with our thread */ - if (current->flags & PF_FREEZE) - refrigerator(PF_FREEZE); + try_to_freeze(); run_irda_queue(); } @@ -467,7 +466,7 @@ int sirdev_schedule_request(struct sir_dev *dev, int initial_state, unsigned par return 0; } -int __init irda_thread_create(void) +static int __init irda_thread_create(void) { struct completion startup; int pid; @@ -489,7 +488,7 @@ int __init irda_thread_create(void) return 0; } -void __exit irda_thread_join(void) +static void __exit irda_thread_join(void) { if (irda_rq_queue.thread) { flush_irda_queue(); @@ -500,3 +499,10 @@ void __exit irda_thread_join(void) } } +module_init(irda_thread_create); +module_exit(irda_thread_join); + +MODULE_AUTHOR("Martin Diehl "); +MODULE_DESCRIPTION("IrDA SIR core"); +MODULE_LICENSE("GPL"); + diff --git a/drivers/net/irda/smsc-ircc2.c b/drivers/net/irda/smsc-ircc2.c index 2eff45bed..ec94ecdb1 100644 --- a/drivers/net/irda/smsc-ircc2.c +++ b/drivers/net/irda/smsc-ircc2.c @@ -11,7 +11,6 @@ * Copyright (c) 2002 Daniele Peri * All Rights Reserved. * Copyright (c) 2002 Jean Tourrilhes - * Copyright (c) 2006 Linus Walleij * * * Based on smc-ircc.c: @@ -54,7 +53,6 @@ #include #include #include -#include #include #include @@ -63,9 +61,6 @@ #include #include -#ifdef CONFIG_PCI -#include -#endif #include #include @@ -105,22 +100,6 @@ MODULE_PARM_DESC(ircc_transceiver, "Transceiver type"); /* Types */ -#ifdef CONFIG_PCI -struct smsc_ircc_subsystem_configuration { - unsigned short vendor; /* PCI vendor ID */ - unsigned short device; /* PCI vendor ID */ - unsigned short subvendor; /* PCI subsystem vendor ID */ - unsigned short subdevice; /* PCI sybsystem device ID */ - unsigned short sir_io; /* I/O port for SIR */ - unsigned short fir_io; /* I/O port for FIR */ - unsigned char fir_irq; /* FIR IRQ */ - unsigned char fir_dma; /* FIR DMA */ - unsigned short cfg_base; /* I/O port for chip configuration */ - int (*preconfigure)(struct pci_dev *dev, struct smsc_ircc_subsystem_configuration *conf); /* Preconfig function */ - const char *name; /* name shown as info */ -}; -#endif - struct smsc_transceiver { char *name; void (*set_for_speed)(int fir_base, u32 speed); @@ -223,18 +202,6 @@ static int __init smsc_superio_flat(const struct smsc_chip *chips, unsigned shor static int __init smsc_superio_paged(const struct smsc_chip *chips, unsigned short cfg_base, char *type); static int __init smsc_superio_fdc(unsigned short cfg_base); static int __init smsc_superio_lpc(unsigned short cfg_base); -#ifdef CONFIG_PCI -static int __init preconfigure_smsc_chip(struct smsc_ircc_subsystem_configuration *conf); -static int __init preconfigure_through_82801(struct pci_dev *dev, struct smsc_ircc_subsystem_configuration *conf); -static void __init preconfigure_ali_port(struct pci_dev *dev, - unsigned short port); -static int __init preconfigure_through_ali(struct pci_dev *dev, struct smsc_ircc_subsystem_configuration *conf); -static int __init smsc_ircc_preconfigure_subsystems(unsigned short ircc_cfg, - unsigned short ircc_fir, - unsigned short ircc_sir, - unsigned char ircc_dma, - unsigned char ircc_irq); -#endif /* Transceivers specific functions */ @@ -359,16 +326,6 @@ static inline void register_bank(int iobase, int bank) iobase + IRCC_MASTER); } -#ifdef CONFIG_PNP -/* PNP hotplug support */ -static const struct pnp_device_id smsc_ircc_pnp_table[] = { - { .id = "SMCf010", .driver_data = 0 }, - /* and presumably others */ - { } -}; -MODULE_DEVICE_TABLE(pnp, smsc_ircc_pnp_table); -#endif - /******************************************************************************* * @@ -396,13 +353,6 @@ static int __init smsc_ircc_init(void) return ret; } -#ifdef CONFIG_PCI - if (smsc_ircc_preconfigure_subsystems(ircc_cfg, ircc_fir, ircc_sir, ircc_dma, ircc_irq) < 0) { - /* Ignore errors from preconfiguration */ - IRDA_ERROR("%s, Preconfiguration failed !\n", driver_name); - } -#endif - dev_count = 0; if (ircc_fir > 0 && ircc_sir > 0) { @@ -2083,8 +2033,7 @@ static void smsc_ircc_sir_wait_hw_transmitter_finish(struct smsc_ircc_cb *self) /* PROBING * - * REVISIT we can be told about the device by PNP, and should use that info - * instead of probing hardware and creating a platform_device ... + * */ static int __init smsc_ircc_look_for_chips(void) @@ -2336,490 +2285,6 @@ static int __init smsc_superio_lpc(unsigned short cfg_base) return ret; } -/* - * Look for some specific subsystem setups that need - * pre-configuration not properly done by the BIOS (especially laptops) - * This code is based in part on smcinit.c, tosh1800-smcinit.c - * and tosh2450-smcinit.c. The table lists the device entries - * for ISA bridges with an LPC (Low Pin Count) controller which - * handles the communication with the SMSC device. After the LPC - * controller is initialized through PCI, the SMSC device is initialized - * through a dedicated port in the ISA port-mapped I/O area, this latter - * area is used to configure the SMSC device with default - * SIR and FIR I/O ports, DMA and IRQ. Different vendors have - * used different sets of parameters and different control port - * addresses making a subsystem device table necessary. - */ -#ifdef CONFIG_PCI -#define PCIID_VENDOR_INTEL 0x8086 -#define PCIID_VENDOR_ALI 0x10b9 -static struct smsc_ircc_subsystem_configuration subsystem_configurations[] __initdata = { - { - .vendor = PCIID_VENDOR_INTEL, /* Intel 82801DBM LPC bridge */ - .device = 0x24cc, - .subvendor = 0x103c, - .subdevice = 0x088c, - /* Quite certain these are the same for nc8000 as for nc6000 */ - .sir_io = 0x02f8, - .fir_io = 0x0130, - .fir_irq = 0x05, - .fir_dma = 0x03, - .cfg_base = 0x004e, - .preconfigure = preconfigure_through_82801, - .name = "HP nc8000", - }, - { - .vendor = PCIID_VENDOR_INTEL, /* Intel 82801DBM LPC bridge */ - .device = 0x24cc, - .subvendor = 0x103c, - .subdevice = 0x0890, - .sir_io = 0x02f8, - .fir_io = 0x0130, - .fir_irq = 0x05, - .fir_dma = 0x03, - .cfg_base = 0x004e, - .preconfigure = preconfigure_through_82801, - .name = "HP nc6000", - }, - { - /* Intel 82801DB/DBL (ICH4/ICH4-L) LPC Interface Bridge */ - .vendor = PCIID_VENDOR_INTEL, - .device = 0x24c0, - .subvendor = 0x1179, - .subdevice = 0xffff, /* 0xffff is "any" */ - .sir_io = 0x03f8, - .fir_io = 0x0130, - .fir_irq = 0x07, - .fir_dma = 0x01, - .cfg_base = 0x002e, - .preconfigure = preconfigure_through_82801, - .name = "Toshiba laptop with Intel 82801DB/DBL LPC bridge", - }, - { - .vendor = PCIID_VENDOR_INTEL, /* Intel 82801CAM ISA bridge */ - .device = 0x248c, - .subvendor = 0x1179, - .subdevice = 0xffff, /* 0xffff is "any" */ - .sir_io = 0x03f8, - .fir_io = 0x0130, - .fir_irq = 0x03, - .fir_dma = 0x03, - .cfg_base = 0x002e, - .preconfigure = preconfigure_through_82801, - .name = "Toshiba laptop with Intel 82801CAM ISA bridge", - }, - { - /* 82801DBM (ICH4-M) LPC Interface Bridge */ - .vendor = PCIID_VENDOR_INTEL, - .device = 0x24cc, - .subvendor = 0x1179, - .subdevice = 0xffff, /* 0xffff is "any" */ - .sir_io = 0x03f8, - .fir_io = 0x0130, - .fir_irq = 0x03, - .fir_dma = 0x03, - .cfg_base = 0x002e, - .preconfigure = preconfigure_through_82801, - .name = "Toshiba laptop with Intel 8281DBM LPC bridge", - }, - { - /* ALi M1533/M1535 PCI to ISA Bridge [Aladdin IV/V/V+] */ - .vendor = PCIID_VENDOR_ALI, - .device = 0x1533, - .subvendor = 0x1179, - .subdevice = 0xffff, /* 0xffff is "any" */ - .sir_io = 0x02e8, - .fir_io = 0x02f8, - .fir_irq = 0x07, - .fir_dma = 0x03, - .cfg_base = 0x002e, - .preconfigure = preconfigure_through_ali, - .name = "Toshiba laptop with ALi ISA bridge", - }, - { } // Terminator -}; - - -/* - * This sets up the basic SMSC parameters - * (FIR port, SIR port, FIR DMA, FIR IRQ) - * through the chip configuration port. - */ -static int __init preconfigure_smsc_chip(struct - smsc_ircc_subsystem_configuration - *conf) -{ - unsigned short iobase = conf->cfg_base; - unsigned char tmpbyte; - - outb(LPC47N227_CFGACCESSKEY, iobase); // enter configuration state - outb(SMSCSIOFLAT_DEVICEID_REG, iobase); // set for device ID - tmpbyte = inb(iobase +1); // Read device ID - IRDA_DEBUG(0, - "Detected Chip id: 0x%02x, setting up registers...\n", - tmpbyte); - - /* Disable UART1 and set up SIR I/O port */ - outb(0x24, iobase); // select CR24 - UART1 base addr - outb(0x00, iobase + 1); // disable UART1 - outb(SMSCSIOFLAT_UART2BASEADDR_REG, iobase); // select CR25 - UART2 base addr - outb( (conf->sir_io >> 2), iobase + 1); // bits 2-9 of 0x3f8 - tmpbyte = inb(iobase + 1); - if (tmpbyte != (conf->sir_io >> 2) ) { - IRDA_WARNING("ERROR: could not configure SIR ioport.\n"); - IRDA_WARNING("Try to supply ircc_cfg argument.\n"); - return -ENXIO; - } - - /* Set up FIR IRQ channel for UART2 */ - outb(SMSCSIOFLAT_UARTIRQSELECT_REG, iobase); // select CR28 - UART1,2 IRQ select - tmpbyte = inb(iobase + 1); - tmpbyte &= SMSCSIOFLAT_UART1IRQSELECT_MASK; // Do not touch the UART1 portion - tmpbyte |= (conf->fir_irq & SMSCSIOFLAT_UART2IRQSELECT_MASK); - outb(tmpbyte, iobase + 1); - tmpbyte = inb(iobase + 1) & SMSCSIOFLAT_UART2IRQSELECT_MASK; - if (tmpbyte != conf->fir_irq) { - IRDA_WARNING("ERROR: could not configure FIR IRQ channel.\n"); - return -ENXIO; - } - - /* Set up FIR I/O port */ - outb(SMSCSIOFLAT_FIRBASEADDR_REG, iobase); // CR2B - SCE (FIR) base addr - outb((conf->fir_io >> 3), iobase + 1); - tmpbyte = inb(iobase + 1); - if (tmpbyte != (conf->fir_io >> 3) ) { - IRDA_WARNING("ERROR: could not configure FIR I/O port.\n"); - return -ENXIO; - } - - /* Set up FIR DMA channel */ - outb(SMSCSIOFLAT_FIRDMASELECT_REG, iobase); // CR2C - SCE (FIR) DMA select - outb((conf->fir_dma & LPC47N227_FIRDMASELECT_MASK), iobase + 1); // DMA - tmpbyte = inb(iobase + 1) & LPC47N227_FIRDMASELECT_MASK; - if (tmpbyte != (conf->fir_dma & LPC47N227_FIRDMASELECT_MASK)) { - IRDA_WARNING("ERROR: could not configure FIR DMA channel.\n"); - return -ENXIO; - } - - outb(SMSCSIOFLAT_UARTMODE0C_REG, iobase); // CR0C - UART mode - tmpbyte = inb(iobase + 1); - tmpbyte &= ~SMSCSIOFLAT_UART2MODE_MASK | - SMSCSIOFLAT_UART2MODE_VAL_IRDA; - outb(tmpbyte, iobase + 1); // enable IrDA (HPSIR) mode, high speed - - outb(LPC47N227_APMBOOTDRIVE_REG, iobase); // CR07 - Auto Pwr Mgt/boot drive sel - tmpbyte = inb(iobase + 1); - outb(tmpbyte | LPC47N227_UART2AUTOPWRDOWN_MASK, iobase + 1); // enable UART2 autopower down - - /* This one was not part of tosh1800 */ - outb(0x0a, iobase); // CR0a - ecp fifo / ir mux - tmpbyte = inb(iobase + 1); - outb(tmpbyte | 0x40, iobase + 1); // send active device to ir port - - outb(LPC47N227_UART12POWER_REG, iobase); // CR02 - UART 1,2 power - tmpbyte = inb(iobase + 1); - outb(tmpbyte | LPC47N227_UART2POWERDOWN_MASK, iobase + 1); // UART2 power up mode, UART1 power down - - outb(LPC47N227_FDCPOWERVALIDCONF_REG, iobase); // CR00 - FDC Power/valid config cycle - tmpbyte = inb(iobase + 1); - outb(tmpbyte | LPC47N227_VALID_MASK, iobase + 1); // valid config cycle done - - outb(LPC47N227_CFGEXITKEY, iobase); // Exit configuration - - return 0; -} - -/* 82801CAM generic registers */ -#define VID 0x00 -#define DID 0x02 -#define PIRQ_A_D_ROUT 0x60 -#define SIRQ_CNTL 0x64 -#define PIRQ_E_H_ROUT 0x68 -#define PCI_DMA_C 0x90 -/* LPC-specific registers */ -#define COM_DEC 0xe0 -#define GEN1_DEC 0xe4 -#define LPC_EN 0xe6 -#define GEN2_DEC 0xec -/* - * Sets up the I/O range using the 82801CAM ISA bridge, 82801DBM LPC bridge - * or Intel 82801DB/DBL (ICH4/ICH4-L) LPC Interface Bridge. - * They all work the same way! - */ -static int __init preconfigure_through_82801(struct pci_dev *dev, - struct - smsc_ircc_subsystem_configuration - *conf) -{ - unsigned short tmpword; - unsigned char tmpbyte; - - IRDA_MESSAGE("Setting up Intel 82801 controller and SMSC device\n"); - /* - * Select the range for the COMA COM port (SIR) - * Register COM_DEC: - * Bit 7: reserved - * Bit 6-4, COMB decode range - * Bit 3: reserved - * Bit 2-0, COMA decode range - * - * Decode ranges: - * 000 = 0x3f8-0x3ff (COM1) - * 001 = 0x2f8-0x2ff (COM2) - * 010 = 0x220-0x227 - * 011 = 0x228-0x22f - * 100 = 0x238-0x23f - * 101 = 0x2e8-0x2ef (COM4) - * 110 = 0x338-0x33f - * 111 = 0x3e8-0x3ef (COM3) - */ - pci_read_config_byte(dev, COM_DEC, &tmpbyte); - tmpbyte &= 0xf8; /* mask COMA bits */ - switch(conf->sir_io) { - case 0x3f8: - tmpbyte |= 0x00; - break; - case 0x2f8: - tmpbyte |= 0x01; - break; - case 0x220: - tmpbyte |= 0x02; - break; - case 0x228: - tmpbyte |= 0x03; - break; - case 0x238: - tmpbyte |= 0x04; - break; - case 0x2e8: - tmpbyte |= 0x05; - break; - case 0x338: - tmpbyte |= 0x06; - break; - case 0x3e8: - tmpbyte |= 0x07; - break; - default: - tmpbyte |= 0x01; /* COM2 default */ - } - IRDA_DEBUG(1, "COM_DEC (write): 0x%02x\n", tmpbyte); - pci_write_config_byte(dev, COM_DEC, tmpbyte); - - /* Enable Low Pin Count interface */ - pci_read_config_word(dev, LPC_EN, &tmpword); - /* These seem to be set up at all times, - * just make sure it is properly set. - */ - switch(conf->cfg_base) { - case 0x04e: - tmpword |= 0x2000; - break; - case 0x02e: - tmpword |= 0x1000; - break; - case 0x062: - tmpword |= 0x0800; - break; - case 0x060: - tmpword |= 0x0400; - break; - default: - IRDA_WARNING("Uncommon I/O base address: 0x%04x\n", - conf->cfg_base); - break; - } - tmpword &= 0xfffd; /* disable LPC COMB */ - tmpword |= 0x0001; /* set bit 0 : enable LPC COMA addr range (GEN2) */ - IRDA_DEBUG(1, "LPC_EN (write): 0x%04x\n", tmpword); - pci_write_config_word(dev, LPC_EN, tmpword); - - /* - * Configure LPC DMA channel - * PCI_DMA_C bits: - * Bit 15-14: DMA channel 7 select - * Bit 13-12: DMA channel 6 select - * Bit 11-10: DMA channel 5 select - * Bit 9-8: Reserved - * Bit 7-6: DMA channel 3 select - * Bit 5-4: DMA channel 2 select - * Bit 3-2: DMA channel 1 select - * Bit 1-0: DMA channel 0 select - * 00 = Reserved value - * 01 = PC/PCI DMA - * 10 = Reserved value - * 11 = LPC I/F DMA - */ - pci_read_config_word(dev, PCI_DMA_C, &tmpword); - switch(conf->fir_dma) { - case 0x07: - tmpword |= 0xc000; - break; - case 0x06: - tmpword |= 0x3000; - break; - case 0x05: - tmpword |= 0x0c00; - break; - case 0x03: - tmpword |= 0x00c0; - break; - case 0x02: - tmpword |= 0x0030; - break; - case 0x01: - tmpword |= 0x000c; - break; - case 0x00: - tmpword |= 0x0003; - break; - default: - break; /* do not change settings */ - } - IRDA_DEBUG(1, "PCI_DMA_C (write): 0x%04x\n", tmpword); - pci_write_config_word(dev, PCI_DMA_C, tmpword); - - /* - * GEN2_DEC bits: - * Bit 15-4: Generic I/O range - * Bit 3-1: reserved (read as 0) - * Bit 0: enable GEN2 range on LPC I/F - */ - tmpword = conf->fir_io & 0xfff8; - tmpword |= 0x0001; - IRDA_DEBUG(1, "GEN2_DEC (write): 0x%04x\n", tmpword); - pci_write_config_word(dev, GEN2_DEC, tmpword); - - /* Pre-configure chip */ - return preconfigure_smsc_chip(conf); -} - -/* - * Pre-configure a certain port on the ALi 1533 bridge. - * This is based on reverse-engineering since ALi does not - * provide any data sheet for the 1533 chip. - */ -static void __init preconfigure_ali_port(struct pci_dev *dev, - unsigned short port) -{ - unsigned char reg; - /* These bits obviously control the different ports */ - unsigned char mask; - unsigned char tmpbyte; - - switch(port) { - case 0x0130: - case 0x0178: - reg = 0xb0; - mask = 0x80; - break; - case 0x03f8: - reg = 0xb4; - mask = 0x80; - break; - case 0x02f8: - reg = 0xb4; - mask = 0x30; - break; - case 0x02e8: - reg = 0xb4; - mask = 0x08; - break; - default: - IRDA_ERROR("Failed to configure unsupported port on ALi 1533 bridge: 0x%04x\n", port); - return; - } - - pci_read_config_byte(dev, reg, &tmpbyte); - /* Turn on the right bits */ - tmpbyte |= mask; - pci_write_config_byte(dev, reg, tmpbyte); - IRDA_MESSAGE("Activated ALi 1533 ISA bridge port 0x%04x.\n", port); - return; -} - -static int __init preconfigure_through_ali(struct pci_dev *dev, - struct - smsc_ircc_subsystem_configuration - *conf) -{ - /* Configure the two ports on the ALi 1533 */ - preconfigure_ali_port(dev, conf->sir_io); - preconfigure_ali_port(dev, conf->fir_io); - - /* Pre-configure chip */ - return preconfigure_smsc_chip(conf); -} - -static int __init smsc_ircc_preconfigure_subsystems(unsigned short ircc_cfg, - unsigned short ircc_fir, - unsigned short ircc_sir, - unsigned char ircc_dma, - unsigned char ircc_irq) -{ - struct pci_dev *dev = NULL; - unsigned short ss_vendor = 0x0000; - unsigned short ss_device = 0x0000; - int ret = 0; - - dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev); - - while (dev != NULL) { - struct smsc_ircc_subsystem_configuration *conf; - - /* - * Cache the subsystem vendor/device: - * some manufacturers fail to set this for all components, - * so we save it in case there is just 0x0000 0x0000 on the - * device we want to check. - */ - if (dev->subsystem_vendor != 0x0000U) { - ss_vendor = dev->subsystem_vendor; - ss_device = dev->subsystem_device; - } - conf = subsystem_configurations; - for( ; conf->subvendor; conf++) { - if(conf->vendor == dev->vendor && - conf->device == dev->device && - conf->subvendor == ss_vendor && - /* Sometimes these are cached values */ - (conf->subdevice == ss_device || - conf->subdevice == 0xffff)) { - struct smsc_ircc_subsystem_configuration - tmpconf; - - memcpy(&tmpconf, conf, - sizeof(struct smsc_ircc_subsystem_configuration)); - - /* - * Override the default values with anything - * passed in as parameter - */ - if (ircc_cfg != 0) - tmpconf.cfg_base = ircc_cfg; - if (ircc_fir != 0) - tmpconf.fir_io = ircc_fir; - if (ircc_sir != 0) - tmpconf.sir_io = ircc_sir; - if (ircc_dma != 0xff) - tmpconf.fir_dma = ircc_dma; - if (ircc_irq != 0xff) - tmpconf.fir_irq = ircc_irq; - - IRDA_MESSAGE("Detected unconfigured %s SMSC IrDA chip, pre-configuring device.\n", conf->name); - if (conf->preconfigure) - ret = conf->preconfigure(dev, &tmpconf); - else - ret = -ENODEV; - } - } - dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev); - } - - return ret; -} -#endif // CONFIG_PCI - /************************************************ * * Transceivers specific functions diff --git a/drivers/net/irda/stir4200.c b/drivers/net/irda/stir4200.c index d61b208b5..31867e4b8 100644 --- a/drivers/net/irda/stir4200.c +++ b/drivers/net/irda/stir4200.c @@ -50,7 +50,6 @@ #include #include #include -#include #include #include #include @@ -174,7 +173,9 @@ struct stir_cb { struct qos_info qos; unsigned speed; /* Current speed */ - struct task_struct *thread; /* transmit thread */ + wait_queue_head_t thr_wait; /* transmit thread wakeup */ + struct completion thr_exited; + pid_t thr_pid; struct sk_buff *tx_pending; void *io_buf; /* transmit/receive buffer */ @@ -576,7 +577,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_process(stir->thread); + wake_up(&stir->thr_wait); /* this should never happen unless stop/wakeup problem */ if (unlikely(skb)) { @@ -752,7 +753,13 @@ static int stir_transmit_thread(void *arg) struct net_device *dev = stir->netdev; struct sk_buff *skb; - while (!kthread_should_stop()) { + daemonize("%s", dev->name); + allow_signal(SIGTERM); + + while (netif_running(dev) + && netif_device_present(dev) + && !signal_pending(current)) + { #ifdef CONFIG_PM /* if suspending, then power off and wait */ if (unlikely(freezing(current))) { @@ -806,11 +813,10 @@ static int stir_transmit_thread(void *arg) } /* sleep if nothing to send */ - set_current_state(TASK_INTERRUPTIBLE); - schedule(); - + wait_event_interruptible(stir->thr_wait, stir->tx_pending); } - return 0; + + complete_and_exit (&stir->thr_exited, 0); } @@ -853,7 +859,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_process(stir->thread); + wake_up(&stir->thr_wait); } } @@ -922,10 +928,10 @@ static int stir_net_open(struct net_device *netdev) } /** Start kernel thread for transmit. */ - stir->thread = kthread_run(stir_transmit_thread, stir, - "%s", stir->netdev->name); - if (IS_ERR(stir->thread)) { - err = PTR_ERR(stir->thread); + stir->thr_pid = kernel_thread(stir_transmit_thread, stir, + CLONE_FS|CLONE_FILES); + if (stir->thr_pid < 0) { + err = stir->thr_pid; err("stir4200: unable to start kernel thread"); goto err_out6; } @@ -962,7 +968,8 @@ static int stir_net_close(struct net_device *netdev) netif_stop_queue(netdev); /* Kill transmit thread */ - kthread_stop(stir->thread); + kill_proc(stir->thr_pid, SIGTERM, 1); + wait_for_completion(&stir->thr_exited); kfree(stir->fifo_status); /* Mop up receive urb's */ @@ -1077,6 +1084,9 @@ 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 92d646cc9..a9f49f058 100644 --- a/drivers/net/irda/vlsi_ir.c +++ b/drivers/net/irda/vlsi_ir.c @@ -21,6 +21,7 @@ * ********************************************************************/ +#include #include #define DRIVER_NAME "vlsi_ir" @@ -958,7 +959,7 @@ static int vlsi_hard_start_xmit(struct sk_buff *skb, struct net_device *ndev) || (now.tv_sec==ready.tv_sec && now.tv_usec>=ready.tv_usec)) break; udelay(100); - /* must not sleep here - called under netif_tx_lock! */ + /* must not sleep here - we are called under xmit_lock! */ } } @@ -1517,7 +1518,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, IRQF_SHARED, + if (request_irq(ndev->irq, vlsi_interrupt, SA_SHIRQ, drivername, ndev)) { IRDA_WARNING("%s: couldn't get IRQ: %d\n", __FUNCTION__, ndev->irq); @@ -1886,7 +1887,7 @@ static int __init vlsi_mod_init(void) vlsi_proc_root->owner = THIS_MODULE; } - ret = pci_register_driver(&vlsi_irda_driver); + ret = pci_module_init(&vlsi_irda_driver); if (ret && vlsi_proc_root) remove_proc_entry(PROC_DIR, NULL); diff --git a/drivers/net/irda/vlsi_ir.h b/drivers/net/irda/vlsi_ir.h index c37f0bc4c..a82a4ba8d 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)->i_private) +#define PDE(inode) ((inode)->u.generic_ip) #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 b69776e00..0ea65c4c6 100644 --- a/drivers/net/irda/w83977af_ir.c +++ b/drivers/net/irda/w83977af_ir.c @@ -40,6 +40,7 @@ ********************************************************************/ #include +#include #include #include #include diff --git a/drivers/net/iseries_veth.c b/drivers/net/iseries_veth.c index cdc14401c..f0f04be98 100644 --- a/drivers/net/iseries_veth.c +++ b/drivers/net/iseries_veth.c @@ -56,6 +56,7 @@ * number of packets outstanding to a remote partition at a time. */ +#include #include #include #include @@ -68,7 +69,6 @@ #include #include #include -#include #include #include @@ -1035,22 +1035,11 @@ static struct ethtool_ops ops = { .get_link = veth_get_link, }; -static struct net_device * __init veth_probe_one(int vlan, - struct vio_dev *vio_dev) +static struct net_device * __init veth_probe_one(int vlan, struct device *vdev) { 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) { @@ -1075,11 +1064,16 @@ static struct net_device * __init veth_probe_one(int vlan, } port->dev = vdev; - memcpy(dev->dev_addr, mac_addr, ETH_ALEN); + 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; dev->mtu = VETH_MAX_MTU; - memcpy(&port->mac_addr, mac_addr, ETH_ALEN); + memcpy(&port->mac_addr, dev->dev_addr, 6); dev->open = veth_open; dev->hard_start_xmit = veth_start_xmit; @@ -1614,7 +1608,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 = veth_probe_one(i, &vdev->dev); if (dev == NULL) { veth_remove(vdev); return 1; @@ -1647,7 +1641,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 = { - { "network", "IBM,iSeries-l-lan" }, + { "vlan", "" }, { "", "" } }; MODULE_DEVICE_TABLE(vio, veth_device_table); diff --git a/drivers/net/ixgb/Makefile b/drivers/net/ixgb/Makefile index a8a2d3d03..7c7aff1ea 100644 --- a/drivers/net/ixgb/Makefile +++ b/drivers/net/ixgb/Makefile @@ -1,7 +1,7 @@ ################################################################################ # # -# Copyright(c) 1999 - 2006 Intel Corporation. All rights reserved. +# Copyright(c) 1999 - 2002 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 82b67af54..c83271b38 100644 --- a/drivers/net/ixgb/ixgb.h +++ b/drivers/net/ixgb/ixgb.h @@ -1,7 +1,7 @@ /******************************************************************************* - Copyright(c) 1999 - 2006 Intel Corporation. All rights reserved. + Copyright(c) 1999 - 2005 Intel Corporation. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free @@ -30,6 +30,7 @@ #define _IXGB_H_ #include +#include #include #include #include @@ -83,12 +84,7 @@ struct ixgb_adapter; #define IXGB_DBG(args...) #endif -#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)) - +#define IXGB_ERR(args...) printk(KERN_ERR "ixgb: " args) /* TX/RX descriptor defines */ #define DEFAULT_TXD 256 @@ -179,7 +175,6 @@ 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; @@ -197,9 +192,7 @@ 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 8357c5590..661a46b95 100644 --- a/drivers/net/ixgb/ixgb_ee.c +++ b/drivers/net/ixgb/ixgb_ee.c @@ -1,7 +1,7 @@ /******************************************************************************* - Copyright(c) 1999 - 2006 Intel Corporation. All rights reserved. + Copyright(c) 1999 - 2005 Intel Corporation. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free diff --git a/drivers/net/ixgb/ixgb_ee.h b/drivers/net/ixgb/ixgb_ee.h index bf6fa220f..5190aa876 100644 --- a/drivers/net/ixgb/ixgb_ee.h +++ b/drivers/net/ixgb/ixgb_ee.h @@ -1,7 +1,7 @@ /******************************************************************************* - Copyright(c) 1999 - 2006 Intel Corporation. All rights reserved. + Copyright(c) 1999 - 2005 Intel Corporation. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free diff --git a/drivers/net/ixgb/ixgb_ethtool.c b/drivers/net/ixgb/ixgb_ethtool.c index cf19b898b..d38ade5f2 100644 --- a/drivers/net/ixgb/ixgb_ethtool.c +++ b/drivers/net/ixgb/ixgb_ethtool.c @@ -1,7 +1,7 @@ /******************************************************************************* - Copyright(c) 1999 - 2006 Intel Corporation. All rights reserved. + Copyright(c) 1999 - 2005 Intel Corporation. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free @@ -44,8 +44,6 @@ 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; @@ -78,7 +76,6 @@ 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 @@ -120,16 +117,6 @@ 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) { @@ -143,7 +130,12 @@ ixgb_set_settings(struct net_device *netdev, struct ethtool_cmd *ecmd) ixgb_down(adapter, TRUE); ixgb_reset(adapter); ixgb_up(adapter); - ixgb_set_speed_duplex(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); + } else ixgb_reset(adapter); @@ -191,7 +183,11 @@ ixgb_set_pauseparam(struct net_device *netdev, if(netif_running(adapter->netdev)) { ixgb_down(adapter, TRUE); ixgb_up(adapter); - ixgb_set_speed_duplex(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); } else ixgb_reset(adapter); @@ -216,7 +212,11 @@ ixgb_set_rx_csum(struct net_device *netdev, uint32_t data) if(netif_running(netdev)) { ixgb_down(adapter,TRUE); ixgb_up(adapter); - ixgb_set_speed_duplex(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); } else ixgb_reset(adapter); return 0; @@ -251,19 +251,6 @@ 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 @@ -316,7 +303,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 < IXGB_ALL_RAR_ENTRIES; i++) { + for(i = 0; i < 16; i++) { *reg++ = IXGB_READ_REG_ARRAY(hw, RAL, (i << 1)); /*21,...,51 */ *reg++ = IXGB_READ_REG_ARRAY(hw, RAH, (i << 1)); /*22,...,52 */ } @@ -606,7 +593,11 @@ ixgb_set_ringparam(struct net_device *netdev, adapter->tx_ring = tx_new; if((err = ixgb_up(adapter))) return err; - ixgb_set_speed_duplex(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); } return 0; @@ -723,8 +714,6 @@ 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 f7fa10e47..620cad48b 100644 --- a/drivers/net/ixgb/ixgb_hw.c +++ b/drivers/net/ixgb/ixgb_hw.c @@ -1,7 +1,7 @@ /******************************************************************************* - Copyright(c) 1999 - 2006 Intel Corporation. All rights reserved. + Copyright(c) 1999 - 2005 Intel Corporation. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free diff --git a/drivers/net/ixgb/ixgb_hw.h b/drivers/net/ixgb/ixgb_hw.h index cb4568915..382c6300c 100644 --- a/drivers/net/ixgb/ixgb_hw.h +++ b/drivers/net/ixgb/ixgb_hw.h @@ -1,7 +1,7 @@ /******************************************************************************* - Copyright(c) 1999 - 2006 Intel Corporation. All rights reserved. + Copyright(c) 1999 - 2005 Intel Corporation. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free @@ -57,7 +57,6 @@ 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 40a085f94..aee207eaa 100644 --- a/drivers/net/ixgb/ixgb_ids.h +++ b/drivers/net/ixgb/ixgb_ids.h @@ -1,7 +1,7 @@ /******************************************************************************* - Copyright(c) 1999 - 2006 Intel Corporation. All rights reserved. + Copyright(c) 1999 - 2005 Intel Corporation. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free @@ -43,8 +43,6 @@ #define IXGB_SUBDEVICE_ID_A11F 0xA11F #define IXGB_SUBDEVICE_ID_A01F 0xA01F -#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 7bbd44728..f9f77e4f5 100644 --- a/drivers/net/ixgb/ixgb_main.c +++ b/drivers/net/ixgb/ixgb_main.c @@ -1,7 +1,7 @@ /******************************************************************************* - Copyright(c) 1999 - 2006 Intel Corporation. All rights reserved. + Copyright(c) 1999 - 2005 Intel Corporation. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free @@ -28,6 +28,22 @@ #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"; @@ -36,9 +52,9 @@ static char ixgb_driver_string[] = "Intel(R) PRO/10GbE Network Driver"; #else #define DRIVERNAPI "-NAPI" #endif -#define DRV_VERSION "1.0.109-k2"DRIVERNAPI +#define DRV_VERSION "1.0.100-k2"DRIVERNAPI char ixgb_driver_version[] = DRV_VERSION; -static char ixgb_copyright[] = "Copyright (c) 1999-2006 Intel Corporation."; +static char ixgb_copyright[] = "Copyright (c) 1999-2005 Intel Corporation."; /* ixgb_pci_tbl - PCI Device ID Table * @@ -51,8 +67,6 @@ static char ixgb_copyright[] = "Copyright (c) 1999-2006 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, @@ -134,11 +148,6 @@ 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 @@ -187,7 +196,7 @@ module_exit(ixgb_exit_module); * @adapter: board private structure **/ -static void +static inline void ixgb_irq_disable(struct ixgb_adapter *adapter) { atomic_inc(&adapter->irq_sem); @@ -201,7 +210,7 @@ ixgb_irq_disable(struct ixgb_adapter *adapter) * @adapter: board private structure **/ -static void +static inline void ixgb_irq_enable(struct ixgb_adapter *adapter) { if(atomic_dec_and_test(&adapter->irq_sem)) { @@ -222,7 +231,6 @@ 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); @@ -232,9 +240,6 @@ 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) & @@ -244,7 +249,7 @@ ixgb_up(struct ixgb_adapter *adapter) if (!pcix) adapter->have_msi = FALSE; else if((err = pci_enable_msi(adapter->pdev))) { - DPRINTK(PROBE, ERR, + printk (KERN_ERR "Unable to allocate MSI interrupt Error: %d\n", err); adapter->have_msi = FALSE; /* proceed to try to request regular interrupt */ @@ -253,12 +258,12 @@ ixgb_up(struct ixgb_adapter *adapter) #endif if((err = request_irq(adapter->pdev->irq, &ixgb_intr, - IRQF_SHARED | IRQF_SAMPLE_RANDOM, - netdev->name, netdev))) { - DPRINTK(PROBE, ERR, - "Unable to allocate interrupt Error: %d\n", err); + SA_SHIRQ | SA_SAMPLE_RANDOM, + netdev->name, netdev))) 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 != @@ -280,12 +285,11 @@ 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; } @@ -322,7 +326,7 @@ ixgb_reset(struct ixgb_adapter *adapter) ixgb_adapter_stop(&adapter->hw); if(!ixgb_init_hw(&adapter->hw)) - DPRINTK(PROBE, ERR, "ixgb_init_hw failed.\n"); + IXGB_DBG("ixgb_init_hw failed.\n"); } /** @@ -353,21 +357,18 @@ ixgb_probe(struct pci_dev *pdev, if((err = pci_enable_device(pdev))) return err; - if(!(err = pci_set_dma_mask(pdev, DMA_64BIT_MASK)) && - !(err = pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK))) { + if(!(err = pci_set_dma_mask(pdev, DMA_64BIT_MASK))) { pci_using_dac = 1; } else { - if((err = pci_set_dma_mask(pdev, DMA_32BIT_MASK)) || - (err = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK))) { - printk(KERN_ERR - "ixgb: No usable DMA configuration, aborting\n"); - goto err_dma_mask; + if((err = pci_set_dma_mask(pdev, DMA_32BIT_MASK))) { + IXGB_ERR("No usable DMA configuration, aborting\n"); + return err; } pci_using_dac = 0; } if((err = pci_request_regions(pdev, ixgb_driver_name))) - goto err_request_regions; + return err; pci_set_master(pdev); @@ -385,7 +386,6 @@ 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); @@ -414,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 = 5 * HZ; + netdev->watchdog_timeo = HZ; #ifdef CONFIG_IXGB_NAPI netdev->poll = &ixgb_clean; netdev->weight = 64; @@ -426,7 +426,6 @@ 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; @@ -448,9 +447,6 @@ 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; @@ -458,7 +454,7 @@ ixgb_probe(struct pci_dev *pdev, /* make sure the EEPROM is good */ if(!ixgb_validate_eeprom_checksum(&adapter->hw)) { - DPRINTK(PROBE, ERR, "The EEPROM Checksum Is Not Valid\n"); + printk(KERN_ERR "The EEPROM Checksum Is Not Valid\n"); err = -EIO; goto err_eeprom; } @@ -467,7 +463,6 @@ 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; } @@ -481,7 +476,6 @@ 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; @@ -490,7 +484,8 @@ ixgb_probe(struct pci_dev *pdev, netif_carrier_off(netdev); netif_stop_queue(netdev); - DPRINTK(PROBE, INFO, "Intel(R) PRO/10GbE Network Connection\n"); + printk(KERN_INFO "%s: Intel(R) PRO/10GbE Network Connection\n", + netdev->name); ixgb_check_options(adapter); /* reset the hardware with the new settings */ @@ -507,9 +502,6 @@ err_ioremap: free_netdev(netdev); err_alloc_etherdev: pci_release_regions(pdev); -err_request_regions: -err_dma_mask: - pci_disable_device(pdev); return err; } @@ -560,17 +552,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_CX4) - || (hw->device_id == IXGB_DEVICE_ID_82597EX_LR) - || (hw->device_id == IXGB_DEVICE_ID_82597EX_SR)) + ||(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 */ - DPRINTK(PROBE, ERR, "unsupported device id\n"); + printk(KERN_ERR "ixgb: unsupported device id\n"); } /* enable flow control to be programmed */ @@ -668,8 +660,6 @@ 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); @@ -682,8 +672,6 @@ 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); @@ -757,8 +745,6 @@ 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); @@ -772,8 +758,6 @@ 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); @@ -805,14 +789,21 @@ ixgb_setup_rctl(struct ixgb_adapter *adapter) rctl |= IXGB_RCTL_SECRC; - if (adapter->rx_buffer_len <= IXGB_RXBUFFER_2048) + switch (adapter->rx_buffer_len) { + case IXGB_RXBUFFER_2048: + default: rctl |= IXGB_RCTL_BSIZE_2048; - else if (adapter->rx_buffer_len <= IXGB_RXBUFFER_4096) + break; + case IXGB_RXBUFFER_4096: rctl |= IXGB_RCTL_BSIZE_4096; - else if (adapter->rx_buffer_len <= IXGB_RXBUFFER_8192) + break; + case IXGB_RXBUFFER_8192: rctl |= IXGB_RCTL_BSIZE_8192; - else if (adapter->rx_buffer_len <= IXGB_RXBUFFER_16384) + break; + case IXGB_RXBUFFER_16384: rctl |= IXGB_RCTL_BSIZE_16384; + break; + } IXGB_WRITE_REG(&adapter->hw, RCTL, rctl); } @@ -902,25 +893,22 @@ ixgb_free_tx_resources(struct ixgb_adapter *adapter) adapter->tx_ring.desc = NULL; } -static void +static inline 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); - - if (buffer_info->skb) + 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) { dev_kfree_skb_any(buffer_info->skb); - - 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; */ + buffer_info->skb = NULL; + } } /** @@ -1119,8 +1107,8 @@ ixgb_watchdog(unsigned long data) if(adapter->hw.link_up) { if(!netif_carrier_ok(netdev)) { - DPRINTK(LINK, INFO, - "NIC Link is Up 10000 Mbps Full Duplex\n"); + printk(KERN_INFO "ixgb: %s NIC Link is Up %d Mbps %s\n", + netdev->name, 10000, "Full Duplex"); adapter->link_speed = 10000; adapter->link_duplex = FULL_DUPLEX; netif_carrier_on(netdev); @@ -1130,7 +1118,9 @@ ixgb_watchdog(unsigned long data) if(netif_carrier_ok(netdev)) { adapter->link_speed = 0; adapter->link_duplex = 0; - DPRINTK(LINK, INFO, "NIC Link is Down\n"); + printk(KERN_INFO + "ixgb: %s NIC Link is Down\n", + netdev->name); netif_carrier_off(netdev); netif_stop_queue(netdev); @@ -1163,7 +1153,7 @@ ixgb_watchdog(unsigned long data) #define IXGB_TX_FLAGS_VLAN 0x00000002 #define IXGB_TX_FLAGS_TSO 0x00000004 -static int +static inline int ixgb_tso(struct ixgb_adapter *adapter, struct sk_buff *skb) { #ifdef NETIF_F_TSO @@ -1173,7 +1163,7 @@ ixgb_tso(struct ixgb_adapter *adapter, struct sk_buff *skb) uint16_t ipcse, tucse, mss; int err; - if (likely(skb_is_gso(skb))) { + if(likely(skb_shinfo(skb)->tso_size)) { if (skb_header_cloned(skb)) { err = pskb_expand_head(skb, 0, 0, GFP_ATOMIC); if (err) @@ -1181,7 +1171,7 @@ ixgb_tso(struct ixgb_adapter *adapter, struct sk_buff *skb) } hdr_len = ((skb->h.raw - skb->data) + (skb->h.th->doff << 2)); - mss = skb_shinfo(skb)->gso_size; + mss = skb_shinfo(skb)->tso_size; skb->nh.iph->tot_len = 0; skb->nh.iph->check = 0; skb->h.th->check = ~csum_tcpudp_magic(skb->nh.iph->saddr, @@ -1225,7 +1215,7 @@ ixgb_tso(struct ixgb_adapter *adapter, struct sk_buff *skb) return 0; } -static boolean_t +static inline boolean_t ixgb_tx_csum(struct ixgb_adapter *adapter, struct sk_buff *skb) { struct ixgb_context_desc *context_desc; @@ -1263,7 +1253,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_DATA_PER_TXD); + size = min(len, IXGB_MAX_JUMBO_FRAME_SIZE); buffer_info->length = size; buffer_info->dma = pci_map_single(adapter->pdev, @@ -1289,7 +1279,6 @@ 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; @@ -1306,7 +1295,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_DATA_PER_TXD); + size = min(len, IXGB_MAX_JUMBO_FRAME_SIZE); buffer_info->length = size; buffer_info->dma = pci_map_page(adapter->pdev, @@ -1315,7 +1304,6 @@ 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; @@ -1330,7 +1318,7 @@ ixgb_tx_map(struct ixgb_adapter *adapter, struct sk_buff *skb, return count; } -static void +static inline 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; @@ -1402,26 +1390,13 @@ 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 NETDEV_TX_BUSY; + return 1; } - -#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; @@ -1433,13 +1408,10 @@ 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 (likely(tso)) + if (tso) tx_flags |= IXGB_TX_FLAGS_TSO; else if(ixgb_tx_csum(adapter, skb)) tx_flags |= IXGB_TX_FLAGS_CSUM; @@ -1449,15 +1421,7 @@ ixgb_xmit_frame(struct sk_buff *skb, struct net_device *netdev) netdev->trans_start = jiffies; -#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; + return 0; } /** @@ -1479,7 +1443,6 @@ 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); } @@ -1518,15 +1481,28 @@ 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)) { - DPRINTK(PROBE, ERR, "Invalid MTU setting %d\n", new_mtu); + IXGB_ERR("Invalid MTU setting\n"); return -EINVAL; } - adapter->rx_buffer_len = max_frame; + 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; + } 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); } @@ -1784,43 +1760,23 @@ ixgb_clean_tx_irq(struct ixgb_adapter *adapter) tx_ring->next_to_clean = i; - 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_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); } + 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[eop].dma && - time_after(jiffies, tx_ring->buffer_info[eop].time_stamp + HZ) + if(tx_ring->buffer_info[i].dma && + time_after(jiffies, tx_ring->buffer_info[i].time_stamp + HZ) && !(IXGB_READ_REG(&adapter->hw, STATUS) & - 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); + IXGB_STATUS_TXOFF)) netif_stop_queue(netdev); - } } return cleaned; @@ -1833,7 +1789,7 @@ ixgb_clean_tx_irq(struct ixgb_adapter *adapter) * @sk_buff: socket buffer with received data **/ -static void +static inline void ixgb_rx_checksum(struct ixgb_adapter *adapter, struct ixgb_rx_desc *rx_desc, struct sk_buff *skb) @@ -1897,7 +1853,6 @@ ixgb_clean_rx_irq(struct ixgb_adapter *adapter) #endif status = rx_desc->status; skb = buffer_info->skb; - buffer_info->skb = NULL; prefetch(skb->data); @@ -1942,26 +1897,6 @@ 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); @@ -1991,6 +1926,7 @@ 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; @@ -2030,18 +1966,12 @@ ixgb_alloc_rx_buffers(struct ixgb_adapter *adapter) /* leave three descriptors unused */ while(--cleancount > 2) { - /* 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; - } + rx_desc = IXGB_RX_DESC(*rx_ring, i); - if (unlikely(!skb)) { + skb = dev_alloc_skb(adapter->rx_buffer_len + NET_IP_ALIGN); + + if(unlikely(!skb)) { /* Better luck next round */ - adapter->alloc_rx_buff_failed++; break; } @@ -2055,36 +1985,33 @@ ixgb_alloc_rx_buffers(struct ixgb_adapter *adapter) buffer_info->skb = skb; buffer_info->length = adapter->rx_buffer_len; -map_skb: - buffer_info->dma = pci_map_single(pdev, - skb->data, - adapter->rx_buffer_len, - PCI_DMA_FROMDEVICE); + 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]; } - 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); - } + rx_ring->next_to_use = i; } /** diff --git a/drivers/net/ixgb/ixgb_osdep.h b/drivers/net/ixgb/ixgb_osdep.h index ee982feac..dba20481e 100644 --- a/drivers/net/ixgb/ixgb_osdep.h +++ b/drivers/net/ixgb/ixgb_osdep.h @@ -1,7 +1,7 @@ /******************************************************************************* - Copyright(c) 1999 - 2006 Intel Corporation. All rights reserved. + Copyright(c) 1999 - 2005 Intel Corporation. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free diff --git a/drivers/net/ixgb/ixgb_param.c b/drivers/net/ixgb/ixgb_param.c index 39fbed29a..8a83dfdf7 100644 --- a/drivers/net/ixgb/ixgb_param.c +++ b/drivers/net/ixgb/ixgb_param.c @@ -1,7 +1,7 @@ /******************************************************************************* - Copyright(c) 1999 - 2006 Intel Corporation. All rights reserved. + Copyright(c) 1999 - 2005 Intel Corporation. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free @@ -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: 2 - Tx only (silicon bug avoidance) + * Default Value: Read flow control settings from the EEPROM */ IXGB_PARAM(FlowControl, "Flow Control setting"); @@ -137,7 +137,7 @@ IXGB_PARAM(RxFCLowThresh, "Receive Flow Control Low Threshold"); * * Valid Range: 1 - 65535 * - * Default Value: 65535 (0xffff) (we'll send an xon if we recover) + * Default Value: 256 (0x100) */ IXGB_PARAM(FCReqTimeout, "Flow Control Request Timeout"); @@ -165,6 +165,8 @@ 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 @@ -172,9 +174,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; @@ -334,7 +336,7 @@ ixgb_check_options(struct ixgb_adapter *adapter) .type = list_option, .name = "Flow Control", .err = "reading default settings from EEPROM", - .def = ixgb_fc_tx_pause, + .def = ixgb_fc_full, .arg = { .l = { .nr = LIST_LEN(fc_list), .p = fc_list }} }; @@ -363,8 +365,8 @@ ixgb_check_options(struct ixgb_adapter *adapter) } else { adapter->hw.fc.high_water = opt.def; } - if (!(adapter->hw.fc.type & ixgb_fc_tx_pause) ) - printk (KERN_INFO + if(!(adapter->hw.fc.type & ixgb_fc_rx_pause) ) + printk (KERN_INFO "Ignoring RxFCHighThresh when no RxFC\n"); } { /* Receive Flow Control Low Threshold */ @@ -383,8 +385,8 @@ ixgb_check_options(struct ixgb_adapter *adapter) } else { adapter->hw.fc.low_water = opt.def; } - if (!(adapter->hw.fc.type & ixgb_fc_tx_pause) ) - printk (KERN_INFO + if(!(adapter->hw.fc.type & ixgb_fc_rx_pause) ) + printk (KERN_INFO "Ignoring RxFCLowThresh when no RxFC\n"); } { /* Flow Control Pause Time Request*/ @@ -404,12 +406,12 @@ ixgb_check_options(struct ixgb_adapter *adapter) } else { adapter->hw.fc.pause_time = opt.def; } - if (!(adapter->hw.fc.type & ixgb_fc_tx_pause) ) - printk (KERN_INFO + if(!(adapter->hw.fc.type & ixgb_fc_rx_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_tx_pause) { + if (adapter->hw.fc.type & ixgb_fc_rx_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 7dea5b950..3595e107d 100644 --- a/drivers/net/ixp2000/caleb.c +++ b/drivers/net/ixp2000/caleb.c @@ -9,6 +9,7 @@ * (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 d3f4235c5..d82651a97 100644 --- a/drivers/net/ixp2000/enp2611.c +++ b/drivers/net/ixp2000/enp2611.c @@ -9,13 +9,14 @@ * (at your option) any later version. */ +#include #include #include #include #include #include #include -#include +#include #include #include #include "ixpdev.h" @@ -148,8 +149,6 @@ static void enp2611_check_link_status(unsigned long __dummy) int status; dev = nds[i]; - if (dev == NULL) - continue; status = pm3386_is_link_up(i); if (status && !netif_carrier_ok(dev)) { @@ -192,7 +191,6 @@ static void enp2611_set_port_admin_status(int port, int up) static int __init enp2611_init_module(void) { - int ports; int i; if (!machine_is_enp2611()) @@ -201,8 +199,7 @@ static int __init enp2611_init_module(void) caleb_reset(); pm3386_reset(); - ports = pm3386_port_count(); - for (i = 0; i < ports; i++) { + for (i = 0; i < 3; i++) { nds[i] = ixpdev_alloc(i, sizeof(struct enp2611_ixpdev_priv)); if (nds[i] == NULL) { while (--i >= 0) @@ -218,10 +215,9 @@ static int __init enp2611_init_module(void) ixp2400_msf_init(&enp2611_msf_parameters); - if (ixpdev_init(ports, nds, enp2611_set_port_admin_status)) { - for (i = 0; i < ports; i++) - if (nds[i]) - free_netdev(nds[i]); + if (ixpdev_init(3, nds, enp2611_set_port_admin_status)) { + for (i = 0; i < 3; i++) + free_netdev(nds[i]); return -EINVAL; } diff --git a/drivers/net/ixp2000/ixp2400-msf.c b/drivers/net/ixp2000/ixp2400-msf.c index 9ec38eebf..48a3a891d 100644 --- a/drivers/net/ixp2000/ixp2400-msf.c +++ b/drivers/net/ixp2000/ixp2400-msf.c @@ -11,6 +11,7 @@ * 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 6eeb965b4..09f03f493 100644 --- a/drivers/net/ixp2000/ixpdev.c +++ b/drivers/net/ixp2000/ixpdev.c @@ -9,13 +9,14 @@ * (at your option) any later version. */ +#include #include #include #include #include #include #include -#include +#include #include #include #include "ixp2400_rx.ucode" @@ -235,7 +236,7 @@ static int ixpdev_open(struct net_device *dev) if (!nds_open++) { err = request_irq(IRQ_IXP2000_THDA0, ixpdev_interrupt, - IRQF_SHARED, "ixp2000_eth", nds); + SA_SHIRQ, "ixp2000_eth", nds); if (err) { nds_open--; return err; @@ -298,7 +299,10 @@ int ixpdev_init(int __nds_count, struct net_device **__nds, int i; int err; - BUILD_BUG_ON(RX_BUF_COUNT > 192 || TX_BUF_COUNT > 192); + if (RX_BUF_COUNT > 192 || TX_BUF_COUNT > 192) { + static void __too_many_rx_or_tx_buffers(void); + __too_many_rx_or_tx_buffers(); + } printk(KERN_INFO "IXP2000 MSF ethernet driver %s\n", DRV_MODULE_VERSION); diff --git a/drivers/net/ixp2000/pm3386.c b/drivers/net/ixp2000/pm3386.c index e08d3f986..5c7ab7564 100644 --- a/drivers/net/ixp2000/pm3386.c +++ b/drivers/net/ixp2000/pm3386.c @@ -9,6 +9,7 @@ * (at your option) any later version. */ +#include #include #include #include @@ -85,53 +86,40 @@ static void pm3386_port_reg_write(int port, int _reg, int spacing, u16 value) pm3386_reg_write(port >> 1, reg, value); } -int pm3386_secondary_present(void) -{ - return pm3386_reg_read(1, 0) == 0x3386; -} void pm3386_reset(void) { u8 mac[3][6]; - int secondary; - - secondary = pm3386_secondary_present(); /* Save programmed MAC addresses. */ pm3386_get_mac(0, mac[0]); pm3386_get_mac(1, mac[1]); - if (secondary) - pm3386_get_mac(2, mac[2]); + pm3386_get_mac(2, mac[2]); /* Assert analog and digital reset. */ pm3386_reg_write(0, 0x002, 0x0060); - if (secondary) - pm3386_reg_write(1, 0x002, 0x0060); + pm3386_reg_write(1, 0x002, 0x0060); mdelay(1); /* Deassert analog reset. */ pm3386_reg_write(0, 0x002, 0x0062); - if (secondary) - pm3386_reg_write(1, 0x002, 0x0062); + pm3386_reg_write(1, 0x002, 0x0062); mdelay(10); /* Deassert digital reset. */ pm3386_reg_write(0, 0x002, 0x0063); - if (secondary) - pm3386_reg_write(1, 0x002, 0x0063); + pm3386_reg_write(1, 0x002, 0x0063); mdelay(10); /* Restore programmed MAC addresses. */ pm3386_set_mac(0, mac[0]); pm3386_set_mac(1, mac[1]); - if (secondary) - pm3386_set_mac(2, mac[2]); + pm3386_set_mac(2, mac[2]); /* Disable carrier on all ports. */ pm3386_set_carrier(0, 0); pm3386_set_carrier(1, 0); - if (secondary) - pm3386_set_carrier(2, 0); + pm3386_set_carrier(2, 0); } static u16 swaph(u16 x) @@ -139,11 +127,6 @@ static u16 swaph(u16 x) return ((x << 8) | (x >> 8)) & 0xffff; } -int pm3386_port_count(void) -{ - return 2 + pm3386_secondary_present(); -} - void pm3386_init_port(int port) { int pm = port >> 1; diff --git a/drivers/net/ixp2000/pm3386.h b/drivers/net/ixp2000/pm3386.h index cc4183dca..fe92bb056 100644 --- a/drivers/net/ixp2000/pm3386.h +++ b/drivers/net/ixp2000/pm3386.h @@ -13,7 +13,6 @@ #define __PM3386_H void pm3386_reset(void); -int pm3386_port_count(void); void pm3386_init_port(int port); void pm3386_get_mac(int port, u8 *mac); void pm3386_set_mac(int port, u8 *mac); diff --git a/drivers/net/jazzsonic.c b/drivers/net/jazzsonic.c index 661d75b4c..272d331d2 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 IRQF_DISABLED +#define SONIC_IRQ_FLAG SA_INTERRUPT #include "sonic.c" diff --git a/drivers/net/lance.c b/drivers/net/lance.c index 5b4dbfe5f..d1d714faa 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 init_module(void) +int init_module(void) { struct net_device *dev; int this_dev, found = 0; @@ -464,25 +464,20 @@ static int __init lance_probe1(struct net_device *dev, int ioaddr, int irq, int static int did_version; /* Already printed version info. */ unsigned long flags; int err = -ENOMEM; - void __iomem *bios; /* First we look for special cases. Check for HP's on-board ethernet by looking for 'HP' in the BIOS. There are two HP versions, check the BIOS for the configuration port. This method provided by L. Julliard, Laurent_Julliard@grenoble.hp.com. */ - bios = ioremap(0xf00f0, 0x14); - if (!bios) - return -ENOMEM; - if (readw(bios + 0x12) == 0x5048) { + if (isa_readw(0x000f0102) == 0x5048) { static const short ioaddr_table[] = { 0x300, 0x320, 0x340, 0x360}; - int hp_port = (readl(bios + 1) & 1) ? 0x499 : 0x99; + int hp_port = (isa_readl(0x000f00f1) & 1) ? 0x499 : 0x99; /* We can have boards other than the built-in! Verify this is on-board. */ if ((inb(hp_port) & 0xc0) == 0x80 && ioaddr_table[inb(hp_port) & 3] == ioaddr) hp_builtin = hp_port; } - iounmap(bios); /* We also recognize the HP Vectra on-board here, but check below. */ hpJ2405A = (inb(ioaddr) == 0x08 && inb(ioaddr+1) == 0x00 && inb(ioaddr+2) == 0x09); @@ -968,7 +963,8 @@ 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) { - if (skb_padto(skb, ETH_ZLEN)) + skb = skb_padto(skb, ETH_ZLEN); + if (skb == NULL) goto out; lp->tx_ring[entry].length = -ETH_ZLEN; } diff --git a/drivers/net/lasi_82596.c b/drivers/net/lasi_82596.c index 1ab09447b..f7b7238d8 100644 --- a/drivers/net/lasi_82596.c +++ b/drivers/net/lasi_82596.c @@ -177,7 +177,7 @@ static int i596_debug = (DEB_SERIOUS|DEB_PROBE); MODULE_AUTHOR("Richard Hirst"); MODULE_DESCRIPTION("i82596 driver"); MODULE_LICENSE("GPL"); -module_param(i596_debug, int, 0); +MODULE_PARM(i596_debug, "i"); MODULE_PARM_DESC(i596_debug, "lasi_82596 debug mask"); /* Copy frames shorter than rx_copybreak, otherwise pass on up in @@ -1083,7 +1083,8 @@ static int i596_start_xmit(struct sk_buff *skb, struct net_device *dev) skb->len, skb->data)); if (length < ETH_ZLEN) { - if (skb_padto(skb, ETH_ZLEN)) + skb = skb_padto(skb, ETH_ZLEN); + if (skb == NULL) return 0; length = ETH_ZLEN; } @@ -1519,9 +1520,9 @@ static void set_multicast_list(struct net_device *dev) } } -static int debug = -1; -module_param(debug, int, 0); +MODULE_PARM(debug, "i"); MODULE_PARM_DESC(debug, "lasi_82596 debug mask"); +static int debug = -1; static int num_drivers; static struct net_device *netdevs[MAX_DRIVERS]; diff --git a/drivers/net/lne390.c b/drivers/net/lne390.c index c0ec7f6ab..646e89fc3 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 init_module(void) +int init_module(void) { struct net_device *dev; int this_dev, found = 0; diff --git a/drivers/net/loopback.c b/drivers/net/loopback.c index 997cbce9a..690a1aae0 100644 --- a/drivers/net/loopback.c +++ b/drivers/net/loopback.c @@ -74,7 +74,7 @@ static void emulate_large_send_offload(struct sk_buff *skb) struct iphdr *iph = skb->nh.iph; struct tcphdr *th = (struct tcphdr*)(skb->nh.raw + (iph->ihl * 4)); unsigned int doffset = (iph->ihl + th->doff) * 4; - unsigned int mtu = skb_shinfo(skb)->gso_size + doffset; + unsigned int mtu = skb_shinfo(skb)->tso_size + doffset; unsigned int offset = 0; u32 seq = ntohl(th->seq); u16 id = ntohs(iph->id); @@ -139,7 +139,7 @@ static int loopback_xmit(struct sk_buff *skb, struct net_device *dev) #endif #ifdef LOOPBACK_TSO - if (skb_is_gso(skb)) { + if (skb_shinfo(skb)->tso_size) { BUG_ON(skb->protocol != htons(ETH_P_IP)); BUG_ON(skb->nh.iph->protocol != IPPROTO_TCP); @@ -172,9 +172,11 @@ static struct net_device_stats *get_stats(struct net_device *dev) memset(stats, 0, sizeof(struct net_device_stats)); - for_each_possible_cpu(i) { + for (i=0; i < NR_CPUS; i++) { struct net_device_stats *lb_stats; + if (!cpu_possible(i)) + continue; lb_stats = &per_cpu(loopback_stats, i); stats->rx_bytes += lb_stats->rx_bytes; stats->tx_bytes += lb_stats->tx_bytes; diff --git a/drivers/net/lp486e.c b/drivers/net/lp486e.c index 393aba95c..94d5ea1ce 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_SKBSIZE); + rbd->skb = dev_alloc_skb(RX_SKB_SIZE); if (!rbd->skb) { printk("dev_alloc_skb failed"); } rbd->next = rfd->rbd; if (i) { rfd->rbd->prev = rbd; - rbd->size = RX_SKBSIZE; + rbd->size = RX_SKB_SIZE; } else { - rbd->size = (RX_SKBSIZE | RBD_EL); + rbd->size = (RX_SKB_SIZE | 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, IRQF_SHARED, dev->name, dev); + i = request_irq(dev->irq, &i596_interrupt, SA_SHIRQ, dev->name, dev); if (i) { printk(KERN_ERR "%s: IRQ %d not free\n", dev->name, dev->irq); return i; @@ -877,7 +877,8 @@ static int i596_start_xmit (struct sk_buff *skb, struct net_device *dev) { length = skb->len; if (length < ETH_ZLEN) { - if (skb_padto(skb, ETH_ZLEN)) + skb = skb_padto(skb, ETH_ZLEN); + if (skb == NULL) return 0; length = ETH_ZLEN; } diff --git a/drivers/net/mac89x0.c b/drivers/net/mac89x0.c index cd3c9a5a9..f65b0db11 100644 --- a/drivers/net/mac89x0.c +++ b/drivers/net/mac89x0.c @@ -629,7 +629,7 @@ static int set_mac_address(struct net_device *dev, void *addr) static struct net_device *dev_cs89x0; static int debug; -module_param(debug, int, 0); +MODULE_PARM(debug, "i"); MODULE_PARM_DESC(debug, "CS89[02]0 debug level (0-5)"); MODULE_LICENSE("GPL"); diff --git a/drivers/net/mace.c b/drivers/net/mace.c index 29e4b5aa6..2a5add257 100644 --- a/drivers/net/mace.c +++ b/drivers/net/mace.c @@ -5,6 +5,7 @@ * Copyright (C) 1996 Paul Mackerras. */ +#include #include #include #include @@ -242,12 +243,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", mp->tx_dma_intr); + printk(KERN_ERR "MACE: can't get irq %d\n", mace->intrs[1].line); 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", mp->rx_dma_intr); + printk(KERN_ERR "MACE: can't get irq %d\n", mace->intrs[2].line); goto err_free_tx_irq; } @@ -1041,7 +1042,7 @@ static void __exit mace_cleanup(void) MODULE_AUTHOR("Paul Mackerras"); MODULE_DESCRIPTION("PowerMac MACE driver."); -module_param(port_aaui, int, 0); +MODULE_PARM(port_aaui, "i"); MODULE_PARM_DESC(port_aaui, "MACE uses AAUI port (0-1)"); MODULE_LICENSE("GPL"); diff --git a/drivers/net/macsonic.c b/drivers/net/macsonic.c index f6f3dafe8..02d5c6822 100644 --- a/drivers/net/macsonic.c +++ b/drivers/net/macsonic.c @@ -622,7 +622,7 @@ static int __init mac_sonic_init_module(void) return 0; out_unregister: - platform_driver_unregister(&mac_sonic_driver); + driver_unregister(&mac_sonic_driver); return -ENOMEM; } diff --git a/drivers/net/meth.c b/drivers/net/meth.c index d644bf3a9..e23655f50 100644 --- a/drivers/net/meth.c +++ b/drivers/net/meth.c @@ -62,7 +62,7 @@ MODULE_DESCRIPTION("SGI O2 Builtin Fast Ethernet driver"); #ifdef HAVE_TX_TIMEOUT static int timeout = TX_TIMEOUT; -module_param(timeout, int, 0); +MODULE_PARM(timeout, "i"); #endif /* diff --git a/drivers/net/mipsnet.c b/drivers/net/mipsnet.c index 07e58f4a2..bbffb585b 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, - IRQF_SHARED, dev->name, (void *) dev); + SA_SHIRQ, 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 59de3e74d..c0998ef93 100644 --- a/drivers/net/mv643xx_eth.c +++ b/drivers/net/mv643xx_eth.c @@ -10,7 +10,7 @@ * * Copyright (C) 2003 Ralf Baechle * - * Copyright (C) 2004-2006 MontaVista Software, Inc. + * Copyright (C) 2004-2005 MontaVista Software, Inc. * Dale Farnsworth * * Copyright (C) 2004 Steven J. Hill @@ -37,6 +37,8 @@ #include #include #include +#include +#include #include #include @@ -50,16 +52,39 @@ #include #include "mv643xx_eth.h" +/* + * The first part is the high level driver of the gigE ethernet ports. + */ + +/* Constants */ +#define VLAN_HLEN 4 +#define FCS_LEN 4 +#define DMA_ALIGN 8 /* hw requires 8-byte alignment */ +#define HW_IP_ALIGN 2 /* hw aligns IP header */ +#define WRAP HW_IP_ALIGN + ETH_HLEN + VLAN_HLEN + FCS_LEN +#define RX_SKB_SIZE ((dev->mtu + WRAP + 7) & ~0x7) + +#define INT_UNMASK_ALL 0x0007ffff +#define INT_UNMASK_ALL_EXT 0x0011ffff +#define INT_MASK_ALL 0x00000000 +#define INT_MASK_ALL_EXT 0x00000000 +#define INT_CAUSE_CHECK_BITS INT_CAUSE_UNMASK_ALL +#define INT_CAUSE_CHECK_BITS_EXT INT_CAUSE_UNMASK_ALL_EXT + +#ifdef MV643XX_CHECKSUM_OFFLOAD_TX +#define MAX_DESCS_PER_SKB (MAX_SKB_FRAGS + 1) +#else +#define MAX_DESCS_PER_SKB 1 +#endif + +#define PHY_WAIT_ITERATIONS 1000 /* 1000 iterations * 10uS = 10mS max */ +#define PHY_WAIT_MICRO_SECONDS 10 + /* Static function declarations */ +static int eth_port_link_is_up(unsigned int eth_port_num); static void eth_port_uc_addr_get(struct net_device *dev, unsigned char *MacAddr); static void eth_port_set_multicast_list(struct net_device *); -static void mv643xx_eth_port_enable_tx(unsigned int port_num, - unsigned int queues); -static void mv643xx_eth_port_enable_rx(unsigned int port_num, - unsigned int queues); -static unsigned int mv643xx_eth_port_disable_tx(unsigned int port_num); -static unsigned int mv643xx_eth_port_disable_rx(unsigned int port_num); static int mv643xx_eth_open(struct net_device *); static int mv643xx_eth_stop(struct net_device *); static int mv643xx_eth_change_mtu(struct net_device *, int); @@ -68,12 +93,8 @@ static void eth_port_init_mac_tables(unsigned int eth_port_num); #ifdef MV643XX_NAPI static int mv643xx_poll(struct net_device *dev, int *budget); #endif -static int ethernet_phy_get(unsigned int eth_port_num); static void ethernet_phy_set(unsigned int eth_port_num, int phy_addr); static int ethernet_phy_detect(unsigned int eth_port_num); -static int mv643xx_mdio_read(struct net_device *dev, int phy_id, int location); -static void mv643xx_mdio_write(struct net_device *dev, int phy_id, int location, int val); -static int mv643xx_eth_do_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd); static struct ethtool_ops mv643xx_ethtool_ops; static char mv643xx_driver_name[] = "mv643xx_eth"; @@ -132,53 +153,67 @@ static int mv643xx_eth_change_mtu(struct net_device *dev, int new_mtu) } /* - * mv643xx_eth_rx_refill_descs + * mv643xx_eth_rx_task * * Fills / refills RX queue on a certain gigabit ethernet port * * Input : pointer to ethernet interface network device structure * Output : N/A */ -static void mv643xx_eth_rx_refill_descs(struct net_device *dev) +static void mv643xx_eth_rx_task(void *data) { + struct net_device *dev = (struct net_device *)data; struct mv643xx_private *mp = netdev_priv(dev); struct pkt_info pkt_info; struct sk_buff *skb; int unaligned; - while (mp->rx_desc_count < mp->rx_ring_size) { - skb = dev_alloc_skb(ETH_RX_SKB_SIZE + ETH_DMA_ALIGN); + if (test_and_set_bit(0, &mp->rx_task_busy)) + panic("%s: Error in test_set_bit / clear_bit", dev->name); + + while (mp->rx_ring_skbs < (mp->rx_ring_size - 5)) { + skb = dev_alloc_skb(RX_SKB_SIZE + DMA_ALIGN); if (!skb) break; - mp->rx_desc_count++; - unaligned = (u32)skb->data & (ETH_DMA_ALIGN - 1); + mp->rx_ring_skbs++; + unaligned = (u32)skb->data & (DMA_ALIGN - 1); if (unaligned) - skb_reserve(skb, ETH_DMA_ALIGN - unaligned); + skb_reserve(skb, DMA_ALIGN - unaligned); pkt_info.cmd_sts = ETH_RX_ENABLE_INTERRUPT; - pkt_info.byte_cnt = ETH_RX_SKB_SIZE; - pkt_info.buf_ptr = dma_map_single(NULL, skb->data, - ETH_RX_SKB_SIZE, DMA_FROM_DEVICE); + pkt_info.byte_cnt = RX_SKB_SIZE; + pkt_info.buf_ptr = dma_map_single(NULL, skb->data, RX_SKB_SIZE, + DMA_FROM_DEVICE); pkt_info.return_info = skb; if (eth_rx_return_buff(mp, &pkt_info) != ETH_OK) { printk(KERN_ERR "%s: Error allocating RX Ring\n", dev->name); break; } - skb_reserve(skb, ETH_HW_IP_ALIGN); + skb_reserve(skb, HW_IP_ALIGN); } + clear_bit(0, &mp->rx_task_busy); /* * If RX ring is empty of SKB, set a timer to try allocating - * again at a later time. + * again in a later time . */ - if (mp->rx_desc_count == 0) { + if ((mp->rx_ring_skbs == 0) && (mp->rx_timer_flag == 0)) { printk(KERN_INFO "%s: Rx ring is empty\n", dev->name); - mp->timeout.expires = jiffies + (HZ / 10); /* 100 mSec */ + /* After 100mSec */ + mp->timeout.expires = jiffies + (HZ / 10); add_timer(&mp->timeout); + mp->rx_timer_flag = 1; + } +#ifdef MV643XX_RX_QUEUE_FILL_ON_TASK + else { + /* Return interrupts */ + mv_write(MV643XX_ETH_INTERRUPT_MASK_REG(mp->port_num), + INT_UNMASK_ALL); } +#endif } /* - * mv643xx_eth_rx_refill_descs_timer_wrapper + * mv643xx_eth_rx_task_timer_wrapper * * Timer routine to wake up RX queue filling task. This function is * used only in case the RX queue is empty, and all alloc_skb has @@ -187,9 +222,13 @@ static void mv643xx_eth_rx_refill_descs(struct net_device *dev) * Input : pointer to ethernet interface network device structure * Output : N/A */ -static inline void mv643xx_eth_rx_refill_descs_timer_wrapper(unsigned long data) +static void mv643xx_eth_rx_task_timer_wrapper(unsigned long data) { - mv643xx_eth_rx_refill_descs((struct net_device *)data); + struct net_device *dev = (struct net_device *)data; + struct mv643xx_private *mp = netdev_priv(dev); + + mp->rx_timer_flag = 0; + mv643xx_eth_rx_task((void *)data); } /* @@ -206,7 +245,8 @@ static void mv643xx_eth_update_mac_address(struct net_device *dev) unsigned int port_num = mp->port_num; eth_port_init_mac_tables(port_num); - eth_port_uc_addr_set(port_num, dev->dev_addr); + memcpy(mp->port_mac_addr, dev->dev_addr, 6); + eth_port_uc_addr_set(port_num, mp->port_mac_addr); } /* @@ -220,14 +260,13 @@ static void mv643xx_eth_update_mac_address(struct net_device *dev) static void mv643xx_eth_set_rx_mode(struct net_device *dev) { struct mv643xx_private *mp = netdev_priv(dev); - u32 config_reg; - config_reg = mv_read(MV643XX_ETH_PORT_CONFIG_REG(mp->port_num)); if (dev->flags & IFF_PROMISC) - config_reg |= (u32) MV643XX_ETH_UNICAST_PROMISCUOUS_MODE; + mp->port_config |= (u32) MV643XX_ETH_UNICAST_PROMISCUOUS_MODE; else - config_reg &= ~(u32) MV643XX_ETH_UNICAST_PROMISCUOUS_MODE; - mv_write(MV643XX_ETH_PORT_CONFIG_REG(mp->port_num), config_reg); + mp->port_config &= ~(u32) MV643XX_ETH_UNICAST_PROMISCUOUS_MODE; + + mv_write(MV643XX_ETH_PORT_CONFIG_REG(mp->port_num), mp->port_config); eth_port_set_multicast_list(dev); } @@ -281,90 +320,55 @@ static void mv643xx_eth_tx_timeout_task(struct net_device *dev) { struct mv643xx_private *mp = netdev_priv(dev); - if (!netif_running(dev)) - return; - - netif_stop_queue(dev); - + netif_device_detach(dev); eth_port_reset(mp->port_num); - eth_port_start(dev); - - if (mp->tx_ring_size - mp->tx_desc_count >= MAX_DESCS_PER_SKB) - netif_wake_queue(dev); + eth_port_start(mp); + netif_device_attach(dev); } -/** - * mv643xx_eth_free_tx_descs - Free the tx desc data for completed descriptors +/* + * mv643xx_eth_free_tx_queue * - * If force is non-zero, frees uncompleted descriptors as well + * Input : dev - a pointer to the required interface + * + * Output : 0 if was able to release skb , nonzero otherwise */ -int mv643xx_eth_free_tx_descs(struct net_device *dev, int force) +static int mv643xx_eth_free_tx_queue(struct net_device *dev, + unsigned int eth_int_cause_ext) { struct mv643xx_private *mp = netdev_priv(dev); - struct eth_tx_desc *desc; - u32 cmd_sts; - struct sk_buff *skb; - unsigned long flags; - int tx_index; - dma_addr_t addr; - int count; - int released = 0; - - while (mp->tx_desc_count > 0) { - spin_lock_irqsave(&mp->lock, flags); - tx_index = mp->tx_used_desc_q; - desc = &mp->p_tx_desc_area[tx_index]; - cmd_sts = desc->cmd_sts; - - if (!force && (cmd_sts & ETH_BUFFER_OWNED_BY_DMA)) { - spin_unlock_irqrestore(&mp->lock, flags); - return released; - } - - mp->tx_used_desc_q = (tx_index + 1) % mp->tx_ring_size; - mp->tx_desc_count--; - - addr = desc->buf_ptr; - count = desc->byte_cnt; - skb = mp->tx_skb[tx_index]; - if (skb) - mp->tx_skb[tx_index] = NULL; + struct net_device_stats *stats = &mp->stats; + struct pkt_info pkt_info; + int released = 1; - spin_unlock_irqrestore(&mp->lock, flags); + if (!(eth_int_cause_ext & (BIT0 | BIT8))) + return released; - if (cmd_sts & ETH_ERROR_SUMMARY) { + /* Check only queue 0 */ + while (eth_tx_return_desc(mp, &pkt_info) == ETH_OK) { + if (pkt_info.cmd_sts & BIT0) { printk("%s: Error in TX\n", dev->name); - mp->stats.tx_errors++; + stats->tx_errors++; } - if (cmd_sts & ETH_TX_FIRST_DESC) - dma_unmap_single(NULL, addr, count, DMA_TO_DEVICE); + if (pkt_info.cmd_sts & ETH_TX_FIRST_DESC) + dma_unmap_single(NULL, pkt_info.buf_ptr, + pkt_info.byte_cnt, + DMA_TO_DEVICE); else - dma_unmap_page(NULL, addr, count, DMA_TO_DEVICE); - - if (skb) - dev_kfree_skb_irq(skb); + dma_unmap_page(NULL, pkt_info.buf_ptr, + pkt_info.byte_cnt, + DMA_TO_DEVICE); - released = 1; + if (pkt_info.return_info) { + dev_kfree_skb_irq(pkt_info.return_info); + released = 0; + } } return released; } -static void mv643xx_eth_free_completed_tx_descs(struct net_device *dev) -{ - struct mv643xx_private *mp = netdev_priv(dev); - - if (mv643xx_eth_free_tx_descs(dev, 0) && - mp->tx_ring_size - mp->tx_desc_count >= MAX_DESCS_PER_SKB) - netif_wake_queue(dev); -} - -static void mv643xx_eth_free_all_tx_descs(struct net_device *dev) -{ - mv643xx_eth_free_tx_descs(dev, 1); -} - /* * mv643xx_eth_receive * @@ -376,7 +380,11 @@ static void mv643xx_eth_free_all_tx_descs(struct net_device *dev) * * Output : number of served packets */ +#ifdef MV643XX_NAPI static int mv643xx_eth_receive_queue(struct net_device *dev, int budget) +#else +static int mv643xx_eth_receive_queue(struct net_device *dev) +#endif { struct mv643xx_private *mp = netdev_priv(dev); struct net_device_stats *stats = &mp->stats; @@ -384,16 +392,15 @@ static int mv643xx_eth_receive_queue(struct net_device *dev, int budget) struct sk_buff *skb; struct pkt_info pkt_info; +#ifdef MV643XX_NAPI 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--; +#else + while (eth_port_receive(mp, &pkt_info) == ETH_OK) { +#endif + mp->rx_ring_skbs--; received_packets++; - /* - * Update statistics. - * Note byte count includes 4 byte CRC count - */ + /* Update statistics. Note byte count includes 4 byte CRC count */ stats->rx_packets++; stats->rx_bytes += pkt_info.byte_cnt; skb = pkt_info.return_info; @@ -441,61 +448,10 @@ static int mv643xx_eth_receive_queue(struct net_device *dev, int budget) } dev->last_rx = jiffies; } - mv643xx_eth_rx_refill_descs(dev); /* Fill RX ring with skb's */ return received_packets; } -/* Set the mv643xx port configuration register for the speed/duplex mode. */ -static void mv643xx_eth_update_pscr(struct net_device *dev, - struct ethtool_cmd *ecmd) -{ - struct mv643xx_private *mp = netdev_priv(dev); - int port_num = mp->port_num; - u32 o_pscr, n_pscr; - unsigned int queues; - - o_pscr = mv_read(MV643XX_ETH_PORT_SERIAL_CONTROL_REG(port_num)); - n_pscr = o_pscr; - - /* clear speed, duplex and rx buffer size fields */ - n_pscr &= ~(MV643XX_ETH_SET_MII_SPEED_TO_100 | - MV643XX_ETH_SET_GMII_SPEED_TO_1000 | - MV643XX_ETH_SET_FULL_DUPLEX_MODE | - MV643XX_ETH_MAX_RX_PACKET_MASK); - - if (ecmd->duplex == DUPLEX_FULL) - n_pscr |= MV643XX_ETH_SET_FULL_DUPLEX_MODE; - - if (ecmd->speed == SPEED_1000) - n_pscr |= MV643XX_ETH_SET_GMII_SPEED_TO_1000 | - MV643XX_ETH_MAX_RX_PACKET_9700BYTE; - else { - if (ecmd->speed == SPEED_100) - n_pscr |= MV643XX_ETH_SET_MII_SPEED_TO_100; - n_pscr |= MV643XX_ETH_MAX_RX_PACKET_1522BYTE; - } - - if (n_pscr != o_pscr) { - if ((o_pscr & MV643XX_ETH_SERIAL_PORT_ENABLE) == 0) - mv_write(MV643XX_ETH_PORT_SERIAL_CONTROL_REG(port_num), - n_pscr); - else { - queues = mv643xx_eth_port_disable_tx(port_num); - - o_pscr &= ~MV643XX_ETH_SERIAL_PORT_ENABLE; - mv_write(MV643XX_ETH_PORT_SERIAL_CONTROL_REG(port_num), - o_pscr); - mv_write(MV643XX_ETH_PORT_SERIAL_CONTROL_REG(port_num), - n_pscr); - mv_write(MV643XX_ETH_PORT_SERIAL_CONTROL_REG(port_num), - n_pscr); - if (queues) - mv643xx_eth_port_enable_tx(port_num, queues); - } - } -} - /* * mv643xx_eth_int_handler * @@ -517,52 +473,78 @@ static irqreturn_t mv643xx_eth_int_handler(int irq, void *dev_id, /* Read interrupt cause registers */ eth_int_cause = mv_read(MV643XX_ETH_INTERRUPT_CAUSE_REG(port_num)) & - ETH_INT_UNMASK_ALL; - if (eth_int_cause & ETH_INT_CAUSE_EXT) { + INT_UNMASK_ALL; + + if (eth_int_cause & BIT1) eth_int_cause_ext = mv_read( MV643XX_ETH_INTERRUPT_CAUSE_EXTEND_REG(port_num)) & - ETH_INT_UNMASK_ALL_EXT; - mv_write(MV643XX_ETH_INTERRUPT_CAUSE_EXTEND_REG(port_num), - ~eth_int_cause_ext); - } + INT_UNMASK_ALL_EXT; - /* PHY status changed */ - if (eth_int_cause_ext & ETH_INT_CAUSE_PHY) { - struct ethtool_cmd cmd; - - if (mii_link_ok(&mp->mii)) { - mii_ethtool_gset(&mp->mii, &cmd); - mv643xx_eth_update_pscr(dev, &cmd); - mv643xx_eth_port_enable_tx(port_num, - ETH_TX_QUEUES_ENABLED); - if (!netif_carrier_ok(dev)) { - netif_carrier_on(dev); - if (mp->tx_ring_size - mp->tx_desc_count >= - MAX_DESCS_PER_SKB) - netif_wake_queue(dev); - } - } else if (netif_carrier_ok(dev)) { - netif_stop_queue(dev); - netif_carrier_off(dev); +#ifdef MV643XX_NAPI + if (!(eth_int_cause & 0x0007fffd)) { + /* Dont ack the Rx interrupt */ +#endif + /* + * Clear specific ethernet port intrerrupt registers by + * acknowleding relevant bits. + */ + mv_write(MV643XX_ETH_INTERRUPT_CAUSE_REG(port_num), + ~eth_int_cause); + if (eth_int_cause_ext != 0x0) + mv_write(MV643XX_ETH_INTERRUPT_CAUSE_EXTEND_REG + (port_num), ~eth_int_cause_ext); + + /* UDP change : We may need this */ + if ((eth_int_cause_ext & 0x0000ffff) && + (mv643xx_eth_free_tx_queue(dev, eth_int_cause_ext) == 0) && + (mp->tx_ring_size > mp->tx_ring_skbs + MAX_DESCS_PER_SKB)) + netif_wake_queue(dev); +#ifdef MV643XX_NAPI + } else { + if (netif_rx_schedule_prep(dev)) { + /* Mask all the interrupts */ + mv_write(MV643XX_ETH_INTERRUPT_MASK_REG(port_num), + INT_MASK_ALL); + /* wait for previous write to complete */ + mv_read(MV643XX_ETH_INTERRUPT_MASK_REG(port_num)); + __netif_rx_schedule(dev); } - } +#else + if (eth_int_cause & (BIT2 | BIT11)) + mv643xx_eth_receive_queue(dev, 0); -#ifdef MV643XX_NAPI - if (eth_int_cause & ETH_INT_CAUSE_RX) { - /* schedule the NAPI poll routine to maintain port */ + /* + * After forwarded received packets to upper layer, add a task + * in an interrupts enabled context that refills the RX ring + * with skb's. + */ +#ifdef MV643XX_RX_QUEUE_FILL_ON_TASK + /* Mask all interrupts on ethernet port */ mv_write(MV643XX_ETH_INTERRUPT_MASK_REG(port_num), - ETH_INT_MASK_ALL); - /* wait for previous write to complete */ + INT_MASK_ALL); + /* wait for previous write to take effect */ mv_read(MV643XX_ETH_INTERRUPT_MASK_REG(port_num)); - netif_rx_schedule(dev); - } + queue_task(&mp->rx_task, &tq_immediate); + mark_bh(IMMEDIATE_BH); #else - if (eth_int_cause & ETH_INT_CAUSE_RX) - mv643xx_eth_receive_queue(dev, INT_MAX); + mp->rx_task.func(dev); #endif - if (eth_int_cause_ext & ETH_INT_CAUSE_TX) - mv643xx_eth_free_completed_tx_descs(dev); +#endif + } + /* PHY status changed */ + if (eth_int_cause_ext & (BIT16 | BIT20)) { + if (eth_port_link_is_up(port_num)) { + netif_carrier_on(dev); + netif_wake_queue(dev); + /* Start TX queue */ + mv_write(MV643XX_ETH_TRANSMIT_QUEUE_COMMAND_REG + (port_num), 1); + } else { + netif_carrier_off(dev); + netif_stop_queue(dev); + } + } /* * If no real interrupt occured, exit. @@ -688,6 +670,9 @@ static void ether_init_rx_desc_ring(struct mv643xx_private *mp) mp->rx_used_desc_q = 0; mp->rx_desc_area_size = rx_desc_num * sizeof(struct eth_rx_desc); + + /* Add the queue to the list of RX queues of this port */ + mp->port_rx_queue_command |= 1; } /* @@ -727,36 +712,14 @@ static void ether_init_tx_desc_ring(struct mv643xx_private *mp) mp->tx_curr_desc_q = 0; mp->tx_used_desc_q = 0; +#ifdef MV643XX_CHECKSUM_OFFLOAD_TX + mp->tx_first_desc_q = 0; +#endif mp->tx_desc_area_size = tx_desc_num * sizeof(struct eth_tx_desc); -} - -static int mv643xx_set_settings(struct net_device *dev, struct ethtool_cmd *cmd) -{ - struct mv643xx_private *mp = netdev_priv(dev); - int err; - - spin_lock_irq(&mp->lock); - err = mii_ethtool_sset(&mp->mii, cmd); - spin_unlock_irq(&mp->lock); - - return err; -} -static int mv643xx_get_settings(struct net_device *dev, struct ethtool_cmd *cmd) -{ - struct mv643xx_private *mp = netdev_priv(dev); - int err; - - spin_lock_irq(&mp->lock); - err = mii_ethtool_gset(&mp->mii, cmd); - spin_unlock_irq(&mp->lock); - - /* The PHY may support 1000baseT_Half, but the mv643xx does not */ - cmd->supported &= ~SUPPORTED_1000baseT_Half; - cmd->advertising &= ~ADVERTISED_1000baseT_Half; - - return err; + /* Add the queue to the list of Tx queues of this port */ + mp->port_tx_queue_command |= 1; } /* @@ -780,19 +743,30 @@ static int mv643xx_eth_open(struct net_device *dev) int err; err = request_irq(dev->irq, mv643xx_eth_int_handler, - IRQF_SHARED | IRQF_SAMPLE_RANDOM, dev->name, dev); + SA_SHIRQ | SA_SAMPLE_RANDOM, dev->name, dev); if (err) { printk(KERN_ERR "Can not assign IRQ number to MV643XX_eth%d\n", port_num); return -EAGAIN; } + /* Stop RX Queues */ + mv_write(MV643XX_ETH_RECEIVE_QUEUE_COMMAND_REG(port_num), 0x0000ff00); + + /* Set the MAC Address */ + memcpy(mp->port_mac_addr, dev->dev_addr, 6); + eth_port_init(mp); + INIT_WORK(&mp->rx_task, (void (*)(void *))mv643xx_eth_rx_task, dev); + memset(&mp->timeout, 0, sizeof(struct timer_list)); - mp->timeout.function = mv643xx_eth_rx_refill_descs_timer_wrapper; + mp->timeout.function = mv643xx_eth_rx_task_timer_wrapper; mp->timeout.data = (unsigned long)dev; + mp->rx_task_busy = 0; + mp->rx_timer_flag = 0; + /* Allocate RX and TX skb rings */ mp->rx_skb = kmalloc(sizeof(*mp->rx_skb) * mp->rx_ring_size, GFP_KERNEL); @@ -810,7 +784,7 @@ static int mv643xx_eth_open(struct net_device *dev) } /* Allocate TX ring */ - mp->tx_desc_count = 0; + mp->tx_ring_skbs = 0; size = mp->tx_ring_size * sizeof(struct eth_tx_desc); mp->tx_desc_area_size = size; @@ -835,7 +809,7 @@ static int mv643xx_eth_open(struct net_device *dev) ether_init_tx_desc_ring(mp); /* Allocate RX ring */ - mp->rx_desc_count = 0; + mp->rx_ring_skbs = 0; size = mp->rx_ring_size * sizeof(struct eth_rx_desc); mp->rx_desc_area_size = size; @@ -865,13 +839,9 @@ static int mv643xx_eth_open(struct net_device *dev) ether_init_rx_desc_ring(mp); - mv643xx_eth_rx_refill_descs(dev); /* Fill RX ring with skb's */ - - /* Clear any pending ethernet port interrupts */ - mv_write(MV643XX_ETH_INTERRUPT_CAUSE_REG(port_num), 0); - mv_write(MV643XX_ETH_INTERRUPT_CAUSE_EXTEND_REG(port_num), 0); + mv643xx_eth_rx_task(dev); /* Fill RX ring with skb's */ - eth_port_start(dev); + eth_port_start(mp); /* Interrupt Coalescing */ @@ -883,13 +853,16 @@ static int mv643xx_eth_open(struct net_device *dev) mp->tx_int_coal = eth_port_set_tx_coal(port_num, 133000000, MV643XX_TX_COAL); + /* Clear any pending ethernet port interrupts */ + mv_write(MV643XX_ETH_INTERRUPT_CAUSE_REG(port_num), 0); + mv_write(MV643XX_ETH_INTERRUPT_CAUSE_EXTEND_REG(port_num), 0); + /* Unmask phy and link status changes interrupts */ mv_write(MV643XX_ETH_INTERRUPT_EXTEND_MASK_REG(port_num), - ETH_INT_UNMASK_ALL_EXT); + INT_UNMASK_ALL_EXT); /* Unmask RX buffer and TX end interrupt */ - mv_write(MV643XX_ETH_INTERRUPT_MASK_REG(port_num), ETH_INT_UNMASK_ALL); - + mv_write(MV643XX_ETH_INTERRUPT_MASK_REG(port_num), INT_UNMASK_ALL); return 0; out_free_tx_skb: @@ -905,14 +878,25 @@ out_free_irq: static void mv643xx_eth_free_tx_rings(struct net_device *dev) { struct mv643xx_private *mp = netdev_priv(dev); + unsigned int port_num = mp->port_num; + unsigned int curr; + struct sk_buff *skb; /* Stop Tx Queues */ - mv643xx_eth_port_disable_tx(mp->port_num); - - /* Free outstanding skb's on TX ring */ - mv643xx_eth_free_all_tx_descs(dev); - - BUG_ON(mp->tx_used_desc_q != mp->tx_curr_desc_q); + mv_write(MV643XX_ETH_TRANSMIT_QUEUE_COMMAND_REG(port_num), 0x0000ff00); + + /* Free outstanding skb's on TX rings */ + for (curr = 0; mp->tx_ring_skbs && curr < mp->tx_ring_size; curr++) { + skb = mp->tx_skb[curr]; + if (skb) { + mp->tx_ring_skbs -= skb_shinfo(skb)->nr_frags; + dev_kfree_skb(skb); + mp->tx_ring_skbs--; + } + } + if (mp->tx_ring_skbs) + printk("%s: Error on Tx descriptor free - could not free %d" + " descriptors\n", dev->name, mp->tx_ring_skbs); /* Free TX ring */ if (mp->tx_sram_size) @@ -929,21 +913,21 @@ static void mv643xx_eth_free_rx_rings(struct net_device *dev) int curr; /* Stop RX Queues */ - mv643xx_eth_port_disable_rx(port_num); + mv_write(MV643XX_ETH_RECEIVE_QUEUE_COMMAND_REG(port_num), 0x0000ff00); /* Free preallocated skb's on RX rings */ - for (curr = 0; mp->rx_desc_count && curr < mp->rx_ring_size; curr++) { + for (curr = 0; mp->rx_ring_skbs && curr < mp->rx_ring_size; curr++) { if (mp->rx_skb[curr]) { dev_kfree_skb(mp->rx_skb[curr]); - mp->rx_desc_count--; + mp->rx_ring_skbs--; } } - if (mp->rx_desc_count) + if (mp->rx_ring_skbs) printk(KERN_ERR "%s: Error in freeing Rx Ring. %d skb's still" " stuck in RX Ring - ignoring them\n", dev->name, - mp->rx_desc_count); + mp->rx_ring_skbs); /* Free RX ring */ if (mp->rx_sram_size) iounmap(mp->p_rx_desc_area); @@ -968,7 +952,7 @@ static int mv643xx_eth_stop(struct net_device *dev) unsigned int port_num = mp->port_num; /* Mask all interrupts on ethernet port */ - mv_write(MV643XX_ETH_INTERRUPT_MASK_REG(port_num), ETH_INT_MASK_ALL); + mv_write(MV643XX_ETH_INTERRUPT_MASK_REG(port_num), INT_MASK_ALL); /* wait for previous write to complete */ mv_read(MV643XX_ETH_INTERRUPT_MASK_REG(port_num)); @@ -993,6 +977,30 @@ static int mv643xx_eth_stop(struct net_device *dev) } #ifdef MV643XX_NAPI +static void mv643xx_tx(struct net_device *dev) +{ + struct mv643xx_private *mp = netdev_priv(dev); + struct pkt_info pkt_info; + + while (eth_tx_return_desc(mp, &pkt_info) == ETH_OK) { + if (pkt_info.cmd_sts & ETH_TX_FIRST_DESC) + dma_unmap_single(NULL, pkt_info.buf_ptr, + pkt_info.byte_cnt, + DMA_TO_DEVICE); + else + dma_unmap_page(NULL, pkt_info.buf_ptr, + pkt_info.byte_cnt, + DMA_TO_DEVICE); + + if (pkt_info.return_info) + dev_kfree_skb_irq(pkt_info.return_info); + } + + if (netif_queue_stopped(dev) && + mp->tx_ring_size > mp->tx_ring_skbs + MAX_DESCS_PER_SKB) + netif_wake_queue(dev); +} + /* * mv643xx_poll * @@ -1006,7 +1014,7 @@ static int mv643xx_poll(struct net_device *dev, int *budget) #ifdef MV643XX_TX_FAST_REFILL if (++mp->tx_clean_threshold > 5) { - mv643xx_eth_free_completed_tx_descs(dev); + mv643xx_tx(dev); mp->tx_clean_threshold = 0; } #endif @@ -1017,6 +1025,7 @@ static int mv643xx_poll(struct net_device *dev, int *budget) if (orig_budget > dev->quota) orig_budget = dev->quota; work_done = mv643xx_eth_receive_queue(dev, orig_budget); + mp->rx_task.func(dev); *budget -= work_done; dev->quota -= work_done; if (work_done >= orig_budget) @@ -1028,17 +1037,14 @@ static int mv643xx_poll(struct net_device *dev, int *budget) mv_write(MV643XX_ETH_INTERRUPT_CAUSE_REG(port_num), 0); mv_write(MV643XX_ETH_INTERRUPT_CAUSE_EXTEND_REG(port_num), 0); mv_write(MV643XX_ETH_INTERRUPT_MASK_REG(port_num), - ETH_INT_UNMASK_ALL); + INT_UNMASK_ALL); } return done ? 0 : 1; } #endif -/** - * has_tiny_unaligned_frags - check if skb has any small, unaligned fragments - * - * Hardware can't handle unaligned fragments smaller than 9 bytes. +/* Hardware can't handle unaligned fragments smaller than 9 bytes. * This helper function detects that case. */ @@ -1055,154 +1061,53 @@ static inline unsigned int has_tiny_unaligned_frags(struct sk_buff *skb) return 0; } -/** - * eth_alloc_tx_desc_index - return the index of the next available tx desc - */ -static int eth_alloc_tx_desc_index(struct mv643xx_private *mp) -{ - int tx_desc_curr; - - BUG_ON(mp->tx_desc_count >= mp->tx_ring_size); - - tx_desc_curr = mp->tx_curr_desc_q; - mp->tx_curr_desc_q = (tx_desc_curr + 1) % mp->tx_ring_size; - - BUG_ON(mp->tx_curr_desc_q == mp->tx_used_desc_q); - - return tx_desc_curr; -} -/** - * eth_tx_fill_frag_descs - fill tx hw descriptors for an skb's fragments. +/* + * mv643xx_eth_start_xmit * - * Ensure the data for each fragment to be transmitted is mapped properly, - * then fill in descriptors in the tx hw queue. - */ -static void eth_tx_fill_frag_descs(struct mv643xx_private *mp, - struct sk_buff *skb) -{ - int frag; - int tx_index; - struct eth_tx_desc *desc; - - for (frag = 0; frag < skb_shinfo(skb)->nr_frags; frag++) { - skb_frag_t *this_frag = &skb_shinfo(skb)->frags[frag]; - - tx_index = eth_alloc_tx_desc_index(mp); - desc = &mp->p_tx_desc_area[tx_index]; - - desc->cmd_sts = ETH_BUFFER_OWNED_BY_DMA; - /* Last Frag enables interrupt and frees the skb */ - if (frag == (skb_shinfo(skb)->nr_frags - 1)) { - desc->cmd_sts |= ETH_ZERO_PADDING | - ETH_TX_LAST_DESC | - ETH_TX_ENABLE_INTERRUPT; - mp->tx_skb[tx_index] = skb; - } else - mp->tx_skb[tx_index] = 0; - - desc = &mp->p_tx_desc_area[tx_index]; - desc->l4i_chk = 0; - desc->byte_cnt = this_frag->size; - desc->buf_ptr = dma_map_page(NULL, this_frag->page, - this_frag->page_offset, - this_frag->size, - DMA_TO_DEVICE); - } -} - -/** - * eth_tx_submit_descs_for_skb - submit data from an skb to the tx hw + * This function is queues a packet in the Tx descriptor for + * required port. * - * Ensure the data for an skb to be transmitted is mapped properly, - * then fill in descriptors in the tx hw queue and start the hardware. - */ -static void eth_tx_submit_descs_for_skb(struct mv643xx_private *mp, - struct sk_buff *skb) -{ - int tx_index; - struct eth_tx_desc *desc; - u32 cmd_sts; - int length; - int nr_frags = skb_shinfo(skb)->nr_frags; - - cmd_sts = ETH_TX_FIRST_DESC | ETH_GEN_CRC | ETH_BUFFER_OWNED_BY_DMA; - - tx_index = eth_alloc_tx_desc_index(mp); - desc = &mp->p_tx_desc_area[tx_index]; - - if (nr_frags) { - eth_tx_fill_frag_descs(mp, skb); - - length = skb_headlen(skb); - mp->tx_skb[tx_index] = 0; - } else { - cmd_sts |= ETH_ZERO_PADDING | - ETH_TX_LAST_DESC | - ETH_TX_ENABLE_INTERRUPT; - length = skb->len; - mp->tx_skb[tx_index] = skb; - } - - desc->byte_cnt = length; - desc->buf_ptr = dma_map_single(NULL, skb->data, length, DMA_TO_DEVICE); - - if (skb->ip_summed == CHECKSUM_HW) { - BUG_ON(skb->protocol != ETH_P_IP); - - cmd_sts |= ETH_GEN_TCP_UDP_CHECKSUM | - ETH_GEN_IP_V_4_CHECKSUM | - skb->nh.iph->ihl << ETH_TX_IHL_SHIFT; - - switch (skb->nh.iph->protocol) { - case IPPROTO_UDP: - cmd_sts |= ETH_UDP_FRAME; - desc->l4i_chk = skb->h.uh->check; - break; - case IPPROTO_TCP: - desc->l4i_chk = skb->h.th->check; - break; - default: - BUG(); - } - } else { - /* Errata BTS #50, IHL must be 5 if no HW checksum */ - cmd_sts |= 5 << ETH_TX_IHL_SHIFT; - desc->l4i_chk = 0; - } - - /* ensure all other descriptors are written before first cmd_sts */ - wmb(); - desc->cmd_sts = cmd_sts; - - /* ensure all descriptors are written before poking hardware */ - wmb(); - mv643xx_eth_port_enable_tx(mp->port_num, ETH_TX_QUEUES_ENABLED); - - mp->tx_desc_count += nr_frags + 1; -} - -/** - * mv643xx_eth_start_xmit - queue an skb to the hardware for transmission + * Input : skb - a pointer to socket buffer + * dev - a pointer to the required port * + * Output : zero upon success */ static int mv643xx_eth_start_xmit(struct sk_buff *skb, struct net_device *dev) { struct mv643xx_private *mp = netdev_priv(dev); struct net_device_stats *stats = &mp->stats; + ETH_FUNC_RET_STATUS status; unsigned long flags; + struct pkt_info pkt_info; - BUG_ON(netif_queue_stopped(dev)); - BUG_ON(skb == NULL); + if (netif_queue_stopped(dev)) { + printk(KERN_ERR + "%s: Tried sending packet when interface is stopped\n", + dev->name); + return 1; + } - if (mp->tx_ring_size - mp->tx_desc_count < MAX_DESCS_PER_SKB) { - printk(KERN_ERR "%s: transmit with queue full\n", dev->name); + /* This is a hard error, log it. */ + if ((mp->tx_ring_size - mp->tx_ring_skbs) <= + (skb_shinfo(skb)->nr_frags + 1)) { netif_stop_queue(dev); + printk(KERN_ERR + "%s: Bug in mv643xx_eth - Trying to transmit when" + " queue full !\n", dev->name); + return 1; + } + + /* Paranoid check - this shouldn't happen */ + if (skb == NULL) { + stats->tx_dropped++; + printk(KERN_ERR "mv64320_eth paranoid check failed\n"); return 1; } +#ifdef MV643XX_CHECKSUM_OFFLOAD_TX if (has_tiny_unaligned_frags(skb)) { - if (__skb_linearize(skb)) { + if ((skb_linearize(skb, GFP_ATOMIC) != 0)) { stats->tx_dropped++; printk(KERN_DEBUG "%s: failed to linearize tiny " "unaligned fragment\n", dev->name); @@ -1212,14 +1117,167 @@ static int mv643xx_eth_start_xmit(struct sk_buff *skb, struct net_device *dev) spin_lock_irqsave(&mp->lock, flags); - eth_tx_submit_descs_for_skb(mp, skb); - stats->tx_bytes = skb->len; - stats->tx_packets++; - dev->trans_start = jiffies; + if (!skb_shinfo(skb)->nr_frags) { + if (skb->ip_summed != CHECKSUM_HW) { + /* Errata BTS #50, IHL must be 5 if no HW checksum */ + pkt_info.cmd_sts = ETH_TX_ENABLE_INTERRUPT | + ETH_TX_FIRST_DESC | + ETH_TX_LAST_DESC | + 5 << ETH_TX_IHL_SHIFT; + pkt_info.l4i_chk = 0; + } else { + pkt_info.cmd_sts = ETH_TX_ENABLE_INTERRUPT | + ETH_TX_FIRST_DESC | + ETH_TX_LAST_DESC | + ETH_GEN_TCP_UDP_CHECKSUM | + ETH_GEN_IP_V_4_CHECKSUM | + skb->nh.iph->ihl << ETH_TX_IHL_SHIFT; + /* CPU already calculated pseudo header checksum. */ + if ((skb->protocol == ETH_P_IP) && + (skb->nh.iph->protocol == IPPROTO_UDP) ) { + pkt_info.cmd_sts |= ETH_UDP_FRAME; + pkt_info.l4i_chk = skb->h.uh->check; + } else if ((skb->protocol == ETH_P_IP) && + (skb->nh.iph->protocol == IPPROTO_TCP)) + pkt_info.l4i_chk = skb->h.th->check; + else { + printk(KERN_ERR + "%s: chksum proto != IPv4 TCP or UDP\n", + dev->name); + spin_unlock_irqrestore(&mp->lock, flags); + return 1; + } + } + pkt_info.byte_cnt = skb->len; + pkt_info.buf_ptr = dma_map_single(NULL, skb->data, skb->len, + DMA_TO_DEVICE); + pkt_info.return_info = skb; + status = eth_port_send(mp, &pkt_info); + if ((status == ETH_ERROR) || (status == ETH_QUEUE_FULL)) + printk(KERN_ERR "%s: Error on transmitting packet\n", + dev->name); + stats->tx_bytes += pkt_info.byte_cnt; + } else { + unsigned int frag; + + /* first frag which is skb header */ + pkt_info.byte_cnt = skb_headlen(skb); + pkt_info.buf_ptr = dma_map_single(NULL, skb->data, + skb_headlen(skb), + DMA_TO_DEVICE); + pkt_info.l4i_chk = 0; + pkt_info.return_info = 0; + + if (skb->ip_summed != CHECKSUM_HW) + /* Errata BTS #50, IHL must be 5 if no HW checksum */ + pkt_info.cmd_sts = ETH_TX_FIRST_DESC | + 5 << ETH_TX_IHL_SHIFT; + else { + pkt_info.cmd_sts = ETH_TX_FIRST_DESC | + ETH_GEN_TCP_UDP_CHECKSUM | + ETH_GEN_IP_V_4_CHECKSUM | + skb->nh.iph->ihl << ETH_TX_IHL_SHIFT; + /* CPU already calculated pseudo header checksum. */ + if ((skb->protocol == ETH_P_IP) && + (skb->nh.iph->protocol == IPPROTO_UDP)) { + pkt_info.cmd_sts |= ETH_UDP_FRAME; + pkt_info.l4i_chk = skb->h.uh->check; + } else if ((skb->protocol == ETH_P_IP) && + (skb->nh.iph->protocol == IPPROTO_TCP)) + pkt_info.l4i_chk = skb->h.th->check; + else { + printk(KERN_ERR + "%s: chksum proto != IPv4 TCP or UDP\n", + dev->name); + spin_unlock_irqrestore(&mp->lock, flags); + return 1; + } + } + + status = eth_port_send(mp, &pkt_info); + if (status != ETH_OK) { + if ((status == ETH_ERROR)) + printk(KERN_ERR + "%s: Error on transmitting packet\n", + dev->name); + if (status == ETH_QUEUE_FULL) + printk("Error on Queue Full \n"); + if (status == ETH_QUEUE_LAST_RESOURCE) + printk("Tx resource error \n"); + } + stats->tx_bytes += pkt_info.byte_cnt; + + /* Check for the remaining frags */ + for (frag = 0; frag < skb_shinfo(skb)->nr_frags; frag++) { + skb_frag_t *this_frag = &skb_shinfo(skb)->frags[frag]; + pkt_info.l4i_chk = 0x0000; + pkt_info.cmd_sts = 0x00000000; + + /* Last Frag enables interrupt and frees the skb */ + if (frag == (skb_shinfo(skb)->nr_frags - 1)) { + pkt_info.cmd_sts |= ETH_TX_ENABLE_INTERRUPT | + ETH_TX_LAST_DESC; + pkt_info.return_info = skb; + } else { + pkt_info.return_info = 0; + } + pkt_info.l4i_chk = 0; + pkt_info.byte_cnt = this_frag->size; + + pkt_info.buf_ptr = dma_map_page(NULL, this_frag->page, + this_frag->page_offset, + this_frag->size, + DMA_TO_DEVICE); + + status = eth_port_send(mp, &pkt_info); + + if (status != ETH_OK) { + if ((status == ETH_ERROR)) + printk(KERN_ERR "%s: Error on " + "transmitting packet\n", + dev->name); + + if (status == ETH_QUEUE_LAST_RESOURCE) + printk("Tx resource error \n"); + + if (status == ETH_QUEUE_FULL) + printk("Queue is full \n"); + } + stats->tx_bytes += pkt_info.byte_cnt; + } + } +#else + spin_lock_irqsave(&mp->lock, flags); - if (mp->tx_ring_size - mp->tx_desc_count < MAX_DESCS_PER_SKB) + pkt_info.cmd_sts = ETH_TX_ENABLE_INTERRUPT | ETH_TX_FIRST_DESC | + ETH_TX_LAST_DESC; + pkt_info.l4i_chk = 0; + pkt_info.byte_cnt = skb->len; + pkt_info.buf_ptr = dma_map_single(NULL, skb->data, skb->len, + DMA_TO_DEVICE); + pkt_info.return_info = skb; + status = eth_port_send(mp, &pkt_info); + if ((status == ETH_ERROR) || (status == ETH_QUEUE_FULL)) + printk(KERN_ERR "%s: Error on transmitting packet\n", + dev->name); + stats->tx_bytes += pkt_info.byte_cnt; +#endif + + /* Check if TX queue can handle another skb. If not, then + * signal higher layers to stop requesting TX + */ + if (mp->tx_ring_size <= (mp->tx_ring_skbs + MAX_DESCS_PER_SKB)) + /* + * Stop getting skb's from upper layers. + * Getting skb's from upper layers will be enabled again after + * packets are released. + */ netif_stop_queue(dev); + /* Update statistics and start of transmittion time */ + stats->tx_packets++; + dev->trans_start = jiffies; + spin_unlock_irqrestore(&mp->lock, flags); return 0; /* success */ @@ -1248,45 +1306,16 @@ static void mv643xx_netpoll(struct net_device *netdev) struct mv643xx_private *mp = netdev_priv(netdev); int port_num = mp->port_num; - mv_write(MV643XX_ETH_INTERRUPT_MASK_REG(port_num), ETH_INT_MASK_ALL); + mv_write(MV643XX_ETH_INTERRUPT_MASK_REG(port_num), INT_MASK_ALL); /* wait for previous write to complete */ mv_read(MV643XX_ETH_INTERRUPT_MASK_REG(port_num)); mv643xx_eth_int_handler(netdev->irq, netdev, NULL); - mv_write(MV643XX_ETH_INTERRUPT_MASK_REG(port_num), ETH_INT_UNMASK_ALL); + mv_write(MV643XX_ETH_INTERRUPT_MASK_REG(port_num), INT_UNMASK_ALL); } #endif -static void mv643xx_init_ethtool_cmd(struct net_device *dev, int phy_address, - int speed, int duplex, - struct ethtool_cmd *cmd) -{ - struct mv643xx_private *mp = netdev_priv(dev); - - memset(cmd, 0, sizeof(*cmd)); - - cmd->port = PORT_MII; - cmd->transceiver = XCVR_INTERNAL; - cmd->phy_address = phy_address; - - if (speed == 0) { - cmd->autoneg = AUTONEG_ENABLE; - /* mii lib checks, but doesn't use speed on AUTONEG_ENABLE */ - cmd->speed = SPEED_100; - cmd->advertising = ADVERTISED_10baseT_Half | - ADVERTISED_10baseT_Full | - ADVERTISED_100baseT_Half | - ADVERTISED_100baseT_Full; - if (mp->mii.supports_gmii) - cmd->advertising |= ADVERTISED_1000baseT_Full; - } else { - cmd->autoneg = AUTONEG_DISABLE; - cmd->speed = speed; - cmd->duplex = duplex; - } -} - /*/ * mv643xx_eth_probe * @@ -1307,9 +1336,6 @@ static int mv643xx_eth_probe(struct platform_device *pdev) u8 *p; struct resource *res; int err; - struct ethtool_cmd cmd; - int duplex = DUPLEX_HALF; - int speed = 0; /* default to auto-negotiation */ dev = alloc_etherdev(sizeof(struct mv643xx_private)); if (!dev) @@ -1347,7 +1373,6 @@ static int mv643xx_eth_probe(struct platform_device *pdev) dev->tx_queue_len = mp->tx_ring_size; dev->base_addr = 0; dev->change_mtu = mv643xx_eth_change_mtu; - dev->do_ioctl = mv643xx_eth_do_ioctl; SET_ETHTOOL_OPS(dev, &mv643xx_ethtool_ops); #ifdef MV643XX_CHECKSUM_OFFLOAD_TX @@ -1368,17 +1393,33 @@ static int mv643xx_eth_probe(struct platform_device *pdev) /* set default config values */ eth_port_uc_addr_get(dev, dev->dev_addr); + mp->port_config = MV643XX_ETH_PORT_CONFIG_DEFAULT_VALUE; + mp->port_config_extend = MV643XX_ETH_PORT_CONFIG_EXTEND_DEFAULT_VALUE; + mp->port_sdma_config = MV643XX_ETH_PORT_SDMA_CONFIG_DEFAULT_VALUE; + mp->port_serial_control = MV643XX_ETH_PORT_SERIAL_CONTROL_DEFAULT_VALUE; mp->rx_ring_size = MV643XX_ETH_PORT_DEFAULT_RECEIVE_QUEUE_SIZE; mp->tx_ring_size = MV643XX_ETH_PORT_DEFAULT_TRANSMIT_QUEUE_SIZE; pd = pdev->dev.platform_data; if (pd) { - if (pd->mac_addr) + if (pd->mac_addr != NULL) memcpy(dev->dev_addr, pd->mac_addr, 6); if (pd->phy_addr || pd->force_phy_addr) ethernet_phy_set(port_num, pd->phy_addr); + if (pd->port_config || pd->force_port_config) + mp->port_config = pd->port_config; + + if (pd->port_config_extend || pd->force_port_config_extend) + mp->port_config_extend = pd->port_config_extend; + + if (pd->port_sdma_config || pd->force_port_sdma_config) + mp->port_sdma_config = pd->port_sdma_config; + + if (pd->port_serial_control || pd->force_port_serial_control) + mp->port_serial_control = pd->port_serial_control; + if (pd->rx_queue_size) mp->rx_ring_size = pd->rx_queue_size; @@ -1394,35 +1435,16 @@ static int mv643xx_eth_probe(struct platform_device *pdev) mp->rx_sram_size = pd->rx_sram_size; mp->rx_sram_addr = pd->rx_sram_addr; } - - duplex = pd->duplex; - speed = pd->speed; } - /* Hook up MII support for ethtool */ - mp->mii.dev = dev; - mp->mii.mdio_read = mv643xx_mdio_read; - mp->mii.mdio_write = mv643xx_mdio_write; - mp->mii.phy_id = ethernet_phy_get(port_num); - mp->mii.phy_id_mask = 0x3f; - mp->mii.reg_num_mask = 0x1f; - err = ethernet_phy_detect(port_num); if (err) { pr_debug("MV643xx ethernet port %d: " "No PHY detected at addr %d\n", port_num, ethernet_phy_get(port_num)); - goto out; + return err; } - ethernet_phy_reset(port_num); - mp->mii.supports_gmii = mii_check_gmii_support(&mp->mii); - mv643xx_init_ethtool_cmd(dev, mp->mii.phy_id, speed, duplex, &cmd); - mv643xx_eth_update_pscr(dev, &cmd); - mv643xx_set_settings(dev, &cmd); - - SET_MODULE_OWNER(dev); - SET_NETDEV_DEV(dev, &pdev->dev); err = register_netdev(dev); if (err) goto out; @@ -1667,9 +1689,26 @@ MODULE_DESCRIPTION("Ethernet driver for Marvell MV643XX"); * to the Rx descriptor ring to enable the reuse of this source. * Return Rx resource is done using the eth_rx_return_buff API. * + * Transmit operation: + * The eth_port_send API supports Scatter-Gather which enables to + * send a packet spanned over multiple buffers. This means that + * for each packet info structure given by the user and put into + * the Tx descriptors ring, will be transmitted only if the 'LAST' + * bit will be set in the packet info command status field. This + * API also consider restriction regarding buffer alignments and + * sizes. + * The user must return a Tx resource after ensuring the buffer + * has been transmitted to enable the Tx ring indexes to update. + * + * BOARD LAYOUT + * This device is on-board. No jumper diagram is necessary. + * + * EXTERNAL INTERFACE + * * Prior to calling the initialization routine eth_port_init() the user * must set the following fields under mv643xx_private struct: * port_num User Ethernet port number. + * port_mac_addr[6] User defined port MAC address. * port_config User port configuration value. * port_config_extend User port config extend value. * port_sdma_config User port SDMA config value. @@ -1686,12 +1725,20 @@ MODULE_DESCRIPTION("Ethernet driver for Marvell MV643XX"); * return_info Tx/Rx user resource return information. */ -/* PHY routines */ +/* defines */ +/* SDMA command macros */ +#define ETH_ENABLE_TX_QUEUE(eth_port) \ + mv_write(MV643XX_ETH_TRANSMIT_QUEUE_COMMAND_REG(eth_port), 1) + +/* locals */ + +/* PHY routines */ static int ethernet_phy_get(unsigned int eth_port_num); static void ethernet_phy_set(unsigned int eth_port_num, int phy_addr); /* Ethernet Port routines */ -static void eth_port_set_filter_table_entry(int table, unsigned char entry); +static int eth_port_uc_addr(unsigned int eth_port_num, unsigned char uc_nibble, + int option); /* * eth_port_init - Initialize the Ethernet port driver @@ -1719,11 +1766,17 @@ static void eth_port_set_filter_table_entry(int table, unsigned char entry); */ static void eth_port_init(struct mv643xx_private *mp) { + mp->port_rx_queue_command = 0; + mp->port_tx_queue_command = 0; + mp->rx_resource_err = 0; + mp->tx_resource_err = 0; eth_port_reset(mp->port_num); eth_port_init_mac_tables(mp->port_num); + + ethernet_phy_reset(mp->port_num); } /* @@ -1745,7 +1798,7 @@ static void eth_port_init(struct mv643xx_private *mp) * and ether_init_rx_desc_ring for Rx queues). * * INPUT: - * dev - a pointer to the required interface + * struct mv643xx_private *mp Ethernet port control struct * * OUTPUT: * Ethernet port is ready to receive and transmit. @@ -1753,13 +1806,10 @@ static void eth_port_init(struct mv643xx_private *mp) * RETURN: * None. */ -static void eth_port_start(struct net_device *dev) +static void eth_port_start(struct mv643xx_private *mp) { - struct mv643xx_private *mp = netdev_priv(dev); unsigned int port_num = mp->port_num; int tx_curr_desc, rx_curr_desc; - u32 pscr; - struct ethtool_cmd ethtool_cmd; /* Assignment of Tx CTRP of given queue */ tx_curr_desc = mp->tx_curr_desc_q; @@ -1772,45 +1822,37 @@ static void eth_port_start(struct net_device *dev) (u32)((struct eth_rx_desc *)mp->rx_desc_dma + rx_curr_desc)); /* Add the assigned Ethernet address to the port's address table */ - eth_port_uc_addr_set(port_num, dev->dev_addr); + eth_port_uc_addr_set(port_num, mp->port_mac_addr); /* Assign port configuration and command. */ - mv_write(MV643XX_ETH_PORT_CONFIG_REG(port_num), - MV643XX_ETH_PORT_CONFIG_DEFAULT_VALUE); + mv_write(MV643XX_ETH_PORT_CONFIG_REG(port_num), mp->port_config); mv_write(MV643XX_ETH_PORT_CONFIG_EXTEND_REG(port_num), - MV643XX_ETH_PORT_CONFIG_EXTEND_DEFAULT_VALUE); - - pscr = mv_read(MV643XX_ETH_PORT_SERIAL_CONTROL_REG(port_num)); + mp->port_config_extend); - pscr &= ~(MV643XX_ETH_SERIAL_PORT_ENABLE | MV643XX_ETH_FORCE_LINK_PASS); - mv_write(MV643XX_ETH_PORT_SERIAL_CONTROL_REG(port_num), pscr); - pscr |= MV643XX_ETH_DISABLE_AUTO_NEG_FOR_FLOW_CTRL | - MV643XX_ETH_DISABLE_AUTO_NEG_SPEED_GMII | - MV643XX_ETH_DISABLE_AUTO_NEG_FOR_DUPLX | - MV643XX_ETH_DO_NOT_FORCE_LINK_FAIL | - MV643XX_ETH_SERIAL_PORT_CONTROL_RESERVED; - - mv_write(MV643XX_ETH_PORT_SERIAL_CONTROL_REG(port_num), pscr); + /* Increase the Rx side buffer size if supporting GigE */ + if (mp->port_serial_control & MV643XX_ETH_SET_GMII_SPEED_TO_1000) + mv_write(MV643XX_ETH_PORT_SERIAL_CONTROL_REG(port_num), + (mp->port_serial_control & 0xfff1ffff) | (0x5 << 17)); + else + mv_write(MV643XX_ETH_PORT_SERIAL_CONTROL_REG(port_num), + mp->port_serial_control); - pscr |= MV643XX_ETH_SERIAL_PORT_ENABLE; - mv_write(MV643XX_ETH_PORT_SERIAL_CONTROL_REG(port_num), pscr); + mv_write(MV643XX_ETH_PORT_SERIAL_CONTROL_REG(port_num), + mv_read(MV643XX_ETH_PORT_SERIAL_CONTROL_REG(port_num)) | + MV643XX_ETH_SERIAL_PORT_ENABLE); /* Assign port SDMA configuration */ mv_write(MV643XX_ETH_SDMA_CONFIG_REG(port_num), - MV643XX_ETH_PORT_SDMA_CONFIG_DEFAULT_VALUE); + mp->port_sdma_config); /* Enable port Rx. */ - mv643xx_eth_port_enable_rx(port_num, ETH_RX_QUEUES_ENABLED); + mv_write(MV643XX_ETH_RECEIVE_QUEUE_COMMAND_REG(port_num), + mp->port_rx_queue_command); /* Disable port bandwidth limits by clearing MTU register */ mv_write(MV643XX_ETH_MAXIMUM_TRANSMIT_UNIT(port_num), 0); - - /* save phy settings across reset */ - mv643xx_get_settings(dev, ðtool_cmd); - ethernet_phy_reset(mp->port_num); - mv643xx_set_settings(dev, ðtool_cmd); } /* @@ -1824,9 +1866,8 @@ static void eth_port_start(struct net_device *dev) * char * p_addr Address to be set * * OUTPUT: - * Set MAC address low and high registers. also calls - * eth_port_set_filter_table_entry() to set the unicast - * table with the proper information. + * Set MAC address low and high registers. also calls eth_port_uc_addr() + * To set the unicast table with the proper information. * * RETURN: * N/A. @@ -1837,7 +1878,6 @@ static void eth_port_uc_addr_set(unsigned int eth_port_num, { unsigned int mac_h; unsigned int mac_l; - int table; mac_l = (p_addr[4] << 8) | (p_addr[5]); mac_h = (p_addr[0] << 24) | (p_addr[1] << 16) | (p_addr[2] << 8) | @@ -1847,8 +1887,9 @@ static void eth_port_uc_addr_set(unsigned int eth_port_num, mv_write(MV643XX_ETH_MAC_ADDR_HIGH(eth_port_num), mac_h); /* Accept frames of this address */ - table = MV643XX_ETH_DA_FILTER_UNICAST_TABLE_BASE(eth_port_num); - eth_port_set_filter_table_entry(table, p_addr[5] & 0x0f); + eth_port_uc_addr(eth_port_num, p_addr[5], ACCEPT_MAC_ADDR); + + return; } /* @@ -1886,6 +1927,72 @@ static void eth_port_uc_addr_get(struct net_device *dev, unsigned char *p_addr) p_addr[5] = mac_l & 0xff; } +/* + * eth_port_uc_addr - This function Set the port unicast address table + * + * DESCRIPTION: + * This function locates the proper entry in the Unicast table for the + * specified MAC nibble and sets its properties according to function + * parameters. + * + * INPUT: + * unsigned int eth_port_num Port number. + * unsigned char uc_nibble Unicast MAC Address last nibble. + * int option 0 = Add, 1 = remove address. + * + * OUTPUT: + * This function add/removes MAC addresses from the port unicast address + * table. + * + * RETURN: + * true is output succeeded. + * false if option parameter is invalid. + * + */ +static int eth_port_uc_addr(unsigned int eth_port_num, unsigned char uc_nibble, + int option) +{ + unsigned int unicast_reg; + unsigned int tbl_offset; + unsigned int reg_offset; + + /* Locate the Unicast table entry */ + uc_nibble = (0xf & uc_nibble); + tbl_offset = (uc_nibble / 4) * 4; /* Register offset from unicast table base */ + reg_offset = uc_nibble % 4; /* Entry offset within the above register */ + + switch (option) { + case REJECT_MAC_ADDR: + /* Clear accepts frame bit at given unicast DA table entry */ + unicast_reg = mv_read((MV643XX_ETH_DA_FILTER_UNICAST_TABLE_BASE + (eth_port_num) + tbl_offset)); + + unicast_reg &= (0x0E << (8 * reg_offset)); + + mv_write((MV643XX_ETH_DA_FILTER_UNICAST_TABLE_BASE + (eth_port_num) + tbl_offset), unicast_reg); + break; + + case ACCEPT_MAC_ADDR: + /* Set accepts frame bit at unicast DA filter table entry */ + unicast_reg = + mv_read((MV643XX_ETH_DA_FILTER_UNICAST_TABLE_BASE + (eth_port_num) + tbl_offset)); + + unicast_reg |= (0x01 << (8 * reg_offset)); + + mv_write((MV643XX_ETH_DA_FILTER_UNICAST_TABLE_BASE + (eth_port_num) + tbl_offset), unicast_reg); + + break; + + default: + return 0; + } + + return 1; +} + /* * The entries in each table are indexed by a hash of a packet's MAC * address. One bit in each entry determines whether the packet is @@ -2098,8 +2205,8 @@ static void eth_port_init_mac_tables(unsigned int eth_port_num) /* Clear DA filter unicast table (Ex_dFUT) */ for (table_index = 0; table_index <= 0xC; table_index += 4) - mv_write(MV643XX_ETH_DA_FILTER_UNICAST_TABLE_BASE - (eth_port_num) + table_index, 0); + mv_write((MV643XX_ETH_DA_FILTER_UNICAST_TABLE_BASE + (eth_port_num) + table_index), 0); for (table_index = 0; table_index <= 0xFC; table_index += 4) { /* Clear DA filter special multicast table (Ex_dFSMT) */ @@ -2282,73 +2389,6 @@ static void ethernet_phy_reset(unsigned int eth_port_num) eth_port_read_smi_reg(eth_port_num, 0, &phy_reg_data); phy_reg_data |= 0x8000; /* Set bit 15 to reset the PHY */ eth_port_write_smi_reg(eth_port_num, 0, phy_reg_data); - - /* wait for PHY to come out of reset */ - do { - udelay(1); - eth_port_read_smi_reg(eth_port_num, 0, &phy_reg_data); - } while (phy_reg_data & 0x8000); -} - -static void mv643xx_eth_port_enable_tx(unsigned int port_num, - unsigned int queues) -{ - mv_write(MV643XX_ETH_TRANSMIT_QUEUE_COMMAND_REG(port_num), queues); -} - -static void mv643xx_eth_port_enable_rx(unsigned int port_num, - unsigned int queues) -{ - mv_write(MV643XX_ETH_RECEIVE_QUEUE_COMMAND_REG(port_num), queues); -} - -static unsigned int mv643xx_eth_port_disable_tx(unsigned int port_num) -{ - u32 queues; - - /* Stop Tx port activity. Check port Tx activity. */ - queues = mv_read(MV643XX_ETH_TRANSMIT_QUEUE_COMMAND_REG(port_num)) - & 0xFF; - if (queues) { - /* Issue stop command for active queues only */ - mv_write(MV643XX_ETH_TRANSMIT_QUEUE_COMMAND_REG(port_num), - (queues << 8)); - - /* Wait for all Tx activity to terminate. */ - /* Check port cause register that all Tx queues are stopped */ - while (mv_read(MV643XX_ETH_TRANSMIT_QUEUE_COMMAND_REG(port_num)) - & 0xFF) - udelay(PHY_WAIT_MICRO_SECONDS); - - /* Wait for Tx FIFO to empty */ - while (mv_read(MV643XX_ETH_PORT_STATUS_REG(port_num)) & - ETH_PORT_TX_FIFO_EMPTY) - udelay(PHY_WAIT_MICRO_SECONDS); - } - - return queues; -} - -static unsigned int mv643xx_eth_port_disable_rx(unsigned int port_num) -{ - u32 queues; - - /* Stop Rx port activity. Check port Rx activity. */ - queues = mv_read(MV643XX_ETH_RECEIVE_QUEUE_COMMAND_REG(port_num)) - & 0xFF; - if (queues) { - /* Issue stop command for active queues only */ - mv_write(MV643XX_ETH_RECEIVE_QUEUE_COMMAND_REG(port_num), - (queues << 8)); - - /* Wait for all Rx activity to terminate. */ - /* Check port cause register that all Rx queues are stopped */ - while (mv_read(MV643XX_ETH_RECEIVE_QUEUE_COMMAND_REG(port_num)) - & 0xFF) - udelay(PHY_WAIT_MICRO_SECONDS); - } - - return queues; } /* @@ -2373,21 +2413,70 @@ static void eth_port_reset(unsigned int port_num) { unsigned int reg_data; - mv643xx_eth_port_disable_tx(port_num); - mv643xx_eth_port_disable_rx(port_num); + /* Stop Tx port activity. Check port Tx activity. */ + reg_data = mv_read(MV643XX_ETH_TRANSMIT_QUEUE_COMMAND_REG(port_num)); + + if (reg_data & 0xFF) { + /* Issue stop command for active channels only */ + mv_write(MV643XX_ETH_TRANSMIT_QUEUE_COMMAND_REG(port_num), + (reg_data << 8)); + + /* Wait for all Tx activity to terminate. */ + /* Check port cause register that all Tx queues are stopped */ + while (mv_read(MV643XX_ETH_TRANSMIT_QUEUE_COMMAND_REG(port_num)) + & 0xFF) + udelay(10); + } + + /* Stop Rx port activity. Check port Rx activity. */ + reg_data = mv_read(MV643XX_ETH_RECEIVE_QUEUE_COMMAND_REG(port_num)); + + if (reg_data & 0xFF) { + /* Issue stop command for active channels only */ + mv_write(MV643XX_ETH_RECEIVE_QUEUE_COMMAND_REG(port_num), + (reg_data << 8)); + + /* Wait for all Rx activity to terminate. */ + /* Check port cause register that all Rx queues are stopped */ + while (mv_read(MV643XX_ETH_RECEIVE_QUEUE_COMMAND_REG(port_num)) + & 0xFF) + udelay(10); + } /* Clear all MIB counters */ eth_clear_mib_counters(port_num); /* Reset the Enable bit in the Configuration Register */ reg_data = mv_read(MV643XX_ETH_PORT_SERIAL_CONTROL_REG(port_num)); - reg_data &= ~(MV643XX_ETH_SERIAL_PORT_ENABLE | - MV643XX_ETH_DO_NOT_FORCE_LINK_FAIL | - MV643XX_ETH_FORCE_LINK_PASS); + reg_data &= ~MV643XX_ETH_SERIAL_PORT_ENABLE; mv_write(MV643XX_ETH_PORT_SERIAL_CONTROL_REG(port_num), reg_data); } +static int eth_port_autoneg_supported(unsigned int eth_port_num) +{ + unsigned int phy_reg_data0; + + eth_port_read_smi_reg(eth_port_num, 0, &phy_reg_data0); + + return phy_reg_data0 & 0x1000; +} + +static int eth_port_link_is_up(unsigned int eth_port_num) +{ + unsigned int phy_reg_data1; + + eth_port_read_smi_reg(eth_port_num, 1, &phy_reg_data1); + + if (eth_port_autoneg_supported(eth_port_num)) { + if (phy_reg_data1 & 0x20) /* auto-neg complete */ + return 1; + } else if (phy_reg_data1 & 0x4) /* link up */ + return 1; + + return 0; +} + /* * eth_port_read_smi_reg - Read PHY registers * @@ -2493,21 +2582,250 @@ out: } /* - * Wrappers for MII support library. + * eth_port_send - Send an Ethernet packet + * + * DESCRIPTION: + * This routine send a given packet described by p_pktinfo parameter. It + * supports transmitting of a packet spaned over multiple buffers. The + * routine updates 'curr' and 'first' indexes according to the packet + * segment passed to the routine. In case the packet segment is first, + * the 'first' index is update. In any case, the 'curr' index is updated. + * If the routine get into Tx resource error it assigns 'curr' index as + * 'first'. This way the function can abort Tx process of multiple + * descriptors per packet. + * + * INPUT: + * struct mv643xx_private *mp Ethernet Port Control srtuct. + * struct pkt_info *p_pkt_info User packet buffer. + * + * OUTPUT: + * Tx ring 'curr' and 'first' indexes are updated. + * + * RETURN: + * ETH_QUEUE_FULL in case of Tx resource error. + * ETH_ERROR in case the routine can not access Tx desc ring. + * ETH_QUEUE_LAST_RESOURCE if the routine uses the last Tx resource. + * ETH_OK otherwise. + * + */ +#ifdef MV643XX_CHECKSUM_OFFLOAD_TX +/* + * Modified to include the first descriptor pointer in case of SG */ -static int mv643xx_mdio_read(struct net_device *dev, int phy_id, int location) +static ETH_FUNC_RET_STATUS eth_port_send(struct mv643xx_private *mp, + struct pkt_info *p_pkt_info) { - int val; - struct mv643xx_private *mp = netdev_priv(dev); + int tx_desc_curr, tx_desc_used, tx_first_desc, tx_next_desc; + struct eth_tx_desc *current_descriptor; + struct eth_tx_desc *first_descriptor; + u32 command; + + /* Do not process Tx ring in case of Tx ring resource error */ + if (mp->tx_resource_err) + return ETH_QUEUE_FULL; - eth_port_read_smi_reg(mp->port_num, location, &val); - return val; + /* + * The hardware requires that each buffer that is <= 8 bytes + * in length must be aligned on an 8 byte boundary. + */ + if (p_pkt_info->byte_cnt <= 8 && p_pkt_info->buf_ptr & 0x7) { + printk(KERN_ERR + "mv643xx_eth port %d: packet size <= 8 problem\n", + mp->port_num); + return ETH_ERROR; + } + + mp->tx_ring_skbs++; + BUG_ON(mp->tx_ring_skbs > mp->tx_ring_size); + + /* Get the Tx Desc ring indexes */ + tx_desc_curr = mp->tx_curr_desc_q; + tx_desc_used = mp->tx_used_desc_q; + + current_descriptor = &mp->p_tx_desc_area[tx_desc_curr]; + + tx_next_desc = (tx_desc_curr + 1) % mp->tx_ring_size; + + current_descriptor->buf_ptr = p_pkt_info->buf_ptr; + current_descriptor->byte_cnt = p_pkt_info->byte_cnt; + current_descriptor->l4i_chk = p_pkt_info->l4i_chk; + mp->tx_skb[tx_desc_curr] = p_pkt_info->return_info; + + command = p_pkt_info->cmd_sts | ETH_ZERO_PADDING | ETH_GEN_CRC | + ETH_BUFFER_OWNED_BY_DMA; + if (command & ETH_TX_FIRST_DESC) { + tx_first_desc = tx_desc_curr; + mp->tx_first_desc_q = tx_first_desc; + first_descriptor = current_descriptor; + mp->tx_first_command = command; + } else { + tx_first_desc = mp->tx_first_desc_q; + first_descriptor = &mp->p_tx_desc_area[tx_first_desc]; + BUG_ON(first_descriptor == NULL); + current_descriptor->cmd_sts = command; + } + + if (command & ETH_TX_LAST_DESC) { + wmb(); + first_descriptor->cmd_sts = mp->tx_first_command; + + wmb(); + ETH_ENABLE_TX_QUEUE(mp->port_num); + + /* + * Finish Tx packet. Update first desc in case of Tx resource + * error */ + tx_first_desc = tx_next_desc; + mp->tx_first_desc_q = tx_first_desc; + } + + /* Check for ring index overlap in the Tx desc ring */ + if (tx_next_desc == tx_desc_used) { + mp->tx_resource_err = 1; + mp->tx_curr_desc_q = tx_first_desc; + + return ETH_QUEUE_LAST_RESOURCE; + } + + mp->tx_curr_desc_q = tx_next_desc; + + return ETH_OK; } +#else +static ETH_FUNC_RET_STATUS eth_port_send(struct mv643xx_private *mp, + struct pkt_info *p_pkt_info) +{ + int tx_desc_curr; + int tx_desc_used; + struct eth_tx_desc *current_descriptor; + unsigned int command_status; + + /* Do not process Tx ring in case of Tx ring resource error */ + if (mp->tx_resource_err) + return ETH_QUEUE_FULL; + + mp->tx_ring_skbs++; + BUG_ON(mp->tx_ring_skbs > mp->tx_ring_size); + + /* Get the Tx Desc ring indexes */ + tx_desc_curr = mp->tx_curr_desc_q; + tx_desc_used = mp->tx_used_desc_q; + current_descriptor = &mp->p_tx_desc_area[tx_desc_curr]; + + command_status = p_pkt_info->cmd_sts | ETH_ZERO_PADDING | ETH_GEN_CRC; + current_descriptor->buf_ptr = p_pkt_info->buf_ptr; + current_descriptor->byte_cnt = p_pkt_info->byte_cnt; + mp->tx_skb[tx_desc_curr] = p_pkt_info->return_info; + + /* Set last desc with DMA ownership and interrupt enable. */ + wmb(); + current_descriptor->cmd_sts = command_status | + ETH_BUFFER_OWNED_BY_DMA | ETH_TX_ENABLE_INTERRUPT; -static void mv643xx_mdio_write(struct net_device *dev, int phy_id, int location, int val) + wmb(); + ETH_ENABLE_TX_QUEUE(mp->port_num); + + /* Finish Tx packet. Update first desc in case of Tx resource error */ + tx_desc_curr = (tx_desc_curr + 1) % mp->tx_ring_size; + + /* Update the current descriptor */ + mp->tx_curr_desc_q = tx_desc_curr; + + /* Check for ring index overlap in the Tx desc ring */ + if (tx_desc_curr == tx_desc_used) { + mp->tx_resource_err = 1; + return ETH_QUEUE_LAST_RESOURCE; + } + + return ETH_OK; +} +#endif + +/* + * eth_tx_return_desc - Free all used Tx descriptors + * + * DESCRIPTION: + * This routine returns the transmitted packet information to the caller. + * It uses the 'first' index to support Tx desc return in case a transmit + * of a packet spanned over multiple buffer still in process. + * In case the Tx queue was in "resource error" condition, where there are + * no available Tx resources, the function resets the resource error flag. + * + * INPUT: + * struct mv643xx_private *mp Ethernet Port Control srtuct. + * struct pkt_info *p_pkt_info User packet buffer. + * + * OUTPUT: + * Tx ring 'first' and 'used' indexes are updated. + * + * RETURN: + * ETH_OK on success + * ETH_ERROR otherwise. + * + */ +static ETH_FUNC_RET_STATUS eth_tx_return_desc(struct mv643xx_private *mp, + struct pkt_info *p_pkt_info) { - struct mv643xx_private *mp = netdev_priv(dev); - eth_port_write_smi_reg(mp->port_num, location, val); + int tx_desc_used; + int tx_busy_desc; + struct eth_tx_desc *p_tx_desc_used; + unsigned int command_status; + unsigned long flags; + int err = ETH_OK; + + spin_lock_irqsave(&mp->lock, flags); + +#ifdef MV643XX_CHECKSUM_OFFLOAD_TX + tx_busy_desc = mp->tx_first_desc_q; +#else + tx_busy_desc = mp->tx_curr_desc_q; +#endif + + /* Get the Tx Desc ring indexes */ + tx_desc_used = mp->tx_used_desc_q; + + p_tx_desc_used = &mp->p_tx_desc_area[tx_desc_used]; + + /* Sanity check */ + if (p_tx_desc_used == NULL) { + err = ETH_ERROR; + goto out; + } + + /* Stop release. About to overlap the current available Tx descriptor */ + if (tx_desc_used == tx_busy_desc && !mp->tx_resource_err) { + err = ETH_ERROR; + goto out; + } + + command_status = p_tx_desc_used->cmd_sts; + + /* Still transmitting... */ + if (command_status & (ETH_BUFFER_OWNED_BY_DMA)) { + err = ETH_ERROR; + goto out; + } + + /* Pass the packet information to the caller */ + p_pkt_info->cmd_sts = command_status; + p_pkt_info->return_info = mp->tx_skb[tx_desc_used]; + p_pkt_info->buf_ptr = p_tx_desc_used->buf_ptr; + p_pkt_info->byte_cnt = p_tx_desc_used->byte_cnt; + mp->tx_skb[tx_desc_used] = NULL; + + /* Update the next descriptor to release. */ + mp->tx_used_desc_q = (tx_desc_used + 1) % mp->tx_ring_size; + + /* Any Tx return cancels the Tx resource error status */ + mp->tx_resource_err = 0; + + BUG_ON(mp->tx_ring_skbs == 0); + mp->tx_ring_skbs--; + +out: + spin_unlock_irqrestore(&mp->lock, flags); + + return err; } /* @@ -2699,6 +3017,111 @@ static const struct mv643xx_stats mv643xx_gstrings_stats[] = { #define MV643XX_STATS_LEN \ sizeof(mv643xx_gstrings_stats) / sizeof(struct mv643xx_stats) +static int +mv643xx_get_settings(struct net_device *netdev, struct ethtool_cmd *ecmd) +{ + struct mv643xx_private *mp = netdev->priv; + int port_num = mp->port_num; + int autoneg = eth_port_autoneg_supported(port_num); + int mode_10_bit; + int auto_duplex; + int half_duplex = 0; + int full_duplex = 0; + int auto_speed; + int speed_10 = 0; + int speed_100 = 0; + int speed_1000 = 0; + + u32 pcs = mv_read(MV643XX_ETH_PORT_SERIAL_CONTROL_REG(port_num)); + u32 psr = mv_read(MV643XX_ETH_PORT_STATUS_REG(port_num)); + + mode_10_bit = psr & MV643XX_ETH_PORT_STATUS_MODE_10_BIT; + + if (mode_10_bit) { + ecmd->supported = SUPPORTED_10baseT_Half; + } else { + ecmd->supported = (SUPPORTED_10baseT_Half | + SUPPORTED_10baseT_Full | + SUPPORTED_100baseT_Half | + SUPPORTED_100baseT_Full | + SUPPORTED_1000baseT_Full | + (autoneg ? SUPPORTED_Autoneg : 0) | + SUPPORTED_TP); + + auto_duplex = !(pcs & MV643XX_ETH_DISABLE_AUTO_NEG_FOR_DUPLX); + auto_speed = !(pcs & MV643XX_ETH_DISABLE_AUTO_NEG_SPEED_GMII); + + ecmd->advertising = ADVERTISED_TP; + + if (autoneg) { + ecmd->advertising |= ADVERTISED_Autoneg; + + if (auto_duplex) { + half_duplex = 1; + full_duplex = 1; + } else { + if (pcs & MV643XX_ETH_SET_FULL_DUPLEX_MODE) + full_duplex = 1; + else + half_duplex = 1; + } + + if (auto_speed) { + speed_10 = 1; + speed_100 = 1; + speed_1000 = 1; + } else { + if (pcs & MV643XX_ETH_SET_GMII_SPEED_TO_1000) + speed_1000 = 1; + else if (pcs & MV643XX_ETH_SET_MII_SPEED_TO_100) + speed_100 = 1; + else + speed_10 = 1; + } + + if (speed_10 & half_duplex) + ecmd->advertising |= ADVERTISED_10baseT_Half; + if (speed_10 & full_duplex) + ecmd->advertising |= ADVERTISED_10baseT_Full; + if (speed_100 & half_duplex) + ecmd->advertising |= ADVERTISED_100baseT_Half; + if (speed_100 & full_duplex) + ecmd->advertising |= ADVERTISED_100baseT_Full; + if (speed_1000) + ecmd->advertising |= ADVERTISED_1000baseT_Full; + } + } + + ecmd->port = PORT_TP; + ecmd->phy_address = ethernet_phy_get(port_num); + + ecmd->transceiver = XCVR_EXTERNAL; + + if (netif_carrier_ok(netdev)) { + if (mode_10_bit) + ecmd->speed = SPEED_10; + else { + if (psr & MV643XX_ETH_PORT_STATUS_GMII_1000) + ecmd->speed = SPEED_1000; + else if (psr & MV643XX_ETH_PORT_STATUS_MII_100) + ecmd->speed = SPEED_100; + else + ecmd->speed = SPEED_10; + } + + if (psr & MV643XX_ETH_PORT_STATUS_FULL_DUPLEX) + ecmd->duplex = DUPLEX_FULL; + else + ecmd->duplex = DUPLEX_HALF; + } else { + ecmd->speed = -1; + ecmd->duplex = -1; + } + + ecmd->autoneg = autoneg ? AUTONEG_ENABLE : AUTONEG_DISABLE; + return 0; +} + static void mv643xx_get_drvinfo(struct net_device *netdev, struct ethtool_drvinfo *drvinfo) { @@ -2745,41 +3168,15 @@ static void mv643xx_get_strings(struct net_device *netdev, uint32_t stringset, } } -static u32 mv643xx_eth_get_link(struct net_device *dev) -{ - struct mv643xx_private *mp = netdev_priv(dev); - - return mii_link_ok(&mp->mii); -} - -static int mv643xx_eth_nway_restart(struct net_device *dev) -{ - struct mv643xx_private *mp = netdev_priv(dev); - - return mii_nway_restart(&mp->mii); -} - -static int mv643xx_eth_do_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) -{ - struct mv643xx_private *mp = netdev_priv(dev); - - return generic_mii_ioctl(&mp->mii, if_mii(ifr), cmd, NULL); -} - static struct ethtool_ops mv643xx_ethtool_ops = { .get_settings = mv643xx_get_settings, - .set_settings = mv643xx_set_settings, .get_drvinfo = mv643xx_get_drvinfo, - .get_link = mv643xx_eth_get_link, + .get_link = ethtool_op_get_link, .get_sg = ethtool_op_get_sg, .set_sg = ethtool_op_set_sg, .get_strings = mv643xx_get_strings, .get_stats_count = mv643xx_get_stats_count, .get_ethtool_stats = mv643xx_get_ethtool_stats, - .get_strings = mv643xx_get_strings, - .get_stats_count = mv643xx_get_stats_count, - .get_ethtool_stats = mv643xx_get_ethtool_stats, - .nway_reset = mv643xx_eth_nway_restart, }; /************* End ethtool support *************************/ diff --git a/drivers/net/mv643xx_eth.h b/drivers/net/mv643xx_eth.h index 33c5fafdb..f769f9b62 100644 --- a/drivers/net/mv643xx_eth.h +++ b/drivers/net/mv643xx_eth.h @@ -5,16 +5,53 @@ #include #include #include -#include #include +#define BIT0 0x00000001 +#define BIT1 0x00000002 +#define BIT2 0x00000004 +#define BIT3 0x00000008 +#define BIT4 0x00000010 +#define BIT5 0x00000020 +#define BIT6 0x00000040 +#define BIT7 0x00000080 +#define BIT8 0x00000100 +#define BIT9 0x00000200 +#define BIT10 0x00000400 +#define BIT11 0x00000800 +#define BIT12 0x00001000 +#define BIT13 0x00002000 +#define BIT14 0x00004000 +#define BIT15 0x00008000 +#define BIT16 0x00010000 +#define BIT17 0x00020000 +#define BIT18 0x00040000 +#define BIT19 0x00080000 +#define BIT20 0x00100000 +#define BIT21 0x00200000 +#define BIT22 0x00400000 +#define BIT23 0x00800000 +#define BIT24 0x01000000 +#define BIT25 0x02000000 +#define BIT26 0x04000000 +#define BIT27 0x08000000 +#define BIT28 0x10000000 +#define BIT29 0x20000000 +#define BIT30 0x40000000 +#define BIT31 0x80000000 + +/* + * The first part is the high level driver of the gigE ethernet ports. + */ + /* Checksum offload for Tx works for most packets, but * fails if previous packet sent did not use hw csum */ #define MV643XX_CHECKSUM_OFFLOAD_TX #define MV643XX_NAPI #define MV643XX_TX_FAST_REFILL +#undef MV643XX_RX_QUEUE_FILL_ON_TASK /* Does not work, yet */ #undef MV643XX_COAL /* @@ -36,50 +73,25 @@ #define MV643XX_RX_COAL 100 #endif -#ifdef MV643XX_CHECKSUM_OFFLOAD_TX -#define MAX_DESCS_PER_SKB (MAX_SKB_FRAGS + 1) -#else -#define MAX_DESCS_PER_SKB 1 -#endif - /* - * The MV643XX HW requires 8-byte alignment. However, when I/O - * is non-cache-coherent, we need to ensure that the I/O buffers - * we use don't share cache lines with other data. + * The second part is the low level driver of the gigE ethernet ports. */ -#if defined(CONFIG_DMA_NONCOHERENT) || defined(CONFIG_NOT_COHERENT_CACHE) -#define ETH_DMA_ALIGN L1_CACHE_BYTES -#else -#define ETH_DMA_ALIGN 8 -#endif - -#define ETH_VLAN_HLEN 4 -#define ETH_FCS_LEN 4 -#define ETH_HW_IP_ALIGN 2 /* hw aligns IP header */ -#define ETH_WRAPPER_LEN (ETH_HW_IP_ALIGN + ETH_HLEN + \ - ETH_VLAN_HLEN + ETH_FCS_LEN) -#define ETH_RX_SKB_SIZE (dev->mtu + ETH_WRAPPER_LEN + ETH_DMA_ALIGN) - -#define ETH_RX_QUEUES_ENABLED (1 << 0) /* use only Q0 for receive */ -#define ETH_TX_QUEUES_ENABLED (1 << 0) /* use only Q0 for transmit */ - -#define ETH_INT_CAUSE_RX_DONE (ETH_RX_QUEUES_ENABLED << 2) -#define ETH_INT_CAUSE_RX_ERROR (ETH_RX_QUEUES_ENABLED << 9) -#define ETH_INT_CAUSE_RX (ETH_INT_CAUSE_RX_DONE | ETH_INT_CAUSE_RX_ERROR) -#define ETH_INT_CAUSE_EXT 0x00000002 -#define ETH_INT_UNMASK_ALL (ETH_INT_CAUSE_RX | ETH_INT_CAUSE_EXT) -#define ETH_INT_CAUSE_TX_DONE (ETH_TX_QUEUES_ENABLED << 0) -#define ETH_INT_CAUSE_TX_ERROR (ETH_TX_QUEUES_ENABLED << 8) -#define ETH_INT_CAUSE_TX (ETH_INT_CAUSE_TX_DONE | ETH_INT_CAUSE_TX_ERROR) -#define ETH_INT_CAUSE_PHY 0x00010000 -#define ETH_INT_UNMASK_ALL_EXT (ETH_INT_CAUSE_TX | ETH_INT_CAUSE_PHY) - -#define ETH_INT_MASK_ALL 0x00000000 -#define ETH_INT_MASK_ALL_EXT 0x00000000 +/* + * Header File for : MV-643xx network interface header + * + * DESCRIPTION: + * This header file contains macros typedefs and function declaration for + * the Marvell Gig Bit Ethernet Controller. + * + * DEPENDENCIES: + * None. + * + */ -#define PHY_WAIT_ITERATIONS 1000 /* 1000 iterations * 10uS = 10mS max */ -#define PHY_WAIT_MICRO_SECONDS 10 +/* MAC accepet/reject macros */ +#define ACCEPT_MAC_ADDR 0 +#define REJECT_MAC_ADDR 1 /* Buffer offset from buffer pointer */ #define RX_BUF_OFFSET 0x2 @@ -121,71 +133,88 @@ #define ETH_MIB_LATE_COLLISION 0x7c /* Port serial status reg (PSR) */ -#define ETH_INTERFACE_PCM 0x00000001 -#define ETH_LINK_IS_UP 0x00000002 -#define ETH_PORT_AT_FULL_DUPLEX 0x00000004 -#define ETH_RX_FLOW_CTRL_ENABLED 0x00000008 -#define ETH_GMII_SPEED_1000 0x00000010 -#define ETH_MII_SPEED_100 0x00000020 -#define ETH_TX_IN_PROGRESS 0x00000080 -#define ETH_BYPASS_ACTIVE 0x00000100 -#define ETH_PORT_AT_PARTITION_STATE 0x00000200 -#define ETH_PORT_TX_FIFO_EMPTY 0x00000400 +#define ETH_INTERFACE_GMII_MII 0 +#define ETH_INTERFACE_PCM BIT0 +#define ETH_LINK_IS_DOWN 0 +#define ETH_LINK_IS_UP BIT1 +#define ETH_PORT_AT_HALF_DUPLEX 0 +#define ETH_PORT_AT_FULL_DUPLEX BIT2 +#define ETH_RX_FLOW_CTRL_DISABLED 0 +#define ETH_RX_FLOW_CTRL_ENBALED BIT3 +#define ETH_GMII_SPEED_100_10 0 +#define ETH_GMII_SPEED_1000 BIT4 +#define ETH_MII_SPEED_10 0 +#define ETH_MII_SPEED_100 BIT5 +#define ETH_NO_TX 0 +#define ETH_TX_IN_PROGRESS BIT7 +#define ETH_BYPASS_NO_ACTIVE 0 +#define ETH_BYPASS_ACTIVE BIT8 +#define ETH_PORT_NOT_AT_PARTITION_STATE 0 +#define ETH_PORT_AT_PARTITION_STATE BIT9 +#define ETH_PORT_TX_FIFO_NOT_EMPTY 0 +#define ETH_PORT_TX_FIFO_EMPTY BIT10 + +#define ETH_DEFAULT_RX_BPDU_QUEUE_3 (BIT23 | BIT22) +#define ETH_DEFAULT_RX_BPDU_QUEUE_4 BIT24 +#define ETH_DEFAULT_RX_BPDU_QUEUE_5 (BIT24 | BIT22) +#define ETH_DEFAULT_RX_BPDU_QUEUE_6 (BIT24 | BIT23) +#define ETH_DEFAULT_RX_BPDU_QUEUE_7 (BIT24 | BIT23 | BIT22) /* SMI reg */ -#define ETH_SMI_BUSY 0x10000000 /* 0 - Write, 1 - Read */ -#define ETH_SMI_READ_VALID 0x08000000 /* 0 - Write, 1 - Read */ -#define ETH_SMI_OPCODE_WRITE 0 /* Completion of Read */ -#define ETH_SMI_OPCODE_READ 0x04000000 /* Operation is in progress */ - -/* Interrupt Cause Register Bit Definitions */ +#define ETH_SMI_BUSY BIT28 /* 0 - Write, 1 - Read */ +#define ETH_SMI_READ_VALID BIT27 /* 0 - Write, 1 - Read */ +#define ETH_SMI_OPCODE_WRITE 0 /* Completion of Read operation */ +#define ETH_SMI_OPCODE_READ BIT26 /* Operation is in progress */ /* SDMA command status fields macros */ /* Tx & Rx descriptors status */ -#define ETH_ERROR_SUMMARY 0x00000001 +#define ETH_ERROR_SUMMARY (BIT0) /* Tx & Rx descriptors command */ -#define ETH_BUFFER_OWNED_BY_DMA 0x80000000 +#define ETH_BUFFER_OWNED_BY_DMA (BIT31) /* Tx descriptors status */ -#define ETH_LC_ERROR 0 -#define ETH_UR_ERROR 0x00000002 -#define ETH_RL_ERROR 0x00000004 -#define ETH_LLC_SNAP_FORMAT 0x00000200 +#define ETH_LC_ERROR (0 ) +#define ETH_UR_ERROR (BIT1 ) +#define ETH_RL_ERROR (BIT2 ) +#define ETH_LLC_SNAP_FORMAT (BIT9 ) /* Rx descriptors status */ -#define ETH_OVERRUN_ERROR 0x00000002 -#define ETH_MAX_FRAME_LENGTH_ERROR 0x00000004 -#define ETH_RESOURCE_ERROR 0x00000006 -#define ETH_VLAN_TAGGED 0x00080000 -#define ETH_BPDU_FRAME 0x00100000 -#define ETH_UDP_FRAME_OVER_IP_V_4 0x00200000 -#define ETH_OTHER_FRAME_TYPE 0x00400000 -#define ETH_LAYER_2_IS_ETH_V_2 0x00800000 -#define ETH_FRAME_TYPE_IP_V_4 0x01000000 -#define ETH_FRAME_HEADER_OK 0x02000000 -#define ETH_RX_LAST_DESC 0x04000000 -#define ETH_RX_FIRST_DESC 0x08000000 -#define ETH_UNKNOWN_DESTINATION_ADDR 0x10000000 -#define ETH_RX_ENABLE_INTERRUPT 0x20000000 -#define ETH_LAYER_4_CHECKSUM_OK 0x40000000 +#define ETH_CRC_ERROR (0 ) +#define ETH_OVERRUN_ERROR (BIT1 ) +#define ETH_MAX_FRAME_LENGTH_ERROR (BIT2 ) +#define ETH_RESOURCE_ERROR ((BIT2 | BIT1)) +#define ETH_VLAN_TAGGED (BIT19) +#define ETH_BPDU_FRAME (BIT20) +#define ETH_TCP_FRAME_OVER_IP_V_4 (0 ) +#define ETH_UDP_FRAME_OVER_IP_V_4 (BIT21) +#define ETH_OTHER_FRAME_TYPE (BIT22) +#define ETH_LAYER_2_IS_ETH_V_2 (BIT23) +#define ETH_FRAME_TYPE_IP_V_4 (BIT24) +#define ETH_FRAME_HEADER_OK (BIT25) +#define ETH_RX_LAST_DESC (BIT26) +#define ETH_RX_FIRST_DESC (BIT27) +#define ETH_UNKNOWN_DESTINATION_ADDR (BIT28) +#define ETH_RX_ENABLE_INTERRUPT (BIT29) +#define ETH_LAYER_4_CHECKSUM_OK (BIT30) /* Rx descriptors byte count */ -#define ETH_FRAME_FRAGMENTED 0x00000004 +#define ETH_FRAME_FRAGMENTED (BIT2) /* Tx descriptors command */ -#define ETH_LAYER_4_CHECKSUM_FIRST_DESC 0x00000400 -#define ETH_FRAME_SET_TO_VLAN 0x00008000 -#define ETH_UDP_FRAME 0x00010000 -#define ETH_GEN_TCP_UDP_CHECKSUM 0x00020000 -#define ETH_GEN_IP_V_4_CHECKSUM 0x00040000 -#define ETH_ZERO_PADDING 0x00080000 -#define ETH_TX_LAST_DESC 0x00100000 -#define ETH_TX_FIRST_DESC 0x00200000 -#define ETH_GEN_CRC 0x00400000 -#define ETH_TX_ENABLE_INTERRUPT 0x00800000 -#define ETH_AUTO_MODE 0x40000000 +#define ETH_LAYER_4_CHECKSUM_FIRST_DESC (BIT10) +#define ETH_FRAME_SET_TO_VLAN (BIT15) +#define ETH_TCP_FRAME (0 ) +#define ETH_UDP_FRAME (BIT16) +#define ETH_GEN_TCP_UDP_CHECKSUM (BIT17) +#define ETH_GEN_IP_V_4_CHECKSUM (BIT18) +#define ETH_ZERO_PADDING (BIT19) +#define ETH_TX_LAST_DESC (BIT20) +#define ETH_TX_FIRST_DESC (BIT21) +#define ETH_GEN_CRC (BIT22) +#define ETH_TX_ENABLE_INTERRUPT (BIT23) +#define ETH_AUTO_MODE (BIT30) #define ETH_TX_IHL_SHIFT 11 @@ -258,7 +287,7 @@ struct pkt_info { struct sk_buff *return_info; /* User resource return information */ }; -/* Ethernet port specific information */ +/* Ethernet port specific infomation */ struct mv643xx_mib_counters { u64 good_octets_received; @@ -295,6 +324,13 @@ struct mv643xx_mib_counters { struct mv643xx_private { int port_num; /* User Ethernet port number */ + u8 port_mac_addr[6]; /* User defined port MAC address.*/ + u32 port_config; /* User port configuration value*/ + u32 port_config_extend; /* User port config extend value*/ + u32 port_sdma_config; /* User port SDMA config value */ + u32 port_serial_control; /* User port serial control value */ + u32 port_tx_queue_command; /* Port active Tx queues summary*/ + u32 port_rx_queue_command; /* Port active Rx queues summary*/ u32 rx_sram_addr; /* Base address of rx sram area */ u32 rx_sram_size; /* Size of rx sram area */ @@ -302,6 +338,7 @@ struct mv643xx_private { u32 tx_sram_size; /* Size of tx sram area */ int rx_resource_err; /* Rx ring resource error flag */ + int tx_resource_err; /* Tx ring resource error flag */ /* Tx/Rx rings managment indexes fields. For driver use */ @@ -310,6 +347,10 @@ struct mv643xx_private { /* Next available and first returning Tx resource */ int tx_curr_desc_q, tx_used_desc_q; +#ifdef MV643XX_CHECKSUM_OFFLOAD_TX + int tx_first_desc_q; + u32 tx_first_command; +#endif #ifdef MV643XX_TX_FAST_REFILL u32 tx_clean_threshold; @@ -317,43 +358,54 @@ struct mv643xx_private { struct eth_rx_desc *p_rx_desc_area; dma_addr_t rx_desc_dma; - int rx_desc_area_size; + unsigned int rx_desc_area_size; struct sk_buff **rx_skb; struct eth_tx_desc *p_tx_desc_area; dma_addr_t tx_desc_dma; - int tx_desc_area_size; + unsigned int tx_desc_area_size; struct sk_buff **tx_skb; struct work_struct tx_timeout_task; + /* + * Former struct mv643xx_eth_priv members start here + */ struct net_device_stats stats; struct mv643xx_mib_counters mib_counters; spinlock_t lock; /* Size of Tx Ring per queue */ - int tx_ring_size; - /* Number of tx descriptors in use */ - int tx_desc_count; + unsigned int tx_ring_size; + /* Ammont of SKBs outstanding on Tx queue */ + unsigned int tx_ring_skbs; /* Size of Rx Ring per queue */ - int rx_ring_size; - /* Number of rx descriptors in use */ - int rx_desc_count; + unsigned int rx_ring_size; + /* Ammount of SKBs allocated to Rx Ring per queue */ + unsigned int rx_ring_skbs; + + /* + * rx_task used to fill RX ring out of bottom half context + */ + struct work_struct rx_task; /* * Used in case RX Ring is empty, which can be caused when * system does not have resources (skb's) */ struct timer_list timeout; + long rx_task_busy __attribute__ ((aligned(SMP_CACHE_BYTES))); + unsigned rx_timer_flag; u32 rx_int_coal; u32 tx_int_coal; - struct mii_if_info mii; }; +/* ethernet.h API list */ + /* Port operation control routines */ static void eth_port_init(struct mv643xx_private *mp); static void eth_port_reset(unsigned int eth_port_num); -static void eth_port_start(struct net_device *dev); +static void eth_port_start(struct mv643xx_private *mp); /* Port MAC address routines */ static void eth_port_uc_addr_set(unsigned int eth_port_num, @@ -371,6 +423,10 @@ static void eth_port_read_smi_reg(unsigned int eth_port_num, static void eth_clear_mib_counters(unsigned int eth_port_num); /* Port data flow control routines */ +static ETH_FUNC_RET_STATUS eth_port_send(struct mv643xx_private *mp, + struct pkt_info *p_pkt_info); +static ETH_FUNC_RET_STATUS eth_tx_return_desc(struct mv643xx_private *mp, + struct pkt_info *p_pkt_info); static ETH_FUNC_RET_STATUS eth_port_receive(struct mv643xx_private *mp, struct pkt_info *p_pkt_info); static ETH_FUNC_RET_STATUS eth_rx_return_buff(struct mv643xx_private *mp, diff --git a/drivers/net/myri_sbus.c b/drivers/net/myri_sbus.c index 1b965a2b5..6c86dca62 100644 --- a/drivers/net/myri_sbus.c +++ b/drivers/net/myri_sbus.c @@ -1,12 +1,13 @@ -/* myri_sbus.c: MyriCOM MyriNET SBUS card driver. +/* myri_sbus.h: MyriCOM MyriNET SBUS card driver. * - * Copyright (C) 1996, 1999, 2006 David S. Miller (davem@davemloft.net) + * Copyright (C) 1996, 1999 David S. Miller (davem@redhat.com) */ static char version[] = - "myri_sbus.c:v2.0 June 23, 2006 David S. Miller (davem@davemloft.net)\n"; + "myri_sbus.c:v1.9 12/Sep/99 David S. Miller (davem@redhat.com)\n"; #include +#include #include #include #include @@ -80,6 +81,10 @@ 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. */ @@ -891,9 +896,8 @@ static void dump_eeprom(struct myri_eth *mp) } #endif -static int __init myri_ether_init(struct sbus_dev *sdev) +static int __init myri_ether_init(struct sbus_dev *sdev, int num) { - static int num; static unsigned version_printed; struct net_device *dev; struct myri_eth *mp; @@ -909,9 +913,6 @@ static int __init myri_ether_init(struct sbus_dev *sdev) 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; @@ -1069,7 +1070,7 @@ static int __init myri_ether_init(struct sbus_dev *sdev) /* Register interrupt handler now. */ DET(("Requesting MYRIcom IRQ line.\n")); if (request_irq(dev->irq, &myri_interrupt, - IRQF_SHARED, "MyriCOM Ethernet", (void *) dev)) { + SA_SHIRQ, "MyriCOM Ethernet", (void *) dev)) { printk("MyriCOM: Cannot register interrupt handler.\n"); goto err; } @@ -1091,9 +1092,10 @@ static int __init myri_ether_init(struct sbus_dev *sdev) goto err_free_irq; } - dev_set_drvdata(&sdev->ofdev.dev, mp); - - num++; +#ifdef MODULE + mp->next_module = root_myri_dev; + root_myri_dev = mp; +#endif printk("%s: MyriCOM MyriNET Ethernet ", dev->name); @@ -1112,68 +1114,61 @@ err: return -ENODEV; } - -static int __devinit myri_sbus_probe(struct of_device *dev, const struct of_device_id *match) +static int __init myri_sbus_match(struct sbus_dev *sdev) { - struct sbus_dev *sdev = to_sbus_device(&dev->dev); + char *name = sdev->prom_name; + + if (!strcmp(name, "MYRICOM,mlanai") || + !strcmp(name, "myri")) + return 1; - return myri_ether_init(sdev); + return 0; } -static int __devexit myri_sbus_remove(struct of_device *dev) +static int __init myri_sbus_probe(void) { - struct myri_eth *mp = dev_get_drvdata(&dev->dev); - struct net_device *net_dev = mp->dev; + struct sbus_bus *bus; + struct sbus_dev *sdev = NULL; + static int called; + int cards = 0, v; - unregister_netdevice(net_dev); - - free_irq(net_dev->irq, net_dev); +#ifdef MODULE + root_myri_dev = NULL; +#endif - 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 (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_netdev(net_dev); - - dev_set_drvdata(&dev->dev, NULL); - + if (!cards) + return -ENODEV; return 0; } -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) +static void __exit myri_sbus_cleanup(void) { - of_unregister_driver(&myri_sbus_driver); +#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 */ } -module_init(myri_sbus_init); -module_exit(myri_sbus_exit); - +module_init(myri_sbus_probe); +module_exit(myri_sbus_cleanup); MODULE_LICENSE("GPL"); diff --git a/drivers/net/myri_sbus.h b/drivers/net/myri_sbus.h index 2f69ef7cd..47722f708 100644 --- a/drivers/net/myri_sbus.h +++ b/drivers/net/myri_sbus.h @@ -290,6 +290,7 @@ 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 db0475a11..9d6d2548c 100644 --- a/drivers/net/natsemi.c +++ b/drivers/net/natsemi.c @@ -3,7 +3,6 @@ Written/copyright 1999-2001 by Donald Becker. Portions copyright (c) 2001,2002 Sun Microsystems (thockin@sun.com) Portions copyright 2001,2002 Manfred Spraul (manfred@colorfullife.com) - Portions copyright 2004 Harald Welte This software may be used and distributed according to the terms of the GNU General Public License (GPL), incorporated herein by reference. @@ -20,13 +19,127 @@ 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 + * support for an external PHY + * NAPI */ +#include #include #include #include @@ -47,15 +160,14 @@ #include #include #include -#include #include /* Processor type for cache alignment. */ #include #include #include #define DRV_NAME "natsemi" -#define DRV_VERSION "2.0" -#define DRV_RELDATE "June 27, 2006" +#define DRV_VERSION "1.07+LK1.0.17" +#define DRV_RELDATE "Sep 27, 2002" #define RX_OFFSET 2 @@ -71,11 +183,13 @@ NETIF_MSG_TX_ERR) static int debug = -1; +/* Maximum events (Rx packets, etc.) to handle at each interrupt. */ +static int max_interrupt_work = 20; static int mtu; /* Maximum number of multicast addresses to filter (vs. rx-all-multicast). This chip uses a 512 element hash table based on the Ethernet CRC. */ -static const int multicast_filter_limit = 100; +static int multicast_filter_limit = 100; /* Set the copy breakpoint for the copy-only-tiny-frames scheme. Setting to > 1518 effectively disables this feature. */ @@ -114,6 +228,7 @@ 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_EEPROM_SIZE 24 /* 12 16-bit values */ /* Buffer sizes: * The nic writes 32-bit values, even if the upper bytes of @@ -125,7 +240,7 @@ static int full_duplex[MAX_UNITS]; #define NATSEMI_RX_LIMIT 2046 /* maximum supported by hardware */ /* These identify the driver base version and may not be removed. */ -static const char version[] __devinitdata = +static char version[] __devinitdata = KERN_INFO DRV_NAME " dp8381x driver, version " DRV_VERSION ", " DRV_RELDATE "\n" KERN_INFO " originally by Donald Becker \n" @@ -136,11 +251,14 @@ MODULE_AUTHOR("Donald Becker "); MODULE_DESCRIPTION("National Semiconductor DP8381x series PCI Ethernet driver"); MODULE_LICENSE("GPL"); +module_param(max_interrupt_work, int, 0); module_param(mtu, int, 0); module_param(debug, int, 0); module_param(rx_copybreak, int, 0); module_param_array(options, int, NULL, 0); module_param_array(full_duplex, int, NULL, 0); +MODULE_PARM_DESC(max_interrupt_work, + "DP8381x maximum events handled per interrupt"); MODULE_PARM_DESC(mtu, "DP8381x MTU (all boards)"); MODULE_PARM_DESC(debug, "DP8381x default debug level"); MODULE_PARM_DESC(rx_copybreak, @@ -205,12 +323,12 @@ performance critical codepaths: The rx process only runs in the interrupt handler. Access from outside the interrupt handler is only permitted after disable_irq(). -The rx process usually runs under the netif_tx_lock. If np->intr_tx_reap +The rx process usually runs under the dev->xmit_lock. If np->intr_tx_reap is set, then access is permitted under spin_lock_irq(&np->lock). Thus configuration functions that want to access everything must call disable_irq(dev->irq); - netif_tx_lock_bh(dev); + spin_lock_bh(dev->xmit_lock); spin_lock_irq(&np->lock); IV. Notes @@ -231,6 +349,18 @@ 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. @@ -238,25 +368,22 @@ None characterised. */ #define PHYID_AM79C874 0x0022561b -enum { - MII_MCTRL = 0x15, /* mode control register */ - MII_FX_SEL = 0x0001, /* 100BASE-FX (fiber) */ - MII_EN_SCRM = 0x0004, /* enable scrambler (tp) */ -}; +#define MII_MCTRL 0x15 /* mode control register */ +#define MII_FX_SEL 0x0001 /* 100BASE-FX (fiber) */ +#define MII_EN_SCRM 0x0004 /* enable scrambler (tp) */ /* array of board data directly indexed by pci_tbl[x].driver_data */ -static const struct { +static struct { const char *name; unsigned long flags; - unsigned int eeprom_size; } natsemi_pci_info[] __devinitdata = { - { "NatSemi DP8381[56]", 0, 24 }, + { "NatSemi DP8381[56]", PCI_IOTYPE }, }; -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 */ +static struct pci_device_id natsemi_pci_tbl[] = { + { PCI_VENDOR_ID_NS, PCI_DEVICE_ID_NS_83815, PCI_ANY_ID, PCI_ANY_ID, }, + { 0, }, }; MODULE_DEVICE_TABLE(pci, natsemi_pci_tbl); @@ -564,8 +691,6 @@ struct netdev_private { /* Based on MTU+slack. */ unsigned int rx_buf_sz; int oom; - /* Interrupt status */ - u32 intr_status; /* Do not touch the nic registers */ int hands_off; /* external phy that is used: only valid if dev->if_port != PORT_TP */ @@ -592,8 +717,6 @@ struct netdev_private { unsigned int iosize; spinlock_t lock; u32 msg_enable; - /* EEPROM data */ - int eeprom_size; }; static void move_int_phy(struct net_device *dev, int addr); @@ -625,8 +748,7 @@ static void init_registers(struct net_device *dev); static int start_tx(struct sk_buff *skb, struct net_device *dev); static irqreturn_t intr_handler(int irq, void *dev_instance, struct pt_regs *regs); static void netdev_error(struct net_device *dev, int intr_status); -static int natsemi_poll(struct net_device *dev, int *budget); -static void netdev_rx(struct net_device *dev, int *work_done, int work_to_do); +static void netdev_rx(struct net_device *dev); static void netdev_tx_done(struct net_device *dev); static int natsemi_change_mtu(struct net_device *dev, int new_mtu); #ifdef CONFIG_NET_POLL_CONTROLLER @@ -654,18 +776,6 @@ static inline void __iomem *ns_ioaddr(struct net_device *dev) return (void __iomem *) dev->base_addr; } -static inline void natsemi_irq_enable(struct net_device *dev) -{ - writel(1, ns_ioaddr(dev) + IntrEnable); - readl(ns_ioaddr(dev) + IntrEnable); -} - -static inline void natsemi_irq_disable(struct net_device *dev) -{ - writel(0, ns_ioaddr(dev) + IntrEnable); - readl(ns_ioaddr(dev) + IntrEnable); -} - static void move_int_phy(struct net_device *dev, int addr) { struct netdev_private *np = netdev_priv(dev); @@ -691,42 +801,6 @@ 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) { @@ -766,7 +840,8 @@ static int __devinit natsemi_probe1 (struct pci_dev *pdev, iosize = pci_resource_len(pdev, pcibar); irq = pdev->irq; - pci_set_master(pdev); + if (natsemi_pci_info[chip_idx].flags & PCI_USES_MASTER) + pci_set_master(pdev); dev = alloc_etherdev(sizeof (struct netdev_private)); if (!dev) @@ -804,8 +879,6 @@ static int __devinit natsemi_probe1 (struct pci_dev *pdev, spin_lock_init(&np->lock); np->msg_enable = (debug >= 0) ? (1<hands_off = 0; - np->intr_status = 0; - 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 @@ -859,9 +932,6 @@ static int __devinit natsemi_probe1 (struct pci_dev *pdev, dev->do_ioctl = &netdev_ioctl; dev->tx_timeout = &tx_timeout; dev->watchdog_timeo = TX_TIMEOUT; - dev->poll = natsemi_poll; - dev->weight = 64; - #ifdef CONFIG_NET_POLL_CONTROLLER dev->poll_controller = &natsemi_poll_controller; #endif @@ -870,7 +940,34 @@ static int __devinit natsemi_probe1 (struct pci_dev *pdev, if (mtu) dev->mtu = mtu; - natsemi_init_media(dev); + 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); /* save the silicon revision for later querying */ np->srr = readl(ioaddr + SiliconRev); @@ -1387,31 +1484,6 @@ static void natsemi_reset(struct net_device *dev) writel(rfcr, ioaddr + RxFilterAddr); } -static void reset_rx(struct net_device *dev) -{ - int i; - struct netdev_private *np = netdev_priv(dev); - void __iomem *ioaddr = ns_ioaddr(dev); - - np->intr_status &= ~RxResetDone; - - writel(RxReset, ioaddr + ChipCmd); - - for (i=0;iintr_status |= readl(ioaddr + IntrStatus); - if (np->intr_status & RxResetDone) - break; - udelay(15); - } - if (i==NATSEMI_HW_TIMEOUT) { - printk(KERN_WARNING "%s: RX reset did not complete in %d usec.\n", - dev->name, i*15); - } else if (netif_msg_hw(np)) { - printk(KERN_WARNING "%s: RX reset took %d usec.\n", - dev->name, i*15); - } -} - static void natsemi_reload_eeprom(struct net_device *dev) { struct netdev_private *np = netdev_priv(dev); @@ -1463,7 +1535,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, IRQF_SHARED, dev->name, dev); + i = request_irq(dev->irq, &intr_handler, SA_SHIRQ, dev->name, dev); if (i) return i; if (netif_msg_ifup(np)) @@ -2086,92 +2158,68 @@ static void netdev_tx_done(struct net_device *dev) } } -/* The interrupt handler doesn't actually handle interrupts itself, it - * schedules a NAPI poll if there is anything to do. */ +/* The interrupt handler does all of the Rx thread work and cleans up + after the Tx thread. */ static irqreturn_t intr_handler(int irq, void *dev_instance, struct pt_regs *rgs) { struct net_device *dev = dev_instance; struct netdev_private *np = netdev_priv(dev); void __iomem * ioaddr = ns_ioaddr(dev); + int boguscnt = max_interrupt_work; + unsigned int handled = 0; if (np->hands_off) return IRQ_NONE; - - /* Reading automatically acknowledges. */ - np->intr_status = readl(ioaddr + IntrStatus); - - if (netif_msg_intr(np)) - printk(KERN_DEBUG - "%s: Interrupt, status %#08x, mask %#08x.\n", - dev->name, np->intr_status, - readl(ioaddr + IntrMask)); - - if (!np->intr_status) - return IRQ_NONE; - - prefetch(&np->rx_skbuff[np->cur_rx % RX_RING_SIZE]); + do { + /* Reading automatically acknowledges all int sources. */ + u32 intr_status = readl(ioaddr + IntrStatus); - if (netif_rx_schedule_prep(dev)) { - /* Disable interrupts and register for poll */ - natsemi_irq_disable(dev); - __netif_rx_schedule(dev); - } - return IRQ_HANDLED; -} + if (netif_msg_intr(np)) + printk(KERN_DEBUG + "%s: Interrupt, status %#08x, mask %#08x.\n", + dev->name, intr_status, + readl(ioaddr + IntrMask)); -/* This is the NAPI poll routine. As well as the standard RX handling - * it also handles all other interrupts that the chip might raise. - */ -static int natsemi_poll(struct net_device *dev, int *budget) -{ - struct netdev_private *np = netdev_priv(dev); - void __iomem * ioaddr = ns_ioaddr(dev); + if (intr_status == 0) + break; + handled = 1; - int work_to_do = min(*budget, dev->quota); - int work_done = 0; + if (intr_status & + (IntrRxDone | IntrRxIntr | RxStatusFIFOOver | + IntrRxErr | IntrRxOverrun)) { + netdev_rx(dev); + } - do { - if (np->intr_status & - (IntrTxDone | IntrTxIntr | IntrTxIdle | IntrTxErr)) { + if (intr_status & + (IntrTxDone | IntrTxIntr | IntrTxIdle | IntrTxErr)) { spin_lock(&np->lock); netdev_tx_done(dev); spin_unlock(&np->lock); } /* Abnormal error summary/uncommon events handlers. */ - if (np->intr_status & IntrAbnormalSummary) - netdev_error(dev, np->intr_status); - - if (np->intr_status & - (IntrRxDone | IntrRxIntr | RxStatusFIFOOver | - IntrRxErr | IntrRxOverrun)) { - netdev_rx(dev, &work_done, work_to_do); + if (intr_status & IntrAbnormalSummary) + netdev_error(dev, intr_status); + + if (--boguscnt < 0) { + if (netif_msg_intr(np)) + printk(KERN_WARNING + "%s: Too much work at interrupt, " + "status=%#08x.\n", + dev->name, intr_status); + break; } - - *budget -= work_done; - dev->quota -= work_done; - - if (work_done >= work_to_do) - return 1; - - np->intr_status = readl(ioaddr + IntrStatus); - } while (np->intr_status); + } while (1); - netif_rx_complete(dev); - - /* Reenable interrupts providing nothing is trying to shut - * the chip down. */ - spin_lock(&np->lock); - if (!np->hands_off && netif_running(dev)) - natsemi_irq_enable(dev); - spin_unlock(&np->lock); + if (netif_msg_intr(np)) + printk(KERN_DEBUG "%s: exiting interrupt.\n", dev->name); - return 0; + return IRQ_RETVAL(handled); } /* This routine is logically part of the interrupt handler, but separated for clarity and better register allocation. */ -static void netdev_rx(struct net_device *dev, int *work_done, int work_to_do) +static void netdev_rx(struct net_device *dev) { struct netdev_private *np = netdev_priv(dev); int entry = np->cur_rx % RX_RING_SIZE; @@ -2189,12 +2237,6 @@ static void netdev_rx(struct net_device *dev, int *work_done, int work_to_do) entry, desc_status); if (--boguscnt < 0) break; - - if (*work_done >= work_to_do) - break; - - (*work_done)++; - pkt_len = (desc_status & DescSizeMask) - 4; if ((desc_status&(DescMore|DescPktOK|DescRxLong)) != DescPktOK){ if (desc_status & DescMore) { @@ -2206,23 +2248,6 @@ static void netdev_rx(struct net_device *dev, int *work_done, int work_to_do) "status %#08x.\n", dev->name, np->cur_rx, desc_status); np->stats.rx_length_errors++; - - /* The RX state machine has probably - * locked up beneath us. Follow the - * reset procedure documented in - * AN-1287. */ - - spin_lock_irq(&np->lock); - reset_rx(dev); - reinit_rx(dev); - writel(np->ring_dma, ioaddr + RxRingPtr); - check_link(dev); - spin_unlock_irq(&np->lock); - - /* We'll enable RX on exit from this - * function. */ - break; - } else { /* There was an error. */ np->stats.rx_errors++; @@ -2268,7 +2293,7 @@ static void netdev_rx(struct net_device *dev, int *work_done, int work_to_do) np->rx_skbuff[entry] = NULL; } skb->protocol = eth_type_trans(skb, dev); - netif_receive_skb(skb); + netif_rx(skb); dev->last_rx = jiffies; np->stats.rx_packets++; np->stats.rx_bytes += pkt_len; @@ -2471,8 +2496,7 @@ static int get_regs_len(struct net_device *dev) static int get_eeprom_len(struct net_device *dev) { - struct netdev_private *np = netdev_priv(dev); - return np->eeprom_size; + return NATSEMI_EEPROM_SIZE; } static int get_settings(struct net_device *dev, struct ethtool_cmd *ecmd) @@ -2559,20 +2583,15 @@ static u32 get_link(struct net_device *dev) static int get_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom, u8 *data) { struct netdev_private *np = netdev_priv(dev); - u8 *eebuf; + u8 eebuf[NATSEMI_EEPROM_SIZE]; int res; - eebuf = kmalloc(np->eeprom_size, GFP_KERNEL); - if (!eebuf) - return -ENOMEM; - eeprom->magic = PCI_VENDOR_ID_NS | (PCI_DEVICE_ID_NS_83815<<16); spin_lock_irq(&np->lock); res = netdev_get_eeprom(dev, eebuf); spin_unlock_irq(&np->lock); if (!res) memcpy(data, eebuf+eeprom->offset, eeprom->len); - kfree(eebuf); return res; } @@ -2928,10 +2947,9 @@ static int netdev_get_eeprom(struct net_device *dev, u8 *buf) int i; u16 *ebuf = (u16 *)buf; void __iomem * ioaddr = ns_ioaddr(dev); - struct netdev_private *np = netdev_priv(dev); /* eeprom_read reads 16 bits, and indexes by 16 bits */ - for (i = 0; i < np->eeprom_size/2; i++) { + for (i = 0; i < NATSEMI_EEPROM_SIZE/2; i++) { ebuf[i] = eeprom_read(ioaddr, i); /* The EEPROM itself stores data bit-swapped, but eeprom_read * reads it back "sanely". So we swap it back here in order to @@ -3056,7 +3074,9 @@ static int netdev_close(struct net_device *dev) del_timer_sync(&np->timer); disable_irq(dev->irq); spin_lock_irq(&np->lock); - natsemi_irq_disable(dev); + /* Disable interrupts, and flush posted writes */ + writel(0, ioaddr + IntrEnable); + readl(ioaddr + IntrEnable); np->hands_off = 1; spin_unlock_irq(&np->lock); enable_irq(dev->irq); @@ -3138,9 +3158,6 @@ static void __devexit natsemi_remove1 (struct pci_dev *pdev) * * netdev_timer: timer stopped by natsemi_suspend. * * intr_handler: doesn't acquire the spinlock. suspend calls * disable_irq() to enforce synchronization. - * * natsemi_poll: checks before reenabling interrupts. suspend - * sets hands_off, disables interrupts and then waits with - * netif_poll_disable(). * * Interrupts must be disabled, otherwise hands_off can cause irq storms. */ @@ -3166,8 +3183,6 @@ static int natsemi_suspend (struct pci_dev *pdev, pm_message_t state) spin_unlock_irq(&np->lock); enable_irq(dev->irq); - netif_poll_disable(dev); - /* Update the error counts. */ __get_stats(dev); @@ -3220,7 +3235,6 @@ static int natsemi_resume (struct pci_dev *pdev) mod_timer(&np->timer, jiffies + 1*HZ); } netif_device_attach(dev); - netif_poll_enable(dev); out: rtnl_unlock(); return 0; diff --git a/drivers/net/ne-h8300.c b/drivers/net/ne-h8300.c index 7ea3d596a..8f40368cf 100644 --- a/drivers/net/ne-h8300.c +++ b/drivers/net/ne-h8300.c @@ -27,7 +27,6 @@ static const char version1[] = #include #include #include -#include #include #include @@ -366,7 +365,7 @@ static void ne_reset_8390(struct net_device *dev) /* This check _should_not_ be necessary, omit eventually. */ while ((inb_p(NE_BASE+EN0_ISR) & ENISR_RESET) == 0) - if (time_after(jiffies, reset_start_time + 2*HZ/100)) { + if (jiffies - reset_start_time > 2*HZ/100) { printk(KERN_WARNING "%s: ne_reset_8390() did not complete.\n", dev->name); break; } @@ -581,7 +580,7 @@ retry: #endif while ((inb_p(NE_BASE + EN0_ISR) & ENISR_RDC) == 0) - if (time_after(jiffies, dma_start + 2*HZ/100)) { /* 20ms */ + if (jiffies - dma_start > 2*HZ/100) { /* 20ms */ printk(KERN_WARNING "%s: timeout waiting for Tx RDC.\n", dev->name); ne_reset_8390(dev); NS8390_init(dev,1); @@ -601,9 +600,9 @@ static int io[MAX_NE_CARDS]; static int irq[MAX_NE_CARDS]; static int bad[MAX_NE_CARDS]; /* 0xbad = bad sig or no reset ack */ -module_param_array(io, int, NULL, 0); -module_param_array(irq, int, NULL, 0); -module_param_array(bad, int, NULL, 0); +MODULE_PARM(io, "1-" __MODULE_STRING(MAX_NE_CARDS) "i"); +MODULE_PARM(irq, "1-" __MODULE_STRING(MAX_NE_CARDS) "i"); +MODULE_PARM(bad, "1-" __MODULE_STRING(MAX_NE_CARDS) "i"); MODULE_PARM_DESC(io, "I/O base address(es)"); MODULE_PARM_DESC(irq, "IRQ number(s)"); MODULE_DESCRIPTION("H8/300 NE2000 Ethernet driver"); diff --git a/drivers/net/ne.c b/drivers/net/ne.c index 963a11fa9..94f782d51 100644 --- a/drivers/net/ne.c +++ b/drivers/net/ne.c @@ -50,7 +50,6 @@ static const char version2[] = #include #include #include -#include #include #include @@ -139,9 +138,8 @@ bad_clone_list[] __initdata = { #if defined(CONFIG_PLAT_MAPPI) # define DCR_VAL 0x4b -#elif defined(CONFIG_PLAT_OAKS32R) || \ - defined(CONFIG_TOSHIBA_RBTX4927) || defined(CONFIG_TOSHIBA_RBTX4938) -# define DCR_VAL 0x48 /* 8-bit mode */ +#elif defined(CONFIG_PLAT_OAKS32R) +# define DCR_VAL 0x48 #else # define DCR_VAL 0x49 #endif @@ -227,7 +225,7 @@ struct net_device * __init ne_probe(int unit) netdev_boot_setup_check(dev); #ifdef CONFIG_TOSHIBA_RBTX4938 - dev->base_addr = RBTX4938_RTL_8019_BASE; + dev->base_addr = 0x07f20280; dev->irq = RBTX4938_RTL_8019_IRQ; #endif err = do_ne_probe(dev); @@ -343,7 +341,7 @@ static int __init ne_probe1(struct net_device *dev, int ioaddr) outb(inb(ioaddr + NE_RESET), ioaddr + NE_RESET); while ((inb_p(ioaddr + EN0_ISR) & ENISR_RESET) == 0) - if (time_after(jiffies, reset_start_time + 2*HZ/100)) { + if (jiffies - reset_start_time > 2*HZ/100) { if (bad_card) { printk(" (warning: no reset ack)"); break; @@ -397,22 +395,10 @@ static int __init ne_probe1(struct net_device *dev, int ioaddr) /* We must set the 8390 for word mode. */ outb_p(DCR_VAL, ioaddr + EN0_DCFG); start_page = NESM_START_PG; - - /* - * Realtek RTL8019AS datasheet says that the PSTOP register - * shouldn't exceed 0x60 in 8-bit mode. - * This chip can be identified by reading the signature from - * the remote byte count registers (otherwise write-only)... - */ - if ((DCR_VAL & 0x01) == 0 && /* 8-bit mode */ - inb(ioaddr + EN0_RCNTLO) == 0x50 && - inb(ioaddr + EN0_RCNTHI) == 0x70) - stop_page = 0x60; - else - stop_page = NESM_STOP_PG; + stop_page = NESM_STOP_PG; } else { start_page = NE1SM_START_PG; - stop_page = NE1SM_STOP_PG; + stop_page = NE1SM_STOP_PG; } #if defined(CONFIG_PLAT_MAPPI) || defined(CONFIG_PLAT_OAKS32R) @@ -522,9 +508,15 @@ static int __init ne_probe1(struct net_device *dev, int ioaddr) ei_status.name = name; ei_status.tx_start_page = start_page; ei_status.stop_page = stop_page; +#if defined(CONFIG_TOSHIBA_RBTX4927) || defined(CONFIG_TOSHIBA_RBTX4938) + wordlength = 1; +#endif - /* Use 16-bit mode only if this wasn't overridden by DCR_VAL */ - ei_status.word16 = (wordlength == 2 && (DCR_VAL & 0x01)); +#ifdef CONFIG_PLAT_OAKS32R + ei_status.word16 = 0; +#else + ei_status.word16 = (wordlength == 2); +#endif ei_status.rx_start_page = start_page + TX_PAGES; #ifdef PACKETBUF_MEMSIZE @@ -588,7 +580,7 @@ static void ne_reset_8390(struct net_device *dev) /* This check _should_not_ be necessary, omit eventually. */ while ((inb_p(NE_BASE+EN0_ISR) & ENISR_RESET) == 0) - if (time_after(jiffies, reset_start_time + 2*HZ/100)) { + if (jiffies - reset_start_time > 2*HZ/100) { printk(KERN_WARNING "%s: ne_reset_8390() did not complete.\n", dev->name); break; } @@ -795,7 +787,7 @@ retry: #endif while ((inb_p(nic_base + EN0_ISR) & ENISR_RDC) == 0) - if (time_after(jiffies, dma_start + 2*HZ/100)) { /* 20ms */ + if (jiffies - dma_start > 2*HZ/100) { /* 20ms */ printk(KERN_WARNING "%s: timeout waiting for Tx RDC.\n", dev->name); ne_reset_8390(dev); NS8390_init(dev,1); @@ -829,7 +821,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 init_module(void) +int init_module(void) { int this_dev, found = 0; diff --git a/drivers/net/ne2.c b/drivers/net/ne2.c index eebf5f02b..e6df375a1 100644 --- a/drivers/net/ne2.c +++ b/drivers/net/ne2.c @@ -75,7 +75,6 @@ static const char *version = "ne2.c:v0.91 Nov 16 1998 Wim Dumon #include #include -#include #include #include @@ -396,7 +395,7 @@ static int __init ne2_probe1(struct net_device *dev, int slot) outb(inb(base_addr + NE_RESET), base_addr + NE_RESET); while ((inb_p(base_addr + EN0_ISR) & ENISR_RESET) == 0) - if (time_after(jiffies, reset_start_time + 2*HZ/100)) { + if (jiffies - reset_start_time > 2*HZ/100) { printk(" not found (no reset ack).\n"); retval = -ENODEV; goto out; @@ -549,7 +548,7 @@ static void ne_reset_8390(struct net_device *dev) /* This check _should_not_ be necessary, omit eventually. */ while ((inb_p(NE_BASE+EN0_ISR) & ENISR_RESET) == 0) - if (time_after(jiffies, reset_start_time + 2*HZ/100)) { + if (jiffies - reset_start_time > 2*HZ/100) { printk("%s: ne_reset_8390() did not complete.\n", dev->name); break; @@ -750,7 +749,7 @@ retry: #endif while ((inb_p(nic_base + EN0_ISR) & ENISR_RDC) == 0) - if (time_after(jiffies, dma_start + 2*HZ/100)) { /* 20ms */ + if (jiffies - dma_start > 2*HZ/100) { /* 20ms */ printk("%s: timeout waiting for Tx RDC.\n", dev->name); ne_reset_8390(dev); NS8390_init(dev,1); @@ -780,7 +779,7 @@ MODULE_PARM_DESC(bad, "(ignored)"); /* Module code fixed by David Weinehall */ -int __init init_module(void) +int 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 34bdba9ee..d11821dd8 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)) { - dev_err(&pdev->dev, "no I/O resource at PCI BAR #0\n"); + printk (KERN_ERR PFX "no I/O resource at PCI BAR #0\n"); return -ENODEV; } if (request_region (ioaddr, NE_IO_EXTENT, DRV_NAME) == NULL) { - dev_err(&pdev->dev, "I/O resource 0x%x @ 0x%lx busy\n", + printk (KERN_ERR PFX "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) { - dev_err(&pdev->dev, "cannot allocate ethernet device\n"); + printk (KERN_ERR PFX "cannot allocate ethernet device\n"); goto err_out_free_res; } SET_MODULE_OWNER(dev); @@ -281,8 +281,7 @@ 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) { - dev_err(&pdev->dev, - "Card failure (no reset ack).\n"); + printk(KERN_ERR PFX "Card failure (no reset ack).\n"); goto err_out_free_netdev; } @@ -421,7 +420,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, IRQF_SHARED, dev->name, dev); + int ret = request_irq(dev->irq, ei_interrupt, SA_SHIRQ, dev->name, dev); if (ret) return ret; @@ -646,7 +645,9 @@ static void __devexit ne2k_pci_remove_one (struct pci_dev *pdev) { struct net_device *dev = pci_get_drvdata(pdev); - BUG_ON(!dev); + if (!dev) + BUG(); + unregister_netdev(dev); release_region(dev->base_addr, NE_IO_EXTENT); free_netdev(dev); diff --git a/drivers/net/netconsole.c b/drivers/net/netconsole.c index bf58db29e..edd1b5306 100644 --- a/drivers/net/netconsole.c +++ b/drivers/net/netconsole.c @@ -87,7 +87,6 @@ static void write_msg(struct console *con, const char *msg, unsigned int len) } static struct console netconsole = { - .name = "netcon", .flags = CON_ENABLED | CON_PRINTBUFFER, .write = write_msg }; @@ -95,7 +94,7 @@ static struct console netconsole = { static int option_setup(char *opt) { configured = !netpoll_parse_options(&np, opt); - return 1; + return 0; } __setup("netconsole=", option_setup); @@ -107,7 +106,7 @@ static int init_netconsole(void) if(!configured) { printk("netconsole: not configured, aborting\n"); - return 0; + return -EINVAL; } if(netpoll_setup(&np)) diff --git a/drivers/net/ni5010.c b/drivers/net/ni5010.c index d4be207d3..2ab01a5d1 100644 --- a/drivers/net/ni5010.c +++ b/drivers/net/ni5010.c @@ -1,12 +1,17 @@ /* ni5010.c: A network driver for the MiCom-Interlan NI5010 ethercard. * - * Copyright 1996,1997,2006 Jan-Pascal van Best and Andreas Mohr. + * Copyright 1996,1997 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: - * janpascal@vanbest.org andi@lisas.de + * 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 * * Sources: * Donald Becker's "skeleton.c" @@ -22,9 +27,8 @@ * 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: - * - not SMP-safe (no locking of I/O accesses) + * - None known... * - Note that you have to patch ifconfig for the new /proc/net/dev * format. It gives incorrect stats otherwise. * @@ -35,7 +39,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 say DMA is + * Implement DMA (Again, is this useful? Some docs says DMA is * slower than programmed I/O) * * Compile with: @@ -43,7 +47,7 @@ * -DMODULE -c ni5010.c * * Insert with e.g.: - * insmod ni5010.ko io=0x300 irq=5 + * insmod ni5010.o io=0x300 irq=5 */ #include @@ -65,15 +69,15 @@ #include "ni5010.h" -static const char boardname[] = "NI5010"; -static char version[] __initdata = - "ni5010.c: v1.02 20060611 Jan-Pascal van Best and Andreas Mohr\n"; +static const char *boardname = "NI5010"; +static char *version = + "ni5010.c: v1.00 06/23/97 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 @@ -277,7 +281,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) { @@ -301,7 +305,7 @@ static int __init ni5010_probe1(struct net_device *dev, int ioaddr) } else if (dev->irq == 2) { dev->irq = 9; } -#endif /* JUMPERED_INTERRUPTS */ +#endif /* jumpered_irq */ PRINTK2((KERN_DEBUG "%s: I/O #9 passed!\n", dev->name)); /* DMA is not supported (yet?), so no use detecting it */ @@ -330,7 +334,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; @@ -350,9 +354,11 @@ 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); @@ -365,7 +371,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 a non-reboot way to recover if something goes wrong. + * there is non-reboot way to recover if something goes wrong. */ static int ni5010_open(struct net_device *dev) @@ -384,13 +390,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. */ @@ -627,7 +633,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 */ @@ -760,12 +766,12 @@ static void ni5010_show_registers(struct net_device *dev) #ifdef MODULE static struct net_device *dev_ni5010; -module_param(io, int, 0); -module_param(irq, int, 0); +MODULE_PARM(io, "i"); +MODULE_PARM(irq, "i"); MODULE_PARM_DESC(io, "ni5010 I/O base address"); MODULE_PARM_DESC(irq, "ni5010 IRQ number"); -static int __init ni5010_init_module(void) +int init_module(void) { PRINTK2((KERN_DEBUG "%s: entering init_module\n", boardname)); /* @@ -786,15 +792,13 @@ static int __init ni5010_init_module(void) return 0; } -static void __exit ni5010_cleanup_module(void) +void 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 4d52ecf8a..fa854c8fd 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 init_module(void) +int 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 810cc572f..bb42ff218 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 init_module(void) +int 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 23397f994..b0c3b6ab6 100644 --- a/drivers/net/ns83820.c +++ b/drivers/net/ns83820.c @@ -96,6 +96,7 @@ //#define dprintk printk #define dprintk(x...) do { } while (0) +#include #include #include #include @@ -115,7 +116,6 @@ #include #include #include -#include #include #include @@ -567,7 +567,8 @@ static inline int ns83820_add_rx_skb(struct ns83820 *dev, struct sk_buff *skb) #endif sg = dev->rx_info.descs + (next_empty * DESC_SIZE); - BUG_ON(NULL != dev->rx_info.skbs[next_empty]); + if (unlikely(NULL != dev->rx_info.skbs[next_empty])) + BUG(); dev->rx_info.skbs[next_empty] = skb; dev->rx_info.next_empty = (next_empty + 1) % NR_RX_DESC; @@ -650,7 +651,7 @@ static void FASTCALL(phy_intr(struct net_device *ndev)); static void fastcall phy_intr(struct net_device *ndev) { struct ns83820 *dev = PRIV(ndev); - static const char *speeds[] = { "10", "100", "1000", "1000(?)", "1000F" }; + static char *speeds[] = { "10", "100", "1000", "1000(?)", "1000F" }; u32 cfg, new_cfg; u32 tbisr, tanar, tanlpar; int speed, fullduplex, newlinkstate; @@ -803,7 +804,7 @@ static int ns83820_setup_rx(struct net_device *ndev) writel(dev->IMR_cache, dev->base + IMR); writel(1, dev->base + IER); - spin_unlock(&dev->misc_lock); + spin_unlock_irq(&dev->misc_lock); kick_rx(ndev); @@ -1012,6 +1013,8 @@ 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); @@ -1067,6 +1070,7 @@ 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) @@ -1278,13 +1282,11 @@ 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) { - unsigned long flags; - spin_lock_irqsave(&dev->misc_lock, flags); + spin_lock(&dev->misc_lock); ns83820_update_stats(dev); - spin_unlock_irqrestore(&dev->misc_lock, flags); + spin_unlock(&dev->misc_lock); } static void ns83820_do_isr(struct net_device *ndev, u32 isr); @@ -1306,8 +1308,6 @@ 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_irqsave(&dev->misc_lock, flags); + spin_lock_irq(&dev->misc_lock); dev->IMR_cache &= ~(ISR_RXDESC | ISR_RXOK); writel(dev->IMR_cache, dev->base + IMR); - spin_unlock_irqrestore(&dev->misc_lock, flags); + spin_unlock_irq(&dev->misc_lock); tasklet_schedule(&dev->rx_tasklet); //rx_irq(ndev); @@ -1371,18 +1371,16 @@ 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_irqsave(&dev->misc_lock, flags); + spin_lock_irq(&dev->misc_lock); dev->IMR_cache &= ~ISR_TXOK; writel(dev->IMR_cache, dev->base + IMR); - spin_unlock_irqrestore(&dev->misc_lock, flags); + spin_unlock_irq(&dev->misc_lock); } } @@ -1393,10 +1391,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_irqsave(&dev->misc_lock, flags); + spin_lock_irq(&dev->misc_lock); dev->IMR_cache |= ISR_TXOK; writel(dev->IMR_cache, dev->base + IMR); - spin_unlock_irqrestore(&dev->misc_lock, flags); + spin_unlock_irq(&dev->misc_lock); } /* MIB interrupt: one of the statistics counters is about to overflow */ @@ -1458,7 +1456,7 @@ static void ns83820_tx_timeout(struct net_device *ndev) u32 tx_done_idx, *desc; unsigned long flags; - spin_lock_irqsave(&dev->tx_lock, flags); + local_irq_save(flags); tx_done_idx = dev->tx_done_idx; desc = dev->tx_descs + (tx_done_idx * DESC_SIZE); @@ -1485,7 +1483,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])); - spin_unlock_irqrestore(&dev->tx_lock, flags); + local_irq_restore(flags); } static void ns83820_tx_watch(unsigned long data) @@ -1609,7 +1607,7 @@ static void ns83820_run_bist(struct net_device *ndev, const char *name, u32 enab { struct ns83820 *dev = PRIV(ndev); int timed_out = 0; - unsigned long start; + long start; u32 status; int loops = 0; @@ -1627,7 +1625,7 @@ static void ns83820_run_bist(struct net_device *ndev, const char *name, u32 enab break; if (status & fail) break; - if (time_after_eq(jiffies, start + HZ)) { + if ((jiffies - start) >= HZ) { timed_out = 1; break; } @@ -1829,13 +1827,13 @@ static int __devinit ns83820_init_one(struct pci_dev *pci_dev, const struct pci_ int using_dac = 0; /* See if we can set the dma mask early on; failure is fatal. */ - if (sizeof(dma_addr_t) == 8 && - !pci_set_dma_mask(pci_dev, DMA_64BIT_MASK)) { + if (sizeof(dma_addr_t) == 8 && + !pci_set_dma_mask(pci_dev, 0xffffffffffffffffULL)) { using_dac = 1; - } else if (!pci_set_dma_mask(pci_dev, DMA_32BIT_MASK)) { + } else if (!pci_set_dma_mask(pci_dev, 0xffffffff)) { using_dac = 0; } else { - dev_warn(&pci_dev->dev, "pci_set_dma_mask failed!\n"); + printk(KERN_WARNING "ns83820.c: pci_set_dma_mask failed!\n"); return -ENODEV; } @@ -1858,7 +1856,7 @@ static int __devinit ns83820_init_one(struct pci_dev *pci_dev, const struct pci_ err = pci_enable_device(pci_dev); if (err) { - dev_info(&pci_dev->dev, "pci_enable_dev failed: %d\n", err); + printk(KERN_INFO "ns83820: pci_enable_dev failed: %d\n", err); goto out_free; } @@ -1884,11 +1882,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, IRQF_SHARED, + err = request_irq(pci_dev->irq, ns83820_irq, SA_SHIRQ, DRV_NAME, ndev); if (err) { - dev_info(&pci_dev->dev, "unable to register irq %d, err %d\n", - pci_dev->irq, err); + printk(KERN_INFO "ns83820: unable to register irq %d\n", + pci_dev->irq); goto out_disable; } @@ -1902,7 +1900,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) { - dev_info(&pci_dev->dev, "unable to get netdev name: %d\n", err); + printk(KERN_INFO "ns83820: unable to get netdev name: %d\n", err); goto out_free_irq; } @@ -2189,7 +2187,6 @@ static void __exit ns83820_exit(void) MODULE_AUTHOR("Benjamin LaHaise "); MODULE_DESCRIPTION("National Semiconductor DP83820 10/100/1000 driver"); MODULE_LICENSE("GPL"); -MODULE_VERSION(VERSION); MODULE_DEVICE_TABLE(pci, ns83820_pci_tbl); diff --git a/drivers/net/oaknet.c b/drivers/net/oaknet.c index d0f686d6e..62167a29d 100644 --- a/drivers/net/oaknet.c +++ b/drivers/net/oaknet.c @@ -20,7 +20,6 @@ #include #include #include -#include #include #include @@ -607,7 +606,7 @@ retry: #endif while ((ei_ibp(base + EN0_ISR) & ENISR_RDC) == 0) { - if (time_after(jiffies, start + OAKNET_WAIT)) { + if (jiffies - start > OAKNET_WAIT) { printk("%s: timeout waiting for Tx RDC.\n", dev->name); oaknet_reset_8390(dev); NS8390_init(dev, TRUE); diff --git a/drivers/net/pci-skeleton.c b/drivers/net/pci-skeleton.c index e0e293964..a7bb54df7 100644 --- a/drivers/net/pci-skeleton.c +++ b/drivers/net/pci-skeleton.c @@ -85,6 +85,7 @@ IVc. Errata */ +#include #include #include #include @@ -601,7 +602,7 @@ static int __devinit netdrv_init_board (struct pci_dev *pdev, /* dev zeroed in alloc_etherdev */ dev = alloc_etherdev (sizeof (*tp)); if (dev == NULL) { - dev_err(&pdev->dev, "unable to alloc new ethernet\n"); + printk (KERN_ERR PFX "unable to alloc new ethernet\n"); DPRINTK ("EXIT, returning -ENOMEM\n"); return -ENOMEM; } @@ -631,14 +632,14 @@ static int __devinit netdrv_init_board (struct pci_dev *pdev, /* make sure PCI base addr 0 is PIO */ if (!(pio_flags & IORESOURCE_IO)) { - dev_err(&pdev->dev, "region #0 not a PIO resource, aborting\n"); + printk (KERN_ERR PFX "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)) { - dev_err(&pdev->dev, "region #1 not an MMIO resource, aborting\n"); + printk (KERN_ERR PFX "region #1 not an MMIO resource, aborting\n"); rc = -ENODEV; goto err_out; } @@ -646,12 +647,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)) { - dev_err(&pdev->dev, "Invalid PCI region size(s), aborting\n"); + printk (KERN_ERR PFX "Invalid PCI region size(s), aborting\n"); rc = -ENODEV; goto err_out; } - rc = pci_request_regions (pdev, MODNAME); + rc = pci_request_regions (pdev, "pci-skeleton"); if (rc) goto err_out; @@ -663,7 +664,7 @@ static int __devinit netdrv_init_board (struct pci_dev *pdev, /* ioremap MMIO region */ ioaddr = ioremap (mmio_start, mmio_len); if (ioaddr == NULL) { - dev_err(&pdev->dev, "cannot remap MMIO, aborting\n"); + printk (KERN_ERR PFX "cannot remap MMIO, aborting\n"); rc = -EIO; goto err_out_free_res; } @@ -699,10 +700,9 @@ static int __devinit netdrv_init_board (struct pci_dev *pdev, } /* if unknown chip, assume array element #0, original RTL-8139 in this case */ - 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)); + 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)); 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, IRQF_SHARED, dev->name, dev); + retval = request_irq (dev->irq, netdrv_interrupt, SA_SHIRQ, dev->name, dev); if (retval) { DPRINTK ("EXIT, returning %d\n", retval); return retval; diff --git a/drivers/net/pcmcia/3c574_cs.c b/drivers/net/pcmcia/3c574_cs.c index fab93360f..48774efee 100644 --- a/drivers/net/pcmcia/3c574_cs.c +++ b/drivers/net/pcmcia/3c574_cs.c @@ -204,7 +204,7 @@ enum Window4 { /* Window 4: Xcvr/media bits. */ #define MEDIA_TP 0x00C0 /* Enable link beat and jabber for 10baseT. */ struct el3_private { - struct pcmcia_device *p_dev; + dev_link_t link; dev_node_t node; struct net_device_stats stats; u16 advertising, partner; /* NWay media advertisement */ @@ -225,8 +225,8 @@ static char mii_preamble_required = 0; /* Index of functions. */ -static int tc574_config(struct pcmcia_device *link); -static void tc574_release(struct pcmcia_device *link); +static void tc574_config(dev_link_t *link); +static void tc574_release(dev_link_t *link); static void mdio_sync(kio_addr_t ioaddr, int bits); static int mdio_read(kio_addr_t ioaddr, int phy_id, int location); @@ -256,9 +256,10 @@ static void tc574_detach(struct pcmcia_device *p_dev); with Card Services. */ -static int tc574_probe(struct pcmcia_device *link) +static int tc574_attach(struct pcmcia_device *p_dev) { struct el3_private *lp; + dev_link_t *link; struct net_device *dev; DEBUG(0, "3c574_attach()\n"); @@ -268,8 +269,8 @@ static int tc574_probe(struct pcmcia_device *link) if (!dev) return -ENOMEM; lp = netdev_priv(dev); + link = &lp->link; link->priv = dev; - lp->p_dev = link; spin_lock_init(&lp->window_lock); link->io.NumPorts1 = 32; @@ -279,6 +280,7 @@ static int tc574_probe(struct pcmcia_device *link) link->irq.Handler = &el3_interrupt; link->irq.Instance = dev; link->conf.Attributes = CONF_ENABLE_IRQ; + link->conf.Vcc = 50; link->conf.IntType = INT_MEMORY_AND_IO; link->conf.ConfigIndex = 1; link->conf.Present = PRESENT_OPTION; @@ -296,7 +298,13 @@ static int tc574_probe(struct pcmcia_device *link) dev->watchdog_timeo = TX_TIMEOUT; #endif - return tc574_config(link); + link->handle = p_dev; + p_dev->instance = link; + + link->state |= DEV_PRESENT | DEV_CONFIG_PENDING; + tc574_config(link); + + return 0; } /* tc574_attach */ /* @@ -308,16 +316,18 @@ static int tc574_probe(struct pcmcia_device *link) */ -static void tc574_detach(struct pcmcia_device *link) +static void tc574_detach(struct pcmcia_device *p_dev) { + dev_link_t *link = dev_to_instance(p_dev); struct net_device *dev = link->priv; DEBUG(0, "3c574_detach(0x%p)\n", link); - if (link->dev_node) + if (link->dev) unregister_netdev(dev); - tc574_release(link); + if (link->state & DEV_CONFIG) + tc574_release(link); free_netdev(dev); } /* tc574_detach */ @@ -331,10 +341,11 @@ static void tc574_detach(struct pcmcia_device *link) #define CS_CHECK(fn, ret) \ do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0) -static const char *ram_split[] = {"5:3", "3:1", "1:1", "3:5"}; +static char *ram_split[] = {"5:3", "3:1", "1:1", "3:5"}; -static int tc574_config(struct pcmcia_device *link) +static void tc574_config(dev_link_t *link) { + client_handle_t handle = link->handle; struct net_device *dev = link->priv; struct el3_private *lp = netdev_priv(dev); tuple_t tuple; @@ -352,27 +363,30 @@ static int tc574_config(struct pcmcia_device *link) tuple.Attributes = 0; tuple.DesiredTuple = CISTPL_CONFIG; - CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(link, &tuple)); + CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple)); tuple.TupleData = (cisdata_t *)buf; tuple.TupleDataMax = 64; tuple.TupleOffset = 0; - CS_CHECK(GetTupleData, pcmcia_get_tuple_data(link, &tuple)); - CS_CHECK(ParseTuple, pcmcia_parse_tuple(link, &tuple, &parse)); + CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple)); + CS_CHECK(ParseTuple, pcmcia_parse_tuple(handle, &tuple, &parse)); link->conf.ConfigBase = parse.config.base; link->conf.Present = parse.config.rmask[0]; + /* Configure card */ + link->state |= DEV_CONFIG; + link->io.IOAddrLines = 16; for (i = j = 0; j < 0x400; j += 0x20) { link->io.BasePort1 = j ^ 0x300; - i = pcmcia_request_io(link, &link->io); + i = pcmcia_request_io(link->handle, &link->io); if (i == CS_SUCCESS) break; } if (i != CS_SUCCESS) { - cs_error(link, RequestIO, i); + cs_error(link->handle, RequestIO, i); goto failed; } - CS_CHECK(RequestIRQ, pcmcia_request_irq(link, &link->irq)); - CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link, &link->conf)); + CS_CHECK(RequestIRQ, pcmcia_request_irq(link->handle, &link->irq)); + CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link->handle, &link->conf)); dev->irq = link->irq.AssignedIRQ; dev->base_addr = link->io.BasePort1; @@ -383,8 +397,8 @@ static int tc574_config(struct pcmcia_device *link) the hardware address. The future products may include a modem chip and put the address in the CIS. */ tuple.DesiredTuple = 0x88; - if (pcmcia_get_first_tuple(link, &tuple) == CS_SUCCESS) { - pcmcia_get_tuple_data(link, &tuple); + if (pcmcia_get_first_tuple(handle, &tuple) == CS_SUCCESS) { + pcmcia_get_tuple_data(handle, &tuple); for (i = 0; i < 3; i++) phys_addr[i] = htons(buf[i]); } else { @@ -398,9 +412,9 @@ static int tc574_config(struct pcmcia_device *link) } } tuple.DesiredTuple = CISTPL_VERS_1; - if (pcmcia_get_first_tuple(link, &tuple) == CS_SUCCESS && - pcmcia_get_tuple_data(link, &tuple) == CS_SUCCESS && - pcmcia_parse_tuple(link, &tuple, &parse) == CS_SUCCESS) { + if (pcmcia_get_first_tuple(handle, &tuple) == CS_SUCCESS && + pcmcia_get_tuple_data(handle, &tuple) == CS_SUCCESS && + pcmcia_parse_tuple(handle, &tuple, &parse) == CS_SUCCESS) { cardname = parse.version_1.str + parse.version_1.ofs[1]; } else cardname = "3Com 3c574"; @@ -459,12 +473,13 @@ static int tc574_config(struct pcmcia_device *link) } } - link->dev_node = &lp->node; - SET_NETDEV_DEV(dev, &handle_to_dev(link)); + link->state &= ~DEV_CONFIG_PENDING; + link->dev = &lp->node; + SET_NETDEV_DEV(dev, &handle_to_dev(handle)); if (register_netdev(dev) != 0) { printk(KERN_NOTICE "3c574_cs: register_netdev() failed\n"); - link->dev_node = NULL; + link->dev = NULL; goto failed; } @@ -478,13 +493,13 @@ static int tc574_config(struct pcmcia_device *link) 8 << config.u.ram_size, ram_split[config.u.ram_split], config.u.autoselect ? "autoselect " : ""); - return 0; + return; cs_failed: - cs_error(link, last_fn, last_ret); + cs_error(link->handle, last_fn, last_ret); failed: tc574_release(link); - return -ENODEV; + return; } /* tc574_config */ @@ -494,28 +509,44 @@ failed: still open, this will be postponed until it is closed. */ -static void tc574_release(struct pcmcia_device *link) +static void tc574_release(dev_link_t *link) { - pcmcia_disable_device(link); + DEBUG(0, "3c574_release(0x%p)\n", link); + + pcmcia_release_configuration(link->handle); + pcmcia_release_io(link->handle, &link->io); + pcmcia_release_irq(link->handle, &link->irq); + + link->state &= ~DEV_CONFIG; } -static int tc574_suspend(struct pcmcia_device *link) +static int tc574_suspend(struct pcmcia_device *p_dev) { + dev_link_t *link = dev_to_instance(p_dev); struct net_device *dev = link->priv; - if (link->open) - netif_device_detach(dev); + link->state |= DEV_SUSPEND; + if (link->state & DEV_CONFIG) { + if (link->open) + netif_device_detach(dev); + pcmcia_release_configuration(link->handle); + } return 0; } -static int tc574_resume(struct pcmcia_device *link) +static int tc574_resume(struct pcmcia_device *p_dev) { + dev_link_t *link = dev_to_instance(p_dev); struct net_device *dev = link->priv; - if (link->open) { - tc574_reset(dev); - netif_device_attach(dev); + link->state &= ~DEV_SUSPEND; + if (link->state & DEV_CONFIG) { + pcmcia_request_configuration(link->handle, &link->conf); + if (link->open) { + tc574_reset(dev); + netif_device_attach(dev); + } } return 0; @@ -726,9 +757,9 @@ static void tc574_reset(struct net_device *dev) static int el3_open(struct net_device *dev) { struct el3_private *lp = netdev_priv(dev); - struct pcmcia_device *link = lp->p_dev; + dev_link_t *link = &lp->link; - if (!pcmcia_dev_present(link)) + if (!DEV_OK(link)) return -ENODEV; link->open++; @@ -1172,11 +1203,11 @@ static int el3_close(struct net_device *dev) { kio_addr_t ioaddr = dev->base_addr; struct el3_private *lp = netdev_priv(dev); - struct pcmcia_device *link = lp->p_dev; + dev_link_t *link = &lp->link; DEBUG(2, "%s: shutting down ethercard.\n", dev->name); - if (pcmcia_dev_present(link)) { + if (DEV_OK(link)) { unsigned long flags; /* Turn off statistics ASAP. We update lp->stats below. */ @@ -1215,7 +1246,7 @@ static struct pcmcia_driver tc574_driver = { .drv = { .name = "3c574_cs", }, - .probe = tc574_probe, + .probe = tc574_attach, .remove = tc574_detach, .id_table = tc574_ids, .suspend = tc574_suspend, diff --git a/drivers/net/pcmcia/3c589_cs.c b/drivers/net/pcmcia/3c589_cs.c index 875a0fe25..1c3c9c666 100644 --- a/drivers/net/pcmcia/3c589_cs.c +++ b/drivers/net/pcmcia/3c589_cs.c @@ -39,7 +39,6 @@ #include #include #include -#include #include #include @@ -105,7 +104,7 @@ enum RxFilter { #define TX_TIMEOUT ((400*HZ)/1000) struct el3_private { - struct pcmcia_device *p_dev; + dev_link_t link; dev_node_t node; struct net_device_stats stats; /* For transceiver monitoring */ @@ -116,7 +115,7 @@ struct el3_private { spinlock_t lock; }; -static const char *if_names[] = { "auto", "10baseT", "10base2", "AUI" }; +static char *if_names[] = { "auto", "10baseT", "10base2", "AUI" }; /*====================================================================*/ @@ -142,8 +141,8 @@ DRV_NAME ".c " DRV_VERSION " 2001/10/13 00:08:50 (David Hinds)"; /*====================================================================*/ -static int tc589_config(struct pcmcia_device *link); -static void tc589_release(struct pcmcia_device *link); +static void tc589_config(dev_link_t *link); +static void tc589_release(dev_link_t *link); static u16 read_eeprom(kio_addr_t ioaddr, int index); static void tc589_reset(struct net_device *dev); @@ -170,9 +169,10 @@ static void tc589_detach(struct pcmcia_device *p_dev); ======================================================================*/ -static int tc589_probe(struct pcmcia_device *link) +static int tc589_attach(struct pcmcia_device *p_dev) { struct el3_private *lp; + dev_link_t *link; struct net_device *dev; DEBUG(0, "3c589_attach()\n"); @@ -182,8 +182,8 @@ static int tc589_probe(struct pcmcia_device *link) if (!dev) return -ENOMEM; lp = netdev_priv(dev); + link = &lp->link; link->priv = dev; - lp->p_dev = link; spin_lock_init(&lp->lock); link->io.NumPorts1 = 16; @@ -193,6 +193,7 @@ static int tc589_probe(struct pcmcia_device *link) link->irq.Handler = &el3_interrupt; link->irq.Instance = dev; link->conf.Attributes = CONF_ENABLE_IRQ; + link->conf.Vcc = 50; link->conf.IntType = INT_MEMORY_AND_IO; link->conf.ConfigIndex = 1; link->conf.Present = PRESENT_OPTION; @@ -211,7 +212,13 @@ static int tc589_probe(struct pcmcia_device *link) #endif SET_ETHTOOL_OPS(dev, &netdev_ethtool_ops); - return tc589_config(link); + link->handle = p_dev; + p_dev->instance = link; + + link->state |= DEV_PRESENT | DEV_CONFIG_PENDING; + tc589_config(link); + + return 0; } /* tc589_attach */ /*====================================================================== @@ -223,16 +230,18 @@ static int tc589_probe(struct pcmcia_device *link) ======================================================================*/ -static void tc589_detach(struct pcmcia_device *link) +static void tc589_detach(struct pcmcia_device *p_dev) { + dev_link_t *link = dev_to_instance(p_dev); struct net_device *dev = link->priv; DEBUG(0, "3c589_detach(0x%p)\n", link); - if (link->dev_node) + if (link->dev) unregister_netdev(dev); - tc589_release(link); + if (link->state & DEV_CONFIG) + tc589_release(link); free_netdev(dev); } /* tc589_detach */ @@ -248,8 +257,9 @@ static void tc589_detach(struct pcmcia_device *link) #define CS_CHECK(fn, ret) \ do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0) -static int tc589_config(struct pcmcia_device *link) +static void tc589_config(dev_link_t *link) { + client_handle_t handle = link->handle; struct net_device *dev = link->priv; struct el3_private *lp = netdev_priv(dev); tuple_t tuple; @@ -264,40 +274,43 @@ static int tc589_config(struct pcmcia_device *link) phys_addr = (u16 *)dev->dev_addr; tuple.Attributes = 0; tuple.DesiredTuple = CISTPL_CONFIG; - CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(link, &tuple)); + CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple)); tuple.TupleData = (cisdata_t *)buf; tuple.TupleDataMax = sizeof(buf); tuple.TupleOffset = 0; - CS_CHECK(GetTupleData, pcmcia_get_tuple_data(link, &tuple)); - CS_CHECK(ParseTuple, pcmcia_parse_tuple(link, &tuple, &parse)); + CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple)); + CS_CHECK(ParseTuple, pcmcia_parse_tuple(handle, &tuple, &parse)); link->conf.ConfigBase = parse.config.base; link->conf.Present = parse.config.rmask[0]; /* Is this a 3c562? */ tuple.DesiredTuple = CISTPL_MANFID; tuple.Attributes = TUPLE_RETURN_COMMON; - if ((pcmcia_get_first_tuple(link, &tuple) == CS_SUCCESS) && - (pcmcia_get_tuple_data(link, &tuple) == CS_SUCCESS)) { + if ((pcmcia_get_first_tuple(handle, &tuple) == CS_SUCCESS) && + (pcmcia_get_tuple_data(handle, &tuple) == CS_SUCCESS)) { if (le16_to_cpu(buf[0]) != MANFID_3COM) printk(KERN_INFO "3c589_cs: hmmm, is this really a " "3Com card??\n"); multi = (le16_to_cpu(buf[1]) == PRODID_3COM_3C562); } + + /* Configure card */ + link->state |= DEV_CONFIG; /* For the 3c562, the base address must be xx00-xx7f */ link->io.IOAddrLines = 16; for (i = j = 0; j < 0x400; j += 0x10) { if (multi && (j & 0x80)) continue; link->io.BasePort1 = j ^ 0x300; - i = pcmcia_request_io(link, &link->io); + i = pcmcia_request_io(link->handle, &link->io); if (i == CS_SUCCESS) break; } if (i != CS_SUCCESS) { - cs_error(link, RequestIO, i); + cs_error(link->handle, RequestIO, i); goto failed; } - CS_CHECK(RequestIRQ, pcmcia_request_irq(link, &link->irq)); - CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link, &link->conf)); + CS_CHECK(RequestIRQ, pcmcia_request_irq(link->handle, &link->irq)); + CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link->handle, &link->conf)); dev->irq = link->irq.AssignedIRQ; dev->base_addr = link->io.BasePort1; @@ -307,8 +320,8 @@ static int tc589_config(struct pcmcia_device *link) /* The 3c589 has an extra EEPROM for configuration info, including the hardware address. The 3c562 puts the address in the CIS. */ tuple.DesiredTuple = 0x88; - if (pcmcia_get_first_tuple(link, &tuple) == CS_SUCCESS) { - pcmcia_get_tuple_data(link, &tuple); + if (pcmcia_get_first_tuple(handle, &tuple) == CS_SUCCESS) { + pcmcia_get_tuple_data(handle, &tuple); for (i = 0; i < 3; i++) phys_addr[i] = htons(buf[i]); } else { @@ -332,12 +345,13 @@ static int tc589_config(struct pcmcia_device *link) else printk(KERN_ERR "3c589_cs: invalid if_port requested\n"); - link->dev_node = &lp->node; - SET_NETDEV_DEV(dev, &handle_to_dev(link)); + link->dev = &lp->node; + link->state &= ~DEV_CONFIG_PENDING; + SET_NETDEV_DEV(dev, &handle_to_dev(handle)); if (register_netdev(dev) != 0) { printk(KERN_ERR "3c589_cs: register_netdev() failed\n"); - link->dev_node = NULL; + link->dev = NULL; goto failed; } @@ -351,13 +365,14 @@ static int tc589_config(struct pcmcia_device *link) printk(KERN_INFO " %dK FIFO split %s Rx:Tx, %s xcvr\n", (fifo & 7) ? 32 : 8, ram_split[(fifo >> 16) & 3], if_names[dev->if_port]); - return 0; + return; cs_failed: - cs_error(link, last_fn, last_ret); + cs_error(link->handle, last_fn, last_ret); failed: tc589_release(link); - return -ENODEV; + return; + } /* tc589_config */ /*====================================================================== @@ -368,28 +383,44 @@ failed: ======================================================================*/ -static void tc589_release(struct pcmcia_device *link) +static void tc589_release(dev_link_t *link) { - pcmcia_disable_device(link); + DEBUG(0, "3c589_release(0x%p)\n", link); + + pcmcia_release_configuration(link->handle); + pcmcia_release_io(link->handle, &link->io); + pcmcia_release_irq(link->handle, &link->irq); + + link->state &= ~DEV_CONFIG; } -static int tc589_suspend(struct pcmcia_device *link) +static int tc589_suspend(struct pcmcia_device *p_dev) { + dev_link_t *link = dev_to_instance(p_dev); struct net_device *dev = link->priv; - if (link->open) - netif_device_detach(dev); + link->state |= DEV_SUSPEND; + if (link->state & DEV_CONFIG) { + if (link->open) + netif_device_detach(dev); + pcmcia_release_configuration(link->handle); + } return 0; } -static int tc589_resume(struct pcmcia_device *link) +static int tc589_resume(struct pcmcia_device *p_dev) { + dev_link_t *link = dev_to_instance(p_dev); struct net_device *dev = link->priv; - if (link->open) { - tc589_reset(dev); - netif_device_attach(dev); + link->state &= ~DEV_SUSPEND; + if (link->state & DEV_CONFIG) { + pcmcia_request_configuration(link->handle, &link->conf); + if (link->open) { + tc589_reset(dev); + netif_device_attach(dev); + } } return 0; @@ -555,9 +586,9 @@ static int el3_config(struct net_device *dev, struct ifmap *map) static int el3_open(struct net_device *dev) { struct el3_private *lp = netdev_priv(dev); - struct pcmcia_device *link = lp->p_dev; + dev_link_t *link = &lp->link; - if (!pcmcia_dev_present(link)) + if (!DEV_OK(link)) return -ENODEV; link->open++; @@ -765,7 +796,7 @@ static void media_check(unsigned long arg) media = inw(ioaddr+WN4_MEDIA) & 0xc810; /* Ignore collisions unless we've had no irq's recently */ - if (time_before(jiffies, lp->last_irq + HZ)) { + if (jiffies - lp->last_irq < HZ) { media &= ~0x0010; } else { /* Try harder to detect carrier errors */ @@ -816,9 +847,9 @@ static struct net_device_stats *el3_get_stats(struct net_device *dev) { struct el3_private *lp = netdev_priv(dev); unsigned long flags; - struct pcmcia_device *link = lp->p_dev; + dev_link_t *link = &lp->link; - if (pcmcia_dev_present(link)) { + if (DEV_OK(link)) { spin_lock_irqsave(&lp->lock, flags); update_stats(dev); spin_unlock_irqrestore(&lp->lock, flags); @@ -918,11 +949,11 @@ static int el3_rx(struct net_device *dev) static void set_multicast_list(struct net_device *dev) { struct el3_private *lp = netdev_priv(dev); - struct pcmcia_device *link = lp->p_dev; + dev_link_t *link = &lp->link; kio_addr_t ioaddr = dev->base_addr; u16 opts = SetRxFilter | RxStation | RxBroadcast; - if (!pcmcia_dev_present(link)) return; + if (!(DEV_OK(link))) return; if (dev->flags & IFF_PROMISC) opts |= RxMulticast | RxProm; else if (dev->mc_count || (dev->flags & IFF_ALLMULTI)) @@ -933,12 +964,12 @@ static void set_multicast_list(struct net_device *dev) static int el3_close(struct net_device *dev) { struct el3_private *lp = netdev_priv(dev); - struct pcmcia_device *link = lp->p_dev; + dev_link_t *link = &lp->link; kio_addr_t ioaddr = dev->base_addr; DEBUG(1, "%s: shutting down ethercard.\n", dev->name); - if (pcmcia_dev_present(link)) { + if (DEV_OK(link)) { /* Turn off statistics ASAP. We update lp->stats below. */ outw(StatsDisable, ioaddr + EL3_CMD); @@ -988,7 +1019,7 @@ static struct pcmcia_driver tc589_driver = { .drv = { .name = "3c589_cs", }, - .probe = tc589_probe, + .probe = tc589_attach, .remove = tc589_detach, .id_table = tc589_ids, .suspend = tc589_suspend, diff --git a/drivers/net/pcmcia/axnet_cs.c b/drivers/net/pcmcia/axnet_cs.c index 297e9f805..aa5581369 100644 --- a/drivers/net/pcmcia/axnet_cs.c +++ b/drivers/net/pcmcia/axnet_cs.c @@ -35,7 +35,6 @@ #include #include #include -#include #include "../8390.h" #include @@ -86,8 +85,8 @@ static char *version = /*====================================================================*/ -static int axnet_config(struct pcmcia_device *link); -static void axnet_release(struct pcmcia_device *link); +static void axnet_config(dev_link_t *link); +static void axnet_release(dev_link_t *link); static int axnet_open(struct net_device *dev); static int axnet_close(struct net_device *dev); static int axnet_ioctl(struct net_device *dev, struct ifreq *rq, int cmd); @@ -117,7 +116,7 @@ static irqreturn_t ax_interrupt(int irq, void *dev_id, struct pt_regs *regs); /*====================================================================*/ typedef struct axnet_dev_t { - struct pcmcia_device *p_dev; + dev_link_t link; dev_node_t node; caddr_t base; struct timer_list watchdog; @@ -142,9 +141,10 @@ static inline axnet_dev_t *PRIV(struct net_device *dev) ======================================================================*/ -static int axnet_probe(struct pcmcia_device *link) +static int axnet_attach(struct pcmcia_device *p_dev) { axnet_dev_t *info; + dev_link_t *link; struct net_device *dev; DEBUG(0, "axnet_attach()\n"); @@ -156,7 +156,7 @@ static int axnet_probe(struct pcmcia_device *link) return -ENOMEM; info = PRIV(dev); - info->p_dev = link; + link = &info->link; link->priv = dev; link->irq.Attributes = IRQ_TYPE_EXCLUSIVE; link->irq.IRQInfo1 = IRQ_LEVEL_ID; @@ -168,7 +168,13 @@ static int axnet_probe(struct pcmcia_device *link) dev->do_ioctl = &axnet_ioctl; SET_ETHTOOL_OPS(dev, &netdev_ethtool_ops); - return axnet_config(link); + link->handle = p_dev; + p_dev->instance = link; + + link->state |= DEV_PRESENT | DEV_CONFIG_PENDING; + axnet_config(link); + + return 0; } /* axnet_attach */ /*====================================================================== @@ -180,16 +186,18 @@ static int axnet_probe(struct pcmcia_device *link) ======================================================================*/ -static void axnet_detach(struct pcmcia_device *link) +static void axnet_detach(struct pcmcia_device *p_dev) { + dev_link_t *link = dev_to_instance(p_dev); struct net_device *dev = link->priv; DEBUG(0, "axnet_detach(0x%p)\n", link); - if (link->dev_node) + if (link->dev) unregister_netdev(dev); - axnet_release(link); + if (link->state & DEV_CONFIG) + axnet_release(link); free_netdev(dev); } /* axnet_detach */ @@ -200,7 +208,7 @@ static void axnet_detach(struct pcmcia_device *link) ======================================================================*/ -static int get_prom(struct pcmcia_device *link) +static int get_prom(dev_link_t *link) { struct net_device *dev = link->priv; kio_addr_t ioaddr = dev->base_addr; @@ -254,7 +262,7 @@ static int get_prom(struct pcmcia_device *link) #define CS_CHECK(fn, ret) \ do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0) -static int try_io_port(struct pcmcia_device *link) +static int try_io_port(dev_link_t *link) { int j, ret; if (link->io.NumPorts1 == 32) { @@ -275,23 +283,25 @@ static int try_io_port(struct pcmcia_device *link) for (j = 0; j < 0x400; j += 0x20) { link->io.BasePort1 = j ^ 0x300; link->io.BasePort2 = (j ^ 0x300) + 0x10; - ret = pcmcia_request_io(link, &link->io); + ret = pcmcia_request_io(link->handle, &link->io); if (ret == CS_SUCCESS) return ret; } return ret; } else { - return pcmcia_request_io(link, &link->io); + return pcmcia_request_io(link->handle, &link->io); } } -static int axnet_config(struct pcmcia_device *link) +static void axnet_config(dev_link_t *link) { + client_handle_t handle = link->handle; struct net_device *dev = link->priv; axnet_dev_t *info = PRIV(dev); tuple_t tuple; cisparse_t parse; int i, j, last_ret, last_fn; u_short buf[64]; + config_info_t conf; DEBUG(0, "axnet_config(0x%p)\n", link); @@ -300,22 +310,29 @@ static int axnet_config(struct pcmcia_device *link) tuple.TupleDataMax = sizeof(buf); tuple.TupleOffset = 0; tuple.DesiredTuple = CISTPL_CONFIG; - 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)); + CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple)); + CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple)); + CS_CHECK(ParseTuple, pcmcia_parse_tuple(handle, &tuple, &parse)); link->conf.ConfigBase = parse.config.base; /* don't trust the CIS on this; Linksys got it wrong */ link->conf.Present = 0x63; + /* Configure card */ + link->state |= DEV_CONFIG; + + /* Look up current Vcc */ + CS_CHECK(GetConfigurationInfo, pcmcia_get_configuration_info(handle, &conf)); + link->conf.Vcc = conf.Vcc; + tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY; tuple.Attributes = 0; - CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(link, &tuple)); + CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &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 || + if (pcmcia_get_tuple_data(handle, &tuple) != 0 || + pcmcia_parse_tuple(handle, &tuple, &parse) != 0 || cfg->index == 0 || cfg->io.nwin == 0) goto next_entry; @@ -337,21 +354,21 @@ static int axnet_config(struct pcmcia_device *link) if (last_ret == CS_SUCCESS) break; } next_entry: - last_ret = pcmcia_get_next_tuple(link, &tuple); + last_ret = pcmcia_get_next_tuple(handle, &tuple); } if (last_ret != CS_SUCCESS) { - cs_error(link, RequestIO, last_ret); + cs_error(handle, RequestIO, last_ret); goto failed; } - CS_CHECK(RequestIRQ, pcmcia_request_irq(link, &link->irq)); + CS_CHECK(RequestIRQ, pcmcia_request_irq(handle, &link->irq)); if (link->io.NumPorts2 == 8) { link->conf.Attributes |= CONF_ENABLE_SPKR; link->conf.Status = CCSR_AUDIO_ENA; } - CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link, &link->conf)); + CS_CHECK(RequestConfiguration, pcmcia_request_configuration(handle, &link->conf)); dev->irq = link->irq.AssignedIRQ; dev->base_addr = link->io.BasePort1; @@ -388,7 +405,7 @@ static int axnet_config(struct pcmcia_device *link) Bit 2 of CCSR is active low. */ if (i == 32) { conf_reg_t reg = { 0, CS_WRITE, CISREG_CCSR, 0x04 }; - pcmcia_access_configuration_register(link, ®); + pcmcia_access_configuration_register(link->handle, ®); for (i = 0; i < 32; i++) { j = mdio_read(dev->base_addr + AXNET_MII_EEP, i, 1); if ((j != 0) && (j != 0xffff)) break; @@ -396,12 +413,13 @@ static int axnet_config(struct pcmcia_device *link) } info->phy_id = (i < 32) ? i : -1; - link->dev_node = &info->node; - SET_NETDEV_DEV(dev, &handle_to_dev(link)); + link->dev = &info->node; + link->state &= ~DEV_CONFIG_PENDING; + SET_NETDEV_DEV(dev, &handle_to_dev(handle)); if (register_netdev(dev) != 0) { printk(KERN_NOTICE "axnet_cs: register_netdev() failed\n"); - link->dev_node = NULL; + link->dev = NULL; goto failed; } @@ -417,13 +435,14 @@ static int axnet_config(struct pcmcia_device *link) } else { printk(KERN_NOTICE " No MII transceivers found!\n"); } - return 0; + return; cs_failed: - cs_error(link, last_fn, last_ret); + cs_error(link->handle, last_fn, last_ret); failed: axnet_release(link); - return -ENODEV; + link->state &= ~DEV_CONFIG_PENDING; + return; } /* axnet_config */ /*====================================================================== @@ -434,29 +453,45 @@ failed: ======================================================================*/ -static void axnet_release(struct pcmcia_device *link) +static void axnet_release(dev_link_t *link) { - pcmcia_disable_device(link); + DEBUG(0, "axnet_release(0x%p)\n", link); + + pcmcia_release_configuration(link->handle); + pcmcia_release_io(link->handle, &link->io); + pcmcia_release_irq(link->handle, &link->irq); + + link->state &= ~DEV_CONFIG; } -static int axnet_suspend(struct pcmcia_device *link) +static int axnet_suspend(struct pcmcia_device *p_dev) { + dev_link_t *link = dev_to_instance(p_dev); struct net_device *dev = link->priv; - if (link->open) - netif_device_detach(dev); + link->state |= DEV_SUSPEND; + if (link->state & DEV_CONFIG) { + if (link->open) + netif_device_detach(dev); + pcmcia_release_configuration(link->handle); + } return 0; } -static int axnet_resume(struct pcmcia_device *link) +static int axnet_resume(struct pcmcia_device *p_dev) { + dev_link_t *link = dev_to_instance(p_dev); struct net_device *dev = link->priv; - if (link->open) { - axnet_reset_8390(dev); - AX88190_init(dev, 1); - netif_device_attach(dev); + link->state &= ~DEV_SUSPEND; + if (link->state & DEV_CONFIG) { + pcmcia_request_configuration(link->handle, &link->conf); + if (link->open) { + axnet_reset_8390(dev); + AX88190_init(dev, 1); + netif_device_attach(dev); + } } return 0; @@ -526,16 +561,16 @@ static void mdio_write(kio_addr_t addr, int phy_id, int loc, int value) static int axnet_open(struct net_device *dev) { axnet_dev_t *info = PRIV(dev); - struct pcmcia_device *link = info->p_dev; + dev_link_t *link = &info->link; DEBUG(2, "axnet_open('%s')\n", dev->name); - if (!pcmcia_dev_present(link)) + if (!DEV_OK(link)) return -ENODEV; link->open++; - request_irq(dev->irq, ei_irq_wrapper, IRQF_SHARED, "axnet_cs", dev); + request_irq(dev->irq, ei_irq_wrapper, SA_SHIRQ, "axnet_cs", dev); info->link_status = 0x00; init_timer(&info->watchdog); @@ -552,7 +587,7 @@ static int axnet_open(struct net_device *dev) static int axnet_close(struct net_device *dev) { axnet_dev_t *info = PRIV(dev); - struct pcmcia_device *link = info->p_dev; + dev_link_t *link = &info->link; DEBUG(2, "axnet_close('%s')\n", dev->name); @@ -797,7 +832,7 @@ static struct pcmcia_driver axnet_cs_driver = { .drv = { .name = "axnet_cs", }, - .probe = axnet_probe, + .probe = axnet_attach, .remove = axnet_detach, .id_table = axnet_ids, .suspend = axnet_suspend, @@ -1560,7 +1595,7 @@ static void ei_receive(struct net_device *dev) static void ei_rx_overrun(struct net_device *dev) { - axnet_dev_t *info = PRIV(dev); + axnet_dev_t *info = (axnet_dev_t *)dev; long e8390_base = dev->base_addr; unsigned char was_txing, must_resend = 0; struct ei_device *ei_local = (struct ei_device *) netdev_priv(dev); @@ -1647,56 +1682,17 @@ static struct net_device_stats *get_stats(struct net_device *dev) return &ei_local->stat; } -/* - * Form the 64 bit 8390 multicast table from the linked list of addresses - * associated with this dev structure. - */ - -static inline void make_mc_bits(u8 *bits, struct net_device *dev) -{ - struct dev_mc_list *dmi; - u32 crc; - - for (dmi=dev->mc_list; dmi; dmi=dmi->next) { - - crc = ether_crc(ETH_ALEN, dmi->dmi_addr); - /* - * The 8390 uses the 6 most significant bits of the - * CRC to index the multicast table. - */ - bits[crc>>29] |= (1<<((crc>>26)&7)); - } -} - /** * do_set_multicast_list - set/clear multicast filter * @dev: net device for which multicast filter is adjusted * - * Set or clear the multicast filter for this adaptor. - * Must be called with lock held. + * Set or clear the multicast filter for this adaptor. May be called + * from a BH in 2.1.x. Must be called with lock held. */ static void do_set_multicast_list(struct net_device *dev) { long e8390_base = dev->base_addr; - int i; - struct ei_device *ei_local = (struct ei_device*)netdev_priv(dev); - - if (!(dev->flags&(IFF_PROMISC|IFF_ALLMULTI))) { - memset(ei_local->mcfilter, 0, 8); - if (dev->mc_list) - make_mc_bits(ei_local->mcfilter, dev); - } else { - /* set to accept-all */ - memset(ei_local->mcfilter, 0xFF, 8); - } - - outb_p(E8390_NODMA + E8390_PAGE1, e8390_base + E8390_CMD); - for(i = 0; i < 8; i++) - { - outb_p(ei_local->mcfilter[i], e8390_base + EN1_MULT_SHIFT(i)); - } - outb_p(E8390_NODMA + E8390_PAGE0, e8390_base + E8390_CMD); if(dev->flags&IFF_PROMISC) outb_p(E8390_RXCONFIG | 0x58, e8390_base + EN0_RXCR); @@ -1704,8 +1700,6 @@ static void do_set_multicast_list(struct net_device *dev) outb_p(E8390_RXCONFIG | 0x48, e8390_base + EN0_RXCR); else outb_p(E8390_RXCONFIG | 0x40, e8390_base + EN0_RXCR); - - outb_p(E8390_NODMA+E8390_PAGE0+E8390_START, e8390_base+E8390_CMD); } /* @@ -1800,6 +1794,12 @@ static void AX88190_init(struct net_device *dev, int startp) if(inb_p(e8390_base + EN1_PHYS_SHIFT(i))!=dev->dev_addr[i]) printk(KERN_ERR "Hw. address read/write mismap %d\n",i); } + /* + * Initialize the multicast list to accept-all. If we enable multicast + * the higher levels can do the filtering. + */ + for (i = 0; i < 8; i++) + outb_p(0xff, e8390_base + EN1_MULT + i); outb_p(ei_local->rx_start_page, e8390_base + EN1_CURPAG); outb_p(E8390_NODMA+E8390_PAGE0+E8390_STOP, e8390_base+E8390_CMD); diff --git a/drivers/net/pcmcia/com20020_cs.c b/drivers/net/pcmcia/com20020_cs.c index 48434d792..2827a48ea 100644 --- a/drivers/net/pcmcia/com20020_cs.c +++ b/drivers/net/pcmcia/com20020_cs.c @@ -118,8 +118,8 @@ MODULE_LICENSE("GPL"); /*====================================================================*/ -static int com20020_config(struct pcmcia_device *link); -static void com20020_release(struct pcmcia_device *link); +static void com20020_config(dev_link_t *link); +static void com20020_release(dev_link_t *link); static void com20020_detach(struct pcmcia_device *p_dev); @@ -138,8 +138,9 @@ typedef struct com20020_dev_t { ======================================================================*/ -static int com20020_probe(struct pcmcia_device *p_dev) +static int com20020_attach(struct pcmcia_device *p_dev) { + dev_link_t *link; com20020_dev_t *info; struct net_device *dev; struct arcnet_local *lp; @@ -147,6 +148,10 @@ static int com20020_probe(struct pcmcia_device *p_dev) DEBUG(0, "com20020_attach()\n"); /* Create new network device */ + link = kmalloc(sizeof(struct dev_link_t), GFP_KERNEL); + if (!link) + return -ENOMEM; + info = kmalloc(sizeof(struct com20020_dev_t), GFP_KERNEL); if (!info) goto fail_alloc_info; @@ -156,6 +161,7 @@ static int com20020_probe(struct pcmcia_device *p_dev) goto fail_alloc_dev; memset(info, 0, sizeof(struct com20020_dev_t)); + memset(link, 0, sizeof(struct dev_link_t)); lp = dev->priv; lp->timeout = timeout; lp->backplane = backplane; @@ -166,23 +172,28 @@ static int com20020_probe(struct pcmcia_device *p_dev) /* fill in our module parameters as defaults */ dev->dev_addr[0] = node; - p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_8; - p_dev->io.NumPorts1 = 16; - p_dev->io.IOAddrLines = 16; - p_dev->irq.Attributes = IRQ_TYPE_EXCLUSIVE; - p_dev->irq.IRQInfo1 = IRQ_LEVEL_ID; - p_dev->conf.Attributes = CONF_ENABLE_IRQ; - p_dev->conf.IntType = INT_MEMORY_AND_IO; - p_dev->conf.Present = PRESENT_OPTION; + link->io.Attributes1 = IO_DATA_PATH_WIDTH_8; + link->io.NumPorts1 = 16; + link->io.IOAddrLines = 16; + 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; + + link->irq.Instance = info->dev = dev; + link->priv = info; - p_dev->irq.Instance = info->dev = dev; - p_dev->priv = info; + link->state |= DEV_PRESENT; + com20020_config(link); - return com20020_config(p_dev); + return 0; fail_alloc_dev: kfree(info); fail_alloc_info: + kfree(link); return -ENOMEM; } /* com20020_attach */ @@ -195,8 +206,9 @@ fail_alloc_info: ======================================================================*/ -static void com20020_detach(struct pcmcia_device *link) +static void com20020_detach(struct pcmcia_device *p_dev) { + dev_link_t *link = dev_to_instance(p_dev); struct com20020_dev_t *info = link->priv; struct net_device *dev = info->dev; @@ -204,7 +216,7 @@ static void com20020_detach(struct pcmcia_device *link) DEBUG(0, "com20020_detach(0x%p)\n", link); - if (link->dev_node) { + if (link->dev) { DEBUG(1,"unregister...\n"); unregister_netdev(dev); @@ -217,7 +229,8 @@ static void com20020_detach(struct pcmcia_device *link) free_irq(dev->irq, dev); } - com20020_release(link); + if (link->state & DEV_CONFIG) + com20020_release(link); /* Unlink device structure, free bits */ DEBUG(1,"unlinking...\n"); @@ -232,6 +245,8 @@ static void com20020_detach(struct pcmcia_device *link) DEBUG(1,"kfree2...\n"); kfree(info); } + DEBUG(1,"kfree3...\n"); + kfree(link); } /* com20020_detach */ @@ -246,9 +261,10 @@ static void com20020_detach(struct pcmcia_device *link) #define CS_CHECK(fn, ret) \ do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0) -static int com20020_config(struct pcmcia_device *link) +static void com20020_config(dev_link_t *link) { struct arcnet_local *lp; + client_handle_t handle; tuple_t tuple; cisparse_t parse; com20020_dev_t *info; @@ -257,6 +273,7 @@ static int com20020_config(struct pcmcia_device *link) u_char buf[64]; int ioaddr; + handle = link->handle; info = link->priv; dev = info->dev; @@ -269,11 +286,14 @@ static int com20020_config(struct pcmcia_device *link) tuple.TupleDataMax = 64; tuple.TupleOffset = 0; tuple.DesiredTuple = CISTPL_CONFIG; - 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)); + CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple)); + CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple)); + CS_CHECK(ParseTuple, pcmcia_parse_tuple(handle, &tuple, &parse)); link->conf.ConfigBase = parse.config.base; + /* Configure card */ + link->state |= DEV_CONFIG; + DEBUG(1,"arcnet: baseport1 is %Xh\n", link->io.BasePort1); i = !CS_SUCCESS; if (!link->io.BasePort1) @@ -281,13 +301,13 @@ static int com20020_config(struct pcmcia_device *link) for (ioaddr = 0x100; ioaddr < 0x400; ioaddr += 0x10) { link->io.BasePort1 = ioaddr; - i = pcmcia_request_io(link, &link->io); + i = pcmcia_request_io(link->handle, &link->io); if (i == CS_SUCCESS) break; } } else - i = pcmcia_request_io(link, &link->io); + i = pcmcia_request_io(link->handle, &link->io); if (i != CS_SUCCESS) { @@ -301,7 +321,7 @@ static int com20020_config(struct pcmcia_device *link) DEBUG(1,"arcnet: request IRQ %d (%Xh/%Xh)\n", link->irq.AssignedIRQ, link->irq.IRQInfo1, link->irq.IRQInfo2); - i = pcmcia_request_irq(link, &link->irq); + i = pcmcia_request_irq(link->handle, &link->irq); if (i != CS_SUCCESS) { DEBUG(1,"arcnet: requestIRQ failed totally!\n"); @@ -310,7 +330,7 @@ static int com20020_config(struct pcmcia_device *link) dev->irq = link->irq.AssignedIRQ; - CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link, &link->conf)); + CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link->handle, &link->conf)); if (com20020_check(dev)) { @@ -322,14 +342,15 @@ static int com20020_config(struct pcmcia_device *link) lp->card_name = "PCMCIA COM20020"; lp->card_flags = ARC_CAN_10MBIT; /* pretend all of them can 10Mbit */ - link->dev_node = &info->node; - SET_NETDEV_DEV(dev, &handle_to_dev(link)); + link->dev = &info->node; + link->state &= ~DEV_CONFIG_PENDING; + SET_NETDEV_DEV(dev, &handle_to_dev(handle)); i = com20020_found(dev, 0); /* calls register_netdev */ if (i != 0) { DEBUG(1,KERN_NOTICE "com20020_cs: com20020_found() failed\n"); - link->dev_node = NULL; + link->dev = NULL; goto failed; } @@ -337,14 +358,13 @@ static int com20020_config(struct pcmcia_device *link) DEBUG(1,KERN_INFO "%s: port %#3lx, irq %d\n", dev->name, dev->base_addr, dev->irq); - return 0; + return; cs_failed: - cs_error(link, last_fn, last_ret); + cs_error(link->handle, last_fn, last_ret); failed: DEBUG(1,"com20020_config failed...\n"); com20020_release(link); - return -ENODEV; } /* com20020_config */ /*====================================================================== @@ -355,42 +375,58 @@ failed: ======================================================================*/ -static void com20020_release(struct pcmcia_device *link) +static void com20020_release(dev_link_t *link) { - DEBUG(0, "com20020_release(0x%p)\n", link); - pcmcia_disable_device(link); + + DEBUG(1,"release...\n"); + + DEBUG(0, "com20020_release(0x%p)\n", link); + + pcmcia_release_configuration(link->handle); + pcmcia_release_io(link->handle, &link->io); + pcmcia_release_irq(link->handle, &link->irq); + + link->state &= ~(DEV_CONFIG | DEV_RELEASE_PENDING); } -static int com20020_suspend(struct pcmcia_device *link) +static int com20020_suspend(struct pcmcia_device *p_dev) { + dev_link_t *link = dev_to_instance(p_dev); com20020_dev_t *info = link->priv; struct net_device *dev = info->dev; - if (link->open) - netif_device_detach(dev); + link->state |= DEV_SUSPEND; + if (link->state & DEV_CONFIG) { + if (link->open) { + netif_device_detach(dev); + } + pcmcia_release_configuration(link->handle); + } return 0; } -static int com20020_resume(struct pcmcia_device *link) +static int com20020_resume(struct pcmcia_device *p_dev) { + dev_link_t *link = dev_to_instance(p_dev); com20020_dev_t *info = link->priv; struct net_device *dev = info->dev; - if (link->open) { - int ioaddr = dev->base_addr; - struct arcnet_local *lp = dev->priv; - ARCRESET; - } + link->state &= ~DEV_SUSPEND; + if (link->state & DEV_CONFIG) { + pcmcia_request_configuration(link->handle, &link->conf); + if (link->open) { + int ioaddr = dev->base_addr; + struct arcnet_local *lp = dev->priv; + ARCRESET; + } + } return 0; } static struct pcmcia_device_id com20020_ids[] = { - 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_PROD_ID12("Contemporary Control Systems, Inc.", "PCM20 Arcnet Adapter", 0x59991666, 0x95dfffaf), PCMCIA_DEVICE_NULL }; MODULE_DEVICE_TABLE(pcmcia, com20020_ids); @@ -400,7 +436,7 @@ static struct pcmcia_driver com20020_cs_driver = { .drv = { .name = "com20020_cs", }, - .probe = com20020_probe, + .probe = com20020_attach, .remove = com20020_detach, .id_table = com20020_ids, .suspend = com20020_suspend, diff --git a/drivers/net/pcmcia/fmvj18x_cs.c b/drivers/net/pcmcia/fmvj18x_cs.c index ea93b8f18..28fe2fb4d 100644 --- a/drivers/net/pcmcia/fmvj18x_cs.c +++ b/drivers/net/pcmcia/fmvj18x_cs.c @@ -84,10 +84,10 @@ static char *version = DRV_NAME ".c " DRV_VERSION " 2002/03/23"; /* PCMCIA event handlers */ -static int fmvj18x_config(struct pcmcia_device *link); -static int fmvj18x_get_hwinfo(struct pcmcia_device *link, u_char *node_id); -static int fmvj18x_setup_mfc(struct pcmcia_device *link); -static void fmvj18x_release(struct pcmcia_device *link); +static void fmvj18x_config(dev_link_t *link); +static int fmvj18x_get_hwinfo(dev_link_t *link, u_char *node_id); +static int fmvj18x_setup_mfc(dev_link_t *link); +static void fmvj18x_release(dev_link_t *link); static void fmvj18x_detach(struct pcmcia_device *p_dev); /* @@ -116,7 +116,7 @@ typedef enum { MBH10302, MBH10304, TDK, CONTEC, LA501, UNGERMANN, driver specific data structure */ typedef struct local_info_t { - struct pcmcia_device *p_dev; + dev_link_t link; dev_node_t node; struct net_device_stats stats; long open_time; @@ -228,9 +228,10 @@ typedef struct local_info_t { #define BANK_1U 0x24 /* bank 1 (CONFIG_1) */ #define BANK_2U 0x28 /* bank 2 (CONFIG_1) */ -static int fmvj18x_probe(struct pcmcia_device *link) +static int fmvj18x_attach(struct pcmcia_device *p_dev) { local_info_t *lp; + dev_link_t *link; struct net_device *dev; DEBUG(0, "fmvj18x_attach()\n"); @@ -240,8 +241,8 @@ static int fmvj18x_probe(struct pcmcia_device *link) if (!dev) return -ENOMEM; lp = netdev_priv(dev); + link = &lp->link; link->priv = dev; - lp->p_dev = link; /* The io structure describes IO port mapping */ link->io.NumPorts1 = 32; @@ -256,6 +257,7 @@ static int fmvj18x_probe(struct pcmcia_device *link) /* General socket configuration */ link->conf.Attributes = CONF_ENABLE_IRQ; + link->conf.Vcc = 50; link->conf.IntType = INT_MEMORY_AND_IO; /* The FMVJ18x specific entries in the device structure. */ @@ -272,21 +274,29 @@ static int fmvj18x_probe(struct pcmcia_device *link) #endif SET_ETHTOOL_OPS(dev, &netdev_ethtool_ops); - return fmvj18x_config(link); + link->handle = p_dev; + p_dev->instance = link; + + link->state |= DEV_PRESENT | DEV_CONFIG_PENDING; + fmvj18x_config(link); + + return 0; } /* fmvj18x_attach */ /*====================================================================*/ -static void fmvj18x_detach(struct pcmcia_device *link) +static void fmvj18x_detach(struct pcmcia_device *p_dev) { + dev_link_t *link = dev_to_instance(p_dev); struct net_device *dev = link->priv; DEBUG(0, "fmvj18x_detach(0x%p)\n", link); - if (link->dev_node) + if (link->dev) unregister_netdev(dev); - fmvj18x_release(link); + if (link->state & DEV_CONFIG) + fmvj18x_release(link); free_netdev(dev); } /* fmvj18x_detach */ @@ -296,10 +306,10 @@ static void fmvj18x_detach(struct pcmcia_device *link) #define CS_CHECK(fn, ret) \ do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0) -static int mfc_try_io_port(struct pcmcia_device *link) +static int mfc_try_io_port(dev_link_t *link) { int i, ret; - static const kio_addr_t serial_base[5] = { 0x3f8, 0x2f8, 0x3e8, 0x2e8, 0x0 }; + static kio_addr_t serial_base[5] = { 0x3f8, 0x2f8, 0x3e8, 0x2e8, 0x0 }; for (i = 0; i < 5; i++) { link->io.BasePort2 = serial_base[i]; @@ -308,13 +318,13 @@ static int mfc_try_io_port(struct pcmcia_device *link) link->io.NumPorts2 = 0; printk(KERN_NOTICE "fmvj18x_cs: out of resource for serial\n"); } - ret = pcmcia_request_io(link, &link->io); + ret = pcmcia_request_io(link->handle, &link->io); if (ret == CS_SUCCESS) return ret; } return ret; } -static int ungermann_try_io_port(struct pcmcia_device *link) +static int ungermann_try_io_port(dev_link_t *link) { int ret; kio_addr_t ioaddr; @@ -324,7 +334,7 @@ static int ungermann_try_io_port(struct pcmcia_device *link) */ for (ioaddr = 0x300; ioaddr < 0x3e0; ioaddr += 0x20) { link->io.BasePort1 = ioaddr; - ret = pcmcia_request_io(link, &link->io); + ret = pcmcia_request_io(link->handle, &link->io); if (ret == CS_SUCCESS) { /* calculate ConfigIndex value */ link->conf.ConfigIndex = @@ -335,8 +345,9 @@ static int ungermann_try_io_port(struct pcmcia_device *link) return ret; /* RequestIO failed */ } -static int fmvj18x_config(struct pcmcia_device *link) +static void fmvj18x_config(dev_link_t *link) { + client_handle_t handle = link->handle; struct net_device *dev = link->priv; local_info_t *lp = netdev_priv(dev); tuple_t tuple; @@ -355,34 +366,42 @@ static int fmvj18x_config(struct pcmcia_device *link) registers. */ tuple.DesiredTuple = CISTPL_CONFIG; - CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(link, &tuple)); + CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple)); tuple.TupleData = (u_char *)buf; tuple.TupleDataMax = 64; tuple.TupleOffset = 0; - CS_CHECK(GetTupleData, pcmcia_get_tuple_data(link, &tuple)); - CS_CHECK(ParseTuple, pcmcia_parse_tuple(link, &tuple, &parse)); + CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple)); + CS_CHECK(ParseTuple, pcmcia_parse_tuple(handle, &tuple, &parse)); + + /* Configure card */ + link->state |= DEV_CONFIG; link->conf.ConfigBase = parse.config.base; link->conf.Present = parse.config.rmask[0]; tuple.DesiredTuple = CISTPL_FUNCE; tuple.TupleOffset = 0; - if (pcmcia_get_first_tuple(link, &tuple) == CS_SUCCESS) { + if (pcmcia_get_first_tuple(handle, &tuple) == CS_SUCCESS) { /* Yes, I have CISTPL_FUNCE. Let's check CISTPL_MANFID */ tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY; - 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)); + CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple)); + CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple)); + CS_CHECK(ParseTuple, pcmcia_parse_tuple(handle, &tuple, &parse)); link->conf.ConfigIndex = parse.cftable_entry.index; tuple.DesiredTuple = CISTPL_MANFID; - if (pcmcia_get_first_tuple(link, &tuple) == CS_SUCCESS) - CS_CHECK(GetTupleData, pcmcia_get_tuple_data(link, &tuple)); + if (pcmcia_get_first_tuple(handle, &tuple) == CS_SUCCESS) + CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple)); else buf[0] = 0xffff; switch (le16_to_cpu(buf[0])) { case MANFID_TDK: cardtype = TDK; - if (le16_to_cpu(buf[1]) == PRODID_TDK_GN3410 + if (le16_to_cpu(buf[1]) == PRODID_TDK_CF010) { + cs_status_t status; + pcmcia_get_status(handle, &status); + if (status.CardState & CS_EVENT_3VCARD) + link->conf.Vcc = 33; /* inserted in 3.3V slot */ + } else if (le16_to_cpu(buf[1]) == PRODID_TDK_GN3410 || le16_to_cpu(buf[1]) == PRODID_TDK_NP9610 || le16_to_cpu(buf[1]) == PRODID_TDK_MN3200) { /* MultiFunction Card */ @@ -410,8 +429,8 @@ static int fmvj18x_config(struct pcmcia_device *link) } else { /* old type card */ tuple.DesiredTuple = CISTPL_MANFID; - if (pcmcia_get_first_tuple(link, &tuple) == CS_SUCCESS) - CS_CHECK(GetTupleData, pcmcia_get_tuple_data(link, &tuple)); + if (pcmcia_get_first_tuple(handle, &tuple) == CS_SUCCESS) + CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple)); else buf[0] = 0xffff; switch (le16_to_cpu(buf[0])) { @@ -442,10 +461,10 @@ static int fmvj18x_config(struct pcmcia_device *link) ret = ungermann_try_io_port(link); if (ret != CS_SUCCESS) goto cs_failed; } else { - CS_CHECK(RequestIO, pcmcia_request_io(link, &link->io)); + CS_CHECK(RequestIO, pcmcia_request_io(link->handle, &link->io)); } - CS_CHECK(RequestIRQ, pcmcia_request_irq(link, &link->irq)); - CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link, &link->conf)); + CS_CHECK(RequestIRQ, pcmcia_request_irq(link->handle, &link->irq)); + CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link->handle, &link->conf)); dev->irq = link->irq.AssignedIRQ; dev->base_addr = link->io.BasePort1; @@ -474,17 +493,17 @@ static int fmvj18x_config(struct pcmcia_device *link) case CONTEC: tuple.DesiredTuple = CISTPL_FUNCE; tuple.TupleOffset = 0; - CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(link, &tuple)); + CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple)); tuple.TupleOffset = 0; - CS_CHECK(GetTupleData, pcmcia_get_tuple_data(link, &tuple)); + CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple)); if (cardtype == MBH10304) { /* MBH10304's CIS_FUNCE is corrupted */ node_id = &(tuple.TupleData[5]); card_name = "FMV-J182"; } else { while (tuple.TupleData[0] != CISTPL_FUNCE_LAN_NODE_ID ) { - CS_CHECK(GetNextTuple, pcmcia_get_next_tuple(link, &tuple)); - CS_CHECK(GetTupleData, pcmcia_get_tuple_data(link, &tuple)); + CS_CHECK(GetNextTuple, pcmcia_get_next_tuple(handle, &tuple)); + CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple)); } node_id = &(tuple.TupleData[2]); if( cardtype == TDK ) { @@ -526,12 +545,13 @@ static int fmvj18x_config(struct pcmcia_device *link) } lp->cardtype = cardtype; - link->dev_node = &lp->node; - SET_NETDEV_DEV(dev, &handle_to_dev(link)); + link->dev = &lp->node; + link->state &= ~DEV_CONFIG_PENDING; + SET_NETDEV_DEV(dev, &handle_to_dev(handle)); if (register_netdev(dev) != 0) { printk(KERN_NOTICE "fmvj18x_cs: register_netdev() failed\n"); - link->dev_node = NULL; + link->dev = NULL; goto failed; } @@ -544,18 +564,19 @@ static int fmvj18x_config(struct pcmcia_device *link) for (i = 0; i < 6; i++) printk("%02X%s", dev->dev_addr[i], ((i<5) ? ":" : "\n")); - return 0; + return; cs_failed: /* All Card Services errors end up here */ - cs_error(link, last_fn, last_ret); + cs_error(link->handle, last_fn, last_ret); failed: fmvj18x_release(link); - return -ENODEV; + link->state &= ~DEV_CONFIG_PENDING; + } /* fmvj18x_config */ /*====================================================================*/ -static int fmvj18x_get_hwinfo(struct pcmcia_device *link, u_char *node_id) +static int fmvj18x_get_hwinfo(dev_link_t *link, u_char *node_id) { win_req_t req; memreq_t mem; @@ -566,9 +587,9 @@ static int fmvj18x_get_hwinfo(struct pcmcia_device *link, u_char *node_id) req.Attributes = WIN_DATA_WIDTH_8|WIN_MEMORY_TYPE_AM|WIN_ENABLE; req.Base = 0; req.Size = 0; req.AccessSpeed = 0; - i = pcmcia_request_window(&link, &req, &link->win); + i = pcmcia_request_window(&link->handle, &req, &link->win); if (i != CS_SUCCESS) { - cs_error(link, RequestWindow, i); + cs_error(link->handle, RequestWindow, i); return -1; } @@ -602,13 +623,13 @@ static int fmvj18x_get_hwinfo(struct pcmcia_device *link, u_char *node_id) iounmap(base); j = pcmcia_release_window(link->win); if (j != CS_SUCCESS) - cs_error(link, ReleaseWindow, j); + cs_error(link->handle, ReleaseWindow, j); return (i != 0x200) ? 0 : -1; } /* fmvj18x_get_hwinfo */ /*====================================================================*/ -static int fmvj18x_setup_mfc(struct pcmcia_device *link) +static int fmvj18x_setup_mfc(dev_link_t *link) { win_req_t req; memreq_t mem; @@ -621,9 +642,9 @@ static int fmvj18x_setup_mfc(struct pcmcia_device *link) req.Attributes = WIN_DATA_WIDTH_8|WIN_MEMORY_TYPE_AM|WIN_ENABLE; req.Base = 0; req.Size = 0; req.AccessSpeed = 0; - i = pcmcia_request_window(&link, &req, &link->win); + i = pcmcia_request_window(&link->handle, &req, &link->win); if (i != CS_SUCCESS) { - cs_error(link, RequestWindow, i); + cs_error(link->handle, RequestWindow, i); return -1; } @@ -645,35 +666,54 @@ static int fmvj18x_setup_mfc(struct pcmcia_device *link) iounmap(base); j = pcmcia_release_window(link->win); if (j != CS_SUCCESS) - cs_error(link, ReleaseWindow, j); + cs_error(link->handle, ReleaseWindow, j); return 0; } /*====================================================================*/ -static void fmvj18x_release(struct pcmcia_device *link) +static void fmvj18x_release(dev_link_t *link) { - DEBUG(0, "fmvj18x_release(0x%p)\n", link); - pcmcia_disable_device(link); + + DEBUG(0, "fmvj18x_release(0x%p)\n", link); + + /* Don't bother checking to see if these succeed or not */ + pcmcia_release_window(link->win); + pcmcia_release_configuration(link->handle); + pcmcia_release_io(link->handle, &link->io); + pcmcia_release_irq(link->handle, &link->irq); + + link->state &= ~DEV_CONFIG; } -static int fmvj18x_suspend(struct pcmcia_device *link) +static int fmvj18x_suspend(struct pcmcia_device *p_dev) { + dev_link_t *link = dev_to_instance(p_dev); struct net_device *dev = link->priv; - if (link->open) - netif_device_detach(dev); + link->state |= DEV_SUSPEND; + if (link->state & DEV_CONFIG) { + if (link->open) + netif_device_detach(dev); + pcmcia_release_configuration(link->handle); + } + return 0; } -static int fmvj18x_resume(struct pcmcia_device *link) +static int fmvj18x_resume(struct pcmcia_device *p_dev) { + dev_link_t *link = dev_to_instance(p_dev); struct net_device *dev = link->priv; - if (link->open) { - fjn_reset(dev); - netif_device_attach(dev); + link->state &= ~DEV_SUSPEND; + if (link->state & DEV_CONFIG) { + pcmcia_request_configuration(link->handle, &link->conf); + if (link->open) { + fjn_reset(dev); + netif_device_attach(dev); + } } return 0; @@ -711,7 +751,7 @@ static struct pcmcia_driver fmvj18x_cs_driver = { .drv = { .name = "fmvj18x_cs", }, - .probe = fmvj18x_probe, + .probe = fmvj18x_attach, .remove = fmvj18x_detach, .id_table = fmvj18x_ids, .suspend = fmvj18x_suspend, @@ -831,7 +871,8 @@ static int fjn_start_xmit(struct sk_buff *skb, struct net_device *dev) if (length < ETH_ZLEN) { - if (skb_padto(skb, ETH_ZLEN)) + skb = skb_padto(skb, ETH_ZLEN); + if (skb == NULL) return 0; length = ETH_ZLEN; } @@ -1107,11 +1148,11 @@ static int fjn_config(struct net_device *dev, struct ifmap *map){ static int fjn_open(struct net_device *dev) { struct local_info_t *lp = netdev_priv(dev); - struct pcmcia_device *link = lp->p_dev; + dev_link_t *link = &lp->link; DEBUG(4, "fjn_open('%s').\n", dev->name); - if (!pcmcia_dev_present(link)) + if (!DEV_OK(link)) return -ENODEV; link->open++; @@ -1132,7 +1173,7 @@ static int fjn_open(struct net_device *dev) static int fjn_close(struct net_device *dev) { struct local_info_t *lp = netdev_priv(dev); - struct pcmcia_device *link = lp->p_dev; + dev_link_t *link = &lp->link; kio_addr_t ioaddr = dev->base_addr; DEBUG(4, "fjn_close('%s').\n", dev->name); diff --git a/drivers/net/pcmcia/ibmtr_cs.c b/drivers/net/pcmcia/ibmtr_cs.c index b8fe70b85..b9c7e3957 100644 --- a/drivers/net/pcmcia/ibmtr_cs.c +++ b/drivers/net/pcmcia/ibmtr_cs.c @@ -105,15 +105,15 @@ MODULE_LICENSE("GPL"); /*====================================================================*/ -static int ibmtr_config(struct pcmcia_device *link); +static void ibmtr_config(dev_link_t *link); static void ibmtr_hw_setup(struct net_device *dev, u_int mmiobase); -static void ibmtr_release(struct pcmcia_device *link); +static void ibmtr_release(dev_link_t *link); static void ibmtr_detach(struct pcmcia_device *p_dev); /*====================================================================*/ typedef struct ibmtr_dev_t { - struct pcmcia_device *p_dev; + dev_link_t link; struct net_device *dev; dev_node_t node; window_handle_t sram_win_handle; @@ -138,11 +138,12 @@ static struct ethtool_ops netdev_ethtool_ops = { ======================================================================*/ -static int ibmtr_attach(struct pcmcia_device *link) +static int ibmtr_attach(struct pcmcia_device *p_dev) { ibmtr_dev_t *info; + dev_link_t *link; struct net_device *dev; - + DEBUG(0, "ibmtr_attach()\n"); /* Create new token-ring device */ @@ -155,7 +156,7 @@ static int ibmtr_attach(struct pcmcia_device *link) return -ENOMEM; } - info->p_dev = link; + link = &info->link; link->priv = info; info->ti = netdev_priv(dev); @@ -166,14 +167,21 @@ static int ibmtr_attach(struct pcmcia_device *link) link->irq.IRQInfo1 = IRQ_LEVEL_ID; link->irq.Handler = &tok_interrupt; link->conf.Attributes = CONF_ENABLE_IRQ; + link->conf.Vcc = 50; link->conf.IntType = INT_MEMORY_AND_IO; link->conf.Present = PRESENT_OPTION; link->irq.Instance = info->dev = dev; - + SET_ETHTOOL_OPS(dev, &netdev_ethtool_ops); - return ibmtr_config(link); + link->handle = p_dev; + p_dev->instance = link; + + link->state |= DEV_PRESENT; + ibmtr_config(link); + + return 0; } /* ibmtr_attach */ /*====================================================================== @@ -185,22 +193,23 @@ static int ibmtr_attach(struct pcmcia_device *link) ======================================================================*/ -static void ibmtr_detach(struct pcmcia_device *link) +static void ibmtr_detach(struct pcmcia_device *p_dev) { + dev_link_t *link = dev_to_instance(p_dev); struct ibmtr_dev_t *info = link->priv; struct net_device *dev = info->dev; DEBUG(0, "ibmtr_detach(0x%p)\n", link); - if (link->dev_node) + if (link->dev) unregister_netdev(dev); { struct tok_info *ti = netdev_priv(dev); del_timer_sync(&(ti->tr_timer)); } - - ibmtr_release(link); + if (link->state & DEV_CONFIG) + ibmtr_release(link); free_netdev(dev); kfree(info); @@ -217,8 +226,9 @@ static void ibmtr_detach(struct pcmcia_device *link) #define CS_CHECK(fn, ret) \ do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0) -static int ibmtr_config(struct pcmcia_device *link) +static void ibmtr_config(dev_link_t *link) { + client_handle_t handle = link->handle; ibmtr_dev_t *info = link->priv; struct net_device *dev = info->dev; struct tok_info *ti = netdev_priv(dev); @@ -236,25 +246,29 @@ static int ibmtr_config(struct pcmcia_device *link) tuple.TupleDataMax = 64; tuple.TupleOffset = 0; tuple.DesiredTuple = CISTPL_CONFIG; - 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)); + CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple)); + CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple)); + CS_CHECK(ParseTuple, pcmcia_parse_tuple(handle, &tuple, &parse)); link->conf.ConfigBase = parse.config.base; + + /* Configure card */ + link->state |= DEV_CONFIG; + link->conf.ConfigIndex = 0x61; /* Determine if this is PRIMARY or ALTERNATE. */ /* Try PRIMARY card at 0xA20-0xA23 */ link->io.BasePort1 = 0xA20; - i = pcmcia_request_io(link, &link->io); + i = pcmcia_request_io(link->handle, &link->io); if (i != CS_SUCCESS) { /* Couldn't get 0xA20-0xA23. Try ALTERNATE at 0xA24-0xA27. */ link->io.BasePort1 = 0xA24; - CS_CHECK(RequestIO, pcmcia_request_io(link, &link->io)); + CS_CHECK(RequestIO, pcmcia_request_io(link->handle, &link->io)); } dev->base_addr = link->io.BasePort1; - CS_CHECK(RequestIRQ, pcmcia_request_irq(link, &link->irq)); + CS_CHECK(RequestIRQ, pcmcia_request_irq(link->handle, &link->irq)); dev->irq = link->irq.AssignedIRQ; ti->irq = link->irq.AssignedIRQ; ti->global_int_enable=GLOBAL_INT_ENABLE+((dev->irq==9) ? 2 : dev->irq); @@ -265,7 +279,7 @@ static int ibmtr_config(struct pcmcia_device *link) req.Base = 0; req.Size = 0x2000; req.AccessSpeed = 250; - CS_CHECK(RequestWindow, pcmcia_request_window(&link, &req, &link->win)); + CS_CHECK(RequestWindow, pcmcia_request_window(&link->handle, &req, &link->win)); mem.CardOffset = mmiobase; mem.Page = 0; @@ -278,7 +292,7 @@ static int ibmtr_config(struct pcmcia_device *link) req.Base = 0; req.Size = sramsize * 1024; req.AccessSpeed = 250; - CS_CHECK(RequestWindow, pcmcia_request_window(&link, &req, &info->sram_win_handle)); + CS_CHECK(RequestWindow, pcmcia_request_window(&link->handle, &req, &info->sram_win_handle)); mem.CardOffset = srambase; mem.Page = 0; @@ -288,20 +302,21 @@ static int ibmtr_config(struct pcmcia_device *link) ti->sram_virt = ioremap(req.Base, req.Size); ti->sram_phys = req.Base; - CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link, &link->conf)); + CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link->handle, &link->conf)); /* Set up the Token-Ring Controller Configuration Register and turn on the card. Check the "Local Area Network Credit Card Adapters Technical Reference" SC30-3585 for this info. */ ibmtr_hw_setup(dev, mmiobase); - link->dev_node = &info->node; - SET_NETDEV_DEV(dev, &handle_to_dev(link)); + link->dev = &info->node; + link->state &= ~DEV_CONFIG_PENDING; + SET_NETDEV_DEV(dev, &handle_to_dev(handle)); i = ibmtr_probe_card(dev); if (i != 0) { printk(KERN_NOTICE "ibmtr_cs: register_netdev() failed\n"); - link->dev_node = NULL; + link->dev = NULL; goto failed; } @@ -315,13 +330,12 @@ static int ibmtr_config(struct pcmcia_device *link) for (i = 0; i < TR_ALEN; i++) printk("%02X", dev->dev_addr[i]); printk("\n"); - return 0; + return; cs_failed: - cs_error(link, last_fn, last_ret); + cs_error(link->handle, last_fn, last_ret); failed: ibmtr_release(link); - return -ENODEV; } /* ibmtr_config */ /*====================================================================== @@ -332,41 +346,56 @@ failed: ======================================================================*/ -static void ibmtr_release(struct pcmcia_device *link) +static void ibmtr_release(dev_link_t *link) { - ibmtr_dev_t *info = link->priv; - struct net_device *dev = info->dev; + ibmtr_dev_t *info = link->priv; + struct net_device *dev = info->dev; + + DEBUG(0, "ibmtr_release(0x%p)\n", link); - DEBUG(0, "ibmtr_release(0x%p)\n", link); + pcmcia_release_configuration(link->handle); + pcmcia_release_io(link->handle, &link->io); + pcmcia_release_irq(link->handle, &link->irq); + if (link->win) { + struct tok_info *ti = netdev_priv(dev); + iounmap(ti->mmio); + pcmcia_release_window(link->win); + pcmcia_release_window(info->sram_win_handle); + } - if (link->win) { - struct tok_info *ti = netdev_priv(dev); - iounmap(ti->mmio); - pcmcia_release_window(info->sram_win_handle); - } - pcmcia_disable_device(link); + link->state &= ~DEV_CONFIG; } -static int ibmtr_suspend(struct pcmcia_device *link) +static int ibmtr_suspend(struct pcmcia_device *p_dev) { + dev_link_t *link = dev_to_instance(p_dev); ibmtr_dev_t *info = link->priv; struct net_device *dev = info->dev; - if (link->open) - netif_device_detach(dev); + link->state |= DEV_SUSPEND; + if (link->state & DEV_CONFIG) { + if (link->open) + netif_device_detach(dev); + pcmcia_release_configuration(link->handle); + } return 0; } -static int ibmtr_resume(struct pcmcia_device *link) +static int ibmtr_resume(struct pcmcia_device *p_dev) { + dev_link_t *link = dev_to_instance(p_dev); ibmtr_dev_t *info = link->priv; struct net_device *dev = info->dev; - if (link->open) { - ibmtr_probe(dev); /* really? */ - netif_device_attach(dev); - } + link->state &= ~DEV_SUSPEND; + if (link->state & DEV_CONFIG) { + pcmcia_request_configuration(link->handle, &link->conf); + if (link->open) { + ibmtr_probe(dev); /* really? */ + netif_device_attach(dev); + } + } return 0; } diff --git a/drivers/net/pcmcia/nmclan_cs.c b/drivers/net/pcmcia/nmclan_cs.c index a8f6bfc96..4a232254a 100644 --- a/drivers/net/pcmcia/nmclan_cs.c +++ b/drivers/net/pcmcia/nmclan_cs.c @@ -362,7 +362,7 @@ typedef struct _mace_statistics { } mace_statistics; typedef struct _mace_private { - struct pcmcia_device *p_dev; + dev_link_t link; dev_node_t node; struct net_device_stats linux_stats; /* Linux statistics counters */ mace_statistics mace_stats; /* MACE chip statistics counters */ @@ -388,7 +388,7 @@ static char *version = DRV_NAME " " DRV_VERSION " (Roger C. Pao)"; #endif -static const char *if_names[]={ +static char *if_names[]={ "Auto", "10baseT", "BNC", }; @@ -417,8 +417,8 @@ INT_MODULE_PARM(pc_debug, PCMCIA_DEBUG); Function Prototypes ---------------------------------------------------------------------------- */ -static int nmclan_config(struct pcmcia_device *link); -static void nmclan_release(struct pcmcia_device *link); +static void nmclan_config(dev_link_t *link); +static void nmclan_release(dev_link_t *link); static void nmclan_reset(struct net_device *dev); static int mace_config(struct net_device *dev, struct ifmap *map); @@ -443,9 +443,10 @@ nmclan_attach Services. ---------------------------------------------------------------------------- */ -static int nmclan_probe(struct pcmcia_device *link) +static int nmclan_attach(struct pcmcia_device *p_dev) { mace_private *lp; + dev_link_t *link; struct net_device *dev; DEBUG(0, "nmclan_attach()\n"); @@ -456,7 +457,7 @@ static int nmclan_probe(struct pcmcia_device *link) if (!dev) return -ENOMEM; lp = netdev_priv(dev); - lp->p_dev = link; + link = &lp->link; link->priv = dev; spin_lock_init(&lp->bank_lock); @@ -468,6 +469,7 @@ static int nmclan_probe(struct pcmcia_device *link) link->irq.Handler = &mace_interrupt; link->irq.Instance = dev; link->conf.Attributes = CONF_ENABLE_IRQ; + link->conf.Vcc = 50; link->conf.IntType = INT_MEMORY_AND_IO; link->conf.ConfigIndex = 1; link->conf.Present = PRESENT_OPTION; @@ -487,7 +489,13 @@ static int nmclan_probe(struct pcmcia_device *link) dev->watchdog_timeo = TX_TIMEOUT; #endif - return nmclan_config(link); + link->handle = p_dev; + p_dev->instance = link; + + link->state |= DEV_PRESENT | DEV_CONFIG_PENDING; + nmclan_config(link); + + return 0; } /* nmclan_attach */ /* ---------------------------------------------------------------------------- @@ -498,16 +506,18 @@ nmclan_detach when the device is released. ---------------------------------------------------------------------------- */ -static void nmclan_detach(struct pcmcia_device *link) +static void nmclan_detach(struct pcmcia_device *p_dev) { + dev_link_t *link = dev_to_instance(p_dev); struct net_device *dev = link->priv; DEBUG(0, "nmclan_detach(0x%p)\n", link); - if (link->dev_node) + if (link->dev) unregister_netdev(dev); - nmclan_release(link); + if (link->state & DEV_CONFIG) + nmclan_release(link); free_netdev(dev); } /* nmclan_detach */ @@ -651,8 +661,9 @@ nmclan_config #define CS_CHECK(fn, ret) \ do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0) -static int nmclan_config(struct pcmcia_device *link) +static void nmclan_config(dev_link_t *link) { + client_handle_t handle = link->handle; struct net_device *dev = link->priv; mace_private *lp = netdev_priv(dev); tuple_t tuple; @@ -668,14 +679,17 @@ static int nmclan_config(struct pcmcia_device *link) tuple.TupleDataMax = 64; tuple.TupleOffset = 0; tuple.DesiredTuple = CISTPL_CONFIG; - 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)); + CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple)); + CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple)); + CS_CHECK(ParseTuple, pcmcia_parse_tuple(handle, &tuple, &parse)); link->conf.ConfigBase = parse.config.base; - 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)); + /* Configure card */ + link->state |= DEV_CONFIG; + + CS_CHECK(RequestIO, pcmcia_request_io(handle, &link->io)); + CS_CHECK(RequestIRQ, pcmcia_request_irq(handle, &link->irq)); + CS_CHECK(RequestConfiguration, pcmcia_request_configuration(handle, &link->conf)); dev->irq = link->irq.AssignedIRQ; dev->base_addr = link->io.BasePort1; @@ -686,8 +700,8 @@ static int nmclan_config(struct pcmcia_device *link) tuple.TupleData = buf; tuple.TupleDataMax = 64; tuple.TupleOffset = 0; - CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(link, &tuple)); - CS_CHECK(GetTupleData, pcmcia_get_tuple_data(link, &tuple)); + CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple)); + CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple)); memcpy(dev->dev_addr, tuple.TupleData, ETHER_ADDR_LEN); /* Verify configuration by reading the MACE ID. */ @@ -702,7 +716,8 @@ static int nmclan_config(struct pcmcia_device *link) } else { printk(KERN_NOTICE "nmclan_cs: mace id not found: %x %x should" " be 0x40 0x?9\n", sig[0], sig[1]); - return -ENODEV; + link->state &= ~DEV_CONFIG_PENDING; + return; } } @@ -715,13 +730,14 @@ static int nmclan_config(struct pcmcia_device *link) else printk(KERN_NOTICE "nmclan_cs: invalid if_port requested\n"); - link->dev_node = &lp->node; - SET_NETDEV_DEV(dev, &handle_to_dev(link)); + link->dev = &lp->node; + link->state &= ~DEV_CONFIG_PENDING; + SET_NETDEV_DEV(dev, &handle_to_dev(handle)); i = register_netdev(dev); if (i != 0) { printk(KERN_NOTICE "nmclan_cs: register_netdev() failed\n"); - link->dev_node = NULL; + link->dev = NULL; goto failed; } @@ -731,13 +747,14 @@ static int nmclan_config(struct pcmcia_device *link) dev->name, dev->base_addr, dev->irq, if_names[dev->if_port]); for (i = 0; i < 6; i++) printk("%02X%s", dev->dev_addr[i], ((i<5) ? ":" : "\n")); - return 0; + return; cs_failed: - cs_error(link, last_fn, last_ret); + cs_error(link->handle, last_fn, last_ret); failed: - nmclan_release(link); - return -ENODEV; + nmclan_release(link); + return; + } /* nmclan_config */ /* ---------------------------------------------------------------------------- @@ -746,29 +763,46 @@ nmclan_release net device, and release the PCMCIA configuration. If the device is still open, this will be postponed until it is closed. ---------------------------------------------------------------------------- */ -static void nmclan_release(struct pcmcia_device *link) +static void nmclan_release(dev_link_t *link) { - DEBUG(0, "nmclan_release(0x%p)\n", link); - pcmcia_disable_device(link); + + DEBUG(0, "nmclan_release(0x%p)\n", link); + + pcmcia_release_configuration(link->handle); + pcmcia_release_io(link->handle, &link->io); + pcmcia_release_irq(link->handle, &link->irq); + + link->state &= ~DEV_CONFIG; } -static int nmclan_suspend(struct pcmcia_device *link) +static int nmclan_suspend(struct pcmcia_device *p_dev) { + dev_link_t *link = dev_to_instance(p_dev); struct net_device *dev = link->priv; - if (link->open) - netif_device_detach(dev); + link->state |= DEV_SUSPEND; + if (link->state & DEV_CONFIG) { + if (link->open) + netif_device_detach(dev); + pcmcia_release_configuration(link->handle); + } + return 0; } -static int nmclan_resume(struct pcmcia_device *link) +static int nmclan_resume(struct pcmcia_device *p_dev) { + dev_link_t *link = dev_to_instance(p_dev); struct net_device *dev = link->priv; - if (link->open) { - nmclan_reset(dev); - netif_device_attach(dev); + link->state &= ~DEV_SUSPEND; + if (link->state & DEV_CONFIG) { + pcmcia_request_configuration(link->handle, &link->conf); + if (link->open) { + nmclan_reset(dev); + netif_device_attach(dev); + } } return 0; @@ -784,7 +818,7 @@ static void nmclan_reset(struct net_device *dev) mace_private *lp = netdev_priv(dev); #if RESET_XILINX - struct pcmcia_device *link = &lp->link; + dev_link_t *link = &lp->link; conf_reg_t reg; u_long OrigCorValue; @@ -793,7 +827,7 @@ static void nmclan_reset(struct net_device *dev) reg.Action = CS_READ; reg.Offset = CISREG_COR; reg.Value = 0; - pcmcia_access_configuration_register(link, ®); + pcmcia_access_configuration_register(link->handle, ®); OrigCorValue = reg.Value; /* Reset Xilinx */ @@ -802,12 +836,12 @@ static void nmclan_reset(struct net_device *dev) DEBUG(1, "nmclan_reset: OrigCorValue=0x%lX, resetting...\n", OrigCorValue); reg.Value = COR_SOFT_RESET; - pcmcia_access_configuration_register(link, ®); + pcmcia_access_configuration_register(link->handle, ®); /* Need to wait for 20 ms for PCMCIA to finish reset. */ /* Restore original COR configuration index */ reg.Value = COR_LEVEL_REQ | (OrigCorValue & COR_CONFIG_MASK); - pcmcia_access_configuration_register(link, ®); + pcmcia_access_configuration_register(link->handle, ®); /* Xilinx is now completely reset along with the MACE chip. */ lp->tx_free_frames=AM2150_MAX_TX_FRAMES; @@ -851,9 +885,9 @@ static int mace_open(struct net_device *dev) { kio_addr_t ioaddr = dev->base_addr; mace_private *lp = netdev_priv(dev); - struct pcmcia_device *link = lp->p_dev; + dev_link_t *link = &lp->link; - if (!pcmcia_dev_present(link)) + if (!DEV_OK(link)) return -ENODEV; link->open++; @@ -874,7 +908,7 @@ static int mace_close(struct net_device *dev) { kio_addr_t ioaddr = dev->base_addr; mace_private *lp = netdev_priv(dev); - struct pcmcia_device *link = lp->p_dev; + dev_link_t *link = &lp->link; DEBUG(2, "%s: shutting down ethercard.\n", dev->name); @@ -929,12 +963,12 @@ mace_start_xmit static void mace_tx_timeout(struct net_device *dev) { mace_private *lp = netdev_priv(dev); - struct pcmcia_device *link = lp->p_dev; + dev_link_t *link = &lp->link; printk(KERN_NOTICE "%s: transmit timed out -- ", dev->name); #if RESET_ON_TIMEOUT printk("resetting card\n"); - pcmcia_reset_card(link, NULL); + pcmcia_reset_card(link->handle, NULL); #else /* #if RESET_ON_TIMEOUT */ printk("NOT resetting card\n"); #endif /* #if RESET_ON_TIMEOUT */ @@ -1204,7 +1238,7 @@ static int mace_rx(struct net_device *dev, unsigned char RxCnt) dev->last_rx = jiffies; lp->linux_stats.rx_packets++; - lp->linux_stats.rx_bytes += pkt_len; + lp->linux_stats.rx_bytes += skb->len; outb(0xFF, ioaddr + AM2150_RCV_NEXT); /* skip to next frame */ continue; } else { @@ -1601,7 +1635,7 @@ static struct pcmcia_driver nmclan_cs_driver = { .drv = { .name = "nmclan_cs", }, - .probe = nmclan_probe, + .probe = nmclan_attach, .remove = nmclan_detach, .id_table = nmclan_ids, .suspend = nmclan_suspend, diff --git a/drivers/net/pcmcia/pcnet_cs.c b/drivers/net/pcmcia/pcnet_cs.c index 0ecebfc31..d85b758f3 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. @@ -66,7 +66,7 @@ #define PCNET_RDC_TIMEOUT (2*HZ/100) /* Max wait in jiffies for Tx RDC */ -static const char *if_names[] = { "auto", "10baseT", "10base2"}; +static char *if_names[] = { "auto", "10baseT", "10base2"}; #ifdef PCMCIA_DEBUG static int pc_debug = PCMCIA_DEBUG; @@ -103,8 +103,8 @@ module_param_array(hw_addr, int, NULL, 0); /*====================================================================*/ static void mii_phy_probe(struct net_device *dev); -static int pcnet_config(struct pcmcia_device *link); -static void pcnet_release(struct pcmcia_device *link); +static void pcnet_config(dev_link_t *link); +static void pcnet_release(dev_link_t *link); static int pcnet_open(struct net_device *dev); static int pcnet_close(struct net_device *dev); static int ei_ioctl(struct net_device *dev, struct ifreq *rq, int cmd); @@ -113,9 +113,9 @@ static irqreturn_t ei_irq_wrapper(int irq, void *dev_id, struct pt_regs *regs); static void ei_watchdog(u_long arg); static void pcnet_reset_8390(struct net_device *dev); static int set_config(struct net_device *dev, struct ifmap *map); -static int setup_shmem_window(struct pcmcia_device *link, int start_pg, +static int setup_shmem_window(dev_link_t *link, int start_pg, int stop_pg, int cm_offset); -static int setup_dma_config(struct pcmcia_device *link, int start_pg, +static int setup_dma_config(dev_link_t *link, int start_pg, int stop_pg); static void pcnet_detach(struct pcmcia_device *p_dev); @@ -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 }, @@ -214,7 +214,7 @@ static hw_info_t dl10019_info = { 0, 0, 0, 0, IS_DL10019|HAS_MII }; static hw_info_t dl10022_info = { 0, 0, 0, 0, IS_DL10022|HAS_MII }; typedef struct pcnet_dev_t { - struct pcmcia_device *p_dev; + dev_link_t link; dev_node_t node; u_int flags; void __iomem *base; @@ -240,9 +240,10 @@ static inline pcnet_dev_t *PRIV(struct net_device *dev) ======================================================================*/ -static int pcnet_probe(struct pcmcia_device *link) +static int pcnet_probe(struct pcmcia_device *p_dev) { pcnet_dev_t *info; + dev_link_t *link; struct net_device *dev; DEBUG(0, "pcnet_attach()\n"); @@ -251,7 +252,7 @@ static int pcnet_probe(struct pcmcia_device *link) dev = __alloc_ei_netdev(sizeof(pcnet_dev_t)); if (!dev) return -ENOMEM; info = PRIV(dev); - info->p_dev = link; + link = &info->link; link->priv = dev; link->irq.Attributes = IRQ_TYPE_EXCLUSIVE; @@ -264,7 +265,13 @@ static int pcnet_probe(struct pcmcia_device *link) dev->stop = &pcnet_close; dev->set_config = &set_config; - return pcnet_config(link); + link->handle = p_dev; + p_dev->instance = link; + + link->state |= DEV_PRESENT | DEV_CONFIG_PENDING; + pcnet_config(link); + + return 0; } /* pcnet_attach */ /*====================================================================== @@ -276,16 +283,18 @@ static int pcnet_probe(struct pcmcia_device *link) ======================================================================*/ -static void pcnet_detach(struct pcmcia_device *link) +static void pcnet_detach(struct pcmcia_device *p_dev) { + dev_link_t *link = dev_to_instance(p_dev); struct net_device *dev = link->priv; DEBUG(0, "pcnet_detach(0x%p)\n", link); - if (link->dev_node) + if (link->dev) unregister_netdev(dev); - pcnet_release(link); + if (link->state & DEV_CONFIG) + pcnet_release(link); free_netdev(dev); } /* pcnet_detach */ @@ -297,7 +306,7 @@ static void pcnet_detach(struct pcmcia_device *link) ======================================================================*/ -static hw_info_t *get_hwinfo(struct pcmcia_device *link) +static hw_info_t *get_hwinfo(dev_link_t *link) { struct net_device *dev = link->priv; win_req_t req; @@ -309,9 +318,9 @@ static hw_info_t *get_hwinfo(struct pcmcia_device *link) req.Attributes = WIN_DATA_WIDTH_8|WIN_MEMORY_TYPE_AM|WIN_ENABLE; req.Base = 0; req.Size = 0; req.AccessSpeed = 0; - i = pcmcia_request_window(&link, &req, &link->win); + i = pcmcia_request_window(&link->handle, &req, &link->win); if (i != CS_SUCCESS) { - cs_error(link, RequestWindow, i); + cs_error(link->handle, RequestWindow, i); return NULL; } @@ -330,11 +339,11 @@ 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) - cs_error(link, ReleaseWindow, j); + cs_error(link->handle, ReleaseWindow, j); return (i < NR_INFO) ? hw_info+i : NULL; } /* get_hwinfo */ @@ -346,7 +355,7 @@ static hw_info_t *get_hwinfo(struct pcmcia_device *link) ======================================================================*/ -static hw_info_t *get_prom(struct pcmcia_device *link) +static hw_info_t *get_prom(dev_link_t *link) { struct net_device *dev = link->priv; kio_addr_t ioaddr = dev->base_addr; @@ -400,7 +409,7 @@ static hw_info_t *get_prom(struct pcmcia_device *link) ======================================================================*/ -static hw_info_t *get_dl10019(struct pcmcia_device *link) +static hw_info_t *get_dl10019(dev_link_t *link) { struct net_device *dev = link->priv; int i; @@ -422,7 +431,7 @@ static hw_info_t *get_dl10019(struct pcmcia_device *link) ======================================================================*/ -static hw_info_t *get_ax88190(struct pcmcia_device *link) +static hw_info_t *get_ax88190(dev_link_t *link) { struct net_device *dev = link->priv; kio_addr_t ioaddr = dev->base_addr; @@ -455,7 +464,7 @@ static hw_info_t *get_ax88190(struct pcmcia_device *link) ======================================================================*/ -static hw_info_t *get_hwired(struct pcmcia_device *link) +static hw_info_t *get_hwired(dev_link_t *link) { struct net_device *dev = link->priv; int i; @@ -482,7 +491,7 @@ static hw_info_t *get_hwired(struct pcmcia_device *link) #define CS_CHECK(fn, ret) \ do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0) -static int try_io_port(struct pcmcia_device *link) +static int try_io_port(dev_link_t *link) { int j, ret; if (link->io.NumPorts1 == 32) { @@ -490,7 +499,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 { @@ -503,17 +512,18 @@ static int try_io_port(struct pcmcia_device *link) for (j = 0; j < 0x400; j += 0x20) { link->io.BasePort1 = j ^ 0x300; link->io.BasePort2 = (j ^ 0x300) + 0x10; - ret = pcmcia_request_io(link, &link->io); + ret = pcmcia_request_io(link->handle, &link->io); if (ret == CS_SUCCESS) return ret; } return ret; } else { - return pcmcia_request_io(link, &link->io); + return pcmcia_request_io(link->handle, &link->io); } } -static int pcnet_config(struct pcmcia_device *link) +static void pcnet_config(dev_link_t *link) { + client_handle_t handle = link->handle; struct net_device *dev = link->priv; pcnet_dev_t *info = PRIV(dev); tuple_t tuple; @@ -521,6 +531,7 @@ static int pcnet_config(struct pcmcia_device *link) int i, last_ret, last_fn, start_pg, stop_pg, cm_offset; int manfid = 0, prodid = 0, has_shmem = 0; u_short buf[64]; + config_info_t conf; hw_info_t *hw_info; DEBUG(0, "pcnet_config(0x%p)\n", link); @@ -530,32 +541,39 @@ static int pcnet_config(struct pcmcia_device *link) tuple.TupleDataMax = sizeof(buf); tuple.TupleOffset = 0; tuple.DesiredTuple = CISTPL_CONFIG; - 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)); + CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple)); + CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple)); + CS_CHECK(ParseTuple, pcmcia_parse_tuple(handle, &tuple, &parse)); link->conf.ConfigBase = parse.config.base; link->conf.Present = parse.config.rmask[0]; + /* Configure card */ + link->state |= DEV_CONFIG; + + /* Look up current Vcc */ + CS_CHECK(GetConfigurationInfo, pcmcia_get_configuration_info(handle, &conf)); + link->conf.Vcc = conf.Vcc; + tuple.DesiredTuple = CISTPL_MANFID; tuple.Attributes = TUPLE_RETURN_COMMON; - if ((pcmcia_get_first_tuple(link, &tuple) == CS_SUCCESS) && - (pcmcia_get_tuple_data(link, &tuple) == CS_SUCCESS)) { + if ((pcmcia_get_first_tuple(handle, &tuple) == CS_SUCCESS) && + (pcmcia_get_tuple_data(handle, &tuple) == CS_SUCCESS)) { 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)); + CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &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 || + + if (pcmcia_get_tuple_data(handle, &tuple) != 0 || + pcmcia_parse_tuple(handle, &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 */ @@ -576,15 +594,15 @@ static int pcnet_config(struct pcmcia_device *link) if (last_ret == CS_SUCCESS) break; } next_entry: - last_ret = pcmcia_get_next_tuple(link, &tuple); + last_ret = pcmcia_get_next_tuple(handle, &tuple); } if (last_ret != CS_SUCCESS) { - cs_error(link, RequestIO, last_ret); + cs_error(handle, RequestIO, last_ret); goto failed; } - CS_CHECK(RequestIRQ, pcmcia_request_irq(link, &link->irq)); - + CS_CHECK(RequestIRQ, pcmcia_request_irq(handle, &link->irq)); + if (link->io.NumPorts2 == 8) { link->conf.Attributes |= CONF_ENABLE_SPKR; link->conf.Status = CCSR_AUDIO_ENA; @@ -592,8 +610,8 @@ 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)); + + CS_CHECK(RequestConfiguration, pcmcia_request_configuration(handle, &link->conf)); dev->irq = link->irq.AssignedIRQ; dev->base_addr = link->io.BasePort1; if (info->flags & HAS_MISC_REG) { @@ -614,7 +632,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 +649,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; @@ -661,8 +679,9 @@ static int pcnet_config(struct pcmcia_device *link) info->eth_phy = 0; } - link->dev_node = &info->node; - SET_NETDEV_DEV(dev, &handle_to_dev(link)); + link->dev = &info->node; + link->state &= ~DEV_CONFIG_PENDING; + SET_NETDEV_DEV(dev, &handle_to_dev(handle)); #ifdef CONFIG_NET_POLL_CONTROLLER dev->poll_controller = ei_poll; @@ -670,7 +689,7 @@ static int pcnet_config(struct pcmcia_device *link) if (register_netdev(dev) != 0) { printk(KERN_NOTICE "pcnet_cs: register_netdev() failed\n"); - link->dev_node = NULL; + link->dev = NULL; goto failed; } @@ -693,13 +712,14 @@ static int pcnet_config(struct pcmcia_device *link) printk(" hw_addr "); for (i = 0; i < 6; i++) printk("%02X%s", dev->dev_addr[i], ((i<5) ? ":" : "\n")); - return 0; + return; cs_failed: - cs_error(link, last_fn, last_ret); + cs_error(link->handle, last_fn, last_ret); failed: pcnet_release(link); - return -ENODEV; + link->state &= ~DEV_CONFIG_PENDING; + return; } /* pcnet_config */ /*====================================================================== @@ -710,16 +730,21 @@ failed: ======================================================================*/ -static void pcnet_release(struct pcmcia_device *link) +static void pcnet_release(dev_link_t *link) { - pcnet_dev_t *info = PRIV(link->priv); + pcnet_dev_t *info = PRIV(link->priv); - DEBUG(0, "pcnet_release(0x%p)\n", link); + DEBUG(0, "pcnet_release(0x%p)\n", link); - if (info->flags & USE_SHMEM) - iounmap(info->base); + if (info->flags & USE_SHMEM) { + iounmap(info->base); + pcmcia_release_window(link->win); + } + pcmcia_release_configuration(link->handle); + pcmcia_release_io(link->handle, &link->io); + pcmcia_release_irq(link->handle, &link->irq); - pcmcia_disable_device(link); + link->state &= ~DEV_CONFIG; } /*====================================================================== @@ -731,24 +756,34 @@ static void pcnet_release(struct pcmcia_device *link) ======================================================================*/ -static int pcnet_suspend(struct pcmcia_device *link) +static int pcnet_suspend(struct pcmcia_device *p_dev) { + dev_link_t *link = dev_to_instance(p_dev); struct net_device *dev = link->priv; - if (link->open) - netif_device_detach(dev); + link->state |= DEV_SUSPEND; + if (link->state & DEV_CONFIG) { + if (link->open) + netif_device_detach(dev); + pcmcia_release_configuration(link->handle); + } return 0; } -static int pcnet_resume(struct pcmcia_device *link) +static int pcnet_resume(struct pcmcia_device *p_dev) { + dev_link_t *link = dev_to_instance(p_dev); struct net_device *dev = link->priv; - if (link->open) { - pcnet_reset_8390(dev); - NS8390_init(dev, 1); - netif_device_attach(dev); + link->state &= ~DEV_SUSPEND; + if (link->state & DEV_CONFIG) { + pcmcia_request_configuration(link->handle, &link->conf); + if (link->open) { + pcnet_reset_8390(dev); + NS8390_init(dev, 1); + netif_device_attach(dev); + } } return 0; @@ -929,7 +964,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) @@ -988,17 +1023,17 @@ static void mii_phy_probe(struct net_device *dev) static int pcnet_open(struct net_device *dev) { pcnet_dev_t *info = PRIV(dev); - struct pcmcia_device *link = info->p_dev; - + dev_link_t *link = &info->link; + DEBUG(2, "pcnet_open('%s')\n", dev->name); - if (!pcmcia_dev_present(link)) + if (!DEV_OK(link)) return -ENODEV; link->open++; set_misc_reg(dev); - request_irq(dev->irq, ei_irq_wrapper, IRQF_SHARED, dev_info, dev); + request_irq(dev->irq, ei_irq_wrapper, SA_SHIRQ, dev_info, dev); info->phy_id = info->eth_phy; info->link_status = 0x00; @@ -1016,13 +1051,13 @@ static int pcnet_open(struct net_device *dev) static int pcnet_close(struct net_device *dev) { pcnet_dev_t *info = PRIV(dev); - struct pcmcia_device *link = info->p_dev; + dev_link_t *link = &info->link; DEBUG(2, "pcnet_close('%s')\n", dev->name); ei_close(dev); free_irq(dev->irq, dev); - + link->open--; netif_stop_queue(dev); del_timer_sync(&info->watchdog); @@ -1054,12 +1089,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 +1268,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); @@ -1394,7 +1429,7 @@ static void dma_block_output(struct net_device *dev, int count, /*====================================================================*/ -static int setup_dma_config(struct pcmcia_device *link, int start_pg, +static int setup_dma_config(dev_link_t *link, int start_pg, int stop_pg) { struct net_device *dev = link->priv; @@ -1458,7 +1493,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 +1508,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; @@ -1497,7 +1532,7 @@ static void shmem_block_output(struct net_device *dev, int count, /*====================================================================*/ -static int setup_shmem_window(struct pcmcia_device *link, int start_pg, +static int setup_shmem_window(dev_link_t *link, int start_pg, int stop_pg, int cm_offset) { struct net_device *dev = link->priv; @@ -1519,7 +1554,7 @@ static int setup_shmem_window(struct pcmcia_device *link, int start_pg, req.Attributes |= WIN_USE_WAIT; req.Base = 0; req.Size = window_size; req.AccessSpeed = mem_speed; - CS_CHECK(RequestWindow, pcmcia_request_window(&link, &req, &link->win)); + CS_CHECK(RequestWindow, pcmcia_request_window(&link->handle, &req, &link->win)); mem.CardOffset = (start_pg << 8) + cm_offset; offset = mem.CardOffset % window_size; @@ -1541,7 +1576,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; @@ -1560,7 +1595,7 @@ static int setup_shmem_window(struct pcmcia_device *link, int start_pg, return 0; cs_failed: - cs_error(link, last_fn, last_ret); + cs_error(link->handle, last_fn, last_ret); failed: return 1; } @@ -1639,7 +1674,6 @@ static struct pcmcia_device_id pcnet_ids[] = { PCMCIA_DEVICE_PROD_ID12("CONTEC", "C-NET(PC)C-10L", 0x21cab552, 0xf6f90722), PCMCIA_DEVICE_PROD_ID12("corega", "FEther PCC-TXF", 0x0a21501a, 0xa51564a2), PCMCIA_DEVICE_PROD_ID12("corega K.K.", "corega EtherII PCC-T", 0x5261440f, 0xfa9d85bd), - PCMCIA_DEVICE_PROD_ID12("corega K.K.", "corega EtherII PCC-TD", 0x5261440f, 0xc49bd73d), PCMCIA_DEVICE_PROD_ID12("Corega K.K.", "corega EtherII PCC-TD", 0xd4fdcbd8, 0xc49bd73d), PCMCIA_DEVICE_PROD_ID12("corega K.K.", "corega Ether PCC-T", 0x5261440f, 0x6705fcaa), PCMCIA_DEVICE_PROD_ID12("corega K.K.", "corega FastEther PCC-TX", 0x5261440f, 0x485e85d9), @@ -1693,7 +1727,6 @@ static struct pcmcia_device_id pcnet_ids[] = { PCMCIA_DEVICE_PROD_ID12("Linksys", "EtherFast 10/100 PC Card (PCMPC100 V2)", 0x0733cc81, 0x3a3b28e9), PCMCIA_DEVICE_PROD_ID12("Linksys", "HomeLink Phoneline + 10/100 Network PC Card (PCM100H1)", 0x733cc81, 0x7a3e5c3a), PCMCIA_DEVICE_PROD_ID12("Logitec", "LPM-LN100TX", 0x88fcdeda, 0x6d772737), - PCMCIA_DEVICE_PROD_ID12("Logitec", "LPM-LN100TE", 0x88fcdeda, 0x0e714bee), PCMCIA_DEVICE_PROD_ID12("Logitec", "LPM-LN20T", 0x88fcdeda, 0x81090922), PCMCIA_DEVICE_PROD_ID12("LONGSHINE", "PCMCIA Ethernet Card", 0xf866b0b0, 0x6f6652e0), PCMCIA_DEVICE_PROD_ID12("MACNICA", "ME1-JEIDA", 0x20841b68, 0xaf8a3578), @@ -1768,8 +1801,6 @@ 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 a73d54553..0122415df 100644 --- a/drivers/net/pcmcia/smc91c92_cs.c +++ b/drivers/net/pcmcia/smc91c92_cs.c @@ -49,7 +49,6 @@ #include #include #include -#include #include #include @@ -60,7 +59,7 @@ /*====================================================================*/ -static const char *if_names[] = { "auto", "10baseT", "10base2"}; +static char *if_names[] = { "auto", "10baseT", "10base2"}; /* Module parameters */ @@ -104,7 +103,7 @@ static const char *version = #define MEMORY_WAIT_TIME 8 struct smc_private { - struct pcmcia_device *p_dev; + dev_link_t link; spinlock_t lock; u_short manfid; u_short cardid; @@ -279,8 +278,8 @@ enum RxCfg { RxAllMulti = 0x0004, RxPromisc = 0x0002, /*====================================================================*/ static void smc91c92_detach(struct pcmcia_device *p_dev); -static int smc91c92_config(struct pcmcia_device *link); -static void smc91c92_release(struct pcmcia_device *link); +static void smc91c92_config(dev_link_t *link); +static void smc91c92_release(dev_link_t *link); static int smc_open(struct net_device *dev); static int smc_close(struct net_device *dev); @@ -309,9 +308,10 @@ static struct ethtool_ops ethtool_ops; ======================================================================*/ -static int smc91c92_probe(struct pcmcia_device *link) +static int smc91c92_attach(struct pcmcia_device *p_dev) { struct smc_private *smc; + dev_link_t *link; struct net_device *dev; DEBUG(0, "smc91c92_attach()\n"); @@ -321,7 +321,7 @@ static int smc91c92_probe(struct pcmcia_device *link) if (!dev) return -ENOMEM; smc = netdev_priv(dev); - smc->p_dev = link; + link = &smc->link; link->priv = dev; spin_lock_init(&smc->lock); @@ -333,6 +333,7 @@ static int smc91c92_probe(struct pcmcia_device *link) link->irq.Handler = &smc_interrupt; link->irq.Instance = dev; link->conf.Attributes = CONF_ENABLE_IRQ; + link->conf.Vcc = 50; link->conf.IntType = INT_MEMORY_AND_IO; /* The SMC91c92-specific entries in the device structure. */ @@ -356,7 +357,13 @@ static int smc91c92_probe(struct pcmcia_device *link) smc->mii_if.phy_id_mask = 0x1f; smc->mii_if.reg_num_mask = 0x1f; - return smc91c92_config(link); + link->handle = p_dev; + p_dev->instance = link; + + link->state |= DEV_PRESENT | DEV_CONFIG_PENDING; + smc91c92_config(link); + + return 0; } /* smc91c92_attach */ /*====================================================================== @@ -368,16 +375,18 @@ static int smc91c92_probe(struct pcmcia_device *link) ======================================================================*/ -static void smc91c92_detach(struct pcmcia_device *link) +static void smc91c92_detach(struct pcmcia_device *p_dev) { + dev_link_t *link = dev_to_instance(p_dev); struct net_device *dev = link->priv; DEBUG(0, "smc91c92_detach(0x%p)\n", link); - if (link->dev_node) + if (link->dev) unregister_netdev(dev); - smc91c92_release(link); + if (link->state & DEV_CONFIG) + smc91c92_release(link); free_netdev(dev); } /* smc91c92_detach */ @@ -405,7 +414,7 @@ static int cvt_ascii_address(struct net_device *dev, char *s) /*====================================================================*/ -static int first_tuple(struct pcmcia_device *handle, tuple_t *tuple, +static int first_tuple(client_handle_t handle, tuple_t *tuple, cisparse_t *parse) { int i; @@ -416,7 +425,7 @@ static int first_tuple(struct pcmcia_device *handle, tuple_t *tuple, return pcmcia_parse_tuple(handle, tuple, parse); } -static int next_tuple(struct pcmcia_device *handle, tuple_t *tuple, +static int next_tuple(client_handle_t handle, tuple_t *tuple, cisparse_t *parse) { int i; @@ -438,7 +447,7 @@ static int next_tuple(struct pcmcia_device *handle, tuple_t *tuple, ======================================================================*/ -static int mhz_3288_power(struct pcmcia_device *link) +static int mhz_3288_power(dev_link_t *link) { struct net_device *dev = link->priv; struct smc_private *smc = netdev_priv(dev); @@ -460,7 +469,7 @@ static int mhz_3288_power(struct pcmcia_device *link) return 0; } -static int mhz_mfc_config(struct pcmcia_device *link) +static int mhz_mfc_config(dev_link_t *link) { struct net_device *dev = link->priv; struct smc_private *smc = netdev_priv(dev); @@ -495,7 +504,7 @@ static int mhz_mfc_config(struct pcmcia_device *link) tuple->TupleDataMax = 255; tuple->DesiredTuple = CISTPL_CFTABLE_ENTRY; - i = first_tuple(link, tuple, parse); + i = first_tuple(link->handle, tuple, parse); /* The Megahertz combo cards have modem-like CIS entries, so we have to explicitly try a bunch of port combinations. */ while (i == CS_SUCCESS) { @@ -504,11 +513,11 @@ static int mhz_mfc_config(struct pcmcia_device *link) for (k = 0; k < 0x400; k += 0x10) { if (k & 0x80) continue; link->io.BasePort1 = k ^ 0x300; - i = pcmcia_request_io(link, &link->io); + i = pcmcia_request_io(link->handle, &link->io); if (i == CS_SUCCESS) break; } if (i == CS_SUCCESS) break; - i = next_tuple(link, tuple, parse); + i = next_tuple(link->handle, tuple, parse); } if (i != CS_SUCCESS) goto free_cfg_mem; @@ -518,7 +527,7 @@ static int mhz_mfc_config(struct pcmcia_device *link) req.Attributes = WIN_DATA_WIDTH_8|WIN_MEMORY_TYPE_AM|WIN_ENABLE; req.Base = req.Size = 0; req.AccessSpeed = 0; - i = pcmcia_request_window(&link, &req, &link->win); + i = pcmcia_request_window(&link->handle, &req, &link->win); if (i != CS_SUCCESS) goto free_cfg_mem; smc->base = ioremap(req.Base, req.Size); @@ -537,8 +546,9 @@ free_cfg_mem: return i; } -static int mhz_setup(struct pcmcia_device *link) +static int mhz_setup(dev_link_t *link) { + client_handle_t handle = link->handle; struct net_device *dev = link->priv; struct smc_cfg_mem *cfg_mem; tuple_t *tuple; @@ -561,13 +571,13 @@ static int mhz_setup(struct pcmcia_device *link) /* Read the station address from the CIS. It is stored as the last (fourth) string in the Version 1 Version/ID tuple. */ tuple->DesiredTuple = CISTPL_VERS_1; - if (first_tuple(link, tuple, parse) != CS_SUCCESS) { + if (first_tuple(handle, tuple, parse) != CS_SUCCESS) { rc = -1; goto free_cfg_mem; } /* Ugh -- the EM1144 card has two VERS_1 tuples!?! */ - if (next_tuple(link, tuple, parse) != CS_SUCCESS) - first_tuple(link, tuple, parse); + if (next_tuple(handle, tuple, parse) != CS_SUCCESS) + first_tuple(handle, tuple, parse); if (parse->version_1.ns > 3) { station_addr = parse->version_1.str + parse->version_1.ofs[3]; if (cvt_ascii_address(dev, station_addr) == 0) { @@ -578,11 +588,11 @@ static int mhz_setup(struct pcmcia_device *link) /* Another possibility: for the EM3288, in a special tuple */ tuple->DesiredTuple = 0x81; - if (pcmcia_get_first_tuple(link, tuple) != CS_SUCCESS) { + if (pcmcia_get_first_tuple(handle, tuple) != CS_SUCCESS) { rc = -1; goto free_cfg_mem; } - if (pcmcia_get_tuple_data(link, tuple) != CS_SUCCESS) { + if (pcmcia_get_tuple_data(handle, tuple) != CS_SUCCESS) { rc = -1; goto free_cfg_mem; } @@ -606,7 +616,7 @@ free_cfg_mem: ======================================================================*/ -static void mot_config(struct pcmcia_device *link) +static void mot_config(dev_link_t *link) { struct net_device *dev = link->priv; struct smc_private *smc = netdev_priv(dev); @@ -627,7 +637,7 @@ static void mot_config(struct pcmcia_device *link) mdelay(100); } -static int mot_setup(struct pcmcia_device *link) +static int mot_setup(dev_link_t *link) { struct net_device *dev = link->priv; kio_addr_t ioaddr = dev->base_addr; @@ -661,7 +671,7 @@ static int mot_setup(struct pcmcia_device *link) /*====================================================================*/ -static int smc_config(struct pcmcia_device *link) +static int smc_config(dev_link_t *link) { struct net_device *dev = link->priv; struct smc_cfg_mem *cfg_mem; @@ -686,16 +696,16 @@ static int smc_config(struct pcmcia_device *link) tuple->DesiredTuple = CISTPL_CFTABLE_ENTRY; link->io.NumPorts1 = 16; - i = first_tuple(link, tuple, parse); + i = first_tuple(link->handle, tuple, parse); while (i != CS_NO_MORE_ITEMS) { if (i == CS_SUCCESS) { link->conf.ConfigIndex = cf->index; link->io.BasePort1 = cf->io.win[0].base; link->io.IOAddrLines = cf->io.flags & CISTPL_IO_LINES_MASK; - i = pcmcia_request_io(link, &link->io); + i = pcmcia_request_io(link->handle, &link->io); if (i == CS_SUCCESS) break; } - i = next_tuple(link, tuple, parse); + i = next_tuple(link->handle, tuple, parse); } if (i == CS_SUCCESS) dev->base_addr = link->io.BasePort1; @@ -704,8 +714,9 @@ static int smc_config(struct pcmcia_device *link) return i; } -static int smc_setup(struct pcmcia_device *link) +static int smc_setup(dev_link_t *link) { + client_handle_t handle = link->handle; struct net_device *dev = link->priv; struct smc_cfg_mem *cfg_mem; tuple_t *tuple; @@ -728,11 +739,11 @@ static int smc_setup(struct pcmcia_device *link) /* Check for a LAN function extension tuple */ tuple->DesiredTuple = CISTPL_FUNCE; - i = first_tuple(link, tuple, parse); + i = first_tuple(handle, tuple, parse); while (i == CS_SUCCESS) { if (parse->funce.type == CISTPL_FUNCE_LAN_NODE_ID) break; - i = next_tuple(link, tuple, parse); + i = next_tuple(handle, tuple, parse); } if (i == CS_SUCCESS) { node_id = (cistpl_lan_node_id_t *)parse->funce.data; @@ -745,7 +756,7 @@ static int smc_setup(struct pcmcia_device *link) } /* Try the third string in the Version 1 Version/ID tuple. */ tuple->DesiredTuple = CISTPL_VERS_1; - if (first_tuple(link, tuple, parse) != CS_SUCCESS) { + if (first_tuple(handle, tuple, parse) != CS_SUCCESS) { rc = -1; goto free_cfg_mem; } @@ -763,10 +774,10 @@ free_cfg_mem: /*====================================================================*/ -static int osi_config(struct pcmcia_device *link) +static int osi_config(dev_link_t *link) { struct net_device *dev = link->priv; - static const kio_addr_t com[4] = { 0x3f8, 0x2f8, 0x3e8, 0x2e8 }; + static kio_addr_t com[4] = { 0x3f8, 0x2f8, 0x3e8, 0x2e8 }; int i, j; link->conf.Attributes |= CONF_ENABLE_SPKR; @@ -783,21 +794,22 @@ static int osi_config(struct pcmcia_device *link) for (i = j = 0; j < 4; j++) { link->io.BasePort2 = com[j]; - i = pcmcia_request_io(link, &link->io); + i = pcmcia_request_io(link->handle, &link->io); if (i == CS_SUCCESS) break; } if (i != CS_SUCCESS) { /* Fallback: turn off hard decode */ link->conf.ConfigIndex = 0x03; link->io.NumPorts2 = 0; - i = pcmcia_request_io(link, &link->io); + i = pcmcia_request_io(link->handle, &link->io); } dev->base_addr = link->io.BasePort1 + 0x10; return i; } -static int osi_setup(struct pcmcia_device *link, u_short manfid, u_short cardid) +static int osi_setup(dev_link_t *link, u_short manfid, u_short cardid) { + client_handle_t handle = link->handle; struct net_device *dev = link->priv; struct smc_cfg_mem *cfg_mem; tuple_t *tuple; @@ -818,12 +830,12 @@ static int osi_setup(struct pcmcia_device *link, u_short manfid, u_short cardid) /* Read the station address from tuple 0x90, subtuple 0x04 */ tuple->DesiredTuple = 0x90; - i = pcmcia_get_first_tuple(link, tuple); + i = pcmcia_get_first_tuple(handle, tuple); while (i == CS_SUCCESS) { - i = pcmcia_get_tuple_data(link, tuple); + i = pcmcia_get_tuple_data(handle, tuple); if ((i != CS_SUCCESS) || (buf[0] == 0x04)) break; - i = pcmcia_get_next_tuple(link, tuple); + i = pcmcia_get_next_tuple(handle, tuple); } if (i != CS_SUCCESS) { rc = -1; @@ -856,46 +868,56 @@ free_cfg_mem: return rc; } -static int smc91c92_suspend(struct pcmcia_device *link) +static int smc91c92_suspend(struct pcmcia_device *p_dev) { + dev_link_t *link = dev_to_instance(p_dev); struct net_device *dev = link->priv; - if (link->open) - netif_device_detach(dev); + link->state |= DEV_SUSPEND; + if (link->state & DEV_CONFIG) { + if (link->open) + netif_device_detach(dev); + pcmcia_release_configuration(link->handle); + } return 0; } -static int smc91c92_resume(struct pcmcia_device *link) +static int smc91c92_resume(struct pcmcia_device *p_dev) { + dev_link_t *link = dev_to_instance(p_dev); struct net_device *dev = link->priv; struct smc_private *smc = netdev_priv(dev); int i; - if ((smc->manfid == MANFID_MEGAHERTZ) && - (smc->cardid == PRODID_MEGAHERTZ_EM3288)) - mhz_3288_power(link); - if (smc->manfid == MANFID_MOTOROLA) - mot_config(link); - if ((smc->manfid == MANFID_OSITECH) && - (smc->cardid != PRODID_OSITECH_SEVEN)) { - /* Power up the card and enable interrupts */ - set_bits(0x0300, dev->base_addr-0x10+OSITECH_AUI_PWR); - set_bits(0x0300, dev->base_addr-0x10+OSITECH_RESET_ISR); - } - if (((smc->manfid == MANFID_OSITECH) && - (smc->cardid == PRODID_OSITECH_SEVEN)) || - ((smc->manfid == MANFID_PSION) && - (smc->cardid == PRODID_PSION_NET100))) { - /* Download the Seven of Diamonds firmware */ - for (i = 0; i < sizeof(__Xilinx7OD); i++) { - outb(__Xilinx7OD[i], link->io.BasePort1+2); - udelay(50); + link->state &= ~DEV_SUSPEND; + if (link->state & DEV_CONFIG) { + if ((smc->manfid == MANFID_MEGAHERTZ) && + (smc->cardid == PRODID_MEGAHERTZ_EM3288)) + mhz_3288_power(link); + pcmcia_request_configuration(link->handle, &link->conf); + if (smc->manfid == MANFID_MOTOROLA) + mot_config(link); + if ((smc->manfid == MANFID_OSITECH) && + (smc->cardid != PRODID_OSITECH_SEVEN)) { + /* Power up the card and enable interrupts */ + set_bits(0x0300, dev->base_addr-0x10+OSITECH_AUI_PWR); + set_bits(0x0300, dev->base_addr-0x10+OSITECH_RESET_ISR); + } + if (((smc->manfid == MANFID_OSITECH) && + (smc->cardid == PRODID_OSITECH_SEVEN)) || + ((smc->manfid == MANFID_PSION) && + (smc->cardid == PRODID_PSION_NET100))) { + /* Download the Seven of Diamonds firmware */ + for (i = 0; i < sizeof(__Xilinx7OD); i++) { + outb(__Xilinx7OD[i], link->io.BasePort1+2); + udelay(50); + } + } + if (link->open) { + smc_reset(dev); + netif_device_attach(dev); } - } - if (link->open) { - smc_reset(dev); - netif_device_attach(dev); } return 0; @@ -909,7 +931,7 @@ static int smc91c92_resume(struct pcmcia_device *link) ======================================================================*/ -static int check_sig(struct pcmcia_device *link) +static int check_sig(dev_link_t *link) { struct net_device *dev = link->priv; kio_addr_t ioaddr = dev->base_addr; @@ -942,15 +964,13 @@ static int check_sig(struct pcmcia_device *link) } if (width) { - modconf_t mod = { - .Attributes = CONF_IO_CHANGE_WIDTH, - }; - printk(KERN_INFO "smc91c92_cs: using 8-bit IO window.\n"); - - smc91c92_suspend(link); - pcmcia_modify_configuration(link, &mod); - smc91c92_resume(link); - return check_sig(link); + printk(KERN_INFO "smc91c92_cs: using 8-bit IO window.\n"); + smc91c92_suspend(link->handle); + pcmcia_release_io(link->handle, &link->io); + link->io.Attributes1 = IO_DATA_PATH_WIDTH_8; + pcmcia_request_io(link->handle, &link->io); + smc91c92_resume(link->handle); + return check_sig(link); } return -ENODEV; } @@ -964,10 +984,11 @@ static int check_sig(struct pcmcia_device *link) ======================================================================*/ #define CS_EXIT_TEST(ret, svc, label) \ -if (ret != CS_SUCCESS) { cs_error(link, svc, ret); goto label; } +if (ret != CS_SUCCESS) { cs_error(link->handle, svc, ret); goto label; } -static int smc91c92_config(struct pcmcia_device *link) +static void smc91c92_config(dev_link_t *link) { + client_handle_t handle = link->handle; struct net_device *dev = link->priv; struct smc_private *smc = netdev_priv(dev); struct smc_cfg_mem *cfg_mem; @@ -994,18 +1015,21 @@ static int smc91c92_config(struct pcmcia_device *link) tuple->TupleDataMax = 64; tuple->DesiredTuple = CISTPL_CONFIG; - i = first_tuple(link, tuple, parse); + i = first_tuple(handle, tuple, parse); CS_EXIT_TEST(i, ParseTuple, config_failed); link->conf.ConfigBase = parse->config.base; link->conf.Present = parse->config.rmask[0]; tuple->DesiredTuple = CISTPL_MANFID; tuple->Attributes = TUPLE_RETURN_COMMON; - if (first_tuple(link, tuple, parse) == CS_SUCCESS) { + if (first_tuple(handle, tuple, parse) == CS_SUCCESS) { smc->manfid = parse->manfid.manf; smc->cardid = parse->manfid.card; } + /* Configure card */ + link->state |= DEV_CONFIG; + if ((smc->manfid == MANFID_OSITECH) && (smc->cardid != PRODID_OSITECH_SEVEN)) { i = osi_config(link); @@ -1019,9 +1043,9 @@ static int smc91c92_config(struct pcmcia_device *link) } CS_EXIT_TEST(i, RequestIO, config_failed); - i = pcmcia_request_irq(link, &link->irq); + i = pcmcia_request_irq(link->handle, &link->irq); CS_EXIT_TEST(i, RequestIRQ, config_failed); - i = pcmcia_request_configuration(link, &link->conf); + i = pcmcia_request_configuration(link->handle, &link->conf); CS_EXIT_TEST(i, RequestConfiguration, config_failed); if (smc->manfid == MANFID_MOTOROLA) @@ -1100,12 +1124,13 @@ static int smc91c92_config(struct pcmcia_device *link) SMC_SELECT_BANK(0); } - link->dev_node = &smc->node; - SET_NETDEV_DEV(dev, &handle_to_dev(link)); + link->dev = &smc->node; + link->state &= ~DEV_CONFIG_PENDING; + SET_NETDEV_DEV(dev, &handle_to_dev(handle)); if (register_netdev(dev) != 0) { printk(KERN_ERR "smc91c92_cs: register_netdev() failed\n"); - link->dev_node = NULL; + link->dev = NULL; goto config_undo; } @@ -1135,14 +1160,15 @@ static int smc91c92_config(struct pcmcia_device *link) } } kfree(cfg_mem); - return 0; + return; config_undo: unregister_netdev(dev); config_failed: /* CS_EXIT_TEST() calls jump to here... */ smc91c92_release(link); + link->state &= ~DEV_CONFIG_PENDING; kfree(cfg_mem); - return -ENODEV; + } /* smc91c92_config */ /*====================================================================== @@ -1153,15 +1179,22 @@ config_failed: /* CS_EXIT_TEST() calls jump to here... */ ======================================================================*/ -static void smc91c92_release(struct pcmcia_device *link) +static void smc91c92_release(dev_link_t *link) { - DEBUG(0, "smc91c92_release(0x%p)\n", link); - if (link->win) { - struct net_device *dev = link->priv; - struct smc_private *smc = netdev_priv(dev); - iounmap(smc->base); - } - pcmcia_disable_device(link); + + DEBUG(0, "smc91c92_release(0x%p)\n", link); + + pcmcia_release_configuration(link->handle); + pcmcia_release_io(link->handle, &link->io); + pcmcia_release_irq(link->handle, &link->irq); + if (link->win) { + struct net_device *dev = link->priv; + struct smc_private *smc = netdev_priv(dev); + iounmap(smc->base); + pcmcia_release_window(link->win); + } + + link->state &= ~DEV_CONFIG; } /*====================================================================== @@ -1250,7 +1283,7 @@ static void smc_dump(struct net_device *dev) static int smc_open(struct net_device *dev) { struct smc_private *smc = netdev_priv(dev); - struct pcmcia_device *link = smc->p_dev; + dev_link_t *link = &smc->link; #ifdef PCMCIA_DEBUG DEBUG(0, "%s: smc_open(%p), ID/Window %4.4x.\n", @@ -1259,7 +1292,7 @@ static int smc_open(struct net_device *dev) #endif /* Check that the PCMCIA card is still here. */ - if (!pcmcia_dev_present(link)) + if (!DEV_OK(link)) return -ENODEV; /* Physical device present signature. */ if (check_sig(link) < 0) { @@ -1287,7 +1320,7 @@ static int smc_open(struct net_device *dev) static int smc_close(struct net_device *dev) { struct smc_private *smc = netdev_priv(dev); - struct pcmcia_device *link = smc->p_dev; + dev_link_t *link = &smc->link; kio_addr_t ioaddr = dev->base_addr; DEBUG(0, "%s: smc_close(), status %4.4x.\n", @@ -1883,7 +1916,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 successfully transmitted packets, + /* Automatically release succesfully transmitted packets, Accept link errors, counter and Tx error interrupts. */ outw(CTL_AUTO_RELEASE | CTL_TE_ENABLE | CTL_CR_ENABLE, ioaddr + CONTROL); @@ -2278,7 +2311,7 @@ static struct pcmcia_driver smc91c92_cs_driver = { .drv = { .name = "smc91c92_cs", }, - .probe = smc91c92_probe, + .probe = smc91c92_attach, .remove = smc91c92_detach, .id_table = smc91c92_ids, .suspend = smc91c92_suspend, diff --git a/drivers/net/pcmcia/xirc2ps_cs.c b/drivers/net/pcmcia/xirc2ps_cs.c index 4122bb46f..14a523c44 100644 --- a/drivers/net/pcmcia/xirc2ps_cs.c +++ b/drivers/net/pcmcia/xirc2ps_cs.c @@ -208,7 +208,7 @@ enum xirc_cmd { /* Commands */ #define XIRCREG45_REV 15 /* Revision Register (rd) */ #define XIRCREG50_IA 8 /* Individual Address (8-13) */ -static const char *if_names[] = { "Auto", "10BaseT", "10Base2", "AUI", "100BaseT" }; +static char *if_names[] = { "Auto", "10BaseT", "10Base2", "AUI", "100BaseT" }; /**************** * All the PCMCIA modules use PCMCIA_DEBUG to control debugging. If @@ -289,9 +289,9 @@ static void mii_wr(kio_addr_t ioaddr, u_char phyaddr, u_char phyreg, * and ejection events. They are invoked from the event handler. */ -static int has_ce2_string(struct pcmcia_device * link); -static int xirc2ps_config(struct pcmcia_device * link); -static void xirc2ps_release(struct pcmcia_device * link); +static int has_ce2_string(dev_link_t * link); +static void xirc2ps_config(dev_link_t * link); +static void xirc2ps_release(dev_link_t * link); /**************** * The attach() and detach() entry points are used to create and destroy @@ -313,10 +313,10 @@ static irqreturn_t xirc2ps_interrupt(int irq, void *dev_id, struct pt_regs *regs /**************** * A linked list of "instances" of the device. Each actual * PCMCIA card corresponds to one device instance, and is described - * by one struct pcmcia_device structure (defined in ds.h). + * by one dev_link_t structure (defined in ds.h). * * You may not want to use a linked list for this -- for example, the - * memory card driver uses an array of struct pcmcia_device pointers, where minor + * memory card driver uses an array of dev_link_t pointers, where minor * device numbers are used to derive the corresponding array index. */ @@ -326,13 +326,13 @@ static irqreturn_t xirc2ps_interrupt(int irq, void *dev_id, struct pt_regs *regs * example, ethernet cards, modems). In other cases, there may be * many actual or logical devices (SCSI adapters, memory cards with * multiple partitions). The dev_node_t structures need to be kept - * in a linked list starting at the 'dev' field of a struct pcmcia_device + * in a linked list starting at the 'dev' field of a dev_link_t * structure. We allocate them in the card's private data structure, * because they generally can't be allocated dynamically. */ typedef struct local_info_t { - struct pcmcia_device *p_dev; + dev_link_t link; dev_node_t node; struct net_device_stats stats; int card_type; @@ -357,7 +357,7 @@ 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); -static int set_card_type(struct pcmcia_device *link, const void *s); +static int set_card_type(dev_link_t *link, const void *s); static int do_config(struct net_device *dev, struct ifmap *map); static int do_open(struct net_device *dev); static int do_ioctl(struct net_device *dev, struct ifreq *rq, int cmd); @@ -370,7 +370,7 @@ static int do_stop(struct net_device *dev); /*=============== Helper functions =========================*/ static int -first_tuple(struct pcmcia_device *handle, tuple_t *tuple, cisparse_t *parse) +first_tuple(client_handle_t handle, tuple_t *tuple, cisparse_t *parse) { int err; @@ -381,7 +381,7 @@ first_tuple(struct pcmcia_device *handle, tuple_t *tuple, cisparse_t *parse) } static int -next_tuple(struct pcmcia_device *handle, tuple_t *tuple, cisparse_t *parse) +next_tuple(client_handle_t handle, tuple_t *tuple, cisparse_t *parse) { int err; @@ -555,8 +555,9 @@ mii_wr(kio_addr_t ioaddr, u_char phyaddr, u_char phyreg, unsigned data, int len) */ static int -xirc2ps_probe(struct pcmcia_device *link) +xirc2ps_attach(struct pcmcia_device *p_dev) { + dev_link_t *link; struct net_device *dev; local_info_t *local; @@ -567,11 +568,12 @@ xirc2ps_probe(struct pcmcia_device *link) if (!dev) return -ENOMEM; local = netdev_priv(dev); - local->p_dev = link; + link = &local->link; link->priv = dev; /* General socket configuration */ link->conf.Attributes = CONF_ENABLE_IRQ; + link->conf.Vcc = 50; link->conf.IntType = INT_MEMORY_AND_IO; link->conf.ConfigIndex = 1; link->conf.Present = PRESENT_OPTION; @@ -594,7 +596,13 @@ xirc2ps_probe(struct pcmcia_device *link) INIT_WORK(&local->tx_timeout_task, xirc2ps_tx_timeout_task, dev); #endif - return xirc2ps_config(link); + link->handle = p_dev; + p_dev->instance = link; + + link->state |= DEV_PRESENT | DEV_CONFIG_PENDING; + xirc2ps_config(link); + + return 0; } /* xirc2ps_attach */ /**************** @@ -605,16 +613,18 @@ xirc2ps_probe(struct pcmcia_device *link) */ static void -xirc2ps_detach(struct pcmcia_device *link) +xirc2ps_detach(struct pcmcia_device *p_dev) { + dev_link_t *link = dev_to_instance(p_dev); struct net_device *dev = link->priv; DEBUG(0, "detach(0x%p)\n", link); - if (link->dev_node) + if (link->dev) unregister_netdev(dev); - xirc2ps_release(link); + if (link->state & DEV_CONFIG) + xirc2ps_release(link); free_netdev(dev); } /* xirc2ps_detach */ @@ -638,7 +648,7 @@ xirc2ps_detach(struct pcmcia_device *link) * */ static int -set_card_type(struct pcmcia_device *link, const void *s) +set_card_type(dev_link_t *link, const void *s) { struct net_device *dev = link->priv; local_info_t *local = netdev_priv(dev); @@ -707,8 +717,9 @@ set_card_type(struct pcmcia_device *link, const void *s) * Returns: true if this is a CE2 */ static int -has_ce2_string(struct pcmcia_device * link) +has_ce2_string(dev_link_t * link) { + client_handle_t handle = link->handle; tuple_t tuple; cisparse_t parse; u_char buf[256]; @@ -718,7 +729,7 @@ has_ce2_string(struct pcmcia_device * link) tuple.TupleDataMax = 254; tuple.TupleOffset = 0; tuple.DesiredTuple = CISTPL_VERS_1; - if (!first_tuple(link, &tuple, &parse) && parse.version_1.ns > 2) { + if (!first_tuple(handle, &tuple, &parse) && parse.version_1.ns > 2) { if (strstr(parse.version_1.str + parse.version_1.ofs[2], "CE2")) return 1; } @@ -730,9 +741,10 @@ has_ce2_string(struct pcmcia_device * link) * is received, to configure the PCMCIA socket, and to make the * ethernet device available to the system. */ -static int -xirc2ps_config(struct pcmcia_device * link) +static void +xirc2ps_config(dev_link_t * link) { + client_handle_t handle = link->handle; struct net_device *dev = link->priv; local_info_t *local = netdev_priv(dev); tuple_t tuple; @@ -758,7 +770,7 @@ xirc2ps_config(struct pcmcia_device * link) /* Is this a valid card */ tuple.DesiredTuple = CISTPL_MANFID; - if ((err=first_tuple(link, &tuple, &parse))) { + if ((err=first_tuple(handle, &tuple, &parse))) { printk(KNOT_XIRC "manfid not found in CIS\n"); goto failure; } @@ -794,15 +806,15 @@ xirc2ps_config(struct pcmcia_device * link) /* get configuration stuff */ tuple.DesiredTuple = CISTPL_CONFIG; - if ((err=first_tuple(link, &tuple, &parse))) + if ((err=first_tuple(handle, &tuple, &parse))) goto cis_error; link->conf.ConfigBase = parse.config.base; link->conf.Present = parse.config.rmask[0]; /* get the ethernet address from the CIS */ tuple.DesiredTuple = CISTPL_FUNCE; - for (err = first_tuple(link, &tuple, &parse); !err; - err = next_tuple(link, &tuple, &parse)) { + for (err = first_tuple(handle, &tuple, &parse); !err; + err = next_tuple(handle, &tuple, &parse)) { /* Once I saw two CISTPL_FUNCE_LAN_NODE_ID entries: * the first one with a length of zero the second correct - * so I skip all entries with length 0 */ @@ -812,8 +824,8 @@ xirc2ps_config(struct pcmcia_device * link) } if (err) { /* not found: try to get the node-id from tuple 0x89 */ tuple.DesiredTuple = 0x89; /* data layout looks like tuple 0x22 */ - if ((err = pcmcia_get_first_tuple(link, &tuple)) == 0 && - (err = pcmcia_get_tuple_data(link, &tuple)) == 0) { + if ((err = pcmcia_get_first_tuple(handle, &tuple)) == 0 && + (err = pcmcia_get_tuple_data(handle, &tuple)) == 0) { if (tuple.TupleDataLen == 8 && *buf == CISTPL_FUNCE_LAN_NODE_ID) memcpy(&parse, buf, 8); else @@ -822,8 +834,8 @@ xirc2ps_config(struct pcmcia_device * link) } if (err) { /* another try (James Lehmer's CE2 version 4.1)*/ tuple.DesiredTuple = CISTPL_FUNCE; - for (err = first_tuple(link, &tuple, &parse); !err; - err = next_tuple(link, &tuple, &parse)) { + for (err = first_tuple(handle, &tuple, &parse); !err; + err = next_tuple(handle, &tuple, &parse)) { if (parse.funce.type == 0x02 && parse.funce.data[0] == 1 && parse.funce.data[1] == 6 && tuple.TupleDataLen == 13) { buf[1] = 4; @@ -844,6 +856,9 @@ xirc2ps_config(struct pcmcia_device * link) for (i=0; i < 6; i++) dev->dev_addr[i] = node_id->id[i]; + /* Configure card */ + link->state |= DEV_CONFIG; + link->io.IOAddrLines =10; link->io.Attributes1 = IO_DATA_PATH_WIDTH_16; link->irq.Attributes = IRQ_HANDLE_PRESENT; @@ -863,14 +878,14 @@ xirc2ps_config(struct pcmcia_device * link) * Ethernet port */ link->io.NumPorts1 = 16; /* no Mako stuff anymore */ tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY; - for (err = first_tuple(link, &tuple, &parse); !err; - err = next_tuple(link, &tuple, &parse)) { + for (err = first_tuple(handle, &tuple, &parse); !err; + err = next_tuple(handle, &tuple, &parse)) { if (cf->io.nwin > 0 && (cf->io.win[0].base & 0xf) == 8) { for (ioaddr = 0x300; ioaddr < 0x400; ioaddr += 0x10) { link->conf.ConfigIndex = cf->index ; link->io.BasePort2 = cf->io.win[0].base; link->io.BasePort1 = ioaddr; - if (!(err=pcmcia_request_io(link, &link->io))) + if (!(err=pcmcia_request_io(link->handle, &link->io))) goto port_found; } } @@ -884,15 +899,15 @@ xirc2ps_config(struct pcmcia_device * link) */ for (pass=0; pass < 2; pass++) { tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY; - for (err = first_tuple(link, &tuple, &parse); !err; - err = next_tuple(link, &tuple, &parse)){ + for (err = first_tuple(handle, &tuple, &parse); !err; + err = next_tuple(handle, &tuple, &parse)){ if (cf->io.nwin > 0 && (cf->io.win[0].base & 0xf) == 8){ link->conf.ConfigIndex = cf->index ; link->io.BasePort2 = cf->io.win[0].base; link->io.BasePort1 = link->io.BasePort2 + (pass ? (cf->index & 0x20 ? -24:8) : (cf->index & 0x20 ? 8:-24)); - if (!(err=pcmcia_request_io(link, &link->io))) + if (!(err=pcmcia_request_io(link->handle, &link->io))) goto port_found; } } @@ -907,12 +922,12 @@ xirc2ps_config(struct pcmcia_device * link) link->io.NumPorts1 = 16; for (ioaddr = 0x300; ioaddr < 0x400; ioaddr += 0x10) { link->io.BasePort1 = ioaddr; - if (!(err=pcmcia_request_io(link, &link->io))) + if (!(err=pcmcia_request_io(link->handle, &link->io))) goto port_found; } link->io.BasePort1 = 0; /* let CS decide */ - if ((err=pcmcia_request_io(link, &link->io))) { - cs_error(link, RequestIO, err); + if ((err=pcmcia_request_io(link->handle, &link->io))) { + cs_error(link->handle, RequestIO, err); goto config_error; } } @@ -924,8 +939,8 @@ xirc2ps_config(struct pcmcia_device * link) * Now allocate an interrupt line. Note that this does not * actually assign a handler to the interrupt. */ - if ((err=pcmcia_request_irq(link, &link->irq))) { - cs_error(link, RequestIRQ, err); + if ((err=pcmcia_request_irq(link->handle, &link->irq))) { + cs_error(link->handle, RequestIRQ, err); goto config_error; } @@ -933,8 +948,8 @@ xirc2ps_config(struct pcmcia_device * link) * This actually configures the PCMCIA socket -- setting up * the I/O windows and the interrupt mapping. */ - if ((err=pcmcia_request_configuration(link, &link->conf))) { - cs_error(link, RequestConfiguration, err); + if ((err=pcmcia_request_configuration(link->handle, &link->conf))) { + cs_error(link->handle, RequestConfiguration, err); goto config_error; } @@ -951,15 +966,15 @@ xirc2ps_config(struct pcmcia_device * link) reg.Action = CS_WRITE; reg.Offset = CISREG_IOBASE_0; reg.Value = link->io.BasePort2 & 0xff; - if ((err = pcmcia_access_configuration_register(link, ®))) { - cs_error(link, AccessConfigurationRegister, err); + if ((err = pcmcia_access_configuration_register(link->handle, ®))) { + cs_error(link->handle, AccessConfigurationRegister, err); goto config_error; } reg.Action = CS_WRITE; reg.Offset = CISREG_IOBASE_1; reg.Value = (link->io.BasePort2 >> 8) & 0xff; - if ((err = pcmcia_access_configuration_register(link, ®))) { - cs_error(link, AccessConfigurationRegister, err); + if ((err = pcmcia_access_configuration_register(link->handle, ®))) { + cs_error(link->handle, AccessConfigurationRegister, err); goto config_error; } @@ -970,15 +985,15 @@ xirc2ps_config(struct pcmcia_device * link) req.Attributes = WIN_DATA_WIDTH_8|WIN_MEMORY_TYPE_AM|WIN_ENABLE; req.Base = req.Size = 0; req.AccessSpeed = 0; - if ((err = pcmcia_request_window(&link, &req, &link->win))) { - cs_error(link, RequestWindow, err); + if ((err = pcmcia_request_window(&link->handle, &req, &link->win))) { + cs_error(link->handle, RequestWindow, err); goto config_error; } local->dingo_ccr = ioremap(req.Base,0x1000) + 0x0800; mem.CardOffset = 0x0; mem.Page = 0; if ((err = pcmcia_map_mem_page(link->win, &mem))) { - cs_error(link, MapMemPage, err); + cs_error(link->handle, MapMemPage, err); goto config_error; } @@ -1038,12 +1053,13 @@ xirc2ps_config(struct pcmcia_device * link) if (local->dingo) do_reset(dev, 1); /* a kludge to make the cem56 work */ - link->dev_node = &local->node; - SET_NETDEV_DEV(dev, &handle_to_dev(link)); + link->dev = &local->node; + link->state &= ~DEV_CONFIG_PENDING; + SET_NETDEV_DEV(dev, &handle_to_dev(handle)); if ((err=register_netdev(dev))) { printk(KNOT_XIRC "register_netdev() failed\n"); - link->dev_node = NULL; + link->dev = NULL; goto config_error; } @@ -1056,16 +1072,17 @@ xirc2ps_config(struct pcmcia_device * link) printk("%c%02X", i?':':' ', dev->dev_addr[i]); printk("\n"); - return 0; + return; config_error: + link->state &= ~DEV_CONFIG_PENDING; xirc2ps_release(link); - return -ENODEV; + return; cis_error: printk(KNOT_XIRC "unable to parse CIS\n"); failure: - return -ENODEV; + link->state &= ~DEV_CONFIG_PENDING; } /* xirc2ps_config */ /**************** @@ -1074,41 +1091,57 @@ xirc2ps_config(struct pcmcia_device * link) * still open, this will be postponed until it is closed. */ static void -xirc2ps_release(struct pcmcia_device *link) +xirc2ps_release(dev_link_t *link) { - DEBUG(0, "release(0x%p)\n", link); - if (link->win) { - struct net_device *dev = link->priv; - local_info_t *local = netdev_priv(dev); - if (local->dingo) - iounmap(local->dingo_ccr - 0x0800); - } - pcmcia_disable_device(link); + DEBUG(0, "release(0x%p)\n", link); + + if (link->win) { + struct net_device *dev = link->priv; + local_info_t *local = netdev_priv(dev); + if (local->dingo) + iounmap(local->dingo_ccr - 0x0800); + pcmcia_release_window(link->win); + } + pcmcia_release_configuration(link->handle); + pcmcia_release_io(link->handle, &link->io); + pcmcia_release_irq(link->handle, &link->irq); + link->state &= ~DEV_CONFIG; + } /* xirc2ps_release */ /*====================================================================*/ -static int xirc2ps_suspend(struct pcmcia_device *link) +static int xirc2ps_suspend(struct pcmcia_device *p_dev) { + dev_link_t *link = dev_to_instance(p_dev); struct net_device *dev = link->priv; - if (link->open) { - netif_device_detach(dev); - do_powerdown(dev); + link->state |= DEV_SUSPEND; + if (link->state & DEV_CONFIG) { + if (link->open) { + netif_device_detach(dev); + do_powerdown(dev); + } + pcmcia_release_configuration(link->handle); } return 0; } -static int xirc2ps_resume(struct pcmcia_device *link) +static int xirc2ps_resume(struct pcmcia_device *p_dev) { + dev_link_t *link = dev_to_instance(p_dev); struct net_device *dev = link->priv; - if (link->open) { - do_reset(dev,1); - netif_device_attach(dev); + link->state &= ~DEV_SUSPEND; + if (link->state & DEV_CONFIG) { + pcmcia_request_configuration(link->handle, &link->conf); + if (link->open) { + do_reset(dev,1); + netif_device_attach(dev); + } } return 0; @@ -1369,7 +1402,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->len; + unsigned pktlen = skb? skb->len : 0; DEBUG(1, "do_start_xmit(skb=%p, dev=%p) len=%u\n", skb, dev, pktlen); @@ -1384,7 +1417,8 @@ do_start_xmit(struct sk_buff *skb, struct net_device *dev) */ if (pktlen < ETH_ZLEN) { - if (skb_padto(skb, ETH_ZLEN)) + skb = skb_padto(skb, ETH_ZLEN); + if (skb == NULL) return 0; pktlen = ETH_ZLEN; } @@ -1528,13 +1562,13 @@ static int do_open(struct net_device *dev) { local_info_t *lp = netdev_priv(dev); - struct pcmcia_device *link = lp->p_dev; + dev_link_t *link = &lp->link; DEBUG(0, "do_open(%p)\n", dev); /* Check that the PCMCIA card is still here. */ /* Physical device present signature. */ - if (!pcmcia_dev_present(link)) + if (!DEV_OK(link)) return -ENODEV; /* okay */ @@ -1858,7 +1892,7 @@ do_stop(struct net_device *dev) { kio_addr_t ioaddr = dev->base_addr; local_info_t *lp = netdev_priv(dev); - struct pcmcia_device *link = lp->p_dev; + dev_link_t *link = &lp->link; DEBUG(0, "do_stop(%p)\n", dev); @@ -1911,7 +1945,7 @@ static struct pcmcia_driver xirc2ps_cs_driver = { .drv = { .name = "xirc2ps_cs", }, - .probe = xirc2ps_probe, + .probe = xirc2ps_attach, .remove = xirc2ps_detach, .id_table = xirc2ps_ids, .suspend = xirc2ps_suspend, @@ -1949,7 +1983,7 @@ static int __init setup_xirc2ps_cs(char *str) MAYBE_SET(lockup_hack, 6); #undef MAYBE_SET - return 1; + return 0; } __setup("xirc2ps_cs=", setup_xirc2ps_cs); diff --git a/drivers/net/pcnet32.c b/drivers/net/pcnet32.c index d50bcb89d..8f6cf8c89 100644 --- a/drivers/net/pcnet32.c +++ b/drivers/net/pcnet32.c @@ -22,12 +22,12 @@ *************************************************************************/ #define DRV_NAME "pcnet32" -#define DRV_VERSION "1.32" -#define DRV_RELDATE "18.Mar.2006" +#define DRV_VERSION "1.31c" +#define DRV_RELDATE "01.Nov.2005" #define PFX DRV_NAME ": " -static const char *const version = - DRV_NAME ".c:v" DRV_VERSION " " DRV_RELDATE " tsbogend@alpha.franken.de\n"; +static const char *version = +DRV_NAME ".c:v" DRV_VERSION " " DRV_RELDATE " tsbogend@alpha.franken.de\n"; #include #include @@ -58,20 +58,18 @@ static const char *const version = * PCI device identifiers for "new style" Linux PCI Device Drivers */ static struct pci_device_id pcnet32_pci_tbl[] = { - { 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_DEVICE(PCI_VENDOR_ID_TRIDENT, PCI_DEVICE_ID_AMD_LANCE), - .class = (PCI_CLASS_NETWORK_ETHERNET << 8), .class_mask = 0xffff00, }, - - { } /* terminate list */ + { 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 }, + /* + * 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 }, + { 0, } }; -MODULE_DEVICE_TABLE(pci, pcnet32_pci_tbl); +MODULE_DEVICE_TABLE (pci, pcnet32_pci_tbl); static int cards_found; @@ -79,11 +77,13 @@ static int cards_found; * VLB I/O addresses */ static unsigned int pcnet32_portlist[] __initdata = - { 0x300, 0x320, 0x340, 0x360, 0 }; + { 0x300, 0x320, 0x340, 0x360, 0 }; + + static int pcnet32_debug = 0; -static int tx_start = 1; /* Mapping -- 0:20, 1:64, 2:128, 3:~220 (depends on chip vers) */ -static int pcnet32vlb; /* check for VLB cards ? */ +static int tx_start = 1; /* Mapping -- 0:20, 1:64, 2:128, 3:~220 (depends on chip vers) */ +static int pcnet32vlb; /* check for VLB cards ? */ static struct net_device *pcnet32_dev; @@ -109,35 +109,33 @@ static int rx_copybreak = 200; * table to translate option values from tulip * to internal options */ -static const unsigned char options_mapping[] = { - PCNET32_PORT_ASEL, /* 0 Auto-select */ - PCNET32_PORT_AUI, /* 1 BNC/AUI */ - PCNET32_PORT_AUI, /* 2 AUI/BNC */ - PCNET32_PORT_ASEL, /* 3 not supported */ - PCNET32_PORT_10BT | PCNET32_PORT_FD, /* 4 10baseT-FD */ - PCNET32_PORT_ASEL, /* 5 not supported */ - PCNET32_PORT_ASEL, /* 6 not supported */ - PCNET32_PORT_ASEL, /* 7 not supported */ - PCNET32_PORT_ASEL, /* 8 not supported */ - PCNET32_PORT_MII, /* 9 MII 10baseT */ - PCNET32_PORT_MII | PCNET32_PORT_FD, /* 10 MII 10baseT-FD */ - PCNET32_PORT_MII, /* 11 MII (autosel) */ - PCNET32_PORT_10BT, /* 12 10BaseT */ - PCNET32_PORT_MII | PCNET32_PORT_100, /* 13 MII 100BaseTx */ - /* 14 MII 100BaseTx-FD */ - PCNET32_PORT_MII | PCNET32_PORT_100 | PCNET32_PORT_FD, - PCNET32_PORT_ASEL /* 15 not supported */ +static unsigned char options_mapping[] = { + PCNET32_PORT_ASEL, /* 0 Auto-select */ + PCNET32_PORT_AUI, /* 1 BNC/AUI */ + PCNET32_PORT_AUI, /* 2 AUI/BNC */ + PCNET32_PORT_ASEL, /* 3 not supported */ + PCNET32_PORT_10BT | PCNET32_PORT_FD, /* 4 10baseT-FD */ + PCNET32_PORT_ASEL, /* 5 not supported */ + PCNET32_PORT_ASEL, /* 6 not supported */ + PCNET32_PORT_ASEL, /* 7 not supported */ + PCNET32_PORT_ASEL, /* 8 not supported */ + PCNET32_PORT_MII, /* 9 MII 10baseT */ + PCNET32_PORT_MII | PCNET32_PORT_FD, /* 10 MII 10baseT-FD */ + PCNET32_PORT_MII, /* 11 MII (autosel) */ + PCNET32_PORT_10BT, /* 12 10BaseT */ + PCNET32_PORT_MII | PCNET32_PORT_100, /* 13 MII 100BaseTx */ + PCNET32_PORT_MII | PCNET32_PORT_100 | PCNET32_PORT_FD, /* 14 MII 100BaseTx-FD */ + PCNET32_PORT_ASEL /* 15 not supported */ }; static const char pcnet32_gstrings_test[][ETH_GSTRING_LEN] = { - "Loopback test (offline)" + "Loopback test (offline)" }; - #define PCNET32_TEST_LEN (sizeof(pcnet32_gstrings_test) / ETH_GSTRING_LEN) -#define PCNET32_NUM_REGS 136 +#define PCNET32_NUM_REGS 168 -#define MAX_UNITS 8 /* More are supported, limit only on options */ +#define MAX_UNITS 8 /* More are supported, limit only on options */ static int options[MAX_UNITS]; static int full_duplex[MAX_UNITS]; static int homepna[MAX_UNITS]; @@ -152,6 +150,124 @@ static int homepna[MAX_UNITS]; * 16MB limitation and we don't need bounce buffers. */ +/* + * History: + * v0.01: Initial version + * only tested on Alpha Noname Board + * v0.02: changed IRQ handling for new interrupt scheme (dev_id) + * tested on a ASUS SP3G + * v0.10: fixed an odd problem with the 79C974 in a Compaq Deskpro XL + * looks like the 974 doesn't like stopping and restarting in a + * short period of time; now we do a reinit of the lance; the + * bug was triggered by doing ifconfig eth0 broadcast + * and hangs the machine (thanks to Klaus Liedl for debugging) + * v0.12: by suggestion from Donald Becker: Renamed driver to pcnet32, + * made it standalone (no need for lance.c) + * v0.13: added additional PCI detecting for special PCI devices (Compaq) + * v0.14: stripped down additional PCI probe (thanks to David C Niemi + * and sveneric@xs4all.nl for testing this on their Compaq boxes) + * v0.15: added 79C965 (VLB) probe + * added interrupt sharing for PCI chips + * v0.16: fixed set_multicast_list on Alpha machines + * v0.17: removed hack from dev.c; now pcnet32 uses ethif_probe in Space.c + * v0.19: changed setting of autoselect bit + * v0.20: removed additional Compaq PCI probe; there is now a working one + * in arch/i386/bios32.c + * v0.21: added endian conversion for ppc, from work by cort@cs.nmt.edu + * v0.22: added printing of status to ring dump + * v0.23: changed enet_statistics to net_devive_stats + * v0.90: added multicast filter + * added module support + * changed irq probe to new style + * added PCnetFast chip id + * added fix for receive stalls with Intel saturn chipsets + * added in-place rx skbs like in the tulip driver + * minor cleanups + * v0.91: added PCnetFast+ chip id + * back port to 2.0.x + * v1.00: added some stuff from Donald Becker's 2.0.34 version + * added support for byte counters in net_dev_stats + * v1.01: do ring dumps, only when debugging the driver + * increased the transmit timeout + * v1.02: fixed memory leak in pcnet32_init_ring() + * v1.10: workaround for stopped transmitter + * added port selection for modules + * detect special T1/E1 WAN card and setup port selection + * v1.11: fixed wrong checking of Tx errors + * v1.20: added check of return value kmalloc (cpeterso@cs.washington.edu) + * added save original kmalloc addr for freeing (mcr@solidum.com) + * added support for PCnetHome chip (joe@MIT.EDU) + * rewritten PCI card detection + * added dwio mode to get driver working on some PPC machines + * v1.21: added mii selection and mii ioctl + * v1.22: changed pci scanning code to make PPC people happy + * fixed switching to 32bit mode in pcnet32_open() (thanks + * to Michael Richard for noticing this one) + * added sub vendor/device id matching (thanks again to + * Michael Richard ) + * added chip id for 79c973/975 (thanks to Zach Brown ) + * v1.23 fixed small bug, when manual selecting MII speed/duplex + * v1.24 Applied Thomas' patch to use TxStartPoint and thus decrease TxFIFO + * underflows. Added tx_start_pt module parameter. Increased + * TX_RING_SIZE from 16 to 32. Added #ifdef'd code to use DXSUFLO + * for FAST[+] chipsets. + * v1.24ac Added SMP spinlocking - Alan Cox + * v1.25kf Added No Interrupt on successful Tx for some Tx's + * v1.26 Converted to pci_alloc_consistent, Jamey Hicks / George France + * + * - Fixed a few bugs, related to running the controller in 32bit mode. + * 23 Oct, 2000. Carsten Langgaard, carstenl@mips.com + * Copyright (C) 2000 MIPS Technologies, Inc. All rights reserved. + * v1.26p Fix oops on rmmod+insmod; plug i/o resource leak - Paul Gortmaker + * v1.27 improved CSR/PROM address detection, lots of cleanups, + * new pcnet32vlb module option, HP-PARISC support, + * added module parameter descriptions, + * initial ethtool support - Helge Deller + * v1.27a Sun Feb 10 2002 Go Taniguchi + * use alloc_etherdev and register_netdev + * fix pci probe not increment cards_found + * FD auto negotiate error workaround for xSeries250 + * clean up and using new mii module + * v1.27b Sep 30 2002 Kent Yoder + * Added timer for cable connection state changes. + * v1.28 20 Feb 2004 Don Fry + * Jon Mason , Chinmay Albal + * Now uses ethtool_ops, netif_msg_* and generic_mii_ioctl. + * Fixes bogus 'Bus master arbitration failure', pci_[un]map_single + * length errors, and transmit hangs. Cleans up after errors in open. + * Jim Lewis added ethernet loopback test. + * Thomas Munck Steenholdt non-mii ioctl corrections. + * v1.29 6 Apr 2004 Jim Lewis added physical + * identification code (blink led's) and register dump. + * Don Fry added timer for 971/972 so skbufs don't remain on tx ring + * forever. + * v1.30 18 May 2004 Don Fry removed timer and Last Transmit Interrupt + * (ltint) as they added complexity and didn't give good throughput. + * v1.30a 22 May 2004 Don Fry limit frames received during interrupt. + * v1.30b 24 May 2004 Don Fry fix bogus tx carrier errors with 79c973, + * assisted by Bruce Penrod . + * v1.30c 25 May 2004 Don Fry added netif_wake_queue after pcnet32_restart. + * v1.30d 01 Jun 2004 Don Fry discard oversize rx packets. + * v1.30e 11 Jun 2004 Don Fry recover after fifo error and rx hang. + * v1.30f 16 Jun 2004 Don Fry cleanup IRQ to allow 0 and 1 for PCI, + * expanding on suggestions from Ralf Baechle , + * and Brian Murphy . + * v1.30g 22 Jun 2004 Patrick Simmons added option + * homepna for selecting HomePNA mode for PCNet/Home 79C978. + * v1.30h 24 Jun 2004 Don Fry correctly select auto, speed, duplex in bcr32. + * v1.30i 28 Jun 2004 Don Fry change to use module_param. + * v1.30j 29 Apr 2005 Don Fry fix skb/map leak with loopback test. + * v1.31 02 Sep 2005 Hubert WS Lin added set_ringparam(). + * v1.31a 12 Sep 2005 Hubert WS Lin set min ring size to 4 + * to allow loopback test to work unchanged. + * v1.31b 06 Oct 2005 Don Fry changed alloc_ring to show name of device + * if allocation fails + * v1.31c 01 Nov 2005 Don Fry Allied Telesyn 2700/2701 FX are 100Mbit only. + * Force 100Mbit FD if Auto (ASEL) is selected. + * See Bugzilla 2669 and 4551. + */ + + /* * Set the number of Tx and Rx buffers, using Log_2(# buffers). * Reasonable default values are 4 Tx buffers, and 16 Rx buffers. @@ -185,63 +301,44 @@ 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; - s16 buf_length; - s16 status; - u32 msg_length; - u32 reserved; + u32 base; + s16 buf_length; + s16 status; + u32 msg_length; + u32 reserved; }; struct pcnet32_tx_head { - u32 base; - s16 length; - s16 status; - u32 misc; - u32 reserved; + u32 base; + s16 length; + s16 status; + u32 misc; + u32 reserved; }; /* The PCNET32 32-Bit initialization block, described in databook. */ struct pcnet32_init_block { - u16 mode; - u16 tlen_rlen; - u8 phys_addr[6]; - u16 reserved; - u32 filter[2]; - /* Receive and transmit ring base, along with extra bits. */ - u32 rx_ring; - u32 tx_ring; + u16 mode; + u16 tlen_rlen; + u8 phys_addr[6]; + u16 reserved; + u32 filter[2]; + /* Receive and transmit ring base, along with extra bits. */ + u32 rx_ring; + u32 tx_ring; }; /* PCnet32 access functions */ struct pcnet32_access { - u16 (*read_csr) (unsigned long, int); - void (*write_csr) (unsigned long, int, u16); - u16 (*read_bcr) (unsigned long, int); - void (*write_bcr) (unsigned long, int, u16); - u16 (*read_rap) (unsigned long); - void (*write_rap) (unsigned long, u16); - void (*reset) (unsigned long); + u16 (*read_csr)(unsigned long, int); + void (*write_csr)(unsigned long, int, u16); + u16 (*read_bcr)(unsigned long, int); + void (*write_bcr)(unsigned long, int, u16); + u16 (*read_rap)(unsigned long); + void (*write_rap)(unsigned long, u16); + void (*reset)(unsigned long); }; /* @@ -249,1042 +346,760 @@ struct pcnet32_access { * so the structure should be allocated using pci_alloc_consistent(). */ struct pcnet32_private { - struct pcnet32_init_block init_block; - /* The Tx and Rx ring entries must be aligned on 16-byte boundaries in 32bit mode. */ - struct pcnet32_rx_head *rx_ring; - struct pcnet32_tx_head *tx_ring; - dma_addr_t dma_addr;/* DMA address of beginning of this - object, returned by pci_alloc_consistent */ - struct pci_dev *pci_dev; - const char *name; - /* The saved address of a sent-in-place packet/buffer, for skfree(). */ - struct sk_buff **tx_skbuff; - struct sk_buff **rx_skbuff; - dma_addr_t *tx_dma_addr; - dma_addr_t *rx_dma_addr; - struct pcnet32_access a; - spinlock_t lock; /* Guard lock */ - unsigned int cur_rx, cur_tx; /* The next free ring entry */ - unsigned int rx_ring_size; /* current rx ring size */ - unsigned int tx_ring_size; /* current tx ring size */ - unsigned int rx_mod_mask; /* rx ring modular mask */ - unsigned int tx_mod_mask; /* tx ring modular mask */ - unsigned short rx_len_bits; - unsigned short tx_len_bits; - dma_addr_t rx_ring_dma_addr; - dma_addr_t tx_ring_dma_addr; - unsigned int dirty_rx, /* ring entries to be freed. */ - dirty_tx; - - struct net_device_stats stats; - char tx_full; - char phycount; /* number of phys found */ - int options; - unsigned int shared_irq:1, /* shared irq possible */ - dxsuflo:1, /* disable transmit stop on uflo */ - mii:1; /* mii port available */ - struct net_device *next; - struct mii_if_info mii_if; - struct timer_list watchdog_timer; - struct timer_list blink_timer; - u32 msg_enable; /* debug message level */ - - /* each bit indicates an available PHY */ - u32 phymask; - unsigned short chip_version; /* which variant this is */ + struct pcnet32_init_block init_block; + /* The Tx and Rx ring entries must be aligned on 16-byte boundaries in 32bit mode. */ + struct pcnet32_rx_head *rx_ring; + struct pcnet32_tx_head *tx_ring; + dma_addr_t dma_addr; /* DMA address of beginning of this + object, returned by + pci_alloc_consistent */ + struct pci_dev *pci_dev; /* Pointer to the associated pci device + structure */ + const char *name; + /* The saved address of a sent-in-place packet/buffer, for skfree(). */ + struct sk_buff **tx_skbuff; + struct sk_buff **rx_skbuff; + dma_addr_t *tx_dma_addr; + dma_addr_t *rx_dma_addr; + struct pcnet32_access a; + spinlock_t lock; /* Guard lock */ + unsigned int cur_rx, cur_tx; /* The next free ring entry */ + unsigned int rx_ring_size; /* current rx ring size */ + unsigned int tx_ring_size; /* current tx ring size */ + unsigned int rx_mod_mask; /* rx ring modular mask */ + unsigned int tx_mod_mask; /* tx ring modular mask */ + unsigned short rx_len_bits; + unsigned short tx_len_bits; + dma_addr_t rx_ring_dma_addr; + dma_addr_t tx_ring_dma_addr; + unsigned int dirty_rx, dirty_tx; /* The ring entries to be free()ed. */ + struct net_device_stats stats; + char tx_full; + int options; + unsigned int shared_irq:1, /* shared irq possible */ + dxsuflo:1, /* disable transmit stop on uflo */ + mii:1; /* mii port available */ + struct net_device *next; + struct mii_if_info mii_if; + struct timer_list watchdog_timer; + struct timer_list blink_timer; + u32 msg_enable; /* debug message level */ }; -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 *); -static int pcnet32_init_ring(struct net_device *); -static int pcnet32_start_xmit(struct sk_buff *, struct net_device *); -static int pcnet32_rx(struct net_device *); -static void pcnet32_tx_timeout(struct net_device *dev); +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 *); +static int pcnet32_init_ring(struct net_device *); +static int pcnet32_start_xmit(struct sk_buff *, struct net_device *); +static int pcnet32_rx(struct net_device *); +static void pcnet32_tx_timeout (struct net_device *dev); static irqreturn_t pcnet32_interrupt(int, void *, struct pt_regs *); -static int pcnet32_close(struct net_device *); +static int pcnet32_close(struct net_device *); static struct net_device_stats *pcnet32_get_stats(struct net_device *); static void pcnet32_load_multicast(struct net_device *dev); static void pcnet32_set_multicast_list(struct net_device *); -static int pcnet32_ioctl(struct net_device *, struct ifreq *, int); +static int pcnet32_ioctl(struct net_device *, struct ifreq *, int); static void pcnet32_watchdog(struct net_device *); static int mdio_read(struct net_device *dev, int phy_id, int reg_num); -static void mdio_write(struct net_device *dev, int phy_id, int reg_num, - int val); +static void mdio_write(struct net_device *dev, int phy_id, int reg_num, int val); static void pcnet32_restart(struct net_device *dev, unsigned int csr0_bits); static void pcnet32_ethtool_test(struct net_device *dev, - struct ethtool_test *eth_test, u64 * data); -static int pcnet32_loopback_test(struct net_device *dev, uint64_t * data1); + struct ethtool_test *eth_test, u64 *data); +static int pcnet32_loopback_test(struct net_device *dev, uint64_t *data1); static int pcnet32_phys_id(struct net_device *dev, u32 data); static void pcnet32_led_blink_callback(struct net_device *dev); static int pcnet32_get_regs_len(struct net_device *dev); static void pcnet32_get_regs(struct net_device *dev, struct ethtool_regs *regs, - void *ptr); + void *ptr); static void pcnet32_purge_tx_ring(struct net_device *dev); 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); -static u16 pcnet32_wio_read_csr(unsigned long addr, int index) + +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); - return inw(addr + PCNET32_WIO_RDP); + outw (index, addr+PCNET32_WIO_RAP); + return inw (addr+PCNET32_WIO_RDP); } -static void pcnet32_wio_write_csr(unsigned long addr, int index, u16 val) +static void pcnet32_wio_write_csr (unsigned long addr, int index, u16 val) { - outw(index, addr + PCNET32_WIO_RAP); - outw(val, addr + PCNET32_WIO_RDP); + outw (index, addr+PCNET32_WIO_RAP); + outw (val, addr+PCNET32_WIO_RDP); } -static u16 pcnet32_wio_read_bcr(unsigned long addr, int index) +static u16 pcnet32_wio_read_bcr (unsigned long addr, int index) { - outw(index, addr + PCNET32_WIO_RAP); - return inw(addr + PCNET32_WIO_BDP); + outw (index, addr+PCNET32_WIO_RAP); + return inw (addr+PCNET32_WIO_BDP); } -static void pcnet32_wio_write_bcr(unsigned long addr, int index, u16 val) +static void pcnet32_wio_write_bcr (unsigned long addr, int index, u16 val) { - outw(index, addr + PCNET32_WIO_RAP); - outw(val, addr + PCNET32_WIO_BDP); + outw (index, addr+PCNET32_WIO_RAP); + outw (val, addr+PCNET32_WIO_BDP); } -static u16 pcnet32_wio_read_rap(unsigned long addr) +static u16 pcnet32_wio_read_rap (unsigned long addr) { - return inw(addr + PCNET32_WIO_RAP); + return inw (addr+PCNET32_WIO_RAP); } -static void pcnet32_wio_write_rap(unsigned long addr, u16 val) +static void pcnet32_wio_write_rap (unsigned long addr, u16 val) { - outw(val, addr + PCNET32_WIO_RAP); + outw (val, addr+PCNET32_WIO_RAP); } -static void pcnet32_wio_reset(unsigned long addr) +static void pcnet32_wio_reset (unsigned long addr) { - inw(addr + PCNET32_WIO_RESET); + inw (addr+PCNET32_WIO_RESET); } -static int pcnet32_wio_check(unsigned long addr) +static int pcnet32_wio_check (unsigned long addr) { - outw(88, addr + PCNET32_WIO_RAP); - return (inw(addr + PCNET32_WIO_RAP) == 88); + outw (88, addr+PCNET32_WIO_RAP); + return (inw (addr+PCNET32_WIO_RAP) == 88); } static struct pcnet32_access pcnet32_wio = { - .read_csr = pcnet32_wio_read_csr, - .write_csr = pcnet32_wio_write_csr, - .read_bcr = pcnet32_wio_read_bcr, - .write_bcr = pcnet32_wio_write_bcr, - .read_rap = pcnet32_wio_read_rap, - .write_rap = pcnet32_wio_write_rap, - .reset = pcnet32_wio_reset + .read_csr = pcnet32_wio_read_csr, + .write_csr = pcnet32_wio_write_csr, + .read_bcr = pcnet32_wio_read_bcr, + .write_bcr = pcnet32_wio_write_bcr, + .read_rap = pcnet32_wio_read_rap, + .write_rap = pcnet32_wio_write_rap, + .reset = pcnet32_wio_reset }; -static u16 pcnet32_dwio_read_csr(unsigned long addr, int index) +static u16 pcnet32_dwio_read_csr (unsigned long addr, int index) { - outl(index, addr + PCNET32_DWIO_RAP); - return (inl(addr + PCNET32_DWIO_RDP) & 0xffff); + outl (index, addr+PCNET32_DWIO_RAP); + return (inl (addr+PCNET32_DWIO_RDP) & 0xffff); } -static void pcnet32_dwio_write_csr(unsigned long addr, int index, u16 val) +static void pcnet32_dwio_write_csr (unsigned long addr, int index, u16 val) { - outl(index, addr + PCNET32_DWIO_RAP); - outl(val, addr + PCNET32_DWIO_RDP); + outl (index, addr+PCNET32_DWIO_RAP); + outl (val, addr+PCNET32_DWIO_RDP); } -static u16 pcnet32_dwio_read_bcr(unsigned long addr, int index) +static u16 pcnet32_dwio_read_bcr (unsigned long addr, int index) { - outl(index, addr + PCNET32_DWIO_RAP); - return (inl(addr + PCNET32_DWIO_BDP) & 0xffff); + outl (index, addr+PCNET32_DWIO_RAP); + return (inl (addr+PCNET32_DWIO_BDP) & 0xffff); } -static void pcnet32_dwio_write_bcr(unsigned long addr, int index, u16 val) +static void pcnet32_dwio_write_bcr (unsigned long addr, int index, u16 val) { - outl(index, addr + PCNET32_DWIO_RAP); - outl(val, addr + PCNET32_DWIO_BDP); + outl (index, addr+PCNET32_DWIO_RAP); + outl (val, addr+PCNET32_DWIO_BDP); } -static u16 pcnet32_dwio_read_rap(unsigned long addr) +static u16 pcnet32_dwio_read_rap (unsigned long addr) { - return (inl(addr + PCNET32_DWIO_RAP) & 0xffff); + return (inl (addr+PCNET32_DWIO_RAP) & 0xffff); } -static void pcnet32_dwio_write_rap(unsigned long addr, u16 val) +static void pcnet32_dwio_write_rap (unsigned long addr, u16 val) { - outl(val, addr + PCNET32_DWIO_RAP); + outl (val, addr+PCNET32_DWIO_RAP); } -static void pcnet32_dwio_reset(unsigned long addr) +static void pcnet32_dwio_reset (unsigned long addr) { - inl(addr + PCNET32_DWIO_RESET); + inl (addr+PCNET32_DWIO_RESET); } -static int pcnet32_dwio_check(unsigned long addr) +static int pcnet32_dwio_check (unsigned long addr) { - outl(88, addr + PCNET32_DWIO_RAP); - return ((inl(addr + PCNET32_DWIO_RAP) & 0xffff) == 88); + outl (88, addr+PCNET32_DWIO_RAP); + return ((inl (addr+PCNET32_DWIO_RAP) & 0xffff) == 88); } static struct pcnet32_access pcnet32_dwio = { - .read_csr = pcnet32_dwio_read_csr, - .write_csr = pcnet32_dwio_write_csr, - .read_bcr = pcnet32_dwio_read_bcr, - .write_bcr = pcnet32_dwio_write_bcr, - .read_rap = pcnet32_dwio_read_rap, - .write_rap = pcnet32_dwio_write_rap, - .reset = pcnet32_dwio_reset + .read_csr = pcnet32_dwio_read_csr, + .write_csr = pcnet32_dwio_write_csr, + .read_bcr = pcnet32_dwio_read_bcr, + .write_bcr = pcnet32_dwio_write_bcr, + .read_rap = pcnet32_dwio_read_rap, + .write_rap = pcnet32_dwio_write_rap, + .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) { - disable_irq(dev->irq); - pcnet32_interrupt(0, dev, NULL); - enable_irq(dev->irq); + disable_irq(dev->irq); + pcnet32_interrupt(0, dev, NULL); + enable_irq(dev->irq); } #endif + static int pcnet32_get_settings(struct net_device *dev, struct ethtool_cmd *cmd) { - struct pcnet32_private *lp = dev->priv; - unsigned long flags; - int r = -EOPNOTSUPP; - - if (lp->mii) { - spin_lock_irqsave(&lp->lock, flags); - mii_ethtool_gset(&lp->mii_if, cmd); - spin_unlock_irqrestore(&lp->lock, flags); - r = 0; - } - return r; + struct pcnet32_private *lp = dev->priv; + unsigned long flags; + int r = -EOPNOTSUPP; + + if (lp->mii) { + spin_lock_irqsave(&lp->lock, flags); + mii_ethtool_gset(&lp->mii_if, cmd); + spin_unlock_irqrestore(&lp->lock, flags); + r = 0; + } + return r; } static int pcnet32_set_settings(struct net_device *dev, struct ethtool_cmd *cmd) { - struct pcnet32_private *lp = dev->priv; - unsigned long flags; - int r = -EOPNOTSUPP; + struct pcnet32_private *lp = dev->priv; + unsigned long flags; + int r = -EOPNOTSUPP; - if (lp->mii) { - spin_lock_irqsave(&lp->lock, flags); - r = mii_ethtool_sset(&lp->mii_if, cmd); - spin_unlock_irqrestore(&lp->lock, flags); - } - return r; + if (lp->mii) { + spin_lock_irqsave(&lp->lock, flags); + r = mii_ethtool_sset(&lp->mii_if, cmd); + spin_unlock_irqrestore(&lp->lock, flags); + } + return r; } -static void pcnet32_get_drvinfo(struct net_device *dev, - struct ethtool_drvinfo *info) +static void pcnet32_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info) { - struct pcnet32_private *lp = dev->priv; + struct pcnet32_private *lp = dev->priv; - strcpy(info->driver, DRV_NAME); - strcpy(info->version, DRV_VERSION); - if (lp->pci_dev) - strcpy(info->bus_info, pci_name(lp->pci_dev)); - else - sprintf(info->bus_info, "VLB 0x%lx", dev->base_addr); + strcpy (info->driver, DRV_NAME); + strcpy (info->version, DRV_VERSION); + if (lp->pci_dev) + strcpy (info->bus_info, pci_name(lp->pci_dev)); + else + sprintf(info->bus_info, "VLB 0x%lx", dev->base_addr); } static u32 pcnet32_get_link(struct net_device *dev) { - struct pcnet32_private *lp = dev->priv; - unsigned long flags; - int r; + struct pcnet32_private *lp = dev->priv; + unsigned long flags; + int r; - spin_lock_irqsave(&lp->lock, flags); - if (lp->mii) { - r = mii_link_ok(&lp->mii_if); - } 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); + spin_lock_irqsave(&lp->lock, flags); + if (lp->mii) { + r = mii_link_ok(&lp->mii_if); + } else { + ulong ioaddr = dev->base_addr; /* card base I/O address */ + r = (lp->a.read_bcr(ioaddr, 4) != 0xc0); + } + spin_unlock_irqrestore(&lp->lock, flags); - return r; + return r; } static u32 pcnet32_get_msglevel(struct net_device *dev) { - struct pcnet32_private *lp = dev->priv; - return lp->msg_enable; + struct pcnet32_private *lp = dev->priv; + return lp->msg_enable; } static void pcnet32_set_msglevel(struct net_device *dev, u32 value) { - struct pcnet32_private *lp = dev->priv; - lp->msg_enable = value; + struct pcnet32_private *lp = dev->priv; + lp->msg_enable = value; } static int pcnet32_nway_reset(struct net_device *dev) { - struct pcnet32_private *lp = dev->priv; - unsigned long flags; - int r = -EOPNOTSUPP; + struct pcnet32_private *lp = dev->priv; + unsigned long flags; + int r = -EOPNOTSUPP; - if (lp->mii) { - spin_lock_irqsave(&lp->lock, flags); - r = mii_nway_restart(&lp->mii_if); - spin_unlock_irqrestore(&lp->lock, flags); - } - return r; + if (lp->mii) { + spin_lock_irqsave(&lp->lock, flags); + r = mii_nway_restart(&lp->mii_if); + spin_unlock_irqrestore(&lp->lock, flags); + } + return r; } -static void pcnet32_get_ringparam(struct net_device *dev, - struct ethtool_ringparam *ering) +static void pcnet32_get_ringparam(struct net_device *dev, struct ethtool_ringparam *ering) { - struct pcnet32_private *lp = dev->priv; + struct pcnet32_private *lp = dev->priv; - 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; + 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; } -static int pcnet32_set_ringparam(struct net_device *dev, - struct ethtool_ringparam *ering) +static int pcnet32_set_ringparam(struct net_device *dev, struct ethtool_ringparam *ering) { - struct pcnet32_private *lp = dev->priv; - unsigned long flags; - unsigned int size; - ulong ioaddr = dev->base_addr; - int i; + struct pcnet32_private *lp = dev->priv; + unsigned long flags; + int i; - if (ering->rx_mini_pending || ering->rx_jumbo_pending) - return -EINVAL; + if (ering->rx_mini_pending || ering->rx_jumbo_pending) + return -EINVAL; - if (netif_running(dev)) - pcnet32_netif_stop(dev); + if (netif_running(dev)) + pcnet32_close(dev); - spin_lock_irqsave(&lp->lock, flags); - lp->a.write_csr(ioaddr, CSR0, CSR0_STOP); /* stop the chip */ + 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); - 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)) + break; + } + lp->tx_ring_size = (1 << i); + lp->tx_mod_mask = lp->tx_ring_size - 1; + lp->tx_len_bits = (i << 12); - /* 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 (size <= (1 << i)) - break; - } - 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 (size <= (1 << i)) - break; - } - if ((1 << i) != lp->rx_ring_size) - pcnet32_realloc_rx_ring(dev, lp, i); - - dev->weight = lp->rx_ring_size / 2; - - if (netif_running(dev)) { - pcnet32_netif_start(dev); - pcnet32_restart(dev, CSR0_NORMAL); - } + for (i = 2; i <= PCNET32_LOG_MAX_RX_BUFFERS; i++) { + if (lp->rx_ring_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 (pcnet32_alloc_ring(dev, dev->name)) { + pcnet32_free_ring(dev); spin_unlock_irqrestore(&lp->lock, flags); + return -ENOMEM; + } - 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); + spin_unlock_irqrestore(&lp->lock, flags); - return 0; + if (pcnet32_debug & NETIF_MSG_DRV) + printk(KERN_INFO PFX "%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; } -static void pcnet32_get_strings(struct net_device *dev, u32 stringset, - u8 * data) +static void pcnet32_get_strings(struct net_device *dev, u32 stringset, u8 *data) { - memcpy(data, pcnet32_gstrings_test, sizeof(pcnet32_gstrings_test)); + memcpy(data, pcnet32_gstrings_test, sizeof(pcnet32_gstrings_test)); } static int pcnet32_self_test_count(struct net_device *dev) { - return PCNET32_TEST_LEN; + return PCNET32_TEST_LEN; } static void pcnet32_ethtool_test(struct net_device *dev, - struct ethtool_test *test, u64 * data) -{ - struct pcnet32_private *lp = dev->priv; - int rc; - - if (test->flags == ETH_TEST_FL_OFFLINE) { - rc = pcnet32_loopback_test(dev, data); - if (rc) { - if (netif_msg_hw(lp)) - printk(KERN_DEBUG "%s: Loopback test failed.\n", - dev->name); - test->flags |= ETH_TEST_FL_FAILED; - } else if (netif_msg_hw(lp)) - printk(KERN_DEBUG "%s: Loopback test passed.\n", - dev->name); - } else if (netif_msg_hw(lp)) - printk(KERN_DEBUG - "%s: No tests to run (specify 'Offline' on ethtool).", - dev->name); -} /* end pcnet32_ethtool_test */ - -static int pcnet32_loopback_test(struct net_device *dev, uint64_t * data1) + struct ethtool_test *test, u64 *data) { - struct pcnet32_private *lp = dev->priv; - struct pcnet32_access *a = &lp->a; /* access to registers */ - ulong ioaddr = dev->base_addr; /* card base I/O address */ - struct sk_buff *skb; /* sk buff */ - int x, i; /* counters */ - int numbuffs = 4; /* number of TX/RX buffers and descs */ - u16 status = 0x8300; /* TX ring status */ - u16 teststatus; /* test of ring status */ - int rc; /* return code */ - int size; /* size of packets */ - unsigned char *packet; /* source packet data */ - static const int data_len = 60; /* length of source packets */ - unsigned long flags; - unsigned long ticks; - - 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); - - /* purge & init rings but don't actually restart */ - pcnet32_restart(dev, 0x0000); - - lp->a.write_csr(ioaddr, CSR0, CSR0_STOP); /* Set STOP bit */ - - /* Initialize Transmit buffers. */ - size = data_len + 15; - for (x = 0; x < numbuffs; x++) { - if (!(skb = dev_alloc_skb(size))) { - if (netif_msg_hw(lp)) - printk(KERN_DEBUG - "%s: Cannot allocate skb at line: %d!\n", - dev->name, __LINE__); - goto clean_up; - } else { - packet = skb->data; - skb_put(skb, size); /* create space for data */ - lp->tx_skbuff[x] = skb; - lp->tx_ring[x].length = le16_to_cpu(-skb->len); - lp->tx_ring[x].misc = 0; - - /* put DA and SA into the skb */ - for (i = 0; i < 6; i++) - *packet++ = dev->dev_addr[i]; - for (i = 0; i < 6; i++) - *packet++ = dev->dev_addr[i]; - /* type */ - *packet++ = 0x08; - *packet++ = 0x06; - /* packet number */ - *packet++ = x; - /* fill packet with data */ - for (i = 0; i < data_len; i++) - *packet++ = i; - - lp->tx_dma_addr[x] = - pci_map_single(lp->pci_dev, skb->data, skb->len, - PCI_DMA_TODEVICE); - lp->tx_ring[x].base = - (u32) le32_to_cpu(lp->tx_dma_addr[x]); - wmb(); /* Make sure owner changes after all others are visible */ - lp->tx_ring[x].status = le16_to_cpu(status); - } - } - - x = a->read_bcr(ioaddr, 32); /* set internal loopback in BCR32 */ - a->write_bcr(ioaddr, 32, x | 0x0002); - - /* 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, CSR0, CSR0_START); /* Set STRT bit */ - - /* Check status of descriptors */ - for (x = 0; x < numbuffs; x++) { - ticks = 0; - rmb(); - while ((lp->rx_ring[x].status & teststatus) && (ticks < 200)) { - spin_unlock_irqrestore(&lp->lock, flags); - msleep(1); - spin_lock_irqsave(&lp->lock, flags); - rmb(); - ticks++; - } - if (ticks == 200) { - if (netif_msg_hw(lp)) - printk("%s: Desc %d failed to reset!\n", - dev->name, x); - break; - } - } - - 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); - - for (x = 0; x < numbuffs; x++) { - printk(KERN_DEBUG "%s: Packet %d:\n", dev->name, x); - skb = lp->rx_skbuff[x]; - for (i = 0; i < size; i++) { - printk("%02x ", *(skb->data + i)); - } - printk("\n"); - } - } + struct pcnet32_private *lp = dev->priv; + int rc; - x = 0; - rc = 0; - while (x < numbuffs && !rc) { - skb = lp->rx_skbuff[x]; - packet = lp->tx_skbuff[x]->data; - for (i = 0; i < size; i++) { - if (*(skb->data + i) != packet[i]) { - if (netif_msg_hw(lp)) - printk(KERN_DEBUG - "%s: Error in compare! %2x - %02x %02x\n", - dev->name, i, *(skb->data + i), - packet[i]); - rc = 1; - break; - } - } - x++; + if (test->flags == ETH_TEST_FL_OFFLINE) { + rc = pcnet32_loopback_test(dev, data); + if (rc) { + if (netif_msg_hw(lp)) + printk(KERN_DEBUG "%s: Loopback test failed.\n", dev->name); + test->flags |= ETH_TEST_FL_FAILED; + } else if (netif_msg_hw(lp)) + printk(KERN_DEBUG "%s: Loopback test passed.\n", dev->name); + } else if (netif_msg_hw(lp)) + printk(KERN_DEBUG "%s: No tests to run (specify 'Offline' on ethtool).", dev->name); +} /* end pcnet32_ethtool_test */ + +static int pcnet32_loopback_test(struct net_device *dev, uint64_t *data1) +{ + struct pcnet32_private *lp = dev->priv; + struct pcnet32_access *a = &lp->a; /* access to registers */ + ulong ioaddr = dev->base_addr; /* card base I/O address */ + struct sk_buff *skb; /* sk buff */ + int x, i; /* counters */ + int numbuffs = 4; /* number of TX/RX buffers and descs */ + u16 status = 0x8300; /* TX ring status */ + u16 teststatus; /* test of ring status */ + int rc; /* return code */ + int size; /* size of packets */ + unsigned char *packet; /* source packet data */ + static int data_len = 60; /* length of source packets */ + 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); + + /* Reset the PCNET32 */ + lp->a.reset (ioaddr); + + /* 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 */ + + /* Initialize Transmit buffers. */ + size = data_len + 15; + for (x=0; xname, __LINE__); + goto clean_up; + } else { + packet = skb->data; + skb_put(skb, size); /* create space for data */ + lp->tx_skbuff[x] = skb; + lp->tx_ring[x].length = le16_to_cpu(-skb->len); + lp->tx_ring[x].misc = 0; + + /* put DA and SA into the skb */ + for (i=0; i<6; i++) + *packet++ = dev->dev_addr[i]; + for (i=0; i<6; i++) + *packet++ = dev->dev_addr[i]; + /* type */ + *packet++ = 0x08; + *packet++ = 0x06; + /* packet number */ + *packet++ = x; + /* fill packet with data */ + for (i=0; itx_dma_addr[x] = pci_map_single(lp->pci_dev, skb->data, + skb->len, PCI_DMA_TODEVICE); + lp->tx_ring[x].base = (u32)le32_to_cpu(lp->tx_dma_addr[x]); + wmb(); /* Make sure owner changes after all others are visible */ + lp->tx_ring[x].status = le16_to_cpu(status); + } + } + + x = a->read_bcr(ioaddr, 32); /* set internal loopback in BSR32 */ + x = x | 0x0002; + a->write_bcr(ioaddr, 32, x); + + lp->a.write_csr (ioaddr, 15, 0x0044); /* set int loopback in CSR15 */ + + teststatus = le16_to_cpu(0x8000); + lp->a.write_csr(ioaddr, 0, 0x0002); /* Set STRT bit */ + + /* Check status of descriptors */ + for (x=0; xrx_ring[x].status & teststatus) && (ticks < 200)) { + spin_unlock_irqrestore(&lp->lock, flags); + mdelay(1); + spin_lock_irqsave(&lp->lock, flags); + rmb(); + ticks++; + } + if (ticks == 200) { + if (netif_msg_hw(lp)) + printk("%s: Desc %d failed to reset!\n",dev->name,x); + break; + } + } + + lp->a.write_csr(ioaddr, 0, 0x0004); /* Set STOP bit */ + wmb(); + if (netif_msg_hw(lp) && netif_msg_pktdata(lp)) { + printk(KERN_DEBUG "%s: RX loopback packets:\n", dev->name); + + for (x=0; xname, x); + skb = lp->rx_skbuff[x]; + for (i=0; idata+i)); + } + printk("\n"); + } + } + + x = 0; + rc = 0; + while (xrx_skbuff[x]; + packet = lp->tx_skbuff[x]->data; + for (i=0; idata+i) != packet[i]) { + if (netif_msg_hw(lp)) + printk(KERN_DEBUG "%s: Error in compare! %2x - %02x %02x\n", + dev->name, i, *(skb->data+i), packet[i]); + rc = 1; + break; + } } + x++; + } + if (!rc) { + *data1 = 0; + } - clean_up: - *data1 = rc; - pcnet32_purge_tx_ring(dev); +clean_up: + pcnet32_purge_tx_ring(dev); + x = a->read_csr(ioaddr, 15) & 0xFFFF; + a->write_csr(ioaddr, 15, (x & ~0x0044)); /* reset bits 6 and 2 */ - x = a->read_csr(ioaddr, CSR15); - a->write_csr(ioaddr, CSR15, (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_bcr(ioaddr, 32); /* reset internal loopback */ - a->write_bcr(ioaddr, 32, (x & ~0x0002)); + spin_unlock_irqrestore(&lp->lock, flags); - 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); - } + if (netif_running(dev)) { + pcnet32_open(dev); + } else { + lp->a.write_bcr (ioaddr, 20, 4); /* return to 16bit mode */ + } - return (rc); -} /* end pcnet32_loopback_test */ + return(rc); +} /* end pcnet32_loopback_test */ static void pcnet32_led_blink_callback(struct net_device *dev) { - struct pcnet32_private *lp = dev->priv; - struct pcnet32_access *a = &lp->a; - ulong ioaddr = dev->base_addr; - unsigned long flags; - int i; + struct pcnet32_private *lp = dev->priv; + struct pcnet32_access *a = &lp->a; + ulong ioaddr = dev->base_addr; + unsigned long flags; + int i; - spin_lock_irqsave(&lp->lock, flags); - for (i = 4; i < 8; i++) { - a->write_bcr(ioaddr, i, a->read_bcr(ioaddr, i) ^ 0x4000); - } - spin_unlock_irqrestore(&lp->lock, flags); + spin_lock_irqsave(&lp->lock, flags); + for (i=4; i<8; i++) { + a->write_bcr(ioaddr, i, a->read_bcr(ioaddr, i) ^ 0x4000); + } + spin_unlock_irqrestore(&lp->lock, flags); - mod_timer(&lp->blink_timer, PCNET32_BLINK_TIMEOUT); + mod_timer(&lp->blink_timer, PCNET32_BLINK_TIMEOUT); } static int pcnet32_phys_id(struct net_device *dev, u32 data) { - struct pcnet32_private *lp = dev->priv; - struct pcnet32_access *a = &lp->a; - ulong ioaddr = dev->base_addr; - unsigned long flags; - int i, regs[4]; - - if (!lp->blink_timer.function) { - init_timer(&lp->blink_timer); - lp->blink_timer.function = (void *)pcnet32_led_blink_callback; - lp->blink_timer.data = (unsigned long)dev; - } - - /* Save the current value of the bcrs */ - spin_lock_irqsave(&lp->lock, flags); - for (i = 4; i < 8; i++) { - regs[i - 4] = a->read_bcr(ioaddr, i); - } - spin_unlock_irqrestore(&lp->lock, flags); - - mod_timer(&lp->blink_timer, jiffies); - set_current_state(TASK_INTERRUPTIBLE); - - if ((!data) || (data > (u32) (MAX_SCHEDULE_TIMEOUT / HZ))) - data = (u32) (MAX_SCHEDULE_TIMEOUT / HZ); + struct pcnet32_private *lp = dev->priv; + struct pcnet32_access *a = &lp->a; + ulong ioaddr = dev->base_addr; + unsigned long flags; + int i, regs[4]; - msleep_interruptible(data * 1000); - del_timer_sync(&lp->blink_timer); + if (!lp->blink_timer.function) { + init_timer(&lp->blink_timer); + lp->blink_timer.function = (void *) pcnet32_led_blink_callback; + lp->blink_timer.data = (unsigned long) dev; + } - /* Restore the original value of the bcrs */ - spin_lock_irqsave(&lp->lock, flags); - for (i = 4; i < 8; i++) { - a->write_bcr(ioaddr, i, regs[i - 4]); - } - spin_unlock_irqrestore(&lp->lock, flags); + /* Save the current value of the bcrs */ + spin_lock_irqsave(&lp->lock, flags); + for (i=4; i<8; i++) { + regs[i-4] = a->read_bcr(ioaddr, i); + } + spin_unlock_irqrestore(&lp->lock, flags); - return 0; -} + mod_timer(&lp->blink_timer, jiffies); + set_current_state(TASK_INTERRUPTIBLE); -/* - * 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; + if ((!data) || (data > (u32)(MAX_SCHEDULE_TIMEOUT / HZ))) + data = (u32)(MAX_SCHEDULE_TIMEOUT / HZ); - /* really old chips have to be stopped. */ - if (lp->chip_version < PCNET32_79C970A) - return 0; + msleep_interruptible(data * 1000); + del_timer_sync(&lp->blink_timer); - /* set SUSPEND (SPND) - CSR5 bit 0 */ - csr5 = a->read_csr(ioaddr, CSR5); - a->write_csr(ioaddr, CSR5, csr5 | CSR5_SUSPEND); + /* Restore the original value of the bcrs */ + spin_lock_irqsave(&lp->lock, flags); + for (i=4; i<8; i++) { + a->write_bcr(ioaddr, i, regs[i-4]); + } + spin_unlock_irqrestore(&lp->lock, flags); - /* 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; + return 0; } -#define PCNET32_REGS_PER_PHY 32 -#define PCNET32_MAX_PHYS 32 static int pcnet32_get_regs_len(struct net_device *dev) { - struct pcnet32_private *lp = dev->priv; - int j = lp->phycount * PCNET32_REGS_PER_PHY; - - return ((PCNET32_NUM_REGS + j) * sizeof(u16)); + return(PCNET32_NUM_REGS * sizeof(u16)); } static void pcnet32_get_regs(struct net_device *dev, struct ethtool_regs *regs, - void *ptr) + void *ptr) { - int i, csr0; - u16 *buff = ptr; - struct pcnet32_private *lp = dev->priv; - struct pcnet32_access *a = &lp->a; - ulong ioaddr = dev->base_addr; - unsigned long flags; - - spin_lock_irqsave(&lp->lock, flags); + int i, csr0; + u16 *buff = ptr; + struct pcnet32_private *lp = dev->priv; + struct pcnet32_access *a = &lp->a; + ulong ioaddr = dev->base_addr; + int ticks; + unsigned long flags; - csr0 = a->read_csr(ioaddr, CSR0); - if (!(csr0 & CSR0_STOP)) /* If not stopped */ - pcnet32_suspend(dev, &flags, 1); + spin_lock_irqsave(&lp->lock, flags); - /* read address PROM */ - for (i = 0; i < 16; i += 2) - *buff++ = inw(ioaddr + i); + csr0 = a->read_csr(ioaddr, 0); + if (!(csr0 & 0x0004)) { /* If not stopped */ + /* set SUSPEND (SPND) - CSR5 bit 0 */ + a->write_csr(ioaddr, 5, 0x0001); - /* read control and status registers */ - for (i = 0; i < 90; i++) { - *buff++ = a->read_csr(ioaddr, i); + /* 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; + } } + } - *buff++ = a->read_csr(ioaddr, 112); - *buff++ = a->read_csr(ioaddr, 114); + /* read address PROM */ + for (i=0; i<16; i += 2) + *buff++ = inw(ioaddr + i); - /* read bus configuration registers */ - for (i = 0; i < 30; i++) { - *buff++ = a->read_bcr(ioaddr, i); - } - *buff++ = 0; /* skip bcr30 so as not to hang 79C976 */ - for (i = 31; i < 36; i++) { - *buff++ = a->read_bcr(ioaddr, i); - } + /* read control and status registers */ + for (i=0; i<90; i++) { + *buff++ = a->read_csr(ioaddr, i); + } - /* read mii phy registers */ - if (lp->mii) { - int j; - for (j = 0; j < PCNET32_MAX_PHYS; j++) { - if (lp->phymask & (1 << j)) { - for (i = 0; i < PCNET32_REGS_PER_PHY; i++) { - lp->a.write_bcr(ioaddr, 33, - (j << 5) | i); - *buff++ = lp->a.read_bcr(ioaddr, 34); - } - } - } - } + *buff++ = a->read_csr(ioaddr, 112); + *buff++ = a->read_csr(ioaddr, 114); - if (!(csr0 & CSR0_STOP)) { /* If not stopped */ - int csr5; + /* read bus configuration registers */ + for (i=0; i<30; i++) { + *buff++ = a->read_bcr(ioaddr, i); + } + *buff++ = 0; /* skip bcr30 so as not to hang 79C976 */ + for (i=31; i<36; i++) { + *buff++ = a->read_bcr(ioaddr, i); + } - /* clear SUSPEND (SPND) - CSR5 bit 0 */ - csr5 = a->read_csr(ioaddr, CSR5); - a->write_csr(ioaddr, CSR5, csr5 & (~CSR5_SUSPEND)); + /* read mii phy registers */ + if (lp->mii) { + for (i=0; i<32; i++) { + lp->a.write_bcr(ioaddr, 33, ((lp->mii_if.phy_id) << 5) | i); + *buff++ = lp->a.read_bcr(ioaddr, 34); } + } - spin_unlock_irqrestore(&lp->lock, flags); + if (!(csr0 & 0x0004)) { /* If not stopped */ + /* clear SUSPEND (SPND) - CSR5 bit 0 */ + a->write_csr(ioaddr, 5, 0x0000); + } + + i = buff - (u16 *)ptr; + for (; i < PCNET32_NUM_REGS; i++) + *buff++ = 0; + + spin_unlock_irqrestore(&lp->lock, flags); } static struct ethtool_ops pcnet32_ethtool_ops = { - .get_settings = pcnet32_get_settings, - .set_settings = pcnet32_set_settings, - .get_drvinfo = pcnet32_get_drvinfo, - .get_msglevel = pcnet32_get_msglevel, - .set_msglevel = pcnet32_set_msglevel, - .nway_reset = pcnet32_nway_reset, - .get_link = pcnet32_get_link, - .get_ringparam = pcnet32_get_ringparam, - .set_ringparam = pcnet32_set_ringparam, - .get_tx_csum = ethtool_op_get_tx_csum, - .get_sg = ethtool_op_get_sg, - .get_tso = ethtool_op_get_tso, - .get_strings = pcnet32_get_strings, - .self_test_count = pcnet32_self_test_count, - .self_test = pcnet32_ethtool_test, - .phys_id = pcnet32_phys_id, - .get_regs_len = pcnet32_get_regs_len, - .get_regs = pcnet32_get_regs, - .get_perm_addr = ethtool_op_get_perm_addr, + .get_settings = pcnet32_get_settings, + .set_settings = pcnet32_set_settings, + .get_drvinfo = pcnet32_get_drvinfo, + .get_msglevel = pcnet32_get_msglevel, + .set_msglevel = pcnet32_set_msglevel, + .nway_reset = pcnet32_nway_reset, + .get_link = pcnet32_get_link, + .get_ringparam = pcnet32_get_ringparam, + .set_ringparam = pcnet32_set_ringparam, + .get_tx_csum = ethtool_op_get_tx_csum, + .get_sg = ethtool_op_get_sg, + .get_tso = ethtool_op_get_tso, + .get_strings = pcnet32_get_strings, + .self_test_count = pcnet32_self_test_count, + .self_test = pcnet32_ethtool_test, + .phys_id = pcnet32_phys_id, + .get_regs_len = pcnet32_get_regs_len, + .get_regs = pcnet32_get_regs, + .get_perm_addr = ethtool_op_get_perm_addr, }; /* only probes for non-PCI devices, the rest are handled by * pci_register_driver via pcnet32_probe_pci */ -static void __devinit pcnet32_probe_vlbus(unsigned int *pcnet32_portlist) +static void __devinit +pcnet32_probe_vlbus(void) { - unsigned int *port, ioaddr; - - /* search for PCnet32 VLB cards at known addresses */ - for (port = pcnet32_portlist; (ioaddr = *port); port++) { - if (request_region - (ioaddr, PCNET32_TOTAL_SIZE, "pcnet32_probe_vlbus")) { - /* check if there is really a pcnet chip on that ioaddr */ - if ((inb(ioaddr + 14) == 0x57) - && (inb(ioaddr + 15) == 0x57)) { - pcnet32_probe1(ioaddr, 0, NULL); - } else { - release_region(ioaddr, PCNET32_TOTAL_SIZE); - } - } + unsigned int *port, ioaddr; + + /* search for PCnet32 VLB cards at known addresses */ + for (port = pcnet32_portlist; (ioaddr = *port); port++) { + if (request_region(ioaddr, PCNET32_TOTAL_SIZE, "pcnet32_probe_vlbus")) { + /* check if there is really a pcnet chip on that ioaddr */ + if ((inb(ioaddr + 14) == 0x57) && (inb(ioaddr + 15) == 0x57)) { + pcnet32_probe1(ioaddr, 0, NULL); + } else { + release_region(ioaddr, PCNET32_TOTAL_SIZE); + } } + } } + static int __devinit pcnet32_probe_pci(struct pci_dev *pdev, const struct pci_device_id *ent) { - unsigned long ioaddr; - int err; - - err = pci_enable_device(pdev); - if (err < 0) { - if (pcnet32_debug & NETIF_MSG_PROBE) - printk(KERN_ERR PFX - "failed to enable device -- err=%d\n", err); - return err; - } - pci_set_master(pdev); - - ioaddr = pci_resource_start(pdev, 0); - if (!ioaddr) { - if (pcnet32_debug & NETIF_MSG_PROBE) - printk(KERN_ERR PFX - "card has no PCI IO resources, aborting\n"); - return -ENODEV; - } - - if (!pci_dma_supported(pdev, PCNET32_DMA_MASK)) { - if (pcnet32_debug & NETIF_MSG_PROBE) - printk(KERN_ERR PFX - "architecture does not support 32bit PCI busmaster DMA\n"); - return -ENODEV; - } - if (request_region(ioaddr, PCNET32_TOTAL_SIZE, "pcnet32_probe_pci") == - NULL) { - if (pcnet32_debug & NETIF_MSG_PROBE) - printk(KERN_ERR PFX - "io address range already allocated\n"); - return -EBUSY; - } + unsigned long ioaddr; + int err; - err = pcnet32_probe1(ioaddr, 1, pdev); - if (err < 0) { - pci_disable_device(pdev); - } + err = pci_enable_device(pdev); + if (err < 0) { + if (pcnet32_debug & NETIF_MSG_PROBE) + printk(KERN_ERR PFX "failed to enable device -- err=%d\n", err); return err; + } + pci_set_master(pdev); + + ioaddr = pci_resource_start (pdev, 0); + if (!ioaddr) { + if (pcnet32_debug & NETIF_MSG_PROBE) + printk (KERN_ERR PFX "card has no PCI IO resources, aborting\n"); + return -ENODEV; + } + + if (!pci_dma_supported(pdev, PCNET32_DMA_MASK)) { + if (pcnet32_debug & NETIF_MSG_PROBE) + printk(KERN_ERR PFX "architecture does not support 32bit PCI busmaster DMA\n"); + return -ENODEV; + } + if (request_region(ioaddr, PCNET32_TOTAL_SIZE, "pcnet32_probe_pci") == NULL) { + if (pcnet32_debug & NETIF_MSG_PROBE) + printk(KERN_ERR PFX "io address range already allocated\n"); + return -EBUSY; + } + + err = pcnet32_probe1(ioaddr, 1, pdev); + if (err < 0) { + pci_disable_device(pdev); + } + return err; } + /* pcnet32_probe1 * Called from both pcnet32_probe_vlbus and pcnet_probe_pci. * pdev will be NULL when called from pcnet32_probe_vlbus. @@ -1292,749 +1107,630 @@ pcnet32_probe_pci(struct pci_dev *pdev, const struct pci_device_id *ent) static int __devinit pcnet32_probe1(unsigned long ioaddr, int shared, struct pci_dev *pdev) { - struct pcnet32_private *lp; - dma_addr_t lp_dma_addr; - int i, media; - int fdx, mii, fset, dxsuflo; - int chip_version; - char *chipname; - struct net_device *dev; - struct pcnet32_access *a = NULL; - u8 promaddr[6]; - int ret = -ENODEV; - - /* reset the chip */ - pcnet32_wio_reset(ioaddr); - - /* NOTE: 16-bit check is first, otherwise some older PCnet chips fail */ - if (pcnet32_wio_read_csr(ioaddr, 0) == 4 && pcnet32_wio_check(ioaddr)) { - a = &pcnet32_wio; - } else { - pcnet32_dwio_reset(ioaddr); - if (pcnet32_dwio_read_csr(ioaddr, 0) == 4 - && pcnet32_dwio_check(ioaddr)) { - a = &pcnet32_dwio; - } else - goto err_release_region; - } - - chip_version = - a->read_csr(ioaddr, 88) | (a->read_csr(ioaddr, 89) << 16); - if ((pcnet32_debug & NETIF_MSG_PROBE) && (pcnet32_debug & NETIF_MSG_HW)) - printk(KERN_INFO " PCnet chip version is %#x.\n", - chip_version); - if ((chip_version & 0xfff) != 0x003) { - if (pcnet32_debug & NETIF_MSG_PROBE) - printk(KERN_INFO PFX "Unsupported chip version.\n"); - goto err_release_region; - } - - /* initialize variables */ - fdx = mii = fset = dxsuflo = 0; - chip_version = (chip_version >> 12) & 0xffff; - - switch (chip_version) { - case 0x2420: - chipname = "PCnet/PCI 79C970"; /* PCI */ - break; - case 0x2430: - if (shared) - chipname = "PCnet/PCI 79C970"; /* 970 gives the wrong chip id back */ - else - chipname = "PCnet/32 79C965"; /* 486/VL bus */ - break; - case 0x2621: - chipname = "PCnet/PCI II 79C970A"; /* PCI */ - fdx = 1; - break; - case 0x2623: - chipname = "PCnet/FAST 79C971"; /* PCI */ - fdx = 1; - mii = 1; - fset = 1; - break; - case 0x2624: - chipname = "PCnet/FAST+ 79C972"; /* PCI */ - fdx = 1; - mii = 1; - fset = 1; - break; - case 0x2625: - chipname = "PCnet/FAST III 79C973"; /* PCI */ - fdx = 1; - mii = 1; - break; - case 0x2626: - chipname = "PCnet/Home 79C978"; /* PCI */ - fdx = 1; - /* - * This is based on specs published at www.amd.com. This section - * assumes that a card with a 79C978 wants to go into standard - * ethernet mode. The 79C978 can also go into 1Mb HomePNA mode, - * and the module option homepna=1 can select this instead. - */ - media = a->read_bcr(ioaddr, 49); - media &= ~3; /* default to 10Mb ethernet */ - if (cards_found < MAX_UNITS && homepna[cards_found]) - media |= 1; /* switch to home wiring mode */ - if (pcnet32_debug & NETIF_MSG_PROBE) - printk(KERN_DEBUG PFX "media set to %sMbit mode.\n", - (media & 1) ? "1" : "10"); - a->write_bcr(ioaddr, 49, media); - break; - case 0x2627: - chipname = "PCnet/FAST III 79C975"; /* PCI */ - fdx = 1; - mii = 1; - break; - case 0x2628: - chipname = "PCnet/PRO 79C976"; - fdx = 1; - mii = 1; - break; - default: - if (pcnet32_debug & NETIF_MSG_PROBE) - printk(KERN_INFO PFX - "PCnet version %#x, no PCnet32 chip.\n", - chip_version); - goto err_release_region; - } - + struct pcnet32_private *lp; + dma_addr_t lp_dma_addr; + int i, media; + int fdx, mii, fset, dxsuflo; + int chip_version; + char *chipname; + struct net_device *dev; + struct pcnet32_access *a = NULL; + u8 promaddr[6]; + int ret = -ENODEV; + + /* reset the chip */ + pcnet32_wio_reset(ioaddr); + + /* NOTE: 16-bit check is first, otherwise some older PCnet chips fail */ + if (pcnet32_wio_read_csr(ioaddr, 0) == 4 && pcnet32_wio_check(ioaddr)) { + a = &pcnet32_wio; + } else { + pcnet32_dwio_reset(ioaddr); + if (pcnet32_dwio_read_csr(ioaddr, 0) == 4 && pcnet32_dwio_check(ioaddr)) { + a = &pcnet32_dwio; + } else + goto err_release_region; + } + + chip_version = a->read_csr(ioaddr, 88) | (a->read_csr(ioaddr,89) << 16); + if ((pcnet32_debug & NETIF_MSG_PROBE) && (pcnet32_debug & NETIF_MSG_HW)) + printk(KERN_INFO " PCnet chip version is %#x.\n", chip_version); + if ((chip_version & 0xfff) != 0x003) { + if (pcnet32_debug & NETIF_MSG_PROBE) + printk(KERN_INFO PFX "Unsupported chip version.\n"); + goto err_release_region; + } + + /* initialize variables */ + fdx = mii = fset = dxsuflo = 0; + chip_version = (chip_version >> 12) & 0xffff; + + switch (chip_version) { + case 0x2420: + chipname = "PCnet/PCI 79C970"; /* PCI */ + break; + case 0x2430: + if (shared) + chipname = "PCnet/PCI 79C970"; /* 970 gives the wrong chip id back */ + else + chipname = "PCnet/32 79C965"; /* 486/VL bus */ + break; + case 0x2621: + chipname = "PCnet/PCI II 79C970A"; /* PCI */ + fdx = 1; + break; + case 0x2623: + chipname = "PCnet/FAST 79C971"; /* PCI */ + fdx = 1; mii = 1; fset = 1; + break; + case 0x2624: + chipname = "PCnet/FAST+ 79C972"; /* PCI */ + fdx = 1; mii = 1; fset = 1; + break; + case 0x2625: + chipname = "PCnet/FAST III 79C973"; /* PCI */ + fdx = 1; mii = 1; + break; + case 0x2626: + chipname = "PCnet/Home 79C978"; /* PCI */ + fdx = 1; /* - * On selected chips turn on the BCR18:NOUFLO bit. This stops transmit - * starting until the packet is loaded. Strike one for reliability, lose - * one for latency - although on PCI this isnt a big loss. Older chips - * have FIFO's smaller than a packet, so you can't do this. - * Turn on BCR18:BurstRdEn and BCR18:BurstWrEn. + * This is based on specs published at www.amd.com. This section + * assumes that a card with a 79C978 wants to go into standard + * ethernet mode. The 79C978 can also go into 1Mb HomePNA mode, + * and the module option homepna=1 can select this instead. */ - - if (fset) { - a->write_bcr(ioaddr, 18, (a->read_bcr(ioaddr, 18) | 0x0860)); - a->write_csr(ioaddr, 80, - (a->read_csr(ioaddr, 80) & 0x0C00) | 0x0c00); - dxsuflo = 1; - } - - dev = alloc_etherdev(0); - if (!dev) { - if (pcnet32_debug & NETIF_MSG_PROBE) - printk(KERN_ERR PFX "Memory allocation failed.\n"); - ret = -ENOMEM; - goto err_release_region; - } - SET_NETDEV_DEV(dev, &pdev->dev); - + media = a->read_bcr(ioaddr, 49); + media &= ~3; /* default to 10Mb ethernet */ + if (cards_found < MAX_UNITS && homepna[cards_found]) + media |= 1; /* switch to home wiring mode */ if (pcnet32_debug & NETIF_MSG_PROBE) - printk(KERN_INFO PFX "%s at %#3lx,", chipname, ioaddr); - - /* In most chips, after a chip reset, the ethernet address is read from the - * station address PROM at the base address and programmed into the - * "Physical Address Registers" CSR12-14. - * As a precautionary measure, we read the PROM values and complain if - * they disagree with the CSRs. If they miscompare, and the PROM addr - * is valid, then the PROM addr is used. - */ - for (i = 0; i < 3; i++) { - unsigned int val; - val = a->read_csr(ioaddr, i + 12) & 0x0ffff; - /* There may be endianness issues here. */ - dev->dev_addr[2 * i] = val & 0x0ff; - dev->dev_addr[2 * i + 1] = (val >> 8) & 0x0ff; - } - - /* read PROM address and compare with CSR address */ + printk(KERN_DEBUG PFX "media set to %sMbit mode.\n", + (media & 1) ? "1" : "10"); + a->write_bcr(ioaddr, 49, media); + break; + case 0x2627: + chipname = "PCnet/FAST III 79C975"; /* PCI */ + fdx = 1; mii = 1; + break; + case 0x2628: + chipname = "PCnet/PRO 79C976"; + fdx = 1; mii = 1; + break; + default: + if (pcnet32_debug & NETIF_MSG_PROBE) + printk(KERN_INFO PFX "PCnet version %#x, no PCnet32 chip.\n", + chip_version); + goto err_release_region; + } + + /* + * On selected chips turn on the BCR18:NOUFLO bit. This stops transmit + * starting until the packet is loaded. Strike one for reliability, lose + * one for latency - although on PCI this isnt a big loss. Older chips + * have FIFO's smaller than a packet, so you can't do this. + * Turn on BCR18:BurstRdEn and BCR18:BurstWrEn. + */ + + if (fset) { + a->write_bcr(ioaddr, 18, (a->read_bcr(ioaddr, 18) | 0x0860)); + a->write_csr(ioaddr, 80, (a->read_csr(ioaddr, 80) & 0x0C00) | 0x0c00); + dxsuflo = 1; + } + + dev = alloc_etherdev(0); + if (!dev) { + if (pcnet32_debug & NETIF_MSG_PROBE) + printk(KERN_ERR PFX "Memory allocation failed.\n"); + ret = -ENOMEM; + goto err_release_region; + } + SET_NETDEV_DEV(dev, &pdev->dev); + + if (pcnet32_debug & NETIF_MSG_PROBE) + printk(KERN_INFO PFX "%s at %#3lx,", chipname, ioaddr); + + /* In most chips, after a chip reset, the ethernet address is read from the + * station address PROM at the base address and programmed into the + * "Physical Address Registers" CSR12-14. + * As a precautionary measure, we read the PROM values and complain if + * they disagree with the CSRs. Either way, we use the CSR values, and + * double check that they are valid. + */ + for (i = 0; i < 3; i++) { + unsigned int val; + val = a->read_csr(ioaddr, i+12) & 0x0ffff; + /* There may be endianness issues here. */ + dev->dev_addr[2*i] = val & 0x0ff; + dev->dev_addr[2*i+1] = (val >> 8) & 0x0ff; + } + + /* read PROM address and compare with CSR address */ + for (i = 0; i < 6; i++) + promaddr[i] = inb(ioaddr + i); + + if (memcmp(promaddr, dev->dev_addr, 6) + || !is_valid_ether_addr(dev->dev_addr)) { + if (is_valid_ether_addr(promaddr)) { + if (pcnet32_debug & NETIF_MSG_PROBE) { + printk(" warning: CSR address invalid,\n"); + printk(KERN_INFO " using instead PROM address of"); + } + memcpy(dev->dev_addr, promaddr, 6); + } + } + memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len); + + /* if the ethernet address is not valid, force to 00:00:00:00:00:00 */ + if (!is_valid_ether_addr(dev->perm_addr)) + memset(dev->dev_addr, 0, sizeof(dev->dev_addr)); + + if (pcnet32_debug & NETIF_MSG_PROBE) { for (i = 0; i < 6; i++) - promaddr[i] = inb(ioaddr + i); - - if (memcmp(promaddr, dev->dev_addr, 6) - || !is_valid_ether_addr(dev->dev_addr)) { - if (is_valid_ether_addr(promaddr)) { - if (pcnet32_debug & NETIF_MSG_PROBE) { - printk(" warning: CSR address invalid,\n"); - printk(KERN_INFO - " using instead PROM address of"); - } - memcpy(dev->dev_addr, promaddr, 6); - } - } - memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len); - - /* if the ethernet address is not valid, force to 00:00:00:00:00:00 */ - if (!is_valid_ether_addr(dev->perm_addr)) - memset(dev->dev_addr, 0, sizeof(dev->dev_addr)); - - if (pcnet32_debug & NETIF_MSG_PROBE) { - for (i = 0; i < 6; i++) - printk(" %2.2x", dev->dev_addr[i]); - - /* Version 0x2623 and 0x2624 */ - if (((chip_version + 1) & 0xfffe) == 0x2624) { - i = a->read_csr(ioaddr, 80) & 0x0C00; /* Check tx_start_pt */ - printk("\n" KERN_INFO " tx_start_pt(0x%04x):", i); - switch (i >> 10) { - case 0: - printk(" 20 bytes,"); - break; - case 1: - printk(" 64 bytes,"); - break; - case 2: - printk(" 128 bytes,"); - break; - case 3: - printk("~220 bytes,"); - break; - } - i = a->read_bcr(ioaddr, 18); /* Check Burst/Bus control */ - printk(" BCR18(%x):", i & 0xffff); - if (i & (1 << 5)) - printk("BurstWrEn "); - if (i & (1 << 6)) - printk("BurstRdEn "); - if (i & (1 << 7)) - printk("DWordIO "); - if (i & (1 << 11)) - printk("NoUFlow "); - i = a->read_bcr(ioaddr, 25); - printk("\n" KERN_INFO " SRAMSIZE=0x%04x,", i << 8); - i = a->read_bcr(ioaddr, 26); - printk(" SRAM_BND=0x%04x,", i << 8); - i = a->read_bcr(ioaddr, 27); - if (i & (1 << 14)) - printk("LowLatRx"); - } - } - - dev->base_addr = ioaddr; - /* pci_alloc_consistent returns page-aligned memory, so we do not have to check the alignment */ - if ((lp = - pci_alloc_consistent(pdev, sizeof(*lp), &lp_dma_addr)) == NULL) { - if (pcnet32_debug & NETIF_MSG_PROBE) - printk(KERN_ERR PFX - "Consistent memory allocation failed.\n"); - ret = -ENOMEM; - goto err_free_netdev; - } - - memset(lp, 0, sizeof(*lp)); - lp->dma_addr = lp_dma_addr; - lp->pci_dev = pdev; - - spin_lock_init(&lp->lock); - - SET_MODULE_OWNER(dev); - SET_NETDEV_DEV(dev, &pdev->dev); - dev->priv = lp; - lp->name = chipname; - lp->shared_irq = shared; - lp->tx_ring_size = TX_RING_SIZE; /* default tx ring size */ - lp->rx_ring_size = RX_RING_SIZE; /* default rx ring size */ - lp->tx_mod_mask = lp->tx_ring_size - 1; - lp->rx_mod_mask = lp->rx_ring_size - 1; - lp->tx_len_bits = (PCNET32_LOG_TX_BUFFERS << 12); - lp->rx_len_bits = (PCNET32_LOG_RX_BUFFERS << 4); - lp->mii_if.full_duplex = fdx; - lp->mii_if.phy_id_mask = 0x1f; - 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))) - lp->options = PCNET32_PORT_ASEL; - else - lp->options = options_mapping[options[cards_found]]; - lp->mii_if.dev = dev; - lp->mii_if.mdio_read = mdio_read; - lp->mii_if.mdio_write = mdio_write; - - if (fdx && !(lp->options & PCNET32_PORT_ASEL) && - ((cards_found >= MAX_UNITS) || full_duplex[cards_found])) - lp->options |= PCNET32_PORT_FD; - - if (!a) { - if (pcnet32_debug & NETIF_MSG_PROBE) - printk(KERN_ERR PFX "No access methods\n"); - ret = -ENODEV; - goto err_free_consistent; - } - lp->a = *a; - - /* prior to register_netdev, dev->name is not yet correct */ - if (pcnet32_alloc_ring(dev, pci_name(lp->pci_dev))) { - ret = -ENOMEM; - goto err_free_ring; - } - /* detect special T1/E1 WAN card by checking for MAC address */ - if (dev->dev_addr[0] == 0x00 && dev->dev_addr[1] == 0xe0 + printk(" %2.2x", dev->dev_addr[i]); + + /* Version 0x2623 and 0x2624 */ + if (((chip_version + 1) & 0xfffe) == 0x2624) { + i = a->read_csr(ioaddr, 80) & 0x0C00; /* Check tx_start_pt */ + printk("\n" KERN_INFO " tx_start_pt(0x%04x):",i); + switch(i>>10) { + case 0: printk(" 20 bytes,"); break; + case 1: printk(" 64 bytes,"); break; + case 2: printk(" 128 bytes,"); break; + case 3: printk("~220 bytes,"); break; + } + i = a->read_bcr(ioaddr, 18); /* Check Burst/Bus control */ + printk(" BCR18(%x):",i&0xffff); + if (i & (1<<5)) printk("BurstWrEn "); + if (i & (1<<6)) printk("BurstRdEn "); + if (i & (1<<7)) printk("DWordIO "); + if (i & (1<<11)) printk("NoUFlow "); + i = a->read_bcr(ioaddr, 25); + printk("\n" KERN_INFO " SRAMSIZE=0x%04x,",i<<8); + i = a->read_bcr(ioaddr, 26); + printk(" SRAM_BND=0x%04x,",i<<8); + i = a->read_bcr(ioaddr, 27); + if (i & (1<<14)) printk("LowLatRx"); + } + } + + dev->base_addr = ioaddr; + /* pci_alloc_consistent returns page-aligned memory, so we do not have to check the alignment */ + if ((lp = pci_alloc_consistent(pdev, sizeof(*lp), &lp_dma_addr)) == NULL) { + if (pcnet32_debug & NETIF_MSG_PROBE) + printk(KERN_ERR PFX "Consistent memory allocation failed.\n"); + ret = -ENOMEM; + goto err_free_netdev; + } + + memset(lp, 0, sizeof(*lp)); + lp->dma_addr = lp_dma_addr; + lp->pci_dev = pdev; + + spin_lock_init(&lp->lock); + + SET_MODULE_OWNER(dev); + SET_NETDEV_DEV(dev, &pdev->dev); + dev->priv = lp; + lp->name = chipname; + lp->shared_irq = shared; + lp->tx_ring_size = TX_RING_SIZE; /* default tx ring size */ + lp->rx_ring_size = RX_RING_SIZE; /* default rx ring size */ + lp->tx_mod_mask = lp->tx_ring_size - 1; + lp->rx_mod_mask = lp->rx_ring_size - 1; + lp->tx_len_bits = (PCNET32_LOG_TX_BUFFERS << 12); + lp->rx_len_bits = (PCNET32_LOG_RX_BUFFERS << 4); + lp->mii_if.full_duplex = fdx; + lp->mii_if.phy_id_mask = 0x1f; + lp->mii_if.reg_num_mask = 0x1f; + lp->dxsuflo = dxsuflo; + lp->mii = mii; + lp->msg_enable = pcnet32_debug; + if ((cards_found >= MAX_UNITS) || (options[cards_found] > sizeof(options_mapping))) + lp->options = PCNET32_PORT_ASEL; + else + lp->options = options_mapping[options[cards_found]]; + lp->mii_if.dev = dev; + lp->mii_if.mdio_read = mdio_read; + lp->mii_if.mdio_write = mdio_write; + + if (fdx && !(lp->options & PCNET32_PORT_ASEL) && + ((cards_found>=MAX_UNITS) || full_duplex[cards_found])) + lp->options |= PCNET32_PORT_FD; + + if (!a) { + if (pcnet32_debug & NETIF_MSG_PROBE) + printk(KERN_ERR PFX "No access methods\n"); + ret = -ENODEV; + goto err_free_consistent; + } + lp->a = *a; + + /* prior to register_netdev, dev->name is not yet correct */ + if (pcnet32_alloc_ring(dev, pci_name(lp->pci_dev))) { + ret = -ENOMEM; + goto err_free_ring; + } + /* detect special T1/E1 WAN card by checking for MAC address */ + if (dev->dev_addr[0] == 0x00 && dev->dev_addr[1] == 0xe0 && dev->dev_addr[2] == 0x75) - lp->options = PCNET32_PORT_FD | PCNET32_PORT_GPSI; + lp->options = PCNET32_PORT_FD | PCNET32_PORT_GPSI; + + lp->init_block.mode = le16_to_cpu(0x0003); /* Disable Rx and Tx. */ + lp->init_block.tlen_rlen = le16_to_cpu(lp->tx_len_bits | lp->rx_len_bits); + for (i = 0; i < 6; i++) + lp->init_block.phys_addr[i] = dev->dev_addr[i]; + lp->init_block.filter[0] = 0x00000000; + lp->init_block.filter[1] = 0x00000000; + lp->init_block.rx_ring = (u32)le32_to_cpu(lp->rx_ring_dma_addr); + lp->init_block.tx_ring = (u32)le32_to_cpu(lp->tx_ring_dma_addr); + + /* switch pcnet32 to 32bit mode */ + a->write_bcr(ioaddr, 20, 2); + + a->write_csr(ioaddr, 1, (lp->dma_addr + offsetof(struct pcnet32_private, + init_block)) & 0xffff); + a->write_csr(ioaddr, 2, (lp->dma_addr + offsetof(struct pcnet32_private, + init_block)) >> 16); + + if (pdev) { /* use the IRQ provided by PCI */ + dev->irq = pdev->irq; + if (pcnet32_debug & NETIF_MSG_PROBE) + printk(" assigned IRQ %d.\n", dev->irq); + } else { + unsigned long irq_mask = probe_irq_on(); - lp->init_block.mode = le16_to_cpu(0x0003); /* Disable Rx and Tx. */ - lp->init_block.tlen_rlen = - le16_to_cpu(lp->tx_len_bits | lp->rx_len_bits); - for (i = 0; i < 6; i++) - lp->init_block.phys_addr[i] = dev->dev_addr[i]; - lp->init_block.filter[0] = 0x00000000; - lp->init_block.filter[1] = 0x00000000; - lp->init_block.rx_ring = (u32) le32_to_cpu(lp->rx_ring_dma_addr); - lp->init_block.tx_ring = (u32) le32_to_cpu(lp->tx_ring_dma_addr); - - /* switch pcnet32 to 32bit mode */ - a->write_bcr(ioaddr, 20, 2); - - a->write_csr(ioaddr, 1, (lp->dma_addr + offsetof(struct pcnet32_private, - init_block)) & 0xffff); - a->write_csr(ioaddr, 2, (lp->dma_addr + offsetof(struct pcnet32_private, - init_block)) >> 16); - - if (pdev) { /* use the IRQ provided by PCI */ - dev->irq = pdev->irq; - if (pcnet32_debug & NETIF_MSG_PROBE) - printk(" assigned IRQ %d.\n", dev->irq); - } else { - unsigned long irq_mask = probe_irq_on(); - - /* - * To auto-IRQ we enable the initialization-done and DMA error - * interrupts. For ISA boards we get a DMA error, but VLB and PCI - * boards will work. - */ - /* Trigger an initialization just for the interrupt. */ - a->write_csr(ioaddr, 0, 0x41); - mdelay(1); - - dev->irq = probe_irq_off(irq_mask); - if (!dev->irq) { - if (pcnet32_debug & NETIF_MSG_PROBE) - printk(", failed to detect IRQ line.\n"); - ret = -ENODEV; - goto err_free_ring; - } - if (pcnet32_debug & NETIF_MSG_PROBE) - printk(", probed IRQ %d.\n", dev->irq); - } + /* + * To auto-IRQ we enable the initialization-done and DMA error + * interrupts. For ISA boards we get a DMA error, but VLB and PCI + * boards will work. + */ + /* Trigger an initialization just for the interrupt. */ + a->write_csr (ioaddr, 0, 0x41); + mdelay (1); - /* Set the mii phy_id so that we can query the link state */ - if (lp->mii) { - /* lp->phycount and lp->phymask are set to 0 by memset above */ - - lp->mii_if.phy_id = ((lp->a.read_bcr(ioaddr, 33)) >> 5) & 0x1f; - /* scan for PHYs */ - for (i = 0; i < PCNET32_MAX_PHYS; i++) { - unsigned short id1, id2; - - id1 = mdio_read(dev, i, MII_PHYSID1); - if (id1 == 0xffff) - continue; - id2 = mdio_read(dev, i, MII_PHYSID2); - if (id2 == 0xffff) - continue; - if (i == 31 && ((chip_version + 1) & 0xfffe) == 0x2624) - continue; /* 79C971 & 79C972 have phantom phy at id 31 */ - lp->phycount++; - lp->phymask |= (1 << i); - lp->mii_if.phy_id = i; - if (pcnet32_debug & NETIF_MSG_PROBE) - printk(KERN_INFO PFX - "Found PHY %04x:%04x at address %d.\n", - id1, id2, i); - } - lp->a.write_bcr(ioaddr, 33, (lp->mii_if.phy_id) << 5); - if (lp->phycount > 1) { - lp->options |= PCNET32_PORT_MII; - } + dev->irq = probe_irq_off (irq_mask); + if (!dev->irq) { + if (pcnet32_debug & NETIF_MSG_PROBE) + printk(", failed to detect IRQ line.\n"); + ret = -ENODEV; + goto err_free_ring; } - - init_timer(&lp->watchdog_timer); - lp->watchdog_timer.data = (unsigned long)dev; - lp->watchdog_timer.function = (void *)&pcnet32_watchdog; - - /* The PCNET32-specific entries in the device structure. */ - dev->open = &pcnet32_open; - dev->hard_start_xmit = &pcnet32_start_xmit; - dev->stop = &pcnet32_close; - dev->get_stats = &pcnet32_get_stats; - dev->set_multicast_list = &pcnet32_set_multicast_list; - dev->do_ioctl = &pcnet32_ioctl; - dev->ethtool_ops = &pcnet32_ethtool_ops; - dev->tx_timeout = pcnet32_tx_timeout; - dev->watchdog_timeo = (5 * HZ); + if (pcnet32_debug & NETIF_MSG_PROBE) + printk(", probed IRQ %d.\n", dev->irq); + } + + /* Set the mii phy_id so that we can query the link state */ + if (lp->mii) + lp->mii_if.phy_id = ((lp->a.read_bcr (ioaddr, 33)) >> 5) & 0x1f; + + init_timer (&lp->watchdog_timer); + lp->watchdog_timer.data = (unsigned long) dev; + lp->watchdog_timer.function = (void *) &pcnet32_watchdog; + + /* The PCNET32-specific entries in the device structure. */ + dev->open = &pcnet32_open; + dev->hard_start_xmit = &pcnet32_start_xmit; + dev->stop = &pcnet32_close; + dev->get_stats = &pcnet32_get_stats; + dev->set_multicast_list = &pcnet32_set_multicast_list; + dev->do_ioctl = &pcnet32_ioctl; + dev->ethtool_ops = &pcnet32_ethtool_ops; + dev->tx_timeout = pcnet32_tx_timeout; + dev->watchdog_timeo = (5*HZ); #ifdef CONFIG_NET_POLL_CONTROLLER - dev->poll_controller = pcnet32_poll_controller; + dev->poll_controller = pcnet32_poll_controller; #endif - /* Fill in the generic fields of the device structure. */ - if (register_netdev(dev)) - goto err_free_ring; + /* Fill in the generic fields of the device structure. */ + if (register_netdev(dev)) + goto err_free_ring; - if (pdev) { - pci_set_drvdata(pdev, dev); - } else { - lp->next = pcnet32_dev; - pcnet32_dev = dev; - } + if (pdev) { + pci_set_drvdata(pdev, dev); + } else { + lp->next = pcnet32_dev; + pcnet32_dev = dev; + } - if (pcnet32_debug & NETIF_MSG_PROBE) - printk(KERN_INFO "%s: registered as %s\n", dev->name, lp->name); - cards_found++; + if (pcnet32_debug & NETIF_MSG_PROBE) + printk(KERN_INFO "%s: registered as %s\n", dev->name, lp->name); + cards_found++; - /* enable LED writes */ - a->write_bcr(ioaddr, 2, a->read_bcr(ioaddr, 2) | 0x1000); + /* enable LED writes */ + a->write_bcr(ioaddr, 2, a->read_bcr(ioaddr, 2) | 0x1000); - return 0; + return 0; - err_free_ring: - pcnet32_free_ring(dev); - err_free_consistent: - pci_free_consistent(lp->pci_dev, sizeof(*lp), lp, lp->dma_addr); - err_free_netdev: - free_netdev(dev); - err_release_region: - release_region(ioaddr, PCNET32_TOTAL_SIZE); - return ret; +err_free_ring: + pcnet32_free_ring(dev); +err_free_consistent: + pci_free_consistent(lp->pci_dev, sizeof(*lp), lp, lp->dma_addr); +err_free_netdev: + free_netdev(dev); +err_release_region: + release_region(ioaddr, PCNET32_TOTAL_SIZE); + return ret; } + /* if any allocation fails, caller must also call pcnet32_free_ring */ static int pcnet32_alloc_ring(struct net_device *dev, char *name) { - struct pcnet32_private *lp = dev->priv; - - lp->tx_ring = pci_alloc_consistent(lp->pci_dev, - sizeof(struct pcnet32_tx_head) * - lp->tx_ring_size, - &lp->tx_ring_dma_addr); - if (lp->tx_ring == NULL) { - if (netif_msg_drv(lp)) - printk("\n" KERN_ERR PFX - "%s: Consistent memory allocation failed.\n", - name); - return -ENOMEM; - } - - lp->rx_ring = pci_alloc_consistent(lp->pci_dev, - sizeof(struct pcnet32_rx_head) * - lp->rx_ring_size, - &lp->rx_ring_dma_addr); - if (lp->rx_ring == NULL) { - if (netif_msg_drv(lp)) - printk("\n" KERN_ERR PFX - "%s: Consistent memory allocation failed.\n", - name); - return -ENOMEM; - } - - lp->tx_dma_addr = kcalloc(lp->tx_ring_size, sizeof(dma_addr_t), - GFP_ATOMIC); - if (!lp->tx_dma_addr) { - if (netif_msg_drv(lp)) - printk("\n" KERN_ERR PFX - "%s: Memory allocation failed.\n", name); - return -ENOMEM; - } + struct pcnet32_private *lp = dev->priv; - lp->rx_dma_addr = kcalloc(lp->rx_ring_size, sizeof(dma_addr_t), - GFP_ATOMIC); - if (!lp->rx_dma_addr) { - if (netif_msg_drv(lp)) - printk("\n" KERN_ERR PFX - "%s: Memory allocation failed.\n", name); - return -ENOMEM; - } - - lp->tx_skbuff = kcalloc(lp->tx_ring_size, sizeof(struct sk_buff *), - GFP_ATOMIC); - if (!lp->tx_skbuff) { - if (netif_msg_drv(lp)) - printk("\n" KERN_ERR PFX - "%s: Memory allocation failed.\n", name); - return -ENOMEM; - } - - lp->rx_skbuff = kcalloc(lp->rx_ring_size, sizeof(struct sk_buff *), - GFP_ATOMIC); - if (!lp->rx_skbuff) { - if (netif_msg_drv(lp)) - printk("\n" KERN_ERR PFX - "%s: Memory allocation failed.\n", name); - return -ENOMEM; - } + lp->tx_ring = pci_alloc_consistent(lp->pci_dev, + sizeof(struct pcnet32_tx_head) * lp->tx_ring_size, + &lp->tx_ring_dma_addr); + if (lp->tx_ring == NULL) { + if (pcnet32_debug & NETIF_MSG_DRV) + printk("\n" KERN_ERR PFX "%s: Consistent memory allocation failed.\n", + name); + return -ENOMEM; + } + + lp->rx_ring = pci_alloc_consistent(lp->pci_dev, + sizeof(struct pcnet32_rx_head) * lp->rx_ring_size, + &lp->rx_ring_dma_addr); + if (lp->rx_ring == NULL) { + if (pcnet32_debug & NETIF_MSG_DRV) + 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, + GFP_ATOMIC); + if (!lp->tx_dma_addr) { + if (pcnet32_debug & NETIF_MSG_DRV) + 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, + GFP_ATOMIC); + if (!lp->rx_dma_addr) { + if (pcnet32_debug & NETIF_MSG_DRV) + 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, + GFP_ATOMIC); + if (!lp->tx_skbuff) { + if (pcnet32_debug & NETIF_MSG_DRV) + 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, + GFP_ATOMIC); + if (!lp->rx_skbuff) { + if (pcnet32_debug & NETIF_MSG_DRV) + 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; + return 0; } -static void pcnet32_free_ring(struct net_device *dev) -{ - struct pcnet32_private *lp = dev->priv; - - kfree(lp->tx_skbuff); - lp->tx_skbuff = NULL; - - kfree(lp->rx_skbuff); - lp->rx_skbuff = NULL; - - kfree(lp->tx_dma_addr); - lp->tx_dma_addr = NULL; - - kfree(lp->rx_dma_addr); - lp->rx_dma_addr = NULL; - - if (lp->tx_ring) { - 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 = NULL; - } - - if (lp->rx_ring) { - 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 = NULL; - } -} -static int pcnet32_open(struct net_device *dev) +static void pcnet32_free_ring(struct net_device *dev) { - struct pcnet32_private *lp = dev->priv; - unsigned long ioaddr = dev->base_addr; - u16 val; - int i; - int rc; - unsigned long flags; - - if (request_irq(dev->irq, &pcnet32_interrupt, - lp->shared_irq ? IRQF_SHARED : 0, dev->name, - (void *)dev)) { - return -EAGAIN; - } - - spin_lock_irqsave(&lp->lock, flags); - /* Check for a valid station address */ - if (!is_valid_ether_addr(dev->dev_addr)) { - rc = -EINVAL; - goto err_free_irq; - } - - /* Reset the PCNET32 */ - lp->a.reset(ioaddr); - - /* switch pcnet32 to 32bit mode */ - lp->a.write_bcr(ioaddr, 20, 2); - - if (netif_msg_ifup(lp)) - printk(KERN_DEBUG - "%s: pcnet32_open() irq %d tx/rx rings %#x/%#x init %#x.\n", - dev->name, dev->irq, (u32) (lp->tx_ring_dma_addr), - (u32) (lp->rx_ring_dma_addr), - (u32) (lp->dma_addr + - offsetof(struct pcnet32_private, init_block))); - - /* set/reset autoselect bit */ - val = lp->a.read_bcr(ioaddr, 2) & ~2; - if (lp->options & PCNET32_PORT_ASEL) + struct pcnet32_private *lp = dev->priv; + + kfree(lp->tx_skbuff); + lp->tx_skbuff = NULL; + + kfree(lp->rx_skbuff); + lp->rx_skbuff = NULL; + + kfree(lp->tx_dma_addr); + lp->tx_dma_addr = NULL; + + kfree(lp->rx_dma_addr); + lp->rx_dma_addr = NULL; + + if (lp->tx_ring) { + 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 = NULL; + } + + if (lp->rx_ring) { + 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 = NULL; + } +} + + +static int +pcnet32_open(struct net_device *dev) +{ + struct pcnet32_private *lp = dev->priv; + unsigned long ioaddr = dev->base_addr; + u16 val; + int i; + int rc; + unsigned long flags; + + if (request_irq(dev->irq, &pcnet32_interrupt, + lp->shared_irq ? SA_SHIRQ : 0, dev->name, (void *)dev)) { + return -EAGAIN; + } + + spin_lock_irqsave(&lp->lock, flags); + /* Check for a valid station address */ + if (!is_valid_ether_addr(dev->dev_addr)) { + rc = -EINVAL; + goto err_free_irq; + } + + /* Reset the PCNET32 */ + lp->a.reset (ioaddr); + + /* switch pcnet32 to 32bit mode */ + lp->a.write_bcr (ioaddr, 20, 2); + + if (netif_msg_ifup(lp)) + printk(KERN_DEBUG "%s: pcnet32_open() irq %d tx/rx rings %#x/%#x init %#x.\n", + dev->name, dev->irq, + (u32) (lp->tx_ring_dma_addr), + (u32) (lp->rx_ring_dma_addr), + (u32) (lp->dma_addr + offsetof(struct pcnet32_private, init_block))); + + /* set/reset autoselect bit */ + val = lp->a.read_bcr (ioaddr, 2) & ~2; + if (lp->options & PCNET32_PORT_ASEL) + val |= 2; + lp->a.write_bcr (ioaddr, 2, val); + + /* handle full duplex setting */ + if (lp->mii_if.full_duplex) { + val = lp->a.read_bcr (ioaddr, 9) & ~3; + if (lp->options & PCNET32_PORT_FD) { + val |= 1; + if (lp->options == (PCNET32_PORT_FD | PCNET32_PORT_AUI)) val |= 2; - lp->a.write_bcr(ioaddr, 2, val); - - /* handle full duplex setting */ - if (lp->mii_if.full_duplex) { - val = lp->a.read_bcr(ioaddr, 9) & ~3; - if (lp->options & PCNET32_PORT_FD) { - val |= 1; - if (lp->options == (PCNET32_PORT_FD | PCNET32_PORT_AUI)) - val |= 2; - } else if (lp->options & PCNET32_PORT_ASEL) { - /* workaround of xSeries250, turn on for 79C975 only */ - if (lp->chip_version == 0x2627) - val |= 3; - } - lp->a.write_bcr(ioaddr, 9, val); - } - - /* set/reset GPSI bit in test register */ - val = lp->a.read_csr(ioaddr, 124) & ~0x10; - if ((lp->options & PCNET32_PORT_PORTSEL) == PCNET32_PORT_GPSI) - val |= 0x10; - lp->a.write_csr(ioaddr, 124, val); - - /* Allied Telesyn AT 2700/2701 FX are 100Mbit only and do not negotiate */ - if (lp->pci_dev->subsystem_vendor == PCI_VENDOR_ID_AT && + } 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) + val |= 3; + } + lp->a.write_bcr (ioaddr, 9, val); + } + + /* set/reset GPSI bit in test register */ + val = lp->a.read_csr (ioaddr, 124) & ~0x10; + if ((lp->options & PCNET32_PORT_PORTSEL) == PCNET32_PORT_GPSI) + val |= 0x10; + lp->a.write_csr (ioaddr, 124, val); + + /* Allied Telesyn AT 2700/2701 FX are 100Mbit only and do not negotiate */ + if (lp->pci_dev->subsystem_vendor == PCI_VENDOR_ID_AT && (lp->pci_dev->subsystem_device == PCI_SUBDEVICE_ID_AT_2700FX || lp->pci_dev->subsystem_device == PCI_SUBDEVICE_ID_AT_2701FX)) { - if (lp->options & PCNET32_PORT_ASEL) { - lp->options = PCNET32_PORT_FD | PCNET32_PORT_100; - if (netif_msg_link(lp)) - printk(KERN_DEBUG - "%s: Setting 100Mb-Full Duplex.\n", - dev->name); - } - } - if (lp->phycount < 2) { - /* - * 24 Jun 2004 according AMD, in order to change the PHY, - * DANAS (or DISPM for 79C976) must be set; then select the speed, - * duplex, and/or enable auto negotiation, and clear DANAS - */ - if (lp->mii && !(lp->options & PCNET32_PORT_ASEL)) { - lp->a.write_bcr(ioaddr, 32, - lp->a.read_bcr(ioaddr, 32) | 0x0080); - /* disable Auto Negotiation, set 10Mpbs, HD */ - val = lp->a.read_bcr(ioaddr, 32) & ~0xb8; - if (lp->options & PCNET32_PORT_FD) - val |= 0x10; - if (lp->options & PCNET32_PORT_100) - val |= 0x08; - lp->a.write_bcr(ioaddr, 32, val); - } else { - if (lp->options & PCNET32_PORT_ASEL) { - lp->a.write_bcr(ioaddr, 32, - lp->a.read_bcr(ioaddr, - 32) | 0x0080); - /* enable auto negotiate, setup, disable fd */ - val = lp->a.read_bcr(ioaddr, 32) & ~0x98; - val |= 0x20; - lp->a.write_bcr(ioaddr, 32, val); - } - } + if (lp->options & PCNET32_PORT_ASEL) { + lp->options = PCNET32_PORT_FD | PCNET32_PORT_100; + if (netif_msg_link(lp)) + printk(KERN_DEBUG "%s: Setting 100Mb-Full Duplex.\n", + dev->name); + } + } + { + /* + * 24 Jun 2004 according AMD, in order to change the PHY, + * DANAS (or DISPM for 79C976) must be set; then select the speed, + * duplex, and/or enable auto negotiation, and clear DANAS + */ + if (lp->mii && !(lp->options & PCNET32_PORT_ASEL)) { + lp->a.write_bcr(ioaddr, 32, + lp->a.read_bcr(ioaddr, 32) | 0x0080); + /* disable Auto Negotiation, set 10Mpbs, HD */ + val = lp->a.read_bcr(ioaddr, 32) & ~0xb8; + if (lp->options & PCNET32_PORT_FD) + val |= 0x10; + if (lp->options & PCNET32_PORT_100) + val |= 0x08; + lp->a.write_bcr (ioaddr, 32, val); } else { - int first_phy = -1; - u16 bmcr; - u32 bcr9; - struct ethtool_cmd ecmd; - - /* - * There is really no good other way to handle multiple PHYs - * other than turning off all automatics - */ - val = lp->a.read_bcr(ioaddr, 2); - lp->a.write_bcr(ioaddr, 2, val & ~2); - val = lp->a.read_bcr(ioaddr, 32); - lp->a.write_bcr(ioaddr, 32, val & ~(1 << 7)); /* stop MII manager */ - - if (!(lp->options & PCNET32_PORT_ASEL)) { - /* setup ecmd */ - ecmd.port = PORT_MII; - ecmd.transceiver = XCVR_INTERNAL; - ecmd.autoneg = AUTONEG_DISABLE; - ecmd.speed = - lp-> - options & PCNET32_PORT_100 ? SPEED_100 : SPEED_10; - bcr9 = lp->a.read_bcr(ioaddr, 9); - - if (lp->options & PCNET32_PORT_FD) { - ecmd.duplex = DUPLEX_FULL; - bcr9 |= (1 << 0); - } else { - ecmd.duplex = DUPLEX_HALF; - bcr9 |= ~(1 << 0); - } - lp->a.write_bcr(ioaddr, 9, bcr9); - } - - for (i = 0; i < PCNET32_MAX_PHYS; i++) { - if (lp->phymask & (1 << i)) { - /* isolate all but the first PHY */ - bmcr = mdio_read(dev, i, MII_BMCR); - if (first_phy == -1) { - first_phy = i; - mdio_write(dev, i, MII_BMCR, - bmcr & ~BMCR_ISOLATE); - } else { - mdio_write(dev, i, MII_BMCR, - bmcr | BMCR_ISOLATE); - } - /* use mii_ethtool_sset to setup PHY */ - lp->mii_if.phy_id = i; - ecmd.phy_address = i; - if (lp->options & PCNET32_PORT_ASEL) { - mii_ethtool_gset(&lp->mii_if, &ecmd); - ecmd.autoneg = AUTONEG_ENABLE; - } - mii_ethtool_sset(&lp->mii_if, &ecmd); - } - } - lp->mii_if.phy_id = first_phy; - if (netif_msg_link(lp)) - printk(KERN_INFO "%s: Using PHY number %d.\n", - dev->name, first_phy); + if (lp->options & PCNET32_PORT_ASEL) { + lp->a.write_bcr(ioaddr, 32, + lp->a.read_bcr(ioaddr, 32) | 0x0080); + /* enable auto negotiate, setup, disable fd */ + val = lp->a.read_bcr(ioaddr, 32) & ~0x98; + val |= 0x20; + lp->a.write_bcr(ioaddr, 32, val); + } } + } #ifdef DO_DXSUFLO - if (lp->dxsuflo) { /* Disable transmit stop on underflow */ - val = lp->a.read_csr(ioaddr, 3); - val |= 0x40; - lp->a.write_csr(ioaddr, 3, val); - } + if (lp->dxsuflo) { /* Disable transmit stop on underflow */ + val = lp->a.read_csr (ioaddr, 3); + val |= 0x40; + lp->a.write_csr (ioaddr, 3, val); + } #endif - lp->init_block.mode = - le16_to_cpu((lp->options & PCNET32_PORT_PORTSEL) << 7); - pcnet32_load_multicast(dev); - - if (pcnet32_init_ring(dev)) { - rc = -ENOMEM; - goto err_free_ring; - } - - /* Re-initialize the PCNET32, and start it when done. */ - lp->a.write_csr(ioaddr, 1, (lp->dma_addr + - offsetof(struct pcnet32_private, - init_block)) & 0xffff); - lp->a.write_csr(ioaddr, 2, - (lp->dma_addr + - offsetof(struct pcnet32_private, init_block)) >> 16); - - lp->a.write_csr(ioaddr, 4, 0x0915); - lp->a.write_csr(ioaddr, 0, 0x0001); - - netif_start_queue(dev); - - 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) - if (lp->a.read_csr(ioaddr, 0) & 0x0100) - break; - /* - * We used to clear the InitDone bit, 0x0100, here but Mark Stockton - * reports that doing so triggers a bug in the '974. - */ - lp->a.write_csr(ioaddr, 0, 0x0042); - - if (netif_msg_ifup(lp)) - printk(KERN_DEBUG - "%s: pcnet32 open after %d ticks, init block %#x csr0 %4.4x.\n", - dev->name, i, - (u32) (lp->dma_addr + - offsetof(struct pcnet32_private, init_block)), - lp->a.read_csr(ioaddr, 0)); - - spin_unlock_irqrestore(&lp->lock, flags); - - return 0; /* Always succeed */ - - err_free_ring: - /* free any allocated skbuffs */ - pcnet32_purge_rx_ring(dev); - - /* - * Switch back to 16bit mode to avoid problems with dumb - * DOS packet driver after a warm reboot - */ - lp->a.write_bcr(ioaddr, 20, 4); - - err_free_irq: - spin_unlock_irqrestore(&lp->lock, flags); - free_irq(dev->irq, dev); - return rc; + lp->init_block.mode = le16_to_cpu((lp->options & PCNET32_PORT_PORTSEL) << 7); + pcnet32_load_multicast(dev); + + if (pcnet32_init_ring(dev)) { + rc = -ENOMEM; + goto err_free_ring; + } + + /* Re-initialize the PCNET32, and start it when done. */ + lp->a.write_csr (ioaddr, 1, (lp->dma_addr + + offsetof(struct pcnet32_private, init_block)) & 0xffff); + lp->a.write_csr (ioaddr, 2, (lp->dma_addr + + offsetof(struct pcnet32_private, init_block)) >> 16); + + lp->a.write_csr (ioaddr, 4, 0x0915); + lp->a.write_csr (ioaddr, 0, 0x0001); + + netif_start_queue(dev); + + /* If we have mii, print the link status and start the watchdog */ + if (lp->mii) { + mii_check_media (&lp->mii_if, netif_msg_link(lp), 1); + mod_timer (&(lp->watchdog_timer), PCNET32_WATCHDOG_TIMEOUT); + } + + i = 0; + while (i++ < 100) + if (lp->a.read_csr (ioaddr, 0) & 0x0100) + break; + /* + * We used to clear the InitDone bit, 0x0100, here but Mark Stockton + * reports that doing so triggers a bug in the '974. + */ + lp->a.write_csr (ioaddr, 0, 0x0042); + + if (netif_msg_ifup(lp)) + printk(KERN_DEBUG "%s: pcnet32 open after %d ticks, init block %#x csr0 %4.4x.\n", + dev->name, i, (u32) (lp->dma_addr + + offsetof(struct pcnet32_private, init_block)), + lp->a.read_csr(ioaddr, 0)); + + spin_unlock_irqrestore(&lp->lock, flags); + + return 0; /* Always succeed */ + +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_free_ring(dev); + + /* + * Switch back to 16bit mode to avoid problems with dumb + * DOS packet driver after a warm reboot + */ + lp->a.write_bcr (ioaddr, 20, 4); + +err_free_irq: + spin_unlock_irqrestore(&lp->lock, flags); + free_irq(dev->irq, dev); + return rc; } /* @@ -2050,889 +1746,727 @@ static int pcnet32_open(struct net_device *dev) * restarting the chip, but I'm too lazy to do so right now. dplatt@3do.com */ -static void pcnet32_purge_tx_ring(struct net_device *dev) +static void +pcnet32_purge_tx_ring(struct net_device *dev) { - struct pcnet32_private *lp = dev->priv; - int i; + struct pcnet32_private *lp = dev->priv; + int i; - 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_any(lp->tx_skbuff[i]); - } - lp->tx_skbuff[i] = NULL; - lp->tx_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_any(lp->tx_skbuff[i]); } + lp->tx_skbuff[i] = NULL; + lp->tx_dma_addr[i] = 0; + } } -/* Initialize the PCNET32 Rx and Tx rings. */ -static int pcnet32_init_ring(struct net_device *dev) -{ - struct pcnet32_private *lp = dev->priv; - int i; - - lp->tx_full = 0; - lp->cur_rx = lp->cur_tx = 0; - lp->dirty_rx = lp->dirty_tx = 0; - - for (i = 0; i < lp->rx_ring_size; i++) { - struct sk_buff *rx_skbuff = lp->rx_skbuff[i]; - if (rx_skbuff == NULL) { - if (! - (rx_skbuff = lp->rx_skbuff[i] = - dev_alloc_skb(PKT_BUF_SZ))) { - /* there is not much, we can do at this point */ - if (pcnet32_debug & NETIF_MSG_DRV) - printk(KERN_ERR - "%s: pcnet32_init_ring dev_alloc_skb failed.\n", - dev->name); - return -1; - } - skb_reserve(rx_skbuff, 2); - } - rmb(); - if (lp->rx_dma_addr[i] == 0) - lp->rx_dma_addr[i] = - pci_map_single(lp->pci_dev, rx_skbuff->data, - PKT_BUF_SZ - 2, PCI_DMA_FROMDEVICE); - lp->rx_ring[i].base = (u32) le32_to_cpu(lp->rx_dma_addr[i]); - lp->rx_ring[i].buf_length = le16_to_cpu(2 - PKT_BUF_SZ); - wmb(); /* Make sure owner changes after all others are visible */ - lp->rx_ring[i].status = le16_to_cpu(0x8000); - } - /* The Tx buffer address is filled in as needed, but we do need to clear - * the upper ownership bit. */ - 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 */ - lp->tx_ring[i].base = 0; - lp->tx_dma_addr[i] = 0; - } - - lp->init_block.tlen_rlen = - le16_to_cpu(lp->tx_len_bits | lp->rx_len_bits); - for (i = 0; i < 6; i++) - lp->init_block.phys_addr[i] = dev->dev_addr[i]; - lp->init_block.rx_ring = (u32) le32_to_cpu(lp->rx_ring_dma_addr); - lp->init_block.tx_ring = (u32) le32_to_cpu(lp->tx_ring_dma_addr); - wmb(); /* Make sure all changes are visible */ - return 0; +/* Initialize the PCNET32 Rx and Tx rings. */ +static int +pcnet32_init_ring(struct net_device *dev) +{ + struct pcnet32_private *lp = dev->priv; + int i; + + lp->tx_full = 0; + lp->cur_rx = lp->cur_tx = 0; + lp->dirty_rx = lp->dirty_tx = 0; + + for (i = 0; i < lp->rx_ring_size; i++) { + struct sk_buff *rx_skbuff = lp->rx_skbuff[i]; + if (rx_skbuff == NULL) { + if (!(rx_skbuff = lp->rx_skbuff[i] = dev_alloc_skb (PKT_BUF_SZ))) { + /* there is not much, we can do at this point */ + if (pcnet32_debug & NETIF_MSG_DRV) + printk(KERN_ERR "%s: pcnet32_init_ring dev_alloc_skb failed.\n", + dev->name); + return -1; + } + skb_reserve (rx_skbuff, 2); + } + + rmb(); + if (lp->rx_dma_addr[i] == 0) + lp->rx_dma_addr[i] = pci_map_single(lp->pci_dev, rx_skbuff->data, + PKT_BUF_SZ-2, PCI_DMA_FROMDEVICE); + lp->rx_ring[i].base = (u32)le32_to_cpu(lp->rx_dma_addr[i]); + lp->rx_ring[i].buf_length = le16_to_cpu(2-PKT_BUF_SZ); + wmb(); /* Make sure owner changes after all others are visible */ + lp->rx_ring[i].status = le16_to_cpu(0x8000); + } + /* The Tx buffer address is filled in as needed, but we do need to clear + * the upper ownership bit. */ + 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 */ + lp->tx_ring[i].base = 0; + lp->tx_dma_addr[i] = 0; + } + + lp->init_block.tlen_rlen = le16_to_cpu(lp->tx_len_bits | lp->rx_len_bits); + for (i = 0; i < 6; i++) + lp->init_block.phys_addr[i] = dev->dev_addr[i]; + lp->init_block.rx_ring = (u32)le32_to_cpu(lp->rx_ring_dma_addr); + lp->init_block.tx_ring = (u32)le32_to_cpu(lp->tx_ring_dma_addr); + wmb(); /* Make sure all changes are visible */ + return 0; } /* the pcnet32 has been issued a stop or reset. Wait for the stop bit * then flush the pending transmit operations, re-initialize the ring, * and tell the chip to initialize. */ -static void pcnet32_restart(struct net_device *dev, unsigned int csr0_bits) +static void +pcnet32_restart(struct net_device *dev, unsigned int csr0_bits) { - struct pcnet32_private *lp = dev->priv; - unsigned long ioaddr = dev->base_addr; - int i; + struct pcnet32_private *lp = dev->priv; + unsigned long ioaddr = dev->base_addr; + int i; - /* wait for stop */ - for (i = 0; i < 100; i++) - if (lp->a.read_csr(ioaddr, 0) & 0x0004) - break; + /* wait for stop */ + for (i=0; i<100; i++) + if (lp->a.read_csr(ioaddr, 0) & 0x0004) + break; - if (i >= 100 && netif_msg_drv(lp)) - printk(KERN_ERR - "%s: pcnet32_restart timed out waiting for stop.\n", - dev->name); + if (i >= 100 && netif_msg_drv(lp)) + printk(KERN_ERR "%s: pcnet32_restart timed out waiting for stop.\n", + dev->name); - pcnet32_purge_tx_ring(dev); - if (pcnet32_init_ring(dev)) - return; + pcnet32_purge_tx_ring(dev); + if (pcnet32_init_ring(dev)) + return; - /* ReInit Ring */ - lp->a.write_csr(ioaddr, 0, 1); - i = 0; - while (i++ < 1000) - if (lp->a.read_csr(ioaddr, 0) & 0x0100) - break; + /* ReInit Ring */ + lp->a.write_csr (ioaddr, 0, 1); + i = 0; + while (i++ < 1000) + if (lp->a.read_csr (ioaddr, 0) & 0x0100) + break; - lp->a.write_csr(ioaddr, 0, csr0_bits); + lp->a.write_csr (ioaddr, 0, csr0_bits); } -static void pcnet32_tx_timeout(struct net_device *dev) + +static void +pcnet32_tx_timeout (struct net_device *dev) { - struct pcnet32_private *lp = dev->priv; - unsigned long ioaddr = dev->base_addr, flags; + struct pcnet32_private *lp = dev->priv; + unsigned long ioaddr = dev->base_addr, flags; - spin_lock_irqsave(&lp->lock, flags); - /* Transmitter timeout, serious problems. */ - if (pcnet32_debug & NETIF_MSG_DRV) - printk(KERN_ERR - "%s: transmit timed out, status %4.4x, resetting.\n", - dev->name, lp->a.read_csr(ioaddr, 0)); - lp->a.write_csr(ioaddr, 0, 0x0004); - lp->stats.tx_errors++; - if (netif_msg_tx_err(lp)) { - int i; - printk(KERN_DEBUG - " Ring data dump: dirty_tx %d cur_tx %d%s cur_rx %d.", - lp->dirty_tx, lp->cur_tx, lp->tx_full ? " (full)" : "", - lp->cur_rx); - for (i = 0; i < lp->rx_ring_size; i++) - printk("%s %08x %04x %08x %04x", i & 1 ? "" : "\n ", - le32_to_cpu(lp->rx_ring[i].base), - (-le16_to_cpu(lp->rx_ring[i].buf_length)) & - 0xffff, le32_to_cpu(lp->rx_ring[i].msg_length), - le16_to_cpu(lp->rx_ring[i].status)); - for (i = 0; i < lp->tx_ring_size; i++) - printk("%s %08x %04x %08x %04x", i & 1 ? "" : "\n ", - le32_to_cpu(lp->tx_ring[i].base), - (-le16_to_cpu(lp->tx_ring[i].length)) & 0xffff, - le32_to_cpu(lp->tx_ring[i].misc), - le16_to_cpu(lp->tx_ring[i].status)); - printk("\n"); - } - pcnet32_restart(dev, 0x0042); + spin_lock_irqsave(&lp->lock, flags); + /* Transmitter timeout, serious problems. */ + if (pcnet32_debug & NETIF_MSG_DRV) + printk(KERN_ERR "%s: transmit timed out, status %4.4x, resetting.\n", + dev->name, lp->a.read_csr(ioaddr, 0)); + lp->a.write_csr (ioaddr, 0, 0x0004); + lp->stats.tx_errors++; + if (netif_msg_tx_err(lp)) { + int i; + printk(KERN_DEBUG " Ring data dump: dirty_tx %d cur_tx %d%s cur_rx %d.", + lp->dirty_tx, lp->cur_tx, lp->tx_full ? " (full)" : "", + lp->cur_rx); + for (i = 0 ; i < lp->rx_ring_size; i++) + printk("%s %08x %04x %08x %04x", i & 1 ? "" : "\n ", + le32_to_cpu(lp->rx_ring[i].base), + (-le16_to_cpu(lp->rx_ring[i].buf_length)) & 0xffff, + le32_to_cpu(lp->rx_ring[i].msg_length), + le16_to_cpu(lp->rx_ring[i].status)); + for (i = 0 ; i < lp->tx_ring_size; i++) + printk("%s %08x %04x %08x %04x", i & 1 ? "" : "\n ", + le32_to_cpu(lp->tx_ring[i].base), + (-le16_to_cpu(lp->tx_ring[i].length)) & 0xffff, + le32_to_cpu(lp->tx_ring[i].misc), + le16_to_cpu(lp->tx_ring[i].status)); + printk("\n"); + } + pcnet32_restart(dev, 0x0042); - dev->trans_start = jiffies; - netif_wake_queue(dev); + dev->trans_start = jiffies; + netif_wake_queue(dev); - spin_unlock_irqrestore(&lp->lock, flags); + spin_unlock_irqrestore(&lp->lock, flags); } -static int pcnet32_start_xmit(struct sk_buff *skb, struct net_device *dev) + +static int +pcnet32_start_xmit(struct sk_buff *skb, struct net_device *dev) { - struct pcnet32_private *lp = dev->priv; - unsigned long ioaddr = dev->base_addr; - u16 status; - int entry; - unsigned long flags; + struct pcnet32_private *lp = dev->priv; + unsigned long ioaddr = dev->base_addr; + u16 status; + int entry; + unsigned long flags; - spin_lock_irqsave(&lp->lock, flags); + spin_lock_irqsave(&lp->lock, flags); - if (netif_msg_tx_queued(lp)) { - printk(KERN_DEBUG - "%s: pcnet32_start_xmit() called, csr0 %4.4x.\n", - dev->name, lp->a.read_csr(ioaddr, 0)); - } + if (netif_msg_tx_queued(lp)) { + printk(KERN_DEBUG "%s: pcnet32_start_xmit() called, csr0 %4.4x.\n", + dev->name, lp->a.read_csr(ioaddr, 0)); + } - /* Default status -- will not enable Successful-TxDone - * interrupt when that option is available to us. - */ - status = 0x8300; + /* Default status -- will not enable Successful-TxDone + * interrupt when that option is available to us. + */ + status = 0x8300; - /* Fill in a Tx ring entry */ + /* Fill in a Tx ring entry */ - /* Mask to ring buffer boundary. */ - entry = lp->cur_tx & lp->tx_mod_mask; + /* Mask to ring buffer boundary. */ + entry = lp->cur_tx & lp->tx_mod_mask; - /* Caution: the write order is important here, set the status - * with the "ownership" bits last. */ + /* Caution: the write order is important here, set the status + * with the "ownership" bits last. */ - lp->tx_ring[entry].length = le16_to_cpu(-skb->len); + lp->tx_ring[entry].length = le16_to_cpu(-skb->len); - lp->tx_ring[entry].misc = 0x00000000; + lp->tx_ring[entry].misc = 0x00000000; - lp->tx_skbuff[entry] = skb; - lp->tx_dma_addr[entry] = - pci_map_single(lp->pci_dev, skb->data, skb->len, PCI_DMA_TODEVICE); - lp->tx_ring[entry].base = (u32) le32_to_cpu(lp->tx_dma_addr[entry]); - wmb(); /* Make sure owner changes after all others are visible */ - lp->tx_ring[entry].status = le16_to_cpu(status); + lp->tx_skbuff[entry] = skb; + lp->tx_dma_addr[entry] = pci_map_single(lp->pci_dev, skb->data, skb->len, + PCI_DMA_TODEVICE); + lp->tx_ring[entry].base = (u32)le32_to_cpu(lp->tx_dma_addr[entry]); + wmb(); /* Make sure owner changes after all others are visible */ + lp->tx_ring[entry].status = le16_to_cpu(status); - lp->cur_tx++; - lp->stats.tx_bytes += skb->len; + lp->cur_tx++; + lp->stats.tx_bytes += skb->len; - /* Trigger an immediate send poll. */ - lp->a.write_csr(ioaddr, 0, 0x0048); + /* Trigger an immediate send poll. */ + lp->a.write_csr (ioaddr, 0, 0x0048); - dev->trans_start = jiffies; + dev->trans_start = jiffies; - if (lp->tx_ring[(entry + 1) & lp->tx_mod_mask].base != 0) { - lp->tx_full = 1; - netif_stop_queue(dev); - } - spin_unlock_irqrestore(&lp->lock, flags); - return 0; + if (lp->tx_ring[(entry+1) & lp->tx_mod_mask].base != 0) { + lp->tx_full = 1; + netif_stop_queue(dev); + } + spin_unlock_irqrestore(&lp->lock, flags); + return 0; } /* The PCNET32 interrupt handler. */ static irqreturn_t -pcnet32_interrupt(int irq, void *dev_id, struct pt_regs *regs) +pcnet32_interrupt(int irq, void *dev_id, struct pt_regs * regs) { - struct net_device *dev = dev_id; - struct pcnet32_private *lp; - unsigned long ioaddr; - u16 csr0, rap; - int boguscnt = max_interrupt_work; - int must_restart; - - if (!dev) { - if (pcnet32_debug & NETIF_MSG_INTR) - printk(KERN_DEBUG "%s(): irq %d for unknown device\n", - __FUNCTION__, irq); - return IRQ_NONE; - } - - ioaddr = dev->base_addr; - lp = dev->priv; - - spin_lock(&lp->lock); - - rap = lp->a.read_rap(ioaddr); - while ((csr0 = lp->a.read_csr(ioaddr, 0)) & 0x8f00 && --boguscnt >= 0) { - if (csr0 == 0xffff) { - break; /* PCMCIA remove happened */ - } - /* Acknowledge all of the current interrupt sources ASAP. */ - lp->a.write_csr(ioaddr, 0, csr0 & ~0x004f); - - must_restart = 0; - - if (netif_msg_intr(lp)) - printk(KERN_DEBUG - "%s: interrupt csr0=%#2.2x new csr=%#2.2x.\n", - dev->name, csr0, lp->a.read_csr(ioaddr, 0)); - - if (csr0 & 0x0400) /* Rx interrupt */ - pcnet32_rx(dev); - - if (csr0 & 0x0200) { /* Tx-done interrupt */ - unsigned int dirty_tx = lp->dirty_tx; - int delta; - - while (dirty_tx != lp->cur_tx) { - int entry = dirty_tx & lp->tx_mod_mask; - int status = - (short)le16_to_cpu(lp->tx_ring[entry]. - status); - - if (status < 0) - break; /* It still hasn't been Txed */ - - lp->tx_ring[entry].base = 0; - - if (status & 0x4000) { - /* There was an major error, log it. */ - int err_status = - le32_to_cpu(lp->tx_ring[entry]. - misc); - lp->stats.tx_errors++; - if (netif_msg_tx_err(lp)) - printk(KERN_ERR - "%s: Tx error status=%04x err_status=%08x\n", - dev->name, status, - err_status); - if (err_status & 0x04000000) - lp->stats.tx_aborted_errors++; - if (err_status & 0x08000000) - lp->stats.tx_carrier_errors++; - if (err_status & 0x10000000) - lp->stats.tx_window_errors++; -#ifndef DO_DXSUFLO - if (err_status & 0x40000000) { - lp->stats.tx_fifo_errors++; - /* Ackk! On FIFO errors the Tx unit is turned off! */ - /* Remove this verbosity later! */ - if (netif_msg_tx_err(lp)) - printk(KERN_ERR - "%s: Tx FIFO error! CSR0=%4.4x\n", - dev->name, csr0); - must_restart = 1; - } -#else - if (err_status & 0x40000000) { - lp->stats.tx_fifo_errors++; - if (!lp->dxsuflo) { /* If controller doesn't recover ... */ - /* Ackk! On FIFO errors the Tx unit is turned off! */ - /* Remove this verbosity later! */ - if (netif_msg_tx_err - (lp)) - printk(KERN_ERR - "%s: Tx FIFO error! CSR0=%4.4x\n", - dev-> - name, - csr0); - must_restart = 1; - } - } -#endif - } else { - if (status & 0x1800) - lp->stats.collisions++; - lp->stats.tx_packets++; - } - - /* We must free the original skb */ - if (lp->tx_skbuff[entry]) { - pci_unmap_single(lp->pci_dev, - lp->tx_dma_addr[entry], - lp->tx_skbuff[entry]-> - len, PCI_DMA_TODEVICE); - dev_kfree_skb_irq(lp->tx_skbuff[entry]); - lp->tx_skbuff[entry] = NULL; - lp->tx_dma_addr[entry] = 0; - } - dirty_tx++; - } + struct net_device *dev = dev_id; + struct pcnet32_private *lp; + unsigned long ioaddr; + u16 csr0,rap; + int boguscnt = max_interrupt_work; + int must_restart; - delta = - (lp->cur_tx - dirty_tx) & (lp->tx_mod_mask + - lp->tx_ring_size); - if (delta > lp->tx_ring_size) { - if (netif_msg_drv(lp)) - printk(KERN_ERR - "%s: out-of-sync dirty pointer, %d vs. %d, full=%d.\n", - dev->name, dirty_tx, lp->cur_tx, - lp->tx_full); - dirty_tx += lp->tx_ring_size; - delta -= lp->tx_ring_size; - } + if (!dev) { + if (pcnet32_debug & NETIF_MSG_INTR) + printk (KERN_DEBUG "%s(): irq %d for unknown device\n", + __FUNCTION__, irq); + return IRQ_NONE; + } - if (lp->tx_full && - netif_queue_stopped(dev) && - delta < lp->tx_ring_size - 2) { - /* The ring is no longer full, clear tbusy. */ - lp->tx_full = 0; - netif_wake_queue(dev); - } - lp->dirty_tx = dirty_tx; - } + ioaddr = dev->base_addr; + lp = dev->priv; - /* Log misc errors. */ - if (csr0 & 0x4000) - lp->stats.tx_errors++; /* Tx babble. */ - if (csr0 & 0x1000) { - /* - * this happens when our receive ring is full. This shouldn't - * be a problem as we will see normal rx interrupts for the frames - * in the receive ring. But there are some PCI chipsets (I can - * reproduce this on SP3G with Intel saturn chipset) which have - * sometimes problems and will fill up the receive ring with - * error descriptors. In this situation we don't get a rx - * interrupt, but a missed frame interrupt sooner or later. - * So we try to clean up our receive ring here. - */ - pcnet32_rx(dev); - lp->stats.rx_errors++; /* Missed a Rx frame. */ - } - if (csr0 & 0x0800) { - if (netif_msg_drv(lp)) - printk(KERN_ERR - "%s: Bus master arbitration failure, status %4.4x.\n", - dev->name, csr0); - /* unlike for the lance, there is no restart needed */ - } + spin_lock(&lp->lock); - if (must_restart) { - /* reset the chip to clear the error condition, then restart */ - lp->a.reset(ioaddr); - lp->a.write_csr(ioaddr, 4, 0x0915); - pcnet32_restart(dev, 0x0002); - netif_wake_queue(dev); - } + rap = lp->a.read_rap(ioaddr); + while ((csr0 = lp->a.read_csr (ioaddr, 0)) & 0x8f00 && --boguscnt >= 0) { + if (csr0 == 0xffff) { + break; /* PCMCIA remove happened */ } + /* Acknowledge all of the current interrupt sources ASAP. */ + lp->a.write_csr (ioaddr, 0, csr0 & ~0x004f); - /* Set interrupt enable. */ - lp->a.write_csr(ioaddr, 0, 0x0040); - lp->a.write_rap(ioaddr, rap); + must_restart = 0; if (netif_msg_intr(lp)) - printk(KERN_DEBUG "%s: exiting interrupt, csr0=%#4.4x.\n", - dev->name, lp->a.read_csr(ioaddr, 0)); + printk(KERN_DEBUG "%s: interrupt csr0=%#2.2x new csr=%#2.2x.\n", + dev->name, csr0, lp->a.read_csr (ioaddr, 0)); + + if (csr0 & 0x0400) /* Rx interrupt */ + pcnet32_rx(dev); + + if (csr0 & 0x0200) { /* Tx-done interrupt */ + unsigned int dirty_tx = lp->dirty_tx; + int delta; + + while (dirty_tx != lp->cur_tx) { + int entry = dirty_tx & lp->tx_mod_mask; + int status = (short)le16_to_cpu(lp->tx_ring[entry].status); + + if (status < 0) + break; /* It still hasn't been Txed */ + + lp->tx_ring[entry].base = 0; + + if (status & 0x4000) { + /* There was an major error, log it. */ + int err_status = le32_to_cpu(lp->tx_ring[entry].misc); + lp->stats.tx_errors++; + if (netif_msg_tx_err(lp)) + printk(KERN_ERR "%s: Tx error status=%04x err_status=%08x\n", + dev->name, status, err_status); + if (err_status & 0x04000000) lp->stats.tx_aborted_errors++; + if (err_status & 0x08000000) lp->stats.tx_carrier_errors++; + if (err_status & 0x10000000) lp->stats.tx_window_errors++; +#ifndef DO_DXSUFLO + if (err_status & 0x40000000) { + lp->stats.tx_fifo_errors++; + /* Ackk! On FIFO errors the Tx unit is turned off! */ + /* Remove this verbosity later! */ + if (netif_msg_tx_err(lp)) + printk(KERN_ERR "%s: Tx FIFO error! CSR0=%4.4x\n", + dev->name, csr0); + must_restart = 1; + } +#else + if (err_status & 0x40000000) { + lp->stats.tx_fifo_errors++; + if (! lp->dxsuflo) { /* If controller doesn't recover ... */ + /* Ackk! On FIFO errors the Tx unit is turned off! */ + /* Remove this verbosity later! */ + if (netif_msg_tx_err(lp)) + printk(KERN_ERR "%s: Tx FIFO error! CSR0=%4.4x\n", + dev->name, csr0); + must_restart = 1; + } + } +#endif + } else { + if (status & 0x1800) + lp->stats.collisions++; + lp->stats.tx_packets++; + } - spin_unlock(&lp->lock); + /* We must free the original skb */ + if (lp->tx_skbuff[entry]) { + pci_unmap_single(lp->pci_dev, lp->tx_dma_addr[entry], + lp->tx_skbuff[entry]->len, PCI_DMA_TODEVICE); + dev_kfree_skb_irq(lp->tx_skbuff[entry]); + lp->tx_skbuff[entry] = NULL; + lp->tx_dma_addr[entry] = 0; + } + dirty_tx++; + } - return IRQ_HANDLED; -} + delta = (lp->cur_tx - dirty_tx) & (lp->tx_mod_mask + lp->tx_ring_size); + if (delta > lp->tx_ring_size) { + if (netif_msg_drv(lp)) + printk(KERN_ERR "%s: out-of-sync dirty pointer, %d vs. %d, full=%d.\n", + dev->name, dirty_tx, lp->cur_tx, lp->tx_full); + dirty_tx += lp->tx_ring_size; + delta -= lp->tx_ring_size; + } + + if (lp->tx_full && + netif_queue_stopped(dev) && + delta < lp->tx_ring_size - 2) { + /* The ring is no longer full, clear tbusy. */ + lp->tx_full = 0; + netif_wake_queue (dev); + } + lp->dirty_tx = dirty_tx; + } + + /* Log misc errors. */ + if (csr0 & 0x4000) lp->stats.tx_errors++; /* Tx babble. */ + if (csr0 & 0x1000) { + /* + * this happens when our receive ring is full. This shouldn't + * be a problem as we will see normal rx interrupts for the frames + * in the receive ring. But there are some PCI chipsets (I can + * reproduce this on SP3G with Intel saturn chipset) which have + * sometimes problems and will fill up the receive ring with + * error descriptors. In this situation we don't get a rx + * interrupt, but a missed frame interrupt sooner or later. + * So we try to clean up our receive ring here. + */ + pcnet32_rx(dev); + lp->stats.rx_errors++; /* Missed a Rx frame. */ + } + if (csr0 & 0x0800) { + if (netif_msg_drv(lp)) + printk(KERN_ERR "%s: Bus master arbitration failure, status %4.4x.\n", + dev->name, csr0); + /* unlike for the lance, there is no restart needed */ + } + + if (must_restart) { + /* reset the chip to clear the error condition, then restart */ + lp->a.reset(ioaddr); + lp->a.write_csr(ioaddr, 4, 0x0915); + pcnet32_restart(dev, 0x0002); + netif_wake_queue(dev); + } + } + + /* Set interrupt enable. */ + lp->a.write_csr (ioaddr, 0, 0x0040); + lp->a.write_rap (ioaddr,rap); + + if (netif_msg_intr(lp)) + printk(KERN_DEBUG "%s: exiting interrupt, csr0=%#4.4x.\n", + dev->name, lp->a.read_csr (ioaddr, 0)); + + spin_unlock(&lp->lock); + + return IRQ_HANDLED; +} + +static int +pcnet32_rx(struct net_device *dev) +{ + struct pcnet32_private *lp = dev->priv; + int entry = lp->cur_rx & lp->rx_mod_mask; + int boguscnt = lp->rx_ring_size / 2; + + /* If we own the next entry, it's a new packet. Send it up. */ + while ((short)le16_to_cpu(lp->rx_ring[entry].status) >= 0) { + int status = (short)le16_to_cpu(lp->rx_ring[entry].status) >> 8; + + if (status != 0x03) { /* There was an error. */ + /* + * There is a tricky error noted by John Murphy, + * to Russ Nelson: Even with full-sized + * buffers it's possible for a jabber packet to use two + * buffers, with only the last correctly noting the error. + */ + if (status & 0x01) /* Only count a general error at the */ + lp->stats.rx_errors++; /* end of a packet.*/ + if (status & 0x20) lp->stats.rx_frame_errors++; + if (status & 0x10) lp->stats.rx_over_errors++; + if (status & 0x08) lp->stats.rx_crc_errors++; + if (status & 0x04) lp->stats.rx_fifo_errors++; + lp->rx_ring[entry].status &= le16_to_cpu(0x03ff); + } else { + /* Malloc up new buffer, compatible with net-2e. */ + short pkt_len = (le32_to_cpu(lp->rx_ring[entry].msg_length) & 0xfff)-4; + struct sk_buff *skb; -static int pcnet32_rx(struct net_device *dev) -{ - struct pcnet32_private *lp = dev->priv; - int entry = lp->cur_rx & lp->rx_mod_mask; - int boguscnt = lp->rx_ring_size / 2; - - /* If we own the next entry, it's a new packet. Send it up. */ - while ((short)le16_to_cpu(lp->rx_ring[entry].status) >= 0) { - int status = (short)le16_to_cpu(lp->rx_ring[entry].status) >> 8; - - if (status != 0x03) { /* There was an error. */ - /* - * There is a tricky error noted by John Murphy, - * to Russ Nelson: Even with full-sized - * buffers it's possible for a jabber packet to use two - * buffers, with only the last correctly noting the error. - */ - if (status & 0x01) /* Only count a general error at the */ - lp->stats.rx_errors++; /* end of a packet. */ - if (status & 0x20) - lp->stats.rx_frame_errors++; - if (status & 0x10) - lp->stats.rx_over_errors++; - if (status & 0x08) - lp->stats.rx_crc_errors++; - if (status & 0x04) - lp->stats.rx_fifo_errors++; - lp->rx_ring[entry].status &= le16_to_cpu(0x03ff); + /* Discard oversize frames. */ + if (unlikely(pkt_len > PKT_BUF_SZ - 2)) { + if (netif_msg_drv(lp)) + printk(KERN_ERR "%s: Impossible packet size %d!\n", + dev->name, pkt_len); + lp->stats.rx_errors++; + } else if (pkt_len < 60) { + if (netif_msg_rx_err(lp)) + printk(KERN_ERR "%s: Runt packet!\n", dev->name); + lp->stats.rx_errors++; + } else { + int rx_in_place = 0; + + if (pkt_len > rx_copybreak) { + struct sk_buff *newskb; + + if ((newskb = dev_alloc_skb(PKT_BUF_SZ))) { + skb_reserve (newskb, 2); + skb = lp->rx_skbuff[entry]; + pci_unmap_single(lp->pci_dev, lp->rx_dma_addr[entry], + PKT_BUF_SZ-2, PCI_DMA_FROMDEVICE); + skb_put (skb, pkt_len); + lp->rx_skbuff[entry] = newskb; + newskb->dev = dev; + lp->rx_dma_addr[entry] = + pci_map_single(lp->pci_dev, newskb->data, + PKT_BUF_SZ-2, PCI_DMA_FROMDEVICE); + lp->rx_ring[entry].base = le32_to_cpu(lp->rx_dma_addr[entry]); + rx_in_place = 1; + } else + skb = NULL; } else { - /* Malloc up new buffer, compatible with net-2e. */ - short pkt_len = - (le32_to_cpu(lp->rx_ring[entry].msg_length) & 0xfff) - - 4; - struct sk_buff *skb; - - /* Discard oversize frames. */ - if (unlikely(pkt_len > PKT_BUF_SZ - 2)) { - if (netif_msg_drv(lp)) - printk(KERN_ERR - "%s: Impossible packet size %d!\n", - dev->name, pkt_len); - lp->stats.rx_errors++; - } else if (pkt_len < 60) { - if (netif_msg_rx_err(lp)) - printk(KERN_ERR "%s: Runt packet!\n", - dev->name); - lp->stats.rx_errors++; - } else { - int rx_in_place = 0; - - if (pkt_len > rx_copybreak) { - struct sk_buff *newskb; - - if ((newskb = - dev_alloc_skb(PKT_BUF_SZ))) { - skb_reserve(newskb, 2); - skb = lp->rx_skbuff[entry]; - pci_unmap_single(lp->pci_dev, - lp-> - rx_dma_addr - [entry], - PKT_BUF_SZ - 2, - PCI_DMA_FROMDEVICE); - skb_put(skb, pkt_len); - lp->rx_skbuff[entry] = newskb; - newskb->dev = dev; - lp->rx_dma_addr[entry] = - pci_map_single(lp->pci_dev, - newskb->data, - PKT_BUF_SZ - - 2, - PCI_DMA_FROMDEVICE); - lp->rx_ring[entry].base = - le32_to_cpu(lp-> - rx_dma_addr - [entry]); - rx_in_place = 1; - } else - skb = NULL; - } else { - skb = dev_alloc_skb(pkt_len + 2); - } - - if (skb == NULL) { - int i; - if (netif_msg_drv(lp)) - printk(KERN_ERR - "%s: Memory squeeze, deferring packet.\n", - dev->name); - for (i = 0; i < lp->rx_ring_size; i++) - if ((short) - le16_to_cpu(lp-> - rx_ring[(entry + - i) - & lp-> - rx_mod_mask]. - status) < 0) - break; - - if (i > lp->rx_ring_size - 2) { - lp->stats.rx_dropped++; - lp->rx_ring[entry].status |= - le16_to_cpu(0x8000); - wmb(); /* Make sure adapter sees owner change */ - lp->cur_rx++; - } - break; - } - skb->dev = dev; - if (!rx_in_place) { - skb_reserve(skb, 2); /* 16 byte align */ - skb_put(skb, pkt_len); /* Make room */ - pci_dma_sync_single_for_cpu(lp->pci_dev, - lp-> - rx_dma_addr - [entry], - PKT_BUF_SZ - - 2, - PCI_DMA_FROMDEVICE); - eth_copy_and_sum(skb, - (unsigned char *)(lp-> - rx_skbuff - [entry]-> - data), - pkt_len, 0); - pci_dma_sync_single_for_device(lp-> - pci_dev, - lp-> - rx_dma_addr - [entry], - PKT_BUF_SZ - - 2, - PCI_DMA_FROMDEVICE); - } - lp->stats.rx_bytes += skb->len; - skb->protocol = eth_type_trans(skb, dev); - netif_rx(skb); - dev->last_rx = jiffies; - lp->stats.rx_packets++; - } + skb = dev_alloc_skb(pkt_len+2); + } + + if (skb == NULL) { + int i; + if (netif_msg_drv(lp)) + printk(KERN_ERR "%s: Memory squeeze, deferring packet.\n", + dev->name); + for (i = 0; i < lp->rx_ring_size; i++) + if ((short)le16_to_cpu(lp->rx_ring[(entry+i) + & lp->rx_mod_mask].status) < 0) + break; + + if (i > lp->rx_ring_size -2) { + lp->stats.rx_dropped++; + lp->rx_ring[entry].status |= le16_to_cpu(0x8000); + wmb(); /* Make sure adapter sees owner change */ + lp->cur_rx++; + } + break; + } + skb->dev = dev; + if (!rx_in_place) { + skb_reserve(skb,2); /* 16 byte align */ + skb_put(skb,pkt_len); /* Make room */ + pci_dma_sync_single_for_cpu(lp->pci_dev, + lp->rx_dma_addr[entry], + PKT_BUF_SZ-2, + PCI_DMA_FROMDEVICE); + eth_copy_and_sum(skb, + (unsigned char *)(lp->rx_skbuff[entry]->data), + pkt_len,0); + pci_dma_sync_single_for_device(lp->pci_dev, + lp->rx_dma_addr[entry], + PKT_BUF_SZ-2, + PCI_DMA_FROMDEVICE); } - /* - * The docs say that the buffer length isn't touched, but Andrew Boyd - * of QNX reports that some revs of the 79C965 clear it. - */ - lp->rx_ring[entry].buf_length = le16_to_cpu(2 - PKT_BUF_SZ); - wmb(); /* Make sure owner changes after all others are visible */ - lp->rx_ring[entry].status |= le16_to_cpu(0x8000); - entry = (++lp->cur_rx) & lp->rx_mod_mask; - if (--boguscnt <= 0) - break; /* don't stay in loop forever */ + lp->stats.rx_bytes += skb->len; + skb->protocol=eth_type_trans(skb,dev); + netif_rx(skb); + dev->last_rx = jiffies; + lp->stats.rx_packets++; + } } + /* + * The docs say that the buffer length isn't touched, but Andrew Boyd + * of QNX reports that some revs of the 79C965 clear it. + */ + lp->rx_ring[entry].buf_length = le16_to_cpu(2-PKT_BUF_SZ); + wmb(); /* Make sure owner changes after all others are visible */ + lp->rx_ring[entry].status |= le16_to_cpu(0x8000); + entry = (++lp->cur_rx) & lp->rx_mod_mask; + if (--boguscnt <= 0) break; /* don't stay in loop forever */ + } - return 0; + return 0; } -static int pcnet32_close(struct net_device *dev) +static int +pcnet32_close(struct net_device *dev) { - unsigned long ioaddr = dev->base_addr; - struct pcnet32_private *lp = dev->priv; - unsigned long flags; + unsigned long ioaddr = dev->base_addr; + struct pcnet32_private *lp = dev->priv; + int i; + unsigned long flags; - del_timer_sync(&lp->watchdog_timer); + del_timer_sync(&lp->watchdog_timer); - netif_stop_queue(dev); + netif_stop_queue(dev); - spin_lock_irqsave(&lp->lock, flags); + spin_lock_irqsave(&lp->lock, flags); - lp->stats.rx_missed_errors = lp->a.read_csr(ioaddr, 112); + lp->stats.rx_missed_errors = lp->a.read_csr (ioaddr, 112); - if (netif_msg_ifdown(lp)) - printk(KERN_DEBUG - "%s: Shutting down ethercard, status was %2.2x.\n", - dev->name, lp->a.read_csr(ioaddr, 0)); + if (netif_msg_ifdown(lp)) + printk(KERN_DEBUG "%s: Shutting down ethercard, status was %2.2x.\n", + dev->name, lp->a.read_csr (ioaddr, 0)); - /* We stop the PCNET32 here -- it occasionally polls memory if we don't. */ - lp->a.write_csr(ioaddr, 0, 0x0004); + /* We stop the PCNET32 here -- it occasionally polls memory if we don't. */ + lp->a.write_csr (ioaddr, 0, 0x0004); - /* - * Switch back to 16bit mode to avoid problems with dumb - * DOS packet driver after a warm reboot - */ - lp->a.write_bcr(ioaddr, 20, 4); + /* + * Switch back to 16bit mode to avoid problems with dumb + * DOS packet driver after a warm reboot + */ + lp->a.write_bcr (ioaddr, 20, 4); - spin_unlock_irqrestore(&lp->lock, flags); + spin_unlock_irqrestore(&lp->lock, flags); - free_irq(dev->irq, dev); + free_irq(dev->irq, dev); - spin_lock_irqsave(&lp->lock, flags); + spin_lock_irqsave(&lp->lock, flags); - pcnet32_purge_rx_ring(dev); - pcnet32_purge_tx_ring(dev); + /* 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; + } - spin_unlock_irqrestore(&lp->lock, flags); + 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; + } - return 0; + spin_unlock_irqrestore(&lp->lock, flags); + + return 0; } -static struct net_device_stats *pcnet32_get_stats(struct net_device *dev) +static struct net_device_stats * +pcnet32_get_stats(struct net_device *dev) { - struct pcnet32_private *lp = dev->priv; - unsigned long ioaddr = dev->base_addr; - u16 saved_addr; - unsigned long flags; + struct pcnet32_private *lp = dev->priv; + unsigned long ioaddr = dev->base_addr; + u16 saved_addr; + unsigned long flags; - spin_lock_irqsave(&lp->lock, flags); - saved_addr = lp->a.read_rap(ioaddr); - lp->stats.rx_missed_errors = lp->a.read_csr(ioaddr, 112); - lp->a.write_rap(ioaddr, saved_addr); - spin_unlock_irqrestore(&lp->lock, flags); + spin_lock_irqsave(&lp->lock, flags); + saved_addr = lp->a.read_rap(ioaddr); + lp->stats.rx_missed_errors = lp->a.read_csr (ioaddr, 112); + lp->a.write_rap(ioaddr, saved_addr); + spin_unlock_irqrestore(&lp->lock, flags); - return &lp->stats; + return &lp->stats; } /* taken from the sunlance driver, which it took from the depca driver */ -static void pcnet32_load_multicast(struct net_device *dev) -{ - struct pcnet32_private *lp = dev->priv; - 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; - - /* set all multicast bits */ - 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 */ - ib->filter[0] = 0; - ib->filter[1] = 0; - - /* Add addresses */ - for (i = 0; i < dev->mc_count; i++) { - addrs = dmi->dmi_addr; - dmi = dmi->next; - - /* multicast address? */ - if (!(*addrs & 1)) - continue; - - crc = ether_crc_le(6, addrs); - crc = crc >> 26; - mcast_table[crc >> 4] = - 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])); +static void pcnet32_load_multicast (struct net_device *dev) +{ + struct pcnet32_private *lp = dev->priv; + volatile struct pcnet32_init_block *ib = &lp->init_block; + volatile u16 *mcast_table = (u16 *)&ib->filter; + struct dev_mc_list *dmi=dev->mc_list; + char *addrs; + int i; + u32 crc; + + /* set all multicast bits */ + if (dev->flags & IFF_ALLMULTI) { + ib->filter[0] = 0xffffffff; + ib->filter[1] = 0xffffffff; return; + } + /* clear the multicast filter */ + ib->filter[0] = 0; + ib->filter[1] = 0; + + /* Add addresses */ + for (i = 0; i < dev->mc_count; i++) { + addrs = dmi->dmi_addr; + dmi = dmi->next; + + /* multicast address? */ + if (!(*addrs & 1)) + continue; + + crc = ether_crc_le(6, addrs); + crc = crc >> 26; + mcast_table [crc >> 4] = le16_to_cpu( + le16_to_cpu(mcast_table [crc >> 4]) | (1 << (crc & 0xf))); + } + return; } + /* * Set or clear the multicast filter for this adaptor. */ 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; + unsigned long ioaddr = dev->base_addr, flags; + struct pcnet32_private *lp = dev->priv; - 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)) - printk(KERN_INFO "%s: Promiscuous mode enabled.\n", - dev->name); - 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); - } + spin_lock_irqsave(&lp->lock, flags); + if (dev->flags&IFF_PROMISC) { + /* Log any net taps. */ + if (netif_msg_hw(lp)) + printk(KERN_INFO "%s: Promiscuous mode enabled.\n", dev->name); + lp->init_block.mode = le16_to_cpu(0x8000 | (lp->options & PCNET32_PORT_PORTSEL) << 7); + } else { + lp->init_block.mode = le16_to_cpu((lp->options & PCNET32_PORT_PORTSEL) << 7); + pcnet32_load_multicast (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); - } + lp->a.write_csr (ioaddr, 0, 0x0004); /* Temporarily stop the lance. */ + pcnet32_restart(dev, 0x0042); /* Resume normal operation */ + netif_wake_queue(dev); - spin_unlock_irqrestore(&lp->lock, flags); + spin_unlock_irqrestore(&lp->lock, flags); } /* This routine assumes that the lp->lock is held */ static int mdio_read(struct net_device *dev, int phy_id, int reg_num) { - struct pcnet32_private *lp = dev->priv; - unsigned long ioaddr = dev->base_addr; - u16 val_out; + struct pcnet32_private *lp = dev->priv; + unsigned long ioaddr = dev->base_addr; + u16 val_out; - if (!lp->mii) - return 0; + if (!lp->mii) + return 0; - lp->a.write_bcr(ioaddr, 33, ((phy_id & 0x1f) << 5) | (reg_num & 0x1f)); - val_out = lp->a.read_bcr(ioaddr, 34); + lp->a.write_bcr(ioaddr, 33, ((phy_id & 0x1f) << 5) | (reg_num & 0x1f)); + val_out = lp->a.read_bcr(ioaddr, 34); - return val_out; + return val_out; } /* This routine assumes that the lp->lock is held */ static void mdio_write(struct net_device *dev, int phy_id, int reg_num, int val) { - struct pcnet32_private *lp = dev->priv; - unsigned long ioaddr = dev->base_addr; + struct pcnet32_private *lp = dev->priv; + unsigned long ioaddr = dev->base_addr; - if (!lp->mii) - return; + if (!lp->mii) + return; - lp->a.write_bcr(ioaddr, 33, ((phy_id & 0x1f) << 5) | (reg_num & 0x1f)); - lp->a.write_bcr(ioaddr, 34, val); + lp->a.write_bcr(ioaddr, 33, ((phy_id & 0x1f) << 5) | (reg_num & 0x1f)); + lp->a.write_bcr(ioaddr, 34, val); } static int pcnet32_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) { - struct pcnet32_private *lp = dev->priv; - int rc; - unsigned long flags; - - /* SIOC[GS]MIIxxx ioctls */ - if (lp->mii) { - spin_lock_irqsave(&lp->lock, flags); - rc = generic_mii_ioctl(&lp->mii_if, if_mii(rq), cmd, NULL); - spin_unlock_irqrestore(&lp->lock, flags); - } else { - rc = -EOPNOTSUPP; - } - - return rc; -} - -static int pcnet32_check_otherphy(struct net_device *dev) -{ - struct pcnet32_private *lp = dev->priv; - struct mii_if_info mii = lp->mii_if; - u16 bmcr; - int i; - - for (i = 0; i < PCNET32_MAX_PHYS; i++) { - if (i == lp->mii_if.phy_id) - continue; /* skip active phy */ - if (lp->phymask & (1 << i)) { - mii.phy_id = i; - if (mii_link_ok(&mii)) { - /* found PHY with active link */ - if (netif_msg_link(lp)) - printk(KERN_INFO - "%s: Using PHY number %d.\n", - dev->name, i); - - /* isolate inactive phy */ - bmcr = - mdio_read(dev, lp->mii_if.phy_id, MII_BMCR); - mdio_write(dev, lp->mii_if.phy_id, MII_BMCR, - bmcr | BMCR_ISOLATE); - - /* de-isolate new phy */ - bmcr = mdio_read(dev, i, MII_BMCR); - mdio_write(dev, i, MII_BMCR, - bmcr & ~BMCR_ISOLATE); - - /* set new phy address */ - lp->mii_if.phy_id = i; - return 1; - } - } - } - return 0; -} + struct pcnet32_private *lp = dev->priv; + int rc; + unsigned long flags; -/* - * Show the status of the media. Similar to mii_check_media however it - * correctly shows the link speed for all (tested) pcnet32 variants. - * Devices with no mii just report link state without speed. - * - * Caller is assumed to hold and release the lp->lock. - */ - -static void pcnet32_check_media(struct net_device *dev, int verbose) -{ - struct pcnet32_private *lp = dev->priv; - int curr_link; - int prev_link = netif_carrier_ok(dev) ? 1 : 0; - u32 bcr9; + /* SIOC[GS]MIIxxx ioctls */ + if (lp->mii) { + spin_lock_irqsave(&lp->lock, flags); + rc = generic_mii_ioctl(&lp->mii_if, if_mii(rq), cmd, NULL); + spin_unlock_irqrestore(&lp->lock, flags); + } else { + rc = -EOPNOTSUPP; + } - if (lp->mii) { - curr_link = mii_link_ok(&lp->mii_if); - } else { - ulong ioaddr = dev->base_addr; /* card base I/O address */ - curr_link = (lp->a.read_bcr(ioaddr, 4) != 0xc0); - } - if (!curr_link) { - if (prev_link || verbose) { - netif_carrier_off(dev); - if (netif_msg_link(lp)) - printk(KERN_INFO "%s: link down\n", dev->name); - } - if (lp->phycount > 1) { - curr_link = pcnet32_check_otherphy(dev); - prev_link = 0; - } - } else if (verbose || !prev_link) { - netif_carrier_on(dev); - if (lp->mii) { - if (netif_msg_link(lp)) { - struct ethtool_cmd ecmd; - mii_ethtool_gset(&lp->mii_if, &ecmd); - printk(KERN_INFO - "%s: link up, %sMbps, %s-duplex\n", - dev->name, - (ecmd.speed == SPEED_100) ? "100" : "10", - (ecmd.duplex == - DUPLEX_FULL) ? "full" : "half"); - } - bcr9 = lp->a.read_bcr(dev->base_addr, 9); - if ((bcr9 & (1 << 0)) != lp->mii_if.full_duplex) { - if (lp->mii_if.full_duplex) - bcr9 |= (1 << 0); - else - bcr9 &= ~(1 << 0); - lp->a.write_bcr(dev->base_addr, 9, bcr9); - } - } else { - if (netif_msg_link(lp)) - printk(KERN_INFO "%s: link up\n", dev->name); - } - } + return rc; } -/* - * Check for loss of link and link establishment. - * Can not use mii_check_media because it does nothing if mode is forced. - */ - static void pcnet32_watchdog(struct net_device *dev) { - struct pcnet32_private *lp = dev->priv; - unsigned long flags; + struct pcnet32_private *lp = dev->priv; + unsigned long flags; - /* Print the link status if it has changed */ + /* Print the link status if it has changed */ + if (lp->mii) { spin_lock_irqsave(&lp->lock, flags); - pcnet32_check_media(dev, 0); + mii_check_media (&lp->mii_if, netif_msg_link(lp), 0); spin_unlock_irqrestore(&lp->lock, flags); + } - mod_timer(&(lp->watchdog_timer), PCNET32_WATCHDOG_TIMEOUT); + mod_timer (&(lp->watchdog_timer), PCNET32_WATCHDOG_TIMEOUT); } static void __devexit pcnet32_remove_one(struct pci_dev *pdev) { - struct net_device *dev = pci_get_drvdata(pdev); - - if (dev) { - struct pcnet32_private *lp = dev->priv; - - unregister_netdev(dev); - pcnet32_free_ring(dev); - release_region(dev->base_addr, PCNET32_TOTAL_SIZE); - pci_free_consistent(lp->pci_dev, sizeof(*lp), lp, lp->dma_addr); - free_netdev(dev); - pci_disable_device(pdev); - pci_set_drvdata(pdev, NULL); - } + struct net_device *dev = pci_get_drvdata(pdev); + + if (dev) { + struct pcnet32_private *lp = dev->priv; + + unregister_netdev(dev); + pcnet32_free_ring(dev); + release_region(dev->base_addr, PCNET32_TOTAL_SIZE); + pci_free_consistent(lp->pci_dev, sizeof(*lp), lp, lp->dma_addr); + free_netdev(dev); + pci_disable_device(pdev); + pci_set_drvdata(pdev, NULL); + } } static struct pci_driver pcnet32_driver = { - .name = DRV_NAME, - .probe = pcnet32_probe_pci, - .remove = __devexit_p(pcnet32_remove_one), - .id_table = pcnet32_pci_tbl, + .name = DRV_NAME, + .probe = pcnet32_probe_pci, + .remove = __devexit_p(pcnet32_remove_one), + .id_table = pcnet32_pci_tbl, }; /* An additional parameter that may be passed in... */ @@ -2943,11 +2477,9 @@ static int pcnet32_have_pci; module_param(debug, int, 0); MODULE_PARM_DESC(debug, DRV_NAME " debug level"); module_param(max_interrupt_work, int, 0); -MODULE_PARM_DESC(max_interrupt_work, - DRV_NAME " maximum events handled per interrupt"); +MODULE_PARM_DESC(max_interrupt_work, DRV_NAME " maximum events handled per interrupt"); module_param(rx_copybreak, int, 0); -MODULE_PARM_DESC(rx_copybreak, - DRV_NAME " copy breakpoint for copy-only-tiny-frames"); +MODULE_PARM_DESC(rx_copybreak, DRV_NAME " copy breakpoint for copy-only-tiny-frames"); module_param(tx_start_pt, int, 0); MODULE_PARM_DESC(tx_start_pt, DRV_NAME " transmit start point (0-3)"); module_param(pcnet32vlb, int, 0); @@ -2958,9 +2490,7 @@ module_param_array(full_duplex, int, NULL, 0); MODULE_PARM_DESC(full_duplex, DRV_NAME " full duplex setting(s) (1)"); /* Module Parameter for HomePNA cards added by Patrick Simmons, 2004 */ module_param_array(homepna, int, NULL, 0); -MODULE_PARM_DESC(homepna, - DRV_NAME - " mode for 79C978 cards (1 for HomePNA, 0 for Ethernet, default Ethernet"); +MODULE_PARM_DESC(homepna, DRV_NAME " mode for 79C978 cards (1 for HomePNA, 0 for Ethernet, default Ethernet"); MODULE_AUTHOR("Thomas Bogendoerfer"); MODULE_DESCRIPTION("Driver for PCnet32 and PCnetPCI based ethercards"); @@ -2970,44 +2500,44 @@ MODULE_LICENSE("GPL"); static int __init pcnet32_init_module(void) { - printk(KERN_INFO "%s", version); + printk(KERN_INFO "%s", version); - pcnet32_debug = netif_msg_init(debug, PCNET32_MSG_DEFAULT); + pcnet32_debug = netif_msg_init(debug, PCNET32_MSG_DEFAULT); - if ((tx_start_pt >= 0) && (tx_start_pt <= 3)) - tx_start = tx_start_pt; + if ((tx_start_pt >= 0) && (tx_start_pt <= 3)) + tx_start = tx_start_pt; - /* find the PCI devices */ - if (!pci_module_init(&pcnet32_driver)) - pcnet32_have_pci = 1; + /* find the PCI devices */ + if (!pci_module_init(&pcnet32_driver)) + pcnet32_have_pci = 1; - /* should we find any remaining VLbus devices ? */ - if (pcnet32vlb) - pcnet32_probe_vlbus(pcnet32_portlist); + /* should we find any remaining VLbus devices ? */ + if (pcnet32vlb) + pcnet32_probe_vlbus(); - if (cards_found && (pcnet32_debug & NETIF_MSG_PROBE)) - printk(KERN_INFO PFX "%d cards_found.\n", cards_found); + if (cards_found && (pcnet32_debug & NETIF_MSG_PROBE)) + printk(KERN_INFO PFX "%d cards_found.\n", cards_found); - return (pcnet32_have_pci + cards_found) ? 0 : -ENODEV; + return (pcnet32_have_pci + cards_found) ? 0 : -ENODEV; } static void __exit pcnet32_cleanup_module(void) { - struct net_device *next_dev; - - while (pcnet32_dev) { - struct pcnet32_private *lp = pcnet32_dev->priv; - next_dev = lp->next; - unregister_netdev(pcnet32_dev); - pcnet32_free_ring(pcnet32_dev); - release_region(pcnet32_dev->base_addr, PCNET32_TOTAL_SIZE); - pci_free_consistent(lp->pci_dev, sizeof(*lp), lp, lp->dma_addr); - free_netdev(pcnet32_dev); - pcnet32_dev = next_dev; - } + struct net_device *next_dev; + + while (pcnet32_dev) { + struct pcnet32_private *lp = pcnet32_dev->priv; + next_dev = lp->next; + unregister_netdev(pcnet32_dev); + pcnet32_free_ring(pcnet32_dev); + release_region(pcnet32_dev->base_addr, PCNET32_TOTAL_SIZE); + pci_free_consistent(lp->pci_dev, sizeof(*lp), lp, lp->dma_addr); + free_netdev(pcnet32_dev); + pcnet32_dev = next_dev; + } - if (pcnet32_have_pci) - pci_unregister_driver(&pcnet32_driver); + if (pcnet32_have_pci) + pci_unregister_driver(&pcnet32_driver); } module_init(pcnet32_init_module); diff --git a/drivers/net/phy/Kconfig b/drivers/net/phy/Kconfig index b79ec0d74..fa39b944b 100644 --- a/drivers/net/phy/Kconfig +++ b/drivers/net/phy/Kconfig @@ -44,34 +44,6 @@ 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 320f83231..e4116a5fb 100644 --- a/drivers/net/phy/Makefile +++ b/drivers/net/phy/Makefile @@ -8,6 +8,3 @@ 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 ae60e6e41..7d8d53425 100644 --- a/drivers/net/phy/cicada.c +++ b/drivers/net/phy/cicada.c @@ -13,6 +13,7 @@ * option) any later version. * */ +#include #include #include #include @@ -103,22 +104,7 @@ static int cis820x_config_intr(struct phy_device *phydev) return err; } -/* 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 */ +/* Cicada 820x */ static struct phy_driver cis8204_driver = { .phy_id = 0x000fc440, .name = "Cicada Cis8204", @@ -133,30 +119,15 @@ static struct phy_driver cis8204_driver = { .driver = { .owner = THIS_MODULE,}, }; -static int __init cicada_init(void) +static int __init cis8204_init(void) { - 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; + return phy_driver_register(&cis8204_driver); } -static void __exit cicada_exit(void) +static void __exit cis8204_exit(void) { phy_driver_unregister(&cis8204_driver); - phy_driver_unregister(&cis8201_driver); } -module_init(cicada_init); -module_exit(cicada_exit); +module_init(cis8204_init); +module_exit(cis8204_exit); diff --git a/drivers/net/phy/davicom.c b/drivers/net/phy/davicom.c index aa7983f55..5e9002e44 100644 --- a/drivers/net/phy/davicom.c +++ b/drivers/net/phy/davicom.c @@ -13,6 +13,7 @@ * option) any later version. * */ +#include #include #include #include diff --git a/drivers/net/phy/lxt.c b/drivers/net/phy/lxt.c index 69d2325f8..bef79e454 100644 --- a/drivers/net/phy/lxt.c +++ b/drivers/net/phy/lxt.c @@ -13,6 +13,7 @@ * option) any later version. * */ +#include #include #include #include @@ -122,9 +123,9 @@ static int lxt971_config_intr(struct phy_device *phydev) } static struct phy_driver lxt970_driver = { - .phy_id = 0x78100000, + .phy_id = 0x07810000, .name = "LXT970", - .phy_id_mask = 0xfffffff0, + .phy_id_mask = 0x0fffffff, .features = PHY_BASIC_FEATURES, .flags = PHY_HAS_INTERRUPT, .config_init = lxt970_config_init, @@ -136,9 +137,9 @@ static struct phy_driver lxt970_driver = { }; static struct phy_driver lxt971_driver = { - .phy_id = 0x001378e0, + .phy_id = 0x0001378e, .name = "LXT971", - .phy_id_mask = 0xfffffff0, + .phy_id_mask = 0x0fffffff, .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 0ad253282..a2d6386d1 100644 --- a/drivers/net/phy/marvell.c +++ b/drivers/net/phy/marvell.c @@ -13,6 +13,7 @@ * 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 cf6660c93..459443b57 100644 --- a/drivers/net/phy/mdio_bus.c +++ b/drivers/net/phy/mdio_bus.c @@ -13,6 +13,7 @@ * option) any later version. * */ +#include #include #include #include @@ -59,10 +60,8 @@ int mdiobus_register(struct mii_bus *bus) for (i = 0; i < PHY_MAX_ADDR; i++) { struct phy_device *phydev; - if (bus->phy_mask & (1 << i)) { - bus->phy_map[i] = NULL; + if (bus->phy_mask & (1 << i)) continue; - } phydev = get_phy_device(bus, i); @@ -159,7 +158,6 @@ 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 f5aad7728..1474b7c5a 100644 --- a/drivers/net/phy/phy.c +++ b/drivers/net/phy/phy.c @@ -14,6 +14,7 @@ * option) any later version. * */ +#include #include #include #include @@ -131,7 +132,7 @@ struct phy_setting { }; /* A mapping of all SUPPORTED settings to speed/duplex */ -static const struct phy_setting settings[] = { +static struct phy_setting settings[] = { { .speed = 10000, .duplex = DUPLEX_FULL, @@ -419,8 +420,9 @@ 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). This function must be called BEFORE + * 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 * phy_detach. */ void phy_stop_machine(struct phy_device *phydev) @@ -432,6 +434,9 @@ 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; } @@ -552,7 +557,7 @@ int phy_start_interrupts(struct phy_device *phydev) INIT_WORK(&phydev->phy_queue, phy_change, phydev); if (request_irq(phydev->irq, phy_interrupt, - IRQF_SHARED, + SA_SHIRQ, "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 2d1ecfdc8..7da0e3dd5 100644 --- a/drivers/net/phy/phy_device.c +++ b/drivers/net/phy/phy_device.c @@ -14,6 +14,7 @@ * option) any later version. * */ +#include #include #include #include @@ -45,35 +46,6 @@ 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 @@ -107,7 +79,27 @@ struct phy_device * get_phy_device(struct mii_bus *bus, int addr) if (0xffffffff == phy_id) return NULL; - dev = phy_device_create(bus, addr, phy_id); + /* 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); return dev; } diff --git a/drivers/net/phy/qsemi.c b/drivers/net/phy/qsemi.c index 2b50e1739..65d995b02 100644 --- a/drivers/net/phy/qsemi.c +++ b/drivers/net/phy/qsemi.c @@ -13,6 +13,7 @@ * option) any later version. * */ +#include #include #include #include diff --git a/drivers/net/plip.c b/drivers/net/plip.c index d4449d6d1..87ee3271b 100644 --- a/drivers/net/plip.c +++ b/drivers/net/plip.c @@ -123,7 +123,7 @@ static const char version[] = "NET3 PLIP version 2.4-parport gniibe@mri.co.jp\n" #ifndef NET_DEBUG #define NET_DEBUG 1 #endif -static const unsigned int net_debug = NET_DEBUG; +static unsigned int net_debug = NET_DEBUG; #define ENABLE(irq) if (irq != -1) enable_irq(irq) #define DISABLE(irq) if (irq != -1) disable_irq(irq) @@ -351,7 +351,7 @@ static int plip_bh_timeout_error(struct net_device *dev, struct net_local *nl, typedef int (*plip_func)(struct net_device *dev, struct net_local *nl, struct plip_local *snd, struct plip_local *rcv); -static const plip_func connection_state_table[] = +static plip_func connection_state_table[] = { plip_none, plip_receive_packet, diff --git a/drivers/net/ppp_async.c b/drivers/net/ppp_async.c index 23659fd7c..aa6540b39 100644 --- a/drivers/net/ppp_async.c +++ b/drivers/net/ppp_async.c @@ -30,7 +30,6 @@ #include #include #include -#include #include #include @@ -571,7 +570,7 @@ ppp_async_encode(struct asyncppp *ap) * character if necessary. */ if (islcp || flag_time == 0 - || time_after_eq(jiffies, ap->last_xmit + flag_time)) + || jiffies - ap->last_xmit >= flag_time) *buf++ = PPP_FLAG; ap->last_xmit = jiffies; fcs = PPP_INITFCS; diff --git a/drivers/net/ppp_generic.c b/drivers/net/ppp_generic.c index c872f7c6c..0245e40b5 100644 --- a/drivers/net/ppp_generic.c +++ b/drivers/net/ppp_generic.c @@ -22,11 +22,13 @@ * ==FILEVERSION 20041108== */ +#include #include #include #include #include #include +#include #include #include #include @@ -44,7 +46,6 @@ #include #include #include -#include #include #include @@ -192,16 +193,16 @@ struct cardmap { void *ptr[CARDMAP_WIDTH]; }; static void *cardmap_get(struct cardmap *map, unsigned int nr); -static int cardmap_set(struct cardmap **map, unsigned int nr, void *ptr); +static void 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); /* - * all_ppp_mutex protects the all_ppp_units mapping. + * all_ppp_sem protects the all_ppp_units mapping. * It also ensures that finding a ppp unit in the all_ppp_units map * and updating its file.refcnt field is atomic. */ -static DEFINE_MUTEX(all_ppp_mutex); +static DECLARE_MUTEX(all_ppp_sem); static struct cardmap *all_ppp_units; static atomic_t ppp_unit_count = ATOMIC_INIT(0); @@ -803,7 +804,7 @@ static int ppp_unattached_ioctl(struct ppp_file *pf, struct file *file, /* Attach to an existing ppp unit */ if (get_user(unit, p)) break; - mutex_lock(&all_ppp_mutex); + down(&all_ppp_sem); err = -ENXIO; ppp = ppp_find_unit(unit); if (ppp != 0) { @@ -811,7 +812,7 @@ static int ppp_unattached_ioctl(struct ppp_file *pf, struct file *file, file->private_data = &ppp->file; err = 0; } - mutex_unlock(&all_ppp_mutex); + up(&all_ppp_sem); break; case PPPIOCATTCHAN: @@ -861,6 +862,10 @@ 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: @@ -868,6 +873,9 @@ 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; @@ -1600,6 +1608,8 @@ 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; @@ -1681,8 +1691,8 @@ ppp_receive_nonmp_frame(struct ppp *ppp, struct sk_buff *skb) || ppp->npmode[npi] != NPMODE_PASS) { kfree_skb(skb); } else { - /* chop off protocol */ - skb_pull_rcsum(skb, 2); + skb_pull(skb, 2); /* chop off protocol */ + skb_postpull_rcsum(skb, skb->data - 2, 2); skb->dev = ppp->dev; skb->protocol = htons(npindex_to_ethertype[npi]); skb->mac.raw = skb->data; @@ -1995,9 +2005,10 @@ ppp_register_channel(struct ppp_channel *chan) { struct channel *pch; - pch = kzalloc(sizeof(struct channel), GFP_KERNEL); + pch = kmalloc(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; @@ -2407,12 +2418,13 @@ ppp_create_interface(int unit, int *retp) int ret = -ENOMEM; int i; - ppp = kzalloc(sizeof(struct ppp), GFP_KERNEL); + ppp = kmalloc(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); @@ -2434,7 +2446,7 @@ ppp_create_interface(int unit, int *retp) dev->do_ioctl = ppp_net_ioctl; ret = -EEXIST; - mutex_lock(&all_ppp_mutex); + down(&all_ppp_sem); if (unit < 0) unit = cardmap_find_first_free(all_ppp_units); else if (cardmap_get(all_ppp_units, unit) != NULL) @@ -2452,18 +2464,13 @@ ppp_create_interface(int unit, int *retp) } atomic_inc(&ppp_unit_count); - ret = cardmap_set(&all_ppp_units, unit, ppp); - if (ret != 0) - goto out3; - - mutex_unlock(&all_ppp_mutex); + cardmap_set(&all_ppp_units, unit, ppp); + up(&all_ppp_sem); *retp = 0; return ppp; -out3: - atomic_dec(&ppp_unit_count); out2: - mutex_unlock(&all_ppp_mutex); + up(&all_ppp_sem); free_netdev(dev); out1: kfree(ppp); @@ -2493,7 +2500,7 @@ static void ppp_shutdown_interface(struct ppp *ppp) { struct net_device *dev; - mutex_lock(&all_ppp_mutex); + down(&all_ppp_sem); ppp_lock(ppp); dev = ppp->dev; ppp->dev = NULL; @@ -2507,7 +2514,7 @@ static void ppp_shutdown_interface(struct ppp *ppp) ppp->file.dead = 1; ppp->owner = NULL; wake_up_interruptible(&ppp->file.rwait); - mutex_unlock(&all_ppp_mutex); + up(&all_ppp_sem); } /* @@ -2549,7 +2556,7 @@ static void ppp_destroy_interface(struct ppp *ppp) /* * Locate an existing ppp unit. - * The caller should have locked the all_ppp_mutex. + * The caller should have locked the all_ppp_sem. */ static struct ppp * ppp_find_unit(int unit) @@ -2572,7 +2579,8 @@ ppp_find_channel(int unit) list_for_each_entry(pch, &new_channels, list) { if (pch->file.index == unit) { - list_move(&pch->list, &all_channels); + list_del(&pch->list); + list_add(&pch->list, &all_channels); return pch; } } @@ -2593,7 +2601,7 @@ ppp_connect_channel(struct channel *pch, int unit) int ret = -ENXIO; int hdrlen; - mutex_lock(&all_ppp_mutex); + down(&all_ppp_sem); ppp = ppp_find_unit(unit); if (ppp == 0) goto out; @@ -2618,7 +2626,7 @@ ppp_connect_channel(struct channel *pch, int unit) outl: write_unlock_bh(&pch->upl); out: - mutex_unlock(&all_ppp_mutex); + up(&all_ppp_sem); return ret; } @@ -2675,6 +2683,7 @@ 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); } @@ -2698,7 +2707,7 @@ static void *cardmap_get(struct cardmap *map, unsigned int nr) return NULL; } -static int cardmap_set(struct cardmap **pmap, unsigned int nr, void *ptr) +static void cardmap_set(struct cardmap **pmap, unsigned int nr, void *ptr) { struct cardmap *p; int i; @@ -2707,9 +2716,8 @@ static int 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 = kzalloc(sizeof(*np), GFP_KERNEL); - if (!np) - goto enomem; + struct cardmap *np = kmalloc(sizeof(*np), GFP_KERNEL); + memset(np, 0, sizeof(*np)); np->ptr[0] = p; if (p != NULL) { np->shift = p->shift + CARDMAP_ORDER; @@ -2723,9 +2731,8 @@ static int 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 = kzalloc(sizeof(*np), GFP_KERNEL); - if (!np) - goto enomem; + struct cardmap *np = kmalloc(sizeof(*np), GFP_KERNEL); + memset(np, 0, sizeof(*np)); np->shift = p->shift - CARDMAP_ORDER; np->parent = p; p->ptr[i] = np; @@ -2740,9 +2747,6 @@ static int 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 51ff9a9d1..1985d1b57 100644 --- a/drivers/net/ppp_mppe.c +++ b/drivers/net/ppp_mppe.c @@ -43,6 +43,7 @@ * deprecated in 2.6 */ +#include #include #include #include diff --git a/drivers/net/ppp_synctty.c b/drivers/net/ppp_synctty.c index 33255fe80..33cb8254e 100644 --- a/drivers/net/ppp_synctty.c +++ b/drivers/net/ppp_synctty.c @@ -108,7 +108,7 @@ static void ppp_print_hex (register __u8 * out, const __u8 * in, int count) { register __u8 next_ch; - static const char hex[] = "0123456789ABCDEF"; + static char hex[] = "0123456789ABCDEF"; while (count-- > 0) { next_ch = *in++; diff --git a/drivers/net/pppoe.c b/drivers/net/pppoe.c index 0d101a180..e023b38e3 100644 --- a/drivers/net/pppoe.c +++ b/drivers/net/pppoe.c @@ -337,7 +337,8 @@ static int pppoe_rcv_core(struct sock *sk, struct sk_buff *skb) if (sk->sk_state & PPPOX_BOUND) { struct pppoe_hdr *ph = (struct pppoe_hdr *) skb->nh.raw; int len = ntohs(ph->length); - skb_pull_rcsum(skb, sizeof(struct pppoe_hdr)); + skb_pull(skb, sizeof(struct pppoe_hdr)); + skb_postpull_rcsum(skb, ph, sizeof(*ph)); if (pskb_trim_rcsum(skb, len)) goto abort_kfree; @@ -600,6 +601,7 @@ static int pppoe_connect(struct socket *sock, struct sockaddr *uservaddr, po->chan.hdrlen = (sizeof(struct pppoe_hdr) + dev->hard_header_len); + po->chan.mtu = dev->mtu - sizeof(struct pppoe_hdr); po->chan.private = sk; po->chan.ops = &pppoe_chan_ops; @@ -861,9 +863,6 @@ static int __pppoe_xmit(struct sock *sk, struct sk_buff *skb) * give dev_queue_xmit something it can free. */ skb2 = skb_clone(skb, GFP_ATOMIC); - - if (skb2 == NULL) - goto abort; } ph = (struct pppoe_hdr *) skb_push(skb2, sizeof(struct pppoe_hdr)); diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c index 4c2f575fa..78c532df4 100644 --- a/drivers/net/r8169.c +++ b/drivers/net/r8169.c @@ -113,11 +113,11 @@ static int media[MAX_UNITS] = { -1, -1, -1, -1, -1, -1, -1, -1 }; static int num_media = 0; /* Maximum events (Rx packets, etc.) to handle at each interrupt. */ -static const int max_interrupt_work = 20; +static int max_interrupt_work = 20; /* Maximum number of multicast addresses to filter (vs. Rx-all-multicast). The RTL chips use a 64 element hash table based on the Ethernet CRC. */ -static const int multicast_filter_limit = 32; +static int multicast_filter_limit = 32; /* MAC address length */ #define MAC_ADDR_LEN 6 @@ -184,7 +184,6 @@ 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, }, @@ -195,6 +194,7 @@ MODULE_DEVICE_TABLE(pci, rtl8169_pci_tbl); static int rx_copybreak = 200; static int use_dac; +static int ignore_parity_err; static struct { u32 msg_enable; } debug = { -1 }; @@ -257,10 +257,11 @@ enum RTL8169_register_content { RxOK = 0x01, /* RxStatusDesc */ - RxRES = 0x00200000, - RxCRC = 0x00080000, - RxRUNT = 0x00100000, - RxRWT = 0x00400000, + RxFOVF = (1 << 23), + RxRWT = (1 << 22), + RxRES = (1 << 21), + RxRUNT = (1 << 20), + RxCRC = (1 << 19), /* ChipCmdBits */ CmdReset = 0x10, @@ -461,6 +462,8 @@ module_param(use_dac, int, 0); MODULE_PARM_DESC(use_dac, "Enable PCI DAC. Unsafe on 32 bit PCI slot."); module_param_named(debug, debug.msg_enable, int, 0); MODULE_PARM_DESC(debug, "Debug verbosity level (0=none, ..., 16=all)"); +module_param_named(ignore_parity_err, ignore_parity_err, bool, 0); +MODULE_PARM_DESC(ignore_parity_err, "Ignore PCI parity error as target. Default: false"); MODULE_LICENSE("GPL"); MODULE_VERSION(RTL8169_VERSION); @@ -1406,7 +1409,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)) - dev_err(&pdev->dev, "unable to alloc new ethernet\n"); + printk(KERN_ERR PFX "unable to alloc new ethernet\n"); goto err_out; } @@ -1418,8 +1421,10 @@ 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)) - dev_err(&pdev->dev, "enable failure\n"); + if (netif_msg_probe(tp)) { + printk(KERN_ERR PFX "%s: enable failure\n", + pci_name(pdev)); + } goto err_out_free_dev; } @@ -1435,32 +1440,37 @@ 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)) - dev_err(&pdev->dev, + if (netif_msg_probe(tp)) { + printk(KERN_ERR PFX "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)) - dev_err(&pdev->dev, + if (netif_msg_probe(tp)) { + printk(KERN_ERR PFX "region #1 not an MMIO resource, aborting\n"); + } rc = -ENODEV; goto err_out_mwi; } /* check for weird/broken PCI region reporting */ if (pci_resource_len(pdev, 1) < R8169_REGS_SIZE) { - if (netif_msg_probe(tp)) - dev_err(&pdev->dev, + if (netif_msg_probe(tp)) { + printk(KERN_ERR PFX "Invalid PCI region size(s), aborting\n"); + } rc = -ENODEV; goto err_out_mwi; } rc = pci_request_regions(pdev, MODULENAME); if (rc < 0) { - if (netif_msg_probe(tp)) - dev_err(&pdev->dev, "could not request regions.\n"); + if (netif_msg_probe(tp)) { + printk(KERN_ERR PFX "%s: could not request regions.\n", + pci_name(pdev)); + } goto err_out_mwi; } @@ -1473,9 +1483,10 @@ rtl8169_init_board(struct pci_dev *pdev, struct net_device **dev_out, } else { rc = pci_set_dma_mask(pdev, DMA_32BIT_MASK); if (rc < 0) { - if (netif_msg_probe(tp)) - dev_err(&pdev->dev, + if (netif_msg_probe(tp)) { + printk(KERN_ERR PFX "DMA configuration failed.\n"); + } goto err_out_free_res; } } @@ -1486,7 +1497,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)) - dev_err(&pdev->dev, "cannot remap MMIO, aborting\n"); + printk(KERN_ERR PFX "cannot remap MMIO, aborting\n"); rc = -EIO; goto err_out_free_res; } @@ -1518,9 +1529,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)) { - dev_printk(KERN_DEBUG, &pdev->dev, + printk(KERN_DEBUG PFX "PCI device %s: " "unknown chip version, assuming %s\n", - rtl_chip_info[0].name); + pci_name(pdev), rtl_chip_info[0].name); } i++; } @@ -1718,7 +1729,7 @@ static int rtl8169_open(struct net_device *dev) rtl8169_set_rxbufsize(tp, dev); retval = - request_irq(dev->irq, rtl8169_interrupt, IRQF_SHARED, dev->name, dev); + request_irq(dev->irq, rtl8169_interrupt, SA_SHIRQ, dev->name, dev); if (retval < 0) goto out; @@ -2164,7 +2175,7 @@ static int rtl8169_xmit_frags(struct rtl8169_private *tp, struct sk_buff *skb, static inline u32 rtl8169_tso_csum(struct sk_buff *skb, struct net_device *dev) { if (dev->features & NETIF_F_TSO) { - u32 mss = skb_shinfo(skb)->gso_size; + u32 mss = skb_shinfo(skb)->tso_size; if (mss) return LargeSend | ((mss & MSSMask) << MSSShift); @@ -2214,7 +2225,8 @@ static int rtl8169_start_xmit(struct sk_buff *skb, struct net_device *dev) len = skb->len; if (unlikely(len < ETH_ZLEN)) { - if (skb_padto(skb, ETH_ZLEN)) + skb = skb_padto(skb, ETH_ZLEN); + if (!skb) goto err_update_stats; len = ETH_ZLEN; } @@ -2280,12 +2292,17 @@ static void rtl8169_pcierr_interrupt(struct net_device *dev) /* * The recovery sequence below admits a very elaborated explanation: * - it seems to work; - * - I did not see what else could be done. + * - I did not see what else could be done; + * - it makes iop3xx happy. * * Feel free to adjust to your needs. */ - pci_write_config_word(pdev, PCI_COMMAND, - pci_cmd | PCI_COMMAND_SERR | PCI_COMMAND_PARITY); + if (ignore_parity_err) + pci_cmd &= ~PCI_COMMAND_PARITY; + else + pci_cmd |= PCI_COMMAND_SERR | PCI_COMMAND_PARITY; + + pci_write_config_word(pdev, PCI_COMMAND, pci_cmd); pci_write_config_word(pdev, PCI_STATUS, pci_status & (PCI_STATUS_DETECTED_PARITY | @@ -2299,10 +2316,11 @@ static void rtl8169_pcierr_interrupt(struct net_device *dev) tp->cp_cmd &= ~PCIDAC; RTL_W16(CPlusCmd, tp->cp_cmd); dev->features &= ~NETIF_F_HIGHDMA; - rtl8169_schedule_work(dev, rtl8169_reinit_task); } rtl8169_hw_reset(ioaddr); + + rtl8169_schedule_work(dev, rtl8169_reinit_task); } static void @@ -2427,6 +2445,10 @@ rtl8169_rx_interrupt(struct net_device *dev, struct rtl8169_private *tp, tp->stats.rx_length_errors++; if (status & RxCRC) tp->stats.rx_crc_errors++; + if (status & RxFOVF) { + rtl8169_schedule_work(dev, rtl8169_reset_task); + tp->stats.rx_fifo_errors++; + } rtl8169_mark_to_asic(desc, tp->rx_buf_sz); } else { struct sk_buff *skb = tp->Rx_skbuff[entry]; @@ -2606,6 +2628,7 @@ static void rtl8169_down(struct net_device *dev) struct rtl8169_private *tp = netdev_priv(dev); void __iomem *ioaddr = tp->mmio_addr; unsigned int poll_locked = 0; + unsigned int intrmask; rtl8169_delete_timer(dev); @@ -2644,8 +2667,11 @@ core_down: * 2) dev->change_mtu * -> rtl8169_poll can not be issued again and re-enable the * interruptions. Let's simply issue the IRQ down sequence again. + * + * No loop if hotpluged or major error (0xffff). */ - if (RTL_R16(IntrMask)) + intrmask = RTL_R16(IntrMask); + if (intrmask && (intrmask != 0xffff)) goto core_down; rtl8169_tx_clear(tp); diff --git a/drivers/net/rrunner.c b/drivers/net/rrunner.c index c3ed734cb..19c2df9c8 100644 --- a/drivers/net/rrunner.c +++ b/drivers/net/rrunner.c @@ -28,6 +28,7 @@ #define RX_DMA_SKBUFF 1 #define PKT_COPY_THRESHOLD 512 +#include #include #include #include @@ -1252,7 +1253,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, IRQF_SHARED, dev->name, dev)) { + if (request_irq(dev->irq, rr_interrupt, SA_SHIRQ, 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 2c3c91ebd..10baae559 100644 --- a/drivers/net/rrunner.h +++ b/drivers/net/rrunner.h @@ -1,6 +1,7 @@ #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 0ef525899..00179bc34 100644 --- a/drivers/net/s2io-regs.h +++ b/drivers/net/s2io-regs.h @@ -167,7 +167,6 @@ 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; @@ -188,7 +187,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,5) +#define PIC_CNTL_SHARED_SPLITS(n) vBIT(n,11,4) u64 swapper_ctrl; #define SWAPPER_CTRL_PIF_R_FE BIT(0) @@ -268,21 +267,6 @@ 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; @@ -300,13 +284,9 @@ 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[0x230 - 0x208]; - - u64 pic_control2; - u64 ini_dperr_ctrl; + u8 unused7_1[0x240 - 0x208]; u64 wreq_split_mask; #define WREQ_SPLIT_MASK_SET_MASK(val) vBIT(val, 52, 12) @@ -513,7 +493,6 @@ 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; @@ -562,12 +541,7 @@ typedef struct _XENA_dev_config { #define RX_PA_CFG_IGNORE_LLC_CTRL BIT(3) #define RX_PA_CFG_IGNORE_L2_ERR BIT(6) - u64 unused_11_1; - - u64 ring_bump_counter1; - u64 ring_bump_counter2; - - u8 unused12[0x700 - 0x1F0]; + u8 unused12[0x700 - 0x1D8]; u64 rxdma_debug_ctrl; diff --git a/drivers/net/s2io.c b/drivers/net/s2io.c index e72e0e099..b7f00d6eb 100644 --- a/drivers/net/s2io.c +++ b/drivers/net/s2io.c @@ -26,24 +26,18 @@ * * 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 receive blocks each ring can have. - * This is also an array of size 8. + * rx_ring_sz: This defines the number of descriptors 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 @@ -63,28 +57,23 @@ #include #include #include -#include -#include -#include #include #include #include -#include -#include /* local include */ #include "s2io.h" #include "s2io-regs.h" -#define DRV_VERSION "2.0.15.2" +#define DRV_VERSION "Version 2.0.9.4" /* S2io Driver name & version. */ static char s2io_driver_name[] = "Neterion"; static char s2io_driver_version[] = DRV_VERSION; -static int rxd_size[4] = {32,48,48,64}; -static int rxd_count[4] = {127,85,85,63}; +int rxd_size[4] = {32,48,48,64}; +int rxd_count[4] = {127,85,85,63}; static inline int RXD_IS_UP2DT(RxD_t *rxdp) { @@ -113,14 +102,18 @@ 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 (rxb_size <= rxd_count[sp->rxd_mode]) - return PANIC; - else if ((mac_control->rings[ring].pkt_cnt - rxb_size) > 16) - return LOW; - return 0; + if ((mac_control->rings[ring].pkt_cnt - rxb_size) > 16) { + level = LOW; + if (rxb_size <= rxd_count[sp->rxd_mode]) { + level = PANIC; + } + } + + return level; } /* Ethtool related variables and Macros. */ @@ -139,11 +132,7 @@ 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"}, @@ -158,27 +147,13 @@ 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"}, @@ -187,87 +162,12 @@ 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"), - ("lro_flush_due_to_max_pkts"), - ("lro_avg_aggr_pkts"), }; #define S2IO_STAT_LEN sizeof(ethtool_stats_keys)/ ETH_GSTRING_LEN @@ -311,8 +211,10 @@ 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[] = { + +static u64 herc_act_dtx_cfg[] = { /* Set address */ 0x8000051536750000ULL, 0x80000515367500E0ULL, /* Write data */ @@ -333,19 +235,37 @@ static const u64 herc_act_dtx_cfg[] = { END_SIGN }; -static const u64 xena_dtx_cfg[] = { - /* Set address */ +static u64 xena_mdio_cfg[] = { + /* Reset PMA PLL */ + 0xC001010000000000ULL, 0xC0010100000000E0ULL, + 0xC0010100008000E4ULL, + /* Remove Reset from PMA PLL */ + 0xC001010000000000ULL, 0xC0010100000000E0ULL, + 0xC0010100000000E4ULL, + END_SIGN +}; + +static u64 xena_dtx_cfg[] = { 0x8000051500000000ULL, 0x80000515000000E0ULL, - /* Write data */ - 0x80000515D9350004ULL, 0x80000515D93500E4ULL, - /* Set address */ - 0x8001051500000000ULL, 0x80010515000000E0ULL, - /* Write data */ - 0x80010515001E0004ULL, 0x80010515001E00E4ULL, - /* Set address */ + 0x80000515D93500E4ULL, 0x8001051500000000ULL, + 0x80010515000000E0ULL, 0x80010515001E00E4ULL, 0x8002051500000000ULL, 0x80020515000000E0ULL, - /* Write data */ - 0x80020515F2100004ULL, 0x80020515F21000E4ULL, + 0x80020515F21000E4ULL, + /* Set PADLOOPBACKN */ + 0x8002051500000000ULL, 0x80020515000000E0ULL, + 0x80020515B20000E4ULL, 0x8003051500000000ULL, + 0x80030515000000E0ULL, 0x80030515B20000E4ULL, + 0x8004051500000000ULL, 0x80040515000000E0ULL, + 0x80040515B20000E4ULL, 0x8005051500000000ULL, + 0x80050515000000E0ULL, 0x80050515B20000E4ULL, + SWITCH_SIGN, + /* Remove PADLOOPBACKN */ + 0x8002051500000000ULL, 0x80020515000000E0ULL, + 0x80020515F20000E4ULL, 0x8003051500000000ULL, + 0x80030515000000E0ULL, 0x80030515F20000E4ULL, + 0x8004051500000000ULL, 0x80040515000000E0ULL, + 0x80040515F20000E4ULL, 0x8005051500000000ULL, + 0x80050515000000E0ULL, 0x80050515F20000E4ULL, END_SIGN }; @@ -353,7 +273,7 @@ static const u64 xena_dtx_cfg[] = { * Constants for Fixing the MacAddress problem seen mostly on * Alpha machines. */ -static const u64 fix_mac[] = { +static u64 fix_mac[] = { 0x0060000000000000ULL, 0x0060600000000000ULL, 0x0040600000000000ULL, 0x0000600000000000ULL, 0x0020600000000000ULL, 0x0060600000000000ULL, @@ -371,50 +291,32 @@ static const u64 fix_mac[] = { END_SIGN }; -MODULE_AUTHOR("Raghavendra Koushik "); -MODULE_LICENSE("GPL"); -MODULE_VERSION(DRV_VERSION); - - /* Module Loadable parameters. */ -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 */ -S2IO_PARM_INT(rxsync_frequency, 3); -/* Interrupt type. Values can be 0(INTA), 1(MSI), 2(MSI_X) */ -S2IO_PARM_INT(intr_type, 0); -/* Large receive offload feature */ -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) - */ -S2IO_PARM_INT(lro_max_pkts, 0xFFFF); -#ifndef CONFIG_S2IO_NAPI -S2IO_PARM_INT(indicate_max_pkts, 0); -#endif - +static unsigned int tx_fifo_num = 1; static unsigned int tx_fifo_len[MAX_TX_FIFOS] = - {DEFAULT_FIFO_0_LEN, [1 ...(MAX_TX_FIFOS - 1)] = DEFAULT_FIFO_1_7_LEN}; + {[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)] = SMALL_BLK_CNT}; + {[0 ...(MAX_RX_RINGS - 1)] = 0 }; 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); +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 +/* Frequency of Rx desc syncs expressed as power of 2 */ +static unsigned int rxsync_frequency = 3; +/* Interrupt type. Values can be 0(INTA), 1(MSI), 2(MSI_X) */ +static unsigned int intr_type = 0; /* * S2IO device table. @@ -477,9 +379,10 @@ 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, "s2io: Requested TxDs too high, "); + DBG_PRINT(ERR_DBG, "%s: Requested TxDs too high, ", + __FUNCTION__); DBG_PRINT(ERR_DBG, "Requested: %d, max supported: 8192\n", size); - return -EINVAL; + return FAILURE; } lst_size = (sizeof(TxD_t) * config->max_txds); @@ -559,7 +462,6 @@ 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; @@ -632,6 +534,11 @@ 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++) { @@ -850,21 +757,7 @@ 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 - */ @@ -881,14 +774,6 @@ 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 { @@ -898,27 +783,35 @@ 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 */ @@ -946,7 +839,7 @@ static int init_nic(struct s2io_nic *nic) int i, j; mac_info_t *mac_control; struct config_param *config; - int dtx_cnt = 0; + int mdio_cnt = 0, dtx_cnt = 0; unsigned long long mem_share; int mem_size; @@ -993,6 +886,20 @@ 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], @@ -1002,11 +909,35 @@ static int init_nic(struct s2io_nic *nic) dtx_cnt++; } } else { - 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++; + 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; + } } } @@ -1048,6 +979,11 @@ 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. @@ -1226,11 +1162,6 @@ 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 +1476,6 @@ static int init_nic(struct s2io_nic *nic) writel((u32) (val64 >> 32), (add + 4)); val64 = readq(&bar0->mac_cfg); - /* Enable FCS stripping by adapter */ - add = &bar0->mac_cfg; - val64 = readq(&bar0->mac_cfg); - val64 |= MAC_CFG_RMAC_STRIP_FCS; - if (nic->device_type == XFRAME_II_DEVICE) - writeq(val64, &bar0->mac_cfg); - else { - writeq(RMAC_CFG_KEY(0x4C0D), &bar0->rmac_cfg_key); - writel((u32) (val64), add); - writeq(RMAC_CFG_KEY(0x4C0D), &bar0->rmac_cfg_key); - writel((u32) (val64 >> 32), (add + 4)); - } - /* * Set the time value to be inserted in the pause frame * generated by xena. @@ -1599,26 +1517,19 @@ 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 = 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); + val64 = WREQ_SPLIT_MASK_SET_MASK(255); + writeq(val64, &bar0->wreq_split_mask); } - if (strstr(nic->product_name, "CX4")) { - val64 = TMAC_AVG_IPG(0x17); - writeq(val64, &bar0->tmac_avg_ipg); + + /* Setting Link stability period to 64 ms */ + if (nic->device_type == XFRAME_II_DEVICE) { + val64 = MISC_LINK_STABILITY_PRD(3); + writeq(val64, &bar0->misc_control); } return SUCCESS; @@ -1663,7 +1574,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 - * disable all PCIX, Flash, MDIO, IIC and GPIO + * disabled all PCIX, Flash, MDIO, IIC and GPIO * interrupts for now. * TODO */ @@ -1989,6 +1900,7 @@ 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; @@ -2008,10 +1920,6 @@ 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]); } @@ -2059,6 +1967,16 @@ 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, @@ -2072,13 +1990,6 @@ 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) && @@ -2090,6 +2001,12 @@ 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; } /** @@ -2132,7 +2049,7 @@ static struct sk_buff *s2io_txdl_getskb(fifo_info_t *fifo_data, TxD_t *txdlp, in frag->size, PCI_DMA_TODEVICE); } } - memset(txdlp,0, (sizeof(TxD_t) * fifo_data->max_txds)); + txdlp->Host_Control = 0; return(skb); } @@ -2189,7 +2106,7 @@ static void stop_nic(struct s2io_nic *nic) { XENA_dev_config_t __iomem *bar0 = nic->bar0; register u64 val64 = 0; - u16 interruptible; + u16 interruptible, i; mac_info_t *mac_control; struct config_param *config; @@ -2202,13 +2119,15 @@ static void stop_nic(struct s2io_nic *nic) interruptible |= TX_MAC_INTR | RX_MAC_INTR; en_dis_able_nic_intrs(nic, interruptible, DISABLE_INTRS); - /* Clearing Adapter_En bit of ADAPTER_CONTROL Register */ - val64 = readq(&bar0->adapter_control); - val64 &= ~(ADAPTER_CNTL_EN); - writeq(val64, &bar0->adapter_control); + /* 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]); + } } -static int fill_rxd_3buf(nic_t *nic, RxD_t *rxdp, struct sk_buff *skb) +int fill_rxd_3buf(nic_t *nic, RxD_t *rxdp, struct sk_buff *skb) { struct net_device *dev = nic->dev; struct sk_buff *frag_list; @@ -2284,12 +2203,13 @@ 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; @@ -2359,9 +2279,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 - NET_IP_ALIGN, - PCI_DMA_FROMDEVICE); - rxdp->Control_2 = SET_BUFFER0_SIZE_1(size - NET_IP_ALIGN); + (nic->pdev, skb->data, size, PCI_DMA_FROMDEVICE); + rxdp->Control_2 &= (~MASK_BUFFER0_SIZE_1); + rxdp->Control_2 |= SET_BUFFER0_SIZE_1(size); } else if (nic->rxd_mode >= RXD_MODE_3A) { /* @@ -2384,14 +2304,9 @@ static int fill_rx_buffers(struct s2io_nic *nic, int ring_no) skb->data = (void *) (unsigned long)tmp; skb->tail = (void *) (unsigned long)tmp; - if (!(((RxD3_t*)rxdp)->Buffer0_ptr)) - ((RxD3_t*)rxdp)->Buffer0_ptr = - pci_map_single(nic->pdev, ba->ba_0, BUF0_LEN, + ((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 */ @@ -2404,13 +2319,10 @@ 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 */ - if (!(((RxD3_t*)rxdp)->Buffer1_ptr)) { - ((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 */ + ((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); @@ -2576,7 +2488,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 = 0xFFFFFFFFFFFFFFFFULL; + u64 val64; int i; atomic_inc(&nic->isr_cnt); @@ -2588,8 +2500,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]); @@ -2614,8 +2526,7 @@ static int s2io_poll(struct net_device *dev, int *budget) } } /* Re enable the Rx interrupts. */ - writeq(0x0, &bar0->rx_traffic_mask); - val64 = readl(&bar0->rx_traffic_mask); + en_dis_able_nic_intrs(nic, RX_TRAFFIC_INTR, ENABLE_INTRS); atomic_dec(&nic->isr_cnt); return 0; @@ -2635,58 +2546,6 @@ 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. @@ -2710,8 +2569,6 @@ static void rx_intr_handler(ring_info_t *ring_data) #ifndef CONFIG_S2IO_NAPI int pkt_cnt = 0; #endif - int i; - spin_lock(&nic->rx_lock); if (atomic_read(&nic->card_state) == CARD_DOWN) { DBG_PRINT(INTR_DBG, "%s: %s going down for reset\n", @@ -2737,7 +2594,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(INTR_DBG, "%s: Ring Full\n",dev->name); + DBG_PRINT(ERR_DBG, "%s: Ring Full\n",dev->name); break; } skb = (struct sk_buff *) ((unsigned long)rxdp->Host_Control); @@ -2757,15 +2614,18 @@ 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_dma_sync_single_for_cpu(nic->pdev, (dma_addr_t) + pci_unmap_single(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_dma_sync_single_for_cpu(nic->pdev, (dma_addr_t) + pci_unmap_single(nic->pdev, (dma_addr_t) ((RxD3_t*)rxdp)->Buffer0_ptr, BUF0_LEN, PCI_DMA_FROMDEVICE); pci_unmap_single(nic->pdev, (dma_addr_t) @@ -2776,7 +2636,6 @@ 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; @@ -2802,18 +2661,6 @@ static void rx_intr_handler(ring_info_t *ring_data) break; #endif } - if (nic->lro) { - /* Clear all LRO sessions before exiting */ - for (i=0; ilro0_n[i]; - if (lro->in_use) { - update_L3L4_header(nic, lro); - queue_rx_frame(lro->parent); - clear_lro_session(lro); - } - } - } - spin_unlock(&nic->rx_lock); } @@ -2848,10 +2695,6 @@ 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"); @@ -2875,8 +2718,7 @@ to loss of link\n"); dev_kfree_skb_irq(skb); get_info.offset++; - if (get_info.offset == get_info.fifo_len + 1) - get_info.offset = 0; + get_info.offset %= get_info.fifo_len + 1; txdlp = (TxD_t *) fifo_data->list_info [get_info.offset].list_virt_addr; fifo_data->tx_curr_get_info.offset = @@ -2889,256 +2731,6 @@ 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 @@ -3156,18 +2748,6 @@ 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) { @@ -3194,8 +2774,6 @@ 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 { @@ -3207,13 +2785,11 @@ 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++; } /* @@ -3231,35 +2807,6 @@ 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 */ } @@ -3275,26 +2822,23 @@ static void alarm_intr_handler(struct s2io_nic *nic) * SUCCESS on success and FAILURE on failure. */ -static int wait_for_cmd_complete(void *addr, u64 busy_bit) +static int wait_for_cmd_complete(nic_t * sp) { + XENA_dev_config_t __iomem *bar0 = sp->bar0; int ret = FAILURE, cnt = 0; u64 val64; while (TRUE) { - val64 = readq(addr); - if (!(val64 & busy_bit)) { + val64 = readq(&bar0->rmac_addr_cmd_mem); + if (!(val64 & RMAC_ADDR_CMD_MEM_STROBE_CMD_EXECUTING)) { ret = SUCCESS; break; } - - if(in_interrupt()) - mdelay(50); - else - msleep(50); - + msleep(50); if (cnt++ > 10) break; } + return ret; } @@ -3308,7 +2852,7 @@ static int wait_for_cmd_complete(void *addr, u64 busy_bit) * void. */ -static void s2io_reset(nic_t * sp) +void s2io_reset(nic_t * sp) { XENA_dev_config_t __iomem *bar0 = sp->bar0; u64 val64; @@ -3333,9 +2877,6 @@ 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); @@ -3353,7 +2894,7 @@ static void s2io_reset(nic_t * sp) /* Clear certain PCI/PCI-X fields after reset */ if (sp->device_type == XFRAME_II_DEVICE) { - /* Clear "detected parity error" bit */ + /* Clear parity err detect bit */ pci_write_config_word(sp->pdev, PCI_STATUS, 0x8000); /* Clearing PCIX Ecc status register */ @@ -3399,7 +2940,7 @@ static void s2io_reset(nic_t * sp) * SUCCESS on success and FAILURE on failure. */ -static int s2io_set_swapper(nic_t * sp) +int s2io_set_swapper(nic_t * sp) { struct net_device *dev = sp->dev; XENA_dev_config_t __iomem *bar0 = sp->bar0; @@ -3548,13 +3089,13 @@ static int wait_for_msix_trans(nic_t *nic, int i) return ret; } -static void restore_xmsi_data(nic_t *nic) +void restore_xmsi_data(nic_t *nic) { XENA_dev_config_t __iomem *bar0 = nic->bar0; 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)); @@ -3573,7 +3114,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)) { @@ -3639,7 +3180,7 @@ int s2io_enable_msi(nic_t *nic) return 0; } -static int s2io_enable_msi_x(nic_t *nic) +int s2io_enable_msi_x(nic_t *nic) { XENA_dev_config_t __iomem *bar0 = nic->bar0; u64 tx_mat, rx_mat; @@ -3701,24 +3242,15 @@ 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 @@ -3751,6 +3283,8 @@ 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 @@ -3760,23 +3294,98 @@ static int s2io_open(struct net_device *dev) sp->last_link_state = 0; /* Initialize H/W and enable interrupts */ - err = s2io_card_up(sp); - if (err) { + if (s2io_card_up(sp)) { DBG_PRINT(ERR_DBG, "%s: H/W initialization failed\n", dev->name); + err = -ENODEV; goto hw_init_failed; } - if (s2io_set_mac_addr(dev, dev->dev_addr) == FAILURE) { + /* 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, + 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"); - s2io_card_down(sp); err = -ENODEV; - goto hw_init_failed; + 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) @@ -3803,12 +3412,35 @@ 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; } @@ -3834,11 +3466,13 @@ 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; @@ -3869,8 +3503,7 @@ 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 ? 0 : (put_off+1)) == get_off) { + if (txdp->Host_Control || (((put_off + 1) % queue_len) == get_off)) { DBG_PRINT(TX_DBG, "Error in xmit, No free TXDs.\n"); netif_stop_queue(dev); dev_kfree_skb(skb); @@ -3886,11 +3519,13 @@ static int s2io_xmit(struct sk_buff *skb, struct net_device *dev) return 0; } - offload_type = s2io_offload_type(skb); + txdp->Control_1 = 0; + txdp->Control_2 = 0; #ifdef NETIF_F_TSO - if (offload_type & (SKB_GSO_TCPV4 | SKB_GSO_TCPV6)) { + mss = skb_shinfo(skb)->tso_size; + if (mss) { txdp->Control_1 |= TXD_TCP_LSO_EN; - txdp->Control_1 |= TXD_TCP_LSO_MSS(s2io_tcp_mss(skb)); + txdp->Control_1 |= TXD_TCP_LSO_MSS(mss); } #endif if (skb->ip_summed == CHECKSUM_HW) { @@ -3908,10 +3543,10 @@ static int s2io_xmit(struct sk_buff *skb, struct net_device *dev) } frg_len = skb->len - skb->data_len; - if (offload_type == SKB_GSO_UDP) { + if (skb_shinfo(skb)->ufo_size) { int ufo_size; - ufo_size = s2io_udp_mss(skb); + ufo_size = skb_shinfo(skb)->ufo_size; ufo_size &= ~7; txdp->Control_1 |= TXD_UFO_EN; txdp->Control_1 |= TXD_UFO_MSS(ufo_size); @@ -3928,13 +3563,16 @@ 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 (offload_type == SKB_GSO_UDP) + + if (skb_shinfo(skb)->ufo_size) txdp->Control_1 |= TXD_UFO_EN; frg_cnt = skb_shinfo(skb)->nr_frags; @@ -3949,12 +3587,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 (offload_type == SKB_GSO_UDP) + if (skb_shinfo(skb)->ufo_size) txdp->Control_1 |= TXD_UFO_EN; } txdp->Control_1 |= TXD_GATHER_CODE_LAST; - if (offload_type == SKB_GSO_UDP) + if (skb_shinfo(skb)->ufo_size) frg_cnt++; /* as Txd0 was used for inband header */ tx_fifo = mac_control->tx_FIFO_start[queue]; @@ -3963,21 +3601,23 @@ 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); - if (offload_type) - val64 |= TX_FIFO_SPECIAL_FUNC; +#ifdef NETIF_F_TSO + if (mss) + val64 |= TX_FIFO_SPECIAL_FUNC; +#endif + if (skb_shinfo(skb)->ufo_size) + val64 |= TX_FIFO_SPECIAL_FUNC; writeq(val64, &tx_fifo->List_Control); mmiowb(); put_off++; - if (put_off == mac_control->fifos[queue].tx_curr_put_info.fifo_len + 1) - put_off = 0; + put_off %= mac_control->fifos[queue].tx_curr_put_info.fifo_len + 1; mac_control->fifos[queue].tx_curr_put_info.offset = put_off; /* Avoid "put" pointer going beyond "get" pointer */ - if (((put_off+1) == queue_len ? 0 : (put_off+1)) == get_off) { - sp->mac_control.stats_info->sw_stat.fifo_full_cnt++; + if (((put_off + 1) % queue_len) == get_off) { DBG_PRINT(TX_DBG, "No free TxDs for xmit, Put: 0x%x Get:0x%x\n", put_off, get_off); @@ -3999,41 +3639,13 @@ 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; @@ -4055,8 +3667,26 @@ 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++) - s2io_chk_rx_buffers(sp, i); + for (i = 0; i < config->rx_ring_num; i++) { + 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); + } + } atomic_dec(&sp->isr_cnt); return IRQ_HANDLED; @@ -4067,13 +3697,31 @@ 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; + int rxb_size, level, rng_n; atomic_inc(&sp->isr_cnt); - rx_intr_handler(ring); - s2io_chk_rx_buffers(sp, ring->ring_no); + rng_n = ring->ring_no; + 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); + } atomic_dec(&sp->isr_cnt); + return IRQ_HANDLED; } @@ -4088,6 +3736,7 @@ 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; @@ -4098,56 +3747,41 @@ 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_UP | - GPIO_INT_MASK_LINK_DOWN); + val64 |= GPIO_INT_MASK_LINK_DOWN; + val64 |= GPIO_INT_MASK_LINK_UP; writeq(val64, &bar0->gpio_int_mask); + s2io_set_link((unsigned long)sp); } - 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); - } +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); } } - val64 = readq(&bar0->gpio_int_mask); } /** @@ -4170,7 +3804,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, org_mask; + u64 reason = 0, val64; mac_info_t *mac_control; struct config_param *config; @@ -4194,41 +3828,43 @@ 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)) { - writeq(val64, &bar0->rx_traffic_mask); + en_dis_able_nic_intrs(sp, RX_TRAFFIC_INTR, + DISABLE_INTRS); __netif_rx_schedule(dev); } } #else - /* - * 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]); + /* 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]); + } } #endif - /* - * 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); + /* 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); - 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); @@ -4238,10 +3874,29 @@ 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++) - s2io_chk_rx_buffers(sp, i); + for (i = 0; i < config->rx_ring_num; i++) { + 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); + } + } #endif - writeq(org_mask, &bar0->general_int_mask); + atomic_dec(&sp->isr_cnt); return IRQ_HANDLED; } @@ -4269,8 +3924,6 @@ 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)); } } @@ -4346,8 +3999,7 @@ 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(&bar0->rmac_addr_cmd_mem, - RMAC_ADDR_CMD_MEM_STROBE_CMD_EXECUTING); + wait_for_cmd_complete(sp); sp->m_cast_flg = 1; sp->all_multi_pos = MAC_MC_ALL_MC_ADDR_OFFSET; @@ -4362,8 +4014,7 @@ 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(&bar0->rmac_addr_cmd_mem, - RMAC_ADDR_CMD_MEM_STROBE_CMD_EXECUTING); + wait_for_cmd_complete(sp); sp->m_cast_flg = 0; sp->all_multi_pos = 0; @@ -4428,8 +4079,7 @@ 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(&bar0->rmac_addr_cmd_mem, - RMAC_ADDR_CMD_MEM_STROBE_CMD_EXECUTING)) { + if (wait_for_cmd_complete(sp)) { DBG_PRINT(ERR_DBG, "%s: Adding ", dev->name); DBG_PRINT(ERR_DBG, "Multicasts failed\n"); @@ -4459,8 +4109,7 @@ 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(&bar0->rmac_addr_cmd_mem, - RMAC_ADDR_CMD_MEM_STROBE_CMD_EXECUTING)) { + if (wait_for_cmd_complete(sp)) { DBG_PRINT(ERR_DBG, "%s: Adding ", dev->name); DBG_PRINT(ERR_DBG, "Multicasts failed\n"); @@ -4480,7 +4129,7 @@ static void s2io_set_multicast(struct net_device *dev) * as defined in errno.h file on failure. */ -static int s2io_set_mac_addr(struct net_device *dev, u8 * addr) +int s2io_set_mac_addr(struct net_device *dev, u8 * addr) { nic_t *sp = dev->priv; XENA_dev_config_t __iomem *bar0 = sp->bar0; @@ -4505,8 +4154,7 @@ 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(&bar0->rmac_addr_cmd_mem, - RMAC_ADDR_CMD_MEM_STROBE_CMD_EXECUTING)) { + if (wait_for_cmd_complete(sp)) { DBG_PRINT(ERR_DBG, "%s: set_mac_addr failed\n", dev->name); return FAILURE; } @@ -4903,50 +4551,6 @@ 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. @@ -5259,12 +4863,10 @@ static int s2io_link_test(nic_t * sp, uint64_t * data) u64 val64; val64 = readq(&bar0->adapter_status); - if(!(LINK_IS_UP(val64))) + if (val64 & ADAPTER_STATUS_RMAC_LOCAL_FAULT) *data = 1; - else - *data = 0; - return *data; + return 0; } /** @@ -5458,19 +5060,9 @@ 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 | @@ -5502,27 +5094,11 @@ 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); @@ -5535,129 +5111,30 @@ 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++] = 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 | + 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; - if (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; - } - else - tmp_stats[i++] = 0; } static int s2io_ethtool_get_regs_len(struct net_device *dev) @@ -5722,19 +5199,6 @@ 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, @@ -5755,8 +5219,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 = s2io_ethtool_op_get_tso, - .set_tso = s2io_ethtool_op_set_tso, + .get_tso = ethtool_op_get_tso, + .set_tso = ethtool_op_set_tso, #endif .get_ufo = ethtool_op_get_ufo, .set_ufo = ethtool_op_set_ufo, @@ -5946,313 +5410,31 @@ 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) +static void s2io_card_down(nic_t * sp) { - 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); + int cnt = 0; + XENA_dev_config_t __iomem *bar0 = sp->bar0; + unsigned long flags; + register u64 val64 = 0; - /* 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); + del_timer_sync(&sp->alarm_timer); + /* If s2io_set_link task is executing, wait till it completes. */ + while (test_and_set_bit(0, &(sp->link_state))) { + msleep(50); } -} - -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; + atomic_set(&sp->card_state, CARD_DOWN); - for (i = 0; i < config->rx_ring_num; i++) { - blk_cnt = config->rx_cfg[i].num_rxd / - (rxd_count[sp->rxd_mode] +1); + /* disable Tx and Rx traffic on the NIC */ + stop_nic(sp); - 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); + /* Kill tasklet. */ + tasklet_kill(&sp->task); - 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; - XENA_dev_config_t __iomem *bar0 = sp->bar0; - unsigned long flags; - register u64 val64 = 0; - - del_timer_sync(&sp->alarm_timer); - /* If s2io_set_link task is executing, wait till it completes. */ - while (test_and_set_bit(0, &(sp->link_state))) { - msleep(50); - } - atomic_set(&sp->card_state, CARD_DOWN); - - /* 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; + /* Check if the device is Quiescent and then Reset the NIC */ + do { + val64 = readq(&bar0->adapter_status); + if (verify_xena_quiescence(sp, val64, sp->device_enabled_once)) { + break; } msleep(50); @@ -6267,6 +5449,15 @@ 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); @@ -6286,16 +5477,23 @@ 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 @@ -6318,47 +5516,21 @@ static int s2io_card_up(nic_t * sp) /* Setting its receive mode */ s2io_set_multicast(dev); - if (sp->lro) { - /* 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_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_irq(dev->irq, dev); 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; } @@ -6408,7 +5580,6 @@ 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++; } } @@ -6420,7 +5591,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 Rx interrupt serivce routine to perform + * This function is called by the Tx 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 @@ -6437,33 +5608,17 @@ 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 (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; - } + 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; } /* Updating statistics */ @@ -6501,8 +5656,7 @@ static int rx_osm_handler(ring_info_t *ring_data, RxD_t * rxdp) skb_put(skb, buf2_len); } - if ((rxdp->Control_1 & TCP_OR_UDP_FRAME) && ((!sp->lro) || - (sp->lro && (!(rxdp->Control_1 & RXD_FRAME_IP_FRAG)))) && + if ((rxdp->Control_1 & TCP_OR_UDP_FRAME) && (sp->rx_csum)) { l3_csum = RXD_GET_L3_CKSUM(rxdp->Control_1); l4_csum = RXD_GET_L4_CKSUM(rxdp->Control_1); @@ -6513,57 +5667,6 @@ static int rx_osm_handler(ring_info_t *ring_data, RxD_t * rxdp) * a flag in the RxD. */ skb->ip_summed = CHECKSUM_UNNECESSARY; - if (sp->lro) { - u32 tcp_len; - u8 *tcp; - int ret = 0; - - ret = s2io_club_tcp_session(skb->data, &tcp, - &tcp_len, &lro, rxdp, sp); - switch (ret) { - case 3: /* Begin anew */ - lro->parent = skb; - goto aggregate; - case 1: /* Aggregate */ - { - lro_append_pkt(sp, lro, - skb, tcp_len); - goto aggregate; - } - case 4: /* Flush session */ - { - lro_append_pkt(sp, lro, - skb, tcp_len); - queue_rx_frame(lro->parent); - clear_lro_session(lro); - sp->mac_control.stats_info-> - sw_stat.flush_max_pkts++; - goto aggregate; - } - case 2: /* Flush both */ - lro->parent->data_len = - lro->frags_len; - sp->mac_control.stats_info-> - sw_stat.sending_both++; - queue_rx_frame(lro->parent); - 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 - */ - break; - default: - DBG_PRINT(ERR_DBG, - "%s: Samadhana!!\n", - __FUNCTION__); - BUG(); - } - } } else { /* * Packet with erroneous checksum, let the @@ -6575,31 +5678,25 @@ static int rx_osm_handler(ring_info_t *ring_data, RxD_t * rxdp) skb->ip_summed = CHECKSUM_NONE; } - if (!sp->lro) { - skb->protocol = eth_type_trans(skb, dev); + skb->protocol = eth_type_trans(skb, dev); #ifdef CONFIG_S2IO_NAPI - if (sp->vlgrp && RXD_GET_VLAN_TAG(rxdp->Control_2)) { - /* Queueing the vlan frame to the upper layer */ - vlan_hwaccel_receive_skb(skb, sp->vlgrp, - RXD_GET_VLAN_TAG(rxdp->Control_2)); - } else { - netif_receive_skb(skb); - } + if (sp->vlgrp && RXD_GET_VLAN_TAG(rxdp->Control_2)) { + /* Queueing the vlan frame to the upper layer */ + vlan_hwaccel_receive_skb(skb, sp->vlgrp, + RXD_GET_VLAN_TAG(rxdp->Control_2)); + } else { + netif_receive_skb(skb); + } #else - if (sp->vlgrp && RXD_GET_VLAN_TAG(rxdp->Control_2)) { - /* Queueing the vlan frame to the upper layer */ - vlan_hwaccel_rx(skb, sp->vlgrp, - RXD_GET_VLAN_TAG(rxdp->Control_2)); - } else { - netif_rx(skb); - } -#endif + if (sp->vlgrp && RXD_GET_VLAN_TAG(rxdp->Control_2)) { + /* Queueing the vlan frame to the upper layer */ + vlan_hwaccel_rx(skb, sp->vlgrp, + RXD_GET_VLAN_TAG(rxdp->Control_2)); } else { -send_up: - queue_rx_frame(skb); - } + netif_rx(skb); + } +#endif dev->last_rx = jiffies; -aggregate: atomic_dec(&sp->rx_bufs_left[ring_no]); return SUCCESS; } @@ -6617,7 +5714,7 @@ aggregate: * void. */ -static void s2io_link(nic_t * sp, int link) +void s2io_link(nic_t * sp, int link) { struct net_device *dev = (struct net_device *) sp->dev; @@ -6642,7 +5739,7 @@ static void s2io_link(nic_t * sp, int link) * returns the revision ID of the device. */ -static int get_xena_rev_id(struct pci_dev *pdev) +int get_xena_rev_id(struct pci_dev *pdev) { u8 id = 0; int ret; @@ -6678,56 +5775,39 @@ 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)); } -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 -#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; - } +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); #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; -} +module_param(rxsync_frequency, int, 0); +module_param(intr_type, int, 0); /** * s2io_init_nic - Initialization of the adapter . @@ -6759,8 +5839,15 @@ s2io_init_nic(struct pci_dev *pdev, const struct pci_device_id *pre) int mode; u8 dev_intr_type = intr_type; - if ((ret = s2io_verify_parm(pdev, &dev_intr_type))) - return ret; +#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 = pci_enable_device(pdev))) { DBG_PRINT(ERR_DBG, @@ -6785,10 +5872,18 @@ s2io_init_nic(struct pci_dev *pdev, const struct pci_device_id *pre) 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; } } @@ -6844,7 +5939,6 @@ s2io_init_nic(struct pci_dev *pdev, const struct pci_device_id *pre) else sp->device_type = XFRAME_I_DEVICE; - sp->lro = lro; /* Initialize some PCI/PCI-X fields of the NIC. */ s2io_init_pci(sp); @@ -6860,6 +5954,8 @@ s2io_init_nic(struct pci_dev *pdev, const struct pci_device_id *pre) 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]; @@ -6883,6 +5979,8 @@ s2io_init_nic(struct pci_dev *pdev, const struct pci_device_id *pre) 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] * @@ -6912,7 +6010,7 @@ s2io_init_nic(struct pci_dev *pdev, const struct pci_device_id *pre) /* 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", - dev->name); + __FUNCTION__); ret = -ENOMEM; goto mem_alloc_failed; } @@ -6966,18 +6064,11 @@ s2io_init_nic(struct pci_dev *pdev, const struct pci_device_id *pre) 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; @@ -7030,8 +6121,8 @@ s2io_init_nic(struct pci_dev *pdev, const struct pci_device_id *pre) 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(&bar0->rmac_addr_cmd_mem, - RMAC_ADDR_CMD_MEM_STROBE_CMD_EXECUTING); + wait_for_cmd_complete(sp); + tmp64 = readq(&bar0->rmac_addr_data0_mem); mac_down = (u32) tmp64; mac_up = (u32) (tmp64 >> 32); @@ -7049,9 +6140,6 @@ s2io_init_nic(struct pci_dev *pdev, const struct pci_device_id *pre) 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 @@ -7088,63 +6176,78 @@ s2io_init_nic(struct pci_dev *pdev, const struct pci_device_id *pre) ret = -ENODEV; goto register_failed; } - 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, + + 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", 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\n"); + DBG_PRINT(ERR_DBG, " Unsupported PCI bus mode "); ret = -EBADSLT; - unregister_netdev(dev); goto set_swap_failed; } - } - 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", + } 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); /* Initialize device name */ - sprintf(sp->name, "%s Neterion %s", dev->name, sp->product_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"); /* Initialize bimodal Interrupts */ sp->config.bimodal = bimodal; @@ -7241,7 +6344,7 @@ int __init s2io_starter(void) * Description: This function is the cleanup routine for the driver. It unregist * ers the driver. */ -static void s2io_closer(void) +void s2io_closer(void) { pci_unregister_driver(&s2io_driver); DBG_PRINT(INIT_DBG, "cleanup done\n"); @@ -7249,321 +6352,3 @@ static void s2io_closer(void) module_init(s2io_starter); module_exit(s2io_closer); - -static int check_L2_lro_capable(u8 *buffer, struct iphdr **ip, - struct tcphdr **tcp, RxD_t *rxdp) -{ - int ip_off; - u8 l2_type = (u8)((rxdp->Control_1 >> 37) & 0x7), ip_len; - - if (!(rxdp->Control_1 & RXD_FRAME_PROTO_TCP)) { - DBG_PRINT(INIT_DBG,"%s: Non-TCP frames not supported for LRO\n", - __FUNCTION__); - return -1; - } - - /* TODO: - * By default the VLAN field in the MAC is stripped by the card, if this - * feature is turned off in rx_pa_cfg register, then the ip_off field - * has to be shifted by a further 2 bytes - */ - switch (l2_type) { - case 0: /* DIX type */ - case 4: /* DIX type with VLAN */ - ip_off = HEADER_ETHERNET_II_802_3_SIZE; - break; - /* LLC, SNAP etc are considered non-mergeable */ - default: - return -1; - } - - *ip = (struct iphdr *)((u8 *)buffer + ip_off); - ip_len = (u8)((*ip)->ihl); - ip_len <<= 2; - *tcp = (struct tcphdr *)((unsigned long)*ip + ip_len); - - return 0; -} - -static int check_for_socket_match(lro_t *lro, struct iphdr *ip, - struct tcphdr *tcp) -{ - DBG_PRINT(INFO_DBG,"%s: Been here...\n", __FUNCTION__); - if ((lro->iph->saddr != ip->saddr) || (lro->iph->daddr != ip->daddr) || - (lro->tcph->source != tcp->source) || (lro->tcph->dest != tcp->dest)) - return -1; - return 0; -} - -static inline int get_l4_pyld_length(struct iphdr *ip, struct tcphdr *tcp) -{ - return(ntohs(ip->tot_len) - (ip->ihl << 2) - (tcp->doff << 2)); -} - -static void initiate_new_session(lro_t *lro, u8 *l2h, - struct iphdr *ip, struct tcphdr *tcp, u32 tcp_pyld_len) -{ - DBG_PRINT(INFO_DBG,"%s: Been here...\n", __FUNCTION__); - lro->l2h = l2h; - lro->iph = ip; - lro->tcph = tcp; - lro->tcp_next_seq = tcp_pyld_len + ntohl(tcp->seq); - lro->tcp_ack = ntohl(tcp->ack_seq); - lro->sg_num = 1; - lro->total_len = ntohs(ip->tot_len); - lro->frags_len = 0; - /* - * check if we saw TCP timestamp. Other consistency checks have - * already been done. - */ - if (tcp->doff == 8) { - u32 *ptr; - ptr = (u32 *)(tcp+1); - lro->saw_ts = 1; - lro->cur_tsval = *(ptr+1); - lro->cur_tsecr = *(ptr+2); - } - lro->in_use = 1; -} - -static void update_L3L4_header(nic_t *sp, lro_t *lro) -{ - struct iphdr *ip = lro->iph; - struct tcphdr *tcp = lro->tcph; - u16 nchk; - StatInfo_t *statinfo = sp->mac_control.stats_info; - DBG_PRINT(INFO_DBG,"%s: Been here...\n", __FUNCTION__); - - /* Update L3 header */ - ip->tot_len = htons(lro->total_len); - ip->check = 0; - nchk = ip_fast_csum((u8 *)lro->iph, ip->ihl); - ip->check = nchk; - - /* Update L4 header */ - tcp->ack_seq = lro->tcp_ack; - tcp->window = lro->window; - - /* Update tsecr field if this session has timestamps enabled */ - if (lro->saw_ts) { - u32 *ptr = (u32 *)(tcp + 1); - *(ptr+2) = lro->cur_tsecr; - } - - /* Update counters required for calculation of - * average no. of packets aggregated. - */ - statinfo->sw_stat.sum_avg_pkts_aggregated += lro->sg_num; - statinfo->sw_stat.num_aggregations++; -} - -static void aggregate_new_rx(lro_t *lro, struct iphdr *ip, - struct tcphdr *tcp, u32 l4_pyld) -{ - DBG_PRINT(INFO_DBG,"%s: Been here...\n", __FUNCTION__); - lro->total_len += l4_pyld; - lro->frags_len += l4_pyld; - lro->tcp_next_seq += l4_pyld; - lro->sg_num++; - - /* Update ack seq no. and window ad(from this pkt) in LRO object */ - lro->tcp_ack = tcp->ack_seq; - lro->window = tcp->window; - - if (lro->saw_ts) { - u32 *ptr; - /* Update tsecr and tsval from this packet */ - ptr = (u32 *) (tcp + 1); - lro->cur_tsval = *(ptr + 1); - lro->cur_tsecr = *(ptr + 2); - } -} - -static int verify_l3_l4_lro_capable(lro_t *l_lro, struct iphdr *ip, - struct tcphdr *tcp, u32 tcp_pyld_len) -{ - u8 *ptr; - - DBG_PRINT(INFO_DBG,"%s: Been here...\n", __FUNCTION__); - - if (!tcp_pyld_len) { - /* Runt frame or a pure ack */ - return -1; - } - - 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->ece || tcp->cwr || !tcp->ack) { - /* - * Currently recognize only the ack control word and - * any other control field being set would result in - * flushing the LRO session - */ - return -1; - } - - /* - * Allow only one TCP timestamp option. Don't aggregate if - * any other options are detected. - */ - if (tcp->doff != 5 && tcp->doff != 8) - return -1; - - if (tcp->doff == 8) { - ptr = (u8 *)(tcp + 1); - while (*ptr == TCPOPT_NOP) - ptr++; - if (*ptr != TCPOPT_TIMESTAMP || *(ptr+1) != TCPOLEN_TIMESTAMP) - return -1; - - /* Ensure timestamp value increases monotonically */ - if (l_lro) - if (l_lro->cur_tsval > *((u32 *)(ptr+2))) - return -1; - - /* timestamp echo reply should be non-zero */ - if (*((u32 *)(ptr+6)) == 0) - return -1; - } - - return 0; -} - -static int -s2io_club_tcp_session(u8 *buffer, u8 **tcp, u32 *tcp_len, lro_t **lro, - RxD_t *rxdp, nic_t *sp) -{ - struct iphdr *ip; - struct tcphdr *tcph; - int ret = 0, i; - - if (!(ret = check_L2_lro_capable(buffer, &ip, (struct tcphdr **)tcp, - rxdp))) { - DBG_PRINT(INFO_DBG,"IP Saddr: %x Daddr: %x\n", - ip->saddr, ip->daddr); - } else { - return ret; - } - - tcph = (struct tcphdr *)*tcp; - *tcp_len = get_l4_pyld_length(ip, tcph); - for (i=0; ilro0_n[i]; - if (l_lro->in_use) { - if (check_for_socket_match(l_lro, ip, tcph)) - continue; - /* Sock pair matched */ - *lro = l_lro; - - if ((*lro)->tcp_next_seq != ntohl(tcph->seq)) { - DBG_PRINT(INFO_DBG, "%s:Out of order. expected " - "0x%x, actual 0x%x\n", __FUNCTION__, - (*lro)->tcp_next_seq, - ntohl(tcph->seq)); - - sp->mac_control.stats_info-> - sw_stat.outof_sequence_pkts++; - ret = 2; - break; - } - - if (!verify_l3_l4_lro_capable(l_lro, ip, tcph,*tcp_len)) - ret = 1; /* Aggregate */ - else - ret = 2; /* Flush both */ - break; - } - } - - if (ret == 0) { - /* Before searching for available LRO objects, - * check if the pkt is L3/L4 aggregatable. If not - * don't create new LRO session. Just send this - * packet up. - */ - if (verify_l3_l4_lro_capable(NULL, ip, tcph, *tcp_len)) { - return 5; - } - - for (i=0; ilro0_n[i]; - if (!(l_lro->in_use)) { - *lro = l_lro; - ret = 3; /* Begin anew */ - break; - } - } - } - - if (ret == 0) { /* sessions exceeded */ - DBG_PRINT(INFO_DBG,"%s:All LRO sessions already in use\n", - __FUNCTION__); - *lro = NULL; - return ret; - } - - switch (ret) { - case 3: - initiate_new_session(*lro, buffer, ip, tcph, *tcp_len); - break; - case 2: - update_L3L4_header(sp, *lro); - break; - case 1: - aggregate_new_rx(*lro, ip, tcph, *tcp_len); - if ((*lro)->sg_num == sp->lro_max_aggr_per_sess) { - update_L3L4_header(sp, *lro); - ret = 4; /* Flush the LRO */ - } - break; - default: - DBG_PRINT(ERR_DBG,"%s:Dont know, can't say!!\n", - __FUNCTION__); - break; - } - - return ret; -} - -static void clear_lro_session(lro_t *lro) -{ - static u16 lro_struct_size = sizeof(lro_t); - - memset(lro, 0, lro_struct_size); -} - -static void queue_rx_frame(struct sk_buff *skb) -{ - struct net_device *dev = skb->dev; - - skb->protocol = eth_type_trans(skb, dev); -#ifdef CONFIG_S2IO_NAPI - netif_receive_skb(skb); -#else - netif_rx(skb); -#endif -} - -static void lro_append_pkt(nic_t *sp, lro_t *lro, struct sk_buff *skb, - u32 tcp_len) -{ - struct sk_buff *first = lro->parent; - - first->len += tcp_len; - first->data_len = lro->frags_len; - skb_pull(skb, (skb->len - tcp_len)); - 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 5ed49c3be..852a6a899 100644 --- a/drivers/net/s2io.h +++ b/drivers/net/s2io.h @@ -31,8 +31,6 @@ #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 */ @@ -66,7 +64,7 @@ typedef enum xena_max_outstanding_splits { #define INTR_DBG 4 /* Global variable that defines the present debug level of the driver. */ -static int debug_level = ERR_DBG; +int debug_level = ERR_DBG; /* Default level. */ /* DEBUG message print. */ #define DBG_PRINT(dbg_level, args...) if(!(debug_level> 32), (addr + 4)); } -#endif -/* - * 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. +/* 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. */ #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 */ @@ -980,16 +911,18 @@ static void tx_intr_handler(fifo_info_t *fifo_data); static void alarm_intr_handler(struct s2io_nic *sp); static int s2io_starter(void); +void s2io_closer(void); static void s2io_tx_watchdog(struct net_device *dev); static void s2io_tasklet(unsigned long dev_addr); static void s2io_set_multicast(struct net_device *dev); static int rx_osm_handler(ring_info_t *ring_data, RxD_t * rxdp); -static void s2io_link(nic_t * sp, int link); +void s2io_link(nic_t * sp, int link); +void s2io_reset(nic_t * sp); #if defined(CONFIG_S2IO_NAPI) static int s2io_poll(struct net_device *dev, int *budget); #endif static void s2io_init_pci(nic_t * sp); -static int s2io_set_mac_addr(struct net_device *dev, u8 * addr); +int s2io_set_mac_addr(struct net_device *dev, u8 * addr); static void s2io_alarm_handle(unsigned long data); static int s2io_enable_msi(nic_t *nic); static irqreturn_t s2io_msi_handle(int irq, void *dev_id, struct pt_regs *regs); @@ -997,28 +930,14 @@ static irqreturn_t s2io_msix_ring_handle(int irq, void *dev_id, struct pt_regs *regs); static irqreturn_t s2io_msix_fifo_handle(int irq, void *dev_id, struct pt_regs *regs); +int s2io_enable_msi_x(nic_t *nic); static irqreturn_t s2io_isr(int irq, void *dev_id, struct pt_regs *regs); static int verify_xena_quiescence(nic_t *sp, u64 val64, int flag); static struct ethtool_ops netdev_ethtool_ops; static void s2io_set_link(unsigned long data); -static int s2io_set_swapper(nic_t * sp); +int s2io_set_swapper(nic_t * sp); static void s2io_card_down(nic_t *nic); static int s2io_card_up(nic_t *nic); -static int get_xena_rev_id(struct pci_dev *pdev); -static void restore_xmsi_data(nic_t *nic); - -static int s2io_club_tcp_session(u8 *buffer, u8 **tcp, u32 *tcp_len, lro_t **lro, RxD_t *rxdp, nic_t *sp); -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); - +int get_xena_rev_id(struct pci_dev *pdev); +void restore_xmsi_data(nic_t *nic); #endif /* _S2IO_H */ diff --git a/drivers/net/sb1000.c b/drivers/net/sb1000.c index 66cf226c4..76139478c 100644 --- a/drivers/net/sb1000.c +++ b/drivers/net/sb1000.c @@ -59,7 +59,7 @@ static char version[] = "sb1000.c:v1.1.2 6/01/98 (fventuri@mediaone.net)\n"; #ifdef SB1000_DEBUG static int sb1000_debug = SB1000_DEBUG; #else -static const int sb1000_debug = 1; +static int sb1000_debug = 1; #endif static const int SB1000_IO_EXTENT = 8; diff --git a/drivers/net/sb1250-mac.c b/drivers/net/sb1250-mac.c index 9ab1618e8..aa4ca1821 100644 --- a/drivers/net/sb1250-mac.c +++ b/drivers/net/sb1250-mac.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2001,2002,2003,2004 Broadcom Corporation + * Copyright (C) 2001,2002,2003 Broadcom Corporation * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -31,6 +31,7 @@ #include #include #include +#include #include #include /* Processor type for cache alignment. */ #include @@ -42,7 +43,6 @@ #define SBMAC_ETH0_HWADDR "40:00:00:00:01:00" #define SBMAC_ETH1_HWADDR "40:00:00:00:01:01" #define SBMAC_ETH2_HWADDR "40:00:00:00:01:02" -#define SBMAC_ETH3_HWADDR "40:00:00:00:01:03" #endif @@ -57,7 +57,7 @@ static char version1[] __devinitdata = #define CONFIG_SBMAC_COALESCE -#define MAX_UNITS 4 /* More are supported, limit only on options */ +#define MAX_UNITS 3 /* More are supported, limit only on options */ /* Time in jiffies before concluding the transmitter is hung. */ #define TX_TIMEOUT (2*HZ) @@ -85,11 +85,11 @@ MODULE_PARM_DESC(noisy_mii, "MII status messages"); The media type is usually passed in 'options[]'. */ #ifdef MODULE -static int options[MAX_UNITS] = {-1, -1, -1, -1}; +static int options[MAX_UNITS] = {-1, -1, -1}; module_param_array(options, int, NULL, S_IRUGO); MODULE_PARM_DESC(options, "1-" __MODULE_STRING(MAX_UNITS)); -static int full_duplex[MAX_UNITS] = {-1, -1, -1, -1}; +static int full_duplex[MAX_UNITS] = {-1, -1, -1}; module_param_array(full_duplex, int, NULL, S_IRUGO); MODULE_PARM_DESC(full_duplex, "1-" __MODULE_STRING(MAX_UNITS)); #endif @@ -105,26 +105,13 @@ MODULE_PARM_DESC(int_timeout, "Timeout value"); #endif #include -#if defined(CONFIG_SIBYTE_BCM1x55) || defined(CONFIG_SIBYTE_BCM1x80) -#include -#include -#elif defined(CONFIG_SIBYTE_SB1250) || defined(CONFIG_SIBYTE_BCM112X) +#include #include -#include -#else -#error invalid SiByte MAC configuation -#endif -#include #include #include +#include +#include -#if defined(CONFIG_SIBYTE_BCM1x55) || defined(CONFIG_SIBYTE_BCM1x80) -#define UNIT_INT(n) (K_BCM1480_INT_MAC_0 + ((n) * 2)) -#elif defined(CONFIG_SIBYTE_SB1250) || defined(CONFIG_SIBYTE_BCM112X) -#define UNIT_INT(n) (K_INT_MAC_0 + (n)) -#else -#error invalid SiByte MAC configuation -#endif /********************************************************************** * Simple types @@ -1489,10 +1476,10 @@ static void sbmac_channel_start(struct sbmac_softc *s) * and make sure that RD_THRSH + WR_THRSH <=128 for pass2 and above * Use a larger RD_THRSH for gigabit */ - if (soc_type == K_SYS_SOC_TYPE_BCM1250 && periph_rev < 2) - th_value = 28; - else + if (periph_rev >= 2) th_value = 64; + else + th_value = 28; fifo = V_MAC_TX_WR_THRSH(4) | /* Must be '4' or '8' */ ((s->sbm_speed == sbmac_speed_1000) @@ -1602,17 +1589,13 @@ static void sbmac_channel_start(struct sbmac_softc *s) * Turn on the rest of the bits in the enable register */ -#if defined(CONFIG_SIBYTE_BCM1x55) || defined(CONFIG_SIBYTE_BCM1x80) - __raw_writeq(M_MAC_RXDMA_EN0 | - M_MAC_TXDMA_EN0, s->sbm_macenable); -#elif defined(CONFIG_SIBYTE_SB1250) || defined(CONFIG_SIBYTE_BCM112X) __raw_writeq(M_MAC_RXDMA_EN0 | M_MAC_TXDMA_EN0 | M_MAC_RX_ENABLE | M_MAC_TX_ENABLE, s->sbm_macenable); -#else -#error invalid SiByte MAC configuation -#endif + + + #ifdef CONFIG_SBMAC_COALESCE /* @@ -1803,12 +1786,11 @@ static void sbmac_set_iphdr_offset(struct sbmac_softc *sc) reg &= ~M_MAC_IPHDR_OFFSET | V_MAC_IPHDR_OFFSET(15); __raw_writeq(reg, sc->sbm_rxfilter); - /* BCM1250 pass1 didn't have hardware checksum. Everything - later does. */ - if (soc_type == K_SYS_SOC_TYPE_BCM1250 && periph_rev < 2) { - sc->rx_hw_checksum = DISABLE; - } else { + /* read system identification to determine revision */ + if (periph_rev >= 2) { sc->rx_hw_checksum = ENABLE; + } else { + sc->rx_hw_checksum = DISABLE; } } @@ -2238,7 +2220,7 @@ static void sbmac_setmulti(struct sbmac_softc *sc) -#if defined(SBMAC_ETH0_HWADDR) || defined(SBMAC_ETH1_HWADDR) || defined(SBMAC_ETH2_HWADDR) || defined(SBMAC_ETH3_HWADDR) +#if defined(SBMAC_ETH0_HWADDR) || defined(SBMAC_ETH1_HWADDR) || defined(SBMAC_ETH2_HWADDR) /********************************************************************** * SBMAC_PARSE_XDIGIT(str) * @@ -2450,7 +2432,7 @@ static int sbmac_open(struct net_device *dev) */ __raw_readq(sc->sbm_isr); - if (request_irq(dev->irq, &sbmac_intr, IRQF_SHARED, dev->name, dev)) + if (request_irq(dev->irq, &sbmac_intr, SA_SHIRQ, dev->name, dev)) return -EBUSY; /* @@ -2810,7 +2792,7 @@ static int sbmac_close(struct net_device *dev) -#if defined(SBMAC_ETH0_HWADDR) || defined(SBMAC_ETH1_HWADDR) || defined(SBMAC_ETH2_HWADDR) || defined(SBMAC_ETH3_HWADDR) +#if defined(SBMAC_ETH0_HWADDR) || defined(SBMAC_ETH1_HWADDR) || defined(SBMAC_ETH2_HWADDR) static void sbmac_setup_hwaddr(int chan,char *addr) { @@ -2836,7 +2818,25 @@ sbmac_init_module(void) unsigned long port; int chip_max_units; - /* Set the number of available units based on the SOC type. */ + /* + * For bringup when not using the firmware, we can pre-fill + * the MAC addresses using the environment variables + * specified in this file (or maybe from the config file?) + */ +#ifdef SBMAC_ETH0_HWADDR + sbmac_setup_hwaddr(0,SBMAC_ETH0_HWADDR); +#endif +#ifdef SBMAC_ETH1_HWADDR + sbmac_setup_hwaddr(1,SBMAC_ETH1_HWADDR); +#endif +#ifdef SBMAC_ETH2_HWADDR + sbmac_setup_hwaddr(2,SBMAC_ETH2_HWADDR); +#endif + + /* + * Walk through the Ethernet controllers and find + * those who have their MAC addresses set. + */ switch (soc_type) { case K_SYS_SOC_TYPE_BCM1250: case K_SYS_SOC_TYPE_BCM1250_ALT: @@ -2848,10 +2848,6 @@ sbmac_init_module(void) case K_SYS_SOC_TYPE_BCM1250_ALT2: /* Hybrid */ chip_max_units = 2; break; - case K_SYS_SOC_TYPE_BCM1x55: - case K_SYS_SOC_TYPE_BCM1x80: - chip_max_units = 4; - break; default: chip_max_units = 0; break; @@ -2859,32 +2855,6 @@ sbmac_init_module(void) if (chip_max_units > MAX_UNITS) chip_max_units = MAX_UNITS; - /* - * For bringup when not using the firmware, we can pre-fill - * the MAC addresses using the environment variables - * specified in this file (or maybe from the config file?) - */ -#ifdef SBMAC_ETH0_HWADDR - if (chip_max_units > 0) - sbmac_setup_hwaddr(0,SBMAC_ETH0_HWADDR); -#endif -#ifdef SBMAC_ETH1_HWADDR - if (chip_max_units > 1) - sbmac_setup_hwaddr(1,SBMAC_ETH1_HWADDR); -#endif -#ifdef SBMAC_ETH2_HWADDR - if (chip_max_units > 2) - sbmac_setup_hwaddr(2,SBMAC_ETH2_HWADDR); -#endif -#ifdef SBMAC_ETH3_HWADDR - if (chip_max_units > 3) - sbmac_setup_hwaddr(3,SBMAC_ETH3_HWADDR); -#endif - - /* - * Walk through the Ethernet controllers and find - * those who have their MAC addresses set. - */ for (idx = 0; idx < chip_max_units; idx++) { /* @@ -2916,7 +2886,7 @@ sbmac_init_module(void) printk(KERN_DEBUG "sbmac: configuring MAC at %lx\n", port); - dev->irq = UNIT_INT(idx); + dev->irq = K_INT_MAC_0 + idx; dev->base_addr = port; dev->mem_end = 0; if (sbmac_init(dev, idx)) { diff --git a/drivers/net/seeq8005.c b/drivers/net/seeq8005.c index 01392bca0..79dca398f 100644 --- a/drivers/net/seeq8005.c +++ b/drivers/net/seeq8005.c @@ -46,7 +46,6 @@ static const char version[] = #include #include #include -#include #include #include @@ -396,7 +395,8 @@ static int seeq8005_send_packet(struct sk_buff *skb, struct net_device *dev) unsigned char *buf; if (length < ETH_ZLEN) { - if (skb_padto(skb, ETH_ZLEN)) + skb = skb_padto(skb, ETH_ZLEN); + if (skb == NULL) return 0; length = ETH_ZLEN; } @@ -699,7 +699,7 @@ static void hardware_send_packet(struct net_device * dev, char *buf, int length) int ioaddr = dev->base_addr; int status = inw(SEEQ_STATUS); int transmit_ptr = 0; - unsigned long tmp; + int tmp; if (net_debug>4) { printk("%s: send 0x%04x\n",dev->name,length); @@ -724,7 +724,7 @@ static void hardware_send_packet(struct net_device * dev, char *buf, int length) /* drain FIFO */ tmp = jiffies; - while ( (((status=inw(SEEQ_STATUS)) & SEEQSTAT_FIFO_EMPTY) == 0) && time_before(jiffies, tmp + HZ)) + while ( (((status=inw(SEEQ_STATUS)) & SEEQSTAT_FIFO_EMPTY) == 0) && (jiffies - tmp < HZ)) mb(); /* doit ! */ @@ -742,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 init_module(void) +int init_module(void) { dev_seeq = seeq8005_probe(-1); if (IS_ERR(dev_seeq)) diff --git a/drivers/net/sgiseeq.c b/drivers/net/sgiseeq.c index f95a5b022..a4614df38 100644 --- a/drivers/net/sgiseeq.c +++ b/drivers/net/sgiseeq.c @@ -3,9 +3,6 @@ * * Copyright (C) 1996 David S. Miller (dm@engr.sgi.com) */ - -#undef DEBUG - #include #include #include @@ -62,6 +59,8 @@ static char *sgiseeqstr = "SGI Seeq8003"; sp->tx_old + (SEEQ_TX_BUFFERS - 1) - sp->tx_new : \ sp->tx_old - sp->tx_new - 1) +#define DEBUG + struct sgiseeq_rx_desc { volatile struct hpc_dma_desc rdma; volatile signed int buf_vaddr; @@ -210,7 +209,7 @@ static int seeq_init_ring(struct net_device *dev) static struct sgiseeq_private *gpriv; static struct net_device *gdev; -static void sgiseeq_dump_rings(void) +void sgiseeq_dump_rings(void) { static int once; struct sgiseeq_rx_desc *r = gpriv->rx_desc; @@ -312,9 +311,9 @@ static inline void sgiseeq_rx(struct net_device *dev, struct sgiseeq_private *sp struct sgiseeq_regs *sregs) { struct sgiseeq_rx_desc *rd; - struct sk_buff *skb = NULL; + struct sk_buff *skb = 0; unsigned char pkt_status; - unsigned char *pkt_pointer = NULL; + unsigned char *pkt_pointer = 0; int len = 0; unsigned int orig_end = PREV_RX(sp->rx_new); @@ -516,6 +515,12 @@ static inline int sgiseeq_reset(struct net_device *dev) return 0; } +void sgiseeq_my_reset(void) +{ + printk("RESET!\n"); + sgiseeq_reset(gdev); +} + static int sgiseeq_start_xmit(struct sk_buff *skb, struct net_device *dev) { struct sgiseeq_private *sp = netdev_priv(dev); diff --git a/drivers/net/shaper.c b/drivers/net/shaper.c index c7832e69f..221354eea 100644 --- a/drivers/net/shaper.c +++ b/drivers/net/shaper.c @@ -69,6 +69,7 @@ * 2000/03 Andi Kleen */ +#include #include #include #include @@ -82,7 +83,6 @@ #include #include #include -#include #include #include @@ -168,7 +168,7 @@ static int shaper_start_xmit(struct sk_buff *skb, struct net_device *dev) /* * Queue over time. Spill packet. */ - if(time_after(SHAPERCB(skb)->shapeclock,jiffies + SHAPER_LATENCY)) { + if(SHAPERCB(skb)->shapeclock-jiffies > SHAPER_LATENCY) { dev_kfree_skb(skb); shaper->stats.tx_dropped++; } else diff --git a/drivers/net/sis190.c b/drivers/net/sis190.c index df0cbebb3..ed4bc9163 100644 --- a/drivers/net/sis190.c +++ b/drivers/net/sis190.c @@ -366,7 +366,7 @@ static const u32 sis190_intr_mask = * Maximum number of multicast addresses to filter (vs. Rx-all-multicast). * The chips use a 64 element hash table based on the Ethernet CRC. */ -static const int multicast_filter_limit = 32; +static int multicast_filter_limit = 32; static void __mdio_cmd(void __iomem *ioaddr, u32 ctl) { @@ -1054,7 +1054,7 @@ static int sis190_open(struct net_device *dev) sis190_request_timer(dev); - rc = request_irq(dev->irq, sis190_interrupt, IRQF_SHARED, dev->name, dev); + rc = request_irq(dev->irq, sis190_interrupt, SA_SHIRQ, dev->name, dev); if (rc < 0) goto err_release_timer_2; @@ -1156,7 +1156,8 @@ static int sis190_start_xmit(struct sk_buff *skb, struct net_device *dev) dma_addr_t mapping; if (unlikely(skb->len < ETH_ZLEN)) { - if (skb_padto(skb, ETH_ZLEN)) { + skb = skb_padto(skb, ETH_ZLEN); + if (!skb) { tp->stats.tx_dropped++; goto out; } diff --git a/drivers/net/sis900.c b/drivers/net/sis900.c index 29ee7ffed..f185b4cf7 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.10 Apr. 2 2006 + Revision: 1.08.09 Sep. 19 2005 Modified from the driver which is originally written by Donald Becker. @@ -17,10 +17,9 @@ 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 @@ -78,7 +77,7 @@ #include "sis900.h" #define SIS900_MODULE_NAME "sis900" -#define SIS900_DRV_VERSION "v1.08.10 Apr. 2 2006" +#define SIS900_DRV_VERSION "v1.08.09 Sep. 19 2005" static char version[] __devinitdata = KERN_INFO "sis900.c: " SIS900_DRV_VERSION "\n"; @@ -101,7 +100,7 @@ enum { SIS_900 = 0, SIS_7016 }; -static const char * card_names[] = { +static char * card_names[] = { "SiS 900 PCI Fast Ethernet", "SiS 7016 PCI Fast Ethernet" }; @@ -116,7 +115,7 @@ MODULE_DEVICE_TABLE (pci, sis900_pci_tbl); static void sis900_read_mode(struct net_device *net_dev, int *speed, int *duplex); -static const struct mii_chip_info { +static struct mii_chip_info { const char * name; u16 phy_id0; u16 phy_id1; @@ -128,12 +127,12 @@ static const struct mii_chip_info { } mii_chip_table[] = { { "SiS 900 Internal MII PHY", 0x001d, 0x8000, LAN }, { "SiS 7014 Physical Layer Solution", 0x0016, 0xf830, LAN }, - { "SiS 900 on Foxconn 661 7MI", 0x0143, 0xBC70, LAN }, { "Altimata AC101LF PHY", 0x0022, 0x5520, LAN }, { "ADM 7001 LAN PHY", 0x002e, 0xcc60, LAN }, { "AMD 79C901 10BASE-T PHY", 0x0000, 0x6B70, LAN }, { "AMD 79C901 HomePNA PHY", 0x0000, 0x6B90, HOME}, { "ICS LAN PHY", 0x0015, 0xF440, LAN }, + { "ICS LAN PHY", 0x0143, 0xBC70, LAN }, { "NS 83851 PHY", 0x2000, 0x5C20, MIX }, { "NS 83847 PHY", 0x2000, 0x5C30, MIX }, { "Realtek RTL8201 PHY", 0x0000, 0x8200, LAN }, @@ -403,7 +402,7 @@ static int __devinit sis900_probe(struct pci_dev *pci_dev, void *ring_space; long ioaddr; int i, ret; - const char *card_name = card_names[pci_id->driver_data]; + char *card_name = card_names[pci_id->driver_data]; const char *dev_name = pci_name(pci_dev); /* when built into the kernel, we only print version if device is found */ @@ -1013,7 +1012,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, IRQF_SHARED, + ret = request_irq(net_dev->irq, &sis900_interrupt, SA_SHIRQ, net_dev->name, net_dev); if (ret) return ret; @@ -1278,7 +1277,7 @@ static void sis900_timer(unsigned long data) struct net_device *net_dev = (struct net_device *)data; struct sis900_private *sis_priv = net_dev->priv; struct mii_phy *mii_phy = sis_priv->mii; - static const int next_tick = 5*HZ; + static int next_tick = 5*HZ; u16 status; if (!sis_priv->autong_complete){ @@ -1403,11 +1402,6 @@ 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); } @@ -1700,7 +1694,7 @@ static irqreturn_t sis900_interrupt(int irq, void *dev_instance, struct pt_regs * * Process receive interrupt events, * put buffer to higher layer and refill buffer pool - * Note: This function is called by interrupt handler, + * Note: This fucntion is called by interrupt handler, * don't do "too much" work here */ @@ -1720,26 +1714,18 @@ 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; - 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 + rx_size = (rx_status & DSIZE) - CRC_SIZE; 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/%d.\n", - net_dev->name, rx_status, data_size); + "received, buffer status = 0x%8.8x.\n", + net_dev->name, rx_status); sis_priv->stats.rx_errors++; if (rx_status & OVERRUN) sis_priv->stats.rx_over_errors++; @@ -1855,7 +1841,7 @@ static int sis900_rx(struct net_device *net_dev) * * Check for error condition and free socket buffer etc * schedule for more transmission as needed - * Note: This function is called by interrupt handler, + * Note: This fucntion is called by interrupt handler, * don't do "too much" work here */ @@ -2298,7 +2284,7 @@ static void set_rx_mode(struct net_device *net_dev) int i, table_entries; u32 rx_mode; - /* 635 Hash Table entries = 256(2^16) */ + /* 635 Hash Table entires = 256(2^16) */ if((sis_priv->chipset_rev >= SIS635A_900_REV) || (sis_priv->chipset_rev == SIS900B_900_REV)) table_entries = 16; diff --git a/drivers/net/sis900.h b/drivers/net/sis900.h index 4834e3a15..50323941e 100644 --- a/drivers/net/sis900.h +++ b/drivers/net/sis900.h @@ -310,14 +310,8 @@ enum sis630_revision_id { #define CRC_SIZE 4 #define MAC_HEADER_SIZE 14 -#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 TX_BUF_SIZE 1536 +#define RX_BUF_SIZE 1536 #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/skaddr.h b/drivers/net/sk98lin/h/skaddr.h index 423ad063d..3a2ea4a4b 100644 --- a/drivers/net/sk98lin/h/skaddr.h +++ b/drivers/net/sk98lin/h/skaddr.h @@ -236,6 +236,18 @@ extern int SkAddrMcClear( SK_U32 PortNumber, int Flags); +extern int SkAddrXmacMcClear( + SK_AC *pAC, + SK_IOC IoC, + SK_U32 PortNumber, + int Flags); + +extern int SkAddrGmacMcClear( + SK_AC *pAC, + SK_IOC IoC, + SK_U32 PortNumber, + int Flags); + extern int SkAddrMcAdd( SK_AC *pAC, SK_IOC IoC, @@ -243,11 +255,35 @@ extern int SkAddrMcAdd( SK_MAC_ADDR *pMc, int Flags); +extern int SkAddrXmacMcAdd( + SK_AC *pAC, + SK_IOC IoC, + SK_U32 PortNumber, + SK_MAC_ADDR *pMc, + int Flags); + +extern int SkAddrGmacMcAdd( + SK_AC *pAC, + SK_IOC IoC, + SK_U32 PortNumber, + SK_MAC_ADDR *pMc, + int Flags); + extern int SkAddrMcUpdate( SK_AC *pAC, SK_IOC IoC, SK_U32 PortNumber); +extern int SkAddrXmacMcUpdate( + SK_AC *pAC, + SK_IOC IoC, + SK_U32 PortNumber); + +extern int SkAddrGmacMcUpdate( + SK_AC *pAC, + SK_IOC IoC, + SK_U32 PortNumber); + extern int SkAddrOverride( SK_AC *pAC, SK_IOC IoC, @@ -261,6 +297,18 @@ extern int SkAddrPromiscuousChange( SK_U32 PortNumber, int NewPromMode); +extern int SkAddrXmacPromiscuousChange( + SK_AC *pAC, + SK_IOC IoC, + SK_U32 PortNumber, + int NewPromMode); + +extern int SkAddrGmacPromiscuousChange( + SK_AC *pAC, + SK_IOC IoC, + SK_U32 PortNumber, + int NewPromMode); + #ifndef SK_SLIM extern int SkAddrSwap( SK_AC *pAC, diff --git a/drivers/net/sk98lin/h/skcsum.h b/drivers/net/sk98lin/h/skcsum.h index 6e256bd9a..2b94adb93 100644 --- a/drivers/net/sk98lin/h/skcsum.h +++ b/drivers/net/sk98lin/h/skcsum.h @@ -203,6 +203,12 @@ extern SKCS_STATUS SkCsGetReceiveInfo( unsigned Checksum2, int NetNumber); +extern void SkCsGetSendInfo( + SK_AC *pAc, + void *pIpHeader, + SKCS_PACKET_INFO *pPacketInfo, + int NetNumber); + extern void SkCsSetReceiveFlags( SK_AC *pAc, unsigned ReceiveFlags, diff --git a/drivers/net/sk98lin/h/skgeinit.h b/drivers/net/sk98lin/h/skgeinit.h index 143e635ec..184f47c5a 100644 --- a/drivers/net/sk98lin/h/skgeinit.h +++ b/drivers/net/sk98lin/h/skgeinit.h @@ -464,6 +464,12 @@ typedef struct s_GeInit { /* * public functions in skgeinit.c */ +extern void SkGePollRxD( + SK_AC *pAC, + SK_IOC IoC, + int Port, + SK_BOOL PollRxD); + extern void SkGePollTxD( SK_AC *pAC, SK_IOC IoC, @@ -516,6 +522,10 @@ extern void SkGeXmitLED( int Led, int Mode); +extern void SkGeInitRamIface( + SK_AC *pAC, + SK_IOC IoC); + extern int SkGeInitAssignRamToQueues( SK_AC *pAC, int ActivePort, @@ -539,6 +549,11 @@ extern void SkMacHardRst( SK_IOC IoC, int Port); +extern void SkMacClearRst( + SK_AC *pAC, + SK_IOC IoC, + int Port); + extern void SkXmInitMac( SK_AC *pAC, SK_IOC IoC, @@ -565,6 +580,11 @@ extern void SkMacFlushTxFifo( SK_IOC IoC, int Port); +extern void SkMacFlushRxFifo( + SK_AC *pAC, + SK_IOC IoC, + int Port); + extern void SkMacIrq( SK_AC *pAC, SK_IOC IoC, @@ -581,6 +601,12 @@ extern void SkMacAutoNegLipaPhy( int Port, SK_U16 IStatus); +extern void SkMacSetRxTxEn( + SK_AC *pAC, + SK_IOC IoC, + int Port, + int Para); + extern int SkMacRxTxEnable( SK_AC *pAC, SK_IOC IoC, @@ -633,6 +659,16 @@ extern void SkXmClrExactAddr( int StartNum, int StopNum); +extern void SkXmInitDupMd( + SK_AC *pAC, + SK_IOC IoC, + int Port); + +extern void SkXmInitPauseMd( + SK_AC *pAC, + SK_IOC IoC, + int Port); + extern void SkXmAutoNegLipaXmac( SK_AC *pAC, SK_IOC IoC, @@ -693,6 +729,17 @@ extern int SkGmCableDiagStatus( int Port, SK_BOOL StartTest); +extern int SkGmEnterLowPowerMode( + SK_AC *pAC, + SK_IOC IoC, + int Port, + SK_U8 Mode); + +extern int SkGmLeaveLowPowerMode( + SK_AC *pAC, + SK_IOC IoC, + int Port); + #ifdef SK_DIAG extern void SkGePhyRead( SK_AC *pAC, @@ -735,6 +782,7 @@ extern void SkXmSendCont( /* * public functions in skgeinit.c */ +extern void SkGePollRxD(); extern void SkGePollTxD(); extern void SkGeYellowLED(); extern int SkGeCfgSync(); @@ -744,6 +792,7 @@ extern int SkGeInit(); extern void SkGeDeInit(); extern int SkGeInitPort(); extern void SkGeXmitLED(); +extern void SkGeInitRamIface(); extern int SkGeInitAssignRamToQueues(); /* @@ -752,15 +801,18 @@ extern int SkGeInitAssignRamToQueues(); extern void SkMacRxTxDisable(); extern void SkMacSoftRst(); extern void SkMacHardRst(); +extern void SkMacClearRst(); extern void SkMacInitPhy(); extern int SkMacRxTxEnable(); extern void SkMacPromiscMode(); extern void SkMacHashing(); extern void SkMacIrqDisable(); extern void SkMacFlushTxFifo(); +extern void SkMacFlushRxFifo(); extern void SkMacIrq(); extern int SkMacAutoNegDone(); extern void SkMacAutoNegLipaPhy(); +extern void SkMacSetRxTxEn(); extern void SkXmInitMac(); extern void SkXmPhyRead(); extern void SkXmPhyWrite(); @@ -768,6 +820,8 @@ extern void SkGmInitMac(); extern void SkGmPhyRead(); extern void SkGmPhyWrite(); extern void SkXmClrExactAddr(); +extern void SkXmInitDupMd(); +extern void SkXmInitPauseMd(); extern void SkXmAutoNegLipaXmac(); extern int SkXmUpdateStats(); extern int SkGmUpdateStats(); @@ -778,6 +832,8 @@ extern int SkGmResetCounter(); extern int SkXmOverflowStatus(); extern int SkGmOverflowStatus(); extern int SkGmCableDiagStatus(); +extern int SkGmEnterLowPowerMode(); +extern int SkGmLeaveLowPowerMode(); #ifdef SK_DIAG extern void SkGePhyRead(); diff --git a/drivers/net/sk98lin/h/skgepnmi.h b/drivers/net/sk98lin/h/skgepnmi.h index 1ed214ccb..3b2773e6f 100644 --- a/drivers/net/sk98lin/h/skgepnmi.h +++ b/drivers/net/sk98lin/h/skgepnmi.h @@ -946,6 +946,10 @@ typedef struct s_PnmiData { * Function prototypes */ extern int SkPnmiInit(SK_AC *pAC, SK_IOC IoC, int Level); +extern int SkPnmiGetVar(SK_AC *pAC, SK_IOC IoC, SK_U32 Id, void* pBuf, + unsigned int* pLen, SK_U32 Instance, SK_U32 NetIndex); +extern int SkPnmiPreSetVar(SK_AC *pAC, SK_IOC IoC, SK_U32 Id, + void* pBuf, unsigned int *pLen, SK_U32 Instance, SK_U32 NetIndex); extern int SkPnmiSetVar(SK_AC *pAC, SK_IOC IoC, SK_U32 Id, void* pBuf, unsigned int *pLen, SK_U32 Instance, SK_U32 NetIndex); extern int SkPnmiGetStruct(SK_AC *pAC, SK_IOC IoC, void* pBuf, diff --git a/drivers/net/sk98lin/h/skgesirq.h b/drivers/net/sk98lin/h/skgesirq.h index 3eec6274e..b486bd9b6 100644 --- a/drivers/net/sk98lin/h/skgesirq.h +++ b/drivers/net/sk98lin/h/skgesirq.h @@ -105,6 +105,7 @@ extern void SkGeSirqIsr(SK_AC *pAC, SK_IOC IoC, SK_U32 Istatus); extern int SkGeSirqEvent(SK_AC *pAC, SK_IOC IoC, SK_U32 Event, SK_EVPARA Para); +extern void SkHWLinkUp(SK_AC *pAC, SK_IOC IoC, int Port); extern void SkHWLinkDown(SK_AC *pAC, SK_IOC IoC, int Port); #endif /* _INC_SKGESIRQ_H_ */ diff --git a/drivers/net/sk98lin/h/ski2c.h b/drivers/net/sk98lin/h/ski2c.h index 6a63f4a15..598bb42cc 100644 --- a/drivers/net/sk98lin/h/ski2c.h +++ b/drivers/net/sk98lin/h/ski2c.h @@ -162,6 +162,9 @@ typedef struct s_I2c { } SK_I2C; extern int SkI2cInit(SK_AC *pAC, SK_IOC IoC, int Level); +extern int SkI2cWrite(SK_AC *pAC, SK_IOC IoC, SK_U32 Data, int Dev, int Size, + int Reg, int Burst); +extern int SkI2cReadSensor(SK_AC *pAC, SK_IOC IoC, SK_SENSOR *pSen); #ifdef SK_DIAG extern SK_U32 SkI2cRead(SK_AC *pAC, SK_IOC IoC, int Dev, int Size, int Reg, int Burst); diff --git a/drivers/net/sk98lin/h/skvpd.h b/drivers/net/sk98lin/h/skvpd.h index fdd9e48e8..daa9a8d15 100644 --- a/drivers/net/sk98lin/h/skvpd.h +++ b/drivers/net/sk98lin/h/skvpd.h @@ -183,6 +183,14 @@ extern SK_U32 VpdReadDWord( int addr); #endif /* SKDIAG */ +extern int VpdSetupPara( + SK_AC *pAC, + const char *key, + const char *buf, + int len, + int type, + int op); + extern SK_VPD_STATUS *VpdStat( SK_AC *pAC, SK_IOC IoC); @@ -219,6 +227,11 @@ extern int VpdUpdate( SK_AC *pAC, SK_IOC IoC); +extern void VpdErrLog( + SK_AC *pAC, + SK_IOC IoC, + char *msg); + #ifdef SKDIAG extern int VpdReadBlock( SK_AC *pAC, @@ -236,6 +249,7 @@ extern int VpdWriteBlock( #endif /* SKDIAG */ #else /* SK_KR_PROTO */ extern SK_U32 VpdReadDWord(); +extern int VpdSetupPara(); extern SK_VPD_STATUS *VpdStat(); extern int VpdKeys(); extern int VpdRead(); @@ -243,6 +257,7 @@ extern SK_BOOL VpdMayWrite(); extern int VpdWrite(); extern int VpdDelete(); extern int VpdUpdate(); +extern void VpdErrLog(); #endif /* SK_KR_PROTO */ #endif /* __INC_SKVPD_H_ */ diff --git a/drivers/net/sk98lin/h/xmac_ii.h b/drivers/net/sk98lin/h/xmac_ii.h index 7f8e6d008..2b19f8ad0 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 (7<<10) /* Bit 12..10: Collision Threshold */ +#define GM_TXCR_COL_THR_MSK (1<<10) /* Bit 12..10: Collision Threshold */ #define TX_COL_THR(x) (SHIFT10(x) & GM_TXCR_COL_THR_MSK) diff --git a/drivers/net/sk98lin/skaddr.c b/drivers/net/sk98lin/skaddr.c index 6e6c56aa6..a7e25edc7 100644 --- a/drivers/net/sk98lin/skaddr.c +++ b/drivers/net/sk98lin/skaddr.c @@ -87,21 +87,6 @@ static const SK_U16 OnesHash[4] = {0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF}; static int Next0[SK_MAX_MACS] = {0}; #endif /* DEBUG */ -static int SkAddrGmacMcAdd(SK_AC *pAC, SK_IOC IoC, SK_U32 PortNumber, - SK_MAC_ADDR *pMc, int Flags); -static int SkAddrGmacMcClear(SK_AC *pAC, SK_IOC IoC, SK_U32 PortNumber, - int Flags); -static int SkAddrGmacMcUpdate(SK_AC *pAC, SK_IOC IoC, SK_U32 PortNumber); -static int SkAddrGmacPromiscuousChange(SK_AC *pAC, SK_IOC IoC, - SK_U32 PortNumber, int NewPromMode); -static int SkAddrXmacMcAdd(SK_AC *pAC, SK_IOC IoC, SK_U32 PortNumber, - SK_MAC_ADDR *pMc, int Flags); -static int SkAddrXmacMcClear(SK_AC *pAC, SK_IOC IoC, SK_U32 PortNumber, - int Flags); -static int SkAddrXmacMcUpdate(SK_AC *pAC, SK_IOC IoC, SK_U32 PortNumber); -static int SkAddrXmacPromiscuousChange(SK_AC *pAC, SK_IOC IoC, - SK_U32 PortNumber, int NewPromMode); - /* functions ******************************************************************/ /****************************************************************************** @@ -387,7 +372,7 @@ int Flags) /* permanent/non-perm, sw-only */ * SK_ADDR_SUCCESS * SK_ADDR_ILLEGAL_PORT */ -static int SkAddrXmacMcClear( +int SkAddrXmacMcClear( SK_AC *pAC, /* adapter context */ SK_IOC IoC, /* I/O context */ SK_U32 PortNumber, /* Index of affected port */ @@ -444,7 +429,7 @@ int Flags) /* permanent/non-perm, sw-only */ * SK_ADDR_SUCCESS * SK_ADDR_ILLEGAL_PORT */ -static int SkAddrGmacMcClear( +int SkAddrGmacMcClear( SK_AC *pAC, /* adapter context */ SK_IOC IoC, /* I/O context */ SK_U32 PortNumber, /* Index of affected port */ @@ -534,7 +519,7 @@ int Flags) /* permanent/non-perm, sw-only */ * Returns: * Hash value of multicast address. */ -static SK_U32 SkXmacMcHash( +SK_U32 SkXmacMcHash( unsigned char *pMc) /* Multicast address */ { SK_U32 Idx; @@ -572,7 +557,7 @@ unsigned char *pMc) /* Multicast address */ * Returns: * Hash value of multicast address. */ -static SK_U32 SkGmacMcHash( +SK_U32 SkGmacMcHash( unsigned char *pMc) /* Multicast address */ { SK_U32 Data; @@ -687,7 +672,7 @@ int Flags) /* permanent/non-permanent */ * SK_MC_ILLEGAL_ADDRESS * SK_MC_RLMT_OVERFLOW */ -static int SkAddrXmacMcAdd( +int SkAddrXmacMcAdd( SK_AC *pAC, /* adapter context */ SK_IOC IoC, /* I/O context */ SK_U32 PortNumber, /* Port Number */ @@ -793,7 +778,7 @@ int Flags) /* permanent/non-permanent */ * SK_MC_FILTERING_INEXACT * SK_MC_ILLEGAL_ADDRESS */ -static int SkAddrGmacMcAdd( +int SkAddrGmacMcAdd( SK_AC *pAC, /* adapter context */ SK_IOC IoC, /* I/O context */ SK_U32 PortNumber, /* Port Number */ @@ -952,7 +937,7 @@ SK_U32 PortNumber) /* Port Number */ * SK_MC_FILTERING_INEXACT * SK_ADDR_ILLEGAL_PORT */ -static int SkAddrXmacMcUpdate( +int SkAddrXmacMcUpdate( SK_AC *pAC, /* adapter context */ SK_IOC IoC, /* I/O context */ SK_U32 PortNumber) /* Port Number */ @@ -1097,7 +1082,7 @@ SK_U32 PortNumber) /* Port Number */ * SK_MC_FILTERING_INEXACT * SK_ADDR_ILLEGAL_PORT */ -static int SkAddrGmacMcUpdate( +int SkAddrGmacMcUpdate( SK_AC *pAC, /* adapter context */ SK_IOC IoC, /* I/O context */ SK_U32 PortNumber) /* Port Number */ @@ -1483,7 +1468,7 @@ int NewPromMode) /* new promiscuous mode */ * SK_ADDR_SUCCESS * SK_ADDR_ILLEGAL_PORT */ -static int SkAddrXmacPromiscuousChange( +int SkAddrXmacPromiscuousChange( SK_AC *pAC, /* adapter context */ SK_IOC IoC, /* I/O context */ SK_U32 PortNumber, /* port whose promiscuous mode changes */ @@ -1600,7 +1585,7 @@ int NewPromMode) /* new promiscuous mode */ * SK_ADDR_SUCCESS * SK_ADDR_ILLEGAL_PORT */ -static int SkAddrGmacPromiscuousChange( +int SkAddrGmacPromiscuousChange( SK_AC *pAC, /* adapter context */ SK_IOC IoC, /* I/O context */ SK_U32 PortNumber, /* port whose promiscuous mode changes */ diff --git a/drivers/net/sk98lin/skge.c b/drivers/net/sk98lin/skge.c index ee62845d3..a5f2b1ee0 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, IRQF_SHARED, "sk98lin", dev); + Ret = request_irq(dev->irq, SkGeIsr, SA_SHIRQ, "sk98lin", dev); } else if (pAC->GIni.GIMacsFound == 1) { - Ret = request_irq(dev->irq, SkGeIsrOnePort, IRQF_SHARED, + Ret = request_irq(dev->irq, SkGeIsrOnePort, SA_SHIRQ, "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 (skb_padto(pMessage, C_LEN_ETHERNET_MINSIZE)) { + if ((pMessage = skb_padto(pMessage, C_LEN_ETHERNET_MINSIZE)) == NULL) { spin_unlock_irqrestore(&pTxPort->TxDesRingLock, Flags); return 0; } @@ -1727,7 +1727,7 @@ struct sk_buff *pMessage) /* pointer to send-message */ pTxd->VDataHigh = (SK_U32) (PhysAddr >> 32); pTxd->pMBuf = pMessage; - pTxd->TBControl = Control | BMU_OWN | sk_frag->size; + pTxd->TBControl = Control | BMU_OWN | sk_frag->size;; /* ** Do we have the last fragment? @@ -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, IRQF_SHARED, "sk98lin", dev); + ret = request_irq(dev->irq, SkGeIsr, SA_SHIRQ, "sk98lin", dev); else - ret = request_irq(dev->irq, SkGeIsrOnePort, IRQF_SHARED, "sk98lin", dev); + ret = request_irq(dev->irq, SkGeIsrOnePort, SA_SHIRQ, "sk98lin", dev); if (ret) { printk(KERN_WARNING "sk98lin: unable to acquire IRQ %d\n", dev->irq); pAC->AllocFlag &= ~SK_ALLOC_IRQ; diff --git a/drivers/net/sk98lin/skgeinit.c b/drivers/net/sk98lin/skgeinit.c index 67f1d6a5c..6cb49dd02 100644 --- a/drivers/net/sk98lin/skgeinit.c +++ b/drivers/net/sk98lin/skgeinit.c @@ -57,6 +57,34 @@ static struct s_Config OemConfig = { #endif }; +/****************************************************************************** + * + * SkGePollRxD() - Enable / Disable Descriptor Polling of RxD Ring + * + * Description: + * Enable or disable the descriptor polling of the receive descriptor + * ring (RxD) for port 'Port'. + * The new configuration is *not* saved over any SkGeStopPort() and + * SkGeInitPort() calls. + * + * Returns: + * nothing + */ +void SkGePollRxD( +SK_AC *pAC, /* adapter context */ +SK_IOC IoC, /* IO context */ +int Port, /* Port Index (MAC_1 + n) */ +SK_BOOL PollRxD) /* SK_TRUE (enable pol.), SK_FALSE (disable pol.) */ +{ + SK_GEPORT *pPrt; + + pPrt = &pAC->GIni.GP[Port]; + + SK_OUT32(IoC, Q_ADDR(pPrt->PRxQOff, Q_CSR), (PollRxD) ? + CSR_ENA_POL : CSR_DIS_POL); +} /* SkGePollRxD */ + + /****************************************************************************** * * SkGePollTxD() - Enable / Disable Descriptor Polling of TxD Rings @@ -924,7 +952,7 @@ int Port) /* Port Index (MAC_1 + n) */ * Returns: * nothing */ -static void SkGeInitRamIface( +void SkGeInitRamIface( SK_AC *pAC, /* adapter context */ SK_IOC IoC) /* IO context */ { @@ -1381,6 +1409,83 @@ SK_IOC IoC) /* IO context */ } /* SkGeInit0*/ +#ifdef SK_PCI_RESET + +/****************************************************************************** + * + * SkGePciReset() - Reset PCI interface + * + * Description: + * o Read PCI configuration. + * o Change power state to 3. + * o Change power state to 0. + * o Restore PCI configuration. + * + * Returns: + * 0: Success. + * 1: Power state could not be changed to 3. + */ +static int SkGePciReset( +SK_AC *pAC, /* adapter context */ +SK_IOC IoC) /* IO context */ +{ + int i; + SK_U16 PmCtlSts; + SK_U32 Bp1; + SK_U32 Bp2; + SK_U16 PciCmd; + SK_U8 Cls; + SK_U8 Lat; + SK_U8 ConfigSpace[PCI_CFG_SIZE]; + + /* + * Note: Switching to D3 state is like a software reset. + * Switching from D3 to D0 is a hardware reset. + * We have to save and restore the configuration space. + */ + for (i = 0; i < PCI_CFG_SIZE; i++) { + SkPciReadCfgDWord(pAC, i*4, &ConfigSpace[i]); + } + + /* We know the RAM Interface Arbiter is enabled. */ + SkPciWriteCfgWord(pAC, PCI_PM_CTL_STS, PCI_PM_STATE_D3); + SkPciReadCfgWord(pAC, PCI_PM_CTL_STS, &PmCtlSts); + + if ((PmCtlSts & PCI_PM_STATE_MSK) != PCI_PM_STATE_D3) { + return(1); + } + + /* Return to D0 state. */ + SkPciWriteCfgWord(pAC, PCI_PM_CTL_STS, PCI_PM_STATE_D0); + + /* Check for D0 state. */ + SkPciReadCfgWord(pAC, PCI_PM_CTL_STS, &PmCtlSts); + + if ((PmCtlSts & PCI_PM_STATE_MSK) != PCI_PM_STATE_D0) { + return(1); + } + + /* Check PCI Config Registers. */ + SkPciReadCfgWord(pAC, PCI_COMMAND, &PciCmd); + SkPciReadCfgByte(pAC, PCI_CACHE_LSZ, &Cls); + SkPciReadCfgDWord(pAC, PCI_BASE_1ST, &Bp1); + SkPciReadCfgDWord(pAC, PCI_BASE_2ND, &Bp2); + SkPciReadCfgByte(pAC, PCI_LAT_TIM, &Lat); + + if (PciCmd != 0 || Cls != (SK_U8)0 || Lat != (SK_U8)0 || + (Bp1 & 0xfffffff0L) != 0 || Bp2 != 1) { + return(1); + } + + /* Restore PCI Config Space. */ + for (i = 0; i < PCI_CFG_SIZE; i++) { + SkPciWriteCfgDWord(pAC, i*4, ConfigSpace[i]); + } + + return(0); +} /* SkGePciReset */ + +#endif /* SK_PCI_RESET */ /****************************************************************************** * @@ -1419,6 +1524,10 @@ SK_IOC IoC) /* IO context */ /* save CLK_RUN bits (YUKON-Lite) */ SK_IN16(IoC, B0_CTST, &CtrlStat); +#ifdef SK_PCI_RESET + (void)SkGePciReset(pAC, IoC); +#endif /* SK_PCI_RESET */ + /* do the SW-reset */ SK_OUT8(IoC, B0_CTST, CS_RST_SET); @@ -1882,6 +1991,11 @@ SK_IOC IoC) /* IO context */ int i; SK_U16 Word; +#ifdef SK_PHY_LP_MODE + SK_U8 Byte; + SK_U16 PmCtlSts; +#endif /* SK_PHY_LP_MODE */ + #if (!defined(SK_SLIM) && !defined(VCPU)) /* ensure I2C is ready */ SkI2cWaitIrq(pAC, IoC); @@ -1896,6 +2010,38 @@ SK_IOC IoC) /* IO context */ } } +#ifdef SK_PHY_LP_MODE + /* + * for power saving purposes within mobile environments + * we set the PHY to coma mode and switch to D3 power state. + */ + if (pAC->GIni.GIYukonLite && + pAC->GIni.GIChipRev >= CHIP_REV_YU_LITE_A3) { + + /* for all ports switch PHY to coma mode */ + for (i = 0; i < pAC->GIni.GIMacsFound; i++) { + + SkGmEnterLowPowerMode(pAC, IoC, i, PHY_PM_DEEP_SLEEP); + } + + if (pAC->GIni.GIVauxAvail) { + /* switch power to VAUX */ + Byte = PC_VAUX_ENA | PC_VCC_ENA | PC_VAUX_ON | PC_VCC_OFF; + + SK_OUT8(IoC, B0_POWER_CTRL, Byte); + } + + /* switch to D3 state */ + SK_IN16(IoC, PCI_C(PCI_PM_CTL_STS), &PmCtlSts); + + PmCtlSts |= PCI_PM_STATE_D3; + + SK_OUT8(IoC, B2_TST_CTRL1, TST_CFG_WRITE_ON); + + SK_OUT16(IoC, PCI_C(PCI_PM_CTL_STS), PmCtlSts); + } +#endif /* SK_PHY_LP_MODE */ + /* Reset all bits in the PCI STATUS register */ /* * Note: PCI Cfg cycles cannot be used, because they are not diff --git a/drivers/net/sk98lin/skgemib.c b/drivers/net/sk98lin/skgemib.c index 0a6f67a7a..2991bc85c 100644 --- a/drivers/net/sk98lin/skgemib.c +++ b/drivers/net/sk98lin/skgemib.c @@ -871,6 +871,13 @@ PNMI_STATIC const SK_PNMI_TAB_ENTRY IdTable[] = { sizeof(SK_PNMI_CONF), SK_PNMI_OFF(Conf) + SK_PNMI_CNF_OFF(ConfPhyType), SK_PNMI_RO, MacPrivateConf, 0}, +#ifdef SK_PHY_LP_MODE + {OID_SKGE_PHY_LP_MODE, + SK_PNMI_MAC_ENTRIES, + sizeof(SK_PNMI_CONF), + SK_PNMI_OFF(Conf) + SK_PNMI_CNF_OFF(ConfPhyMode), + SK_PNMI_RW, MacPrivateConf, 0}, +#endif {OID_SKGE_LINK_CAP, SK_PNMI_MAC_ENTRIES, sizeof(SK_PNMI_CONF), diff --git a/drivers/net/sk98lin/skgepnmi.c b/drivers/net/sk98lin/skgepnmi.c index b36dd9ac6..a38617210 100644 --- a/drivers/net/sk98lin/skgepnmi.c +++ b/drivers/net/sk98lin/skgepnmi.c @@ -56,6 +56,10 @@ static const char SysKonnectFileId[] = * Public Function prototypes */ int SkPnmiInit(SK_AC *pAC, SK_IOC IoC, int level); +int SkPnmiGetVar(SK_AC *pAC, SK_IOC IoC, SK_U32 Id, void *pBuf, + unsigned int *pLen, SK_U32 Instance, SK_U32 NetIndex); +int SkPnmiPreSetVar(SK_AC *pAC, SK_IOC IoC, SK_U32 Id, void *pBuf, + unsigned int *pLen, SK_U32 Instance, SK_U32 NetIndex); int SkPnmiSetVar(SK_AC *pAC, SK_IOC IoC, SK_U32 Id, void *pBuf, unsigned int *pLen, SK_U32 Instance, SK_U32 NetIndex); int SkPnmiGetStruct(SK_AC *pAC, SK_IOC IoC, void *pBuf, @@ -583,7 +587,7 @@ int Level) /* Initialization level */ * exist (e.g. port instance 3 on a two port * adapter. */ -static int SkPnmiGetVar( +int SkPnmiGetVar( SK_AC *pAC, /* Pointer to adapter context */ SK_IOC IoC, /* IO context handle */ SK_U32 Id, /* Object ID that is to be processed */ @@ -625,7 +629,7 @@ SK_U32 NetIndex) /* NetIndex (0..n), in single net mode always zero */ * exist (e.g. port instance 3 on a two port * adapter. */ -static int SkPnmiPreSetVar( +int SkPnmiPreSetVar( SK_AC *pAC, /* Pointer to adapter context */ SK_IOC IoC, /* IO context handle */ SK_U32 Id, /* Object ID that is to be processed */ @@ -5058,6 +5062,9 @@ SK_U32 NetIndex) /* NetIndex (0..n), in single net mode always zero */ case OID_SKGE_SPEED_CAP: case OID_SKGE_SPEED_MODE: case OID_SKGE_SPEED_STATUS: +#ifdef SK_PHY_LP_MODE + case OID_SKGE_PHY_LP_MODE: +#endif if (*pLen < (Limit - LogPortIndex) * sizeof(SK_U8)) { *pLen = (Limit - LogPortIndex) * sizeof(SK_U8); @@ -5133,6 +5140,28 @@ SK_U32 NetIndex) /* NetIndex (0..n), in single net mode always zero */ Offset += sizeof(SK_U32); break; +#ifdef SK_PHY_LP_MODE + case OID_SKGE_PHY_LP_MODE: + if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNetMode */ + if (LogPortIndex == 0) { + continue; + } + else { + /* Get value for physical ports */ + PhysPortIndex = SK_PNMI_PORT_LOG2PHYS(pAC, LogPortIndex); + Val8 = (SK_U8) pAC->GIni.GP[PhysPortIndex].PPhyPowerState; + *pBufPtr = Val8; + } + } + else { /* DualNetMode */ + + Val8 = (SK_U8) pAC->GIni.GP[PhysPortIndex].PPhyPowerState; + *pBufPtr = Val8; + } + Offset += sizeof(SK_U8); + break; +#endif + case OID_SKGE_LINK_CAP: if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNetMode */ if (LogPortIndex == 0) { @@ -5449,6 +5478,16 @@ SK_U32 NetIndex) /* NetIndex (0..n), in single net mode always zero */ } break; +#ifdef SK_PHY_LP_MODE + case OID_SKGE_PHY_LP_MODE: + if (*pLen < Limit - LogPortIndex) { + + *pLen = Limit - LogPortIndex; + return (SK_PNMI_ERR_TOO_SHORT); + } + break; +#endif + case OID_SKGE_MTU: if (*pLen < sizeof(SK_U32)) { @@ -5806,6 +5845,116 @@ SK_U32 NetIndex) /* NetIndex (0..n), in single net mode always zero */ Offset += sizeof(SK_U32); break; +#ifdef SK_PHY_LP_MODE + case OID_SKGE_PHY_LP_MODE: + /* The preset ends here */ + if (Action == SK_PNMI_PRESET) { + + return (SK_PNMI_ERR_OK); + } + + if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNetMode */ + if (LogPortIndex == 0) { + Offset = 0; + continue; + } + else { + /* Set value for physical ports */ + PhysPortIndex = SK_PNMI_PORT_LOG2PHYS(pAC, LogPortIndex); + + switch (*(pBuf + Offset)) { + case 0: + /* If LowPowerMode is active, we can leave it. */ + if (pAC->GIni.GP[PhysPortIndex].PPhyPowerState) { + + Val32 = SkGmLeaveLowPowerMode(pAC, IoC, PhysPortIndex); + + if (pAC->GIni.GP[PhysPortIndex].PPhyPowerState < 3) { + + SkDrvInitAdapter(pAC); + } + break; + } + else { + *pLen = 0; + return (SK_PNMI_ERR_GENERAL); + } + case 1: + case 2: + case 3: + case 4: + /* If no LowPowerMode is active, we can enter it. */ + if (!pAC->GIni.GP[PhysPortIndex].PPhyPowerState) { + + if ((*(pBuf + Offset)) < 3) { + + SkDrvDeInitAdapter(pAC); + } + + Val32 = SkGmEnterLowPowerMode(pAC, IoC, PhysPortIndex, *pBuf); + break; + } + else { + *pLen = 0; + return (SK_PNMI_ERR_GENERAL); + } + default: + *pLen = 0; + return (SK_PNMI_ERR_BAD_VALUE); + } + } + } + else { /* DualNetMode */ + + switch (*(pBuf + Offset)) { + case 0: + /* If we are in a LowPowerMode, we can leave it. */ + if (pAC->GIni.GP[PhysPortIndex].PPhyPowerState) { + + Val32 = SkGmLeaveLowPowerMode(pAC, IoC, PhysPortIndex); + + if (pAC->GIni.GP[PhysPortIndex].PPhyPowerState < 3) { + + SkDrvInitAdapter(pAC); + } + break; + } + else { + *pLen = 0; + return (SK_PNMI_ERR_GENERAL); + } + + case 1: + case 2: + case 3: + case 4: + /* If we are not already in LowPowerMode, we can enter it. */ + if (!pAC->GIni.GP[PhysPortIndex].PPhyPowerState) { + + if ((*(pBuf + Offset)) < 3) { + + SkDrvDeInitAdapter(pAC); + } + else { + + Val32 = SkGmEnterLowPowerMode(pAC, IoC, PhysPortIndex, *pBuf); + } + break; + } + else { + *pLen = 0; + return (SK_PNMI_ERR_GENERAL); + } + + default: + *pLen = 0; + return (SK_PNMI_ERR_BAD_VALUE); + } + } + Offset += sizeof(SK_U8); + break; +#endif + default: SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_ERR, ("MacPrivateConf: Unknown OID should be handled before set")); diff --git a/drivers/net/sk98lin/skgesirq.c b/drivers/net/sk98lin/skgesirq.c index ab66d80a4..87520f005 100644 --- a/drivers/net/sk98lin/skgesirq.c +++ b/drivers/net/sk98lin/skgesirq.c @@ -265,7 +265,7 @@ int Port) /* Port Index (MAC_1 + n) */ * * Returns: N/A */ -static void SkHWLinkUp( +void SkHWLinkUp( SK_AC *pAC, /* adapter context */ SK_IOC IoC, /* IO context */ int Port) /* Port Index (MAC_1 + n) */ @@ -612,6 +612,14 @@ SK_U32 Istatus) /* Interrupt status word */ * we ignore those */ pPrt->HalfDupTimerActive = SK_TRUE; +#ifdef XXX + Len = sizeof(SK_U64); + SkPnmiGetVar(pAC, IoC, OID_SKGE_STAT_TX_OCTETS, (char *)&Octets, + &Len, (SK_U32)SK_PNMI_PORT_PHYS2INST(pAC, 0), + pAC->Rlmt.Port[0].Net->NetNumber); + + pPrt->LastOctets = Octets; +#endif /* XXX */ /* Snap statistic counters */ (void)SkXmUpdateStats(pAC, IoC, 0); @@ -645,6 +653,14 @@ SK_U32 Istatus) /* Interrupt status word */ pPrt->PLinkModeStatus == SK_LMODE_STAT_AUTOHALF) && !pPrt->HalfDupTimerActive) { pPrt->HalfDupTimerActive = SK_TRUE; +#ifdef XXX + Len = sizeof(SK_U64); + SkPnmiGetVar(pAC, IoC, OID_SKGE_STAT_TX_OCTETS, (char *)&Octets, + &Len, (SK_U32)SK_PNMI_PORT_PHYS2INST(pAC, 1), + pAC->Rlmt.Port[1].Net->NetNumber); + + pPrt->LastOctets = Octets; +#endif /* XXX */ /* Snap statistic counters */ (void)SkXmUpdateStats(pAC, IoC, 1); @@ -2069,6 +2085,12 @@ SK_EVPARA Para) /* Event specific Parameter */ pPrt->HalfDupTimerActive = SK_FALSE; if (pPrt->PLinkModeStatus == SK_LMODE_STAT_HALF || pPrt->PLinkModeStatus == SK_LMODE_STAT_AUTOHALF) { +#ifdef XXX + Len = sizeof(SK_U64); + SkPnmiGetVar(pAC, IoC, OID_SKGE_STAT_TX_OCTETS, (char *)&Octets, + &Len, (SK_U32)SK_PNMI_PORT_PHYS2INST(pAC, Port), + pAC->Rlmt.Port[Port].Net->NetNumber); +#endif /* XXX */ /* Snap statistic counters */ (void)SkXmUpdateStats(pAC, IoC, Port); diff --git a/drivers/net/sk98lin/ski2c.c b/drivers/net/sk98lin/ski2c.c index 79bf57cb5..075a0464e 100644 --- a/drivers/net/sk98lin/ski2c.c +++ b/drivers/net/sk98lin/ski2c.c @@ -396,7 +396,7 @@ int Rw) /* Read / Write Flag */ * 1: error, transfer does not complete, I2C transfer * killed, wait loop terminated. */ -static int SkI2cWait( +int SkI2cWait( SK_AC *pAC, /* Adapter Context */ SK_IOC IoC, /* I/O Context */ int Event) /* complete event to wait for (I2C_READ or I2C_WRITE) */ @@ -481,7 +481,7 @@ SK_IOC IoC) /* I/O Context */ * returns 0: success * 1: error */ -static int SkI2cWrite( +int SkI2cWrite( SK_AC *pAC, /* Adapter Context */ SK_IOC IoC, /* I/O Context */ SK_U32 I2cData, /* I2C Data to write */ @@ -538,7 +538,7 @@ int I2cBurst) /* I2C Burst Flag */ * 1 if the read is completed * 0 if the read must be continued (I2C Bus still allocated) */ -static int SkI2cReadSensor( +int SkI2cReadSensor( SK_AC *pAC, /* Adapter Context */ SK_IOC IoC, /* I/O Context */ SK_SENSOR *pSen) /* Sensor to be read */ diff --git a/drivers/net/sk98lin/sklm80.c b/drivers/net/sk98lin/sklm80.c index a204f5bb5..68292d181 100644 --- a/drivers/net/sk98lin/sklm80.c +++ b/drivers/net/sk98lin/sklm80.c @@ -34,7 +34,79 @@ static const char SysKonnectFileId[] = #include "h/lm80.h" #include "h/skdrv2nd.h" /* Adapter Control- and Driver specific Def. */ +#ifdef SK_DIAG +#define BREAK_OR_WAIT(pAC,IoC,Event) SkI2cWait(pAC,IoC,Event) +#else /* nSK_DIAG */ #define BREAK_OR_WAIT(pAC,IoC,Event) break +#endif /* nSK_DIAG */ + +#ifdef SK_DIAG +/* + * read the register 'Reg' from the device 'Dev' + * + * return read error -1 + * success the read value + */ +int SkLm80RcvReg( +SK_IOC IoC, /* Adapter Context */ +int Dev, /* I2C device address */ +int Reg) /* register to read */ +{ + int Val = 0; + int TempExt; + + /* Signal device number */ + if (SkI2cSndDev(IoC, Dev, I2C_WRITE)) { + return(-1); + } + + if (SkI2cSndByte(IoC, Reg)) { + return(-1); + } + + /* repeat start */ + if (SkI2cSndDev(IoC, Dev, I2C_READ)) { + return(-1); + } + + switch (Reg) { + case LM80_TEMP_IN: + Val = (int)SkI2cRcvByte(IoC, 1); + + /* First: correct the value: it might be negative */ + if ((Val & 0x80) != 0) { + /* Value is negative */ + Val = Val - 256; + } + Val = Val * SK_LM80_TEMP_LSB; + SkI2cStop(IoC); + + TempExt = (int)SkLm80RcvReg(IoC, LM80_ADDR, LM80_TEMP_CTRL); + + if (Val > 0) { + Val += ((TempExt >> 7) * SK_LM80_TEMPEXT_LSB); + } + else { + Val -= ((TempExt >> 7) * SK_LM80_TEMPEXT_LSB); + } + return(Val); + break; + case LM80_VT0_IN: + case LM80_VT1_IN: + case LM80_VT2_IN: + case LM80_VT3_IN: + Val = (int)SkI2cRcvByte(IoC, 1) * SK_LM80_VT_LSB; + break; + + default: + Val = (int)SkI2cRcvByte(IoC, 1); + break; + } + + SkI2cStop(IoC); + return(Val); +} +#endif /* SK_DIAG */ /* * read a sensors value (LM80 specific) diff --git a/drivers/net/sk98lin/skrlmt.c b/drivers/net/sk98lin/skrlmt.c index be8d1ccdd..9ea11ab22 100644 --- a/drivers/net/sk98lin/skrlmt.c +++ b/drivers/net/sk98lin/skrlmt.c @@ -282,6 +282,7 @@ typedef struct s_SpTreeRlmtPacket { SK_MAC_ADDR SkRlmtMcAddr = {{0x01, 0x00, 0x5A, 0x52, 0x4C, 0x4D}}; SK_MAC_ADDR BridgeMcAddr = {{0x01, 0x80, 0xC2, 0x00, 0x00, 0x00}}; +SK_MAC_ADDR BcAddr = {{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}}; /* local variables ************************************************************/ diff --git a/drivers/net/sk98lin/skvpd.c b/drivers/net/sk98lin/skvpd.c index 1e662aaeb..eb3c8988c 100644 --- a/drivers/net/sk98lin/skvpd.c +++ b/drivers/net/sk98lin/skvpd.c @@ -22,7 +22,7 @@ ******************************************************************************/ /* - Please refer skvpd.txt for information how to include this module + Please refer skvpd.txt for infomation 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"; @@ -132,6 +132,65 @@ int addr) /* VPD address */ #endif /* SKDIAG */ +#if 0 + +/* + Write the dword 'data' at address 'addr' into the VPD EEPROM, and + verify that the data is written. + + Needed Time: + +. MIN MAX +. ------------------------------------------------------------------- +. write 1.8 ms 3.6 ms +. internal write cyles 0.7 ms 7.0 ms +. ------------------------------------------------------------------- +. over all program time 2.5 ms 10.6 ms +. read 1.3 ms 2.6 ms +. ------------------------------------------------------------------- +. over all 3.8 ms 13.2 ms +. + + + Returns 0: success + 1: error, I2C transfer does not terminate + 2: error, data verify error + + */ +static int VpdWriteDWord( +SK_AC *pAC, /* pAC pointer */ +SK_IOC IoC, /* IO Context */ +int addr, /* VPD address */ +SK_U32 data) /* VPD data to write */ +{ + /* start VPD write */ + /* Don't swap here, it's a data stream of bytes */ + SK_DBG_MSG(pAC, SK_DBGMOD_VPD, SK_DBGCAT_CTRL, + ("VPD write dword at addr 0x%x, data = 0x%x\n",addr,data)); + VPD_OUT32(pAC, IoC, PCI_VPD_DAT_REG, (SK_U32)data); + /* But do it here */ + addr |= VPD_WRITE; + + VPD_OUT16(pAC, IoC, PCI_VPD_ADR_REG, (SK_U16)(addr | VPD_WRITE)); + + /* this may take up to 10,6 ms */ + if (VpdWait(pAC, IoC, VPD_WRITE)) { + SK_DBG_MSG(pAC, SK_DBGMOD_VPD, SK_DBGCAT_ERR, + ("Write Timed Out\n")); + return(1); + }; + + /* verify data */ + if (VpdReadDWord(pAC, IoC, addr) != data) { + SK_DBG_MSG(pAC, SK_DBGMOD_VPD, SK_DBGCAT_ERR | SK_DBGCAT_FATAL, + ("Data Verify Error\n")); + return(2); + } + return(0); +} /* VpdWriteDWord */ + +#endif /* 0 */ + /* * Read one Stream of 'len' bytes of VPD data, starting at 'addr' from * or to the I2C EEPROM. @@ -669,7 +728,7 @@ char *etp) /* end pointer input position */ * 6: fatal VPD error * */ -static int VpdSetupPara( +int VpdSetupPara( SK_AC *pAC, /* common data base */ const char *key, /* keyword to insert */ const char *buf, /* buffer with the keyword value */ @@ -1089,3 +1148,50 @@ SK_IOC IoC) /* IO Context */ return(0); } + + +/* + * Read the contents of the VPD EEPROM and copy it to the VPD buffer + * if not already done. If the keyword "VF" is not present it will be + * created and the error log message will be stored to this keyword. + * If "VF" is not present the error log message will be stored to the + * keyword "VL". "VL" will created or overwritten if "VF" is present. + * The VPD read/write area is saved to the VPD EEPROM. + * + * returns nothing, errors will be ignored. + */ +void VpdErrLog( +SK_AC *pAC, /* common data base */ +SK_IOC IoC, /* IO Context */ +char *msg) /* error log message */ +{ + SK_VPD_PARA *v, vf; /* VF */ + int len; + + SK_DBG_MSG(pAC, SK_DBGMOD_VPD, SK_DBGCAT_TX, + ("VPD error log msg %s\n", msg)); + if ((pAC->vpd.v.vpd_status & VPD_VALID) == 0) { + if (VpdInit(pAC, IoC) != 0) { + SK_DBG_MSG(pAC, SK_DBGMOD_VPD, SK_DBGCAT_ERR, + ("VPD init error\n")); + return; + } + } + + len = strlen(msg); + if (len > VPD_MAX_LEN) { + /* cut it */ + len = VPD_MAX_LEN; + } + if ((v = vpd_find_para(pAC, VPD_VF, &vf)) != NULL) { + SK_DBG_MSG(pAC, SK_DBGMOD_VPD, SK_DBGCAT_TX, ("overwrite VL\n")); + (void)VpdSetupPara(pAC, VPD_VL, msg, len, VPD_RW_KEY, OWR_KEY); + } + else { + SK_DBG_MSG(pAC, SK_DBGMOD_VPD, SK_DBGCAT_TX, ("write VF\n")); + (void)VpdSetupPara(pAC, VPD_VF, msg, len, VPD_RW_KEY, ADD_KEY); + } + + (void)VpdUpdate(pAC, IoC); +} + diff --git a/drivers/net/sk98lin/skxmac2.c b/drivers/net/sk98lin/skxmac2.c index b4e75022a..42d2d9631 100644 --- a/drivers/net/sk98lin/skxmac2.c +++ b/drivers/net/sk98lin/skxmac2.c @@ -41,13 +41,13 @@ static const char SysKonnectFileId[] = #endif #ifdef GENESIS -static BCOM_HACK BcomRegA1Hack[] = { +BCOM_HACK BcomRegA1Hack[] = { { 0x18, 0x0c20 }, { 0x17, 0x0012 }, { 0x15, 0x1104 }, { 0x17, 0x0013 }, { 0x15, 0x0404 }, { 0x17, 0x8006 }, { 0x15, 0x0132 }, { 0x17, 0x8006 }, { 0x15, 0x0232 }, { 0x17, 0x800D }, { 0x15, 0x000F }, { 0x18, 0x0420 }, { 0, 0 } }; -static BCOM_HACK BcomRegC0Hack[] = { +BCOM_HACK BcomRegC0Hack[] = { { 0x18, 0x0c20 }, { 0x17, 0x0012 }, { 0x15, 0x1204 }, { 0x17, 0x0013 }, { 0x15, 0x0A04 }, { 0x18, 0x0420 }, { 0, 0 } @@ -790,7 +790,7 @@ int Port) /* Port Index (MAC_1 + n) */ * Returns: * nothing */ -static void SkMacFlushRxFifo( +void SkMacFlushRxFifo( SK_AC *pAC, /* adapter context */ SK_IOC IoC, /* IO context */ int Port) /* Port Index (MAC_1 + n) */ @@ -1231,6 +1231,38 @@ int Port) /* Port Index (MAC_1 + n) */ } /* SkMacHardRst */ +/****************************************************************************** + * + * SkMacClearRst() - Clear the MAC reset + * + * Description: calls a clear MAC reset routine dep. on board type + * + * Returns: + * nothing + */ +void SkMacClearRst( +SK_AC *pAC, /* adapter context */ +SK_IOC IoC, /* IO context */ +int Port) /* Port Index (MAC_1 + n) */ +{ + +#ifdef GENESIS + if (pAC->GIni.GIGenesis) { + + SkXmClearRst(pAC, IoC, Port); + } +#endif /* GENESIS */ + +#ifdef YUKON + if (pAC->GIni.GIYukon) { + + SkGmClearRst(pAC, IoC, Port); + } +#endif /* YUKON */ + +} /* SkMacClearRst */ + + #ifdef GENESIS /****************************************************************************** * @@ -1681,7 +1713,7 @@ int Port) /* Port Index (MAC_1 + n) */ * Returns: * nothing */ -static void SkXmInitDupMd( +void SkXmInitDupMd( SK_AC *pAC, /* adapter context */ SK_IOC IoC, /* IO context */ int Port) /* Port Index (MAC_1 + n) */ @@ -1729,7 +1761,7 @@ int Port) /* Port Index (MAC_1 + n) */ * Returns: * nothing */ -static void SkXmInitPauseMd( +void SkXmInitPauseMd( SK_AC *pAC, /* adapter context */ SK_IOC IoC, /* IO context */ int Port) /* Port Index (MAC_1 + n) */ @@ -2044,7 +2076,283 @@ SK_BOOL DoLoop) /* Should a Phy LoopBack be set-up? */ } /* SkXmInitPhyBcom */ #endif /* GENESIS */ + #ifdef YUKON +#ifndef SK_SLIM +/****************************************************************************** + * + * SkGmEnterLowPowerMode() + * + * Description: + * This function sets the Marvell Alaska PHY to the low power mode + * given by parameter mode. + * The following low power modes are available: + * + * - Coma Mode (Deep Sleep): + * Power consumption: ~15 - 30 mW + * The PHY cannot wake up on its own. + * + * - IEEE 22.2.4.1.5 compatible power down mode + * Power consumption: ~240 mW + * The PHY cannot wake up on its own. + * + * - energy detect mode + * Power consumption: ~160 mW + * The PHY can wake up on its own by detecting activity + * on the CAT 5 cable. + * + * - energy detect plus mode + * Power consumption: ~150 mW + * The PHY can wake up on its own by detecting activity + * on the CAT 5 cable. + * Connected devices can be woken up by sending normal link + * pulses every one second. + * + * Note: + * + * Returns: + * 0: ok + * 1: error + */ +int SkGmEnterLowPowerMode( +SK_AC *pAC, /* adapter context */ +SK_IOC IoC, /* IO context */ +int Port, /* Port Index (e.g. MAC_1) */ +SK_U8 Mode) /* low power mode */ +{ + SK_U16 Word; + SK_U32 DWord; + SK_U8 LastMode; + int Ret = 0; + + if (pAC->GIni.GIYukonLite && + pAC->GIni.GIChipRev >= CHIP_REV_YU_LITE_A3) { + + /* save current power mode */ + LastMode = pAC->GIni.GP[Port].PPhyPowerState; + pAC->GIni.GP[Port].PPhyPowerState = Mode; + + switch (Mode) { + /* coma mode (deep sleep) */ + case PHY_PM_DEEP_SLEEP: + /* setup General Purpose Control Register */ + GM_OUT16(IoC, 0, GM_GP_CTRL, GM_GPCR_FL_PASS | + GM_GPCR_SPEED_100 | GM_GPCR_AU_ALL_DIS); + + /* apply COMA mode workaround */ + SkGmPhyWrite(pAC, IoC, Port, 29, 0x001f); + SkGmPhyWrite(pAC, IoC, Port, 30, 0xfff3); + + SK_IN32(IoC, PCI_C(PCI_OUR_REG_1), &DWord); + + SK_OUT8(IoC, B2_TST_CTRL1, TST_CFG_WRITE_ON); + + /* Set PHY to Coma Mode */ + SK_OUT32(IoC, PCI_C(PCI_OUR_REG_1), DWord | PCI_PHY_COMA); + + SK_OUT8(IoC, B2_TST_CTRL1, TST_CFG_WRITE_OFF); + + break; + + /* IEEE 22.2.4.1.5 compatible power down mode */ + case PHY_PM_IEEE_POWER_DOWN: + /* + * - disable MAC 125 MHz clock + * - allow MAC power down + */ + SkGmPhyRead(pAC, IoC, Port, PHY_MARV_PHY_CTRL, &Word); + Word |= PHY_M_PC_DIS_125CLK; + Word &= ~PHY_M_PC_MAC_POW_UP; + SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_PHY_CTRL, Word); + + /* + * register changes must be followed by a software + * reset to take effect + */ + SkGmPhyRead(pAC, IoC, Port, PHY_MARV_CTRL, &Word); + Word |= PHY_CT_RESET; + SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_CTRL, Word); + + /* switch IEEE compatible power down mode on */ + SkGmPhyRead(pAC, IoC, Port, PHY_MARV_CTRL, &Word); + Word |= PHY_CT_PDOWN; + SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_CTRL, Word); + break; + + /* energy detect and energy detect plus mode */ + case PHY_PM_ENERGY_DETECT: + case PHY_PM_ENERGY_DETECT_PLUS: + /* + * - disable MAC 125 MHz clock + */ + SkGmPhyRead(pAC, IoC, Port, PHY_MARV_PHY_CTRL, &Word); + Word |= PHY_M_PC_DIS_125CLK; + SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_PHY_CTRL, Word); + + /* activate energy detect mode 1 */ + SkGmPhyRead(pAC, IoC, Port, PHY_MARV_PHY_CTRL, &Word); + + /* energy detect mode */ + if (Mode == PHY_PM_ENERGY_DETECT) { + Word |= PHY_M_PC_EN_DET; + } + /* energy detect plus mode */ + else { + Word |= PHY_M_PC_EN_DET_PLUS; + } + + SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_PHY_CTRL, Word); + + /* + * reinitialize the PHY to force a software reset + * which is necessary after the register settings + * for the energy detect modes. + * Furthermore reinitialisation prevents that the + * PHY is running out of a stable state. + */ + SkGmInitPhyMarv(pAC, IoC, Port, SK_FALSE); + break; + + /* don't change current power mode */ + default: + pAC->GIni.GP[Port].PPhyPowerState = LastMode; + Ret = 1; + break; + } + } + /* low power modes are not supported by this chip */ + else { + Ret = 1; + } + + return(Ret); + +} /* SkGmEnterLowPowerMode */ + +/****************************************************************************** + * + * SkGmLeaveLowPowerMode() + * + * Description: + * Leave the current low power mode and switch to normal mode + * + * Note: + * + * Returns: + * 0: ok + * 1: error + */ +int SkGmLeaveLowPowerMode( +SK_AC *pAC, /* adapter context */ +SK_IOC IoC, /* IO context */ +int Port) /* Port Index (e.g. MAC_1) */ +{ + SK_U32 DWord; + SK_U16 Word; + SK_U8 LastMode; + int Ret = 0; + + if (pAC->GIni.GIYukonLite && + pAC->GIni.GIChipRev >= CHIP_REV_YU_LITE_A3) { + + /* save current power mode */ + LastMode = pAC->GIni.GP[Port].PPhyPowerState; + pAC->GIni.GP[Port].PPhyPowerState = PHY_PM_OPERATIONAL_MODE; + + switch (LastMode) { + /* coma mode (deep sleep) */ + case PHY_PM_DEEP_SLEEP: + SK_IN32(IoC, PCI_C(PCI_OUR_REG_1), &DWord); + + SK_OUT8(IoC, B2_TST_CTRL1, TST_CFG_WRITE_ON); + + /* Release PHY from Coma Mode */ + SK_OUT32(IoC, PCI_C(PCI_OUR_REG_1), DWord & ~PCI_PHY_COMA); + + SK_OUT8(IoC, B2_TST_CTRL1, TST_CFG_WRITE_OFF); + + SK_IN32(IoC, B2_GP_IO, &DWord); + + /* set to output */ + DWord |= (GP_DIR_9 | GP_IO_9); + + /* set PHY reset */ + SK_OUT32(IoC, B2_GP_IO, DWord); + + DWord &= ~GP_IO_9; /* clear PHY reset (active high) */ + + /* clear PHY reset */ + SK_OUT32(IoC, B2_GP_IO, DWord); + break; + + /* IEEE 22.2.4.1.5 compatible power down mode */ + case PHY_PM_IEEE_POWER_DOWN: + /* + * - enable MAC 125 MHz clock + * - set MAC power up + */ + SkGmPhyRead(pAC, IoC, Port, PHY_MARV_PHY_CTRL, &Word); + Word &= ~PHY_M_PC_DIS_125CLK; + Word |= PHY_M_PC_MAC_POW_UP; + SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_PHY_CTRL, Word); + + /* + * register changes must be followed by a software + * reset to take effect + */ + SkGmPhyRead(pAC, IoC, Port, PHY_MARV_CTRL, &Word); + Word |= PHY_CT_RESET; + SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_CTRL, Word); + + /* switch IEEE compatible power down mode off */ + SkGmPhyRead(pAC, IoC, Port, PHY_MARV_CTRL, &Word); + Word &= ~PHY_CT_PDOWN; + SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_CTRL, Word); + break; + + /* energy detect and energy detect plus mode */ + case PHY_PM_ENERGY_DETECT: + case PHY_PM_ENERGY_DETECT_PLUS: + /* + * - enable MAC 125 MHz clock + */ + SkGmPhyRead(pAC, IoC, Port, PHY_MARV_PHY_CTRL, &Word); + Word &= ~PHY_M_PC_DIS_125CLK; + SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_PHY_CTRL, Word); + + /* disable energy detect mode */ + SkGmPhyRead(pAC, IoC, Port, PHY_MARV_PHY_CTRL, &Word); + Word &= ~PHY_M_PC_EN_DET_MSK; + SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_PHY_CTRL, Word); + + /* + * reinitialize the PHY to force a software reset + * which is necessary after the register settings + * for the energy detect modes. + * Furthermore reinitialisation prevents that the + * PHY is running out of a stable state. + */ + SkGmInitPhyMarv(pAC, IoC, Port, SK_FALSE); + break; + + /* don't change current power mode */ + default: + pAC->GIni.GP[Port].PPhyPowerState = LastMode; + Ret = 1; + break; + } + } + /* low power modes are not supported by this chip */ + else { + Ret = 1; + } + + return(Ret); + +} /* SkGmLeaveLowPowerMode */ +#endif /* !SK_SLIM */ + + /****************************************************************************** * * SkGmInitPhyMarv() - Initialize the Marvell Phy registers @@ -3112,6 +3420,145 @@ int Port) /* Port Index (MAC_1 + n) */ } /* SkMacAutoNegDone */ +#ifdef GENESIS +/****************************************************************************** + * + * SkXmSetRxTxEn() - Special Set Rx/Tx Enable and some features in XMAC + * + * Description: + * sets MAC or PHY LoopBack and Duplex Mode in the MMU Command Reg. + * enables Rx/Tx + * + * Returns: N/A + */ +static void SkXmSetRxTxEn( +SK_AC *pAC, /* Adapter Context */ +SK_IOC IoC, /* IO context */ +int Port, /* Port Index (MAC_1 + n) */ +int Para) /* Parameter to set: MAC or PHY LoopBack, Duplex Mode */ +{ + SK_U16 Word; + + XM_IN16(IoC, Port, XM_MMU_CMD, &Word); + + switch (Para & (SK_MAC_LOOPB_ON | SK_MAC_LOOPB_OFF)) { + case SK_MAC_LOOPB_ON: + Word |= XM_MMU_MAC_LB; + break; + case SK_MAC_LOOPB_OFF: + Word &= ~XM_MMU_MAC_LB; + break; + } + + switch (Para & (SK_PHY_LOOPB_ON | SK_PHY_LOOPB_OFF)) { + case SK_PHY_LOOPB_ON: + Word |= XM_MMU_GMII_LOOP; + break; + case SK_PHY_LOOPB_OFF: + Word &= ~XM_MMU_GMII_LOOP; + break; + } + + switch (Para & (SK_PHY_FULLD_ON | SK_PHY_FULLD_OFF)) { + case SK_PHY_FULLD_ON: + Word |= XM_MMU_GMII_FD; + break; + case SK_PHY_FULLD_OFF: + Word &= ~XM_MMU_GMII_FD; + break; + } + + XM_OUT16(IoC, Port, XM_MMU_CMD, Word | XM_MMU_ENA_RX | XM_MMU_ENA_TX); + + /* dummy read to ensure writing */ + XM_IN16(IoC, Port, XM_MMU_CMD, &Word); + +} /* SkXmSetRxTxEn */ +#endif /* GENESIS */ + + +#ifdef YUKON +/****************************************************************************** + * + * SkGmSetRxTxEn() - Special Set Rx/Tx Enable and some features in GMAC + * + * Description: + * sets MAC LoopBack and Duplex Mode in the General Purpose Control Reg. + * enables Rx/Tx + * + * Returns: N/A + */ +static void SkGmSetRxTxEn( +SK_AC *pAC, /* Adapter Context */ +SK_IOC IoC, /* IO context */ +int Port, /* Port Index (MAC_1 + n) */ +int Para) /* Parameter to set: MAC LoopBack, Duplex Mode */ +{ + SK_U16 Ctrl; + + GM_IN16(IoC, Port, GM_GP_CTRL, &Ctrl); + + switch (Para & (SK_MAC_LOOPB_ON | SK_MAC_LOOPB_OFF)) { + case SK_MAC_LOOPB_ON: + Ctrl |= GM_GPCR_LOOP_ENA; + break; + case SK_MAC_LOOPB_OFF: + Ctrl &= ~GM_GPCR_LOOP_ENA; + break; + } + + switch (Para & (SK_PHY_FULLD_ON | SK_PHY_FULLD_OFF)) { + case SK_PHY_FULLD_ON: + Ctrl |= GM_GPCR_DUP_FULL; + break; + case SK_PHY_FULLD_OFF: + Ctrl &= ~GM_GPCR_DUP_FULL; + break; + } + + GM_OUT16(IoC, Port, GM_GP_CTRL, (SK_U16)(Ctrl | GM_GPCR_RX_ENA | + GM_GPCR_TX_ENA)); + + /* dummy read to ensure writing */ + GM_IN16(IoC, Port, GM_GP_CTRL, &Ctrl); + +} /* SkGmSetRxTxEn */ +#endif /* YUKON */ + + +#ifndef SK_SLIM +/****************************************************************************** + * + * SkMacSetRxTxEn() - Special Set Rx/Tx Enable and parameters + * + * Description: calls the Special Set Rx/Tx Enable routines dep. on board type + * + * Returns: N/A + */ +void SkMacSetRxTxEn( +SK_AC *pAC, /* Adapter Context */ +SK_IOC IoC, /* IO context */ +int Port, /* Port Index (MAC_1 + n) */ +int Para) +{ +#ifdef GENESIS + if (pAC->GIni.GIGenesis) { + + SkXmSetRxTxEn(pAC, IoC, Port, Para); + } +#endif /* GENESIS */ + +#ifdef YUKON + if (pAC->GIni.GIYukon) { + + SkGmSetRxTxEn(pAC, IoC, Port, Para); + } +#endif /* YUKON */ + +} /* SkMacSetRxTxEn */ +#endif /* !SK_SLIM */ + + /****************************************************************************** * * SkMacRxTxEnable() - Enable Rx/Tx activity if port is up @@ -3529,7 +3976,7 @@ SK_U16 PhyStat) /* PHY Status word to analyse */ * Returns: * nothing */ -static void SkXmIrq( +void SkXmIrq( SK_AC *pAC, /* adapter context */ SK_IOC IoC, /* IO context */ int Port) /* Port Index (MAC_1 + n) */ @@ -3665,7 +4112,7 @@ int Port) /* Port Index (MAC_1 + n) */ * Returns: * nothing */ -static void SkGmIrq( +void SkGmIrq( SK_AC *pAC, /* adapter context */ SK_IOC IoC, /* IO context */ int Port) /* Port Index (MAC_1 + n) */ diff --git a/drivers/net/sk_mca.c b/drivers/net/sk_mca.c index 799e09801..e5d6d9596 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, - IRQF_SHARED | IRQF_SAMPLE_RANDOM, "sk_mca", dev); + SA_SHIRQ | SA_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/fplustm.c b/drivers/net/skfp/fplustm.c index 0784f558c..a2ed47f1c 100644 --- a/drivers/net/skfp/fplustm.c +++ b/drivers/net/skfp/fplustm.c @@ -89,21 +89,21 @@ static const u_short my_sagp = 0xffff ; /* short group address (n.u.) */ /* * useful interrupt bits */ -static const int mac_imsk1u = FM_STXABRS | FM_STXABRA0 | FM_SXMTABT ; -static const int mac_imsk1l = FM_SQLCKS | FM_SQLCKA0 | FM_SPCEPDS | FM_SPCEPDA0| +static int mac_imsk1u = FM_STXABRS | FM_STXABRA0 | FM_SXMTABT ; +static int mac_imsk1l = FM_SQLCKS | FM_SQLCKA0 | FM_SPCEPDS | FM_SPCEPDA0| FM_STBURS | FM_STBURA0 ; /* delete FM_SRBFL after tests */ -static const int mac_imsk2u = FM_SERRSF | FM_SNFSLD | FM_SRCVOVR | FM_SRBFL | +static int mac_imsk2u = FM_SERRSF | FM_SNFSLD | FM_SRCVOVR | FM_SRBFL | FM_SMYCLM ; -static const int mac_imsk2l = FM_STRTEXR | FM_SDUPCLM | FM_SFRMCTR | +static int mac_imsk2l = FM_STRTEXR | FM_SDUPCLM | FM_SFRMCTR | FM_SERRCTR | FM_SLSTCTR | FM_STRTEXP | FM_SMULTDA | FM_SRNGOP ; -static const int mac_imsk3u = FM_SRCVOVR2 | FM_SRBFL2 ; -static const int mac_imsk3l = FM_SRPERRQ2 | FM_SRPERRQ1 ; +static int mac_imsk3u = FM_SRCVOVR2 | FM_SRBFL2 ; +static int mac_imsk3l = FM_SRPERRQ2 | FM_SRPERRQ1 ; -static const int mac_beacon_imsk2u = FM_SOTRBEC | FM_SMYBEC | FM_SBEC | +static int mac_beacon_imsk2u = FM_SOTRBEC | FM_SMYBEC | FM_SBEC | FM_SLOCLM | FM_SHICLM | FM_SMYCLM | FM_SCLM ; @@ -549,12 +549,12 @@ void formac_tx_restart(struct s_smc *smc) static void enable_formac(struct s_smc *smc) { /* set formac IMSK : 0 enables irq */ - outpw(FM_A(FM_IMSK1U),(unsigned short)~mac_imsk1u); - outpw(FM_A(FM_IMSK1L),(unsigned short)~mac_imsk1l); - outpw(FM_A(FM_IMSK2U),(unsigned short)~mac_imsk2u); - outpw(FM_A(FM_IMSK2L),(unsigned short)~mac_imsk2l); - outpw(FM_A(FM_IMSK3U),(unsigned short)~mac_imsk3u); - outpw(FM_A(FM_IMSK3L),(unsigned short)~mac_imsk3l); + outpw(FM_A(FM_IMSK1U),~mac_imsk1u) ; + outpw(FM_A(FM_IMSK1L),~mac_imsk1l) ; + outpw(FM_A(FM_IMSK2U),~mac_imsk2u) ; + outpw(FM_A(FM_IMSK2L),~mac_imsk2l) ; + outpw(FM_A(FM_IMSK3U),~mac_imsk3u) ; + outpw(FM_A(FM_IMSK3L),~mac_imsk3l) ; } #if 0 /* Removed because the driver should use the ASICs TX complete IRQ. */ diff --git a/drivers/net/skfp/h/sba.h b/drivers/net/skfp/h/sba.h index 638cf0283..df716cd57 100644 --- a/drivers/net/skfp/h/sba.h +++ b/drivers/net/skfp/h/sba.h @@ -13,7 +13,7 @@ ******************************************************************************/ /* - * Synchronous Bandwidth Allocation (SBA) structs + * Synchronous Bandwith Allocation (SBA) structs */ #ifndef _SBA_ diff --git a/drivers/net/skfp/pcmplc.c b/drivers/net/skfp/pcmplc.c index 74e129f3c..cd0aa4c15 100644 --- a/drivers/net/skfp/pcmplc.c +++ b/drivers/net/skfp/pcmplc.c @@ -186,7 +186,7 @@ static const struct plt { * Do we need the EBUF error during signaling, too, to detect SUPERNET_3 * PLL bug? */ -static const int plc_imsk_na = PL_PCM_CODE | PL_TRACE_PROP | PL_PCM_BREAK | +static int plc_imsk_na = PL_PCM_CODE | PL_TRACE_PROP | PL_PCM_BREAK | PL_PCM_ENABLED | PL_SELF_TEST | PL_EBUF_ERR; #else /* SUPERNET_3 */ /* @@ -195,7 +195,7 @@ static const int plc_imsk_na = PL_PCM_CODE | PL_TRACE_PROP | PL_PCM_BREAK | static int plc_imsk_na = PL_PCM_CODE | PL_TRACE_PROP | PL_PCM_BREAK | PL_PCM_ENABLED | PL_SELF_TEST ; #endif /* SUPERNET_3 */ -static const int plc_imsk_act = PL_PCM_CODE | PL_TRACE_PROP | PL_PCM_BREAK | +static int plc_imsk_act = PL_PCM_CODE | PL_TRACE_PROP | PL_PCM_BREAK | PL_PCM_ENABLED | PL_SELF_TEST | PL_EBUF_ERR; /* external functions */ diff --git a/drivers/net/skfp/skfddi.c b/drivers/net/skfp/skfddi.c index b5714a602..4b5ed2c63 100644 --- a/drivers/net/skfp/skfddi.c +++ b/drivers/net/skfp/skfddi.c @@ -67,7 +67,7 @@ /* each new release!!! */ #define VERSION "2.07" -static const char * const boot_msg = +static const char *boot_msg = "SysKonnect FDDI PCI Adapter driver v" VERSION " for\n" " SK-55xx/SK-58xx adapters (SK-NET FDDI-FP/UP/LP)"; @@ -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, IRQF_SHARED, + err = request_irq(dev->irq, (void *) skfp_interrupt, SA_SHIRQ, dev->name, dev); if (err) return err; diff --git a/drivers/net/skge.c b/drivers/net/skge.c index ad878dfdd..25e028b7c 100644 --- a/drivers/net/skge.c +++ b/drivers/net/skge.c @@ -24,6 +24,7 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +#include #include #include #include @@ -43,13 +44,12 @@ #include "skge.h" #define DRV_NAME "skge" -#define DRV_VERSION "1.6" +#define DRV_VERSION "1.3" #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 @@ -78,7 +78,6 @@ static const struct pci_device_id skge_id_table[] = { { PCI_DEVICE(PCI_VENDOR_ID_SYSKONNECT, PCI_DEVICE_ID_SYSKONNECT_GE) }, { PCI_DEVICE(PCI_VENDOR_ID_SYSKONNECT, PCI_DEVICE_ID_SYSKONNECT_YU) }, { PCI_DEVICE(PCI_VENDOR_ID_DLINK, PCI_DEVICE_ID_DLINK_DGE510T), }, - { PCI_DEVICE(PCI_VENDOR_ID_DLINK, 0x4b01) }, /* DGE-530T */ { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4320) }, { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x5005) }, /* Belkin */ { PCI_DEVICE(PCI_VENDOR_ID_CNET, PCI_DEVICE_ID_CNET_GIGACARD) }, @@ -105,6 +104,7 @@ static const int txqaddr[] = { Q_XA1, Q_XA2 }; static const int rxqaddr[] = { Q_R1, Q_R2 }; static const u32 rxirqmask[] = { IS_R1_F, IS_R2_F }; static const u32 txirqmask[] = { IS_XA1_F, IS_XA2_F }; +static const u32 portirqmask[] = { IS_PORT_1, IS_PORT_2 }; static int skge_get_regs_len(struct net_device *dev) { @@ -358,7 +358,7 @@ static struct net_device_stats *skge_get_stats(struct net_device *dev) skge->net_stats.rx_bytes = data[1]; skge->net_stats.tx_packets = data[2] + data[4] + data[6]; skge->net_stats.rx_packets = data[3] + data[5] + data[7]; - skge->net_stats.multicast = data[3] + data[5]; + skge->net_stats.multicast = data[5] + data[7]; skge->net_stats.collisions = data[10]; skge->net_stats.tx_aborted_errors = data[12]; @@ -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 < TX_LOW_WATER || p->tx_pending > MAX_TX_RING_SIZE) + p->tx_pending == 0 || p->tx_pending > MAX_TX_RING_SIZE) return -EINVAL; skge->rx_ring.count = p->rx_pending; @@ -516,7 +516,10 @@ static int skge_set_pauseparam(struct net_device *dev, /* Chip internal frequency for clock calculations */ static inline u32 hwkhz(const struct skge_hw *hw) { - return (hw->chip_id == CHIP_ID_GENESIS) ? 53125 : 78125; + if (hw->chip_id == CHIP_ID_GENESIS) + return 53215; /* or: 53.125 MHz */ + else + return 78215; /* or: 78.125 MHz */ } /* Chip HZ to microseconds */ @@ -600,7 +603,7 @@ static void skge_led(struct skge_port *skge, enum led_mode mode) struct skge_hw *hw = skge->hw; int port = skge->port; - mutex_lock(&hw->phy_mutex); + spin_lock_bh(&hw->phy_lock); if (hw->chip_id == CHIP_ID_GENESIS) { switch (mode) { case LED_MODE_OFF: @@ -660,7 +663,7 @@ static void skge_led(struct skge_port *skge, enum led_mode mode) PHY_M_LED_MO_RX(MO_LED_ON)); } } - mutex_unlock(&hw->phy_mutex); + spin_unlock_bh(&hw->phy_lock); } /* blink LED's for finding board */ @@ -725,18 +728,19 @@ static struct ethtool_ops skge_ethtool_ops = { * Allocate ring elements and chain them together * One-to-one association of board descriptors with ring elements */ -static int skge_ring_alloc(struct skge_ring *ring, void *vaddr, u32 base) +static int skge_ring_alloc(struct skge_ring *ring, void *vaddr, u64 base) { struct skge_tx_desc *d; struct skge_element *e; int i; - ring->start = kcalloc(sizeof(*e), ring->count, GFP_KERNEL); + ring->start = kmalloc(sizeof(*e)*ring->count, GFP_KERNEL); if (!ring->start) return -ENOMEM; for (i = 0, e = ring->start, d = vaddr; i < ring->count; i++, e++, d++) { e->desc = d; + e->skb = NULL; if (i == ring->count - 1) { e->next = ring->start; d->next_offset = base; @@ -779,7 +783,7 @@ static void skge_rx_setup(struct skge_port *skge, struct skge_element *e, * Note: DMA address is not changed by chip. * MTU not changed while receiver active. */ -static inline void skge_rx_reuse(struct skge_element *e, unsigned int size) +static void skge_rx_reuse(struct skge_element *e, unsigned int size) { struct skge_rx_desc *rd = e->desc; @@ -827,7 +831,7 @@ static int skge_rx_fill(struct skge_port *skge) do { struct sk_buff *skb; - skb = alloc_skb(skge->rx_buf_size + NET_IP_ALIGN, GFP_KERNEL); + skb = dev_alloc_skb(skge->rx_buf_size + NET_IP_ALIGN); if (!skb) return -ENOMEM; @@ -845,7 +849,8 @@ static void skge_link_up(struct skge_port *skge) LED_BLK_OFF|LED_SYNC_OFF|LED_ON); netif_carrier_on(skge->netdev); - netif_wake_queue(skge->netdev); + if (skge->tx_avail > MAX_SKB_FRAGS + 1) + netif_wake_queue(skge->netdev); if (netif_msg_link(skge)) printk(KERN_INFO PFX @@ -2035,7 +2040,7 @@ static void skge_phy_reset(struct skge_port *skge) netif_stop_queue(skge->netdev); netif_carrier_off(skge->netdev); - mutex_lock(&hw->phy_mutex); + spin_lock_bh(&hw->phy_lock); if (hw->chip_id == CHIP_ID_GENESIS) { genesis_reset(hw, port); genesis_mac_init(hw, port); @@ -2043,7 +2048,7 @@ static void skge_phy_reset(struct skge_port *skge) yukon_reset(hw, port); yukon_init(hw, port); } - mutex_unlock(&hw->phy_mutex); + spin_unlock_bh(&hw->phy_lock); } /* Basic MII support */ @@ -2064,12 +2069,12 @@ static int skge_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) /* fallthru */ case SIOCGMIIREG: { u16 val = 0; - mutex_lock(&hw->phy_mutex); + spin_lock_bh(&hw->phy_lock); 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); - mutex_unlock(&hw->phy_mutex); + spin_unlock_bh(&hw->phy_lock); data->val_out = val; break; } @@ -2078,14 +2083,14 @@ static int skge_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) if (!capable(CAP_NET_ADMIN)) return -EPERM; - mutex_lock(&hw->phy_mutex); + spin_lock_bh(&hw->phy_lock); 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); - mutex_unlock(&hw->phy_mutex); + spin_unlock_bh(&hw->phy_lock); break; } return err; @@ -2152,7 +2157,7 @@ static int skge_up(struct net_device *dev) printk(KERN_INFO PFX "%s: enabling interface\n", dev->name); if (dev->mtu > RX_BUF_SIZE) - skge->rx_buf_size = dev->mtu + ETH_HLEN; + skge->rx_buf_size = dev->mtu + ETH_HLEN + NET_IP_ALIGN; else skge->rx_buf_size = RX_BUF_SIZE; @@ -2164,36 +2169,34 @@ static int skge_up(struct net_device *dev) if (!skge->mem) return -ENOMEM; - BUG_ON(skge->dma & 7); - - if ((u64)skge->dma >> 32 != ((u64) skge->dma + skge->mem_size) >> 32) { - printk(KERN_ERR PFX "pci_alloc_consistent region crosses 4G boundary\n"); - err = -EINVAL; - goto free_pci_mem; - } - memset(skge->mem, 0, skge->mem_size); - err = skge_ring_alloc(&skge->rx_ring, skge->mem, skge->dma); - if (err) + if ((err = skge_ring_alloc(&skge->rx_ring, skge->mem, skge->dma))) goto free_pci_mem; err = skge_rx_fill(skge); if (err) goto free_rx_ring; - err = skge_ring_alloc(&skge->tx_ring, skge->mem + rx_size, - skge->dma + rx_size); - if (err) + if ((err = skge_ring_alloc(&skge->tx_ring, skge->mem + rx_size, + skge->dma + rx_size))) goto free_rx_ring; + skge->tx_avail = skge->tx_ring.count - 1; + + /* Enable IRQ from port */ + spin_lock_irq(&hw->hw_lock); + hw->intr_mask |= portirqmask[port]; + skge_write32(hw, B0_IMSK, hw->intr_mask); + spin_unlock_irq(&hw->hw_lock); + /* Initialize MAC */ - mutex_lock(&hw->phy_mutex); + spin_lock_bh(&hw->phy_lock); if (hw->chip_id == CHIP_ID_GENESIS) genesis_mac_init(hw, port); else yukon_mac_init(hw, port); - mutex_unlock(&hw->phy_mutex); + spin_unlock_bh(&hw->phy_lock); /* Configure RAMbuffers */ chunk = hw->ram_size / ((hw->ports + 1)*2); @@ -2211,7 +2214,6 @@ 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: @@ -2244,6 +2246,11 @@ static int skge_down(struct net_device *dev) else yukon_stop(skge); + spin_lock_irq(&hw->hw_lock); + hw->intr_mask &= ~portirqmask[skge->port]; + skge_write32(hw, B0_IMSK, hw->intr_mask); + spin_unlock_irq(&hw->hw_lock); + /* Stop transmitter */ skge_write8(hw, Q_ADDR(txqaddr[port], Q_CSR), CSR_STOP); skge_write32(hw, RB_ADDR(txqaddr[port], RB_CTRL), @@ -2280,7 +2287,6 @@ 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); @@ -2291,16 +2297,11 @@ static int skge_down(struct net_device *dev) return 0; } -static inline int skge_avail(const struct skge_ring *ring) -{ - return ((ring->to_clean > ring->to_use) ? 0 : ring->count) - + (ring->to_clean - ring->to_use) - 1; -} - 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; @@ -2308,14 +2309,18 @@ static int skge_xmit_frame(struct sk_buff *skb, struct net_device *dev) u64 map; unsigned long flags; - if (skb_padto(skb, ETH_ZLEN)) + skb = skb_padto(skb, ETH_ZLEN); + if (!skb) return NETDEV_TX_OK; - if (!spin_trylock_irqsave(&skge->tx_lock, flags)) - /* Collision - tell upper layer to requeue */ - return NETDEV_TX_LOCKED; + local_irq_save(flags); + if (!spin_trylock(&skge->tx_lock)) { + /* Collision - tell upper layer to requeue */ + local_irq_restore(flags); + return NETDEV_TX_LOCKED; + } - if (unlikely(skge_avail(&skge->tx_ring) < skb_shinfo(skb)->nr_frags + 1)) { + if (unlikely(skge->tx_avail < skb_shinfo(skb)->nr_frags +1)) { if (!netif_queue_stopped(dev)) { netif_stop_queue(dev); @@ -2326,9 +2331,8 @@ static int skge_xmit_frame(struct sk_buff *skb, struct net_device *dev) return NETDEV_TX_BUSY; } - e = skge->tx_ring.to_use; + e = 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); @@ -2369,10 +2373,8 @@ static int skge_xmit_frame(struct sk_buff *skb, struct net_device *dev) frag->size, PCI_DMA_TODEVICE); e = e->next; - e->skb = skb; + e->skb = NULL; 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,67 +2391,53 @@ 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 (unlikely(netif_msg_tx_queued(skge))) + if (netif_msg_tx_queued(skge)) printk(KERN_DEBUG "%s: tx queued, slot %td, len %d\n", - dev->name, e - skge->tx_ring.start, skb->len); + dev->name, e - ring->start, skb->len); - skge->tx_ring.to_use = e->next; - if (skge_avail(&skge->tx_ring) <= TX_LOW_WATER) { + ring->to_use = e->next; + skge->tx_avail -= skb_shinfo(skb)->nr_frags + 1; + if (skge->tx_avail <= MAX_SKB_FRAGS + 1) { pr_debug("%s: transmit queue full\n", dev->name); netif_stop_queue(dev); } - spin_unlock_irqrestore(&skge->tx_lock, flags); - dev->trans_start = jiffies; + spin_unlock_irqrestore(&skge->tx_lock, flags); return NETDEV_TX_OK; } - -/* Free resources associated with this reing element */ -static void skge_tx_free(struct skge_port *skge, struct skge_element *e, - u32 control) +static inline void skge_tx_free(struct skge_hw *hw, struct skge_element *e) { - struct pci_dev *pdev = skge->hw->pdev; - - BUG_ON(!e->skb); - - /* skb header vs. fragment */ - if (control & BMU_STF) - pci_unmap_single(pdev, pci_unmap_addr(e, mapaddr), - pci_unmap_len(e, maplen), - PCI_DMA_TODEVICE); - else - pci_unmap_page(pdev, pci_unmap_addr(e, mapaddr), + /* This ring element can be skb or fragment */ + if (e->skb) { + pci_unmap_single(hw->pdev, + pci_unmap_addr(e, mapaddr), pci_unmap_len(e, maplen), 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_any(e->skb); + e->skb = NULL; + } else { + pci_unmap_page(hw->pdev, + pci_unmap_addr(e, mapaddr), + pci_unmap_len(e, maplen), + PCI_DMA_TODEVICE); } - e->skb = NULL; } -/* Free all buffers in transmit ring */ static void skge_tx_clean(struct skge_port *skge) { + struct skge_ring *ring = &skge->tx_ring; struct skge_element *e; unsigned long flags; spin_lock_irqsave(&skge->tx_lock, flags); - for (e = 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; + for (e = ring->to_clean; e != ring->to_use; e = e->next) { + ++skge->tx_avail; + skge_tx_free(skge->hw, e); } - - skge->tx_ring.to_clean = e; - netif_wake_queue(skge->netdev); + ring->to_clean = e; spin_unlock_irqrestore(&skge->tx_lock, flags); } @@ -2609,7 +2597,7 @@ static inline struct sk_buff *skge_rx_get(struct skge_port *skge, goto error; if (len < RX_COPY_THRESHOLD) { - skb = alloc_skb(len + 2, GFP_ATOMIC); + skb = dev_alloc_skb(len + 2); if (!skb) goto resubmit; @@ -2624,11 +2612,10 @@ static inline struct sk_buff *skge_rx_get(struct skge_port *skge, skge_rx_reuse(e, skge->rx_buf_size); } else { struct sk_buff *nskb; - nskb = alloc_skb(skge->rx_buf_size + NET_IP_ALIGN, GFP_ATOMIC); + nskb = dev_alloc_skb(skge->rx_buf_size + NET_IP_ALIGN); if (!nskb) goto resubmit; - skb_reserve(nskb, NET_IP_ALIGN); pci_unmap_single(skge->hw->pdev, pci_unmap_addr(e, mapaddr), pci_unmap_len(e, maplen), @@ -2676,32 +2663,6 @@ resubmit: return NULL; } -/* 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; - - rmb(); - - spin_lock(&skge->tx_lock); - 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; - - skge_tx_free(skge, e, td->control); - } - skge->tx_ring.to_clean = e; - - if (netif_queue_stopped(skge->netdev) - && skge_avail(&skge->tx_ring) > TX_LOW_WATER) - netif_wake_queue(skge->netdev); - - spin_unlock(&skge->tx_lock); -} static int skge_poll(struct net_device *dev, int *budget) { @@ -2709,8 +2670,8 @@ static int skge_poll(struct net_device *dev, int *budget) struct skge_hw *hw = skge->hw; struct skge_ring *ring = &skge->rx_ring; struct skge_element *e; - int to_do = min(dev->quota, *budget); - int work_done = 0; + unsigned int to_do = min(dev->quota, *budget); + unsigned int work_done = 0; for (e = ring->to_clean; prefetch(e->next), work_done < to_do; e = e->next) { struct skge_rx_desc *rd = e->desc; @@ -2722,13 +2683,15 @@ static int skge_poll(struct net_device *dev, int *budget) if (control & BMU_OWN) break; - skb = skge_rx_get(skge, e, control, rd->status, rd->csum2); + skb = skge_rx_get(skge, e, control, rd->status, + le16_to_cpu(rd->csum2)); if (likely(skb)) { dev->last_rx = jiffies; netif_receive_skb(skb); ++work_done; - } + } else + skge_rx_reuse(e, skge->rx_buf_size); } ring->to_clean = e; @@ -2742,17 +2705,49 @@ static int skge_poll(struct net_device *dev, int *budget) if (work_done >= to_do) return 1; /* not done */ - netif_rx_complete(dev); - spin_lock_irq(&hw->hw_lock); - hw->intr_mask |= rxirqmask[skge->port]; + __netif_rx_complete(dev); + hw->intr_mask |= portirqmask[skge->port]; skge_write32(hw, B0_IMSK, hw->intr_mask); - mmiowb(); - spin_unlock_irq(&hw->hw_lock); + spin_unlock_irq(&hw->hw_lock); return 0; } +static inline void skge_tx_intr(struct net_device *dev) +{ + struct skge_port *skge = netdev_priv(dev); + struct skge_hw *hw = skge->hw; + struct skge_ring *ring = &skge->tx_ring; + struct skge_element *e; + + spin_lock(&skge->tx_lock); + for (e = ring->to_clean; prefetch(e->next), e != ring->to_use; e = e->next) { + struct skge_tx_desc *td = e->desc; + u32 control; + + rmb(); + control = td->control; + if (control & BMU_OWN) + break; + + if (unlikely(netif_msg_tx_done(skge))) + printk(KERN_DEBUG PFX "%s: tx done slot %td status 0x%x\n", + dev->name, e - ring->start, td->status); + + skge_tx_free(hw, e); + e->skb = NULL; + ++skge->tx_avail; + } + ring->to_clean = e; + skge_write8(hw, Q_ADDR(txqaddr[skge->port], Q_CSR), CSR_IRQ_CL_F); + + if (skge->tx_avail > MAX_SKB_FRAGS + 1) + netif_wake_queue(dev); + + spin_unlock(&skge->tx_lock); +} + /* Parity errors seem to happen when Genesis is connected to a switch * with no other ports present. Heartbeat error?? */ @@ -2775,6 +2770,17 @@ static void skge_mac_parity(struct skge_hw *hw, int port) ? GMF_CLI_TX_FC : GMF_CLI_TX_PE); } +static void skge_pci_clear(struct skge_hw *hw) +{ + u16 status; + + pci_read_config_word(hw->pdev, PCI_STATUS, &status); + skge_write8(hw, B2_TST_CTRL1, TST_CFG_WRITE_ON); + pci_write_config_word(hw->pdev, PCI_STATUS, + status | PCI_STATUS_ERROR_BITS); + skge_write8(hw, B2_TST_CTRL1, TST_CFG_WRITE_OFF); +} + static void skge_mac_intr(struct skge_hw *hw, int port) { if (hw->chip_id == CHIP_ID_GENESIS) @@ -2816,67 +2822,52 @@ static void skge_error_irq(struct skge_hw *hw) if (hwstatus & IS_M2_PAR_ERR) skge_mac_parity(hw, 1); - if (hwstatus & IS_R1_PAR_ERR) { - printk(KERN_ERR PFX "%s: receive queue parity error\n", - hw->dev[0]->name); + if (hwstatus & IS_R1_PAR_ERR) skge_write32(hw, B0_R1_CSR, CSR_IRQ_CL_P); - } - if (hwstatus & IS_R2_PAR_ERR) { - printk(KERN_ERR PFX "%s: receive queue parity error\n", - hw->dev[1]->name); + if (hwstatus & IS_R2_PAR_ERR) skge_write32(hw, B0_R2_CSR, CSR_IRQ_CL_P); - } if (hwstatus & (IS_IRQ_MST_ERR|IS_IRQ_STAT)) { - u16 pci_status, pci_cmd; + printk(KERN_ERR PFX "hardware error detected (status 0x%x)\n", + hwstatus); - pci_read_config_word(hw->pdev, PCI_COMMAND, &pci_cmd); - pci_read_config_word(hw->pdev, PCI_STATUS, &pci_status); - - printk(KERN_ERR PFX "%s: PCI error cmd=%#x status=%#x\n", - pci_name(hw->pdev), pci_cmd, pci_status); - - /* Write the error bits back to clear them. */ - pci_status &= PCI_STATUS_ERROR_BITS; - skge_write8(hw, B2_TST_CTRL1, TST_CFG_WRITE_ON); - pci_write_config_word(hw->pdev, PCI_COMMAND, - pci_cmd | PCI_COMMAND_SERR | PCI_COMMAND_PARITY); - pci_write_config_word(hw->pdev, PCI_STATUS, pci_status); - skge_write8(hw, B2_TST_CTRL1, TST_CFG_WRITE_OFF); + skge_pci_clear(hw); /* if error still set then just ignore it */ hwstatus = skge_read32(hw, B0_HWE_ISRC); if (hwstatus & IS_IRQ_STAT) { - printk(KERN_INFO PFX "unable to clear error (so ignoring them)\n"); + pr_debug("IRQ status %x: still set ignoring hardware errors\n", + hwstatus); hw->intr_mask &= ~IS_HW_ERR; } } } /* - * Interrupt from PHY are handled in work queue + * Interrupt from PHY are handled in tasklet (soft irq) * because accessing phy registers requires spin wait which might * cause excess interrupt latency. */ -static void skge_extirq(void *arg) +static void skge_extirq(unsigned long data) { - struct skge_hw *hw = arg; + struct skge_hw *hw = (struct skge_hw *) data; int port; - mutex_lock(&hw->phy_mutex); - for (port = 0; port < hw->ports; port++) { + spin_lock(&hw->phy_lock); + for (port = 0; port < 2; port++) { struct net_device *dev = hw->dev[port]; - struct skge_port *skge = netdev_priv(dev); - if (netif_running(dev)) { + if (dev && netif_running(dev)) { + struct skge_port *skge = netdev_priv(dev); + if (hw->chip_id != CHIP_ID_GENESIS) yukon_phy_intr(skge); else bcom_phy_intr(skge); } } - mutex_unlock(&hw->phy_mutex); + spin_unlock(&hw->phy_lock); spin_lock_irq(&hw->hw_lock); hw->intr_mask |= IS_EXT_REG; @@ -2887,73 +2878,62 @@ static void skge_extirq(void *arg) static irqreturn_t skge_intr(int irq, void *dev_id, struct pt_regs *regs) { struct skge_hw *hw = dev_id; - u32 status; + u32 status = skge_read32(hw, B0_SP_ISRC); - /* Reading this register masks IRQ */ - status = skge_read32(hw, B0_SP_ISRC); - if (status == 0) + if (status == 0 || status == ~0) /* hotplug or shared irq */ return IRQ_NONE; spin_lock(&hw->hw_lock); - status &= hw->intr_mask; - if (status & IS_EXT_REG) { - hw->intr_mask &= ~IS_EXT_REG; - schedule_work(&hw->phy_work); - } - - 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_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 (status & IS_PA_TO_TX1) - skge_write16(hw, B3_PA_CTRL, PA_CLR_TO_TX1); + 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_XA1_F) + skge_tx_intr(hw->dev[0]); + + if (status & IS_XA2_F) + skge_tx_intr(hw->dev[1]); 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); + } - if (status & IS_MAC1) - skge_mac_intr(hw, 0); - - 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_TX1) + skge_write16(hw, B3_PA_CTRL, PA_CLR_TO_TX1); - 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_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 (status & IS_MAC2) + skge_mac_intr(hw, 1); if (status & IS_HW_ERR) skge_error_irq(hw); + if (status & IS_EXT_REG) { + hw->intr_mask &= ~IS_EXT_REG; + tasklet_schedule(&hw->ext_tasklet); + } + skge_write32(hw, B0_IMSK, hw->intr_mask); spin_unlock(&hw->hw_lock); @@ -2981,7 +2961,7 @@ static int skge_set_mac_address(struct net_device *dev, void *p) if (!is_valid_ether_addr(addr->sa_data)) return -EADDRNOTAVAIL; - mutex_lock(&hw->phy_mutex); + spin_lock_bh(&hw->phy_lock); memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN); memcpy_toio(hw->regs + B2_MAC_1 + port*8, dev->dev_addr, ETH_ALEN); @@ -2994,7 +2974,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); } - mutex_unlock(&hw->phy_mutex); + spin_unlock_bh(&hw->phy_lock); return 0; } @@ -3030,7 +3010,7 @@ static const char *skge_board_name(const struct skge_hw *hw) static int skge_reset(struct skge_hw *hw) { u32 reg; - u16 ctst, pci_status; + u16 ctst; u8 t8, mac_cfg, pmd_type, phy_type; int i; @@ -3041,13 +3021,8 @@ static int skge_reset(struct skge_hw *hw) skge_write8(hw, B0_CTST, CS_RST_CLR); /* clear PCI errors, if any */ - skge_write8(hw, B2_TST_CTRL1, TST_CFG_WRITE_ON); - skge_write8(hw, B2_TST_CTRL2, 0); + skge_pci_clear(hw); - pci_read_config_word(hw->pdev, PCI_STATUS, &pci_status); - pci_write_config_word(hw->pdev, PCI_STATUS, - pci_status | PCI_STATUS_ERROR_BITS); - skge_write8(hw, B2_TST_CTRL1, TST_CFG_WRITE_OFF); skge_write8(hw, B0_CTST, CS_MRST_CLR); /* restore CLK_RUN bits (for Yukon-Lite) */ @@ -3106,11 +3081,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; - + hw->intr_mask = IS_HW_ERR | IS_EXT_REG; if (hw->chip_id == CHIP_ID_GENESIS) genesis_init(hw); else { @@ -3175,14 +3146,14 @@ static int skge_reset(struct skge_hw *hw) skge_write32(hw, B0_IMSK, hw->intr_mask); - mutex_lock(&hw->phy_mutex); + spin_lock_bh(&hw->phy_lock); for (i = 0; i < hw->ports; i++) { if (hw->chip_id == CHIP_ID_GENESIS) genesis_reset(hw, i); else yukon_reset(hw, i); } - mutex_unlock(&hw->phy_mutex); + spin_unlock_bh(&hw->phy_lock); return 0; } @@ -3280,15 +3251,13 @@ static int __devinit skge_probe(struct pci_dev *pdev, struct skge_hw *hw; int err, using_dac = 0; - err = pci_enable_device(pdev); - if (err) { + if ((err = pci_enable_device(pdev))) { printk(KERN_ERR PFX "%s cannot enable PCI device\n", pci_name(pdev)); goto err_out; } - err = pci_request_regions(pdev, DRV_NAME); - if (err) { + if ((err = pci_request_regions(pdev, DRV_NAME))) { printk(KERN_ERR PFX "%s cannot obtain PCI resources\n", pci_name(pdev)); goto err_out_disable_pdev; @@ -3296,18 +3265,22 @@ static int __devinit skge_probe(struct pci_dev *pdev, pci_set_master(pdev); - if (!pci_set_dma_mask(pdev, DMA_64BIT_MASK)) { + if (sizeof(dma_addr_t) > sizeof(u32) && + !(err = pci_set_dma_mask(pdev, DMA_64BIT_MASK))) { using_dac = 1; err = pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK); - } else if (!(err = pci_set_dma_mask(pdev, DMA_32BIT_MASK))) { - using_dac = 0; - err = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK); - } - - if (err) { - printk(KERN_ERR PFX "%s no usable DMA configuration\n", - pci_name(pdev)); - goto err_out_free_regions; + if (err < 0) { + printk(KERN_ERR PFX "%s unable to obtain 64 bit DMA " + "for consistent allocations\n", pci_name(pdev)); + goto err_out_free_regions; + } + } else { + err = pci_set_dma_mask(pdev, DMA_32BIT_MASK); + if (err) { + printk(KERN_ERR PFX "%s no usable DMA configuration\n", + pci_name(pdev)); + goto err_out_free_regions; + } } #ifdef __BIG_ENDIAN @@ -3330,8 +3303,9 @@ static int __devinit skge_probe(struct pci_dev *pdev, } hw->pdev = pdev; - mutex_init(&hw->phy_mutex); - INIT_WORK(&hw->phy_work, skge_extirq, hw); + spin_lock_init(&hw->phy_lock); + spin_lock_init(&hw->hw_lock); + tasklet_init(&hw->ext_tasklet, skge_extirq, (unsigned long) hw); hw->regs = ioremap_nocache(pci_resource_start(pdev, 0), 0x4000); if (!hw->regs) { @@ -3340,8 +3314,7 @@ static int __devinit skge_probe(struct pci_dev *pdev, goto err_out_free_hw; } - err = request_irq(pdev->irq, skge_intr, IRQF_SHARED, DRV_NAME, hw); - if (err) { + if ((err = request_irq(pdev->irq, skge_intr, SA_SHIRQ, DRV_NAME, hw))) { printk(KERN_ERR PFX "%s: cannot assign irq %d\n", pci_name(pdev), pdev->irq); goto err_out_iounmap; @@ -3352,23 +3325,14 @@ static int __devinit skge_probe(struct pci_dev *pdev, if (err) goto err_out_free_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, + printk(KERN_INFO PFX DRV_VERSION " addr 0x%lx irq %d chip %s rev %d\n", + 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) { + if ((err = register_netdev(dev))) { printk(KERN_ERR PFX "%s: cannot register net device\n", pci_name(pdev)); goto err_out_free_netdev; @@ -3421,15 +3385,12 @@ 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_pci_clear(hw); skge_write8(hw, B0_CTST, CS_RST_SET); - flush_scheduled_work(); + tasklet_kill(&hw->ext_tasklet); free_irq(pdev->irq, hw); pci_release_regions(pdev); diff --git a/drivers/net/skge.h b/drivers/net/skge.h index 593387b3c..941f12a33 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 = 7<<10, /* Bit 12..10: Collision Threshold */ + GM_TXCR_COL_THR_MSK = 1<<10, /* Bit 12..10: Collision Threshold */ }; #define TX_COL_THR(x) (((x)<<10) & GM_TXCR_COL_THR_MSK) -#define TX_COL_DEF 0x04 /* late collision after 64 byte */ +#define TX_COL_DEF 0x04 /* GM_RX_CTRL 16 bit r/w Receive Control Register */ enum { @@ -2388,7 +2388,6 @@ 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]; @@ -2400,8 +2399,10 @@ struct skge_hw { u32 ram_size; u32 ram_offset; u16 phy_addr; - struct work_struct phy_work; - struct mutex phy_mutex; + + struct tasklet_struct ext_tasklet; + spinlock_t phy_lock; + spinlock_t hw_lock; }; enum { @@ -2418,6 +2419,7 @@ struct skge_port { int port; spinlock_t tx_lock; + u32 tx_avail; struct skge_ring tx_ring; struct skge_ring rx_ring; diff --git a/drivers/net/sky2.c b/drivers/net/sky2.c index ebe7e2599..d77358649 100644 --- a/drivers/net/sky2.c +++ b/drivers/net/sky2.c @@ -23,6 +23,7 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +#include #include #include #include @@ -50,7 +51,7 @@ #include "sky2.h" #define DRV_NAME "sky2" -#define DRV_VERSION "1.5" +#define DRV_VERSION "0.15" #define PFX DRV_NAME " " /* @@ -60,12 +61,15 @@ * a receive requires one (or two if using 64 bit dma). */ +#define is_ec_a1(hw) \ + unlikely((hw)->chip_id == CHIP_ID_YUKON_EC && \ + (hw)->chip_rev == CHIP_REV_YU_EC_A1) + #define RX_LE_SIZE 512 #define RX_LE_BYTES (RX_LE_SIZE*sizeof(struct sky2_rx_le)) #define RX_MAX_PENDING (RX_LE_SIZE/2 - 2) #define RX_DEF_PENDING RX_MAX_PENDING #define RX_SKB_ALIGN 8 -#define RX_BUF_WRITE 16 #define TX_RING_SIZE 512 #define TX_DEF_PENDING (TX_RING_SIZE - 1) @@ -79,8 +83,6 @@ #define NAPI_WEIGHT 64 #define PHY_RETRIES 1000 -#define RING_NEXT(x,s) (((x)+1) & ((s)-1)) - static const u32 default_msg = NETIF_MSG_DRV | NETIF_MSG_PROBE | NETIF_MSG_LINK | NETIF_MSG_TIMER | NETIF_MSG_TX_ERR | NETIF_MSG_RX_ERR @@ -94,19 +96,11 @@ static int copybreak __read_mostly = 256; module_param(copybreak, int, 0); MODULE_PARM_DESC(copybreak, "Receive copy threshold"); -static int disable_msi = 0; -module_param(disable_msi, int, 0); -MODULE_PARM_DESC(disable_msi, "Disable Message Signaled Interrupt (MSI)"); - -static int idle_timeout = 100; -module_param(idle_timeout, int, 0); -MODULE_PARM_DESC(idle_timeout, "Idle timeout workaround for lost interrupts (ms)"); - 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_DLINK, 0x4b00) }, + { PCI_DEVICE(PCI_VENDOR_ID_DLINK, 0x4b01) }, { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4340) }, { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4341) }, { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4342) }, @@ -118,17 +112,10 @@ 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 } }; @@ -137,7 +124,6 @@ MODULE_DEVICE_TABLE(pci, sky2_id_table); /* Avoid conditionals by using array */ static const unsigned txqaddr[] = { Q_XA1, Q_XA2 }; static const unsigned rxqaddr[] = { Q_R1, Q_R2 }; -static const u32 portirq_msk[] = { Y2_IS_PORT_1, Y2_IS_PORT_2 }; /* This driver supports yukon2 chipset only */ static const char *yukon2_name[] = { @@ -195,11 +181,12 @@ static u16 gm_phy_read(struct sky2_hw *hw, unsigned port, u16 reg) return v; } -static void sky2_set_power_state(struct sky2_hw *hw, pci_power_t state) +static int sky2_set_power_state(struct sky2_hw *hw, pci_power_t state) { u16 power_control; u32 reg1; int vaux; + int ret = 0; pr_debug("sky2_set_power_state %d\n", state); sky2_write8(hw, B2_TST_CTRL1, TST_CFG_WRITE_ON); @@ -241,8 +228,6 @@ static void sky2_set_power_state(struct sky2_hw *hw, pci_power_t state) if (hw->ports > 1) reg1 |= PCI_Y2_PHY2_COMA; } - sky2_pci_write32(hw, PCI_DEV_REG1, reg1); - udelay(100); if (hw->chip_id == CHIP_ID_YUKON_EC_U) { sky2_pci_write32(hw, PCI_DEV_REG3, 0); @@ -252,6 +237,8 @@ static void sky2_set_power_state(struct sky2_hw *hw, pci_power_t state) sky2_pci_write32(hw, PCI_DEV_REG5, 0); } + sky2_pci_write32(hw, PCI_DEV_REG1, reg1); + break; case PCI_D3hot: @@ -263,7 +250,6 @@ 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); @@ -282,10 +268,12 @@ static void sky2_set_power_state(struct sky2_hw *hw, pci_power_t state) break; default: printk(KERN_ERR PFX "Unknown power state %d\n", state); + ret = -1; } sky2_pci_write16(hw, hw->pm_cap + PCI_PM_CTRL, power_control); sky2_write8(hw, B2_TST_CTRL1, TST_CFG_WRITE_OFF); + return ret; } static void sky2_phy_reset(struct sky2_hw *hw, unsigned port) @@ -312,8 +300,7 @@ static void sky2_phy_init(struct sky2_hw *hw, unsigned port) struct sky2_port *sky2 = netdev_priv(hw->dev[port]); u16 ctrl, ct1000, adv, pg, ledctrl, ledover; - if (sky2->autoneg == AUTONEG_ENABLE && - !(hw->chip_id == CHIP_ID_YUKON_XL || hw->chip_id == CHIP_ID_YUKON_EC_U)) { + if (sky2->autoneg == AUTONEG_ENABLE && hw->chip_id != CHIP_ID_YUKON_XL) { u16 ectrl = gm_phy_read(hw, port, PHY_MARV_EXT_CTRL); ectrl &= ~(PHY_M_EC_M_DSC_MSK | PHY_M_EC_S_DSC_MSK | @@ -329,7 +316,7 @@ static void sky2_phy_init(struct sky2_hw *hw, unsigned port) } ctrl = gm_phy_read(hw, port, PHY_MARV_PHY_CTRL); - if (hw->copper) { + if (sky2_is_copper(hw)) { if (hw->chip_id == CHIP_ID_YUKON_FE) { /* enable automatic crossover */ ctrl |= PHY_M_PC_MDI_XMODE(PHY_M_PC_ENA_AUTO) >> 1; @@ -341,30 +328,42 @@ static void sky2_phy_init(struct sky2_hw *hw, unsigned port) ctrl |= PHY_M_PC_MDI_XMODE(PHY_M_PC_ENA_AUTO); if (sky2->autoneg == AUTONEG_ENABLE && - (hw->chip_id == CHIP_ID_YUKON_XL || hw->chip_id == CHIP_ID_YUKON_EC_U)) { + hw->chip_id == CHIP_ID_YUKON_XL) { ctrl &= ~PHY_M_PC_DSC_MSK; ctrl |= PHY_M_PC_DSC(2) | PHY_M_PC_DOWN_S_ENA; } } - gm_phy_write(hw, port, PHY_MARV_PHY_CTRL, ctrl); } else { /* workaround for deviation #4.88 (CRC errors) */ /* disable Automatic Crossover */ ctrl &= ~PHY_M_PC_MDIX_MSK; - gm_phy_write(hw, port, PHY_MARV_PHY_CTRL, ctrl); + } - if (hw->chip_id == CHIP_ID_YUKON_XL) { - /* Fiber: select 1000BASE-X only mode MAC Specific Ctrl Reg. */ - gm_phy_write(hw, port, PHY_MARV_EXT_ADR, 2); - ctrl = gm_phy_read(hw, port, PHY_MARV_PHY_CTRL); - ctrl &= ~PHY_M_MAC_MD_MSK; - ctrl |= PHY_M_MAC_MODE_SEL(PHY_M_MAC_MD_1000BX); - gm_phy_write(hw, port, PHY_MARV_PHY_CTRL, ctrl); + 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') { /* 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); @@ -381,7 +380,7 @@ static void sky2_phy_init(struct sky2_hw *hw, unsigned port) adv = PHY_AN_CSMA; if (sky2->autoneg == AUTONEG_ENABLE) { - if (hw->copper) { + if (sky2_is_copper(hw)) { if (sky2->advertising & ADVERTISED_1000baseT_Full) ct1000 |= PHY_M_1000C_AFD; if (sky2->advertising & ADVERTISED_1000baseT_Half) @@ -394,8 +393,12 @@ 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 (88E1011S only) */ - adv |= PHY_M_AN_1000X_AHD | PHY_M_AN_1000X_AFD; + } 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; + } /* Set Flow-control capabilities */ if (sky2->tx_pause && sky2->rx_pause) @@ -457,11 +460,10 @@ static void sky2_phy_init(struct sky2_hw *hw, unsigned port) gm_phy_write(hw, port, PHY_MARV_EXT_ADR, 3); /* set LED Function Control register */ - gm_phy_write(hw, port, PHY_MARV_PHY_CTRL, - (PHY_M_LEDC_LOS_CTRL(1) | /* LINK/ACT */ - PHY_M_LEDC_INIT_CTRL(7) | /* 10 Mbps */ - PHY_M_LEDC_STA1_CTRL(7) | /* 100 Mbps */ - PHY_M_LEDC_STA0_CTRL(7))); /* 1000 Mbps */ + gm_phy_write(hw, port, PHY_MARV_PHY_CTRL, (PHY_M_LEDC_LOS_CTRL(1) | /* LINK/ACT */ + PHY_M_LEDC_INIT_CTRL(7) | /* 10 Mbps */ + PHY_M_LEDC_STA1_CTRL(7) | /* 100 Mbps */ + PHY_M_LEDC_STA0_CTRL(7))); /* 1000 Mbps */ /* set Polarity Control register */ gm_phy_write(hw, port, PHY_MARV_PHY_STAT, @@ -475,25 +477,6 @@ static void sky2_phy_init(struct sky2_hw *hw, unsigned port) /* restore page register */ gm_phy_write(hw, port, PHY_MARV_EXT_ADR, pg); break; - case CHIP_ID_YUKON_EC_U: - pg = gm_phy_read(hw, port, PHY_MARV_EXT_ADR); - - /* select page 3 to access LED control register */ - gm_phy_write(hw, port, PHY_MARV_EXT_ADR, 3); - - /* set LED Function Control register */ - gm_phy_write(hw, port, PHY_MARV_PHY_CTRL, - (PHY_M_LEDC_LOS_CTRL(1) | /* LINK/ACT */ - PHY_M_LEDC_INIT_CTRL(8) | /* 10 Mbps */ - PHY_M_LEDC_STA1_CTRL(7) | /* 100 Mbps */ - PHY_M_LEDC_STA0_CTRL(7)));/* 1000 Mbps */ - - /* set Blink Rate in LED Timer Control Register */ - gm_phy_write(hw, port, PHY_MARV_INT_MASK, - ledctrl | PHY_M_LED_BLINK_RT(BLINK_84MS)); - /* restore page register */ - gm_phy_write(hw, port, PHY_MARV_EXT_ADR, pg); - break; default: /* set Tx LED (LED_TX) to blink mode on Rx OR Tx activity */ @@ -502,21 +485,19 @@ static void sky2_phy_init(struct sky2_hw *hw, unsigned port) ledover |= PHY_M_LED_MO_RX(MO_LED_OFF); } - if (hw->chip_id == CHIP_ID_YUKON_EC_U && hw->chip_rev == CHIP_REV_YU_EC_A1) { + if (hw->chip_id == CHIP_ID_YUKON_EC_U && hw->chip_rev >= 2) { /* apply fixes in PHY AFE */ - pg = gm_phy_read(hw, port, PHY_MARV_EXT_ADR); - gm_phy_write(hw, port, PHY_MARV_EXT_ADR, 255); - + gm_phy_write(hw, port, 22, 255); /* increase differential signal amplitude in 10BASE-T */ - gm_phy_write(hw, port, 0x18, 0xaa99); - gm_phy_write(hw, port, 0x17, 0x2011); + gm_phy_write(hw, port, 24, 0xaa99); + gm_phy_write(hw, port, 23, 0x2011); /* fix for IEEE A/B Symmetry failure in 1000BASE-T */ - gm_phy_write(hw, port, 0x18, 0xa204); - gm_phy_write(hw, port, 0x17, 0x2002); + gm_phy_write(hw, port, 24, 0xa204); + gm_phy_write(hw, port, 23, 0x2002); /* set page register to 0 */ - gm_phy_write(hw, port, PHY_MARV_EXT_ADR, pg); + gm_phy_write(hw, port, 22, 0); } else { gm_phy_write(hw, port, PHY_MARV_LED_CTRL, ledctrl); @@ -539,9 +520,9 @@ static void sky2_phy_init(struct sky2_hw *hw, unsigned port) /* Force a renegotiation */ static void sky2_phy_reinit(struct sky2_port *sky2) { - spin_lock_bh(&sky2->phy_lock); + down(&sky2->phy_sema); sky2_phy_init(sky2->hw, sky2->port); - spin_unlock_bh(&sky2->phy_lock); + up(&sky2->phy_sema); } static void sky2_mac_init(struct sky2_hw *hw, unsigned port) @@ -590,11 +571,6 @@ static void sky2_mac_init(struct sky2_hw *hw, unsigned port) if (sky2->duplex == DUPLEX_FULL) reg |= GM_GPCR_DUP_FULL; - - /* turn off pause in 10/100mbps half duplex */ - else if (sky2->speed != SPEED_1000 && - hw->chip_id != CHIP_ID_YUKON_EC_U) - sky2->tx_pause = sky2->rx_pause = 0; } else reg = GM_GPCR_SPEED_1000 | GM_GPCR_SPEED_100 | GM_GPCR_DUP_FULL; @@ -611,9 +587,9 @@ static void sky2_mac_init(struct sky2_hw *hw, unsigned port) sky2_read16(hw, SK_REG(port, GMAC_IRQ_SRC)); - spin_lock_bh(&sky2->phy_lock); + down(&sky2->phy_sema); sky2_phy_init(hw, port); - spin_unlock_bh(&sky2->phy_lock); + up(&sky2->phy_sema); /* MIB clear */ reg = gma_read16(hw, port, GM_PHY_ADDR); @@ -678,7 +654,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), 512/8); + sky2_write8(hw, SK_REG(port, RX_GMF_LP_THR), 768/8); sky2_write8(hw, SK_REG(port, RX_GMF_UP_THR), 1024/8); if (hw->dev[port]->mtu > ETH_DATA_LEN) { /* set Tx GMAC FIFO Almost Empty Threshold */ @@ -690,10 +666,16 @@ static void sky2_mac_init(struct sky2_hw *hw, unsigned port) } -/* Assign Ram Buffer allocation in units of 64bit (8 bytes) */ -static void sky2_ramset(struct sky2_hw *hw, u16 q, u32 start, u32 end) +/* 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) { - pr_debug(PFX "q %d %#x %#x\n", q, start, end); + u32 start, end; + + start = startk * 4096/8; + end = (endk * 4096/8) - 1; sky2_write8(hw, RB_ADDR(q, RB_CTRL), RB_RST_CLR); sky2_write32(hw, RB_ADDR(q, RB_START), start); @@ -702,7 +684,7 @@ static void sky2_ramset(struct sky2_hw *hw, u16 q, u32 start, u32 end) sky2_write32(hw, RB_ADDR(q, RB_RP), start); if (q == Q_R1 || q == Q_R2) { - u32 space = end - start + 1; + u32 space = (endk - startk) * 4096/8; u32 tp = space - space/4; /* On receive queue's set the thresholds @@ -755,15 +737,41 @@ static inline struct sky2_tx_le *get_tx_le(struct sky2_port *sky2) { struct sky2_tx_le *le = sky2->tx_le + sky2->tx_prod; - sky2->tx_prod = RING_NEXT(sky2->tx_prod, TX_RING_SIZE); + sky2->tx_prod = (sky2->tx_prod + 1) % TX_RING_SIZE; return le; } -/* Update chip's next pointer */ -static inline void sky2_put_idx(struct sky2_hw *hw, unsigned q, u16 idx) +/* + * This is a workaround code taken from SysKonnect sk98lin driver + * to deal with chip bug on Yukon EC rev 0 in the wraparound case. + */ +static void sky2_put_idx(struct sky2_hw *hw, unsigned q, + u16 idx, u16 *last, u16 size) { wmb(); - sky2_write16(hw, Y2_QADDR(q, PREF_UNIT_PUT_IDX), idx); + if (is_ec_a1(hw) && idx < *last) { + u16 hwget = sky2_read16(hw, Y2_QADDR(q, PREF_UNIT_GET_IDX)); + + if (hwget == 0) { + /* Start prefetching again */ + sky2_write8(hw, Y2_QADDR(q, PREF_UNIT_FIFO_WM), 0xe0); + goto setnew; + } + + if (hwget == size - 1) { + /* set watermark to one list element */ + sky2_write8(hw, Y2_QADDR(q, PREF_UNIT_FIFO_WM), 8); + + /* set put index to first list element */ + sky2_write16(hw, Y2_QADDR(q, PREF_UNIT_PUT_IDX), 0); + } else /* have hardware go to end of list */ + sky2_write16(hw, Y2_QADDR(q, PREF_UNIT_PUT_IDX), + size - 1); + } else { +setnew: + sky2_write16(hw, Y2_QADDR(q, PREF_UNIT_PUT_IDX), idx); + } + *last = idx; mmiowb(); } @@ -771,7 +779,7 @@ static inline void sky2_put_idx(struct sky2_hw *hw, unsigned q, u16 idx) static inline struct sky2_rx_le *sky2_next_rx(struct sky2_port *sky2) { struct sky2_rx_le *le = sky2->rx_le + sky2->rx_put; - sky2->rx_put = RING_NEXT(sky2->rx_put, RX_LE_SIZE); + sky2->rx_put = (sky2->rx_put + 1) % RX_LE_SIZE; return le; } @@ -886,7 +894,7 @@ static int sky2_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) if (!netif_running(dev)) return -ENODEV; /* Phy still in reset */ - switch (cmd) { + switch(cmd) { case SIOCGMIIPHY: data->phy_id = PHY_ADDR_MARV; @@ -894,9 +902,9 @@ static int sky2_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) case SIOCGMIIREG: { u16 val = 0; - spin_lock_bh(&sky2->phy_lock); + down(&sky2->phy_sema); err = __gm_phy_read(hw, sky2->port, data->reg_num & 0x1f, &val); - spin_unlock_bh(&sky2->phy_lock); + up(&sky2->phy_sema); data->val_out = val; break; @@ -906,10 +914,10 @@ static int sky2_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) if (!capable(CAP_NET_ADMIN)) return -EPERM; - spin_lock_bh(&sky2->phy_lock); + down(&sky2->phy_sema); err = gm_phy_write(hw, sky2->port, data->reg_num & 0x1f, data->val_in); - spin_unlock_bh(&sky2->phy_lock); + up(&sky2->phy_sema); break; } return err; @@ -951,17 +959,18 @@ 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 alloc_skb() won't align properly if slab + * is not aligned. Also dev_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 = alloc_skb(size + RX_SKB_ALIGN, gfp_mask); + skb = __dev_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); + skb_reserve(skb, + ((p + RX_SKB_ALIGN - 1) & ~(RX_SKB_ALIGN - 1)) - p); } return skb; @@ -978,7 +987,6 @@ static int sky2_rx_start(struct sky2_port *sky2) struct sky2_hw *hw = sky2->hw; unsigned rxq = rxqaddr[sky2->port]; int i; - unsigned thresh; sky2->rx_put = sky2->rx_next = 0; sky2_qset(hw, rxq); @@ -1003,24 +1011,13 @@ static int sky2_rx_start(struct sky2_port *sky2) sky2_rx_add(sky2, re->mapaddr); } - - /* - * The receiver hangs if it receives frames larger than the - * packet buffer. As a workaround, truncate oversize frames, but - * the register is limited to 9 bits, so if you do frames > 2052 - * you better get the MTU right! - */ - thresh = (sky2->rx_bufsize - 8) / sizeof(u32); - if (thresh > 0x1ff) - sky2_write32(hw, SK_REG(sky2->port, RX_GMF_CTRL_T), RX_TRUNC_OFF); - else { - sky2_write16(hw, SK_REG(sky2->port, RX_GMF_TR_THR), thresh); - sky2_write32(hw, SK_REG(sky2->port, RX_GMF_CTRL_T), RX_TRUNC_ON); - } - + /* Truncate oversize frames */ + sky2_write16(hw, SK_REG(sky2->port, RX_GMF_TR_THR), sky2->rx_bufsize - 8); + sky2_write32(hw, SK_REG(sky2->port, RX_GMF_CTRL_T), RX_TRUNC_ON); /* Tell chip about available buffers */ sky2_write16(hw, Y2_QADDR(rxq, PREF_UNIT_PUT_IDX), sky2->rx_put); + sky2->rx_last_put = sky2_read16(hw, Y2_QADDR(rxq, PREF_UNIT_PUT_IDX)); return 0; nomem: sky2_rx_clean(sky2); @@ -1033,26 +1030,8 @@ static int sky2_up(struct net_device *dev) struct sky2_port *sky2 = netdev_priv(dev); struct sky2_hw *hw = sky2->hw; unsigned port = sky2->port; - u32 ramsize, rxspace, imask; - int cap, err = -ENOMEM; - struct net_device *otherdev = hw->dev[sky2->port^1]; - - /* - * On dual port PCI-X card, there is an problem where status - * can be received out of order due to split transactions - */ - if (otherdev && netif_running(otherdev) && - (cap = pci_find_capability(hw->pdev, PCI_CAP_ID_PCIX))) { - struct sky2_port *osky2 = netdev_priv(otherdev); - u16 cmd; - - cmd = sky2_pci_read16(hw, cap + PCI_X_CMD); - cmd &= ~PCI_X_CMD_MAX_SPLIT; - sky2_pci_write16(hw, cap + PCI_X_CMD, cmd); - - sky2->rx_csum = 0; - osky2->rx_csum = 0; - } + u32 ramsize, rxspace; + int err = -ENOMEM; if (netif_msg_ifup(sky2)) printk(KERN_INFO PFX "%s: enabling interface\n", dev->name); @@ -1084,16 +1063,19 @@ static int sky2_up(struct net_device *dev) sky2_mac_init(hw, port); - /* Determine available ram buffer space in qwords. */ - ramsize = sky2_read8(hw, B2_E_0) * 4096/8; - - if (ramsize > 6*1024/8) - rxspace = ramsize - (ramsize + 2) / 3; + /* 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 - rxspace = ramsize / 2; + ramsize = sky2_read8(hw, B2_E_0); + + /* Give transmitter one third (rounded up) */ + rxspace = ramsize - (ramsize + 2) / 3; - sky2_ramset(hw, rxqaddr[port], 0, rxspace-1); - sky2_ramset(hw, txqaddr[port], rxspace, ramsize-1); + sky2_ramset(hw, rxqaddr[port], 0, rxspace); + sky2_ramset(hw, txqaddr[port], rxspace, ramsize); /* Make sure SyncQ is disabled */ sky2_write8(hw, RB_ADDR(port == 0 ? Q_XS1 : Q_XS2, RB_CTRL), @@ -1113,10 +1095,10 @@ static int sky2_up(struct net_device *dev) goto err_out; /* Enable interrupts from phy/mac for port */ - imask = sky2_read32(hw, B0_IMSK); - imask |= portirq_msk[port]; - sky2_write32(hw, B0_IMSK, imask); - + spin_lock_irq(&hw->hw_lock); + hw->intr_mask |= (port == 0) ? Y2_IS_PORT_1 : Y2_IS_PORT_2; + sky2_write32(hw, B0_IMSK, hw->intr_mask); + spin_unlock_irq(&hw->hw_lock); return 0; err_out: @@ -1142,7 +1124,7 @@ err_out: /* Modular subtraction in ring */ static inline int tx_dist(unsigned tail, unsigned head) { - return (head - tail) & (TX_RING_SIZE - 1); + return (head - tail) % TX_RING_SIZE; } /* Number of list elements available for next tx */ @@ -1159,7 +1141,7 @@ static unsigned tx_le_req(const struct sk_buff *skb) count = sizeof(dma_addr_t) / sizeof(u32); count += skb_shinfo(skb)->nr_frags * count; - if (skb_is_gso(skb)) + if (skb_shinfo(skb)->tso_size) ++count; if (skb->ip_summed == CHECKSUM_HW) @@ -1231,12 +1213,12 @@ static int sky2_xmit_frame(struct sk_buff *skb, struct net_device *dev) } /* Check for TCP Segmentation Offload */ - mss = skb_shinfo(skb)->gso_size; + mss = skb_shinfo(skb)->tso_size; if (mss != 0) { /* just drop the packet if non-linear expansion fails */ if (skb_header_cloned(skb) && pskb_expand_head(skb, 0, 0, GFP_ATOMIC)) { - dev_kfree_skb(skb); + dev_kfree_skb_any(skb); goto out_unlock; } @@ -1319,7 +1301,7 @@ static int sky2_xmit_frame(struct sk_buff *skb, struct net_device *dev) le->opcode = OP_BUFFER | HW_OWNER; fre = sky2->tx_ring - + RING_NEXT((re - sky2->tx_ring) + i, TX_RING_SIZE); + + ((re - sky2->tx_ring) + i + 1) % TX_RING_SIZE; pci_unmap_addr_set(fre, mapaddr, mapping); } @@ -1333,7 +1315,8 @@ static int sky2_xmit_frame(struct sk_buff *skb, struct net_device *dev) netif_stop_queue(dev); } - sky2_put_idx(hw, txqaddr[sky2->port], sky2->tx_prod); + sky2_put_idx(hw, txqaddr[sky2->port], sky2->tx_prod, + &sky2->tx_last_put, TX_RING_SIZE); out_unlock: spin_unlock(&sky2->tx_lock); @@ -1365,7 +1348,7 @@ static void sky2_tx_complete(struct sky2_port *sky2, u16 done) struct tx_ring_info *re = sky2->tx_ring + put; struct sk_buff *skb = re->skb; - nxt = re->idx; + nxt = re->idx; BUG_ON(nxt >= TX_RING_SIZE); prefetch(sky2->tx_ring + nxt); @@ -1379,17 +1362,17 @@ static void sky2_tx_complete(struct sky2_port *sky2, u16 done) for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) { struct tx_ring_info *fre; - fre = sky2->tx_ring + RING_NEXT(put + i, TX_RING_SIZE); + fre = sky2->tx_ring + (put + i + 1) % TX_RING_SIZE; pci_unmap_page(pdev, pci_unmap_addr(fre, mapaddr), - skb_shinfo(skb)->frags[i].size, + skb_shinfo(skb)->frags[i].size, PCI_DMA_TODEVICE); } - dev_kfree_skb(skb); + dev_kfree_skb_any(skb); } sky2->tx_cons = put; - if (tx_avail(sky2) > MAX_SKB_TX_LE + 4) + if (netif_queue_stopped(dev) && tx_avail(sky2) > MAX_SKB_TX_LE) netif_wake_queue(dev); } @@ -1408,7 +1391,6 @@ static int sky2_down(struct net_device *dev) struct sky2_hw *hw = sky2->hw; unsigned port = sky2->port; u16 ctrl; - u32 imask; /* Never really got started! */ if (!sky2->tx_le) @@ -1421,9 +1403,12 @@ static int sky2_down(struct net_device *dev) netif_stop_queue(dev); /* Disable port IRQ */ - imask = sky2_read32(hw, B0_IMSK); - imask &= ~portirq_msk[port]; - sky2_write32(hw, B0_IMSK, imask); + spin_lock_irq(&hw->hw_lock); + hw->intr_mask &= ~((sky2->port == 0) ? Y2_IS_IRQ_PHY1 : Y2_IS_IRQ_PHY2); + sky2_write32(hw, B0_IMSK, hw->intr_mask); + spin_unlock_irq(&hw->hw_lock); + + flush_scheduled_work(); sky2_phy_reset(hw, port); @@ -1496,7 +1481,7 @@ static int sky2_down(struct net_device *dev) static u16 sky2_phy_speed(const struct sky2_hw *hw, u16 aux) { - if (!hw->copper) + if (!sky2_is_copper(hw)) return SPEED_1000; if (hw->chip_id == CHIP_ID_YUKON_FE) @@ -1562,26 +1547,17 @@ static void sky2_link_up(struct sky2_port *sky2) sky2_write8(hw, SK_REG(port, LNK_LED_REG), LINKLED_ON | LINKLED_BLINK_OFF | LINKLED_LINKSYNC_OFF); - if (hw->chip_id == CHIP_ID_YUKON_XL || hw->chip_id == CHIP_ID_YUKON_EC_U) { + if (hw->chip_id == CHIP_ID_YUKON_XL) { u16 pg = gm_phy_read(hw, port, PHY_MARV_EXT_ADR); - u16 led = PHY_M_LEDC_LOS_CTRL(1); /* link active */ - - switch(sky2->speed) { - case SPEED_10: - led |= PHY_M_LEDC_INIT_CTRL(7); - break; - - case SPEED_100: - led |= PHY_M_LEDC_STA1_CTRL(7); - break; - - case SPEED_1000: - led |= PHY_M_LEDC_STA0_CTRL(7); - break; - } gm_phy_write(hw, port, PHY_MARV_EXT_ADR, 3); - gm_phy_write(hw, port, PHY_MARV_PHY_CTRL, led); + gm_phy_write(hw, port, PHY_MARV_PHY_CTRL, PHY_M_LEDC_LOS_CTRL(1) | /* LINK/ACT */ + PHY_M_LEDC_INIT_CTRL(sky2->speed == + SPEED_10 ? 7 : 0) | + PHY_M_LEDC_STA1_CTRL(sky2->speed == + SPEED_100 ? 7 : 0) | + PHY_M_LEDC_STA0_CTRL(sky2->speed == + SPEED_1000 ? 7 : 0)); gm_phy_write(hw, port, PHY_MARV_EXT_ADR, pg); } @@ -1656,7 +1632,7 @@ static int sky2_autoneg_done(struct sky2_port *sky2, u16 aux) sky2->speed = sky2_phy_speed(hw, aux); /* Pause bits are offset (9..8) */ - if (hw->chip_id == CHIP_ID_YUKON_XL || hw->chip_id == CHIP_ID_YUKON_EC_U) + if (hw->chip_id == CHIP_ID_YUKON_XL) aux >>= 6; sky2->rx_pause = (aux & PHY_M_PS_RX_P_EN) != 0; @@ -1671,19 +1647,20 @@ static int sky2_autoneg_done(struct sky2_port *sky2, u16 aux) return 0; } -/* Interrupt from PHY */ -static void sky2_phy_intr(struct sky2_hw *hw, unsigned port) +/* + * Interrupt from PHY are handled outside of interrupt context + * because accessing phy registers requires spin wait which might + * cause excess interrupt latency. + */ +static void sky2_phy_task(void *arg) { - struct net_device *dev = hw->dev[port]; - struct sky2_port *sky2 = netdev_priv(dev); + struct sky2_port *sky2 = arg; + struct sky2_hw *hw = sky2->hw; 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); + down(&sky2->phy_sema); + istatus = gm_phy_read(hw, sky2->port, PHY_MARV_INT_STAT); + phystat = gm_phy_read(hw, sky2->port, PHY_MARV_PHY_STAT); if (netif_msg_intr(sky2)) printk(KERN_INFO PFX "%s: phy interrupt status 0x%x 0x%x\n", @@ -1709,7 +1686,12 @@ static void sky2_phy_intr(struct sky2_hw *hw, unsigned port) sky2_link_down(sky2); } out: - spin_unlock(&sky2->phy_lock); + up(&sky2->phy_sema); + + spin_lock_irq(&hw->hw_lock); + hw->intr_mask |= (sky2->port == 0) ? Y2_IS_IRQ_PHY1 : Y2_IS_IRQ_PHY2; + sky2_write32(hw, B0_IMSK, hw->intr_mask); + spin_unlock_irq(&hw->hw_lock); } @@ -1721,49 +1703,41 @@ static void sky2_tx_timeout(struct net_device *dev) struct sky2_port *sky2 = netdev_priv(dev); struct sky2_hw *hw = sky2->hw; unsigned txq = txqaddr[sky2->port]; - u16 report, done; - - if (netif_msg_timer(sky2)) - printk(KERN_ERR PFX "%s: tx timeout\n", dev->name); - - report = sky2_read16(hw, sky2->port == 0 ? STAT_TXA1_RIDX : STAT_TXA2_RIDX); - done = sky2_read16(hw, Q_ADDR(txq, Q_DONE)); + u16 ridx; - printk(KERN_DEBUG PFX "%s: transmit ring %u .. %u report=%u done=%u\n", - dev->name, - sky2->tx_cons, sky2->tx_prod, report, done); - - if (report != done) { - printk(KERN_INFO PFX "status burst pending (irq moderation?)\n"); + /* Maybe we just missed an status interrupt */ + spin_lock(&sky2->tx_lock); + ridx = sky2_read16(hw, + sky2->port == 0 ? STAT_TXA1_RIDX : STAT_TXA2_RIDX); + sky2_tx_complete(sky2, ridx); + spin_unlock(&sky2->tx_lock); - sky2_write8(hw, STAT_TX_TIMER_CTRL, TIM_STOP); - sky2_write8(hw, STAT_TX_TIMER_CTRL, TIM_START); - } else if (report != sky2->tx_cons) { - printk(KERN_INFO PFX "status report lost?\n"); + if (!netif_queue_stopped(dev)) { + if (net_ratelimit()) + pr_info(PFX "transmit interrupt missed? recovered\n"); + return; + } - spin_lock_bh(&sky2->tx_lock); - sky2_tx_complete(sky2, report); - spin_unlock_bh(&sky2->tx_lock); - } else { - printk(KERN_INFO PFX "hardware hung? flushing\n"); + if (netif_msg_timer(sky2)) + printk(KERN_ERR PFX "%s: tx timeout\n", dev->name); - sky2_write32(hw, Q_ADDR(txq, Q_CSR), BMU_STOP); - sky2_write32(hw, Y2_QADDR(txq, PREF_UNIT_CTRL), PREF_UNIT_RST_SET); + sky2_write32(hw, Q_ADDR(txq, Q_CSR), BMU_STOP); + sky2_write32(hw, Y2_QADDR(txq, PREF_UNIT_CTRL), PREF_UNIT_RST_SET); - sky2_tx_clean(sky2); + sky2_tx_clean(sky2); - sky2_qset(hw, txq); - sky2_prefetch_init(hw, txq, sky2->tx_le_map, TX_RING_SIZE - 1); - } + sky2_qset(hw, txq); + sky2_prefetch_init(hw, txq, sky2->tx_le_map, TX_RING_SIZE - 1); } +#define roundup(x, y) ((((x)+((y)-1))/(y))*(y)) /* Want receive buffer size to be multiple of 64 bits * and incl room for vlan and truncation */ static inline unsigned sky2_buf_size(int mtu) { - return ALIGN(mtu + ETH_HLEN + VLAN_HLEN, 8) + 8; + return roundup(mtu + ETH_HLEN + VLAN_HLEN, 8) + 8; } static int sky2_change_mtu(struct net_device *dev, int new_mtu) @@ -1772,7 +1746,6 @@ static int sky2_change_mtu(struct net_device *dev, int new_mtu) struct sky2_hw *hw = sky2->hw; int err; u16 ctl, mode; - u32 imask; if (new_mtu < ETH_ZLEN || new_mtu > ETH_JUMBO_MTU) return -EINVAL; @@ -1785,15 +1758,12 @@ static int sky2_change_mtu(struct net_device *dev, int new_mtu) return 0; } - imask = sky2_read32(hw, B0_IMSK); sky2_write32(hw, B0_IMSK, 0); dev->trans_start = jiffies; /* prevent tx timeout */ netif_stop_queue(dev); netif_poll_disable(hw->dev[0]); - synchronize_irq(hw->pdev->irq); - ctl = gma_read16(hw, sky2->port, GM_GP_CTRL); gma_write16(hw, sky2->port, GM_GP_CTRL, ctl & ~GM_GPCR_RX_ENA); sky2_rx_stop(sky2); @@ -1812,7 +1782,7 @@ static int sky2_change_mtu(struct net_device *dev, int new_mtu) sky2_write8(hw, RB_ADDR(rxqaddr[sky2->port], RB_CTRL), RB_ENA_OP_MD); err = sky2_rx_start(sky2); - sky2_write32(hw, B0_IMSK, imask); + sky2_write32(hw, B0_IMSK, hw->intr_mask); if (err) dev_close(dev); @@ -1854,7 +1824,7 @@ static struct sk_buff *sky2_receive(struct sky2_port *sky2, goto oversize; if (length < copybreak) { - skb = alloc_skb(length + 2, GFP_ATOMIC); + skb = dev_alloc_skb(length + 2); if (!skb) goto resubmit; @@ -1888,6 +1858,10 @@ resubmit: re->skb->ip_summed = CHECKSUM_NONE; sky2_rx_add(sky2, re->mapaddr); + /* Tell receiver about new buffers. */ + sky2_put_idx(sky2->hw, rxqaddr[sky2->port], sky2->rx_put, + &sky2->rx_last_put, RX_LE_SIZE); + return skb; oversize: @@ -1913,49 +1887,74 @@ error: goto resubmit; } -/* Transmit complete */ -static inline void sky2_tx_done(struct net_device *dev, u16 last) +/* + * Check for transmit complete + */ +#define TX_NO_STATUS 0xffff + +static void sky2_tx_check(struct sky2_hw *hw, int port, u16 last) { - struct sky2_port *sky2 = netdev_priv(dev); + if (last != TX_NO_STATUS) { + struct net_device *dev = hw->dev[port]; + if (dev && netif_running(dev)) { + struct sky2_port *sky2 = netdev_priv(dev); - if (netif_running(dev)) { - spin_lock(&sky2->tx_lock); - sky2_tx_complete(sky2, last); - spin_unlock(&sky2->tx_lock); + spin_lock(&sky2->tx_lock); + sky2_tx_complete(sky2, last); + spin_unlock(&sky2->tx_lock); + } } } -/* Is status ring empty or is there more to do? */ -static inline int sky2_more_work(const struct sky2_hw *hw) +/* + * Both ports share the same status interrupt, therefore there is only + * one poll routine. + */ +static int sky2_poll(struct net_device *dev0, int *budget) { - return (hw->st_idx != sky2_read16(hw, STAT_PUT_IDX)); -} + struct sky2_hw *hw = ((struct sky2_port *) netdev_priv(dev0))->hw; + unsigned int to_do = min(dev0->quota, *budget); + unsigned int work_done = 0; + u16 hwidx; + u16 tx_done[2] = { TX_NO_STATUS, TX_NO_STATUS }; -/* 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); + sky2_write32(hw, STAT_CTRL, SC_STAT_CLR_IRQ); + /* + * Kick the STAT_LEV_TIMER_CTRL timer. + * This fixes my hangs on Yukon-EC (0xb6) rev 1. + * The if clause is there to start the timer only if it has been + * configured correctly and not been disabled via ethtool. + */ + if (sky2_read8(hw, STAT_LEV_TIMER_CTRL) == TIM_START) { + sky2_write8(hw, STAT_LEV_TIMER_CTRL, TIM_STOP); + sky2_write8(hw, STAT_LEV_TIMER_CTRL, TIM_START); + } + + hwidx = sky2_read16(hw, STAT_PUT_IDX); + BUG_ON(hwidx >= STATUS_RING_SIZE); rmb(); - while (hw->st_idx != hwidx) { + while (hwidx != hw->st_idx) { struct sky2_status_le *le = hw->st_le + hw->st_idx; struct net_device *dev; + struct sky2_port *sky2; struct sk_buff *skb; u32 status; u16 length; - hw->st_idx = RING_NEXT(hw->st_idx, STATUS_RING_SIZE); + le = hw->st_le + hw->st_idx; + hw->st_idx = (hw->st_idx + 1) % STATUS_RING_SIZE; + prefetch(hw->st_le + hw->st_idx); BUG_ON(le->link >= 2); dev = hw->dev[le->link]; + if (dev == NULL || !netif_running(dev)) + continue; sky2 = netdev_priv(dev); - length = le->length; - status = le->status; + status = le32_to_cpu(le->status); + length = le16_to_cpu(le->length); switch (le->opcode & ~HW_OWNER) { case OP_RXSTAT: @@ -1976,14 +1975,6 @@ 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; @@ -2005,34 +1996,42 @@ static int sky2_status_intr(struct sky2_hw *hw, int to_do) case OP_TXINDEXLE: /* TX index reports status for both ports */ - BUILD_BUG_ON(TX_RING_SIZE > 0x1000); - sky2_tx_done(hw->dev[0], status & 0xfff); - if (hw->dev[1]) - sky2_tx_done(hw->dev[1], - ((status >> 24) & 0xff) - | (u16)(length & 0xf) << 8); + tx_done[0] = status & 0xffff; + tx_done[1] = ((status >> 24) & 0xff) + | (u16)(length & 0xf) << 8; break; default: if (net_ratelimit()) printk(KERN_WARNING PFX "unknown status opcode 0x%x\n", le->opcode); - goto exit_loop; + break; } } exit_loop: - if (buf_write[0]) { - sky2 = netdev_priv(hw->dev[0]); - sky2_put_idx(hw, Q_R1, sky2->rx_put); - } + sky2_tx_check(hw, 0, tx_done[0]); + sky2_tx_check(hw, 1, tx_done[1]); - if (buf_write[1]) { - sky2 = netdev_priv(hw->dev[1]); - sky2_put_idx(hw, Q_R2, sky2->rx_put); + if (sky2_read8(hw, STAT_TX_TIMER_CTRL) == TIM_START) { + sky2_write8(hw, STAT_TX_TIMER_CTRL, TIM_STOP); + sky2_write8(hw, STAT_TX_TIMER_CTRL, TIM_START); } - return work_done; + if (likely(work_done < to_do)) { + spin_lock_irq(&hw->hw_lock); + __netif_rx_complete(dev0); + + hw->intr_mask |= Y2_IS_STAT_BMU; + sky2_write32(hw, B0_IMSK, hw->intr_mask); + spin_unlock_irq(&hw->hw_lock); + + return 0; + } else { + *budget -= work_done; + dev0->quota -= work_done; + return 1; + } } static void sky2_hw_error(struct sky2_hw *hw, unsigned port, u32 status) @@ -2151,60 +2150,42 @@ static void sky2_mac_intr(struct sky2_hw *hw, unsigned port) } } -/* This should never happen it is a fatal situation */ -static void sky2_descriptor_error(struct sky2_hw *hw, unsigned port, - const char *rxtx, u32 mask) +static void sky2_phy_intr(struct sky2_hw *hw, unsigned port) { struct net_device *dev = hw->dev[port]; struct sky2_port *sky2 = netdev_priv(dev); - u32 imask; - - printk(KERN_ERR PFX "%s: %s descriptor error (hardware problem)\n", - dev ? dev->name : "", rxtx); - imask = sky2_read32(hw, B0_IMSK); - imask &= ~mask; - sky2_write32(hw, B0_IMSK, imask); - - if (dev) { - spin_lock(&sky2->phy_lock); - sky2_link_down(sky2); - spin_unlock(&sky2->phy_lock); - } -} + hw->intr_mask &= ~(port == 0 ? Y2_IS_IRQ_PHY1 : Y2_IS_IRQ_PHY2); + sky2_write32(hw, B0_IMSK, hw->intr_mask); -/* If idle then force a fake soft NAPI poll once a second - * to work around cases where sharing an edge triggered interrupt. - */ -static inline void sky2_idle_start(struct sky2_hw *hw) -{ - if (idle_timeout > 0) - mod_timer(&hw->idle_timer, - jiffies + msecs_to_jiffies(idle_timeout)); + schedule_work(&sky2->phy_task); } -static void sky2_idle(unsigned long arg) +static irqreturn_t sky2_intr(int irq, void *dev_id, struct pt_regs *regs) { - struct sky2_hw *hw = (struct sky2_hw *) arg; - struct net_device *dev = hw->dev[0]; - - if (__netif_rx_schedule_prep(dev)) - __netif_rx_schedule(dev); - - mod_timer(&hw->idle_timer, jiffies + msecs_to_jiffies(idle_timeout)); -} - + struct sky2_hw *hw = dev_id; + struct net_device *dev0 = hw->dev[0]; + u32 status; -static int sky2_poll(struct net_device *dev0, int *budget) -{ - struct sky2_hw *hw = ((struct sky2_port *) netdev_priv(dev0))->hw; - int work_limit = min(dev0->quota, *budget); - int work_done = 0; - u32 status = sky2_read32(hw, B0_Y2_SP_EISR); + status = sky2_read32(hw, B0_Y2_SP_ISRC2); + if (status == 0 || status == ~0) + return IRQ_NONE; + spin_lock(&hw->hw_lock); if (status & Y2_IS_HW_ERR) sky2_hw_intr(hw); + /* Do NAPI for Rx and Tx status */ + if (status & Y2_IS_STAT_BMU) { + hw->intr_mask &= ~Y2_IS_STAT_BMU; + sky2_write32(hw, B0_IMSK, hw->intr_mask); + + if (likely(__netif_rx_schedule_prep(dev0))) { + prefetch(&hw->st_le[hw->st_idx]); + __netif_rx_schedule(dev0); + } + } + if (status & Y2_IS_IRQ_PHY1) sky2_phy_intr(hw, 0); @@ -2217,48 +2198,9 @@ static int sky2_poll(struct net_device *dev0, int *budget) if (status & Y2_IS_IRQ_MAC2) sky2_mac_intr(hw, 1); - if (status & Y2_IS_CHK_RX1) - sky2_descriptor_error(hw, 0, "receive", Y2_IS_CHK_RX1); - - if (status & Y2_IS_CHK_RX2) - sky2_descriptor_error(hw, 1, "receive", Y2_IS_CHK_RX2); - - if (status & Y2_IS_CHK_TXA1) - sky2_descriptor_error(hw, 0, "transmit", Y2_IS_CHK_TXA1); - - if (status & Y2_IS_CHK_TXA2) - sky2_descriptor_error(hw, 1, "transmit", Y2_IS_CHK_TXA2); - - work_done = sky2_status_intr(hw, work_limit); - *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; - - netif_rx_complete(dev0); - - sky2_read32(hw, B0_Y2_SP_LISR); - return 0; -} - -static irqreturn_t sky2_intr(int irq, void *dev_id, struct pt_regs *regs) -{ - struct sky2_hw *hw = dev_id; - struct net_device *dev0 = hw->dev[0]; - u32 status; - - /* Reading this mask interrupts as side effect */ - status = sky2_read32(hw, B0_Y2_SP_ISRC2); - if (status == 0 || status == ~0) - return IRQ_NONE; + sky2_write32(hw, B0_Y2_SP_ICR, 2); - prefetch(&hw->st_le[hw->st_idx]); - if (likely(__netif_rx_schedule_prep(dev0))) - __netif_rx_schedule(dev0); + spin_unlock(&hw->hw_lock); return IRQ_HANDLED; } @@ -2267,10 +2209,8 @@ static irqreturn_t sky2_intr(int irq, void *dev_id, struct pt_regs *regs) static void sky2_netpoll(struct net_device *dev) { struct sky2_port *sky2 = netdev_priv(dev); - struct net_device *dev0 = sky2->hw->dev[0]; - if (netif_running(dev) && __netif_rx_schedule_prep(dev0)) - __netif_rx_schedule(dev0); + sky2_intr(sky2->hw->pdev->irq, sky2->hw, NULL); } #endif @@ -2302,7 +2242,7 @@ static inline u32 sky2_clk2us(const struct sky2_hw *hw, u32 clk) static int sky2_reset(struct sky2_hw *hw) { u16 status; - u8 t8, pmd_type; + u8 t8; int i; sky2_write8(hw, B0_CTST, CS_RST_CLR); @@ -2314,16 +2254,6 @@ static int sky2_reset(struct sky2_hw *hw) return -EOPNOTSUPP; } - hw->chip_rev = (sky2_read8(hw, B2_MAC_CFG) & CFG_CHIP_R_MSK) >> 4; - - /* This rev is really old, and requires untested workarounds */ - if (hw->chip_id == CHIP_ID_YUKON_EC && hw->chip_rev == CHIP_REV_YU_EC_A1) { - printk(KERN_ERR PFX "%s: unsupported revision Yukon-%s (0x%x) rev %d\n", - pci_name(hw->pdev), yukon2_name[hw->chip_id - CHIP_ID_YUKON_XL], - hw->chip_id, hw->chip_rev); - return -EOPNOTSUPP; - } - /* disable ASF */ if (hw->chip_id <= CHIP_ID_YUKON_EC) { sky2_write8(hw, B28_Y2_ASF_STAT_CMD, Y2_ASF_RESET); @@ -2344,19 +2274,18 @@ static int sky2_reset(struct sky2_hw *hw) sky2_write8(hw, B0_CTST, CS_MRST_CLR); /* clear any PEX errors */ - if (pci_find_capability(hw->pdev, PCI_CAP_ID_EXP)) + if (pci_find_capability(hw->pdev, PCI_CAP_ID_EXP)) sky2_pci_write32(hw, PEX_UNC_ERR_STAT, 0xffffffffUL); - pmd_type = sky2_read8(hw, B2_PMD_TYP); - hw->copper = !(pmd_type == 'L' || pmd_type == 'S'); - + hw->pmd_type = sky2_read8(hw, B2_PMD_TYP); hw->ports = 1; t8 = sky2_read8(hw, B2_Y2_HW_RES); if ((t8 & CFG_DUAL_MAC_MSK) == CFG_DUAL_MAC_MSK) { if (!(sky2_read8(hw, B2_Y2_CLK_GATE) & Y2_STATUS_LNK2_INAC)) ++hw->ports; } + hw->chip_rev = (sky2_read8(hw, B2_MAC_CFG) & CFG_CHIP_R_MSK) >> 4; sky2_set_power_state(hw, PCI_D0); @@ -2422,18 +2351,30 @@ static int sky2_reset(struct sky2_hw *hw) /* Set the list last index */ sky2_write16(hw, STAT_LAST_IDX, STATUS_RING_SIZE - 1); - sky2_write16(hw, STAT_TX_IDX_TH, 10); - sky2_write8(hw, STAT_FIFO_WM, 16); + /* These status setup values are copied from SysKonnect's driver */ + if (is_ec_a1(hw)) { + /* WA for dev. #4.3 */ + sky2_write16(hw, STAT_TX_IDX_TH, 0xfff); /* Tx Threshold */ - /* set Status-FIFO ISR watermark */ - if (hw->chip_id == CHIP_ID_YUKON_XL && hw->chip_rev == 0) - sky2_write8(hw, STAT_FIFO_ISR_WM, 4); - else - sky2_write8(hw, STAT_FIFO_ISR_WM, 16); + /* set Status-FIFO watermark */ + sky2_write8(hw, STAT_FIFO_WM, 0x21); /* WA for dev. #4.18 */ + + /* set Status-FIFO ISR watermark */ + sky2_write8(hw, STAT_FIFO_ISR_WM, 0x07); /* WA for dev. #4.18 */ + sky2_write32(hw, STAT_TX_TIMER_INI, sky2_us2clk(hw, 10000)); + } else { + sky2_write16(hw, STAT_TX_IDX_TH, 10); + sky2_write8(hw, STAT_FIFO_WM, 16); - sky2_write32(hw, STAT_TX_TIMER_INI, sky2_us2clk(hw, 1000)); - sky2_write32(hw, STAT_ISR_TIMER_INI, sky2_us2clk(hw, 20)); - sky2_write32(hw, STAT_LEV_TIMER_INI, sky2_us2clk(hw, 100)); + /* set Status-FIFO ISR watermark */ + if (hw->chip_id == CHIP_ID_YUKON_XL && hw->chip_rev == 0) + sky2_write8(hw, STAT_FIFO_ISR_WM, 4); + else + sky2_write8(hw, STAT_FIFO_ISR_WM, 16); + + sky2_write32(hw, STAT_TX_TIMER_INI, sky2_us2clk(hw, 1000)); + sky2_write32(hw, STAT_ISR_TIMER_INI, sky2_us2clk(hw, 7)); + } /* enable status unit */ sky2_write32(hw, STAT_CTRL, SC_STAT_OP_ON); @@ -2447,21 +2388,22 @@ static int sky2_reset(struct sky2_hw *hw) static u32 sky2_supported_modes(const struct sky2_hw *hw) { - u32 modes; - if (hw->copper) { - modes = SUPPORTED_10baseT_Half - | SUPPORTED_10baseT_Full - | SUPPORTED_100baseT_Half - | SUPPORTED_100baseT_Full - | SUPPORTED_Autoneg | SUPPORTED_TP; + if (sky2_is_copper(hw)) { + u32 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; + | SUPPORTED_1000baseT_Full; + return modes; } else - modes = SUPPORTED_1000baseT_Full | SUPPORTED_FIBRE - | SUPPORTED_Autoneg; - return modes; + return SUPPORTED_1000baseT_Half + | SUPPORTED_1000baseT_Full + | SUPPORTED_Autoneg + | SUPPORTED_FIBRE; } static int sky2_get_settings(struct net_device *dev, struct ethtool_cmd *ecmd) @@ -2472,7 +2414,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 (hw->copper) { + if (sky2_is_copper(hw)) { ecmd->supported = SUPPORTED_10baseT_Half | SUPPORTED_10baseT_Full | SUPPORTED_100baseT_Half @@ -2481,12 +2423,14 @@ static int sky2_get_settings(struct net_device *dev, struct ethtool_cmd *ecmd) | SUPPORTED_1000baseT_Full | SUPPORTED_Autoneg | SUPPORTED_TP; ecmd->port = PORT_TP; - } else + ecmd->speed = sky2->speed; + } else { + ecmd->speed = SPEED_1000; ecmd->port = PORT_FIBRE; + } ecmd->advertising = sky2->advertising; ecmd->autoneg = sky2->autoneg; - ecmd->speed = sky2->speed; ecmd->duplex = sky2->duplex; return 0; } @@ -2575,34 +2519,17 @@ static const struct sky2_stat { { "rx_unicast", GM_RXF_UC_OK }, { "tx_mac_pause", GM_TXF_MPAUSE }, { "rx_mac_pause", GM_RXF_MPAUSE }, - { "collisions", GM_TXF_COL }, + { "collisions", GM_TXF_SNG_COL }, { "late_collision",GM_TXF_LAT_COL }, { "aborted", GM_TXF_ABO_COL }, - { "single_collisions", GM_TXF_SNG_COL }, { "multi_collisions", GM_TXF_MUL_COL }, - - { "rx_short", GM_RXF_SHT }, + { "fifo_underrun", GM_TXE_FIFO_UR }, + { "fifo_overflow", GM_RXE_FIFO_OV }, + { "rx_toolong", GM_RXF_LNG_ERR }, + { "rx_jabber", GM_RXF_JAB_PKT }, { "rx_runt", GM_RXE_FRAG }, - { "rx_64_byte_packets", GM_RXF_64B }, - { "rx_65_to_127_byte_packets", GM_RXF_127B }, - { "rx_128_to_255_byte_packets", GM_RXF_255B }, - { "rx_256_to_511_byte_packets", GM_RXF_511B }, - { "rx_512_to_1023_byte_packets", GM_RXF_1023B }, - { "rx_1024_to_1518_byte_packets", GM_RXF_1518B }, - { "rx_1518_to_max_byte_packets", GM_RXF_MAX_SZ }, { "rx_too_long", GM_RXF_LNG_ERR }, - { "rx_fifo_overflow", GM_RXE_FIFO_OV }, - { "rx_jabber", GM_RXF_JAB_PKT }, { "rx_fcs_error", GM_RXF_FCS_ERR }, - - { "tx_64_byte_packets", GM_TXF_64B }, - { "tx_65_to_127_byte_packets", GM_TXF_127B }, - { "tx_128_to_255_byte_packets", GM_TXF_255B }, - { "tx_256_to_511_byte_packets", GM_TXF_511B }, - { "tx_512_to_1023_byte_packets", GM_TXF_1023B }, - { "tx_1024_to_1518_byte_packets", GM_TXF_1518B }, - { "tx_1519_to_max_byte_packets", GM_TXF_MAX_SZ }, - { "tx_fifo_underrun", GM_TXE_FIFO_UR }, }; static u32 sky2_get_rx_csum(struct net_device *dev) @@ -2704,7 +2631,7 @@ static struct net_device_stats *sky2_get_stats(struct net_device *dev) sky2->net_stats.rx_bytes = data[1]; sky2->net_stats.tx_packets = data[2] + data[4] + data[6]; sky2->net_stats.rx_packets = data[3] + data[5] + data[7]; - sky2->net_stats.multicast = data[3] + data[5]; + sky2->net_stats.multicast = data[5] + data[7]; sky2->net_stats.collisions = data[10]; sky2->net_stats.tx_aborted_errors = data[12]; @@ -2736,14 +2663,6 @@ 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); @@ -2752,7 +2671,6 @@ 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)); @@ -2763,17 +2681,16 @@ 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 && !sky2->rx_pause) + else if (dev->mc_count == 0) /* no multicast */ reg &= ~GM_RXCR_MCF_ENA; else { int i; reg |= GM_RXCR_MCF_ENA; - 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); + for (i = 0; list && i < dev->mc_count; i++, list = list->next) { + u32 bit = ether_crc(ETH_ALEN, list->dmi_addr) & 0x3f; + filter[bit / 8] |= 1 << (bit % 8); + } } gma_write16(hw, port, GM_MC_ADDR_H1, @@ -2843,7 +2760,7 @@ static int sky2_phys_id(struct net_device *dev, u32 data) ms = data * 1000; /* save initial values */ - spin_lock_bh(&sky2->phy_lock); + down(&sky2->phy_sema); if (hw->chip_id == CHIP_ID_YUKON_XL) { u16 pg = gm_phy_read(hw, port, PHY_MARV_EXT_ADR); gm_phy_write(hw, port, PHY_MARV_EXT_ADR, 3); @@ -2859,9 +2776,9 @@ static int sky2_phys_id(struct net_device *dev, u32 data) sky2_led(hw, port, onoff); onoff = !onoff; - spin_unlock_bh(&sky2->phy_lock); + up(&sky2->phy_sema); interrupted = msleep_interruptible(250); - spin_lock_bh(&sky2->phy_lock); + down(&sky2->phy_sema); ms -= 250; } @@ -2876,7 +2793,7 @@ static int sky2_phys_id(struct net_device *dev, u32 data) gm_phy_write(hw, port, PHY_MARV_LED_CTRL, ledctrl); gm_phy_write(hw, port, PHY_MARV_LED_OVER, ledover); } - spin_unlock_bh(&sky2->phy_lock); + up(&sky2->phy_sema); return 0; } @@ -2906,6 +2823,38 @@ static int sky2_set_pauseparam(struct net_device *dev, return err; } +#ifdef CONFIG_PM +static void sky2_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol) +{ + struct sky2_port *sky2 = netdev_priv(dev); + + wol->supported = WAKE_MAGIC; + wol->wolopts = sky2->wol ? WAKE_MAGIC : 0; +} + +static int sky2_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol) +{ + struct sky2_port *sky2 = netdev_priv(dev); + struct sky2_hw *hw = sky2->hw; + + if (wol->wolopts != WAKE_MAGIC && wol->wolopts != 0) + return -EOPNOTSUPP; + + sky2->wol = wol->wolopts == WAKE_MAGIC; + + if (sky2->wol) { + memcpy_toio(hw->regs + WOL_MAC_ADDR, dev->dev_addr, ETH_ALEN); + + sky2_write16(hw, WOL_CTRL_STAT, + WOL_CTL_ENA_PME_ON_MAGIC_PKT | + WOL_CTL_ENA_MAGIC_PKT_UNIT); + } else + sky2_write16(hw, WOL_CTRL_STAT, WOL_CTL_DEFAULT); + + return 0; +} +#endif + static int sky2_get_coalesce(struct net_device *dev, struct ethtool_coalesce *ecmd) { @@ -2946,11 +2895,19 @@ static int sky2_set_coalesce(struct net_device *dev, { struct sky2_port *sky2 = netdev_priv(dev); struct sky2_hw *hw = sky2->hw; - const u32 tmax = sky2_clk2us(hw, 0x0ffffff); + const u32 tmin = sky2_clk2us(hw, 1); + const u32 tmax = 5000; - if (ecmd->tx_coalesce_usecs > tmax || - ecmd->rx_coalesce_usecs > tmax || - ecmd->rx_coalesce_usecs_irq > tmax) + if (ecmd->tx_coalesce_usecs != 0 && + (ecmd->tx_coalesce_usecs < tmin || ecmd->tx_coalesce_usecs > tmax)) + return -EINVAL; + + if (ecmd->rx_coalesce_usecs != 0 && + (ecmd->rx_coalesce_usecs < tmin || ecmd->rx_coalesce_usecs > tmax)) + return -EINVAL; + + if (ecmd->rx_coalesce_usecs_irq != 0 && + (ecmd->rx_coalesce_usecs_irq < tmin || ecmd->rx_coalesce_usecs_irq > tmax)) return -EINVAL; if (ecmd->tx_max_coalesced_frames >= TX_RING_SIZE-1) @@ -3085,6 +3042,10 @@ static struct ethtool_ops sky2_ethtool_ops = { .set_ringparam = sky2_set_ringparam, .get_pauseparam = sky2_get_pauseparam, .set_pauseparam = sky2_set_pauseparam, +#ifdef CONFIG_PM + .get_wol = sky2_get_wol, + .set_wol = sky2_set_wol, +#endif .phys_id = sky2_phys_id, .get_stats_count = sky2_get_stats_count, .get_ethtool_stats = sky2_get_ethtool_stats, @@ -3137,11 +3098,17 @@ static __devinit struct net_device *sky2_init_netdev(struct sky2_hw *hw, sky2->duplex = -1; sky2->speed = -1; sky2->advertising = sky2_supported_modes(hw); - sky2->rx_csum = 1; - spin_lock_init(&sky2->phy_lock); + /* Receive checksum disabled for Yukon XL + * because of observed problems with incorrect + * values when multiple packets are received in one interrupt + */ + sky2->rx_csum = (hw->chip_id != CHIP_ID_YUKON_XL); + + INIT_WORK(&sky2->phy_task, sky2_phy_task, sky2); + init_MUTEX(&sky2->phy_sema); sky2->tx_pending = TX_DEF_PENDING; - sky2->rx_pending = RX_DEF_PENDING; + sky2->rx_pending = is_ec_a1(hw) ? 8 : RX_DEF_PENDING; sky2->rx_bufsize = sky2_buf_size(ETH_DATA_LEN); hw->dev[port] = dev; @@ -3183,66 +3150,6 @@ static void __devinit sky2_show_addr(struct net_device *dev) dev->dev_addr[3], dev->dev_addr[4], dev->dev_addr[5]); } -/* Handle software interrupt used during MSI test */ -static irqreturn_t __devinit sky2_test_intr(int irq, void *dev_id, - struct pt_regs *regs) -{ - struct sky2_hw *hw = dev_id; - u32 status = sky2_read32(hw, B0_Y2_SP_ISRC2); - - if (status == 0) - return IRQ_NONE; - - if (status & Y2_IS_IRQ_SW) { - hw->msi_detected = 1; - wake_up(&hw->msi_wait); - sky2_write8(hw, B0_CTST, CS_CL_SW_IRQ); - } - sky2_write32(hw, B0_Y2_SP_ICR, 2); - - return IRQ_HANDLED; -} - -/* Test interrupt path by forcing a a software IRQ */ -static int __devinit sky2_test_msi(struct sky2_hw *hw) -{ - struct pci_dev *pdev = hw->pdev; - int err; - - init_waitqueue_head (&hw->msi_wait); - - sky2_write32(hw, B0_IMSK, Y2_IS_IRQ_SW); - - 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); - return err; - } - - sky2_write8(hw, B0_CTST, CS_ST_SW_IRQ); - sky2_read8(hw, B0_CTST); - - wait_event_timeout(hw->msi_wait, hw->msi_detected, HZ/10); - - if (!hw->msi_detected) { - /* MSI test failed, go back to INTx mode */ - printk(KERN_INFO PFX "%s: No interrupt generated using MSI, " - "switching to INTx mode.\n", - pci_name(pdev)); - - err = -EOPNOTSUPP; - sky2_write8(hw, B0_CTST, CS_CL_SW_IRQ); - } - - sky2_write32(hw, B0_IMSK, 0); - sky2_read32(hw, B0_IMSK); - - free_irq(pdev->irq, hw); - - return err; -} - static int __devinit sky2_probe(struct pci_dev *pdev, const struct pci_device_id *ent) { @@ -3311,6 +3218,7 @@ static int __devinit sky2_probe(struct pci_dev *pdev, goto err_out_free_hw; } hw->pm_cap = pm_cap; + spin_lock_init(&hw->hw_lock); #ifdef __BIG_ENDIAN /* byte swap descriptors in hardware */ @@ -3333,9 +3241,9 @@ static int __devinit sky2_probe(struct pci_dev *pdev, if (err) goto err_out_iounmap; - 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], + printk(KERN_INFO PFX "v%s addr 0x%lx irq %d Yukon-%s (0x%x) rev %d\n", + DRV_VERSION, pci_resource_start(pdev, 0), pdev->irq, + yukon2_name[hw->chip_id - CHIP_ID_YUKON_XL], hw->chip_id, hw->chip_rev); dev = sky2_init_netdev(hw, 0, using_dac); @@ -3363,32 +3271,21 @@ static int __devinit sky2_probe(struct pci_dev *pdev, } } - if (!disable_msi && pci_enable_msi(pdev) == 0) { - err = sky2_test_msi(hw); - if (err == -EOPNOTSUPP) - pci_disable_msi(pdev); - else if (err) - goto err_out_unregister; - } - - err = request_irq(pdev->irq, sky2_intr, IRQF_SHARED, DRV_NAME, hw); + err = request_irq(pdev->irq, sky2_intr, SA_SHIRQ, DRV_NAME, hw); if (err) { printk(KERN_ERR PFX "%s: cannot assign irq %d\n", pci_name(pdev), pdev->irq); goto err_out_unregister; } - sky2_write32(hw, B0_IMSK, Y2_IS_BASE); - - setup_timer(&hw->idle_timer, sky2_idle, (unsigned long) hw); - sky2_idle_start(hw); + hw->intr_mask = Y2_IS_BASE; + sky2_write32(hw, B0_IMSK, hw->intr_mask); pci_set_drvdata(pdev, hw); return 0; err_out_unregister: - pci_disable_msi(pdev); if (dev1) { unregister_netdev(dev1); free_netdev(dev1); @@ -3418,24 +3315,19 @@ static void __devexit sky2_remove(struct pci_dev *pdev) if (!hw) return; - del_timer_sync(&hw->idle_timer); - - sky2_write32(hw, B0_IMSK, 0); - synchronize_irq(hw->pdev->irq); - dev0 = hw->dev[0]; dev1 = hw->dev[1]; if (dev1) unregister_netdev(dev1); unregister_netdev(dev0); + sky2_write32(hw, B0_IMSK, 0); sky2_set_power_state(hw, PCI_D3hot); sky2_write16(hw, B0_Y2LED, LED_STAT_OFF); sky2_write8(hw, B0_CTST, CS_RST_SET); sky2_read8(hw, B0_CTST); free_irq(pdev->irq, hw); - pci_disable_msi(pdev); pci_free_consistent(pdev, STATUS_LE_BYTES, hw->st_le, hw->st_dma); pci_release_regions(pdev); pci_disable_device(pdev); @@ -3454,27 +3346,20 @@ static int sky2_suspend(struct pci_dev *pdev, pm_message_t state) { struct sky2_hw *hw = pci_get_drvdata(pdev); int i; - pci_power_t pstate = pci_choose_state(pdev, state); - if (!(pstate == PCI_D3hot || pstate == PCI_D3cold)) - return -EINVAL; - - del_timer_sync(&hw->idle_timer); - netif_poll_disable(hw->dev[0]); - - for (i = 0; i < hw->ports; i++) { + for (i = 0; i < 2; i++) { struct net_device *dev = hw->dev[i]; - if (netif_running(dev)) { + if (dev) { + if (!netif_running(dev)) + continue; + sky2_down(dev); netif_device_detach(dev); } } - sky2_write32(hw, B0_IMSK, 0); - pci_save_state(pdev); - sky2_set_power_state(hw, pstate); - return 0; + return sky2_set_power_state(hw, pci_choose_state(pdev, state)); } static int sky2_resume(struct pci_dev *pdev) @@ -3484,31 +3369,27 @@ static int sky2_resume(struct pci_dev *pdev) pci_restore_state(pdev); pci_enable_wake(pdev, PCI_D0, 0); - sky2_set_power_state(hw, PCI_D0); + err = sky2_set_power_state(hw, PCI_D0); + if (err) + goto out; err = sky2_reset(hw); if (err) goto out; - sky2_write32(hw, B0_IMSK, Y2_IS_BASE); - - for (i = 0; i < hw->ports; i++) { + for (i = 0; i < 2; i++) { struct net_device *dev = hw->dev[i]; - if (netif_running(dev)) { + if (dev && netif_running(dev)) { netif_device_attach(dev); - err = sky2_up(dev); if (err) { printk(KERN_ERR PFX "%s: could not up: %d\n", dev->name, err); dev_close(dev); - goto out; + break; } } } - - 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 7af549970..b5163ab87 100644 --- a/drivers/net/sky2.h +++ b/drivers/net/sky2.h @@ -214,8 +214,6 @@ enum csr_regs { enum { Y2_VMAIN_AVAIL = 1<<17,/* VMAIN available (YUKON-2 only) */ Y2_VAUX_AVAIL = 1<<16,/* VAUX available (YUKON-2 only) */ - Y2_HW_WOL_ON = 1<<15,/* HW WOL On (Yukon-EC Ultra A1 only) */ - Y2_HW_WOL_OFF = 1<<14,/* HW WOL On (Yukon-EC Ultra A1 only) */ Y2_ASF_ENABLE = 1<<13,/* ASF Unit Enable (YUKON-2 only) */ Y2_ASF_DISABLE = 1<<12,/* ASF Unit Disable (YUKON-2 only) */ Y2_CLK_RUN_ENA = 1<<11,/* CLK_RUN Enable (YUKON-2 only) */ @@ -280,11 +278,13 @@ enum { Y2_IS_CHK_TXS1 = 1<<1, /* Descriptor error TXS 1 */ Y2_IS_CHK_TXA1 = 1<<0, /* Descriptor error TXA 1 */ - Y2_IS_BASE = Y2_IS_HW_ERR | Y2_IS_STAT_BMU, - Y2_IS_PORT_1 = Y2_IS_IRQ_PHY1 | Y2_IS_IRQ_MAC1 - | Y2_IS_CHK_TXA1 | Y2_IS_CHK_RX1, - Y2_IS_PORT_2 = Y2_IS_IRQ_PHY2 | Y2_IS_IRQ_MAC2 - | Y2_IS_CHK_TXA2 | Y2_IS_CHK_RX2, + Y2_IS_BASE = Y2_IS_HW_ERR | Y2_IS_STAT_BMU | + Y2_IS_POLL_CHK | Y2_IS_TWSI_RDY | + Y2_IS_IRQ_SW | Y2_IS_TIMINT, + Y2_IS_PORT_1 = Y2_IS_IRQ_PHY1 | Y2_IS_IRQ_MAC1 | + Y2_IS_CHK_RX1 | Y2_IS_CHK_TXA1 | Y2_IS_CHK_TXS1, + Y2_IS_PORT_2 = Y2_IS_IRQ_PHY2 | Y2_IS_IRQ_MAC2 | + Y2_IS_CHK_RX2 | Y2_IS_CHK_TXA2 | Y2_IS_CHK_TXS2, }; /* B2_IRQM_HWE_MSK 32 bit IRQ Moderation HW Error Mask */ @@ -380,9 +380,6 @@ enum { CHIP_REV_YU_EC_A1 = 0, /* Chip Rev. for Yukon-EC A1/A0 */ CHIP_REV_YU_EC_A2 = 1, /* Chip Rev. for Yukon-EC A2 */ CHIP_REV_YU_EC_A3 = 2, /* Chip Rev. for Yukon-EC A3 */ - - CHIP_REV_YU_EC_U_A0 = 0, - CHIP_REV_YU_EC_U_A1 = 1, }; /* B2_Y2_CLK_GATE 8 bit Clock Gating (Yukon-2 only) */ @@ -1317,6 +1314,14 @@ 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 { @@ -1378,23 +1383,24 @@ enum { GM_SMI_CTRL = 0x0080, /* 16 bit r/w SMI Control Register */ GM_SMI_DATA = 0x0084, /* 16 bit r/w SMI Data Register */ GM_PHY_ADDR = 0x0088, /* 16 bit r/w GPHY Address Register */ -/* MIB Counters */ - GM_MIB_CNT_BASE = 0x0100, /* Base Address of MIB Counters */ - GM_MIB_CNT_END = 0x025C, /* Last MIB counter */ }; +/* MIB Counters */ +#define GM_MIB_CNT_BASE 0x0100 /* Base Address of MIB Counters */ +#define GM_MIB_CNT_SIZE 44 /* Number of MIB Counters */ +#define GM_MIB_CNT_END 0x025C /* Last MIB counter */ /* * MIB Counters base address definitions (low word) - * use offset 4 for access to high word (32 bit r/o) */ enum { - GM_RXF_UC_OK = GM_MIB_CNT_BASE + 0, /* Unicast Frames Received OK */ + GM_RXF_UC_OK = GM_MIB_CNT_BASE + 0, /* Unicast Frames Received OK */ GM_RXF_BC_OK = GM_MIB_CNT_BASE + 8, /* Broadcast Frames Received OK */ GM_RXF_MPAUSE = GM_MIB_CNT_BASE + 16, /* Pause MAC Ctrl Frames Received */ GM_RXF_MC_OK = GM_MIB_CNT_BASE + 24, /* Multicast Frames Received OK */ GM_RXF_FCS_ERR = GM_MIB_CNT_BASE + 32, /* Rx Frame Check Seq. Error */ - + /* GM_MIB_CNT_BASE + 40: reserved */ GM_RXO_OK_LO = GM_MIB_CNT_BASE + 48, /* Octets Received OK Low */ GM_RXO_OK_HI = GM_MIB_CNT_BASE + 56, /* Octets Received OK High */ GM_RXO_ERR_LO = GM_MIB_CNT_BASE + 64, /* Octets Received Invalid Low */ @@ -1402,36 +1408,37 @@ enum { GM_RXF_SHT = GM_MIB_CNT_BASE + 80, /* Frames <64 Byte Received OK */ GM_RXE_FRAG = GM_MIB_CNT_BASE + 88, /* Frames <64 Byte Received with FCS Err */ GM_RXF_64B = GM_MIB_CNT_BASE + 96, /* 64 Byte Rx Frame */ - GM_RXF_127B = GM_MIB_CNT_BASE + 104,/* 65-127 Byte Rx Frame */ - GM_RXF_255B = GM_MIB_CNT_BASE + 112,/* 128-255 Byte Rx Frame */ - GM_RXF_511B = GM_MIB_CNT_BASE + 120,/* 256-511 Byte Rx Frame */ - GM_RXF_1023B = GM_MIB_CNT_BASE + 128,/* 512-1023 Byte Rx Frame */ - GM_RXF_1518B = GM_MIB_CNT_BASE + 136,/* 1024-1518 Byte Rx Frame */ - GM_RXF_MAX_SZ = GM_MIB_CNT_BASE + 144,/* 1519-MaxSize Byte Rx Frame */ - GM_RXF_LNG_ERR = GM_MIB_CNT_BASE + 152,/* Rx Frame too Long Error */ - GM_RXF_JAB_PKT = GM_MIB_CNT_BASE + 160,/* Rx Jabber Packet Frame */ - - GM_RXE_FIFO_OV = GM_MIB_CNT_BASE + 176,/* Rx FIFO overflow Event */ - GM_TXF_UC_OK = GM_MIB_CNT_BASE + 192,/* Unicast Frames Xmitted OK */ - GM_TXF_BC_OK = GM_MIB_CNT_BASE + 200,/* Broadcast Frames Xmitted OK */ - GM_TXF_MPAUSE = GM_MIB_CNT_BASE + 208,/* Pause MAC Ctrl Frames Xmitted */ - GM_TXF_MC_OK = GM_MIB_CNT_BASE + 216,/* Multicast Frames Xmitted OK */ - GM_TXO_OK_LO = GM_MIB_CNT_BASE + 224,/* Octets Transmitted OK Low */ - GM_TXO_OK_HI = GM_MIB_CNT_BASE + 232,/* Octets Transmitted OK High */ - GM_TXF_64B = GM_MIB_CNT_BASE + 240,/* 64 Byte Tx Frame */ - GM_TXF_127B = GM_MIB_CNT_BASE + 248,/* 65-127 Byte Tx Frame */ - GM_TXF_255B = GM_MIB_CNT_BASE + 256,/* 128-255 Byte Tx Frame */ - GM_TXF_511B = GM_MIB_CNT_BASE + 264,/* 256-511 Byte Tx Frame */ - GM_TXF_1023B = GM_MIB_CNT_BASE + 272,/* 512-1023 Byte Tx Frame */ - GM_TXF_1518B = GM_MIB_CNT_BASE + 280,/* 1024-1518 Byte Tx Frame */ - GM_TXF_MAX_SZ = GM_MIB_CNT_BASE + 288,/* 1519-MaxSize Byte Tx Frame */ - - GM_TXF_COL = GM_MIB_CNT_BASE + 304,/* Tx Collision */ - GM_TXF_LAT_COL = GM_MIB_CNT_BASE + 312,/* Tx Late Collision */ - GM_TXF_ABO_COL = GM_MIB_CNT_BASE + 320,/* Tx aborted due to Exces. Col. */ - GM_TXF_MUL_COL = GM_MIB_CNT_BASE + 328,/* Tx Multiple Collision */ - GM_TXF_SNG_COL = GM_MIB_CNT_BASE + 336,/* Tx Single Collision */ - GM_TXE_FIFO_UR = GM_MIB_CNT_BASE + 344,/* Tx FIFO Underrun Event */ + GM_RXF_127B = GM_MIB_CNT_BASE + 104, /* 65-127 Byte Rx Frame */ + GM_RXF_255B = GM_MIB_CNT_BASE + 112, /* 128-255 Byte Rx Frame */ + GM_RXF_511B = GM_MIB_CNT_BASE + 120, /* 256-511 Byte Rx Frame */ + GM_RXF_1023B = GM_MIB_CNT_BASE + 128, /* 512-1023 Byte Rx Frame */ + GM_RXF_1518B = GM_MIB_CNT_BASE + 136, /* 1024-1518 Byte Rx Frame */ + GM_RXF_MAX_SZ = GM_MIB_CNT_BASE + 144, /* 1519-MaxSize Byte Rx Frame */ + GM_RXF_LNG_ERR = GM_MIB_CNT_BASE + 152, /* Rx Frame too Long Error */ + GM_RXF_JAB_PKT = GM_MIB_CNT_BASE + 160, /* Rx Jabber Packet Frame */ + /* GM_MIB_CNT_BASE + 168: reserved */ + GM_RXE_FIFO_OV = GM_MIB_CNT_BASE + 176, /* Rx FIFO overflow Event */ + /* GM_MIB_CNT_BASE + 184: reserved */ + GM_TXF_UC_OK = GM_MIB_CNT_BASE + 192, /* Unicast Frames Xmitted OK */ + GM_TXF_BC_OK = GM_MIB_CNT_BASE + 200, /* Broadcast Frames Xmitted OK */ + GM_TXF_MPAUSE = GM_MIB_CNT_BASE + 208, /* Pause MAC Ctrl Frames Xmitted */ + GM_TXF_MC_OK = GM_MIB_CNT_BASE + 216, /* Multicast Frames Xmitted OK */ + GM_TXO_OK_LO = GM_MIB_CNT_BASE + 224, /* Octets Transmitted OK Low */ + GM_TXO_OK_HI = GM_MIB_CNT_BASE + 232, /* Octets Transmitted OK High */ + GM_TXF_64B = GM_MIB_CNT_BASE + 240, /* 64 Byte Tx Frame */ + GM_TXF_127B = GM_MIB_CNT_BASE + 248, /* 65-127 Byte Tx Frame */ + GM_TXF_255B = GM_MIB_CNT_BASE + 256, /* 128-255 Byte Tx Frame */ + GM_TXF_511B = GM_MIB_CNT_BASE + 264, /* 256-511 Byte Tx Frame */ + GM_TXF_1023B = GM_MIB_CNT_BASE + 272, /* 512-1023 Byte Tx Frame */ + GM_TXF_1518B = GM_MIB_CNT_BASE + 280, /* 1024-1518 Byte Tx Frame */ + GM_TXF_MAX_SZ = GM_MIB_CNT_BASE + 288, /* 1519-MaxSize Byte Tx Frame */ + + GM_TXF_COL = GM_MIB_CNT_BASE + 304, /* Tx Collision */ + GM_TXF_LAT_COL = GM_MIB_CNT_BASE + 312, /* Tx Late Collision */ + GM_TXF_ABO_COL = GM_MIB_CNT_BASE + 320, /* Tx aborted due to Exces. Col. */ + GM_TXF_MUL_COL = GM_MIB_CNT_BASE + 328, /* Tx Multiple Collision */ + GM_TXF_SNG_COL = GM_MIB_CNT_BASE + 336, /* Tx Single Collision */ + GM_TXE_FIFO_UR = GM_MIB_CNT_BASE + 344, /* Tx FIFO Underrun Event */ }; /* GMAC Bit Definitions */ @@ -1480,7 +1487,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 = 7<<10, /* Bit 12..10: Collision Threshold */ + GM_TXCR_COL_THR_MSK = 1<<10, /* Bit 12..10: Collision Threshold */ }; #define TX_COL_THR(x) (((x)<<10) & GM_TXCR_COL_THR_MSK) @@ -1566,7 +1573,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_GOOD_FC | GMR_FS_BAD_FC | + GMR_FS_MII_ERR | GMR_FS_BAD_FC | GMR_FS_UN_SIZE | GMR_FS_JABBER, }; @@ -1809,7 +1816,7 @@ struct sky2_rx_le { __le16 length; u8 ctrl; u8 opcode; -} __attribute((packed)); +} __attribute((packed));; struct sky2_status_le { __le32 status; /* also checksum */ @@ -1834,7 +1841,6 @@ struct sky2_port { struct net_device *netdev; unsigned port; u32 msg_enable; - spinlock_t phy_lock; spinlock_t tx_lock ____cacheline_aligned_in_smp; struct tx_ring_info *tx_ring; @@ -1843,6 +1849,7 @@ struct sky2_port { u16 tx_prod; /* next le to use */ u32 tx_addr64; u16 tx_pending; + u16 tx_last_put; u16 tx_last_mss; struct ring_info *rx_ring ____cacheline_aligned_in_smp; @@ -1851,6 +1858,7 @@ struct sky2_port { u16 rx_next; /* next re to check */ u16 rx_put; /* next le index to use */ u16 rx_pending; + u16 rx_last_put; u16 rx_bufsize; #ifdef SKY2_VLAN_TAG_USED u16 rx_tag; @@ -1866,31 +1874,37 @@ struct sky2_port { u8 rx_pause; u8 tx_pause; u8 rx_csum; + u8 wol; struct net_device_stats net_stats; + struct work_struct phy_task; + struct semaphore phy_sema; }; struct sky2_hw { void __iomem *regs; struct pci_dev *pdev; struct net_device *dev[2]; + spinlock_t hw_lock; + u32 intr_mask; int pm_cap; u8 chip_id; u8 chip_rev; - u8 copper; + u8 pmd_type; u8 ports; struct sky2_status_le *st_le; u32 st_idx; dma_addr_t st_dma; - - struct timer_list idle_timer; - int msi_detected; - 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 3a1b71316..c6fbb1ede 100644 --- a/drivers/net/slhc.c +++ b/drivers/net/slhc.c @@ -50,6 +50,7 @@ * 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 1588cb7f6..b2e18d288 100644 --- a/drivers/net/slip.c +++ b/drivers/net/slip.c @@ -55,6 +55,7 @@ */ #define SL_CHECK_TRANSMIT +#include #include #include diff --git a/drivers/net/slip.h b/drivers/net/slip.h index 29d87dd45..ab3efe66a 100644 --- a/drivers/net/slip.h +++ b/drivers/net/slip.h @@ -22,6 +22,7 @@ #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 45449353a..3db30cd06 100644 --- a/drivers/net/smc-ultra.c +++ b/drivers/net/smc-ultra.c @@ -57,6 +57,7 @@ static const char version[] = "smc-ultra.c:v2.02 2/3/98 Donald Becker (becker@cesdis.gsfc.nasa.gov)\n"; +#include #include #include #include @@ -552,7 +553,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 __init +int init_module(void) { struct net_device *dev; diff --git a/drivers/net/smc-ultra32.c b/drivers/net/smc-ultra32.c index 85be22a05..b3e397d7c 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 : IRQF_SHARED; + int irq_flags = (inb(ioaddr + ULTRA32_CFG5) & 0x08) ? 0 : SA_SHIRQ; 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 init_module(void) +int init_module(void) { int this_dev, found = 0; diff --git a/drivers/net/smc9194.c b/drivers/net/smc9194.c index 8b0321f19..f86697da0 100644 --- a/drivers/net/smc9194.c +++ b/drivers/net/smc9194.c @@ -523,7 +523,8 @@ static int smc_wait_to_send_packet( struct sk_buff * skb, struct net_device * de length = skb->len; if (length < ETH_ZLEN) { - if (skb_padto(skb, ETH_ZLEN)) { + skb = skb_padto(skb, ETH_ZLEN); + if (skb == NULL) { netif_wake_queue(dev); return 0; } @@ -731,9 +732,12 @@ static int ifport; struct net_device * __init smc_init(int unit) { struct net_device *dev = alloc_etherdev(sizeof(struct smc_local)); - struct devlist *smcdev = smc_devlist; + static struct devlist *smcdev = smc_devlist; int err = 0; +#ifndef NO_AUTOPROBE + smcdev = smc_devlist; +#endif if (!dev) return ERR_PTR(-ENODEV); @@ -1603,7 +1607,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 init_module(void) +int init_module(void) { if (io == 0) printk(KERN_WARNING diff --git a/drivers/net/smc91x.c b/drivers/net/smc91x.c index cf62373b8..7ec08127c 100644 --- a/drivers/net/smc91x.c +++ b/drivers/net/smc91x.c @@ -66,6 +66,7 @@ static const char version[] = #endif +#include #include #include #include @@ -214,12 +215,15 @@ 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 @@ -321,12 +325,12 @@ static void smc_reset(struct net_device *dev) DBG(2, "%s: %s\n", dev->name, __FUNCTION__); /* Disable all interrupts, block TX tasklet */ - spin_lock_irq(&lp->lock); + spin_lock(&lp->lock); SMC_SELECT_BANK(2); SMC_SET_INT_MASK(0); pending_skb = lp->pending_tx_skb; lp->pending_tx_skb = NULL; - spin_unlock_irq(&lp->lock); + spin_unlock(&lp->lock); /* free any pending tx skb */ if (pending_skb) { @@ -448,12 +452,12 @@ static void smc_shutdown(struct net_device *dev) DBG(2, "%s: %s\n", CARDNAME, __FUNCTION__); /* no more interrupts for me */ - spin_lock_irq(&lp->lock); + spin_lock(&lp->lock); SMC_SELECT_BANK(2); SMC_SET_INT_MASK(0); pending_skb = lp->pending_tx_skb; lp->pending_tx_skb = NULL; - spin_unlock_irq(&lp->lock); + spin_unlock(&lp->lock); if (pending_skb) dev_kfree_skb(pending_skb); @@ -2100,8 +2104,9 @@ static int smc_enable_device(struct platform_device *pdev) * Set the appropriate byte/word mode. */ ecsr = readb(addr + (ECSR << SMC_IO_SHIFT)) & ~ECSR_IOIS8; - if (!SMC_CAN_USE_16BIT) - ecsr |= ECSR_IOIS8; +#ifndef SMC_CAN_USE_16BIT + ecsr |= ECSR_IOIS8; +#endif writeb(ecsr, addr + (ECSR << SMC_IO_SHIFT)); local_irq_restore(flags); @@ -2138,39 +2143,40 @@ static void smc_release_attrib(struct platform_device *pdev) release_mem_region(res->start, ATTRIB_SIZE); } -static inline void smc_request_datacs(struct platform_device *pdev, struct net_device *ndev) +#ifdef SMC_CAN_USE_DATACS +static void smc_request_datacs(struct platform_device *pdev, struct net_device *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; + struct resource * res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "smc91x-data32"); + struct smc_local *lp = netdev_priv(ndev); - if(!request_mem_region(res->start, SMC_DATA_EXTENT, CARDNAME)) { - printk(KERN_INFO "%s: failed to request datacs memory region.\n", CARDNAME); - return; - } + if (!res) + return; - lp->datacs = ioremap(res->start, SMC_DATA_EXTENT); + 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); } static void smc_release_datacs(struct platform_device *pdev, struct net_device *ndev) { - if (SMC_CAN_USE_DATACS) { - struct smc_local *lp = netdev_priv(ndev); - struct resource * res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "smc91x-data32"); + 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) @@ -2215,10 +2221,6 @@ static int smc_drv_probe(struct platform_device *pdev) 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) diff --git a/drivers/net/smc91x.h b/drivers/net/smc91x.h index 7aa7fbac8..e0efd1964 100644 --- a/drivers/net/smc91x.h +++ b/drivers/net/smc91x.h @@ -129,19 +129,6 @@ #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) || \ @@ -184,10 +171,16 @@ SMC_outw(u16 val, void __iomem *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 @@ -196,7 +189,7 @@ SMC_outw(u16 val, void __iomem *ioaddr, int reg) machine_is_omap_h2() \ || machine_is_omap_h3() \ || (machine_is_omap_innovator() && !cpu_is_omap1510()) \ - ) ? IRQF_TRIGGER_FALLING : IRQF_TRIGGER_RISING) + ) ? SA_TRIGGER_FALLING : SA_TRIGGER_RISING) #elif defined(CONFIG_SH_SH4202_MICRODEV) @@ -249,17 +242,15 @@ SMC_outw(u16 val, void __iomem *ioaddr, int reg) #define RPC_LSA_DEFAULT RPC_LED_TX_RX #define RPC_LSB_DEFAULT RPC_LED_100_10 -#elif defined(CONFIG_MACH_LPD79520) \ - || defined(CONFIG_MACH_LPD7A400) \ - || defined(CONFIG_MACH_LPD7A404) +#elif defined(CONFIG_MACH_LPD7A400) || defined(CONFIG_MACH_LPD7A404) -/* 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 +/* 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 * Documentation/arm/Sharp-LH/IOBarrier for details. The read from - * 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. + * 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. * * There is no explicit protection against interrupts intervening * between the writew and the IOBARRIER. In SMC ISR there is a @@ -278,35 +269,22 @@ SMC_outw(u16 val, void __iomem *ioaddr, int reg) #define SMC_CAN_USE_16BIT 1 #define SMC_CAN_USE_32BIT 0 #define SMC_NOWAIT 0 -#define LPD7X_IOBARRIER readb (IOBARRIER_VIRT) +#define LPD7A40X_IOBARRIER readb (IOBARRIER_VIRT) -#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; }) +#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_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) +static inline void SMC_outsw (unsigned long a, int r, unsigned char* p, int l) { unsigned short* ps = (unsigned short*) p; while (l-- > 0) { writew (*ps++, a + r); - LPD7X_IOBARRIER; + LPD7A40X_IOBARRIER; } } -#define SMC_INTERRUPT_PREAMBLE LPD7X_IOBARRIER +#define SMC_INTERRUPT_PREAMBLE LPD7A40X_IOBARRIER #define RPC_LSA_DEFAULT RPC_LED_TX_RX #define RPC_LSB_DEFAULT RPC_LED_100_10 @@ -343,42 +321,6 @@ static inline void LPD7_SMC_outsw (unsigned char* a, int r, #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 @@ -400,6 +342,10 @@ static inline void LPD7_SMC_outsw (unsigned char* a, int r, #endif +#ifndef SMC_IRQ_FLAGS +#define SMC_IRQ_FLAGS SA_TRIGGER_RISING +#endif + #ifdef SMC_USE_PXA_DMA /* * Let's use the DMA engine on the XScale PXA2xx for RX packets. This is @@ -495,85 +441,10 @@ smc_pxa_dma_irq(int dma, void *dummy, struct pt_regs *regs) #endif /* SMC_USE_PXA_DMA */ -/* - * 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 - +/* Because of bank switching, the LAN91x uses only 16 I/O ports */ #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) @@ -946,11 +817,6 @@ 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 @@ -968,142 +834,62 @@ static const char * chip_ids[ 16 ] = { #define SMC_REG(reg, bank) (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) ) - +#if SMC_CAN_USE_8BIT +#define SMC_GET_PN() SMC_inb( ioaddr, PN_REG ) +#define SMC_SET_PN(x) SMC_outb( x, ioaddr, PN_REG ) +#define SMC_GET_AR() SMC_inb( ioaddr, AR_REG ) +#define SMC_GET_TXFIFO() SMC_inb( ioaddr, TXFIFO_REG ) +#define SMC_GET_RXFIFO() SMC_inb( ioaddr, RXFIFO_REG ) +#define SMC_GET_INT() SMC_inb( ioaddr, INT_REG ) +#define SMC_ACK_INT(x) SMC_outb( x, ioaddr, INT_REG ) +#define SMC_GET_INT_MASK() SMC_inb( ioaddr, IM_REG ) +#define SMC_SET_INT_MASK(x) SMC_outb( x, ioaddr, IM_REG ) +#else +#define SMC_GET_PN() (SMC_inw( ioaddr, PN_REG ) & 0xFF) +#define SMC_SET_PN(x) SMC_outw( x, ioaddr, PN_REG ) +#define SMC_GET_AR() (SMC_inw( ioaddr, PN_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) #define SMC_ACK_INT(x) \ do { \ - 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); \ - } \ + 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_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 { \ - 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); \ + (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 ); \ + } \ + } while (0) +#define _SMC_PULL_DATA(p, l) \ + 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 ); \ + } \ + __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 -#define SMC_PUSH_DATA(p, l) \ +#if ! SMC_CAN_USE_16BIT +#define SMC_outw(x, ioaddr, reg) \ do { \ - 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); \ + 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; \ + }) +#endif + +#ifdef 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) \ - 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; \ + 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; \ __len += 2; \ - 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) + 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 #endif /* _SMC91X_H_ */ diff --git a/drivers/net/sonic.c b/drivers/net/sonic.c index cab0dd958..90b818a8d 100644 --- a/drivers/net/sonic.c +++ b/drivers/net/sonic.c @@ -231,7 +231,8 @@ static int sonic_send_packet(struct sk_buff *skb, struct net_device *dev) length = skb->len; if (length < ETH_ZLEN) { - if (skb_padto(skb, ETH_ZLEN)) + skb = skb_padto(skb, ETH_ZLEN); + if (skb == NULL) return 0; length = ETH_ZLEN; } diff --git a/drivers/net/sonic.h b/drivers/net/sonic.h index 7f5c4ebcc..cede969a8 100644 --- a/drivers/net/sonic.h +++ b/drivers/net/sonic.h @@ -22,6 +22,7 @@ #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 889072184..1f5975a61 100644 --- a/drivers/net/spider_net.c +++ b/drivers/net/spider_net.c @@ -21,6 +21,7 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +#include #include #include #include @@ -84,7 +85,7 @@ MODULE_DEVICE_TABLE(pci, spider_net_pci_tbl); * * returns the content of the specified SMMIO register. */ -static inline u32 +static u32 spider_net_read_reg(struct spider_net_card *card, u32 reg) { u32 value; @@ -101,7 +102,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 inline void +static void spider_net_write_reg(struct spider_net_card *card, u32 reg, u32 value) { value = cpu_to_le32(value); @@ -259,10 +260,39 @@ spider_net_get_mac_address(struct net_device *netdev) * * returns the status as in the dmac_cmd_status field of the descriptor */ -static inline int +static enum spider_net_descr_status spider_net_get_descr_status(struct spider_net_descr *descr) { - return descr->dmac_cmd_status & SPIDER_NET_DESCR_IND_PROC_MASK; + 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; } /** @@ -299,23 +329,24 @@ 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 direction, int no) + struct spider_net_descr *start_descr, 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; + spider_net_set_descr_status(descr, SPIDER_NET_DESCR_NOT_IN_USE); buf = pci_map_single(card->pdev, descr, SPIDER_NET_DESCR_SIZE, - direction); + PCI_DMA_BIDIRECTIONAL); if (buf == DMA_ERROR_CODE) goto iommu_error; @@ -330,11 +361,10 @@ spider_net_init_chain(struct spider_net_card *card, start_descr->prev = descr-1; descr = start_descr; - if (direction == PCI_DMA_FROMDEVICE) - for (i=0; i < no; i++, descr++) - descr->next_descr_addr = descr->next->bus_addr; + 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; @@ -346,7 +376,7 @@ iommu_error: if (descr->bus_addr) pci_unmap_single(card->pdev, descr->bus_addr, SPIDER_NET_DESCR_SIZE, - direction); + PCI_DMA_BIDIRECTIONAL); return -ENOMEM; } @@ -367,7 +397,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_FROMDEVICE); + PCI_DMA_BIDIRECTIONAL); } descr = descr->next; } @@ -417,16 +447,15 @@ 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_FROMDEVICE); + SPIDER_NET_MAX_FRAME, PCI_DMA_BIDIRECTIONAL); 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"); - descr->dmac_cmd_status = SPIDER_NET_DESCR_NOT_IN_USE; + spider_net_set_descr_status(descr, SPIDER_NET_DESCR_NOT_IN_USE); } else { - descr->dmac_cmd_status = SPIDER_NET_DESCR_CARDOWNED | - SPIDER_NET_DMAC_NOINTR_COMPLETE; + descr->dmac_cmd_status = SPIDER_NET_DMAC_RX_CARDOWNED; } return error; @@ -440,7 +469,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 inline void +static void spider_net_enable_rxchtails(struct spider_net_card *card) { /* assume chain is aligned correctly */ @@ -455,7 +484,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 inline void +static void spider_net_enable_rxdmac(struct spider_net_card *card) { wmb(); @@ -472,24 +501,23 @@ 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 = &card->rx_chain; - unsigned long flags; + struct spider_net_descr_chain *chain; + + chain = &card->rx_chain; /* 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 (!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; - } + 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; + } - spin_unlock_irqrestore(&chain->lock, flags); + atomic_dec(&card->rx_chain_refill); } /** @@ -526,6 +554,111 @@ 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 @@ -629,128 +762,129 @@ spider_net_disable_rxdmac(struct spider_net_card *card) } /** - * spider_net_prepare_tx_descr - fill tx descriptor with skb data - * @card: card structure - * @descr: descriptor structure to fill out - * @skb: packet to use - * - * returns 0 on success, <0 on failure. + * spider_net_stop - called upon ifconfig down + * @netdev: interface device structure * - * fills out the descriptor structure with skb data and len. Copies data, - * if needed (32bit DMA!) + * always returns 0 */ -static int -spider_net_prepare_tx_descr(struct spider_net_card *card, - struct sk_buff *skb) +int +spider_net_stop(struct net_device *netdev) { - struct spider_net_descr *descr = card->tx_chain.head; - dma_addr_t buf; + struct spider_net_card *card = netdev_priv(netdev); - 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). " - "Dropping packet\n", skb->data, skb->len); - return -ENOMEM; - } + tasklet_kill(&card->rxram_full_tl); + netif_poll_disable(netdev); + netif_carrier_off(netdev); + netif_stop_queue(netdev); + del_timer_sync(&card->tx_timer); - descr->buf_addr = buf; - descr->buf_size = skb->len; - descr->next_descr_addr = 0; - descr->skb = skb; - descr->data_status = 0; + /* 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); - 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; - } + /* free_irq(netdev->irq, netdev);*/ + free_irq(to_pci_dev(netdev->class_dev.dev)->irq, netdev); - descr->prev->next_descr_addr = descr->bus_addr; + 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_release_tx_descr - processes a used tx descriptor - * @card: card structure - * @descr: descriptor to release + * spider_net_get_next_tx_descr - returns the next available tx descriptor + * @card: device structure to get descriptor from * - * releases a used tx descriptor (unmapping, freeing of skb) + * returns the address of the next descriptor, or NULL if not available. */ -static inline void -spider_net_release_tx_descr(struct spider_net_card *card) +static struct spider_net_descr * +spider_net_get_next_tx_descr(struct spider_net_card *card) { - struct spider_net_descr *descr = card->tx_chain.tail; - struct sk_buff *skb; + /* 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(); - card->tx_chain.tail = card->tx_chain.tail->next; - descr->dmac_cmd_status |= SPIDER_NET_DESCR_NOT_IN_USE; + if (skb->ip_summed != CHECKSUM_HW) { + descr->dmac_cmd_status = SPIDER_NET_DMAC_CMDSTAT_NOCS; + return; + } - /* unmap the skb */ - skb = descr->skb; - pci_unmap_single(card->pdev, descr->buf_addr, skb->len, - PCI_DMA_TODEVICE); - dev_kfree_skb_any(skb); + /* 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_release_tx_chain - processes sent tx descriptors - * @card: adapter structure - * @brutal: if set, don't care about whether descriptor seems to be in use + * spider_net_prepare_tx_descr - fill tx descriptor with skb data + * @card: card structure + * @descr: descriptor structure to fill out + * @skb: packet to use * - * returns 0 if the tx ring is empty, otherwise 1. + * returns 0 on success, <0 on failure. * - * 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. + * fills out the descriptor structure with skb data and len. Copies data, + * if needed (32bit DMA!) */ static int -spider_net_release_tx_chain(struct spider_net_card *card, int brutal) +spider_net_prepare_tx_descr(struct spider_net_card *card, + struct spider_net_descr *descr, + struct sk_buff *skb) { - 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; + dma_addr_t buf; - 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) */ + buf = pci_map_single(card->pdev, skb->data, + skb->len, PCI_DMA_BIDIRECTIONAL); + if (buf == DMA_ERROR_CODE) { + if (netif_msg_tx_err(card) && net_ratelimit()) + pr_err("could not iommu-map packet (%p, %i). " + "Dropping packet\n", skb->data, skb->len); + return -ENOMEM; + } - 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; + descr->buf_addr = buf; + descr->buf_size = skb->len; + descr->skb = skb; + descr->data_status = 0; - default: - card->netdev_stats.tx_dropped++; - return 1; - } - spider_net_release_tx_descr(card); - } + spider_net_set_txdescr_cmdstat(descr,skb); return 0; } @@ -763,32 +897,18 @@ spider_net_release_tx_chain(struct spider_net_card *card, int brutal) * 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 inline void -spider_net_kick_tx_dma(struct spider_net_card *card) +static void +spider_net_kick_tx_dma(struct spider_net_card *card, + struct spider_net_descr *descr) { - struct spider_net_descr *descr; - - if (spider_net_read_reg(card, SPIDER_NET_GDTDMACCNTR) & - SPIDER_NET_TX_DMA_EN) - goto out; + /* this is the only descriptor in the output chain. + * Enable TX DMA */ - 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; - } + spider_net_write_reg(card, SPIDER_NET_GDTDCHA, + descr->bus_addr); -out: - mod_timer(&card->tx_timer, jiffies + SPIDER_NET_TX_TIMER); + spider_net_write_reg(card, SPIDER_NET_GDTDMACCNTR, + SPIDER_NET_DMA_TX_VALUE); } /** @@ -796,69 +916,47 @@ out: * @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_chain *chain = &card->tx_chain; - struct spider_net_descr *descr = chain->head; - unsigned long flags; + struct spider_net_descr *descr; int result; - spin_lock_irqsave(&chain->lock, flags); - spider_net_release_tx_chain(card, 0); - if (chain->head->next == chain->tail->prev) { - card->netdev_stats.tx_dropped++; - result = NETDEV_TX_LOCKED; - goto out; - } - - if (spider_net_get_descr_status(descr) != SPIDER_NET_DESCR_NOT_IN_USE) { - result = NETDEV_TX_LOCKED; - goto out; - } + descr = spider_net_get_next_tx_descr(card); - if (spider_net_prepare_tx_descr(card, skb) != 0) { - card->netdev_stats.tx_dropped++; - result = NETDEV_TX_BUSY; - goto out; - } + if (!descr) + goto error; - result = NETDEV_TX_OK; + result = spider_net_prepare_tx_descr(card, descr, skb); + if (result) + goto error; - spider_net_kick_tx_dma(card); card->tx_chain.head = card->tx_chain.head->next; -out: - spin_unlock_irqrestore(&chain->lock, flags); - netif_wake_queue(netdev); - return result; -} - -/** - * 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; + 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); + } - spin_lock_irqsave(&card->tx_chain.lock, flags); + mod_timer(&card->tx_timer, jiffies + SPIDER_NET_TX_TIMER); - if ((spider_net_release_tx_chain(card, 0) != 0) && - (card->netdev->flags & IFF_UP)) - spider_net_kick_tx_dma(card); + return NETDEV_TX_OK; - spin_unlock_irqrestore(&card->tx_chain.lock, flags); +error: + card->netdev_stats.tx_dropped++; + return NETDEV_TX_BUSY; } /** @@ -905,7 +1003,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_FROMDEVICE); + PCI_DMA_BIDIRECTIONAL); /* the cases we'll throw away the packet immediately */ if (data_error & SPIDER_NET_DESTROY_RX_FLAGS) { @@ -970,11 +1068,14 @@ spider_net_pass_skb_up(struct spider_net_descr *descr, static int spider_net_decode_one_descr(struct spider_net_card *card, int napi) { - struct spider_net_descr_chain *chain = &card->rx_chain; - struct spider_net_descr *descr = chain->tail; - int status; + enum spider_net_descr_status status; + struct spider_net_descr *descr; + struct spider_net_descr_chain *chain; int result; + chain = &card->rx_chain; + descr = chain->tail; + status = spider_net_get_descr_status(descr); if (status == SPIDER_NET_DESCR_CARDOWNED) { @@ -1003,7 +1104,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_FROMDEVICE); + SPIDER_NET_MAX_FRAME, PCI_DMA_BIDIRECTIONAL); dev_kfree_skb_irq(descr->skb); goto refill; } @@ -1019,7 +1120,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: - descr->dmac_cmd_status = SPIDER_NET_DESCR_NOT_IN_USE; + spider_net_set_descr_status(descr, SPIDER_NET_DESCR_NOT_IN_USE); /* change the descriptor state: */ if (!napi) spider_net_refill_rx_chain(card); @@ -1190,6 +1291,21 @@ 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 @@ -1326,7 +1442,7 @@ spider_net_handle_error_irq(struct spider_net_card *card, u32 status_reg) case SPIDER_NET_GRFAFLLINT: /* fallthrough */ case SPIDER_NET_GRMFLLINT: if (netif_msg_intr(card) && net_ratelimit()) - pr_debug("Spider RX RAM full, incoming packets " + pr_err("Spider RX RAM full, incoming packets " "might be discarded!\n"); spider_net_rx_irq_off(card); tasklet_schedule(&card->rxram_full_tl); @@ -1536,8 +1652,7 @@ spider_net_enable_card(struct spider_net_card *card) { SPIDER_NET_GFTRESTRT, SPIDER_NET_RESTART_VALUE }, { SPIDER_NET_GMRWOLCTRL, 0 }, - { SPIDER_NET_GTESTMD, 0x10000000 }, - { SPIDER_NET_GTTQMSK, 0x00400040 }, + { SPIDER_NET_GTESTMD, 0 }, { SPIDER_NET_GMACINTEN, 0 }, @@ -1576,6 +1691,9 @@ 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, @@ -1590,9 +1708,6 @@ 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); } /** @@ -1611,12 +1726,11 @@ spider_net_open(struct net_device *netdev) int result; result = -ENOMEM; - if (spider_net_init_chain(card, &card->tx_chain, card->descr, - PCI_DMA_TODEVICE, card->tx_desc)) + if (spider_net_init_chain(card, &card->tx_chain, + card->descr, tx_descriptors)) goto alloc_tx_failed; if (spider_net_init_chain(card, &card->rx_chain, - card->descr + card->rx_desc, - PCI_DMA_FROMDEVICE, card->rx_desc)) + card->descr + tx_descriptors, rx_descriptors)) goto alloc_rx_failed; /* allocate rx skbs */ @@ -1629,7 +1743,7 @@ spider_net_open(struct net_device *netdev) result = -EBUSY; if (request_irq(netdev->irq, spider_net_interrupt, - IRQF_SHARED, netdev->name, netdev)) + SA_SHIRQ, netdev->name, netdev)) goto register_int_failed; spider_net_enable_card(card); @@ -1678,7 +1792,15 @@ spider_net_setup_phy(struct spider_net_card *card) if (phy->def->ops->setup_forced) phy->def->ops->setup_forced(phy, SPEED_1000, DUPLEX_FULL); - phy->def->ops->enable_fiber(phy); + /* the following two writes could be moved to sungem_phy.c */ + /* enable fiber mode */ + spider_net_write_phy(card->netdev, 1, MII_NCONFIG, 0x9020); + /* LEDs active in both modes, autosense prio = fiber */ + spider_net_write_phy(card->netdev, 1, MII_NCONFIG, 0x945f); + + /* switch off fibre autoneg */ + spider_net_write_phy(card->netdev, 1, MII_NCONFIG, 0xfc01); + spider_net_write_phy(card->netdev, 1, 0x0b, 0x0004); phy->def->ops->read_link(phy); pr_info("Found %s with %i Mbps, %s-duplex.\n", phy->def->name, @@ -1823,7 +1945,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_GSnPRGADR + + spider_net_write_reg(card, SPIDER_NET_GSnPRGDAT + sequencer * 8, 0x0); for (i = 0; i < SPIDER_NET_FIRMWARE_SEQWORDS; i++) { spider_net_write_reg(card, SPIDER_NET_GSnPRGDAT + @@ -1839,49 +1961,6 @@ 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) @@ -1910,7 +1989,7 @@ spider_net_tx_timeout_task(void *data) goto out; spider_net_open(netdev); - spider_net_kick_tx_dma(card); + spider_net_kick_tx_dma(card, card->tx_chain.head); netif_device_attach(netdev); out: @@ -1993,6 +2072,7 @@ 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; @@ -2004,12 +2084,9 @@ 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 | NETIF_F_LLTX; + netdev->features = 0; /* 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 30407cdf0..5922b529a 100644 --- a/drivers/net/spider_net.h +++ b/drivers/net/spider_net.h @@ -120,8 +120,6 @@ extern char spider_net_driver_name[]; #define SPIDER_NET_GMRUAFILnR 0x00000500 #define SPIDER_NET_GMRUA0FIL15R 0x00000578 -#define SPIDER_NET_GTTQMSK 0x00000934 - /* RX DMA controller registers, all 0x00000a.. are for DMA controller A, * 0x00000b.. for DMA controller B, etc. */ #define SPIDER_NET_GDADCHA 0x00000a00 @@ -208,10 +206,7 @@ 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_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_VALUE 0x80000000 #define SPIDER_NET_DMA_TX_FEND_VALUE 0x00030003 /* SPIDER_NET_UA_DESCR_VALUE is OR'ed with the unicast address */ @@ -332,23 +327,55 @@ 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_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_GPREXEC 0x80000000 +#define SPIDER_NET_GPRDAT_MASK 0x0000ffff -#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 +/* 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 */ +}; struct spider_net_descr { /* as defined by the hardware */ @@ -369,7 +396,7 @@ struct spider_net_descr { } __attribute__((aligned(32))); struct spider_net_descr_chain { - spinlock_t lock; + /* we walk from tail to head */ struct spider_net_descr *head; struct spider_net_descr *tail; }; @@ -424,6 +451,8 @@ 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; @@ -440,9 +469,6 @@ 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 02209222b..a5bb0b763 100644 --- a/drivers/net/spider_net_ethtool.c +++ b/drivers/net/spider_net_ethtool.c @@ -130,18 +130,6 @@ 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, @@ -153,6 +141,5 @@ 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 c0a62b00f..d167deda9 100644 --- a/drivers/net/starfire.c +++ b/drivers/net/starfire.c @@ -22,14 +22,131 @@ 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 "2.0" -#define DRV_RELDATE "June 27, 2006" +#define DRV_VERSION "1.03+LK1.4.2.1" +#define DRV_RELDATE "October 3, 2005" +#include #include #include #include @@ -84,7 +201,7 @@ static int max_interrupt_work = 20; static int mtu; /* Maximum number of multicast addresses to filter (vs. rx-all-multicast). The Starfire has a 512 element hash table based on the Ethernet CRC. */ -static const int multicast_filter_limit = 512; +static int multicast_filter_limit = 512; /* Whether to do TCP/UDP checksums in hardware */ static int enable_hw_cksum = 1; @@ -218,7 +335,7 @@ do { \ /* These identify the driver base version and may not be removed. */ -static const char version[] __devinitdata = +static char version[] __devinitdata = KERN_INFO "starfire.c:v1.03 7/26/2000 Written by Donald Becker \n" KERN_INFO " (unofficial 2.2/2.4 kernel port, version " DRV_VERSION ", " DRV_RELDATE ")\n"; @@ -346,7 +463,7 @@ static struct pci_device_id starfire_pci_tbl[] = { MODULE_DEVICE_TABLE(pci, starfire_pci_tbl); /* A chip capabilities table, matching the CH_xxx entries in xxx_pci_tbl[] above. */ -static const struct chip_info { +static struct chip_info { const char *name; int drv_flags; } netdrv_tbl[] __devinitdata = { @@ -730,6 +847,7 @@ 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", @@ -953,7 +1071,7 @@ static int netdev_open(struct net_device *dev) /* Do we ever need to reset the chip??? */ - retval = request_irq(dev->irq, &intr_handler, IRQF_SHARED, dev->name, dev); + retval = request_irq(dev->irq, &intr_handler, SA_SHIRQ, dev->name, dev); if (retval) return retval; @@ -1231,7 +1349,8 @@ 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) { - if (skb_padto(skb, (skb->len + PADDING_MASK) & ~PADDING_MASK)) + skb = skb_padto(skb, (skb->len + PADDING_MASK) & ~PADDING_MASK); + if (skb == NULL) return NETDEV_TX_OK; } #endif /* ZEROCOPY && HAS_BROKEN_FIRMWARE */ @@ -1965,45 +2084,14 @@ static int netdev_close(struct net_device *dev) return 0; } -#ifdef CONFIG_PM -static int starfire_suspend(struct pci_dev *pdev, pm_message_t state) -{ - struct net_device *dev = pci_get_drvdata(pdev); - - if (netif_running(dev)) { - netif_device_detach(dev); - netdev_close(dev); - } - - pci_save_state(pdev); - pci_set_power_state(pdev, pci_choose_state(pdev,state)); - - return 0; -} - -static int starfire_resume(struct pci_dev *pdev) -{ - struct net_device *dev = pci_get_drvdata(pdev); - - pci_set_power_state(pdev, PCI_D0); - pci_restore_state(pdev); - - if (netif_running(dev)) { - netdev_open(dev); - netif_device_attach(dev); - } - - return 0; -} -#endif /* CONFIG_PM */ - static void __devexit starfire_remove_one (struct pci_dev *pdev) { struct net_device *dev = pci_get_drvdata(pdev); struct netdev_private *np = netdev_priv(dev); - BUG_ON(!dev); + if (!dev) + BUG(); unregister_netdev(dev); @@ -2027,10 +2115,6 @@ static struct pci_driver starfire_driver = { .name = DRV_NAME, .probe = starfire_init_one, .remove = __devexit_p(starfire_remove_one), -#ifdef CONFIG_PM - .suspend = starfire_suspend, - .resume = starfire_resume, -#endif /* CONFIG_PM */ .id_table = starfire_pci_tbl, }; diff --git a/drivers/net/stnic.c b/drivers/net/stnic.c index 742283489..b6dfdf8f4 100644 --- a/drivers/net/stnic.c +++ b/drivers/net/stnic.c @@ -7,6 +7,7 @@ * Copyright (C) 1999 kaz Kojima */ +#include #include #include #include diff --git a/drivers/net/sun3lance.c b/drivers/net/sun3lance.c index 2dcadb169..01bdb2334 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 IRQ_AUTO_3 +#define LANCE_IRQ IRQ3 /* Debug level: * 0 = silent, print only serious errors @@ -71,7 +71,7 @@ static int lance_debug = LANCE_DEBUG; #else static int lance_debug = 1; #endif -module_param(lance_debug, int, 0); +MODULE_PARM(lance_debug, "i"); MODULE_PARM_DESC(lance_debug, "SUN3 Lance debug level (0-3)"); MODULE_LICENSE("GPL"); @@ -341,7 +341,7 @@ static int __init lance_probe( struct net_device *dev) REGA(CSR0) = CSR0_STOP; - request_irq(LANCE_IRQ, lance_interrupt, IRQF_DISABLED, "SUN3 Lance", dev); + request_irq(LANCE_IRQ, lance_interrupt, SA_INTERRUPT, "SUN3 Lance", dev); dev->irq = (unsigned short)LANCE_IRQ; diff --git a/drivers/net/sunbmac.c b/drivers/net/sunbmac.c index d46891510..cfaf47c63 100644 --- a/drivers/net/sunbmac.c +++ b/drivers/net/sunbmac.c @@ -72,6 +72,8 @@ MODULE_LICENSE("GPL"); #define DIRQ(x) #endif +static struct bigmac *root_bigmac_dev; + #define DEFAULT_JAMSIZE 4 /* Toe jam */ #define QEC_RESET_TRIES 200 @@ -489,7 +491,7 @@ static void bigmac_tcvr_init(struct bigmac *bp) } } -static int bigmac_init_hw(struct bigmac *, int); +static int bigmac_init(struct bigmac *, int); static int try_next_permutation(struct bigmac *bp, void __iomem *tregs) { @@ -549,7 +551,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_hw(bp, 0); + ret = bigmac_init(bp, 0); if (ret) { printk(KERN_ERR "%s: Error, cannot re-init the " "BigMAC.\n", bp->dev->name); @@ -619,7 +621,7 @@ static void bigmac_begin_auto_negotiation(struct bigmac *bp) add_timer(&bp->bigmac_timer); } -static int bigmac_init_hw(struct bigmac *bp, int from_irq) +static int bigmac_init(struct bigmac *bp, int from_irq) { void __iomem *gregs = bp->gregs; void __iomem *cregs = bp->creg; @@ -750,7 +752,7 @@ static void bigmac_is_medium_rare(struct bigmac *bp, u32 qec_status, u32 bmac_st } printk(" RESET\n"); - bigmac_init_hw(bp, 1); + bigmac_init(bp, 1); } /* BigMAC transmit complete service routines. */ @@ -918,13 +920,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, IRQF_SHARED, dev->name, bp); + ret = request_irq(dev->irq, &bigmac_interrupt, SA_SHIRQ, 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_hw(bp, 0); + ret = bigmac_init(bp, 0); if (ret) free_irq(dev->irq, bp); return ret; @@ -948,7 +950,7 @@ static void bigmac_tx_timeout(struct net_device *dev) { struct bigmac *bp = (struct bigmac *) dev->priv; - bigmac_init_hw(bp, 0); + bigmac_init(bp, 0); netif_wake_queue(dev); } @@ -1102,8 +1104,6 @@ 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,7 +1226,11 @@ static int __init bigmac_ether_init(struct sbus_dev *qec_sdev) goto fail_and_cleanup; } - dev_set_drvdata(&bp->bigmac_sdev->ofdev.dev, bp); + /* Put us into the list of instances attached for later driver + * exit. + */ + bp->next_module = root_bigmac_dev; + root_bigmac_dev = bp; printk(KERN_INFO "%s: BigMAC 100baseT Ethernet ", dev->name); for (i = 0; i < 6; i++) @@ -1262,68 +1266,69 @@ fail_and_cleanup: /* QEC can be the parent of either QuadEthernet or * a BigMAC. We want the latter. */ -static int __devinit bigmac_sbus_probe(struct of_device *dev, const struct of_device_id *match) +static int __init bigmac_match(struct sbus_dev *sdev) { - struct sbus_dev *sdev = to_sbus_device(&dev->dev); - struct device_node *dp = dev->node; - - if (!strcmp(dp->name, "be")) - sdev = sdev->parent; - - return bigmac_ether_init(sdev); -} - -static int __devexit bigmac_sbus_remove(struct of_device *dev) -{ - struct bigmac *bp = dev_get_drvdata(&dev->dev); - struct net_device *net_dev = bp->dev; - - unregister_netdevice(net_dev); + struct sbus_dev *child = sdev->child; - 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); + if (strcmp(sdev->prom_name, "qec") != 0) + return 0; - free_netdev(net_dev); + if (child == NULL) + return 0; - dev_set_drvdata(&dev->dev, NULL); + if (strcmp(child->prom_name, "be") != 0) + return 0; - return 0; + return 1; } -static struct of_device_id bigmac_sbus_match[] = { - { - .name = "qec", - }, - { - .name = "be", - }, - {}, -}; - -MODULE_DEVICE_TABLE(of, bigmac_sbus_match); - -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) +static int __init bigmac_probe(void) { - return of_register_driver(&bigmac_sbus_driver, &sbus_bus_type); + 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; + return 0; } -static void __exit bigmac_exit(void) +static void __exit bigmac_cleanup(void) { - of_unregister_driver(&bigmac_sbus_driver); + while (root_bigmac_dev) { + struct bigmac *bp = root_bigmac_dev; + struct bigmac *bp_nxt = root_bigmac_dev->next_module; + + 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); + + unregister_netdev(bp->dev); + free_netdev(bp->dev); + root_bigmac_dev = bp_nxt; + } } -module_init(bigmac_init); -module_exit(bigmac_exit); +module_init(bigmac_probe); +module_exit(bigmac_cleanup); diff --git a/drivers/net/sunbmac.h b/drivers/net/sunbmac.h index b563d3c29..b0dbc5187 100644 --- a/drivers/net/sunbmac.h +++ b/drivers/net/sunbmac.h @@ -332,6 +332,7 @@ 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 698568e75..0ab9c38b4 100644 --- a/drivers/net/sundance.c +++ b/drivers/net/sundance.c @@ -16,13 +16,89 @@ Support and updates available at http://www.scyld.com/network/sundance.html - [link no longer provides useful info -jgarzik] + + + 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 */ #define DRV_NAME "sundance" -#define DRV_VERSION "1.1" -#define DRV_RELDATE "27-Jun-2006" +#define DRV_VERSION "1.01+LK1.10" +#define DRV_RELDATE "28-Oct-2005" /* The user-configurable values. @@ -30,7 +106,7 @@ static int debug = 1; /* 1 normal messages, 0 quiet .. 7 verbose. */ /* Maximum number of multicast addresses to filter (vs. rx-all-multicast). Typical is a 64 element hash table based on the Ethernet CRC. */ -static const int multicast_filter_limit = 32; +static int multicast_filter_limit = 32; /* Set the copy breakpoint for the copy-only-tiny-frames scheme. Setting to > 1518 effectively disables this feature. @@ -107,7 +183,7 @@ static char *media[MAX_UNITS]; #endif /* These identify the driver base version and may not be removed. */ -static char version[] = +static char version[] __devinitdata = 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"; @@ -204,15 +280,14 @@ IVc. Errata #define USE_IO_OPS 1 #endif -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 }, - { } +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}, + {0,} }; MODULE_DEVICE_TABLE(pci, sundance_pci_tbl); @@ -223,15 +298,14 @@ enum { struct pci_id_info { const char *name; }; -static const struct pci_id_info pci_id_tbl[] __devinitdata = { +static struct pci_id_info pci_id_tbl[] = { {"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"}, {"Sundance Technology Alta"}, - {"IC Plus Corporation IP100A FAST Ethernet Adapter"}, - { } /* terminate list. */ + {NULL,}, /* 0 terminated list. */ }; /* This driver was written to use PCI memory space, however x86-oriented @@ -559,13 +633,9 @@ static int __devinit sundance_probe1 (struct pci_dev *pdev, np->phys[0] = 1; /* Default setting */ np->mii_preamble_required++; - /* - * It seems some phys doesn't deal well with address 0 being accessed - * first, so leave address zero to the end of the loop (32 & 31). - */ for (phy = 1; phy <= 32 && phy_idx < MII_CNT; phy++) { + int mii_status = mdio_read(dev, phy, MII_BMSR); int phyx = phy & 0x1f; - int mii_status = mdio_read(dev, phyx, MII_BMSR); if (mii_status != 0xffff && mii_status != 0x0000) { np->phys[phy_idx++] = phyx; np->mii_if.advertising = mdio_read(dev, phyx, MII_ADVERTISE); @@ -792,7 +862,7 @@ static int netdev_open(struct net_device *dev) /* Do we need to reset the chip??? */ - i = request_irq(dev->irq, &intr_handler, IRQF_SHARED, dev->name, dev); + i = request_irq(dev->irq, &intr_handler, SA_SHIRQ, dev->name, dev); if (i) return i; diff --git a/drivers/net/sungem.c b/drivers/net/sungem.c index b70bbd748..28ce47a02 100644 --- a/drivers/net/sungem.c +++ b/drivers/net/sungem.c @@ -55,7 +55,6 @@ #include #include #include -#include #include #include @@ -2220,7 +2219,7 @@ static int gem_do_start(struct net_device *dev) spin_unlock_irqrestore(&gp->lock, flags); if (request_irq(gp->pdev->irq, gem_interrupt, - IRQF_SHARED, dev->name, (void *)dev)) { + SA_SHIRQ, dev->name, (void *)dev)) { printk(KERN_ERR "%s: failed to request irq !\n", gp->dev->name); spin_lock_irqsave(&gp->lock, flags); @@ -2285,7 +2284,7 @@ static void gem_reset_task(void *data) { struct gem *gp = (struct gem *) data; - mutex_lock(&gp->pm_mutex); + down(&gp->pm_sem); netif_poll_disable(gp->dev); @@ -2312,7 +2311,7 @@ static void gem_reset_task(void *data) netif_poll_enable(gp->dev); - mutex_unlock(&gp->pm_mutex); + up(&gp->pm_sem); } @@ -2321,14 +2320,14 @@ static int gem_open(struct net_device *dev) struct gem *gp = dev->priv; int rc = 0; - mutex_lock(&gp->pm_mutex); + down(&gp->pm_sem); /* We need the cell enabled */ if (!gp->asleep) rc = gem_do_start(dev); gp->opened = (rc == 0); - mutex_unlock(&gp->pm_mutex); + up(&gp->pm_sem); return rc; } @@ -2341,13 +2340,13 @@ static int gem_close(struct net_device *dev) * our caller (dev_close) already did it for us */ - mutex_lock(&gp->pm_mutex); + down(&gp->pm_sem); gp->opened = 0; if (!gp->asleep) gem_do_stop(dev, 0); - mutex_unlock(&gp->pm_mutex); + up(&gp->pm_sem); return 0; } @@ -2359,7 +2358,7 @@ static int gem_suspend(struct pci_dev *pdev, pm_message_t state) struct gem *gp = dev->priv; unsigned long flags; - mutex_lock(&gp->pm_mutex); + down(&gp->pm_sem); netif_poll_disable(dev); @@ -2392,11 +2391,11 @@ static int gem_suspend(struct pci_dev *pdev, pm_message_t state) /* Stop the link timer */ del_timer_sync(&gp->link_timer); - /* Now we release the mutex to not block the reset task who + /* Now we release the semaphore to not block the reset task who * can take it too. We are marked asleep, so there will be no * conflict here */ - mutex_unlock(&gp->pm_mutex); + up(&gp->pm_sem); /* Wait for a pending reset task to complete */ while (gp->reset_task_pending) @@ -2425,7 +2424,7 @@ static int gem_resume(struct pci_dev *pdev) printk(KERN_INFO "%s: resuming\n", dev->name); - mutex_lock(&gp->pm_mutex); + down(&gp->pm_sem); /* Keep the cell enabled during the entire operation, no need to * take a lock here tho since nothing else can happen while we are @@ -2441,7 +2440,7 @@ static int gem_resume(struct pci_dev *pdev) * still asleep, a new sleep cycle may bring it back */ gem_put_cell(gp); - mutex_unlock(&gp->pm_mutex); + up(&gp->pm_sem); return 0; } pci_set_master(gp->pdev); @@ -2487,7 +2486,7 @@ static int gem_resume(struct pci_dev *pdev) netif_poll_enable(dev); - mutex_unlock(&gp->pm_mutex); + up(&gp->pm_sem); return 0; } @@ -2592,7 +2591,7 @@ static int gem_change_mtu(struct net_device *dev, int new_mtu) return 0; } - mutex_lock(&gp->pm_mutex); + down(&gp->pm_sem); spin_lock_irq(&gp->lock); spin_lock(&gp->tx_lock); dev->mtu = new_mtu; @@ -2603,7 +2602,7 @@ static int gem_change_mtu(struct net_device *dev, int new_mtu) } spin_unlock(&gp->tx_lock); spin_unlock_irq(&gp->lock); - mutex_unlock(&gp->pm_mutex); + up(&gp->pm_sem); return 0; } @@ -2772,10 +2771,10 @@ static int gem_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) int rc = -EOPNOTSUPP; unsigned long flags; - /* Hold the PM mutex while doing ioctl's or we may collide + /* Hold the PM semaphore while doing ioctl's or we may collide * with power management. */ - mutex_lock(&gp->pm_mutex); + down(&gp->pm_sem); spin_lock_irqsave(&gp->lock, flags); gem_get_cell(gp); @@ -2813,7 +2812,7 @@ static int gem_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) gem_put_cell(gp); spin_unlock_irqrestore(&gp->lock, flags); - mutex_unlock(&gp->pm_mutex); + up(&gp->pm_sem); return rc; } @@ -2880,20 +2879,17 @@ 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 use_idprom = 1; + int node = -1; if (pcp != NULL) { - 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); - } + 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; } - if (use_idprom) + if (node == -1) memcpy(dev->dev_addr, idprom->id_ethaddr, 6); #elif defined(CONFIG_PPC_PMAC) unsigned char *addr; @@ -3037,7 +3033,7 @@ static int __devinit gem_init_one(struct pci_dev *pdev, spin_lock_init(&gp->lock); spin_lock_init(&gp->tx_lock); - mutex_init(&gp->pm_mutex); + init_MUTEX(&gp->pm_sem); init_timer(&gp->link_timer); gp->link_timer.function = gem_link_timer; diff --git a/drivers/net/sungem.h b/drivers/net/sungem.h index 89847215d..13006d759 100644 --- a/drivers/net/sungem.h +++ b/drivers/net/sungem.h @@ -980,15 +980,15 @@ struct gem { int tx_new, tx_old; unsigned int has_wol : 1; /* chip supports wake-on-lan */ - unsigned int asleep : 1; /* chip asleep, protected by pm_mutex */ + unsigned int asleep : 1; /* chip asleep, protected by pm_sem */ unsigned int asleep_wol : 1; /* was asleep with WOL enabled */ - unsigned int opened : 1; /* driver opened, protected by pm_mutex */ + unsigned int opened : 1; /* driver opened, protected by pm_sem */ unsigned int running : 1; /* chip running, protected by lock */ /* cell enable count, protected by lock */ int cell_enabled; - struct mutex pm_mutex; + struct semaphore pm_sem; u32 msg_enable; u32 status; diff --git a/drivers/net/sungem_phy.c b/drivers/net/sungem_phy.c index 278c7cb22..d3ddb41d6 100644 --- a/drivers/net/sungem_phy.c +++ b/drivers/net/sungem_phy.c @@ -19,6 +19,7 @@ * of darwin, still need to reverse engineer that */ +#include #include @@ -38,7 +39,7 @@ #include "sungem_phy.h" /* Link modes of the BCM5400 PHY */ -static const int phy_BCM5400_link_table[8][3] = { +static int phy_BCM5400_link_table[8][3] = { { 0, 0, 0 }, /* No link */ { 0, 0, 0 }, /* 10BT Half Duplex */ { 1, 0, 0 }, /* 10BT Full Duplex */ @@ -274,7 +275,7 @@ static int bcm5411_init(struct mii_phy* phy) return 0; } -static int generic_suspend(struct mii_phy* phy) +static int bcm5411_suspend(struct mii_phy* phy) { phy_write(phy, MII_BMCR, BMCR_PDOWN); @@ -328,30 +329,6 @@ static int bcm5421_init(struct mii_phy* phy) return 0; } -static int bcm5421_enable_fiber(struct mii_phy* phy) -{ - /* enable fiber mode */ - phy_write(phy, MII_NCONFIG, 0x9020); - /* LEDs active in both modes, autosense prio = fiber */ - phy_write(phy, MII_NCONFIG, 0x945f); - - /* switch off fibre autoneg */ - phy_write(phy, MII_NCONFIG, 0xfc01); - phy_write(phy, 0x0b, 0x0004); - - return 0; -} - -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_BMCR, 0x0140); - - return 0; -} - static int bcm54xx_setup_aneg(struct mii_phy *phy, u32 advertise) { u16 ctl, adv; @@ -761,7 +738,7 @@ static struct mii_phy_def bcm5401_phy_def = { /* Broadcom BCM 5411 */ static struct mii_phy_ops bcm5411_phy_ops = { .init = bcm5411_init, - .suspend = generic_suspend, + .suspend = bcm5411_suspend, .setup_aneg = bcm54xx_setup_aneg, .setup_forced = bcm54xx_setup_forced, .poll_link = genmii_poll_link, @@ -780,12 +757,11 @@ static struct mii_phy_def bcm5411_phy_def = { /* Broadcom BCM 5421 */ static struct mii_phy_ops bcm5421_phy_ops = { .init = bcm5421_init, - .suspend = generic_suspend, + .suspend = bcm5411_suspend, .setup_aneg = bcm54xx_setup_aneg, .setup_forced = bcm54xx_setup_forced, .poll_link = genmii_poll_link, .read_link = bcm54xx_read_link, - .enable_fiber = bcm5421_enable_fiber, }; static struct mii_phy_def bcm5421_phy_def = { @@ -800,7 +776,7 @@ static struct mii_phy_def bcm5421_phy_def = { /* Broadcom BCM 5421 built-in K2 */ static struct mii_phy_ops bcm5421k2_phy_ops = { .init = bcm5421_init, - .suspend = generic_suspend, + .suspend = bcm5411_suspend, .setup_aneg = bcm54xx_setup_aneg, .setup_forced = bcm54xx_setup_forced, .poll_link = genmii_poll_link, @@ -816,29 +792,10 @@ static struct mii_phy_def bcm5421k2_phy_def = { .ops = &bcm5421k2_phy_ops }; -static struct mii_phy_ops bcm5461_phy_ops = { - .init = bcm5421_init, - .suspend = generic_suspend, - .setup_aneg = bcm54xx_setup_aneg, - .setup_forced = bcm54xx_setup_forced, - .poll_link = genmii_poll_link, - .read_link = bcm54xx_read_link, - .enable_fiber = bcm5461_enable_fiber, -}; - -static struct mii_phy_def bcm5461_phy_def = { - .phy_id = 0x002060c0, - .phy_id_mask = 0xfffffff0, - .name = "BCM5461", - .features = MII_GBIT_FEATURES, - .magic_aneg = 1, - .ops = &bcm5461_phy_ops -}; - /* Broadcom BCM 5462 built-in Vesta */ static struct mii_phy_ops bcm5462V_phy_ops = { .init = bcm5421_init, - .suspend = generic_suspend, + .suspend = bcm5411_suspend, .setup_aneg = bcm54xx_setup_aneg, .setup_forced = bcm54xx_setup_forced, .poll_link = genmii_poll_link, @@ -859,7 +816,6 @@ static struct mii_phy_def bcm5462V_phy_def = { * would be useful here) --BenH. */ static struct mii_phy_ops marvell_phy_ops = { - .suspend = generic_suspend, .setup_aneg = marvell_setup_aneg, .setup_forced = marvell_setup_forced, .poll_link = genmii_poll_link, @@ -900,7 +856,6 @@ static struct mii_phy_def* mii_phy_table[] = { &bcm5411_phy_def, &bcm5421_phy_def, &bcm5421k2_phy_def, - &bcm5461_phy_def, &bcm5462V_phy_def, &marvell_phy_def, &genmii_phy_def, diff --git a/drivers/net/sungem_phy.h b/drivers/net/sungem_phy.h index 69e125197..430544496 100644 --- a/drivers/net/sungem_phy.h +++ b/drivers/net/sungem_phy.h @@ -12,7 +12,6 @@ struct mii_phy_ops int (*setup_forced)(struct mii_phy *phy, int speed, int fd); int (*poll_link)(struct mii_phy *phy); int (*read_link)(struct mii_phy *phy); - int (*enable_fiber)(struct mii_phy *phy); }; /* Structure used to statically define an mii/gii based PHY */ diff --git a/drivers/net/sunhme.c b/drivers/net/sunhme.c index 3bbf0c80b..9f046cae2 100644 --- a/drivers/net/sunhme.c +++ b/drivers/net/sunhme.c @@ -1,9 +1,9 @@ -/* sunhme.c: Sparc HME/BigMac 10/100baseT half/full duplex auto switching, +/* $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, * auto carrier detecting ethernet driver. Also known as the * "Happy Meal Ethernet" found on SunSwift SBUS cards. * - * Copyright (C) 1996, 1998, 1999, 2002, 2003, - 2006 David S. Miller (davem@davemloft.net) + * Copyright (C) 1996, 1998, 1999, 2002, 2003 David S. Miller (davem@redhat.com) * * Changes : * 2000/11/11 Willy Tarreau @@ -13,6 +13,7 @@ * argument : macaddr=0x00,0x10,0x20,0x30,0x40,0x50 */ +#include #include #include #include @@ -39,13 +40,15 @@ #include #include -#ifdef CONFIG_SPARC +#ifdef __sparc__ #include #include #include #include -#include #include +#ifndef __sparc_v9__ +#include +#endif #endif #include @@ -54,7 +57,7 @@ #ifdef CONFIG_PCI #include -#ifdef CONFIG_SPARC +#ifdef __sparc__ #include #endif #endif @@ -62,9 +65,9 @@ #include "sunhme.h" #define DRV_NAME "sunhme" -#define DRV_VERSION "3.00" -#define DRV_RELDATE "June 23, 2006" -#define DRV_AUTHOR "David S. Miller (davem@davemloft.net)" +#define DRV_VERSION "2.02" +#define DRV_RELDATE "8/24/03" +#define DRV_AUTHOR "David S. Miller (davem@redhat.com)" static char version[] = DRV_NAME ".c:v" DRV_VERSION " " DRV_RELDATE " " DRV_AUTHOR "\n"; @@ -80,6 +83,8 @@ 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 @@ -176,6 +181,26 @@ 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 @@ -1585,7 +1610,7 @@ static int happy_meal_init(struct happy_meal *hp) HMD(("happy_meal_init: old[%08x] bursts<", hme_read32(hp, gregs + GREG_CFG))); -#ifndef CONFIG_SPARC +#ifndef __sparc__ /* It is always PCI and can handle 64byte bursts. */ hme_write32(hp, gregs + GREG_CFG, GREG_CFG_BURST64); #else @@ -1622,7 +1647,7 @@ static int happy_meal_init(struct happy_meal *hp) HMD(("XXX>")); hme_write32(hp, gregs + GREG_CFG, 0); } -#endif /* CONFIG_SPARC */ +#endif /* __sparc__ */ /* Turn off interrupts we do not want to hear. */ HMD((", enable global interrupts, ")); @@ -2194,10 +2219,15 @@ 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, - IRQF_SHARED, dev->name, (void *)dev)) { + SA_SHIRQ, 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; } @@ -2522,7 +2552,7 @@ static struct ethtool_ops hme_ethtool_ops = { static int hme_version_printed; #ifdef CONFIG_SBUS -void __devinit quattro_get_ranges(struct quattro *qp) +void __init quattro_get_ranges(struct quattro *qp) { struct sbus_dev *sdev = qp->quattro_dev; int err; @@ -2538,7 +2568,7 @@ void __devinit quattro_get_ranges(struct quattro *qp) qp->nranges = (err / sizeof(struct linux_prom_ranges)); } -static void __devinit quattro_apply_ranges(struct quattro *qp, struct happy_meal *hp) +static void __init quattro_apply_ranges(struct quattro *qp, struct happy_meal *hp) { struct sbus_dev *sdev = hp->happy_dev; int rng; @@ -2565,12 +2595,16 @@ static void __devinit quattro_apply_ranges(struct quattro *qp, struct happy_meal * * Return NULL on failure. */ -static struct quattro * __devinit quattro_sbus_find(struct sbus_dev *goal_sdev) +static struct quattro * __init 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); @@ -2579,7 +2613,17 @@ static struct quattro * __devinit 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; @@ -2608,7 +2652,7 @@ static void __init quattro_sbus_register_irqs(void) err = request_irq(sdev->irqs[0], quattro_sbus_interrupt, - IRQF_SHARED, "Quattro", + SA_SHIRQ, "Quattro", qp); if (err != 0) { printk(KERN_ERR "Quattro: Fatal IRQ registery error %d.\n", err); @@ -2616,17 +2660,6 @@ 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 @@ -2661,9 +2694,8 @@ static struct quattro * __init quattro_pci_find(struct pci_dev *pdev) #endif /* CONFIG_PCI */ #ifdef CONFIG_SBUS -static int __devinit happy_meal_sbus_probe_one(struct sbus_dev *sdev, int is_qfe) +static int __init happy_meal_sbus_init(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; @@ -2686,7 +2718,6 @@ static int __devinit happy_meal_sbus_probe_one(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); @@ -2702,16 +2733,13 @@ static int __devinit happy_meal_sbus_probe_one(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 { - 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); + memcpy(dev->dev_addr, idprom->id_ethaddr, 6); } hp = dev->priv; @@ -2722,8 +2750,9 @@ static int __devinit happy_meal_sbus_probe_one(struct sbus_dev *sdev, int is_qfe err = -ENODEV; if (sdev->num_registers != 5) { - printk(KERN_ERR "happymeal: Device needs 5 regs, has %d.\n", + printk(KERN_ERR "happymeal: Device does not have 5 regs, it 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; } @@ -2737,39 +2766,39 @@ static int __devinit happy_meal_sbus_probe_one(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 global registers.\n"); + printk(KERN_ERR "happymeal: Cannot map Happy Meal 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 MAC TX registers.\n"); + printk(KERN_ERR "happymeal: Cannot map Happy Meal MAC Transmit 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 MAC RX registers.\n"); + printk(KERN_ERR "happymeal: Cannot map Happy Meal MAC Receive 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 BIGMAC registers.\n"); + printk(KERN_ERR "happymeal: Cannot map Happy Meal 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 TCVR registers.\n"); + printk(KERN_ERR "happymeal: Cannot map Happy Meal Tranceiver registers.\n"); goto err_out_iounmap; } - hp->hm_revision = of_getintprop_default(dp, "hm-rev", 0xff); + hp->hm_revision = prom_getintdefault(sdev->prom_node, "hm-rev", 0xff); if (hp->hm_revision == 0xff) hp->hm_revision = 0xa0; @@ -2783,8 +2812,8 @@ static int __devinit happy_meal_sbus_probe_one(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 = of_getintprop_default(sdev->bus->ofdev.node, - "burst-sizes", 0x00); + hp->happy_bursts = prom_getintdefault(sdev->bus->prom_node, + "burst-sizes", 0x00); hp->happy_block = sbus_alloc_consistent(hp->happy_dev, PAGE_SIZE, @@ -2847,8 +2876,6 @@ static int __devinit happy_meal_sbus_probe_one(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); @@ -2861,6 +2888,12 @@ static int __devinit happy_meal_sbus_probe_one(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: @@ -2890,7 +2923,7 @@ err_out: #endif #ifdef CONFIG_PCI -#ifndef CONFIG_SPARC +#ifndef __sparc__ static int is_quattro_p(struct pci_dev *pdev) { struct pci_dev *busdev = pdev->bus->self; @@ -2978,14 +3011,14 @@ static void get_hme_mac_nonsparc(struct pci_dev *pdev, unsigned char *dev_addr) get_random_bytes(&dev_addr[3], 3); return; } -#endif /* !(CONFIG_SPARC) */ +#endif /* !(__sparc__) */ -static int __devinit happy_meal_pci_probe(struct pci_dev *pdev, - const struct pci_device_id *ent) +static int __init happy_meal_pci_init(struct pci_dev *pdev) { struct quattro *qp = NULL; -#ifdef CONFIG_SPARC +#ifdef __sparc__ struct pcidev_cookie *pcp; + int node; #endif struct happy_meal *hp; struct net_device *dev; @@ -2996,14 +3029,15 @@ static int __devinit happy_meal_pci_probe(struct pci_dev *pdev, int err; /* Now make sure pci_dev cookie is there. */ -#ifdef CONFIG_SPARC +#ifdef __sparc__ pcp = pdev->sysdata; - if (pcp == NULL) { + if (pcp == NULL || pcp->prom_node == -1) { printk(KERN_ERR "happymeal(PCI): Some PCI device info missing\n"); return -ENODEV; } + node = pcp->prom_node; - strcpy(prom_name, pcp->prom_node->name); + prom_getstring(node, "name", prom_name, sizeof(prom_name)); #else if (is_quattro_p(pdev)) strcpy(prom_name, "SUNW,qfe"); @@ -3012,11 +3046,6 @@ static int __devinit happy_meal_pci_probe(struct pci_dev *pdev, #endif err = -ENODEV; - - if (pci_enable_device(pdev)) - goto err_out; - pci_set_master(pdev); - if (!strcmp(prom_name, "SUNW,qfe") || !strcmp(prom_name, "qfe")) { qp = quattro_pci_find(pdev); if (qp == NULL) @@ -3079,15 +3108,11 @@ static int __devinit happy_meal_pci_probe(struct pci_dev *pdev, dev->dev_addr[i] = macaddr[i]; macaddr[5]++; } else { -#ifdef CONFIG_SPARC - unsigned char *addr; - int len; - +#ifdef __sparc__ if (qfe_slot != -1 && - (addr = of_get_property(pcp->prom_node, - "local-mac-address", &len)) != NULL - && len == 6) { - memcpy(dev->dev_addr, addr, 6); + prom_getproplen(node, "local-mac-address") == 6) { + prom_getproperty(node, "local-mac-address", + dev->dev_addr, 6); } else { memcpy(dev->dev_addr, idprom->id_ethaddr, 6); } @@ -3103,8 +3128,8 @@ static int __devinit happy_meal_pci_probe(struct pci_dev *pdev, hp->bigmacregs = (hpreg_base + 0x6000UL); hp->tcvregs = (hpreg_base + 0x7000UL); -#ifdef CONFIG_SPARC - hp->hm_revision = of_getintprop_default(pcp->prom_node, "hm-rev", 0xff); +#ifdef __sparc__ + hp->hm_revision = prom_getintdefault(node, "hm-rev", 0xff); if (hp->hm_revision == 0xff) { unsigned char prev; @@ -3128,7 +3153,7 @@ static int __devinit happy_meal_pci_probe(struct pci_dev *pdev, /* And of course, indicate this is PCI. */ hp->happy_flags |= HFLAG_PCI; -#ifdef CONFIG_SPARC +#ifdef __sparc__ /* Assume PCI happy meals can handle all burst sizes. */ hp->happy_bursts = DMA_BURSTBITS; #endif @@ -3191,8 +3216,6 @@ static int __devinit happy_meal_pci_probe(struct pci_dev *pdev, goto err_out_iounmap; } - dev_set_drvdata(&pdev->dev, hp); - if (!qfe_slot) { struct pci_dev *qpdev = qp->quattro_dev; @@ -3222,6 +3245,12 @@ static int __devinit happy_meal_pci_probe(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: @@ -3239,141 +3268,136 @@ err_out_clear_quattro: err_out: return err; } +#endif -static void __devexit happy_meal_pci_remove(struct pci_dev *pdev) -{ - 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); -} - -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) -{ - return pci_register_driver(&hme_pci_driver); -} - -static void happy_meal_pci_exit(void) +#ifdef CONFIG_SBUS +static int __init happy_meal_sbus_probe(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; + 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; } - #endif -#ifdef CONFIG_SBUS -static int __devinit hme_sbus_probe(struct of_device *dev, const struct of_device_id *match) +#ifdef CONFIG_PCI +static int __init happy_meal_pci_probe(void) { - 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); - - if (!is_qfe && model && !strcmp(model, "SUNW,sbus-qfe")) - is_qfe = 1; + struct pci_dev *pdev = NULL; + int cards = 0; - return happy_meal_sbus_probe_one(sdev, is_qfe); + 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); + } + return cards; } +#endif -static int __devexit hme_sbus_remove(struct of_device *dev) +static int __init happy_meal_probe(void) { - struct happy_meal *hp = dev_get_drvdata(&dev->dev); - struct net_device *net_dev = hp->dev; - - unregister_netdevice(net_dev); + static int called = 0; + int cards; - /* XXX qfe parent interrupt... */ + root_happy_dev = NULL; - 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); + if (called) + return -ENODEV; + called++; + 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, - }, - {}, -}; -MODULE_DEVICE_TABLE(of, hme_sbus_match); +static void __exit happy_meal_cleanup_module(void) +{ +#ifdef CONFIG_SBUS + struct quattro *last_seen_qfe = NULL; +#endif -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), -}; + 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 int __init happy_meal_sbus_init(void) -{ - int err; + /* Unregister netdev before unmapping registers as this + * call can end up trying to access those registers. + */ + unregister_netdev(dev); - err = of_register_driver(&hme_sbus_driver, &sbus_bus_type); - if (!err) - quattro_sbus_register_irqs(); +#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; + } + } - return err; -} + 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); -static void happy_meal_sbus_exit(void) -{ - of_unregister_driver(&hme_sbus_driver); - quattro_sbus_free_irqs(); + root_happy_dev = next; + } + /* Now cleanup the quattro lists. */ +#ifdef CONFIG_SBUS while (qfe_sbus_list) { struct quattro *qfe = qfe_sbus_list; struct quattro *next = qfe->next; @@ -3382,39 +3406,18 @@ static void happy_meal_sbus_exit(void) qfe_sbus_list = next; } -} -#endif - -static int __init happy_meal_probe(void) -{ - int err = 0; - -#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; -} + while (qfe_pci_list) { + struct quattro *qfe = qfe_pci_list; + struct quattro *next = qfe->next; + kfree(qfe); -static void __exit happy_meal_exit(void) -{ -#ifdef CONFIG_SBUS - happy_meal_sbus_exit(); -#endif -#ifdef CONFIG_PCI - happy_meal_pci_exit(); + qfe_pci_list = next; + } #endif } module_init(happy_meal_probe); -module_exit(happy_meal_exit); +module_exit(happy_meal_cleanup_module); diff --git a/drivers/net/sunhme.h b/drivers/net/sunhme.h index 90f446db9..34e9f953c 100644 --- a/drivers/net/sunhme.h +++ b/drivers/net/sunhme.h @@ -8,6 +8,7 @@ #ifndef _SUNHME_H #define _SUNHME_H +#include #include /* Happy Meal global registers. */ @@ -460,6 +461,7 @@ 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 ec0413609..b7d87d469 100644 --- a/drivers/net/sunlance.c +++ b/drivers/net/sunlance.c @@ -71,6 +71,7 @@ static char lancestr[] = "LANCE"; +#include #include #include #include @@ -265,6 +266,7 @@ 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; }; @@ -296,6 +298,8 @@ 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) { @@ -930,9 +934,9 @@ static int lance_open(struct net_device *dev) STOP_LANCE(lp); - if (request_irq(dev->irq, &lance_interrupt, IRQF_SHARED, + if (request_irq(dev->irq, &lance_interrupt, SA_SHIRQ, lancestr, (void *) dev)) { - printk(KERN_ERR "Lance: Can't get irq %d\n", dev->irq); + printk(KERN_ERR "Lance: Can't get irq %s\n", __irq_itoa(dev->irq)); return -EAGAIN; } @@ -1323,9 +1327,9 @@ static struct ethtool_ops sparc_lance_ethtool_ops = { .get_link = sparc_lance_get_link, }; -static int __init sparc_lance_probe_one(struct sbus_dev *sdev, - struct sbus_dma *ledma, - struct sbus_dev *lebuffer) +static int __init sparc_lance_init(struct sbus_dev *sdev, + struct sbus_dma *ledma, + struct sbus_dev *lebuffer) { static unsigned version_printed; struct net_device *dev; @@ -1469,7 +1473,6 @@ 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; @@ -1497,7 +1500,8 @@ no_link_test: goto fail; } - dev_set_drvdata(&sdev->ofdev.dev, lp); + lp->next_module = root_lance_dev; + root_lance_dev = lp; printk(KERN_INFO "%s: LANCE ", dev->name); @@ -1532,107 +1536,88 @@ static inline struct sbus_dma *find_ledma(struct sbus_dev *sdev) #include /* Find all the lance cards on the system and initialize them */ -static struct sbus_dev sun4_sdev; -static int __init sparc_lance_init(void) +static int __init sparc_lance_probe(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(&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); + 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); } 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 */ -static int __devinit sunlance_sbus_probe(struct of_device *dev, const struct of_device_id *match) -{ - 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; -} - -static int __devexit sunlance_sbus_remove(struct of_device *dev) -{ - struct lance_private *lp = dev_get_drvdata(&dev->dev); - struct net_device *net_dev = lp->dev; - - unregister_netdevice(net_dev); - - 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) +static int __init sparc_lance_probe(void) { - return of_register_driver(&sunlance_sbus_driver, &sbus_bus_type); + 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; } #endif /* !CONFIG_SUN4 */ -static void __exit sparc_lance_exit(void) +static void __exit sparc_lance_cleanup(void) { -#ifdef CONFIG_SUN4 - sunlance_sun4_remove(); -#else - of_unregister_driver(&sunlance_sbus_driver); -#endif + struct lance_private *lp; + + while (root_lance_dev) { + lp = root_lance_dev->next_module; + + unregister_netdev(root_lance_dev->dev); + lance_free_hwresources(root_lance_dev); + free_netdev(root_lance_dev->dev); + root_lance_dev = lp; + } } -module_init(sparc_lance_init); -module_exit(sparc_lance_exit); +module_init(sparc_lance_probe); +module_exit(sparc_lance_cleanup); diff --git a/drivers/net/sunqe.c b/drivers/net/sunqe.c index 817a40b66..1f2323be6 100644 --- a/drivers/net/sunqe.c +++ b/drivers/net/sunqe.c @@ -1,9 +1,10 @@ -/* sunqe.c: Sparc QuadEthernet 10baseT SBUS card driver. +/* $Id: sunqe.c,v 1.55 2002/01/15 06:48:55 davem Exp $ + * 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, 2006 David S. Miller (davem@davemloft.net) + * Copyright (C) 1996, 1999, 2003 David S. Miller (davem@redhat.com) */ #include @@ -40,9 +41,9 @@ #include "sunqe.h" #define DRV_NAME "sunqe" -#define DRV_VERSION "4.0" -#define DRV_RELDATE "June 23, 2006" -#define DRV_AUTHOR "David S. Miller (davem@davemloft.net)" +#define DRV_VERSION "3.0" +#define DRV_RELDATE "8/24/03" +#define DRV_AUTHOR "David S. Miller (davem@redhat.com)" static char version[] = DRV_NAME ".c:v" DRV_VERSION " " DRV_RELDATE " " DRV_AUTHOR "\n"; @@ -754,269 +755,298 @@ static inline void qec_init_once(struct sunqec *qecp, struct sbus_dev *qsdev) qecp->gregs + GLOB_RSIZE); } -static u8 __init qec_get_burst(struct device_node *dp) +/* Four QE's per QEC card. */ +static int __init qec_ether_init(struct net_device *dev, struct sbus_dev *sdev) { + 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; - /* 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); + for (i = 0; i < 4; i++) { + qe_devs[i] = alloc_etherdev(sizeof(struct sunqe)); + if (!qe_devs[i]) + goto out; + } - if (bsizes_more != 0xff) - bsizes &= bsizes_more; - if (bsizes == 0xff || (bsizes & DMA_BURST16) == 0 || - (bsizes & DMA_BURST32)==0) - bsizes = (DMA_BURST32 - 1); + if (version_printed++ == 0) + printk(KERN_INFO "%s", version); - return bsizes; -} + 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); + } -static struct sunqec * __init get_qec(struct sbus_dev *child_sdev) -{ - struct sbus_dev *qec_sdev = child_sdev->parent; - struct sunqec *qecp; + qecp = kmalloc(sizeof(struct sunqec), GFP_KERNEL); + if (qecp == NULL) + goto out1; + qecp->qec_sdev = sdev; - for (qecp = root_qec_dev; qecp; qecp = qecp->next_module) { - if (qecp->qec_sdev == qec_sdev) - break; + for (i = 0; i < 4; i++) { + qecp->qes[i] = qeps[i]; + qeps[i]->dev = qe_devs[i]; + qeps[i]->parent = qecp; } - 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; - } - if (qec_global_reset(qecp->gregs)) - goto fail; + res = -ENODEV; - qecp->qec_bursts = qec_get_burst(qec_sdev->ofdev.node); + 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; + } - qec_init_once(qecp, qec_sdev); + for (i = 0; i < 4; i++) + qeps[i]->qe_sdev = qesdevs[i]; - 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; - } + /* 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; + } - qecp->next_module = root_qec_dev; - root_qec_dev = qecp; - } + /* 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; } - return qecp; + /* Reset the QEC. */ + if (qec_global_reset(qecp->gregs)) + goto out3; -fail: - if (qecp->gregs) - sbus_iounmap(qecp->gregs, GLOB_REG_SIZE); - kfree(qecp); - return NULL; -} + /* 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); -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; + if (bsizes_more != 0xff) + bsizes &= bsizes_more; + if (bsizes == 0xff || (bsizes & DMA_BURST16) == 0 || + (bsizes & DMA_BURST32)==0) + bsizes = (DMA_BURST32 - 1); - if (version_printed++ == 0) - printk(KERN_INFO "%s", version); + qecp->qec_bursts = bsizes; - dev = alloc_etherdev(sizeof(struct sunqe)); - if (!dev) - return -ENOMEM; + /* 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; + } - qe = netdev_priv(dev); + /* 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; + } - 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++; + 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; } + + /* Stop this QE. */ + qe_stop(qe); } - qe->channel = i; - spin_lock_init(&qe->lock); - - res = -ENODEV; - qecp = get_qec(sdev); - if (!qecp) - goto fail; - qecp->qes[qe->channel] = qe; - qe->dev = dev; - qe->parent = qecp; - qe->qe_sdev = sdev; + 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; + } - 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; + /* 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; } - 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; + for (i = 0; i < 4; i++) { + if (register_netdev(qe_devs[i]) != 0) + goto out5; } - 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"); + /* 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"); + } + /* 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; -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); - +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]); return res; } -static int __devinit qec_sbus_probe(struct of_device *dev, const struct of_device_id *match) +static int __init qec_match(struct sbus_dev *sdev) { - struct sbus_dev *sdev = to_sbus_device(&dev->dev); - - return qec_ether_init(sdev); -} - -static int __devexit qec_sbus_remove(struct of_device *dev) -{ - 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); + struct sbus_dev *sibling; + int i; - dev_set_drvdata(&dev->dev, NULL); + if (strcmp(sdev->prom_name, "qec") != 0) + return 0; - return 0; + /* 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; } -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) +static int __init qec_probe(void) { - return of_register_driver(&qec_sbus_driver, &sbus_bus_type); + 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; + return 0; } -static void __exit qec_exit(void) +static void __exit qec_cleanup(void) { - of_unregister_driver(&qec_sbus_driver); + struct sunqec *next_qec; + int i; while (root_qec_dev) { - struct sunqec *next = root_qec_dev->next_module; - - free_irq(root_qec_dev->qec_sdev->irqs[0], - (void *) 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); sbus_iounmap(root_qec_dev->gregs, GLOB_REG_SIZE); - kfree(root_qec_dev); - - root_qec_dev = next; + root_qec_dev = next_qec; } } -module_init(qec_init); -module_exit(qec_exit); +module_init(qec_probe); +module_exit(qec_cleanup); diff --git a/drivers/net/tc35815.c b/drivers/net/tc35815.c index 8b53ded66..c2ec9fd8c 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, IRQF_SHARED, cardname, dev)) { + request_irq(dev->irq, &tc35815_interrupt, SA_SHIRQ, cardname, dev)) { return -EAGAIN; } diff --git a/drivers/net/tg3.c b/drivers/net/tg3.c index fa620aeb7..6d638361d 100644 --- a/drivers/net/tg3.c +++ b/drivers/net/tg3.c @@ -15,6 +15,7 @@ * notice is accompanying it. */ +#include #include #include @@ -68,8 +69,8 @@ #define DRV_MODULE_NAME "tg3" #define PFX DRV_MODULE_NAME ": " -#define DRV_MODULE_VERSION "3.65" -#define DRV_MODULE_RELDATE "August 07, 2006" +#define DRV_MODULE_VERSION "3.49" +#define DRV_MODULE_RELDATE "Feb 2, 2006" #define TG3_DEF_MAC_MODE 0 #define TG3_DEF_RX_MODE 0 @@ -123,6 +124,9 @@ 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) @@ -217,28 +221,10 @@ 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_5753F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, - { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5754, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, - { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5754M, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, - { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5755, - 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, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5714, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, - { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5714S, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5715, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, - { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5715S, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5780, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5780S, @@ -495,40 +481,33 @@ static void tg3_write_mem(struct tg3 *tp, u32 off, u32 val) unsigned long flags; spin_lock_irqsave(&tp->indirect_lock, flags); - if (tp->tg3_flags & TG3_FLAG_SRAM_USE_CONFIG) { - pci_write_config_dword(tp->pdev, TG3PCI_MEM_WIN_BASE_ADDR, off); - pci_write_config_dword(tp->pdev, TG3PCI_MEM_WIN_DATA, val); - - /* Always leave this as zero. */ - pci_write_config_dword(tp->pdev, TG3PCI_MEM_WIN_BASE_ADDR, 0); - } else { - tw32_f(TG3PCI_MEM_WIN_BASE_ADDR, off); - tw32_f(TG3PCI_MEM_WIN_DATA, val); + pci_write_config_dword(tp->pdev, TG3PCI_MEM_WIN_BASE_ADDR, off); + pci_write_config_dword(tp->pdev, TG3PCI_MEM_WIN_DATA, val); - /* Always leave this as zero. */ - tw32_f(TG3PCI_MEM_WIN_BASE_ADDR, 0); - } + /* Always leave this as zero. */ + pci_write_config_dword(tp->pdev, TG3PCI_MEM_WIN_BASE_ADDR, 0); spin_unlock_irqrestore(&tp->indirect_lock, flags); } +static void tg3_write_mem_fast(struct tg3 *tp, u32 off, u32 val) +{ + /* If no workaround is needed, write to mem space directly */ + if (tp->write32 != tg3_write_indirect_reg32) + tw32(NIC_SRAM_WIN_BASE + off, val); + else + tg3_write_mem(tp, off, val); +} + static void tg3_read_mem(struct tg3 *tp, u32 off, u32 *val) { unsigned long flags; spin_lock_irqsave(&tp->indirect_lock, flags); - if (tp->tg3_flags & TG3_FLAG_SRAM_USE_CONFIG) { - pci_write_config_dword(tp->pdev, TG3PCI_MEM_WIN_BASE_ADDR, off); - pci_read_config_dword(tp->pdev, TG3PCI_MEM_WIN_DATA, val); - - /* Always leave this as zero. */ - pci_write_config_dword(tp->pdev, TG3PCI_MEM_WIN_BASE_ADDR, 0); - } else { - tw32_f(TG3PCI_MEM_WIN_BASE_ADDR, off); - *val = tr32(TG3PCI_MEM_WIN_DATA); + pci_write_config_dword(tp->pdev, TG3PCI_MEM_WIN_BASE_ADDR, off); + pci_read_config_dword(tp->pdev, TG3PCI_MEM_WIN_DATA, val); - /* Always leave this as zero. */ - tw32_f(TG3PCI_MEM_WIN_BASE_ADDR, 0); - } + /* Always leave this as zero. */ + pci_write_config_dword(tp->pdev, TG3PCI_MEM_WIN_BASE_ADDR, 0); spin_unlock_irqrestore(&tp->indirect_lock, flags); } @@ -555,9 +534,6 @@ static void tg3_enable_ints(struct tg3 *tp) (tp->misc_host_ctrl & ~MISC_HOST_CTRL_MASK_PCI_INT)); tw32_mailbox_f(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW, (tp->last_tag << 24)); - if (tp->tg3_flags2 & TG3_FLG2_1SHOT_MSI) - tw32_mailbox_f(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW, - (tp->last_tag << 24)); tg3_cond_int(tp); } @@ -972,8 +948,6 @@ static int tg3_phy_reset_5703_4_5(struct tg3 *tp) return err; } -static void tg3_link_report(struct tg3 *); - /* This will reset the tigon3 PHY if there is no valid * link unless the FORCE argument is non-zero. */ @@ -987,11 +961,6 @@ static int tg3_phy_reset(struct tg3 *tp) if (err != 0) return -EBUSY; - if (netif_running(tp->dev) && netif_carrier_ok(tp->dev)) { - netif_carrier_off(tp->dev); - tg3_link_report(tp); - } - if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5703 || GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704 || GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705) { @@ -1028,12 +997,6 @@ out: tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x14e2); tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x0400); } - else if (tp->tg3_flags2 & TG3_FLG2_PHY_JITTER_BUG) { - tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x0c00); - tg3_writephy(tp, MII_TG3_DSP_ADDRESS, 0x000a); - tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x010b); - tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x0400); - } /* Set Extended packet length bit (bit 14) on all chips that */ /* support jumbo frames */ if ((tp->phy_id & PHY_ID_MASK) == PHY_ID_BCM5401) { @@ -1075,11 +1038,9 @@ static void tg3_frob_aux_power(struct tg3 *tp) struct net_device *dev_peer; dev_peer = pci_get_drvdata(tp->pdev_peer); - /* remove_one() may have been run on the peer. */ if (!dev_peer) - tp_peer = tp; - else - tp_peer = netdev_priv(dev_peer); + BUG(); + tp_peer = netdev_priv(dev_peer); } if ((tp->tg3_flags & TG3_FLAG_WOL_ENABLE) != 0 || @@ -1170,20 +1131,7 @@ static int tg3_halt_cpu(struct tg3 *, u32); static int tg3_nvram_lock(struct tg3 *); static void tg3_nvram_unlock(struct tg3 *); -static void tg3_power_down_phy(struct tg3 *tp) -{ - /* The PHY should not be powered down on some chips because - * of bugs. - */ - if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700 || - GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704 || - (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5780 && - (tp->tg3_flags2 & TG3_FLG2_MII_SERDES))) - return; - tg3_writephy(tp, MII_BMCR, BMCR_PDOWN); -} - -static int tg3_set_power_state(struct tg3 *tp, pci_power_t state) +static int tg3_set_power_state(struct tg3 *tp, int state) { u32 misc_host_ctrl; u16 power_control, power_caps; @@ -1202,7 +1150,7 @@ static int tg3_set_power_state(struct tg3 *tp, pci_power_t state) power_control |= PCI_PM_CTRL_PME_STATUS; power_control &= ~(PCI_PM_CTRL_STATE_MASK); switch (state) { - case PCI_D0: + case 0: power_control |= 0; pci_write_config_word(tp->pdev, pm + PCI_PM_CTRL, @@ -1215,15 +1163,15 @@ static int tg3_set_power_state(struct tg3 *tp, pci_power_t state) return 0; - case PCI_D1: + case 1: power_control |= 1; break; - case PCI_D2: + case 2: power_control |= 2; break; - case PCI_D3hot: + case 3: power_control |= 3; break; @@ -1362,7 +1310,8 @@ static int tg3_set_power_state(struct tg3 *tp, pci_power_t state) tg3_writephy(tp, MII_TG3_EXT_CTRL, MII_TG3_EXT_CTRL_FORCE_LED_OFF); tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x01b2); - tg3_power_down_phy(tp); + if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5700) + tg3_writephy(tp, MII_BMCR, BMCR_PDOWN); } } @@ -1385,12 +1334,12 @@ static int tg3_set_power_state(struct tg3 *tp, pci_power_t state) } } - tg3_write_sig_post_reset(tp, RESET_KIND_SHUTDOWN); - /* Finally, set the new power state. */ pci_write_config_word(tp->pdev, pm + PCI_PM_CTRL, power_control); udelay(100); /* Delay after power state change */ + tg3_write_sig_post_reset(tp, RESET_KIND_SHUTDOWN); + return 0; } @@ -2731,12 +2680,6 @@ static int tg3_setup_fiber_mii_phy(struct tg3 *tp, int force_reset) err |= tg3_readphy(tp, MII_BMSR, &bmsr); err |= tg3_readphy(tp, MII_BMSR, &bmsr); - if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5714) { - if (tr32(MAC_TX_STATUS) & TX_STATUS_LINK_UP) - bmsr |= BMSR_LSTATUS; - else - bmsr &= ~BMSR_LSTATUS; - } err |= tg3_readphy(tp, MII_BMCR, &bmcr); @@ -2805,13 +2748,6 @@ static int tg3_setup_fiber_mii_phy(struct tg3 *tp, int force_reset) bmcr = new_bmcr; err |= tg3_readphy(tp, MII_BMSR, &bmsr); err |= tg3_readphy(tp, MII_BMSR, &bmsr); - if (GET_ASIC_REV(tp->pci_chip_rev_id) == - ASIC_REV_5714) { - if (tr32(MAC_TX_STATUS) & TX_STATUS_LINK_UP) - bmsr |= BMSR_LSTATUS; - else - bmsr &= ~BMSR_LSTATUS; - } tp->tg3_flags2 &= ~TG3_FLG2_PARALLEL_DETECT; } } @@ -2963,34 +2899,6 @@ 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. @@ -3003,12 +2911,10 @@ 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, tx_bug = 0; + int i; - if (unlikely(skb == NULL)) { - tg3_tx_recover(tp); - return; - } + if (unlikely(skb == NULL)) + BUG(); pci_unmap_single(tp->pdev, pci_unmap_addr(ri, mapping), @@ -3020,9 +2926,12 @@ static void tg3_tx(struct tg3 *tp) sw_idx = NEXT_TX(sw_idx); for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) { + if (unlikely(sw_idx == hw_idx)) + BUG(); + ri = &tp->tx_buffers[sw_idx]; - if (unlikely(ri->skb != NULL || sw_idx == hw_idx)) - tx_bug = 1; + if (unlikely(ri->skb != NULL)) + BUG(); pci_unmap_page(tp->pdev, pci_unmap_addr(ri, mapping), @@ -3033,29 +2942,16 @@ 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; - /* 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 (unlikely(netif_queue_stopped(tp->dev))) { + spin_lock(&tp->tx_lock); if (netif_queue_stopped(tp->dev) && - (tg3_tx_avail(tp) > TG3_TX_WAKEUP_THRESH)) + (TX_BUFFS_AVAIL(tp) > TG3_TX_WAKEUP_THRESH)) netif_wake_queue(tp->dev); - netif_tx_unlock(tp->dev); + spin_unlock(&tp->tx_lock); } } @@ -3109,10 +3005,11 @@ 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 = netdev_alloc_skb(tp->dev, skb_size); + skb = dev_alloc_skb(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, @@ -3205,7 +3102,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, rx_std_posted = 0; + u32 work_mask; u32 sw_idx = tp->rx_rcb_ptr; u16 hw_idx; int received; @@ -3232,7 +3129,6 @@ 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); @@ -3281,10 +3177,11 @@ static int tg3_rx(struct tg3 *tp, int budget) tg3_recycle_rx(tp, opaque_key, desc_idx, *post_ptr); - copy_skb = netdev_alloc_skb(tp->dev, len + 2); + copy_skb = dev_alloc_skb(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); @@ -3319,15 +3216,6 @@ 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); @@ -3381,11 +3269,6 @@ 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. @@ -3446,30 +3329,15 @@ 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); } -/* One-shot MSI handler - Chip automatically disables interrupt - * after sending MSI so driver doesn't have to do it. - */ -static irqreturn_t tg3_msi_1shot(int irq, void *dev_id, struct pt_regs *regs) -{ - struct net_device *dev = dev_id; - struct tg3 *tp = netdev_priv(dev); - - prefetch(tp->hw_status); - prefetch(&tp->rx_rcb[tp->rx_rcb_ptr]); - - if (likely(!tg3_irq_sync(tp))) - netif_rx_schedule(dev); /* schedule NAPI poll */ - - return IRQ_HANDLED; -} - /* MSI ISR - No need to check for interrupt sharing and no need to * flush status block and interrupt mailbox. PCI ordering rules * guarantee that MSI will arrive after the status block. @@ -3597,31 +3465,9 @@ static irqreturn_t tg3_test_isr(int irq, void *dev_id, return IRQ_RETVAL(0); } -static int tg3_init_hw(struct tg3 *, int); +static int tg3_init_hw(struct tg3 *); 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) { @@ -3654,23 +3500,14 @@ 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); - if (tg3_init_hw(tp, 1)) - goto out; + tg3_init_hw(tp); 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); @@ -3700,7 +3537,7 @@ static inline int tg3_40bit_overflow_test(struct tg3 *tp, dma_addr_t mapping, int len) { #if defined(CONFIG_HIGHMEM) && (BITS_PER_LONG == 64) - if (tp->tg3_flags & TG3_FLAG_40BIT_DMA_BUG) + if (tp->tg3_flags2 & TG3_FLG2_5780_CLASS) return (((u64) mapping + len) > DMA_40BIT_MASK); return 0; #else @@ -3791,170 +3628,7 @@ static void tg3_set_txd(struct tg3 *tp, int entry, txd->vlan_tag = vlan_tag << TXD_VLAN_TAG_SHIFT; } -/* hard_start_xmit for devices that don't have any bugs and - * support TG3_FLG2_HW_TSO_2 only. - */ static int tg3_start_xmit(struct sk_buff *skb, struct net_device *dev) -{ - struct tg3 *tp = netdev_priv(dev); - dma_addr_t mapping; - u32 len, entry, base_flags, mss; - - len = skb_headlen(skb); - - /* 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 (unlikely(tg3_tx_avail(tp) <= (skb_shinfo(skb)->nr_frags + 1))) { - if (!netif_queue_stopped(dev)) { - netif_stop_queue(dev); - - /* This is a hard error, log it. */ - printk(KERN_ERR PFX "%s: BUG! Tx Ring full when " - "queue awake!\n", dev->name); - } - return NETDEV_TX_BUSY; - } - - entry = tp->tx_prod; - base_flags = 0; -#if TG3_TSO_SUPPORT != 0 - mss = 0; - if (skb->len > (tp->dev->mtu + ETH_HLEN) && - (mss = skb_shinfo(skb)->gso_size) != 0) { - int tcp_opt_len, ip_tcp_len; - - if (skb_header_cloned(skb) && - pskb_expand_head(skb, 0, 0, GFP_ATOMIC)) { - dev_kfree_skb(skb); - goto out_unlock; - } - - 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->h.th->check = 0; - - } - else if (skb->ip_summed == CHECKSUM_HW) - base_flags |= TXD_FLAG_TCPUDP_CSUM; -#else - mss = 0; - if (skb->ip_summed == CHECKSUM_HW) - base_flags |= TXD_FLAG_TCPUDP_CSUM; -#endif -#if TG3_VLAN_TAG_USED - if (tp->vlgrp != NULL && vlan_tx_tag_present(skb)) - base_flags |= (TXD_FLAG_VLAN | - (vlan_tx_tag_get(skb) << 16)); -#endif - - /* Queue skb data, a.k.a. the main skb fragment. */ - mapping = pci_map_single(tp->pdev, skb->data, len, PCI_DMA_TODEVICE); - - tp->tx_buffers[entry].skb = skb; - pci_unmap_addr_set(&tp->tx_buffers[entry], mapping, mapping); - - tg3_set_txd(tp, entry, mapping, len, base_flags, - (skb_shinfo(skb)->nr_frags == 0) | (mss << 1)); - - entry = NEXT_TX(entry); - - /* Now loop through additional data fragments, and queue them. */ - if (skb_shinfo(skb)->nr_frags > 0) { - unsigned int i, last; - - last = skb_shinfo(skb)->nr_frags - 1; - for (i = 0; i <= last; i++) { - skb_frag_t *frag = &skb_shinfo(skb)->frags[i]; - - len = frag->size; - mapping = pci_map_page(tp->pdev, - frag->page, - frag->page_offset, - len, PCI_DMA_TODEVICE); - - tp->tx_buffers[entry].skb = NULL; - pci_unmap_addr_set(&tp->tx_buffers[entry], mapping, mapping); - - tg3_set_txd(tp, entry, mapping, len, - base_flags, (i == last) | (mss << 1)); - - entry = NEXT_TX(entry); - } - } - - /* Packets are ready, update Tx producer idx local and on card. */ - tw32_tx_mbox((MAILBOX_SNDHOST_PROD_IDX_0 + TG3_64BIT_REG_LOW), entry); - - tp->tx_prod = entry; - if (unlikely(tg3_tx_avail(tp) <= (MAX_SKB_FRAGS + 1))) { - netif_stop_queue(dev); - if (tg3_tx_avail(tp) > TG3_TX_WAKEUP_THRESH) - netif_wake_queue(tp->dev); - } - -out_unlock: - mmiowb(); - - 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. - */ -static int tg3_start_xmit_dma_bug(struct sk_buff *skb, struct net_device *dev) { struct tg3 *tp = netdev_priv(dev); dma_addr_t mapping; @@ -3963,12 +3637,15 @@ static int tg3_start_xmit_dma_bug(struct sk_buff *skb, struct net_device *dev) len = skb_headlen(skb); - /* We are running in BH disabled context with netif_tx_lock - * and TX reclaim runs via tp->poll inside of a software + /* 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 * interrupt. Furthermore, IRQ processing runs lockless so we have * no IRQ context deadlocks to worry about either. Rejoice! */ - if (unlikely(tg3_tx_avail(tp) <= (skb_shinfo(skb)->nr_frags + 1))) { + if (!spin_trylock(&tp->tx_lock)) + return NETDEV_TX_LOCKED; + + if (unlikely(TX_BUFFS_AVAIL(tp) <= (skb_shinfo(skb)->nr_frags + 1))) { if (!netif_queue_stopped(dev)) { netif_stop_queue(dev); @@ -3976,6 +3653,7 @@ 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; } @@ -3986,8 +3664,8 @@ static int tg3_start_xmit_dma_bug(struct sk_buff *skb, struct net_device *dev) #if TG3_TSO_SUPPORT != 0 mss = 0; if (skb->len > (tp->dev->mtu + ETH_HLEN) && - (mss = skb_shinfo(skb)->gso_size) != 0) { - int tcp_opt_len, ip_tcp_len, hdr_len; + (mss = skb_shinfo(skb)->tso_size) != 0) { + int tcp_opt_len, ip_tcp_len; if (skb_header_cloned(skb) && pskb_expand_head(skb, 0, 0, GFP_ATOMIC)) { @@ -3998,16 +3676,11 @@ 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 + hdr_len); + skb->nh.iph->tot_len = htons(mss + ip_tcp_len + tcp_opt_len); if (tp->tg3_flags2 & TG3_FLG2_HW_TSO) { skb->h.th->check = 0; base_flags &= ~TXD_FLAG_TCPUDP_CSUM; @@ -4118,14 +3791,15 @@ 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 (unlikely(tg3_tx_avail(tp) <= (MAX_SKB_FRAGS + 1))) { + if (TX_BUFFS_AVAIL(tp) <= (MAX_SKB_FRAGS + 1)) { netif_stop_queue(dev); - if (tg3_tx_avail(tp) > TG3_TX_WAKEUP_THRESH) + if (TX_BUFFS_AVAIL(tp) > TG3_TX_WAKEUP_THRESH) netif_wake_queue(tp->dev); } out_unlock: mmiowb(); + spin_unlock(&tp->tx_lock); dev->trans_start = jiffies; @@ -4154,7 +3828,6 @@ 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; @@ -4175,14 +3848,13 @@ static int tg3_change_mtu(struct net_device *dev, int new_mtu) tg3_set_mtu(dev, tp, new_mtu); - err = tg3_restart_hw(tp, 0); + tg3_init_hw(tp); - if (!err) - tg3_netif_start(tp); + tg3_netif_start(tp); tg3_full_unlock(tp); - return err; + return 0; } /* Free up pending packets in all rx/tx rings. @@ -4264,7 +3936,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 int tg3_init_rings(struct tg3 *tp) +static void tg3_init_rings(struct tg3 *tp) { u32 i; @@ -4313,38 +3985,18 @@ static int 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) { - 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; + if (tg3_alloc_rx_skb(tp, RXD_OPAQUE_RING_STD, + -1, i) < 0) 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) { - 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; + -1, i) < 0) break; - } } } - return 0; } /* @@ -4626,8 +4278,9 @@ static void tg3_disable_nvram_access(struct tg3 *tp) /* tp->lock is held. */ static void tg3_write_sig_pre_reset(struct tg3 *tp, int kind) { - tg3_write_mem(tp, NIC_SRAM_FIRMWARE_MBOX, - NIC_SRAM_FIRMWARE_MBOX_MAGIC1); + if (!(tp->tg3_flags2 & TG3_FLG2_SUN_570X)) + tg3_write_mem(tp, NIC_SRAM_FIRMWARE_MBOX, + NIC_SRAM_FIRMWARE_MBOX_MAGIC1); if (tp->tg3_flags2 & TG3_FLG2_ASF_NEW_HANDSHAKE) { switch (kind) { @@ -4708,17 +4361,13 @@ static int tg3_chip_reset(struct tg3 *tp) void (*write_op)(struct tg3 *, u32, u32); int i; - tg3_nvram_lock(tp); - - /* No matching tg3_nvram_unlock() after this because - * chip reset below will undo the nvram lock. - */ - tp->nvram_lock_cnt = 0; - - if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5752 || - GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755 || - GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787) - tw32(GRC_FASTBOOT_PC, 0); + if (!(tp->tg3_flags2 & TG3_FLG2_SUN_570X)) { + tg3_nvram_lock(tp); + /* No matching tg3_nvram_unlock() after this because + * chip reset below will undo the nvram lock. + */ + tp->nvram_lock_cnt = 0; + } /* * We must avoid the readl() that normally takes place. @@ -4866,25 +4515,20 @@ static int tg3_chip_reset(struct tg3 *tp) tw32_f(MAC_MODE, 0); udelay(40); - /* Wait for firmware initialization to complete. */ - for (i = 0; i < 100000; i++) { - tg3_read_mem(tp, NIC_SRAM_FIRMWARE_MBOX, &val); - if (val == ~NIC_SRAM_FIRMWARE_MBOX_MAGIC1) - break; - udelay(10); - } - - /* Chip might not be fitted with firmare. Some Sun onboard - * parts are configured like that. So don't signal the timeout - * of the above loop as an error, but do report the lack of - * running firmware once. - */ - if (i >= 100000 && - !(tp->tg3_flags2 & TG3_FLG2_NO_FWARE_REPORTED)) { - tp->tg3_flags2 |= TG3_FLG2_NO_FWARE_REPORTED; - - printk(KERN_INFO PFX "%s: No firmware running.\n", - tp->dev->name); + if (!(tp->tg3_flags2 & TG3_FLG2_SUN_570X)) { + /* Wait for firmware initialization to complete. */ + for (i = 0; i < 100000; i++) { + tg3_read_mem(tp, NIC_SRAM_FIRMWARE_MBOX, &val); + if (val == ~NIC_SRAM_FIRMWARE_MBOX_MAGIC1) + break; + udelay(10); + } + if (i >= 100000) { + printk(KERN_ERR PFX "tg3_reset_hw timed out for %s, " + "firmware will not restart magic=%08x\n", + tp->dev->name, val); + return -ENODEV; + } } if ((tp->tg3_flags2 & TG3_FLG2_PCI_EXPRESS) && @@ -5088,8 +4732,9 @@ static int tg3_halt_cpu(struct tg3 *tp, u32 offset) { int i; - BUG_ON(offset == TX_CPU_BASE && - (tp->tg3_flags2 & TG3_FLG2_5705_PLUS)); + if (offset == TX_CPU_BASE && + (tp->tg3_flags2 & TG3_FLG2_5705_PLUS)) + BUG(); if (offset == RX_CPU_BASE) { for (i = 0; i < 10000; i++) { @@ -5867,35 +5512,17 @@ 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; memcpy(dev->dev_addr, addr->sa_data, dev->addr_len); - if (!netif_running(dev)) - return 0; - - if (tp->tg3_flags & TG3_FLAG_ENABLE_ASF) { - /* Reset chip so that ASF can re-init any MAC addresses it - * needs. - */ - tg3_netif_stop(tp); - tg3_full_lock(tp, 1); - - tg3_halt(tp, RESET_KIND_SHUTDOWN, 1); - err = tg3_restart_hw(tp, 0); - if (!err) - tg3_netif_start(tp); - tg3_full_unlock(tp); - } else { - spin_lock_bh(&tp->lock); - __tg3_set_mac_addr(tp); - spin_unlock_bh(&tp->lock); - } + spin_lock_bh(&tp->lock); + __tg3_set_mac_addr(tp); + spin_unlock_bh(&tp->lock); - return err; + return 0; } /* tp->lock is held. */ @@ -5943,7 +5570,7 @@ static void __tg3_set_coalesce(struct tg3 *tp, struct ethtool_coalesce *ec) } /* tp->lock is held. */ -static int tg3_reset_hw(struct tg3 *tp, int reset_phy) +static int tg3_reset_hw(struct tg3 *tp) { u32 val, rdmac_mode; int i, err, limit; @@ -5958,9 +5585,6 @@ static int tg3_reset_hw(struct tg3 *tp, int reset_phy) tg3_abort_hw(tp, 1); } - if ((tp->tg3_flags2 & TG3_FLG2_MII_SERDES) && reset_phy) - tg3_phy_reset(tp); - err = tg3_chip_reset(tp); if (err) return err; @@ -5995,9 +5619,7 @@ static int tg3_reset_hw(struct tg3 *tp, int reset_phy) * can only do this after the hardware has been * successfully reset. */ - err = tg3_init_rings(tp); - if (err) - return err; + tg3_init_rings(tp); /* This value is determined during the probe time DMA * engine test, tg3_test_dma. @@ -6009,14 +5631,10 @@ static int tg3_reset_hw(struct tg3 *tp, int reset_phy) GRC_MODE_NO_TX_PHDR_CSUM | GRC_MODE_NO_RX_PHDR_CSUM); tp->grc_mode |= GRC_MODE_HOST_SENDBDS; - - /* Pseudo-header checksum is done by hardware logic and not - * the offload processers, so make the chip do the pseudo- - * header checksums on receive. For transmit it is more - * convenient to do the pseudo-header checksum in software - * as Linux does that on transmit for us in all cases. - */ - tp->grc_mode |= GRC_MODE_NO_TX_PHDR_CSUM; + if (tp->tg3_flags & TG3_FLAG_NO_TX_PSEUDO_CSUM) + tp->grc_mode |= GRC_MODE_NO_TX_PHDR_CSUM; + if (tp->tg3_flags & TG3_FLAG_NO_RX_PSEUDO_CSUM) + tp->grc_mode |= GRC_MODE_NO_RX_PHDR_CSUM; tw32(GRC_MODE, tp->grc_mode | @@ -6090,13 +5708,7 @@ static int tg3_reset_hw(struct tg3 *tp, int reset_phy) } /* Setup replenish threshold. */ - 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); + tw32(RCVBDI_STD_THRESH, tp->rx_pending / 8); /* Initialize TG3_BDINFO's at: * RCVDBDI_STD_BD: standard eth size rx ring @@ -6256,12 +5868,8 @@ static int tg3_reset_hw(struct tg3 *tp, int reset_phy) #endif /* Receive/send statistics. */ - 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)) { + 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); @@ -6347,9 +5955,6 @@ static int tg3_reset_hw(struct tg3 *tp, int reset_phy) gpio_mask |= GRC_LCLCTRL_GPIO_OE3 | GRC_LCLCTRL_GPIO_OUTPUT3; - if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755) - gpio_mask |= GRC_LCLCTRL_GPIO_UART_SEL; - tp->grc_local_ctrl |= tr32(GRC_LOCAL_CTRL) & gpio_mask; /* GPIO1 must be driven high for eeprom write protect */ @@ -6388,11 +5993,6 @@ static int tg3_reset_hw(struct tg3 *tp, int reset_phy) } } - /* Enable host coalescing bug fix */ - if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755) || - (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787)) - val |= (1 << 29); - tw32_f(WDMAC_MODE, val); udelay(40); @@ -6448,9 +6048,6 @@ static int tg3_reset_hw(struct tg3 *tp, int reset_phy) udelay(100); tp->rx_mode = RX_MODE_ENABLE; - if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755) - tp->rx_mode |= RX_MODE_IPV6_CSUM_ENABLE; - tw32_f(MAC_RX_MODE, tp->rx_mode); udelay(10); @@ -6500,18 +6097,7 @@ static int tg3_reset_hw(struct tg3 *tp, int reset_phy) tp->tg3_flags2 |= TG3_FLG2_HW_AUTONEG; } - if ((tp->tg3_flags2 & TG3_FLG2_MII_SERDES) && - (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5714)) { - u32 tmp; - - tmp = tr32(SERDES_RX_CTRL); - tw32(SERDES_RX_CTRL, tmp | SERDES_RX_SIG_DETECT); - tp->grc_local_ctrl &= ~GRC_LCLCTRL_USE_EXT_SIG_DETECT; - tp->grc_local_ctrl |= GRC_LCLCTRL_USE_SIG_DETECT; - tw32(GRC_LOCAL_CTRL, tp->grc_local_ctrl); - } - - err = tg3_setup_phy(tp, reset_phy); + err = tg3_setup_phy(tp, 1); if (err) return err; @@ -6584,12 +6170,12 @@ static int tg3_reset_hw(struct tg3 *tp, int reset_phy) /* Called at device open time to get the chip ready for * packet processing. Invoked with tp->lock held. */ -static int tg3_init_hw(struct tg3 *tp, int reset_phy) +static int tg3_init_hw(struct tg3 *tp) { int err; /* Force the chip into D0. */ - err = tg3_set_power_state(tp, PCI_D0); + err = tg3_set_power_state(tp, 0); if (err) goto out; @@ -6597,7 +6183,7 @@ static int tg3_init_hw(struct tg3 *tp, int reset_phy) tw32(TG3PCI_MEM_WIN_BASE_ADDR, 0); - err = tg3_reset_hw(tp, reset_phy); + err = tg3_reset_hw(tp); out: return err; @@ -6645,19 +6231,12 @@ static void tg3_periodic_fetch_stats(struct tg3 *tp) TG3_STAT_ADD32(&sp->rx_frame_too_long_errors, MAC_RX_STATS_FRAME_TOO_LONG); TG3_STAT_ADD32(&sp->rx_jabbers, MAC_RX_STATS_JABBERS); TG3_STAT_ADD32(&sp->rx_undersize_packets, MAC_RX_STATS_UNDERSIZE); - - TG3_STAT_ADD32(&sp->rxbds_empty, RCVLPC_NO_RCV_BD_CNT); - TG3_STAT_ADD32(&sp->rx_discards, RCVLPC_IN_DISCARDS_CNT); - TG3_STAT_ADD32(&sp->rx_errors, RCVLPC_IN_ERRORS_CNT); } static void tg3_timer(unsigned long __opaque) { struct tg3 *tp = (struct tg3 *) __opaque; - if (tp->irq_sync) - goto restart_timer; - spin_lock(&tp->lock); if (!(tp->tg3_flags & TG3_FLAG_TAGGED_STATUS)) { @@ -6734,11 +6313,11 @@ static void tg3_timer(unsigned long __opaque) if (tp->tg3_flags & TG3_FLAG_ENABLE_ASF) { u32 val; - tg3_write_mem(tp, NIC_SRAM_FW_CMD_MBOX, - FWCMD_NICDRV_ALIVE2); - tg3_write_mem(tp, NIC_SRAM_FW_CMD_LEN_MBOX, 4); + tg3_write_mem_fast(tp, NIC_SRAM_FW_CMD_MBOX, + FWCMD_NICDRV_ALIVE2); + tg3_write_mem_fast(tp, NIC_SRAM_FW_CMD_LEN_MBOX, 4); /* 5 seconds timeout */ - tg3_write_mem(tp, NIC_SRAM_FW_CMD_DATA_MBOX, 5); + tg3_write_mem_fast(tp, NIC_SRAM_FW_CMD_DATA_MBOX, 5); val = tr32(GRC_RX_CPU_EVENT); val |= (1 << 14); tw32(GRC_RX_CPU_EVENT, val); @@ -6748,31 +6327,10 @@ static void tg3_timer(unsigned long __opaque) spin_unlock(&tp->lock); -restart_timer: tp->timer.expires = jiffies + tp->timer_offset; add_timer(&tp->timer); } -static int tg3_request_irq(struct tg3 *tp) -{ - irqreturn_t (*fn)(int, void *, struct pt_regs *); - unsigned long flags; - struct net_device *dev = tp->dev; - - if (tp->tg3_flags2 & TG3_FLG2_USING_MSI) { - fn = tg3_msi; - if (tp->tg3_flags2 & TG3_FLG2_1SHOT_MSI) - fn = tg3_msi_1shot; - flags = IRQF_SAMPLE_RANDOM; - } else { - fn = tg3_interrupt; - if (tp->tg3_flags & TG3_FLAG_TAGGED_STATUS) - fn = tg3_interrupt_tagged; - flags = IRQF_SHARED | IRQF_SAMPLE_RANDOM; - } - return (request_irq(tp->pdev->irq, fn, flags, dev->name, dev)); -} - static int tg3_test_interrupt(struct tg3 *tp) { struct net_device *dev = tp->dev; @@ -6787,7 +6345,7 @@ static int tg3_test_interrupt(struct tg3 *tp) free_irq(tp->pdev->irq, dev); err = request_irq(tp->pdev->irq, tg3_test_isr, - IRQF_SHARED | IRQF_SAMPLE_RANDOM, dev->name, dev); + SA_SHIRQ | SA_SAMPLE_RANDOM, dev->name, dev); if (err) return err; @@ -6809,7 +6367,16 @@ static int tg3_test_interrupt(struct tg3 *tp) free_irq(tp->pdev->irq, dev); - err = tg3_request_irq(tp); + if (tp->tg3_flags2 & TG3_FLG2_USING_MSI) + err = request_irq(tp->pdev->irq, tg3_msi, + SA_SAMPLE_RANDOM, dev->name, dev); + else { + irqreturn_t (*fn)(int, void *, struct pt_regs *)=tg3_interrupt; + if (tp->tg3_flags & TG3_FLAG_TAGGED_STATUS) + fn = tg3_interrupt_tagged; + err = request_irq(tp->pdev->irq, fn, + SA_SHIRQ | SA_SAMPLE_RANDOM, dev->name, dev); + } if (err) return err; @@ -6861,7 +6428,14 @@ static int tg3_test_msi(struct tg3 *tp) tp->tg3_flags2 &= ~TG3_FLG2_USING_MSI; - err = tg3_request_irq(tp); + { + irqreturn_t (*fn)(int, void *, struct pt_regs *)=tg3_interrupt; + if (tp->tg3_flags & TG3_FLAG_TAGGED_STATUS) + fn = tg3_interrupt_tagged; + + err = request_irq(tp->pdev->irq, fn, + SA_SHIRQ | SA_SAMPLE_RANDOM, dev->name, dev); + } if (err) return err; @@ -6871,7 +6445,7 @@ static int tg3_test_msi(struct tg3 *tp) tg3_full_lock(tp, 1); tg3_halt(tp, RESET_KIND_SHUTDOWN, 1); - err = tg3_init_hw(tp, 1); + err = tg3_init_hw(tp); tg3_full_unlock(tp); @@ -6888,12 +6462,6 @@ static int tg3_open(struct net_device *dev) tg3_full_lock(tp, 0); - err = tg3_set_power_state(tp, PCI_D0); - if (err) { - tg3_full_unlock(tp); - return err; - } - tg3_disable_ints(tp); tp->tg3_flags &= ~TG3_FLAG_INIT_COMPLETE; @@ -6908,9 +6476,7 @@ static int tg3_open(struct net_device *dev) if ((tp->tg3_flags2 & TG3_FLG2_5750_PLUS) && (GET_CHIP_REV(tp->pci_chip_rev_id) != CHIPREV_5750_AX) && - (GET_CHIP_REV(tp->pci_chip_rev_id) != CHIPREV_5750_BX) && - !((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5714) && - (tp->pdev_peer == tp->pdev))) { + (GET_CHIP_REV(tp->pci_chip_rev_id) != CHIPREV_5750_BX)) { /* All MSI supporting chips should support tagged * status. Assert that this is the case. */ @@ -6925,7 +6491,17 @@ static int tg3_open(struct net_device *dev) tp->tg3_flags2 |= TG3_FLG2_USING_MSI; } } - err = tg3_request_irq(tp); + if (tp->tg3_flags2 & TG3_FLG2_USING_MSI) + err = request_irq(tp->pdev->irq, tg3_msi, + SA_SAMPLE_RANDOM, dev->name, dev); + else { + irqreturn_t (*fn)(int, void *, struct pt_regs *)=tg3_interrupt; + if (tp->tg3_flags & TG3_FLAG_TAGGED_STATUS) + fn = tg3_interrupt_tagged; + + err = request_irq(tp->pdev->irq, fn, + SA_SHIRQ | SA_SAMPLE_RANDOM, dev->name, dev); + } if (err) { if (tp->tg3_flags2 & TG3_FLG2_USING_MSI) { @@ -6938,7 +6514,7 @@ static int tg3_open(struct net_device *dev) tg3_full_lock(tp, 0); - err = tg3_init_hw(tp, 1); + err = tg3_init_hw(tp); if (err) { tg3_halt(tp, RESET_KIND_SHUTDOWN, 1); tg3_free_rings(tp); @@ -6990,14 +6566,6 @@ static int tg3_open(struct net_device *dev) return err; } - - if (tp->tg3_flags2 & TG3_FLG2_USING_MSI) { - if (tp->tg3_flags2 & TG3_FLG2_1SHOT_MSI) { - u32 val = tr32(0x7c04); - - tw32(0x7c04, val | (1 << 29)); - } - } } tg3_full_lock(tp, 0); @@ -7271,6 +6839,7 @@ static int tg3_close(struct net_device *dev) tp->tg3_flags &= ~(TG3_FLAG_INIT_COMPLETE | TG3_FLAG_GOT_SERDES_FLOWCTL); + netif_carrier_off(tp->dev); tg3_full_unlock(tp); @@ -7287,10 +6856,6 @@ static int tg3_close(struct net_device *dev) tg3_free_consistent(tp); - tg3_set_power_state(tp, PCI_D3hot); - - netif_carrier_off(tp->dev); - return 0; } @@ -7585,9 +7150,6 @@ static void tg3_set_rx_mode(struct net_device *dev) { struct tg3 *tp = netdev_priv(dev); - if (!netif_running(dev)) - return; - tg3_full_lock(tp, 0); __tg3_set_rx_mode(dev); tg3_full_unlock(tp); @@ -7612,9 +7174,6 @@ static void tg3_get_regs(struct net_device *dev, memset(p, 0, TG3_REGDUMP_LEN); - if (tp->link_config.phy_is_low_power) - return; - tg3_full_lock(tp, 0); #define __GET_REG32(reg) (*(p)++ = tr32(reg)) @@ -7681,7 +7240,6 @@ static int tg3_get_eeprom_len(struct net_device *dev) } static int tg3_nvram_read(struct tg3 *tp, u32 offset, u32 *val); -static int tg3_nvram_read_swab(struct tg3 *tp, u32 offset, u32 *val); static int tg3_get_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom, u8 *data) { @@ -7690,9 +7248,6 @@ static int tg3_get_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom, u8 *pd; u32 i, offset, len, val, b_offset, b_count; - if (tp->link_config.phy_is_low_power) - return -EAGAIN; - offset = eeprom->offset; len = eeprom->len; eeprom->len = 0; @@ -7754,9 +7309,6 @@ static int tg3_set_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom, u32 offset, len, b_offset, odd_len, start, end; u8 *buf; - if (tp->link_config.phy_is_low_power) - return -EAGAIN; - if (eeprom->magic != TG3_EEPROM_MAGIC) return -EINVAL; @@ -7892,7 +7444,6 @@ static void tg3_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info strcpy(info->driver, DRV_MODULE_NAME); strcpy(info->version, DRV_MODULE_VERSION); - strcpy(info->fw_version, tp->fw_ver); strcpy(info->bus_info, pci_name(tp->pdev)); } @@ -7950,12 +7501,6 @@ 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 @@ -7993,27 +7538,18 @@ static void tg3_get_ringparam(struct net_device *dev, struct ethtool_ringparam * ering->rx_max_pending = TG3_RX_RING_SIZE - 1; ering->rx_mini_max_pending = 0; - if (tp->tg3_flags & TG3_FLAG_JUMBO_RING_ENABLE) - ering->rx_jumbo_max_pending = TG3_RX_JUMBO_RING_SIZE - 1; - else - ering->rx_jumbo_max_pending = 0; - - ering->tx_max_pending = TG3_TX_RING_SIZE - 1; + ering->rx_jumbo_max_pending = TG3_RX_JUMBO_RING_SIZE - 1; ering->rx_pending = tp->rx_pending; ering->rx_mini_pending = 0; - if (tp->tg3_flags & TG3_FLAG_JUMBO_RING_ENABLE) - ering->rx_jumbo_pending = tp->rx_jumbo_pending; - else - ering->rx_jumbo_pending = 0; - + ering->rx_jumbo_pending = tp->rx_jumbo_pending; ering->tx_pending = tp->tx_pending; } static int tg3_set_ringparam(struct net_device *dev, struct ethtool_ringparam *ering) { struct tg3 *tp = netdev_priv(dev); - int irq_sync = 0, err = 0; + int irq_sync = 0; if ((ering->rx_pending > TG3_RX_RING_SIZE - 1) || (ering->rx_jumbo_pending > TG3_RX_JUMBO_RING_SIZE - 1) || @@ -8037,14 +7573,13 @@ static int tg3_set_ringparam(struct net_device *dev, struct ethtool_ringparam *e if (netif_running(dev)) { tg3_halt(tp, RESET_KIND_SHUTDOWN, 1); - err = tg3_restart_hw(tp, 1); - if (!err) - tg3_netif_start(tp); + tg3_init_hw(tp); + tg3_netif_start(tp); } tg3_full_unlock(tp); - return err; + return 0; } static void tg3_get_pauseparam(struct net_device *dev, struct ethtool_pauseparam *epause) @@ -8059,7 +7594,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, err = 0; + int irq_sync = 0; if (netif_running(dev)) { tg3_netif_stop(tp); @@ -8083,14 +7618,13 @@ static int tg3_set_pauseparam(struct net_device *dev, struct ethtool_pauseparam if (netif_running(dev)) { tg3_halt(tp, RESET_KIND_SHUTDOWN, 1); - err = tg3_restart_hw(tp, 1); - if (!err) - tg3_netif_start(tp); + tg3_init_hw(tp); + tg3_netif_start(tp); } tg3_full_unlock(tp); - return err; + return 0; } static u32 tg3_get_rx_csum(struct net_device *dev) @@ -8129,11 +7663,10 @@ static int tg3_set_tx_csum(struct net_device *dev, u32 data) return 0; } - if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755 || - GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787) - ethtool_op_set_tx_hw_csum(dev, data); + if (data) + dev->features |= NETIF_F_IP_CSUM; else - ethtool_op_set_tx_csum(dev, data); + dev->features &= ~NETIF_F_IP_CSUM; return 0; } @@ -8203,56 +7736,29 @@ static void tg3_get_ethtool_stats (struct net_device *dev, } #define NVRAM_TEST_SIZE 0x100 -#define NVRAM_SELFBOOT_FORMAT1_SIZE 0x14 static int tg3_test_nvram(struct tg3 *tp) { - u32 *buf, csum, magic; - int i, j, err = 0, size; - - if (tg3_nvram_read_swab(tp, 0, &magic) != 0) - return -EIO; + u32 *buf, csum; + int i, j, err = 0; - if (magic == TG3_EEPROM_MAGIC) - size = NVRAM_TEST_SIZE; - else if ((magic & 0xff000000) == 0xa5000000) { - if ((magic & 0xe00000) == 0x200000) - size = NVRAM_SELFBOOT_FORMAT1_SIZE; - else - return 0; - } else - return -EIO; - - buf = kmalloc(size, GFP_KERNEL); + buf = kmalloc(NVRAM_TEST_SIZE, GFP_KERNEL); if (buf == NULL) return -ENOMEM; - err = -EIO; - for (i = 0, j = 0; i < size; i += 4, j++) { + for (i = 0, j = 0; i < NVRAM_TEST_SIZE; i += 4, j++) { u32 val; if ((err = tg3_nvram_read(tp, i, &val)) != 0) break; buf[j] = cpu_to_le32(val); } - if (i < size) + if (i < NVRAM_TEST_SIZE) goto out; - /* Selfboot format */ - if (cpu_to_be32(buf[0]) != TG3_EEPROM_MAGIC) { - u8 *buf8 = (u8 *) buf, csum8 = 0; - - for (i = 0; i < size; i++) - csum8 += buf8[i]; - - if (csum8 == 0) { - err = 0; - goto out; - } - - err = -EIO; + err = -EIO; + if (cpu_to_be32(buf[0]) != TG3_EEPROM_MAGIC) goto out; - } /* Bootstrap checksum at offset 0x10 */ csum = calc_crc((unsigned char *) buf, 0x10); @@ -8512,7 +8018,7 @@ out: static int tg3_do_mem_test(struct tg3 *tp, u32 offset, u32 len) { - static const u32 test_pattern[] = { 0x00000000, 0xffffffff, 0xaa55a55a }; + static u32 test_pattern[] = { 0x00000000, 0xffffffff, 0xaa55a55a }; int i; u32 j; @@ -8546,25 +8052,14 @@ static int tg3_test_memory(struct tg3 *tp) { 0x00008000, 0x02000}, { 0x00010000, 0x0e000}, { 0xffffffff, 0x00000} - }, mem_tbl_5755[] = { - { 0x00000200, 0x00008}, - { 0x00004000, 0x00800}, - { 0x00006000, 0x00800}, - { 0x00008000, 0x02000}, - { 0x00010000, 0x0c000}, - { 0xffffffff, 0x00000} }; struct mem_entry *mem_tbl; int err = 0; int i; - if (tp->tg3_flags2 & TG3_FLG2_5705_PLUS) { - if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755 || - GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787) - mem_tbl = mem_tbl_5755; - else - mem_tbl = mem_tbl_5705; - } else + if (tp->tg3_flags2 & TG3_FLG2_5705_PLUS) + mem_tbl = mem_tbl_5705; + else mem_tbl = mem_tbl_570x; for (i = 0; mem_tbl[i].offset != 0xffffffff; i++) { @@ -8613,11 +8108,8 @@ static int tg3_run_loopback(struct tg3 *tp, int loopback_mode) } mac_mode = (tp->mac_mode & ~MAC_MODE_PORT_MODE_MASK) | MAC_MODE_LINK_POLARITY | MAC_MODE_PORT_MODE_GMII; - if ((tp->phy_id & PHY_ID_MASK) == PHY_ID_BCM5401) { + if ((tp->phy_id & PHY_ID_MASK) == PHY_ID_BCM5401) mac_mode &= ~MAC_MODE_LINK_POLARITY; - tg3_writephy(tp, MII_TG3_EXT_CTRL, - MII_TG3_EXT_CTRL_LNK3_LED_MODE); - } tw32(MAC_MODE, mac_mode); } else @@ -8626,10 +8118,7 @@ static int tg3_run_loopback(struct tg3 *tp, int loopback_mode) err = -EIO; tx_len = 1514; - skb = netdev_alloc_skb(tp->dev, tx_len); - if (!skb) - return -ENOMEM; - + skb = dev_alloc_skb(tx_len); tx_data = skb_put(skb, tx_len); memcpy(tx_data, tp->dev->dev_addr, 6); memset(tx_data + 6, 0x0, 8); @@ -8725,9 +8214,7 @@ static int tg3_test_loopback(struct tg3 *tp) if (!netif_running(tp->dev)) return TG3_LOOPBACK_FAILED; - err = tg3_reset_hw(tp, 1); - if (err) - return TG3_LOOPBACK_FAILED; + tg3_reset_hw(tp); if (tg3_run_loopback(tp, TG3_MAC_LOOPBACK)) err |= TG3_MAC_LOOPBACK_FAILED; @@ -8744,9 +8231,6 @@ static void tg3_self_test(struct net_device *dev, struct ethtool_test *etest, { struct tg3 *tp = netdev_priv(dev); - if (tp->link_config.phy_is_low_power) - tg3_set_power_state(tp, PCI_D0); - memset(data, 0, sizeof(u64) * TG3_NUM_TEST); if (tg3_test_nvram(tp) != 0) { @@ -8775,9 +8259,6 @@ static void tg3_self_test(struct net_device *dev, struct ethtool_test *etest, if (!err) tg3_nvram_unlock(tp); - if (tp->tg3_flags2 & TG3_FLG2_MII_SERDES) - tg3_phy_reset(tp); - if (tg3_test_registers(tp) != 0) { etest->flags |= ETH_TEST_FL_FAILED; data[2] = 1; @@ -8801,15 +8282,12 @@ 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; - if (!tg3_restart_hw(tp, 1)) - tg3_netif_start(tp); + tg3_init_hw(tp); + tg3_netif_start(tp); } tg3_full_unlock(tp); } - if (tp->link_config.phy_is_low_power) - tg3_set_power_state(tp, PCI_D3hot); - } static int tg3_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) @@ -8829,9 +8307,6 @@ static int tg3_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) if (tp->tg3_flags2 & TG3_FLG2_PHY_SERDES) break; /* We have no PHY */ - if (tp->link_config.phy_is_low_power) - return -EAGAIN; - spin_lock_bh(&tp->lock); err = tg3_readphy(tp, data->reg_num & 0x1f, &mii_regval); spin_unlock_bh(&tp->lock); @@ -8848,9 +8323,6 @@ static int tg3_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) if (!capable(CAP_NET_ADMIN)) return -EPERM; - if (tp->link_config.phy_is_low_power) - return -EAGAIN; - spin_lock_bh(&tp->lock); err = tg3_writephy(tp, data->reg_num & 0x1f, data->val_in); spin_unlock_bh(&tp->lock); @@ -8869,9 +8341,6 @@ 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; @@ -8880,25 +8349,16 @@ 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 @@ -9006,14 +8466,14 @@ static struct ethtool_ops tg3_ethtool_ops = { static void __devinit tg3_get_eeprom_size(struct tg3 *tp) { - u32 cursize, val, magic; + u32 cursize, val; tp->nvram_size = EEPROM_CHIP_SIZE; - if (tg3_nvram_read_swab(tp, 0, &magic) != 0) + if (tg3_nvram_read(tp, 0, &val) != 0) return; - if ((magic != TG3_EEPROM_MAGIC) && ((magic & 0xff000000) != 0xa5000000)) + if (swab32(val) != TG3_EEPROM_MAGIC) return; /* @@ -9021,13 +8481,13 @@ static void __devinit tg3_get_eeprom_size(struct tg3 *tp) * When we encounter our validation signature, we know the addressing * has wrapped around, and thus have our chip size. */ - cursize = 0x10; + cursize = 0x800; while (cursize < tp->nvram_size) { - if (tg3_nvram_read_swab(tp, cursize, &val) != 0) + if (tg3_nvram_read(tp, cursize, &val) != 0) return; - if (val == magic) + if (swab32(val) == TG3_EEPROM_MAGIC) break; cursize <<= 1; @@ -9040,15 +8500,6 @@ static void __devinit tg3_get_nvram_size(struct tg3 *tp) { u32 val; - if (tg3_nvram_read_swab(tp, 0, &val) != 0) - return; - - /* Selfboot format */ - if (val != TG3_EEPROM_MAGIC) { - tg3_get_eeprom_size(tp); - return; - } - if (tg3_nvram_read(tp, 0xf0, &val) == 0) { if (val != 0) { tp->nvram_size = (val >> 16) * 1024; @@ -9172,90 +8623,14 @@ static void __devinit tg3_get_5752_nvram_info(struct tg3 *tp) } } -static void __devinit tg3_get_5755_nvram_info(struct tg3 *tp) -{ - u32 nvcfg1; - - nvcfg1 = tr32(NVRAM_CFG1); - - /* NVRAM protection for TPM */ - if (nvcfg1 & (1 << 27)) - tp->tg3_flags2 |= TG3_FLG2_PROTECTED_NVRAM; - - switch (nvcfg1 & NVRAM_CFG1_5752VENDOR_MASK) { - case FLASH_5755VENDOR_ATMEL_EEPROM_64KHZ: - case FLASH_5755VENDOR_ATMEL_EEPROM_376KHZ: - tp->nvram_jedecnum = JEDEC_ATMEL; - tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED; - tp->nvram_pagesize = ATMEL_AT24C512_CHIP_SIZE; - - nvcfg1 &= ~NVRAM_CFG1_COMPAT_BYPASS; - tw32(NVRAM_CFG1, nvcfg1); - break; - case FLASH_5752VENDOR_ATMEL_FLASH_BUFFERED: - case FLASH_5755VENDOR_ATMEL_FLASH_1: - case FLASH_5755VENDOR_ATMEL_FLASH_2: - case FLASH_5755VENDOR_ATMEL_FLASH_3: - case FLASH_5755VENDOR_ATMEL_FLASH_4: - tp->nvram_jedecnum = JEDEC_ATMEL; - tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED; - tp->tg3_flags2 |= TG3_FLG2_FLASH; - tp->nvram_pagesize = 264; - break; - case FLASH_5752VENDOR_ST_M45PE10: - case FLASH_5752VENDOR_ST_M45PE20: - case FLASH_5752VENDOR_ST_M45PE40: - tp->nvram_jedecnum = JEDEC_ST; - tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED; - tp->tg3_flags2 |= TG3_FLG2_FLASH; - tp->nvram_pagesize = 256; - break; - } -} - -static void __devinit tg3_get_5787_nvram_info(struct tg3 *tp) -{ - u32 nvcfg1; - - nvcfg1 = tr32(NVRAM_CFG1); - - switch (nvcfg1 & NVRAM_CFG1_5752VENDOR_MASK) { - case FLASH_5787VENDOR_ATMEL_EEPROM_64KHZ: - case FLASH_5787VENDOR_ATMEL_EEPROM_376KHZ: - case FLASH_5787VENDOR_MICRO_EEPROM_64KHZ: - case FLASH_5787VENDOR_MICRO_EEPROM_376KHZ: - tp->nvram_jedecnum = JEDEC_ATMEL; - tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED; - tp->nvram_pagesize = ATMEL_AT24C512_CHIP_SIZE; - - nvcfg1 &= ~NVRAM_CFG1_COMPAT_BYPASS; - tw32(NVRAM_CFG1, nvcfg1); - break; - case FLASH_5752VENDOR_ATMEL_FLASH_BUFFERED: - case FLASH_5755VENDOR_ATMEL_FLASH_1: - case FLASH_5755VENDOR_ATMEL_FLASH_2: - case FLASH_5755VENDOR_ATMEL_FLASH_3: - tp->nvram_jedecnum = JEDEC_ATMEL; - tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED; - tp->tg3_flags2 |= TG3_FLG2_FLASH; - tp->nvram_pagesize = 264; - break; - case FLASH_5752VENDOR_ST_M45PE10: - case FLASH_5752VENDOR_ST_M45PE20: - case FLASH_5752VENDOR_ST_M45PE40: - tp->nvram_jedecnum = JEDEC_ST; - tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED; - tp->tg3_flags2 |= TG3_FLG2_FLASH; - tp->nvram_pagesize = 256; - break; - } -} - /* Chips other than 5700/5701 use the NVRAM for fetching info. */ static void __devinit tg3_nvram_init(struct tg3 *tp) { int j; + if (tp->tg3_flags2 & TG3_FLG2_SUN_570X) + return; + tw32_f(GRC_EEPROM_ADDR, (EEPROM_ADDR_FSM_RESET | (EEPROM_DEFAULT_CLOCK_PERIOD << @@ -9283,10 +8658,6 @@ static void __devinit tg3_nvram_init(struct tg3 *tp) if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5752) tg3_get_5752_nvram_info(tp); - else if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755) - tg3_get_5755_nvram_info(tp); - else if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787) - tg3_get_5787_nvram_info(tp); else tg3_get_nvram_info(tp); @@ -9356,42 +8727,26 @@ static int tg3_nvram_exec_cmd(struct tg3 *tp, u32 nvram_cmd) return 0; } -static u32 tg3_nvram_phys_addr(struct tg3 *tp, u32 addr) -{ - if ((tp->tg3_flags & TG3_FLAG_NVRAM) && - (tp->tg3_flags & TG3_FLAG_NVRAM_BUFFERED) && - (tp->tg3_flags2 & TG3_FLG2_FLASH) && - (tp->nvram_jedecnum == JEDEC_ATMEL)) - - addr = ((addr / tp->nvram_pagesize) << - ATMEL_AT45DB0X1B_PAGE_POS) + - (addr % tp->nvram_pagesize); - - return addr; -} - -static u32 tg3_nvram_logical_addr(struct tg3 *tp, u32 addr) -{ - if ((tp->tg3_flags & TG3_FLAG_NVRAM) && - (tp->tg3_flags & TG3_FLAG_NVRAM_BUFFERED) && - (tp->tg3_flags2 & TG3_FLG2_FLASH) && - (tp->nvram_jedecnum == JEDEC_ATMEL)) - - addr = ((addr >> ATMEL_AT45DB0X1B_PAGE_POS) * - tp->nvram_pagesize) + - (addr & ((1 << ATMEL_AT45DB0X1B_PAGE_POS) - 1)); - - return addr; -} - static int tg3_nvram_read(struct tg3 *tp, u32 offset, u32 *val) { int ret; + if (tp->tg3_flags2 & TG3_FLG2_SUN_570X) { + printk(KERN_ERR PFX "Attempt to do nvram_read on Sun 570X\n"); + return -EINVAL; + } + if (!(tp->tg3_flags & TG3_FLAG_NVRAM)) return tg3_nvram_read_using_eeprom(tp, offset, val); - offset = tg3_nvram_phys_addr(tp, offset); + if ((tp->tg3_flags & TG3_FLAG_NVRAM_BUFFERED) && + (tp->tg3_flags2 & TG3_FLG2_FLASH) && + (tp->nvram_jedecnum == JEDEC_ATMEL)) { + + offset = ((offset / tp->nvram_pagesize) << + ATMEL_AT45DB0X1B_PAGE_POS) + + (offset % tp->nvram_pagesize); + } if (offset > NVRAM_ADDR_MSK) return -EINVAL; @@ -9416,16 +8771,6 @@ static int tg3_nvram_read(struct tg3 *tp, u32 offset, u32 *val) return ret; } -static int tg3_nvram_read_swab(struct tg3 *tp, u32 offset, u32 *val) -{ - int err; - u32 tmp; - - err = tg3_nvram_read(tp, offset, &tmp); - *val = swab32(tmp); - return err; -} - static int tg3_nvram_write_block_using_eeprom(struct tg3 *tp, u32 offset, u32 len, u8 *buf) { @@ -9578,7 +8923,15 @@ static int tg3_nvram_write_block_buffered(struct tg3 *tp, u32 offset, u32 len, page_off = offset % tp->nvram_pagesize; - phy_addr = tg3_nvram_phys_addr(tp, offset); + if ((tp->tg3_flags2 & TG3_FLG2_FLASH) && + (tp->nvram_jedecnum == JEDEC_ATMEL)) { + + phy_addr = ((offset / tp->nvram_pagesize) << + ATMEL_AT45DB0X1B_PAGE_POS) + page_off; + } + else { + phy_addr = offset; + } tw32(NVRAM_ADDR, phy_addr); @@ -9586,15 +8939,13 @@ static int tg3_nvram_write_block_buffered(struct tg3 *tp, u32 offset, u32 len, if ((page_off == 0) || (i == 0)) nvram_cmd |= NVRAM_CMD_FIRST; - if (page_off == (tp->nvram_pagesize - 4)) + else if (page_off == (tp->nvram_pagesize - 4)) nvram_cmd |= NVRAM_CMD_LAST; if (i == (len - 4)) nvram_cmd |= NVRAM_CMD_LAST; if ((GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5752) && - (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5755) && - (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5787) && (tp->nvram_jedecnum == JEDEC_ST) && (nvram_cmd & NVRAM_CMD_FIRST)) { @@ -9620,6 +8971,11 @@ static int tg3_nvram_write_block(struct tg3 *tp, u32 offset, u32 len, u8 *buf) { int ret; + if (tp->tg3_flags2 & TG3_FLG2_SUN_570X) { + printk(KERN_ERR PFX "Attempt to do nvram_write on Sun 570X\n"); + return -EINVAL; + } + if (tp->tg3_flags & TG3_FLAG_EEPROM_WRITE_PROT) { tw32_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl & ~GRC_LCLCTRL_GPIO_OUTPUT1); @@ -9727,18 +9083,12 @@ static inline struct subsys_tbl_ent *lookup_by_subsys(struct tg3 *tp) return NULL; } +/* Since this function may be called in D3-hot power state during + * tg3_init_one(), only config cycles are allowed. + */ static void __devinit tg3_get_eeprom_hw_cfg(struct tg3 *tp) { u32 val; - u16 pmcsr; - - /* On some early chips the SRAM cannot be accessed in D3hot state, - * so need make sure we're in D0. - */ - pci_read_config_word(tp->pdev, tp->pm_cap + PCI_PM_CTRL, &pmcsr); - pmcsr &= ~PCI_PM_CTRL_STATE_MASK; - pci_write_config_word(tp->pdev, tp->pm_cap + PCI_PM_CTRL, pmcsr); - msleep(1); /* Make sure register accesses (indirect or otherwise) * will function correctly. @@ -9746,20 +9096,9 @@ static void __devinit tg3_get_eeprom_hw_cfg(struct tg3 *tp) pci_write_config_dword(tp->pdev, TG3PCI_MISC_HOST_CTRL, tp->misc_host_ctrl); - /* The memory arbiter has to be enabled in order for SRAM accesses - * to succeed. Normally on powerup the tg3 chip firmware will make - * sure it is enabled, but other entities such as system netboot - * code might disable it. - */ - val = tr32(MEMARB_MODE); - tw32(MEMARB_MODE, val | MEMARB_MODE_ENABLE); - tp->phy_id = PHY_ID_INVALID; tp->led_ctrl = LED_CTRL_MODE_PHY_1; - /* Assume an onboard device by default. */ - tp->tg3_flags |= TG3_FLAG_EEPROM_WRITE_PROT; - tg3_read_mem(tp, NIC_SRAM_DATA_SIG, &val); if (val == NIC_SRAM_DATA_SIG_MAGIC) { u32 nic_cfg, led_cfg; @@ -9856,10 +9195,10 @@ static void __devinit tg3_get_eeprom_hw_cfg(struct tg3 *tp) tp->pdev->subsystem_vendor == PCI_VENDOR_ID_DELL) tp->led_ctrl = LED_CTRL_MODE_PHY_2; - if (nic_cfg & NIC_SRAM_DATA_CFG_EEPROM_WP) + if ((GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5700) && + (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5701) && + (nic_cfg & NIC_SRAM_DATA_CFG_EEPROM_WP)) tp->tg3_flags |= TG3_FLAG_EEPROM_WRITE_PROT; - else - tp->tg3_flags &= ~TG3_FLAG_EEPROM_WRITE_PROT; if (nic_cfg & NIC_SRAM_DATA_CFG_ASF_ENABLE) { tp->tg3_flags |= TG3_FLAG_ENABLE_ASF; @@ -10005,55 +9344,32 @@ skip_phy_reset: static void __devinit tg3_read_partno(struct tg3 *tp) { unsigned char vpd_data[256]; - int i; - u32 magic; - - if (tg3_nvram_read_swab(tp, 0x0, &magic)) - goto out_not_found; + unsigned int i; - if (magic == TG3_EEPROM_MAGIC) { - for (i = 0; i < 256; i += 4) { - u32 tmp; + if (tp->tg3_flags2 & TG3_FLG2_SUN_570X) { + /* Sun decided not to put the necessary bits in the + * NVRAM of their onboard tg3 parts :( + */ + strcpy(tp->board_part_number, "Sun 570X"); + return; + } - if (tg3_nvram_read(tp, 0x100 + i, &tmp)) - goto out_not_found; + for (i = 0; i < 256; i += 4) { + u32 tmp; - vpd_data[i + 0] = ((tmp >> 0) & 0xff); - vpd_data[i + 1] = ((tmp >> 8) & 0xff); - vpd_data[i + 2] = ((tmp >> 16) & 0xff); - vpd_data[i + 3] = ((tmp >> 24) & 0xff); - } - } else { - int vpd_cap; - - vpd_cap = pci_find_capability(tp->pdev, PCI_CAP_ID_VPD); - for (i = 0; i < 256; i += 4) { - u32 tmp, j = 0; - u16 tmp16; - - pci_write_config_word(tp->pdev, vpd_cap + PCI_VPD_ADDR, - i); - while (j++ < 100) { - pci_read_config_word(tp->pdev, vpd_cap + - PCI_VPD_ADDR, &tmp16); - if (tmp16 & 0x8000) - break; - msleep(1); - } - if (!(tmp16 & 0x8000)) - goto out_not_found; + if (tg3_nvram_read(tp, 0x100 + i, &tmp)) + goto out_not_found; - pci_read_config_dword(tp->pdev, vpd_cap + PCI_VPD_DATA, - &tmp); - tmp = cpu_to_le32(tmp); - memcpy(&vpd_data[i], &tmp, 4); - } + vpd_data[i + 0] = ((tmp >> 0) & 0xff); + vpd_data[i + 1] = ((tmp >> 8) & 0xff); + vpd_data[i + 2] = ((tmp >> 16) & 0xff); + vpd_data[i + 3] = ((tmp >> 24) & 0xff); } /* Now parse and find the part number. */ - for (i = 0; i < 256; ) { + for (i = 0; i < 254; ) { unsigned char val = vpd_data[i]; - int block_end; + unsigned int block_end; if (val == 0x82 || val == 0x91) { i = (i + 3 + @@ -10069,21 +9385,26 @@ static void __devinit tg3_read_partno(struct tg3 *tp) (vpd_data[i + 1] + (vpd_data[i + 2] << 8))); i += 3; - while (i < block_end) { + + if (block_end > 256) + goto out_not_found; + + while (i < (block_end - 2)) { if (vpd_data[i + 0] == 'P' && vpd_data[i + 1] == 'N') { int partno_len = vpd_data[i + 2]; - if (partno_len > 24) + i += 3; + if (partno_len > 24 || (partno_len + i) > 256) goto out_not_found; memcpy(tp->board_part_number, - &vpd_data[i + 3], - partno_len); + &vpd_data[i], partno_len); /* Success. */ return; } + i += 3 + vpd_data[i + 2]; } /* Part number not found. */ @@ -10094,53 +9415,42 @@ out_not_found: strcpy(tp->board_part_number, "none"); } -static void __devinit tg3_read_fw_ver(struct tg3 *tp) +#ifdef CONFIG_SPARC64 +static int __devinit tg3_is_sun_570X(struct tg3 *tp) { - u32 val, offset, start; - - if (tg3_nvram_read_swab(tp, 0, &val)) - return; - - if (val != TG3_EEPROM_MAGIC) - return; - - if (tg3_nvram_read_swab(tp, 0xc, &offset) || - tg3_nvram_read_swab(tp, 0x4, &start)) - return; - - offset = tg3_nvram_logical_addr(tp, offset); - if (tg3_nvram_read_swab(tp, offset, &val)) - return; - - if ((val & 0xfc000000) == 0x0c000000) { - u32 ver_offset, addr; - int i; - - if (tg3_nvram_read_swab(tp, offset + 4, &val) || - tg3_nvram_read_swab(tp, offset + 8, &ver_offset)) - return; - - if (val != 0) - return; + struct pci_dev *pdev = tp->pdev; + struct pcidev_cookie *pcp = pdev->sysdata; - addr = offset + ver_offset - start; - for (i = 0; i < 16; i += 4) { - if (tg3_nvram_read(tp, addr + i, &val)) - return; + if (pcp != NULL) { + int node = pcp->prom_node; + u32 venid; + int err; - val = cpu_to_le32(val); - memcpy(tp->fw_ver + i, &val, 4); - } + err = prom_getproperty(node, "subsystem-vendor-id", + (char *) &venid, sizeof(venid)); + if (err == 0 || err == -1) + return 0; + if (venid == PCI_VENDOR_ID_SUN) + return 1; + + /* TG3 chips onboard the SunBlade-2500 don't have the + * subsystem-vendor-id set to PCI_VENDOR_ID_SUN but they + * are distinguishable from non-Sun variants by being + * named "network" by the firmware. Non-Sun cards will + * show up as being named "ethernet". + */ + if (!strcmp(pcp->prom_name, "network")) + return 1; } + return 0; } +#endif 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) }, { }, @@ -10152,6 +9462,11 @@ static int __devinit tg3_get_invariants(struct tg3 *tp) u16 pci_cmd; int err; +#ifdef CONFIG_SPARC64 + if (tg3_is_sun_570X(tp)) + tp->tg3_flags2 |= TG3_FLG2_SUN_570X; +#endif + /* Force memory write invalidate off. If we leave it on, * then on 5700_BX chips we have to enable a workaround. * The workaround is to set the TG3PCI_DMA_RW_CTRL boundary @@ -10291,8 +9606,6 @@ static int __devinit tg3_get_invariants(struct tg3 *tp) 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 || - GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787 || (tp->tg3_flags2 & TG3_FLG2_5780_CLASS)) tp->tg3_flags2 |= TG3_FLG2_5750_PLUS; @@ -10300,26 +9613,12 @@ static int __devinit tg3_get_invariants(struct tg3 *tp) (tp->tg3_flags2 & TG3_FLG2_5750_PLUS)) tp->tg3_flags2 |= TG3_FLG2_5705_PLUS; - if (tp->tg3_flags2 & TG3_FLG2_5750_PLUS) { - if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755 || - 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 | - 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 (tp->tg3_flags2 & TG3_FLG2_5750_PLUS) + tp->tg3_flags2 |= TG3_FLG2_HW_TSO; if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5705 && 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 && - GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5787) + GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5752) tp->tg3_flags2 |= TG3_FLG2_JUMBO_CAPABLE; if (pci_find_capability(tp->pdev, PCI_CAP_ID_EXP) != 0) @@ -10450,12 +9749,6 @@ static int __devinit tg3_get_invariants(struct tg3 *tp) pci_write_config_word(tp->pdev, PCI_COMMAND, pci_cmd); } - if (tp->write32 == tg3_write_indirect_reg32 || - ((tp->tg3_flags & TG3_FLAG_PCIX_MODE) && - (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700 || - GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701))) - tp->tg3_flags |= TG3_FLAG_SRAM_USE_CONFIG; - /* Get eeprom hw config before calling tg3_set_power_state(). * In particular, the TG3_FLAG_EEPROM_WRITE_PROT flag must be * determined before calling tg3_set_power_state() so that @@ -10481,11 +9774,8 @@ static int __devinit tg3_get_invariants(struct tg3 *tp) else if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5752) tp->grc_local_ctrl |= GRC_LCLCTRL_GPIO_OE3; - if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755) - tp->grc_local_ctrl |= GRC_LCLCTRL_GPIO_UART_SEL; - /* Force the chip into D0. */ - err = tg3_set_power_state(tp, PCI_D0); + err = tg3_set_power_state(tp, 0); if (err) { printk(KERN_ERR PFX "(%s) transition to D0 failed\n", pci_name(tp->pdev)); @@ -10498,6 +9788,15 @@ static int __devinit tg3_get_invariants(struct tg3 *tp) if (tp->pci_chip_rev_id == CHIPREV_ID_5700_B0) tp->tg3_flags |= TG3_FLAG_BROKEN_CHECKSUMS; + /* Pseudo-header checksum is done by hardware logic and not + * the offload processers, so make the chip do the pseudo- + * header checksums on receive. For transmit it is more + * convenient to do the pseudo-header checksum in software + * as Linux does that on transmit for us in all cases. + */ + tp->tg3_flags |= TG3_FLAG_NO_TX_PSEUDO_CSUM; + tp->tg3_flags &= ~TG3_FLAG_NO_RX_PSEUDO_CSUM; + /* Derive initial jumbo mode from MTU assigned in * ether_setup() via the alloc_etherdev() call */ @@ -10529,13 +9828,8 @@ static int __devinit tg3_get_invariants(struct tg3 *tp) if (tp->pci_chip_rev_id == CHIPREV_ID_5704_A0) tp->tg3_flags2 |= TG3_FLG2_PHY_5704_A0_BUG; - if (tp->tg3_flags2 & TG3_FLG2_5705_PLUS) { - if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755 || - GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787) - tp->tg3_flags2 |= TG3_FLG2_PHY_JITTER_BUG; - else - tp->tg3_flags2 |= TG3_FLG2_PHY_BER_BUG; - } + if (tp->tg3_flags2 & TG3_FLG2_5705_PLUS) + tp->tg3_flags2 |= TG3_FLG2_PHY_BER_BUG; tp->coalesce_mode = 0; if (GET_CHIP_REV(tp->pci_chip_rev_id) != CHIPREV_5700_AX && @@ -10634,7 +9928,6 @@ static int __devinit tg3_get_invariants(struct tg3 *tp) } tg3_read_partno(tp); - tg3_read_fw_ver(tp); if (tp->tg3_flags2 & TG3_FLG2_PHY_SERDES) { tp->tg3_flags &= ~TG3_FLAG_USE_MI_INTERRUPT; @@ -10670,30 +9963,16 @@ static int __devinit tg3_get_invariants(struct tg3 *tp) else tp->tg3_flags &= ~TG3_FLAG_POLL_SERDES; - /* All chips before 5787 can get confused if TX buffers + /* It seems all chips can get confused if TX buffers * straddle the 4GB address boundary in some cases. */ - if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755 || - GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787) - tp->dev->hard_start_xmit = tg3_start_xmit; - else - tp->dev->hard_start_xmit = tg3_start_xmit_dma_bug; + tp->dev->hard_start_xmit = tg3_start_xmit; tp->rx_offset = 2; if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701 && (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. */ @@ -10710,13 +9989,11 @@ static int __devinit tg3_get_macaddr_sparc(struct tg3 *tp) struct pcidev_cookie *pcp = pdev->sysdata; if (pcp != NULL) { - unsigned char *addr; - int len; + int node = pcp->prom_node; - addr = of_get_property(pcp->prom_node, "local-mac-address", - &len); - if (addr && len == 6) { - memcpy(dev->dev_addr, addr, 6); + if (prom_getproplen(node, "local-mac-address") == 6) { + prom_getproperty(node, "local-mac-address", + dev->dev_addr, 6); memcpy(dev->perm_addr, dev->dev_addr, 6); return 0; } @@ -10738,7 +10015,6 @@ static int __devinit tg3_get_device_address(struct tg3 *tp) { struct net_device *dev = tp->dev; u32 hi, lo, mac_offset; - int addr_ok = 0; #ifdef CONFIG_SPARC64 if (!tg3_get_macaddr_sparc(tp)) @@ -10746,7 +10022,8 @@ static int __devinit tg3_get_device_address(struct tg3 *tp) #endif mac_offset = 0x7c; - if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704) || + if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704 && + !(tp->tg3_flags & TG3_FLG2_SUN_570X)) || (tp->tg3_flags2 & TG3_FLG2_5780_CLASS)) { if (tr32(TG3PCI_DUAL_MAC_CTRL) & DUAL_MAC_CTRL_ID) mac_offset = 0xcc; @@ -10767,33 +10044,29 @@ static int __devinit tg3_get_device_address(struct tg3 *tp) dev->dev_addr[3] = (lo >> 16) & 0xff; dev->dev_addr[4] = (lo >> 8) & 0xff; dev->dev_addr[5] = (lo >> 0) & 0xff; + } + /* Next, try NVRAM. */ + else if (!(tp->tg3_flags & TG3_FLG2_SUN_570X) && + !tg3_nvram_read(tp, mac_offset + 0, &hi) && + !tg3_nvram_read(tp, mac_offset + 4, &lo)) { + dev->dev_addr[0] = ((hi >> 16) & 0xff); + dev->dev_addr[1] = ((hi >> 24) & 0xff); + dev->dev_addr[2] = ((lo >> 0) & 0xff); + dev->dev_addr[3] = ((lo >> 8) & 0xff); + dev->dev_addr[4] = ((lo >> 16) & 0xff); + dev->dev_addr[5] = ((lo >> 24) & 0xff); + } + /* Finally just fetch it out of the MAC control regs. */ + else { + hi = tr32(MAC_ADDR_0_HIGH); + lo = tr32(MAC_ADDR_0_LOW); - /* Some old bootcode may report a 0 MAC address in SRAM */ - addr_ok = is_valid_ether_addr(&dev->dev_addr[0]); - } - if (!addr_ok) { - /* Next, try NVRAM. */ - if (!tg3_nvram_read(tp, mac_offset + 0, &hi) && - !tg3_nvram_read(tp, mac_offset + 4, &lo)) { - dev->dev_addr[0] = ((hi >> 16) & 0xff); - dev->dev_addr[1] = ((hi >> 24) & 0xff); - dev->dev_addr[2] = ((lo >> 0) & 0xff); - dev->dev_addr[3] = ((lo >> 8) & 0xff); - dev->dev_addr[4] = ((lo >> 16) & 0xff); - dev->dev_addr[5] = ((lo >> 24) & 0xff); - } - /* Finally just fetch it out of the MAC control regs. */ - else { - hi = tr32(MAC_ADDR_0_HIGH); - lo = tr32(MAC_ADDR_0_LOW); - - dev->dev_addr[5] = lo & 0xff; - dev->dev_addr[4] = (lo >> 8) & 0xff; - dev->dev_addr[3] = (lo >> 16) & 0xff; - dev->dev_addr[2] = (lo >> 24) & 0xff; - dev->dev_addr[1] = hi & 0xff; - dev->dev_addr[0] = (hi >> 8) & 0xff; - } + dev->dev_addr[5] = lo & 0xff; + dev->dev_addr[4] = (lo >> 8) & 0xff; + dev->dev_addr[3] = (lo >> 16) & 0xff; + dev->dev_addr[2] = (lo >> 24) & 0xff; + dev->dev_addr[1] = hi & 0xff; + dev->dev_addr[0] = (hi >> 8) & 0xff; } if (!is_valid_ether_addr(&dev->dev_addr[0])) { @@ -11221,6 +10494,7 @@ static void __devinit tg3_init_link_config(struct tg3 *tp) tp->link_config.speed = SPEED_INVALID; tp->link_config.duplex = DUPLEX_INVALID; tp->link_config.autoneg = AUTONEG_ENABLE; + netif_carrier_off(tp->dev); tp->link_config.active_speed = SPEED_INVALID; tp->link_config.active_duplex = DUPLEX_INVALID; tp->link_config.phy_is_low_power = 0; @@ -11279,8 +10553,6 @@ static char * __devinit tg3_phy_string(struct tg3 *tp) case PHY_ID_BCM5752: return "5752"; case PHY_ID_BCM5714: return "5714"; case PHY_ID_BCM5780: return "5780"; - case PHY_ID_BCM5755: return "5755"; - case PHY_ID_BCM5787: return "5787"; case PHY_ID_BCM8002: return "8002/serdes"; case 0: return "serdes"; default: return "unknown"; @@ -11441,6 +10713,7 @@ 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; @@ -11482,6 +10755,7 @@ 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); @@ -11577,15 +10851,11 @@ 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 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) { + /* TSO is off by default, user can enable using ethtool. */ +#if 0 + if (tp->tg3_flags2 & TG3_FLG2_TSO_CAPABLE) dev->features |= NETIF_F_TSO; - if (tp->tg3_flags2 & TG3_FLG2_HW_TSO_2) - dev->features |= NETIF_F_TSO6; - } +#endif #endif @@ -11629,12 +10899,7 @@ static int __devinit tg3_init_one(struct pci_dev *pdev, * checksumming. */ if ((tp->tg3_flags & TG3_FLAG_BROKEN_CHECKSUMS) == 0) { - if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755 || - GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787) - dev->features |= NETIF_F_HW_CSUM; - else - dev->features |= NETIF_F_IP_CSUM; - dev->features |= NETIF_F_SG; + dev->features |= NETIF_F_SG | NETIF_F_IP_CSUM; tp->tg3_flags |= TG3_FLAG_RX_CHECKSUMS; } else tp->tg3_flags &= ~TG3_FLAG_RX_CHECKSUMS; @@ -11687,8 +10952,6 @@ static int __devinit tg3_init_one(struct pci_dev *pdev, (pdev->dma_mask == DMA_32BIT_MASK) ? 32 : (((u64) pdev->dma_mask == DMA_40BIT_MASK) ? 40 : 64)); - netif_carrier_off(tp->dev); - return 0; err_out_iounmap: @@ -11759,8 +11022,7 @@ static int tg3_suspend(struct pci_dev *pdev, pm_message_t state) tg3_full_lock(tp, 0); tp->tg3_flags |= TG3_FLAG_INIT_COMPLETE; - if (tg3_restart_hw(tp, 1)) - goto out; + tg3_init_hw(tp); tp->timer.expires = jiffies + tp->timer_offset; add_timer(&tp->timer); @@ -11768,7 +11030,6 @@ 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); } @@ -11786,7 +11047,7 @@ static int tg3_resume(struct pci_dev *pdev) pci_restore_state(tp->pdev); - err = tg3_set_power_state(tp, PCI_D0); + err = tg3_set_power_state(tp, 0); if (err) return err; @@ -11795,19 +11056,16 @@ static int tg3_resume(struct pci_dev *pdev) tg3_full_lock(tp, 0); tp->tg3_flags |= TG3_FLAG_INIT_COMPLETE; - err = tg3_restart_hw(tp, 1); - if (err) - goto out; + tg3_init_hw(tp); tp->timer.expires = jiffies + tp->timer_offset; add_timer(&tp->timer); tg3_netif_start(tp); -out: tg3_full_unlock(tp); - return err; + return 0; } static struct pci_driver tg3_driver = { diff --git a/drivers/net/tg3.h b/drivers/net/tg3.h index 3ecf356cf..7e3b613af 100644 --- a/drivers/net/tg3.h +++ b/drivers/net/tg3.h @@ -125,7 +125,6 @@ #define CHIPREV_ID_5750_A0 0x4000 #define CHIPREV_ID_5750_A1 0x4001 #define CHIPREV_ID_5750_A3 0x4003 -#define CHIPREV_ID_5750_C2 0x4202 #define CHIPREV_ID_5752_A0_HW 0x5000 #define CHIPREV_ID_5752_A0 0x6000 #define CHIPREV_ID_5752_A1 0x6001 @@ -139,8 +138,6 @@ #define ASIC_REV_5752 0x06 #define ASIC_REV_5780 0x08 #define ASIC_REV_5714 0x09 -#define ASIC_REV_5755 0x0a -#define ASIC_REV_5787 0x0b #define GET_CHIP_REV(CHIP_REV_ID) ((CHIP_REV_ID) >> 8) #define CHIPREV_5700_AX 0x70 #define CHIPREV_5700_BX 0x71 @@ -458,7 +455,6 @@ #define RX_MODE_PROMISC 0x00000100 #define RX_MODE_NO_CRC_CHECK 0x00000200 #define RX_MODE_KEEP_VLAN_TAG 0x00000400 -#define RX_MODE_IPV6_CSUM_ENABLE 0x01000000 #define MAC_RX_STATUS 0x0000046c #define RX_STATUS_REMOTE_TX_XOFFED 0x00000001 #define RX_STATUS_XOFF_RCVD 0x00000002 @@ -761,7 +757,6 @@ #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 */ @@ -1344,7 +1339,6 @@ #define GRC_LCLCTRL_CLEARINT 0x00000002 #define GRC_LCLCTRL_SETINT 0x00000004 #define GRC_LCLCTRL_INT_ON_ATTN 0x00000008 -#define GRC_LCLCTRL_GPIO_UART_SEL 0x00000010 /* 5755 only */ #define GRC_LCLCTRL_USE_SIG_DETECT 0x00000010 /* 5714/5780 only */ #define GRC_LCLCTRL_USE_EXT_SIG_DETECT 0x00000020 /* 5714/5780 only */ #define GRC_LCLCTRL_GPIO_INPUT3 0x00000020 @@ -1399,7 +1393,6 @@ #define GRC_MDI_CTRL 0x00006844 #define GRC_SEEPROM_DELAY 0x00006848 /* 0x684c --> 0x6c00 unused */ -#define GRC_FASTBOOT_PC 0x00006894 /* 5752, 5755, 5787 */ /* 0x6c00 --> 0x7000 unused */ @@ -1443,16 +1436,6 @@ #define FLASH_5752VENDOR_ST_M45PE10 0x02400000 #define FLASH_5752VENDOR_ST_M45PE20 0x02400002 #define FLASH_5752VENDOR_ST_M45PE40 0x02400001 -#define FLASH_5755VENDOR_ATMEL_FLASH_1 0x03400001 -#define FLASH_5755VENDOR_ATMEL_FLASH_2 0x03400002 -#define FLASH_5755VENDOR_ATMEL_FLASH_3 0x03400000 -#define FLASH_5755VENDOR_ATMEL_FLASH_4 0x00000003 -#define FLASH_5755VENDOR_ATMEL_EEPROM_64KHZ 0x03c00003 -#define FLASH_5755VENDOR_ATMEL_EEPROM_376KHZ 0x03c00002 -#define FLASH_5787VENDOR_ATMEL_EEPROM_64KHZ 0x03000003 -#define FLASH_5787VENDOR_ATMEL_EEPROM_376KHZ 0x03000002 -#define FLASH_5787VENDOR_MICRO_EEPROM_64KHZ 0x03000000 -#define FLASH_5787VENDOR_MICRO_EEPROM_376KHZ 0x02000000 #define NVRAM_CFG1_5752PAGE_SIZE_MASK 0x70000000 #define FLASH_5752PAGE_SIZE_256 0x00000000 #define FLASH_5752PAGE_SIZE_512 0x10000000 @@ -2076,22 +2059,12 @@ struct tg3 { /* SMP locking strategy: * - * lock: Held during reset, PHY access, timer, and when - * updating tg3_flags and tg3_flags2. + * lock: Held during all operations except TX packet + * processing. * - * netif_tx_lock: Held during tg3_start_xmit. tg3_tx holds - * netif_tx_lock when it needs to call - * netif_wake_queue. + * tx_lock: Held during tg3_start_xmit and tg3_tx * * 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; @@ -2118,6 +2091,8 @@ 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; @@ -2137,7 +2112,6 @@ 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; @@ -2166,7 +2140,11 @@ 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 @@ -2178,8 +2156,8 @@ struct tg3 { #define TG3_FLAG_PCIX_MODE 0x00020000 #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_NO_TX_PSEUDO_CSUM 0x00100000 +#define TG3_FLAG_NO_RX_PSEUDO_CSUM 0x00200000 #define TG3_FLAG_SERDES_WOL_CAP 0x00400000 #define TG3_FLAG_JUMBO_RING_ENABLE 0x00800000 #define TG3_FLAG_10_100_ONLY 0x01000000 @@ -2192,7 +2170,7 @@ struct tg3 { #define TG3_FLAG_INIT_COMPLETE 0x80000000 u32 tg3_flags2; #define TG3_FLG2_RESTART_TIMER 0x00000001 -#define TG3_FLG2_HW_TSO_1_BUG 0x00000002 +#define TG3_FLG2_SUN_570X 0x00000002 #define TG3_FLG2_NO_ETH_WIRE_SPEED 0x00000004 #define TG3_FLG2_IS_5788 0x00000008 #define TG3_FLG2_MAX_RXPEND_64 0x00000010 @@ -2207,7 +2185,7 @@ struct tg3 { #define TG3_FLG2_PHY_SERDES 0x00002000 #define TG3_FLG2_CAPACITIVE_COUPLING 0x00004000 #define TG3_FLG2_FLASH 0x00008000 -#define TG3_FLG2_HW_TSO_1 0x00010000 +#define TG3_FLG2_HW_TSO 0x00010000 #define TG3_FLG2_SERDES_PREEMPHASIS 0x00020000 #define TG3_FLG2_5705_PLUS 0x00040000 #define TG3_FLG2_5750_PLUS 0x00080000 @@ -2220,11 +2198,6 @@ struct tg3 { #define TG3_FLG2_PARALLEL_DETECT 0x01000000 #define TG3_FLG2_ICH_WORKAROUND 0x02000000 #define TG3_FLG2_5780_CLASS 0x04000000 -#define TG3_FLG2_HW_TSO_2 0x08000000 -#define TG3_FLG2_HW_TSO (TG3_FLG2_HW_TSO_1 | TG3_FLG2_HW_TSO_2) -#define TG3_FLG2_1SHOT_MSI 0x10000000 -#define TG3_FLG2_PHY_JITTER_BUG 0x20000000 -#define TG3_FLG2_NO_FWARE_REPORTED 0x40000000 u32 split_mode_max_reqs; #define SPLIT_MODE_5704_MAX_REQ 3 @@ -2274,8 +2247,6 @@ struct tg3 { #define PHY_ID_BCM5752 0x60008100 #define PHY_ID_BCM5714 0x60008340 #define PHY_ID_BCM5780 0x60008350 -#define PHY_ID_BCM5755 0xbc050cc0 -#define PHY_ID_BCM5787 0xbc050ce0 #define PHY_ID_BCM8002 0x60010140 #define PHY_ID_INVALID 0xffffffff #define PHY_ID_REV_MASK 0x0000000f @@ -2287,7 +2258,6 @@ struct tg3 { u32 led_ctrl; char board_part_number[24]; - char fw_ver[16]; u32 nic_sram_data_cfg; u32 pci_clock_ctrl; struct pci_dev *pdev_peer; @@ -2301,8 +2271,7 @@ struct tg3 { (X) == PHY_ID_BCM5703 || (X) == PHY_ID_BCM5704 || \ (X) == PHY_ID_BCM5705 || (X) == PHY_ID_BCM5750 || \ (X) == PHY_ID_BCM5752 || (X) == PHY_ID_BCM5714 || \ - (X) == PHY_ID_BCM5780 || (X) == PHY_ID_BCM5787 || \ - (X) == PHY_ID_BCM5755 || (X) == PHY_ID_BCM8002) + (X) == PHY_ID_BCM5780 || (X) == PHY_ID_BCM8002) struct tg3_hw_stats *hw_stats; dma_addr_t stats_mapping; diff --git a/drivers/net/tlan.c b/drivers/net/tlan.c index 23c0017f2..12076f8f9 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, IRQF_SHARED, TLanSignature, dev ); + err = request_irq( dev->irq, TLan_HandleInterrupt, SA_SHIRQ, 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 465921e38..41e0cd8f4 100644 --- a/drivers/net/tokenring/3c359.c +++ b/drivers/net/tokenring/3c359.c @@ -42,6 +42,7 @@ #define XL_DEBUG 0 +#include #include #include #include @@ -576,7 +577,7 @@ static int xl_open(struct net_device *dev) u16 switchsettings, switchsettings_eeprom ; - if(request_irq(dev->irq, &xl_interrupt, IRQF_SHARED , "3c359", dev)) { + if(request_irq(dev->irq, &xl_interrupt, SA_SHIRQ , "3c359", dev)) { return -EAGAIN; } diff --git a/drivers/net/tokenring/Kconfig b/drivers/net/tokenring/Kconfig index 99c4c1922..e4cfc80b2 100644 --- a/drivers/net/tokenring/Kconfig +++ b/drivers/net/tokenring/Kconfig @@ -3,7 +3,7 @@ # menu "Token Ring devices" - depends on NETDEVICES && !UML + depends on NETDEVICES # So far, we only have PCI, ISA, and MCA token ring devices config TR diff --git a/drivers/net/tokenring/abyss.c b/drivers/net/tokenring/abyss.c index 1bdd3beef..9345e68c4 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, IRQF_SHARED, + ret = request_irq(pdev->irq, tms380tr_interrupt, SA_SHIRQ, dev->name, dev); if (ret) goto err_out_region; @@ -438,7 +438,8 @@ static void __devexit abyss_detach (struct pci_dev *pdev) { struct net_device *dev = pci_get_drvdata(pdev); - BUG_ON(!dev); + if (!dev) + BUG(); unregister_netdev(dev); release_region(dev->base_addr-0x10, ABYSS_IO_EXTENT); free_irq(dev->irq, dev); diff --git a/drivers/net/tokenring/ibmtr.c b/drivers/net/tokenring/ibmtr.c index 84f943e21..4470025ff 100644 --- a/drivers/net/tokenring/ibmtr.c +++ b/drivers/net/tokenring/ibmtr.c @@ -845,8 +845,6 @@ static int tok_init_card(struct net_device *dev) struct tok_info *ti; short PIOaddr; unsigned long i; - wait_queue_t __wait; - init_waitqueue_entry(&__wait, current); PIOaddr = dev->base_addr; ti = (struct tok_info *) dev->priv; @@ -858,18 +856,13 @@ static int tok_init_card(struct net_device *dev) schedule_timeout_uninterruptible(TR_RST_TIME); /* wait 50ms */ - add_wait_queue(&ti->wait_for_reset, &__wait); - set_current_state(TASK_UNINTERRUPTIBLE); outb(0, PIOaddr + ADAPTRESETREL); #ifdef ENABLE_PAGING if (ti->page_mask) writeb(SRPR_ENABLE_PAGING,ti->mmio+ACA_OFFSET+ACA_RW+SRPR_EVEN); #endif writeb(INT_ENABLE, ti->mmio + ACA_OFFSET + ACA_SET + ISRP_EVEN); - #warning pci posting bug - i = schedule_timeout(4 * HZ); - current->state = TASK_RUNNING; - remove_wait_queue(&ti->wait_for_reset, &__wait); + i = sleep_on_timeout(&ti->wait_for_reset, 4 * HZ); return i? 0 : -EAGAIN; } diff --git a/drivers/net/tokenring/lanstreamer.c b/drivers/net/tokenring/lanstreamer.c index 28d968ffd..97712c3c4 100644 --- a/drivers/net/tokenring/lanstreamer.c +++ b/drivers/net/tokenring/lanstreamer.c @@ -100,6 +100,7 @@ #define STREAMER_IOCTL 0 +#include #include #include #include @@ -121,7 +122,6 @@ #include #include #include -#include #include @@ -512,7 +512,7 @@ static int streamer_reset(struct net_device *dev) while (!((readw(streamer_mmio + SISR)) & SISR_SRB_REPLY)) { msleep_interruptible(100); - if (time_after(jiffies, t + 40 * HZ)) { + if (jiffies - t > 40 * HZ) { printk(KERN_ERR "IBM PCI tokenring card not responding\n"); release_region(dev->base_addr, STREAMER_IO_SPACE); @@ -601,7 +601,7 @@ static int streamer_open(struct net_device *dev) rc=streamer_reset(dev); } - if (request_irq(dev->irq, &streamer_interrupt, IRQF_SHARED, "lanstreamer", dev)) { + if (request_irq(dev->irq, &streamer_interrupt, SA_SHIRQ, "lanstreamer", dev)) { return -EAGAIN; } #if STREAMER_DEBUG diff --git a/drivers/net/tokenring/madgemc.c b/drivers/net/tokenring/madgemc.c index 666bbaaae..3a25d191e 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, IRQF_SHARED, + if (request_irq(dev->irq, madgemc_interrupt, SA_SHIRQ, "madgemc", dev)) { ret = -EBUSY; goto getout3; @@ -735,7 +735,8 @@ static int __devexit madgemc_remove(struct device *device) struct net_local *tp; struct card_info *card; - BUG_ON(!dev); + if (!dev) + BUG(); tp = dev->priv; card = tp->tmspriv; diff --git a/drivers/net/tokenring/olympic.c b/drivers/net/tokenring/olympic.c index 85831484b..05477d24f 100644 --- a/drivers/net/tokenring/olympic.c +++ b/drivers/net/tokenring/olympic.c @@ -80,6 +80,7 @@ #define OLYMPIC_DEBUG 0 +#include #include #include #include @@ -99,7 +100,6 @@ #include #include #include -#include #include @@ -216,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_release_dev; + goto op_free_dev; } olympic_priv = dev->priv ; @@ -281,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: @@ -307,7 +307,7 @@ static int __devinit olympic_init(struct net_device *dev) t=jiffies; while((readl(olympic_mmio+BCTL)) & BCTL_SOFTRESET) { schedule(); - if(time_after(jiffies, t + 40*HZ)) { + if(jiffies-t > 40*HZ) { printk(KERN_ERR "IBM PCI tokenring card not responding.\n"); return -ENODEV; } @@ -359,7 +359,7 @@ static int __devinit olympic_init(struct net_device *dev) t=jiffies; while (!readl(olympic_mmio+CLKCTL) & CLKCTL_PAUSE) { schedule() ; - if(time_after(jiffies, t + 2*HZ)) { + if(jiffies-t > 2*HZ) { printk(KERN_ERR "IBM Cardbus tokenring adapter not responsing.\n") ; return -ENODEV; } @@ -373,7 +373,7 @@ static int __devinit olympic_init(struct net_device *dev) t=jiffies; while(!((readl(olympic_mmio+SISR_RR)) & SISR_SRB_REPLY)) { schedule(); - if(time_after(jiffies, t + 15*HZ)) { + if(jiffies-t > 15*HZ) { printk(KERN_ERR "IBM PCI tokenring card not responding.\n"); return -ENODEV; } @@ -445,7 +445,7 @@ static int olympic_open(struct net_device *dev) olympic_init(dev); - if(request_irq(dev->irq, &olympic_interrupt, IRQF_SHARED , "olympic", dev)) { + if(request_irq(dev->irq, &olympic_interrupt, SA_SHIRQ , "olympic", dev)) { return -EAGAIN; } @@ -519,7 +519,7 @@ static int olympic_open(struct net_device *dev) olympic_priv->srb_queued=0; break; } - if (time_after(jiffies, t + 10*HZ)) { + if ((jiffies-t) > 10*HZ) { printk(KERN_WARNING "%s: SRB timed out. \n",dev->name) ; olympic_priv->srb_queued=0; break ; diff --git a/drivers/net/tokenring/smctr.c b/drivers/net/tokenring/smctr.c index 85a7f797d..67d2b596c 100644 --- a/drivers/net/tokenring/smctr.c +++ b/drivers/net/tokenring/smctr.c @@ -29,6 +29,7 @@ */ #include +#include #include #include #include @@ -531,7 +532,7 @@ static int __init smctr_chk_mca(struct net_device *dev) dev->irq = 15; break; } - if (request_irq(dev->irq, smctr_interrupt, IRQF_SHARED, smctr_name, dev)) { + if (request_irq(dev->irq, smctr_interrupt, SA_SHIRQ, smctr_name, dev)) { release_region(dev->base_addr, SMCTR_IO_EXTENT); return -ENODEV; } @@ -1061,7 +1062,7 @@ static int __init smctr_chk_isa(struct net_device *dev) goto out2; } - if (request_irq(dev->irq, smctr_interrupt, IRQF_SHARED, smctr_name, dev)) + if (request_irq(dev->irq, smctr_interrupt, SA_SHIRQ, smctr_name, dev)) goto out2; /* Get 58x Rom Base */ @@ -5666,7 +5667,7 @@ module_param_array(io, int, NULL, 0); module_param_array(irq, int, NULL, 0); module_param(ringspeed, int, 0); -static struct net_device * __init setup_card(int n) +static struct net_device *setup_card(int n) { struct net_device *dev = alloc_trdev(sizeof(struct net_local)); int err; @@ -5696,8 +5697,9 @@ out: free_netdev(dev); return ERR_PTR(err); } + -int __init init_module(void) +int 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 292e50ddf..48994b043 100644 --- a/drivers/net/tokenring/smctr_firmware.h +++ b/drivers/net/tokenring/smctr_firmware.h @@ -17,6 +17,7 @@ * - 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 7d3e270c4..ab47c0547 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, IRQF_SHARED, + ret = request_irq(pdev->irq, tms380tr_interrupt, SA_SHIRQ, dev->name, dev); if (ret) goto err_out_region; diff --git a/drivers/net/tulip/de2104x.c b/drivers/net/tulip/de2104x.c index d05c5aa25..2d0cfbcee 100644 --- a/drivers/net/tulip/de2104x.c +++ b/drivers/net/tulip/de2104x.c @@ -31,6 +31,7 @@ #define DRV_VERSION "0.7" #define DRV_RELDATE "Mar 17, 2004" +#include #include #include #include @@ -226,12 +227,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), @@ -401,7 +402,8 @@ static void de_rx (struct de_private *de) unsigned copying_skb, buflen; skb = de->rx_skb[rx_tail].skb; - BUG_ON(!skb); + if (!skb) + BUG(); rmb(); status = le32_to_cpu(de->rx_ring[rx_tail].opts1); if (status & DescOwn) @@ -543,7 +545,8 @@ static void de_tx (struct de_private *de) break; skb = de->tx_skb[tx_tail].skb; - BUG_ON(!skb); + if (!skb) + BUG(); if (unlikely(skb == DE_DUMMY_SKB)) goto next; @@ -786,7 +789,8 @@ static void __de_set_rx_mode (struct net_device *dev) de->tx_head = NEXT_TX(entry); - BUG_ON(TX_BUFFS_AVAIL(de) < 0); + if (TX_BUFFS_AVAIL(de) < 0) + BUG(); if (TX_BUFFS_AVAIL(de) == 0) netif_stop_queue(dev); @@ -857,7 +861,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); } @@ -912,7 +916,8 @@ static void de_set_media (struct de_private *de) unsigned media = de->media_type; u32 macmode = dr32(MacMode); - BUG_ON(de_is_running(de)); + if (de_is_running(de)) + BUG(); if (de->de21040) dw32(CSR11, FULL_DUPLEX_MAGIC); @@ -930,7 +935,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" @@ -965,9 +970,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; @@ -984,7 +989,7 @@ static void de21040_media_timer (unsigned long data) return; } - de_link_down(de); + de_link_down(de); if (de->media_lock) return; @@ -1038,7 +1043,7 @@ static unsigned int de_ok_to_advertise (struct de_private *de, u32 new_media) return 0; break; } - + return 1; } @@ -1049,9 +1054,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 || @@ -1071,7 +1076,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) @@ -1123,7 +1128,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); @@ -1147,8 +1152,9 @@ 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 (!(status & LinkFail)) + BUG(); if (netif_carrier_ok(de->dev)) { de_link_down(de); @@ -1226,7 +1232,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); @@ -1326,11 +1332,11 @@ static void de_clean_rings (struct de_private *de) struct sk_buff *skb = de->tx_skb[i].skb; if ((skb) && (skb != DE_DUMMY_SKB)) { if (skb != DE_SETUP_SKB) { + dev_kfree_skb(skb); de->net_stats.tx_dropped++; pci_unmap_single(de->pdev, de->tx_skb[i].mapping, skb->len, PCI_DMA_TODEVICE); - dev_kfree_skb(skb); } else { pci_unmap_single(de->pdev, de->tx_skb[i].mapping, @@ -1371,7 +1377,7 @@ static int de_open (struct net_device *dev) dw32(IntrMask, 0); - rc = request_irq(dev->irq, de_interrupt, IRQF_SHARED, dev->name, dev); + rc = request_irq(dev->irq, de_interrupt, SA_SHIRQ, dev->name, dev); if (rc) { printk(KERN_ERR "%s: IRQ %d request failure, err=%d\n", dev->name, dev->irq, rc); @@ -1412,7 +1418,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); @@ -1440,7 +1446,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); @@ -1450,7 +1456,7 @@ static void de_tx_timeout (struct net_device *dev) de_init_rings(de); de_init_hw(de); - + netif_wake_queue(dev); } @@ -1458,7 +1464,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); @@ -1473,7 +1479,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; @@ -1488,7 +1494,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 @@ -1528,7 +1534,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; @@ -1553,22 +1559,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; } @@ -1816,7 +1822,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, @@ -1885,7 +1891,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"); @@ -2006,8 +2012,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 (%llx) too small on pci dev %s\n", - (unsigned long long)pci_resource_len(pdev, 1), pci_name(pdev)); + printk(KERN_ERR PFX "MMIO resource (%lx) too small on pci dev %s\n", + pci_resource_len(pdev, 1), pci_name(pdev)); goto err_out_res; } @@ -2015,9 +2021,8 @@ 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 (%llx@%lx) on pci dev %s\n", - (unsigned long long)pci_resource_len(pdev, 1), - pciaddr, pci_name(pdev)); + printk(KERN_ERR PFX "Cannot map PCI MMIO (%lx@%lx) on pci dev %s\n", + pci_resource_len(pdev, 1), pciaddr, pci_name(pdev)); goto err_out_res; } dev->base_addr = (unsigned long) regs; @@ -2087,7 +2092,8 @@ static void __exit de_remove_one (struct pci_dev *pdev) struct net_device *dev = pci_get_drvdata(pdev); struct de_private *de = dev->priv; - BUG_ON(!dev); + if (!dev) + BUG(); unregister_netdev(dev); kfree(de->ee_data); iounmap(de->regs); @@ -2118,7 +2124,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 75ff14a55..ee48bfd67 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 IRQF_SHARED flag into request_interrupt(). + Duh, put the SA_SHIRQ 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 IRQF_DISABLED temporary fix from + Added SA_INTERRUPT 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,6 +443,7 @@ ========================================================================= */ +#include #include #include #include @@ -512,7 +513,7 @@ struct mii_phy { u_char *rst; /* Start of reset sequence in SROM */ u_int mc; /* Media Capabilities */ u_int ana; /* NWay Advertisement */ - u_int fdx; /* Full DupleX capabilities for each media */ + u_int fdx; /* Full DupleX capabilites for each media */ u_int ttm; /* Transmit Threshold Mode for each media */ u_int mci; /* 21142 MII Connector Interrupt info */ }; @@ -583,7 +584,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. @@ -654,7 +655,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 */ @@ -1080,8 +1081,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]; @@ -1101,12 +1102,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; @@ -1115,21 +1116,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; @@ -1170,10 +1171,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); @@ -1218,7 +1219,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; @@ -1251,7 +1252,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 @@ -1259,11 +1260,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); @@ -1273,23 +1274,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) { @@ -1311,18 +1312,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, IRQF_SHARED, + + if (request_irq(dev->irq, (void *)de4x5_interrupt, SA_SHIRQ, lp->adapter_name, dev)) { printk("de4x5_open(): Requested IRQ%d is busy - attemping FAST/SHARE...", dev->irq); - if (request_irq(dev->irq, de4x5_interrupt, IRQF_DISABLED | IRQF_SHARED, + if (request_irq(dev->irq, de4x5_interrupt, SA_INTERRUPT | SA_SHIRQ, lp->adapter_name, dev)) { printk("\n Cannot get IRQ- reconfigure your hardware.\n"); disable_ast(dev); @@ -1339,11 +1340,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)); @@ -1354,7 +1355,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; } @@ -1368,15 +1369,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; } @@ -1387,7 +1388,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) { @@ -1398,7 +1399,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. @@ -1415,23 +1416,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); @@ -1444,18 +1445,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 @@ -1468,9 +1469,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 @@ -1481,7 +1482,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 */ @@ -1508,10 +1509,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 */ } @@ -1520,15 +1521,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 @@ -1545,7 +1546,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; @@ -1553,35 +1554,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", @@ -1602,7 +1603,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); } @@ -1613,11 +1614,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); @@ -1628,7 +1629,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. */ @@ -1645,9 +1646,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 { @@ -1657,14 +1658,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); @@ -1673,13 +1674,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; } @@ -1704,20 +1705,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 */ } @@ -1726,14 +1727,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; } @@ -1745,7 +1746,7 @@ de4x5_tx(struct net_device *dev) else netif_start_queue(dev); } - + return 0; } @@ -1754,9 +1755,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) { @@ -1768,7 +1769,7 @@ de4x5_ast(struct net_device *dev) } lp->linkOK = 0; enable_ast(dev, next_tick); - + return 0; } @@ -1791,11 +1792,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); @@ -1812,7 +1813,7 @@ de4x5_rx_ovfc(struct net_device *dev) } outl(omr, DE4X5_OMR); - + return 0; } @@ -1822,22 +1823,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; @@ -1845,10 +1846,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; } @@ -1857,9 +1858,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; } @@ -1885,7 +1886,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)); @@ -1936,11 +1937,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; @@ -1968,20 +1969,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; @@ -1993,14 +1994,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 @@ -2049,7 +2050,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); @@ -2060,12 +2061,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); } @@ -2076,7 +2077,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; @@ -2101,7 +2102,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); @@ -2130,11 +2131,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; @@ -2162,7 +2163,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); @@ -2175,7 +2176,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; @@ -2253,7 +2254,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; @@ -2266,7 +2267,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); @@ -2282,7 +2283,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__ @@ -2321,7 +2322,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; } @@ -2376,7 +2377,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 @@ -2404,7 +2405,7 @@ autoconf_media(struct net_device *dev) } enable_ast(dev, next_tick); - + return (lp->media); } @@ -2427,7 +2428,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; @@ -2446,36 +2447,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); @@ -2487,13 +2488,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); @@ -2506,7 +2507,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); @@ -2526,7 +2527,7 @@ dc21040_state(struct net_device *dev, int csr13, int csr14, int csr15, int timeo } break; } - + return next_tick; } @@ -2581,7 +2582,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; @@ -2602,7 +2603,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 */ @@ -2622,7 +2623,7 @@ dc21041_autoconf(struct net_device *dev) next_tick = dc21041_autoconf(dev); } break; - + case ANS: if (!lp->tx_enable) { irqs = STS_LNP; @@ -2644,11 +2645,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) { @@ -2678,11 +2679,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) { @@ -2708,11 +2709,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: @@ -2730,7 +2731,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) { @@ -2750,11 +2751,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); @@ -2767,7 +2768,7 @@ dc21041_autoconf(struct net_device *dev) lp->tx_enable = NO; break; } - + return next_tick; } @@ -2783,9 +2784,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; @@ -2812,7 +2813,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); @@ -2830,7 +2831,7 @@ dc21140m_autoconf(struct net_device *dev) next_tick = dc21140m_autoconf(dev); } break; - + case ANS: switch (lp->local_state) { case 0: @@ -2850,7 +2851,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; @@ -2861,7 +2862,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); @@ -2878,10 +2879,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; } @@ -2898,7 +2899,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) { @@ -2932,7 +2933,7 @@ dc21140m_autoconf(struct net_device *dev) } } break; - + case NC: if (lp->media != lp->c_media) { de4x5_dbg_media(dev); @@ -2942,7 +2943,7 @@ dc21140m_autoconf(struct net_device *dev) lp->tx_enable = FALSE; break; } - + return next_tick; } @@ -3001,7 +3002,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); @@ -3013,7 +3014,7 @@ dc2114x_autoconf(struct net_device *dev) next_tick = dc2114x_autoconf(dev); } break; - + case ANS: switch (lp->local_state) { case 0: @@ -3033,7 +3034,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; @@ -3044,7 +3045,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); @@ -3086,11 +3087,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: @@ -3108,7 +3109,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) { @@ -3129,11 +3130,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++; @@ -3160,7 +3161,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 { @@ -3168,7 +3169,7 @@ dc2114x_autoconf(struct net_device *dev) lp->media = INIT; } break; - + case _10Mb: next_tick = 3000; if (!lp->tx_enable) { @@ -3207,7 +3208,7 @@ printk("Huh?: media:%02x\n", lp->media); lp->media = INIT; break; } - + return next_tick; } @@ -3230,7 +3231,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) { @@ -3269,7 +3270,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; @@ -3279,8 +3280,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; @@ -3358,7 +3359,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] */ @@ -3371,22 +3372,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; } @@ -3396,11 +3397,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) { @@ -3408,7 +3409,7 @@ test_tp(struct net_device *dev, s32 msec) } else { lp->timeout = -1; } - + return sisr; } @@ -3435,7 +3436,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 { @@ -3446,7 +3447,7 @@ test_for_100Mb(struct net_device *dev, int msec) } else { lp->timeout = -1; } - + return gep; } @@ -3458,13 +3459,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; } @@ -3478,21 +3479,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; } @@ -3502,7 +3503,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); @@ -3516,7 +3517,7 @@ is_spd_100(struct net_device *dev) spd = (lp->asBitValid & (lp->asPolarity ^ (gep_rd(dev) & lp->asBit))) | (lp->linkOK & ~lp->asBitValid); } - + return spd; } @@ -3525,7 +3526,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); @@ -3546,7 +3547,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); @@ -3569,7 +3570,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) { @@ -3589,24 +3590,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; @@ -3615,7 +3616,7 @@ ping_media(struct net_device *dev, int msec) } lp->timeout = -1; } - + return sisr; } @@ -3667,7 +3668,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 } @@ -3750,23 +3751,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; } @@ -3791,7 +3792,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; @@ -3853,25 +3854,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; } @@ -3881,7 +3882,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; @@ -3889,7 +3890,7 @@ de4x5_setup_intr(struct net_device *dev) outl(sts, DE4X5_STS); ENABLE_IRQs; } - + return; } @@ -3935,17 +3936,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; } @@ -3977,7 +3978,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; @@ -4006,7 +4007,7 @@ PCI_signature(char *name, struct de4x5_private *lp) } else if ((lp->chipset & ~0x00ff) == DC2114x) { lp->useSROM = TRUE; } - + return status; } @@ -4023,7 +4024,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 */ @@ -4048,7 +4049,7 @@ DevicePresent(struct net_device *dev, u_long aprom_addr) } de4x5_dbg_srom((struct de4x5_srom *)&lp->srom); } - + return; } @@ -4070,11 +4071,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); @@ -4132,11 +4133,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); @@ -4155,11 +4156,11 @@ 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. */ - if ( machine_is(powermac) && + if ( (_machine & _MACH_Pmac) && (dev->dev_addr[0] == 0) && (dev->dev_addr[1] == 0xa0) ) { @@ -4244,7 +4245,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) { @@ -4274,7 +4275,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; } @@ -4289,11 +4290,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); } @@ -4303,7 +4304,7 @@ srom_latch(u_int command, u_long addr) sendto_srom(command, addr); sendto_srom(command | DT_CLK, addr); sendto_srom(command, addr); - + return; } @@ -4313,7 +4314,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; } @@ -4321,15 +4322,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; } @@ -4339,17 +4340,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; } @@ -4358,13 +4359,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; } */ @@ -4374,7 +4375,7 @@ sendto_srom(u_int command, u_long addr) { outl(command, addr); udelay(1); - + return; } @@ -4382,10 +4383,10 @@ static int getfrom_srom(u_long addr) { s32 tmp; - + tmp = inl(addr); udelay(1); - + return tmp; } @@ -4402,7 +4403,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; } @@ -4419,7 +4420,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; } @@ -4493,9 +4494,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 */ } @@ -4513,13 +4514,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); @@ -4557,7 +4558,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); @@ -4592,7 +4593,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); @@ -4630,7 +4631,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); @@ -4670,7 +4671,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); @@ -4710,7 +4711,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); @@ -4749,7 +4750,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); @@ -4790,7 +4791,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); @@ -4832,7 +4833,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); @@ -4877,7 +4878,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); @@ -4915,7 +4916,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 */ } @@ -4930,7 +4931,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; } @@ -4939,12 +4940,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; } @@ -4952,12 +4953,12 @@ static void mii_wdata(int data, int len, u_long ioaddr) { int i; - + for (i=0; i>= 1; } - + return; } @@ -4965,13 +4966,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; } @@ -4979,12 +4980,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; } @@ -4992,13 +4993,13 @@ static int mii_swap(int data, int len) { int i, tmp = 0; - + for (i=0; i>= 1; } - + return tmp; } @@ -5006,13 +5007,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; } @@ -5023,7 +5024,7 @@ getfrom_mii(u32 command, u_long ioaddr) udelay(1); outl(command | MII_MDC, ioaddr); udelay(1); - + return ((inl(ioaddr) >> 19) & 1); } @@ -5084,7 +5085,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; @@ -5093,7 +5094,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); } } @@ -5147,12 +5148,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 */ @@ -5169,7 +5170,7 @@ build_setup_frame(struct net_device *dev, int mode) if (i & 0x01) pa += 4; } } - + return pa; /* Points to the next entry */ } @@ -5177,7 +5178,7 @@ static void enable_ast(struct net_device *dev, u32 time_out) { timeout(dev, (void *)&de4x5_ast, (u_long)dev, time_out); - + return; } @@ -5185,9 +5186,9 @@ static void disable_ast(struct net_device *dev) { struct de4x5_private *lp = netdev_priv(dev); - + del_timer(&lp->timer); - + return; } @@ -5206,10 +5207,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); @@ -5262,21 +5263,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; } @@ -5374,7 +5375,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: "); @@ -5412,11 +5413,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; } @@ -5425,7 +5426,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)); @@ -5444,7 +5445,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; } @@ -5452,17 +5453,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" : "???" @@ -5470,7 +5471,7 @@ de4x5_dbg_media(struct net_device *dev) } lp->c_media = lp->media; } - + return; } @@ -5553,7 +5554,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; @@ -5574,7 +5575,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 */ @@ -5616,8 +5617,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 */ @@ -5651,9 +5652,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; @@ -5663,7 +5664,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; @@ -5676,7 +5677,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; @@ -5689,14 +5690,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; @@ -5705,18 +5706,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; @@ -5733,10 +5734,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; @@ -5745,7 +5746,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 57226e5eb..ad37a4074 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 4e5b0f2ac..74e9075d9 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, IRQF_SHARED, dev->name, dev); + ret = request_irq(dev->irq, &dmfe_interrupt, SA_SHIRQ, dev->name, dev); if (ret) return ret; diff --git a/drivers/net/tulip/eeprom.c b/drivers/net/tulip/eeprom.c index 5ffbd5b30..fbd9ab60b 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 99ccf2ebb..bb3558164 100644 --- a/drivers/net/tulip/interrupt.c +++ b/drivers/net/tulip/interrupt.c @@ -16,6 +16,7 @@ #include #include "tulip.h" +#include #include int tulip_rx_copybreak; @@ -138,22 +139,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. */ @@ -179,7 +180,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", @@ -212,7 +213,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)) { @@ -224,17 +225,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; @@ -244,12 +245,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 @@ -258,28 +259,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 ) { @@ -296,20 +297,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 @@ -320,9 +321,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) { @@ -330,29 +331,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; } @@ -520,9 +521,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); @@ -537,17 +538,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); @@ -558,11 +559,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; @@ -736,17 +737,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 e9bc2a958..f53396fe7 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/pnic.c b/drivers/net/tulip/pnic.c index ca7e53246..d9980bde7 100644 --- a/drivers/net/tulip/pnic.c +++ b/drivers/net/tulip/pnic.c @@ -16,7 +16,6 @@ #include #include -#include #include "tulip.h" @@ -69,7 +68,7 @@ void pnic_lnk_change(struct net_device *dev, int csr5) */ if (tulip_media_cap[dev->if_port] & MediaIsMII) return; - if (! tp->nwayset || time_after(jiffies, dev->trans_start + 1*HZ)) { + if (! tp->nwayset || jiffies - dev->trans_start > 1*HZ) { tp->csr6 = 0x00420000 | (tp->csr6 & 0x0000fdff); iowrite32(tp->csr6, ioaddr + CSR6); iowrite32(0x30, ioaddr + CSR12); diff --git a/drivers/net/tulip/pnic2.c b/drivers/net/tulip/pnic2.c index ab985023f..55f4a9a63 100644 --- a/drivers/net/tulip/pnic2.c +++ b/drivers/net/tulip/pnic2.c @@ -199,7 +199,7 @@ void pnic2_lnk_change(struct net_device *dev, int csr5) /* negotiation ended successfully */ /* get the link partners reply and mask out all but - * bits 24-21 which show the partners capabilities + * bits 24-21 which show the partners capabilites * and match those to what we advertised * * then begin to interpret the results of the negotiation. diff --git a/drivers/net/tulip/tulip.h b/drivers/net/tulip/tulip.h index 3bcfbf3d2..05d2d96f7 100644 --- a/drivers/net/tulip/tulip.h +++ b/drivers/net/tulip/tulip.h @@ -16,6 +16,7 @@ #ifndef __NET_TULIP_H__ #define __NET_TULIP_H__ +#include #include #include #include @@ -258,7 +259,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 7351831f5..c67c91251 100644 --- a/drivers/net/tulip/tulip_core.c +++ b/drivers/net/tulip/tulip_core.c @@ -14,6 +14,7 @@ */ +#include #define DRV_NAME "tulip" #ifdef CONFIG_TULIP_NAPI @@ -489,7 +490,7 @@ tulip_open(struct net_device *dev) { int retval; - if ((retval = request_irq(dev->irq, &tulip_interrupt, IRQF_SHARED, dev->name, dev))) + if ((retval = request_irq(dev->irq, &tulip_interrupt, SA_SHIRQ, dev->name, dev))) return retval; tulip_init_ring (dev); @@ -1223,7 +1224,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) @@ -1296,7 +1297,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 @@ -1349,10 +1350,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%llx@0x%llx) too small, " + printk (KERN_ERR PFX "%s: I/O region (0x%lx@0x%lx) too small, " "aborting\n", pci_name(pdev), - (unsigned long long)pci_resource_len (pdev, 0), - (unsigned long long)pci_resource_start (pdev, 0)); + pci_resource_len (pdev, 0), + pci_resource_start (pdev, 0)); goto err_out_free_netdev; } @@ -1482,6 +1483,14 @@ 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. */ @@ -1491,7 +1500,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. */ @@ -1549,14 +1558,10 @@ 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) { - 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); + if ((pcp != NULL) && prom_getproplen(pcp->prom_node, + "local-mac-address") == 6) { + prom_getproperty(pcp->prom_node, "local-mac-address", + dev->dev_addr, 6); } #endif #if defined(__i386__) || defined(__x86_64__) /* Patch up x86 BIOS bug. */ @@ -1770,7 +1775,7 @@ static int tulip_resume(struct pci_dev *pdev) pci_enable_device(pdev); - if ((retval = request_irq(dev->irq, &tulip_interrupt, IRQF_SHARED, dev->name, dev))) { + if ((retval = request_irq(dev->irq, &tulip_interrupt, SA_SHIRQ, 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 fd64b2b3e..238e9c72c 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, IRQF_SHARED, dev->name, dev); + ret = request_irq(dev->irq, &uli526x_interrupt, SA_SHIRQ, 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 eba9083da..5b1af3986 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[] = +static char version[] __devinitdata = 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,38 +207,53 @@ Test with 'ping -s 10000' on a fast computer. */ - + /* PCI probe table. */ -enum chip_capability_flags { - CanHaveMII=1, HasBrokenTx=2, AlwaysFDX=4, FDXOnNoMII=8, +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 -static const struct pci_device_id w840_pci_tbl[] = { +static 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; - int drv_flags; /* Driver use, intended as capability flags. */ + 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. */ }; - -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. */ +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. */ }; /* This driver was written to use PCI memory space, however some x86 systems @@ -359,7 +374,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) @@ -396,7 +411,7 @@ static int __devinit w840_probe1 (struct pci_dev *pdev, #ifdef USE_IO_OPS bar = 0; #endif - ioaddr = pci_iomap(pdev, bar, netdev_res_size); + ioaddr = pci_iomap(pdev, bar, pci_id_tbl[chip_idx].io_size); if (!ioaddr) goto err_out_free_res; @@ -419,7 +434,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) @@ -495,7 +510,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. */ @@ -645,7 +660,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); @@ -655,7 +670,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, IRQF_SHARED, dev->name, dev); + i = request_irq(dev->irq, &intr_handler, SA_SHIRQ, dev->name, dev); if (i) goto out_err; @@ -716,7 +731,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". @@ -746,7 +761,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; } @@ -835,7 +850,7 @@ static void init_rxtx_rings(struct net_device *dev) break; skb->dev = dev; /* Mark as being used by this device. */ np->rx_addr[i] = pci_map_single(np->pci_dev,skb->data, - np->rx_buf_sz,PCI_DMA_FROMDEVICE); + skb->len,PCI_DMA_FROMDEVICE); np->rx_ring[i].buffer1 = np->rx_addr[i]; np->rx_ring[i].status = DescOwn; @@ -932,7 +947,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)); @@ -1301,7 +1316,7 @@ static int netdev_rx(struct net_device *dev) skb->dev = dev; /* Mark as being used by this device. */ np->rx_addr[entry] = pci_map_single(np->pci_dev, skb->data, - np->rx_buf_sz, PCI_DMA_FROMDEVICE); + skb->len, PCI_DMA_FROMDEVICE); np->rx_ring[entry].buffer1 = np->rx_addr[entry]; } wmb(); @@ -1569,7 +1584,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); @@ -1590,11 +1605,11 @@ static void __devexit w840_remove1 (struct pci_dev *pdev) * - get_stats: * spin_lock_irq(np->lock), doesn't touch hw if not present * - hard_start_xmit: - * synchronize_irq + netif_tx_disable; + * netif_stop_queue + spin_unlock_wait(&dev->xmit_lock); * - tx_timeout: - * netif_device_detach + netif_tx_disable; + * netif_device_detach + spin_unlock_wait(&dev->xmit_lock); * - set_multicast_list - * netif_device_detach + netif_tx_disable; + * netif_device_detach + spin_unlock_wait(&dev->xmit_lock); * - interrupt handler * doesn't touch hw if not present, synchronize_irq waits for * running instances of the interrupt handler. @@ -1620,16 +1635,17 @@ static int w840_suspend (struct pci_dev *pdev, pm_message_t state) netif_device_detach(dev); update_csr6(dev, 0); iowrite32(0, ioaddr + IntrEnable); + netif_stop_queue(dev); spin_unlock_irq(&np->lock); + spin_unlock_wait(&dev->xmit_lock); synchronize_irq(dev->irq); - netif_tx_disable(dev); np->stats.rx_missed_errors += ioread32(ioaddr + RxMissed) & 0xffff; /* no more hardware accesses behind this line. */ - BUG_ON(np->csr6); + if (np->csr6) BUG(); if (ioread32(ioaddr + IntrEnable)) BUG(); /* pci_power_off(pdev, -1); */ diff --git a/drivers/net/tulip/xircom_cb.c b/drivers/net/tulip/xircom_cb.c index cf43390d2..60d1e05ab 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. @@ -32,9 +32,6 @@ #include #include -#ifdef CONFIG_NET_POLL_CONTROLLER -#include -#endif #ifdef DEBUG #define enter(x) printk("Enter: %s, %s line %i\n",x,__FILE__,__LINE__) @@ -93,7 +90,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 +150,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 +171,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 +193,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 +206,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 +214,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 +239,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 +262,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 +282,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 +329,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 +343,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 +363,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 +390,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 +430,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 +454,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, IRQF_SHARED, dev->name, dev); + retval = request_irq(dev->irq, &xircom_interrupt, SA_SHIRQ, dev->name, dev); if (retval) { leave("xircom_open - No IRQ"); return retval; } - + xircom_up(xp); xp->open = 1; leave("xircom_open"); @@ -473,31 +470,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 +503,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 +537,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); @@ -601,8 +598,10 @@ static void setup_descriptors(struct xircom_private *card) enter("setup_descriptors"); - BUG_ON(card->rx_buffer == NULL); - BUG_ON(card->tx_buffer == NULL); + if (card->rx_buffer == NULL) + BUG(); + if (card->tx_buffer == NULL) + BUG(); /* Receive descriptors */ memset(card->rx_buffer, 0, 128); /* clear the descriptors */ @@ -617,23 +616,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 +640,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 +747,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 +761,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 +804,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 +839,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 +855,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 +895,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 +989,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 +1030,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 +1041,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 +1050,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 +1070,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 +1080,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 +1094,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 +1135,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 +1162,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 +1184,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 +1215,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 +1233,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,20 +1257,21 @@ static void investigate_write_descriptor(struct net_device *dev, struct xircom_p } leave("investigate_write_descriptor"); - + } static int __init xircom_init(void) { - return pci_register_driver(&xircom_ops); + pci_register_driver(&xircom_ops); + return 0; } 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 17ca7dc42..887d7245f 100644 --- a/drivers/net/tulip/xircom_tulip_cb.c +++ b/drivers/net/tulip/xircom_tulip_cb.c @@ -10,11 +10,26 @@ 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.92" -#define DRV_RELDATE "June 27, 2006" +#define DRV_VERSION "0.91+LK1.1" +#define DRV_RELDATE "October 11, 2001" + +#define CARDBUS 1 /* A few user-configurable values. */ @@ -83,6 +98,7 @@ static int csr0 = 0x00A00000 | 0x4800; /* PCI registers */ #define PCI_POWERMGMT 0x40 +#include #include #include #include @@ -291,10 +307,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. */ @@ -792,7 +808,7 @@ xircom_open(struct net_device *dev) { struct xircom_private *tp = netdev_priv(dev); - if (request_irq(dev->irq, &xircom_interrupt, IRQF_SHARED, dev->name, dev)) + if (request_irq(dev->irq, &xircom_interrupt, SA_SHIRQ, dev->name, dev)) return -EAGAIN; xircom_up(dev); @@ -893,8 +909,10 @@ 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]); } @@ -914,10 +932,12 @@ 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 329d9feb9..a1ed2d983 100644 --- a/drivers/net/tun.c +++ b/drivers/net/tun.c @@ -39,6 +39,7 @@ #define DRV_DESCRIPTION "Universal TUN/TAP device driver" #define DRV_COPYRIGHT "(C) 1999-2004 Max Krasnyansky " +#include #include #include #include @@ -489,9 +490,6 @@ 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 */ @@ -779,6 +777,7 @@ 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 4103c3717..4c76cb794 100644 --- a/drivers/net/typhoon.c +++ b/drivers/net/typhoon.c @@ -134,7 +134,7 @@ static const int multicast_filter_limit = 32; #include "typhoon.h" #include "typhoon-firmware.h" -static const char version[] __devinitdata = +static char version[] __devinitdata = "typhoon.c: version " DRV_MODULE_VERSION " (" DRV_MODULE_RELDATE ")\n"; MODULE_AUTHOR("David Dillow "); @@ -178,7 +178,7 @@ enum typhoon_cards { }; /* directly indexed by enum typhoon_cards, above */ -static const struct typhoon_card_info typhoon_card_info[] __devinitdata = { +static struct typhoon_card_info typhoon_card_info[] __devinitdata = { { "3Com Typhoon (3C990-TX)", TYPHOON_CRYPTO_NONE}, { "3Com Typhoon (3CR990-TX-95)", @@ -208,7 +208,7 @@ static const struct typhoon_card_info typhoon_card_info[] __devinitdata = { }; /* Notes on the new subsystem numbering scheme: - * bits 0-1 indicate crypto capabilities: (0) variable, (1) DES, or (2) 3DES + * bits 0-1 indicate crypto capabilites: (0) variable, (1) DES, or (2) 3DES * bit 4 indicates if this card has secured firmware (we don't support it) * bit 8 indicates if this is a (0) copper or (1) fiber card * bits 12-16 indicate card type: (0) client and (1) server @@ -340,7 +340,7 @@ enum state_values { #endif #if defined(NETIF_F_TSO) -#define skb_tso_size(x) (skb_shinfo(x)->gso_size) +#define skb_tso_size(x) (skb_shinfo(x)->tso_size) #define TSO_NUM_DESCRIPTORS 2 #define TSO_OFFLOAD_ON TYPHOON_OFFLOAD_TCP_SEGMENT #else @@ -788,7 +788,7 @@ typhoon_start_tx(struct sk_buff *skb, struct net_device *dev) /* we have two rings to choose from, but we only use txLo for now * If we start using the Hi ring as well, we'll need to update * typhoon_stop_runtime(), typhoon_interrupt(), typhoon_num_free_tx(), - * and TXHI_ENTRIES to match, as well as update the TSO code below + * and TXHI_ENTIRES to match, as well as update the TSO code below * to get the right DMA address */ txRing = &tp->txLoRing; @@ -805,7 +805,7 @@ typhoon_start_tx(struct sk_buff *skb, struct net_device *dev) * If problems develop with TSO, check this first. */ numDesc = skb_shinfo(skb)->nr_frags + 1; - if (skb_is_gso(skb)) + if(skb_tso_size(skb)) numDesc++; /* When checking for free space in the ring, we need to also @@ -845,7 +845,7 @@ typhoon_start_tx(struct sk_buff *skb, struct net_device *dev) TYPHOON_TX_PF_VLAN_TAG_SHIFT); } - if (skb_is_gso(skb)) { + if(skb_tso_size(skb)) { first_txd->processFlags |= TYPHOON_TX_PF_TCP_SEGMENT; first_txd->numDesc++; @@ -2131,7 +2131,7 @@ typhoon_open(struct net_device *dev) goto out_sleep; } - err = request_irq(dev->irq, &typhoon_interrupt, IRQF_SHARED, + err = request_irq(dev->irq, &typhoon_interrupt, SA_SHIRQ, dev->name, dev); if(err < 0) goto out_sleep; @@ -2568,10 +2568,9 @@ 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%llx, ", + printk(KERN_INFO "%s: %s at %s 0x%lx, ", dev->name, typhoon_card_info[card_id].name, - use_mmio ? "MMIO" : "IO", - (unsigned long long)pci_resource_start(pdev, use_mmio)); + use_mmio ? "MMIO" : "IO", 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 ae971080e..56864ff3f 100644 --- a/drivers/net/via-rhine.c +++ b/drivers/net/via-rhine.c @@ -25,13 +25,117 @@ 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 - [link no longer provides useful info -jgarzik] + + + 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. */ #define DRV_NAME "via-rhine" -#define DRV_VERSION "1.4.1" -#define DRV_RELDATE "July-24-2006" +#define DRV_VERSION "1.2.0-2.6" +#define DRV_RELDATE "June-10-2004" /* A few user-configurable values. @@ -44,10 +148,6 @@ 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. @@ -67,11 +167,7 @@ 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. */ @@ -124,11 +220,9 @@ 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 @@ -262,11 +356,12 @@ enum rhine_quirks { /* Beware of PCI posted writes */ #define IOSYNC do { ioread8(ioaddr + StationAddr); } while (0) -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 */ +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 */ { } /* terminate list */ }; MODULE_DEVICE_TABLE(pci, rhine_pci_tbl); @@ -375,7 +470,7 @@ struct rhine_private { struct sk_buff *tx_skbuff[TX_RING_SIZE]; dma_addr_t tx_skbuff_dma[TX_RING_SIZE]; - /* Tx bounce buffers (Rhine-I only) */ + /* Tx bounce buffers */ unsigned char *tx_buf[TX_RING_SIZE]; unsigned char *tx_bufs; dma_addr_t tx_bufs_dma; @@ -396,6 +491,8 @@ struct rhine_private { u8 tx_thresh, rx_thresh; struct mii_if_info mii_if; + struct work_struct tx_timeout_task; + struct work_struct check_media_task; void __iomem *base; }; @@ -403,10 +500,12 @@ static int mdio_read(struct net_device *dev, int phy_id, int location); static void mdio_write(struct net_device *dev, int phy_id, int location, int value); static int rhine_open(struct net_device *dev); static void rhine_tx_timeout(struct net_device *dev); +static void rhine_tx_timeout_task(struct net_device *dev); +static void rhine_check_media_task(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 int rhine_rx(struct net_device *dev, int limit); +static void rhine_rx(struct net_device *dev); 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); @@ -574,32 +673,6 @@ 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); @@ -779,14 +852,16 @@ 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; + INIT_WORK(&rp->tx_timeout_task, + (void (*)(void *))rhine_tx_timeout_task, dev); + + INIT_WORK(&rp->check_media_task, + (void (*)(void *))rhine_check_media_task, dev); + /* dev->name not defined before register_netdev()! */ rc = register_netdev(dev); if (rc) @@ -829,9 +904,6 @@ 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; @@ -972,8 +1044,7 @@ static void alloc_tbufs(struct net_device* dev) rp->tx_ring[i].desc_length = cpu_to_le32(TXDESC); next += sizeof(struct tx_desc); rp->tx_ring[i].next_desc = cpu_to_le32(next); - if (rp->quirks & rqRhineI) - rp->tx_buf[i] = &rp->tx_bufs[i * PKT_BUF_SZ]; + rp->tx_buf[i] = &rp->tx_bufs[i * PKT_BUF_SZ]; } rp->tx_ring[i-1].next_desc = cpu_to_le32(rp->tx_ring_dma); @@ -1015,25 +1086,11 @@ static void rhine_check_media(struct net_device *dev, unsigned int init_media) else iowrite8(ioread8(ioaddr + ChipCmd1) & ~Cmd1FDuplex, ioaddr + ChipCmd1); - if (debug > 1) - printk(KERN_INFO "%s: force_media %d, carrier %d\n", dev->name, - rp->mii_if.force_media, netif_carrier_ok(dev)); } -/* Called after status of force_media possibly changed */ -static void rhine_set_carrier(struct mii_if_info *mii) +static void rhine_check_media_task(struct net_device *dev) { - if (mii->force_media) { - /* autoneg is off: Link is always assumed to be up */ - if (!netif_carrier_ok(mii->dev)) - netif_carrier_on(mii->dev); - } - else /* Let MMI library update carrier status */ - rhine_check_media(mii->dev, 0); - if (debug > 1) - printk(KERN_INFO "%s: force_media %d, carrier %d\n", - mii->dev->name, mii->force_media, - netif_carrier_ok(mii->dev)); + rhine_check_media(dev, 0); } static void init_registers(struct net_device *dev) @@ -1057,8 +1114,6 @@ 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 | @@ -1091,8 +1146,8 @@ static void rhine_disable_linkmon(void __iomem *ioaddr, u32 quirks) if (quirks & rqRhineI) { iowrite8(0x01, ioaddr + MIIRegAddr); // MII_BMSR - /* Can be called from ISR. Evil. */ - mdelay(1); + /* Do not call from ISR! */ + msleep(1); /* 0x80 must be set immediately before turning it off */ iowrite8(0x80, ioaddr + MIICmd); @@ -1150,7 +1205,7 @@ static int rhine_open(struct net_device *dev) void __iomem *ioaddr = rp->base; int rc; - rc = request_irq(rp->pdev->irq, &rhine_interrupt, IRQF_SHARED, dev->name, + rc = request_irq(rp->pdev->irq, &rhine_interrupt, SA_SHIRQ, dev->name, dev); if (rc) return rc; @@ -1180,6 +1235,16 @@ static int rhine_open(struct net_device *dev) } static void rhine_tx_timeout(struct net_device *dev) +{ + struct rhine_private *rp = netdev_priv(dev); + + /* + * Move bulk of work outside of interrupt context + */ + schedule_work(&rp->tx_timeout_task); +} + +static void rhine_tx_timeout_task(struct net_device *dev) { struct rhine_private *rp = netdev_priv(dev); void __iomem *ioaddr = rp->base; @@ -1224,8 +1289,11 @@ 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_padto(skb, ETH_ZLEN)) - return 0; + if (skb->len < ETH_ZLEN) { + skb = skb_padto(skb, ETH_ZLEN); + if (skb == NULL) + return 0; + } rp->tx_skbuff[entry] = skb; @@ -1313,18 +1381,8 @@ 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)) { -#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 - } + IntrRxWakeUp | IntrRxEmpty | IntrRxNoBuf)) + rhine_rx(dev); if (intr_status & (IntrTxErrSummary | IntrTxDone)) { if (intr_status & IntrTxErrSummary) { @@ -1422,12 +1480,13 @@ static void rhine_tx(struct net_device *dev) spin_unlock(&rp->lock); } -/* Process up to limit frames from receive ring */ -static int rhine_rx(struct net_device *dev, int limit) +/* 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) { 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", @@ -1436,18 +1495,16 @@ static int rhine_rx(struct net_device *dev, int limit) } /* If EOP is set on the next entry, it's a new packet. Send it up. */ - for (count = 0; count < limit; ++count) { + while (!(rp->rx_head_desc->rx_status & cpu_to_le32(DescOwn))) { 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 " @@ -1516,11 +1573,7 @@ static int rhine_rx(struct net_device *dev, int limit) 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++; @@ -1547,8 +1600,6 @@ static int rhine_rx(struct net_device *dev, int limit) } rp->rx_ring[entry].rx_status = cpu_to_le32(DescOwn); } - - return count; } /* @@ -1606,7 +1657,7 @@ static void rhine_error(struct net_device *dev, int intr_status) spin_lock(&rp->lock); if (intr_status & IntrLinkChange) - rhine_check_media(dev, 0); + schedule_work(&rp->check_media_task); if (intr_status & IntrStatsMax) { rp->stats.rx_crc_errors += ioread16(ioaddr + RxCRCErrs); rp->stats.rx_missed_errors += ioread16(ioaddr + RxMissed); @@ -1737,7 +1788,6 @@ static int netdev_set_settings(struct net_device *dev, struct ethtool_cmd *cmd) spin_lock_irq(&rp->lock); rc = mii_ethtool_sset(&rp->mii_if, cmd); spin_unlock_irq(&rp->lock); - rhine_set_carrier(&rp->mii_if); return rc; } @@ -1825,7 +1875,6 @@ static int netdev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) spin_lock_irq(&rp->lock); rc = generic_mii_ioctl(&rp->mii_if, if_mii(rq), cmd, NULL); spin_unlock_irq(&rp->lock); - rhine_set_carrier(&rp->mii_if); return rc; } @@ -1838,7 +1887,6 @@ 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, " @@ -1857,6 +1905,9 @@ static int rhine_close(struct net_device *dev) spin_unlock_irq(&rp->lock); free_irq(rp->pdev->irq, dev); + + flush_scheduled_work(); + free_rbufs(dev); free_tbufs(dev); free_ring(dev); @@ -1920,8 +1971,7 @@ static void rhine_shutdown (struct pci_dev *pdev) } /* Hit power state D3 (sleep) */ - if (!avoid_D3) - iowrite8(ioread8(ioaddr + StickyHW) | 0x03, ioaddr + StickyHW); + iowrite8(ioread8(ioaddr + StickyHW) | 0x03, ioaddr + StickyHW); /* TODO: Check use of pci_enable_wake() */ @@ -1958,7 +2008,7 @@ static int rhine_resume(struct pci_dev *pdev) if (!netif_running(dev)) return 0; - if (request_irq(dev->irq, rhine_interrupt, IRQF_SHARED, dev->name, dev)) + if (request_irq(dev->irq, rhine_interrupt, SA_SHIRQ, 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 aa9cd92f4..fb44006dd 100644 --- a/drivers/net/via-velocity.c +++ b/drivers/net/via-velocity.c @@ -47,6 +47,7 @@ #include #include +#include #include #include #include @@ -64,6 +65,7 @@ #include #include #include +#include #include #include #include @@ -229,8 +231,7 @@ 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, - const struct velocity_info_tbl *info); +static void velocity_init_info(struct pci_dev *pdev, struct velocity_info *vptr, 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); @@ -295,9 +296,9 @@ static void velocity_unregister_notifier(void) * Internal board variants. At the moment we have only one */ -static const struct velocity_info_tbl chip_info_table[] __devinitdata = { - {CHIP_TYPE_VT6110, "VIA Networking Velocity Family Gigabit Ethernet Adapter", 1, 0x00FFFFFFUL}, - { } +static struct velocity_info_tbl chip_info_table[] = { + {CHIP_TYPE_VT6110, "VIA Networking Velocity Family Gigabit Ethernet Adapter", 256, 1, 0x00FFFFFFUL}, + {0, NULL} }; /* @@ -305,9 +306,10 @@ static const struct velocity_info_tbl chip_info_table[] __devinitdata = { * device driver. Used for hotplug autoloading. */ -static const struct pci_device_id velocity_id_table[] __devinitdata = { - { PCI_DEVICE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_612X) }, - { } +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, } }; MODULE_DEVICE_TABLE(pci, velocity_id_table); @@ -341,7 +343,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 = netdev_priv(dev); + struct velocity_info *vptr = dev->priv; #ifdef CONFIG_PM unsigned long flags; @@ -686,23 +688,21 @@ static int __devinit velocity_found1(struct pci_dev *pdev, const struct pci_devi static int first = 1; struct net_device *dev; int i; - const struct velocity_info_tbl *info = &chip_info_table[ent->driver_data]; + struct velocity_info_tbl *info = (struct velocity_info_tbl *) 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) { - dev_notice(&pdev->dev, "already found %d NICs.\n", - velocity_nics); + printk(KERN_NOTICE VELOCITY_NAME ": already found %d NICs.\n", + velocity_nics); return -ENODEV; } dev = alloc_etherdev(sizeof(struct velocity_info)); - if (!dev) { - dev_err(&pdev->dev, "allocate net device failed.\n"); + + if (dev == NULL) { + printk(KERN_ERR VELOCITY_NAME ": 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 = netdev_priv(dev); + vptr = dev->priv; 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) { - /* error message already printed */ + printk(KERN_ERR VELOCITY_NAME ": Failed to find PCI device.\n"); goto err_disable; } ret = pci_request_regions(pdev, VELOCITY_NAME); if (ret < 0) { - dev_err(&pdev->dev, "No PCI resources.\n"); + printk(KERN_ERR VELOCITY_NAME ": Failed to find PCI device.\n"); goto err_disable; } - regs = ioremap(vptr->memaddr, VELOCITY_IO_SIZE); + regs = ioremap(vptr->memaddr, vptr->io_size); if (regs == NULL) { ret = -EIO; goto err_release_res; @@ -861,14 +861,13 @@ 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, - const struct velocity_info_tbl *info) +static void __devinit velocity_init_info(struct pci_dev *pdev, struct velocity_info *vptr, 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); @@ -886,7 +885,8 @@ static void __devinit velocity_init_info(struct pci_dev *pdev, 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,20 +894,24 @@ 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)) { - dev_err(&pdev->dev, - "region #0 is not an I/O resource, aborting.\n"); + 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)); return -EINVAL; } - if ((pci_resource_flags(pdev, 1) & IORESOURCE_IO)) { - dev_err(&pdev->dev, - "region #1 is an I/O resource, aborting.\n"); + if((pci_resource_flags(pdev, 1) & IORESOURCE_IO)) + { + printk(KERN_ERR "%s: region #1 is an I/O resource, aborting.\n", + pci_name(pdev)); return -EINVAL; } - if (pci_resource_len(pdev, 1) < VELOCITY_IO_SIZE) { - dev_err(&pdev->dev, "region #1 is too small.\n"); + if(pci_resource_len(pdev, 1) < 256) + { + printk(KERN_ERR "%s: region #1 is too small.\n", + pci_name(pdev)); return -EINVAL; } vptr->pdev = pdev; @@ -1726,7 +1730,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 = netdev_priv(dev); + struct velocity_info *vptr = dev->priv; int ret; vptr->rx_buf_sz = (dev->mtu <= 1504 ? PKT_BUF_SZ : dev->mtu + 32); @@ -1748,7 +1752,7 @@ static int velocity_open(struct net_device *dev) velocity_init_registers(vptr, VELOCITY_INIT_COLD); - ret = request_irq(vptr->pdev->irq, &velocity_intr, IRQF_SHARED, + ret = request_irq(vptr->pdev->irq, &velocity_intr, SA_SHIRQ, dev->name, dev); if (ret < 0) { /* Power down the chip */ @@ -1783,7 +1787,7 @@ err_free_desc_rings: static int velocity_change_mtu(struct net_device *dev, int new_mtu) { - struct velocity_info *vptr = netdev_priv(dev); + struct velocity_info *vptr = dev->priv; unsigned long flags; int oldmtu = dev->mtu; int ret = 0; @@ -1859,7 +1863,7 @@ static void velocity_shutdown(struct velocity_info *vptr) static int velocity_close(struct net_device *dev) { - struct velocity_info *vptr = netdev_priv(dev); + struct velocity_info *vptr = dev->priv; netif_stop_queue(dev); velocity_shutdown(vptr); @@ -1892,7 +1896,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 = netdev_priv(dev); + struct velocity_info *vptr = dev->priv; int qnum = 0; struct tx_desc *td_ptr; struct velocity_td_info *tdinfo; @@ -1901,13 +1905,6 @@ static int velocity_xmit(struct sk_buff *skb, struct net_device *dev) int pktlen = skb->len; -#ifdef VELOCITY_ZERO_COPY_SUPPORT - if (skb_shinfo(skb)->nr_frags > 6 && __skb_linearize(skb)) { - kfree_skb(skb); - return 0; - } -#endif - spin_lock_irqsave(&vptr->lock, flags); index = vptr->td_curr[qnum]; @@ -1923,6 +1920,8 @@ static int velocity_xmit(struct sk_buff *skb, struct net_device *dev) */ if (pktlen < ETH_ZLEN) { /* Cannot occur until ZC support */ + if(skb_linearize(skb, GFP_ATOMIC)) + return 0; pktlen = ETH_ZLEN; memcpy(tdinfo->buf, skb->data, skb->len); memset(tdinfo->buf + skb->len, 0, ETH_ZLEN - skb->len); @@ -1940,6 +1939,7 @@ static int velocity_xmit(struct sk_buff *skb, struct net_device *dev) int nfrags = skb_shinfo(skb)->nr_frags; tdinfo->skb = skb; if (nfrags > 6) { + skb_linearize(skb, GFP_ATOMIC); memcpy(tdinfo->buf, skb->data, skb->len); tdinfo->skb_dma[0] = tdinfo->buf_dma; td_ptr->tdesc0.pktsize = @@ -2047,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 = netdev_priv(dev); + struct velocity_info *vptr = dev->priv; u32 isr_status; int max_count = 0; @@ -2102,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 = netdev_priv(dev); + struct velocity_info *vptr = dev->priv; struct mac_regs __iomem * regs = vptr->mac_regs; u8 rx_mode; int i; @@ -2151,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 = netdev_priv(dev); + struct velocity_info *vptr = dev->priv; /* If the hardware is down, don't touch MII */ if(!netif_running(dev)) @@ -2194,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 = netdev_priv(dev); + struct velocity_info *vptr = dev->priv; int ret; /* If we are asked for information and the device is power @@ -2823,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 = netdev_priv(dev); + struct velocity_info *vptr = dev->priv; if (!netif_running(dev)) pci_set_power_state(vptr->pdev, PCI_D0); return 0; @@ -2839,14 +2839,14 @@ static int velocity_ethtool_up(struct net_device *dev) static void velocity_ethtool_down(struct net_device *dev) { - struct velocity_info *vptr = netdev_priv(dev); + struct velocity_info *vptr = dev->priv; 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 = netdev_priv(dev); + struct velocity_info *vptr = dev->priv; struct mac_regs __iomem * regs = vptr->mac_regs; u32 status; status = check_connection_type(vptr->mac_regs); @@ -2880,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 = netdev_priv(dev); + struct velocity_info *vptr = dev->priv; u32 curr_status; u32 new_status = 0; int ret = 0; @@ -2903,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 = netdev_priv(dev); + struct velocity_info *vptr = dev->priv; struct mac_regs __iomem * regs = vptr->mac_regs; 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 = netdev_priv(dev); + struct velocity_info *vptr = dev->priv; strcpy(info->driver, VELOCITY_NAME); strcpy(info->version, VELOCITY_VERSION); strcpy(info->bus_info, pci_name(vptr->pdev)); @@ -2918,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 = netdev_priv(dev); + struct velocity_info *vptr = dev->priv; wol->supported = WAKE_PHY | WAKE_MAGIC | WAKE_UCAST | WAKE_ARP; wol->wolopts |= WAKE_MAGIC; /* @@ -2934,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 = netdev_priv(dev); + struct velocity_info *vptr = dev->priv; if (!(wol->wolopts & (WAKE_PHY | WAKE_MAGIC | WAKE_UCAST | WAKE_ARP))) return -EFAULT; @@ -2999,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 = netdev_priv(dev); + struct velocity_info *vptr = dev->priv; 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 496c3d597..d9a774b91 100644 --- a/drivers/net/via-velocity.h +++ b/drivers/net/via-velocity.h @@ -31,8 +31,6 @@ #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 @@ -309,7 +307,7 @@ enum velocity_owner { #define TX_QUEUE_NO 4 #define MAX_HW_MIB_COUNTER 32 -#define VELOCITY_MIN_MTU (64) +#define VELOCITY_MIN_MTU (1514-14) #define VELOCITY_MAX_MTU (9000) /* @@ -1193,6 +1191,7 @@ enum chip_type { struct velocity_info_tbl { enum chip_type chip_id; char *name; + int io_size; int txqueue; u32 flags; }; @@ -1752,6 +1751,7 @@ struct velocity_info { struct mac_regs __iomem * mac_regs; unsigned long memaddr; unsigned long ioaddr; + u32 io_size; u8 rev_id; diff --git a/drivers/net/wan/Kconfig b/drivers/net/wan/Kconfig index 54b8e492e..18c27e1e7 100644 --- a/drivers/net/wan/Kconfig +++ b/drivers/net/wan/Kconfig @@ -134,6 +134,18 @@ 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" @@ -398,6 +410,103 @@ config WAN_ROUTER_DRIVERS If unsure, say N. +config VENDOR_SANGOMA + tristate "Sangoma WANPIPE(tm) multiprotocol cards" + depends on WAN_ROUTER_DRIVERS && WAN_ROUTER && (PCI || ISA) && BROKEN + ---help--- + Driver for S514-PCI/ISA Synchronous Data Link Adapters (SDLA). + + WANPIPE from Sangoma Technologies Inc. + is a family of intelligent multiprotocol WAN adapters with data + transfer rates up to 4Mbps. Cards support: + + - X.25, Frame Relay, PPP, Cisco HDLC protocols. + + - API for protocols like HDLC (LAPB), HDLC Streaming, X.25, + Frame Relay and BiSync. + + - Ethernet Bridging over Frame Relay protocol. + + - MULTILINK PPP + + - Async PPP (Modem Dialup) + + The next questions will ask you about the protocols you want + the driver to support. + + If you have one or more of these cards, say M to this option; + and read . + + To compile this driver as a module, choose M here: the + module will be called wanpipe. + +config WANPIPE_CHDLC + bool "WANPIPE Cisco HDLC support" + depends on VENDOR_SANGOMA + ---help--- + Connect a WANPIPE card to a leased line using the Cisco HDLC. + + - Supports Dual Port Cisco HDLC on the S514-PCI/S508-ISA cards + which allows user to build applications using the HDLC streaming API. + + - CHDLC Streaming MULTILINK PPP that can bind multiple WANPIPE T1 + cards into a single logical channel. + + Say Y and the Cisco HDLC support, HDLC streaming API and + MULTILINK PPP will be included in the driver. + +config WANPIPE_FR + bool "WANPIPE Frame Relay support" + depends on VENDOR_SANGOMA + help + Connect a WANPIPE card to a Frame Relay network, or use Frame Felay + API to develop custom applications. + + Contains the Ethernet Bridging over Frame Relay feature, where + a WANPIPE frame relay link can be directly connected to the Linux + kernel bridge. The Frame Relay option is supported on S514-PCI + and S508-ISA cards. + + Say Y and the Frame Relay support will be included in the driver. + +config WANPIPE_X25 + bool "WANPIPE X.25 support" + depends on VENDOR_SANGOMA + help + Connect a WANPIPE card to an X.25 network. + + Includes the X.25 API support for custom applications over the + X.25 protocol. The X.25 option is supported on S514-PCI and + S508-ISA cards. + + Say Y and the X.25 support will be included in the driver. + +config WANPIPE_PPP + bool "WANPIPE PPP support" + depends on VENDOR_SANGOMA + help + Connect a WANPIPE card to a leased line using Point-to-Point + Protocol (PPP). + + The PPP option is supported on S514-PCI/S508-ISA cards. + + Say Y and the PPP support will be included in the driver. + +config WANPIPE_MULTPPP + bool "WANPIPE Multi-Port PPP support" + depends on VENDOR_SANGOMA + help + Connect a WANPIPE card to a leased line using Point-to-Point + Protocol (PPP). + + Uses in-kernel SyncPPP protocol over the Sangoma HDLC Streaming + adapter. In this case each Sangoma adapter port can support an + independent PPP connection. For example, a single Quad-Port PCI + adapter can support up to four independent PPP links. The PPP + option is supported on S514-PCI/S508-ISA cards. + + Say Y and the Multi-Port PPP support will be included in the driver. + config CYCLADES_SYNC tristate "Cyclom 2X(tm) cards (EXPERIMENTAL)" depends on WAN_ROUTER_DRIVERS && (PCI || ISA) diff --git a/drivers/net/wan/Makefile b/drivers/net/wan/Makefile index 316ca6869..ce6c56b90 100644 --- a/drivers/net/wan/Makefile +++ b/drivers/net/wan/Makefile @@ -5,6 +5,14 @@ # Rewritten to use lists instead of if-statements. # +wanpipe-y := sdlamain.o sdla_ft1.o +wanpipe-$(CONFIG_WANPIPE_X25) += sdla_x25.o +wanpipe-$(CONFIG_WANPIPE_FR) += sdla_fr.o +wanpipe-$(CONFIG_WANPIPE_CHDLC) += sdla_chdlc.o +wanpipe-$(CONFIG_WANPIPE_PPP) += sdla_ppp.o +wanpipe-$(CONFIG_WANPIPE_MULTPPP) += wanpipe_multppp.o +wanpipe-objs := $(wanpipe-y) + cyclomx-y := cycx_main.o cyclomx-$(CONFIG_CYCLOMX_X25) += cycx_x25.o cyclomx-objs := $(cyclomx-y) @@ -28,12 +36,18 @@ 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/ obj-$(CONFIG_DLCI) += dlci.o obj-$(CONFIG_SDLA) += sdla.o +ifeq ($(CONFIG_WANPIPE_MULTPPP),y) + obj-$(CONFIG_VENDOR_SANGOMA) += sdladrv.o wanpipe.o syncppp.o +else + obj-$(CONFIG_VENDOR_SANGOMA) += sdladrv.o wanpipe.o +endif obj-$(CONFIG_CYCLADES_SYNC) += cycx_drv.o cyclomx.o obj-$(CONFIG_LAPBETHER) += lapbether.o obj-$(CONFIG_SBNI) += sbni.o diff --git a/drivers/net/wan/c101.c b/drivers/net/wan/c101.c index 6b63b350c..43d854ace 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 + * For information see http://hq.pm.waw.pl/hdlc/ * * Sources of information: * Hitachi HD64570 SCA User's Manual @@ -116,34 +116,27 @@ 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) { - u8 stat = sca_in(MSCI0_OFFSET + ST1, port); /* read MSCI ST1 status */ + 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 */ - /* Reset MSCI TX underrun and CDCD (ignored) status bit */ - sca_out(stat & (ST1_UDRN | ST1_CDCD), MSCI0_OFFSET + ST1, port); + /* Reset MSCI TX underrun status bit */ + sca_out(stat & ST1_UDRN, MSCI0_OFFSET + ST1, card); if (stat & ST1_UDRN) { - struct net_device_stats *stats = hdlc_stats(port_to_dev(port)); + struct net_device_stats *stats = hdlc_stats(dev); 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, port); + sca_out(stat & ST1_CDCD, MSCI1_OFFSET + ST1, card); if (stat & ST1_CDCD) - set_carrier(port); + hdlc_set_carrier(!(sca_in(MSCI1_OFFSET + ST3, card) & ST3_DCD), + dev); } @@ -197,7 +190,8 @@ static int c101_open(struct net_device *dev) sca_out(IE1_UDRN, MSCI0_OFFSET + IE1, port); sca_out(IE0_TXINT, MSCI0_OFFSET + IE0, port); - set_carrier(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)); /* enable MSCI1 CDCD interrupt */ sca_out(IE1_CDCD, MSCI1_OFFSET + IE1, port); @@ -332,21 +326,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 -EFAULT; + return -EBUSY; } card->tx_ring_buffers = TX_RING_BUFFERS; @@ -384,7 +378,7 @@ static int __init c101_run(unsigned long irq, unsigned long winbase) } sca_init_sync_port(card); /* Set up C101 memory */ - set_carrier(card); + hdlc_set_carrier(!(sca_in(MSCI1_OFFSET + ST3, card) & ST3_DCD), dev); printk(KERN_INFO "%s: Moxa C101 on IRQ%u," " using %u TX + %u RX packets rings\n", @@ -449,5 +443,4 @@ module_exit(c101_cleanup); MODULE_AUTHOR("Krzysztof Halasa "); MODULE_DESCRIPTION("Moxa C101 serial port driver"); MODULE_LICENSE("GPL v2"); -module_param(hw, charp, 0444); -MODULE_PARM_DESC(hw, "irq,ram:irq,..."); +module_param(hw, charp, 0444); /* hw=irq,ram:irq,... */ diff --git a/drivers/net/wan/cosa.c b/drivers/net/wan/cosa.c index 1f95b4864..e392ee8b3 100644 --- a/drivers/net/wan/cosa.c +++ b/drivers/net/wan/cosa.c @@ -79,11 +79,13 @@ /* ---------- Headers, macros, data structures ---------- */ +#include #include #include #include #include #include +#include #include #include #include @@ -391,6 +393,7 @@ 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); @@ -399,6 +402,13 @@ 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 a5e7ce1bd..430b1f630 100644 --- a/drivers/net/wan/cycx_main.c +++ b/drivers/net/wan/cycx_main.c @@ -40,6 +40,7 @@ * 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 736987559..6e1ec5bf2 100644 --- a/drivers/net/wan/dlci.c +++ b/drivers/net/wan/dlci.c @@ -28,6 +28,7 @@ * 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 684af4316..1ff5de076 100644 --- a/drivers/net/wan/dscc4.c +++ b/drivers/net/wan/dscc4.c @@ -105,7 +105,6 @@ #include #include #include -#include /* Version */ static const char version[] = "$Id: dscc4.c,v 1.173 2003/09/20 23:55:34 romieu Exp $ for Linux\n"; @@ -113,7 +112,7 @@ static int debug; static int quartz; #ifdef CONFIG_DSCC4_PCI_RST -static DEFINE_MUTEX(dscc4_mutex); +static DECLARE_MUTEX(dscc4_sem); static u32 dscc4_pci_config_store[16]; #endif @@ -732,15 +731,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 %llx @ %llx\n", - DRV_NAME, (unsigned long long)pci_resource_len(pdev, 0), - (unsigned long long)pci_resource_start(pdev, 0)); + printk(KERN_ERR "%s: cannot remap MMIO region %lx @ %lx\n", + DRV_NAME, pci_resource_len(pdev, 0), + pci_resource_start(pdev, 0)); rc = -EIO; goto err_free_mmio_regions_2; } - 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); + 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); /* Cf errata DS5 p.2 */ pci_write_config_byte(pdev, PCI_LATENCY_TIMER, 0xf8); @@ -752,7 +751,7 @@ static int __devinit dscc4_init_one(struct pci_dev *pdev, priv = pci_get_drvdata(pdev); - rc = request_irq(pdev->irq, dscc4_irq, IRQF_SHARED, DRV_NAME, priv->root); + rc = request_irq(pdev->irq, dscc4_irq, SA_SHIRQ, DRV_NAME, priv->root); if (rc < 0) { printk(KERN_WARNING "%s: IRQ %d busy\n", DRV_NAME, pdev->irq); goto err_release_4; @@ -1019,7 +1018,7 @@ static void dscc4_pci_reset(struct pci_dev *pdev, void __iomem *ioaddr) { int i; - mutex_lock(&dscc4_mutex); + down(&dscc4_sem); for (i = 0; i < 16; i++) pci_read_config_dword(pdev, i << 2, dscc4_pci_config_store + i); @@ -1040,7 +1039,7 @@ static void dscc4_pci_reset(struct pci_dev *pdev, void __iomem *ioaddr) for (i = 0; i < 16; i++) pci_write_config_dword(pdev, i << 2, dscc4_pci_config_store[i]); - mutex_unlock(&dscc4_mutex); + up(&dscc4_sem); } #else #define dscc4_pci_reset(pdev,ioaddr) do {} while (0) diff --git a/drivers/net/wan/farsync.c b/drivers/net/wan/farsync.c index 3705db04a..7981a2c79 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, IRQF_SHARED, FST_DEV_NAME, card)) { + if (request_irq(pdev->irq, fst_intr, SA_SHIRQ, 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 dce2bb317..d3743321a 100644 --- a/drivers/net/wan/hd6457x.c +++ b/drivers/net/wan/hd6457x.c @@ -168,23 +168,6 @@ 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) { @@ -254,7 +237,9 @@ static void sca_init_sync_port(port_t *port) sca_out(DIR_BOFE, DIR_TX(phy_node(port)), card); } } - sca_set_carrier(port); + + hdlc_set_carrier(!(sca_in(get_msci(port) + ST3, card) & ST3_DCD), + port_to_dev(port)); } @@ -277,7 +262,8 @@ static inline void sca_msci_intr(port_t *port) } if (stat & ST1_CDCD) - sca_set_carrier(port); + hdlc_set_carrier(!(sca_in(msci + ST3, card) & ST3_DCD), + port_to_dev(port)); } #endif @@ -580,7 +566,7 @@ static void sca_open(struct net_device *dev) - all DMA interrupts */ - sca_set_carrier(port); + hdlc_set_carrier(!(sca_in(msci + ST3, card) & ST3_DCD), dev); #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 f289daba0..1fd04662c 100644 --- a/drivers/net/wan/hdlc_cisco.c +++ b/drivers/net/wan/hdlc_cisco.c @@ -192,7 +192,9 @@ static int cisco_rx(struct sk_buff *skb) "uptime %ud%uh%um%us)\n", dev->name, days, hrs, min, sec); - netif_dormant_off(dev); +#if 0 + netif_carrier_on(dev); +#endif hdlc->state.cisco.up = 1; } } @@ -225,7 +227,9 @@ 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); - netif_dormant_on(dev); +#if 0 + netif_carrier_off(dev); +#endif } cisco_keepalive_send(dev, CISCO_KEEPALIVE_REQ, @@ -261,7 +265,10 @@ static void cisco_stop(struct net_device *dev) { hdlc_device *hdlc = dev_to_hdlc(dev); del_timer_sync(&hdlc->state.cisco.timer); - netif_dormant_on(dev); +#if 0 + if (netif_carrier_ok(dev)) + netif_carrier_off(dev); +#endif hdlc->state.cisco.up = 0; hdlc->state.cisco.request_sent = 0; } @@ -321,7 +328,6 @@ 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 7bb737bbd..523afe175 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 = netif_carrier_ok(pvc->master); + pvc->state.active = hdlc->carrier; pvc_carrier(pvc->state.active, pvc); hdlc->state.fr.dce_changed = 1; @@ -545,7 +545,11 @@ static void fr_set_link_state(int reliable, struct net_device *dev) hdlc->state.fr.reliable = reliable; if (reliable) { - netif_dormant_off(dev); +#if 0 + if (!netif_carrier_ok(dev)) + netif_carrier_on(dev); +#endif + hdlc->state.fr.n391cnt = 0; /* Request full status */ hdlc->state.fr.dce_changed = 1; @@ -558,7 +562,11 @@ static void fr_set_link_state(int reliable, struct net_device *dev) } } } else { - netif_dormant_on(dev); +#if 0 + if (netif_carrier_ok(dev)) + netif_carrier_off(dev); +#endif + 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 04ca1f7b6..46cef8f92 100644 --- a/drivers/net/wan/hdlc_generic.c +++ b/drivers/net/wan/hdlc_generic.c @@ -22,6 +22,7 @@ * - proto.start() and stop() are called with spin_lock_irq held. */ +#include #include #include #include @@ -34,11 +35,10 @@ #include #include #include -#include #include -static const char* version = "HDLC support module revision 1.19"; +static const char* version = "HDLC support module revision 1.18"; #undef DEBUG_LINK @@ -74,51 +74,57 @@ static int hdlc_rcv(struct sk_buff *skb, struct net_device *dev, -static inline void hdlc_proto_start(struct net_device *dev) +static void __hdlc_set_carrier_on(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 inline void hdlc_proto_stop(struct net_device *dev) +static void __hdlc_set_carrier_off(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 } -static int hdlc_device_event(struct notifier_block *this, unsigned long event, - void *ptr) +void hdlc_set_carrier(int on, struct net_device *dev) { - struct net_device *dev = ptr; - hdlc_device *hdlc; + hdlc_device *hdlc = dev_to_hdlc(dev); unsigned long flags; - 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); + on = on ? 1 : 0; #ifdef DEBUG_LINK - printk(KERN_DEBUG "%s: hdlc_device_event NETDEV_CHANGE, carrier %i\n", - dev->name, on); + printk(KERN_DEBUG "hdlc_set_carrier %i\n", 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) @@ -126,15 +132,14 @@ static int hdlc_device_event(struct notifier_block *this, unsigned long event, if (hdlc->carrier) { printk(KERN_INFO "%s: Carrier detected\n", dev->name); - hdlc_proto_start(dev); + __hdlc_set_carrier_on(dev); } else { printk(KERN_INFO "%s: Carrier lost\n", dev->name); - hdlc_proto_stop(dev); + __hdlc_set_carrier_off(dev); } carrier_exit: spin_unlock_irqrestore(&hdlc->state_lock, flags); - return NOTIFY_DONE; } @@ -161,7 +166,7 @@ int hdlc_open(struct net_device *dev) if (hdlc->carrier) { printk(KERN_INFO "%s: Carrier detected\n", dev->name); - hdlc_proto_start(dev); + __hdlc_set_carrier_on(dev); } else printk(KERN_INFO "%s: No carrier\n", dev->name); @@ -186,7 +191,7 @@ void hdlc_close(struct net_device *dev) hdlc->open = 0; if (hdlc->carrier) - hdlc_proto_stop(dev); + __hdlc_set_carrier_off(dev); spin_unlock_irq(&hdlc->state_lock); @@ -254,7 +259,7 @@ int hdlc_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) } } -void hdlc_setup(struct net_device *dev) +static void hdlc_setup(struct net_device *dev) { hdlc_device *hdlc = dev_to_hdlc(dev); @@ -283,6 +288,26 @@ 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(); @@ -299,9 +324,10 @@ 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 = { @@ -310,18 +336,9 @@ 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; } @@ -331,7 +348,6 @@ 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 fbaab5bf7..b81263eae 100644 --- a/drivers/net/wan/hdlc_ppp.c +++ b/drivers/net/wan/hdlc_ppp.c @@ -107,7 +107,6 @@ 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 f15aa6ba7..9456d31cb 100644 --- a/drivers/net/wan/hdlc_raw.c +++ b/drivers/net/wan/hdlc_raw.c @@ -82,7 +82,6 @@ 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 d1884987f..b1285cc8f 100644 --- a/drivers/net/wan/hdlc_raw_eth.c +++ b/drivers/net/wan/hdlc_raw_eth.c @@ -100,7 +100,6 @@ 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 a867fb411..07e5eef1f 100644 --- a/drivers/net/wan/hdlc_x25.c +++ b/drivers/net/wan/hdlc_x25.c @@ -212,7 +212,6 @@ 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 a4f735723..7db1d1d0b 100644 --- a/drivers/net/wan/hostess_sv11.c +++ b/drivers/net/wan/hostess_sv11.c @@ -29,7 +29,6 @@ #include #include -#include #include #include #include @@ -264,7 +263,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, IRQF_DISABLED, "Hostess SV11", dev)<0) + if(request_irq(irq, &z8530_interrupt, SA_INTERRUPT, "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 39f44241a..40926d779 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, IRQF_SHARED, dev->name, dev)){ + if (request_irq (dev->irq, &lmc_interrupt, SA_SHIRQ, 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 ae01555d2..af8b55fdd 100644 --- a/drivers/net/wan/lmc/lmc_media.c +++ b/drivers/net/wan/lmc/lmc_media.c @@ -1,5 +1,6 @@ /* $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 dcf46add3..cd32751b6 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 + * For information see http://hq.pm.waw.pl/hdlc/ * * Note: integrated CSU/DSU/DDS are not supported by this driver * @@ -387,11 +387,6 @@ 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); @@ -564,5 +559,4 @@ module_exit(n2_cleanup); MODULE_AUTHOR("Krzysztof Halasa "); MODULE_DESCRIPTION("RISCom/N2 serial port driver"); MODULE_LICENSE("GPL v2"); -module_param(hw, charp, 0444); -MODULE_PARM_DESC(hw, "io,irq,ram,ports:io,irq,..."); +module_param(hw, charp, 0444); /* hw=io,irq,ram,ports:io,irq,... */ diff --git a/drivers/net/wan/pc300.h b/drivers/net/wan/pc300.h index 63e9fcf31..2024b26b9 100644 --- a/drivers/net/wan/pc300.h +++ b/drivers/net/wan/pc300.h @@ -100,7 +100,6 @@ #define _PC300_H #include -#include #include "hd64572.h" #include "pc300-falc-lh.h" diff --git a/drivers/net/wan/pc300_drv.c b/drivers/net/wan/pc300_drv.c index 567effff4..a3e65d1bc 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%016llx, " + printk("PC300 found at RAM 0x%08lx, " "but could not allocate card structure.\n", - (unsigned long long)pci_resource_start(pdev, 3)); + 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, IRQF_SHARED, "Cyclades-PC300", card)) { + if (request_irq(card->hw.irq, cpc_intr, SA_SHIRQ, "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 4df61fa32..eba8e5cfa 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 + * For information see http://hq.pm.waw.pl/hdlc/ * * Sources of information: * Hitachi HD64572 SCA-II User's Manual @@ -50,6 +50,10 @@ 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). @@ -258,7 +262,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); @@ -354,7 +358,6 @@ 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 */ @@ -382,15 +385,6 @@ 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); @@ -402,7 +396,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, IRQF_SHARED, devname, card)) { + if(request_irq(pdev->irq, sca_intr, SA_SHIRQ, devname, card)) { printk(KERN_WARNING "pci200syn: could not allocate IRQ%d.\n", pdev->irq); pci200_pci_remove_one(pdev); @@ -412,7 +406,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); @@ -431,7 +425,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; @@ -451,10 +445,8 @@ static int __devinit pci200_pci_init_one(struct pci_dev *pdev, static struct pci_device_id pci200_pci_tbl[] __devinitdata = { - { 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 }, + { PCI_VENDOR_ID_GORAMO, PCI_DEVICE_ID_PCI200SYN, PCI_ANY_ID, + PCI_ANY_ID, 0, 0, 0 }, { 0, } }; diff --git a/drivers/net/wan/sbni.c b/drivers/net/wan/sbni.c index fc75bec19..db2c798ba 100644 --- a/drivers/net/wan/sbni.c +++ b/drivers/net/wan/sbni.c @@ -37,6 +37,7 @@ * Known problem: this driver wasn't tested on multiprocessor machine. */ +#include #include #include #include @@ -1192,7 +1193,7 @@ sbni_open( struct net_device *dev ) } } - if( request_irq(dev->irq, sbni_interrupt, IRQF_SHARED, dev->name, dev) ) { + if( request_irq(dev->irq, sbni_interrupt, SA_SHIRQ, dev->name, dev) ) { printk( KERN_ERR "%s: unable to get IRQ %d.\n", dev->name, dev->irq ); return -EAGAIN; @@ -1494,7 +1495,8 @@ module_param(skip_pci_probe, bool, 0); MODULE_LICENSE("GPL"); -int __init init_module( void ) +int +init_module( void ) { struct net_device *dev; int err; diff --git a/drivers/net/wan/sdla.c b/drivers/net/wan/sdla.c index 0ba018f83..22e794071 100644 --- a/drivers/net/wan/sdla.c +++ b/drivers/net/wan/sdla.c @@ -32,6 +32,7 @@ * 2 of the License, or (at your option) any later version. */ +#include /* for CONFIG_DLCI_MAX */ #include #include #include @@ -59,9 +60,9 @@ static const char* version = "SDLA driver v0.30, 12 Sep 1996, mike.mclagan@linux.org"; -static unsigned int valid_port[] = { 0x250, 0x270, 0x280, 0x300, 0x350, 0x360, 0x380, 0x390}; +static unsigned int valid_port[] __initdata = { 0x250, 0x270, 0x280, 0x300, 0x350, 0x360, 0x380, 0x390}; -static unsigned int valid_mem[] = { +static unsigned int valid_mem[] __initdata = { 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/sdla_fr.c b/drivers/net/wan/sdla_fr.c index 2efccb055..7f1ce9d43 100644 --- a/drivers/net/wan/sdla_fr.c +++ b/drivers/net/wan/sdla_fr.c @@ -152,6 +152,7 @@ #include /* for inb(), outb(), etc. */ #include /* for do_gettimeofday */ #include /* sockaddr_in */ +#include /* time_after() macro */ #include #include @@ -444,7 +445,7 @@ void s508_s514_unlock(sdla_t *card, unsigned long *smp_flags); void s508_s514_lock(sdla_t *card, unsigned long *smp_flags); unsigned short calc_checksum (char *, int); -static int setup_fr_header(struct sk_buff** skb, +static int setup_fr_header(struct sk_buff *skb, struct net_device* dev, char op_mode); @@ -773,7 +774,7 @@ static int update(struct wan_device* wandev) for(;;) { if(card->u.f.update_comms_stats == 0) break; - if ((jiffies - timeout) > (1 * HZ)){ + if (time_after(jiffies, timeout + 1 * HZ)){ card->u.f.update_comms_stats = 0; return -EAGAIN; } @@ -821,7 +822,7 @@ static int new_if(struct wan_device* wandev, struct net_device* dev, chan->card = card; /* verify media address */ - if (is_digit(conf->addr[0])) { + if (isdigit(conf->addr[0])) { dlci = dec_to_uint(conf->addr, 0); @@ -1371,7 +1372,7 @@ static int if_send(struct sk_buff* skb, struct net_device* dev) /* Move the if_header() code to here. By inserting frame * relay header in if_header() we would break the * tcpdump and other packet sniffers */ - chan->fr_header_len = setup_fr_header(&skb,dev,chan->common.usedby); + chan->fr_header_len = setup_fr_header(skb,dev,chan->common.usedby); if (chan->fr_header_len < 0 ){ ++chan->ifstats.tx_dropped; ++card->wandev.stats.tx_dropped; @@ -1596,8 +1597,6 @@ static int setup_for_delayed_transmit(struct net_device* dev, return 1; } - skb_unlink(skb); - chan->transmit_length = len; chan->delay_skb = skb; @@ -3457,7 +3456,7 @@ static unsigned int dec_to_uint (unsigned char* str, int len) if (!len) len = strlen(str); - for (val = 0; len && is_digit(*str); ++str, --len) + for (val = 0; len && isdigit(*str); ++str, --len) val = (val * 10) + (*str - (unsigned)'0'); return val; @@ -4799,7 +4798,7 @@ static void trigger_unconfig_fr(struct net_device *dev) { fr_channel_t *chan = dev->priv; volatile sdla_t *card = chan->card; - u32 timeout; + unsigned long timeout; fr508_flags_t* flags = card->flags; int reset_critical=0; @@ -4821,7 +4820,7 @@ static void trigger_unconfig_fr(struct net_device *dev) if(!(card->u.f.timer_int_enabled & TMR_INT_ENABLED_UNCONFIG)) break; - if ((jiffies - timeout) > (1 * HZ)){ + if (time_after(jiffies, timeout + 1 * HZ)){ card->u.f.timer_int_enabled &= ~TMR_INT_ENABLED_UNCONFIG; printk(KERN_INFO "%s: Failed to delete DLCI %i\n", card->devname,chan->dlci); @@ -4870,18 +4869,15 @@ static void unconfig_fr (sdla_t *card) } } -static int setup_fr_header(struct sk_buff **skb_orig, struct net_device* dev, +static int setup_fr_header(struct sk_buff *skb, struct net_device* dev, char op_mode) { - struct sk_buff *skb = *skb_orig; fr_channel_t *chan=dev->priv; - if (op_mode == WANPIPE){ - + if (op_mode == WANPIPE) { chan->fr_header[0]=Q922_UI; switch (htons(skb->protocol)){ - case ETH_P_IP: chan->fr_header[1]=NLPID_IP; break; @@ -4893,16 +4889,14 @@ static int setup_fr_header(struct sk_buff **skb_orig, struct net_device* dev, } /* If we are in bridging mode, we must apply - * an Ethernet header */ - if (op_mode == BRIDGE || op_mode == BRIDGE_NODE){ - - + * an Ethernet header + */ + if (op_mode == BRIDGE || op_mode == BRIDGE_NODE) { /* Encapsulate the packet as a bridged Ethernet frame. */ #ifdef DEBUG printk(KERN_INFO "%s: encapsulating skb for frame relay\n", dev->name); #endif - chan->fr_header[0] = 0x03; chan->fr_header[1] = 0x00; chan->fr_header[2] = 0x80; @@ -4915,7 +4909,6 @@ static int setup_fr_header(struct sk_buff **skb_orig, struct net_device* dev, /* Yuck. */ skb->protocol = ETH_P_802_3; return 8; - } return 0; diff --git a/drivers/net/wan/sdla_ft1.c b/drivers/net/wan/sdla_ft1.c index 5e3124856..9d6528a50 100644 --- a/drivers/net/wan/sdla_ft1.c +++ b/drivers/net/wan/sdla_ft1.c @@ -29,6 +29,7 @@ #include /* WAN router definitions */ #include /* WANPIPE common user API definitions */ #include /* ARPHRD_* defines */ +#include /* time_after() macro */ #include #include @@ -164,7 +165,7 @@ int wpft1_init (sdla_t* card, wandev_conf_t* conf) timeout = jiffies; while (mb->return_code != 'I') /* Wait 1s for board to initialize */ - if ((jiffies - timeout) > 1*HZ) break; + if (time_after(jiffies, timeout + 1*HZ)) break; if (mb->return_code != 'I') { printk(KERN_INFO diff --git a/drivers/net/wan/sdla_ppp.c b/drivers/net/wan/sdla_ppp.c index 1761cb68a..a4b489ccc 100644 --- a/drivers/net/wan/sdla_ppp.c +++ b/drivers/net/wan/sdla_ppp.c @@ -101,6 +101,7 @@ #include /* ARPHRD_* defines */ #include /* htons(), etc. */ #include /* sockaddr_in */ +#include /* time_after() macro */ #include @@ -482,7 +483,7 @@ static int update(struct wan_device *wandev) if(ppp_priv_area->update_comms_stats == 0){ break; } - if ((jiffies - timeout) > (1 * HZ)){ + if (time_after(jiffies, timeout + 1 * HZ)){ ppp_priv_area->update_comms_stats = 0; ppp_priv_area->timer_int_enabled &= ~TMR_INT_ENABLED_UPDATE; diff --git a/drivers/net/wan/sdla_x25.c b/drivers/net/wan/sdla_x25.c index 3a93d2fd4..63f846d6f 100644 --- a/drivers/net/wan/sdla_x25.c +++ b/drivers/net/wan/sdla_x25.c @@ -91,6 +91,7 @@ #include /* WAN router definitions */ #include /* WANPIPE common user API definitions */ #include +#include /* time_after() macro */ #include /* htons(), etc. */ #include #include /* Experimental delay */ @@ -867,7 +868,7 @@ static int update(struct wan_device* wandev) if (!(card->u.x.timer_int_enabled & TMR_INT_ENABLED_UPDATE)){ break; } - if ((jiffies-timeout) > 1*HZ){ + if (time_after(jiffies, timeout + 1*HZ)){ card->u.x.timer_int_enabled &= ~TMR_INT_ENABLED_UPDATE; return -EAGAIN; } @@ -956,7 +957,7 @@ static int new_if(struct wan_device* wandev, struct net_device* dev, chan->hold_timeout = (conf->hold_timeout) ? conf->hold_timeout : 10; - }else if (is_digit(conf->addr[0])){ /* PVC */ + }else if (isdigit(conf->addr[0])){ /* PVC */ int lcn = dec_to_uint(conf->addr, 0); if ((lcn >= card->u.x.lo_pvc) && (lcn <= card->u.x.hi_pvc)){ @@ -3874,7 +3875,7 @@ static unsigned int dec_to_uint (unsigned char* str, int len) if (!len) len = strlen(str); - for (val = 0; len && is_digit(*str); ++str, --len) + for (val = 0; len && isdigit(*str); ++str, --len) val = (val * 10) + (*str - (unsigned)'0'); return val; @@ -3895,9 +3896,9 @@ static unsigned int hex_to_uint (unsigned char* str, int len) for (val = 0; len; ++str, --len) { ch = *str; - if (is_digit(ch)) + if (isdigit(ch)) val = (val << 4) + (ch - (unsigned)'0'); - else if (is_hex_digit(ch)) + else if (isxdigit(ch)) val = (val << 4) + ((ch & 0xDF) - (unsigned)'A' + 10); else break; } diff --git a/drivers/net/wan/sdladrv.c b/drivers/net/wan/sdladrv.c index c8bc6da57..032c0f819 100644 --- a/drivers/net/wan/sdladrv.c +++ b/drivers/net/wan/sdladrv.c @@ -642,9 +642,7 @@ int sdla_mapmem (sdlahw_t* hw, unsigned long addr) * Enable interrupt generation. */ -EXPORT_SYMBOL(sdla_inten); - -int sdla_inten (sdlahw_t* hw) +static int sdla_inten (sdlahw_t* hw) { unsigned port = hw->port; int tmp, i; @@ -698,8 +696,7 @@ int sdla_inten (sdlahw_t* hw) * Disable interrupt generation. */ -EXPORT_SYMBOL(sdla_intde); - +#if 0 int sdla_intde (sdlahw_t* hw) { unsigned port = hw->port; @@ -748,14 +745,13 @@ int sdla_intde (sdlahw_t* hw) } return 0; } +#endif /* 0 */ /*============================================================================ * Acknowledge SDLA hardware interrupt. */ -EXPORT_SYMBOL(sdla_intack); - -int sdla_intack (sdlahw_t* hw) +static int sdla_intack (sdlahw_t* hw) { unsigned port = hw->port; int tmp; @@ -827,8 +823,7 @@ void read_S514_int_stat (sdlahw_t* hw, u32* int_status) * Generate an interrupt to adapter's CPU. */ -EXPORT_SYMBOL(sdla_intr); - +#if 0 int sdla_intr (sdlahw_t* hw) { unsigned port = hw->port; @@ -863,6 +858,7 @@ int sdla_intr (sdlahw_t* hw) } return 0; } +#endif /* 0 */ /*============================================================================ * Execute Adapter Command. @@ -1998,7 +1994,7 @@ static int detect_s514 (sdlahw_t* hw) modname, hw->irq); /* map the physical PCI memory to virtual memory */ - (void *)hw->dpmbase = ioremap((unsigned long)S514_mem_base_addr, + hw->dpmbase = ioremap((unsigned long)S514_mem_base_addr, (unsigned long)MAX_SIZEOF_S514_MEMORY); /* map the physical control register memory to virtual memory */ hw->vector = (unsigned long)ioremap( diff --git a/drivers/net/wan/sdlamain.c b/drivers/net/wan/sdlamain.c index 74e151ace..7a8b22a7e 100644 --- a/drivers/net/wan/sdlamain.c +++ b/drivers/net/wan/sdlamain.c @@ -57,6 +57,7 @@ #include /* request_region(), release_region() */ #include /* WAN router definitions */ #include /* WANPIPE common user API definitions */ +#include #include #include /* phys_to_virt() */ @@ -1268,37 +1269,41 @@ unsigned long get_ip_address(struct net_device *dev, int option) struct in_ifaddr *ifaddr; struct in_device *in_dev; + unsigned long addr = 0; - if ((in_dev = __in_dev_get(dev)) == NULL){ - return 0; + rcu_read_lock(); + if ((in_dev = __in_dev_get_rcu(dev)) == NULL){ + goto out; } if ((ifaddr = in_dev->ifa_list)== NULL ){ - return 0; + goto out; } switch (option){ case WAN_LOCAL_IP: - return ifaddr->ifa_local; + addr = ifaddr->ifa_local; break; case WAN_POINTOPOINT_IP: - return ifaddr->ifa_address; + addr = ifaddr->ifa_address; break; case WAN_NETMASK_IP: - return ifaddr->ifa_mask; + addr = ifaddr->ifa_mask; break; case WAN_BROADCAST_IP: - return ifaddr->ifa_broadcast; + addr = ifaddr->ifa_broadcast; break; default: - return 0; + break; } - return 0; +out: + rcu_read_unlock(); + return addr; } void add_gateway(sdla_t *card, struct net_device *dev) diff --git a/drivers/net/wan/sealevel.c b/drivers/net/wan/sealevel.c index 70fb1b98b..5380ddfcd 100644 --- a/drivers/net/wan/sealevel.c +++ b/drivers/net/wan/sealevel.c @@ -23,7 +23,6 @@ #include #include -#include #include #include #include @@ -322,7 +321,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, IRQF_DISABLED, "SeaLevel", dev)<0) + if(request_irq(irq, &z8530_interrupt, SA_INTERRUPT, "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 c13b459a0..2d1bba06a 100644 --- a/drivers/net/wan/syncppp.c +++ b/drivers/net/wan/syncppp.c @@ -37,6 +37,7 @@ */ #undef DEBUG +#include #include #include #include diff --git a/drivers/net/wan/wanpipe_multppp.c b/drivers/net/wan/wanpipe_multppp.c index 6aa6987d9..812a1183c 100644 --- a/drivers/net/wan/wanpipe_multppp.c +++ b/drivers/net/wan/wanpipe_multppp.c @@ -26,6 +26,7 @@ #include /* WAN router definitions */ #include /* WANPIPE common user API definitions */ #include /* ARPHRD_* defines */ +#include /* time_after() macro */ #include /* sockaddr_in */ #include @@ -270,9 +271,9 @@ int wsppp_init (sdla_t* card, wandev_conf_t* conf) ready to accept commands. We expect this to be completed in less than 1 second. */ - timeout = jiffies; + timeout = jiffies + 1 * HZ; while (mb->return_code != 'I') /* Wait 1s for board to initialize */ - if ((jiffies - timeout) > 1*HZ) break; + if (time_after(jiffies, timeout)) break; if (mb->return_code != 'I') { printk(KERN_INFO @@ -493,11 +494,11 @@ static int update(struct wan_device* wandev) chdlc_priv_area->timer_int_enabled = TMR_INT_ENABLED_UPDATE; /* wait a maximum of 1 second for the statistics to be updated */ - timeout = jiffies; + timeout = jiffies + 1 * HZ; for(;;) { if(chdlc_priv_area->update_comms_stats == 0) break; - if ((jiffies - timeout) > (1 * HZ)){ + if (time_after(jiffies, timeout)){ chdlc_priv_area->update_comms_stats = 0; chdlc_priv_area->timer_int_enabled &= ~TMR_INT_ENABLED_UPDATE; diff --git a/drivers/net/wan/wanxl.c b/drivers/net/wan/wanxl.c index b2031dfc4..9d3b51c3e 100644 --- a/drivers/net/wan/wanxl.c +++ b/drivers/net/wan/wanxl.c @@ -149,10 +149,7 @@ 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); - if (value & STATUS_CABLE_DCD) - netif_carrier_on(port->dev); - else - netif_carrier_off(port->dev); + hdlc_set_carrier(value & STATUS_CABLE_DCD, port->dev); } @@ -580,8 +577,8 @@ static int __devinit wanxl_pci_init_one(struct pci_dev *pdev, We set both dma_mask and consistent_dma_mask to 28 bits and pray pci_alloc_consistent() will use this info. It should work on most platforms */ - if (pci_set_consistent_dma_mask(pdev, DMA_28BIT_MASK) || - pci_set_dma_mask(pdev, DMA_28BIT_MASK)) { + if (pci_set_consistent_dma_mask(pdev, 0x0FFFFFFF) || + pci_set_dma_mask(pdev, 0x0FFFFFFF)) { printk(KERN_ERR "wanXL: No usable DMA configuration\n"); return -EIO; } @@ -637,13 +634,7 @@ 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); @@ -709,12 +700,6 @@ 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); @@ -758,7 +743,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, IRQF_SHARED, "wanXL", card)) { + if (request_irq(pdev->irq, wanxl_intr, SA_SHIRQ, "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 b1ba1872f..7caa8dc88 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 init_module(void) +int +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 2e8ac995d..8101657da 100644 --- a/drivers/net/wireless/Kconfig +++ b/drivers/net/wireless/Kconfig @@ -7,7 +7,6 @@ menu "Wireless LAN (non-hamradio)" config NET_RADIO bool "Wireless LAN drivers (non-hamradio) & Wireless Extensions" - select WIRELESS_EXT ---help--- Support for wireless LANs and everything having to do with radio, but not with amateur radio or FM broadcasting. @@ -25,16 +24,6 @@ config NET_RADIO the tools from . -config NET_WIRELESS_RTNETLINK - bool "Wireless Extension API over RtNetlink" - depends on NET_RADIO - ---help--- - Support the Wireless Extension API over the RtNetlink socket - in addition to the traditional ioctl interface (selected above). - - For now, few tools use this facility, but it might grow in the - future. The only downside is that it adds 4.5 kB to your kernel. - # Note : the cards are obsolete (can't buy them anymore), but the drivers # are not, as people are still using them... comment "Obsolete Wireless cards support (pre-802.11)" @@ -146,9 +135,8 @@ comment "Wireless 802.11b ISA/PCI cards support" config IPW2100 tristate "Intel PRO/Wireless 2100 Network Connection" - depends on NET_RADIO && PCI + depends on NET_RADIO && PCI && IEEE80211 select FW_LOADER - select IEEE80211 ---help--- A driver for the Intel PRO/Wireless 2100 Network Connection 802.11b wireless network adapter. @@ -200,9 +188,8 @@ config IPW2100_DEBUG config IPW2200 tristate "Intel PRO/Wireless 2200BG and 2915ABG Network Connection" - depends on NET_RADIO && PCI + depends on NET_RADIO && IEEE80211 && PCI select FW_LOADER - select IEEE80211 ---help--- A driver for the Intel PRO/Wireless 2200BG and 2915ABG Network Connection adapters. @@ -214,7 +201,7 @@ config IPW2200 In order to use this driver, you will need a firmware image for it. You can obtain the firmware from . See the above referenced README.ipw2200 - for information on where to install the firmware images. + for information on where to install the firmare images. You will also very likely need the Wireless Tools in order to configure your card: @@ -226,47 +213,6 @@ config IPW2200 say M here and read . The module will be called ipw2200.ko. -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 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 - config IPW2200_DEBUG bool "Enable full debugging output in IPW2200 module." depends on IPW2200 @@ -300,7 +246,7 @@ config AIRO PCI 802.11 wireless cards. It supports the new 802.11b cards from Cisco (Cisco 34X, Cisco 35X - with or without encryption) as well as card before the Cisco - acquisition (Aironet 4500, Aironet 4800, Aironet 4800B). + aquisition (Aironet 4500, Aironet 4800, Aironet 4800B). This driver support both the standard Linux Wireless Extensions and Cisco proprietary API, so both the Linux Wireless Tools and the @@ -337,10 +283,7 @@ config APPLE_AIRPORT Say Y here to support the Airport 802.11b wireless Ethernet hardware built into the Macintosh iBook and other recent PowerPC-based Macintosh machines. This is essentially a Lucent Orinoco card with - a non-standard interface. - - This driver does not support the Airport Extreme (802.11b/g). Use - the BCM43xx driver for Airport Extreme cards. + a non-standard interface config PLX_HERMES tristate "Hermes in PLX9052 based PCI adaptor support (Netgear MA301 etc.)" @@ -384,7 +327,7 @@ config PCI_HERMES config ATMEL tristate "Atmel at76c50x chipset 802.11b support" - depends on NET_RADIO && (PCI || PCMCIA) + depends on NET_RADIO select FW_LOADER select CRC32 ---help--- @@ -447,14 +390,13 @@ 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 driver part of the Linux Pcmcia package. It supports the new 802.11b cards from Cisco (Cisco 34X, Cisco 35X - with or without encryption) as well as card before the Cisco - acquisition (Aironet 4500, Aironet 4800, Aironet 4800B). It also + aquisition (Aironet 4500, Aironet 4800, Aironet 4800B). It also supports OEM of Cisco such as the DELL TrueMobile 4800 and Xircom 802.11b cards. @@ -532,26 +474,7 @@ 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 c613af17a..3a6f7ba32 100644 --- a/drivers/net/wireless/Makefile +++ b/drivers/net/wireless/Makefile @@ -35,11 +35,7 @@ obj-$(CONFIG_PCMCIA_ATMEL) += atmel_cs.o 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 a4dd13942..a4c7ae946 100644 --- a/drivers/net/wireless/airo.c +++ b/drivers/net/wireless/airo.c @@ -19,6 +19,7 @@ ======================================================================*/ +#include #include #include @@ -35,7 +36,6 @@ #include #include #include -#include #include #include @@ -46,7 +46,6 @@ #include #include #include -#include #include "airo.h" @@ -88,6 +87,14 @@ static struct pci_driver airo_driver = { #include #endif +/* Support Cisco MIC feature */ +#define MICSUPPORT + +#if defined(MICSUPPORT) && !defined(CONFIG_CRYPTO) +#warning MIC support requires Crypto API +#undef MICSUPPORT +#endif + /* Hack to do some power saving */ #define POWER_ON_DOWN @@ -467,8 +474,6 @@ 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; @@ -741,14 +746,6 @@ 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 */ @@ -777,16 +774,8 @@ typedef struct { } fh; u16 dsChannel; u16 atimWindow; - - /* Only present on firmware >= 5.30.17 */ - BSSListRidExtra extra; } BSSListRid; -typedef struct { - BSSListRid bss; - struct list_head list; -} BSSListElement; - typedef struct { u8 rssipct; u8 rssidBm; @@ -920,7 +909,6 @@ static char swversion[] = "2.1"; #define NUM_MODULES 2 #define MIC_MSGLEN_MAX 2400 #define EMMH32_MSGLEN_MAX MIC_MSGLEN_MAX -#define AIRO_DEF_MTU 2312 typedef struct { u32 size; // size @@ -1130,6 +1118,7 @@ static int readrids(struct net_device *dev, aironet_ioctl *comp); static int writerids(struct net_device *dev, aironet_ioctl *comp); static int flashcard(struct net_device *dev, aironet_ioctl *comp); #endif /* CISCO_EXT */ +#ifdef MICSUPPORT static void micinit(struct airo_info *ai); static int micsetup(struct airo_info *ai); static int encapsulate(struct airo_info *ai, etherHead *pPacket, MICBuffer *buffer, int len); @@ -1138,7 +1127,8 @@ static int decapsulate(struct airo_info *ai, MICBuffer *mic, etherHead *pPacket, static u8 airo_rssi_to_dbm (tdsRssiEntry *rssi_rid, u8 rssi); static u8 airo_dbm_to_pct (tdsRssiEntry *rssi_rid, u8 dbm); -static void airo_networks_free(struct airo_info *ai); +#include +#endif struct airo_info { struct net_device_stats stats; @@ -1153,6 +1143,8 @@ 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 @@ -1162,7 +1154,6 @@ 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 @@ -1170,19 +1161,16 @@ struct airo_info { #define FLAG_COMMIT 13 #define FLAG_RESET 14 #define FLAG_FLASHING 15 -#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; +#define JOB_MASK 0x1ff0000 +#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 int (*bap_read)(struct airo_info*, u16 *pu16Dst, int bytelen, int whichbap); unsigned short *flash; @@ -1199,13 +1187,15 @@ struct airo_info { } xmit, xmit11; struct net_device *wifidev; struct iw_statistics wstats; // wireless stats - unsigned long scan_timeout; /* Time scan should be read */ + unsigned long scan_timestamp; /* Time started to scan */ struct iw_spy_data spy_data; struct iw_public_data wireless_data; +#ifdef MICSUPPORT /* MIC stuff */ struct crypto_tfm *tfm; mic_module mod[2]; mic_statistics micstats; +#endif HostRxDesc rxfids[MPI_MAX_FIDS]; // rx/tx/config MPI350 descriptors HostTxDesc txfids[MPI_MAX_FIDS]; HostRidDesc config_desc; @@ -1221,15 +1211,6 @@ struct airo_info { APListRid *APList; #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; }; static inline int bap_read(struct airo_info *ai, u16 *pu16Dst, int bytelen, @@ -1248,22 +1229,7 @@ static int flashgchar(struct airo_info *ai,int matchbyte,int dwelltime); static int flashputbuf(struct airo_info *ai); static int flashrestart(struct airo_info *ai,struct net_device *dev); -#define airo_print(type, name, fmt, args...) \ - { printk(type "airo(%s): " fmt "\n", name, ##args); } - -#define airo_print_info(name, fmt, args...) \ - airo_print(KERN_INFO, name, fmt, ##args) - -#define airo_print_dbg(name, fmt, args...) \ - airo_print(KERN_DEBUG, name, fmt, ##args) - -#define airo_print_warn(name, fmt, args...) \ - airo_print(KERN_WARNING, name, fmt, ##args) - -#define airo_print_err(name, fmt, args...) \ - airo_print(KERN_ERR, name, fmt, ##args) - - +#ifdef MICSUPPORT /*********************************************************************** * MIC ROUTINES * *********************************************************************** @@ -1283,7 +1249,7 @@ static void micinit(struct airo_info *ai) { MICRid mic_rid; - clear_bit(JOB_MIC, &ai->jobs); + clear_bit(JOB_MIC, &ai->flags); PC4500_readrid(ai, RID_MIC, &mic_rid, sizeof(mic_rid), 0); up(&ai->sem); @@ -1342,7 +1308,7 @@ static int micsetup(struct airo_info *ai) { ai->tfm = crypto_alloc_tfm("aes", CRYPTO_TFM_REQ_MAY_SLEEP); if (ai->tfm == NULL) { - airo_print_err(ai->dev->name, "failed to load transform for AES"); + printk(KERN_ERR "airo: failed to load transform for AES\n"); return ERROR; } @@ -1720,28 +1686,29 @@ static void emmh32_final(emmh32_context *context, u8 digest[4]) digest[2] = (val>>8) & 0xFF; digest[3] = val & 0xFF; } +#endif 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 ? ai->bssListFirst : ai->bssListNext, - list, ai->bssListRidLen, 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); list->len = le16_to_cpu(list->len); list->index = le16_to_cpu(list->index); @@ -1774,11 +1741,11 @@ static int writeWepKeyRid(struct airo_info*ai, WepKeyRid *pwkr, int perm, int lo wkr.kindex = cpu_to_le16(wkr.kindex); wkr.klen = cpu_to_le16(wkr.klen); rc = PC4500_writerid(ai, RID_WEP_TEMP, &wkr, sizeof(wkr), lock); - if (rc!=SUCCESS) airo_print_err(ai->dev->name, "WEP_TEMP set %x", rc); + if (rc!=SUCCESS) printk(KERN_ERR "airo: WEP_TEMP set %x\n", rc); if (perm) { rc = PC4500_writerid(ai, RID_WEP_PERM, &wkr, sizeof(wkr), lock); if (rc!=SUCCESS) { - airo_print_err(ai->dev->name, "WEP_PERM set %x", rc); + printk(KERN_ERR "airo: WEP_PERM set %x\n", rc); } } return rc; @@ -1957,7 +1924,7 @@ static int mpi_start_xmit(struct sk_buff *skb, struct net_device *dev) { struct airo_info *ai = dev->priv; if (!skb) { - airo_print_err(dev->name, "%s: skb == NULL!",__FUNCTION__); + printk(KERN_ERR "airo: %s: skb==NULL\n",__FUNCTION__); return 0; } npacks = skb_queue_len (&ai->txq); @@ -2003,8 +1970,8 @@ static int mpi_send_packet (struct net_device *dev) /* get a packet to send */ if ((skb = skb_dequeue(&ai->txq)) == 0) { - airo_print_err(dev->name, - "%s: Dequeue'd zero in send_packet()", + printk (KERN_ERR + "airo: %s: Dequeue'd zero in send_packet()\n", __FUNCTION__); return 0; } @@ -2038,6 +2005,7 @@ static int mpi_send_packet (struct net_device *dev) * Firmware automaticly puts 802 header on so * we don't need to account for it in the length */ +#ifdef MICSUPPORT if (test_bit(FLAG_MIC_CAPABLE, &ai->flags) && ai->micstats.enabled && (ntohs(((u16 *)buffer)[6]) != 0x888E)) { MICBuffer pMic; @@ -2054,7 +2022,9 @@ static int mpi_send_packet (struct net_device *dev) memcpy (sendbuf, &pMic, sizeof(pMic)); sendbuf += sizeof(pMic); memcpy (sendbuf, buffer, len - sizeof(etherHead)); - } else { + } else +#endif + { *payloadLen = cpu_to_le16(len - sizeof(etherHead)); dev->trans_start = jiffies; @@ -2131,7 +2101,7 @@ static void airo_end_xmit(struct net_device *dev) { int fid = priv->xmit.fid; u32 *fids = priv->fids; - clear_bit(JOB_XMIT, &priv->jobs); + clear_bit(JOB_XMIT, &priv->flags); clear_bit(FLAG_PENDING_XMIT, &priv->flags); status = transmit_802_3_packet (priv, fids[fid], skb->data); up(&priv->sem); @@ -2156,7 +2126,7 @@ static int airo_start_xmit(struct sk_buff *skb, struct net_device *dev) { u32 *fids = priv->fids; if ( skb == NULL ) { - airo_print_err(dev->name, "%s: skb == NULL!", __FUNCTION__); + printk( KERN_ERR "airo: skb == NULL!!!\n" ); return 0; } @@ -2181,7 +2151,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->jobs); + set_bit(JOB_XMIT, &priv->flags); wake_up_interruptible(&priv->thr_wait); } else airo_end_xmit(dev); @@ -2196,7 +2166,7 @@ static void airo_end_xmit11(struct net_device *dev) { int fid = priv->xmit11.fid; u32 *fids = priv->fids; - clear_bit(JOB_XMIT11, &priv->jobs); + clear_bit(JOB_XMIT11, &priv->flags); clear_bit(FLAG_PENDING_XMIT11, &priv->flags); status = transmit_802_11_packet (priv, fids[fid], skb->data); up(&priv->sem); @@ -2227,7 +2197,7 @@ static int airo_start_xmit11(struct sk_buff *skb, struct net_device *dev) { } if ( skb == NULL ) { - airo_print_err(dev->name, "%s: skb == NULL!", __FUNCTION__); + printk( KERN_ERR "airo: skb == NULL!!!\n" ); return 0; } @@ -2252,7 +2222,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->jobs); + set_bit(JOB_XMIT11, &priv->flags); wake_up_interruptible(&priv->thr_wait); } else airo_end_xmit11(dev); @@ -2263,7 +2233,7 @@ static void airo_read_stats(struct airo_info *ai) { StatsRid stats_rid; u32 *vals = stats_rid.vals; - clear_bit(JOB_STATS, &ai->jobs); + clear_bit(JOB_STATS, &ai->flags); if (ai->power.event) { up(&ai->sem); return; @@ -2291,10 +2261,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->jobs)) { + if (!test_bit(JOB_STATS, &local->flags)) { /* Get stats out of the card if available */ if (down_trylock(&local->sem) != 0) { - set_bit(JOB_STATS, &local->jobs); + set_bit(JOB_STATS, &local->flags); wake_up_interruptible(&local->thr_wait); } else airo_read_stats(local); @@ -2309,7 +2279,7 @@ static void airo_set_promisc(struct airo_info *ai) { memset(&cmd, 0, sizeof(cmd)); cmd.cmd=CMD_SETMODE; - clear_bit(JOB_PROMISC, &ai->jobs); + clear_bit(JOB_PROMISC, &ai->flags); cmd.parm0=(ai->flags&IFF_PROMISC) ? PROMISC : NOPROMISC; issuecommand(ai, &cmd, &rsp); up(&ai->sem); @@ -2321,7 +2291,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->jobs); + set_bit(JOB_PROMISC, &ai->flags); wake_up_interruptible(&ai->thr_wait); } else airo_set_promisc(ai); @@ -2399,7 +2369,7 @@ void stop_airo_card( struct net_device *dev, int freeres ) } clear_bit(FLAG_REGISTERED, &ai->flags); } - set_bit(JOB_DIE, &ai->jobs); + set_bit(JOB_DIE, &ai->flags); kill_proc(ai->thr_pid, SIGTERM, 1); wait_for_completion(&ai->thr_exited); @@ -2412,8 +2382,6 @@ void stop_airo_card( struct net_device *dev, int freeres ) dev_kfree_skb(skb); } - airo_networks_free (ai); - kfree(ai->flash); kfree(ai->rssi); kfree(ai->APList); @@ -2432,7 +2400,9 @@ void stop_airo_card( struct net_device *dev, int freeres ) ai->shared, ai->shared_dma); } } +#ifdef MICSUPPORT crypto_free_tfm(ai->tfm); +#endif del_airo_dev( dev ); free_netdev( dev ); } @@ -2484,7 +2454,7 @@ static int mpi_init_descriptors (struct airo_info *ai) cmd.parm2 = MPI_MAX_FIDS; rc=issuecommand(ai, &cmd, &rsp); if (rc != SUCCESS) { - airo_print_err(ai->dev->name, "Couldn't allocate RX FID"); + printk(KERN_ERR "airo: Couldn't allocate RX FID\n"); return rc; } @@ -2512,7 +2482,7 @@ static int mpi_init_descriptors (struct airo_info *ai) rc=issuecommand(ai, &cmd, &rsp); if (rc != SUCCESS) { - airo_print_err(ai->dev->name, "Couldn't allocate TX FID"); + printk(KERN_ERR "airo: Couldn't allocate TX FID\n"); return rc; } @@ -2526,7 +2496,7 @@ static int mpi_init_descriptors (struct airo_info *ai) cmd.parm2 = 1; /* Magic number... */ rc=issuecommand(ai, &cmd, &rsp); if (rc != SUCCESS) { - airo_print_err(ai->dev->name, "Couldn't allocate RID"); + printk(KERN_ERR "airo: Couldn't allocate RID\n"); return rc; } @@ -2558,25 +2528,25 @@ static int mpi_map_card(struct airo_info *ai, struct pci_dev *pci, aux_len = AUXMEMSIZE; if (!request_mem_region(mem_start, mem_len, name)) { - airo_print_err(ai->dev->name, "Couldn't get region %x[%x] for %s", + printk(KERN_ERR "airo: Couldn't get region %x[%x] for %s\n", (int)mem_start, (int)mem_len, name); goto out; } if (!request_mem_region(aux_start, aux_len, name)) { - airo_print_err(ai->dev->name, "Couldn't get region %x[%x] for %s", + printk(KERN_ERR "airo: Couldn't get region %x[%x] for %s\n", (int)aux_start, (int)aux_len, name); goto free_region1; } ai->pcimem = ioremap(mem_start, mem_len); if (!ai->pcimem) { - airo_print_err(ai->dev->name, "Couldn't map region %x[%x] for %s", + printk(KERN_ERR "airo: Couldn't map region %x[%x] for %s\n", (int)mem_start, (int)mem_len, name); goto free_region2; } ai->pciaux = ioremap(aux_start, aux_len); if (!ai->pciaux) { - airo_print_err(ai->dev->name, "Couldn't map region %x[%x] for %s", + printk(KERN_ERR "airo: Couldn't map region %x[%x] for %s\n", (int)aux_start, (int)aux_len, name); goto free_memmap; } @@ -2584,7 +2554,7 @@ static int mpi_map_card(struct airo_info *ai, struct pci_dev *pci, /* Reserve PKTSIZE for each fid and 2K for the Rids */ ai->shared = pci_alloc_consistent(pci, PCI_SHARED_LEN, &ai->shared_dma); if (!ai->shared) { - airo_print_err(ai->dev->name, "Couldn't alloc_consistent %d", + printk(KERN_ERR "airo: Couldn't alloc_consistent %d\n", PCI_SHARED_LEN); goto free_auxmap; } @@ -2676,7 +2646,7 @@ static void wifi_setup(struct net_device *dev) dev->type = ARPHRD_IEEE80211; dev->hard_header_len = ETH_HLEN; - dev->mtu = AIRO_DEF_MTU; + dev->mtu = 2312; dev->addr_len = ETH_ALEN; dev->tx_queue_len = 100; @@ -2720,64 +2690,6 @@ static int reset_card( struct net_device *dev , int lock) { return 0; } -#define AIRO_MAX_NETWORK_COUNT 64 -static int airo_networks_allocate(struct airo_info *ai) -{ - if (ai->networks) - return 0; - - ai->networks = - kzalloc(AIRO_MAX_NETWORK_COUNT * sizeof(BSSListElement), - GFP_KERNEL); - if (!ai->networks) { - airo_print_warn(ai->dev->name, "Out of memory allocating beacons"); - return -ENOMEM; - } - - return 0; -} - -static void airo_networks_free(struct airo_info *ai) -{ - if (!ai->networks) - return; - kfree(ai->networks); - ai->networks = NULL; -} - -static void airo_networks_initialize(struct airo_info *ai) -{ - int i; - - INIT_LIST_HEAD(&ai->network_free_list); - INIT_LIST_HEAD(&ai->network_list); - 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 ) @@ -2789,23 +2701,22 @@ static struct net_device *_init_airo_card( unsigned short irq, int port, /* Create the network device object. */ dev = alloc_etherdev(sizeof(*ai)); if (!dev) { - airo_print_err("", "Couldn't alloc_etherdev"); + printk(KERN_ERR "airo: Couldn't alloc_etherdev\n"); return NULL; } if (dev_alloc_name(dev, dev->name) < 0) { - airo_print_err("", "Couldn't get name!"); + printk(KERN_ERR "airo: Couldn't get name!\n"); goto err_out_free; } 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"); + printk(KERN_DEBUG "airo: Found an MPI350 card\n"); set_bit(FLAG_MPI, &ai->flags); } + ai->dev = dev; spin_lock_init(&ai->aux_lock); sema_init(&ai->sem, 1); ai->config.len = 0; @@ -2815,15 +2726,13 @@ static struct net_device *_init_airo_card( unsigned short irq, int port, ai->thr_pid = kernel_thread(airo_thread, dev, CLONE_FS | CLONE_FILES); if (ai->thr_pid < 0) goto err_out_free; +#ifdef MICSUPPORT ai->tfm = NULL; +#endif rc = add_airo_dev( dev ); if (rc) goto err_out_thr; - if (airo_networks_allocate (ai)) - goto err_out_unlink; - airo_networks_initialize (ai); - /* The Airo-specific entries in the device structure. */ if (test_bit(FLAG_MPI,&ai->flags)) { skb_queue_head_init (&ai->txq); @@ -2845,33 +2754,33 @@ static struct net_device *_init_airo_card( unsigned short irq, int port, SET_NETDEV_DEV(dev, dmdev); + reset_card (dev, 1); msleep(400); - rc = request_irq( dev->irq, airo_interrupt, IRQF_SHARED, dev->name, dev ); + rc = request_irq( dev->irq, airo_interrupt, SA_SHIRQ, dev->name, dev ); if (rc) { - airo_print_err(dev->name, "register interrupt %d failed, rc %d", - irq, rc); + printk(KERN_ERR "airo: register interrupt %d failed, rc %d\n", irq, rc ); goto err_out_unlink; } if (!is_pcmcia) { if (!request_region( dev->base_addr, 64, dev->name )) { rc = -EBUSY; - airo_print_err(dev->name, "Couldn't request region"); + printk(KERN_ERR "airo: Couldn't request region\n"); goto err_out_irq; } } if (test_bit(FLAG_MPI,&ai->flags)) { if (mpi_map_card(ai, pci, dev->name)) { - airo_print_err(dev->name, "Could not map memory"); + printk(KERN_ERR "airo: Could not map memory\n"); goto err_out_res; } } if (probe) { if ( setup_card( ai, dev->dev_addr, 1 ) != SUCCESS ) { - airo_print_err(dev->name, "MAC could not be enabled" ); + printk( KERN_ERR "airo: MAC could not be enabled\n" ); rc = -EIO; goto err_out_map; } @@ -2880,34 +2789,23 @@ 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"); + printk(KERN_ERR "airo: Couldn't register_netdev\n"); goto err_out_map; } ai->wifidev = init_wifidev(ai, dev); set_bit(FLAG_REGISTERED,&ai->flags); - airo_print_info(dev->name, "MAC enabled %x:%x:%x:%x:%x:%x", + printk( KERN_INFO "airo: MAC enabled %s %x:%x:%x:%x:%x:%x\n", + dev->name, dev->dev_addr[0], dev->dev_addr[1], dev->dev_addr[2], dev->dev_addr[3], dev->dev_addr[4], dev->dev_addr[5] ); /* Allocate the transmit buffers */ if (probe && !test_bit(FLAG_MPI,&ai->flags)) for( i = 0; i < MAX_FIDS; i++ ) - ai->fids[i] = transmit_allocate(ai,AIRO_DEF_MTU,i>=MAX_FIDS/2); + ai->fids[i] = transmit_allocate(ai,2312,i>=MAX_FIDS/2); setup_proc_entry( dev, dev->priv ); /* XXX check for failure */ netif_start_queue(dev); @@ -2929,7 +2827,7 @@ err_out_irq: err_out_unlink: del_airo_dev(dev); err_out_thr: - set_bit(JOB_DIE, &ai->jobs); + set_bit(JOB_DIE, &ai->flags); kill_proc(ai->thr_pid, SIGTERM, 1); wait_for_completion(&ai->thr_exited); err_out_free: @@ -2964,16 +2862,16 @@ int reset_airo_card( struct net_device *dev ) return -1; if ( setup_card(ai, dev->dev_addr, 1 ) != SUCCESS ) { - airo_print_err(dev->name, "MAC could not be enabled"); + printk( KERN_ERR "airo: MAC could not be enabled\n" ); return -1; } - airo_print_info(dev->name, "MAC enabled %x:%x:%x:%x:%x:%x", + printk( KERN_INFO "airo: MAC enabled %s %x:%x:%x:%x:%x:%x\n", dev->name, dev->dev_addr[0], dev->dev_addr[1], dev->dev_addr[2], dev->dev_addr[3], dev->dev_addr[4], dev->dev_addr[5]); /* Allocate the transmit buffers if needed */ if (!test_bit(FLAG_MPI,&ai->flags)) for( i = 0; i < MAX_FIDS; i++ ) - ai->fids[i] = transmit_allocate (ai,AIRO_DEF_MTU,i>=MAX_FIDS/2); + ai->fids[i] = transmit_allocate (ai,2312,i>=MAX_FIDS/2); enable_interrupts( ai ); netif_wake_queue(dev); @@ -2987,7 +2885,7 @@ static void airo_send_event(struct net_device *dev) { union iwreq_data wrqu; StatusRid status_rid; - clear_bit(JOB_EVENT, &ai->jobs); + clear_bit(JOB_EVENT, &ai->flags); PC4500_readrid(ai, RID_STATUS, &status_rid, sizeof(status_rid), 0); up(&ai->sem); wrqu.data.length = 0; @@ -2999,65 +2897,6 @@ static void airo_send_event(struct net_device *dev) { wireless_send_event(dev, SIOCGIWAP, &wrqu, NULL); } -static void airo_process_scan_results (struct airo_info *ai) { - union iwreq_data wrqu; - BSSListRid bss; - int rc; - BSSListElement * loop_net; - BSSListElement * tmp_net; - - /* Blow away current list of scan results */ - list_for_each_entry_safe (loop_net, tmp_net, &ai->network_list, list) { - list_move_tail (&loop_net->list, &ai->network_free_list); - /* Don't blow away ->list, just BSS data */ - memset (loop_net, 0, sizeof (loop_net->bss)); - } - - /* Try to read the first entry of the scan result */ - 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) && (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, - BSSListElement, list); - list_del(ai->network_free_list.next); - } - - if (tmp_net != NULL) { - 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, ai->bssListNext, - &bss, ai->bssListRidLen, 0); - } - -out: - ai->scan_timeout = 0; - clear_bit(JOB_SCAN_RESULTS, &ai->jobs); - up(&ai->sem); - - /* 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 - Jean II */ - wrqu.data.length = 0; - wrqu.data.flags = 0; - wireless_send_event(ai->dev, SIOCGIWSCAN, &wrqu, NULL); -} - static int airo_thread(void *data) { struct net_device *dev = data; struct airo_info *ai = dev->priv; @@ -3073,10 +2912,10 @@ static int airo_thread(void *data) { /* make swsusp happy with our thread */ try_to_freeze(); - if (test_bit(JOB_DIE, &ai->jobs)) + if (test_bit(JOB_DIE, &ai->flags)) break; - if (ai->jobs) { + if (ai->flags & JOB_MASK) { locked = down_interruptible(&ai->sem); } else { wait_queue_t wait; @@ -3085,28 +2924,15 @@ static int airo_thread(void *data) { add_wait_queue(&ai->thr_wait, &wait); for (;;) { set_current_state(TASK_INTERRUPTIBLE); - if (ai->jobs) + if (ai->flags & JOB_MASK) break; - if (ai->expires || ai->scan_timeout) { - if (ai->scan_timeout && - time_after_eq(jiffies,ai->scan_timeout)){ - set_bit(JOB_SCAN_RESULTS, &ai->jobs); - break; - } else if (ai->expires && - time_after_eq(jiffies,ai->expires)){ - set_bit(JOB_AUTOWEP, &ai->jobs); + if (ai->expires) { + if (time_after_eq(jiffies,ai->expires)){ + set_bit(JOB_AUTOWEP,&ai->flags); break; } if (!signal_pending(current)) { - unsigned long wake_at; - if (!ai->expires || !ai->scan_timeout) { - wake_at = max(ai->expires, - ai->scan_timeout); - } else { - wake_at = min(ai->expires, - ai->scan_timeout); - } - schedule_timeout(wake_at - jiffies); + schedule_timeout(ai->expires - jiffies); continue; } } else if (!signal_pending(current)) { @@ -3123,7 +2949,7 @@ static int airo_thread(void *data) { if (locked) continue; - if (test_bit(JOB_DIE, &ai->jobs)) { + if (test_bit(JOB_DIE, &ai->flags)) { up(&ai->sem); break; } @@ -3133,26 +2959,24 @@ static int airo_thread(void *data) { continue; } - if (test_bit(JOB_XMIT, &ai->jobs)) + if (test_bit(JOB_XMIT, &ai->flags)) airo_end_xmit(dev); - else if (test_bit(JOB_XMIT11, &ai->jobs)) + else if (test_bit(JOB_XMIT11, &ai->flags)) airo_end_xmit11(dev); - else if (test_bit(JOB_STATS, &ai->jobs)) + else if (test_bit(JOB_STATS, &ai->flags)) airo_read_stats(ai); - else if (test_bit(JOB_WSTATS, &ai->jobs)) + else if (test_bit(JOB_WSTATS, &ai->flags)) airo_read_wireless_stats(ai); - else if (test_bit(JOB_PROMISC, &ai->jobs)) + else if (test_bit(JOB_PROMISC, &ai->flags)) airo_set_promisc(ai); - else if (test_bit(JOB_MIC, &ai->jobs)) +#ifdef MICSUPPORT + else if (test_bit(JOB_MIC, &ai->flags)) micinit(ai); - else if (test_bit(JOB_EVENT, &ai->jobs)) +#endif + else if (test_bit(JOB_EVENT, &ai->flags)) airo_send_event(dev); - else if (test_bit(JOB_AUTOWEP, &ai->jobs)) + else if (test_bit(JOB_AUTOWEP, &ai->flags)) timer_func(dev); - 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); } complete_and_exit (&ai->thr_exited, 0); } @@ -3186,14 +3010,15 @@ static irqreturn_t airo_interrupt ( int irq, void* dev_id, struct pt_regs *regs) if ( status & EV_MIC ) { OUT4500( apriv, EVACK, EV_MIC ); +#ifdef MICSUPPORT if (test_bit(FLAG_MIC_CAPABLE, &apriv->flags)) { - set_bit(JOB_MIC, &apriv->jobs); + set_bit(JOB_MIC, &apriv->flags); wake_up_interruptible(&apriv->thr_wait); } +#endif } if ( status & EV_LINK ) { union iwreq_data wrqu; - int scan_forceloss = 0; /* The link status has changed, if you want to put a monitor hook in, do it here. (Remember that interrupts are still disabled!) @@ -3212,8 +3037,7 @@ static irqreturn_t airo_interrupt ( int irq, void* dev_id, struct pt_regs *regs) code) */ #define AUTHFAIL 0x0300 /* Authentication failure (low byte is reason code) */ -#define ASSOCIATED 0x0400 /* Associated */ -#define REASSOCIATED 0x0600 /* Reassociated? Only on firmware >= 5.30.17 */ +#define ASSOCIATED 0x0400 /* Assocatied */ #define RC_RESERVED 0 /* Reserved return code */ #define RC_NOREASON 1 /* Unspecified reason */ #define RC_AUTHINV 2 /* Previous authentication invalid */ @@ -3230,30 +3054,48 @@ static irqreturn_t airo_interrupt ( int irq, void* dev_id, struct pt_regs *regs) leaving BSS */ #define RC_NOAUTH 9 /* Station requesting (Re)Association is not Authenticated with the responding station */ - if (newStatus == FORCELOSS && apriv->scan_timeout > 0) - scan_forceloss = 1; - if(newStatus == ASSOCIATED || newStatus == REASSOCIATED) { + if (newStatus != ASSOCIATED) { + if (auto_wep && !apriv->expires) { + apriv->expires = RUN_AT(3*HZ); + wake_up_interruptible(&apriv->thr_wait); + } + } else { + struct task_struct *task = apriv->task; if (auto_wep) apriv->expires = 0; - if (apriv->task) - wake_up_process (apriv->task); + if (task) + wake_up_process (task); set_bit(FLAG_UPDATE_UNI, &apriv->flags); set_bit(FLAG_UPDATE_MULTI, &apriv->flags); - + } + /* Question : is ASSOCIATED the only status + * that is valid ? We want to catch handover + * and reassociations as valid status + * Jean II */ + if(newStatus == ASSOCIATED) { + if (apriv->scan_timestamp) { + /* 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 - Jean II */ + wrqu.data.length = 0; + wrqu.data.flags = 0; + wireless_send_event(dev, SIOCGIWSCAN, &wrqu, NULL); + apriv->scan_timestamp = 0; + } if (down_trylock(&apriv->sem) != 0) { - set_bit(JOB_EVENT, &apriv->jobs); + set_bit(JOB_EVENT, &apriv->flags); wake_up_interruptible(&apriv->thr_wait); } else airo_send_event(dev); - } else if (!scan_forceloss) { - if (auto_wep && !apriv->expires) { - apriv->expires = RUN_AT(3*HZ); - wake_up_interruptible(&apriv->thr_wait); - } - - /* Send event to user space */ + } else { memset(wrqu.ap_addr.sa_data, '\0', ETH_ALEN); wrqu.ap_addr.sa_family = ARPHRD_ETHER; + + /* Send event to user space */ wireless_send_event(dev, SIOCGIWAP, &wrqu,NULL); } } @@ -3301,8 +3143,8 @@ static irqreturn_t airo_interrupt ( int irq, void* dev_id, struct pt_regs *regs) } len = le16_to_cpu(hdr.len); - if (len > AIRO_DEF_MTU) { - airo_print_err(apriv->dev->name, "Bad size %d", len); + if (len > 2312) { + printk( KERN_ERR "airo: Bad size %d\n", len ); goto badrx; } if (len == 0) @@ -3345,17 +3187,18 @@ static irqreturn_t airo_interrupt ( int irq, void* dev_id, struct pt_regs *regs) bap_read (apriv, &gap, sizeof(gap), BAP0); gap = le16_to_cpu(gap); if (gap) { - if (gap <= 8) { + if (gap <= 8) bap_read (apriv, tmpbuf, gap, BAP0); - } else { - airo_print_err(apriv->dev->name, "gaplen too " - "big. Problems will follow..."); - } + else + printk(KERN_ERR "airo: gaplen too big. Problems will follow...\n"); } bap_read (apriv, buffer + hdrlen/2, len, BAP0); } else { +#ifdef MICSUPPORT MICBuffer micbuf; +#endif bap_read (apriv, buffer, ETH_ALEN*2, BAP0); +#ifdef MICSUPPORT if (apriv->micstats.enabled) { bap_read (apriv,(u16*)&micbuf,sizeof(micbuf),BAP0); if (ntohs(micbuf.typelen) > 0x05DC) @@ -3368,10 +3211,15 @@ static irqreturn_t airo_interrupt ( int irq, void* dev_id, struct pt_regs *regs) skb_trim (skb, len + hdrlen); } } +#endif bap_read(apriv,buffer+ETH_ALEN,len,BAP0); +#ifdef MICSUPPORT if (decapsulate(apriv,&micbuf,(etherHead*)buffer,len)) { badmic: dev_kfree_skb_irq (skb); +#else + if (0) { +#endif badrx: OUT4500( apriv, EVACK, EV_RX); goto exitrx; @@ -3467,13 +3315,12 @@ exitrx: } } else { OUT4500( apriv, EVACK, status & (EV_TX | EV_TXCPY | EV_TXEXC)); - airo_print_err(apriv->dev->name, "Unallocated FID was " - "used to xmit" ); + printk( KERN_ERR "airo: Unallocated FID was used to xmit\n" ); } } exittx: if ( status & ~STATUS_INTS & ~IGNORE_INTS ) - airo_print_warn(apriv->dev->name, "Got weird status %x", + printk( KERN_WARNING "airo: Got weird status %x\n", status & ~STATUS_INTS & ~IGNORE_INTS ); } @@ -3546,8 +3393,8 @@ static int enable_MAC( struct airo_info *ai, Resp *rsp, int lock ) { up(&ai->sem); if (rc) - airo_print_err(ai->dev->name, "%s: Cannot enable MAC, err=%d", - __FUNCTION__, rc); + printk(KERN_ERR "%s: Cannot enable MAC, err=%d\n", + __FUNCTION__,rc); return rc; } @@ -3583,8 +3430,10 @@ static void mpi_receive_802_3(struct airo_info *ai) int len = 0; struct sk_buff *skb; char *buffer; +#ifdef MICSUPPORT int off = 0; MICBuffer micbuf; +#endif memcpy_fromio(&rxd, ai->rxfids[0].card_ram_off, sizeof(rxd)); /* Make sure we got something */ @@ -3599,6 +3448,7 @@ static void mpi_receive_802_3(struct airo_info *ai) goto badrx; } buffer = skb_put(skb,len); +#ifdef MICSUPPORT memcpy(buffer, ai->rxfids[0].virtual_host_addr, ETH_ALEN * 2); if (ai->micstats.enabled) { memcpy(&micbuf, @@ -3620,6 +3470,9 @@ badmic: dev_kfree_skb_irq (skb); goto badrx; } +#else + memcpy(buffer, ai->rxfids[0].virtual_host_addr, len); +#endif #ifdef WIRELESS_SPY if (ai->spy_data.spy_number > 0) { char *sa; @@ -3676,8 +3529,8 @@ void mpi_receive_802_11 (struct airo_info *ai) if (ai->wifidev == NULL) hdr.len = 0; len = le16_to_cpu(hdr.len); - if (len > AIRO_DEF_MTU) { - airo_print_err(ai->dev->name, "Bad size %d", len); + if (len > 2312) { + printk( KERN_ERR "airo: Bad size %d\n", len ); goto badrx; } if (len == 0) @@ -3718,8 +3571,8 @@ void mpi_receive_802_11 (struct airo_info *ai) if (gap <= 8) ptr += gap; else - airo_print_err(ai->dev->name, - "gaplen too big. Problems will follow..."); + printk(KERN_ERR + "airo: gaplen too big. Problems will follow...\n"); } memcpy ((char *)buffer + hdrlen, ptr, len); ptr += len; @@ -3791,15 +3644,15 @@ static u16 setup_card(struct airo_info *ai, u8 *mac, int lock) if (issuecommand(ai, &cmd, &rsp) != SUCCESS) { if (lock) up(&ai->sem); - airo_print_err(ai->dev->name, "Error checking for AUX port"); + printk(KERN_ERR "airo: Error checking for AUX port\n"); return ERROR; } if (!aux_bap || rsp.status & 0xff00) { ai->bap_read = fast_bap_read; - airo_print_dbg(ai->dev->name, "Doing fast bap_reads"); + printk(KERN_DEBUG "airo: Doing fast bap_reads\n"); } else { ai->bap_read = aux_bap_read; - airo_print_dbg(ai->dev->name, "Doing AUX bap_reads"); + printk(KERN_DEBUG "airo: Doing AUX bap_reads\n"); } } if (lock) @@ -3830,18 +3683,19 @@ static u16 setup_card(struct airo_info *ai, u8 *mac, int lock) if (cap_rid.softCap & 8) ai->config.rmode |= RXMODE_NORMALIZED_RSSI; else - airo_print_warn(ai->dev->name, "unknown received signal " - "level scale"); + printk(KERN_WARNING "airo: unknown received signal level scale\n"); } ai->config.opmode = adhoc ? MODE_STA_IBSS : MODE_STA_ESS; ai->config.authType = AUTH_OPEN; ai->config.modulation = MOD_CCK; +#ifdef MICSUPPORT if ((cap_rid.len>=sizeof(cap_rid)) && (cap_rid.extSoftCap&1) && (micsetup(ai) == SUCCESS)) { ai->config.opmode |= MODE_MIC; set_bit(FLAG_MIC_CAPABLE, &ai->flags); } +#endif /* Save off the MAC */ for( i = 0; i < ETH_ALEN; i++ ) { @@ -3894,8 +3748,7 @@ static u16 setup_card(struct airo_info *ai, u8 *mac, int lock) status = enable_MAC(ai, &rsp, lock); if ( status != SUCCESS || (rsp.status & 0xFF00) != 0) { - airo_print_err(ai->dev->name, "Bad MAC enable reason = %x, rid = %x," - " offset = %d", rsp.rsp0, rsp.rsp1, rsp.rsp2 ); + printk( KERN_ERR "airo: Bad MAC enable reason = %x, rid = %x, offset = %d\n", rsp.rsp0, rsp.rsp1, rsp.rsp2 ); return ERROR; } @@ -3938,8 +3791,8 @@ static u16 issuecommand(struct airo_info *ai, Cmd *pCmd, Resp *pRsp) { } if ( max_tries == -1 ) { - airo_print_err(ai->dev->name, - "Max tries exceeded when issueing command"); + printk( KERN_ERR + "airo: Max tries exceeded when issueing command\n" ); if (IN4500(ai, COMMAND) & COMMAND_BUSY) OUT4500(ai, EVACK, EV_CLEARCOMMANDBUSY); return ERROR; @@ -3951,11 +3804,11 @@ static u16 issuecommand(struct airo_info *ai, Cmd *pCmd, Resp *pRsp) { pRsp->rsp1 = IN4500(ai, RESP1); pRsp->rsp2 = IN4500(ai, RESP2); if ((pRsp->status & 0xff00)!=0 && pCmd->cmd != CMD_SOFTRESET) { - airo_print_err(ai->dev->name, "cmd= %x\n", pCmd->cmd); - airo_print_err(ai->dev->name, "status= %x\n", pRsp->status); - airo_print_err(ai->dev->name, "Rsp0= %x\n", pRsp->rsp0); - airo_print_err(ai->dev->name, "Rsp1= %x\n", pRsp->rsp1); - airo_print_err(ai->dev->name, "Rsp2= %x\n", pRsp->rsp2); + printk (KERN_ERR "airo: cmd= %x\n", pCmd->cmd); + printk (KERN_ERR "airo: status= %x\n", pRsp->status); + printk (KERN_ERR "airo: Rsp0= %x\n", pRsp->rsp0); + printk (KERN_ERR "airo: Rsp1= %x\n", pRsp->rsp1); + printk (KERN_ERR "airo: Rsp2= %x\n", pRsp->rsp2); } // clear stuck command busy if necessary @@ -3988,15 +3841,15 @@ static int bap_setup(struct airo_info *ai, u16 rid, u16 offset, int whichbap ) } } else if ( status & BAP_ERR ) { /* invalid rid or offset */ - airo_print_err(ai->dev->name, "BAP error %x %d", + printk( KERN_ERR "airo: BAP error %x %d\n", status, whichbap ); return ERROR; } else if (status & BAP_DONE) { // success return SUCCESS; } if ( !(max_tries--) ) { - airo_print_err(ai->dev->name, - "airo: BAP setup error too many retries\n"); + printk( KERN_ERR + "airo: BAP setup error too many retries\n" ); return ERROR; } // -- PC4500 missed it, try again @@ -4151,8 +4004,8 @@ static int PC4500_readrid(struct airo_info *ai, u16 rid, void *pBuf, int len, in len = min(len, (int)le16_to_cpu(*(u16*)pBuf)) - 2; if ( len <= 2 ) { - airo_print_err(ai->dev->name, - "Rid %x has a length of %d which is too short", + printk( KERN_ERR + "airo: Rid %x has a length of %d which is too short\n", (int)rid, (int)len ); rc = ERROR; goto done; @@ -4185,8 +4038,8 @@ static int PC4500_writerid(struct airo_info *ai, u16 rid, Resp rsp; if (test_bit(FLAG_ENABLED, &ai->flags) && (RID_WEP_TEMP != rid)) - airo_print_err(ai->dev->name, - "%s: MAC should be disabled (rid=%04x)", + printk(KERN_ERR + "%s: MAC should be disabled (rid=%04x)\n", __FUNCTION__, rid); memset(&cmd, 0, sizeof(cmd)); memset(&rsp, 0, sizeof(rsp)); @@ -4202,7 +4055,7 @@ static int PC4500_writerid(struct airo_info *ai, u16 rid, &ai->config_desc.rid_desc, sizeof(Rid)); if (len < 4 || len > 2047) { - airo_print_err(ai->dev->name, "%s: len=%d", __FUNCTION__, len); + printk(KERN_ERR "%s: len=%d\n",__FUNCTION__,len); rc = -1; } else { memcpy((char *)ai->config_desc.virtual_host_addr, @@ -4210,10 +4063,10 @@ static int PC4500_writerid(struct airo_info *ai, u16 rid, rc = issuecommand(ai, &cmd, &rsp); if ((rc & 0xff00) != 0) { - airo_print_err(ai->dev->name, "%s: Write rid Error %d", - __FUNCTION__, rc); - airo_print_err(ai->dev->name, "%s: Cmd=%04x", - __FUNCTION__, cmd.cmd); + printk(KERN_ERR "%s: Write rid Error %d\n", + __FUNCTION__,rc); + printk(KERN_ERR "%s: Cmd=%04x\n", + __FUNCTION__,cmd.cmd); } if ((rsp.status & 0x7f00)) @@ -4312,17 +4165,20 @@ static int transmit_802_3_packet(struct airo_info *ai, int len, char *pPacket) len >>= 16; if (len <= ETH_ALEN * 2) { - airo_print_warn(ai->dev->name, "Short packet %d", len); + printk( KERN_WARNING "Short packet %d\n", len ); return ERROR; } len -= ETH_ALEN * 2; +#ifdef MICSUPPORT if (test_bit(FLAG_MIC_CAPABLE, &ai->flags) && ai->micstats.enabled && (ntohs(((u16 *)pPacket)[6]) != 0x888E)) { if (encapsulate(ai,(etherHead *)pPacket,&pMic,len) != SUCCESS) return ERROR; miclen = sizeof(pMic); } +#endif + // packet is destination[6], source[6], payload[len-12] // write the payload length and dst/src/payload if (bap_setup(ai, txFid, 0x0036, BAP1) != SUCCESS) return ERROR; @@ -4376,7 +4232,7 @@ static int transmit_802_11_packet(struct airo_info *ai, int len, char *pPacket) } if (len < hdrlen) { - airo_print_warn(ai->dev->name, "Short packet %d", len); + printk( KERN_WARNING "Short packet %d\n", len ); return ERROR; } @@ -4773,14 +4629,15 @@ static int proc_stats_rid_open( struct inode *inode, i*44096) { - airo_print_warn(apriv->dev->name, - "Potentially disasterous buffer overflow averted!"); + printk(KERN_WARNING + "airo: Potentially disasterous buffer overflow averted!\n"); break; } j+=sprintf(data->rbuffer+j, "%s: %u\n", statsLabels[i], vals[i]); } if (i*4>=stats.len){ - airo_print_warn(apriv->dev->name, "Got a short rid"); + printk(KERN_WARNING + "airo: Got a short rid\n"); } data->readlen = j; return 0; @@ -4942,7 +4799,7 @@ static void proc_config_on_close( struct inode *inode, struct file *file ) { line += 14; v = get_dec_u16(line, &i, 4); - v = (v<0) ? 0 : ((v>AIRO_DEF_MTU) ? AIRO_DEF_MTU : v); + v = (v<0) ? 0 : ((v>2312) ? 2312 : v); ai->config.rtsThres = (u16)v; set_bit (FLAG_COMMIT, &ai->flags); } else if ( !strncmp( line, "TXMSDULifetime: ", 16 ) ) { @@ -4976,7 +4833,7 @@ static void proc_config_on_close( struct inode *inode, struct file *file ) { line += 15; v = get_dec_u16(line, &i, 4); - v = (v<256) ? 256 : ((v>AIRO_DEF_MTU) ? AIRO_DEF_MTU : v); + v = (v<256) ? 256 : ((v>2312) ? 2312 : v); v = v & 0xfffe; /* Make sure its even */ ai->config.fragThresh = (u16)v; set_bit (FLAG_COMMIT, &ai->flags); @@ -4986,7 +4843,8 @@ static void proc_config_on_close( struct inode *inode, struct file *file ) { case 'd': ai->config.modulation=MOD_DEFAULT; set_bit(FLAG_COMMIT, &ai->flags); break; case 'c': ai->config.modulation=MOD_CCK; set_bit(FLAG_COMMIT, &ai->flags); break; case 'm': ai->config.modulation=MOD_MOK; set_bit(FLAG_COMMIT, &ai->flags); break; - default: airo_print_warn(ai->dev->name, "Unknown modulation"); + default: + printk( KERN_WARNING "airo: Unknown modulation\n" ); } } else if (!strncmp(line, "Preamble: ", 10)) { line += 10; @@ -4994,10 +4852,10 @@ static void proc_config_on_close( struct inode *inode, struct file *file ) { case 'a': ai->config.preamble=PREAMBLE_AUTO; set_bit(FLAG_COMMIT, &ai->flags); break; case 'l': ai->config.preamble=PREAMBLE_LONG; set_bit(FLAG_COMMIT, &ai->flags); break; case 's': ai->config.preamble=PREAMBLE_SHORT; set_bit(FLAG_COMMIT, &ai->flags); break; - default: airo_print_warn(ai->dev->name, "Unknown preamble"); + default: printk(KERN_WARNING "airo: Unknown preamble\n"); } } else { - airo_print_warn(ai->dev->name, "Couldn't figure out %s", line); + printk( KERN_WARNING "Couldn't figure out %s\n", line ); } while( line[0] && line[0] != '\n' ) line++; if ( line[0] ) line++; @@ -5223,6 +5081,7 @@ static int set_wep_key(struct airo_info *ai, u16 index, wkr.len = sizeof(wkr); wkr.kindex = 0xffff; wkr.mac[0] = (char)index; + if (perm) printk(KERN_INFO "Setting transmit key to %d\n", index); if (perm) ai->defindex = (char)index; } else { // We are actually setting the key @@ -5231,6 +5090,7 @@ static int set_wep_key(struct airo_info *ai, u16 index, wkr.klen = keylen; memcpy( wkr.key, key, keylen ); memcpy( wkr.mac, macaddr, ETH_ALEN ); + printk(KERN_INFO "Setting key %d\n", index); } if (perm) disable_MAC(ai, lock); @@ -5263,7 +5123,7 @@ static void proc_wepkey_on_close( struct inode *inode, struct file *file ) { } j = 2; } else { - airo_print_err(ai->dev->name, "WepKey passed invalid key index"); + printk(KERN_ERR "airo: WepKey passed invalid key index\n"); return; } @@ -5539,7 +5399,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->jobs); + clear_bit(JOB_AUTOWEP, &apriv->flags); apriv->expires = RUN_AT(HZ*3); } @@ -5676,16 +5536,17 @@ static int __init airo_init_module( void ) airo_entry->gid = proc_gid; for( i = 0; i < 4 && io[i] && irq[i]; i++ ) { - airo_print_info("", "Trying to configure ISA adapter at irq=%d " - "io=0x%x", irq[i], io[i] ); + printk( KERN_INFO + "airo: Trying to configure ISA adapter at irq=%d io=0x%x\n", + irq[i], io[i] ); if (init_airo_card( irq[i], io[i], 0, NULL )) have_isa_dev = 1; } #ifdef CONFIG_PCI - airo_print_info("", "Probing for PCI adapters"); + printk( KERN_INFO "airo: Probing for PCI adapters\n" ); pci_register_driver(&airo_driver); - airo_print_info("", "Finished probing for PCI adapters"); + printk( KERN_INFO "airo: Finished probing for PCI adapters\n" ); #endif /* Always exit with success, as we are a library module @@ -5697,7 +5558,7 @@ static int __init airo_init_module( void ) static void __exit airo_cleanup_module( void ) { while( airo_devices ) { - airo_print_info(airo_devices->dev->name, "Unregistering...\n"); + printk( KERN_INFO "airo: Unregistering %s\n", airo_devices->dev->name ); stop_airo_card( airo_devices->dev, 1 ); } #ifdef CONFIG_PCI @@ -5808,8 +5669,7 @@ static int airo_set_freq(struct net_device *dev, /* We should do a better check than that, * based on the card capability !!! */ if((channel < 1) || (channel > 14)) { - airo_print_dbg(dev->name, "New channel value of %d is invalid!", - fwrq->m); + printk(KERN_DEBUG "%s: New channel value of %d is invalid!\n", dev->name, fwrq->m); rc = -EINVAL; } else { readConfigRid(local, 1); @@ -5941,13 +5801,11 @@ static int airo_set_wap(struct net_device *dev, Cmd cmd; Resp rsp; APListRid APList_rid; - static const u8 any[ETH_ALEN] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }; - static const u8 off[ETH_ALEN] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; + static const unsigned char bcast[ETH_ALEN] = { 255, 255, 255, 255, 255, 255 }; if (awrq->sa_family != ARPHRD_ETHER) return -EINVAL; - else if (!memcmp(any, awrq->sa_data, ETH_ALEN) || - !memcmp(off, awrq->sa_data, ETH_ALEN)) { + else if (!memcmp(bcast, awrq->sa_data, ETH_ALEN)) { memset(&cmd, 0, sizeof(cmd)); cmd.cmd=CMD_LOSE_SYNC; if (down_interruptible(&local->sem)) @@ -6133,8 +5991,8 @@ static int airo_set_rts(struct net_device *dev, int rthr = vwrq->value; if(vwrq->disabled) - rthr = AIRO_DEF_MTU; - if((rthr < 0) || (rthr > AIRO_DEF_MTU)) { + rthr = 2312; + if((rthr < 0) || (rthr > 2312)) { return -EINVAL; } readConfigRid(local, 1); @@ -6157,7 +6015,7 @@ static int airo_get_rts(struct net_device *dev, readConfigRid(local, 1); vwrq->value = local->config.rtsThres; - vwrq->disabled = (vwrq->value >= AIRO_DEF_MTU); + vwrq->disabled = (vwrq->value >= 2312); vwrq->fixed = 1; return 0; @@ -6176,8 +6034,8 @@ static int airo_set_frag(struct net_device *dev, int fthr = vwrq->value; if(vwrq->disabled) - fthr = AIRO_DEF_MTU; - if((fthr < 256) || (fthr > AIRO_DEF_MTU)) { + fthr = 2312; + if((fthr < 256) || (fthr > 2312)) { return -EINVAL; } fthr &= ~0x1; /* Get an even value - is it really needed ??? */ @@ -6201,7 +6059,7 @@ static int airo_get_frag(struct net_device *dev, readConfigRid(local, 1); vwrq->value = local->config.fragThresh; - vwrq->disabled = (vwrq->value >= AIRO_DEF_MTU); + vwrq->disabled = (vwrq->value >= 2312); vwrq->fixed = 1; return 0; @@ -6436,272 +6294,6 @@ static int airo_get_encode(struct net_device *dev, return 0; } -/*------------------------------------------------------------------*/ -/* - * Wireless Handler : set extended Encryption parameters - */ -static int airo_set_encodeext(struct net_device *dev, - struct iw_request_info *info, - union iwreq_data *wrqu, - char *extra) -{ - struct airo_info *local = dev->priv; - struct iw_point *encoding = &wrqu->encoding; - struct iw_encode_ext *ext = (struct iw_encode_ext *)extra; - CapabilityRid cap_rid; /* Card capability info */ - int perm = ( encoding->flags & IW_ENCODE_TEMP ? 0 : 1 ); - u16 currentAuthType = local->config.authType; - int idx, key_len, alg = ext->alg, set_key = 1; - wep_key_t key; - - /* Is WEP supported ? */ - readCapabilityRid(local, &cap_rid, 1); - /* Older firmware doesn't support this... - if(!(cap_rid.softCap & 2)) { - return -EOPNOTSUPP; - } */ - readConfigRid(local, 1); - - /* Determine and validate the key index */ - idx = encoding->flags & IW_ENCODE_INDEX; - if (idx) { - if (idx < 1 || idx > ((cap_rid.softCap & 0x80) ? 4:1)) - return -EINVAL; - idx--; - } else - idx = get_wep_key(local, 0xffff); - - if (encoding->flags & IW_ENCODE_DISABLED) - alg = IW_ENCODE_ALG_NONE; - - if (ext->ext_flags & IW_ENCODE_EXT_SET_TX_KEY) { - /* Only set transmit key index here, actual - * key is set below if needed. - */ - set_wep_key(local, idx, NULL, 0, perm, 1); - set_key = ext->key_len > 0 ? 1 : 0; - } - - if (set_key) { - /* Set the requested key first */ - memset(key.key, 0, MAX_KEY_SIZE); - switch (alg) { - case IW_ENCODE_ALG_NONE: - key.len = 0; - break; - case IW_ENCODE_ALG_WEP: - if (ext->key_len > MIN_KEY_SIZE) { - key.len = MAX_KEY_SIZE; - } else if (ext->key_len > 0) { - key.len = MIN_KEY_SIZE; - } else { - return -EINVAL; - } - key_len = min (ext->key_len, key.len); - memcpy(key.key, ext->key, key_len); - break; - default: - return -EINVAL; - } - /* Send the key to the card */ - set_wep_key(local, idx, key.key, key.len, perm, 1); - } - - /* Read the flags */ - if(encoding->flags & IW_ENCODE_DISABLED) - local->config.authType = AUTH_OPEN; // disable encryption - if(encoding->flags & IW_ENCODE_RESTRICTED) - local->config.authType = AUTH_SHAREDKEY; // Only Both - if(encoding->flags & IW_ENCODE_OPEN) - local->config.authType = AUTH_ENCRYPT; // Only Wep - /* Commit the changes to flags if needed */ - if (local->config.authType != currentAuthType) - set_bit (FLAG_COMMIT, &local->flags); - - return -EINPROGRESS; -} - - -/*------------------------------------------------------------------*/ -/* - * Wireless Handler : get extended Encryption parameters - */ -static int airo_get_encodeext(struct net_device *dev, - struct iw_request_info *info, - union iwreq_data *wrqu, - char *extra) -{ - struct airo_info *local = dev->priv; - struct iw_point *encoding = &wrqu->encoding; - struct iw_encode_ext *ext = (struct iw_encode_ext *)extra; - CapabilityRid cap_rid; /* Card capability info */ - int idx, max_key_len; - - /* Is it supported ? */ - readCapabilityRid(local, &cap_rid, 1); - if(!(cap_rid.softCap & 2)) { - return -EOPNOTSUPP; - } - readConfigRid(local, 1); - - max_key_len = encoding->length - sizeof(*ext); - if (max_key_len < 0) - return -EINVAL; - - idx = encoding->flags & IW_ENCODE_INDEX; - if (idx) { - if (idx < 1 || idx > ((cap_rid.softCap & 0x80) ? 4:1)) - return -EINVAL; - idx--; - } else - idx = get_wep_key(local, 0xffff); - - encoding->flags = idx + 1; - memset(ext, 0, sizeof(*ext)); - - /* Check encryption mode */ - switch(local->config.authType) { - case AUTH_ENCRYPT: - encoding->flags = IW_ENCODE_ALG_WEP | IW_ENCODE_ENABLED; - break; - case AUTH_SHAREDKEY: - encoding->flags = IW_ENCODE_ALG_WEP | IW_ENCODE_ENABLED; - break; - default: - case AUTH_OPEN: - encoding->flags = IW_ENCODE_ALG_NONE | IW_ENCODE_DISABLED; - break; - } - /* We can't return the key, so set the proper flag and return zero */ - encoding->flags |= IW_ENCODE_NOKEY; - memset(extra, 0, 16); - - /* Copy the key to the user buffer */ - ext->key_len = get_wep_key(local, idx); - if (ext->key_len > 16) { - ext->key_len=0; - } - - return 0; -} - - -/*------------------------------------------------------------------*/ -/* - * Wireless Handler : set extended authentication parameters - */ -static int airo_set_auth(struct net_device *dev, - struct iw_request_info *info, - union iwreq_data *wrqu, char *extra) -{ - struct airo_info *local = dev->priv; - struct iw_param *param = &wrqu->param; - u16 currentAuthType = local->config.authType; - - switch (param->flags & IW_AUTH_INDEX) { - case IW_AUTH_WPA_VERSION: - case IW_AUTH_CIPHER_PAIRWISE: - case IW_AUTH_CIPHER_GROUP: - case IW_AUTH_KEY_MGMT: - case IW_AUTH_RX_UNENCRYPTED_EAPOL: - case IW_AUTH_PRIVACY_INVOKED: - /* - * airo does not use these parameters - */ - break; - - case IW_AUTH_DROP_UNENCRYPTED: - if (param->value) { - /* Only change auth type if unencrypted */ - if (currentAuthType == AUTH_OPEN) - local->config.authType = AUTH_ENCRYPT; - } else { - local->config.authType = AUTH_OPEN; - } - - /* Commit the changes to flags if needed */ - if (local->config.authType != currentAuthType) - set_bit (FLAG_COMMIT, &local->flags); - break; - - case IW_AUTH_80211_AUTH_ALG: { - /* FIXME: What about AUTH_OPEN? This API seems to - * disallow setting our auth to AUTH_OPEN. - */ - if (param->value & IW_AUTH_ALG_SHARED_KEY) { - local->config.authType = AUTH_SHAREDKEY; - } else if (param->value & IW_AUTH_ALG_OPEN_SYSTEM) { - local->config.authType = AUTH_ENCRYPT; - } else - return -EINVAL; - break; - - /* Commit the changes to flags if needed */ - if (local->config.authType != currentAuthType) - set_bit (FLAG_COMMIT, &local->flags); - } - - case IW_AUTH_WPA_ENABLED: - /* Silently accept disable of WPA */ - if (param->value > 0) - return -EOPNOTSUPP; - break; - - default: - return -EOPNOTSUPP; - } - return -EINPROGRESS; -} - - -/*------------------------------------------------------------------*/ -/* - * Wireless Handler : get extended authentication parameters - */ -static int airo_get_auth(struct net_device *dev, - struct iw_request_info *info, - union iwreq_data *wrqu, char *extra) -{ - struct airo_info *local = dev->priv; - struct iw_param *param = &wrqu->param; - u16 currentAuthType = local->config.authType; - - switch (param->flags & IW_AUTH_INDEX) { - case IW_AUTH_DROP_UNENCRYPTED: - switch (currentAuthType) { - case AUTH_SHAREDKEY: - case AUTH_ENCRYPT: - param->value = 1; - break; - default: - param->value = 0; - break; - } - break; - - case IW_AUTH_80211_AUTH_ALG: - switch (currentAuthType) { - case AUTH_SHAREDKEY: - param->value = IW_AUTH_ALG_SHARED_KEY; - break; - case AUTH_ENCRYPT: - default: - param->value = IW_AUTH_ALG_OPEN_SYSTEM; - break; - } - break; - - case IW_AUTH_WPA_ENABLED: - param->value = 0; - break; - - default: - return -EOPNOTSUPP; - } - return 0; -} - - /*------------------------------------------------------------------*/ /* * Wireless Handler : set Tx-Power @@ -6896,9 +6488,9 @@ static int airo_get_range(struct net_device *dev, range->throughput = 1500 * 1000; range->min_rts = 0; - range->max_rts = AIRO_DEF_MTU; + range->max_rts = 2312; range->min_frag = 256; - range->max_frag = AIRO_DEF_MTU; + range->max_frag = 2312; if(cap_rid.softCap & 2) { // WEP: RC4 40 bits @@ -6930,7 +6522,7 @@ static int airo_get_range(struct net_device *dev, } range->num_txpower = i; range->txpower_capa = IW_TXPOW_MWATT; - range->we_version_source = 19; + range->we_version_source = 12; range->we_version_compiled = WIRELESS_EXT; range->retry_capa = IW_RETRY_LIMIT | IW_RETRY_LIFETIME; range->retry_flags = IW_RETRY_LIMIT; @@ -7159,7 +6751,6 @@ static int airo_set_scan(struct net_device *dev, struct airo_info *ai = dev->priv; Cmd cmd; Resp rsp; - int wake = 0; /* Note : you may have realised that, as this is a SET operation, * this is privileged and therefore a normal user can't @@ -7169,25 +6760,17 @@ static int airo_set_scan(struct net_device *dev, * Jean II */ if (ai->flags & FLAG_RADIO_MASK) return -ENETDOWN; - if (down_interruptible(&ai->sem)) - return -ERESTARTSYS; - - /* If there's already a scan in progress, don't - * trigger another one. */ - if (ai->scan_timeout > 0) - goto out; - /* Initiate a scan command */ - ai->scan_timeout = RUN_AT(3*HZ); memset(&cmd, 0, sizeof(cmd)); cmd.cmd=CMD_LISTBSS; + if (down_interruptible(&ai->sem)) + return -ERESTARTSYS; issuecommand(ai, &cmd, &rsp); - wake = 1; - -out: + ai->scan_timestamp = jiffies; up(&ai->sem); - if (wake) - wake_up_interruptible(&ai->thr_wait); + + /* At this point, just return to the user. */ + return 0; } @@ -7206,7 +6789,6 @@ 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; @@ -7293,69 +6875,8 @@ static inline char *airo_translate_scan(struct net_device *dev, if((current_val - current_ev) > IW_EV_LCP_LEN) current_ev = current_val; - /* 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]; - } - } + /* The other data in the scan result are not really + * interesting, so for now drop it - Jean II */ return current_ev; } @@ -7369,38 +6890,59 @@ static int airo_get_scan(struct net_device *dev, char *extra) { struct airo_info *ai = dev->priv; - BSSListElement *net; - int err = 0; + BSSListRid BSSList; + int rc; char *current_ev = extra; - /* If a scan is in-progress, return -EAGAIN */ - if (ai->scan_timeout > 0) + /* When we are associated again, the scan has surely finished. + * Just in case, let's make sure enough time has elapsed since + * we started the scan. - Javier */ + if(ai->scan_timestamp && time_before(jiffies,ai->scan_timestamp+3*HZ)) { + /* Important note : we don't want to block the caller + * until results are ready for various reasons. + * First, managing wait queues is complex and racy + * (there may be multiple simultaneous callers). + * Second, we grab some rtnetlink lock before comming + * here (in dev_ioctl()). + * Third, the caller can wait on the Wireless Event + * - Jean II */ return -EAGAIN; + } + ai->scan_timestamp = 0; - if (down_interruptible(&ai->sem)) - return -EAGAIN; + /* There's only a race with proc_BSSList_open(), but its + * consequences are begnign. So I don't bother fixing it - Javier */ - list_for_each_entry (net, &ai->network_list, list) { + /* Try to read the first entry of the scan result */ + rc = PC4500_readrid(ai, RID_BSSLISTFIRST, &BSSList, sizeof(BSSList), 1); + if((rc) || (BSSList.index == 0xffff)) { + /* Client error, no scan results... + * The caller need to restart the scan. */ + return -ENODATA; + } + + /* Read and parse all entries */ + while((!rc) && (BSSList.index != 0xffff)) { /* Translate to WE format this entry */ current_ev = airo_translate_scan(dev, current_ev, extra + dwrq->length, - &net->bss); + &BSSList); /* Check if there is space for one more entry */ if((extra + dwrq->length - current_ev) <= IW_EV_ADDR_LEN) { /* Ask user space to try again with a bigger buffer */ - err = -E2BIG; - goto out; + return -E2BIG; } - } + /* Read next entry */ + rc = PC4500_readrid(ai, RID_BSSLISTNEXT, + &BSSList, sizeof(BSSList), 1); + } /* Length of data */ dwrq->length = (current_ev - extra); dwrq->flags = 0; /* todo */ -out: - up(&ai->sem); - return err; + return 0; } /*------------------------------------------------------------------*/ @@ -7508,15 +7050,6 @@ static const iw_handler airo_handler[] = (iw_handler) airo_get_encode, /* SIOCGIWENCODE */ (iw_handler) airo_set_power, /* SIOCSIWPOWER */ (iw_handler) airo_get_power, /* SIOCGIWPOWER */ - (iw_handler) NULL, /* -- hole -- */ - (iw_handler) NULL, /* -- hole -- */ - (iw_handler) NULL, /* SIOCSIWGENIE */ - (iw_handler) NULL, /* SIOCGIWGENIE */ - (iw_handler) airo_set_auth, /* SIOCSIWAUTH */ - (iw_handler) airo_get_auth, /* SIOCGIWAUTH */ - (iw_handler) airo_set_encodeext, /* SIOCSIWENCODEEXT */ - (iw_handler) airo_get_encodeext, /* SIOCGIWENCODEEXT */ - (iw_handler) NULL, /* SIOCSIWPMKSA */ }; /* Note : don't describe AIROIDIFC and AIROOLDIDIFC in here. @@ -7637,7 +7170,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->jobs); + clear_bit(JOB_WSTATS, &local->flags); if (local->power.event) { up(&local->sem); return; @@ -7681,10 +7214,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->jobs)) { + if (!test_bit(JOB_WSTATS, &local->flags)) { /* Get stats out of the card if available */ if (down_trylock(&local->sem) != 0) { - set_bit(JOB_WSTATS, &local->jobs); + set_bit(JOB_WSTATS, &local->flags); wake_up_interruptible(&local->thr_wait); } else airo_read_wireless_stats(local); @@ -7737,11 +7270,13 @@ static int readrids(struct net_device *dev, aironet_ioctl *comp) { case AIROGSTAT: ridcode = RID_STATUS; break; case AIROGSTATSD32: ridcode = RID_STATSDELTA; break; case AIROGSTATSC32: ridcode = RID_STATS; break; +#ifdef MICSUPPORT case AIROGMICSTATS: if (copy_to_user(comp->data, &ai->micstats, min((int)comp->len,(int)sizeof(ai->micstats)))) return -EFAULT; return 0; +#endif case AIRORRID: ridcode = comp->ridnum; break; default: return -EINVAL; @@ -7773,7 +7308,9 @@ static int readrids(struct net_device *dev, aironet_ioctl *comp) { static int writerids(struct net_device *dev, aironet_ioctl *comp) { struct airo_info *ai = dev->priv; int ridcode; +#ifdef MICSUPPORT int enabled; +#endif Resp rsp; static int (* writer)(struct airo_info *, u16 rid, const void *, int, int); unsigned char *iobuf; @@ -7830,9 +7367,11 @@ static int writerids(struct net_device *dev, aironet_ioctl *comp) { PC4500_readrid(ai,RID_STATSDELTACLEAR,iobuf,RIDSIZE, 1); +#ifdef MICSUPPORT enabled = ai->micstats.enabled; memset(&ai->micstats,0,sizeof(ai->micstats)); ai->micstats.enabled = enabled; +#endif if (copy_to_user(comp->data, iobuf, min((int)comp->len, (int)RIDSIZE))) { @@ -7948,7 +7487,7 @@ static int cmdreset(struct airo_info *ai) { disable_MAC(ai, 1); if(!waitbusy (ai)){ - airo_print_info(ai->dev->name, "Waitbusy hang before RESET"); + printk(KERN_INFO "Waitbusy hang before RESET\n"); return -EBUSY; } @@ -7957,7 +7496,7 @@ static int cmdreset(struct airo_info *ai) { ssleep(1); /* WAS 600 12/7/00 */ if(!waitbusy (ai)){ - airo_print_info(ai->dev->name, "Waitbusy hang AFTER RESET"); + printk(KERN_INFO "Waitbusy hang AFTER RESET\n"); return -EBUSY; } return 0; @@ -7985,7 +7524,7 @@ static int setflashmode (struct airo_info *ai) { if(!waitbusy(ai)) { clear_bit (FLAG_FLASHING, &ai->flags); - airo_print_info(ai->dev->name, "Waitbusy hang after setflash mode"); + printk(KERN_INFO "Waitbusy hang after setflash mode\n"); return -EIO; } return 0; @@ -8014,7 +7553,7 @@ static int flashpchar(struct airo_info *ai,int byte,int dwelltime) { /* timeout for busy clear wait */ if(waittime <= 0 ){ - airo_print_info(ai->dev->name, "flash putchar busywait timeout!"); + printk(KERN_INFO "flash putchar busywait timeout! \n"); return -EBUSY; } @@ -8103,7 +7642,7 @@ static int flashrestart(struct airo_info *ai,struct net_device *dev){ if (!test_bit(FLAG_MPI,&ai->flags)) for( i = 0; i < MAX_FIDS; i++ ) { ai->fids[i] = transmit_allocate - ( ai, AIRO_DEF_MTU, i >= MAX_FIDS / 2 ); + ( ai, 2312, i >= MAX_FIDS / 2 ); } ssleep(1); /* Added 12/7/00 */ diff --git a/drivers/net/wireless/airo_cs.c b/drivers/net/wireless/airo_cs.c index ac9437d49..a496460ce 100644 --- a/drivers/net/wireless/airo_cs.c +++ b/drivers/net/wireless/airo_cs.c @@ -20,6 +20,7 @@ ======================================================================*/ +#include #ifdef __IN_PCMCIA_PACKAGE__ #include #endif @@ -79,8 +80,8 @@ MODULE_SUPPORTED_DEVICE("Aironet 4500, 4800 and Cisco 340 PCMCIA cards"); event handler. */ -static int airo_config(struct pcmcia_device *link); -static void airo_release(struct pcmcia_device *link); +static void airo_config(dev_link_t *link); +static void airo_release(dev_link_t *link); /* The attach() and detach() entry points are used to create and destroy @@ -100,10 +101,10 @@ static void airo_detach(struct pcmcia_device *p_dev); /* A linked list of "instances" of the aironet device. Each actual PCMCIA card corresponds to one device instance, and is described - by one struct pcmcia_device structure (defined in ds.h). + by one dev_link_t structure (defined in ds.h). You may not want to use a linked list for this -- for example, the - memory card driver uses an array of struct pcmcia_device pointers, where minor + memory card driver uses an array of dev_link_t pointers, where minor device numbers are used to derive the corresponding array index. */ @@ -113,7 +114,7 @@ static void airo_detach(struct pcmcia_device *p_dev); example, ethernet cards, modems). In other cases, there may be many actual or logical devices (SCSI adapters, memory cards with multiple partitions). The dev_node_t structures need to be kept - in a linked list starting at the 'dev' field of a struct pcmcia_device + in a linked list starting at the 'dev' field of a dev_link_t structure. We allocate them in the card's private data structure, because they generally shouldn't be allocated dynamically. @@ -140,16 +141,24 @@ typedef struct local_info_t { ======================================================================*/ -static int airo_probe(struct pcmcia_device *p_dev) +static int airo_attach(struct pcmcia_device *p_dev) { + dev_link_t *link; local_info_t *local; DEBUG(0, "airo_attach()\n"); + /* Initialize the dev_link_t structure */ + link = kzalloc(sizeof(struct dev_link_t), GFP_KERNEL); + if (!link) { + printk(KERN_ERR "airo_cs: no memory for new device\n"); + return -ENOMEM; + } + /* Interrupt setup */ - p_dev->irq.Attributes = IRQ_TYPE_EXCLUSIVE; - p_dev->irq.IRQInfo1 = IRQ_LEVEL_ID; - p_dev->irq.Handler = NULL; + link->irq.Attributes = IRQ_TYPE_EXCLUSIVE; + link->irq.IRQInfo1 = IRQ_LEVEL_ID; + link->irq.Handler = NULL; /* General socket configuration defaults can go here. In this @@ -158,18 +167,26 @@ static int airo_probe(struct pcmcia_device *p_dev) and attributes of IO windows) are fixed by the nature of the device, and can be hard-wired here. */ - p_dev->conf.Attributes = 0; - p_dev->conf.IntType = INT_MEMORY_AND_IO; + link->conf.Attributes = 0; + link->conf.Vcc = 50; + link->conf.IntType = INT_MEMORY_AND_IO; /* Allocate space for private device-specific data */ local = kzalloc(sizeof(local_info_t), GFP_KERNEL); if (!local) { printk(KERN_ERR "airo_cs: no memory for new device\n"); + kfree (link); return -ENOMEM; } - p_dev->priv = local; + link->priv = local; - return airo_config(p_dev); + link->handle = p_dev; + p_dev->instance = link; + + link->state |= DEV_PRESENT | DEV_CONFIG_PENDING; + airo_config(link); + + return 0; } /* airo_attach */ /*====================================================================== @@ -181,11 +198,14 @@ static int airo_probe(struct pcmcia_device *p_dev) ======================================================================*/ -static void airo_detach(struct pcmcia_device *link) +static void airo_detach(struct pcmcia_device *p_dev) { + dev_link_t *link = dev_to_instance(p_dev); + DEBUG(0, "airo_detach(0x%p)\n", link); - airo_release(link); + if (link->state & DEV_CONFIG) + airo_release(link); if ( ((local_info_t*)link->priv)->eth_dev ) { stop_airo_card( ((local_info_t*)link->priv)->eth_dev, 0 ); @@ -193,6 +213,7 @@ static void airo_detach(struct pcmcia_device *link) ((local_info_t*)link->priv)->eth_dev = NULL; kfree(link->priv); + kfree(link); } /* airo_detach */ /*====================================================================== @@ -206,8 +227,9 @@ static void airo_detach(struct pcmcia_device *link) #define CS_CHECK(fn, ret) \ do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0) -static int airo_config(struct pcmcia_device *link) +static void airo_config(dev_link_t *link) { + client_handle_t handle; tuple_t tuple; cisparse_t parse; local_info_t *dev; @@ -215,7 +237,8 @@ static int airo_config(struct pcmcia_device *link) u_char buf[64]; win_req_t req; memreq_t map; - + + handle = link->handle; dev = link->priv; DEBUG(0, "airo_config(0x%p)\n", link); @@ -229,12 +252,15 @@ static int airo_config(struct pcmcia_device *link) tuple.TupleData = buf; tuple.TupleDataMax = sizeof(buf); tuple.TupleOffset = 0; - 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)); + CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple)); + CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple)); + CS_CHECK(ParseTuple, pcmcia_parse_tuple(handle, &tuple, &parse)); link->conf.ConfigBase = parse.config.base; link->conf.Present = parse.config.rmask[0]; - + + /* Configure card */ + link->state |= DEV_CONFIG; + /* In this loop, we scan the CIS for configuration table entries, each of which describes a valid card configuration, including @@ -248,12 +274,12 @@ static int airo_config(struct pcmcia_device *link) will only use the CIS to fill in implementation-defined details. */ tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY; - CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(link, &tuple)); + CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple)); while (1) { cistpl_cftable_entry_t dflt = { 0 }; cistpl_cftable_entry_t *cfg = &(parse.cftable_entry); - if (pcmcia_get_tuple_data(link, &tuple) != 0 || - pcmcia_parse_tuple(link, &tuple, &parse) != 0) + if (pcmcia_get_tuple_data(handle, &tuple) != 0 || + pcmcia_parse_tuple(handle, &tuple, &parse) != 0) goto next_entry; if (cfg->flags & CISTPL_CFTABLE_DEFAULT) dflt = *cfg; @@ -268,11 +294,16 @@ static int airo_config(struct pcmcia_device *link) /* Use power settings for Vcc and Vpp if present */ /* Note that the CIS values need to be rescaled */ + if (cfg->vcc.present & (1<conf.Vcc = cfg->vcc.param[CISTPL_POWER_VNOM]/10000; + else if (dflt.vcc.present & (1<conf.Vcc = dflt.vcc.param[CISTPL_POWER_VNOM]/10000; + if (cfg->vpp1.present & (1<conf.Vpp = + link->conf.Vpp1 = link->conf.Vpp2 = cfg->vpp1.param[CISTPL_POWER_VNOM]/10000; else if (dflt.vpp1.present & (1<conf.Vpp = + link->conf.Vpp1 = link->conf.Vpp2 = dflt.vpp1.param[CISTPL_POWER_VNOM]/10000; /* Do we need to allocate an interrupt? */ @@ -298,12 +329,12 @@ static int airo_config(struct pcmcia_device *link) } /* This reserves IO space but doesn't actually enable it */ - if (pcmcia_request_io(link, &link->io) != 0) + if (pcmcia_request_io(link->handle, &link->io) != 0) goto next_entry; /* Now set up a common memory window, if needed. There is room - in the struct pcmcia_device structure for one memory window handle, + in the dev_link_t structure for one memory window handle, but if the base addresses need to be saved, or if multiple windows are needed, the info should go in the private data structure for this device. @@ -319,7 +350,7 @@ static int airo_config(struct pcmcia_device *link) req.Base = mem->win[0].host_addr; req.Size = mem->win[0].len; req.AccessSpeed = 0; - if (pcmcia_request_window(&link, &req, &link->win) != 0) + if (pcmcia_request_window(&link->handle, &req, &link->win) != 0) goto next_entry; map.Page = 0; map.CardOffset = mem->win[0].card_addr; if (pcmcia_map_mem_page(link->win, &map) != 0) @@ -329,7 +360,7 @@ static int airo_config(struct pcmcia_device *link) break; next_entry: - CS_CHECK(GetNextTuple, pcmcia_get_next_tuple(link, &tuple)); + CS_CHECK(GetNextTuple, pcmcia_get_next_tuple(handle, &tuple)); } /* @@ -338,32 +369,33 @@ static int airo_config(struct pcmcia_device *link) irq structure is initialized. */ if (link->conf.Attributes & CONF_ENABLE_IRQ) - CS_CHECK(RequestIRQ, pcmcia_request_irq(link, &link->irq)); + CS_CHECK(RequestIRQ, pcmcia_request_irq(link->handle, &link->irq)); /* This actually configures the PCMCIA socket -- setting up the I/O windows and the interrupt mapping, and putting the card and host interface into "Memory and IO" mode. */ - CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link, &link->conf)); + CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link->handle, &link->conf)); ((local_info_t*)link->priv)->eth_dev = init_airo_card( link->irq.AssignedIRQ, - link->io.BasePort1, 1, &handle_to_dev(link) ); + link->io.BasePort1, 1, &handle_to_dev(handle) ); if (!((local_info_t*)link->priv)->eth_dev) goto cs_failed; /* At this point, the dev_node_t structure(s) need to be - initialized and arranged in a linked list at link->dev_node. + initialized and arranged in a linked list at link->dev. */ strcpy(dev->node.dev_name, ((local_info_t*)link->priv)->eth_dev->name ); dev->node.major = dev->node.minor = 0; - link->dev_node = &dev->node; + link->dev = &dev->node; /* Finally, report what we've done */ - 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(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); if (link->conf.Attributes & CONF_ENABLE_IRQ) printk(", irq %d", link->irq.AssignedIRQ); if (link->io.NumPorts1) @@ -376,12 +408,14 @@ static int airo_config(struct pcmcia_device *link) printk(", mem 0x%06lx-0x%06lx", req.Base, req.Base+req.Size-1); printk("\n"); - return 0; - + + link->state &= ~DEV_CONFIG_PENDING; + return; + cs_failed: - cs_error(link, last_fn, last_ret); + cs_error(link->handle, last_fn, last_ret); airo_release(link); - return -ENODEV; + } /* airo_config */ /*====================================================================== @@ -392,26 +426,51 @@ static int airo_config(struct pcmcia_device *link) ======================================================================*/ -static void airo_release(struct pcmcia_device *link) +static void airo_release(dev_link_t *link) { DEBUG(0, "airo_release(0x%p)\n", link); - pcmcia_disable_device(link); + + /* Unlink the device chain */ + link->dev = NULL; + + /* + In a normal driver, additional code may be needed to release + other kernel data structures associated with this device. + */ + + /* Don't bother checking to see if these succeed or not */ + if (link->win) + pcmcia_release_window(link->win); + 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; } -static int airo_suspend(struct pcmcia_device *link) +static int airo_suspend(struct pcmcia_device *p_dev) { + dev_link_t *link = dev_to_instance(p_dev); local_info_t *local = link->priv; - netif_device_detach(local->eth_dev); + link->state |= DEV_SUSPEND; + if (link->state & DEV_CONFIG) { + netif_device_detach(local->eth_dev); + pcmcia_release_configuration(link->handle); + } return 0; } -static int airo_resume(struct pcmcia_device *link) +static int airo_resume(struct pcmcia_device *p_dev) { + dev_link_t *link = dev_to_instance(p_dev); local_info_t *local = link->priv; - if (link->open) { + link->state &= ~DEV_SUSPEND; + if (link->state & DEV_CONFIG) { + pcmcia_request_configuration(link->handle, &link->conf); reset_airo_card(local->eth_dev); netif_device_attach(local->eth_dev); } @@ -433,7 +492,7 @@ static struct pcmcia_driver airo_driver = { .drv = { .name = "airo_cs", }, - .probe = airo_probe, + .probe = airo_attach, .remove = airo_detach, .id_table = airo_ids, .suspend = airo_suspend, diff --git a/drivers/net/wireless/airport.c b/drivers/net/wireless/airport.c index 38fac3bbc..7b321f7cf 100644 --- a/drivers/net/wireless/airport.c +++ b/drivers/net/wireless/airport.c @@ -14,6 +14,7 @@ #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 bb6bea4f3..0e1ac338c 100644 --- a/drivers/net/wireless/arlan-main.c +++ b/drivers/net/wireless/arlan-main.c @@ -5,6 +5,7 @@ * This module provides support for the Arlan 655 card made by Aironet */ +#include #include "arlan.h" #if BITS_PER_LONG != 32 @@ -1837,7 +1838,7 @@ struct net_device * __init arlan_probe(int unit) } #ifdef MODULE -int __init init_module(void) +int init_module(void) { int i = 0; @@ -1859,7 +1860,7 @@ int __init init_module(void) } -void __exit cleanup_module(void) +void cleanup_module(void) { int i = 0; struct net_device *dev; diff --git a/drivers/net/wireless/arlan-proc.c b/drivers/net/wireless/arlan-proc.c index 5fa985435..a2cca521f 100644 --- a/drivers/net/wireless/arlan-proc.c +++ b/drivers/net/wireless/arlan-proc.c @@ -1,3 +1,4 @@ +#include #include "arlan.h" #include diff --git a/drivers/net/wireless/arlan.h b/drivers/net/wireless/arlan.h index 3ed1df759..70a6d7b83 100644 --- a/drivers/net/wireless/arlan.h +++ b/drivers/net/wireless/arlan.h @@ -5,6 +5,7 @@ */ #include +#include #include #include #include diff --git a/drivers/net/wireless/atmel.c b/drivers/net/wireless/atmel.c index 995c7bea5..dfc24016b 100644 --- a/drivers/net/wireless/atmel.c +++ b/drivers/net/wireless/atmel.c @@ -39,6 +39,7 @@ ******************************************************************************/ +#include #include #include @@ -136,6 +137,44 @@ static struct { #define MAC_BOOT_COMPLETE 0x0010 // MAC boot has been completed #define MAC_INIT_OK 0x0002 // MAC boot has been completed +#define C80211_SUBTYPE_MGMT_ASS_REQUEST 0x00 +#define C80211_SUBTYPE_MGMT_ASS_RESPONSE 0x10 +#define C80211_SUBTYPE_MGMT_REASS_REQUEST 0x20 +#define C80211_SUBTYPE_MGMT_REASS_RESPONSE 0x30 +#define C80211_SUBTYPE_MGMT_ProbeRequest 0x40 +#define C80211_SUBTYPE_MGMT_ProbeResponse 0x50 +#define C80211_SUBTYPE_MGMT_BEACON 0x80 +#define C80211_SUBTYPE_MGMT_ATIM 0x90 +#define C80211_SUBTYPE_MGMT_DISASSOSIATION 0xA0 +#define C80211_SUBTYPE_MGMT_Authentication 0xB0 +#define C80211_SUBTYPE_MGMT_Deauthentication 0xC0 + +#define C80211_MGMT_AAN_OPENSYSTEM 0x0000 +#define C80211_MGMT_AAN_SHAREDKEY 0x0001 + +#define C80211_MGMT_CAPABILITY_ESS 0x0001 // see 802.11 p.58 +#define C80211_MGMT_CAPABILITY_IBSS 0x0002 // - " - +#define C80211_MGMT_CAPABILITY_CFPollable 0x0004 // - " - +#define C80211_MGMT_CAPABILITY_CFPollRequest 0x0008 // - " - +#define C80211_MGMT_CAPABILITY_Privacy 0x0010 // - " - + +#define C80211_MGMT_SC_Success 0 +#define C80211_MGMT_SC_Unspecified 1 +#define C80211_MGMT_SC_SupportCapabilities 10 +#define C80211_MGMT_SC_ReassDenied 11 +#define C80211_MGMT_SC_AssDenied 12 +#define C80211_MGMT_SC_AuthAlgNotSupported 13 +#define C80211_MGMT_SC_AuthTransSeqNumError 14 +#define C80211_MGMT_SC_AuthRejectChallenge 15 +#define C80211_MGMT_SC_AuthRejectTimeout 16 +#define C80211_MGMT_SC_AssDeniedHandleAP 17 +#define C80211_MGMT_SC_AssDeniedBSSRate 18 + +#define C80211_MGMT_ElementID_SSID 0 +#define C80211_MGMT_ElementID_SupportedRates 1 +#define C80211_MGMT_ElementID_ChallengeText 16 +#define C80211_MGMT_CAPABILITY_ShortPreamble 0x0020 + #define MIB_MAX_DATA_BYTES 212 #define MIB_HEADER_SIZE 4 /* first four fields */ @@ -1577,7 +1616,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, IRQF_SHARED, dev->name, dev))) { + if ((rc = request_irq(dev->irq, service_interrupt, SA_SHIRQ, dev->name, dev))) { printk(KERN_ERR "%s: register interrupt %d failed, rc %d\n", dev->name, irq, rc); goto err_out_free; } @@ -2796,7 +2835,7 @@ static void handle_beacon_probe(struct atmel_private *priv, u16 capability, u8 channel) { int rejoin = 0; - int new = capability & MFIE_TYPE_POWER_CONSTRAINT ? + int new = capability & C80211_MGMT_CAPABILITY_ShortPreamble ? SHORT_PREAMBLE : LONG_PREAMBLE; if (priv->preamble != new) { @@ -2882,11 +2921,11 @@ static void send_association_request(struct atmel_private *priv, int is_reassoc) memcpy(header.addr2, priv->dev->dev_addr, 6); memcpy(header.addr3, priv->CurrentBSSID, 6); - body.capability = cpu_to_le16(WLAN_CAPABILITY_ESS); + body.capability = cpu_to_le16(C80211_MGMT_CAPABILITY_ESS); if (priv->wep_is_on) - body.capability |= cpu_to_le16(WLAN_CAPABILITY_PRIVACY); + body.capability |= cpu_to_le16(C80211_MGMT_CAPABILITY_Privacy); if (priv->preamble == SHORT_PREAMBLE) - body.capability |= cpu_to_le16(MFIE_TYPE_POWER_CONSTRAINT); + body.capability |= cpu_to_le16(C80211_MGMT_CAPABILITY_ShortPreamble); body.listen_interval = cpu_to_le16(priv->listen_interval * priv->beacon_period); @@ -2900,10 +2939,10 @@ static void send_association_request(struct atmel_private *priv, int is_reassoc) bodysize = 12 + priv->SSID_size; } - ssid_el_p[0] = MFIE_TYPE_SSID; + ssid_el_p[0] = C80211_MGMT_ElementID_SSID; ssid_el_p[1] = priv->SSID_size; memcpy(ssid_el_p + 2, priv->SSID, priv->SSID_size); - ssid_el_p[2 + priv->SSID_size] = MFIE_TYPE_RATES; + ssid_el_p[2 + priv->SSID_size] = C80211_MGMT_ElementID_SupportedRates; ssid_el_p[3 + priv->SSID_size] = 4; /* len of suported rates */ memcpy(ssid_el_p + 4 + priv->SSID_size, atmel_basic_rates, 4); @@ -2965,7 +3004,7 @@ static void store_bss_info(struct atmel_private *priv, u16 beacon_period, u8 channel, u8 rssi, u8 ssid_len, u8 *ssid, int is_beacon) { - u8 *bss = capability & WLAN_CAPABILITY_ESS ? header->addr2 : header->addr3; + u8 *bss = capability & C80211_MGMT_CAPABILITY_ESS ? header->addr2 : header->addr3; int i, index; for (index = -1, i = 0; i < priv->BSS_list_entries; i++) @@ -2991,16 +3030,16 @@ static void store_bss_info(struct atmel_private *priv, priv->BSSinfo[index].channel = channel; priv->BSSinfo[index].beacon_period = beacon_period; - priv->BSSinfo[index].UsingWEP = capability & WLAN_CAPABILITY_PRIVACY; + priv->BSSinfo[index].UsingWEP = capability & C80211_MGMT_CAPABILITY_Privacy; memcpy(priv->BSSinfo[index].SSID, ssid, ssid_len); priv->BSSinfo[index].SSIDsize = ssid_len; - if (capability & WLAN_CAPABILITY_IBSS) + if (capability & C80211_MGMT_CAPABILITY_IBSS) priv->BSSinfo[index].BSStype = IW_MODE_ADHOC; - else if (capability & WLAN_CAPABILITY_ESS) + else if (capability & C80211_MGMT_CAPABILITY_ESS) priv->BSSinfo[index].BSStype =IW_MODE_INFRA; - priv->BSSinfo[index].preamble = capability & MFIE_TYPE_POWER_CONSTRAINT ? + priv->BSSinfo[index].preamble = capability & C80211_MGMT_CAPABILITY_ShortPreamble ? SHORT_PREAMBLE : LONG_PREAMBLE; } @@ -3011,7 +3050,7 @@ static void authenticate(struct atmel_private *priv, u16 frame_len) u16 trans_seq_no = le16_to_cpu(auth->trans_seq); u16 system = le16_to_cpu(auth->alg); - if (status == WLAN_STATUS_SUCCESS && !priv->wep_is_on) { + if (status == C80211_MGMT_SC_Success && !priv->wep_is_on) { /* no WEP */ if (priv->station_was_associated) { atmel_enter_state(priv, STATION_STATE_REASSOCIATING); @@ -3024,19 +3063,19 @@ static void authenticate(struct atmel_private *priv, u16 frame_len) } } - if (status == WLAN_STATUS_SUCCESS && priv->wep_is_on) { + if (status == C80211_MGMT_SC_Success && priv->wep_is_on) { int should_associate = 0; /* WEP */ if (trans_seq_no != priv->ExpectedAuthentTransactionSeqNum) return; - if (system == WLAN_AUTH_OPEN) { + if (system == C80211_MGMT_AAN_OPENSYSTEM) { if (trans_seq_no == 0x0002) { should_associate = 1; } - } else if (system == WLAN_AUTH_SHARED_KEY) { + } else if (system == C80211_MGMT_AAN_SHAREDKEY) { if (trans_seq_no == 0x0002 && - auth->el_id == MFIE_TYPE_CHALLENGE) { + auth->el_id == C80211_MGMT_ElementID_ChallengeText) { send_authentication_request(priv, system, auth->chall_text, auth->chall_text_len); return; } else if (trans_seq_no == 0x0004) { @@ -3101,8 +3140,8 @@ static void associate(struct atmel_private *priv, u16 frame_len, u16 subtype) if (frame_len < 8 + rates_len) return; - if (status == WLAN_STATUS_SUCCESS) { - if (subtype == IEEE80211_STYPE_ASSOC_RESP) + if (status == C80211_MGMT_SC_Success) { + if (subtype == C80211_SUBTYPE_MGMT_ASS_RESPONSE) priv->AssociationRequestRetryCnt = 0; else priv->ReAssociationRequestRetryCnt = 0; @@ -3139,9 +3178,9 @@ static void associate(struct atmel_private *priv, u16 frame_len, u16 subtype) return; } - if (subtype == IEEE80211_STYPE_ASSOC_RESP && - status != WLAN_STATUS_ASSOC_DENIED_RATES && - status != WLAN_STATUS_CAPS_UNSUPPORTED && + if (subtype == C80211_SUBTYPE_MGMT_ASS_RESPONSE && + status != C80211_MGMT_SC_AssDeniedBSSRate && + status != C80211_MGMT_SC_SupportCapabilities && priv->AssociationRequestRetryCnt < MAX_ASSOCIATION_RETRIES) { mod_timer(&priv->management_timer, jiffies + MGMT_JIFFIES); priv->AssociationRequestRetryCnt++; @@ -3149,9 +3188,9 @@ static void associate(struct atmel_private *priv, u16 frame_len, u16 subtype) return; } - if (subtype == IEEE80211_STYPE_REASSOC_RESP && - status != WLAN_STATUS_ASSOC_DENIED_RATES && - status != WLAN_STATUS_CAPS_UNSUPPORTED && + if (subtype == C80211_SUBTYPE_MGMT_REASS_RESPONSE && + status != C80211_MGMT_SC_AssDeniedBSSRate && + status != C80211_MGMT_SC_SupportCapabilities && priv->AssociationRequestRetryCnt < MAX_ASSOCIATION_RETRIES) { mod_timer(&priv->management_timer, jiffies + MGMT_JIFFIES); priv->ReAssociationRequestRetryCnt++; @@ -3286,8 +3325,8 @@ static void atmel_management_frame(struct atmel_private *priv, subtype = le16_to_cpu(header->frame_ctl) & IEEE80211_FCTL_STYPE; switch (subtype) { - case IEEE80211_STYPE_BEACON: - case IEEE80211_STYPE_PROBE_RESP: + case C80211_SUBTYPE_MGMT_BEACON: + case C80211_SUBTYPE_MGMT_ProbeResponse: /* beacon frame has multiple variable-length fields - never let an engineer loose with a data structure design. */ @@ -3345,19 +3384,19 @@ static void atmel_management_frame(struct atmel_private *priv, beacon_interval, channel, rssi, ssid_length, &beacon->rates_el_id, - subtype == IEEE80211_STYPE_BEACON); + subtype == C80211_SUBTYPE_MGMT_BEACON); } break; - case IEEE80211_STYPE_AUTH: + case C80211_SUBTYPE_MGMT_Authentication: if (priv->station_state == STATION_STATE_AUTHENTICATING) authenticate(priv, frame_len); break; - case IEEE80211_STYPE_ASSOC_RESP: - case IEEE80211_STYPE_REASSOC_RESP: + case C80211_SUBTYPE_MGMT_ASS_RESPONSE: + case C80211_SUBTYPE_MGMT_REASS_RESPONSE: if (priv->station_state == STATION_STATE_ASSOCIATING || priv->station_state == STATION_STATE_REASSOCIATING) @@ -3365,7 +3404,7 @@ static void atmel_management_frame(struct atmel_private *priv, break; - case IEEE80211_STYPE_DISASSOC: + case C80211_SUBTYPE_MGMT_DISASSOSIATION: if (priv->station_is_associated && priv->operating_mode == IW_MODE_INFRA && is_frame_from_current_bss(priv, header)) { @@ -3378,7 +3417,7 @@ static void atmel_management_frame(struct atmel_private *priv, break; - case IEEE80211_STYPE_DEAUTH: + case C80211_SUBTYPE_MGMT_Deauthentication: if (priv->operating_mode == IW_MODE_INFRA && is_frame_from_current_bss(priv, header)) { priv->station_was_associated = 0; @@ -3414,12 +3453,12 @@ static void atmel_management_timer(u_long a) priv->AuthenticationRequestRetryCnt = 0; restart_search(priv); } else { - int auth = WLAN_AUTH_OPEN; + int auth = C80211_MGMT_AAN_OPENSYSTEM; priv->AuthenticationRequestRetryCnt++; priv->CurrentAuthentTransactionSeqNum = 0x0001; mod_timer(&priv->management_timer, jiffies + MGMT_JIFFIES); if (priv->wep_is_on && priv->exclude_unencrypted) - auth = WLAN_AUTH_SHARED_KEY; + auth = C80211_MGMT_AAN_SHAREDKEY; send_authentication_request(priv, auth, NULL, 0); } break; @@ -3462,7 +3501,6 @@ static void atmel_command_irq(struct atmel_private *priv) u8 status = atmel_rmem8(priv, atmel_co(priv, CMD_BLOCK_STATUS_OFFSET)); u8 command = atmel_rmem8(priv, atmel_co(priv, CMD_BLOCK_COMMAND_OFFSET)); int fast_scan; - union iwreq_data wrqu; if (status == CMD_STATUS_IDLE || status == CMD_STATUS_IN_PROGRESS) @@ -3487,7 +3525,6 @@ static void atmel_command_irq(struct atmel_private *priv) atmel_scan(priv, 1); } else { int bss_index = retrieve_bss(priv); - int notify_scan_complete = 1; if (bss_index != -1) { atmel_join_bss(priv, bss_index); } else if (priv->operating_mode == IW_MODE_ADHOC && @@ -3496,14 +3533,8 @@ static void atmel_command_irq(struct atmel_private *priv) } else { priv->fast_scan = !fast_scan; atmel_scan(priv, 1); - notify_scan_complete = 0; } priv->site_survey_state = SITE_SURVEY_COMPLETED; - if (notify_scan_complete) { - wrqu.data.length = 0; - wrqu.data.flags = 0; - wireless_send_event(priv->dev, SIOCGIWSCAN, &wrqu, NULL); - } } break; @@ -3516,9 +3547,6 @@ static void atmel_command_irq(struct atmel_private *priv) priv->site_survey_state = SITE_SURVEY_COMPLETED; if (priv->station_is_associated) { atmel_enter_state(priv, STATION_STATE_READY); - wrqu.data.length = 0; - wrqu.data.flags = 0; - wireless_send_event(priv->dev, SIOCGIWSCAN, &wrqu, NULL); } else { atmel_scan(priv, 1); } @@ -3530,14 +3558,14 @@ static void atmel_command_irq(struct atmel_private *priv) priv->station_was_associated = priv->station_is_associated; atmel_enter_state(priv, STATION_STATE_READY); } else { - int auth = WLAN_AUTH_OPEN; + int auth = C80211_MGMT_AAN_OPENSYSTEM; priv->AuthenticationRequestRetryCnt = 0; atmel_enter_state(priv, STATION_STATE_AUTHENTICATING); mod_timer(&priv->management_timer, jiffies + MGMT_JIFFIES); priv->CurrentAuthentTransactionSeqNum = 0x0001; if (priv->wep_is_on && priv->exclude_unencrypted) - auth = WLAN_AUTH_SHARED_KEY; + auth = C80211_MGMT_AAN_SHAREDKEY; send_authentication_request(priv, auth, NULL, 0); } return; diff --git a/drivers/net/wireless/atmel_cs.c b/drivers/net/wireless/atmel_cs.c index 785664090..d6f4a5a3e 100644 --- a/drivers/net/wireless/atmel_cs.c +++ b/drivers/net/wireless/atmel_cs.c @@ -29,6 +29,7 @@ ******************************************************************************/ +#include #ifdef __IN_PCMCIA_PACKAGE__ #include #endif @@ -90,8 +91,8 @@ MODULE_SUPPORTED_DEVICE("Atmel at76c50x PCMCIA cards"); event handler. */ -static int atmel_config(struct pcmcia_device *link); -static void atmel_release(struct pcmcia_device *link); +static void atmel_config(dev_link_t *link); +static void atmel_release(dev_link_t *link); /* The attach() and detach() entry points are used to create and destroy @@ -111,10 +112,10 @@ static void atmel_detach(struct pcmcia_device *p_dev); /* A linked list of "instances" of the atmelnet device. Each actual PCMCIA card corresponds to one device instance, and is described - by one struct pcmcia_device structure (defined in ds.h). + by one dev_link_t structure (defined in ds.h). You may not want to use a linked list for this -- for example, the - memory card driver uses an array of struct pcmcia_device pointers, where minor + memory card driver uses an array of dev_link_t pointers, where minor device numbers are used to derive the corresponding array index. */ @@ -124,7 +125,7 @@ static void atmel_detach(struct pcmcia_device *p_dev); example, ethernet cards, modems). In other cases, there may be many actual or logical devices (SCSI adapters, memory cards with multiple partitions). The dev_node_t structures need to be kept - in a linked list starting at the 'dev' field of a struct pcmcia_device + in a linked list starting at the 'dev' field of a dev_link_t structure. We allocate them in the card's private data structure, because they generally shouldn't be allocated dynamically. @@ -151,16 +152,24 @@ typedef struct local_info_t { ======================================================================*/ -static int atmel_probe(struct pcmcia_device *p_dev) +static int atmel_attach(struct pcmcia_device *p_dev) { + dev_link_t *link; local_info_t *local; DEBUG(0, "atmel_attach()\n"); + /* Initialize the dev_link_t structure */ + link = kzalloc(sizeof(struct dev_link_t), GFP_KERNEL); + if (!link) { + printk(KERN_ERR "atmel_cs: no memory for new device\n"); + return -ENOMEM; + } + /* Interrupt setup */ - p_dev->irq.Attributes = IRQ_TYPE_EXCLUSIVE; - p_dev->irq.IRQInfo1 = IRQ_LEVEL_ID; - p_dev->irq.Handler = NULL; + link->irq.Attributes = IRQ_TYPE_EXCLUSIVE; + link->irq.IRQInfo1 = IRQ_LEVEL_ID; + link->irq.Handler = NULL; /* General socket configuration defaults can go here. In this @@ -169,18 +178,26 @@ static int atmel_probe(struct pcmcia_device *p_dev) and attributes of IO windows) are fixed by the nature of the device, and can be hard-wired here. */ - p_dev->conf.Attributes = 0; - p_dev->conf.IntType = INT_MEMORY_AND_IO; + link->conf.Attributes = 0; + link->conf.Vcc = 50; + link->conf.IntType = INT_MEMORY_AND_IO; /* Allocate space for private device-specific data */ local = kzalloc(sizeof(local_info_t), GFP_KERNEL); if (!local) { printk(KERN_ERR "atmel_cs: no memory for new device\n"); + kfree (link); return -ENOMEM; } - p_dev->priv = local; + link->priv = local; - return atmel_config(p_dev); + link->handle = p_dev; + p_dev->instance = link; + + link->state |= DEV_PRESENT | DEV_CONFIG_PENDING; + atmel_config(link); + + return 0; } /* atmel_attach */ /*====================================================================== @@ -192,13 +209,17 @@ static int atmel_probe(struct pcmcia_device *p_dev) ======================================================================*/ -static void atmel_detach(struct pcmcia_device *link) +static void atmel_detach(struct pcmcia_device *p_dev) { + dev_link_t *link = dev_to_instance(p_dev); + DEBUG(0, "atmel_detach(0x%p)\n", link); - atmel_release(link); + if (link->state & DEV_CONFIG) + atmel_release(link); kfree(link->priv); + kfree(link); } /*====================================================================== @@ -215,17 +236,19 @@ do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0) /* Call-back function to interrogate PCMCIA-specific information about the current existance of the card */ static int card_present(void *arg) -{ - struct pcmcia_device *link = (struct pcmcia_device *)arg; - - if (pcmcia_dev_present(link)) +{ + dev_link_t *link = (dev_link_t *)arg; + if (link->state & DEV_SUSPEND) + return 0; + else if (link->state & DEV_PRESENT) return 1; - + return 0; } -static int atmel_config(struct pcmcia_device *link) +static void atmel_config(dev_link_t *link) { + client_handle_t handle; tuple_t tuple; cisparse_t parse; local_info_t *dev; @@ -233,8 +256,9 @@ static int atmel_config(struct pcmcia_device *link) u_char buf[64]; struct pcmcia_device_id *did; + handle = link->handle; dev = link->priv; - did = handle_to_dev(link).driver_data; + did = handle_to_dev(handle).driver_data; DEBUG(0, "atmel_config(0x%p)\n", link); @@ -248,12 +272,15 @@ static int atmel_config(struct pcmcia_device *link) registers. */ tuple.DesiredTuple = CISTPL_CONFIG; - 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)); + CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple)); + CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple)); + CS_CHECK(ParseTuple, pcmcia_parse_tuple(handle, &tuple, &parse)); link->conf.ConfigBase = parse.config.base; link->conf.Present = parse.config.rmask[0]; - + + /* Configure card */ + link->state |= DEV_CONFIG; + /* In this loop, we scan the CIS for configuration table entries, each of which describes a valid card configuration, including @@ -267,12 +294,12 @@ static int atmel_config(struct pcmcia_device *link) will only use the CIS to fill in implementation-defined details. */ tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY; - CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(link, &tuple)); + CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple)); while (1) { cistpl_cftable_entry_t dflt = { 0 }; cistpl_cftable_entry_t *cfg = &(parse.cftable_entry); - if (pcmcia_get_tuple_data(link, &tuple) != 0 || - pcmcia_parse_tuple(link, &tuple, &parse) != 0) + if (pcmcia_get_tuple_data(handle, &tuple) != 0 || + pcmcia_parse_tuple(handle, &tuple, &parse) != 0) goto next_entry; if (cfg->flags & CISTPL_CFTABLE_DEFAULT) dflt = *cfg; @@ -287,11 +314,16 @@ static int atmel_config(struct pcmcia_device *link) /* Use power settings for Vcc and Vpp if present */ /* Note that the CIS values need to be rescaled */ + if (cfg->vcc.present & (1<conf.Vcc = cfg->vcc.param[CISTPL_POWER_VNOM]/10000; + else if (dflt.vcc.present & (1<conf.Vcc = dflt.vcc.param[CISTPL_POWER_VNOM]/10000; + if (cfg->vpp1.present & (1<conf.Vpp = + link->conf.Vpp1 = link->conf.Vpp2 = cfg->vpp1.param[CISTPL_POWER_VNOM]/10000; else if (dflt.vpp1.present & (1<conf.Vpp = + link->conf.Vpp1 = link->conf.Vpp2 = dflt.vpp1.param[CISTPL_POWER_VNOM]/10000; /* Do we need to allocate an interrupt? */ @@ -317,14 +349,14 @@ static int atmel_config(struct pcmcia_device *link) } /* This reserves IO space but doesn't actually enable it */ - if (pcmcia_request_io(link, &link->io) != 0) + if (pcmcia_request_io(link->handle, &link->io) != 0) goto next_entry; /* If we got this far, we're cool! */ break; next_entry: - CS_CHECK(GetNextTuple, pcmcia_get_next_tuple(link, &tuple)); + CS_CHECK(GetNextTuple, pcmcia_get_next_tuple(handle, &tuple)); } /* @@ -333,14 +365,14 @@ static int atmel_config(struct pcmcia_device *link) irq structure is initialized. */ if (link->conf.Attributes & CONF_ENABLE_IRQ) - CS_CHECK(RequestIRQ, pcmcia_request_irq(link, &link->irq)); + CS_CHECK(RequestIRQ, pcmcia_request_irq(link->handle, &link->irq)); /* This actually configures the PCMCIA socket -- setting up the I/O windows and the interrupt mapping, and putting the card and host interface into "Memory and IO" mode. */ - CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link, &link->conf)); + CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link->handle, &link->conf)); if (link->irq.AssignedIRQ == 0) { printk(KERN_ALERT @@ -352,7 +384,7 @@ static int atmel_config(struct pcmcia_device *link) init_atmel_card(link->irq.AssignedIRQ, link->io.BasePort1, did ? did->driver_info : ATMEL_FW_TYPE_NONE, - &handle_to_dev(link), + &handle_to_dev(handle), card_present, link); if (!((local_info_t*)link->priv)->eth_dev) @@ -361,18 +393,18 @@ static int atmel_config(struct pcmcia_device *link) /* At this point, the dev_node_t structure(s) need to be - initialized and arranged in a linked list at link->dev_node. + initialized and arranged in a linked list at link->dev. */ strcpy(dev->node.dev_name, ((local_info_t*)link->priv)->eth_dev->name ); dev->node.major = dev->node.minor = 0; - link->dev_node = &dev->node; - - return 0; - + link->dev = &dev->node; + + link->state &= ~DEV_CONFIG_PENDING; + return; + cs_failed: - cs_error(link, last_fn, last_ret); + cs_error(link->handle, last_fn, last_ret); atmel_release(link); - return -ENODEV; } /*====================================================================== @@ -383,34 +415,53 @@ static int atmel_config(struct pcmcia_device *link) ======================================================================*/ -static void atmel_release(struct pcmcia_device *link) +static void atmel_release(dev_link_t *link) { struct net_device *dev = ((local_info_t*)link->priv)->eth_dev; - + DEBUG(0, "atmel_release(0x%p)\n", link); - - if (dev) + + /* Unlink the device chain */ + link->dev = NULL; + + if (dev) stop_atmel_card(dev); - ((local_info_t*)link->priv)->eth_dev = NULL; - - pcmcia_disable_device(link); + ((local_info_t*)link->priv)->eth_dev = NULL; + + /* Don't bother checking to see if these succeed or not */ + 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; } -static int atmel_suspend(struct pcmcia_device *link) +static int atmel_suspend(struct pcmcia_device *dev) { + dev_link_t *link = dev_to_instance(dev); local_info_t *local = link->priv; - netif_device_detach(local->eth_dev); + link->state |= DEV_SUSPEND; + if (link->state & DEV_CONFIG) { + netif_device_detach(local->eth_dev); + pcmcia_release_configuration(link->handle); + } return 0; } -static int atmel_resume(struct pcmcia_device *link) +static int atmel_resume(struct pcmcia_device *dev) { + dev_link_t *link = dev_to_instance(dev); local_info_t *local = link->priv; - atmel_open(local->eth_dev); - netif_device_attach(local->eth_dev); + link->state &= ~DEV_SUSPEND; + if (link->state & DEV_CONFIG) { + pcmcia_request_configuration(link->handle, &link->conf); + atmel_open(local->eth_dev); + netif_device_attach(local->eth_dev); + } return 0; } @@ -464,7 +515,7 @@ static struct pcmcia_driver atmel_driver = { .drv = { .name = "atmel_cs", }, - .probe = atmel_probe, + .probe = atmel_attach, .remove = atmel_detach, .id_table = atmel_ids, .suspend = atmel_suspend, diff --git a/drivers/net/wireless/atmel_pci.c b/drivers/net/wireless/atmel_pci.c index d425c3cef..a61b3bc6c 100644 --- a/drivers/net/wireless/atmel_pci.c +++ b/drivers/net/wireless/atmel_pci.c @@ -19,6 +19,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ******************************************************************************/ +#include #include #include #include diff --git a/drivers/net/wireless/hermes.c b/drivers/net/wireless/hermes.c index 29d39105f..346c6febb 100644 --- a/drivers/net/wireless/hermes.c +++ b/drivers/net/wireless/hermes.c @@ -38,6 +38,7 @@ * under either the MPL or the GPL. */ +#include #include #include #include @@ -120,6 +121,12 @@ 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) @@ -340,6 +347,19 @@ 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; @@ -399,7 +419,8 @@ 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. + * 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 */ @@ -409,7 +430,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) + if ( (len < 0) || (len % 2) ) return -EINVAL; err = hermes_bap_seek(hw, bap, id, offset); @@ -417,12 +438,49 @@ int hermes_bap_pwrite(hermes_t *hw, int bap, const void *buf, int len, goto out; /* Actually do the transfer */ - hermes_write_bytes(hw, dreg, buf, len); + hermes_write_words(hw, dreg, buf, len/2); 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 @@ -495,7 +553,7 @@ int hermes_write_ltv(hermes_t *hw, int bap, u16 rid, count = length - 1; - hermes_write_bytes(hw, dreg, value, count << 1); + hermes_write_words(hw, dreg, value, count); err = hermes_docmd_wait(hw, HERMES_CMD_ACCESS | HERMES_CMD_WRITE, rid, NULL); @@ -510,6 +568,7 @@ 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 8e3f0e3ed..7644f72a9 100644 --- a/drivers/net/wireless/hermes.h +++ b/drivers/net/wireless/hermes.h @@ -328,6 +328,16 @@ 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 */ @@ -337,7 +347,14 @@ 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 */ @@ -359,6 +376,8 @@ 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, @@ -406,13 +425,10 @@ 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_bytes(struct hermes *hw, int off, - const char *buf, unsigned count) +static inline void hermes_write_words(struct hermes *hw, int off, const void *buf, unsigned count) { off = off << hw->reg_spacing; - iowrite16_rep(hw->iobase + off, buf, count >> 1); - if (unlikely(count & 1)) - iowrite8(buf[count - 1], hw->iobase + off); + iowrite16_rep(hw->iobase + off, buf, count); } static inline void hermes_clear_words(struct hermes *hw, int off, unsigned count) @@ -446,4 +462,21 @@ 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.h b/drivers/net/wireless/hostap/hostap_80211.h index cc1ee7f4f..1fc72fe51 100644 --- a/drivers/net/wireless/hostap/hostap_80211.h +++ b/drivers/net/wireless/hostap/hostap_80211.h @@ -92,6 +92,8 @@ void hostap_dump_rx_80211(const char *name, struct sk_buff *skb, void hostap_dump_tx_80211(const char *name, struct sk_buff *skb); int hostap_data_start_xmit(struct sk_buff *skb, struct net_device *dev); int hostap_mgmt_start_xmit(struct sk_buff *skb, struct net_device *dev); +struct sk_buff * hostap_tx_encrypt(struct sk_buff *skb, + struct ieee80211_crypt_data *crypt); int hostap_master_start_xmit(struct sk_buff *skb, struct net_device *dev); #endif /* HOSTAP_80211_H */ diff --git a/drivers/net/wireless/hostap/hostap_80211_tx.c b/drivers/net/wireless/hostap/hostap_80211_tx.c index 4a5be70c0..5f398bd83 100644 --- a/drivers/net/wireless/hostap/hostap_80211_tx.c +++ b/drivers/net/wireless/hostap/hostap_80211_tx.c @@ -299,8 +299,8 @@ int hostap_mgmt_start_xmit(struct sk_buff *skb, struct net_device *dev) /* Called only from software IRQ */ -static struct sk_buff * hostap_tx_encrypt(struct sk_buff *skb, - struct ieee80211_crypt_data *crypt) +struct sk_buff * hostap_tx_encrypt(struct sk_buff *skb, + struct ieee80211_crypt_data *crypt) { struct hostap_interface *iface; local_info_t *local; @@ -317,7 +317,7 @@ static struct sk_buff * hostap_tx_encrypt(struct sk_buff *skb, } if (local->tkip_countermeasures && - strcmp(crypt->ops->name, "TKIP") == 0) { + crypt && crypt->ops && strcmp(crypt->ops->name, "TKIP") == 0) { hdr = (struct ieee80211_hdr_4addr *) skb->data; if (net_ratelimit()) { printk(KERN_DEBUG "%s: TKIP countermeasures: dropped " @@ -534,4 +534,6 @@ int hostap_master_start_xmit(struct sk_buff *skb, struct net_device *dev) } +EXPORT_SYMBOL(hostap_dump_tx_80211); +EXPORT_SYMBOL(hostap_tx_encrypt); 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 ba1312502..753a1de66 100644 --- a/drivers/net/wireless/hostap/hostap_ap.c +++ b/drivers/net/wireless/hostap/hostap_ap.c @@ -3141,7 +3141,7 @@ int hostap_add_sta(struct ap_data *ap, u8 *sta_addr) if (ret == 1) { sta = ap_add_sta(ap, sta_addr); if (!sta) - return -1; + ret = -1; sta->flags = WLAN_STA_AUTH | WLAN_STA_ASSOC; sta->ap = 1; memset(sta->supported_rates, 0, sizeof(sta->supported_rates)); @@ -3276,6 +3276,17 @@ 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 52e6df5c1..f8f450347 100644 --- a/drivers/net/wireless/hostap/hostap_cs.c +++ b/drivers/net/wireless/hostap/hostap_cs.c @@ -1,5 +1,6 @@ #define PRISM2_PCCARD +#include #include #include #include @@ -41,7 +42,7 @@ MODULE_PARM_DESC(ignore_cis_vcc, "Ignore broken CIS VCC entry"); /* struct local_info::hw_priv */ struct hostap_cs_priv { dev_node_t node; - struct pcmcia_device *link; + dev_link_t *link; int sandisk_connectplus; }; @@ -203,13 +204,15 @@ static int hfa384x_to_bap(struct net_device *dev, u16 bap, void *buf, int len) static void prism2_detach(struct pcmcia_device *p_dev); static void prism2_release(u_long arg); -static int prism2_config(struct pcmcia_device *link); +static int prism2_config(dev_link_t *link); static int prism2_pccard_card_present(local_info_t *local) { struct hostap_cs_priv *hw_priv = local->hw_priv; - if (hw_priv != NULL && hw_priv->link != NULL && pcmcia_dev_present(hw_priv->link)) + if (hw_priv != NULL && hw_priv->link != NULL && + ((hw_priv->link->state & (DEV_PRESENT | DEV_CONFIG)) == + (DEV_PRESENT | DEV_CONFIG))) return 1; return 0; } @@ -234,7 +237,7 @@ static void sandisk_set_iobase(local_info_t *local) reg.Action = CS_WRITE; reg.Offset = 0x10; /* 0x3f0 IO base 1 */ reg.Value = hw_priv->link->io.BasePort1 & 0x00ff; - res = pcmcia_access_configuration_register(hw_priv->link, + res = pcmcia_access_configuration_register(hw_priv->link->handle, ®); if (res != CS_SUCCESS) { printk(KERN_DEBUG "Prism3 SanDisk - failed to set I/O base 0 -" @@ -246,7 +249,7 @@ static void sandisk_set_iobase(local_info_t *local) reg.Action = CS_WRITE; reg.Offset = 0x12; /* 0x3f2 IO base 2 */ reg.Value = (hw_priv->link->io.BasePort1 & 0xff00) >> 8; - res = pcmcia_access_configuration_register(hw_priv->link, + res = pcmcia_access_configuration_register(hw_priv->link->handle, ®); if (res != CS_SUCCESS) { printk(KERN_DEBUG "Prism3 SanDisk - failed to set I/O base 1 -" @@ -298,9 +301,9 @@ static int sandisk_enable_wireless(struct net_device *dev) tuple.TupleData = buf; tuple.TupleDataMax = sizeof(buf); tuple.TupleOffset = 0; - if (pcmcia_get_first_tuple(hw_priv->link, &tuple) || - pcmcia_get_tuple_data(hw_priv->link, &tuple) || - pcmcia_parse_tuple(hw_priv->link, &tuple, parse) || + if (pcmcia_get_first_tuple(hw_priv->link->handle, &tuple) || + pcmcia_get_tuple_data(hw_priv->link->handle, &tuple) || + pcmcia_parse_tuple(hw_priv->link->handle, &tuple, parse) || parse->manfid.manf != 0xd601 || parse->manfid.card != 0x0101) { /* No SanDisk manfid found */ ret = -ENODEV; @@ -308,9 +311,9 @@ static int sandisk_enable_wireless(struct net_device *dev) } tuple.DesiredTuple = CISTPL_LONGLINK_MFC; - if (pcmcia_get_first_tuple(hw_priv->link, &tuple) || - pcmcia_get_tuple_data(hw_priv->link, &tuple) || - pcmcia_parse_tuple(hw_priv->link, &tuple, parse) || + if (pcmcia_get_first_tuple(hw_priv->link->handle, &tuple) || + pcmcia_get_tuple_data(hw_priv->link->handle, &tuple) || + pcmcia_parse_tuple(hw_priv->link->handle, &tuple, parse) || parse->longlink_mfc.nfn < 2) { /* No multi-function links found */ ret = -ENODEV; @@ -325,7 +328,7 @@ static int sandisk_enable_wireless(struct net_device *dev) reg.Action = CS_WRITE; reg.Offset = CISREG_COR; reg.Value = COR_SOFT_RESET; - res = pcmcia_access_configuration_register(hw_priv->link, + res = pcmcia_access_configuration_register(hw_priv->link->handle, ®); if (res != CS_SUCCESS) { printk(KERN_DEBUG "%s: SanDisk - COR sreset failed (%d)\n", @@ -342,7 +345,7 @@ static int sandisk_enable_wireless(struct net_device *dev) * will be enabled during the first cor_sreset call. */ reg.Value = COR_LEVEL_REQ | 0x8 | COR_ADDR_DECODE | COR_FUNC_ENA; - res = pcmcia_access_configuration_register(hw_priv->link, + res = pcmcia_access_configuration_register(hw_priv->link->handle, ®); if (res != CS_SUCCESS) { printk(KERN_DEBUG "%s: SanDisk - COR sreset failed (%d)\n", @@ -377,7 +380,7 @@ static void prism2_pccard_cor_sreset(local_info_t *local) reg.Action = CS_READ; reg.Offset = CISREG_COR; reg.Value = 0; - res = pcmcia_access_configuration_register(hw_priv->link, + res = pcmcia_access_configuration_register(hw_priv->link->handle, ®); if (res != CS_SUCCESS) { printk(KERN_DEBUG "prism2_pccard_cor_sreset failed 1 (%d)\n", @@ -389,7 +392,7 @@ static void prism2_pccard_cor_sreset(local_info_t *local) reg.Action = CS_WRITE; reg.Value |= COR_SOFT_RESET; - res = pcmcia_access_configuration_register(hw_priv->link, + res = pcmcia_access_configuration_register(hw_priv->link->handle, ®); if (res != CS_SUCCESS) { printk(KERN_DEBUG "prism2_pccard_cor_sreset failed 2 (%d)\n", @@ -402,7 +405,7 @@ static void prism2_pccard_cor_sreset(local_info_t *local) reg.Value &= ~COR_SOFT_RESET; if (hw_priv->sandisk_connectplus) reg.Value |= COR_IREQ_ENA; - res = pcmcia_access_configuration_register(hw_priv->link, + res = pcmcia_access_configuration_register(hw_priv->link->handle, ®); if (res != CS_SUCCESS) { printk(KERN_DEBUG "prism2_pccard_cor_sreset failed 3 (%d)\n", @@ -436,7 +439,7 @@ static void prism2_pccard_genesis_reset(local_info_t *local, int hcr) reg.Action = CS_READ; reg.Offset = CISREG_COR; reg.Value = 0; - res = pcmcia_access_configuration_register(hw_priv->link, + res = pcmcia_access_configuration_register(hw_priv->link->handle, ®); if (res != CS_SUCCESS) { printk(KERN_DEBUG "prism2_pccard_genesis_sreset failed 1 " @@ -449,7 +452,7 @@ static void prism2_pccard_genesis_reset(local_info_t *local, int hcr) reg.Action = CS_WRITE; reg.Value |= COR_SOFT_RESET; - res = pcmcia_access_configuration_register(hw_priv->link, + res = pcmcia_access_configuration_register(hw_priv->link->handle, ®); if (res != CS_SUCCESS) { printk(KERN_DEBUG "prism2_pccard_genesis_sreset failed 2 " @@ -463,7 +466,7 @@ static void prism2_pccard_genesis_reset(local_info_t *local, int hcr) reg.Action = CS_WRITE; reg.Value = hcr; reg.Offset = CISREG_CCSR; - res = pcmcia_access_configuration_register(hw_priv->link, + res = pcmcia_access_configuration_register(hw_priv->link->handle, ®); if (res != CS_SUCCESS) { printk(KERN_DEBUG "prism2_pccard_genesis_sreset failed 3 " @@ -475,7 +478,7 @@ static void prism2_pccard_genesis_reset(local_info_t *local, int hcr) reg.Action = CS_WRITE; reg.Offset = CISREG_COR; reg.Value = old_cor & ~COR_SOFT_RESET; - res = pcmcia_access_configuration_register(hw_priv->link, + res = pcmcia_access_configuration_register(hw_priv->link->handle, ®); if (res != CS_SUCCESS) { printk(KERN_DEBUG "prism2_pccard_genesis_sreset failed 4 " @@ -498,27 +501,40 @@ static struct prism2_helper_functions prism2_pccard_funcs = /* allocate local data and register with CardServices * initialize dev_link structure, but do not configure the card yet */ -static int hostap_cs_probe(struct pcmcia_device *p_dev) +static int prism2_attach(struct pcmcia_device *p_dev) { - int ret; + dev_link_t *link; + + link = kmalloc(sizeof(dev_link_t), GFP_KERNEL); + if (link == NULL) + return -ENOMEM; + + memset(link, 0, sizeof(dev_link_t)); PDEBUG(DEBUG_HW, "%s: setting Vcc=33 (constant)\n", dev_info); - p_dev->conf.IntType = INT_MEMORY_AND_IO; + link->conf.Vcc = 33; + link->conf.IntType = INT_MEMORY_AND_IO; - ret = prism2_config(p_dev); - if (ret) { + link->handle = p_dev; + p_dev->instance = link; + + link->state |= DEV_PRESENT | DEV_CONFIG_PENDING; + if (prism2_config(link)) PDEBUG(DEBUG_EXTRA, "prism2_config() failed\n"); - } - return ret; + return 0; } -static void prism2_detach(struct pcmcia_device *link) +static void prism2_detach(struct pcmcia_device *p_dev) { + dev_link_t *link = dev_to_instance(p_dev); + PDEBUG(DEBUG_FLOW, "prism2_detach\n"); - prism2_release((u_long)link); + if (link->state & DEV_CONFIG) { + prism2_release((u_long)link); + } /* release net devices */ if (link->priv) { @@ -531,6 +547,7 @@ static void prism2_detach(struct pcmcia_device *link) prism2_free_local_data(dev); kfree(hw_priv); } + kfree(link); } @@ -541,7 +558,7 @@ do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0) do { int ret = (retf); \ if (ret != 0) { \ PDEBUG(DEBUG_EXTRA, "CardServices(" #fn ") returned %d\n", ret); \ - cs_error(link, fn, ret); \ + cs_error(link->handle, fn, ret); \ goto next_entry; \ } \ } while (0) @@ -549,7 +566,7 @@ if (ret != 0) { \ /* run after a CARD_INSERTION event is received to configure the PCMCIA * socket and make the device available to the system */ -static int prism2_config(struct pcmcia_device *link) +static int prism2_config(dev_link_t *link) { struct net_device *dev; struct hostap_interface *iface; @@ -568,6 +585,8 @@ static int prism2_config(struct pcmcia_device *link) parse = kmalloc(sizeof(cisparse_t), GFP_KERNEL); hw_priv = kmalloc(sizeof(*hw_priv), GFP_KERNEL); if (parse == NULL || hw_priv == NULL) { + kfree(parse); + kfree(hw_priv); ret = -ENOMEM; goto failed; } @@ -578,24 +597,27 @@ static int prism2_config(struct pcmcia_device *link) tuple.TupleData = buf; tuple.TupleDataMax = sizeof(buf); tuple.TupleOffset = 0; - 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)); + CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(link->handle, &tuple)); + CS_CHECK(GetTupleData, pcmcia_get_tuple_data(link->handle, &tuple)); + CS_CHECK(ParseTuple, pcmcia_parse_tuple(link->handle, &tuple, parse)); link->conf.ConfigBase = parse->config.base; link->conf.Present = parse->config.rmask[0]; CS_CHECK(GetConfigurationInfo, - pcmcia_get_configuration_info(link, &conf)); + pcmcia_get_configuration_info(link->handle, &conf)); + PDEBUG(DEBUG_HW, "%s: %s Vcc=%d (from config)\n", dev_info, + ignore_cis_vcc ? "ignoring" : "setting", conf.Vcc); + link->conf.Vcc = conf.Vcc; /* Look for an appropriate configuration table entry in the CIS */ tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY; - CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(link, &tuple)); + CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(link->handle, &tuple)); for (;;) { cistpl_cftable_entry_t *cfg = &(parse->cftable_entry); CFG_CHECK2(GetTupleData, - pcmcia_get_tuple_data(link, &tuple)); + pcmcia_get_tuple_data(link->handle, &tuple)); CFG_CHECK2(ParseTuple, - pcmcia_parse_tuple(link, &tuple, parse)); + pcmcia_parse_tuple(link->handle, &tuple, parse)); if (cfg->flags & CISTPL_CFTABLE_DEFAULT) dflt = *cfg; @@ -630,10 +652,10 @@ static int prism2_config(struct pcmcia_device *link) } if (cfg->vpp1.present & (1 << CISTPL_POWER_VNOM)) - link->conf.Vpp = + link->conf.Vpp1 = link->conf.Vpp2 = cfg->vpp1.param[CISTPL_POWER_VNOM] / 10000; else if (dflt.vpp1.present & (1 << CISTPL_POWER_VNOM)) - link->conf.Vpp = + link->conf.Vpp1 = link->conf.Vpp2 = dflt.vpp1.param[CISTPL_POWER_VNOM] / 10000; /* Do we need to allocate an interrupt? */ @@ -675,19 +697,19 @@ static int prism2_config(struct pcmcia_device *link) /* This reserves IO space but doesn't actually enable it */ CFG_CHECK2(RequestIO, - pcmcia_request_io(link, &link->io)); + pcmcia_request_io(link->handle, &link->io)); /* This configuration table entry is OK */ break; next_entry: CS_CHECK(GetNextTuple, - pcmcia_get_next_tuple(link, &tuple)); + pcmcia_get_next_tuple(link->handle, &tuple)); } /* Need to allocate net_device before requesting IRQ handler */ dev = prism2_init_local_data(&prism2_pccard_funcs, 0, - &handle_to_dev(link)); + &handle_to_dev(link->handle)); if (dev == NULL) goto failed; link->priv = dev; @@ -697,7 +719,7 @@ static int prism2_config(struct pcmcia_device *link) local->hw_priv = hw_priv; hw_priv->link = link; strcpy(hw_priv->node.dev_name, dev->name); - link->dev_node = &hw_priv->node; + link->dev = &hw_priv->node; /* * Allocate an interrupt line. Note that this does not assign a @@ -710,7 +732,7 @@ static int prism2_config(struct pcmcia_device *link) link->irq.Handler = prism2_interrupt; link->irq.Instance = dev; CS_CHECK(RequestIRQ, - pcmcia_request_irq(link, &link->irq)); + pcmcia_request_irq(link->handle, &link->irq)); } /* @@ -719,17 +741,18 @@ static int prism2_config(struct pcmcia_device *link) * card and host interface into "Memory and IO" mode. */ CS_CHECK(RequestConfiguration, - pcmcia_request_configuration(link, &link->conf)); + pcmcia_request_configuration(link->handle, &link->conf)); dev->irq = link->irq.AssignedIRQ; dev->base_addr = link->io.BasePort1; /* Finally, report what we've done */ - printk(KERN_INFO "%s: index 0x%02x: ", - dev_info, link->conf.ConfigIndex); - if (link->conf.Vpp) - printk(", Vpp %d.%d", link->conf.Vpp / 10, - link->conf.Vpp % 10); + printk(KERN_INFO "%s: index 0x%02x: Vcc %d.%d", + dev_info, 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); if (link->conf.Attributes & CONF_ENABLE_IRQ) printk(", irq %d", link->irq.AssignedIRQ); if (link->io.NumPorts1) @@ -740,6 +763,9 @@ static int prism2_config(struct pcmcia_device *link) link->io.BasePort2+link->io.NumPorts2-1); printk("\n"); + link->state |= DEV_CONFIG; + link->state &= ~DEV_CONFIG_PENDING; + local->shutdown = 0; sandisk_enable_wireless(dev); @@ -754,7 +780,7 @@ static int prism2_config(struct pcmcia_device *link) return ret; cs_failed: - cs_error(link, last_fn, last_ret); + cs_error(link->handle, last_fn, last_ret); failed: kfree(parse); @@ -766,7 +792,7 @@ static int prism2_config(struct pcmcia_device *link) static void prism2_release(u_long arg) { - struct pcmcia_device *link = (struct pcmcia_device *)arg; + dev_link_t *link = (dev_link_t *)arg; PDEBUG(DEBUG_FLOW, "prism2_release\n"); @@ -775,54 +801,71 @@ static void prism2_release(u_long arg) struct hostap_interface *iface; iface = netdev_priv(dev); - prism2_hw_shutdown(dev, 0); + if (link->state & DEV_CONFIG) + prism2_hw_shutdown(dev, 0); iface->local->shutdown = 1; } - pcmcia_disable_device(link); + if (link->win) + pcmcia_release_window(link->win); + 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; + PDEBUG(DEBUG_FLOW, "release - done\n"); } -static int hostap_cs_suspend(struct pcmcia_device *link) +static int hostap_cs_suspend(struct pcmcia_device *p_dev) { + dev_link_t *link = dev_to_instance(p_dev); struct net_device *dev = (struct net_device *) link->priv; int dev_open = 0; - struct hostap_interface *iface = NULL; - - if (dev) - iface = netdev_priv(dev); PDEBUG(DEBUG_EXTRA, "%s: CS_EVENT_PM_SUSPEND\n", dev_info); - if (iface && iface->local) - dev_open = iface->local->num_dev_open > 0; - if (dev_open) { - netif_stop_queue(dev); - netif_device_detach(dev); + + link->state |= DEV_SUSPEND; + + if (link->state & DEV_CONFIG) { + struct hostap_interface *iface = netdev_priv(dev); + if (iface && iface->local) + dev_open = iface->local->num_dev_open > 0; + if (dev_open) { + netif_stop_queue(dev); + netif_device_detach(dev); + } + prism2_suspend(dev); + pcmcia_release_configuration(link->handle); } - prism2_suspend(dev); return 0; } -static int hostap_cs_resume(struct pcmcia_device *link) +static int hostap_cs_resume(struct pcmcia_device *p_dev) { + dev_link_t *link = dev_to_instance(p_dev); struct net_device *dev = (struct net_device *) link->priv; int dev_open = 0; - struct hostap_interface *iface = NULL; - - if (dev) - iface = netdev_priv(dev); PDEBUG(DEBUG_EXTRA, "%s: CS_EVENT_PM_RESUME\n", dev_info); - if (iface && iface->local) - dev_open = iface->local->num_dev_open > 0; + link->state &= ~DEV_SUSPEND; + if (link->state & DEV_CONFIG) { + struct hostap_interface *iface = netdev_priv(dev); + if (iface && iface->local) + dev_open = iface->local->num_dev_open > 0; + + pcmcia_request_configuration(link->handle, &link->conf); - prism2_hw_shutdown(dev, 1); - prism2_hw_config(dev, dev_open ? 0 : 1); - if (dev_open) { - netif_device_attach(dev); - netif_start_queue(dev); + prism2_hw_shutdown(dev, 1); + prism2_hw_config(dev, dev_open ? 0 : 1); + if (dev_open) { + netif_device_attach(dev); + netif_start_queue(dev); + } } return 0; @@ -843,7 +886,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), conflict with pcnet_cs */ + PCMCIA_DEVICE_MANF_CARD(0xc00f, 0x0000), PCMCIA_DEVICE_MANF_CARD(0xd601, 0x0002), PCMCIA_DEVICE_MANF_CARD(0xd601, 0x0005), PCMCIA_DEVICE_MANF_CARD(0xd601, 0x0010), @@ -880,12 +923,6 @@ 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); @@ -895,7 +932,7 @@ static struct pcmcia_driver hostap_driver = { .drv = { .name = "hostap_cs", }, - .probe = hostap_cs_probe, + .probe = prism2_attach, .remove = prism2_detach, .owner = THIS_MODULE, .id_table = hostap_cs_ids, diff --git a/drivers/net/wireless/hostap/hostap_hw.c b/drivers/net/wireless/hostap/hostap_hw.c index d500012fd..b1f142d9e 100644 --- a/drivers/net/wireless/hostap/hostap_hw.c +++ b/drivers/net/wireless/hostap/hostap_hw.c @@ -30,6 +30,7 @@ */ +#include #include #include @@ -927,16 +928,16 @@ static int hfa384x_set_rid(struct net_device *dev, u16 rid, void *buf, int len) res = hfa384x_cmd(dev, HFA384X_CMDCODE_ACCESS_WRITE, rid, NULL, NULL); up(&local->rid_bap_sem); - if (res) { printk(KERN_DEBUG "%s: hfa384x_set_rid: CMDCODE_ACCESS_WRITE " "failed (res=%d, rid=%04x, len=%d)\n", dev->name, res, rid, len); - - if (res == -ETIMEDOUT) - prism2_hw_reset(dev); + return res; } + if (res == -ETIMEDOUT) + prism2_hw_reset(dev); + return res; } @@ -1042,9 +1043,6 @@ 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; } @@ -3098,14 +3096,6 @@ 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) @@ -3270,8 +3260,6 @@ 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_ioctl.c b/drivers/net/wireless/hostap/hostap_ioctl.c index 8399de581..f3e0ce1ee 100644 --- a/drivers/net/wireless/hostap/hostap_ioctl.c +++ b/drivers/net/wireless/hostap/hostap_ioctl.c @@ -1860,7 +1860,7 @@ static char * __prism2_translate_scan(local_info_t *local, memset(&iwe, 0, sizeof(iwe)); iwe.cmd = SIOCGIWFREQ; if (scan) { - chan = le16_to_cpu(scan->chid); + chan = scan->chid; } else if (bss) { chan = bss->chan; } else { @@ -1868,7 +1868,7 @@ static char * __prism2_translate_scan(local_info_t *local, } if (chan > 0) { - iwe.u.freq.m = freq_list[chan - 1] * 100000; + iwe.u.freq.m = freq_list[le16_to_cpu(chan - 1)] * 100000; iwe.u.freq.e = 1; current_ev = iwe_stream_add_event(current_ev, end_buf, &iwe, IW_EV_FREQ_LEN); @@ -3358,6 +3358,10 @@ static int prism2_ioctl_siwencodeext(struct net_device *dev, if (ext->ext_flags & IW_ENCODE_EXT_SET_TX_KEY) { if (!sta_ptr) local->tx_keyidx = i; + else if (i) { + ret = -EINVAL; + goto done; + } } diff --git a/drivers/net/wireless/hostap/hostap_main.c b/drivers/net/wireless/hostap/hostap_main.c index 53374fcba..8dd4c4446 100644 --- a/drivers/net/wireless/hostap/hostap_main.c +++ b/drivers/net/wireless/hostap/hostap_main.c @@ -12,6 +12,7 @@ * more details. */ +#include #include #include #include @@ -1124,9 +1125,11 @@ 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 c2fa011be..2e85bdced 100644 --- a/drivers/net/wireless/hostap/hostap_pci.c +++ b/drivers/net/wireless/hostap/hostap_pci.c @@ -4,6 +4,7 @@ * driver patches from Reyk Floeter and * Andy Warner */ +#include #include #include #include @@ -306,7 +307,7 @@ static int prism2_pci_probe(struct pci_dev *pdev, memset(hw_priv, 0, sizeof(*hw_priv)); if (pci_enable_device(pdev)) - goto err_out_free; + return -EIO; phymem = pci_resource_start(pdev, 0); @@ -337,7 +338,7 @@ static int prism2_pci_probe(struct pci_dev *pdev, pci_set_drvdata(pdev, dev); - if (request_irq(dev->irq, prism2_interrupt, IRQF_SHARED, dev->name, + if (request_irq(dev->irq, prism2_interrupt, SA_SHIRQ, dev->name, dev)) { printk(KERN_WARNING "%s: request_irq failed\n", dev->name); goto fail; @@ -367,8 +368,6 @@ static int prism2_pci_probe(struct pci_dev *pdev, err_out_disable: pci_disable_device(pdev); prism2_free_local_data(dev); - - err_out_free: kfree(hw_priv); return -ENODEV; diff --git a/drivers/net/wireless/hostap/hostap_plx.c b/drivers/net/wireless/hostap/hostap_plx.c index 6dfa041be..94fe2449f 100644 --- a/drivers/net/wireless/hostap/hostap_plx.c +++ b/drivers/net/wireless/hostap/hostap_plx.c @@ -7,6 +7,7 @@ */ +#include #include #include #include @@ -66,12 +67,10 @@ 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"), @@ -369,7 +368,7 @@ static int prism2_plx_check_cis(void __iomem *attr_mem, int attr_len, switch (cis[pos]) { case CISTPL_CONFIG: - if (cis[pos + 1] < 2) + if (cis[pos + 1] < 1) goto cis_error; rmsz = (cis[pos + 2] & 0x3c) >> 2; rasz = cis[pos + 2] & 0x03; @@ -391,7 +390,7 @@ static int prism2_plx_check_cis(void __iomem *attr_mem, int attr_len, break; case CISTPL_MANFID: - if (cis[pos + 1] < 5) + if (cis[pos + 1] < 4) goto cis_error; manfid1 = cis[pos + 2] + (cis[pos + 3] << 8); manfid2 = cis[pos + 4] + (cis[pos + 5] << 8); @@ -453,7 +452,7 @@ static int prism2_plx_probe(struct pci_dev *pdev, memset(hw_priv, 0, sizeof(*hw_priv)); if (pci_enable_device(pdev)) - goto err_out_free; + return -EIO; /* National Datacomm NCP130 based on TMD7160, not PLX9052. */ tmd7160 = (pdev->vendor == 0x15e8) && (pdev->device == 0x0131); @@ -552,7 +551,7 @@ static int prism2_plx_probe(struct pci_dev *pdev, pci_set_drvdata(pdev, dev); - if (request_irq(dev->irq, prism2_interrupt, IRQF_SHARED, dev->name, + if (request_irq(dev->irq, prism2_interrupt, SA_SHIRQ, dev->name, dev)) { printk(KERN_WARNING "%s: request_irq failed\n", dev->name); goto fail; @@ -568,6 +567,9 @@ static int prism2_plx_probe(struct pci_dev *pdev, return hostap_hw_ready(dev); fail: + prism2_free_local_data(dev); + kfree(hw_priv); + if (irq_registered && dev) free_irq(dev->irq, dev); @@ -575,10 +577,6 @@ static int prism2_plx_probe(struct pci_dev *pdev, iounmap(attr_mem); pci_disable_device(pdev); - prism2_free_local_data(dev); - - err_out_free: - kfree(hw_priv); return -ENODEV; } diff --git a/drivers/net/wireless/ipw2100.c b/drivers/net/wireless/ipw2100.c index e955db435..6290c9f7e 100644 --- a/drivers/net/wireless/ipw2100.c +++ b/drivers/net/wireless/ipw2100.c @@ -1,6 +1,6 @@ /****************************************************************************** - Copyright(c) 2003 - 2006 Intel Corporation. All rights reserved. + Copyright(c) 2003 - 2005 Intel Corporation. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of version 2 of the GNU General Public License as @@ -134,6 +134,7 @@ that only one external action is invoked at a time. */ #include +#include #include #include #include @@ -166,12 +167,12 @@ that only one external action is invoked at a time. #include "ipw2100.h" -#define IPW2100_VERSION "git-1.2.2" +#define IPW2100_VERSION "1.1.3" #define DRV_NAME "ipw2100" #define DRV_VERSION IPW2100_VERSION #define DRV_DESCRIPTION "Intel(R) PRO/Wireless 2100 Network Driver" -#define DRV_COPYRIGHT "Copyright(c) 2003-2006 Intel Corporation" +#define DRV_COPYRIGHT "Copyright(c) 2003-2005 Intel Corporation" /* Debugging stuff */ #ifdef CONFIG_IPW2100_DEBUG @@ -1417,7 +1418,7 @@ static int ipw2100_enable_adapter(struct ipw2100_priv *priv) if (priv->status & STATUS_ENABLED) return 0; - mutex_lock(&priv->adapter_mutex); + down(&priv->adapter_sem); if (rf_kill_active(priv)) { IPW_DEBUG_HC("Command aborted due to RF kill active.\n"); @@ -1443,7 +1444,7 @@ static int ipw2100_enable_adapter(struct ipw2100_priv *priv) } fail_up: - mutex_unlock(&priv->adapter_mutex); + up(&priv->adapter_sem); return err; } @@ -1484,7 +1485,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-standby if it is already in that state. + * out of D0-standy 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 @@ -1575,7 +1576,7 @@ static int ipw2100_disable_adapter(struct ipw2100_priv *priv) cancel_delayed_work(&priv->hang_check); } - mutex_lock(&priv->adapter_mutex); + down(&priv->adapter_sem); err = ipw2100_hw_send_command(priv, &cmd); if (err) { @@ -1594,7 +1595,7 @@ static int ipw2100_disable_adapter(struct ipw2100_priv *priv) IPW_DEBUG_INFO("TODO: implement scan state machine\n"); fail_up: - mutex_unlock(&priv->adapter_mutex); + up(&priv->adapter_sem); return err; } @@ -1671,18 +1672,6 @@ static int ipw2100_start_scan(struct ipw2100_priv *priv) return err; } -static const struct ieee80211_geo ipw_geos[] = { - { /* Restricted */ - "---", - .bg_channels = 14, - .bg = {{2412, 1}, {2417, 2}, {2422, 3}, - {2427, 4}, {2432, 5}, {2437, 6}, - {2442, 7}, {2447, 8}, {2452, 9}, - {2457, 10}, {2462, 11}, {2467, 12}, - {2472, 13}, {2484, 14}}, - }, -}; - static int ipw2100_up(struct ipw2100_priv *priv, int deferred) { unsigned long flags; @@ -1738,13 +1727,6 @@ static int ipw2100_up(struct ipw2100_priv *priv, int deferred) goto exit; } - /* Initialize the geo */ - if (ieee80211_set_geo(priv->ieee, &ipw_geos[0])) { - printk(KERN_WARNING DRV_NAME "Could not set geo\n"); - return 0; - } - priv->ieee->freq_band = IEEE80211_24GHZ_BAND; - lock = LOCK_NONE; if (ipw2100_set_ordinal(priv, IPW_ORD_PERS_DB_LOCK, &lock, &ord_len)) { printk(KERN_ERR DRV_NAME @@ -1887,7 +1869,7 @@ static void ipw2100_reset_adapter(struct ipw2100_priv *priv) priv->status |= STATUS_RESET_PENDING; spin_unlock_irqrestore(&priv->low_lock, flags); - mutex_lock(&priv->action_mutex); + down(&priv->action_sem); /* stop timed checks so that they don't interfere with reset */ priv->stop_hang_check = 1; cancel_delayed_work(&priv->hang_check); @@ -1897,7 +1879,7 @@ static void ipw2100_reset_adapter(struct ipw2100_priv *priv) wireless_send_event(priv->net_dev, SIOCGIWAP, &wrqu, NULL); ipw2100_up(priv, 0); - mutex_unlock(&priv->action_mutex); + up(&priv->action_sem); } @@ -2389,6 +2371,15 @@ static void isr_rx(struct ipw2100_priv *priv, int i, IPW_DEBUG_DROP("Dropping packet while interface is not up.\n"); return; } +#ifdef CONFIG_IPW2100_MONITOR + if (unlikely(priv->ieee->iw_mode == IW_MODE_MONITOR && + priv->config & CFG_CRC_CHECK && + status->flags & IPW_STATUS_FLAG_CRC_ERROR)) { + IPW_DEBUG_RX("CRC error in packet. Dropping.\n"); + priv->ieee->stats.rx_errors++; + return; + } +#endif if (unlikely(priv->ieee->iw_mode != IW_MODE_MONITOR && !(priv->status & STATUS_ASSOCIATED))) { @@ -2436,89 +2427,6 @@ static void isr_rx(struct ipw2100_priv *priv, int i, priv->rx_queue.drv[i].host_addr = packet->dma_addr; } -#ifdef CONFIG_IPW2100_MONITOR - -static void isr_rx_monitor(struct ipw2100_priv *priv, int i, - struct ieee80211_rx_stats *stats) -{ - struct ipw2100_status *status = &priv->status_queue.drv[i]; - struct ipw2100_rx_packet *packet = &priv->rx_buffers[i]; - - /* 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; - s8 rt_dbmsignal; /* signal in dbM, kluged to signed */ - } *ipw_rt; - - IPW_DEBUG_RX("Handler...\n"); - - if (unlikely(status->frame_size > skb_tailroom(packet->skb) - - sizeof(struct ipw_rt_hdr))) { - IPW_DEBUG_INFO("%s: frame_size (%u) > skb_tailroom (%u)!" - " Dropping.\n", - priv->net_dev->name, - status->frame_size, - skb_tailroom(packet->skb)); - priv->ieee->stats.rx_errors++; - return; - } - - if (unlikely(!netif_running(priv->net_dev))) { - priv->ieee->stats.rx_errors++; - priv->wstats.discard.misc++; - IPW_DEBUG_DROP("Dropping packet while interface is not up.\n"); - return; - } - - if (unlikely(priv->config & CFG_CRC_CHECK && - status->flags & IPW_STATUS_FLAG_CRC_ERROR)) { - IPW_DEBUG_RX("CRC error in packet. Dropping.\n"); - priv->ieee->stats.rx_errors++; - return; - } - - pci_unmap_single(priv->pci_dev, packet->dma_addr, - sizeof(struct ipw2100_rx), PCI_DMA_FROMDEVICE); - memmove(packet->skb->data + sizeof(struct ipw_rt_hdr), - packet->skb->data, status->frame_size); - - ipw_rt = (struct ipw_rt_hdr *) packet->skb->data; - - 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(struct ipw_rt_hdr); /* total hdr+data */ - - ipw_rt->rt_hdr.it_present = 1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL; - - ipw_rt->rt_dbmsignal = status->rssi + IPW2100_RSSI_TO_DBM; - - skb_put(packet->skb, status->frame_size + sizeof(struct ipw_rt_hdr)); - - if (!ieee80211_rx(priv->ieee, packet->skb, stats)) { - priv->ieee->stats.rx_errors++; - - /* ieee80211_rx failed, so it didn't free the SKB */ - dev_kfree_skb_any(packet->skb); - packet->skb = NULL; - } - - /* We need to allocate a new SKB and attach it to the RDB. */ - if (unlikely(ipw2100_alloc_skb(priv, packet))) { - IPW_DEBUG_WARNING( - "%s: Unable to allocate SKB onto RBD ring - disabling " - "adapter.\n", priv->net_dev->name); - /* TODO: schedule adapter shutdown */ - IPW_DEBUG_INFO("TODO: Shutdown adapter...\n"); - } - - /* Update the RDB entry */ - priv->rx_queue.drv[i].host_addr = packet->dma_addr; -} - -#endif - static int ipw2100_corruption_check(struct ipw2100_priv *priv, int i) { struct ipw2100_status *status = &priv->status_queue.drv[i]; @@ -2650,7 +2558,7 @@ static void __ipw2100_rx_process(struct ipw2100_priv *priv) case P8023_DATA_VAL: #ifdef CONFIG_IPW2100_MONITOR if (priv->ieee->iw_mode == IW_MODE_MONITOR) { - isr_rx_monitor(priv, i, &stats); + isr_rx(priv, i, &stats); break; } #endif @@ -3842,7 +3750,7 @@ static ssize_t store_memory(struct device *d, struct device_attribute *attr, struct net_device *dev = priv->net_dev; const char *p = buf; - (void)dev; /* kill unused-var warning for debug-only code */ + (void) dev; /* kill unused-var warning for debug-only code */ if (count < 1) return count; @@ -3955,7 +3863,7 @@ static int ipw2100_switch_mode(struct ipw2100_priv *priv, u32 mode) #ifdef CONFIG_IPW2100_MONITOR case IW_MODE_MONITOR: priv->last_mode = priv->ieee->iw_mode; - priv->net_dev->type = ARPHRD_IEEE80211_RADIOTAP; + priv->net_dev->type = ARPHRD_IEEE80211; break; #endif /* CONFIG_IPW2100_MONITOR */ } @@ -4162,7 +4070,7 @@ static ssize_t store_scan_age(struct device *d, struct device_attribute *attr, unsigned long val; char *p = buffer; - (void)dev; /* kill unused-var warning for debug-only code */ + (void) dev; /* kill unused-var warning for debug-only code */ IPW_DEBUG_INFO("enter\n"); @@ -4211,7 +4119,7 @@ static int ipw_radio_kill_sw(struct ipw2100_priv *priv, int disable_radio) IPW_DEBUG_RF_KILL("Manual SW RF Kill set to: RADIO %s\n", disable_radio ? "OFF" : "ON"); - mutex_lock(&priv->action_mutex); + down(&priv->action_sem); if (disable_radio) { priv->status |= STATUS_RF_KILL_SW; @@ -4229,7 +4137,7 @@ static int ipw_radio_kill_sw(struct ipw2100_priv *priv, int disable_radio) schedule_reset(priv); } - mutex_unlock(&priv->action_mutex); + up(&priv->action_sem); return 1; } @@ -5199,13 +5107,12 @@ static int ipw2100_set_tx_power(struct ipw2100_priv *priv, u32 tx_power) .host_command_length = 4 }; int err = 0; - u32 tmp = tx_power; if (tx_power != IPW_TX_POWER_DEFAULT) - tmp = (tx_power - IPW_TX_POWER_MIN_DBM) * 16 / - (IPW_TX_POWER_MAX_DBM - IPW_TX_POWER_MIN_DBM); + tx_power = (tx_power - IPW_TX_POWER_MIN_DBM) * 16 / + (IPW_TX_POWER_MAX_DBM - IPW_TX_POWER_MIN_DBM); - cmd.host_command_parameters[0] = tmp; + cmd.host_command_parameters[0] = tx_power; if (priv->ieee->iw_mode == IW_MODE_ADHOC) err = ipw2100_hw_send_command(priv, &cmd); @@ -5357,7 +5264,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 occurring. If the user is setting the key, + * or some other problem is occuring. If the user is setting the key, * then we push the change */ wep_key->idx = idx; @@ -5458,12 +5365,9 @@ static int ipw2100_configure_security(struct ipw2100_priv *priv, int batch_mode) SEC_LEVEL_0, 0, 1); } else { auth_mode = IPW_AUTH_OPEN; - if (priv->ieee->sec.flags & SEC_AUTH_MODE) { - if (priv->ieee->sec.auth_mode == WLAN_AUTH_SHARED_KEY) - auth_mode = IPW_AUTH_SHARED; - else if (priv->ieee->sec.auth_mode == WLAN_AUTH_LEAP) - auth_mode = IPW_AUTH_LEAP_CISCO_ID; - } + if ((priv->ieee->sec.flags & SEC_AUTH_MODE) && + (priv->ieee->sec.auth_mode == WLAN_AUTH_SHARED_KEY)) + auth_mode = IPW_AUTH_SHARED; sec_level = SEC_LEVEL_0; if (priv->ieee->sec.flags & SEC_LEVEL) @@ -5533,7 +5437,7 @@ static void shim__set_security(struct net_device *dev, struct ipw2100_priv *priv = ieee80211_priv(dev); int i, force_update = 0; - mutex_lock(&priv->action_mutex); + down(&priv->action_sem); if (!(priv->status & STATUS_INITIALIZED)) goto done; @@ -5606,7 +5510,7 @@ static void shim__set_security(struct net_device *dev, if (!(priv->status & (STATUS_ASSOCIATED | STATUS_ASSOCIATING))) ipw2100_configure_security(priv, 0); done: - mutex_unlock(&priv->action_mutex); + up(&priv->action_sem); } static int ipw2100_adapter_setup(struct ipw2100_priv *priv) @@ -5730,7 +5634,7 @@ static int ipw2100_set_address(struct net_device *dev, void *p) if (!is_valid_ether_addr(addr->sa_data)) return -EADDRNOTAVAIL; - mutex_lock(&priv->action_mutex); + down(&priv->action_sem); priv->config |= CFG_CUSTOM_MAC; memcpy(priv->mac_addr, addr->sa_data, ETH_ALEN); @@ -5740,12 +5644,12 @@ static int ipw2100_set_address(struct net_device *dev, void *p) goto done; priv->reset_backoff = 0; - mutex_unlock(&priv->action_mutex); + up(&priv->action_sem); ipw2100_reset_adapter(priv); return 0; done: - mutex_unlock(&priv->action_mutex); + up(&priv->action_sem); return err; } @@ -5856,9 +5760,6 @@ static int ipw2100_wpa_set_auth_algs(struct ipw2100_priv *priv, int value) } else if (value & IW_AUTH_ALG_OPEN_SYSTEM) { sec.auth_mode = WLAN_AUTH_OPEN; ieee->open_wep = 1; - } else if (value & IW_AUTH_ALG_LEAP) { - sec.auth_mode = WLAN_AUTH_LEAP; - ieee->open_wep = 1; } else return -EINVAL; @@ -5870,8 +5771,8 @@ static int ipw2100_wpa_set_auth_algs(struct ipw2100_priv *priv, int value) return ret; } -static void ipw2100_wpa_assoc_frame(struct ipw2100_priv *priv, - char *wpa_ie, int wpa_ie_len) +void ipw2100_wpa_assoc_frame(struct ipw2100_priv *priv, + char *wpa_ie, int wpa_ie_len) { struct ipw2100_wpa_assoc_frame frame; @@ -6088,8 +5989,8 @@ static struct net_device *ipw2100_alloc_device(struct pci_dev *pci_dev, strcpy(priv->nick, "ipw2100"); spin_lock_init(&priv->low_lock); - mutex_init(&priv->action_mutex); - mutex_init(&priv->adapter_mutex); + sema_init(&priv->action_sem, 1); + sema_init(&priv->adapter_sem, 1); init_waitqueue_head(&priv->wait_command_queue); @@ -6229,7 +6130,7 @@ static int ipw2100_pci_init_one(struct pci_dev *pci_dev, ipw2100_queues_initialize(priv); err = request_irq(pci_dev->irq, - ipw2100_interrupt, IRQF_SHARED, dev->name, priv); + ipw2100_interrupt, SA_SHIRQ, dev->name, priv); if (err) { printk(KERN_WARNING DRV_NAME "Error calling request_irq: %d.\n", pci_dev->irq); @@ -6254,7 +6155,7 @@ static int ipw2100_pci_init_one(struct pci_dev *pci_dev, * member to call a function that then just turns and calls ipw2100_up. * net_dev->init is called after name allocation but before the * notifier chain is called */ - mutex_lock(&priv->action_mutex); + down(&priv->action_sem); err = register_netdev(dev); if (err) { printk(KERN_WARNING DRV_NAME @@ -6290,12 +6191,12 @@ static int ipw2100_pci_init_one(struct pci_dev *pci_dev, priv->status |= STATUS_INITIALIZED; - mutex_unlock(&priv->action_mutex); + up(&priv->action_sem); return 0; fail_unlock: - mutex_unlock(&priv->action_mutex); + up(&priv->action_sem); fail: if (dev) { @@ -6335,7 +6236,7 @@ static void __devexit ipw2100_pci_remove_one(struct pci_dev *pci_dev) struct net_device *dev; if (priv) { - mutex_lock(&priv->action_mutex); + down(&priv->action_sem); priv->status &= ~STATUS_INITIALIZED; @@ -6350,9 +6251,9 @@ static void __devexit ipw2100_pci_remove_one(struct pci_dev *pci_dev) /* Take down the hardware */ ipw2100_down(priv); - /* Release the mutex so that the network subsystem can + /* Release the semaphore so that the network subsystem can * complete any needed calls into the driver... */ - mutex_unlock(&priv->action_mutex); + up(&priv->action_sem); /* Unregister the device first - this results in close() * being called if the device is open. If we free storage @@ -6391,7 +6292,7 @@ static int ipw2100_suspend(struct pci_dev *pci_dev, pm_message_t state) IPW_DEBUG_INFO("%s: Going into suspend...\n", dev->name); - mutex_lock(&priv->action_mutex); + down(&priv->action_sem); if (priv->status & STATUS_INITIALIZED) { /* Take down the device; powers it off, etc. */ ipw2100_down(priv); @@ -6404,7 +6305,7 @@ static int ipw2100_suspend(struct pci_dev *pci_dev, pm_message_t state) pci_disable_device(pci_dev); pci_set_power_state(pci_dev, PCI_D3hot); - mutex_unlock(&priv->action_mutex); + up(&priv->action_sem); return 0; } @@ -6418,7 +6319,7 @@ static int ipw2100_resume(struct pci_dev *pci_dev) if (IPW2100_PM_DISABLED) return 0; - mutex_lock(&priv->action_mutex); + down(&priv->action_sem); IPW_DEBUG_INFO("%s: Coming out of suspend...\n", dev->name); @@ -6444,7 +6345,7 @@ static int ipw2100_resume(struct pci_dev *pci_dev) if (!(priv->status & STATUS_RF_KILL_SW)) ipw2100_up(priv, 0); - mutex_unlock(&priv->action_mutex); + up(&priv->action_sem); return 0; } @@ -6608,7 +6509,7 @@ static int ipw2100_wx_set_freq(struct net_device *dev, if (priv->ieee->iw_mode == IW_MODE_INFRA) return -EOPNOTSUPP; - mutex_lock(&priv->action_mutex); + down(&priv->action_sem); if (!(priv->status & STATUS_INITIALIZED)) { err = -EIO; goto done; @@ -6639,7 +6540,7 @@ static int ipw2100_wx_set_freq(struct net_device *dev, } done: - mutex_unlock(&priv->action_mutex); + up(&priv->action_sem); return err; } @@ -6680,7 +6581,7 @@ static int ipw2100_wx_set_mode(struct net_device *dev, if (wrqu->mode == priv->ieee->iw_mode) return 0; - mutex_lock(&priv->action_mutex); + down(&priv->action_sem); if (!(priv->status & STATUS_INITIALIZED)) { err = -EIO; goto done; @@ -6703,7 +6604,7 @@ static int ipw2100_wx_set_mode(struct net_device *dev, } done: - mutex_unlock(&priv->action_mutex); + up(&priv->action_sem); return err; } @@ -6885,7 +6786,7 @@ static int ipw2100_wx_set_wap(struct net_device *dev, if (wrqu->ap_addr.sa_family != ARPHRD_ETHER) return -EINVAL; - mutex_lock(&priv->action_mutex); + down(&priv->action_sem); if (!(priv->status & STATUS_INITIALIZED)) { err = -EIO; goto done; @@ -6914,7 +6815,7 @@ static int ipw2100_wx_set_wap(struct net_device *dev, wrqu->ap_addr.sa_data[5] & 0xff); done: - mutex_unlock(&priv->action_mutex); + up(&priv->action_sem); return err; } @@ -6950,7 +6851,7 @@ static int ipw2100_wx_set_essid(struct net_device *dev, int length = 0; int err = 0; - mutex_lock(&priv->action_mutex); + down(&priv->action_sem); if (!(priv->status & STATUS_INITIALIZED)) { err = -EIO; goto done; @@ -6987,7 +6888,7 @@ static int ipw2100_wx_set_essid(struct net_device *dev, err = ipw2100_set_essid(priv, essid, length, 0); done: - mutex_unlock(&priv->action_mutex); + up(&priv->action_sem); return err; } @@ -7068,7 +6969,7 @@ static int ipw2100_wx_set_rate(struct net_device *dev, u32 rate; int err = 0; - mutex_lock(&priv->action_mutex); + down(&priv->action_sem); if (!(priv->status & STATUS_INITIALIZED)) { err = -EIO; goto done; @@ -7095,7 +6996,7 @@ static int ipw2100_wx_set_rate(struct net_device *dev, IPW_DEBUG_WX("SET Rate -> %04X \n", rate); done: - mutex_unlock(&priv->action_mutex); + up(&priv->action_sem); return err; } @@ -7115,7 +7016,7 @@ static int ipw2100_wx_get_rate(struct net_device *dev, return 0; } - mutex_lock(&priv->action_mutex); + down(&priv->action_sem); if (!(priv->status & STATUS_INITIALIZED)) { err = -EIO; goto done; @@ -7147,7 +7048,7 @@ static int ipw2100_wx_get_rate(struct net_device *dev, IPW_DEBUG_WX("GET Rate -> %d \n", wrqu->bitrate.value); done: - mutex_unlock(&priv->action_mutex); + up(&priv->action_sem); return err; } @@ -7162,7 +7063,7 @@ static int ipw2100_wx_set_rts(struct net_device *dev, if (wrqu->rts.fixed == 0) return -EINVAL; - mutex_lock(&priv->action_mutex); + down(&priv->action_sem); if (!(priv->status & STATUS_INITIALIZED)) { err = -EIO; goto done; @@ -7182,7 +7083,7 @@ static int ipw2100_wx_set_rts(struct net_device *dev, IPW_DEBUG_WX("SET RTS Threshold -> 0x%08X \n", value); done: - mutex_unlock(&priv->action_mutex); + up(&priv->action_sem); return err; } @@ -7233,7 +7134,7 @@ static int ipw2100_wx_set_txpow(struct net_device *dev, value = wrqu->txpower.value; } - mutex_lock(&priv->action_mutex); + down(&priv->action_sem); if (!(priv->status & STATUS_INITIALIZED)) { err = -EIO; goto done; @@ -7244,7 +7145,7 @@ static int ipw2100_wx_set_txpow(struct net_device *dev, IPW_DEBUG_WX("SET TX Power -> %d \n", value); done: - mutex_unlock(&priv->action_mutex); + up(&priv->action_sem); return err; } @@ -7336,7 +7237,7 @@ static int ipw2100_wx_set_retry(struct net_device *dev, if (!(wrqu->retry.flags & IW_RETRY_LIMIT)) return 0; - mutex_lock(&priv->action_mutex); + down(&priv->action_sem); if (!(priv->status & STATUS_INITIALIZED)) { err = -EIO; goto done; @@ -7363,7 +7264,7 @@ static int ipw2100_wx_set_retry(struct net_device *dev, IPW_DEBUG_WX("SET Both Retry Limits -> %d \n", wrqu->retry.value); done: - mutex_unlock(&priv->action_mutex); + up(&priv->action_sem); return err; } @@ -7406,7 +7307,7 @@ static int ipw2100_wx_set_scan(struct net_device *dev, struct ipw2100_priv *priv = ieee80211_priv(dev); int err = 0; - mutex_lock(&priv->action_mutex); + down(&priv->action_sem); if (!(priv->status & STATUS_INITIALIZED)) { err = -EIO; goto done; @@ -7421,7 +7322,7 @@ static int ipw2100_wx_set_scan(struct net_device *dev, } done: - mutex_unlock(&priv->action_mutex); + up(&priv->action_sem); return err; } @@ -7471,7 +7372,7 @@ static int ipw2100_wx_set_power(struct net_device *dev, struct ipw2100_priv *priv = ieee80211_priv(dev); int err = 0; - mutex_lock(&priv->action_mutex); + down(&priv->action_sem); if (!(priv->status & STATUS_INITIALIZED)) { err = -EIO; goto done; @@ -7504,7 +7405,7 @@ static int ipw2100_wx_set_power(struct net_device *dev, IPW_DEBUG_WX("SET Power Management Mode -> 0x%02X\n", priv->power_mode); done: - mutex_unlock(&priv->action_mutex); + up(&priv->action_sem); return err; } @@ -7808,7 +7709,7 @@ static int ipw2100_wx_set_promisc(struct net_device *dev, int enable = (parms[0] > 0); int err = 0; - mutex_lock(&priv->action_mutex); + down(&priv->action_sem); if (!(priv->status & STATUS_INITIALIZED)) { err = -EIO; goto done; @@ -7826,7 +7727,7 @@ static int ipw2100_wx_set_promisc(struct net_device *dev, err = ipw2100_switch_mode(priv, priv->last_mode); } done: - mutex_unlock(&priv->action_mutex); + up(&priv->action_sem); return err; } @@ -7849,7 +7750,7 @@ static int ipw2100_wx_set_powermode(struct net_device *dev, struct ipw2100_priv *priv = ieee80211_priv(dev); int err = 0, mode = *(int *)extra; - mutex_lock(&priv->action_mutex); + down(&priv->action_sem); if (!(priv->status & STATUS_INITIALIZED)) { err = -EIO; goto done; @@ -7861,7 +7762,7 @@ static int ipw2100_wx_set_powermode(struct net_device *dev, if (priv->power_mode != mode) err = ipw2100_set_power_mode(priv, mode); done: - mutex_unlock(&priv->action_mutex); + up(&priv->action_sem); return err; } @@ -7913,7 +7814,7 @@ static int ipw2100_wx_set_preamble(struct net_device *dev, struct ipw2100_priv *priv = ieee80211_priv(dev); int err, mode = *(int *)extra; - mutex_lock(&priv->action_mutex); + down(&priv->action_sem); if (!(priv->status & STATUS_INITIALIZED)) { err = -EIO; goto done; @@ -7931,7 +7832,7 @@ static int ipw2100_wx_set_preamble(struct net_device *dev, err = ipw2100_system_config(priv, 0); done: - mutex_unlock(&priv->action_mutex); + up(&priv->action_sem); return err; } @@ -7961,7 +7862,7 @@ static int ipw2100_wx_set_crc_check(struct net_device *dev, struct ipw2100_priv *priv = ieee80211_priv(dev); int err, mode = *(int *)extra; - mutex_lock(&priv->action_mutex); + down(&priv->action_sem); if (!(priv->status & STATUS_INITIALIZED)) { err = -EIO; goto done; @@ -7978,7 +7879,7 @@ static int ipw2100_wx_set_crc_check(struct net_device *dev, err = 0; done: - mutex_unlock(&priv->action_mutex); + up(&priv->action_sem); return err; } @@ -8283,11 +8184,11 @@ static void ipw2100_wx_event_work(struct ipw2100_priv *priv) if (priv->status & STATUS_STOPPING) return; - mutex_lock(&priv->action_mutex); + down(&priv->action_sem); IPW_DEBUG_WX("enter\n"); - mutex_unlock(&priv->action_mutex); + up(&priv->action_sem); wrqu.ap_addr.sa_family = ARPHRD_ETHER; @@ -8310,7 +8211,7 @@ static void ipw2100_wx_event_work(struct ipw2100_priv *priv) if (!(priv->status & STATUS_ASSOCIATED)) { IPW_DEBUG_WX("Configuring ESSID\n"); - mutex_lock(&priv->action_mutex); + down(&priv->action_sem); /* This is a disassociation event, so kick the firmware to * look for another AP */ if (priv->config & CFG_STATIC_ESSID) @@ -8318,7 +8219,7 @@ static void ipw2100_wx_event_work(struct ipw2100_priv *priv) 0); else ipw2100_set_essid(priv, NULL, 0, 0); - mutex_unlock(&priv->action_mutex); + up(&priv->action_sem); } wireless_send_event(priv->net_dev, SIOCGIWAP, &wrqu, NULL); diff --git a/drivers/net/wireless/ipw2100.h b/drivers/net/wireless/ipw2100.h index 55b722719..f6c51441f 100644 --- a/drivers/net/wireless/ipw2100.h +++ b/drivers/net/wireless/ipw2100.h @@ -1,6 +1,6 @@ /****************************************************************************** - Copyright(c) 2003 - 2006 Intel Corporation. All rights reserved. + Copyright(c) 2003 - 2004 Intel Corporation. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of version 2 of the GNU General Public License as @@ -41,12 +41,7 @@ #include -#ifdef CONFIG_IPW2100_MONITOR -#include -#endif - #include -#include struct ipw2100_priv; struct ipw2100_tx_packet; @@ -397,10 +392,8 @@ struct ipw2100_notification { #define IPW_WEP104_CIPHER (1<<5) #define IPW_CKIP_CIPHER (1<<6) -#define IPW_AUTH_OPEN 0 -#define IPW_AUTH_SHARED 1 -#define IPW_AUTH_LEAP 2 -#define IPW_AUTH_LEAP_CISCO_ID 0x80 +#define IPW_AUTH_OPEN 0 +#define IPW_AUTH_SHARED 1 struct statistic { int value; @@ -595,8 +588,8 @@ struct ipw2100_priv { int inta_other; spinlock_t low_lock; - struct mutex action_mutex; - struct mutex adapter_mutex; + struct semaphore action_sem; + struct semaphore adapter_sem; wait_queue_head_t wait_command_queue; }; diff --git a/drivers/net/wireless/ipw2200.c b/drivers/net/wireless/ipw2200.c index b3300ffe4..f42e51a7b 100644 --- a/drivers/net/wireless/ipw2200.c +++ b/drivers/net/wireless/ipw2200.c @@ -1,6 +1,6 @@ /****************************************************************************** - Copyright(c) 2003 - 2006 Intel Corporation. All rights reserved. + Copyright(c) 2003 - 2005 Intel Corporation. All rights reserved. 802.11 status code portion of this file from ethereal-0.10.6: Copyright 2000, Axis Communications AB @@ -33,46 +33,9 @@ #include "ipw2200.h" #include - -#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 IPW2200_VERSION "git-1.0.8" #define DRV_DESCRIPTION "Intel(R) PRO/Wireless 2200/2915 Network Driver" -#define DRV_COPYRIGHT "Copyright(c) 2003-2006 Intel Corporation" +#define DRV_COPYRIGHT "Copyright(c) 2003-2005 Intel Corporation" #define DRV_VERSION IPW2200_VERSION #define ETH_P_80211_STATS (ETH_P_80211_RAW + 1) @@ -83,9 +46,7 @@ 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; @@ -94,20 +55,12 @@ static int associate = 1; static int auto_create = 1; static int led = 0; static int disable = 0; -static int bt_coexist = 0; -static int hwcrypto = 0; -static int roaming = 1; +static int hwcrypto = 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_IPW2200_QOS +#ifdef CONFIG_IPW_QOS static int qos_enable = 0; static int qos_burst_enable = 0; static int qos_no_ack_mask = 0; @@ -171,7 +124,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_IPW2200_QOS */ +#endif /* CONFIG_IPW_QOS */ static struct iw_statistics *ipw_get_wireless_stats(struct net_device *dev); static void ipw_remove_current_network(struct ipw_priv *priv); @@ -198,6 +151,12 @@ static int init_supported_rates(struct ipw_priv *priv, static void ipw_set_hwcrypto_keys(struct ipw_priv *); static void ipw_send_wep_keys(struct ipw_priv *, int); +static int ipw_is_valid_channel(struct ieee80211_device *, u8); +static int ipw_channel_to_index(struct ieee80211_device *, u8); +static u8 ipw_freq_to_channel(struct ieee80211_device *, u32); +static int ipw_set_geo(struct ieee80211_device *, const struct ieee80211_geo *); +static const struct ieee80211_geo *ipw_get_geo(struct ieee80211_device *); + static int snprint_line(char *buf, size_t count, const u8 * data, u32 len, u32 ofs) { @@ -268,15 +227,12 @@ static int snprintk_buf(u8 * output, size_t size, const u8 * data, size_t len) return total; } -/* alias for 32-bit indirect read (for SRAM/reg above 4K), with debug wrapper */ static u32 _ipw_read_reg32(struct ipw_priv *priv, u32 reg); #define ipw_read_reg32(a, b) _ipw_read_reg32(a, b) -/* alias for 8-bit indirect read (for SRAM/reg above 4K), with debug wrapper */ static u8 _ipw_read_reg8(struct ipw_priv *ipw, u32 reg); #define ipw_read_reg8(a, b) _ipw_read_reg8(a, b) -/* 8-bit indirect write (for SRAM/reg above 4K), with debug wrapper */ static void _ipw_write_reg8(struct ipw_priv *priv, u32 reg, u8 value); static inline void ipw_write_reg8(struct ipw_priv *a, u32 b, u8 c) { @@ -285,7 +241,6 @@ static inline void ipw_write_reg8(struct ipw_priv *a, u32 b, u8 c) _ipw_write_reg8(a, b, c); } -/* 16-bit indirect write (for SRAM/reg above 4K), with debug wrapper */ static void _ipw_write_reg16(struct ipw_priv *priv, u32 reg, u16 value); static inline void ipw_write_reg16(struct ipw_priv *a, u32 b, u16 c) { @@ -294,7 +249,6 @@ static inline void ipw_write_reg16(struct ipw_priv *a, u32 b, u16 c) _ipw_write_reg16(a, b, c); } -/* 32-bit indirect write (for SRAM/reg above 4K), with debug wrapper */ static void _ipw_write_reg32(struct ipw_priv *priv, u32 reg, u32 value); static inline void ipw_write_reg32(struct ipw_priv *a, u32 b, u32 c) { @@ -303,70 +257,48 @@ static inline void ipw_write_reg32(struct ipw_priv *a, u32 b, u32 c) _ipw_write_reg32(a, b, c); } -/* 8-bit direct write (low 4K) */ #define _ipw_write8(ipw, ofs, val) writeb((val), (ipw)->hw_base + (ofs)) - -/* 8-bit direct write (for low 4K of SRAM/regs), with debug wrapper */ #define ipw_write8(ipw, ofs, val) \ IPW_DEBUG_IO("%s %d: write_direct8(0x%08X, 0x%08X)\n", __FILE__, __LINE__, (u32)(ofs), (u32)(val)); \ _ipw_write8(ipw, ofs, val) -/* 16-bit direct write (low 4K) */ #define _ipw_write16(ipw, ofs, val) writew((val), (ipw)->hw_base + (ofs)) - -/* 16-bit direct write (for low 4K of SRAM/regs), with debug wrapper */ #define ipw_write16(ipw, ofs, val) \ IPW_DEBUG_IO("%s %d: write_direct16(0x%08X, 0x%08X)\n", __FILE__, __LINE__, (u32)(ofs), (u32)(val)); \ _ipw_write16(ipw, ofs, val) -/* 32-bit direct write (low 4K) */ #define _ipw_write32(ipw, ofs, val) writel((val), (ipw)->hw_base + (ofs)) - -/* 32-bit direct write (for low 4K of SRAM/regs), with debug wrapper */ #define ipw_write32(ipw, ofs, val) \ IPW_DEBUG_IO("%s %d: write_direct32(0x%08X, 0x%08X)\n", __FILE__, __LINE__, (u32)(ofs), (u32)(val)); \ _ipw_write32(ipw, ofs, val) -/* 8-bit direct read (low 4K) */ #define _ipw_read8(ipw, ofs) readb((ipw)->hw_base + (ofs)) - -/* 8-bit direct read (low 4K), with debug wrapper */ static inline u8 __ipw_read8(char *f, u32 l, struct ipw_priv *ipw, u32 ofs) { IPW_DEBUG_IO("%s %d: read_direct8(0x%08X)\n", f, l, (u32) (ofs)); return _ipw_read8(ipw, ofs); } -/* alias to 8-bit direct read (low 4K of SRAM/regs), with debug wrapper */ #define ipw_read8(ipw, ofs) __ipw_read8(__FILE__, __LINE__, ipw, ofs) -/* 16-bit direct read (low 4K) */ #define _ipw_read16(ipw, ofs) readw((ipw)->hw_base + (ofs)) - -/* 16-bit direct read (low 4K), with debug wrapper */ static inline u16 __ipw_read16(char *f, u32 l, struct ipw_priv *ipw, u32 ofs) { IPW_DEBUG_IO("%s %d: read_direct16(0x%08X)\n", f, l, (u32) (ofs)); return _ipw_read16(ipw, ofs); } -/* alias to 16-bit direct read (low 4K of SRAM/regs), with debug wrapper */ #define ipw_read16(ipw, ofs) __ipw_read16(__FILE__, __LINE__, ipw, ofs) -/* 32-bit direct read (low 4K) */ #define _ipw_read32(ipw, ofs) readl((ipw)->hw_base + (ofs)) - -/* 32-bit direct read (low 4K), with debug wrapper */ static inline u32 __ipw_read32(char *f, u32 l, struct ipw_priv *ipw, u32 ofs) { IPW_DEBUG_IO("%s %d: read_direct32(0x%08X)\n", f, l, (u32) (ofs)); return _ipw_read32(ipw, ofs); } -/* alias to 32-bit direct read (low 4K of SRAM/regs), with debug wrapper */ #define ipw_read32(ipw, ofs) __ipw_read32(__FILE__, __LINE__, ipw, ofs) -/* multi-byte read (above 4K), with debug wrapper */ static void _ipw_read_indirect(struct ipw_priv *, u32, u8 *, int); static inline void __ipw_read_indirect(const char *f, int l, struct ipw_priv *a, u32 b, u8 * c, int d) @@ -376,17 +308,15 @@ static inline void __ipw_read_indirect(const char *f, int l, _ipw_read_indirect(a, b, c, d); } -/* alias to multi-byte read (SRAM/regs above 4K), with debug wrapper */ #define ipw_read_indirect(a, b, c, d) __ipw_read_indirect(__FILE__, __LINE__, a, b, c, d) -/* alias to multi-byte read (SRAM/regs above 4K), with debug wrapper */ static void _ipw_write_indirect(struct ipw_priv *priv, u32 addr, u8 * data, int num); #define ipw_write_indirect(a, b, c, d) \ IPW_DEBUG_IO("%s %d: write_indirect(0x%08X) %d bytes\n", __FILE__, __LINE__, (u32)(b), d); \ _ipw_write_indirect(a, b, c, d) -/* 32-bit indirect write (above 4K) */ +/* indirect write s */ static void _ipw_write_reg32(struct ipw_priv *priv, u32 reg, u32 value) { IPW_DEBUG_IO(" %p : reg = 0x%8X : value = 0x%8X\n", priv, reg, value); @@ -394,29 +324,22 @@ static void _ipw_write_reg32(struct ipw_priv *priv, u32 reg, u32 value) _ipw_write32(priv, IPW_INDIRECT_DATA, value); } -/* 8-bit indirect write (above 4K) */ static void _ipw_write_reg8(struct ipw_priv *priv, u32 reg, u8 value) { - u32 aligned_addr = reg & IPW_INDIRECT_ADDR_MASK; /* dword align */ - u32 dif_len = reg - aligned_addr; - IPW_DEBUG_IO(" reg = 0x%8X : value = 0x%8X\n", reg, value); - _ipw_write32(priv, IPW_INDIRECT_ADDR, aligned_addr); - _ipw_write8(priv, IPW_INDIRECT_DATA + dif_len, value); + _ipw_write32(priv, IPW_INDIRECT_ADDR, reg & IPW_INDIRECT_ADDR_MASK); + _ipw_write8(priv, IPW_INDIRECT_DATA, value); } -/* 16-bit indirect write (above 4K) */ static void _ipw_write_reg16(struct ipw_priv *priv, u32 reg, u16 value) { - u32 aligned_addr = reg & IPW_INDIRECT_ADDR_MASK; /* dword align */ - u32 dif_len = (reg - aligned_addr) & (~0x1ul); - IPW_DEBUG_IO(" reg = 0x%8X : value = 0x%8X\n", reg, value); - _ipw_write32(priv, IPW_INDIRECT_ADDR, aligned_addr); - _ipw_write16(priv, IPW_INDIRECT_DATA + dif_len, value); + _ipw_write32(priv, IPW_INDIRECT_ADDR, reg & IPW_INDIRECT_ADDR_MASK); + _ipw_write16(priv, IPW_INDIRECT_DATA, value); } -/* 8-bit indirect read (above 4K) */ +/* indirect read s */ + static u8 _ipw_read_reg8(struct ipw_priv *priv, u32 reg) { u32 word; @@ -426,7 +349,6 @@ static u8 _ipw_read_reg8(struct ipw_priv *priv, u32 reg) return (word >> ((reg & 0x3) * 8)) & 0xff; } -/* 32-bit indirect read (above 4K) */ static u32 _ipw_read_reg32(struct ipw_priv *priv, u32 reg) { u32 value; @@ -439,12 +361,11 @@ static u32 _ipw_read_reg32(struct ipw_priv *priv, u32 reg) return value; } -/* General purpose, no alignment requirement, iterative (multi-byte) read, */ -/* for area above 1st 4K of SRAM/reg space */ +/* iterative/auto-increment 32 bit reads and writes */ static void _ipw_read_indirect(struct ipw_priv *priv, u32 addr, u8 * buf, int num) { - u32 aligned_addr = addr & IPW_INDIRECT_ADDR_MASK; /* dword align */ + u32 aligned_addr = addr & IPW_INDIRECT_ADDR_MASK; u32 dif_len = addr - aligned_addr; u32 i; @@ -454,7 +375,7 @@ static void _ipw_read_indirect(struct ipw_priv *priv, u32 addr, u8 * buf, return; } - /* Read the first dword (or portion) byte by byte */ + /* Read the first nibble byte by byte */ if (unlikely(dif_len)) { _ipw_write32(priv, IPW_INDIRECT_ADDR, aligned_addr); /* Start reading at aligned_addr + dif_len */ @@ -463,12 +384,11 @@ static void _ipw_read_indirect(struct ipw_priv *priv, u32 addr, u8 * buf, aligned_addr += 4; } - /* Read all of the middle dwords as dwords, with auto-increment */ _ipw_write32(priv, IPW_AUTOINC_ADDR, aligned_addr); for (; num >= 4; buf += 4, aligned_addr += 4, num -= 4) *(u32 *) buf = _ipw_read32(priv, IPW_AUTOINC_DATA); - /* Read the last dword (or portion) byte by byte */ + /* Copy the last nibble */ if (unlikely(num)) { _ipw_write32(priv, IPW_INDIRECT_ADDR, aligned_addr); for (i = 0; num > 0; i++, num--) @@ -476,12 +396,10 @@ static void _ipw_read_indirect(struct ipw_priv *priv, u32 addr, u8 * buf, } } -/* General purpose, no alignment requirement, iterative (multi-byte) write, */ -/* for area above 1st 4K of SRAM/reg space */ static void _ipw_write_indirect(struct ipw_priv *priv, u32 addr, u8 * buf, int num) { - u32 aligned_addr = addr & IPW_INDIRECT_ADDR_MASK; /* dword align */ + u32 aligned_addr = addr & IPW_INDIRECT_ADDR_MASK; u32 dif_len = addr - aligned_addr; u32 i; @@ -491,21 +409,20 @@ static void _ipw_write_indirect(struct ipw_priv *priv, u32 addr, u8 * buf, return; } - /* Write the first dword (or portion) byte by byte */ + /* Write the first nibble byte by byte */ if (unlikely(dif_len)) { _ipw_write32(priv, IPW_INDIRECT_ADDR, aligned_addr); - /* Start writing at aligned_addr + dif_len */ + /* Start reading at aligned_addr + dif_len */ for (i = dif_len; ((i < 4) && (num > 0)); i++, num--, buf++) _ipw_write8(priv, IPW_INDIRECT_DATA + i, *buf); aligned_addr += 4; } - /* Write all of the middle dwords as dwords, with auto-increment */ _ipw_write32(priv, IPW_AUTOINC_ADDR, aligned_addr); for (; num >= 4; buf += 4, aligned_addr += 4, num -= 4) _ipw_write32(priv, IPW_AUTOINC_DATA, *(u32 *) buf); - /* Write the last dword (or portion) byte by byte */ + /* Copy the last nibble */ if (unlikely(num)) { _ipw_write32(priv, IPW_INDIRECT_ADDR, aligned_addr); for (i = 0; num > 0; i++, num--, buf++) @@ -513,27 +430,23 @@ static void _ipw_write_indirect(struct ipw_priv *priv, u32 addr, u8 * buf, } } -/* General purpose, no alignment requirement, iterative (multi-byte) write, */ -/* for 1st 4K of SRAM/regs space */ static void ipw_write_direct(struct ipw_priv *priv, u32 addr, void *buf, int num) { memcpy_toio((priv->hw_base + addr), buf, num); } -/* Set bit(s) in low 4K of SRAM/regs */ static inline void ipw_set_bit(struct ipw_priv *priv, u32 reg, u32 mask) { ipw_write32(priv, reg, ipw_read32(priv, reg) | mask); } -/* Clear bit(s) in low 4K of SRAM/regs */ 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; @@ -541,7 +454,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; @@ -549,24 +462,6 @@ 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) { @@ -806,7 +701,7 @@ static void ipw_init_ordinals(struct ipw_priv *priv) } -static u32 ipw_register_toggle(u32 reg) +u32 ipw_register_toggle(u32 reg) { reg &= ~IPW_START_STANDBY; if (reg & IPW_GATE_ODMA) @@ -827,11 +722,11 @@ static u32 ipw_register_toggle(u32 reg) * - On radio OFF, turn off any LEDs started during radio on * */ -#define LD_TIME_LINK_ON msecs_to_jiffies(300) -#define LD_TIME_LINK_OFF msecs_to_jiffies(2700) -#define LD_TIME_ACT_ON msecs_to_jiffies(250) +#define LD_TIME_LINK_ON 300 +#define LD_TIME_LINK_OFF 2700 +#define LD_TIME_ACT_ON 250 -static void ipw_led_link_on(struct ipw_priv *priv) +void ipw_led_link_on(struct ipw_priv *priv) { unsigned long flags; u32 led; @@ -869,12 +764,12 @@ static void ipw_led_link_on(struct ipw_priv *priv) static void ipw_bg_led_link_on(void *data) { struct ipw_priv *priv = data; - mutex_lock(&priv->mutex); + down(&priv->sem); ipw_led_link_on(data); - mutex_unlock(&priv->mutex); + up(&priv->sem); } -static void ipw_led_link_off(struct ipw_priv *priv) +void ipw_led_link_off(struct ipw_priv *priv) { unsigned long flags; u32 led; @@ -913,9 +808,9 @@ static void ipw_led_link_off(struct ipw_priv *priv) static void ipw_bg_led_link_off(void *data) { struct ipw_priv *priv = data; - mutex_lock(&priv->mutex); + down(&priv->sem); ipw_led_link_off(data); - mutex_unlock(&priv->mutex); + up(&priv->sem); } static void __ipw_led_activity_on(struct ipw_priv *priv) @@ -952,7 +847,6 @@ static void __ipw_led_activity_on(struct ipw_priv *priv) } } -#if 0 void ipw_led_activity_on(struct ipw_priv *priv) { unsigned long flags; @@ -960,9 +854,8 @@ void ipw_led_activity_on(struct ipw_priv *priv) __ipw_led_activity_on(priv); spin_unlock_irqrestore(&priv->lock, flags); } -#endif /* 0 */ -static void ipw_led_activity_off(struct ipw_priv *priv) +void ipw_led_activity_off(struct ipw_priv *priv) { unsigned long flags; u32 led; @@ -992,12 +885,12 @@ static void ipw_led_activity_off(struct ipw_priv *priv) static void ipw_bg_led_activity_off(void *data) { struct ipw_priv *priv = data; - mutex_lock(&priv->mutex); + down(&priv->sem); ipw_led_activity_off(data); - mutex_unlock(&priv->mutex); + up(&priv->sem); } -static void ipw_led_band_on(struct ipw_priv *priv) +void ipw_led_band_on(struct ipw_priv *priv) { unsigned long flags; u32 led; @@ -1032,7 +925,7 @@ static void ipw_led_band_on(struct ipw_priv *priv) spin_unlock_irqrestore(&priv->lock, flags); } -static void ipw_led_band_off(struct ipw_priv *priv) +void ipw_led_band_off(struct ipw_priv *priv) { unsigned long flags; u32 led; @@ -1055,24 +948,24 @@ static void ipw_led_band_off(struct ipw_priv *priv) spin_unlock_irqrestore(&priv->lock, flags); } -static void ipw_led_radio_on(struct ipw_priv *priv) +void ipw_led_radio_on(struct ipw_priv *priv) { ipw_led_link_on(priv); } -static void ipw_led_radio_off(struct ipw_priv *priv) +void ipw_led_radio_off(struct ipw_priv *priv) { ipw_led_activity_off(priv); ipw_led_link_off(priv); } -static void ipw_led_link_up(struct ipw_priv *priv) +void ipw_led_link_up(struct ipw_priv *priv) { /* Set the Link Led on for all nic types */ ipw_led_link_on(priv); } -static void ipw_led_link_down(struct ipw_priv *priv) +void ipw_led_link_down(struct ipw_priv *priv) { ipw_led_activity_off(priv); ipw_led_link_off(priv); @@ -1081,7 +974,7 @@ static void ipw_led_link_down(struct ipw_priv *priv) ipw_led_radio_off(priv); } -static void ipw_led_init(struct ipw_priv *priv) +void ipw_led_init(struct ipw_priv *priv) { priv->nic_type = priv->eeprom[EEPROM_NIC_TYPE]; @@ -1132,7 +1025,7 @@ static void ipw_led_init(struct ipw_priv *priv) } } -static void ipw_led_shutdown(struct ipw_priv *priv) +void ipw_led_shutdown(struct ipw_priv *priv) { ipw_led_activity_off(priv); ipw_led_link_off(priv); @@ -1181,7 +1074,6 @@ static DRIVER_ATTR(debug_level, S_IWUSR | S_IRUGO, static inline u32 ipw_get_event_log_len(struct ipw_priv *priv) { - /* length = 1st dword in log */ return ipw_read_reg32(priv, ipw_read32(priv, IPW_EVENT_LOG)); } @@ -1229,6 +1121,12 @@ 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) { @@ -1290,9 +1188,10 @@ static ssize_t clear_error(struct device *d, const char *buf, size_t count) { struct ipw_priv *priv = dev_get_drvdata(d); - - kfree(priv->error); - priv->error = NULL; + if (priv->error) { + ipw_free_error_log(priv->error); + priv->error = NULL; + } return count; } @@ -1325,105 +1224,6 @@ 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) { @@ -1803,7 +1603,7 @@ static ssize_t store_speed_scan(struct device *d, struct device_attribute *attr, break; } - if (ieee80211_is_valid_channel(priv->ieee, channel)) + if (ipw_is_valid_channel(priv->ieee, channel)) priv->speed_scan[pos++] = channel; else IPW_WARNING("Skipping invalid channel request: %d\n", @@ -1867,7 +1667,7 @@ static void ipw_irq_tasklet(struct ipw_priv *priv) unsigned long flags; int rc = 0; - spin_lock_irqsave(&priv->irq_lock, flags); + spin_lock_irqsave(&priv->lock, flags); inta = ipw_read32(priv, IPW_INTA_RW); inta_mask = ipw_read32(priv, IPW_INTA_MASK_R); @@ -1876,10 +1676,6 @@ 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); @@ -1955,24 +1751,25 @@ static void ipw_irq_tasklet(struct ipw_priv *priv) } if (inta & IPW_INTA_BIT_FATAL_ERROR) { - IPW_WARNING("Firmware error detected. Restarting.\n"); + IPW_ERROR("Firmware error detected. Restarting.\n"); if (priv->error) { - IPW_DEBUG_FW("Sysfs 'error' log already exists.\n"); + IPW_ERROR("Sysfs 'error' log already exists.\n"); #ifdef CONFIG_IPW2200_DEBUG if (ipw_debug_level & IPW_DL_FW_ERRORS) { struct ipw_fw_error *error = ipw_alloc_error_log(priv); ipw_dump_error_log(priv, error); - kfree(error); + if (error) + ipw_free_error_log(error); } #endif } else { priv->error = ipw_alloc_error_log(priv); if (priv->error) - IPW_DEBUG_FW("Sysfs 'error' log captured.\n"); + IPW_ERROR("Sysfs 'error' log captured.\n"); else - IPW_DEBUG_FW("Error allocating sysfs 'error' " - "log.\n"); + IPW_ERROR("Error allocating sysfs 'error' " + "log.\n"); #ifdef CONFIG_IPW2200_DEBUG if (ipw_debug_level & IPW_DL_FW_ERRORS) ipw_dump_error_log(priv, priv->error); @@ -2007,10 +1804,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 @@ -2073,8 +1870,7 @@ static char *get_cmd_string(u8 cmd) } #define HOST_COMPLETE_TIMEOUT HZ - -static int __ipw_send_cmd(struct ipw_priv *priv, struct host_cmd *cmd) +static int ipw_send_cmd(struct ipw_priv *priv, struct host_cmd *cmd) { int rc = 0; unsigned long flags; @@ -2101,15 +1897,9 @@ static int __ipw_send_cmd(struct ipw_priv *priv, struct host_cmd *cmd) IPW_DEBUG_HC("%s command (#%d) %d bytes: 0x%08X\n", get_cmd_string(cmd->cmd), cmd->cmd, cmd->len, priv->status); + printk_buf(IPW_DL_HOST_COMMAND, (u8 *) cmd->param, cmd->len); -#ifndef DEBUG_CMD_WEP_KEY - if (cmd->cmd == IPW_CMD_WEP_KEY) - IPW_DEBUG_HC("WEP_KEY command masked out for secure.\n"); - else -#endif - printk_buf(IPW_DL_HOST_COMMAND, (u8 *) cmd->param, cmd->len); - - rc = ipw_queue_tx_hcmd(priv, cmd->cmd, cmd->param, cmd->len, 0); + rc = ipw_queue_tx_hcmd(priv, cmd->cmd, &cmd->param, cmd->len, 0); if (rc) { priv->status &= ~STATUS_HCMD_ACTIVE; IPW_ERROR("Failed to send %s: Reason %d\n", @@ -2152,57 +1942,61 @@ static int __ipw_send_cmd(struct ipw_priv *priv, struct host_cmd *cmd) return rc; } -static int ipw_send_cmd_simple(struct ipw_priv *priv, u8 command) +static int ipw_send_host_complete(struct ipw_priv *priv) { struct host_cmd cmd = { - .cmd = command, + .cmd = IPW_CMD_HOST_COMPLETE, + .len = 0 }; - return __ipw_send_cmd(priv, &cmd); + if (!priv) { + IPW_ERROR("Invalid args\n"); + return -1; + } + + return ipw_send_cmd(priv, &cmd); } -static int ipw_send_cmd_pdu(struct ipw_priv *priv, u8 command, u8 len, - void *data) +static int ipw_send_system_config(struct ipw_priv *priv, + struct ipw_sys_config *config) { struct host_cmd cmd = { - .cmd = command, - .len = len, - .param = data, + .cmd = IPW_CMD_SYSTEM_CONFIG, + .len = sizeof(*config) }; - return __ipw_send_cmd(priv, &cmd); -} - -static int ipw_send_host_complete(struct ipw_priv *priv) -{ - if (!priv) { + if (!priv || !config) { IPW_ERROR("Invalid args\n"); return -1; } - return ipw_send_cmd_simple(priv, IPW_CMD_HOST_COMPLETE); -} - -static int ipw_send_system_config(struct ipw_priv *priv) -{ - return ipw_send_cmd_pdu(priv, IPW_CMD_SYSTEM_CONFIG, - sizeof(priv->sys_config), - &priv->sys_config); + memcpy(cmd.param, config, sizeof(*config)); + return ipw_send_cmd(priv, &cmd); } static int ipw_send_ssid(struct ipw_priv *priv, u8 * ssid, int len) { + struct host_cmd cmd = { + .cmd = IPW_CMD_SSID, + .len = min(len, IW_ESSID_MAX_SIZE) + }; + if (!priv || !ssid) { IPW_ERROR("Invalid args\n"); return -1; } - return ipw_send_cmd_pdu(priv, IPW_CMD_SSID, min(len, IW_ESSID_MAX_SIZE), - ssid); + memcpy(cmd.param, ssid, cmd.len); + return ipw_send_cmd(priv, &cmd); } static int ipw_send_adapter_address(struct ipw_priv *priv, u8 * mac) { + struct host_cmd cmd = { + .cmd = IPW_CMD_ADAPTER_ADDRESS, + .len = ETH_ALEN + }; + if (!priv || !mac) { IPW_ERROR("Invalid args\n"); return -1; @@ -2211,7 +2005,8 @@ static int ipw_send_adapter_address(struct ipw_priv *priv, u8 * mac) IPW_DEBUG_INFO("%s: Setting MAC to " MAC_FMT "\n", priv->net_dev->name, MAC_ARG(mac)); - return ipw_send_cmd_pdu(priv, IPW_CMD_ADAPTER_ADDRESS, ETH_ALEN, mac); + memcpy(cmd.param, mac, ETH_ALEN); + return ipw_send_cmd(priv, &cmd); } /* @@ -2241,9 +2036,9 @@ static void ipw_adapter_restart(void *adapter) static void ipw_bg_adapter_restart(void *data) { struct ipw_priv *priv = data; - mutex_lock(&priv->mutex); + down(&priv->sem); ipw_adapter_restart(data); - mutex_unlock(&priv->mutex); + up(&priv->sem); } #define IPW_SCAN_CHECK_WATCHDOG (5 * HZ) @@ -2253,8 +2048,8 @@ static void ipw_scan_check(void *data) struct ipw_priv *priv = data; if (priv->status & (STATUS_SCANNING | STATUS_SCAN_ABORTING)) { IPW_DEBUG_SCAN("Scan completion watchdog resetting " - "adapter after (%dms).\n", - jiffies_to_msecs(IPW_SCAN_CHECK_WATCHDOG)); + "adapter (%dms).\n", + IPW_SCAN_CHECK_WATCHDOG / 100); queue_work(priv->workqueue, &priv->adapter_restart); } } @@ -2262,48 +2057,59 @@ static void ipw_scan_check(void *data) static void ipw_bg_scan_check(void *data) { struct ipw_priv *priv = data; - mutex_lock(&priv->mutex); + down(&priv->sem); ipw_scan_check(data); - mutex_unlock(&priv->mutex); + up(&priv->sem); } static int ipw_send_scan_request_ext(struct ipw_priv *priv, struct ipw_scan_request_ext *request) { - return ipw_send_cmd_pdu(priv, IPW_CMD_SCAN_REQUEST_EXT, - sizeof(*request), request); + struct host_cmd cmd = { + .cmd = IPW_CMD_SCAN_REQUEST_EXT, + .len = sizeof(*request) + }; + + memcpy(cmd.param, request, sizeof(*request)); + return ipw_send_cmd(priv, &cmd); } static int ipw_send_scan_abort(struct ipw_priv *priv) { + struct host_cmd cmd = { + .cmd = IPW_CMD_SCAN_ABORT, + .len = 0 + }; + if (!priv) { IPW_ERROR("Invalid args\n"); return -1; } - return ipw_send_cmd_simple(priv, IPW_CMD_SCAN_ABORT); + return ipw_send_cmd(priv, &cmd); } static int ipw_set_sensitivity(struct ipw_priv *priv, u16 sens) { - struct ipw_sensitivity_calib calib = { - .beacon_rssi_raw = sens, + struct host_cmd cmd = { + .cmd = IPW_CMD_SENSITIVITY_CALIB, + .len = sizeof(struct ipw_sensitivity_calib) }; - - return ipw_send_cmd_pdu(priv, IPW_CMD_SENSITIVITY_CALIB, sizeof(calib), - &calib); + struct ipw_sensitivity_calib *calib = (struct ipw_sensitivity_calib *) + &cmd.param; + calib->beacon_rssi_raw = sens; + return ipw_send_cmd(priv, &cmd); } static int ipw_send_associate(struct ipw_priv *priv, struct ipw_associate *associate) { - struct ipw_associate tmp_associate; - - if (!priv || !associate) { - IPW_ERROR("Invalid args\n"); - return -1; - } + struct host_cmd cmd = { + .cmd = IPW_CMD_ASSOCIATE, + .len = sizeof(*associate) + }; + struct ipw_associate tmp_associate; memcpy(&tmp_associate, associate, sizeof(*associate)); tmp_associate.policy_support = cpu_to_le16(tmp_associate.policy_support); @@ -2316,60 +2122,85 @@ static int ipw_send_associate(struct ipw_priv *priv, cpu_to_le16(tmp_associate.beacon_interval); tmp_associate.atim_window = cpu_to_le16(tmp_associate.atim_window); - return ipw_send_cmd_pdu(priv, IPW_CMD_ASSOCIATE, sizeof(tmp_associate), - &tmp_associate); + if (!priv || !associate) { + IPW_ERROR("Invalid args\n"); + return -1; + } + + memcpy(cmd.param, &tmp_associate, sizeof(*associate)); + return ipw_send_cmd(priv, &cmd); } static int ipw_send_supported_rates(struct ipw_priv *priv, struct ipw_supported_rates *rates) { + struct host_cmd cmd = { + .cmd = IPW_CMD_SUPPORTED_RATES, + .len = sizeof(*rates) + }; + if (!priv || !rates) { IPW_ERROR("Invalid args\n"); return -1; } - return ipw_send_cmd_pdu(priv, IPW_CMD_SUPPORTED_RATES, sizeof(*rates), - rates); + memcpy(cmd.param, rates, sizeof(*rates)); + return ipw_send_cmd(priv, &cmd); } static int ipw_set_random_seed(struct ipw_priv *priv) { - u32 val; + struct host_cmd cmd = { + .cmd = IPW_CMD_SEED_NUMBER, + .len = sizeof(u32) + }; if (!priv) { IPW_ERROR("Invalid args\n"); return -1; } - get_random_bytes(&val, sizeof(val)); + get_random_bytes(&cmd.param, sizeof(u32)); - return ipw_send_cmd_pdu(priv, IPW_CMD_SEED_NUMBER, sizeof(val), &val); + return ipw_send_cmd(priv, &cmd); } static int ipw_send_card_disable(struct ipw_priv *priv, u32 phy_off) { + struct host_cmd cmd = { + .cmd = IPW_CMD_CARD_DISABLE, + .len = sizeof(u32) + }; + if (!priv) { IPW_ERROR("Invalid args\n"); return -1; } - return ipw_send_cmd_pdu(priv, IPW_CMD_CARD_DISABLE, sizeof(phy_off), - &phy_off); + *((u32 *) & cmd.param) = phy_off; + + return ipw_send_cmd(priv, &cmd); } static int ipw_send_tx_power(struct ipw_priv *priv, struct ipw_tx_power *power) { + struct host_cmd cmd = { + .cmd = IPW_CMD_TX_POWER, + .len = sizeof(*power) + }; + if (!priv || !power) { IPW_ERROR("Invalid args\n"); return -1; } - return ipw_send_cmd_pdu(priv, IPW_CMD_TX_POWER, sizeof(*power), power); + memcpy(cmd.param, power, sizeof(*power)); + return ipw_send_cmd(priv, &cmd); } static int ipw_set_tx_power(struct ipw_priv *priv) { - const struct ieee80211_geo *geo = ieee80211_get_geo(priv->ieee); + const struct ieee80211_geo *geo = ipw_get_geo(priv->ieee); struct ipw_tx_power tx_power; s8 max_power; int i; @@ -2416,14 +2247,18 @@ static int ipw_send_rts_threshold(struct ipw_priv *priv, u16 rts) struct ipw_rts_threshold rts_threshold = { .rts_threshold = rts, }; + struct host_cmd cmd = { + .cmd = IPW_CMD_RTS_THRESHOLD, + .len = sizeof(rts_threshold) + }; if (!priv) { IPW_ERROR("Invalid args\n"); return -1; } - return ipw_send_cmd_pdu(priv, IPW_CMD_RTS_THRESHOLD, - sizeof(rts_threshold), &rts_threshold); + memcpy(cmd.param, &rts_threshold, sizeof(rts_threshold)); + return ipw_send_cmd(priv, &cmd); } static int ipw_send_frag_threshold(struct ipw_priv *priv, u16 frag) @@ -2431,19 +2266,27 @@ static int ipw_send_frag_threshold(struct ipw_priv *priv, u16 frag) struct ipw_frag_threshold frag_threshold = { .frag_threshold = frag, }; + struct host_cmd cmd = { + .cmd = IPW_CMD_FRAG_THRESHOLD, + .len = sizeof(frag_threshold) + }; if (!priv) { IPW_ERROR("Invalid args\n"); return -1; } - return ipw_send_cmd_pdu(priv, IPW_CMD_FRAG_THRESHOLD, - sizeof(frag_threshold), &frag_threshold); + memcpy(cmd.param, &frag_threshold, sizeof(frag_threshold)); + return ipw_send_cmd(priv, &cmd); } static int ipw_send_power_mode(struct ipw_priv *priv, u32 mode) { - u32 param; + struct host_cmd cmd = { + .cmd = IPW_CMD_POWER_MODE, + .len = sizeof(u32) + }; + u32 *param = (u32 *) (&cmd.param); if (!priv) { IPW_ERROR("Invalid args\n"); @@ -2454,18 +2297,17 @@ static int ipw_send_power_mode(struct ipw_priv *priv, u32 mode) * level */ switch (mode) { case IPW_POWER_BATTERY: - param = IPW_POWER_INDEX_3; + *param = IPW_POWER_INDEX_3; break; case IPW_POWER_AC: - param = IPW_POWER_MODE_CAM; + *param = IPW_POWER_MODE_CAM; break; default: - param = mode; + *param = mode; break; } - return ipw_send_cmd_pdu(priv, IPW_CMD_POWER_MODE, sizeof(param), - ¶m); + return ipw_send_cmd(priv, &cmd); } static int ipw_send_retry_limit(struct ipw_priv *priv, u8 slimit, u8 llimit) @@ -2474,14 +2316,18 @@ static int ipw_send_retry_limit(struct ipw_priv *priv, u8 slimit, u8 llimit) .short_retry_limit = slimit, .long_retry_limit = llimit }; + struct host_cmd cmd = { + .cmd = IPW_CMD_RETRY_LIMIT, + .len = sizeof(retry_limit) + }; if (!priv) { IPW_ERROR("Invalid args\n"); return -1; } - return ipw_send_cmd_pdu(priv, IPW_CMD_RETRY_LIMIT, sizeof(retry_limit), - &retry_limit); + memcpy(cmd.param, &retry_limit, sizeof(retry_limit)); + return ipw_send_cmd(priv, &cmd); } /* @@ -2608,7 +2454,7 @@ static void ipw_eeprom_init_sram(struct ipw_priv *priv) /* If the data looks correct, then copy it to our private copy. Otherwise let the firmware know to perform the operation - on its own. + on it's own */ if (priv->eeprom[EEPROM_VERSION] != 0) { IPW_DEBUG_INFO("Writing EEPROM data into SRAM\n"); @@ -2861,25 +2707,22 @@ static int ipw_fw_dma_add_buffer(struct ipw_priv *priv, static int ipw_fw_dma_wait(struct ipw_priv *priv) { - u32 current_index = 0, previous_index; + u32 current_index = 0; u32 watchdog = 0; IPW_DEBUG_FW(">> : \n"); current_index = ipw_fw_dma_command_block_index(priv); - IPW_DEBUG_FW_INFO("sram_desc.last_cb_index:0x%08X\n", + IPW_DEBUG_FW_INFO("sram_desc.last_cb_index:0x%8X\n", (int)priv->sram_desc.last_cb_index); while (current_index < priv->sram_desc.last_cb_index) { udelay(50); - previous_index = current_index; current_index = ipw_fw_dma_command_block_index(priv); - if (previous_index < current_index) { - watchdog = 0; - continue; - } - if (++watchdog > 400) { + watchdog++; + + if (watchdog > 400) { IPW_DEBUG_FW_INFO("Timeout\n"); ipw_fw_dma_dump_command_block(priv); ipw_fw_dma_abort(priv); @@ -2929,7 +2772,6 @@ static inline int ipw_alive(struct ipw_priv *priv) return ipw_read32(priv, 0x90) == 0xd55555d5; } -/* timeout in msec, attempted in 10-msec quanta */ static int ipw_poll_bit(struct ipw_priv *priv, u32 addr, u32 mask, int timeout) { @@ -2958,11 +2800,10 @@ static int ipw_stop_master(struct ipw_priv *priv) /* stop master. typical delay - 0 */ ipw_set_bit(priv, IPW_RESET_REG, IPW_RESET_REG_STOP_MASTER); - /* timeout is in msec, polled in 10-msec quanta */ rc = ipw_poll_bit(priv, IPW_RESET_REG, IPW_RESET_REG_MASTER_DISABLED, 100); if (rc < 0) { - IPW_ERROR("wait for stop master failed after 100ms\n"); + IPW_ERROR("stop master failed in 10ms\n"); return -1; } @@ -2982,11 +2823,33 @@ static void ipw_arc_release(struct ipw_priv *priv) mdelay(5); } +struct fw_header { + u32 version; + u32 mode; +}; + struct fw_chunk { u32 address; u32 length; }; +#define IPW_FW_MAJOR_VERSION 2 +#define IPW_FW_MINOR_VERSION 4 + +#define IPW_FW_MINOR(x) ((x & 0xff) >> 8) +#define IPW_FW_MAJOR(x) (x & 0xff) + +#define IPW_FW_VERSION ((IPW_FW_MINOR_VERSION << 8) | IPW_FW_MAJOR_VERSION) + +#define IPW_FW_PREFIX "ipw-" __stringify(IPW_FW_MAJOR_VERSION) \ +"." __stringify(IPW_FW_MINOR_VERSION) "-" + +#if IPW_FW_MAJOR_VERSION >= 2 && IPW_FW_MINOR_VERSION > 0 +#define IPW_FW_NAME(x) IPW_FW_PREFIX "" x ".fw" +#else +#define IPW_FW_NAME(x) "ipw2200_" x ".fw" +#endif + static int ipw_load_ucode(struct ipw_priv *priv, u8 * data, size_t len) { int rc = 0, i, addr; @@ -3027,8 +2890,8 @@ static int ipw_load_ucode(struct ipw_priv *priv, u8 * data, size_t len) mdelay(1); /* enable ucode store */ - ipw_write_reg8(priv, IPW_BASEBAND_CONTROL_STATUS, 0x0); - ipw_write_reg8(priv, IPW_BASEBAND_CONTROL_STATUS, DINO_ENABLE_CS); + ipw_write_reg8(priv, DINO_CONTROL_REG, 0x0); + ipw_write_reg8(priv, DINO_CONTROL_REG, DINO_ENABLE_CS); mdelay(1); /* write ucode */ @@ -3173,7 +3036,7 @@ static int ipw_stop_nic(struct ipw_priv *priv) rc = ipw_poll_bit(priv, IPW_RESET_REG, IPW_RESET_REG_MASTER_DISABLED, 500); if (rc < 0) { - IPW_ERROR("wait for reg master disabled failed after 500ms\n"); + IPW_ERROR("wait for reg master disabled failed\n"); return rc; } @@ -3255,47 +3118,33 @@ static int ipw_reset_nic(struct ipw_priv *priv) return rc; } - -struct ipw_fw { - __le32 ver; - __le32 boot_size; - __le32 ucode_size; - __le32 fw_size; - u8 data[0]; -}; - static int ipw_get_fw(struct ipw_priv *priv, - const struct firmware **raw, const char *name) + const struct firmware **fw, const char *name) { - struct ipw_fw *fw; + struct fw_header *header; int rc; /* ask firmware_class module to get the boot firmware off disk */ - rc = request_firmware(raw, name, &priv->pci_dev->dev); + rc = request_firmware(fw, name, &priv->pci_dev->dev); if (rc < 0) { - IPW_ERROR("%s request_firmware failed: Reason %d\n", name, rc); + IPW_ERROR("%s load failed: Reason %d\n", name, rc); return rc; } - if ((*raw)->size < sizeof(*fw)) { - IPW_ERROR("%s is too small (%zd)\n", name, (*raw)->size); + header = (struct fw_header *)(*fw)->data; + if (IPW_FW_MAJOR(le32_to_cpu(header->version)) != IPW_FW_MAJOR_VERSION) { + IPW_ERROR("'%s' firmware version not compatible (%d != %d)\n", + name, + IPW_FW_MAJOR(le32_to_cpu(header->version)), + IPW_FW_MAJOR_VERSION); return -EINVAL; } - fw = (void *)(*raw)->data; - - 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; - } - - IPW_DEBUG_INFO("Read firmware '%s' image v%d.%d (%zd bytes)\n", + IPW_DEBUG_INFO("Loading firmware '%s' file v%d.%d (%zd bytes)\n", name, - le32_to_cpu(fw->ver) >> 16, - le32_to_cpu(fw->ver) & 0xff, - (*raw)->size - sizeof(*fw)); + IPW_FW_MAJOR(le32_to_cpu(header->version)), + IPW_FW_MINOR(le32_to_cpu(header->version)), + (*fw)->size - sizeof(struct fw_header)); return 0; } @@ -3335,13 +3184,17 @@ static void ipw_rx_queue_reset(struct ipw_priv *priv, #ifdef CONFIG_PM static int fw_loaded = 0; -static const struct firmware *raw = NULL; +static const struct firmware *bootfw = NULL; +static const struct firmware *firmware = NULL; +static const struct firmware *ucode = NULL; static void free_firmware(void) { if (fw_loaded) { - release_firmware(raw); - raw = NULL; + release_firmware(bootfw); + release_firmware(ucode); + release_firmware(firmware); + bootfw = ucode = firmware = NULL; fw_loaded = 0; } } @@ -3352,51 +3205,60 @@ static void free_firmware(void) static int ipw_load(struct ipw_priv *priv) { #ifndef CONFIG_PM - const struct firmware *raw = NULL; + const struct firmware *bootfw = NULL; + const struct firmware *firmware = NULL; + const struct firmware *ucode = NULL; #endif - struct ipw_fw *fw; - u8 *boot_img, *ucode_img, *fw_img; - u8 *name = NULL; int rc = 0, retries = 3; - switch (priv->ieee->iw_mode) { - case IW_MODE_ADHOC: - name = "ipw2200-ibss.fw"; - break; -#ifdef CONFIG_IPW2200_MONITOR - case IW_MODE_MONITOR: - name = "ipw2200-sniffer.fw"; - break; +#ifdef CONFIG_PM + if (!fw_loaded) { #endif - case IW_MODE_INFRA: - name = "ipw2200-bss.fw"; - break; - } + rc = ipw_get_fw(priv, &bootfw, IPW_FW_NAME("boot")); + if (rc) + goto error; - if (!name) { - rc = -EINVAL; - goto error; - } + switch (priv->ieee->iw_mode) { + case IW_MODE_ADHOC: + rc = ipw_get_fw(priv, &ucode, + IPW_FW_NAME("ibss_ucode")); + if (rc) + goto error; -#ifdef CONFIG_PM - if (!fw_loaded) { + rc = ipw_get_fw(priv, &firmware, IPW_FW_NAME("ibss")); + break; + +#ifdef CONFIG_IPW2200_MONITOR + case IW_MODE_MONITOR: + rc = ipw_get_fw(priv, &ucode, + IPW_FW_NAME("sniffer_ucode")); + if (rc) + goto error; + + rc = ipw_get_fw(priv, &firmware, + IPW_FW_NAME("sniffer")); + break; #endif - rc = ipw_get_fw(priv, &raw, name); - if (rc < 0) + case IW_MODE_INFRA: + rc = ipw_get_fw(priv, &ucode, IPW_FW_NAME("bss_ucode")); + if (rc) + goto error; + + rc = ipw_get_fw(priv, &firmware, IPW_FW_NAME("bss")); + break; + + default: + rc = -EINVAL; + } + + if (rc) goto error; + #ifdef CONFIG_PM + fw_loaded = 1; } #endif - fw = (void *)raw->data; - boot_img = &fw->data[0]; - 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; - if (!priv->rxq) priv->rxq = ipw_rx_queue_alloc(priv); else @@ -3417,7 +3279,7 @@ static int ipw_load(struct ipw_priv *priv) ipw_stop_nic(priv); rc = ipw_reset_nic(priv); - if (rc < 0) { + if (rc) { IPW_ERROR("Unable to reset NIC\n"); goto error; } @@ -3426,7 +3288,8 @@ 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, le32_to_cpu(fw->boot_size)); + rc = ipw_load_firmware(priv, bootfw->data + sizeof(struct fw_header), + bootfw->size - sizeof(struct fw_header)); if (rc < 0) { IPW_ERROR("Unable to load boot firmware: %d\n", rc); goto error; @@ -3435,7 +3298,7 @@ static int ipw_load(struct ipw_priv *priv) /* kick start the device */ ipw_start_nic(priv); - /* wait for the device to finish its initial startup sequence */ + /* wait for the device to finish it's initial startup sequence */ rc = ipw_poll_bit(priv, IPW_INTA_RW, IPW_INTA_BIT_FW_INITIALIZATION_DONE, 500); if (rc < 0) { @@ -3448,7 +3311,8 @@ 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, le32_to_cpu(fw->ucode_size)); + rc = ipw_load_ucode(priv, ucode->data + sizeof(struct fw_header), + ucode->size - sizeof(struct fw_header)); if (rc < 0) { IPW_ERROR("Unable to load ucode: %d\n", rc); goto error; @@ -3458,19 +3322,18 @@ 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, le32_to_cpu(fw->fw_size)); + rc = ipw_load_firmware(priv, firmware->data + + sizeof(struct fw_header), + firmware->size - sizeof(struct fw_header)); if (rc < 0) { IPW_ERROR("Unable to load firmware: %d\n", rc); goto error; } -#ifdef CONFIG_PM - fw_loaded = 1; -#endif ipw_write32(priv, IPW_EEPROM_LOAD_DISABLE, 0); rc = ipw_queue_reset(priv); - if (rc < 0) { + if (rc) { IPW_ERROR("Unable to initialize queues\n"); goto error; } @@ -3499,7 +3362,7 @@ static int ipw_load(struct ipw_priv *priv) rc = ipw_poll_bit(priv, IPW_INTA_RW, IPW_INTA_BIT_FW_INITIALIZATION_DONE, 500); if (rc < 0) { - IPW_ERROR("device failed to start within 500ms\n"); + IPW_ERROR("device failed to start after 500ms\n"); goto error; } IPW_DEBUG_INFO("device response after %dms\n", rc); @@ -3523,7 +3386,9 @@ static int ipw_load(struct ipw_priv *priv) ipw_write32(priv, IPW_INTA_RW, IPW_INTA_MASK_ALL); #ifndef CONFIG_PM - release_firmware(raw); + release_firmware(bootfw); + release_firmware(ucode); + release_firmware(firmware); #endif return 0; @@ -3533,11 +3398,15 @@ static int ipw_load(struct ipw_priv *priv) priv->rxq = NULL; } ipw_tx_queue_free(priv); - if (raw) - release_firmware(raw); + if (bootfw) + release_firmware(bootfw); + if (ucode) + release_firmware(ucode); + if (firmware) + release_firmware(firmware); #ifdef CONFIG_PM fw_loaded = 0; - raw = NULL; + bootfw = ucode = firmware = NULL; #endif return rc; @@ -3846,25 +3715,15 @@ static int ipw_disassociate(void *data) static void ipw_bg_disassociate(void *data) { struct ipw_priv *priv = data; - mutex_lock(&priv->mutex); + down(&priv->sem); ipw_disassociate(data); - mutex_unlock(&priv->mutex); + up(&priv->sem); } static void ipw_system_config(void *data) { struct ipw_priv *priv = data; - -#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); + ipw_send_system_config(priv, &priv->sys_config); } struct ipw_status_code { @@ -3935,13 +3794,6 @@ 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]; @@ -3971,8 +3823,8 @@ static void ipw_reset_stats(struct ipw_priv *priv) priv->quality = 0; average_init(&priv->average_missed_beacons); - priv->exp_avg_rssi = -60; - priv->exp_avg_noise = -85 + 0x100; + average_init(&priv->average_rssi); + average_init(&priv->average_noise); priv->last_rate = 0; priv->last_missed_beacons = 0; @@ -4179,7 +4031,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 = priv->exp_avg_rssi; + rssi = average_value(&priv->average_rssi); signal_quality = (100 * (priv->ieee->perfect_rssi - priv->ieee->worst_rssi) * @@ -4225,9 +4077,9 @@ static void ipw_gather_stats(struct ipw_priv *priv) static void ipw_bg_gather_stats(void *data) { struct ipw_priv *priv = data; - mutex_lock(&priv->mutex); + down(&priv->sem); ipw_gather_stats(data); - mutex_unlock(&priv->mutex); + up(&priv->sem); } /* Missed beacon behavior: @@ -4269,9 +4121,8 @@ static void ipw_handle_missed_beacon(struct ipw_priv *priv, return; } - if (roaming && - (missed_count > priv->roaming_threshold && - missed_count <= priv->disassociate_threshold)) { + if (missed_count > priv->roaming_threshold && + missed_count <= priv->disassociate_threshold) { /* If we are not already roaming, set the ROAM * bit in the status and kick off a scan. * This can happen several times before we reach @@ -4299,6 +4150,7 @@ static void ipw_handle_missed_beacon(struct ipw_priv *priv, } IPW_DEBUG_NOTIF("Missed beacon: %d\n", missed_count); + } /** @@ -4356,7 +4208,7 @@ static void ipw_rx_notification(struct ipw_priv *priv, queue_work(priv->workqueue, &priv->system_config); -#ifdef CONFIG_IPW2200_QOS +#ifdef CONFIG_IPW_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) && @@ -4653,24 +4505,6 @@ 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; } @@ -4693,9 +4527,10 @@ static void ipw_rx_notification(struct ipw_priv *priv, if (notif->size == sizeof(*x)) { IPW_DEBUG(IPW_DL_NOTIF | IPW_DL_STATE, - "link deterioration: type %d, cnt %d\n", - x->silence_notification_type, - x->silence_count); + "link deterioration: '%s' " MAC_FMT + " \n", escape_essid(priv->essid, + priv->essid_len), + MAC_ARG(priv->bssid)); memcpy(&priv->last_link_deterioration, x, sizeof(*x)); } else { @@ -4766,10 +4601,11 @@ static void ipw_rx_notification(struct ipw_priv *priv, case HOST_NOTIFICATION_NOISE_STATS:{ if (notif->size == sizeof(u32)) { - priv->exp_avg_noise = - exponential_average(priv->exp_avg_noise, - (u8) (le32_to_cpu(notif->u.noise.value) & 0xff), - DEPTH_NOISE); + priv->last_noise = + (u8) (le32_to_cpu(notif->u.noise.value) & + 0xff); + average_add(&priv->average_noise, + priv->last_noise); break; } @@ -5075,13 +4911,13 @@ static void ipw_rx_queue_replenish(void *data) static void ipw_bg_rx_queue_replenish(void *data) { struct ipw_priv *priv = data; - mutex_lock(&priv->mutex); + down(&priv->sem); ipw_rx_queue_replenish(data); - mutex_unlock(&priv->mutex); + up(&priv->sem); } /* Assumes that the skb field of the buffers in 'pool' is kept accurate. - * If an SKB has been detached, the POOL needs to have its SKB set to NULL + * If an SKB has been detached, the POOL needs to have it's SKB set to NULL * This free routine walks the list of POOL entries and if SKB is set to * non NULL it is unmapped and freed */ @@ -5421,11 +5257,10 @@ static int ipw_find_adhoc_network(struct ipw_priv *priv, if (priv->ieee->scan_age != 0 && time_after(jiffies, network->last_scanned + priv->ieee->scan_age)) { IPW_DEBUG_MERGE("Network '%s (" MAC_FMT ")' excluded " - "because of age: %ums.\n", + "because of age: %lums.\n", escape_essid(network->ssid, network->ssid_len), MAC_ARG(network->bssid), - jiffies_to_msecs(jiffies - - network->last_scanned)); + 1000 * (jiffies - network->last_scanned) / HZ); return 0; } @@ -5534,7 +5369,7 @@ static void ipw_merge_adhoc_network(void *data) return; } - mutex_lock(&priv->mutex); + down(&priv->sem); if ((priv->ieee->iw_mode == IW_MODE_ADHOC)) { IPW_DEBUG_MERGE("remove network %s\n", escape_essid(priv->essid, @@ -5544,7 +5379,7 @@ static void ipw_merge_adhoc_network(void *data) ipw_disassociate(priv); priv->assoc_network = match.network; - mutex_unlock(&priv->mutex); + up(&priv->sem); return; } } @@ -5632,12 +5467,11 @@ static int ipw_best_network(struct ipw_priv *priv, if (network->last_associate && time_after(network->last_associate + (HZ * 3UL), jiffies)) { IPW_DEBUG_ASSOC("Network '%s (" MAC_FMT ")' excluded " - "because of storming (%ums since last " + "because of storming (%lus since last " "assoc attempt).\n", escape_essid(network->ssid, network->ssid_len), MAC_ARG(network->bssid), - jiffies_to_msecs(jiffies - - network->last_associate)); + (jiffies - network->last_associate) / HZ); return 0; } @@ -5645,11 +5479,10 @@ static int ipw_best_network(struct ipw_priv *priv, if (priv->ieee->scan_age != 0 && time_after(jiffies, network->last_scanned + priv->ieee->scan_age)) { IPW_DEBUG_ASSOC("Network '%s (" MAC_FMT ")' excluded " - "because of age: %ums.\n", + "because of age: %lums.\n", escape_essid(network->ssid, network->ssid_len), MAC_ARG(network->bssid), - jiffies_to_msecs(jiffies - - network->last_scanned)); + 1000 * (jiffies - network->last_scanned) / HZ); return 0; } @@ -5677,10 +5510,19 @@ static int ipw_best_network(struct ipw_priv *priv, return 0; } - if ((priv->config & CFG_STATIC_BSSID) && - memcmp(network->bssid, priv->bssid, ETH_ALEN)) { + if (!priv->ieee->wpa_enabled && (network->wpa_ie_len > 0 || + network->rsn_ie_len > 0)) { IPW_DEBUG_ASSOC("Network '%s (" MAC_FMT ")' excluded " - "because of BSSID mismatch: " MAC_FMT ".\n", + "because of WPA capability mismatch.\n", + escape_essid(network->ssid, network->ssid_len), + MAC_ARG(network->bssid)); + return 0; + } + + if ((priv->config & CFG_STATIC_BSSID) && + memcmp(network->bssid, priv->bssid, ETH_ALEN)) { + IPW_DEBUG_ASSOC("Network '%s (" MAC_FMT ")' excluded " + "because of BSSID mismatch: " MAC_FMT ".\n", escape_essid(network->ssid, network->ssid_len), MAC_ARG(network->bssid), MAC_ARG(priv->bssid)); return 0; @@ -5697,7 +5539,7 @@ static int ipw_best_network(struct ipw_priv *priv, } /* Filter out invalid channel in current GEO */ - if (!ieee80211_is_valid_channel(priv->ieee, network->channel)) { + if (!ipw_is_valid_channel(priv->ieee, network->channel)) { IPW_DEBUG_ASSOC("Network '%s (" MAC_FMT ")' excluded " "because of invalid channel in current GEO\n", escape_essid(network->ssid, network->ssid_len), @@ -5742,7 +5584,7 @@ static int ipw_best_network(struct ipw_priv *priv, static void ipw_adhoc_create(struct ipw_priv *priv, struct ieee80211_network *network) { - const struct ieee80211_geo *geo = ieee80211_get_geo(priv->ieee); + const struct ieee80211_geo *geo = ipw_get_geo(priv->ieee); int i; /* @@ -5757,11 +5599,12 @@ static void ipw_adhoc_create(struct ipw_priv *priv, * FW fatal error. * */ - switch (ieee80211_is_valid_channel(priv->ieee, priv->channel)) { + switch (ipw_is_valid_channel(priv->ieee, priv->channel)) { case IEEE80211_52GHZ_BAND: network->mode = IEEE_A; - i = ieee80211_channel_to_index(priv->ieee, priv->channel); - BUG_ON(i == -1); + i = ipw_channel_to_index(priv->ieee, priv->channel); + if (i == -1) + BUG(); if (geo->a[i].flags & IEEE80211_CH_PASSIVE_ONLY) { IPW_WARNING("Overriding invalid channel\n"); priv->channel = geo->a[0].channel; @@ -5773,8 +5616,9 @@ static void ipw_adhoc_create(struct ipw_priv *priv, network->mode = IEEE_G; else network->mode = IEEE_B; - i = ieee80211_channel_to_index(priv->ieee, priv->channel); - BUG_ON(i == -1); + i = ipw_channel_to_index(priv->ieee, priv->channel); + if (i == -1) + BUG(); if (geo->bg[i].flags & IEEE80211_CH_PASSIVE_ONLY) { IPW_WARNING("Overriding invalid channel\n"); priv->channel = geo->bg[0].channel; @@ -5827,44 +5671,54 @@ static void ipw_adhoc_create(struct ipw_priv *priv, static void ipw_send_tgi_tx_key(struct ipw_priv *priv, int type, int index) { - struct ipw_tgi_tx_key key; + struct ipw_tgi_tx_key *key; + struct host_cmd cmd = { + .cmd = IPW_CMD_TGI_TX_KEY, + .len = sizeof(*key) + }; if (!(priv->ieee->sec.flags & (1 << index))) return; - key.key_id = index; - memcpy(key.key, priv->ieee->sec.keys[index], SCM_TEMPORAL_KEY_LENGTH); - key.security_type = type; - key.station_index = 0; /* always 0 for BSS */ - key.flags = 0; + key = (struct ipw_tgi_tx_key *)&cmd.param; + key->key_id = index; + memcpy(key->key, priv->ieee->sec.keys[index], SCM_TEMPORAL_KEY_LENGTH); + key->security_type = type; + key->station_index = 0; /* always 0 for BSS */ + key->flags = 0; /* 0 for new key; previous value of counter (after fatal error) */ - key.tx_counter[0] = 0; - key.tx_counter[1] = 0; + key->tx_counter[0] = 0; + key->tx_counter[1] = 0; - ipw_send_cmd_pdu(priv, IPW_CMD_TGI_TX_KEY, sizeof(key), &key); + ipw_send_cmd(priv, &cmd); } static void ipw_send_wep_keys(struct ipw_priv *priv, int type) { - struct ipw_wep_key key; + struct ipw_wep_key *key; int i; + struct host_cmd cmd = { + .cmd = IPW_CMD_WEP_KEY, + .len = sizeof(*key) + }; - key.cmd_id = DINO_CMD_WEP_KEY; - key.seq_num = 0; + key = (struct ipw_wep_key *)&cmd.param; + key->cmd_id = DINO_CMD_WEP_KEY; + key->seq_num = 0; /* Note: AES keys cannot be set for multiple times. * Only set it at the first time. */ for (i = 0; i < 4; i++) { - key.key_index = i | type; + key->key_index = i | type; if (!(priv->ieee->sec.flags & (1 << i))) { - key.key_size = 0; + key->key_size = 0; continue; } - key.key_size = priv->ieee->sec.key_sizes[i]; - memcpy(key.key, priv->ieee->sec.keys[i], key.key_size); + key->key_size = priv->ieee->sec.key_sizes[i]; + memcpy(key->key, priv->ieee->sec.keys[i], key->key_size); - ipw_send_cmd_pdu(priv, IPW_CMD_WEP_KEY, sizeof(key), &key); + ipw_send_cmd(priv, &cmd); } } @@ -5968,9 +5822,9 @@ static void ipw_adhoc_check(void *data) static void ipw_bg_adhoc_check(void *data) { struct ipw_priv *priv = data; - mutex_lock(&priv->mutex); + down(&priv->sem); ipw_adhoc_check(data); - mutex_unlock(&priv->mutex); + up(&priv->sem); } #ifdef CONFIG_IPW2200_DEBUG @@ -6096,7 +5950,7 @@ static void ipw_add_scan_channels(struct ipw_priv *priv, const struct ieee80211_geo *geo; int i; - geo = ieee80211_get_geo(priv->ieee); + geo = ipw_get_geo(priv->ieee); if (priv->ieee->freq_band & IEEE80211_52GHZ_BAND) { int start = channel_index; @@ -6156,7 +6010,7 @@ static void ipw_add_scan_channels(struct ipw_priv *priv, channel_index++; scan->channels_list[channel_index] = channel; index = - ieee80211_channel_to_index(priv->ieee, channel); + ipw_channel_to_index(priv->ieee, channel); ipw_set_scan_type(scan, channel_index, geo->bg[index]. flags & @@ -6197,7 +6051,7 @@ static int ipw_request_scan(struct ipw_priv *priv) (priv->status & STATUS_EXIT_PENDING)) return 0; - mutex_lock(&priv->mutex); + down(&priv->sem); if (priv->status & STATUS_SCANNING) { IPW_DEBUG_HC("Concurrent scan requested. Ignoring.\n"); @@ -6238,7 +6092,7 @@ static int ipw_request_scan(struct ipw_priv *priv) u8 channel; u8 band = 0; - switch (ieee80211_is_valid_channel(priv->ieee, priv->channel)) { + switch (ipw_is_valid_channel(priv->ieee, priv->channel)) { case IEEE80211_52GHZ_BAND: band = (u8) (IPW_A_MODE << 6) | 1; channel = priv->channel; @@ -6305,16 +6159,16 @@ static int ipw_request_scan(struct ipw_priv *priv) queue_delayed_work(priv->workqueue, &priv->scan_check, IPW_SCAN_CHECK_WATCHDOG); done: - mutex_unlock(&priv->mutex); + up(&priv->sem); return err; } static void ipw_bg_abort_scan(void *data) { struct ipw_priv *priv = data; - mutex_lock(&priv->mutex); + down(&priv->sem); ipw_abort_scan(data); - mutex_unlock(&priv->mutex); + up(&priv->sem); } static int ipw_wpa_enable(struct ipw_priv *priv, int value) @@ -6339,9 +6193,6 @@ static int ipw_wpa_set_auth_algs(struct ipw_priv *priv, int value) } else if (value & IW_AUTH_ALG_OPEN_SYSTEM) { sec.auth_mode = WLAN_AUTH_OPEN; ieee->open_wep = 1; - } else if (value & IW_AUTH_ALG_LEAP) { - sec.auth_mode = WLAN_AUTH_LEAP; - ieee->open_wep = 1; } else return -EINVAL; @@ -6353,20 +6204,26 @@ static int ipw_wpa_set_auth_algs(struct ipw_priv *priv, int value) return ret; } -static void ipw_wpa_assoc_frame(struct ipw_priv *priv, char *wpa_ie, - int wpa_ie_len) +void ipw_wpa_assoc_frame(struct ipw_priv *priv, char *wpa_ie, int wpa_ie_len) { /* make sure WPA is enabled */ ipw_wpa_enable(priv, 1); + + ipw_disassociate(priv); } static int ipw_set_rsn_capa(struct ipw_priv *priv, char *capabilities, int length) { + struct host_cmd cmd = { + .cmd = IPW_CMD_RSN_CAPABILITIES, + .len = length, + }; + IPW_DEBUG_HC("HOST_CMD_RSN_CAPABILITIES\n"); - return ipw_send_cmd_pdu(priv, IPW_CMD_RSN_CAPABILITIES, length, - capabilities); + memcpy(cmd.param, capabilities, length); + return ipw_send_cmd(priv, &cmd); } /* @@ -6387,7 +6244,7 @@ static int ipw_wx_set_genie(struct net_device *dev, (wrqu->data.length && extra == NULL)) return -EINVAL; - //mutex_lock(&priv->mutex); + //down(&priv->sem); //if (!ieee->wpa_enabled) { // err = -EOPNOTSUPP; @@ -6413,7 +6270,7 @@ static int ipw_wx_set_genie(struct net_device *dev, ipw_wpa_assoc_frame(priv, ieee->wpa_ie, ieee->wpa_ie_len); out: - //mutex_unlock(&priv->mutex); + //up(&priv->sem); return err; } @@ -6426,7 +6283,7 @@ static int ipw_wx_get_genie(struct net_device *dev, struct ieee80211_device *ieee = priv->ieee; int err = 0; - //mutex_lock(&priv->mutex); + //down(&priv->sem); //if (!ieee->wpa_enabled) { // err = -EOPNOTSUPP; @@ -6447,7 +6304,7 @@ static int ipw_wx_get_genie(struct net_device *dev, memcpy(extra, ieee->wpa_ie, ieee->wpa_ie_len); out: - //mutex_unlock(&priv->mutex); + //up(&priv->sem); return err; } @@ -6551,7 +6408,6 @@ 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: @@ -6693,14 +6549,14 @@ static int ipw_wx_set_mlme(struct net_device *dev, return 0; } -#ifdef CONFIG_IPW2200_QOS +#ifdef CONFIG_IPW_QOS /* QoS */ /* * get the modulation type of the current network or * the card current mode */ -static u8 ipw_qos_current_mode(struct ipw_priv * priv) +u8 ipw_qos_current_mode(struct ipw_priv * priv) { u8 mode = 0; @@ -6900,7 +6756,8 @@ static int ipw_qos_association(struct ipw_priv *priv, switch (priv->ieee->iw_mode) { case IW_MODE_ADHOC: - BUG_ON(!(network->capability & WLAN_CAPABILITY_IBSS)); + if (!(network->capability & WLAN_CAPABILITY_IBSS)) + BUG(); qos_data = &ibss_data; break; @@ -7040,55 +6897,61 @@ static int ipw_get_tx_queue_number(struct ipw_priv *priv, u16 priority) return from_priority_to_tx_queue[priority] - 1; } -static int ipw_is_qos_active(struct net_device *dev, - struct sk_buff *skb) +/* +* 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) { - struct ipw_priv *priv = ieee80211_priv(dev); + int ret = 0; + int tx_queue_id = 0; struct ieee80211_qos_data *qos_data = NULL; int active, supported; - u8 *daddr = skb->data + ETH_ALEN; - int unicast = !is_multicast_ether_addr(daddr); + unsigned long flags; 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) - return 1; - - 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; + 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; + } + } } - return 0; + + return ret; } /* @@ -7101,12 +6964,12 @@ static void ipw_bg_qos_activate(void *data) if (priv == NULL) return; - mutex_lock(&priv->mutex); + down(&priv->sem); if (priv->status & STATUS_ASSOCIATED) ipw_qos_activate(priv, &(priv->assoc_network->qos_data)); - mutex_unlock(&priv->mutex); + up(&priv->sem); } static int ipw_handle_probe_response(struct net_device *dev, @@ -7147,18 +7010,28 @@ static int ipw_handle_assoc_response(struct net_device *dev, static int ipw_send_qos_params_command(struct ipw_priv *priv, struct ieee80211_qos_parameters *qos_param) { - return ipw_send_cmd_pdu(priv, IPW_CMD_QOS_PARAMETERS, - sizeof(*qos_param) * 3, qos_param); + struct host_cmd cmd = { + .cmd = IPW_CMD_QOS_PARAMETERS, + .len = (sizeof(struct ieee80211_qos_parameters) * 3) + }; + + memcpy(cmd.param, qos_param, sizeof(*qos_param) * 3); + return ipw_send_cmd(priv, &cmd); } static int ipw_send_qos_info_command(struct ipw_priv *priv, struct ieee80211_qos_information_element *qos_param) { - return ipw_send_cmd_pdu(priv, IPW_CMD_WME_INFO, sizeof(*qos_param), - qos_param); + struct host_cmd cmd = { + .cmd = IPW_CMD_WME_INFO, + .len = sizeof(*qos_param) + }; + + memcpy(cmd.param, qos_param, sizeof(*qos_param)); + return ipw_send_cmd(priv, &cmd); } -#endif /* CONFIG_IPW2200_QOS */ +#endif /* CONFIG_IPW_QOS */ static int ipw_associate_network(struct ipw_priv *priv, struct ieee80211_network *network, @@ -7179,21 +7052,19 @@ static int ipw_associate_network(struct ipw_priv *priv, memset(&priv->assoc_request, 0, sizeof(priv->assoc_request)); priv->assoc_request.channel = network->channel; - priv->assoc_request.auth_key = 0; - if ((priv->capability & CAP_PRIVACY_ON) && - (priv->ieee->sec.auth_mode == WLAN_AUTH_SHARED_KEY)) { + (priv->capability & CAP_SHARED_KEY)) { priv->assoc_request.auth_type = AUTH_SHARED_KEY; priv->assoc_request.auth_key = priv->ieee->sec.active_key; - if (priv->ieee->sec.level == SEC_LEVEL_1) + if ((priv->capability & CAP_PRIVACY_ON) && + (priv->ieee->sec.level == SEC_LEVEL_1) && + !(priv->ieee->host_encrypt || priv->ieee->host_decrypt)) ipw_send_wep_keys(priv, DCW_WEP_KEY_SEC_TYPE_WEP); - - } else if ((priv->capability & CAP_PRIVACY_ON) && - (priv->ieee->sec.auth_mode == WLAN_AUTH_LEAP)) - priv->assoc_request.auth_type = AUTH_LEAP; - else + } else { priv->assoc_request.auth_type = AUTH_OPEN; + priv->assoc_request.auth_key = 0; + } if (priv->ieee->wpa_ie_len) { priv->assoc_request.policy_support = 0x02; /* RSN active */ @@ -7297,7 +7168,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); + err = ipw_send_system_config(priv, &priv->sys_config); if (err) { IPW_DEBUG_HC("Attempt to send sys config command failed.\n"); return err; @@ -7322,7 +7193,7 @@ static int ipw_associate_network(struct ipw_priv *priv, priv->assoc_network = network; -#ifdef CONFIG_IPW2200_QOS +#ifdef CONFIG_IPW_QOS ipw_qos_association(priv, network); #endif @@ -7407,9 +7278,9 @@ static void ipw_roam(void *data) static void ipw_bg_roam(void *data) { struct ipw_priv *priv = data; - mutex_lock(&priv->mutex); + down(&priv->sem); ipw_roam(data); - mutex_unlock(&priv->mutex); + up(&priv->sem); } static int ipw_associate(void *data) @@ -7504,9 +7375,9 @@ static int ipw_associate(void *data) static void ipw_bg_associate(void *data) { struct ipw_priv *priv = data; - mutex_lock(&priv->mutex); + down(&priv->sem); ipw_associate(data); - mutex_unlock(&priv->mutex); + up(&priv->sem); } static void ipw_rebuild_decrypted_skb(struct ipw_priv *priv, @@ -7596,7 +7467,7 @@ static void ipw_handle_data_packet(struct ipw_priv *priv, } } -#ifdef CONFIG_IPW2200_RADIOTAP +#ifdef CONFIG_IEEE80211_RADIOTAP static void ipw_handle_data_packet_monitor(struct ipw_priv *priv, struct ipw_rx_mem_buffer *rxb, struct ieee80211_rx_stats *stats) @@ -7613,7 +7484,15 @@ 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 *ipw_rt; + 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; short len = le16_to_cpu(pkt->u.frame.length); @@ -7667,11 +7546,9 @@ 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 */ @@ -7757,217 +7634,6 @@ 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) { @@ -8145,10 +7811,12 @@ static void ipw_rx(struct ipw_priv *priv) while (i != r) { rxb = priv->rxq->queue[i]; +#ifdef CONFIG_IPW2200_DEBUG if (unlikely(rxb == NULL)) { printk(KERN_CRIT "Queue not allocated!\n"); break; } +#endif priv->rxq->queue[i] = NULL; pci_dma_sync_single_for_cpu(priv->pci_dev, rxb->dma_addr, @@ -8167,8 +7835,7 @@ static void ipw_rx(struct ipw_priv *priv) le16_to_cpu(pkt->u.frame.rssi_dbm) - IPW_RSSI_TO_DBM, .signal = - le16_to_cpu(pkt->u.frame.rssi_dbm) - - IPW_RSSI_TO_DBM + 0x100, + le16_to_cpu(pkt->u.frame.signal), .noise = le16_to_cpu(pkt->u.frame.noise), .rate = pkt->u.frame.rate, @@ -8194,21 +7861,15 @@ 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_IPW2200_RADIOTAP - - ipw_handle_data_packet_monitor(priv, - rxb, - &stats); +#ifdef CONFIG_IEEE80211_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; } @@ -8229,17 +7890,16 @@ static void ipw_rx(struct ipw_priv *priv) if (network_packet && priv->assoc_network) { priv->assoc_network->stats.rssi = stats.rssi; - priv->exp_avg_rssi = - exponential_average(priv->exp_avg_rssi, - stats.rssi, DEPTH_RSSI); + average_add(&priv->average_rssi, + stats.rssi); + priv->last_rx_rssi = stats.rssi; } IPW_DEBUG_RX("Frame: len=%u\n", le16_to_cpu(pkt->u.frame.length)); if (le16_to_cpu(pkt->u.frame.length) < - ieee80211_get_hdrlen(le16_to_cpu( - header->frame_ctl))) { + frame_hdr_len(header)) { IPW_DEBUG_DROP ("Received packet is too small. " "Dropping.\n"); @@ -8329,14 +7989,7 @@ static void ipw_rx(struct ipw_priv *priv) #define DEFAULT_SHORT_RETRY_LIMIT 7U #define DEFAULT_LONG_RETRY_LIMIT 4U -/** - * ipw_sw_reset - * @option: options to control different reset behaviour - * 0 = reset everything except the 'disable' module_param - * 1 = reset everything and print out driver info (for probe only) - * 2 = reset everything - */ -static int ipw_sw_reset(struct ipw_priv *priv, int option) +static int ipw_sw_reset(struct ipw_priv *priv, int init) { int band, modulation; int old_mode = priv->ieee->iw_mode; @@ -8363,7 +8016,7 @@ static int ipw_sw_reset(struct ipw_priv *priv, int option) priv->essid_len = 0; memset(priv->essid, 0, IW_ESSID_MAX_SIZE); - if (disable && option) { + if (disable) { priv->status |= STATUS_RF_KILL_SW; IPW_DEBUG_INFO("Radio disabled.\n"); } @@ -8374,10 +8027,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_IPW2200_QOS +#ifdef CONFIG_IPW_QOS ipw_qos_init(priv, qos_enable, qos_burst_enable, burst_duration_CCK, burst_duration_OFDM); -#endif /* CONFIG_IPW2200_QOS */ +#endif /* CONFIG_IPW_QOS */ switch (mode) { case 1: @@ -8388,7 +8041,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_IPW2200_RADIOTAP +#ifdef CONFIG_IEEE80211_RADIOTAP priv->net_dev->type = ARPHRD_IEEE80211_RADIOTAP; #else priv->net_dev->type = ARPHRD_IEEE80211; @@ -8415,7 +8068,7 @@ static int ipw_sw_reset(struct ipw_priv *priv, int option) if ((priv->pci_dev->device == 0x4223) || (priv->pci_dev->device == 0x4224)) { - if (option == 1) + if (init) printk(KERN_INFO DRV_NAME ": Detected Intel PRO/Wireless 2915ABG Network " "Connection\n"); @@ -8426,7 +8079,7 @@ static int ipw_sw_reset(struct ipw_priv *priv, int option) priv->adapter = IPW_2915ABG; priv->ieee->mode = IEEE_A | IEEE_G | IEEE_B; } else { - if (option == 1) + if (init) printk(KERN_INFO DRV_NAME ": Detected Intel PRO/Wireless 2200BG Network " "Connection\n"); @@ -8473,7 +8126,7 @@ static int ipw_wx_get_name(struct net_device *dev, union iwreq_data *wrqu, char *extra) { struct ipw_priv *priv = ieee80211_priv(dev); - mutex_lock(&priv->mutex); + down(&priv->sem); if (priv->status & STATUS_RF_KILL_MASK) strcpy(wrqu->name, "radio off"); else if (!(priv->status & STATUS_ASSOCIATED)) @@ -8482,7 +8135,7 @@ static int ipw_wx_get_name(struct net_device *dev, snprintf(wrqu->name, IFNAMSIZ, "IEEE 802.11%c", ipw_modes[priv->assoc_request.ieee_mode]); IPW_DEBUG_WX("Name: %s\n", wrqu->name); - mutex_unlock(&priv->mutex); + up(&priv->sem); return 0; } @@ -8543,7 +8196,7 @@ static int ipw_wx_set_freq(struct net_device *dev, union iwreq_data *wrqu, char *extra) { struct ipw_priv *priv = ieee80211_priv(dev); - const struct ieee80211_geo *geo = ieee80211_get_geo(priv->ieee); + const struct ieee80211_geo *geo = ipw_get_geo(priv->ieee); struct iw_freq *fwrq = &wrqu->freq; int ret = 0, i; u8 channel, flags; @@ -8551,24 +8204,24 @@ static int ipw_wx_set_freq(struct net_device *dev, if (fwrq->m == 0) { IPW_DEBUG_WX("SET Freq/Channel -> any\n"); - mutex_lock(&priv->mutex); + down(&priv->sem); ret = ipw_set_channel(priv, 0); - mutex_unlock(&priv->mutex); + up(&priv->sem); return ret; } /* if setting by freq convert to channel */ if (fwrq->e == 1) { - channel = ieee80211_freq_to_channel(priv->ieee, fwrq->m); + channel = ipw_freq_to_channel(priv->ieee, fwrq->m); if (channel == 0) return -EINVAL; } else channel = fwrq->m; - if (!(band = ieee80211_is_valid_channel(priv->ieee, channel))) + if (!(band = ipw_is_valid_channel(priv->ieee, channel))) return -EINVAL; if (priv->ieee->iw_mode == IW_MODE_ADHOC) { - i = ieee80211_channel_to_index(priv->ieee, channel); + i = ipw_channel_to_index(priv->ieee, channel); if (i == -1) return -EINVAL; @@ -8581,9 +8234,9 @@ static int ipw_wx_set_freq(struct net_device *dev, } IPW_DEBUG_WX("SET Freq/Channel -> %d \n", fwrq->m); - mutex_lock(&priv->mutex); + down(&priv->sem); ret = ipw_set_channel(priv, channel); - mutex_unlock(&priv->mutex); + up(&priv->sem); return ret; } @@ -8597,14 +8250,14 @@ static int ipw_wx_get_freq(struct net_device *dev, /* If we are associated, trying to associate, or have a statically * configured CHANNEL then return that; otherwise return ANY */ - mutex_lock(&priv->mutex); + down(&priv->sem); if (priv->config & CFG_STATIC_CHANNEL || priv->status & (STATUS_ASSOCIATING | STATUS_ASSOCIATED)) wrqu->freq.m = priv->channel; else wrqu->freq.m = 0; - mutex_unlock(&priv->mutex); + up(&priv->sem); IPW_DEBUG_WX("GET Freq/Channel -> %d \n", priv->channel); return 0; } @@ -8634,7 +8287,7 @@ static int ipw_wx_set_mode(struct net_device *dev, if (wrqu->mode == priv->ieee->iw_mode) return 0; - mutex_lock(&priv->mutex); + down(&priv->sem); ipw_sw_reset(priv, 0); @@ -8643,7 +8296,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_IPW2200_RADIOTAP +#ifdef CONFIG_IEEE80211_RADIOTAP priv->net_dev->type = ARPHRD_IEEE80211_RADIOTAP; #else priv->net_dev->type = ARPHRD_IEEE80211; @@ -8657,7 +8310,7 @@ static int ipw_wx_set_mode(struct net_device *dev, priv->ieee->iw_mode = wrqu->mode; queue_work(priv->workqueue, &priv->adapter_restart); - mutex_unlock(&priv->mutex); + up(&priv->sem); return err; } @@ -8666,10 +8319,10 @@ static int ipw_wx_get_mode(struct net_device *dev, union iwreq_data *wrqu, char *extra) { struct ipw_priv *priv = ieee80211_priv(dev); - mutex_lock(&priv->mutex); + down(&priv->sem); wrqu->mode = priv->ieee->iw_mode; IPW_DEBUG_WX("Get MODE -> %d\n", wrqu->mode); - mutex_unlock(&priv->mutex); + up(&priv->sem); return 0; } @@ -8696,7 +8349,7 @@ static int ipw_wx_get_range(struct net_device *dev, { struct ipw_priv *priv = ieee80211_priv(dev); struct iw_range *range = (struct iw_range *)extra; - const struct ieee80211_geo *geo = ieee80211_get_geo(priv->ieee); + const struct ieee80211_geo *geo = ipw_get_geo(priv->ieee); int i = 0, j; wrqu->data.length = sizeof(*range); @@ -8708,7 +8361,7 @@ static int ipw_wx_get_range(struct net_device *dev, range->max_qual.qual = 100; /* TODO: Find real max RSSI and stick here */ range->max_qual.level = 0; - range->max_qual.noise = 0; + range->max_qual.noise = priv->ieee->worst_rssi + 0x100; range->max_qual.updated = 7; /* Updated all three */ range->avg_qual.qual = 70; @@ -8716,7 +8369,7 @@ static int ipw_wx_get_range(struct net_device *dev, range->avg_qual.level = 0; /* FIXME to real average level */ range->avg_qual.noise = 0; range->avg_qual.updated = 7; /* Updated all three */ - mutex_lock(&priv->mutex); + down(&priv->sem); range->num_bitrates = min(priv->rates.num_rates, (u8) IW_MAX_BITRATES); for (i = 0; i < range->num_bitrates; i++) @@ -8734,7 +8387,7 @@ static int ipw_wx_get_range(struct net_device *dev, /* Set the Wireless Extension versions */ range->we_version_compiled = WIRELESS_EXT; - range->we_version_source = 18; + range->we_version_source = 16; i = 0; if (priv->ieee->mode & (IEEE_B | IEEE_G)) { @@ -8766,18 +8419,14 @@ static int ipw_wx_get_range(struct net_device *dev, range->num_channels = i; range->num_frequency = i; - mutex_unlock(&priv->mutex); + up(&priv->sem); /* 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(SIOCGIWSCAN)); + IW_EVENT_CAPA_MASK(SIOCGIWAP)); range->event_capa[1] = IW_EVENT_CAPA_K_1; - range->enc_capa = IW_ENC_CAPA_WPA | IW_ENC_CAPA_WPA2 | - IW_ENC_CAPA_CIPHER_TKIP | IW_ENC_CAPA_CIPHER_CCMP; - IPW_DEBUG_WX("GET Range\n"); return 0; } @@ -8797,7 +8446,7 @@ static int ipw_wx_set_wap(struct net_device *dev, if (wrqu->ap_addr.sa_family != ARPHRD_ETHER) return -EINVAL; - mutex_lock(&priv->mutex); + down(&priv->sem); if (!memcmp(any, wrqu->ap_addr.sa_data, ETH_ALEN) || !memcmp(off, wrqu->ap_addr.sa_data, ETH_ALEN)) { /* we disable mandatory BSSID association */ @@ -8806,14 +8455,14 @@ static int ipw_wx_set_wap(struct net_device *dev, IPW_DEBUG_ASSOC("Attempting to associate with new " "parameters.\n"); ipw_associate(priv); - mutex_unlock(&priv->mutex); + up(&priv->sem); return 0; } priv->config |= CFG_STATIC_BSSID; if (!memcmp(priv->bssid, wrqu->ap_addr.sa_data, ETH_ALEN)) { IPW_DEBUG_WX("BSSID set to current BSSID.\n"); - mutex_unlock(&priv->mutex); + up(&priv->sem); return 0; } @@ -8827,7 +8476,7 @@ static int ipw_wx_set_wap(struct net_device *dev, if (!ipw_disassociate(priv)) ipw_associate(priv); - mutex_unlock(&priv->mutex); + up(&priv->sem); return 0; } @@ -8838,7 +8487,7 @@ static int ipw_wx_get_wap(struct net_device *dev, struct ipw_priv *priv = ieee80211_priv(dev); /* If we are associated, trying to associate, or have a statically * configured BSSID then return that; otherwise return ANY */ - mutex_lock(&priv->mutex); + down(&priv->sem); if (priv->config & CFG_STATIC_BSSID || priv->status & (STATUS_ASSOCIATED | STATUS_ASSOCIATING)) { wrqu->ap_addr.sa_family = ARPHRD_ETHER; @@ -8848,7 +8497,7 @@ static int ipw_wx_get_wap(struct net_device *dev, IPW_DEBUG_WX("Getting WAP BSSID: " MAC_FMT "\n", MAC_ARG(wrqu->ap_addr.sa_data)); - mutex_unlock(&priv->mutex); + up(&priv->sem); return 0; } @@ -8859,7 +8508,7 @@ static int ipw_wx_set_essid(struct net_device *dev, struct ipw_priv *priv = ieee80211_priv(dev); char *essid = ""; /* ANY */ int length = 0; - mutex_lock(&priv->mutex); + down(&priv->sem); if (wrqu->essid.flags && wrqu->essid.length) { length = wrqu->essid.length - 1; essid = extra; @@ -8874,7 +8523,7 @@ static int ipw_wx_set_essid(struct net_device *dev, priv->config &= ~CFG_STATIC_ESSID; ipw_associate(priv); } - mutex_unlock(&priv->mutex); + up(&priv->sem); return 0; } @@ -8884,7 +8533,7 @@ static int ipw_wx_set_essid(struct net_device *dev, if (priv->essid_len == length && !memcmp(priv->essid, extra, length)) { IPW_DEBUG_WX("ESSID set to current ESSID.\n"); - mutex_unlock(&priv->mutex); + up(&priv->sem); return 0; } @@ -8899,7 +8548,7 @@ static int ipw_wx_set_essid(struct net_device *dev, if (!ipw_disassociate(priv)) ipw_associate(priv); - mutex_unlock(&priv->mutex); + up(&priv->sem); return 0; } @@ -8911,7 +8560,7 @@ static int ipw_wx_get_essid(struct net_device *dev, /* If we are associated, trying to associate, or have a statically * configured ESSID then return that; otherwise return ANY */ - mutex_lock(&priv->mutex); + down(&priv->sem); if (priv->config & CFG_STATIC_ESSID || priv->status & (STATUS_ASSOCIATED | STATUS_ASSOCIATING)) { IPW_DEBUG_WX("Getting essid: '%s'\n", @@ -8924,7 +8573,7 @@ static int ipw_wx_get_essid(struct net_device *dev, wrqu->essid.length = 0; wrqu->essid.flags = 0; /* active */ } - mutex_unlock(&priv->mutex); + up(&priv->sem); return 0; } @@ -8937,12 +8586,12 @@ static int ipw_wx_set_nick(struct net_device *dev, IPW_DEBUG_WX("Setting nick to '%s'\n", extra); if (wrqu->data.length > IW_ESSID_MAX_SIZE) return -E2BIG; - mutex_lock(&priv->mutex); + down(&priv->sem); wrqu->data.length = min((size_t) wrqu->data.length, sizeof(priv->nick)); memset(priv->nick, 0, sizeof(priv->nick)); memcpy(priv->nick, extra, wrqu->data.length); IPW_DEBUG_TRACE("<<\n"); - mutex_unlock(&priv->mutex); + up(&priv->sem); return 0; } @@ -8953,57 +8602,11 @@ static int ipw_wx_get_nick(struct net_device *dev, { struct ipw_priv *priv = ieee80211_priv(dev); IPW_DEBUG_WX("Getting nick\n"); - mutex_lock(&priv->mutex); + down(&priv->sem); wrqu->data.length = strlen(priv->nick) + 1; memcpy(extra, priv->nick, wrqu->data.length); wrqu->data.flags = 1; /* active */ - mutex_unlock(&priv->mutex); - return 0; -} - -static int ipw_wx_set_sens(struct net_device *dev, - struct iw_request_info *info, - union iwreq_data *wrqu, char *extra) -{ - struct ipw_priv *priv = ieee80211_priv(dev); - int err = 0; - - IPW_DEBUG_WX("Setting roaming threshold to %d\n", wrqu->sens.value); - IPW_DEBUG_WX("Setting disassociate threshold to %d\n", 3*wrqu->sens.value); - mutex_lock(&priv->mutex); - - if (wrqu->sens.fixed == 0) - { - priv->roaming_threshold = IPW_MB_ROAMING_THRESHOLD_DEFAULT; - priv->disassociate_threshold = IPW_MB_DISASSOCIATE_THRESHOLD_DEFAULT; - goto out; - } - if ((wrqu->sens.value > IPW_MB_ROAMING_THRESHOLD_MAX) || - (wrqu->sens.value < IPW_MB_ROAMING_THRESHOLD_MIN)) { - err = -EINVAL; - goto out; - } - - priv->roaming_threshold = wrqu->sens.value; - priv->disassociate_threshold = 3*wrqu->sens.value; - out: - mutex_unlock(&priv->mutex); - return err; -} - -static int ipw_wx_get_sens(struct net_device *dev, - struct iw_request_info *info, - union iwreq_data *wrqu, char *extra) -{ - struct ipw_priv *priv = ieee80211_priv(dev); - mutex_lock(&priv->mutex); - wrqu->sens.fixed = 1; - wrqu->sens.value = priv->roaming_threshold; - mutex_unlock(&priv->mutex); - - IPW_DEBUG_WX("GET roaming threshold -> %s %d \n", - wrqu->power.disabled ? "OFF" : "ON", wrqu->power.value); - + up(&priv->sem); return 0; } @@ -9096,7 +8699,7 @@ static int ipw_wx_set_rate(struct net_device *dev, apply: IPW_DEBUG_WX("Setting rate mask to 0x%08X [%s]\n", mask, fixed ? "fixed" : "sub-rates"); - mutex_lock(&priv->mutex); + down(&priv->sem); if (mask == IEEE80211_DEFAULT_RATES_MASK) { priv->config &= ~CFG_FIXED_RATE; ipw_set_fixed_rate(priv, priv->ieee->mode); @@ -9105,7 +8708,7 @@ static int ipw_wx_set_rate(struct net_device *dev, if (priv->rates_mask == mask) { IPW_DEBUG_WX("Mask set to current mask.\n"); - mutex_unlock(&priv->mutex); + up(&priv->sem); return 0; } @@ -9116,7 +8719,7 @@ static int ipw_wx_set_rate(struct net_device *dev, if (!ipw_disassociate(priv)) ipw_associate(priv); - mutex_unlock(&priv->mutex); + up(&priv->sem); return 0; } @@ -9125,10 +8728,9 @@ static int ipw_wx_get_rate(struct net_device *dev, union iwreq_data *wrqu, char *extra) { struct ipw_priv *priv = ieee80211_priv(dev); - mutex_lock(&priv->mutex); + down(&priv->sem); wrqu->bitrate.value = priv->last_rate; - wrqu->bitrate.fixed = (priv->config & CFG_FIXED_RATE) ? 1 : 0; - mutex_unlock(&priv->mutex); + up(&priv->sem); IPW_DEBUG_WX("GET Rate -> %d \n", wrqu->bitrate.value); return 0; } @@ -9138,20 +8740,20 @@ static int ipw_wx_set_rts(struct net_device *dev, union iwreq_data *wrqu, char *extra) { struct ipw_priv *priv = ieee80211_priv(dev); - mutex_lock(&priv->mutex); + down(&priv->sem); if (wrqu->rts.disabled) priv->rts_threshold = DEFAULT_RTS_THRESHOLD; else { if (wrqu->rts.value < MIN_RTS_THRESHOLD || wrqu->rts.value > MAX_RTS_THRESHOLD) { - mutex_unlock(&priv->mutex); + up(&priv->sem); return -EINVAL; } priv->rts_threshold = wrqu->rts.value; } ipw_send_rts_threshold(priv, priv->rts_threshold); - mutex_unlock(&priv->mutex); + up(&priv->sem); IPW_DEBUG_WX("SET RTS Threshold -> %d \n", priv->rts_threshold); return 0; } @@ -9161,11 +8763,11 @@ static int ipw_wx_get_rts(struct net_device *dev, union iwreq_data *wrqu, char *extra) { struct ipw_priv *priv = ieee80211_priv(dev); - mutex_lock(&priv->mutex); + down(&priv->sem); wrqu->rts.value = priv->rts_threshold; wrqu->rts.fixed = 0; /* no auto select */ wrqu->rts.disabled = (wrqu->rts.value == DEFAULT_RTS_THRESHOLD); - mutex_unlock(&priv->mutex); + up(&priv->sem); IPW_DEBUG_WX("GET RTS Threshold -> %d \n", wrqu->rts.value); return 0; } @@ -9177,7 +8779,7 @@ static int ipw_wx_set_txpow(struct net_device *dev, struct ipw_priv *priv = ieee80211_priv(dev); int err = 0; - mutex_lock(&priv->mutex); + down(&priv->sem); if (ipw_radio_kill_sw(priv, wrqu->power.disabled)) { err = -EINPROGRESS; goto out; @@ -9200,7 +8802,7 @@ static int ipw_wx_set_txpow(struct net_device *dev, priv->tx_power = wrqu->power.value; err = ipw_set_tx_power(priv); out: - mutex_unlock(&priv->mutex); + up(&priv->sem); return err; } @@ -9209,12 +8811,12 @@ static int ipw_wx_get_txpow(struct net_device *dev, union iwreq_data *wrqu, char *extra) { struct ipw_priv *priv = ieee80211_priv(dev); - mutex_lock(&priv->mutex); + down(&priv->sem); wrqu->power.value = priv->tx_power; wrqu->power.fixed = 1; wrqu->power.flags = IW_TXPOW_DBM; wrqu->power.disabled = (priv->status & STATUS_RF_KILL_MASK) ? 1 : 0; - mutex_unlock(&priv->mutex); + up(&priv->sem); IPW_DEBUG_WX("GET TX Power -> %s %d \n", wrqu->power.disabled ? "OFF" : "ON", wrqu->power.value); @@ -9227,13 +8829,13 @@ static int ipw_wx_set_frag(struct net_device *dev, union iwreq_data *wrqu, char *extra) { struct ipw_priv *priv = ieee80211_priv(dev); - mutex_lock(&priv->mutex); + down(&priv->sem); if (wrqu->frag.disabled) priv->ieee->fts = DEFAULT_FTS; else { if (wrqu->frag.value < MIN_FRAG_THRESHOLD || wrqu->frag.value > MAX_FRAG_THRESHOLD) { - mutex_unlock(&priv->mutex); + up(&priv->sem); return -EINVAL; } @@ -9241,7 +8843,7 @@ static int ipw_wx_set_frag(struct net_device *dev, } ipw_send_frag_threshold(priv, wrqu->frag.value); - mutex_unlock(&priv->mutex); + up(&priv->sem); IPW_DEBUG_WX("SET Frag Threshold -> %d \n", wrqu->frag.value); return 0; } @@ -9251,11 +8853,11 @@ static int ipw_wx_get_frag(struct net_device *dev, union iwreq_data *wrqu, char *extra) { struct ipw_priv *priv = ieee80211_priv(dev); - mutex_lock(&priv->mutex); + down(&priv->sem); wrqu->frag.value = priv->ieee->fts; wrqu->frag.fixed = 0; /* no auto select */ wrqu->frag.disabled = (wrqu->frag.value == DEFAULT_FTS); - mutex_unlock(&priv->mutex); + up(&priv->sem); IPW_DEBUG_WX("GET Frag Threshold -> %d \n", wrqu->frag.value); return 0; @@ -9276,7 +8878,7 @@ static int ipw_wx_set_retry(struct net_device *dev, if (wrqu->retry.value < 0 || wrqu->retry.value > 255) return -EINVAL; - mutex_lock(&priv->mutex); + down(&priv->sem); if (wrqu->retry.flags & IW_RETRY_MIN) priv->short_retry_limit = (u8) wrqu->retry.value; else if (wrqu->retry.flags & IW_RETRY_MAX) @@ -9288,7 +8890,7 @@ static int ipw_wx_set_retry(struct net_device *dev, ipw_send_retry_limit(priv, priv->short_retry_limit, priv->long_retry_limit); - mutex_unlock(&priv->mutex); + up(&priv->sem); IPW_DEBUG_WX("SET retry limit -> short:%d long:%d\n", priv->short_retry_limit, priv->long_retry_limit); return 0; @@ -9300,11 +8902,11 @@ static int ipw_wx_get_retry(struct net_device *dev, { struct ipw_priv *priv = ieee80211_priv(dev); - mutex_lock(&priv->mutex); + down(&priv->sem); wrqu->retry.disabled = 0; if ((wrqu->retry.flags & IW_RETRY_TYPE) == IW_RETRY_LIFETIME) { - mutex_unlock(&priv->mutex); + up(&priv->sem); return -EINVAL; } @@ -9318,7 +8920,7 @@ static int ipw_wx_get_retry(struct net_device *dev, wrqu->retry.flags = IW_RETRY_LIMIT; wrqu->retry.value = priv->short_retry_limit; } - mutex_unlock(&priv->mutex); + up(&priv->sem); IPW_DEBUG_WX("GET retry -> %d \n", wrqu->retry.value); @@ -9335,7 +8937,7 @@ static int ipw_request_direct_scan(struct ipw_priv *priv, char *essid, (priv->status & STATUS_EXIT_PENDING)) return 0; - mutex_lock(&priv->mutex); + down(&priv->sem); if (priv->status & STATUS_RF_KILL_MASK) { IPW_DEBUG_HC("Aborting scan due to RF kill activation\n"); @@ -9387,7 +8989,7 @@ static int ipw_request_direct_scan(struct ipw_priv *priv, char *essid, priv->status |= STATUS_SCANNING; done: - mutex_unlock(&priv->mutex); + up(&priv->sem); return err; } @@ -9430,7 +9032,7 @@ static int ipw_wx_set_encode(struct net_device *dev, int ret; u32 cap = priv->capability; - mutex_lock(&priv->mutex); + down(&priv->sem); ret = ieee80211_wx_set_encode(priv->ieee, info, wrqu, key); /* In IBSS mode, we need to notify the firmware to update @@ -9440,7 +9042,7 @@ static int ipw_wx_set_encode(struct net_device *dev, priv->status & STATUS_ASSOCIATED) ipw_disassociate(priv); - mutex_unlock(&priv->mutex); + up(&priv->sem); return ret; } @@ -9458,17 +9060,17 @@ static int ipw_wx_set_power(struct net_device *dev, { struct ipw_priv *priv = ieee80211_priv(dev); int err; - mutex_lock(&priv->mutex); + down(&priv->sem); if (wrqu->power.disabled) { priv->power_mode = IPW_POWER_LEVEL(priv->power_mode); err = ipw_send_power_mode(priv, IPW_POWER_MODE_CAM); if (err) { IPW_DEBUG_WX("failed setting power mode.\n"); - mutex_unlock(&priv->mutex); + up(&priv->sem); return err; } IPW_DEBUG_WX("SET Power Management Mode -> off\n"); - mutex_unlock(&priv->mutex); + up(&priv->sem); return 0; } @@ -9480,7 +9082,7 @@ static int ipw_wx_set_power(struct net_device *dev, default: /* Otherwise we don't support it */ IPW_DEBUG_WX("SET PM Mode: %X not supported.\n", wrqu->power.flags); - mutex_unlock(&priv->mutex); + up(&priv->sem); return -EOPNOTSUPP; } @@ -9493,12 +9095,12 @@ static int ipw_wx_set_power(struct net_device *dev, err = ipw_send_power_mode(priv, IPW_POWER_LEVEL(priv->power_mode)); if (err) { IPW_DEBUG_WX("failed setting power mode.\n"); - mutex_unlock(&priv->mutex); + up(&priv->sem); return err; } IPW_DEBUG_WX("SET Power Management Mode -> 0x%02X\n", priv->power_mode); - mutex_unlock(&priv->mutex); + up(&priv->sem); return 0; } @@ -9507,13 +9109,13 @@ static int ipw_wx_get_power(struct net_device *dev, union iwreq_data *wrqu, char *extra) { struct ipw_priv *priv = ieee80211_priv(dev); - mutex_lock(&priv->mutex); + down(&priv->sem); if (!(priv->power_mode & IPW_POWER_ENABLED)) wrqu->power.disabled = 1; else wrqu->power.disabled = 0; - mutex_unlock(&priv->mutex); + up(&priv->sem); IPW_DEBUG_WX("GET Power Management Mode -> %02X\n", priv->power_mode); return 0; @@ -9526,7 +9128,7 @@ static int ipw_wx_set_powermode(struct net_device *dev, struct ipw_priv *priv = ieee80211_priv(dev); int mode = *(int *)extra; int err; - mutex_lock(&priv->mutex); + down(&priv->sem); if ((mode < 1) || (mode > IPW_POWER_LIMIT)) { mode = IPW_POWER_AC; priv->power_mode = mode; @@ -9539,11 +9141,11 @@ static int ipw_wx_set_powermode(struct net_device *dev, if (err) { IPW_DEBUG_WX("failed setting power mode.\n"); - mutex_unlock(&priv->mutex); + up(&priv->sem); return err; } } - mutex_unlock(&priv->mutex); + up(&priv->sem); return 0; } @@ -9592,7 +9194,7 @@ static int ipw_wx_set_wireless_mode(struct net_device *dev, IPW_WARNING("Attempt to set invalid wireless mode: %d\n", mode); return -EINVAL; } - mutex_lock(&priv->mutex); + down(&priv->sem); if (priv->adapter == IPW_2915ABG) { priv->ieee->abg_true = 1; if (mode & IEEE_A) { @@ -9604,7 +9206,7 @@ static int ipw_wx_set_wireless_mode(struct net_device *dev, if (mode & IEEE_A) { IPW_WARNING("Attempt to set 2200BG into " "802.11a mode\n"); - mutex_unlock(&priv->mutex); + up(&priv->sem); return -EINVAL; } @@ -9641,7 +9243,7 @@ static int ipw_wx_set_wireless_mode(struct net_device *dev, IPW_DEBUG_WX("PRIV SET MODE: %c%c%c\n", mode & IEEE_A ? 'a' : '.', mode & IEEE_B ? 'b' : '.', mode & IEEE_G ? 'g' : '.'); - mutex_unlock(&priv->mutex); + up(&priv->sem); return 0; } @@ -9650,7 +9252,7 @@ static int ipw_wx_get_wireless_mode(struct net_device *dev, union iwreq_data *wrqu, char *extra) { struct ipw_priv *priv = ieee80211_priv(dev); - mutex_lock(&priv->mutex); + down(&priv->sem); switch (priv->ieee->mode) { case IEEE_A: strncpy(extra, "802.11a (1)", MAX_WX_STRING); @@ -9681,7 +9283,7 @@ static int ipw_wx_get_wireless_mode(struct net_device *dev, IPW_DEBUG_WX("PRIV GET MODE: %s\n", extra); wrqu->data.length = strlen(extra) + 1; - mutex_unlock(&priv->mutex); + up(&priv->sem); return 0; } @@ -9692,7 +9294,7 @@ static int ipw_wx_set_preamble(struct net_device *dev, { struct ipw_priv *priv = ieee80211_priv(dev); int mode = *(int *)extra; - mutex_lock(&priv->mutex); + down(&priv->sem); /* Switching from SHORT -> LONG requires a disassociation */ if (mode == 1) { if (!(priv->config & CFG_PREAMBLE_LONG)) { @@ -9711,11 +9313,11 @@ static int ipw_wx_set_preamble(struct net_device *dev, priv->config &= ~CFG_PREAMBLE_LONG; goto done; } - mutex_unlock(&priv->mutex); + up(&priv->sem); return -EINVAL; done: - mutex_unlock(&priv->mutex); + up(&priv->sem); return 0; } @@ -9724,12 +9326,12 @@ static int ipw_wx_get_preamble(struct net_device *dev, union iwreq_data *wrqu, char *extra) { struct ipw_priv *priv = ieee80211_priv(dev); - mutex_lock(&priv->mutex); + down(&priv->sem); if (priv->config & CFG_PREAMBLE_LONG) snprintf(wrqu->name, IFNAMSIZ, "long (1)"); else snprintf(wrqu->name, IFNAMSIZ, "auto (0)"); - mutex_unlock(&priv->mutex); + up(&priv->sem); return 0; } @@ -9741,11 +9343,11 @@ static int ipw_wx_set_monitor(struct net_device *dev, struct ipw_priv *priv = ieee80211_priv(dev); int *parms = (int *)extra; int enable = (parms[0] > 0); - mutex_lock(&priv->mutex); + down(&priv->sem); IPW_DEBUG_WX("SET MONITOR: %d %d\n", enable, parms[1]); if (enable) { if (priv->ieee->iw_mode != IW_MODE_MONITOR) { -#ifdef CONFIG_IPW2200_RADIOTAP +#ifdef CONFIG_IEEE80211_RADIOTAP priv->net_dev->type = ARPHRD_IEEE80211_RADIOTAP; #else priv->net_dev->type = ARPHRD_IEEE80211; @@ -9756,13 +9358,13 @@ static int ipw_wx_set_monitor(struct net_device *dev, ipw_set_channel(priv, parms[1]); } else { if (priv->ieee->iw_mode != IW_MODE_MONITOR) { - mutex_unlock(&priv->mutex); + up(&priv->sem); return 0; } priv->net_dev->type = ARPHRD_ETHER; queue_work(priv->workqueue, &priv->adapter_restart); } - mutex_unlock(&priv->mutex); + up(&priv->sem); return 0; } @@ -9792,9 +9394,9 @@ static int ipw_wx_sw_reset(struct net_device *dev, IPW_DEBUG_WX("SW_RESET\n"); - mutex_lock(&priv->mutex); + down(&priv->sem); - ret = ipw_sw_reset(priv, 2); + ret = ipw_sw_reset(priv, 0); if (!ret) { free_firmware(); ipw_adapter_restart(priv); @@ -9804,9 +9406,9 @@ static int ipw_wx_sw_reset(struct net_device *dev, * module parameter, so take appropriate action */ ipw_radio_kill_sw(priv, priv->status & STATUS_RF_KILL_SW); - mutex_unlock(&priv->mutex); + up(&priv->sem); ieee80211_wx_set_encode(priv->ieee, info, &wrqu_sec, NULL); - mutex_lock(&priv->mutex); + down(&priv->sem); if (!(priv->status & STATUS_RF_KILL_MASK)) { /* Configuration likely changed -- force [re]association */ @@ -9816,7 +9418,7 @@ static int ipw_wx_sw_reset(struct net_device *dev, ipw_associate(priv); } - mutex_unlock(&priv->mutex); + up(&priv->sem); return 0; } @@ -9829,8 +9431,6 @@ static iw_handler ipw_wx_handlers[] = { IW_IOCTL(SIOCGIWFREQ) = ipw_wx_get_freq, IW_IOCTL(SIOCSIWMODE) = ipw_wx_set_mode, IW_IOCTL(SIOCGIWMODE) = ipw_wx_get_mode, - IW_IOCTL(SIOCSIWSENS) = ipw_wx_set_sens, - IW_IOCTL(SIOCGIWSENS) = ipw_wx_get_sens, IW_IOCTL(SIOCGIWRANGE) = ipw_wx_get_range, IW_IOCTL(SIOCSIWAP) = ipw_wx_set_wap, IW_IOCTL(SIOCGIWAP) = ipw_wx_get_wap, @@ -9973,10 +9573,10 @@ static struct iw_statistics *ipw_get_wireless_stats(struct net_device *dev) } wstats->qual.qual = priv->quality; - wstats->qual.level = priv->exp_avg_rssi; - wstats->qual.noise = priv->exp_avg_noise; + wstats->qual.level = average_value(&priv->average_rssi); + wstats->qual.noise = average_value(&priv->average_noise); wstats->qual.updated = IW_QUAL_QUAL_UPDATED | IW_QUAL_LEVEL_UPDATED | - IW_QUAL_NOISE_UPDATED | IW_QUAL_DBM; + IW_QUAL_NOISE_UPDATED; wstats->miss.beacon = average_value(&priv->average_missed_beacons); wstats->discard.retries = priv->last_tx_failures; @@ -9994,7 +9594,7 @@ static struct iw_statistics *ipw_get_wireless_stats(struct net_device *dev) static void init_sys_config(struct ipw_sys_config *sys_config) { memset(sys_config, 0, sizeof(struct ipw_sys_config)); - sys_config->bt_coexistence = 0; + sys_config->bt_coexistence = 1; /* We may need to look into prvStaBtConfig */ sys_config->answer_broadcast_ssid_probe = 0; sys_config->accept_all_data_frames = 0; sys_config->accept_non_directed_frames = 1; @@ -10002,15 +9602,12 @@ 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; - if (antenna < CFG_SYS_ANTENNA_BOTH || antenna > CFG_SYS_ANTENNA_B) - antenna = CFG_SYS_ANTENNA_BOTH; - sys_config->antenna_diversity = antenna; + sys_config->antenna_diversity = CFG_SYS_ANTENNA_BOTH; 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; sys_config->bt_coexist_collision_thr = 0; sys_config->pass_noise_stats_to_host = 1; //1 -- fix for 256 - sys_config->silence_threshold = 0x1e; } static int ipw_net_open(struct net_device *dev) @@ -10018,11 +9615,11 @@ static int ipw_net_open(struct net_device *dev) struct ipw_priv *priv = ieee80211_priv(dev); IPW_DEBUG_INFO("dev->open\n"); /* we should be verifying the device is ready to be opened */ - mutex_lock(&priv->mutex); + down(&priv->sem); if (!(priv->status & STATUS_RF_KILL_MASK) && (priv->status & STATUS_ASSOCIATED)) netif_start_queue(dev); - mutex_unlock(&priv->mutex); + up(&priv->sem); return 0; } @@ -10043,11 +9640,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_3addrqos *hdr = (struct ieee80211_hdr_3addrqos *) + struct ieee80211_hdr_3addr *hdr = (struct ieee80211_hdr_3addr *) txb->fragments[0]->data; int i = 0; struct tfd_frame *tfd; -#ifdef CONFIG_IPW2200_QOS +#ifdef CONFIG_IPW_QOS int tx_id = ipw_get_tx_queue_number(priv, pri); struct clx2_tx_queue *txq = &priv->txq[tx_id]; #else @@ -10058,9 +9655,14 @@ 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)); + /* If there isn't room in the queue, we return busy and let the + * network stack requeue the packet for us */ + if (ipw_queue_space(q) < q->high_mark) + return NETDEV_TX_BUSY; + 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) { @@ -10077,6 +9679,7 @@ 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; } @@ -10154,10 +9757,9 @@ 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_IPW2200_QOS - if (fc & IEEE80211_STYPE_QOS_DATA) - ipw_qos_set_tx_queue_command(priv, pri, &(tfd->u.data)); -#endif /* CONFIG_IPW2200_QOS */ +#ifdef CONFIG_IPW_QOS + ipw_qos_set_tx_queue_command(priv, pri, &(tfd->u.data), unicast); +#endif /* CONFIG_IPW_QOS */ /* payload */ tfd->u.data.num_chunks = cpu_to_le32(min((u8) (NUM_TFD_CHUNKS - 2), @@ -10223,9 +9825,6 @@ static int ipw_tx_skb(struct ipw_priv *priv, struct ieee80211_txb *txb, q->first_empty = ipw_queue_inc_wrap(q->first_empty, q->n_bd); ipw_write32(priv, q->reg_w, q->first_empty); - if (ipw_queue_space(q) < q->high_mark) - netif_stop_queue(priv->net_dev); - return NETDEV_TX_OK; drop: @@ -10237,12 +9836,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_IPW2200_QOS +#ifdef CONFIG_IPW_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_IPW2200_QOS */ +#endif /* CONFIG_IPW_QOS */ if (ipw_queue_space(&txq->q) < txq->q.high_mark) return 1; @@ -10250,88 +9849,6 @@ 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) { @@ -10349,11 +9866,6 @@ 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); @@ -10386,13 +9898,13 @@ static int ipw_net_set_mac_address(struct net_device *dev, void *p) struct sockaddr *addr = p; if (!is_valid_ether_addr(addr->sa_data)) return -EADDRNOTAVAIL; - mutex_lock(&priv->mutex); + down(&priv->sem); priv->config |= CFG_CUSTOM_MAC; memcpy(priv->mac_addr, addr->sa_data, ETH_ALEN); printk(KERN_INFO "%s: Setting MAC to " MAC_FMT "\n", priv->net_dev->name, MAC_ARG(priv->mac_addr)); queue_work(priv->workqueue, &priv->adapter_restart); - mutex_unlock(&priv->mutex); + up(&priv->sem); return 0; } @@ -10436,9 +9948,9 @@ static int ipw_ethtool_get_eeprom(struct net_device *dev, if (eeprom->offset + eeprom->len > IPW_EEPROM_IMAGE_SIZE) return -EINVAL; - mutex_lock(&p->mutex); + down(&p->sem); memcpy(bytes, &p->eeprom[eeprom->offset], eeprom->len); - mutex_unlock(&p->mutex); + up(&p->sem); return 0; } @@ -10450,11 +9962,11 @@ static int ipw_ethtool_set_eeprom(struct net_device *dev, if (eeprom->offset + eeprom->len > IPW_EEPROM_IMAGE_SIZE) return -EINVAL; - mutex_lock(&p->mutex); + down(&p->sem); memcpy(&p->eeprom[eeprom->offset], bytes, eeprom->len); for (i = 0; i < IPW_EEPROM_IMAGE_SIZE; i++) ipw_write8(p, i + IPW_EEPROM_DATA, p->eeprom[i]); - mutex_unlock(&p->mutex); + up(&p->sem); return 0; } @@ -10474,7 +9986,7 @@ static irqreturn_t ipw_isr(int irq, void *data, struct pt_regs *regs) if (!priv) return IRQ_NONE; - spin_lock(&priv->irq_lock); + spin_lock(&priv->lock); if (!(priv->status & STATUS_INT_ENABLED)) { /* Shared IRQ */ @@ -10496,7 +10008,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); @@ -10507,11 +10019,11 @@ static irqreturn_t ipw_isr(int irq, void *data, struct pt_regs *regs) tasklet_schedule(&priv->irq_tasklet); - spin_unlock(&priv->irq_lock); + spin_unlock(&priv->lock); return IRQ_HANDLED; none: - spin_unlock(&priv->irq_lock); + spin_unlock(&priv->lock); return IRQ_NONE; } @@ -10549,12 +10061,12 @@ static void ipw_rf_kill(void *adapter) static void ipw_bg_rf_kill(void *data) { struct ipw_priv *priv = data; - mutex_lock(&priv->mutex); + down(&priv->sem); ipw_rf_kill(data); - mutex_unlock(&priv->mutex); + up(&priv->sem); } -static void ipw_link_up(struct ipw_priv *priv) +void ipw_link_up(struct ipw_priv *priv) { priv->last_seq_num = -1; priv->last_frag_num = -1; @@ -10584,12 +10096,12 @@ static void ipw_link_up(struct ipw_priv *priv) static void ipw_bg_link_up(void *data) { struct ipw_priv *priv = data; - mutex_lock(&priv->mutex); + down(&priv->sem); ipw_link_up(data); - mutex_unlock(&priv->mutex); + up(&priv->sem); } -static void ipw_link_down(struct ipw_priv *priv) +void ipw_link_down(struct ipw_priv *priv) { ipw_led_link_down(priv); netif_carrier_off(priv->net_dev); @@ -10612,9 +10124,9 @@ static void ipw_link_down(struct ipw_priv *priv) static void ipw_bg_link_down(void *data) { struct ipw_priv *priv = data; - mutex_lock(&priv->mutex); + down(&priv->sem); ipw_link_down(data); - mutex_unlock(&priv->mutex); + up(&priv->sem); } static int ipw_setup_deferred_work(struct ipw_priv *priv) @@ -10652,10 +10164,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_IPW2200_QOS +#ifdef CONFIG_IPW_QOS INIT_WORK(&priv->qos_activate, (void (*)(void *))ipw_bg_qos_activate, priv); -#endif /* CONFIG_IPW2200_QOS */ +#endif /* CONFIG_IPW_QOS */ tasklet_init(&priv->irq_tasklet, (void (*)(unsigned long)) ipw_irq_tasklet, (unsigned long)priv); @@ -10787,35 +10299,12 @@ static int ipw_config(struct ipw_priv *priv) /* set basic system config settings */ init_sys_config(&priv->sys_config); - - /* Support Bluetooth if we have BT h/w on board, and user wants to. - * Does not support BT priority yet (don't abort or defer our Tx) */ - if (bt_coexist) { - unsigned char bt_caps = priv->eeprom[EEPROM_SKU_CAPABILITY]; - - if (bt_caps & EEPROM_SKU_CAP_BT_CHANNEL_SIG) - priv->sys_config.bt_coexistence - |= CFG_BT_COEXISTENCE_SIGNAL_CHNL; - if (bt_caps & EEPROM_SKU_CAP_BT_OOB) - priv->sys_config.bt_coexistence - |= 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)) + if (ipw_send_system_config(priv, &priv->sys_config)) goto error; init_supported_rates(priv, &priv->rates); @@ -10827,10 +10316,10 @@ static int ipw_config(struct ipw_priv *priv) if (ipw_send_rts_threshold(priv, priv->rts_threshold)) goto error; } -#ifdef CONFIG_IPW2200_QOS +#ifdef CONFIG_IPW_QOS IPW_DEBUG_QOS("QoS: call ipw_qos_activate\n"); ipw_qos_activate(priv, NULL); -#endif /* CONFIG_IPW2200_QOS */ +#endif /* CONFIG_IPW_QOS */ if (ipw_set_random_seed(priv)) goto error; @@ -10867,9 +10356,6 @@ static int ipw_config(struct ipw_priv *priv) * not intended for resale of the above mentioned Intel adapters has * not been tested. * - * Remember to update the table in README.ipw2200 when changing this - * table. - * */ static const struct ieee80211_geo ipw_geos[] = { { /* Restricted */ @@ -11117,6 +10603,96 @@ static const struct ieee80211_geo ipw_geos[] = { } }; +/* GEO code borrowed from ieee80211_geo.c */ +static int ipw_is_valid_channel(struct ieee80211_device *ieee, u8 channel) +{ + int i; + + /* Driver needs to initialize the geography map before using + * these helper functions */ + BUG_ON(ieee->geo.bg_channels == 0 && ieee->geo.a_channels == 0); + + if (ieee->freq_band & IEEE80211_24GHZ_BAND) + for (i = 0; i < ieee->geo.bg_channels; i++) + /* NOTE: If G mode is currently supported but + * this is a B only channel, we don't see it + * as valid. */ + if ((ieee->geo.bg[i].channel == channel) && + (!(ieee->mode & IEEE_G) || + !(ieee->geo.bg[i].flags & IEEE80211_CH_B_ONLY))) + return IEEE80211_24GHZ_BAND; + + if (ieee->freq_band & IEEE80211_52GHZ_BAND) + for (i = 0; i < ieee->geo.a_channels; i++) + if (ieee->geo.a[i].channel == channel) + return IEEE80211_52GHZ_BAND; + + return 0; +} + +static int ipw_channel_to_index(struct ieee80211_device *ieee, u8 channel) +{ + int i; + + /* Driver needs to initialize the geography map before using + * these helper functions */ + BUG_ON(ieee->geo.bg_channels == 0 && ieee->geo.a_channels == 0); + + if (ieee->freq_band & IEEE80211_24GHZ_BAND) + for (i = 0; i < ieee->geo.bg_channels; i++) + if (ieee->geo.bg[i].channel == channel) + return i; + + if (ieee->freq_band & IEEE80211_52GHZ_BAND) + for (i = 0; i < ieee->geo.a_channels; i++) + if (ieee->geo.a[i].channel == channel) + return i; + + return -1; +} + +static u8 ipw_freq_to_channel(struct ieee80211_device *ieee, u32 freq) +{ + int i; + + /* Driver needs to initialize the geography map before using + * these helper functions */ + BUG_ON(ieee->geo.bg_channels == 0 && ieee->geo.a_channels == 0); + + freq /= 100000; + + if (ieee->freq_band & IEEE80211_24GHZ_BAND) + for (i = 0; i < ieee->geo.bg_channels; i++) + if (ieee->geo.bg[i].freq == freq) + return ieee->geo.bg[i].channel; + + if (ieee->freq_band & IEEE80211_52GHZ_BAND) + for (i = 0; i < ieee->geo.a_channels; i++) + if (ieee->geo.a[i].freq == freq) + return ieee->geo.a[i].channel; + + return 0; +} + +static int ipw_set_geo(struct ieee80211_device *ieee, + const struct ieee80211_geo *geo) +{ + memcpy(ieee->geo.name, geo->name, 3); + ieee->geo.name[3] = '\0'; + ieee->geo.bg_channels = geo->bg_channels; + ieee->geo.a_channels = geo->a_channels; + memcpy(ieee->geo.bg, geo->bg, geo->bg_channels * + sizeof(struct ieee80211_channel)); + memcpy(ieee->geo.a, geo->a, ieee->geo.a_channels * + sizeof(struct ieee80211_channel)); + return 0; +} + +static const struct ieee80211_geo *ipw_get_geo(struct ieee80211_device *ieee) +{ + return &ieee->geo; +} + #define MAX_HW_RESTARTS 5 static int ipw_up(struct ipw_priv *priv) { @@ -11131,7 +10707,6 @@ 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; @@ -11164,11 +10739,14 @@ static int ipw_up(struct ipw_priv *priv) priv->eeprom[EEPROM_COUNTRY_CODE + 2]); j = 0; } - if (ieee80211_set_geo(priv->ieee, &ipw_geos[j])) { + if (ipw_set_geo(priv->ieee, &ipw_geos[j])) { IPW_WARNING("Could not set geography."); return 0; } + IPW_DEBUG_INFO("Geography %03d [%s] detected.\n", + j, priv->ieee->geo.name); + if (priv->status & STATUS_RF_KILL_SW) { IPW_WARNING("Radio disabled by module parameter.\n"); return 0; @@ -11211,9 +10789,9 @@ static int ipw_up(struct ipw_priv *priv) static void ipw_bg_up(void *data) { struct ipw_priv *priv = data; - mutex_lock(&priv->mutex); + down(&priv->sem); ipw_up(data); - mutex_unlock(&priv->mutex); + up(&priv->sem); } static void ipw_deinit(struct ipw_priv *priv) @@ -11282,23 +10860,23 @@ static void ipw_down(struct ipw_priv *priv) static void ipw_bg_down(void *data) { struct ipw_priv *priv = data; - mutex_lock(&priv->mutex); + down(&priv->sem); ipw_down(data); - mutex_unlock(&priv->mutex); + up(&priv->sem); } /* Called by register_netdev() */ static int ipw_net_init(struct net_device *dev) { struct ipw_priv *priv = ieee80211_priv(dev); - mutex_lock(&priv->mutex); + down(&priv->sem); if (ipw_up(priv)) { - mutex_unlock(&priv->mutex); + up(&priv->sem); return -EIO; } - mutex_unlock(&priv->mutex); + up(&priv->sem); return 0; } @@ -11353,10 +10931,6 @@ 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 }; @@ -11365,109 +10939,6 @@ 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; @@ -11491,12 +10962,11 @@ 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]); - mutex_init(&priv->mutex); + init_MUTEX(&priv->sem); if (pci_enable_device(pdev)) { err = -ENODEV; goto out_free_ieee80211; @@ -11545,7 +11015,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, IRQF_SHARED, DRV_NAME, priv); + err = request_irq(pdev->irq, ipw_isr, SA_SHIRQ, DRV_NAME, priv); if (err) { IPW_ERROR("Error allocating IRQ %d\n", pdev->irq); goto out_destroy_workqueue; @@ -11554,18 +11024,17 @@ static int ipw_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) SET_MODULE_OWNER(net_dev); SET_NETDEV_DEV(net_dev, &pdev->dev); - mutex_lock(&priv->mutex); + down(&priv->sem); priv->ieee->hard_start_xmit = ipw_net_hard_start_xmit; priv->ieee->set_security = shim__set_security; priv->ieee->is_queue_full = ipw_net_is_queue_full; -#ifdef CONFIG_IPW2200_QOS - priv->ieee->is_qos_active = ipw_is_qos_active; +#ifdef CONFIG_IPW_QOS 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_IPW2200_QOS */ +#endif /* CONFIG_IPW_QOS */ priv->ieee->perfect_rssi = -20; priv->ieee->worst_rssi = -85; @@ -11588,34 +11057,16 @@ static int ipw_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) err = sysfs_create_group(&pdev->dev.kobj, &ipw_attribute_group); if (err) { IPW_ERROR("failed to create sysfs device attributes\n"); - mutex_unlock(&priv->mutex); + up(&priv->sem); goto out_release_irq; } - mutex_unlock(&priv->mutex); + up(&priv->sem); err = register_netdev(net_dev); if (err) { IPW_ERROR("failed to register network device\n"); 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, - priv->ieee->geo.a_channels); - return 0; out_remove_sysfs: @@ -11647,13 +11098,13 @@ static void ipw_pci_remove(struct pci_dev *pdev) if (!priv) return; - mutex_lock(&priv->mutex); + down(&priv->sem); priv->status |= STATUS_EXIT_PENDING; ipw_down(priv); sysfs_remove_group(&pdev->dev.kobj, &ipw_attribute_group); - mutex_unlock(&priv->mutex); + up(&priv->sem); unregister_netdev(priv->net_dev); @@ -11685,12 +11136,10 @@ static void ipw_pci_remove(struct pci_dev *pdev) } } - kfree(priv->error); - priv->error = NULL; - -#ifdef CONFIG_IPW2200_PROMISCUOUS - ipw_prom_free(priv); -#endif + if (priv->error) { + ipw_free_error_log(priv->error); + priv->error = NULL; + } free_irq(pdev->irq, priv); iounmap(priv->hw_base); @@ -11808,20 +11257,13 @@ MODULE_PARM_DESC(auto_create, "auto create adhoc network (default on)"); module_param(led, int, 0444); MODULE_PARM_DESC(led, "enable led control on some systems (default 0 off)\n"); -#ifdef CONFIG_IPW2200_DEBUG module_param(debug, int, 0444); MODULE_PARM_DESC(debug, "debug output mask"); -#endif module_param(channel, int, 0444); MODULE_PARM_DESC(channel, "channel to limit associate to (default 0 [ANY])"); -#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 +#ifdef CONFIG_IPW_QOS module_param(qos_enable, int, 0444); MODULE_PARM_DESC(qos_enable, "enable all QoS functionalitis"); @@ -11836,7 +11278,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_IPW2200_QOS */ +#endif /* CONFIG_IPW_QOS */ #ifdef CONFIG_IPW2200_MONITOR module_param(mode, int, 0444); @@ -11846,21 +11288,12 @@ module_param(mode, int, 0444); MODULE_PARM_DESC(mode, "network mode (0=BSS,1=IBSS)"); #endif -module_param(bt_coexist, int, 0444); -MODULE_PARM_DESC(bt_coexist, "enable bluetooth coexistence (default off)"); - module_param(hwcrypto, int, 0444); -MODULE_PARM_DESC(hwcrypto, "enable hardware crypto (default off)"); +MODULE_PARM_DESC(hwcrypto, "enable hardware crypto (default on)"); module_param(cmdlog, int, 0444); MODULE_PARM_DESC(cmdlog, "allocate a ring buffer for logging firmware commands"); -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 8b1cd7c74..e65620a4d 100644 --- a/drivers/net/wireless/ipw2200.h +++ b/drivers/net/wireless/ipw2200.h @@ -1,6 +1,6 @@ /****************************************************************************** - Copyright(c) 2003 - 2006 Intel Corporation. All rights reserved. + Copyright(c) 2003 - 2005 Intel Corporation. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of version 2 of the GNU General Public License as @@ -31,8 +31,8 @@ #include #include +#include #include -#include #include #include @@ -46,7 +46,6 @@ #include #include #include -#include #include #include @@ -245,10 +244,8 @@ enum connection_manager_assoc_states { #define HOST_NOTIFICATION_S36_MEASUREMENT_REFUSED 31 #define HOST_NOTIFICATION_STATUS_BEACON_MISSING 1 -#define IPW_MB_ROAMING_THRESHOLD_MIN 1 +#define IPW_MB_DISASSOCIATE_THRESHOLD_DEFAULT 24 #define IPW_MB_ROAMING_THRESHOLD_DEFAULT 8 -#define IPW_MB_ROAMING_THRESHOLD_MAX 30 -#define IPW_MB_DISASSOCIATE_THRESHOLD_DEFAULT 3*IPW_MB_ROAMING_THRESHOLD_DEFAULT #define IPW_REAL_RATE_RX_PACKET_THRESHOLD 300 #define MACADRR_BYTE_LEN 6 @@ -619,16 +616,13 @@ struct notif_tgi_tx_key { u8 reserved; } __attribute__ ((packed)); -#define SILENCE_OVER_THRESH (1) -#define SILENCE_UNDER_THRESH (2) - struct notif_link_deterioration { struct ipw_cmd_stats stats; u8 rate; u8 modulation; struct rate_histogram histogram; - u8 silence_notification_type; /* SILENCE_OVER/UNDER_THRESH */ - u16 silence_count; + u8 reserved1; + u16 reserved2; } __attribute__ ((packed)); struct notif_association { @@ -786,9 +780,9 @@ struct ipw_sys_config { u8 enable_cts_to_self; u8 enable_multicast_filtering; u8 bt_coexist_collision_thr; - u8 silence_threshold; + u8 reserved2; u8 accept_all_mgmt_bcpr; - u8 accept_all_mgmt_frames; + u8 accept_all_mgtm_frames; u8 pass_noise_stats_to_host; u8 reserved3; } __attribute__ ((packed)); @@ -858,7 +852,7 @@ struct ipw_scan_request_ext { u16 dwell_time[IPW_SCAN_TYPES]; } __attribute__ ((packed)); -static inline u8 ipw_get_scan_type(struct ipw_scan_request_ext *scan, u8 index) +extern inline u8 ipw_get_scan_type(struct ipw_scan_request_ext *scan, u8 index) { if (index % 2) return scan->scan_type[index / 2] & 0x0F; @@ -866,7 +860,7 @@ static inline u8 ipw_get_scan_type(struct ipw_scan_request_ext *scan, u8 index) return (scan->scan_type[index / 2] & 0xF0) >> 4; } -static inline void ipw_set_scan_type(struct ipw_scan_request_ext *scan, +extern inline void ipw_set_scan_type(struct ipw_scan_request_ext *scan, u8 index, u8 scan_type) { if (index % 2) @@ -1121,70 +1115,17 @@ 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; + struct semaphore sem; /* 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; @@ -1205,9 +1146,11 @@ struct ipw_priv { u32 config; u32 capability; + u8 last_rx_rssi; + u8 last_noise; struct average average_missed_beacons; - s16 exp_avg_rssi; - s16 exp_avg_noise; + struct average average_rssi; + struct average average_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 */ @@ -1358,29 +1301,6 @@ 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)) \ @@ -1486,6 +1406,13 @@ do { if (ipw_debug_level & (level)) \ * Register bit definitions */ +/* Dino control registers bits */ + +#define DINO_ENABLE_SYSTEM 0x80 +#define DINO_ENABLE_CS 0x40 +#define DINO_RXFIFO_DATA 0x01 +#define DINO_CONTROL_REG 0x00200000 + #define IPW_INTA_RW 0x00000008 #define IPW_INTA_MASK_R 0x0000000C #define IPW_INDIRECT_ADDR 0x00000010 @@ -1532,11 +1459,6 @@ do { if (ipw_debug_level & (level)) \ #define IPW_DOMAIN_0_END 0x1000 #define CLX_MEM_BAR_SIZE 0x1000 -/* Dino/baseband control registers bits */ - -#define DINO_ENABLE_SYSTEM 0x80 /* 1 = baseband processor on, 0 = reset */ -#define DINO_ENABLE_CS 0x40 /* 1 = enable ucode load */ -#define DINO_RXFIFO_DATA 0x01 /* 1 = data available */ #define IPW_BASEBAND_CONTROL_STATUS 0X00200000 #define IPW_BASEBAND_TX_FIFO_WRITE 0X00200004 #define IPW_BASEBAND_RX_FIFO_READ 0X00200004 @@ -1645,18 +1567,13 @@ do { if (ipw_debug_level & (level)) \ #define EEPROM_BSS_CHANNELS_BG (GET_EEPROM_ADDR(0x2c,LSB)) /* 2 bytes */ #define EEPROM_HW_VERSION (GET_EEPROM_ADDR(0x72,LSB)) /* 2 bytes */ -/* NIC type as found in the one byte EEPROM_NIC_TYPE offset */ +/* NIC type as found in the one byte EEPROM_NIC_TYPE offset*/ #define EEPROM_NIC_TYPE_0 0 #define EEPROM_NIC_TYPE_1 1 #define EEPROM_NIC_TYPE_2 2 #define EEPROM_NIC_TYPE_3 3 #define EEPROM_NIC_TYPE_4 4 -/* Bluetooth Coexistence capabilities as found in EEPROM_SKU_CAPABILITY */ -#define EEPROM_SKU_CAP_BT_CHANNEL_SIG 0x01 /* we can tell BT our channel # */ -#define EEPROM_SKU_CAP_BT_PRIORITY 0x02 /* BT can take priority over us */ -#define EEPROM_SKU_CAP_BT_OOB 0x04 /* we can signal BT out-of-band */ - #define FW_MEM_REG_LOWER_BOUND 0x00300000 #define FW_MEM_REG_EEPROM_ACCESS (FW_MEM_REG_LOWER_BOUND + 0x40) #define IPW_EVENT_REG (FW_MEM_REG_LOWER_BOUND + 0x04) @@ -1741,10 +1658,9 @@ enum { IPW_FW_ERROR_FATAL_ERROR }; -#define AUTH_OPEN 0 -#define AUTH_SHARED_KEY 1 -#define AUTH_LEAP 2 -#define AUTH_IGNORE 3 +#define AUTH_OPEN 0 +#define AUTH_SHARED_KEY 1 +#define AUTH_IGNORE 3 #define HC_ASSOCIATE 0 #define HC_REASSOCIATE 1 @@ -1944,7 +1860,7 @@ struct host_cmd { u8 cmd; u8 len; u16 reserved; - u32 *param; + u32 param[TFD_CMD_IMMEDIATE_PAYLOAD_LENGTH]; } __attribute__ ((packed)); struct ipw_cmd_log { @@ -1953,24 +1869,21 @@ struct ipw_cmd_log { struct host_cmd cmd; }; -/* SysConfig command parameters ... */ -/* bt_coexistence param */ -#define CFG_BT_COEXISTENCE_SIGNAL_CHNL 0x01 /* tell BT our chnl # */ -#define CFG_BT_COEXISTENCE_DEFER 0x02 /* defer our Tx if BT traffic */ -#define CFG_BT_COEXISTENCE_KILL 0x04 /* kill our Tx if BT traffic */ -#define CFG_BT_COEXISTENCE_WME_OVER_BT 0x08 /* multimedia extensions */ -#define CFG_BT_COEXISTENCE_OOB 0x10 /* signal BT via out-of-band */ - -/* clear-to-send to self param */ -#define CFG_CTS_TO_ITSELF_ENABLED_MIN 0x00 -#define CFG_CTS_TO_ITSELF_ENABLED_MAX 0x01 +#define CFG_BT_COEXISTENCE_MIN 0x00 +#define CFG_BT_COEXISTENCE_DEFER 0x02 +#define CFG_BT_COEXISTENCE_KILL 0x04 +#define CFG_BT_COEXISTENCE_WME_OVER_BT 0x08 +#define CFG_BT_COEXISTENCE_OOB 0x10 +#define CFG_BT_COEXISTENCE_MAX 0xFF +#define CFG_BT_COEXISTENCE_DEF 0x80 /* read Bt from EEPROM */ + +#define CFG_CTS_TO_ITSELF_ENABLED_MIN 0x0 +#define CFG_CTS_TO_ITSELF_ENABLED_MAX 0x1 #define CFG_CTS_TO_ITSELF_ENABLED_DEF CFG_CTS_TO_ITSELF_ENABLED_MIN -/* Antenna diversity param (h/w can select best antenna, based on signal) */ -#define CFG_SYS_ANTENNA_BOTH 0x00 /* NIC selects best antenna */ -#define CFG_SYS_ANTENNA_A 0x01 /* force antenna A */ -#define CFG_SYS_ANTENNA_B 0x03 /* force antenna B */ -#define CFG_SYS_ANTENNA_SLOW_DIV 0x02 /* consider background noise */ +#define CFG_SYS_ANTENNA_BOTH 0x000 +#define CFG_SYS_ANTENNA_A 0x001 +#define CFG_SYS_ANTENNA_B 0x003 /* * The definitions below were lifted off the ipw2100 driver, which only @@ -1986,4 +1899,27 @@ struct ipw_cmd_log { #define IPW_MAX_CONFIG_RETRIES 10 +static inline u32 frame_hdr_len(struct ieee80211_hdr_4addr *hdr) +{ + u32 retval; + u16 fc; + + retval = sizeof(struct ieee80211_hdr_3addr); + fc = le16_to_cpu(hdr->frame_ctl); + + /* + * Function ToDS FromDS + * IBSS 0 0 + * To AP 1 0 + * From AP 0 1 + * WDS (bridge) 1 1 + * + * Only WDS frames use Address4 among them. --YZ + */ + if (!(fc & IEEE80211_FCTL_TODS) || !(fc & IEEE80211_FCTL_FROMDS)) + retval -= ETH_ALEN; + + return retval; +} + #endif /* __ipw2200_h__ */ diff --git a/drivers/net/wireless/netwave_cs.c b/drivers/net/wireless/netwave_cs.c index 36b5e0043..bf6271ee3 100644 --- a/drivers/net/wireless/netwave_cs.c +++ b/drivers/net/wireless/netwave_cs.c @@ -37,6 +37,7 @@ /* To have statistics (just packets sent) define this */ #undef NETWAVE_STATS +#include #include #include #include @@ -54,8 +55,10 @@ #include #include #include +#ifdef CONFIG_NET_RADIO #include #include +#endif #include #include @@ -189,8 +192,8 @@ module_param(mem_speed, int, 0); /*====================================================================*/ /* PCMCIA (Card Services) related functions */ -static void netwave_release(struct pcmcia_device *link); /* Card removal */ -static int netwave_pcmcia_config(struct pcmcia_device *arg); /* Runs after card +static void netwave_release(dev_link_t *link); /* Card removal */ +static void netwave_pcmcia_config(dev_link_t *arg); /* Runs after card insertion */ static void netwave_detach(struct pcmcia_device *p_dev); /* Destroy instance */ @@ -220,10 +223,10 @@ static struct iw_statistics* netwave_get_wireless_stats(struct net_device *dev); static void set_multicast_list(struct net_device *dev); /* - A struct pcmcia_device structure has fields for most things that are needed + A dev_link_t structure has fields for most things that are needed to keep track of a socket, but there will usually be some device specific information that also needs to be kept track of. The - 'priv' pointer in a struct pcmcia_device structure can be used to point to + 'priv' pointer in a dev_link_t structure can be used to point to a device-specific private data structure, like this. A driver needs to provide a dev_node_t structure for each device @@ -231,7 +234,7 @@ static void set_multicast_list(struct net_device *dev); example, ethernet cards, modems). In other cases, there may be many actual or logical devices (SCSI adapters, memory cards with multiple partitions). The dev_node_t structures need to be kept - in a linked list starting at the 'dev' field of a struct pcmcia_device + in a linked list starting at the 'dev' field of a dev_link_t structure. We allocate them in the card's private data structure, because they generally can't be allocated dynamically. */ @@ -267,7 +270,7 @@ struct site_survey { }; typedef struct netwave_private { - struct pcmcia_device *p_dev; + dev_link_t link; spinlock_t spinlock; /* Serialize access to the hardware (SMP) */ dev_node_t node; u_char __iomem *ramBase; @@ -375,19 +378,20 @@ static struct iw_statistics *netwave_get_wireless_stats(struct net_device *dev) * configure the card at this point -- we wait until we receive a * card insertion event. */ -static int netwave_probe(struct pcmcia_device *link) +static int netwave_attach(struct pcmcia_device *p_dev) { + dev_link_t *link; struct net_device *dev; netwave_private *priv; DEBUG(0, "netwave_attach()\n"); - /* Initialize the struct pcmcia_device structure */ + /* Initialize the dev_link_t structure */ dev = alloc_etherdev(sizeof(netwave_private)); if (!dev) return -ENOMEM; priv = netdev_priv(dev); - priv->p_dev = link; + link = &priv->link; link->priv = dev; /* The io structure describes IO port mapping */ @@ -404,6 +408,7 @@ static int netwave_probe(struct pcmcia_device *link) /* General socket configuration */ link->conf.Attributes = CONF_ENABLE_IRQ; + link->conf.Vcc = 50; link->conf.IntType = INT_MEMORY_AND_IO; link->conf.ConfigIndex = 1; link->conf.Present = PRESENT_OPTION; @@ -427,7 +432,13 @@ static int netwave_probe(struct pcmcia_device *link) dev->stop = &netwave_close; link->irq.Instance = dev; - return netwave_pcmcia_config( link); + link->handle = p_dev; + p_dev->instance = link; + + link->state |= DEV_PRESENT | DEV_CONFIG_PENDING; + netwave_pcmcia_config( link); + + return 0; } /* netwave_attach */ /* @@ -438,15 +449,17 @@ static int netwave_probe(struct pcmcia_device *link) * structures are freed. Otherwise, the structures will be freed * when the device is released. */ -static void netwave_detach(struct pcmcia_device *link) +static void netwave_detach(struct pcmcia_device *p_dev) { + dev_link_t *link = dev_to_instance(p_dev); struct net_device *dev = link->priv; DEBUG(0, "netwave_detach(0x%p)\n", link); - netwave_release(link); + if (link->state & DEV_CONFIG) + netwave_release(link); - if (link->dev_node) + if (link->dev) unregister_netdev(dev); free_netdev(dev); @@ -732,7 +745,8 @@ static const struct iw_handler_def netwave_handler_def = #define CS_CHECK(fn, ret) \ do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0) -static int netwave_pcmcia_config(struct pcmcia_device *link) { +static void netwave_pcmcia_config(dev_link_t *link) { + client_handle_t handle = link->handle; struct net_device *dev = link->priv; netwave_private *priv = netdev_priv(dev); tuple_t tuple; @@ -754,12 +768,15 @@ static int netwave_pcmcia_config(struct pcmcia_device *link) { tuple.TupleDataMax = 64; tuple.TupleOffset = 0; tuple.DesiredTuple = CISTPL_CONFIG; - 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)); + CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple)); + CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple)); + CS_CHECK(ParseTuple, pcmcia_parse_tuple(handle, &tuple, &parse)); link->conf.ConfigBase = parse.config.base; link->conf.Present = parse.config.rmask[0]; + /* Configure card */ + link->state |= DEV_CONFIG; + /* * Try allocating IO ports. This tries a few fixed addresses. * If you want, you can also read the card's config table to @@ -767,11 +784,11 @@ static int netwave_pcmcia_config(struct pcmcia_device *link) { */ for (i = j = 0x0; j < 0x400; j += 0x20) { link->io.BasePort1 = j ^ 0x300; - i = pcmcia_request_io(link, &link->io); + i = pcmcia_request_io(link->handle, &link->io); if (i == CS_SUCCESS) break; } if (i != CS_SUCCESS) { - cs_error(link, RequestIO, i); + cs_error(link->handle, RequestIO, i); goto failed; } @@ -779,16 +796,16 @@ static int netwave_pcmcia_config(struct pcmcia_device *link) { * Now allocate an interrupt line. Note that this does not * actually assign a handler to the interrupt. */ - CS_CHECK(RequestIRQ, pcmcia_request_irq(link, &link->irq)); + CS_CHECK(RequestIRQ, pcmcia_request_irq(handle, &link->irq)); /* * This actually configures the PCMCIA socket -- setting up * the I/O windows and the interrupt mapping. */ - CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link, &link->conf)); + CS_CHECK(RequestConfiguration, pcmcia_request_configuration(handle, &link->conf)); /* - * Allocate a 32K memory window. Note that the struct pcmcia_device + * Allocate a 32K memory window. Note that the dev_link_t * structure provides space for one window handle -- if your * device needs several windows, you'll need to keep track of * the handles in your private data structure, dev->priv. @@ -798,7 +815,7 @@ static int netwave_pcmcia_config(struct pcmcia_device *link) { req.Attributes = WIN_DATA_WIDTH_8|WIN_MEMORY_TYPE_CM|WIN_ENABLE; req.Base = 0; req.Size = 0x8000; req.AccessSpeed = mem_speed; - CS_CHECK(RequestWindow, pcmcia_request_window(&link, &req, &link->win)); + CS_CHECK(RequestWindow, pcmcia_request_window(&link->handle, &req, &link->win)); mem.CardOffset = 0x20000; mem.Page = 0; CS_CHECK(MapMemPage, pcmcia_map_mem_page(link->win, &mem)); @@ -808,7 +825,7 @@ static int netwave_pcmcia_config(struct pcmcia_device *link) { dev->irq = link->irq.AssignedIRQ; dev->base_addr = link->io.BasePort1; - SET_NETDEV_DEV(dev, &handle_to_dev(link)); + SET_NETDEV_DEV(dev, &handle_to_dev(handle)); if (register_netdev(dev) != 0) { printk(KERN_DEBUG "netwave_cs: register_netdev() failed\n"); @@ -816,7 +833,8 @@ static int netwave_pcmcia_config(struct pcmcia_device *link) { } strcpy(priv->node.dev_name, dev->name); - link->dev_node = &priv->node; + link->dev = &priv->node; + link->state &= ~DEV_CONFIG_PENDING; /* Reset card before reading physical address */ netwave_doreset(dev->base_addr, ramBase); @@ -836,13 +854,12 @@ static int netwave_pcmcia_config(struct pcmcia_device *link) { printk(KERN_DEBUG "Netwave_reset: revision %04x %04x\n", get_uint16(ramBase + NETWAVE_EREG_ARW), get_uint16(ramBase + NETWAVE_EREG_ARW+2)); - return 0; + return; cs_failed: - cs_error(link, last_fn, last_ret); + cs_error(link->handle, last_fn, last_ret); failed: netwave_release(link); - return -ENODEV; } /* netwave_pcmcia_config */ /* @@ -852,35 +869,52 @@ failed: * device, and release the PCMCIA configuration. If the device is * still open, this will be postponed until it is closed. */ -static void netwave_release(struct pcmcia_device *link) +static void netwave_release(dev_link_t *link) { - struct net_device *dev = link->priv; - netwave_private *priv = netdev_priv(dev); + struct net_device *dev = link->priv; + netwave_private *priv = netdev_priv(dev); - DEBUG(0, "netwave_release(0x%p)\n", link); + DEBUG(0, "netwave_release(0x%p)\n", link); - pcmcia_disable_device(link); - if (link->win) - iounmap(priv->ramBase); + /* Don't bother checking to see if these succeed or not */ + if (link->win) { + iounmap(priv->ramBase); + pcmcia_release_window(link->win); + } + pcmcia_release_configuration(link->handle); + pcmcia_release_io(link->handle, &link->io); + pcmcia_release_irq(link->handle, &link->irq); + + link->state &= ~DEV_CONFIG; } -static int netwave_suspend(struct pcmcia_device *link) +static int netwave_suspend(struct pcmcia_device *p_dev) { + dev_link_t *link = dev_to_instance(p_dev); struct net_device *dev = link->priv; - if (link->open) - netif_device_detach(dev); + link->state |= DEV_SUSPEND; + if (link->state & DEV_CONFIG) { + if (link->open) + netif_device_detach(dev); + pcmcia_release_configuration(link->handle); + } return 0; } -static int netwave_resume(struct pcmcia_device *link) +static int netwave_resume(struct pcmcia_device *p_dev) { + dev_link_t *link = dev_to_instance(p_dev); struct net_device *dev = link->priv; - if (link->open) { - netwave_reset(dev); - netif_device_attach(dev); + link->state &= ~DEV_SUSPEND; + if (link->state & DEV_CONFIG) { + pcmcia_request_configuration(link->handle, &link->conf); + if (link->open) { + netwave_reset(dev); + netif_device_attach(dev); + } } return 0; @@ -1087,7 +1121,7 @@ static irqreturn_t netwave_interrupt(int irq, void* dev_id, struct pt_regs *regs u_char __iomem *ramBase; struct net_device *dev = (struct net_device *)dev_id; struct netwave_private *priv = netdev_priv(dev); - struct pcmcia_device *link = priv->p_dev; + dev_link_t *link = &priv->link; int i; if (!netif_device_present(dev)) @@ -1106,7 +1140,7 @@ static irqreturn_t netwave_interrupt(int irq, void* dev_id, struct pt_regs *regs status = inb(iobase + NETWAVE_REG_ASR); - if (!pcmcia_dev_present(link)) { + if (!DEV_OK(link)) { DEBUG(1, "netwave_interrupt: Interrupt with status 0x%x " "from removed or suspended card!\n", status); break; @@ -1341,11 +1375,11 @@ static int netwave_rx(struct net_device *dev) static int netwave_open(struct net_device *dev) { netwave_private *priv = netdev_priv(dev); - struct pcmcia_device *link = priv->p_dev; + dev_link_t *link = &priv->link; DEBUG(1, "netwave_open: starting.\n"); - if (!pcmcia_dev_present(link)) + if (!DEV_OK(link)) return -ENODEV; link->open++; @@ -1358,7 +1392,7 @@ static int netwave_open(struct net_device *dev) { static int netwave_close(struct net_device *dev) { netwave_private *priv = netdev_priv(dev); - struct pcmcia_device *link = priv->p_dev; + dev_link_t *link = &priv->link; DEBUG(1, "netwave_close: finishing.\n"); @@ -1379,7 +1413,7 @@ static struct pcmcia_driver netwave_driver = { .drv = { .name = "netwave_cs", }, - .probe = netwave_probe, + .probe = netwave_attach, .remove = netwave_detach, .id_table = netwave_ids, .suspend = netwave_suspend, diff --git a/drivers/net/wireless/orinoco.c b/drivers/net/wireless/orinoco.c index 317ace7f9..6fd0bf736 100644 --- a/drivers/net/wireless/orinoco.c +++ b/drivers/net/wireless/orinoco.c @@ -76,6 +76,7 @@ #define DRIVER_NAME "orinoco" +#include #include #include #include @@ -200,12 +201,41 @@ static struct { /* Data types */ /********************************************************************/ -/* Beginning of the Tx descriptor, used in TxExc handling */ -struct hermes_txexc_data { - struct hermes_tx_descriptor desc; +/* 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 */ __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 */ @@ -360,7 +390,7 @@ static struct iw_statistics *orinoco_get_wireless_stats(struct net_device *dev) } } else { struct { - __le16 qual, signal, noise, unused; + __le16 qual, signal, noise; } __attribute__ ((packed)) cq; err = HERMES_READ_RECORD(hw, USER_BAP, @@ -420,39 +450,53 @@ 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 data_off; + int len, data_len, 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); - return NETDEV_TX_BUSY; + TRACE_EXIT(dev->name); + return 1; } if (netif_queue_stopped(dev)) { printk(KERN_DEBUG "%s: Tx while transmitter busy!\n", dev->name); - return NETDEV_TX_BUSY; + TRACE_EXIT(dev->name); + return 1; } if (orinoco_lock(priv, &flags) != 0) { printk(KERN_ERR "%s: orinoco_xmit() called while hw_unavailable\n", dev->name); - return NETDEV_TX_BUSY; + TRACE_EXIT(dev->name); + return 1; } 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). */ - goto drop; + stats->tx_errors++; + orinoco_unlock(priv, &flags); + dev_kfree_skb(skb); + TRACE_EXIT(dev->name); + return 0; } - /* Check packet length */ - if (skb->len < ETH_HLEN) - 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; eh = (struct ethhdr *)skb->data; @@ -463,7 +507,8 @@ 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); - goto busy; + stats->tx_errors++; + goto fail; } /* Clear the 802.11 header and data length fields - some @@ -474,38 +519,50 @@ 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 { - 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); + 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); if (err) { if (net_ratelimit()) printk(KERN_ERR "%s: Error %d writing packet " "header to BAP\n", dev->name, err); - goto busy; + stats->tx_errors++; + goto fail; } + /* 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(hw, USER_BAP, skb->data, skb->len, + err = hermes_bap_pwrite_pad(hw, USER_BAP, p, data_len, len, txfid, data_off); if (err) { printk(KERN_ERR "%s: Error %d writing packet to BAP\n", dev->name, err); - goto busy; + stats->tx_errors++; + goto fail; } /* Finally, we actually initiate the send */ @@ -518,27 +575,25 @@ 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); - goto busy; + stats->tx_errors++; + goto fail; } dev->trans_start = jiffies; - stats->tx_bytes += data_off + skb->len; - goto ok; + stats->tx_bytes += data_off + data_len; - drop: - stats->tx_errors++; - stats->tx_dropped++; - - ok: orinoco_unlock(priv, &flags); + dev_kfree_skb(skb); - return NETDEV_TX_OK; - busy: - if (err == -EIO) - schedule_work(&priv->reset_work); + TRACE_EXIT(dev->name); + + return 0; + fail: + TRACE_EXIT(dev->name); + orinoco_unlock(priv, &flags); - return NETDEV_TX_BUSY; + return err; } static void __orinoco_ev_alloc(struct net_device *dev, hermes_t *hw) @@ -574,7 +629,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_txexc_data hdr; + struct hermes_tx_descriptor_802_11 hdr; int err = 0; if (fid == DUMMY_FID) @@ -582,7 +637,8 @@ 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, - sizeof(struct hermes_txexc_data), + offsetof(struct hermes_tx_descriptor_802_11, + addr2), fid, 0); hermes_write_regn(hw, TXCOMPLFID, DUMMY_FID); @@ -602,7 +658,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.desc.status); + status = le16_to_cpu(hdr.status); if (status & (HERMES_TXSTAT_RETRYERR | HERMES_TXSTAT_AGEDERR)) { union iwreq_data wrqu; @@ -756,6 +812,7 @@ static void orinoco_rx_monitor(struct net_device *dev, u16 rxfid, if (datalen > IEEE80211_DATA_LEN + 12) { printk(KERN_DEBUG "%s: oversized monitor frame, " "data length = %d\n", dev->name, datalen); + err = -EIO; stats->rx_length_errors++; goto update_stats; } @@ -764,7 +821,8 @@ static void orinoco_rx_monitor(struct net_device *dev, u16 rxfid, if (!skb) { printk(KERN_WARNING "%s: Cannot allocate skb for monitor frame\n", dev->name); - goto update_stats; + err = -ENOMEM; + goto drop; } /* Copy the 802.11 header to the skb */ @@ -1342,12 +1400,16 @@ int __orinoco_down(struct net_device *dev) return 0; } -static int orinoco_allocate_fid(struct net_device *dev) +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) + 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 */ @@ -1366,19 +1428,6 @@ static int orinoco_allocate_fid(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; @@ -1786,9 +1835,7 @@ static int __orinoco_program_rids(struct net_device *dev) /* Set promiscuity / multicast*/ priv->promiscuous = 0; priv->mc_count = 0; - - /* FIXME: what about netif_tx_lock */ - __orinoco_set_multicast_list(dev); + __orinoco_set_multicast_list(dev); /* FIXME: what about the xmit_lock */ return 0; } @@ -2227,12 +2274,14 @@ 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 = hermes_init(hw); + err = orinoco_reinit_firmware(dev); if (err != 0) { printk(KERN_ERR "%s: failed to initialize firmware (err = %d)\n", dev->name, err); @@ -2290,13 +2339,6 @@ 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); @@ -2387,6 +2429,7 @@ static int orinoco_init(struct net_device *dev) printk(KERN_DEBUG "%s: ready\n", dev->name); out: + TRACE_EXIT(dev->name); return err; } @@ -2754,6 +2797,8 @@ 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)); @@ -2843,6 +2888,8 @@ 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; } @@ -2875,7 +2922,7 @@ static int orinoco_ioctl_setiwencode(struct net_device *dev, if (orinoco_lock(priv, &flags) != 0) return -EBUSY; - if (erq->length > 0) { + if (erq->pointer) { if ((index < 0) || (index >= ORINOCO_MAX_KEYS)) index = priv->tx_key; @@ -2918,7 +2965,7 @@ static int orinoco_ioctl_setiwencode(struct net_device *dev, if (erq->flags & IW_ENCODE_RESTRICTED) restricted = 1; - if (erq->pointer && erq->length > 0) { + if (erq->pointer) { priv->keys[index].len = cpu_to_le16(xlen); memset(priv->keys[index].data, 0, sizeof(priv->keys[index].data)); @@ -3024,6 +3071,8 @@ 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) @@ -3038,6 +3087,8 @@ static int orinoco_ioctl_getessid(struct net_device *dev, erq->flags = 1; erq->length = strlen(essidbuf) + 1; + TRACE_EXIT(dev->name); + return 0; } @@ -3807,7 +3858,7 @@ static int orinoco_ioctl_setscan(struct net_device *dev, unsigned long flags; /* Note : you may have realised that, as this is a SET operation, - * this is privileged and therefore a normal user can't + * this is priviledged and therefore a normal user can't * perform scanning. * This is not an error, while the device perform scanning, * traffic doesn't flow, so it's a perfect DoS... @@ -4297,6 +4348,69 @@ 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 16db3e14b..f5d856db9 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.15" +#define DRIVER_VERSION "0.15rc3" #include #include @@ -30,6 +30,20 @@ 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, @@ -118,6 +132,9 @@ 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 bc14689cb..ec6f2a488 100644 --- a/drivers/net/wireless/orinoco_cs.c +++ b/drivers/net/wireless/orinoco_cs.c @@ -13,6 +13,7 @@ #define DRIVER_NAME "orinoco_cs" #define PFX DRIVER_NAME ": " +#include #include #include #include @@ -48,7 +49,7 @@ MODULE_PARM_DESC(ignore_cis_vcc, "Allow voltage mismatch between card and socket /* PCMCIA specific device information (goes in the card field of * struct orinoco_private */ struct orinoco_pccard { - struct pcmcia_device *p_dev; + dev_link_t link; dev_node_t node; /* Used to handle hard reset */ @@ -62,8 +63,8 @@ struct orinoco_pccard { /* Function prototypes */ /********************************************************************/ -static int orinoco_cs_config(struct pcmcia_device *link); -static void orinoco_cs_release(struct pcmcia_device *link); +static void orinoco_cs_config(dev_link_t *link); +static void orinoco_cs_release(dev_link_t *link); static void orinoco_cs_detach(struct pcmcia_device *p_dev); /********************************************************************/ @@ -74,13 +75,13 @@ static int orinoco_cs_hard_reset(struct orinoco_private *priv) { struct orinoco_pccard *card = priv->card; - struct pcmcia_device *link = card->p_dev; + dev_link_t *link = &card->link; int err; /* We need atomic ops here, because we're not holding the lock */ set_bit(0, &card->hard_reset_in_progress); - err = pcmcia_reset_card(link, NULL); + err = pcmcia_reset_card(link->handle, NULL); if (err) return err; @@ -103,11 +104,12 @@ orinoco_cs_hard_reset(struct orinoco_private *priv) * configure the card at this point -- we wait until we receive a card * insertion event. */ static int -orinoco_cs_probe(struct pcmcia_device *link) +orinoco_cs_attach(struct pcmcia_device *p_dev) { struct net_device *dev; struct orinoco_private *priv; struct orinoco_pccard *card; + dev_link_t *link; dev = alloc_orinocodev(sizeof(*card), orinoco_cs_hard_reset); if (! dev) @@ -116,7 +118,7 @@ orinoco_cs_probe(struct pcmcia_device *link) card = priv->card; /* Link both structures together */ - card->p_dev = link; + link = &card->link; link->priv = dev; /* Interrupt setup */ @@ -133,7 +135,16 @@ orinoco_cs_probe(struct pcmcia_device *link) link->conf.Attributes = 0; link->conf.IntType = INT_MEMORY_AND_IO; - return orinoco_cs_config(link); + /* Register with Card Services */ + link->next = NULL; + + link->handle = p_dev; + p_dev->instance = link; + + link->state |= DEV_PRESENT | DEV_CONFIG_PENDING; + orinoco_cs_config(link); + + return 0; } /* orinoco_cs_attach */ /* @@ -142,15 +153,20 @@ orinoco_cs_probe(struct pcmcia_device *link) * are freed. Otherwise, the structures will be freed when the device * is released. */ -static void orinoco_cs_detach(struct pcmcia_device *link) +static void orinoco_cs_detach(struct pcmcia_device *p_dev) { + dev_link_t *link = dev_to_instance(p_dev); struct net_device *dev = link->priv; - if (link->dev_node) - unregister_netdev(dev); - - orinoco_cs_release(link); + if (link->state & DEV_CONFIG) + orinoco_cs_release(link); + DEBUG(0, PFX "detach: link=%p link->dev=%p\n", link, link->dev); + if (link->dev) { + DEBUG(0, PFX "About to unregister net device %p\n", + dev); + unregister_netdev(dev); + } free_orinocodev(dev); } /* orinoco_cs_detach */ @@ -164,20 +180,24 @@ static void orinoco_cs_detach(struct pcmcia_device *link) last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; \ } while (0) -static int -orinoco_cs_config(struct pcmcia_device *link) +static void +orinoco_cs_config(dev_link_t *link) { struct net_device *dev = link->priv; + client_handle_t handle = link->handle; struct orinoco_private *priv = netdev_priv(dev); struct orinoco_pccard *card = priv->card; hermes_t *hw = &priv->hw; 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(handle, &info)); + /* * This reads the card's CONFIG tuple to find its * configuration registers. @@ -187,15 +207,19 @@ orinoco_cs_config(struct pcmcia_device *link) tuple.TupleData = buf; tuple.TupleDataMax = sizeof(buf); tuple.TupleOffset = 0; - 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)); + CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple)); + CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple)); + CS_CHECK(ParseTuple, pcmcia_parse_tuple(handle, &tuple, &parse)); link->conf.ConfigBase = parse.config.base; link->conf.Present = parse.config.rmask[0]; + /* Configure card */ + link->state |= DEV_CONFIG; + /* Look up the current Vcc */ CS_CHECK(GetConfigurationInfo, - pcmcia_get_configuration_info(link, &conf)); + pcmcia_get_configuration_info(handle, &conf)); + link->conf.Vcc = conf.Vcc; /* * In this loop, we scan the CIS for configuration table @@ -212,13 +236,13 @@ orinoco_cs_config(struct pcmcia_device *link) * implementation-defined details. */ tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY; - CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(link, &tuple)); + CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple)); while (1) { cistpl_cftable_entry_t *cfg = &(parse.cftable_entry); cistpl_cftable_entry_t dflt = { .index = 0 }; - if ( (pcmcia_get_tuple_data(link, &tuple) != 0) - || (pcmcia_parse_tuple(link, &tuple, &parse) != 0)) + if ( (pcmcia_get_tuple_data(handle, &tuple) != 0) + || (pcmcia_parse_tuple(handle, &tuple, &parse) != 0)) goto next_entry; if (cfg->flags & CISTPL_CFTABLE_DEFAULT) @@ -227,6 +251,12 @@ 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)) { @@ -244,10 +274,10 @@ orinoco_cs_config(struct pcmcia_device *link) } if (cfg->vpp1.present & (1 << CISTPL_POWER_VNOM)) - link->conf.Vpp = + link->conf.Vpp1 = link->conf.Vpp2 = cfg->vpp1.param[CISTPL_POWER_VNOM] / 10000; else if (dflt.vpp1.present & (1 << CISTPL_POWER_VNOM)) - link->conf.Vpp = + link->conf.Vpp1 = link->conf.Vpp2 = dflt.vpp1.param[CISTPL_POWER_VNOM] / 10000; /* Do we need to allocate an interrupt? */ @@ -277,7 +307,7 @@ orinoco_cs_config(struct pcmcia_device *link) } /* This reserves IO space but doesn't actually enable it */ - if (pcmcia_request_io(link, &link->io) != 0) + if (pcmcia_request_io(link->handle, &link->io) != 0) goto next_entry; } @@ -287,8 +317,9 @@ orinoco_cs_config(struct pcmcia_device *link) break; next_entry: - pcmcia_disable_device(link); - last_ret = pcmcia_get_next_tuple(link, &tuple); + if (link->io.NumPorts1) + pcmcia_release_io(link->handle, &link->io); + last_ret = pcmcia_get_next_tuple(handle, &tuple); if (last_ret == CS_NO_MORE_ITEMS) { printk(KERN_ERR PFX "GetNextTuple(): No matching " "CIS configuration. Maybe you need the " @@ -302,7 +333,7 @@ orinoco_cs_config(struct pcmcia_device *link) * a handler to the interrupt, unless the 'Handler' member of * the irq structure is initialized. */ - CS_CHECK(RequestIRQ, pcmcia_request_irq(link, &link->irq)); + CS_CHECK(RequestIRQ, pcmcia_request_irq(link->handle, &link->irq)); /* We initialize the hermes structure before completing PCMCIA * configuration just in case the interrupt handler gets @@ -319,7 +350,7 @@ orinoco_cs_config(struct pcmcia_device *link) * card and host interface into "Memory and IO" mode. */ CS_CHECK(RequestConfiguration, - pcmcia_request_configuration(link, &link->conf)); + pcmcia_request_configuration(link->handle, &link->conf)); /* Ok, we have the configuration, prepare to register the netdev */ dev->base_addr = link->io.BasePort1; @@ -327,7 +358,7 @@ orinoco_cs_config(struct pcmcia_device *link) SET_MODULE_OWNER(dev); card->node.major = card->node.minor = 0; - SET_NETDEV_DEV(dev, &handle_to_dev(link)); + SET_NETDEV_DEV(dev, &handle_to_dev(handle)); /* Tell the stack we exist */ if (register_netdev(dev) != 0) { printk(KERN_ERR PFX "register_netdev() failed\n"); @@ -335,26 +366,36 @@ orinoco_cs_config(struct pcmcia_device *link) } /* At this point, the dev_node_t structure(s) needs to be - * initialized and arranged in a linked list at link->dev_node. */ + * initialized and arranged in a linked list at link->dev. */ strcpy(card->node.dev_name, dev->name); - link->dev_node = &card->node; /* link->dev_node being non-NULL is also + link->dev = &card->node; /* link->dev being non-NULL is also used to indicate that the net_device has been registered */ + link->state &= ~DEV_CONFIG_PENDING; /* Finally, report what we've done */ - 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; + printk(KERN_DEBUG "%s: index 0x%02x: Vcc %d.%d", + dev->name, link->conf.ConfigIndex, + link->conf.Vcc / 10, link->conf.Vcc % 10); + if (link->conf.Vpp1) + printk(", Vpp %d.%d", link->conf.Vpp1 / 10, + link->conf.Vpp1 % 10); + printk(", irq %d", link->irq.AssignedIRQ); + 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"); + + return; cs_failed: - cs_error(link, last_fn, last_ret); + cs_error(link->handle, last_fn, last_ret); failed: orinoco_cs_release(link); - return -ENODEV; } /* orinoco_cs_config */ /* @@ -363,7 +404,7 @@ orinoco_cs_config(struct pcmcia_device *link) * still open, this will be postponed until it is closed. */ static void -orinoco_cs_release(struct pcmcia_device *link) +orinoco_cs_release(dev_link_t *link) { struct net_device *dev = link->priv; struct orinoco_private *priv = netdev_priv(dev); @@ -375,70 +416,91 @@ orinoco_cs_release(struct pcmcia_device *link) priv->hw_unavailable++; spin_unlock_irqrestore(&priv->lock, flags); - pcmcia_disable_device(link); + /* Don't bother checking to see if these succeed or not */ + 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 (priv->hw.iobase) ioport_unmap(priv->hw.iobase); } /* orinoco_cs_release */ -static int orinoco_cs_suspend(struct pcmcia_device *link) +static int orinoco_cs_suspend(struct pcmcia_device *p_dev) { + dev_link_t *link = dev_to_instance(p_dev); struct net_device *dev = link->priv; struct orinoco_private *priv = netdev_priv(dev); struct orinoco_pccard *card = priv->card; int err = 0; unsigned long flags; - /* This is probably racy, but I can't think of - a better way, short of rewriting the PCMCIA - layer to not suck :-( */ - if (! test_bit(0, &card->hard_reset_in_progress)) { - spin_lock_irqsave(&priv->lock, flags); + link->state |= DEV_SUSPEND; + if (link->state & DEV_CONFIG) { + /* This is probably racy, but I can't think of + a better way, short of rewriting the PCMCIA + layer to not suck :-( */ + if (! test_bit(0, &card->hard_reset_in_progress)) { + spin_lock_irqsave(&priv->lock, flags); + + err = __orinoco_down(dev); + if (err) + printk(KERN_WARNING "%s: Error %d downing interface\n", + dev->name, err); - err = __orinoco_down(dev); - if (err) - printk(KERN_WARNING "%s: Error %d downing interface\n", - dev->name, err); + netif_device_detach(dev); + priv->hw_unavailable++; - netif_device_detach(dev); - priv->hw_unavailable++; + spin_unlock_irqrestore(&priv->lock, flags); + } - spin_unlock_irqrestore(&priv->lock, flags); + pcmcia_release_configuration(link->handle); } return 0; } -static int orinoco_cs_resume(struct pcmcia_device *link) +static int orinoco_cs_resume(struct pcmcia_device *p_dev) { + dev_link_t *link = dev_to_instance(p_dev); struct net_device *dev = link->priv; 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); - if (err) { - printk(KERN_ERR "%s: Error %d re-initializing firmware\n", - dev->name, err); - return -EIO; - } + link->state &= ~DEV_SUSPEND; + if (link->state & DEV_CONFIG) { + /* FIXME: should we double check that this is + * the same card as we had before */ + pcmcia_request_configuration(link->handle, &link->conf); + + if (! test_bit(0, &card->hard_reset_in_progress)) { + err = orinoco_reinit_firmware(dev); + if (err) { + printk(KERN_ERR "%s: Error %d re-initializing firmware\n", + dev->name, err); + return -EIO; + } - spin_lock(&priv->lock); + spin_lock_irqsave(&priv->lock, flags); - netif_device_attach(dev); - priv->hw_unavailable--; + 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\n", - dev->name, err); - } + if (priv->open && ! priv->hw_unavailable) { + err = __orinoco_up(dev); + if (err) + printk(KERN_ERR "%s: Error %d restarting card\n", + dev->name, err); + } - spin_unlock(&priv->lock); + spin_unlock_irqrestore(&priv->lock, flags); + } } - return err; + return 0; } @@ -542,7 +604,7 @@ static struct pcmcia_driver orinoco_driver = { .drv = { .name = DRIVER_NAME, }, - .probe = orinoco_cs_probe, + .probe = orinoco_cs_attach, .remove = orinoco_cs_detach, .id_table = orinoco_cs_ids, .suspend = orinoco_cs_suspend, diff --git a/drivers/net/wireless/orinoco_nortel.c b/drivers/net/wireless/orinoco_nortel.c index bf05b9077..d1a670b35 100644 --- a/drivers/net/wireless/orinoco_nortel.c +++ b/drivers/net/wireless/orinoco_nortel.c @@ -1,8 +1,9 @@ /* 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 @@ -40,6 +41,7 @@ #define DRIVER_NAME "orinoco_nortel" #define PFX DRIVER_NAME ": " +#include #include #include #include @@ -48,62 +50,67 @@ #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 card using the Configuration Option Register + * Do a soft reset of the PCI 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 orinoco_nortel_cor_reset(struct orinoco_private *priv) +static int nortel_pci_cor_reset(struct orinoco_private *priv) { - struct orinoco_pci_card *card = priv->card; + struct nortel_pci_card *card = priv->card; - /* 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); + /* 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); mdelay(1); /* Give time for the card to recover from this hard effort */ - iowrite16(0, card->attr_io + COR_OFFSET); - iowrite16(0, card->attr_io + COR_OFFSET); + outw_p(0, card->iobase2 + COR_OFFSET); + outw_p(0, card->iobase2 + COR_OFFSET); mdelay(1); - /* Set COR as usual */ - iowrite16(COR_VALUE, card->attr_io + COR_OFFSET); - iowrite16(COR_VALUE, card->attr_io + COR_OFFSET); + /* set COR as usual */ + outw_p(COR_VALUE, card->iobase2 + COR_OFFSET); + outw_p(COR_VALUE, card->iobase2 + COR_OFFSET); mdelay(1); - iowrite16(0x228, card->bridge_io + 2); + outw_p(0x228, card->iobase1 + 2); return 0; } -static int orinoco_nortel_hw_init(struct orinoco_pci_card *card) +static int nortel_pci_hw_init(struct nortel_pci_card *card) { int i; u32 reg; - /* Setup bridge */ - if (ioread16(card->bridge_io) & 1) { + /* setup bridge */ + if (inw(card->iobase1) & 1) { printk(KERN_ERR PFX "brg1 answer1 wrong\n"); return -EBUSY; } - iowrite16(0x118, card->bridge_io + 2); - iowrite16(0x108, card->bridge_io + 2); + outw_p(0x118, card->iobase1 + 2); + outw_p(0x108, card->iobase1 + 2); mdelay(30); - iowrite16(0x8, card->bridge_io + 2); + outw_p(0x8, card->iobase1 + 2); for (i = 0; i < 30; i++) { mdelay(30); - if (ioread16(card->bridge_io) & 0x10) { + if (inw(card->iobase1) & 0x10) { break; } } @@ -111,42 +118,42 @@ static int orinoco_nortel_hw_init(struct orinoco_pci_card *card) printk(KERN_ERR PFX "brg1 timed out\n"); return -EBUSY; } - if (ioread16(card->attr_io + COR_OFFSET) & 1) { + if (inw(card->iobase2 + 0xe0) & 1) { printk(KERN_ERR PFX "brg2 answer1 wrong\n"); return -EBUSY; } - if (ioread16(card->attr_io + COR_OFFSET + 2) & 1) { + if (inw(card->iobase2 + 0xe2) & 1) { printk(KERN_ERR PFX "brg2 answer2 wrong\n"); return -EBUSY; } - if (ioread16(card->attr_io + COR_OFFSET + 4) & 1) { + if (inw(card->iobase2 + 0xe4) & 1) { printk(KERN_ERR PFX "brg2 answer3 wrong\n"); return -EBUSY; } - /* Set the PCMCIA COR register */ - iowrite16(COR_VALUE, card->attr_io + COR_OFFSET); + /* set the PCMCIA COR-Register */ + outw_p(COR_VALUE, card->iobase2 + COR_OFFSET); mdelay(1); - reg = ioread16(card->attr_io + COR_OFFSET); + reg = inw(card->iobase2 + COR_OFFSET); if (reg != COR_VALUE) { printk(KERN_ERR PFX "Error setting COR value (reg=%x)\n", reg); return -EBUSY; } - /* Set LEDs */ - iowrite16(1, card->bridge_io + 10); + /* set leds */ + outw_p(1, card->iobase1 + 10); return 0; } -static int orinoco_nortel_init_one(struct pci_dev *pdev, - const struct pci_device_id *ent) +static int nortel_pci_init_one(struct pci_dev *pdev, + const struct pci_device_id *ent) { int err; struct orinoco_private *priv; - struct orinoco_pci_card *card; + struct nortel_pci_card *card; struct net_device *dev; - void __iomem *hermes_io, *bridge_io, *attr_io; + void __iomem *iomem; err = pci_enable_device(pdev); if (err) { @@ -155,34 +162,19 @@ static int orinoco_nortel_init_one(struct pci_dev *pdev, } err = pci_request_regions(pdev, DRIVER_NAME); - if (err) { + if (err != 0) { printk(KERN_ERR PFX "Cannot obtain PCI resources\n"); goto fail_resources; } - 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; + iomem = pci_iomap(pdev, 2, 0); + if (!iomem) { + err = -ENOMEM; + goto fail_map_io; } /* Allocate network device */ - dev = alloc_orinocodev(sizeof(*card), orinoco_nortel_cor_reset); + dev = alloc_orinocodev(sizeof(*card), nortel_pci_cor_reset); if (!dev) { printk(KERN_ERR PFX "Cannot allocate network device\n"); err = -ENOMEM; @@ -191,33 +183,39 @@ static int orinoco_nortel_init_one(struct pci_dev *pdev, priv = netdev_priv(dev); card = priv->card; - card->bridge_io = bridge_io; - card->attr_io = attr_io; + card->iobase1 = pci_resource_start(pdev, 0); + card->iobase2 = pci_resource_start(pdev, 1); + dev->base_addr = pci_resource_start(pdev, 2); SET_MODULE_OWNER(dev); SET_NETDEV_DEV(dev, &pdev->dev); - hermes_struct_init(&priv->hw, hermes_io, HERMES_16BIT_REGSPACING); + hermes_struct_init(&priv->hw, iomem, HERMES_16BIT_REGSPACING); - err = request_irq(pdev->irq, orinoco_interrupt, IRQF_SHARED, + 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, 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_nortel_hw_init(card); + err = nortel_pci_hw_init(card); if (err) { printk(KERN_ERR PFX "Hardware initialization failed\n"); goto fail; } - err = orinoco_nortel_cor_reset(priv); + err = nortel_pci_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"); @@ -225,8 +223,6 @@ static int orinoco_nortel_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; @@ -238,15 +234,9 @@ static int orinoco_nortel_init_one(struct pci_dev *pdev, free_orinocodev(dev); fail_alloc: - pci_iounmap(pdev, hermes_io); + pci_iounmap(pdev, iomem); - fail_map_hermes: - pci_iounmap(pdev, attr_io); - - fail_map_attr: - pci_iounmap(pdev, bridge_io); - - fail_map_bridge: + fail_map_io: pci_release_regions(pdev); fail_resources: @@ -255,27 +245,26 @@ static int orinoco_nortel_init_one(struct pci_dev *pdev, return err; } -static void __devexit orinoco_nortel_remove_one(struct pci_dev *pdev) +static void __devexit nortel_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; + struct nortel_pci_card *card = priv->card; - /* Clear LEDs */ - iowrite16(0, card->bridge_io + 10); + /* clear leds */ + outw_p(0, card->iobase1 + 10); unregister_netdev(dev); - free_irq(pdev->irq, dev); + free_irq(dev->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 orinoco_nortel_id_table[] = { + +static struct pci_device_id nortel_pci_id_table[] = { /* Nortel emobility PCI */ {0x126c, 0x8030, PCI_ANY_ID, PCI_ANY_ID,}, /* Symbol LA-4123 PCI */ @@ -283,15 +272,13 @@ static struct pci_device_id orinoco_nortel_id_table[] = { {0,}, }; -MODULE_DEVICE_TABLE(pci, orinoco_nortel_id_table); +MODULE_DEVICE_TABLE(pci, nortel_pci_id_table); -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 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 char version[] __initdata = DRIVER_NAME " " DRIVER_VERSION @@ -301,19 +288,20 @@ MODULE_DESCRIPTION ("Driver for wireless LAN cards using the Nortel PCI bridge"); MODULE_LICENSE("Dual MPL/GPL"); -static int __init orinoco_nortel_init(void) +static int __init nortel_pci_init(void) { printk(KERN_DEBUG "%s\n", version); - return pci_module_init(&orinoco_nortel_driver); + return pci_module_init(&nortel_pci_driver); } -static void __exit orinoco_nortel_exit(void) +static void __exit nortel_pci_exit(void) { - pci_unregister_driver(&orinoco_nortel_driver); + pci_unregister_driver(&nortel_pci_driver); + ssleep(1); } -module_init(orinoco_nortel_init); -module_exit(orinoco_nortel_exit); +module_init(nortel_pci_init); +module_exit(nortel_pci_exit); /* * Local variables: diff --git a/drivers/net/wireless/orinoco_pci.c b/drivers/net/wireless/orinoco_pci.c index 1759c543f..5362c214f 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 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. + * 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 * - * Current maintainers are: + * Current maintainers (as of 29 September 2003) are: * Pavel Roskin * and David Gibson * @@ -41,9 +41,58 @@ * 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 @@ -51,14 +100,12 @@ #include #include "orinoco.h" -#include "orinoco_pci.h" -/* Offset of the COR register of the PCI card */ +/* All the magic there is from wlan-ng */ +/* Magic offset of the reset register of the PCI card */ #define HERMES_PCI_COR (0x26) - -/* Bitmask to reset the card */ +/* Magic 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. */ @@ -66,8 +113,13 @@ #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 card using the Configuration Option Register + * Do a soft reset of the PCI 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 * @@ -79,13 +131,14 @@ * 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 notices */ + /* Assert the reset until the card notice */ hermes_write_regn(hw, PCI_COR, HERMES_PCI_COR_MASK); mdelay(HERMES_PCI_COR_ONT); @@ -110,14 +163,19 @@ static int 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; - struct orinoco_private *priv; + int err = 0; + unsigned long pci_iorange; + u16 __iomem *pci_ioaddr = NULL; + unsigned long pci_iolen; + struct orinoco_private *priv = NULL; struct orinoco_pci_card *card; - struct net_device *dev; - void __iomem *hermes_io; + struct net_device *dev = NULL; err = pci_enable_device(pdev); if (err) { @@ -126,41 +184,50 @@ static int orinoco_pci_init_one(struct pci_dev *pdev, } err = pci_request_regions(pdev, DRIVER_NAME); - if (err) { + if (err != 0) { printk(KERN_ERR PFX "Cannot obtain PCI resources\n"); goto fail_resources; } - 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; + /* 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; } /* Allocate network device */ dev = alloc_orinocodev(sizeof(*card), orinoco_pci_cor_reset); - if (!dev) { - printk(KERN_ERR PFX "Cannot allocate network device\n"); + if (! dev) { 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, hermes_io, HERMES_32BIT_REGSPACING); + 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); - err = request_irq(pdev->irq, orinoco_interrupt, IRQF_SHARED, + err = request_irq(pdev->irq, orinoco_interrupt, SA_SHIRQ, 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"); @@ -169,13 +236,11 @@ static int orinoco_pci_init_one(struct pci_dev *pdev, err = register_netdev(dev); if (err) { - printk(KERN_ERR PFX "Cannot register network device\n"); + printk(KERN_ERR PFX "Failed to register net 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; @@ -187,9 +252,9 @@ static int orinoco_pci_init_one(struct pci_dev *pdev, free_orinocodev(dev); fail_alloc: - pci_iounmap(pdev, hermes_io); + iounmap(pci_ioaddr); - fail_map_hermes: + fail_map: pci_release_regions(pdev); fail_resources: @@ -202,17 +267,87 @@ 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(pdev->irq, dev); + free_irq(dev->irq, dev); pci_set_drvdata(pdev, NULL); free_orinocodev(dev); - pci_iounmap(pdev, priv->hw.iobase); + iounmap(card->pci_ioaddr); pci_release_regions(pdev); pci_disable_device(pdev); } -static struct pci_device_id orinoco_pci_id_table[] = { +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[] = { /* Intersil Prism 3 */ {0x1260, 0x3872, PCI_ANY_ID, PCI_ANY_ID,}, /* Intersil Prism 2.5 */ @@ -222,11 +357,11 @@ static struct pci_device_id orinoco_pci_id_table[] = { {0,}, }; -MODULE_DEVICE_TABLE(pci, orinoco_pci_id_table); +MODULE_DEVICE_TABLE(pci, orinoco_pci_pci_id_table); static struct pci_driver orinoco_pci_driver = { .name = DRIVER_NAME, - .id_table = orinoco_pci_id_table, + .id_table = orinoco_pci_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 7f006f624..210e73776 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 are: + * Current maintainers (as of 29 September 2003) are: * Pavel Roskin * and David Gibson * @@ -30,18 +30,38 @@ * 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 * - * Here's the general details on how the PLX9052 adapter works: + * 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: * * - 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 attribute space + * - One PCI memory address space, mapped to the PCMCIA memory space * (containing the CIS). * - * 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 + * 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 * 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 @@ -51,7 +71,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, in case you have an unexpected + * sure it actually got set to 0x41, incase you have an unexpected * card inserted. * * Following that, you can treat the second PCI I/O address space (the @@ -81,11 +101,22 @@ * 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 @@ -94,7 +125,6 @@ #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 */ @@ -104,20 +134,30 @@ #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_pci_card *card = priv->card; + struct orinoco_plx_card *card = priv->card; + u8 __iomem *attr_mem = card->attr_mem; unsigned long timeout; u16 reg; - iowrite8(COR_VALUE | COR_RESET, card->attr_io + COR_OFFSET); + writeb(COR_VALUE | COR_RESET, attr_mem + COR_OFFSET); mdelay(1); - iowrite8(COR_VALUE, card->attr_io + COR_OFFSET); + writeb(COR_VALUE, attr_mem + COR_OFFSET); mdelay(1); /* Just in case, wait more until the card is no longer busy */ @@ -128,7 +168,7 @@ static int orinoco_plx_cor_reset(struct orinoco_private *priv) reg = hermes_read_regn(hw, CMD); } - /* Still busy? */ + /* Did we timeout ? */ if (reg & HERMES_CMD_BUSY) { printk(KERN_ERR PFX "Busy timeout\n"); return -ETIMEDOUT; @@ -137,55 +177,20 @@ 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; - struct orinoco_private *priv; - struct orinoco_pci_card *card; - struct net_device *dev; - void __iomem *hermes_io, *attr_io, *bridge_io; + 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; err = pci_enable_device(pdev); if (err) { @@ -194,30 +199,30 @@ static int orinoco_plx_init_one(struct pci_dev *pdev, } err = pci_request_regions(pdev, DRIVER_NAME); - if (err) { + if (err != 0) { printk(KERN_ERR PFX "Cannot obtain PCI resources\n"); goto fail_resources; } - 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 1 is mapped to PLX-specific registers */ + plx_addr = pci_resource_start(pdev, 1); - attr_io = pci_iomap(pdev, 2, 0); - if (!attr_io) { - printk(KERN_ERR PFX "Cannot map PCMCIA attributes\n"); - err = -EIO; + /* 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"); goto fail_map_attr; } - 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; + /* 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; } /* Allocate network device */ @@ -230,25 +235,38 @@ static int orinoco_plx_init_one(struct pci_dev *pdev, priv = netdev_priv(dev); card = priv->card; - card->bridge_io = bridge_io; - card->attr_io = attr_io; + card->attr_mem = attr_mem; + dev->base_addr = pccard_ioaddr; SET_MODULE_OWNER(dev); SET_NETDEV_DEV(dev, &pdev->dev); - hermes_struct_init(&priv->hw, hermes_io, HERMES_16BIT_REGSPACING); + hermes_struct_init(&priv->hw, mem, HERMES_16BIT_REGSPACING); - err = request_irq(pdev->irq, orinoco_interrupt, IRQF_SHARED, + 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, 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_plx_hw_init(card); - if (err) { - printk(KERN_ERR PFX "Hardware initialization failed\n"); - goto fail; + /* 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_cor_reset(priv); @@ -257,6 +275,23 @@ 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"); @@ -264,8 +299,6 @@ 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; @@ -277,15 +310,12 @@ static int orinoco_plx_init_one(struct pci_dev *pdev, free_orinocodev(dev); fail_alloc: - pci_iounmap(pdev, hermes_io); + pci_iounmap(pdev, mem); - fail_map_hermes: - pci_iounmap(pdev, attr_io); + fail_map_io: + iounmap(attr_mem); fail_map_attr: - pci_iounmap(pdev, bridge_io); - - fail_map_bridge: pci_release_regions(pdev); fail_resources: @@ -298,20 +328,23 @@ 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_pci_card *card = priv->card; + struct orinoco_plx_card *card = priv->card; + u8 __iomem *attr_mem = card->attr_mem; + + BUG_ON(! dev); unregister_netdev(dev); - free_irq(pdev->irq, dev); + free_irq(dev->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); + iounmap(attr_mem); pci_release_regions(pdev); pci_disable_device(pdev); } -static struct pci_device_id orinoco_plx_id_table[] = { + +static struct pci_device_id orinoco_plx_pci_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? */ @@ -329,15 +362,13 @@ static struct pci_device_id orinoco_plx_id_table[] = { {0,}, }; -MODULE_DEVICE_TABLE(pci, orinoco_plx_id_table); +MODULE_DEVICE_TABLE(pci, orinoco_plx_pci_id_table); static struct pci_driver orinoco_plx_driver = { .name = DRIVER_NAME, - .id_table = orinoco_plx_id_table, + .id_table = orinoco_plx_pci_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 @@ -357,6 +388,7 @@ 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 0831721e4..5e68b7026 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,13 +26,25 @@ * 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 doesn't - * provide access to the PCMCIA attribute space. + * 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. * * Pheecom sells cards with the TMD chip as "ASIC version" */ @@ -40,6 +52,7 @@ #define DRIVER_NAME "orinoco_tmd" #define PFX DRIVER_NAME ": " +#include #include #include #include @@ -48,26 +61,32 @@ #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_pci_card *card = priv->card; + struct orinoco_tmd_card *card = priv->card; + u32 addr = card->tmd_io; unsigned long timeout; u16 reg; - iowrite8(COR_VALUE | COR_RESET, card->bridge_io); + outb(COR_VALUE | COR_RESET, addr); mdelay(1); - iowrite8(COR_VALUE, card->bridge_io); + outb(COR_VALUE, addr); mdelay(1); /* Just in case, wait more until the card is no longer busy */ @@ -78,7 +97,7 @@ static int orinoco_tmd_cor_reset(struct orinoco_private *priv) reg = hermes_read_regn(hw, CMD); } - /* Still busy? */ + /* Did we timeout ? */ if (reg & HERMES_CMD_BUSY) { printk(KERN_ERR PFX "Busy timeout\n"); return -ETIMEDOUT; @@ -91,11 +110,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; - struct orinoco_private *priv; - struct orinoco_pci_card *card; - struct net_device *dev; - void __iomem *hermes_io, *bridge_io; + int err = 0; + struct orinoco_private *priv = NULL; + struct orinoco_tmd_card *card; + struct net_device *dev = NULL; + void __iomem *mem; err = pci_enable_device(pdev); if (err) { @@ -104,28 +123,20 @@ static int orinoco_tmd_init_one(struct pci_dev *pdev, } err = pci_request_regions(pdev, DRIVER_NAME); - if (err) { + if (err != 0) { printk(KERN_ERR PFX "Cannot obtain PCI resources\n"); goto fail_resources; } - 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; + mem = pci_iomap(pdev, 2, 0); + if (! mem) { + err = -ENOMEM; + goto fail_iomap; } /* 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; @@ -133,19 +144,25 @@ static int orinoco_tmd_init_one(struct pci_dev *pdev, priv = netdev_priv(dev); card = priv->card; - card->bridge_io = bridge_io; + card->tmd_io = pci_resource_start(pdev, 1); + dev->base_addr = pci_resource_start(pdev, 2); SET_MODULE_OWNER(dev); SET_NETDEV_DEV(dev, &pdev->dev); - hermes_struct_init(&priv->hw, hermes_io, HERMES_16BIT_REGSPACING); + hermes_struct_init(&priv->hw, mem, HERMES_16BIT_REGSPACING); - err = request_irq(pdev->irq, orinoco_interrupt, IRQF_SHARED, + 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, 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) { @@ -160,8 +177,6 @@ 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; @@ -173,12 +188,9 @@ static int orinoco_tmd_init_one(struct pci_dev *pdev, free_orinocodev(dev); fail_alloc: - pci_iounmap(pdev, hermes_io); - - fail_map_hermes: - pci_iounmap(pdev, bridge_io); + pci_iounmap(pdev, mem); - fail_map_bridge: + fail_iomap: pci_release_regions(pdev); fail_resources: @@ -191,32 +203,31 @@ 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; - struct orinoco_pci_card *card = priv->card; + + BUG_ON(! dev); unregister_netdev(dev); - free_irq(pdev->irq, dev); + free_irq(dev->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_id_table[] = { + +static struct pci_device_id orinoco_tmd_pci_id_table[] = { {0x15e8, 0x0131, PCI_ANY_ID, PCI_ANY_ID,}, /* NDC and OEMs, e.g. pheecom */ {0,}, }; -MODULE_DEVICE_TABLE(pci, orinoco_tmd_id_table); +MODULE_DEVICE_TABLE(pci, orinoco_tmd_pci_id_table); static struct pci_driver orinoco_tmd_driver = { .name = DRIVER_NAME, - .id_table = orinoco_tmd_id_table, + .id_table = orinoco_tmd_pci_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 @@ -234,6 +245,7 @@ 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/isl_ioctl.c b/drivers/net/wireless/prism54/isl_ioctl.c index 989599ad3..e5bb9f5ae 100644 --- a/drivers/net/wireless/prism54/isl_ioctl.c +++ b/drivers/net/wireless/prism54/isl_ioctl.c @@ -747,7 +747,7 @@ prism54_get_essid(struct net_device *ndev, struct iw_request_info *info, if (essid->length) { dwrq->flags = 1; /* set ESSID to ON for Wireless Extensions */ - /* if it is too big, trunk it */ + /* if it is to big, trunk it */ dwrq->length = min((u8)IW_ESSID_MAX_SIZE, essid->length); } else { dwrq->flags = 0; diff --git a/drivers/net/wireless/prism54/islpci_hotplug.c b/drivers/net/wireless/prism54/islpci_hotplug.c index 09fc17a0f..b41d666fe 100644 --- a/drivers/net/wireless/prism54/islpci_hotplug.c +++ b/drivers/net/wireless/prism54/islpci_hotplug.c @@ -22,7 +22,6 @@ #include #include #include /* For __init, __exit */ -#include #include "prismcompat.h" #include "islpci_dev.h" @@ -125,7 +124,7 @@ prism54_probe(struct pci_dev *pdev, const struct pci_device_id *id) } /* enable PCI DMA */ - if (pci_set_dma_mask(pdev, DMA_32BIT_MASK)) { + if (pci_set_dma_mask(pdev, 0xffffffff)) { printk(KERN_ERR "%s: 32-bit PCI DMA not supported", DRV_NAME); goto do_pci_disable_device; } @@ -189,7 +188,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, - IRQF_SHARED, ndev->name, priv); + SA_SHIRQ, 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 2e061a80b..6a60c5970 100644 --- a/drivers/net/wireless/prism54/islpci_mgt.c +++ b/drivers/net/wireless/prism54/islpci_mgt.c @@ -18,6 +18,7 @@ * */ +#include #include #include #include diff --git a/drivers/net/wireless/prism54/oid_mgt.c b/drivers/net/wireless/prism54/oid_mgt.c index ebb238785..eea2f04c8 100644 --- a/drivers/net/wireless/prism54/oid_mgt.c +++ b/drivers/net/wireless/prism54/oid_mgt.c @@ -332,7 +332,7 @@ mgt_le_to_cpu(int type, void *data) case OID_TYPE_ATTACH:{ struct obj_attachment *attach = data; attach->id = le16_to_cpu(attach->id); - attach->size = le16_to_cpu(attach->size); + attach->size = le16_to_cpu(attach->size);; break; } case OID_TYPE_SSID: @@ -401,7 +401,7 @@ mgt_cpu_to_le(int type, void *data) case OID_TYPE_ATTACH:{ struct obj_attachment *attach = data; attach->id = cpu_to_le16(attach->id); - attach->size = cpu_to_le16(attach->size); + attach->size = cpu_to_le16(attach->size);; break; } case OID_TYPE_SSID: diff --git a/drivers/net/wireless/prism54/prismcompat.h b/drivers/net/wireless/prism54/prismcompat.h index d71eca55a..55541c017 100644 --- a/drivers/net/wireless/prism54/prismcompat.h +++ b/drivers/net/wireless/prism54/prismcompat.h @@ -29,6 +29,7 @@ #include #include +#include #include #include #include diff --git a/drivers/net/wireless/ray_cs.c b/drivers/net/wireless/ray_cs.c index 61b83a5e7..7880d8c31 100644 --- a/drivers/net/wireless/ray_cs.c +++ b/drivers/net/wireless/ray_cs.c @@ -30,6 +30,7 @@ * =============================================================================*/ +#include #include #include #include @@ -89,8 +90,8 @@ module_param(pc_debug, int, 0); #define DEBUG(n, args...) #endif /** Prototypes based on PCMCIA skeleton driver *******************************/ -static int ray_config(struct pcmcia_device *link); -static void ray_release(struct pcmcia_device *link); +static void ray_config(dev_link_t *link); +static void ray_release(dev_link_t *link); static void ray_detach(struct pcmcia_device *p_dev); /***** Prototypes indicated by device structure ******************************/ @@ -189,17 +190,20 @@ static int bc; static char *phy_addr = NULL; -/* A struct pcmcia_device structure has fields for most things that are needed +/* A linked list of "instances" of the ray device. Each actual + PCMCIA card corresponds to one device instance, and is described + by one dev_link_t structure (defined in ds.h). +*/ +static dev_link_t *dev_list = NULL; + +/* A dev_link_t structure has fields for most things that are needed to keep track of a socket, but there will usually be some device specific information that also needs to be kept track of. The - 'priv' pointer in a struct pcmcia_device structure can be used to point to + 'priv' pointer in a dev_link_t structure can be used to point to a device-specific private data structure, like this. */ static unsigned int ray_mem_speed = 500; -/* WARNING: THIS DRIVER IS NOT CAPABLE OF HANDLING MULTIPLE DEVICES! */ -static struct pcmcia_device *this_device = NULL; - MODULE_AUTHOR("Corey Thomas "); MODULE_DESCRIPTION("Raylink/WebGear wireless LAN driver"); MODULE_LICENSE("GPL"); @@ -302,46 +306,56 @@ static char rcsid[] = "Raylink/WebGear wireless LAN - Corey priv; - local->finder = p_dev; + + memset(link, 0, sizeof(struct dev_link_t)); /* The io structure describes IO port mapping. None used here */ - p_dev->io.NumPorts1 = 0; - p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_8; - p_dev->io.IOAddrLines = 5; + link->io.NumPorts1 = 0; + link->io.Attributes1 = IO_DATA_PATH_WIDTH_8; + link->io.IOAddrLines = 5; /* Interrupt setup. For PCMCIA, driver takes what's given */ - p_dev->irq.Attributes = IRQ_TYPE_EXCLUSIVE | IRQ_HANDLE_PRESENT; - p_dev->irq.IRQInfo1 = IRQ_LEVEL_ID; - p_dev->irq.Handler = &ray_interrupt; + link->irq.Attributes = IRQ_TYPE_EXCLUSIVE | IRQ_HANDLE_PRESENT; + link->irq.IRQInfo1 = IRQ_LEVEL_ID; + link->irq.Handler = &ray_interrupt; /* General socket configuration */ - p_dev->conf.Attributes = CONF_ENABLE_IRQ; - p_dev->conf.IntType = INT_MEMORY_AND_IO; - p_dev->conf.ConfigIndex = 1; - p_dev->conf.Present = PRESENT_OPTION; - - p_dev->priv = dev; - p_dev->irq.Instance = dev; + link->conf.Attributes = CONF_ENABLE_IRQ; + link->conf.Vcc = 50; + link->conf.IntType = INT_MEMORY_AND_IO; + link->conf.ConfigIndex = 1; + link->conf.Present = PRESENT_OPTION; + + link->priv = dev; + link->irq.Instance = dev; - local->finder = p_dev; + local->finder = link; local->card_status = CARD_INSERTED; local->authentication_state = UNAUTHENTICATED; local->num_multi = 0; - DEBUG(2,"ray_attach p_dev = %p, dev = %p, local = %p, intr = %p\n", - p_dev,dev,local,&ray_interrupt); + DEBUG(2,"ray_attach link = %p, dev = %p, local = %p, intr = %p\n", + link,dev,local,&ray_interrupt); /* Raylink entries in the device structure */ dev->hard_start_xmit = &ray_dev_start_xmit; @@ -365,10 +379,16 @@ static int ray_probe(struct pcmcia_device *p_dev) init_timer(&local->timer); - this_device = p_dev; - return ray_config(p_dev); + link->handle = p_dev; + p_dev->instance = link; + + link->state |= DEV_PRESENT | DEV_CONFIG_PENDING; + ray_config(link); + + return 0; fail_alloc_dev: + kfree(link); return -ENOMEM; } /* ray_attach */ /*============================================================================= @@ -377,25 +397,37 @@ fail_alloc_dev: structures are freed. Otherwise, the structures will be freed when the device is released. =============================================================================*/ -static void ray_detach(struct pcmcia_device *link) +static void ray_detach(struct pcmcia_device *p_dev) { + dev_link_t *link = dev_to_instance(p_dev); + dev_link_t **linkp; struct net_device *dev; ray_dev_t *local; DEBUG(1, "ray_detach(0x%p)\n", link); + + /* Locate device structure */ + for (linkp = &dev_list; *linkp; linkp = &(*linkp)->next) + if (*linkp == link) break; + if (*linkp == NULL) + return; - this_device = NULL; dev = link->priv; - ray_release(link); + if (link->state & DEV_CONFIG) { + ray_release(link); - local = (ray_dev_t *)dev->priv; - del_timer(&local->timer); + local = (ray_dev_t *)dev->priv; + del_timer(&local->timer); + } + /* Unlink device structure, free pieces */ + *linkp = link->next; if (link->priv) { - if (link->dev_node) unregister_netdev(dev); + if (link->dev) unregister_netdev(dev); free_netdev(dev); } + kfree(link); DEBUG(2,"ray_cs ray_detach ending\n"); } /* ray_detach */ /*============================================================================= @@ -406,8 +438,9 @@ static void ray_detach(struct pcmcia_device *link) #define CS_CHECK(fn, ret) \ do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0) #define MAX_TUPLE_SIZE 128 -static int ray_config(struct pcmcia_device *link) +static void ray_config(dev_link_t *link) { + client_handle_t handle = link->handle; tuple_t tuple; cisparse_t parse; int last_fn = 0, last_ret = 0; @@ -422,45 +455,48 @@ static int ray_config(struct pcmcia_device *link) /* This reads the card's CONFIG tuple to find its configuration regs */ tuple.DesiredTuple = CISTPL_CONFIG; - CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(link, &tuple)); + CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple)); tuple.TupleData = buf; tuple.TupleDataMax = MAX_TUPLE_SIZE; tuple.TupleOffset = 0; - CS_CHECK(GetTupleData, pcmcia_get_tuple_data(link, &tuple)); - CS_CHECK(ParseTuple, pcmcia_parse_tuple(link, &tuple, &parse)); + CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple)); + CS_CHECK(ParseTuple, pcmcia_parse_tuple(handle, &tuple, &parse)); link->conf.ConfigBase = parse.config.base; link->conf.Present = parse.config.rmask[0]; /* Determine card type and firmware version */ buf[0] = buf[MAX_TUPLE_SIZE - 1] = 0; tuple.DesiredTuple = CISTPL_VERS_1; - CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(link, &tuple)); + CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple)); tuple.TupleData = buf; tuple.TupleDataMax = MAX_TUPLE_SIZE; tuple.TupleOffset = 2; - CS_CHECK(GetTupleData, pcmcia_get_tuple_data(link, &tuple)); + CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple)); for (i=0; istate |= DEV_CONFIG; + /* Now allocate an interrupt line. Note that this does not actually assign a handler to the interrupt. */ - CS_CHECK(RequestIRQ, pcmcia_request_irq(link, &link->irq)); + CS_CHECK(RequestIRQ, pcmcia_request_irq(link->handle, &link->irq)); dev->irq = link->irq.AssignedIRQ; /* This actually configures the PCMCIA socket -- setting up the I/O windows and the interrupt mapping. */ - CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link, &link->conf)); + CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link->handle, &link->conf)); /*** Set up 32k window for shared memory (transmit and control) ************/ req.Attributes = WIN_DATA_WIDTH_8 | WIN_MEMORY_TYPE_CM | WIN_ENABLE | WIN_USE_WAIT; req.Base = 0; req.Size = 0x8000; req.AccessSpeed = ray_mem_speed; - CS_CHECK(RequestWindow, pcmcia_request_window(&link, &req, &link->win)); + CS_CHECK(RequestWindow, pcmcia_request_window(&link->handle, &req, &link->win)); mem.CardOffset = 0x0000; mem.Page = 0; CS_CHECK(MapMemPage, pcmcia_map_mem_page(link->win, &mem)); local->sram = ioremap(req.Base,req.Size); @@ -470,7 +506,7 @@ static int ray_config(struct pcmcia_device *link) req.Base = 0; req.Size = 0x4000; req.AccessSpeed = ray_mem_speed; - CS_CHECK(RequestWindow, pcmcia_request_window(&link, &req, &local->rmem_handle)); + CS_CHECK(RequestWindow, pcmcia_request_window(&link->handle, &req, &local->rmem_handle)); mem.CardOffset = 0x8000; mem.Page = 0; CS_CHECK(MapMemPage, pcmcia_map_mem_page(local->rmem_handle, &mem)); local->rmem = ioremap(req.Base,req.Size); @@ -480,7 +516,7 @@ static int ray_config(struct pcmcia_device *link) req.Base = 0; req.Size = 0x1000; req.AccessSpeed = ray_mem_speed; - CS_CHECK(RequestWindow, pcmcia_request_window(&link, &req, &local->amem_handle)); + CS_CHECK(RequestWindow, pcmcia_request_window(&link->handle, &req, &local->amem_handle)); mem.CardOffset = 0x0000; mem.Page = 0; CS_CHECK(MapMemPage, pcmcia_map_mem_page(local->amem_handle, &mem)); local->amem = ioremap(req.Base,req.Size); @@ -490,32 +526,32 @@ static int ray_config(struct pcmcia_device *link) DEBUG(3,"ray_config amem=%p\n",local->amem); if (ray_init(dev) < 0) { ray_release(link); - return -ENODEV; + return; } - SET_NETDEV_DEV(dev, &handle_to_dev(link)); + SET_NETDEV_DEV(dev, &handle_to_dev(handle)); i = register_netdev(dev); if (i != 0) { printk("ray_config register_netdev() failed\n"); ray_release(link); - return i; + return; } strcpy(local->node.dev_name, dev->name); - link->dev_node = &local->node; + link->dev = &local->node; + link->state &= ~DEV_CONFIG_PENDING; printk(KERN_INFO "%s: RayLink, irq %d, hw_addr ", dev->name, dev->irq); for (i = 0; i < 6; i++) printk("%02X%s", dev->dev_addr[i], ((i<5) ? ":" : "\n")); - return 0; + return; cs_failed: - cs_error(link, last_fn, last_ret); + cs_error(link->handle, last_fn, last_ret); ray_release(link); - return -ENODEV; } /* ray_config */ static inline struct ccs __iomem *ccs_base(ray_dev_t *dev) @@ -542,9 +578,9 @@ static int ray_init(struct net_device *dev) UCHAR *p; struct ccs __iomem *pccs; ray_dev_t *local = (ray_dev_t *)dev->priv; - struct pcmcia_device *link = local->finder; + dev_link_t *link = local->finder; DEBUG(1, "ray_init(0x%p)\n", dev); - if (!(pcmcia_dev_present(link))) { + if (!(link->state & DEV_PRESENT)) { DEBUG(0,"ray_init - device not present\n"); return -1; } @@ -604,10 +640,10 @@ static int dl_startup_params(struct net_device *dev) int ccsindex; ray_dev_t *local = (ray_dev_t *)dev->priv; struct ccs __iomem *pccs; - struct pcmcia_device *link = local->finder; + dev_link_t *link = local->finder; DEBUG(1,"dl_startup_params entered\n"); - if (!(pcmcia_dev_present(link))) { + if (!(link->state & DEV_PRESENT)) { DEBUG(2,"ray_cs dl_startup_params - device not present\n"); return -1; } @@ -711,9 +747,9 @@ static void verify_dl_startup(u_long data) ray_dev_t *local = (ray_dev_t *)data; struct ccs __iomem *pccs = ccs_base(local) + local->dl_param_ccs; UCHAR status; - struct pcmcia_device *link = local->finder; + dev_link_t *link = local->finder; - if (!(pcmcia_dev_present(link))) { + if (!(link->state & DEV_PRESENT)) { DEBUG(2,"ray_cs verify_dl_startup - device not present\n"); return; } @@ -751,8 +787,8 @@ static void start_net(u_long data) ray_dev_t *local = (ray_dev_t *)data; struct ccs __iomem *pccs; int ccsindex; - struct pcmcia_device *link = local->finder; - if (!(pcmcia_dev_present(link))) { + dev_link_t *link = local->finder; + if (!(link->state & DEV_PRESENT)) { DEBUG(2,"ray_cs start_net - device not present\n"); return; } @@ -778,9 +814,9 @@ static void join_net(u_long data) struct ccs __iomem *pccs; int ccsindex; - struct pcmcia_device *link = local->finder; + dev_link_t *link = local->finder; - if (!(pcmcia_dev_present(link))) { + if (!(link->state & DEV_PRESENT)) { DEBUG(2,"ray_cs join_net - device not present\n"); return; } @@ -804,7 +840,7 @@ static void join_net(u_long data) device, and release the PCMCIA configuration. If the device is still open, this will be postponed until it is closed. =============================================================================*/ -static void ray_release(struct pcmcia_device *link) +static void ray_release(dev_link_t *link) { struct net_device *dev = link->priv; ray_dev_t *local = dev->priv; @@ -813,38 +849,56 @@ static void ray_release(struct pcmcia_device *link) DEBUG(1, "ray_release(0x%p)\n", link); del_timer(&local->timer); + link->state &= ~DEV_CONFIG; iounmap(local->sram); iounmap(local->rmem); iounmap(local->amem); /* Do bother checking to see if these succeed or not */ + i = pcmcia_release_window(link->win); + if ( i != CS_SUCCESS ) DEBUG(0,"ReleaseWindow(link->win) ret = %x\n",i); i = pcmcia_release_window(local->amem_handle); if ( i != CS_SUCCESS ) DEBUG(0,"ReleaseWindow(local->amem) ret = %x\n",i); i = pcmcia_release_window(local->rmem_handle); if ( i != CS_SUCCESS ) DEBUG(0,"ReleaseWindow(local->rmem) ret = %x\n",i); - pcmcia_disable_device(link); + i = pcmcia_release_configuration(link->handle); + if ( i != CS_SUCCESS ) DEBUG(0,"ReleaseConfiguration ret = %x\n",i); + i = pcmcia_release_irq(link->handle, &link->irq); + if ( i != CS_SUCCESS ) DEBUG(0,"ReleaseIRQ ret = %x\n",i); DEBUG(2,"ray_release ending\n"); } -static int ray_suspend(struct pcmcia_device *link) +static int ray_suspend(struct pcmcia_device *p_dev) { + dev_link_t *link = dev_to_instance(p_dev); struct net_device *dev = link->priv; - if (link->open) - netif_device_detach(dev); + link->state |= DEV_SUSPEND; + if (link->state & DEV_CONFIG) { + if (link->open) + netif_device_detach(dev); + + pcmcia_release_configuration(link->handle); + } + return 0; } -static int ray_resume(struct pcmcia_device *link) +static int ray_resume(struct pcmcia_device *p_dev) { + dev_link_t *link = dev_to_instance(p_dev); struct net_device *dev = link->priv; - if (link->open) { - ray_reset(dev); - netif_device_attach(dev); - } + link->state &= ~DEV_SUSPEND; + if (link->state & DEV_CONFIG) { + pcmcia_request_configuration(link->handle, &link->conf); + if (link->open) { + ray_reset(dev); + netif_device_attach(dev); + } + } return 0; } @@ -856,10 +910,10 @@ int ray_dev_init(struct net_device *dev) int i; #endif /* RAY_IMMEDIATE_INIT */ ray_dev_t *local = dev->priv; - struct pcmcia_device *link = local->finder; + dev_link_t *link = local->finder; DEBUG(1,"ray_dev_init(dev=%p)\n",dev); - if (!(pcmcia_dev_present(link))) { + if (!(link->state & DEV_PRESENT)) { DEBUG(2,"ray_dev_init - device not present\n"); return -1; } @@ -890,10 +944,10 @@ int ray_dev_init(struct net_device *dev) static int ray_dev_config(struct net_device *dev, struct ifmap *map) { ray_dev_t *local = dev->priv; - struct pcmcia_device *link = local->finder; + dev_link_t *link = local->finder; /* Dummy routine to satisfy device structure */ DEBUG(1,"ray_dev_config(dev=%p,ifmap=%p)\n",dev,map); - if (!(pcmcia_dev_present(link))) { + if (!(link->state & DEV_PRESENT)) { DEBUG(2,"ray_dev_config - device not present\n"); return -1; } @@ -904,10 +958,10 @@ static int ray_dev_config(struct net_device *dev, struct ifmap *map) static int ray_dev_start_xmit(struct sk_buff *skb, struct net_device *dev) { ray_dev_t *local = dev->priv; - struct pcmcia_device *link = local->finder; + dev_link_t *link = local->finder; short length = skb->len; - if (!(pcmcia_dev_present(link))) { + if (!(link->state & DEV_PRESENT)) { DEBUG(2,"ray_dev_start_xmit - device not present\n"); return -1; } @@ -923,7 +977,8 @@ static int ray_dev_start_xmit(struct sk_buff *skb, struct net_device *dev) if (length < ETH_ZLEN) { - if (skb_padto(skb, ETH_ZLEN)) + skb = skb_padto(skb, ETH_ZLEN); + if (skb == NULL) return 0; length = ETH_ZLEN; } @@ -1515,7 +1570,7 @@ static int ray_commit(struct net_device *dev, static iw_stats * ray_get_wireless_stats(struct net_device * dev) { ray_dev_t * local = (ray_dev_t *) dev->priv; - struct pcmcia_device *link = local->finder; + dev_link_t *link = local->finder; struct status __iomem *p = local->sram + STATUS_BASE; if(local == (ray_dev_t *) NULL) @@ -1533,7 +1588,7 @@ static iw_stats * ray_get_wireless_stats(struct net_device * dev) } #endif /* WIRELESS_SPY */ - if(pcmcia_dev_present(link)) { + if((link->state & DEV_PRESENT)) { local->wstats.qual.noise = readb(&p->rxnoise); local->wstats.qual.updated |= 4; } @@ -1602,14 +1657,18 @@ static const struct iw_handler_def ray_handler_def = /*===========================================================================*/ static int ray_open(struct net_device *dev) { + dev_link_t *link; ray_dev_t *local = (ray_dev_t *)dev->priv; - struct pcmcia_device *link; - link = local->finder; DEBUG(1, "ray_open('%s')\n", dev->name); - if (link->open == 0) - local->num_multi = 0; + for (link = dev_list; link; link = link->next) + if (link->priv == dev) break; + if (!DEV_OK(link)) { + return -ENODEV; + } + + if (link->open == 0) local->num_multi = 0; link->open++; /* If the card is not started, time to start it ! - Jean II */ @@ -1636,12 +1695,15 @@ static int ray_open(struct net_device *dev) /*===========================================================================*/ static int ray_dev_close(struct net_device *dev) { - ray_dev_t *local = (ray_dev_t *)dev->priv; - struct pcmcia_device *link; - link = local->finder; + dev_link_t *link; DEBUG(1, "ray_dev_close('%s')\n", dev->name); + for (link = dev_list; link; link = link->next) + if (link->priv == dev) break; + if (link == NULL) + return -ENODEV; + link->open--; netif_stop_queue(dev); @@ -1663,9 +1725,9 @@ static void ray_reset(struct net_device *dev) { static int interrupt_ecf(ray_dev_t *local, int ccs) { int i = 50; - struct pcmcia_device *link = local->finder; + dev_link_t *link = local->finder; - if (!(pcmcia_dev_present(link))) { + if (!(link->state & DEV_PRESENT)) { DEBUG(2,"ray_cs interrupt_ecf - device not present\n"); return -1; } @@ -1690,9 +1752,9 @@ static int get_free_tx_ccs(ray_dev_t *local) { int i; struct ccs __iomem *pccs = ccs_base(local); - struct pcmcia_device *link = local->finder; + dev_link_t *link = local->finder; - if (!(pcmcia_dev_present(link))) { + if (!(link->state & DEV_PRESENT)) { DEBUG(2,"ray_cs get_free_tx_ccs - device not present\n"); return ECARDGONE; } @@ -1721,9 +1783,9 @@ static int get_free_ccs(ray_dev_t *local) { int i; struct ccs __iomem *pccs = ccs_base(local); - struct pcmcia_device *link = local->finder; + dev_link_t *link = local->finder; - if (!(pcmcia_dev_present(link))) { + if (!(link->state & DEV_PRESENT)) { DEBUG(2,"ray_cs get_free_ccs - device not present\n"); return ECARDGONE; } @@ -1796,9 +1858,9 @@ static int parse_addr(char *in_str, UCHAR *out) static struct net_device_stats *ray_get_stats(struct net_device *dev) { ray_dev_t *local = (ray_dev_t *)dev->priv; - struct pcmcia_device *link = local->finder; + dev_link_t *link = local->finder; struct status __iomem *p = local->sram + STATUS_BASE; - if (!(pcmcia_dev_present(link))) { + if (!(link->state & DEV_PRESENT)) { DEBUG(2,"ray_cs net_device_stats - device not present\n"); return &local->stats; } @@ -1826,12 +1888,12 @@ static struct net_device_stats *ray_get_stats(struct net_device *dev) static void ray_update_parm(struct net_device *dev, UCHAR objid, UCHAR *value, int len) { ray_dev_t *local = (ray_dev_t *)dev->priv; - struct pcmcia_device *link = local->finder; + dev_link_t *link = local->finder; int ccsindex; int i; struct ccs __iomem *pccs; - if (!(pcmcia_dev_present(link))) { + if (!(link->state & DEV_PRESENT)) { DEBUG(2,"ray_update_parm - device not present\n"); return; } @@ -1863,10 +1925,10 @@ static void ray_update_multi_list(struct net_device *dev, int all) struct ccs __iomem *pccs; int i = 0; ray_dev_t *local = (ray_dev_t *)dev->priv; - struct pcmcia_device *link = local->finder; + dev_link_t *link = local->finder; void __iomem *p = local->sram + HOST_TO_ECF_BASE; - if (!(pcmcia_dev_present(link))) { + if (!(link->state & DEV_PRESENT)) { DEBUG(2,"ray_update_multi_list - device not present\n"); return; } @@ -1943,7 +2005,7 @@ static void set_multicast_list(struct net_device *dev) static irqreturn_t ray_interrupt(int irq, void *dev_id, struct pt_regs * regs) { struct net_device *dev = (struct net_device *)dev_id; - struct pcmcia_device *link; + dev_link_t *link; ray_dev_t *local; struct ccs __iomem *pccs; struct rcs __iomem *prcs; @@ -1958,8 +2020,8 @@ static irqreturn_t ray_interrupt(int irq, void *dev_id, struct pt_regs * regs) DEBUG(4,"ray_cs: interrupt for *dev=%p\n",dev); local = (ray_dev_t *)dev->priv; - link = (struct pcmcia_device *)local->finder; - if (!pcmcia_dev_present(link)) { + link = (dev_link_t *)local->finder; + if ( ! (link->state & DEV_PRESENT) || link->state & DEV_SUSPEND ) { DEBUG(2,"ray_cs interrupt from device not present or suspended.\n"); return IRQ_NONE; } @@ -2478,9 +2540,9 @@ static void release_frag_chain(ray_dev_t *local, struct rcs __iomem * prcs) /*===========================================================================*/ static void authenticate(ray_dev_t *local) { - struct pcmcia_device *link = local->finder; + dev_link_t *link = local->finder; DEBUG(0,"ray_cs Starting authentication.\n"); - if (!(pcmcia_dev_present(link))) { + if (!(link->state & DEV_PRESENT)) { DEBUG(2,"ray_cs authenticate - device not present\n"); return; } @@ -2544,10 +2606,10 @@ static void rx_authenticate(ray_dev_t *local, struct rcs __iomem *prcs, static void associate(ray_dev_t *local) { struct ccs __iomem *pccs; - struct pcmcia_device *link = local->finder; + dev_link_t *link = local->finder; struct net_device *dev = link->priv; int ccsindex; - if (!(pcmcia_dev_present(link))) { + if (!(link->state & DEV_PRESENT)) { DEBUG(2,"ray_cs associate - device not present\n"); return; } @@ -2627,14 +2689,14 @@ static int ray_cs_proc_read(char *buf, char **start, off_t offset, int len) * eg ifconfig */ int i; - struct pcmcia_device *link; + dev_link_t *link; struct net_device *dev; ray_dev_t *local; UCHAR *p; struct freq_hop_element *pfh; UCHAR c[33]; - link = this_device; + link = dev_list; if (!link) return 0; dev = (struct net_device *)link->priv; @@ -2836,7 +2898,7 @@ static struct pcmcia_driver ray_driver = { .drv = { .name = "ray_cs", }, - .probe = ray_probe, + .probe = ray_attach, .remove = ray_detach, .id_table = ray_ids, .suspend = ray_suspend, @@ -2878,6 +2940,7 @@ static void __exit exit_ray_cs(void) #endif pcmcia_unregister_driver(&ray_driver); + BUG_ON(dev_list != NULL); } /* exit_ray_cs */ module_init(init_ray_cs); diff --git a/drivers/net/wireless/ray_cs.h b/drivers/net/wireless/ray_cs.h index bd73ebf03..42660fe64 100644 --- a/drivers/net/wireless/ray_cs.h +++ b/drivers/net/wireless/ray_cs.h @@ -31,7 +31,7 @@ typedef struct ray_dev_t { void __iomem *sram; /* pointer to beginning of shared RAM */ void __iomem *amem; /* pointer to attribute mem window */ void __iomem *rmem; /* pointer to receive buffer window */ - struct pcmcia_device *finder; /* pointer back to struct pcmcia_device for card */ + dev_link_t *finder; /* pointer back to dev_link_t for card */ struct timer_list timer; long tx_ccs_lock; long ccs_lock; diff --git a/drivers/net/wireless/spectrum_cs.c b/drivers/net/wireless/spectrum_cs.c index bcc703813..fee4be1ce 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 LA4137, CompactFlash cards by Socket + * Symbol Wireless Networker LA4100, CompactFlash cards by Socket * Communications and Intel PRO/Wireless 2011B. * * The driver implements Symbol firmware download. The rest is handled @@ -21,6 +21,7 @@ #define DRIVER_NAME "spectrum_cs" #define PFX DRIVER_NAME ": " +#include #include #include #include @@ -34,6 +35,8 @@ #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"; @@ -60,7 +63,7 @@ MODULE_PARM_DESC(ignore_cis_vcc, "Allow voltage mismatch between card and socket /* PCMCIA specific device information (goes in the card field of * struct orinoco_private */ struct orinoco_pccard { - struct pcmcia_device *p_dev; + dev_link_t link; dev_node_t node; }; @@ -68,8 +71,8 @@ struct orinoco_pccard { /* Function prototypes */ /********************************************************************/ -static int spectrum_cs_config(struct pcmcia_device *link); -static void spectrum_cs_release(struct pcmcia_device *link); +static void spectrum_cs_config(dev_link_t *link); +static void spectrum_cs_release(dev_link_t *link); /********************************************************************/ /* Firmware downloader */ @@ -117,8 +120,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)); @@ -128,9 +131,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)); @@ -141,54 +144,54 @@ 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)); +} __attribute__ ((packed));; /* Functions for access to little-endian data */ 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); } @@ -235,14 +238,14 @@ spectrum_aux_open(hermes_t *hw) * If IDLE is 1, stop the firmware, so that it can be safely rewritten. */ static int -spectrum_reset(struct pcmcia_device *link, int idle) +spectrum_reset(dev_link_t *link, int idle) { int last_ret, last_fn; conf_reg_t reg; u_int save_cor; /* Doing it if hardware is gone is guaranteed crash */ - if (!pcmcia_dev_present(link)) + if (!(link->state & DEV_CONFIG)) return -ENODEV; /* Save original COR value */ @@ -250,7 +253,7 @@ spectrum_reset(struct pcmcia_device *link, int idle) reg.Action = CS_READ; reg.Offset = CISREG_COR; CS_CHECK(AccessConfigurationRegister, - pcmcia_access_configuration_register(link, ®)); + pcmcia_access_configuration_register(link->handle, ®)); save_cor = reg.Value; /* Soft-Reset card */ @@ -258,14 +261,14 @@ spectrum_reset(struct pcmcia_device *link, int idle) reg.Offset = CISREG_COR; reg.Value = (save_cor | COR_SOFT_RESET); CS_CHECK(AccessConfigurationRegister, - pcmcia_access_configuration_register(link, ®)); + pcmcia_access_configuration_register(link->handle, ®)); udelay(1000); /* Read CCSR */ reg.Action = CS_READ; reg.Offset = CISREG_CCSR; CS_CHECK(AccessConfigurationRegister, - pcmcia_access_configuration_register(link, ®)); + pcmcia_access_configuration_register(link->handle, ®)); /* * Start or stop the firmware. Memory width bit should be @@ -275,7 +278,7 @@ spectrum_reset(struct pcmcia_device *link, int idle) reg.Offset = CISREG_CCSR; reg.Value = (idle ? HCR_IDLE : HCR_RUN) | (reg.Value & HCR_MEM16); CS_CHECK(AccessConfigurationRegister, - pcmcia_access_configuration_register(link, ®)); + pcmcia_access_configuration_register(link->handle, ®)); udelay(1000); /* Restore original COR configuration index */ @@ -283,12 +286,12 @@ spectrum_reset(struct pcmcia_device *link, int idle) reg.Offset = CISREG_COR; reg.Value = (save_cor & ~COR_SOFT_RESET); CS_CHECK(AccessConfigurationRegister, - pcmcia_access_configuration_register(link, ®)); + pcmcia_access_configuration_register(link->handle, ®)); udelay(1000); return 0; cs_failed: - cs_error(link, last_fn, last_ret); + cs_error(link->handle, last_fn, last_ret); return -ENODEV; } @@ -340,7 +343,8 @@ 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_bytes(hw, HERMES_AUXDATA, pdi->data, pdi_len(pdi)); + hermes_write_words(hw, HERMES_AUXDATA, pdi->data, + pdi_len(pdi) / 2); return 0; } @@ -420,8 +424,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_bytes(hw, HERMES_AUXDATA, blk->data, - blklen); + hermes_write_words(hw, HERMES_AUXDATA, blk->data, + blklen / 2); blk = (struct dblock *) &blk->data[blklen]; blkaddr = dblock_addr(blk); @@ -437,8 +441,8 @@ spectrum_load_blocks(hermes_t *hw, const struct dblock *first_block) * care of the PDA - read it and then write it on top of the firmware. */ static int -spectrum_dl_image(hermes_t *hw, struct pcmcia_device *link, - const unsigned char *image, int secondary) +spectrum_dl_image(hermes_t *hw, dev_link_t *link, + const unsigned char *image) { int ret; const unsigned char *ptr; @@ -453,7 +457,7 @@ spectrum_dl_image(hermes_t *hw, struct pcmcia_device *link, first_block = (const struct dblock *) ptr; /* Read the PDA */ - if (secondary) { + if (image != primsym) { ret = spectrum_read_pda(hw, pda, sizeof(pda)); if (ret) return ret; @@ -470,7 +474,7 @@ spectrum_dl_image(hermes_t *hw, struct pcmcia_device *link, return ret; /* Write the PDA to the adapter */ - if (secondary) { + if (image != primsym) { ret = spectrum_apply_pda(hw, first_block, pda); if (ret) return ret; @@ -485,7 +489,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 (secondary && ret != 0) + if (image != primsym && ret != 0) return -ENODEV; /* And this should work with any firmware */ @@ -501,36 +505,40 @@ spectrum_dl_image(hermes_t *hw, struct pcmcia_device *link, * reset on the card, to make sure it's in a sane state. */ static int -spectrum_dl_firmware(hermes_t *hw, struct pcmcia_device *link) +spectrum_dl_firmware(hermes_t *hw, dev_link_t *link) { int ret; + client_handle_t handle = link->handle; const struct firmware *fw_entry; if (request_firmware(&fw_entry, primary_fw_name, - &handle_to_dev(link)) != 0) { + &handle_to_dev(handle)) == 0) { + primsym = fw_entry->data; + } else { printk(KERN_ERR PFX "Cannot find firmware: %s\n", primary_fw_name); return -ENOENT; } - /* Load primary firmware */ - 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; - } - if (request_firmware(&fw_entry, secondary_fw_name, - &handle_to_dev(link)) != 0) { + &handle_to_dev(handle)) == 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); + if (ret) { + printk(KERN_ERR PFX "Primary firmware download failed\n"); + return ret; + } + /* Load secondary firmware */ - ret = spectrum_dl_image(hw, link, fw_entry->data, 1); - release_firmware(fw_entry); + ret = spectrum_dl_image(hw, link, secsym); + if (ret) { printk(KERN_ERR PFX "Secondary firmware download failed\n"); } @@ -546,12 +554,12 @@ static int spectrum_cs_hard_reset(struct orinoco_private *priv) { struct orinoco_pccard *card = priv->card; - struct pcmcia_device *link = card->p_dev; + dev_link_t *link = &card->link; int err; if (!hermes_present(&priv->hw)) { /* The firmware needs to be reloaded */ - if (spectrum_dl_firmware(&priv->hw, link) != 0) { + if (spectrum_dl_firmware(&priv->hw, &card->link) != 0) { printk(KERN_ERR PFX "Firmware download failed\n"); err = -ENODEV; } @@ -576,11 +584,12 @@ spectrum_cs_hard_reset(struct orinoco_private *priv) * configure the card at this point -- we wait until we receive a card * insertion event. */ static int -spectrum_cs_probe(struct pcmcia_device *link) +spectrum_cs_attach(struct pcmcia_device *p_dev) { struct net_device *dev; struct orinoco_private *priv; struct orinoco_pccard *card; + dev_link_t *link; dev = alloc_orinocodev(sizeof(*card), spectrum_cs_hard_reset); if (! dev) @@ -589,7 +598,7 @@ spectrum_cs_probe(struct pcmcia_device *link) card = priv->card; /* Link both structures together */ - card->p_dev = link; + link = &card->link; link->priv = dev; /* Interrupt setup */ @@ -606,7 +615,13 @@ spectrum_cs_probe(struct pcmcia_device *link) link->conf.Attributes = 0; link->conf.IntType = INT_MEMORY_AND_IO; - return spectrum_cs_config(link); + link->handle = p_dev; + p_dev->instance = link; + + link->state |= DEV_PRESENT | DEV_CONFIG_PENDING; + spectrum_cs_config(link); + + return 0; } /* spectrum_cs_attach */ /* @@ -615,15 +630,20 @@ spectrum_cs_probe(struct pcmcia_device *link) * are freed. Otherwise, the structures will be freed when the device * is released. */ -static void spectrum_cs_detach(struct pcmcia_device *link) +static void spectrum_cs_detach(struct pcmcia_device *p_dev) { + dev_link_t *link = dev_to_instance(p_dev); struct net_device *dev = link->priv; - if (link->dev_node) - unregister_netdev(dev); - - spectrum_cs_release(link); + if (link->state & DEV_CONFIG) + spectrum_cs_release(link); + DEBUG(0, PFX "detach: link=%p link->dev=%p\n", link, link->dev); + if (link->dev) { + DEBUG(0, PFX "About to unregister net device %p\n", + dev); + unregister_netdev(dev); + } free_orinocodev(dev); } /* spectrum_cs_detach */ @@ -633,20 +653,24 @@ static void spectrum_cs_detach(struct pcmcia_device *link) * device available to the system. */ -static int -spectrum_cs_config(struct pcmcia_device *link) +static void +spectrum_cs_config(dev_link_t *link) { struct net_device *dev = link->priv; + client_handle_t handle = link->handle; struct orinoco_private *priv = netdev_priv(dev); struct orinoco_pccard *card = priv->card; hermes_t *hw = &priv->hw; 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(handle, &info)); + /* * This reads the card's CONFIG tuple to find its * configuration registers. @@ -656,15 +680,19 @@ spectrum_cs_config(struct pcmcia_device *link) tuple.TupleData = buf; tuple.TupleDataMax = sizeof(buf); tuple.TupleOffset = 0; - 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)); + CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple)); + CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple)); + CS_CHECK(ParseTuple, pcmcia_parse_tuple(handle, &tuple, &parse)); link->conf.ConfigBase = parse.config.base; link->conf.Present = parse.config.rmask[0]; + /* Configure card */ + link->state |= DEV_CONFIG; + /* Look up the current Vcc */ CS_CHECK(GetConfigurationInfo, - pcmcia_get_configuration_info(link, &conf)); + pcmcia_get_configuration_info(handle, &conf)); + link->conf.Vcc = conf.Vcc; /* * In this loop, we scan the CIS for configuration table @@ -681,13 +709,13 @@ spectrum_cs_config(struct pcmcia_device *link) * implementation-defined details. */ tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY; - CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(link, &tuple)); + CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple)); while (1) { cistpl_cftable_entry_t *cfg = &(parse.cftable_entry); cistpl_cftable_entry_t dflt = { .index = 0 }; - if ( (pcmcia_get_tuple_data(link, &tuple) != 0) - || (pcmcia_parse_tuple(link, &tuple, &parse) != 0)) + if ( (pcmcia_get_tuple_data(handle, &tuple) != 0) + || (pcmcia_parse_tuple(handle, &tuple, &parse) != 0)) goto next_entry; if (cfg->flags & CISTPL_CFTABLE_DEFAULT) @@ -696,6 +724,12 @@ 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)) { @@ -713,10 +747,10 @@ spectrum_cs_config(struct pcmcia_device *link) } if (cfg->vpp1.present & (1 << CISTPL_POWER_VNOM)) - link->conf.Vpp = + link->conf.Vpp1 = link->conf.Vpp2 = cfg->vpp1.param[CISTPL_POWER_VNOM] / 10000; else if (dflt.vpp1.present & (1 << CISTPL_POWER_VNOM)) - link->conf.Vpp = + link->conf.Vpp1 = link->conf.Vpp2 = dflt.vpp1.param[CISTPL_POWER_VNOM] / 10000; /* Do we need to allocate an interrupt? */ @@ -746,7 +780,7 @@ spectrum_cs_config(struct pcmcia_device *link) } /* This reserves IO space but doesn't actually enable it */ - if (pcmcia_request_io(link, &link->io) != 0) + if (pcmcia_request_io(link->handle, &link->io) != 0) goto next_entry; } @@ -756,8 +790,9 @@ spectrum_cs_config(struct pcmcia_device *link) break; next_entry: - pcmcia_disable_device(link); - last_ret = pcmcia_get_next_tuple(link, &tuple); + if (link->io.NumPorts1) + pcmcia_release_io(link->handle, &link->io); + last_ret = pcmcia_get_next_tuple(handle, &tuple); if (last_ret == CS_NO_MORE_ITEMS) { printk(KERN_ERR PFX "GetNextTuple(): No matching " "CIS configuration. Maybe you need the " @@ -771,7 +806,7 @@ spectrum_cs_config(struct pcmcia_device *link) * a handler to the interrupt, unless the 'Handler' member of * the irq structure is initialized. */ - CS_CHECK(RequestIRQ, pcmcia_request_irq(link, &link->irq)); + CS_CHECK(RequestIRQ, pcmcia_request_irq(link->handle, &link->irq)); /* We initialize the hermes structure before completing PCMCIA * configuration just in case the interrupt handler gets @@ -788,7 +823,7 @@ spectrum_cs_config(struct pcmcia_device *link) * card and host interface into "Memory and IO" mode. */ CS_CHECK(RequestConfiguration, - pcmcia_request_configuration(link, &link->conf)); + pcmcia_request_configuration(link->handle, &link->conf)); /* Ok, we have the configuration, prepare to register the netdev */ dev->base_addr = link->io.BasePort1; @@ -801,7 +836,7 @@ spectrum_cs_config(struct pcmcia_device *link) goto failed; } - SET_NETDEV_DEV(dev, &handle_to_dev(link)); + SET_NETDEV_DEV(dev, &handle_to_dev(handle)); /* Tell the stack we exist */ if (register_netdev(dev) != 0) { printk(KERN_ERR PFX "register_netdev() failed\n"); @@ -809,26 +844,36 @@ spectrum_cs_config(struct pcmcia_device *link) } /* At this point, the dev_node_t structure(s) needs to be - * initialized and arranged in a linked list at link->dev_node. */ + * initialized and arranged in a linked list at link->dev. */ strcpy(card->node.dev_name, dev->name); - link->dev_node = &card->node; /* link->dev_node being non-NULL is also + link->dev = &card->node; /* link->dev being non-NULL is also used to indicate that the net_device has been registered */ + link->state &= ~DEV_CONFIG_PENDING; /* Finally, report what we've done */ - 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; + printk(KERN_DEBUG "%s: index 0x%02x: Vcc %d.%d", + dev->name, link->conf.ConfigIndex, + link->conf.Vcc / 10, link->conf.Vcc % 10); + if (link->conf.Vpp1) + printk(", Vpp %d.%d", link->conf.Vpp1 / 10, + link->conf.Vpp1 % 10); + printk(", irq %d", link->irq.AssignedIRQ); + 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"); + + return; cs_failed: - cs_error(link, last_fn, last_ret); + cs_error(link->handle, last_fn, last_ret); failed: spectrum_cs_release(link); - return -ENODEV; } /* spectrum_cs_config */ /* @@ -837,7 +882,7 @@ spectrum_cs_config(struct pcmcia_device *link) * still open, this will be postponed until it is closed. */ static void -spectrum_cs_release(struct pcmcia_device *link) +spectrum_cs_release(dev_link_t *link) { struct net_device *dev = link->priv; struct orinoco_private *priv = netdev_priv(dev); @@ -849,45 +894,64 @@ spectrum_cs_release(struct pcmcia_device *link) priv->hw_unavailable++; spin_unlock_irqrestore(&priv->lock, flags); - pcmcia_disable_device(link); + /* Don't bother checking to see if these succeed or not */ + 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 (priv->hw.iobase) ioport_unmap(priv->hw.iobase); } /* spectrum_cs_release */ static int -spectrum_cs_suspend(struct pcmcia_device *link) +spectrum_cs_suspend(struct pcmcia_device *p_dev) { + dev_link_t *link = dev_to_instance(p_dev); struct net_device *dev = link->priv; struct orinoco_private *priv = netdev_priv(dev); + unsigned long flags; int err = 0; + link->state |= DEV_SUSPEND; /* Mark the device as stopped, to block IO until later */ - spin_lock(&priv->lock); + if (link->state & DEV_CONFIG) { + spin_lock_irqsave(&priv->lock, flags); - err = __orinoco_down(dev); - if (err) - printk(KERN_WARNING "%s: Error %d downing interface\n", - dev->name, err); + err = __orinoco_down(dev); + if (err) + printk(KERN_WARNING "%s: Error %d downing interface\n", + dev->name, err); - netif_device_detach(dev); - priv->hw_unavailable++; + netif_device_detach(dev); + priv->hw_unavailable++; - spin_unlock(&priv->lock); + spin_unlock_irqrestore(&priv->lock, flags); - return err; + pcmcia_release_configuration(link->handle); + } + + return 0; } static int -spectrum_cs_resume(struct pcmcia_device *link) +spectrum_cs_resume(struct pcmcia_device *p_dev) { + dev_link_t *link = dev_to_instance(p_dev); struct net_device *dev = link->priv; struct orinoco_private *priv = netdev_priv(dev); - netif_device_attach(dev); - priv->hw_unavailable--; - schedule_work(&priv->reset_work); - + link->state &= ~DEV_SUSPEND; + if (link->state & DEV_CONFIG) { + /* FIXME: should we double check that this is + * the same card as we had before */ + pcmcia_request_configuration(link->handle, &link->conf); + netif_device_attach(dev); + priv->hw_unavailable--; + schedule_work(&priv->reset_work); + } return 0; } @@ -903,7 +967,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 LA4137 */ + PCMCIA_DEVICE_MANF_CARD(0x026c, 0x0001), /* Symbol Spectrum24 LA4100 */ 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, @@ -915,7 +979,7 @@ static struct pcmcia_driver orinoco_driver = { .drv = { .name = DRIVER_NAME, }, - .probe = spectrum_cs_probe, + .probe = spectrum_cs_attach, .remove = spectrum_cs_detach, .suspend = spectrum_cs_suspend, .resume = spectrum_cs_resume, diff --git a/drivers/net/wireless/strip.c b/drivers/net/wireless/strip.c index ccaf28e8d..18baacfc5 100644 --- a/drivers/net/wireless/strip.c +++ b/drivers/net/wireless/strip.c @@ -81,6 +81,7 @@ static const char StripVersion[] = "1.3A-STUART.CHESHIRE"; /************************************************************************/ /* Header files */ +#include #include #include #include @@ -111,7 +112,7 @@ static const char StripVersion[] = "1.3A-STUART.CHESHIRE"; #include #include #include -#include + /************************************************************************/ /* Useful structures and definitions */ @@ -467,7 +468,6 @@ 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,11 +475,10 @@ 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); - ret = 1; + return 1; } - neigh_release(neighbor_entry); } - return ret; + return 0; } static void DumpData(char *msg, struct strip *strip_info, __u8 * ptr, @@ -1570,7 +1569,7 @@ static int strip_xmit(struct sk_buff *skb, struct net_device *dev) del_timer(&strip_info->idle_timer); - if (time_after(jiffies, strip_info->pps_timer + HZ)) { + if (jiffies - strip_info->pps_timer > HZ) { unsigned long t = jiffies - strip_info->pps_timer; unsigned long rx_pps_count = (strip_info->rx_pps_count * HZ * 8 + t / 2) / t; unsigned long tx_pps_count = (strip_info->tx_pps_count * HZ * 8 + t / 2) / t; diff --git a/drivers/net/wireless/wavelan.c b/drivers/net/wireless/wavelan.c index 5b69befda..ff192e962 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 ((c < NELS(channel_bands)) && - (((channel_bands[c] >> 1) - 24) < freq)) + while ((((channel_bands[c] >> 1) - 24) < freq) && + (c < NELS(channel_bands))) c++; list[i].i = c; /* Set the list index */ @@ -2903,7 +2903,6 @@ 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, @@ -2938,15 +2937,14 @@ 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) { - 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 */ + skb = skb_padto(skb, ETH_ZLEN); + if (skb == NULL) + return 0; } - else if(wv_packet_write(dev, skb->data, skb->len)) - return 1; /* We failed */ + /* Write packet on the card */ + if(wv_packet_write(dev, skb->data, skb->len)) + return 1; /* We failed */ dev_kfree_skb(skb); @@ -4308,7 +4306,7 @@ out: * Insertion of the module * I'm now quite proud of the multi-device support. */ -int __init init_module(void) +int init_module(void) { int ret = -EIO; /* Return error if no cards found */ int i; diff --git a/drivers/net/wireless/wavelan.p.h b/drivers/net/wireless/wavelan.p.h index 5cb0bc8bb..166e28b9a 100644 --- a/drivers/net/wireless/wavelan.p.h +++ b/drivers/net/wireless/wavelan.p.h @@ -98,7 +98,11 @@ * characteristics of the hardware. Applications such as mobile IP may * take advantage of it. * - * It might be a good idea as well to fetch the wireless tools to + * You will need to enable the CONFIG_NET_RADIO define in the kernel + * configuration to enable the wireless extensions (this is the one + * giving access to the radio network device choice). + * + * It might also be a good idea as well to fetch the wireless tools to * configure the device and play a bit. */ diff --git a/drivers/net/wireless/wavelan_cs.c b/drivers/net/wireless/wavelan_cs.c index 561250f73..98122f3a4 100644 --- a/drivers/net/wireless/wavelan_cs.c +++ b/drivers/net/wireless/wavelan_cs.c @@ -1005,7 +1005,7 @@ static inline void wv_82593_reconfig(struct net_device * dev) { net_local * lp = netdev_priv(dev); - struct pcmcia_device * link = lp->link; + dev_link_t * link = lp->link; unsigned long flags; /* Arm the flag, will be cleard in wv_82593_config() */ @@ -3194,8 +3194,11 @@ 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_padto(skb, ETH_ZLEN)) - return 0; + if (skb->len < ETH_ZLEN) { + skb = skb_padto(skb, ETH_ZLEN); + if (skb == NULL) + return 0; + } wv_packet_write(dev, skb->data, skb->len); @@ -3741,16 +3744,16 @@ wv_pcmcia_reset(struct net_device * dev) { int i; conf_reg_t reg = { 0, CS_READ, CISREG_COR, 0 }; - struct pcmcia_device * link = ((net_local *)netdev_priv(dev))->link; + dev_link_t * link = ((net_local *)netdev_priv(dev))->link; #ifdef DEBUG_CONFIG_TRACE printk(KERN_DEBUG "%s: ->wv_pcmcia_reset()\n", dev->name); #endif - i = pcmcia_access_configuration_register(link, ®); + i = pcmcia_access_configuration_register(link->handle, ®); if(i != CS_SUCCESS) { - cs_error(link, AccessConfigurationRegister, i); + cs_error(link->handle, AccessConfigurationRegister, i); return FALSE; } @@ -3761,19 +3764,19 @@ wv_pcmcia_reset(struct net_device * dev) reg.Action = CS_WRITE; reg.Value = reg.Value | COR_SW_RESET; - i = pcmcia_access_configuration_register(link, ®); + i = pcmcia_access_configuration_register(link->handle, ®); if(i != CS_SUCCESS) { - cs_error(link, AccessConfigurationRegister, i); + cs_error(link->handle, AccessConfigurationRegister, i); return FALSE; } reg.Action = CS_WRITE; reg.Value = COR_LEVEL_IRQ | COR_CONFIG; - i = pcmcia_access_configuration_register(link, ®); + i = pcmcia_access_configuration_register(link->handle, ®); if(i != CS_SUCCESS) { - cs_error(link, AccessConfigurationRegister, i); + cs_error(link->handle, AccessConfigurationRegister, i); return FALSE; } @@ -3937,8 +3940,9 @@ wv_hw_reset(struct net_device * dev) * (called by wavelan_event()) */ static inline int -wv_pcmcia_config(struct pcmcia_device * link) +wv_pcmcia_config(dev_link_t * link) { + client_handle_t handle = link->handle; tuple_t tuple; cisparse_t parse; struct net_device * dev = (struct net_device *) link->priv; @@ -3961,16 +3965,16 @@ wv_pcmcia_config(struct pcmcia_device * link) { tuple.Attributes = 0; tuple.DesiredTuple = CISTPL_CONFIG; - i = pcmcia_get_first_tuple(link, &tuple); + i = pcmcia_get_first_tuple(handle, &tuple); if(i != CS_SUCCESS) break; tuple.TupleData = (cisdata_t *)buf; tuple.TupleDataMax = 64; tuple.TupleOffset = 0; - i = pcmcia_get_tuple_data(link, &tuple); + i = pcmcia_get_tuple_data(handle, &tuple); if(i != CS_SUCCESS) break; - i = pcmcia_parse_tuple(link, &tuple, &parse); + i = pcmcia_parse_tuple(handle, &tuple, &parse); if(i != CS_SUCCESS) break; link->conf.ConfigBase = parse.config.base; @@ -3979,16 +3983,19 @@ wv_pcmcia_config(struct pcmcia_device * link) while(0); if(i != CS_SUCCESS) { - cs_error(link, ParseTuple, i); + cs_error(link->handle, ParseTuple, i); + link->state &= ~DEV_CONFIG_PENDING; return FALSE; } - + + /* Configure card */ + link->state |= DEV_CONFIG; do { - i = pcmcia_request_io(link, &link->io); + i = pcmcia_request_io(link->handle, &link->io); if(i != CS_SUCCESS) { - cs_error(link, RequestIO, i); + cs_error(link->handle, RequestIO, i); break; } @@ -3996,10 +4003,10 @@ wv_pcmcia_config(struct pcmcia_device * link) * Now allocate an interrupt line. Note that this does not * actually assign a handler to the interrupt. */ - i = pcmcia_request_irq(link, &link->irq); + i = pcmcia_request_irq(link->handle, &link->irq); if(i != CS_SUCCESS) { - cs_error(link, RequestIRQ, i); + cs_error(link->handle, RequestIRQ, i); break; } @@ -4008,15 +4015,15 @@ wv_pcmcia_config(struct pcmcia_device * link) * the I/O windows and the interrupt mapping. */ link->conf.ConfigIndex = 1; - i = pcmcia_request_configuration(link, &link->conf); + i = pcmcia_request_configuration(link->handle, &link->conf); if(i != CS_SUCCESS) { - cs_error(link, RequestConfiguration, i); + cs_error(link->handle, RequestConfiguration, i); break; } /* - * Allocate a small memory window. Note that the struct pcmcia_device + * Allocate a small memory window. Note that the dev_link_t * structure provides space for one window handle -- if your * device needs several windows, you'll need to keep track of * the handles in your private data structure, link->priv. @@ -4024,10 +4031,10 @@ wv_pcmcia_config(struct pcmcia_device * link) req.Attributes = WIN_DATA_WIDTH_8|WIN_MEMORY_TYPE_AM|WIN_ENABLE; req.Base = req.Size = 0; req.AccessSpeed = mem_speed; - i = pcmcia_request_window(&link, &req, &link->win); + i = pcmcia_request_window(&link->handle, &req, &link->win); if(i != CS_SUCCESS) { - cs_error(link, RequestWindow, i); + cs_error(link->handle, RequestWindow, i); break; } @@ -4039,7 +4046,7 @@ wv_pcmcia_config(struct pcmcia_device * link) i = pcmcia_map_mem_page(link->win, &mem); if(i != CS_SUCCESS) { - cs_error(link, MapMemPage, i); + cs_error(link->handle, MapMemPage, i); break; } @@ -4053,7 +4060,7 @@ wv_pcmcia_config(struct pcmcia_device * link) lp->mem, dev->irq, (u_int) dev->base_addr); #endif - SET_NETDEV_DEV(dev, &handle_to_dev(link)); + SET_NETDEV_DEV(dev, &handle_to_dev(handle)); i = register_netdev(dev); if(i != 0) { @@ -4065,6 +4072,7 @@ wv_pcmcia_config(struct pcmcia_device * link) } while(0); /* Humm... Disguised goto !!! */ + link->state &= ~DEV_CONFIG_PENDING; /* If any step failed, release any partially configured state */ if(i != 0) { @@ -4073,7 +4081,7 @@ wv_pcmcia_config(struct pcmcia_device * link) } strcpy(((net_local *) netdev_priv(dev))->node.dev_name, dev->name); - link->dev_node = &((net_local *) netdev_priv(dev))->node; + link->dev = &((net_local *) netdev_priv(dev))->node; #ifdef DEBUG_CONFIG_TRACE printk(KERN_DEBUG "<-wv_pcmcia_config()\n"); @@ -4088,20 +4096,26 @@ wv_pcmcia_config(struct pcmcia_device * link) * still open, this will be postponed until it is closed. */ static void -wv_pcmcia_release(struct pcmcia_device *link) +wv_pcmcia_release(dev_link_t *link) { - struct net_device * dev = (struct net_device *) link->priv; - net_local * lp = netdev_priv(dev); + struct net_device * dev = (struct net_device *) link->priv; + net_local * lp = netdev_priv(dev); #ifdef DEBUG_CONFIG_TRACE - printk(KERN_DEBUG "%s: -> wv_pcmcia_release(0x%p)\n", dev->name, link); + printk(KERN_DEBUG "%s: -> wv_pcmcia_release(0x%p)\n", dev->name, link); #endif - iounmap(lp->mem); - pcmcia_disable_device(link); + /* Don't bother checking to see if these succeed or not */ + iounmap(lp->mem); + pcmcia_release_window(link->win); + pcmcia_release_configuration(link->handle); + pcmcia_release_io(link->handle, &link->io); + pcmcia_release_irq(link->handle, &link->irq); + + link->state &= ~DEV_CONFIG; #ifdef DEBUG_CONFIG_TRACE - printk(KERN_DEBUG "%s: <- wv_pcmcia_release()\n", dev->name); + printk(KERN_DEBUG "%s: <- wv_pcmcia_release()\n", dev->name); #endif } @@ -4465,7 +4479,7 @@ static int wavelan_open(struct net_device * dev) { net_local * lp = netdev_priv(dev); - struct pcmcia_device * link = lp->link; + dev_link_t * link = lp->link; kio_addr_t base = dev->base_addr; #ifdef DEBUG_CALLBACK_TRACE @@ -4519,7 +4533,7 @@ wavelan_open(struct net_device * dev) static int wavelan_close(struct net_device * dev) { - struct pcmcia_device * link = ((net_local *)netdev_priv(dev))->link; + dev_link_t * link = ((net_local *)netdev_priv(dev))->link; kio_addr_t base = dev->base_addr; #ifdef DEBUG_CALLBACK_TRACE @@ -4573,36 +4587,45 @@ wavelan_close(struct net_device * dev) * card insertion event. */ static int -wavelan_probe(struct pcmcia_device *p_dev) +wavelan_attach(struct pcmcia_device *p_dev) { + dev_link_t * link; /* Info for cardmgr */ struct net_device * dev; /* Interface generic data */ net_local * lp; /* Interface specific data */ - int ret; #ifdef DEBUG_CALLBACK_TRACE printk(KERN_DEBUG "-> wavelan_attach()\n"); #endif + /* Initialize the dev_link_t structure */ + link = kzalloc(sizeof(struct dev_link_t), GFP_KERNEL); + if (!link) return -ENOMEM; + /* The io structure describes IO port mapping */ - p_dev->io.NumPorts1 = 8; - p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_8; - p_dev->io.IOAddrLines = 3; + link->io.NumPorts1 = 8; + link->io.Attributes1 = IO_DATA_PATH_WIDTH_8; + link->io.IOAddrLines = 3; /* Interrupt setup */ - p_dev->irq.Attributes = IRQ_TYPE_EXCLUSIVE | IRQ_HANDLE_PRESENT; - p_dev->irq.IRQInfo1 = IRQ_LEVEL_ID; - p_dev->irq.Handler = wavelan_interrupt; + link->irq.Attributes = IRQ_TYPE_EXCLUSIVE | IRQ_HANDLE_PRESENT; + link->irq.IRQInfo1 = IRQ_LEVEL_ID; + link->irq.Handler = wavelan_interrupt; /* General socket configuration */ - p_dev->conf.Attributes = CONF_ENABLE_IRQ; - p_dev->conf.IntType = INT_MEMORY_AND_IO; + link->conf.Attributes = CONF_ENABLE_IRQ; + link->conf.Vcc = 50; + link->conf.IntType = INT_MEMORY_AND_IO; + + /* Chain drivers */ + link->next = NULL; /* Allocate the generic data structure */ dev = alloc_etherdev(sizeof(net_local)); - if (!dev) + if (!dev) { + kfree(link); return -ENOMEM; - - p_dev->priv = p_dev->irq.Instance = dev; + } + link->priv = link->irq.Instance = dev; lp = netdev_priv(dev); @@ -4619,6 +4642,7 @@ wavelan_probe(struct pcmcia_device *p_dev) spin_lock_init(&lp->spinlock); /* back links */ + lp->link = link; lp->dev = dev; /* wavelan NET3 callbacks */ @@ -4644,18 +4668,15 @@ wavelan_probe(struct pcmcia_device *p_dev) /* Other specific data */ dev->mtu = WAVELAN_MTU; - ret = wv_pcmcia_config(p_dev); - if (ret) - return ret; + link->handle = p_dev; + p_dev->instance = link; - ret = wv_hw_config(dev); - if (ret) { + link->state |= DEV_PRESENT | DEV_CONFIG_PENDING; + if(wv_pcmcia_config(link) && + wv_hw_config(dev)) + wv_init_info(dev); + else dev->irq = 0; - pcmcia_disable_device(p_dev); - return ret; - } - - wv_init_info(dev); #ifdef DEBUG_CALLBACK_TRACE printk(KERN_DEBUG "<- wavelan_attach()\n"); @@ -4672,14 +4693,25 @@ wavelan_probe(struct pcmcia_device *p_dev) * is released. */ static void -wavelan_detach(struct pcmcia_device *link) +wavelan_detach(struct pcmcia_device *p_dev) { + dev_link_t *link = dev_to_instance(p_dev); + #ifdef DEBUG_CALLBACK_TRACE printk(KERN_DEBUG "-> wavelan_detach(0x%p)\n", link); #endif - /* Some others haven't done their job : give them another chance */ - wv_pcmcia_release(link); + /* + * If the device is currently configured and active, we won't + * actually delete it yet. Instead, it is marked so that when the + * release() function is called, that will trigger a proper + * detach(). + */ + if(link->state & DEV_CONFIG) + { + /* Some others haven't done their job : give them another chance */ + wv_pcmcia_release(link); + } /* Free pieces */ if(link->priv) @@ -4688,21 +4720,23 @@ wavelan_detach(struct pcmcia_device *link) /* Remove ourselves from the kernel list of ethernet devices */ /* Warning : can't be called from interrupt, timer or wavelan_close() */ - if (link->dev_node) + if (link->dev) unregister_netdev(dev); - link->dev_node = NULL; + link->dev = NULL; ((net_local *)netdev_priv(dev))->link = NULL; ((net_local *)netdev_priv(dev))->dev = NULL; free_netdev(dev); } + kfree(link); #ifdef DEBUG_CALLBACK_TRACE printk(KERN_DEBUG "<- wavelan_detach()\n"); #endif } -static int wavelan_suspend(struct pcmcia_device *link) +static int wavelan_suspend(struct pcmcia_device *p_dev) { + dev_link_t *link = dev_to_instance(p_dev); struct net_device * dev = (struct net_device *) link->priv; /* NB: wavelan_close will be called, but too late, so we are @@ -4714,22 +4748,36 @@ static int wavelan_suspend(struct pcmcia_device *link) /* Stop receiving new messages and wait end of transmission */ wv_ru_stop(dev); - if (link->open) - netif_device_detach(dev); - /* Power down the module */ hacr_write(dev->base_addr, HACR_DEFAULT & (~HACR_PWR_STAT)); + /* The card is now suspended */ + link->state |= DEV_SUSPEND; + + if(link->state & DEV_CONFIG) + { + if(link->open) + netif_device_detach(dev); + pcmcia_release_configuration(link->handle); + } + return 0; } -static int wavelan_resume(struct pcmcia_device *link) +static int wavelan_resume(struct pcmcia_device *p_dev) { + dev_link_t *link = dev_to_instance(p_dev); struct net_device * dev = (struct net_device *) link->priv; - if (link->open) { - wv_hw_reset(dev); - netif_device_attach(dev); + link->state &= ~DEV_SUSPEND; + if(link->state & DEV_CONFIG) + { + pcmcia_request_configuration(link->handle, &link->conf); + if(link->open) /* If RESET -> True, If RESUME -> False ? */ + { + wv_hw_reset(dev); + netif_device_attach(dev); + } } return 0; @@ -4750,7 +4798,7 @@ static struct pcmcia_driver wavelan_driver = { .drv = { .name = "wavelan_cs", }, - .probe = wavelan_probe, + .probe = wavelan_attach, .remove = wavelan_detach, .id_table = wavelan_ids, .suspend = wavelan_suspend, diff --git a/drivers/net/wireless/wavelan_cs.p.h b/drivers/net/wireless/wavelan_cs.p.h index f34a36b0c..f2d597568 100644 --- a/drivers/net/wireless/wavelan_cs.p.h +++ b/drivers/net/wireless/wavelan_cs.p.h @@ -99,7 +99,11 @@ * caracteristics of the hardware in a standard way and support for * applications for taking advantage of it (like Mobile IP). * - * It might be a good idea as well to fetch the wireless tools to + * You will need to enable the CONFIG_NET_RADIO define in the kernel + * configuration to enable the wireless extensions (this is the one + * giving access to the radio network device choice). + * + * It might also be a good idea as well to fetch the wireless tools to * configure the device and play a bit. */ @@ -411,6 +415,7 @@ /***************************** INCLUDES *****************************/ /* Linux headers that we need */ +#include #include #include #include @@ -435,8 +440,11 @@ #include #include #include + +#ifdef CONFIG_NET_RADIO #include /* Wireless extensions */ #include /* New driver API */ +#endif /* Pcmcia headers that we need */ #include @@ -601,7 +609,7 @@ struct net_local dev_node_t node; /* ???? What is this stuff ???? */ struct net_device * dev; /* Reverse link... */ spinlock_t spinlock; /* Serialize access to the hardware (SMP) */ - struct pcmcia_device * link; /* pcmcia structure */ + dev_link_t * link; /* pcmcia structure */ en_stats stats; /* Ethernet interface statistics */ int nresets; /* Number of hw resets */ u_char configured; /* If it is configured */ @@ -732,9 +740,9 @@ static int static inline void wv_hw_reset(struct net_device *); /* Same, + start receiver unit */ static inline int - wv_pcmcia_config(struct pcmcia_device *); /* Configure the pcmcia interface */ + wv_pcmcia_config(dev_link_t *); /* Configure the pcmcia interface */ static void - wv_pcmcia_release(struct pcmcia_device *);/* Remove a device */ + wv_pcmcia_release(dev_link_t *);/* Remove a device */ /* ---------------------- INTERRUPT HANDLING ---------------------- */ static irqreturn_t wavelan_interrupt(int, /* Interrupt handler */ diff --git a/drivers/net/wireless/wl3501.h b/drivers/net/wireless/wl3501.h index 65ceb088f..4303c50c2 100644 --- a/drivers/net/wireless/wl3501.h +++ b/drivers/net/wireless/wl3501.h @@ -611,6 +611,5 @@ struct wl3501_card { struct iw_spy_data spy_data; struct iw_public_data wireless_data; struct dev_node_t node; - struct pcmcia_device *p_dev; }; #endif diff --git a/drivers/net/wireless/wl3501_cs.c b/drivers/net/wireless/wl3501_cs.c index c03e400fa..48e10b0c7 100644 --- a/drivers/net/wireless/wl3501_cs.c +++ b/drivers/net/wireless/wl3501_cs.c @@ -28,6 +28,7 @@ */ #undef REALLY_SLOW_IO /* most systems can safely undef this */ +#include #include #include #include @@ -102,8 +103,8 @@ module_param(pc_debug, int, 0); * release a socket, in response to card insertion and ejection events. They * are invoked from the wl24 event handler. */ -static int wl3501_config(struct pcmcia_device *link); -static void wl3501_release(struct pcmcia_device *link); +static void wl3501_config(dev_link_t *link); +static void wl3501_release(dev_link_t *link); /* * The dev_info variable is the "key" that is used to match up this @@ -225,6 +226,17 @@ static void iw_copy_mgmt_info_element(struct iw_mgmt_info_element *to, iw_set_mgmt_info_element(from->id, to, from->data, from->len); } +/* + * A linked list of "instances" of the wl24 device. Each actual PCMCIA card + * corresponds to one device instance, and is described by one dev_link_t + * structure (defined in ds.h). + * + * You may not want to use a linked list for this -- for example, the memory + * card driver uses an array of dev_link_t pointers, where minor device numbers + * are used to derive the corresponding array index. + */ +static dev_link_t *wl3501_dev_list; + static inline void wl3501_switch_page(struct wl3501_card *this, u8 page) { wl3501_outb(page, this->base_addr + WL3501_NIC_BSS); @@ -1269,10 +1281,15 @@ static int wl3501_close(struct net_device *dev) struct wl3501_card *this = dev->priv; int rc = -ENODEV; unsigned long flags; - struct pcmcia_device *link; - link = this->p_dev; + dev_link_t *link; spin_lock_irqsave(&this->lock, flags); + /* Check if the device is in wl3501_dev_list */ + for (link = wl3501_dev_list; link; link = link->next) + if (link->priv == dev) + break; + if (!link) + goto out; link->open--; /* Stop wl3501_hard_start_xmit() from now on */ @@ -1284,6 +1301,7 @@ static int wl3501_close(struct net_device *dev) rc = 0; printk(KERN_INFO "%s: WL3501 closed\n", dev->name); +out: spin_unlock_irqrestore(&this->lock, flags); return rc; } @@ -1382,11 +1400,14 @@ static int wl3501_open(struct net_device *dev) int rc = -ENODEV; struct wl3501_card *this = dev->priv; unsigned long flags; - struct pcmcia_device *link; - link = this->p_dev; + dev_link_t *link; spin_lock_irqsave(&this->lock, flags); - if (!pcmcia_dev_present(link)) + /* Check if the device is in wl3501_dev_list */ + for (link = wl3501_dev_list; link; link = link->next) + if (link->priv == dev) + break; + if (!DEV_OK(link)) goto out; netif_device_attach(dev); link->open++; @@ -1476,23 +1497,38 @@ static struct ethtool_ops ops = { * Services. If it has been released, all local data structures are freed. * Otherwise, the structures will be freed when the device is released. */ -static void wl3501_detach(struct pcmcia_device *link) +static void wl3501_detach(struct pcmcia_device *p_dev) { + dev_link_t *link = dev_to_instance(p_dev); + dev_link_t **linkp; struct net_device *dev = link->priv; + /* Locate device structure */ + for (linkp = &wl3501_dev_list; *linkp; linkp = &(*linkp)->next) + if (*linkp == link) + break; + if (!*linkp) + goto out; + /* If the device is currently configured and active, we won't actually * delete it yet. Instead, it is marked so that when the release() * function is called, that will trigger a proper detach(). */ - while (link->open > 0) - wl3501_close(dev); + if (link->state & DEV_CONFIG) { + while (link->open > 0) + wl3501_close(dev); - netif_device_detach(dev); - wl3501_release(link); + netif_device_detach(dev); + wl3501_release(link); + } + + /* Unlink device structure, free pieces */ + *linkp = link->next; if (link->priv) free_netdev(link->priv); - + kfree(link); +out: return; } @@ -1917,26 +1953,33 @@ static const struct iw_handler_def wl3501_handler_def = { * The dev_link structure is initialized, but we don't actually configure the * card at this point -- we wait until we receive a card insertion event. */ -static int wl3501_probe(struct pcmcia_device *p_dev) +static int wl3501_attach(struct pcmcia_device *p_dev) { + dev_link_t *link; struct net_device *dev; struct wl3501_card *this; + /* Initialize the dev_link_t structure */ + link = kzalloc(sizeof(*link), GFP_KERNEL); + if (!link) + return -ENOMEM; + /* The io structure describes IO port mapping */ - p_dev->io.NumPorts1 = 16; - p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_8; - p_dev->io.IOAddrLines = 5; + link->io.NumPorts1 = 16; + link->io.Attributes1 = IO_DATA_PATH_WIDTH_8; + link->io.IOAddrLines = 5; /* Interrupt setup */ - p_dev->irq.Attributes = IRQ_TYPE_EXCLUSIVE | IRQ_HANDLE_PRESENT; - p_dev->irq.IRQInfo1 = IRQ_LEVEL_ID; - p_dev->irq.Handler = wl3501_interrupt; + link->irq.Attributes = IRQ_TYPE_EXCLUSIVE | IRQ_HANDLE_PRESENT; + link->irq.IRQInfo1 = IRQ_LEVEL_ID; + link->irq.Handler = wl3501_interrupt; /* General socket configuration */ - p_dev->conf.Attributes = CONF_ENABLE_IRQ; - p_dev->conf.IntType = INT_MEMORY_AND_IO; - p_dev->conf.ConfigIndex = 1; - p_dev->conf.Present = PRESENT_OPTION; + link->conf.Attributes = CONF_ENABLE_IRQ; + link->conf.Vcc = 50; + link->conf.IntType = INT_MEMORY_AND_IO; + link->conf.ConfigIndex = 1; + link->conf.Present = PRESENT_OPTION; dev = alloc_etherdev(sizeof(struct wl3501_card)); if (!dev) @@ -1949,15 +1992,22 @@ static int wl3501_probe(struct pcmcia_device *p_dev) dev->get_stats = wl3501_get_stats; this = dev->priv; this->wireless_data.spy_data = &this->spy_data; - this->p_dev = p_dev; dev->wireless_data = &this->wireless_data; dev->wireless_handlers = (struct iw_handler_def *)&wl3501_handler_def; SET_ETHTOOL_OPS(dev, &ops); netif_stop_queue(dev); - p_dev->priv = p_dev->irq.Instance = dev; + link->priv = link->irq.Instance = dev; + + link->handle = p_dev; + p_dev->instance = link; + + link->state |= DEV_PRESENT | DEV_CONFIG_PENDING; + wl3501_config(link); - return wl3501_config(p_dev); + return 0; out_link: + kfree(link); + link = NULL; return -ENOMEM; } @@ -1972,10 +2022,11 @@ do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0) * received, to configure the PCMCIA socket, and to make the ethernet device * available to the system. */ -static int wl3501_config(struct pcmcia_device *link) +static void wl3501_config(dev_link_t *link) { tuple_t tuple; cisparse_t parse; + client_handle_t handle = link->handle; struct net_device *dev = link->priv; int i = 0, j, last_fn, last_ret; unsigned char bf[64]; @@ -1984,15 +2035,18 @@ static int wl3501_config(struct pcmcia_device *link) /* This reads the card's CONFIG tuple to find its config registers. */ tuple.Attributes = 0; tuple.DesiredTuple = CISTPL_CONFIG; - CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(link, &tuple)); + CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple)); tuple.TupleData = bf; tuple.TupleDataMax = sizeof(bf); tuple.TupleOffset = 0; - CS_CHECK(GetTupleData, pcmcia_get_tuple_data(link, &tuple)); - CS_CHECK(ParseTuple, pcmcia_parse_tuple(link, &tuple, &parse)); + CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple)); + CS_CHECK(ParseTuple, pcmcia_parse_tuple(handle, &tuple, &parse)); link->conf.ConfigBase = parse.config.base; link->conf.Present = parse.config.rmask[0]; + /* Configure card */ + link->state |= DEV_CONFIG; + /* Try allocating IO ports. This tries a few fixed addresses. If you * want, you can also read the card's config table to pick addresses -- * see the serial driver for an example. */ @@ -2002,28 +2056,28 @@ static int wl3501_config(struct pcmcia_device *link) * 0x200-0x2ff, and so on, because this seems safer */ link->io.BasePort1 = j; link->io.BasePort2 = link->io.BasePort1 + 0x10; - i = pcmcia_request_io(link, &link->io); + i = pcmcia_request_io(link->handle, &link->io); if (i == CS_SUCCESS) break; } if (i != CS_SUCCESS) { - cs_error(link, RequestIO, i); + cs_error(link->handle, RequestIO, i); goto failed; } /* Now allocate an interrupt line. Note that this does not actually * assign a handler to the interrupt. */ - CS_CHECK(RequestIRQ, pcmcia_request_irq(link, &link->irq)); + CS_CHECK(RequestIRQ, pcmcia_request_irq(link->handle, &link->irq)); /* This actually configures the PCMCIA socket -- setting up the I/O * windows and the interrupt mapping. */ - CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link, &link->conf)); + CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link->handle, &link->conf)); dev->irq = link->irq.AssignedIRQ; dev->base_addr = link->io.BasePort1; - SET_NETDEV_DEV(dev, &handle_to_dev(link)); + SET_NETDEV_DEV(dev, &handle_to_dev(handle)); if (register_netdev(dev)) { printk(KERN_NOTICE "wl3501_cs: register_netdev() failed\n"); goto failed; @@ -2034,9 +2088,10 @@ static int wl3501_config(struct pcmcia_device *link) this = dev->priv; /* * At this point, the dev_node_t structure(s) should be initialized and - * arranged in a linked list at link->dev_node. + * arranged in a linked list at link->dev. */ - link->dev_node = &this->node; + link->dev = &this->node; + link->state &= ~DEV_CONFIG_PENDING; this->base_addr = dev->base_addr; @@ -2072,13 +2127,13 @@ static int wl3501_config(struct pcmcia_device *link) spin_lock_init(&this->lock); init_waitqueue_head(&this->wait); netif_start_queue(dev); - return 0; - + goto out; cs_failed: - cs_error(link, last_fn, last_ret); + cs_error(link->handle, last_fn, last_ret); failed: wl3501_release(link); - return -ENODEV; +out: + return; } /** @@ -2089,36 +2144,52 @@ failed: * and release the PCMCIA configuration. If the device is still open, this * will be postponed until it is closed. */ -static void wl3501_release(struct pcmcia_device *link) +static void wl3501_release(dev_link_t *link) { struct net_device *dev = link->priv; /* Unlink the device chain */ - if (link->dev_node) + if (link->dev) { unregister_netdev(dev); + link->dev = NULL; + } - pcmcia_disable_device(link); + /* Don't bother checking to see if these succeed or not */ + pcmcia_release_configuration(link->handle); + pcmcia_release_io(link->handle, &link->io); + pcmcia_release_irq(link->handle, &link->irq); + link->state &= ~DEV_CONFIG; } -static int wl3501_suspend(struct pcmcia_device *link) +static int wl3501_suspend(struct pcmcia_device *p_dev) { + dev_link_t *link = dev_to_instance(p_dev); struct net_device *dev = link->priv; + link->state |= DEV_SUSPEND; + wl3501_pwr_mgmt(dev->priv, WL3501_SUSPEND); - if (link->open) - netif_device_detach(dev); + if (link->state & DEV_CONFIG) { + if (link->open) + netif_device_detach(dev); + pcmcia_release_configuration(link->handle); + } return 0; } -static int wl3501_resume(struct pcmcia_device *link) +static int wl3501_resume(struct pcmcia_device *p_dev) { + dev_link_t *link = dev_to_instance(p_dev); struct net_device *dev = link->priv; wl3501_pwr_mgmt(dev->priv, WL3501_RESUME); - if (link->open) { - wl3501_reset(dev); - netif_device_attach(dev); + if (link->state & DEV_CONFIG) { + pcmcia_request_configuration(link->handle, &link->conf); + if (link->open) { + wl3501_reset(dev); + netif_device_attach(dev); + } } return 0; @@ -2136,7 +2207,7 @@ static struct pcmcia_driver wl3501_driver = { .drv = { .name = "wl3501_cs", }, - .probe = wl3501_probe, + .probe = wl3501_attach, .remove = wl3501_detach, .id_table = wl3501_ids, .suspend = wl3501_suspend, @@ -2150,7 +2221,9 @@ static int __init wl3501_init_module(void) static void __exit wl3501_exit_module(void) { + dprintk(0, ": unloading"); pcmcia_unregister_driver(&wl3501_driver); + BUG_ON(wl3501_dev_list != NULL); } module_init(wl3501_init_module); diff --git a/drivers/net/yellowfin.c b/drivers/net/yellowfin.c index 8459a1825..1c2506535 100644 --- a/drivers/net/yellowfin.c +++ b/drivers/net/yellowfin.c @@ -19,13 +19,37 @@ 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 "2.0" -#define DRV_RELDATE "Jun 27, 2006" +#define DRV_VERSION "1.05+LK1.1.6" +#define DRV_RELDATE "Feb 11, 2002" #define PFX DRV_NAME ": " @@ -45,8 +69,8 @@ static int fifo_cfg = 0x0020; /* Bypass external Tx FIFO. */ static int dma_ctrl = 0x00CAC277; /* Override when loading module! */ static int fifo_cfg = 0x0028; #else -static const int dma_ctrl = 0x004A0263; /* Constrained by errata */ -static const int fifo_cfg = 0x0020; /* Bypass external Tx FIFO. */ +static int dma_ctrl = 0x004A0263; /* Constrained by errata */ +static int fifo_cfg = 0x0020; /* Bypass external Tx FIFO. */ #endif /* Set the copy breakpoint for the copy-only-tiny-frames scheme. @@ -210,16 +234,26 @@ 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. */ -enum { - YELLOWFIN_SIZE = 0x100, -}; +#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 struct pci_id_info { const char *name; @@ -227,21 +261,24 @@ 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[] = { +static 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}, - HasMII | DontUseEeprom }, - { } + PCI_IOTYPE, YELLOWFIN_SIZE, HasMII | DontUseEeprom }, + {NULL,}, }; -static const struct pci_device_id yellowfin_pci_tbl[] = { +static 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); @@ -579,7 +616,7 @@ static int yellowfin_open(struct net_device *dev) /* Reset the chip. */ iowrite32(0x80000000, ioaddr + DMACtrl); - i = request_irq(dev->irq, &yellowfin_interrupt, IRQF_SHARED, dev->name, dev); + i = request_irq(dev->irq, &yellowfin_interrupt, SA_SHIRQ, dev->name, dev); if (i) return i; if (yellowfin_debug > 1) @@ -825,11 +862,13 @@ 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 (skb_padto(skb, len)) { - yp->tx_skbuff[entry] = NULL; - netif_wake_queue(dev); - return 0; - } + if (len != skb->len) + skb = skb_padto(skb, len); + } + if (skb == NULL) { + yp->tx_skbuff[entry] = NULL; + netif_wake_queue(dev); + return 0; } } yp->tx_skbuff[entry] = skb; @@ -1402,7 +1441,8 @@ static void __devexit yellowfin_remove_one (struct pci_dev *pdev) struct net_device *dev = pci_get_drvdata(pdev); struct yellowfin_private *np; - BUG_ON(!dev); + if (!dev) + BUG(); np = netdev_priv(dev); pci_free_consistent(pdev, STATUS_TOTAL_SIZE, np->tx_status, diff --git a/drivers/net/znet.c b/drivers/net/znet.c index 9f0291f35..3ac047bc7 100644 --- a/drivers/net/znet.c +++ b/drivers/net/znet.c @@ -85,6 +85,7 @@ - Understand why some traffic patterns add a 1s latency... */ +#include #include #include #include @@ -543,7 +544,8 @@ 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) { - if (skb_padto(skb, ETH_ZLEN)) + skb = skb_padto(skb, ETH_ZLEN); + if (skb == NULL) return 0; length = ETH_ZLEN; } diff --git a/drivers/net/zorro8390.c b/drivers/net/zorro8390.c index df04e050c..8ab6e1215 100644 --- a/drivers/net/zorro8390.c +++ b/drivers/net/zorro8390.c @@ -27,7 +27,6 @@ #include #include #include -#include #include #include @@ -152,7 +151,7 @@ static int __devinit zorro8390_init(struct net_device *dev, z_writeb(z_readb(ioaddr + NE_RESET), ioaddr + NE_RESET); while ((z_readb(ioaddr + NE_EN0_ISR) & ENISR_RESET) == 0) - if (time_after(jiffies, reset_start_time + 2*HZ/100)) { + if (jiffies - reset_start_time > 2*HZ/100) { printk(KERN_WARNING " not found (no reset ack).\n"); return -ENODEV; } @@ -201,7 +200,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, IRQF_SHARED, DRV_NAME, dev); + i = request_irq(IRQ_AMIGA_PORTS, ei_interrupt, SA_SHIRQ, DRV_NAME, dev); if (i) return i; for(i = 0; i < ETHER_ADDR_LEN; i++) { @@ -274,7 +273,7 @@ static void zorro8390_reset_8390(struct net_device *dev) /* This check _should_not_ be necessary, omit eventually. */ while ((z_readb(NE_BASE+NE_EN0_ISR) & ENISR_RESET) == 0) - if (time_after(jiffies, reset_start_time + 2*HZ/100)) { + if (jiffies - reset_start_time > 2*HZ/100) { printk(KERN_WARNING "%s: ne_reset_8390() did not complete.\n", dev->name); break; @@ -401,7 +400,7 @@ static void zorro8390_block_output(struct net_device *dev, int count, dma_start = jiffies; while ((z_readb(NE_BASE + NE_EN0_ISR) & ENISR_RDC) == 0) - if (time_after(jiffies, dma_start + 2*HZ/100)) { /* 20ms */ + if (jiffies - dma_start > 2*HZ/100) { /* 20ms */ printk(KERN_ERR "%s: timeout waiting for Tx RDC.\n", dev->name); zorro8390_reset_8390(dev); @@ -426,7 +425,7 @@ static void __devexit zorro8390_remove_one(struct zorro_dev *z) static int __init zorro8390_init_module(void) { - return zorro_register_driver(&zorro8390_driver); + return zorro_module_init(&zorro8390_driver); } static void __exit zorro8390_cleanup_module(void) diff --git a/drivers/nubus/nubus.c b/drivers/nubus/nubus.c index 3a0a3a734..14cbe34eb 100644 --- a/drivers/nubus/nubus.c +++ b/drivers/nubus/nubus.c @@ -7,6 +7,7 @@ * and others. */ +#include #include #include #include diff --git a/drivers/nubus/nubus_syms.c b/drivers/nubus/nubus_syms.c index 9204f04fb..22c1dc9f8 100644 --- a/drivers/nubus/nubus_syms.c +++ b/drivers/nubus/nubus_syms.c @@ -2,6 +2,7 @@ (c) 1999 David Huggins-Daines */ +#include #include #include #include diff --git a/drivers/oprofile/buffer_sync.c b/drivers/oprofile/buffer_sync.c index 13416adfb..b2e8e49c8 100644 --- a/drivers/oprofile/buffer_sync.c +++ b/drivers/oprofile/buffer_sync.c @@ -6,10 +6,6 @@ * * @author John Levon * - * Modified by Aravind Menon for Xen - * These modifications are: - * Copyright (C) 2005 Hewlett-Packard Co. - * * This is the core of the buffer management. Each * CPU buffer is processed and entered into the * global event buffer. Such processing is necessary @@ -112,10 +108,10 @@ static int module_load_notify(struct notifier_block * self, unsigned long val, v return 0; /* FIXME: should we process all CPU buffers ? */ - mutex_lock(&buffer_mutex); + down(&buffer_sem); add_event_entry(ESCAPE_CODE); add_event_entry(MODULE_LOADED_CODE); - mutex_unlock(&buffer_mutex); + up(&buffer_sem); #endif return 0; } @@ -279,31 +275,15 @@ static void add_cpu_switch(int i) last_cookie = INVALID_COOKIE; } -static void add_cpu_mode_switch(unsigned int cpu_mode) +static void add_kernel_ctx_switch(unsigned int in_kernel) { add_event_entry(ESCAPE_CODE); - switch (cpu_mode) { - case CPU_MODE_USER: - add_event_entry(USER_ENTER_SWITCH_CODE); - break; - case CPU_MODE_KERNEL: - add_event_entry(KERNEL_ENTER_SWITCH_CODE); - break; - case CPU_MODE_XEN: - add_event_entry(XEN_ENTER_SWITCH_CODE); - break; - default: - break; - } -} - -static void add_domain_switch(unsigned long domain_id) -{ - add_event_entry(ESCAPE_CODE); - add_event_entry(DOMAIN_SWITCH_CODE); - add_event_entry(domain_id); + if (in_kernel) + add_event_entry(KERNEL_ENTER_SWITCH_CODE); + else + add_event_entry(KERNEL_EXIT_SWITCH_CODE); } - + static void add_user_ctx_switch(struct task_struct const * task, unsigned long cookie) { @@ -368,9 +348,9 @@ static int add_us_sample(struct mm_struct * mm, struct op_sample * s) * for later lookup from userspace. */ static int -add_sample(struct mm_struct * mm, struct op_sample * s, int cpu_mode) +add_sample(struct mm_struct * mm, struct op_sample * s, int in_kernel) { - if (cpu_mode >= CPU_MODE_KERNEL) { + if (in_kernel) { add_sample_entry(s->eip, s->event); return 1; } else if (mm) { @@ -516,13 +496,12 @@ void sync_buffer(int cpu) struct mm_struct *mm = NULL; struct task_struct * new; unsigned long cookie = 0; - int cpu_mode = 1; + int in_kernel = 1; unsigned int i; sync_buffer_state state = sb_buffer_start; unsigned long available; - int domain_switch = 0; - mutex_lock(&buffer_mutex); + down(&buffer_sem); add_cpu_switch(cpu); @@ -533,18 +512,16 @@ void sync_buffer(int cpu) for (i = 0; i < available; ++i) { struct op_sample * s = &cpu_buf->buffer[cpu_buf->tail_pos]; - if (is_code(s->eip) && !domain_switch) { - if (s->event <= CPU_MODE_XEN) { - /* xen/kernel/userspace switch */ - cpu_mode = s->event; + if (is_code(s->eip)) { + if (s->event <= CPU_IS_KERNEL) { + /* kernel/userspace switch */ + in_kernel = s->event; if (state == sb_buffer_start) state = sb_sample_start; - add_cpu_mode_switch(s->event); + add_kernel_ctx_switch(s->event); } else if (s->event == CPU_TRACE_BEGIN) { state = sb_bt_start; add_trace_begin(); - } else if (s->event == CPU_DOMAIN_SWITCH) { - domain_switch = 1; } else { struct mm_struct * oldmm = mm; @@ -558,16 +535,11 @@ void sync_buffer(int cpu) add_user_ctx_switch(new, cookie); } } else { - if (domain_switch) { - add_domain_switch(s->eip); - domain_switch = 0; - } else { - if (state >= sb_bt_start && - !add_sample(mm, s, cpu_mode)) { - if (state == sb_bt_start) { - state = sb_bt_ignore; - atomic_inc(&oprofile_stats.bt_lost_no_mapping); - } + if (state >= sb_bt_start && + !add_sample(mm, s, in_kernel)) { + if (state == sb_bt_start) { + state = sb_bt_ignore; + atomic_inc(&oprofile_stats.bt_lost_no_mapping); } } } @@ -578,5 +550,5 @@ void sync_buffer(int cpu) mark_done(cpu); - mutex_unlock(&buffer_mutex); + up(&buffer_sem); } diff --git a/drivers/oprofile/cpu_buffer.c b/drivers/oprofile/cpu_buffer.c index a59878e14..78193e4bb 100644 --- a/drivers/oprofile/cpu_buffer.c +++ b/drivers/oprofile/cpu_buffer.c @@ -6,10 +6,6 @@ * * @author John Levon * - * Modified by Aravind Menon for Xen - * These modifications are: - * Copyright (C) 2005 Hewlett-Packard Co. - * * Each CPU has a local buffer that stores PC value/event * pairs. We also log context switches when we notice them. * Eventually each CPU's buffer is processed into the global @@ -38,14 +34,13 @@ static void wq_sync_buffer(void *); #define DEFAULT_TIMER_EXPIRE (HZ / 10) static int work_enabled; -static int32_t current_domain = COORDINATOR_DOMAIN; - void free_cpu_buffers(void) { int i; - for_each_online_cpu(i) + for_each_online_cpu(i) { vfree(cpu_buffer[i].buffer); + } } int alloc_cpu_buffers(void) @@ -63,7 +58,7 @@ int alloc_cpu_buffers(void) goto fail; b->last_task = NULL; - b->last_cpu_mode = -1; + b->last_is_kernel = -1; b->tracing = 0; b->buffer_size = buffer_size; b->tail_pos = 0; @@ -119,7 +114,7 @@ void cpu_buffer_reset(struct oprofile_cpu_buffer * cpu_buf) * collected will populate the buffer with proper * values to initialize the buffer */ - cpu_buf->last_cpu_mode = -1; + cpu_buf->last_is_kernel = -1; cpu_buf->last_task = NULL; } @@ -169,13 +164,13 @@ add_code(struct oprofile_cpu_buffer * buffer, unsigned long value) * because of the head/tail separation of the writer and reader * of the CPU buffer. * - * cpu_mode is needed because on some architectures you cannot + * is_kernel is needed because on some architectures you cannot * tell if you are in kernel or user space simply by looking at - * pc. We tag this in the buffer by generating kernel/user (and xen) - * enter events whenever cpu_mode changes + * pc. We tag this in the buffer by generating kernel enter/exit + * events whenever is_kernel changes */ static int log_sample(struct oprofile_cpu_buffer * cpu_buf, unsigned long pc, - int cpu_mode, unsigned long event) + int is_kernel, unsigned long event) { struct task_struct * task; @@ -186,20 +181,18 @@ static int log_sample(struct oprofile_cpu_buffer * cpu_buf, unsigned long pc, return 0; } - WARN_ON(cpu_mode > CPU_MODE_XEN); + is_kernel = !!is_kernel; task = current; /* notice a switch from user->kernel or vice versa */ - if (cpu_buf->last_cpu_mode != cpu_mode) { - cpu_buf->last_cpu_mode = cpu_mode; - add_code(cpu_buf, cpu_mode); + if (cpu_buf->last_is_kernel != is_kernel) { + cpu_buf->last_is_kernel = is_kernel; + add_code(cpu_buf, is_kernel); } - + /* notice a task switch */ - /* if not processing other domain samples */ - if ((cpu_buf->last_task != task) && - (current_domain == COORDINATOR_DOMAIN)) { + if (cpu_buf->last_task != task) { cpu_buf->last_task = task; add_code(cpu_buf, (unsigned long)task); } @@ -225,10 +218,11 @@ static void oprofile_end_trace(struct oprofile_cpu_buffer * cpu_buf) cpu_buf->tracing = 0; } -void oprofile_add_ext_sample(unsigned long pc, struct pt_regs * const regs, - unsigned long event, int is_kernel) +void oprofile_add_sample(struct pt_regs * const regs, unsigned long event) { struct oprofile_cpu_buffer * cpu_buf = &cpu_buffer[smp_processor_id()]; + unsigned long pc = profile_pc(regs); + int is_kernel = !user_mode(regs); if (!backtrace_depth) { log_sample(cpu_buf, pc, is_kernel, event); @@ -245,14 +239,6 @@ void oprofile_add_ext_sample(unsigned long pc, struct pt_regs * const regs, oprofile_end_trace(cpu_buf); } -void oprofile_add_sample(struct pt_regs * const regs, unsigned long event) -{ - int is_kernel = !user_mode(regs); - unsigned long pc = profile_pc(regs); - - oprofile_add_ext_sample(pc, regs, event, is_kernel); -} - void oprofile_add_pc(unsigned long pc, int is_kernel, unsigned long event) { struct oprofile_cpu_buffer * cpu_buf = &cpu_buffer[smp_processor_id()]; @@ -283,25 +269,6 @@ void oprofile_add_trace(unsigned long pc) add_sample(cpu_buf, pc, 0); } -int oprofile_add_domain_switch(int32_t domain_id) -{ - struct oprofile_cpu_buffer * cpu_buf = &cpu_buffer[smp_processor_id()]; - - /* should have space for switching into and out of domain - (2 slots each) plus one sample and one cpu mode switch */ - if (((nr_available_slots(cpu_buf) < 6) && - (domain_id != COORDINATOR_DOMAIN)) || - (nr_available_slots(cpu_buf) < 2)) - return 0; - - add_code(cpu_buf, CPU_DOMAIN_SWITCH); - add_sample(cpu_buf, domain_id, 0); - - current_domain = domain_id; - - return 1; -} - /* * This serves to avoid cpu buffer overflow, and makes sure * the task mortuary progresses diff --git a/drivers/oprofile/cpu_buffer.h b/drivers/oprofile/cpu_buffer.h index cd94735be..09abb80e0 100644 --- a/drivers/oprofile/cpu_buffer.h +++ b/drivers/oprofile/cpu_buffer.h @@ -36,7 +36,7 @@ struct oprofile_cpu_buffer { volatile unsigned long tail_pos; unsigned long buffer_size; struct task_struct * last_task; - int last_cpu_mode; + int last_is_kernel; int tracing; struct op_sample * buffer; unsigned long sample_received; @@ -51,10 +51,7 @@ extern struct oprofile_cpu_buffer cpu_buffer[]; void cpu_buffer_reset(struct oprofile_cpu_buffer * cpu_buf); /* transient events for the CPU buffer -> event buffer */ -#define CPU_MODE_USER 0 -#define CPU_MODE_KERNEL 1 -#define CPU_MODE_XEN 2 -#define CPU_TRACE_BEGIN 3 -#define CPU_DOMAIN_SWITCH 4 +#define CPU_IS_KERNEL 1 +#define CPU_TRACE_BEGIN 2 #endif /* OPROFILE_CPU_BUFFER_H */ diff --git a/drivers/oprofile/event_buffer.c b/drivers/oprofile/event_buffer.c index 04d641714..b80318f03 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" -DEFINE_MUTEX(buffer_mutex); +DECLARE_MUTEX(buffer_sem); 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_mutex */ +/* atomic_t because wait_event checks it outside of buffer_sem */ 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) { - mutex_lock(&buffer_mutex); + down(&buffer_sem); atomic_set(&buffer_ready, 1); wake_up(&buffer_wait); - mutex_unlock(&buffer_mutex); + up(&buffer_sem); } @@ -162,7 +162,7 @@ static ssize_t event_buffer_read(struct file * file, char __user * buf, if (!atomic_read(&buffer_ready)) return -EAGAIN; - mutex_lock(&buffer_mutex); + down(&buffer_sem); 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: - mutex_unlock(&buffer_mutex); + up(&buffer_sem); return retval; } diff --git a/drivers/oprofile/event_buffer.h b/drivers/oprofile/event_buffer.h index 6a8878866..018023630 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); @@ -29,20 +29,15 @@ void wake_up_buffer_waiter(void); #define CPU_SWITCH_CODE 2 #define COOKIE_SWITCH_CODE 3 #define KERNEL_ENTER_SWITCH_CODE 4 -#define USER_ENTER_SWITCH_CODE 5 +#define KERNEL_EXIT_SWITCH_CODE 5 #define MODULE_LOADED_CODE 6 #define CTX_TGID_CODE 7 #define TRACE_BEGIN_CODE 8 #define TRACE_END_CODE 9 -#define XEN_ENTER_SWITCH_CODE 10 -#define DOMAIN_SWITCH_CODE 11 #define INVALID_COOKIE ~0UL #define NO_COOKIE 0UL -/* Constant used to refer to coordinator domain (Xen) */ -#define COORDINATOR_DOMAIN -1 - /* add data to the event buffer */ void add_event_entry(unsigned long data); @@ -51,6 +46,6 @@ extern struct file_operations event_buffer_fops; /* mutex between sync_cpu_buffers() and the * file reading code. */ -extern struct mutex buffer_mutex; +extern struct semaphore buffer_sem; #endif /* EVENT_BUFFER_H */ diff --git a/drivers/oprofile/oprof.c b/drivers/oprofile/oprof.c index b82a7b5aa..b3f1cd6a2 100644 --- a/drivers/oprofile/oprof.c +++ b/drivers/oprofile/oprof.c @@ -5,10 +5,6 @@ * @remark Read the file COPYING * * @author John Levon - * - * Modified by Aravind Menon for Xen - * These modifications are: - * Copyright (C) 2005 Hewlett-Packard Co. */ #include @@ -16,20 +12,20 @@ #include #include #include -#include +#include #include "oprof.h" #include "event_buffer.h" #include "cpu_buffer.h" #include "buffer_sync.h" #include "oprofile_stats.h" - + struct oprofile_operations oprofile_ops; unsigned long oprofile_started; unsigned long backtrace_depth; static unsigned long is_setup; -static DEFINE_MUTEX(start_mutex); +static DECLARE_MUTEX(start_sem); /* timer 0 - use performance monitoring hardware if available @@ -37,37 +33,11 @@ static DEFINE_MUTEX(start_mutex); */ static int timer = 0; -int oprofile_set_active(int active_domains[], unsigned int adomains) -{ - int err; - - if (!oprofile_ops.set_active) - return -EINVAL; - - mutex_lock(&start_mutex); - err = oprofile_ops.set_active(active_domains, adomains); - mutex_unlock(&start_mutex); - return err; -} - -int oprofile_set_passive(int passive_domains[], unsigned int pdomains) -{ - int err; - - if (!oprofile_ops.set_passive) - return -EINVAL; - - mutex_lock(&start_mutex); - err = oprofile_ops.set_passive(passive_domains, pdomains); - mutex_unlock(&start_mutex); - return err; -} - int oprofile_setup(void) { int err; - mutex_lock(&start_mutex); + down(&start_sem); if ((err = alloc_cpu_buffers())) goto out; @@ -87,7 +57,7 @@ int oprofile_setup(void) goto out3; is_setup = 1; - mutex_unlock(&start_mutex); + up(&start_sem); return 0; out3: @@ -98,7 +68,7 @@ out2: out1: free_cpu_buffers(); out: - mutex_unlock(&start_mutex); + up(&start_sem); return err; } @@ -108,7 +78,7 @@ int oprofile_start(void) { int err = -EINVAL; - mutex_lock(&start_mutex); + down(&start_sem); if (!is_setup) goto out; @@ -125,7 +95,7 @@ int oprofile_start(void) oprofile_started = 1; out: - mutex_unlock(&start_mutex); + up(&start_sem); return err; } @@ -133,7 +103,7 @@ out: /* echo 0>/dev/oprofile/enable */ void oprofile_stop(void) { - mutex_lock(&start_mutex); + down(&start_sem); if (!oprofile_started) goto out; oprofile_ops.stop(); @@ -141,20 +111,20 @@ void oprofile_stop(void) /* wake up the daemon to read what remains */ wake_up_buffer_waiter(); out: - mutex_unlock(&start_mutex); + up(&start_sem); } void oprofile_shutdown(void) { - mutex_lock(&start_mutex); + down(&start_sem); sync_stop(); if (oprofile_ops.shutdown) oprofile_ops.shutdown(); is_setup = 0; free_event_buffer(); free_cpu_buffers(); - mutex_unlock(&start_mutex); + up(&start_sem); } @@ -162,7 +132,7 @@ int oprofile_set_backtrace(unsigned long val) { int err = 0; - mutex_lock(&start_mutex); + down(&start_sem); if (oprofile_started) { err = -EBUSY; @@ -177,7 +147,7 @@ int oprofile_set_backtrace(unsigned long val) backtrace_depth = val; out: - mutex_unlock(&start_mutex); + up(&start_sem); return err; } diff --git a/drivers/oprofile/oprof.h b/drivers/oprofile/oprof.h index 4ae4ff97b..183236508 100644 --- a/drivers/oprofile/oprof.h +++ b/drivers/oprofile/oprof.h @@ -35,8 +35,5 @@ void oprofile_create_files(struct super_block * sb, struct dentry * root); void oprofile_timer_init(struct oprofile_operations * ops); int oprofile_set_backtrace(unsigned long depth); - -int oprofile_set_active(int active_domains[], unsigned int adomains); -int oprofile_set_passive(int passive_domains[], unsigned int pdomains); #endif /* OPROF_H */ diff --git a/drivers/oprofile/oprofile_files.c b/drivers/oprofile/oprofile_files.c index 3bb1e6ff7..a72006c08 100644 --- a/drivers/oprofile/oprofile_files.c +++ b/drivers/oprofile/oprofile_files.c @@ -5,21 +5,15 @@ * @remark Read the file COPYING * * @author John Levon - * - * Modified by Aravind Menon for Xen - * These modifications are: - * Copyright (C) 2005 Hewlett-Packard Co. */ #include #include -#include -#include #include "event_buffer.h" #include "oprofile_stats.h" #include "oprof.h" - + unsigned long fs_buffer_size = 131072; unsigned long fs_cpu_buffer_size = 8192; unsigned long fs_buffer_watershed = 32768; /* FIXME: tune */ @@ -123,208 +117,11 @@ static ssize_t dump_write(struct file * file, char const __user * buf, size_t co static struct file_operations dump_fops = { .write = dump_write, }; - -#ifdef CONFIG_XEN - -#define TMPBUFSIZE 512 - -static unsigned int adomains = 0; -static int active_domains[MAX_OPROF_DOMAINS + 1]; -static DEFINE_MUTEX(adom_mutex); - -static ssize_t adomain_write(struct file * file, char const __user * buf, - size_t count, loff_t * offset) -{ - char *tmpbuf; - char *startp, *endp; - int i; - unsigned long val; - ssize_t retval = count; - - if (*offset) - return -EINVAL; - if (count > TMPBUFSIZE - 1) - return -EINVAL; - - if (!(tmpbuf = kmalloc(TMPBUFSIZE, GFP_KERNEL))) - return -ENOMEM; - - if (copy_from_user(tmpbuf, buf, count)) { - kfree(tmpbuf); - return -EFAULT; - } - tmpbuf[count] = 0; - - mutex_lock(&adom_mutex); - - startp = tmpbuf; - /* Parse one more than MAX_OPROF_DOMAINS, for easy error checking */ - for (i = 0; i <= MAX_OPROF_DOMAINS; i++) { - val = simple_strtoul(startp, &endp, 0); - if (endp == startp) - break; - while (ispunct(*endp) || isspace(*endp)) - endp++; - active_domains[i] = val; - if (active_domains[i] != val) - /* Overflow, force error below */ - i = MAX_OPROF_DOMAINS + 1; - startp = endp; - } - /* Force error on trailing junk */ - adomains = *startp ? MAX_OPROF_DOMAINS + 1 : i; - - kfree(tmpbuf); - - if (adomains > MAX_OPROF_DOMAINS - || oprofile_set_active(active_domains, adomains)) { - adomains = 0; - retval = -EINVAL; - } - - mutex_unlock(&adom_mutex); - return retval; -} - -static ssize_t adomain_read(struct file * file, char __user * buf, - size_t count, loff_t * offset) -{ - char * tmpbuf; - size_t len; - int i; - ssize_t retval; - - if (!(tmpbuf = kmalloc(TMPBUFSIZE, GFP_KERNEL))) - return -ENOMEM; - - mutex_lock(&adom_mutex); - - len = 0; - for (i = 0; i < adomains; i++) - len += snprintf(tmpbuf + len, - len < TMPBUFSIZE ? TMPBUFSIZE - len : 0, - "%u ", active_domains[i]); - WARN_ON(len > TMPBUFSIZE); - if (len != 0 && len <= TMPBUFSIZE) - tmpbuf[len-1] = '\n'; - - mutex_unlock(&adom_mutex); - - retval = simple_read_from_buffer(buf, count, offset, tmpbuf, len); - - kfree(tmpbuf); - return retval; -} - - -static struct file_operations active_domain_ops = { - .read = adomain_read, - .write = adomain_write, -}; - -static unsigned int pdomains = 0; -static int passive_domains[MAX_OPROF_DOMAINS]; -static DEFINE_MUTEX(pdom_mutex); - -static ssize_t pdomain_write(struct file * file, char const __user * buf, - size_t count, loff_t * offset) -{ - char *tmpbuf; - char *startp, *endp; - int i; - unsigned long val; - ssize_t retval = count; - - if (*offset) - return -EINVAL; - if (count > TMPBUFSIZE - 1) - return -EINVAL; - - if (!(tmpbuf = kmalloc(TMPBUFSIZE, GFP_KERNEL))) - return -ENOMEM; - - if (copy_from_user(tmpbuf, buf, count)) { - kfree(tmpbuf); - return -EFAULT; - } - tmpbuf[count] = 0; - - mutex_lock(&pdom_mutex); - - startp = tmpbuf; - /* Parse one more than MAX_OPROF_DOMAINS, for easy error checking */ - for (i = 0; i <= MAX_OPROF_DOMAINS; i++) { - val = simple_strtoul(startp, &endp, 0); - if (endp == startp) - break; - while (ispunct(*endp) || isspace(*endp)) - endp++; - passive_domains[i] = val; - if (passive_domains[i] != val) - /* Overflow, force error below */ - i = MAX_OPROF_DOMAINS + 1; - startp = endp; - } - /* Force error on trailing junk */ - pdomains = *startp ? MAX_OPROF_DOMAINS + 1 : i; - - kfree(tmpbuf); - - if (pdomains > MAX_OPROF_DOMAINS - || oprofile_set_passive(passive_domains, pdomains)) { - pdomains = 0; - retval = -EINVAL; - } - - mutex_unlock(&pdom_mutex); - return retval; -} - -static ssize_t pdomain_read(struct file * file, char __user * buf, - size_t count, loff_t * offset) -{ - char * tmpbuf; - size_t len; - int i; - ssize_t retval; - - if (!(tmpbuf = kmalloc(TMPBUFSIZE, GFP_KERNEL))) - return -ENOMEM; - - mutex_lock(&pdom_mutex); - - len = 0; - for (i = 0; i < pdomains; i++) - len += snprintf(tmpbuf + len, - len < TMPBUFSIZE ? TMPBUFSIZE - len : 0, - "%u ", passive_domains[i]); - WARN_ON(len > TMPBUFSIZE); - if (len != 0 && len <= TMPBUFSIZE) - tmpbuf[len-1] = '\n'; - - mutex_unlock(&pdom_mutex); - - retval = simple_read_from_buffer(buf, count, offset, tmpbuf, len); - - kfree(tmpbuf); - return retval; -} - -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) { oprofilefs_create_file(sb, root, "enable", &enable_fops); oprofilefs_create_file_perm(sb, root, "dump", &dump_fops, 0666); -#ifdef CONFIG_XEN - oprofilefs_create_file(sb, root, "active_domains", &active_domain_ops); - oprofilefs_create_file(sb, root, "passive_domains", &passive_domain_ops); -#endif oprofilefs_create_file(sb, root, "buffer", &event_buffer_fops); oprofilefs_create_ulong(sb, root, "buffer_size", &fs_buffer_size); oprofilefs_create_ulong(sb, root, "buffer_watershed", &fs_buffer_watershed); diff --git a/drivers/oprofile/oprofile_stats.c b/drivers/oprofile/oprofile_stats.c index f0acb661c..e94b1e4a2 100644 --- a/drivers/oprofile/oprofile_stats.c +++ b/drivers/oprofile/oprofile_stats.c @@ -22,7 +22,7 @@ void oprofile_reset_stats(void) struct oprofile_cpu_buffer * cpu_buf; int i; - for_each_possible_cpu(i) { + for_each_cpu(i) { cpu_buf = &cpu_buffer[i]; cpu_buf->sample_received = 0; cpu_buf->sample_lost_overflow = 0; @@ -46,7 +46,7 @@ void oprofile_create_stats_files(struct super_block * sb, struct dentry * root) if (!dir) return; - for_each_possible_cpu(i) { + for_each_cpu(i) { cpu_buf = &cpu_buffer[i]; snprintf(buf, 10, "cpu%d", i); cpudir = oprofilefs_mkdir(sb, dir, buf); diff --git a/drivers/oprofile/oprofilefs.c b/drivers/oprofile/oprofilefs.c index 5756401fb..d6bae6997 100644 --- a/drivers/oprofile/oprofilefs.c +++ b/drivers/oprofile/oprofilefs.c @@ -31,6 +31,7 @@ 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; } @@ -109,8 +110,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->i_private) - filp->private_data = inode->i_private; + if (inode->u.generic_ip) + filp->private_data = inode->u.generic_ip; return 0; } @@ -129,7 +130,7 @@ static struct file_operations ulong_ro_fops = { static struct dentry * __oprofilefs_create_file(struct super_block * sb, - struct dentry * root, char const * name, const struct file_operations * fops, + struct dentry * root, char const * name, struct file_operations * fops, int perm) { struct dentry * dentry; @@ -157,7 +158,7 @@ int oprofilefs_create_ulong(struct super_block * sb, struct dentry * root, if (!d) return -EFAULT; - d->d_inode->i_private = val; + d->d_inode->u.generic_ip = val; return 0; } @@ -170,7 +171,7 @@ int oprofilefs_create_ro_ulong(struct super_block * sb, struct dentry * root, if (!d) return -EFAULT; - d->d_inode->i_private = val; + d->d_inode->u.generic_ip = val; return 0; } @@ -196,13 +197,13 @@ int oprofilefs_create_ro_atomic(struct super_block * sb, struct dentry * root, if (!d) return -EFAULT; - d->d_inode->i_private = val; + d->d_inode->u.generic_ip = val; return 0; } int oprofilefs_create_file(struct super_block * sb, struct dentry * root, - char const * name, const struct file_operations * fops) + char const * name, struct file_operations * fops) { if (!__oprofilefs_create_file(sb, root, name, fops, 0644)) return -EFAULT; @@ -211,7 +212,7 @@ int oprofilefs_create_file(struct super_block * sb, struct dentry * root, int oprofilefs_create_file_perm(struct super_block * sb, struct dentry * root, - char const * name, const struct file_operations * fops, int perm) + char const * name, struct file_operations * fops, int perm) { if (!__oprofilefs_create_file(sb, root, name, fops, perm)) return -EFAULT; @@ -271,10 +272,10 @@ static int oprofilefs_fill_super(struct super_block * sb, void * data, int silen } -static int oprofilefs_get_sb(struct file_system_type *fs_type, - int flags, const char *dev_name, void *data, struct vfsmount *mnt) +static struct super_block *oprofilefs_get_sb(struct file_system_type *fs_type, + int flags, const char *dev_name, void *data) { - return get_sb_single(fs_type, flags, data, oprofilefs_fill_super, mnt); + return get_sb_single(fs_type, flags, data, oprofilefs_fill_super); } diff --git a/drivers/parisc/Kconfig b/drivers/parisc/Kconfig index 1d3b84b4a..3f5de867a 100644 --- a/drivers/parisc/Kconfig +++ b/drivers/parisc/Kconfig @@ -140,37 +140,18 @@ config CHASSIS_LCD_LED If unsure, say Y. config PDC_CHASSIS - bool "PDC chassis state codes support" + bool "PDC chassis State Panel support" default y help - 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). + 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. 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 68cb3a080..93f8a8fa8 100644 --- a/drivers/parisc/ccio-dma.c +++ b/drivers/parisc/ccio-dma.c @@ -31,6 +31,7 @@ ** the coherency design originally worked out. Only PCX-W does. */ +#include #include #include #include @@ -1559,7 +1560,7 @@ static int ccio_probe(struct parisc_device *dev) *ioc_p = ioc; ioc->hw_path = dev->hw_path; - ioc->ioc_regs = ioremap_nocache(dev->hpa.start, 4096); + ioc->ioc_regs = ioremap(dev->hpa.start, 4096); ccio_ioc_init(ioc); ccio_init_resources(ioc); hppa_dma_ops = &ccio_ops; diff --git a/drivers/parisc/dino.c b/drivers/parisc/dino.c index 0d96c50ff..3d1a7f98c 100644 --- a/drivers/parisc/dino.c +++ b/drivers/parisc/dino.c @@ -5,7 +5,6 @@ ** (c) Copyright 1999 SuSE GmbH ** (c) Copyright 1999,2000 Hewlett-Packard Company ** (c) Copyright 2000 Grant Grundler -** (c) Copyright 2006 Helge Deller ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by @@ -43,6 +42,7 @@ ** for PCI drivers devices which implement/use MMIO registers. */ +#include #include #include #include @@ -298,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].chip_data; + struct dino_device *dino_dev = irq_desc[irq].handler_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); @@ -310,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].chip_data; + struct dino_device *dino_dev = irq_desc[irq].handler_data; int local_irq = gsc_find_local_irq(irq, dino_dev->global_irq, DINO_LOCAL_IRQS); u32 tmp; @@ -785,7 +785,7 @@ dino_bridge_init(struct dino_device *dino_dev, const char *name) if((io_addr & (1 << i)) == 0) continue; - start = F_EXTEND(0xf0000000UL) | (i << 23); + start = (unsigned long)(signed int)(0xf0000000 | (i << 23)); end = start + 8 * 1024 * 1024 - 1; DBG("DINO RANGE %d is at 0x%lx-0x%lx\n", count, @@ -996,7 +996,7 @@ static int __init dino_probe(struct parisc_device *dev) } dino_dev->hba.dev = dev; - dino_dev->hba.base_addr = ioremap_nocache(hpa, 4096); + dino_dev->hba.base_addr = ioremap(hpa, 4096); dino_dev->hba.lmmio_space_offset = 0; /* CPU addrs == bus addrs */ spin_lock_init(&dino_dev->dinosaur_pen); dino_dev->hba.iommu = ccio_get_iommu(dev); diff --git a/drivers/parisc/eisa.c b/drivers/parisc/eisa.c index 884965ced..3d94d86c1 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, IRQF_SHARED, "EISA", &eisa_dev); + result = request_irq(dev->irq, eisa_irq, SA_SHIRQ, "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].chip = &eisa_interrupt_type; + irq_desc[i].handler = &eisa_interrupt_type; } EISA_bus = 1; @@ -366,7 +366,7 @@ static int __devinit eisa_probe(struct parisc_device *dev) eisa_dev.eeprom_addr = MIRAGE_EEPROM_BASE_ADDR; } } - eisa_eeprom_addr = ioremap_nocache(eisa_dev.eeprom_addr, HPEE_MAX_LENGTH); + eisa_eeprom_addr = ioremap(eisa_dev.eeprom_addr, HPEE_MAX_LENGTH); result = eisa_enumerator(eisa_dev.eeprom_addr, &eisa_dev.hba.io_space, &eisa_dev.hba.lmmio_space); init_eisa_pic(); diff --git a/drivers/parisc/gsc.c b/drivers/parisc/gsc.c index b45aa5c67..16d40f959 100644 --- a/drivers/parisc/gsc.c +++ b/drivers/parisc/gsc.c @@ -14,6 +14,7 @@ */ #include +#include #include #include #include @@ -108,7 +109,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].chip_data; + struct gsc_asic *irq_dev = irq_desc[irq].handler_data; int local_irq = gsc_find_local_irq(irq, irq_dev->global_irq, 32); u32 imr; @@ -123,7 +124,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].chip_data; + struct gsc_asic *irq_dev = irq_desc[irq].handler_data; int local_irq = gsc_find_local_irq(irq, irq_dev->global_irq, 32); u32 imr; @@ -163,8 +164,8 @@ int gsc_assign_irq(struct hw_interrupt_type *type, void *data) if (irq > GSC_IRQ_MAX) return NO_IRQ; - irq_desc[irq].chip = type; - irq_desc[irq].chip_data = data; + irq_desc[irq].handler = type; + irq_desc[irq].handler_data = data; return irq++; } diff --git a/drivers/parisc/iosapic.c b/drivers/parisc/iosapic.c index 1fbda77ce..8d7a36392 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].chip_data; + return irq_desc[irq].handler_data; } static void iosapic_disable_irq(unsigned int irq) @@ -879,7 +879,7 @@ void *iosapic_register(unsigned long hpa) return NULL; } - isi->addr = ioremap_nocache(hpa, 4096); + isi->addr = ioremap(hpa, 4096); isi->isi_hpa = hpa; isi->isi_version = iosapic_rd_version(isi); isi->isi_num_vectors = IOSAPIC_IRDT_MAX_ENTRY(isi->isi_version) + 1; diff --git a/drivers/parisc/lba_pci.c b/drivers/parisc/lba_pci.c index 3fe4a77fa..e8a2a4a85 100644 --- a/drivers/parisc/lba_pci.c +++ b/drivers/parisc/lba_pci.c @@ -1213,7 +1213,7 @@ lba_pat_resources(struct parisc_device *pa_dev, struct lba_device *lba_dev) ** Postable I/O port space is per PCI host adapter. ** base of 64MB PIOP region */ - lba_dev->iop_base = ioremap_nocache(p->start, 64 * 1024 * 1024); + lba_dev->iop_base = ioremap(p->start, 64 * 1024 * 1024); sprintf(lba_dev->hba.io_name, "PCI%02lx Ports", lba_dev->hba.bus_num.start); @@ -1525,7 +1525,7 @@ lba_driver_probe(struct parisc_device *dev) u32 func_class; void *tmp_obj; char *version; - void __iomem *addr = ioremap_nocache(dev->hpa.start, 4096); + void __iomem *addr = ioremap(dev->hpa.start, 4096); /* Read HW Rev First */ func_class = READ_REG32(addr + LBA_FCLASS); @@ -1619,7 +1619,7 @@ lba_driver_probe(struct parisc_device *dev) } else { if (!astro_iop_base) { /* Sprockets PDC uses NPIOP region */ - astro_iop_base = ioremap_nocache(LBA_PORT_BASE, 64 * 1024); + astro_iop_base = ioremap(LBA_PORT_BASE, 64 * 1024); pci_port = &lba_astro_port_ops; } @@ -1700,7 +1700,7 @@ void __init lba_init(void) */ void lba_set_iregs(struct parisc_device *lba, u32 ibase, u32 imask) { - void __iomem * base_addr = ioremap_nocache(lba->hpa.start, 4096); + void __iomem * base_addr = ioremap(lba->hpa.start, 4096); imask <<= 2; /* adjust for hints - 2 more bits */ diff --git a/drivers/parisc/led.c b/drivers/parisc/led.c index bf00fa253..3627a2d7f 100644 --- a/drivers/parisc/led.c +++ b/drivers/parisc/led.c @@ -23,6 +23,7 @@ * David Pye */ +#include #include #include /* for offsetof() */ #include @@ -410,17 +411,16 @@ static __inline__ int led_get_net_activity(void) static __inline__ int led_get_diskio_activity(void) { static unsigned long last_pgpgin, last_pgpgout; - unsigned long events[NR_VM_EVENT_ITEMS]; + struct page_state pgstat; int changed; - all_vm_events(events); + get_full_page_state(&pgstat); /* get no of sectors in & out */ /* 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 = (events[PGPGIN] != last_pgpgin) || - (events[PGPGOUT] != last_pgpgout); - last_pgpgin = events[PGPGIN]; - last_pgpgout = events[PGPGOUT]; + changed = (pgstat.pgpgin != last_pgpgin) || (pgstat.pgpgout != last_pgpgout); + last_pgpgin = pgstat.pgpgin; + last_pgpgout = pgstat.pgpgout; return (changed ? LED_DISK_IO : 0); } @@ -499,16 +499,11 @@ static int led_halt(struct notifier_block *, unsigned long, void *); static struct notifier_block led_notifier = { .notifier_call = led_halt, }; -static int notifier_disabled = 0; static int led_halt(struct notifier_block *nb, unsigned long event, void *buf) { char *txt; - - if (notifier_disabled) - return NOTIFY_OK; - - notifier_disabled = 1; + switch (event) { case SYS_RESTART: txt = "SYSTEM RESTART"; break; @@ -532,6 +527,7 @@ static int led_halt(struct notifier_block *nb, unsigned long event, void *buf) if (led_func_ptr) led_func_ptr(0xff); /* turn all LEDs ON */ + unregister_reboot_notifier(&led_notifier); return NOTIFY_OK; } @@ -762,12 +758,6 @@ not_found: return 1; } -static void __exit led_exit(void) -{ - unregister_reboot_notifier(&led_notifier); - return; -} - #ifdef CONFIG_PROC_FS module_init(led_create_procfs) #endif diff --git a/drivers/parisc/pdc_stable.c b/drivers/parisc/pdc_stable.c index ea1b7a635..a28e17898 100644 --- a/drivers/parisc/pdc_stable.c +++ b/drivers/parisc/pdc_stable.c @@ -4,8 +4,9 @@ * 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, version 2, as - * published by the Free Software Foundation. + * 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 @@ -28,15 +29,8 @@ * 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. - * 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 code makes no use of data above 192 bytes. One last word: there's one + * path we can always count on: the primary path. * * The current policy wrt file permissions is: * - write: root only @@ -71,18 +65,15 @@ #include #include -#define PDCS_VERSION "0.30" +#define PDCS_VERSION "0.22" #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"); @@ -92,9 +83,6 @@ MODULE_VERSION(PDCS_VERSION); /* 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 */ @@ -548,7 +536,7 @@ pdcs_auto_read(struct subsystem *entry, char *buf, int knob) { char *out = buf; struct pdcspath_entry *pathentry; - + if (!entry || !buf) return -EINVAL; @@ -622,64 +610,27 @@ static ssize_t pdcs_osid_read(struct subsystem *entry, char *buf) { char *out = buf; + __u32 result; + char *tmpstr = NULL; 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, "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) + /* get OSID */ + if (pdc_stable_read(PDCS_ADDR_OSID, &result, sizeof(result)) != PDC_OK) return -EIO; - out += sprintf(out, "0x%.4x\n", (result >> 16)); + /* 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, "%s (0x%.4x)\n", tmpstr, (result >> 16)); return out - buf; } @@ -695,7 +646,7 @@ static ssize_t pdcs_fastsize_read(struct subsystem *entry, char *buf) { char *out = buf; - u32 result; + __u32 result; if (!entry || !buf) return -EINVAL; @@ -713,39 +664,6 @@ pdcs_fastsize_read(struct subsystem *entry, char *buf) return out - buf; } -/** - * 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; i 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; i> 16); - /* For now we'll register the stable subsys within this driver */ if ((rc = firmware_register(&stable_subsys))) goto fail_firmreg; @@ -1068,7 +888,7 @@ pdc_stable_init(void) /* register the paths subsys as a subsystem of stable subsys */ kset_set_kset_s(&paths_subsys, stable_subsys); - if ((rc = subsystem_register(&paths_subsys))) + if ((rc= subsystem_register(&paths_subsys))) goto fail_subsysreg; /* now we create all "files" for the paths subsys */ diff --git a/drivers/parisc/power.c b/drivers/parisc/power.c index fad5a33bf..54b2b7f20 100644 --- a/drivers/parisc/power.c +++ b/drivers/parisc/power.c @@ -35,6 +35,7 @@ * runtime through the "/proc/sys/kernel/power" procfs entry. */ +#include #include #include #include @@ -250,8 +251,7 @@ static int __init power_init(void) } /* Register a call for panic conditions. */ - atomic_notifier_chain_register(&panic_notifier_list, - &parisc_panic_block); + notifier_chain_register(&panic_notifier_list, &parisc_panic_block); tasklet_enable(&power_tasklet); @@ -264,8 +264,7 @@ static void __exit power_exit(void) return; tasklet_disable(&power_tasklet); - atomic_notifier_chain_unregister(&panic_notifier_list, - &parisc_panic_block); + notifier_chain_unregister(&panic_notifier_list, &parisc_panic_block); power_tasklet.func = NULL; pdc_soft_power_button(0); } diff --git a/drivers/parisc/sba_iommu.c b/drivers/parisc/sba_iommu.c index 8b4732815..5d47c5965 100644 --- a/drivers/parisc/sba_iommu.c +++ b/drivers/parisc/sba_iommu.c @@ -19,6 +19,7 @@ ** FIXME: add DMA hint support programming in both sba and lba modules. */ +#include #include #include #include @@ -177,11 +178,6 @@ extern struct proc_dir_entry * proc_mckinley_root; #define ROPE6_CTL 0x230 #define ROPE7_CTL 0x238 -#define IOC_ROPE0_CFG 0x500 /* pluto only */ -#define IOC_ROPE_AO 0x10 /* Allow "Relaxed Ordering" */ - - - #define HF_ENABLE 0x40 @@ -315,10 +311,10 @@ static int reserve_sba_gart = 1; ** ** Superdome (in particular, REO) allows only 64-bit CSR accesses. */ -#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)) +#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) #ifdef CONFIG_64BIT #define READ_REG(addr) READ_REG64(addr) @@ -1426,7 +1422,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%p IOV %dMB (%d bits)\n", + DBG_INIT("%s() hpa 0x%lx IOV %dMB (%d bits)\n", __FUNCTION__, ioc->ioc_hpa, iova_space_size >> 20, iov_order + PAGE_SHIFT); @@ -1646,9 +1642,9 @@ sba_ioc_init(struct parisc_device *sba, struct ioc *ioc, int ioc_num) ** **************************************************************************/ -static void __iomem *ioc_remap(struct sba_device *sba_dev, unsigned int offset) +static void __iomem *ioc_remap(struct sba_device *sba_dev, int offset) { - return ioremap_nocache(sba_dev->dev->hpa.start + offset, SBA_FUNC_SIZE); + return ioremap(sba_dev->dev->hpa.start + offset, SBA_FUNC_SIZE); } static void sba_hw_init(struct sba_device *sba_dev) @@ -1728,7 +1724,9 @@ printk("sba_hw_init(): mem_boot 0x%x 0x%x 0x%x 0x%x\n", PAGE0->mem_boot.hpa, sba_dev->chip_resv.start = PCI_F_EXTEND | 0xfef00000UL; sba_dev->chip_resv.end = PCI_F_EXTEND | (0xff000000UL - 1) ; err = request_resource(&iomem_resource, &(sba_dev->chip_resv)); - BUG_ON(err < 0); + if (err < 0) { + BUG(); + } } else if (IS_PLUTO(sba_dev->iodc)) { int err; @@ -1763,34 +1761,19 @@ 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++) { - 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)) { - - /* - * Clear ROPE(N)_CONFIG AO bit. - * Disables "NT Ordering" (~= !"Relaxed Ordering") - * Overrides bit 1 in DMA Hint Sets. - * Improves netperf UDP_STREAM by ~10% for bcm5701. - */ - if (IS_PLUTO(sba_dev->iodc)) { - void __iomem *rope_cfg; - unsigned long cfg_val; - - rope_cfg = ioc_hpa + IOC_ROPE0_CFG + j; - cfg_val = READ_REG(rope_cfg); - cfg_val &= ~IOC_ROPE_AO; - WRITE_REG(cfg_val, rope_cfg); - } - - /* - ** Make sure the box crashes on rope errors. - */ - WRITE_REG(HF_ENABLE, ioc_hpa + ROPE0_CTL + j); - } - - /* flush out the last writes */ + /* + ** Make sure the box crashes if we get any errors on a rope. + */ + WRITE_REG(HF_ENABLE, sba_dev->ioc[i].ioc_hpa + ROPE0_CTL); + WRITE_REG(HF_ENABLE, sba_dev->ioc[i].ioc_hpa + ROPE1_CTL); + WRITE_REG(HF_ENABLE, sba_dev->ioc[i].ioc_hpa + ROPE2_CTL); + WRITE_REG(HF_ENABLE, sba_dev->ioc[i].ioc_hpa + ROPE3_CTL); + WRITE_REG(HF_ENABLE, sba_dev->ioc[i].ioc_hpa + ROPE4_CTL); + WRITE_REG(HF_ENABLE, sba_dev->ioc[i].ioc_hpa + ROPE5_CTL); + WRITE_REG(HF_ENABLE, sba_dev->ioc[i].ioc_hpa + ROPE6_CTL); + WRITE_REG(HF_ENABLE, sba_dev->ioc[i].ioc_hpa + ROPE7_CTL); + + /* flush out the writes */ READ_REG(sba_dev->ioc[i].ioc_hpa + ROPE7_CTL); DBG_INIT(" ioc[%d] ROPE_CFG 0x%Lx ROPE_DBG 0x%Lx\n", @@ -1902,7 +1885,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 (ioc_needs_fdc) { + if (boot_cpu_data.pdc.capabilities & PDC_MODEL_IOPDIR_FDC) { printk(KERN_INFO MODULE_NAME " FDC/SYNC required.\n"); } else { printk(KERN_INFO MODULE_NAME " IOC has cache coherent PDIR.\n"); @@ -2059,7 +2042,7 @@ sba_driver_callback(struct parisc_device *dev) u32 func_class; int i; char *version; - void __iomem *sba_addr = ioremap_nocache(dev->hpa.start, SBA_FUNC_SIZE); + void __iomem *sba_addr = ioremap(dev->hpa.start, SBA_FUNC_SIZE); struct proc_dir_entry *info_entry, *bitmap_entry, *root; sba_dump_ranges(sba_addr); @@ -2202,7 +2185,8 @@ void sba_directed_lmmio(struct parisc_device *pci_hba, struct resource *r) int i; int rope = (pci_hba->hw_path & (ROPES_PER_IOC-1)); /* rope # */ - BUG_ON((t!=HPHW_IOA) && (t!=HPHW_BCPORT)); + if ((t!=HPHW_IOA) && (t!=HPHW_BCPORT)) + BUG(); r->start = r->end = 0; @@ -2244,7 +2228,8 @@ void sba_distributed_lmmio(struct parisc_device *pci_hba, struct resource *r ) int base, size; int rope = (pci_hba->hw_path & (ROPES_PER_IOC-1)); /* rope # */ - BUG_ON((t!=HPHW_IOA) && (t!=HPHW_BCPORT)); + if ((t!=HPHW_IOA) && (t!=HPHW_BCPORT)) + BUG(); r->start = r->end = 0; diff --git a/drivers/parisc/superio.c b/drivers/parisc/superio.c index 4ee26a6d9..ba971fecd 100644 --- a/drivers/parisc/superio.c +++ b/drivers/parisc/superio.c @@ -12,7 +12,6 @@ * (C) Copyright 2001 John Marvin * (C) Copyright 2003 Grant Grundler * (C) Copyright 2005 Kyle McMartin - * (C) Copyright 2006 Helge Deller * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as @@ -155,11 +154,11 @@ superio_init(struct pci_dev *pcidev) struct pci_dev *pdev = sio->lio_pdev; u16 word; - if (sio->suckyio_irq_enabled) + if (sio->suckyio_irq_enabled) return; - BUG_ON(!pdev); - BUG_ON(!sio->usb_pdev); + if (!pdev) BUG(); + if (!sio->usb_pdev) BUG(); /* use the IRQ iosapic found for USB INT D... */ pdev->irq = sio->usb_pdev->irq; @@ -194,7 +193,7 @@ superio_init(struct pci_dev *pcidev) request_region (sio->acpi_base, 0x1f, "acpi"); /* Enable the legacy I/O function */ - pci_read_config_word (pdev, PCI_COMMAND, &word); + pci_read_config_word (pdev, PCI_COMMAND, &word); word |= PCI_COMMAND_SERR | PCI_COMMAND_PARITY | PCI_COMMAND_IO; pci_write_config_word (pdev, PCI_COMMAND, word); @@ -271,7 +270,7 @@ superio_init(struct pci_dev *pcidev) else printk(KERN_ERR PFX "USB regulator not initialized!\n"); - if (request_irq(pdev->irq, superio_interrupt, IRQF_DISABLED, + if (request_irq(pdev->irq, superio_interrupt, SA_INTERRUPT, SUPERIO, (void *)sio)) { printk(KERN_ERR PFX "could not get irq\n"); @@ -360,7 +359,7 @@ int superio_fixup_irq(struct pci_dev *pcidev) #endif for (i = 0; i < 16; i++) { - irq_desc[i].chip = &superio_interrupt_type; + irq_desc[i].handler = &superio_interrupt_type; } /* @@ -389,34 +388,43 @@ int superio_fixup_irq(struct pci_dev *pcidev) return local_irq; } +static struct uart_port serial[] = { + { + .iotype = UPIO_PORT, + .line = 0, + .type = PORT_16550A, + .uartclk = 115200*16, + .fifosize = 16, + }, + { + .iotype = UPIO_PORT, + .line = 1, + .type = PORT_16550A, + .uartclk = 115200*16, + .fifosize = 16, + } +}; + static void __devinit superio_serial_init(void) { #ifdef CONFIG_SERIAL_8250 int retval; - struct uart_port serial_port; - - memset(&serial_port, 0, sizeof(serial_port)); - serial_port.iotype = UPIO_PORT; - serial_port.type = PORT_16550A; - serial_port.uartclk = 115200*16; - serial_port.fifosize = 16; - spin_lock_init(&serial_port.lock); - - /* serial port #1 */ - serial_port.iobase = sio_dev.sp1_base; - serial_port.irq = SP1_IRQ; - serial_port.line = 0; - retval = early_serial_setup(&serial_port); + + serial[0].iobase = sio_dev.sp1_base; + serial[0].irq = SP1_IRQ; + spin_lock_init(&serial[0].lock); + + retval = early_serial_setup(&serial[0]); if (retval < 0) { printk(KERN_WARNING PFX "Register Serial #0 failed.\n"); return; } - /* serial port #2 */ - serial_port.iobase = sio_dev.sp2_base; - serial_port.irq = SP2_IRQ; - serial_port.line = 1; - retval = early_serial_setup(&serial_port); + serial[1].iobase = sio_dev.sp2_base; + serial[1].irq = SP2_IRQ; + spin_lock_init(&serial[1].lock); + retval = early_serial_setup(&serial[1]); + if (retval < 0) printk(KERN_WARNING PFX "Register Serial #1 failed.\n"); #endif /* CONFIG_SERIAL_8250 */ @@ -466,7 +474,8 @@ superio_probe(struct pci_dev *dev, const struct pci_device_id *id) dev->subsystem_vendor, dev->subsystem_device, dev->class); - BUG_ON(!sio->suckyio_irq_enabled); /* Enabled by PCI_FIXUP_FINAL */ + if (!sio->suckyio_irq_enabled) + BUG(); /* Enabled by PCI_FIXUP_FINAL */ if (dev->device == PCI_DEVICE_ID_NS_87560_LIO) { /* Function 1 */ superio_parport_init(); diff --git a/drivers/parport/Kconfig b/drivers/parport/Kconfig index c7fa28a28..f63c38797 100644 --- a/drivers/parport/Kconfig +++ b/drivers/parport/Kconfig @@ -48,7 +48,7 @@ config PARPORT_PC config PARPORT_SERIAL tristate "Multi-IO cards (parallel and serial)" - depends on SERIAL_8250_PCI && PARPORT_PC && PCI + depends on SERIAL_8250 && PARPORT_PC && PCI help This adds support for multi-IO PCI cards that have parallel and serial ports. You should say Y or M here. If you say M, the module @@ -85,6 +85,11 @@ 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 @@ -136,18 +141,6 @@ 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 696b8d4ca..a19de35f8 100644 --- a/drivers/parport/Makefile +++ b/drivers/parport/Makefile @@ -17,5 +17,4 @@ 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_AX88796) += parport_ax88796.o -obj-$(CONFIG_PARPORT_IP32) += parport_ip32.o \ No newline at end of file +obj-$(CONFIG_PARPORT_IP32) += parport_ip32.o diff --git a/drivers/parport/daisy.c b/drivers/parport/daisy.c index fd41e2810..9ee67321b 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 %-ENXIO if no device with those coordinates + * device number or -NXIO if no device with those coordinates * exists. **/ diff --git a/drivers/parport/ieee1284.c b/drivers/parport/ieee1284.c index 7ff09f0f8..690b239ad 100644 --- a/drivers/parport/ieee1284.c +++ b/drivers/parport/ieee1284.c @@ -16,6 +16,7 @@ * 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 525312f2f..d6c776582 100644 --- a/drivers/parport/ieee1284_ops.c +++ b/drivers/parport/ieee1284_ops.c @@ -14,6 +14,7 @@ */ +#include #include #include #include diff --git a/drivers/parport/parport_cs.c b/drivers/parport/parport_cs.c index b953d5907..158d92563 100644 --- a/drivers/parport/parport_cs.c +++ b/drivers/parport/parport_cs.c @@ -81,15 +81,15 @@ static char *version = #define FORCE_EPP_MODE 0x08 typedef struct parport_info_t { - struct pcmcia_device *p_dev; + dev_link_t link; int ndev; dev_node_t node; struct parport *port; } parport_info_t; static void parport_detach(struct pcmcia_device *p_dev); -static int parport_config(struct pcmcia_device *link); -static void parport_cs_release(struct pcmcia_device *); +static void parport_config(dev_link_t *link); +static void parport_cs_release(dev_link_t *); /*====================================================================== @@ -99,9 +99,10 @@ static void parport_cs_release(struct pcmcia_device *); ======================================================================*/ -static int parport_probe(struct pcmcia_device *link) +static int parport_attach(struct pcmcia_device *p_dev) { parport_info_t *info; + dev_link_t *link; DEBUG(0, "parport_attach()\n"); @@ -109,17 +110,23 @@ static int parport_probe(struct pcmcia_device *link) info = kmalloc(sizeof(*info), GFP_KERNEL); if (!info) return -ENOMEM; memset(info, 0, sizeof(*info)); - link->priv = info; - info->p_dev = link; + link = &info->link; link->priv = info; link->io.Attributes1 = IO_DATA_PATH_WIDTH_8; link->io.Attributes2 = IO_DATA_PATH_WIDTH_8; 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; - return parport_config(link); + link->handle = p_dev; + p_dev->instance = link; + + link->state |= DEV_PRESENT | DEV_CONFIG_PENDING; + parport_config(link); + + return 0; } /* parport_attach */ /*====================================================================== @@ -131,11 +138,14 @@ static int parport_probe(struct pcmcia_device *link) ======================================================================*/ -static void parport_detach(struct pcmcia_device *link) +static void parport_detach(struct pcmcia_device *p_dev) { + dev_link_t *link = dev_to_instance(p_dev); + DEBUG(0, "parport_detach(0x%p)\n", link); - parport_cs_release(link); + if (link->state & DEV_CONFIG) + parport_cs_release(link); kfree(link->priv); } /* parport_detach */ @@ -151,12 +161,14 @@ static void parport_detach(struct pcmcia_device *link) #define CS_CHECK(fn, ret) \ do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0) -static int parport_config(struct pcmcia_device *link) +void parport_config(dev_link_t *link) { + client_handle_t handle = link->handle; parport_info_t *info = link->priv; tuple_t tuple; u_short buf[128]; cisparse_t parse; + config_info_t conf; cistpl_cftable_entry_t *cfg = &parse.cftable_entry; cistpl_cftable_entry_t dflt = { 0 }; struct parport *p; @@ -168,18 +180,24 @@ static int parport_config(struct pcmcia_device *link) tuple.TupleOffset = 0; tuple.TupleDataMax = 255; tuple.Attributes = 0; tuple.DesiredTuple = CISTPL_CONFIG; - 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)); + CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple)); + CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple)); + CS_CHECK(ParseTuple, pcmcia_parse_tuple(handle, &tuple, &parse)); link->conf.ConfigBase = parse.config.base; link->conf.Present = parse.config.rmask[0]; + + /* Configure card */ + link->state |= DEV_CONFIG; + /* Not sure if this is right... look up the current Vcc */ + CS_CHECK(GetConfigurationInfo, pcmcia_get_configuration_info(handle, &conf)); + tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY; tuple.Attributes = 0; - CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(link, &tuple)); + CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple)); while (1) { - if (pcmcia_get_tuple_data(link, &tuple) != 0 || - pcmcia_parse_tuple(link, &tuple, &parse) != 0) + if (pcmcia_get_tuple_data(handle, &tuple) != 0 || + pcmcia_parse_tuple(handle, &tuple, &parse) != 0) goto next_entry; if ((cfg->io.nwin > 0) || (dflt.io.nwin > 0)) { @@ -194,7 +212,7 @@ static int parport_config(struct pcmcia_device *link) link->io.BasePort2 = io->win[1].base; link->io.NumPorts2 = io->win[1].len; } - if (pcmcia_request_io(link, &link->io) != 0) + if (pcmcia_request_io(link->handle, &link->io) != 0) goto next_entry; /* If we've got this far, we're done */ break; @@ -202,12 +220,15 @@ static int parport_config(struct pcmcia_device *link) next_entry: if (cfg->flags & CISTPL_CFTABLE_DEFAULT) dflt = *cfg; - CS_CHECK(GetNextTuple, pcmcia_get_next_tuple(link, &tuple)); + CS_CHECK(GetNextTuple, pcmcia_get_next_tuple(handle, &tuple)); } - CS_CHECK(RequestIRQ, pcmcia_request_irq(link, &link->irq)); - CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link, &link->conf)); + CS_CHECK(RequestIRQ, pcmcia_request_irq(handle, &link->irq)); + CS_CHECK(RequestConfiguration, pcmcia_request_configuration(handle, &link->conf)); + release_region(link->io.BasePort1, link->io.NumPorts1); + if (link->io.NumPorts2) + release_region(link->io.BasePort2, link->io.NumPorts2); p = parport_pc_probe_port(link->io.BasePort1, link->io.BasePort2, link->irq.AssignedIRQ, PARPORT_DMA_NONE, NULL); @@ -226,15 +247,17 @@ static int parport_config(struct pcmcia_device *link) info->node.minor = p->number; info->port = p; strcpy(info->node.dev_name, p->name); - link->dev_node = &info->node; - - return 0; + link->dev = &info->node; + link->state &= ~DEV_CONFIG_PENDING; + return; + cs_failed: - cs_error(link, last_fn, last_ret); + cs_error(link->handle, last_fn, last_ret); failed: parport_cs_release(link); - return -ENODEV; + link->state &= ~DEV_CONFIG_PENDING; + } /* parport_config */ /*====================================================================== @@ -245,21 +268,53 @@ failed: ======================================================================*/ -void parport_cs_release(struct pcmcia_device *link) +void parport_cs_release(dev_link_t *link) +{ + parport_info_t *info = link->priv; + + DEBUG(0, "parport_release(0x%p)\n", link); + + if (info->ndev) { + struct parport *p = info->port; + parport_pc_unregister_port(p); + request_region(link->io.BasePort1, link->io.NumPorts1, + info->node.dev_name); + if (link->io.NumPorts2) + request_region(link->io.BasePort2, link->io.NumPorts2, + info->node.dev_name); + } + info->ndev = 0; + 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; + +} /* parport_cs_release */ + +static int parport_suspend(struct pcmcia_device *dev) { - parport_info_t *info = link->priv; + dev_link_t *link = dev_to_instance(dev); - DEBUG(0, "parport_release(0x%p)\n", link); + link->state |= DEV_SUSPEND; + if (link->state & DEV_CONFIG) + pcmcia_release_configuration(link->handle); - if (info->ndev) { - struct parport *p = info->port; - parport_pc_unregister_port(p); - } - info->ndev = 0; + return 0; +} - pcmcia_disable_device(link); -} /* parport_cs_release */ +static int parport_resume(struct pcmcia_device *dev) +{ + dev_link_t *link = dev_to_instance(dev); + + link->state &= ~DEV_SUSPEND; + if (DEV_OK(link)) + pcmcia_request_configuration(link->handle, &link->conf); + return 0; +} static struct pcmcia_device_id parport_ids[] = { PCMCIA_DEVICE_FUNC_ID(3), @@ -273,9 +328,11 @@ static struct pcmcia_driver parport_cs_driver = { .drv = { .name = "parport_cs", }, - .probe = parport_probe, + .probe = parport_attach, .remove = parport_detach, .id_table = parport_ids, + .suspend = parport_suspend, + .resume = parport_resume, }; static int __init init_parport_cs(void) diff --git a/drivers/parport/parport_gsc.c b/drivers/parport/parport_gsc.c index 7352104f7..1de52d9fe 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 fc9c37c54..662f6c1fe 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 b2b8092a2..c85364765 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, IRQF_SHARED, p->name, &pp_mfc3_ops)) + if (request_irq(IRQ_AMIGA_PORTS, mfc3_interrupt, SA_SHIRQ, p->name, &pp_mfc3_ops)) goto out_irq; } diff --git a/drivers/parport/parport_pc.c b/drivers/parport/parport_pc.c index fe800dc0b..9302b8fd7 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,6 +42,7 @@ * but rather will start at port->base_hi. */ +#include #include #include #include @@ -96,7 +97,7 @@ static struct superio_struct { /* For Super-IO chips autodetection */ int io; int irq; int dma; -} superios[NR_SUPERIOS] = { {0,},}; +} superios[NR_SUPERIOS] __devinitdata = { {0,},}; static int user_specified; #if defined(CONFIG_PARPORT_PC_SUPERIO) || \ @@ -1556,7 +1557,7 @@ static int __devinit get_superio_dma (struct parport *p) return PARPORT_DMA_NONE; } -static int get_superio_irq (struct parport *p) +static int __devinit get_superio_irq (struct parport *p) { int i=0; while( (superios[i].io != p->base) && (iprivate_data; unsigned char r = 0xc; @@ -1711,7 +1712,7 @@ static int parport_ECR_present(struct parport *pb) * be misdetected here is rather academic. */ -static int parport_PS2_supported(struct parport *pb) +static int __devinit parport_PS2_supported(struct parport *pb) { int ok = 0; @@ -1867,7 +1868,7 @@ static int __devinit parport_ECP_supported(struct parport *pb) } #endif -static int parport_ECPPS2_supported(struct parport *pb) +static int __devinit parport_ECPPS2_supported(struct parport *pb) { const struct parport_pc_private *priv = pb->private_data; int result; @@ -1885,7 +1886,7 @@ static int parport_ECPPS2_supported(struct parport *pb) /* EPP mode detection */ -static int parport_EPP_supported(struct parport *pb) +static int __devinit parport_EPP_supported(struct parport *pb) { const struct parport_pc_private *priv = pb->private_data; @@ -1930,7 +1931,7 @@ static int parport_EPP_supported(struct parport *pb) return 1; } -static int parport_ECPEPP_supported(struct parport *pb) +static int __devinit parport_ECPEPP_supported(struct parport *pb) { struct parport_pc_private *priv = pb->private_data; int result; @@ -2072,7 +2073,7 @@ static int __devinit irq_probe_SPP(struct parport *pb) * When ECP is available we can autoprobe for IRQs. * NOTE: If we can autoprobe it, we can register the IRQ. */ -static int parport_irq_probe(struct parport *pb) +static int __devinit parport_irq_probe(struct parport *pb) { struct parport_pc_private *priv = pb->private_data; @@ -2778,7 +2779,7 @@ static struct parport_pc_pci { /* If set, this is called after probing for ports. If 'failed' * is non-zero we couldn't use any of the ports. */ void (*postinit_hook) (struct pci_dev *pdev, int failed); -} cards[] = { +} cards[] __devinitdata = { /* siig_1p_10x */ { 1, { { 2, 3 }, } }, /* siig_2p_10x */ { 2, { { 2, 3 }, { 4, 5 }, } }, /* siig_1p_20x */ { 1, { { 0, 1 }, } }, @@ -3125,9 +3126,9 @@ parport_pc_find_isa_ports (int autoirq, int autodma) * autoirq is PARPORT_IRQ_NONE, PARPORT_IRQ_AUTO, or PARPORT_IRQ_PROBEONLY * autodma is PARPORT_DMA_NONE or PARPORT_DMA_AUTO */ -static void __init parport_pc_find_ports (int autoirq, int autodma) +static int __init parport_pc_find_ports (int autoirq, int autodma) { - int count = 0, err; + int count = 0, r; #ifdef CONFIG_PARPORT_PC_SUPERIO detect_and_report_winbond (); @@ -3139,17 +3140,23 @@ static void __init parport_pc_find_ports (int autoirq, int autodma) /* PnP ports, skip detection if SuperIO already found them */ if (!count) { - err = pnp_register_driver (&parport_pc_pnp_driver); - if (!err) + r = pnp_register_driver (&parport_pc_pnp_driver); + if (r >= 0) { pnp_registered_parport = 1; + count += r; + } } /* ISA ports and whatever (see asm/parport.h). */ - parport_pc_find_nonpci_ports (autoirq, autodma); + count += parport_pc_find_nonpci_ports (autoirq, autodma); + + r = pci_register_driver (&parport_pc_pci_driver); + if (r) + return r; + pci_registered_parport = 1; + count += 1; - err = pci_register_driver (&parport_pc_pci_driver); - if (!err) - pci_registered_parport = 1; + return count; } /* @@ -3374,6 +3381,8 @@ __setup("parport_init_mode=",parport_init_mode_setup); static int __init parport_pc_init(void) { + int count = 0; + if (parse_parport_params()) return -EINVAL; @@ -3386,11 +3395,12 @@ static int __init parport_pc_init(void) break; if ((io_hi[i]) == PARPORT_IOHI_AUTO) io_hi[i] = 0x400 + io[i]; - parport_pc_probe_port(io[i], io_hi[i], - irqval[i], dmaval[i], NULL); + if (parport_pc_probe_port(io[i], io_hi[i], + irqval[i], dmaval[i], NULL)) + count++; } } else - parport_pc_find_ports (irqval[0], dmaval[0]); + count += parport_pc_find_ports (irqval[0], dmaval[0]); return 0; } diff --git a/drivers/parport/parport_serial.c b/drivers/parport/parport_serial.c index 98b83a85c..10845253c 100644 --- a/drivers/parport/parport_serial.c +++ b/drivers/parport/parport_serial.c @@ -31,8 +31,14 @@ enum parport_pc_pci_cards { netmos_9xx5_combo, netmos_9855, avlab_1s1p, + avlab_1s1p_650, + avlab_1s1p_850, avlab_1s2p, + avlab_1s2p_650, + avlab_1s2p_850, avlab_2s1p, + avlab_2s1p_650, + avlab_2s1p_850, siig_1s1p_10x, siig_2s1p_10x, siig_2p1s_20x, @@ -79,8 +85,14 @@ static struct parport_pc_pci cards[] __devinitdata = { /* netmos_9xx5_combo */ { 1, { { 2, -1 }, }, netmos_parallel_init }, /* netmos_9855 */ { 1, { { 0, -1 }, }, netmos_parallel_init }, /* avlab_1s1p */ { 1, { { 1, 2}, } }, + /* avlab_1s1p_650 */ { 1, { { 1, 2}, } }, + /* avlab_1s1p_850 */ { 1, { { 1, 2}, } }, /* avlab_1s2p */ { 2, { { 1, 2}, { 3, 4 },} }, + /* avlab_1s2p_650 */ { 2, { { 1, 2}, { 3, 4 },} }, + /* avlab_1s2p_850 */ { 2, { { 1, 2}, { 3, 4 },} }, /* avlab_2s1p */ { 1, { { 2, 3}, } }, + /* avlab_2s1p_650 */ { 1, { { 2, 3}, } }, + /* avlab_2s1p_850 */ { 1, { { 2, 3}, } }, /* siig_1s1p_10x */ { 1, { { 3, 4 }, } }, /* siig_2s1p_10x */ { 1, { { 4, 5 }, } }, /* siig_2p1s_20x */ { 2, { { 1, 2 }, { 3, 4 }, } }, @@ -100,29 +112,22 @@ static struct pci_device_id parport_serial_pci_tbl[] = { PCI_ANY_ID, PCI_ANY_ID, 0, 0, netmos_9xx5_combo }, { PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9835, PCI_ANY_ID, PCI_ANY_ID, 0, 0, netmos_9xx5_combo }, + { PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9835, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, netmos_9xx5_combo }, { PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9845, PCI_ANY_ID, PCI_ANY_ID, 0, 0, netmos_9xx5_combo }, { PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9855, PCI_ANY_ID, PCI_ANY_ID, 0, 0, netmos_9855 }, /* PCI_VENDOR_ID_AVLAB/Intek21 has another bunch of cards ...*/ - { PCI_VENDOR_ID_AFAVLAB, 0x2110, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, avlab_1s1p }, - { PCI_VENDOR_ID_AFAVLAB, 0x2111, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, avlab_1s1p }, - { PCI_VENDOR_ID_AFAVLAB, 0x2112, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, avlab_1s1p }, - { PCI_VENDOR_ID_AFAVLAB, 0x2140, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, avlab_1s2p }, - { PCI_VENDOR_ID_AFAVLAB, 0x2141, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, avlab_1s2p }, - { PCI_VENDOR_ID_AFAVLAB, 0x2142, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, avlab_1s2p }, - { PCI_VENDOR_ID_AFAVLAB, 0x2160, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, avlab_2s1p }, - { PCI_VENDOR_ID_AFAVLAB, 0x2161, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, avlab_2s1p }, - { PCI_VENDOR_ID_AFAVLAB, 0x2162, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, avlab_2s1p }, + { 0x14db, 0x2110, PCI_ANY_ID, PCI_ANY_ID, 0, 0, avlab_1s1p}, + { 0x14db, 0x2111, PCI_ANY_ID, PCI_ANY_ID, 0, 0, avlab_1s1p_650}, + { 0x14db, 0x2112, PCI_ANY_ID, PCI_ANY_ID, 0, 0, avlab_1s1p_850}, + { 0x14db, 0x2140, PCI_ANY_ID, PCI_ANY_ID, 0, 0, avlab_1s2p}, + { 0x14db, 0x2141, PCI_ANY_ID, PCI_ANY_ID, 0, 0, avlab_1s2p_650}, + { 0x14db, 0x2142, PCI_ANY_ID, PCI_ANY_ID, 0, 0, avlab_1s2p_850}, + { 0x14db, 0x2160, PCI_ANY_ID, PCI_ANY_ID, 0, 0, avlab_2s1p}, + { 0x14db, 0x2161, PCI_ANY_ID, PCI_ANY_ID, 0, 0, avlab_2s1p_650}, + { 0x14db, 0x2162, PCI_ANY_ID, PCI_ANY_ID, 0, 0, avlab_2s1p_850}, { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1S1P_10x_550, PCI_ANY_ID, PCI_ANY_ID, 0, 0, siig_1s1p_10x }, { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1S1P_10x_650, @@ -196,18 +201,54 @@ static struct pciserial_board pci_parport_serial_boards[] __devinitdata = { .base_baud = 115200, .uart_offset = 8, }, + [avlab_1s1p_650] = { /* nt */ + .flags = FL_BASE0 | FL_BASE_BARS, + .num_ports = 1, + .base_baud = 115200, + .uart_offset = 8, + }, + [avlab_1s1p_850] = { /* nt */ + .flags = FL_BASE0 | FL_BASE_BARS, + .num_ports = 1, + .base_baud = 115200, + .uart_offset = 8, + }, [avlab_1s2p] = { /* n/t */ .flags = FL_BASE0 | FL_BASE_BARS, .num_ports = 1, .base_baud = 115200, .uart_offset = 8, }, + [avlab_1s2p_650] = { /* nt */ + .flags = FL_BASE0 | FL_BASE_BARS, + .num_ports = 1, + .base_baud = 115200, + .uart_offset = 8, + }, + [avlab_1s2p_850] = { /* nt */ + .flags = FL_BASE0 | FL_BASE_BARS, + .num_ports = 1, + .base_baud = 115200, + .uart_offset = 8, + }, [avlab_2s1p] = { /* n/t */ .flags = FL_BASE0 | FL_BASE_BARS, .num_ports = 2, .base_baud = 115200, .uart_offset = 8, }, + [avlab_2s1p_650] = { /* nt */ + .flags = FL_BASE0 | FL_BASE_BARS, + .num_ports = 2, + .base_baud = 115200, + .uart_offset = 8, + }, + [avlab_2s1p_850] = { /* nt */ + .flags = FL_BASE0 | FL_BASE_BARS, + .num_ports = 2, + .base_baud = 115200, + .uart_offset = 8, + }, [siig_1s1p_10x] = { .flags = FL_BASE2, .num_ports = 1, diff --git a/drivers/parport/parport_sunbpp.c b/drivers/parport/parport_sunbpp.c index fac333b27..36a1556e6 100644 --- a/drivers/parport/parport_sunbpp.c +++ b/drivers/parport/parport_sunbpp.c @@ -1,4 +1,5 @@ -/* parport_sunbpp.c: Parallel-port routines for SBUS +/* $Id: parport_sunbpp.c,v 1.12 2001/05/26 03:01:42 davem Exp $ + * Parallel-port routines for Sun architecture * * Author: Derrick J. Brashear * @@ -13,9 +14,6 @@ * Gus Baldauf (gbaldauf@ix.netcom.com) * Peter Zaitcev * Tom Dyas - * - * Updated to new SBUS device framework: David S. Miller - * */ #include @@ -289,7 +287,14 @@ static struct parport_operations parport_sunbpp_ops = .owner = THIS_MODULE, }; -static int __devinit init_one_port(struct sbus_dev *sdev) +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) { struct parport *p; /* at least in theory there may be a "we don't dma" case */ @@ -298,120 +303,109 @@ static int __devinit 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) - return -ENODEV; + goto out1; size = sdev->reg_addrs[0].reg_size; dma = PARPORT_DMA_NONE; - ops = kmalloc(sizeof(struct parport_operations), GFP_KERNEL); + dprintk(("alloc(ppops), ")); + ops = kmalloc (sizeof (struct parport_operations), GFP_KERNEL); if (!ops) - goto out_unmap; + goto out2; 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 out_free_ops; + goto out3; 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, - IRQF_SHARED, p->name, p)) != 0) { - goto out_put_port; + SA_SHIRQ, p->name, p)) != 0) { + dprintk(("ERROR %d\n", err)); + goto out4; } - + 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); - dev_set_drvdata(&sdev->ofdev.dev, p); - - parport_announce_port(p); - - return 0; + return 1; -out_put_port: +out4: parport_put_port(p); - -out_free_ops: +out3: kfree(ops); - -out_unmap: +out2: sbus_iounmap(base, size); - +out1: + kfree(node); +out0: return err; } -static int __devinit bpp_probe(struct of_device *dev, const struct of_device_id *match) -{ - 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); - } - - 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); + 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); + } + } + return count ? 0 : -ENODEV; } static void __exit parport_sunbpp_exit(void) { - of_unregister_driver(&bpp_sbus_driver); + 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); + } } 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 2e744a274..cbe17184b 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,6 +13,7 @@ */ #include +#include #include #include #include diff --git a/drivers/parport/share.c b/drivers/parport/share.c index 94dc506b8..ea62bed6b 100644 --- a/drivers/parport/share.c +++ b/drivers/parport/share.c @@ -17,6 +17,7 @@ #undef PARPORT_DEBUG_SHARING /* undef for production */ +#include #include #include #include @@ -31,7 +32,6 @@ #include #include -#include #include #undef PARPORT_PARANOID @@ -50,7 +50,7 @@ static DEFINE_SPINLOCK(full_list_lock); static LIST_HEAD(drivers); -static DEFINE_MUTEX(registration_lock); +static DECLARE_MUTEX(registration_lock); /* What you can do to a port that's gone away.. */ static void dead_write_lines (struct parport *p, unsigned char b){} @@ -158,11 +158,11 @@ int parport_register_driver (struct parport_driver *drv) if (list_empty(&portlist)) get_lowlevel_driver (); - mutex_lock(®istration_lock); + down(®istration_lock); list_for_each_entry(port, &portlist, list) drv->attach(port); list_add(&drv->list, &drivers); - mutex_unlock(®istration_lock); + up(®istration_lock); return 0; } @@ -188,11 +188,11 @@ void parport_unregister_driver (struct parport_driver *drv) { struct parport *port; - mutex_lock(®istration_lock); + down(®istration_lock); list_del_init(&drv->list); list_for_each_entry(port, &portlist, list) drv->detach(port); - mutex_unlock(®istration_lock); + up(®istration_lock); } static void free_port (struct parport *port) @@ -217,7 +217,7 @@ static void free_port (struct parport *port) * parport_get_port - increment a port's reference count * @port: the port * - * This ensures that a struct parport pointer remains valid + * This ensure's that a struct parport pointer remains valid * until the matching parport_put_port() call. **/ @@ -366,7 +366,7 @@ void parport_announce_port (struct parport *port) #endif parport_proc_register(port); - mutex_lock(®istration_lock); + down(®istration_lock); spin_lock_irq(&parportlist_lock); list_add_tail(&port->list, &portlist); for (i = 1; i < 3; i++) { @@ -383,7 +383,7 @@ void parport_announce_port (struct parport *port) if (slave) attach_driver_chain(slave); } - mutex_unlock(®istration_lock); + up(®istration_lock); } /** @@ -409,7 +409,7 @@ void parport_remove_port(struct parport *port) { int i; - mutex_lock(®istration_lock); + down(®istration_lock); /* Spread the word. */ detach_driver_chain (port); @@ -436,7 +436,7 @@ void parport_remove_port(struct parport *port) } spin_unlock(&parportlist_lock); - mutex_unlock(®istration_lock); + up(®istration_lock); parport_proc_unregister(port); diff --git a/drivers/pci/Kconfig b/drivers/pci/Kconfig index 065ea43aa..f187fd8ae 100644 --- a/drivers/pci/Kconfig +++ b/drivers/pci/Kconfig @@ -5,19 +5,31 @@ config PCI_MSI bool "Message Signaled Interrupts (MSI and MSI-X)" depends on PCI depends on (X86_LOCAL_APIC && X86_IO_APIC) || IA64 - depends on !XEN help This allows device drivers to enable MSI (Message Signaled Interrupts). Message Signaled Interrupts enable a device to generate an interrupt using an inbound Memory Write on its PCI bus instead of asserting a device IRQ pin. - Use of PCI MSI interrupts can be disabled at kernel boot time - by using the 'pci=nomsi' option. This disables MSI for the - entire system. - If you don't know what to do here, say N. +config PCI_LEGACY_PROC + bool "Legacy /proc/pci interface" + depends on PCI + ---help--- + This feature enables a procfs file -- /proc/pci -- that provides a + summary of PCI devices in the system. + + This feature has been deprecated as of v2.5.53, in favor of using the + tool lspci(8). This feature may be removed at a future date. + + lspci can provide the same data, as well as much more. lspci is a part of + the pci-utils package, which should be installed by your distribution. + See for information on where to get the latest + version. + + When in doubt, say N. + config PCI_DEBUG bool "PCI Debugging" depends on PCI && DEBUG_KERNEL diff --git a/drivers/pci/Makefile b/drivers/pci/Makefile index f2d152b81..6707df968 100644 --- a/drivers/pci/Makefile +++ b/drivers/pci/Makefile @@ -26,11 +26,7 @@ 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 - -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) +obj-$(CONFIG_PCI_MSI) += msi.o # # ACPI Related PCI FW Functions diff --git a/drivers/pci/bus.c b/drivers/pci/bus.c index 5f7db9d24..eed67d9e7 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, - 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) + 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) { int i, ret = -ENOMEM; @@ -81,9 +81,9 @@ void __devinit pci_bus_add_device(struct pci_dev *dev) { device_add(&dev->dev); - down_write(&pci_bus_sem); + spin_lock(&pci_bus_lock); list_add_tail(&dev->global_list, &pci_devices); - up_write(&pci_bus_sem); + spin_unlock(&pci_bus_lock); 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)) { - down_write(&pci_bus_sem); + spin_lock(&pci_bus_lock); list_add_tail(&dev->subordinate->node, &dev->bus->children); - up_write(&pci_bus_sem); + spin_unlock(&pci_bus_lock); } 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; - down_read(&pci_bus_sem); + spin_lock(&pci_bus_lock); next = top->devices.next; for (;;) { if (next == &bus->devices) { @@ -180,19 +180,22 @@ 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 device locked */ - down(&dev->dev.sem); + /* Run device routines with the bus unlocked */ cb(dev, userdata); - up(&dev->dev.sem); + + spin_lock(&pci_bus_lock); + pci_dev_put(dev); } - up_read(&pci_bus_sem); + spin_unlock(&pci_bus_lock); } EXPORT_SYMBOL_GPL(pci_walk_bus); diff --git a/drivers/pci/hotplug/Kconfig b/drivers/pci/hotplug/Kconfig index 8a60f391f..222a1cc4a 100644 --- a/drivers/pci/hotplug/Kconfig +++ b/drivers/pci/hotplug/Kconfig @@ -6,7 +6,8 @@ menu "PCI Hotplug Support" config HOTPLUG_PCI tristate "Support for PCI Hotplug (EXPERIMENTAL)" - depends on PCI && EXPERIMENTAL && HOTPLUG + depends on PCI && EXPERIMENTAL + select 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 @@ -76,7 +77,7 @@ config HOTPLUG_PCI_IBM config HOTPLUG_PCI_ACPI tristate "ACPI PCI Hotplug driver" - depends on (!ACPI_DOCK && ACPI && HOTPLUG_PCI) || (ACPI_DOCK && HOTPLUG_PCI) + depends on ACPI && HOTPLUG_PCI help Say Y here if you have a system that supports PCI Hotplug using ACPI. @@ -153,6 +154,13 @@ 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 34a189119..3c71e3077 100644 --- a/drivers/pci/hotplug/Makefile +++ b/drivers/pci/hotplug/Makefile @@ -22,9 +22,6 @@ ifdef CONFIG_HOTPLUG_PCI_CPCI pci_hotplug-objs += cpci_hotplug_core.o \ cpci_hotplug_pci.o endif -ifdef CONFIG_ACPI -pci_hotplug-objs += acpi_pcihp.o -endif cpqphp-objs := cpqphp_core.o \ cpqphp_ctrl.o \ @@ -53,9 +50,23 @@ pciehp-objs := pciehp_core.o \ pciehp_ctrl.o \ pciehp_pci.o \ pciehp_hpc.o +ifdef CONFIG_ACPI + pciehp-objs += pciehprm_acpi.o +else + pciehp-objs += pciehprm_nonacpi.o +endif shpchp-objs := shpchp_core.o \ shpchp_ctrl.o \ shpchp_pci.o \ shpchp_sysfs.o \ shpchp_hpc.o +ifdef CONFIG_ACPI + shpchp-objs += shpchprm_acpi.o +else + ifdef CONFIG_HOTPLUG_PCI_SHPC_PHPRM_LEGACY + shpchp-objs += shpchprm_legacy.o + else + shpchp-objs += shpchprm_nonacpi.o + endif +endif diff --git a/drivers/pci/hotplug/acpiphp.h b/drivers/pci/hotplug/acpiphp.h index be104eced..293603e1b 100644 --- a/drivers/pci/hotplug/acpiphp.h +++ b/drivers/pci/hotplug/acpiphp.h @@ -37,7 +37,6 @@ #include #include /* for KOBJ_NAME_LEN */ -#include #include "pci_hotplug.h" #define dbg(format, arg...) \ @@ -60,10 +59,26 @@ struct acpiphp_slot; * struct slot - slot information for each *physical* slot */ struct slot { + u8 number; struct hotplug_slot *hotplug_slot; + struct list_head slot_list; + struct acpiphp_slot *acpi_slot; }; +/** + * struct hpp_param - ACPI 2.0 _HPP Hot Plug Parameters + * @cache_line_size in DWORD + * @latency_timer in PCI clock + * @enable_SERR 0 or 1 + * @enable_PERR 0 or 1 + */ +struct hpp_param { + u8 cache_line_size; + u8 latency_timer; + u8 enable_SERR; + u8 enable_PERR; +}; /** @@ -75,10 +90,6 @@ 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; @@ -91,7 +102,7 @@ struct acpiphp_bridge { struct pci_dev *pci_dev; /* ACPI 2.0 _HPP parameters */ - struct hotplug_params hpp; + struct hpp_param hpp; spinlock_t res_lock; }; @@ -107,9 +118,9 @@ struct acpiphp_slot { struct acpiphp_bridge *bridge; /* parent */ struct list_head funcs; /* one slot may have different objects (i.e. for each function) */ - struct slot *slot; - struct mutex crit_sect; + struct semaphore crit_sect; + u32 id; /* slot id (serial #) for hotplug core */ u8 device; /* pci device# */ u32 sun; /* ACPI _SUN (slot unique number) */ @@ -126,11 +137,10 @@ 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# */ @@ -150,7 +160,6 @@ struct acpiphp_attention_info struct module *owner; }; - /* PCI bus bridge HID */ #define ACPI_PCI_HOST_HID "PNP0A03" @@ -188,20 +197,18 @@ struct acpiphp_attention_info #define FUNC_HAS_PS1 (0x00000020) #define FUNC_HAS_PS2 (0x00000040) #define FUNC_HAS_PS3 (0x00000080) -#define FUNC_HAS_DCK (0x00000100) /* function prototypes */ /* acpiphp_core.c */ extern int acpiphp_register_attention(struct acpiphp_attention_info*info); extern int acpiphp_unregister_attention(struct acpiphp_attention_info *info); -extern int acpiphp_register_hotplug_slot(struct acpiphp_slot *slot); -extern void acpiphp_unregister_hotplug_slot(struct acpiphp_slot *slot); /* acpiphp_glue.c */ extern int acpiphp_glue_init (void); extern void acpiphp_glue_exit (void); extern int acpiphp_get_num_slots (void); +extern struct acpiphp_slot *get_slot_from_id (int id); typedef int (*acpiphp_callback)(struct acpiphp_slot *slot, void *data); extern int acpiphp_enable_slot (struct acpiphp_slot *slot); diff --git a/drivers/pci/hotplug/acpiphp_core.c b/drivers/pci/hotplug/acpiphp_core.c index e2fef60c2..60c4c3804 100644 --- a/drivers/pci/hotplug/acpiphp_core.c +++ b/drivers/pci/hotplug/acpiphp_core.c @@ -27,7 +27,8 @@ * 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 , + * * */ @@ -43,6 +44,8 @@ #include "pci_hotplug.h" #include "acpiphp.h" +static LIST_HEAD(slot_list); + #define MY_NAME "acpiphp" static int debug; @@ -338,53 +341,62 @@ static void release_slot(struct hotplug_slot *hotplug_slot) kfree(slot); } -/* callback routine to initialize 'struct slot' for each slot */ -int acpiphp_register_hotplug_slot(struct acpiphp_slot *acpiphp_slot) +/** + * init_slots - initialize 'struct slot' structures for each slot + * + */ +static int __init init_slots(void) { struct slot *slot; - struct hotplug_slot *hotplug_slot; - struct hotplug_slot_info *hotplug_slot_info; int retval = -ENOMEM; - - slot = kzalloc(sizeof(*slot), GFP_KERNEL); - if (!slot) - goto error; - - slot->hotplug_slot = kzalloc(sizeof(*hotplug_slot), GFP_KERNEL); - if (!slot->hotplug_slot) - goto error_slot; - - slot->hotplug_slot->info = kzalloc(sizeof(*hotplug_slot_info), - GFP_KERNEL); - if (!slot->hotplug_slot->info) - goto error_hpslot; - - slot->hotplug_slot->name = kzalloc(SLOT_NAME_SIZE, GFP_KERNEL); - if (!slot->hotplug_slot->name) - goto error_info; - - slot->hotplug_slot->private = slot; - slot->hotplug_slot->release = &release_slot; - slot->hotplug_slot->ops = &acpi_hotplug_slot_ops; - - slot->acpi_slot = acpiphp_slot; - slot->hotplug_slot->info->power_status = acpiphp_get_power_status(slot->acpi_slot); - slot->hotplug_slot->info->attention_status = 0; - slot->hotplug_slot->info->latch_status = acpiphp_get_latch_status(slot->acpi_slot); - slot->hotplug_slot->info->adapter_status = acpiphp_get_adapter_status(slot->acpi_slot); - slot->hotplug_slot->info->max_bus_speed = PCI_SPEED_UNKNOWN; - slot->hotplug_slot->info->cur_bus_speed = PCI_SPEED_UNKNOWN; - - acpiphp_slot->slot = slot; - make_slot_name(slot); - - retval = pci_hp_register(slot->hotplug_slot); - if (retval) { - err("pci_hp_register failed with error %d\n", retval); - goto error_name; - } - - info("Slot [%s] registered\n", slot->hotplug_slot->name); + int i; + + for (i = 0; i < num_slots; ++i) { + slot = kmalloc(sizeof(struct slot), GFP_KERNEL); + if (!slot) + goto error; + memset(slot, 0, sizeof(struct slot)); + + slot->hotplug_slot = kmalloc(sizeof(struct hotplug_slot), GFP_KERNEL); + if (!slot->hotplug_slot) + goto error_slot; + memset(slot->hotplug_slot, 0, sizeof(struct hotplug_slot)); + + slot->hotplug_slot->info = kmalloc(sizeof(struct hotplug_slot_info), GFP_KERNEL); + if (!slot->hotplug_slot->info) + goto error_hpslot; + memset(slot->hotplug_slot->info, 0, sizeof(struct hotplug_slot_info)); + + slot->hotplug_slot->name = kmalloc(SLOT_NAME_SIZE, GFP_KERNEL); + if (!slot->hotplug_slot->name) + goto error_info; + + slot->number = i; + + slot->hotplug_slot->private = slot; + slot->hotplug_slot->release = &release_slot; + slot->hotplug_slot->ops = &acpi_hotplug_slot_ops; + + slot->acpi_slot = get_slot_from_id(i); + slot->hotplug_slot->info->power_status = acpiphp_get_power_status(slot->acpi_slot); + slot->hotplug_slot->info->attention_status = 0; + slot->hotplug_slot->info->latch_status = acpiphp_get_latch_status(slot->acpi_slot); + slot->hotplug_slot->info->adapter_status = acpiphp_get_adapter_status(slot->acpi_slot); + slot->hotplug_slot->info->max_bus_speed = PCI_SPEED_UNKNOWN; + slot->hotplug_slot->info->cur_bus_speed = PCI_SPEED_UNKNOWN; + + make_slot_name(slot); + + retval = pci_hp_register(slot->hotplug_slot); + if (retval) { + err("pci_hp_register failed with error %d\n", retval); + goto error_name; + } + + /* add slot to our internal list */ + list_add(&slot->slot_list, &slot_list); + info("Slot [%s] registered\n", slot->hotplug_slot->name); + } return 0; error_name: @@ -400,32 +412,40 @@ error: } -void acpiphp_unregister_hotplug_slot(struct acpiphp_slot *acpiphp_slot) +static void __exit cleanup_slots (void) { - struct slot *slot = acpiphp_slot->slot; - int retval = 0; - - info ("Slot [%s] unregistered\n", slot->hotplug_slot->name); + struct list_head *tmp, *n; + struct slot *slot; - retval = pci_hp_deregister(slot->hotplug_slot); - if (retval) - err("pci_hp_deregister failed with error %d\n", retval); + list_for_each_safe (tmp, n, &slot_list) { + /* memory will be freed in release_slot callback */ + slot = list_entry(tmp, struct slot, slot_list); + list_del(&slot->slot_list); + pci_hp_deregister(slot->hotplug_slot); + } } static int __init acpiphp_init(void) { + int retval; + info(DRIVER_DESC " version: " DRIVER_VERSION "\n"); acpiphp_debug = debug; /* read all the ACPI info from the system */ - return init_acpi(); + retval = init_acpi(); + if (retval) + return retval; + + return init_slots(); } static void __exit acpiphp_exit(void) { + cleanup_slots(); /* deallocate internal data structures etc. */ acpiphp_glue_exit(); } diff --git a/drivers/pci/hotplug/acpiphp_glue.c b/drivers/pci/hotplug/acpiphp_glue.c index ae67a8f55..509a5b3ae 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 * */ @@ -46,7 +46,7 @@ #include #include #include -#include +#include #include "../pci.h" #include "pci_hotplug.h" @@ -57,9 +57,9 @@ static LIST_HEAD(bridge_list); #define MY_NAME "acpiphp_glue" static void handle_hotplug_event_bridge (acpi_handle, u32, void *); +static void handle_hotplug_event_func (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); /* @@ -117,59 +117,6 @@ 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 @@ -181,7 +128,8 @@ register_slot(acpi_handle handle, u32 lvl, void *context, void **rv) acpi_handle tmp; acpi_status status = AE_OK; unsigned long adr, sun; - int device, function, retval; + int device, function; + static int num_slots = 0; /* XXX if we support I/O node hotplug... */ status = acpi_evaluate_integer(handle, "_ADR", NULL, &adr); @@ -190,21 +138,21 @@ register_slot(acpi_handle handle, u32 lvl, void *context, void **rv) status = acpi_get_handle(handle, "_EJ0", &tmp); - if (ACPI_FAILURE(status) && !(is_dock_device(handle))) + if (ACPI_FAILURE(status)) return AE_OK; device = (adr >> 16) & 0xffff; function = adr & 0xffff; - newfunc = kzalloc(sizeof(struct acpiphp_func), GFP_KERNEL); + newfunc = kmalloc(sizeof(struct acpiphp_func), GFP_KERNEL); if (!newfunc) return AE_NO_MEMORY; + memset(newfunc, 0, sizeof(struct acpiphp_func)); INIT_LIST_HEAD(&newfunc->sibling); newfunc->handle = handle; newfunc->function = function; - if (ACPI_SUCCESS(status)) - newfunc->flags = FUNC_HAS_EJ0; + newfunc->flags = FUNC_HAS_EJ0; if (ACPI_SUCCESS(acpi_get_handle(handle, "_STA", &tmp))) newfunc->flags |= FUNC_HAS_STA; @@ -215,17 +163,9 @@ 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))) - newfunc->flags |= FUNC_HAS_DCK; - status = acpi_evaluate_integer(handle, "_SUN", NULL, &sun); - 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; - } + if (ACPI_FAILURE(status)) + sun = -1; /* search for objects that share the same slot */ for (slot = bridge->slots; slot; slot = slot->next) @@ -236,17 +176,19 @@ register_slot(acpi_handle handle, u32 lvl, void *context, void **rv) } if (!slot) { - slot = kzalloc(sizeof(struct acpiphp_slot), GFP_KERNEL); + slot = kmalloc(sizeof(struct acpiphp_slot), GFP_KERNEL); if (!slot) { kfree(newfunc); return AE_NO_MEMORY; } + memset(slot, 0, sizeof(struct acpiphp_slot)); slot->bridge = bridge; + slot->id = num_slots++; slot->device = device; slot->sun = sun; INIT_LIST_HEAD(&slot->funcs); - mutex_init(&slot->crit_sect); + init_MUTEX(&slot->crit_sect); slot->next = bridge->slots; bridge->slots = slot; @@ -256,11 +198,6 @@ register_slot(acpi_handle handle, u32 lvl, void *context, void **rv) dbg("found ACPI PCI Hotplug slot %d at PCI %04x:%02x:%02x\n", slot->sun, pci_domain_nr(bridge->pci_bus), bridge->pci_bus->number, slot->device); - retval = acpiphp_register_hotplug_slot(slot); - if (retval) { - warn("acpiphp_register_hotplug_slot failed(err code = 0x%x)\n", retval); - goto err_exit; - } } newfunc->slot = slot; @@ -273,44 +210,16 @@ register_slot(acpi_handle handle, u32 lvl, void *context, void **rv) slot->flags |= (SLOT_ENABLED | SLOT_POWEREDON); } - 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; - 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 */ - if (!(newfunc->flags & FUNC_HAS_DCK)) { - status = acpi_install_notify_handler(handle, + status = acpi_install_notify_handler(handle, ACPI_SYSTEM_NOTIFY, handle_hotplug_event_func, newfunc); - if (ACPI_FAILURE(status)) - err("failed to register interrupt notify handler\n"); - } else - status = AE_OK; - - return status; - - err_exit: - bridge->nr_slots--; - bridge->slots = slot->next; - kfree(slot); - kfree(newfunc); + if (ACPI_FAILURE(status)) { + err("failed to register interrupt notify handler\n"); + return status; + } return AE_OK; } @@ -328,15 +237,6 @@ 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; } @@ -345,23 +245,55 @@ static int detect_ejectable_slots(acpi_handle *bridge_handle) static void decode_hpp(struct acpiphp_bridge *bridge) { acpi_status status; + struct acpi_buffer buffer = { .length = ACPI_ALLOCATE_BUFFER, + .pointer = NULL}; + union acpi_object *package; + int i; + + /* default numbers */ + bridge->hpp.cache_line_size = 0x10; + bridge->hpp.latency_timer = 0x40; + bridge->hpp.enable_SERR = 0; + bridge->hpp.enable_PERR = 0; - 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 */ - 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; + status = acpi_evaluate_object(bridge->handle, "_HPP", NULL, &buffer); + + if (ACPI_FAILURE(status)) { + dbg("_HPP evaluation failed\n"); + return; } -} + package = (union acpi_object *) buffer.pointer; + + if (!package || package->type != ACPI_TYPE_PACKAGE || + package->package.count != 4 || !package->package.elements) { + err("invalid _HPP object; ignoring\n"); + goto err_exit; + } + + for (i = 0; i < 4; i++) { + if (package->package.elements[i].type != ACPI_TYPE_INTEGER) { + err("invalid _HPP parameter type; ignoring\n"); + goto err_exit; + } + } + + bridge->hpp.cache_line_size = package->package.elements[0].integer.value; + bridge->hpp.latency_timer = package->package.elements[1].integer.value; + bridge->hpp.enable_SERR = package->package.elements[2].integer.value; + bridge->hpp.enable_PERR = package->package.elements[3].integer.value; + + dbg("_HPP parameter = (%02x, %02x, %02x, %02x)\n", + bridge->hpp.cache_line_size, + bridge->hpp.latency_timer, + bridge->hpp.enable_SERR, + bridge->hpp.enable_PERR); + + bridge->flags |= BRIDGE_HAS_HPP; + + err_exit: + kfree(buffer.pointer); +} /* initialize miscellaneous stuff for both root and PCI-to-PCI bridge */ @@ -372,26 +304,12 @@ static void init_bridge_misc(struct acpiphp_bridge *bridge) /* decode ACPI 2.0 _HPP (hot plug parameters) */ decode_hpp(bridge); - /* must be added to the list prior to calling register_slot */ - list_add(&bridge->list, &bridge_list); - /* register all slot objects under this bridge */ status = acpi_walk_namespace(ACPI_TYPE_DEVICE, bridge->handle, (u32)1, register_slot, bridge, NULL); - if (ACPI_FAILURE(status)) { - list_del(&bridge->list); - return; - } /* 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, @@ -401,66 +319,8 @@ static void init_bridge_misc(struct acpiphp_bridge *bridge) err("failed to register interrupt notify handler\n"); } } -} - - -/* 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; - } + list_add(&bridge->list, &bridge_list); } @@ -469,10 +329,12 @@ static void add_host_bridge(acpi_handle *handle, struct pci_bus *pci_bus) { struct acpiphp_bridge *bridge; - bridge = kzalloc(sizeof(struct acpiphp_bridge), GFP_KERNEL); + bridge = kmalloc(sizeof(struct acpiphp_bridge), GFP_KERNEL); if (bridge == NULL) return; + memset(bridge, 0, sizeof(struct acpiphp_bridge)); + bridge->type = BRIDGE_TYPE_HOST; bridge->handle = handle; @@ -489,15 +351,16 @@ static void add_p2p_bridge(acpi_handle *handle, struct pci_dev *pci_dev) { struct acpiphp_bridge *bridge; - bridge = kzalloc(sizeof(struct acpiphp_bridge), GFP_KERNEL); + bridge = kmalloc(sizeof(struct acpiphp_bridge), GFP_KERNEL); if (bridge == NULL) { err("out of memory\n"); return; } + memset(bridge, 0, sizeof(struct acpiphp_bridge)); + 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; @@ -547,17 +410,11 @@ 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)) { + if (detect_ejectable_slots(handle) > 0) { dbg("found PCI-to-PCI bridge at PCI %s\n", pci_name(dev)); add_p2p_bridge(handle, dev); } - /* search P2P bridges under this p2p bridge */ - status = acpi_walk_namespace(ACPI_TYPE_DEVICE, handle, (u32)1, - find_p2p_bridge, dev->subordinate, NULL); - if (ACPI_FAILURE(status)) - warn("find_p2p_bridge failed (error code = 0x%x)\n", status); - out: pci_dev_put(dev); return AE_OK; @@ -611,6 +468,7 @@ 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 */ @@ -618,7 +476,7 @@ static int add_bridge(acpi_handle handle) find_p2p_bridge, pci_bus, NULL); if (ACPI_FAILURE(status)) - warn("find_p2p_bridge failed (error code = 0x%x)\n", status); + warn("find_p2p_bridge faied (error code = 0x%x)\n",status); return 0; } @@ -648,39 +506,21 @@ 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, + status = acpi_remove_notify_handler(func->handle, ACPI_SYSTEM_NOTIFY, handle_hotplug_event_func); - if (ACPI_FAILURE(status)) - err("failed to remove notify handler\n"); - } + if (ACPI_FAILURE(status)) + err("failed to remove notify handler\n"); pci_dev_put(func->pci_dev); list_del(list); kfree(func); } - acpiphp_unregister_hotplug_slot(slot); - list_del(&slot->funcs); kfree(slot); slot = next; } @@ -695,11 +535,6 @@ 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); @@ -710,14 +545,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, + (u32)1, cleanup_p2p_bridge, NULL, NULL); + } } static struct pci_dev * get_apic_pci_info(acpi_handle handle) @@ -784,7 +619,7 @@ static int get_gsi_base(acpi_handle handle, u32 *gsi_base) break; } out: - kfree(buffer.pointer); + acpi_os_free(buffer.pointer); return result; } @@ -916,105 +751,6 @@ static int power_off_slot(struct acpiphp_slot *slot) } - -/** - * acpiphp_max_busnr - return the highest reserved bus number under - * the given bus. - * @bus: bus to start search with - * - */ -static unsigned char acpiphp_max_busnr(struct pci_bus *bus) -{ - struct list_head *tmp; - unsigned char max, n; - - /* - * pci_bus_max_busnr will return the highest - * reserved busnr for all these children. - * that is equivalent to the bus->subordinate - * value. We don't want to use the parent's - * bus->subordinate value because it could have - * padding in it. - */ - max = bus->secondary; - - list_for_each(tmp, &bus->children) { - n = pci_bus_max_busnr(pci_bus_b(tmp)); - if (n > max) - max = n; - } - return max; -} - - -/** - * acpiphp_bus_add - add a new bus to acpi subsystem - * @func: acpiphp_func of the bridge - * - */ -static int acpiphp_bus_add(struct acpiphp_func *func) -{ - acpi_handle phandle; - struct acpi_device *device, *pdevice; - int ret_val; - - acpi_get_parent(func->handle, &phandle); - if (acpi_bus_get_device(phandle, &pdevice)) { - dbg("no parent device, assuming NULL\n"); - pdevice = NULL; - } - if (!acpi_bus_get_device(func->handle, &device)) { - dbg("bus exists... trim\n"); - /* this shouldn't be in here, so remove - * the bus then re-add it... - */ - ret_val = acpi_bus_trim(device, 1); - dbg("acpi_bus_trim return %x\n", ret_val); - } - - ret_val = acpi_bus_add(&device, pdevice, func->handle, - ACPI_BUS_TYPE_DEVICE); - if (ret_val) { - dbg("error adding bus, %x\n", - -ret_val); - goto acpiphp_bus_add_out; - } - /* - * try to start anyway. We could have failed to add - * simply because this bus had previously been added - * on another add. Don't bother with the return value - * we just keep going. - */ - ret_val = acpi_bus_start(device); - -acpiphp_bus_add_out: - return ret_val; -} - - -/** - * 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 * @slot: slot to be enabled @@ -1031,7 +767,6 @@ 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; @@ -1053,7 +788,7 @@ static int enable_device(struct acpiphp_slot *slot) goto err_exit; } - max = acpiphp_max_busnr(bus); + max = bus->secondary; for (pass = 0; pass < 2; pass++) { list_for_each_entry(dev, &bus->devices, bus_list) { if (PCI_SLOT(dev->devfn) != slot->device) @@ -1067,34 +802,18 @@ static int enable_device(struct acpiphp_slot *slot) } } - 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); pci_bus_add_devices(bus); - acpiphp_set_hpp_values(slot->bridge->handle, bus); - acpiphp_configure_ioapics(slot->bridge->handle); + acpiphp_set_hpp_values(DEVICE_ACPI_HANDLE(&bus->self->dev), bus); + acpiphp_configure_ioapics(DEVICE_ACPI_HANDLE(&bus->self->dev)); /* associate pci_dev to our representation */ list_for_each (l, &slot->funcs) { 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; @@ -1119,18 +838,6 @@ 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; @@ -1275,17 +982,16 @@ 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.t0->cache_line_size); + bridge->hpp.cache_line_size); pci_write_config_byte(dev, PCI_LATENCY_TIMER, - bridge->hpp.t0->latency_timer); + bridge->hpp.latency_timer); pci_read_config_word(dev, PCI_COMMAND, &pci_cmd); - if (bridge->hpp.t0->enable_serr) + if (bridge->hpp.enable_SERR) pci_cmd |= PCI_COMMAND_SERR; else pci_cmd &= ~PCI_COMMAND_SERR; - if (bridge->hpp.t0->enable_perr) + if (bridge->hpp.enable_PERR) pci_cmd |= PCI_COMMAND_PARITY; else pci_cmd &= ~PCI_COMMAND_PARITY; @@ -1294,13 +1000,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.t0->latency_timer); + bridge->hpp.latency_timer); pci_read_config_word(dev, PCI_BRIDGE_CONTROL, &pci_bctl); - if (bridge->hpp.t0->enable_serr) + if (bridge->hpp.enable_SERR) pci_bctl |= PCI_BRIDGE_CTL_SERR; else pci_bctl &= ~PCI_BRIDGE_CTL_SERR; - if (bridge->hpp.t0->enable_perr) + if (bridge->hpp.enable_PERR) pci_bctl |= PCI_BRIDGE_CTL_PARITY; else pci_bctl &= ~PCI_BRIDGE_CTL_PARITY; @@ -1320,8 +1026,6 @@ 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) program_hpp(dev, &bridge); @@ -1463,13 +1167,6 @@ 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: @@ -1545,13 +1242,41 @@ static void handle_hotplug_event_func(acpi_handle handle, u32 type, void *contex } } +static int is_root_bridge(acpi_handle handle) +{ + acpi_status status; + struct acpi_device_info *info; + struct acpi_buffer buffer = {ACPI_ALLOCATE_BUFFER, NULL}; + int i; + + status = acpi_get_object_info(handle, &buffer); + if (ACPI_SUCCESS(status)) { + info = buffer.pointer; + if ((info->valid & ACPI_VALID_HID) && + !strcmp(PCI_ROOT_HID_STRING, + info->hardware_id.value)) { + acpi_os_free(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); + return 1; + } + } + } + } + return 0; +} static acpi_status find_root_bridges(acpi_handle handle, u32 lvl, void *context, void **rv) { int *count = (int *)context; - if (acpi_root_bridge(handle)) { + if (is_root_bridge(handle)) { acpi_install_notify_handler(handle, ACPI_SYSTEM_NOTIFY, handle_hotplug_event_bridge, NULL); (*count)++; @@ -1648,6 +1373,26 @@ static int acpiphp_for_each_slot(acpiphp_callback fn, void *data) } #endif +/* search matching slot from id */ +struct acpiphp_slot *get_slot_from_id(int id) +{ + struct list_head *node; + struct acpiphp_bridge *bridge; + struct acpiphp_slot *slot; + + list_for_each (node, &bridge_list) { + bridge = (struct acpiphp_bridge *)node; + for (slot = bridge->slots; slot; slot = slot->next) + if (slot->id == id) + return slot; + } + + /* should never happen! */ + err("%s: no object for id %d\n", __FUNCTION__, id); + WARN_ON(1); + return NULL; +} + /** * acpiphp_enable_slot - power on slot @@ -1656,25 +1401,19 @@ int acpiphp_enable_slot(struct acpiphp_slot *slot) { int retval; - mutex_lock(&slot->crit_sect); + down(&slot->crit_sect); /* wake up all functions */ retval = power_on_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); + up(&slot->crit_sect); return retval; } @@ -1685,7 +1424,7 @@ int acpiphp_disable_slot(struct acpiphp_slot *slot) { int retval = 0; - mutex_lock(&slot->crit_sect); + down(&slot->crit_sect); /* unconfigure all functions */ retval = disable_device(slot); @@ -1698,7 +1437,7 @@ int acpiphp_disable_slot(struct acpiphp_slot *slot) goto err_exit; err_exit: - mutex_unlock(&slot->crit_sect); + up(&slot->crit_sect); return retval; } diff --git a/drivers/pci/hotplug/cpci_hotplug_core.c b/drivers/pci/hotplug/cpci_hotplug_core.c index d5df5871c..30af10527 100644 --- a/drivers/pci/hotplug/cpci_hotplug_core.c +++ b/drivers/pci/hotplug/cpci_hotplug_core.c @@ -25,6 +25,7 @@ * Send feedback to */ +#include #include #include #include @@ -247,19 +248,22 @@ cpci_hp_register_bus(struct pci_bus *bus, u8 first, u8 last) * with the pci_hotplug subsystem. */ for (i = first; i <= last; ++i) { - slot = kzalloc(sizeof (struct slot), GFP_KERNEL); + slot = kmalloc(sizeof (struct slot), GFP_KERNEL); if (!slot) goto error; + memset(slot, 0, sizeof (struct slot)); hotplug_slot = - kzalloc(sizeof (struct hotplug_slot), GFP_KERNEL); + kmalloc(sizeof (struct hotplug_slot), GFP_KERNEL); if (!hotplug_slot) goto error_slot; + memset(hotplug_slot, 0, sizeof (struct hotplug_slot)); slot->hotplug_slot = hotplug_slot; - info = kzalloc(sizeof (struct hotplug_slot_info), GFP_KERNEL); + info = kmalloc(sizeof (struct hotplug_slot_info), GFP_KERNEL); if (!info) goto error_hpslot; + memset(info, 0, sizeof (struct hotplug_slot_info)); hotplug_slot->info = info; name = kmalloc(SLOT_NAME_SIZE, GFP_KERNEL); @@ -347,7 +351,7 @@ cpci_hp_intr(int irq, void *data, struct pt_regs *regs) dbg("entered cpci_hp_intr"); /* Check to see if it was our interrupt */ - if ((controller->irq_flags & IRQF_SHARED) && + if ((controller->irq_flags & SA_SHIRQ) && !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 4afcaffd0..225b5e551 100644 --- a/drivers/pci/hotplug/cpci_hotplug_pci.c +++ b/drivers/pci/hotplug/cpci_hotplug_pci.c @@ -23,6 +23,7 @@ * Send feedback to */ +#include #include #include #include @@ -254,8 +255,8 @@ int cpci_led_off(struct slot* slot) int cpci_configure_slot(struct slot* slot) { - struct pci_bus *parent; - int fn; + unsigned char busnr; + struct pci_bus *child; dbg("%s - enter", __FUNCTION__); @@ -276,53 +277,23 @@ 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 -ENODEV; + return 1; } } - 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); + + 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); } - pci_bus_assign_resources(parent); - pci_bus_add_devices(parent); - pci_enable_bridges(parent); + pci_bus_assign_resources(slot->dev->bus); dbg("%s - exit", __FUNCTION__); return 0; diff --git a/drivers/pci/hotplug/cpcihp_generic.c b/drivers/pci/hotplug/cpcihp_generic.c index e847f0d6c..2d4639d68 100644 --- a/drivers/pci/hotplug/cpcihp_generic.c +++ b/drivers/pci/hotplug/cpcihp_generic.c @@ -34,6 +34,7 @@ * Send feedback to */ +#include #include #include #include diff --git a/drivers/pci/hotplug/cpcihp_zt5550.c b/drivers/pci/hotplug/cpcihp_zt5550.c index 1c12e9171..f7cb00da3 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 -#include /* IRQF_SHARED */ +#include /* SA_SHIRQ */ #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 %llx", (unsigned long long)pci_resource_start(hc_dev, 1)); - dbg("pci resource len %llx", (unsigned long long)pci_resource_len(hc_dev, 1)); + dbg("pci resource start %lx", pci_resource_start(hc_dev, 1)); + dbg("pci resource len %lx", 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,9 +108,8 @@ 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 %llx @ %llx", - (unsigned long long)pci_resource_len(hc_dev, 1), - (unsigned long long)pci_resource_start(hc_dev, 1)); + err("cannot remap MMIO region %lx @ %lx", + pci_resource_len(hc_dev, 1), pci_resource_start(hc_dev, 1)); ret = -ENODEV; goto exit_release_region; } @@ -220,7 +219,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 = IRQF_SHARED; + zt5550_hpc.irq_flags = SA_SHIRQ; zt5550_hpc.dev_id = hc_dev; zt5550_hpc_ops.enable_irq = zt5550_hc_enable_irq; diff --git a/drivers/pci/hotplug/cpqphp.h b/drivers/pci/hotplug/cpqphp.h index c74e9e37e..cb88404c8 100644 --- a/drivers/pci/hotplug/cpqphp.h +++ b/drivers/pci/hotplug/cpqphp.h @@ -32,7 +32,6 @@ #include #include /* for read? and write? functions */ #include /* for delays */ -#include #define MY_NAME "cpqphp" @@ -287,7 +286,7 @@ struct event_info { struct controller { struct controller *next; u32 ctrl_int_comp; - struct mutex crit_sect; /* critical section mutex */ + struct semaphore crit_sect; /* critical section semaphore */ void __iomem *hpc_reg; /* cookie for our pci controller location */ struct pci_resource *mem_head; struct pci_resource *p_mem_head; diff --git a/drivers/pci/hotplug/cpqphp_core.c b/drivers/pci/hotplug/cpqphp_core.c index 1fc259913..b3659ffcc 100644 --- a/drivers/pci/hotplug/cpqphp_core.c +++ b/drivers/pci/hotplug/cpqphp_core.c @@ -29,6 +29,7 @@ * */ +#include #include #include #include @@ -346,22 +347,26 @@ static int ctrl_slot_setup(struct controller *ctrl, slot_number = ctrl->first_slot; while (number_of_slots) { - slot = kzalloc(sizeof(*slot), GFP_KERNEL); + slot = kmalloc(sizeof(*slot), GFP_KERNEL); if (!slot) goto error; - slot->hotplug_slot = kzalloc(sizeof(*(slot->hotplug_slot)), + memset(slot, 0, sizeof(struct slot)); + slot->hotplug_slot = kmalloc(sizeof(*(slot->hotplug_slot)), GFP_KERNEL); if (!slot->hotplug_slot) goto error_slot; hotplug_slot = slot->hotplug_slot; + memset(hotplug_slot, 0, sizeof(struct hotplug_slot)); hotplug_slot->info = - kzalloc(sizeof(*(hotplug_slot->info)), + kmalloc(sizeof(*(hotplug_slot->info)), GFP_KERNEL); if (!hotplug_slot->info) goto error_hpslot; hotplug_slot_info = hotplug_slot->info; + memset(hotplug_slot_info, 0, + sizeof(struct hotplug_slot_info)); hotplug_slot->name = kmalloc(SLOT_NAME_SIZE, GFP_KERNEL); if (!hotplug_slot->name) @@ -594,7 +599,7 @@ cpqhp_set_attention_status(struct controller *ctrl, struct pci_func *func, hp_slot = func->device - ctrl->slot_device_offset; // Wait for exclusive access to hardware - mutex_lock(&ctrl->crit_sect); + down(&ctrl->crit_sect); if (status == 1) { amber_LED_on (ctrl, hp_slot); @@ -602,7 +607,7 @@ cpqhp_set_attention_status(struct controller *ctrl, struct pci_func *func, amber_LED_off (ctrl, hp_slot); } else { // Done with exclusive hardware access - mutex_unlock(&ctrl->crit_sect); + up(&ctrl->crit_sect); return(1); } @@ -612,7 +617,7 @@ cpqhp_set_attention_status(struct controller *ctrl, struct pci_func *func, wait_for_ctrl_irq (ctrl); // Done with exclusive hardware access - mutex_unlock(&ctrl->crit_sect); + up(&ctrl->crit_sect); return(0); } @@ -849,12 +854,13 @@ static int cpqhpc_probe(struct pci_dev *pdev, const struct pci_device_id *ent) goto err_disable_device; } - ctrl = kzalloc(sizeof(struct controller), GFP_KERNEL); + ctrl = (struct controller *) kmalloc(sizeof(struct controller), GFP_KERNEL); if (!ctrl) { err("%s : out of memory\n", __FUNCTION__); rc = -ENOMEM; goto err_disable_device; } + memset(ctrl, 0, sizeof(struct controller)); rc = pci_read_config_word(pdev, PCI_SUBSYSTEM_ID, &subsystem_deviceid); if (rc) { @@ -1078,7 +1084,7 @@ static int cpqhpc_probe(struct pci_dev *pdev, const struct pci_device_id *ent) dbg("bus device function rev: %d %d %d %d\n", ctrl->bus, PCI_SLOT(pdev->devfn), PCI_FUNC(pdev->devfn), ctrl->rev); - mutex_init(&ctrl->crit_sect); + init_MUTEX(&ctrl->crit_sect); init_waitqueue_head(&ctrl->queue); /* initialize our threads if they haven't already been started up */ @@ -1088,8 +1094,8 @@ static int cpqhpc_probe(struct pci_dev *pdev, const struct pci_device_id *ent) } dbg("pdev = %p\n", pdev); - 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)); + dbg("pci resource start %lx\n", pci_resource_start(pdev, 0)); + dbg("pci resource len %lx\n", pci_resource_len(pdev, 0)); if (!request_mem_region(pci_resource_start(pdev, 0), pci_resource_len(pdev, 0), MY_NAME)) { @@ -1101,9 +1107,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 %llx @ %llx\n", - (unsigned long long)pci_resource_len(pdev, 0), - (unsigned long long)pci_resource_start(pdev, 0)); + err("cannot remap MMIO region %lx @ %lx\n", + pci_resource_len(pdev, 0), + pci_resource_start(pdev, 0)); rc = -ENODEV; goto err_free_mem_region; } @@ -1188,7 +1194,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, - IRQF_SHARED, MY_NAME, ctrl)) { + SA_SHIRQ, MY_NAME, ctrl)) { err("Can't get irq %d for the hotplug pci controller\n", ctrl->interrupt); rc = -ENODEV; @@ -1217,7 +1223,7 @@ static int cpqhpc_probe(struct pci_dev *pdev, const struct pci_device_id *ent) // turn off empty slots here unless command line option "ON" set // Wait for exclusive access to hardware - mutex_lock(&ctrl->crit_sect); + down(&ctrl->crit_sect); num_of_slots = readb(ctrl->hpc_reg + SLOT_MASK) & 0x0F; @@ -1264,12 +1270,12 @@ static int cpqhpc_probe(struct pci_dev *pdev, const struct pci_device_id *ent) rc = init_SERR(ctrl); if (rc) { err("init_SERR failed\n"); - mutex_unlock(&ctrl->crit_sect); + up(&ctrl->crit_sect); goto err_free_irq; } // Done with exclusive hardware access - mutex_unlock(&ctrl->crit_sect); + up(&ctrl->crit_sect); cpqhp_create_debugfs_files(ctrl); diff --git a/drivers/pci/hotplug/cpqphp_ctrl.c b/drivers/pci/hotplug/cpqphp_ctrl.c index ae2dd36ef..771ed34b1 100644 --- a/drivers/pci/hotplug/cpqphp_ctrl.c +++ b/drivers/pci/hotplug/cpqphp_ctrl.c @@ -26,6 +26,7 @@ * */ +#include #include #include #include @@ -1281,7 +1282,9 @@ static u32 board_replaced(struct pci_func *func, struct controller *ctrl) u8 hp_slot; u8 temp_byte; u8 adapter_speed; + u32 index; u32 rc = 0; + u32 src = 8; hp_slot = func->device - ctrl->slot_device_offset; @@ -1296,7 +1299,7 @@ static u32 board_replaced(struct pci_func *func, struct controller *ctrl) **********************************/ rc = CARD_FUNCTIONING; } else { - mutex_lock(&ctrl->crit_sect); + down(&ctrl->crit_sect); /* turn on board without attaching to the bus */ enable_slot_power (ctrl, hp_slot); @@ -1330,12 +1333,12 @@ static u32 board_replaced(struct pci_func *func, struct controller *ctrl) /* Wait for SOBS to be unset */ wait_for_ctrl_irq (ctrl); - mutex_unlock(&ctrl->crit_sect); + up(&ctrl->crit_sect); if (rc) return rc; - mutex_lock(&ctrl->crit_sect); + down(&ctrl->crit_sect); slot_enable (ctrl, hp_slot); green_LED_blink (ctrl, hp_slot); @@ -1347,7 +1350,7 @@ static u32 board_replaced(struct pci_func *func, struct controller *ctrl) /* Wait for SOBS to be unset */ wait_for_ctrl_irq (ctrl); - mutex_unlock(&ctrl->crit_sect); + up(&ctrl->crit_sect); /* Wait for ~1 second because of hot plug spec */ long_delay(1*HZ); @@ -1365,30 +1368,76 @@ static u32 board_replaced(struct pci_func *func, struct controller *ctrl) rc = cpqhp_configure_board(ctrl, func); - /* If configuration fails, turn it off - * Get slot won't work for devices behind - * bridges, but in this case it will always be - * called for the "base" bus/dev/func of an - * adapter. */ + if (rc || src) { + /* If configuration fails, turn it off + * Get slot won't work for devices behind + * bridges, but in this case it will always be + * called for the "base" bus/dev/func of an + * adapter. */ - mutex_lock(&ctrl->crit_sect); + down(&ctrl->crit_sect); - amber_LED_on (ctrl, hp_slot); - green_LED_off (ctrl, hp_slot); - slot_disable (ctrl, hp_slot); + amber_LED_on (ctrl, hp_slot); + green_LED_off (ctrl, hp_slot); + slot_disable (ctrl, hp_slot); - set_SOGO(ctrl); + set_SOGO(ctrl); - /* Wait for SOBS to be unset */ - wait_for_ctrl_irq (ctrl); + /* Wait for SOBS to be unset */ + wait_for_ctrl_irq (ctrl); - mutex_unlock(&ctrl->crit_sect); + up(&ctrl->crit_sect); + + if (rc) + return rc; + else + return 1; + } + + func->status = 0; + func->switch_save = 0x10; + + index = 1; + while (((func = cpqhp_slot_find(func->bus, func->device, index)) != NULL) && !rc) { + rc |= cpqhp_configure_board(ctrl, func); + index++; + } + + if (rc) { + /* If configuration fails, turn it off + * Get slot won't work for devices behind + * bridges, but in this case it will always be + * called for the "base" bus/dev/func of an + * adapter. */ + + down(&ctrl->crit_sect); + + amber_LED_on (ctrl, hp_slot); + green_LED_off (ctrl, hp_slot); + slot_disable (ctrl, hp_slot); + + set_SOGO(ctrl); + + /* Wait for SOBS to be unset */ + wait_for_ctrl_irq (ctrl); + + up(&ctrl->crit_sect); - if (rc) return rc; - else - return 1; + } + /* Done configuring so turn LED on full time */ + + down(&ctrl->crit_sect); + + green_LED_on (ctrl, hp_slot); + + set_SOGO(ctrl); + + /* Wait for SOBS to be unset */ + wait_for_ctrl_irq (ctrl); + up(&ctrl->crit_sect); + rc = 0; } else { /* Something is wrong @@ -1396,7 +1445,7 @@ static u32 board_replaced(struct pci_func *func, struct controller *ctrl) * in this case it will always be called for the "base" * bus/dev/func of an adapter. */ - mutex_lock(&ctrl->crit_sect); + down(&ctrl->crit_sect); amber_LED_on (ctrl, hp_slot); green_LED_off (ctrl, hp_slot); @@ -1407,7 +1456,7 @@ static u32 board_replaced(struct pci_func *func, struct controller *ctrl) /* Wait for SOBS to be unset */ wait_for_ctrl_irq (ctrl); - mutex_unlock(&ctrl->crit_sect); + up(&ctrl->crit_sect); } } @@ -1439,7 +1488,7 @@ static u32 board_added(struct pci_func *func, struct controller *ctrl) dbg("%s: func->device, slot_offset, hp_slot = %d, %d ,%d\n", __FUNCTION__, func->device, ctrl->slot_device_offset, hp_slot); - mutex_lock(&ctrl->crit_sect); + down(&ctrl->crit_sect); /* turn on board without attaching to the bus */ enable_slot_power(ctrl, hp_slot); @@ -1473,7 +1522,7 @@ static u32 board_added(struct pci_func *func, struct controller *ctrl) /* Wait for SOBS to be unset */ wait_for_ctrl_irq(ctrl); - mutex_unlock(&ctrl->crit_sect); + up(&ctrl->crit_sect); if (rc) return rc; @@ -1483,7 +1532,7 @@ static u32 board_added(struct pci_func *func, struct controller *ctrl) /* turn on board and blink green LED */ dbg("%s: before down\n", __FUNCTION__); - mutex_lock(&ctrl->crit_sect); + down(&ctrl->crit_sect); dbg("%s: after down\n", __FUNCTION__); dbg("%s: before slot_enable\n", __FUNCTION__); @@ -1504,7 +1553,7 @@ static u32 board_added(struct pci_func *func, struct controller *ctrl) dbg("%s: after wait_for_ctrl_irq\n", __FUNCTION__); dbg("%s: before up\n", __FUNCTION__); - mutex_unlock(&ctrl->crit_sect); + up(&ctrl->crit_sect); dbg("%s: after up\n", __FUNCTION__); /* Wait for ~1 second because of hot plug spec */ @@ -1558,7 +1607,7 @@ static u32 board_added(struct pci_func *func, struct controller *ctrl) cpqhp_resource_sort_and_combine(&(ctrl->bus_head)); if (rc) { - mutex_lock(&ctrl->crit_sect); + down(&ctrl->crit_sect); amber_LED_on (ctrl, hp_slot); green_LED_off (ctrl, hp_slot); @@ -1569,7 +1618,7 @@ static u32 board_added(struct pci_func *func, struct controller *ctrl) /* Wait for SOBS to be unset */ wait_for_ctrl_irq (ctrl); - mutex_unlock(&ctrl->crit_sect); + up(&ctrl->crit_sect); return rc; } else { cpqhp_save_slot_config(ctrl, func); @@ -1591,7 +1640,7 @@ static u32 board_added(struct pci_func *func, struct controller *ctrl) } } while (new_slot); - mutex_lock(&ctrl->crit_sect); + down(&ctrl->crit_sect); green_LED_on (ctrl, hp_slot); @@ -1600,9 +1649,9 @@ static u32 board_added(struct pci_func *func, struct controller *ctrl) /* Wait for SOBS to be unset */ wait_for_ctrl_irq (ctrl); - mutex_unlock(&ctrl->crit_sect); + up(&ctrl->crit_sect); } else { - mutex_lock(&ctrl->crit_sect); + down(&ctrl->crit_sect); amber_LED_on (ctrl, hp_slot); green_LED_off (ctrl, hp_slot); @@ -1613,7 +1662,7 @@ static u32 board_added(struct pci_func *func, struct controller *ctrl) /* Wait for SOBS to be unset */ wait_for_ctrl_irq (ctrl); - mutex_unlock(&ctrl->crit_sect); + up(&ctrl->crit_sect); return rc; } @@ -1672,7 +1721,7 @@ static u32 remove_board(struct pci_func * func, u32 replace_flag, struct control func->status = 0x01; func->configured = 0; - mutex_lock(&ctrl->crit_sect); + down(&ctrl->crit_sect); green_LED_off (ctrl, hp_slot); slot_disable (ctrl, hp_slot); @@ -1687,7 +1736,7 @@ static u32 remove_board(struct pci_func * func, u32 replace_flag, struct control /* Wait for SOBS to be unset */ wait_for_ctrl_irq (ctrl); - mutex_unlock(&ctrl->crit_sect); + up(&ctrl->crit_sect); if (!replace_flag && ctrl->add_support) { while (func) { @@ -1850,7 +1899,7 @@ static void interrupt_event_handler(struct controller *ctrl) dbg("button cancel\n"); del_timer(&p_slot->task_event); - mutex_lock(&ctrl->crit_sect); + down(&ctrl->crit_sect); if (p_slot->state == BLINKINGOFF_STATE) { /* slot is on */ @@ -1873,7 +1922,7 @@ static void interrupt_event_handler(struct controller *ctrl) /* Wait for SOBS to be unset */ wait_for_ctrl_irq (ctrl); - mutex_unlock(&ctrl->crit_sect); + up(&ctrl->crit_sect); } /*** button Released (No action on press...) */ else if (ctrl->event_queue[loop].event_type == INT_BUTTON_RELEASE) { @@ -1888,7 +1937,7 @@ static void interrupt_event_handler(struct controller *ctrl) p_slot->state = BLINKINGON_STATE; info(msg_button_on, p_slot->number); } - mutex_lock(&ctrl->crit_sect); + down(&ctrl->crit_sect); dbg("blink green LED and turn off amber\n"); @@ -1900,7 +1949,7 @@ static void interrupt_event_handler(struct controller *ctrl) /* Wait for SOBS to be unset */ wait_for_ctrl_irq (ctrl); - mutex_unlock(&ctrl->crit_sect); + up(&ctrl->crit_sect); init_timer(&p_slot->task_event); p_slot->hp_slot = hp_slot; p_slot->ctrl = ctrl; diff --git a/drivers/pci/hotplug/cpqphp_nvram.c b/drivers/pci/hotplug/cpqphp_nvram.c index cf0878917..ac98a11bd 100644 --- a/drivers/pci/hotplug/cpqphp_nvram.c +++ b/drivers/pci/hotplug/cpqphp_nvram.c @@ -26,6 +26,7 @@ * */ +#include #include #include #include diff --git a/drivers/pci/hotplug/cpqphp_pci.c b/drivers/pci/hotplug/cpqphp_pci.c index 0d9688952..00b81a7bd 100644 --- a/drivers/pci/hotplug/cpqphp_pci.c +++ b/drivers/pci/hotplug/cpqphp_pci.c @@ -26,6 +26,7 @@ * */ +#include #include #include #include diff --git a/drivers/pci/hotplug/cpqphp_sysfs.c b/drivers/pci/hotplug/cpqphp_sysfs.c index 5bab666cd..bbfeed767 100644 --- a/drivers/pci/hotplug/cpqphp_sysfs.c +++ b/drivers/pci/hotplug/cpqphp_sysfs.c @@ -26,6 +26,7 @@ * */ +#include #include #include #include @@ -140,7 +141,7 @@ struct ctrl_dbg { static int open(struct inode *inode, struct file *file) { - struct controller *ctrl = inode->i_private; + struct controller *ctrl = inode->u.generic_ip; struct ctrl_dbg *dbg; int retval = -ENOMEM; diff --git a/drivers/pci/hotplug/fakephp.c b/drivers/pci/hotplug/fakephp.c index dd2b76277..060d74775 100644 --- a/drivers/pci/hotplug/fakephp.c +++ b/drivers/pci/hotplug/fakephp.c @@ -32,6 +32,7 @@ * Enabling PCI devices is left as an exercise for the reader... * */ +#include #include #include #include @@ -94,13 +95,15 @@ static int add_slot(struct pci_dev *dev) struct hotplug_slot *slot; int retval = -ENOMEM; - slot = kzalloc(sizeof(struct hotplug_slot), GFP_KERNEL); + slot = kmalloc(sizeof(struct hotplug_slot), GFP_KERNEL); if (!slot) goto error; + memset(slot, 0, sizeof(*slot)); - slot->info = kzalloc(sizeof(struct hotplug_slot_info), GFP_KERNEL); + slot->info = kmalloc(sizeof(struct hotplug_slot_info), GFP_KERNEL); if (!slot->info) goto error_slot; + memset(slot->info, 0, sizeof(struct hotplug_slot_info)); slot->info->power_status = 1; slot->info->max_bus_speed = PCI_SPEED_UNKNOWN; @@ -224,10 +227,11 @@ static void pci_rescan_bus(const struct pci_bus *bus) { unsigned int devfn; struct pci_dev *dev; - dev = kzalloc(sizeof(struct pci_dev), GFP_KERNEL); + dev = kmalloc(sizeof(struct pci_dev), GFP_KERNEL); if (!dev) return; + memset(dev, 0, sizeof(dev)); dev->bus = (struct pci_bus*)bus; dev->sysdata = bus->sysdata; for (devfn = 0; devfn < 0x100; devfn += 8) { diff --git a/drivers/pci/hotplug/ibmphp.h b/drivers/pci/hotplug/ibmphp.h index dba6d8ca9..c22e0284d 100644 --- a/drivers/pci/hotplug/ibmphp.h +++ b/drivers/pci/hotplug/ibmphp.h @@ -406,6 +406,8 @@ extern void ibmphp_hpc_stop_poll_thread (void); //---------------------------------------------------------------------------- // HPC return codes //---------------------------------------------------------------------------- +#define FALSE 0x00 +#define TRUE 0x01 #define HPC_ERROR 0xFF //----------------------------------------------------------------------------- diff --git a/drivers/pci/hotplug/ibmphp_core.c b/drivers/pci/hotplug/ibmphp_core.c index 59392946c..dc59da675 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) { + if (hotplug_slot && value) { 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) { + if (hotplug_slot && value) { 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) { + if (hotplug_slot && value) { 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) { + if (hotplug_slot && value) { 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) { + if (hotplug_slot && value) { 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) { + if (hotplug_slot && value) { pslot = hotplug_slot->private; if (pslot) { rc = get_cur_bus_info(&pslot); @@ -1141,7 +1141,7 @@ static int enable_slot(struct hotplug_slot *hs) goto error_power; } - slot_cur->func = kzalloc(sizeof(struct pci_func), GFP_KERNEL); + slot_cur->func = kmalloc(sizeof(struct pci_func), GFP_KERNEL); if (!slot_cur->func) { /* We cannot do update_slot_info here, since no memory for * kmalloc n.e.ways, and update_slot_info allocates some */ @@ -1149,6 +1149,7 @@ static int enable_slot(struct hotplug_slot *hs) rc = -ENOMEM; goto error_power; } + memset(slot_cur->func, 0, sizeof(struct pci_func)); slot_cur->func->busno = slot_cur->bus; slot_cur->func->device = slot_cur->device; for (i = 0; i < 4; i++) @@ -1239,9 +1240,9 @@ int ibmphp_do_disable_slot(struct slot *slot_cur) } flag = slot_cur->flag; - slot_cur->flag = 1; + slot_cur->flag = TRUE; - if (flag == 1) { + if (flag == TRUE) { rc = validate(slot_cur, DISABLE); /* checking if powered off already & valid slot # */ if (rc) @@ -1251,12 +1252,13 @@ int ibmphp_do_disable_slot(struct slot *slot_cur) if (slot_cur->func == NULL) { /* We need this for fncs's that were there on bootup */ - slot_cur->func = kzalloc(sizeof(struct pci_func), GFP_KERNEL); + slot_cur->func = kmalloc(sizeof(struct pci_func), GFP_KERNEL); if (!slot_cur->func) { err("out of system memory\n"); rc = -ENOMEM; goto error; } + memset(slot_cur->func, 0, sizeof(struct pci_func)); slot_cur->func->busno = slot_cur->bus; slot_cur->func->device = slot_cur->device; } diff --git a/drivers/pci/hotplug/ibmphp_ebda.c b/drivers/pci/hotplug/ibmphp_ebda.c index 05e4f5a19..aea1187c7 100644 --- a/drivers/pci/hotplug/ibmphp_ebda.c +++ b/drivers/pci/hotplug/ibmphp_ebda.c @@ -72,7 +72,13 @@ static int ebda_rio_table (void); static struct ebda_hpc_list * __init alloc_ebda_hpc_list (void) { - return kzalloc(sizeof(struct ebda_hpc_list), GFP_KERNEL); + struct ebda_hpc_list *list; + + list = kmalloc (sizeof (struct ebda_hpc_list), GFP_KERNEL); + if (!list) + return NULL; + memset (list, 0, sizeof (*list)); + return list; } static struct controller *alloc_ebda_hpc (u32 slot_count, u32 bus_count) @@ -81,18 +87,21 @@ static struct controller *alloc_ebda_hpc (u32 slot_count, u32 bus_count) struct ebda_hpc_slot *slots; struct ebda_hpc_bus *buses; - controller = kzalloc(sizeof(struct controller), GFP_KERNEL); + controller = kmalloc (sizeof (struct controller), GFP_KERNEL); if (!controller) goto error; + memset (controller, 0, sizeof (*controller)); - slots = kcalloc(slot_count, sizeof(struct ebda_hpc_slot), GFP_KERNEL); + slots = kmalloc (sizeof (struct ebda_hpc_slot) * slot_count, GFP_KERNEL); if (!slots) goto error_contr; + memset (slots, 0, sizeof (*slots) * slot_count); controller->slots = slots; - buses = kcalloc(bus_count, sizeof(struct ebda_hpc_bus), GFP_KERNEL); + buses = kmalloc (sizeof (struct ebda_hpc_bus) * bus_count, GFP_KERNEL); if (!buses) goto error_slots; + memset (buses, 0, sizeof (*buses) * bus_count); controller->buses = buses; return controller; @@ -113,12 +122,24 @@ static void free_ebda_hpc (struct controller *controller) static struct ebda_rsrc_list * __init alloc_ebda_rsrc_list (void) { - return kzalloc(sizeof(struct ebda_rsrc_list), GFP_KERNEL); + struct ebda_rsrc_list *list; + + list = kmalloc (sizeof (struct ebda_rsrc_list), GFP_KERNEL); + if (!list) + return NULL; + memset (list, 0, sizeof (*list)); + return list; } static struct ebda_pci_rsrc *alloc_ebda_pci_rsrc (void) { - return kzalloc(sizeof(struct ebda_pci_rsrc), GFP_KERNEL); + struct ebda_pci_rsrc *resource; + + resource = kmalloc (sizeof (struct ebda_pci_rsrc), GFP_KERNEL); + if (!resource) + return NULL; + memset (resource, 0, sizeof (*resource)); + return resource; } static void __init print_bus_info (void) @@ -369,9 +390,10 @@ int __init ibmphp_access_ebda (void) debug ("now enter io table ---\n"); debug ("rio blk id: %x\n", blk_id); - rio_table_ptr = kzalloc(sizeof(struct rio_table_hdr), GFP_KERNEL); + rio_table_ptr = kmalloc (sizeof (struct rio_table_hdr), GFP_KERNEL); if (!rio_table_ptr) return -ENOMEM; + memset (rio_table_ptr, 0, sizeof (struct rio_table_hdr) ); rio_table_ptr->ver_num = readb (io_mem + offset); rio_table_ptr->scal_count = readb (io_mem + offset + 1); rio_table_ptr->riodev_count = readb (io_mem + offset + 2); @@ -423,9 +445,10 @@ static int __init ebda_rio_table (void) // we do concern about rio details for (i = 0; i < rio_table_ptr->riodev_count; i++) { - rio_detail_ptr = kzalloc(sizeof(struct rio_detail), GFP_KERNEL); + rio_detail_ptr = kmalloc (sizeof (struct rio_detail), GFP_KERNEL); if (!rio_detail_ptr) return -ENOMEM; + memset (rio_detail_ptr, 0, sizeof (struct rio_detail)); rio_detail_ptr->rio_node_id = readb (io_mem + offset); rio_detail_ptr->bbar = readl (io_mem + offset + 1); rio_detail_ptr->rio_type = readb (io_mem + offset + 5); @@ -480,9 +503,10 @@ static int __init combine_wpg_for_chassis (void) rio_detail_ptr = list_entry (list_head_ptr, struct rio_detail, rio_detail_list); opt_rio_ptr = search_opt_vg (rio_detail_ptr->chassis_num); if (!opt_rio_ptr) { - opt_rio_ptr = kzalloc(sizeof(struct opt_rio), GFP_KERNEL); + opt_rio_ptr = (struct opt_rio *) kmalloc (sizeof (struct opt_rio), GFP_KERNEL); if (!opt_rio_ptr) return -ENOMEM; + memset (opt_rio_ptr, 0, sizeof (struct opt_rio)); opt_rio_ptr->rio_type = rio_detail_ptr->rio_type; opt_rio_ptr->chassis_num = rio_detail_ptr->chassis_num; opt_rio_ptr->first_slot_num = rio_detail_ptr->first_slot_num; @@ -522,9 +546,10 @@ static int combine_wpg_for_expansion (void) rio_detail_ptr = list_entry (list_head_ptr, struct rio_detail, rio_detail_list); opt_rio_lo_ptr = search_opt_lo (rio_detail_ptr->chassis_num); if (!opt_rio_lo_ptr) { - opt_rio_lo_ptr = kzalloc(sizeof(struct opt_rio_lo), GFP_KERNEL); + opt_rio_lo_ptr = (struct opt_rio_lo *) kmalloc (sizeof (struct opt_rio_lo), GFP_KERNEL); if (!opt_rio_lo_ptr) return -ENOMEM; + memset (opt_rio_lo_ptr, 0, sizeof (struct opt_rio_lo)); opt_rio_lo_ptr->rio_type = rio_detail_ptr->rio_type; opt_rio_lo_ptr->chassis_num = rio_detail_ptr->chassis_num; opt_rio_lo_ptr->first_slot_num = rio_detail_ptr->first_slot_num; @@ -817,11 +842,12 @@ static int __init ebda_rsrc_controller (void) bus_info_ptr2 = ibmphp_find_same_bus_num (slot_ptr->slot_bus_num); if (!bus_info_ptr2) { - bus_info_ptr1 = kzalloc(sizeof(struct bus_info), GFP_KERNEL); + bus_info_ptr1 = (struct bus_info *) kmalloc (sizeof (struct bus_info), GFP_KERNEL); if (!bus_info_ptr1) { rc = -ENOMEM; goto error_no_hp_slot; } + memset (bus_info_ptr1, 0, sizeof (struct bus_info)); bus_info_ptr1->slot_min = slot_ptr->slot_num; bus_info_ptr1->slot_max = slot_ptr->slot_num; bus_info_ptr1->slot_count += 1; @@ -920,17 +946,19 @@ static int __init ebda_rsrc_controller (void) // register slots with hpc core as well as create linked list of ibm slot for (index = 0; index < hpc_ptr->slot_count; index++) { - hp_slot_ptr = kzalloc(sizeof(*hp_slot_ptr), GFP_KERNEL); + hp_slot_ptr = kmalloc(sizeof(*hp_slot_ptr), GFP_KERNEL); if (!hp_slot_ptr) { rc = -ENOMEM; goto error_no_hp_slot; } + memset(hp_slot_ptr, 0, sizeof(*hp_slot_ptr)); - hp_slot_ptr->info = kzalloc(sizeof(struct hotplug_slot_info), GFP_KERNEL); + hp_slot_ptr->info = kmalloc (sizeof(struct hotplug_slot_info), GFP_KERNEL); if (!hp_slot_ptr->info) { rc = -ENOMEM; goto error_no_hp_info; } + memset(hp_slot_ptr->info, 0, sizeof(struct hotplug_slot_info)); hp_slot_ptr->name = kmalloc(30, GFP_KERNEL); if (!hp_slot_ptr->name) { @@ -938,13 +966,14 @@ static int __init ebda_rsrc_controller (void) goto error_no_hp_name; } - tmp_slot = kzalloc(sizeof(*tmp_slot), GFP_KERNEL); + tmp_slot = kmalloc(sizeof(*tmp_slot), GFP_KERNEL); if (!tmp_slot) { rc = -ENOMEM; goto error_no_slot; } + memset(tmp_slot, 0, sizeof(*tmp_slot)); - tmp_slot->flag = 1; + tmp_slot->flag = TRUE; tmp_slot->capabilities = hpc_ptr->slots[index].slot_cap; if ((hpc_ptr->slots[index].slot_cap & EBDA_SLOT_133_MAX) == EBDA_SLOT_133_MAX) diff --git a/drivers/pci/hotplug/ibmphp_hpc.c b/drivers/pci/hotplug/ibmphp_hpc.c index c3ac98a0a..1a3eb8d3d 100644 --- a/drivers/pci/hotplug/ibmphp_hpc.c +++ b/drivers/pci/hotplug/ibmphp_hpc.c @@ -34,11 +34,9 @@ #include #include #include -#include - #include "ibmphp.h" -static int to_debug = 0; +static int to_debug = FALSE; #define debug_polling(fmt, arg...) do { if (to_debug) debug (fmt, arg); } while (0) //---------------------------------------------------------------------------- @@ -95,15 +93,15 @@ static int to_debug = 0; //---------------------------------------------------------------------------- // macro utilities //---------------------------------------------------------------------------- -// if bits 20,22,25,26,27,29,30 are OFF return 1 -#define HPC_I2CSTATUS_CHECK(s) ((u8)((s & 0x00000A76) ? 0 : 1)) +// if bits 20,22,25,26,27,29,30 are OFF return TRUE +#define HPC_I2CSTATUS_CHECK(s) ((u8)((s & 0x00000A76) ? FALSE : TRUE)) //---------------------------------------------------------------------------- // global variables //---------------------------------------------------------------------------- static int ibmphp_shutdown; static int tid_poll; -static struct mutex sem_hpcaccess; // lock access to HPC +static struct semaphore sem_hpcaccess; // lock access to HPC static struct semaphore semOperations; // lock all operations and // access to data structures static struct semaphore sem_exit; // make sure polling thread goes away @@ -133,11 +131,11 @@ void __init ibmphp_hpc_initvars (void) { debug ("%s - Entry\n", __FUNCTION__); - mutex_init(&sem_hpcaccess); + init_MUTEX (&sem_hpcaccess); init_MUTEX (&semOperations); init_MUTEX_LOCKED (&sem_exit); - to_debug = 0; - ibmphp_shutdown = 0; + to_debug = FALSE; + ibmphp_shutdown = FALSE; tid_poll = 0; debug ("%s - Exit\n", __FUNCTION__); @@ -739,21 +737,21 @@ int ibmphp_hpc_writeslot (struct slot * pslot, u8 cmd) // check controller is still not working on the command //-------------------------------------------------------------------- timeout = CMD_COMPLETE_TOUT_SEC; - done = 0; + done = FALSE; while (!done) { rc = hpc_wait_ctlr_notworking (HPC_CTLR_WORKING_TOUT, ctlr_ptr, wpg_bbar, &status); if (!rc) { if (NEEDTOCHECK_CMDSTATUS (cmd)) { if (CTLR_FINISHED (status) == HPC_CTLR_FINISHED_YES) - done = 1; + done = TRUE; } else - done = 1; + done = TRUE; } if (!done) { msleep(1000); if (timeout < 1) { - done = 1; + done = TRUE; err ("%s - Error command complete timeout\n", __FUNCTION__); rc = -EFAULT; } else @@ -780,7 +778,7 @@ int ibmphp_hpc_writeslot (struct slot * pslot, u8 cmd) *---------------------------------------------------------------------*/ static void get_hpc_access (void) { - mutex_lock(&sem_hpcaccess); + down (&sem_hpcaccess); } /*---------------------------------------------------------------------- @@ -788,7 +786,7 @@ static void get_hpc_access (void) *---------------------------------------------------------------------*/ void free_hpc_access (void) { - mutex_unlock(&sem_hpcaccess); + up (&sem_hpcaccess); } /*---------------------------------------------------------------------- @@ -799,7 +797,7 @@ void free_hpc_access (void) void ibmphp_lock_operations (void) { down (&semOperations); - to_debug = 1; + to_debug = TRUE; } /*---------------------------------------------------------------------- @@ -809,7 +807,7 @@ void ibmphp_unlock_operations (void) { debug ("%s - Entry\n", __FUNCTION__); up (&semOperations); - to_debug = 0; + to_debug = FALSE; debug ("%s - Exit\n", __FUNCTION__); } @@ -937,40 +935,40 @@ static int process_changeinstatus (struct slot *pslot, struct slot *poldslot) { u8 status; int rc = 0; - u8 disable = 0; - u8 update = 0; + u8 disable = FALSE; + u8 update = FALSE; debug ("process_changeinstatus - Entry pslot[%p], poldslot[%p]\n", pslot, poldslot); // bit 0 - HPC_SLOT_POWER if ((pslot->status & 0x01) != (poldslot->status & 0x01)) - update = 1; + update = TRUE; // bit 1 - HPC_SLOT_CONNECT // ignore // bit 2 - HPC_SLOT_ATTN if ((pslot->status & 0x04) != (poldslot->status & 0x04)) - update = 1; + update = TRUE; // bit 3 - HPC_SLOT_PRSNT2 // bit 4 - HPC_SLOT_PRSNT1 if (((pslot->status & 0x08) != (poldslot->status & 0x08)) || ((pslot->status & 0x10) != (poldslot->status & 0x10))) - update = 1; + update = TRUE; // bit 5 - HPC_SLOT_PWRGD if ((pslot->status & 0x20) != (poldslot->status & 0x20)) // OFF -> ON: ignore, ON -> OFF: disable slot if ((poldslot->status & 0x20) && (SLOT_CONNECT (poldslot->status) == HPC_SLOT_CONNECTED) && (SLOT_PRESENT (poldslot->status))) - disable = 1; + disable = TRUE; // bit 6 - HPC_SLOT_BUS_SPEED // ignore // bit 7 - HPC_SLOT_LATCH if ((pslot->status & 0x80) != (poldslot->status & 0x80)) { - update = 1; + update = TRUE; // OPEN -> CLOSE if (pslot->status & 0x80) { if (SLOT_PWRGD (pslot->status)) { @@ -979,7 +977,7 @@ static int process_changeinstatus (struct slot *pslot, struct slot *poldslot) msleep(1000); rc = ibmphp_hpc_readslot (pslot, READ_SLOTSTATUS, &status); if (SLOT_PWRGD (status)) - update = 1; + update = TRUE; else // overwrite power in pslot to OFF pslot->status &= ~HPC_SLOT_POWER; } @@ -987,17 +985,17 @@ static int process_changeinstatus (struct slot *pslot, struct slot *poldslot) // CLOSE -> OPEN else if ((SLOT_PWRGD (poldslot->status) == HPC_SLOT_PWRGD_GOOD) && (SLOT_CONNECT (poldslot->status) == HPC_SLOT_CONNECTED) && (SLOT_PRESENT (poldslot->status))) { - disable = 1; + disable = TRUE; } // else - ignore } // bit 4 - HPC_SLOT_BLINK_ATTN if ((pslot->ext_status & 0x08) != (poldslot->ext_status & 0x08)) - update = 1; + update = TRUE; if (disable) { debug ("process_changeinstatus - disable slot\n"); - pslot->flag = 0; + pslot->flag = FALSE; rc = ibmphp_do_disable_slot (pslot); } @@ -1102,7 +1100,7 @@ void __exit ibmphp_hpc_stop_poll_thread (void) { debug ("%s - Entry\n", __FUNCTION__); - ibmphp_shutdown = 1; + ibmphp_shutdown = TRUE; debug ("before locking operations \n"); ibmphp_lock_operations (); debug ("after locking operations \n"); @@ -1136,7 +1134,7 @@ static int hpc_wait_ctlr_notworking (int timeout, struct controller *ctlr_ptr, v u8 * pstatus) { int rc = 0; - u8 done = 0; + u8 done = FALSE; debug_polling ("hpc_wait_ctlr_notworking - Entry timeout[%d]\n", timeout); @@ -1144,14 +1142,14 @@ static int hpc_wait_ctlr_notworking (int timeout, struct controller *ctlr_ptr, v *pstatus = ctrl_read (ctlr_ptr, wpg_bbar, WPG_CTLR_INDEX); if (*pstatus == HPC_ERROR) { rc = HPC_ERROR; - done = 1; + done = TRUE; } if (CTLR_WORKING (*pstatus) == HPC_CTLR_WORKING_NO) - done = 1; + done = TRUE; if (!done) { msleep(1000); if (timeout < 1) { - done = 1; + done = TRUE; err ("HPCreadslot - Error ctlr timeout\n"); rc = HPC_ERROR; } else diff --git a/drivers/pci/hotplug/ibmphp_pci.c b/drivers/pci/hotplug/ibmphp_pci.c index d87a9e3ea..155133fe5 100644 --- a/drivers/pci/hotplug/ibmphp_pci.c +++ b/drivers/pci/hotplug/ibmphp_pci.c @@ -164,11 +164,12 @@ int ibmphp_configure_card (struct pci_func *func, u8 slotno) cleanup_count = 6; goto error; } - newfunc = kzalloc(sizeof(*newfunc), GFP_KERNEL); + newfunc = kmalloc(sizeof(*newfunc), GFP_KERNEL); if (!newfunc) { err ("out of system memory\n"); return -ENOMEM; } + memset (newfunc, 0, sizeof (struct pci_func)); newfunc->busno = cur_func->busno; newfunc->device = device; cur_func->next = newfunc; @@ -199,14 +200,15 @@ int ibmphp_configure_card (struct pci_func *func, u8 slotno) } pci_bus_read_config_byte (ibmphp_pci_bus, devfn, PCI_SECONDARY_BUS, &sec_number); - flag = 0; + flag = FALSE; for (i = 0; i < 32; i++) { if (func->devices[i]) { - newfunc = kzalloc(sizeof(*newfunc), GFP_KERNEL); + newfunc = kmalloc(sizeof(*newfunc), GFP_KERNEL); if (!newfunc) { err ("out of system memory\n"); return -ENOMEM; } + memset (newfunc, 0, sizeof (struct pci_func)); newfunc->busno = sec_number; newfunc->device = (u8) i; for (j = 0; j < 4; j++) @@ -226,15 +228,16 @@ int ibmphp_configure_card (struct pci_func *func, u8 slotno) cleanup_count = 2; goto error; } - flag = 1; + flag = TRUE; } } - newfunc = kzalloc(sizeof(*newfunc), GFP_KERNEL); + newfunc = kmalloc(sizeof(*newfunc), GFP_KERNEL); if (!newfunc) { err ("out of system memory\n"); return -ENOMEM; } + memset (newfunc, 0, sizeof (struct pci_func)); newfunc->busno = cur_func->busno; newfunc->device = device; for (j = 0; j < 4; j++) @@ -272,15 +275,16 @@ int ibmphp_configure_card (struct pci_func *func, u8 slotno) cur_func->busno, device, function); pci_bus_read_config_byte (ibmphp_pci_bus, devfn, PCI_SECONDARY_BUS, &sec_number); debug ("after configuring bridge..., sec_number = %x\n", sec_number); - flag = 0; + flag = FALSE; for (i = 0; i < 32; i++) { if (func->devices[i]) { debug ("inside for loop, device is %x\n", i); - newfunc = kzalloc(sizeof(*newfunc), GFP_KERNEL); + newfunc = kmalloc(sizeof(*newfunc), GFP_KERNEL); if (!newfunc) { err (" out of system memory\n"); return -ENOMEM; } + memset (newfunc, 0, sizeof (struct pci_func)); newfunc->busno = sec_number; newfunc->device = (u8) i; for (j = 0; j < 4; j++) @@ -301,7 +305,7 @@ int ibmphp_configure_card (struct pci_func *func, u8 slotno) cleanup_count = 2; goto error; } - flag = 1; + flag = TRUE; } } @@ -401,12 +405,13 @@ static int configure_device (struct pci_func *func) debug ("len[count] in IO %x, count %d\n", len[count], count); - io[count] = kzalloc(sizeof(struct resource_node), GFP_KERNEL); + io[count] = kmalloc (sizeof (struct resource_node), GFP_KERNEL); if (!io[count]) { err ("out of system memory\n"); return -ENOMEM; } + memset (io[count], 0, sizeof (struct resource_node)); io[count]->type = IO; io[count]->busno = func->busno; io[count]->devfunc = PCI_DEVFN(func->device, func->function); @@ -439,27 +444,29 @@ static int configure_device (struct pci_func *func) debug ("len[count] in PFMEM %x, count %d\n", len[count], count); - pfmem[count] = kzalloc(sizeof(struct resource_node), GFP_KERNEL); + pfmem[count] = kmalloc (sizeof (struct resource_node), GFP_KERNEL); if (!pfmem[count]) { err ("out of system memory\n"); return -ENOMEM; } + memset (pfmem[count], 0, sizeof (struct resource_node)); pfmem[count]->type = PFMEM; pfmem[count]->busno = func->busno; pfmem[count]->devfunc = PCI_DEVFN(func->device, func->function); pfmem[count]->len = len[count]; - pfmem[count]->fromMem = 0; + pfmem[count]->fromMem = FALSE; if (ibmphp_check_resource (pfmem[count], 0) == 0) { ibmphp_add_resource (pfmem[count]); func->pfmem[count] = pfmem[count]; } else { - mem_tmp = kzalloc(sizeof(*mem_tmp), GFP_KERNEL); + mem_tmp = kmalloc(sizeof(*mem_tmp), GFP_KERNEL); if (!mem_tmp) { err ("out of system memory\n"); kfree (pfmem[count]); return -ENOMEM; } + memset (mem_tmp, 0, sizeof (struct resource_node)); mem_tmp->type = MEM; mem_tmp->busno = pfmem[count]->busno; mem_tmp->devfunc = pfmem[count]->devfunc; @@ -467,7 +474,7 @@ static int configure_device (struct pci_func *func) debug ("there's no pfmem... going into mem.\n"); if (ibmphp_check_resource (mem_tmp, 0) == 0) { ibmphp_add_resource (mem_tmp); - pfmem[count]->fromMem = 1; + pfmem[count]->fromMem = TRUE; pfmem[count]->rangeno = mem_tmp->rangeno; pfmem[count]->start = mem_tmp->start; pfmem[count]->end = mem_tmp->end; @@ -505,11 +512,12 @@ static int configure_device (struct pci_func *func) debug ("len[count] in Mem %x, count %d\n", len[count], count); - mem[count] = kzalloc(sizeof(struct resource_node), GFP_KERNEL); + mem[count] = kmalloc (sizeof (struct resource_node), GFP_KERNEL); if (!mem[count]) { err ("out of system memory\n"); return -ENOMEM; } + memset (mem[count], 0, sizeof (struct resource_node)); mem[count]->type = MEM; mem[count]->busno = func->busno; mem[count]->devfunc = PCI_DEVFN(func->device, @@ -571,11 +579,11 @@ static int configure_bridge (struct pci_func **func_passed, u8 slotno) u16 pfmem_base; u32 bar[2]; u32 len[2]; - u8 flag_io = 0; - u8 flag_mem = 0; - u8 flag_pfmem = 0; - u8 need_io_upper = 0; - u8 need_pfmem_upper = 0; + u8 flag_io = FALSE; + u8 flag_mem = FALSE; + u8 flag_pfmem = FALSE; + u8 need_io_upper = FALSE; + u8 need_pfmem_upper = FALSE; struct res_needed *amount_needed = NULL; struct resource_node *io = NULL; struct resource_node *bus_io[2] = {NULL, NULL}; @@ -669,13 +677,14 @@ static int configure_bridge (struct pci_func **func_passed, u8 slotno) debug ("len[count] in IO = %x\n", len[count]); - bus_io[count] = kzalloc(sizeof(struct resource_node), GFP_KERNEL); + bus_io[count] = kmalloc (sizeof (struct resource_node), GFP_KERNEL); if (!bus_io[count]) { err ("out of system memory\n"); retval = -ENOMEM; goto error; } + memset (bus_io[count], 0, sizeof (struct resource_node)); bus_io[count]->type = IO; bus_io[count]->busno = func->busno; bus_io[count]->devfunc = PCI_DEVFN(func->device, @@ -702,35 +711,37 @@ static int configure_bridge (struct pci_func **func_passed, u8 slotno) debug ("len[count] in PFMEM = %x\n", len[count]); - bus_pfmem[count] = kzalloc(sizeof(struct resource_node), GFP_KERNEL); + bus_pfmem[count] = kmalloc (sizeof (struct resource_node), GFP_KERNEL); if (!bus_pfmem[count]) { err ("out of system memory\n"); retval = -ENOMEM; goto error; } + memset (bus_pfmem[count], 0, sizeof (struct resource_node)); bus_pfmem[count]->type = PFMEM; bus_pfmem[count]->busno = func->busno; bus_pfmem[count]->devfunc = PCI_DEVFN(func->device, func->function); bus_pfmem[count]->len = len[count]; - bus_pfmem[count]->fromMem = 0; + bus_pfmem[count]->fromMem = FALSE; if (ibmphp_check_resource (bus_pfmem[count], 0) == 0) { ibmphp_add_resource (bus_pfmem[count]); func->pfmem[count] = bus_pfmem[count]; } else { - mem_tmp = kzalloc(sizeof(*mem_tmp), GFP_KERNEL); + mem_tmp = kmalloc(sizeof(*mem_tmp), GFP_KERNEL); if (!mem_tmp) { err ("out of system memory\n"); retval = -ENOMEM; goto error; } + memset (mem_tmp, 0, sizeof (struct resource_node)); mem_tmp->type = MEM; mem_tmp->busno = bus_pfmem[count]->busno; mem_tmp->devfunc = bus_pfmem[count]->devfunc; mem_tmp->len = bus_pfmem[count]->len; if (ibmphp_check_resource (mem_tmp, 0) == 0) { ibmphp_add_resource (mem_tmp); - bus_pfmem[count]->fromMem = 1; + bus_pfmem[count]->fromMem = TRUE; bus_pfmem[count]->rangeno = mem_tmp->rangeno; ibmphp_add_pfmem_from_mem (bus_pfmem[count]); func->pfmem[count] = bus_pfmem[count]; @@ -759,12 +770,13 @@ static int configure_bridge (struct pci_func **func_passed, u8 slotno) debug ("len[count] in Memory is %x\n", len[count]); - bus_mem[count] = kzalloc(sizeof(struct resource_node), GFP_KERNEL); + bus_mem[count] = kmalloc (sizeof (struct resource_node), GFP_KERNEL); if (!bus_mem[count]) { err ("out of system memory\n"); retval = -ENOMEM; goto error; } + memset (bus_mem[count], 0, sizeof (struct resource_node)); bus_mem[count]->type = MEM; bus_mem[count]->busno = func->busno; bus_mem[count]->devfunc = PCI_DEVFN(func->device, @@ -826,16 +838,17 @@ static int configure_bridge (struct pci_func **func_passed, u8 slotno) if (!amount_needed->io) { debug ("it doesn't want IO?\n"); - flag_io = 1; + flag_io = TRUE; } else { debug ("it wants %x IO behind the bridge\n", amount_needed->io); - io = kzalloc(sizeof(*io), GFP_KERNEL); + io = kmalloc(sizeof(*io), GFP_KERNEL); if (!io) { err ("out of system memory\n"); retval = -ENOMEM; goto error; } + memset (io, 0, sizeof (struct resource_node)); io->type = IO; io->busno = func->busno; io->devfunc = PCI_DEVFN(func->device, func->function); @@ -843,68 +856,71 @@ static int configure_bridge (struct pci_func **func_passed, u8 slotno) if (ibmphp_check_resource (io, 1) == 0) { debug ("were we able to add io\n"); ibmphp_add_resource (io); - flag_io = 1; + flag_io = TRUE; } } if (!amount_needed->mem) { debug ("it doesn't want n.e.memory?\n"); - flag_mem = 1; + flag_mem = TRUE; } else { debug ("it wants %x memory behind the bridge\n", amount_needed->mem); - mem = kzalloc(sizeof(*mem), GFP_KERNEL); + mem = kmalloc(sizeof(*mem), GFP_KERNEL); if (!mem) { err ("out of system memory\n"); retval = -ENOMEM; goto error; } + memset (mem, 0, sizeof (struct resource_node)); mem->type = MEM; mem->busno = func->busno; mem->devfunc = PCI_DEVFN(func->device, func->function); mem->len = amount_needed->mem; if (ibmphp_check_resource (mem, 1) == 0) { ibmphp_add_resource (mem); - flag_mem = 1; + flag_mem = TRUE; debug ("were we able to add mem\n"); } } if (!amount_needed->pfmem) { debug ("it doesn't want n.e.pfmem mem?\n"); - flag_pfmem = 1; + flag_pfmem = TRUE; } else { debug ("it wants %x pfmemory behind the bridge\n", amount_needed->pfmem); - pfmem = kzalloc(sizeof(*pfmem), GFP_KERNEL); + pfmem = kmalloc(sizeof(*pfmem), GFP_KERNEL); if (!pfmem) { err ("out of system memory\n"); retval = -ENOMEM; goto error; } + memset (pfmem, 0, sizeof (struct resource_node)); pfmem->type = PFMEM; pfmem->busno = func->busno; pfmem->devfunc = PCI_DEVFN(func->device, func->function); pfmem->len = amount_needed->pfmem; - pfmem->fromMem = 0; + pfmem->fromMem = FALSE; if (ibmphp_check_resource (pfmem, 1) == 0) { ibmphp_add_resource (pfmem); - flag_pfmem = 1; + flag_pfmem = TRUE; } else { - mem_tmp = kzalloc(sizeof(*mem_tmp), GFP_KERNEL); + mem_tmp = kmalloc(sizeof(*mem_tmp), GFP_KERNEL); if (!mem_tmp) { err ("out of system memory\n"); retval = -ENOMEM; goto error; } + memset (mem_tmp, 0, sizeof (struct resource_node)); mem_tmp->type = MEM; mem_tmp->busno = pfmem->busno; mem_tmp->devfunc = pfmem->devfunc; mem_tmp->len = pfmem->len; if (ibmphp_check_resource (mem_tmp, 1) == 0) { ibmphp_add_resource (mem_tmp); - pfmem->fromMem = 1; + pfmem->fromMem = TRUE; pfmem->rangeno = mem_tmp->rangeno; ibmphp_add_pfmem_from_mem (pfmem); - flag_pfmem = 1; + flag_pfmem = TRUE; } } } @@ -920,12 +936,13 @@ static int configure_bridge (struct pci_func **func_passed, u8 slotno) */ bus = ibmphp_find_res_bus (sec_number); if (!bus) { - bus = kzalloc(sizeof(*bus), GFP_KERNEL); + bus = kmalloc(sizeof(*bus), GFP_KERNEL); if (!bus) { err ("out of system memory\n"); retval = -ENOMEM; goto error; } + memset (bus, 0, sizeof (struct bus_node)); bus->busno = sec_number; debug ("b4 adding new bus\n"); rc = add_new_bus (bus, io, mem, pfmem, func->busno); @@ -950,11 +967,11 @@ static int configure_bridge (struct pci_func **func_passed, u8 slotno) if ((io_base & PCI_IO_RANGE_TYPE_MASK) == PCI_IO_RANGE_TYPE_32) { debug ("io 32\n"); - need_io_upper = 1; + need_io_upper = TRUE; } if ((pfmem_base & PCI_PREF_RANGE_TYPE_MASK) == PCI_PREF_RANGE_TYPE_64) { debug ("pfmem 64\n"); - need_pfmem_upper = 1; + need_pfmem_upper = TRUE; } if (bus->noIORanges) { @@ -1094,9 +1111,10 @@ static struct res_needed *scan_behind_bridge (struct pci_func * func, u8 busno) }; struct res_needed *amount; - amount = kzalloc(sizeof(*amount), GFP_KERNEL); + amount = kmalloc(sizeof(*amount), GFP_KERNEL); if (amount == NULL) return NULL; + memset (amount, 0, sizeof (struct res_needed)); ibmphp_pci_bus->number = busno; @@ -1119,7 +1137,7 @@ static struct res_needed *scan_behind_bridge (struct pci_func * func, u8 busno) debug ("hdr_type behind the bridge is %x\n", hdr_type); if (hdr_type & PCI_HEADER_TYPE_BRIDGE) { err ("embedded bridges not supported for hot-plugging.\n"); - amount->not_correct = 1; + amount->not_correct = TRUE; return amount; } @@ -1127,12 +1145,12 @@ static struct res_needed *scan_behind_bridge (struct pci_func * func, u8 busno) if (class == PCI_CLASS_NOT_DEFINED_VGA) { err ("The device %x is VGA compatible and as is not supported for hot plugging. " "Please choose another device.\n", device); - amount->not_correct = 1; + amount->not_correct = TRUE; return amount; } else if (class == PCI_CLASS_DISPLAY_VGA) { err ("The device %x is not supported for hot plugging. " "Please choose another device.\n", device); - amount->not_correct = 1; + amount->not_correct = TRUE; return amount; } @@ -1192,9 +1210,9 @@ static struct res_needed *scan_behind_bridge (struct pci_func * func, u8 busno) } /* end for */ if (!howmany) - amount->not_correct = 1; + amount->not_correct = TRUE; else - amount->not_correct = 0; + amount->not_correct = FALSE; if ((amount->io) && (amount->io < IOBRIDGE)) amount->io = IOBRIDGE; if ((amount->mem) && (amount->mem < MEMBRIDGE)) @@ -1654,11 +1672,12 @@ static int add_new_bus (struct bus_node *bus, struct resource_node *io, struct r list_add (&bus->bus_list, &cur_bus->bus_list); } if (io) { - io_range = kzalloc(sizeof(*io_range), GFP_KERNEL); + io_range = kmalloc(sizeof(*io_range), GFP_KERNEL); if (!io_range) { err ("out of system memory\n"); return -ENOMEM; } + memset (io_range, 0, sizeof (struct range_node)); io_range->start = io->start; io_range->end = io->end; io_range->rangeno = 1; @@ -1666,11 +1685,12 @@ static int add_new_bus (struct bus_node *bus, struct resource_node *io, struct r bus->rangeIO = io_range; } if (mem) { - mem_range = kzalloc(sizeof(*mem_range), GFP_KERNEL); + mem_range = kmalloc(sizeof(*mem_range), GFP_KERNEL); if (!mem_range) { err ("out of system memory\n"); return -ENOMEM; } + memset (mem_range, 0, sizeof (struct range_node)); mem_range->start = mem->start; mem_range->end = mem->end; mem_range->rangeno = 1; @@ -1678,11 +1698,12 @@ static int add_new_bus (struct bus_node *bus, struct resource_node *io, struct r bus->rangeMem = mem_range; } if (pfmem) { - pfmem_range = kzalloc(sizeof(*pfmem_range), GFP_KERNEL); + pfmem_range = kmalloc(sizeof(*pfmem_range), GFP_KERNEL); if (!pfmem_range) { err ("out of system memory\n"); return -ENOMEM; } + memset (pfmem_range, 0, sizeof (struct range_node)); pfmem_range->start = pfmem->start; pfmem_range->end = pfmem->end; pfmem_range->rangeno = 1; diff --git a/drivers/pci/hotplug/ibmphp_res.c b/drivers/pci/hotplug/ibmphp_res.c index 5636b1ac2..9c224c94d 100644 --- a/drivers/pci/hotplug/ibmphp_res.c +++ b/drivers/pci/hotplug/ibmphp_res.c @@ -55,12 +55,13 @@ static struct bus_node * __init alloc_error_bus (struct ebda_pci_rsrc * curr, u8 return NULL; } - newbus = kzalloc(sizeof(struct bus_node), GFP_KERNEL); + newbus = kmalloc (sizeof (struct bus_node), GFP_KERNEL); if (!newbus) { err ("out of system memory\n"); return NULL; } + memset (newbus, 0, sizeof (struct bus_node)); if (flag) newbus->busno = busno; else @@ -78,11 +79,12 @@ static struct resource_node * __init alloc_resources (struct ebda_pci_rsrc * cur return NULL; } - rs = kzalloc(sizeof(struct resource_node), GFP_KERNEL); + rs = kmalloc (sizeof (struct resource_node), GFP_KERNEL); if (!rs) { err ("out of system memory\n"); return NULL; } + memset (rs, 0, sizeof (struct resource_node)); rs->busno = curr->bus_num; rs->devfunc = curr->dev_fun; rs->start = curr->start_addr; @@ -98,11 +100,12 @@ static int __init alloc_bus_range (struct bus_node **new_bus, struct range_node u8 num_ranges = 0; if (first_bus) { - newbus = kzalloc(sizeof(struct bus_node), GFP_KERNEL); + newbus = kmalloc (sizeof (struct bus_node), GFP_KERNEL); if (!newbus) { err ("out of system memory.\n"); return -ENOMEM; } + memset (newbus, 0, sizeof (struct bus_node)); newbus->busno = curr->bus_num; } else { newbus = *new_bus; @@ -119,13 +122,14 @@ static int __init alloc_bus_range (struct bus_node **new_bus, struct range_node } } - newrange = kzalloc(sizeof(struct range_node), GFP_KERNEL); + newrange = kmalloc (sizeof (struct range_node), GFP_KERNEL); if (!newrange) { if (first_bus) kfree (newbus); err ("out of system memory\n"); return -ENOMEM; } + memset (newrange, 0, sizeof (struct range_node)); newrange->start = curr->start_addr; newrange->end = curr->end_addr; @@ -325,7 +329,7 @@ int __init ibmphp_rsrc_init (void) if (!new_pfmem) return -ENOMEM; new_pfmem->type = PFMEM; - new_pfmem->fromMem = 0; + new_pfmem->fromMem = FALSE; if (ibmphp_add_resource (new_pfmem) < 0) { newbus = alloc_error_bus (curr, 0, 0); if (!newbus) @@ -462,7 +466,7 @@ static int add_range (int type, struct range_node *range, struct bus_node *bus_c static void update_resources (struct bus_node *bus_cur, int type, int rangeno) { struct resource_node *res = NULL; - u8 eol = 0; /* end of list indicator */ + u8 eol = FALSE; /* end of list indicator */ switch (type) { case MEM: @@ -488,7 +492,7 @@ static void update_resources (struct bus_node *bus_cur, int type, int rangeno) else if (res->nextRange) res = res->nextRange; else { - eol = 1; + eol = TRUE; break; } } @@ -979,7 +983,7 @@ int ibmphp_check_resource (struct resource_node *res, u8 bridge) int noranges = 0; u32 tmp_start; /* this is to make sure start address is divisible by the length needed */ u32 tmp_divide; - u8 flag = 0; + u8 flag = FALSE; if (!res) return -EINVAL; @@ -1046,17 +1050,17 @@ int ibmphp_check_resource (struct resource_node *res, u8 bridge) if ((range->start % tmp_divide) == 0) { /* just perfect, starting address is divisible by length */ - flag = 1; + flag = TRUE; len_cur = len_tmp; start_cur = range->start; } else { /* Needs adjusting */ tmp_start = range->start; - flag = 0; + flag = FALSE; while ((len_tmp = res_cur->start - 1 - tmp_start) >= res->len) { if ((tmp_start % tmp_divide) == 0) { - flag = 1; + flag = TRUE; len_cur = len_tmp; start_cur = tmp_start; break; @@ -1085,17 +1089,17 @@ int ibmphp_check_resource (struct resource_node *res, u8 bridge) if (((res_cur->end + 1) % tmp_divide) == 0) { /* just perfect, starting address is divisible by length */ - flag = 1; + flag = TRUE; len_cur = len_tmp; start_cur = res_cur->end + 1; } else { /* Needs adjusting */ tmp_start = res_cur->end + 1; - flag = 0; + flag = FALSE; while ((len_tmp = range->end - tmp_start) >= res->len) { if ((tmp_start % tmp_divide) == 0) { - flag = 1; + flag = TRUE; len_cur = len_tmp; start_cur = tmp_start; break; @@ -1123,17 +1127,17 @@ int ibmphp_check_resource (struct resource_node *res, u8 bridge) if ((len_tmp < len_cur) || (len_cur == 0)) { if ((range->start % tmp_divide) == 0) { /* just perfect, starting address is divisible by length */ - flag = 1; + flag = TRUE; len_cur = len_tmp; start_cur = range->start; } else { /* Needs adjusting */ tmp_start = range->start; - flag = 0; + flag = FALSE; while ((len_tmp = res_cur->start - 1 - tmp_start) >= res->len) { if ((tmp_start % tmp_divide) == 0) { - flag = 1; + flag = TRUE; len_cur = len_tmp; start_cur = tmp_start; break; @@ -1158,17 +1162,17 @@ int ibmphp_check_resource (struct resource_node *res, u8 bridge) if ((len_tmp < len_cur) || (len_cur == 0)) { if (((res_prev->end + 1) % tmp_divide) == 0) { /* just perfect, starting address's divisible by length */ - flag = 1; + flag = TRUE; len_cur = len_tmp; start_cur = res_prev->end + 1; } else { /* Needs adjusting */ tmp_start = res_prev->end + 1; - flag = 0; + flag = FALSE; while ((len_tmp = res_cur->start - 1 - tmp_start) >= res->len) { if ((tmp_start % tmp_divide) == 0) { - flag = 1; + flag = TRUE; len_cur = len_tmp; start_cur = tmp_start; break; @@ -1217,17 +1221,17 @@ int ibmphp_check_resource (struct resource_node *res, u8 bridge) if ((len_tmp < len_cur) || (len_cur == 0)) { if ((range->start % tmp_divide) == 0) { /* just perfect, starting address's divisible by length */ - flag = 1; + flag = TRUE; len_cur = len_tmp; start_cur = range->start; } else { /* Needs adjusting */ tmp_start = range->start; - flag = 0; + flag = FALSE; while ((len_tmp = range->end - tmp_start) >= res->len) { if ((tmp_start % tmp_divide) == 0) { - flag = 1; + flag = TRUE; len_cur = len_tmp; start_cur = tmp_start; break; @@ -1281,17 +1285,17 @@ int ibmphp_check_resource (struct resource_node *res, u8 bridge) if ((len_tmp < len_cur) || (len_cur == 0)) { if ((range->start % tmp_divide) == 0) { /* just perfect, starting address's divisible by length */ - flag = 1; + flag = TRUE; len_cur = len_tmp; start_cur = range->start; } else { /* Needs adjusting */ tmp_start = range->start; - flag = 0; + flag = FALSE; while ((len_tmp = range->end - tmp_start) >= res->len) { if ((tmp_start % tmp_divide) == 0) { - flag = 1; + flag = TRUE; len_cur = len_tmp; start_cur = tmp_start; break; @@ -1684,7 +1688,7 @@ static int __init once_over (void) bus_cur = list_entry (tmp, struct bus_node, bus_list); if ((!bus_cur->rangePFMem) && (bus_cur->firstPFMem)) { for (pfmem_cur = bus_cur->firstPFMem, pfmem_prev = NULL; pfmem_cur; pfmem_prev = pfmem_cur, pfmem_cur = pfmem_cur->next) { - pfmem_cur->fromMem = 1; + pfmem_cur->fromMem = TRUE; if (pfmem_prev) pfmem_prev->next = pfmem_cur->next; else @@ -1701,11 +1705,12 @@ static int __init once_over (void) bus_cur->firstPFMemFromMem = pfmem_cur; - mem = kzalloc(sizeof(struct resource_node), GFP_KERNEL); + mem = kmalloc (sizeof (struct resource_node), GFP_KERNEL); if (!mem) { err ("out of system memory\n"); return -ENOMEM; } + memset (mem, 0, sizeof (struct resource_node)); mem->type = MEM; mem->busno = pfmem_cur->busno; mem->devfunc = pfmem_cur->devfunc; @@ -1989,11 +1994,12 @@ static int __init update_bridge_ranges (struct bus_node **bus) end_address |= (upper_io_end << 16); if ((start_address) && (start_address <= end_address)) { - range = kzalloc(sizeof(struct range_node), GFP_KERNEL); + range = kmalloc (sizeof (struct range_node), GFP_KERNEL); if (!range) { err ("out of system memory\n"); return -ENOMEM; } + memset (range, 0, sizeof (struct range_node)); range->start = start_address; range->end = end_address + 0xfff; @@ -2014,12 +2020,13 @@ static int __init update_bridge_ranges (struct bus_node **bus) fix_resources (bus_sec); if (ibmphp_find_resource (bus_cur, start_address, &io, IO)) { - io = kzalloc(sizeof(struct resource_node), GFP_KERNEL); + io = kmalloc (sizeof (struct resource_node), GFP_KERNEL); if (!io) { kfree (range); err ("out of system memory\n"); return -ENOMEM; } + memset (io, 0, sizeof (struct resource_node)); io->type = IO; io->busno = bus_cur->busno; io->devfunc = ((device << 3) | (function & 0x7)); @@ -2038,11 +2045,12 @@ static int __init update_bridge_ranges (struct bus_node **bus) if ((start_address) && (start_address <= end_address)) { - range = kzalloc(sizeof(struct range_node), GFP_KERNEL); + range = kmalloc (sizeof (struct range_node), GFP_KERNEL); if (!range) { err ("out of system memory\n"); return -ENOMEM; } + memset (range, 0, sizeof (struct range_node)); range->start = start_address; range->end = end_address + 0xfffff; @@ -2064,12 +2072,13 @@ static int __init update_bridge_ranges (struct bus_node **bus) fix_resources (bus_sec); if (ibmphp_find_resource (bus_cur, start_address, &mem, MEM)) { - mem = kzalloc(sizeof(struct resource_node), GFP_KERNEL); + mem = kmalloc (sizeof (struct resource_node), GFP_KERNEL); if (!mem) { kfree (range); err ("out of system memory\n"); return -ENOMEM; } + memset (mem, 0, sizeof (struct resource_node)); mem->type = MEM; mem->busno = bus_cur->busno; mem->devfunc = ((device << 3) | (function & 0x7)); @@ -2092,11 +2101,12 @@ static int __init update_bridge_ranges (struct bus_node **bus) if ((start_address) && (start_address <= end_address)) { - range = kzalloc(sizeof(struct range_node), GFP_KERNEL); + range = kmalloc (sizeof (struct range_node), GFP_KERNEL); if (!range) { err ("out of system memory\n"); return -ENOMEM; } + memset (range, 0, sizeof (struct range_node)); range->start = start_address; range->end = end_address + 0xfffff; @@ -2117,19 +2127,20 @@ static int __init update_bridge_ranges (struct bus_node **bus) fix_resources (bus_sec); if (ibmphp_find_resource (bus_cur, start_address, &pfmem, PFMEM)) { - pfmem = kzalloc(sizeof(struct resource_node), GFP_KERNEL); + pfmem = kmalloc (sizeof (struct resource_node), GFP_KERNEL); if (!pfmem) { kfree (range); err ("out of system memory\n"); return -ENOMEM; } + memset (pfmem, 0, sizeof (struct resource_node)); pfmem->type = PFMEM; pfmem->busno = bus_cur->busno; pfmem->devfunc = ((device << 3) | (function & 0x7)); pfmem->start = start_address; pfmem->end = end_address + 0xfffff; pfmem->len = pfmem->end - pfmem->start + 1; - pfmem->fromMem = 0; + pfmem->fromMem = FALSE; ibmphp_add_resource (pfmem); } diff --git a/drivers/pci/hotplug/pci_hotplug.h b/drivers/pci/hotplug/pci_hotplug.h index e929b7c11..88d44f7fe 100644 --- a/drivers/pci/hotplug/pci_hotplug.h +++ b/drivers/pci/hotplug/pci_hotplug.h @@ -176,61 +176,5 @@ 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 { - 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 -#include -#include -#include -extern acpi_status acpi_run_oshp(acpi_handle handle); -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 #endif diff --git a/drivers/pci/hotplug/pci_hotplug_core.c b/drivers/pci/hotplug/pci_hotplug_core.c index b7b378df8..c4282902c 100644 --- a/drivers/pci/hotplug/pci_hotplug_core.c +++ b/drivers/pci/hotplug/pci_hotplug_core.c @@ -27,6 +27,7 @@ * */ +#include #include #include #include diff --git a/drivers/pci/hotplug/pciehp.h b/drivers/pci/hotplug/pciehp.h index eaea9d36a..0aac6a613 100644 --- a/drivers/pci/hotplug/pciehp.h +++ b/drivers/pci/hotplug/pciehp.h @@ -34,7 +34,6 @@ #include #include /* signal_pending() */ #include -#include #include "pci_hotplug.h" #define MY_NAME "pciehp" @@ -50,6 +49,12 @@ extern int pciehp_force; #define info(format, arg...) printk(KERN_INFO "%s: " format, MY_NAME , ## arg) #define warn(format, arg...) printk(KERN_WARNING "%s: " format, MY_NAME , ## arg) +struct hotplug_params { + u8 cache_line_size; + u8 latency_timer; + u8 enable_serr; + u8 enable_perr; +}; struct slot { struct slot *next; @@ -91,7 +96,7 @@ struct php_ctlr_state_s { #define MAX_EVENTS 10 struct controller { struct controller *next; - struct mutex crit_sect; /* critical section mutex */ + struct semaphore crit_sect; /* critical section semaphore */ struct php_ctlr_state_s *hpc_ctlr_handle; /* HPC controller handle */ int num_slots; /* Number of slots on ctlr */ int slot_num_inc; /* 1 or -1 */ @@ -186,6 +191,9 @@ extern u8 pciehp_handle_power_fault (u8 hp_slot, void *inst_id); /* pci functions */ extern int pciehp_configure_device (struct slot *p_slot); extern int pciehp_unconfigure_device (struct slot *p_slot); +extern int pciehp_get_hp_hw_control_from_firmware(struct pci_dev *dev); +extern void pciehp_get_hp_params_from_firmware(struct pci_dev *dev, + struct hotplug_params *hpp); @@ -277,24 +285,4 @@ struct hpc_ops { int (*check_lnk_status) (struct controller *ctrl); }; - -#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->bus, hpp))) - return -ENODEV; - return 0; -} -#else -#define pciehp_get_hp_hw_control_from_firmware(dev) 0 -#define pciehp_get_hp_params_from_firmware(dev, hpp) (-ENODEV) -#endif /* CONFIG_ACPI */ #endif /* _PCIEHP_H */ diff --git a/drivers/pci/hotplug/pciehp_core.c b/drivers/pci/hotplug/pciehp_core.c index c67b7c3f1..4fb569018 100644 --- a/drivers/pci/hotplug/pciehp_core.c +++ b/drivers/pci/hotplug/pciehp_core.c @@ -69,7 +69,6 @@ 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); @@ -82,7 +81,6 @@ 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, }; @@ -119,23 +117,27 @@ static int init_slots(struct controller *ctrl) slot_number = ctrl->first_slot; while (number_of_slots) { - slot = kzalloc(sizeof(*slot), GFP_KERNEL); + slot = kmalloc(sizeof(*slot), GFP_KERNEL); if (!slot) goto error; + memset(slot, 0, sizeof(struct slot)); slot->hotplug_slot = - kzalloc(sizeof(*(slot->hotplug_slot)), + kmalloc(sizeof(*(slot->hotplug_slot)), GFP_KERNEL); if (!slot->hotplug_slot) goto error_slot; hotplug_slot = slot->hotplug_slot; + memset(hotplug_slot, 0, sizeof(struct hotplug_slot)); hotplug_slot->info = - kzalloc(sizeof(*(hotplug_slot->info)), + kmalloc(sizeof(*(hotplug_slot->info)), GFP_KERNEL); if (!hotplug_slot->info) goto error_hpslot; hotplug_slot_info = hotplug_slot->info; + memset(hotplug_slot_info, 0, + sizeof(struct hotplug_slot_info)); hotplug_slot->name = kmalloc(SLOT_NAME_SIZE, GFP_KERNEL); if (!hotplug_slot->name) goto error_info; @@ -333,18 +335,6 @@ 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; @@ -383,11 +373,12 @@ static int pciehp_probe(struct pcie_device *dev, const struct pcie_port_service_ u8 value; struct pci_dev *pdev; - ctrl = kzalloc(sizeof(*ctrl), GFP_KERNEL); + ctrl = kmalloc(sizeof(*ctrl), GFP_KERNEL); if (!ctrl) { err("%s : out of memory\n", __FUNCTION__); goto err_out_none; } + memset(ctrl, 0, sizeof(struct controller)); pdev = dev->port; ctrl->pci_dev = pdev; @@ -448,7 +439,7 @@ static int pciehp_probe(struct pcie_device *dev, const struct pcie_port_service_ } /* Wait for exclusive access to hardware */ - mutex_lock(&ctrl->crit_sect); + down(&ctrl->crit_sect); t_slot->hpc_ops->get_adapter_status(t_slot, &value); /* Check if slot is occupied */ @@ -456,7 +447,7 @@ static int pciehp_probe(struct pcie_device *dev, const struct pcie_port_service_ rc = t_slot->hpc_ops->power_off_slot(t_slot); /* Power off slot if not occupied*/ if (rc) { /* Done with exclusive hardware access */ - mutex_unlock(&ctrl->crit_sect); + up(&ctrl->crit_sect); goto err_out_free_ctrl_slot; } else /* Wait for the command to complete */ @@ -464,7 +455,7 @@ static int pciehp_probe(struct pcie_device *dev, const struct pcie_port_service_ } /* Done with exclusive hardware access */ - mutex_unlock(&ctrl->crit_sect); + up(&ctrl->crit_sect); return 0; diff --git a/drivers/pci/hotplug/pciehp_ctrl.c b/drivers/pci/hotplug/pciehp_ctrl.c index 33d198768..83c4b8657 100644 --- a/drivers/pci/hotplug/pciehp_ctrl.c +++ b/drivers/pci/hotplug/pciehp_ctrl.c @@ -229,13 +229,13 @@ u8 pciehp_handle_power_fault(u8 hp_slot, void *inst_id) static void set_slot_off(struct controller *ctrl, struct slot * pslot) { /* Wait for exclusive access to hardware */ - mutex_lock(&ctrl->crit_sect); + down(&ctrl->crit_sect); /* turn off slot, turn on Amber LED, turn off Green LED if supported*/ if (POWER_CTRL(ctrl->ctrlcap)) { if (pslot->hpc_ops->power_off_slot(pslot)) { err("%s: Issue of Slot Power Off command failed\n", __FUNCTION__); - mutex_unlock(&ctrl->crit_sect); + up(&ctrl->crit_sect); return; } wait_for_ctrl_irq (ctrl); @@ -249,14 +249,14 @@ static void set_slot_off(struct controller *ctrl, struct slot * pslot) if (ATTN_LED(ctrl->ctrlcap)) { if (pslot->hpc_ops->set_attention_status(pslot, 1)) { err("%s: Issue of Set Attention Led command failed\n", __FUNCTION__); - mutex_unlock(&ctrl->crit_sect); + up(&ctrl->crit_sect); return; } wait_for_ctrl_irq (ctrl); } /* Done with exclusive hardware access */ - mutex_unlock(&ctrl->crit_sect); + up(&ctrl->crit_sect); } /** @@ -279,13 +279,13 @@ static int board_added(struct slot *p_slot) ctrl->slot_device_offset, hp_slot); /* Wait for exclusive access to hardware */ - mutex_lock(&ctrl->crit_sect); + down(&ctrl->crit_sect); if (POWER_CTRL(ctrl->ctrlcap)) { /* Power on slot */ rc = p_slot->hpc_ops->power_on_slot(p_slot); if (rc) { - mutex_unlock(&ctrl->crit_sect); + up(&ctrl->crit_sect); return -1; } @@ -301,7 +301,7 @@ static int board_added(struct slot *p_slot) } /* Done with exclusive hardware access */ - mutex_unlock(&ctrl->crit_sect); + up(&ctrl->crit_sect); /* Wait for ~1 second */ wait_for_ctrl_irq (ctrl); @@ -335,7 +335,7 @@ static int board_added(struct slot *p_slot) pci_fixup_device(pci_fixup_final, ctrl->pci_dev); if (PWR_LED(ctrl->ctrlcap)) { /* Wait for exclusive access to hardware */ - mutex_lock(&ctrl->crit_sect); + down(&ctrl->crit_sect); p_slot->hpc_ops->green_led_on(p_slot); @@ -343,7 +343,7 @@ static int board_added(struct slot *p_slot) wait_for_ctrl_irq (ctrl); /* Done with exclusive hardware access */ - mutex_unlock(&ctrl->crit_sect); + up(&ctrl->crit_sect); } return 0; @@ -375,14 +375,14 @@ static int remove_board(struct slot *p_slot) dbg("In %s, hp_slot = %d\n", __FUNCTION__, hp_slot); /* Wait for exclusive access to hardware */ - mutex_lock(&ctrl->crit_sect); + down(&ctrl->crit_sect); if (POWER_CTRL(ctrl->ctrlcap)) { /* power off slot */ rc = p_slot->hpc_ops->power_off_slot(p_slot); if (rc) { err("%s: Issue of Slot Disable command failed\n", __FUNCTION__); - mutex_unlock(&ctrl->crit_sect); + up(&ctrl->crit_sect); return rc; } /* Wait for the command to complete */ @@ -398,7 +398,7 @@ static int remove_board(struct slot *p_slot) } /* Done with exclusive hardware access */ - mutex_unlock(&ctrl->crit_sect); + up(&ctrl->crit_sect); return 0; } @@ -445,7 +445,7 @@ static void pciehp_pushbutton_thread(unsigned long slot) if (pciehp_enable_slot(p_slot) && PWR_LED(p_slot->ctrl->ctrlcap)) { /* Wait for exclusive access to hardware */ - mutex_lock(&p_slot->ctrl->crit_sect); + down(&p_slot->ctrl->crit_sect); p_slot->hpc_ops->green_led_off(p_slot); @@ -453,7 +453,7 @@ static void pciehp_pushbutton_thread(unsigned long slot) wait_for_ctrl_irq (p_slot->ctrl); /* Done with exclusive hardware access */ - mutex_unlock(&p_slot->ctrl->crit_sect); + up(&p_slot->ctrl->crit_sect); } p_slot->state = STATIC_STATE; } @@ -495,7 +495,7 @@ static void pciehp_surprise_rm_thread(unsigned long slot) if (pciehp_enable_slot(p_slot) && PWR_LED(p_slot->ctrl->ctrlcap)) { /* Wait for exclusive access to hardware */ - mutex_lock(&p_slot->ctrl->crit_sect); + down(&p_slot->ctrl->crit_sect); p_slot->hpc_ops->green_led_off(p_slot); @@ -503,7 +503,7 @@ static void pciehp_surprise_rm_thread(unsigned long slot) wait_for_ctrl_irq (p_slot->ctrl); /* Done with exclusive hardware access */ - mutex_unlock(&p_slot->ctrl->crit_sect); + up(&p_slot->ctrl->crit_sect); } p_slot->state = STATIC_STATE; } @@ -616,7 +616,7 @@ static void interrupt_event_handler(struct controller *ctrl) switch (p_slot->state) { case BLINKINGOFF_STATE: /* Wait for exclusive access to hardware */ - mutex_lock(&ctrl->crit_sect); + down(&ctrl->crit_sect); if (PWR_LED(ctrl->ctrlcap)) { p_slot->hpc_ops->green_led_on(p_slot); @@ -630,11 +630,11 @@ static void interrupt_event_handler(struct controller *ctrl) wait_for_ctrl_irq (ctrl); } /* Done with exclusive hardware access */ - mutex_unlock(&ctrl->crit_sect); + up(&ctrl->crit_sect); break; case BLINKINGON_STATE: /* Wait for exclusive access to hardware */ - mutex_lock(&ctrl->crit_sect); + down(&ctrl->crit_sect); if (PWR_LED(ctrl->ctrlcap)) { p_slot->hpc_ops->green_led_off(p_slot); @@ -647,7 +647,7 @@ static void interrupt_event_handler(struct controller *ctrl) wait_for_ctrl_irq (ctrl); } /* Done with exclusive hardware access */ - mutex_unlock(&ctrl->crit_sect); + up(&ctrl->crit_sect); break; default: @@ -676,7 +676,7 @@ static void interrupt_event_handler(struct controller *ctrl) } /* Wait for exclusive access to hardware */ - mutex_lock(&ctrl->crit_sect); + down(&ctrl->crit_sect); /* blink green LED and turn off amber */ if (PWR_LED(ctrl->ctrlcap)) { @@ -693,7 +693,7 @@ static void interrupt_event_handler(struct controller *ctrl) } /* Done with exclusive hardware access */ - mutex_unlock(&ctrl->crit_sect); + up(&ctrl->crit_sect); init_timer(&p_slot->task_event); p_slot->task_event.expires = jiffies + 5 * HZ; /* 5 second delay */ @@ -708,7 +708,7 @@ static void interrupt_event_handler(struct controller *ctrl) if (POWER_CTRL(ctrl->ctrlcap)) { dbg("power fault\n"); /* Wait for exclusive access to hardware */ - mutex_lock(&ctrl->crit_sect); + down(&ctrl->crit_sect); if (ATTN_LED(ctrl->ctrlcap)) { p_slot->hpc_ops->set_attention_status(p_slot, 1); @@ -721,7 +721,7 @@ static void interrupt_event_handler(struct controller *ctrl) } /* Done with exclusive hardware access */ - mutex_unlock(&ctrl->crit_sect); + up(&ctrl->crit_sect); } } /***********SURPRISE REMOVAL********************/ @@ -756,19 +756,19 @@ int pciehp_enable_slot(struct slot *p_slot) int rc; /* Check to see if (latch closed, card present, power off) */ - mutex_lock(&p_slot->ctrl->crit_sect); + down(&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); - mutex_unlock(&p_slot->ctrl->crit_sect); + up(&p_slot->ctrl->crit_sect); return 1; } if (MRL_SENS(p_slot->ctrl->ctrlcap)) { 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); - mutex_unlock(&p_slot->ctrl->crit_sect); + up(&p_slot->ctrl->crit_sect); return 1; } } @@ -777,11 +777,11 @@ int pciehp_enable_slot(struct slot *p_slot) 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); - mutex_unlock(&p_slot->ctrl->crit_sect); + up(&p_slot->ctrl->crit_sect); return 1; } } - mutex_unlock(&p_slot->ctrl->crit_sect); + up(&p_slot->ctrl->crit_sect); p_slot->hpc_ops->get_latch_status(p_slot, &getstatus); @@ -806,13 +806,13 @@ int pciehp_disable_slot(struct slot *p_slot) return 1; /* Check to see if (latch closed, card present, power on) */ - mutex_lock(&p_slot->ctrl->crit_sect); + down(&p_slot->ctrl->crit_sect); if (!HP_SUPR_RM(p_slot->ctrl->ctrlcap)) { ret = p_slot->hpc_ops->get_adapter_status(p_slot, &getstatus); if (ret || !getstatus) { info("%s: no adapter on slot(%x)\n", __FUNCTION__, p_slot->number); - mutex_unlock(&p_slot->ctrl->crit_sect); + up(&p_slot->ctrl->crit_sect); return 1; } } @@ -821,7 +821,7 @@ int pciehp_disable_slot(struct slot *p_slot) ret = p_slot->hpc_ops->get_latch_status(p_slot, &getstatus); if (ret || getstatus) { info("%s: latch open on slot(%x)\n", __FUNCTION__, p_slot->number); - mutex_unlock(&p_slot->ctrl->crit_sect); + up(&p_slot->ctrl->crit_sect); return 1; } } @@ -830,12 +830,12 @@ int pciehp_disable_slot(struct slot *p_slot) ret = p_slot->hpc_ops->get_power_status(p_slot, &getstatus); if (ret || !getstatus) { info("%s: already disabled slot(%x)\n", __FUNCTION__, p_slot->number); - mutex_unlock(&p_slot->ctrl->crit_sect); + up(&p_slot->ctrl->crit_sect); return 1; } } - mutex_unlock(&p_slot->ctrl->crit_sect); + up(&p_slot->ctrl->crit_sect); ret = remove_board(p_slot); update_slot_info(p_slot); diff --git a/drivers/pci/hotplug/pciehp_hpc.c b/drivers/pci/hotplug/pciehp_hpc.c index 6ab3b6cd2..77e530321 100644 --- a/drivers/pci/hotplug/pciehp_hpc.c +++ b/drivers/pci/hotplug/pciehp_hpc.c @@ -38,6 +38,7 @@ #include "../pci.h" #include "pciehp.h" + #ifdef DEBUG #define DBG_K_TRACE_ENTRY ((unsigned int)0x00000001) /* On function entry */ #define DBG_K_TRACE_EXIT ((unsigned int)0x00000002) /* On function exit */ @@ -1235,76 +1236,6 @@ static struct hpc_ops pciehp_hpc_ops = { .check_lnk_status = hpc_check_lnk_status, }; -#ifdef CONFIG_ACPI -int pciehp_acpi_get_hp_hw_control_from_firmware(struct pci_dev *dev) -{ - acpi_status status; - acpi_handle chandle, handle = DEVICE_ACPI_HANDLE(&(dev->dev)); - struct pci_dev *pdev = dev; - struct pci_bus *parent; - struct acpi_buffer string = { ACPI_ALLOCATE_BUFFER, NULL }; - - /* - * Per PCI firmware specification, we should run the ACPI _OSC - * method to get control of hotplug hardware before using it. - * If an _OSC is missing, we look for an OSHP to do the same thing. - * To handle different BIOS behavior, we look for _OSC and OSHP - * within the scope of the hotplug controller and its parents, upto - * the host bridge under which this controller exists. - */ - while (!handle) { - /* - * This hotplug controller was not listed in the ACPI name - * space at all. Try to get acpi handle of parent pci bus. - */ - if (!pdev || !pdev->bus->parent) - break; - parent = pdev->bus->parent; - dbg("Could not find %s in acpi namespace, trying parent\n", - pci_name(pdev)); - if (!parent->self) - /* Parent must be a host bridge */ - handle = acpi_get_pci_rootbridge_handle( - pci_domain_nr(parent), - parent->number); - else - handle = DEVICE_ACPI_HANDLE( - &(parent->self->dev)); - pdev = parent->self; - } - - while (handle) { - acpi_get_name(handle, ACPI_FULL_PATHNAME, &string); - dbg("Trying to get hotplug control for %s \n", - (char *)string.pointer); - status = pci_osc_control_set(handle, - OSC_PCI_EXPRESS_NATIVE_HP_CONTROL); - if (status == AE_NOT_FOUND) - status = acpi_run_oshp(handle); - if (ACPI_SUCCESS(status)) { - dbg("Gained control for hotplug HW for pci %s (%s)\n", - pci_name(dev), (char *)string.pointer); - kfree(string.pointer); - return 0; - } - if (acpi_root_bridge(handle)) - break; - chandle = handle; - status = acpi_get_parent(chandle, &handle); - if (ACPI_FAILURE(status)) - break; - } - - err("Cannot get control of hotplug hardware for pci %s\n", - pci_name(dev)); - - kfree(string.pointer); - return -1; -} -#endif - - - int pcie_init(struct controller * ctrl, struct pcie_device *dev) { struct php_ctlr_state_s *php_ctlr, *p; @@ -1394,14 +1325,16 @@ 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%llx(len=0x%llx)\n", rc, - (unsigned long long)pci_resource_start(pdev, rc), - (unsigned long long)pci_resource_len(pdev, rc)); + dbg("pci resource[%d] start=0x%lx(len=0x%lx)\n", rc, + pci_resource_start(pdev, rc), 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); - mutex_init(&ctrl->crit_sect); + if (pci_enable_device(pdev)) + goto abort_free_ctlr; + + init_MUTEX(&ctrl->crit_sect); /* setup wait queue */ init_waitqueue_head(&ctrl->queue); @@ -1454,7 +1387,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, IRQF_SHARED, MY_NAME, (void *) ctrl); + rc = request_irq(php_ctlr->irq, pcie_isr, SA_SHIRQ, 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); @@ -1468,7 +1401,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_irq; + goto abort_free_ctlr; } intr_enable = intr_enable | PRSN_DETECT_ENABLE; @@ -1494,19 +1427,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_irq; + goto abort_free_ctlr; } 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_disable_intr; + goto abort_free_ctlr; } 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_disable_intr; + goto abort_free_ctlr; } if (pciehp_force) { @@ -1515,7 +1448,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_disable_intr; + goto abort_free_ctlr; } /* Add this HPC instance into the HPC list */ @@ -1542,21 +1475,6 @@ 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 854aaea09..4017fb03a 100644 --- a/drivers/pci/hotplug/pciehp_pci.c +++ b/drivers/pci/hotplug/pciehp_pci.c @@ -34,144 +34,6 @@ #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; @@ -204,11 +66,10 @@ int pciehp_configure_device(struct slot *p_slot) struct pci_bus *parent = p_slot->ctrl->pci_dev->subordinate; int num, fn; - dev = pci_get_slot(parent, PCI_DEVFN(p_slot->device, 0)); + dev = pci_find_slot(p_slot->bus, 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; } @@ -225,15 +86,14 @@ 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); } - program_fw_provided_values(dev); - pci_dev_put(dev); + /* TBD: program firmware provided _HPP values */ + /* program_fw_provided_values(dev); */ } pci_bus_assign_resources(parent); @@ -246,20 +106,18 @@ 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_get_slot(parent, + struct pci_dev* temp = pci_find_slot(p_slot->bus, (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) { @@ -267,12 +125,10 @@ 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/pciehprm_acpi.c b/drivers/pci/hotplug/pciehprm_acpi.c index 57f4e6d1b..2bdb30f68 100644 --- a/drivers/pci/hotplug/pciehprm_acpi.c +++ b/drivers/pci/hotplug/pciehprm_acpi.c @@ -20,104 +20,24 @@ * 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 * */ -#include #include #include #include #include -#include #include -#include #include -#include -#include -#ifdef CONFIG_IA64 -#include -#endif -#include #include #include #include "pciehp.h" -#include "pciehprm.h" - -#define PCI_MAX_BUS 0x100 -#define ACPI_STA_DEVICE_PRESENT 0x01 #define METHOD_NAME__SUN "_SUN" #define METHOD_NAME__HPP "_HPP" #define METHOD_NAME_OSHP "OSHP" -/* Status code for running acpi method to gain native control */ -#define NC_NOT_RUN 0 -#define OSC_NOT_EXIST 1 -#define OSC_RUN_FAILED 2 -#define OSHP_NOT_EXIST 3 -#define OSHP_RUN_FAILED 4 -#define NC_RUN_SUCCESS 5 - -#define PHP_RES_BUS 0xA0 -#define PHP_RES_IO 0xA1 -#define PHP_RES_MEM 0xA2 -#define PHP_RES_PMEM 0xA3 - -#define BRIDGE_TYPE_P2P 0x00 -#define BRIDGE_TYPE_HOST 0x01 - -/* this should go to drivers/acpi/include/ */ -struct acpi__hpp { - u8 cache_line_size; - u8 latency_timer; - u8 enable_serr; - u8 enable_perr; -}; - -struct acpi_php_slot { - struct acpi_php_slot *next; - struct acpi_bridge *bridge; - acpi_handle handle; - int seg; - int bus; - int dev; - int fun; - u32 sun; - struct pci_resource *mem_head; - struct pci_resource *p_mem_head; - struct pci_resource *io_head; - struct pci_resource *bus_head; - void *slot_ops; /* _STA, _EJx, etc */ - struct slot *slot; -}; /* per func */ - -struct acpi_bridge { - struct acpi_bridge *parent; - struct acpi_bridge *next; - struct acpi_bridge *child; - acpi_handle handle; - int seg; - int pbus; /* pdev->bus->number */ - int pdevice; /* PCI_SLOT(pdev->devfn) */ - int pfunction; /* PCI_DEVFN(pdev->devfn) */ - int bus; /* pdev->subordinate->number */ - struct acpi__hpp *_hpp; - struct acpi_php_slot *slots; - struct pci_resource *tmem_head; /* total from crs */ - struct pci_resource *tp_mem_head; /* total from crs */ - struct pci_resource *tio_head; /* total from crs */ - struct pci_resource *tbus_head; /* total from crs */ - struct pci_resource *mem_head; /* available */ - struct pci_resource *p_mem_head; /* available */ - struct pci_resource *io_head; /* available */ - struct pci_resource *bus_head; /* available */ - int scanned; - int type; -}; - -static struct acpi_bridge *acpi_bridges_head; - static u8 * acpi_path_name( acpi_handle handle) { acpi_status status; @@ -133,85 +53,43 @@ static u8 * acpi_path_name( acpi_handle handle) return path_name; } -static void acpi_get__hpp ( struct acpi_bridge *ab); -static int acpi_run_oshp ( struct acpi_bridge *ab); -static int osc_run_status = NC_NOT_RUN; -static int oshp_run_status = NC_NOT_RUN; - -static int acpi_add_slot_to_php_slots( - struct acpi_bridge *ab, - int bus_num, - acpi_handle handle, - u32 adr, - u32 sun - ) -{ - struct acpi_php_slot *aps; - static long samesun = -1; - - aps = (struct acpi_php_slot *) kmalloc (sizeof(struct acpi_php_slot), GFP_KERNEL); - if (!aps) { - err ("acpi_pciehprm: alloc for aps fail\n"); - return -1; - } - memset(aps, 0, sizeof(struct acpi_php_slot)); - - aps->handle = handle; - aps->bus = bus_num; - aps->dev = (adr >> 16) & 0xffff; - aps->fun = adr & 0xffff; - aps->sun = sun; - - aps->next = ab->slots; /* cling to the bridge */ - aps->bridge = ab; - ab->slots = aps; - - ab->scanned += 1; - if (!ab->_hpp) - acpi_get__hpp(ab); - - if (osc_run_status == OSC_NOT_EXIST) - oshp_run_status = acpi_run_oshp(ab); - - if (sun != samesun) { - info("acpi_pciehprm: Slot sun(%x) at s:b:d:f=0x%02x:%02x:%02x:%02x\n", - aps->sun, ab->seg, aps->bus, aps->dev, aps->fun); - samesun = sun; - } - return 0; -} - -static void acpi_get__hpp ( struct acpi_bridge *ab) +static acpi_status +acpi_run_hpp(acpi_handle handle, struct hotplug_params *hpp) { acpi_status status; u8 nui[4]; struct acpi_buffer ret_buf = { 0, NULL}; union acpi_object *ext_obj, *package; - u8 *path_name = acpi_path_name(ab->handle); + u8 *path_name = acpi_path_name(handle); int i, len = 0; /* get _hpp */ - status = acpi_evaluate_object(ab->handle, METHOD_NAME__HPP, NULL, &ret_buf); + status = acpi_evaluate_object(handle, METHOD_NAME__HPP, NULL, &ret_buf); switch (status) { case AE_BUFFER_OVERFLOW: ret_buf.pointer = kmalloc (ret_buf.length, GFP_KERNEL); if (!ret_buf.pointer) { - err ("acpi_pciehprm:%s alloc for _HPP fail\n", path_name); - return; + err ("%s:%s alloc for _HPP fail\n", __FUNCTION__, + path_name); + return AE_NO_MEMORY; } - status = acpi_evaluate_object(ab->handle, METHOD_NAME__HPP, NULL, &ret_buf); + status = acpi_evaluate_object(handle, METHOD_NAME__HPP, + NULL, &ret_buf); if (ACPI_SUCCESS(status)) break; default: if (ACPI_FAILURE(status)) { - err("acpi_pciehprm:%s _HPP fail=0x%x\n", path_name, status); - return; + dbg("%s:%s _HPP fail=0x%x\n", __FUNCTION__, + path_name, status); + return status; } } ext_obj = (union acpi_object *) ret_buf.pointer; if (ext_obj->type != ACPI_TYPE_PACKAGE) { - err ("acpi_pciehprm:%s _HPP obj not a package\n", path_name); + err ("%s:%s _HPP obj not a package\n", __FUNCTION__, + path_name); + status = AE_ERROR; goto free_and_return; } @@ -224,1514 +102,156 @@ static void acpi_get__hpp ( struct acpi_bridge *ab) nui[i] = (u8)ext_obj->integer.value; break; default: - err ("acpi_pciehprm:%s _HPP obj type incorrect\n", path_name); + err ("%s:%s _HPP obj type incorrect\n", __FUNCTION__, + path_name); + status = AE_ERROR; goto free_and_return; } } - ab->_hpp = kmalloc (sizeof (struct acpi__hpp), GFP_KERNEL); - if (!ab->_hpp) { - err ("acpi_pciehprm:%s alloc for _HPP failed\n", path_name); - goto free_and_return; - } - memset(ab->_hpp, 0, sizeof(struct acpi__hpp)); + hpp->cache_line_size = nui[0]; + hpp->latency_timer = nui[1]; + hpp->enable_serr = nui[2]; + hpp->enable_perr = nui[3]; - ab->_hpp->cache_line_size = nui[0]; - ab->_hpp->latency_timer = nui[1]; - ab->_hpp->enable_serr = nui[2]; - ab->_hpp->enable_perr = nui[3]; - - dbg(" _HPP: cache_line_size=0x%x\n", ab->_hpp->cache_line_size); - dbg(" _HPP: latency timer =0x%x\n", ab->_hpp->latency_timer); - dbg(" _HPP: enable SERR =0x%x\n", ab->_hpp->enable_serr); - dbg(" _HPP: enable PERR =0x%x\n", ab->_hpp->enable_perr); + dbg(" _HPP: cache_line_size=0x%x\n", hpp->cache_line_size); + dbg(" _HPP: latency timer =0x%x\n", hpp->latency_timer); + dbg(" _HPP: enable SERR =0x%x\n", hpp->enable_serr); + dbg(" _HPP: enable PERR =0x%x\n", hpp->enable_perr); free_and_return: kfree(ret_buf.pointer); + return status; } -static int acpi_run_oshp ( struct acpi_bridge *ab) +static acpi_status acpi_run_oshp(acpi_handle handle) { acpi_status status; - u8 *path_name = acpi_path_name(ab->handle); + u8 *path_name = acpi_path_name(handle); /* run OSHP */ - status = acpi_evaluate_object(ab->handle, METHOD_NAME_OSHP, NULL, NULL); + status = acpi_evaluate_object(handle, METHOD_NAME_OSHP, NULL, NULL); if (ACPI_FAILURE(status)) { - err("acpi_pciehprm:%s OSHP fails=0x%x\n", path_name, status); - oshp_run_status = (status == AE_NOT_FOUND) ? OSHP_NOT_EXIST : OSHP_RUN_FAILED; + dbg("%s:%s OSHP fails=0x%x\n", __FUNCTION__, path_name, + status); } else { - oshp_run_status = NC_RUN_SUCCESS; - dbg("acpi_pciehprm:%s OSHP passes =0x%x\n", path_name, status); - dbg("acpi_pciehprm:%s oshp_run_status =0x%x\n", path_name, oshp_run_status); + dbg("%s:%s OSHP passes\n", __FUNCTION__, path_name); } - return oshp_run_status; -} - -static acpi_status acpi_evaluate_crs( - acpi_handle handle, - struct acpi_resource **retbuf - ) -{ - acpi_status status; - struct acpi_buffer crsbuf; - u8 *path_name = acpi_path_name(handle); - - crsbuf.length = 0; - crsbuf.pointer = NULL; - - status = acpi_get_current_resources (handle, &crsbuf); - - switch (status) { - case AE_BUFFER_OVERFLOW: - break; /* found */ - case AE_NOT_FOUND: - dbg("acpi_pciehprm:%s _CRS not found\n", path_name); - return status; - default: - err ("acpi_pciehprm:%s _CRS fail=0x%x\n", path_name, status); - return status; - } - - crsbuf.pointer = kmalloc (crsbuf.length, GFP_KERNEL); - if (!crsbuf.pointer) { - err ("acpi_pciehprm: alloc %ld bytes for %s _CRS fail\n", (ulong)crsbuf.length, path_name); - return AE_NO_MEMORY; - } - - status = acpi_get_current_resources (handle, &crsbuf); - if (ACPI_FAILURE(status)) { - err("acpi_pciehprm: %s _CRS fail=0x%x.\n", path_name, status); - kfree(crsbuf.pointer); - return status; - } - - *retbuf = crsbuf.pointer; - return status; } -static void free_pci_resource ( struct pci_resource *aprh) -{ - struct pci_resource *res, *next; - - for (res = aprh; res; res = next) { - next = res->next; - kfree(res); - } -} - -static void print_pci_resource ( struct pci_resource *aprh) -{ - struct pci_resource *res; - - for (res = aprh; res; res = res->next) - dbg(" base= 0x%x length= 0x%x\n", res->base, res->length); -} - -static void print_slot_resources( struct acpi_php_slot *aps) -{ - if (aps->bus_head) { - dbg(" BUS Resources:\n"); - print_pci_resource (aps->bus_head); - } - - if (aps->io_head) { - dbg(" IO Resources:\n"); - print_pci_resource (aps->io_head); - } - - if (aps->mem_head) { - dbg(" MEM Resources:\n"); - print_pci_resource (aps->mem_head); - } - - if (aps->p_mem_head) { - dbg(" PMEM Resources:\n"); - print_pci_resource (aps->p_mem_head); - } -} - -static void print_pci_resources( struct acpi_bridge *ab) +static int is_root_bridge(acpi_handle handle) { - if (ab->tbus_head) { - dbg(" Total BUS Resources:\n"); - print_pci_resource (ab->tbus_head); - } - if (ab->bus_head) { - dbg(" BUS Resources:\n"); - print_pci_resource (ab->bus_head); - } - - if (ab->tio_head) { - dbg(" Total IO Resources:\n"); - print_pci_resource (ab->tio_head); - } - if (ab->io_head) { - dbg(" IO Resources:\n"); - print_pci_resource (ab->io_head); - } - - if (ab->tmem_head) { - dbg(" Total MEM Resources:\n"); - print_pci_resource (ab->tmem_head); - } - if (ab->mem_head) { - dbg(" MEM Resources:\n"); - print_pci_resource (ab->mem_head); - } + acpi_status status; + struct acpi_device_info *info; + struct acpi_buffer buffer = {ACPI_ALLOCATE_BUFFER, NULL}; + int i; - if (ab->tp_mem_head) { - dbg(" Total PMEM Resources:\n"); - print_pci_resource (ab->tp_mem_head); - } - if (ab->p_mem_head) { - dbg(" PMEM Resources:\n"); - print_pci_resource (ab->p_mem_head); - } - if (ab->_hpp) { - dbg(" _HPP: cache_line_size=0x%x\n", ab->_hpp->cache_line_size); - dbg(" _HPP: latency timer =0x%x\n", ab->_hpp->latency_timer); - dbg(" _HPP: enable SERR =0x%x\n", ab->_hpp->enable_serr); - dbg(" _HPP: enable PERR =0x%x\n", ab->_hpp->enable_perr); - } -} - -static int pciehprm_delete_resource( - struct pci_resource **aprh, - ulong base, - ulong size) -{ - struct pci_resource *res; - struct pci_resource *prevnode; - struct pci_resource *split_node; - ulong tbase; - - pciehp_resource_sort_and_combine(aprh); - - for (res = *aprh; res; res = res->next) { - if (res->base > base) - continue; - - if ((res->base + res->length) < (base + size)) - continue; - - if (res->base < base) { - tbase = base; - - if ((res->length - (tbase - res->base)) < size) - continue; - - split_node = (struct pci_resource *) kmalloc(sizeof(struct pci_resource), GFP_KERNEL); - if (!split_node) - return -ENOMEM; - - split_node->base = res->base; - split_node->length = tbase - res->base; - res->base = tbase; - res->length -= split_node->length; - - split_node->next = res->next; - res->next = split_node; - } - - if (res->length >= size) { - split_node = (struct pci_resource*) kmalloc(sizeof(struct pci_resource), GFP_KERNEL); - if (!split_node) - return -ENOMEM; - - split_node->base = res->base + size; - split_node->length = res->length - size; - res->length = size; - - split_node->next = res->next; - res->next = split_node; - } - - if (*aprh == res) { - *aprh = res->next; - } else { - prevnode = *aprh; - while (prevnode->next != res) - prevnode = prevnode->next; - - prevnode->next = res->next; - } - res->next = NULL; - kfree(res); - break; - } - - return 0; -} - -static int pciehprm_delete_resources( - struct pci_resource **aprh, - struct pci_resource *this - ) -{ - struct pci_resource *res; - - for (res = this; res; res = res->next) - pciehprm_delete_resource(aprh, res->base, res->length); - - return 0; -} - -static int pciehprm_add_resource( - struct pci_resource **aprh, - ulong base, - ulong size) -{ - struct pci_resource *res; - - for (res = *aprh; res; res = res->next) { - if ((res->base + res->length) == base) { - res->length += size; - size = 0L; - break; + status = acpi_get_object_info(handle, &buffer); + if (ACPI_SUCCESS(status)) { + info = buffer.pointer; + if ((info->valid & ACPI_VALID_HID) && + !strcmp(PCI_ROOT_HID_STRING, + info->hardware_id.value)) { + acpi_os_free(buffer.pointer); + return 1; } - if (res->next == *aprh) - break; - } - - if (size) { - res = kmalloc(sizeof(struct pci_resource), GFP_KERNEL); - if (!res) { - err ("acpi_pciehprm: alloc for res fail\n"); - return -ENOMEM; + 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); + return 1; + } + } } - memset(res, 0, sizeof (struct pci_resource)); - - res->base = base; - res->length = size; - res->next = *aprh; - *aprh = res; } - return 0; } -static int pciehprm_add_resources( - struct pci_resource **aprh, - struct pci_resource *this - ) -{ - struct pci_resource *res; - int rc = 0; - - for (res = this; res && !rc; res = res->next) - rc = pciehprm_add_resource(aprh, res->base, res->length); - - return rc; -} - -static void acpi_parse_io ( - struct acpi_bridge *ab, - union acpi_resource_data *data - ) +int pciehp_get_hp_hw_control_from_firmware(struct pci_dev *dev) { - struct acpi_resource_io *dataio; - dataio = (struct acpi_resource_io *) data; + acpi_status status; + acpi_handle chandle, handle = DEVICE_ACPI_HANDLE(&(dev->dev)); + struct pci_dev *pdev = dev; + struct pci_bus *parent; + u8 *path_name; - dbg("Io Resource\n"); - dbg(" %d bit decode\n", ACPI_DECODE_16 == dataio->io_decode ? 16:10); - dbg(" Range minimum base: %08X\n", dataio->min_base_address); - dbg(" Range maximum base: %08X\n", dataio->max_base_address); - dbg(" Alignment: %08X\n", dataio->alignment); - dbg(" Range Length: %08X\n", dataio->range_length); -} - -static void acpi_parse_fixed_io ( - struct acpi_bridge *ab, - union acpi_resource_data *data - ) -{ - struct acpi_resource_fixed_io *datafio; - datafio = (struct acpi_resource_fixed_io *) data; - - dbg("Fixed Io Resource\n"); - dbg(" Range base address: %08X", datafio->base_address); - dbg(" Range length: %08X", datafio->range_length); -} - -static void acpi_parse_address16_32 ( - struct acpi_bridge *ab, - union acpi_resource_data *data, - acpi_resource_type id - ) -{ - /* - * acpi_resource_address16 == acpi_resource_address32 - * acpi_resource_address16 *data16 = (acpi_resource_address16 *) data; + /* + * Per PCI firmware specification, we should run the ACPI _OSC + * method to get control of hotplug hardware before using it. + * If an _OSC is missing, we look for an OSHP to do the same thing. + * To handle different BIOS behavior, we look for _OSC and OSHP + * within the scope of the hotplug controller and its parents, upto + * the host bridge under which this controller exists. */ - struct acpi_resource_address32 *data32 = (struct acpi_resource_address32 *) data; - struct pci_resource **aprh, **tprh; - - if (id == ACPI_RSTYPE_ADDRESS16) - dbg("acpi_pciehprm:16-Bit Address Space Resource\n"); - else - dbg("acpi_pciehprm:32-Bit Address Space Resource\n"); - - switch (data32->resource_type) { - case ACPI_MEMORY_RANGE: - dbg(" Resource Type: Memory Range\n"); - aprh = &ab->mem_head; - tprh = &ab->tmem_head; - - switch (data32->attribute.memory.cache_attribute) { - case ACPI_NON_CACHEABLE_MEMORY: - dbg(" Type Specific: Noncacheable memory\n"); - break; - case ACPI_CACHABLE_MEMORY: - dbg(" Type Specific: Cacheable memory\n"); - break; - case ACPI_WRITE_COMBINING_MEMORY: - dbg(" Type Specific: Write-combining memory\n"); - break; - case ACPI_PREFETCHABLE_MEMORY: - aprh = &ab->p_mem_head; - dbg(" Type Specific: Prefetchable memory\n"); - break; - default: - dbg(" Type Specific: Invalid cache attribute\n"); + while (!handle) { + /* + * This hotplug controller was not listed in the ACPI name + * space at all. Try to get acpi handle of parent pci bus. + */ + if (!pdev || !pdev->bus->parent) break; + parent = pdev->bus->parent; + dbg("Could not find %s in acpi namespace, trying parent\n", + pci_name(pdev)); + if (!parent->self) + /* Parent must be a host bridge */ + handle = acpi_get_pci_rootbridge_handle( + pci_domain_nr(parent), + parent->number); + else + handle = DEVICE_ACPI_HANDLE( + &(parent->self->dev)); + pdev = parent->self; + } + + while (handle) { + path_name = acpi_path_name(handle); + dbg("Trying to get hotplug control for %s \n", path_name); + status = pci_osc_control_set(handle, + OSC_PCI_EXPRESS_NATIVE_HP_CONTROL); + if (status == AE_NOT_FOUND) + status = acpi_run_oshp(handle); + if (ACPI_SUCCESS(status)) { + dbg("Gained control for hotplug HW for pci %s (%s)\n", + pci_name(dev), path_name); + return 0; } - - dbg(" Type Specific: Read%s\n", ACPI_READ_WRITE_MEMORY == data32->attribute.memory.read_write_attribute ? "/Write":" Only"); - break; - - case ACPI_IO_RANGE: - dbg(" Resource Type: I/O Range\n"); - aprh = &ab->io_head; - tprh = &ab->tio_head; - - switch (data32->attribute.io.range_attribute) { - case ACPI_NON_ISA_ONLY_RANGES: - dbg(" Type Specific: Non-ISA Io Addresses\n"); - break; - case ACPI_ISA_ONLY_RANGES: - dbg(" Type Specific: ISA Io Addresses\n"); - break; - case ACPI_ENTIRE_RANGE: - dbg(" Type Specific: ISA and non-ISA Io Addresses\n"); - break; - default: - dbg(" Type Specific: Invalid range attribute\n"); + if (is_root_bridge(handle)) break; - } - break; - - case ACPI_BUS_NUMBER_RANGE: - dbg(" Resource Type: Bus Number Range(fixed)\n"); - /* fixup to be compatible with the rest of php driver */ - data32->min_address_range++; - data32->address_length--; - aprh = &ab->bus_head; - tprh = &ab->tbus_head; - break; - default: - dbg(" Resource Type: Invalid resource type. Exiting.\n"); - return; - } - - dbg(" Resource %s\n", ACPI_CONSUMER == data32->producer_consumer ? "Consumer":"Producer"); - dbg(" %s decode\n", ACPI_SUB_DECODE == data32->decode ? "Subtractive":"Positive"); - dbg(" Min address is %s fixed\n", ACPI_ADDRESS_FIXED == data32->min_address_fixed ? "":"not"); - dbg(" Max address is %s fixed\n", ACPI_ADDRESS_FIXED == data32->max_address_fixed ? "":"not"); - dbg(" Granularity: %08X\n", data32->granularity); - dbg(" Address range min: %08X\n", data32->min_address_range); - dbg(" Address range max: %08X\n", data32->max_address_range); - dbg(" Address translation offset: %08X\n", data32->address_translation_offset); - dbg(" Address Length: %08X\n", data32->address_length); - - if (0xFF != data32->resource_source.index) { - dbg(" Resource Source Index: %X\n", data32->resource_source.index); - /* dbg(" Resource Source: %s\n", data32->resource_source.string_ptr); */ - } - - pciehprm_add_resource(aprh, data32->min_address_range, data32->address_length); -} - -static acpi_status acpi_parse_crs( - struct acpi_bridge *ab, - struct acpi_resource *crsbuf - ) -{ - acpi_status status = AE_OK; - struct acpi_resource *resource = crsbuf; - u8 count = 0; - u8 done = 0; - - while (!done) { - dbg("acpi_pciehprm: PCI bus 0x%x Resource structure %x.\n", ab->bus, count++); - switch (resource->id) { - case ACPI_RSTYPE_IRQ: - dbg("Irq -------- Resource\n"); - break; - case ACPI_RSTYPE_DMA: - dbg("DMA -------- Resource\n"); - break; - case ACPI_RSTYPE_START_DPF: - dbg("Start DPF -------- Resource\n"); - break; - case ACPI_RSTYPE_END_DPF: - dbg("End DPF -------- Resource\n"); - break; - case ACPI_RSTYPE_IO: - acpi_parse_io (ab, &resource->data); - break; - case ACPI_RSTYPE_FIXED_IO: - acpi_parse_fixed_io (ab, &resource->data); - break; - case ACPI_RSTYPE_VENDOR: - dbg("Vendor -------- Resource\n"); - break; - case ACPI_RSTYPE_END_TAG: - dbg("End_tag -------- Resource\n"); - done = 1; - break; - case ACPI_RSTYPE_MEM24: - dbg("Mem24 -------- Resource\n"); - break; - case ACPI_RSTYPE_MEM32: - dbg("Mem32 -------- Resource\n"); - break; - case ACPI_RSTYPE_FIXED_MEM32: - dbg("Fixed Mem32 -------- Resource\n"); - break; - case ACPI_RSTYPE_ADDRESS16: - acpi_parse_address16_32(ab, &resource->data, ACPI_RSTYPE_ADDRESS16); - break; - case ACPI_RSTYPE_ADDRESS32: - acpi_parse_address16_32(ab, &resource->data, ACPI_RSTYPE_ADDRESS32); - break; - case ACPI_RSTYPE_ADDRESS64: - info("Address64 -------- Resource unparsed\n"); - break; - case ACPI_RSTYPE_EXT_IRQ: - dbg("Ext Irq -------- Resource\n"); - break; - default: - dbg("Invalid -------- resource type 0x%x\n", resource->id); - break; - } - - resource = (struct acpi_resource *) ((char *)resource + resource->length); - } - - return status; -} - -static acpi_status acpi_get_crs( struct acpi_bridge *ab) -{ - acpi_status status; - struct acpi_resource *crsbuf; - - status = acpi_evaluate_crs(ab->handle, &crsbuf); - if (ACPI_SUCCESS(status)) { - status = acpi_parse_crs(ab, crsbuf); - kfree(crsbuf); - - pciehp_resource_sort_and_combine(&ab->bus_head); - pciehp_resource_sort_and_combine(&ab->io_head); - pciehp_resource_sort_and_combine(&ab->mem_head); - pciehp_resource_sort_and_combine(&ab->p_mem_head); - - pciehprm_add_resources (&ab->tbus_head, ab->bus_head); - pciehprm_add_resources (&ab->tio_head, ab->io_head); - pciehprm_add_resources (&ab->tmem_head, ab->mem_head); - pciehprm_add_resources (&ab->tp_mem_head, ab->p_mem_head); - } - - return status; -} - -/* find acpi_bridge downword from ab. */ -static struct acpi_bridge * -find_acpi_bridge_by_bus( - struct acpi_bridge *ab, - int seg, - int bus /* pdev->subordinate->number */ - ) -{ - struct acpi_bridge *lab = NULL; - - if (!ab) - return NULL; - - if ((ab->bus == bus) && (ab->seg == seg)) - return ab; - - if (ab->child) - lab = find_acpi_bridge_by_bus(ab->child, seg, bus); - - if (!lab) - if (ab->next) - lab = find_acpi_bridge_by_bus(ab->next, seg, bus); - - return lab; -} - -/* - * Build a device tree of ACPI PCI Bridges - */ -static void pciehprm_acpi_register_a_bridge ( - struct acpi_bridge **head, - struct acpi_bridge *pab, /* parent bridge to which child bridge is added */ - struct acpi_bridge *cab /* child bridge to add */ - ) -{ - struct acpi_bridge *lpab; - struct acpi_bridge *lcab; - - lpab = find_acpi_bridge_by_bus(*head, pab->seg, pab->bus); - if (!lpab) { - if (!(pab->type & BRIDGE_TYPE_HOST)) - warn("PCI parent bridge s:b(%x:%x) not in list.\n", pab->seg, pab->bus); - pab->next = *head; - *head = pab; - lpab = pab; - } - - if ((cab->type & BRIDGE_TYPE_HOST) && (pab == cab)) - return; - - lcab = find_acpi_bridge_by_bus(*head, cab->seg, cab->bus); - if (lcab) { - if ((pab->bus != lcab->parent->bus) || (lcab->bus != cab->bus)) - err("PCI child bridge s:b(%x:%x) in list with diff parent.\n", cab->seg, cab->bus); - return; - } else - lcab = cab; - - lcab->parent = lpab; - lcab->next = lpab->child; - lpab->child = lcab; -} - -static acpi_status pciehprm_acpi_build_php_slots_callback( - acpi_handle handle, - u32 Level, - void *context, - void **retval - ) -{ - ulong bus_num; - ulong seg_num; - ulong sun, adr; - ulong padr = 0; - acpi_handle phandle = NULL; - struct acpi_bridge *pab = (struct acpi_bridge *)context; - struct acpi_bridge *lab; - acpi_status status; - u8 *path_name = acpi_path_name(handle); - - /* get _SUN */ - status = acpi_evaluate_integer(handle, METHOD_NAME__SUN, NULL, &sun); - switch(status) { - case AE_NOT_FOUND: - return AE_OK; - default: - if (ACPI_FAILURE(status)) { - err("acpi_pciehprm:%s _SUN fail=0x%x\n", path_name, status); - return status; - } - } - - /* get _ADR. _ADR must exist if _SUN exists */ - status = acpi_evaluate_integer(handle, METHOD_NAME__ADR, NULL, &adr); - if (ACPI_FAILURE(status)) { - err("acpi_pciehprm:%s _ADR fail=0x%x\n", path_name, status); - return status; - } - - dbg("acpi_pciehprm:%s sun=0x%08x adr=0x%08x\n", path_name, (u32)sun, (u32)adr); - - status = acpi_get_parent(handle, &phandle); - if (ACPI_FAILURE(status)) { - err("acpi_pciehprm:%s get_parent fail=0x%x\n", path_name, status); - return (status); - } - - bus_num = pab->bus; - seg_num = pab->seg; - - if (pab->bus == bus_num) { - lab = pab; - } else { - dbg("WARN: pab is not parent\n"); - lab = find_acpi_bridge_by_bus(pab, seg_num, bus_num); - if (!lab) { - dbg("acpi_pciehprm: alloc new P2P bridge(%x) for sun(%08x)\n", (u32)bus_num, (u32)sun); - lab = (struct acpi_bridge *)kmalloc(sizeof(struct acpi_bridge), GFP_KERNEL); - if (!lab) { - err("acpi_pciehprm: alloc for ab fail\n"); - return AE_NO_MEMORY; - } - memset(lab, 0, sizeof(struct acpi_bridge)); - - lab->handle = phandle; - lab->pbus = pab->bus; - lab->pdevice = (int)(padr >> 16) & 0xffff; - lab->pfunction = (int)(padr & 0xffff); - lab->bus = (int)bus_num; - lab->scanned = 0; - lab->type = BRIDGE_TYPE_P2P; - - pciehprm_acpi_register_a_bridge (&acpi_bridges_head, pab, lab); - } else - dbg("acpi_pciehprm: found P2P bridge(%x) for sun(%08x)\n", (u32)bus_num, (u32)sun); - } - - acpi_add_slot_to_php_slots(lab, (int)bus_num, handle, (u32)adr, (u32)sun); - - return (status); -} - -static int pciehprm_acpi_build_php_slots( - struct acpi_bridge *ab, - u32 depth - ) -{ - acpi_status status; - u8 *path_name = acpi_path_name(ab->handle); - - /* Walk down this pci bridge to get _SUNs if any behind P2P */ - status = acpi_walk_namespace ( ACPI_TYPE_DEVICE, - ab->handle, - depth, - pciehprm_acpi_build_php_slots_callback, - ab, - NULL ); - if (ACPI_FAILURE(status)) { - dbg("acpi_pciehprm:%s walk for _SUN on pci bridge seg:bus(%x:%x) fail=0x%x\n", path_name, ab->seg, ab->bus, status); - return -1; - } - - return 0; -} - -static void build_a_bridge( - struct acpi_bridge *pab, - struct acpi_bridge *ab - ) -{ - u8 *path_name = acpi_path_name(ab->handle); - - pciehprm_acpi_register_a_bridge (&acpi_bridges_head, pab, ab); - - switch (ab->type) { - case BRIDGE_TYPE_HOST: - dbg("acpi_pciehprm: Registered PCI HOST Bridge(%02x) on s:b:d:f(%02x:%02x:%02x:%02x) [%s]\n", - ab->bus, ab->seg, ab->pbus, ab->pdevice, ab->pfunction, path_name); - break; - case BRIDGE_TYPE_P2P: - dbg("acpi_pciehprm: Registered PCI P2P Bridge(%02x-%02x) on s:b:d:f(%02x:%02x:%02x:%02x) [%s]\n", - ab->pbus, ab->bus, ab->seg, ab->pbus, ab->pdevice, ab->pfunction, path_name); - break; - }; - - /* build any immediate PHP slots under this pci bridge */ - pciehprm_acpi_build_php_slots(ab, 1); -} - -static struct acpi_bridge * add_p2p_bridge( - acpi_handle handle, - struct acpi_bridge *pab, /* parent */ - ulong adr - ) -{ - struct acpi_bridge *ab; - struct pci_dev *pdev; - ulong devnum, funcnum; - u8 *path_name = acpi_path_name(handle); - - ab = (struct acpi_bridge *) kmalloc (sizeof(struct acpi_bridge), GFP_KERNEL); - if (!ab) { - err("acpi_pciehprm: alloc for ab fail\n"); - return NULL; - } - memset(ab, 0, sizeof(struct acpi_bridge)); - - devnum = (adr >> 16) & 0xffff; - funcnum = adr & 0xffff; - - pdev = pci_find_slot(pab->bus, PCI_DEVFN(devnum, funcnum)); - if (!pdev || !pdev->subordinate) { - err("acpi_pciehprm:%s is not a P2P Bridge\n", path_name); - kfree(ab); - return NULL; - } - - ab->handle = handle; - ab->seg = pab->seg; - ab->pbus = pab->bus; /* or pdev->bus->number */ - ab->pdevice = devnum; /* or PCI_SLOT(pdev->devfn) */ - ab->pfunction = funcnum; /* or PCI_FUNC(pdev->devfn) */ - ab->bus = pdev->subordinate->number; - ab->scanned = 0; - ab->type = BRIDGE_TYPE_P2P; - - dbg("acpi_pciehprm: P2P(%x-%x) on pci=b:d:f(%x:%x:%x) acpi=b:d:f(%x:%x:%x) [%s]\n", - pab->bus, ab->bus, pdev->bus->number, PCI_SLOT(pdev->devfn), PCI_FUNC(pdev->devfn), - pab->bus, (u32)devnum, (u32)funcnum, path_name); - - build_a_bridge(pab, ab); - - return ab; -} - -static acpi_status scan_p2p_bridge( - acpi_handle handle, - u32 Level, - void *context, - void **retval - ) -{ - struct acpi_bridge *pab = (struct acpi_bridge *)context; - struct acpi_bridge *ab; - acpi_status status; - ulong adr = 0; - u8 *path_name = acpi_path_name(handle); - ulong devnum, funcnum; - struct pci_dev *pdev; - - /* get device, function */ - status = acpi_evaluate_integer(handle, METHOD_NAME__ADR, NULL, &adr); - if (ACPI_FAILURE(status)) { - if (status != AE_NOT_FOUND) - err("acpi_pciehprm:%s _ADR fail=0x%x\n", path_name, status); - return AE_OK; - } - - devnum = (adr >> 16) & 0xffff; - funcnum = adr & 0xffff; - - pdev = pci_find_slot(pab->bus, PCI_DEVFN(devnum, funcnum)); - if (!pdev) - return AE_OK; - if (!pdev->subordinate) - return AE_OK; - - ab = add_p2p_bridge(handle, pab, adr); - if (ab) { - status = acpi_walk_namespace ( ACPI_TYPE_DEVICE, - handle, - (u32)1, - scan_p2p_bridge, - ab, - NULL); + chandle = handle; + status = acpi_get_parent(chandle, &handle); if (ACPI_FAILURE(status)) - dbg("acpi_pciehprm:%s find_p2p fail=0x%x\n", path_name, status); - } - - return AE_OK; -} - -static struct acpi_bridge * add_host_bridge( - acpi_handle handle, - ulong segnum, - ulong busnum - ) -{ - ulong adr = 0; - acpi_status status; - struct acpi_bridge *ab; - u8 *path_name = acpi_path_name(handle); - - /* get device, function: host br adr is always 0000 though. */ - status = acpi_evaluate_integer(handle, METHOD_NAME__ADR, NULL, &adr); - if (ACPI_FAILURE(status)) { - err("acpi_pciehprm:%s _ADR fail=0x%x\n", path_name, status); - return NULL; - } - dbg("acpi_pciehprm: ROOT PCI seg(0x%x)bus(0x%x)dev(0x%x)func(0x%x) [%s]\n", (u32)segnum, - (u32)busnum, (u32)(adr >> 16) & 0xffff, (u32)adr & 0xffff, path_name); - - ab = (struct acpi_bridge *) kmalloc (sizeof(struct acpi_bridge), GFP_KERNEL); - if (!ab) { - err("acpi_pciehprm: alloc for ab fail\n"); - return NULL; - } - memset(ab, 0, sizeof(struct acpi_bridge)); - - ab->handle = handle; - ab->seg = (int)segnum; - ab->bus = ab->pbus = (int)busnum; - ab->pdevice = (int)(adr >> 16) & 0xffff; - ab->pfunction = (int)(adr & 0xffff); - ab->scanned = 0; - ab->type = BRIDGE_TYPE_HOST; - - /* get root pci bridge's current resources */ - status = acpi_get_crs(ab); - if (ACPI_FAILURE(status)) { - err("acpi_pciehprm:%s evaluate _CRS fail=0x%x\n", path_name, status); - kfree(ab); - return NULL; - } - - status = pci_osc_control_set (OSC_PCI_EXPRESS_NATIVE_HP_CONTROL); - if (ACPI_FAILURE(status)) { - err("%s: status %x\n", __FUNCTION__, status); - osc_run_status = (status == AE_NOT_FOUND) ? OSC_NOT_EXIST : OSC_RUN_FAILED; - } else { - osc_run_status = NC_RUN_SUCCESS; - } - dbg("%s: osc_run_status %x\n", __FUNCTION__, osc_run_status); - - build_a_bridge(ab, ab); - - return ab; -} - -static acpi_status acpi_scan_from_root_pci_callback ( - acpi_handle handle, - u32 Level, - void *context, - void **retval - ) -{ - ulong segnum = 0; - ulong busnum = 0; - acpi_status status; - struct acpi_bridge *ab; - u8 *path_name = acpi_path_name(handle); - - /* get bus number of this pci root bridge */ - status = acpi_evaluate_integer(handle, METHOD_NAME__SEG, NULL, &segnum); - if (ACPI_FAILURE(status)) { - if (status != AE_NOT_FOUND) { - err("acpi_pciehprm:%s evaluate _SEG fail=0x%x\n", path_name, status); - return status; - } - segnum = 0; - } - - /* get bus number of this pci root bridge */ - status = acpi_evaluate_integer(handle, METHOD_NAME__BBN, NULL, &busnum); - if (ACPI_FAILURE(status)) { - err("acpi_pciehprm:%s evaluate _BBN fail=0x%x\n", path_name, status); - return (status); - } - - ab = add_host_bridge(handle, segnum, busnum); - if (ab) { - status = acpi_walk_namespace ( ACPI_TYPE_DEVICE, - handle, - 1, - scan_p2p_bridge, - ab, - NULL); - if (ACPI_FAILURE(status)) - dbg("acpi_pciehprm:%s find_p2p fail=0x%x\n", path_name, status); + break; } - return AE_OK; + err("Cannot get control of hotplug hardware for pci %s\n", + pci_name(dev)); + return -1; } -static int pciehprm_acpi_scan_pci (void) +void pciehp_get_hp_params_from_firmware(struct pci_dev *dev, + struct hotplug_params *hpp) { - acpi_status status; + acpi_status status = AE_NOT_FOUND; + struct pci_dev *pdev = dev; /* - * TBD: traverse LDM device tree with the help of - * unified ACPI augmented for php device population. + * _HPP settings apply to all child buses, until another _HPP is + * encountered. If we don't find an _HPP for the input pci 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 */ - status = acpi_get_devices ( PCI_ROOT_HID_STRING, - acpi_scan_from_root_pci_callback, - NULL, - NULL ); - if (ACPI_FAILURE(status)) { - err("acpi_pciehprm:get_device PCI ROOT HID fail=0x%x\n", status); - return -1; - } - - return 0; -} - -int pciehprm_init(enum php_ctlr_type ctlr_type) -{ - int rc; - - if (ctlr_type != PCI) - return -ENODEV; - - dbg("pciehprm ACPI init \n"); - acpi_bridges_head = NULL; - - /* construct PCI bus:device tree of acpi_handles */ - rc = pciehprm_acpi_scan_pci(); - if (rc) - return rc; - - if ((oshp_run_status != NC_RUN_SUCCESS) && (osc_run_status != NC_RUN_SUCCESS)) { - err("Fails to gain control of native hot-plug\n"); - rc = -ENODEV; - } - - dbg("pciehprm ACPI init %s\n", (rc)?"fail":"success"); - return rc; -} - -static void free_a_slot(struct acpi_php_slot *aps) -{ - dbg(" free a php func of slot(0x%02x) on PCI b:d:f=0x%02x:%02x:%02x\n", aps->sun, aps->bus, aps->dev, aps->fun); - - free_pci_resource (aps->io_head); - free_pci_resource (aps->bus_head); - free_pci_resource (aps->mem_head); - free_pci_resource (aps->p_mem_head); - - kfree(aps); -} - -static void free_a_bridge( struct acpi_bridge *ab) -{ - struct acpi_php_slot *aps, *next; - - switch (ab->type) { - case BRIDGE_TYPE_HOST: - dbg("Free ACPI PCI HOST Bridge(%x) [%s] on s:b:d:f(%x:%x:%x:%x)\n", - ab->bus, acpi_path_name(ab->handle), ab->seg, ab->pbus, ab->pdevice, ab->pfunction); - break; - case BRIDGE_TYPE_P2P: - dbg("Free ACPI PCI P2P Bridge(%x-%x) [%s] on s:b:d:f(%x:%x:%x:%x)\n", - ab->pbus, ab->bus, acpi_path_name(ab->handle), ab->seg, ab->pbus, ab->pdevice, ab->pfunction); - break; - }; - - /* free slots first */ - for (aps = ab->slots; aps; aps = next) { - next = aps->next; - free_a_slot(aps); - } - - free_pci_resource (ab->io_head); - free_pci_resource (ab->tio_head); - free_pci_resource (ab->bus_head); - free_pci_resource (ab->tbus_head); - free_pci_resource (ab->mem_head); - free_pci_resource (ab->tmem_head); - free_pci_resource (ab->p_mem_head); - free_pci_resource (ab->tp_mem_head); - - kfree(ab); -} - -static void pciehprm_free_bridges ( struct acpi_bridge *ab) -{ - if (!ab) - return; - - if (ab->child) - pciehprm_free_bridges (ab->child); - - if (ab->next) - pciehprm_free_bridges (ab->next); - - free_a_bridge(ab); -} - -void pciehprm_cleanup(void) -{ - pciehprm_free_bridges (acpi_bridges_head); -} - -static int get_number_of_slots ( - struct acpi_bridge *ab, - int selfonly - ) -{ - struct acpi_php_slot *aps; - int prev_slot = -1; - int slot_num = 0; - - for ( aps = ab->slots; aps; aps = aps->next) - if (aps->dev != prev_slot) { - prev_slot = aps->dev; - slot_num++; - } - - if (ab->child) - slot_num += get_number_of_slots (ab->child, 0); - - if (selfonly) - return slot_num; - - if (ab->next) - slot_num += get_number_of_slots (ab->next, 0); - - return slot_num; -} - -static int print_acpi_resources (struct acpi_bridge *ab) -{ - struct acpi_php_slot *aps; - int i; - - switch (ab->type) { - case BRIDGE_TYPE_HOST: - dbg("PCI HOST Bridge (%x) [%s]\n", ab->bus, acpi_path_name(ab->handle)); - break; - case BRIDGE_TYPE_P2P: - dbg("PCI P2P Bridge (%x-%x) [%s]\n", ab->pbus, ab->bus, acpi_path_name(ab->handle)); - break; - }; - - print_pci_resources (ab); - - for ( i = -1, aps = ab->slots; aps; aps = aps->next) { - if (aps->dev == i) - continue; - dbg(" Slot sun(%x) s:b:d:f(%02x:%02x:%02x:%02x)\n", aps->sun, aps->seg, aps->bus, aps->dev, aps->fun); - print_slot_resources(aps); - i = aps->dev; - } - - if (ab->child) - print_acpi_resources (ab->child); - - if (ab->next) - print_acpi_resources (ab->next); - - return 0; -} - -int pciehprm_print_pirt(void) -{ - dbg("PCIEHPRM ACPI Slots\n"); - if (acpi_bridges_head) - print_acpi_resources (acpi_bridges_head); - - return 0; -} - -static struct acpi_php_slot * get_acpi_slot ( - struct acpi_bridge *ab, - u32 sun - ) -{ - struct acpi_php_slot *aps = NULL; - - for ( aps = ab->slots; aps; aps = aps->next) - if (aps->sun == sun) - return aps; - - if (!aps && ab->child) { - aps = (struct acpi_php_slot *)get_acpi_slot (ab->child, sun); - if (aps) - return aps; - } - - if (!aps && ab->next) { - aps = (struct acpi_php_slot *)get_acpi_slot (ab->next, sun); - if (aps) - return aps; - } - - return aps; - -} - -#if 0 -void * pciehprm_get_slot(struct slot *slot) -{ - struct acpi_bridge *ab = acpi_bridges_head; - struct acpi_php_slot *aps = get_acpi_slot (ab, slot->number); - - aps->slot = slot; - - dbg("Got acpi slot sun(%x): s:b:d:f(%x:%x:%x:%x)\n", aps->sun, aps->seg, aps->bus, aps->dev, aps->fun); - - return (void *)aps; -} -#endif - -static void pciehprm_dump_func_res( struct pci_func *fun) -{ - struct pci_func *func = fun; - - if (func->bus_head) { - dbg(": BUS Resources:\n"); - print_pci_resource (func->bus_head); - } - if (func->io_head) { - dbg(": IO Resources:\n"); - print_pci_resource (func->io_head); - } - if (func->mem_head) { - dbg(": MEM Resources:\n"); - print_pci_resource (func->mem_head); - } - if (func->p_mem_head) { - dbg(": PMEM Resources:\n"); - print_pci_resource (func->p_mem_head); - } -} - -static void pciehprm_dump_ctrl_res( struct controller *ctlr) -{ - struct controller *ctrl = ctlr; - - if (ctrl->bus_head) { - dbg(": BUS Resources:\n"); - print_pci_resource (ctrl->bus_head); - } - if (ctrl->io_head) { - dbg(": IO Resources:\n"); - print_pci_resource (ctrl->io_head); - } - if (ctrl->mem_head) { - dbg(": MEM Resources:\n"); - print_pci_resource (ctrl->mem_head); - } - if (ctrl->p_mem_head) { - dbg(": PMEM Resources:\n"); - print_pci_resource (ctrl->p_mem_head); - } -} - -static int pciehprm_get_used_resources ( - struct controller *ctrl, - struct pci_func *func - ) -{ - return pciehp_save_used_resources (ctrl, func, !DISABLE_CARD); -} - -static int configure_existing_function( - struct controller *ctrl, - struct pci_func *func - ) -{ - int rc; - - /* see how much resources the func has used. */ - rc = pciehprm_get_used_resources (ctrl, func); - - if (!rc) { - /* subtract the resources used by the func from ctrl resources */ - rc = pciehprm_delete_resources (&ctrl->bus_head, func->bus_head); - rc |= pciehprm_delete_resources (&ctrl->io_head, func->io_head); - rc |= pciehprm_delete_resources (&ctrl->mem_head, func->mem_head); - rc |= pciehprm_delete_resources (&ctrl->p_mem_head, func->p_mem_head); - if (rc) - warn("aCEF: cannot del used resources\n"); - } else - err("aCEF: cannot get used resources\n"); - - return rc; -} - -static int bind_pci_resources_to_slots ( struct controller *ctrl) -{ - struct pci_func *func, new_func; - int busn = ctrl->slot_bus; - int devn, funn; - u32 vid; - - for (devn = 0; devn < 32; devn++) { - for (funn = 0; funn < 8; funn++) { - /* - if (devn == ctrl->device && funn == ctrl->function) - continue; - */ - /* find out if this entry is for an occupied slot */ - vid = 0xFFFFFFFF; - pci_bus_read_config_dword(ctrl->pci_dev->subordinate, PCI_DEVFN(devn, funn), PCI_VENDOR_ID, &vid); - - if (vid != 0xFFFFFFFF) { - dbg("%s: vid = %x\n", __FUNCTION__, vid); - func = pciehp_slot_find(busn, devn, funn); - if (!func) { - memset(&new_func, 0, sizeof(struct pci_func)); - new_func.bus = busn; - new_func.device = devn; - new_func.function = funn; - new_func.is_a_board = 1; - configure_existing_function(ctrl, &new_func); - pciehprm_dump_func_res(&new_func); - } else { - configure_existing_function(ctrl, func); - pciehprm_dump_func_res(func); - } - dbg("aCCF:existing PCI 0x%x Func ResourceDump\n", ctrl->bus); - } - } - } - - return 0; -} - -static int bind_pci_resources( - struct controller *ctrl, - struct acpi_bridge *ab - ) -{ - int status = 0; - - if (ab->bus_head) { - dbg("bapr: BUS Resources add on PCI 0x%x\n", ab->bus); - status = pciehprm_add_resources (&ctrl->bus_head, ab->bus_head); - if (pciehprm_delete_resources (&ab->bus_head, ctrl->bus_head)) - warn("bapr: cannot sub BUS Resource on PCI 0x%x\n", ab->bus); - if (status) { - err("bapr: BUS Resource add on PCI 0x%x: fail=0x%x\n", ab->bus, status); - return status; - } - } else - info("bapr: No BUS Resource on PCI 0x%x.\n", ab->bus); - - if (ab->io_head) { - dbg("bapr: IO Resources add on PCI 0x%x\n", ab->bus); - status = pciehprm_add_resources (&ctrl->io_head, ab->io_head); - if (pciehprm_delete_resources (&ab->io_head, ctrl->io_head)) - warn("bapr: cannot sub IO Resource on PCI 0x%x\n", ab->bus); - if (status) { - err("bapr: IO Resource add on PCI 0x%x: fail=0x%x\n", ab->bus, status); - return status; - } - } else - info("bapr: No IO Resource on PCI 0x%x.\n", ab->bus); - - if (ab->mem_head) { - dbg("bapr: MEM Resources add on PCI 0x%x\n", ab->bus); - status = pciehprm_add_resources (&ctrl->mem_head, ab->mem_head); - if (pciehprm_delete_resources (&ab->mem_head, ctrl->mem_head)) - warn("bapr: cannot sub MEM Resource on PCI 0x%x\n", ab->bus); - if (status) { - err("bapr: MEM Resource add on PCI 0x%x: fail=0x%x\n", ab->bus, status); - return status; - } - } else - info("bapr: No MEM Resource on PCI 0x%x.\n", ab->bus); - - if (ab->p_mem_head) { - dbg("bapr: PMEM Resources add on PCI 0x%x\n", ab->bus); - status = pciehprm_add_resources (&ctrl->p_mem_head, ab->p_mem_head); - if (pciehprm_delete_resources (&ab->p_mem_head, ctrl->p_mem_head)) - warn("bapr: cannot sub PMEM Resource on PCI 0x%x\n", ab->bus); - if (status) { - err("bapr: PMEM Resource add on PCI 0x%x: fail=0x%x\n", ab->bus, status); - return status; - } - } else - info("bapr: No PMEM Resource on PCI 0x%x.\n", ab->bus); - - return status; -} - -static int no_pci_resources( struct acpi_bridge *ab) -{ - return !(ab->p_mem_head || ab->mem_head || ab->io_head || ab->bus_head); -} - -static int find_pci_bridge_resources ( - struct controller *ctrl, - struct acpi_bridge *ab - ) -{ - int rc = 0; - struct pci_func func; - - memset(&func, 0, sizeof(struct pci_func)); - - func.bus = ab->pbus; - func.device = ab->pdevice; - func.function = ab->pfunction; - func.is_a_board = 1; - - /* Get used resources for this PCI bridge */ - rc = pciehp_save_used_resources (ctrl, &func, !DISABLE_CARD); - - ab->io_head = func.io_head; - ab->mem_head = func.mem_head; - ab->p_mem_head = func.p_mem_head; - ab->bus_head = func.bus_head; - if (ab->bus_head) - pciehprm_delete_resource(&ab->bus_head, ctrl->pci_dev->subordinate->number, 1); - - return rc; -} - -static int get_pci_resources_from_bridge( - struct controller *ctrl, - struct acpi_bridge *ab - ) -{ - int rc = 0; - - dbg("grfb: Get Resources for PCI 0x%x from actual PCI bridge 0x%x.\n", ctrl->bus, ab->bus); - - rc = find_pci_bridge_resources (ctrl, ab); - - pciehp_resource_sort_and_combine(&ab->bus_head); - pciehp_resource_sort_and_combine(&ab->io_head); - pciehp_resource_sort_and_combine(&ab->mem_head); - pciehp_resource_sort_and_combine(&ab->p_mem_head); - - pciehprm_add_resources (&ab->tbus_head, ab->bus_head); - pciehprm_add_resources (&ab->tio_head, ab->io_head); - pciehprm_add_resources (&ab->tmem_head, ab->mem_head); - pciehprm_add_resources (&ab->tp_mem_head, ab->p_mem_head); - - return rc; -} - -static int get_pci_resources( - struct controller *ctrl, - struct acpi_bridge *ab - ) -{ - int rc = 0; - - if (no_pci_resources(ab)) { - dbg("spbr:PCI 0x%x has no resources. Get parent resources.\n", ab->bus); - rc = get_pci_resources_from_bridge(ctrl, ab); - } - - return rc; -} - -/* - * Get resources for this ctrl. - * 1. get total resources from ACPI _CRS or bridge (this ctrl) - * 2. find used resources of existing adapters - * 3. subtract used resources from total resources - */ -int pciehprm_find_available_resources( struct controller *ctrl) -{ - int rc = 0; - struct acpi_bridge *ab; - - ab = find_acpi_bridge_by_bus(acpi_bridges_head, ctrl->seg, ctrl->pci_dev->subordinate->number); - if (!ab) { - err("pfar:cannot locate acpi bridge of PCI 0x%x.\n", ctrl->pci_dev->subordinate->number); - return -1; - } - if (no_pci_resources(ab)) { - rc = get_pci_resources(ctrl, ab); - if (rc) { - err("pfar:cannot get pci resources of PCI 0x%x.\n", ctrl->pci_dev->subordinate->number); - return -1; - } - } - - rc = bind_pci_resources(ctrl, ab); - dbg("pfar:pre-Bind PCI 0x%x Ctrl Resource Dump\n", ctrl->pci_dev->subordinate->number); - pciehprm_dump_ctrl_res(ctrl); - - bind_pci_resources_to_slots (ctrl); - - dbg("pfar:post-Bind PCI 0x%x Ctrl Resource Dump\n", ctrl->pci_dev->subordinate->number); - pciehprm_dump_ctrl_res(ctrl); - - return rc; -} - -int pciehprm_set_hpp( - struct controller *ctrl, - struct pci_func *func, - u8 card_type - ) -{ - struct acpi_bridge *ab; - struct pci_bus lpci_bus, *pci_bus; - int rc = 0; - unsigned int devfn; - u8 cls= 0x08; /* default cache line size */ - u8 lt = 0x40; /* default latency timer */ - u8 ep = 0; - u8 es = 0; - - memcpy(&lpci_bus, ctrl->pci_bus, sizeof(lpci_bus)); - pci_bus = &lpci_bus; - pci_bus->number = func->bus; - devfn = PCI_DEVFN(func->device, func->function); - - ab = find_acpi_bridge_by_bus(acpi_bridges_head, ctrl->seg, ctrl->bus); - - if (ab) { - if (ab->_hpp) { - lt = (u8)ab->_hpp->latency_timer; - cls = (u8)ab->_hpp->cache_line_size; - ep = (u8)ab->_hpp->enable_perr; - es = (u8)ab->_hpp->enable_serr; - } else - dbg("_hpp: no _hpp for B/D/F=%#x/%#x/%#x. use default value\n", func->bus, func->device, func->function); - } else - dbg("_hpp: no acpi bridge for B/D/F = %#x/%#x/%#x. use default value\n", func->bus, func->device, func->function); - - - if (card_type == PCI_HEADER_TYPE_BRIDGE) { - /* set subordinate Latency Timer */ - rc |= pci_bus_write_config_byte(pci_bus, devfn, PCI_SEC_LATENCY_TIMER, lt); + while (pdev && (ACPI_FAILURE(status))) { + acpi_handle handle = DEVICE_ACPI_HANDLE(&(pdev->dev)); + if (!handle) + break; + status = acpi_run_hpp(handle, hpp); + if (!(pdev->bus->parent)) + break; + /* Check if a parent object supports _HPP */ + pdev = pdev->bus->parent->self; } - - /* set base Latency Timer */ - rc |= pci_bus_write_config_byte(pci_bus, devfn, PCI_LATENCY_TIMER, lt); - dbg(" set latency timer =0x%02x: %x\n", lt, rc); - - rc |= pci_bus_write_config_byte(pci_bus, devfn, PCI_CACHE_LINE_SIZE, cls); - dbg(" set cache_line_size=0x%02x: %x\n", cls, rc); - - return rc; } -void pciehprm_enable_card( - struct controller *ctrl, - struct pci_func *func, - u8 card_type) -{ - u16 command, cmd, bcommand, bcmd; - struct pci_bus lpci_bus, *pci_bus; - struct acpi_bridge *ab; - unsigned int devfn; - int rc; - - memcpy(&lpci_bus, ctrl->pci_bus, sizeof(lpci_bus)); - pci_bus = &lpci_bus; - pci_bus->number = func->bus; - devfn = PCI_DEVFN(func->device, func->function); - - rc = pci_bus_read_config_word(pci_bus, devfn, PCI_COMMAND, &command); - - if (card_type == PCI_HEADER_TYPE_BRIDGE) { - rc = pci_bus_read_config_word(pci_bus, devfn, PCI_BRIDGE_CONTROL, &bcommand); - } - - cmd = command = command | PCI_COMMAND_MASTER | PCI_COMMAND_INVALIDATE - | PCI_COMMAND_IO | PCI_COMMAND_MEMORY; - bcmd = bcommand = bcommand | PCI_BRIDGE_CTL_NO_ISA; - - ab = find_acpi_bridge_by_bus(acpi_bridges_head, ctrl->seg, ctrl->bus); - if (ab) { - if (ab->_hpp) { - if (ab->_hpp->enable_perr) { - command |= PCI_COMMAND_PARITY; - bcommand |= PCI_BRIDGE_CTL_PARITY; - } else { - command &= ~PCI_COMMAND_PARITY; - bcommand &= ~PCI_BRIDGE_CTL_PARITY; - } - if (ab->_hpp->enable_serr) { - command |= PCI_COMMAND_SERR; - bcommand |= PCI_BRIDGE_CTL_SERR; - } else { - command &= ~PCI_COMMAND_SERR; - bcommand &= ~PCI_BRIDGE_CTL_SERR; - } - } else - dbg("no _hpp for B/D/F = %#x/%#x/%#x.\n", func->bus, func->device, func->function); - } else - dbg("no acpi bridge for B/D/F = %#x/%#x/%#x.\n", func->bus, func->device, func->function); - - if (command != cmd) { - rc = pci_bus_write_config_word(pci_bus, devfn, PCI_COMMAND, command); - } - if ((card_type == PCI_HEADER_TYPE_BRIDGE) && (bcommand != bcmd)) { - rc = pci_bus_write_config_word(pci_bus, devfn, PCI_BRIDGE_CONTROL, bcommand); - } -} diff --git a/drivers/pci/hotplug/pciehprm_nonacpi.c b/drivers/pci/hotplug/pciehprm_nonacpi.c index 79a0aa623..29180dfe8 100644 --- a/drivers/pci/hotplug/pciehprm_nonacpi.c +++ b/drivers/pci/hotplug/pciehprm_nonacpi.c @@ -23,479 +23,25 @@ * 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 , * */ -#include #include #include #include +#include #include -#include -#include -#ifdef CONFIG_IA64 -#include -#endif +#include #include "pciehp.h" -#include "pciehprm.h" -#include "pciehprm_nonacpi.h" - -void pciehprm_cleanup(void) +void pciehp_get_hp_params_from_firmware(struct pci_dev *dev, + struct hotplug_params *hpp) { return; } -int pciehprm_print_pirt(void) -{ - return 0; -} - -int pciehprm_get_physical_slot_number(struct controller *ctrl, u32 *sun, u8 busnum, u8 devnum) -{ - - *sun = (u8) (ctrl->first_slot); - return 0; -} - - -static void print_pci_resource ( struct pci_resource *aprh) -{ - struct pci_resource *res; - - for (res = aprh; res; res = res->next) - dbg(" base= 0x%x length= 0x%x\n", res->base, res->length); -} - - -static void phprm_dump_func_res( struct pci_func *fun) -{ - struct pci_func *func = fun; - - if (func->bus_head) { - dbg(": BUS Resources:\n"); - print_pci_resource (func->bus_head); - } - if (func->io_head) { - dbg(": IO Resources:\n"); - print_pci_resource (func->io_head); - } - if (func->mem_head) { - dbg(": MEM Resources:\n"); - print_pci_resource (func->mem_head); - } - if (func->p_mem_head) { - dbg(": PMEM Resources:\n"); - print_pci_resource (func->p_mem_head); - } -} - -static int phprm_get_used_resources ( - struct controller *ctrl, - struct pci_func *func - ) -{ - return pciehp_save_used_resources (ctrl, func, !DISABLE_CARD); -} - -static int phprm_delete_resource( - struct pci_resource **aprh, - ulong base, - ulong size) -{ - struct pci_resource *res; - struct pci_resource *prevnode; - struct pci_resource *split_node; - ulong tbase; - - pciehp_resource_sort_and_combine(aprh); - - for (res = *aprh; res; res = res->next) { - if (res->base > base) - continue; - - if ((res->base + res->length) < (base + size)) - continue; - - if (res->base < base) { - tbase = base; - - if ((res->length - (tbase - res->base)) < size) - continue; - - split_node = (struct pci_resource *) kmalloc(sizeof(struct pci_resource), GFP_KERNEL); - if (!split_node) - return -ENOMEM; - - split_node->base = res->base; - split_node->length = tbase - res->base; - res->base = tbase; - res->length -= split_node->length; - - split_node->next = res->next; - res->next = split_node; - } - - if (res->length >= size) { - split_node = (struct pci_resource*) kmalloc(sizeof(struct pci_resource), GFP_KERNEL); - if (!split_node) - return -ENOMEM; - - split_node->base = res->base + size; - split_node->length = res->length - size; - res->length = size; - - split_node->next = res->next; - res->next = split_node; - } - - if (*aprh == res) { - *aprh = res->next; - } else { - prevnode = *aprh; - while (prevnode->next != res) - prevnode = prevnode->next; - - prevnode->next = res->next; - } - res->next = NULL; - kfree(res); - break; - } - - return 0; -} - - -static int phprm_delete_resources( - struct pci_resource **aprh, - struct pci_resource *this - ) -{ - struct pci_resource *res; - - for (res = this; res; res = res->next) - phprm_delete_resource(aprh, res->base, res->length); - - return 0; -} - - -static int configure_existing_function( - struct controller *ctrl, - struct pci_func *func - ) -{ - int rc; - - /* see how much resources the func has used. */ - rc = phprm_get_used_resources (ctrl, func); - - if (!rc) { - /* subtract the resources used by the func from ctrl resources */ - rc = phprm_delete_resources (&ctrl->bus_head, func->bus_head); - rc |= phprm_delete_resources (&ctrl->io_head, func->io_head); - rc |= phprm_delete_resources (&ctrl->mem_head, func->mem_head); - rc |= phprm_delete_resources (&ctrl->p_mem_head, func->p_mem_head); - if (rc) - warn("aCEF: cannot del used resources\n"); - } else - err("aCEF: cannot get used resources\n"); - - return rc; -} - -static int pciehprm_delete_resource( - struct pci_resource **aprh, - ulong base, - ulong size) -{ - struct pci_resource *res; - struct pci_resource *prevnode; - struct pci_resource *split_node; - ulong tbase; - - pciehp_resource_sort_and_combine(aprh); - - for (res = *aprh; res; res = res->next) { - if (res->base > base) - continue; - - if ((res->base + res->length) < (base + size)) - continue; - - if (res->base < base) { - tbase = base; - - if ((res->length - (tbase - res->base)) < size) - continue; - - split_node = (struct pci_resource *) kmalloc(sizeof(struct pci_resource), GFP_KERNEL); - if (!split_node) - return -ENOMEM; - - split_node->base = res->base; - split_node->length = tbase - res->base; - res->base = tbase; - res->length -= split_node->length; - - split_node->next = res->next; - res->next = split_node; - } - - if (res->length >= size) { - split_node = (struct pci_resource*) kmalloc(sizeof(struct pci_resource), GFP_KERNEL); - if (!split_node) - return -ENOMEM; - - split_node->base = res->base + size; - split_node->length = res->length - size; - res->length = size; - - split_node->next = res->next; - res->next = split_node; - } - - if (*aprh == res) { - *aprh = res->next; - } else { - prevnode = *aprh; - while (prevnode->next != res) - prevnode = prevnode->next; - - prevnode->next = res->next; - } - res->next = NULL; - kfree(res); - break; - } - - return 0; -} - -static int bind_pci_resources_to_slots ( struct controller *ctrl) -{ - struct pci_func *func, new_func; - int busn = ctrl->slot_bus; - int devn, funn; - u32 vid; - - for (devn = 0; devn < 32; devn++) { - for (funn = 0; funn < 8; funn++) { - /* - if (devn == ctrl->device && funn == ctrl->function) - continue; - */ - /* find out if this entry is for an occupied slot */ - vid = 0xFFFFFFFF; - - pci_bus_read_config_dword(ctrl->pci_dev->subordinate, PCI_DEVFN(devn, funn), PCI_VENDOR_ID, &vid); - - if (vid != 0xFFFFFFFF) { - dbg("%s: vid = %x bus %x dev %x fun %x\n", __FUNCTION__, - vid, busn, devn, funn); - func = pciehp_slot_find(busn, devn, funn); - dbg("%s: func = %p\n", __FUNCTION__,func); - if (!func) { - memset(&new_func, 0, sizeof(struct pci_func)); - new_func.bus = busn; - new_func.device = devn; - new_func.function = funn; - new_func.is_a_board = 1; - configure_existing_function(ctrl, &new_func); - phprm_dump_func_res(&new_func); - } else { - configure_existing_function(ctrl, func); - phprm_dump_func_res(func); - } - dbg("aCCF:existing PCI 0x%x Func ResourceDump\n", ctrl->bus); - } - } - } - - return 0; -} - -static void phprm_dump_ctrl_res( struct controller *ctlr) -{ - struct controller *ctrl = ctlr; - - if (ctrl->bus_head) { - dbg(": BUS Resources:\n"); - print_pci_resource (ctrl->bus_head); - } - if (ctrl->io_head) { - dbg(": IO Resources:\n"); - print_pci_resource (ctrl->io_head); - } - if (ctrl->mem_head) { - dbg(": MEM Resources:\n"); - print_pci_resource (ctrl->mem_head); - } - if (ctrl->p_mem_head) { - dbg(": PMEM Resources:\n"); - print_pci_resource (ctrl->p_mem_head); - } -} - -/* - * phprm_find_available_resources - * - * Finds available memory, IO, and IRQ resources for programming - * devices which may be added to the system - * this function is for hot plug ADD! - * - * returns 0 if success - */ -int pciehprm_find_available_resources(struct controller *ctrl) -{ - struct pci_func func; - u32 rc; - - memset(&func, 0, sizeof(struct pci_func)); - - func.bus = ctrl->bus; - func.device = ctrl->device; - func.function = ctrl->function; - func.is_a_board = 1; - - /* Get resources for this PCI bridge */ - rc = pciehp_save_used_resources (ctrl, &func, !DISABLE_CARD); - dbg("%s: pciehp_save_used_resources rc = %d\n", __FUNCTION__, rc); - - if (func.mem_head) - func.mem_head->next = ctrl->mem_head; - ctrl->mem_head = func.mem_head; - - if (func.p_mem_head) - func.p_mem_head->next = ctrl->p_mem_head; - ctrl->p_mem_head = func.p_mem_head; - - if (func.io_head) - func.io_head->next = ctrl->io_head; - ctrl->io_head = func.io_head; - - if(func.bus_head) - func.bus_head->next = ctrl->bus_head; - ctrl->bus_head = func.bus_head; - - if (ctrl->bus_head) - pciehprm_delete_resource(&ctrl->bus_head, ctrl->pci_dev->subordinate->number, 1); - - dbg("%s:pre-Bind PCI 0x%x Ctrl Resource Dump\n", __FUNCTION__, ctrl->bus); - phprm_dump_ctrl_res(ctrl); - - dbg("%s: before bind_pci_resources_to slots\n", __FUNCTION__); - - bind_pci_resources_to_slots (ctrl); - - dbg("%s:post-Bind PCI 0x%x Ctrl Resource Dump\n", __FUNCTION__, ctrl->bus); - phprm_dump_ctrl_res(ctrl); - - return (rc); -} - -int pciehprm_set_hpp( - struct controller *ctrl, - struct pci_func *func, - u8 card_type) -{ - u32 rc; - u8 temp_byte; - struct pci_bus lpci_bus, *pci_bus; - unsigned int devfn; - memcpy(&lpci_bus, ctrl->pci_bus, sizeof(lpci_bus)); - pci_bus = &lpci_bus; - pci_bus->number = func->bus; - devfn = PCI_DEVFN(func->device, func->function); - - temp_byte = 0x40; /* hard coded value for LT */ - if (card_type == PCI_HEADER_TYPE_BRIDGE) { - /* set subordinate Latency Timer */ - rc = pci_bus_write_config_byte(pci_bus, devfn, PCI_SEC_LATENCY_TIMER, temp_byte); - - if (rc) { - dbg("%s: set secondary LT error. b:d:f(%02x:%02x:%02x)\n", __FUNCTION__, - func->bus, func->device, func->function); - return rc; - } - } - - /* set base Latency Timer */ - rc = pci_bus_write_config_byte(pci_bus, devfn, PCI_LATENCY_TIMER, temp_byte); - - if (rc) { - dbg("%s: set LT error. b:d:f(%02x:%02x:%02x)\n", __FUNCTION__, func->bus, func->device, func->function); - return rc; - } - - /* set Cache Line size */ - temp_byte = 0x08; /* hard coded value for CLS */ - - rc = pci_bus_write_config_byte(pci_bus, devfn, PCI_CACHE_LINE_SIZE, temp_byte); - - if (rc) { - dbg("%s: set CLS error. b:d:f(%02x:%02x:%02x)\n", __FUNCTION__, func->bus, func->device, func->function); - } - - /* set enable_perr */ - /* set enable_serr */ - - return rc; -} - -void pciehprm_enable_card( - struct controller *ctrl, - struct pci_func *func, - u8 card_type) -{ - u16 command, bcommand; - struct pci_bus lpci_bus, *pci_bus; - unsigned int devfn; - int rc; - - memcpy(&lpci_bus, ctrl->pci_bus, sizeof(lpci_bus)); - pci_bus = &lpci_bus; - pci_bus->number = func->bus; - devfn = PCI_DEVFN(func->device, func->function); - - rc = pci_bus_read_config_word(pci_bus, devfn, PCI_COMMAND, &command); - - command |= PCI_COMMAND_PARITY | PCI_COMMAND_SERR - | PCI_COMMAND_MASTER | PCI_COMMAND_INVALIDATE - | PCI_COMMAND_IO | PCI_COMMAND_MEMORY; - - rc = pci_bus_write_config_word(pci_bus, devfn, PCI_COMMAND, command); - - if (card_type == PCI_HEADER_TYPE_BRIDGE) { - - rc = pci_bus_read_config_word(pci_bus, devfn, PCI_BRIDGE_CONTROL, &bcommand); - - bcommand |= PCI_BRIDGE_CTL_PARITY | PCI_BRIDGE_CTL_SERR - | PCI_BRIDGE_CTL_NO_ISA; - - rc = pci_bus_write_config_word(pci_bus, devfn, PCI_BRIDGE_CONTROL, bcommand); - } -} - -static int legacy_pciehprm_init_pci(void) +int pciehp_get_hp_hw_control_from_firmware(struct pci_dev *dev) { return 0; } - -int pciehprm_init(enum php_ctlr_type ctrl_type) -{ - int retval; - - switch (ctrl_type) { - case PCI: - retval = legacy_pciehprm_init_pci(); - break; - default: - retval = -ENODEV; - break; - } - - return retval; -} diff --git a/drivers/pci/hotplug/pcihp_skeleton.c b/drivers/pci/hotplug/pcihp_skeleton.c index 8ad446605..3194d51c6 100644 --- a/drivers/pci/hotplug/pcihp_skeleton.c +++ b/drivers/pci/hotplug/pcihp_skeleton.c @@ -28,6 +28,7 @@ * */ +#include #include #include #include @@ -36,12 +37,10 @@ #include #include "pci_hotplug.h" -#define SLOT_NAME_SIZE 10 struct slot { u8 number; struct hotplug_slot *hotplug_slot; struct list_head slot_list; - char name[SLOT_NAME_SIZE]; }; static LIST_HEAD(slot_list); @@ -234,10 +233,12 @@ static void release_slot(struct hotplug_slot *hotplug_slot) dbg("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name); kfree(slot->hotplug_slot->info); + kfree(slot->hotplug_slot->name); kfree(slot->hotplug_slot); kfree(slot); } +#define SLOT_NAME_SIZE 10 static void make_slot_name(struct slot *slot) { /* @@ -256,6 +257,7 @@ static int __init init_slots(void) struct slot *slot; struct hotplug_slot *hotplug_slot; struct hotplug_slot_info *info; + char *name; int retval = -ENOMEM; int i; @@ -264,23 +266,31 @@ static int __init init_slots(void) * with the pci_hotplug subsystem. */ for (i = 0; i < num_slots; ++i) { - slot = kzalloc(sizeof(*slot), GFP_KERNEL); + slot = kmalloc(sizeof(struct slot), GFP_KERNEL); if (!slot) goto error; + memset(slot, 0, sizeof(struct slot)); - hotplug_slot = kzalloc(sizeof(*hotplug_slot), GFP_KERNEL); + hotplug_slot = kmalloc(sizeof(struct hotplug_slot), + GFP_KERNEL); if (!hotplug_slot) goto error_slot; + memset(hotplug_slot, 0, sizeof (struct hotplug_slot)); slot->hotplug_slot = hotplug_slot; - info = kzalloc(sizeof(*info), GFP_KERNEL); + info = kmalloc(sizeof(struct hotplug_slot_info), GFP_KERNEL); if (!info) goto error_hpslot; + memset(info, 0, sizeof (struct hotplug_slot_info)); hotplug_slot->info = info; + name = kmalloc(SLOT_NAME_SIZE, GFP_KERNEL); + if (!name) + goto error_info; + hotplug_slot->name = name; + slot->number = i; - hotplug_slot->name = slot->name; hotplug_slot->private = slot; hotplug_slot->release = &release_slot; make_slot_name(slot); @@ -290,16 +300,16 @@ static int __init init_slots(void) * Initialize the slot info structure with some known * good values. */ - get_power_status(hotplug_slot, &info->power_status); - get_attention_status(hotplug_slot, &info->attention_status); - get_latch_status(hotplug_slot, &info->latch_status); - get_adapter_status(hotplug_slot, &info->adapter_status); + info->power_status = get_power_status(slot); + info->attention_status = get_attention_status(slot); + info->latch_status = get_latch_status(slot); + info->adapter_status = get_adapter_status(slot); dbg("registering slot %d\n", i); retval = pci_hp_register(slot->hotplug_slot); if (retval) { err("pci_hp_register failed with error %d\n", retval); - goto error_info; + goto error_name; } /* add slot to our internal list */ @@ -307,6 +317,8 @@ static int __init init_slots(void) } return 0; +error_name: + kfree(name); error_info: kfree(info); error_hpslot: diff --git a/drivers/pci/hotplug/rpadlpar_core.c b/drivers/pci/hotplug/rpadlpar_core.c index 46825fee3..3eefe2cec 100644 --- a/drivers/pci/hotplug/rpadlpar_core.c +++ b/drivers/pci/hotplug/rpadlpar_core.c @@ -19,7 +19,7 @@ #include #include -#include +#include #include #include @@ -27,7 +27,7 @@ #include "rpaphp.h" #include "rpadlpar.h" -static DEFINE_MUTEX(rpadlpar_mutex); +static DECLARE_MUTEX(rpadlpar_sem); #define DLPAR_MODULE_NAME "rpadlpar_io" @@ -300,7 +300,7 @@ int dlpar_add_slot(char *drc_name) int node_type; int rc = -EIO; - if (mutex_lock_interruptible(&rpadlpar_mutex)) + if (down_interruptible(&rpadlpar_sem)) return -ERESTARTSYS; /* Find newly added node */ @@ -324,7 +324,7 @@ int dlpar_add_slot(char *drc_name) printk(KERN_INFO "%s: slot %s added\n", DLPAR_MODULE_NAME, drc_name); exit: - mutex_unlock(&rpadlpar_mutex); + up(&rpadlpar_sem); return rc; } @@ -417,7 +417,7 @@ int dlpar_remove_slot(char *drc_name) int node_type; int rc = 0; - if (mutex_lock_interruptible(&rpadlpar_mutex)) + if (down_interruptible(&rpadlpar_sem)) return -ERESTARTSYS; dn = find_dlpar_node(drc_name, &node_type); @@ -439,7 +439,7 @@ int dlpar_remove_slot(char *drc_name) } printk(KERN_INFO "%s: slot %s removed\n", DLPAR_MODULE_NAME, drc_name); exit: - mutex_unlock(&rpadlpar_mutex); + up(&rpadlpar_sem); return rc; } diff --git a/drivers/pci/hotplug/rpaphp_core.c b/drivers/pci/hotplug/rpaphp_core.c index 076bd6dca..6e79f5675 100644 --- a/drivers/pci/hotplug/rpaphp_core.c +++ b/drivers/pci/hotplug/rpaphp_core.c @@ -22,6 +22,7 @@ * Send feedback to * */ +#include #include #include #include @@ -359,6 +360,9 @@ static int __init rpaphp_init(void) while ((dn = of_find_node_by_type(dn, "pci"))) rpaphp_add_slot(dn); + if (!num_slots) + return -ENODEV; + return 0; } diff --git a/drivers/pci/hotplug/rpaphp_slot.c b/drivers/pci/hotplug/rpaphp_slot.c index b771196a6..78943e064 100644 --- a/drivers/pci/hotplug/rpaphp_slot.c +++ b/drivers/pci/hotplug/rpaphp_slot.c @@ -84,16 +84,19 @@ struct slot *alloc_slot_struct(struct device_node *dn, int drc_index, char *drc_ { struct slot *slot; - slot = kzalloc(sizeof(struct slot), GFP_KERNEL); + slot = kmalloc(sizeof (struct slot), GFP_KERNEL); if (!slot) goto error_nomem; - slot->hotplug_slot = kzalloc(sizeof(struct hotplug_slot), GFP_KERNEL); + memset(slot, 0, sizeof (struct slot)); + slot->hotplug_slot = kmalloc(sizeof (struct hotplug_slot), GFP_KERNEL); if (!slot->hotplug_slot) goto error_slot; - slot->hotplug_slot->info = kzalloc(sizeof(struct hotplug_slot_info), + memset(slot->hotplug_slot, 0, sizeof (struct hotplug_slot)); + slot->hotplug_slot->info = kmalloc(sizeof (struct hotplug_slot_info), GFP_KERNEL); if (!slot->hotplug_slot->info) goto error_hpslot; + memset(slot->hotplug_slot->info, 0, sizeof (struct hotplug_slot_info)); slot->hotplug_slot->name = kmalloc(BUS_ID_SIZE + 1, GFP_KERNEL); if (!slot->hotplug_slot->name) goto error_info; diff --git a/drivers/pci/hotplug/sgi_hotplug.c b/drivers/pci/hotplug/sgi_hotplug.c index f31d83c2c..a32ae82e5 100644 --- a/drivers/pci/hotplug/sgi_hotplug.c +++ b/drivers/pci/hotplug/sgi_hotplug.c @@ -3,7 +3,7 @@ * License. See the file "COPYING" in the main directory of this archive * for more details. * - * Copyright (C) 2005-2006 Silicon Graphics, Inc. All rights reserved. + * Copyright (C) 2005 Silicon Graphics, Inc. All rights reserved. * * This work was based on the 2.4/2.6 kernel development by Dick Reigner. * Work to add BIOS PROM support was completed by Mike Habeck. @@ -15,16 +15,13 @@ #include #include #include -#include #include -#include #include #include #include #include #include -#include #include #include @@ -84,7 +81,7 @@ static struct hotplug_slot_ops sn_hotplug_slot_ops = { .get_power_status = get_power_status, }; -static DEFINE_MUTEX(sn_hotplug_mutex); +static DECLARE_MUTEX(sn_hotplug_sem); static ssize_t path_show (struct hotplug_slot *bss_hotplug_slot, char *buf) @@ -104,7 +101,8 @@ 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; - u16 busnum, segment, ioboard_type; + int bricktype; + int bus_num; pcibus_info = SN_PCIBUS_BUSSOFT_INFO(pci_bus); @@ -112,14 +110,12 @@ static int sn_pci_slot_valid(struct pci_bus *pci_bus, int device) if (!(pcibus_info->pbi_valid_devices & (1 << device))) return -EPERM; - ioboard_type = sn_ioboard_to_pci_bus(pci_bus); - busnum = pcibus_info->pbi_buscommon.bs_persist_busnum; - segment = pci_domain_nr(pci_bus) & 0xf; + bricktype = MODULE_GET_BTYPE(pcibus_info->pbi_moduleid); + bus_num = pcibus_info->pbi_buscommon.bs_persist_busnum & 0xf; /* Do not allow hotplug operations on base I/O cards */ - if ((ioboard_type == L1_BRICKTYPE_IX || - ioboard_type == L1_BRICKTYPE_IA) && - (segment == 1 && busnum == 0 && device != 1)) + if ((bricktype == L1_BRICKTYPE_IX || bricktype == L1_BRICKTYPE_IA) && + (bus_num == 1 && device != 1)) return -EPERM; return 1; @@ -128,23 +124,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; - u32 asic_type; - u16 ioboard_type; + int asic_type; + int bricktype; - /* Don't register slots hanging off the TIOCA bus */ pcibus_info = SN_PCIBUS_BUSSOFT_INFO(pci_bus); + + /* Don't register slots hanging off the TIOCA 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 */ - ioboard_type = sn_ioboard_to_pci_bus(pci_bus); - switch (ioboard_type) { + bricktype = MODULE_GET_BTYPE(pcibus_info->pbi_moduleid); + switch (bricktype) { case L1_BRICKTYPE_IX: case L1_BRICKTYPE_PX: case L1_BRICKTYPE_IA: case L1_BRICKTYPE_PA: - case L1_BOARDTYPE_PCIX3SLOT: return 1; break; default: @@ -178,11 +174,14 @@ 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), - ((u16)pcibus_info->pbi_buscommon.bs_persist_busnum), + ((int)pcibus_info->pbi_buscommon.bs_persist_busnum) & 0xf, device + 1); - - sn_generate_path(pci_bus, slot->physical_path); - + 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)); slot->hotplug_slot = bss_hotplug_slot; list_add(&slot->hp_list, &sn_hp_list); @@ -231,13 +230,6 @@ static void sn_bus_free_data(struct pci_dev *dev) list_for_each_entry(child, &subordinate_bus->devices, bus_list) sn_bus_free_data(child); } - /* - * Some drivers may use dma accesses during the - * driver remove function. We release the sysdata - * areas after the driver remove functions have - * been called. - */ - sn_bus_store_sysdata(dev); sn_pci_unfixup_slot(dev); } @@ -347,7 +339,7 @@ static int enable_slot(struct hotplug_slot *bss_hotplug_slot) int rc; /* Serialize the Linux PCI infrastructure */ - mutex_lock(&sn_hotplug_mutex); + down(&sn_hotplug_sem); /* * Power-on and initialize the slot in the SN @@ -355,7 +347,7 @@ static int enable_slot(struct hotplug_slot *bss_hotplug_slot) */ rc = sn_slot_enable(bss_hotplug_slot, slot->device_num); if (rc) { - mutex_unlock(&sn_hotplug_mutex); + up(&sn_hotplug_sem); return rc; } @@ -363,7 +355,7 @@ static int enable_slot(struct hotplug_slot *bss_hotplug_slot) PCI_DEVFN(slot->device_num + 1, 0)); if (!num_funcs) { dev_dbg(slot->pci_bus->self, "no device in slot\n"); - mutex_unlock(&sn_hotplug_mutex); + up(&sn_hotplug_sem); return -ENODEV; } @@ -403,7 +395,7 @@ static int enable_slot(struct hotplug_slot *bss_hotplug_slot) if (new_ppb) pci_bus_add_devices(new_bus); - mutex_unlock(&sn_hotplug_mutex); + up(&sn_hotplug_sem); if (rc == 0) dev_dbg(slot->pci_bus->self, @@ -423,7 +415,7 @@ static int disable_slot(struct hotplug_slot *bss_hotplug_slot) int rc; /* Acquire update access to the bus */ - mutex_lock(&sn_hotplug_mutex); + down(&sn_hotplug_sem); /* is it okay to bring this slot down? */ rc = sn_slot_disable(bss_hotplug_slot, slot->device_num, @@ -437,6 +429,13 @@ static int disable_slot(struct hotplug_slot *bss_hotplug_slot) PCI_DEVFN(slot->device_num + 1, PCI_FUNC(func))); if (dev) { + /* + * Some drivers may use dma accesses during the + * driver remove function. We release the sysdata + * areas after the driver remove functions have + * been called. + */ + sn_bus_store_sysdata(dev); sn_bus_free_data(dev); pci_remove_bus_device(dev); pci_dev_put(dev); @@ -451,7 +450,7 @@ static int disable_slot(struct hotplug_slot *bss_hotplug_slot) PCI_REQ_SLOT_DISABLE); leaving: /* Release the bus lock */ - mutex_unlock(&sn_hotplug_mutex); + up(&sn_hotplug_sem); return rc; } @@ -461,13 +460,11 @@ 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); - power = pcibus_info->pbi_enabled_devices & (1 << slot->device_num); - *value = power ? 1 : 0; - mutex_unlock(&sn_hotplug_mutex); + down(&sn_hotplug_sem); + *value = pcibus_info->pbi_enabled_devices & (1 << slot->device_num); + up(&sn_hotplug_sem); return 0; } @@ -555,8 +552,8 @@ static int sn_pci_hotplug_init(void) int rc; int registered = 0; - if (!sn_prom_feature_available(PRF_HOTPLUG_SUPPORT)) { - printk(KERN_ERR "%s: PROM version does not support hotplug.\n", + if (sn_sal_rev() < SGI_HOTPLUG_PROM_REV) { + printk(KERN_ERR "%s: PROM version must be greater than 4.30\n", __FUNCTION__); return -EPERM; } diff --git a/drivers/pci/hotplug/shpchp.h b/drivers/pci/hotplug/shpchp.h index 7208b95c6..7d6f521d0 100644 --- a/drivers/pci/hotplug/shpchp.h +++ b/drivers/pci/hotplug/shpchp.h @@ -33,7 +33,6 @@ #include #include #include /* signal_pending(), struct timer_list */ -#include #include "pci_hotplug.h" @@ -46,7 +45,6 @@ extern int shpchp_poll_mode; extern int shpchp_poll_time; extern int shpchp_debug; -extern struct workqueue_struct *shpchp_wq; /*#define dbg(format, arg...) do { if (shpchp_debug) printk(KERN_DEBUG "%s: " format, MY_NAME , ## arg); } while (0)*/ #define dbg(format, arg...) do { if (shpchp_debug) printk("%s: " format, MY_NAME , ## arg); } while (0) @@ -54,8 +52,10 @@ extern struct workqueue_struct *shpchp_wq; #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 SLOT_NAME_SIZE 10 +#define SLOT_MAGIC 0x67267321 struct slot { + u32 magic; + struct slot *next; u8 bus; u8 device; u16 status; @@ -70,27 +70,26 @@ struct slot { struct hpc_ops *hpc_ops; struct hotplug_slot *hotplug_slot; struct list_head slot_list; - char name[SLOT_NAME_SIZE]; - struct work_struct work; /* work for button event */ - struct mutex lock; }; struct event_info { u32 event_type; - struct slot *p_slot; - struct work_struct work; + u8 hp_slot; }; struct controller { - struct mutex crit_sect; /* critical section mutex */ - struct mutex cmd_lock; /* command lock */ + struct controller *next; + struct semaphore crit_sect; /* critical section semaphore */ struct php_ctlr_state_s *hpc_ctlr_handle; /* HPC controller handle */ int num_slots; /* Number of slots on ctlr */ int slot_num_inc; /* 1 or -1 */ struct pci_dev *pci_dev; - struct list_head slot_list; + struct pci_bus *pci_bus; + struct event_info event_queue[10]; + struct slot *slot; struct hpc_ops *hpc_ops; wait_queue_head_t queue; /* sleep & wake process */ + u8 next_event; u8 bus; u8 device; u8 function; @@ -106,6 +105,12 @@ struct controller { volatile int cmd_busy; }; +struct hotplug_params { + u8 cache_line_size; + u8 latency_timer; + u8 enable_serr; + u8 enable_perr; +}; /* Define AMD SHPC ID */ #define PCI_DEVICE_ID_AMD_GOLAM_7450 0x7450 @@ -168,15 +173,18 @@ struct controller { * error Messages */ #define msg_initialization_err "Initialization failure, error=%d\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" +#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" /* sysfs functions for the hotplug controller info */ extern void shpchp_create_ctrl_files (struct controller *ctrl); -extern int shpchp_sysfs_enable_slot(struct slot *slot); -extern int shpchp_sysfs_disable_slot(struct slot *slot); +/* controller functions */ +extern int shpchp_event_start_thread(void); +extern void shpchp_event_stop_thread(void); +extern int shpchp_enable_slot(struct slot *slot); +extern int shpchp_disable_slot(struct slot *slot); extern u8 shpchp_handle_attention_button(u8 hp_slot, void *inst_id); extern u8 shpchp_handle_switch_change(u8 hp_slot, void *inst_id); @@ -187,28 +195,16 @@ extern u8 shpchp_handle_power_fault(u8 hp_slot, void *inst_id); extern int shpchp_save_config(struct controller *ctrl, int busnumber, int num_ctlr_slots, int first_device_num); extern int shpchp_configure_device(struct slot *p_slot); extern int shpchp_unconfigure_device(struct slot *p_slot); +extern void get_hp_hw_control_from_firmware(struct pci_dev *dev); +extern void get_hp_params_from_firmware(struct pci_dev *dev, + struct hotplug_params *hpp); +extern int shpchprm_get_physical_slot_number(struct controller *ctrl, + u32 *sun, u8 busnum, u8 devnum); extern void shpchp_remove_ctrl_files(struct controller *ctrl); -extern void cleanup_slots(struct controller *ctrl); -extern void queue_pushbutton_work(void *data); -#ifdef CONFIG_ACPI -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->bus, hpp))) - return -ENODEV; - return 0; -} -#define get_hp_hw_control_from_firmware(pdev) \ - do { \ - if (DEVICE_ACPI_HANDLE(&(pdev->dev))) \ - acpi_run_oshp(DEVICE_ACPI_HANDLE(&(pdev->dev))); \ - } while (0) -#else -#define get_hp_params_from_firmware(dev, hpp) (-ENODEV) -#define get_hp_hw_control_from_firmware(dev) do { } while (0) -#endif +/* Global variables */ +extern struct controller *shpchp_ctrl_list; struct ctrl_reg { volatile u32 base_offset; @@ -290,6 +286,10 @@ static inline int slot_paranoia_check (struct slot *slot, const char *function) dbg("%s - slot == NULL", function); return -1; } + if (slot->magic != SLOT_MAGIC) { + dbg("%s - bad magic number for slot", function); + return -1; + } if (!slot->hotplug_slot) { dbg("%s - slot->hotplug_slot == NULL!", function); return -1; @@ -314,19 +314,44 @@ static inline struct slot *get_slot (struct hotplug_slot *hotplug_slot, const ch static inline struct slot *shpchp_find_slot (struct controller *ctrl, u8 device) { - struct slot *slot; + struct slot *p_slot, *tmp_slot = NULL; if (!ctrl) return NULL; - list_for_each_entry(slot, &ctrl->slot_list, slot_list) { - if (slot->device == device) - return slot; + p_slot = ctrl->slot; + + while (p_slot && (p_slot->device != device)) { + tmp_slot = p_slot; + p_slot = p_slot->next; } + if (p_slot == NULL) { + err("ERROR: shpchp_find_slot device=0x%x\n", device); + p_slot = tmp_slot; + } + + return (p_slot); +} + +static inline int wait_for_ctrl_irq (struct controller *ctrl) +{ + DECLARE_WAITQUEUE(wait, current); + int retval = 0; + + add_wait_queue(&ctrl->queue, &wait); - err("%s: slot (device=0x%x) not found\n", __FUNCTION__, device); + if (!shpchp_poll_mode) { + /* Sleep for up to 1 second */ + msleep_interruptible(1000); + } else { + /* Sleep for up to 2 seconds */ + msleep_interruptible(2000); + } + remove_wait_queue(&ctrl->queue, &wait); + if (signal_pending(current)) + retval = -EINTR; - return NULL; + return retval; } static inline void amd_pogo_errata_save_misc_reg(struct slot *p_slot) @@ -402,6 +427,13 @@ static inline void amd_pogo_errata_restore_misc_reg(struct slot *p_slot) pci_write_config_dword(p_slot->ctrl->pci_dev, PCIX_MISCII_OFFSET, pcix_misc2_temp); } +#define SLOT_NAME_SIZE 10 + +static inline void make_slot_name(char *buffer, int buffer_size, struct slot *slot) +{ + snprintf(buffer, buffer_size, "%04d_%04d", slot->bus, slot->number); +} + enum php_ctlr_type { PCI, ISA, diff --git a/drivers/pci/hotplug/shpchp_core.c b/drivers/pci/hotplug/shpchp_core.c index a14e7de19..a2b3f0010 100644 --- a/drivers/pci/hotplug/shpchp_core.c +++ b/drivers/pci/hotplug/shpchp_core.c @@ -32,14 +32,13 @@ #include #include #include -#include #include "shpchp.h" /* Global variables */ int shpchp_debug; int shpchp_poll_mode; int shpchp_poll_time; -struct workqueue_struct *shpchp_wq; +struct controller *shpchp_ctrl_list; /* = NULL */ #define DRIVER_VERSION "0.4" #define DRIVER_AUTHOR "Dan Zink , Greg Kroah-Hartman , Dely Sy " @@ -58,6 +57,7 @@ MODULE_PARM_DESC(shpchp_poll_time, "Polling mechanism frequency, in seconds"); #define SHPC_MODULE_NAME "shpchp" +static int shpc_start_thread (void); static int set_attention_status (struct hotplug_slot *slot, u8 value); static int enable_slot (struct hotplug_slot *slot); static int disable_slot (struct hotplug_slot *slot); @@ -94,120 +94,107 @@ static void release_slot(struct hotplug_slot *hotplug_slot) dbg("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name); kfree(slot->hotplug_slot->info); + kfree(slot->hotplug_slot->name); kfree(slot->hotplug_slot); kfree(slot); } -static void make_slot_name(struct slot *slot) -{ - snprintf(slot->hotplug_slot->name, SLOT_NAME_SIZE, "%04d_%04d", - slot->bus, slot->number); -} - - - - -static int -shpchprm_get_physical_slot_number(struct controller *ctrl, u32 *sun, - u8 busnum, u8 devnum) -{ - int offset = devnum - ctrl->slot_device_offset; - - dbg("%s: ctrl->slot_num_inc %d, offset %d\n", __FUNCTION__, - ctrl->slot_num_inc, offset); - *sun = (u8) (ctrl->first_slot + ctrl->slot_num_inc *offset); - return 0; -} - - - static int init_slots(struct controller *ctrl) { - struct slot *slot; - struct hotplug_slot *hotplug_slot; - struct hotplug_slot_info *info; - int retval = -ENOMEM; - int i; - u32 sun; - - for (i = 0; i < ctrl->num_slots; i++) { - slot = kzalloc(sizeof(*slot), GFP_KERNEL); - if (!slot) + struct slot *new_slot; + u8 number_of_slots; + u8 slot_device; + u32 slot_number, sun; + int result = -ENOMEM; + + number_of_slots = ctrl->num_slots; + slot_device = ctrl->slot_device_offset; + slot_number = ctrl->first_slot; + + while (number_of_slots) { + new_slot = (struct slot *) kmalloc(sizeof(struct slot), GFP_KERNEL); + if (!new_slot) goto error; - hotplug_slot = kzalloc(sizeof(*hotplug_slot), GFP_KERNEL); - if (!hotplug_slot) + memset(new_slot, 0, sizeof(struct slot)); + new_slot->hotplug_slot = kmalloc (sizeof (struct hotplug_slot), GFP_KERNEL); + if (!new_slot->hotplug_slot) goto error_slot; - slot->hotplug_slot = hotplug_slot; + memset(new_slot->hotplug_slot, 0, sizeof (struct hotplug_slot)); - info = kzalloc(sizeof(*info), GFP_KERNEL); - if (!info) + new_slot->hotplug_slot->info = kmalloc (sizeof (struct hotplug_slot_info), GFP_KERNEL); + if (!new_slot->hotplug_slot->info) goto error_hpslot; - hotplug_slot->info = info; - - hotplug_slot->name = slot->name; + memset(new_slot->hotplug_slot->info, 0, sizeof (struct hotplug_slot_info)); + new_slot->hotplug_slot->name = kmalloc (SLOT_NAME_SIZE, GFP_KERNEL); + if (!new_slot->hotplug_slot->name) + goto error_info; - slot->hp_slot = i; - slot->ctrl = ctrl; - slot->bus = ctrl->slot_bus; - slot->device = ctrl->slot_device_offset + i; - slot->hpc_ops = ctrl->hpc_ops; - mutex_init(&slot->lock); + new_slot->magic = SLOT_MAGIC; + new_slot->ctrl = ctrl; + new_slot->bus = ctrl->slot_bus; + new_slot->device = slot_device; + new_slot->hpc_ops = ctrl->hpc_ops; if (shpchprm_get_physical_slot_number(ctrl, &sun, - slot->bus, slot->device)) - goto error_info; + new_slot->bus, new_slot->device)) + goto error_name; - slot->number = sun; - INIT_WORK(&slot->work, queue_pushbutton_work, slot); + new_slot->number = sun; + new_slot->hp_slot = slot_device - ctrl->slot_device_offset; /* register this slot with the hotplug pci core */ - hotplug_slot->private = slot; - hotplug_slot->release = &release_slot; - make_slot_name(slot); - hotplug_slot->ops = &shpchp_hotplug_slot_ops; - - get_power_status(hotplug_slot, &info->power_status); - get_attention_status(hotplug_slot, &info->attention_status); - get_latch_status(hotplug_slot, &info->latch_status); - get_adapter_status(hotplug_slot, &info->adapter_status); - - dbg("Registering bus=%x dev=%x hp_slot=%x sun=%x " - "slot_device_offset=%x\n", slot->bus, slot->device, - slot->hp_slot, slot->number, ctrl->slot_device_offset); - retval = pci_hp_register(slot->hotplug_slot); - if (retval) { - err("pci_hp_register failed with error %d\n", retval); - goto error_info; + new_slot->hotplug_slot->private = new_slot; + new_slot->hotplug_slot->release = &release_slot; + make_slot_name(new_slot->hotplug_slot->name, SLOT_NAME_SIZE, new_slot); + new_slot->hotplug_slot->ops = &shpchp_hotplug_slot_ops; + + new_slot->hpc_ops->get_power_status(new_slot, &(new_slot->hotplug_slot->info->power_status)); + new_slot->hpc_ops->get_attention_status(new_slot, &(new_slot->hotplug_slot->info->attention_status)); + new_slot->hpc_ops->get_latch_status(new_slot, &(new_slot->hotplug_slot->info->latch_status)); + new_slot->hpc_ops->get_adapter_status(new_slot, &(new_slot->hotplug_slot->info->adapter_status)); + + dbg("Registering bus=%x dev=%x hp_slot=%x sun=%x slot_device_offset=%x\n", new_slot->bus, + new_slot->device, new_slot->hp_slot, new_slot->number, ctrl->slot_device_offset); + result = pci_hp_register (new_slot->hotplug_slot); + if (result) { + err ("pci_hp_register failed with error %d\n", result); + goto error_name; } - list_add(&slot->slot_list, &ctrl->slot_list); + new_slot->next = ctrl->slot; + ctrl->slot = new_slot; + + number_of_slots--; + slot_device++; + slot_number += ctrl->slot_num_inc; } return 0; + +error_name: + kfree(new_slot->hotplug_slot->name); error_info: - kfree(info); + kfree(new_slot->hotplug_slot->info); error_hpslot: - kfree(hotplug_slot); + kfree(new_slot->hotplug_slot); error_slot: - kfree(slot); + kfree(new_slot); error: - return retval; + return result; } -void cleanup_slots(struct controller *ctrl) +static void cleanup_slots(struct controller *ctrl) { - struct list_head *tmp; - struct list_head *next; - struct slot *slot; - - list_for_each_safe(tmp, next, &ctrl->slot_list) { - slot = list_entry(tmp, struct slot, slot_list); - list_del(&slot->slot_list); - cancel_delayed_work(&slot->work); - flush_scheduled_work(); - flush_workqueue(shpchp_wq); - pci_hp_deregister(slot->hotplug_slot); + struct slot *old_slot, *next_slot; + + old_slot = ctrl->slot; + ctrl->slot = NULL; + + while (old_slot) { + next_slot = old_slot->next; + pci_hp_deregister(old_slot->hotplug_slot); + old_slot = next_slot; } } @@ -220,12 +207,9 @@ static int get_ctlr_slot_config(struct controller *ctrl) int rc; int flags; - rc = shpc_get_ctlr_slot_config(ctrl, &num_ctlr_slots, - &first_device_num, &physical_slot_num, - &updown, &flags); + rc = shpc_get_ctlr_slot_config(ctrl, &num_ctlr_slots, &first_device_num, &physical_slot_num, &updown, &flags); if (rc) { - err("%s: get_ctlr_slot_config fail for b:d (%x:%x)\n", - __FUNCTION__, ctrl->bus, ctrl->device); + err("%s: get_ctlr_slot_config fail for b:d (%x:%x)\n", __FUNCTION__, ctrl->bus, ctrl->device); return -1; } @@ -234,19 +218,19 @@ static int get_ctlr_slot_config(struct controller *ctrl) ctrl->first_slot = physical_slot_num; ctrl->slot_num_inc = updown; /* either -1 or 1 */ - dbg("%s: num_slot(0x%x) 1st_dev(0x%x) psn(0x%x) updown(%d) for b:d " - "(%x:%x)\n", __FUNCTION__, num_ctlr_slots, first_device_num, - physical_slot_num, updown, ctrl->bus, ctrl->device); + dbg("%s: num_slot(0x%x) 1st_dev(0x%x) psn(0x%x) updown(%d) for b:d (%x:%x)\n", + __FUNCTION__, num_ctlr_slots, first_device_num, physical_slot_num, updown, ctrl->bus, ctrl->device); return 0; } + /* * set_attention_status - Turns the Amber LED for a slot on, off or blink */ static int set_attention_status (struct hotplug_slot *hotplug_slot, u8 status) { - struct slot *slot = get_slot(hotplug_slot, __FUNCTION__); + struct slot *slot = get_slot (hotplug_slot, __FUNCTION__); dbg("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name); @@ -256,27 +240,29 @@ static int set_attention_status (struct hotplug_slot *hotplug_slot, u8 status) return 0; } + static int enable_slot (struct hotplug_slot *hotplug_slot) { - struct slot *slot = get_slot(hotplug_slot, __FUNCTION__); + struct slot *slot = get_slot (hotplug_slot, __FUNCTION__); dbg("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name); - return shpchp_sysfs_enable_slot(slot); + return shpchp_enable_slot(slot); } + static int disable_slot (struct hotplug_slot *hotplug_slot) { - struct slot *slot = get_slot(hotplug_slot, __FUNCTION__); + struct slot *slot = get_slot (hotplug_slot, __FUNCTION__); dbg("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name); - return shpchp_sysfs_disable_slot(slot); + return shpchp_disable_slot(slot); } static int get_power_status (struct hotplug_slot *hotplug_slot, u8 *value) { - struct slot *slot = get_slot(hotplug_slot, __FUNCTION__); + struct slot *slot = get_slot (hotplug_slot, __FUNCTION__); int retval; dbg("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name); @@ -290,7 +276,7 @@ static int get_power_status (struct hotplug_slot *hotplug_slot, u8 *value) static int get_attention_status (struct hotplug_slot *hotplug_slot, u8 *value) { - struct slot *slot = get_slot(hotplug_slot, __FUNCTION__); + struct slot *slot = get_slot (hotplug_slot, __FUNCTION__); int retval; dbg("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name); @@ -304,7 +290,7 @@ static int get_attention_status (struct hotplug_slot *hotplug_slot, u8 *value) static int get_latch_status (struct hotplug_slot *hotplug_slot, u8 *value) { - struct slot *slot = get_slot(hotplug_slot, __FUNCTION__); + struct slot *slot = get_slot (hotplug_slot, __FUNCTION__); int retval; dbg("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name); @@ -318,7 +304,7 @@ static int get_latch_status (struct hotplug_slot *hotplug_slot, u8 *value) static int get_adapter_status (struct hotplug_slot *hotplug_slot, u8 *value) { - struct slot *slot = get_slot(hotplug_slot, __FUNCTION__); + struct slot *slot = get_slot (hotplug_slot, __FUNCTION__); int retval; dbg("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name); @@ -332,7 +318,7 @@ static int get_adapter_status (struct hotplug_slot *hotplug_slot, u8 *value) static int get_address (struct hotplug_slot *hotplug_slot, u32 *value) { - struct slot *slot = get_slot(hotplug_slot, __FUNCTION__); + struct slot *slot = get_slot (hotplug_slot, __FUNCTION__); struct pci_bus *bus = slot->ctrl->pci_dev->subordinate; dbg("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name); @@ -344,11 +330,11 @@ static int get_address (struct hotplug_slot *hotplug_slot, u32 *value) static int get_max_bus_speed (struct hotplug_slot *hotplug_slot, enum pci_bus_speed *value) { - struct slot *slot = get_slot(hotplug_slot, __FUNCTION__); + struct slot *slot = get_slot (hotplug_slot, __FUNCTION__); int retval; dbg("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name); - + retval = slot->hpc_ops->get_max_bus_speed(slot, value); if (retval < 0) *value = PCI_SPEED_UNKNOWN; @@ -358,11 +344,11 @@ static int get_max_bus_speed (struct hotplug_slot *hotplug_slot, enum pci_bus_sp static int get_cur_bus_speed (struct hotplug_slot *hotplug_slot, enum pci_bus_speed *value) { - struct slot *slot = get_slot(hotplug_slot, __FUNCTION__); + struct slot *slot = get_slot (hotplug_slot, __FUNCTION__); int retval; dbg("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name); - + retval = slot->hpc_ops->get_cur_bus_speed(slot, value); if (retval < 0) *value = PCI_SPEED_UNKNOWN; @@ -386,54 +372,61 @@ static int shpc_probe(struct pci_dev *pdev, const struct pci_device_id *ent) int rc; struct controller *ctrl; struct slot *t_slot; - int first_device_num; /* first PCI device number */ - int num_ctlr_slots; /* number of slots implemented */ + int first_device_num; /* first PCI device number supported by this SHPC */ + int num_ctlr_slots; /* number of slots supported by this SHPC */ if (!is_shpc_capable(pdev)) return -ENODEV; - ctrl = kzalloc(sizeof(*ctrl), GFP_KERNEL); + ctrl = (struct controller *) kmalloc(sizeof(struct controller), GFP_KERNEL); if (!ctrl) { err("%s : out of memory\n", __FUNCTION__); goto err_out_none; } - INIT_LIST_HEAD(&ctrl->slot_list); + memset(ctrl, 0, sizeof(struct controller)); rc = shpc_init(ctrl, pdev); if (rc) { - dbg("%s: controller initialization failed\n", - SHPC_MODULE_NAME); + dbg("%s: controller initialization failed\n", SHPC_MODULE_NAME); goto err_out_free_ctrl; } pci_set_drvdata(pdev, ctrl); + ctrl->pci_bus = kmalloc (sizeof (*ctrl->pci_bus), GFP_KERNEL); + if (!ctrl->pci_bus) { + err("out of memory\n"); + rc = -ENOMEM; + goto err_out_unmap_mmio_region; + } + + memcpy (ctrl->pci_bus, pdev->bus, sizeof (*ctrl->pci_bus)); ctrl->bus = pdev->bus->number; ctrl->slot_bus = pdev->subordinate->number; + ctrl->device = PCI_SLOT(pdev->devfn); ctrl->function = PCI_FUNC(pdev->devfn); - - dbg("ctrl bus=0x%x, device=%x, function=%x, irq=%x\n", - ctrl->bus, ctrl->device, ctrl->function, pdev->irq); + dbg("ctrl bus=0x%x, device=%x, function=%x, irq=%x\n", ctrl->bus, ctrl->device, ctrl->function, pdev->irq); /* - * Save configuration headers for this and subordinate PCI buses + * Save configuration headers for this and subordinate PCI buses */ + rc = get_ctlr_slot_config(ctrl); if (rc) { err(msg_initialization_err, rc); - goto err_out_release_ctlr; + goto err_out_free_ctrl_bus; } first_device_num = ctrl->slot_device_offset; num_ctlr_slots = ctrl->num_slots; ctrl->add_support = 1; - + /* Setup the slot information structures */ rc = init_slots(ctrl); if (rc) { err(msg_initialization_err, 6); - goto err_out_release_ctlr; + goto err_out_free_ctrl_slot; } /* Now hpc_functions (slot->hpc_ops->functions) are ready */ @@ -444,16 +437,30 @@ static int shpc_probe(struct pci_dev *pdev, const struct pci_device_id *ent) dbg("%s: t_slot->hp_slot %x\n", __FUNCTION__,t_slot->hp_slot); if (rc || ctrl->speed == PCI_SPEED_UNKNOWN) { - err(SHPC_MODULE_NAME ": Can't get current bus speed. " - "Set to 33MHz PCI.\n"); + err(SHPC_MODULE_NAME ": Can't get current bus speed. Set to 33MHz PCI.\n"); ctrl->speed = PCI_SPEED_33MHz; } + /* Finish setting up the hot plug ctrl device */ + ctrl->next_event = 0; + + if (!shpchp_ctrl_list) { + shpchp_ctrl_list = ctrl; + ctrl->next = NULL; + } else { + ctrl->next = shpchp_ctrl_list; + shpchp_ctrl_list = ctrl; + } + shpchp_create_ctrl_files(ctrl); return 0; -err_out_release_ctlr: +err_out_free_ctrl_slot: + cleanup_slots(ctrl); +err_out_free_ctrl_bus: + kfree(ctrl->pci_bus); +err_out_unmap_mmio_region: ctrl->hpc_ops->release_ctlr(ctrl); err_out_free_ctrl: kfree(ctrl); @@ -461,28 +468,74 @@ err_out_none: return -ENODEV; } -static void shpc_remove(struct pci_dev *dev) + +static int shpc_start_thread(void) { - struct controller *ctrl = pci_get_drvdata(dev); + int retval = 0; + + dbg("Initialize + Start the notification/polling mechanism \n"); - shpchp_remove_ctrl_files(ctrl); - ctrl->hpc_ops->release_ctlr(ctrl); - kfree(ctrl); + retval = shpchp_event_start_thread(); + if (retval) { + dbg("shpchp_event_start_thread() failed\n"); + return retval; + } + + return retval; } +static void __exit unload_shpchpd(void) +{ + struct controller *ctrl; + struct controller *tctrl; + + ctrl = shpchp_ctrl_list; + + while (ctrl) { + shpchp_remove_ctrl_files(ctrl); + cleanup_slots(ctrl); + + kfree (ctrl->pci_bus); + ctrl->hpc_ops->release_ctlr(ctrl); + + tctrl = ctrl; + ctrl = ctrl->next; + + kfree(tctrl); + } + + /* Stop the notification mechanism */ + shpchp_event_stop_thread(); + +} + + static struct pci_device_id shpcd_pci_tbl[] = { - {PCI_DEVICE_CLASS(((PCI_CLASS_BRIDGE_PCI << 8) | 0x00), ~0)}, + { + .class = ((PCI_CLASS_BRIDGE_PCI << 8) | 0x00), + .class_mask = ~0, + .vendor = PCI_ANY_ID, + .device = PCI_ANY_ID, + .subvendor = PCI_ANY_ID, + .subdevice = PCI_ANY_ID, + }, + { /* end: all zeroes */ } }; + MODULE_DEVICE_TABLE(pci, shpcd_pci_tbl); + + static struct pci_driver shpc_driver = { .name = SHPC_MODULE_NAME, .id_table = shpcd_pci_tbl, .probe = shpc_probe, - .remove = shpc_remove, + /* remove: shpc_remove_one, */ }; + + static int __init shpcd_init(void) { int retval = 0; @@ -491,16 +544,28 @@ static int __init shpcd_init(void) shpchp_poll_mode = 1; #endif + retval = shpc_start_thread(); + if (retval) + goto error_hpc_init; + retval = pci_register_driver(&shpc_driver); dbg("%s: pci_register_driver = %d\n", __FUNCTION__, retval); info(DRIVER_DESC " version: " DRIVER_VERSION "\n"); + +error_hpc_init: + if (retval) { + shpchp_event_stop_thread(); + } return retval; } static void __exit shpcd_cleanup(void) { dbg("unload_shpchpd()\n"); + unload_shpchpd(); + pci_unregister_driver(&shpc_driver); + 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 c39901dbf..643252d9b 100644 --- a/drivers/pci/hotplug/shpchp_ctrl.c +++ b/drivers/pci/hotplug/shpchp_ctrl.c @@ -32,50 +32,65 @@ #include #include #include -#include #include "../pci.h" #include "shpchp.h" -static void interrupt_event_handler(void *data); -static int shpchp_enable_slot(struct slot *p_slot); -static int shpchp_disable_slot(struct slot *p_slot); +static void interrupt_event_handler(struct controller *ctrl); -static int queue_interrupt_event(struct slot *p_slot, u32 event_type) -{ - struct event_info *info; - - info = kmalloc(sizeof(*info), GFP_ATOMIC); - if (!info) - return -ENOMEM; - - info->event_type = event_type; - info->p_slot = p_slot; - INIT_WORK(&info->work, interrupt_event_handler, info); - - schedule_work(&info->work); - - return 0; -} +static struct semaphore event_semaphore; /* mutex for process loop (up if something to process) */ +static struct semaphore event_exit; /* guard ensure thread has exited before calling it quits */ +static int event_finished; +static unsigned long pushbutton_pending; /* = 0 */ u8 shpchp_handle_attention_button(u8 hp_slot, void *inst_id) { struct controller *ctrl = (struct controller *) inst_id; struct slot *p_slot; - u32 event_type; + u8 rc = 0; + u8 getstatus; + struct event_info *taskInfo; /* Attention Button Change */ dbg("shpchp: Attention button interrupt received.\n"); + /* This is the structure that tells the worker thread what to do */ + taskInfo = &(ctrl->event_queue[ctrl->next_event]); p_slot = shpchp_find_slot(ctrl, hp_slot + ctrl->slot_device_offset); + p_slot->hpc_ops->get_adapter_status(p_slot, &(p_slot->presence_save)); + p_slot->hpc_ops->get_latch_status(p_slot, &getstatus); + + ctrl->next_event = (ctrl->next_event + 1) % 10; + taskInfo->hp_slot = hp_slot; + + rc++; /* * Button pressed - See if need to TAKE ACTION!!! */ - info("Button pressed on Slot(%s)\n", p_slot->name); - event_type = INT_BUTTON_PRESS; + info("Button pressed on Slot(%d)\n", ctrl->first_slot + hp_slot); + taskInfo->event_type = INT_BUTTON_PRESS; + + if ((p_slot->state == BLINKINGON_STATE) + || (p_slot->state == BLINKINGOFF_STATE)) { + /* Cancel if we are still blinking; this means that we press the + * attention again before the 5 sec. limit expires to cancel hot-add + * or hot-remove + */ + taskInfo->event_type = INT_BUTTON_CANCEL; + info("Button cancel on Slot(%d)\n", ctrl->first_slot + hp_slot); + } else if ((p_slot->state == POWERON_STATE) + || (p_slot->state == POWEROFF_STATE)) { + /* Ignore if the slot is on power-on or power-off state; this + * means that the previous attention button action to hot-add or + * hot-remove is undergoing + */ + taskInfo->event_type = INT_BUTTON_IGNORE; + info("Button ignore on Slot(%d)\n", ctrl->first_slot + hp_slot); + } - queue_interrupt_event(p_slot, event_type); + if (rc) + up(&event_semaphore); /* signal event thread that new event is posted */ return 0; @@ -85,12 +100,21 @@ u8 shpchp_handle_switch_change(u8 hp_slot, void *inst_id) { struct controller *ctrl = (struct controller *) inst_id; struct slot *p_slot; + u8 rc = 0; u8 getstatus; - u32 event_type; + struct event_info *taskInfo; /* Switch Change */ dbg("shpchp: Switch interrupt received.\n"); + /* This is the structure that tells the worker thread + * what to do + */ + taskInfo = &(ctrl->event_queue[ctrl->next_event]); + ctrl->next_event = (ctrl->next_event + 1) % 10; + taskInfo->hp_slot = hp_slot; + + rc++; p_slot = shpchp_find_slot(ctrl, hp_slot + ctrl->slot_device_offset); p_slot->hpc_ops->get_adapter_status(p_slot, &(p_slot->presence_save)); p_slot->hpc_ops->get_latch_status(p_slot, &getstatus); @@ -101,34 +125,45 @@ u8 shpchp_handle_switch_change(u8 hp_slot, void *inst_id) /* * Switch opened */ - info("Latch open on Slot(%s)\n", p_slot->name); - event_type = INT_SWITCH_OPEN; + info("Latch open on Slot(%d)\n", ctrl->first_slot + hp_slot); + taskInfo->event_type = INT_SWITCH_OPEN; if (p_slot->pwr_save && p_slot->presence_save) { - event_type = INT_POWER_FAULT; + taskInfo->event_type = INT_POWER_FAULT; err("Surprise Removal of card\n"); } } else { /* * Switch closed */ - info("Latch close on Slot(%s)\n", p_slot->name); - event_type = INT_SWITCH_CLOSE; + info("Latch close on Slot(%d)\n", ctrl->first_slot + hp_slot); + taskInfo->event_type = INT_SWITCH_CLOSE; } - queue_interrupt_event(p_slot, event_type); + if (rc) + up(&event_semaphore); /* signal event thread that new event is posted */ - return 1; + return rc; } u8 shpchp_handle_presence_change(u8 hp_slot, void *inst_id) { struct controller *ctrl = (struct controller *) inst_id; struct slot *p_slot; - u32 event_type; + u8 rc = 0; + /*u8 temp_byte;*/ + struct event_info *taskInfo; /* Presence Change */ dbg("shpchp: Presence/Notify input change.\n"); + /* This is the structure that tells the worker thread + * what to do + */ + taskInfo = &(ctrl->event_queue[ctrl->next_event]); + ctrl->next_event = (ctrl->next_event + 1) % 10; + taskInfo->hp_slot = hp_slot; + + rc++; p_slot = shpchp_find_slot(ctrl, hp_slot + ctrl->slot_device_offset); /* @@ -139,53 +174,63 @@ u8 shpchp_handle_presence_change(u8 hp_slot, void *inst_id) /* * Card Present */ - info("Card present on Slot(%s)\n", p_slot->name); - event_type = INT_PRESENCE_ON; + info("Card present on Slot(%d)\n", ctrl->first_slot + hp_slot); + taskInfo->event_type = INT_PRESENCE_ON; } else { /* * Not Present */ - info("Card not present on Slot(%s)\n", p_slot->name); - event_type = INT_PRESENCE_OFF; + info("Card not present on Slot(%d)\n", ctrl->first_slot + hp_slot); + taskInfo->event_type = INT_PRESENCE_OFF; } - queue_interrupt_event(p_slot, event_type); + if (rc) + up(&event_semaphore); /* signal event thread that new event is posted */ - return 1; + return rc; } u8 shpchp_handle_power_fault(u8 hp_slot, void *inst_id) { struct controller *ctrl = (struct controller *) inst_id; struct slot *p_slot; - u32 event_type; + u8 rc = 0; + struct event_info *taskInfo; /* Power fault */ dbg("shpchp: Power fault interrupt received.\n"); + /* This is the structure that tells the worker thread + * what to do + */ + taskInfo = &(ctrl->event_queue[ctrl->next_event]); + ctrl->next_event = (ctrl->next_event + 1) % 10; + taskInfo->hp_slot = hp_slot; + + rc++; p_slot = shpchp_find_slot(ctrl, hp_slot + ctrl->slot_device_offset); if ( !(p_slot->hpc_ops->query_power_fault(p_slot))) { /* * Power fault Cleared */ - info("Power fault cleared on Slot(%s)\n", p_slot->name); + info("Power fault cleared on Slot(%d)\n", ctrl->first_slot + hp_slot); p_slot->status = 0x00; - event_type = INT_POWER_FAULT_CLEAR; + taskInfo->event_type = INT_POWER_FAULT_CLEAR; } else { /* * Power fault */ - info("Power fault on Slot(%s)\n", p_slot->name); - event_type = INT_POWER_FAULT; + info("Power fault on Slot(%d)\n", ctrl->first_slot + hp_slot); + taskInfo->event_type = INT_POWER_FAULT; /* set power fault status for this board */ p_slot->status = 0xFF; info("power fault bit %x set\n", hp_slot); } + if (rc) + up(&event_semaphore); /* signal event thread that new event is posted */ - queue_interrupt_event(p_slot, event_type); - - return 1; + return rc; } /* The following routines constitute the bulk of the @@ -197,11 +242,21 @@ static int change_bus_speed(struct controller *ctrl, struct slot *p_slot, int rc = 0; dbg("%s: change to speed %d\n", __FUNCTION__, speed); + down(&ctrl->crit_sect); if ((rc = p_slot->hpc_ops->set_bus_speed_mode(p_slot, speed))) { - err("%s: Issue of set bus speed mode command failed\n", - __FUNCTION__); + err("%s: Issue of set bus speed mode command failed\n", __FUNCTION__); + up(&ctrl->crit_sect); return WRONG_BUS_FREQUENCY; } + + if ((rc = p_slot->hpc_ops->check_cmd_status(ctrl))) { + err("%s: Can't set bus speed/mode in the case of adapter & bus mismatch\n", + __FUNCTION__); + err("%s: Error code (%d)\n", __FUNCTION__, rc); + up(&ctrl->crit_sect); + return WRONG_BUS_FREQUENCY; + } + up(&ctrl->crit_sect); return rc; } @@ -210,26 +265,33 @@ static int fix_bus_speed(struct controller *ctrl, struct slot *pslot, enum pci_bus_speed msp) { int rc = 0; - - /* - * If other slots on the same bus are occupied, we cannot - * change the bus speed. - */ - if (flag) { - if (asp < bsp) { - err("%s: speed of bus %x and adapter %x mismatch\n", - __FUNCTION__, bsp, asp); - rc = WRONG_BUS_FREQUENCY; + + if (flag != 0) { /* Other slots on the same bus are occupied */ + if ( asp < bsp ) { + err("%s: speed of bus %x and adapter %x mismatch\n", __FUNCTION__, bsp, asp); + return WRONG_BUS_FREQUENCY; } - return rc; - } - - if (asp < msp) { - if (bsp != asp) - rc = change_bus_speed(ctrl, pslot, asp); } else { - if (bsp != msp) - rc = change_bus_speed(ctrl, pslot, msp); + /* Other slots on the same bus are empty */ + if (msp == bsp) { + /* if adapter_speed >= bus_speed, do nothing */ + if (asp < bsp) { + /* + * Try to lower bus speed to accommodate the adapter if other slots + * on the same controller are empty + */ + if ((rc = change_bus_speed(ctrl, pslot, asp))) + return rc; + } + } else { + if (asp < msp) { + if ((rc = change_bus_speed(ctrl, pslot, asp))) + return rc; + } else { + if ((rc = change_bus_speed(ctrl, pslot, msp))) + return rc; + } + } } return rc; } @@ -246,7 +308,8 @@ static int board_added(struct slot *p_slot) u8 hp_slot; u8 slots_not_empty = 0; int rc = 0; - enum pci_bus_speed asp, bsp, msp; + enum pci_bus_speed adapter_speed, bus_speed, max_bus_speed; + u8 pi, mode; struct controller *ctrl = p_slot->ctrl; hp_slot = p_slot->device - ctrl->slot_device_offset; @@ -255,68 +318,187 @@ static int board_added(struct slot *p_slot) __FUNCTION__, p_slot->device, ctrl->slot_device_offset, hp_slot); + /* Wait for exclusive access to hardware */ + down(&ctrl->crit_sect); + /* Power on slot without connecting to bus */ rc = p_slot->hpc_ops->power_on_slot(p_slot); if (rc) { err("%s: Failed to power on slot\n", __FUNCTION__); + /* Done with exclusive hardware access */ + up(&ctrl->crit_sect); return -1; } + rc = p_slot->hpc_ops->check_cmd_status(ctrl); + if (rc) { + err("%s: Failed to power on slot, error code(%d)\n", __FUNCTION__, rc); + /* Done with exclusive hardware access */ + up(&ctrl->crit_sect); + return -1; + } + + if ((ctrl->pci_dev->vendor == 0x8086) && (ctrl->pci_dev->device == 0x0332)) { if (slots_not_empty) return WRONG_BUS_FREQUENCY; if ((rc = p_slot->hpc_ops->set_bus_speed_mode(p_slot, PCI_SPEED_33MHz))) { err("%s: Issue of set bus speed mode command failed\n", __FUNCTION__); + up(&ctrl->crit_sect); return WRONG_BUS_FREQUENCY; } + if ((rc = p_slot->hpc_ops->check_cmd_status(ctrl))) { + err("%s: Can't set bus speed/mode in the case of adapter & bus mismatch\n", + __FUNCTION__); + err("%s: Error code (%d)\n", __FUNCTION__, rc); + up(&ctrl->crit_sect); + return WRONG_BUS_FREQUENCY; + } /* turn on board, blink green LED, turn off Amber LED */ if ((rc = p_slot->hpc_ops->slot_enable(p_slot))) { err("%s: Issue of Slot Enable command failed\n", __FUNCTION__); + up(&ctrl->crit_sect); return rc; } + + if ((rc = p_slot->hpc_ops->check_cmd_status(ctrl))) { + err("%s: Failed to enable slot, error code(%d)\n", __FUNCTION__, rc); + up(&ctrl->crit_sect); + return rc; + } } - rc = p_slot->hpc_ops->get_adapter_speed(p_slot, &asp); - if (rc) { - err("%s: Can't get adapter speed or bus mode mismatch\n", - __FUNCTION__); + rc = p_slot->hpc_ops->get_adapter_speed(p_slot, &adapter_speed); + /* 0 = PCI 33Mhz, 1 = PCI 66 Mhz, 2 = PCI-X 66 PA, 4 = PCI-X 66 ECC, */ + /* 5 = PCI-X 133 PA, 7 = PCI-X 133 ECC, 0xa = PCI-X 133 Mhz 266, */ + /* 0xd = PCI-X 133 Mhz 533 */ + /* This encoding is different from the one used in cur_bus_speed & */ + /* max_bus_speed */ + + if (rc || adapter_speed == PCI_SPEED_UNKNOWN) { + err("%s: Can't get adapter speed or bus mode mismatch\n", __FUNCTION__); + /* Done with exclusive hardware access */ + up(&ctrl->crit_sect); return WRONG_BUS_FREQUENCY; } - rc = p_slot->hpc_ops->get_cur_bus_speed(p_slot, &bsp); - if (rc) { + rc = p_slot->hpc_ops->get_cur_bus_speed(p_slot, &bus_speed); + if (rc || bus_speed == PCI_SPEED_UNKNOWN) { err("%s: Can't get bus operation speed\n", __FUNCTION__); + /* Done with exclusive hardware access */ + up(&ctrl->crit_sect); return WRONG_BUS_FREQUENCY; } - rc = p_slot->hpc_ops->get_max_bus_speed(p_slot, &msp); - if (rc) { + rc = p_slot->hpc_ops->get_max_bus_speed(p_slot, &max_bus_speed); + if (rc || max_bus_speed == PCI_SPEED_UNKNOWN) { err("%s: Can't get max bus operation speed\n", __FUNCTION__); - msp = bsp; + max_bus_speed = bus_speed; + } + + /* Done with exclusive hardware access */ + up(&ctrl->crit_sect); + + if ((rc = p_slot->hpc_ops->get_prog_int(p_slot, &pi))) { + err("%s: Can't get controller programming interface, set it to 1\n", __FUNCTION__); + pi = 1; } /* Check if there are other slots or devices on the same bus */ if (!list_empty(&ctrl->pci_dev->subordinate->devices)) slots_not_empty = 1; - dbg("%s: slots_not_empty %d, adapter_speed %d, bus_speed %d, " - "max_bus_speed %d\n", __FUNCTION__, slots_not_empty, asp, - bsp, msp); + dbg("%s: slots_not_empty %d, pi %d\n", __FUNCTION__, + slots_not_empty, pi); + dbg("adapter_speed %d, bus_speed %d, max_bus_speed %d\n", + adapter_speed, bus_speed, max_bus_speed); - rc = fix_bus_speed(ctrl, p_slot, slots_not_empty, asp, bsp, msp); - if (rc) - return rc; + if (pi == 2) { + dbg("%s: In PI = %d\n", __FUNCTION__, pi); + if ((rc = p_slot->hpc_ops->get_mode1_ECC_cap(p_slot, &mode))) { + err("%s: Can't get Mode1_ECC, set mode to 0\n", __FUNCTION__); + mode = 0; + } + switch (adapter_speed) { + case PCI_SPEED_133MHz_PCIX_533: + case PCI_SPEED_133MHz_PCIX_266: + if ((bus_speed != adapter_speed) && + ((rc = fix_bus_speed(ctrl, p_slot, slots_not_empty, adapter_speed, bus_speed, max_bus_speed)))) + return rc; + break; + case PCI_SPEED_133MHz_PCIX_ECC: + case PCI_SPEED_133MHz_PCIX: + if (mode) { /* Bus - Mode 1 ECC */ + if ((bus_speed != 0x7) && + ((rc = fix_bus_speed(ctrl, p_slot, slots_not_empty, adapter_speed, bus_speed, max_bus_speed)))) + return rc; + } else { + if ((bus_speed != 0x4) && + ((rc = fix_bus_speed(ctrl, p_slot, slots_not_empty, adapter_speed, bus_speed, max_bus_speed)))) + return rc; + } + break; + case PCI_SPEED_66MHz_PCIX_ECC: + case PCI_SPEED_66MHz_PCIX: + if (mode) { /* Bus - Mode 1 ECC */ + if ((bus_speed != 0x5) && + ((rc = fix_bus_speed(ctrl, p_slot, slots_not_empty, adapter_speed, bus_speed, max_bus_speed)))) + return rc; + } else { + if ((bus_speed != 0x2) && + ((rc = fix_bus_speed(ctrl, p_slot, slots_not_empty, adapter_speed, bus_speed, max_bus_speed)))) + return rc; + } + break; + case PCI_SPEED_66MHz: + if ((bus_speed != 0x1) && + ((rc = fix_bus_speed(ctrl, p_slot, slots_not_empty, adapter_speed, bus_speed, max_bus_speed)))) + return rc; + break; + case PCI_SPEED_33MHz: + if (bus_speed > 0x0) { + if (slots_not_empty == 0) { + if ((rc = change_bus_speed(ctrl, p_slot, adapter_speed))) + return rc; + } else { + err("%s: speed of bus %x and adapter %x mismatch\n", __FUNCTION__, bus_speed, adapter_speed); + return WRONG_BUS_FREQUENCY; + } + } + break; + default: + err("%s: speed of bus %x and adapter %x mismatch\n", __FUNCTION__, bus_speed, adapter_speed); + return WRONG_BUS_FREQUENCY; + } + } else { + /* If adpater_speed == bus_speed, nothing to do here */ + dbg("%s: In PI = %d\n", __FUNCTION__, pi); + if ((adapter_speed != bus_speed) && + ((rc = fix_bus_speed(ctrl, p_slot, slots_not_empty, adapter_speed, bus_speed, max_bus_speed)))) + return rc; + } + + down(&ctrl->crit_sect); /* turn on board, blink green LED, turn off Amber LED */ if ((rc = p_slot->hpc_ops->slot_enable(p_slot))) { err("%s: Issue of Slot Enable command failed\n", __FUNCTION__); + up(&ctrl->crit_sect); return rc; } + if ((rc = p_slot->hpc_ops->check_cmd_status(ctrl))) { + err("%s: Failed to enable slot, error code(%d)\n", __FUNCTION__, rc); + up(&ctrl->crit_sect); + return rc; + } + + up(&ctrl->crit_sect); + /* Wait for ~1 second */ - msleep(1000); + wait_for_ctrl_irq (ctrl); dbg("%s: slot status = %x\n", __FUNCTION__, p_slot->status); /* Check for a power fault */ @@ -338,18 +520,40 @@ static int board_added(struct slot *p_slot) p_slot->is_a_board = 0x01; p_slot->pwr_save = 1; + /* Wait for exclusive access to hardware */ + down(&ctrl->crit_sect); + p_slot->hpc_ops->green_led_on(p_slot); + /* Done with exclusive hardware access */ + up(&ctrl->crit_sect); + return 0; err_exit: + /* Wait for exclusive access to hardware */ + down(&ctrl->crit_sect); + /* turn off slot, turn on Amber LED, turn off Green LED */ rc = p_slot->hpc_ops->slot_disable(p_slot); if (rc) { err("%s: Issue of Slot Disable command failed\n", __FUNCTION__); + /* Done with exclusive hardware access */ + up(&ctrl->crit_sect); return rc; } + rc = p_slot->hpc_ops->check_cmd_status(ctrl); + if (rc) { + err("%s: Failed to disable slot, error code(%d)\n", __FUNCTION__, rc); + /* Done with exclusive hardware access */ + up(&ctrl->crit_sect); + return rc; + } + + /* Done with exclusive hardware access */ + up(&ctrl->crit_sect); + return(rc); } @@ -376,19 +580,37 @@ static int remove_board(struct slot *p_slot) if (p_slot->is_a_board) p_slot->status = 0x01; + /* Wait for exclusive access to hardware */ + down(&ctrl->crit_sect); + /* turn off slot, turn on Amber LED, turn off Green LED */ rc = p_slot->hpc_ops->slot_disable(p_slot); if (rc) { err("%s: Issue of Slot Disable command failed\n", __FUNCTION__); + /* Done with exclusive hardware access */ + up(&ctrl->crit_sect); return rc; } + + rc = p_slot->hpc_ops->check_cmd_status(ctrl); + if (rc) { + err("%s: Failed to disable slot, error code(%d)\n", __FUNCTION__, rc); + /* Done with exclusive hardware access */ + up(&ctrl->crit_sect); + return rc; + } rc = p_slot->hpc_ops->set_attention_status(p_slot, 0); if (rc) { err("%s: Issue of Set Attention command failed\n", __FUNCTION__); + /* Done with exclusive hardware access */ + up(&ctrl->crit_sect); return rc; } + /* Done with exclusive hardware access */ + up(&ctrl->crit_sect); + p_slot->pwr_save = 0; p_slot->is_a_board = 0; @@ -396,10 +618,13 @@ static int remove_board(struct slot *p_slot) } -struct pushbutton_work_info { - struct slot *p_slot; - struct work_struct work; -}; +static void pushbutton_helper_thread (unsigned long data) +{ + pushbutton_pending = data; + + up(&event_semaphore); +} + /** * shpchp_pushbutton_thread @@ -408,63 +633,96 @@ struct pushbutton_work_info { * Handles all pending events and exits. * */ -static void shpchp_pushbutton_thread(void *data) +static void shpchp_pushbutton_thread (unsigned long slot) { - struct pushbutton_work_info *info = data; - struct slot *p_slot = info->p_slot; + struct slot *p_slot = (struct slot *) slot; + u8 getstatus; + + pushbutton_pending = 0; + + if (!p_slot) { + dbg("%s: Error! slot NULL\n", __FUNCTION__); + return; + } + + p_slot->hpc_ops->get_power_status(p_slot, &getstatus); + if (getstatus) { + p_slot->state = POWEROFF_STATE; - mutex_lock(&p_slot->lock); - switch (p_slot->state) { - case POWEROFF_STATE: - mutex_unlock(&p_slot->lock); shpchp_disable_slot(p_slot); - mutex_lock(&p_slot->lock); p_slot->state = STATIC_STATE; - break; - case POWERON_STATE: - mutex_unlock(&p_slot->lock); - if (shpchp_enable_slot(p_slot)) + } else { + p_slot->state = POWERON_STATE; + + if (shpchp_enable_slot(p_slot)) { + /* Wait for exclusive access to hardware */ + down(&p_slot->ctrl->crit_sect); + p_slot->hpc_ops->green_led_off(p_slot); - mutex_lock(&p_slot->lock); + + /* Done with exclusive hardware access */ + up(&p_slot->ctrl->crit_sect); + } p_slot->state = STATIC_STATE; - break; - default: - break; } - mutex_unlock(&p_slot->lock); - kfree(info); + return; } -void queue_pushbutton_work(void *data) -{ - struct slot *p_slot = data; - struct pushbutton_work_info *info; - info = kmalloc(sizeof(*info), GFP_KERNEL); - if (!info) { - err("%s: Cannot allocate memory\n", __FUNCTION__); - return; +/* this is the main worker thread */ +static int event_thread(void* data) +{ + struct controller *ctrl; + lock_kernel(); + daemonize("shpchpd_event"); + unlock_kernel(); + + while (1) { + dbg("!!!!event_thread sleeping\n"); + down_interruptible (&event_semaphore); + dbg("event_thread woken finished = %d\n", event_finished); + if (event_finished || signal_pending(current)) + break; + /* Do stuff here */ + if (pushbutton_pending) + shpchp_pushbutton_thread(pushbutton_pending); + else + for (ctrl = shpchp_ctrl_list; ctrl; ctrl=ctrl->next) + interrupt_event_handler(ctrl); } - info->p_slot = p_slot; - INIT_WORK(&info->work, shpchp_pushbutton_thread, info); + dbg("event_thread signals exit\n"); + up(&event_exit); + return 0; +} - mutex_lock(&p_slot->lock); - switch (p_slot->state) { - case BLINKINGOFF_STATE: - p_slot->state = POWEROFF_STATE; - break; - case BLINKINGON_STATE: - p_slot->state = POWERON_STATE; - break; - default: - goto out; +int shpchp_event_start_thread (void) +{ + int pid; + + /* initialize our semaphores */ + init_MUTEX_LOCKED(&event_exit); + event_finished=0; + + init_MUTEX_LOCKED(&event_semaphore); + pid = kernel_thread(event_thread, NULL, 0); + + if (pid < 0) { + err ("Can't start up our event thread\n"); + return -1; } - queue_work(shpchp_wq, &info->work); - out: - mutex_unlock(&p_slot->lock); + return 0; +} + + +void shpchp_event_stop_thread (void) +{ + event_finished = 1; + up(&event_semaphore); + down(&event_exit); } + static int update_slot_info (struct slot *slot) { struct hotplug_slot_info *info; @@ -484,110 +742,149 @@ static int update_slot_info (struct slot *slot) return result; } -/* - * Note: This function must be called with slot->lock held - */ -static void handle_button_press_event(struct slot *p_slot) +static void interrupt_event_handler(struct controller *ctrl) { + int loop = 0; + int change = 1; + u8 hp_slot; u8 getstatus; + struct slot *p_slot; - switch (p_slot->state) { - case STATIC_STATE: - p_slot->hpc_ops->get_power_status(p_slot, &getstatus); - if (getstatus) { - p_slot->state = BLINKINGOFF_STATE; - info(msg_button_off, p_slot->name); - } else { - p_slot->state = BLINKINGON_STATE; - info(msg_button_on, p_slot->name); - } - /* blink green LED and turn off amber */ - p_slot->hpc_ops->green_led_blink(p_slot); - p_slot->hpc_ops->set_attention_status(p_slot, 0); - - schedule_delayed_work(&p_slot->work, 5*HZ); - break; - case BLINKINGOFF_STATE: - case BLINKINGON_STATE: - /* - * Cancel if we are still blinking; this means that we - * press the attention again before the 5 sec. limit - * expires to cancel hot-add or hot-remove - */ - info("Button cancel on Slot(%s)\n", p_slot->name); - dbg("%s: button cancel\n", __FUNCTION__); - cancel_delayed_work(&p_slot->work); - if (p_slot->state == BLINKINGOFF_STATE) - p_slot->hpc_ops->green_led_on(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->name); - p_slot->state = STATIC_STATE; - break; - case POWEROFF_STATE: - case POWERON_STATE: - /* - * Ignore if the slot is on power-on or power-off state; - * this means that the previous attention button action - * to hot-add or hot-remove is undergoing - */ - info("Button ignore on Slot(%s)\n", p_slot->name); - update_slot_info(p_slot); - break; - default: - warn("Not a valid state\n"); - break; - } -} - -static void interrupt_event_handler(void *data) -{ - struct event_info *info = data; - struct slot *p_slot = info->p_slot; - - mutex_lock(&p_slot->lock); - switch (info->event_type) { - case INT_BUTTON_PRESS: - handle_button_press_event(p_slot); - break; - case INT_POWER_FAULT: - dbg("%s: power fault\n", __FUNCTION__); - p_slot->hpc_ops->set_attention_status(p_slot, 1); - p_slot->hpc_ops->green_led_off(p_slot); - break; - default: - update_slot_info(p_slot); - break; + while (change) { + change = 0; + + for (loop = 0; loop < 10; loop++) { + if (ctrl->event_queue[loop].event_type != 0) { + dbg("%s:loop %x event_type %x\n", __FUNCTION__, loop, + ctrl->event_queue[loop].event_type); + hp_slot = ctrl->event_queue[loop].hp_slot; + + p_slot = shpchp_find_slot(ctrl, hp_slot + ctrl->slot_device_offset); + + if (ctrl->event_queue[loop].event_type == INT_BUTTON_CANCEL) { + dbg("%s: button cancel\n", __FUNCTION__); + del_timer(&p_slot->task_event); + + switch (p_slot->state) { + case BLINKINGOFF_STATE: + /* Wait for exclusive access to hardware */ + down(&ctrl->crit_sect); + + p_slot->hpc_ops->green_led_on(p_slot); + + p_slot->hpc_ops->set_attention_status(p_slot, 0); + + /* Done with exclusive hardware access */ + up(&ctrl->crit_sect); + break; + case BLINKINGON_STATE: + /* Wait for exclusive access to hardware */ + down(&ctrl->crit_sect); + + p_slot->hpc_ops->green_led_off(p_slot); + + p_slot->hpc_ops->set_attention_status(p_slot, 0); + + /* Done with exclusive hardware access */ + up(&ctrl->crit_sect); + + break; + default: + warn("Not a valid state\n"); + return; + } + info(msg_button_cancel, p_slot->number); + p_slot->state = STATIC_STATE; + } else if (ctrl->event_queue[loop].event_type == INT_BUTTON_PRESS) { + /* Button Pressed (No action on 1st press...) */ + dbg("%s: Button pressed\n", __FUNCTION__); + + p_slot->hpc_ops->get_power_status(p_slot, &getstatus); + if (getstatus) { + /* slot is on */ + dbg("%s: slot is on\n", __FUNCTION__); + p_slot->state = BLINKINGOFF_STATE; + info(msg_button_off, p_slot->number); + } else { + /* slot is off */ + dbg("%s: slot is off\n", __FUNCTION__); + p_slot->state = BLINKINGON_STATE; + info(msg_button_on, p_slot->number); + } + + /* Wait for exclusive access to hardware */ + down(&ctrl->crit_sect); + + /* blink green LED and turn off amber */ + p_slot->hpc_ops->green_led_blink(p_slot); + + p_slot->hpc_ops->set_attention_status(p_slot, 0); + + /* Done with exclusive hardware access */ + up(&ctrl->crit_sect); + + init_timer(&p_slot->task_event); + p_slot->task_event.expires = jiffies + 5 * HZ; /* 5 second delay */ + p_slot->task_event.function = (void (*)(unsigned long)) pushbutton_helper_thread; + p_slot->task_event.data = (unsigned long) p_slot; + + dbg("%s: add_timer p_slot = %p\n", __FUNCTION__,(void *) p_slot); + add_timer(&p_slot->task_event); + } else if (ctrl->event_queue[loop].event_type == INT_POWER_FAULT) { + /***********POWER FAULT********************/ + dbg("%s: power fault\n", __FUNCTION__); + /* Wait for exclusive access to hardware */ + down(&ctrl->crit_sect); + + p_slot->hpc_ops->set_attention_status(p_slot, 1); + + p_slot->hpc_ops->green_led_off(p_slot); + + /* Done with exclusive hardware access */ + up(&ctrl->crit_sect); + } else { + /* refresh notification */ + if (p_slot) + update_slot_info(p_slot); + } + + ctrl->event_queue[loop].event_type = 0; + + change = 1; + } + } /* End of FOR loop */ } - mutex_unlock(&p_slot->lock); - kfree(info); + return; } -static int shpchp_enable_slot (struct slot *p_slot) +int shpchp_enable_slot (struct slot *p_slot) { u8 getstatus = 0; - int rc, retval = -ENODEV; + int rc; /* Check to see if (latch closed, card present, power off) */ - mutex_lock(&p_slot->ctrl->crit_sect); + down(&p_slot->ctrl->crit_sect); rc = p_slot->hpc_ops->get_adapter_status(p_slot, &getstatus); if (rc || !getstatus) { - info("No adapter on slot(%s)\n", p_slot->name); - goto out; + info("%s: no adapter on slot(%x)\n", __FUNCTION__, p_slot->number); + up(&p_slot->ctrl->crit_sect); + return -ENODEV; } rc = p_slot->hpc_ops->get_latch_status(p_slot, &getstatus); if (rc || getstatus) { - info("Latch open on slot(%s)\n", p_slot->name); - goto out; + info("%s: latch open on slot(%x)\n", __FUNCTION__, p_slot->number); + up(&p_slot->ctrl->crit_sect); + return -ENODEV; } rc = p_slot->hpc_ops->get_power_status(p_slot, &getstatus); if (rc || getstatus) { - info("Already enabled on slot(%s)\n", p_slot->name); - goto out; + info("%s: already enabled on slot(%x)\n", __FUNCTION__, p_slot->number); + up(&p_slot->ctrl->crit_sect); + return -ENODEV; } + up(&p_slot->ctrl->crit_sect); p_slot->is_a_board = 1; @@ -602,119 +899,56 @@ static int shpchp_enable_slot (struct slot *p_slot) && p_slot->ctrl->num_slots == 1) { /* handle amd pogo errata; this must be done before enable */ amd_pogo_errata_save_misc_reg(p_slot); - retval = board_added(p_slot); + rc = board_added(p_slot); /* handle amd pogo errata; this must be done after enable */ amd_pogo_errata_restore_misc_reg(p_slot); } else - retval = board_added(p_slot); + rc = board_added(p_slot); - if (retval) { + if (rc) { p_slot->hpc_ops->get_adapter_status(p_slot, &(p_slot->presence_save)); p_slot->hpc_ops->get_latch_status(p_slot, &getstatus); } update_slot_info(p_slot); - out: - mutex_unlock(&p_slot->ctrl->crit_sect); - return retval; + return rc; } -static int shpchp_disable_slot (struct slot *p_slot) +int shpchp_disable_slot (struct slot *p_slot) { u8 getstatus = 0; - int rc, retval = -ENODEV; + int ret = 0; if (!p_slot->ctrl) return -ENODEV; /* Check to see if (latch closed, card present, power on) */ - mutex_lock(&p_slot->ctrl->crit_sect); + down(&p_slot->ctrl->crit_sect); - rc = p_slot->hpc_ops->get_adapter_status(p_slot, &getstatus); - if (rc || !getstatus) { - info("No adapter on slot(%s)\n", p_slot->name); - goto out; + ret = p_slot->hpc_ops->get_adapter_status(p_slot, &getstatus); + if (ret || !getstatus) { + info("%s: no adapter on slot(%x)\n", __FUNCTION__, p_slot->number); + up(&p_slot->ctrl->crit_sect); + return -ENODEV; } - rc = p_slot->hpc_ops->get_latch_status(p_slot, &getstatus); - if (rc || getstatus) { - info("Latch open on slot(%s)\n", p_slot->name); - goto out; + ret = p_slot->hpc_ops->get_latch_status(p_slot, &getstatus); + if (ret || getstatus) { + info("%s: latch open on slot(%x)\n", __FUNCTION__, p_slot->number); + up(&p_slot->ctrl->crit_sect); + return -ENODEV; } - rc = p_slot->hpc_ops->get_power_status(p_slot, &getstatus); - if (rc || !getstatus) { - info("Already disabled slot(%s)\n", p_slot->name); - goto out; + ret = p_slot->hpc_ops->get_power_status(p_slot, &getstatus); + if (ret || !getstatus) { + info("%s: already disabled slot(%x)\n", __FUNCTION__, p_slot->number); + up(&p_slot->ctrl->crit_sect); + return -ENODEV; } + up(&p_slot->ctrl->crit_sect); - retval = remove_board(p_slot); + ret = remove_board(p_slot); update_slot_info(p_slot); - out: - mutex_unlock(&p_slot->ctrl->crit_sect); - return retval; -} - -int shpchp_sysfs_enable_slot(struct slot *p_slot) -{ - int retval = -ENODEV; - - mutex_lock(&p_slot->lock); - switch (p_slot->state) { - case BLINKINGON_STATE: - cancel_delayed_work(&p_slot->work); - case STATIC_STATE: - p_slot->state = POWERON_STATE; - mutex_unlock(&p_slot->lock); - retval = shpchp_enable_slot(p_slot); - mutex_lock(&p_slot->lock); - p_slot->state = STATIC_STATE; - break; - case POWERON_STATE: - info("Slot %s is already in powering on state\n", - p_slot->name); - break; - case BLINKINGOFF_STATE: - case POWEROFF_STATE: - info("Already enabled on slot %s\n", p_slot->name); - break; - default: - err("Not a valid state on slot %s\n", p_slot->name); - break; - } - mutex_unlock(&p_slot->lock); - - return retval; + return ret; } -int shpchp_sysfs_disable_slot(struct slot *p_slot) -{ - int retval = -ENODEV; - - mutex_lock(&p_slot->lock); - switch (p_slot->state) { - case BLINKINGOFF_STATE: - cancel_delayed_work(&p_slot->work); - case STATIC_STATE: - p_slot->state = POWEROFF_STATE; - mutex_unlock(&p_slot->lock); - retval = shpchp_disable_slot(p_slot); - mutex_lock(&p_slot->lock); - p_slot->state = STATIC_STATE; - break; - case POWEROFF_STATE: - info("Slot %s is already in powering off state\n", - p_slot->name); - break; - case BLINKINGON_STATE: - case POWERON_STATE: - info("Already disabled on slot %s\n", p_slot->name); - break; - default: - err("Not a valid state on slot %s\n", p_slot->name); - break; - } - mutex_unlock(&p_slot->lock); - - return retval; -} diff --git a/drivers/pci/hotplug/shpchp_hpc.c b/drivers/pci/hotplug/shpchp_hpc.c index 0f9798df4..b4226ff3a 100644 --- a/drivers/pci/hotplug/shpchp_hpc.c +++ b/drivers/pci/hotplug/shpchp_hpc.c @@ -82,6 +82,31 @@ #define SLOT_100MHZ_PCIX_533 0x0f000000 #define SLOT_133MHZ_PCIX_533 0xf0000000 + +/* Secondary Bus Configuration Register */ +/* For PI = 1, Bits 0 to 2 have been encoded as follows to show current bus speed/mode */ +#define PCI_33MHZ 0x0 +#define PCI_66MHZ 0x1 +#define PCIX_66MHZ 0x2 +#define PCIX_100MHZ 0x3 +#define PCIX_133MHZ 0x4 + +/* For PI = 2, Bits 0 to 3 have been encoded as follows to show current bus speed/mode */ +#define PCI_33MHZ 0x0 +#define PCI_66MHZ 0x1 +#define PCIX_66MHZ 0x2 +#define PCIX_100MHZ 0x3 +#define PCIX_133MHZ 0x4 +#define PCIX_66MHZ_ECC 0x5 +#define PCIX_100MHZ_ECC 0x6 +#define PCIX_133MHZ_ECC 0x7 +#define PCIX_66MHZ_266 0x9 +#define PCIX_100MHZ_266 0xa +#define PCIX_133MHZ_266 0xb +#define PCIX_66MHZ_533 0x11 +#define PCIX_100MHZ_533 0x12 +#define PCIX_133MHZ_533 0x13 + /* Slot Configuration */ #define SLOT_NUM 0x0000001F #define FIRST_DEV_NUM 0x00001F00 @@ -90,94 +115,77 @@ #define MRLSENSOR 0x40000000 #define ATTN_BUTTON 0x80000000 -/* - * Interrupt Locator Register definitions - */ -#define CMD_INTR_PENDING (1 << 0) -#define SLOT_INTR_PENDING(i) (1 << (i + 1)) +/* Slot Status Field Definitions */ +/* Slot State */ +#define PWR_ONLY 0x0001 +#define ENABLED 0x0002 +#define DISABLED 0x0003 -/* - * 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 +/* Power Indicator State */ +#define PWR_LED_ON 0x0004 +#define PWR_LED_BLINK 0x0008 +#define PWR_LED_OFF 0x000c -/* - * 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) +/* Attention Indicator State */ +#define ATTEN_LED_ON 0x0010 +#define ATTEN_LED_BLINK 0x0020 +#define ATTEN_LED_OFF 0x0030 -/* - * 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 */ +/* 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 + +/* 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 + +/* 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 + +/* Set bus speed/mode A - 0x40h to 0x47h */ +#define SETA_PCI_33MHZ 0x40 #define SETA_PCI_66MHZ 0x41 #define SETA_PCIX_66MHZ 0x42 #define SETA_PCIX_100MHZ 0x43 #define SETA_PCIX_133MHZ 0x44 -#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 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 SETB_PCI_66MHZ 0x51 #define SETB_PCIX_66MHZ_PM 0x52 #define SETB_PCIX_100MHZ_PM 0x53 @@ -191,115 +199,80 @@ #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 -/* - * SHPC controller command error code - */ + +/* 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 */ #define SWITCH_OPEN 0x1 #define INVALID_CMD 0x2 #define INVALID_SPEED_MODE 0x4 -/* - * For accessing SHPC Working Register Set via PCI Configuration Space - */ +/* For accessing SHPC Working Register Set */ #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 atomic_t shpchp_num_controllers = ATOMIC_INIT(0); +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); -static void start_int_poll_timer(struct php_ctlr_state_s *php_ctlr, int sec); -static int hpc_check_cmd_status(struct controller *ctrl); - -static inline u8 shpc_readb(struct controller *ctrl, int reg) -{ - return readb(ctrl->hpc_ctlr_handle->creg + reg); -} - -static inline void shpc_writeb(struct controller *ctrl, int reg, u8 val) -{ - writeb(val, ctrl->hpc_ctlr_handle->creg + reg); -} +static void start_int_poll_timer(struct php_ctlr_state_s *php_ctlr, int seconds); -static inline u16 shpc_readw(struct controller *ctrl, int reg) +/* This is the interrupt polling timeout function. */ +static void int_poll_timeout(unsigned long lphp_ctlr) { - return readw(ctrl->hpc_ctlr_handle->creg + reg); -} + struct php_ctlr_state_s *php_ctlr = (struct php_ctlr_state_s *)lphp_ctlr; -static inline void shpc_writew(struct controller *ctrl, int reg, u16 val) -{ - writew(val, ctrl->hpc_ctlr_handle->creg + reg); -} + DBG_ENTER_ROUTINE -static inline u32 shpc_readl(struct controller *ctrl, int reg) -{ - return readl(ctrl->hpc_ctlr_handle->creg + reg); -} + if ( !php_ctlr ) { + err("%s: Invalid HPC controller handle!\n", __FUNCTION__); + return; + } -static inline void shpc_writel(struct controller *ctrl, int reg, u32 val) -{ - writel(val, ctrl->hpc_ctlr_handle->creg + reg); -} + /* Poll for interrupt events. regs == NULL => polling */ + shpc_isr( 0, (void *)php_ctlr, NULL ); -static inline int shpc_indirect_read(struct controller *ctrl, int index, - u32 *value) -{ - int rc; - u32 cap_offset = ctrl->cap_offset; - struct pci_dev *pdev = ctrl->pci_dev; + 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*/ - 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); + start_int_poll_timer(php_ctlr, shpchp_poll_time); + + return; } -/* - * This is the interrupt polling timeout function. - */ -static void int_poll_timeout(unsigned long lphp_ctlr) +/* This function starts the interrupt polling timer. */ +static void start_int_poll_timer(struct php_ctlr_state_s *php_ctlr, int seconds) { - 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 (!php_ctlr) { + err("%s: Invalid HPC controller handle!\n", __FUNCTION__); + return; + } - start_int_poll_timer(php_ctlr, shpchp_poll_time); + if ( ( seconds <= 0 ) || ( seconds > 60 ) ) + seconds = 2; /* Clamp to sane value */ - DBG_LEAVE_ROUTINE -} + 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); -/* - * 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); + return; } static inline int shpc_wait_cmd(struct controller *ctrl) @@ -323,18 +296,21 @@ static inline int shpc_wait_cmd(struct controller *ctrl) static int shpc_write_cmd(struct slot *slot, u8 t_slot, u8 cmd) { - struct controller *ctrl = slot->ctrl; + struct php_ctlr_state_s *php_ctlr = slot->ctrl->hpc_ctlr_handle; u16 cmd_status; int retval = 0; u16 temp_word; int i; DBG_ENTER_ROUTINE - - mutex_lock(&slot->ctrl->cmd_lock); + + if (!php_ctlr) { + err("%s: Invalid HPC controller handle!\n", __FUNCTION__); + return -1; + } for (i = 0; i < 10; i++) { - cmd_status = shpc_readw(ctrl, CMD_STATUS); + cmd_status = readw(php_ctlr->creg + CMD_STATUS); if (!(cmd_status & 0x1)) break; @@ -342,13 +318,12 @@ static int shpc_write_cmd(struct slot *slot, u8 t_slot, u8 cmd) msleep(100); } - cmd_status = shpc_readw(ctrl, CMD_STATUS); + cmd_status = readw(php_ctlr->creg + CMD_STATUS); if (cmd_status & 0x1) { /* After 1 sec and and the controller is still busy */ err("%s : Controller is still busy after 1 sec.\n", __FUNCTION__); - retval = -EBUSY; - goto out; + return -1; } ++t_slot; @@ -359,23 +334,12 @@ static int shpc_write_cmd(struct slot *slot, u8 t_slot, u8 cmd) * command. */ slot->ctrl->cmd_busy = 1; - shpc_writew(ctrl, CMD, temp_word); + writew(temp_word, php_ctlr->creg + CMD); /* * Wait for command completion. */ retval = shpc_wait_cmd(slot->ctrl); - if (retval) - goto out; - - cmd_status = hpc_check_cmd_status(slot->ctrl); - if (cmd_status) { - err("%s: Failed to issued command 0x%x (error code = %d)\n", - __FUNCTION__, cmd, cmd_status); - retval = -EIO; - } - out: - mutex_unlock(&slot->ctrl->cmd_lock); DBG_LEAVE_ROUTINE return retval; @@ -383,12 +347,18 @@ 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 = shpc_readw(ctrl, CMD_STATUS) & 0x000F; + cmd_status = readw(php_ctlr->creg + CMD_STATUS) & 0x000F; switch (cmd_status >> 1) { case 0: @@ -417,27 +387,37 @@ static int hpc_check_cmd_status(struct controller *ctrl) static int hpc_get_attention_status(struct slot *slot, u8 *status) { - struct controller *ctrl = slot->ctrl; + struct php_ctlr_state_s *php_ctlr = slot->ctrl->hpc_ctlr_handle; u32 slot_reg; - u8 state; + u16 slot_status; + u8 atten_led_state; DBG_ENTER_ROUTINE - slot_reg = shpc_readl(ctrl, SLOT_REG(slot->hp_slot)); - state = (slot_reg & ATN_LED_STATE_MASK) >> ATN_LED_STATE_SHIFT; + 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; - switch (state) { - case ATN_LED_STATE_ON: + switch (atten_led_state) { + case 0: + *status = 0xFF; /* Reserved */ + break; + case 1: *status = 1; /* On */ break; - case ATN_LED_STATE_BLINK: + case 2: *status = 2; /* Blink */ break; - case ATN_LED_STATE_OFF: + case 3: *status = 0; /* Off */ break; default: - *status = 0xFF; /* Reserved */ + *status = 0xFF; break; } @@ -447,44 +427,64 @@ static int hpc_get_attention_status(struct slot *slot, u8 *status) static int hpc_get_power_status(struct slot * slot, u8 *status) { - struct controller *ctrl = slot->ctrl; + struct php_ctlr_state_s *php_ctlr = slot->ctrl->hpc_ctlr_handle; u32 slot_reg; - u8 state; + u16 slot_status; + u8 slot_state; + int retval = 0; DBG_ENTER_ROUTINE - slot_reg = shpc_readl(ctrl, SLOT_REG(slot->hp_slot)); - state = (slot_reg & SLOT_STATE_MASK) >> SLOT_STATE_SHIFT; + if (!slot->ctrl->hpc_ctlr_handle) { + err("%s: Invalid HPC controller handle!\n", __FUNCTION__); + return -1; + } - switch (state) { - case SLOT_STATE_PWRONLY: + slot_reg = readl(php_ctlr->creg + SLOT1 + 4*(slot->hp_slot)); + slot_status = (u16) slot_reg; + slot_state = (slot_status & 0x0003); + + switch (slot_state) { + case 0: + *status = 0xFF; + break; + case 1: *status = 2; /* Powered only */ break; - case SLOT_STATE_ENABLED: + case 2: *status = 1; /* Enabled */ break; - case SLOT_STATE_DISABLED: + case 3: *status = 0; /* Disabled */ break; default: - *status = 0xFF; /* Reserved */ + *status = 0xFF; break; } DBG_LEAVE_ROUTINE - return 0; + return retval; } static int hpc_get_latch_status(struct slot *slot, u8 *status) { - struct controller *ctrl = slot->ctrl; + struct php_ctlr_state_s *php_ctlr = slot->ctrl->hpc_ctlr_handle; u32 slot_reg; + u16 slot_status; DBG_ENTER_ROUTINE - slot_reg = shpc_readl(ctrl, SLOT_REG(slot->hp_slot)); - *status = !!(slot_reg & MRL_SENSOR); /* 0 -> close; 1 -> open */ + 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 */ + DBG_LEAVE_ROUTINE return 0; @@ -492,15 +492,22 @@ static int hpc_get_latch_status(struct slot *slot, u8 *status) static int hpc_get_adapter_status(struct slot *slot, u8 *status) { - struct controller *ctrl = slot->ctrl; + struct php_ctlr_state_s *php_ctlr = slot->ctrl->hpc_ctlr_handle; u32 slot_reg; - u8 state; + u16 slot_status; + u8 card_state; DBG_ENTER_ROUTINE - slot_reg = shpc_readl(ctrl, SLOT_REG(slot->hp_slot)); - state = (slot_reg & PRSNT_MASK) >> PRSNT_SHIFT; - *status = (state != 0x3) ? 1 : 0; + 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; DBG_LEAVE_ROUTINE return 0; @@ -508,11 +515,16 @@ static int hpc_get_adapter_status(struct slot *slot, u8 *status) static int hpc_get_prog_int(struct slot *slot, u8 *prog_int) { - struct controller *ctrl = slot->ctrl; + struct php_ctlr_state_s *php_ctlr = slot->ctrl->hpc_ctlr_handle; DBG_ENTER_ROUTINE + + if (!slot->ctrl->hpc_ctlr_handle) { + err("%s: Invalid HPC controller handle!\n", __FUNCTION__); + return -1; + } - *prog_int = shpc_readb(ctrl, PROG_INTERFACE); + *prog_int = readb(php_ctlr->creg + PROG_INTERFACE); DBG_LEAVE_ROUTINE return 0; @@ -520,70 +532,101 @@ 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) { + struct php_ctlr_state_s *php_ctlr = slot->ctrl->hpc_ctlr_handle; + u32 slot_reg; + u16 slot_status, sec_bus_status; + u8 m66_cap, pcix_cap, pi; int retval = 0; - 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; + if (!slot->ctrl->hpc_ctlr_handle) { + err("%s: Invalid HPC controller handle!\n", __FUNCTION__); + return -1; + } - 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; + if (slot->hp_slot >= php_ctlr->num_slots) { + err("%s: Invalid HPC slot number!\n", __FUNCTION__); + return -1; } + + pi = readb(php_ctlr->creg + PROG_INTERFACE); + slot_reg = readl(php_ctlr->creg + SLOT1 + 4*(slot->hp_slot)); + dbg("%s: pi = %d, slot_reg = %x\n", __FUNCTION__, pi, slot_reg); + slot_status = (u16) slot_reg; + dbg("%s: slot_status = %x\n", __FUNCTION__, slot_status); + sec_bus_status = readw(php_ctlr->creg + SEC_BUS_CONFIG); - dbg("%s: slot_reg = %x, pcix_cap = %x, m66_cap = %x\n", - __FUNCTION__, slot_reg, pcix_cap, m66_cap); + pcix_cap = (u8) ((slot_status & 0x3000) >> 12); + dbg("%s: pcix_cap = %x\n", __FUNCTION__, pcix_cap); + m66_cap = (u8) ((slot_status & 0x0200) >> 9); + dbg("%s: m66_cap = %x\n", __FUNCTION__, m66_cap); - switch (pcix_cap) { - case 0x0: - *value = m66_cap ? PCI_SPEED_66MHz : PCI_SPEED_33MHz; - break; - case 0x1: - *value = PCI_SPEED_66MHz_PCIX; - break; - case 0x3: - *value = PCI_SPEED_133MHz_PCIX; - break; - case 0x4: - *value = PCI_SPEED_133MHz_PCIX_266; - break; - case 0x5: - *value = PCI_SPEED_133MHz_PCIX_533; - break; - case 0x2: - default: - *value = PCI_SPEED_UNKNOWN; - retval = -ENODEV; - break; + + if (pi == 2) { + switch (pcix_cap) { + case 0: + *value = m66_cap ? PCI_SPEED_66MHz : PCI_SPEED_33MHz; + break; + case 1: + *value = PCI_SPEED_66MHz_PCIX; + break; + case 3: + *value = PCI_SPEED_133MHz_PCIX; + break; + case 4: + *value = PCI_SPEED_133MHz_PCIX_266; + break; + case 5: + *value = PCI_SPEED_133MHz_PCIX_533; + break; + case 2: /* Reserved */ + default: + *value = PCI_SPEED_UNKNOWN; + retval = -ENODEV; + break; + } + } else { + switch (pcix_cap) { + case 0: + *value = m66_cap ? PCI_SPEED_66MHz : PCI_SPEED_33MHz; + break; + case 1: + *value = PCI_SPEED_66MHz_PCIX; + break; + case 3: + *value = PCI_SPEED_133MHz_PCIX; + break; + case 2: /* Reserved */ + default: + *value = PCI_SPEED_UNKNOWN; + retval = -ENODEV; + break; + } } dbg("Adapter speed = %d\n", *value); + DBG_LEAVE_ROUTINE return retval; } static int hpc_get_mode1_ECC_cap(struct slot *slot, u8 *mode) { - struct controller *ctrl = slot->ctrl; + struct php_ctlr_state_s *php_ctlr = slot->ctrl->hpc_ctlr_handle; u16 sec_bus_status; u8 pi; int retval = 0; DBG_ENTER_ROUTINE - pi = shpc_readb(ctrl, PROG_INTERFACE); - sec_bus_status = shpc_readw(ctrl, SEC_BUS_CONFIG); + 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); if (pi == 2) { *mode = (sec_bus_status & 0x0100) >> 8; @@ -599,53 +642,128 @@ static int hpc_get_mode1_ECC_cap(struct slot *slot, u8 *mode) static int hpc_query_power_fault(struct slot * slot) { - struct controller *ctrl = slot->ctrl; + struct php_ctlr_state_s *php_ctlr = slot->ctrl->hpc_ctlr_handle; u32 slot_reg; + u16 slot_status; + u8 pwr_fault_state, status; DBG_ENTER_ROUTINE - slot_reg = shpc_readl(ctrl, SLOT_REG(slot->hp_slot)); + 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; DBG_LEAVE_ROUTINE /* Note: Logic 0 => fault */ - return !(slot_reg & POWER_FAULT); + return status; } 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 = SET_ATTN_OFF; /* OFF */ + slot_cmd = 0x30; /* OFF */ break; case 1: - slot_cmd = SET_ATTN_ON; /* ON */ + slot_cmd = 0x10; /* ON */ break; case 2: - slot_cmd = SET_ATTN_BLINK; /* BLINK */ + slot_cmd = 0x20; /* BLINK */ break; default: return -1; } - return shpc_write_cmd(slot, slot->hp_slot, slot_cmd); + shpc_write_cmd(slot, slot->hp_slot, slot_cmd); + + return rc; } static void hpc_set_green_led_on(struct slot *slot) { - shpc_write_cmd(slot, slot->hp_slot, SET_PWR_ON); + 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; } static void hpc_set_green_led_off(struct slot *slot) { - shpc_write_cmd(slot, slot->hp_slot, SET_PWR_OFF); + 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; } static void hpc_set_green_led_blink(struct slot *slot) { - shpc_write_cmd(slot, slot->hp_slot, SET_PWR_BLINK); + 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; } int shpc_get_ctlr_slot_config(struct controller *ctrl, @@ -655,17 +773,21 @@ int shpc_get_ctlr_slot_config(struct controller *ctrl, int *updown, /* physical_slot_num increament: 1 or -1 */ int *flags) { - u32 slot_config; + struct php_ctlr_state_s *php_ctlr = ctrl->hpc_ctlr_handle; DBG_ENTER_ROUTINE - 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; + 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() */ + *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; @@ -675,35 +797,14 @@ 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 - /* - * Mask event interrupts and SERRs of all slots - */ - 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); + if (!ctrl->hpc_ctlr_handle) { + err("%s: Invalid HPC controller handle!\n", __FUNCTION__); + return ; } - 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 { @@ -713,7 +814,6 @@ static void hpc_release_ctlr(struct controller *ctrl) pci_disable_msi(php_ctlr->pci_dev); } } - if (php_ctlr->pci_dev) { iounmap(php_ctlr->creg); release_mem_region(ctrl->mmio_base, ctrl->mmio_size); @@ -739,217 +839,302 @@ 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) { - int retval; + struct php_ctlr_state_s *php_ctlr = slot->ctrl->hpc_ctlr_handle; + u8 slot_cmd; + int retval = 0; DBG_ENTER_ROUTINE - retval = shpc_write_cmd(slot, slot->hp_slot, SET_SLOT_PWR); + 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); + if (retval) { err("%s: Write command failed!\n", __FUNCTION__); - return retval; + return -1; } DBG_LEAVE_ROUTINE - return 0; + return retval; } static int hpc_slot_enable(struct slot * slot) { - int retval; + struct php_ctlr_state_s *php_ctlr = slot->ctrl->hpc_ctlr_handle; + u8 slot_cmd; + int retval = 0; DBG_ENTER_ROUTINE - /* 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 (!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); + if (retval) { err("%s: Write command failed!\n", __FUNCTION__); - return retval; + return -1; } DBG_LEAVE_ROUTINE - return 0; + return retval; } static int hpc_slot_disable(struct slot * slot) { - int retval; + struct php_ctlr_state_s *php_ctlr = slot->ctrl->hpc_ctlr_handle; + u8 slot_cmd; + int retval = 0; DBG_ENTER_ROUTINE - /* 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 (!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); + if (retval) { err("%s: Write command failed!\n", __FUNCTION__); - return retval; + return -1; } DBG_LEAVE_ROUTINE - return 0; + return retval; } static int hpc_set_bus_speed_mode(struct slot * slot, enum pci_bus_speed value) { - int retval; - struct controller *ctrl = slot->ctrl; - u8 pi, cmd; + u8 slot_cmd; + u8 pi; + int retval = 0; + struct php_ctlr_state_s *php_ctlr = slot->ctrl->hpc_ctlr_handle; DBG_ENTER_ROUTINE + + if (!slot->ctrl->hpc_ctlr_handle) { + err("%s: Invalid HPC controller handle!\n", __FUNCTION__); + return -1; + } - pi = shpc_readb(ctrl, PROG_INTERFACE); - if ((pi == 1) && (value > PCI_SPEED_133MHz_PCIX)) - return -EINVAL; + pi = readb(php_ctlr->creg + PROG_INTERFACE); + + if (pi == 1) { + switch (value) { + case 0: + slot_cmd = SETA_PCI_33MHZ; + break; + case 1: + slot_cmd = SETA_PCI_66MHZ; + break; + case 2: + slot_cmd = SETA_PCIX_66MHZ; + break; + case 3: + slot_cmd = SETA_PCIX_100MHZ; + break; + case 4: + slot_cmd = SETA_PCIX_133MHZ; + break; + default: + slot_cmd = PCI_SPEED_UNKNOWN; + retval = -ENODEV; + return retval; + } + } else { + switch (value) { + case 0: + slot_cmd = SETB_PCI_33MHZ; + break; + case 1: + slot_cmd = SETB_PCI_66MHZ; + break; + case 2: + slot_cmd = SETB_PCIX_66MHZ_PM; + break; + case 3: + slot_cmd = SETB_PCIX_100MHZ_PM; + break; + case 4: + slot_cmd = SETB_PCIX_133MHZ_PM; + break; + case 5: + slot_cmd = SETB_PCIX_66MHZ_EM; + break; + case 6: + slot_cmd = SETB_PCIX_100MHZ_EM; + break; + case 7: + slot_cmd = SETB_PCIX_133MHZ_EM; + break; + case 8: + slot_cmd = SETB_PCIX_66MHZ_266; + break; + case 0x9: + slot_cmd = SETB_PCIX_100MHZ_266; + break; + case 0xa: + slot_cmd = SETB_PCIX_133MHZ_266; + break; + case 0xb: + slot_cmd = SETB_PCIX_66MHZ_533; + break; + case 0xc: + slot_cmd = SETB_PCIX_100MHZ_533; + break; + case 0xd: + slot_cmd = SETB_PCIX_133MHZ_533; + break; + default: + slot_cmd = PCI_SPEED_UNKNOWN; + retval = -ENODEV; + return retval; + } - switch (value) { - case PCI_SPEED_33MHz: - cmd = SETA_PCI_33MHZ; - break; - case PCI_SPEED_66MHz: - cmd = SETA_PCI_66MHZ; - break; - case PCI_SPEED_66MHz_PCIX: - cmd = SETA_PCIX_66MHZ; - break; - case PCI_SPEED_100MHz_PCIX: - cmd = SETA_PCIX_100MHZ; - break; - case PCI_SPEED_133MHz_PCIX: - cmd = SETA_PCIX_133MHZ; - break; - case PCI_SPEED_66MHz_PCIX_ECC: - cmd = SETB_PCIX_66MHZ_EM; - break; - case PCI_SPEED_100MHz_PCIX_ECC: - cmd = SETB_PCIX_100MHZ_EM; - break; - case PCI_SPEED_133MHz_PCIX_ECC: - cmd = SETB_PCIX_133MHZ_EM; - break; - case PCI_SPEED_66MHz_PCIX_266: - cmd = SETB_PCIX_66MHZ_266; - break; - case PCI_SPEED_100MHz_PCIX_266: - cmd = SETB_PCIX_100MHZ_266; - break; - case PCI_SPEED_133MHz_PCIX_266: - cmd = SETB_PCIX_133MHZ_266; - break; - case PCI_SPEED_66MHz_PCIX_533: - cmd = SETB_PCIX_66MHZ_533; - break; - case PCI_SPEED_100MHz_PCIX_533: - cmd = SETB_PCIX_100MHZ_533; - break; - case PCI_SPEED_133MHz_PCIX_533: - cmd = SETB_PCIX_133MHZ_533; - break; - default: - return -EINVAL; } - - retval = shpc_write_cmd(slot, 0, cmd); - if (retval) + retval = shpc_write_cmd(slot, 0, slot_cmd); + if (retval) { err("%s: Write command failed!\n", __FUNCTION__); + return -1; + } DBG_LEAVE_ROUTINE 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 = (struct controller *)dev_id; - struct php_ctlr_state_s *php_ctlr = ctrl->hpc_ctlr_handle; - u32 serr_int, slot_reg, intr_loc, intr_loc2; + 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; 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 = shpc_readl(ctrl, INTR_LOC); + intr_loc = readl(php_ctlr->creg + 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 - */ - 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); + /* 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); - intr_loc2 = shpc_readl(ctrl, INTR_LOC); + intr_loc2 = readl(php_ctlr->creg + INTR_LOC); dbg("%s: intr_loc2 = %x\n",__FUNCTION__, intr_loc2); } - if (intr_loc & CMD_INTR_PENDING) { + if (intr_loc & 0x0001) { /* * Command Complete Interrupt Pending * RO only - clear by writing 1 to the Command Completion * Detect bit in Controller SERR-INT register */ - serr_int = shpc_readl(ctrl, SERR_INTR_ENABLE); - serr_int &= ~SERR_INTR_RSVDZ_MASK; - shpc_writel(ctrl, SERR_INTR_ENABLE, serr_int); - + temp_dword = readl(php_ctlr->creg + SERR_INTR_ENABLE); + temp_dword &= 0xfffdffff; + writel(temp_dword, php_ctlr->creg + SERR_INTR_ENABLE); ctrl->cmd_busy = 0; wake_up_interruptible(&ctrl->queue); } - 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 & 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 ((intr_loc = (intr_loc >> 1)) == 0) { + /* 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); - if (slot_reg & (ISO_PFAULT_DETECTED | CON_PFAULT_DETECTED)) - php_ctlr->power_fault_callback( - hp_slot, php_ctlr->callback_instance_id); + return IRQ_NONE; + } - /* Clear all slot events */ - slot_reg &= ~SLOT_REG_RSVDZ_MASK; - shpc_writel(ctrl, SLOT_REG(hp_slot), slot_reg); + 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); + } } - out: if (!shpchp_poll_mode) { /* Unmask Global Interrupt Mask */ - 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); + temp_dword = readl(php_ctlr->creg + SERR_INTR_ENABLE); + temp_dword &= 0xfffffffe; + writel(temp_dword, php_ctlr->creg + SERR_INTR_ENABLE); } return IRQ_HANDLED; @@ -957,43 +1142,64 @@ 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 controller *ctrl = slot->ctrl; + struct php_ctlr_state_s *php_ctlr = slot->ctrl->hpc_ctlr_handle; enum pci_bus_speed bus_speed = PCI_SPEED_UNKNOWN; - u8 pi = shpc_readb(ctrl, PROG_INTERFACE); - u32 slot_avail1 = shpc_readl(ctrl, SLOT_AVAIL1); - u32 slot_avail2 = shpc_readl(ctrl, SLOT_AVAIL2); + int retval = 0; + u8 pi; + u32 slot_avail1, slot_avail2; 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; + } + + pi = readb(php_ctlr->creg + PROG_INTERFACE); + slot_avail1 = readl(php_ctlr->creg + SLOT_AVAIL1); + slot_avail2 = readl(php_ctlr->creg + SLOT_AVAIL2); + if (pi == 2) { if (slot_avail2 & SLOT_133MHZ_PCIX_533) - bus_speed = PCI_SPEED_133MHz_PCIX_533; + bus_speed = PCIX_133MHZ_533; else if (slot_avail2 & SLOT_100MHZ_PCIX_533) - bus_speed = PCI_SPEED_100MHz_PCIX_533; + bus_speed = PCIX_100MHZ_533; else if (slot_avail2 & SLOT_66MHZ_PCIX_533) - bus_speed = PCI_SPEED_66MHz_PCIX_533; + bus_speed = PCIX_66MHZ_533; else if (slot_avail2 & SLOT_133MHZ_PCIX_266) - bus_speed = PCI_SPEED_133MHz_PCIX_266; + bus_speed = PCIX_133MHZ_266; else if (slot_avail2 & SLOT_100MHZ_PCIX_266) - bus_speed = PCI_SPEED_100MHz_PCIX_266; + bus_speed = PCIX_100MHZ_266; else if (slot_avail2 & SLOT_66MHZ_PCIX_266) - bus_speed = PCI_SPEED_66MHz_PCIX_266; - } - - if (bus_speed == PCI_SPEED_UNKNOWN) { + bus_speed = PCIX_66MHZ_266; + else if (slot_avail1 & SLOT_133MHZ_PCIX) + bus_speed = PCIX_133MHZ; + else if (slot_avail1 & SLOT_100MHZ_PCIX) + bus_speed = PCIX_100MHZ; + else if (slot_avail1 & SLOT_66MHZ_PCIX) + bus_speed = PCIX_66MHZ; + else if (slot_avail2 & SLOT_66MHZ) + bus_speed = PCI_66MHZ; + else if (slot_avail1 & SLOT_33MHZ) + bus_speed = PCI_33MHZ; + else bus_speed = PCI_SPEED_UNKNOWN; + } else { if (slot_avail1 & SLOT_133MHZ_PCIX) - bus_speed = PCI_SPEED_133MHz_PCIX; + bus_speed = PCIX_133MHZ; else if (slot_avail1 & SLOT_100MHZ_PCIX) - bus_speed = PCI_SPEED_100MHz_PCIX; + bus_speed = PCIX_100MHZ; else if (slot_avail1 & SLOT_66MHZ_PCIX) - bus_speed = PCI_SPEED_66MHz_PCIX; + bus_speed = PCIX_66MHZ; else if (slot_avail2 & SLOT_66MHZ) - bus_speed = PCI_SPEED_66MHz; + bus_speed = PCI_66MHZ; else if (slot_avail1 & SLOT_33MHZ) - bus_speed = PCI_SPEED_33MHz; - else - retval = -ENODEV; + bus_speed = PCI_33MHZ; + else bus_speed = PCI_SPEED_UNKNOWN; } *value = bus_speed; @@ -1004,69 +1210,111 @@ 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 controller *ctrl = slot->ctrl; + struct php_ctlr_state_s *php_ctlr = slot->ctrl->hpc_ctlr_handle; enum pci_bus_speed bus_speed = PCI_SPEED_UNKNOWN; - 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); + u16 sec_bus_status; + int retval = 0; + u8 pi; DBG_ENTER_ROUTINE - if ((pi == 1) && (speed_mode > 4)) { - *value = PCI_SPEED_UNKNOWN; - return -ENODEV; + if (!slot->ctrl->hpc_ctlr_handle) { + err("%s: Invalid HPC controller handle!\n", __FUNCTION__); + return -1; } - switch (speed_mode) { - case 0x0: - *value = PCI_SPEED_33MHz; - break; - case 0x1: - *value = PCI_SPEED_66MHz; - break; - case 0x2: - *value = PCI_SPEED_66MHz_PCIX; - break; - case 0x3: - *value = PCI_SPEED_100MHz_PCIX; - break; - case 0x4: - *value = PCI_SPEED_133MHz_PCIX; - break; - case 0x5: - *value = PCI_SPEED_66MHz_PCIX_ECC; - break; - case 0x6: - *value = PCI_SPEED_100MHz_PCIX_ECC; - break; - case 0x7: - *value = PCI_SPEED_133MHz_PCIX_ECC; - break; - case 0x8: - *value = PCI_SPEED_66MHz_PCIX_266; - break; - case 0x9: - *value = PCI_SPEED_100MHz_PCIX_266; - break; - case 0xa: - *value = PCI_SPEED_133MHz_PCIX_266; - break; - case 0xb: - *value = PCI_SPEED_66MHz_PCIX_533; - break; - case 0xc: - *value = PCI_SPEED_100MHz_PCIX_533; - break; - case 0xd: - *value = PCI_SPEED_133MHz_PCIX_533; - break; - default: - *value = PCI_SPEED_UNKNOWN; - retval = -ENODEV; - break; + if (slot->hp_slot >= php_ctlr->num_slots) { + err("%s: Invalid HPC slot number!\n", __FUNCTION__); + return -1; } + pi = readb(php_ctlr->creg + PROG_INTERFACE); + sec_bus_status = readw(php_ctlr->creg + SEC_BUS_CONFIG); + + if (pi == 2) { + switch (sec_bus_status & 0x000f) { + case 0: + bus_speed = PCI_SPEED_33MHz; + break; + case 1: + bus_speed = PCI_SPEED_66MHz; + break; + case 2: + bus_speed = PCI_SPEED_66MHz_PCIX; + break; + case 3: + bus_speed = PCI_SPEED_100MHz_PCIX; + break; + case 4: + bus_speed = PCI_SPEED_133MHz_PCIX; + break; + case 5: + bus_speed = PCI_SPEED_66MHz_PCIX_ECC; + break; + case 6: + bus_speed = PCI_SPEED_100MHz_PCIX_ECC; + break; + case 7: + bus_speed = PCI_SPEED_133MHz_PCIX_ECC; + break; + case 8: + bus_speed = PCI_SPEED_66MHz_PCIX_266; + break; + case 9: + bus_speed = PCI_SPEED_100MHz_PCIX_266; + break; + case 0xa: + bus_speed = PCI_SPEED_133MHz_PCIX_266; + break; + case 0xb: + bus_speed = PCI_SPEED_66MHz_PCIX_533; + break; + case 0xc: + bus_speed = PCI_SPEED_100MHz_PCIX_533; + break; + case 0xd: + bus_speed = PCI_SPEED_133MHz_PCIX_533; + break; + case 0xe: + case 0xf: + default: + bus_speed = PCI_SPEED_UNKNOWN; + break; + } + } else { + /* In the case where pi is undefined, default it to 1 */ + switch (sec_bus_status & 0x0007) { + case 0: + bus_speed = PCI_SPEED_33MHz; + break; + case 1: + bus_speed = PCI_SPEED_66MHz; + break; + case 2: + bus_speed = PCI_SPEED_66MHz_PCIX; + break; + case 3: + bus_speed = PCI_SPEED_100MHz_PCIX; + break; + case 4: + bus_speed = PCI_SPEED_133MHz_PCIX; + break; + case 5: + bus_speed = PCI_SPEED_UNKNOWN; /* Reserved */ + break; + case 6: + bus_speed = PCI_SPEED_UNKNOWN; /* Reserved */ + break; + case 7: + bus_speed = PCI_SPEED_UNKNOWN; /* Reserved */ + break; + default: + bus_speed = PCI_SPEED_UNKNOWN; + break; + } + } + + *value = bus_speed; dbg("Current bus speed = %d\n", bus_speed); DBG_LEAVE_ROUTINE return retval; @@ -1095,16 +1343,31 @@ static struct hpc_ops shpchp_hpc_ops = { .green_led_blink = hpc_set_green_led_blink, .release_ctlr = hpc_release_ctlr, + .check_cmd_status = hpc_check_cmd_status, }; +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, slot_config; + u32 tempdword, slot_reg; u8 i; DBG_ENTER_ROUTINE @@ -1112,13 +1375,15 @@ int shpc_init(struct controller * ctrl, struct pci_dev * pdev) ctrl->pci_dev = pdev; /* pci_dev of the P2P bridge */ spin_lock_init(&list_lock); - php_ctlr = kzalloc(sizeof(*php_ctlr), GFP_KERNEL); + php_ctlr = (struct php_ctlr_state_s *) kmalloc(sizeof(struct php_ctlr_state_s), GFP_KERNEL); if (!php_ctlr) { /* allocate controller state data */ err("%s: HPC controller memory allocation error!\n", __FUNCTION__); goto abort; } + memset(php_ctlr, 0, sizeof(struct php_ctlr_state_s)); + php_ctlr->pci_dev = pdev; /* save pci_dev in context */ if ((pdev->vendor == PCI_VENDOR_ID_AMD) || (pdev->device == @@ -1134,13 +1399,13 @@ int shpc_init(struct controller * ctrl, struct pci_dev * pdev) } dbg("%s: cap_offset = %x\n", __FUNCTION__, ctrl->cap_offset); - rc = shpc_indirect_read(ctrl, 0, &shpc_base_offset); + rc = shpc_indirect_creg_read(ctrl, 0, &shpc_base_offset); if (rc) { err("%s: cannot read base_offset\n", __FUNCTION__); goto abort_free_ctlr; } - rc = shpc_indirect_read(ctrl, 3, &tempdword); + rc = shpc_indirect_creg_read(ctrl, 3, &tempdword); if (rc) { err("%s: cannot read slot config\n", __FUNCTION__); goto abort_free_ctlr; @@ -1149,7 +1414,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_read(ctrl, i, &tempdword); + rc = shpc_indirect_creg_read(ctrl, i, &tempdword); if (rc) { err("%s: cannot read creg (index = %d)\n", __FUNCTION__, i); @@ -1164,6 +1429,11 @@ 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); @@ -1184,9 +1454,7 @@ int shpc_init(struct controller * ctrl, struct pci_dev * pdev) } dbg("%s: php_ctlr->creg %p\n", __FUNCTION__, php_ctlr->creg); - mutex_init(&ctrl->crit_sect); - mutex_init(&ctrl->cmd_lock); - + init_MUTEX(&ctrl->crit_sect); /* Setup wait queue */ init_waitqueue_head(&ctrl->queue); @@ -1198,39 +1466,29 @@ 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 */ - 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; + 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; 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 = shpc_readl(ctrl, SERR_INTR_ENABLE); + tempdword = readl(php_ctlr->creg + SERR_INTR_ENABLE); dbg("%s: SERR_INTR_ENABLE = %x\n", __FUNCTION__, tempdword); - 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); + tempdword = 0x0003000f; + writel(tempdword, php_ctlr->creg + SERR_INTR_ENABLE); + tempdword = readl(php_ctlr->creg + 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 = shpc_readl(ctrl, SLOT_REG(hp_slot)); + slot_reg = readl(php_ctlr->creg + SLOT1 + 4*hp_slot ); dbg("%s: Default Logical Slot Register %d value %x\n", __FUNCTION__, hp_slot, slot_reg); - 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); + tempdword = 0xffff3fff; + writel(tempdword, php_ctlr->creg + SLOT1 + (4*hp_slot)); } if (shpchp_poll_mode) {/* Install interrupt polling code */ @@ -1246,7 +1504,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, IRQF_SHARED, MY_NAME, (void *) ctrl); + rc = request_irq(php_ctlr->irq, shpc_isr, SA_SHIRQ, 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); @@ -1274,37 +1532,24 @@ int shpc_init(struct controller * ctrl, struct pci_dev * pdev) } spin_unlock(&list_lock); - ctlr_seq_num++; - /* - * 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; - } + ctlr_seq_num++; + ctrl->hpc_ctlr_handle = php_ctlr; + ctrl->hpc_ops = &shpchp_hpc_ops; - /* - * Unmask all event interrupts of all slots - */ for (hp_slot = 0; hp_slot < php_ctlr->num_slots; hp_slot++) { - slot_reg = shpc_readl(ctrl, SLOT_REG(hp_slot)); + slot_reg = readl(php_ctlr->creg + SLOT1 + 4*hp_slot ); dbg("%s: Default Logical Slot Register %d value %x\n", __FUNCTION__, hp_slot, slot_reg); - 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); + tempdword = 0xe01f3fff; + writel(tempdword, php_ctlr->creg + SLOT1 + (4*hp_slot)); } if (!shpchp_poll_mode) { /* Unmask all general input interrupts and SERR */ - 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); + 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); 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 0a6b25ef1..19e1a5e1e 100644 --- a/drivers/pci/hotplug/shpchp_pci.c +++ b/drivers/pci/hotplug/shpchp_pci.c @@ -38,7 +38,7 @@ static void program_fw_provided_values(struct pci_dev *dev) { u16 pci_cmd, pci_bctl; struct pci_dev *cdev; - struct hotplug_params hpp; + struct hotplug_params hpp = {0x8, 0x40, 0, 0}; /* defaults */ /* Program hpp values for this device */ if (!(dev->hdr_type == PCI_HEADER_TYPE_NORMAL || @@ -46,29 +46,16 @@ static void program_fw_provided_values(struct pci_dev *dev) (dev->class >> 8) == PCI_CLASS_BRIDGE_PCI))) return; - /* use default values if we can't get them from firmware */ - 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; - } + get_hp_params_from_firmware(dev, &hpp); - 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_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.t0->enable_serr) + if (hpp.enable_serr) pci_cmd |= PCI_COMMAND_SERR; else pci_cmd &= ~PCI_COMMAND_SERR; - if (hpp.t0->enable_perr) + if (hpp.enable_perr) pci_cmd |= PCI_COMMAND_PARITY; else pci_cmd &= ~PCI_COMMAND_PARITY; @@ -77,13 +64,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.t0->latency_timer); + hpp.latency_timer); pci_read_config_word(dev, PCI_BRIDGE_CONTROL, &pci_bctl); - if (hpp.t0->enable_serr) + if (hpp.enable_serr) pci_bctl |= PCI_BRIDGE_CTL_SERR; else pci_bctl &= ~PCI_BRIDGE_CTL_SERR; - if (hpp.t0->enable_perr) + if (hpp.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 620e1139e..f5cfbf2c0 100644 --- a/drivers/pci/hotplug/shpchp_sysfs.c +++ b/drivers/pci/hotplug/shpchp_sysfs.c @@ -51,10 +51,8 @@ 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.8llx, " - "length = %8.8llx\n", - (unsigned long long)res->start, - (unsigned long long)(res->end - res->start)); + out += sprintf(out, "start = %8.8lx, length = %8.8lx\n", + res->start, (res->end - res->start)); } } out += sprintf(out, "Free resources: prefetchable memory\n"); @@ -62,20 +60,16 @@ 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.8llx, " - "length = %8.8llx\n", - (unsigned long long)res->start, - (unsigned long long)(res->end - res->start)); + out += sprintf(out, "start = %8.8lx, length = %8.8lx\n", + res->start, (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.8llx, " - "length = %8.8llx\n", - (unsigned long long)res->start, - (unsigned long long)(res->end - res->start)); + out += sprintf(out, "start = %8.8lx, length = %8.8lx\n", + res->start, (res->end - res->start)); } } out += sprintf(out, "Free resources: bus numbers\n"); diff --git a/drivers/pci/hotplug/shpchprm_acpi.c b/drivers/pci/hotplug/shpchprm_acpi.c index 7957cdc72..17145e522 100644 --- a/drivers/pci/hotplug/shpchprm_acpi.c +++ b/drivers/pci/hotplug/shpchprm_acpi.c @@ -20,95 +20,23 @@ * 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 * */ -#include #include #include #include #include -#include -#include -#include -#include -#include -#ifdef CONFIG_IA64 -#include -#endif #include #include #include #include "shpchp.h" -#include "shpchprm.h" - -#define PCI_MAX_BUS 0x100 -#define ACPI_STA_DEVICE_PRESENT 0x01 #define METHOD_NAME__SUN "_SUN" #define METHOD_NAME__HPP "_HPP" #define METHOD_NAME_OSHP "OSHP" -#define PHP_RES_BUS 0xA0 -#define PHP_RES_IO 0xA1 -#define PHP_RES_MEM 0xA2 -#define PHP_RES_PMEM 0xA3 - -#define BRIDGE_TYPE_P2P 0x00 -#define BRIDGE_TYPE_HOST 0x01 - -/* this should go to drivers/acpi/include/ */ -struct acpi__hpp { - u8 cache_line_size; - u8 latency_timer; - u8 enable_serr; - u8 enable_perr; -}; - -struct acpi_php_slot { - struct acpi_php_slot *next; - struct acpi_bridge *bridge; - acpi_handle handle; - int seg; - int bus; - int dev; - int fun; - u32 sun; - struct pci_resource *mem_head; - struct pci_resource *p_mem_head; - struct pci_resource *io_head; - struct pci_resource *bus_head; - void *slot_ops; /* _STA, _EJx, etc */ - struct slot *slot; -}; /* per func */ - -struct acpi_bridge { - struct acpi_bridge *parent; - struct acpi_bridge *next; - struct acpi_bridge *child; - acpi_handle handle; - int seg; - int pbus; /* pdev->bus->number */ - int pdevice; /* PCI_SLOT(pdev->devfn) */ - int pfunction; /* PCI_DEVFN(pdev->devfn) */ - int bus; /* pdev->subordinate->number */ - struct acpi__hpp *_hpp; - struct acpi_php_slot *slots; - struct pci_resource *tmem_head; /* total from crs */ - struct pci_resource *tp_mem_head; /* total from crs */ - struct pci_resource *tio_head; /* total from crs */ - struct pci_resource *tbus_head; /* total from crs */ - struct pci_resource *mem_head; /* available */ - struct pci_resource *p_mem_head; /* available */ - struct pci_resource *io_head; /* available */ - struct pci_resource *bus_head; /* available */ - int scanned; - int type; -}; - -static struct acpi_bridge *acpi_bridges_head; - static u8 * acpi_path_name( acpi_handle handle) { acpi_status status; @@ -124,82 +52,43 @@ static u8 * acpi_path_name( acpi_handle handle) return path_name; } -static void acpi_get__hpp ( struct acpi_bridge *ab); -static void acpi_run_oshp ( struct acpi_bridge *ab); - -static int acpi_add_slot_to_php_slots( - struct acpi_bridge *ab, - int bus_num, - acpi_handle handle, - u32 adr, - u32 sun - ) -{ - struct acpi_php_slot *aps; - static long samesun = -1; - - aps = (struct acpi_php_slot *) kmalloc (sizeof(struct acpi_php_slot), GFP_KERNEL); - if (!aps) { - err ("acpi_shpchprm: alloc for aps fail\n"); - return -1; - } - memset(aps, 0, sizeof(struct acpi_php_slot)); - - aps->handle = handle; - aps->bus = bus_num; - aps->dev = (adr >> 16) & 0xffff; - aps->fun = adr & 0xffff; - aps->sun = sun; - - aps->next = ab->slots; /* cling to the bridge */ - aps->bridge = ab; - ab->slots = aps; - - ab->scanned += 1; - if (!ab->_hpp) - acpi_get__hpp(ab); - - acpi_run_oshp(ab); - - if (sun != samesun) { - info("acpi_shpchprm: Slot sun(%x) at s:b:d:f=0x%02x:%02x:%02x:%02x\n", aps->sun, ab->seg, - aps->bus, aps->dev, aps->fun); - samesun = sun; - } - return 0; -} - -static void acpi_get__hpp ( struct acpi_bridge *ab) +static acpi_status +acpi_run_hpp(acpi_handle handle, struct hotplug_params *hpp) { acpi_status status; u8 nui[4]; struct acpi_buffer ret_buf = { 0, NULL}; union acpi_object *ext_obj, *package; - u8 *path_name = acpi_path_name(ab->handle); + u8 *path_name = acpi_path_name(handle); int i, len = 0; /* get _hpp */ - status = acpi_evaluate_object(ab->handle, METHOD_NAME__HPP, NULL, &ret_buf); + status = acpi_evaluate_object(handle, METHOD_NAME__HPP, NULL, &ret_buf); switch (status) { case AE_BUFFER_OVERFLOW: ret_buf.pointer = kmalloc (ret_buf.length, GFP_KERNEL); if (!ret_buf.pointer) { - err ("acpi_shpchprm:%s alloc for _HPP fail\n", path_name); - return; + err ("%s:%s alloc for _HPP fail\n", __FUNCTION__, + path_name); + return AE_NO_MEMORY; } - status = acpi_evaluate_object(ab->handle, METHOD_NAME__HPP, NULL, &ret_buf); + status = acpi_evaluate_object(handle, METHOD_NAME__HPP, + NULL, &ret_buf); if (ACPI_SUCCESS(status)) break; default: if (ACPI_FAILURE(status)) { - err("acpi_shpchprm:%s _HPP fail=0x%x\n", path_name, status); - return; + dbg("%s:%s _HPP fail=0x%x\n", __FUNCTION__, + path_name, status); + return status; } } ext_obj = (union acpi_object *) ret_buf.pointer; if (ext_obj->type != ACPI_TYPE_PACKAGE) { - err ("acpi_shpchprm:%s _HPP obj not a package\n", path_name); + err ("%s:%s _HPP obj not a package\n", __FUNCTION__, + path_name); + status = AE_ERROR; goto free_and_return; } @@ -212,1353 +101,41 @@ static void acpi_get__hpp ( struct acpi_bridge *ab) nui[i] = (u8)ext_obj->integer.value; break; default: - err ("acpi_shpchprm:%s _HPP obj type incorrect\n", path_name); + err ("%s:%s _HPP obj type incorrect\n", __FUNCTION__, + path_name); + status = AE_ERROR; goto free_and_return; } } - ab->_hpp = kmalloc (sizeof (struct acpi__hpp), GFP_KERNEL); - if (!ab->_hpp) { - err ("acpi_shpchprm:%s alloc for _HPP failed\n", path_name); - goto free_and_return; - } - memset(ab->_hpp, 0, sizeof(struct acpi__hpp)); + hpp->cache_line_size = nui[0]; + hpp->latency_timer = nui[1]; + hpp->enable_serr = nui[2]; + hpp->enable_perr = nui[3]; - ab->_hpp->cache_line_size = nui[0]; - ab->_hpp->latency_timer = nui[1]; - ab->_hpp->enable_serr = nui[2]; - ab->_hpp->enable_perr = nui[3]; - - dbg(" _HPP: cache_line_size=0x%x\n", ab->_hpp->cache_line_size); - dbg(" _HPP: latency timer =0x%x\n", ab->_hpp->latency_timer); - dbg(" _HPP: enable SERR =0x%x\n", ab->_hpp->enable_serr); - dbg(" _HPP: enable PERR =0x%x\n", ab->_hpp->enable_perr); + dbg(" _HPP: cache_line_size=0x%x\n", hpp->cache_line_size); + dbg(" _HPP: latency timer =0x%x\n", hpp->latency_timer); + dbg(" _HPP: enable SERR =0x%x\n", hpp->enable_serr); + dbg(" _HPP: enable PERR =0x%x\n", hpp->enable_perr); free_and_return: kfree(ret_buf.pointer); -} - -static void acpi_run_oshp ( struct acpi_bridge *ab) -{ - acpi_status status; - u8 *path_name = acpi_path_name(ab->handle); - - /* run OSHP */ - status = acpi_evaluate_object(ab->handle, METHOD_NAME_OSHP, NULL, NULL); - if (ACPI_FAILURE(status)) { - err("acpi_pciehprm:%s OSHP fails=0x%x\n", path_name, status); - } else - dbg("acpi_pciehprm:%s OSHP passes =0x%x\n", path_name, status); - return; -} - -static acpi_status acpi_evaluate_crs( - acpi_handle handle, - struct acpi_resource **retbuf - ) -{ - acpi_status status; - struct acpi_buffer crsbuf; - u8 *path_name = acpi_path_name(handle); - - crsbuf.length = 0; - crsbuf.pointer = NULL; - - status = acpi_get_current_resources (handle, &crsbuf); - - switch (status) { - case AE_BUFFER_OVERFLOW: - break; /* found */ - case AE_NOT_FOUND: - dbg("acpi_shpchprm:%s _CRS not found\n", path_name); - return status; - default: - err ("acpi_shpchprm:%s _CRS fail=0x%x\n", path_name, status); - return status; - } - - crsbuf.pointer = kmalloc (crsbuf.length, GFP_KERNEL); - if (!crsbuf.pointer) { - err ("acpi_shpchprm: alloc %ld bytes for %s _CRS fail\n", (ulong)crsbuf.length, path_name); - return AE_NO_MEMORY; - } - - status = acpi_get_current_resources (handle, &crsbuf); - if (ACPI_FAILURE(status)) { - err("acpi_shpchprm: %s _CRS fail=0x%x.\n", path_name, status); - kfree(crsbuf.pointer); - return status; - } - - *retbuf = crsbuf.pointer; - - return status; -} - -static void free_pci_resource ( struct pci_resource *aprh) -{ - struct pci_resource *res, *next; - - for (res = aprh; res; res = next) { - next = res->next; - kfree(res); - } -} - -static void print_pci_resource ( struct pci_resource *aprh) -{ - struct pci_resource *res; - - for (res = aprh; res; res = res->next) - dbg(" base= 0x%x length= 0x%x\n", res->base, res->length); -} - -static void print_slot_resources( struct acpi_php_slot *aps) -{ - if (aps->bus_head) { - dbg(" BUS Resources:\n"); - print_pci_resource (aps->bus_head); - } - - if (aps->io_head) { - dbg(" IO Resources:\n"); - print_pci_resource (aps->io_head); - } - - if (aps->mem_head) { - dbg(" MEM Resources:\n"); - print_pci_resource (aps->mem_head); - } - - if (aps->p_mem_head) { - dbg(" PMEM Resources:\n"); - print_pci_resource (aps->p_mem_head); - } -} - -static void print_pci_resources( struct acpi_bridge *ab) -{ - if (ab->tbus_head) { - dbg(" Total BUS Resources:\n"); - print_pci_resource (ab->tbus_head); - } - if (ab->bus_head) { - dbg(" BUS Resources:\n"); - print_pci_resource (ab->bus_head); - } - - if (ab->tio_head) { - dbg(" Total IO Resources:\n"); - print_pci_resource (ab->tio_head); - } - if (ab->io_head) { - dbg(" IO Resources:\n"); - print_pci_resource (ab->io_head); - } - - if (ab->tmem_head) { - dbg(" Total MEM Resources:\n"); - print_pci_resource (ab->tmem_head); - } - if (ab->mem_head) { - dbg(" MEM Resources:\n"); - print_pci_resource (ab->mem_head); - } - - if (ab->tp_mem_head) { - dbg(" Total PMEM Resources:\n"); - print_pci_resource (ab->tp_mem_head); - } - if (ab->p_mem_head) { - dbg(" PMEM Resources:\n"); - print_pci_resource (ab->p_mem_head); - } - if (ab->_hpp) { - dbg(" _HPP: cache_line_size=0x%x\n", ab->_hpp->cache_line_size); - dbg(" _HPP: latency timer =0x%x\n", ab->_hpp->latency_timer); - dbg(" _HPP: enable SERR =0x%x\n", ab->_hpp->enable_serr); - dbg(" _HPP: enable PERR =0x%x\n", ab->_hpp->enable_perr); - } -} - -static int shpchprm_delete_resource( - struct pci_resource **aprh, - ulong base, - ulong size) -{ - struct pci_resource *res; - struct pci_resource *prevnode; - struct pci_resource *split_node; - ulong tbase; - - shpchp_resource_sort_and_combine(aprh); - - for (res = *aprh; res; res = res->next) { - if (res->base > base) - continue; - - if ((res->base + res->length) < (base + size)) - continue; - - if (res->base < base) { - tbase = base; - - if ((res->length - (tbase - res->base)) < size) - continue; - - split_node = (struct pci_resource *) kmalloc(sizeof(struct pci_resource), GFP_KERNEL); - if (!split_node) - return -ENOMEM; - - split_node->base = res->base; - split_node->length = tbase - res->base; - res->base = tbase; - res->length -= split_node->length; - - split_node->next = res->next; - res->next = split_node; - } - - if (res->length >= size) { - split_node = (struct pci_resource*) kmalloc(sizeof(struct pci_resource), GFP_KERNEL); - if (!split_node) - return -ENOMEM; - - split_node->base = res->base + size; - split_node->length = res->length - size; - res->length = size; - - split_node->next = res->next; - res->next = split_node; - } - - if (*aprh == res) { - *aprh = res->next; - } else { - prevnode = *aprh; - while (prevnode->next != res) - prevnode = prevnode->next; - - prevnode->next = res->next; - } - res->next = NULL; - kfree(res); - break; - } - - return 0; -} - -static int shpchprm_delete_resources( - struct pci_resource **aprh, - struct pci_resource *this - ) -{ - struct pci_resource *res; - - for (res = this; res; res = res->next) - shpchprm_delete_resource(aprh, res->base, res->length); - - return 0; -} - -static int shpchprm_add_resource( - struct pci_resource **aprh, - ulong base, - ulong size) -{ - struct pci_resource *res; - - for (res = *aprh; res; res = res->next) { - if ((res->base + res->length) == base) { - res->length += size; - size = 0L; - break; - } - if (res->next == *aprh) - break; - } - - if (size) { - res = kmalloc(sizeof(struct pci_resource), GFP_KERNEL); - if (!res) { - err ("acpi_shpchprm: alloc for res fail\n"); - return -ENOMEM; - } - memset(res, 0, sizeof (struct pci_resource)); - - res->base = base; - res->length = size; - res->next = *aprh; - *aprh = res; - } - - return 0; -} - -static int shpchprm_add_resources( - struct pci_resource **aprh, - struct pci_resource *this - ) -{ - struct pci_resource *res; - int rc = 0; - - for (res = this; res && !rc; res = res->next) - rc = shpchprm_add_resource(aprh, res->base, res->length); - - return rc; -} - -static void acpi_parse_io ( - struct acpi_bridge *ab, - union acpi_resource_data *data - ) -{ - struct acpi_resource_io *dataio; - dataio = (struct acpi_resource_io *) data; - - dbg("Io Resource\n"); - dbg(" %d bit decode\n", ACPI_DECODE_16 == dataio->io_decode ? 16:10); - dbg(" Range minimum base: %08X\n", dataio->min_base_address); - dbg(" Range maximum base: %08X\n", dataio->max_base_address); - dbg(" Alignment: %08X\n", dataio->alignment); - dbg(" Range Length: %08X\n", dataio->range_length); -} - -static void acpi_parse_fixed_io ( - struct acpi_bridge *ab, - union acpi_resource_data *data - ) -{ - struct acpi_resource_fixed_io *datafio; - datafio = (struct acpi_resource_fixed_io *) data; - - dbg("Fixed Io Resource\n"); - dbg(" Range base address: %08X", datafio->base_address); - dbg(" Range length: %08X", datafio->range_length); -} - -static void acpi_parse_address16_32 ( - struct acpi_bridge *ab, - union acpi_resource_data *data, - acpi_resource_type id - ) -{ - /* - * acpi_resource_address16 == acpi_resource_address32 - * acpi_resource_address16 *data16 = (acpi_resource_address16 *) data; - */ - struct acpi_resource_address32 *data32 = (struct acpi_resource_address32 *) data; - struct pci_resource **aprh, **tprh; - - if (id == ACPI_RSTYPE_ADDRESS16) - dbg("acpi_shpchprm:16-Bit Address Space Resource\n"); - else - dbg("acpi_shpchprm:32-Bit Address Space Resource\n"); - - switch (data32->resource_type) { - case ACPI_MEMORY_RANGE: - dbg(" Resource Type: Memory Range\n"); - aprh = &ab->mem_head; - tprh = &ab->tmem_head; - - switch (data32->attribute.memory.cache_attribute) { - case ACPI_NON_CACHEABLE_MEMORY: - dbg(" Type Specific: Noncacheable memory\n"); - break; - case ACPI_CACHABLE_MEMORY: - dbg(" Type Specific: Cacheable memory\n"); - break; - case ACPI_WRITE_COMBINING_MEMORY: - dbg(" Type Specific: Write-combining memory\n"); - break; - case ACPI_PREFETCHABLE_MEMORY: - aprh = &ab->p_mem_head; - dbg(" Type Specific: Prefetchable memory\n"); - break; - default: - dbg(" Type Specific: Invalid cache attribute\n"); - break; - } - - dbg(" Type Specific: Read%s\n", ACPI_READ_WRITE_MEMORY == data32->attribute.memory.read_write_attribute ? "/Write":" Only"); - break; - - case ACPI_IO_RANGE: - dbg(" Resource Type: I/O Range\n"); - aprh = &ab->io_head; - tprh = &ab->tio_head; - - switch (data32->attribute.io.range_attribute) { - case ACPI_NON_ISA_ONLY_RANGES: - dbg(" Type Specific: Non-ISA Io Addresses\n"); - break; - case ACPI_ISA_ONLY_RANGES: - dbg(" Type Specific: ISA Io Addresses\n"); - break; - case ACPI_ENTIRE_RANGE: - dbg(" Type Specific: ISA and non-ISA Io Addresses\n"); - break; - default: - dbg(" Type Specific: Invalid range attribute\n"); - break; - } - break; - - case ACPI_BUS_NUMBER_RANGE: - dbg(" Resource Type: Bus Number Range(fixed)\n"); - /* fixup to be compatible with the rest of php driver */ - data32->min_address_range++; - data32->address_length--; - aprh = &ab->bus_head; - tprh = &ab->tbus_head; - break; - default: - dbg(" Resource Type: Invalid resource type. Exiting.\n"); - return; - } - - dbg(" Resource %s\n", ACPI_CONSUMER == data32->producer_consumer ? "Consumer":"Producer"); - dbg(" %s decode\n", ACPI_SUB_DECODE == data32->decode ? "Subtractive":"Positive"); - dbg(" Min address is %s fixed\n", ACPI_ADDRESS_FIXED == data32->min_address_fixed ? "":"not"); - dbg(" Max address is %s fixed\n", ACPI_ADDRESS_FIXED == data32->max_address_fixed ? "":"not"); - dbg(" Granularity: %08X\n", data32->granularity); - dbg(" Address range min: %08X\n", data32->min_address_range); - dbg(" Address range max: %08X\n", data32->max_address_range); - dbg(" Address translation offset: %08X\n", data32->address_translation_offset); - dbg(" Address Length: %08X\n", data32->address_length); - - if (0xFF != data32->resource_source.index) { - dbg(" Resource Source Index: %X\n", data32->resource_source.index); - /* dbg(" Resource Source: %s\n", data32->resource_source.string_ptr); */ - } - - shpchprm_add_resource(aprh, data32->min_address_range, data32->address_length); -} - -static acpi_status acpi_parse_crs( - struct acpi_bridge *ab, - struct acpi_resource *crsbuf - ) -{ - acpi_status status = AE_OK; - struct acpi_resource *resource = crsbuf; - u8 count = 0; - u8 done = 0; - - while (!done) { - dbg("acpi_shpchprm: PCI bus 0x%x Resource structure %x.\n", ab->bus, count++); - switch (resource->id) { - case ACPI_RSTYPE_IRQ: - dbg("Irq -------- Resource\n"); - break; - case ACPI_RSTYPE_DMA: - dbg("DMA -------- Resource\n"); - break; - case ACPI_RSTYPE_START_DPF: - dbg("Start DPF -------- Resource\n"); - break; - case ACPI_RSTYPE_END_DPF: - dbg("End DPF -------- Resource\n"); - break; - case ACPI_RSTYPE_IO: - acpi_parse_io (ab, &resource->data); - break; - case ACPI_RSTYPE_FIXED_IO: - acpi_parse_fixed_io (ab, &resource->data); - break; - case ACPI_RSTYPE_VENDOR: - dbg("Vendor -------- Resource\n"); - break; - case ACPI_RSTYPE_END_TAG: - dbg("End_tag -------- Resource\n"); - done = 1; - break; - case ACPI_RSTYPE_MEM24: - dbg("Mem24 -------- Resource\n"); - break; - case ACPI_RSTYPE_MEM32: - dbg("Mem32 -------- Resource\n"); - break; - case ACPI_RSTYPE_FIXED_MEM32: - dbg("Fixed Mem32 -------- Resource\n"); - break; - case ACPI_RSTYPE_ADDRESS16: - acpi_parse_address16_32(ab, &resource->data, ACPI_RSTYPE_ADDRESS16); - break; - case ACPI_RSTYPE_ADDRESS32: - acpi_parse_address16_32(ab, &resource->data, ACPI_RSTYPE_ADDRESS32); - break; - case ACPI_RSTYPE_ADDRESS64: - info("Address64 -------- Resource unparsed\n"); - break; - case ACPI_RSTYPE_EXT_IRQ: - dbg("Ext Irq -------- Resource\n"); - break; - default: - dbg("Invalid -------- resource type 0x%x\n", resource->id); - break; - } - - resource = (struct acpi_resource *) ((char *)resource + resource->length); - } - return status; } -static acpi_status acpi_get_crs( struct acpi_bridge *ab) +static void acpi_run_oshp(acpi_handle handle) { - acpi_status status; - struct acpi_resource *crsbuf; - - status = acpi_evaluate_crs(ab->handle, &crsbuf); - if (ACPI_SUCCESS(status)) { - status = acpi_parse_crs(ab, crsbuf); - kfree(crsbuf); - - shpchp_resource_sort_and_combine(&ab->bus_head); - shpchp_resource_sort_and_combine(&ab->io_head); - shpchp_resource_sort_and_combine(&ab->mem_head); - shpchp_resource_sort_and_combine(&ab->p_mem_head); - - shpchprm_add_resources (&ab->tbus_head, ab->bus_head); - shpchprm_add_resources (&ab->tio_head, ab->io_head); - shpchprm_add_resources (&ab->tmem_head, ab->mem_head); - shpchprm_add_resources (&ab->tp_mem_head, ab->p_mem_head); - } - - return status; -} - -/* find acpi_bridge downword from ab. */ -static struct acpi_bridge * -find_acpi_bridge_by_bus( - struct acpi_bridge *ab, - int seg, - int bus /* pdev->subordinate->number */ - ) -{ - struct acpi_bridge *lab = NULL; - - if (!ab) - return NULL; - - if ((ab->bus == bus) && (ab->seg == seg)) - return ab; - - if (ab->child) - lab = find_acpi_bridge_by_bus(ab->child, seg, bus); - - if (!lab) - if (ab->next) - lab = find_acpi_bridge_by_bus(ab->next, seg, bus); - - return lab; -} - -/* - * Build a device tree of ACPI PCI Bridges - */ -static void shpchprm_acpi_register_a_bridge ( - struct acpi_bridge **head, - struct acpi_bridge *pab, /* parent bridge to which child bridge is added */ - struct acpi_bridge *cab /* child bridge to add */ - ) -{ - struct acpi_bridge *lpab; - struct acpi_bridge *lcab; - - lpab = find_acpi_bridge_by_bus(*head, pab->seg, pab->bus); - if (!lpab) { - if (!(pab->type & BRIDGE_TYPE_HOST)) - warn("PCI parent bridge s:b(%x:%x) not in list.\n", pab->seg, pab->bus); - pab->next = *head; - *head = pab; - lpab = pab; - } - - if ((cab->type & BRIDGE_TYPE_HOST) && (pab == cab)) - return; - - lcab = find_acpi_bridge_by_bus(*head, cab->seg, cab->bus); - if (lcab) { - if ((pab->bus != lcab->parent->bus) || (lcab->bus != cab->bus)) - err("PCI child bridge s:b(%x:%x) in list with diff parent.\n", cab->seg, cab->bus); - return; - } else - lcab = cab; - - lcab->parent = lpab; - lcab->next = lpab->child; - lpab->child = lcab; -} - -static acpi_status shpchprm_acpi_build_php_slots_callback( - acpi_handle handle, - u32 Level, - void *context, - void **retval - ) -{ - ulong bus_num; - ulong seg_num; - ulong sun, adr; - ulong padr = 0; - acpi_handle phandle = NULL; - struct acpi_bridge *pab = (struct acpi_bridge *)context; - struct acpi_bridge *lab; acpi_status status; u8 *path_name = acpi_path_name(handle); - /* get _SUN */ - status = acpi_evaluate_integer(handle, METHOD_NAME__SUN, NULL, &sun); - switch(status) { - case AE_NOT_FOUND: - return AE_OK; - default: - if (ACPI_FAILURE(status)) { - err("acpi_shpchprm:%s _SUN fail=0x%x\n", path_name, status); - return status; - } - } - - /* get _ADR. _ADR must exist if _SUN exists */ - status = acpi_evaluate_integer(handle, METHOD_NAME__ADR, NULL, &adr); - if (ACPI_FAILURE(status)) { - err("acpi_shpchprm:%s _ADR fail=0x%x\n", path_name, status); - return status; - } - - dbg("acpi_shpchprm:%s sun=0x%08x adr=0x%08x\n", path_name, (u32)sun, (u32)adr); - - status = acpi_get_parent(handle, &phandle); + /* run OSHP */ + status = acpi_evaluate_object(handle, METHOD_NAME_OSHP, NULL, NULL); if (ACPI_FAILURE(status)) { - err("acpi_shpchprm:%s get_parent fail=0x%x\n", path_name, status); - return (status); - } - - bus_num = pab->bus; - seg_num = pab->seg; - - if (pab->bus == bus_num) { - lab = pab; + err("%s:%s OSHP fails=0x%x\n", __FUNCTION__, path_name, + status); } else { - dbg("WARN: pab is not parent\n"); - lab = find_acpi_bridge_by_bus(pab, seg_num, bus_num); - if (!lab) { - dbg("acpi_shpchprm: alloc new P2P bridge(%x) for sun(%08x)\n", (u32)bus_num, (u32)sun); - lab = (struct acpi_bridge *)kmalloc(sizeof(struct acpi_bridge), GFP_KERNEL); - if (!lab) { - err("acpi_shpchprm: alloc for ab fail\n"); - return AE_NO_MEMORY; - } - memset(lab, 0, sizeof(struct acpi_bridge)); - - lab->handle = phandle; - lab->pbus = pab->bus; - lab->pdevice = (int)(padr >> 16) & 0xffff; - lab->pfunction = (int)(padr & 0xffff); - lab->bus = (int)bus_num; - lab->scanned = 0; - lab->type = BRIDGE_TYPE_P2P; - - shpchprm_acpi_register_a_bridge (&acpi_bridges_head, pab, lab); - } else - dbg("acpi_shpchprm: found P2P bridge(%x) for sun(%08x)\n", (u32)bus_num, (u32)sun); + dbg("%s:%s OSHP passes\n", __FUNCTION__, path_name); } - - acpi_add_slot_to_php_slots(lab, (int)bus_num, handle, (u32)adr, (u32)sun); - return (status); -} - -static int shpchprm_acpi_build_php_slots( - struct acpi_bridge *ab, - u32 depth - ) -{ - acpi_status status; - u8 *path_name = acpi_path_name(ab->handle); - - /* Walk down this pci bridge to get _SUNs if any behind P2P */ - status = acpi_walk_namespace ( ACPI_TYPE_DEVICE, - ab->handle, - depth, - shpchprm_acpi_build_php_slots_callback, - ab, - NULL ); - if (ACPI_FAILURE(status)) { - dbg("acpi_shpchprm:%s walk for _SUN on pci bridge seg:bus(%x:%x) fail=0x%x\n", path_name, ab->seg, ab->bus, status); - return -1; - } - - return 0; -} - -static void build_a_bridge( - struct acpi_bridge *pab, - struct acpi_bridge *ab - ) -{ - u8 *path_name = acpi_path_name(ab->handle); - - shpchprm_acpi_register_a_bridge (&acpi_bridges_head, pab, ab); - - switch (ab->type) { - case BRIDGE_TYPE_HOST: - dbg("acpi_shpchprm: Registered PCI HOST Bridge(%02x) on s:b:d:f(%02x:%02x:%02x:%02x) [%s]\n", - ab->bus, ab->seg, ab->pbus, ab->pdevice, ab->pfunction, path_name); - break; - case BRIDGE_TYPE_P2P: - dbg("acpi_shpchprm: Registered PCI P2P Bridge(%02x-%02x) on s:b:d:f(%02x:%02x:%02x:%02x) [%s]\n", - ab->pbus, ab->bus, ab->seg, ab->pbus, ab->pdevice, ab->pfunction, path_name); - break; - }; - - /* build any immediate PHP slots under this pci bridge */ - shpchprm_acpi_build_php_slots(ab, 1); -} - -static struct acpi_bridge * add_p2p_bridge( - acpi_handle handle, - struct acpi_bridge *pab, /* parent */ - ulong adr - ) -{ - struct acpi_bridge *ab; - struct pci_dev *pdev; - ulong devnum, funcnum; - u8 *path_name = acpi_path_name(handle); - - ab = (struct acpi_bridge *) kmalloc (sizeof(struct acpi_bridge), GFP_KERNEL); - if (!ab) { - err("acpi_shpchprm: alloc for ab fail\n"); - return NULL; - } - memset(ab, 0, sizeof(struct acpi_bridge)); - - devnum = (adr >> 16) & 0xffff; - funcnum = adr & 0xffff; - - pdev = pci_find_slot(pab->bus, PCI_DEVFN(devnum, funcnum)); - if (!pdev || !pdev->subordinate) { - err("acpi_shpchprm:%s is not a P2P Bridge\n", path_name); - kfree(ab); - return NULL; - } - - ab->handle = handle; - ab->seg = pab->seg; - ab->pbus = pab->bus; /* or pdev->bus->number */ - ab->pdevice = devnum; /* or PCI_SLOT(pdev->devfn) */ - ab->pfunction = funcnum; /* or PCI_FUNC(pdev->devfn) */ - ab->bus = pdev->subordinate->number; - ab->scanned = 0; - ab->type = BRIDGE_TYPE_P2P; - - dbg("acpi_shpchprm: P2P(%x-%x) on pci=b:d:f(%x:%x:%x) acpi=b:d:f(%x:%x:%x) [%s]\n", - pab->bus, ab->bus, pdev->bus->number, PCI_SLOT(pdev->devfn), PCI_FUNC(pdev->devfn), - pab->bus, (u32)devnum, (u32)funcnum, path_name); - - build_a_bridge(pab, ab); - - return ab; -} - -static acpi_status scan_p2p_bridge( - acpi_handle handle, - u32 Level, - void *context, - void **retval - ) -{ - struct acpi_bridge *pab = (struct acpi_bridge *)context; - struct acpi_bridge *ab; - acpi_status status; - ulong adr = 0; - u8 *path_name = acpi_path_name(handle); - ulong devnum, funcnum; - struct pci_dev *pdev; - - /* get device, function */ - status = acpi_evaluate_integer(handle, METHOD_NAME__ADR, NULL, &adr); - if (ACPI_FAILURE(status)) { - if (status != AE_NOT_FOUND) - err("acpi_shpchprm:%s _ADR fail=0x%x\n", path_name, status); - return AE_OK; - } - - devnum = (adr >> 16) & 0xffff; - funcnum = adr & 0xffff; - - pdev = pci_find_slot(pab->bus, PCI_DEVFN(devnum, funcnum)); - if (!pdev) - return AE_OK; - if (!pdev->subordinate) - return AE_OK; - - ab = add_p2p_bridge(handle, pab, adr); - if (ab) { - status = acpi_walk_namespace ( ACPI_TYPE_DEVICE, - handle, - (u32)1, - scan_p2p_bridge, - ab, - NULL); - if (ACPI_FAILURE(status)) - dbg("acpi_shpchprm:%s find_p2p fail=0x%x\n", path_name, status); - } - - return AE_OK; -} - -static struct acpi_bridge * add_host_bridge( - acpi_handle handle, - ulong segnum, - ulong busnum - ) -{ - ulong adr = 0; - acpi_status status; - struct acpi_bridge *ab; - u8 *path_name = acpi_path_name(handle); - - /* get device, function: host br adr is always 0000 though. */ - status = acpi_evaluate_integer(handle, METHOD_NAME__ADR, NULL, &adr); - if (ACPI_FAILURE(status)) { - err("acpi_shpchprm:%s _ADR fail=0x%x\n", path_name, status); - return NULL; - } - dbg("acpi_shpchprm: ROOT PCI seg(0x%x)bus(0x%x)dev(0x%x)func(0x%x) [%s]\n", (u32)segnum, (u32)busnum, - (u32)(adr >> 16) & 0xffff, (u32)adr & 0xffff, path_name); - - ab = (struct acpi_bridge *) kmalloc (sizeof(struct acpi_bridge), GFP_KERNEL); - if (!ab) { - err("acpi_shpchprm: alloc for ab fail\n"); - return NULL; - } - memset(ab, 0, sizeof(struct acpi_bridge)); - - ab->handle = handle; - ab->seg = (int)segnum; - ab->bus = ab->pbus = (int)busnum; - ab->pdevice = (int)(adr >> 16) & 0xffff; - ab->pfunction = (int)(adr & 0xffff); - ab->scanned = 0; - ab->type = BRIDGE_TYPE_HOST; - - /* get root pci bridge's current resources */ - status = acpi_get_crs(ab); - if (ACPI_FAILURE(status)) { - err("acpi_shpchprm:%s evaluate _CRS fail=0x%x\n", path_name, status); - kfree(ab); - return NULL; - } - build_a_bridge(ab, ab); - - return ab; -} - -static acpi_status acpi_scan_from_root_pci_callback ( - acpi_handle handle, - u32 Level, - void *context, - void **retval - ) -{ - ulong segnum = 0; - ulong busnum = 0; - acpi_status status; - struct acpi_bridge *ab; - u8 *path_name = acpi_path_name(handle); - - /* get bus number of this pci root bridge */ - status = acpi_evaluate_integer(handle, METHOD_NAME__SEG, NULL, &segnum); - if (ACPI_FAILURE(status)) { - if (status != AE_NOT_FOUND) { - err("acpi_shpchprm:%s evaluate _SEG fail=0x%x\n", path_name, status); - return status; - } - segnum = 0; - } - - /* get bus number of this pci root bridge */ - status = acpi_evaluate_integer(handle, METHOD_NAME__BBN, NULL, &busnum); - if (ACPI_FAILURE(status)) { - err("acpi_shpchprm:%s evaluate _BBN fail=0x%x\n", path_name, status); - return (status); - } - - ab = add_host_bridge(handle, segnum, busnum); - if (ab) { - status = acpi_walk_namespace ( ACPI_TYPE_DEVICE, - handle, - 1, - scan_p2p_bridge, - ab, - NULL); - if (ACPI_FAILURE(status)) - dbg("acpi_shpchprm:%s find_p2p fail=0x%x\n", path_name, status); - } - - return AE_OK; -} - -static int shpchprm_acpi_scan_pci (void) -{ - acpi_status status; - - /* - * TBD: traverse LDM device tree with the help of - * unified ACPI augmented for php device population. - */ - status = acpi_get_devices ( PCI_ROOT_HID_STRING, - acpi_scan_from_root_pci_callback, - NULL, - NULL ); - if (ACPI_FAILURE(status)) { - err("acpi_shpchprm:get_device PCI ROOT HID fail=0x%x\n", status); - return -1; - } - - return 0; -} - -int shpchprm_init(enum php_ctlr_type ctlr_type) -{ - int rc; - - if (ctlr_type != PCI) - return -ENODEV; - - dbg("shpchprm ACPI init \n"); - acpi_bridges_head = NULL; - - /* construct PCI bus:device tree of acpi_handles */ - rc = shpchprm_acpi_scan_pci(); - if (rc) - return rc; - - dbg("shpchprm ACPI init %s\n", (rc)?"fail":"success"); - return rc; -} - -static void free_a_slot(struct acpi_php_slot *aps) -{ - dbg(" free a php func of slot(0x%02x) on PCI b:d:f=0x%02x:%02x:%02x\n", aps->sun, aps->bus, aps->dev, aps->fun); - - free_pci_resource (aps->io_head); - free_pci_resource (aps->bus_head); - free_pci_resource (aps->mem_head); - free_pci_resource (aps->p_mem_head); - - kfree(aps); -} - -static void free_a_bridge( struct acpi_bridge *ab) -{ - struct acpi_php_slot *aps, *next; - - switch (ab->type) { - case BRIDGE_TYPE_HOST: - dbg("Free ACPI PCI HOST Bridge(%x) [%s] on s:b:d:f(%x:%x:%x:%x)\n", - ab->bus, acpi_path_name(ab->handle), ab->seg, ab->pbus, ab->pdevice, ab->pfunction); - break; - case BRIDGE_TYPE_P2P: - dbg("Free ACPI PCI P2P Bridge(%x-%x) [%s] on s:b:d:f(%x:%x:%x:%x)\n", - ab->pbus, ab->bus, acpi_path_name(ab->handle), ab->seg, ab->pbus, ab->pdevice, ab->pfunction); - break; - }; - - /* free slots first */ - for (aps = ab->slots; aps; aps = next) { - next = aps->next; - free_a_slot(aps); - } - - free_pci_resource (ab->io_head); - free_pci_resource (ab->tio_head); - free_pci_resource (ab->bus_head); - free_pci_resource (ab->tbus_head); - free_pci_resource (ab->mem_head); - free_pci_resource (ab->tmem_head); - free_pci_resource (ab->p_mem_head); - free_pci_resource (ab->tp_mem_head); - - kfree(ab); -} - -static void shpchprm_free_bridges ( struct acpi_bridge *ab) -{ - if (!ab) - return; - - if (ab->child) - shpchprm_free_bridges (ab->child); - - if (ab->next) - shpchprm_free_bridges (ab->next); - - free_a_bridge(ab); -} - -void shpchprm_cleanup(void) -{ - shpchprm_free_bridges (acpi_bridges_head); -} - -static int get_number_of_slots ( - struct acpi_bridge *ab, - int selfonly - ) -{ - struct acpi_php_slot *aps; - int prev_slot = -1; - int slot_num = 0; - - for ( aps = ab->slots; aps; aps = aps->next) - if (aps->dev != prev_slot) { - prev_slot = aps->dev; - slot_num++; - } - - if (ab->child) - slot_num += get_number_of_slots (ab->child, 0); - - if (selfonly) - return slot_num; - - if (ab->next) - slot_num += get_number_of_slots (ab->next, 0); - - return slot_num; -} - -static int print_acpi_resources (struct acpi_bridge *ab) -{ - struct acpi_php_slot *aps; - int i; - - switch (ab->type) { - case BRIDGE_TYPE_HOST: - dbg("PCI HOST Bridge (%x) [%s]\n", ab->bus, acpi_path_name(ab->handle)); - break; - case BRIDGE_TYPE_P2P: - dbg("PCI P2P Bridge (%x-%x) [%s]\n", ab->pbus, ab->bus, acpi_path_name(ab->handle)); - break; - }; - - print_pci_resources (ab); - - for ( i = -1, aps = ab->slots; aps; aps = aps->next) { - if (aps->dev == i) - continue; - dbg(" Slot sun(%x) s:b:d:f(%02x:%02x:%02x:%02x)\n", aps->sun, aps->seg, aps->bus, aps->dev, aps->fun); - print_slot_resources(aps); - i = aps->dev; - } - - if (ab->child) - print_acpi_resources (ab->child); - - if (ab->next) - print_acpi_resources (ab->next); - - return 0; -} - -int shpchprm_print_pirt(void) -{ - dbg("SHPCHPRM ACPI Slots\n"); - if (acpi_bridges_head) - print_acpi_resources (acpi_bridges_head); - return 0; -} - -static struct acpi_php_slot * get_acpi_slot ( - struct acpi_bridge *ab, - u32 sun - ) -{ - struct acpi_php_slot *aps = NULL; - - for ( aps = ab->slots; aps; aps = aps->next) - if (aps->sun == sun) - return aps; - - if (!aps && ab->child) { - aps = (struct acpi_php_slot *)get_acpi_slot (ab->child, sun); - if (aps) - return aps; - } - - if (!aps && ab->next) { - aps = (struct acpi_php_slot *)get_acpi_slot (ab->next, sun); - if (aps) - return aps; - } - - return aps; - -} - -#if 0 -static void * shpchprm_get_slot(struct slot *slot) -{ - struct acpi_bridge *ab = acpi_bridges_head; - struct acpi_php_slot *aps = get_acpi_slot (ab, slot->number); - - aps->slot = slot; - - dbg("Got acpi slot sun(%x): s:b:d:f(%x:%x:%x:%x)\n", aps->sun, aps->seg, aps->bus, aps->dev, aps->fun); - - return (void *)aps; -} -#endif - -static void shpchprm_dump_func_res( struct pci_func *fun) -{ - struct pci_func *func = fun; - - if (func->bus_head) { - dbg(": BUS Resources:\n"); - print_pci_resource (func->bus_head); - } - if (func->io_head) { - dbg(": IO Resources:\n"); - print_pci_resource (func->io_head); - } - if (func->mem_head) { - dbg(": MEM Resources:\n"); - print_pci_resource (func->mem_head); - } - if (func->p_mem_head) { - dbg(": PMEM Resources:\n"); - print_pci_resource (func->p_mem_head); - } -} - -static void shpchprm_dump_ctrl_res( struct controller *ctlr) -{ - struct controller *ctrl = ctlr; - - if (ctrl->bus_head) { - dbg(": BUS Resources:\n"); - print_pci_resource (ctrl->bus_head); - } - if (ctrl->io_head) { - dbg(": IO Resources:\n"); - print_pci_resource (ctrl->io_head); - } - if (ctrl->mem_head) { - dbg(": MEM Resources:\n"); - print_pci_resource (ctrl->mem_head); - } - if (ctrl->p_mem_head) { - dbg(": PMEM Resources:\n"); - print_pci_resource (ctrl->p_mem_head); - } -} - -static int shpchprm_get_used_resources ( - struct controller *ctrl, - struct pci_func *func - ) -{ - return shpchp_save_used_resources (ctrl, func, !DISABLE_CARD); -} - -static int configure_existing_function( - struct controller *ctrl, - struct pci_func *func - ) -{ - int rc; - - /* see how much resources the func has used. */ - rc = shpchprm_get_used_resources (ctrl, func); - - if (!rc) { - /* subtract the resources used by the func from ctrl resources */ - rc = shpchprm_delete_resources (&ctrl->bus_head, func->bus_head); - rc |= shpchprm_delete_resources (&ctrl->io_head, func->io_head); - rc |= shpchprm_delete_resources (&ctrl->mem_head, func->mem_head); - rc |= shpchprm_delete_resources (&ctrl->p_mem_head, func->p_mem_head); - if (rc) - warn("aCEF: cannot del used resources\n"); - } else - err("aCEF: cannot get used resources\n"); - - return rc; -} - -static int bind_pci_resources_to_slots ( struct controller *ctrl) -{ - struct pci_func *func, new_func; - int busn = ctrl->slot_bus; - int devn, funn; - u32 vid; - - for (devn = 0; devn < 32; devn++) { - for (funn = 0; funn < 8; funn++) { - /* - if (devn == ctrl->device && funn == ctrl->function) - continue; - */ - /* find out if this entry is for an occupied slot */ - vid = 0xFFFFFFFF; - pci_bus_read_config_dword(ctrl->pci_dev->subordinate, PCI_DEVFN(devn, funn), PCI_VENDOR_ID, &vid); - - if (vid != 0xFFFFFFFF) { - func = shpchp_slot_find(busn, devn, funn); - if (!func) { - memset(&new_func, 0, sizeof(struct pci_func)); - new_func.bus = busn; - new_func.device = devn; - new_func.function = funn; - new_func.is_a_board = 1; - configure_existing_function(ctrl, &new_func); - shpchprm_dump_func_res(&new_func); - } else { - configure_existing_function(ctrl, func); - shpchprm_dump_func_res(func); - } - dbg("aCCF:existing PCI 0x%x Func ResourceDump\n", ctrl->bus); - } - } - } - - return 0; -} - -static int bind_pci_resources( - struct controller *ctrl, - struct acpi_bridge *ab - ) -{ - int status = 0; - - if (ab->bus_head) { - dbg("bapr: BUS Resources add on PCI 0x%x\n", ab->bus); - status = shpchprm_add_resources (&ctrl->bus_head, ab->bus_head); - if (shpchprm_delete_resources (&ab->bus_head, ctrl->bus_head)) - warn("bapr: cannot sub BUS Resource on PCI 0x%x\n", ab->bus); - if (status) { - err("bapr: BUS Resource add on PCI 0x%x: fail=0x%x\n", ab->bus, status); - return status; - } - } else - info("bapr: No BUS Resource on PCI 0x%x.\n", ab->bus); - - if (ab->io_head) { - dbg("bapr: IO Resources add on PCI 0x%x\n", ab->bus); - status = shpchprm_add_resources (&ctrl->io_head, ab->io_head); - if (shpchprm_delete_resources (&ab->io_head, ctrl->io_head)) - warn("bapr: cannot sub IO Resource on PCI 0x%x\n", ab->bus); - if (status) { - err("bapr: IO Resource add on PCI 0x%x: fail=0x%x\n", ab->bus, status); - return status; - } - } else - info("bapr: No IO Resource on PCI 0x%x.\n", ab->bus); - - if (ab->mem_head) { - dbg("bapr: MEM Resources add on PCI 0x%x\n", ab->bus); - status = shpchprm_add_resources (&ctrl->mem_head, ab->mem_head); - if (shpchprm_delete_resources (&ab->mem_head, ctrl->mem_head)) - warn("bapr: cannot sub MEM Resource on PCI 0x%x\n", ab->bus); - if (status) { - err("bapr: MEM Resource add on PCI 0x%x: fail=0x%x\n", ab->bus, status); - return status; - } - } else - info("bapr: No MEM Resource on PCI 0x%x.\n", ab->bus); - - if (ab->p_mem_head) { - dbg("bapr: PMEM Resources add on PCI 0x%x\n", ab->bus); - status = shpchprm_add_resources (&ctrl->p_mem_head, ab->p_mem_head); - if (shpchprm_delete_resources (&ab->p_mem_head, ctrl->p_mem_head)) - warn("bapr: cannot sub PMEM Resource on PCI 0x%x\n", ab->bus); - if (status) { - err("bapr: PMEM Resource add on PCI 0x%x: fail=0x%x\n", ab->bus, status); - return status; - } - } else - info("bapr: No PMEM Resource on PCI 0x%x.\n", ab->bus); - - return status; -} - -static int no_pci_resources( struct acpi_bridge *ab) -{ - return !(ab->p_mem_head || ab->mem_head || ab->io_head || ab->bus_head); -} - -static int find_pci_bridge_resources ( - struct controller *ctrl, - struct acpi_bridge *ab - ) -{ - int rc = 0; - struct pci_func func; - - memset(&func, 0, sizeof(struct pci_func)); - - func.bus = ab->pbus; - func.device = ab->pdevice; - func.function = ab->pfunction; - func.is_a_board = 1; - - /* Get used resources for this PCI bridge */ - rc = shpchp_save_used_resources (ctrl, &func, !DISABLE_CARD); - - ab->io_head = func.io_head; - ab->mem_head = func.mem_head; - ab->p_mem_head = func.p_mem_head; - ab->bus_head = func.bus_head; - if (ab->bus_head) - shpchprm_delete_resource(&ab->bus_head, ctrl->bus, 1); - - return rc; -} - -static int get_pci_resources_from_bridge( - struct controller *ctrl, - struct acpi_bridge *ab - ) -{ - int rc = 0; - - dbg("grfb: Get Resources for PCI 0x%x from actual PCI bridge 0x%x.\n", ctrl->bus, ab->bus); - - rc = find_pci_bridge_resources (ctrl, ab); - - shpchp_resource_sort_and_combine(&ab->bus_head); - shpchp_resource_sort_and_combine(&ab->io_head); - shpchp_resource_sort_and_combine(&ab->mem_head); - shpchp_resource_sort_and_combine(&ab->p_mem_head); - - shpchprm_add_resources (&ab->tbus_head, ab->bus_head); - shpchprm_add_resources (&ab->tio_head, ab->io_head); - shpchprm_add_resources (&ab->tmem_head, ab->mem_head); - shpchprm_add_resources (&ab->tp_mem_head, ab->p_mem_head); - - return rc; -} - -static int get_pci_resources( - struct controller *ctrl, - struct acpi_bridge *ab - ) -{ - int rc = 0; - - if (no_pci_resources(ab)) { - dbg("spbr:PCI 0x%x has no resources. Get parent resources.\n", ab->bus); - rc = get_pci_resources_from_bridge(ctrl, ab); - } - - return rc; } int shpchprm_get_physical_slot_number(struct controller *ctrl, u32 *sun, u8 busnum, u8 devnum) @@ -1570,144 +147,40 @@ int shpchprm_get_physical_slot_number(struct controller *ctrl, u32 *sun, u8 busn return 0; } -/* - * Get resources for this ctrl. - * 1. get total resources from ACPI _CRS or bridge (this ctrl) - * 2. find used resources of existing adapters - * 3. subtract used resources from total resources - */ -int shpchprm_find_available_resources( struct controller *ctrl) +void get_hp_hw_control_from_firmware(struct pci_dev *dev) { - int rc = 0; - struct acpi_bridge *ab; - - ab = find_acpi_bridge_by_bus(acpi_bridges_head, ctrl->seg, ctrl->pci_dev->subordinate->number); - if (!ab) { - err("pfar:cannot locate acpi bridge of PCI 0x%x.\n", ctrl->pci_dev->subordinate->number); - return -1; - } - if (no_pci_resources(ab)) { - rc = get_pci_resources(ctrl, ab); - if (rc) { - err("pfar:cannot get pci resources of PCI 0x%x.\n",ctrl->pci_dev->subordinate->number); - return -1; - } - } - - rc = bind_pci_resources(ctrl, ab); - dbg("pfar:pre-Bind PCI 0x%x Ctrl Resource Dump\n", ctrl->pci_dev->subordinate->number); - shpchprm_dump_ctrl_res(ctrl); - - bind_pci_resources_to_slots (ctrl); - - dbg("pfar:post-Bind PCI 0x%x Ctrl Resource Dump\n", ctrl->pci_dev->subordinate->number); - shpchprm_dump_ctrl_res(ctrl); - - return rc; -} - -int shpchprm_set_hpp( - struct controller *ctrl, - struct pci_func *func, - u8 card_type - ) -{ - struct acpi_bridge *ab; - struct pci_bus lpci_bus, *pci_bus; - int rc = 0; - unsigned int devfn; - u8 cls= 0x08; /* default cache line size */ - u8 lt = 0x40; /* default latency timer */ - u8 ep = 0; - u8 es = 0; - - memcpy(&lpci_bus, ctrl->pci_bus, sizeof(lpci_bus)); - pci_bus = &lpci_bus; - pci_bus->number = func->bus; - devfn = PCI_DEVFN(func->device, func->function); - - ab = find_acpi_bridge_by_bus(acpi_bridges_head, ctrl->seg, ctrl->slot_bus); - - if (ab) { - if (ab->_hpp) { - lt = (u8)ab->_hpp->latency_timer; - cls = (u8)ab->_hpp->cache_line_size; - ep = (u8)ab->_hpp->enable_perr; - es = (u8)ab->_hpp->enable_serr; - } else - dbg("_hpp: no _hpp for B/D/F=%#x/%#x/%#x. use default value\n", func->bus, func->device, func->function); - } else - dbg("_hpp: no acpi bridge for B/D/F = %#x/%#x/%#x. use default value\n", func->bus, func->device, func->function); - - - if (card_type == PCI_HEADER_TYPE_BRIDGE) { - /* set subordinate Latency Timer */ - rc |= pci_bus_write_config_byte(pci_bus, devfn, PCI_SEC_LATENCY_TIMER, lt); - } - - /* set base Latency Timer */ - rc |= pci_bus_write_config_byte(pci_bus, devfn, PCI_LATENCY_TIMER, lt); - dbg(" set latency timer =0x%02x: %x\n", lt, rc); - - rc |= pci_bus_write_config_byte(pci_bus, devfn, PCI_CACHE_LINE_SIZE, cls); - dbg(" set cache_line_size=0x%02x: %x\n", cls, rc); - - return rc; + /* + * OSHP is an optional ACPI firmware control method. If present, + * we need to run it to inform BIOS that we will control SHPC + * hardware from now on. + */ + acpi_handle handle = DEVICE_ACPI_HANDLE(&(dev->dev)); + if (!handle) + return; + acpi_run_oshp(handle); } -void shpchprm_enable_card( - struct controller *ctrl, - struct pci_func *func, - u8 card_type) +void get_hp_params_from_firmware(struct pci_dev *dev, + struct hotplug_params *hpp) { - u16 command, cmd, bcommand, bcmd; - struct pci_bus lpci_bus, *pci_bus; - struct acpi_bridge *ab; - unsigned int devfn; - int rc; - - memcpy(&lpci_bus, ctrl->pci_bus, sizeof(lpci_bus)); - pci_bus = &lpci_bus; - pci_bus->number = func->bus; - devfn = PCI_DEVFN(func->device, func->function); - - rc = pci_bus_read_config_word(pci_bus, devfn, PCI_COMMAND, &command); - - if (card_type == PCI_HEADER_TYPE_BRIDGE) { - rc = pci_bus_read_config_word(pci_bus, devfn, PCI_BRIDGE_CONTROL, &bcommand); - } + acpi_status status = AE_NOT_FOUND; + struct pci_dev *pdev = dev; - cmd = command = command | PCI_COMMAND_MASTER | PCI_COMMAND_INVALIDATE - | PCI_COMMAND_IO | PCI_COMMAND_MEMORY; - bcmd = bcommand = bcommand | PCI_BRIDGE_CTL_NO_ISA; - - ab = find_acpi_bridge_by_bus(acpi_bridges_head, ctrl->seg, ctrl->slot_bus); - if (ab) { - if (ab->_hpp) { - if (ab->_hpp->enable_perr) { - command |= PCI_COMMAND_PARITY; - bcommand |= PCI_BRIDGE_CTL_PARITY; - } else { - command &= ~PCI_COMMAND_PARITY; - bcommand &= ~PCI_BRIDGE_CTL_PARITY; - } - if (ab->_hpp->enable_serr) { - command |= PCI_COMMAND_SERR; - bcommand |= PCI_BRIDGE_CTL_SERR; - } else { - command &= ~PCI_COMMAND_SERR; - bcommand &= ~PCI_BRIDGE_CTL_SERR; - } - } else - dbg("no _hpp for B/D/F = %#x/%#x/%#x.\n", func->bus, func->device, func->function); - } else - dbg("no acpi bridge for B/D/F = %#x/%#x/%#x.\n", func->bus, func->device, func->function); - - if (command != cmd) { - rc = pci_bus_write_config_word(pci_bus, devfn, PCI_COMMAND, command); - } - if ((card_type == PCI_HEADER_TYPE_BRIDGE) && (bcommand != bcmd)) { - rc = pci_bus_write_config_word(pci_bus, devfn, PCI_BRIDGE_CONTROL, bcommand); + /* + * _HPP settings apply to all child buses, until another _HPP is + * encountered. If we don't find an _HPP for the input pci 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) + break; + status = acpi_run_hpp(handle, hpp); + if (!(pdev->bus->parent)) + break; + /* Check if a parent object supports _HPP */ + pdev = pdev->bus->parent->self; } } diff --git a/drivers/pci/hotplug/shpchprm_legacy.c b/drivers/pci/hotplug/shpchprm_legacy.c index 37fa77a98..ed6c1254b 100644 --- a/drivers/pci/hotplug/shpchprm_legacy.c +++ b/drivers/pci/hotplug/shpchprm_legacy.c @@ -23,37 +23,15 @@ * 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 , * */ -#include #include #include #include #include -#include -#include -#ifdef CONFIG_IA64 -#include -#endif #include "shpchp.h" -#include "shpchprm.h" -#include "shpchprm_legacy.h" - -static void __iomem *shpchp_rom_start; -static u16 unused_IRQ; - -void shpchprm_cleanup(void) -{ - if (shpchp_rom_start) - iounmap(shpchp_rom_start); -} - -int shpchprm_print_pirt(void) -{ - return 0; -} int shpchprm_get_physical_slot_number(struct controller *ctrl, u32 *sun, u8 busnum, u8 devnum) { @@ -63,377 +41,14 @@ int shpchprm_get_physical_slot_number(struct controller *ctrl, u32 *sun, u8 busn return 0; } -/* Find the Hot Plug Resource Table in the specified region of memory */ -static void __iomem *detect_HRT_floating_pointer(void __iomem *begin, void __iomem *end) +void get_hp_params_from_firmware(struct pci_dev *dev, + struct hotplug_params *hpp) { - void __iomem *fp; - void __iomem *endp; - u8 temp1, temp2, temp3, temp4; - int status = 0; - - endp = (end - sizeof(struct hrt) + 1); - - for (fp = begin; fp <= endp; fp += 16) { - temp1 = readb(fp + SIG0); - temp2 = readb(fp + SIG1); - temp3 = readb(fp + SIG2); - temp4 = readb(fp + SIG3); - if (temp1 == '$' && temp2 == 'H' && temp3 == 'R' && temp4 == 'T') { - status = 1; - break; - } - } - - if (!status) - fp = NULL; - - dbg("Discovered Hotplug Resource Table at %p\n", fp); - return fp; + return; } -/* - * shpchprm_find_available_resources - * - * Finds available memory, IO, and IRQ resources for programming - * devices which may be added to the system - * this function is for hot plug ADD! - * - * returns 0 if success - */ -int shpchprm_find_available_resources(struct controller *ctrl) +void get_hp_hw_control_from_firmware(struct pci_dev *dev) { - u8 populated_slot; - u8 bridged_slot; - void __iomem *one_slot; - struct pci_func *func = NULL; - int i = 10, index = 0; - u32 temp_dword, rc; - ulong temp_ulong; - struct pci_resource *mem_node; - struct pci_resource *p_mem_node; - struct pci_resource *io_node; - struct pci_resource *bus_node; - void __iomem *rom_resource_table; - struct pci_bus lpci_bus, *pci_bus; - u8 cfgspc_irq, temp; - - memcpy(&lpci_bus, ctrl->pci_bus, sizeof(lpci_bus)); - pci_bus = &lpci_bus; - rom_resource_table = detect_HRT_floating_pointer(shpchp_rom_start, shpchp_rom_start + 0xffff); - dbg("rom_resource_table = %p\n", rom_resource_table); - if (rom_resource_table == NULL) - return -ENODEV; - - /* Sum all resources and setup resource maps */ - unused_IRQ = readl(rom_resource_table + UNUSED_IRQ); - dbg("unused_IRQ = %x\n", unused_IRQ); - - temp = 0; - while (unused_IRQ) { - if (unused_IRQ & 1) { - shpchp_disk_irq = temp; - break; - } - unused_IRQ = unused_IRQ >> 1; - temp++; - } - - dbg("shpchp_disk_irq= %d\n", shpchp_disk_irq); - unused_IRQ = unused_IRQ >> 1; - temp++; - - while (unused_IRQ) { - if (unused_IRQ & 1) { - shpchp_nic_irq = temp; - break; - } - unused_IRQ = unused_IRQ >> 1; - temp++; - } - - dbg("shpchp_nic_irq= %d\n", shpchp_nic_irq); - unused_IRQ = readl(rom_resource_table + PCIIRQ); - - temp = 0; - - pci_read_config_byte(ctrl->pci_dev, PCI_INTERRUPT_LINE, &cfgspc_irq); - - if (!shpchp_nic_irq) { - shpchp_nic_irq = cfgspc_irq; - } - - if (!shpchp_disk_irq) { - shpchp_disk_irq = cfgspc_irq; - } - - dbg("shpchp_disk_irq, shpchp_nic_irq= %d, %d\n", shpchp_disk_irq, shpchp_nic_irq); - - one_slot = rom_resource_table + sizeof(struct hrt); - - i = readb(rom_resource_table + NUMBER_OF_ENTRIES); - dbg("number_of_entries = %d\n", i); - - if (!readb(one_slot + SECONDARY_BUS)) - return (1); - - dbg("dev|IO base|length|MEMbase|length|PM base|length|PB SB MB\n"); - - while (i && readb(one_slot + SECONDARY_BUS)) { - u8 dev_func = readb(one_slot + DEV_FUNC); - u8 primary_bus = readb(one_slot + PRIMARY_BUS); - u8 secondary_bus = readb(one_slot + SECONDARY_BUS); - u8 max_bus = readb(one_slot + MAX_BUS); - u16 io_base = readw(one_slot + IO_BASE); - u16 io_length = readw(one_slot + IO_LENGTH); - u16 mem_base = readw(one_slot + MEM_BASE); - u16 mem_length = readw(one_slot + MEM_LENGTH); - u16 pre_mem_base = readw(one_slot + PRE_MEM_BASE); - u16 pre_mem_length = readw(one_slot + PRE_MEM_LENGTH); - - dbg("%2.2x | %4.4x | %4.4x | %4.4x | %4.4x | %4.4x | %4.4x |%2.2x %2.2x %2.2x\n", - dev_func, io_base, io_length, mem_base, mem_length, pre_mem_base, pre_mem_length, - primary_bus, secondary_bus, max_bus); - - /* If this entry isn't for our controller's bus, ignore it */ - if (primary_bus != ctrl->slot_bus) { - i--; - one_slot += sizeof(struct slot_rt); - continue; - } - /* find out if this entry is for an occupied slot */ - temp_dword = 0xFFFFFFFF; - pci_bus->number = primary_bus; - pci_bus_read_config_dword(pci_bus, dev_func, PCI_VENDOR_ID, &temp_dword); - - dbg("temp_D_word = %x\n", temp_dword); - - if (temp_dword != 0xFFFFFFFF) { - index = 0; - func = shpchp_slot_find(primary_bus, dev_func >> 3, 0); - - while (func && (func->function != (dev_func & 0x07))) { - dbg("func = %p b:d:f(%x:%x:%x)\n", func, primary_bus, dev_func >> 3, index); - func = shpchp_slot_find(primary_bus, dev_func >> 3, index++); - } - - /* If we can't find a match, skip this table entry */ - if (!func) { - i--; - one_slot += sizeof(struct slot_rt); - continue; - } - /* this may not work and shouldn't be used */ - if (secondary_bus != primary_bus) - bridged_slot = 1; - else - bridged_slot = 0; - - populated_slot = 1; - } else { - populated_slot = 0; - bridged_slot = 0; - } - dbg("slot populated =%s \n", populated_slot?"yes":"no"); - - /* If we've got a valid IO base, use it */ - - temp_ulong = io_base + io_length; - - if ((io_base) && (temp_ulong <= 0x10000)) { - io_node = (struct pci_resource *) kmalloc(sizeof(struct pci_resource), GFP_KERNEL); - if (!io_node) - return -ENOMEM; - - io_node->base = (ulong)io_base; - io_node->length = (ulong)io_length; - dbg("found io_node(base, length) = %x, %x\n", io_node->base, io_node->length); - - if (!populated_slot) { - io_node->next = ctrl->io_head; - ctrl->io_head = io_node; - } else { - io_node->next = func->io_head; - func->io_head = io_node; - } - } - - /* If we've got a valid memory base, use it */ - temp_ulong = mem_base + mem_length; - if ((mem_base) && (temp_ulong <= 0x10000)) { - mem_node = (struct pci_resource *) kmalloc(sizeof(struct pci_resource), GFP_KERNEL); - if (!mem_node) - return -ENOMEM; - - mem_node->base = (ulong)mem_base << 16; - mem_node->length = (ulong)(mem_length << 16); - dbg("found mem_node(base, length) = %x, %x\n", mem_node->base, mem_node->length); - - if (!populated_slot) { - mem_node->next = ctrl->mem_head; - ctrl->mem_head = mem_node; - } else { - mem_node->next = func->mem_head; - func->mem_head = mem_node; - } - } - - /* - * If we've got a valid prefetchable memory base, and - * the base + length isn't greater than 0xFFFF - */ - temp_ulong = pre_mem_base + pre_mem_length; - if ((pre_mem_base) && (temp_ulong <= 0x10000)) { - p_mem_node = (struct pci_resource *) kmalloc(sizeof(struct pci_resource), GFP_KERNEL); - if (!p_mem_node) - return -ENOMEM; - - p_mem_node->base = (ulong)pre_mem_base << 16; - p_mem_node->length = (ulong)pre_mem_length << 16; - dbg("found p_mem_node(base, length) = %x, %x\n", p_mem_node->base, p_mem_node->length); - - if (!populated_slot) { - p_mem_node->next = ctrl->p_mem_head; - ctrl->p_mem_head = p_mem_node; - } else { - p_mem_node->next = func->p_mem_head; - func->p_mem_head = p_mem_node; - } - } - - /* - * If we've got a valid bus number, use it - * The second condition is to ignore bus numbers on - * populated slots that don't have PCI-PCI bridges - */ - if (secondary_bus && (secondary_bus != primary_bus)) { - bus_node = (struct pci_resource *) kmalloc(sizeof(struct pci_resource), GFP_KERNEL); - if (!bus_node) - return -ENOMEM; - - bus_node->base = (ulong)secondary_bus; - bus_node->length = (ulong)(max_bus - secondary_bus + 1); - dbg("found bus_node(base, length) = %x, %x\n", bus_node->base, bus_node->length); - - if (!populated_slot) { - bus_node->next = ctrl->bus_head; - ctrl->bus_head = bus_node; - } else { - bus_node->next = func->bus_head; - func->bus_head = bus_node; - } - } - - i--; - one_slot += sizeof(struct slot_rt); - } - - /* If all of the following fail, we don't have any resources for hot plug add */ - rc = 1; - rc &= shpchp_resource_sort_and_combine(&(ctrl->mem_head)); - rc &= shpchp_resource_sort_and_combine(&(ctrl->p_mem_head)); - rc &= shpchp_resource_sort_and_combine(&(ctrl->io_head)); - rc &= shpchp_resource_sort_and_combine(&(ctrl->bus_head)); - - return (rc); + return; } -int shpchprm_set_hpp( - struct controller *ctrl, - struct pci_func *func, - u8 card_type) -{ - u32 rc; - u8 temp_byte; - struct pci_bus lpci_bus, *pci_bus; - unsigned int devfn; - memcpy(&lpci_bus, ctrl->pci_bus, sizeof(lpci_bus)); - pci_bus = &lpci_bus; - pci_bus->number = func->bus; - devfn = PCI_DEVFN(func->device, func->function); - - temp_byte = 0x40; /* hard coded value for LT */ - if (card_type == PCI_HEADER_TYPE_BRIDGE) { - /* set subordinate Latency Timer */ - rc = pci_bus_write_config_byte(pci_bus, devfn, PCI_SEC_LATENCY_TIMER, temp_byte); - if (rc) { - dbg("%s: set secondary LT error. b:d:f(%02x:%02x:%02x)\n", __FUNCTION__, func->bus, - func->device, func->function); - return rc; - } - } - - /* set base Latency Timer */ - rc = pci_bus_write_config_byte(pci_bus, devfn, PCI_LATENCY_TIMER, temp_byte); - if (rc) { - dbg("%s: set LT error. b:d:f(%02x:%02x:%02x)\n", __FUNCTION__, func->bus, func->device, func->function); - return rc; - } - - /* set Cache Line size */ - temp_byte = 0x08; /* hard coded value for CLS */ - rc = pci_bus_write_config_byte(pci_bus, devfn, PCI_CACHE_LINE_SIZE, temp_byte); - if (rc) { - dbg("%s: set CLS error. b:d:f(%02x:%02x:%02x)\n", __FUNCTION__, func->bus, func->device, func->function); - } - - /* set enable_perr */ - /* set enable_serr */ - - return rc; -} - -void shpchprm_enable_card( - struct controller *ctrl, - struct pci_func *func, - u8 card_type) -{ - u16 command, bcommand; - struct pci_bus lpci_bus, *pci_bus; - unsigned int devfn; - int rc; - - memcpy(&lpci_bus, ctrl->pci_bus, sizeof(lpci_bus)); - pci_bus = &lpci_bus; - pci_bus->number = func->bus; - devfn = PCI_DEVFN(func->device, func->function); - - rc = pci_bus_read_config_word(pci_bus, devfn, PCI_COMMAND, &command); - command |= PCI_COMMAND_PARITY | PCI_COMMAND_SERR - | PCI_COMMAND_MASTER | PCI_COMMAND_INVALIDATE - | PCI_COMMAND_IO | PCI_COMMAND_MEMORY; - rc = pci_bus_write_config_word(pci_bus, devfn, PCI_COMMAND, command); - - if (card_type == PCI_HEADER_TYPE_BRIDGE) { - rc = pci_bus_read_config_word(pci_bus, devfn, PCI_BRIDGE_CONTROL, &bcommand); - bcommand |= PCI_BRIDGE_CTL_PARITY | PCI_BRIDGE_CTL_SERR - | PCI_BRIDGE_CTL_NO_ISA; - rc = pci_bus_write_config_word(pci_bus, devfn, PCI_BRIDGE_CONTROL, bcommand); - } -} - -static int legacy_shpchprm_init_pci(void) -{ - shpchp_rom_start = ioremap(ROM_PHY_ADDR, ROM_PHY_LEN); - if (!shpchp_rom_start) { - err("Could not ioremap memory region for ROM\n"); - return -EIO; - } - - return 0; -} - -int shpchprm_init(enum php_ctlr_type ctrl_type) -{ - int retval; - - switch (ctrl_type) { - case PCI: - retval = legacy_shpchprm_init_pci(); - break; - default: - retval = -ENODEV; - break; - } - - return retval; -} diff --git a/drivers/pci/hotplug/shpchprm_nonacpi.c b/drivers/pci/hotplug/shpchprm_nonacpi.c index 88f4d9f41..c6b40998e 100644 --- a/drivers/pci/hotplug/shpchprm_nonacpi.c +++ b/drivers/pci/hotplug/shpchprm_nonacpi.c @@ -23,7 +23,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 , * */ @@ -32,24 +32,9 @@ #include #include #include -#include -#include -#ifdef CONFIG_IA64 -#include -#endif -#include "shpchp.h" -#include "shpchprm.h" -#include "shpchprm_nonacpi.h" +#include -void shpchprm_cleanup(void) -{ - return; -} - -int shpchprm_print_pirt(void) -{ - return 0; -} +#include "shpchp.h" int shpchprm_get_physical_slot_number(struct controller *ctrl, u32 *sun, u8 busnum, u8 devnum) { @@ -60,375 +45,13 @@ int shpchprm_get_physical_slot_number(struct controller *ctrl, u32 *sun, u8 busn return 0; } -static void print_pci_resource ( struct pci_resource *aprh) -{ - struct pci_resource *res; - - for (res = aprh; res; res = res->next) - dbg(" base= 0x%x length= 0x%x\n", res->base, res->length); -} - - -static void phprm_dump_func_res( struct pci_func *fun) -{ - struct pci_func *func = fun; - - if (func->bus_head) { - dbg(": BUS Resources:\n"); - print_pci_resource (func->bus_head); - } - if (func->io_head) { - dbg(": IO Resources:\n"); - print_pci_resource (func->io_head); - } - if (func->mem_head) { - dbg(": MEM Resources:\n"); - print_pci_resource (func->mem_head); - } - if (func->p_mem_head) { - dbg(": PMEM Resources:\n"); - print_pci_resource (func->p_mem_head); - } -} - -static int phprm_get_used_resources ( - struct controller *ctrl, - struct pci_func *func - ) -{ - return shpchp_save_used_resources (ctrl, func, !DISABLE_CARD); -} - -static int phprm_delete_resource( - struct pci_resource **aprh, - ulong base, - ulong size) -{ - struct pci_resource *res; - struct pci_resource *prevnode; - struct pci_resource *split_node; - ulong tbase; - - shpchp_resource_sort_and_combine(aprh); - - for (res = *aprh; res; res = res->next) { - if (res->base > base) - continue; - - if ((res->base + res->length) < (base + size)) - continue; - - if (res->base < base) { - tbase = base; - - if ((res->length - (tbase - res->base)) < size) - continue; - - split_node = (struct pci_resource *) kmalloc(sizeof(struct pci_resource), GFP_KERNEL); - if (!split_node) - return -ENOMEM; - - split_node->base = res->base; - split_node->length = tbase - res->base; - res->base = tbase; - res->length -= split_node->length; - - split_node->next = res->next; - res->next = split_node; - } - - if (res->length >= size) { - split_node = (struct pci_resource*) kmalloc(sizeof(struct pci_resource), GFP_KERNEL); - if (!split_node) - return -ENOMEM; - - split_node->base = res->base + size; - split_node->length = res->length - size; - res->length = size; - - split_node->next = res->next; - res->next = split_node; - } - - if (*aprh == res) { - *aprh = res->next; - } else { - prevnode = *aprh; - while (prevnode->next != res) - prevnode = prevnode->next; - - prevnode->next = res->next; - } - res->next = NULL; - kfree(res); - break; - } - - return 0; -} - - -static int phprm_delete_resources( - struct pci_resource **aprh, - struct pci_resource *this - ) -{ - struct pci_resource *res; - - for (res = this; res; res = res->next) - phprm_delete_resource(aprh, res->base, res->length); - - return 0; -} - - -static int configure_existing_function( - struct controller *ctrl, - struct pci_func *func - ) -{ - int rc; - - /* see how much resources the func has used. */ - rc = phprm_get_used_resources (ctrl, func); - - if (!rc) { - /* subtract the resources used by the func from ctrl resources */ - rc = phprm_delete_resources (&ctrl->bus_head, func->bus_head); - rc |= phprm_delete_resources (&ctrl->io_head, func->io_head); - rc |= phprm_delete_resources (&ctrl->mem_head, func->mem_head); - rc |= phprm_delete_resources (&ctrl->p_mem_head, func->p_mem_head); - if (rc) - warn("aCEF: cannot del used resources\n"); - } else - err("aCEF: cannot get used resources\n"); - - return rc; -} - -static int bind_pci_resources_to_slots ( struct controller *ctrl) -{ - struct pci_func *func, new_func; - int busn = ctrl->slot_bus; - int devn, funn; - u32 vid; - - for (devn = 0; devn < 32; devn++) { - for (funn = 0; funn < 8; funn++) { - /* - if (devn == ctrl->device && funn == ctrl->function) - continue; - */ - /* find out if this entry is for an occupied slot */ - vid = 0xFFFFFFFF; - - pci_bus_read_config_dword(ctrl->pci_dev->subordinate, PCI_DEVFN(devn, funn), PCI_VENDOR_ID, &vid); - - if (vid != 0xFFFFFFFF) { - func = shpchp_slot_find(busn, devn, funn); - if (!func) { - memset(&new_func, 0, sizeof(struct pci_func)); - new_func.bus = busn; - new_func.device = devn; - new_func.function = funn; - new_func.is_a_board = 1; - configure_existing_function(ctrl, &new_func); - phprm_dump_func_res(&new_func); - } else { - configure_existing_function(ctrl, func); - phprm_dump_func_res(func); - } - dbg("aCCF:existing PCI 0x%x Func ResourceDump\n", ctrl->bus); - } - } - } - - return 0; -} - -static void phprm_dump_ctrl_res( struct controller *ctlr) -{ - struct controller *ctrl = ctlr; - - if (ctrl->bus_head) { - dbg(": BUS Resources:\n"); - print_pci_resource (ctrl->bus_head); - } - if (ctrl->io_head) { - dbg(": IO Resources:\n"); - print_pci_resource (ctrl->io_head); - } - if (ctrl->mem_head) { - dbg(": MEM Resources:\n"); - print_pci_resource (ctrl->mem_head); - } - if (ctrl->p_mem_head) { - dbg(": PMEM Resources:\n"); - print_pci_resource (ctrl->p_mem_head); - } -} - -/* - * phprm_find_available_resources - * - * Finds available memory, IO, and IRQ resources for programming - * devices which may be added to the system - * this function is for hot plug ADD! - * - * returns 0 if success - */ -int shpchprm_find_available_resources(struct controller *ctrl) -{ - struct pci_func func; - u32 rc; - - memset(&func, 0, sizeof(struct pci_func)); - - func.bus = ctrl->bus; - func.device = ctrl->device; - func.function = ctrl->function; - func.is_a_board = 1; - - /* Get resources for this PCI bridge */ - rc = shpchp_save_used_resources (ctrl, &func, !DISABLE_CARD); - dbg("%s: shpchp_save_used_resources rc = %d\n", __FUNCTION__, rc); - - if (func.mem_head) - func.mem_head->next = ctrl->mem_head; - ctrl->mem_head = func.mem_head; - - if (func.p_mem_head) - func.p_mem_head->next = ctrl->p_mem_head; - ctrl->p_mem_head = func.p_mem_head; - - if (func.io_head) - func.io_head->next = ctrl->io_head; - ctrl->io_head = func.io_head; - - if(func.bus_head) - func.bus_head->next = ctrl->bus_head; - ctrl->bus_head = func.bus_head; - if (ctrl->bus_head) - phprm_delete_resource(&ctrl->bus_head, ctrl->pci_dev->subordinate->number, 1); - - dbg("%s:pre-Bind PCI 0x%x Ctrl Resource Dump\n", __FUNCTION__, ctrl->bus); - phprm_dump_ctrl_res(ctrl); - bind_pci_resources_to_slots (ctrl); - - dbg("%s:post-Bind PCI 0x%x Ctrl Resource Dump\n", __FUNCTION__, ctrl->bus); - phprm_dump_ctrl_res(ctrl); - - - /* If all of the following fail, we don't have any resources for hot plug add */ - rc = 1; - rc &= shpchp_resource_sort_and_combine(&(ctrl->mem_head)); - rc &= shpchp_resource_sort_and_combine(&(ctrl->p_mem_head)); - rc &= shpchp_resource_sort_and_combine(&(ctrl->io_head)); - rc &= shpchp_resource_sort_and_combine(&(ctrl->bus_head)); - - return (rc); -} - -int shpchprm_set_hpp( - struct controller *ctrl, - struct pci_func *func, - u8 card_type) +void get_hp_params_from_firmware(struct pci_dev *dev, + struct hotplug_params *hpp) { - u32 rc; - u8 temp_byte; - struct pci_bus lpci_bus, *pci_bus; - unsigned int devfn; - memcpy(&lpci_bus, ctrl->pci_bus, sizeof(lpci_bus)); - pci_bus = &lpci_bus; - pci_bus->number = func->bus; - devfn = PCI_DEVFN(func->device, func->function); - - temp_byte = 0x40; /* hard coded value for LT */ - if (card_type == PCI_HEADER_TYPE_BRIDGE) { - /* set subordinate Latency Timer */ - rc = pci_bus_write_config_byte(pci_bus, devfn, PCI_SEC_LATENCY_TIMER, temp_byte); - - if (rc) { - dbg("%s: set secondary LT error. b:d:f(%02x:%02x:%02x)\n", __FUNCTION__, func->bus, - func->device, func->function); - return rc; - } - } - - /* set base Latency Timer */ - rc = pci_bus_write_config_byte(pci_bus, devfn, PCI_LATENCY_TIMER, temp_byte); - - if (rc) { - dbg("%s: set LT error. b:d:f(%02x:%02x:%02x)\n", __FUNCTION__, func->bus, func->device, func->function); - return rc; - } - - /* set Cache Line size */ - temp_byte = 0x08; /* hard coded value for CLS */ - - rc = pci_bus_write_config_byte(pci_bus, devfn, PCI_CACHE_LINE_SIZE, temp_byte); - - if (rc) { - dbg("%s: set CLS error. b:d:f(%02x:%02x:%02x)\n", __FUNCTION__, func->bus, func->device, func->function); - } - - /* set enable_perr */ - /* set enable_serr */ - - return rc; -} - -void shpchprm_enable_card( - struct controller *ctrl, - struct pci_func *func, - u8 card_type) -{ - u16 command, bcommand; - struct pci_bus lpci_bus, *pci_bus; - unsigned int devfn; - int rc; - - memcpy(&lpci_bus, ctrl->pci_bus, sizeof(lpci_bus)); - pci_bus = &lpci_bus; - pci_bus->number = func->bus; - devfn = PCI_DEVFN(func->device, func->function); - - rc = pci_bus_read_config_word(pci_bus, devfn, PCI_COMMAND, &command); - - command |= PCI_COMMAND_PARITY | PCI_COMMAND_SERR - | PCI_COMMAND_MASTER | PCI_COMMAND_INVALIDATE - | PCI_COMMAND_IO | PCI_COMMAND_MEMORY; - - rc = pci_bus_write_config_word(pci_bus, devfn, PCI_COMMAND, command); - - if (card_type == PCI_HEADER_TYPE_BRIDGE) { - - rc = pci_bus_read_config_word(pci_bus, devfn, PCI_BRIDGE_CONTROL, &bcommand); - - bcommand |= PCI_BRIDGE_CTL_PARITY | PCI_BRIDGE_CTL_SERR - | PCI_BRIDGE_CTL_NO_ISA; - - rc = pci_bus_write_config_word(pci_bus, devfn, PCI_BRIDGE_CONTROL, bcommand); - } -} - -static int legacy_shpchprm_init_pci(void) -{ - return 0; + return; } -int shpchprm_init(enum php_ctlr_type ctrl_type) +void get_hp_hw_control_from_firmware(struct pci_dev *dev) { - int retval; - - switch (ctrl_type) { - case PCI: - retval = legacy_shpchprm_init_pci(); - break; - default: - retval = -ENODEV; - break; - } - - return retval; + return; } diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c index a83c1f573..48723d6fa 100644 --- a/drivers/pci/msi.c +++ b/drivers/pci/msi.c @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include @@ -22,6 +23,8 @@ #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; @@ -34,26 +37,18 @@ 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, sizeof(struct msi_desc)); + memset(p, 0, NR_IRQS * sizeof(struct msi_desc)); } static int msi_cache_init(void) { msi_cachep = kmem_cache_create("msi_cache", - sizeof(struct msi_desc), + NR_IRQS * sizeof(struct msi_desc), 0, SLAB_HWCACHE_ALIGN, msi_cache_ctor, NULL); if (!msi_cachep) return -ENOMEM; @@ -97,7 +92,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; - u32 address_hi, address_lo; + struct msg_address address; unsigned int irq = vector; unsigned int dest_cpu = first_cpu(cpu_mask); @@ -108,41 +103,33 @@ static void set_msi_affinity(unsigned int vector, cpumask_t cpu_mask) switch (entry->msi_attrib.type) { case PCI_CAP_ID_MSI: { - int pos = pci_find_capability(entry->dev, PCI_CAP_ID_MSI); + int pos; - if (!pos) + if (!(pos = pci_find_capability(entry->dev, PCI_CAP_ID_MSI))) 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); - - msi_ops->target(vector, dest_cpu, &address_hi, &address_lo); - - pci_write_config_dword(entry->dev, msi_upper_address_reg(pos), - address_hi); + &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); pci_write_config_dword(entry->dev, msi_lower_address_reg(pos), - address_lo); + address.lo_address.value); set_native_irq_info(irq, cpu_mask); break; } case PCI_CAP_ID_MSIX: { - 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); + 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); set_native_irq_info(irq, cpu_mask); break; } @@ -264,6 +251,30 @@ 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) { @@ -336,9 +347,9 @@ static int assign_msi_vector(void) static int get_new_vector(void) { - int vector = assign_msi_vector(); + int vector; - if (vector > 0) + if ((vector = assign_msi_vector()) > 0) set_intr_gate(vector, interrupt[vector]); return vector; @@ -358,29 +369,12 @@ 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) { + if ((status = msi_cache_init()) < 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"); @@ -428,12 +422,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].chip = &msix_irq_type; + irq_desc[pos].handler = &msix_irq_type; else { if (!mask) - irq_desc[pos].chip = &msi_irq_wo_maskbit_type; + irq_desc[pos].handler = &msi_irq_wo_maskbit_type; else - irq_desc[pos].chip = &msi_irq_w_maskbit_type; + irq_desc[pos].handler = &msi_irq_w_maskbit_type; } spin_unlock_irqrestore(&irq_desc[pos].lock, flags); } @@ -447,11 +441,9 @@ 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 */ @@ -468,11 +460,9 @@ 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 */ @@ -513,229 +503,6 @@ void pci_scan_msi_device(struct pci_dev *dev) nr_reserved_vectors++; } -#ifdef CONFIG_PM -int pci_save_msi_state(struct pci_dev *dev) -{ - int pos, i = 0; - u16 control; - struct pci_cap_saved_state *save_state; - u32 *cap; - - pos = pci_find_capability(dev, PCI_CAP_ID_MSI); - if (pos <= 0 || dev->no_msi) - return 0; - - pci_read_config_word(dev, msi_control_reg(pos), &control); - if (!(control & PCI_MSI_FLAGS_ENABLE)) - return 0; - - save_state = kzalloc(sizeof(struct pci_cap_saved_state) + sizeof(u32) * 5, - GFP_KERNEL); - if (!save_state) { - printk(KERN_ERR "Out of memory in pci_save_msi_state\n"); - return -ENOMEM; - } - cap = &save_state->data[0]; - - pci_read_config_dword(dev, pos, &cap[i++]); - control = cap[0] >> 16; - pci_read_config_dword(dev, pos + PCI_MSI_ADDRESS_LO, &cap[i++]); - if (control & PCI_MSI_FLAGS_64BIT) { - pci_read_config_dword(dev, pos + PCI_MSI_ADDRESS_HI, &cap[i++]); - pci_read_config_dword(dev, pos + PCI_MSI_DATA_64, &cap[i++]); - } else - 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++]); - save_state->cap_nr = PCI_CAP_ID_MSI; - pci_add_saved_cap(dev, save_state); - return 0; -} - -void pci_restore_msi_state(struct pci_dev *dev) -{ - int i = 0, pos; - u16 control; - struct pci_cap_saved_state *save_state; - u32 *cap; - - save_state = pci_find_saved_cap(dev, PCI_CAP_ID_MSI); - pos = pci_find_capability(dev, PCI_CAP_ID_MSI); - if (!save_state || pos <= 0) - return; - cap = &save_state->data[0]; - - control = cap[i++] >> 16; - pci_write_config_dword(dev, pos + PCI_MSI_ADDRESS_LO, cap[i++]); - if (control & PCI_MSI_FLAGS_64BIT) { - pci_write_config_dword(dev, pos + PCI_MSI_ADDRESS_HI, cap[i++]); - pci_write_config_dword(dev, pos + PCI_MSI_DATA_64, cap[i++]); - } else - pci_write_config_dword(dev, pos + PCI_MSI_DATA_32, cap[i++]); - if (control & PCI_MSI_FLAGS_MASKBIT) - pci_write_config_dword(dev, pos + PCI_MSI_MASK_BIT, cap[i++]); - pci_write_config_word(dev, pos + PCI_MSI_FLAGS, control); - enable_msi_mode(dev, pos, PCI_CAP_ID_MSI); - pci_remove_saved_cap(save_state); - kfree(save_state); -} - -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; - - pos = pci_find_capability(dev, PCI_CAP_ID_MSIX); - 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; - save_state = kzalloc(sizeof(struct pci_cap_saved_state) + sizeof(u16), - GFP_KERNEL); - if (!save_state) { - printk(KERN_ERR "Out of memory in pci_save_msix_state\n"); - return -ENOMEM; - } - *((u16 *)&save_state->data[0]) = control; - - /* 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; -} - -void pci_restore_msix_state(struct pci_dev *dev) -{ - u16 save; - int pos; - int vector, head, tail = 0; - void __iomem *base; - int j; - struct msi_desc *entry; - int temp; - struct pci_cap_saved_state *save_state; - - save_state = pci_find_saved_cap(dev, PCI_CAP_ID_MSIX); - if (!save_state) - return; - save = *((u16 *)&save_state->data[0]); - pci_remove_saved_cap(save_state); - kfree(save_state); - - pos = pci_find_capability(dev, PCI_CAP_ID_MSIX); - if (pos <= 0) - return; - - /* route the table */ - temp = dev->irq; - if (msi_lookup_vector(dev, PCI_CAP_ID_MSIX)) - return; - vector = head = dev->irq; - while (head != tail) { - entry = msi_desc[vector]; - base = entry->mask_base; - j = entry->msi_attrib.entry_nr; - - writel(entry->address_lo_save, - base + j * PCI_MSIX_ENTRY_SIZE + - PCI_MSIX_ENTRY_LOWER_ADDR_OFFSET); - writel(entry->address_hi_save, - base + j * PCI_MSIX_ENTRY_SIZE + - PCI_MSIX_ENTRY_UPPER_ADDR_OFFSET); - writel(entry->data_save, - base + j * PCI_MSIX_ENTRY_SIZE + - PCI_MSIX_ENTRY_DATA_OFFSET); - - tail = msi_desc[vector]->link.tail; - vector = tail; - } - dev->irq = temp; - - pci_write_config_word(dev, msi_control_reg(pos), save); - enable_msi_mode(dev, pos, PCI_CAP_ID_MSIX); -} -#endif - -static int msi_register_init(struct pci_dev *dev, struct msi_desc *entry) -{ - 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 */ - 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); - pci_write_config_word(dev, - msi_data_reg(pos, 1), data); - } else - pci_write_config_word(dev, - msi_data_reg(pos, 0), data); - if (entry->msi_attrib.maskbit) { - unsigned int maskbits, temp; - /* All MSIs are unmasked by default, Mask them all */ - pci_read_config_dword(dev, - msi_mask_bits_reg(pos, is_64bit_address(control)), - &maskbits); - temp = (1 << multi_msi_capable(control)); - temp = ((temp - 1) & ~temp); - maskbits |= temp; - pci_write_config_dword(dev, - msi_mask_bits_reg(pos, is_64bit_address(control)), - maskbits); - } - - return 0; -} - /** * msi_capability_init - configure device's MSI capability structure * @dev: pointer to the pci_dev data structure of MSI device function @@ -747,20 +514,19 @@ static int 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; + struct msg_address address; + struct msg_data data; int pos, vector; u16 control; pos = pci_find_capability(dev, PCI_CAP_ID_MSI); pci_read_config_word(dev, msi_control_reg(pos), &control); /* MSI Entry Initialization */ - entry = alloc_msi_entry(); - if (!entry) + if (!(entry = alloc_msi_entry())) return -ENOMEM; - vector = get_msi_vector(dev); - if (vector < 0) { + if ((vector = get_msi_vector(dev)) < 0) { kmem_cache_free(msi_cachep, entry); return -EBUSY; } @@ -780,13 +546,33 @@ 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 */ - status = msi_register_init(dev, entry); - if (status != 0) { - dev->irq = entry->msi_attrib.default_vector; - kmem_cache_free(msi_cachep, entry); - return status; + 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); + if (is_64bit_address(control)) { + pci_write_config_dword(dev, + msi_upper_address_reg(pos), address.hi_address); + pci_write_config_word(dev, + msi_data_reg(pos, 1), *((u32*)&data)); + } else + pci_write_config_word(dev, + msi_data_reg(pos, 0), *((u32*)&data)); + if (entry->msi_attrib.maskbit) { + unsigned int maskbits, temp; + /* All MSIs are unmasked by default, Mask them all */ + pci_read_config_dword(dev, + msi_mask_bits_reg(pos, is_64bit_address(control)), + &maskbits); + temp = (1 << multi_msi_capable(control)); + temp = ((temp - 1) & ~temp); + maskbits |= temp; + pci_write_config_dword(dev, + msi_mask_bits_reg(pos, is_64bit_address(control)), + maskbits); } - attach_msi_entry(entry, vector); /* Set MSI enabled bits */ enable_msi_mode(dev, pos, PCI_CAP_ID_MSI); @@ -808,13 +594,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; - u32 address_hi; - u32 address_lo; - u32 data; - int status; + struct msg_address address; + struct msg_data data; int vector, pos, i, j, nr_entries, temp = 0; - unsigned long phys_addr; - u32 table_offset; + u32 phys_addr, table_offset; u16 control; u8 bir; void __iomem *base; @@ -823,11 +606,11 @@ static int msix_capability_init(struct pci_dev *dev, /* Request & Map MSI-X table region */ 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); + 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; + phys_addr = pci_resource_start (dev, bir); + phys_addr += (u32)(table_offset & ~PCI_MSIX_FLAGS_BIRMASK); base = ioremap_nocache(phys_addr, nr_entries * PCI_MSIX_ENTRY_SIZE); if (base == NULL) return -ENOMEM; @@ -837,11 +620,8 @@ static int msix_capability_init(struct pci_dev *dev, entry = alloc_msi_entry(); if (!entry) break; - vector = get_msi_vector(dev); - if (vector < 0) { - kmem_cache_free(msi_cachep, entry); + if ((vector = get_msi_vector(dev)) < 0) break; - } j = entries[i].entry; entries[i].vector = vector; @@ -867,20 +647,18 @@ 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 */ - status = msi_ops->setup(dev, vector, - &address_hi, - &address_lo, - &data); - if (status < 0) - break; - - writel(address_lo, + 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, base + j * PCI_MSIX_ENTRY_SIZE + PCI_MSIX_ENTRY_LOWER_ADDR_OFFSET); - writel(address_hi, + writel(address.hi_address, base + j * PCI_MSIX_ENTRY_SIZE + PCI_MSIX_ENTRY_UPPER_ADDR_OFFSET); - writel(data, + writel(*(u32*)&data, base + j * PCI_MSIX_ENTRY_SIZE + PCI_MSIX_ENTRY_DATA_OFFSET); attach_msi_entry(entry, vector); @@ -912,7 +690,6 @@ 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; @@ -922,44 +699,37 @@ int pci_enable_msi(struct pci_dev* dev) if (dev->no_msi) return status; - for (bus = dev->bus; bus; bus = bus->parent) - if (bus->bus_flags & PCI_BUS_FLAGS_NO_MSI) - return -EINVAL; - temp = dev->irq; - status = msi_init(); - if (status < 0) + if ((status = msi_init()) < 0) return status; - pos = pci_find_capability(dev, PCI_CAP_ID_MSI); - if (!pos) + if (!(pos = pci_find_capability(dev, PCI_CAP_ID_MSI))) 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); - status = msi_register_init(dev, msi_desc[dev->irq]); - if (status == 0) - enable_msi_mode(dev, pos, PCI_CAP_ID_MSI); - return status; + enable_msi_mode(dev, pos, PCI_CAP_ID_MSI); + return 0; } spin_unlock_irqrestore(&msi_lock, flags); dev->irq = temp; } /* Check whether driver already requested for MSI-X vectors */ - pos = pci_find_capability(dev, PCI_CAP_ID_MSIX); - if (pos > 0 && !msi_lookup_vector(dev, PCI_CAP_ID_MSIX)) { + if ((pos = pci_find_capability(dev, PCI_CAP_ID_MSIX)) > 0 && + !msi_lookup_vector(dev, PCI_CAP_ID_MSIX)) { printk(KERN_INFO "PCI: %s: Can't enable MSI. " "Device already has MSI-X vectors assigned\n", pci_name(dev)); @@ -985,13 +755,7 @@ void pci_disable_msi(struct pci_dev* dev) u16 control; unsigned long flags; - if (!pci_msi_enable) - return; - if (!dev) - return; - - pos = pci_find_capability(dev, PCI_CAP_ID_MSI); - if (!pos) + if (!dev || !(pos = pci_find_capability(dev, PCI_CAP_ID_MSI))) return; pci_read_config_word(dev, msi_control_reg(pos), &control); @@ -1029,8 +793,6 @@ 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) { @@ -1059,8 +821,28 @@ 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) + if (head == vector) { + /* + * Detect last MSI-X vector to be released. + * Release the MSI-X memory-mapped table. + */ + int pos, nr_entries; + u32 phys_addr, 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); + phys_addr = pci_resource_start (dev, bir); + phys_addr += (u32)(table_offset & + ~PCI_MSIX_FLAGS_BIRMASK); iounmap(base); + } } return 0; @@ -1134,7 +916,6 @@ 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; @@ -1143,19 +924,10 @@ 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) + if ((status = msi_init()) < 0) return status; - pos = pci_find_capability(dev, PCI_CAP_ID_MSIX); - if (!pos) + if (!(pos = pci_find_capability(dev, PCI_CAP_ID_MSIX))) return -EINVAL; pci_read_config_word(dev, msi_control_reg(pos), &control); @@ -1234,13 +1006,7 @@ void pci_disable_msix(struct pci_dev* dev) int pos, temp; u16 control; - if (!pci_msi_enable) - return; - if (!dev) - return; - - pos = pci_find_capability(dev, PCI_CAP_ID_MSIX); - if (!pos) + if (!dev || !(pos = pci_find_capability(dev, PCI_CAP_ID_MSIX))) return; pci_read_config_word(dev, msi_control_reg(pos), &control); @@ -1300,8 +1066,8 @@ void msi_remove_pci_irq_vectors(struct pci_dev* dev) return; temp = dev->irq; /* Save IOAPIC IRQ */ - pos = pci_find_capability(dev, PCI_CAP_ID_MSI); - if (pos > 0 && !msi_lookup_vector(dev, PCI_CAP_ID_MSI)) { + if ((pos = pci_find_capability(dev, PCI_CAP_ID_MSI)) > 0 && + !msi_lookup_vector(dev, PCI_CAP_ID_MSI)) { spin_lock_irqsave(&msi_lock, flags); state = msi_desc[dev->irq]->msi_attrib.state; spin_unlock_irqrestore(&msi_lock, flags); @@ -1314,8 +1080,8 @@ void msi_remove_pci_irq_vectors(struct pci_dev* dev) msi_free_vector(dev, dev->irq, 0); dev->irq = temp; /* Restore IOAPIC IRQ */ } - pos = pci_find_capability(dev, PCI_CAP_ID_MSIX); - if (pos > 0 && !msi_lookup_vector(dev, PCI_CAP_ID_MSIX)) { + if ((pos = pci_find_capability(dev, PCI_CAP_ID_MSIX)) > 0 && + !msi_lookup_vector(dev, PCI_CAP_ID_MSIX)) { int vector, head, tail = 0, warning = 0; void __iomem *base = NULL; @@ -1334,6 +1100,19 @@ 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 */ + u32 phys_addr, 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); + phys_addr = pci_resource_start (dev, bir); + phys_addr += (u32)(table_offset & + ~PCI_MSIX_FLAGS_BIRMASK); iounmap(base); printk(KERN_WARNING "PCI: %s: msi_remove_pci_irq_vectors() " "called without free_irq() on all MSI-X vectors\n", @@ -1344,11 +1123,6 @@ void msi_remove_pci_irq_vectors(struct pci_dev* dev) } } -void pci_no_msi(void) -{ - pci_msi_enable = 0; -} - EXPORT_SYMBOL(pci_enable_msi); EXPORT_SYMBOL(pci_disable_msi); EXPORT_SYMBOL(pci_enable_msix); diff --git a/drivers/pci/msi.h b/drivers/pci/msi.h index 56951c39d..4ac52d441 100644 --- a/drivers/pci/msi.h +++ b/drivers/pci/msi.h @@ -6,68 +6,6 @@ #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 /* @@ -125,6 +63,67 @@ 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} */ @@ -133,7 +132,7 @@ struct msi_desc { __u8 reserved: 1; /* reserved */ __u8 entry_nr; /* specific enabled entry */ __u8 default_vector; /* default pre-assigned vector */ - __u8 unused; /* formerly unused destination cpu*/ + __u8 current_cpu; /* current destination cpu */ }msi_attrib; struct { @@ -143,14 +142,6 @@ 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 bb7456c1d..c2ecae5ff 100644 --- a/drivers/pci/pci-acpi.c +++ b/drivers/pci/pci-acpi.c @@ -267,7 +267,7 @@ static int acpi_pci_set_power_state(struct pci_dev *dev, pci_power_t state) /* ACPI bus type */ -static int acpi_pci_find_device(struct device *dev, acpi_handle *handle) +static int pci_acpi_find_device(struct device *dev, acpi_handle *handle) { struct pci_dev * pci_dev; acpi_integer addr; @@ -281,7 +281,7 @@ static int acpi_pci_find_device(struct device *dev, acpi_handle *handle) return 0; } -static int acpi_pci_find_root_bridge(struct device *dev, acpi_handle *handle) +static int pci_acpi_find_root_bridge(struct device *dev, acpi_handle *handle) { int num; unsigned int seg, bus; @@ -299,21 +299,21 @@ static int acpi_pci_find_root_bridge(struct device *dev, acpi_handle *handle) return 0; } -static struct acpi_bus_type acpi_pci_bus = { +static struct acpi_bus_type pci_acpi_bus = { .bus = &pci_bus_type, - .find_device = acpi_pci_find_device, - .find_bridge = acpi_pci_find_root_bridge, + .find_device = pci_acpi_find_device, + .find_bridge = pci_acpi_find_root_bridge, }; -static int __init acpi_pci_init(void) +static int __init pci_acpi_init(void) { int ret; - ret = register_acpi_bus_type(&acpi_pci_bus); + ret = register_acpi_bus_type(&pci_acpi_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); +arch_initcall(pci_acpi_init); diff --git a/drivers/pci/pci-driver.c b/drivers/pci/pci-driver.c index 474e9cd0e..0aa14c92b 100644 --- a/drivers/pci/pci-driver.c +++ b/drivers/pci/pci-driver.c @@ -53,10 +53,11 @@ store_new_id(struct device_driver *driver, const char *buf, size_t count) if (fields < 0) return -EINVAL; - dynid = kzalloc(sizeof(*dynid), GFP_KERNEL); + dynid = kmalloc(sizeof(*dynid), GFP_KERNEL); if (!dynid) return -ENOMEM; + memset(dynid, 0, sizeof(*dynid)); INIT_LIST_HEAD(&dynid->node); dynid->id.vendor = vendor; dynid->id.device = device; @@ -139,8 +140,9 @@ 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 - * @drv: the PCI driver to match against + * @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 * * Used by a driver to check whether a PCI device present in the * system is in its list of supported devices. Returns the matching @@ -270,12 +272,10 @@ static int pci_device_suspend(struct device * dev, pm_message_t state) struct pci_driver * drv = pci_dev->driver; int i = 0; - if (drv && drv->suspend) { + if (drv && drv->suspend) i = drv->suspend(pci_dev, state); - suspend_report_result(drv->suspend, i); - } else { + else pci_save_state(pci_dev); - } return i; } @@ -284,9 +284,9 @@ static int pci_device_suspend(struct device * dev, pm_message_t state) * Default resume method for devices that have no driver provided resume, * or not even a driver at all. */ -static int pci_default_resume(struct pci_dev *pci_dev) +static void pci_default_resume(struct pci_dev *pci_dev) { - int retval = 0; + int retval; /* restore the PCI config space */ pci_restore_state(pci_dev); @@ -296,21 +296,18 @@ static int pci_default_resume(struct pci_dev *pci_dev) /* if the device was busmaster before the suspend, make it busmaster again */ if (pci_dev->is_busmaster) pci_set_master(pci_dev); - - return retval; } static int pci_device_resume(struct device * dev) { - int error; struct pci_dev * pci_dev = to_pci_dev(dev); struct pci_driver * drv = pci_dev->driver; if (drv && drv->resume) - error = drv->resume(pci_dev); + drv->resume(pci_dev); else - error = pci_default_resume(pci_dev); - return error; + pci_default_resume(pci_dev); + return 0; } static void pci_device_shutdown(struct device *dev) @@ -383,6 +380,14 @@ int __pci_register_driver(struct pci_driver *drv, struct module *owner) /* initialize common driver fields */ drv->driver.name = drv->name; drv->driver.bus = &pci_bus_type; + /* FIXME, once all of the existing PCI drivers have been fixed to set + * the pci shutdown function, this test can go away. */ + if (!drv->driver.shutdown) + drv->driver.shutdown = pci_device_shutdown; + else + printk(KERN_WARNING "Warning: PCI driver %s has a struct " + "device_driver shutdown method, please update!\n", + drv->name); drv->driver.owner = owner; drv->driver.kobj.ktype = &pci_driver_kobj_type; @@ -509,7 +514,6 @@ struct bus_type pci_bus_type = { .probe = pci_device_probe, .remove = pci_device_remove, .suspend = pci_device_suspend, - .shutdown = pci_device_shutdown, .resume = pci_device_resume, .dev_attrs = pci_dev_attrs, }; diff --git a/drivers/pci/pci-sysfs.c b/drivers/pci/pci-sysfs.c index a9c7d41d2..965a59346 100644 --- a/drivers/pci/pci-sysfs.c +++ b/drivers/pci/pci-sysfs.c @@ -15,6 +15,7 @@ */ +#include #include #include #include @@ -42,29 +43,6 @@ 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) @@ -86,7 +64,7 @@ resource_show(struct device * dev, struct device_attribute *attr, char * buf) char * str = buf; int i; int max = 7; - resource_size_t start, end; + u64 start, end; if (pci_dev->subordinate) max = DEVICE_COUNT_RESOURCE; @@ -112,25 +90,6 @@ 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), @@ -142,9 +101,6 @@ 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, }; @@ -364,7 +320,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; - resource_size_t start, end; + u64 start, end; int i; for (i = 0; i < PCI_ROM_RESOURCE; i++) @@ -545,8 +501,9 @@ int pci_create_sysfs_dev_files (struct pci_dev *pdev) if (pci_resource_len(pdev, PCI_ROM_RESOURCE)) { struct bin_attribute *rom_attr; - rom_attr = kzalloc(sizeof(*rom_attr), GFP_ATOMIC); + rom_attr = kmalloc(sizeof(*rom_attr), GFP_ATOMIC); if (rom_attr) { + memset(rom_attr, 0x00, sizeof(*rom_attr)); pdev->rom_attr = rom_attr; rom_attr->size = pci_resource_len(pdev, PCI_ROM_RESOURCE); rom_attr->attr.name = "rom"; @@ -571,9 +528,6 @@ int pci_create_sysfs_dev_files (struct pci_dev *pdev) */ void pci_remove_sysfs_dev_files(struct pci_dev *pdev) { - if (!sysfs_initialized) - return; - if (pdev->cfg_size < 4096) sysfs_remove_bin_file(&pdev->dev.kobj, &pci_config_attr); else diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index 9f79dd6d5..d2d187916 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c @@ -19,7 +19,7 @@ #include /* isa_dma_bridge_buggy */ #include "pci.h" -unsigned int pci_pm_d3_delay = 10; +#if 0 /** * pci_bus_max_busnr - returns maximum PCI bus number of given bus' children @@ -34,7 +34,7 @@ pci_bus_max_busnr(struct pci_bus* bus) struct list_head *tmp; unsigned char max, n; - max = bus->subordinate; + max = bus->number; list_for_each(tmp, &bus->children) { n = pci_bus_max_busnr(pci_bus_b(tmp)); if(n > max) @@ -42,9 +42,7 @@ pci_bus_max_busnr(struct pci_bus* bus) } return max; } -EXPORT_SYMBOL_GPL(pci_bus_max_busnr); -#if 0 /** * pci_max_busnr - returns maximum PCI bus number * @@ -165,6 +163,7 @@ 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 +211,7 @@ int pci_find_ext_capability(struct pci_dev *dev, int cap) return 0; } -EXPORT_SYMBOL_GPL(pci_find_ext_capability); +#endif /* 0 */ /** * pci_find_parent_resource - return resource region of parent bus of given region @@ -307,21 +306,11 @@ pci_set_power_state(struct pci_dev *dev, pci_power_t state) * Can enter D0 from any state, but if we can only go deeper * to sleep if we're already in a low power state */ - if (state != PCI_D0 && dev->current_state > state) { - printk(KERN_ERR "%s(): %s: state=%d, current state=%d\n", - __FUNCTION__, pci_name(dev), state, dev->current_state); + if (state != PCI_D0 && dev->current_state > state) return -EINVAL; - } else if (dev->current_state == 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); @@ -372,13 +361,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(pci_pm_d3_delay); + msleep(10); 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 native method ? + * Firmware method after natice method ? */ if (platform_pci_set_power_state) platform_pci_set_power_state(dev, state); @@ -454,10 +443,6 @@ pci_save_state(struct pci_dev *dev) /* XXX: 100% dword access ok here? */ for (i = 0; i < 16; i++) pci_read_config_dword(dev, i * 4,&dev->saved_config_space[i]); - if ((i = pci_save_msi_state(dev)) != 0) - return i; - if ((i = pci_save_msix_state(dev)) != 0) - return i; return 0; } @@ -469,25 +454,9 @@ int pci_restore_state(struct pci_dev *dev) { int i; - int val; - /* - * The Base Address register should be programmed before the command - * register(s) - */ - for (i = 15; i >= 0; i--) { - pci_read_config_dword(dev, i * 4, &val); - if (val != dev->saved_config_space[i]) { - printk(KERN_DEBUG "PM: Writing back config space on " - "device %s at offset %x (was %x, writing %x)\n", - pci_name(dev), i, - val, (int)dev->saved_config_space[i]); - pci_write_config_dword(dev,i * 4, - dev->saved_config_space[i]); - } - } - pci_restore_msi_state(dev); - pci_restore_msix_state(dev); + for (i = 0; i < 16; i++) + pci_write_config_dword(dev,i * 4, dev->saved_config_space[i]); return 0; } @@ -528,11 +497,7 @@ pci_enable_device(struct pci_dev *dev) { int err; - if (dev->is_enabled) - return 0; - - err = pci_enable_device_bars(dev, (1 << PCI_NUM_RESOURCES) - 1); - if (err) + if ((err = pci_enable_device_bars(dev, (1 << PCI_NUM_RESOURCES) - 1))) return err; pci_fixup_device(pci_fixup_enable, dev); dev->is_enabled = 1; @@ -560,14 +525,7 @@ 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; @@ -681,7 +639,7 @@ void pci_release_region(struct pci_dev *pdev, int bar) * Returns 0 on success, or %EBUSY on error. A warning * message is also printed on failure. */ -int pci_request_region(struct pci_dev *pdev, int bar, const char *res_name) +int pci_request_region(struct pci_dev *pdev, int bar, char *res_name) { if (pci_resource_len(pdev, bar) == 0) return 0; @@ -700,12 +658,10 @@ 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:%llx@%llx " - "for device %s\n", + printk (KERN_WARNING "PCI: Unable to reserve %s region #%d:%lx@%lx for device %s\n", pci_resource_flags(pdev, bar) & IORESOURCE_IO ? "I/O" : "mem", bar + 1, /* PCI BAR # */ - (unsigned long long)pci_resource_len(pdev, bar), - (unsigned long long)pci_resource_start(pdev, bar), + pci_resource_len(pdev, bar), pci_resource_start(pdev, bar), pci_name(pdev)); return -EBUSY; } @@ -741,7 +697,7 @@ void pci_release_regions(struct pci_dev *pdev) * Returns 0 on success, or %EBUSY on error. A warning * message is also printed on failure. */ -int pci_request_regions(struct pci_dev *pdev, const char *res_name) +int pci_request_regions(struct pci_dev *pdev, char *res_name) { int i; @@ -944,12 +900,8 @@ static int __devinit pci_setup(char *str) if (k) *k++ = 0; if (*str && (str = pcibios_setup(str)) && *str) { - if (!strcmp(str, "nomsi")) { - pci_no_msi(); - } else { - printk(KERN_ERR "PCI: Unknown option `%s'\n", - str); - } + /* PCI layer options should be handled here */ + printk(KERN_ERR "PCI: Unknown option `%s'\n", str); } str = k; } diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h index 08d58fc78..a6dfee2f6 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, - resource_size_t size, resource_size_t align, - resource_size_t min, unsigned int type_mask, + unsigned long size, unsigned long align, + unsigned long min, unsigned int type_mask, void (*alignf)(void *, struct resource *, - resource_size_t, resource_size_t), + unsigned long, unsigned long), void *alignf_data); /* Firmware callbacks */ extern int (*platform_pci_choose_state)(struct pci_dev *dev, pm_message_t state); @@ -40,41 +40,20 @@ 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 struct rw_semaphore pci_bus_sem; +extern spinlock_t pci_bus_lock; #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); #else static inline void disable_msi_mode(struct pci_dev *dev, int pos, int type) { } -static inline void pci_no_msi(void) { } -#endif -#if defined(CONFIG_PCI_MSI) && defined(CONFIG_PM) -int pci_save_msi_state(struct pci_dev *dev); -int pci_save_msix_state(struct pci_dev *dev); -void pci_restore_msi_state(struct pci_dev *dev); -void pci_restore_msix_state(struct pci_dev *dev); -#else -static inline int pci_save_msi_state(struct pci_dev *dev) { return 0; } -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.h b/drivers/pci/pcie/portdrv.h index 1d317d22e..a63bd8f72 100644 --- a/drivers/pci/pcie/portdrv.h +++ b/drivers/pci/pcie/portdrv.h @@ -29,6 +29,7 @@ struct pcie_port_device_ext { int interrupt_mode; /* [0:INTx | 1:MSI | 2:MSI-X] */ + unsigned int saved_msi_config_space[5]; }; extern struct bus_type pcie_port_bus_type; diff --git a/drivers/pci/pcie/portdrv_core.c b/drivers/pci/pcie/portdrv_core.c index 55c662267..e4e5f1e8d 100644 --- a/drivers/pci/pcie/portdrv_core.c +++ b/drivers/pci/pcie/portdrv_core.c @@ -248,10 +248,11 @@ static struct pcie_device* alloc_pcie_device(struct pci_dev *parent, { struct pcie_device *device; - device = kzalloc(sizeof(struct pcie_device), GFP_KERNEL); + device = kmalloc(sizeof(struct pcie_device), GFP_KERNEL); if (!device) return NULL; + memset(device, 0, sizeof(struct pcie_device)); pcie_device_init(parent, device, port_type, service_type, irq,irq_mode); printk(KERN_DEBUG "Allocate Port Service[%s]\n", device->device.bus_id); return device; diff --git a/drivers/pci/pcie/portdrv_pci.c b/drivers/pci/pcie/portdrv_pci.c index 478d0d28f..02260141d 100644 --- a/drivers/pci/pcie/portdrv_pci.c +++ b/drivers/pci/pcie/portdrv_pci.c @@ -30,6 +30,82 @@ MODULE_LICENSE("GPL"); /* global data */ static const char device_name[] = "pcieport-driver"; +static void pci_save_msi_state(struct pci_dev *dev) +{ + struct pcie_port_device_ext *p_ext = pci_get_drvdata(dev); + int i = 0, pos; + u16 control; + + if ((pos = pci_find_capability(dev, PCI_CAP_ID_MSI)) <= 0) + return; + + pci_read_config_dword(dev, pos, &p_ext->saved_msi_config_space[i++]); + control = p_ext->saved_msi_config_space[0] >> 16; + pci_read_config_dword(dev, pos + PCI_MSI_ADDRESS_LO, + &p_ext->saved_msi_config_space[i++]); + if (control & PCI_MSI_FLAGS_64BIT) { + pci_read_config_dword(dev, pos + PCI_MSI_ADDRESS_HI, + &p_ext->saved_msi_config_space[i++]); + pci_read_config_dword(dev, pos + PCI_MSI_DATA_64, + &p_ext->saved_msi_config_space[i++]); + } else + pci_read_config_dword(dev, pos + PCI_MSI_DATA_32, + &p_ext->saved_msi_config_space[i++]); + if (control & PCI_MSI_FLAGS_MASKBIT) + pci_read_config_dword(dev, pos + PCI_MSI_MASK_BIT, + &p_ext->saved_msi_config_space[i++]); +} + +static void pci_restore_msi_state(struct pci_dev *dev) +{ + struct pcie_port_device_ext *p_ext = pci_get_drvdata(dev); + int i = 0, pos; + u16 control; + + if ((pos = pci_find_capability(dev, PCI_CAP_ID_MSI)) <= 0) + return; + + control = p_ext->saved_msi_config_space[i++] >> 16; + pci_write_config_word(dev, pos + PCI_MSI_FLAGS, control); + pci_write_config_dword(dev, pos + PCI_MSI_ADDRESS_LO, + p_ext->saved_msi_config_space[i++]); + if (control & PCI_MSI_FLAGS_64BIT) { + pci_write_config_dword(dev, pos + PCI_MSI_ADDRESS_HI, + p_ext->saved_msi_config_space[i++]); + pci_write_config_dword(dev, pos + PCI_MSI_DATA_64, + p_ext->saved_msi_config_space[i++]); + } else + pci_write_config_dword(dev, pos + PCI_MSI_DATA_32, + p_ext->saved_msi_config_space[i++]); + if (control & PCI_MSI_FLAGS_MASKBIT) + pci_write_config_dword(dev, pos + PCI_MSI_MASK_BIT, + p_ext->saved_msi_config_space[i++]); +} + +static void pcie_portdrv_save_config(struct pci_dev *dev) +{ + struct pcie_port_device_ext *p_ext = pci_get_drvdata(dev); + + pci_save_state(dev); + if (p_ext->interrupt_mode == PCIE_PORT_MSI_MODE) + pci_save_msi_state(dev); +} + +static int pcie_portdrv_restore_config(struct pci_dev *dev) +{ + struct pcie_port_device_ext *p_ext = pci_get_drvdata(dev); + int retval; + + pci_restore_state(dev); + if (p_ext->interrupt_mode == PCIE_PORT_MSI_MODE) + pci_restore_msi_state(dev); + retval = pci_enable_device(dev); + if (retval) + return retval; + pci_set_master(dev); + return 0; +} + /* * pcie_portdrv_probe - Probe PCI-Express port devices * @dev: PCI-Express port device being probed @@ -56,10 +132,8 @@ 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)) { - pci_disable_device(dev); + if (pcie_port_device_register(dev)) return -ENOMEM; - } return 0; } @@ -71,29 +145,11 @@ static void pcie_portdrv_remove (struct pci_dev *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) { int ret = pcie_port_device_suspend(dev, state); - if (!ret) - ret = pcie_portdrv_save_config(dev); + pcie_portdrv_save_config(dev); return ret; } diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c index c5a58d1c6..adfad4fd6 100644 --- a/drivers/pci/probe.c +++ b/drivers/pci/probe.c @@ -33,9 +33,10 @@ LIST_HEAD(pci_devices); */ static void pci_create_legacy_files(struct pci_bus *b) { - b->legacy_io = kzalloc(sizeof(struct bin_attribute) * 2, + b->legacy_io = kmalloc(sizeof(struct bin_attribute) * 2, GFP_ATOMIC); if (b->legacy_io) { + memset(b->legacy_io, 0, sizeof(struct bin_attribute) * 2); b->legacy_io->attr.name = "legacy_io"; b->legacy_io->size = 0xffff; b->legacy_io->attr.mode = S_IRUSR | S_IWUSR; @@ -180,31 +181,25 @@ 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)) { - 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); + pci_read_config_dword(dev, reg+4, &l); next++; #if BITS_PER_LONG == 64 - res->start |= ((unsigned long) lhi) << 32; + res->start |= ((unsigned long) l) << 32; res->end = res->start + sz; - if (szhi) { + 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) { /* This BAR needs > 4GB? Wow. */ - res->end |= (unsigned long)szhi<<32; + res->end |= (unsigned long)sz<<32; } #else - if (szhi) { - printk(KERN_ERR "PCI: Unable to handle 64-bit BAR for device %s\n", pci_name(dev)); + if (l) { + printk(KERN_ERR "PCI: Unable to handle 64-bit address for device %s\n", pci_name(dev)); res->start = 0; res->flags = 0; - } 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; + continue; } #endif } @@ -325,8 +320,9 @@ static struct pci_bus * __devinit pci_alloc_bus(void) { struct pci_bus *b; - b = kzalloc(sizeof(*b), GFP_KERNEL); + b = kmalloc(sizeof(*b), GFP_KERNEL); if (b) { + memset(b, 0, sizeof(*b)); INIT_LIST_HEAD(&b->node); INIT_LIST_HEAD(&b->children); INIT_LIST_HEAD(&b->devices); @@ -351,7 +347,6 @@ pci_alloc_child_bus(struct pci_bus *parent, struct pci_dev *bridge, int busnr) child->parent = parent; child->ops = parent->ops; child->sysdata = parent->sysdata; - child->bus_flags = parent->bus_flags; child->bridge = get_device(&bridge->dev); child->class_dev.class = &pcibus_class; @@ -383,9 +378,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) { - down_write(&pci_bus_sem); + spin_lock(&pci_bus_lock); list_add_tail(&child->node, &parent->children); - up_write(&pci_bus_sem); + spin_unlock(&pci_bus_lock); } return child; } @@ -461,7 +456,7 @@ int __devinit pci_scan_bridge(struct pci_bus *bus, struct pci_dev * dev, int max * pass and just note the configuration. */ if (pass) - goto out; + return max; busnr = (buses >> 8) & 0xFF; /* @@ -471,12 +466,12 @@ int __devinit pci_scan_bridge(struct pci_bus *bus, struct pci_dev * dev, int max if (pci_find_bus(pci_domain_nr(bus), busnr)) { printk(KERN_INFO "PCI: Bus %04x:%02x already known\n", pci_domain_nr(bus), busnr); - goto out; + return max; } child = pci_add_new_bus(bus, dev, busnr); if (!child) - goto out; + return max; child->primary = buses & 0xFF; child->subordinate = (buses >> 16) & 0xFF; child->bridge_ctl = bctl; @@ -501,7 +496,7 @@ int __devinit pci_scan_bridge(struct pci_bus *bus, struct pci_dev * dev, int max bus ranges. */ pci_write_config_dword(dev, PCI_PRIMARY_BUS, buses & ~0xffffff); - goto out; + return max; } /* Clear errors */ @@ -510,7 +505,7 @@ int __devinit pci_scan_bridge(struct pci_bus *bus, struct pci_dev * dev, int max /* Prevent assigning a bus number that already exists. * This can happen when a bridge is hot-plugged */ if (pci_find_bus(pci_domain_nr(bus), max+1)) - goto out; + return max; child = pci_add_new_bus(bus, dev, ++max); buses = (buses & 0xff000000) | ((unsigned int)(child->primary) << 0) @@ -542,11 +537,6 @@ int __devinit pci_scan_bridge(struct pci_bus *bus, struct pci_dev * dev, int max pci_fixup_parent_subordinate_busnr(child, max); /* Now we can scan all subordinate buses... */ max = pci_scan_child_bus(child); - /* - * now fix it up again since we have found - * the real value of max. - */ - pci_fixup_parent_subordinate_busnr(child, max); } else { /* * For CardBus bridges, we leave 4 bus numbers @@ -586,6 +576,8 @@ int __devinit pci_scan_bridge(struct pci_bus *bus, struct pci_dev * dev, int max pci_write_config_byte(dev, PCI_SUBORDINATE_BUS, max); } + pci_write_config_word(dev, PCI_BRIDGE_CONTROL, bctl); + sprintf(child->name, (is_cardbus ? "PCI CardBus #%02x" : "PCI Bus #%02x"), child->number); while (bus->parent) { @@ -593,22 +585,17 @@ int __devinit pci_scan_bridge(struct pci_bus *bus, struct pci_dev * dev, int max (child->number > bus->subordinate) || (child->number < bus->number) || (child->subordinate < bus->number)) { - printk(KERN_WARNING "PCI: Bus #%02x (-#%02x) is " + printk(KERN_WARNING "PCI: Bus #%02x (-#%02x) may be " "hidden behind%s bridge #%02x (-#%02x)%s\n", child->number, child->subordinate, bus->self->transparent ? " transparent" : " ", bus->number, bus->subordinate, pcibios_assign_all_busses() ? " " : " (try 'pci=assign-busses')"); - printk(KERN_WARNING "Please report the result to " - "linux-kernel to fix this permanently\n"); } bus = bus->parent; } -out: - pci_write_config_word(dev, PCI_BRIDGE_CONTROL, bctl); - return max; } @@ -801,10 +788,11 @@ pci_scan_device(struct pci_bus *bus, int devfn) if (pci_bus_read_config_byte(bus, devfn, PCI_HEADER_TYPE, &hdr_type)) return NULL; - dev = kzalloc(sizeof(struct pci_dev), GFP_KERNEL); + dev = kmalloc(sizeof(struct pci_dev), GFP_KERNEL); if (!dev) return NULL; + memset(dev, 0, sizeof(struct pci_dev)); dev->bus = bus; dev->sysdata = bus->sysdata; dev->dev.parent = bus->bridge; @@ -815,7 +803,6 @@ 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. */ @@ -845,9 +832,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); - down_write(&pci_bus_sem); + spin_lock(&pci_bus_lock); list_add_tail(&dev->bus_list, &bus->devices); - up_write(&pci_bus_sem); + spin_unlock(&pci_bus_lock); } struct pci_dev * __devinit @@ -982,10 +969,9 @@ 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; } - - down_write(&pci_bus_sem); + spin_lock(&pci_bus_lock); list_add_tail(&b->node, &pci_root_buses); - up_write(&pci_bus_sem); + spin_unlock(&pci_bus_lock); memset(dev, 0, sizeof(*dev)); dev->parent = parent; @@ -1025,9 +1011,9 @@ class_dev_create_file_err: class_dev_reg_err: device_unregister(dev); dev_reg_err: - down_write(&pci_bus_sem); + spin_lock(&pci_bus_lock); list_del(&b->node); - up_write(&pci_bus_sem); + spin_unlock(&pci_bus_lock); err_out: kfree(dev); kfree(b); diff --git a/drivers/pci/proc.c b/drivers/pci/proc.c index 99cf33379..92a885760 100644 --- a/drivers/pci/proc.c +++ b/drivers/pci/proc.c @@ -302,6 +302,12 @@ 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) { @@ -350,18 +356,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++) { - resource_size_t start, end; + u64 start, end; pci_resource_to_user(dev, i, &dev->resource[i], &start, &end); - seq_printf(m, "\t%16llx", - (unsigned long long)(start | - (dev->resource[i].flags & PCI_REGION_FLAG_MASK))); + seq_printf(m, LONG_FORMAT, + ((unsigned long)start) | + (dev->resource[i].flags & PCI_REGION_FLAG_MASK)); } for (i=0; i<7; i++) { - resource_size_t start, end; + u64 start, end; pci_resource_to_user(dev, i, &dev->resource[i], &start, &end); - seq_printf(m, "\t%16llx", + seq_printf(m, LONG_FORMAT, dev->resource[i].start < dev->resource[i].end ? - (unsigned long long)(end - start) + 1 : 0); + (unsigned long)(end - start) + 1 : 0); } seq_putc(m, '\t'); if (drv) @@ -452,6 +458,131 @@ int pci_proc_detach_bus(struct pci_bus* bus) return 0; } +#ifdef CONFIG_PCI_LEGACY_PROC + +/* + * Backward compatible /proc/pci interface. + */ + +/* + * Convert some of the configuration space registers of the device at + * address (bus,devfn) into a string (possibly several lines each). + * The configuration string is stored starting at buf[len]. If the + * string would exceed the size of the buffer (SIZE), 0 is returned. + */ +static int show_dev_config(struct seq_file *m, void *v) +{ + struct pci_dev *dev = v; + struct pci_dev *first_dev; + struct pci_driver *drv; + u32 class_rev; + unsigned char latency, min_gnt, max_lat; + int reg; + + first_dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, NULL); + if (dev == first_dev) + seq_puts(m, "PCI devices found:\n"); + pci_dev_put(first_dev); + + drv = pci_dev_driver(dev); + + pci_user_read_config_dword(dev, PCI_CLASS_REVISION, &class_rev); + pci_user_read_config_byte (dev, PCI_LATENCY_TIMER, &latency); + pci_user_read_config_byte (dev, PCI_MIN_GNT, &min_gnt); + pci_user_read_config_byte (dev, PCI_MAX_LAT, &max_lat); + seq_printf(m, " Bus %2d, device %3d, function %2d:\n", + dev->bus->number, PCI_SLOT(dev->devfn), PCI_FUNC(dev->devfn)); + seq_printf(m, " Class %04x", class_rev >> 16); + seq_printf(m, ": PCI device %04x:%04x", dev->vendor, dev->device); + seq_printf(m, " (rev %d).\n", class_rev & 0xff); + + if (dev->irq) + seq_printf(m, " IRQ %d.\n", dev->irq); + + if (latency || min_gnt || max_lat) { + seq_printf(m, " Master Capable. "); + if (latency) + seq_printf(m, "Latency=%d. ", latency); + else + seq_puts(m, "No bursts. "); + if (min_gnt) + seq_printf(m, "Min Gnt=%d.", min_gnt); + if (max_lat) + seq_printf(m, "Max Lat=%d.", max_lat); + seq_putc(m, '\n'); + } + + for (reg = 0; reg < 6; reg++) { + struct resource *res = dev->resource + reg; + unsigned long base, end, flags; + + base = res->start; + end = res->end; + flags = res->flags; + if (!end) + continue; + + if (flags & PCI_BASE_ADDRESS_SPACE_IO) { + seq_printf(m, " I/O at 0x%lx [0x%lx].\n", + base, end); + } else { + const char *pref, *type = "unknown"; + + if (flags & PCI_BASE_ADDRESS_MEM_PREFETCH) + pref = "P"; + else + pref = "Non-p"; + switch (flags & PCI_BASE_ADDRESS_MEM_TYPE_MASK) { + case PCI_BASE_ADDRESS_MEM_TYPE_32: + type = "32 bit"; break; + case PCI_BASE_ADDRESS_MEM_TYPE_1M: + type = "20 bit"; break; + case PCI_BASE_ADDRESS_MEM_TYPE_64: + type = "64 bit"; break; + } + seq_printf(m, " %srefetchable %s memory at " + "0x%lx [0x%lx].\n", pref, type, + base, + end); + } + } + return 0; +} + +static struct seq_operations proc_pci_op = { + .start = pci_seq_start, + .next = pci_seq_next, + .stop = pci_seq_stop, + .show = show_dev_config +}; + +static int proc_pci_open(struct inode *inode, struct file *file) +{ + return seq_open(file, &proc_pci_op); +} +static struct file_operations proc_pci_operations = { + .open = proc_pci_open, + .read = seq_read, + .llseek = seq_lseek, + .release = seq_release, +}; + +static void legacy_proc_init(void) +{ + struct proc_dir_entry * entry = create_proc_entry("pci", 0, NULL); + if (entry) + entry->proc_fops = &proc_pci_operations; +} + +#else + +static void legacy_proc_init(void) +{ + +} + +#endif /* CONFIG_PCI_LEGACY_PROC */ + static int proc_bus_pci_dev_open(struct inode *inode, struct file *file) { return seq_open(file, &proc_bus_pci_devices_op); @@ -475,6 +606,7 @@ static int __init pci_proc_init(void) while ((dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) { pci_proc_attach_device(dev); } + legacy_proc_init(); return 0; } diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c index 60b31acb7..2a66e3952 100644 --- a/drivers/pci/quirks.c +++ b/drivers/pci/quirks.c @@ -15,6 +15,7 @@ * use the PowerTweak utility (see http://powertweak.sourceforge.net). */ +#include #include #include #include @@ -23,17 +24,6 @@ #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) @@ -440,6 +430,12 @@ static void __devinit quirk_ich6_lpc_acpi(struct pci_dev *dev) } DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH6_0, quirk_ich6_lpc_acpi ); DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH6_1, quirk_ich6_lpc_acpi ); +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH7_0, quirk_ich6_lpc_acpi ); +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH7_1, quirk_ich6_lpc_acpi ); +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH7_31, quirk_ich6_lpc_acpi ); +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH8_0, quirk_ich6_lpc_acpi ); +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH8_2, quirk_ich6_lpc_acpi ); +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH8_3, quirk_ich6_lpc_acpi ); /* * VIA ACPI: One IO region pointed to by longword at @@ -587,11 +583,8 @@ static void __init quirk_amd_8131_ioapic(struct pci_dev *dev) { unsigned char revid, tmp; - if (dev->subordinate) { - printk(KERN_WARNING "PCI: MSI quirk detected. " - "PCI_BUS_FLAGS_NO_MSI set for subordinate bus.\n"); - dev->subordinate->bus_flags |= PCI_BUS_FLAGS_NO_MSI; - } + pci_msi_quirk = 1; + printk(KERN_WARNING "PCI: MSI quirk detected. pci_msi_quirk set.\n"); if (nr_ioapics == 0) return; @@ -663,14 +656,7 @@ static void quirk_via_irq(struct pci_dev *dev) pci_write_config_byte(dev, PCI_INTERRUPT_LINE, new_irq); } } -DECLARE_PCI_FIXUP_ENABLE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C586_0, quirk_via_irq); -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); +DECLARE_PCI_FIXUP_ENABLE(PCI_VENDOR_ID_VIA, PCI_ANY_ID, quirk_via_irq); /* * VIA VT82C598 has its device ID settable and many BIOSes @@ -886,38 +872,6 @@ static void __init quirk_eisa_bridge(struct pci_dev *dev) } DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82375, quirk_eisa_bridge ); -/* - * On the MSI-K8T-Neo2Fir Board, the internal Soundcard is disabled - * 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; - - 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-Neo2Fir, soundcard still off\n"); - else - 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); - #ifndef CONFIG_ACPI_SLEEP /* * On ASUS P4B boards, the SMBus PCI Device within the ICH2/4 southbridge @@ -985,7 +939,6 @@ static void __init asus_hides_smbus_hostbridge(struct pci_dev *dev) if (dev->device == PCI_DEVICE_ID_INTEL_82915GM_HB) { switch (dev->subsystem_device) { case 0x1882: /* M6V notebook */ - case 0x1977: /* A6VA notebook */ asus_hides_smbus = 1; } } @@ -1002,12 +955,6 @@ static void __init asus_hides_smbus_hostbridge(struct pci_dev *dev) case 0x12bd: /* HP D530 */ asus_hides_smbus = 1; } - if (dev->device == PCI_DEVICE_ID_INTEL_82915GM_HB) { - switch (dev->subsystem_device) { - case 0x099c: /* HP Compaq nx6110 */ - asus_hides_smbus = 1; - } - } } else if (unlikely(dev->subsystem_vendor == PCI_VENDOR_ID_TOSHIBA)) { if (dev->device == PCI_DEVICE_ID_INTEL_82855GM_HB) switch(dev->subsystem_device) { @@ -1146,92 +1093,12 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_651, quirk_sis_96x_ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_735, quirk_sis_96x_compatible ); DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_503, quirk_sis_503 ); -/* - * On ASUS A8V and A8V Deluxe boards, the onboard AC97 audio controller - * and MC97 modem controller are disabled when a second PCI soundcard is - * present. This patch, tweaking the VT8237 ISA bridge, enables them. - * -- bjd - */ -static void __init asus_hides_ac97_lpc(struct pci_dev *dev) -{ - u8 val; - int asus_hides_ac97 = 0; - - if (likely(dev->subsystem_vendor == PCI_VENDOR_ID_ASUSTEK)) { - if (dev->device == PCI_DEVICE_ID_VIA_8237) - asus_hides_ac97 = 1; - } - - if (!asus_hides_ac97) - return; - - pci_read_config_byte(dev, 0x50, &val); - if (val & 0xc0) { - pci_write_config_byte(dev, 0x50, val & (~0xc0)); - pci_read_config_byte(dev, 0x50, &val); - if (val & 0xc0) - printk(KERN_INFO "PCI: onboard AC97/MC97 devices continue to play 'hide and seek'! 0x%x\n", val); - else - printk(KERN_INFO "PCI: enabled onboard AC97/MC97 devices\n"); - } -} -DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8237, asus_hides_ac97_lpc ); - DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_961, quirk_sis_96x_smbus ); DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_962, quirk_sis_96x_smbus ); 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) { @@ -1399,64 +1266,6 @@ 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 - */ -static void __devinit quirk_ibm_dock2_cardbus(struct pci_dev *dev) -{ - u32 val; - - /* - * tie the 2 interrupt pins to INTA, and configure the - * multifunction routing register to handle this. - */ - if ((dev->subsystem_vendor == PCI_VENDOR_ID_IBM) && - (dev->subsystem_device == 0x0148)) { - printk(KERN_INFO "PCI: Found IBM Dock II Cardbus Bridge " - "applying quirk\n"); - pci_read_config_dword(dev, 0x8c, &val); - val = ((val & 0xffffff00) | 0x1002); - pci_write_config_dword(dev, 0x8c, val); - pci_read_config_dword(dev, 0x80, &val); - val = ((val & 0x00ffff00) | 0x2864c077); - pci_write_config_dword(dev, 0x80, val); - } -} - -DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_1420, - quirk_ibm_dock2_cardbus); static void __devinit quirk_netmos(struct pci_dev *dev) { diff --git a/drivers/pci/remove.c b/drivers/pci/remove.c index 99ffbd478..1a6bf9de1 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); - down_write(&pci_bus_sem); + spin_lock(&pci_bus_lock); list_del(&dev->global_list); dev->global_list.next = dev->global_list.prev = NULL; - up_write(&pci_bus_sem); + spin_unlock(&pci_bus_lock); } /* Remove the device from the device lists, and prevent any further * list accesses from this device */ - down_write(&pci_bus_sem); + spin_lock(&pci_bus_lock); list_del(&dev->bus_list); dev->bus_list.next = dev->bus_list.prev = NULL; - up_write(&pci_bus_sem); + spin_unlock(&pci_bus_lock); 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); - down_write(&pci_bus_sem); + spin_lock(&pci_bus_lock); list_del(&pci_bus->node); - up_write(&pci_bus_sem); + spin_unlock(&pci_bus_lock); 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 f5ee7ce16..598a115cd 100644 --- a/drivers/pci/rom.c +++ b/drivers/pci/rom.c @@ -6,6 +6,7 @@ * * PCI ROM access routines */ +#include #include #include #include @@ -79,8 +80,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 *)(unsigned long) - pci_resource_start(pdev, PCI_ROM_RESOURCE); + return (void __iomem *)pci_resource_start(pdev, + PCI_ROM_RESOURCE); } else { /* assign the ROM an address if it doesn't have one */ if (res->parent == NULL && @@ -169,11 +170,11 @@ void __iomem *pci_map_rom_copy(struct pci_dev *pdev, size_t *size) return rom; res->end = res->start + *size; - memcpy_fromio((void*)(unsigned long)res->start, rom, *size); + memcpy_fromio((void*)res->start, rom, *size); pci_unmap_rom(pdev, rom); res->flags |= IORESOURCE_ROM_COPY; - return (void __iomem *)(unsigned long)res->start; + return (void __iomem *)res->start; } /** @@ -226,7 +227,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*)(unsigned long)res->start); + kfree((void*)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 d529462d1..05fa91a31 100644 --- a/drivers/pci/search.c +++ b/drivers/pci/search.c @@ -13,7 +13,7 @@ #include #include "pci.h" -DECLARE_RWSEM(pci_bus_sem); +DEFINE_SPINLOCK(pci_bus_lock); 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 * pci_find_bus(int domain, int busnr) +struct pci_bus * __devinit pci_find_bus(int domain, int busnr) { struct pci_bus *bus = NULL; struct pci_bus *tmp_bus; @@ -61,7 +61,7 @@ struct pci_bus * 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 as the @from argument. Otherwise if + * initiated by passing %NULL to 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()); - down_read(&pci_bus_sem); + spin_lock(&pci_bus_lock); n = from ? from->node.next : pci_root_buses.next; if (n != &pci_root_buses) b = pci_bus_b(n); - up_read(&pci_bus_sem); + spin_unlock(&pci_bus_lock); 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()); - down_read(&pci_bus_sem); + spin_lock(&pci_bus_lock); 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); - up_read(&pci_bus_sem); + spin_unlock(&pci_bus_lock); return dev; } @@ -148,14 +148,13 @@ 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 as 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 to the @from argument. + * Otherwise if @from is not %NULL, searches continue from next device on the global list. * - * 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 + * 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 * time. */ static struct pci_dev * pci_find_subsys(unsigned int vendor, @@ -168,7 +167,7 @@ static struct pci_dev * pci_find_subsys(unsigned int vendor, struct pci_dev *dev; WARN_ON(in_interrupt()); - down_read(&pci_bus_sem); + spin_lock(&pci_bus_lock); n = from ? from->global_list.next : pci_devices.next; while (n && (n != &pci_devices)) { @@ -182,7 +181,7 @@ static struct pci_dev * pci_find_subsys(unsigned int vendor, } dev = NULL; exit: - up_read(&pci_bus_sem); + spin_unlock(&pci_bus_lock); return dev; } @@ -192,15 +191,14 @@ 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 as 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 to the @from argument. + * Otherwise if @from is not %NULL, searches continue from next device on the global list. * - * 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 + * 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 * time. */ struct pci_dev * @@ -217,11 +215,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 as the @from argument. Otherwise if @from is not %NULL, + * passing %NULL to 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. */ @@ -234,7 +232,7 @@ pci_get_subsys(unsigned int vendor, unsigned int device, struct pci_dev *dev; WARN_ON(in_interrupt()); - down_read(&pci_bus_sem); + spin_lock(&pci_bus_lock); n = from ? from->global_list.next : pci_devices.next; while (n && (n != &pci_devices)) { @@ -248,9 +246,9 @@ pci_get_subsys(unsigned int vendor, unsigned int device, } dev = NULL; exit: - dev = pci_dev_get(dev); - up_read(&pci_bus_sem); pci_dev_put(from); + dev = pci_dev_get(dev); + spin_unlock(&pci_bus_lock); return dev; } @@ -264,7 +262,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 - * as the @from argument. Otherwise if @from is not %NULL, searches continue + * to 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. */ @@ -281,13 +279,11 @@ 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 as 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 to 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) @@ -296,7 +292,7 @@ pci_find_device_reverse(unsigned int vendor, unsigned int device, const struct p struct pci_dev *dev; WARN_ON(in_interrupt()); - down_read(&pci_bus_sem); + spin_lock(&pci_bus_lock); n = from ? from->global_list.prev : pci_devices.prev; while (n && (n != &pci_devices)) { @@ -308,7 +304,7 @@ pci_find_device_reverse(unsigned int vendor, unsigned int device, const struct p } dev = NULL; exit: - up_read(&pci_bus_sem); + spin_unlock(&pci_bus_lock); return dev; } @@ -321,7 +317,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 as the @from argument. + * 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. The reference count for @from is always decremented * if it is not %NULL. @@ -332,7 +328,7 @@ struct pci_dev *pci_get_class(unsigned int class, struct pci_dev *from) struct pci_dev *dev; WARN_ON(in_interrupt()); - down_read(&pci_bus_sem); + spin_lock(&pci_bus_lock); n = from ? from->global_list.next : pci_devices.next; while (n && (n != &pci_devices)) { @@ -343,9 +339,9 @@ struct pci_dev *pci_get_class(unsigned int class, struct pci_dev *from) } dev = NULL; exit: - dev = pci_dev_get(dev); - up_read(&pci_bus_sem); pci_dev_put(from); + dev = pci_dev_get(dev); + spin_unlock(&pci_bus_lock); return dev; } @@ -366,7 +362,7 @@ int pci_dev_present(const struct pci_device_id *ids) int found = 0; WARN_ON(in_interrupt()); - down_read(&pci_bus_sem); + spin_lock(&pci_bus_lock); while (ids->vendor || ids->subvendor || ids->class_mask) { list_for_each_entry(dev, &pci_devices, global_list) { if (pci_match_one_device(ids, dev)) { @@ -376,8 +372,8 @@ int pci_dev_present(const struct pci_device_id *ids) } ids++; } -exit: - up_read(&pci_bus_sem); +exit: + spin_unlock(&pci_bus_lock); return found; } EXPORT_SYMBOL(pci_dev_present); diff --git a/drivers/pci/setup-bus.c b/drivers/pci/setup-bus.c index 47c1071ad..28ce3a7ee 100644 --- a/drivers/pci/setup-bus.c +++ b/drivers/pci/setup-bus.c @@ -55,10 +55,9 @@ 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 or host bridges or ioapics. */ + /* Don't touch classless devices and host bridges. */ if (class == PCI_CLASS_NOT_DEFINED || - class == PCI_CLASS_BRIDGE_HOST || - class == PCI_CLASS_SYSTEM_PIC) + class == PCI_CLASS_BRIDGE_HOST) continue; pdev_sort_resources(dev, &head); @@ -357,10 +356,8 @@ 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: %llx-%llx\n", - pci_name(dev), i, - (unsigned long long)r->start, - (unsigned long long)r->end); + "too large: %lx-%lx\n", + pci_name(dev), i, r->start, r->end); r->flags = 0; continue; } diff --git a/drivers/pci/setup-res.c b/drivers/pci/setup-res.c index 38eade924..ea9277b7f 100644 --- a/drivers/pci/setup-res.c +++ b/drivers/pci/setup-res.c @@ -40,9 +40,8 @@ pci_update_resource(struct pci_dev *dev, struct resource *res, int resno) pcibios_resource_to_bus(dev, ®ion, res); - 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, + pr_debug(" got res [%lx:%lx] bus [%lx:%lx] flags %lx for " + "BAR %d of %s\n", res->start, res->end, region.start, region.end, res->flags, resno, pci_name(dev)); new = region.start | (res->flags & PCI_REGION_FLAG_MASK); @@ -105,12 +104,10 @@ 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 [%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); + 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); } return err; @@ -121,7 +118,7 @@ int pci_assign_resource(struct pci_dev *dev, int resno) { struct pci_bus *bus = dev->bus; struct resource *res = dev->resource + resno; - resource_size_t size, min, align; + unsigned long size, min, align; int ret; size = res->end - res->start + 1; @@ -148,11 +145,9 @@ int pci_assign_resource(struct pci_dev *dev, int resno) } 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)size, - (unsigned long long)res->start, pci_name(dev)); + 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)); } else if (resno < PCI_BRIDGE_RESOURCES) { pci_update_resource(dev, res, resno); } @@ -160,46 +155,6 @@ 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) @@ -209,7 +164,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; - resource_size_t r_align; + unsigned long r_align; r = &dev->resource[i]; r_align = r->end - r->start; @@ -218,14 +173,13 @@ pdev_sort_resources(struct pci_dev *dev, struct resource_list *head) continue; if (!r_align) { printk(KERN_WARNING "PCI: Ignore bogus resource %d " - "[%llx:%llx] of %s\n", - i, (unsigned long long)r->start, - (unsigned long long)r->end, pci_name(dev)); + "[%lx:%lx] of %s\n", + i, r->start, r->end, pci_name(dev)); continue; } r_align = (i < PCI_BRIDGE_RESOURCES) ? r_align + 1 : r->start; for (list = head; ; list = list->next) { - resource_size_t align = 0; + unsigned long align = 0; struct resource_list *ln = list->next; int idx; diff --git a/drivers/pcmcia/Kconfig b/drivers/pcmcia/Kconfig index 35f88649d..1f4ad0e78 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" - depends on HOTPLUG + select 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, @@ -250,7 +250,7 @@ config M32R_CFC_NUM config PCMCIA_VRC4171 tristate "NEC VRC4171 Card Controllers support" - depends on CPU_VR41XX && ISA && PCMCIA + depends on VRC4171 && PCMCIA config PCMCIA_VRC4173 tristate "NEC VRC4173 CARDU support" @@ -263,13 +263,6 @@ config OMAP_CF Say Y here to support the CompactFlash controller on OMAP. Note that this doesn't support "True IDE" mode. -config AT91_CF - tristate "AT91 CompactFlash Controller" - depends on PCMCIA && ARCH_AT91RM9200 - help - Say Y here to support the CompactFlash controller on AT91 chips. - Or choose M to compile the driver as a module named "at91_cf". - config PCCARD_NONSTATIC tristate diff --git a/drivers/pcmcia/Makefile b/drivers/pcmcia/Makefile index 427696551..bcecf5133 100644 --- a/drivers/pcmcia/Makefile +++ b/drivers/pcmcia/Makefile @@ -10,7 +10,7 @@ pcmcia_core-y += cs.o cistpl.o rsrc_mgr.o socket_sysfs.o pcmcia_core-$(CONFIG_CARDBUS) += cardbus.o obj-$(CONFIG_PCCARD) += pcmcia_core.o -pcmcia-y += ds.o pcmcia_resource.o +pcmcia-y += ds.o pcmcia_compat.o pcmcia_resource.o pcmcia-$(CONFIG_PCMCIA_IOCTL) += pcmcia_ioctl.o obj-$(CONFIG_PCMCIA) += pcmcia.o @@ -36,7 +36,6 @@ obj-$(CONFIG_PCMCIA_AU1X00) += au1x00_ss.o obj-$(CONFIG_PCMCIA_VRC4171) += vrc4171_card.o obj-$(CONFIG_PCMCIA_VRC4173) += vrc4173_cardu.o obj-$(CONFIG_OMAP_CF) += omap_cf.o -obj-$(CONFIG_AT91_CF) += at91_cf.o sa11xx_core-y += soc_common.o sa11xx_base.o pxa2xx_core-y += soc_common.o pxa2xx_base.o diff --git a/drivers/pcmcia/au1000_db1x00.c b/drivers/pcmcia/au1000_db1x00.c index 74e051535..abc13f28b 100644 --- a/drivers/pcmcia/au1000_db1x00.c +++ b/drivers/pcmcia/au1000_db1x00.c @@ -30,6 +30,7 @@ * */ +#include #include #include #include @@ -295,7 +296,7 @@ struct pcmcia_low_level db1x00_pcmcia_ops = { .socket_suspend = db1x00_socket_suspend }; -int au1x_board_init(struct device *dev) +int __init 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 d5dd0ce65..971a35281 100644 --- a/drivers/pcmcia/au1000_generic.c +++ b/drivers/pcmcia/au1000_generic.c @@ -33,6 +33,7 @@ #include #include #include +#include #include #include #include diff --git a/drivers/pcmcia/au1000_generic.h b/drivers/pcmcia/au1000_generic.h index 1e467bb54..f2c970b5f 100644 --- a/drivers/pcmcia/au1000_generic.h +++ b/drivers/pcmcia/au1000_generic.h @@ -22,6 +22,7 @@ #define __ASM_AU1000_PCMCIA_H /* include the world */ +#include #include #include diff --git a/drivers/pcmcia/au1000_pb1x00.c b/drivers/pcmcia/au1000_pb1x00.c index 86c0808d6..fd5522ede 100644 --- a/drivers/pcmcia/au1000_pb1x00.c +++ b/drivers/pcmcia/au1000_pb1x00.c @@ -21,6 +21,7 @@ * 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/cistpl.c b/drivers/pcmcia/cistpl.c index 912c03e5e..120fa8da6 100644 --- a/drivers/pcmcia/cistpl.c +++ b/drivers/pcmcia/cistpl.c @@ -12,6 +12,7 @@ * (C) 1999 David A. Hinds */ +#include #include #include #include diff --git a/drivers/pcmcia/cs.c b/drivers/pcmcia/cs.c index f9cd831a3..613f2f1fb 100644 --- a/drivers/pcmcia/cs.c +++ b/drivers/pcmcia/cs.c @@ -16,6 +16,7 @@ #include #include #include +#include #include #include #include @@ -28,7 +29,6 @@ #include #include #include -#include #include #include @@ -111,9 +111,9 @@ int pcmcia_socket_dev_suspend(struct device *dev, pm_message_t state) list_for_each_entry(socket, &pcmcia_socket_list, socket_list) { if (socket->dev.dev != dev) continue; - mutex_lock(&socket->skt_mutex); + down(&socket->skt_sem); socket_suspend(socket); - mutex_unlock(&socket->skt_mutex); + up(&socket->skt_sem); } up_read(&pcmcia_socket_list_rwsem); @@ -129,9 +129,9 @@ int pcmcia_socket_dev_resume(struct device *dev) list_for_each_entry(socket, &pcmcia_socket_list, socket_list) { if (socket->dev.dev != dev) continue; - mutex_lock(&socket->skt_mutex); + down(&socket->skt_sem); socket_resume(socket); - mutex_unlock(&socket->skt_mutex); + up(&socket->skt_sem); } up_read(&pcmcia_socket_list_rwsem); @@ -177,7 +177,6 @@ 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) @@ -238,21 +237,18 @@ int pcmcia_register_socket(struct pcmcia_socket *socket) init_completion(&socket->socket_released); init_completion(&socket->thread_done); init_waitqueue_head(&socket->thread_wait); - mutex_init(&socket->skt_mutex); + init_MUTEX(&socket->skt_sem); spin_lock_init(&socket->thread_lock); - tsk = kthread_run(pccardd, socket, "pccardd"); - if (IS_ERR(tsk)) { - ret = PTR_ERR(tsk); + ret = kernel_thread(pccardd, socket, CLONE_KERNEL); + if (ret < 0) 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; @@ -277,8 +273,10 @@ 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); - kthread_stop(socket->thread); + wait_for_completion(&socket->thread_done); } release_cis_mem(socket); @@ -408,6 +406,8 @@ static void socket_shutdown(struct pcmcia_socket *s) cb_free(s); #endif s->functions = 0; + kfree(s->config); + s->config = NULL; s->ops->get_status(s, &status); if (status & SS_POWERON) { @@ -633,6 +633,8 @@ static int pccardd(void *__skt) DECLARE_WAITQUEUE(wait, current); int ret; + daemonize("pccardd"); + skt->thread = current; skt->socket = dead_socket; skt->ops->init(skt); @@ -644,8 +646,7 @@ static int pccardd(void *__skt) printk(KERN_WARNING "PCMCIA: unable to register socket 0x%p\n", skt); skt->thread = NULL; - complete(&skt->thread_done); - return 0; + complete_and_exit(&skt->thread_done, 0); } add_wait_queue(&skt->thread_wait, &wait); @@ -663,7 +664,7 @@ static int pccardd(void *__skt) spin_unlock_irqrestore(&skt->thread_lock, flags); if (events) { - mutex_lock(&skt->skt_mutex); + down(&skt->skt_sem); if (events & SS_DETECT) socket_detect_change(skt); if (events & SS_BATDEAD) @@ -672,11 +673,11 @@ static int pccardd(void *__skt) send_event(skt, CS_EVENT_BATTERY_LOW, CS_EVENT_PRI_LOW); if (events & SS_READY) send_event(skt, CS_EVENT_READY_CHANGE, CS_EVENT_PRI_LOW); - mutex_unlock(&skt->skt_mutex); + up(&skt->skt_sem); continue; } - if (kthread_should_stop()) + if (!skt->thread) break; schedule(); @@ -690,7 +691,7 @@ static int pccardd(void *__skt) /* remove from the device core */ class_device_unregister(&skt->dev); - return 0; + complete_and_exit(&skt->thread_done, 0); } /* @@ -699,12 +700,11 @@ 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_irqsave(&s->thread_lock, flags); + spin_lock(&s->thread_lock); s->thread_events |= events; - spin_unlock_irqrestore(&s->thread_lock, flags); + spin_unlock(&s->thread_lock); wake_up(&s->thread_wait); } @@ -717,8 +717,8 @@ int pccard_register_pcmcia(struct pcmcia_socket *s, struct pcmcia_callback *c) { int ret = 0; - /* s->skt_mutex also protects s->callback */ - mutex_lock(&s->skt_mutex); + /* s->skt_sem also protects s->callback */ + down(&s->skt_sem); if (c) { /* registration */ @@ -734,7 +734,7 @@ int pccard_register_pcmcia(struct pcmcia_socket *s, struct pcmcia_callback *c) } else s->callback = NULL; err: - mutex_unlock(&s->skt_mutex); + up(&s->skt_sem); return ret; } @@ -752,7 +752,7 @@ int pccard_reset_card(struct pcmcia_socket *skt) cs_dbg(skt, 1, "resetting socket\n"); - mutex_lock(&skt->skt_mutex); + down(&skt->skt_sem); do { if (!(skt->state & SOCKET_PRESENT)) { ret = CS_NO_CARD; @@ -781,7 +781,7 @@ int pccard_reset_card(struct pcmcia_socket *skt) ret = CS_SUCCESS; } while (0); - mutex_unlock(&skt->skt_mutex); + up(&skt->skt_sem); return ret; } /* reset_card */ @@ -797,7 +797,7 @@ int pcmcia_suspend_card(struct pcmcia_socket *skt) cs_dbg(skt, 1, "suspending socket\n"); - mutex_lock(&skt->skt_mutex); + down(&skt->skt_sem); do { if (!(skt->state & SOCKET_PRESENT)) { ret = CS_NO_CARD; @@ -814,7 +814,7 @@ int pcmcia_suspend_card(struct pcmcia_socket *skt) } ret = socket_suspend(skt); } while (0); - mutex_unlock(&skt->skt_mutex); + up(&skt->skt_sem); return ret; } /* suspend_card */ @@ -827,7 +827,7 @@ int pcmcia_resume_card(struct pcmcia_socket *skt) cs_dbg(skt, 1, "waking up socket\n"); - mutex_lock(&skt->skt_mutex); + down(&skt->skt_sem); do { if (!(skt->state & SOCKET_PRESENT)) { ret = CS_NO_CARD; @@ -841,7 +841,7 @@ int pcmcia_resume_card(struct pcmcia_socket *skt) if (!ret && skt->callback) skt->callback->resume(skt); } while (0); - mutex_unlock(&skt->skt_mutex); + up(&skt->skt_sem); return ret; } /* resume_card */ @@ -855,7 +855,7 @@ int pcmcia_eject_card(struct pcmcia_socket *skt) cs_dbg(skt, 1, "user eject request\n"); - mutex_lock(&skt->skt_mutex); + down(&skt->skt_sem); do { if (!(skt->state & SOCKET_PRESENT)) { ret = -ENODEV; @@ -871,7 +871,7 @@ int pcmcia_eject_card(struct pcmcia_socket *skt) socket_remove(skt); ret = 0; } while (0); - mutex_unlock(&skt->skt_mutex); + up(&skt->skt_sem); return ret; } /* eject_card */ @@ -884,7 +884,7 @@ int pcmcia_insert_card(struct pcmcia_socket *skt) cs_dbg(skt, 1, "user insert request\n"); - mutex_lock(&skt->skt_mutex); + down(&skt->skt_sem); do { if (skt->state & SOCKET_PRESENT) { ret = -EBUSY; @@ -896,7 +896,7 @@ int pcmcia_insert_card(struct pcmcia_socket *skt) } ret = 0; } while (0); - mutex_unlock(&skt->skt_mutex); + up(&skt->skt_sem); return ret; } /* insert_card */ diff --git a/drivers/pcmcia/cs_internal.h b/drivers/pcmcia/cs_internal.h index d6164cd58..7b37eba35 100644 --- a/drivers/pcmcia/cs_internal.h +++ b/drivers/pcmcia/cs_internal.h @@ -15,7 +15,7 @@ #ifndef _LINUX_CS_INTERNAL_H #define _LINUX_CS_INTERNAL_H -#include +#include /* Flags in client state */ #define CLIENT_CONFIG_LOCKED 0x0001 @@ -23,7 +23,7 @@ #define CLIENT_IO_REQ 0x0004 #define CLIENT_UNBOUND 0x0008 #define CLIENT_STALE 0x0010 -#define CLIENT_WIN_REQ(i) (0x1<<(i)) +#define CLIENT_WIN_REQ(i) (0x20<<(i)) #define CLIENT_CARDBUS 0x8000 #define REGION_MAGIC 0xE3C9 @@ -31,7 +31,7 @@ typedef struct region_t { u_short region_magic; u_short state; dev_info_t dev_info; - struct pcmcia_device *mtd; + client_handle_t mtd; u_int MediaID; region_info_t info; } region_t; @@ -40,12 +40,12 @@ typedef struct region_t { /* Each card function gets one of these guys */ typedef struct config_t { - struct kref ref; u_int state; u_int Attributes; u_int IntType; u_int ConfigBase; u_char Status, Pin, Copy, Option, ExtStatus; + u_int Present; u_int CardValues; io_req_t io; struct { @@ -95,6 +95,12 @@ static inline void cs_socket_put(struct pcmcia_socket *skt) } } +#define CHECK_SOCKET(s) \ + (((s) >= sockets) || (socket_table[s]->ops == NULL)) + +#define SOCKET(h) (h->socket) +#define CONFIG(h) (&SOCKET(h)->config[(h)->func]) + /* In cardbus.c */ int cb_alloc(struct pcmcia_socket *s); void cb_free(struct pcmcia_socket *s); @@ -127,9 +133,10 @@ extern struct class_interface pccard_sysfs_interface; extern struct rw_semaphore pcmcia_socket_list_rwsem; extern struct list_head pcmcia_socket_list; int pcmcia_get_window(struct pcmcia_socket *s, window_handle_t *handle, int idx, win_req_t *req); -int pccard_get_configuration_info(struct pcmcia_socket *s, struct pcmcia_device *p_dev, config_info_t *config); +int pccard_get_configuration_info(struct pcmcia_socket *s, unsigned int function, config_info_t *config); int pccard_reset_card(struct pcmcia_socket *skt); -int pccard_get_status(struct pcmcia_socket *s, struct pcmcia_device *p_dev, cs_status_t *status); +int pccard_get_status(struct pcmcia_socket *s, unsigned int function, cs_status_t *status); +int pccard_access_configuration_register(struct pcmcia_socket *s, unsigned int function, conf_reg_t *reg); struct pcmcia_callback{ diff --git a/drivers/pcmcia/ds.c b/drivers/pcmcia/ds.c index 95d5e880f..a4333a826 100644 --- a/drivers/pcmcia/ds.c +++ b/drivers/pcmcia/ds.c @@ -10,9 +10,10 @@ * are Copyright (C) 1999 David A. Hinds. All Rights Reserved. * * (C) 1999 David A. Hinds - * (C) 2003 - 2006 Dominik Brodowski + * (C) 2003 - 2005 Dominik Brodowski */ +#include #include #include #include @@ -22,7 +23,6 @@ #include #include #include -#include #define IN_CARD_SERVICES #include @@ -236,11 +236,11 @@ static void pcmcia_check_driver(struct pcmcia_driver *p_drv) /** * pcmcia_load_firmware - load CIS from userspace if device-provided is broken * @dev - the pcmcia device which needs a CIS override - * @filename - requested filename in /lib/firmware/ + * @filename - requested filename in /lib/firmware/cis/ * * This uses the in-kernel firmware loading mechanism to use a "fake CIS" if * the one provided by the card is broken. The firmware files reside in - * /lib/firmware/ in userspace. + * /lib/firmware/cis/ in userspace. */ static int pcmcia_load_firmware(struct pcmcia_device *dev, char * filename) { @@ -298,6 +298,9 @@ static inline int pcmcia_load_firmware(struct pcmcia_device *dev, char * filenam * * Registers a PCMCIA driver with the PCMCIA bus core. */ +static int pcmcia_device_probe(struct device *dev); +static int pcmcia_device_remove(struct device * dev); + int pcmcia_register_driver(struct pcmcia_driver *driver) { if (!driver) @@ -340,19 +343,12 @@ void pcmcia_put_dev(struct pcmcia_device *p_dev) put_device(&p_dev->dev); } -static void pcmcia_release_function(struct kref *ref) -{ - struct config_t *c = container_of(ref, struct config_t, ref); - kfree(c); -} - static void pcmcia_release_dev(struct device *dev) { struct pcmcia_device *p_dev = to_pcmcia_dev(dev); ds_dbg(1, "releasing dev %p\n", p_dev); pcmcia_put_socket(p_dev->socket); kfree(p_dev->devname); - kref_put(&p_dev->function_config->ref, pcmcia_release_function); kfree(p_dev); } @@ -381,12 +377,29 @@ static int pcmcia_device_probe(struct device * dev) p_drv = to_pcmcia_drv(dev->driver); s = p_dev->socket; - if ((!p_drv->probe) || (!p_dev->function_config) || - (!try_module_get(p_drv->owner))) { + if ((!p_drv->probe) || (!try_module_get(p_drv->owner))) { ret = -EINVAL; goto put_dev; } + p_dev->state &= ~CLIENT_UNBOUND; + + /* set up the device configuration, if it hasn't been done before */ + if (!s->functions) { + cistpl_longlink_mfc_t mfc; + if (pccard_read_tuple(s, p_dev->func, CISTPL_LONGLINK_MFC, + &mfc) == CS_SUCCESS) + s->functions = mfc.nfn; + else + s->functions = 1; + s->config = kzalloc(sizeof(config_t) * s->functions, + GFP_KERNEL); + if (!s->config) { + ret = -ENOMEM; + goto put_module; + } + } + ret = p_drv->probe(p_dev); if (ret) goto put_module; @@ -397,7 +410,7 @@ static int pcmcia_device_probe(struct device * dev) * call which will then check whether there are two * pseudo devices, and if not, add the second one. */ - did = p_dev->dev.driver_data; + did = (struct pcmcia_device_id *) p_dev->dev.driver_data; if (did && (did->match_flags & PCMCIA_DEV_ID_MATCH_DEVICE_NO) && (p_dev->socket->device_count == 1) && (p_dev->device_no == 0)) pcmcia_add_pseudo_device(p_dev->socket); @@ -412,79 +425,33 @@ static int pcmcia_device_probe(struct device * dev) } -/* - * Removes a PCMCIA card from the device tree and socket list. - */ -static void pcmcia_card_remove(struct pcmcia_socket *s, struct pcmcia_device *leftover) -{ - struct pcmcia_device *p_dev; - struct pcmcia_device *tmp; - unsigned long flags; - - ds_dbg(2, "unbind_request(%d)\n", s->sock); - - - if (!leftover) - s->device_count = 0; - else - s->device_count = 1; - - /* unregister all pcmcia_devices registered with this socket, except leftover */ - list_for_each_entry_safe(p_dev, tmp, &s->devices_list, socket_device_list) { - if (p_dev == leftover) - continue; - - spin_lock_irqsave(&pcmcia_dev_list_lock, flags); - list_del(&p_dev->socket_device_list); - p_dev->_removed=1; - spin_unlock_irqrestore(&pcmcia_dev_list_lock, flags); - - device_unregister(&p_dev->dev); - } - - return; -} - static int pcmcia_device_remove(struct device * dev) { struct pcmcia_device *p_dev; struct pcmcia_driver *p_drv; - struct pcmcia_device_id *did; int i; + /* detach the "instance" */ p_dev = to_pcmcia_dev(dev); p_drv = to_pcmcia_drv(dev->driver); - - /* If we're removing the primary module driving a - * pseudo multi-function card, we need to unbind - * all devices - */ - did = p_dev->dev.driver_data; - if (did && (did->match_flags & PCMCIA_DEV_ID_MATCH_DEVICE_NO) && - (p_dev->socket->device_count != 0) && - (p_dev->device_no == 0)) - pcmcia_card_remove(p_dev->socket, p_dev); - - /* detach the "instance" */ if (!p_drv) return 0; if (p_drv->remove) p_drv->remove(p_dev); - p_dev->dev_node = NULL; - /* check for proper unloading */ - if (p_dev->_irq || p_dev->_io || p_dev->_locked) + if (p_dev->state & (CLIENT_IRQ_REQ|CLIENT_IO_REQ|CLIENT_CONFIG_LOCKED)) printk(KERN_INFO "pcmcia: driver %s did not release config properly\n", p_drv->drv.name); for (i = 0; i < MAX_WIN; i++) - if (p_dev->_win & CLIENT_WIN_REQ(i)) + if (p_dev->state & CLIENT_WIN_REQ(i)) printk(KERN_INFO "pcmcia: driver %s did not release windows properly\n", p_drv->drv.name); /* references from pcmcia_probe_device */ + p_dev->state = CLIENT_UNBOUND; pcmcia_put_dev(p_dev); module_put(p_drv->owner); @@ -492,6 +459,37 @@ static int pcmcia_device_remove(struct device * dev) } +/* + * Removes a PCMCIA card from the device tree and socket list. + */ +static void pcmcia_card_remove(struct pcmcia_socket *s) +{ + struct pcmcia_device *p_dev; + unsigned long flags; + + ds_dbg(2, "unbind_request(%d)\n", s->sock); + + s->device_count = 0; + + for (;;) { + /* unregister all pcmcia_devices registered with this socket*/ + spin_lock_irqsave(&pcmcia_dev_list_lock, flags); + if (list_empty(&s->devices_list)) { + spin_unlock_irqrestore(&pcmcia_dev_list_lock, flags); + return; + } + p_dev = list_entry((&s->devices_list)->next, struct pcmcia_device, socket_device_list); + list_del(&p_dev->socket_device_list); + p_dev->state |= CLIENT_STALE; + spin_unlock_irqrestore(&pcmcia_dev_list_lock, flags); + + device_unregister(&p_dev->dev); + } + + return; +} /* unbind_request */ + + /* * pcmcia_device_query -- determine information about a pcmcia device */ @@ -573,11 +571,11 @@ static int pcmcia_device_query(struct pcmcia_device *p_dev) * won't work, this doesn't matter much at the moment: the driver core doesn't * support it either. */ -static DEFINE_MUTEX(device_add_lock); +static DECLARE_MUTEX(device_add_lock); struct pcmcia_device * pcmcia_device_add(struct pcmcia_socket *s, unsigned int function) { - struct pcmcia_device *p_dev, *tmp_dev; + struct pcmcia_device *p_dev; unsigned long flags; int bus_id_len; @@ -585,7 +583,7 @@ struct pcmcia_device * pcmcia_device_add(struct pcmcia_socket *s, unsigned int f if (!s) return NULL; - mutex_lock(&device_add_lock); + down(&device_add_lock); /* max of 2 devices per card */ if (s->device_count == 2) @@ -598,8 +596,6 @@ struct pcmcia_device * pcmcia_device_add(struct pcmcia_socket *s, unsigned int f p_dev->socket = s; p_dev->device_no = (s->device_count++); p_dev->func = function; - if (s->functions <= function) - s->functions = function + 1; p_dev->dev.bus = &pcmcia_bus_type; p_dev->dev.parent = s->dev.dev; @@ -612,55 +608,36 @@ struct pcmcia_device * pcmcia_device_add(struct pcmcia_socket *s, unsigned int f sprintf (p_dev->devname, "pcmcia%s", p_dev->dev.bus_id); /* compat */ - spin_lock_irqsave(&pcmcia_dev_list_lock, flags); - - /* - * p_dev->function_config must be the same for all card functions. - * Note that this is serialized by the device_add_lock, so that - * only one such struct will be created. - */ - list_for_each_entry(tmp_dev, &s->devices_list, socket_device_list) - if (p_dev->func == tmp_dev->func) { - p_dev->function_config = tmp_dev->function_config; - kref_get(&p_dev->function_config->ref); - } + p_dev->state = CLIENT_UNBOUND; /* Add to the list in pcmcia_bus_socket */ - list_add(&p_dev->socket_device_list, &s->devices_list); - + spin_lock_irqsave(&pcmcia_dev_list_lock, flags); + list_add_tail(&p_dev->socket_device_list, &s->devices_list); spin_unlock_irqrestore(&pcmcia_dev_list_lock, flags); - if (!p_dev->function_config) { - p_dev->function_config = kzalloc(sizeof(struct config_t), - GFP_KERNEL); - if (!p_dev->function_config) - goto err_unreg; - kref_init(&p_dev->function_config->ref); - } - printk(KERN_NOTICE "pcmcia: registering new device %s\n", p_dev->devname); pcmcia_device_query(p_dev); - if (device_register(&p_dev->dev)) - goto err_unreg; + if (device_register(&p_dev->dev)) { + spin_lock_irqsave(&pcmcia_dev_list_lock, flags); + list_del(&p_dev->socket_device_list); + spin_unlock_irqrestore(&pcmcia_dev_list_lock, flags); - mutex_unlock(&device_add_lock); + goto err_free; + } - return p_dev; + up(&device_add_lock); - err_unreg: - spin_lock_irqsave(&pcmcia_dev_list_lock, flags); - list_del(&p_dev->socket_device_list); - spin_unlock_irqrestore(&pcmcia_dev_list_lock, flags); + return p_dev; err_free: kfree(p_dev->devname); kfree(p_dev); s->device_count--; err_put: - mutex_unlock(&device_add_lock); + up(&device_add_lock); pcmcia_put_socket(s); return NULL; @@ -719,7 +696,7 @@ static void pcmcia_bus_rescan(struct pcmcia_socket *skt) int no_devices=0; unsigned long flags; - /* must be called with skt_mutex held */ + /* must be called with skt_sem held */ spin_lock_irqsave(&pcmcia_dev_list_lock, flags); if (list_empty(&skt->devices_list)) no_devices=1; @@ -842,11 +819,9 @@ static int pcmcia_bus_match(struct device * dev, struct device_driver * drv) { struct pcmcia_driver * p_drv = to_pcmcia_drv(drv); struct pcmcia_device_id *did = p_drv->id_table; -#ifdef CONFIG_PCMCIA_IOCTL /* matching by cardmgr */ if (p_dev->cardmgr == p_drv) return 1; -#endif while (did && did->match_flags) { if (pcmcia_devmatch(p_dev, did)) @@ -952,7 +927,7 @@ static ssize_t pcmcia_show_pm_state(struct device *dev, struct device_attribute { struct pcmcia_device *p_dev = to_pcmcia_dev(dev); - if (p_dev->suspended) + if (p_dev->dev.power.power_state.event != PM_EVENT_ON) return sprintf(buf, "off\n"); else return sprintf(buf, "on\n"); @@ -967,9 +942,11 @@ static ssize_t pcmcia_store_pm_state(struct device *dev, struct device_attribute if (!count) return -EINVAL; - if ((!p_dev->suspended) && !strncmp(buf, "off", 3)) + if ((p_dev->dev.power.power_state.event == PM_EVENT_ON) && + (!strncmp(buf, "off", 3))) ret = dpm_runtime_suspend(dev, PMSG_SUSPEND); - else if (p_dev->suspended && !strncmp(buf, "on", 2)) + else if ((p_dev->dev.power.power_state.event != PM_EVENT_ON) && + (!strncmp(buf, "on", 2))) dpm_runtime_resume(dev); return ret ? ret : count; @@ -1005,9 +982,9 @@ static ssize_t pcmcia_store_allow_func_id_match(struct device *dev, if (!count) return -EINVAL; - mutex_lock(&p_dev->socket->skt_mutex); + down(&p_dev->socket->skt_sem); p_dev->allow_func_id_match = 1; - mutex_unlock(&p_dev->socket->skt_mutex); + up(&p_dev->socket->skt_sem); bus_rescan_devices(&pcmcia_bus_type); @@ -1035,27 +1012,14 @@ static int pcmcia_dev_suspend(struct device * dev, pm_message_t state) { struct pcmcia_device *p_dev = to_pcmcia_dev(dev); struct pcmcia_driver *p_drv = NULL; - int ret = 0; if (dev->driver) p_drv = to_pcmcia_drv(dev->driver); - if (!p_drv) - goto out; + if (p_drv && p_drv->suspend) + return p_drv->suspend(p_dev); - if (p_drv->suspend) { - ret = p_drv->suspend(p_dev); - if (ret) - goto out; - } - - if (p_dev->device_no == p_dev->func) - pcmcia_release_configuration(p_dev); - - out: - if (!ret) - p_dev->suspended = 1; - return ret; + return 0; } @@ -1063,27 +1027,14 @@ static int pcmcia_dev_resume(struct device * dev) { struct pcmcia_device *p_dev = to_pcmcia_dev(dev); struct pcmcia_driver *p_drv = NULL; - int ret = 0; if (dev->driver) p_drv = to_pcmcia_drv(dev->driver); - if (!p_drv) - goto out; - - if (p_dev->device_no == p_dev->func) { - ret = pcmcia_request_configuration(p_dev, &p_dev->conf); - if (ret) - goto out; - } - - if (p_drv->resume) - ret = p_drv->resume(p_dev); + if (p_drv && p_drv->resume) + return p_drv->resume(p_dev); - out: - if (!ret) - p_dev->suspended = 0; - return ret; + return 0; } @@ -1143,19 +1094,13 @@ static int ds_event(struct pcmcia_socket *skt, event_t event, int priority) { struct pcmcia_socket *s = pcmcia_get_socket(skt); - if (!s) { - printk(KERN_ERR "PCMCIA obtaining reference to socket %p " \ - "failed, event 0x%x lost!\n", skt, event); - return -ENODEV; - } - ds_dbg(1, "ds_event(0x%06x, %d, 0x%p)\n", event, priority, skt); switch (event) { case CS_EVENT_CARD_REMOVAL: s->pcmcia_state.present = 0; - pcmcia_card_remove(skt, NULL); + pcmcia_card_remove(skt); handle_event(skt, event); break; @@ -1183,32 +1128,6 @@ static int ds_event(struct pcmcia_socket *skt, event_t event, int priority) } /* ds_event */ -struct pcmcia_device * pcmcia_dev_present(struct pcmcia_device *_p_dev) -{ - struct pcmcia_device *p_dev; - struct pcmcia_device *ret = NULL; - - p_dev = pcmcia_get_dev(_p_dev); - if (!p_dev) - return NULL; - - if (!p_dev->socket->pcmcia_state.present) - goto out; - - if (p_dev->_removed) - goto out; - - if (p_dev->suspended) - goto out; - - ret = p_dev; - out: - pcmcia_put_dev(p_dev); - return ret; -} -EXPORT_SYMBOL(pcmcia_dev_present); - - static struct pcmcia_callback pcmcia_bus_callback = { .owner = THIS_MODULE, .event = ds_event, @@ -1264,11 +1183,6 @@ static void pcmcia_bus_remove_socket(struct class_device *class_dev, socket->pcmcia_state.dead = 1; pccard_register_pcmcia(socket, NULL); - /* unregister any unbound devices */ - mutex_lock(&socket->skt_mutex); - pcmcia_card_remove(socket, NULL); - mutex_unlock(&socket->skt_mutex); - pcmcia_put_socket(socket); return; diff --git a/drivers/pcmcia/ds_internal.h b/drivers/pcmcia/ds_internal.h index 3a2b25e6e..d359bd25a 100644 --- a/drivers/pcmcia/ds_internal.h +++ b/drivers/pcmcia/ds_internal.h @@ -8,8 +8,6 @@ extern void pcmcia_put_dev(struct pcmcia_device *p_dev); struct pcmcia_device * pcmcia_device_add(struct pcmcia_socket *s, unsigned int function); -extern int pcmcia_release_configuration(struct pcmcia_device *p_dev); - #ifdef CONFIG_PCMCIA_IOCTL extern void __init pcmcia_setup_ioctl(void); extern void __exit pcmcia_cleanup_ioctl(void); @@ -17,7 +15,7 @@ extern void handle_event(struct pcmcia_socket *s, event_t event); extern int handle_request(struct pcmcia_socket *s, event_t event); #else static inline void __init pcmcia_setup_ioctl(void) { return; } -static inline void __exit pcmcia_cleanup_ioctl(void) { return; } +static inline void __init pcmcia_cleanup_ioctl(void) { return; } static inline void handle_event(struct pcmcia_socket *s, event_t event) { return; } static inline int handle_request(struct pcmcia_socket *s, event_t event) { return CS_SUCCESS; } #endif diff --git a/drivers/pcmcia/hd64465_ss.c b/drivers/pcmcia/hd64465_ss.c index ad02629c8..b39435bbf 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].chip; - irq_desc[irq].chip = &hd64465_ss_irq_type; + hs_mapped_irq[irq].old_handler = irq_desc[irq].handler; + irq_desc[irq].handler = &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].chip = hs_mapped_irq[irq].old_handler; + irq_desc[irq].handler = 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, IRQF_DISABLED, MODNAME, sp)) < 0) + if ((err = request_irq(sp->irq, hs_interrupt, SA_INTERRUPT, 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 2163aa75a..7979c85df 100644 --- a/drivers/pcmcia/i82092.c +++ b/drivers/pcmcia/i82092.c @@ -10,6 +10,7 @@ */ #include +#include #include #include #include @@ -149,7 +150,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, IRQF_SHARED, "i82092aa", i82092aa_interrupt))) { + if ((ret = request_irq(dev->irq, i82092aa_interrupt, SA_SHIRQ, "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 1cc268239..35a92d1e4 100644 --- a/drivers/pcmcia/i82365.c +++ b/drivers/pcmcia/i82365.c @@ -34,6 +34,7 @@ #include #include #include +#include #include #include #include @@ -509,8 +510,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, IRQF_PROBE_SHARED, "scan", - i365_count_irq) != 0) + if (request_irq(irq, i365_count_irq, 0, "scan", i365_count_irq) != 0) return 1; irq_hits = 0; irq_sock = sock; msleep(10); @@ -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, IRQF_PROBE_SHARED) == 0)) + if ((mask0 & (1 << i)) && (_check_irq(i, 0) == 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, IRQF_PROBE_SHARED) == 0)) + (_check_irq(cs_irq, 0) == 0)) break; if (cs_irq) { grab_irq = 1; @@ -1084,10 +1084,9 @@ 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, %#llx-%#llx, " + debug(1, "SetMemMap(%d, %d, %#2.2x, %d ns, %#lx-%#lx, " "%#x)\n", sock, mem->map, mem->flags, mem->speed, - (unsigned long long)mem->res->start, - (unsigned long long)mem->res->end, mem->card_start); + mem->res->start, 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 9e768eaef..071cf485e 100644 --- a/drivers/pcmcia/m32r_cfc.c +++ b/drivers/pcmcia/m32r_cfc.c @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include diff --git a/drivers/pcmcia/m32r_pcc.c b/drivers/pcmcia/m32r_pcc.c index 61d50b562..70d5f0748 100644 --- a/drivers/pcmcia/m32r_pcc.c +++ b/drivers/pcmcia/m32r_pcc.c @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include diff --git a/drivers/pcmcia/m8xx_pcmcia.c b/drivers/pcmcia/m8xx_pcmcia.c index d0f68ab8f..0e07d9535 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 DEFINE_SPINLOCK(events_lock); +static spinlock_t events_lock = SPIN_LOCK_UNLOCKED; #define PCMCIA_SOCKET_KEY_5V 1 @@ -644,7 +644,7 @@ static struct platform_device m8xx_device = { }; static u32 pending_events[PCMCIA_SOCKETS_NO]; -static DEFINE_SPINLOCK(pending_event_lock); +static spinlock_t pending_event_lock = SPIN_LOCK_UNLOCKED; 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 420e10aec..47b5ade95 100644 --- a/drivers/pcmcia/omap_cf.c +++ b/drivers/pcmcia/omap_cf.c @@ -218,7 +218,7 @@ static int __init omap_cf_probe(struct device *dev) /* either CFLASH.IREQ (INT_1610_CF) or some GPIO */ irq = platform_get_irq(pdev, 0); - if (irq < 0) + if (!irq) return -EINVAL; cf = kcalloc(1, sizeof *cf, GFP_KERNEL); @@ -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, IRQF_SHARED, + status = request_irq(irq, omap_cf_irq, SA_SHIRQ, driver_name, cf); if (status < 0) goto fail0; diff --git a/drivers/pcmcia/pcmcia_compat.c b/drivers/pcmcia/pcmcia_compat.c index 68b80084f..ebb161c4f 100644 --- a/drivers/pcmcia/pcmcia_compat.c +++ b/drivers/pcmcia/pcmcia_compat.c @@ -18,7 +18,6 @@ #include #define IN_CARD_SERVICES -#include #include #include #include @@ -28,98 +27,39 @@ #include "cs_internal.h" -int pcmcia_get_first_tuple(client_handle_t handle, tuple_t *tuple) +int pcmcia_get_first_tuple(struct pcmcia_device *p_dev, tuple_t *tuple) { - struct pcmcia_socket *s; - if (CHECK_HANDLE(handle)) - return CS_BAD_HANDLE; - s = SOCKET(handle); - return pccard_get_first_tuple(s, handle->Function, tuple); + return pccard_get_first_tuple(p_dev->socket, p_dev->func, tuple); } EXPORT_SYMBOL(pcmcia_get_first_tuple); -int pcmcia_get_next_tuple(client_handle_t handle, tuple_t *tuple) +int pcmcia_get_next_tuple(struct pcmcia_device *p_dev, tuple_t *tuple) { - struct pcmcia_socket *s; - if (CHECK_HANDLE(handle)) - return CS_BAD_HANDLE; - s = SOCKET(handle); - return pccard_get_next_tuple(s, handle->Function, tuple); + return pccard_get_next_tuple(p_dev->socket, p_dev->func, tuple); } EXPORT_SYMBOL(pcmcia_get_next_tuple); -int pcmcia_get_tuple_data(client_handle_t handle, tuple_t *tuple) +int pcmcia_get_tuple_data(struct pcmcia_device *p_dev, tuple_t *tuple) { - struct pcmcia_socket *s; - if (CHECK_HANDLE(handle)) - return CS_BAD_HANDLE; - s = SOCKET(handle); - return pccard_get_tuple_data(s, tuple); + return pccard_get_tuple_data(p_dev->socket, tuple); } EXPORT_SYMBOL(pcmcia_get_tuple_data); -int pcmcia_parse_tuple(client_handle_t handle, tuple_t *tuple, cisparse_t *parse) +int pcmcia_parse_tuple(struct pcmcia_device *p_dev, tuple_t *tuple, cisparse_t *parse) { return pccard_parse_tuple(tuple, parse); } EXPORT_SYMBOL(pcmcia_parse_tuple); -int pcmcia_validate_cis(client_handle_t handle, cisinfo_t *info) +int pcmcia_validate_cis(struct pcmcia_device *p_dev, cisinfo_t *info) { - struct pcmcia_socket *s; - if (CHECK_HANDLE(handle)) - return CS_BAD_HANDLE; - s = SOCKET(handle); - return pccard_validate_cis(s, handle->Function, info); + return pccard_validate_cis(p_dev->socket, p_dev->func, info); } EXPORT_SYMBOL(pcmcia_validate_cis); -int pcmcia_get_configuration_info(client_handle_t handle, - config_info_t *config) -{ - struct pcmcia_socket *s; - - if ((CHECK_HANDLE(handle)) || !config) - return CS_BAD_HANDLE; - s = SOCKET(handle); - if (!s) - return CS_BAD_HANDLE; - return pccard_get_configuration_info(s, handle->Function, config); -} -EXPORT_SYMBOL(pcmcia_get_configuration_info); -int pcmcia_reset_card(client_handle_t handle, client_req_t *req) +int pcmcia_reset_card(struct pcmcia_device *p_dev, client_req_t *req) { - struct pcmcia_socket *skt; - - if (CHECK_HANDLE(handle)) - return CS_BAD_HANDLE; - skt = SOCKET(handle); - if (!skt) - return CS_BAD_HANDLE; - - return pccard_reset_card(skt); + return pccard_reset_card(p_dev->socket); } EXPORT_SYMBOL(pcmcia_reset_card); - -int pcmcia_get_status(client_handle_t handle, cs_status_t *status) -{ - struct pcmcia_socket *s; - if (CHECK_HANDLE(handle)) - return CS_BAD_HANDLE; - s = SOCKET(handle); - return pccard_get_status(s, handle->Function, status); -} -EXPORT_SYMBOL(pcmcia_get_status); - -int pcmcia_access_configuration_register(client_handle_t handle, - conf_reg_t *reg) -{ - struct pcmcia_socket *s; - if (CHECK_HANDLE(handle)) - return CS_BAD_HANDLE; - s = SOCKET(handle); - return pccard_access_configuration_register(s, handle->Function, reg); -} -EXPORT_SYMBOL(pcmcia_access_configuration_register); - diff --git a/drivers/pcmcia/pcmcia_ioctl.c b/drivers/pcmcia/pcmcia_ioctl.c index 9ad18e626..80969f7e7 100644 --- a/drivers/pcmcia/pcmcia_ioctl.c +++ b/drivers/pcmcia/pcmcia_ioctl.c @@ -18,6 +18,7 @@ */ +#include #include #include #include @@ -69,26 +70,10 @@ extern int ds_pc_debug; #define ds_dbg(lvl, fmt, arg...) do { } while (0) #endif -static struct pcmcia_device *get_pcmcia_device(struct pcmcia_socket *s, - unsigned int function) -{ - struct pcmcia_device *p_dev = NULL; - unsigned long flags; - - spin_lock_irqsave(&pcmcia_dev_list_lock, flags); - list_for_each_entry(p_dev, &s->devices_list, socket_device_list) { - if (p_dev->func == function) { - spin_unlock_irqrestore(&pcmcia_dev_list_lock, flags); - return pcmcia_get_dev(p_dev); - } - } - spin_unlock_irqrestore(&pcmcia_dev_list_lock, flags); - return NULL; -} /* backwards-compatible accessing of driver --- by name! */ -static struct pcmcia_driver *get_pcmcia_driver(dev_info_t *dev_info) +static struct pcmcia_driver * get_pcmcia_driver (dev_info_t *dev_info) { struct device_driver *drv; struct pcmcia_driver *p_drv; @@ -229,7 +214,7 @@ static int bind_request(struct pcmcia_socket *s, bind_info_t *bind_info) * by userspace before, we need to * return the "instance". */ spin_unlock_irqrestore(&pcmcia_dev_list_lock, flags); - bind_info->instance = p_dev; + bind_info->instance = p_dev->instance; ret = -EBUSY; goto err_put_module; } else { @@ -268,9 +253,9 @@ rescan: /* * Prevent this racing with a card insertion. */ - mutex_lock(&s->skt_mutex); + down(&s->skt_sem); bus_rescan_devices(&pcmcia_bus_type); - mutex_unlock(&s->skt_mutex); + up(&s->skt_sem); /* check whether the driver indeed matched. I don't care if this * is racy or not, because it can only happen on cardmgr access @@ -304,7 +289,6 @@ static int get_device_info(struct pcmcia_socket *s, bind_info_t *bind_info, int { dev_node_t *node; struct pcmcia_device *p_dev; - struct pcmcia_driver *p_drv; unsigned long flags; int ret = 0; @@ -359,16 +343,16 @@ static int get_device_info(struct pcmcia_socket *s, bind_info_t *bind_info, int found: spin_unlock_irqrestore(&pcmcia_dev_list_lock, flags); - p_drv = to_pcmcia_drv(p_dev->dev.driver); - if (p_drv && !p_dev->_locked) { + if ((!p_dev->instance) || + (p_dev->instance->state & DEV_CONFIG_PENDING)) { ret = -EAGAIN; goto err_put; } if (first) - node = p_dev->dev_node; + node = p_dev->instance->dev; else - for (node = p_dev->dev_node; node; node = node->next) + for (node = p_dev->instance->dev; node; node = node->next) if (node == bind_info->next) break; if (!node) { @@ -426,7 +410,7 @@ static int ds_open(struct inode *inode, struct file *file) if (!warning_printed) { printk(KERN_INFO "pcmcia: Detected deprecated PCMCIA ioctl " - "usage from process: %s.\n", current->comm); + "usage.\n"); printk(KERN_INFO "pcmcia: This interface will soon be removed from " "the kernel; please expect breakage unless you upgrade " "to new tools.\n"); @@ -599,16 +583,14 @@ static int ds_ioctl(struct inode * inode, struct file * file, if (buf->config.Function && (buf->config.Function >= s->functions)) ret = CS_BAD_ARGS; - else { - struct pcmcia_device *p_dev = get_pcmcia_device(s, buf->config.Function); - ret = pccard_get_configuration_info(s, p_dev, &buf->config); - pcmcia_put_dev(p_dev); - } + else + ret = pccard_get_configuration_info(s, + buf->config.Function, &buf->config); break; case DS_GET_FIRST_TUPLE: - mutex_lock(&s->skt_mutex); + down(&s->skt_sem); pcmcia_validate_mem(s); - mutex_unlock(&s->skt_mutex); + up(&s->skt_sem); ret = pccard_get_first_tuple(s, BIND_FN_ALL, &buf->tuple); break; case DS_GET_NEXT_TUPLE: @@ -627,19 +609,16 @@ static int ds_ioctl(struct inode * inode, struct file * file, ret = pccard_reset_card(s); break; case DS_GET_STATUS: - if (buf->status.Function && - (buf->status.Function >= s->functions)) - ret = CS_BAD_ARGS; - else { - struct pcmcia_device *p_dev = get_pcmcia_device(s, buf->status.Function); - ret = pccard_get_status(s, p_dev, &buf->status); - pcmcia_put_dev(p_dev); - } - break; + if (buf->status.Function && + (buf->status.Function >= s->functions)) + ret = CS_BAD_ARGS; + else + ret = pccard_get_status(s, buf->status.Function, &buf->status); + break; case DS_VALIDATE_CIS: - mutex_lock(&s->skt_mutex); + down(&s->skt_sem); pcmcia_validate_mem(s); - mutex_unlock(&s->skt_mutex); + up(&s->skt_sem); ret = pccard_validate_cis(s, BIND_FN_ALL, &buf->cisinfo); break; case DS_SUSPEND_CARD: @@ -659,17 +638,12 @@ static int ds_ioctl(struct inode * inode, struct file * file, err = -EPERM; goto free_out; } - - ret = CS_BAD_ARGS; - - if (!(buf->conf_reg.Function && - (buf->conf_reg.Function >= s->functions))) { - struct pcmcia_device *p_dev = get_pcmcia_device(s, buf->conf_reg.Function); - if (p_dev) { - ret = pcmcia_access_configuration_register(p_dev, &buf->conf_reg); - pcmcia_put_dev(p_dev); - } - } + if (buf->conf_reg.Function && + (buf->conf_reg.Function >= s->functions)) + ret = CS_BAD_ARGS; + else + ret = pccard_access_configuration_register(s, + buf->conf_reg.Function, &buf->conf_reg); break; case DS_GET_FIRST_REGION: case DS_GET_NEXT_REGION: diff --git a/drivers/pcmcia/pcmcia_resource.c b/drivers/pcmcia/pcmcia_resource.c index c8323399e..89022ad5b 100644 --- a/drivers/pcmcia/pcmcia_resource.c +++ b/drivers/pcmcia/pcmcia_resource.c @@ -14,6 +14,7 @@ * */ +#include #include #include #include @@ -88,6 +89,7 @@ static int alloc_io_space(struct pcmcia_socket *s, u_int attr, ioaddr_t *base, } if ((s->features & SS_CAP_STATIC_MAP) && s->io_offset) { *base = s->io_offset | (*base & 0x0fff); + s->io[0].Attributes = attr; return 0; } /* Check for an already-allocated window that must conflict with @@ -95,36 +97,38 @@ static int alloc_io_space(struct pcmcia_socket *s, u_int attr, ioaddr_t *base, * potential conflicts, just the most obvious ones. */ for (i = 0; i < MAX_IO_WIN; i++) - if ((s->io[i].res) && - ((s->io[i].res->start & (align-1)) == *base)) + if ((s->io[i].NumPorts != 0) && + ((s->io[i].BasePort & (align-1)) == *base)) return 1; for (i = 0; i < MAX_IO_WIN; i++) { - if (!s->io[i].res) { + if (s->io[i].NumPorts == 0) { s->io[i].res = pcmcia_find_io_region(*base, num, align, s); if (s->io[i].res) { - *base = s->io[i].res->start; - s->io[i].res->flags = (s->io[i].res->flags & ~IORESOURCE_BITS) | (attr & IORESOURCE_BITS); - s->io[i].InUse = num; + s->io[i].Attributes = attr; + s->io[i].BasePort = *base = s->io[i].res->start; + s->io[i].NumPorts = s->io[i].InUse = num; break; } else return 1; - } else if ((s->io[i].res->flags & IORESOURCE_BITS) != (attr & IORESOURCE_BITS)) + } else if (s->io[i].Attributes != attr) continue; /* Try to extend top of window */ - try = s->io[i].res->end + 1; + try = s->io[i].BasePort + s->io[i].NumPorts; if ((*base == 0) || (*base == try)) if (pcmcia_adjust_io_region(s->io[i].res, s->io[i].res->start, s->io[i].res->end + num, s) == 0) { *base = try; + s->io[i].NumPorts += num; s->io[i].InUse += num; break; } /* Try to extend bottom of window */ - try = s->io[i].res->start - num; + try = s->io[i].BasePort - num; if ((*base == 0) || (*base == try)) if (pcmcia_adjust_io_region(s->io[i].res, s->io[i].res->start - num, s->io[i].res->end, s) == 0) { - *base = try; + s->io[i].BasePort = *base = try; + s->io[i].NumPorts += num; s->io[i].InUse += num; break; } @@ -139,13 +143,12 @@ static void release_io_space(struct pcmcia_socket *s, ioaddr_t base, int i; for (i = 0; i < MAX_IO_WIN; i++) { - if (!s->io[i].res) - continue; - if ((s->io[i].res->start <= base) && - (s->io[i].res->end >= base+num-1)) { + if ((s->io[i].BasePort <= base) && + (s->io[i].BasePort+s->io[i].NumPorts >= base+num)) { s->io[i].InUse -= num; /* Free the window if no one else is using it */ if (s->io[i].InUse == 0) { + s->io[i].NumPorts = 0; release_resource(s->io[i].res); kfree(s->io[i].res); s->io[i].res = NULL; @@ -162,19 +165,21 @@ static void release_io_space(struct pcmcia_socket *s, ioaddr_t base, * this and the tuple reading services. */ -int pcmcia_access_configuration_register(struct pcmcia_device *p_dev, +int pccard_access_configuration_register(struct pcmcia_socket *s, + unsigned int function, conf_reg_t *reg) { - struct pcmcia_socket *s; config_t *c; int addr; u_char val; - if (!p_dev || !p_dev->function_config) + if (!s || !s->config) return CS_NO_CARD; - s = p_dev->socket; - c = p_dev->function_config; + c = &s->config[function]; + + if (c == NULL) + return CS_NO_CARD; if (!(c->state & CONFIG_LOCKED)) return CS_CONFIGURATION_LOCKED; @@ -195,12 +200,20 @@ int pcmcia_access_configuration_register(struct pcmcia_device *p_dev, break; } return CS_SUCCESS; -} /* pcmcia_access_configuration_register */ +} /* pccard_access_configuration_register */ + +int pcmcia_access_configuration_register(struct pcmcia_device *p_dev, + conf_reg_t *reg) +{ + return pccard_access_configuration_register(p_dev->socket, + p_dev->func, reg); +} EXPORT_SYMBOL(pcmcia_access_configuration_register); + int pccard_get_configuration_info(struct pcmcia_socket *s, - struct pcmcia_device *p_dev, + unsigned int function, config_info_t *config) { config_t *c; @@ -208,6 +221,7 @@ int pccard_get_configuration_info(struct pcmcia_socket *s, if (!(s->state & SOCKET_PRESENT)) return CS_NO_CARD; + config->Function = function; #ifdef CONFIG_CARDBUS if (s->state & SOCKET_CARDBUS) { @@ -221,22 +235,14 @@ int pccard_get_configuration_info(struct pcmcia_socket *s, config->AssignedIRQ = s->irq.AssignedIRQ; if (config->AssignedIRQ) config->Attributes |= CONF_ENABLE_IRQ; - if (s->io[0].res) { - config->BasePort1 = s->io[0].res->start; - config->NumPorts1 = s->io[0].res->end - config->BasePort1 + 1; - } + config->BasePort1 = s->io[0].BasePort; + config->NumPorts1 = s->io[0].NumPorts; } return CS_SUCCESS; } #endif - if (p_dev) { - c = p_dev->function_config; - config->Function = p_dev->func; - } else { - c = NULL; - config->Function = 0; - } + c = (s->config != NULL) ? &s->config[function] : NULL; if ((c == NULL) || !(c->state & CONFIG_LOCKED)) { config->Attributes = 0; @@ -245,17 +251,10 @@ int pccard_get_configuration_info(struct pcmcia_socket *s, return CS_SUCCESS; } - 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; + /* !!! This is a hack !!! */ + memcpy(&config->Attributes, &c->Attributes, sizeof(config_t)); + config->Attributes |= CONF_VALID_CLIENT; + config->CardValues = c->CardValues; config->IRQAttributes = c->irq.Attributes; config->AssignedIRQ = s->irq.AssignedIRQ; config->BasePort1 = c->io.BasePort1; @@ -272,7 +271,7 @@ int pccard_get_configuration_info(struct pcmcia_socket *s, int pcmcia_get_configuration_info(struct pcmcia_device *p_dev, config_info_t *config) { - return pccard_get_configuration_info(p_dev->socket, p_dev, + return pccard_get_configuration_info(p_dev->socket, p_dev->func, config); } EXPORT_SYMBOL(pcmcia_get_configuration_info); @@ -318,7 +317,7 @@ EXPORT_SYMBOL(pcmcia_get_window); * SocketState yet: I haven't seen any point for it. */ -int pccard_get_status(struct pcmcia_socket *s, struct pcmcia_device *p_dev, +int pccard_get_status(struct pcmcia_socket *s, unsigned int function, cs_status_t *status) { config_t *c; @@ -335,12 +334,11 @@ int pccard_get_status(struct pcmcia_socket *s, struct pcmcia_device *p_dev, if (!(s->state & SOCKET_PRESENT)) return CS_NO_CARD; - c = (p_dev) ? p_dev->function_config : NULL; - + c = (s->config != NULL) ? &s->config[function] : NULL; if ((c != NULL) && (c->state & CONFIG_LOCKED) && (c->IntType & (INT_MEMORY_AND_IO | INT_ZOOMED_VIDEO))) { u_char reg; - if (c->CardValues & PRESENT_PIN_REPLACE) { + if (c->Present & PRESENT_PIN_REPLACE) { pcmcia_read_cis_mem(s, 1, (c->ConfigBase+CISREG_PRR)>>1, 1, ®); status->CardState |= (reg & PRR_WP_STATUS) ? CS_EVENT_WRITE_PROTECT : 0; @@ -354,7 +352,7 @@ int pccard_get_status(struct pcmcia_socket *s, struct pcmcia_device *p_dev, /* No PRR? Then assume we're always ready */ status->CardState |= CS_EVENT_READY_CHANGE; } - if (c->CardValues & PRESENT_EXT_STATUS) { + if (c->Present & PRESENT_EXT_STATUS) { pcmcia_read_cis_mem(s, 1, (c->ConfigBase+CISREG_ESR)>>1, 1, ®); status->CardState |= (reg & ESR_REQ_ATTN) ? CS_EVENT_REQUEST_ATTENTION : 0; @@ -372,9 +370,11 @@ int pccard_get_status(struct pcmcia_socket *s, struct pcmcia_device *p_dev, return CS_SUCCESS; } /* pccard_get_status */ -int pcmcia_get_status(struct pcmcia_device *p_dev, cs_status_t *status) +int pcmcia_get_status(client_handle_t handle, cs_status_t *status) { - return pccard_get_status(p_dev->socket, p_dev, status); + struct pcmcia_socket *s; + s = SOCKET(handle); + return pccard_get_status(s, handle->func, status); } EXPORT_SYMBOL(pcmcia_get_status); @@ -422,8 +422,7 @@ int pcmcia_modify_configuration(struct pcmcia_device *p_dev, config_t *c; s = p_dev->socket; - c = p_dev->function_config; - + c = CONFIG(p_dev); if (!(s->state & SOCKET_PRESENT)) return CS_NO_CARD; if (!(c->state & CONFIG_LOCKED)) @@ -455,28 +454,6 @@ int pcmcia_modify_configuration(struct pcmcia_device *p_dev, (mod->Attributes & CONF_VPP2_CHANGE_VALID)) return CS_BAD_VPP; - if (mod->Attributes & CONF_IO_CHANGE_WIDTH) { - pccard_io_map io_off = { 0, 0, 0, 0, 1 }; - pccard_io_map io_on; - int i; - - io_on.speed = io_speed; - for (i = 0; i < MAX_IO_WIN; i++) { - if (!s->io[i].res) - continue; - io_off.map = i; - io_on.map = i; - - io_on.flags = MAP_ACTIVE | IO_DATA_PATH_WIDTH_8; - io_on.start = s->io[i].res->start; - io_on.stop = s->io[i].res->end; - - s->ops->set_io_map(s, &io_off); - mdelay(40); - s->ops->set_io_map(s, &io_on); - } - } - return CS_SUCCESS; } /* modify_configuration */ EXPORT_SYMBOL(pcmcia_modify_configuration); @@ -486,23 +463,23 @@ int pcmcia_release_configuration(struct pcmcia_device *p_dev) { pccard_io_map io = { 0, 0, 0, 0, 1 }; struct pcmcia_socket *s = p_dev->socket; - config_t *c = p_dev->function_config; int i; - if (p_dev->_locked) { - p_dev->_locked = 0; + if (!(p_dev->state & CLIENT_CONFIG_LOCKED)) + return CS_BAD_HANDLE; + p_dev->state &= ~CLIENT_CONFIG_LOCKED; + + if (!(p_dev->state & CLIENT_STALE)) { + config_t *c = CONFIG(p_dev); if (--(s->lock_count) == 0) { s->socket.flags = SS_OUTPUT_ENA; /* Is this correct? */ s->socket.Vpp = 0; s->socket.io_irq = 0; s->ops->set_socket(s, &s->socket); } - } - if (c->state & CONFIG_LOCKED) { - c->state &= ~CONFIG_LOCKED; if (c->state & CONFIG_IO_REQ) for (i = 0; i < MAX_IO_WIN; i++) { - if (!s->io[i].res) + if (s->io[i].NumPorts == 0) continue; s->io[i].Config--; if (s->io[i].Config != 0) @@ -510,10 +487,12 @@ int pcmcia_release_configuration(struct pcmcia_device *p_dev) io.map = i; s->ops->set_io_map(s, &io); } + c->state &= ~CONFIG_LOCKED; } return CS_SUCCESS; } /* pcmcia_release_configuration */ +EXPORT_SYMBOL(pcmcia_release_configuration); /** pcmcia_release_io @@ -524,23 +503,25 @@ int pcmcia_release_configuration(struct pcmcia_device *p_dev) * don't bother checking the port ranges against the current socket * values. */ -static int pcmcia_release_io(struct pcmcia_device *p_dev, io_req_t *req) +int pcmcia_release_io(struct pcmcia_device *p_dev, io_req_t *req) { struct pcmcia_socket *s = p_dev->socket; - config_t *c = p_dev->function_config; - if (!p_dev->_io ) + if (!(p_dev->state & CLIENT_IO_REQ)) return CS_BAD_HANDLE; + p_dev->state &= ~CLIENT_IO_REQ; - p_dev->_io = 0; - - if ((c->io.BasePort1 != req->BasePort1) || - (c->io.NumPorts1 != req->NumPorts1) || - (c->io.BasePort2 != req->BasePort2) || - (c->io.NumPorts2 != req->NumPorts2)) - return CS_BAD_ARGS; - - c->state &= ~CONFIG_IO_REQ; + if (!(p_dev->state & CLIENT_STALE)) { + config_t *c = CONFIG(p_dev); + if (c->state & CONFIG_LOCKED) + return CS_CONFIGURATION_LOCKED; + if ((c->io.BasePort1 != req->BasePort1) || + (c->io.NumPorts1 != req->NumPorts1) || + (c->io.BasePort2 != req->BasePort2) || + (c->io.NumPorts2 != req->NumPorts2)) + return CS_BAD_ARGS; + c->state &= ~CONFIG_IO_REQ; + } release_io_space(s, req->BasePort1, req->NumPorts1); if (req->NumPorts2) @@ -548,26 +529,28 @@ static int pcmcia_release_io(struct pcmcia_device *p_dev, io_req_t *req) return CS_SUCCESS; } /* pcmcia_release_io */ +EXPORT_SYMBOL(pcmcia_release_io); -static int pcmcia_release_irq(struct pcmcia_device *p_dev, irq_req_t *req) +int pcmcia_release_irq(struct pcmcia_device *p_dev, irq_req_t *req) { struct pcmcia_socket *s = p_dev->socket; - config_t *c= p_dev->function_config; - - if (!p_dev->_irq) + if (!(p_dev->state & CLIENT_IRQ_REQ)) return CS_BAD_HANDLE; - p_dev->_irq = 0; - - if (c->state & CONFIG_LOCKED) - return CS_CONFIGURATION_LOCKED; - if (c->irq.Attributes != req->Attributes) - return CS_BAD_ATTRIBUTE; - if (s->irq.AssignedIRQ != req->AssignedIRQ) - return CS_BAD_IRQ; - if (--s->irq.Config == 0) { - c->state &= ~CONFIG_IRQ_REQ; - s->irq.AssignedIRQ = 0; + p_dev->state &= ~CLIENT_IRQ_REQ; + + if (!(p_dev->state & CLIENT_STALE)) { + config_t *c = CONFIG(p_dev); + if (c->state & CONFIG_LOCKED) + return CS_CONFIGURATION_LOCKED; + if (c->irq.Attributes != req->Attributes) + return CS_BAD_ATTRIBUTE; + if (s->irq.AssignedIRQ != req->AssignedIRQ) + return CS_BAD_IRQ; + if (--s->irq.Config == 0) { + c->state &= ~CONFIG_IRQ_REQ; + s->irq.AssignedIRQ = 0; + } } if (req->Attributes & IRQ_HANDLE_PRESENT) { @@ -580,6 +563,7 @@ static int pcmcia_release_irq(struct pcmcia_device *p_dev, irq_req_t *req) return CS_SUCCESS; } /* pcmcia_release_irq */ +EXPORT_SYMBOL(pcmcia_release_irq); int pcmcia_release_window(window_handle_t win) @@ -589,7 +573,7 @@ int pcmcia_release_window(window_handle_t win) if ((win == NULL) || (win->magic != WINDOW_MAGIC)) return CS_BAD_HANDLE; s = win->sock; - if (!(win->handle->_win & CLIENT_WIN_REQ(win->index))) + if (!(win->handle->state & CLIENT_WIN_REQ(win->index))) return CS_BAD_HANDLE; /* Shut down memory window */ @@ -603,7 +587,7 @@ int pcmcia_release_window(window_handle_t win) kfree(win->ctl.res); win->ctl.res = NULL; } - win->handle->_win &= ~CLIENT_WIN_REQ(win->index); + win->handle->state &= ~CLIENT_WIN_REQ(win->index); win->magic = 0; @@ -626,12 +610,16 @@ int pcmcia_request_configuration(struct pcmcia_device *p_dev, if (req->IntType & INT_CARDBUS) return CS_UNSUPPORTED_MODE; - c = p_dev->function_config; + c = CONFIG(p_dev); if (c->state & CONFIG_LOCKED) return CS_CONFIGURATION_LOCKED; /* Do power control. We don't allow changes in Vcc. */ - s->socket.Vpp = req->Vpp; + if (s->socket.Vcc != req->Vcc) + return CS_BAD_VCC; + if (req->Vpp1 != req->Vpp2) + return CS_BAD_VPP; + s->socket.Vpp = req->Vpp1; if (s->ops->set_socket(s, &s->socket)) return CS_BAD_VPP; @@ -655,7 +643,7 @@ int pcmcia_request_configuration(struct pcmcia_device *p_dev, /* Set up CIS configuration registers */ base = c->ConfigBase = req->ConfigBase; - c->CardValues = req->Present; + c->Present = c->CardValues = req->Present; if (req->Present & PRESENT_COPY) { c->Copy = req->Copy; pcmcia_write_cis_mem(s, 1, (base + CISREG_SCR)>>1, 1, &c->Copy); @@ -702,10 +690,10 @@ int pcmcia_request_configuration(struct pcmcia_device *p_dev, if (c->state & CONFIG_IO_REQ) { iomap.speed = io_speed; for (i = 0; i < MAX_IO_WIN; i++) - if (s->io[i].res) { + if (s->io[i].NumPorts != 0) { iomap.map = i; iomap.flags = MAP_ACTIVE; - switch (s->io[i].res->flags & IO_DATA_PATH_WIDTH) { + switch (s->io[i].Attributes & IO_DATA_PATH_WIDTH) { case IO_DATA_PATH_WIDTH_16: iomap.flags |= MAP_16BIT; break; case IO_DATA_PATH_WIDTH_AUTO: @@ -713,15 +701,15 @@ int pcmcia_request_configuration(struct pcmcia_device *p_dev, default: break; } - iomap.start = s->io[i].res->start; - iomap.stop = s->io[i].res->end; + iomap.start = s->io[i].BasePort; + iomap.stop = iomap.start + s->io[i].NumPorts - 1; s->ops->set_io_map(s, &iomap); s->io[i].Config++; } } c->state |= CONFIG_LOCKED; - p_dev->_locked = 1; + p_dev->state |= CLIENT_CONFIG_LOCKED; return CS_SUCCESS; } /* pcmcia_request_configuration */ EXPORT_SYMBOL(pcmcia_request_configuration); @@ -742,7 +730,7 @@ int pcmcia_request_io(struct pcmcia_device *p_dev, io_req_t *req) if (!req) return CS_UNSUPPORTED_MODE; - c = p_dev->function_config; + c = CONFIG(p_dev); if (c->state & CONFIG_LOCKED) return CS_CONFIGURATION_LOCKED; if (c->state & CONFIG_IO_REQ) @@ -767,7 +755,7 @@ int pcmcia_request_io(struct pcmcia_device *p_dev, io_req_t *req) c->io = *req; c->state |= CONFIG_IO_REQ; - p_dev->_io = 1; + p_dev->state |= CLIENT_IO_REQ; return CS_SUCCESS; } /* pcmcia_request_io */ EXPORT_SYMBOL(pcmcia_request_io); @@ -795,23 +783,15 @@ 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; - c = p_dev->function_config; + c = CONFIG(p_dev); if (c->state & CONFIG_LOCKED) return CS_CONFIGURATION_LOCKED; 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 */ @@ -837,7 +817,9 @@ 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, - type, + ((req->Attributes & IRQ_TYPE_DYNAMIC_SHARING) || + (s->functions > 1) || + (irq == s->pci_irq)) ? SA_SHIRQ : 0, p_dev->devname, (req->Attributes & IRQ_HANDLE_PRESENT) ? req->Instance : data); if (!ret) { @@ -852,27 +834,24 @@ 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, type, p_dev->devname, req->Instance)) + 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)) 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++; c->state |= CONFIG_IRQ_REQ; - p_dev->_irq = 1; + p_dev->state |= CLIENT_IRQ_REQ; #ifdef CONFIG_PCMCIA_PROBE pcmcia_used_irq[irq]++; @@ -932,7 +911,7 @@ int pcmcia_request_window(struct pcmcia_device **p_dev, win_req_t *req, window_h if (!win->ctl.res) return CS_IN_USE; } - (*p_dev)->_win |= CLIENT_WIN_REQ(w); + (*p_dev)->state |= CLIENT_WIN_REQ(w); /* Configure the socket controller */ win->ctl.map = w+1; @@ -962,12 +941,3 @@ int pcmcia_request_window(struct pcmcia_device **p_dev, win_req_t *req, window_h return CS_SUCCESS; } /* pcmcia_request_window */ EXPORT_SYMBOL(pcmcia_request_window); - -void pcmcia_disable_device(struct pcmcia_device *p_dev) { - pcmcia_release_configuration(p_dev); - pcmcia_release_io(p_dev, &p_dev->io); - pcmcia_release_irq(p_dev, &p_dev->irq); - if (&p_dev->win) - pcmcia_release_window(p_dev->win); -} -EXPORT_SYMBOL(pcmcia_disable_device); diff --git a/drivers/pcmcia/pd6729.c b/drivers/pcmcia/pd6729.c index 22c5e7427..f2789afb2 100644 --- a/drivers/pcmcia/pd6729.c +++ b/drivers/pcmcia/pd6729.c @@ -8,6 +8,7 @@ */ #include +#include #include #include #include @@ -589,7 +590,7 @@ static int pd6729_check_irq(int irq, int flags) return 0; } -static u_int __devinit pd6729_isa_scan(void) +static u_int __init pd6729_isa_scan(void) { u_int mask0, mask = 0; int i; @@ -642,8 +643,7 @@ static int __devinit pd6729_pci_probe(struct pci_dev *dev, goto err_out_free_mem; printk(KERN_INFO "pd6729: Cirrus PD6729 PCI to PCMCIA Bridge " - "at 0x%llx on irq %d\n", - (unsigned long long)pci_resource_start(dev, 0), dev->irq); + "at 0x%lx on irq %d\n", 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. @@ -689,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, IRQF_SHARED, + if ((ret = request_irq(dev->irq, pd6729_interrupt, SA_SHIRQ, "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 b3518131e..7fa18fb81 100644 --- a/drivers/pcmcia/pxa2xx_base.c +++ b/drivers/pcmcia/pxa2xx_base.c @@ -18,6 +18,7 @@ #include #include +#include #include #include #include diff --git a/drivers/pcmcia/pxa2xx_sharpsl.c b/drivers/pcmcia/pxa2xx_sharpsl.c index b7b9e149c..fd3647368 100644 --- a/drivers/pcmcia/pxa2xx_sharpsl.c +++ b/drivers/pcmcia/pxa2xx_sharpsl.c @@ -26,6 +26,14 @@ #include "soc_common.h" #define NO_KEEP_VS 0x0001 + +/* PCMCIA to Scoop linkage + + There is no easy way to link multiple scoop devices into one + single entity for the pxa2xx_pcmcia device so this structure + is used which is setup by the platform code +*/ +struct scoop_pcmcia_config *platform_scoop_config; #define SCOOP_DEV platform_scoop_config->devs static void sharpsl_pcmcia_init_reset(struct soc_pcmcia_socket *skt) diff --git a/drivers/pcmcia/rsrc_mgr.c b/drivers/pcmcia/rsrc_mgr.c index 81dfc2cac..514609369 100644 --- a/drivers/pcmcia/rsrc_mgr.c +++ b/drivers/pcmcia/rsrc_mgr.c @@ -12,6 +12,7 @@ * (C) 1999 David A. Hinds */ +#include #include #include @@ -21,8 +22,6 @@ #include "cs_internal.h" -#ifdef CONFIG_PCMCIA_IOCTL - #ifdef CONFIG_PCMCIA_PROBE static int adjust_irq(struct pcmcia_socket *s, adjust_t *adj) @@ -99,8 +98,6 @@ int pcmcia_adjust_resource_info(adjust_t *adj) } EXPORT_SYMBOL(pcmcia_adjust_resource_info); -#endif - int pcmcia_validate_mem(struct pcmcia_socket *s) { if (s->resource_ops->validate_mem) diff --git a/drivers/pcmcia/rsrc_nonstatic.c b/drivers/pcmcia/rsrc_nonstatic.c index c3176b16b..5301ac603 100644 --- a/drivers/pcmcia/rsrc_nonstatic.c +++ b/drivers/pcmcia/rsrc_nonstatic.c @@ -12,6 +12,7 @@ * (C) 1999 David A. Hinds */ +#include #include #include #include @@ -60,7 +61,7 @@ struct socket_data { unsigned int rsrc_mem_probe; }; -static DEFINE_MUTEX(rsrc_mutex); +static DECLARE_MUTEX(rsrc_sem); #define MEM_PROBE_LOW (1 << 0) #define MEM_PROBE_HIGH (1 << 1) @@ -72,7 +73,7 @@ static DEFINE_MUTEX(rsrc_mutex); ======================================================================*/ static struct resource * -make_resource(resource_size_t b, resource_size_t n, int flags, char *name) +make_resource(unsigned long b, unsigned long n, int flags, char *name) { struct resource *res = kzalloc(sizeof(*res), GFP_KERNEL); @@ -86,8 +87,8 @@ make_resource(resource_size_t b, resource_size_t n, int flags, char *name) } static struct resource * -claim_region(struct pcmcia_socket *s, resource_size_t base, - resource_size_t size, int type, char *name) +claim_region(struct pcmcia_socket *s, unsigned long base, unsigned long size, + int type, char *name) { struct resource *res, *parent; @@ -483,7 +484,7 @@ static int validate_mem(struct pcmcia_socket *s, unsigned int probe_mask) /* - * Locking note: Must be called with skt_mutex held! + * Locking note: Must be called with skt_sem held! */ static int pcmcia_nonstatic_validate_mem(struct pcmcia_socket *s) { @@ -494,7 +495,7 @@ static int pcmcia_nonstatic_validate_mem(struct pcmcia_socket *s) if (!probe_mem) return 0; - mutex_lock(&rsrc_mutex); + down(&rsrc_sem); if (s->features & SS_CAP_PAGE_REGS) probe_mask = MEM_PROBE_HIGH; @@ -506,7 +507,7 @@ static int pcmcia_nonstatic_validate_mem(struct pcmcia_socket *s) s_data->rsrc_mem_probe |= probe_mask; } - mutex_unlock(&rsrc_mutex); + up(&rsrc_sem); return ret; } @@ -519,10 +520,10 @@ struct pcmcia_align_data { static void pcmcia_common_align(void *align_data, struct resource *res, - resource_size_t size, resource_size_t align) + unsigned long size, unsigned long align) { struct pcmcia_align_data *data = align_data; - resource_size_t start; + unsigned long start; /* * Ensure that we have the correct start address */ @@ -533,8 +534,8 @@ pcmcia_common_align(void *align_data, struct resource *res, } static void -pcmcia_align(void *align_data, struct resource *res, resource_size_t size, - resource_size_t align) +pcmcia_align(void *align_data, struct resource *res, + unsigned long size, unsigned long align) { struct pcmcia_align_data *data = align_data; struct resource_map *m; @@ -584,7 +585,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; - mutex_lock(&rsrc_mutex); + down(&rsrc_sem); 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; @@ -595,7 +596,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; } - mutex_unlock(&rsrc_mutex); + up(&rsrc_sem); return ret; } @@ -629,7 +630,7 @@ static struct resource *nonstatic_find_io_region(unsigned long base, int num, data.offset = base & data.mask; data.map = &s_data->io_db; - mutex_lock(&rsrc_mutex); + down(&rsrc_sem); #ifdef CONFIG_PCI if (s->cb_dev) { ret = pci_bus_alloc_resource(s->cb_dev->bus, res, num, 1, @@ -638,7 +639,7 @@ static 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); - mutex_unlock(&rsrc_mutex); + up(&rsrc_sem); if (ret != 0) { kfree(res); @@ -671,7 +672,7 @@ static struct resource * nonstatic_find_mem_region(u_long base, u_long num, min = 0x100000UL + base; } - mutex_lock(&rsrc_mutex); + down(&rsrc_sem); #ifdef CONFIG_PCI if (s->cb_dev) { ret = pci_bus_alloc_resource(s->cb_dev->bus, res, num, @@ -681,7 +682,7 @@ static struct resource * nonstatic_find_mem_region(u_long base, u_long num, #endif ret = allocate_resource(&iomem_resource, res, num, min, max, 1, pcmcia_align, &data); - mutex_unlock(&rsrc_mutex); + up(&rsrc_sem); if (ret == 0 || low) break; low = 1; @@ -704,7 +705,7 @@ static int adjust_memory(struct pcmcia_socket *s, unsigned int action, unsigned if (end < start) return -EINVAL; - mutex_lock(&rsrc_mutex); + down(&rsrc_sem); switch (action) { case ADD_MANAGED_RESOURCE: ret = add_interval(&data->mem_db, start, size); @@ -722,7 +723,7 @@ static int adjust_memory(struct pcmcia_socket *s, unsigned int action, unsigned default: ret = -EINVAL; } - mutex_unlock(&rsrc_mutex); + up(&rsrc_sem); return ret; } @@ -740,7 +741,7 @@ static int adjust_io(struct pcmcia_socket *s, unsigned int action, unsigned long if (end > IO_SPACE_LIMIT) return -EINVAL; - mutex_lock(&rsrc_mutex); + down(&rsrc_sem); switch (action) { case ADD_MANAGED_RESOURCE: if (add_interval(&data->io_db, start, size) != 0) { @@ -759,7 +760,7 @@ static int adjust_io(struct pcmcia_socket *s, unsigned int action, unsigned long ret = -EINVAL; break; } - mutex_unlock(&rsrc_mutex); + up(&rsrc_sem); return ret; } @@ -808,10 +809,8 @@ static int nonstatic_autoadd_resources(struct pcmcia_socket *s) 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); + printk(KERN_INFO "pcmcia: parent PCI bridge I/O window: 0x%lx - 0x%lx\n", + res->start, res->end); if (!adjust_io(s, ADD_MANAGED_RESOURCE, res->start, res->end)) done |= IORESOURCE_IO; @@ -820,10 +819,8 @@ static int nonstatic_autoadd_resources(struct pcmcia_socket *s) 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); + printk(KERN_INFO "pcmcia: parent PCI bridge Memory window: 0x%lx - 0x%lx\n", + res->start, res->end); if (!adjust_memory(s, ADD_MANAGED_RESOURCE, res->start, res->end)) done |= IORESOURCE_MEM; } @@ -870,7 +867,7 @@ static void nonstatic_release_resource_db(struct pcmcia_socket *s) struct socket_data *data = s->resource_data; struct resource_map *p, *q; - mutex_lock(&rsrc_mutex); + down(&rsrc_sem); for (p = data->mem_db.next; p != &data->mem_db; p = q) { q = p->next; kfree(p); @@ -879,7 +876,7 @@ static void nonstatic_release_resource_db(struct pcmcia_socket *s) q = p->next; kfree(p); } - mutex_unlock(&rsrc_mutex); + up(&rsrc_sem); } @@ -904,7 +901,7 @@ static ssize_t show_io_db(struct class_device *class_dev, char *buf) struct resource_map *p; ssize_t ret = 0; - mutex_lock(&rsrc_mutex); + down(&rsrc_sem); data = s->resource_data; for (p = data->io_db.next; p != &data->io_db; p = p->next) { @@ -916,7 +913,7 @@ static ssize_t show_io_db(struct class_device *class_dev, char *buf) ((unsigned long) p->base + p->num - 1)); } - mutex_unlock(&rsrc_mutex); + up(&rsrc_sem); return (ret); } @@ -956,7 +953,7 @@ static ssize_t show_mem_db(struct class_device *class_dev, char *buf) struct resource_map *p; ssize_t ret = 0; - mutex_lock(&rsrc_mutex); + down(&rsrc_sem); data = s->resource_data; for (p = data->mem_db.next; p != &data->mem_db; p = p->next) { @@ -968,7 +965,7 @@ static ssize_t show_mem_db(struct class_device *class_dev, char *buf) ((unsigned long) p->base + p->num - 1)); } - mutex_unlock(&rsrc_mutex); + up(&rsrc_sem); return (ret); } diff --git a/drivers/pcmcia/sa1100_badge4.c b/drivers/pcmcia/sa1100_badge4.c index 19b1e1276..c6b262b65 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, - .hw_init = sa1111_pcmcia_hw_init, - .hw_shutdown = sa1111_pcmcia_hw_shutdown, + .init = sa1111_pcmcia_hw_init, + .shutdown = sa1111_pcmcia_hw_shutdown, .socket_state = sa1111_pcmcia_socket_state, .configure_socket = badge4_pcmcia_configure_socket, diff --git a/drivers/pcmcia/sa1100_cerf.c b/drivers/pcmcia/sa1100_cerf.c index eb89928f2..2b3c2895b 100644 --- a/drivers/pcmcia/sa1100_cerf.c +++ b/drivers/pcmcia/sa1100_cerf.c @@ -5,6 +5,7 @@ * Based off the Assabet. * */ +#include #include #include #include diff --git a/drivers/pcmcia/sa1100_generic.c b/drivers/pcmcia/sa1100_generic.c index c5b2a44b4..6d441ec75 100644 --- a/drivers/pcmcia/sa1100_generic.c +++ b/drivers/pcmcia/sa1100_generic.c @@ -32,6 +32,7 @@ #include #include +#include #include #include diff --git a/drivers/pcmcia/sa1111_generic.c b/drivers/pcmcia/sa1111_generic.c index 658cddfbc..81ded52c8 100644 --- a/drivers/pcmcia/sa1111_generic.c +++ b/drivers/pcmcia/sa1111_generic.c @@ -5,6 +5,7 @@ * 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 31a7abc55..59c5d968e 100644 --- a/drivers/pcmcia/sa11xx_base.c +++ b/drivers/pcmcia/sa11xx_base.c @@ -32,6 +32,7 @@ #include #include +#include #include #include #include diff --git a/drivers/pcmcia/soc_common.c b/drivers/pcmcia/soc_common.c index ecaa132fa..ea7d9ca16 100644 --- a/drivers/pcmcia/soc_common.c +++ b/drivers/pcmcia/soc_common.c @@ -31,6 +31,7 @@ ======================================================================*/ +#include #include #include #include @@ -38,12 +39,12 @@ #include #include #include -#include #include #include #include #include +#include #include #include "soc_common.h" @@ -523,7 +524,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, - IRQF_DISABLED, irqs[i].str, skt); + SA_INTERRUPT, irqs[i].str, skt); if (res) break; set_irq_type(irqs[i].irq, IRQT_NOEDGE); diff --git a/drivers/pcmcia/socket_sysfs.c b/drivers/pcmcia/socket_sysfs.c index c5d7476da..5ab1cdef7 100644 --- a/drivers/pcmcia/socket_sysfs.c +++ b/drivers/pcmcia/socket_sysfs.c @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -24,7 +25,6 @@ #include #include #include -#include #include #include @@ -183,7 +183,7 @@ static ssize_t pccard_store_resource(struct class_device *dev, const char *buf, s->resource_setup_done = 1; spin_unlock_irqrestore(&s->lock, flags); - mutex_lock(&s->skt_mutex); + down(&s->skt_sem); if ((s->callback) && (s->state & SOCKET_PRESENT) && !(s->state & SOCKET_CARDBUS)) { @@ -192,7 +192,7 @@ static ssize_t pccard_store_resource(struct class_device *dev, const char *buf, module_put(s->callback->owner); } } - mutex_unlock(&s->skt_mutex); + up(&s->skt_sem); return count; } @@ -322,7 +322,7 @@ static ssize_t pccard_store_cis(struct kobject *kobj, char *buf, loff_t off, siz kfree(cis); if (!ret) { - mutex_lock(&s->skt_mutex); + down(&s->skt_sem); if ((s->callback) && (s->state & SOCKET_PRESENT) && !(s->state & SOCKET_CARDBUS)) { if (try_module_get(s->callback->owner)) { @@ -330,7 +330,7 @@ static ssize_t pccard_store_cis(struct kobject *kobj, char *buf, loff_t off, siz module_put(s->callback->owner); } } - mutex_unlock(&s->skt_mutex); + up(&s->skt_sem); } diff --git a/drivers/pcmcia/tcic.c b/drivers/pcmcia/tcic.c index 65a606716..73bad1d5c 100644 --- a/drivers/pcmcia/tcic.c +++ b/drivers/pcmcia/tcic.c @@ -756,9 +756,8 @@ 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, " - "%#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); + "%#lx-%#lx, %#x)\n", psock, mem->map, mem->flags, + mem->speed, mem->res->start, 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 62e9ebf96..d5b4ff744 100644 --- a/drivers/pcmcia/ti113x.h +++ b/drivers/pcmcia/ti113x.h @@ -30,6 +30,7 @@ #ifndef _LINUX_TI113X_H #define _LINUX_TI113X_H +#include /* Register definitions for TI 113X PCI-to-CardBus bridges */ @@ -647,7 +648,6 @@ 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 e076a13db..0574efd78 100644 --- a/drivers/pcmcia/vrc4171_card.c +++ b/drivers/pcmcia/vrc4171_card.c @@ -634,7 +634,7 @@ static void vrc4171_remove_sockets(void) static int __devinit vrc4171_card_setup(char *options) { if (options == NULL || *options == '\0') - return 1; + return 0; if (strncmp(options, "irq:", 4) == 0) { int irq; @@ -644,7 +644,7 @@ static int __devinit vrc4171_card_setup(char *options) vrc4171_irq = irq; if (*options != ',') - return 1; + return 0; options++; } @@ -663,10 +663,10 @@ static int __devinit vrc4171_card_setup(char *options) } if (*options != ',') - return 1; + return 0; options++; } else - return 1; + return 0; } @@ -688,7 +688,7 @@ static int __devinit vrc4171_card_setup(char *options) } if (*options != ',') - return 1; + return 0; options++; if (strncmp(options, "memnoprobe", 10) == 0) @@ -700,7 +700,7 @@ static int __devinit vrc4171_card_setup(char *options) } } - return 1; + return 0; } __setup("vrc4171_card=", vrc4171_card_setup); @@ -730,7 +730,7 @@ static int __devinit vrc4171_card_init(void) retval = vrc4171_add_sockets(); if (retval == 0) - retval = request_irq(vrc4171_irq, pccard_interrupt, IRQF_SHARED, + retval = request_irq(vrc4171_irq, pccard_interrupt, SA_SHIRQ, vrc4171_card_name, vrc4171_sockets); if (retval < 0) { diff --git a/drivers/pcmcia/vrc4173_cardu.c b/drivers/pcmcia/vrc4173_cardu.c index d19a91381..57f38dba0 100644 --- a/drivers/pcmcia/vrc4173_cardu.c +++ b/drivers/pcmcia/vrc4173_cardu.c @@ -500,7 +500,7 @@ static int __devinit vrc4173_cardu_probe(struct pci_dev *dev, return -ENOMEM; } - if (request_irq(dev->irq, cardu_interrupt, IRQF_SHARED, socket->name, socket) < 0) { + if (request_irq(dev->irq, cardu_interrupt, SA_SHIRQ, socket->name, socket) < 0) { pcmcia_unregister_socket(socket->pcmcia_socket); socket->pcmcia_socket = NULL; iounmap(socket->base); @@ -516,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 1; + return 0; if (strncmp(options, "cardu1:", 7) == 0) { options += 7; @@ -527,9 +527,9 @@ static int __devinit vrc4173_cardu_setup(char *options) } if (*options != ',') - return 1; + return 0; } else - return 1; + return 0; } if (strncmp(options, "cardu2:", 7) == 0) { @@ -538,7 +538,7 @@ static int __devinit vrc4173_cardu_setup(char *options) cardu_sockets[CARDU2].noprobe = 1; } - return 1; + return 0; } __setup("vrc4173_cardu=", vrc4173_cardu_setup); diff --git a/drivers/pcmcia/yenta_socket.c b/drivers/pcmcia/yenta_socket.c index 134474638..4145eb83b 100644 --- a/drivers/pcmcia/yenta_socket.c +++ b/drivers/pcmcia/yenta_socket.c @@ -287,10 +287,7 @@ 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; - /* if powering down: do it immediately */ - if (state->Vcc == 0) - yenta_set_power(socket, state); - + 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) { @@ -342,10 +339,6 @@ 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; } @@ -923,7 +916,7 @@ static int yenta_probe_cb_irq(struct yenta_socket *socket) socket->probe_status = 0; - if (request_irq(socket->cb_irq, yenta_probe_handler, IRQF_SHARED, "yenta", socket)) { + if (request_irq(socket->cb_irq, yenta_probe_handler, SA_SHIRQ, "yenta", socket)) { printk(KERN_WARNING "Yenta: request_irq() in yenta_probe_cb_irq() failed!\n"); return -1; } @@ -1005,77 +998,6 @@ 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 @@ -1172,7 +1094,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, IRQF_SHARED, "yenta", socket)) { + if (!socket->cb_irq || request_irq(socket->cb_irq, yenta_interrupt, SA_SHIRQ, "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); @@ -1191,8 +1113,6 @@ 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) { @@ -1312,7 +1232,6 @@ 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 227600cd6..b68eef251 100644 --- a/drivers/pnp/card.c +++ b/drivers/pnp/card.c @@ -5,6 +5,7 @@ * */ +#include #include #include #include @@ -46,7 +47,7 @@ static void card_remove(struct pnp_dev * dev) { dev->card_link = NULL; } - + static void card_remove_first(struct pnp_dev * dev) { struct pnp_card_driver * drv = to_pnp_card_driver(dev->driver); @@ -59,34 +60,30 @@ 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; - 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); + 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; } - kfree(clink); return 0; } @@ -364,7 +361,7 @@ static int card_resume(struct pnp_dev *dev) int pnp_register_card_driver(struct pnp_card_driver * drv) { - int error; + int count; struct list_head *pos, *temp; drv->link.name = drv->name; @@ -375,19 +372,21 @@ int pnp_register_card_driver(struct pnp_card_driver * drv) drv->link.suspend = drv->suspend ? card_suspend : NULL; drv->link.resume = drv->resume ? card_resume : NULL; - error = pnp_register_driver(&drv->link); - if (error < 0) - return error; + count = pnp_register_driver(&drv->link); + if (count < 0) + return count; spin_lock(&pnp_lock); list_add_tail(&drv->global_list, &pnp_card_drivers); spin_unlock(&pnp_lock); + count = 0; + list_for_each_safe(pos,temp,&pnp_cards){ struct pnp_card *card = list_entry(pos, struct pnp_card, global_list); - card_probe(card,drv); + count += card_probe(card,drv); } - return 0; + return count; } /** diff --git a/drivers/pnp/driver.c b/drivers/pnp/driver.c index e161423b4..7cafacdd1 100644 --- a/drivers/pnp/driver.c +++ b/drivers/pnp/driver.c @@ -5,6 +5,7 @@ * */ +#include #include #include #include @@ -200,14 +201,31 @@ struct bus_type pnp_bus_type = { .resume = pnp_bus_resume, }; + +static int count_devices(struct device * dev, void * c) +{ + int * count = c; + (*count)++; + return 0; +} + int pnp_register_driver(struct pnp_driver *drv) { + int count; + pnp_dbg("the driver '%s' has been registered", drv->name); drv->driver.name = drv->name; drv->driver.bus = &pnp_bus_type; - return driver_register(&drv->driver); + count = driver_register(&drv->driver); + + /* get the number of initial matches */ + if (count >= 0){ + count = 0; + driver_for_each_device(&drv->driver, NULL, &count, count_devices); + } + return count; } void pnp_unregister_driver(struct pnp_driver *drv) diff --git a/drivers/pnp/interface.c b/drivers/pnp/interface.c index 9d8b415ec..a2d8ce7fe 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%llx-0x%llx\n", - (unsigned long long)pnp_port_start(dev, i), - (unsigned long long)pnp_port_end(dev, i)); + pnp_printf(buffer," 0x%lx-0x%lx\n", + pnp_port_start(dev, i), + 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%llx-0x%llx\n", - (unsigned long long)pnp_mem_start(dev, i), - (unsigned long long)pnp_mem_end(dev, i)); + pnp_printf(buffer," 0x%lx-0x%lx\n", + pnp_mem_start(dev, i), + 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," %lld\n", - (unsigned long long)pnp_irq(dev, i)); + pnp_printf(buffer," %ld\n", + 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," %lld\n", - (unsigned long long)pnp_dma(dev, i)); + pnp_printf(buffer," %ld\n", + pnp_dma(dev, i)); } } ret = (buffer->curr - buf); diff --git a/drivers/pnp/isapnp/compat.c b/drivers/pnp/isapnp/compat.c index 0697ab88a..3ff7e76b3 100644 --- a/drivers/pnp/isapnp/compat.c +++ b/drivers/pnp/isapnp/compat.c @@ -8,6 +8,7 @@ /* 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 3ac5b1232..57fd60314 100644 --- a/drivers/pnp/isapnp/core.c +++ b/drivers/pnp/isapnp/core.c @@ -34,6 +34,7 @@ * 2003-08-11 Resource Management Updates - Adam Belay */ +#include #include #include #include @@ -41,7 +42,6 @@ #include #include #include -#include #include #if 0 @@ -92,7 +92,7 @@ MODULE_LICENSE("GPL"); #define _LTAG_FIXEDMEM32RANGE 0x86 static unsigned char isapnp_checksum_value; -static DEFINE_MUTEX(isapnp_cfg_mutex); +static DECLARE_MUTEX(isapnp_cfg_mutex); static int isapnp_detected; static int isapnp_csn_count; @@ -646,10 +646,8 @@ static int __init isapnp_create_device(struct pnp_card *card, size = 0; skip = 0; option = pnp_register_independent_option(dev); - if (!option) { - kfree(dev); + if (!option) return 1; - } pnp_add_card_device(card,dev); } else { skip = 1; @@ -903,7 +901,7 @@ int isapnp_cfg_begin(int csn, int logdev) { if (csn < 1 || csn > isapnp_csn_count || logdev > 10) return -EINVAL; - mutex_lock(&isapnp_cfg_mutex); + down(&isapnp_cfg_mutex); isapnp_wait(); isapnp_key(); isapnp_wake(csn); @@ -929,7 +927,7 @@ int isapnp_cfg_begin(int csn, int logdev) int isapnp_cfg_end(void) { isapnp_wait(); - mutex_unlock(&isapnp_cfg_mutex); + up(&isapnp_cfg_mutex); return 0; } @@ -1049,10 +1047,6 @@ 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 958c11bed..cf54b0a36 100644 --- a/drivers/pnp/isapnp/proc.c +++ b/drivers/pnp/isapnp/proc.c @@ -19,6 +19,7 @@ * */ +#include #include #include #include diff --git a/drivers/pnp/manager.c b/drivers/pnp/manager.c index 5026b345c..c4256aa32 100644 --- a/drivers/pnp/manager.c +++ b/drivers/pnp/manager.c @@ -6,6 +6,7 @@ * */ +#include #include #include #include @@ -19,8 +20,7 @@ DECLARE_MUTEX(pnp_res_mutex); static int pnp_assign_port(struct pnp_dev *dev, struct pnp_port *rule, int idx) { - resource_size_t *start, *end; - unsigned long *flags; + unsigned long *start, *end, *flags; if (!dev || !rule) return -EINVAL; @@ -63,8 +63,7 @@ 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) { - resource_size_t *start, *end; - unsigned long *flags; + unsigned long *start, *end, *flags; if (!dev || !rule) return -EINVAL; @@ -117,8 +116,7 @@ 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) { - resource_size_t *start, *end; - unsigned long *flags; + unsigned long *start, *end, *flags; int i; /* IRQ priority: this table is good for i386 */ @@ -170,8 +168,7 @@ 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) { - resource_size_t *start, *end; - unsigned long *flags; + unsigned long *start, *end, *flags; int i; /* DMA priority: this table is good for i386 */ @@ -482,7 +479,7 @@ int pnp_auto_config_dev(struct pnp_dev *dev) int pnp_start_dev(struct pnp_dev *dev) { if (!pnp_can_write(dev)) { - pnp_info("Device %s does not support activation.", dev->dev.bus_id); + pnp_info("Device %s does not supported activation.", dev->dev.bus_id); return -EINVAL; } @@ -506,7 +503,7 @@ int pnp_start_dev(struct pnp_dev *dev) int pnp_stop_dev(struct pnp_dev *dev) { if (!pnp_can_disable(dev)) { - pnp_info("Device %s does not support disabling.", dev->dev.bus_id); + pnp_info("Device %s does not supported disabling.", dev->dev.bus_id); return -EINVAL; } if (dev->protocol->disable(dev)<0) { @@ -585,8 +582,7 @@ int pnp_disable_dev(struct pnp_dev *dev) * @size: size of region * */ -void pnp_resource_change(struct resource *resource, resource_size_t start, - resource_size_t size) +void pnp_resource_change(struct resource *resource, unsigned long start, unsigned long size) { if (resource == NULL) return; diff --git a/drivers/pnp/pnpacpi/core.c b/drivers/pnp/pnpacpi/core.c index 6cf34a63c..f104577f7 100644 --- a/drivers/pnp/pnpacpi/core.c +++ b/drivers/pnp/pnpacpi/core.c @@ -19,6 +19,7 @@ * 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 dc79b0a00..407b4eadd 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, int shareable) +pnpacpi_parse_allocated_irqresource(struct pnp_resource_table * res, u32 gsi, + int triggering, int polarity) { int i = 0; int irq; @@ -95,16 +95,13 @@ 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 && @@ -122,8 +119,8 @@ pnpacpi_parse_allocated_dmaresource(struct pnp_resource_table *res, u32 dma) } static void -pnpacpi_parse_allocated_ioresource(struct pnp_resource_table *res, - u64 io, u64 len) +pnpacpi_parse_allocated_ioresource(struct pnp_resource_table * res, + u32 io, u32 len) { int i = 0; while (!(res->port_resource[i].flags & IORESOURCE_UNSET) && @@ -141,7 +138,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; @@ -159,35 +156,11 @@ 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) { @@ -200,8 +173,7 @@ 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.sharable); + res->data.irq.polarity); } break; @@ -249,26 +221,30 @@ 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_address_space(res_table, res); + pnpacpi_parse_allocated_memresource(res_table, + res->data.address64.minimum, + res->data.address64.address_length); 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.sharable); + res->data.extended_irq.polarity); } break; @@ -279,11 +255,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); @@ -341,17 +317,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); @@ -371,7 +347,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; @@ -392,7 +368,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; @@ -405,7 +381,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; } @@ -413,7 +389,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; @@ -424,7 +400,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; } @@ -432,7 +408,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; @@ -447,7 +423,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; } @@ -455,7 +431,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; @@ -470,7 +446,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; } @@ -478,7 +454,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; @@ -492,7 +468,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; } @@ -501,8 +477,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)) { @@ -522,7 +498,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) @@ -531,7 +507,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); } } @@ -555,7 +531,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: @@ -563,7 +539,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; @@ -579,7 +555,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: @@ -639,7 +615,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; } @@ -660,8 +636,13 @@ acpi_status pnpacpi_parse_resource_option_data(acpi_handle handle, return status; } -static int pnpacpi_supported_resource(struct acpi_resource *res) +/* + * Set resource + */ +static acpi_status pnpacpi_count_resources(struct acpi_resource *res, + void *data) { + int *res_cnt = (int *)data; switch (res->type) { case ACPI_RESOURCE_TYPE_IRQ: case ACPI_RESOURCE_TYPE_DMA: @@ -674,32 +655,43 @@ static int pnpacpi_supported_resource(struct acpi_resource *res) case ACPI_RESOURCE_TYPE_ADDRESS32: case ACPI_RESOURCE_TYPE_ADDRESS64: case ACPI_RESOURCE_TYPE_EXTENDED_IRQ: - return 1; + (*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 0; -} - -/* - * Set resource - */ -static acpi_status pnpacpi_count_resources(struct acpi_resource *res, - void *data) -{ - 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) +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)) { + 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: (*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; @@ -743,8 +735,11 @@ static void pnpacpi_encode_irq(struct acpi_resource *resource, struct resource *p) { int triggering, polarity; - - decode_irq_flags(p->flags & IORESOURCE_BITS, &triggering, &polarity); + + decode_irq_flags(p->flags & IORESOURCE_BITS, &triggering, + &polarity); + resource->type = ACPI_RESOURCE_TYPE_IRQ; + resource->length = sizeof(struct acpi_resource); resource->data.irq.triggering = triggering; resource->data.irq.polarity = polarity; if (triggering == ACPI_EDGE_SENSITIVE) @@ -759,8 +754,11 @@ 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); + + decode_irq_flags(p->flags & IORESOURCE_BITS, &triggering, + &polarity); + resource->type = ACPI_RESOURCE_TYPE_EXTENDED_IRQ; + resource->length = sizeof(struct acpi_resource); resource->data.extended_irq.producer_consumer = ACPI_CONSUMER; resource->data.extended_irq.triggering = triggering; resource->data.extended_irq.polarity = polarity; @@ -775,6 +773,8 @@ 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,6 +798,8 @@ 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; @@ -810,6 +812,8 @@ 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; } @@ -817,6 +821,8 @@ 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) ? @@ -830,6 +836,8 @@ 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; @@ -842,6 +850,8 @@ 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; @@ -872,37 +882,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"); @@ -923,8 +933,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 551f58e29..b154b3f52 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) && pnpbios_is_dynamic(dev)) + if (!(dev->flags & PNPBIOS_NO_DISABLE)) 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 ef508a4de..5e38cd733 100644 --- a/drivers/pnp/pnpbios/rsparser.c +++ b/drivers/pnp/pnpbios/rsparser.c @@ -3,6 +3,7 @@ * */ +#include #include #include #include @@ -447,7 +448,11 @@ pnpbios_parse_resource_option_data(unsigned char * p, unsigned char * end, struc break; case SMALL_TAG_END: - return p + 2; + if (option_independent != option) + printk(KERN_WARNING "PnPBIOS: Missing SMALL_TAG_ENDDEP tag\n"); + p = p + 2; + return (unsigned char *)p; + break; default: /* an unkown tag */ len_err: diff --git a/drivers/pnp/quirks.c b/drivers/pnp/quirks.c index e97ecefe8..8936b0cb2 100644 --- a/drivers/pnp/quirks.c +++ b/drivers/pnp/quirks.c @@ -11,6 +11,7 @@ * Copyright (c) 1999 Martin Mares */ +#include #include #include #include diff --git a/drivers/pnp/resource.c b/drivers/pnp/resource.c index 5c8ec21e1..6ded52716 100644 --- a/drivers/pnp/resource.c +++ b/drivers/pnp/resource.c @@ -6,6 +6,7 @@ * */ +#include #include #include #include @@ -240,7 +241,7 @@ int pnp_check_port(struct pnp_dev * dev, int idx) { int tmp; struct pnp_dev *tdev; - resource_size_t *port, *end, *tport, *tend; + unsigned long *port, *end, *tport, *tend; port = &dev->res.port_resource[idx].start; end = &dev->res.port_resource[idx].end; @@ -296,7 +297,7 @@ int pnp_check_mem(struct pnp_dev * dev, int idx) { int tmp; struct pnp_dev *tdev; - resource_size_t *addr, *end, *taddr, *tend; + unsigned long *addr, *end, *taddr, *tend; addr = &dev->res.mem_resource[idx].start; end = &dev->res.mem_resource[idx].end; @@ -357,7 +358,7 @@ int pnp_check_irq(struct pnp_dev * dev, int idx) { int tmp; struct pnp_dev *tdev; - resource_size_t * irq = &dev->res.irq_resource[idx].start; + unsigned long * 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)) @@ -395,8 +396,7 @@ int pnp_check_irq(struct pnp_dev * dev, int idx) /* check if the resource is already in use, skip if the * device is active because it itself may be in use */ if(!dev->active) { - if (request_irq(*irq, pnp_test_handler, - IRQF_DISABLED|IRQF_PROBE_SHARED, "pnp", NULL)) + if (request_irq(*irq, pnp_test_handler, SA_INTERRUPT, "pnp", NULL)) return 0; free_irq(*irq, NULL); } @@ -423,7 +423,7 @@ int pnp_check_dma(struct pnp_dev * dev, int idx) #ifndef CONFIG_IA64 int tmp; struct pnp_dev *tdev; - resource_size_t * dma = &dev->res.dma_resource[idx].start; + unsigned long * 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 946a0dcd6..61fe99894 100644 --- a/drivers/pnp/support.c +++ b/drivers/pnp/support.c @@ -5,6 +5,7 @@ * */ +#include #include #include #include diff --git a/drivers/rapidio/rio-access.c b/drivers/rapidio/rio-access.c index 8b56bbdd0..b9fab2ae3 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 DEFINE_SPINLOCK(rio_config_lock); -static DEFINE_SPINLOCK(rio_doorbell_lock); +static spinlock_t rio_config_lock = SPIN_LOCK_UNLOCKED; +static spinlock_t rio_doorbell_lock = SPIN_LOCK_UNLOCKED; /* * 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 7bf7b2c88..94e30fe4b 100644 --- a/drivers/rapidio/rio-scan.c +++ b/drivers/rapidio/rio-scan.c @@ -10,6 +10,7 @@ * option) any later version. */ +#include #include #include diff --git a/drivers/rapidio/rio-sysfs.c b/drivers/rapidio/rio-sysfs.c index 5687b8fcb..bef9316e9 100644 --- a/drivers/rapidio/rio-sysfs.c +++ b/drivers/rapidio/rio-sysfs.c @@ -10,6 +10,7 @@ * option) any later version. */ +#include #include #include #include diff --git a/drivers/rapidio/rio.c b/drivers/rapidio/rio.c index f644807da..5e382470f 100644 --- a/drivers/rapidio/rio.c +++ b/drivers/rapidio/rio.c @@ -11,6 +11,7 @@ * option) any later version. */ +#include #include #include diff --git a/drivers/s390/Kconfig b/drivers/s390/Kconfig index 4d36208ff..721787cc5 100644 --- a/drivers/s390/Kconfig +++ b/drivers/s390/Kconfig @@ -183,13 +183,7 @@ config S390_TAPE_34XX tape subsystems and 100% compatibles. It is safe to say "Y" here. -config S390_TAPE_3590 - tristate "Support for 3590 tape hardware" - depends on S390_TAPE - help - Select this option if you want to access IBM 3590 magnetic - tape subsystems and 100% compatibles. - It is safe to say "Y" here. + config VMLOGRDR tristate "Support for the z/VM recording system services (VM only)" diff --git a/drivers/s390/block/Kconfig b/drivers/s390/block/Kconfig index 929d6fff6..6f50cc932 100644 --- a/drivers/s390/block/Kconfig +++ b/drivers/s390/block/Kconfig @@ -49,18 +49,20 @@ config DASD_FBA config DASD_DIAG tristate "Support for DIAG access to Disks" - depends on DASD + depends on DASD && ( 64BIT = 'n' || EXPERIMENTAL) help Select this option if you want to use Diagnose250 command to access Disks under VM. If you are not running under VM or unsure what it is, say "N". -config DASD_EER - bool "Extended error reporting (EER)" +config DASD_CMB + tristate "Compatibility interface for DASD channel measurement blocks" depends on DASD help - This driver provides a character device interface to the - DASD extended error reporting. This is only needed if you want to - use applications written for the EER facility. + This driver provides an additional interface to the channel measurement + facility, which is normally accessed though sysfs, with a set of + ioctl functions specific to the dasd driver. + This is only needed if you want to use applications written for + linux-2.4 dasd channel measurement facility interface. endif diff --git a/drivers/s390/block/Makefile b/drivers/s390/block/Makefile index be9f22d52..58c678013 100644 --- a/drivers/s390/block/Makefile +++ b/drivers/s390/block/Makefile @@ -7,13 +7,11 @@ dasd_fba_mod-objs := dasd_fba.o dasd_3370_erp.o dasd_9336_erp.o dasd_diag_mod-objs := dasd_diag.o dasd_mod-objs := dasd.o dasd_ioctl.o dasd_proc.o dasd_devmap.o \ dasd_genhd.o dasd_erp.o -ifdef CONFIG_DASD_EER -dasd_mod-objs += dasd_eer.o -endif obj-$(CONFIG_DASD) += dasd_mod.o obj-$(CONFIG_DASD_DIAG) += dasd_diag_mod.o obj-$(CONFIG_DASD_ECKD) += dasd_eckd_mod.o obj-$(CONFIG_DASD_FBA) += dasd_fba_mod.o +obj-$(CONFIG_DASD_CMB) += dasd_cmb.o obj-$(CONFIG_BLK_DEV_XPRAM) += xpram.o obj-$(CONFIG_DCSSBLK) += dcssblk.o diff --git a/drivers/s390/block/dasd.c b/drivers/s390/block/dasd.c index 25c1ef6df..33157c84d 100644 --- a/drivers/s390/block/dasd.c +++ b/drivers/s390/block/dasd.c @@ -9,6 +9,7 @@ * */ +#include #include #include #include @@ -42,6 +43,7 @@ MODULE_AUTHOR("Holger Smolinski "); MODULE_DESCRIPTION("Linux on S/390 DASD device driver," " Copyright 2000 IBM Corporation"); MODULE_SUPPORTED_DEVICE("dasd"); +MODULE_PARM(dasd, "1-" __MODULE_STRING(256) "s"); MODULE_LICENSE("GPL"); /* @@ -52,7 +54,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 int dasd_flush_ccw_queue(struct dasd_device *, int); +static void dasd_flush_ccw_queue(struct dasd_device *, int); static void dasd_tasklet(struct dasd_device *); static void do_kick_device(void *data); @@ -60,7 +62,6 @@ 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. @@ -70,9 +71,10 @@ dasd_alloc_device(void) { struct dasd_device *device; - device = kzalloc(sizeof (struct dasd_device), GFP_ATOMIC); + device = kmalloc(sizeof (struct dasd_device), GFP_ATOMIC); if (device == NULL) return ERR_PTR(-ENOMEM); + memset(device, 0, sizeof (struct dasd_device)); /* open_count = 0 means device online but not in use */ atomic_set(&device->open_count, -1); @@ -95,7 +97,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 +124,13 @@ dasd_free_device(struct dasd_device *device) /* * Make a new device known to the system. */ -static int +static inline 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,11 +148,9 @@ dasd_state_new_to_known(struct dasd_device *device) /* * Let the system forget about a device. */ -static int +static inline void dasd_state_known_to_new(struct dasd_device * device) { - /* Disable extended error reporting for this device. */ - dasd_eer_disable(device); /* Forget the discipline information. */ if (device->discipline) module_put(device->discipline->owner); @@ -164,13 +164,12 @@ 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 int +static inline int dasd_state_known_to_basic(struct dasd_device * device) { int rc; @@ -194,23 +193,17 @@ dasd_state_known_to_basic(struct dasd_device * device) /* * Release the irq line for the device. Terminate any running i/o. */ -static int +static inline void dasd_state_basic_to_known(struct dasd_device * device) { - int rc; - dasd_gendisk_free(device); - rc = dasd_flush_ccw_queue(device, 1); - if (rc) - return rc; - + dasd_flush_ccw_queue(device, 1); 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; } /* @@ -227,7 +220,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 int +static inline int dasd_state_basic_to_ready(struct dasd_device * device) { int rc; @@ -255,31 +248,25 @@ 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 int +static inline void dasd_state_ready_to_basic(struct dasd_device * device) { - int rc; - - rc = dasd_flush_ccw_queue(device, 0); - if (rc) - return rc; + dasd_flush_ccw_queue(device, 0); 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 int +static inline void dasd_state_unfmt_to_basic(struct dasd_device * device) { device->state = DASD_STATE_BASIC; - return 0; } /* @@ -287,7 +274,7 @@ dasd_state_unfmt_to_basic(struct dasd_device * device) * the requeueing of requests from the linux request queue to the * ccw queue. */ -static int +static inline int dasd_state_ready_to_online(struct dasd_device * device) { device->state = DASD_STATE_ONLINE; @@ -298,17 +285,16 @@ dasd_state_ready_to_online(struct dasd_device * device) /* * Stop the requeueing of requests again. */ -static int +static inline void dasd_state_online_to_ready(struct dasd_device * device) { device->state = DASD_STATE_READY; - return 0; } /* * Device startup state changes. */ -static int +static inline int dasd_increase_state(struct dasd_device *device) { int rc; @@ -328,11 +314,6 @@ dasd_increase_state(struct dasd_device *device) device->target >= DASD_STATE_READY) rc = dasd_state_basic_to_ready(device); - if (!rc && - device->state == DASD_STATE_UNFMT && - device->target > DASD_STATE_UNFMT) - rc = -EPERM; - if (!rc && device->state == DASD_STATE_READY && device->target >= DASD_STATE_ONLINE) @@ -344,37 +325,30 @@ dasd_increase_state(struct dasd_device *device) /* * Device shutdown state changes. */ -static int +static inline int dasd_decrease_state(struct dasd_device *device) { - int rc; - - rc = 0; if (device->state == DASD_STATE_ONLINE && device->target <= DASD_STATE_READY) - rc = dasd_state_online_to_ready(device); - - if (!rc && - device->state == DASD_STATE_READY && + dasd_state_online_to_ready(device); + + if (device->state == DASD_STATE_READY && device->target <= DASD_STATE_BASIC) - rc = dasd_state_ready_to_basic(device); + dasd_state_ready_to_basic(device); - if (!rc && - device->state == DASD_STATE_UNFMT && + if (device->state == DASD_STATE_UNFMT && device->target <= DASD_STATE_BASIC) - rc = dasd_state_unfmt_to_basic(device); + dasd_state_unfmt_to_basic(device); - if (!rc && - device->state == DASD_STATE_BASIC && + if (device->state == DASD_STATE_BASIC && device->target <= DASD_STATE_KNOWN) - rc = dasd_state_basic_to_known(device); - - if (!rc && - device->state == DASD_STATE_KNOWN && + dasd_state_basic_to_known(device); + + if (device->state == DASD_STATE_KNOWN && device->target <= DASD_STATE_NEW) - rc = dasd_state_known_to_new(device); + dasd_state_known_to_new(device); - return rc; + return 0; } /* @@ -567,29 +541,33 @@ dasd_kmalloc_request(char *magic, int cplength, int datasize, struct dasd_ccw_req *cqr; /* Sanity checks */ - BUG_ON( magic == NULL || datasize > PAGE_SIZE || - (cplength*sizeof(struct ccw1)) > PAGE_SIZE); + if ( magic == NULL || datasize > PAGE_SIZE || + (cplength*sizeof(struct ccw1)) > PAGE_SIZE) + BUG(); - cqr = kzalloc(sizeof(struct dasd_ccw_req), GFP_ATOMIC); + cqr = kmalloc(sizeof(struct dasd_ccw_req), GFP_ATOMIC); if (cqr == NULL) return ERR_PTR(-ENOMEM); + memset(cqr, 0, sizeof(struct dasd_ccw_req)); cqr->cpaddr = NULL; if (cplength > 0) { - cqr->cpaddr = kcalloc(cplength, sizeof(struct ccw1), + cqr->cpaddr = kmalloc(cplength*sizeof(struct ccw1), GFP_ATOMIC | GFP_DMA); if (cqr->cpaddr == NULL) { kfree(cqr); return ERR_PTR(-ENOMEM); } + memset(cqr->cpaddr, 0, cplength*sizeof(struct ccw1)); } cqr->data = NULL; if (datasize > 0) { - cqr->data = kzalloc(datasize, GFP_ATOMIC | GFP_DMA); + cqr->data = kmalloc(datasize, GFP_ATOMIC | GFP_DMA); if (cqr->data == NULL) { kfree(cqr->cpaddr); kfree(cqr); return ERR_PTR(-ENOMEM); } + memset(cqr->data, 0, datasize); } strncpy((char *) &cqr->magic, magic, 4); ASCEBC((char *) &cqr->magic, 4); @@ -608,8 +586,9 @@ dasd_smalloc_request(char *magic, int cplength, int datasize, int size; /* Sanity checks */ - BUG_ON( magic == NULL || datasize > PAGE_SIZE || - (cplength*sizeof(struct ccw1)) > PAGE_SIZE); + if ( magic == NULL || datasize > PAGE_SIZE || + (cplength*sizeof(struct ccw1)) > PAGE_SIZE) + BUG(); size = (sizeof(struct dasd_ccw_req) + 7L) & -8L; if (cplength > 0) @@ -723,7 +702,6 @@ 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); @@ -914,9 +892,6 @@ dasd_handle_state_change_pending(struct dasd_device *device) struct dasd_ccw_req *cqr; struct list_head *l, *n; - /* First of all start sense subsystem status request. */ - dasd_eer_snss(device); - device->stopped &= ~DASD_STOPPED_PENDING; /* restart all 'running' IO on queue */ @@ -1001,7 +976,6 @@ 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; } @@ -1017,7 +991,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 && @@ -1027,7 +1001,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); @@ -1137,19 +1111,6 @@ restart: } goto restart; } - - /* First of all call extended error reporting. */ - if (dasd_eer_enabled(device) && - cqr->status == DASD_CQR_FAILED) { - dasd_eer_write(device, cqr, DASD_EER_FATALERROR); - - /* restart request */ - cqr->status = DASD_CQR_QUEUED; - cqr->retries = 255; - device->stopped |= DASD_STOPPED_QUIESCE; - goto restart; - } - /* Process finished ERP request. */ if (cqr->refers) { __dasd_process_erp(device, cqr); @@ -1265,10 +1226,6 @@ __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); @@ -1289,124 +1246,66 @@ __dasd_start_head(struct dasd_device * device) if (list_empty(&device->ccw_queue)) return; cqr = list_entry(device->ccw_queue.next, struct dasd_ccw_req, list); - if (cqr->status != DASD_CQR_QUEUED) - return; - /* Non-temporary stop condition will trigger fail fast */ + /* check FAILFAST */ if (device->stopped & ~DASD_STOPPED_PENDING && - test_bit(DASD_CQR_FLAGS_FAILFAST, &cqr->flags) && - (!dasd_eer_enabled(device))) { + test_bit(DASD_CQR_FLAGS_FAILFAST, &cqr->flags)) { cqr->status = DASD_CQR_FAILED; dasd_schedule_bh(device); - return; } - /* Don't try to start requests if device is stopped */ - if (device->stopped) - return; - - rc = device->discipline->start_IO(cqr); - if (rc == 0) - dasd_set_timer(device, cqr->expires); - else if (rc == -EACCES) { - dasd_schedule_bh(device); - } else - /* Hmpf, try again in 1/2 sec */ - dasd_set_timer(device, 50); -} - -static inline int -_wait_for_clear(struct dasd_ccw_req *cqr) -{ - return (cqr->status == DASD_CQR_QUEUED); + if ((cqr->status == DASD_CQR_QUEUED) && + (!device->stopped)) { + /* try to start the first I/O that can be started */ + rc = device->discipline->start_IO(cqr); + if (rc == 0) + dasd_set_timer(device, cqr->expires); + else if (rc == -EACCES) { + dasd_schedule_bh(device); + } else + /* Hmpf, try again in 1/2 sec */ + dasd_set_timer(device, 50); + } } /* - * 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. + * Remove requests from the ccw queue. */ -static int +static void 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)); - 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); - + list_for_each_safe(l, n, &device->ccw_queue) { + cqr = list_entry(l, struct dasd_ccw_req, list); /* Flush all request or only block device requests? */ - if (all == 0 && cqr->callback != dasd_end_request_cb && - orig->callback != dasd_end_request_cb) { + if (all == 0 && cqr->callback == dasd_end_request_cb) continue; - } - /* 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)); + 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; + cqr->stopclk = get_clock(); } /* Process finished ERP request. */ if (cqr->refers) { __dasd_process_erp(device, cqr); - /* restart list_for_xx loop since dasd_process_erp - * might remove multiple elements */ - goto restart_cb; + continue; } - /* call the callback function */ + /* Rechain request on device request queue */ 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; } /* @@ -1531,23 +1430,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; @@ -1592,8 +1491,10 @@ dasd_sleep_on_interruptible(struct dasd_ccw_req * cqr) if (device->discipline->term_IO) { cqr->retries = -1; device->discipline->term_IO(cqr); - /* wait (non-interruptible) for final status - * because signal ist still pending */ + /*nished = + * 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)); @@ -1626,11 +1527,19 @@ 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); - return device->discipline->term_IO(cqr); + 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; } int @@ -1639,7 +1548,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); @@ -1647,20 +1556,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; @@ -1796,11 +1705,14 @@ dasd_flush_request_queue(struct dasd_device * device) if (!device->request_queue) return; - + spin_lock_irq(&device->request_queue_lock); - while ((req = elv_next_request(device->request_queue))) { - blkdev_dequeue_request(req); + while (!list_empty(&device->request_queue->queue_head)) { + req = elv_next_request(device->request_queue); + if (req == NULL) + break; dasd_end_request(req, 0); + blkdev_dequeue_request(req); } spin_unlock_irq(&device->request_queue_lock); } @@ -1895,13 +1807,14 @@ dasd_exit(void) #ifdef CONFIG_PROC_FS dasd_proc_exit(); #endif - dasd_eer_exit(); + dasd_ioctl_exit(); if (dasd_page_cache != NULL) { kmem_cache_destroy(dasd_page_cache); dasd_page_cache = NULL; } dasd_gendisk_exit(); dasd_devmap_exit(); + devfs_remove("dasd"); if (dasd_debug_area != NULL) { debug_unregister(dasd_debug_area); dasd_debug_area = NULL; @@ -1922,34 +1835,15 @@ 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); - return ret; + } else { + cdev->handler = &dasd_int_handler; } - 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; } @@ -1997,8 +1891,6 @@ 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); @@ -2064,7 +1956,7 @@ int dasd_generic_set_offline (struct ccw_device *cdev) { struct dasd_device *device; - int max_count, open_count; + int max_count; device = dasd_device_from_cdev(cdev); if (IS_ERR(device)) @@ -2081,16 +1973,10 @@ dasd_generic_set_offline (struct ccw_device *cdev) * in the other openers. */ max_count = device->bdev ? 0 : -1; - open_count = (int) atomic_read(&device->open_count); - if (open_count > max_count) { - if (open_count > 0) - printk (KERN_WARNING "Can't offline dasd device with " - "open count = %i.\n", - open_count); - else - printk (KERN_WARNING "%s", - "Can't offline dasd device due to internal " - "use\n"); + if (atomic_read(&device->open_count) > max_count) { + printk (KERN_WARNING "Can't offline dasd device with open" + " count = %i.\n", + atomic_read(&device->open_count)); clear_bit(DASD_FLAG_OFFLINE, &device->flags); dasd_put_device(device); return -EBUSY; @@ -2118,9 +2004,6 @@ dasd_generic_notify(struct ccw_device *cdev, int event) switch (event) { case CIO_GONE: case CIO_NO_PATH: - /* First of all call extended error reporting. */ - dasd_eer_write(device, NULL, DASD_EER_NOPATH); - if (device->state < DASD_STATE_BASIC) break; /* Device is active. We want to keep it. */ @@ -2153,6 +2036,30 @@ 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) @@ -2160,7 +2067,6 @@ 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)); @@ -2175,6 +2081,9 @@ 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; @@ -2184,7 +2093,7 @@ dasd_init(void) rc = dasd_parse(); if (rc) goto failed; - rc = dasd_eer_init(); + rc = dasd_ioctl_init(); if (rc) goto failed; #ifdef CONFIG_PROC_FS @@ -2231,4 +2140,23 @@ 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 1ddab8991..1d11c2a95 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,3 +82,22 @@ 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 669805d44..4ee0f934e 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 */ @@ -1108,9 +1108,6 @@ dasd_3990_handle_env_data(struct dasd_ccw_req * erp, char *sense) case 0x0B: DEV_MESSAGE(KERN_WARNING, device, "%s", "FORMAT F - Volume is suspended duplex"); - /* call extended error reporting (EER) */ - dasd_eer_write(device, erp->refers, - DASD_EER_PPRCSUSPEND); break; case 0x0C: DEV_MESSAGE(KERN_WARNING, device, "%s", @@ -1150,9 +1147,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 +1182,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 +1480,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 +1524,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 +1599,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 +1613,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 +1637,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 +1786,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 +1894,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 +1940,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 +1962,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 +1977,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 +1998,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 +2023,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 +2060,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 +2107,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 +2225,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 +2240,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 +2269,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 +2329,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 +2373,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 +2412,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 +2448,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 +2482,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 +2532,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 +2628,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,3 +2720,22 @@ 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 6e0826884..dc861446d 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,3 +39,22 @@ 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 ddecb9808..4a5b79569 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_cmb.c b/drivers/s390/block/dasd_cmb.c index 4f365bff2..e88f73ee7 100644 --- a/drivers/s390/block/dasd_cmb.c +++ b/drivers/s390/block/dasd_cmb.c @@ -1,6 +1,4 @@ /* - * linux/drivers/s390/block/dasd_cmb.c ($Revision: 1.9 $) - * * Linux on zSeries Channel Measurement Facility support * (dasd device driver interface) * diff --git a/drivers/s390/block/dasd_devmap.c b/drivers/s390/block/dasd_devmap.c index 9af02c79c..1629b27c4 100644 --- a/drivers/s390/block/dasd_devmap.c +++ b/drivers/s390/block/dasd_devmap.c @@ -13,9 +13,9 @@ * */ +#include #include #include -#include #include #include @@ -26,7 +26,7 @@ #include "dasd_int.h" kmem_cache_t *dasd_page_cache; -EXPORT_SYMBOL_GPL(dasd_page_cache); +EXPORT_SYMBOL(dasd_page_cache); /* * dasd_devmap_t is used to store the features and the relation @@ -44,25 +44,8 @@ struct dasd_devmap { unsigned int devindex; unsigned short features; struct dasd_device *device; - 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]+ @@ -79,8 +62,6 @@ static struct list_head dasd_server_ssid_list; 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 @@ -88,10 +69,8 @@ EXPORT_SYMBOL_GPL(dasd_nopav); * strings when running as a module. */ static char *dasd[256]; -module_param_array(dasd, charp, NULL, 0); - /* - * Single spinlock to protect devmap and servermap structures and lists. + * Single spinlock to protect devmap structures and lists. */ static DEFINE_SPINLOCK(dasd_devmap_lock); @@ -140,7 +119,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') { @@ -196,7 +175,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; @@ -245,30 +224,24 @@ 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("nopav", parsestring, length) == 0) { - dasd_nopav = 1; - MESSAGE(KERN_INFO, "%s", "disable PAV mode"); - return residual_str; - } - if (strncmp("fixedbuffers", parsestring, length) == 0) { + if (strncmp ("fixedbuffers", parsestring, length) == 0) { if (dasd_page_cache) return residual_str; dasd_page_cache = - kmem_cache_create("dasd_page_cache", PAGE_SIZE, - PAGE_SIZE, SLAB_CACHE_DMA, - NULL, NULL ); + kmem_cache_create("dasd_page_cache", PAGE_SIZE, 0, + SLAB_CACHE_DMA, NULL, NULL ); if (!dasd_page_cache) MESSAGE(KERN_WARNING, "%s", "Failed to create slab, " "fixed buffer mode disabled."); @@ -317,8 +290,6 @@ 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++); @@ -384,7 +355,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) @@ -393,11 +364,11 @@ dasd_add_busid(char *bus_id, int features) int hash; new = (struct dasd_devmap *) - kzalloc(sizeof(struct dasd_devmap), GFP_KERNEL); + kmalloc(sizeof(struct dasd_devmap), GFP_KERNEL); if (!new) return ERR_PTR(-ENOMEM); spin_lock(&dasd_devmap_lock); - devmap = NULL; + devmap = 0; 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) { @@ -409,10 +380,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 = NULL; + new->device = 0; list_add(&new->list, &dasd_hashlists[hash]); devmap = new; - new = NULL; + new = 0; } spin_unlock(&dasd_devmap_lock); kfree(new); @@ -463,7 +434,8 @@ dasd_forget_ranges(void) spin_lock(&dasd_devmap_lock); for (i = 0; i < 256; i++) { list_for_each_entry_safe(devmap, n, &dasd_hashlists[i], list) { - BUG_ON(devmap->device != NULL); + if (devmap->device != NULL) + BUG(); list_del(&devmap->list); kfree(devmap); } @@ -482,7 +454,7 @@ dasd_device_from_devindex(int devindex) int i; spin_lock(&dasd_devmap_lock); - devmap = NULL; + devmap = 0; for (i = 0; (i < 256) && !devmap; i++) list_for_each_entry(tmp, &dasd_hashlists[i], list) if (tmp->devindex == devindex) { @@ -572,7 +544,8 @@ dasd_delete_device(struct dasd_device *device) /* First remove device pointer from devmap. */ devmap = dasd_find_busid(device->cdev->dev.bus_id); - BUG_ON(IS_ERR(devmap)); + if (IS_ERR(devmap)) + BUG(); spin_lock(&dasd_devmap_lock); if (devmap->device != device) { spin_unlock(&dasd_devmap_lock); @@ -655,8 +628,7 @@ 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; @@ -684,7 +656,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; @@ -699,8 +671,7 @@ 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; @@ -724,11 +695,11 @@ dasd_use_diag_store(struct device *dev, struct device_attribute *attr, 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; @@ -744,116 +715,10 @@ dasd_discipline_show(struct device *dev, struct device_attribute *attr, static DEVICE_ATTR(discipline, 0444, dasd_discipline_show, NULL); -static ssize_t -dasd_alias_show(struct device *dev, struct device_attribute *attr, char *buf) -{ - struct dasd_devmap *devmap; - int alias; - - devmap = dasd_find_busid(dev->bus_id); - spin_lock(&dasd_devmap_lock); - if (!IS_ERR(devmap)) - alias = devmap->uid.alias; - else - alias = 0; - spin_unlock(&dasd_devmap_lock); - - return sprintf(buf, alias ? "1\n" : "0\n"); -} - -static DEVICE_ATTR(alias, 0444, dasd_alias_show, NULL); - -static ssize_t -dasd_vendor_show(struct device *dev, struct device_attribute *attr, char *buf) -{ - struct dasd_devmap *devmap; - char *vendor; - - devmap = dasd_find_busid(dev->bus_id); - spin_lock(&dasd_devmap_lock); - if (!IS_ERR(devmap) && strlen(devmap->uid.vendor) > 0) - vendor = devmap->uid.vendor; - else - vendor = ""; - spin_unlock(&dasd_devmap_lock); - - return snprintf(buf, PAGE_SIZE, "%s\n", vendor); -} - -static DEVICE_ATTR(vendor, 0444, dasd_vendor_show, NULL); - -#define UID_STRLEN ( /* vendor */ 3 + 1 + /* serial */ 14 + 1 +\ - /* SSID */ 4 + 1 + /* unit addr */ 2 + 1) - -static ssize_t -dasd_uid_show(struct device *dev, struct device_attribute *attr, char *buf) -{ - struct dasd_devmap *devmap; - char uid[UID_STRLEN]; - - devmap = dasd_find_busid(dev->bus_id); - spin_lock(&dasd_devmap_lock); - if (!IS_ERR(devmap) && strlen(devmap->uid.vendor) > 0) - snprintf(uid, sizeof(uid), "%s.%s.%04x.%02x", - devmap->uid.vendor, devmap->uid.serial, - devmap->uid.ssid, devmap->uid.unit_addr); - else - uid[0] = 0; - spin_unlock(&dasd_devmap_lock); - - return snprintf(buf, PAGE_SIZE, "%s\n", uid); -} - -static DEVICE_ATTR(uid, 0444, dasd_uid_show, NULL); - -/* - * extended error-reporting - */ -static ssize_t -dasd_eer_show(struct device *dev, struct device_attribute *attr, char *buf) -{ - struct dasd_devmap *devmap; - int eer_flag; - - devmap = dasd_find_busid(dev->bus_id); - if (!IS_ERR(devmap) && devmap->device) - eer_flag = dasd_eer_enabled(devmap->device); - else - eer_flag = 0; - return snprintf(buf, PAGE_SIZE, eer_flag ? "1\n" : "0\n"); -} - -static ssize_t -dasd_eer_store(struct device *dev, struct device_attribute *attr, - const char *buf, size_t count) -{ - struct dasd_devmap *devmap; - int rc; - - devmap = dasd_devmap_from_cdev(to_ccwdev(dev)); - if (IS_ERR(devmap)) - return PTR_ERR(devmap); - if (!devmap->device) - return count; - if (buf[0] == '1') { - rc = dasd_eer_enable(devmap->device); - if (rc) - return rc; - } else - dasd_eer_disable(devmap->device); - return count; -} - -static DEVICE_ATTR(eer_enabled, 0644, dasd_eer_show, dasd_eer_store); - static struct attribute * dasd_attrs[] = { &dev_attr_readonly.attr, &dev_attr_discipline.attr, - &dev_attr_alias.attr, - &dev_attr_vendor.attr, - &dev_attr_uid.attr, &dev_attr_use_diag.attr, - &dev_attr_eer_enabled.attr, NULL, }; @@ -861,72 +726,6 @@ static struct attribute_group dasd_attr_group = { .attrs = dasd_attrs, }; -/* - * Return copy of the device unique identifier. - */ -int -dasd_get_uid(struct ccw_device *cdev, struct dasd_uid *uid) -{ - struct dasd_devmap *devmap; - - devmap = dasd_find_busid(cdev->dev.bus_id); - if (IS_ERR(devmap)) - return PTR_ERR(devmap); - spin_lock(&dasd_devmap_lock); - *uid = devmap->uid; - spin_unlock(&dasd_devmap_lock); - return 0; -} - -/* - * 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 (srv ? 1 : 0); -} -EXPORT_SYMBOL_GPL(dasd_set_uid); - /* * Return value of the specified feature. */ @@ -937,7 +736,7 @@ dasd_get_feature(struct ccw_device *cdev, int feature) devmap = dasd_find_busid(cdev->dev.bus_id); if (IS_ERR(devmap)) - return PTR_ERR(devmap); + return (int) PTR_ERR(devmap); return ((devmap->features & feature) != 0); } @@ -953,7 +752,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 PTR_ERR(devmap); + return (int) PTR_ERR(devmap); spin_lock(&dasd_devmap_lock); if (flag) @@ -989,10 +788,8 @@ dasd_devmap_init(void) dasd_max_devindex = 0; for (i = 0; i < 256; i++) INIT_LIST_HEAD(&dasd_hashlists[i]); - - /* 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 23fa0b289..3f9d704d2 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,6 +8,7 @@ * */ +#include #include #include #include @@ -335,7 +336,7 @@ dasd_diag_check_device(struct dasd_device *device) private = (struct dasd_diag_private *) device->private; if (private == NULL) { - private = kzalloc(sizeof(struct dasd_diag_private),GFP_KERNEL); + private = kmalloc(sizeof(struct dasd_diag_private),GFP_KERNEL); if (private == NULL) { DEV_MESSAGE(KERN_WARNING, device, "%s", "memory allocation failed for private data"); @@ -526,7 +527,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 b8c78267f..38a4e55f8 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 b7a7fac3f..822e2a265 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,6 +9,7 @@ * */ +#include #include #include #include @@ -23,7 +24,6 @@ #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,22 +89,17 @@ dasd_eckd_probe (struct ccw_device *cdev) { int 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); + ret = dasd_generic_probe (cdev, &dasd_eckd_discipline); + if (ret) return ret; - } - ret = dasd_generic_probe(cdev, &dasd_eckd_discipline); - return ret; + ccw_device_set_options(cdev, CCWDEV_DO_PATHGROUP | CCWDEV_ALLOW_FORCE); + return 0; } 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 = { @@ -215,14 +210,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; @@ -301,8 +296,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); @@ -322,7 +317,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, @@ -451,39 +446,6 @@ dasd_eckd_cdl_reclen(int recid) return LABEL_SIZE; } -/* - * Generate device unique id that specifies the physical device. - */ -static int -dasd_eckd_generate_uid(struct dasd_device *device, struct dasd_uid *uid) -{ - struct dasd_eckd_private *private; - struct dasd_eckd_confdata *confdata; - - private = (struct dasd_eckd_private *) device->private; - if (!private) - return -ENODEV; - confdata = &private->conf_data; - if (!confdata) - return -ENODEV; - - memset(uid, 0, sizeof(struct dasd_uid)); - memcpy(uid->vendor, confdata->ned1.HDA_manufacturer, - sizeof(uid->vendor) - 1); - EBCASC(uid->vendor, sizeof(uid->vendor) - 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) { - uid->alias = 1; - uid->unit_addr = confdata->ned2.sneq.base_unit_addr; - } else - uid->unit_addr = confdata->ned1.unit_addr; - - return 0; -} - static int dasd_eckd_read_conf(struct dasd_device *device) { @@ -545,101 +507,17 @@ 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. - */ static int dasd_eckd_check_characteristics(struct dasd_device *device) { struct dasd_eckd_private *private; - struct dasd_uid uid; void *rdc_data; int rc; private = (struct dasd_eckd_private *) device->private; if (private == NULL) { - private = kzalloc(sizeof(struct dasd_eckd_private), + private = kmalloc(sizeof(struct dasd_eckd_private), GFP_KERNEL | GFP_DMA); if (private == NULL) { DEV_MESSAGE(KERN_WARNING, device, "%s", @@ -647,6 +525,7 @@ 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. */ @@ -655,29 +534,15 @@ 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 " - "rc=%d", rc); + "Read device characteristics returned error %d", + rc); + return rc; + } DEV_MESSAGE(KERN_INFO, device, "%04X/%02X(CU:%04X/%02X) Cyl:%d Head:%d Sec:%d", @@ -688,7 +553,11 @@ 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); return rc; + } static struct dasd_ccw_req * @@ -857,7 +726,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"); @@ -1054,7 +923,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) { @@ -1354,18 +1223,23 @@ 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 -dasd_eckd_release(struct dasd_device *device) +dasd_eckd_release(struct block_device *bdev, int no, long args) { + struct dasd_device *device; struct dasd_ccw_req *cqr; int rc; if (!capable(CAP_SYS_ADMIN)) return -EACCES; + device = bdev->bd_disk->private_data; + if (device == NULL) + return -ENODEV; + cqr = dasd_smalloc_request(dasd_eckd_discipline.name, 1, 32, device); if (IS_ERR(cqr)) { @@ -1394,18 +1268,23 @@ 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) +dasd_eckd_reserve(struct block_device *bdev, int no, long args) { + struct dasd_device *device; struct dasd_ccw_req *cqr; int rc; if (!capable(CAP_SYS_ADMIN)) return -EACCES; + device = bdev->bd_disk->private_data; + if (device == NULL) + return -ENODEV; + cqr = dasd_smalloc_request(dasd_eckd_discipline.name, 1, 32, device); if (IS_ERR(cqr)) { @@ -1433,18 +1312,23 @@ 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 -dasd_eckd_steal_lock(struct dasd_device *device) +dasd_eckd_steal_lock(struct block_device *bdev, int no, long args) { + struct dasd_device *device; struct dasd_ccw_req *cqr; int rc; if (!capable(CAP_SYS_ADMIN)) return -EACCES; + device = bdev->bd_disk->private_data; + if (device == NULL) + return -ENODEV; + cqr = dasd_smalloc_request(dasd_eckd_discipline.name, 1, 32, device); if (IS_ERR(cqr)) { @@ -1474,14 +1358,19 @@ dasd_eckd_steal_lock(struct dasd_device *device) * Read performance statistics */ static int -dasd_eckd_performance(struct dasd_device *device, void __user *argp) +dasd_eckd_performance(struct block_device *bdev, int no, long args) { + struct dasd_device *device; struct dasd_psf_prssd_data *prssdp; struct dasd_rssd_perf_stats_t *stats; struct dasd_ccw_req *cqr; struct ccw1 *ccw; int rc; + device = bdev->bd_disk->private_data; + if (device == NULL) + return -ENODEV; + cqr = dasd_smalloc_request(dasd_eckd_discipline.name, 1 /* PSF */ + 1 /* RSSD */ , (sizeof (struct dasd_psf_prssd_data) + @@ -1525,9 +1414,8 @@ dasd_eckd_performance(struct dasd_device *device, void __user *argp) /* Prepare for Read Subsystem Data */ prssdp = (struct dasd_psf_prssd_data *) cqr->data; stats = (struct dasd_rssd_perf_stats_t *) (prssdp + 1); - if (copy_to_user(argp, stats, - sizeof(struct dasd_rssd_perf_stats_t))) - rc = -EFAULT; + rc = copy_to_user((long __user *) args, (long *) stats, + sizeof(struct dasd_rssd_perf_stats_t)); } dasd_sfree_request(cqr, cqr->device); return rc; @@ -1538,22 +1426,27 @@ dasd_eckd_performance(struct dasd_device *device, void __user *argp) * Returnes the cache attributes used in Define Extend (DE). */ static int -dasd_eckd_get_attrib(struct dasd_device *device, void __user *argp) +dasd_eckd_get_attrib (struct block_device *bdev, int no, long args) { - struct dasd_eckd_private *private = - (struct dasd_eckd_private *)device->private; - struct attrib_data_t attrib = private->attrib; + struct dasd_device *device; + struct dasd_eckd_private *private; + struct attrib_data_t attrib; int rc; if (!capable(CAP_SYS_ADMIN)) return -EACCES; - if (!argp) + if (!args) return -EINVAL; - rc = 0; - if (copy_to_user(argp, (long *) &attrib, - sizeof (struct attrib_data_t))) - rc = -EFAULT; + device = bdev->bd_disk->private_data; + if (device == NULL) + return -ENODEV; + + private = (struct dasd_eckd_private *) device->private; + attrib = private->attrib; + + rc = copy_to_user((long __user *) args, (long *) &attrib, + sizeof (struct attrib_data_t)); return rc; } @@ -1563,19 +1456,26 @@ dasd_eckd_get_attrib(struct dasd_device *device, void __user *argp) * Stores the attributes for cache operation to be used in Define Extend (DE). */ static int -dasd_eckd_set_attrib(struct dasd_device *device, void __user *argp) +dasd_eckd_set_attrib(struct block_device *bdev, int no, long args) { - struct dasd_eckd_private *private = - (struct dasd_eckd_private *)device->private; + struct dasd_device *device; + struct dasd_eckd_private *private; struct attrib_data_t attrib; if (!capable(CAP_SYS_ADMIN)) return -EACCES; - if (!argp) + if (!args) return -EINVAL; - if (copy_from_user(&attrib, argp, sizeof(struct attrib_data_t))) + device = bdev->bd_disk->private_data; + if (device == NULL) + return -ENODEV; + + if (copy_from_user(&attrib, (void __user *) args, + sizeof (struct attrib_data_t))) { return -EFAULT; + } + private = (struct dasd_eckd_private *) device->private; private->attrib = attrib; DEV_MESSAGE(KERN_INFO, device, @@ -1584,61 +1484,6 @@ dasd_eckd_set_attrib(struct dasd_device *device, void __user *argp) return 0; } -static int -dasd_eckd_ioctl(struct dasd_device *device, unsigned int cmd, void __user *argp) -{ - switch (cmd) { - case BIODASDGATTR: - return dasd_eckd_get_attrib(device, argp); - case BIODASDSATTR: - return dasd_eckd_set_attrib(device, argp); - case BIODASDPSRD: - return dasd_eckd_performance(device, argp); - case BIODASDRLSE: - return dasd_eckd_release(device); - case BIODASDRSRV: - return dasd_eckd_reserve(device); - case BIODASDSLCK: - return dasd_eckd_steal_lock(device); - default: - return -ENOIOCTLCMD; - } -} - -/* - * 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. @@ -1648,8 +1493,8 @@ dasd_eckd_dump_sense(struct dasd_device *device, struct dasd_ccw_req * req, struct irb *irb) { char *page; - struct ccw1 *first, *last, *fail, *from, *to; - int len, sl, sct; + struct ccw1 *act, *end, *last; + int len, sl, sct, count; page = (char *) get_zeroed_page(GFP_ATOMIC); if (page == NULL) { @@ -1657,8 +1502,7 @@ dasd_eckd_dump_sense(struct dasd_device *device, struct dasd_ccw_req * req, "No memory to dump sense data"); return; } - /* dump the sense data */ - len = sprintf(page, KERN_ERR PRINTK_HEADER + 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 @@ -1683,55 +1527,87 @@ 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 */ - 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"); + 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"); } else { /* 32 Byte Sense Data */ - sprintf(page + len, KERN_ERR PRINTK_HEADER - " 32 Byte: Format: %x " - "Exception class %x\n", - irb->ecw[6] & 0x0f, irb->ecw[22] >> 4); + len += sprintf(page + len, KERN_ERR PRINTK_HEADER + " 32 Byte: Format: %x " + "Exception class %x\n", + irb->ecw[6] & 0x0f, irb->ecw[22] >> 4); } } else { - sprintf(page + len, KERN_ERR PRINTK_HEADER - " SORRY - NO VALID SENSE AVAILABLE\n"); + len += sprintf(page + len, KERN_ERR PRINTK_HEADER + " SORRY - NO VALID SENSE AVAILABLE\n"); } - 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 + 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 " Related CP in req: %p\n", req); - dasd_eckd_dump_ccw_range(first, to, page + len); - printk("%s", page); + 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)); - /* print failing CCW area (maximum 4) */ - /* scsw->cda is either valid or zero */ + /* print failing CCW area */ len = 0; - 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"); + 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++; } - to = min(fail + 1, last); - len += dasd_eckd_dump_ccw_range(from, to, page + len); - /* print last CCWs (maximum 2) */ - from = max(from, ++to); - if (from < last - 1) { - from = last - 1; /* there is a gap - print header */ + /* print last CCWs */ + if (act < last - 2) { + act = last - 2; len += sprintf(page + len, KERN_ERR PRINTK_HEADER "......\n"); } - len += dasd_eckd_dump_ccw_range(from, last, page + len); + 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++; + } if (len > 0) - printk("%s", page); + MESSAGE_LOG(KERN_ERR, "%s", + page + sizeof(KERN_ERR PRINTK_HEADER)); free_page((unsigned long) page); } @@ -1766,21 +1642,86 @@ static struct dasd_discipline dasd_eckd_discipline = { .free_cp = dasd_eckd_free_cp, .dump_sense = dasd_eckd_dump_sense, .fill_info = dasd_eckd_fill_info, - .ioctl = dasd_eckd_ioctl, }; static int __init dasd_eckd_init(void) { + int ret; + + dasd_ioctl_no_register(THIS_MODULE, BIODASDGATTR, + dasd_eckd_get_attrib); + dasd_ioctl_no_register(THIS_MODULE, BIODASDSATTR, + dasd_eckd_set_attrib); + dasd_ioctl_no_register(THIS_MODULE, BIODASDPSRD, + dasd_eckd_performance); + dasd_ioctl_no_register(THIS_MODULE, BIODASDRLSE, + dasd_eckd_release); + dasd_ioctl_no_register(THIS_MODULE, BIODASDRSRV, + dasd_eckd_reserve); + dasd_ioctl_no_register(THIS_MODULE, BIODASDSLCK, + dasd_eckd_steal_lock); + ASCEBC(dasd_eckd_discipline.ebcname, 4); - return ccw_driver_register(&dasd_eckd_driver); + + ret = ccw_driver_register(&dasd_eckd_driver); + if (ret) { + dasd_ioctl_no_unregister(THIS_MODULE, BIODASDGATTR, + dasd_eckd_get_attrib); + dasd_ioctl_no_unregister(THIS_MODULE, BIODASDSATTR, + dasd_eckd_set_attrib); + dasd_ioctl_no_unregister(THIS_MODULE, BIODASDPSRD, + dasd_eckd_performance); + dasd_ioctl_no_unregister(THIS_MODULE, BIODASDRLSE, + dasd_eckd_release); + dasd_ioctl_no_unregister(THIS_MODULE, BIODASDRSRV, + dasd_eckd_reserve); + dasd_ioctl_no_unregister(THIS_MODULE, BIODASDSLCK, + dasd_eckd_steal_lock); + return ret; + } + + dasd_generic_auto_online(&dasd_eckd_driver); + return 0; } static void __exit dasd_eckd_cleanup(void) { ccw_driver_unregister(&dasd_eckd_driver); + + dasd_ioctl_no_unregister(THIS_MODULE, BIODASDGATTR, + dasd_eckd_get_attrib); + dasd_ioctl_no_unregister(THIS_MODULE, BIODASDSATTR, + dasd_eckd_set_attrib); + dasd_ioctl_no_unregister(THIS_MODULE, BIODASDPSRD, + dasd_eckd_performance); + dasd_ioctl_no_unregister(THIS_MODULE, BIODASDRLSE, + dasd_eckd_release); + dasd_ioctl_no_unregister(THIS_MODULE, BIODASDRSRV, + dasd_eckd_reserve); + dasd_ioctl_no_unregister(THIS_MODULE, BIODASDSLCK, + dasd_eckd_steal_lock); } 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 712ff1650..bc3823d35 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 * @@ -29,7 +29,6 @@ #define DASD_ECKD_CCW_PSF 0x27 #define DASD_ECKD_CCW_RSSD 0x3e #define DASD_ECKD_CCW_LOCATE_RECORD 0x47 -#define DASD_ECKD_CCW_SNSS 0x54 #define DASD_ECKD_CCW_DEFINE_EXTENT 0x63 #define DASD_ECKD_CCW_WRITE_MT 0x85 #define DASD_ECKD_CCW_READ_MT 0x86 @@ -41,10 +40,9 @@ #define DASD_ECKD_CCW_RESERVE 0xB4 /* - * Perform Subsystem Function / Sub-Orders + *Perform Subsystem Function / Sub-Orders */ -#define PSF_ORDER_PRSSD 0x18 -#define PSF_ORDER_SSC 0x1D +#define PSF_ORDER_PRSSD 0x18 /***************************************************************************** * SECTION: Type Definitions @@ -156,7 +154,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; @@ -229,36 +227,26 @@ struct dasd_eckd_confdata { unsigned char HDA_manufacturer[3]; unsigned char HDA_location[2]; unsigned char HDA_seqno[12]; - __u8 ID; - __u8 unit_addr; + __u16 ID; } __attribute__ ((packed)) ned1; - union { - struct { - struct { - unsigned char identifier:2; - unsigned char token_id:1; - unsigned char sno_valid:1; - unsigned char subst_sno:1; - unsigned char recNED:1; - unsigned char emuNED:1; - unsigned char reserved:1; - } __attribute__ ((packed)) flags; - __u8 descriptor; - __u8 reserved[2]; - unsigned char dev_type[6]; - unsigned char dev_model[3]; - unsigned char DASD_manufacturer[3]; - unsigned char DASD_location[2]; - unsigned char DASD_seqno[12]; - __u16 ID; - } __attribute__ ((packed)) ned; + struct { struct { - unsigned char flags; /* byte 0 */ - unsigned char res2[7]; /* byte 1- 7 */ - unsigned char sua_flags; /* byte 8 */ - __u8 base_unit_addr; /* byte 9 */ - unsigned char res3[22]; /* byte 10-31 */ - } __attribute__ ((packed)) sneq; + unsigned char identifier:2; + unsigned char token_id:1; + unsigned char sno_valid:1; + unsigned char subst_sno:1; + unsigned char recNED:1; + unsigned char emuNED:1; + unsigned char reserved:1; + } __attribute__ ((packed)) flags; + __u8 descriptor; + __u8 reserved[2]; + unsigned char dev_type[6]; + unsigned char dev_model[3]; + unsigned char DASD_manufacturer[3]; + unsigned char DASD_location[2]; + unsigned char DASD_seqno[12]; + __u16 ID; } __attribute__ ((packed)) ned2; struct { struct { @@ -344,7 +332,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; @@ -354,15 +342,4 @@ 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_erp.c b/drivers/s390/block/dasd_erp.c index 58a650979..8fd71ab02 100644 --- a/drivers/s390/block/dasd_erp.c +++ b/drivers/s390/block/dasd_erp.c @@ -9,6 +9,7 @@ * */ +#include #include #include @@ -31,8 +32,9 @@ dasd_alloc_erp_request(char *magic, int cplength, int datasize, int size; /* Sanity checks */ - BUG_ON( magic == NULL || datasize > PAGE_SIZE || - (cplength*sizeof(struct ccw1)) > PAGE_SIZE); + if ( magic == NULL || datasize > PAGE_SIZE || + (cplength*sizeof(struct ccw1)) > PAGE_SIZE) + BUG(); size = (sizeof(struct dasd_ccw_req) + 7L) & -8L; if (cplength > 0) @@ -89,7 +91,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; @@ -123,7 +125,8 @@ dasd_default_erp_postaction(struct dasd_ccw_req * cqr) struct dasd_device *device; int success; - BUG_ON(cqr->refers == NULL || cqr->function == NULL); + if (cqr->refers == NULL || cqr->function == NULL) + BUG(); device = cqr->device; success = cqr->status == DASD_CQR_DONE; @@ -154,7 +157,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 @@ -226,12 +229,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 e85015be1..91145698f 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,6 +6,7 @@ * */ +#include #include #include #include @@ -44,8 +45,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 */ }, }; @@ -55,13 +56,19 @@ static struct ccw_driver dasd_fba_driver; /* see below */ static int dasd_fba_probe(struct ccw_device *cdev) { - return dasd_generic_probe(cdev, &dasd_fba_discipline); + int ret; + + ret = dasd_generic_probe (cdev, &dasd_fba_discipline); + if (ret) + return ret; + ccw_device_set_options(cdev, CCWDEV_DO_PATHGROUP); + return 0; } 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 = { @@ -118,13 +125,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 = kzalloc(sizeof(struct dasd_fba_private), GFP_KERNEL); + private = kmalloc(sizeof(struct dasd_fba_private), GFP_KERNEL); if (private == NULL) { DEV_MESSAGE(KERN_WARNING, device, "%s", "memory allocation failed for private " @@ -197,7 +204,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: @@ -532,7 +539,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. @@ -562,8 +569,16 @@ static struct dasd_discipline dasd_fba_discipline = { static int __init dasd_fba_init(void) { + int ret; + ASCEBC(dasd_fba_discipline.ebcname, 4); - return ccw_driver_register(&dasd_fba_driver); + + ret = ccw_driver_register(&dasd_fba_driver); + if (ret) + return ret; + + dasd_generic_auto_online(&dasd_fba_driver); + return 0; } static void __exit @@ -574,3 +589,22 @@ 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 14c910baa..da1fa91fc 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 d16363210..fce2835e7 100644 --- a/drivers/s390/block/dasd_genhd.c +++ b/drivers/s390/block/dasd_genhd.c @@ -11,6 +11,7 @@ * */ +#include #include #include #include @@ -67,6 +68,8 @@ 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; @@ -83,12 +86,10 @@ dasd_gendisk_alloc(struct dasd_device *device) void dasd_gendisk_free(struct dasd_device *device) { - if (device->gdp) { - del_gendisk(device->gdp); - device->gdp->queue = NULL; - put_disk(device->gdp); - device->gdp = NULL; - } + del_gendisk(device->gdp); + device->gdp->queue = 0; + put_disk(device->gdp); + device->gdp = 0; } /* @@ -138,7 +139,7 @@ dasd_destroy_partitions(struct dasd_device * device) * device->bdev to lower the offline open_count limit again. */ bdev = device->bdev; - device->bdev = NULL; + device->bdev = 0; /* * See fs/partition/check.c:delete_partition @@ -147,7 +148,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 = (void __user *) &bpart; + barg.data = &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 3ccf06d28..7cb0b9e78 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,6 +54,7 @@ #include #include #include +#include #include #include #include @@ -68,6 +69,15 @@ */ struct dasd_device; +typedef int (*dasd_ioctl_fn_t) (struct block_device *bdev, int no, long args); + +struct dasd_ioctl { + struct list_head list; + struct module *owner; + int no; + dasd_ioctl_fn_t handler; +}; + typedef enum { dasd_era_fatal = -1, /* no chance to recover */ dasd_era_none = 0, /* don't recover, everything alright */ @@ -185,7 +195,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 */ @@ -247,7 +257,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 @@ -262,38 +272,10 @@ struct dasd_discipline { /* i/o control functions. */ int (*fill_geometry) (struct dasd_device *, struct hd_geometry *); int (*fill_info) (struct dasd_device *, struct dasd_information2_t *); - int (*ioctl) (struct dasd_device *, unsigned int, void __user *); }; extern struct dasd_discipline *dasd_diag_discipline_pointer; -/* - * Unique identifier for dasd device. - */ -struct dasd_uid { - __u8 alias; - char vendor[4]; - char serial[15]; - __u16 ssid; - __u8 unit_addr; -}; - -/* - * Notification numbers for extended error reporting notifications: - * The DASD_EER_DISABLE notification is sent before a dasd_device (and it's - * eer pointer) is freed. The error reporting module needs to do all necessary - * cleanup steps. - * The DASD_EER_TRIGGER notification sends the actual error reports (triggers). - */ -#define DASD_EER_DISABLE 0 -#define DASD_EER_TRIGGER 1 - -/* Trigger IDs for extended error reporting DASD_EER_TRIGGER notification */ -#define DASD_EER_FATALERROR 1 -#define DASD_EER_NOPATH 2 -#define DASD_EER_STATECHANGE 3 -#define DASD_EER_PPRCSUSPEND 4 - struct dasd_device { /* Block device stuff. */ struct gendisk *gdp; @@ -301,14 +283,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!) */ - - /* extended error reporting stuff (eer) */ - struct dasd_ccw_req *eer_cqr; + 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!) */ /* Device discipline stuff. */ struct dasd_discipline *discipline; @@ -355,8 +334,6 @@ struct dasd_device { /* per device flags */ #define DASD_FLAG_DSC_ERROR 2 /* return -EIO when disconnected */ #define DASD_FLAG_OFFLINE 3 /* device is in offline processing */ -#define DASD_FLAG_EER_SNSS 4 /* A SNSS is required */ -#define DASD_FLAG_EER_IN_USE 5 /* A SNSS request is running */ void dasd_put_device_wake(struct dasd_device *); @@ -512,12 +489,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); @@ -525,8 +502,6 @@ void dasd_devmap_exit(void); struct dasd_device *dasd_create_device(struct ccw_device *); void dasd_delete_device(struct dasd_device *); -int dasd_get_uid(struct ccw_device *, struct dasd_uid *); -int dasd_set_uid(struct ccw_device *, struct dasd_uid *); int dasd_get_feature(struct ccw_device *, int); int dasd_set_feature(struct ccw_device *, int, int); @@ -548,6 +523,10 @@ int dasd_scan_partitions(struct dasd_device *); void dasd_destroy_partitions(struct dasd_device *); /* externals in dasd_ioctl.c */ +int dasd_ioctl_init(void); +void dasd_ioctl_exit(void); +int dasd_ioctl_no_register(struct module *, int, dasd_ioctl_fn_t); +int dasd_ioctl_no_unregister(struct module *, int, dasd_ioctl_fn_t); int dasd_ioctl(struct inode *, struct file *, unsigned int, unsigned long); long dasd_compat_ioctl(struct file *, unsigned int, unsigned long); @@ -578,30 +557,25 @@ dasd_era_t dasd_9336_erp_examine(struct dasd_ccw_req *, struct irb *); dasd_era_t dasd_9343_erp_examine(struct dasd_ccw_req *, struct irb *); struct dasd_ccw_req *dasd_9343_erp_action(struct dasd_ccw_req *); -/* externals in dasd_eer.c */ -#ifdef CONFIG_DASD_EER -int dasd_eer_init(void); -void dasd_eer_exit(void); -int dasd_eer_enable(struct dasd_device *); -void dasd_eer_disable(struct dasd_device *); -void dasd_eer_write(struct dasd_device *, struct dasd_ccw_req *cqr, - unsigned int id); -void dasd_eer_snss(struct dasd_device *); - -static inline int dasd_eer_enabled(struct dasd_device *device) -{ - return device->eer_cqr != NULL; -} -#else -#define dasd_eer_init() (0) -#define dasd_eer_exit() do { } while (0) -#define dasd_eer_enable(d) (0) -#define dasd_eer_disable(d) do { } while (0) -#define dasd_eer_write(d,c,i) do { } while (0) -#define dasd_eer_snss(d) do { } while (0) -#define dasd_eer_enabled(d) (0) -#endif /* CONFIG_DASD_ERR */ - #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 8fed3603e..fafeeae52 100644 --- a/drivers/s390/block/dasd_ioctl.c +++ b/drivers/s390/block/dasd_ioctl.c @@ -9,13 +9,13 @@ * * i/o controls for the dasd driver. */ +#include #include #include #include #include #include -#include #include /* This is ugly... */ @@ -23,12 +23,116 @@ #include "dasd_int.h" +/* + * SECTION: ioctl functions. + */ +static struct list_head dasd_ioctl_list = LIST_HEAD_INIT(dasd_ioctl_list); + +/* + * Find the ioctl with number no. + */ +static struct dasd_ioctl * +dasd_find_ioctl(int no) +{ + struct dasd_ioctl *ioctl; + + list_for_each_entry (ioctl, &dasd_ioctl_list, list) + if (ioctl->no == no) + return ioctl; + return NULL; +} + +/* + * Register ioctl with number no. + */ +int +dasd_ioctl_no_register(struct module *owner, int no, dasd_ioctl_fn_t handler) +{ + struct dasd_ioctl *new; + if (dasd_find_ioctl(no)) + return -EBUSY; + new = kmalloc(sizeof (struct dasd_ioctl), GFP_KERNEL); + if (new == NULL) + return -ENOMEM; + new->owner = owner; + new->no = no; + new->handler = handler; + list_add(&new->list, &dasd_ioctl_list); + return 0; +} + +/* + * Deregister ioctl with number no. + */ +int +dasd_ioctl_no_unregister(struct module *owner, int no, dasd_ioctl_fn_t handler) +{ + struct dasd_ioctl *old = dasd_find_ioctl(no); + if (old == NULL) + return -ENOENT; + if (old->no != no || old->handler != handler || owner != old->owner) + return -EINVAL; + list_del(&old->list); + kfree(old); + return 0; +} + +int +dasd_ioctl(struct inode *inp, struct file *filp, + unsigned int no, unsigned long data) +{ + struct block_device *bdev = inp->i_bdev; + struct dasd_device *device = bdev->bd_disk->private_data; + struct dasd_ioctl *ioctl; + const char *dir; + int rc; + + if ((_IOC_DIR(no) != _IOC_NONE) && (data == 0)) { + PRINT_DEBUG("empty data ptr"); + return -EINVAL; + } + dir = _IOC_DIR (no) == _IOC_NONE ? "0" : + _IOC_DIR (no) == _IOC_READ ? "r" : + _IOC_DIR (no) == _IOC_WRITE ? "w" : + _IOC_DIR (no) == (_IOC_READ | _IOC_WRITE) ? "rw" : "u"; + DBF_DEV_EVENT(DBF_DEBUG, device, + "ioctl 0x%08x %s'0x%x'%d(%d) with data %8lx", no, + dir, _IOC_TYPE(no), _IOC_NR(no), _IOC_SIZE(no), data); + /* Search for ioctl no in the ioctl list. */ + list_for_each_entry(ioctl, &dasd_ioctl_list, list) { + if (ioctl->no == no) { + /* Found a matching ioctl. Call it. */ + if (!try_module_get(ioctl->owner)) + continue; + rc = ioctl->handler(bdev, no, data); + module_put(ioctl->owner); + return rc; + } + } + /* No ioctl with number no. */ + DBF_DEV_EVENT(DBF_INFO, device, + "unknown ioctl 0x%08x=%s'0x%x'%d(%d) data %8lx", no, + dir, _IOC_TYPE(no), _IOC_NR(no), _IOC_SIZE(no), data); + return -EINVAL; +} + +long +dasd_compat_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) +{ + int rval; + + lock_kernel(); + rval = dasd_ioctl(filp->f_dentry->d_inode, filp, cmd, arg); + unlock_kernel(); + + return (rval == -EINVAL) ? -ENOIOCTLCMD : rval; +} static int -dasd_ioctl_api_version(void __user *argp) +dasd_ioctl_api_version(struct block_device *bdev, int no, long args) { int ver = DASD_API_VERSION; - return put_user(ver, (int __user *)argp); + return put_user(ver, (int __user *) args); } /* @@ -36,18 +140,20 @@ dasd_ioctl_api_version(void __user *argp) * used by dasdfmt after BIODASDDISABLE to retrigger blocksize detection */ static int -dasd_ioctl_enable(struct block_device *bdev) +dasd_ioctl_enable(struct block_device *bdev, int no, long args) { - struct dasd_device *device = bdev->bd_disk->private_data; + struct dasd_device *device; if (!capable(CAP_SYS_ADMIN)) return -EACCES; - + device = bdev->bd_disk->private_data; + if (device == NULL) + return -ENODEV; dasd_enable_device(device); /* Formatting the dasd device can change the capacity. */ - mutex_lock(&bdev->bd_mutex); + down(&bdev->bd_sem); i_size_write(bdev->bd_inode, (loff_t)get_capacity(device->gdp) << 9); - mutex_unlock(&bdev->bd_mutex); + up(&bdev->bd_sem); return 0; } @@ -56,13 +162,15 @@ dasd_ioctl_enable(struct block_device *bdev) * Used by dasdfmt. Disable I/O operations but allow ioctls. */ static int -dasd_ioctl_disable(struct block_device *bdev) +dasd_ioctl_disable(struct block_device *bdev, int no, long args) { - struct dasd_device *device = bdev->bd_disk->private_data; + struct dasd_device *device; if (!capable(CAP_SYS_ADMIN)) return -EACCES; - + device = bdev->bd_disk->private_data; + if (device == NULL) + return -ENODEV; /* * Man this is sick. We don't do a real disable but only downgrade * the device to DASD_STATE_BASIC. The reason is that dasdfmt uses @@ -76,9 +184,9 @@ dasd_ioctl_disable(struct block_device *bdev) * Set i_size to zero, since read, write, etc. check against this * value. */ - mutex_lock(&bdev->bd_mutex); + down(&bdev->bd_sem); i_size_write(bdev->bd_inode, 0); - mutex_unlock(&bdev->bd_mutex); + up(&bdev->bd_sem); return 0; } @@ -86,13 +194,18 @@ dasd_ioctl_disable(struct block_device *bdev) * Quiesce device. */ static int -dasd_ioctl_quiesce(struct dasd_device *device) +dasd_ioctl_quiesce(struct block_device *bdev, int no, long args) { + struct dasd_device *device; unsigned long flags; - + if (!capable (CAP_SYS_ADMIN)) return -EACCES; - + + device = bdev->bd_disk->private_data; + if (device == NULL) + return -ENODEV; + DEV_MESSAGE (KERN_DEBUG, device, "%s", "Quiesce IO on device"); spin_lock_irqsave(get_ccwdev_lock(device->cdev), flags); @@ -106,16 +219,21 @@ dasd_ioctl_quiesce(struct dasd_device *device) * Quiesce device. */ static int -dasd_ioctl_resume(struct dasd_device *device) +dasd_ioctl_resume(struct block_device *bdev, int no, long args) { + struct dasd_device *device; unsigned long flags; - - if (!capable (CAP_SYS_ADMIN)) + + if (!capable (CAP_SYS_ADMIN)) return -EACCES; + device = bdev->bd_disk->private_data; + if (device == NULL) + return -ENODEV; + 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); @@ -184,19 +302,25 @@ dasd_format(struct dasd_device * device, struct format_data_t * fdata) * Format device. */ static int -dasd_ioctl_format(struct block_device *bdev, void __user *argp) +dasd_ioctl_format(struct block_device *bdev, int no, long args) { - struct dasd_device *device = bdev->bd_disk->private_data; + struct dasd_device *device; struct format_data_t fdata; if (!capable(CAP_SYS_ADMIN)) return -EACCES; - if (!argp) + if (!args) return -EINVAL; + /* fdata == NULL is no longer a valid arg to dasd_format ! */ + device = bdev->bd_disk->private_data; + + if (device == NULL) + return -ENODEV; if (device->features & DASD_FEATURE_READONLY) return -EROFS; - if (copy_from_user(&fdata, argp, sizeof(struct format_data_t))) + if (copy_from_user(&fdata, (void __user *) args, + sizeof (struct format_data_t))) return -EFAULT; if (bdev != bdev->bd_contains) { DEV_MESSAGE(KERN_WARNING, device, "%s", @@ -211,8 +335,17 @@ dasd_ioctl_format(struct block_device *bdev, void __user *argp) * Reset device profile information */ static int -dasd_ioctl_reset_profile(struct dasd_device *device) +dasd_ioctl_reset_profile(struct block_device *bdev, int no, long args) { + struct dasd_device *device; + + if (!capable(CAP_SYS_ADMIN)) + return -EACCES; + + device = bdev->bd_disk->private_data; + if (device == NULL) + return -ENODEV; + memset(&device->profile, 0, sizeof (struct dasd_profile_info_t)); return 0; } @@ -221,24 +354,31 @@ dasd_ioctl_reset_profile(struct dasd_device *device) * Return device profile information */ static int -dasd_ioctl_read_profile(struct dasd_device *device, void __user *argp) +dasd_ioctl_read_profile(struct block_device *bdev, int no, long args) { + struct dasd_device *device; + + device = bdev->bd_disk->private_data; + if (device == NULL) + return -ENODEV; + if (dasd_profile_level == DASD_PROFILE_OFF) return -EIO; - if (copy_to_user(argp, &device->profile, + + if (copy_to_user((long __user *) args, (long *) &device->profile, sizeof (struct dasd_profile_info_t))) return -EFAULT; return 0; } #else static int -dasd_ioctl_reset_profile(struct dasd_device *device) +dasd_ioctl_reset_profile(struct block_device *bdev, int no, long args) { return -ENOSYS; } static int -dasd_ioctl_read_profile(struct dasd_device *device, void __user *argp) +dasd_ioctl_read_profile(struct block_device *bdev, int no, long args) { return -ENOSYS; } @@ -248,18 +388,22 @@ dasd_ioctl_read_profile(struct dasd_device *device, void __user *argp) * Return dasd information. Used for BIODASDINFO and BIODASDINFO2. */ static int -dasd_ioctl_information(struct dasd_device *device, - unsigned int cmd, void __user *argp) +dasd_ioctl_information(struct block_device *bdev, int no, long args) { + struct dasd_device *device; struct dasd_information2_t *dasd_info; unsigned long flags; int rc; struct ccw_device *cdev; + device = bdev->bd_disk->private_data; + if (device == NULL) + return -ENODEV; + if (!device->discipline->fill_info) return -EINVAL; - dasd_info = kzalloc(sizeof(struct dasd_information2_t), GFP_KERNEL); + dasd_info = kmalloc(sizeof(struct dasd_information2_t), GFP_KERNEL); if (dasd_info == NULL) return -ENOMEM; @@ -286,7 +430,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' @@ -302,7 +446,8 @@ dasd_ioctl_information(struct dasd_device *device, memcpy(dasd_info->type, device->discipline->name, 4); else memcpy(dasd_info->type, "none", 4); - + dasd_info->req_queue_len = 0; + dasd_info->chanq_len = 0; if (device->request_queue->request_fn) { struct list_head *l; #ifdef DASD_EXTENDED_PROFILING @@ -322,8 +467,8 @@ dasd_ioctl_information(struct dasd_device *device, } rc = 0; - if (copy_to_user(argp, dasd_info, - ((cmd == (unsigned int) BIODASDINFO2) ? + if (copy_to_user((long __user *) args, (long *) dasd_info, + ((no == (unsigned int) BIODASDINFO2) ? sizeof (struct dasd_information2_t) : sizeof (struct dasd_information_t)))) rc = -EFAULT; @@ -335,103 +480,69 @@ dasd_ioctl_information(struct dasd_device *device, * Set read only */ static int -dasd_ioctl_set_ro(struct block_device *bdev, void __user *argp) +dasd_ioctl_set_ro(struct block_device *bdev, int no, long args) { - struct dasd_device *device = bdev->bd_disk->private_data; - int intval; + struct dasd_device *device; + int intval, rc; if (!capable(CAP_SYS_ADMIN)) return -EACCES; if (bdev != bdev->bd_contains) // ro setting is not allowed for partitions return -EINVAL; - if (get_user(intval, (int __user *)argp)) + if (get_user(intval, (int __user *) args)) return -EFAULT; + device = bdev->bd_disk->private_data; + if (device == NULL) + return -ENODEV; set_disk_ro(bdev->bd_disk, intval); - return dasd_set_feature(device->cdev, DASD_FEATURE_READONLY, intval); + rc = dasd_set_feature(device->cdev, DASD_FEATURE_READONLY, intval); + + return rc; } -static int -dasd_ioctl_readall_cmb(struct dasd_device *device, unsigned int cmd, - unsigned long arg) +/* + * List of static ioctls. + */ +static struct { int no; dasd_ioctl_fn_t fn; } dasd_ioctls[] = { - struct cmbdata __user *argp = (void __user *) arg; - size_t size = _IOC_SIZE(cmd); - struct cmbdata data; - int ret; - - ret = cmf_readall(device->cdev, &data); - if (!ret && copy_to_user(argp, &data, min(size, sizeof(*argp)))) - return -EFAULT; - return ret; -} + { BIODASDDISABLE, dasd_ioctl_disable }, + { BIODASDENABLE, dasd_ioctl_enable }, + { BIODASDQUIESCE, dasd_ioctl_quiesce }, + { BIODASDRESUME, dasd_ioctl_resume }, + { BIODASDFMT, dasd_ioctl_format }, + { BIODASDINFO, dasd_ioctl_information }, + { BIODASDINFO2, dasd_ioctl_information }, + { BIODASDPRRD, dasd_ioctl_read_profile }, + { BIODASDPRRST, dasd_ioctl_reset_profile }, + { BLKROSET, dasd_ioctl_set_ro }, + { DASDAPIVER, dasd_ioctl_api_version }, + { -1, NULL } +}; int -dasd_ioctl(struct inode *inode, struct file *file, - unsigned int cmd, unsigned long arg) +dasd_ioctl_init(void) { - struct block_device *bdev = inode->i_bdev; - struct dasd_device *device = bdev->bd_disk->private_data; - void __user *argp = (void __user *)arg; - - if (!device) - return -ENODEV; - - if ((_IOC_DIR(cmd) != _IOC_NONE) && !arg) { - PRINT_DEBUG("empty data ptr"); - return -EINVAL; - } + int i; - switch (cmd) { - case BIODASDDISABLE: - return dasd_ioctl_disable(bdev); - case BIODASDENABLE: - return dasd_ioctl_enable(bdev); - case BIODASDQUIESCE: - return dasd_ioctl_quiesce(device); - case BIODASDRESUME: - return dasd_ioctl_resume(device); - case BIODASDFMT: - return dasd_ioctl_format(bdev, argp); - case BIODASDINFO: - return dasd_ioctl_information(device, cmd, argp); - case BIODASDINFO2: - return dasd_ioctl_information(device, cmd, argp); - case BIODASDPRRD: - return dasd_ioctl_read_profile(device, argp); - case BIODASDPRRST: - return dasd_ioctl_reset_profile(device); - case BLKROSET: - return dasd_ioctl_set_ro(bdev, argp); - case DASDAPIVER: - return dasd_ioctl_api_version(argp); - case BIODASDCMFENABLE: - return enable_cmf(device->cdev); - case BIODASDCMFDISABLE: - return disable_cmf(device->cdev); - case BIODASDREADALLCMB: - return dasd_ioctl_readall_cmb(device, cmd, arg); - default: - /* if the discipline has an ioctl method try it. */ - if (device->discipline->ioctl) { - int rval = device->discipline->ioctl(device, cmd, argp); - if (rval != -ENOIOCTLCMD) - return rval; - } + for (i = 0; dasd_ioctls[i].no != -1; i++) + dasd_ioctl_no_register(NULL, dasd_ioctls[i].no, + dasd_ioctls[i].fn); + return 0; - return -EINVAL; - } } -long -dasd_compat_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) +void +dasd_ioctl_exit(void) { - int rval; + int i; - lock_kernel(); - rval = dasd_ioctl(filp->f_dentry->d_inode, filp, cmd, arg); - unlock_kernel(); + for (i = 0; dasd_ioctls[i].no != -1; i++) + dasd_ioctl_no_unregister(NULL, dasd_ioctls[i].no, + dasd_ioctls[i].fn); - return (rval == -EINVAL) ? -ENOIOCTLCMD : rval; } + +EXPORT_SYMBOL(dasd_ioctl_no_register); +EXPORT_SYMBOL(dasd_ioctl_no_unregister); diff --git a/drivers/s390/block/dasd_proc.c b/drivers/s390/block/dasd_proc.c index bfa010f6d..1aa3c2617 100644 --- a/drivers/s390/block/dasd_proc.c +++ b/drivers/s390/block/dasd_proc.c @@ -11,6 +11,7 @@ * */ +#include #include #include #include @@ -293,40 +294,23 @@ out_error: #endif /* CONFIG_DASD_PROFILE */ } -/* - * Create dasd proc-fs entries. - * In case creation failed, cleanup and return -ENOENT. - */ int dasd_proc_init(void) { dasd_proc_root_entry = proc_mkdir("dasd", &proc_root); - if (!dasd_proc_root_entry) - goto out_nodasd; dasd_proc_root_entry->owner = THIS_MODULE; dasd_devices_entry = create_proc_entry("devices", S_IFREG | S_IRUGO | S_IWUSR, dasd_proc_root_entry); - if (!dasd_devices_entry) - goto out_nodevices; dasd_devices_entry->proc_fops = &dasd_devices_file_ops; dasd_devices_entry->owner = THIS_MODULE; dasd_statistics_entry = create_proc_entry("statistics", S_IFREG | S_IRUGO | S_IWUSR, dasd_proc_root_entry); - if (!dasd_statistics_entry) - goto out_nostatistics; dasd_statistics_entry->read_proc = dasd_statistics_read; dasd_statistics_entry->write_proc = dasd_statistics_write; dasd_statistics_entry->owner = THIS_MODULE; return 0; - - out_nostatistics: - remove_proc_entry("devices", dasd_proc_root_entry); - out_nodevices: - remove_proc_entry("dasd", &proc_root); - out_nodasd: - return -ENOENT; } void diff --git a/drivers/s390/block/dcssblk.c b/drivers/s390/block/dcssblk.c index be9b05347..2e727f49a 100644 --- a/drivers/s390/block/dcssblk.c +++ b/drivers/s390/block/dcssblk.c @@ -273,7 +273,7 @@ removeseg: list_del(&dev_info->lh); del_gendisk(dev_info->gd); - blk_cleanup_queue(dev_info->dcssblk_queue); + blk_put_queue(dev_info->dcssblk_queue); dev_info->gd->queue = NULL; put_disk(dev_info->gd); device_unregister(dev); @@ -388,11 +388,12 @@ dcssblk_add_store(struct device *dev, struct device_attribute *attr, const char /* * get a struct dcssblk_dev_info */ - dev_info = kzalloc(sizeof(struct dcssblk_dev_info), GFP_KERNEL); + dev_info = kmalloc(sizeof(struct dcssblk_dev_info), GFP_KERNEL); if (dev_info == NULL) { rc = -ENOMEM; goto out; } + memset(dev_info, 0, sizeof(struct dcssblk_dev_info)); strcpy(dev_info->segment_name, local_buf); strlcpy(dev_info->dev.bus_id, local_buf, BUS_ID_SIZE); @@ -490,7 +491,7 @@ dcssblk_add_store(struct device *dev, struct device_attribute *attr, const char unregister_dev: PRINT_ERR("device_create_file() failed!\n"); list_del(&dev_info->lh); - blk_cleanup_queue(dev_info->dcssblk_queue); + blk_put_queue(dev_info->dcssblk_queue); dev_info->gd->queue = NULL; put_disk(dev_info->gd); device_unregister(&dev_info->dev); @@ -504,7 +505,7 @@ list_del: unload_seg: segment_unload(local_buf); dealloc_gendisk: - blk_cleanup_queue(dev_info->dcssblk_queue); + blk_put_queue(dev_info->dcssblk_queue); dev_info->gd->queue = NULL; put_disk(dev_info->gd); free_dev_info: @@ -561,7 +562,7 @@ dcssblk_remove_store(struct device *dev, struct device_attribute *attr, const ch list_del(&dev_info->lh); del_gendisk(dev_info->gd); - blk_cleanup_queue(dev_info->dcssblk_queue); + blk_put_queue(dev_info->dcssblk_queue); dev_info->gd->queue = NULL; put_disk(dev_info->gd); device_unregister(&dev_info->dev); diff --git a/drivers/s390/block/xpram.c b/drivers/s390/block/xpram.c index ca7d51f7e..54ecd548c 100644 --- a/drivers/s390/block/xpram.c +++ b/drivers/s390/block/xpram.c @@ -36,6 +36,7 @@ #include /* HDIO_GETGEO */ #include #include +#include #include #define XPRAM_NAME "xpram" @@ -48,6 +49,15 @@ #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 */ @@ -62,11 +72,11 @@ static int xpram_devs; /* * Parameter parsing functions. */ -static int __initdata devs = XPRAM_DEVS; -static char __initdata *sizes[XPRAM_MAX_DEVS]; +static int devs = XPRAM_DEVS; +static unsigned int sizes[XPRAM_MAX_DEVS]; module_param(devs, int, 0); -module_param_array(sizes, charp, NULL, 0); +module_param_array(sizes, int, NULL, 0); MODULE_PARM_DESC(devs, "number of devices (\"partitions\"), " \ "the default is " __MODULE_STRING(XPRAM_DEVS) "\n"); @@ -77,6 +87,59 @@ 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 @@ -295,7 +358,6 @@ 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; @@ -313,19 +375,7 @@ static int __init xpram_setup_sizes(unsigned long pages) mem_needed = 0; mem_auto_no = 0; for (i = 0; i < xpram_devs; i++) { - 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; - } + xpram_sizes[i] = (sizes[i] + 3) & -4UL; if (xpram_sizes[i]) mem_needed += xpram_sizes[i]; else @@ -389,6 +439,8 @@ 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. @@ -417,12 +469,14 @@ 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--) @@ -441,7 +495,10 @@ 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) @@ -459,7 +516,19 @@ static int __init xpram_init(void) rc = xpram_setup_sizes(xpram_pages); if (rc) return rc; - return xpram_setup_blkdev(); + 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; } module_init(xpram_init); diff --git a/drivers/s390/char/Makefile b/drivers/s390/char/Makefile index 0c0162ff6..6377a9673 100644 --- a/drivers/s390/char/Makefile +++ b/drivers/s390/char/Makefile @@ -26,5 +26,4 @@ tape-$(CONFIG_PROC_FS) += tape_proc.o tape-objs := tape_core.o tape_std.o tape_char.o $(tape-y) obj-$(CONFIG_S390_TAPE) += tape.o tape_class.o obj-$(CONFIG_S390_TAPE_34XX) += tape_34xx.o -obj-$(CONFIG_S390_TAPE_3590) += tape_3590.o obj-$(CONFIG_MONREADER) += monreader.o diff --git a/drivers/s390/char/con3215.c b/drivers/s390/char/con3215.c index 2fa566fa6..606f6ad28 100644 --- a/drivers/s390/char/con3215.c +++ b/drivers/s390/char/con3215.c @@ -11,6 +11,7 @@ * Dan Morrison, IBM Corporation (dmorriso@cse.buffalo.edu) */ +#include #include #include #include @@ -693,7 +694,7 @@ raw3215_probe (struct ccw_device *cdev) GFP_KERNEL|GFP_DMA); if (raw->buffer == NULL) { spin_lock(&raw3215_device_lock); - raw3215[line] = NULL; + raw3215[line] = 0; spin_unlock(&raw3215_device_lock); kfree(raw); return -ENOMEM; diff --git a/drivers/s390/char/con3270.c b/drivers/s390/char/con3270.c index 7566be890..ef607a1de 100644 --- a/drivers/s390/char/con3270.c +++ b/drivers/s390/char/con3270.c @@ -8,6 +8,7 @@ * -- 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 d83eb6358..be463242c 100644 --- a/drivers/s390/char/ctrlchar.c +++ b/drivers/s390/char/ctrlchar.c @@ -7,6 +7,7 @@ * */ +#include #include #include #include @@ -23,7 +24,7 @@ ctrlchar_handle_sysrq(void *tty) handle_sysrq(ctrlchar_sysrq_key, NULL, (struct tty_struct *) tty); } -static DECLARE_WORK(ctrlchar_work, ctrlchar_handle_sysrq, NULL); +static DECLARE_WORK(ctrlchar_work, ctrlchar_handle_sysrq, 0); #endif diff --git a/drivers/s390/char/defkeymap.c b/drivers/s390/char/defkeymap.c index 17027d918..ca15adb14 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, NULL, NULL, - ctrl_map, shift_ctrl_map, NULL, + plain_map, shift_map, 0, 0, + ctrl_map, shift_ctrl_map, 0 }; unsigned int keymap_count = 4; @@ -145,7 +145,7 @@ char *func_table[MAX_NR_FUNC] = { func_buf + 97, func_buf + 103, func_buf + 109, - NULL, + 0, }; struct kbdiacr accent_table[MAX_DIACR] = { diff --git a/drivers/s390/char/fs3270.c b/drivers/s390/char/fs3270.c index d54d5025f..5f6fa4c67 100644 --- a/drivers/s390/char/fs3270.c +++ b/drivers/s390/char/fs3270.c @@ -8,6 +8,7 @@ * -- Copyright (C) 2003 IBM Deutschland Entwicklung GmbH, IBM Corporation */ +#include #include #include #include @@ -236,7 +237,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 __user *data, size_t count, loff_t *off) +fs3270_read(struct file *filp, char *data, size_t count, loff_t *off) { struct fs3270 *fp; struct raw3270_request *rq; @@ -281,7 +282,7 @@ fs3270_read(struct file *filp, char __user *data, size_t count, loff_t *off) * Process writes to fullscreen 3270. */ static ssize_t -fs3270_write(struct file *filp, const char __user *data, size_t count, loff_t *off) +fs3270_write(struct file *filp, const char *data, size_t count, loff_t *off) { struct fs3270 *fp; struct raw3270_request *rq; @@ -338,10 +339,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 __user *) arg); + rc = put_user(fp->read_command, (char *) arg); break; case TUBGETO: - rc = put_user(fp->write_command,(char __user *) arg); + rc = put_user(fp->write_command,(char *) arg); break; case TUBGETMOD: iocb.model = fp->view.model; @@ -350,7 +351,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 __user *) arg, &iocb, + if (copy_to_user((char *) arg, &iocb, sizeof(struct raw3270_iocb))) rc = -EFAULT; break; @@ -367,9 +368,10 @@ fs3270_alloc_view(void) { struct fs3270 *fp; - fp = kzalloc(sizeof(struct fs3270),GFP_KERNEL); + fp = (struct fs3270 *) kmalloc(sizeof(struct fs3270),GFP_KERNEL); if (!fp) return ERR_PTR(-ENOMEM); + memset(fp, 0, sizeof(struct fs3270)); fp->init = raw3270_request_alloc(0); if (IS_ERR(fp->init)) { kfree(fp); @@ -425,15 +427,11 @@ fs3270_open(struct inode *inode, struct file *filp) minor = iminor(filp->f_dentry->d_inode); /* Check for minor 0 multiplexer. */ if (minor == 0) { - struct tty_struct *tty; - mutex_lock(&tty_mutex); - tty = get_current_tty(); - if (!tty || tty->driver->major != IBM_TTY3270_MAJOR) { - mutex_unlock(&tty_mutex); + if (!current->signal->tty) return -ENODEV; - } - minor = tty->index + RAW3270_FIRSTMINOR; - mutex_unlock(&tty_mutex); + if (current->signal->tty->driver->major != IBM_TTY3270_MAJOR) + return -ENODEV; + minor = current->signal->tty->index + RAW3270_FIRSTMINOR; } /* Check if some other program is already using fullscreen mode. */ fp = (struct fs3270 *) raw3270_find_view(&fs3270_fn, minor); @@ -483,7 +481,7 @@ fs3270_close(struct inode *inode, struct file *filp) struct fs3270 *fp; fp = filp->private_data; - filp->private_data = NULL; + filp->private_data = 0; 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 3be065691..a317a123d 100644 --- a/drivers/s390/char/keyboard.c +++ b/drivers/s390/char/keyboard.c @@ -7,6 +7,7 @@ * Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com), */ +#include #include #include #include @@ -49,12 +50,14 @@ kbd_alloc(void) { struct kbd_data *kbd; int i, len; - kbd = kzalloc(sizeof(struct kbd_data), GFP_KERNEL); + kbd = kmalloc(sizeof(struct kbd_data), GFP_KERNEL); if (!kbd) goto out; - kbd->key_maps = kzalloc(sizeof(key_maps), GFP_KERNEL); - if (!kbd->key_maps) + memset(kbd, 0, sizeof(struct kbd_data)); + kbd->key_maps = kmalloc(sizeof(key_maps), GFP_KERNEL); + if (!key_maps) goto out_kbd; + memset(kbd->key_maps, 0, sizeof(key_maps)); for (i = 0; i < ARRAY_SIZE(key_maps); i++) { if (key_maps[i]) { kbd->key_maps[i] = @@ -65,9 +68,10 @@ kbd_alloc(void) { sizeof(u_short)*NR_KEYS); } } - kbd->func_table = kzalloc(sizeof(func_table), GFP_KERNEL); + kbd->func_table = kmalloc(sizeof(func_table), GFP_KERNEL); if (!kbd->func_table) goto out_maps; + memset(kbd->func_table, 0, sizeof(func_table)); for (i = 0; i < ARRAY_SIZE(func_table); i++) { if (func_table[i]) { len = strlen(func_table[i]) + 1; @@ -78,9 +82,10 @@ kbd_alloc(void) { } } kbd->fn_handler = - kzalloc(sizeof(fn_handler_fn *) * NR_FN_HANDLER, GFP_KERNEL); + kmalloc(sizeof(fn_handler_fn *) * NR_FN_HANDLER, GFP_KERNEL); if (!kbd->fn_handler) goto out_func; + memset(kbd->fn_handler, 0, sizeof(fn_handler_fn *) * NR_FN_HANDLER); kbd->accent_table = kmalloc(sizeof(struct kbdiacr)*MAX_DIACR, GFP_KERNEL); if (!kbd->accent_table) @@ -103,7 +108,7 @@ out_maps: out_kbd: kfree(kbd); out: - return NULL; + return 0; } void @@ -304,7 +309,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, NULL, kbd->tty); + handle_sysrq(value, 0, kbd->tty); return; } if (value == '-') { @@ -363,7 +368,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] = NULL; + kbd->key_maps[tmp.kb_table] = 0; kfree(key_map); } break; diff --git a/drivers/s390/char/monreader.c b/drivers/s390/char/monreader.c index a138b1510..5fd3ad867 100644 --- a/drivers/s390/char/monreader.c +++ b/drivers/s390/char/monreader.c @@ -257,13 +257,14 @@ mon_alloc_mem(void) int i,j; struct mon_private *monpriv; - monpriv = kzalloc(sizeof(struct mon_private), GFP_KERNEL); + monpriv = kmalloc(sizeof(struct mon_private), GFP_KERNEL); if (!monpriv) { P_ERROR("no memory for monpriv\n"); return NULL; } + memset(monpriv, 0, sizeof(struct mon_private)); for (i = 0; i < MON_MSGLIM; i++) { - monpriv->msg_array[i] = kzalloc(sizeof(struct mon_msg), + monpriv->msg_array[i] = kmalloc(sizeof(struct mon_msg), GFP_KERNEL); if (!monpriv->msg_array[i]) { P_ERROR("open, no memory for msg_array\n"); @@ -271,6 +272,7 @@ mon_alloc_mem(void) kfree(monpriv->msg_array[j]); return NULL; } + memset(monpriv->msg_array[i], 0, sizeof(struct mon_msg)); } return monpriv; } @@ -586,6 +588,7 @@ 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 7a84014f2..1026f2bc3 100644 --- a/drivers/s390/char/raw3270.c +++ b/drivers/s390/char/raw3270.c @@ -8,6 +8,7 @@ * -- Copyright (C) 2003 IBM Deutschland Entwicklung GmbH, IBM Corporation */ +#include #include #include #include @@ -27,7 +28,6 @@ #include #include #include -#include struct class *class3270; @@ -49,9 +49,6 @@ 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 */ @@ -62,7 +59,7 @@ struct raw3270 { #define RAW3270_FLAGS_CONSOLE 8 /* Device is the console. */ /* Semaphore to protect global data of raw3270 (devices, views, etc). */ -static DEFINE_MUTEX(raw3270_mutex); +static DECLARE_MUTEX(raw3270_sem); /* List of 3270 devices. */ static struct list_head raw3270_devices = LIST_HEAD_INIT(raw3270_devices); @@ -118,9 +115,10 @@ raw3270_request_alloc(size_t size) struct raw3270_request *rq; /* Allocate request structure */ - rq = kzalloc(sizeof(struct raw3270_request), GFP_KERNEL | GFP_DMA); + rq = kmalloc(sizeof(struct raw3270_request), GFP_KERNEL | GFP_DMA); if (!rq) return ERR_PTR(-ENOMEM); + memset(rq, 0, sizeof(struct raw3270_request)); /* alloc output buffer. */ if (size > 0) { @@ -486,6 +484,8 @@ 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 = NULL; + rq->callback = 0; 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(&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); + 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); 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. */ - 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); + 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); if (rc) return rc; /* Got a Query Reply */ - count = sizeof(rp->init_data) - rp->init_request.rescnt; - uap = (struct raw3270_ua *) (rp->init_data + 1); + count = sizeof(raw3270_init_data) - raw3270_init_request.rescnt; + uap = (struct raw3270_ua *) (raw3270_init_data + 1); /* Paranoia check. */ - if (rp->init_data[0] != 0x88 || uap->uab.qcode != 0x81) + if (raw3270_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 = NULL; - rp->view = NULL; + raw3270_init_view.dev = 0; + rp->view = 0; 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(&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); + 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); rp->view = &raw3270_init_view; raw3270_init_view.dev = rp; - rc = raw3270_start_init(rp, &raw3270_init_view, &rp->init_request); - raw3270_init_view.dev = NULL; - rp->view = NULL; + rc = raw3270_start_init(rp, &raw3270_init_view, &raw3270_init_request); + raw3270_init_view.dev = 0; + rp->view = 0; up(&raw3270_init_sem); return rc; } @@ -816,7 +816,7 @@ raw3270_setup_device(struct ccw_device *cdev, struct raw3270 *rp, char *ascebc) * number for it. Note: there is no device with minor 0, * see special case for fs3270.c:fs3270_open(). */ - mutex_lock(&raw3270_mutex); + down(&raw3270_sem); /* Keep the list sorted. */ minor = RAW3270_FIRSTMINOR; rp->minor = -1; @@ -833,7 +833,7 @@ raw3270_setup_device(struct ccw_device *cdev, struct raw3270 *rp, char *ascebc) rp->minor = minor; list_add_tail(&rp->list, &raw3270_devices); } - mutex_unlock(&raw3270_mutex); + up(&raw3270_sem); /* No free minor number? Then give up. */ if (rp->minor == -1) return -EUSERS; @@ -854,7 +854,7 @@ raw3270_setup_console(struct ccw_device *cdev) char *ascebc; int rc; - rp = (struct raw3270 *) alloc_bootmem_low(sizeof(struct raw3270)); + rp = (struct raw3270 *) alloc_bootmem(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 | GFP_DMA); + rp = kmalloc(sizeof(struct raw3270), GFP_KERNEL); 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 = NULL; + oldview = 0; 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 = NULL; + rp->view = 0; } } } @@ -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 = NULL; + rp->view = 0; /* 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 = NULL; + rp->view = 0; } } } @@ -1004,7 +1004,7 @@ raw3270_add_view(struct raw3270_view *view, struct raw3270_fn *fn, int minor) if (minor <= 0) return -ENODEV; - mutex_lock(&raw3270_mutex); + down(&raw3270_sem); rc = -ENODEV; list_for_each_entry(rp, &raw3270_devices, list) { if (rp->minor != minor) @@ -1025,7 +1025,7 @@ raw3270_add_view(struct raw3270_view *view, struct raw3270_fn *fn, int minor) spin_unlock_irqrestore(get_ccwdev_lock(rp->cdev), flags); break; } - mutex_unlock(&raw3270_mutex); + up(&raw3270_sem); return rc; } @@ -1039,7 +1039,7 @@ raw3270_find_view(struct raw3270_fn *fn, int minor) struct raw3270_view *view, *tmp; unsigned long flags; - mutex_lock(&raw3270_mutex); + down(&raw3270_sem); view = ERR_PTR(-ENODEV); list_for_each_entry(rp, &raw3270_devices, list) { if (rp->minor != minor) @@ -1058,7 +1058,7 @@ raw3270_find_view(struct raw3270_fn *fn, int minor) spin_unlock_irqrestore(get_ccwdev_lock(rp->cdev), flags); break; } - mutex_unlock(&raw3270_mutex); + up(&raw3270_sem); return view; } @@ -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 = NULL; + rp->view = 0; } list_del_init(&view->list); if (!rp->view && test_bit(RAW3270_FLAGS_READY, &rp->flags)) { @@ -1105,21 +1105,21 @@ raw3270_delete_device(struct raw3270 *rp) struct ccw_device *cdev; /* Remove from device chain. */ - mutex_lock(&raw3270_mutex); - if (rp->clttydev && !IS_ERR(rp->clttydev)) + down(&raw3270_sem); + if (rp->clttydev) class_device_destroy(class3270, MKDEV(IBM_TTY3270_MAJOR, rp->minor)); - if (rp->cltubdev && !IS_ERR(rp->cltubdev)) + if (rp->cltubdev) class_device_destroy(class3270, MKDEV(IBM_FS3270_MAJOR, rp->minor)); list_del_init(&rp->list); - mutex_unlock(&raw3270_mutex); + up(&raw3270_sem); /* Disconnect from ccw_device. */ cdev = rp->cdev; - rp->cdev = NULL; - cdev->dev.driver_data = NULL; - cdev->handler = NULL; + rp->cdev = 0; + cdev->dev.driver_data = 0; + cdev->handler = 0; /* 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, NULL); +static DEVICE_ATTR(model, 0444, raw3270_model_show, 0); 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, NULL); +static DEVICE_ATTR(rows, 0444, raw3270_rows_show, 0); 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, NULL); +static DEVICE_ATTR(columns, 0444, raw3270_columns_show, 0); static struct attribute * raw3270_attrs[] = { &dev_attr_model.attr, @@ -1173,37 +1173,21 @@ static struct attribute_group raw3270_attr_group = { .attrs = raw3270_attrs, }; -static int raw3270_create_attributes(struct raw3270 *rp) +static void +raw3270_create_attributes(struct raw3270 *rp) { - 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; + //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); } /* @@ -1225,13 +1209,13 @@ int raw3270_register_notifier(void (*notifier)(int, int)) if (!np) return -ENOMEM; np->notifier = notifier; - mutex_lock(&raw3270_mutex); + down(&raw3270_sem); list_add_tail(&np->list, &raw3270_notifier); list_for_each_entry(rp, &raw3270_devices, list) { get_device(&rp->cdev->dev); notifier(rp->minor, 1); } - mutex_unlock(&raw3270_mutex); + up(&raw3270_sem); return 0; } @@ -1239,14 +1223,14 @@ void raw3270_unregister_notifier(void (*notifier)(int, int)) { struct raw3270_notifier *np; - mutex_lock(&raw3270_mutex); + down(&raw3270_sem); list_for_each_entry(np, &raw3270_notifier, list) if (np->notifier == notifier) { list_del(&np->list); kfree(np); break; } - mutex_unlock(&raw3270_mutex); + up(&raw3270_sem); } /* @@ -1271,14 +1255,12 @@ raw3270_set_online (struct ccw_device *cdev) rc = raw3270_reset_device(rp); if (rc) goto failure; - rc = raw3270_create_attributes(rp); - if (rc) - goto failure; + raw3270_create_attributes(rp); set_bit(RAW3270_FLAGS_READY, &rp->flags); - mutex_lock(&raw3270_mutex); + down(&raw3270_sem); list_for_each_entry(np, &raw3270_notifier, list) np->notifier(rp->minor, 1); - mutex_unlock(&raw3270_mutex); + up(&raw3270_sem); return 0; failure: @@ -1314,7 +1296,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 = NULL; + rp->view = 0; } while (!list_empty(&rp->view_list)) { v = list_entry(rp->view_list.next, struct raw3270_view, list); @@ -1326,10 +1308,10 @@ raw3270_remove (struct ccw_device *cdev) } spin_unlock_irqrestore(get_ccwdev_lock(cdev), flags); - mutex_lock(&raw3270_mutex); + down(&raw3270_sem); list_for_each_entry(np, &raw3270_notifier, list) np->notifier(rp->minor, 0); - mutex_unlock(&raw3270_mutex); + up(&raw3270_sem); /* Reset 3270 device. */ raw3270_reset_device(rp); @@ -1389,13 +1371,13 @@ raw3270_init(void) rc = ccw_driver_register(&raw3270_ccw_driver); if (rc == 0) { /* Create attributes for early (= console) device. */ - mutex_lock(&raw3270_mutex); + down(&raw3270_sem); class3270 = class_create(THIS_MODULE, "3270"); list_for_each_entry(rp, &raw3270_devices, list) { get_device(&rp->cdev->dev); raw3270_create_attributes(rp); } - mutex_unlock(&raw3270_mutex); + up(&raw3270_sem); } return rc; } diff --git a/drivers/s390/char/raw3270.h b/drivers/s390/char/raw3270.h index 90beaa80a..b635bf8e7 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 NULL; + return 0; } static inline unsigned long diff --git a/drivers/s390/char/sclp.c b/drivers/s390/char/sclp.c index 985d1613b..413856440 100644 --- a/drivers/s390/char/sclp.c +++ b/drivers/s390/char/sclp.c @@ -383,7 +383,6 @@ void sclp_sync_wait(void) { unsigned long psw_mask; - unsigned long flags; unsigned long cr0, cr0_sync; u64 timeout; @@ -396,11 +395,9 @@ 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; @@ -418,10 +415,11 @@ sclp_sync_wait(void) barrier(); cpu_relax(); } - local_irq_disable(); + /* Restore interrupt settings */ + asm volatile ("SSM 0(%0)" + : : "a" (&psw_mask) : "memory"); __ctl_load(cr0, 0, 0); - _local_bh_enable(); - local_irq_restore(flags); + __local_bh_enable(); } EXPORT_SYMBOL(sclp_sync_wait); diff --git a/drivers/s390/char/sclp_con.c b/drivers/s390/char/sclp_con.c index 86864f641..10ef22f13 100644 --- a/drivers/s390/char/sclp_con.c +++ b/drivers/s390/char/sclp_con.c @@ -8,6 +8,7 @@ * Martin Schwidefsky */ +#include #include #include #include diff --git a/drivers/s390/char/sclp_cpi.c b/drivers/s390/char/sclp_cpi.c index 732dfbdb8..80f7f3131 100644 --- a/drivers/s390/char/sclp_cpi.c +++ b/drivers/s390/char/sclp_cpi.c @@ -5,6 +5,7 @@ * 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 32004aae9..56fa69168 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 @@ -66,6 +66,8 @@ 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 0c92d3909..ac10dfb20 100644 --- a/drivers/s390/char/sclp_rw.c +++ b/drivers/s390/char/sclp_rw.c @@ -8,6 +8,7 @@ * Martin Schwidefsky */ +#include #include #include #include @@ -23,7 +24,7 @@ /* * The room for the SCCB (only for writing) is not equal to a pages size - * (as it is specified as the maximum size in the the SCLP documentation) + * (as it is specified as the maximum size in the the SCLP ducumentation) * because of the additional data structure described above. */ #define MAX_SCCB_ROOM (PAGE_SIZE - sizeof(struct sclp_buffer)) diff --git a/drivers/s390/char/sclp_tty.c b/drivers/s390/char/sclp_tty.c index f6cf90230..6cbf067f1 100644 --- a/drivers/s390/char/sclp_tty.c +++ b/drivers/s390/char/sclp_tty.c @@ -8,6 +8,7 @@ * Martin Schwidefsky */ +#include #include #include #include diff --git a/drivers/s390/char/sclp_vt220.c b/drivers/s390/char/sclp_vt220.c index 54fba6f17..9e02625c8 100644 --- a/drivers/s390/char/sclp_vt220.c +++ b/drivers/s390/char/sclp_vt220.c @@ -7,6 +7,7 @@ * Author(s): Peter Oberparleiter */ +#include #include #include #include diff --git a/drivers/s390/char/tape.h b/drivers/s390/char/tape.h index 1f4c89967..01d865d93 100644 --- a/drivers/s390/char/tape.h +++ b/drivers/s390/char/tape.h @@ -16,6 +16,7 @@ #include #include #include +#include #include #include #include @@ -249,7 +250,6 @@ extern void tape_free_request(struct tape_request *); extern int tape_do_io(struct tape_device *, struct tape_request *); extern int tape_do_io_async(struct tape_device *, struct tape_request *); extern int tape_do_io_interruptible(struct tape_device *, struct tape_request *); -extern int tape_cancel_io(struct tape_device *, struct tape_request *); void tape_hotplug_event(struct tape_device *, int major, int action); static inline int diff --git a/drivers/s390/char/tape_34xx.c b/drivers/s390/char/tape_34xx.c index 7b95dab91..682039cac 100644 --- a/drivers/s390/char/tape_34xx.c +++ b/drivers/s390/char/tape_34xx.c @@ -2,12 +2,14 @@ * drivers/s390/char/tape_34xx.c * tape device discipline for 3480/3490 tapes. * - * Copyright (C) IBM Corp. 2001,2006 + * S390 and zSeries version + * Copyright (C) 2001,2002 IBM Deutschland Entwicklung GmbH, IBM Corporation * Author(s): Carsten Otte * Tuan Ngo-Anh * Martin Schwidefsky */ +#include #include #include #include @@ -26,6 +28,11 @@ debug_info_t *TAPE_DBF_AREA = NULL; EXPORT_SYMBOL(TAPE_DBF_AREA); +enum tape_34xx_type { + tape_3480, + tape_3490, +}; + #define TAPE34XX_FMT_3480 0 #define TAPE34XX_FMT_3480_2_XF 1 #define TAPE34XX_FMT_3480_XF 2 @@ -1309,9 +1316,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_block.c b/drivers/s390/char/tape_block.c index 3225fcd1d..5ced2725d 100644 --- a/drivers/s390/char/tape_block.c +++ b/drivers/s390/char/tape_block.c @@ -11,6 +11,7 @@ */ #include +#include #include #include #include @@ -197,7 +198,9 @@ tapeblock_request_fn(request_queue_t *queue) device = (struct tape_device *) queue->queuedata; DBF_LH(6, "tapeblock_request_fn(device=%p)\n", device); - BUG_ON(device == NULL); + if (device == NULL) + BUG(); + tapeblock_trigger_requeue(device); } @@ -304,7 +307,8 @@ tapeblock_revalidate_disk(struct gendisk *disk) int rc; device = (struct tape_device *) disk->private_data; - BUG_ON(!device); + if (!device) + BUG(); if (!device->blk_data.medium_changed) return 0; @@ -431,14 +435,16 @@ tapeblock_ioctl( ) { int rc; int minor; - struct gendisk *disk; - struct tape_device *device; + struct gendisk *disk = inode->i_bdev->bd_disk; + struct tape_device *device = disk->private_data; rc = 0; disk = inode->i_bdev->bd_disk; - BUG_ON(!disk); + if (!disk) + BUG(); device = disk->private_data; - BUG_ON(!device); + if (!device) + BUG(); minor = iminor(inode); DBF_LH(6, "tapeblock_ioctl(0x%0x)\n", command); diff --git a/drivers/s390/char/tape_char.c b/drivers/s390/char/tape_char.c index 97f75237b..5ce7ca38a 100644 --- a/drivers/s390/char/tape_char.c +++ b/drivers/s390/char/tape_char.c @@ -10,6 +10,7 @@ * Martin Schwidefsky */ +#include #include #include #include diff --git a/drivers/s390/char/tape_class.c b/drivers/s390/char/tape_class.c index 56b87618b..b3569c82b 100644 --- a/drivers/s390/char/tape_class.c +++ b/drivers/s390/char/tape_class.c @@ -44,10 +44,11 @@ struct tape_class_device *register_tape_dev( int rc; char * s; - tcd = kzalloc(sizeof(struct tape_class_device), GFP_KERNEL); + tcd = kmalloc(sizeof(struct tape_class_device), GFP_KERNEL); if (!tcd) return ERR_PTR(-ENOMEM); + memset(tcd, 0, sizeof(struct tape_class_device)); strncpy(tcd->device_name, device_name, TAPECLASS_NAME_LEN); for (s = strchr(tcd->device_name, '/'); s; s = strchr(s, '/')) *s = '!'; @@ -76,22 +77,14 @@ struct tape_class_device *register_tape_dev( device, "%s", tcd->device_name ); - rc = IS_ERR(tcd->class_device) ? PTR_ERR(tcd->class_device) : 0; - if (rc) - goto fail_with_cdev; - rc = sysfs_create_link( + 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 2826aed91..4ea438c74 100644 --- a/drivers/s390/char/tape_core.c +++ b/drivers/s390/char/tape_core.c @@ -11,6 +11,7 @@ * Stefan Bader */ +#include #include #include // for kernel parameters #include // for requesting modules @@ -209,14 +210,18 @@ tape_state_set(struct tape_device *device, enum tape_state newstate) return; } DBF_EVENT(4, "ts. dev: %x\n", device->first_minor); - DBF_EVENT(4, "old ts:\t\n"); - if (device->tape_state < TS_SIZE && device->tape_state >=0 ) + if (device->tape_state < TO_SIZE && device->tape_state >= 0) + str = tape_state_verbose[device->tape_state]; + else + str = "UNKNOWN TS"; + DBF_EVENT(4, "old ts: %s\n", str); + if (device->tape_state < TO_SIZE && device->tape_state >=0 ) str = tape_state_verbose[device->tape_state]; else str = "UNKNOWN TS"; DBF_EVENT(4, "%s\n", str); DBF_EVENT(4, "new ts:\t\n"); - if (newstate < TS_SIZE && newstate >= 0) + if (newstate < TO_SIZE && newstate >= 0) str = tape_state_verbose[newstate]; else str = "UNKNOWN TS"; @@ -448,14 +453,16 @@ tape_alloc_device(void) { struct tape_device *device; - device = kzalloc(sizeof(struct tape_device), GFP_KERNEL); + device = (struct tape_device *) + kmalloc(sizeof(struct tape_device), GFP_KERNEL); if (device == NULL) { DBF_EXCEPTION(2, "ti:no mem\n"); PRINT_INFO ("can't allocate memory for " "tape info structure\n"); return ERR_PTR(-ENOMEM); } - device->modeset_byte = kmalloc(1, GFP_KERNEL | GFP_DMA); + memset(device, 0, sizeof(struct tape_device)); + device->modeset_byte = (char *) kmalloc(1, GFP_KERNEL | GFP_DMA); if (device->modeset_byte == NULL) { DBF_EXCEPTION(2, "ti:no mem\n"); PRINT_INFO("can't allocate memory for modeset byte\n"); @@ -543,24 +550,20 @@ int tape_generic_probe(struct ccw_device *cdev) { struct tape_device *device; - int ret; device = tape_alloc_device(); if (IS_ERR(device)) return -ENODEV; - 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; - } + PRINT_INFO("tape device %s found\n", cdev->dev.bus_id); cdev->dev.driver_data = device; - cdev->handler = __tape_do_irq; device->cdev = cdev; device->cdev_id = busid_to_int(cdev->dev.bus_id); - PRINT_INFO("tape device %s found\n", cdev->dev.bus_id); - return ret; + cdev->handler = __tape_do_irq; + + ccw_device_set_options(cdev, CCWDEV_DO_PATHGROUP); + sysfs_create_group(&cdev->dev.kobj, &tape_attr_group); + + return 0; } static inline void @@ -656,30 +659,34 @@ tape_alloc_request(int cplength, int datasize) DBF_LH(6, "tape_alloc_request(%d, %d)\n", cplength, datasize); - request = kzalloc(sizeof(struct tape_request), GFP_KERNEL); + request = (struct tape_request *) kmalloc(sizeof(struct tape_request), + GFP_KERNEL); if (request == NULL) { DBF_EXCEPTION(1, "cqra nomem\n"); return ERR_PTR(-ENOMEM); } + memset(request, 0, sizeof(struct tape_request)); /* allocate channel program */ if (cplength > 0) { - request->cpaddr = kcalloc(cplength, sizeof(struct ccw1), + request->cpaddr = kmalloc(cplength*sizeof(struct ccw1), GFP_ATOMIC | GFP_DMA); if (request->cpaddr == NULL) { DBF_EXCEPTION(1, "cqra nomem\n"); kfree(request); return ERR_PTR(-ENOMEM); } + memset(request->cpaddr, 0, cplength*sizeof(struct ccw1)); } /* alloc small kernel buffer */ if (datasize > 0) { - request->cpdata = kzalloc(datasize, GFP_KERNEL | GFP_DMA); + request->cpdata = kmalloc(datasize, GFP_KERNEL | GFP_DMA); if (request->cpdata == NULL) { DBF_EXCEPTION(1, "cqra nomem\n"); kfree(request->cpaddr); kfree(request); return ERR_PTR(-ENOMEM); } + memset(request->cpdata, 0, datasize); } DBF_LH(6, "New request %p(%p/%p)\n", request, request->cpaddr, request->cpdata); @@ -754,13 +761,6 @@ __tape_start_next_request(struct tape_device *device) */ if (request->status == TAPE_REQUEST_IN_IO) return; - /* - * Request has already been stopped. We have to wait until - * the request is removed from the queue in the interrupt - * handling. - */ - if (request->status == TAPE_REQUEST_DONE) - return; /* * We wanted to cancel the request but the common I/O layer @@ -1015,7 +1015,7 @@ tape_do_io_interruptible(struct tape_device *device, wq, (request->callback == NULL) ); - } while (rc == -ERESTARTSYS); + } while (rc != -ERESTARTSYS); DBF_EVENT(3, "IO stopped on %08x\n", device->cdev_id); rc = -ERESTARTSYS; @@ -1023,20 +1023,6 @@ tape_do_io_interruptible(struct tape_device *device, return rc; } -/* - * Stop running ccw. - */ -int -tape_cancel_io(struct tape_device *device, struct tape_request *request) -{ - int rc; - - spin_lock_irq(get_ccwdev_lock(device->cdev)); - rc = __tape_cancel_io(device, request); - spin_unlock_irq(get_ccwdev_lock(device->cdev)); - return rc; -} - /* * Tape interrupt routine, called from the ccw_device layer */ @@ -1078,16 +1064,15 @@ __tape_do_irq (struct ccw_device *cdev, unsigned long intparm, struct irb *irb) /* * If the condition code is not zero and the start function bit is * still set, this is an deferred error and the last start I/O did - * not succeed. At this point the condition that caused the deferred - * error might still apply. So we just schedule the request to be - * started later. + * not succeed. Restart the request now. */ - if (irb->scsw.cc != 0 && (irb->scsw.fctl & SCSW_FCTL_START_FUNC) && - (request->status == TAPE_REQUEST_IN_IO)) { - DBF_EVENT(3,"(%08x): deferred cc=%i, fctl=%i. restarting\n", - device->cdev_id, irb->scsw.cc, irb->scsw.fctl); - request->status = TAPE_REQUEST_QUEUED; - schedule_delayed_work(&device->tape_dnr, HZ); + if (irb->scsw.cc != 0 && (irb->scsw.fctl & SCSW_FCTL_START_FUNC)) { + PRINT_WARN("(%s): deferred cc=%i. restaring\n", + cdev->dev.bus_id, + irb->scsw.cc); + rc = __tape_start_io(device, request); + if (rc) + __tape_end_request(device, request, rc); return; } @@ -1301,5 +1286,4 @@ EXPORT_SYMBOL(tape_dump_sense_dbf); EXPORT_SYMBOL(tape_do_io); EXPORT_SYMBOL(tape_do_io_async); EXPORT_SYMBOL(tape_do_io_interruptible); -EXPORT_SYMBOL(tape_cancel_io); EXPORT_SYMBOL(tape_mtop); diff --git a/drivers/s390/char/tape_proc.c b/drivers/s390/char/tape_proc.c index 655d375ab..5fec0a10c 100644 --- a/drivers/s390/char/tape_proc.c +++ b/drivers/s390/char/tape_proc.c @@ -11,6 +11,7 @@ * PROCFS Functions */ +#include #include #include #include diff --git a/drivers/s390/char/tape_std.c b/drivers/s390/char/tape_std.c index 7a76ec413..2f9fe3098 100644 --- a/drivers/s390/char/tape_std.c +++ b/drivers/s390/char/tape_std.c @@ -11,6 +11,7 @@ * Stefan Bader */ +#include #include #include #include @@ -36,19 +37,20 @@ tape_std_assign_timeout(unsigned long data) { struct tape_request * request; struct tape_device * device; - int rc; request = (struct tape_request *) data; if ((device = request->device) == NULL) BUG(); - DBF_EVENT(3, "%08x: Assignment timeout. Device busy.\n", + spin_lock_irq(get_ccwdev_lock(device->cdev)); + if (request->callback != NULL) { + DBF_EVENT(3, "%08x: Assignment timeout. Device busy.\n", device->cdev_id); - rc = tape_cancel_io(device, request); - if(rc) - PRINT_ERR("(%s): Assign timeout: Cancel failed with rc = %i\n", - device->cdev->dev.bus_id, rc); - + PRINT_ERR("%s: Assignment timeout. Device busy.\n", + device->cdev->dev.bus_id); + ccw_device_clear(device->cdev, (long) request); + } + spin_unlock_irq(get_ccwdev_lock(device->cdev)); } int diff --git a/drivers/s390/char/tape_std.h b/drivers/s390/char/tape_std.h index 1fc952359..3ab6aafb7 100644 --- a/drivers/s390/char/tape_std.h +++ b/drivers/s390/char/tape_std.h @@ -1,8 +1,9 @@ /* - * drivers/s390/char/tape_std.h + * drivers/s390/char/tape_34xx.h * standard tape device functions for ibm tapes. * - * Copyright (C) IBM Corp. 2001,2006 + * S390 and zSeries version + * Copyright (C) 2001,2002 IBM Deutschland Entwicklung GmbH, IBM Corporation * Author(s): Carsten Otte * Tuan Ngo-Anh * Martin Schwidefsky @@ -148,12 +149,4 @@ void tape_std_error_recovery_do_retry(struct tape_device *); void tape_std_error_recovery_read_opposite(struct tape_device *); void tape_std_error_recovery_HWBUG(struct tape_device *, int condno); -/* S390 tape types */ -enum s390_tape_type { - tape_3480, - tape_3490, - tape_3590, - tape_3592, -}; - #endif // _TAPE_STD_H diff --git a/drivers/s390/char/tty3270.c b/drivers/s390/char/tty3270.c index 06e2eeec8..4b9069370 100644 --- a/drivers/s390/char/tty3270.c +++ b/drivers/s390/char/tty3270.c @@ -8,6 +8,7 @@ * -- Copyright (C) 2003 IBM Deutschland Entwicklung GmbH, IBM Corporation */ +#include #include #include #include @@ -437,7 +438,7 @@ tty3270_rcl_add(struct tty3270 *tp, char *input, int len) { struct string *s; - tp->rcl_walk = NULL; + tp->rcl_walk = 0; if (len <= 0) return; if (tp->rcl_nr >= tp->rcl_max) { @@ -466,12 +467,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) : NULL; + list_entry(tp->rcl_walk, struct string, list) : 0; 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, NULL, 0); + tty3270_update_prompt(tp, 0, 0); tty3270_set_timer(tp, 1); } spin_unlock_bh(&tp->view.lock); @@ -553,7 +554,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 = NULL; + input = 0; len = 0; if (tp->input->string[0] == 0x7d) { /* Enter: write input to tty. */ @@ -567,7 +568,7 @@ tty3270_read_tasklet(struct raw3270_request *rrq) tty3270_update_status(tp); } /* Clear input area. */ - tty3270_update_prompt(tp, NULL, 0); + tty3270_update_prompt(tp, 0, 0); tty3270_set_timer(tp, 1); } else if (tp->input->string[0] == 0x6d) { /* Display has been cleared. Redraw. */ @@ -690,14 +691,16 @@ tty3270_alloc_view(void) struct tty3270 *tp; int pages; - tp = kzalloc(sizeof(struct tty3270), GFP_KERNEL); + tp = kmalloc(sizeof(struct tty3270),GFP_KERNEL); if (!tp) goto out_err; + memset(tp, 0, sizeof(struct tty3270)); tp->freemem_pages = kmalloc(sizeof(void *) * TTY3270_STRING_PAGES, GFP_KERNEL); if (!tp->freemem_pages) goto out_tp; INIT_LIST_HEAD(&tp->freemem); + init_timer(&tp->timer); for (pages = 0; pages < TTY3270_STRING_PAGES; pages++) { tp->freemem_pages[pages] = (void *) __get_free_pages(GFP_KERNEL|GFP_DMA, 0); @@ -764,14 +767,16 @@ tty3270_alloc_screen(struct tty3270 *tp) int lines; size = sizeof(struct tty3270_line) * (tp->view.rows - 2); - tp->screen = kzalloc(size, GFP_KERNEL); + tp->screen = kmalloc(size, GFP_KERNEL); if (!tp->screen) goto out_err; + memset(tp->screen, 0, size); for (lines = 0; lines < tp->view.rows - 2; lines++) { size = sizeof(struct tty3270_cell) * tp->view.cols; - tp->screen[lines].cells = kzalloc(size, GFP_KERNEL); + tp->screen[lines].cells = kmalloc(size, GFP_KERNEL); if (!tp->screen[lines].cells) goto out_screen; + memset(tp->screen[lines].cells, 0, size); } return 0; out_screen: @@ -807,8 +812,8 @@ tty3270_release(struct raw3270_view *view) tp = (struct tty3270 *) view; tty = tp->tty; if (tty) { - tty->driver_data = NULL; - tp->tty = tp->kbd->tty = NULL; + tty->driver_data = 0; + tp->tty = tp->kbd->tty = 0; tty_hangup(tty); raw3270_put_view(&tp->view); } @@ -947,8 +952,8 @@ tty3270_close(struct tty_struct *tty, struct file * filp) return; tp = (struct tty3270 *) tty->driver_data; if (tp) { - tty->driver_data = NULL; - tp->tty = tp->kbd->tty = NULL; + tty->driver_data = 0; + tp->tty = tp->kbd->tty = 0; raw3270_put_view(&tp->view); } } @@ -1672,7 +1677,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, NULL, 0); + tty3270_update_prompt(tp, 0, 0); tty3270_set_timer(tp, 1); } } @@ -1758,7 +1763,7 @@ void tty3270_notifier(int index, int active) { if (active) - tty_register_device(tty3270_driver, index, NULL); + tty_register_device(tty3270_driver, index, 0); else tty_unregister_device(tty3270_driver, index); } @@ -1783,6 +1788,7 @@ 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; @@ -1790,7 +1796,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_DYNAMIC_DEV; + driver->flags = TTY_DRIVER_RESET_TERMIOS | TTY_DRIVER_NO_DEVFS; tty_set_operations(driver, &tty3270_ops); ret = tty_register_driver(driver); if (ret) { @@ -1817,7 +1823,7 @@ tty3270_exit(void) raw3270_unregister_notifier(tty3270_notifier); driver = tty3270_driver; - tty3270_driver = NULL; + tty3270_driver = 0; tty_unregister_driver(driver); tty3270_del_views(); } diff --git a/drivers/s390/char/vmlogrdr.c b/drivers/s390/char/vmlogrdr.c index 6cb230409..b2d75de14 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 __user *data, - size_t count, loff_t * ppos); +static ssize_t vmlogrdr_read (struct file *filp, char *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 __user *data, size_t count, loff_t * ppos) +vmlogrdr_read (struct file *filp, char *data, size_t count, loff_t * ppos) { int rc; struct vmlogrdr_priv_t * priv = filp->private_data; @@ -759,8 +759,9 @@ vmlogrdr_register_device(struct vmlogrdr_priv_t *priv) { struct device *dev; int ret; - dev = kzalloc(sizeof(struct device), GFP_KERNEL); + dev = kmalloc(sizeof(struct device), GFP_KERNEL); if (dev) { + memset(dev, 0, sizeof(struct device)); snprintf(dev->bus_id, BUS_ID_SIZE, "%s", priv->internal_name); dev->bus = &iucv_bus; diff --git a/drivers/s390/char/vmwatchdog.c b/drivers/s390/char/vmwatchdog.c index 807320a41..5acc0ace3 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 __user *)arg); + return put_user(0, (int *)arg); case WDIOC_GETTEMP: return -EINVAL; case WDIOC_SETOPTIONS: diff --git a/drivers/s390/cio/blacklist.c b/drivers/s390/cio/blacklist.c index 12c2d6b74..cb8e2e672 100644 --- a/drivers/s390/cio/blacklist.c +++ b/drivers/s390/cio/blacklist.c @@ -9,6 +9,7 @@ * Arnd Bergmann (arndb@de.ibm.com) */ +#include #include #include #include @@ -223,6 +224,39 @@ 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 @@ -247,7 +281,7 @@ blacklist_parse_proc_parameters (char *buf) return; } - css_schedule_reprobe(); + s390_redo_validation (); } /* Iterator struct for all devices. */ @@ -380,11 +414,11 @@ cio_ignore_proc_init (void) entry = create_proc_entry ("cio_ignore", S_IFREG | S_IRUGO | S_IWUSR, &proc_root); if (!entry) - return -ENOENT; + return 0; entry->proc_fops = &cio_ignore_proc_fops; - return 0; + return 1; } __initcall (cio_ignore_proc_init); diff --git a/drivers/s390/cio/ccwgroup.c b/drivers/s390/cio/ccwgroup.c index 38954f5cd..8013c8eb7 100644 --- a/drivers/s390/cio/ccwgroup.c +++ b/drivers/s390/cio/ccwgroup.c @@ -152,16 +152,19 @@ ccwgroup_create(struct device *root, struct ccwgroup_device *gdev; int i; int rc; + int del_drvdata; if (argc > 256) /* disallow dumb users */ return -EINVAL; - gdev = kzalloc(sizeof(*gdev) + argc*sizeof(gdev->cdev[0]), GFP_KERNEL); + gdev = kmalloc(sizeof(*gdev) + argc*sizeof(gdev->cdev[0]), GFP_KERNEL); if (!gdev) return -ENOMEM; + memset(gdev, 0, sizeof(*gdev) + argc*sizeof(gdev->cdev[0])); atomic_set(&gdev->onoff, 0); + del_drvdata = 0; for (i = 0; i < argc; i++) { gdev->cdev[i] = get_ccwdev_by_busid(cdrv, argv[i]); @@ -178,14 +181,18 @@ ccwgroup_create(struct device *root, rc = -EINVAL; goto free_dev; } - gdev->cdev[i]->dev.driver_data = gdev; } + 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.bus = &ccwgroup_bus_type; - gdev->dev.parent = root; - gdev->dev.release = ccwgroup_release; + gdev->dev = (struct device ) { + .bus = &ccwgroup_bus_type, + .parent = root, + .release = ccwgroup_release, + }; snprintf (gdev->dev.bus_id, BUS_ID_SIZE, "%s", gdev->cdev[0]->dev.bus_id); @@ -220,9 +227,9 @@ error: free_dev: for (i = 0; i < argc; i++) if (gdev->cdev[i]) { - if (gdev->cdev[i]->dev.driver_data == gdev) - gdev->cdev[i]->dev.driver_data = NULL; put_device(&gdev->cdev[i]->dev); + if (del_drvdata) + gdev->cdev[i]->dev.driver_data = NULL; } kfree(gdev); return rc; @@ -313,7 +320,7 @@ ccwgroup_online_store (struct device *dev, struct device_attribute *attr, const if (!try_module_get(gdrv->owner)) return -EINVAL; - value = simple_strtoul(buf, NULL, 0); + value = simple_strtoul(buf, 0, 0); ret = count; if (value == 1) ccwgroup_set_online(gdev); @@ -389,31 +396,30 @@ int ccwgroup_driver_register (struct ccwgroup_driver *cdriver) { /* register our new driver with the core */ - cdriver->driver.bus = &ccwgroup_bus_type; - cdriver->driver.name = cdriver->name; + cdriver->driver = (struct device_driver) { + .bus = &ccwgroup_bus_type, + .name = cdriver->name, + }; return driver_register(&cdriver->driver); } static int -__ccwgroup_match_all(struct device *dev, void *data) +__ccwgroup_driver_unregister_device(struct device *dev, void *data) { - return 1; + __ccwgroup_remove_symlinks(to_ccwgroupdev(dev)); + device_unregister(dev); + put_device(dev); + return 0; } 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); - while ((dev = driver_find_device(&cdriver->driver, NULL, NULL, - __ccwgroup_match_all))) { - __ccwgroup_remove_symlinks(to_ccwgroupdev(dev)); - device_unregister(dev); - put_device(dev); - } + driver_for_each_device(&cdriver->driver, NULL, NULL, + __ccwgroup_driver_unregister_device); put_driver(&cdriver->driver); driver_unregister(&cdriver->driver); } diff --git a/drivers/s390/cio/chsc.c b/drivers/s390/cio/chsc.c index c28444af0..f4183d660 100644 --- a/drivers/s390/cio/chsc.c +++ b/drivers/s390/cio/chsc.c @@ -10,6 +10,7 @@ */ #include +#include #include #include #include @@ -97,8 +98,10 @@ chsc_get_sch_desc_irq(struct subchannel *sch, void *page) ssd_area = page; - ssd_area->request.length = 0x0010; - ssd_area->request.code = 0x0004; + ssd_area->request = (struct chsc_header) { + .length = 0x0010, + .code = 0x0004, + }; ssd_area->ssid = sch->schid.ssid; ssd_area->f_sch = sch->schid.sch_no; @@ -238,10 +241,31 @@ 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) && + if ((sch->schib.scsw.actl & (SCSW_ACTL_CLEAR_PEND | + SCSW_ACTL_HALT_PEND | + SCSW_ACTL_START_PEND | + SCSW_ACTL_RESUME_PEND)) && (sch->schib.pmcw.lpum == mask)) { + int cc = cio_cancel(sch); + + if (cc == -ENODEV) + goto out_unreg; + + if (cc == -EINVAL) { + cc = cio_clear(sch); + if (cc == -ENODEV) + goto out_unreg; + /* Call handler. */ + if (sch->driver && sch->driver->termination) + sch->driver->termination(&sch->dev); + goto out_unlock; + } + } else if ((sch->schib.scsw.actl & SCSW_ACTL_DEVACT) && + (sch->schib.scsw.actl & SCSW_ACTL_SCHACT) && + (sch->schib.pmcw.lpum == mask)) { int cc; cc = cio_clear(sch); @@ -256,8 +280,6 @@ 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; @@ -495,8 +517,10 @@ chsc_process_crw(void) struct device *dev; memset(sei_area, 0, sizeof(*sei_area)); memset(&res_data, 0, sizeof(struct res_acc_data)); - sei_area->request.length = 0x0010; - sei_area->request.code = 0x000e; + sei_area->request = (struct chsc_header) { + .length = 0x0010, + .code = 0x000e, + }; ccode = chsc(sei_area); if (ccode > 0) @@ -633,13 +657,13 @@ __chp_add(struct subchannel_id schid, void *data) if (sch->schib.pmcw.chpid[i] == chp->id) { if (stsch(sch->schid, &sch->schib) != 0) { /* Endgame. */ - spin_unlock_irq(&sch->lock); + spin_unlock(&sch->lock); return -ENXIO; } break; } if (i==8) { - spin_unlock_irq(&sch->lock); + spin_unlock(&sch->lock); return 0; } sch->lpm = ((sch->schib.pmcw.pim & @@ -850,265 +874,6 @@ s390_vary_chpid( __u8 chpid, int on) return 0; } -/* - * Channel measurement related functions - */ -static ssize_t -chp_measurement_chars_read(struct kobject *kobj, char *buf, loff_t off, - size_t count) -{ - struct channel_path *chp; - unsigned int size; - - chp = to_channelpath(container_of(kobj, struct device, kobj)); - if (!chp->cmg_chars) - return 0; - - size = sizeof(struct cmg_chars); - - if (off > size) - return 0; - if (off + count > size) - count = size - off; - memcpy(buf, chp->cmg_chars + off, count); - return count; -} - -static struct bin_attribute chp_measurement_chars_attr = { - .attr = { - .name = "measurement_chars", - .mode = S_IRUSR, - .owner = THIS_MODULE, - }, - .size = sizeof(struct cmg_chars), - .read = chp_measurement_chars_read, -}; - -static void -chp_measurement_copy_block(struct cmg_entry *buf, - struct channel_subsystem *css, int chpid) -{ - void *area; - struct cmg_entry *entry, reference_buf; - int idx; - - if (chpid < 128) { - area = css->cub_addr1; - idx = chpid; - } else { - area = css->cub_addr2; - idx = chpid - 128; - } - entry = area + (idx * sizeof(struct cmg_entry)); - do { - memcpy(buf, entry, sizeof(*entry)); - memcpy(&reference_buf, entry, sizeof(*entry)); - } while (reference_buf.values[0] != buf->values[0]); -} - -static ssize_t -chp_measurement_read(struct kobject *kobj, char *buf, loff_t off, size_t count) -{ - struct channel_path *chp; - struct channel_subsystem *css; - unsigned int size; - - chp = to_channelpath(container_of(kobj, struct device, kobj)); - css = to_css(chp->dev.parent); - - 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; -} - -static struct bin_attribute chp_measurement_attr = { - .attr = { - .name = "measurement", - .mode = S_IRUSR, - .owner = THIS_MODULE, - }, - .size = sizeof(struct cmg_entry), - .read = chp_measurement_read, -}; - -static void -chsc_remove_chp_cmg_attr(struct channel_path *chp) -{ - sysfs_remove_bin_file(&chp->dev.kobj, &chp_measurement_chars_attr); - sysfs_remove_bin_file(&chp->dev.kobj, &chp_measurement_attr); -} - -static int -chsc_add_chp_cmg_attr(struct channel_path *chp) -{ - int ret; - - ret = sysfs_create_bin_file(&chp->dev.kobj, - &chp_measurement_chars_attr); - if (ret) - return ret; - ret = sysfs_create_bin_file(&chp->dev.kobj, &chp_measurement_attr); - if (ret) - sysfs_remove_bin_file(&chp->dev.kobj, - &chp_measurement_chars_attr); - return ret; -} - -static void -chsc_remove_cmg_attr(struct channel_subsystem *css) -{ - int i; - - for (i = 0; i <= __MAX_CHPID; i++) { - if (!css->chps[i]) - continue; - chsc_remove_chp_cmg_attr(css->chps[i]); - } -} - -static int -chsc_add_cmg_attr(struct channel_subsystem *css) -{ - int i, ret; - - ret = 0; - for (i = 0; i <= __MAX_CHPID; i++) { - if (!css->chps[i]) - continue; - ret = chsc_add_chp_cmg_attr(css->chps[i]); - if (ret) - goto cleanup; - } - return ret; -cleanup: - for (--i; i >= 0; i--) { - if (!css->chps[i]) - continue; - chsc_remove_chp_cmg_attr(css->chps[i]); - } - return ret; -} - - -static int -__chsc_do_secm(struct channel_subsystem *css, int enable, void *page) -{ - struct { - struct chsc_header request; - u32 operation_code : 2; - u32 : 30; - u32 key : 4; - u32 : 28; - u32 zeroes1; - u32 cub_addr1; - u32 zeroes2; - u32 cub_addr2; - u32 reserved[13]; - struct chsc_header response; - u32 status : 8; - u32 : 4; - u32 fmt : 4; - u32 : 16; - } *secm_area; - int ret, ccode; - - secm_area = page; - secm_area->request.length = 0x0050; - secm_area->request.code = 0x0016; - - secm_area->key = PAGE_DEFAULT_KEY; - secm_area->cub_addr1 = (u64)(unsigned long)css->cub_addr1; - secm_area->cub_addr2 = (u64)(unsigned long)css->cub_addr2; - - secm_area->operation_code = enable ? 0 : 1; - - ccode = chsc(secm_area); - if (ccode > 0) - return (ccode == 3) ? -ENODEV : -EBUSY; - - switch (secm_area->response.code) { - case 0x0001: /* Success. */ - ret = 0; - break; - case 0x0003: /* Invalid block. */ - case 0x0007: /* Invalid format. */ - case 0x0008: /* Other invalid block. */ - CIO_CRW_EVENT(2, "Error in chsc request block!\n"); - ret = -EINVAL; - break; - case 0x0004: /* Command not provided in model. */ - CIO_CRW_EVENT(2, "Model does not provide secm\n"); - ret = -EOPNOTSUPP; - break; - case 0x0102: /* cub adresses incorrect */ - CIO_CRW_EVENT(2, "Invalid addresses in chsc request block\n"); - ret = -EINVAL; - break; - case 0x0103: /* key error */ - CIO_CRW_EVENT(2, "Access key error in secm\n"); - ret = -EINVAL; - break; - case 0x0105: /* error while starting */ - CIO_CRW_EVENT(2, "Error while starting channel measurement\n"); - ret = -EIO; - break; - default: - CIO_CRW_EVENT(2, "Unknown CHSC response %d\n", - secm_area->response.code); - ret = -EIO; - } - return ret; -} - -int -chsc_secm(struct channel_subsystem *css, int enable) -{ - void *secm_area; - int ret; - - secm_area = (void *)get_zeroed_page(GFP_KERNEL | GFP_DMA); - if (!secm_area) - return -ENOMEM; - - mutex_lock(&css->mutex); - if (enable && !css->cm_enabled) { - css->cub_addr1 = (void *)get_zeroed_page(GFP_KERNEL | GFP_DMA); - css->cub_addr2 = (void *)get_zeroed_page(GFP_KERNEL | GFP_DMA); - if (!css->cub_addr1 || !css->cub_addr2) { - free_page((unsigned long)css->cub_addr1); - free_page((unsigned long)css->cub_addr2); - free_page((unsigned long)secm_area); - mutex_unlock(&css->mutex); - return -ENOMEM; - } - } - ret = __chsc_do_secm(css, enable, secm_area); - if (!ret) { - css->cm_enabled = enable; - if (css->cm_enabled) { - ret = chsc_add_cmg_attr(css); - if (ret) { - memset(secm_area, 0, PAGE_SIZE); - __chsc_do_secm(css, 0, secm_area); - css->cm_enabled = 0; - } - } else - chsc_remove_cmg_attr(css); - } - if (enable && !css->cm_enabled) { - free_page((unsigned long)css->cub_addr1); - free_page((unsigned long)css->cub_addr2); - } - mutex_unlock(&css->mutex); - free_page((unsigned long)secm_area); - return ret; -} - /* * Files for the channel path entries. */ @@ -1160,39 +925,9 @@ chp_type_show(struct device *dev, struct device_attribute *attr, char *buf) static DEVICE_ATTR(type, 0444, chp_type_show, NULL); -static ssize_t -chp_cmg_show(struct device *dev, struct device_attribute *attr, char *buf) -{ - struct channel_path *chp = to_channelpath(dev); - - if (!chp) - return 0; - if (chp->cmg == -1) /* channel measurements not available */ - return sprintf(buf, "unknown\n"); - return sprintf(buf, "%x\n", chp->cmg); -} - -static DEVICE_ATTR(cmg, 0444, chp_cmg_show, NULL); - -static ssize_t -chp_shared_show(struct device *dev, struct device_attribute *attr, char *buf) -{ - struct channel_path *chp = to_channelpath(dev); - - if (!chp) - return 0; - if (chp->shared == -1) /* channel measurements not available */ - return sprintf(buf, "unknown\n"); - return sprintf(buf, "%x\n", chp->shared); -} - -static DEVICE_ATTR(shared, 0444, chp_shared_show, NULL); - static struct attribute * chp_attrs[] = { &dev_attr_status.attr, &dev_attr_type.attr, - &dev_attr_cmg.attr, - &dev_attr_shared.attr, NULL, }; @@ -1231,8 +966,10 @@ chsc_determine_channel_path_description(int chpid, if (!scpd_area) return -ENOMEM; - scpd_area->request.length = 0x0010; - scpd_area->request.code = 0x0002; + scpd_area->request = (struct chsc_header) { + .length = 0x0010, + .code = 0x0002, + }; scpd_area->first_chpid = chpid; scpd_area->last_chpid = chpid; @@ -1269,111 +1006,6 @@ out: return ret; } -static void -chsc_initialize_cmg_chars(struct channel_path *chp, u8 cmcv, - struct cmg_chars *chars) -{ - switch (chp->cmg) { - case 2: - case 3: - chp->cmg_chars = kmalloc(sizeof(struct cmg_chars), - GFP_KERNEL); - if (chp->cmg_chars) { - int i, mask; - struct cmg_chars *cmg_chars; - - cmg_chars = chp->cmg_chars; - for (i = 0; i < NR_MEASUREMENT_CHARS; i++) { - mask = 0x80 >> (i + 3); - if (cmcv & mask) - cmg_chars->values[i] = chars->values[i]; - else - cmg_chars->values[i] = 0; - } - } - break; - default: - /* No cmg-dependent data. */ - break; - } -} - -static int -chsc_get_channel_measurement_chars(struct channel_path *chp) -{ - int ccode, ret; - - struct { - struct chsc_header request; - u32 : 24; - u32 first_chpid : 8; - u32 : 24; - u32 last_chpid : 8; - u32 zeroes1; - struct chsc_header response; - u32 zeroes2; - u32 not_valid : 1; - u32 shared : 1; - u32 : 22; - u32 chpid : 8; - u32 cmcv : 5; - u32 : 11; - u32 cmgq : 8; - u32 cmg : 8; - u32 zeroes3; - u32 data[NR_MEASUREMENT_CHARS]; - } *scmc_area; - - scmc_area = (void *)get_zeroed_page(GFP_KERNEL | GFP_DMA); - if (!scmc_area) - return -ENOMEM; - - scmc_area->request.length = 0x0010; - scmc_area->request.code = 0x0022; - - scmc_area->first_chpid = chp->id; - scmc_area->last_chpid = chp->id; - - ccode = chsc(scmc_area); - if (ccode > 0) { - ret = (ccode == 3) ? -ENODEV : -EBUSY; - goto out; - } - - switch (scmc_area->response.code) { - case 0x0001: /* Success. */ - if (!scmc_area->not_valid) { - chp->cmg = scmc_area->cmg; - chp->shared = scmc_area->shared; - chsc_initialize_cmg_chars(chp, scmc_area->cmcv, - (struct cmg_chars *) - &scmc_area->data); - } else { - chp->cmg = -1; - chp->shared = -1; - } - ret = 0; - break; - case 0x0003: /* Invalid block. */ - case 0x0007: /* Invalid format. */ - case 0x0008: /* Invalid bit combination. */ - CIO_CRW_EVENT(2, "Error in chsc request block!\n"); - ret = -EINVAL; - break; - case 0x0004: /* Command not provided. */ - CIO_CRW_EVENT(2, "Model does not provide scmc\n"); - ret = -EOPNOTSUPP; - break; - default: - CIO_CRW_EVENT(2, "Unknown CHSC response %d\n", - scmc_area->response.code); - ret = -EIO; - } -out: - free_page((unsigned long)scmc_area); - return ret; -} - /* * Entries for chpids on the system bus. * This replaces /proc/chpids. @@ -1384,37 +1016,24 @@ new_channel_path(int chpid) struct channel_path *chp; int ret; - chp = kzalloc(sizeof(struct channel_path), GFP_KERNEL); + chp = kmalloc(sizeof(struct channel_path), GFP_KERNEL); if (!chp) return -ENOMEM; + memset(chp, 0, sizeof(struct channel_path)); /* fill in status, etc. */ chp->id = chpid; chp->state = 1; - chp->dev.parent = &css[0]->device; - chp->dev.release = chp_release; + chp->dev = (struct device) { + .parent = &css[0]->device, + .release = chp_release, + }; snprintf(chp->dev.bus_id, BUS_ID_SIZE, "chp0.%x", chpid); /* Obtain channel path description and fill it in. */ ret = chsc_determine_channel_path_description(chpid, &chp->desc); if (ret) goto out_free; - /* Get channel-measurement characteristics. */ - if (css_characteristics_avail && css_chsc_characteristics.scmc - && css_chsc_characteristics.secm) { - ret = chsc_get_channel_measurement_chars(chp); - if (ret) - goto out_free; - } else { - static int msg_done; - - if (!msg_done) { - printk(KERN_WARNING "cio: Channel measurements not " - "available, continuing.\n"); - msg_done = 1; - } - chp->cmg = -1; - } /* make it known to the system */ ret = device_register(&chp->dev); @@ -1427,19 +1046,8 @@ new_channel_path(int chpid) if (ret) { device_unregister(&chp->dev); goto out_free; - } - mutex_lock(&css[0]->mutex); - if (css[0]->cm_enabled) { - ret = chsc_add_chp_cmg_attr(chp); - if (ret) { - sysfs_remove_group(&chp->dev.kobj, &chp_attr_group); - device_unregister(&chp->dev); - mutex_unlock(&css[0]->mutex); - goto out_free; - } - } - css[0]->chps[chpid] = chp; - mutex_unlock(&css[0]->mutex); + } else + css[0]->chps[chpid] = chp; return ret; out_free: kfree(chp); @@ -1462,40 +1070,6 @@ 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) @@ -1529,8 +1103,10 @@ chsc_enable_facility(int operation_code) sda_area = (void *)get_zeroed_page(GFP_KERNEL|GFP_DMA); if (!sda_area) return -ENOMEM; - sda_area->request.length = 0x0400; - sda_area->request.code = 0x0031; + sda_area->request = (struct chsc_header) { + .length = 0x0400, + .code = 0x0031, + }; sda_area->operation_code = operation_code; ret = chsc(sda_area); @@ -1585,8 +1161,10 @@ chsc_determine_css_characteristics(void) return -ENOMEM; } - scsc_area->request.length = 0x0010; - scsc_area->request.code = 0x0010; + scsc_area->request = (struct chsc_header) { + .length = 0x0010, + .code = 0x0010, + }; result = chsc(scsc_area); if (result) { diff --git a/drivers/s390/cio/chsc.h b/drivers/s390/cio/chsc.h index a25924578..3e75095f3 100644 --- a/drivers/s390/cio/chsc.h +++ b/drivers/s390/cio/chsc.h @@ -12,16 +12,6 @@ struct chsc_header { u16 code; }; -#define NR_MEASUREMENT_CHARS 5 -struct cmg_chars { - u32 values[NR_MEASUREMENT_CHARS]; -}; - -#define NR_MEASUREMENT_ENTRIES 8 -struct cmg_entry { - u32 values[NR_MEASUREMENT_ENTRIES]; -}; - struct channel_path_desc { u8 flags; u8 lsn; @@ -37,10 +27,6 @@ struct channel_path { int id; int state; struct channel_path_desc desc; - /* Channel-measurement related stuff: */ - int cmg; - int shared; - void *cmg_chars; struct device dev; }; @@ -66,11 +52,7 @@ struct css_general_char { struct css_chsc_char { u64 res; - u64 : 20; - u32 secm : 1; /* bit 84 */ - u32 : 1; - u32 scmc : 1; /* bit 86 */ - u32 : 20; + u64 : 43; u32 scssc : 1; /* bit 107 */ u32 scsscf : 1; /* bit 108 */ u32 : 19; @@ -85,8 +67,6 @@ extern int css_characteristics_avail; extern void *chsc_get_chp_desc(struct subchannel*, int); extern int chsc_enable_facility(int); -struct channel_subsystem; -extern int chsc_secm(struct channel_subsystem *, int); #define to_channelpath(device) container_of(device, struct channel_path, dev) diff --git a/drivers/s390/cio/cio.c b/drivers/s390/cio/cio.c index 89320c1ad..cbb86fa5f 100644 --- a/drivers/s390/cio/cio.c +++ b/drivers/s390/cio/cio.c @@ -11,6 +11,7 @@ */ #include +#include #include #include #include @@ -66,7 +67,7 @@ cio_debug_init (void) goto out_unregister; debug_register_view (cio_debug_msg_id, &debug_sprintf_view); debug_set_level (cio_debug_msg_id, 2); - cio_debug_trace_id = debug_register ("cio_trace", 16, 4, 16); + cio_debug_trace_id = debug_register ("cio_trace", 16, 4, 8); if (!cio_debug_trace_id) goto out_unregister; debug_register_view (cio_debug_trace_id, &debug_hex_ascii_view); @@ -147,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; } @@ -519,7 +520,6 @@ 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, @@ -798,7 +798,7 @@ struct subchannel * cio_get_console_subchannel(void) { if (!console_subchannel_in_use) - return NULL; + return 0; return &console_subchannel; } @@ -876,6 +876,5 @@ 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 4541c1af4..0ca987344 100644 --- a/drivers/s390/cio/cio.h +++ b/drivers/s390/cio/cio.h @@ -2,7 +2,6 @@ #define S390_CIO_H #include "schid.h" -#include /* * where we put the ssd info @@ -88,7 +87,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/cio_debug.h b/drivers/s390/cio/cio_debug.h index f88844ada..6af8b27d3 100644 --- a/drivers/s390/cio/cio_debug.h +++ b/drivers/s390/cio/cio_debug.h @@ -3,11 +3,6 @@ #include -/* for use of debug feature */ -extern debug_info_t *cio_debug_msg_id; -extern debug_info_t *cio_debug_trace_id; -extern debug_info_t *cio_debug_crw_id; - #define CIO_TRACE_EVENT(imp, txt) do { \ debug_text_event(cio_debug_trace_id, imp, txt); \ } while (0) @@ -20,19 +15,18 @@ extern debug_info_t *cio_debug_crw_id; debug_sprintf_event(cio_debug_crw_id, imp , ##args); \ } while (0) -static inline void -CIO_HEX_EVENT(int level, void *data, int length) -{ - while (length > 0) { - debug_event(cio_debug_trace_id, level, data, length); - length -= cio_debug_trace_id->buf_size; - data += cio_debug_trace_id->buf_size; - } -} +#define CIO_HEX_EVENT(imp, args...) do { \ + debug_event(cio_debug_trace_id, imp, ##args); \ + } while (0) #define CIO_DEBUG(printk_level,event_level,msg...) ({ \ if (cio_show_msg) printk(printk_level msg); \ CIO_MSG_EVENT (event_level, msg); \ }) +/* for use of debug feature */ +extern debug_info_t *cio_debug_msg_id; +extern debug_info_t *cio_debug_trace_id; +extern debug_info_t *cio_debug_crw_id; + #endif diff --git a/drivers/s390/cio/cmf.c b/drivers/s390/cio/cmf.c index 828b2d334..07ef3f640 100644 --- a/drivers/s390/cio/cmf.c +++ b/drivers/s390/cio/cmf.c @@ -3,10 +3,9 @@ * * Linux on zSeries Channel Measurement Facility support * - * Copyright 2000,2006 IBM Corporation + * Copyright 2000,2003 IBM Corporation * - * Authors: Arnd Bergmann - * Cornelia Huck + * Author: Arnd Bergmann * * original idea from Natarajan Krishnaswami * @@ -97,9 +96,9 @@ module_param(format, bool, 0444); /** * struct cmb_operations - functions to use depending on cmb_format * - * 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. + * 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. * * @alloc: allocate memory for a channel measurement block, * either with the help of a special pool or with kmalloc @@ -108,7 +107,6 @@ 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*); @@ -117,19 +115,11 @@ 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.*/ @@ -236,229 +226,63 @@ 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 *set_data; - int ret; + struct set_schib_struct s = { + .mme = mme, + .mbfc = mbfc, + .address = address, + .wait = __WAIT_QUEUE_HEAD_INITIALIZER(s.wait), + }; spin_lock_irq(cdev->ccwlock); - if (!cdev->private->cmb) { - ret = -ENODEV; - goto out; + s.ret = set_schib(cdev, mme, mbfc, address); + if (s.ret != -EBUSY) { + goto out_nowait; } - 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 */ - ret = -EBUSY; - goto out_put; + goto out_nowait; } - cdev->private->state = DEV_STATE_CMFCHANGE; - set_data->ret = CMF_PENDING; - cdev->private->cmb_wait = set_data; + cdev->private->cmb_wait = &s; + s.ret = 1; spin_unlock_irq(cdev->ccwlock); - if (wait_event_interruptible(set_data->wait, - set_data->ret != CMF_PENDING)) { + if (wait_event_interruptible(s.wait, s.ret != 1)) { spin_lock_irq(cdev->ccwlock); - if (set_data->ret == CMF_PENDING) { - set_data->ret = -ERESTARTSYS; + if (s.ret == 1) { + s.ret = -ERESTARTSYS; + cdev->private->cmb_wait = 0; if (cdev->private->state == DEV_STATE_CMFCHANGE) cdev->private->state = DEV_STATE_ONLINE; } spin_unlock_irq(cdev->ccwlock); } - 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: + return s.ret; + +out_nowait: spin_unlock_irq(cdev->ccwlock); - return ret; + return s.ret; } void retry_set_schib(struct ccw_device *cdev) { - 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; + struct set_schib_struct *s; - copy_block = cdev->private->cmb_wait; - if (!copy_block) { + s = cdev->private->cmb_wait; + cdev->private->cmb_wait = 0; + if (!s) { WARN_ON(1); return; } - 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); + s->ret = set_schib(cdev, s->mme, s->mbfc, s->address); + wake_up(&s->wait); } /** @@ -519,8 +343,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, - struct cmb_data *cmb_data) +static inline int +alloc_cmb_single (struct ccw_device *cdev) { struct cmb *cmb; struct ccw_device_private *node; @@ -534,12 +358,10 @@ static inline int 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->hw_data pointers */ + * remains sorted by ->cmb pointers */ cmb = cmb_area.mem; list_for_each_entry(node, &cmb_area.list, cmb_list) { - struct cmb_data *data; - data = node->cmb; - if ((struct cmb*)data->hw_block > cmb) + if ((struct cmb*)node->cmb > cmb) break; cmb++; } @@ -550,8 +372,7 @@ static inline int alloc_cmb_single (struct ccw_device *cdev, /* insert new cmb */ list_add_tail(&cdev->private->cmb_list, &node->cmb_list); - cmb_data->hw_block = cmb; - cdev->private->cmb = cmb_data; + cdev->private->cmb = cmb; ret = 0; out: spin_unlock_irq(cdev->ccwlock); @@ -564,19 +385,7 @@ 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) { @@ -605,36 +414,29 @@ alloc_cmb (struct ccw_device *cdev) } /* do the actual allocation */ - ret = alloc_cmb_single(cdev, cmb_data); + ret = alloc_cmb_single(cdev); 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; - struct cmb_data *cmb_data; + + priv = cdev->private; 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)) { @@ -649,97 +451,83 @@ 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; - spin_lock_irqsave(cdev->ccwlock, flags); - if (!cdev->private->cmb) { - spin_unlock_irqrestore(cdev->ccwlock, flags); + if (!cdev->private->cmb) return -EINVAL; - } - cmb_data = cdev->private->cmb; - offset = mme ? (struct cmb *)cmb_data->hw_block - cmb_area.mem : 0; - spin_unlock_irqrestore(cdev->ccwlock, flags); + + offset = mme ? (struct cmb *)cdev->private->cmb - cmb_area.mem : 0; 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) { - struct cmb *cmb; - u32 val; - int ret; + /* 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; - - ret = cmf_cmb_copy_wait(cdev); - if (ret < 0) - return 0; + u32 val; spin_lock_irqsave(cdev->ccwlock, flags); if (!cdev->private->cmb) { - ret = 0; - goto out; + spin_unlock_irqrestore(cdev->ccwlock, flags); + return 0; } - cmb = ((struct cmb_data *)cdev->private->cmb)->last_block; + + cmb = *(struct cmb*)cdev->private->cmb; + spin_unlock_irqrestore(cdev->ccwlock, flags); switch (index) { case cmb_ssch_rsch_count: - ret = cmb->ssch_rsch_count; - goto out; + return cmb.ssch_rsch_count; case cmb_sample_count: - ret = cmb->sample_count; - goto out; + return cmb.sample_count; 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: - ret = 0; - goto out; + return 0; } - ret = time_to_avg_nsec(val, cmb->sample_count); -out: - spin_unlock_irqrestore(cdev->ccwlock, flags); - return ret; + return time_to_avg_nsec(val, cmb.sample_count); } -static int readall_cmb (struct ccw_device *cdev, struct cmbdata *data) +static int +readall_cmb (struct ccw_device *cdev, struct cmbdata *data) { - struct cmb *cmb; - struct cmb_data *cmb_data; - u64 time; + /* 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; - int ret; + u64 time; - ret = cmf_cmb_copy_wait(cdev); - if (ret < 0) - return ret; spin_lock_irqsave(cdev->ccwlock, flags); - cmb_data = cdev->private->cmb; - if (!cmb_data) { - ret = -ENODEV; - goto out; - } - if (cmb_data->last_update == 0) { - ret = -EAGAIN; - goto out; + if (!cdev->private->cmb) { + spin_unlock_irqrestore(cdev->ccwlock, flags); + return -ENODEV; } - cmb = cmb_data->last_block; - time = cmb_data->last_update - cdev->private->cmb_start_time; + + cmb = *(struct cmb*)cdev->private->cmb; + time = get_clock() - cdev->private->cmb_start_time; + spin_unlock_irqrestore(cdev->ccwlock, flags); memset(data, 0, sizeof(struct cmbdata)); @@ -750,32 +538,31 @@ static int 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); - ret = 0; -out: - spin_unlock_irqrestore(cdev->ccwlock, flags); - return ret; -} + = time_to_nsec(cmb.device_active_only_time); -static void reset_cmb(struct ccw_device *cdev) -{ - cmf_generic_reset(cdev); + return 0; } -static void * align_cmb(void *area) +static void +reset_cmb(struct ccw_device *cdev) { - return 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); } static struct attribute_group cmf_attr_group; @@ -787,7 +574,6 @@ static struct cmb_operations cmbops_basic = { .read = read_cmb, .readall = readall_cmb, .reset = reset_cmb, - .align = align_cmb, .attr_group = &cmf_attr_group, }; @@ -824,34 +610,22 @@ 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; - struct cmb_data *cmb_data; - int ret; - - cmbe = kzalloc (sizeof (*cmbe) * 2, GFP_KERNEL); + cmbe = kmalloc (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); - ret = -EBUSY; - goto out_free; + return -EBUSY; } - cmb_data->hw_block = cmbe; - cdev->private->cmb = cmb_data; + + cdev->private->cmb = cmbe; spin_unlock_irq(cdev->ccwlock); /* activate global measurement if this is the first channel */ @@ -862,24 +636,14 @@ static int 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); - cmb_data = cdev->private->cmb; + kfree(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 */ @@ -890,105 +654,89 @@ static void 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; - spin_lock_irqsave(cdev->ccwlock, flags); - if (!cdev->private->cmb) { - spin_unlock_irqrestore(cdev->ccwlock, flags); + if (!cdev->private->cmb) return -EINVAL; - } - cmb_data = cdev->private->cmb; - mba = mme ? (unsigned long) cmbe_align(cmb_data->hw_block) : 0; - spin_unlock_irqrestore(cdev->ccwlock, flags); + mba = mme ? (unsigned long) cmbe_align(cdev->private->cmb) : 0; return set_schib_wait(cdev, mme, 1, mba); } -static u64 read_cmbe (struct ccw_device *cdev, int index) +u64 +read_cmbe (struct ccw_device *cdev, int index) { - struct cmbe *cmb; - struct cmb_data *cmb_data; - u32 val; - int ret; + /* 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; - - ret = cmf_cmb_copy_wait(cdev); - if (ret < 0) - return 0; + u32 val; spin_lock_irqsave(cdev->ccwlock, flags); - cmb_data = cdev->private->cmb; - if (!cmb_data) { - ret = 0; - goto out; + if (!cdev->private->cmb) { + spin_unlock_irqrestore(cdev->ccwlock, flags); + return 0; } - cmb = cmb_data->last_block; + + cmb = *cmbe_align(cdev->private->cmb); + spin_unlock_irqrestore(cdev->ccwlock, flags); switch (index) { case cmb_ssch_rsch_count: - ret = cmb->ssch_rsch_count; - goto out; + return cmb.ssch_rsch_count; case cmb_sample_count: - ret = cmb->sample_count; - goto out; + return cmb.sample_count; 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: - ret = 0; - goto out; + return 0; } - ret = time_to_avg_nsec(val, cmb->sample_count); -out: - spin_unlock_irqrestore(cdev->ccwlock, flags); - return ret; + return time_to_avg_nsec(val, cmb.sample_count); } -static int readall_cmbe (struct ccw_device *cdev, struct cmbdata *data) +static int +readall_cmbe (struct ccw_device *cdev, struct cmbdata *data) { - struct cmbe *cmb; - struct cmb_data *cmb_data; - u64 time; + /* 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; - int ret; + u64 time; - ret = cmf_cmb_copy_wait(cdev); - if (ret < 0) - return ret; spin_lock_irqsave(cdev->ccwlock, flags); - cmb_data = cdev->private->cmb; - if (!cmb_data) { - ret = -ENODEV; - goto out; - } - if (cmb_data->last_update == 0) { - ret = -EAGAIN; - goto out; + if (!cdev->private->cmb) { + spin_unlock_irqrestore(cdev->ccwlock, flags); + return -ENODEV; } - time = cmb_data->last_update - cdev->private->cmb_start_time; + + cmb = *cmbe_align(cdev->private->cmb); + time = get_clock() - cdev->private->cmb_start_time; + spin_unlock_irqrestore(cdev->ccwlock, flags); memset (data, 0, sizeof(struct cmbdata)); @@ -998,38 +746,35 @@ static int 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); - - ret = 0; -out: - spin_unlock_irqrestore(cdev->ccwlock, flags); - return ret; -} + = time_to_nsec(cmb.initial_command_response_time); -static void reset_cmbe(struct ccw_device *cdev) -{ - cmf_generic_reset(cdev); + return 0; } -static void * align_cmbe(void *area) +static void +reset_cmbe(struct ccw_device *cdev) { - return cmbe_align(area); + 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); } static struct attribute_group cmf_attr_group_ext; @@ -1041,7 +786,6 @@ static struct cmb_operations cmbops_extended = { .read = read_cmbe, .readall = readall_cmbe, .reset = reset_cmbe, - .align = align_cmbe, .attr_group = &cmf_attr_group_ext, }; @@ -1059,20 +803,14 @@ 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); - 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; + if (count) interval /= count; - } else + else interval = -1; - spin_unlock_irq(cdev->ccwlock); return sprintf(buf, "%ld\n", interval); } @@ -1085,10 +823,7 @@ cmb_show_avg_utilization(struct device *dev, struct device_attribute *attr, char int ret; ret = cmf_readall(to_ccwdev(dev), &data); - if (ret == -EAGAIN || ret == -ENODEV) - /* No data (yet/currently) available to use for calculation. */ - return sprintf(buf, "n/a\n"); - else if (ret) + if (ret) return ret; utilization = data.device_connect_time + @@ -1141,7 +876,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, - NULL, + 0, }; static struct attribute_group cmf_attr_group = { @@ -1161,7 +896,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, - NULL, + 0, }; static struct attribute_group cmf_attr_group_ext = { @@ -1247,13 +982,6 @@ 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 13eeea3d5..3c77d6596 100644 --- a/drivers/s390/cio/css.c +++ b/drivers/s390/cio/css.c @@ -19,11 +19,9 @@ #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]; @@ -108,24 +106,6 @@ 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) { @@ -137,7 +117,7 @@ css_register_subchannel(struct subchannel *sch) sch->dev.release = &css_subchannel_release; /* make it known to the system */ - ret = css_sch_device_register(sch); + ret = device_register(&sch->dev); if (ret) printk (KERN_WARNING "%s: could not register %s\n", __func__, sch->dev.bus_id); @@ -268,7 +248,7 @@ css_evaluate_subchannel(struct subchannel_id schid, int slow) * The device will be killed automatically. */ cio_disable_subchannel(sch); - css_sch_device_unregister(sch); + device_unregister(&sch->dev); /* Reset intparm to zeroes. */ sch->schib.pmcw.intparm = 0; cio_modify(sch); @@ -282,7 +262,7 @@ css_evaluate_subchannel(struct subchannel_id schid, int slow) * away in any case. */ if (!disc) { - css_sch_device_unregister(sch); + device_unregister(&sch->dev); /* Reset intparm to zeroes. */ sch->schib.pmcw.intparm = 0; cio_modify(sch); @@ -359,67 +339,6 @@ 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 @@ -533,50 +452,15 @@ channel_subsystem_release(struct device *dev) struct channel_subsystem *css; css = to_css(dev); - mutex_destroy(&css->mutex); kfree(css); } -static ssize_t -css_cm_enable_show(struct device *dev, struct device_attribute *attr, - char *buf) -{ - struct channel_subsystem *css = to_css(dev); - - if (!css) - return 0; - return sprintf(buf, "%x\n", css->cm_enabled); -} - -static ssize_t -css_cm_enable_store(struct device *dev, struct device_attribute *attr, - const char *buf, size_t count) -{ - struct channel_subsystem *css = to_css(dev); - int ret; - - switch (buf[0]) { - case '0': - ret = css->cm_enabled ? chsc_secm(css, 0) : 0; - break; - case '1': - ret = css->cm_enabled ? 0 : chsc_secm(css, 1); - break; - default: - ret = -EINVAL; - } - return ret < 0 ? ret : count; -} - -static DEVICE_ATTR(cm_enable, 0644, css_cm_enable_show, css_cm_enable_store); - static inline void __init setup_css(int nr) { u32 tod_high; memset(css[nr], 0, sizeof(struct channel_subsystem)); - mutex_init(&css[nr]->mutex); css[nr]->valid = 1; css[nr]->cssid = nr; sprintf(css[nr]->device.bus_id, "css%x", nr); @@ -623,13 +507,6 @@ init_channel_subsystem (void) ret = device_register(&css[i]->device); if (ret) goto out_free; - 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; @@ -637,16 +514,11 @@ 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: while (i > 0) { i--; - if (css_characteristics_avail && css_chsc_characteristics.secm) - device_remove_file(&css[i]->device, - &dev_attr_cm_enable); device_unregister(&css[i]->device); } out_bus: @@ -717,9 +589,10 @@ css_enqueue_subchannel_slow(struct subchannel_id schid) struct slow_subchannel *new_slow_sch; unsigned long flags; - new_slow_sch = kzalloc(sizeof(struct slow_subchannel), GFP_ATOMIC); + new_slow_sch = kmalloc(sizeof(struct slow_subchannel), GFP_ATOMIC); if (!new_slow_sch) return -ENOMEM; + memset(new_slow_sch, 0, sizeof(struct slow_subchannel)); new_slow_sch->schid = schid; spin_lock_irqsave(&slow_subchannel_lock, flags); list_add_tail(&new_slow_sch->slow_list, &slow_subchannels_head); diff --git a/drivers/s390/cio/css.h b/drivers/s390/cio/css.h index 8aabb4ade..b6375861c 100644 --- a/drivers/s390/cio/css.h +++ b/drivers/s390/cio/css.h @@ -1,7 +1,6 @@ #ifndef _CSS_H #define _CSS_H -#include #include #include @@ -45,11 +44,11 @@ struct pgid { union { __u8 fc; /* SPID function code */ struct path_state ps; /* SNID path state */ - } __attribute__ ((packed)) inf; + } inf; union { __u32 cpu_addr : 16; /* CPU address */ struct extended_cssid ext_cssid; - } __attribute__ ((packed)) pgid_high; + } pgid_high; __u32 cpu_id : 24; /* CPU identification */ __u32 cpu_model : 16; /* CPU model */ __u32 tod_high; /* high word TOD clock */ @@ -100,7 +99,7 @@ struct ccw_device_private { struct qdio_irq *qdio_data; struct irb irb; /* device status */ struct senseid senseid; /* SenseID info */ - struct pgid pgid[8]; /* path group IDs per chpid*/ + struct pgid pgid; /* path group ID */ struct ccw1 iccws[2]; /* ccws for SNID/SID/SPGID commands */ struct work_struct kick_work; wait_queue_head_t wait_q; @@ -136,8 +135,6 @@ 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 *); @@ -153,11 +150,6 @@ struct channel_subsystem { struct channel_path *chps[__MAX_CHPID + 1]; struct device device; struct pgid global_pgid; - struct mutex mutex; - /* channel measurement related */ - int cm_enabled; - void *cub_addr1; - void *cub_addr2; }; #define to_css(dev) container_of(dev, struct channel_subsystem, device) diff --git a/drivers/s390/cio/device.c b/drivers/s390/cio/device.c index 646da5640..afc4e8855 100644 --- a/drivers/s390/cio/device.c +++ b/drivers/s390/cio/device.c @@ -8,6 +8,7 @@ * Cornelia Huck (cornelia.huck@de.ibm.com) * Martin Schwidefsky (schwidefsky@de.ibm.com) */ +#include #include #include #include @@ -100,7 +101,7 @@ ccw_uevent (struct device *dev, char **envp, int num_envp, if ((buffer_size - length <= 0) || (i >= num_envp)) return -ENOMEM; - envp[i] = NULL; + envp[i] = 0; return 0; } @@ -132,8 +133,8 @@ struct css_driver io_subchannel_driver = { struct workqueue_struct *ccw_device_work; struct workqueue_struct *ccw_device_notify_work; -wait_queue_head_t ccw_device_init_wq; -atomic_t ccw_device_init_count; +static wait_queue_head_t ccw_device_init_wq; +static atomic_t ccw_device_init_count; static int __init init_ccw_bus_type (void) @@ -280,7 +281,7 @@ ccw_device_remove_disconnected(struct ccw_device *cdev) * 'throw away device'. */ sch = to_subchannel(cdev->dev.parent); - css_sch_device_unregister(sch); + device_unregister(&sch->dev); /* Reset intparm to zeroes. */ sch->schib.pmcw.intparm = 0; cio_modify(sch); @@ -556,11 +557,12 @@ get_disc_ccwdev_by_devno(unsigned int devno, unsigned int ssid, struct ccw_device *sibling) { struct device *dev; - struct match_data data; + struct match_data data = { + .devno = devno, + .ssid = ssid, + .sibling = sibling, + }; - 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; @@ -624,7 +626,7 @@ ccw_device_do_unreg_rereg(void *data) other_sch->schib.pmcw.intparm = 0; cio_modify(other_sch); } - css_sch_device_unregister(other_sch); + device_unregister(&other_sch->dev); } } /* Update ssd info here. */ @@ -708,7 +710,7 @@ ccw_device_call_sch_unregister(void *data) struct subchannel *sch; sch = to_subchannel(cdev->dev.parent); - css_sch_device_unregister(sch); + device_unregister(&sch->dev); /* Reset intparm to zeroes. */ sch->schib.pmcw.intparm = 0; cio_modify(sch); @@ -824,18 +826,22 @@ io_subchannel_probe (struct subchannel *sch) get_device(&cdev->dev); return 0; } - cdev = kzalloc (sizeof(*cdev), GFP_KERNEL); + cdev = kmalloc (sizeof(*cdev), GFP_KERNEL); if (!cdev) return -ENOMEM; - cdev->private = kzalloc(sizeof(struct ccw_device_private), + memset(cdev, 0, sizeof(struct ccw_device)); + cdev->private = kmalloc(sizeof(struct ccw_device_private), GFP_KERNEL | GFP_DMA); if (!cdev->private) { kfree(cdev); return -ENOMEM; } + memset(cdev->private, 0, sizeof(struct ccw_device_private)); atomic_set(&cdev->private->onoff, 0); - cdev->dev.parent = &sch->dev; - cdev->dev.release = ccw_device_release; + cdev->dev = (struct device) { + .parent = &sch->dev, + .release = ccw_device_release, + }; INIT_LIST_HEAD(&cdev->private->kick_work.entry); /* Do first half of device_register. */ device_initialize(&cdev->dev); @@ -974,7 +980,9 @@ ccw_device_console_enable (struct ccw_device *cdev, struct subchannel *sch) int rc; /* Initialize the ccw_device structure. */ - cdev->dev.parent= &sch->dev; + cdev->dev = (struct device) { + .parent = &sch->dev, + }; rc = io_subchannel_recog(cdev, sch); if (rc) return rc; @@ -1052,7 +1060,7 @@ get_ccwdev_by_busid(struct ccw_driver *cdrv, const char *bus_id) __ccwdev_check_busid); put_driver(drv); - return dev ? to_ccwdev(dev) : NULL; + return dev ? to_ccwdev(dev) : 0; } /************************** device driver handling ************************/ @@ -1077,7 +1085,7 @@ ccw_device_probe (struct device *dev) ret = cdrv->probe ? cdrv->probe(cdev) : -ENODEV; if (ret) { - cdev->drv = NULL; + cdev->drv = 0; return ret; } @@ -1108,7 +1116,7 @@ ccw_device_remove (struct device *dev) ret, cdev->dev.bus_id); } ccw_device_set_timeout(cdev, 0); - cdev->drv = NULL; + cdev->drv = 0; return 0; } diff --git a/drivers/s390/cio/device.h b/drivers/s390/cio/device.h index 00be9a5b4..11587ebb7 100644 --- a/drivers/s390/cio/device.h +++ b/drivers/s390/cio/device.h @@ -1,10 +1,6 @@ #ifndef S390_DEVICE_H #define S390_DEVICE_H -#include -#include -#include - /* * states of the device statemachine */ @@ -27,7 +23,6 @@ enum dev_state { DEV_STATE_DISCONNECTED, DEV_STATE_DISCONNECTED_SENSE_ID, DEV_STATE_CMFCHANGE, - DEV_STATE_CMFUPDATE, /* last element! */ NR_DEV_STATES }; @@ -72,8 +67,6 @@ 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); @@ -119,8 +112,5 @@ 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 35e162ba6..b302779e7 100644 --- a/drivers/s390/cio/device_fsm.c +++ b/drivers/s390/cio/device_fsm.c @@ -9,6 +9,7 @@ */ #include +#include #include #include #include @@ -152,8 +153,7 @@ ccw_device_cancel_halt_clear(struct ccw_device *cdev) if (cdev->private->iretry) { cdev->private->iretry--; ret = cio_halt(sch); - if (ret != -EBUSY) - return (ret == 0) ? -EBUSY : ret; + return (ret == 0) ? -EBUSY : ret; } /* halt io unsuccessful. */ cdev->private->iretry = 255; /* 255 clear retries. */ @@ -267,10 +267,12 @@ ccw_device_recog_done(struct ccw_device *cdev, int state) notify = 1; } /* fill out sense information */ - 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; + 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, + }; if (notify) { cdev->private->state = DEV_STATE_OFFLINE; if (same_dev) { @@ -334,11 +336,8 @@ ccw_device_oper_notify(void *data) if (!ret) /* Driver doesn't want device back. */ ccw_device_do_unreg_rereg((void *)cdev); - else { - /* Reenable channel measurements, if needed. */ - cmf_reenable(cdev); + else wake_up(&cdev->private->wait_q); - } } /* @@ -377,56 +376,6 @@ 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. */ @@ -437,26 +386,24 @@ ccw_device_sense_pgid_done(struct ccw_device *cdev, int err) sch = to_subchannel(cdev->dev.parent); switch (err) { - 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); + 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); 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); - return; + break; + case -EOPNOTSUPP: /* path grouping not supported, just set online. */ + cdev->private->options.pgroup = 0; + ccw_device_done(cdev, DEV_STATE_ONLINE); + break; default: ccw_device_done(cdev, DEV_STATE_NOT_OPER); - return; + break; } - /* Start Path Group verification. */ - sch->vpm = 0; /* Start with no path groups set. */ - cdev->private->state = DEV_STATE_VERIFY; - ccw_device_verify_start(cdev); } /* @@ -564,10 +511,12 @@ 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.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->irb.scsw = (struct scsw) { + .cc = 1, + .fctl = SCSW_FCTL_START_FUNC, + .actl = SCSW_ACTL_START_PEND, + .stctl = SCSW_STCTL_STATUS_PEND, + }; cdev->private->flags.fake_irb = 0; if (cdev->handler) cdev->handler(cdev, cdev->private->intparm, @@ -611,9 +560,8 @@ ccw_device_online(struct ccw_device *cdev) } /* Do we want to do path grouping? */ if (!cdev->private->options.pgroup) { - /* Start initial path verification. */ - cdev->private->state = DEV_STATE_VERIFY; - ccw_device_verify_start(cdev); + /* No, set state online immediately. */ + ccw_device_done(cdev, DEV_STATE_ONLINE); return 0; } /* Do a SensePGID first. */ @@ -659,7 +607,6 @@ 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; } @@ -756,6 +703,8 @@ 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; @@ -768,7 +717,6 @@ 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 @@ -801,7 +749,7 @@ ccw_device_irq(struct ccw_device *cdev, enum dev_event dev_event) /* Unit check but no sense data. Need basic sense. */ if (ccw_device_do_sense(cdev, irb) != 0) goto call_handler_unsol; - memcpy(&cdev->private->irb, irb, sizeof(struct irb)); + memcpy(irb, &cdev->private->irb, sizeof(struct irb)); cdev->private->state = DEV_STATE_W4SENSE; cdev->private->intparm = 0; return; @@ -879,17 +827,6 @@ ccw_device_w4sense(struct ccw_device *cdev, enum dev_event dev_event) } return; } - /* - * Check if a halt or clear has been issued in the meanwhile. If yes, - * only deliver the halt/clear interrupt to the device driver as if it - * had killed the original request. - */ - if (irb->scsw.fctl & (SCSW_FCTL_CLEAR_FUNC | SCSW_FCTL_HALT_FUNC)) { - cdev->private->flags.dosense = 0; - memset(&cdev->private->irb, 0, sizeof(struct irb)); - ccw_device_accumulate_irb(cdev, irb); - goto call_handler; - } /* Add basic sense info to irb. */ ccw_device_accumulate_basic_sense(cdev, irb); if (cdev->private->flags.dosense) { @@ -897,7 +834,6 @@ ccw_device_w4sense(struct ccw_device *cdev, enum dev_event dev_event) ccw_device_do_sense(cdev, irb); return; } -call_handler: cdev->private->state = DEV_STATE_ONLINE; /* Call the handler. */ if (ccw_device_call_handler(cdev) && cdev->private->flags.doverify) @@ -913,8 +849,6 @@ 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! */ @@ -1045,7 +979,8 @@ 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. */ - cdev->private->flags.doverify = 1; + if (cdev->private->options.pgroup) + cdev->private->flags.doverify = 1; } static void @@ -1146,13 +1081,6 @@ 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) @@ -1307,12 +1235,6 @@ 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 438db4830..e60b2d810 100644 --- a/drivers/s390/cio/device_id.c +++ b/drivers/s390/cio/device_id.c @@ -10,6 +10,7 @@ */ #include +#include #include #include diff --git a/drivers/s390/cio/device_ops.c b/drivers/s390/cio/device_ops.c index 9e3de0bd5..3a50b1903 100644 --- a/drivers/s390/cio/device_ops.c +++ b/drivers/s390/cio/device_ops.c @@ -6,6 +6,7 @@ * Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com) * Cornelia Huck (cornelia.huck@de.ibm.com) */ +#include #include #include #include @@ -77,8 +78,7 @@ 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 || - cdev->private->state == DEV_STATE_CLEAR_VERIFY) { + if (cdev->private->state == DEV_STATE_VERIFY) { /* Remember to fake irb when finished. */ if (!cdev->private->flags.fake_irb) { cdev->private->flags.fake_irb = 1; @@ -263,9 +263,6 @@ 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)) { @@ -273,8 +270,7 @@ 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. Also check for long busy - * conditions. + * or intervention required. */ if (cdev->private->flags.doverify || cdev->private->state == DEV_STATE_VERIFY) @@ -283,10 +279,6 @@ 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; @@ -367,9 +359,10 @@ read_dev_chars (struct ccw_device *cdev, void **buffer, int length) CIO_TRACE_EVENT (4, "rddevch"); CIO_TRACE_EVENT (4, sch->dev.bus_id); - rdc_ccw = kzalloc(sizeof(struct ccw1), GFP_KERNEL | GFP_DMA); + rdc_ccw = kmalloc(sizeof(struct ccw1), GFP_KERNEL | GFP_DMA); if (!rdc_ccw) return -ENOMEM; + memset(rdc_ccw, 0, sizeof(struct ccw1)); rdc_ccw->cmd_code = CCW_CMD_RDC; rdc_ccw->count = length; rdc_ccw->flags = CCW_FLAG_SLI; @@ -433,14 +426,16 @@ read_conf_data_lpm (struct ccw_device *cdev, void **buffer, int *length, __u8 lp if (!ciw || ciw->cmd == 0) return -EOPNOTSUPP; - rcd_ccw = kzalloc(sizeof(struct ccw1), GFP_KERNEL | GFP_DMA); + rcd_ccw = kmalloc(sizeof(struct ccw1), GFP_KERNEL | GFP_DMA); if (!rcd_ccw) return -ENOMEM; - rcd_buf = kzalloc(ciw->count, GFP_KERNEL | GFP_DMA); + memset(rcd_ccw, 0, sizeof(struct ccw1)); + rcd_buf = kmalloc(ciw->count, GFP_KERNEL | GFP_DMA); if (!rcd_buf) { kfree(rcd_ccw); return -ENOMEM; } + memset (rcd_buf, 0, ciw->count); rcd_ccw->cmd_code = ciw->cmd; rcd_ccw->cda = (__u32) __pa (rcd_buf); rcd_ccw->count = ciw->count; diff --git a/drivers/s390/cio/device_pgid.c b/drivers/s390/cio/device_pgid.c index 1693a102d..85b1020a1 100644 --- a/drivers/s390/cio/device_pgid.c +++ b/drivers/s390/cio/device_pgid.c @@ -9,6 +9,7 @@ * Path Group ID functions. */ +#include #include #include @@ -23,21 +24,6 @@ #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. @@ -48,17 +34,12 @@ __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; @@ -68,7 +49,6 @@ __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, @@ -85,9 +65,7 @@ __ccw_device_sense_pgid_start(struct ccw_device *cdev) } cdev->private->imask >>= 1; cdev->private->iretry = 5; - i++; } - return ret; } @@ -99,7 +77,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 (cdev->private->pgid)); + memset (&cdev->private->pgid, 0, sizeof (struct pgid)); ret = __ccw_device_sense_pgid_start(cdev); if (ret && ret != -EBUSY) ccw_device_sense_pgid_done(cdev, ret); @@ -114,7 +92,6 @@ __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; @@ -148,8 +125,7 @@ __ccw_device_check_sense_pgid(struct ccw_device *cdev) sch->schid.sch_no, sch->orb.lpm); return -EACCES; } - i = 8 - ffs(cdev->private->imask); - if (cdev->private->pgid[i].inf.ps.state2 == SNID_STATE2_RESVD_ELSE) { + if (cdev->private->pgid.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, @@ -170,10 +146,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 (__ccw_device_should_retry(&irb->scsw)) { + if (irb->scsw.cc == 1) { ret = __ccw_device_sense_pgid_start(cdev); if (ret && ret != -EBUSY) ccw_device_sense_pgid_done(cdev, ret); @@ -187,6 +163,12 @@ 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; @@ -195,15 +177,13 @@ 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, ret); + ccw_device_sense_pgid_done(cdev, -ENODEV); break; case -EUSERS: /* device is reserved for someone else. */ ccw_device_sense_pgid_done(cdev, -EUSERS); @@ -224,20 +204,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[0].inf.fc = func; + cdev->private->pgid.inf.fc = func; ccw = cdev->private->iccws; if (!cdev->private->flags.pgid_single) { - cdev->private->pgid[0].inf.fc |= SPID_FUNC_MULTI_PATH; + cdev->private->pgid.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[0].inf.fc |= SPID_FUNC_SINGLE_PATH; + cdev->private->pgid.inf.fc |= SPID_FUNC_SINGLE_PATH; ccw->cmd_code = CCW_CMD_SET_PGID; - ccw->cda = (__u32) __pa (&cdev->private->pgid[0]); + ccw->cda = (__u32) __pa (&cdev->private->pgid); ccw->count = sizeof (struct pgid); ccw->flags = CCW_FLAG_SLI; @@ -264,48 +244,6 @@ __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. @@ -345,29 +283,6 @@ __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) { @@ -382,12 +297,9 @@ __ccw_device_verify_start(struct ccw_device *cdev) if ((sch->vpm & imask) != (sch->lpm & imask)) break; cdev->private->imask = imask; - 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); + func = (sch->vpm & imask) ? + SPID_FUNC_RESIGN : SPID_FUNC_ESTABLISH; + ret = __ccw_device_do_pgid(cdev, func); if (ret == 0 || ret == -EBUSY) return; cdev->private->iretry = 5; @@ -406,20 +318,17 @@ 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 (__ccw_device_should_retry(&irb->scsw)) + if (irb->scsw.cc == 1) __ccw_device_verify_start(cdev); return; } if (ccw_device_accumulate_and_sense(cdev, irb) != 0) return; sch = to_subchannel(cdev->dev.parent); - if (cdev->private->options.pgroup) - ret = __ccw_device_check_pgid(cdev); - else - ret = __ccw_device_check_nop(cdev); + ret = __ccw_device_check_pgid(cdev); memset(&cdev->private->irb, 0, sizeof(struct irb)); switch (ret) { /* 0, -ETIME, -EAGAIN, -EOPNOTSUPP or -EACCES */ @@ -437,10 +346,11 @@ 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) - cdev->private->options.pgroup = 0; - else - cdev->private->flags.pgid_single = 1; + if (cdev->private->flags.pgid_single) { + ccw_device_verify_done(cdev, -EOPNOTSUPP); + break; + } + cdev->private->flags.pgid_single = 1; /* fall through. */ case -EAGAIN: /* Try again. */ __ccw_device_verify_start(cdev); @@ -509,10 +419,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 (__ccw_device_should_retry(&irb->scsw)) + if (irb->scsw.cc == 1) __ccw_device_disband_start(cdev); return; } diff --git a/drivers/s390/cio/device_status.c b/drivers/s390/cio/device_status.c index caf148d5c..6c762b43f 100644 --- a/drivers/s390/cio/device_status.c +++ b/drivers/s390/cio/device_status.c @@ -9,6 +9,7 @@ * Status accumulation and basic sense functions. */ +#include #include #include @@ -67,7 +68,8 @@ ccw_device_path_notoper(struct ccw_device *cdev) sch->schib.pmcw.pnom); sch->lpm &= ~sch->schib.pmcw.pnom; - cdev->private->flags.doverify = 1; + if (cdev->private->options.pgroup) + cdev->private->flags.doverify = 1; } /* @@ -179,7 +181,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) + if (irb->esw.esw0.erw.pvrf && cdev->private->options.pgroup) cdev->private->flags.doverify = 1; /* Copy concurrent sense bit. */ cdev_irb->esw.esw0.erw.cons = irb->esw.esw0.erw.cons; @@ -353,7 +355,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) + irb->esw.esw0.erw.pvrf && cdev->private->options.pgroup) cdev->private->flags.doverify = 1; } diff --git a/drivers/s390/cio/qdio.c b/drivers/s390/cio/qdio.c index 7c93a8798..9ed37dc9a 100644 --- a/drivers/s390/cio/qdio.c +++ b/drivers/s390/cio/qdio.c @@ -30,6 +30,7 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +#include #include #include @@ -37,7 +38,6 @@ #include #include #include -#include #include #include @@ -80,8 +80,6 @@ static int indicator_used[INDICATORS_PER_CACHELINE]; static __u32 * volatile indicators; static __u32 volatile spare_indicator; static atomic_t spare_indicator_usecount; -#define QDIO_MEMPOOL_SCSSC_ELEMENTS 2 -static mempool_t *qdio_mempool_scssc; static debug_info_t *qdio_dbf_setup; static debug_info_t *qdio_dbf_sbal; @@ -1639,7 +1637,7 @@ next: } kfree(irq_ptr->qdr); - free_page((unsigned long) irq_ptr); + kfree(irq_ptr); } static void @@ -1688,14 +1686,16 @@ qdio_alloc_qs(struct qdio_irq *irq_ptr, int result=-ENOMEM; for (i=0;islib = kmalloc(PAGE_SIZE, GFP_KERNEL); + memset(q,0,sizeof(struct qdio_q)); + + q->slib=kmalloc(PAGE_SIZE,GFP_KERNEL); if (!q->slib) { QDIO_PRINT_ERR("kmalloc of slib failed!\n"); goto out; @@ -1705,12 +1705,14 @@ qdio_alloc_qs(struct qdio_irq *irq_ptr, } for (i=0;islib=kmalloc(PAGE_SIZE,GFP_KERNEL); if (!q->slib) { QDIO_PRINT_ERR("kmalloc of slib failed!\n"); @@ -2306,7 +2308,7 @@ qdio_get_ssqd_information(struct qdio_irq *irq_ptr) QDIO_DBF_TEXT0(0,setup,"getssqd"); qdioac = 0; - ssqd_area = mempool_alloc(qdio_mempool_scssc, GFP_ATOMIC); + ssqd_area = (void *)get_zeroed_page(GFP_KERNEL | GFP_DMA); if (!ssqd_area) { QDIO_PRINT_WARN("Could not get memory for chsc. Using all " \ "SIGAs for sch x%x.\n", irq_ptr->schid.sch_no); @@ -2366,7 +2368,7 @@ qdio_get_ssqd_information(struct qdio_irq *irq_ptr) out: qdio_check_subchannel_qebsm(irq_ptr, qdioac, ssqd_area->sch_token); - mempool_free(ssqd_area, qdio_mempool_scssc); + free_page ((unsigned long) ssqd_area); irq_ptr->qdioac = qdioac; } @@ -2460,7 +2462,7 @@ tiqdio_set_subchannel_ind(struct qdio_irq *irq_ptr, int reset_to_zero) virt_to_phys((volatile void *)irq_ptr->dev_st_chg_ind); } - scssc_area = mempool_alloc(qdio_mempool_scssc, GFP_ATOMIC); + scssc_area = (void *)get_zeroed_page(GFP_KERNEL | GFP_DMA); if (!scssc_area) { QDIO_PRINT_WARN("No memory for setting indicators on " \ "subchannel 0.%x.%x.\n", @@ -2516,7 +2518,7 @@ tiqdio_set_subchannel_ind(struct qdio_irq *irq_ptr, int reset_to_zero) QDIO_DBF_HEX2(0,setup,&real_addr_dev_st_chg_ind,sizeof(unsigned long)); result = 0; out: - mempool_free(scssc_area, qdio_mempool_scssc); + free_page ((unsigned long) scssc_area); return result; } @@ -2545,7 +2547,7 @@ tiqdio_set_delay_target(struct qdio_irq *irq_ptr, unsigned long delay_target) if (!irq_ptr->is_thinint_irq) return -ENODEV; - scsscf_area = mempool_alloc(qdio_mempool_scssc, GFP_ATOMIC); + scsscf_area = (void *)get_zeroed_page(GFP_KERNEL | GFP_DMA); if (!scsscf_area) { QDIO_PRINT_WARN("No memory for setting delay target on " \ "subchannel 0.%x.%x.\n", @@ -2583,7 +2585,7 @@ tiqdio_set_delay_target(struct qdio_irq *irq_ptr, unsigned long delay_target) QDIO_DBF_HEX2(0,trace,&delay_target,sizeof(unsigned long)); result = 0; /* not critical */ out: - mempool_free(scsscf_area, qdio_mempool_scssc); + free_page ((unsigned long) scsscf_area); return result; } @@ -2735,7 +2737,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 = NULL; + cdev->private->qdio_data = 0; up(&irq_ptr->setting_up_sema); @@ -2982,7 +2984,7 @@ qdio_allocate(struct qdio_initialize *init_data) qdio_allocate_do_dbf(init_data); /* create irq */ - irq_ptr = (void *) get_zeroed_page(GFP_KERNEL | GFP_DMA); + irq_ptr=kmalloc(sizeof(struct qdio_irq), GFP_KERNEL | GFP_DMA); QDIO_DBF_TEXT0(0,setup,"irq_ptr:"); QDIO_DBF_HEX0(0,setup,&irq_ptr,sizeof(void*)); @@ -2992,12 +2994,14 @@ qdio_allocate(struct qdio_initialize *init_data) return -ENOMEM; } + memset(irq_ptr,0,sizeof(struct qdio_irq)); + init_MUTEX(&irq_ptr->setting_up_sema); /* QDR must be in DMA area since CCW data address is only 32 bit */ irq_ptr->qdr=kmalloc(sizeof(struct qdr), GFP_KERNEL | GFP_DMA); if (!(irq_ptr->qdr)) { - free_page((unsigned long) irq_ptr); + kfree(irq_ptr); QDIO_PRINT_ERR("kmalloc of irq_ptr->qdr failed!\n"); return -ENOMEM; } @@ -3682,10 +3686,10 @@ qdio_get_qdio_memory(void) for (i=1;i +#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]) /** * local errno definitions diff --git a/drivers/s390/crypto/z90hardware.c b/drivers/s390/crypto/z90hardware.c index be60795f4..4141919da 100644 --- a/drivers/s390/crypto/z90hardware.c +++ b/drivers/s390/crypto/z90hardware.c @@ -2214,7 +2214,7 @@ ICACRT_msg_to_type50CRT_msg(struct ica_rsa_modexpo_crt *icaMsg_p, long_len = 128; } - tmp_size = ((long_len <= 64) ? TYPE50_CRB1_LEN : TYPE50_CRB2_LEN) + + tmp_size = ((mod_len <= 128) ? TYPE50_CRB1_LEN : TYPE50_CRB2_LEN) + CALLER_HEADER; memset(z90cMsg_p, 0, tmp_size); @@ -2479,16 +2479,8 @@ convert_response(unsigned char *response, unsigned char *buffer, if (reply_code) switch (reply_code) { - case REP82_ERROR_MACHINE_FAILURE: - if (errh_p->type == TYPE82_RSP_CODE) - PRINTKW("Machine check failure\n"); - else - PRINTKW("Module failure\n"); - return REC_HARDWAR_ERR; case REP82_ERROR_OPERAND_INVALID: - return REC_OPERAND_INV; case REP88_ERROR_MESSAGE_MALFORMD: - PRINTKW("Message malformed\n"); return REC_OPERAND_INV; case REP82_ERROR_OPERAND_SIZE: return REC_OPERAND_SIZE; diff --git a/drivers/s390/crypto/z90main.c b/drivers/s390/crypto/z90main.c index b2f20ab84..7d6f19030 100644 --- a/drivers/s390/crypto/z90main.c +++ b/drivers/s390/crypto/z90main.c @@ -1,9 +1,9 @@ /* * linux/drivers/s390/crypto/z90main.c * - * z90crypt 1.3.3 + * z90crypt 1.3.2 * - * Copyright (C) 2001, 2005 IBM Corporation + * Copyright (C) 2001, 2004 IBM Corporation * Author(s): Robert Burroughs (burrough@us.ibm.com) * Eric Rossman (edrossma@us.ibm.com) * @@ -411,6 +411,7 @@ static struct miscdevice z90crypt_misc_device = { .minor = Z90CRYPT_MINOR, .name = DEV_NAME, .fops = &z90crypt_fops, + .devfs_name = DEV_NAME }; /** @@ -706,12 +707,13 @@ z90crypt_open(struct inode *inode, struct file *filp) if (quiesce_z90crypt) return -EQUIESCE; - private_data_p = kzalloc(sizeof(struct priv_data), GFP_KERNEL); + private_data_p = kmalloc(sizeof(struct priv_data), GFP_KERNEL); if (!private_data_p) { PRINTK("Memory allocate failed\n"); return -ENOMEM; } + memset((void *)private_data_p, 0, sizeof(struct priv_data)); private_data_p->status = STAT_OPEN; private_data_p->opener_pid = PID(); filp->private_data = private_data_p; @@ -989,7 +991,6 @@ remove_device(struct device *device_p) * PCIXCC_MCL2 512-2048 ----- (applying any GA LIC will make an MCL3 card) * PCIXCC_MCL3 ----- 128-2048 * CEX2C 512-2048 128-2048 - * CEX2A ??-2048 same (the lower limit is less than 128 bit...) * * ext_bitlens (extended bitlengths) is a global, since you should not apply an * MCL to just one card in a machine. We assume, at first, that all cards have @@ -2735,11 +2736,13 @@ create_z90crypt(int *cdx_p) z90crypt.max_count = Z90CRYPT_NUM_DEVS; z90crypt.cdx = *cdx_p; - hdware_blk_p = kzalloc(sizeof(struct hdware_block), GFP_ATOMIC); + hdware_blk_p = (struct hdware_block *) + kmalloc(sizeof(struct hdware_block), GFP_ATOMIC); if (!hdware_blk_p) { PDEBUG("kmalloc for hardware block failed\n"); return ENOMEM; } + memset(hdware_blk_p, 0x00, sizeof(struct hdware_block)); z90crypt.hdware_info = hdware_blk_p; return 0; @@ -2974,11 +2977,12 @@ create_crypto_device(int index) total_size = sizeof(struct device) + z90crypt.q_depth_array[index] * sizeof(int); - dev_ptr = kzalloc(total_size, GFP_ATOMIC); + dev_ptr = (struct device *) kmalloc(total_size, GFP_ATOMIC); if (!dev_ptr) { PRINTK("kmalloc device %d failed\n", index); return ENOMEM; } + memset(dev_ptr, 0, total_size); dev_ptr->dev_resp_p = kmalloc(MAX_RESPONSE_SIZE, GFP_ATOMIC); if (!dev_ptr->dev_resp_p) { kfree(dev_ptr); diff --git a/drivers/s390/net/Kconfig b/drivers/s390/net/Kconfig index 1a93fa684..548854754 100644 --- a/drivers/s390/net/Kconfig +++ b/drivers/s390/net/Kconfig @@ -92,6 +92,15 @@ 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 4777e36a9..90d4d0ef3 100644 --- a/drivers/s390/net/Makefile +++ b/drivers/s390/net/Makefile @@ -2,7 +2,7 @@ # S/390 network devices # -ctc-objs := ctcmain.o ctcdbug.o +ctc-objs := ctcmain.o ctctty.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 95f4e105c..a86436a7a 100644 --- a/drivers/s390/net/claw.c +++ b/drivers/s390/net/claw.c @@ -310,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 = kzalloc(sizeof(struct claw_privbk), GFP_KERNEL); + privptr = kmalloc(sizeof(struct claw_privbk), GFP_KERNEL); if (privptr == NULL) { probe_error(cgdev); put_device(&cgdev->dev); @@ -319,6 +319,7 @@ 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)) { @@ -529,7 +530,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; @@ -1403,7 +1404,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_first == NULL \n", + printk(KERN_INFO "%s:%s p_read_active_frist == NULL \n", dev->name,__FUNCTION__); printk(KERN_INFO "%s:%s Read active first/last changed \n", dev->name,__FUNCTION__); diff --git a/drivers/s390/net/ctcmain.c b/drivers/s390/net/ctcmain.c index 3257c22dd..af9f21231 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,6 +65,7 @@ #include +#include "ctctty.h" #include "fsm.h" #include "cu3088.h" @@ -478,7 +479,10 @@ ctc_unpack_skb(struct channel *ch, struct sk_buff *pskb) skb->dev = pskb->dev; skb->protocol = pskb->protocol; pskb->ip_summed = CHECKSUM_UNNECESSARY; - netif_rx_ni(skb); + if (ch->protocol == CTC_PROTO_LINUX_TTY) + ctc_tty_netif_rx(skb); + else + netif_rx_ni(skb); /** * Successful rx; reset logflags */ @@ -553,7 +557,8 @@ ccw_unit_check(struct channel *ch, unsigned char sense) DBF_TEXT(trace, 5, __FUNCTION__); if (sense & SNS0_INTERVENTION_REQ) { if (sense & 0x01) { - ctc_pr_debug("%s: Interface disc. or Sel. reset " + if (ch->protocol != CTC_PROTO_LINUX_TTY) + ctc_pr_debug("%s: Interface disc. or Sel. reset " "(remote)\n", ch->id); fsm_event(ch->fsm, CH_EVENT_UC_RCRESET, ch); } else { @@ -1481,13 +1486,13 @@ ch_action_iofatal(fsm_instance * fi, int event, void *arg) } } -static void +static void ch_action_reinit(fsm_instance *fi, int event, void *arg) { struct channel *ch = (struct channel *)arg; struct net_device *dev = ch->netdev; struct ctc_priv *privptr = dev->priv; - + DBF_TEXT(trace, 4, __FUNCTION__); ch_action_iofatal(fi, event, arg); fsm_addtimer(&privptr->restart_timer, 1000, DEV_EVENT_RESTART, dev); @@ -1619,7 +1624,7 @@ less_than(char *id1, char *id2) } dev1 = simple_strtoul(id1, &id1, 16); dev2 = simple_strtoul(id2, &id2, 16); - + return (dev1 < dev2); } @@ -1714,9 +1719,6 @@ 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); @@ -1893,7 +1895,7 @@ ctc_irq_handler(struct ccw_device *cdev, unsigned long intparm, struct irb *irb) irb->scsw.dstat); return; } - + priv = ((struct ccwgroup_device *)cdev->dev.driver_data) ->dev.driver_data; @@ -1907,7 +1909,7 @@ ctc_irq_handler(struct ccw_device *cdev, unsigned long intparm, struct irb *irb) "device %s\n", cdev->dev.bus_id); return; } - + dev = (struct net_device *) (ch->netdev); if (dev == NULL) { ctc_pr_crit("ctc: ctc_irq_handler dev=NULL bus_id=%s, ch=0x%p\n", @@ -2006,12 +2008,12 @@ dev_action_stop(fsm_instance * fi, int event, void *arg) fsm_event(ch->fsm, CH_EVENT_STOP, ch); } } -static void +static void dev_action_restart(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__); ctc_pr_debug("%s: Restarting\n", dev->name); dev_action_stop(fi, event, arg); @@ -2032,6 +2034,7 @@ 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)) { @@ -2046,6 +2049,8 @@ 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; @@ -2054,6 +2059,8 @@ 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; @@ -2079,10 +2086,14 @@ 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 @@ -2182,7 +2193,7 @@ transmit_skb(struct channel *ch, struct sk_buff *skb) DBF_TEXT(trace, 5, __FUNCTION__); /* we need to acquire the lock for testing the state - * otherwise we can have an IRQ changing the state to + * otherwise we can have an IRQ changing the state to * TXIDLE after the test but before acquiring the lock. */ spin_lock_irqsave(&ch->collect_lock, saveflags); @@ -2382,10 +2393,12 @@ ctc_tx(struct sk_buff *skb, struct net_device * dev) /** * If channels are not running, try to restart them - * and throw away packet. + * and throw away packet. */ 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++; @@ -2595,13 +2608,20 @@ ctc_netdev_unregister(struct net_device * dev) if (!dev) return; privptr = (struct ctc_priv *) dev->priv; - unregister_netdev(dev); + if (privptr->protocol != CTC_PROTO_LINUX_TTY) + unregister_netdev(dev); + else + ctc_tty_unregister_netdev(dev); } static int ctc_netdev_register(struct net_device * dev) { - return register_netdev(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); } static void @@ -2647,9 +2667,7 @@ ctc_proto_store(struct device *dev, struct device_attribute *attr, const char *b if (!priv) return -ENODEV; sscanf(buf, "%u", &value); - if (!((value == CTC_PROTO_S390) || - (value == CTC_PROTO_LINUX) || - (value == CTC_PROTO_OS390))) + if ((value < 0) || (value > CTC_PROTO_MAX)) return -EINVAL; priv->protocol = value; @@ -2689,17 +2707,9 @@ static struct attribute_group ctc_attr_group = { static int ctc_add_attributes(struct device *dev) { - 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; + device_create_file(dev, &dev_attr_loglevel); + device_create_file(dev, &dev_attr_stats); + return 0; } static void @@ -2728,7 +2738,7 @@ ctc_remove_files(struct device *dev) /** * Add ctc specific attributes. * Add ctc private data. - * + * * @param cgdev pointer to ccwgroup_device just added * * @returns 0 on success, !0 on failure. @@ -2859,7 +2869,7 @@ ctc_new_device(struct ccwgroup_device *cgdev) DBF_TEXT(setup, 3, buffer); type = get_channel_type(&cgdev->cdev[0]->id); - + snprintf(read_id, CTC_ID_SIZE, "ch-%s", cgdev->cdev[0]->dev.bus_id); snprintf(write_id, CTC_ID_SIZE, "ch-%s", cgdev->cdev[1]->dev.bus_id); @@ -2887,14 +2897,17 @@ ctc_new_device(struct ccwgroup_device *cgdev) goto out; } - strlcpy(dev->name, "ctc%d", IFNAMSIZ); + if (privptr->protocol == CTC_PROTO_LINUX_TTY) + strlcpy(dev->name, "ctctty%d", IFNAMSIZ); + else + strlcpy(dev->name, "ctc%d", IFNAMSIZ); for (direction = READ; direction <= WRITE; direction++) { privptr->channel[direction] = channel_get(type, direction == READ ? read_id : write_id, direction); if (privptr->channel[direction] == NULL) { - if (direction == WRITE) + if (direction == WRITE) channel_free(privptr->channel[READ]); ctc_free_netdevice(dev, 1); @@ -2912,12 +2925,7 @@ ctc_new_device(struct ccwgroup_device *cgdev) goto out; } - if (ctc_add_attributes(&cgdev->dev)) { - ctc_netdev_unregister(dev); - dev->priv = NULL; - ctc_free_netdevice(dev, 1); - goto out; - } + ctc_add_attributes(&cgdev->dev); strlcpy(privptr->fsm->name, dev->name, sizeof (privptr->fsm->name)); @@ -2947,7 +2955,7 @@ ctc_shutdown_device(struct ccwgroup_device *cgdev) { struct ctc_priv *priv; struct net_device *ndev; - + DBF_TEXT(setup, 3, __FUNCTION__); pr_debug("%s() called\n", __FUNCTION__); @@ -3038,6 +3046,7 @@ 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"); } @@ -3064,8 +3073,10 @@ 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 7f305d119..d2e835c0c 100644 --- a/drivers/s390/net/ctcmain.h +++ b/drivers/s390/net/ctcmain.h @@ -35,9 +35,7 @@ #include #include -#include -#include - +#include "ctctty.h" #include "fsm.h" #include "cu3088.h" @@ -52,7 +50,9 @@ #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 @@ -257,13 +257,15 @@ static __inline__ void ctc_clear_busy(struct net_device * dev) { clear_bit(0, &(((struct ctc_priv *) dev->priv)->tbusy)); - netif_wake_queue(dev); + if (((struct ctc_priv *)dev->priv)->protocol != CTC_PROTO_LINUX_TTY) + netif_wake_queue(dev); } static __inline__ int ctc_test_and_set_busy(struct net_device * dev) { - netif_stop_queue(dev); + if (((struct ctc_priv *)dev->priv)->protocol != CTC_PROTO_LINUX_TTY) + netif_stop_queue(dev); return test_and_set_bit(0, &((struct ctc_priv *) dev->priv)->tbusy); } diff --git a/drivers/s390/net/ctctty.c b/drivers/s390/net/ctctty.c index af54d1de0..5cdcdbf92 100644 --- a/drivers/s390/net/ctctty.c +++ b/drivers/s390/net/ctctty.c @@ -130,7 +130,7 @@ ctc_tty_readmodem(ctc_tty_info *info) 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); @@ -328,7 +328,7 @@ 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; @@ -497,7 +497,7 @@ ctc_tty_write(struct tty_struct *tty, const u_char * buf, int count) 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); @@ -828,7 +828,7 @@ ctc_tty_block_til_ready(struct tty_struct *tty, struct file *filp, ctc_tty_info if (tty_hung_up_p(filp) || (info->flags & CTC_ASYNC_CLOSING)) { if (info->flags & CTC_ASYNC_CLOSING) - wait_event(info->close_wait, + wait_event(info->close_wait, !(info->flags & CTC_ASYNC_CLOSING)); #ifdef MODEM_DO_RESTART if (info->flags & CTC_ASYNC_HUP_NOTIFY) @@ -1247,7 +1247,7 @@ ctc_tty_unregister_netdev(struct net_device *dev) { void ctc_tty_cleanup(void) { unsigned long saveflags; - + DBF_TEXT(trace, 2, __FUNCTION__); spin_lock_irqsave(&ctc_tty_lock, saveflags); ctc_tty_shuttingdown = 1; diff --git a/drivers/s390/net/cu3088.c b/drivers/s390/net/cu3088.c index e965f03a7..b12533104 100644 --- a/drivers/s390/net/cu3088.c +++ b/drivers/s390/net/cu3088.c @@ -20,7 +20,7 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * */ - + #include #include #include @@ -77,7 +77,7 @@ group_write(struct device_driver *drv, const char *buf, size_t count) int len; if (!(end = strchr(start, delim[i]))) - return -EINVAL; + return count; len = min_t(ptrdiff_t, BUS_ID_SIZE, end - start + 1); strlcpy (bus_ids[i], start, len); argv[i] = bus_ids[i]; @@ -94,7 +94,7 @@ static DRIVER_ATTR(group, 0200, NULL, group_write); /* Register-unregister for ctc&lcs */ int -register_cu3088_discipline(struct ccwgroup_driver *dcp) +register_cu3088_discipline(struct ccwgroup_driver *dcp) { int rc; @@ -109,7 +109,7 @@ register_cu3088_discipline(struct ccwgroup_driver *dcp) rc = driver_create_file(&dcp->driver, &driver_attr_group); if (rc) ccwgroup_driver_unregister(dcp); - + return rc; } @@ -137,7 +137,7 @@ static int __init cu3088_init (void) { int rc; - + cu3088_root_dev = s390_root_dev_register("cu3088"); if (IS_ERR(cu3088_root_dev)) return PTR_ERR(cu3088_root_dev); diff --git a/drivers/s390/net/fsm.c b/drivers/s390/net/fsm.c index 2c1db8036..6caf5fa6a 100644 --- a/drivers/s390/net/fsm.c +++ b/drivers/s390/net/fsm.c @@ -4,6 +4,7 @@ */ #include "fsm.h" +#include #include #include @@ -20,34 +21,38 @@ init_fsm(char *name, const char **state_names, const char **event_names, int nr_ fsm_function_t *m; fsm *f; - this = kzalloc(sizeof(fsm_instance), order); + this = (fsm_instance *)kmalloc(sizeof(fsm_instance), order); if (this == NULL) { printk(KERN_WARNING "fsm(%s): init_fsm: Couldn't alloc instance\n", name); return NULL; } + memset(this, 0, sizeof(fsm_instance)); strlcpy(this->name, name, sizeof(this->name)); - f = kzalloc(sizeof(fsm), order); + f = (fsm *)kmalloc(sizeof(fsm), order); if (f == NULL) { printk(KERN_WARNING "fsm(%s): init_fsm: Couldn't alloc fsm\n", name); kfree_fsm(this); return NULL; } + memset(f, 0, sizeof(fsm)); f->nr_events = nr_events; f->nr_states = nr_states; f->event_names = event_names; f->state_names = state_names; this->f = f; - m = kcalloc(nr_states*nr_events, sizeof(fsm_function_t), order); + m = (fsm_function_t *)kmalloc( + sizeof(fsm_function_t) * nr_states * nr_events, order); if (m == NULL) { printk(KERN_WARNING "fsm(%s): init_fsm: Couldn't alloc jumptable\n", name); kfree_fsm(this); return NULL; } + memset(m, 0, sizeof(fsm_function_t) * f->nr_states * f->nr_events); f->jumpmatrix = m; for (i = 0; i < tmpl_len; i++) { diff --git a/drivers/s390/net/iucv.c b/drivers/s390/net/iucv.c index 821dde86e..760e77ec5 100644 --- a/drivers/s390/net/iucv.c +++ b/drivers/s390/net/iucv.c @@ -1,4 +1,4 @@ -/* +/* * IUCV network driver * * Copyright (C) 2001 IBM Deutschland Entwicklung GmbH, IBM Corporation @@ -28,11 +28,12 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * */ - + /* #define DEBUG */ #include #include +#include #include #include @@ -80,7 +81,7 @@ iucv_bus_match (struct device *dev, struct device_driver *drv) struct bus_type iucv_bus = { .name = "iucv", .match = iucv_bus_match, -}; +}; struct device *iucv_root; @@ -296,7 +297,7 @@ MODULE_LICENSE("GPL"); /* * Debugging stuff *******************************************************************************/ - + #ifdef DEBUG static int debuglevel = 0; @@ -335,15 +336,15 @@ do { \ #else -#define iucv_debug(lvl, fmt, args...) do { } while (0) -#define iucv_dumpit(title, buf, len) do { } while (0) +#define iucv_debug(lvl, fmt, args...) +#define iucv_dumpit(title, buf, len) #endif /* * Internal functions *******************************************************************************/ - + /** * print start banner */ @@ -385,7 +386,7 @@ iucv_init(void) } /* Note: GFP_DMA used used to get memory below 2G */ - iucv_external_int_buffer = kzalloc(sizeof(iucv_GeneralInterrupt), + iucv_external_int_buffer = kmalloc(sizeof(iucv_GeneralInterrupt), GFP_KERNEL|GFP_DMA); if (!iucv_external_int_buffer) { printk(KERN_WARNING @@ -395,9 +396,10 @@ iucv_init(void) bus_unregister(&iucv_bus); return -ENOMEM; } + memset(iucv_external_int_buffer, 0, sizeof(iucv_GeneralInterrupt)); /* Initialize parameter pool */ - iucv_param_pool = kzalloc(sizeof(iucv_param) * PARAM_POOL_SIZE, + iucv_param_pool = kmalloc(sizeof(iucv_param) * PARAM_POOL_SIZE, GFP_KERNEL|GFP_DMA); if (!iucv_param_pool) { printk(KERN_WARNING "%s: Could not allocate param pool\n", @@ -408,6 +410,7 @@ iucv_init(void) bus_unregister(&iucv_bus); return -ENOMEM; } + memset(iucv_param_pool, 0, sizeof(iucv_param) * PARAM_POOL_SIZE); /* Initialize irq queue */ INIT_LIST_HEAD(&iucv_irq_queue); @@ -692,7 +695,7 @@ iucv_retrieve_buffer (void) iucv_debug(1, "entering"); if (iucv_cpuid != -1) { smp_call_function_on(iucv_retrieve_buffer_cpuid, - NULL, 0, 1, iucv_cpuid); + 0, 0, 1, iucv_cpuid); /* Release the cpu reserved by iucv_declare_buffer. */ smp_put_cpu(iucv_cpuid); iucv_cpuid = -1; @@ -790,14 +793,15 @@ iucv_register_program (__u8 pgmname[16], } max_connections = iucv_query_maxconn(); - iucv_pathid_table = kcalloc(max_connections, sizeof(handler *), - GFP_ATOMIC); + iucv_pathid_table = kmalloc(max_connections * sizeof(handler *), + GFP_ATOMIC); if (iucv_pathid_table == NULL) { printk(KERN_WARNING "%s: iucv_pathid_table storage " "allocation failed\n", __FUNCTION__); kfree(new_handler); return NULL; } + memset (iucv_pathid_table, 0, max_connections * sizeof(handler *)); } memset(new_handler, 0, sizeof (handler)); memcpy(new_handler->id.user_data, pgmname, @@ -809,7 +813,7 @@ iucv_register_program (__u8 pgmname[16], sizeof (new_handler->id.userid)); EBC_TOUPPER (new_handler->id.userid, sizeof (new_handler->id.userid)); - + if (pgmmask) { memcpy (new_handler->id.mask, pgmmask, sizeof (new_handler->id.mask)); @@ -1228,7 +1232,7 @@ iucv_purge (__u16 pathid, __u32 msgid, __u32 srccls, __u32 *audit) /* parm->ipaudit has only 3 bytes */ *audit >>= 8; } - + release_param(parm); iucv_debug(1, "b2f0_result = %ld", b2f0_result); @@ -2329,14 +2333,14 @@ iucv_do_int(iucv_GeneralInterrupt * int_buf) temp_buff1[j] &= (h->id.mask)[j]; temp_buff2[j] &= (h->id.mask)[j]; } - + iucv_dumpit("temp_buff1:", temp_buff1, sizeof(temp_buff1)); iucv_dumpit("temp_buff2", temp_buff2, sizeof(temp_buff2)); - + if (!memcmp (temp_buff1, temp_buff2, 24)) { - + iucv_debug(2, "found a matching handler"); break; @@ -2367,7 +2371,7 @@ iucv_do_int(iucv_GeneralInterrupt * int_buf) } else iucv_sever(int_buf->ippathid, no_listener); break; - + case 0x02: /*connection complete */ if (messagesDisabled) { iucv_setmask(~0); @@ -2386,7 +2390,7 @@ iucv_do_int(iucv_GeneralInterrupt * int_buf) } else iucv_sever(int_buf->ippathid, no_listener); break; - + case 0x03: /* connection severed */ if (messagesDisabled) { iucv_setmask(~0); @@ -2397,13 +2401,13 @@ iucv_do_int(iucv_GeneralInterrupt * int_buf) interrupt->ConnectionSevered( (iucv_ConnectionSevered *)int_buf, h->pgm_data); - + else iucv_sever (int_buf->ippathid, no_listener); } else iucv_sever(int_buf->ippathid, no_listener); break; - + case 0x04: /* connection quiesced */ if (messagesDisabled) { iucv_setmask(~0); @@ -2419,7 +2423,7 @@ iucv_do_int(iucv_GeneralInterrupt * int_buf) "ConnectionQuiesced not called"); } break; - + case 0x05: /* connection resumed */ if (messagesDisabled) { iucv_setmask(~0); @@ -2435,7 +2439,7 @@ iucv_do_int(iucv_GeneralInterrupt * int_buf) "ConnectionResumed not called"); } break; - + case 0x06: /* priority message complete */ case 0x07: /* nonpriority message complete */ if (h) { @@ -2448,7 +2452,7 @@ iucv_do_int(iucv_GeneralInterrupt * int_buf) "MessageComplete not called"); } break; - + case 0x08: /* priority message pending */ case 0x09: /* nonpriority message pending */ if (h) { @@ -2466,7 +2470,7 @@ iucv_do_int(iucv_GeneralInterrupt * int_buf) __FUNCTION__); break; } /* end switch */ - + iucv_debug(2, "exiting pathid %d, type %02X", int_buf->ippathid, int_buf->iptype); diff --git a/drivers/s390/net/iucv.h b/drivers/s390/net/iucv.h index 5b6b1b724..0c4644d3d 100644 --- a/drivers/s390/net/iucv.h +++ b/drivers/s390/net/iucv.h @@ -4,7 +4,7 @@ * * S390 version * Copyright (C) 2000 IBM Corporation - * Author(s):Alan Altmark (Alan_Altmark@us.ibm.com) + * Author(s):Alan Altmark (Alan_Altmark@us.ibm.com) * Xenia Tkatschow (xenia@us.ibm.com) * * @@ -16,17 +16,17 @@ * CP Programming Services book, also available on the web * thru www.ibm.com/s390/vm/pubs, manual # SC24-5760 * - * Definition of Return Codes - * -All positive return codes including zero are reflected back - * from CP except for iucv_register_program. The definition of each - * return code can be found in CP Programming Services book. - * Also available on the web thru www.ibm.com/s390/vm/pubs, manual # SC24-5760 - * - Return Code of: - * (-EINVAL) Invalid value - * (-ENOMEM) storage allocation failed + * Definition of Return Codes + * -All positive return codes including zero are reflected back + * from CP except for iucv_register_program. The definition of each + * return code can be found in CP Programming Services book. + * Also available on the web thru www.ibm.com/s390/vm/pubs, manual # SC24-5760 + * - Return Code of: + * (-EINVAL) Invalid value + * (-ENOMEM) storage allocation failed * pgmask defined in iucv_register_program will be set depending on input - * paramters. - * + * paramters. + * */ #include @@ -124,13 +124,13 @@ iucv_hex_dump(unsigned char *buf, size_t len) #define iucv_handle_t void * /* flags1: - * All flags are defined in the field IPFLAGS1 of each function - * and can be found in CP Programming Services. - * IPLOCAL - Indicates the connect can only be satisfied on the - * local system - * IPPRTY - Indicates a priority message - * IPQUSCE - Indicates you do not want to receive messages on a - * path until an iucv_resume is issued + * All flags are defined in the field IPFLAGS1 of each function + * and can be found in CP Programming Services. + * IPLOCAL - Indicates the connect can only be satisfied on the + * local system + * IPPRTY - Indicates a priority message + * IPQUSCE - Indicates you do not want to receive messages on a + * path until an iucv_resume is issued * IPRMDATA - Indicates that the message is in the parameter list */ #define IPLOCAL 0x01 @@ -154,14 +154,14 @@ iucv_hex_dump(unsigned char *buf, size_t len) #define AllInterrupts 0xf8 /* * Mapping of external interrupt buffers should be used with the corresponding - * interrupt types. - * Names: iucv_ConnectionPending -> connection pending + * interrupt types. + * Names: iucv_ConnectionPending -> connection pending * iucv_ConnectionComplete -> connection complete - * iucv_ConnectionSevered -> connection severed - * iucv_ConnectionQuiesced -> connection quiesced - * iucv_ConnectionResumed -> connection resumed - * iucv_MessagePending -> message pending - * iucv_MessageComplete -> message complete + * iucv_ConnectionSevered -> connection severed + * iucv_ConnectionQuiesced -> connection quiesced + * iucv_ConnectionResumed -> connection resumed + * iucv_MessagePending -> message pending + * iucv_MessageComplete -> message complete */ typedef struct { u16 ippathid; @@ -260,16 +260,16 @@ typedef struct { uchar res2[3]; } iucv_MessageComplete; -/* - * iucv_interrupt_ops_t: Is a vector of functions that handle - * IUCV interrupts. - * Parameter list: - * eib - is a pointer to a 40-byte area described - * with one of the structures above. - * pgm_data - this data is strictly for the - * interrupt handler that is passed by - * the application. This may be an address - * or token. +/* + * iucv_interrupt_ops_t: Is a vector of functions that handle + * IUCV interrupts. + * Parameter list: + * eib - is a pointer to a 40-byte area described + * with one of the structures above. + * pgm_data - this data is strictly for the + * interrupt handler that is passed by + * the application. This may be an address + * or token. */ typedef struct { void (*ConnectionPending) (iucv_ConnectionPending * eib, @@ -287,8 +287,8 @@ typedef struct { } iucv_interrupt_ops_t; /* - *iucv_array_t : Defines buffer array. - * Inside the array may be 31- bit addresses and 31-bit lengths. + *iucv_array_t : Defines buffer array. + * Inside the array may be 31- bit addresses and 31-bit lengths. */ typedef struct { u32 address; @@ -299,19 +299,19 @@ extern struct bus_type iucv_bus; extern struct device *iucv_root; /* -prototypes- */ -/* - * Name: iucv_register_program - * Purpose: Registers an application with IUCV - * Input: prmname - user identification +/* + * Name: iucv_register_program + * Purpose: Registers an application with IUCV + * Input: prmname - user identification * userid - machine identification * pgmmask - indicates which bits in the prmname and userid combined will be * used to determine who is given control - * ops - address of vector of interrupt handlers - * pgm_data- application data passed to interrupt handlers - * Output: NA - * Return: address of handler + * ops - address of vector of interrupt handlers + * pgm_data- application data passed to interrupt handlers + * Output: NA + * Return: address of handler * (0) - Error occurred, registration not completed. - * NOTE: Exact cause of failure will be recorded in syslog. + * NOTE: Exact cause of failure will be recorded in syslog. */ iucv_handle_t iucv_register_program (uchar pgmname[16], uchar userid[8], @@ -319,13 +319,13 @@ iucv_handle_t iucv_register_program (uchar pgmname[16], iucv_interrupt_ops_t * ops, void *pgm_data); -/* - * Name: iucv_unregister_program - * Purpose: Unregister application with IUCV - * Input: address of handler - * Output: NA - * Return: (0) - Normal return - * (-EINVAL) - Internal error, wild pointer +/* + * Name: iucv_unregister_program + * Purpose: Unregister application with IUCV + * Input: address of handler + * Output: NA + * Return: (0) - Normal return + * (-EINVAL) - Internal error, wild pointer */ int iucv_unregister_program (iucv_handle_t handle); @@ -333,7 +333,7 @@ int iucv_unregister_program (iucv_handle_t handle); * Name: iucv_accept * Purpose: This function is issued after the user receives a Connection Pending external * interrupt and now wishes to complete the IUCV communication path. - * Input: pathid - u16 , Path identification number + * Input: pathid - u16 , Path identification number * msglim_reqstd - u16, The number of outstanding messages requested. * user_data - uchar[16], Data specified by the iucv_connect function. * flags1 - int, Contains options for this path. @@ -358,34 +358,34 @@ int iucv_accept (u16 pathid, void *pgm_data, int *flags1_out, u16 * msglim); /* - * Name: iucv_connect + * Name: iucv_connect * Purpose: This function establishes an IUCV path. Although the connect may complete - * successfully, you are not able to use the path until you receive an IUCV - * Connection Complete external interrupt. - * Input: pathid - u16 *, Path identification number - * msglim_reqstd - u16, Number of outstanding messages requested - * user_data - uchar[16], 16-byte user data + * successfully, you are not able to use the path until you receive an IUCV + * Connection Complete external interrupt. + * Input: pathid - u16 *, Path identification number + * msglim_reqstd - u16, Number of outstanding messages requested + * user_data - uchar[16], 16-byte user data * userid - uchar[8], User identification - * system_name - uchar[8], 8-byte identifying the system name + * system_name - uchar[8], 8-byte identifying the system name * flags1 - int, Contains options for this path. * -IPPRTY - 0x20, Specifies if you want to send priority message. * -IPRMDATA - 0x80, Specifies whether your program can handle a message * in the parameter list. - * -IPQUSCE - 0x40, Specifies whether you want to quiesce the path being + * -IPQUSCE - 0x40, Specifies whether you want to quiesce the path being * established. - * -IPLOCAL - 0X01, Allows an application to force the partner to be on + * -IPLOCAL - 0X01, Allows an application to force the partner to be on * the local system. If local is specified then target class cannot be - * specified. + * specified. * flags1_out - int * Contains information about the path * - IPPRTY - 0x20, Indicates you may send priority messages. * msglim - * u16, Number of outstanding messages - * handle - iucv_handle_t, Address of handler - * pgm_data - void *, Application data passed to interrupt handlers + * handle - iucv_handle_t, Address of handler + * pgm_data - void *, Application data passed to interrupt handlers * Output: return code from CP IUCV call * rc - return code from iucv_declare_buffer - * -EINVAL - Invalid handle passed by application - * -EINVAL - Pathid address is NULL - * add_pathid_result - Return code from internal function add_pathid + * -EINVAL - Invalid handle passed by application + * -EINVAL - Pathid address is NULL + * add_pathid_result - Return code from internal function add_pathid */ int iucv_connect (u16 * pathid, @@ -397,16 +397,16 @@ int int *flags1_out, u16 * msglim, iucv_handle_t handle, void *pgm_data); -/* - * Name: iucv_purge - * Purpose: This function cancels a message that you have sent. - * Input: pathid - Path identification number. +/* + * Name: iucv_purge + * Purpose: This function cancels a message that you have sent. + * Input: pathid - Path identification number. * msgid - Specifies the message ID of the message to be purged. - * srccls - Specifies the source message class. - * Output: audit - Contains information about asynchronous error - * that may have affected the normal completion - * of this message. - * Return: Return code from CP IUCV call. + * srccls - Specifies the source message class. + * Output: audit - Contains information about asynchronous error + * that may have affected the normal completion + * of this message. + * Return: Return code from CP IUCV call. */ int iucv_purge (u16 pathid, u32 msgid, u32 srccls, __u32 *audit); /* @@ -426,38 +426,38 @@ ulong iucv_query_maxconn (void); */ ulong iucv_query_bufsize (void); -/* - * Name: iucv_quiesce - * Purpose: This function temporarily suspends incoming messages on an - * IUCV path. You can later reactivate the path by invoking - * the iucv_resume function. - * Input: pathid - Path identification number - * user_data - 16-bytes of user data - * Output: NA - * Return: Return code from CP IUCV call. +/* + * Name: iucv_quiesce + * Purpose: This function temporarily suspends incoming messages on an + * IUCV path. You can later reactivate the path by invoking + * the iucv_resume function. + * Input: pathid - Path identification number + * user_data - 16-bytes of user data + * Output: NA + * Return: Return code from CP IUCV call. */ int iucv_quiesce (u16 pathid, uchar user_data[16]); -/* - * Name: iucv_receive - * Purpose: This function receives messages that are being sent to you +/* + * Name: iucv_receive + * Purpose: This function receives messages that are being sent to you * over established paths. Data will be returned in buffer for length of * buflen. - * Input: - * pathid - Path identification number. - * buffer - Address of buffer to receive. - * buflen - Length of buffer to receive. - * msgid - Specifies the message ID. - * trgcls - Specifies target class. - * Output: + * Input: + * pathid - Path identification number. + * buffer - Address of buffer to receive. + * buflen - Length of buffer to receive. + * msgid - Specifies the message ID. + * trgcls - Specifies target class. + * Output: * flags1_out: int *, Contains information about this path. * IPNORPY - 0x10 Specifies this is a one-way message and no reply is - * expected. - * IPPRTY - 0x20 Specifies if you want to send priority message. + * expected. + * IPPRTY - 0x20 Specifies if you want to send priority message. * IPRMDATA - 0x80 specifies the data is contained in the parameter list * residual_buffer - address of buffer updated by the number * of bytes you have received. - * residual_length - + * residual_length - * Contains one of the following values, if the receive buffer is: * The same length as the message, this field is zero. * Longer than the message, this field contains the number of @@ -466,8 +466,8 @@ int iucv_quiesce (u16 pathid, uchar user_data[16]); * count (that is, the number of bytes remaining in the * message that does not fit into the buffer. In this * case b2f0_result = 5. - * Return: Return code from CP IUCV call. - * (-EINVAL) - buffer address is pointing to NULL + * Return: Return code from CP IUCV call. + * (-EINVAL) - buffer address is pointing to NULL */ int iucv_receive (u16 pathid, u32 msgid, @@ -477,16 +477,16 @@ int iucv_receive (u16 pathid, int *flags1_out, ulong * residual_buffer, ulong * residual_length); - /* - * Name: iucv_receive_array - * Purpose: This function receives messages that are being sent to you + /* + * Name: iucv_receive_array + * Purpose: This function receives messages that are being sent to you * over established paths. Data will be returned in first buffer for * length of first buffer. - * Input: pathid - Path identification number. + * Input: pathid - Path identification number. * msgid - specifies the message ID. * trgcls - Specifies target class. - * buffer - Address of array of buffers. - * buflen - Total length of buffers. + * buffer - Address of array of buffers. + * buflen - Total length of buffers. * Output: * flags1_out: int *, Contains information about this path. * IPNORPY - 0x10 Specifies this is a one-way message and no reply is @@ -504,8 +504,8 @@ int iucv_receive (u16 pathid, * count (that is, the number of bytes remaining in the * message that does not fit into the buffer. In this * case b2f0_result = 5. - * Return: Return code from CP IUCV call. - * (-EINVAL) - Buffer address is NULL. + * Return: Return code from CP IUCV call. + * (-EINVAL) - Buffer address is NULL. */ int iucv_receive_array (u16 pathid, u32 msgid, @@ -515,44 +515,44 @@ int iucv_receive_array (u16 pathid, int *flags1_out, ulong * residual_buffer, ulong * residual_length); -/* - * Name: iucv_reject - * Purpose: The reject function refuses a specified message. Between the - * time you are notified of a message and the time that you - * complete the message, the message may be rejected. - * Input: pathid - Path identification number. - * msgid - Specifies the message ID. - * trgcls - Specifies target class. - * Output: NA - * Return: Return code from CP IUCV call. +/* + * Name: iucv_reject + * Purpose: The reject function refuses a specified message. Between the + * time you are notified of a message and the time that you + * complete the message, the message may be rejected. + * Input: pathid - Path identification number. + * msgid - Specifies the message ID. + * trgcls - Specifies target class. + * Output: NA + * Return: Return code from CP IUCV call. */ int iucv_reject (u16 pathid, u32 msgid, u32 trgcls); -/* - * Name: iucv_reply - * Purpose: This function responds to the two-way messages that you - * receive. You must identify completely the message to - * which you wish to reply. ie, pathid, msgid, and trgcls. - * Input: pathid - Path identification number. - * msgid - Specifies the message ID. - * trgcls - Specifies target class. +/* + * Name: iucv_reply + * Purpose: This function responds to the two-way messages that you + * receive. You must identify completely the message to + * which you wish to reply. ie, pathid, msgid, and trgcls. + * Input: pathid - Path identification number. + * msgid - Specifies the message ID. + * trgcls - Specifies target class. * flags1 - Option for path. - * IPPRTY- 0x20, Specifies if you want to send priority message. - * buffer - Address of reply buffer. - * buflen - Length of reply buffer. - * Output: residual_buffer - Address of buffer updated by the number - * of bytes you have moved. + * IPPRTY- 0x20, Specifies if you want to send priority message. + * buffer - Address of reply buffer. + * buflen - Length of reply buffer. + * Output: residual_buffer - Address of buffer updated by the number + * of bytes you have moved. * residual_length - Contains one of the following values: * If the answer buffer is the same length as the reply, this field * contains zero. * If the answer buffer is longer than the reply, this field contains - * the number of bytes remaining in the buffer. + * the number of bytes remaining in the buffer. * If the answer buffer is shorter than the reply, this field contains * a residual count (that is, the number of bytes remianing in the * reply that does not fit into the buffer. In this * case b2f0_result = 5. - * Return: Return code from CP IUCV call. - * (-EINVAL) - Buffer address is NULL. + * Return: Return code from CP IUCV call. + * (-EINVAL) - Buffer address is NULL. */ int iucv_reply (u16 pathid, u32 msgid, @@ -561,20 +561,20 @@ int iucv_reply (u16 pathid, void *buffer, ulong buflen, ulong * residual_buffer, ulong * residual_length); -/* - * Name: iucv_reply_array - * Purpose: This function responds to the two-way messages that you - * receive. You must identify completely the message to - * which you wish to reply. ie, pathid, msgid, and trgcls. - * The array identifies a list of addresses and lengths of - * discontiguous buffers that contains the reply data. - * Input: pathid - Path identification number - * msgid - Specifies the message ID. - * trgcls - Specifies target class. +/* + * Name: iucv_reply_array + * Purpose: This function responds to the two-way messages that you + * receive. You must identify completely the message to + * which you wish to reply. ie, pathid, msgid, and trgcls. + * The array identifies a list of addresses and lengths of + * discontiguous buffers that contains the reply data. + * Input: pathid - Path identification number + * msgid - Specifies the message ID. + * trgcls - Specifies target class. * flags1 - Option for path. * IPPRTY- 0x20, Specifies if you want to send priority message. - * buffer - Address of array of reply buffers. - * buflen - Total length of reply buffers. + * buffer - Address of array of reply buffers. + * buflen - Total length of reply buffers. * Output: residual_buffer - Address of buffer which IUCV is currently working on. * residual_length - Contains one of the following values: * If the answer buffer is the same length as the reply, this field @@ -585,8 +585,8 @@ int iucv_reply (u16 pathid, * a residual count (that is, the number of bytes remianing in the * reply that does not fit into the buffer. In this * case b2f0_result = 5. - * Return: Return code from CP IUCV call. - * (-EINVAL) - Buffer address is NULL. + * Return: Return code from CP IUCV call. + * (-EINVAL) - Buffer address is NULL. */ int iucv_reply_array (u16 pathid, u32 msgid, @@ -596,77 +596,77 @@ int iucv_reply_array (u16 pathid, ulong buflen, ulong * residual_address, ulong * residual_length); -/* - * Name: iucv_reply_prmmsg - * Purpose: This function responds to the two-way messages that you - * receive. You must identify completely the message to - * which you wish to reply. ie, pathid, msgid, and trgcls. - * Prmmsg signifies the data is moved into the - * parameter list. - * Input: pathid - Path identification number. - * msgid - Specifies the message ID. - * trgcls - Specifies target class. +/* + * Name: iucv_reply_prmmsg + * Purpose: This function responds to the two-way messages that you + * receive. You must identify completely the message to + * which you wish to reply. ie, pathid, msgid, and trgcls. + * Prmmsg signifies the data is moved into the + * parameter list. + * Input: pathid - Path identification number. + * msgid - Specifies the message ID. + * trgcls - Specifies target class. * flags1 - Option for path. * IPPRTY- 0x20 Specifies if you want to send priority message. - * prmmsg - 8-bytes of data to be placed into the parameter. - * list. - * Output: NA - * Return: Return code from CP IUCV call. + * prmmsg - 8-bytes of data to be placed into the parameter. + * list. + * Output: NA + * Return: Return code from CP IUCV call. */ int iucv_reply_prmmsg (u16 pathid, u32 msgid, u32 trgcls, int flags1, uchar prmmsg[8]); -/* - * Name: iucv_resume - * Purpose: This function restores communications over a quiesced path - * Input: pathid - Path identification number. - * user_data - 16-bytes of user data. - * Output: NA - * Return: Return code from CP IUCV call. +/* + * Name: iucv_resume + * Purpose: This function restores communications over a quiesced path + * Input: pathid - Path identification number. + * user_data - 16-bytes of user data. + * Output: NA + * Return: Return code from CP IUCV call. */ int iucv_resume (u16 pathid, uchar user_data[16]); -/* - * Name: iucv_send - * Purpose: This function transmits data to another application. - * Data to be transmitted is in a buffer and this is a - * one-way message and the receiver will not reply to the - * message. - * Input: pathid - Path identification number. - * trgcls - Specifies target class. - * srccls - Specifies the source message class. - * msgtag - Specifies a tag to be associated with the message. +/* + * Name: iucv_send + * Purpose: This function transmits data to another application. + * Data to be transmitted is in a buffer and this is a + * one-way message and the receiver will not reply to the + * message. + * Input: pathid - Path identification number. + * trgcls - Specifies target class. + * srccls - Specifies the source message class. + * msgtag - Specifies a tag to be associated with the message. * flags1 - Option for path. * IPPRTY- 0x20 Specifies if you want to send priority message. - * buffer - Address of send buffer. - * buflen - Length of send buffer. - * Output: msgid - Specifies the message ID. - * Return: Return code from CP IUCV call. - * (-EINVAL) - Buffer address is NULL. + * buffer - Address of send buffer. + * buflen - Length of send buffer. + * Output: msgid - Specifies the message ID. + * Return: Return code from CP IUCV call. + * (-EINVAL) - Buffer address is NULL. */ int iucv_send (u16 pathid, u32 * msgid, u32 trgcls, u32 srccls, u32 msgtag, int flags1, void *buffer, ulong buflen); -/* - * Name: iucv_send_array - * Purpose: This function transmits data to another application. - * The contents of buffer is the address of the array of - * addresses and lengths of discontiguous buffers that hold - * the message text. This is a one-way message and the - * receiver will not reply to the message. - * Input: pathid - Path identification number. - * trgcls - Specifies target class. - * srccls - Specifies the source message class. +/* + * Name: iucv_send_array + * Purpose: This function transmits data to another application. + * The contents of buffer is the address of the array of + * addresses and lengths of discontiguous buffers that hold + * the message text. This is a one-way message and the + * receiver will not reply to the message. + * Input: pathid - Path identification number. + * trgcls - Specifies target class. + * srccls - Specifies the source message class. * msgtag - Specifies a tag to be associated witht the message. * flags1 - Option for path. - * IPPRTY- specifies if you want to send priority message. - * buffer - Address of array of send buffers. - * buflen - Total length of send buffers. - * Output: msgid - Specifies the message ID. - * Return: Return code from CP IUCV call. - * (-EINVAL) - Buffer address is NULL. + * IPPRTY- specifies if you want to send priority message. + * buffer - Address of array of send buffers. + * buflen - Total length of send buffers. + * Output: msgid - Specifies the message ID. + * Return: Return code from CP IUCV call. + * (-EINVAL) - Buffer address is NULL. */ int iucv_send_array (u16 pathid, u32 * msgid, @@ -675,48 +675,48 @@ int iucv_send_array (u16 pathid, u32 msgtag, int flags1, iucv_array_t * buffer, ulong buflen); -/* - * Name: iucv_send_prmmsg - * Purpose: This function transmits data to another application. - * Prmmsg specifies that the 8-bytes of data are to be moved - * into the parameter list. This is a one-way message and the - * receiver will not reply to the message. - * Input: pathid - Path identification number. - * trgcls - Specifies target class. - * srccls - Specifies the source message class. - * msgtag - Specifies a tag to be associated with the message. +/* + * Name: iucv_send_prmmsg + * Purpose: This function transmits data to another application. + * Prmmsg specifies that the 8-bytes of data are to be moved + * into the parameter list. This is a one-way message and the + * receiver will not reply to the message. + * Input: pathid - Path identification number. + * trgcls - Specifies target class. + * srccls - Specifies the source message class. + * msgtag - Specifies a tag to be associated with the message. * flags1 - Option for path. * IPPRTY- 0x20 specifies if you want to send priority message. - * prmmsg - 8-bytes of data to be placed into parameter list. - * Output: msgid - Specifies the message ID. - * Return: Return code from CP IUCV call. + * prmmsg - 8-bytes of data to be placed into parameter list. + * Output: msgid - Specifies the message ID. + * Return: Return code from CP IUCV call. */ int iucv_send_prmmsg (u16 pathid, u32 * msgid, u32 trgcls, u32 srccls, u32 msgtag, int flags1, uchar prmmsg[8]); -/* - * Name: iucv_send2way - * Purpose: This function transmits data to another application. - * Data to be transmitted is in a buffer. The receiver - * of the send is expected to reply to the message and - * a buffer is provided into which IUCV moves the reply - * to this message. - * Input: pathid - Path identification number. - * trgcls - Specifies target class. - * srccls - Specifies the source message class. - * msgtag - Specifies a tag associated with the message. +/* + * Name: iucv_send2way + * Purpose: This function transmits data to another application. + * Data to be transmitted is in a buffer. The receiver + * of the send is expected to reply to the message and + * a buffer is provided into which IUCV moves the reply + * to this message. + * Input: pathid - Path identification number. + * trgcls - Specifies target class. + * srccls - Specifies the source message class. + * msgtag - Specifies a tag associated with the message. * flags1 - Option for path. * IPPRTY- 0x20 Specifies if you want to send priority message. - * buffer - Address of send buffer. - * buflen - Length of send buffer. - * ansbuf - Address of buffer into which IUCV moves the reply of - * this message. - * anslen - Address of length of buffer. - * Output: msgid - Specifies the message ID. - * Return: Return code from CP IUCV call. - * (-EINVAL) - Buffer or ansbuf address is NULL. + * buffer - Address of send buffer. + * buflen - Length of send buffer. + * ansbuf - Address of buffer into which IUCV moves the reply of + * this message. + * anslen - Address of length of buffer. + * Output: msgid - Specifies the message ID. + * Return: Return code from CP IUCV call. + * (-EINVAL) - Buffer or ansbuf address is NULL. */ int iucv_send2way (u16 pathid, u32 * msgid, @@ -726,28 +726,28 @@ int iucv_send2way (u16 pathid, int flags1, void *buffer, ulong buflen, void *ansbuf, ulong anslen); -/* - * Name: iucv_send2way_array - * Purpose: This function transmits data to another application. - * The contents of buffer is the address of the array of - * addresses and lengths of discontiguous buffers that hold - * the message text. The receiver of the send is expected to - * reply to the message and a buffer is provided into which - * IUCV moves the reply to this message. - * Input: pathid - Path identification number. - * trgcls - Specifies target class. - * srccls - Specifies the source message class. - * msgtag - Specifies a tag to be associated with the message. +/* + * Name: iucv_send2way_array + * Purpose: This function transmits data to another application. + * The contents of buffer is the address of the array of + * addresses and lengths of discontiguous buffers that hold + * the message text. The receiver of the send is expected to + * reply to the message and a buffer is provided into which + * IUCV moves the reply to this message. + * Input: pathid - Path identification number. + * trgcls - Specifies target class. + * srccls - Specifies the source message class. + * msgtag - Specifies a tag to be associated with the message. * flags1 - Option for path. * IPPRTY- 0x20 Specifies if you want to send priority message. - * buffer - Sddress of array of send buffers. - * buflen - Total length of send buffers. - * ansbuf - Address of array of buffer into which IUCV moves the reply - * of this message. - * anslen - Address of length reply buffers. - * Output: msgid - Specifies the message ID. - * Return: Return code from CP IUCV call. - * (-EINVAL) - Buffer address is NULL. + * buffer - Sddress of array of send buffers. + * buflen - Total length of send buffers. + * ansbuf - Address of array of buffer into which IUCV moves the reply + * of this message. + * anslen - Address of length reply buffers. + * Output: msgid - Specifies the message ID. + * Return: Return code from CP IUCV call. + * (-EINVAL) - Buffer address is NULL. */ int iucv_send2way_array (u16 pathid, u32 * msgid, @@ -758,27 +758,27 @@ int iucv_send2way_array (u16 pathid, iucv_array_t * buffer, ulong buflen, iucv_array_t * ansbuf, ulong anslen); -/* - * Name: iucv_send2way_prmmsg - * Purpose: This function transmits data to another application. - * Prmmsg specifies that the 8-bytes of data are to be moved - * into the parameter list. This is a two-way message and the - * receiver of the message is expected to reply. A buffer - * is provided into which IUCV moves the reply to this - * message. - * Input: pathid - Rath identification number. - * trgcls - Specifies target class. - * srccls - Specifies the source message class. - * msgtag - Specifies a tag to be associated with the message. +/* + * Name: iucv_send2way_prmmsg + * Purpose: This function transmits data to another application. + * Prmmsg specifies that the 8-bytes of data are to be moved + * into the parameter list. This is a two-way message and the + * receiver of the message is expected to reply. A buffer + * is provided into which IUCV moves the reply to this + * message. + * Input: pathid - Rath identification number. + * trgcls - Specifies target class. + * srccls - Specifies the source message class. + * msgtag - Specifies a tag to be associated with the message. * flags1 - Option for path. * IPPRTY- 0x20 Specifies if you want to send priority message. - * prmmsg - 8-bytes of data to be placed in parameter list. - * ansbuf - Address of buffer into which IUCV moves the reply of + * prmmsg - 8-bytes of data to be placed in parameter list. + * ansbuf - Address of buffer into which IUCV moves the reply of * this message. - * anslen - Address of length of buffer. - * Output: msgid - Specifies the message ID. - * Return: Return code from CP IUCV call. - * (-EINVAL) - Buffer address is NULL. + * anslen - Address of length of buffer. + * Output: msgid - Specifies the message ID. + * Return: Return code from CP IUCV call. + * (-EINVAL) - Buffer address is NULL. */ int iucv_send2way_prmmsg (u16 pathid, u32 * msgid, @@ -788,29 +788,29 @@ int iucv_send2way_prmmsg (u16 pathid, ulong flags1, uchar prmmsg[8], void *ansbuf, ulong anslen); -/* - * Name: iucv_send2way_prmmsg_array - * Purpose: This function transmits data to another application. - * Prmmsg specifies that the 8-bytes of data are to be moved - * into the parameter list. This is a two-way message and the - * receiver of the message is expected to reply. A buffer - * is provided into which IUCV moves the reply to this - * message. The contents of ansbuf is the address of the - * array of addresses and lengths of discontiguous buffers - * that contain the reply. - * Input: pathid - Path identification number. - * trgcls - Specifies target class. - * srccls - Specifies the source message class. - * msgtag - Specifies a tag to be associated with the message. +/* + * Name: iucv_send2way_prmmsg_array + * Purpose: This function transmits data to another application. + * Prmmsg specifies that the 8-bytes of data are to be moved + * into the parameter list. This is a two-way message and the + * receiver of the message is expected to reply. A buffer + * is provided into which IUCV moves the reply to this + * message. The contents of ansbuf is the address of the + * array of addresses and lengths of discontiguous buffers + * that contain the reply. + * Input: pathid - Path identification number. + * trgcls - Specifies target class. + * srccls - Specifies the source message class. + * msgtag - Specifies a tag to be associated with the message. * flags1 - Option for path. * IPPRTY- 0x20 specifies if you want to send priority message. - * prmmsg - 8-bytes of data to be placed into the parameter list. + * prmmsg - 8-bytes of data to be placed into the parameter list. * ansbuf - Address of array of buffer into which IUCV moves the reply - * of this message. - * anslen - Address of length of reply buffers. - * Output: msgid - Specifies the message ID. - * Return: Return code from CP IUCV call. - * (-EINVAL) - Ansbuf address is NULL. + * of this message. + * anslen - Address of length of reply buffers. + * Output: msgid - Specifies the message ID. + * Return: Return code from CP IUCV call. + * (-EINVAL) - Ansbuf address is NULL. */ int iucv_send2way_prmmsg_array (u16 pathid, u32 * msgid, @@ -821,29 +821,29 @@ int iucv_send2way_prmmsg_array (u16 pathid, uchar prmmsg[8], iucv_array_t * ansbuf, ulong anslen); -/* - * Name: iucv_setmask - * Purpose: This function enables or disables the following IUCV - * external interruptions: Nonpriority and priority message - * interrupts, nonpriority and priority reply interrupts. +/* + * Name: iucv_setmask + * Purpose: This function enables or disables the following IUCV + * external interruptions: Nonpriority and priority message + * interrupts, nonpriority and priority reply interrupts. * Input: SetMaskFlag - options for interrupts - * 0x80 - Nonpriority_MessagePendingInterruptsFlag - * 0x40 - Priority_MessagePendingInterruptsFlag - * 0x20 - Nonpriority_MessageCompletionInterruptsFlag - * 0x10 - Priority_MessageCompletionInterruptsFlag + * 0x80 - Nonpriority_MessagePendingInterruptsFlag + * 0x40 - Priority_MessagePendingInterruptsFlag + * 0x20 - Nonpriority_MessageCompletionInterruptsFlag + * 0x10 - Priority_MessageCompletionInterruptsFlag * 0x08 - IUCVControlInterruptsFlag - * Output: NA - * Return: Return code from CP IUCV call. + * Output: NA + * Return: Return code from CP IUCV call. */ int iucv_setmask (int SetMaskFlag); -/* - * Name: iucv_sever - * Purpose: This function terminates an IUCV path. - * Input: pathid - Path identification number. - * user_data - 16-bytes of user data. - * Output: NA - * Return: Return code from CP IUCV call. - * (-EINVAL) - Interal error, wild pointer. +/* + * Name: iucv_sever + * Purpose: This function terminates an IUCV path. + * Input: pathid - Path identification number. + * user_data - 16-bytes of user data. + * Output: NA + * Return: Return code from CP IUCV call. + * (-EINVAL) - Interal error, wild pointer. */ int iucv_sever (u16 pathid, uchar user_data[16]); diff --git a/drivers/s390/net/lcs.c b/drivers/s390/net/lcs.c index 16ac68c27..9cf88d720 100644 --- a/drivers/s390/net/lcs.c +++ b/drivers/s390/net/lcs.c @@ -68,7 +68,6 @@ static void lcs_tasklet(unsigned long); static void lcs_start_kernel_thread(struct lcs_card *card); static void lcs_get_frames_cb(struct lcs_channel *, struct lcs_buffer *); static int lcs_send_delipm(struct lcs_card *, struct lcs_ipm_list *); -static int lcs_recovery(void *ptr); /** * Debug Facility Stuff @@ -116,10 +115,11 @@ lcs_alloc_channel(struct lcs_channel *channel) LCS_DBF_TEXT(2, setup, "ichalloc"); for (cnt = 0; cnt < LCS_NUM_BUFFS; cnt++) { /* alloc memory fo iobuffer */ - channel->iob[cnt].data = - kzalloc(LCS_IOBUFFERSIZE, GFP_DMA | GFP_KERNEL); + channel->iob[cnt].data = (void *) + kmalloc(LCS_IOBUFFERSIZE, GFP_DMA | GFP_KERNEL); if (channel->iob[cnt].data == NULL) break; + memset(channel->iob[cnt].data, 0, LCS_IOBUFFERSIZE); channel->iob[cnt].state = BUF_STATE_EMPTY; } if (cnt < LCS_NUM_BUFFS) { @@ -182,9 +182,10 @@ lcs_alloc_card(void) LCS_DBF_TEXT(2, setup, "alloclcs"); - card = kzalloc(sizeof(struct lcs_card), GFP_KERNEL | GFP_DMA); + card = kmalloc(sizeof(struct lcs_card), GFP_KERNEL | GFP_DMA); if (card == NULL) return NULL; + memset(card, 0, sizeof(struct lcs_card)); card->lan_type = LCS_FRAME_TYPE_AUTO; card->pkt_seq = 0; card->lancmd_timeout = LCS_LANCMD_TIMEOUT_DEFAULT; @@ -430,6 +431,12 @@ lcs_setup_card(struct lcs_card *card) card->tx_buffer = NULL; card->tx_emitted = 0; + /* Initialize kernel thread task used for LGW commands. */ + INIT_WORK(&card->kernel_thread_starter, + (void *)lcs_start_kernel_thread,card); + card->thread_start_mask = 0; + card->thread_allowed_mask = 0; + card->thread_running_mask = 0; init_waitqueue_head(&card->wait_q); spin_lock_init(&card->lock); spin_lock_init(&card->ipm_lock); @@ -670,8 +677,9 @@ lcs_ready_buffer(struct lcs_channel *channel, struct lcs_buffer *buffer) int index, rc; LCS_DBF_TEXT(5, trace, "rdybuff"); - BUG_ON(buffer->state != BUF_STATE_LOCKED && - buffer->state != BUF_STATE_PROCESSED); + if (buffer->state != BUF_STATE_LOCKED && + buffer->state != BUF_STATE_PROCESSED) + BUG(); spin_lock_irqsave(get_ccwdev_lock(channel->ccwdev), flags); buffer->state = BUF_STATE_READY; index = buffer - channel->iob; @@ -695,7 +703,8 @@ __lcs_processed_buffer(struct lcs_channel *channel, struct lcs_buffer *buffer) int index, prev, next; LCS_DBF_TEXT(5, trace, "prcsbuff"); - BUG_ON(buffer->state != BUF_STATE_READY); + if (buffer->state != BUF_STATE_READY) + BUG(); buffer->state = BUF_STATE_PROCESSED; index = buffer - channel->iob; prev = (index - 1) & (LCS_NUM_BUFFS - 1); @@ -727,8 +736,9 @@ lcs_release_buffer(struct lcs_channel *channel, struct lcs_buffer *buffer) unsigned long flags; LCS_DBF_TEXT(5, trace, "relbuff"); - BUG_ON(buffer->state != BUF_STATE_LOCKED && - buffer->state != BUF_STATE_PROCESSED); + if (buffer->state != BUF_STATE_LOCKED && + buffer->state != BUF_STATE_PROCESSED) + BUG(); spin_lock_irqsave(get_ccwdev_lock(channel->ccwdev), flags); buffer->state = BUF_STATE_EMPTY; spin_unlock_irqrestore(get_ccwdev_lock(channel->ccwdev), flags); @@ -783,9 +793,10 @@ lcs_alloc_reply(struct lcs_cmd *cmd) LCS_DBF_TEXT(4, trace, "getreply"); - reply = kzalloc(sizeof(struct lcs_reply), GFP_ATOMIC); + reply = kmalloc(sizeof(struct lcs_reply), GFP_ATOMIC); if (!reply) return NULL; + memset(reply,0,sizeof(struct lcs_reply)); atomic_set(&reply->refcnt,1); reply->sequence_no = cmd->sequence_no; reply->received = 0; @@ -1137,10 +1148,13 @@ list_modified: } } /* re-insert all entries from the failed_list into ipm_list */ - list_for_each_entry_safe(ipm, tmp, &failed_list, list) - list_move_tail(&ipm->list, &card->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); + } spin_unlock_irqrestore(&card->ipm_lock, flags); + if (card->state == DEV_STATE_UP) + netif_wake_queue(card->dev); } /** @@ -1223,17 +1237,17 @@ lcs_set_mc_addresses(struct lcs_card *card, struct in_device *in4_dev) if (ipm != NULL) continue; /* Address already in list. */ ipm = (struct lcs_ipm_list *) - kzalloc(sizeof(struct lcs_ipm_list), GFP_ATOMIC); + kmalloc(sizeof(struct lcs_ipm_list), GFP_ATOMIC); if (ipm == NULL) { PRINT_INFO("Not enough memory to add " "new multicast entry!\n"); break; } + memset(ipm, 0, sizeof(struct lcs_ipm_list)); memcpy(&ipm->ipm.mac_addr, buf, LCS_MAC_LENGTH); ipm->ipm.ip_addr = im4->multiaddr; ipm->ipm_state = LCS_IPM_STATE_SET_REQUIRED; spin_lock_irqsave(&card->ipm_lock, flags); - LCS_DBF_HEX(2,trace,&ipm->ipm.ip_addr,4); list_add(&ipm->list, &card->ipm_list); spin_unlock_irqrestore(&card->ipm_lock, flags); } @@ -1261,15 +1275,7 @@ lcs_register_mc_addresses(void *data) read_unlock(&in4_dev->mc_list_lock); in_dev_put(in4_dev); - netif_carrier_off(card->dev); - netif_tx_disable(card->dev); - wait_event(card->write.wait_q, - (card->write.state != CH_STATE_RUNNING)); lcs_fix_multicast_list(card); - if (card->state == DEV_STATE_UP) { - netif_carrier_on(card->dev); - netif_wake_queue(card->dev); - } out: lcs_clear_thread_running_bit(card, LCS_SET_MC_THREAD); return 0; @@ -1286,7 +1292,7 @@ lcs_set_multicast_list(struct net_device *dev) LCS_DBF_TEXT(4, trace, "setmulti"); card = (struct lcs_card *) dev->priv; - if (!lcs_set_thread_start_bit(card, LCS_SET_MC_THREAD)) + if (!lcs_set_thread_start_bit(card, LCS_SET_MC_THREAD)) schedule_work(&card->kernel_thread_starter); } @@ -1318,53 +1324,6 @@ lcs_check_irb_error(struct ccw_device *cdev, struct irb *irb) return PTR_ERR(irb); } -static int -lcs_get_problem(struct ccw_device *cdev, struct irb *irb) -{ - int dstat, cstat; - char *sense; - - sense = (char *) irb->ecw; - cstat = irb->scsw.cstat; - dstat = irb->scsw.dstat; - - if (cstat & (SCHN_STAT_CHN_CTRL_CHK | SCHN_STAT_INTF_CTRL_CHK | - SCHN_STAT_CHN_DATA_CHK | SCHN_STAT_CHAIN_CHECK | - SCHN_STAT_PROT_CHECK | SCHN_STAT_PROG_CHECK)) { - LCS_DBF_TEXT(2, trace, "CGENCHK"); - return 1; - } - if (dstat & DEV_STAT_UNIT_CHECK) { - if (sense[LCS_SENSE_BYTE_1] & - LCS_SENSE_RESETTING_EVENT) { - LCS_DBF_TEXT(2, trace, "REVIND"); - return 1; - } - if (sense[LCS_SENSE_BYTE_0] & - LCS_SENSE_CMD_REJECT) { - LCS_DBF_TEXT(2, trace, "CMDREJ"); - return 0; - } - if ((!sense[LCS_SENSE_BYTE_0]) && - (!sense[LCS_SENSE_BYTE_1]) && - (!sense[LCS_SENSE_BYTE_2]) && - (!sense[LCS_SENSE_BYTE_3])) { - LCS_DBF_TEXT(2, trace, "ZEROSEN"); - return 0; - } - LCS_DBF_TEXT(2, trace, "DGENCHK"); - return 1; - } - return 0; -} - -void -lcs_schedule_recovery(struct lcs_card *card) -{ - LCS_DBF_TEXT(2, trace, "startrec"); - if (!lcs_set_thread_start_bit(card, LCS_RECOVERY_THREAD)) - schedule_work(&card->kernel_thread_starter); -} /** * IRQ Handler for LCS channels @@ -1374,8 +1333,7 @@ lcs_irq(struct ccw_device *cdev, unsigned long intparm, struct irb *irb) { struct lcs_card *card; struct lcs_channel *channel; - int rc, index; - int cstat, dstat; + int index; if (lcs_check_irb_error(cdev, irb)) return; @@ -1386,30 +1344,17 @@ lcs_irq(struct ccw_device *cdev, unsigned long intparm, struct irb *irb) else channel = &card->write; - cstat = irb->scsw.cstat; - dstat = irb->scsw.dstat; LCS_DBF_TEXT_(5, trace, "Rint%s",cdev->dev.bus_id); LCS_DBF_TEXT_(5, trace, "%4x%4x",irb->scsw.cstat, irb->scsw.dstat); LCS_DBF_TEXT_(5, trace, "%4x%4x",irb->scsw.fctl, irb->scsw.actl); - /* Check for channel and device errors presented */ - rc = lcs_get_problem(cdev, irb); - if (rc || (dstat & DEV_STAT_UNIT_EXCEP)) { - PRINT_WARN("check on device %s, dstat=0x%X, cstat=0x%X \n", - cdev->dev.bus_id, dstat, cstat); - if (rc) { - lcs_schedule_recovery(card); - wake_up(&card->wait_q); - return; - } - } /* How far in the ccw chain have we processed? */ if ((channel->state != CH_STATE_INIT) && (irb->scsw.fctl & SCSW_FCTL_START_FUNC)) { - index = (struct ccw1 *) __va((addr_t) irb->scsw.cpa) + index = (struct ccw1 *) __va((addr_t) irb->scsw.cpa) - channel->ccws; if ((irb->scsw.actl & SCSW_ACTL_SUSPENDED) || - (irb->scsw.cstat & SCHN_STAT_PCI)) + (irb->scsw.cstat | SCHN_STAT_PCI)) /* Bloody io subsystem tells us lies about cpa... */ index = (index - 1) & (LCS_NUM_BUFFS - 1); while (channel->io_idx != index) { @@ -1428,6 +1373,7 @@ lcs_irq(struct ccw_device *cdev, unsigned long intparm, struct irb *irb) else if (irb->scsw.actl & SCSW_ACTL_SUSPENDED) /* CCW execution stopped on a suspend bit. */ channel->state = CH_STATE_SUSPENDED; + if (irb->scsw.fctl & SCSW_FCTL_HALT_FUNC) { if (irb->scsw.cc != 0) { ccw_device_halt(channel->ccwdev, (addr_t) channel); @@ -1436,6 +1382,7 @@ lcs_irq(struct ccw_device *cdev, unsigned long intparm, struct irb *irb) /* The channel has been stopped by halt_IO. */ channel->state = CH_STATE_HALTED; } + if (irb->scsw.fctl & SCSW_FCTL_CLEAR_FUNC) { channel->state = CH_STATE_CLEARED; } @@ -1511,7 +1458,7 @@ lcs_txbuffer_cb(struct lcs_channel *channel, struct lcs_buffer *buffer) lcs_release_buffer(channel, buffer); card = (struct lcs_card *) ((char *) channel - offsetof(struct lcs_card, write)); - if (netif_queue_stopped(card->dev) && netif_carrier_ok(card->dev)) + if (netif_queue_stopped(card->dev)) netif_wake_queue(card->dev); spin_lock(&card->lock); card->tx_emitted--; @@ -1547,10 +1494,6 @@ __lcs_start_xmit(struct lcs_card *card, struct sk_buff *skb, card->stats.tx_carrier_errors++; return 0; } - if (skb->protocol == htons(ETH_P_IPV6)) { - dev_kfree_skb(skb); - return 0; - } netif_stop_queue(card->dev); spin_lock(&card->lock); if (card->tx_buffer != NULL && @@ -1695,6 +1638,30 @@ lcs_detect(struct lcs_card *card) return rc; } +/** + * reset card + */ +static int +lcs_resetcard(struct lcs_card *card) +{ + int retries; + + LCS_DBF_TEXT(2, trace, "rescard"); + for (retries = 0; retries < 10; retries++) { + if (lcs_detect(card) == 0) { + netif_wake_queue(card->dev); + card->state = DEV_STATE_UP; + PRINT_INFO("LCS device %s successfully restarted!\n", + card->dev->name); + return 0; + } + msleep(3000); + } + PRINT_ERR("Error in Reseting LCS card!\n"); + return -EIO; +} + + /** * LCS Stop card */ @@ -1718,6 +1685,111 @@ lcs_stopcard(struct lcs_card *card) return rc; } +/** + * LGW initiated commands + */ +static int +lcs_lgw_startlan_thread(void *data) +{ + struct lcs_card *card; + + card = (struct lcs_card *) data; + daemonize("lgwstpln"); + + if (!lcs_do_run_thread(card, LCS_STARTLAN_THREAD)) + return 0; + LCS_DBF_TEXT(4, trace, "lgwstpln"); + if (card->dev) + netif_stop_queue(card->dev); + if (lcs_startlan(card) == 0) { + netif_wake_queue(card->dev); + card->state = DEV_STATE_UP; + PRINT_INFO("LCS Startlan for device %s succeeded!\n", + card->dev->name); + + } else + PRINT_ERR("LCS Startlan for device %s failed!\n", + card->dev->name); + lcs_clear_thread_running_bit(card, LCS_STARTLAN_THREAD); + return 0; +} + +/** + * Send startup command initiated by Lan Gateway + */ +static int +lcs_lgw_startup_thread(void *data) +{ + int rc; + + struct lcs_card *card; + + card = (struct lcs_card *) data; + daemonize("lgwstaln"); + + if (!lcs_do_run_thread(card, LCS_STARTUP_THREAD)) + return 0; + LCS_DBF_TEXT(4, trace, "lgwstaln"); + if (card->dev) + netif_stop_queue(card->dev); + rc = lcs_send_startup(card, LCS_INITIATOR_LGW); + if (rc != 0) { + PRINT_ERR("Startup for LCS device %s initiated " \ + "by LGW failed!\nReseting card ...\n", + card->dev->name); + /* do a card reset */ + rc = lcs_resetcard(card); + if (rc == 0) + goto Done; + } + rc = lcs_startlan(card); + if (rc == 0) { + netif_wake_queue(card->dev); + card->state = DEV_STATE_UP; + } +Done: + if (rc == 0) + PRINT_INFO("LCS Startup for device %s succeeded!\n", + card->dev->name); + else + PRINT_ERR("LCS Startup for device %s failed!\n", + card->dev->name); + lcs_clear_thread_running_bit(card, LCS_STARTUP_THREAD); + return 0; +} + + +/** + * send stoplan command initiated by Lan Gateway + */ +static int +lcs_lgw_stoplan_thread(void *data) +{ + struct lcs_card *card; + int rc; + + card = (struct lcs_card *) data; + daemonize("lgwstop"); + + if (!lcs_do_run_thread(card, LCS_STOPLAN_THREAD)) + return 0; + LCS_DBF_TEXT(4, trace, "lgwstop"); + if (card->dev) + netif_stop_queue(card->dev); + if (lcs_send_stoplan(card, LCS_INITIATOR_LGW) == 0) + PRINT_INFO("Stoplan for %s initiated by LGW succeeded!\n", + card->dev->name); + else + PRINT_ERR("Stoplan %s initiated by LGW failed!\n", + card->dev->name); + /*Try to reset the card, stop it on failure */ + rc = lcs_resetcard(card); + if (rc != 0) + rc = lcs_stopcard(card); + lcs_clear_thread_running_bit(card, LCS_STOPLAN_THREAD); + return rc; +} + /** * Kernel Thread helper functions for LGW initiated commands */ @@ -1725,12 +1797,15 @@ static void lcs_start_kernel_thread(struct lcs_card *card) { LCS_DBF_TEXT(5, trace, "krnthrd"); - if (lcs_do_start_thread(card, LCS_RECOVERY_THREAD)) - kernel_thread(lcs_recovery, (void *) card, SIGCHLD); + if (lcs_do_start_thread(card, LCS_STARTUP_THREAD)) + kernel_thread(lcs_lgw_startup_thread, (void *) card, SIGCHLD); + if (lcs_do_start_thread(card, LCS_STARTLAN_THREAD)) + kernel_thread(lcs_lgw_startlan_thread, (void *) card, SIGCHLD); + if (lcs_do_start_thread(card, LCS_STOPLAN_THREAD)) + kernel_thread(lcs_lgw_stoplan_thread, (void *) card, SIGCHLD); #ifdef CONFIG_IP_MULTICAST if (lcs_do_start_thread(card, LCS_SET_MC_THREAD)) - kernel_thread(lcs_register_mc_addresses, - (void *) card, SIGCHLD); + kernel_thread(lcs_register_mc_addresses, (void *) card, SIGCHLD); #endif } @@ -1744,14 +1819,19 @@ lcs_get_control(struct lcs_card *card, struct lcs_cmd *cmd) if (cmd->initiator == LCS_INITIATOR_LGW) { switch(cmd->cmd_code) { case LCS_CMD_STARTUP: + if (!lcs_set_thread_start_bit(card, + LCS_STARTUP_THREAD)) + schedule_work(&card->kernel_thread_starter); + break; case LCS_CMD_STARTLAN: - lcs_schedule_recovery(card); + if (!lcs_set_thread_start_bit(card, + LCS_STARTLAN_THREAD)) + schedule_work(&card->kernel_thread_starter); break; case LCS_CMD_STOPLAN: - PRINT_WARN("Stoplan for %s initiated by LGW.\n", - card->dev->name); - if (card->dev) - netif_carrier_off(card->dev); + if (!lcs_set_thread_start_bit(card, + LCS_STOPLAN_THREAD)) + schedule_work(&card->kernel_thread_starter); break; default: PRINT_INFO("UNRECOGNIZED LGW COMMAND\n"); @@ -1867,11 +1947,8 @@ lcs_stop_device(struct net_device *dev) LCS_DBF_TEXT(2, trace, "stopdev"); card = (struct lcs_card *) dev->priv; - netif_carrier_off(dev); - netif_tx_disable(dev); + netif_stop_queue(dev); dev->flags &= ~IFF_UP; - wait_event(card->write.wait_q, - (card->write.state != CH_STATE_RUNNING)); rc = lcs_stopcard(card); if (rc) PRINT_ERR("Try it again!\n "); @@ -1897,7 +1974,6 @@ lcs_open_device(struct net_device *dev) } else { dev->flags |= IFF_UP; - netif_carrier_on(dev); netif_wake_queue(dev); card->state = DEV_STATE_UP; } @@ -1989,31 +2065,10 @@ lcs_timeout_store (struct device *dev, struct device_attribute *attr, const char DEVICE_ATTR(lancmd_timeout, 0644, lcs_timeout_show, lcs_timeout_store); -static ssize_t -lcs_dev_recover_store(struct device *dev, struct device_attribute *attr, - const char *buf, size_t count) -{ - struct lcs_card *card = dev->driver_data; - char *tmp; - int i; - - if (!card) - return -EINVAL; - if (card->state != DEV_STATE_UP) - return -EPERM; - i = simple_strtoul(buf, &tmp, 16); - if (i == 1) - lcs_schedule_recovery(card); - return count; -} - -static DEVICE_ATTR(recover, 0200, NULL, lcs_dev_recover_store); - static struct attribute * lcs_attrs[] = { &dev_attr_portno.attr, &dev_attr_type.attr, &dev_attr_lancmd_timeout.attr, - &dev_attr_recover.attr, NULL, }; @@ -2050,12 +2105,6 @@ lcs_probe_device(struct ccwgroup_device *ccwgdev) ccwgdev->dev.driver_data = card; ccwgdev->cdev[0]->handler = lcs_irq; ccwgdev->cdev[1]->handler = lcs_irq; - card->gdev = ccwgdev; - INIT_WORK(&card->kernel_thread_starter, - (void *) lcs_start_kernel_thread, card); - card->thread_start_mask = 0; - card->thread_allowed_mask = 0; - card->thread_running_mask = 0; return 0; } @@ -2157,7 +2206,6 @@ netdev_out: if (recover_state == DEV_STATE_RECOVER) { lcs_set_multicast_list(card->dev); card->dev->flags |= IFF_UP; - netif_carrier_on(card->dev); netif_wake_queue(card->dev); card->state = DEV_STATE_UP; } else { @@ -2187,7 +2235,7 @@ out: * lcs_shutdown_device, called when setting the group device offline. */ static int -__lcs_shutdown_device(struct ccwgroup_device *ccwgdev, int recovery_mode) +lcs_shutdown_device(struct ccwgroup_device *ccwgdev) { struct lcs_card *card; enum lcs_dev_states recover_state; @@ -2197,11 +2245,9 @@ __lcs_shutdown_device(struct ccwgroup_device *ccwgdev, int recovery_mode) card = (struct lcs_card *)ccwgdev->dev.driver_data; if (!card) return -ENODEV; - if (recovery_mode == 0) { - lcs_set_allowed_threads(card, 0); - if (lcs_wait_for_threads(card, LCS_SET_MC_THREAD)) - return -ERESTARTSYS; - } + lcs_set_allowed_threads(card, 0); + if (lcs_wait_for_threads(card, LCS_SET_MC_THREAD)) + return -ERESTARTSYS; LCS_DBF_HEX(3, setup, &card, sizeof(void*)); recover_state = card->state; @@ -2216,43 +2262,6 @@ __lcs_shutdown_device(struct ccwgroup_device *ccwgdev, int recovery_mode) return 0; } -static int -lcs_shutdown_device(struct ccwgroup_device *ccwgdev) -{ - return __lcs_shutdown_device(ccwgdev, 0); -} - -/** - * drive lcs recovery after startup and startlan initiated by Lan Gateway - */ -static int -lcs_recovery(void *ptr) -{ - struct lcs_card *card; - struct ccwgroup_device *gdev; - int rc; - - card = (struct lcs_card *) ptr; - daemonize("lcs_recover"); - - LCS_DBF_TEXT(4, trace, "recover1"); - if (!lcs_do_run_thread(card, LCS_RECOVERY_THREAD)) - return 0; - LCS_DBF_TEXT(4, trace, "recover2"); - gdev = card->gdev; - PRINT_WARN("Recovery of device %s started...\n", gdev->dev.bus_id); - rc = __lcs_shutdown_device(gdev, 1); - rc = lcs_new_device(gdev); - if (!rc) - PRINT_INFO("Device %s successfully recovered!\n", - card->dev->name); - else - PRINT_INFO("Device %s could not be recovered!\n", - card->dev->name); - lcs_clear_thread_running_bit(card, LCS_RECOVERY_THREAD); - return 0; -} - /** * lcs_remove_device, free buffers and card */ diff --git a/drivers/s390/net/lcs.h b/drivers/s390/net/lcs.h index 931439329..2fad5e40c 100644 --- a/drivers/s390/net/lcs.h +++ b/drivers/s390/net/lcs.h @@ -73,17 +73,13 @@ do { \ /** * LCS sense byte definitions */ -#define LCS_SENSE_BYTE_0 0 -#define LCS_SENSE_BYTE_1 1 -#define LCS_SENSE_BYTE_2 2 -#define LCS_SENSE_BYTE_3 3 #define LCS_SENSE_INTERFACE_DISCONNECT 0x01 #define LCS_SENSE_EQUIPMENT_CHECK 0x10 #define LCS_SENSE_BUS_OUT_CHECK 0x20 #define LCS_SENSE_INTERVENTION_REQUIRED 0x40 #define LCS_SENSE_CMD_REJECT 0x80 -#define LCS_SENSE_RESETTING_EVENT 0x80 -#define LCS_SENSE_DEVICE_ONLINE 0x20 +#define LCS_SENSE_RESETTING_EVENT 0x0080 +#define LCS_SENSE_DEVICE_ONLINE 0x0020 /** * LCS packet type definitions @@ -156,9 +152,10 @@ enum lcs_dev_states { enum lcs_threads { LCS_SET_MC_THREAD = 1, - LCS_RECOVERY_THREAD = 2, + LCS_STARTLAN_THREAD = 2, + LCS_STOPLAN_THREAD = 4, + LCS_STARTUP_THREAD = 8, }; - /** * LCS struct declarations */ @@ -289,7 +286,6 @@ struct lcs_card { struct net_device_stats stats; unsigned short (*lan_type_trans)(struct sk_buff *skb, struct net_device *dev); - struct ccwgroup_device *gdev; struct lcs_channel read; struct lcs_channel write; struct lcs_buffer *tx_buffer; diff --git a/drivers/s390/net/netiucv.c b/drivers/s390/net/netiucv.c index d7d1cc0a5..71d3853e8 100644 --- a/drivers/s390/net/netiucv.c +++ b/drivers/s390/net/netiucv.c @@ -30,7 +30,7 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * */ - + #undef DEBUG #include @@ -65,7 +65,7 @@ MODULE_AUTHOR ("(C) 2001 IBM Corporation by Fritz Elfert (felfert@millenux.com)"); MODULE_DESCRIPTION ("Linux for S/390 IUCV network driver"); - + #define PRINTK_HEADER " iucv: " /* for debugging */ static struct device_driver netiucv_driver = { @@ -112,12 +112,7 @@ struct iucv_connection { /** * Linked list of all connection structs. */ -struct iucv_connection_struct { - struct iucv_connection *iucv_connections; - rwlock_t iucv_rwlock; -}; - -static struct iucv_connection_struct iucv_conns; +static struct iucv_connection *iucv_connections; /** * Representation of event-data for the @@ -207,7 +202,7 @@ netiucv_printname(char *name) *p = '\0'; return tmp; } - + /** * States of the interface statemachine. */ @@ -249,7 +244,7 @@ static const char *dev_event_names[] = { "Connection up", "Connection down", }; - + /** * Events of the connection statemachine */ @@ -369,7 +364,7 @@ static const char *conn_state_names[] = { "Connect error", }; - + /** * Debug Facility Stuff */ @@ -521,7 +516,7 @@ static void fsm_action_nop(fsm_instance *fi, int event, void *arg) { } - + /** * Actions of the connection statemachine *****************************************************************************/ @@ -998,7 +993,7 @@ static const fsm_node conn_fsm[] = { static const int CONN_FSM_LEN = sizeof(conn_fsm) / sizeof(fsm_node); - + /** * Actions for interface - statemachine. *****************************************************************************/ @@ -1187,7 +1182,7 @@ netiucv_transmit_skb(struct iucv_connection *conn, struct sk_buff *skb) { fsm_newstate(conn->fsm, CONN_STATE_TX); conn->prof.send_stamp = xtime; - + rc = iucv_send(conn->pathid, NULL, 0, 0, 1 /* single_flag */, 0, nskb->data, nskb->len); /* Shut up, gcc! nskb is always below 2G. */ @@ -1225,7 +1220,7 @@ netiucv_transmit_skb(struct iucv_connection *conn, struct sk_buff *skb) { return rc; } - + /** * Interface API for upper network layers *****************************************************************************/ @@ -1296,7 +1291,7 @@ static int netiucv_tx(struct sk_buff *skb, struct net_device *dev) /** * If connection is not running, try to restart it - * and throw away packet. + * and throw away packet. */ if (fsm_getstate(privptr->fsm) != DEV_STATE_RUNNING) { fsm_event(privptr->fsm, DEV_EVENT_START, dev); @@ -1373,10 +1368,8 @@ 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[9]; + char username[10]; int i; - struct iucv_connection **clist = &iucv_conns.iucv_connections; - unsigned long flags; IUCV_DBF_TEXT(trace, 3, __FUNCTION__); if (count>9) { @@ -1389,7 +1382,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]= toupper(*p); + username[i]= *p; else if (*p == '\n') { /* trailing lf, grr */ break; @@ -1402,11 +1395,11 @@ user_write (struct device *dev, struct device_attribute *attr, const char *buf, return -EINVAL; } } - while (i<8) + while (i<9) username[i++] = ' '; - username[8] = '\0'; + username[9] = '\0'; - if (memcmp(username, priv->conn->userid, 9)) { + if (memcmp(username, priv->conn->userid, 8)) { /* username changed */ if (ndev->flags & (IFF_UP | IFF_RUNNING)) { PRINT_WARN( @@ -1417,19 +1410,6 @@ 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; @@ -1558,7 +1538,7 @@ static ssize_t maxcq_write (struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct netiucv_priv *priv = dev->driver_data; - + IUCV_DBF_TEXT(trace, 4, __FUNCTION__); priv->conn->prof.maxcqueue = 0; return count; @@ -1579,7 +1559,7 @@ static ssize_t sdoio_write (struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct netiucv_priv *priv = dev->driver_data; - + IUCV_DBF_TEXT(trace, 4, __FUNCTION__); priv->conn->prof.doios_single = 0; return count; @@ -1600,7 +1580,7 @@ static ssize_t mdoio_write (struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct netiucv_priv *priv = dev->driver_data; - + IUCV_DBF_TEXT(trace, 5, __FUNCTION__); priv->conn->prof.doios_multi = 0; return count; @@ -1621,7 +1601,7 @@ static ssize_t txlen_write (struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct netiucv_priv *priv = dev->driver_data; - + IUCV_DBF_TEXT(trace, 4, __FUNCTION__); priv->conn->prof.txlen = 0; return count; @@ -1642,7 +1622,7 @@ static ssize_t txtime_write (struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct netiucv_priv *priv = dev->driver_data; - + IUCV_DBF_TEXT(trace, 4, __FUNCTION__); priv->conn->prof.tx_time = 0; return count; @@ -1748,13 +1728,14 @@ static int netiucv_register_device(struct net_device *ndev) { struct netiucv_priv *priv = ndev->priv; - struct device *dev = kzalloc(sizeof(struct device), GFP_KERNEL); + struct device *dev = kmalloc(sizeof(struct device), GFP_KERNEL); int ret; IUCV_DBF_TEXT(trace, 3, __FUNCTION__); if (dev) { + memset(dev, 0, sizeof(struct device)); snprintf(dev->bus_id, BUS_ID_SIZE, "net%s", ndev->name); dev->bus = &iucv_bus; dev->parent = iucv_root; @@ -1801,15 +1782,15 @@ netiucv_unregister_device(struct device *dev) static struct iucv_connection * netiucv_new_connection(struct net_device *dev, char *username) { - unsigned long flags; - struct iucv_connection **clist = &iucv_conns.iucv_connections; + struct iucv_connection **clist = &iucv_connections; struct iucv_connection *conn = - kzalloc(sizeof(struct iucv_connection), GFP_KERNEL); + (struct iucv_connection *) + kmalloc(sizeof(struct iucv_connection), GFP_KERNEL); if (conn) { + memset(conn, 0, sizeof(struct iucv_connection)); 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; @@ -1844,10 +1825,8 @@ 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; } @@ -1859,17 +1838,14 @@ netiucv_new_connection(struct net_device *dev, char *username) static void netiucv_remove_connection(struct iucv_connection *conn) { - struct iucv_connection **clist = &iucv_conns.iucv_connections; - unsigned long flags; + struct iucv_connection **clist = &iucv_connections; 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; @@ -1882,7 +1858,6 @@ netiucv_remove_connection(struct iucv_connection *conn) } clist = &((*clist)->next); } - write_unlock_irqrestore(&iucv_conns.iucv_rwlock, flags); } /** @@ -1975,11 +1950,9 @@ static ssize_t conn_write(struct device_driver *drv, const char *buf, size_t count) { char *p; - char username[9]; + char username[10]; 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) { @@ -1990,7 +1963,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]= toupper(*p); + username[i]= *p; else if (*p == '\n') { /* trailing lf, grr */ break; @@ -2001,22 +1974,9 @@ conn_write(struct device_driver *drv, const char *buf, size_t count) return -EINVAL; } } - while (i<8) + while (i<9) username[i++] = ' '; - 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; - } + username[9] = '\0'; dev = netiucv_init_netdevice(username); if (!dev) { PRINT_WARN( @@ -2043,7 +2003,7 @@ conn_write(struct device_driver *drv, const char *buf, size_t count) } PRINT_INFO("%s: '%s'\n", dev->name, netiucv_printname(username)); - + return count; out_free_ndev: @@ -2058,8 +2018,7 @@ 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_conns.iucv_connections; - unsigned long flags; + struct iucv_connection **clist = &iucv_connections; struct net_device *ndev; struct netiucv_priv *priv; struct device *dev; @@ -2070,10 +2029,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; @@ -2092,7 +2050,6 @@ 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", @@ -2106,7 +2063,6 @@ 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; @@ -2124,8 +2080,8 @@ static void __exit netiucv_exit(void) { IUCV_DBF_TEXT(trace, 3, __FUNCTION__); - while (iucv_conns.iucv_connections) { - struct net_device *ndev = iucv_conns.iucv_connections->netdev; + while (iucv_connections) { + struct net_device *ndev = iucv_connections->netdev; struct netiucv_priv *priv = (struct netiucv_priv*)ndev->priv; struct device *dev = priv->dev; @@ -2146,7 +2102,7 @@ static int __init netiucv_init(void) { int ret; - + ret = iucv_register_dbf_views(); if (ret) { PRINT_WARN("netiucv_init failed, " @@ -2167,7 +2123,6 @@ 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); @@ -2176,7 +2131,7 @@ netiucv_init(void) } return ret; } - + module_init(netiucv_init); module_exit(netiucv_exit); MODULE_LICENSE("GPL"); diff --git a/drivers/s390/net/qeth.h b/drivers/s390/net/qeth.h index 821383d8c..4df0fcd7b 100644 --- a/drivers/s390/net/qeth.h +++ b/drivers/s390/net/qeth.h @@ -176,6 +176,7 @@ 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; @@ -210,10 +211,8 @@ 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 { @@ -377,7 +376,7 @@ struct qeth_hdr_osn { __u8 reserved3[18]; __u32 ccid; } __attribute__ ((packed)); - + struct qeth_hdr { union { struct qeth_hdr_layer2 l2; @@ -463,7 +462,6 @@ enum qeth_qdio_info_states { QETH_QDIO_UNINITIALIZED, QETH_QDIO_ALLOCATED, QETH_QDIO_ESTABLISHED, - QETH_QDIO_CLEANING }; struct qeth_buffer_pool_entry { @@ -538,7 +536,7 @@ struct qeth_qdio_out_q { } __attribute__ ((aligned(256))); struct qeth_qdio_info { - atomic_t state; + volatile enum qeth_qdio_info_states state; /* input */ struct qeth_qdio_q *in_q; struct qeth_qdio_buffer_pool in_buf_pool; @@ -769,7 +767,6 @@ struct qeth_card_options { int fake_ll; int layer2; enum qeth_large_send_types large_send; - int performance_stats; }; /* @@ -822,11 +819,13 @@ 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); - struct qeth_osn_info osn_info; + struct qeth_osn_info osn_info; }; struct qeth_card_list_struct { @@ -860,18 +859,23 @@ qeth_get_ipa_adp_type(enum qeth_link_types link_type) } } -static inline struct sk_buff * -qeth_realloc_headroom(struct qeth_card *card, struct sk_buff *skb, int size) +static inline int +qeth_realloc_headroom(struct qeth_card *card, struct sk_buff **skb, int size) { - 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; + 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; } static inline struct sk_buff * @@ -881,15 +885,16 @@ 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 @@ -898,7 +903,8 @@ 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("Misaligned packet on interface %s. Discarded.", + PRINT_ERR("qeth_prepare_skb: misaligned " + "packet on interface %s. Discarded.", QETH_CARD_IFNAME(card)); return NULL; } @@ -938,7 +944,7 @@ qeth_get_netdev_flags(struct qeth_card *card) return 0; switch (card->info.type) { case QETH_CARD_TYPE_IQD: - case QETH_CARD_TYPE_OSN: + case QETH_CARD_TYPE_OSN: return IFF_NOARP; #ifdef CONFIG_QETH_IPV6 default: @@ -975,7 +981,7 @@ static inline int qeth_get_max_mtu_for_card(int cardtype) { switch (cardtype) { - + case QETH_CARD_TYPE_UNKNOWN: case QETH_CARD_TYPE_OSAE: case QETH_CARD_TYPE_OSN: @@ -1050,11 +1056,13 @@ 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) @@ -1088,11 +1096,10 @@ qeth_string_to_ipaddr4(const char *buf, __u8 *addr) { int count = 0, rc = 0; int in[4]; - char c; - rc = sscanf(buf, "%u.%u.%u.%u%c", - &in[0], &in[1], &in[2], &in[3], &c); - if (rc != 4 && (rc != 5 || c != '\n')) + rc = sscanf(buf, "%d.%d.%d.%d%n", + &in[0], &in[1], &in[2], &in[3], &count); + if (rc != 4 || count) return -EINVAL; for (count = 0; count < 4; count++) { if (in[count] > 255) @@ -1116,28 +1123,24 @@ qeth_ipaddr6_to_string(const __u8 *addr, char *buf) static inline int qeth_string_to_ipaddr6(const char *buf, __u8 *addr) { - const char *end, *end_tmp, *start; + char *end, *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 = buf; - in = (__u16 *) addr; + end = start = (char *) buf; + in = (__u16 *) addr; memset(in, 0, 16); - while (*end) { - end = strchr(start,':'); + while (end) { + end = strchr(end,':'); if (end == NULL) { - end = buf + strlen(buf); - if ((end_tmp = strchr(start, '\n')) != NULL) - end = end_tmp; - out = 1; + end = (char *)buf + (strlen(buf)); + out = 1; } - if ((end - start)) { + if ((end - start)) { memset(num, 0, 5); - if ((end - start) > 4) - return -EINVAL; memcpy(num, start, end - start); if (!qeth_isxdigit(num)) return -EINVAL; @@ -1155,8 +1158,6 @@ 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]; @@ -1240,5 +1241,5 @@ qeth_osn_register(unsigned char *read_dev_no, extern void qeth_osn_deregister(struct net_device *); - + #endif /* __QETH_H__ */ diff --git a/drivers/s390/net/qeth_eddp.c b/drivers/s390/net/qeth_eddp.c index a363721cf..82cb4af2f 100644 --- a/drivers/s390/net/qeth_eddp.c +++ b/drivers/s390/net/qeth_eddp.c @@ -8,6 +8,7 @@ * Author(s): Thomas Spatzier * */ +#include #include #include #include @@ -80,7 +81,7 @@ void qeth_eddp_buf_release_contexts(struct qeth_qdio_out_buffer *buf) { struct qeth_eddp_context_reference *ref; - + QETH_DBF_TEXT(trace, 6, "eddprctx"); while (!list_empty(&buf->ctx_list)){ ref = list_entry(buf->ctx_list.next, @@ -134,7 +135,7 @@ qeth_eddp_fill_buffer(struct qeth_qdio_out_q *queue, "buffer!\n"); goto out; } - } + } /* check if the whole next skb fits into current buffer */ if ((QETH_MAX_BUFFER_ELEMENTS(queue->card) - buf->next_element_to_fill) @@ -147,7 +148,7 @@ qeth_eddp_fill_buffer(struct qeth_qdio_out_q *queue, * and increment ctx's refcnt */ must_refcnt = 1; continue; - } + } if (must_refcnt){ must_refcnt = 0; if (qeth_eddp_buf_ref_context(buf, ctx)){ @@ -179,8 +180,9 @@ out_check: flush_cnt++; } } else { - if (queue->card->options.performance_stats) - queue->card->perf_stats.skbs_sent_pack++; +#ifdef CONFIG_QETH_PERF_STATS + queue->card->perf_stats.skbs_sent_pack++; +#endif QETH_DBF_TEXT(trace, 6, "fillbfpa"); if (buf->next_element_to_fill >= QETH_MAX_BUFFER_ELEMENTS(queue->card)) { @@ -264,7 +266,7 @@ qeth_eddp_copy_data_tcp(char *dst, struct qeth_eddp_data *eddp, int len, int left_in_frag; int copy_len; u8 *src; - + QETH_DBF_TEXT(trace, 5, "eddpcdtc"); if (skb_shinfo(eddp->skb)->nr_frags == 0) { memcpy(dst, eddp->skb->data + eddp->skb_offset, len); @@ -387,8 +389,9 @@ qeth_eddp_create_eddp_data(struct qeth_hdr *qh, u8 *nh, u8 nhl, u8 *th, u8 thl) struct qeth_eddp_data *eddp; QETH_DBF_TEXT(trace, 5, "eddpcrda"); - eddp = kzalloc(sizeof(struct qeth_eddp_data), GFP_ATOMIC); + eddp = kmalloc(sizeof(struct qeth_eddp_data), GFP_ATOMIC); if (eddp){ + memset(eddp, 0, sizeof(struct qeth_eddp_data)); eddp->nhl = nhl; eddp->thl = thl; memcpy(&eddp->qh, qh, sizeof(struct qeth_hdr)); @@ -406,7 +409,7 @@ __qeth_eddp_fill_context_tcp(struct qeth_eddp_context *ctx, struct tcphdr *tcph; int data_len; u32 hcsum; - + QETH_DBF_TEXT(trace, 5, "eddpftcp"); eddp->skb_offset = sizeof(struct qeth_hdr) + eddp->nhl + eddp->thl; if (eddp->qh.hdr.l2.id == QETH_HEADER_TYPE_LAYER2) { @@ -418,7 +421,7 @@ __qeth_eddp_fill_context_tcp(struct qeth_eddp_context *ctx, } tcph = eddp->skb->h.th; while (eddp->skb_offset < eddp->skb->len) { - data_len = min((int)skb_shinfo(eddp->skb)->gso_size, + data_len = min((int)skb_shinfo(eddp->skb)->tso_size, (int)(eddp->skb->len - eddp->skb_offset)); /* prepare qdio hdr */ if (eddp->qh.hdr.l2.id == QETH_HEADER_TYPE_LAYER2){ @@ -463,13 +466,13 @@ __qeth_eddp_fill_context_tcp(struct qeth_eddp_context *ctx, eddp->th.tcp.h.seq += data_len; } } - + static inline int qeth_eddp_fill_context_tcp(struct qeth_eddp_context *ctx, struct sk_buff *skb, struct qeth_hdr *qhdr) { struct qeth_eddp_data *eddp = NULL; - + QETH_DBF_TEXT(trace, 5, "eddpficx"); /* create our segmentation headers and copy original headers */ if (skb->protocol == ETH_P_IP) @@ -510,23 +513,23 @@ qeth_eddp_calc_num_pages(struct qeth_eddp_context *ctx, struct sk_buff *skb, int hdr_len) { int skbs_per_page; - + QETH_DBF_TEXT(trace, 5, "eddpcanp"); /* can we put multiple skbs in one page? */ - skbs_per_page = PAGE_SIZE / (skb_shinfo(skb)->gso_size + hdr_len); + skbs_per_page = PAGE_SIZE / (skb_shinfo(skb)->tso_size + hdr_len); if (skbs_per_page > 1){ - ctx->num_pages = (skb_shinfo(skb)->gso_segs + 1) / + ctx->num_pages = (skb_shinfo(skb)->tso_segs + 1) / skbs_per_page + 1; ctx->elements_per_skb = 1; } else { /* no -> how many elements per skb? */ - ctx->elements_per_skb = (skb_shinfo(skb)->gso_size + hdr_len + + ctx->elements_per_skb = (skb_shinfo(skb)->tso_size + hdr_len + PAGE_SIZE) >> PAGE_SHIFT; ctx->num_pages = ctx->elements_per_skb * - (skb_shinfo(skb)->gso_segs + 1); + (skb_shinfo(skb)->tso_segs + 1); } ctx->num_elements = ctx->elements_per_skb * - (skb_shinfo(skb)->gso_segs + 1); + (skb_shinfo(skb)->tso_segs + 1); } static inline struct qeth_eddp_context * @@ -539,11 +542,12 @@ qeth_eddp_create_context_generic(struct qeth_card *card, struct sk_buff *skb, QETH_DBF_TEXT(trace, 5, "creddpcg"); /* create the context and allocate pages */ - ctx = kzalloc(sizeof(struct qeth_eddp_context), GFP_ATOMIC); + ctx = kmalloc(sizeof(struct qeth_eddp_context), GFP_ATOMIC); if (ctx == NULL){ QETH_DBF_TEXT(trace, 2, "ceddpcn1"); return NULL; } + memset(ctx, 0, sizeof(struct qeth_eddp_context)); ctx->type = QETH_LARGE_SEND_EDDP; qeth_eddp_calc_num_pages(ctx, skb, hdr_len); if (ctx->elements_per_skb > QETH_MAX_BUFFER_ELEMENTS(card)){ @@ -551,12 +555,13 @@ qeth_eddp_create_context_generic(struct qeth_card *card, struct sk_buff *skb, kfree(ctx); return NULL; } - ctx->pages = kcalloc(ctx->num_pages, sizeof(u8 *), GFP_ATOMIC); + ctx->pages = kmalloc(ctx->num_pages * sizeof(u8 *), GFP_ATOMIC); if (ctx->pages == NULL){ QETH_DBF_TEXT(trace, 2, "ceddpcn2"); kfree(ctx); return NULL; } + memset(ctx->pages, 0, ctx->num_pages * sizeof(u8 *)); for (i = 0; i < ctx->num_pages; ++i){ addr = (u8 *)__get_free_page(GFP_ATOMIC); if (addr == NULL){ @@ -568,13 +573,15 @@ qeth_eddp_create_context_generic(struct qeth_card *card, struct sk_buff *skb, memset(addr, 0, PAGE_SIZE); ctx->pages[i] = addr; } - ctx->elements = kcalloc(ctx->num_elements, + ctx->elements = kmalloc(ctx->num_elements * sizeof(struct qeth_eddp_element), GFP_ATOMIC); if (ctx->elements == NULL){ QETH_DBF_TEXT(trace, 2, "ceddpcn4"); qeth_eddp_free_context(ctx); return NULL; } + memset(ctx->elements, 0, + ctx->num_elements * sizeof(struct qeth_eddp_element)); /* reset num_elements; will be incremented again in fill_buffer to * reflect number of actually used elements */ ctx->num_elements = 0; @@ -586,7 +593,7 @@ qeth_eddp_create_context_tcp(struct qeth_card *card, struct sk_buff *skb, struct qeth_hdr *qhdr) { struct qeth_eddp_context *ctx = NULL; - + QETH_DBF_TEXT(trace, 5, "creddpct"); if (skb->protocol == ETH_P_IP) ctx = qeth_eddp_create_context_generic(card, skb, diff --git a/drivers/s390/net/qeth_fs.h b/drivers/s390/net/qeth_fs.h index 61faf0551..e422b41c6 100644 --- a/drivers/s390/net/qeth_fs.h +++ b/drivers/s390/net/qeth_fs.h @@ -42,7 +42,7 @@ qeth_create_device_attributes_osn(struct device *dev); extern void qeth_remove_device_attributes_osn(struct device *dev); - + extern int qeth_create_driver_attributes(void); diff --git a/drivers/s390/net/qeth_main.c b/drivers/s390/net/qeth_main.c index 5613b4564..dba7f7f02 100644 --- a/drivers/s390/net/qeth_main.c +++ b/drivers/s390/net/qeth_main.c @@ -27,6 +27,7 @@ */ +#include #include #include #include @@ -84,8 +85,6 @@ 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 */ @@ -298,10 +297,12 @@ qeth_alloc_card(void) struct qeth_card *card; QETH_DBF_TEXT(setup, 2, "alloccrd"); - card = kzalloc(sizeof(struct qeth_card), GFP_DMA|GFP_KERNEL); + card = (struct qeth_card *) kmalloc(sizeof(struct qeth_card), + GFP_DMA|GFP_KERNEL); if (!card) return NULL; QETH_DBF_HEX(setup, 2, &card, sizeof(void *)); + memset(card, 0, sizeof(struct qeth_card)); if (qeth_setup_channel(&card->read)) { kfree(card); return NULL; @@ -514,7 +515,7 @@ __qeth_set_offline(struct ccwgroup_device *cgdev, int recovery_mode) QETH_DBF_TEXT(setup, 3, "setoffl"); QETH_DBF_HEX(setup, 3, &card, sizeof(void *)); - + if (card->dev && netif_carrier_ok(card->dev)) netif_carrier_off(card->dev); recover_flag = card->state; @@ -605,13 +606,13 @@ __qeth_ref_ip_on_card(struct qeth_card *card, struct qeth_ipaddr *todo, list_for_each_entry(addr, &card->ip_list, entry) { if (card->options.layer2) { if ((addr->type == todo->type) && - (memcmp(&addr->mac, &todo->mac, + (memcmp(&addr->mac, &todo->mac, OSA_ADDR_LEN) == 0)) { found = 1; break; } continue; - } + } if ((addr->proto == QETH_PROT_IPV4) && (todo->proto == QETH_PROT_IPV4) && (addr->type == todo->type) && @@ -695,13 +696,13 @@ __qeth_insert_ip_todo(struct qeth_card *card, struct qeth_ipaddr *addr, int add) if (card->options.layer2) { if ((tmp->type == addr->type) && (tmp->is_multicast == addr->is_multicast) && - (memcmp(&tmp->mac, &addr->mac, + (memcmp(&tmp->mac, &addr->mac, OSA_ADDR_LEN) == 0)) { found = 1; break; } continue; - } + } if ((tmp->proto == QETH_PROT_IPV4) && (addr->proto == QETH_PROT_IPV4) && (tmp->type == addr->type) && @@ -1073,7 +1074,6 @@ qeth_set_intial_options(struct qeth_card *card) card->options.layer2 = 1; else card->options.layer2 = 0; - card->options.performance_stats = 1; } /** @@ -1175,7 +1175,7 @@ qeth_determine_card_type(struct qeth_card *card) "due to hardware limitations!\n"); card->qdio.no_out_queues = 1; card->qdio.default_out_queue = 0; - } + } return 0; } i++; @@ -1200,7 +1200,7 @@ qeth_probe_device(struct ccwgroup_device *gdev) return -ENODEV; QETH_DBF_TEXT_(setup, 2, "%s", gdev->dev.bus_id); - + card = qeth_alloc_card(); if (!card) { put_device(dev); @@ -1222,7 +1222,7 @@ qeth_probe_device(struct ccwgroup_device *gdev) put_device(dev); qeth_free_card(card); return rc; - } + } if ((rc = qeth_setup_card(card))){ QETH_DBF_TEXT_(setup, 2, "2err%d", rc); put_device(dev); @@ -1364,7 +1364,7 @@ qeth_wait_for_buffer(struct qeth_channel *channel) static void qeth_clear_cmd_buffers(struct qeth_channel *channel) { - int cnt; + int cnt = 0; for (cnt=0; cnt < QETH_CMD_BUFFER_NO; cnt++) qeth_release_buffer(channel,&channel->iob[cnt]); @@ -1632,8 +1632,9 @@ qeth_alloc_reply(struct qeth_card *card) { struct qeth_reply *reply; - reply = kzalloc(sizeof(struct qeth_reply), GFP_ATOMIC); + reply = kmalloc(sizeof(struct qeth_reply), GFP_ATOMIC); if (reply){ + memset(reply, 0, sizeof(struct qeth_reply)); atomic_set(&reply->refcnt, 1); reply->card = card; }; @@ -1709,7 +1710,6 @@ qeth_check_ipa_data(struct qeth_card *card, struct qeth_cmd_buffer *iob) "IP address reset.\n", QETH_CARD_IFNAME(card), card->info.chpid); - netif_carrier_on(card->dev); qeth_schedule_recovery(card); return NULL; case IPA_CMD_MODCCID: @@ -1846,7 +1846,7 @@ struct qeth_cmd_buffer *iob) &card->seqno.pdu_hdr_ack, QETH_SEQ_NO_LENGTH); QETH_DBF_HEX(control, 2, iob->data, QETH_DBF_CONTROL_LEN); } - + static int qeth_send_control_data(struct qeth_card *card, int len, struct qeth_cmd_buffer *iob, @@ -1940,7 +1940,7 @@ qeth_osn_send_control_data(struct qeth_card *card, int len, wake_up(&card->wait_q); } return rc; -} +} static inline void qeth_prepare_ipa_cmd(struct qeth_card *card, struct qeth_cmd_buffer *iob, @@ -1969,7 +1969,7 @@ qeth_osn_send_ipa_cmd(struct qeth_card *card, struct qeth_cmd_buffer *iob, memcpy(QETH_IPA_PDU_LEN_PDU3(iob->data), &s2, 2); return qeth_osn_send_control_data(card, s1, iob); } - + static int qeth_send_ipa_cmd(struct qeth_card *card, struct qeth_cmd_buffer *iob, int (*reply_cb) @@ -2466,6 +2466,24 @@ 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) @@ -2494,16 +2512,15 @@ qeth_layer2_rebuild_skb(struct qeth_card *card, struct sk_buff *skb, return vlan_id; } -static inline __u16 +static inline void 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 0; + return; } #endif /* CONFIG_QETH_IPV6 */ skb->protocol = htons((hdr->hdr.l3.flags & QETH_HDR_IPV6)? ETH_P_IPV6 : @@ -2525,13 +2542,7 @@ qeth_rebuild_skb(struct qeth_card *card, struct sk_buff *skb, default: skb->pkt_type = PACKET_HOST; } - - 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]); - } - + qeth_rebuild_skb_vlan(card, skb, hdr); if (card->options.fake_ll) qeth_rebuild_skb_fake_ll(card, skb, hdr); else @@ -2547,7 +2558,6 @@ qeth_rebuild_skb(struct qeth_card *card, struct sk_buff *skb, else skb->ip_summed = SW_CHECKSUMMING; } - return vlan_id; } static inline void @@ -2560,20 +2570,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; - if (card->options.performance_stats) - card->perf_stats.bufs_rec++; +#ifdef CONFIG_QETH_PERF_STATS + card->perf_stats.bufs_rec++; +#endif 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) - vlan_tag = qeth_rebuild_skb(card, skb, hdr); + else if (hdr->hdr.l3.id == QETH_HEADER_TYPE_LAYER3) + 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)); @@ -2583,19 +2593,14 @@ 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) - if (card->vlangrp) - vlan_hwaccel_rx(skb, card->vlangrp, vlan_tag); - else { - dev_kfree_skb_any(skb); - continue; - } + vlan_hwaccel_rx(skb, card->vlangrp, vlan_tag); 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++; @@ -2623,7 +2628,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 @@ -2697,18 +2702,17 @@ 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 */ - if (card->options.performance_stats) { - card->perf_stats.inbound_do_qdio_cnt++; - card->perf_stats.inbound_do_qdio_start_time = - qeth_get_micros(); - } +#ifdef CONFIG_QETH_PERF_STATS + card->perf_stats.inbound_do_qdio_cnt++; + card->perf_stats.inbound_do_qdio_start_time = qeth_get_micros(); +#endif rc = do_QDIO(CARD_DDEV(card), QDIO_FLAG_SYNC_INPUT | QDIO_FLAG_UNDER_INTERRUPT, 0, queue->next_buf_to_init, count, NULL); - if (card->options.performance_stats) - card->perf_stats.inbound_do_qdio_time += - qeth_get_micros() - - card->perf_stats.inbound_do_qdio_start_time; +#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 (rc){ PRINT_WARN("qeth_queue_input_buffer's do_QDIO " "return %i (device %s).\n", @@ -2744,10 +2748,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; - if (card->options.performance_stats) { - card->perf_stats.inbound_cnt++; - card->perf_stats.inbound_start_time = qeth_get_micros(); - } +#ifdef CONFIG_QETH_PERF_STATS + card->perf_stats.inbound_cnt++; + card->perf_stats.inbound_start_time = qeth_get_micros(); +#endif if (status & QDIO_STATUS_LOOK_FOR_ERROR) { if (status & QDIO_STATUS_ACTIVATE_CHECK_CONDITION){ QETH_DBF_TEXT(trace, 1,"qdinchk"); @@ -2762,16 +2766,17 @@ qeth_qdio_input_handler(struct ccw_device * ccwdev, unsigned int status, index = i % QDIO_MAX_BUFFERS_PER_Q; buffer = &card->qdio.in_q->bufs[index]; if (!((status & QDIO_STATUS_LOOK_FOR_ERROR) && - qeth_check_qdio_errors(buffer->buffer, + qeth_check_qdio_errors(buffer->buffer, qdio_err, siga_err,"qinerr"))) qeth_process_inbound_buffer(card, buffer, index); /* clear buffer and give back to hardware */ qeth_put_buffer_pool_entry(card, buffer->pool_entry); qeth_queue_input_buffer(card, index); } - if (card->options.performance_stats) - card->perf_stats.inbound_time += qeth_get_micros() - - card->perf_stats.inbound_start_time; +#ifdef CONFIG_QETH_PERF_STATS + card->perf_stats.inbound_time += qeth_get_micros() - + card->perf_stats.inbound_start_time; +#endif } static inline int @@ -2809,11 +2814,11 @@ qeth_handle_send_error(struct qeth_card *card, QETH_DBF_TEXT_(trace,1,"%s",CARD_BUS_ID(card)); return QETH_SEND_ERROR_LINK_FAILURE; case 3: - default: QETH_DBF_TEXT(trace, 1, "SIGAcc3"); QETH_DBF_TEXT_(trace,1,"%s",CARD_BUS_ID(card)); return QETH_SEND_ERROR_KICK_IT; } + return QETH_SEND_ERROR_LINK_FAILURE; } void @@ -2861,11 +2866,10 @@ qeth_flush_buffers(struct qeth_qdio_out_q *queue, int under_int, } queue->card->dev->trans_start = jiffies; - 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(); - } +#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 (under_int) rc = do_QDIO(CARD_DDEV(queue->card), QDIO_FLAG_SYNC_OUTPUT | QDIO_FLAG_UNDER_INTERRUPT, @@ -2873,10 +2877,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); - 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; +#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 (rc){ QETH_DBF_TEXT(trace, 2, "flushbuf"); QETH_DBF_TEXT_(trace, 2, " err%d", rc); @@ -2888,8 +2892,9 @@ qeth_flush_buffers(struct qeth_qdio_out_q *queue, int under_int, return; } atomic_add(count, &queue->used_buffers); - if (queue->card->options.performance_stats) - queue->card->perf_stats.bufs_sent += count; +#ifdef CONFIG_QETH_PERF_STATS + queue->card->perf_stats.bufs_sent += count; +#endif } /* @@ -2904,8 +2909,9 @@ 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"); - if (queue->card->options.performance_stats) - queue->card->perf_stats.sc_dp_p++; +#ifdef CONFIG_QETH_PERF_STATS + queue->card->perf_stats.sc_dp_p++; +#endif queue->do_pack = 1; } } @@ -2928,8 +2934,9 @@ 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"); - if (queue->card->options.performance_stats) - queue->card->perf_stats.sc_p_dp++; +#ifdef CONFIG_QETH_PERF_STATS + queue->card->perf_stats.sc_p_dp++; +#endif queue->do_pack = 0; /* flush packing buffers */ buffer = &queue->bufs[queue->next_buf_to_fill]; @@ -2941,7 +2948,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; @@ -2997,10 +3004,11 @@ 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); - if (queue->card->options.performance_stats && - q_was_packing) +#ifdef CONFIG_QETH_PERF_STATS + if (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); @@ -3030,11 +3038,10 @@ qeth_qdio_output_handler(struct ccw_device * ccwdev, unsigned int status, return; } } - if (card->options.performance_stats) { - card->perf_stats.outbound_handler_cnt++; - card->perf_stats.outbound_handler_start_time = - qeth_get_micros(); - } +#ifdef CONFIG_QETH_PERF_STATS + card->perf_stats.outbound_handler_cnt++; + card->perf_stats.outbound_handler_start_time = qeth_get_micros(); +#endif 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 */ @@ -3053,9 +3060,10 @@ qeth_qdio_output_handler(struct ccw_device * ccwdev, unsigned int status, qeth_check_outbound_queue(queue); netif_wake_queue(queue->card->dev); - if (card->options.performance_stats) - card->perf_stats.outbound_handler_time += qeth_get_micros() - - card->perf_stats.outbound_handler_start_time; +#ifdef CONFIG_QETH_PERF_STATS + card->perf_stats.outbound_handler_time += qeth_get_micros() - + card->perf_stats.outbound_handler_start_time; +#endif } static void @@ -3179,14 +3187,13 @@ qeth_alloc_qdio_buffers(struct qeth_card *card) QETH_DBF_TEXT(setup, 2, "allcqdbf"); - if (atomic_cmpxchg(&card->qdio.state, QETH_QDIO_UNINITIALIZED, - QETH_QDIO_ALLOCATED) != QETH_QDIO_UNINITIALIZED) + if (card->qdio.state == QETH_QDIO_ALLOCATED) return 0; - card->qdio.in_q = kmalloc(sizeof(struct qeth_qdio_q), + card->qdio.in_q = kmalloc(sizeof(struct qeth_qdio_q), GFP_KERNEL|GFP_DMA); if (!card->qdio.in_q) - goto out_nomem; + return - ENOMEM; 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)); @@ -3195,19 +3202,27 @@ 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)) - goto out_freeinq; + if (qeth_alloc_buffer_pool(card)){ + kfree(card->qdio.in_q); + return -ENOMEM; + } /* outbound */ card->qdio.out_qs = kmalloc(card->qdio.no_out_queues * sizeof(struct qeth_qdio_out_q *), GFP_KERNEL); - if (!card->qdio.out_qs) - goto out_freepool; - for (i = 0; i < card->qdio.no_out_queues; ++i) { + if (!card->qdio.out_qs){ + qeth_free_buffer_pool(card); + return -ENOMEM; + } + 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]) - goto out_freeoutq; + if (!card->qdio.out_qs[i]){ + while (i > 0) + kfree(card->qdio.out_qs[--i]); + kfree(card->qdio.out_qs); + return -ENOMEM; + } 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)); @@ -3218,25 +3233,11 @@ 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 @@ -3245,8 +3246,7 @@ qeth_free_qdio_buffers(struct qeth_card *card) int i, j; QETH_DBF_TEXT(trace, 2, "freeqdbf"); - if (atomic_swap(&card->qdio.state, QETH_QDIO_UNINITIALIZED) == - QETH_QDIO_UNINITIALIZED) + if (card->qdio.state == QETH_QDIO_UNINITIALIZED) return; kfree(card->qdio.in_q); /* inbound buffer pool */ @@ -3259,6 +3259,7 @@ 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 @@ -3280,7 +3281,7 @@ static void qeth_init_qdio_info(struct qeth_card *card) { QETH_DBF_TEXT(setup, 4, "intqdinf"); - atomic_set(&card->qdio.state, QETH_QDIO_UNINITIALIZED); + 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; @@ -3343,15 +3344,17 @@ 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 = 0; + int rc; QETH_DBF_TEXT(setup, 2, "qdioest"); - qib_param_field = kzalloc(QDIO_MAX_BUFFERS_PER_Q * sizeof(char), + qib_param_field = kmalloc(QDIO_MAX_BUFFERS_PER_Q * sizeof(char), GFP_KERNEL); if (!qib_param_field) return -ENOMEM; + memset(qib_param_field, 0, QDIO_MAX_BUFFERS_PER_Q * sizeof(char)); + qeth_create_qib_param_field(card, qib_param_field); qeth_create_qib_param_field_blkt(card, qib_param_field); @@ -3402,10 +3405,8 @@ 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 (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); + if (!(rc = qdio_initialize(&init_data))) + card->qdio.state = QETH_QDIO_ESTABLISHED; kfree(out_sbal_ptrs); kfree(in_sbal_ptrs); @@ -3480,7 +3481,7 @@ qeth_halt_channels(struct qeth_card *card) rc3 = qeth_halt_channel(&card->data); if (rc1) return rc1; - if (rc2) + if (rc2) return rc2; return rc3; } @@ -3495,7 +3496,7 @@ qeth_clear_channels(struct qeth_card *card) rc3 = qeth_clear_channel(&card->data); if (rc1) return rc1; - if (rc2) + if (rc2) return rc2; return rc3; } @@ -3521,20 +3522,13 @@ qeth_qdio_clear_card(struct qeth_card *card, int use_halt) int rc = 0; QETH_DBF_TEXT(trace,3,"qdioclr"); - switch (atomic_cmpxchg(&card->qdio.state, QETH_QDIO_ESTABLISHED, - QETH_QDIO_CLEANING)) { - case QETH_QDIO_ESTABLISHED: + if (card->qdio.state == 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); - atomic_set(&card->qdio.state, QETH_QDIO_ALLOCATED); - break; - case QETH_QDIO_CLEANING: - return rc; - default: - break; + card->qdio.state = QETH_QDIO_ALLOCATED; } if ((rc = qeth_clear_halt_card(card, use_halt))) QETH_DBF_TEXT_(trace, 3, "2err%d", rc); @@ -3694,10 +3688,10 @@ qeth_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) /* return OK; otherwise ksoftirqd goes to 100% */ return NETDEV_TX_OK; } - if (card->options.performance_stats) { - card->perf_stats.outbound_cnt++; - card->perf_stats.outbound_start_time = qeth_get_micros(); - } +#ifdef CONFIG_QETH_PERF_STATS + card->perf_stats.outbound_cnt++; + card->perf_stats.outbound_start_time = qeth_get_micros(); +#endif netif_stop_queue(dev); if ((rc = qeth_send_packet(card, skb))) { if (rc == -EBUSY) { @@ -3711,9 +3705,10 @@ qeth_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) } } netif_wake_queue(dev); - if (card->options.performance_stats) - card->perf_stats.outbound_time += qeth_get_micros() - - card->perf_stats.outbound_start_time; +#ifdef CONFIG_QETH_PERF_STATS + card->perf_stats.outbound_time += qeth_get_micros() - + card->perf_stats.outbound_start_time; +#endif return rc; } @@ -3808,10 +3803,10 @@ qeth_open(struct net_device *dev) QETH_DBF_TEXT(trace,4,"nomacadr"); return -EPERM; } - card->data.state = CH_STATE_UP; - card->state = CARD_STATE_UP; card->dev->flags |= IFF_UP; netif_start_queue(dev); + card->data.state = CH_STATE_UP; + card->state = CARD_STATE_UP; if (!card->lan_online && netif_carrier_ok(dev)) netif_carrier_off(dev); @@ -3827,7 +3822,7 @@ qeth_stop(struct net_device *dev) card = (struct qeth_card *) dev->priv; - netif_tx_disable(dev); + netif_stop_queue(dev); card->dev->flags &= ~IFF_UP; if (card->state == CARD_STATE_UP) card->state = CARD_STATE_SOFTSETUP; @@ -3870,7 +3865,6 @@ qeth_get_cast_type(struct qeth_card *card, struct sk_buff *skb) if ((hdr_mac == QETH_TR_MAC_NC) || (hdr_mac == QETH_TR_MAC_C)) return RTN_MULTICAST; - break; /* eth or so multicast? */ default: if ((hdr_mac == QETH_ETH_MAC_V4) || @@ -3928,59 +3922,49 @@ qeth_get_ip_version(struct sk_buff *skb) } } -static inline struct qeth_hdr * -__qeth_prepare_skb(struct qeth_card *card, struct sk_buff *skb, int ipv) +static inline int +qeth_prepare_skb(struct qeth_card *card, struct sk_buff **skb, + struct qeth_hdr **hdr, int ipv) { + int rc = 0; #ifdef CONFIG_QETH_VLAN u16 *tag; - if (card->vlangrp && vlan_tx_tag_present(skb) && +#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) && ((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 - 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; + *hdr = (struct qeth_hdr *) + qeth_push_skb(card, skb, sizeof(struct qeth_hdr)); + if (hdr == NULL) + return -EINVAL; + return 0; } static inline u8 @@ -4118,7 +4102,7 @@ qeth_fill_header(struct qeth_card *card, struct qeth_hdr *hdr, } } else { /* passthrough */ if((skb->dev->type == ARPHRD_IEEE802_TR) && - !memcmp(skb->data + sizeof(struct qeth_hdr) + + !memcmp(skb->data + sizeof(struct qeth_hdr) + sizeof(__u16), skb->dev->broadcast, 6)) { hdr->hdr.l3.flags = QETH_CAST_BROADCAST | QETH_HDR_PASSTHRU; @@ -4222,8 +4206,9 @@ qeth_fill_buffer(struct qeth_qdio_out_q *queue, flush_cnt = 1; } else { QETH_DBF_TEXT(trace, 6, "fillbfpa"); - if (queue->card->options.performance_stats) - queue->card->perf_stats.skbs_sent_pack++; +#ifdef CONFIG_QETH_PERF_STATS + queue->card->perf_stats.skbs_sent_pack++; +#endif if (buf->next_element_to_fill >= QETH_MAX_BUFFER_ELEMENTS(queue->card)) { /* @@ -4260,15 +4245,21 @@ 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) - goto out; + if (atomic_read(&buffer->state) != QETH_QDIO_BUF_EMPTY) { + card->stats.tx_dropped++; + atomic_set(&queue->state, QETH_OUT_Q_UNLOCKED); + return -EBUSY; + } 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) - goto out; + if (buffers_needed < 0) { + card->stats.tx_dropped++; + atomic_set(&queue->state, QETH_OUT_Q_UNLOCKED); + return -EBUSY; + } queue->next_buf_to_fill = (queue->next_buf_to_fill + buffers_needed) % QDIO_MAX_BUFFERS_PER_Q; @@ -4283,9 +4274,6 @@ 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 @@ -4311,7 +4299,8 @@ 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) { + if (atomic_read(&buffer->state) != QETH_QDIO_BUF_EMPTY){ + card->stats.tx_dropped++; atomic_set(&queue->state, QETH_OUT_Q_UNLOCKED); return -EBUSY; } @@ -4334,6 +4323,7 @@ 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; @@ -4344,6 +4334,7 @@ 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; } @@ -4355,6 +4346,7 @@ 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; } @@ -4388,33 +4380,35 @@ out: qeth_flush_buffers(queue, 0, start_index, flush_count); } /* at this point the queue is UNLOCKED again */ - if (queue->card->options.performance_stats && do_pack) +#ifdef CONFIG_QETH_PERF_STATS + if (do_pack) queue->card->perf_stats.bufs_sent_pack += flush_count; +#endif /* CONFIG_QETH_PERF_STATS */ return rc; } static inline int -qeth_get_elements_no(struct qeth_card *card, void *hdr, +qeth_get_elements_no(struct qeth_card *card, void *hdr, struct sk_buff *skb, int elems) { 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("Invalid size of IP packet " - "(Number=%d / Length=%d). Discarded.\n", + PRINT_ERR("qeth_do_send_packet: 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) { @@ -4425,113 +4419,108 @@ qeth_send_packet(struct qeth_card *card, struct sk_buff *skb) int elements_needed = 0; enum qeth_large_send_types large_send = QETH_LARGE_SEND_NO; 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) { - new_skb = qeth_pskb_unshare(skb, GFP_ATOMIC); - if (!new_skb) - return -ENOMEM; + if ((skb = qeth_pskb_unshare(skb,GFP_ATOMIC)) == NULL) { + card->stats.tx_dropped++; + dev_kfree_skb_irq(skb); + return 0; + } if(card->dev->type == ARPHRD_IEEE802_TR){ - skb_pull(new_skb, QETH_FAKE_LL_LEN_TR); + skb_pull(skb, QETH_FAKE_LL_LEN_TR); } else { - skb_pull(new_skb, QETH_FAKE_LL_LEN_ETH); + skb_pull(skb, QETH_FAKE_LL_LEN_ETH); } } } - if (skb_is_gso(skb)) + 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_shinfo(skb)->tso_size) large_send = card->options.large_send; - /* 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 ? */ + + /*are we able to do TSO ? If so ,prepare and send it from here */ if ((large_send == QETH_LARGE_SEND_TSO) && (cast_type == RTN_UNSPEC)) { - rc = qeth_tso_prepare_packet(card, new_skb, ipv, cast_type); + rc = qeth_tso_prepare_packet(card, skb, ipv, cast_type); if (rc) { - __qeth_free_new_skb(skb, new_skb); - return rc; - } + card->stats.tx_dropped++; + card->stats.tx_errors++; + dev_kfree_skb_any(skb); + return NETDEV_TX_OK; + } elements_needed++; - } 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; + } else { + if ((rc = qeth_prepare_skb(card, &skb, &hdr, ipv))) { + QETH_DBF_TEXT_(trace, 4, "pskbe%d", rc); + return rc; } - 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 (card->info.type != QETH_CARD_TYPE_OSN) + qeth_fill_header(card, hdr, skb, ipv, cast_type); } + if (large_send == QETH_LARGE_SEND_EDDP) { - ctx = qeth_eddp_create_context(card, new_skb, hdr); + ctx = qeth_eddp_create_context(card, 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, new_skb, + int elems = qeth_get_elements_no(card,(void*) hdr, skb, elements_needed); - if (!elems) { - __qeth_free_new_skb(skb, new_skb); + if (!elems) return -EINVAL; - } elements_needed += elems; } if (card->info.type != QETH_CARD_TYPE_IQD) - rc = qeth_do_send_packet(card, queue, new_skb, hdr, + rc = qeth_do_send_packet(card, queue, skb, hdr, elements_needed, ctx); else - rc = qeth_do_send_packet_fast(card, queue, new_skb, hdr, + rc = qeth_do_send_packet_fast(card, queue, skb, hdr, elements_needed, ctx); - if (!rc) { + if (!rc){ card->stats.tx_packets++; - card->stats.tx_bytes += tx_bytes; - 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; - } + card->stats.tx_bytes += skb->len; +#ifdef CONFIG_QETH_PERF_STATS + if (skb_shinfo(skb)->tso_size && + !(large_send == QETH_LARGE_SEND_NO)) { + card->perf_stats.large_send_bytes += skb->len; + card->perf_stats.large_send_cnt++; } - } else { - card->stats.tx_dropped++; - __qeth_free_new_skb(skb, new_skb); + if (skb_shinfo(skb)->nr_frags > 0){ + card->perf_stats.sg_skbs_sent++; + /* nr_frags + skb->data */ + card->perf_stats.sg_frags_sent += + skb_shinfo(skb)->nr_frags + 1; + } +#endif /* CONFIG_QETH_PERF_STATS */ } if (ctx != NULL) { /* drop creator's reference */ qeth_eddp_put_context(ctx); /* free skb; it's not referenced by a buffer */ - if (!rc) - dev_kfree_skb_any(new_skb); + if (rc == 0) + dev_kfree_skb_any(skb); + } return rc; } @@ -4596,11 +4585,38 @@ qeth_mdio_read(struct net_device *dev, int phy_id, int regnum) case MII_NCONFIG: /* network interface config */ break; default: + rc = 0; break; } return rc; } +static void +qeth_mdio_write(struct net_device *dev, int phy_id, int regnum, int value) +{ + switch(regnum){ + case MII_BMCR: /* Basic mode control register */ + case MII_BMSR: /* Basic mode status register */ + case MII_PHYSID1: /* PHYS ID 1 */ + case MII_PHYSID2: /* PHYS ID 2 */ + case MII_ADVERTISE: /* Advertisement control reg */ + case MII_LPA: /* Link partner ability reg */ + case MII_EXPANSION: /* Expansion register */ + case MII_DCOUNTER: /* disconnect counter */ + case MII_FCSCOUNTER: /* false carrier counter */ + case MII_NWAYTEST: /* N-way auto-neg test register */ + case MII_RERRCOUNTER: /* rx error counter */ + case MII_SREVISION: /* silicon revision */ + case MII_RESV1: /* reserved 1 */ + case MII_LBRERROR: /* loopback, rx, bypass error */ + case MII_PHYADDR: /* physical address */ + case MII_RESV2: /* reserved 2 */ + case MII_TPISTATUS: /* TPI status for 10mbps */ + case MII_NCONFIG: /* network interface config */ + default: + break; + } +} static inline const char * qeth_arp_get_error_cause(int *rc) @@ -4810,7 +4826,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 __user *udata) +qeth_arp_query(struct qeth_card *card, char *udata) { struct qeth_cmd_buffer *iob; struct qeth_arp_query_info qinfo = {0, }; @@ -4828,8 +4844,9 @@ qeth_arp_query(struct qeth_card *card, char __user *udata) /* get size of userspace buffer and mask_bits -> 6 bytes */ if (copy_from_user(&qinfo, udata, 6)) return -EFAULT; - if (!(qinfo.udata = kzalloc(qinfo.udata_len, GFP_KERNEL))) + if (!(qinfo.udata = kmalloc(qinfo.udata_len, GFP_KERNEL))) return -ENOMEM; + memset(qinfo.udata, 0, qinfo.udata_len); qinfo.udata_offset = QETH_QARP_ENTRIES_OFFSET; iob = qeth_get_setassparms_cmd(card, IPA_ARP_PROCESSING, IPA_CMD_ASS_ARP_QUERY_INFO, @@ -4943,7 +4960,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 __user *udata) +qeth_snmp_command(struct qeth_card *card, char *udata) { struct qeth_cmd_buffer *iob; struct qeth_ipa_cmd *cmd; @@ -4977,10 +4994,11 @@ qeth_snmp_command(struct qeth_card *card, char __user *udata) return -EFAULT; } qinfo.udata_len = ureq->hdr.data_len; - if (!(qinfo.udata = kzalloc(qinfo.udata_len, GFP_KERNEL))){ + if (!(qinfo.udata = kmalloc(qinfo.udata_len, GFP_KERNEL))){ kfree(ureq); return -ENOMEM; } + memset(qinfo.udata, 0, qinfo.udata_len); qinfo.udata_offset = sizeof(struct qeth_snmp_ureq_hdr); iob = qeth_get_adapter_cmd(card, IPA_SETADP_SET_SNMP_CONTROL, @@ -5218,6 +5236,21 @@ qeth_do_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) mii_data->val_out = qeth_mdio_read(dev,mii_data->phy_id, mii_data->reg_num); break; + case SIOCSMIIREG: + rc = -EOPNOTSUPP; + break; + /* TODO: remove return if qeth_mdio_write does something */ + if (!capable(CAP_NET_ADMIN)){ + rc = -EPERM; + break; + } + mii_data = if_mii(rq); + if (mii_data->phy_id != 0) + rc = -EINVAL; + else + qeth_mdio_write(dev, mii_data->phy_id, mii_data->reg_num, + mii_data->val_in); + break; default: rc = -EOPNOTSUPP; } @@ -5285,7 +5318,6 @@ 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) && @@ -5388,7 +5420,7 @@ qeth_layer2_send_setdelvlan_cb(struct qeth_card *card, cmd = (struct qeth_ipa_cmd *) data; if (cmd->hdr.return_code) { PRINT_ERR("Error in processing VLAN %i on %s: 0x%x. " - "Continuing\n",cmd->data.setdelvlan.vlan_id, + "Continuing\n",cmd->data.setdelvlan.vlan_id, QETH_CARD_IFNAME(card), cmd->hdr.return_code); QETH_DBF_TEXT_(trace, 2, "L2VL%4x", cmd->hdr.command); QETH_DBF_TEXT_(trace, 2, "L2%s", CARD_BUS_ID(card)); @@ -5408,7 +5440,7 @@ qeth_layer2_send_setdelvlan(struct qeth_card *card, __u16 i, iob = qeth_get_ipacmd_buffer(card, ipacmd, QETH_PROT_IPV4); cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); cmd->data.setdelvlan.vlan_id = i; - return qeth_send_ipa_cmd(card, iob, + return qeth_send_ipa_cmd(card, iob, qeth_layer2_send_setdelvlan_cb, NULL); } @@ -5472,7 +5504,7 @@ qeth_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid) * Examine hardware response to SET_PROMISC_MODE */ static int -qeth_setadp_promisc_mode_cb(struct qeth_card *card, +qeth_setadp_promisc_mode_cb(struct qeth_card *card, struct qeth_reply *reply, unsigned long data) { @@ -5483,10 +5515,10 @@ qeth_setadp_promisc_mode_cb(struct qeth_card *card, cmd = (struct qeth_ipa_cmd *) data; setparms = &(cmd->data.setadapterparms); - + qeth_default_setadapterparms_cb(card, reply, (unsigned long)cmd); - if (cmd->hdr.return_code) { - QETH_DBF_TEXT_(trace,4,"prmrc%2.2x",cmd->hdr.return_code); + if (cmd->hdr.return_code) { + QETH_DBF_TEXT_(trace,4,"prmrc%2.2x",cmd->hdr.return_code); setparms->data.mode = SET_PROMISC_MODE_OFF; } card->info.promisc_mode = setparms->data.mode; @@ -5532,7 +5564,7 @@ qeth_set_multicast_list(struct net_device *dev) if (card->info.type == QETH_CARD_TYPE_OSN) return ; - + QETH_DBF_TEXT(trace, 3, "setmulti"); qeth_delete_mc_addresses(card); if (card->options.layer2) { @@ -5572,11 +5604,12 @@ qeth_get_addr_buffer(enum qeth_prot_versions prot) { struct qeth_ipaddr *addr; - addr = kzalloc(sizeof(struct qeth_ipaddr), GFP_ATOMIC); + addr = kmalloc(sizeof(struct qeth_ipaddr), GFP_ATOMIC); if (addr == NULL) { PRINT_WARN("Not enough memory to add address\n"); return NULL; } + memset(addr,0,sizeof(struct qeth_ipaddr)); addr->type = QETH_IP_TYPE_NORMAL; addr->proto = prot; return addr; @@ -5590,7 +5623,7 @@ qeth_osn_assist(struct net_device *dev, struct qeth_cmd_buffer *iob; struct qeth_card *card; int rc; - + QETH_DBF_TEXT(trace, 2, "osnsdmc"); if (!dev) return -ENODEV; @@ -5669,7 +5702,7 @@ qeth_osn_deregister(struct net_device * dev) card->osn_info.data_cb = NULL; return; } - + static void qeth_delete_mc_addresses(struct qeth_card *card) { @@ -5833,7 +5866,7 @@ qeth_add_multicast_ipv6(struct qeth_card *card) struct inet6_dev *in6_dev; QETH_DBF_TEXT(trace,4,"chkmcv6"); - if (!qeth_is_supported(card, IPA_IPV6)) + if (!qeth_is_supported(card, IPA_IPV6)) return ; in6_dev = in6_dev_get(card->dev); if (in6_dev == NULL) @@ -6374,9 +6407,12 @@ qeth_netdev_init(struct net_device *dev) dev->vlan_rx_kill_vid = qeth_vlan_rx_kill_vid; dev->vlan_rx_add_vid = qeth_vlan_rx_add_vid; #endif + dev->hard_header = card->orig_hard_header; if (qeth_get_netdev_flags(card) & IFF_NOARP) { dev->rebuild_header = NULL; dev->hard_header = NULL; + if (card->options.fake_ll) + dev->hard_header = qeth_fake_header; dev->header_cache_update = NULL; dev->hard_header_cache = NULL; } @@ -6385,9 +6421,6 @@ qeth_netdev_init(struct net_device *dev) if (!(card->info.unique_id & UNIQUE_ID_NOT_BY_CARD)) card->dev->dev_id = card->info.unique_id & 0xffff; #endif - if (card->options.fake_ll && - (qeth_get_netdev_flags(card) & IFF_NOARP)) - dev->hard_header = qeth_fake_header; dev->hard_header_parse = NULL; dev->set_mac_address = qeth_layer2_set_mac_address; dev->flags |= qeth_get_netdev_flags(card); @@ -6492,9 +6525,6 @@ retry: /*network device will be recovered*/ if (card->dev) { card->dev->hard_header = card->orig_hard_header; - if (card->options.fake_ll && - (qeth_get_netdev_flags(card) & IFF_NOARP)) - card->dev->hard_header = qeth_fake_header; return 0; } /* at first set_online allocate netdev */ @@ -6602,7 +6632,7 @@ qeth_setadpparms_change_macaddr_cb(struct qeth_card *card, cmd = (struct qeth_ipa_cmd *) data; if (!card->options.layer2 || card->info.guestlan || - !(card->info.mac_bits & QETH_LAYER2_MAC_READ)) { + !(card->info.mac_bits & QETH_LAYER2_MAC_READ)) { memcpy(card->dev->dev_addr, &cmd->data.setadapterparms.data.change_addr.addr, OSA_ADDR_LEN); @@ -6870,7 +6900,7 @@ qeth_send_setassparms(struct qeth_card *card, struct qeth_cmd_buffer *iob, cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); if (len <= sizeof(__u32)) cmd->data.setassparms.data.flags_32bit = (__u32) data; - else /* (len > sizeof(__u32)) */ + else if (len > sizeof(__u32)) memcpy(&cmd->data.setassparms.data, (void *) data, len); rc = qeth_send_ipa_cmd(card, iob, reply_cb, reply_param); @@ -7049,12 +7079,14 @@ qeth_softsetup_ipv6(struct qeth_card *card) QETH_DBF_TEXT(trace,3,"softipv6"); + netif_stop_queue(card->dev); rc = qeth_send_startlan(card, QETH_PROT_IPV6); if (rc) { PRINT_ERR("IPv6 startlan failed on %s\n", QETH_CARD_IFNAME(card)); return rc; } + netif_wake_queue(card->dev); rc = qeth_query_ipassists(card,QETH_PROT_IPV6); if (rc) { PRINT_ERR("IPv6 query ipassist failed on %s\n", @@ -7344,11 +7376,14 @@ 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); + if ((card->options.route6.type == NO_ROUTER) || + ((card->info.type == QETH_CARD_TYPE_OSAE) && + (card->options.route6.type == MULTICAST_ROUTER) && + !qeth_is_supported6(card,IPA_OSA_MC_ROUTER))) + return 0; rc = qeth_send_setrouting(card, card->options.route6.type, QETH_PROT_IPV6); if (rc) { @@ -7370,8 +7405,7 @@ qeth_set_large_send(struct qeth_card *card, enum qeth_large_send_types type) card->options.large_send = type; return 0; } - if (card->state == CARD_STATE_UP) - netif_tx_disable(card->dev); + netif_stop_queue(card->dev); card->options.large_send = type; switch (card->options.large_send) { case QETH_LARGE_SEND_EDDP: @@ -7393,8 +7427,7 @@ qeth_set_large_send(struct qeth_card *card, enum qeth_large_send_types type) card->dev->features &= ~(NETIF_F_TSO | NETIF_F_SG); break; } - if (card->state == CARD_STATE_UP) - netif_wake_queue(card->dev); + netif_wake_queue(card->dev); return rc; } @@ -7447,7 +7480,7 @@ qeth_softsetup_card(struct qeth_card *card) if ((rc = qeth_setrouting_v6(card))) QETH_DBF_TEXT_(setup, 2, "5err%d", rc); out: - netif_tx_disable(card->dev); + netif_stop_queue(card->dev); return 0; } @@ -7587,7 +7620,7 @@ qeth_stop_card(struct qeth_card *card, int recovery_mode) if (card->read.state == CH_STATE_UP && card->write.state == CH_STATE_UP && (card->state == CARD_STATE_UP)) { - if (recovery_mode && + if (recovery_mode && card->info.type != QETH_CARD_TYPE_OSN) { qeth_stop(card->dev); } else { @@ -7756,8 +7789,10 @@ static int qeth_register_netdev(struct qeth_card *card) { QETH_DBF_TEXT(setup, 3, "regnetd"); - if (card->dev->reg_state != NETREG_UNINITIALIZED) + if (card->dev->reg_state != NETREG_UNINITIALIZED) { + qeth_netdev_init(card->dev); return 0; + } /* sysfs magic */ SET_NETDEV_DEV(card->dev, &card->gdev->dev); return register_netdev(card->dev); @@ -7768,7 +7803,7 @@ qeth_start_again(struct qeth_card *card, int recovery_mode) { QETH_DBF_TEXT(setup ,2, "startag"); - if (recovery_mode && + if (recovery_mode && card->info.type != QETH_CARD_TYPE_OSN) { qeth_open(card->dev); } else { @@ -7884,12 +7919,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); @@ -7917,9 +7952,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); @@ -8032,6 +8067,7 @@ static int (*qeth_old_arp_constructor) (struct neighbour *); static struct neigh_ops arp_direct_ops_template = { .family = AF_INET, + .destructor = NULL, .solicit = NULL, .error_report = NULL, .output = dev_queue_xmit, @@ -8388,7 +8424,7 @@ out: static struct notifier_block qeth_ip_notifier = { qeth_ip_event, - NULL, + 0 }; #ifdef CONFIG_QETH_IPV6 @@ -8441,7 +8477,7 @@ out: static struct notifier_block qeth_ip6_notifier = { qeth_ip6_event, - NULL, + 0 }; #endif @@ -8459,17 +8495,16 @@ __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; - ret = driver_for_each_device(&qeth_ccwgroup_driver.driver, NULL, NULL, - __qeth_reboot_event_card); - return ret ? NOTIFY_BAD : NOTIFY_DONE; + driver_for_each_device(&qeth_ccwgroup_driver.driver, NULL, NULL, + __qeth_reboot_event_card); + return NOTIFY_DONE; } static struct notifier_block qeth_reboot_notifier = { qeth_reboot_event, - NULL, + 0 }; static int @@ -8518,9 +8553,9 @@ static int qeth_ipv6_init(void) { qeth_old_arp_constructor = arp_tbl.constructor; - write_lock_bh(&arp_tbl.lock); + write_lock(&arp_tbl.lock); arp_tbl.constructor = qeth_arp_constructor; - write_unlock_bh(&arp_tbl.lock); + write_unlock(&arp_tbl.lock); arp_direct_ops = (struct neigh_ops*) kmalloc(sizeof(struct neigh_ops), GFP_KERNEL); @@ -8536,9 +8571,9 @@ qeth_ipv6_init(void) static void qeth_ipv6_uninit(void) { - write_lock_bh(&arp_tbl.lock); + write_lock(&arp_tbl.lock); arp_tbl.constructor = qeth_old_arp_constructor; - write_unlock_bh(&arp_tbl.lock); + write_unlock(&arp_tbl.lock); kfree(arp_direct_ops); } #endif /* CONFIG_QETH_IPV6 */ @@ -8546,44 +8581,34 @@ 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; + int rc=0; rc = ccwgroup_driver_register(&qeth_ccwgroup_driver); if (rc) - goto out; - + return rc; rc = ccw_driver_register(&qeth_ccw_driver); if (rc) - goto out_ccw_driver; - + return rc; rc = qeth_create_driver_attributes(); if (rc) - goto out_qeth_attr; - + return rc; qeth_root_dev = s390_root_dev_register("qeth"); - 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; + if (IS_ERR(qeth_root_dev)) { + rc = PTR_ERR(qeth_root_dev); + return rc; + } + return 0; } /*** @@ -8592,7 +8617,7 @@ out: static int __init qeth_init(void) { - int rc; + int rc=0; PRINT_INFO("loading %s\n", version); @@ -8601,26 +8626,20 @@ qeth_init(void) spin_lock_init(&qeth_notify_lock); rwlock_init(&qeth_card_list.rwlock); - rc = qeth_register_dbf_views(); - if (rc) + if (qeth_register_dbf_views()) goto out_err; - - rc = qeth_sysfs_register(); - if (rc) - goto out_dbf; + if (qeth_sysfs_register()) + goto out_sysfs; #ifdef CONFIG_QETH_IPV6 - rc = qeth_ipv6_init(); - if (rc) { - PRINT_ERR("Out of memory during ipv6 init code = %d\n", rc); + if (qeth_ipv6_init()) { + PRINT_ERR("Out of memory during ipv6 init.\n"); goto out_sysfs; } #endif /* QETH_IPV6 */ - rc = qeth_register_notifiers(); - if (rc) + if (qeth_register_notifiers()) goto out_ipv6; - rc = qeth_create_procfs_entries(); - if (rc) + if (qeth_create_procfs_entries()) goto out_notifiers; return rc; @@ -8630,13 +8649,12 @@ out_notifiers: out_ipv6: #ifdef CONFIG_QETH_IPV6 qeth_ipv6_uninit(); -out_sysfs: #endif /* QETH_IPV6 */ +out_sysfs: qeth_sysfs_unregister(); -out_dbf: qeth_unregister_dbf_views(); out_err: - PRINT_ERR("Initialization failed with code %d\n", rc); + PRINT_ERR("Initialization failed"); return rc; } diff --git a/drivers/s390/net/qeth_mpc.h b/drivers/s390/net/qeth_mpc.h index 0477c4747..011c41041 100644 --- a/drivers/s390/net/qeth_mpc.h +++ b/drivers/s390/net/qeth_mpc.h @@ -445,7 +445,7 @@ enum qeth_ipa_arp_return_codes { /* Helper functions */ #define IS_IPA_REPLY(cmd) ((cmd->hdr.initiator == IPA_CMD_INITIATOR_HOST) || \ (cmd->hdr.initiator == IPA_CMD_INITIATOR_OSA_REPLY)) - + /*****************************************************************************/ /* END OF IP Assist related definitions */ /*****************************************************************************/ @@ -490,7 +490,7 @@ extern unsigned char ULP_ENABLE[]; /* Layer 2 defintions */ #define QETH_PROT_LAYER2 0x08 #define QETH_PROT_TCPIP 0x03 -#define QETH_PROT_OSN2 0x0a +#define QETH_PROT_OSN2 0x0a #define QETH_ULP_ENABLE_PROT_TYPE(buffer) (buffer+0x50) #define QETH_IPA_CMD_PROT_TYPE(buffer) (buffer+0x19) diff --git a/drivers/s390/net/qeth_proc.c b/drivers/s390/net/qeth_proc.c index faa768e59..3c6339df8 100644 --- a/drivers/s390/net/qeth_proc.c +++ b/drivers/s390/net/qeth_proc.c @@ -36,7 +36,7 @@ qeth_procfile_seq_start(struct seq_file *s, loff_t *offset) { struct device *dev = NULL; loff_t nr = 0; - + down_read(&qeth_ccwgroup_driver.driver.bus->subsys.rwsem); if (*offset == 0) return SEQ_START_TOKEN; @@ -60,8 +60,8 @@ static void * qeth_procfile_seq_next(struct seq_file *s, void *it, loff_t *offset) { struct device *prev, *next; - - if (it == SEQ_START_TOKEN) + + if (it == SEQ_START_TOKEN) prev = NULL; else prev = (struct device *) it; @@ -74,7 +74,7 @@ qeth_procfile_seq_next(struct seq_file *s, void *it, loff_t *offset) static inline const char * qeth_get_router_str(struct qeth_card *card, int ipv) { - enum qeth_routing_types routing_type = NO_ROUTER; + int routing_type = 0; if (ipv == 4) { routing_type = card->options.route4.type; @@ -86,26 +86,26 @@ qeth_get_router_str(struct qeth_card *card, int ipv) #endif /* CONFIG_QETH_IPV6 */ } - switch (routing_type){ - case PRIMARY_ROUTER: + if (routing_type == PRIMARY_ROUTER) return "pri"; - case SECONDARY_ROUTER: + else if (routing_type == SECONDARY_ROUTER) return "sec"; - case MULTICAST_ROUTER: + else if (routing_type == MULTICAST_ROUTER) { if (card->info.broadcast_capable == QETH_BROADCAST_WITHOUT_ECHO) return "mc+"; return "mc"; - case PRIMARY_CONNECTOR: + } else if (routing_type == PRIMARY_CONNECTOR) { if (card->info.broadcast_capable == QETH_BROADCAST_WITHOUT_ECHO) return "p+c"; return "p.c"; - case SECONDARY_CONNECTOR: + } else if (routing_type == SECONDARY_CONNECTOR) { if (card->info.broadcast_capable == QETH_BROADCAST_WITHOUT_ECHO) return "s+c"; return "s.c"; - default: /* NO_ROUTER */ + } else if (routing_type == NO_ROUTER) return "no"; - } + else + return "unk"; } static int @@ -173,13 +173,14 @@ 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) { struct device *device; struct qeth_card *card; - + if (it == SEQ_START_TOKEN) return 0; @@ -191,34 +192,27 @@ 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.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 received : %li/%i\n" + " Skb's/buffers sent : %li/%i\n\n", + card->stats.rx_packets, card->perf_stats.bufs_rec, + card->stats.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.initial_tx_packets - - card->perf_stats.skbs_sent_pack, + seq_printf(s, " Skb's/buffers sent without packing : %li/%i\n" + " Skb's/buffers sent with packing : %i/%i\n\n", + card->stats.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 ); - seq_printf(s, " Skbs sent in SG mode : %u\n" - " Skb fragments sent in SG mode : %u\n\n", + seq_printf(s, " Skbs sent in SG mode : %i\n" + " Skb fragments sent in SG mode : %i\n\n", card->perf_stats.sg_skbs_sent, card->perf_stats.sg_frags_sent); - seq_printf(s, " large_send tx (in Kbytes) : %u\n" - " large_send count : %u\n\n", + seq_printf(s, " large_send tx (in Kbytes) : %i\n" + " large_send count : %i\n\n", card->perf_stats.large_send_bytes >> 10, card->perf_stats.large_send_cnt); - seq_printf(s, " Packing state changes no pkg.->packing : %u/%u\n" + seq_printf(s, " Packing state changes no pkg.->packing : %i/%i\n" " Watermarks L/H : %i/%i\n" " Current buffer usage (outbound q's) : " "%i/%i/%i/%i\n\n", @@ -235,16 +229,16 @@ qeth_perf_procfile_seq_show(struct seq_file *s, void *it) atomic_read(&card->qdio.out_qs[3]->used_buffers) : 0 ); - seq_printf(s, " Inbound handler time (in us) : %u\n" - " Inbound handler count : %u\n" - " Inbound do_QDIO time (in us) : %u\n" - " Inbound do_QDIO count : %u\n\n" - " Outbound handler time (in us) : %u\n" - " Outbound handler count : %u\n\n" - " Outbound time (in us, incl QDIO) : %u\n" - " Outbound count : %u\n" - " Outbound do_QDIO time (in us) : %u\n" - " Outbound do_QDIO count : %u\n\n", + seq_printf(s, " Inbound handler time (in us) : %i\n" + " Inbound handler count : %i\n" + " Inbound do_QDIO time (in us) : %i\n" + " Inbound do_QDIO count : %i\n\n" + " Outbound handler time (in us) : %i\n" + " Outbound handler count : %i\n\n" + " Outbound time (in us, incl QDIO) : %i\n" + " Outbound count : %i\n" + " Outbound do_QDIO time (in us) : %i\n" + " Outbound do_QDIO count : %i\n\n", card->perf_stats.inbound_time, card->perf_stats.inbound_cnt, card->perf_stats.inbound_do_qdio_time, @@ -281,6 +275,11 @@ 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) { @@ -289,13 +288,15 @@ 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) + qeth_perf_procfile_created) return 0; else return -ENOMEM; diff --git a/drivers/s390/net/qeth_sys.c b/drivers/s390/net/qeth_sys.c index 5836737ac..c1831f572 100644 --- a/drivers/s390/net/qeth_sys.c +++ b/drivers/s390/net/qeth_sys.c @@ -115,7 +115,7 @@ qeth_dev_portno_store(struct device *dev, struct device_attribute *attr, const c return -EPERM; portno = simple_strtoul(buf, &tmp, 16); - if (portno > MAX_PORTNO){ + if ((portno < 0) || (portno > MAX_PORTNO)){ PRINT_WARN("portno 0x%X is out of range\n", portno); return -EINVAL; } @@ -742,47 +742,6 @@ 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) { @@ -826,7 +785,7 @@ qeth_dev_large_send_store(struct device *dev, struct device_attribute *attr, con } if (card->options.large_send == type) return count; - if ((rc = qeth_set_large_send(card, type))) + if ((rc = qeth_set_large_send(card, type))) return rc; return count; } @@ -969,7 +928,6 @@ static struct device_attribute * qeth_device_attrs[] = { &dev_attr_canonical_macaddr, &dev_attr_layer2, &dev_attr_large_send, - &dev_attr_performance_stats, NULL, }; @@ -1152,12 +1110,12 @@ qeth_parse_ipatoe(const char* buf, enum qeth_prot_versions proto, { const char *start, *end; char *tmp; - char buffer[40] = {0, }; + char buffer[49] = {0, }; start = buf; /* get address string */ end = strchr(start, '/'); - if (!end || (end - start >= 40)){ + if (!end || (end-start >= 49)){ PRINT_WARN("Invalid format for ipato_addx/delx. " "Use /\n"); return -EINVAL; @@ -1169,12 +1127,7 @@ 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; } @@ -1192,10 +1145,11 @@ qeth_dev_ipato_add_store(const char *buf, size_t count, if ((rc = qeth_parse_ipatoe(buf, proto, addr, &mask_bits))) return rc; - if (!(ipatoe = kzalloc(sizeof(struct qeth_ipato_entry), GFP_KERNEL))){ + if (!(ipatoe = kmalloc(sizeof(struct qeth_ipato_entry), GFP_KERNEL))){ PRINT_WARN("No memory to allocate ipato entry\n"); return -ENOMEM; } + memset(ipatoe, 0, sizeof(struct qeth_ipato_entry)); ipatoe->proto = proto; memcpy(ipatoe->addr, addr, (proto == QETH_PROT_IPV4)? 4:16); ipatoe->mask_bits = mask_bits; @@ -1729,7 +1683,7 @@ qeth_create_device_attributes(struct device *dev) if (card->info.type == QETH_CARD_TYPE_OSN) return sysfs_create_group(&dev->kobj, &qeth_osn_device_attr_group); - + if ((ret = sysfs_create_group(&dev->kobj, &qeth_device_attr_group))) return ret; if ((ret = sysfs_create_group(&dev->kobj, &qeth_device_ipato_group))){ @@ -1745,16 +1699,11 @@ 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))){ - 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); + if ((ret = sysfs_create_group(&dev->kobj, &qeth_device_blkt_group))) return ret; - } - return 0; + + return ret; } void @@ -1765,7 +1714,7 @@ qeth_remove_device_attributes(struct device *dev) if (card->info.type == QETH_CARD_TYPE_OSN) return sysfs_remove_group(&dev->kobj, &qeth_osn_device_attr_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); @@ -1807,7 +1756,7 @@ qeth_driver_group_store(struct device_driver *ddrv, const char *buf, } -static DRIVER_ATTR(group, 0200, NULL, qeth_driver_group_store); +static DRIVER_ATTR(group, 0200, 0, qeth_driver_group_store); static ssize_t qeth_driver_notifier_register_store(struct device_driver *ddrv, const char *buf, @@ -1835,7 +1784,7 @@ qeth_driver_notifier_register_store(struct device_driver *ddrv, const char *buf, return count; } -static DRIVER_ATTR(notifier_register, 0200, NULL, +static DRIVER_ATTR(notifier_register, 0200, 0, qeth_driver_notifier_register_store); int diff --git a/drivers/s390/net/qeth_tso.h b/drivers/s390/net/qeth_tso.h index 14504afb0..1286ddea4 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)); } /** @@ -51,7 +51,7 @@ qeth_tso_fill_header(struct qeth_card *card, struct sk_buff *skb) hdr->ext.hdr_version = 1; hdr->ext.hdr_len = 28; /*insert non-fix values */ - hdr->ext.mss = skb_shinfo(skb)->gso_size; + hdr->ext.mss = skb_shinfo(skb)->tso_size; hdr->ext.dg_hdr_len = (__u16)(iph->ihl*4 + tcph->doff*4); hdr->ext.payload_len = (__u16)(skb->len - hdr->ext.dg_hdr_len - sizeof(struct qeth_hdr_tso)); @@ -117,11 +117,11 @@ __qeth_fill_buffer_frag(struct sk_buff *skb, struct qdio_buffer *buffer, int fragno; unsigned long addr; int element, cnt, dlen; - + fragno = skb_shinfo(skb)->nr_frags; element = *next_element_to_fill; dlen = 0; - + if (is_tso) buffer->element[element].flags = SBAL_FLAGS_MIDDLE_FRAG; diff --git a/drivers/s390/net/smsgiucv.c b/drivers/s390/net/smsgiucv.c index b8179c27c..72118ee68 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, NULL, NULL, NULL); + msg, len, 0, 0, 0); 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 = NULL; + cb = 0; 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, NULL); + iucv_sever(smsg_pathid, 0); 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, NULL); + pgmmask, &smsg_ops, 0); 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, NULL, "*MSG ", NULL, 0, - NULL, NULL, smsg_handle, NULL); + rc = iucv_connect (&smsg_pathid, 255, 0, "*MSG ", 0, 0, 0, 0, + smsg_handle, 0); if (rc) { printk(KERN_ERR "SMSGIUCV: failed to connect to *MSG"); iucv_unregister_program(smsg_handle); driver_unregister(&smsg_driver); - smsg_handle = NULL; + smsg_handle = 0; return -EIO; } cpcmd("SET SMSG IUCV", NULL, 0, NULL); diff --git a/drivers/s390/s390_rdev.c b/drivers/s390/s390_rdev.c index 3c7145d9f..e3f647169 100644 --- a/drivers/s390/s390_rdev.c +++ b/drivers/s390/s390_rdev.c @@ -27,9 +27,10 @@ s390_root_dev_register(const char *name) if (!strlen(name)) return ERR_PTR(-EINVAL); - dev = kzalloc(sizeof(struct device), GFP_KERNEL); + dev = kmalloc(sizeof(struct device), GFP_KERNEL); if (!dev) return ERR_PTR(-ENOMEM); + memset(dev, 0, sizeof(struct device)); strncpy(dev->bus_id, name, min(strlen(name), (size_t)BUS_ID_SIZE)); dev->release = s390_root_dev_release; ret = device_register(dev); diff --git a/drivers/s390/s390mach.c b/drivers/s390/s390mach.c index 5399c5d99..3bf466603 100644 --- a/drivers/s390/s390mach.c +++ b/drivers/s390/s390mach.c @@ -8,12 +8,11 @@ * Martin Schwidefsky (schwidefsky@de.ibm.com) */ +#include #include #include #include #include -#include -#include #include @@ -56,6 +55,8 @@ 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; @@ -111,16 +112,6 @@ 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); @@ -371,25 +362,16 @@ s390_revalidate_registers(struct mci *mci) return kill_task; } -#define MAX_IPD_COUNT 29 -#define MAX_IPD_TIME (5 * 60 * USEC_PER_SEC) /* 5 minutes */ - /* * machine check handler. */ void s390_do_machine_check(struct pt_regs *regs) { - static DEFINE_SPINLOCK(ipd_lock); - static unsigned long long last_ipd; - static int ipd_count; - unsigned long long tmp; struct mci *mci; 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); @@ -422,27 +404,11 @@ s390_do_machine_check(struct pt_regs *regs) s390_handle_damage("processing backup machine " "check with damage."); } - - /* - * Nullifying exigent condition, therefore we might - * retry this instruction. - */ - - spin_lock(&ipd_lock); - - tmp = get_clock(); - - if (((tmp - last_ipd) >> 12) < MAX_IPD_TIME) - ipd_count++; - else - ipd_count = 1; - - last_ipd = tmp; - - if (ipd_count == MAX_IPD_COUNT) - s390_handle_damage("too many ipd retries."); - - spin_unlock(&ipd_lock); + if (!umode) + s390_handle_damage("processing backup machine " + "check in kernel mode."); + mcck->kill_task = 1; + mcck->mcck_code = *(unsigned long long *) mci; } else { /* Processing damage -> stopping machine */ @@ -494,7 +460,6 @@ s390_do_machine_check(struct pt_regs *regs) mcck->warning = 1; set_thread_flag(TIF_MCCK_PENDING); } - lockdep_on(); } /* @@ -527,7 +492,7 @@ arch_initcall(machine_check_init); static int __init machine_check_crw_init (void) { - kthread_run(s390_collect_crw_info, &m_sem, "kmcheck"); + kernel_thread(s390_collect_crw_info, &m_sem, CLONE_FS|CLONE_FILES); 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 adc9d8f2c..95b92f317 100644 --- a/drivers/s390/scsi/zfcp_aux.c +++ b/drivers/s390/scsi/zfcp_aux.c @@ -1,8 +1,18 @@ /* - * This file is part of the zfcp device driver for - * FCP adapters for IBM System z9 and zSeries. * - * (C) Copyright IBM Corp. 2002, 2006 + * 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 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -19,20 +29,6 @@ * 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) */ @@ -79,9 +75,15 @@ static struct miscdevice zfcp_cfdc_misc = { /* declare driver module init/cleanup functions */ module_init(zfcp_module_init); -MODULE_AUTHOR("IBM Deutschland Entwicklung GmbH - linux390@de.ibm.com"); +MODULE_AUTHOR("Heiko Carstens , " + "Andreas Herrman , " + "Martin Peschke , " + "Raimund Schroeder , " + "Wolfgang Taphorn , " + "Aron Zeh , " + "IBM Deutschland Entwicklung GmbH"); MODULE_DESCRIPTION - ("FCP (SCSI over Fibre Channel) HBA driver for IBM System z9 and zSeries"); + ("FCP (SCSI over Fibre Channel) HBA driver for IBM eServer zSeries"); MODULE_LICENSE("GPL"); module_param(device, charp, 0400); @@ -112,105 +114,6 @@ _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 *************************/ /****************************************************************/ @@ -388,11 +291,12 @@ zfcp_cfdc_dev_ioctl(struct file *file, unsigned int command, goto out; } - sg_list = kzalloc(sizeof(struct zfcp_sg_list), GFP_KERNEL); + sg_list = kmalloc(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); @@ -574,13 +478,14 @@ 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 = kcalloc(sg_list->count, sizeof(struct scatterlist), + sg_list->sg = kmalloc(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); @@ -839,7 +744,7 @@ struct zfcp_unit * zfcp_unit_enqueue(struct zfcp_port *port, fcp_lun_t fcp_lun) { struct zfcp_unit *unit, *tmp_unit; - unsigned int scsi_lun; + scsi_lun_t scsi_lun; int found; /* @@ -853,9 +758,10 @@ zfcp_unit_enqueue(struct zfcp_port *port, fcp_lun_t fcp_lun) if (unit) return NULL; - unit = kzalloc(sizeof (struct zfcp_unit), GFP_KERNEL); + unit = kmalloc(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); @@ -923,6 +829,18 @@ zfcp_unit_dequeue(struct zfcp_unit *unit) device_unregister(&unit->sysfs_device); } +static void * +zfcp_mempool_alloc(gfp_t gfp_mask, void *size) +{ + return kmalloc((size_t) size, gfp_mask); +} + +static void +zfcp_mempool_free(void *element, void *size) +{ + kfree(element); +} + /* * Allocates a combined QTCB/fsf_req buffer for erp actions and fcp/SCSI * commands. @@ -935,39 +853,51 @@ static int zfcp_allocate_low_mem_buffers(struct zfcp_adapter *adapter) { adapter->pool.fsf_req_erp = - mempool_create_kmalloc_pool(ZFCP_POOL_FSF_REQ_ERP_NR, - sizeof(struct zfcp_fsf_req_pool_element)); - if (!adapter->pool.fsf_req_erp) + mempool_create(ZFCP_POOL_FSF_REQ_ERP_NR, + zfcp_mempool_alloc, zfcp_mempool_free, (void *) + sizeof(struct zfcp_fsf_req_pool_element)); + + if (NULL == adapter->pool.fsf_req_erp) return -ENOMEM; adapter->pool.fsf_req_scsi = - mempool_create_kmalloc_pool(ZFCP_POOL_FSF_REQ_SCSI_NR, - sizeof(struct zfcp_fsf_req_pool_element)); - if (!adapter->pool.fsf_req_scsi) + mempool_create(ZFCP_POOL_FSF_REQ_SCSI_NR, + zfcp_mempool_alloc, zfcp_mempool_free, (void *) + sizeof(struct zfcp_fsf_req_pool_element)); + + if (NULL == adapter->pool.fsf_req_scsi) return -ENOMEM; adapter->pool.fsf_req_abort = - mempool_create_kmalloc_pool(ZFCP_POOL_FSF_REQ_ABORT_NR, - sizeof(struct zfcp_fsf_req_pool_element)); - if (!adapter->pool.fsf_req_abort) + mempool_create(ZFCP_POOL_FSF_REQ_ABORT_NR, + zfcp_mempool_alloc, zfcp_mempool_free, (void *) + sizeof(struct zfcp_fsf_req_pool_element)); + + if (NULL == adapter->pool.fsf_req_abort) return -ENOMEM; adapter->pool.fsf_req_status_read = - mempool_create_kmalloc_pool(ZFCP_POOL_STATUS_READ_NR, - sizeof(struct zfcp_fsf_req)); - if (!adapter->pool.fsf_req_status_read) + mempool_create(ZFCP_POOL_STATUS_READ_NR, + zfcp_mempool_alloc, zfcp_mempool_free, + (void *) sizeof(struct zfcp_fsf_req)); + + if (NULL == adapter->pool.fsf_req_status_read) return -ENOMEM; adapter->pool.data_status_read = - mempool_create_kmalloc_pool(ZFCP_POOL_STATUS_READ_NR, - sizeof(struct fsf_status_read_buffer)); - if (!adapter->pool.data_status_read) + mempool_create(ZFCP_POOL_STATUS_READ_NR, + zfcp_mempool_alloc, zfcp_mempool_free, + (void *) sizeof(struct fsf_status_read_buffer)); + + if (NULL == adapter->pool.data_status_read) return -ENOMEM; adapter->pool.data_gid_pn = - mempool_create_kmalloc_pool(ZFCP_POOL_DATA_GID_PN_NR, - sizeof(struct zfcp_gid_pn_data)); - if (!adapter->pool.data_gid_pn) + mempool_create(ZFCP_POOL_DATA_GID_PN_NR, + zfcp_mempool_alloc, zfcp_mempool_free, (void *) + sizeof(struct zfcp_gid_pn_data)); + + if (NULL == adapter->pool.data_gid_pn) return -ENOMEM; return 0; @@ -1023,12 +953,13 @@ zfcp_adapter_enqueue(struct ccw_device *ccw_device) */ /* try to allocate new adapter data structure (zeroed) */ - adapter = kzalloc(sizeof (struct zfcp_adapter), GFP_KERNEL); + adapter = kmalloc(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; @@ -1060,12 +991,8 @@ zfcp_adapter_enqueue(struct ccw_device *ccw_device) INIT_LIST_HEAD(&adapter->port_remove_lh); /* initialize list of fsf requests */ - 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; - } + spin_lock_init(&adapter->fsf_req_list_lock); + INIT_LIST_HEAD(&adapter->fsf_req_list_head); /* initialize debug locks */ @@ -1094,6 +1021,12 @@ 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); @@ -1144,6 +1077,8 @@ 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) @@ -1155,14 +1090,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->req_list_lock, flags); - retval = zfcp_reqlist_isempty(adapter); - spin_unlock_irqrestore(&adapter->req_list_lock, flags); - if (!retval) { + 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) { ZFCP_LOG_NORMAL("bug: adapter %s (%p) still in use, " "%i requests outstanding\n", zfcp_get_busid_by_adapter(adapter), adapter, - atomic_read(&adapter->reqs_active)); + atomic_read(&adapter->fsf_reqs_active)); retval = -EBUSY; goto out; } @@ -1188,7 +1123,6 @@ 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"); @@ -1229,9 +1163,10 @@ zfcp_port_enqueue(struct zfcp_adapter *adapter, wwn_t wwpn, u32 status, return NULL; } - port = kzalloc(sizeof (struct zfcp_port), GFP_KERNEL); + port = kmalloc(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); @@ -1443,19 +1378,18 @@ static void zfcp_fsf_incoming_els_plogi(struct zfcp_adapter *adapter, struct fsf_status_read_buffer *status_buffer) { - struct fsf_plogi *els_plogi; + logi *els_logi = (logi *) status_buffer->payload; 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_plogi->serv_param.wwpn)) + if (port->wwpn == (*(wwn_t *) & els_logi->nport_wwn)) break; } read_unlock_irqrestore(&zfcp_data.config_lock, flags); - if (!port || (port->wwpn != (*(wwn_t *) &els_plogi->serv_param.wwpn))) { + if (!port || (port->wwpn != (*(wwn_t *) & els_logi->nport_wwn))) { ZFCP_LOG_DEBUG("ignored incoming PLOGI for nonexisting port " "with d_id 0x%08x on adapter %s\n", status_buffer->d_id, @@ -1850,25 +1784,4 @@ 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 fdabadeaa..241136d0c 100644 --- a/drivers/s390/scsi/zfcp_ccw.c +++ b/drivers/s390/scsi/zfcp_ccw.c @@ -1,8 +1,16 @@ /* - * This file is part of the zfcp device driver for - * FCP adapters for IBM System z9 and zSeries. + * linux/drivers/s390/scsi/zfcp_ccw.c * - * (C) Copyright IBM Corp. 2002, 2006 + * FCP adapter driver for IBM eServer zSeries + * + * CCW driver related routines + * + * (C) Copyright IBM Corp. 2003, 2004 + * + * Authors: + * Martin Peschke + * Heiko Carstens + * Andreas Herrmann * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -164,11 +172,6 @@ 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 c033145d0..a5f2ba9a8 100644 --- a/drivers/s390/scsi/zfcp_dbf.c +++ b/drivers/s390/scsi/zfcp_dbf.c @@ -1,8 +1,12 @@ /* - * This file is part of the zfcp device driver for - * FCP adapters for IBM System z9 and zSeries. * - * (C) Copyright IBM Corp. 2002, 2006 + * linux/drivers/s390/scsi/zfcp_dbf.c + * + * FCP adapter driver for IBM eServer zSeries + * + * Debugging facilities + * + * (C) Copyright IBM Corp. 2005 * * This 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 94d1b74db..6eba56cd8 100644 --- a/drivers/s390/scsi/zfcp_def.h +++ b/drivers/s390/scsi/zfcp_def.h @@ -1,8 +1,19 @@ /* - * This file is part of the zfcp device driver for - * FCP adapters for IBM System z9 and zSeries. + * + * linux/drivers/s390/scsi/zfcp_def.h + * + * FCP adapter driver for IBM eServer zSeries + * + * (C) Copyright IBM Corp. 2002, 2004 * - * (C) Copyright IBM Corp. 2002, 2006 + * Author(s): Martin Peschke + * Raimund Schroeder + * Aron Zeh + * Wolfgang Taphorn + * Stefan Bader + * Heiko Carstens + * Andreas Herrmann + * Volker Sameske * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -39,6 +50,7 @@ #include #include #include +#include "../../fc4/fc.h" #include "zfcp_fsf.h" #include #include @@ -52,7 +64,7 @@ /********************* GENERAL DEFINES *********************************/ /* zfcp version number, it consists of major, minor, and patch-level number */ -#define ZFCP_VERSION "4.8.0" +#define ZFCP_VERSION "4.5.0" /** * zfcp_sg_to_address - determine kernel address from struct scatterlist @@ -77,10 +89,14 @@ zfcp_address_to_sg(void *address, struct scatterlist *list) list->offset = ((unsigned long) address) & (PAGE_SIZE - 1); } -#define REQUEST_LIST_SIZE 128 - /********************* SCSI SPECIFIC DEFINES *********************************/ -#define ZFCP_SCSI_ER_TIMEOUT (10*HZ) + +/* 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) /********************* CIO/QDIO SPECIFIC DEFINES *****************************/ @@ -217,9 +233,8 @@ struct fcp_rsp_iu { #define RSP_CODE_TASKMAN_FAILED 5 /* see fc-fs */ -#define LS_RSCN 0x61040000 -#define LS_LOGO 0x05000000 -#define LS_PLOGI 0x03000000 +#define LS_FAN 0x60000000 +#define LS_RSCN 0x61040000 struct fcp_rscn_head { u8 command; @@ -248,6 +263,13 @@ 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; @@ -485,6 +507,9 @@ 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 @@ -583,6 +608,7 @@ do { \ * and unit */ #define ZFCP_COMMON_FLAGS 0xfff00000 +#define ZFCP_SPECIFIC_FLAGS 0x000fffff /* common status bits */ #define ZFCP_STATUS_COMMON_REMOVE 0x80000000 @@ -607,6 +633,11 @@ 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 @@ -621,6 +652,7 @@ 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 \ @@ -876,21 +908,24 @@ 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 */ - 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 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 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 @@ -959,8 +994,6 @@ 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. @@ -975,7 +1008,7 @@ struct zfcp_unit { refcount drop to zero */ struct zfcp_port *port; /* remote port of unit */ atomic_t status; /* status of this logical unit */ - unsigned int scsi_lun; /* own SCSI LUN */ + scsi_lun_t 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 */ @@ -986,7 +1019,6 @@ 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 */ @@ -1020,6 +1052,11 @@ 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 @@ -1058,6 +1095,9 @@ 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 @@ -1065,6 +1105,9 @@ 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 7f60b6fdf..57cb628a0 100644 --- a/drivers/s390/scsi/zfcp_erp.c +++ b/drivers/s390/scsi/zfcp_erp.c @@ -1,8 +1,18 @@ /* - * This file is part of the zfcp device driver for - * FCP adapters for IBM System z9 and zSeries. - * - * (C) Copyright IBM Corp. 2002, 2006 + * + * 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 program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -64,8 +74,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 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_close_qdio(struct zfcp_erp_action *); +static int 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 *); @@ -93,9 +103,10 @@ 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 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_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 int zfcp_erp_action_enqueue(int, struct zfcp_adapter *, struct zfcp_port *, struct zfcp_unit *); @@ -134,39 +145,29 @@ zfcp_fsf_request_timeout_handler(unsigned long data) zfcp_erp_adapter_reopen(adapter, 0); } -/** - * 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. +/* + * 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 */ -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"); - - 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); + + return; } /* @@ -176,7 +177,7 @@ void zfcp_fsf_scsi_er_timeout_handler(unsigned long data) * initiates adapter recovery which is done * asynchronously * - * returns: 0 - initiated action successfully + * returns: 0 - initiated action succesfully * <0 - failed to initiate action */ int @@ -212,7 +213,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 successfully + * returns: 0 - initiated action succesfully * <0 - failed to initiate action */ int @@ -230,6 +231,13 @@ 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) { @@ -243,6 +251,13 @@ 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) { @@ -256,6 +271,13 @@ 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) { @@ -284,17 +306,20 @@ zfcp_erp_adisc(struct zfcp_port *port) int retval = 0; struct timer_list *timer; - send_els = kzalloc(sizeof(struct zfcp_send_els), GFP_ATOMIC); + send_els = kmalloc(sizeof(struct zfcp_send_els), GFP_ATOMIC); if (send_els == NULL) goto nomem; + memset(send_els, 0, sizeof(*send_els)); - send_els->req = kzalloc(sizeof(struct scatterlist), GFP_ATOMIC); + send_els->req = kmalloc(sizeof(struct scatterlist), GFP_ATOMIC); if (send_els->req == NULL) goto nomem; + memset(send_els->req, 0, sizeof(*send_els->req)); - send_els->resp = kzalloc(sizeof(struct scatterlist), GFP_ATOMIC); + send_els->resp = kmalloc(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) @@ -478,7 +503,7 @@ zfcp_test_link(struct zfcp_port *port) * initiates Forced Reopen recovery which is done * asynchronously * - * returns: 0 - initiated action successfully + * returns: 0 - initiated action succesfully * <0 - failed to initiate action */ static int @@ -518,7 +543,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 successfully + * returns: 0 - initiated action succesfully * <0 - failed to initiate action */ int @@ -545,7 +570,7 @@ zfcp_erp_port_forced_reopen(struct zfcp_port *port, int clear_mask) * initiates Reopen recovery which is done * asynchronously * - * returns: 0 - initiated action successfully + * returns: 0 - initiated action succesfully * <0 - failed to initiate action */ static int @@ -614,7 +639,7 @@ zfcp_erp_port_reopen(struct zfcp_port *port, int clear_mask) * initiates Reopen recovery which is done * asynchronously * - * returns: 0 - initiated action successfully + * returns: 0 - initiated action succesfully * <0 - failed to initiate action */ static int @@ -679,10 +704,17 @@ zfcp_erp_unit_reopen(struct zfcp_unit *unit, int clear_mask) return retval; } -/** - * zfcp_erp_adapter_block - mark adapter as blocked, block scsi requests +/* + * function: + * + * purpose: disable I/O, + * return any open requests and clean them up, + * aim: no pending and incoming I/O + * + * returns: */ -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, @@ -690,10 +722,15 @@ static void zfcp_erp_adapter_block(struct zfcp_adapter *adapter, int clear_mask) clear_mask, ZFCP_CLEAR); } -/** - * zfcp_erp_adapter_unblock - mark adapter as unblocked, allow scsi requests +/* + * function: + * + * purpose: enable I/O + * + * returns: */ -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); @@ -775,6 +812,13 @@ 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) { @@ -845,16 +889,18 @@ 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 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)) { + /* 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)) { /* 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/dismissed erp_action */ + /* dismiss fsf_req of timed out or dismissed erp_action */ if (erp_action->status & (ZFCP_STATUS_ERP_DISMISSED | ZFCP_STATUS_ERP_TIMEDOUT)) { debug_text_event(adapter->erp_dbf, 3, @@ -887,22 +933,30 @@ zfcp_erp_strategy_check_fsfreq(struct zfcp_erp_action *erp_action) */ erp_action->fsf_req = NULL; } - spin_unlock(&adapter->req_list_lock); + spin_unlock(&adapter->fsf_req_list_lock); } else debug_text_event(adapter->erp_dbf, 3, "a_ca_noreq"); return retval; } -/** - * zfcp_erp_async_handler_nolock - complete erp_action +/* + * 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 * - * Used for normal completion, time-out, dismissal and failure after - * low memory condition. + * returns: 0 - there was an action to handle + * !0 - otherwise */ -static void zfcp_erp_async_handler_nolock(struct zfcp_erp_action *erp_action, - unsigned long set_mask) +static int +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) { @@ -913,26 +967,43 @@ static void 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; } -/** - * zfcp_erp_async_handler - wrapper for erp_async_handler_nolock w/ locking +/* + * 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 */ -void zfcp_erp_async_handler(struct zfcp_erp_action *erp_action, - unsigned long set_mask) +int +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); - zfcp_erp_async_handler_nolock(erp_action, set_mask); + retval = zfcp_erp_async_handler_nolock(erp_action, set_mask); write_unlock_irqrestore(&adapter->erp_lock, flags); + + return retval; } /* @@ -969,15 +1040,17 @@ zfcp_erp_timeout_handler(unsigned long data) zfcp_erp_async_handler(erp_action, ZFCP_STATUS_ERP_TIMEDOUT); } -/** - * zfcp_erp_action_dismiss - dismiss an erp_action +/* + * 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 * - * adapter->erp_lock must be held - * - * Dismissal of an erp_action is usually required if an erp_action of - * higher priority is generated. + * locks: erp_lock held (thus we need to call another handler variant) */ -static void zfcp_erp_action_dismiss(struct zfcp_erp_action *erp_action) +static int +zfcp_erp_action_dismiss(struct zfcp_erp_action *erp_action) { struct zfcp_adapter *adapter = erp_action->adapter; @@ -985,6 +1058,8 @@ static void 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 @@ -1281,6 +1356,13 @@ 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) { @@ -1456,6 +1538,13 @@ 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, @@ -1497,6 +1586,13 @@ 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) { @@ -1509,6 +1605,13 @@ 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) { @@ -1539,6 +1642,13 @@ 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) { @@ -1568,6 +1678,13 @@ 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) { @@ -1647,6 +1764,13 @@ zfcp_erp_strategy_followup_actions(int action, return 0; } +/* + * function: + * + * purpose: + * + * returns: + */ static int zfcp_erp_strategy_check_queues(struct zfcp_adapter *adapter) { @@ -1685,6 +1809,12 @@ 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) @@ -1771,7 +1901,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 successfully + * returns: 0 - initiated action succesfully * <0 - failed to initiate action */ int @@ -1789,6 +1919,13 @@ 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) { @@ -2040,12 +2177,18 @@ zfcp_erp_adapter_strategy_open_qdio(struct zfcp_erp_action *erp_action) return retval; } -/** - * zfcp_erp_adapter_strategy_close_qdio - close qdio queues for an adapter +/* + * function: zfcp_qdio_cleanup + * + * purpose: cleans up QDIO operation for the specified adapter + * + * returns: 0 - successful cleanup + * !0 - failed cleanup */ -static void +int 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; @@ -2054,13 +2197,15 @@ 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)); - return; + retval = ZFCP_ERP_FAILED; + goto out; } /* * 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); @@ -2092,6 +2237,8 @@ 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 @@ -2124,9 +2271,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_irq(&adapter->erp_lock); + write_lock(&adapter->erp_lock); zfcp_erp_action_to_running(erp_action); - write_unlock_irq(&adapter->erp_lock); + write_unlock(&adapter->erp_lock); zfcp_erp_timeout_init(erp_action); if (zfcp_fsf_exchange_config_data(erp_action)) { retval = ZFCP_ERP_FAILED; @@ -2192,9 +2339,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_irq(&adapter->erp_lock); + write_lock(&adapter->erp_lock); zfcp_erp_action_to_running(erp_action); - write_unlock_irq(&adapter->erp_lock); + write_unlock(&adapter->erp_lock); zfcp_erp_timeout_init(erp_action); ret = zfcp_fsf_exchange_port_data(erp_action, adapter, NULL); @@ -2214,15 +2361,22 @@ 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; } - - /* 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 " + if (!atomic_test_mask(ZFCP_STATUS_ADAPTER_XPORT_OK, &adapter->status)) { + ZFCP_LOG_INFO("error: 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) @@ -2248,12 +2402,18 @@ zfcp_erp_adapter_strategy_open_fsf_statusread(struct zfcp_erp_action return retval; } -/** - * zfcp_erp_adapter_strategy_close_fsf - stop FSF operations for an adapter +/* + * 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 */ -static void +static int zfcp_erp_adapter_strategy_close_fsf(struct zfcp_erp_action *erp_action) { + int retval = ZFCP_ERP_SUCCEEDED; struct zfcp_adapter *adapter = erp_action->adapter; /* @@ -2267,6 +2427,8 @@ 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; } /* @@ -2383,6 +2545,13 @@ 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) { @@ -2397,6 +2566,15 @@ 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) { @@ -2512,6 +2690,13 @@ 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) { @@ -2628,6 +2813,13 @@ 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) { @@ -2830,6 +3022,13 @@ 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) { @@ -2930,6 +3129,13 @@ 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) { @@ -3125,6 +3331,13 @@ zfcp_erp_action_enqueue(int action, return retval; } +/* + * function: + * + * purpose: + * + * returns: + */ static int zfcp_erp_action_dequeue(struct zfcp_erp_action *erp_action) { @@ -3189,13 +3402,9 @@ 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; @@ -3209,30 +3418,12 @@ 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: @@ -3241,8 +3432,17 @@ zfcp_erp_action_cleanup(int action, struct zfcp_adapter *adapter, } -void zfcp_erp_action_dismiss_adapter(struct zfcp_adapter *adapter) +/* + * function: + * + * purpose: + * + * returns: FIXME + */ +static int +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"); @@ -3251,10 +3451,21 @@ void 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; } -static void zfcp_erp_action_dismiss_port(struct zfcp_port *port) +/* + * function: + * + * purpose: + * + * returns: FIXME + */ +static int +zfcp_erp_action_dismiss_port(struct zfcp_port *port) { + int retval = 0; struct zfcp_unit *unit; struct zfcp_adapter *adapter = port->adapter; @@ -3265,18 +3476,38 @@ static void 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; } -static void zfcp_erp_action_dismiss_unit(struct zfcp_unit *unit) +/* + * function: + * + * purpose: + * + * returns: FIXME + */ +static int +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) { @@ -3287,6 +3518,13 @@ 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) { @@ -3297,6 +3535,11 @@ 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) { @@ -3313,6 +3556,11 @@ 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) { @@ -3326,6 +3574,11 @@ 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) { @@ -3342,6 +3595,11 @@ 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) { @@ -3355,6 +3613,11 @@ 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) { @@ -3365,7 +3628,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, zfcp_get_busid_by_adapter(adapter), 8); + debug_event(adapter->erp_dbf, 3, &adapter->name, 8); read_lock_irqsave(&zfcp_data.config_lock, flags); if (adapter->nameserver_port) @@ -3376,6 +3639,11 @@ 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) { @@ -3404,6 +3672,11 @@ 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 146d7a2b4..700f5402a 100644 --- a/drivers/s390/scsi/zfcp_ext.h +++ b/drivers/s390/scsi/zfcp_ext.h @@ -1,8 +1,18 @@ /* - * This file is part of the zfcp device driver for - * FCP adapters for IBM System z9 and zSeries. + * + * linux/drivers/s390/scsi/zfcp_ext.h + * + * FCP adapter driver for IBM eServer zSeries + * + * (C) Copyright IBM Corp. 2002, 2004 * - * (C) Copyright IBM Corp. 2002, 2006 + * Author(s): Martin Peschke + * Raimund Schroeder + * Aron Zeh + * Wolfgang Taphorn + * Stefan Bader + * Heiko Carstens + * Andreas Herrmann * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -63,6 +73,7 @@ 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); @@ -114,7 +125,6 @@ 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 *); @@ -131,6 +141,8 @@ 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; @@ -139,7 +151,6 @@ 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); @@ -156,7 +167,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 void zfcp_erp_async_handler(struct zfcp_erp_action *, unsigned long); +extern int zfcp_erp_async_handler(struct zfcp_erp_action *, unsigned long); extern int zfcp_test_link(struct zfcp_port *); @@ -190,10 +201,5 @@ 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 ff2eacf5e..662ec571d 100644 --- a/drivers/s390/scsi/zfcp_fsf.c +++ b/drivers/s390/scsi/zfcp_fsf.c @@ -1,8 +1,19 @@ /* - * This file is part of the zfcp device driver for - * FCP adapters for IBM System z9 and zSeries. * - * (C) Copyright IBM Corp. 2002, 2006 + * 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 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -49,6 +60,7 @@ 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[] = { @@ -145,50 +157,49 @@ zfcp_fsf_req_free(struct zfcp_fsf_req *fsf_req) kfree(fsf_req); } -/** - * zfcp_fsf_req_dismiss - dismiss a single fsf request +/* + * function: + * + * purpose: + * + * returns: + * + * note: qdio queues shall be down (no ongoing inbound processing) */ -static void zfcp_fsf_req_dismiss(struct zfcp_adapter *adapter, - struct zfcp_fsf_req *fsf_req, - unsigned int counter) +int +zfcp_fsf_req_dismiss_all(struct zfcp_adapter *adapter) { - u64 dbg_tmp[2]; + struct zfcp_fsf_req *fsf_req, *tmp; + unsigned long flags; + LIST_HEAD(remove_queue); - 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); -} + 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); -/** - * zfcp_fsf_req_dismiss_all - dismiss all remaining fsf requests - */ -int zfcp_fsf_req_dismiss_all(struct zfcp_adapter *adapter) -{ - 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++; - } + list_for_each_entry_safe(fsf_req, tmp, &remove_queue, list) { + list_del(&fsf_req->list); + zfcp_fsf_req_dismiss(fsf_req); } - spin_unlock_irqrestore(&adapter->req_list_lock, flags); return 0; } +/* + * function: + * + * purpose: + * + * returns: + */ +static void +zfcp_fsf_req_dismiss(struct zfcp_fsf_req *fsf_req) +{ + fsf_req->status |= ZFCP_STATUS_FSFREQ_DISMISSED; + zfcp_fsf_req_complete(fsf_req); +} + /* * function: zfcp_fsf_req_complete * @@ -866,7 +877,6 @@ 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); @@ -893,37 +903,10 @@ zfcp_fsf_status_read_handler(struct zfcp_fsf_req *fsf_req) break; case FSF_STATUS_READ_BIT_ERROR_THRESHOLD: - 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); + 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)); break; case FSF_STATUS_READ_LINK_DOWN: @@ -1444,8 +1427,7 @@ 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 = - ZFCP_FC_SERVICE_CLASS_DEFAULT; + fsf_req->qtcb->bottom.support.service_class = adapter->fc_service_class; fsf_req->qtcb->bottom.support.timeout = ct->timeout; fsf_req->data = (unsigned long) ct; @@ -1514,10 +1496,18 @@ zfcp_fsf_send_ct_handler(struct zfcp_fsf_req *fsf_req) break; case FSF_SERVICE_CLASS_NOT_SUPPORTED: - ZFCP_LOG_INFO("error: adapter %s does not support fc " - "class %d.\n", - zfcp_get_busid_by_port(port), - ZFCP_FC_SERVICE_CLASS_DEFAULT); + 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); + } /* stop operation for this adapter */ debug_text_exception(adapter->erp_dbf, 0, "fsf_s_class_nsup"); zfcp_erp_adapter_shutdown(adapter, 0); @@ -1740,8 +1730,7 @@ 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 = - ZFCP_FC_SERVICE_CLASS_DEFAULT; + fsf_req->qtcb->bottom.support.service_class = adapter->fc_service_class; fsf_req->qtcb->bottom.support.timeout = ZFCP_ELS_TIMEOUT; fsf_req->data = (unsigned long) els; @@ -1811,10 +1800,18 @@ static int zfcp_fsf_send_els_handler(struct zfcp_fsf_req *fsf_req) break; case FSF_SERVICE_CLASS_NOT_SUPPORTED: - ZFCP_LOG_INFO("error: adapter %s does not support fc " - "class %d.\n", - zfcp_get_busid_by_adapter(adapter), - ZFCP_FC_SERVICE_CLASS_DEFAULT); + 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); + } /* stop operation for this adapter */ debug_text_exception(adapter->erp_dbf, 0, "fsf_s_class_nsup"); zfcp_erp_adapter_shutdown(adapter, 0); @@ -1943,6 +1940,14 @@ 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) { @@ -2227,7 +2232,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, - NULL, &lock_flags, &fsf_req); + 0, &lock_flags, &fsf_req); if (retval < 0) { ZFCP_LOG_INFO("error: Out of resources. Could not create an " "exchange port data request for" @@ -2560,7 +2565,8 @@ 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 < - sizeof (struct fsf_plogi)) { + ((((unsigned long) &plogi->serv_param.wwpn) - + ((unsigned long) plogi)) + sizeof (u64))) { ZFCP_LOG_INFO( "warning: insufficient length of " "PLOGI payload (%i)\n", @@ -2579,10 +2585,8 @@ 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; @@ -2989,8 +2993,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; @@ -3565,7 +3569,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 = ZFCP_FC_SERVICE_CLASS_DEFAULT; + fsf_req->qtcb->bottom.io.service_class = adapter->fc_service_class; /* set FCP_LUN in FCP_CMND IU in QTCB */ fcp_cmnd_iu->fcp_lun = unit->fcp_lun; @@ -3663,6 +3667,18 @@ 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, @@ -3704,7 +3720,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 = ZFCP_FC_SERVICE_CLASS_DEFAULT; + fsf_req->qtcb->bottom.io.service_class = adapter->fc_service_class; fsf_req->qtcb->bottom.io.fcp_cmnd_length = sizeof (struct fcp_cmnd_iu) + sizeof (fcp_dl_t); @@ -3827,10 +3843,18 @@ zfcp_fsf_send_fcp_command_handler(struct zfcp_fsf_req *fsf_req) break; case FSF_SERVICE_CLASS_NOT_SUPPORTED: - ZFCP_LOG_INFO("error: adapter %s does not support fc " - "class %d.\n", - zfcp_get_busid_by_unit(unit), - ZFCP_FC_SERVICE_CLASS_DEFAULT); + 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); + } /* stop operation for this adapter */ debug_text_exception(fsf_req->adapter->erp_dbf, 0, "fsf_s_class_nsup"); @@ -4592,14 +4616,12 @@ 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 = fsf_req->req_id; + 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.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 = fsf_req->req_id; + fsf_req->qtcb->header.req_handle = (unsigned long)fsf_req; fsf_req->qtcb->header.fsf_command = fsf_req->fsf_command; } } @@ -4656,7 +4678,6 @@ 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; @@ -4671,12 +4692,6 @@ 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); @@ -4716,7 +4731,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 = (void *) fsf_req->req_id; + sbale[0].addr = fsf_req; sbale[0].flags |= SBAL_FLAGS0_COMMAND; if (likely(fsf_req->qtcb != NULL)) { sbale[1].addr = (void *) fsf_req->qtcb; @@ -4756,7 +4771,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; - u64 dbg_tmp[2]; + unsigned long flags; int retval = 0; adapter = fsf_req->adapter; @@ -4770,10 +4785,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 into hash table */ - spin_lock(&adapter->req_list_lock); - zfcp_reqlist_add(adapter, fsf_req); - spin_unlock(&adapter->req_list_lock); + /* 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); inc_seq_no = (fsf_req->qtcb != NULL); @@ -4812,10 +4827,6 @@ 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; @@ -4825,17 +4836,22 @@ zfcp_fsf_req_send(struct zfcp_fsf_req *fsf_req, struct timer_list *timer) */ if (timer) del_timer(timer); - 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 */ + 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 + */ 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; + req_queue->free_index -= fsf_req->sbal_number; /* increase */ req_queue->free_index += QDIO_MAX_BUFFERS_PER_Q; req_queue->free_index %= QDIO_MAX_BUFFERS_PER_Q; /* wrap */ - zfcp_erp_adapter_reopen(adapter, 0); + ZFCP_LOG_DEBUG + ("error: do_QDIO failed. Buffers could not be enqueued " + "to request queue.\n"); } else { req_queue->distance_from_int = new_distance_from_int; /* @@ -4851,7 +4867,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->reqs_active); + atomic_inc(&adapter->fsf_reqs_active); } return retval; } diff --git a/drivers/s390/scsi/zfcp_fsf.h b/drivers/s390/scsi/zfcp_fsf.h index 711866189..e734415ca 100644 --- a/drivers/s390/scsi/zfcp_fsf.h +++ b/drivers/s390/scsi/zfcp_fsf.h @@ -1,8 +1,19 @@ /* - * This file is part of the zfcp device driver for - * FCP adapters for IBM System z9 and zSeries. + * + * linux/drivers/s390/scsi/zfcp_fsf.h + * + * FCP adapter driver for IBM eServer zSeries + * + * (C) Copyright IBM Corp. 2002, 2004 * - * (C) Copyright IBM Corp. 2002, 2006 + * Author(s): Martin Peschke + * Raimund Schroeder + * Aron Zeh + * Wolfgang Taphorn + * Stefan Bader + * Heiko Carstens + * Andreas Herrmann + * Volker Sameske * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -22,7 +33,8 @@ #ifndef FSF_H #define FSF_H -#define FSF_QTCB_CURRENT_VERSION 0x00000001 +#define FSF_QTCB_VERSION1 0x00000001 +#define FSF_QTCB_CURRENT_VERSION FSF_QTCB_VERSION1 /* FSF commands */ #define FSF_QTCB_FCP_CMND 0x00000001 @@ -52,7 +64,7 @@ #define FSF_CFDC_OPTION_FULL_ACCESS 0x00000002 #define FSF_CFDC_OPTION_RESTRICTED_ACCESS 0x00000004 -/* FSF protocol states */ +/* FSF protocol stati */ #define FSF_PROT_GOOD 0x00000001 #define FSF_PROT_QTCB_VERSION_ERROR 0x00000010 #define FSF_PROT_SEQ_NUMB_ERROR 0x00000020 @@ -64,7 +76,7 @@ #define FSF_PROT_REEST_QUEUE 0x00000800 #define FSF_PROT_ERROR_STATE 0x01000000 -/* FSF states */ +/* FSF stati */ #define FSF_GOOD 0x00000000 #define FSF_PORT_ALREADY_OPEN 0x00000001 #define FSF_LUN_ALREADY_OPEN 0x00000002 @@ -257,6 +269,20 @@ #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 dbd9f48e8..1c3275163 100644 --- a/drivers/s390/scsi/zfcp_qdio.c +++ b/drivers/s390/scsi/zfcp_qdio.c @@ -1,8 +1,18 @@ /* - * This file is part of the zfcp device driver for - * FCP adapters for IBM System z9 and zSeries. + * linux/drivers/s390/scsi/zfcp_qdio.c * - * (C) Copyright IBM Corp. 2002, 2006 + * 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 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -168,8 +178,7 @@ 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, zfcp_get_busid_by_adapter(adapter), 8); - ASCEBC(init_data->adapter_name, 8); + memcpy(init_data->adapter_name, &adapter->name, 8); init_data->qib_param_field_format = 0; init_data->qib_param_field = NULL; init_data->input_slib_elements = NULL; @@ -282,37 +291,6 @@ 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 * @@ -375,7 +353,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, - (unsigned long) buffere->addr); + (void *) buffere->addr); if (retval) { ZFCP_LOG_NORMAL("bug: unexpected inbound " @@ -446,6 +424,51 @@ 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 c489dece8..9e6d07d7b 100644 --- a/drivers/s390/scsi/zfcp_scsi.c +++ b/drivers/s390/scsi/zfcp_scsi.c @@ -1,8 +1,18 @@ /* - * This file is part of the zfcp device driver for - * FCP adapters for IBM System z9 and zSeries. + * + * linux/drivers/s390/scsi/zfcp_scsi.c + * + * FCP adapter driver for IBM eServer zSeries + * + * (C) Copyright IBM Corp. 2002, 2004 * - * (C) Copyright IBM Corp. 2002, 2006 + * Author(s): Martin Peschke + * Raimund Schroeder + * Aron Zeh + * Wolfgang Taphorn + * Stefan Bader + * Heiko Carstens + * Andreas Herrmann * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -30,12 +40,13 @@ 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, - unsigned int, unsigned int); +static struct zfcp_unit *zfcp_unit_lookup(struct zfcp_adapter *, int, scsi_id_t, + scsi_lun_t); static struct device_attribute *zfcp_sysfs_sdev_attrs[]; @@ -43,24 +54,33 @@ struct scsi_transport_template *zfcp_transport_template; struct zfcp_data zfcp_data = { .scsi_host_template = { - .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, + 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, }, .driver_version = ZFCP_VERSION, + /* rest initialised with zeros */ }; /* Find start of Response Information in FCP response unit*/ @@ -141,6 +161,14 @@ 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) { @@ -167,14 +195,16 @@ zfcp_scsi_slave_alloc(struct scsi_device *sdp) return retval; } -/** - * zfcp_scsi_slave_destroy - called when scsi device is removed +/* + * function: zfcp_scsi_slave_destroy + * + * purpose: * - * 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. + * returns: */ -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; @@ -182,7 +212,6 @@ static void 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 " @@ -302,7 +331,7 @@ zfcp_scsi_command_sync(struct zfcp_unit *unit, struct scsi_cmnd *scpnt, struct timer_list *timer) { int ret; - DECLARE_COMPLETION_ONSTACK(wait); + DECLARE_COMPLETION(wait); scpnt->SCp.ptr = (void *) &wait; /* silent re-use */ scpnt->scsi_done = zfcp_scsi_command_sync_handler; @@ -345,9 +374,18 @@ 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, unsigned int id, - unsigned int lun) +zfcp_unit_lookup(struct zfcp_adapter *adapter, int channel, scsi_id_t id, + scsi_lun_t lun) { struct zfcp_port *port; struct zfcp_unit *unit, *retval = NULL; @@ -453,6 +491,13 @@ 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) { @@ -547,42 +592,46 @@ zfcp_task_management_function(struct zfcp_unit *unit, u8 tm_flags, } /** - * zfcp_scsi_eh_host_reset_handler - handler for host and bus reset - * - * If ERP is already running it will be stopped. + * zfcp_scsi_eh_bus_reset_handler - reset bus (reopen adapter) */ -int zfcp_scsi_eh_host_reset_handler(struct scsi_cmnd *scpnt) +int +zfcp_scsi_eh_bus_reset_handler(struct scsi_cmnd *scpnt) { - struct zfcp_unit *unit; - struct zfcp_adapter *adapter; - unsigned long flags; - - unit = (struct zfcp_unit*) scpnt->device->hostdata; - adapter = unit->port->adapter; + struct zfcp_unit *unit = (struct zfcp_unit*) scpnt->device->hostdata; + struct zfcp_adapter *adapter = unit->port->adapter; - ZFCP_LOG_NORMAL("host/bus reset because of problems with " + 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); - 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; +} + +/** + * 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; + + ZFCP_LOG_NORMAL("host reset because of problems with " + "unit 0x%016Lx\n", unit->fcp_lun); + zfcp_erp_adapter_reopen(adapter, 0); + zfcp_erp_wait(adapter); return SUCCESS; } +/* + * function: + * + * purpose: + * + * returns: + */ int zfcp_adapter_scsi_register(struct zfcp_adapter *adapter) { @@ -608,6 +657,10 @@ 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 @@ -625,6 +678,13 @@ zfcp_adapter_scsi_register(struct zfcp_adapter *adapter) return retval; } +/* + * function: + * + * purpose: + * + * returns: + */ void zfcp_adapter_scsi_unregister(struct zfcp_adapter *adapter) { @@ -643,6 +703,7 @@ 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; @@ -756,9 +817,10 @@ zfcp_get_fc_host_stats(struct Scsi_Host *shost) if (!fc_stats) return NULL; - data = kzalloc(sizeof(*data), GFP_KERNEL); + data = kmalloc(sizeof(*data), GFP_KERNEL); if (!data) return NULL; + memset(data, 0, sizeof(*data)); ret = zfcp_fsf_exchange_port_data(NULL, adapter, data); if (ret) { @@ -786,9 +848,10 @@ zfcp_reset_fc_host_stats(struct Scsi_Host *shost) int ret; adapter = (struct zfcp_adapter *)shost->hostdata[0]; - data = kzalloc(sizeof(*data), GFP_KERNEL); + data = kmalloc(sizeof(*data), GFP_KERNEL); if (!data) return; + memset(data, 0, sizeof(*data)); ret = zfcp_fsf_exchange_port_data(NULL, adapter, data); if (ret == 0) { @@ -800,18 +863,11 @@ 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, @@ -821,7 +877,6 @@ 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 705c6d442..b29ac25e0 100644 --- a/drivers/s390/scsi/zfcp_sysfs_adapter.c +++ b/drivers/s390/scsi/zfcp_sysfs_adapter.c @@ -1,8 +1,16 @@ /* - * This file is part of the zfcp device driver for - * FCP adapters for IBM System z9 and zSeries. + * linux/drivers/s390/scsi/zfcp_sysfs_adapter.c * - * (C) Copyright IBM Corp. 2002, 2006 + * FCP adapter driver for IBM eServer zSeries + * + * sysfs adapter related routines + * + * (C) Copyright IBM Corp. 2003, 2004 + * + * Authors: + * Martin Peschke + * Heiko Carstens + * Andreas Herrmann * * This 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 005e62f85..6622d55e0 100644 --- a/drivers/s390/scsi/zfcp_sysfs_driver.c +++ b/drivers/s390/scsi/zfcp_sysfs_driver.c @@ -1,8 +1,16 @@ /* - * This file is part of the zfcp device driver for - * FCP adapters for IBM System z9 and zSeries. + * linux/drivers/s390/scsi/zfcp_sysfs_driver.c * - * (C) Copyright IBM Corp. 2002, 2006 + * FCP adapter driver for IBM eServer zSeries + * + * sysfs driver related routines + * + * (C) Copyright IBM Corp. 2003, 2004 + * + * Authors: + * Martin Peschke + * Heiko Carstens + * Andreas Herrmann * * This 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 1320c0591..f401d42db 100644 --- a/drivers/s390/scsi/zfcp_sysfs_port.c +++ b/drivers/s390/scsi/zfcp_sysfs_port.c @@ -1,8 +1,17 @@ /* - * This file is part of the zfcp device driver for - * FCP adapters for IBM System z9 and zSeries. + * linux/drivers/s390/scsi/zfcp_sysfs_port.c * - * (C) Copyright IBM Corp. 2002, 2006 + * 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 * * This 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 81a484175..ad5dfb889 100644 --- a/drivers/s390/scsi/zfcp_sysfs_unit.c +++ b/drivers/s390/scsi/zfcp_sysfs_unit.c @@ -1,8 +1,17 @@ /* - * This file is part of the zfcp device driver for - * FCP adapters for IBM System z9 and zSeries. + * linux/drivers/s390/scsi/zfcp_sysfs_unit.c * - * (C) Copyright IBM Corp. 2002, 2006 + * 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 * * This 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 d1c1e75bf..66da840c9 100644 --- a/drivers/s390/sysinfo.c +++ b/drivers/s390/sysinfo.c @@ -5,6 +5,7 @@ * 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 4fdb2c932..015db40ad 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, IRQF_SHARED, "sio16", bp)) { + !request_irq(bp->irq|0x30, aurora_interrupt, SA_SHIRQ, "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, IRQF_SHARED, "sio16", bp)) { + !request_irq(bp->irq|0x30, aurora_interrupt, SA_SHIRQ, "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, IRQF_SHARED, "sio16", bp)) { + !request_irq(bp->irq|0x30, aurora_interrupt, SA_SHIRQ, "sio16", bp)) { free_irq(bp->irq|0x30, bp); } else for(grrr=0;grrrirq=type_1_irq[grrr])&&!request_irq(bp->irq|0x30, aurora_interrupt, IRQF_SHARED, "sio16", bp)) { + if ((bp->irq=type_1_irq[grrr])&&!request_irq(bp->irq|0x30, aurora_interrupt, SA_SHIRQ, "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, IRQF_SHARED, + error = request_irq(allirq[i]|0x30, aurora_interrupt, SA_SHIRQ, "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, IRQF_SHARED, + error = request_irq(bp->irq|0x30, aurora_interrupt, SA_SHIRQ, "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 1cc706e11..d89f83f76 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_node->name, "temperature")) + if (!strcmp(echild->prom_name, "temperature")) attach_one_temp(echild, temp_index++); - if (!strcmp(echild->prom_node->name, "fan-control")) + if (!strcmp(echild->prom_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 718623559..1c8b612d8 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, - IRQF_SHARED, "bbc_i2c", bp)) + SA_SHIRQ, "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_node->name, "bbc")) + if (!strcmp(edev->prom_name, "bbc")) return 1; } } @@ -440,13 +440,12 @@ static int __init bbc_i2c_init(void) struct linux_ebus_device *edev = NULL; int err, index = 0; - if ((tlb_type != cheetah && tlb_type != cheetah_plus) || - !bbc_present()) + if (tlb_type != cheetah || !bbc_present()) return -ENODEV; for_each_ebus(ebus) { for_each_ebusdev(edev, ebus) { - if (!strcmp(edev->prom_node->name, "i2c")) { + if (!strcmp(edev->prom_name, "i2c")) { if (!attach_one_i2c(edev, index)) index++; } @@ -487,4 +486,3 @@ static void bbc_i2c_cleanup(void) module_init(bbc_i2c_init); module_exit(bbc_i2c_cleanup); -MODULE_LICENSE("GPL"); diff --git a/drivers/sbus/char/bpp.c b/drivers/sbus/char/bpp.c index 385f4f768..ccb20a6f5 100644 --- a/drivers/sbus/char/bpp.c +++ b/drivers/sbus/char/bpp.c @@ -20,6 +20,7 @@ #include #include #include +#include #include #include @@ -1030,6 +1031,11 @@ 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; } @@ -1038,6 +1044,9 @@ 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 836a58bb0..fd2cc7782 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, - IRQF_SHARED, + SA_SHIRQ, WD_OBPNAME, (void *)wd_dev.regs)) { - printk("%s: Cannot register IRQ %d\n", - WD_OBPNAME, wd_dev.irq); + printk("%s: Cannot register IRQ %s\n", + WD_OBPNAME, __irq_itoa(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->ofdev.node->name, WD_OBPNAME)) + if (!strcmp(edev->prom_name, WD_OBPNAME)) goto ebus_done; } } diff --git a/drivers/sbus/char/display7seg.c b/drivers/sbus/char/display7seg.c index d92bc8827..c3a51d1fa 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_node->name, D7S_OBPNAME)) + if (!strcmp(edev->prom_name, D7S_OBPNAME)) goto ebus_done; } } diff --git a/drivers/sbus/char/envctrl.c b/drivers/sbus/char/envctrl.c index 063e676a3..19e8eddf8 100644 --- a/drivers/sbus/char/envctrl.c +++ b/drivers/sbus/char/envctrl.c @@ -22,6 +22,7 @@ #define __KERNEL_SYSCALLS__ static int errno; +#include #include #include #include @@ -767,14 +768,16 @@ 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, struct device_node *dp) +static void envctrl_init_adc(struct i2c_child_t *pchild, int node) { + char chnls_desc[CHANNEL_DESC_SZ]; int i = 0, len; - char *pos; - unsigned int *pval; + char *pos = chnls_desc; /* Firmware describe channels into a stream separated by a '\0'. */ - pos = of_get_property(dp, "channels-description", &len); + len = prom_getproperty(node, "channels-description", chnls_desc, + CHANNEL_DESC_SZ); + chnls_desc[CHANNEL_DESC_SZ - 1] = '\0'; while (len > 0) { int l = strlen(pos) + 1; @@ -784,13 +787,10 @@ static void envctrl_init_adc(struct i2c_child_t *pchild, struct device_node *dp) } /* Get optional properties. */ - 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; + len = prom_getproperty(node, "warning-temp", (char *)&warning_temperature, + sizeof(warning_temperature)); + len = prom_getproperty(node, "shutdown-temp", (char *)&shutdown_temperature, + sizeof(shutdown_temperature)); } /* Function Description: Initialize child device monitoring fan status. @@ -864,18 +864,21 @@ 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 len, i, tbls_size = 0; - struct device_node *dp = edev_child->prom_node; - void *pval; + int node, len, i, tbls_size = 0; + + node = edev_child->prom_node; /* Get device address. */ - pval = of_get_property(dp, "reg", &len); - memcpy(&pchild->addr, pval, len); + len = prom_getproperty(node, "reg", + (char *) &(pchild->addr), + sizeof(pchild->addr)); /* Get tables property. Read firmware temperature tables. */ - pval = of_get_property(dp, "translation", &len); - if (pval && len > 0) { - memcpy(pchild->tblprop_array, pval, len); + len = prom_getproperty(node, "translation", + (char *) pchild->tblprop_array, + (PCF8584_MAX_CHANNELS * + sizeof(struct pcf8584_tblprop))); + if (len > 0) { 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) { @@ -888,12 +891,12 @@ static void envctrl_init_i2c_child(struct linux_ebus_child *edev_child, printk("envctrl: Failed to allocate table.\n"); return; } - pval = of_get_property(dp, "tables", &len); - if (!pval || len <= 0) { + len = prom_getproperty(node, "tables", + (char *) pchild->tables, tbls_size); + if (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) @@ -904,11 +907,12 @@ 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]; - root_node = of_find_node_by_path("/"); - if (!strcmp(root_node->name, "SUNW,UltraSPARC-IIi-cEngine")) { + len = prom_getproperty(prom_root_node, "name", prop, sizeof(prop)); + if (0 < len && (0 == strncmp(prop, "SUNW,UltraSPARC-IIi-cEngine", len))) + { for (len = 0; len < PCF8584_MAX_CHANNELS; ++len) { pchild->mon_type[len] = ENVCTRL_NOMON; } @@ -917,14 +921,16 @@ static void envctrl_init_i2c_child(struct linux_ebus_child *edev_child, } /* Get the monitor channels. */ - pval = of_get_property(dp, "channels-in-use", &len); - memcpy(pchild->chnl_array, pval, len); + len = prom_getproperty(node, "channels-in-use", + (char *) pchild->chnl_array, + (PCF8584_MAX_CHANNELS * + sizeof(struct pcf8584_channel))); 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, dp); + envctrl_init_adc(pchild, node); break; case PCF8584_GLOBALADDR_TYPE: @@ -939,7 +945,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,dp); + envctrl_init_adc(pchild,node); } else { envctrl_init_voltage_status(pchild); } @@ -1040,7 +1046,7 @@ static int __init envctrl_init(void) for_each_ebus(ebus) { for_each_ebusdev(edev, ebus) { - if (!strcmp(edev->prom_node->name, "bbc")) { + if (!strcmp(edev->prom_name, "bbc")) { /* If we find a boot-bus controller node, * then this envctrl driver is not for us. */ @@ -1054,14 +1060,14 @@ static int __init envctrl_init(void) */ for_each_ebus(ebus) { for_each_ebusdev(edev, ebus) { - if (!strcmp(edev->prom_node->name, "i2c")) { + if (!strcmp(edev->prom_name, "i2c")) { i2c = ioremap(edev->resource[0].start, 0x2); for_each_edevchild(edev, edev_child) { - if (!strcmp("gpio", edev_child->prom_node->name)) { + if (!strcmp("gpio", edev_child->prom_name)) { i2c_childlist[i].i2ctype = I2C_GPIO; envctrl_init_i2c_child(edev_child, &(i2c_childlist[i++])); } - if (!strcmp("adc", edev_child->prom_node->name)) { + if (!strcmp("adc", edev_child->prom_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 fa2418f7a..6bdd768b7 100644 --- a/drivers/sbus/char/flash.c +++ b/drivers/sbus/char/flash.c @@ -4,6 +4,7 @@ * Copyright (C) 1997 Eddie C. Dost (ecd@skynet.be) */ +#include #include #include #include @@ -70,7 +71,9 @@ 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_page_prot = pgprot_noncached(vma->vm_page_prot); + pgprot_val(vma->vm_page_prot) &= ~(_PAGE_CACHE); + pgprot_val(vma->vm_page_prot) |= _PAGE_E; + vma->vm_flags |= (VM_SHM | VM_LOCKED); if (io_remap_pfn_range(vma, vma->vm_start, addr, size, vma->vm_page_prot)) return -EAGAIN; @@ -190,11 +193,9 @@ 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_node->name, "flashprom")) + if (!strcmp(edev->prom_name, "flashprom")) goto ebus_done; } } @@ -202,23 +203,23 @@ static int __init flash_init(void) if (!edev) return -ENODEV; - ebus_regs = of_get_property(edev->prom_node, "reg", &len); - if (!ebus_regs || (len % sizeof(regs[0])) != 0) { + len = prom_getproperty(edev->prom_node, "reg", (void *)regs, sizeof(regs)); + if ((len % sizeof(regs[0])) != 0) { printk("flash: Strange reg property size %d\n", len); return -ENODEV; } - nregs = len / sizeof(ebus_regs[0]); + nregs = len / sizeof(regs[0]); flash.read_base = edev->resource[0].start; - flash.read_size = ebus_regs[0].reg_size; + flash.read_size = regs[0].reg_size; if (nregs == 1) { flash.write_base = edev->resource[0].start; - flash.write_size = ebus_regs[0].reg_size; + flash.write_size = regs[0].reg_size; } else if (nregs == 2) { flash.write_base = edev->resource[1].start; - flash.write_size = ebus_regs[1].reg_size; + flash.write_size = 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 2f698763b..383a95f34 100644 --- a/drivers/sbus/char/openprom.c +++ b/drivers/sbus/char/openprom.c @@ -29,6 +29,9 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +#define PROMLIB_INTERNAL + +#include #include #include #include @@ -36,10 +39,10 @@ #include #include #include +#include #include #include #include -#include #include #include #include @@ -48,20 +51,15 @@ #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 { - struct device_node *current_node; /* Current node for SunOS ioctls. */ - struct device_node *lastnode; /* Last valid node used by BSD ioctls. */ + int current_node; /* Current node for SunOS ioctls. */ + int lastnode; /* Last valid node used by BSD ioctls. */ } DATA; /* ID of the PROM node containing all of the EEPROM options. */ -static struct device_node *options_node; +static int options_node = 0; /* * Copy an openpromio structure into kernel space from user space. @@ -89,8 +87,9 @@ static int copyin(struct openpromio __user *info, struct openpromio **opp_p) if (bufsize > OPROMMAXPARAM) bufsize = OPROMMAXPARAM; - if (!(*opp_p = kzalloc(sizeof(int) + bufsize + 1, GFP_KERNEL))) + if (!(*opp_p = kmalloc(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)) { @@ -108,9 +107,10 @@ static int getstrings(struct openpromio __user *info, struct openpromio **opp_p) if (!info || !opp_p) return -EFAULT; - if (!(*opp_p = kzalloc(sizeof(int) + OPROMMAXPARAM + 1, GFP_KERNEL))) + if (!(*opp_p = kmalloc(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,171 +140,16 @@ 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, - struct device_node *dp) + unsigned int cmd, unsigned long arg, int node) { - DATA *data = file->private_data; + DATA *data = (DATA *) file->private_data; + char buffer[OPROMMAXPARAM+1], *buf; struct openpromio *opp; - int bufsize, error = 0; + int bufsize, len, error = 0; static int cnt; void __user *argp = (void __user *)arg; @@ -319,35 +164,119 @@ static int openprom_sunos_ioctl(struct inode * inode, struct file * file, switch (cmd) { case OPROMGETOPT: case OPROMGETPROP: - error = opromgetprop(argp, dp, opp, bufsize); + 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); break; case OPROMNXTOPT: case OPROMNXTPROP: - error = opromnxtprop(argp, dp, opp, bufsize); + 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); break; case OPROMSETOPT: case OPROMSETOPT2: - error = opromsetopt(dp, opp, bufsize); + 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; break; case OPROMNEXT: case OPROMCHILD: case OPROMSETCUR: - error = opromnext(argp, cmd, dp, opp, bufsize, data); + 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)); break; case OPROMPCI2NODE: - error = oprompci2node(argp, dp, opp, bufsize, data); + 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 + } break; case OPROMPATH2NODE: - error = oprompath2node(argp, dp, opp, bufsize, data); + 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)); break; case OPROMGETBOOTARGS: - error = opromgetbootargs(argp, opp, bufsize); + 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)); break; case OPROMU2P: @@ -368,14 +297,25 @@ static int openprom_sunos_ioctl(struct inode * inode, struct file * file, return error; } -static struct device_node *get_node(phandle n, DATA *data) -{ - struct device_node *dp = of_find_node_by_phandle(n); - if (dp) - data->lastnode = dp; +/* Return nonzero if a specific node is in the PROM device tree. */ +static int intree(int root, int node) +{ + for (; root != 0; root = prom_getsibling(root)) + if (root == node || intree(prom_getchild(root),node)) + return 1; + return 0; +} - return dp; +/* 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; } /* Copy in a whole string from userspace into kernelspace. */ @@ -390,7 +330,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; } @@ -405,187 +345,159 @@ static int copyin_string(char __user *user, size_t len, char **ptr) /* * NetBSD /dev/openprom ioctl calls. */ -static int opiocget(void __user *argp, DATA *data) +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; struct opiocdesc op; - struct device_node *dp; - char *str; - void *pval; - int err, len; + int error, node, len; + char *str, *tmp; + char buffer[64]; + static int cnt; - if (copy_from_user(&op, argp, sizeof(op))) - return -EFAULT; + switch (cmd) { + case OPIOCGET: + if (copy_from_user(&op, argp, sizeof(op))) + return -EFAULT; - dp = get_node(op.op_nodeid, data); + if (!goodnode(op.op_nodeid,data)) + return -EINVAL; - err = copyin_string(op.op_name, op.op_namelen, &str); - if (err) - return err; + error = copyin_string(op.op_name, op.op_namelen, &str); + if (error) + return error; - 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); + len = prom_getproplen(op.op_nodeid,str); - return err; -} + if (len > op.op_buflen) { + 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; + op.op_buflen = len; - if (copy_from_user(&op, argp, sizeof(op))) - return -EFAULT; + if (len <= 0) { + kfree(str); + /* Verified by the above copy_from_user */ + if (__copy_to_user(argp, &op, + sizeof(op))) + return -EFAULT; + return 0; + } - dp = get_node(op.op_nodeid, data); - if (!dp) - return -EINVAL; + tmp = kmalloc(len + 1, GFP_KERNEL); + if (!tmp) { + kfree(str); + return -ENOMEM; + } - err = copyin_string(op.op_name, op.op_namelen, &str); - if (err) - return err; + prom_getproperty(op.op_nodeid, str, tmp, len); - if (str[0] == '\0') { - prop = dp->properties; - } else { - prop = of_find_property(dp, str, NULL); - if (prop) - prop = prop->next; - } - kfree(str); + tmp[len] = '\0'; - if (!prop) - len = 0; - else - len = prop->length; + if (__copy_to_user(argp, &op, sizeof(op)) != 0 + || copy_to_user(op.op_buf, tmp, len) != 0) + error = -EFAULT; - if (len > op.op_buflen) - len = op.op_buflen; + kfree(tmp); + kfree(str); - if (copy_to_user(argp, &op, sizeof(op))) - return -EFAULT; + return error; - if (len && - copy_to_user(op.op_buf, prop->value, len)) - return -EFAULT; + case OPIOCNEXTPROP: + if (copy_from_user(&op, argp, sizeof(op))) + return -EFAULT; - return 0; -} + if (!goodnode(op.op_nodeid,data)) + return -EINVAL; -static int opiocset(void __user *argp, DATA *data) -{ - struct opiocdesc op; - struct device_node *dp; - char *str, *tmp; - int err; + error = copyin_string(op.op_name, op.op_namelen, &str); + if (error) + return error; - if (copy_from_user(&op, argp, sizeof(op))) - return -EFAULT; + tmp = prom_nextprop(op.op_nodeid,str,buffer); - dp = get_node(op.op_nodeid, data); - if (!dp) - return -EINVAL; + 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; + } - err = copyin_string(op.op_name, op.op_namelen, &str); - if (err) - return err; + if (!access_ok(VERIFY_WRITE, argp, sizeof(op))) { + kfree(str); + return -EFAULT; + } - err = copyin_string(op.op_buf, op.op_buflen, &tmp); - if (err) { - kfree(str); - return err; - } + if (!access_ok(VERIFY_WRITE, op.op_buf, len)) { + kfree(str); + return -EFAULT; + } - err = of_set_property(dp, str, tmp, op.op_buflen); + error = __copy_to_user(argp, &op, sizeof(op)); + if (!error) error = __copy_to_user(op.op_buf, tmp, len); - kfree(str); - kfree(tmp); + kfree(str); - return err; -} + return error; -static int opiocgetnext(unsigned int cmd, void __user *argp) -{ - struct device_node *dp; - phandle nd; + case OPIOCSET: + if (copy_from_user(&op, argp, sizeof(op))) + return -EFAULT; - BUILD_BUG_ON(sizeof(phandle) != sizeof(int)); + if (!goodnode(op.op_nodeid,data)) + return -EINVAL; - if (copy_from_user(&nd, argp, sizeof(phandle))) - return -EFAULT; + error = copyin_string(op.op_name, op.op_namelen, &str); + if (error) + return error; - 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; + error = copyin_string(op.op_buf, op.op_buflen, &tmp); + if (error) { + kfree(str); + return error; } - } - if (dp) - nd = dp->node; - if (copy_to_user(argp, &nd, sizeof(phandle))) - return -EFAULT; - return 0; -} + len = prom_setprop(op.op_nodeid,str,tmp,op.op_buflen+1); -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; - - switch (cmd) { - case OPIOCGET: - err = opiocget(argp, data); - break; + if (len != op.op_buflen) + return -EINVAL; - case OPIOCNEXTPROP: - err = opiocnextprop(argp, data); - break; + kfree(str); + kfree(tmp); - case OPIOCSET: - err = opiocset(argp, data); - break; + return 0; case OPIOCGETOPTNODE: - BUILD_BUG_ON(sizeof(phandle) != sizeof(int)); - - if (copy_to_user(argp, &options_node->node, sizeof(phandle))) + if (copy_to_user(argp, &options_node, sizeof(int))) return -EFAULT; - return 0; case OPIOCGETNEXT: case OPIOCGETCHILD: - err = opiocgetnext(cmd, argp); - break; + if (copy_from_user(&node, argp, sizeof(int))) + return -EFAULT; + + if (cmd == OPIOCGETNEXT) + node = __prom_getsibling(node); + else + node = __prom_getchild(node); + + if (__copy_to_user(argp, &node, sizeof(int))) + return -EFAULT; + + return 0; default: + if (cnt++ < 10) + printk(KERN_INFO "openprom_bsd_ioctl: cmd 0x%X\n", cmd); return -EINVAL; - }; - - return err; + } } @@ -596,6 +508,7 @@ 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: @@ -647,8 +560,10 @@ 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, @@ -676,7 +591,9 @@ 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; } @@ -687,13 +604,13 @@ static int openprom_open(struct inode * inode, struct file * file) { DATA *data; - data = kmalloc(sizeof(DATA), GFP_KERNEL); + data = (DATA *) kmalloc(sizeof(DATA), GFP_KERNEL); if (!data) return -ENOMEM; - data->current_node = of_find_node_by_path("/"); - data->lastnode = data->current_node; - file->private_data = (void *) data; + data->current_node = prom_root_node; + data->lastnode = prom_root_node; + file->private_data = (void *)data; return 0; } @@ -714,30 +631,24 @@ static struct file_operations openprom_fops = { }; static struct miscdevice openprom_dev = { - .minor = SUN_OPENPROM_MINOR, - .name = "openprom", - .fops = &openprom_fops, + SUN_OPENPROM_MINOR, "openprom", &openprom_fops }; static int __init openprom_init(void) { - struct device_node *dp; - int err; - - err = misc_register(&openprom_dev); - if (err) - return err; + int error; - dp = of_find_node_by_path("/"); - dp = dp->child; - while (dp) { - if (!strcmp(dp->name, "options")) - break; - dp = dp->sibling; + error = misc_register(&openprom_dev); + if (error) { + printk(KERN_ERR "openprom: unable to get misc minor\n"); + return error; } - options_node = dp; - if (!options_node) { + options_node = prom_getchild(prom_root_node); + options_node = prom_searchsiblings(options_node,"options"); + + if (options_node == 0 || options_node == -1) { + printk(KERN_ERR "openprom: unable to find options node\n"); misc_deregister(&openprom_dev); return -EIO; } @@ -752,3 +663,4 @@ 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 2a9cc8204..d1babff6a 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->ofdev.node->name, "bbc")) + if (!strcmp(edev->prom_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->ofdev.node->name, RIOWD_NAME)) + if (!strcmp(edev->prom_name, RIOWD_NAME)) goto ebus_done; } } diff --git a/drivers/sbus/char/uctrl.c b/drivers/sbus/char/uctrl.c index 575b1f7ed..e2d9a7c85 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 %d)\n", driver->regs, driver->irq); + printk("uctrl: 0x%x (irq %s)\n", driver->regs, __irq_itoa(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 63941a259..8045cd5e7 100644 --- a/drivers/sbus/char/vfc.h +++ b/drivers/sbus/char/vfc.h @@ -1,6 +1,8 @@ #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 55b2b31bd..dfdd6be55 100644 --- a/drivers/sbus/char/vfc_dev.c +++ b/drivers/sbus/char/vfc_dev.c @@ -164,6 +164,10 @@ 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; } @@ -619,7 +623,7 @@ static int vfc_mmap(struct file *file, struct vm_area_struct *vma) map_size = sizeof(struct vfc_regs); vma->vm_flags |= - (VM_MAYREAD | VM_MAYWRITE | VM_MAYSHARE); + (VM_SHM | VM_LOCKED | VM_IO | 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, @@ -673,6 +677,7 @@ 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) { @@ -712,6 +717,7 @@ 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); } @@ -725,6 +731,7 @@ 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 57e152674..378a1d680 100644 --- a/drivers/sbus/dvma.c +++ b/drivers/sbus/dvma.c @@ -3,6 +3,7 @@ * 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 935952ef8..5d30a3ebf 100644 --- a/drivers/sbus/sbus.c +++ b/drivers/sbus/sbus.c @@ -1,10 +1,12 @@ -/* sbus.c: SBus support routines. +/* $Id: sbus.c,v 1.100 2002/01/24 15:36:24 davem Exp $ + * sbus.c: SBus support routines. * - * Copyright (C) 1995, 2006 David S. Miller (davem@davemloft.net) + * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) */ #include #include +#include #include #include @@ -12,76 +14,237 @@ #include #include #include -#include -#include #include #include -struct sbus_bus *sbus_root; +struct sbus_bus *sbus_root = NULL; -static void __init fill_sbus_device(struct device_node *dp, struct sbus_dev *sdev) -{ - unsigned long base; - void *pval; - int len; +static struct linux_prom_irqs irqs[PROMINTR_MAX] __initdata = { { 0 } }; +#ifdef CONFIG_SPARC32 +static int interrupts[PROMINTR_MAX] __initdata = { 0 }; +#endif - sdev->prom_node = dp->node; - strcpy(sdev->prom_name, dp->name); +#ifdef CONFIG_PCI +extern int pcic_present(void); +#endif - pval = of_get_property(dp, "reg", &len); - sdev->num_registers = 0; - if (pval) { - memcpy(sdev->reg_addrs, pval, len); +/* 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. + */ - sdev->num_registers = - len / sizeof(struct linux_prom_registers); +/* #define DEBUG_FILL */ - base = (unsigned long) sdev->reg_addrs[0].phys_addr; +static void __init fill_sbus_device(int prom_node, struct sbus_dev *sdev) +{ + unsigned long address, base; + int len; - /* 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->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; } - 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); + 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; - sbus_fill_device_irq(sdev); + base = (unsigned long) sdev->reg_addrs[0].phys_addr; - 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); + /* 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; + } - if (of_device_register(&sdev->ofdev) != 0) - printk(KERN_DEBUG "sbus: device registration error for %s!\n", - sdev->ofdev.dev.bus_id); +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(); + } + 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); + } +#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 */ } -static void __init sbus_bus_ranges_init(struct device_node *dp, struct sbus_bus *sbus) +/* 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. + */ + +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) { - void *pval; - int len; + 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; + } + } +} - 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); +/* + * 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) */ + +static void __init sbus_bus_ranges_init(int parent_node, struct sbus_bus *sbus) +{ + int len; - sbus_arch_bus_ranges_init(dp->parent, sbus); + 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); + } + } +#endif } static void __init __apply_ranges_to_regs(struct linux_prom_ranges *ranges, @@ -159,127 +322,241 @@ static void __init sbus_fixup_all_regs(struct sbus_dev *first_sdev) } } -/* 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; -} +extern void register_proc_sparc_ioport(void); +extern void firetruck_init(void); -static void __init sdev_insert(struct sbus_dev *sdev, struct sbus_dev **root) -{ - while (*root) - root = &(*root)->next; - *root = sdev; - sdev->next = NULL; -} +#ifdef CONFIG_SUN4 +extern void sun4_dvma_init(void); +#endif -static void __init walk_children(struct device_node *dp, struct sbus_dev *parent, struct sbus_bus *sbus) +static int __init sbus_init(void) { - dp = dp->child; - while (dp) { - struct sbus_dev *sdev; - - sdev = kzalloc(sizeof(struct sbus_dev), GFP_ATOMIC); - if (sdev) { - sdev_insert(sdev, &parent->child); - - sdev->bus = sbus; - sdev->parent = parent; + 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? */ - fill_sbus_device(dp, sdev); +#ifdef CONFIG_SPARC32 + register_proc_sparc_ioport(); +#endif - walk_children(dp, sdev, sbus); +#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 } - dp = dp->sibling; } -} - -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; - - sbus = kzalloc(sizeof(struct sbus_bus), GFP_ATOMIC); - if (!sbus) - return; - - sbus_insert(sbus, &sbus_root); - sbus->prom_node = dp->node; - - sbus_setup_iommu(sbus, dp); - - printk("sbus%d: ", num_sbus); - - 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; + /* 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; - sdev = kzalloc(sizeof(struct sbus_dev), GFP_ATOMIC); - if (sdev) { - sdev_insert(sdev, &sbus->devices); + if(iommund && sparc_cpu_model != sun4u && sparc_cpu_model != sun4d) + iommu_init(iommund, sbus); - sdev->bus = sbus; - sdev->parent = NULL; - fill_sbus_device(dev_dp, sdev); + /* 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); - walk_children(dev_dp, sdev, sbus); + 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; } - dev_dp = dev_dp->sibling; - } - - sbus_fixup_all_regs(sbus->devices); - - dvma_init(sbus); -} -static int __init sbus_init(void) -{ - struct device_node *dp; - const char *sbus_name = "sbus"; - int num_sbus = 0; + 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; + } - if (sbus_arch_preinit()) - return 0; + 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; + } + } - if (sparc_cpu_model == sun4d) - sbus_name = "sbi"; + /* Walk all devices and apply parent ranges. */ + sbus_fixup_all_regs(sbus->devices); - for_each_node_by_name(dp, sbus_name) { - build_one_sbus(dp, num_sbus); + dvma_init(sbus); + next_bus: 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(); } - - sbus_arch_postinit(); + +#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 return 0; } diff --git a/drivers/scsi/3w-9xxx.c b/drivers/scsi/3w-9xxx.c index 5a9475e56..913254981 100644 --- a/drivers/scsi/3w-9xxx.c +++ b/drivers/scsi/3w-9xxx.c @@ -2,9 +2,8 @@ 3w-9xxx.c -- 3ware 9000 Storage Controller device driver for Linux. Written By: Adam Radford - Modifications By: Tom Couch - Copyright (C) 2004-2006 Applied Micro Circuits Corporation. + Copyright (C) 2004-2005 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 @@ -63,9 +62,6 @@ 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 @@ -212,7 +208,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 = le16_to_cpu(header->status_block.error); + aen = header->status_block.error; full_command_packet = tw_dev->command_packet_virt[request_id]; command_packet = &full_command_packet->command.oldcommand; @@ -309,7 +305,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 = le16_to_cpu(header->status_block.error); + aen = header->status_block.error; queue = 0; count++; @@ -369,7 +365,7 @@ static void twa_aen_queue_event(TW_Device_Extension *tw_dev, TW_Command_Apache_H tw_dev->aen_clobber = 1; } - aen = le16_to_cpu(header->status_block.error); + aen = header->status_block.error; memset(event, 0, sizeof(TW_Event)); event->severity = TW_SEV_OUT(header->status_block.severity__reserved); @@ -386,7 +382,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 + (error_str[0] == '\0' ? 0 : (1 + strlen(error_str)))); + memcpy(event->parameter_data, header->err_specific_desc, event->parameter_len); if (event->severity != TW_AEN_SEVERITY_DEBUG) printk(KERN_WARNING "3w-9xxx:%s AEN: %s (0x%02X:0x%04X): %s:%s.\n", host, @@ -466,24 +462,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_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->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->size = TW_COMMAND_SIZE; - command_packet->byte6_offset.parameter_count = cpu_to_le16(1); + command_packet->byte6_offset.parameter_count = 1; /* Setup the param */ param = (TW_Param_Apache *)tw_dev->generic_buffer_virt[request_id]; memset(param, 0, TW_SECTOR_SIZE); - 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); + param->table_id = TW_TIMEKEEP_TABLE | 0x8000; /* Controller time keep table */ + param->parameter_id = 0x3; /* SchedulerTime */ + param->parameter_size_bytes = 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 = cpu_to_le32(schedulertime % 604800); + schedulertime = schedulertime % 604800; memcpy(param->data, &schedulertime, sizeof(u32)); @@ -935,19 +931,26 @@ out: /* 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; + u32 status_reg_value, response_que_value; + int count = 0, 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) { + status_reg_value = readl(TW_STATUS_REG_ADDR(tw_dev)); + + while (((status_reg_value & TW_STATUS_RESPONSE_QUEUE_EMPTY) == 0) && (count < TW_MAX_RESPONSE_DRAIN)) { response_que_value = readl(TW_RESPONSE_QUEUE_REG_ADDR_LARGE(tw_dev)); - if (time_after(jiffies, before + HZ * 30)) + if ((response_que_value & TW_9550SX_DRAIN_COMPLETED) == TW_9550SX_DRAIN_COMPLETED) { + /* P-chip settle time */ + msleep(500); + retval = 0; goto out; + } + status_reg_value = readl(TW_STATUS_REG_ADDR(tw_dev)); + count++; } - /* P-chip settle time */ - msleep(500); + if (count == TW_MAX_RESPONSE_DRAIN) + goto out; + retval = 0; } else retval = 0; @@ -969,7 +972,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 = le16_to_cpu(full_command_packet->header.status_block.error); + error = 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", @@ -1027,7 +1030,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 entries from the firmware */ +/* This function will get parameter table entires 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; @@ -1044,18 +1047,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 = cpu_to_le16(1); + command_packet->byte6_offset.block_count = 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 = 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->table_id = table_id | 0x8000; + param->parameter_id = parameter_id; + param->parameter_size_bytes = parameter_size_bytes; param_value = tw_dev->generic_buffer_phys[request_id]; - 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); + command_packet->byte8_offset.param.sgl[0].address = param_value; + command_packet->byte8_offset.param.sgl[0].length = TW_SECTOR_SIZE; /* Post the command packet to the board */ twa_post_command_packet(tw_dev, request_id, 1); @@ -1104,20 +1107,18 @@ 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 = cpu_to_le16(message_credits); + tw_initconnect->message_credits = 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 = 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); + 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; } else tw_initconnect->size = TW_INIT_COMMAND_PACKET_SIZE; @@ -1129,11 +1130,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 = 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); + *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; } retval = 0; } @@ -1357,10 +1358,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 = TW_CPU_TO_SGL(dma_handle + sizeof(TW_Ioctl_Buf_Apache) - 1); - newcommand->sg_list[0].length = cpu_to_le32(length); + newcommand->sg_list[0].address = dma_handle + sizeof(TW_Ioctl_Buf_Apache) - 1; + newcommand->sg_list[0].length = length; newcommand->sgl_entries__lunh = - cpu_to_le16(TW_REQ_LUN_IN(TW_LUN_OUT(newcommand->sgl_entries__lunh), 1)); + TW_REQ_LUN_IN(TW_LUN_OUT(newcommand->sgl_entries__lunh), 1); } else { oldcommand = &full_command_packet->command.oldcommand; oldcommand->request_id = request_id; @@ -1368,8 +1369,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 = TW_CPU_TO_SGL(dma_handle + sizeof(TW_Ioctl_Buf_Apache) - 1); - sgl->length = cpu_to_le32(length); + sgl->address = dma_handle + sizeof(TW_Ioctl_Buf_Apache) - 1; + sgl->length = length; if ((sizeof(long) < 8) && (sizeof(dma_addr_t) > 4)) oldcommand->size += 1; @@ -1388,7 +1389,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->request_buffer, cmd->use_sg, DMA_BIDIRECTIONAL); + use_sg = pci_map_sg(pdev, cmd->buffer, cmd->use_sg, DMA_BIDIRECTIONAL); if (use_sg == 0) { TW_PRINTK(tw_dev->host, TW_DRIVER, 0x1c, "Failed to map scatter gather list"); @@ -1827,10 +1828,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 = - cpu_to_le16(TW_REQ_LUN_IN(srb->device->lun, request_id)); + TW_REQ_LUN_IN(srb->device->lun, request_id); } else { command_packet->request_id__lunl = - cpu_to_le16(TW_REQ_LUN_IN(0, request_id)); + TW_REQ_LUN_IN(0, request_id); command_packet->unit = 0; } @@ -1840,8 +1841,8 @@ 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_CPU_TO_SGL(tw_dev->generic_buffer_phys[request_id]); - command_packet->sg_list[0].length = cpu_to_le32(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) memcpy(tw_dev->generic_buffer_virt[request_id], tw_dev->srb[request_id]->request_buffer, tw_dev->srb[request_id]->request_bufflen); } else { @@ -1849,12 +1850,12 @@ static int twa_scsiop_execute_scsi(TW_Device_Extension *tw_dev, int request_id, if (buffaddr == 0) goto out; - 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->sg_list[0].address = buffaddr; + command_packet->sg_list[0].length = tw_dev->srb[request_id]->request_bufflen; } - command_packet->sgl_entries__lunh = cpu_to_le16(TW_REQ_LUN_IN((srb->device->lun >> 4), 1)); + command_packet->sgl_entries__lunh = TW_REQ_LUN_IN((srb->device->lun >> 4), 1); - if (command_packet->sg_list[0].address & TW_CPU_TO_SGL(TW_ALIGNMENT_9000_SGL)) { + if (command_packet->sg_list[0].address & TW_ALIGNMENT_9000_SGL) { TW_PRINTK(tw_dev->host, TW_DRIVER, 0x2d, "Found unaligned address during execute scsi"); goto out; } @@ -1868,35 +1869,35 @@ static int twa_scsiop_execute_scsi(TW_Device_Extension *tw_dev, int request_id, 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); + command_packet->sg_list[0].address = tw_dev->generic_buffer_phys[request_id]; + command_packet->sg_list[0].length = 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 = 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)) { + 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) { TW_PRINTK(tw_dev->host, TW_DRIVER, 0x2e, "Found unaligned sgl address during execute scsi"); goto out; } } } - command_packet->sgl_entries__lunh = cpu_to_le16(TW_REQ_LUN_IN((srb->device->lun >> 4), tw_dev->srb[request_id]->use_sg)); + command_packet->sgl_entries__lunh = 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 = 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)) { + 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) { TW_PRINTK(tw_dev->host, TW_DRIVER, 0x2f, "Found unaligned sgl address during internal post"); goto out; } } - command_packet->sgl_entries__lunh = cpu_to_le16(TW_REQ_LUN_IN(0, use_sg)); + command_packet->sgl_entries__lunh = TW_REQ_LUN_IN(0, use_sg); } if (srb) { @@ -2118,11 +2119,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), - le32_to_cpu(*(int *)twa_get_param(tw_dev, 2, TW_INFORMATION_TABLE, - TW_PARAM_PORTCOUNT, TW_PARAM_PORTCOUNT_LENGTH))); + *(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, IRQF_SHARED, "3w-9xxx", tw_dev); + retval = request_irq(pdev->irq, twa_interrupt, SA_SHIRQ, "3w-9xxx", tw_dev); if (retval) { TW_PRINTK(tw_dev->host, TW_DRIVER, 0x30, "Error requesting IRQ"); goto out_remove_host; diff --git a/drivers/scsi/3w-9xxx.h b/drivers/scsi/3w-9xxx.h index e5685be96..1b16d57f0 100644 --- a/drivers/scsi/3w-9xxx.h +++ b/drivers/scsi/3w-9xxx.h @@ -2,9 +2,8 @@ 3w-9xxx.h -- 3ware 9000 Storage Controller device driver for Linux. Written By: Adam Radford - Modifications By: Tom Couch - Copyright (C) 2004-2006 Applied Micro Circuits Corporation. + Copyright (C) 2004-2005 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 @@ -288,6 +287,9 @@ static twa_message_type twa_error_table[] = { #define TW_STATUS_UNEXPECTED_BITS 0x00F00000 #define TW_STATUS_VALID_INTERRUPT 0x00DF0000 +/* RESPONSE QUEUE BIT DEFINITIONS */ +#define TW_RESPONSE_ID_MASK 0x00000FF0 + /* PCI related defines */ #define TW_NUMDEVICES 1 #define TW_PCI_CLEAR_PARITY_ERRORS 0xc100 @@ -469,7 +471,6 @@ printk(KERN_WARNING "3w-9xxx: ERROR: (0x%02X:0x%04X): %s.\n",a,b,c); \ #define TW_APACHE_MAX_SGL_LENGTH (sizeof(dma_addr_t) > 4 ? 72 : 109) #define TW_ESCALADE_MAX_SGL_LENGTH (sizeof(dma_addr_t) > 4 ? 41 : 62) #define TW_PADDING_LENGTH (sizeof(dma_addr_t) > 4 ? 8 : 0) -#define TW_CPU_TO_SGL(x) (sizeof(dma_addr_t) > 4 ? cpu_to_le64(x) : cpu_to_le32(x)) #pragma pack(1) @@ -613,6 +614,13 @@ typedef union TAG_TW_Response_Queue { u32 value; } TW_Response_Queue; +typedef struct TAG_TW_Info { + char *buffer; + int length; + int offset; + int position; +} TW_Info; + /* Compatibility information structure */ typedef struct TAG_TW_Compatibility_Info { @@ -628,8 +636,6 @@ typedef struct TAG_TW_Compatibility_Info unsigned short driver_build_low; } TW_Compatibility_Info; -#pragma pack() - typedef struct TAG_TW_Device_Extension { u32 __iomem *base_addr; unsigned long *generic_buffer_virt[TW_Q_LENGTH]; @@ -673,5 +679,7 @@ typedef struct TAG_TW_Device_Extension { unsigned short working_build; } TW_Device_Extension; +#pragma pack() + #endif /* _3W_9XXX_H */ diff --git a/drivers/scsi/3w-xxxx.c b/drivers/scsi/3w-xxxx.c index f3a5f422a..e8e41e6eb 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 < ARRAY_SIZE(tw_sense_table); i++) { + for (i=0;i<(sizeof(tw_sense_table)/sizeof(tw_sense_table[0]));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 = ARRAY_SIZE(tw_aen_string); + table_max = sizeof(tw_aen_string)/sizeof(char *); 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 = ARRAY_SIZE(tw_aen_string); + table_max = sizeof(tw_aen_string)/sizeof(char *); 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->request_buffer, cmd->use_sg, DMA_BIDIRECTIONAL); + use_sg = pci_map_sg(pdev, cmd->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, IRQF_SHARED, "3w-xxxx", tw_dev); + retval = request_irq(pdev->irq, tw_interrupt, SA_SHIRQ, "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 15ce40a70..4ce743860 100644 --- a/drivers/scsi/53c700.c +++ b/drivers/scsi/53c700.c @@ -114,6 +114,7 @@ * */ #define NCR_700_VERSION "2.8" +#include #include #include #include @@ -173,7 +174,6 @@ 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); @@ -238,6 +238,14 @@ static char *NCR_700_SBCL_to_phase[] = { "MSG IN", }; +static __u8 NCR_700_SDTR_msg[] = { + 0x01, /* Extended message */ + 0x03, /* Extended message Length */ + 0x01, /* SDTR Extended message */ + NCR_700_MIN_PERIOD, + NCR_700_MAX_OFFSET +}; + /* This translates the SDTR message offset and period to a value * which can be loaded into the SXFER_REG. * @@ -258,7 +266,7 @@ NCR_700_offset_period_to_sxfer(struct NCR_700_Host_Parameters *hostdata, return 0; if(period < hostdata->min_period) { - printk(KERN_WARNING "53c700: Period %dns is less than this chip's minimum, setting to %d\n", period*4, NCR_700_MIN_PERIOD*4); + printk(KERN_WARNING "53c700: Period %dns is less than this chip's minimum, setting to %d\n", period*4, NCR_700_SDTR_msg[3]*4); period = hostdata->min_period; } XFERP = (period*4 * hostdata->sync_clock)/1000 - 4; @@ -316,7 +324,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 +338,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,12 +363,14 @@ NCR_700_detect(struct scsi_host_template *tpnt, hostdata->slots[j].state = NCR_700_SLOT_FREE; } - for (j = 0; j < ARRAY_SIZE(SCRIPT); j++) + for(j = 0; j < sizeof(SCRIPT)/sizeof(SCRIPT[0]); 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); @@ -374,7 +384,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 = 8; + host->max_id = 7; host->max_lun = NCR_700_MAX_LUNS; BUG_ON(NCR_700_transport_template == NULL); host->transportt = NCR_700_transport_template; @@ -383,17 +393,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)" : ""); @@ -538,7 +548,6 @@ 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; @@ -588,7 +597,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->request_buffer, + dma_unmap_sg(hostdata->dev, SCp->buffer, SCp->use_sg, SCp->sc_data_direction); } else { dma_unmap_single(hostdata->dev, slot->dma_handle, @@ -609,24 +618,31 @@ 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 (slot->flags == NCR_700_FLAG_AUTOSENSE) { - char *cmnd = NCR_700_get_sense_cmnd(SCp->device); + if(SCp->cmnd[0] == REQUEST_SENSE && SCp->cmnd[6] == NCR_700_INTERNAL_SENSE_MAGIC) { #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 = cmnd[7]; - } else - NCR_700_unmap(hostdata, SCp, slot); - + 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; + + } free_slot(slot, hostdata); #ifdef NCR_700_DEBUG if(NCR_700_get_depth(SCp->device) == 0 || @@ -967,15 +983,13 @@ 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(slot->flags == NCR_700_FLAG_AUTOSENSE) { + if(SCp->cmnd[0] == REQUEST_SENSE) { /* 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", @@ -989,25 +1003,27 @@ process_script_interrupt(__u32 dsps, __u32 dsp, struct scsi_cmnd *SCp, * data associated with the command * here */ NCR_700_unmap(hostdata, SCp, slot); - 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; + + 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; /* 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 */ - 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); + 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); 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); @@ -1019,7 +1035,6 @@ 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; } @@ -1240,7 +1255,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->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); + 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); } } } @@ -1399,14 +1414,12 @@ 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 && - slot->flags != NCR_700_FLAG_AUTOSENSE), + hostdata->msgout[0] = NCR_700_identify(SCp->cmnd[0] != REQUEST_SENSE, 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 || - slot->flags == NCR_700_FLAG_AUTOSENSE) { + if(SCp->cmnd[0] == INQUIRY || SCp->cmnd[0] == REQUEST_SENSE) { NCR_700_clear_flag(SCp->device, NCR_700_DEV_NEGOTIATED_SYNC); } @@ -1415,16 +1428,17 @@ 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->flags != NCR_700_FLAG_AUTOSENSE)) { + && (slot->tag != SCSI_NO_TAG && SCp->cmnd[0] != REQUEST_SENSE)) { count += scsi_populate_tag_msg(SCp, &hostdata->msgout[count]); } if(hostdata->fast && NCR_700_is_flag_clear(SCp->device, NCR_700_DEV_NEGOTIATED_SYNC)) { - count += spi_populate_sync_msg(&hostdata->msgout[count], - spi_period(SCp->device->sdev_target), - spi_offset(SCp->device->sdev_target)); + memcpy(&hostdata->msgout[count], NCR_700_SDTR_msg, + sizeof(NCR_700_SDTR_msg)); + hostdata->msgout[count+3] = spi_period(SCp->device->sdev_target); + hostdata->msgout[count+4] = spi_offset(SCp->device->sdev_target); + count += sizeof(NCR_700_SDTR_msg); NCR_700_set_flag(SCp->device, NCR_700_DEV_BEGIN_SYNC_NEGOTIATION); } @@ -1529,7 +1543,7 @@ NCR_700_intr(int irq, void *dev_id, struct pt_regs *regs) /* clear all the negotiated parameters */ __shost_for_each_device(SDp, host) - NCR_700_clear_flag(SDp, ~0); + SDp->hostdata = NULL; /* clear all the slots and their pending commands */ for(i = 0; i < NCR_700_COMMAND_SLOTS_PER_HOST; i++) { @@ -1862,9 +1876,8 @@ 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->request_buffer, SCp->use_sg, - direction); + sg_count = dma_map_sg(hostdata->dev, SCp->buffer, + SCp->use_sg, direction); } else { vPtr = dma_map_single(hostdata->dev, SCp->request_buffer, @@ -1879,7 +1892,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->request_buffer; + struct scatterlist *sg = SCp->buffer; vPtr = sg_dma_address(&sg[i]); count = sg_dma_len(&sg[i]); @@ -1939,7 +1952,7 @@ NCR_700_abort(struct scsi_cmnd * SCp) STATIC int NCR_700_bus_reset(struct scsi_cmnd * SCp) { - DECLARE_COMPLETION_ONSTACK(complete); + DECLARE_COMPLETION(complete); struct NCR_700_Host_Parameters *hostdata = (struct NCR_700_Host_Parameters *)SCp->device->host->hostdata[0]; @@ -2034,17 +2047,7 @@ 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) @@ -2075,8 +2078,7 @@ NCR_700_slave_configure(struct scsi_device *SDp) STATIC void NCR_700_slave_destroy(struct scsi_device *SDp) { - kfree(SDp->hostdata); - SDp->hostdata = NULL; + /* to do here: deallocate memory */ } static int diff --git a/drivers/scsi/53c700.h b/drivers/scsi/53c700.h index 97ebe71b7..a8c83bb03 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,16 +76,11 @@ struct NCR_700_SG_List { #define SCRIPT_RETURN 0x90080000 }; -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: +/* 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: * * If DEV_NEGOTIATED_SYNC not set, tack and SDTR message on to the * initial identify for the device and set DEV_BEGIN_SYNC_NEGOTATION @@ -103,26 +98,19 @@ struct NCR_700_Device_Parameters { #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) { - struct NCR_700_Device_Parameters *hostdata = SDp->hostdata; + long l = (long)SDp->hostdata; - hostdata->depth = depth; + l &= 0xffff00ff; + l |= 0xff00 & (depth << 8); + SDp->hostdata = (void *)l; } static inline __u8 NCR_700_get_depth(struct scsi_device *SDp) { - struct NCR_700_Device_Parameters *hostdata = SDp->hostdata; - - return hostdata->depth; + return ((((unsigned long)SDp->hostdata) & 0xff00)>>8); } static inline int NCR_700_is_flag_set(struct scsi_device *SDp, __u32 flag) @@ -175,8 +163,6 @@ 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; @@ -486,7 +472,8 @@ NCR_700_readl(struct Scsi_Host *host, __u32 reg) ioread32(hostdata->base + reg); #if 1 /* sanity check the register */ - BUG_ON((reg & 0x3) != 0); + if((reg & 0x3) != 0) + BUG(); #endif return value; @@ -509,7 +496,8 @@ NCR_700_writel(__u32 value, struct Scsi_Host *host, __u32 reg) #if 1 /* sanity check the register */ - BUG_ON((reg & 0x3) != 0); + if((reg & 0x3) != 0) + BUG(); #endif bEBus ? iowrite32be(value, hostdata->base + reg): diff --git a/drivers/scsi/53c7xx.c b/drivers/scsi/53c7xx.c index acf292736..7894b8ea8 100644 --- a/drivers/scsi/53c7xx.c +++ b/drivers/scsi/53c7xx.c @@ -232,6 +232,7 @@ #include +#include #include #include @@ -360,7 +361,7 @@ int CmdPageStart = (0 - Ent_dsa_zero - sizeof(struct NCR53c7x0_cmd)) & 0xff; static char *setup_strings[] = {"","","","","","","",""}; -#define MAX_SETUP_STRINGS ARRAY_SIZE(setup_strings) +#define MAX_SETUP_STRINGS (sizeof(setup_strings) / sizeof(char *)) #define SETUP_BUFFER_SIZE 200 static char setup_buffer[SETUP_BUFFER_SIZE]; static char setup_used[MAX_SETUP_STRINGS]; @@ -708,7 +709,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; @@ -1070,7 +1071,7 @@ NCR53c7x0_init (struct Scsi_Host *host) { NCR53c7x0_driver_init (host); - if (request_irq(host->irq, NCR53c7x0_intr, IRQF_SHARED, "53c7xx", host)) + if (request_irq(host->irq, NCR53c7x0_intr, SA_SHIRQ, "53c7xx", host)) { printk("scsi%d : IRQ%d not free, detaching\n", host->host_no, host->irq); @@ -2189,15 +2190,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 */ @@ -2208,14 +2209,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 = ARRAY_SIZE(syncs) - 1; + limit = (sizeof(syncs) / sizeof(syncs[0]) -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); @@ -3451,12 +3452,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->request_buffer)[i].page)+ - ((struct scatterlist *)cmd->request_buffer)[i].offset + ? (u32)page_address(((struct scatterlist *)cmd->buffer)[i].page)+ + ((struct scatterlist *)cmd->buffer)[i].offset : (u32)(cmd->request_buffer); u32 bbuf = virt_to_bus((void *)vbuf); u32 count = cmd->use_sg ? - ((struct scatterlist *)cmd->request_buffer)[i].length : + ((struct scatterlist *)cmd->buffer)[i].length : cmd->request_bufflen; /* @@ -3621,7 +3622,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) { @@ -4232,7 +4233,7 @@ restart: * Purpose : handle NCR53c7x0 interrupts for all NCR devices sharing * the same IRQ line. * - * Inputs : Since we're using the IRQF_DISABLED interrupt handler + * Inputs : Since we're using the SA_INTERRUPT interrupt handler * semantics, irq indicates the interrupt which invoked * this handler. * @@ -5417,7 +5418,7 @@ insn_to_offset (Scsi_Cmnd *cmd, u32 *insn) { if ((buffers = cmd->use_sg)) { for (offset = 0, - segment = (struct scatterlist *) cmd->request_buffer; + segment = (struct scatterlist *) cmd->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 16a12a3b7..1c4593432 100644 --- a/drivers/scsi/BusLogic.c +++ b/drivers/scsi/BusLogic.c @@ -29,6 +29,7 @@ #define BusLogic_DriverVersion "2.1.16" #define BusLogic_DriverDate "18 July 2002" +#include #include #include #include @@ -40,8 +41,6 @@ #include #include #include -#include -#include #include #include @@ -677,7 +676,7 @@ static int __init BusLogic_InitializeMultiMasterProbeInfo(struct BusLogic_HostAd if (pci_enable_device(PCI_Device)) continue; - if (pci_set_dma_mask(PCI_Device, DMA_32BIT_MASK )) + if (pci_set_dma_mask(PCI_Device, (u64) 0xffffffff)) continue; Bus = PCI_Device->bus->number; @@ -832,7 +831,7 @@ static int __init BusLogic_InitializeMultiMasterProbeInfo(struct BusLogic_HostAd if (pci_enable_device(PCI_Device)) continue; - if (pci_set_dma_mask(PCI_Device, DMA_32BIT_MASK)) + if (pci_set_dma_mask(PCI_Device, (u64) 0xffffffff)) continue; Bus = PCI_Device->bus->number; @@ -886,7 +885,7 @@ static int __init BusLogic_InitializeFlashPointProbeInfo(struct BusLogic_HostAda if (pci_enable_device(PCI_Device)) continue; - if (pci_set_dma_mask(PCI_Device, DMA_32BIT_MASK)) + if (pci_set_dma_mask(PCI_Device, (u64) 0xffffffff)) continue; Bus = PCI_Device->bus->number; @@ -1844,7 +1843,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, IRQF_SHARED, HostAdapter->FullModelName, HostAdapter) < 0) { + if (request_irq(HostAdapter->IRQ_Channel, BusLogic_InterruptHandler, SA_SHIRQ, HostAdapter->FullModelName, HostAdapter) < 0) { BusLogic_Error("UNABLE TO ACQUIRE IRQ CHANNEL %d - DETACHING\n", HostAdapter, HostAdapter->IRQ_Channel); return false; } @@ -2897,7 +2896,7 @@ static int BusLogic_QueueCommand(struct scsi_cmnd *Command, void (*CompletionRou */ if (HostAdapter->ActiveCommands[TargetID] == 0) HostAdapter->LastSequencePoint[TargetID] = jiffies; - else if (time_after(jiffies, HostAdapter->LastSequencePoint[TargetID] + 4 * HZ)) { + else if (jiffies - HostAdapter->LastSequencePoint[TargetID] > 4 * HZ) { HostAdapter->LastSequencePoint[TargetID] = jiffies; QueueTag = BusLogic_OrderedQueueTag; } diff --git a/drivers/scsi/BusLogic.h b/drivers/scsi/BusLogic.h index 9792e5af5..1aaa6569e 100644 --- a/drivers/scsi/BusLogic.h +++ b/drivers/scsi/BusLogic.h @@ -28,6 +28,7 @@ #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 7c0068049..8d64f0bed 100644 --- a/drivers/scsi/FlashPoint.c +++ b/drivers/scsi/FlashPoint.c @@ -16,44 +16,115 @@ */ +#include + + #ifndef CONFIG_SCSI_OMIT_FLASHPOINT + #define MAX_CARDS 8 #undef BUSTYPE_PCI + +#define OS_InPortByte(port) inb(port) +#define OS_InPortWord(port) inw(port) +#define OS_InPortLong(port) inl(port) +#define OS_OutPortByte(port, value) outb(value, port) +#define OS_OutPortWord(port, value) outw(value, port) +#define OS_OutPortLong(port, value) outl(value, port) + + +/* + Define name replacements for compatibility with the Linux BusLogic Driver. +*/ + +#define SccbMgr_sense_adapter FlashPoint_ProbeHostAdapter +#define SccbMgr_config_adapter FlashPoint_HardwareResetHostAdapter +#define SccbMgr_unload_card FlashPoint_ReleaseHostAdapter +#define SccbMgr_start_sccb FlashPoint_StartCCB +#define SccbMgr_abort_sccb FlashPoint_AbortCCB +#define SccbMgr_my_int FlashPoint_InterruptPending +#define SccbMgr_isr FlashPoint_HandleInterrupt + + +#define MAX_CDBLEN 12 + +#define SCAM_LEV_2 1 + #define CRCMASK 0xA001 +#define BL_VENDOR_ID 0x104B +#define FP_DEVICE_ID 0x8130 +#define MM_DEVICE_ID 0x1040 + + #define FAILURE 0xFFFFFFFFL -#define BIT(x) ((unsigned char)(1<<(x))) /* single-bit mask in bit position x */ -#define BITW(x) ((unsigned short)(1<<(x))) /* single-bit mask in bit position x */ - -struct sccb; -typedef void (*CALL_BK_FN) (struct sccb *); - -struct sccb_mgr_info { - unsigned long si_baseaddr; - unsigned char si_present; - unsigned char si_intvect; - unsigned char si_id; - unsigned char si_lun; - unsigned short si_fw_revision; - unsigned short si_per_targ_init_sync; - unsigned short si_per_targ_fast_nego; - unsigned short si_per_targ_ultra_nego; - unsigned short si_per_targ_no_disc; - unsigned short si_per_targ_wide_nego; - unsigned short si_flags; - unsigned char si_card_family; - unsigned char si_bustype; - unsigned char si_card_model[3]; - unsigned char si_relative_cardnum; - unsigned char si_reserved[4]; - unsigned long si_OS_reserved; - unsigned char si_XlatInfo[4]; - unsigned long si_reserved2[5]; - unsigned long si_secondary_range; -}; + +typedef unsigned char UCHAR; +typedef unsigned short USHORT; +typedef unsigned int UINT; +typedef unsigned long ULONG; +typedef unsigned char * PUCHAR; +typedef unsigned short* PUSHORT; +typedef unsigned long * PULONG; +typedef void * PVOID; + + +typedef unsigned char * uchar_ptr; +typedef unsigned short * ushort_ptr; +typedef unsigned long * ulong_ptr; + + +#define s08bits char +#define s16bits short +#define s32bits long + +#define u08bits unsigned s08bits +#define u16bits unsigned s16bits +#define u32bits unsigned s32bits + +typedef u08bits * pu08bits; +typedef u16bits * pu16bits; +typedef u32bits * pu32bits; + + +#define BIT(x) ((UCHAR)(1<<(x))) /* single-bit mask in bit position x */ +#define BITW(x) ((USHORT)(1<<(x))) /* single-bit mask in bit position x */ + + + + +typedef struct _SCCB *PSCCB; +typedef void (*CALL_BK_FN)(PSCCB); + + +typedef struct SCCBMgr_info { + ULONG si_baseaddr; + UCHAR si_present; + UCHAR si_intvect; + UCHAR si_id; + UCHAR si_lun; + USHORT si_fw_revision; + USHORT si_per_targ_init_sync; + USHORT si_per_targ_fast_nego; + USHORT si_per_targ_ultra_nego; + USHORT si_per_targ_no_disc; + USHORT si_per_targ_wide_nego; + USHORT si_flags; + UCHAR si_card_family; + UCHAR si_bustype; + UCHAR si_card_model[3]; + UCHAR si_relative_cardnum; + UCHAR si_reserved[4]; + ULONG si_OS_reserved; + UCHAR si_XlatInfo[4]; + ULONG si_reserved2[5]; + ULONG si_secondary_range; +} SCCBMGR_INFO; + +typedef SCCBMGR_INFO * PSCCBMGR_INFO; + #define SCSI_PARITY_ENA 0x0001 #define LOW_BYTE_TERM 0x0010 @@ -67,81 +138,107 @@ struct sccb_mgr_info { #define FLAG_SCAM_ENABLED 0x0080 #define FLAG_SCAM_LEVEL2 0x0100 + + + #define HARPOON_FAMILY 0x02 + +#define ISA_BUS_CARD 0x01 +#define EISA_BUS_CARD 0x02 +#define PCI_BUS_CARD 0x03 +#define VESA_BUS_CARD 0x04 + /* SCCB struct used for both SCCB and UCB manager compiles! * The UCB Manager treats the SCCB as it's 'native hardware structure' */ + #pragma pack(1) -struct sccb { - unsigned char OperationCode; - unsigned char ControlByte; - unsigned char CdbLength; - unsigned char RequestSenseLength; - unsigned long DataLength; - unsigned long DataPointer; - unsigned char CcbRes[2]; - unsigned char HostStatus; - unsigned char TargetStatus; - unsigned char TargID; - unsigned char Lun; - unsigned char Cdb[12]; - unsigned char CcbRes1; - unsigned char Reserved1; - unsigned long Reserved2; - unsigned long SensePointer; - - CALL_BK_FN SccbCallback; /* VOID (*SccbCallback)(); */ - unsigned long SccbIOPort; /* Identifies board base port */ - unsigned char SccbStatus; - unsigned char SCCBRes2; - unsigned short SccbOSFlags; - - unsigned long Sccb_XferCnt; /* actual transfer count */ - unsigned long Sccb_ATC; - unsigned long SccbVirtDataPtr; /* virtual addr for OS/2 */ - unsigned long Sccb_res1; - unsigned short Sccb_MGRFlags; - unsigned short Sccb_sgseg; - unsigned char Sccb_scsimsg; /* identify msg for selection */ - unsigned char Sccb_tag; - unsigned char Sccb_scsistat; - unsigned char Sccb_idmsg; /* image of last msg in */ - struct sccb *Sccb_forwardlink; - struct sccb *Sccb_backlink; - unsigned long Sccb_savedATC; - unsigned char Save_Cdb[6]; - unsigned char Save_CdbLen; - unsigned char Sccb_XferState; - unsigned long Sccb_SGoffset; -}; +typedef struct _SCCB { + UCHAR OperationCode; + UCHAR ControlByte; + UCHAR CdbLength; + UCHAR RequestSenseLength; + ULONG DataLength; + ULONG DataPointer; + UCHAR CcbRes[2]; + UCHAR HostStatus; + UCHAR TargetStatus; + UCHAR TargID; + UCHAR Lun; + UCHAR Cdb[12]; + UCHAR CcbRes1; + UCHAR Reserved1; + ULONG Reserved2; + ULONG SensePointer; + + + CALL_BK_FN SccbCallback; /* VOID (*SccbCallback)(); */ + ULONG SccbIOPort; /* Identifies board base port */ + UCHAR SccbStatus; + UCHAR SCCBRes2; + USHORT SccbOSFlags; + + + ULONG Sccb_XferCnt; /* actual transfer count */ + ULONG Sccb_ATC; + ULONG SccbVirtDataPtr; /* virtual addr for OS/2 */ + ULONG Sccb_res1; + USHORT Sccb_MGRFlags; + USHORT Sccb_sgseg; + UCHAR Sccb_scsimsg; /* identify msg for selection */ + UCHAR Sccb_tag; + UCHAR Sccb_scsistat; + UCHAR Sccb_idmsg; /* image of last msg in */ + PSCCB Sccb_forwardlink; + PSCCB Sccb_backlink; + ULONG Sccb_savedATC; + UCHAR Save_Cdb[6]; + UCHAR Save_CdbLen; + UCHAR Sccb_XferState; + ULONG Sccb_SGoffset; + } SCCB; + +#define SCCB_SIZE sizeof(SCCB) #pragma pack() + + +#define SCSI_INITIATOR_COMMAND 0x00 +#define TARGET_MODE_COMMAND 0x01 #define SCATTER_GATHER_COMMAND 0x02 #define RESIDUAL_COMMAND 0x03 #define RESIDUAL_SG_COMMAND 0x04 #define RESET_COMMAND 0x81 -#define F_USE_CMD_Q 0x20 /*Inidcates TAGGED command. */ -#define TAG_TYPE_MASK 0xC0 /*Type of tag msg to send. */ -#define SCCB_DATA_XFER_OUT 0x10 /* Write */ -#define SCCB_DATA_XFER_IN 0x08 /* Read */ -#define NO_AUTO_REQUEST_SENSE 0x01 /* No Request Sense Buffer */ +#define F_USE_CMD_Q 0x20 /*Inidcates TAGGED command. */ +#define TAG_TYPE_MASK 0xC0 /*Type of tag msg to send. */ +#define TAG_Q_MASK 0xE0 +#define SCCB_DATA_XFER_OUT 0x10 /* Write */ +#define SCCB_DATA_XFER_IN 0x08 /* Read */ -#define BUS_FREE_ST 0 + +#define FOURTEEN_BYTES 0x00 /* Request Sense Buffer size */ +#define NO_AUTO_REQUEST_SENSE 0x01 /* No Request Sense Buffer */ + + +#define BUS_FREE_ST 0 #define SELECT_ST 1 -#define SELECT_BDR_ST 2 /* Select w\ Bus Device Reset */ -#define SELECT_SN_ST 3 /* Select w\ Sync Nego */ -#define SELECT_WN_ST 4 /* Select w\ Wide Data Nego */ -#define SELECT_Q_ST 5 /* Select w\ Tagged Q'ing */ +#define SELECT_BDR_ST 2 /* Select w\ Bus Device Reset */ +#define SELECT_SN_ST 3 /* Select w\ Sync Nego */ +#define SELECT_WN_ST 4 /* Select w\ Wide Data Nego */ +#define SELECT_Q_ST 5 /* Select w\ Tagged Q'ing */ #define COMMAND_ST 6 #define DATA_OUT_ST 7 #define DATA_IN_ST 8 #define DISCONNECT_ST 9 +#define STATUS_ST 10 #define ABORT_ST 11 +#define MESSAGE_ST 12 + #define F_HOST_XFER_DIR 0x01 #define F_ALL_XFERRED 0x02 @@ -150,115 +247,163 @@ struct sccb { #define F_ODD_BALL_CNT 0x10 #define F_NO_DATA_YET 0x80 + #define F_STATUSLOADED 0x01 +#define F_MSGLOADED 0x02 #define F_DEV_SELECTED 0x04 -#define SCCB_COMPLETE 0x00 /* SCCB completed without error */ + +#define SCCB_COMPLETE 0x00 /* SCCB completed without error */ #define SCCB_DATA_UNDER_RUN 0x0C -#define SCCB_SELECTION_TIMEOUT 0x11 /* Set SCSI selection timed out */ +#define SCCB_SELECTION_TIMEOUT 0x11 /* Set SCSI selection timed out */ #define SCCB_DATA_OVER_RUN 0x12 -#define SCCB_PHASE_SEQUENCE_FAIL 0x14 /* Target bus phase sequence failure */ +#define SCCB_UNEXPECTED_BUS_FREE 0x13 /* Target dropped SCSI BSY */ +#define SCCB_PHASE_SEQUENCE_FAIL 0x14 /* Target bus phase sequence failure */ + +#define SCCB_INVALID_OP_CODE 0x16 /* SCCB invalid operation code */ +#define SCCB_INVALID_SCCB 0x1A /* Invalid SCCB - bad parameter */ +#define SCCB_GROSS_FW_ERR 0x27 /* Major problem! */ +#define SCCB_BM_ERR 0x30 /* BusMaster error. */ +#define SCCB_PARITY_ERR 0x34 /* SCSI parity error */ + + + +#define SCCB_INVALID_DIRECTION 0x18 /* Invalid target direction */ +#define SCCB_DUPLICATE_SCCB 0x19 /* Duplicate SCCB */ +#define SCCB_SCSI_RST 0x35 /* SCSI RESET detected. */ -#define SCCB_GROSS_FW_ERR 0x27 /* Major problem! */ -#define SCCB_BM_ERR 0x30 /* BusMaster error. */ -#define SCCB_PARITY_ERR 0x34 /* SCSI parity error */ #define SCCB_IN_PROCESS 0x00 #define SCCB_SUCCESS 0x01 #define SCCB_ABORT 0x02 +#define SCCB_NOT_FOUND 0x03 #define SCCB_ERROR 0x04 +#define SCCB_INVALID 0x05 + +#define SCCB_SIZE sizeof(SCCB) + #define ORION_FW_REV 3110 -#define QUEUE_DEPTH 254+1 /*1 for Normal disconnect 32 for Q'ing. */ +#define HARP_REVD 1 -#define MAX_MB_CARDS 4 /* Max. no of cards suppoerted on Mother Board */ + +#define QUEUE_DEPTH 254+1 /*1 for Normal disconnect 32 for Q'ing. */ + +#define MAX_MB_CARDS 4 /* Max. no of cards suppoerted on Mother Board */ + +#define WIDE_SCSI 1 #define MAX_SCSI_TAR 16 #define MAX_LUN 32 #define LUN_MASK 0x1f -#define SG_BUF_CNT 16 /*Number of prefetched elements. */ +#if defined(HARP_REVA) +#define SG_BUF_CNT 15 /*Number of prefetched elements. */ +#else +#define SG_BUF_CNT 16 /*Number of prefetched elements. */ +#endif + +#define SG_ELEMENT_SIZE 8 /*Eight byte per element. */ +#define SG_LOCAL_MASK 0x00000000L +#define SG_ELEMENT_MASK 0xFFFFFFFFL -#define SG_ELEMENT_SIZE 8 /*Eight byte per element. */ -#define RD_HARPOON(ioport) inb((u32)ioport) -#define RDW_HARPOON(ioport) inw((u32)ioport) -#define RD_HARP32(ioport,offset,data) (data = inl((u32)(ioport + offset))) -#define WR_HARPOON(ioport,val) outb((u8) val, (u32)ioport) -#define WRW_HARPOON(ioport,val) outw((u16)val, (u32)ioport) -#define WR_HARP32(ioport,offset,data) outl(data, (u32)(ioport + offset)) +#define RD_HARPOON(ioport) OS_InPortByte((u32bits)ioport) +#define RDW_HARPOON(ioport) OS_InPortWord((u32bits)ioport) +#define RD_HARP32(ioport,offset,data) (data = OS_InPortLong((u32bits)(ioport + offset))) +#define WR_HARPOON(ioport,val) OS_OutPortByte((u32bits)ioport,(u08bits) val) +#define WRW_HARPOON(ioport,val) OS_OutPortWord((u32bits)ioport,(u16bits)val) +#define WR_HARP32(ioport,offset,data) OS_OutPortLong((u32bits)(ioport + offset), data) + #define TAR_SYNC_MASK (BIT(7)+BIT(6)) +#define SYNC_UNKNOWN 0x00 #define SYNC_TRYING BIT(6) #define SYNC_SUPPORTED (BIT(7)+BIT(6)) #define TAR_WIDE_MASK (BIT(5)+BIT(4)) +#define WIDE_DISABLED 0x00 #define WIDE_ENABLED BIT(4) #define WIDE_NEGOCIATED BIT(5) #define TAR_TAG_Q_MASK (BIT(3)+BIT(2)) +#define TAG_Q_UNKNOWN 0x00 #define TAG_Q_TRYING BIT(2) #define TAG_Q_REJECT BIT(3) +#define TAG_Q_SUPPORTED (BIT(3)+BIT(2)) #define TAR_ALLOW_DISC BIT(0) + #define EE_SYNC_MASK (BIT(0)+BIT(1)) +#define EE_SYNC_ASYNC 0x00 #define EE_SYNC_5MB BIT(0) #define EE_SYNC_10MB BIT(1) #define EE_SYNC_20MB (BIT(0)+BIT(1)) +#define EE_ALLOW_DISC BIT(6) #define EE_WIDE_SCSI BIT(7) -struct sccb_mgr_tar_info { - - struct sccb *TarSelQ_Head; - struct sccb *TarSelQ_Tail; - unsigned char TarLUN_CA; /*Contingent Allgiance */ - unsigned char TarTagQ_Cnt; - unsigned char TarSelQ_Cnt; - unsigned char TarStatus; - unsigned char TarEEValue; - unsigned char TarSyncCtrl; - unsigned char TarReserved[2]; /* for alignment */ - unsigned char LunDiscQ_Idx[MAX_LUN]; - unsigned char TarLUNBusy[MAX_LUN]; -}; - -struct nvram_info { - unsigned char niModel; /* Model No. of card */ - unsigned char niCardNo; /* Card no. */ - unsigned long niBaseAddr; /* Port Address of card */ - unsigned char niSysConf; /* Adapter Configuration byte - Byte 16 of eeprom map */ - unsigned char niScsiConf; /* SCSI Configuration byte - Byte 17 of eeprom map */ - unsigned char niScamConf; /* SCAM Configuration byte - Byte 20 of eeprom map */ - unsigned char niAdapId; /* Host Adapter ID - Byte 24 of eerpom map */ - unsigned char niSyncTbl[MAX_SCSI_TAR / 2]; /* Sync/Wide byte of targets */ - unsigned char niScamTbl[MAX_SCSI_TAR][4]; /* Compressed Scam name string of Targets */ -}; + +typedef struct SCCBMgr_tar_info *PSCCBMgr_tar_info; + + +typedef struct SCCBMgr_tar_info { + + PSCCB TarSelQ_Head; + PSCCB TarSelQ_Tail; + UCHAR TarLUN_CA; /*Contingent Allgiance */ + UCHAR TarTagQ_Cnt; + UCHAR TarSelQ_Cnt; + UCHAR TarStatus; + UCHAR TarEEValue; + UCHAR TarSyncCtrl; + UCHAR TarReserved[2]; /* for alignment */ + UCHAR LunDiscQ_Idx[MAX_LUN]; + UCHAR TarLUNBusy[MAX_LUN]; +} SCCBMGR_TAR_INFO; + +typedef struct NVRAMInfo { + UCHAR niModel; /* Model No. of card */ + UCHAR niCardNo; /* Card no. */ + ULONG niBaseAddr; /* Port Address of card */ + UCHAR niSysConf; /* Adapter Configuration byte - Byte 16 of eeprom map */ + UCHAR niScsiConf; /* SCSI Configuration byte - Byte 17 of eeprom map */ + UCHAR niScamConf; /* SCAM Configuration byte - Byte 20 of eeprom map */ + UCHAR niAdapId; /* Host Adapter ID - Byte 24 of eerpom map */ + UCHAR niSyncTbl[MAX_SCSI_TAR / 2]; /* Sync/Wide byte of targets */ + UCHAR niScamTbl[MAX_SCSI_TAR][4]; /* Compressed Scam name string of Targets */ +}NVRAMINFO; + +typedef NVRAMINFO *PNVRamInfo; #define MODEL_LT 1 #define MODEL_DL 2 #define MODEL_LW 3 #define MODEL_DW 4 -struct sccb_card { - struct sccb *currentSCCB; - struct sccb_mgr_info *cardInfo; - unsigned long ioPort; +typedef struct SCCBcard { + PSCCB currentSCCB; + PSCCBMGR_INFO cardInfo; - unsigned short cmdCounter; - unsigned char discQCount; - unsigned char tagQ_Lst; - unsigned char cardIndex; - unsigned char scanIndex; - unsigned char globalFlags; - unsigned char ourId; - struct nvram_info *pNvRamInfo; - struct sccb *discQ_Tbl[QUEUE_DEPTH]; + ULONG ioPort; + + USHORT cmdCounter; + UCHAR discQCount; + UCHAR tagQ_Lst; + UCHAR cardIndex; + UCHAR scanIndex; + UCHAR globalFlags; + UCHAR ourId; + PNVRamInfo pNvRamInfo; + PSCCB discQ_Tbl[QUEUE_DEPTH]; + +}SCCBCARD; + +typedef struct SCCBcard *PSCCBcard; -}; #define F_TAG_STARTED 0x01 #define F_CONLUN_IO 0x02 @@ -269,10 +414,13 @@ struct sccb_card { #define F_NEW_SCCB_CMD 0x40 #define F_UPDATE_EEPROM 0x80 + #define ID_STRING_LENGTH 32 -#define TYPE_CODE0 0x63 /*Level2 Mstr (bits 7-6), */ +#define TYPE_CODE0 0x63 /*Level2 Mstr (bits 7-6), */ + +#define TYPE_CODE1 00 /*No ID yet */ -#define SLV_TYPE_CODE0 0xA3 /*Priority Bit set (bits 7-6), */ +#define SLV_TYPE_CODE0 0xA3 /*Priority Bit set (bits 7-6), */ #define ASSIGN_ID 0x00 #define SET_P_FLAG 0x01 @@ -282,42 +430,97 @@ struct sccb_card { #define ID_0_7 0x18 #define ID_8_F 0x11 +#define ID_10_17 0x12 +#define ID_18_1F 0x0B #define MISC_CODE 0x14 #define CLR_P_FLAG 0x18 +#define LOCATE_ON 0x12 +#define LOCATE_OFF 0x0B + +#define LVL_1_MST 0x00 +#define LVL_2_MST 0x40 +#define DOM_LVL_2 0xC0 + #define INIT_SELTD 0x01 #define LEVEL2_TAR 0x02 -enum scam_id_st { ID0, ID1, ID2, ID3, ID4, ID5, ID6, ID7, ID8, ID9, ID10, ID11, - ID12, - ID13, ID14, ID15, ID_UNUSED, ID_UNASSIGNED, ID_ASSIGNED, LEGACY, - CLR_PRIORITY, NO_ID_AVAIL -}; + +enum scam_id_st { ID0,ID1,ID2,ID3,ID4,ID5,ID6,ID7,ID8,ID9,ID10,ID11,ID12, + ID13,ID14,ID15,ID_UNUSED,ID_UNASSIGNED,ID_ASSIGNED,LEGACY, + CLR_PRIORITY,NO_ID_AVAIL }; typedef struct SCCBscam_info { - unsigned char id_string[ID_STRING_LENGTH]; - enum scam_id_st state; + UCHAR id_string[ID_STRING_LENGTH]; + enum scam_id_st state; + +} SCCBSCAM_INFO, *PSCCBSCAM_INFO; -} SCCBSCAM_INFO; +#define SCSI_TEST_UNIT_READY 0x00 +#define SCSI_REZERO_UNIT 0x01 #define SCSI_REQUEST_SENSE 0x03 +#define SCSI_FORMAT_UNIT 0x04 +#define SCSI_REASSIGN 0x07 #define SCSI_READ 0x08 #define SCSI_WRITE 0x0A +#define SCSI_SEEK 0x0B +#define SCSI_INQUIRY 0x12 +#define SCSI_MODE_SELECT 0x15 +#define SCSI_RESERVE_UNIT 0x16 +#define SCSI_RELEASE_UNIT 0x17 +#define SCSI_MODE_SENSE 0x1A #define SCSI_START_STOP_UNIT 0x1B +#define SCSI_SEND_DIAGNOSTIC 0x1D +#define SCSI_READ_CAPACITY 0x25 #define SCSI_READ_EXTENDED 0x28 #define SCSI_WRITE_EXTENDED 0x2A +#define SCSI_SEEK_EXTENDED 0x2B #define SCSI_WRITE_AND_VERIFY 0x2E +#define SCSI_VERIFY 0x2F +#define SCSI_READ_DEFECT_DATA 0x37 +#define SCSI_WRITE_BUFFER 0x3B +#define SCSI_READ_BUFFER 0x3C +#define SCSI_RECV_DIAGNOSTIC 0x1C +#define SCSI_READ_LONG 0x3E +#define SCSI_WRITE_LONG 0x3F +#define SCSI_LAST_SCSI_CMND SCSI_WRITE_LONG +#define SCSI_INVALID_CMND 0xFF + + #define SSGOOD 0x00 #define SSCHECK 0x02 +#define SSCOND_MET 0x04 +#define SSBUSY 0x08 +#define SSRESERVATION_CONFLICT 0x18 +#define SSCMD_TERM 0x22 #define SSQ_FULL 0x28 + +#define SKNO_SEN 0x00 +#define SKRECOV_ERR 0x01 +#define SKNOT_RDY 0x02 +#define SKMED_ERR 0x03 +#define SKHW_ERR 0x04 +#define SKILL_REQ 0x05 +#define SKUNIT_ATTN 0x06 +#define SKDATA_PROTECT 0x07 +#define SKBLNK_CHK 0x08 +#define SKCPY_ABORT 0x0A +#define SKABORT_CMD 0x0B +#define SKEQUAL 0x0C +#define SKVOL_OVF 0x0D +#define SKMIS_CMP 0x0E + + #define SMCMD_COMP 0x00 #define SMEXT 0x01 #define SMSAVE_DATA_PTR 0x02 #define SMREST_DATA_PTR 0x03 #define SMDISC 0x04 +#define SMINIT_DETEC_ERR 0x05 #define SMABORT 0x06 #define SMREJECT 0x07 #define SMNO_OP 0x08 @@ -330,31 +533,62 @@ typedef struct SCCBscam_info { #define SMIDENT 0x80 #define DISC_PRIV 0x40 + #define SMSYNC 0x01 +#define SM10MBS 0x19 /* 100ns */ +#define SM5MBS 0x32 /* 200ns */ +#define SMOFFSET 0x0F /* Maxoffset value */ #define SMWDTR 0x03 #define SM8BIT 0x00 #define SM16BIT 0x01 -#define SMIGNORWR 0x23 /* Ignore Wide Residue */ +#define SM32BIT 0x02 +#define SMIGNORWR 0x23 /* Ignore Wide Residue */ + + +#define ARBITRATION_DELAY 0x01 /* 2.4us using a 40Mhz clock */ +#define BUS_SETTLE_DELAY 0x01 /* 400ns */ +#define BUS_CLEAR_DELAY 0x01 /* 800ns */ + + + +#define SPHASE_TO 0x0A /* 10 second timeout waiting for */ +#define SCMD_TO 0x0F /* Overall command timeout */ + + #define SIX_BYTE_CMD 0x06 +#define TEN_BYTE_CMD 0x0A #define TWELVE_BYTE_CMD 0x0C #define ASYNC 0x00 -#define MAX_OFFSET 0x0F /* Maxbyteoffset for Sync Xfers */ +#define PERI25NS 0x06 /* 25/4ns to next clock for xbow. */ +#define SYNC10MBS 0x19 +#define SYNC5MBS 0x32 +#define MAX_OFFSET 0x0F /* Maxbyteoffset for Sync Xfers */ + #define EEPROM_WD_CNT 256 #define EEPROM_CHECK_SUM 0 #define FW_SIGNATURE 2 #define MODEL_NUMB_0 4 +#define MODEL_NUMB_1 5 #define MODEL_NUMB_2 6 +#define MODEL_NUMB_3 7 #define MODEL_NUMB_4 8 +#define MODEL_NUMB_5 9 +#define IO_BASE_ADDR 10 +#define IRQ_NUMBER 12 +#define PCI_INT_PIN 13 +#define BUS_DELAY 14 /*On time in byte 14 off delay in 15 */ #define SYSTEM_CONFIG 16 #define SCSI_CONFIG 17 #define BIOS_CONFIG 18 +#define SPIN_UP_DELAY 19 #define SCAM_CONFIG 20 #define ADAPTER_SCSI_ID 24 + #define IGNORE_B_SCAN 32 #define SEND_START_ENA 34 #define DEVICE_ENABLE 36 @@ -369,405 +603,717 @@ typedef struct SCCBscam_info { #define SYNC_RATE_TBLcd 50 #define SYNC_RATE_TBLef 52 -#define EE_SCAMBASE 256 -#define SCAM_ENABLED BIT(2) -#define SCAM_LEVEL2 BIT(3) -#define RENEGO_ENA BITW(10) -#define CONNIO_ENA BITW(11) -#define GREEN_PC_ENA BITW(12) +#define EE_SCAMBASE 256 + + -#define AUTO_RATE_00 00 -#define AUTO_RATE_05 01 -#define AUTO_RATE_10 02 -#define AUTO_RATE_20 03 + #define DOM_MASTER (BIT(0) + BIT(1)) + #define SCAM_ENABLED BIT(2) + #define SCAM_LEVEL2 BIT(3) -#define WIDE_NEGO_BIT BIT(7) -#define DISC_ENABLE_BIT BIT(6) -#define hp_vendor_id_0 0x00 /* LSB */ -#define ORION_VEND_0 0x4B + #define RENEGO_ENA BITW(10) + #define CONNIO_ENA BITW(11) + #define GREEN_PC_ENA BITW(12) -#define hp_vendor_id_1 0x01 /* MSB */ -#define ORION_VEND_1 0x10 -#define hp_device_id_0 0x02 /* LSB */ -#define ORION_DEV_0 0x30 + #define AUTO_RATE_00 00 + #define AUTO_RATE_05 01 + #define AUTO_RATE_10 02 + #define AUTO_RATE_20 03 -#define hp_device_id_1 0x03 /* MSB */ -#define ORION_DEV_1 0x81 + #define WIDE_NEGO_BIT BIT(7) + #define DISC_ENABLE_BIT BIT(6) + + + + #define hp_vendor_id_0 0x00 /* LSB */ + #define ORION_VEND_0 0x4B + + #define hp_vendor_id_1 0x01 /* MSB */ + #define ORION_VEND_1 0x10 + + #define hp_device_id_0 0x02 /* LSB */ + #define ORION_DEV_0 0x30 + + #define hp_device_id_1 0x03 /* MSB */ + #define ORION_DEV_1 0x81 /* Sub Vendor ID and Sub Device ID only available in - Harpoon Version 2 and higher */ + Harpoon Version 2 and higher */ + + #define hp_sub_vendor_id_0 0x04 /* LSB */ + #define hp_sub_vendor_id_1 0x05 /* MSB */ + #define hp_sub_device_id_0 0x06 /* LSB */ + #define hp_sub_device_id_1 0x07 /* MSB */ + + + #define hp_dual_addr_lo 0x08 + #define hp_dual_addr_lmi 0x09 + #define hp_dual_addr_hmi 0x0A + #define hp_dual_addr_hi 0x0B + + #define hp_semaphore 0x0C + #define SCCB_MGR_ACTIVE BIT(0) + #define TICKLE_ME BIT(1) + #define SCCB_MGR_PRESENT BIT(3) + #define BIOS_IN_USE BIT(4) + + #define hp_user_defined_D 0x0D + + #define hp_reserved_E 0x0E + + #define hp_sys_ctrl 0x0F + + #define STOP_CLK BIT(0) /*Turn off BusMaster Clock */ + #define DRVR_RST BIT(1) /*Firmware Reset to 80C15 chip */ + #define HALT_MACH BIT(3) /*Halt State Machine */ + #define HARD_ABORT BIT(4) /*Hard Abort */ + #define DIAG_MODE BIT(5) /*Diagnostic Mode */ + + #define BM_ABORT_TMOUT 0x50 /*Halt State machine time out */ + + #define hp_sys_cfg 0x10 + + #define DONT_RST_FIFO BIT(7) /*Don't reset FIFO */ + + + #define hp_host_ctrl0 0x11 + + #define DUAL_ADDR_MODE BIT(0) /*Enable 64-bit addresses */ + #define IO_MEM_SPACE BIT(1) /*I/O Memory Space */ + #define RESOURCE_LOCK BIT(2) /*Enable Resource Lock */ + #define IGNOR_ACCESS_ERR BIT(3) /*Ignore Access Error */ + #define HOST_INT_EDGE BIT(4) /*Host interrupt level/edge mode sel */ + #define SIX_CLOCKS BIT(5) /*6 Clocks between Strobe */ + #define DMA_EVEN_PARITY BIT(6) /*Enable DMA Enen Parity */ + +/* + #define BURST_MODE BIT(0) +*/ + + #define hp_reserved_12 0x12 + + #define hp_host_blk_cnt 0x13 + + #define XFER_BLK1 0x00 /* 0 0 0 1 byte per block*/ + #define XFER_BLK2 0x01 /* 0 0 1 2 byte per block*/ + #define XFER_BLK4 0x02 /* 0 1 0 4 byte per block*/ + #define XFER_BLK8 0x03 /* 0 1 1 8 byte per block*/ + #define XFER_BLK16 0x04 /* 1 0 0 16 byte per block*/ + #define XFER_BLK32 0x05 /* 1 0 1 32 byte per block*/ + #define XFER_BLK64 0x06 /* 1 1 0 64 byte per block*/ + + #define BM_THRESHOLD 0x40 /* PCI mode can only xfer 16 bytes*/ + + + #define hp_reserved_14 0x14 + #define hp_reserved_15 0x15 + #define hp_reserved_16 0x16 + + #define hp_int_mask 0x17 + + #define INT_CMD_COMPL BIT(0) /* DMA command complete */ + #define INT_EXT_STATUS BIT(1) /* Extended Status Set */ + #define INT_SCSI BIT(2) /* Scsi block interrupt */ + #define INT_FIFO_RDY BIT(4) /* FIFO data ready */ + + + #define hp_xfer_cnt_lo 0x18 + #define hp_xfer_cnt_mi 0x19 + #define hp_xfer_cnt_hi 0x1A + #define hp_xfer_cmd 0x1B + + #define XFER_HOST_DMA 0x00 /* 0 0 0 Transfer Host -> DMA */ + #define XFER_DMA_HOST 0x01 /* 0 0 1 Transfer DMA -> Host */ + #define XFER_HOST_MPU 0x02 /* 0 1 0 Transfer Host -> MPU */ + #define XFER_MPU_HOST 0x03 /* 0 1 1 Transfer MPU -> Host */ + #define XFER_DMA_MPU 0x04 /* 1 0 0 Transfer DMA -> MPU */ + #define XFER_MPU_DMA 0x05 /* 1 0 1 Transfer MPU -> DMA */ + #define SET_SEMAPHORE 0x06 /* 1 1 0 Set Semaphore */ + #define XFER_NOP 0x07 /* 1 1 1 Transfer NOP */ + #define XFER_MB_MPU 0x06 /* 1 1 0 Transfer MB -> MPU */ + #define XFER_MB_DMA 0x07 /* 1 1 1 Transfer MB -> DMA */ + + + #define XFER_HOST_AUTO 0x00 /* 0 0 Auto Transfer Size */ + #define XFER_HOST_8BIT 0x08 /* 0 1 8 BIT Transfer Size */ + #define XFER_HOST_16BIT 0x10 /* 1 0 16 BIT Transfer Size */ + #define XFER_HOST_32BIT 0x18 /* 1 1 32 BIT Transfer Size */ + + #define XFER_DMA_8BIT 0x20 /* 0 1 8 BIT Transfer Size */ + #define XFER_DMA_16BIT 0x40 /* 1 0 16 BIT Transfer Size */ + + #define DISABLE_INT BIT(7) /*Do not interrupt at end of cmd. */ + + #define HOST_WRT_CMD ((DISABLE_INT + XFER_HOST_DMA + XFER_HOST_AUTO + XFER_DMA_8BIT)) + #define HOST_RD_CMD ((DISABLE_INT + XFER_DMA_HOST + XFER_HOST_AUTO + XFER_DMA_8BIT)) + #define WIDE_HOST_WRT_CMD ((DISABLE_INT + XFER_HOST_DMA + XFER_HOST_AUTO + XFER_DMA_16BIT)) + #define WIDE_HOST_RD_CMD ((DISABLE_INT + XFER_DMA_HOST + XFER_HOST_AUTO + XFER_DMA_16BIT)) + + #define hp_host_addr_lo 0x1C + #define hp_host_addr_lmi 0x1D + #define hp_host_addr_hmi 0x1E + #define hp_host_addr_hi 0x1F + + #define hp_pio_data 0x20 + #define hp_reserved_21 0x21 + #define hp_ee_ctrl 0x22 + + #define EXT_ARB_ACK BIT(7) + #define SCSI_TERM_ENA_H BIT(6) /* SCSI high byte terminator */ + #define SEE_MS BIT(5) + #define SEE_CS BIT(3) + #define SEE_CLK BIT(2) + #define SEE_DO BIT(1) + #define SEE_DI BIT(0) -#define hp_sub_device_id_0 0x06 /* LSB */ + #define EE_READ 0x06 + #define EE_WRITE 0x05 + #define EWEN 0x04 + #define EWEN_ADDR 0x03C0 + #define EWDS 0x04 + #define EWDS_ADDR 0x0000 -#define hp_semaphore 0x0C -#define SCCB_MGR_ACTIVE BIT(0) -#define TICKLE_ME BIT(1) -#define SCCB_MGR_PRESENT BIT(3) -#define BIOS_IN_USE BIT(4) + #define hp_brdctl 0x23 -#define hp_sys_ctrl 0x0F + #define DAT_7 BIT(7) + #define DAT_6 BIT(6) + #define DAT_5 BIT(5) + #define BRD_STB BIT(4) + #define BRD_CS BIT(3) + #define BRD_WR BIT(2) -#define STOP_CLK BIT(0) /*Turn off BusMaster Clock */ -#define DRVR_RST BIT(1) /*Firmware Reset to 80C15 chip */ -#define HALT_MACH BIT(3) /*Halt State Machine */ -#define HARD_ABORT BIT(4) /*Hard Abort */ + #define hp_reserved_24 0x24 + #define hp_reserved_25 0x25 -#define hp_host_blk_cnt 0x13 -#define XFER_BLK64 0x06 /* 1 1 0 64 byte per block */ -#define BM_THRESHOLD 0x40 /* PCI mode can only xfer 16 bytes */ -#define hp_int_mask 0x17 + #define hp_bm_ctrl 0x26 -#define INT_CMD_COMPL BIT(0) /* DMA command complete */ -#define INT_EXT_STATUS BIT(1) /* Extended Status Set */ + #define SCSI_TERM_ENA_L BIT(0) /*Enable/Disable external terminators */ + #define FLUSH_XFER_CNTR BIT(1) /*Flush transfer counter */ + #define BM_XFER_MIN_8 BIT(2) /*Enable bus master transfer of 9 */ + #define BIOS_ENA BIT(3) /*Enable BIOS/FLASH Enable */ + #define FORCE1_XFER BIT(5) /*Always xfer one byte in byte mode */ + #define FAST_SINGLE BIT(6) /*?? */ -#define hp_xfer_cnt_lo 0x18 -#define hp_xfer_cnt_hi 0x1A -#define hp_xfer_cmd 0x1B + #define BMCTRL_DEFAULT (FORCE1_XFER|FAST_SINGLE|SCSI_TERM_ENA_L) -#define XFER_HOST_DMA 0x00 /* 0 0 0 Transfer Host -> DMA */ -#define XFER_DMA_HOST 0x01 /* 0 0 1 Transfer DMA -> Host */ + #define hp_reserved_27 0x27 -#define XFER_HOST_AUTO 0x00 /* 0 0 Auto Transfer Size */ + #define hp_sg_addr 0x28 + #define hp_page_ctrl 0x29 -#define XFER_DMA_8BIT 0x20 /* 0 1 8 BIT Transfer Size */ + #define SCATTER_EN BIT(0) + #define SGRAM_ARAM BIT(1) + #define BIOS_SHADOW BIT(2) + #define G_INT_DISABLE BIT(3) /* Enable/Disable all Interrupts */ + #define NARROW_SCSI_CARD BIT(4) /* NARROW/WIDE SCSI config pin */ -#define DISABLE_INT BIT(7) /*Do not interrupt at end of cmd. */ + #define hp_reserved_2A 0x2A + #define hp_pci_cmd_cfg 0x2B -#define HOST_WRT_CMD ((DISABLE_INT + XFER_HOST_DMA + XFER_HOST_AUTO + XFER_DMA_8BIT)) -#define HOST_RD_CMD ((DISABLE_INT + XFER_DMA_HOST + XFER_HOST_AUTO + XFER_DMA_8BIT)) + #define IO_SPACE_ENA BIT(0) /*enable I/O space */ + #define MEM_SPACE_ENA BIT(1) /*enable memory space */ + #define BUS_MSTR_ENA BIT(2) /*enable bus master operation */ + #define MEM_WI_ENA BIT(4) /*enable Write and Invalidate */ + #define PAR_ERR_RESP BIT(6) /*enable parity error responce. */ -#define hp_host_addr_lo 0x1C -#define hp_host_addr_hmi 0x1E + #define hp_reserved_2C 0x2C -#define hp_ee_ctrl 0x22 + #define hp_pci_stat_cfg 0x2D -#define EXT_ARB_ACK BIT(7) -#define SCSI_TERM_ENA_H BIT(6) /* SCSI high byte terminator */ -#define SEE_MS BIT(5) -#define SEE_CS BIT(3) -#define SEE_CLK BIT(2) -#define SEE_DO BIT(1) -#define SEE_DI BIT(0) + #define DATA_PARITY_ERR BIT(0) + #define REC_TARGET_ABORT BIT(4) /*received Target abort */ + #define REC_MASTER_ABORT BIT(5) /*received Master abort */ + #define SIG_SYSTEM_ERR BIT(6) + #define DETECTED_PAR_ERR BIT(7) -#define EE_READ 0x06 -#define EE_WRITE 0x05 -#define EWEN 0x04 -#define EWEN_ADDR 0x03C0 -#define EWDS 0x04 -#define EWDS_ADDR 0x0000 + #define hp_reserved_2E 0x2E -#define hp_bm_ctrl 0x26 + #define hp_sys_status 0x2F -#define SCSI_TERM_ENA_L BIT(0) /*Enable/Disable external terminators */ -#define FLUSH_XFER_CNTR BIT(1) /*Flush transfer counter */ -#define FORCE1_XFER BIT(5) /*Always xfer one byte in byte mode */ -#define FAST_SINGLE BIT(6) /*?? */ + #define SLV_DATA_RDY BIT(0) /*Slave data ready */ + #define XFER_CNT_ZERO BIT(1) /*Transfer counter = 0 */ + #define BM_FIFO_EMPTY BIT(2) /*FIFO empty */ + #define BM_FIFO_FULL BIT(3) /*FIFO full */ + #define HOST_OP_DONE BIT(4) /*host operation done */ + #define DMA_OP_DONE BIT(5) /*DMA operation done */ + #define SLV_OP_DONE BIT(6) /*Slave operation done */ + #define PWR_ON_FLAG BIT(7) /*Power on flag */ -#define BMCTRL_DEFAULT (FORCE1_XFER|FAST_SINGLE|SCSI_TERM_ENA_L) + #define hp_reserved_30 0x30 -#define hp_sg_addr 0x28 -#define hp_page_ctrl 0x29 + #define hp_host_status0 0x31 -#define SCATTER_EN BIT(0) -#define SGRAM_ARAM BIT(1) -#define G_INT_DISABLE BIT(3) /* Enable/Disable all Interrupts */ -#define NARROW_SCSI_CARD BIT(4) /* NARROW/WIDE SCSI config pin */ + #define HOST_TERM BIT(5) /*Host Terminal Count */ + #define HOST_TRSHLD BIT(6) /*Host Threshold */ + #define CONNECTED_2_HOST BIT(7) /*Connected to Host */ -#define hp_pci_stat_cfg 0x2D + #define hp_reserved_32 0x32 -#define REC_MASTER_ABORT BIT(5) /*received Master abort */ + #define hp_rev_num 0x33 -#define hp_rev_num 0x33 + #define REV_A_CONST 0x0E + #define REV_B_CONST 0x0E -#define hp_stack_data 0x34 -#define hp_stack_addr 0x35 + #define hp_stack_data 0x34 + #define hp_stack_addr 0x35 -#define hp_ext_status 0x36 + #define hp_ext_status 0x36 -#define BM_FORCE_OFF BIT(0) /*Bus Master is forced to get off */ -#define PCI_TGT_ABORT BIT(0) /*PCI bus master transaction aborted */ -#define PCI_DEV_TMOUT BIT(1) /*PCI Device Time out */ -#define CMD_ABORTED BIT(4) /*Command aborted */ -#define BM_PARITY_ERR BIT(5) /*parity error on data received */ -#define PIO_OVERRUN BIT(6) /*Slave data overrun */ -#define BM_CMD_BUSY BIT(7) /*Bus master transfer command busy */ -#define BAD_EXT_STATUS (BM_FORCE_OFF | PCI_DEV_TMOUT | CMD_ABORTED | \ + #define BM_FORCE_OFF BIT(0) /*Bus Master is forced to get off */ + #define PCI_TGT_ABORT BIT(0) /*PCI bus master transaction aborted */ + #define PCI_DEV_TMOUT BIT(1) /*PCI Device Time out */ + #define FIFO_TC_NOT_ZERO BIT(2) /*FIFO or transfer counter not zero */ + #define CHIP_RST_OCCUR BIT(3) /*Chip reset occurs */ + #define CMD_ABORTED BIT(4) /*Command aborted */ + #define BM_PARITY_ERR BIT(5) /*parity error on data received */ + #define PIO_OVERRUN BIT(6) /*Slave data overrun */ + #define BM_CMD_BUSY BIT(7) /*Bus master transfer command busy */ + #define BAD_EXT_STATUS (BM_FORCE_OFF | PCI_DEV_TMOUT | CMD_ABORTED | \ BM_PARITY_ERR | PIO_OVERRUN) -#define hp_int_status 0x37 - -#define EXT_STATUS_ON BIT(1) /*Extended status is valid */ -#define SCSI_INTERRUPT BIT(2) /*Global indication of a SCSI int. */ -#define INT_ASSERTED BIT(5) /* */ - -#define hp_fifo_cnt 0x38 - -#define hp_intena 0x40 - -#define RESET BITW(7) -#define PROG_HLT BITW(6) -#define PARITY BITW(5) -#define FIFO BITW(4) -#define SEL BITW(3) -#define SCAM_SEL BITW(2) -#define RSEL BITW(1) -#define TIMEOUT BITW(0) -#define BUS_FREE BITW(15) -#define XFER_CNT_0 BITW(14) -#define PHASE BITW(13) -#define IUNKWN BITW(12) -#define ICMD_COMP BITW(11) -#define ITICKLE BITW(10) -#define IDO_STRT BITW(9) -#define ITAR_DISC BITW(8) -#define AUTO_INT (BITW(12)+BITW(11)+BITW(10)+BITW(9)+BITW(8)) -#define CLR_ALL_INT 0xFFFF -#define CLR_ALL_INT_1 0xFF00 - -#define hp_intstat 0x42 - -#define hp_scsisig 0x44 - -#define SCSI_SEL BIT(7) -#define SCSI_BSY BIT(6) -#define SCSI_REQ BIT(5) -#define SCSI_ACK BIT(4) -#define SCSI_ATN BIT(3) -#define SCSI_CD BIT(2) -#define SCSI_MSG BIT(1) -#define SCSI_IOBIT BIT(0) - -#define S_SCSI_PHZ (BIT(2)+BIT(1)+BIT(0)) -#define S_MSGO_PH (BIT(2)+BIT(1) ) -#define S_MSGI_PH (BIT(2)+BIT(1)+BIT(0)) -#define S_DATAI_PH ( BIT(0)) -#define S_DATAO_PH 0x00 -#define S_ILL_PH ( BIT(1) ) - -#define hp_scsictrl_0 0x45 - -#define SEL_TAR BIT(6) -#define ENA_ATN BIT(4) -#define ENA_RESEL BIT(2) -#define SCSI_RST BIT(1) -#define ENA_SCAM_SEL BIT(0) + #define hp_int_status 0x37 + + #define BM_CMD_CMPL BIT(0) /*Bus Master command complete */ + #define EXT_STATUS_ON BIT(1) /*Extended status is valid */ + #define SCSI_INTERRUPT BIT(2) /*Global indication of a SCSI int. */ + #define BM_FIFO_RDY BIT(4) + #define INT_ASSERTED BIT(5) /* */ + #define SRAM_BUSY BIT(6) /*Scatter/Gather RAM busy */ + #define CMD_REG_BUSY BIT(7) + + + #define hp_fifo_cnt 0x38 + #define hp_curr_host_cnt 0x39 + #define hp_reserved_3A 0x3A + #define hp_fifo_in_addr 0x3B + + #define hp_fifo_out_addr 0x3C + #define hp_reserved_3D 0x3D + #define hp_reserved_3E 0x3E + #define hp_reserved_3F 0x3F + + + + #define hp_intena 0x40 + + #define RESET BITW(7) + #define PROG_HLT BITW(6) + #define PARITY BITW(5) + #define FIFO BITW(4) + #define SEL BITW(3) + #define SCAM_SEL BITW(2) + #define RSEL BITW(1) + #define TIMEOUT BITW(0) + #define BUS_FREE BITW(15) + #define XFER_CNT_0 BITW(14) + #define PHASE BITW(13) + #define IUNKWN BITW(12) + #define ICMD_COMP BITW(11) + #define ITICKLE BITW(10) + #define IDO_STRT BITW(9) + #define ITAR_DISC BITW(8) + #define AUTO_INT (BITW(12)+BITW(11)+BITW(10)+BITW(9)+BITW(8)) + #define CLR_ALL_INT 0xFFFF + #define CLR_ALL_INT_1 0xFF00 + + #define hp_intstat 0x42 + + #define hp_scsisig 0x44 + + #define SCSI_SEL BIT(7) + #define SCSI_BSY BIT(6) + #define SCSI_REQ BIT(5) + #define SCSI_ACK BIT(4) + #define SCSI_ATN BIT(3) + #define SCSI_CD BIT(2) + #define SCSI_MSG BIT(1) + #define SCSI_IOBIT BIT(0) + + #define S_SCSI_PHZ (BIT(2)+BIT(1)+BIT(0)) + #define S_CMD_PH (BIT(2) ) + #define S_MSGO_PH (BIT(2)+BIT(1) ) + #define S_STAT_PH (BIT(2) +BIT(0)) + #define S_MSGI_PH (BIT(2)+BIT(1)+BIT(0)) + #define S_DATAI_PH ( BIT(0)) + #define S_DATAO_PH 0x00 + #define S_ILL_PH ( BIT(1) ) + + #define hp_scsictrl_0 0x45 + + #define NO_ARB BIT(7) + #define SEL_TAR BIT(6) + #define ENA_ATN BIT(4) + #define ENA_RESEL BIT(2) + #define SCSI_RST BIT(1) + #define ENA_SCAM_SEL BIT(0) + + + + #define hp_portctrl_0 0x46 + + #define SCSI_PORT BIT(7) + #define SCSI_INBIT BIT(6) + #define DMA_PORT BIT(5) + #define DMA_RD BIT(4) + #define HOST_PORT BIT(3) + #define HOST_WRT BIT(2) + #define SCSI_BUS_EN BIT(1) + #define START_TO BIT(0) + + #define hp_scsireset 0x47 + + #define SCSI_TAR BIT(7) + #define SCSI_INI BIT(6) + #define SCAM_EN BIT(5) + #define ACK_HOLD BIT(4) + #define DMA_RESET BIT(3) + #define HPSCSI_RESET BIT(2) + #define PROG_RESET BIT(1) + #define FIFO_CLR BIT(0) + + #define hp_xfercnt_0 0x48 + #define hp_xfercnt_1 0x49 + #define hp_xfercnt_2 0x4A + #define hp_xfercnt_3 0x4B + + #define hp_fifodata_0 0x4C + #define hp_fifodata_1 0x4D + #define hp_addstat 0x4E + + #define SCAM_TIMER BIT(7) + #define AUTO_RUNNING BIT(6) + #define FAST_SYNC BIT(5) + #define SCSI_MODE8 BIT(3) + #define SCSI_PAR_ERR BIT(0) + + #define hp_prgmcnt_0 0x4F + + #define AUTO_PC_MASK 0x3F + + #define hp_selfid_0 0x50 + #define hp_selfid_1 0x51 + #define hp_arb_id 0x52 + + #define ARB_ID (BIT(3) + BIT(2) + BIT(1) + BIT(0)) + + #define hp_select_id 0x53 + + #define RESEL_ID (BIT(7) + BIT(6) + BIT(5) + BIT(4)) + #define SELECT_ID (BIT(3) + BIT(2) + BIT(1) + BIT(0)) + + #define hp_synctarg_base 0x54 + #define hp_synctarg_12 0x54 + #define hp_synctarg_13 0x55 + #define hp_synctarg_14 0x56 + #define hp_synctarg_15 0x57 + + #define hp_synctarg_8 0x58 + #define hp_synctarg_9 0x59 + #define hp_synctarg_10 0x5A + #define hp_synctarg_11 0x5B + + #define hp_synctarg_4 0x5C + #define hp_synctarg_5 0x5D + #define hp_synctarg_6 0x5E + #define hp_synctarg_7 0x5F + + #define hp_synctarg_0 0x60 + #define hp_synctarg_1 0x61 + #define hp_synctarg_2 0x62 + #define hp_synctarg_3 0x63 + + #define RATE_20MB 0x00 + #define RATE_10MB ( BIT(5)) + #define RATE_6_6MB ( BIT(6) ) + #define RATE_5MB ( BIT(6)+BIT(5)) + #define RATE_4MB (BIT(7) ) + #define RATE_3_33MB (BIT(7) +BIT(5)) + #define RATE_2_85MB (BIT(7)+BIT(6) ) + #define RATE_2_5MB (BIT(7)+BIT(5)+BIT(6)) + #define NEXT_CLK BIT(5) + #define SLOWEST_SYNC (BIT(7)+BIT(6)+BIT(5)) + #define NARROW_SCSI BIT(4) + #define SYNC_OFFSET (BIT(3) + BIT(2) + BIT(1) + BIT(0)) + #define DEFAULT_ASYNC 0x00 + #define DEFAULT_OFFSET 0x0F -#define hp_portctrl_0 0x46 + #define hp_autostart_0 0x64 + #define hp_autostart_1 0x65 + #define hp_autostart_2 0x66 + #define hp_autostart_3 0x67 -#define SCSI_PORT BIT(7) -#define SCSI_INBIT BIT(6) -#define DMA_PORT BIT(5) -#define DMA_RD BIT(4) -#define HOST_PORT BIT(3) -#define HOST_WRT BIT(2) -#define SCSI_BUS_EN BIT(1) -#define START_TO BIT(0) -#define hp_scsireset 0x47 -#define SCSI_INI BIT(6) -#define SCAM_EN BIT(5) -#define DMA_RESET BIT(3) -#define HPSCSI_RESET BIT(2) -#define PROG_RESET BIT(1) -#define FIFO_CLR BIT(0) + #define DISABLE 0x00 + #define AUTO_IMMED BIT(5) + #define SELECT BIT(6) + #define RESELECT (BIT(6)+BIT(5)) + #define BUSFREE BIT(7) + #define XFER_0 (BIT(7)+BIT(5)) + #define END_DATA (BIT(7)+BIT(6)) + #define MSG_PHZ (BIT(7)+BIT(6)+BIT(5)) -#define hp_xfercnt_0 0x48 -#define hp_xfercnt_2 0x4A + #define hp_gp_reg_0 0x68 + #define hp_gp_reg_1 0x69 + #define hp_gp_reg_2 0x6A + #define hp_gp_reg_3 0x6B -#define hp_fifodata_0 0x4C -#define hp_addstat 0x4E + #define hp_seltimeout 0x6C -#define SCAM_TIMER BIT(7) -#define SCSI_MODE8 BIT(3) -#define SCSI_PAR_ERR BIT(0) -#define hp_prgmcnt_0 0x4F + #define TO_2ms 0x54 /* 2.0503ms */ + #define TO_4ms 0x67 /* 3.9959ms */ -#define hp_selfid_0 0x50 -#define hp_selfid_1 0x51 -#define hp_arb_id 0x52 + #define TO_5ms 0x03 /* 4.9152ms */ + #define TO_10ms 0x07 /* 11.xxxms */ + #define TO_250ms 0x99 /* 250.68ms */ + #define TO_290ms 0xB1 /* 289.99ms */ + #define TO_350ms 0xD6 /* 350.62ms */ + #define TO_417ms 0xFF /* 417.79ms */ -#define hp_select_id 0x53 + #define hp_clkctrl_0 0x6D -#define hp_synctarg_base 0x54 -#define hp_synctarg_12 0x54 -#define hp_synctarg_13 0x55 -#define hp_synctarg_14 0x56 -#define hp_synctarg_15 0x57 + #define PWR_DWN BIT(6) + #define ACTdeassert BIT(4) + #define ATNonErr BIT(3) + #define CLK_30MHZ BIT(1) + #define CLK_40MHZ (BIT(1) + BIT(0)) + #define CLK_50MHZ BIT(2) -#define hp_synctarg_8 0x58 -#define hp_synctarg_9 0x59 -#define hp_synctarg_10 0x5A -#define hp_synctarg_11 0x5B + #define CLKCTRL_DEFAULT (ACTdeassert | CLK_40MHZ) -#define hp_synctarg_4 0x5C -#define hp_synctarg_5 0x5D -#define hp_synctarg_6 0x5E -#define hp_synctarg_7 0x5F + #define hp_fiforead 0x6E + #define hp_fifowrite 0x6F -#define hp_synctarg_0 0x60 -#define hp_synctarg_1 0x61 -#define hp_synctarg_2 0x62 -#define hp_synctarg_3 0x63 + #define hp_offsetctr 0x70 + #define hp_xferstat 0x71 -#define NARROW_SCSI BIT(4) -#define DEFAULT_OFFSET 0x0F + #define FIFO_FULL BIT(7) + #define FIFO_EMPTY BIT(6) + #define FIFO_MASK 0x3F /* Mask for the FIFO count value. */ + #define FIFO_LEN 0x20 -#define hp_autostart_0 0x64 -#define hp_autostart_1 0x65 -#define hp_autostart_3 0x67 + #define hp_portctrl_1 0x72 -#define AUTO_IMMED BIT(5) -#define SELECT BIT(6) -#define END_DATA (BIT(7)+BIT(6)) + #define EVEN_HOST_P BIT(5) + #define INVT_SCSI BIT(4) + #define CHK_SCSI_P BIT(3) + #define HOST_MODE8 BIT(0) + #define HOST_MODE16 0x00 -#define hp_gp_reg_0 0x68 -#define hp_gp_reg_1 0x69 -#define hp_gp_reg_3 0x6B + #define hp_xfer_pad 0x73 -#define hp_seltimeout 0x6C + #define ID_UNLOCK BIT(3) + #define XFER_PAD BIT(2) -#define TO_4ms 0x67 /* 3.9959ms */ + #define hp_scsidata_0 0x74 + #define hp_scsidata_1 0x75 + #define hp_timer_0 0x76 + #define hp_timer_1 0x77 -#define TO_5ms 0x03 /* 4.9152ms */ -#define TO_10ms 0x07 /* 11.xxxms */ -#define TO_250ms 0x99 /* 250.68ms */ -#define TO_290ms 0xB1 /* 289.99ms */ + #define hp_reserved_78 0x78 + #define hp_reserved_79 0x79 + #define hp_reserved_7A 0x7A + #define hp_reserved_7B 0x7B -#define hp_clkctrl_0 0x6D + #define hp_reserved_7C 0x7C + #define hp_reserved_7D 0x7D + #define hp_reserved_7E 0x7E + #define hp_reserved_7F 0x7F -#define PWR_DWN BIT(6) -#define ACTdeassert BIT(4) -#define CLK_40MHZ (BIT(1) + BIT(0)) + #define hp_aramBase 0x80 + #define BIOS_DATA_OFFSET 0x60 + #define BIOS_RELATIVE_CARD 0x64 -#define CLKCTRL_DEFAULT (ACTdeassert | CLK_40MHZ) -#define hp_fiforead 0x6E -#define hp_fifowrite 0x6F -#define hp_offsetctr 0x70 -#define hp_xferstat 0x71 -#define FIFO_EMPTY BIT(6) + #define AUTO_LEN 0x80 + #define AR0 0x00 + #define AR1 BITW(8) + #define AR2 BITW(9) + #define AR3 (BITW(9) + BITW(8)) + #define SDATA BITW(10) -#define hp_portctrl_1 0x72 + #define NOP_OP 0x00 /* Nop command */ -#define CHK_SCSI_P BIT(3) -#define HOST_MODE8 BIT(0) + #define CRD_OP BITW(11) /* Cmp Reg. w/ Data */ -#define hp_xfer_pad 0x73 + #define CRR_OP BITW(12) /* Cmp Reg. w. Reg. */ -#define ID_UNLOCK BIT(3) + #define CBE_OP (BITW(14)+BITW(12)+BITW(11)) /* Cmp SCSI cmd class & Branch EQ */ + + #define CBN_OP (BITW(14)+BITW(13)) /* Cmp SCSI cmd class & Branch NOT EQ */ + + #define CPE_OP (BITW(14)+BITW(11)) /* Cmp SCSI phs & Branch EQ */ -#define hp_scsidata_0 0x74 -#define hp_scsidata_1 0x75 + #define CPN_OP (BITW(14)+BITW(12)) /* Cmp SCSI phs & Branch NOT EQ */ -#define hp_aramBase 0x80 -#define BIOS_DATA_OFFSET 0x60 -#define BIOS_RELATIVE_CARD 0x64 -#define AR3 (BITW(9) + BITW(8)) -#define SDATA BITW(10) + #define ADATA_OUT 0x00 + #define ADATA_IN BITW(8) + #define ACOMMAND BITW(10) + #define ASTATUS (BITW(10)+BITW(8)) + #define AMSG_OUT (BITW(10)+BITW(9)) + #define AMSG_IN (BITW(10)+BITW(9)+BITW(8)) + #define AILLEGAL (BITW(9)+BITW(8)) -#define CRD_OP BITW(11) /* Cmp Reg. w/ Data */ -#define CRR_OP BITW(12) /* Cmp Reg. w. Reg. */ + #define BRH_OP BITW(13) /* Branch */ -#define CPE_OP (BITW(14)+BITW(11)) /* Cmp SCSI phs & Branch EQ */ + + #define ALWAYS 0x00 + #define EQUAL BITW(8) + #define NOT_EQ BITW(9) -#define CPN_OP (BITW(14)+BITW(12)) /* Cmp SCSI phs & Branch NOT EQ */ + #define TCB_OP (BITW(13)+BITW(11)) /* Test condition & branch */ -#define ADATA_OUT 0x00 -#define ADATA_IN BITW(8) -#define ACOMMAND BITW(10) -#define ASTATUS (BITW(10)+BITW(8)) -#define AMSG_OUT (BITW(10)+BITW(9)) -#define AMSG_IN (BITW(10)+BITW(9)+BITW(8)) + + #define ATN_SET BITW(8) + #define ATN_RESET BITW(9) + #define XFER_CNT (BITW(9)+BITW(8)) + #define FIFO_0 BITW(10) + #define FIFO_NOT0 (BITW(10)+BITW(8)) + #define T_USE_SYNC0 (BITW(10)+BITW(9)) -#define BRH_OP BITW(13) /* Branch */ -#define ALWAYS 0x00 -#define EQUAL BITW(8) -#define NOT_EQ BITW(9) + #define MPM_OP BITW(15) /* Match phase and move data */ -#define TCB_OP (BITW(13)+BITW(11)) /* Test condition & branch */ + #define MDR_OP (BITW(12)+BITW(11)) /* Move data to Reg. */ -#define FIFO_0 BITW(10) + #define MRR_OP BITW(14) /* Move DReg. to Reg. */ -#define MPM_OP BITW(15) /* Match phase and move data */ -#define MRR_OP BITW(14) /* Move DReg. to Reg. */ + #define S_IDREG (BIT(2)+BIT(1)+BIT(0)) -#define S_IDREG (BIT(2)+BIT(1)+BIT(0)) -#define D_AR0 0x00 -#define D_AR1 BIT(0) -#define D_BUCKET (BIT(2) + BIT(1) + BIT(0)) + #define D_AR0 0x00 + #define D_AR1 BIT(0) + #define D_AR2 BIT(1) + #define D_AR3 (BIT(1) + BIT(0)) + #define D_SDATA BIT(2) + #define D_BUCKET (BIT(2) + BIT(1) + BIT(0)) -#define RAT_OP (BITW(14)+BITW(13)+BITW(11)) -#define SSI_OP (BITW(15)+BITW(11)) + #define ADR_OP (BITW(13)+BITW(12)) /* Logical AND Reg. w. Data */ -#define SSI_ITAR_DISC (ITAR_DISC >> 8) -#define SSI_IDO_STRT (IDO_STRT >> 8) + #define ADS_OP (BITW(14)+BITW(13)+BITW(12)) -#define SSI_ICMD_COMP (ICMD_COMP >> 8) -#define SSI_ITICKLE (ITICKLE >> 8) + #define ODR_OP (BITW(13)+BITW(12)+BITW(11)) -#define SSI_IUNKWN (IUNKWN >> 8) -#define SSI_INO_CC (IUNKWN >> 8) -#define SSI_IRFAIL (IUNKWN >> 8) + #define ODS_OP (BITW(14)+BITW(13)+BITW(12)+BITW(11)) -#define NP 0x10 /*Next Phase */ -#define NTCMD 0x02 /*Non- Tagged Command start */ -#define CMDPZ 0x04 /*Command phase */ -#define DINT 0x12 /*Data Out/In interrupt */ -#define DI 0x13 /*Data Out */ -#define DC 0x19 /*Disconnect Message */ -#define ST 0x1D /*Status Phase */ -#define UNKNWN 0x24 /*Unknown bus action */ -#define CC 0x25 /*Command Completion failure */ -#define TICK 0x26 /*New target reselected us. */ -#define SELCHK 0x28 /*Select & Check SCSI ID latch reg */ + #define STR_OP (BITW(15)+BITW(14)) /* Store to A_Reg. */ -#define ID_MSG_STRT hp_aramBase + 0x00 -#define NON_TAG_ID_MSG hp_aramBase + 0x06 -#define CMD_STRT hp_aramBase + 0x08 -#define SYNC_MSGS hp_aramBase + 0x08 + #define AINT_ENA1 0x00 + #define AINT_STAT1 BITW(8) + #define ASCSI_SIG BITW(9) + #define ASCSI_CNTL (BITW(9)+BITW(8)) + #define APORT_CNTL BITW(10) + #define ARST_CNTL (BITW(10)+BITW(8)) + #define AXFERCNT0 (BITW(10)+BITW(9)) + #define AXFERCNT1 (BITW(10)+BITW(9)+BITW(8)) + #define AXFERCNT2 BITW(11) + #define AFIFO_DATA (BITW(11)+BITW(8)) + #define ASCSISELID (BITW(11)+BITW(9)) + #define ASCSISYNC0 (BITW(11)+BITW(9)+BITW(8)) -#define TAG_STRT 0x00 -#define DISCONNECT_START 0x10/2 -#define END_DATA_START 0x14/2 -#define CMD_ONLY_STRT CMDPZ/2 -#define SELCHK_STRT SELCHK/2 + + #define RAT_OP (BITW(14)+BITW(13)+BITW(11)) + + #define SSI_OP (BITW(15)+BITW(11)) + + + #define SSI_ITAR_DISC (ITAR_DISC >> 8) + #define SSI_IDO_STRT (IDO_STRT >> 8) + #define SSI_IDI_STRT (IDO_STRT >> 8) + + #define SSI_ICMD_COMP (ICMD_COMP >> 8) + #define SSI_ITICKLE (ITICKLE >> 8) + + #define SSI_IUNKWN (IUNKWN >> 8) + #define SSI_INO_CC (IUNKWN >> 8) + #define SSI_IRFAIL (IUNKWN >> 8) + + + #define NP 0x10 /*Next Phase */ + #define NTCMD 0x02 /*Non- Tagged Command start */ + #define CMDPZ 0x04 /*Command phase */ + #define DINT 0x12 /*Data Out/In interrupt */ + #define DI 0x13 /*Data Out */ + #define MI 0x14 /*Message In */ + #define DC 0x19 /*Disconnect Message */ + #define ST 0x1D /*Status Phase */ + #define UNKNWN 0x24 /*Unknown bus action */ + #define CC 0x25 /*Command Completion failure */ + #define TICK 0x26 /*New target reselected us. */ + #define RFAIL 0x27 /*Reselection failed */ + #define SELCHK 0x28 /*Select & Check SCSI ID latch reg */ + + + #define ID_MSG_STRT hp_aramBase + 0x00 + #define NON_TAG_ID_MSG hp_aramBase + 0x06 + #define CMD_STRT hp_aramBase + 0x08 + #define SYNC_MSGS hp_aramBase + 0x08 + + + + + + #define TAG_STRT 0x00 + #define SELECTION_START 0x00 + #define DISCONNECT_START 0x10/2 + #define END_DATA_START 0x14/2 + #define NONTAG_STRT 0x02/2 + #define CMD_ONLY_STRT CMDPZ/2 + #define TICKLE_STRT TICK/2 + #define SELCHK_STRT SELCHK/2 + + + + +#define mEEPROM_CLK_DELAY(port) (RD_HARPOON(port+hp_intstat_1)) + +#define mWAIT_10MS(port) (RD_HARPOON(port+hp_intstat_1)) + + +#define CLR_XFER_CNT(port) (WR_HARPOON(port+hp_xfercnt_0, 0x00)) + +#define SET_XFER_CNT(port, data) (WR_HARP32(port,hp_xfercnt_0,data)) #define GET_XFER_CNT(port, xfercnt) {RD_HARP32(port,hp_xfercnt_0,xfercnt); xfercnt &= 0xFFFFFF;} /* #define GET_XFER_CNT(port, xfercnt) (xfercnt = RD_HARPOON(port+hp_xfercnt_2), \ xfercnt <<= 16,\ - xfercnt |= RDW_HARPOON((unsigned short)(port+hp_xfercnt_0))) + xfercnt |= RDW_HARPOON((USHORT)(port+hp_xfercnt_0))) */ -#define HP_SETUP_ADDR_CNT(port,addr,count) (WRW_HARPOON((port+hp_host_addr_lo), (unsigned short)(addr & 0x0000FFFFL)),\ +#define HP_SETUP_ADDR_CNT(port,addr,count) (WRW_HARPOON((port+hp_host_addr_lo), (USHORT)(addr & 0x0000FFFFL)),\ addr >>= 16,\ - WRW_HARPOON((port+hp_host_addr_hmi), (unsigned short)(addr & 0x0000FFFFL)),\ + WRW_HARPOON((port+hp_host_addr_hmi), (USHORT)(addr & 0x0000FFFFL)),\ WR_HARP32(port,hp_xfercnt_0,count),\ - WRW_HARPOON((port+hp_xfer_cnt_lo), (unsigned short)(count & 0x0000FFFFL)),\ + WRW_HARPOON((port+hp_xfer_cnt_lo), (USHORT)(count & 0x0000FFFFL)),\ count >>= 16,\ WR_HARPOON(port+hp_xfer_cnt_hi, (count & 0xFF))) #define ACCEPT_MSG(port) {while(RD_HARPOON(port+hp_scsisig) & SCSI_REQ){}\ WR_HARPOON(port+hp_scsisig, S_ILL_PH);} + #define ACCEPT_MSG_ATN(port) {while(RD_HARPOON(port+hp_scsisig) & SCSI_REQ){}\ WR_HARPOON(port+hp_scsisig, (S_ILL_PH|SCSI_ATN));} +#define ACCEPT_STAT(port) {while(RD_HARPOON(port+hp_scsisig) & SCSI_REQ){}\ + WR_HARPOON(port+hp_scsisig, S_ILL_PH);} + +#define ACCEPT_STAT_ATN(port) {while(RD_HARPOON(port+hp_scsisig) & SCSI_REQ){}\ + WR_HARPOON(port+hp_scsisig, (S_ILL_PH|SCSI_ATN));} + #define DISABLE_AUTO(port) (WR_HARPOON(port+hp_scsireset, PROG_RESET),\ WR_HARPOON(port+hp_scsireset, 0x00)) @@ -783,1220 +1329,1194 @@ typedef struct SCCBscam_info { #define MENABLE_INT(p_port) (WR_HARPOON(p_port+hp_page_ctrl, \ (RD_HARPOON(p_port+hp_page_ctrl) & ~G_INT_DISABLE))) -static unsigned char FPT_sisyncn(unsigned long port, unsigned char p_card, - unsigned char syncFlag); -static void FPT_ssel(unsigned long port, unsigned char p_card); -static void FPT_sres(unsigned long port, unsigned char p_card, - struct sccb_card *pCurrCard); -static void FPT_shandem(unsigned long port, unsigned char p_card, - struct sccb *pCurrSCCB); -static void FPT_stsyncn(unsigned long port, unsigned char p_card); -static void FPT_sisyncr(unsigned long port, unsigned char sync_pulse, - unsigned char offset); -static void FPT_sssyncv(unsigned long p_port, unsigned char p_id, - unsigned char p_sync_value, - struct sccb_mgr_tar_info *currTar_Info); -static void FPT_sresb(unsigned long port, unsigned char p_card); -static void FPT_sxfrp(unsigned long p_port, unsigned char p_card); -static void FPT_schkdd(unsigned long port, unsigned char p_card); -static unsigned char FPT_RdStack(unsigned long port, unsigned char index); -static void FPT_WrStack(unsigned long portBase, unsigned char index, - unsigned char data); -static unsigned char FPT_ChkIfChipInitialized(unsigned long ioPort); - -static void FPT_SendMsg(unsigned long port, unsigned char message); -static void FPT_queueFlushTargSccb(unsigned char p_card, unsigned char thisTarg, - unsigned char error_code); - -static void FPT_sinits(struct sccb *p_sccb, unsigned char p_card); -static void FPT_RNVRamData(struct nvram_info *pNvRamInfo); - -static unsigned char FPT_siwidn(unsigned long port, unsigned char p_card); -static void FPT_stwidn(unsigned long port, unsigned char p_card); -static void FPT_siwidr(unsigned long port, unsigned char width); - -static void FPT_queueSelectFail(struct sccb_card *pCurrCard, - unsigned char p_card); -static void FPT_queueDisconnect(struct sccb *p_SCCB, unsigned char p_card); -static void FPT_queueCmdComplete(struct sccb_card *pCurrCard, - struct sccb *p_SCCB, unsigned char p_card); -static void FPT_queueSearchSelect(struct sccb_card *pCurrCard, - unsigned char p_card); -static void FPT_queueFlushSccb(unsigned char p_card, unsigned char error_code); -static void FPT_queueAddSccb(struct sccb *p_SCCB, unsigned char card); -static unsigned char FPT_queueFindSccb(struct sccb *p_SCCB, - unsigned char p_card); -static void FPT_utilUpdateResidual(struct sccb *p_SCCB); -static unsigned short FPT_CalcCrc16(unsigned char buffer[]); -static unsigned char FPT_CalcLrc(unsigned char buffer[]); - -static void FPT_Wait1Second(unsigned long p_port); -static void FPT_Wait(unsigned long p_port, unsigned char p_delay); -static void FPT_utilEEWriteOnOff(unsigned long p_port, unsigned char p_mode); -static void FPT_utilEEWrite(unsigned long p_port, unsigned short ee_data, - unsigned short ee_addr); -static unsigned short FPT_utilEERead(unsigned long p_port, - unsigned short ee_addr); -static unsigned short FPT_utilEEReadOrg(unsigned long p_port, - unsigned short ee_addr); -static void FPT_utilEESendCmdAddr(unsigned long p_port, unsigned char ee_cmd, - unsigned short ee_addr); - -static void FPT_phaseDataOut(unsigned long port, unsigned char p_card); -static void FPT_phaseDataIn(unsigned long port, unsigned char p_card); -static void FPT_phaseCommand(unsigned long port, unsigned char p_card); -static void FPT_phaseStatus(unsigned long port, unsigned char p_card); -static void FPT_phaseMsgOut(unsigned long port, unsigned char p_card); -static void FPT_phaseMsgIn(unsigned long port, unsigned char p_card); -static void FPT_phaseIllegal(unsigned long port, unsigned char p_card); - -static void FPT_phaseDecode(unsigned long port, unsigned char p_card); -static void FPT_phaseChkFifo(unsigned long port, unsigned char p_card); -static void FPT_phaseBusFree(unsigned long p_port, unsigned char p_card); - -static void FPT_XbowInit(unsigned long port, unsigned char scamFlg); -static void FPT_BusMasterInit(unsigned long p_port); -static void FPT_DiagEEPROM(unsigned long p_port); - -static void FPT_dataXferProcessor(unsigned long port, - struct sccb_card *pCurrCard); -static void FPT_busMstrSGDataXferStart(unsigned long port, - struct sccb *pCurrSCCB); -static void FPT_busMstrDataXferStart(unsigned long port, - struct sccb *pCurrSCCB); -static void FPT_hostDataXferAbort(unsigned long port, unsigned char p_card, - struct sccb *pCurrSCCB); -static void FPT_hostDataXferRestart(struct sccb *currSCCB); - -static unsigned char FPT_SccbMgr_bad_isr(unsigned long p_port, - unsigned char p_card, - struct sccb_card *pCurrCard, - unsigned short p_int); - -static void FPT_SccbMgrTableInitAll(void); -static void FPT_SccbMgrTableInitCard(struct sccb_card *pCurrCard, - unsigned char p_card); -static void FPT_SccbMgrTableInitTarget(unsigned char p_card, - unsigned char target); - -static void FPT_scini(unsigned char p_card, unsigned char p_our_id, - unsigned char p_power_up); - -static int FPT_scarb(unsigned long p_port, unsigned char p_sel_type); -static void FPT_scbusf(unsigned long p_port); -static void FPT_scsel(unsigned long p_port); -static void FPT_scasid(unsigned char p_card, unsigned long p_port); -static unsigned char FPT_scxferc(unsigned long p_port, unsigned char p_data); -static unsigned char FPT_scsendi(unsigned long p_port, - unsigned char p_id_string[]); -static unsigned char FPT_sciso(unsigned long p_port, - unsigned char p_id_string[]); -static void FPT_scwirod(unsigned long p_port, unsigned char p_data_bit); -static void FPT_scwiros(unsigned long p_port, unsigned char p_data_bit); -static unsigned char FPT_scvalq(unsigned char p_quintet); -static unsigned char FPT_scsell(unsigned long p_port, unsigned char targ_id); -static void FPT_scwtsel(unsigned long p_port); -static void FPT_inisci(unsigned char p_card, unsigned long p_port, - unsigned char p_our_id); -static void FPT_scsavdi(unsigned char p_card, unsigned long p_port); -static unsigned char FPT_scmachid(unsigned char p_card, - unsigned char p_id_string[]); - -static void FPT_autoCmdCmplt(unsigned long p_port, unsigned char p_card); -static void FPT_autoLoadDefaultMap(unsigned long p_port); - -static struct sccb_mgr_tar_info FPT_sccbMgrTbl[MAX_CARDS][MAX_SCSI_TAR] = - { {{0}} }; -static struct sccb_card FPT_BL_Card[MAX_CARDS] = { {0} }; -static SCCBSCAM_INFO FPT_scamInfo[MAX_SCSI_TAR] = { {{0}} }; -static struct nvram_info FPT_nvRamInfo[MAX_MB_CARDS] = { {0} }; - -static unsigned char FPT_mbCards = 0; -static unsigned char FPT_scamHAString[] = - { 0x63, 0x07, 'B', 'U', 'S', 'L', 'O', 'G', 'I', 'C', - ' ', 'B', 'T', '-', '9', '3', '0', - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20 -}; - -static unsigned short FPT_default_intena = 0; - -static void (*FPT_s_PhaseTbl[8]) (unsigned long, unsigned char) = { -0}; + + + +void scsiStartAuto(ULONG port); +static UCHAR FPT_sisyncn(ULONG port, UCHAR p_card, UCHAR syncFlag); +static void FPT_ssel(ULONG port, UCHAR p_card); +static void FPT_sres(ULONG port, UCHAR p_card, PSCCBcard pCurrCard); +static void FPT_shandem(ULONG port, UCHAR p_card,PSCCB pCurrSCCB); +static void FPT_stsyncn(ULONG port, UCHAR p_card); +static void FPT_sisyncr(ULONG port,UCHAR sync_pulse, UCHAR offset); +static void FPT_sssyncv(ULONG p_port, UCHAR p_id, UCHAR p_sync_value, + PSCCBMgr_tar_info currTar_Info); +static void FPT_sresb(ULONG port, UCHAR p_card); +static void FPT_sxfrp(ULONG p_port, UCHAR p_card); +static void FPT_schkdd(ULONG port, UCHAR p_card); +static UCHAR FPT_RdStack(ULONG port, UCHAR index); +static void FPT_WrStack(ULONG portBase, UCHAR index, UCHAR data); +static UCHAR FPT_ChkIfChipInitialized(ULONG ioPort); + +static void FPT_SendMsg(ULONG port, UCHAR message); +static void FPT_queueFlushTargSccb(UCHAR p_card, UCHAR thisTarg, + UCHAR error_code); + +static void FPT_sinits(PSCCB p_sccb, UCHAR p_card); +static void FPT_RNVRamData(PNVRamInfo pNvRamInfo); + +static UCHAR FPT_siwidn(ULONG port, UCHAR p_card); +static void FPT_stwidn(ULONG port, UCHAR p_card); +static void FPT_siwidr(ULONG port, UCHAR width); + + +static void FPT_queueSelectFail(PSCCBcard pCurrCard, UCHAR p_card); +static void FPT_queueDisconnect(PSCCB p_SCCB, UCHAR p_card); +static void FPT_queueCmdComplete(PSCCBcard pCurrCard, PSCCB p_SCCB, + UCHAR p_card); +static void FPT_queueSearchSelect(PSCCBcard pCurrCard, UCHAR p_card); +static void FPT_queueFlushSccb(UCHAR p_card, UCHAR error_code); +static void FPT_queueAddSccb(PSCCB p_SCCB, UCHAR card); +static UCHAR FPT_queueFindSccb(PSCCB p_SCCB, UCHAR p_card); +static void FPT_utilUpdateResidual(PSCCB p_SCCB); +static USHORT FPT_CalcCrc16(UCHAR buffer[]); +static UCHAR FPT_CalcLrc(UCHAR buffer[]); + + +static void FPT_Wait1Second(ULONG p_port); +static void FPT_Wait(ULONG p_port, UCHAR p_delay); +static void FPT_utilEEWriteOnOff(ULONG p_port,UCHAR p_mode); +static void FPT_utilEEWrite(ULONG p_port, USHORT ee_data, USHORT ee_addr); +static USHORT FPT_utilEERead(ULONG p_port, USHORT ee_addr); +static USHORT FPT_utilEEReadOrg(ULONG p_port, USHORT ee_addr); +static void FPT_utilEESendCmdAddr(ULONG p_port, UCHAR ee_cmd, USHORT ee_addr); + + + +static void FPT_phaseDataOut(ULONG port, UCHAR p_card); +static void FPT_phaseDataIn(ULONG port, UCHAR p_card); +static void FPT_phaseCommand(ULONG port, UCHAR p_card); +static void FPT_phaseStatus(ULONG port, UCHAR p_card); +static void FPT_phaseMsgOut(ULONG port, UCHAR p_card); +static void FPT_phaseMsgIn(ULONG port, UCHAR p_card); +static void FPT_phaseIllegal(ULONG port, UCHAR p_card); + +static void FPT_phaseDecode(ULONG port, UCHAR p_card); +static void FPT_phaseChkFifo(ULONG port, UCHAR p_card); +static void FPT_phaseBusFree(ULONG p_port, UCHAR p_card); + + + + +static void FPT_XbowInit(ULONG port, UCHAR scamFlg); +static void FPT_BusMasterInit(ULONG p_port); +static void FPT_DiagEEPROM(ULONG p_port); + + + + +void busMstrAbort(ULONG port); +static void FPT_dataXferProcessor(ULONG port, PSCCBcard pCurrCard); +static void FPT_busMstrSGDataXferStart(ULONG port, PSCCB pCurrSCCB); +static void FPT_busMstrDataXferStart(ULONG port, PSCCB pCurrSCCB); +static void FPT_hostDataXferAbort(ULONG port, UCHAR p_card, PSCCB pCurrSCCB); +static void FPT_hostDataXferRestart(PSCCB currSCCB); + + +static UCHAR FPT_SccbMgr_bad_isr(ULONG p_port, UCHAR p_card, + PSCCBcard pCurrCard, USHORT p_int); + +static void FPT_SccbMgrTableInitAll(void); +static void FPT_SccbMgrTableInitCard(PSCCBcard pCurrCard, UCHAR p_card); +static void FPT_SccbMgrTableInitTarget(UCHAR p_card, UCHAR target); + + + +static void FPT_scini(UCHAR p_card, UCHAR p_our_id, UCHAR p_power_up); + +static int FPT_scarb(ULONG p_port, UCHAR p_sel_type); +static void FPT_scbusf(ULONG p_port); +static void FPT_scsel(ULONG p_port); +static void FPT_scasid(UCHAR p_card, ULONG p_port); +static UCHAR FPT_scxferc(ULONG p_port, UCHAR p_data); +static UCHAR FPT_scsendi(ULONG p_port, UCHAR p_id_string[]); +static UCHAR FPT_sciso(ULONG p_port, UCHAR p_id_string[]); +static void FPT_scwirod(ULONG p_port, UCHAR p_data_bit); +static void FPT_scwiros(ULONG p_port, UCHAR p_data_bit); +static UCHAR FPT_scvalq(UCHAR p_quintet); +static UCHAR FPT_scsell(ULONG p_port, UCHAR targ_id); +static void FPT_scwtsel(ULONG p_port); +static void FPT_inisci(UCHAR p_card, ULONG p_port, UCHAR p_our_id); +static void FPT_scsavdi(UCHAR p_card, ULONG p_port); +static UCHAR FPT_scmachid(UCHAR p_card, UCHAR p_id_string[]); + + +static void FPT_autoCmdCmplt(ULONG p_port, UCHAR p_card); +static void FPT_autoLoadDefaultMap(ULONG p_port); + + + +void OS_start_timer(unsigned long ioport, unsigned long timeout); +void OS_stop_timer(unsigned long ioport, unsigned long timeout); +void OS_disable_int(unsigned char intvec); +void OS_enable_int(unsigned char intvec); +void OS_delay(unsigned long count); +int OS_VirtToPhys(u32bits CardHandle, u32bits *physaddr, u32bits *virtaddr); + +static SCCBMGR_TAR_INFO FPT_sccbMgrTbl[MAX_CARDS][MAX_SCSI_TAR] = { { { 0 } } }; +static SCCBCARD FPT_BL_Card[MAX_CARDS] = { { 0 } }; +static SCCBSCAM_INFO FPT_scamInfo[MAX_SCSI_TAR] = { { { 0 } } }; +static NVRAMINFO FPT_nvRamInfo[MAX_MB_CARDS] = { { 0 } }; + + +static UCHAR FPT_mbCards = 0; +static UCHAR FPT_scamHAString[] = {0x63, 0x07, 'B', 'U', 'S', 'L', 'O', 'G', 'I', 'C', \ + ' ', 'B', 'T', '-', '9', '3', '0', \ + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, \ + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20}; + +static USHORT FPT_default_intena = 0; + + +static void (*FPT_s_PhaseTbl[8]) (ULONG, UCHAR)= { 0 }; + /*--------------------------------------------------------------------- * - * Function: FlashPoint_ProbeHostAdapter + * Function: SccbMgr_sense_adapter * * Description: Setup and/or Search for cards and return info to caller. * *---------------------------------------------------------------------*/ -static int FlashPoint_ProbeHostAdapter(struct sccb_mgr_info *pCardInfo) +static int SccbMgr_sense_adapter(PSCCBMGR_INFO pCardInfo) { - static unsigned char first_time = 1; + static UCHAR first_time = 1; + + UCHAR i,j,id,ScamFlg; + USHORT temp,temp2,temp3,temp4,temp5,temp6; + ULONG ioport; + PNVRamInfo pCurrNvRam; - unsigned char i, j, id, ScamFlg; - unsigned short temp, temp2, temp3, temp4, temp5, temp6; - unsigned long ioport; - struct nvram_info *pCurrNvRam; + ioport = pCardInfo->si_baseaddr; - ioport = pCardInfo->si_baseaddr; - if (RD_HARPOON(ioport + hp_vendor_id_0) != ORION_VEND_0) - return (int)FAILURE; + if (RD_HARPOON(ioport+hp_vendor_id_0) != ORION_VEND_0) + return((int)FAILURE); - if ((RD_HARPOON(ioport + hp_vendor_id_1) != ORION_VEND_1)) - return (int)FAILURE; + if ((RD_HARPOON(ioport+hp_vendor_id_1) != ORION_VEND_1)) + return((int)FAILURE); - if ((RD_HARPOON(ioport + hp_device_id_0) != ORION_DEV_0)) - return (int)FAILURE; + if ((RD_HARPOON(ioport+hp_device_id_0) != ORION_DEV_0)) + return((int)FAILURE); - if ((RD_HARPOON(ioport + hp_device_id_1) != ORION_DEV_1)) - return (int)FAILURE; + if ((RD_HARPOON(ioport+hp_device_id_1) != ORION_DEV_1)) + return((int)FAILURE); - if (RD_HARPOON(ioport + hp_rev_num) != 0x0f) { + + if (RD_HARPOON(ioport+hp_rev_num) != 0x0f){ /* For new Harpoon then check for sub_device ID LSB the bits(0-3) must be all ZERO for compatible with current version of SCCBMgr, else skip this Harpoon device. */ - if (RD_HARPOON(ioport + hp_sub_device_id_0) & 0x0f) - return (int)FAILURE; + if (RD_HARPOON(ioport+hp_sub_device_id_0) & 0x0f) + return((int)FAILURE); } - if (first_time) { - FPT_SccbMgrTableInitAll(); - first_time = 0; + if (first_time) + { + FPT_SccbMgrTableInitAll(); + first_time = 0; FPT_mbCards = 0; - } + } - if (FPT_RdStack(ioport, 0) != 0x00) { - if (FPT_ChkIfChipInitialized(ioport) == 0) { + if(FPT_RdStack(ioport, 0) != 0x00) { + if(FPT_ChkIfChipInitialized(ioport) == 0) + { pCurrNvRam = NULL; - WR_HARPOON(ioport + hp_semaphore, 0x00); - FPT_XbowInit(ioport, 0); /*Must Init the SCSI before attempting */ + WR_HARPOON(ioport+hp_semaphore, 0x00); + FPT_XbowInit(ioport, 0); /*Must Init the SCSI before attempting */ FPT_DiagEEPROM(ioport); - } else { - if (FPT_mbCards < MAX_MB_CARDS) { + } + else + { + if(FPT_mbCards < MAX_MB_CARDS) { pCurrNvRam = &FPT_nvRamInfo[FPT_mbCards]; FPT_mbCards++; pCurrNvRam->niBaseAddr = ioport; FPT_RNVRamData(pCurrNvRam); - } else - return (int)FAILURE; + }else + return((int) FAILURE); } - } else + }else pCurrNvRam = NULL; - WR_HARPOON(ioport + hp_clkctrl_0, CLKCTRL_DEFAULT); - WR_HARPOON(ioport + hp_sys_ctrl, 0x00); + WR_HARPOON(ioport+hp_clkctrl_0, CLKCTRL_DEFAULT); + WR_HARPOON(ioport+hp_sys_ctrl, 0x00); - if (pCurrNvRam) + if(pCurrNvRam) pCardInfo->si_id = pCurrNvRam->niAdapId; else - pCardInfo->si_id = - (unsigned - char)(FPT_utilEERead(ioport, - (ADAPTER_SCSI_ID / - 2)) & (unsigned char)0x0FF); - - pCardInfo->si_lun = 0x00; - pCardInfo->si_fw_revision = ORION_FW_REV; - temp2 = 0x0000; - temp3 = 0x0000; - temp4 = 0x0000; - temp5 = 0x0000; - temp6 = 0x0000; - - for (id = 0; id < (16 / 2); id++) { - - if (pCurrNvRam) { - temp = (unsigned short)pCurrNvRam->niSyncTbl[id]; - temp = ((temp & 0x03) + ((temp << 4) & 0xc0)) + - (((temp << 4) & 0x0300) + ((temp << 8) & 0xc000)); - } else - temp = - FPT_utilEERead(ioport, - (unsigned short)((SYNC_RATE_TBL / 2) - + id)); - - for (i = 0; i < 2; temp >>= 8, i++) { - - temp2 >>= 1; - temp3 >>= 1; - temp4 >>= 1; - temp5 >>= 1; - temp6 >>= 1; - switch (temp & 0x3) { - case AUTO_RATE_20: /* Synchronous, 20 mega-transfers/second */ - temp6 |= 0x8000; /* Fall through */ - case AUTO_RATE_10: /* Synchronous, 10 mega-transfers/second */ - temp5 |= 0x8000; /* Fall through */ - case AUTO_RATE_05: /* Synchronous, 5 mega-transfers/second */ - temp2 |= 0x8000; /* Fall through */ - case AUTO_RATE_00: /* Asynchronous */ - break; - } + pCardInfo->si_id = (UCHAR)(FPT_utilEERead(ioport, (ADAPTER_SCSI_ID/2)) & + (UCHAR)0x0FF); - if (temp & DISC_ENABLE_BIT) - temp3 |= 0x8000; + pCardInfo->si_lun = 0x00; + pCardInfo->si_fw_revision = ORION_FW_REV; + temp2 = 0x0000; + temp3 = 0x0000; + temp4 = 0x0000; + temp5 = 0x0000; + temp6 = 0x0000; - if (temp & WIDE_NEGO_BIT) - temp4 |= 0x8000; + for (id = 0; id < (16/2); id++) { - } - } + if(pCurrNvRam){ + temp = (USHORT) pCurrNvRam->niSyncTbl[id]; + temp = ((temp & 0x03) + ((temp << 4) & 0xc0)) + + (((temp << 4) & 0x0300) + ((temp << 8) & 0xc000)); + }else + temp = FPT_utilEERead(ioport, (USHORT)((SYNC_RATE_TBL/2)+id)); + + for (i = 0; i < 2; temp >>=8,i++) { + + temp2 >>= 1; + temp3 >>= 1; + temp4 >>= 1; + temp5 >>= 1; + temp6 >>= 1; + switch (temp & 0x3) + { + case AUTO_RATE_20: /* Synchronous, 20 mega-transfers/second */ + temp6 |= 0x8000; /* Fall through */ + case AUTO_RATE_10: /* Synchronous, 10 mega-transfers/second */ + temp5 |= 0x8000; /* Fall through */ + case AUTO_RATE_05: /* Synchronous, 5 mega-transfers/second */ + temp2 |= 0x8000; /* Fall through */ + case AUTO_RATE_00: /* Asynchronous */ + break; + } + + if (temp & DISC_ENABLE_BIT) + temp3 |= 0x8000; + + if (temp & WIDE_NEGO_BIT) + temp4 |= 0x8000; + + } + } - pCardInfo->si_per_targ_init_sync = temp2; - pCardInfo->si_per_targ_no_disc = temp3; - pCardInfo->si_per_targ_wide_nego = temp4; - pCardInfo->si_per_targ_fast_nego = temp5; - pCardInfo->si_per_targ_ultra_nego = temp6; + pCardInfo->si_per_targ_init_sync = temp2; + pCardInfo->si_per_targ_no_disc = temp3; + pCardInfo->si_per_targ_wide_nego = temp4; + pCardInfo->si_per_targ_fast_nego = temp5; + pCardInfo->si_per_targ_ultra_nego = temp6; - if (pCurrNvRam) + if(pCurrNvRam) i = pCurrNvRam->niSysConf; else - i = (unsigned - char)(FPT_utilEERead(ioport, (SYSTEM_CONFIG / 2))); + i = (UCHAR)(FPT_utilEERead(ioport, (SYSTEM_CONFIG/2))); - if (pCurrNvRam) + if(pCurrNvRam) ScamFlg = pCurrNvRam->niScamConf; else - ScamFlg = - (unsigned char)FPT_utilEERead(ioport, SCAM_CONFIG / 2); - - pCardInfo->si_flags = 0x0000; + ScamFlg = (UCHAR) FPT_utilEERead(ioport, SCAM_CONFIG/2); - if (i & 0x01) - pCardInfo->si_flags |= SCSI_PARITY_ENA; + pCardInfo->si_flags = 0x0000; - if (!(i & 0x02)) - pCardInfo->si_flags |= SOFT_RESET; + if (i & 0x01) + pCardInfo->si_flags |= SCSI_PARITY_ENA; - if (i & 0x10) - pCardInfo->si_flags |= EXTENDED_TRANSLATION; + if (!(i & 0x02)) + pCardInfo->si_flags |= SOFT_RESET; - if (ScamFlg & SCAM_ENABLED) - pCardInfo->si_flags |= FLAG_SCAM_ENABLED; + if (i & 0x10) + pCardInfo->si_flags |= EXTENDED_TRANSLATION; - if (ScamFlg & SCAM_LEVEL2) - pCardInfo->si_flags |= FLAG_SCAM_LEVEL2; + if (ScamFlg & SCAM_ENABLED) + pCardInfo->si_flags |= FLAG_SCAM_ENABLED; - j = (RD_HARPOON(ioport + hp_bm_ctrl) & ~SCSI_TERM_ENA_L); - if (i & 0x04) { - j |= SCSI_TERM_ENA_L; - } - WR_HARPOON(ioport + hp_bm_ctrl, j); + if (ScamFlg & SCAM_LEVEL2) + pCardInfo->si_flags |= FLAG_SCAM_LEVEL2; - j = (RD_HARPOON(ioport + hp_ee_ctrl) & ~SCSI_TERM_ENA_H); - if (i & 0x08) { - j |= SCSI_TERM_ENA_H; - } - WR_HARPOON(ioport + hp_ee_ctrl, j); - - if (!(RD_HARPOON(ioport + hp_page_ctrl) & NARROW_SCSI_CARD)) - - pCardInfo->si_flags |= SUPPORT_16TAR_32LUN; - - pCardInfo->si_card_family = HARPOON_FAMILY; - pCardInfo->si_bustype = BUSTYPE_PCI; - - if (pCurrNvRam) { - pCardInfo->si_card_model[0] = '9'; - switch (pCurrNvRam->niModel & 0x0f) { - case MODEL_LT: - pCardInfo->si_card_model[1] = '3'; - pCardInfo->si_card_model[2] = '0'; - break; - case MODEL_LW: - pCardInfo->si_card_model[1] = '5'; - pCardInfo->si_card_model[2] = '0'; - break; - case MODEL_DL: - pCardInfo->si_card_model[1] = '3'; - pCardInfo->si_card_model[2] = '2'; - break; - case MODEL_DW: - pCardInfo->si_card_model[1] = '5'; - pCardInfo->si_card_model[2] = '2'; - break; - } - } else { - temp = FPT_utilEERead(ioport, (MODEL_NUMB_0 / 2)); - pCardInfo->si_card_model[0] = (unsigned char)(temp >> 8); - temp = FPT_utilEERead(ioport, (MODEL_NUMB_2 / 2)); + j = (RD_HARPOON(ioport+hp_bm_ctrl) & ~SCSI_TERM_ENA_L); + if (i & 0x04) { + j |= SCSI_TERM_ENA_L; + } + WR_HARPOON(ioport+hp_bm_ctrl, j ); - pCardInfo->si_card_model[1] = (unsigned char)(temp & 0x00FF); - pCardInfo->si_card_model[2] = (unsigned char)(temp >> 8); - } + j = (RD_HARPOON(ioport+hp_ee_ctrl) & ~SCSI_TERM_ENA_H); + if (i & 0x08) { + j |= SCSI_TERM_ENA_H; + } + WR_HARPOON(ioport+hp_ee_ctrl, j ); - if (pCardInfo->si_card_model[1] == '3') { - if (RD_HARPOON(ioport + hp_ee_ctrl) & BIT(7)) - pCardInfo->si_flags |= LOW_BYTE_TERM; - } else if (pCardInfo->si_card_model[2] == '0') { - temp = RD_HARPOON(ioport + hp_xfer_pad); - WR_HARPOON(ioport + hp_xfer_pad, (temp & ~BIT(4))); - if (RD_HARPOON(ioport + hp_ee_ctrl) & BIT(7)) - pCardInfo->si_flags |= LOW_BYTE_TERM; - WR_HARPOON(ioport + hp_xfer_pad, (temp | BIT(4))); - if (RD_HARPOON(ioport + hp_ee_ctrl) & BIT(7)) - pCardInfo->si_flags |= HIGH_BYTE_TERM; - WR_HARPOON(ioport + hp_xfer_pad, temp); - } else { - temp = RD_HARPOON(ioport + hp_ee_ctrl); - temp2 = RD_HARPOON(ioport + hp_xfer_pad); - WR_HARPOON(ioport + hp_ee_ctrl, (temp | SEE_CS)); - WR_HARPOON(ioport + hp_xfer_pad, (temp2 | BIT(4))); - temp3 = 0; - for (i = 0; i < 8; i++) { - temp3 <<= 1; - if (!(RD_HARPOON(ioport + hp_ee_ctrl) & BIT(7))) - temp3 |= 1; - WR_HARPOON(ioport + hp_xfer_pad, (temp2 & ~BIT(4))); - WR_HARPOON(ioport + hp_xfer_pad, (temp2 | BIT(4))); - } - WR_HARPOON(ioport + hp_ee_ctrl, temp); - WR_HARPOON(ioport + hp_xfer_pad, temp2); - if (!(temp3 & BIT(7))) - pCardInfo->si_flags |= LOW_BYTE_TERM; - if (!(temp3 & BIT(6))) - pCardInfo->si_flags |= HIGH_BYTE_TERM; - } + if (!(RD_HARPOON(ioport+hp_page_ctrl) & NARROW_SCSI_CARD)) - ARAM_ACCESS(ioport); + pCardInfo->si_flags |= SUPPORT_16TAR_32LUN; - for (i = 0; i < 4; i++) { + pCardInfo->si_card_family = HARPOON_FAMILY; + pCardInfo->si_bustype = BUSTYPE_PCI; - pCardInfo->si_XlatInfo[i] = - RD_HARPOON(ioport + hp_aramBase + BIOS_DATA_OFFSET + i); - } + if(pCurrNvRam){ + pCardInfo->si_card_model[0] = '9'; + switch(pCurrNvRam->niModel & 0x0f){ + case MODEL_LT: + pCardInfo->si_card_model[1] = '3'; + pCardInfo->si_card_model[2] = '0'; + break; + case MODEL_LW: + pCardInfo->si_card_model[1] = '5'; + pCardInfo->si_card_model[2] = '0'; + break; + case MODEL_DL: + pCardInfo->si_card_model[1] = '3'; + pCardInfo->si_card_model[2] = '2'; + break; + case MODEL_DW: + pCardInfo->si_card_model[1] = '5'; + pCardInfo->si_card_model[2] = '2'; + break; + } + }else{ + temp = FPT_utilEERead(ioport, (MODEL_NUMB_0/2)); + pCardInfo->si_card_model[0] = (UCHAR)(temp >> 8); + temp = FPT_utilEERead(ioport, (MODEL_NUMB_2/2)); + + pCardInfo->si_card_model[1] = (UCHAR)(temp & 0x00FF); + pCardInfo->si_card_model[2] = (UCHAR)(temp >> 8); + } + + if (pCardInfo->si_card_model[1] == '3') + { + if (RD_HARPOON(ioport+hp_ee_ctrl) & BIT(7)) + pCardInfo->si_flags |= LOW_BYTE_TERM; + } + else if (pCardInfo->si_card_model[2] == '0') + { + temp = RD_HARPOON(ioport+hp_xfer_pad); + WR_HARPOON(ioport+hp_xfer_pad, (temp & ~BIT(4))); + if (RD_HARPOON(ioport+hp_ee_ctrl) & BIT(7)) + pCardInfo->si_flags |= LOW_BYTE_TERM; + WR_HARPOON(ioport+hp_xfer_pad, (temp | BIT(4))); + if (RD_HARPOON(ioport+hp_ee_ctrl) & BIT(7)) + pCardInfo->si_flags |= HIGH_BYTE_TERM; + WR_HARPOON(ioport+hp_xfer_pad, temp); + } + else + { + temp = RD_HARPOON(ioport+hp_ee_ctrl); + temp2 = RD_HARPOON(ioport+hp_xfer_pad); + WR_HARPOON(ioport+hp_ee_ctrl, (temp | SEE_CS)); + WR_HARPOON(ioport+hp_xfer_pad, (temp2 | BIT(4))); + temp3 = 0; + for (i = 0; i < 8; i++) + { + temp3 <<= 1; + if (!(RD_HARPOON(ioport+hp_ee_ctrl) & BIT(7))) + temp3 |= 1; + WR_HARPOON(ioport+hp_xfer_pad, (temp2 & ~BIT(4))); + WR_HARPOON(ioport+hp_xfer_pad, (temp2 | BIT(4))); + } + WR_HARPOON(ioport+hp_ee_ctrl, temp); + WR_HARPOON(ioport+hp_xfer_pad, temp2); + if (!(temp3 & BIT(7))) + pCardInfo->si_flags |= LOW_BYTE_TERM; + if (!(temp3 & BIT(6))) + pCardInfo->si_flags |= HIGH_BYTE_TERM; + } + + + ARAM_ACCESS(ioport); + + for ( i = 0; i < 4; i++ ) { + + pCardInfo->si_XlatInfo[i] = + RD_HARPOON(ioport+hp_aramBase+BIOS_DATA_OFFSET+i); + } /* return with -1 if no sort, else return with logical card number sorted by BIOS (zero-based) */ pCardInfo->si_relative_cardnum = - (unsigned - char)(RD_HARPOON(ioport + hp_aramBase + BIOS_RELATIVE_CARD) - 1); + (UCHAR)(RD_HARPOON(ioport+hp_aramBase+BIOS_RELATIVE_CARD)-1); - SGRAM_ACCESS(ioport); + SGRAM_ACCESS(ioport); - FPT_s_PhaseTbl[0] = FPT_phaseDataOut; - FPT_s_PhaseTbl[1] = FPT_phaseDataIn; - FPT_s_PhaseTbl[2] = FPT_phaseIllegal; - FPT_s_PhaseTbl[3] = FPT_phaseIllegal; - FPT_s_PhaseTbl[4] = FPT_phaseCommand; - FPT_s_PhaseTbl[5] = FPT_phaseStatus; - FPT_s_PhaseTbl[6] = FPT_phaseMsgOut; - FPT_s_PhaseTbl[7] = FPT_phaseMsgIn; + FPT_s_PhaseTbl[0] = FPT_phaseDataOut; + FPT_s_PhaseTbl[1] = FPT_phaseDataIn; + FPT_s_PhaseTbl[2] = FPT_phaseIllegal; + FPT_s_PhaseTbl[3] = FPT_phaseIllegal; + FPT_s_PhaseTbl[4] = FPT_phaseCommand; + FPT_s_PhaseTbl[5] = FPT_phaseStatus; + FPT_s_PhaseTbl[6] = FPT_phaseMsgOut; + FPT_s_PhaseTbl[7] = FPT_phaseMsgIn; - pCardInfo->si_present = 0x01; + pCardInfo->si_present = 0x01; - return 0; + return(0); } + /*--------------------------------------------------------------------- * - * Function: FlashPoint_HardwareResetHostAdapter + * Function: SccbMgr_config_adapter * * Description: Setup adapter for normal operation (hard reset). * *---------------------------------------------------------------------*/ -static unsigned long FlashPoint_HardwareResetHostAdapter(struct sccb_mgr_info - *pCardInfo) +static ULONG SccbMgr_config_adapter(PSCCBMGR_INFO pCardInfo) { - struct sccb_card *CurrCard = NULL; - struct nvram_info *pCurrNvRam; - unsigned char i, j, thisCard, ScamFlg; - unsigned short temp, sync_bit_map, id; - unsigned long ioport; + PSCCBcard CurrCard = NULL; + PNVRamInfo pCurrNvRam; + UCHAR i,j,thisCard, ScamFlg; + USHORT temp,sync_bit_map,id; + ULONG ioport; - ioport = pCardInfo->si_baseaddr; + ioport = pCardInfo->si_baseaddr; - for (thisCard = 0; thisCard <= MAX_CARDS; thisCard++) { + for(thisCard =0; thisCard <= MAX_CARDS; thisCard++) { - if (thisCard == MAX_CARDS) { + if (thisCard == MAX_CARDS) { - return FAILURE; - } + return(FAILURE); + } - if (FPT_BL_Card[thisCard].ioPort == ioport) { + if (FPT_BL_Card[thisCard].ioPort == ioport) { - CurrCard = &FPT_BL_Card[thisCard]; - FPT_SccbMgrTableInitCard(CurrCard, thisCard); - break; - } + CurrCard = &FPT_BL_Card[thisCard]; + FPT_SccbMgrTableInitCard(CurrCard,thisCard); + break; + } - else if (FPT_BL_Card[thisCard].ioPort == 0x00) { + else if (FPT_BL_Card[thisCard].ioPort == 0x00) { - FPT_BL_Card[thisCard].ioPort = ioport; - CurrCard = &FPT_BL_Card[thisCard]; + FPT_BL_Card[thisCard].ioPort = ioport; + CurrCard = &FPT_BL_Card[thisCard]; - if (FPT_mbCards) - for (i = 0; i < FPT_mbCards; i++) { - if (CurrCard->ioPort == - FPT_nvRamInfo[i].niBaseAddr) - CurrCard->pNvRamInfo = - &FPT_nvRamInfo[i]; + if(FPT_mbCards) + for(i = 0; i < FPT_mbCards; i++){ + if(CurrCard->ioPort == FPT_nvRamInfo[i].niBaseAddr) + CurrCard->pNvRamInfo = &FPT_nvRamInfo[i]; } - FPT_SccbMgrTableInitCard(CurrCard, thisCard); - CurrCard->cardIndex = thisCard; - CurrCard->cardInfo = pCardInfo; + FPT_SccbMgrTableInitCard(CurrCard,thisCard); + CurrCard->cardIndex = thisCard; + CurrCard->cardInfo = pCardInfo; - break; - } - } + break; + } + } pCurrNvRam = CurrCard->pNvRamInfo; - if (pCurrNvRam) { + if(pCurrNvRam){ ScamFlg = pCurrNvRam->niScamConf; - } else { - ScamFlg = - (unsigned char)FPT_utilEERead(ioport, SCAM_CONFIG / 2); + } + else{ + ScamFlg = (UCHAR) FPT_utilEERead(ioport, SCAM_CONFIG/2); } - FPT_BusMasterInit(ioport); - FPT_XbowInit(ioport, ScamFlg); - FPT_autoLoadDefaultMap(ioport); + FPT_BusMasterInit(ioport); + FPT_XbowInit(ioport, ScamFlg); - for (i = 0, id = 0x01; i != pCardInfo->si_id; i++, id <<= 1) { - } + FPT_autoLoadDefaultMap(ioport); - WR_HARPOON(ioport + hp_selfid_0, id); - WR_HARPOON(ioport + hp_selfid_1, 0x00); - WR_HARPOON(ioport + hp_arb_id, pCardInfo->si_id); - CurrCard->ourId = pCardInfo->si_id; - i = (unsigned char)pCardInfo->si_flags; - if (i & SCSI_PARITY_ENA) - WR_HARPOON(ioport + hp_portctrl_1, (HOST_MODE8 | CHK_SCSI_P)); + for (i = 0,id = 0x01; i != pCardInfo->si_id; i++,id <<= 1){} - j = (RD_HARPOON(ioport + hp_bm_ctrl) & ~SCSI_TERM_ENA_L); - if (i & LOW_BYTE_TERM) - j |= SCSI_TERM_ENA_L; - WR_HARPOON(ioport + hp_bm_ctrl, j); + WR_HARPOON(ioport+hp_selfid_0, id); + WR_HARPOON(ioport+hp_selfid_1, 0x00); + WR_HARPOON(ioport+hp_arb_id, pCardInfo->si_id); + CurrCard->ourId = pCardInfo->si_id; - j = (RD_HARPOON(ioport + hp_ee_ctrl) & ~SCSI_TERM_ENA_H); - if (i & HIGH_BYTE_TERM) - j |= SCSI_TERM_ENA_H; - WR_HARPOON(ioport + hp_ee_ctrl, j); + i = (UCHAR) pCardInfo->si_flags; + if (i & SCSI_PARITY_ENA) + WR_HARPOON(ioport+hp_portctrl_1,(HOST_MODE8 | CHK_SCSI_P)); - if (!(pCardInfo->si_flags & SOFT_RESET)) { + j = (RD_HARPOON(ioport+hp_bm_ctrl) & ~SCSI_TERM_ENA_L); + if (i & LOW_BYTE_TERM) + j |= SCSI_TERM_ENA_L; + WR_HARPOON(ioport+hp_bm_ctrl, j); - FPT_sresb(ioport, thisCard); + j = (RD_HARPOON(ioport+hp_ee_ctrl) & ~SCSI_TERM_ENA_H); + if (i & HIGH_BYTE_TERM) + j |= SCSI_TERM_ENA_H; + WR_HARPOON(ioport+hp_ee_ctrl, j ); - FPT_scini(thisCard, pCardInfo->si_id, 0); - } - if (pCardInfo->si_flags & POST_ALL_UNDERRRUNS) - CurrCard->globalFlags |= F_NO_FILTER; + if (!(pCardInfo->si_flags & SOFT_RESET)) { - if (pCurrNvRam) { - if (pCurrNvRam->niSysConf & 0x10) - CurrCard->globalFlags |= F_GREEN_PC; - } else { - if (FPT_utilEERead(ioport, (SYSTEM_CONFIG / 2)) & GREEN_PC_ENA) + FPT_sresb(ioport,thisCard); + + FPT_scini(thisCard, pCardInfo->si_id, 0); + } + + + + if (pCardInfo->si_flags & POST_ALL_UNDERRRUNS) + CurrCard->globalFlags |= F_NO_FILTER; + + if(pCurrNvRam){ + if(pCurrNvRam->niSysConf & 0x10) CurrCard->globalFlags |= F_GREEN_PC; } + else{ + if (FPT_utilEERead(ioport, (SYSTEM_CONFIG/2)) & GREEN_PC_ENA) + CurrCard->globalFlags |= F_GREEN_PC; + } /* Set global flag to indicate Re-Negotiation to be done on all - ckeck condition */ - if (pCurrNvRam) { - if (pCurrNvRam->niScsiConf & 0x04) - CurrCard->globalFlags |= F_DO_RENEGO; - } else { - if (FPT_utilEERead(ioport, (SCSI_CONFIG / 2)) & RENEGO_ENA) + ckeck condition */ + if(pCurrNvRam){ + if(pCurrNvRam->niScsiConf & 0x04) CurrCard->globalFlags |= F_DO_RENEGO; } + else{ + if (FPT_utilEERead(ioport, (SCSI_CONFIG/2)) & RENEGO_ENA) + CurrCard->globalFlags |= F_DO_RENEGO; + } - if (pCurrNvRam) { - if (pCurrNvRam->niScsiConf & 0x08) - CurrCard->globalFlags |= F_CONLUN_IO; - } else { - if (FPT_utilEERead(ioport, (SCSI_CONFIG / 2)) & CONNIO_ENA) + if(pCurrNvRam){ + if(pCurrNvRam->niScsiConf & 0x08) CurrCard->globalFlags |= F_CONLUN_IO; } + else{ + if (FPT_utilEERead(ioport, (SCSI_CONFIG/2)) & CONNIO_ENA) + CurrCard->globalFlags |= F_CONLUN_IO; + } - temp = pCardInfo->si_per_targ_no_disc; - for (i = 0, id = 1; i < MAX_SCSI_TAR; i++, id <<= 1) { + temp = pCardInfo->si_per_targ_no_disc; - if (temp & id) - FPT_sccbMgrTbl[thisCard][i].TarStatus |= TAR_ALLOW_DISC; - } + for (i = 0,id = 1; i < MAX_SCSI_TAR; i++, id <<= 1) { - sync_bit_map = 0x0001; + if (temp & id) + FPT_sccbMgrTbl[thisCard][i].TarStatus |= TAR_ALLOW_DISC; + } + + sync_bit_map = 0x0001; - for (id = 0; id < (MAX_SCSI_TAR / 2); id++) { + for (id = 0; id < (MAX_SCSI_TAR/2); id++) { - if (pCurrNvRam) { - temp = (unsigned short)pCurrNvRam->niSyncTbl[id]; + if(pCurrNvRam){ + temp = (USHORT) pCurrNvRam->niSyncTbl[id]; temp = ((temp & 0x03) + ((temp << 4) & 0xc0)) + - (((temp << 4) & 0x0300) + ((temp << 8) & 0xc000)); - } else - temp = - FPT_utilEERead(ioport, - (unsigned short)((SYNC_RATE_TBL / 2) - + id)); + (((temp << 4) & 0x0300) + ((temp << 8) & 0xc000)); + }else + temp = FPT_utilEERead(ioport, (USHORT)((SYNC_RATE_TBL/2)+id)); - for (i = 0; i < 2; temp >>= 8, i++) { + for (i = 0; i < 2; temp >>=8,i++) { - if (pCardInfo->si_per_targ_init_sync & sync_bit_map) { + if (pCardInfo->si_per_targ_init_sync & sync_bit_map) { - FPT_sccbMgrTbl[thisCard][id * 2 + - i].TarEEValue = - (unsigned char)temp; - } + FPT_sccbMgrTbl[thisCard][id*2+i].TarEEValue = (UCHAR)temp; + } - else { - FPT_sccbMgrTbl[thisCard][id * 2 + - i].TarStatus |= - SYNC_SUPPORTED; - FPT_sccbMgrTbl[thisCard][id * 2 + - i].TarEEValue = - (unsigned char)(temp & ~EE_SYNC_MASK); - } + else { + FPT_sccbMgrTbl[thisCard][id*2+i].TarStatus |= SYNC_SUPPORTED; + FPT_sccbMgrTbl[thisCard][id*2+i].TarEEValue = + (UCHAR)(temp & ~EE_SYNC_MASK); + } /* if ((pCardInfo->si_per_targ_wide_nego & sync_bit_map) || (id*2+i >= 8)){ */ - if (pCardInfo->si_per_targ_wide_nego & sync_bit_map) { + if (pCardInfo->si_per_targ_wide_nego & sync_bit_map){ - FPT_sccbMgrTbl[thisCard][id * 2 + - i].TarEEValue |= - EE_WIDE_SCSI; + FPT_sccbMgrTbl[thisCard][id*2+i].TarEEValue |= EE_WIDE_SCSI; - } + } - else { /* NARROW SCSI */ - FPT_sccbMgrTbl[thisCard][id * 2 + - i].TarStatus |= - WIDE_NEGOCIATED; - } + else { /* NARROW SCSI */ + FPT_sccbMgrTbl[thisCard][id*2+i].TarStatus |= WIDE_NEGOCIATED; + } - sync_bit_map <<= 1; - } - } + sync_bit_map <<= 1; + + + + } + } - WR_HARPOON((ioport + hp_semaphore), - (unsigned char)(RD_HARPOON((ioport + hp_semaphore)) | - SCCB_MGR_PRESENT)); + WR_HARPOON((ioport+hp_semaphore), + (UCHAR)(RD_HARPOON((ioport+hp_semaphore)) | SCCB_MGR_PRESENT)); - return (unsigned long)CurrCard; + return((ULONG)CurrCard); } -static void FlashPoint_ReleaseHostAdapter(unsigned long pCurrCard) +static void SccbMgr_unload_card(ULONG pCurrCard) { - unsigned char i; - unsigned long portBase; - unsigned long regOffset; - unsigned long scamData; - unsigned long *pScamTbl; - struct nvram_info *pCurrNvRam; + UCHAR i; + ULONG portBase; + ULONG regOffset; + ULONG scamData; + ULONG *pScamTbl; + PNVRamInfo pCurrNvRam; - pCurrNvRam = ((struct sccb_card *)pCurrCard)->pNvRamInfo; + pCurrNvRam = ((PSCCBcard)pCurrCard)->pNvRamInfo; - if (pCurrNvRam) { + if(pCurrNvRam){ FPT_WrStack(pCurrNvRam->niBaseAddr, 0, pCurrNvRam->niModel); FPT_WrStack(pCurrNvRam->niBaseAddr, 1, pCurrNvRam->niSysConf); FPT_WrStack(pCurrNvRam->niBaseAddr, 2, pCurrNvRam->niScsiConf); FPT_WrStack(pCurrNvRam->niBaseAddr, 3, pCurrNvRam->niScamConf); FPT_WrStack(pCurrNvRam->niBaseAddr, 4, pCurrNvRam->niAdapId); - for (i = 0; i < MAX_SCSI_TAR / 2; i++) - FPT_WrStack(pCurrNvRam->niBaseAddr, - (unsigned char)(i + 5), - pCurrNvRam->niSyncTbl[i]); + for(i = 0; i < MAX_SCSI_TAR / 2; i++) + FPT_WrStack(pCurrNvRam->niBaseAddr, (UCHAR)(i+5), pCurrNvRam->niSyncTbl[i]); portBase = pCurrNvRam->niBaseAddr; - for (i = 0; i < MAX_SCSI_TAR; i++) { - regOffset = hp_aramBase + 64 + i * 4; - pScamTbl = (unsigned long *)&pCurrNvRam->niScamTbl[i]; + for(i = 0; i < MAX_SCSI_TAR; i++){ + regOffset = hp_aramBase + 64 + i*4; + pScamTbl = (ULONG *) &pCurrNvRam->niScamTbl[i]; scamData = *pScamTbl; WR_HARP32(portBase, regOffset, scamData); } - } else { - FPT_WrStack(((struct sccb_card *)pCurrCard)->ioPort, 0, 0); + }else{ + FPT_WrStack(((PSCCBcard)pCurrCard)->ioPort, 0, 0); } } -static void FPT_RNVRamData(struct nvram_info *pNvRamInfo) + +static void FPT_RNVRamData(PNVRamInfo pNvRamInfo) { - unsigned char i; - unsigned long portBase; - unsigned long regOffset; - unsigned long scamData; - unsigned long *pScamTbl; - - pNvRamInfo->niModel = FPT_RdStack(pNvRamInfo->niBaseAddr, 0); - pNvRamInfo->niSysConf = FPT_RdStack(pNvRamInfo->niBaseAddr, 1); + UCHAR i; + ULONG portBase; + ULONG regOffset; + ULONG scamData; + ULONG *pScamTbl; + + pNvRamInfo->niModel = FPT_RdStack(pNvRamInfo->niBaseAddr, 0); + pNvRamInfo->niSysConf = FPT_RdStack(pNvRamInfo->niBaseAddr, 1); pNvRamInfo->niScsiConf = FPT_RdStack(pNvRamInfo->niBaseAddr, 2); pNvRamInfo->niScamConf = FPT_RdStack(pNvRamInfo->niBaseAddr, 3); - pNvRamInfo->niAdapId = FPT_RdStack(pNvRamInfo->niBaseAddr, 4); + pNvRamInfo->niAdapId = FPT_RdStack(pNvRamInfo->niBaseAddr, 4); - for (i = 0; i < MAX_SCSI_TAR / 2; i++) - pNvRamInfo->niSyncTbl[i] = - FPT_RdStack(pNvRamInfo->niBaseAddr, (unsigned char)(i + 5)); + for(i = 0; i < MAX_SCSI_TAR / 2; i++) + pNvRamInfo->niSyncTbl[i] = FPT_RdStack(pNvRamInfo->niBaseAddr, (UCHAR)(i+5)); portBase = pNvRamInfo->niBaseAddr; - for (i = 0; i < MAX_SCSI_TAR; i++) { - regOffset = hp_aramBase + 64 + i * 4; + for(i = 0; i < MAX_SCSI_TAR; i++){ + regOffset = hp_aramBase + 64 + i*4; RD_HARP32(portBase, regOffset, scamData); - pScamTbl = (unsigned long *)&pNvRamInfo->niScamTbl[i]; + pScamTbl = (ULONG *) &pNvRamInfo->niScamTbl[i]; *pScamTbl = scamData; } } -static unsigned char FPT_RdStack(unsigned long portBase, unsigned char index) +static UCHAR FPT_RdStack(ULONG portBase, UCHAR index) { WR_HARPOON(portBase + hp_stack_addr, index); - return RD_HARPOON(portBase + hp_stack_data); + return(RD_HARPOON(portBase + hp_stack_data)); } -static void FPT_WrStack(unsigned long portBase, unsigned char index, - unsigned char data) +static void FPT_WrStack(ULONG portBase, UCHAR index, UCHAR data) { WR_HARPOON(portBase + hp_stack_addr, index); WR_HARPOON(portBase + hp_stack_data, data); } -static unsigned char FPT_ChkIfChipInitialized(unsigned long ioPort) + +static UCHAR FPT_ChkIfChipInitialized(ULONG ioPort) { - if ((RD_HARPOON(ioPort + hp_arb_id) & 0x0f) != FPT_RdStack(ioPort, 4)) - return 0; - if ((RD_HARPOON(ioPort + hp_clkctrl_0) & CLKCTRL_DEFAULT) - != CLKCTRL_DEFAULT) - return 0; - if ((RD_HARPOON(ioPort + hp_seltimeout) == TO_250ms) || - (RD_HARPOON(ioPort + hp_seltimeout) == TO_290ms)) - return 1; - return 0; + if((RD_HARPOON(ioPort + hp_arb_id) & 0x0f) != FPT_RdStack(ioPort, 4)) + return(0); + if((RD_HARPOON(ioPort + hp_clkctrl_0) & CLKCTRL_DEFAULT) + != CLKCTRL_DEFAULT) + return(0); + if((RD_HARPOON(ioPort + hp_seltimeout) == TO_250ms) || + (RD_HARPOON(ioPort + hp_seltimeout) == TO_290ms)) + return(1); + return(0); } - /*--------------------------------------------------------------------- * - * Function: FlashPoint_StartCCB + * Function: SccbMgr_start_sccb * * Description: Start a command pointed to by p_Sccb. When the * command is completed it will be returned via the * callback function. * *---------------------------------------------------------------------*/ -static void FlashPoint_StartCCB(unsigned long pCurrCard, struct sccb *p_Sccb) +static void SccbMgr_start_sccb(ULONG pCurrCard, PSCCB p_Sccb) { - unsigned long ioport; - unsigned char thisCard, lun; - struct sccb *pSaveSccb; - CALL_BK_FN callback; + ULONG ioport; + UCHAR thisCard, lun; + PSCCB pSaveSccb; + CALL_BK_FN callback; - thisCard = ((struct sccb_card *)pCurrCard)->cardIndex; - ioport = ((struct sccb_card *)pCurrCard)->ioPort; + thisCard = ((PSCCBcard) pCurrCard)->cardIndex; + ioport = ((PSCCBcard) pCurrCard)->ioPort; - if ((p_Sccb->TargID > MAX_SCSI_TAR) || (p_Sccb->Lun > MAX_LUN)) { + if((p_Sccb->TargID > MAX_SCSI_TAR) || (p_Sccb->Lun > MAX_LUN)) + { p_Sccb->HostStatus = SCCB_COMPLETE; p_Sccb->SccbStatus = SCCB_ERROR; - callback = (CALL_BK_FN) p_Sccb->SccbCallback; + callback = (CALL_BK_FN)p_Sccb->SccbCallback; if (callback) callback(p_Sccb); return; } - FPT_sinits(p_Sccb, thisCard); + FPT_sinits(p_Sccb,thisCard); - if (!((struct sccb_card *)pCurrCard)->cmdCounter) { - WR_HARPOON(ioport + hp_semaphore, - (RD_HARPOON(ioport + hp_semaphore) - | SCCB_MGR_ACTIVE)); - if (((struct sccb_card *)pCurrCard)->globalFlags & F_GREEN_PC) { - WR_HARPOON(ioport + hp_clkctrl_0, CLKCTRL_DEFAULT); - WR_HARPOON(ioport + hp_sys_ctrl, 0x00); - } - } + if (!((PSCCBcard) pCurrCard)->cmdCounter) + { + WR_HARPOON(ioport+hp_semaphore, (RD_HARPOON(ioport+hp_semaphore) + | SCCB_MGR_ACTIVE)); + + if (((PSCCBcard) pCurrCard)->globalFlags & F_GREEN_PC) + { + WR_HARPOON(ioport+hp_clkctrl_0, CLKCTRL_DEFAULT); + WR_HARPOON(ioport+hp_sys_ctrl, 0x00); + } + } - ((struct sccb_card *)pCurrCard)->cmdCounter++; - - if (RD_HARPOON(ioport + hp_semaphore) & BIOS_IN_USE) { - - WR_HARPOON(ioport + hp_semaphore, - (RD_HARPOON(ioport + hp_semaphore) - | TICKLE_ME)); - if (p_Sccb->OperationCode == RESET_COMMAND) { - pSaveSccb = - ((struct sccb_card *)pCurrCard)->currentSCCB; - ((struct sccb_card *)pCurrCard)->currentSCCB = p_Sccb; - FPT_queueSelectFail(&FPT_BL_Card[thisCard], thisCard); - ((struct sccb_card *)pCurrCard)->currentSCCB = - pSaveSccb; - } else { - FPT_queueAddSccb(p_Sccb, thisCard); - } - } + ((PSCCBcard)pCurrCard)->cmdCounter++; - else if ((RD_HARPOON(ioport + hp_page_ctrl) & G_INT_DISABLE)) { - - if (p_Sccb->OperationCode == RESET_COMMAND) { - pSaveSccb = - ((struct sccb_card *)pCurrCard)->currentSCCB; - ((struct sccb_card *)pCurrCard)->currentSCCB = p_Sccb; - FPT_queueSelectFail(&FPT_BL_Card[thisCard], thisCard); - ((struct sccb_card *)pCurrCard)->currentSCCB = - pSaveSccb; - } else { - FPT_queueAddSccb(p_Sccb, thisCard); - } - } + if (RD_HARPOON(ioport+hp_semaphore) & BIOS_IN_USE) { + + WR_HARPOON(ioport+hp_semaphore, (RD_HARPOON(ioport+hp_semaphore) + | TICKLE_ME)); + if(p_Sccb->OperationCode == RESET_COMMAND) + { + pSaveSccb = ((PSCCBcard) pCurrCard)->currentSCCB; + ((PSCCBcard) pCurrCard)->currentSCCB = p_Sccb; + FPT_queueSelectFail(&FPT_BL_Card[thisCard], thisCard); + ((PSCCBcard) pCurrCard)->currentSCCB = pSaveSccb; + } + else + { + FPT_queueAddSccb(p_Sccb,thisCard); + } + } + + else if ((RD_HARPOON(ioport+hp_page_ctrl) & G_INT_DISABLE)) { + + if(p_Sccb->OperationCode == RESET_COMMAND) + { + pSaveSccb = ((PSCCBcard) pCurrCard)->currentSCCB; + ((PSCCBcard) pCurrCard)->currentSCCB = p_Sccb; + FPT_queueSelectFail(&FPT_BL_Card[thisCard], thisCard); + ((PSCCBcard) pCurrCard)->currentSCCB = pSaveSccb; + } + else + { + FPT_queueAddSccb(p_Sccb,thisCard); + } + } - else { + else { - MDISABLE_INT(ioport); + MDISABLE_INT(ioport); - if ((((struct sccb_card *)pCurrCard)->globalFlags & F_CONLUN_IO) - && - ((FPT_sccbMgrTbl[thisCard][p_Sccb->TargID]. - TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING)) + if((((PSCCBcard) pCurrCard)->globalFlags & F_CONLUN_IO) && + ((FPT_sccbMgrTbl[thisCard][p_Sccb->TargID].TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING)) lun = p_Sccb->Lun; else lun = 0; - if ((((struct sccb_card *)pCurrCard)->currentSCCB == NULL) && - (FPT_sccbMgrTbl[thisCard][p_Sccb->TargID].TarSelQ_Cnt == 0) - && (FPT_sccbMgrTbl[thisCard][p_Sccb->TargID].TarLUNBusy[lun] - == 0)) { + if ((((PSCCBcard) pCurrCard)->currentSCCB == NULL) && + (FPT_sccbMgrTbl[thisCard][p_Sccb->TargID].TarSelQ_Cnt == 0) && + (FPT_sccbMgrTbl[thisCard][p_Sccb->TargID].TarLUNBusy[lun] + == 0)) { - ((struct sccb_card *)pCurrCard)->currentSCCB = p_Sccb; - FPT_ssel(p_Sccb->SccbIOPort, thisCard); - } + ((PSCCBcard) pCurrCard)->currentSCCB = p_Sccb; + FPT_ssel(p_Sccb->SccbIOPort,thisCard); + } - else { - - if (p_Sccb->OperationCode == RESET_COMMAND) { - pSaveSccb = - ((struct sccb_card *)pCurrCard)-> - currentSCCB; - ((struct sccb_card *)pCurrCard)->currentSCCB = - p_Sccb; - FPT_queueSelectFail(&FPT_BL_Card[thisCard], - thisCard); - ((struct sccb_card *)pCurrCard)->currentSCCB = - pSaveSccb; - } else { - FPT_queueAddSccb(p_Sccb, thisCard); - } - } + else { - MENABLE_INT(ioport); - } + if(p_Sccb->OperationCode == RESET_COMMAND) + { + pSaveSccb = ((PSCCBcard) pCurrCard)->currentSCCB; + ((PSCCBcard) pCurrCard)->currentSCCB = p_Sccb; + FPT_queueSelectFail(&FPT_BL_Card[thisCard], thisCard); + ((PSCCBcard) pCurrCard)->currentSCCB = pSaveSccb; + } + else + { + FPT_queueAddSccb(p_Sccb,thisCard); + } + } + + + MENABLE_INT(ioport); + } } + /*--------------------------------------------------------------------- * - * Function: FlashPoint_AbortCCB + * Function: SccbMgr_abort_sccb * * Description: Abort the command pointed to by p_Sccb. When the * command is completed it will be returned via the * callback function. * *---------------------------------------------------------------------*/ -static int FlashPoint_AbortCCB(unsigned long pCurrCard, struct sccb *p_Sccb) +static int SccbMgr_abort_sccb(ULONG pCurrCard, PSCCB p_Sccb) { - unsigned long ioport; + ULONG ioport; - unsigned char thisCard; + UCHAR thisCard; CALL_BK_FN callback; - unsigned char TID; - struct sccb *pSaveSCCB; - struct sccb_mgr_tar_info *currTar_Info; + UCHAR TID; + PSCCB pSaveSCCB; + PSCCBMgr_tar_info currTar_Info; + - ioport = ((struct sccb_card *)pCurrCard)->ioPort; + ioport = ((PSCCBcard) pCurrCard)->ioPort; - thisCard = ((struct sccb_card *)pCurrCard)->cardIndex; + thisCard = ((PSCCBcard)pCurrCard)->cardIndex; - if (!(RD_HARPOON(ioport + hp_page_ctrl) & G_INT_DISABLE)) { + if (!(RD_HARPOON(ioport+hp_page_ctrl) & G_INT_DISABLE)) + { - if (FPT_queueFindSccb(p_Sccb, thisCard)) { + if (FPT_queueFindSccb(p_Sccb,thisCard)) + { - ((struct sccb_card *)pCurrCard)->cmdCounter--; + ((PSCCBcard)pCurrCard)->cmdCounter--; - if (!((struct sccb_card *)pCurrCard)->cmdCounter) - WR_HARPOON(ioport + hp_semaphore, - (RD_HARPOON(ioport + hp_semaphore) - & (unsigned - char)(~(SCCB_MGR_ACTIVE | - TICKLE_ME)))); + if (!((PSCCBcard)pCurrCard)->cmdCounter) + WR_HARPOON(ioport+hp_semaphore,(RD_HARPOON(ioport+hp_semaphore) + & (UCHAR)(~(SCCB_MGR_ACTIVE | TICKLE_ME)) )); p_Sccb->SccbStatus = SCCB_ABORT; callback = p_Sccb->SccbCallback; callback(p_Sccb); - return 0; + return(0); } - else { - if (((struct sccb_card *)pCurrCard)->currentSCCB == - p_Sccb) { + else + { + if (((PSCCBcard)pCurrCard)->currentSCCB == p_Sccb) + { p_Sccb->SccbStatus = SCCB_ABORT; - return 0; + return(0); } - else { + else + { TID = p_Sccb->TargID; - if (p_Sccb->Sccb_tag) { + + if(p_Sccb->Sccb_tag) + { MDISABLE_INT(ioport); - if (((struct sccb_card *)pCurrCard)-> - discQ_Tbl[p_Sccb->Sccb_tag] == - p_Sccb) { + if (((PSCCBcard) pCurrCard)->discQ_Tbl[p_Sccb->Sccb_tag]==p_Sccb) + { p_Sccb->SccbStatus = SCCB_ABORT; - p_Sccb->Sccb_scsistat = - ABORT_ST; - p_Sccb->Sccb_scsimsg = - SMABORT_TAG; - - if (((struct sccb_card *) - pCurrCard)->currentSCCB == - NULL) { - ((struct sccb_card *) - pCurrCard)-> - currentSCCB = p_Sccb; - FPT_ssel(ioport, - thisCard); - } else { - pSaveSCCB = - ((struct sccb_card - *)pCurrCard)-> - currentSCCB; - ((struct sccb_card *) - pCurrCard)-> - currentSCCB = p_Sccb; - FPT_queueSelectFail((struct sccb_card *)pCurrCard, thisCard); - ((struct sccb_card *) - pCurrCard)-> - currentSCCB = pSaveSCCB; + p_Sccb->Sccb_scsistat = ABORT_ST; + p_Sccb->Sccb_scsimsg = SMABORT_TAG; + + if(((PSCCBcard) pCurrCard)->currentSCCB == NULL) + { + ((PSCCBcard) pCurrCard)->currentSCCB = p_Sccb; + FPT_ssel(ioport, thisCard); + } + else + { + pSaveSCCB = ((PSCCBcard) pCurrCard)->currentSCCB; + ((PSCCBcard) pCurrCard)->currentSCCB = p_Sccb; + FPT_queueSelectFail((PSCCBcard) pCurrCard, thisCard); + ((PSCCBcard) pCurrCard)->currentSCCB = pSaveSCCB; } } MENABLE_INT(ioport); - return 0; - } else { - currTar_Info = - &FPT_sccbMgrTbl[thisCard][p_Sccb-> - TargID]; - - if (FPT_BL_Card[thisCard]. - discQ_Tbl[currTar_Info-> - LunDiscQ_Idx[p_Sccb->Lun]] - == p_Sccb) { + return(0); + } + else + { + currTar_Info = &FPT_sccbMgrTbl[thisCard][p_Sccb->TargID]; + + if(FPT_BL_Card[thisCard].discQ_Tbl[currTar_Info->LunDiscQ_Idx[p_Sccb->Lun]] + == p_Sccb) + { p_Sccb->SccbStatus = SCCB_ABORT; - return 0; + return(0); } } } } } - return -1; + return(-1); } + /*--------------------------------------------------------------------- * - * Function: FlashPoint_InterruptPending + * Function: SccbMgr_my_int * * Description: Do a quick check to determine if there is a pending * interrupt for this card and disable the IRQ Pin if so. * *---------------------------------------------------------------------*/ -static unsigned char FlashPoint_InterruptPending(unsigned long pCurrCard) +static UCHAR SccbMgr_my_int(ULONG pCurrCard) { - unsigned long ioport; + ULONG ioport; - ioport = ((struct sccb_card *)pCurrCard)->ioPort; + ioport = ((PSCCBcard)pCurrCard)->ioPort; - if (RD_HARPOON(ioport + hp_int_status) & INT_ASSERTED) { - return 1; - } + if (RD_HARPOON(ioport+hp_int_status) & INT_ASSERTED) + { + return(1); + } - else + else - return 0; + return(0); } + + /*--------------------------------------------------------------------- * - * Function: FlashPoint_HandleInterrupt + * Function: SccbMgr_isr * * Description: This is our entry point when an interrupt is generated * by the card and the upper level driver passes it on to * us. * *---------------------------------------------------------------------*/ -static int FlashPoint_HandleInterrupt(unsigned long pCurrCard) +static int SccbMgr_isr(ULONG pCurrCard) { - struct sccb *currSCCB; - unsigned char thisCard, result, bm_status, bm_int_st; - unsigned short hp_int; - unsigned char i, target; - unsigned long ioport; + PSCCB currSCCB; + UCHAR thisCard,result,bm_status, bm_int_st; + USHORT hp_int; + UCHAR i, target; + ULONG ioport; - thisCard = ((struct sccb_card *)pCurrCard)->cardIndex; - ioport = ((struct sccb_card *)pCurrCard)->ioPort; + thisCard = ((PSCCBcard)pCurrCard)->cardIndex; + ioport = ((PSCCBcard)pCurrCard)->ioPort; - MDISABLE_INT(ioport); + MDISABLE_INT(ioport); - if ((bm_int_st = RD_HARPOON(ioport + hp_int_status)) & EXT_STATUS_ON) - bm_status = - RD_HARPOON(ioport + - hp_ext_status) & (unsigned char)BAD_EXT_STATUS; - else - bm_status = 0; + if ((bm_int_st=RD_HARPOON(ioport+hp_int_status)) & EXT_STATUS_ON) + bm_status = RD_HARPOON(ioport+hp_ext_status) & (UCHAR)BAD_EXT_STATUS; + else + bm_status = 0; - WR_HARPOON(ioport + hp_int_mask, (INT_CMD_COMPL | SCSI_INTERRUPT)); + WR_HARPOON(ioport+hp_int_mask, (INT_CMD_COMPL | SCSI_INTERRUPT)); - while ((hp_int = - RDW_HARPOON((ioport + - hp_intstat)) & FPT_default_intena) | bm_status) { + while ((hp_int = RDW_HARPOON((ioport+hp_intstat)) & FPT_default_intena) | + bm_status) + { - currSCCB = ((struct sccb_card *)pCurrCard)->currentSCCB; + currSCCB = ((PSCCBcard)pCurrCard)->currentSCCB; - if (hp_int & (FIFO | TIMEOUT | RESET | SCAM_SEL) || bm_status) { - result = - FPT_SccbMgr_bad_isr(ioport, thisCard, - ((struct sccb_card *)pCurrCard), - hp_int); - WRW_HARPOON((ioport + hp_intstat), - (FIFO | TIMEOUT | RESET | SCAM_SEL)); - bm_status = 0; + if (hp_int & (FIFO | TIMEOUT | RESET | SCAM_SEL) || bm_status) { + result = FPT_SccbMgr_bad_isr(ioport,thisCard,((PSCCBcard)pCurrCard),hp_int); + WRW_HARPOON((ioport+hp_intstat), (FIFO | TIMEOUT | RESET | SCAM_SEL)); + bm_status = 0; - if (result) { + if (result) { - MENABLE_INT(ioport); - return result; - } - } + MENABLE_INT(ioport); + return(result); + } + } - else if (hp_int & ICMD_COMP) { - - if (!(hp_int & BUS_FREE)) { - /* Wait for the BusFree before starting a new command. We - must also check for being reselected since the BusFree - may not show up if another device reselects us in 1.5us or - less. SRR Wednesday, 3/8/1995. - */ - while (! - (RDW_HARPOON((ioport + hp_intstat)) & - (BUS_FREE | RSEL))) ; - } - if (((struct sccb_card *)pCurrCard)-> - globalFlags & F_HOST_XFER_ACT) + else if (hp_int & ICMD_COMP) { + + if ( !(hp_int & BUS_FREE) ) { + /* Wait for the BusFree before starting a new command. We + must also check for being reselected since the BusFree + may not show up if another device reselects us in 1.5us or + less. SRR Wednesday, 3/8/1995. + */ + while (!(RDW_HARPOON((ioport+hp_intstat)) & (BUS_FREE | RSEL))) ; + } + + if (((PSCCBcard)pCurrCard)->globalFlags & F_HOST_XFER_ACT) - FPT_phaseChkFifo(ioport, thisCard); + FPT_phaseChkFifo(ioport, thisCard); /* WRW_HARPOON((ioport+hp_intstat), (BUS_FREE | ICMD_COMP | ITAR_DISC | XFER_CNT_0)); */ - WRW_HARPOON((ioport + hp_intstat), CLR_ALL_INT_1); + WRW_HARPOON((ioport+hp_intstat), CLR_ALL_INT_1); - FPT_autoCmdCmplt(ioport, thisCard); + FPT_autoCmdCmplt(ioport,thisCard); - } + } - else if (hp_int & ITAR_DISC) { - if (((struct sccb_card *)pCurrCard)-> - globalFlags & F_HOST_XFER_ACT) { + else if (hp_int & ITAR_DISC) + { - FPT_phaseChkFifo(ioport, thisCard); + if (((PSCCBcard)pCurrCard)->globalFlags & F_HOST_XFER_ACT) { - } + FPT_phaseChkFifo(ioport, thisCard); - if (RD_HARPOON(ioport + hp_gp_reg_1) == SMSAVE_DATA_PTR) { + } - WR_HARPOON(ioport + hp_gp_reg_1, 0x00); - currSCCB->Sccb_XferState |= F_NO_DATA_YET; + if (RD_HARPOON(ioport+hp_gp_reg_1) == SMSAVE_DATA_PTR) { - currSCCB->Sccb_savedATC = currSCCB->Sccb_ATC; - } + WR_HARPOON(ioport+hp_gp_reg_1, 0x00); + currSCCB->Sccb_XferState |= F_NO_DATA_YET; - currSCCB->Sccb_scsistat = DISCONNECT_ST; - FPT_queueDisconnect(currSCCB, thisCard); - - /* Wait for the BusFree before starting a new command. We - must also check for being reselected since the BusFree - may not show up if another device reselects us in 1.5us or - less. SRR Wednesday, 3/8/1995. - */ - while (! - (RDW_HARPOON((ioport + hp_intstat)) & - (BUS_FREE | RSEL)) - && !((RDW_HARPOON((ioport + hp_intstat)) & PHASE) - && RD_HARPOON((ioport + hp_scsisig)) == - (SCSI_BSY | SCSI_REQ | SCSI_CD | SCSI_MSG | - SCSI_IOBIT))) ; - - /* - The additional loop exit condition above detects a timing problem - with the revision D/E harpoon chips. The caller should reset the - host adapter to recover when 0xFE is returned. - */ - if (! - (RDW_HARPOON((ioport + hp_intstat)) & - (BUS_FREE | RSEL))) { - MENABLE_INT(ioport); - return 0xFE; - } + currSCCB->Sccb_savedATC = currSCCB->Sccb_ATC; + } - WRW_HARPOON((ioport + hp_intstat), - (BUS_FREE | ITAR_DISC)); + currSCCB->Sccb_scsistat = DISCONNECT_ST; + FPT_queueDisconnect(currSCCB,thisCard); - ((struct sccb_card *)pCurrCard)->globalFlags |= - F_NEW_SCCB_CMD; + /* Wait for the BusFree before starting a new command. We + must also check for being reselected since the BusFree + may not show up if another device reselects us in 1.5us or + less. SRR Wednesday, 3/8/1995. + */ + while (!(RDW_HARPOON((ioport+hp_intstat)) & (BUS_FREE | RSEL)) && + !((RDW_HARPOON((ioport+hp_intstat)) & PHASE) && + RD_HARPOON((ioport+hp_scsisig)) == + (SCSI_BSY | SCSI_REQ | SCSI_CD | SCSI_MSG | SCSI_IOBIT))) ; - } + /* + The additional loop exit condition above detects a timing problem + with the revision D/E harpoon chips. The caller should reset the + host adapter to recover when 0xFE is returned. + */ + if (!(RDW_HARPOON((ioport+hp_intstat)) & (BUS_FREE | RSEL))) + { + MENABLE_INT(ioport); + return 0xFE; + } - else if (hp_int & RSEL) { + WRW_HARPOON((ioport+hp_intstat), (BUS_FREE | ITAR_DISC)); - WRW_HARPOON((ioport + hp_intstat), - (PROG_HLT | RSEL | PHASE | BUS_FREE)); - if (RDW_HARPOON((ioport + hp_intstat)) & ITAR_DISC) { - if (((struct sccb_card *)pCurrCard)-> - globalFlags & F_HOST_XFER_ACT) { - FPT_phaseChkFifo(ioport, thisCard); - } + ((PSCCBcard)pCurrCard)->globalFlags |= F_NEW_SCCB_CMD; - if (RD_HARPOON(ioport + hp_gp_reg_1) == - SMSAVE_DATA_PTR) { - WR_HARPOON(ioport + hp_gp_reg_1, 0x00); - currSCCB->Sccb_XferState |= - F_NO_DATA_YET; - currSCCB->Sccb_savedATC = - currSCCB->Sccb_ATC; - } + } - WRW_HARPOON((ioport + hp_intstat), - (BUS_FREE | ITAR_DISC)); - currSCCB->Sccb_scsistat = DISCONNECT_ST; - FPT_queueDisconnect(currSCCB, thisCard); - } - FPT_sres(ioport, thisCard, - ((struct sccb_card *)pCurrCard)); - FPT_phaseDecode(ioport, thisCard); + else if (hp_int & RSEL) { - } + WRW_HARPOON((ioport+hp_intstat), (PROG_HLT | RSEL | PHASE | BUS_FREE)); - else if ((hp_int & IDO_STRT) && (!(hp_int & BUS_FREE))) { + if (RDW_HARPOON((ioport+hp_intstat)) & ITAR_DISC) + { + if (((PSCCBcard)pCurrCard)->globalFlags & F_HOST_XFER_ACT) + { + FPT_phaseChkFifo(ioport, thisCard); + } - WRW_HARPOON((ioport + hp_intstat), - (IDO_STRT | XFER_CNT_0)); - FPT_phaseDecode(ioport, thisCard); + if (RD_HARPOON(ioport+hp_gp_reg_1) == SMSAVE_DATA_PTR) + { + WR_HARPOON(ioport+hp_gp_reg_1, 0x00); + currSCCB->Sccb_XferState |= F_NO_DATA_YET; + currSCCB->Sccb_savedATC = currSCCB->Sccb_ATC; + } - } + WRW_HARPOON((ioport+hp_intstat), (BUS_FREE | ITAR_DISC)); + currSCCB->Sccb_scsistat = DISCONNECT_ST; + FPT_queueDisconnect(currSCCB,thisCard); + } - else if ((hp_int & IUNKWN) || (hp_int & PROG_HLT)) { - WRW_HARPOON((ioport + hp_intstat), - (PHASE | IUNKWN | PROG_HLT)); - if ((RD_HARPOON(ioport + hp_prgmcnt_0) & (unsigned char) - 0x3f) < (unsigned char)SELCHK) { - FPT_phaseDecode(ioport, thisCard); - } else { - /* Harpoon problem some SCSI target device respond to selection - with short BUSY pulse (<400ns) this will make the Harpoon is not able - to latch the correct Target ID into reg. x53. - The work around require to correct this reg. But when write to this - reg. (0x53) also increment the FIFO write addr reg (0x6f), thus we - need to read this reg first then restore it later. After update to 0x53 */ - - i = (unsigned - char)(RD_HARPOON(ioport + hp_fifowrite)); - target = - (unsigned - char)(RD_HARPOON(ioport + hp_gp_reg_3)); - WR_HARPOON(ioport + hp_xfer_pad, - (unsigned char)ID_UNLOCK); - WR_HARPOON(ioport + hp_select_id, - (unsigned char)(target | target << - 4)); - WR_HARPOON(ioport + hp_xfer_pad, - (unsigned char)0x00); - WR_HARPOON(ioport + hp_fifowrite, i); - WR_HARPOON(ioport + hp_autostart_3, - (AUTO_IMMED + TAG_STRT)); - } - } + FPT_sres(ioport,thisCard,((PSCCBcard)pCurrCard)); + FPT_phaseDecode(ioport,thisCard); - else if (hp_int & XFER_CNT_0) { + } - WRW_HARPOON((ioport + hp_intstat), XFER_CNT_0); - FPT_schkdd(ioport, thisCard); + else if ((hp_int & IDO_STRT) && (!(hp_int & BUS_FREE))) + { - } + WRW_HARPOON((ioport+hp_intstat), (IDO_STRT | XFER_CNT_0)); + FPT_phaseDecode(ioport,thisCard); - else if (hp_int & BUS_FREE) { + } - WRW_HARPOON((ioport + hp_intstat), BUS_FREE); - if (((struct sccb_card *)pCurrCard)-> - globalFlags & F_HOST_XFER_ACT) { + else if ( (hp_int & IUNKWN) || (hp_int & PROG_HLT) ) + { + WRW_HARPOON((ioport+hp_intstat), (PHASE | IUNKWN | PROG_HLT)); + if ((RD_HARPOON(ioport+hp_prgmcnt_0) & (UCHAR)0x3f)< (UCHAR)SELCHK) + { + FPT_phaseDecode(ioport,thisCard); + } + else + { + /* Harpoon problem some SCSI target device respond to selection + with short BUSY pulse (<400ns) this will make the Harpoon is not able + to latch the correct Target ID into reg. x53. + The work around require to correct this reg. But when write to this + reg. (0x53) also increment the FIFO write addr reg (0x6f), thus we + need to read this reg first then restore it later. After update to 0x53 */ - FPT_hostDataXferAbort(ioport, thisCard, - currSCCB); - } + i = (UCHAR)(RD_HARPOON(ioport+hp_fifowrite)); + target = (UCHAR)(RD_HARPOON(ioport+hp_gp_reg_3)); + WR_HARPOON(ioport+hp_xfer_pad, (UCHAR) ID_UNLOCK); + WR_HARPOON(ioport+hp_select_id, (UCHAR)(target | target<<4)); + WR_HARPOON(ioport+hp_xfer_pad, (UCHAR) 0x00); + WR_HARPOON(ioport+hp_fifowrite, i); + WR_HARPOON(ioport+hp_autostart_3, (AUTO_IMMED+TAG_STRT)); + } + } - FPT_phaseBusFree(ioport, thisCard); - } + else if (hp_int & XFER_CNT_0) { - else if (hp_int & ITICKLE) { + WRW_HARPOON((ioport+hp_intstat), XFER_CNT_0); - WRW_HARPOON((ioport + hp_intstat), ITICKLE); - ((struct sccb_card *)pCurrCard)->globalFlags |= - F_NEW_SCCB_CMD; - } + FPT_schkdd(ioport,thisCard); - if (((struct sccb_card *)pCurrCard)-> - globalFlags & F_NEW_SCCB_CMD) { + } - ((struct sccb_card *)pCurrCard)->globalFlags &= - ~F_NEW_SCCB_CMD; - if (((struct sccb_card *)pCurrCard)->currentSCCB == - NULL) { + else if (hp_int & BUS_FREE) { - FPT_queueSearchSelect(((struct sccb_card *) - pCurrCard), thisCard); - } + WRW_HARPOON((ioport+hp_intstat), BUS_FREE); + + if (((PSCCBcard)pCurrCard)->globalFlags & F_HOST_XFER_ACT) { + + FPT_hostDataXferAbort(ioport,thisCard,currSCCB); + } - if (((struct sccb_card *)pCurrCard)->currentSCCB != - NULL) { - ((struct sccb_card *)pCurrCard)->globalFlags &= - ~F_NEW_SCCB_CMD; - FPT_ssel(ioport, thisCard); + FPT_phaseBusFree(ioport,thisCard); } - break; - } + else if (hp_int & ITICKLE) { + + WRW_HARPOON((ioport+hp_intstat), ITICKLE); + ((PSCCBcard)pCurrCard)->globalFlags |= F_NEW_SCCB_CMD; + } + + + + if (((PSCCBcard)pCurrCard)->globalFlags & F_NEW_SCCB_CMD) { + + + ((PSCCBcard)pCurrCard)->globalFlags &= ~F_NEW_SCCB_CMD; + + + if (((PSCCBcard)pCurrCard)->currentSCCB == NULL) { + + FPT_queueSearchSelect(((PSCCBcard)pCurrCard),thisCard); + } + + if (((PSCCBcard)pCurrCard)->currentSCCB != NULL) { + ((PSCCBcard)pCurrCard)->globalFlags &= ~F_NEW_SCCB_CMD; + FPT_ssel(ioport,thisCard); + } + + break; - } /*end while */ + } - MENABLE_INT(ioport); + } /*end while */ - return 0; + MENABLE_INT(ioport); + + return(0); } /*--------------------------------------------------------------------- @@ -2009,149 +2529,150 @@ static int FlashPoint_HandleInterrupt(unsigned long pCurrCard) * processing time. * *---------------------------------------------------------------------*/ -static unsigned char FPT_SccbMgr_bad_isr(unsigned long p_port, - unsigned char p_card, - struct sccb_card *pCurrCard, - unsigned short p_int) +static UCHAR FPT_SccbMgr_bad_isr(ULONG p_port, UCHAR p_card, + PSCCBcard pCurrCard, USHORT p_int) { - unsigned char temp, ScamFlg; - struct sccb_mgr_tar_info *currTar_Info; - struct nvram_info *pCurrNvRam; + UCHAR temp, ScamFlg; + PSCCBMgr_tar_info currTar_Info; + PNVRamInfo pCurrNvRam; - if (RD_HARPOON(p_port + hp_ext_status) & - (BM_FORCE_OFF | PCI_DEV_TMOUT | BM_PARITY_ERR | PIO_OVERRUN)) { - if (pCurrCard->globalFlags & F_HOST_XFER_ACT) { + if (RD_HARPOON(p_port+hp_ext_status) & + (BM_FORCE_OFF | PCI_DEV_TMOUT | BM_PARITY_ERR | PIO_OVERRUN) ) + { - FPT_hostDataXferAbort(p_port, p_card, - pCurrCard->currentSCCB); - } + if (pCurrCard->globalFlags & F_HOST_XFER_ACT) + { - if (RD_HARPOON(p_port + hp_pci_stat_cfg) & REC_MASTER_ABORT) - { - WR_HARPOON(p_port + hp_pci_stat_cfg, - (RD_HARPOON(p_port + hp_pci_stat_cfg) & - ~REC_MASTER_ABORT)); + FPT_hostDataXferAbort(p_port,p_card, pCurrCard->currentSCCB); + } - WR_HARPOON(p_port + hp_host_blk_cnt, 0x00); + if (RD_HARPOON(p_port+hp_pci_stat_cfg) & REC_MASTER_ABORT) - } + { + WR_HARPOON(p_port+hp_pci_stat_cfg, + (RD_HARPOON(p_port+hp_pci_stat_cfg) & ~REC_MASTER_ABORT)); - if (pCurrCard->currentSCCB != NULL) { + WR_HARPOON(p_port+hp_host_blk_cnt, 0x00); - if (!pCurrCard->currentSCCB->HostStatus) - pCurrCard->currentSCCB->HostStatus = - SCCB_BM_ERR; + } - FPT_sxfrp(p_port, p_card); + if (pCurrCard->currentSCCB != NULL) + { - temp = (unsigned char)(RD_HARPOON(p_port + hp_ee_ctrl) & - (EXT_ARB_ACK | SCSI_TERM_ENA_H)); - WR_HARPOON(p_port + hp_ee_ctrl, - ((unsigned char)temp | SEE_MS | SEE_CS)); - WR_HARPOON(p_port + hp_ee_ctrl, temp); + if (!pCurrCard->currentSCCB->HostStatus) + pCurrCard->currentSCCB->HostStatus = SCCB_BM_ERR; - if (! - (RDW_HARPOON((p_port + hp_intstat)) & - (BUS_FREE | RESET))) { - FPT_phaseDecode(p_port, p_card); - } - } - } + FPT_sxfrp(p_port,p_card); - else if (p_int & RESET) { + temp = (UCHAR)(RD_HARPOON(p_port+hp_ee_ctrl) & + (EXT_ARB_ACK | SCSI_TERM_ENA_H)); + WR_HARPOON(p_port+hp_ee_ctrl, ((UCHAR)temp | SEE_MS | SEE_CS)); + WR_HARPOON(p_port+hp_ee_ctrl, temp); - WR_HARPOON(p_port + hp_clkctrl_0, CLKCTRL_DEFAULT); - WR_HARPOON(p_port + hp_sys_ctrl, 0x00); - if (pCurrCard->currentSCCB != NULL) { + if (!(RDW_HARPOON((p_port+hp_intstat)) & (BUS_FREE | RESET))) + { + FPT_phaseDecode(p_port,p_card); + } + } + } - if (pCurrCard->globalFlags & F_HOST_XFER_ACT) - FPT_hostDataXferAbort(p_port, p_card, - pCurrCard->currentSCCB); - } + else if (p_int & RESET) + { - DISABLE_AUTO(p_port); + WR_HARPOON(p_port+hp_clkctrl_0, CLKCTRL_DEFAULT); + WR_HARPOON(p_port+hp_sys_ctrl, 0x00); + if (pCurrCard->currentSCCB != NULL) { - FPT_sresb(p_port, p_card); + if (pCurrCard->globalFlags & F_HOST_XFER_ACT) - while (RD_HARPOON(p_port + hp_scsictrl_0) & SCSI_RST) { - } + FPT_hostDataXferAbort(p_port,p_card, pCurrCard->currentSCCB); + } - pCurrNvRam = pCurrCard->pNvRamInfo; - if (pCurrNvRam) { - ScamFlg = pCurrNvRam->niScamConf; - } else { - ScamFlg = - (unsigned char)FPT_utilEERead(p_port, - SCAM_CONFIG / 2); - } - FPT_XbowInit(p_port, ScamFlg); + DISABLE_AUTO(p_port); - FPT_scini(p_card, pCurrCard->ourId, 0); + FPT_sresb(p_port,p_card); - return 0xFF; - } + while(RD_HARPOON(p_port+hp_scsictrl_0) & SCSI_RST) {} + + pCurrNvRam = pCurrCard->pNvRamInfo; + if(pCurrNvRam){ + ScamFlg = pCurrNvRam->niScamConf; + } + else{ + ScamFlg = (UCHAR) FPT_utilEERead(p_port, SCAM_CONFIG/2); + } - else if (p_int & FIFO) { + FPT_XbowInit(p_port, ScamFlg); - WRW_HARPOON((p_port + hp_intstat), FIFO); + FPT_scini(p_card, pCurrCard->ourId, 0); - if (pCurrCard->currentSCCB != NULL) - FPT_sxfrp(p_port, p_card); - } + return(0xFF); + } + + + else if (p_int & FIFO) { + + WRW_HARPOON((p_port+hp_intstat), FIFO); + + if (pCurrCard->currentSCCB != NULL) + FPT_sxfrp(p_port,p_card); + } + + else if (p_int & TIMEOUT) + { - else if (p_int & TIMEOUT) { + DISABLE_AUTO(p_port); - DISABLE_AUTO(p_port); + WRW_HARPOON((p_port+hp_intstat), + (PROG_HLT | TIMEOUT | SEL |BUS_FREE | PHASE | IUNKWN)); - WRW_HARPOON((p_port + hp_intstat), - (PROG_HLT | TIMEOUT | SEL | BUS_FREE | PHASE | - IUNKWN)); + pCurrCard->currentSCCB->HostStatus = SCCB_SELECTION_TIMEOUT; - pCurrCard->currentSCCB->HostStatus = SCCB_SELECTION_TIMEOUT; - currTar_Info = - &FPT_sccbMgrTbl[p_card][pCurrCard->currentSCCB->TargID]; - if ((pCurrCard->globalFlags & F_CONLUN_IO) - && ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) != - TAG_Q_TRYING)) - currTar_Info->TarLUNBusy[pCurrCard->currentSCCB->Lun] = - 0; + currTar_Info = &FPT_sccbMgrTbl[p_card][pCurrCard->currentSCCB->TargID]; + if((pCurrCard->globalFlags & F_CONLUN_IO) && + ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING)) + currTar_Info->TarLUNBusy[pCurrCard->currentSCCB->Lun] = 0; else - currTar_Info->TarLUNBusy[0] = 0; + currTar_Info->TarLUNBusy[0] = 0; - if (currTar_Info->TarEEValue & EE_SYNC_MASK) { - currTar_Info->TarSyncCtrl = 0; - currTar_Info->TarStatus &= ~TAR_SYNC_MASK; - } - if (currTar_Info->TarEEValue & EE_WIDE_SCSI) { - currTar_Info->TarStatus &= ~TAR_WIDE_MASK; - } + if (currTar_Info->TarEEValue & EE_SYNC_MASK) + { + currTar_Info->TarSyncCtrl = 0; + currTar_Info->TarStatus &= ~TAR_SYNC_MASK; + } - FPT_sssyncv(p_port, pCurrCard->currentSCCB->TargID, NARROW_SCSI, - currTar_Info); + if (currTar_Info->TarEEValue & EE_WIDE_SCSI) + { + currTar_Info->TarStatus &= ~TAR_WIDE_MASK; + } - FPT_queueCmdComplete(pCurrCard, pCurrCard->currentSCCB, p_card); + FPT_sssyncv(p_port, pCurrCard->currentSCCB->TargID, NARROW_SCSI,currTar_Info); - } + FPT_queueCmdComplete(pCurrCard, pCurrCard->currentSCCB, p_card); + + } - else if (p_int & SCAM_SEL) { + else if (p_int & SCAM_SEL) + { - FPT_scarb(p_port, LEVEL2_TAR); - FPT_scsel(p_port); - FPT_scasid(p_card, p_port); + FPT_scarb(p_port,LEVEL2_TAR); + FPT_scsel(p_port); + FPT_scasid(p_card, p_port); - FPT_scbusf(p_port); + FPT_scbusf(p_port); - WRW_HARPOON((p_port + hp_intstat), SCAM_SEL); - } + WRW_HARPOON((p_port+hp_intstat), SCAM_SEL); + } - return 0x00; + return(0x00); } + /*--------------------------------------------------------------------- * * Function: SccbMgrTableInit @@ -2162,19 +2683,21 @@ static unsigned char FPT_SccbMgr_bad_isr(unsigned long p_port, static void FPT_SccbMgrTableInitAll() { - unsigned char thisCard; + UCHAR thisCard; - for (thisCard = 0; thisCard < MAX_CARDS; thisCard++) { - FPT_SccbMgrTableInitCard(&FPT_BL_Card[thisCard], thisCard); + for (thisCard = 0; thisCard < MAX_CARDS; thisCard++) + { + FPT_SccbMgrTableInitCard(&FPT_BL_Card[thisCard],thisCard); - FPT_BL_Card[thisCard].ioPort = 0x00; - FPT_BL_Card[thisCard].cardInfo = NULL; - FPT_BL_Card[thisCard].cardIndex = 0xFF; - FPT_BL_Card[thisCard].ourId = 0x00; - FPT_BL_Card[thisCard].pNvRamInfo = NULL; - } + FPT_BL_Card[thisCard].ioPort = 0x00; + FPT_BL_Card[thisCard].cardInfo = NULL; + FPT_BL_Card[thisCard].cardIndex = 0xFF; + FPT_BL_Card[thisCard].ourId = 0x00; + FPT_BL_Card[thisCard].pNvRamInfo = NULL; + } } + /*--------------------------------------------------------------------- * * Function: SccbMgrTableInit @@ -2183,30 +2706,33 @@ static void FPT_SccbMgrTableInitAll() * *---------------------------------------------------------------------*/ -static void FPT_SccbMgrTableInitCard(struct sccb_card *pCurrCard, - unsigned char p_card) +static void FPT_SccbMgrTableInitCard(PSCCBcard pCurrCard, UCHAR p_card) { - unsigned char scsiID, qtag; + UCHAR scsiID, qtag; - for (qtag = 0; qtag < QUEUE_DEPTH; qtag++) { + for (qtag = 0; qtag < QUEUE_DEPTH; qtag++) + { FPT_BL_Card[p_card].discQ_Tbl[qtag] = NULL; } - for (scsiID = 0; scsiID < MAX_SCSI_TAR; scsiID++) { - FPT_sccbMgrTbl[p_card][scsiID].TarStatus = 0; - FPT_sccbMgrTbl[p_card][scsiID].TarEEValue = 0; - FPT_SccbMgrTableInitTarget(p_card, scsiID); - } + for (scsiID = 0; scsiID < MAX_SCSI_TAR; scsiID++) + { + FPT_sccbMgrTbl[p_card][scsiID].TarStatus = 0; + FPT_sccbMgrTbl[p_card][scsiID].TarEEValue = 0; + FPT_SccbMgrTableInitTarget(p_card, scsiID); + } - pCurrCard->scanIndex = 0x00; - pCurrCard->currentSCCB = NULL; - pCurrCard->globalFlags = 0x00; - pCurrCard->cmdCounter = 0x00; + pCurrCard->scanIndex = 0x00; + pCurrCard->currentSCCB = NULL; + pCurrCard->globalFlags = 0x00; + pCurrCard->cmdCounter = 0x00; pCurrCard->tagQ_Lst = 0x01; - pCurrCard->discQCount = 0; + pCurrCard->discQCount = 0; + } + /*--------------------------------------------------------------------- * * Function: SccbMgrTableInit @@ -2215,12 +2741,11 @@ static void FPT_SccbMgrTableInitCard(struct sccb_card *pCurrCard, * *---------------------------------------------------------------------*/ -static void FPT_SccbMgrTableInitTarget(unsigned char p_card, - unsigned char target) +static void FPT_SccbMgrTableInitTarget(UCHAR p_card, UCHAR target) { - unsigned char lun, qtag; - struct sccb_mgr_tar_info *currTar_Info; + UCHAR lun, qtag; + PSCCBMgr_tar_info currTar_Info; currTar_Info = &FPT_sccbMgrTbl[p_card][target]; @@ -2232,15 +2757,19 @@ static void FPT_SccbMgrTableInitTarget(unsigned char p_card, currTar_Info->TarTagQ_Cnt = 0; currTar_Info->TarLUN_CA = 0; - for (lun = 0; lun < MAX_LUN; lun++) { + + for (lun = 0; lun < MAX_LUN; lun++) + { currTar_Info->TarLUNBusy[lun] = 0; currTar_Info->LunDiscQ_Idx[lun] = 0; } - for (qtag = 0; qtag < QUEUE_DEPTH; qtag++) { - if (FPT_BL_Card[p_card].discQ_Tbl[qtag] != NULL) { - if (FPT_BL_Card[p_card].discQ_Tbl[qtag]->TargID == - target) { + for (qtag = 0; qtag < QUEUE_DEPTH; qtag++) + { + if(FPT_BL_Card[p_card].discQ_Tbl[qtag] != NULL) + { + if(FPT_BL_Card[p_card].discQ_Tbl[qtag]->TargID == target) + { FPT_BL_Card[p_card].discQ_Tbl[qtag] = NULL; FPT_BL_Card[p_card].discQCount--; } @@ -2248,6 +2777,7 @@ static void FPT_SccbMgrTableInitTarget(unsigned char p_card, } } + /*--------------------------------------------------------------------- * * Function: sfetm @@ -2257,66 +2787,71 @@ static void FPT_SccbMgrTableInitTarget(unsigned char p_card, * *---------------------------------------------------------------------*/ -static unsigned char FPT_sfm(unsigned long port, struct sccb *pCurrSCCB) +static UCHAR FPT_sfm(ULONG port, PSCCB pCurrSCCB) { - unsigned char message; - unsigned short TimeOutLoop; + UCHAR message; + USHORT TimeOutLoop; TimeOutLoop = 0; - while ((!(RD_HARPOON(port + hp_scsisig) & SCSI_REQ)) && - (TimeOutLoop++ < 20000)) { - } + while( (!(RD_HARPOON(port+hp_scsisig) & SCSI_REQ)) && + (TimeOutLoop++ < 20000) ){} + + + WR_HARPOON(port+hp_portctrl_0, SCSI_PORT); - WR_HARPOON(port + hp_portctrl_0, SCSI_PORT); + message = RD_HARPOON(port+hp_scsidata_0); - message = RD_HARPOON(port + hp_scsidata_0); + WR_HARPOON(port+hp_scsisig, SCSI_ACK + S_MSGI_PH); - WR_HARPOON(port + hp_scsisig, SCSI_ACK + S_MSGI_PH); if (TimeOutLoop > 20000) - message = 0x00; /* force message byte = 0 if Time Out on Req */ - - if ((RDW_HARPOON((port + hp_intstat)) & PARITY) && - (RD_HARPOON(port + hp_addstat) & SCSI_PAR_ERR)) { - WR_HARPOON(port + hp_scsisig, (SCSI_ACK + S_ILL_PH)); - WR_HARPOON(port + hp_xferstat, 0); - WR_HARPOON(port + hp_fiforead, 0); - WR_HARPOON(port + hp_fifowrite, 0); - if (pCurrSCCB != NULL) { + message = 0x00; /* force message byte = 0 if Time Out on Req */ + + if ((RDW_HARPOON((port+hp_intstat)) & PARITY) && + (RD_HARPOON(port+hp_addstat) & SCSI_PAR_ERR)) + { + WR_HARPOON(port+hp_scsisig, (SCSI_ACK + S_ILL_PH)); + WR_HARPOON(port+hp_xferstat, 0); + WR_HARPOON(port+hp_fiforead, 0); + WR_HARPOON(port+hp_fifowrite, 0); + if (pCurrSCCB != NULL) + { pCurrSCCB->Sccb_scsimsg = SMPARITY; } message = 0x00; - do { + do + { ACCEPT_MSG_ATN(port); TimeOutLoop = 0; - while ((!(RD_HARPOON(port + hp_scsisig) & SCSI_REQ)) && - (TimeOutLoop++ < 20000)) { - } - if (TimeOutLoop > 20000) { - WRW_HARPOON((port + hp_intstat), PARITY); - return message; + while( (!(RD_HARPOON(port+hp_scsisig) & SCSI_REQ)) && + (TimeOutLoop++ < 20000) ){} + if (TimeOutLoop > 20000) + { + WRW_HARPOON((port+hp_intstat), PARITY); + return(message); } - if ((RD_HARPOON(port + hp_scsisig) & S_SCSI_PHZ) != - S_MSGI_PH) { - WRW_HARPOON((port + hp_intstat), PARITY); - return message; + if ((RD_HARPOON(port+hp_scsisig) & S_SCSI_PHZ) != S_MSGI_PH) + { + WRW_HARPOON((port+hp_intstat), PARITY); + return(message); } - WR_HARPOON(port + hp_portctrl_0, SCSI_PORT); + WR_HARPOON(port+hp_portctrl_0, SCSI_PORT); - RD_HARPOON(port + hp_scsidata_0); + RD_HARPOON(port+hp_scsidata_0); - WR_HARPOON(port + hp_scsisig, (SCSI_ACK + S_ILL_PH)); + WR_HARPOON(port+hp_scsisig, (SCSI_ACK + S_ILL_PH)); - } while (1); + }while(1); } - WR_HARPOON(port + hp_scsisig, (SCSI_ACK + S_ILL_PH)); - WR_HARPOON(port + hp_xferstat, 0); - WR_HARPOON(port + hp_fiforead, 0); - WR_HARPOON(port + hp_fifowrite, 0); - return message; + WR_HARPOON(port+hp_scsisig, (SCSI_ACK + S_ILL_PH)); + WR_HARPOON(port+hp_xferstat, 0); + WR_HARPOON(port+hp_fiforead, 0); + WR_HARPOON(port+hp_fifowrite, 0); + return(message); } + /*--------------------------------------------------------------------- * * Function: FPT_ssel @@ -2325,90 +2860,102 @@ static unsigned char FPT_sfm(unsigned long port, struct sccb *pCurrSCCB) * *---------------------------------------------------------------------*/ -static void FPT_ssel(unsigned long port, unsigned char p_card) +static void FPT_ssel(ULONG port, UCHAR p_card) { - unsigned char auto_loaded, i, target, *theCCB; + UCHAR auto_loaded, i, target, *theCCB; - unsigned long cdb_reg; - struct sccb_card *CurrCard; - struct sccb *currSCCB; - struct sccb_mgr_tar_info *currTar_Info; - unsigned char lastTag, lun; + ULONG cdb_reg; + PSCCBcard CurrCard; + PSCCB currSCCB; + PSCCBMgr_tar_info currTar_Info; + UCHAR lastTag, lun; - CurrCard = &FPT_BL_Card[p_card]; - currSCCB = CurrCard->currentSCCB; - target = currSCCB->TargID; - currTar_Info = &FPT_sccbMgrTbl[p_card][target]; - lastTag = CurrCard->tagQ_Lst; + CurrCard = &FPT_BL_Card[p_card]; + currSCCB = CurrCard->currentSCCB; + target = currSCCB->TargID; + currTar_Info = &FPT_sccbMgrTbl[p_card][target]; + lastTag = CurrCard->tagQ_Lst; + + ARAM_ACCESS(port); - ARAM_ACCESS(port); if ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) == TAG_Q_REJECT) currSCCB->ControlByte &= ~F_USE_CMD_Q; - if (((CurrCard->globalFlags & F_CONLUN_IO) && - ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))) + if(((CurrCard->globalFlags & F_CONLUN_IO) && + ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))) - lun = currSCCB->Lun; + lun = currSCCB->Lun; else lun = 0; - if (CurrCard->globalFlags & F_TAG_STARTED) { - if (!(currSCCB->ControlByte & F_USE_CMD_Q)) { - if ((currTar_Info->TarLUN_CA == 0) - && ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) - == TAG_Q_TRYING)) { - - if (currTar_Info->TarTagQ_Cnt != 0) { - currTar_Info->TarLUNBusy[lun] = 1; - FPT_queueSelectFail(CurrCard, p_card); - SGRAM_ACCESS(port); - return; - } - else { - currTar_Info->TarLUNBusy[lun] = 1; - } + if (CurrCard->globalFlags & F_TAG_STARTED) + { + if (!(currSCCB->ControlByte & F_USE_CMD_Q)) + { + if ((currTar_Info->TarLUN_CA == 0) + && ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) + == TAG_Q_TRYING)) + { - } - /*End non-tagged */ - else { - currTar_Info->TarLUNBusy[lun] = 1; - } + if (currTar_Info->TarTagQ_Cnt !=0) + { + currTar_Info->TarLUNBusy[lun] = 1; + FPT_queueSelectFail(CurrCard,p_card); + SGRAM_ACCESS(port); + return; + } - } - /*!Use cmd Q Tagged */ - else { - if (currTar_Info->TarLUN_CA == 1) { - FPT_queueSelectFail(CurrCard, p_card); - SGRAM_ACCESS(port); - return; - } + else { + currTar_Info->TarLUNBusy[lun] = 1; + } - currTar_Info->TarLUNBusy[lun] = 1; + } /*End non-tagged */ - } /*else use cmd Q tagged */ + else { + currTar_Info->TarLUNBusy[lun] = 1; + } - } - /*if glob tagged started */ - else { - currTar_Info->TarLUNBusy[lun] = 1; - } + } /*!Use cmd Q Tagged */ - if ((((CurrCard->globalFlags & F_CONLUN_IO) && - ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING)) - || (!(currSCCB->ControlByte & F_USE_CMD_Q)))) { - if (CurrCard->discQCount >= QUEUE_DEPTH) { + else { + if (currTar_Info->TarLUN_CA == 1) + { + FPT_queueSelectFail(CurrCard,p_card); + SGRAM_ACCESS(port); + return; + } + + currTar_Info->TarLUNBusy[lun] = 1; + + } /*else use cmd Q tagged */ + + } /*if glob tagged started */ + + else { + currTar_Info->TarLUNBusy[lun] = 1; + } + + + + if((((CurrCard->globalFlags & F_CONLUN_IO) && + ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING)) + || (!(currSCCB->ControlByte & F_USE_CMD_Q)))) + { + if(CurrCard->discQCount >= QUEUE_DEPTH) + { currTar_Info->TarLUNBusy[lun] = 1; - FPT_queueSelectFail(CurrCard, p_card); + FPT_queueSelectFail(CurrCard,p_card); SGRAM_ACCESS(port); return; } - for (i = 1; i < QUEUE_DEPTH; i++) { - if (++lastTag >= QUEUE_DEPTH) - lastTag = 1; - if (CurrCard->discQ_Tbl[lastTag] == NULL) { + for (i = 1; i < QUEUE_DEPTH; i++) + { + if (++lastTag >= QUEUE_DEPTH) lastTag = 1; + if (CurrCard->discQ_Tbl[lastTag] == NULL) + { CurrCard->tagQ_Lst = lastTag; currTar_Info->LunDiscQ_Idx[lun] = lastTag; CurrCard->discQ_Tbl[lastTag] = currSCCB; @@ -2416,206 +2963,206 @@ static void FPT_ssel(unsigned long port, unsigned char p_card) break; } } - if (i == QUEUE_DEPTH) { + if(i == QUEUE_DEPTH) + { currTar_Info->TarLUNBusy[lun] = 1; - FPT_queueSelectFail(CurrCard, p_card); + FPT_queueSelectFail(CurrCard,p_card); SGRAM_ACCESS(port); return; } } - auto_loaded = 0; - WR_HARPOON(port + hp_select_id, target); - WR_HARPOON(port + hp_gp_reg_3, target); /* Use by new automation logic */ - if (currSCCB->OperationCode == RESET_COMMAND) { - WRW_HARPOON((port + ID_MSG_STRT), (MPM_OP + AMSG_OUT + - (currSCCB-> - Sccb_idmsg & ~DISC_PRIV))); + auto_loaded = 0; - WRW_HARPOON((port + ID_MSG_STRT + 2), BRH_OP + ALWAYS + NP); + WR_HARPOON(port+hp_select_id, target); + WR_HARPOON(port+hp_gp_reg_3, target); /* Use by new automation logic */ - currSCCB->Sccb_scsimsg = SMDEV_RESET; + if (currSCCB->OperationCode == RESET_COMMAND) { + WRW_HARPOON((port+ID_MSG_STRT), (MPM_OP+AMSG_OUT+ + (currSCCB->Sccb_idmsg & ~DISC_PRIV))); - WR_HARPOON(port + hp_autostart_3, (SELECT + SELCHK_STRT)); - auto_loaded = 1; - currSCCB->Sccb_scsistat = SELECT_BDR_ST; + WRW_HARPOON((port+ID_MSG_STRT+2),BRH_OP+ALWAYS+NP); - if (currTar_Info->TarEEValue & EE_SYNC_MASK) { - currTar_Info->TarSyncCtrl = 0; - currTar_Info->TarStatus &= ~TAR_SYNC_MASK; - } + currSCCB->Sccb_scsimsg = SMDEV_RESET; - if (currTar_Info->TarEEValue & EE_WIDE_SCSI) { - currTar_Info->TarStatus &= ~TAR_WIDE_MASK; - } + WR_HARPOON(port+hp_autostart_3, (SELECT+SELCHK_STRT)); + auto_loaded = 1; + currSCCB->Sccb_scsistat = SELECT_BDR_ST; - FPT_sssyncv(port, target, NARROW_SCSI, currTar_Info); - FPT_SccbMgrTableInitTarget(p_card, target); + if (currTar_Info->TarEEValue & EE_SYNC_MASK) + { + currTar_Info->TarSyncCtrl = 0; + currTar_Info->TarStatus &= ~TAR_SYNC_MASK; + } - } + if (currTar_Info->TarEEValue & EE_WIDE_SCSI) + { + currTar_Info->TarStatus &= ~TAR_WIDE_MASK; + } - else if (currSCCB->Sccb_scsistat == ABORT_ST) { - WRW_HARPOON((port + ID_MSG_STRT), (MPM_OP + AMSG_OUT + - (currSCCB-> - Sccb_idmsg & ~DISC_PRIV))); + FPT_sssyncv(port, target, NARROW_SCSI,currTar_Info); + FPT_SccbMgrTableInitTarget(p_card, target); - WRW_HARPOON((port + ID_MSG_STRT + 2), BRH_OP + ALWAYS + CMDPZ); + } - WRW_HARPOON((port + SYNC_MSGS + 0), (MPM_OP + AMSG_OUT + - (((unsigned - char)(currSCCB-> - ControlByte & - TAG_TYPE_MASK) - >> 6) | (unsigned char) - 0x20))); - WRW_HARPOON((port + SYNC_MSGS + 2), - (MPM_OP + AMSG_OUT + currSCCB->Sccb_tag)); - WRW_HARPOON((port + SYNC_MSGS + 4), (BRH_OP + ALWAYS + NP)); + else if(currSCCB->Sccb_scsistat == ABORT_ST) + { + WRW_HARPOON((port+ID_MSG_STRT), (MPM_OP+AMSG_OUT+ + (currSCCB->Sccb_idmsg & ~DISC_PRIV))); - WR_HARPOON(port + hp_autostart_3, (SELECT + SELCHK_STRT)); - auto_loaded = 1; + WRW_HARPOON((port+ID_MSG_STRT+2),BRH_OP+ALWAYS+CMDPZ); - } + WRW_HARPOON((port+SYNC_MSGS+0), (MPM_OP+AMSG_OUT+ + (((UCHAR)(currSCCB->ControlByte & TAG_TYPE_MASK) + >> 6) | (UCHAR)0x20))); + WRW_HARPOON((port+SYNC_MSGS+2), + (MPM_OP+AMSG_OUT+currSCCB->Sccb_tag)); + WRW_HARPOON((port+SYNC_MSGS+4), (BRH_OP+ALWAYS+NP )); - else if (!(currTar_Info->TarStatus & WIDE_NEGOCIATED)) { - auto_loaded = FPT_siwidn(port, p_card); - currSCCB->Sccb_scsistat = SELECT_WN_ST; - } + WR_HARPOON(port+hp_autostart_3, (SELECT+SELCHK_STRT)); + auto_loaded = 1; + + } - else if (!((currTar_Info->TarStatus & TAR_SYNC_MASK) - == SYNC_SUPPORTED)) { - auto_loaded = FPT_sisyncn(port, p_card, 0); - currSCCB->Sccb_scsistat = SELECT_SN_ST; - } + else if (!(currTar_Info->TarStatus & WIDE_NEGOCIATED)) { + auto_loaded = FPT_siwidn(port,p_card); + currSCCB->Sccb_scsistat = SELECT_WN_ST; + } - if (!auto_loaded) { + else if (!((currTar_Info->TarStatus & TAR_SYNC_MASK) + == SYNC_SUPPORTED)) { + auto_loaded = FPT_sisyncn(port,p_card, 0); + currSCCB->Sccb_scsistat = SELECT_SN_ST; + } - if (currSCCB->ControlByte & F_USE_CMD_Q) { - CurrCard->globalFlags |= F_TAG_STARTED; + if (!auto_loaded) + { - if ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) - == TAG_Q_REJECT) { - currSCCB->ControlByte &= ~F_USE_CMD_Q; + if (currSCCB->ControlByte & F_USE_CMD_Q) + { - /* Fix up the start instruction with a jump to - Non-Tag-CMD handling */ - WRW_HARPOON((port + ID_MSG_STRT), - BRH_OP + ALWAYS + NTCMD); + CurrCard->globalFlags |= F_TAG_STARTED; - WRW_HARPOON((port + NON_TAG_ID_MSG), - (MPM_OP + AMSG_OUT + - currSCCB->Sccb_idmsg)); + if ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) + == TAG_Q_REJECT) + { + currSCCB->ControlByte &= ~F_USE_CMD_Q; - WR_HARPOON(port + hp_autostart_3, - (SELECT + SELCHK_STRT)); + /* Fix up the start instruction with a jump to + Non-Tag-CMD handling */ + WRW_HARPOON((port+ID_MSG_STRT),BRH_OP+ALWAYS+NTCMD); - /* Setup our STATE so we know what happend when - the wheels fall off. */ - currSCCB->Sccb_scsistat = SELECT_ST; + WRW_HARPOON((port+NON_TAG_ID_MSG), + (MPM_OP+AMSG_OUT+currSCCB->Sccb_idmsg)); - currTar_Info->TarLUNBusy[lun] = 1; - } + WR_HARPOON(port+hp_autostart_3, (SELECT+SELCHK_STRT)); + + /* Setup our STATE so we know what happend when + the wheels fall off. */ + currSCCB->Sccb_scsistat = SELECT_ST; + + currTar_Info->TarLUNBusy[lun] = 1; + } + + else + { + WRW_HARPOON((port+ID_MSG_STRT), (MPM_OP+AMSG_OUT+currSCCB->Sccb_idmsg)); + + WRW_HARPOON((port+ID_MSG_STRT+2), (MPM_OP+AMSG_OUT+ + (((UCHAR)(currSCCB->ControlByte & TAG_TYPE_MASK) + >> 6) | (UCHAR)0x20))); - else { - WRW_HARPOON((port + ID_MSG_STRT), - (MPM_OP + AMSG_OUT + - currSCCB->Sccb_idmsg)); - - WRW_HARPOON((port + ID_MSG_STRT + 2), - (MPM_OP + AMSG_OUT + - (((unsigned char)(currSCCB-> - ControlByte & - TAG_TYPE_MASK) - >> 6) | (unsigned char)0x20))); - - for (i = 1; i < QUEUE_DEPTH; i++) { - if (++lastTag >= QUEUE_DEPTH) - lastTag = 1; - if (CurrCard->discQ_Tbl[lastTag] == - NULL) { - WRW_HARPOON((port + - ID_MSG_STRT + 6), - (MPM_OP + AMSG_OUT + - lastTag)); + for (i = 1; i < QUEUE_DEPTH; i++) + { + if (++lastTag >= QUEUE_DEPTH) lastTag = 1; + if (CurrCard->discQ_Tbl[lastTag] == NULL) + { + WRW_HARPOON((port+ID_MSG_STRT+6), + (MPM_OP+AMSG_OUT+lastTag)); CurrCard->tagQ_Lst = lastTag; currSCCB->Sccb_tag = lastTag; - CurrCard->discQ_Tbl[lastTag] = - currSCCB; + CurrCard->discQ_Tbl[lastTag] = currSCCB; CurrCard->discQCount++; break; } } - if (i == QUEUE_DEPTH) { - currTar_Info->TarLUNBusy[lun] = 1; - FPT_queueSelectFail(CurrCard, p_card); - SGRAM_ACCESS(port); - return; - } - currSCCB->Sccb_scsistat = SELECT_Q_ST; + if ( i == QUEUE_DEPTH ) + { + currTar_Info->TarLUNBusy[lun] = 1; + FPT_queueSelectFail(CurrCard,p_card); + SGRAM_ACCESS(port); + return; + } - WR_HARPOON(port + hp_autostart_3, - (SELECT + SELCHK_STRT)); - } - } + currSCCB->Sccb_scsistat = SELECT_Q_ST; - else { + WR_HARPOON(port+hp_autostart_3, (SELECT+SELCHK_STRT)); + } + } - WRW_HARPOON((port + ID_MSG_STRT), - BRH_OP + ALWAYS + NTCMD); + else + { - WRW_HARPOON((port + NON_TAG_ID_MSG), - (MPM_OP + AMSG_OUT + currSCCB->Sccb_idmsg)); + WRW_HARPOON((port+ID_MSG_STRT),BRH_OP+ALWAYS+NTCMD); - currSCCB->Sccb_scsistat = SELECT_ST; + WRW_HARPOON((port+NON_TAG_ID_MSG), + (MPM_OP+AMSG_OUT+currSCCB->Sccb_idmsg)); - WR_HARPOON(port + hp_autostart_3, - (SELECT + SELCHK_STRT)); - } + currSCCB->Sccb_scsistat = SELECT_ST; - theCCB = (unsigned char *)&currSCCB->Cdb[0]; + WR_HARPOON(port+hp_autostart_3, (SELECT+SELCHK_STRT)); + } - cdb_reg = port + CMD_STRT; - for (i = 0; i < currSCCB->CdbLength; i++) { - WRW_HARPOON(cdb_reg, (MPM_OP + ACOMMAND + *theCCB)); - cdb_reg += 2; - theCCB++; - } + theCCB = (UCHAR *)&currSCCB->Cdb[0]; - if (currSCCB->CdbLength != TWELVE_BYTE_CMD) - WRW_HARPOON(cdb_reg, (BRH_OP + ALWAYS + NP)); + cdb_reg = port + CMD_STRT; - } - /* auto_loaded */ - WRW_HARPOON((port + hp_fiforead), (unsigned short)0x00); - WR_HARPOON(port + hp_xferstat, 0x00); + for (i=0; i < currSCCB->CdbLength; i++) + { + WRW_HARPOON(cdb_reg, (MPM_OP + ACOMMAND + *theCCB)); + cdb_reg +=2; + theCCB++; + } + + if (currSCCB->CdbLength != TWELVE_BYTE_CMD) + WRW_HARPOON(cdb_reg, (BRH_OP+ALWAYS+ NP)); - WRW_HARPOON((port + hp_intstat), (PROG_HLT | TIMEOUT | SEL | BUS_FREE)); + } /* auto_loaded */ - WR_HARPOON(port + hp_portctrl_0, (SCSI_PORT)); + WRW_HARPOON((port+hp_fiforead), (USHORT) 0x00); + WR_HARPOON(port+hp_xferstat, 0x00); - if (!(currSCCB->Sccb_MGRFlags & F_DEV_SELECTED)) { - WR_HARPOON(port + hp_scsictrl_0, - (SEL_TAR | ENA_ATN | ENA_RESEL | ENA_SCAM_SEL)); - } else { + WRW_HARPOON((port+hp_intstat), (PROG_HLT | TIMEOUT | SEL | BUS_FREE)); -/* auto_loaded = (RD_HARPOON(port+hp_autostart_3) & (unsigned char)0x1F); + WR_HARPOON(port+hp_portctrl_0,(SCSI_PORT)); + + + if (!(currSCCB->Sccb_MGRFlags & F_DEV_SELECTED)) + { + WR_HARPOON(port+hp_scsictrl_0, (SEL_TAR | ENA_ATN | ENA_RESEL | ENA_SCAM_SEL)); + } + else + { + +/* auto_loaded = (RD_HARPOON(port+hp_autostart_3) & (UCHAR)0x1F); auto_loaded |= AUTO_IMMED; */ - auto_loaded = AUTO_IMMED; + auto_loaded = AUTO_IMMED; - DISABLE_AUTO(port); + DISABLE_AUTO(port); - WR_HARPOON(port + hp_autostart_3, auto_loaded); - } + WR_HARPOON(port+hp_autostart_3, auto_loaded); + } - SGRAM_ACCESS(port); + SGRAM_ACCESS(port); } + /*--------------------------------------------------------------------- * * Function: FPT_sres @@ -2624,276 +3171,303 @@ static void FPT_ssel(unsigned long port, unsigned char p_card) * *---------------------------------------------------------------------*/ -static void FPT_sres(unsigned long port, unsigned char p_card, - struct sccb_card *pCurrCard) +static void FPT_sres(ULONG port, UCHAR p_card, PSCCBcard pCurrCard) { - unsigned char our_target, message, lun = 0, tag, msgRetryCount; + UCHAR our_target, message, lun = 0, tag, msgRetryCount; + - struct sccb_mgr_tar_info *currTar_Info; - struct sccb *currSCCB; + PSCCBMgr_tar_info currTar_Info; + PSCCB currSCCB; - if (pCurrCard->currentSCCB != NULL) { - currTar_Info = - &FPT_sccbMgrTbl[p_card][pCurrCard->currentSCCB->TargID]; + + + + if(pCurrCard->currentSCCB != NULL) + { + currTar_Info = &FPT_sccbMgrTbl[p_card][pCurrCard->currentSCCB->TargID]; DISABLE_AUTO(port); - WR_HARPOON((port + hp_scsictrl_0), (ENA_RESEL | ENA_SCAM_SEL)); + + WR_HARPOON((port+hp_scsictrl_0),(ENA_RESEL | ENA_SCAM_SEL)); + currSCCB = pCurrCard->currentSCCB; - if (currSCCB->Sccb_scsistat == SELECT_WN_ST) { + if(currSCCB->Sccb_scsistat == SELECT_WN_ST) + { currTar_Info->TarStatus &= ~TAR_WIDE_MASK; currSCCB->Sccb_scsistat = BUS_FREE_ST; } - if (currSCCB->Sccb_scsistat == SELECT_SN_ST) { + if(currSCCB->Sccb_scsistat == SELECT_SN_ST) + { currTar_Info->TarStatus &= ~TAR_SYNC_MASK; currSCCB->Sccb_scsistat = BUS_FREE_ST; } - if (((pCurrCard->globalFlags & F_CONLUN_IO) && - ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) != - TAG_Q_TRYING))) { - currTar_Info->TarLUNBusy[currSCCB->Lun] = 0; - if (currSCCB->Sccb_scsistat != ABORT_ST) { + if(((pCurrCard->globalFlags & F_CONLUN_IO) && + ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))) + { + currTar_Info->TarLUNBusy[currSCCB->Lun] = 0; + if(currSCCB->Sccb_scsistat != ABORT_ST) + { pCurrCard->discQCount--; - pCurrCard->discQ_Tbl[currTar_Info-> - LunDiscQ_Idx[currSCCB-> - Lun]] - = NULL; + pCurrCard->discQ_Tbl[currTar_Info->LunDiscQ_Idx[currSCCB->Lun]] + = NULL; } - } else { - currTar_Info->TarLUNBusy[0] = 0; - if (currSCCB->Sccb_tag) { - if (currSCCB->Sccb_scsistat != ABORT_ST) { - pCurrCard->discQCount--; - pCurrCard->discQ_Tbl[currSCCB-> - Sccb_tag] = NULL; - } - } else { - if (currSCCB->Sccb_scsistat != ABORT_ST) { + } + else + { + currTar_Info->TarLUNBusy[0] = 0; + if(currSCCB->Sccb_tag) + { + if(currSCCB->Sccb_scsistat != ABORT_ST) + { + pCurrCard->discQCount--; + pCurrCard->discQ_Tbl[currSCCB->Sccb_tag] = NULL; + } + }else + { + if(currSCCB->Sccb_scsistat != ABORT_ST) + { pCurrCard->discQCount--; - pCurrCard->discQ_Tbl[currTar_Info-> - LunDiscQ_Idx[0]] = - NULL; + pCurrCard->discQ_Tbl[currTar_Info->LunDiscQ_Idx[0]] = NULL; } } } - FPT_queueSelectFail(&FPT_BL_Card[p_card], p_card); + FPT_queueSelectFail(&FPT_BL_Card[p_card],p_card); } - WRW_HARPOON((port + hp_fiforead), (unsigned short)0x00); + WRW_HARPOON((port+hp_fiforead), (USHORT) 0x00); + - our_target = (unsigned char)(RD_HARPOON(port + hp_select_id) >> 4); + our_target = (UCHAR)(RD_HARPOON(port+hp_select_id) >> 4); currTar_Info = &FPT_sccbMgrTbl[p_card][our_target]; + msgRetryCount = 0; - do { + do + { currTar_Info = &FPT_sccbMgrTbl[p_card][our_target]; tag = 0; - while (!(RD_HARPOON(port + hp_scsisig) & SCSI_REQ)) { - if (!(RD_HARPOON(port + hp_scsisig) & SCSI_BSY)) { - WRW_HARPOON((port + hp_intstat), PHASE); + while(!(RD_HARPOON(port+hp_scsisig) & SCSI_REQ)) + { + if (! (RD_HARPOON(port+hp_scsisig) & SCSI_BSY)) + { + + WRW_HARPOON((port+hp_intstat), PHASE); return; } } - WRW_HARPOON((port + hp_intstat), PHASE); - if ((RD_HARPOON(port + hp_scsisig) & S_SCSI_PHZ) == S_MSGI_PH) { - - message = FPT_sfm(port, pCurrCard->currentSCCB); - if (message) { - - if (message <= (0x80 | LUN_MASK)) { - lun = message & (unsigned char)LUN_MASK; - - if ((currTar_Info-> - TarStatus & TAR_TAG_Q_MASK) == - TAG_Q_TRYING) { - if (currTar_Info->TarTagQ_Cnt != - 0) { - - if (! - (currTar_Info-> - TarLUN_CA)) { - ACCEPT_MSG(port); /*Release the ACK for ID msg. */ - - message = - FPT_sfm - (port, - pCurrCard-> - currentSCCB); - if (message) { - ACCEPT_MSG - (port); + WRW_HARPOON((port+hp_intstat), PHASE); + if ((RD_HARPOON(port+hp_scsisig) & S_SCSI_PHZ) == S_MSGI_PH) + { + + message = FPT_sfm(port,pCurrCard->currentSCCB); + if (message) + { + + if (message <= (0x80 | LUN_MASK)) + { + lun = message & (UCHAR)LUN_MASK; + + if ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) == TAG_Q_TRYING) + { + if (currTar_Info->TarTagQ_Cnt != 0) + { + + if (!(currTar_Info->TarLUN_CA)) + { + ACCEPT_MSG(port); /*Release the ACK for ID msg. */ + + + message = FPT_sfm(port,pCurrCard->currentSCCB); + if (message) + { + ACCEPT_MSG(port); } else - message - = 0; - - if (message != - 0) { - tag = - FPT_sfm - (port, - pCurrCard-> - currentSCCB); - - if (! - (tag)) - message - = - 0; + message = 0; + + if(message != 0) + { + tag = FPT_sfm(port,pCurrCard->currentSCCB); + + if (!(tag)) + message = 0; } - } - /*C.A. exists! */ - } - /*End Q cnt != 0 */ - } - /*End Tag cmds supported! */ - } - /*End valid ID message. */ - else { + } /*C.A. exists! */ + + } /*End Q cnt != 0 */ + + } /*End Tag cmds supported! */ + + } /*End valid ID message. */ + + else + { ACCEPT_MSG_ATN(port); } - } - /* End good id message. */ - else { + } /* End good id message. */ + + else + { message = 0; } - } else { + } + else + { ACCEPT_MSG_ATN(port); - while (! - (RDW_HARPOON((port + hp_intstat)) & - (PHASE | RESET)) - && !(RD_HARPOON(port + hp_scsisig) & SCSI_REQ) - && (RD_HARPOON(port + hp_scsisig) & SCSI_BSY)) ; + while (!(RDW_HARPOON((port+hp_intstat)) & (PHASE | RESET)) && + !(RD_HARPOON(port+hp_scsisig) & SCSI_REQ) && + (RD_HARPOON(port+hp_scsisig) & SCSI_BSY)) ; return; } - if (message == 0) { + if(message == 0) + { msgRetryCount++; - if (msgRetryCount == 1) { + if(msgRetryCount == 1) + { FPT_SendMsg(port, SMPARITY); - } else { + } + else + { FPT_SendMsg(port, SMDEV_RESET); - FPT_sssyncv(port, our_target, NARROW_SCSI, - currTar_Info); - - if (FPT_sccbMgrTbl[p_card][our_target]. - TarEEValue & EE_SYNC_MASK) { + FPT_sssyncv(port, our_target, NARROW_SCSI,currTar_Info); - FPT_sccbMgrTbl[p_card][our_target]. - TarStatus &= ~TAR_SYNC_MASK; + if (FPT_sccbMgrTbl[p_card][our_target].TarEEValue & EE_SYNC_MASK) + { + + FPT_sccbMgrTbl[p_card][our_target].TarStatus &= ~TAR_SYNC_MASK; } - if (FPT_sccbMgrTbl[p_card][our_target]. - TarEEValue & EE_WIDE_SCSI) { + if (FPT_sccbMgrTbl[p_card][our_target].TarEEValue & EE_WIDE_SCSI) + { - FPT_sccbMgrTbl[p_card][our_target]. - TarStatus &= ~TAR_WIDE_MASK; + FPT_sccbMgrTbl[p_card][our_target].TarStatus &= ~TAR_WIDE_MASK; } - FPT_queueFlushTargSccb(p_card, our_target, - SCCB_COMPLETE); - FPT_SccbMgrTableInitTarget(p_card, our_target); + + FPT_queueFlushTargSccb(p_card, our_target, SCCB_COMPLETE); + FPT_SccbMgrTableInitTarget(p_card,our_target); return; } } - } while (message == 0); + }while(message == 0); + - if (((pCurrCard->globalFlags & F_CONLUN_IO) && - ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))) { + + if(((pCurrCard->globalFlags & F_CONLUN_IO) && + ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))) + { currTar_Info->TarLUNBusy[lun] = 1; - pCurrCard->currentSCCB = - pCurrCard->discQ_Tbl[currTar_Info->LunDiscQ_Idx[lun]]; - if (pCurrCard->currentSCCB != NULL) { + pCurrCard->currentSCCB = pCurrCard->discQ_Tbl[currTar_Info->LunDiscQ_Idx[lun]]; + if(pCurrCard->currentSCCB != NULL) + { ACCEPT_MSG(port); - } else { + } + else + { ACCEPT_MSG_ATN(port); } - } else { + } + else + { currTar_Info->TarLUNBusy[0] = 1; - if (tag) { - if (pCurrCard->discQ_Tbl[tag] != NULL) { - pCurrCard->currentSCCB = - pCurrCard->discQ_Tbl[tag]; - currTar_Info->TarTagQ_Cnt--; + + if (tag) + { + if (pCurrCard->discQ_Tbl[tag] != NULL) + { + pCurrCard->currentSCCB = pCurrCard->discQ_Tbl[tag]; + currTar_Info->TarTagQ_Cnt--; ACCEPT_MSG(port); - } else { - ACCEPT_MSG_ATN(port); } - } else { - pCurrCard->currentSCCB = - pCurrCard->discQ_Tbl[currTar_Info->LunDiscQ_Idx[0]]; - if (pCurrCard->currentSCCB != NULL) { + else + { + ACCEPT_MSG_ATN(port); + } + }else + { + pCurrCard->currentSCCB = pCurrCard->discQ_Tbl[currTar_Info->LunDiscQ_Idx[0]]; + if(pCurrCard->currentSCCB != NULL) + { ACCEPT_MSG(port); - } else { + } + else + { ACCEPT_MSG_ATN(port); } } } - if (pCurrCard->currentSCCB != NULL) { - if (pCurrCard->currentSCCB->Sccb_scsistat == ABORT_ST) { - /* During Abort Tag command, the target could have got re-selected - and completed the command. Check the select Q and remove the CCB - if it is in the Select Q */ + if(pCurrCard->currentSCCB != NULL) + { + if(pCurrCard->currentSCCB->Sccb_scsistat == ABORT_ST) + { + /* During Abort Tag command, the target could have got re-selected + and completed the command. Check the select Q and remove the CCB + if it is in the Select Q */ FPT_queueFindSccb(pCurrCard->currentSCCB, p_card); } } - while (!(RDW_HARPOON((port + hp_intstat)) & (PHASE | RESET)) && - !(RD_HARPOON(port + hp_scsisig) & SCSI_REQ) && - (RD_HARPOON(port + hp_scsisig) & SCSI_BSY)) ; + + while (!(RDW_HARPOON((port+hp_intstat)) & (PHASE | RESET)) && + !(RD_HARPOON(port+hp_scsisig) & SCSI_REQ) && + (RD_HARPOON(port+hp_scsisig) & SCSI_BSY)) ; } -static void FPT_SendMsg(unsigned long port, unsigned char message) +static void FPT_SendMsg(ULONG port, UCHAR message) { - while (!(RD_HARPOON(port + hp_scsisig) & SCSI_REQ)) { - if (!(RD_HARPOON(port + hp_scsisig) & SCSI_BSY)) { + while(!(RD_HARPOON(port+hp_scsisig) & SCSI_REQ)) + { + if (! (RD_HARPOON(port+hp_scsisig) & SCSI_BSY)) + { - WRW_HARPOON((port + hp_intstat), PHASE); + WRW_HARPOON((port+hp_intstat), PHASE); return; } } - WRW_HARPOON((port + hp_intstat), PHASE); - if ((RD_HARPOON(port + hp_scsisig) & S_SCSI_PHZ) == S_MSGO_PH) { - WRW_HARPOON((port + hp_intstat), - (BUS_FREE | PHASE | XFER_CNT_0)); + WRW_HARPOON((port+hp_intstat), PHASE); + if ((RD_HARPOON(port+hp_scsisig) & S_SCSI_PHZ) == S_MSGO_PH) + { + WRW_HARPOON((port+hp_intstat), (BUS_FREE | PHASE | XFER_CNT_0)); + - WR_HARPOON(port + hp_portctrl_0, SCSI_BUS_EN); + WR_HARPOON(port+hp_portctrl_0, SCSI_BUS_EN); - WR_HARPOON(port + hp_scsidata_0, message); + WR_HARPOON(port+hp_scsidata_0,message); - WR_HARPOON(port + hp_scsisig, (SCSI_ACK + S_ILL_PH)); + WR_HARPOON(port+hp_scsisig, (SCSI_ACK + S_ILL_PH)); ACCEPT_MSG(port); - WR_HARPOON(port + hp_portctrl_0, 0x00); + WR_HARPOON(port+hp_portctrl_0, 0x00); if ((message == SMABORT) || (message == SMDEV_RESET) || - (message == SMABORT_TAG)) { - while (! - (RDW_HARPOON((port + hp_intstat)) & - (BUS_FREE | PHASE))) { - } + (message == SMABORT_TAG) ) + { + while(!(RDW_HARPOON((port+hp_intstat)) & (BUS_FREE | PHASE))) {} - if (RDW_HARPOON((port + hp_intstat)) & BUS_FREE) { - WRW_HARPOON((port + hp_intstat), BUS_FREE); + if (RDW_HARPOON((port+hp_intstat)) & BUS_FREE) + { + WRW_HARPOON((port+hp_intstat), BUS_FREE); } } } @@ -2907,180 +3481,178 @@ static void FPT_SendMsg(unsigned long port, unsigned char message) * target device. * *---------------------------------------------------------------------*/ -static void FPT_sdecm(unsigned char message, unsigned long port, - unsigned char p_card) +static void FPT_sdecm(UCHAR message, ULONG port, UCHAR p_card) { - struct sccb *currSCCB; - struct sccb_card *CurrCard; - struct sccb_mgr_tar_info *currTar_Info; + PSCCB currSCCB; + PSCCBcard CurrCard; + PSCCBMgr_tar_info currTar_Info; CurrCard = &FPT_BL_Card[p_card]; currSCCB = CurrCard->currentSCCB; currTar_Info = &FPT_sccbMgrTbl[p_card][currSCCB->TargID]; - if (message == SMREST_DATA_PTR) { - if (!(currSCCB->Sccb_XferState & F_NO_DATA_YET)) { + if (message == SMREST_DATA_PTR) + { + if (!(currSCCB->Sccb_XferState & F_NO_DATA_YET)) + { currSCCB->Sccb_ATC = currSCCB->Sccb_savedATC; FPT_hostDataXferRestart(currSCCB); } ACCEPT_MSG(port); - WR_HARPOON(port + hp_autostart_1, - (AUTO_IMMED + DISCONNECT_START)); + WR_HARPOON(port+hp_autostart_1, (AUTO_IMMED+DISCONNECT_START)); } - else if (message == SMCMD_COMP) { + else if (message == SMCMD_COMP) + { + - if (currSCCB->Sccb_scsistat == SELECT_Q_ST) { - currTar_Info->TarStatus &= - ~(unsigned char)TAR_TAG_Q_MASK; - currTar_Info->TarStatus |= (unsigned char)TAG_Q_REJECT; + if (currSCCB->Sccb_scsistat == SELECT_Q_ST) + { + currTar_Info->TarStatus &= ~(UCHAR)TAR_TAG_Q_MASK; + currTar_Info->TarStatus |= (UCHAR)TAG_Q_REJECT; } ACCEPT_MSG(port); } - else if ((message == SMNO_OP) || (message >= SMIDENT) - || (message == SMINIT_RECOVERY) || (message == SMREL_RECOVERY)) { + else if ((message == SMNO_OP) || (message >= SMIDENT) + || (message == SMINIT_RECOVERY) || (message == SMREL_RECOVERY)) + { ACCEPT_MSG(port); - WR_HARPOON(port + hp_autostart_1, - (AUTO_IMMED + DISCONNECT_START)); + WR_HARPOON(port+hp_autostart_1, (AUTO_IMMED+DISCONNECT_START)); } - else if (message == SMREJECT) { + else if (message == SMREJECT) + { if ((currSCCB->Sccb_scsistat == SELECT_SN_ST) || - (currSCCB->Sccb_scsistat == SELECT_WN_ST) || - ((currTar_Info->TarStatus & TAR_SYNC_MASK) == SYNC_TRYING) - || ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) == - TAG_Q_TRYING)) + (currSCCB->Sccb_scsistat == SELECT_WN_ST) || + ((currTar_Info->TarStatus & TAR_SYNC_MASK) == SYNC_TRYING ) || + ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) == TAG_Q_TRYING ) ) + { - WRW_HARPOON((port + hp_intstat), BUS_FREE); + WRW_HARPOON((port+hp_intstat), BUS_FREE); ACCEPT_MSG(port); - while ((!(RD_HARPOON(port + hp_scsisig) & SCSI_REQ)) && - (!(RDW_HARPOON((port + hp_intstat)) & BUS_FREE))) - { - } - if (currSCCB->Lun == 0x00) { - if ((currSCCB->Sccb_scsistat == SELECT_SN_ST)) { + while ((!(RD_HARPOON(port+hp_scsisig) & SCSI_REQ)) && + (!(RDW_HARPOON((port+hp_intstat)) & BUS_FREE))) {} + + if(currSCCB->Lun == 0x00) + { + if ((currSCCB->Sccb_scsistat == SELECT_SN_ST)) + { - currTar_Info->TarStatus |= - (unsigned char)SYNC_SUPPORTED; + currTar_Info->TarStatus |= (UCHAR)SYNC_SUPPORTED; - currTar_Info->TarEEValue &= - ~EE_SYNC_MASK; + currTar_Info->TarEEValue &= ~EE_SYNC_MASK; } - else if ((currSCCB->Sccb_scsistat == - SELECT_WN_ST)) { + else if ((currSCCB->Sccb_scsistat == SELECT_WN_ST)) + { + - currTar_Info->TarStatus = - (currTar_Info-> - TarStatus & ~WIDE_ENABLED) | - WIDE_NEGOCIATED; + currTar_Info->TarStatus = (currTar_Info->TarStatus & + ~WIDE_ENABLED) | WIDE_NEGOCIATED; - currTar_Info->TarEEValue &= - ~EE_WIDE_SCSI; + currTar_Info->TarEEValue &= ~EE_WIDE_SCSI; } - else if ((currTar_Info-> - TarStatus & TAR_TAG_Q_MASK) == - TAG_Q_TRYING) { - currTar_Info->TarStatus = - (currTar_Info-> - TarStatus & ~(unsigned char) - TAR_TAG_Q_MASK) | TAG_Q_REJECT; + else if ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) == TAG_Q_TRYING ) + { + currTar_Info->TarStatus = (currTar_Info->TarStatus & + ~(UCHAR)TAR_TAG_Q_MASK) | TAG_Q_REJECT; + currSCCB->ControlByte &= ~F_USE_CMD_Q; CurrCard->discQCount--; - CurrCard->discQ_Tbl[currSCCB-> - Sccb_tag] = NULL; + CurrCard->discQ_Tbl[currSCCB->Sccb_tag] = NULL; currSCCB->Sccb_tag = 0x00; } } - if (RDW_HARPOON((port + hp_intstat)) & BUS_FREE) { + if (RDW_HARPOON((port+hp_intstat)) & BUS_FREE) + { + - if (currSCCB->Lun == 0x00) { - WRW_HARPOON((port + hp_intstat), - BUS_FREE); + if(currSCCB->Lun == 0x00) + { + WRW_HARPOON((port+hp_intstat), BUS_FREE); CurrCard->globalFlags |= F_NEW_SCCB_CMD; } } - else { + else + { - if ((CurrCard->globalFlags & F_CONLUN_IO) && - ((currTar_Info-> - TarStatus & TAR_TAG_Q_MASK) != - TAG_Q_TRYING)) - currTar_Info->TarLUNBusy[currSCCB-> - Lun] = 1; + if((CurrCard->globalFlags & F_CONLUN_IO) && + ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING)) + currTar_Info->TarLUNBusy[currSCCB->Lun] = 1; else currTar_Info->TarLUNBusy[0] = 1; - currSCCB->ControlByte &= - ~(unsigned char)F_USE_CMD_Q; - WR_HARPOON(port + hp_autostart_1, - (AUTO_IMMED + DISCONNECT_START)); + currSCCB->ControlByte &= ~(UCHAR)F_USE_CMD_Q; + + WR_HARPOON(port+hp_autostart_1, (AUTO_IMMED+DISCONNECT_START)); } } - else { + else + { ACCEPT_MSG(port); - while ((!(RD_HARPOON(port + hp_scsisig) & SCSI_REQ)) && - (!(RDW_HARPOON((port + hp_intstat)) & BUS_FREE))) + while ((!(RD_HARPOON(port+hp_scsisig) & SCSI_REQ)) && + (!(RDW_HARPOON((port+hp_intstat)) & BUS_FREE))) {} + + if (!(RDW_HARPOON((port+hp_intstat)) & BUS_FREE)) { - } - - if (!(RDW_HARPOON((port + hp_intstat)) & BUS_FREE)) { - WR_HARPOON(port + hp_autostart_1, - (AUTO_IMMED + DISCONNECT_START)); + WR_HARPOON(port+hp_autostart_1, (AUTO_IMMED+DISCONNECT_START)); } } } - else if (message == SMEXT) { + else if (message == SMEXT) + { ACCEPT_MSG(port); - FPT_shandem(port, p_card, currSCCB); + FPT_shandem(port,p_card,currSCCB); } - else if (message == SMIGNORWR) { + else if (message == SMIGNORWR) + { - ACCEPT_MSG(port); /* ACK the RESIDUE MSG */ + ACCEPT_MSG(port); /* ACK the RESIDUE MSG */ - message = FPT_sfm(port, currSCCB); + message = FPT_sfm(port,currSCCB); - if (currSCCB->Sccb_scsimsg != SMPARITY) + if(currSCCB->Sccb_scsimsg != SMPARITY) ACCEPT_MSG(port); - WR_HARPOON(port + hp_autostart_1, - (AUTO_IMMED + DISCONNECT_START)); + WR_HARPOON(port+hp_autostart_1, (AUTO_IMMED+DISCONNECT_START)); } - else { + + else + { currSCCB->HostStatus = SCCB_PHASE_SEQUENCE_FAIL; currSCCB->Sccb_scsimsg = SMREJECT; ACCEPT_MSG_ATN(port); - WR_HARPOON(port + hp_autostart_1, - (AUTO_IMMED + DISCONNECT_START)); + WR_HARPOON(port+hp_autostart_1, (AUTO_IMMED+DISCONNECT_START)); } } + /*--------------------------------------------------------------------- * * Function: FPT_shandem @@ -3088,65 +3660,76 @@ static void FPT_sdecm(unsigned char message, unsigned long port, * Description: Decide what to do with the extended message. * *---------------------------------------------------------------------*/ -static void FPT_shandem(unsigned long port, unsigned char p_card, - struct sccb *pCurrSCCB) +static void FPT_shandem(ULONG port, UCHAR p_card, PSCCB pCurrSCCB) { - unsigned char length, message; + UCHAR length,message; - length = FPT_sfm(port, pCurrSCCB); - if (length) { + length = FPT_sfm(port,pCurrSCCB); + if (length) + { ACCEPT_MSG(port); - message = FPT_sfm(port, pCurrSCCB); - if (message) { + message = FPT_sfm(port,pCurrSCCB); + if (message) + { - if (message == SMSYNC) { + if (message == SMSYNC) + { - if (length == 0x03) { + if (length == 0x03) + { ACCEPT_MSG(port); - FPT_stsyncn(port, p_card); - } else { + FPT_stsyncn(port,p_card); + } + else + { pCurrSCCB->Sccb_scsimsg = SMREJECT; ACCEPT_MSG_ATN(port); } - } else if (message == SMWDTR) { + } + else if (message == SMWDTR) + { - if (length == 0x02) { + if (length == 0x02) + { ACCEPT_MSG(port); - FPT_stwidn(port, p_card); - } else { + FPT_stwidn(port,p_card); + } + else + { pCurrSCCB->Sccb_scsimsg = SMREJECT; ACCEPT_MSG_ATN(port); - WR_HARPOON(port + hp_autostart_1, - (AUTO_IMMED + - DISCONNECT_START)); + WR_HARPOON(port+hp_autostart_1, (AUTO_IMMED+DISCONNECT_START)); } - } else { + } + else + { pCurrSCCB->Sccb_scsimsg = SMREJECT; ACCEPT_MSG_ATN(port); - WR_HARPOON(port + hp_autostart_1, - (AUTO_IMMED + DISCONNECT_START)); + WR_HARPOON(port+hp_autostart_1, (AUTO_IMMED+DISCONNECT_START)); } - } else { - if (pCurrSCCB->Sccb_scsimsg != SMPARITY) + } + else + { + if(pCurrSCCB->Sccb_scsimsg != SMPARITY) ACCEPT_MSG(port); - WR_HARPOON(port + hp_autostart_1, - (AUTO_IMMED + DISCONNECT_START)); + WR_HARPOON(port+hp_autostart_1, (AUTO_IMMED+DISCONNECT_START)); } - } else { - if (pCurrSCCB->Sccb_scsimsg == SMPARITY) - WR_HARPOON(port + hp_autostart_1, - (AUTO_IMMED + DISCONNECT_START)); + }else + { + if(pCurrSCCB->Sccb_scsimsg == SMPARITY) + WR_HARPOON(port+hp_autostart_1, (AUTO_IMMED+DISCONNECT_START)); } } + /*--------------------------------------------------------------------- * * Function: FPT_sisyncn @@ -3156,79 +3739,73 @@ static void FPT_shandem(unsigned long port, unsigned char p_card, * *---------------------------------------------------------------------*/ -static unsigned char FPT_sisyncn(unsigned long port, unsigned char p_card, - unsigned char syncFlag) +static UCHAR FPT_sisyncn(ULONG port, UCHAR p_card, UCHAR syncFlag) { - struct sccb *currSCCB; - struct sccb_mgr_tar_info *currTar_Info; + PSCCB currSCCB; + PSCCBMgr_tar_info currTar_Info; - currSCCB = FPT_BL_Card[p_card].currentSCCB; - currTar_Info = &FPT_sccbMgrTbl[p_card][currSCCB->TargID]; + currSCCB = FPT_BL_Card[p_card].currentSCCB; + currTar_Info = &FPT_sccbMgrTbl[p_card][currSCCB->TargID]; - if (!((currTar_Info->TarStatus & TAR_SYNC_MASK) == SYNC_TRYING)) { + if (!((currTar_Info->TarStatus & TAR_SYNC_MASK) == SYNC_TRYING)) { - WRW_HARPOON((port + ID_MSG_STRT), - (MPM_OP + AMSG_OUT + - (currSCCB-> - Sccb_idmsg & ~(unsigned char)DISC_PRIV))); - WRW_HARPOON((port + ID_MSG_STRT + 2), BRH_OP + ALWAYS + CMDPZ); + WRW_HARPOON((port+ID_MSG_STRT), + (MPM_OP+AMSG_OUT+(currSCCB->Sccb_idmsg & ~(UCHAR)DISC_PRIV))); - WRW_HARPOON((port + SYNC_MSGS + 0), - (MPM_OP + AMSG_OUT + SMEXT)); - WRW_HARPOON((port + SYNC_MSGS + 2), (MPM_OP + AMSG_OUT + 0x03)); - WRW_HARPOON((port + SYNC_MSGS + 4), - (MPM_OP + AMSG_OUT + SMSYNC)); + WRW_HARPOON((port+ID_MSG_STRT+2),BRH_OP+ALWAYS+CMDPZ); - if ((currTar_Info->TarEEValue & EE_SYNC_MASK) == EE_SYNC_20MB) + WRW_HARPOON((port+SYNC_MSGS+0), (MPM_OP+AMSG_OUT+SMEXT )); + WRW_HARPOON((port+SYNC_MSGS+2), (MPM_OP+AMSG_OUT+0x03 )); + WRW_HARPOON((port+SYNC_MSGS+4), (MPM_OP+AMSG_OUT+SMSYNC)); - WRW_HARPOON((port + SYNC_MSGS + 6), - (MPM_OP + AMSG_OUT + 12)); - else if ((currTar_Info->TarEEValue & EE_SYNC_MASK) == - EE_SYNC_10MB) + if ((currTar_Info->TarEEValue & EE_SYNC_MASK) == EE_SYNC_20MB) - WRW_HARPOON((port + SYNC_MSGS + 6), - (MPM_OP + AMSG_OUT + 25)); + WRW_HARPOON((port+SYNC_MSGS+6), (MPM_OP+AMSG_OUT+ 12)); - else if ((currTar_Info->TarEEValue & EE_SYNC_MASK) == - EE_SYNC_5MB) + else if ((currTar_Info->TarEEValue & EE_SYNC_MASK) == EE_SYNC_10MB) - WRW_HARPOON((port + SYNC_MSGS + 6), - (MPM_OP + AMSG_OUT + 50)); + WRW_HARPOON((port+SYNC_MSGS+6), (MPM_OP+AMSG_OUT+ 25)); + else if ((currTar_Info->TarEEValue & EE_SYNC_MASK) == EE_SYNC_5MB) + + WRW_HARPOON((port+SYNC_MSGS+6), (MPM_OP+AMSG_OUT+ 50)); + + else + WRW_HARPOON((port+SYNC_MSGS+6), (MPM_OP+AMSG_OUT+ 00)); + + + WRW_HARPOON((port+SYNC_MSGS+8), (RAT_OP )); + WRW_HARPOON((port+SYNC_MSGS+10),(MPM_OP+AMSG_OUT+DEFAULT_OFFSET)); + WRW_HARPOON((port+SYNC_MSGS+12),(BRH_OP+ALWAYS+NP )); + + + if(syncFlag == 0) + { + WR_HARPOON(port+hp_autostart_3, (SELECT+SELCHK_STRT)); + currTar_Info->TarStatus = ((currTar_Info->TarStatus & + ~(UCHAR)TAR_SYNC_MASK) | (UCHAR)SYNC_TRYING); + } else - WRW_HARPOON((port + SYNC_MSGS + 6), - (MPM_OP + AMSG_OUT + 00)); - - WRW_HARPOON((port + SYNC_MSGS + 8), (RAT_OP)); - WRW_HARPOON((port + SYNC_MSGS + 10), - (MPM_OP + AMSG_OUT + DEFAULT_OFFSET)); - WRW_HARPOON((port + SYNC_MSGS + 12), (BRH_OP + ALWAYS + NP)); - - if (syncFlag == 0) { - WR_HARPOON(port + hp_autostart_3, - (SELECT + SELCHK_STRT)); - currTar_Info->TarStatus = - ((currTar_Info-> - TarStatus & ~(unsigned char)TAR_SYNC_MASK) | - (unsigned char)SYNC_TRYING); - } else { - WR_HARPOON(port + hp_autostart_3, - (AUTO_IMMED + CMD_ONLY_STRT)); + { + WR_HARPOON(port+hp_autostart_3, (AUTO_IMMED + CMD_ONLY_STRT)); } - return 1; - } - else { + return(1); + } - currTar_Info->TarStatus |= (unsigned char)SYNC_SUPPORTED; - currTar_Info->TarEEValue &= ~EE_SYNC_MASK; - return 0; - } + else { + + currTar_Info->TarStatus |= (UCHAR)SYNC_SUPPORTED; + currTar_Info->TarEEValue &= ~EE_SYNC_MASK; + return(0); + } } + + /*--------------------------------------------------------------------- * * Function: FPT_stsyncn @@ -3237,128 +3814,131 @@ static unsigned char FPT_sisyncn(unsigned long port, unsigned char p_card, * necessary. * *---------------------------------------------------------------------*/ -static void FPT_stsyncn(unsigned long port, unsigned char p_card) +static void FPT_stsyncn(ULONG port, UCHAR p_card) { - unsigned char sync_msg, offset, sync_reg, our_sync_msg; - struct sccb *currSCCB; - struct sccb_mgr_tar_info *currTar_Info; + UCHAR sync_msg,offset,sync_reg,our_sync_msg; + PSCCB currSCCB; + PSCCBMgr_tar_info currTar_Info; - currSCCB = FPT_BL_Card[p_card].currentSCCB; - currTar_Info = &FPT_sccbMgrTbl[p_card][currSCCB->TargID]; + currSCCB = FPT_BL_Card[p_card].currentSCCB; + currTar_Info = &FPT_sccbMgrTbl[p_card][currSCCB->TargID]; - sync_msg = FPT_sfm(port, currSCCB); + sync_msg = FPT_sfm(port,currSCCB); - if ((sync_msg == 0x00) && (currSCCB->Sccb_scsimsg == SMPARITY)) { - WR_HARPOON(port + hp_autostart_1, - (AUTO_IMMED + DISCONNECT_START)); + if((sync_msg == 0x00) && (currSCCB->Sccb_scsimsg == SMPARITY)) + { + WR_HARPOON(port+hp_autostart_1, (AUTO_IMMED+DISCONNECT_START)); return; } - ACCEPT_MSG(port); + ACCEPT_MSG(port); - offset = FPT_sfm(port, currSCCB); - if ((offset == 0x00) && (currSCCB->Sccb_scsimsg == SMPARITY)) { - WR_HARPOON(port + hp_autostart_1, - (AUTO_IMMED + DISCONNECT_START)); + offset = FPT_sfm(port,currSCCB); + + if((offset == 0x00) && (currSCCB->Sccb_scsimsg == SMPARITY)) + { + WR_HARPOON(port+hp_autostart_1, (AUTO_IMMED+DISCONNECT_START)); return; } - if ((currTar_Info->TarEEValue & EE_SYNC_MASK) == EE_SYNC_20MB) + if ((currTar_Info->TarEEValue & EE_SYNC_MASK) == EE_SYNC_20MB) - our_sync_msg = 12; /* Setup our Message to 20mb/s */ + our_sync_msg = 12; /* Setup our Message to 20mb/s */ - else if ((currTar_Info->TarEEValue & EE_SYNC_MASK) == EE_SYNC_10MB) + else if ((currTar_Info->TarEEValue & EE_SYNC_MASK) == EE_SYNC_10MB) - our_sync_msg = 25; /* Setup our Message to 10mb/s */ + our_sync_msg = 25; /* Setup our Message to 10mb/s */ - else if ((currTar_Info->TarEEValue & EE_SYNC_MASK) == EE_SYNC_5MB) + else if ((currTar_Info->TarEEValue & EE_SYNC_MASK) == EE_SYNC_5MB) - our_sync_msg = 50; /* Setup our Message to 5mb/s */ - else + our_sync_msg = 50; /* Setup our Message to 5mb/s */ + else - our_sync_msg = 0; /* Message = Async */ + our_sync_msg = 0; /* Message = Async */ - if (sync_msg < our_sync_msg) { - sync_msg = our_sync_msg; /*if faster, then set to max. */ - } + if (sync_msg < our_sync_msg) { + sync_msg = our_sync_msg; /*if faster, then set to max. */ + } - if (offset == ASYNC) - sync_msg = ASYNC; + if (offset == ASYNC) + sync_msg = ASYNC; - if (offset > MAX_OFFSET) - offset = MAX_OFFSET; + if (offset > MAX_OFFSET) + offset = MAX_OFFSET; - sync_reg = 0x00; + sync_reg = 0x00; - if (sync_msg > 12) + if (sync_msg > 12) - sync_reg = 0x20; /* Use 10MB/s */ + sync_reg = 0x20; /* Use 10MB/s */ - if (sync_msg > 25) + if (sync_msg > 25) - sync_reg = 0x40; /* Use 6.6MB/s */ + sync_reg = 0x40; /* Use 6.6MB/s */ - if (sync_msg > 38) + if (sync_msg > 38) - sync_reg = 0x60; /* Use 5MB/s */ + sync_reg = 0x60; /* Use 5MB/s */ - if (sync_msg > 50) + if (sync_msg > 50) - sync_reg = 0x80; /* Use 4MB/s */ + sync_reg = 0x80; /* Use 4MB/s */ - if (sync_msg > 62) + if (sync_msg > 62) - sync_reg = 0xA0; /* Use 3.33MB/s */ + sync_reg = 0xA0; /* Use 3.33MB/s */ - if (sync_msg > 75) + if (sync_msg > 75) - sync_reg = 0xC0; /* Use 2.85MB/s */ + sync_reg = 0xC0; /* Use 2.85MB/s */ - if (sync_msg > 87) + if (sync_msg > 87) - sync_reg = 0xE0; /* Use 2.5MB/s */ + sync_reg = 0xE0; /* Use 2.5MB/s */ - if (sync_msg > 100) { + if (sync_msg > 100) { - sync_reg = 0x00; /* Use ASYNC */ - offset = 0x00; - } + sync_reg = 0x00; /* Use ASYNC */ + offset = 0x00; + } - if (currTar_Info->TarStatus & WIDE_ENABLED) - sync_reg |= offset; + if (currTar_Info->TarStatus & WIDE_ENABLED) - else + sync_reg |= offset; - sync_reg |= (offset | NARROW_SCSI); + else - FPT_sssyncv(port, currSCCB->TargID, sync_reg, currTar_Info); + sync_reg |= (offset | NARROW_SCSI); - if (currSCCB->Sccb_scsistat == SELECT_SN_ST) { + FPT_sssyncv(port,currSCCB->TargID,sync_reg,currTar_Info); - ACCEPT_MSG(port); - currTar_Info->TarStatus = ((currTar_Info->TarStatus & - ~(unsigned char)TAR_SYNC_MASK) | - (unsigned char)SYNC_SUPPORTED); + if (currSCCB->Sccb_scsistat == SELECT_SN_ST) { - WR_HARPOON(port + hp_autostart_1, - (AUTO_IMMED + DISCONNECT_START)); - } - else { + ACCEPT_MSG(port); - ACCEPT_MSG_ATN(port); + currTar_Info->TarStatus = ((currTar_Info->TarStatus & + ~(UCHAR)TAR_SYNC_MASK) | (UCHAR)SYNC_SUPPORTED); + + WR_HARPOON(port+hp_autostart_1, (AUTO_IMMED+DISCONNECT_START)); + } - FPT_sisyncr(port, sync_msg, offset); + else { - currTar_Info->TarStatus = ((currTar_Info->TarStatus & - ~(unsigned char)TAR_SYNC_MASK) | - (unsigned char)SYNC_SUPPORTED); - } + + ACCEPT_MSG_ATN(port); + + FPT_sisyncr(port,sync_msg,offset); + + currTar_Info->TarStatus = ((currTar_Info->TarStatus & + ~(UCHAR)TAR_SYNC_MASK) | (UCHAR)SYNC_SUPPORTED); + } } + /*--------------------------------------------------------------------- * * Function: FPT_sisyncr @@ -3366,28 +3946,28 @@ static void FPT_stsyncn(unsigned long port, unsigned char p_card) * Description: Answer the targets sync message. * *---------------------------------------------------------------------*/ -static void FPT_sisyncr(unsigned long port, unsigned char sync_pulse, - unsigned char offset) +static void FPT_sisyncr(ULONG port,UCHAR sync_pulse, UCHAR offset) { - ARAM_ACCESS(port); - WRW_HARPOON((port + SYNC_MSGS + 0), (MPM_OP + AMSG_OUT + SMEXT)); - WRW_HARPOON((port + SYNC_MSGS + 2), (MPM_OP + AMSG_OUT + 0x03)); - WRW_HARPOON((port + SYNC_MSGS + 4), (MPM_OP + AMSG_OUT + SMSYNC)); - WRW_HARPOON((port + SYNC_MSGS + 6), (MPM_OP + AMSG_OUT + sync_pulse)); - WRW_HARPOON((port + SYNC_MSGS + 8), (RAT_OP)); - WRW_HARPOON((port + SYNC_MSGS + 10), (MPM_OP + AMSG_OUT + offset)); - WRW_HARPOON((port + SYNC_MSGS + 12), (BRH_OP + ALWAYS + NP)); - SGRAM_ACCESS(port); - - WR_HARPOON(port + hp_portctrl_0, SCSI_PORT); - WRW_HARPOON((port + hp_intstat), CLR_ALL_INT_1); - - WR_HARPOON(port + hp_autostart_3, (AUTO_IMMED + CMD_ONLY_STRT)); - - while (!(RDW_HARPOON((port + hp_intstat)) & (BUS_FREE | AUTO_INT))) { - } + ARAM_ACCESS(port); + WRW_HARPOON((port+SYNC_MSGS+0), (MPM_OP+AMSG_OUT+SMEXT )); + WRW_HARPOON((port+SYNC_MSGS+2), (MPM_OP+AMSG_OUT+0x03 )); + WRW_HARPOON((port+SYNC_MSGS+4), (MPM_OP+AMSG_OUT+SMSYNC)); + WRW_HARPOON((port+SYNC_MSGS+6), (MPM_OP+AMSG_OUT+sync_pulse)); + WRW_HARPOON((port+SYNC_MSGS+8), (RAT_OP )); + WRW_HARPOON((port+SYNC_MSGS+10),(MPM_OP+AMSG_OUT+offset)); + WRW_HARPOON((port+SYNC_MSGS+12),(BRH_OP+ALWAYS+NP )); + SGRAM_ACCESS(port); + + WR_HARPOON(port+hp_portctrl_0, SCSI_PORT); + WRW_HARPOON((port+hp_intstat), CLR_ALL_INT_1); + + WR_HARPOON(port+hp_autostart_3, (AUTO_IMMED+CMD_ONLY_STRT)); + + while (!(RDW_HARPOON((port+hp_intstat)) & (BUS_FREE | AUTO_INT))) {} } + + /*--------------------------------------------------------------------- * * Function: FPT_siwidn @@ -3397,53 +3977,50 @@ static void FPT_sisyncr(unsigned long port, unsigned char sync_pulse, * *---------------------------------------------------------------------*/ -static unsigned char FPT_siwidn(unsigned long port, unsigned char p_card) +static UCHAR FPT_siwidn(ULONG port, UCHAR p_card) { - struct sccb *currSCCB; - struct sccb_mgr_tar_info *currTar_Info; + PSCCB currSCCB; + PSCCBMgr_tar_info currTar_Info; - currSCCB = FPT_BL_Card[p_card].currentSCCB; - currTar_Info = &FPT_sccbMgrTbl[p_card][currSCCB->TargID]; + currSCCB = FPT_BL_Card[p_card].currentSCCB; + currTar_Info = &FPT_sccbMgrTbl[p_card][currSCCB->TargID]; - if (!((currTar_Info->TarStatus & TAR_WIDE_MASK) == WIDE_NEGOCIATED)) { + if (!((currTar_Info->TarStatus & TAR_WIDE_MASK) == WIDE_NEGOCIATED)) { - WRW_HARPOON((port + ID_MSG_STRT), - (MPM_OP + AMSG_OUT + - (currSCCB-> - Sccb_idmsg & ~(unsigned char)DISC_PRIV))); - WRW_HARPOON((port + ID_MSG_STRT + 2), BRH_OP + ALWAYS + CMDPZ); + WRW_HARPOON((port+ID_MSG_STRT), + (MPM_OP+AMSG_OUT+(currSCCB->Sccb_idmsg & ~(UCHAR)DISC_PRIV))); - WRW_HARPOON((port + SYNC_MSGS + 0), - (MPM_OP + AMSG_OUT + SMEXT)); - WRW_HARPOON((port + SYNC_MSGS + 2), (MPM_OP + AMSG_OUT + 0x02)); - WRW_HARPOON((port + SYNC_MSGS + 4), - (MPM_OP + AMSG_OUT + SMWDTR)); - WRW_HARPOON((port + SYNC_MSGS + 6), (RAT_OP)); - WRW_HARPOON((port + SYNC_MSGS + 8), - (MPM_OP + AMSG_OUT + SM16BIT)); - WRW_HARPOON((port + SYNC_MSGS + 10), (BRH_OP + ALWAYS + NP)); + WRW_HARPOON((port+ID_MSG_STRT+2),BRH_OP+ALWAYS+CMDPZ); - WR_HARPOON(port + hp_autostart_3, (SELECT + SELCHK_STRT)); + WRW_HARPOON((port+SYNC_MSGS+0), (MPM_OP+AMSG_OUT+SMEXT )); + WRW_HARPOON((port+SYNC_MSGS+2), (MPM_OP+AMSG_OUT+0x02 )); + WRW_HARPOON((port+SYNC_MSGS+4), (MPM_OP+AMSG_OUT+SMWDTR)); + WRW_HARPOON((port+SYNC_MSGS+6), (RAT_OP )); + WRW_HARPOON((port+SYNC_MSGS+8), (MPM_OP+AMSG_OUT+ SM16BIT)); + WRW_HARPOON((port+SYNC_MSGS+10),(BRH_OP+ALWAYS+NP )); - currTar_Info->TarStatus = ((currTar_Info->TarStatus & - ~(unsigned char)TAR_WIDE_MASK) | - (unsigned char)WIDE_ENABLED); + WR_HARPOON(port+hp_autostart_3, (SELECT+SELCHK_STRT)); - return 1; - } - else { + currTar_Info->TarStatus = ((currTar_Info->TarStatus & + ~(UCHAR)TAR_WIDE_MASK) | (UCHAR)WIDE_ENABLED); + + return(1); + } - currTar_Info->TarStatus = ((currTar_Info->TarStatus & - ~(unsigned char)TAR_WIDE_MASK) | - WIDE_NEGOCIATED); + else { - currTar_Info->TarEEValue &= ~EE_WIDE_SCSI; - return 0; - } + currTar_Info->TarStatus = ((currTar_Info->TarStatus & + ~(UCHAR)TAR_WIDE_MASK) | WIDE_NEGOCIATED); + + currTar_Info->TarEEValue &= ~EE_WIDE_SCSI; + return(0); + } } + + /*--------------------------------------------------------------------- * * Function: FPT_stwidn @@ -3452,70 +4029,79 @@ static unsigned char FPT_siwidn(unsigned long port, unsigned char p_card) * necessary. * *---------------------------------------------------------------------*/ -static void FPT_stwidn(unsigned long port, unsigned char p_card) +static void FPT_stwidn(ULONG port, UCHAR p_card) { - unsigned char width; - struct sccb *currSCCB; - struct sccb_mgr_tar_info *currTar_Info; + UCHAR width; + PSCCB currSCCB; + PSCCBMgr_tar_info currTar_Info; - currSCCB = FPT_BL_Card[p_card].currentSCCB; - currTar_Info = &FPT_sccbMgrTbl[p_card][currSCCB->TargID]; + currSCCB = FPT_BL_Card[p_card].currentSCCB; + currTar_Info = &FPT_sccbMgrTbl[p_card][currSCCB->TargID]; - width = FPT_sfm(port, currSCCB); + width = FPT_sfm(port,currSCCB); - if ((width == 0x00) && (currSCCB->Sccb_scsimsg == SMPARITY)) { - WR_HARPOON(port + hp_autostart_1, - (AUTO_IMMED + DISCONNECT_START)); + if((width == 0x00) && (currSCCB->Sccb_scsimsg == SMPARITY)) + { + WR_HARPOON(port+hp_autostart_1, (AUTO_IMMED+DISCONNECT_START)); return; } - if (!(currTar_Info->TarEEValue & EE_WIDE_SCSI)) - width = 0; - if (width) { - currTar_Info->TarStatus |= WIDE_ENABLED; - width = 0; - } else { - width = NARROW_SCSI; - currTar_Info->TarStatus &= ~WIDE_ENABLED; - } + if (!(currTar_Info->TarEEValue & EE_WIDE_SCSI)) + width = 0; - FPT_sssyncv(port, currSCCB->TargID, width, currTar_Info); + if (width) { + currTar_Info->TarStatus |= WIDE_ENABLED; + width = 0; + } + else { + width = NARROW_SCSI; + currTar_Info->TarStatus &= ~WIDE_ENABLED; + } - if (currSCCB->Sccb_scsistat == SELECT_WN_ST) { - currTar_Info->TarStatus |= WIDE_NEGOCIATED; + FPT_sssyncv(port,currSCCB->TargID,width,currTar_Info); - if (! - ((currTar_Info->TarStatus & TAR_SYNC_MASK) == - SYNC_SUPPORTED)) { - ACCEPT_MSG_ATN(port); - ARAM_ACCESS(port); - FPT_sisyncn(port, p_card, 1); - currSCCB->Sccb_scsistat = SELECT_SN_ST; - SGRAM_ACCESS(port); - } else { - ACCEPT_MSG(port); - WR_HARPOON(port + hp_autostart_1, - (AUTO_IMMED + DISCONNECT_START)); - } - } - else { + if (currSCCB->Sccb_scsistat == SELECT_WN_ST) + { + - ACCEPT_MSG_ATN(port); - if (currTar_Info->TarEEValue & EE_WIDE_SCSI) - width = SM16BIT; + currTar_Info->TarStatus |= WIDE_NEGOCIATED; + + if (!((currTar_Info->TarStatus & TAR_SYNC_MASK) == SYNC_SUPPORTED)) + { + ACCEPT_MSG_ATN(port); + ARAM_ACCESS(port); + FPT_sisyncn(port,p_card, 1); + currSCCB->Sccb_scsistat = SELECT_SN_ST; + SGRAM_ACCESS(port); + } else - width = SM8BIT; + { + ACCEPT_MSG(port); + WR_HARPOON(port+hp_autostart_1, (AUTO_IMMED+DISCONNECT_START)); + } + } - FPT_siwidr(port, width); + else { - currTar_Info->TarStatus |= (WIDE_NEGOCIATED | WIDE_ENABLED); - } + + ACCEPT_MSG_ATN(port); + + if (currTar_Info->TarEEValue & EE_WIDE_SCSI) + width = SM16BIT; + else + width = SM8BIT; + + FPT_siwidr(port,width); + + currTar_Info->TarStatus |= (WIDE_NEGOCIATED | WIDE_ENABLED); + } } + /*--------------------------------------------------------------------- * * Function: FPT_siwidr @@ -3523,26 +4109,27 @@ static void FPT_stwidn(unsigned long port, unsigned char p_card) * Description: Answer the targets Wide nego message. * *---------------------------------------------------------------------*/ -static void FPT_siwidr(unsigned long port, unsigned char width) +static void FPT_siwidr(ULONG port, UCHAR width) { - ARAM_ACCESS(port); - WRW_HARPOON((port + SYNC_MSGS + 0), (MPM_OP + AMSG_OUT + SMEXT)); - WRW_HARPOON((port + SYNC_MSGS + 2), (MPM_OP + AMSG_OUT + 0x02)); - WRW_HARPOON((port + SYNC_MSGS + 4), (MPM_OP + AMSG_OUT + SMWDTR)); - WRW_HARPOON((port + SYNC_MSGS + 6), (RAT_OP)); - WRW_HARPOON((port + SYNC_MSGS + 8), (MPM_OP + AMSG_OUT + width)); - WRW_HARPOON((port + SYNC_MSGS + 10), (BRH_OP + ALWAYS + NP)); - SGRAM_ACCESS(port); + ARAM_ACCESS(port); + WRW_HARPOON((port+SYNC_MSGS+0), (MPM_OP+AMSG_OUT+SMEXT )); + WRW_HARPOON((port+SYNC_MSGS+2), (MPM_OP+AMSG_OUT+0x02 )); + WRW_HARPOON((port+SYNC_MSGS+4), (MPM_OP+AMSG_OUT+SMWDTR)); + WRW_HARPOON((port+SYNC_MSGS+6), (RAT_OP )); + WRW_HARPOON((port+SYNC_MSGS+8),(MPM_OP+AMSG_OUT+width)); + WRW_HARPOON((port+SYNC_MSGS+10),(BRH_OP+ALWAYS+NP )); + SGRAM_ACCESS(port); - WR_HARPOON(port + hp_portctrl_0, SCSI_PORT); - WRW_HARPOON((port + hp_intstat), CLR_ALL_INT_1); + WR_HARPOON(port+hp_portctrl_0, SCSI_PORT); + WRW_HARPOON((port+hp_intstat), CLR_ALL_INT_1); - WR_HARPOON(port + hp_autostart_3, (AUTO_IMMED + CMD_ONLY_STRT)); + WR_HARPOON(port+hp_autostart_3, (AUTO_IMMED+CMD_ONLY_STRT)); - while (!(RDW_HARPOON((port + hp_intstat)) & (BUS_FREE | AUTO_INT))) { - } + while (!(RDW_HARPOON((port+hp_intstat)) & (BUS_FREE | AUTO_INT))) {} } + + /*--------------------------------------------------------------------- * * Function: FPT_sssyncv @@ -3551,71 +4138,71 @@ static void FPT_siwidr(unsigned long port, unsigned char width) * ID specified. * *---------------------------------------------------------------------*/ -static void FPT_sssyncv(unsigned long p_port, unsigned char p_id, - unsigned char p_sync_value, - struct sccb_mgr_tar_info *currTar_Info) +static void FPT_sssyncv(ULONG p_port, UCHAR p_id, UCHAR p_sync_value, + PSCCBMgr_tar_info currTar_Info) { - unsigned char index; - - index = p_id; - - switch (index) { - - case 0: - index = 12; /* hp_synctarg_0 */ - break; - case 1: - index = 13; /* hp_synctarg_1 */ - break; - case 2: - index = 14; /* hp_synctarg_2 */ - break; - case 3: - index = 15; /* hp_synctarg_3 */ - break; - case 4: - index = 8; /* hp_synctarg_4 */ - break; - case 5: - index = 9; /* hp_synctarg_5 */ - break; - case 6: - index = 10; /* hp_synctarg_6 */ - break; - case 7: - index = 11; /* hp_synctarg_7 */ - break; - case 8: - index = 4; /* hp_synctarg_8 */ - break; - case 9: - index = 5; /* hp_synctarg_9 */ - break; - case 10: - index = 6; /* hp_synctarg_10 */ - break; - case 11: - index = 7; /* hp_synctarg_11 */ - break; - case 12: - index = 0; /* hp_synctarg_12 */ - break; - case 13: - index = 1; /* hp_synctarg_13 */ - break; - case 14: - index = 2; /* hp_synctarg_14 */ - break; - case 15: - index = 3; /* hp_synctarg_15 */ + UCHAR index; + + index = p_id; + + switch (index) { + + case 0: + index = 12; /* hp_synctarg_0 */ + break; + case 1: + index = 13; /* hp_synctarg_1 */ + break; + case 2: + index = 14; /* hp_synctarg_2 */ + break; + case 3: + index = 15; /* hp_synctarg_3 */ + break; + case 4: + index = 8; /* hp_synctarg_4 */ + break; + case 5: + index = 9; /* hp_synctarg_5 */ + break; + case 6: + index = 10; /* hp_synctarg_6 */ + break; + case 7: + index = 11; /* hp_synctarg_7 */ + break; + case 8: + index = 4; /* hp_synctarg_8 */ + break; + case 9: + index = 5; /* hp_synctarg_9 */ + break; + case 10: + index = 6; /* hp_synctarg_10 */ + break; + case 11: + index = 7; /* hp_synctarg_11 */ + break; + case 12: + index = 0; /* hp_synctarg_12 */ + break; + case 13: + index = 1; /* hp_synctarg_13 */ + break; + case 14: + index = 2; /* hp_synctarg_14 */ + break; + case 15: + index = 3; /* hp_synctarg_15 */ - } + } - WR_HARPOON(p_port + hp_synctarg_base + index, p_sync_value); + WR_HARPOON(p_port+hp_synctarg_base+index, p_sync_value); currTar_Info->TarSyncCtrl = p_sync_value; } + /*--------------------------------------------------------------------- * * Function: FPT_sresb @@ -3623,67 +4210,69 @@ static void FPT_sssyncv(unsigned long p_port, unsigned char p_id, * Description: Reset the desired card's SCSI bus. * *---------------------------------------------------------------------*/ -static void FPT_sresb(unsigned long port, unsigned char p_card) +static void FPT_sresb(ULONG port, UCHAR p_card) { - unsigned char scsiID, i; + UCHAR scsiID, i; - struct sccb_mgr_tar_info *currTar_Info; + PSCCBMgr_tar_info currTar_Info; - WR_HARPOON(port + hp_page_ctrl, - (RD_HARPOON(port + hp_page_ctrl) | G_INT_DISABLE)); - WRW_HARPOON((port + hp_intstat), CLR_ALL_INT); + WR_HARPOON(port+hp_page_ctrl, + (RD_HARPOON(port+hp_page_ctrl) | G_INT_DISABLE)); + WRW_HARPOON((port+hp_intstat), CLR_ALL_INT); - WR_HARPOON(port + hp_scsictrl_0, SCSI_RST); + WR_HARPOON(port+hp_scsictrl_0, SCSI_RST); - scsiID = RD_HARPOON(port + hp_seltimeout); - WR_HARPOON(port + hp_seltimeout, TO_5ms); - WRW_HARPOON((port + hp_intstat), TIMEOUT); + scsiID = RD_HARPOON(port+hp_seltimeout); + WR_HARPOON(port+hp_seltimeout,TO_5ms); + WRW_HARPOON((port+hp_intstat), TIMEOUT); - WR_HARPOON(port + hp_portctrl_0, (SCSI_PORT | START_TO)); + WR_HARPOON(port+hp_portctrl_0,(SCSI_PORT | START_TO)); - while (!(RDW_HARPOON((port + hp_intstat)) & TIMEOUT)) { - } + while (!(RDW_HARPOON((port+hp_intstat)) & TIMEOUT)) {} - WR_HARPOON(port + hp_seltimeout, scsiID); + WR_HARPOON(port+hp_seltimeout,scsiID); - WR_HARPOON(port + hp_scsictrl_0, ENA_SCAM_SEL); + WR_HARPOON(port+hp_scsictrl_0, ENA_SCAM_SEL); - FPT_Wait(port, TO_5ms); + FPT_Wait(port, TO_5ms); - WRW_HARPOON((port + hp_intstat), CLR_ALL_INT); + WRW_HARPOON((port+hp_intstat), CLR_ALL_INT); - WR_HARPOON(port + hp_int_mask, (RD_HARPOON(port + hp_int_mask) | 0x00)); + WR_HARPOON(port+hp_int_mask, (RD_HARPOON(port+hp_int_mask) | 0x00)); - for (scsiID = 0; scsiID < MAX_SCSI_TAR; scsiID++) { - currTar_Info = &FPT_sccbMgrTbl[p_card][scsiID]; + for (scsiID = 0; scsiID < MAX_SCSI_TAR; scsiID++) + { + currTar_Info = &FPT_sccbMgrTbl[p_card][scsiID]; - if (currTar_Info->TarEEValue & EE_SYNC_MASK) { - currTar_Info->TarSyncCtrl = 0; - currTar_Info->TarStatus &= ~TAR_SYNC_MASK; - } + if (currTar_Info->TarEEValue & EE_SYNC_MASK) + { + currTar_Info->TarSyncCtrl = 0; + currTar_Info->TarStatus &= ~TAR_SYNC_MASK; + } - if (currTar_Info->TarEEValue & EE_WIDE_SCSI) { - currTar_Info->TarStatus &= ~TAR_WIDE_MASK; - } + if (currTar_Info->TarEEValue & EE_WIDE_SCSI) + { + currTar_Info->TarStatus &= ~TAR_WIDE_MASK; + } - FPT_sssyncv(port, scsiID, NARROW_SCSI, currTar_Info); + FPT_sssyncv(port, scsiID, NARROW_SCSI,currTar_Info); - FPT_SccbMgrTableInitTarget(p_card, scsiID); - } + FPT_SccbMgrTableInitTarget(p_card, scsiID); + } - FPT_BL_Card[p_card].scanIndex = 0x00; - FPT_BL_Card[p_card].currentSCCB = NULL; - FPT_BL_Card[p_card].globalFlags &= ~(F_TAG_STARTED | F_HOST_XFER_ACT - | F_NEW_SCCB_CMD); - FPT_BL_Card[p_card].cmdCounter = 0x00; + FPT_BL_Card[p_card].scanIndex = 0x00; + FPT_BL_Card[p_card].currentSCCB = NULL; + FPT_BL_Card[p_card].globalFlags &= ~(F_TAG_STARTED | F_HOST_XFER_ACT + | F_NEW_SCCB_CMD); + FPT_BL_Card[p_card].cmdCounter = 0x00; FPT_BL_Card[p_card].discQCount = 0x00; - FPT_BL_Card[p_card].tagQ_Lst = 0x01; + FPT_BL_Card[p_card].tagQ_Lst = 0x01; - for (i = 0; i < QUEUE_DEPTH; i++) + for(i = 0; i < QUEUE_DEPTH; i++) FPT_BL_Card[p_card].discQ_Tbl[i] = NULL; - WR_HARPOON(port + hp_page_ctrl, - (RD_HARPOON(port + hp_page_ctrl) & ~G_INT_DISABLE)); + WR_HARPOON(port+hp_page_ctrl, + (RD_HARPOON(port+hp_page_ctrl) & ~G_INT_DISABLE)); } @@ -3694,43 +4283,46 @@ static void FPT_sresb(unsigned long port, unsigned char p_card) * Description: Setup for the Auto Sense command. * *---------------------------------------------------------------------*/ -static void FPT_ssenss(struct sccb_card *pCurrCard) +static void FPT_ssenss(PSCCBcard pCurrCard) { - unsigned char i; - struct sccb *currSCCB; + UCHAR i; + PSCCB currSCCB; - currSCCB = pCurrCard->currentSCCB; + currSCCB = pCurrCard->currentSCCB; - currSCCB->Save_CdbLen = currSCCB->CdbLength; - for (i = 0; i < 6; i++) { + currSCCB->Save_CdbLen = currSCCB->CdbLength; - currSCCB->Save_Cdb[i] = currSCCB->Cdb[i]; - } + for (i = 0; i < 6; i++) { + + currSCCB->Save_Cdb[i] = currSCCB->Cdb[i]; + } - currSCCB->CdbLength = SIX_BYTE_CMD; - currSCCB->Cdb[0] = SCSI_REQUEST_SENSE; - currSCCB->Cdb[1] = currSCCB->Cdb[1] & (unsigned char)0xE0; /*Keep LUN. */ - currSCCB->Cdb[2] = 0x00; - currSCCB->Cdb[3] = 0x00; - currSCCB->Cdb[4] = currSCCB->RequestSenseLength; - currSCCB->Cdb[5] = 0x00; + currSCCB->CdbLength = SIX_BYTE_CMD; + currSCCB->Cdb[0] = SCSI_REQUEST_SENSE; + currSCCB->Cdb[1] = currSCCB->Cdb[1] & (UCHAR)0xE0; /*Keep LUN. */ + currSCCB->Cdb[2] = 0x00; + currSCCB->Cdb[3] = 0x00; + currSCCB->Cdb[4] = currSCCB->RequestSenseLength; + currSCCB->Cdb[5] = 0x00; - currSCCB->Sccb_XferCnt = (unsigned long)currSCCB->RequestSenseLength; + currSCCB->Sccb_XferCnt = (unsigned long)currSCCB->RequestSenseLength; - currSCCB->Sccb_ATC = 0x00; + currSCCB->Sccb_ATC = 0x00; - currSCCB->Sccb_XferState |= F_AUTO_SENSE; + currSCCB->Sccb_XferState |= F_AUTO_SENSE; - currSCCB->Sccb_XferState &= ~F_SG_XFER; + currSCCB->Sccb_XferState &= ~F_SG_XFER; - currSCCB->Sccb_idmsg = currSCCB->Sccb_idmsg & ~(unsigned char)DISC_PRIV; + currSCCB->Sccb_idmsg = currSCCB->Sccb_idmsg & ~(UCHAR)DISC_PRIV; - currSCCB->ControlByte = 0x00; + currSCCB->ControlByte = 0x00; - currSCCB->Sccb_MGRFlags &= F_STATUSLOADED; + currSCCB->Sccb_MGRFlags &= F_STATUSLOADED; } + + /*--------------------------------------------------------------------- * * Function: FPT_sxfrp @@ -3740,79 +4332,79 @@ static void FPT_ssenss(struct sccb_card *pCurrCard) * *---------------------------------------------------------------------*/ -static void FPT_sxfrp(unsigned long p_port, unsigned char p_card) +static void FPT_sxfrp(ULONG p_port, UCHAR p_card) { - unsigned char curr_phz; - - DISABLE_AUTO(p_port); - - if (FPT_BL_Card[p_card].globalFlags & F_HOST_XFER_ACT) { - - FPT_hostDataXferAbort(p_port, p_card, - FPT_BL_Card[p_card].currentSCCB); + UCHAR curr_phz; - } - /* If the Automation handled the end of the transfer then do not - match the phase or we will get out of sync with the ISR. */ + DISABLE_AUTO(p_port); - if (RDW_HARPOON((p_port + hp_intstat)) & - (BUS_FREE | XFER_CNT_0 | AUTO_INT)) - return; + if (FPT_BL_Card[p_card].globalFlags & F_HOST_XFER_ACT) { - WR_HARPOON(p_port + hp_xfercnt_0, 0x00); + FPT_hostDataXferAbort(p_port,p_card,FPT_BL_Card[p_card].currentSCCB); - curr_phz = RD_HARPOON(p_port + hp_scsisig) & (unsigned char)S_SCSI_PHZ; + } - WRW_HARPOON((p_port + hp_intstat), XFER_CNT_0); + /* If the Automation handled the end of the transfer then do not + match the phase or we will get out of sync with the ISR. */ - WR_HARPOON(p_port + hp_scsisig, curr_phz); + if (RDW_HARPOON((p_port+hp_intstat)) & (BUS_FREE | XFER_CNT_0 | AUTO_INT)) + return; - while (!(RDW_HARPOON((p_port + hp_intstat)) & (BUS_FREE | RESET)) && - (curr_phz == - (RD_HARPOON(p_port + hp_scsisig) & (unsigned char)S_SCSI_PHZ))) - { - if (curr_phz & (unsigned char)SCSI_IOBIT) { - WR_HARPOON(p_port + hp_portctrl_0, - (SCSI_PORT | HOST_PORT | SCSI_INBIT)); + WR_HARPOON(p_port+hp_xfercnt_0, 0x00); - if (!(RD_HARPOON(p_port + hp_xferstat) & FIFO_EMPTY)) { - RD_HARPOON(p_port + hp_fifodata_0); - } - } else { - WR_HARPOON(p_port + hp_portctrl_0, - (SCSI_PORT | HOST_PORT | HOST_WRT)); - if (RD_HARPOON(p_port + hp_xferstat) & FIFO_EMPTY) { - WR_HARPOON(p_port + hp_fifodata_0, 0xFA); - } - } - } /* End of While loop for padding data I/O phase */ + curr_phz = RD_HARPOON(p_port+hp_scsisig) & (UCHAR)S_SCSI_PHZ; - while (!(RDW_HARPOON((p_port + hp_intstat)) & (BUS_FREE | RESET))) { - if (RD_HARPOON(p_port + hp_scsisig) & SCSI_REQ) - break; - } + WRW_HARPOON((p_port+hp_intstat), XFER_CNT_0); - WR_HARPOON(p_port + hp_portctrl_0, - (SCSI_PORT | HOST_PORT | SCSI_INBIT)); - while (!(RD_HARPOON(p_port + hp_xferstat) & FIFO_EMPTY)) { - RD_HARPOON(p_port + hp_fifodata_0); - } - if (!(RDW_HARPOON((p_port + hp_intstat)) & (BUS_FREE | RESET))) { - WR_HARPOON(p_port + hp_autostart_0, - (AUTO_IMMED + DISCONNECT_START)); - while (!(RDW_HARPOON((p_port + hp_intstat)) & AUTO_INT)) { - } + WR_HARPOON(p_port+hp_scsisig, curr_phz); - if (RDW_HARPOON((p_port + hp_intstat)) & - (ICMD_COMP | ITAR_DISC)) - while (! - (RDW_HARPOON((p_port + hp_intstat)) & - (BUS_FREE | RSEL))) ; - } + while ( !(RDW_HARPOON((p_port+hp_intstat)) & (BUS_FREE | RESET)) && + (curr_phz == (RD_HARPOON(p_port+hp_scsisig) & (UCHAR)S_SCSI_PHZ)) ) + { + if (curr_phz & (UCHAR)SCSI_IOBIT) + { + WR_HARPOON(p_port+hp_portctrl_0, (SCSI_PORT | HOST_PORT | SCSI_INBIT)); + + if (!(RD_HARPOON(p_port+hp_xferstat) & FIFO_EMPTY)) + { + RD_HARPOON(p_port+hp_fifodata_0); + } + } + else + { + WR_HARPOON(p_port+hp_portctrl_0, (SCSI_PORT | HOST_PORT | HOST_WRT)); + if (RD_HARPOON(p_port+hp_xferstat) & FIFO_EMPTY) + { + WR_HARPOON(p_port+hp_fifodata_0,0xFA); + } + } + } /* End of While loop for padding data I/O phase */ + + while ( !(RDW_HARPOON((p_port+hp_intstat)) & (BUS_FREE | RESET))) + { + if (RD_HARPOON(p_port+hp_scsisig) & SCSI_REQ) + break; + } + + WR_HARPOON(p_port+hp_portctrl_0, (SCSI_PORT | HOST_PORT | SCSI_INBIT)); + while (!(RD_HARPOON(p_port+hp_xferstat) & FIFO_EMPTY)) + { + RD_HARPOON(p_port+hp_fifodata_0); + } + + if ( !(RDW_HARPOON((p_port+hp_intstat)) & (BUS_FREE | RESET))) + { + WR_HARPOON(p_port+hp_autostart_0, (AUTO_IMMED+DISCONNECT_START)); + while (!(RDW_HARPOON((p_port+hp_intstat)) & AUTO_INT)) {} + + if (RDW_HARPOON((p_port+hp_intstat)) & (ICMD_COMP | ITAR_DISC)) + while (!(RDW_HARPOON((p_port+hp_intstat)) & (BUS_FREE | RSEL))) ; + } } + /*--------------------------------------------------------------------- * * Function: FPT_schkdd @@ -3822,99 +4414,111 @@ static void FPT_sxfrp(unsigned long p_port, unsigned char p_card) * *---------------------------------------------------------------------*/ -static void FPT_schkdd(unsigned long port, unsigned char p_card) +static void FPT_schkdd(ULONG port, UCHAR p_card) { - unsigned short TimeOutLoop; - unsigned char sPhase; + USHORT TimeOutLoop; + UCHAR sPhase; - struct sccb *currSCCB; + PSCCB currSCCB; - currSCCB = FPT_BL_Card[p_card].currentSCCB; + currSCCB = FPT_BL_Card[p_card].currentSCCB; - if ((currSCCB->Sccb_scsistat != DATA_OUT_ST) && - (currSCCB->Sccb_scsistat != DATA_IN_ST)) { - return; - } - if (currSCCB->Sccb_XferState & F_ODD_BALL_CNT) { + if ((currSCCB->Sccb_scsistat != DATA_OUT_ST) && + (currSCCB->Sccb_scsistat != DATA_IN_ST)) { + return; + } - currSCCB->Sccb_ATC += (currSCCB->Sccb_XferCnt - 1); - currSCCB->Sccb_XferCnt = 1; - currSCCB->Sccb_XferState &= ~F_ODD_BALL_CNT; - WRW_HARPOON((port + hp_fiforead), (unsigned short)0x00); - WR_HARPOON(port + hp_xferstat, 0x00); - } + if (currSCCB->Sccb_XferState & F_ODD_BALL_CNT) + { - else { + currSCCB->Sccb_ATC += (currSCCB->Sccb_XferCnt-1); - currSCCB->Sccb_ATC += currSCCB->Sccb_XferCnt; + currSCCB->Sccb_XferCnt = 1; - currSCCB->Sccb_XferCnt = 0; - } + currSCCB->Sccb_XferState &= ~F_ODD_BALL_CNT; + WRW_HARPOON((port+hp_fiforead), (USHORT) 0x00); + WR_HARPOON(port+hp_xferstat, 0x00); + } - if ((RDW_HARPOON((port + hp_intstat)) & PARITY) && - (currSCCB->HostStatus == SCCB_COMPLETE)) { + else + { - currSCCB->HostStatus = SCCB_PARITY_ERR; - WRW_HARPOON((port + hp_intstat), PARITY); - } + currSCCB->Sccb_ATC += currSCCB->Sccb_XferCnt; - FPT_hostDataXferAbort(port, p_card, currSCCB); + currSCCB->Sccb_XferCnt = 0; + } - while (RD_HARPOON(port + hp_scsisig) & SCSI_ACK) { - } + if ((RDW_HARPOON((port+hp_intstat)) & PARITY) && + (currSCCB->HostStatus == SCCB_COMPLETE)) { - TimeOutLoop = 0; + currSCCB->HostStatus = SCCB_PARITY_ERR; + WRW_HARPOON((port+hp_intstat), PARITY); + } - while (RD_HARPOON(port + hp_xferstat) & FIFO_EMPTY) { - if (RDW_HARPOON((port + hp_intstat)) & BUS_FREE) { - return; - } - if (RD_HARPOON(port + hp_offsetctr) & (unsigned char)0x1F) { - break; - } - if (RDW_HARPOON((port + hp_intstat)) & RESET) { - return; - } - if ((RD_HARPOON(port + hp_scsisig) & SCSI_REQ) - || (TimeOutLoop++ > 0x3000)) - break; - } - sPhase = RD_HARPOON(port + hp_scsisig) & (SCSI_BSY | S_SCSI_PHZ); - if ((!(RD_HARPOON(port + hp_xferstat) & FIFO_EMPTY)) || - (RD_HARPOON(port + hp_offsetctr) & (unsigned char)0x1F) || - (sPhase == (SCSI_BSY | S_DATAO_PH)) || - (sPhase == (SCSI_BSY | S_DATAI_PH))) { + FPT_hostDataXferAbort(port,p_card,currSCCB); - WR_HARPOON(port + hp_portctrl_0, SCSI_PORT); - if (!(currSCCB->Sccb_XferState & F_ALL_XFERRED)) { - if (currSCCB->Sccb_XferState & F_HOST_XFER_DIR) { - FPT_phaseDataIn(port, p_card); - } + while (RD_HARPOON(port+hp_scsisig) & SCSI_ACK) {} - else { - FPT_phaseDataOut(port, p_card); - } - } else { - FPT_sxfrp(port, p_card); - if (!(RDW_HARPOON((port + hp_intstat)) & - (BUS_FREE | ICMD_COMP | ITAR_DISC | RESET))) { - WRW_HARPOON((port + hp_intstat), AUTO_INT); - FPT_phaseDecode(port, p_card); - } - } + TimeOutLoop = 0; - } + while(RD_HARPOON(port+hp_xferstat) & FIFO_EMPTY) + { + if (RDW_HARPOON((port+hp_intstat)) & BUS_FREE) { + return; + } + if (RD_HARPOON(port+hp_offsetctr) & (UCHAR)0x1F) { + break; + } + if (RDW_HARPOON((port+hp_intstat)) & RESET) { + return; + } + if ((RD_HARPOON(port+hp_scsisig) & SCSI_REQ) || (TimeOutLoop++>0x3000) ) + break; + } - else { - WR_HARPOON(port + hp_portctrl_0, 0x00); - } + sPhase = RD_HARPOON(port+hp_scsisig) & (SCSI_BSY | S_SCSI_PHZ); + if ((!(RD_HARPOON(port+hp_xferstat) & FIFO_EMPTY)) || + (RD_HARPOON(port+hp_offsetctr) & (UCHAR)0x1F) || + (sPhase == (SCSI_BSY | S_DATAO_PH)) || + (sPhase == (SCSI_BSY | S_DATAI_PH))) + { + + WR_HARPOON(port+hp_portctrl_0, SCSI_PORT); + + if (!(currSCCB->Sccb_XferState & F_ALL_XFERRED)) + { + if (currSCCB->Sccb_XferState & F_HOST_XFER_DIR) { + FPT_phaseDataIn(port,p_card); + } + + else { + FPT_phaseDataOut(port,p_card); + } + } + else + { + FPT_sxfrp(port,p_card); + if (!(RDW_HARPOON((port+hp_intstat)) & + (BUS_FREE | ICMD_COMP | ITAR_DISC | RESET))) + { + WRW_HARPOON((port+hp_intstat), AUTO_INT); + FPT_phaseDecode(port,p_card); + } + } + + } + + else { + WR_HARPOON(port+hp_portctrl_0, 0x00); + } } + /*--------------------------------------------------------------------- * * Function: FPT_sinits @@ -3923,37 +4527,39 @@ static void FPT_schkdd(unsigned long port, unsigned char p_card) * *---------------------------------------------------------------------*/ -static void FPT_sinits(struct sccb *p_sccb, unsigned char p_card) +static void FPT_sinits(PSCCB p_sccb, UCHAR p_card) { - struct sccb_mgr_tar_info *currTar_Info; + PSCCBMgr_tar_info currTar_Info; - if ((p_sccb->TargID > MAX_SCSI_TAR) || (p_sccb->Lun > MAX_LUN)) { + if((p_sccb->TargID > MAX_SCSI_TAR) || (p_sccb->Lun > MAX_LUN)) + { return; } - currTar_Info = &FPT_sccbMgrTbl[p_card][p_sccb->TargID]; + currTar_Info = &FPT_sccbMgrTbl[p_card][p_sccb->TargID]; - p_sccb->Sccb_XferState = 0x00; - p_sccb->Sccb_XferCnt = p_sccb->DataLength; + p_sccb->Sccb_XferState = 0x00; + p_sccb->Sccb_XferCnt = p_sccb->DataLength; - if ((p_sccb->OperationCode == SCATTER_GATHER_COMMAND) || - (p_sccb->OperationCode == RESIDUAL_SG_COMMAND)) { + if ((p_sccb->OperationCode == SCATTER_GATHER_COMMAND) || + (p_sccb->OperationCode == RESIDUAL_SG_COMMAND)) { - p_sccb->Sccb_SGoffset = 0; - p_sccb->Sccb_XferState = F_SG_XFER; - p_sccb->Sccb_XferCnt = 0x00; - } + p_sccb->Sccb_SGoffset = 0; + p_sccb->Sccb_XferState = F_SG_XFER; + p_sccb->Sccb_XferCnt = 0x00; + } - if (p_sccb->DataLength == 0x00) + if (p_sccb->DataLength == 0x00) - p_sccb->Sccb_XferState |= F_ALL_XFERRED; + p_sccb->Sccb_XferState |= F_ALL_XFERRED; - if (p_sccb->ControlByte & F_USE_CMD_Q) { - if ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) == TAG_Q_REJECT) - p_sccb->ControlByte &= ~F_USE_CMD_Q; + if (p_sccb->ControlByte & F_USE_CMD_Q) + { + if ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) == TAG_Q_REJECT) + p_sccb->ControlByte &= ~F_USE_CMD_Q; - else - currTar_Info->TarStatus |= TAG_Q_TRYING; - } + else + currTar_Info->TarStatus |= TAG_Q_TRYING; + } /* For !single SCSI device in system & device allow Disconnect or command is tag_q type then send Cmd with Disconnect Enable @@ -3964,35 +4570,35 @@ static void FPT_sinits(struct sccb *p_sccb, unsigned char p_card) (currTar_Info->TarStatus & TAR_ALLOW_DISC)) || (currTar_Info->TarStatus & TAG_Q_TRYING)) { */ - if ((currTar_Info->TarStatus & TAR_ALLOW_DISC) || - (currTar_Info->TarStatus & TAG_Q_TRYING)) { - p_sccb->Sccb_idmsg = - (unsigned char)(SMIDENT | DISC_PRIV) | p_sccb->Lun; - } + if ((currTar_Info->TarStatus & TAR_ALLOW_DISC) || + (currTar_Info->TarStatus & TAG_Q_TRYING)) { + p_sccb->Sccb_idmsg = (UCHAR)(SMIDENT | DISC_PRIV) | p_sccb->Lun; + } - else { + else { - p_sccb->Sccb_idmsg = (unsigned char)SMIDENT | p_sccb->Lun; - } + p_sccb->Sccb_idmsg = (UCHAR)SMIDENT | p_sccb->Lun; + } - p_sccb->HostStatus = 0x00; - p_sccb->TargetStatus = 0x00; - p_sccb->Sccb_tag = 0x00; - p_sccb->Sccb_MGRFlags = 0x00; - p_sccb->Sccb_sgseg = 0x00; - p_sccb->Sccb_ATC = 0x00; - p_sccb->Sccb_savedATC = 0x00; + p_sccb->HostStatus = 0x00; + p_sccb->TargetStatus = 0x00; + p_sccb->Sccb_tag = 0x00; + p_sccb->Sccb_MGRFlags = 0x00; + p_sccb->Sccb_sgseg = 0x00; + p_sccb->Sccb_ATC = 0x00; + p_sccb->Sccb_savedATC = 0x00; /* p_sccb->SccbVirtDataPtr = 0x00; p_sccb->Sccb_forwardlink = NULL; p_sccb->Sccb_backlink = NULL; */ - p_sccb->Sccb_scsistat = BUS_FREE_ST; - p_sccb->SccbStatus = SCCB_IN_PROCESS; - p_sccb->Sccb_scsimsg = SMNO_OP; + p_sccb->Sccb_scsistat = BUS_FREE_ST; + p_sccb->SccbStatus = SCCB_IN_PROCESS; + p_sccb->Sccb_scsimsg = SMNO_OP; } + /*--------------------------------------------------------------------- * * Function: Phase Decode @@ -4001,21 +4607,23 @@ static void FPT_sinits(struct sccb *p_sccb, unsigned char p_card) * *---------------------------------------------------------------------*/ -static void FPT_phaseDecode(unsigned long p_port, unsigned char p_card) +static void FPT_phaseDecode(ULONG p_port, UCHAR p_card) { - unsigned char phase_ref; - void (*phase) (unsigned long, unsigned char); + unsigned char phase_ref; + void (*phase) (ULONG, UCHAR); + - DISABLE_AUTO(p_port); + DISABLE_AUTO(p_port); - phase_ref = - (unsigned char)(RD_HARPOON(p_port + hp_scsisig) & S_SCSI_PHZ); + phase_ref = (UCHAR) (RD_HARPOON(p_port+hp_scsisig) & S_SCSI_PHZ); - phase = FPT_s_PhaseTbl[phase_ref]; + phase = FPT_s_PhaseTbl[phase_ref]; - (*phase) (p_port, p_card); /* Call the correct phase func */ + (*phase)(p_port, p_card); /* Call the correct phase func */ } + + /*--------------------------------------------------------------------- * * Function: Data Out Phase @@ -4024,39 +4632,42 @@ static void FPT_phaseDecode(unsigned long p_port, unsigned char p_card) * *---------------------------------------------------------------------*/ -static void FPT_phaseDataOut(unsigned long port, unsigned char p_card) +static void FPT_phaseDataOut(ULONG port, UCHAR p_card) { - struct sccb *currSCCB; + PSCCB currSCCB; - currSCCB = FPT_BL_Card[p_card].currentSCCB; - if (currSCCB == NULL) { - return; /* Exit if No SCCB record */ - } + currSCCB = FPT_BL_Card[p_card].currentSCCB; + if (currSCCB == NULL) + { + return; /* Exit if No SCCB record */ + } - currSCCB->Sccb_scsistat = DATA_OUT_ST; - currSCCB->Sccb_XferState &= ~(F_HOST_XFER_DIR | F_NO_DATA_YET); + currSCCB->Sccb_scsistat = DATA_OUT_ST; + currSCCB->Sccb_XferState &= ~(F_HOST_XFER_DIR | F_NO_DATA_YET); - WR_HARPOON(port + hp_portctrl_0, SCSI_PORT); + WR_HARPOON(port+hp_portctrl_0, SCSI_PORT); - WRW_HARPOON((port + hp_intstat), XFER_CNT_0); + WRW_HARPOON((port+hp_intstat), XFER_CNT_0); - WR_HARPOON(port + hp_autostart_0, (END_DATA + END_DATA_START)); + WR_HARPOON(port+hp_autostart_0, (END_DATA+END_DATA_START)); - FPT_dataXferProcessor(port, &FPT_BL_Card[p_card]); + FPT_dataXferProcessor(port, &FPT_BL_Card[p_card]); - if (currSCCB->Sccb_XferCnt == 0) { + if (currSCCB->Sccb_XferCnt == 0) { - if ((currSCCB->ControlByte & SCCB_DATA_XFER_OUT) && - (currSCCB->HostStatus == SCCB_COMPLETE)) - currSCCB->HostStatus = SCCB_DATA_OVER_RUN; - FPT_sxfrp(port, p_card); - if (!(RDW_HARPOON((port + hp_intstat)) & (BUS_FREE | RESET))) - FPT_phaseDecode(port, p_card); - } + if ((currSCCB->ControlByte & SCCB_DATA_XFER_OUT) && + (currSCCB->HostStatus == SCCB_COMPLETE)) + currSCCB->HostStatus = SCCB_DATA_OVER_RUN; + + FPT_sxfrp(port,p_card); + if (!(RDW_HARPOON((port+hp_intstat)) & (BUS_FREE | RESET))) + FPT_phaseDecode(port,p_card); + } } + /*--------------------------------------------------------------------- * * Function: Data In Phase @@ -4065,40 +4676,43 @@ static void FPT_phaseDataOut(unsigned long port, unsigned char p_card) * *---------------------------------------------------------------------*/ -static void FPT_phaseDataIn(unsigned long port, unsigned char p_card) +static void FPT_phaseDataIn(ULONG port, UCHAR p_card) { - struct sccb *currSCCB; + PSCCB currSCCB; - currSCCB = FPT_BL_Card[p_card].currentSCCB; + currSCCB = FPT_BL_Card[p_card].currentSCCB; - if (currSCCB == NULL) { - return; /* Exit if No SCCB record */ - } + if (currSCCB == NULL) + { + return; /* Exit if No SCCB record */ + } - currSCCB->Sccb_scsistat = DATA_IN_ST; - currSCCB->Sccb_XferState |= F_HOST_XFER_DIR; - currSCCB->Sccb_XferState &= ~F_NO_DATA_YET; - WR_HARPOON(port + hp_portctrl_0, SCSI_PORT); + currSCCB->Sccb_scsistat = DATA_IN_ST; + currSCCB->Sccb_XferState |= F_HOST_XFER_DIR; + currSCCB->Sccb_XferState &= ~F_NO_DATA_YET; - WRW_HARPOON((port + hp_intstat), XFER_CNT_0); + WR_HARPOON(port+hp_portctrl_0, SCSI_PORT); - WR_HARPOON(port + hp_autostart_0, (END_DATA + END_DATA_START)); + WRW_HARPOON((port+hp_intstat), XFER_CNT_0); - FPT_dataXferProcessor(port, &FPT_BL_Card[p_card]); + WR_HARPOON(port+hp_autostart_0, (END_DATA+END_DATA_START)); - if (currSCCB->Sccb_XferCnt == 0) { + FPT_dataXferProcessor(port, &FPT_BL_Card[p_card]); - if ((currSCCB->ControlByte & SCCB_DATA_XFER_IN) && - (currSCCB->HostStatus == SCCB_COMPLETE)) - currSCCB->HostStatus = SCCB_DATA_OVER_RUN; + if (currSCCB->Sccb_XferCnt == 0) { - FPT_sxfrp(port, p_card); - if (!(RDW_HARPOON((port + hp_intstat)) & (BUS_FREE | RESET))) - FPT_phaseDecode(port, p_card); - } + if ((currSCCB->ControlByte & SCCB_DATA_XFER_IN) && + (currSCCB->HostStatus == SCCB_COMPLETE)) + currSCCB->HostStatus = SCCB_DATA_OVER_RUN; + + FPT_sxfrp(port,p_card); + if (!(RDW_HARPOON((port+hp_intstat)) & (BUS_FREE | RESET))) + FPT_phaseDecode(port,p_card); + + } } /*--------------------------------------------------------------------- @@ -4109,49 +4723,50 @@ static void FPT_phaseDataIn(unsigned long port, unsigned char p_card) * *---------------------------------------------------------------------*/ -static void FPT_phaseCommand(unsigned long p_port, unsigned char p_card) +static void FPT_phaseCommand(ULONG p_port, UCHAR p_card) { - struct sccb *currSCCB; - unsigned long cdb_reg; - unsigned char i; + PSCCB currSCCB; + ULONG cdb_reg; + UCHAR i; - currSCCB = FPT_BL_Card[p_card].currentSCCB; + currSCCB = FPT_BL_Card[p_card].currentSCCB; - if (currSCCB->OperationCode == RESET_COMMAND) { + if (currSCCB->OperationCode == RESET_COMMAND) { - currSCCB->HostStatus = SCCB_PHASE_SEQUENCE_FAIL; - currSCCB->CdbLength = SIX_BYTE_CMD; - } + currSCCB->HostStatus = SCCB_PHASE_SEQUENCE_FAIL; + currSCCB->CdbLength = SIX_BYTE_CMD; + } - WR_HARPOON(p_port + hp_scsisig, 0x00); + WR_HARPOON(p_port+hp_scsisig, 0x00); - ARAM_ACCESS(p_port); + ARAM_ACCESS(p_port); - cdb_reg = p_port + CMD_STRT; - for (i = 0; i < currSCCB->CdbLength; i++) { + cdb_reg = p_port + CMD_STRT; - if (currSCCB->OperationCode == RESET_COMMAND) + for (i=0; i < currSCCB->CdbLength; i++) { - WRW_HARPOON(cdb_reg, (MPM_OP + ACOMMAND + 0x00)); + if (currSCCB->OperationCode == RESET_COMMAND) - else - WRW_HARPOON(cdb_reg, - (MPM_OP + ACOMMAND + currSCCB->Cdb[i])); - cdb_reg += 2; - } + WRW_HARPOON(cdb_reg, (MPM_OP + ACOMMAND + 0x00)); - if (currSCCB->CdbLength != TWELVE_BYTE_CMD) - WRW_HARPOON(cdb_reg, (BRH_OP + ALWAYS + NP)); + else + WRW_HARPOON(cdb_reg, (MPM_OP + ACOMMAND + currSCCB->Cdb[i])); + cdb_reg +=2; + } + + if (currSCCB->CdbLength != TWELVE_BYTE_CMD) + WRW_HARPOON(cdb_reg, (BRH_OP+ALWAYS+ NP)); - WR_HARPOON(p_port + hp_portctrl_0, (SCSI_PORT)); + WR_HARPOON(p_port+hp_portctrl_0,(SCSI_PORT)); - currSCCB->Sccb_scsistat = COMMAND_ST; + currSCCB->Sccb_scsistat = COMMAND_ST; - WR_HARPOON(p_port + hp_autostart_3, (AUTO_IMMED | CMD_ONLY_STRT)); - SGRAM_ACCESS(p_port); + WR_HARPOON(p_port+hp_autostart_3, (AUTO_IMMED | CMD_ONLY_STRT)); + SGRAM_ACCESS(p_port); } + /*--------------------------------------------------------------------- * * Function: Status phase @@ -4160,18 +4775,19 @@ static void FPT_phaseCommand(unsigned long p_port, unsigned char p_card) * *---------------------------------------------------------------------*/ -static void FPT_phaseStatus(unsigned long port, unsigned char p_card) +static void FPT_phaseStatus(ULONG port, UCHAR p_card) { - /* Start-up the automation to finish off this command and let the - isr handle the interrupt for command complete when it comes in. - We could wait here for the interrupt to be generated? - */ + /* Start-up the automation to finish off this command and let the + isr handle the interrupt for command complete when it comes in. + We could wait here for the interrupt to be generated? + */ - WR_HARPOON(port + hp_scsisig, 0x00); + WR_HARPOON(port+hp_scsisig, 0x00); - WR_HARPOON(port + hp_autostart_0, (AUTO_IMMED + END_DATA_START)); + WR_HARPOON(port+hp_autostart_0, (AUTO_IMMED+END_DATA_START)); } + /*--------------------------------------------------------------------- * * Function: Phase Message Out @@ -4181,11 +4797,11 @@ static void FPT_phaseStatus(unsigned long port, unsigned char p_card) * *---------------------------------------------------------------------*/ -static void FPT_phaseMsgOut(unsigned long port, unsigned char p_card) +static void FPT_phaseMsgOut(ULONG port, UCHAR p_card) { - unsigned char message, scsiID; - struct sccb *currSCCB; - struct sccb_mgr_tar_info *currTar_Info; + UCHAR message,scsiID; + PSCCB currSCCB; + PSCCBMgr_tar_info currTar_Info; currSCCB = FPT_BL_Card[p_card].currentSCCB; @@ -4194,124 +4810,133 @@ static void FPT_phaseMsgOut(unsigned long port, unsigned char p_card) message = currSCCB->Sccb_scsimsg; scsiID = currSCCB->TargID; - if (message == SMDEV_RESET) { + if (message == SMDEV_RESET) + { + currTar_Info = &FPT_sccbMgrTbl[p_card][scsiID]; currTar_Info->TarSyncCtrl = 0; - FPT_sssyncv(port, scsiID, NARROW_SCSI, currTar_Info); + FPT_sssyncv(port, scsiID, NARROW_SCSI,currTar_Info); - if (FPT_sccbMgrTbl[p_card][scsiID]. - TarEEValue & EE_SYNC_MASK) { + if (FPT_sccbMgrTbl[p_card][scsiID].TarEEValue & EE_SYNC_MASK) + { - FPT_sccbMgrTbl[p_card][scsiID].TarStatus &= - ~TAR_SYNC_MASK; + FPT_sccbMgrTbl[p_card][scsiID].TarStatus &= ~TAR_SYNC_MASK; } - if (FPT_sccbMgrTbl[p_card][scsiID]. - TarEEValue & EE_WIDE_SCSI) { + if (FPT_sccbMgrTbl[p_card][scsiID].TarEEValue & EE_WIDE_SCSI) + { - FPT_sccbMgrTbl[p_card][scsiID].TarStatus &= - ~TAR_WIDE_MASK; + FPT_sccbMgrTbl[p_card][scsiID].TarStatus &= ~TAR_WIDE_MASK; } - FPT_queueFlushSccb(p_card, SCCB_COMPLETE); - FPT_SccbMgrTableInitTarget(p_card, scsiID); - } else if (currSCCB->Sccb_scsistat == ABORT_ST) { + + FPT_queueFlushSccb(p_card,SCCB_COMPLETE); + FPT_SccbMgrTableInitTarget(p_card,scsiID); + } + else if (currSCCB->Sccb_scsistat == ABORT_ST) + { currSCCB->HostStatus = SCCB_COMPLETE; - if (FPT_BL_Card[p_card].discQ_Tbl[currSCCB->Sccb_tag] != - NULL) { - FPT_BL_Card[p_card].discQ_Tbl[currSCCB-> - Sccb_tag] = NULL; + if(FPT_BL_Card[p_card].discQ_Tbl[currSCCB->Sccb_tag] != NULL) + { + FPT_BL_Card[p_card].discQ_Tbl[currSCCB->Sccb_tag] = NULL; FPT_sccbMgrTbl[p_card][scsiID].TarTagQ_Cnt--; } - + } - else if (currSCCB->Sccb_scsistat < COMMAND_ST) { + else if (currSCCB->Sccb_scsistat < COMMAND_ST) + { - if (message == SMNO_OP) { - currSCCB->Sccb_MGRFlags |= F_DEV_SELECTED; - FPT_ssel(port, p_card); + if(message == SMNO_OP) + { + currSCCB->Sccb_MGRFlags |= F_DEV_SELECTED; + + FPT_ssel(port,p_card); return; } - } else { + } + else + { + if (message == SMABORT) - FPT_queueFlushSccb(p_card, SCCB_COMPLETE); + FPT_queueFlushSccb(p_card,SCCB_COMPLETE); } - } else { + } + else + { message = SMABORT; } - WRW_HARPOON((port + hp_intstat), (BUS_FREE | PHASE | XFER_CNT_0)); + WRW_HARPOON((port+hp_intstat), (BUS_FREE | PHASE | XFER_CNT_0)); + - WR_HARPOON(port + hp_portctrl_0, SCSI_BUS_EN); + WR_HARPOON(port+hp_portctrl_0, SCSI_BUS_EN); - WR_HARPOON(port + hp_scsidata_0, message); + WR_HARPOON(port+hp_scsidata_0,message); - WR_HARPOON(port + hp_scsisig, (SCSI_ACK + S_ILL_PH)); + WR_HARPOON(port+hp_scsisig, (SCSI_ACK + S_ILL_PH)); ACCEPT_MSG(port); - WR_HARPOON(port + hp_portctrl_0, 0x00); + WR_HARPOON(port+hp_portctrl_0, 0x00); - if ((message == SMABORT) || (message == SMDEV_RESET) || - (message == SMABORT_TAG)) { + if ((message == SMABORT) || (message == SMDEV_RESET) || + (message == SMABORT_TAG) ) + { - while (!(RDW_HARPOON((port + hp_intstat)) & (BUS_FREE | PHASE))) { - } + while(!(RDW_HARPOON((port+hp_intstat)) & (BUS_FREE | PHASE))) {} - if (RDW_HARPOON((port + hp_intstat)) & BUS_FREE) { - WRW_HARPOON((port + hp_intstat), BUS_FREE); + if (RDW_HARPOON((port+hp_intstat)) & BUS_FREE) + { + WRW_HARPOON((port+hp_intstat), BUS_FREE); - if (currSCCB != NULL) { + if (currSCCB != NULL) + { - if ((FPT_BL_Card[p_card]. - globalFlags & F_CONLUN_IO) - && - ((FPT_sccbMgrTbl[p_card][currSCCB->TargID]. - TarStatus & TAR_TAG_Q_MASK) != - TAG_Q_TRYING)) - FPT_sccbMgrTbl[p_card][currSCCB-> - TargID]. - TarLUNBusy[currSCCB->Lun] = 0; + if((FPT_BL_Card[p_card].globalFlags & F_CONLUN_IO) && + ((FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING)) + FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[currSCCB->Lun] = 0; else - FPT_sccbMgrTbl[p_card][currSCCB-> - TargID]. - TarLUNBusy[0] = 0; + FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[0] = 0; - FPT_queueCmdComplete(&FPT_BL_Card[p_card], - currSCCB, p_card); + FPT_queueCmdComplete(&FPT_BL_Card[p_card],currSCCB, p_card); } - else { - FPT_BL_Card[p_card].globalFlags |= - F_NEW_SCCB_CMD; + else + { + FPT_BL_Card[p_card].globalFlags |= F_NEW_SCCB_CMD; } } - else { + else + { - FPT_sxfrp(port, p_card); + FPT_sxfrp(port,p_card); } } - else { + else + { - if (message == SMPARITY) { + if(message == SMPARITY) + { currSCCB->Sccb_scsimsg = SMNO_OP; - WR_HARPOON(port + hp_autostart_1, - (AUTO_IMMED + DISCONNECT_START)); - } else { - FPT_sxfrp(port, p_card); + WR_HARPOON(port+hp_autostart_1, (AUTO_IMMED+DISCONNECT_START)); + } + else + { + FPT_sxfrp(port,p_card); } } } + /*--------------------------------------------------------------------- * * Function: Message In phase @@ -4320,43 +4945,49 @@ static void FPT_phaseMsgOut(unsigned long port, unsigned char p_card) * *---------------------------------------------------------------------*/ -static void FPT_phaseMsgIn(unsigned long port, unsigned char p_card) +static void FPT_phaseMsgIn(ULONG port, UCHAR p_card) { - unsigned char message; - struct sccb *currSCCB; + UCHAR message; + PSCCB currSCCB; currSCCB = FPT_BL_Card[p_card].currentSCCB; - if (FPT_BL_Card[p_card].globalFlags & F_HOST_XFER_ACT) { + if (FPT_BL_Card[p_card].globalFlags & F_HOST_XFER_ACT) + { FPT_phaseChkFifo(port, p_card); } - message = RD_HARPOON(port + hp_scsidata_0); - if ((message == SMDISC) || (message == SMSAVE_DATA_PTR)) { + message = RD_HARPOON(port+hp_scsidata_0); + if ((message == SMDISC) || (message == SMSAVE_DATA_PTR)) + { - WR_HARPOON(port + hp_autostart_1, - (AUTO_IMMED + END_DATA_START)); + WR_HARPOON(port+hp_autostart_1, (AUTO_IMMED+END_DATA_START)); } - else { + else + { - message = FPT_sfm(port, currSCCB); - if (message) { + message = FPT_sfm(port,currSCCB); + if (message) + { - FPT_sdecm(message, port, p_card); - } else { - if (currSCCB->Sccb_scsimsg != SMPARITY) + FPT_sdecm(message,port,p_card); + + } + else + { + if(currSCCB->Sccb_scsimsg != SMPARITY) ACCEPT_MSG(port); - WR_HARPOON(port + hp_autostart_1, - (AUTO_IMMED + DISCONNECT_START)); + WR_HARPOON(port+hp_autostart_1, (AUTO_IMMED+DISCONNECT_START)); } } } + /*--------------------------------------------------------------------- * * Function: Illegal phase @@ -4367,23 +4998,25 @@ static void FPT_phaseMsgIn(unsigned long port, unsigned char p_card) * *---------------------------------------------------------------------*/ -static void FPT_phaseIllegal(unsigned long port, unsigned char p_card) +static void FPT_phaseIllegal(ULONG port, UCHAR p_card) { - struct sccb *currSCCB; + PSCCB currSCCB; - currSCCB = FPT_BL_Card[p_card].currentSCCB; + currSCCB = FPT_BL_Card[p_card].currentSCCB; - WR_HARPOON(port + hp_scsisig, RD_HARPOON(port + hp_scsisig)); - if (currSCCB != NULL) { + WR_HARPOON(port+hp_scsisig, RD_HARPOON(port+hp_scsisig)); + if (currSCCB != NULL) { - currSCCB->HostStatus = SCCB_PHASE_SEQUENCE_FAIL; - currSCCB->Sccb_scsistat = ABORT_ST; - currSCCB->Sccb_scsimsg = SMABORT; - } + currSCCB->HostStatus = SCCB_PHASE_SEQUENCE_FAIL; + currSCCB->Sccb_scsistat = ABORT_ST; + currSCCB->Sccb_scsimsg = SMABORT; + } - ACCEPT_MSG_ATN(port); + ACCEPT_MSG_ATN(port); } + + /*--------------------------------------------------------------------- * * Function: Phase Check FIFO @@ -4393,69 +5026,76 @@ static void FPT_phaseIllegal(unsigned long port, unsigned char p_card) * *---------------------------------------------------------------------*/ -static void FPT_phaseChkFifo(unsigned long port, unsigned char p_card) +static void FPT_phaseChkFifo(ULONG port, UCHAR p_card) { - unsigned long xfercnt; - struct sccb *currSCCB; + ULONG xfercnt; + PSCCB currSCCB; - currSCCB = FPT_BL_Card[p_card].currentSCCB; + currSCCB = FPT_BL_Card[p_card].currentSCCB; - if (currSCCB->Sccb_scsistat == DATA_IN_ST) { + if (currSCCB->Sccb_scsistat == DATA_IN_ST) + { - while ((!(RD_HARPOON(port + hp_xferstat) & FIFO_EMPTY)) && - (RD_HARPOON(port + hp_ext_status) & BM_CMD_BUSY)) { - } + while((!(RD_HARPOON(port+hp_xferstat) & FIFO_EMPTY)) && + (RD_HARPOON(port+hp_ext_status) & BM_CMD_BUSY)) {} - if (!(RD_HARPOON(port + hp_xferstat) & FIFO_EMPTY)) { - currSCCB->Sccb_ATC += currSCCB->Sccb_XferCnt; - currSCCB->Sccb_XferCnt = 0; + if (!(RD_HARPOON(port+hp_xferstat) & FIFO_EMPTY)) + { + currSCCB->Sccb_ATC += currSCCB->Sccb_XferCnt; - if ((RDW_HARPOON((port + hp_intstat)) & PARITY) && - (currSCCB->HostStatus == SCCB_COMPLETE)) { - currSCCB->HostStatus = SCCB_PARITY_ERR; - WRW_HARPOON((port + hp_intstat), PARITY); - } + currSCCB->Sccb_XferCnt = 0; - FPT_hostDataXferAbort(port, p_card, currSCCB); + if ((RDW_HARPOON((port+hp_intstat)) & PARITY) && + (currSCCB->HostStatus == SCCB_COMPLETE)) + { + currSCCB->HostStatus = SCCB_PARITY_ERR; + WRW_HARPOON((port+hp_intstat), PARITY); + } - FPT_dataXferProcessor(port, &FPT_BL_Card[p_card]); + FPT_hostDataXferAbort(port,p_card,currSCCB); - while ((!(RD_HARPOON(port + hp_xferstat) & FIFO_EMPTY)) - && (RD_HARPOON(port + hp_ext_status) & - BM_CMD_BUSY)) { - } + FPT_dataXferProcessor(port, &FPT_BL_Card[p_card]); - } - } + while((!(RD_HARPOON(port+hp_xferstat) & FIFO_EMPTY)) && + (RD_HARPOON(port+hp_ext_status) & BM_CMD_BUSY)) {} - /*End Data In specific code. */ - GET_XFER_CNT(port, xfercnt); + } + } /*End Data In specific code. */ - WR_HARPOON(port + hp_xfercnt_0, 0x00); - WR_HARPOON(port + hp_portctrl_0, 0x00); - currSCCB->Sccb_ATC += (currSCCB->Sccb_XferCnt - xfercnt); + GET_XFER_CNT(port,xfercnt); - currSCCB->Sccb_XferCnt = xfercnt; - if ((RDW_HARPOON((port + hp_intstat)) & PARITY) && - (currSCCB->HostStatus == SCCB_COMPLETE)) { + WR_HARPOON(port+hp_xfercnt_0, 0x00); - currSCCB->HostStatus = SCCB_PARITY_ERR; - WRW_HARPOON((port + hp_intstat), PARITY); - } - FPT_hostDataXferAbort(port, p_card, currSCCB); + WR_HARPOON(port+hp_portctrl_0, 0x00); + + currSCCB->Sccb_ATC += (currSCCB->Sccb_XferCnt - xfercnt); + + currSCCB->Sccb_XferCnt = xfercnt; + + if ((RDW_HARPOON((port+hp_intstat)) & PARITY) && + (currSCCB->HostStatus == SCCB_COMPLETE)) { + + currSCCB->HostStatus = SCCB_PARITY_ERR; + WRW_HARPOON((port+hp_intstat), PARITY); + } + - WR_HARPOON(port + hp_fifowrite, 0x00); - WR_HARPOON(port + hp_fiforead, 0x00); - WR_HARPOON(port + hp_xferstat, 0x00); + FPT_hostDataXferAbort(port,p_card,currSCCB); - WRW_HARPOON((port + hp_intstat), XFER_CNT_0); + + WR_HARPOON(port+hp_fifowrite, 0x00); + WR_HARPOON(port+hp_fiforead, 0x00); + WR_HARPOON(port+hp_xferstat, 0x00); + + WRW_HARPOON((port+hp_intstat), XFER_CNT_0); } + /*--------------------------------------------------------------------- * * Function: Phase Bus Free @@ -4464,94 +5104,96 @@ static void FPT_phaseChkFifo(unsigned long port, unsigned char p_card) * because of command complete or from a disconnect. * *---------------------------------------------------------------------*/ -static void FPT_phaseBusFree(unsigned long port, unsigned char p_card) +static void FPT_phaseBusFree(ULONG port, UCHAR p_card) { - struct sccb *currSCCB; - - currSCCB = FPT_BL_Card[p_card].currentSCCB; - - if (currSCCB != NULL) { - - DISABLE_AUTO(port); - - if (currSCCB->OperationCode == RESET_COMMAND) { - - if ((FPT_BL_Card[p_card].globalFlags & F_CONLUN_IO) && - ((FPT_sccbMgrTbl[p_card][currSCCB->TargID]. - TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING)) - FPT_sccbMgrTbl[p_card][currSCCB->TargID]. - TarLUNBusy[currSCCB->Lun] = 0; - else - FPT_sccbMgrTbl[p_card][currSCCB->TargID]. - TarLUNBusy[0] = 0; - - FPT_queueCmdComplete(&FPT_BL_Card[p_card], currSCCB, - p_card); + PSCCB currSCCB; - FPT_queueSearchSelect(&FPT_BL_Card[p_card], p_card); + currSCCB = FPT_BL_Card[p_card].currentSCCB; - } - - else if (currSCCB->Sccb_scsistat == SELECT_SN_ST) { - FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarStatus |= - (unsigned char)SYNC_SUPPORTED; - FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarEEValue &= - ~EE_SYNC_MASK; - } + if (currSCCB != NULL) + { - else if (currSCCB->Sccb_scsistat == SELECT_WN_ST) { - FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarStatus = - (FPT_sccbMgrTbl[p_card][currSCCB->TargID]. - TarStatus & ~WIDE_ENABLED) | WIDE_NEGOCIATED; + DISABLE_AUTO(port); - FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarEEValue &= - ~EE_WIDE_SCSI; - } - else if (currSCCB->Sccb_scsistat == SELECT_Q_ST) { - /* Make sure this is not a phony BUS_FREE. If we were - reselected or if BUSY is NOT on then this is a - valid BUS FREE. SRR Wednesday, 5/10/1995. */ - - if ((!(RD_HARPOON(port + hp_scsisig) & SCSI_BSY)) || - (RDW_HARPOON((port + hp_intstat)) & RSEL)) { - FPT_sccbMgrTbl[p_card][currSCCB->TargID]. - TarStatus &= ~TAR_TAG_Q_MASK; - FPT_sccbMgrTbl[p_card][currSCCB->TargID]. - TarStatus |= TAG_Q_REJECT; - } + if (currSCCB->OperationCode == RESET_COMMAND) + { - else { - return; - } - } + if((FPT_BL_Card[p_card].globalFlags & F_CONLUN_IO) && + ((FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING)) + FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[currSCCB->Lun] = 0; + else + FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[0] = 0; + + FPT_queueCmdComplete(&FPT_BL_Card[p_card], currSCCB, p_card); + + FPT_queueSearchSelect(&FPT_BL_Card[p_card],p_card); + + } + + else if(currSCCB->Sccb_scsistat == SELECT_SN_ST) + { + FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarStatus |= + (UCHAR)SYNC_SUPPORTED; + FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarEEValue &= ~EE_SYNC_MASK; + } + + else if(currSCCB->Sccb_scsistat == SELECT_WN_ST) + { + FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarStatus = + (FPT_sccbMgrTbl[p_card][currSCCB->TargID]. + TarStatus & ~WIDE_ENABLED) | WIDE_NEGOCIATED; + + FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarEEValue &= ~EE_WIDE_SCSI; + } + + else if(currSCCB->Sccb_scsistat == SELECT_Q_ST) + { + /* Make sure this is not a phony BUS_FREE. If we were + reselected or if BUSY is NOT on then this is a + valid BUS FREE. SRR Wednesday, 5/10/1995. */ + + if ((!(RD_HARPOON(port+hp_scsisig) & SCSI_BSY)) || + (RDW_HARPOON((port+hp_intstat)) & RSEL)) + { + FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarStatus &= ~TAR_TAG_Q_MASK; + FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarStatus |= TAG_Q_REJECT; + } + + else + { + return; + } + } + + else + { + + currSCCB->Sccb_scsistat = BUS_FREE_ST; + + if (!currSCCB->HostStatus) + { + currSCCB->HostStatus = SCCB_PHASE_SEQUENCE_FAIL; + } + + if((FPT_BL_Card[p_card].globalFlags & F_CONLUN_IO) && + ((FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING)) + FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[currSCCB->Lun] = 0; + else + FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[0] = 0; - else { + FPT_queueCmdComplete(&FPT_BL_Card[p_card], currSCCB, p_card); + return; + } - currSCCB->Sccb_scsistat = BUS_FREE_ST; - if (!currSCCB->HostStatus) { - currSCCB->HostStatus = SCCB_PHASE_SEQUENCE_FAIL; - } + FPT_BL_Card[p_card].globalFlags |= F_NEW_SCCB_CMD; - if ((FPT_BL_Card[p_card].globalFlags & F_CONLUN_IO) && - ((FPT_sccbMgrTbl[p_card][currSCCB->TargID]. - TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING)) - FPT_sccbMgrTbl[p_card][currSCCB->TargID]. - TarLUNBusy[currSCCB->Lun] = 0; - else - FPT_sccbMgrTbl[p_card][currSCCB->TargID]. - TarLUNBusy[0] = 0; + } /*end if !=null */ +} - FPT_queueCmdComplete(&FPT_BL_Card[p_card], currSCCB, - p_card); - return; - } - FPT_BL_Card[p_card].globalFlags |= F_NEW_SCCB_CMD; - } /*end if !=null */ -} /*--------------------------------------------------------------------- * @@ -4560,101 +5202,103 @@ static void FPT_phaseBusFree(unsigned long port, unsigned char p_card) * Description: Load the Automation RAM with the defualt map values. * *---------------------------------------------------------------------*/ -static void FPT_autoLoadDefaultMap(unsigned long p_port) +static void FPT_autoLoadDefaultMap(ULONG p_port) { - unsigned long map_addr; - - ARAM_ACCESS(p_port); - map_addr = p_port + hp_aramBase; - - WRW_HARPOON(map_addr, (MPM_OP + AMSG_OUT + 0xC0)); /*ID MESSAGE */ - map_addr += 2; - WRW_HARPOON(map_addr, (MPM_OP + AMSG_OUT + 0x20)); /*SIMPLE TAG QUEUEING MSG */ - map_addr += 2; - WRW_HARPOON(map_addr, RAT_OP); /*RESET ATTENTION */ - map_addr += 2; - WRW_HARPOON(map_addr, (MPM_OP + AMSG_OUT + 0x00)); /*TAG ID MSG */ - map_addr += 2; - WRW_HARPOON(map_addr, (MPM_OP + ACOMMAND + 0x00)); /*CDB BYTE 0 */ - map_addr += 2; - WRW_HARPOON(map_addr, (MPM_OP + ACOMMAND + 0x00)); /*CDB BYTE 1 */ - map_addr += 2; - WRW_HARPOON(map_addr, (MPM_OP + ACOMMAND + 0x00)); /*CDB BYTE 2 */ - map_addr += 2; - WRW_HARPOON(map_addr, (MPM_OP + ACOMMAND + 0x00)); /*CDB BYTE 3 */ - map_addr += 2; - WRW_HARPOON(map_addr, (MPM_OP + ACOMMAND + 0x00)); /*CDB BYTE 4 */ - map_addr += 2; - WRW_HARPOON(map_addr, (MPM_OP + ACOMMAND + 0x00)); /*CDB BYTE 5 */ - map_addr += 2; - WRW_HARPOON(map_addr, (MPM_OP + ACOMMAND + 0x00)); /*CDB BYTE 6 */ - map_addr += 2; - WRW_HARPOON(map_addr, (MPM_OP + ACOMMAND + 0x00)); /*CDB BYTE 7 */ - map_addr += 2; - WRW_HARPOON(map_addr, (MPM_OP + ACOMMAND + 0x00)); /*CDB BYTE 8 */ - map_addr += 2; - WRW_HARPOON(map_addr, (MPM_OP + ACOMMAND + 0x00)); /*CDB BYTE 9 */ - map_addr += 2; - WRW_HARPOON(map_addr, (MPM_OP + ACOMMAND + 0x00)); /*CDB BYTE 10 */ - map_addr += 2; - WRW_HARPOON(map_addr, (MPM_OP + ACOMMAND + 0x00)); /*CDB BYTE 11 */ - map_addr += 2; - WRW_HARPOON(map_addr, (CPE_OP + ADATA_OUT + DINT)); /*JUMP IF DATA OUT */ - map_addr += 2; - WRW_HARPOON(map_addr, (TCB_OP + FIFO_0 + DI)); /*JUMP IF NO DATA IN FIFO */ - map_addr += 2; /*This means AYNC DATA IN */ - WRW_HARPOON(map_addr, (SSI_OP + SSI_IDO_STRT)); /*STOP AND INTERRUPT */ - map_addr += 2; - WRW_HARPOON(map_addr, (CPE_OP + ADATA_IN + DINT)); /*JUMP IF NOT DATA IN PHZ */ - map_addr += 2; - WRW_HARPOON(map_addr, (CPN_OP + AMSG_IN + ST)); /*IF NOT MSG IN CHECK 4 DATA IN */ - map_addr += 2; - WRW_HARPOON(map_addr, (CRD_OP + SDATA + 0x02)); /*SAVE DATA PTR MSG? */ - map_addr += 2; - WRW_HARPOON(map_addr, (BRH_OP + NOT_EQ + DC)); /*GO CHECK FOR DISCONNECT MSG */ - map_addr += 2; - WRW_HARPOON(map_addr, (MRR_OP + SDATA + D_AR1)); /*SAVE DATA PTRS MSG */ - map_addr += 2; - WRW_HARPOON(map_addr, (CPN_OP + AMSG_IN + ST)); /*IF NOT MSG IN CHECK DATA IN */ - map_addr += 2; - WRW_HARPOON(map_addr, (CRD_OP + SDATA + 0x04)); /*DISCONNECT MSG? */ - map_addr += 2; - WRW_HARPOON(map_addr, (BRH_OP + NOT_EQ + UNKNWN)); /*UKNKNOWN MSG */ - map_addr += 2; - WRW_HARPOON(map_addr, (MRR_OP + SDATA + D_BUCKET)); /*XFER DISCONNECT MSG */ - map_addr += 2; - WRW_HARPOON(map_addr, (SSI_OP + SSI_ITAR_DISC)); /*STOP AND INTERRUPT */ - map_addr += 2; - WRW_HARPOON(map_addr, (CPN_OP + ASTATUS + UNKNWN)); /*JUMP IF NOT STATUS PHZ. */ - map_addr += 2; - WRW_HARPOON(map_addr, (MRR_OP + SDATA + D_AR0)); /*GET STATUS BYTE */ - map_addr += 2; - WRW_HARPOON(map_addr, (CPN_OP + AMSG_IN + CC)); /*ERROR IF NOT MSG IN PHZ */ - map_addr += 2; - WRW_HARPOON(map_addr, (CRD_OP + SDATA + 0x00)); /*CHECK FOR CMD COMPLETE MSG. */ - map_addr += 2; - WRW_HARPOON(map_addr, (BRH_OP + NOT_EQ + CC)); /*ERROR IF NOT CMD COMPLETE MSG. */ - map_addr += 2; - WRW_HARPOON(map_addr, (MRR_OP + SDATA + D_BUCKET)); /*GET CMD COMPLETE MSG */ - map_addr += 2; - WRW_HARPOON(map_addr, (SSI_OP + SSI_ICMD_COMP)); /*END OF COMMAND */ - map_addr += 2; - - WRW_HARPOON(map_addr, (SSI_OP + SSI_IUNKWN)); /*RECEIVED UNKNOWN MSG BYTE */ - map_addr += 2; - WRW_HARPOON(map_addr, (SSI_OP + SSI_INO_CC)); /*NO COMMAND COMPLETE AFTER STATUS */ - map_addr += 2; - WRW_HARPOON(map_addr, (SSI_OP + SSI_ITICKLE)); /*BIOS Tickled the Mgr */ - map_addr += 2; - WRW_HARPOON(map_addr, (SSI_OP + SSI_IRFAIL)); /*EXPECTED ID/TAG MESSAGES AND */ - map_addr += 2; /* DIDN'T GET ONE */ - WRW_HARPOON(map_addr, (CRR_OP + AR3 + S_IDREG)); /* comp SCSI SEL ID & AR3 */ - map_addr += 2; - WRW_HARPOON(map_addr, (BRH_OP + EQUAL + 0x00)); /*SEL ID OK then Conti. */ - map_addr += 2; - WRW_HARPOON(map_addr, (SSI_OP + SSI_INO_CC)); /*NO COMMAND COMPLETE AFTER STATUS */ - - SGRAM_ACCESS(p_port); + ULONG map_addr; + + ARAM_ACCESS(p_port); + map_addr = p_port + hp_aramBase; + + WRW_HARPOON(map_addr, (MPM_OP+AMSG_OUT+ 0xC0)); /*ID MESSAGE */ + map_addr +=2; + WRW_HARPOON(map_addr, (MPM_OP+AMSG_OUT+ 0x20)); /*SIMPLE TAG QUEUEING MSG */ + map_addr +=2; + WRW_HARPOON(map_addr, RAT_OP); /*RESET ATTENTION */ + map_addr +=2; + WRW_HARPOON(map_addr, (MPM_OP+AMSG_OUT+ 0x00)); /*TAG ID MSG */ + map_addr +=2; + WRW_HARPOON(map_addr, (MPM_OP+ACOMMAND+ 0x00)); /*CDB BYTE 0 */ + map_addr +=2; + WRW_HARPOON(map_addr, (MPM_OP+ACOMMAND+ 0x00)); /*CDB BYTE 1 */ + map_addr +=2; + WRW_HARPOON(map_addr, (MPM_OP+ACOMMAND+ 0x00)); /*CDB BYTE 2 */ + map_addr +=2; + WRW_HARPOON(map_addr, (MPM_OP+ACOMMAND+ 0x00)); /*CDB BYTE 3 */ + map_addr +=2; + WRW_HARPOON(map_addr, (MPM_OP+ACOMMAND+ 0x00)); /*CDB BYTE 4 */ + map_addr +=2; + WRW_HARPOON(map_addr, (MPM_OP+ACOMMAND+ 0x00)); /*CDB BYTE 5 */ + map_addr +=2; + WRW_HARPOON(map_addr, (MPM_OP+ACOMMAND+ 0x00)); /*CDB BYTE 6 */ + map_addr +=2; + WRW_HARPOON(map_addr, (MPM_OP+ACOMMAND+ 0x00)); /*CDB BYTE 7 */ + map_addr +=2; + WRW_HARPOON(map_addr, (MPM_OP+ACOMMAND+ 0x00)); /*CDB BYTE 8 */ + map_addr +=2; + WRW_HARPOON(map_addr, (MPM_OP+ACOMMAND+ 0x00)); /*CDB BYTE 9 */ + map_addr +=2; + WRW_HARPOON(map_addr, (MPM_OP+ACOMMAND+ 0x00)); /*CDB BYTE 10 */ + map_addr +=2; + WRW_HARPOON(map_addr, (MPM_OP+ACOMMAND+ 0x00)); /*CDB BYTE 11 */ + map_addr +=2; + WRW_HARPOON(map_addr, (CPE_OP+ADATA_OUT+ DINT)); /*JUMP IF DATA OUT */ + map_addr +=2; + WRW_HARPOON(map_addr, (TCB_OP+FIFO_0+ DI)); /*JUMP IF NO DATA IN FIFO */ + map_addr +=2; /*This means AYNC DATA IN */ + WRW_HARPOON(map_addr, (SSI_OP+ SSI_IDO_STRT)); /*STOP AND INTERRUPT */ + map_addr +=2; + WRW_HARPOON(map_addr, (CPE_OP+ADATA_IN+DINT)); /*JUMP IF NOT DATA IN PHZ */ + map_addr +=2; + WRW_HARPOON(map_addr, (CPN_OP+AMSG_IN+ ST)); /*IF NOT MSG IN CHECK 4 DATA IN */ + map_addr +=2; + WRW_HARPOON(map_addr, (CRD_OP+SDATA+ 0x02)); /*SAVE DATA PTR MSG? */ + map_addr +=2; + WRW_HARPOON(map_addr, (BRH_OP+NOT_EQ+ DC)); /*GO CHECK FOR DISCONNECT MSG */ + map_addr +=2; + WRW_HARPOON(map_addr, (MRR_OP+SDATA+ D_AR1)); /*SAVE DATA PTRS MSG */ + map_addr +=2; + WRW_HARPOON(map_addr, (CPN_OP+AMSG_IN+ ST)); /*IF NOT MSG IN CHECK DATA IN */ + map_addr +=2; + WRW_HARPOON(map_addr, (CRD_OP+SDATA+ 0x04)); /*DISCONNECT MSG? */ + map_addr +=2; + WRW_HARPOON(map_addr, (BRH_OP+NOT_EQ+ UNKNWN));/*UKNKNOWN MSG */ + map_addr +=2; + WRW_HARPOON(map_addr, (MRR_OP+SDATA+ D_BUCKET));/*XFER DISCONNECT MSG */ + map_addr +=2; + WRW_HARPOON(map_addr, (SSI_OP+ SSI_ITAR_DISC));/*STOP AND INTERRUPT */ + map_addr +=2; + WRW_HARPOON(map_addr, (CPN_OP+ASTATUS+ UNKNWN));/*JUMP IF NOT STATUS PHZ. */ + map_addr +=2; + WRW_HARPOON(map_addr, (MRR_OP+SDATA+ D_AR0)); /*GET STATUS BYTE */ + map_addr +=2; + WRW_HARPOON(map_addr, (CPN_OP+AMSG_IN+ CC)); /*ERROR IF NOT MSG IN PHZ */ + map_addr +=2; + WRW_HARPOON(map_addr, (CRD_OP+SDATA+ 0x00)); /*CHECK FOR CMD COMPLETE MSG. */ + map_addr +=2; + WRW_HARPOON(map_addr, (BRH_OP+NOT_EQ+ CC)); /*ERROR IF NOT CMD COMPLETE MSG. */ + map_addr +=2; + WRW_HARPOON(map_addr, (MRR_OP+SDATA+ D_BUCKET));/*GET CMD COMPLETE MSG */ + map_addr +=2; + WRW_HARPOON(map_addr, (SSI_OP+ SSI_ICMD_COMP));/*END OF COMMAND */ + map_addr +=2; + + WRW_HARPOON(map_addr, (SSI_OP+ SSI_IUNKWN)); /*RECEIVED UNKNOWN MSG BYTE */ + map_addr +=2; + WRW_HARPOON(map_addr, (SSI_OP+ SSI_INO_CC)); /*NO COMMAND COMPLETE AFTER STATUS */ + map_addr +=2; + WRW_HARPOON(map_addr, (SSI_OP+ SSI_ITICKLE)); /*BIOS Tickled the Mgr */ + map_addr +=2; + WRW_HARPOON(map_addr, (SSI_OP+ SSI_IRFAIL)); /*EXPECTED ID/TAG MESSAGES AND */ + map_addr +=2; /* DIDN'T GET ONE */ + WRW_HARPOON(map_addr, (CRR_OP+AR3+ S_IDREG)); /* comp SCSI SEL ID & AR3*/ + map_addr +=2; + WRW_HARPOON(map_addr, (BRH_OP+EQUAL+ 0x00)); /*SEL ID OK then Conti. */ + map_addr +=2; + WRW_HARPOON(map_addr, (SSI_OP+ SSI_INO_CC)); /*NO COMMAND COMPLETE AFTER STATUS */ + + + + SGRAM_ACCESS(p_port); } /*--------------------------------------------------------------------- @@ -4666,261 +5310,203 @@ static void FPT_autoLoadDefaultMap(unsigned long p_port) * *---------------------------------------------------------------------*/ -static void FPT_autoCmdCmplt(unsigned long p_port, unsigned char p_card) +static void FPT_autoCmdCmplt(ULONG p_port, UCHAR p_card) { - struct sccb *currSCCB; - unsigned char status_byte; + PSCCB currSCCB; + UCHAR status_byte; - currSCCB = FPT_BL_Card[p_card].currentSCCB; + currSCCB = FPT_BL_Card[p_card].currentSCCB; - status_byte = RD_HARPOON(p_port + hp_gp_reg_0); + status_byte = RD_HARPOON(p_port+hp_gp_reg_0); - FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarLUN_CA = 0; + FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarLUN_CA = 0; - if (status_byte != SSGOOD) { + if (status_byte != SSGOOD) { - if (status_byte == SSQ_FULL) { + if (status_byte == SSQ_FULL) { - if (((FPT_BL_Card[p_card].globalFlags & F_CONLUN_IO) && - ((FPT_sccbMgrTbl[p_card][currSCCB->TargID]. - TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))) { - FPT_sccbMgrTbl[p_card][currSCCB->TargID]. - TarLUNBusy[currSCCB->Lun] = 1; - if (FPT_BL_Card[p_card].discQCount != 0) + + if(((FPT_BL_Card[p_card].globalFlags & F_CONLUN_IO) && + ((FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))) + { + FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[currSCCB->Lun] = 1; + if(FPT_BL_Card[p_card].discQCount != 0) FPT_BL_Card[p_card].discQCount--; - FPT_BL_Card[p_card]. - discQ_Tbl[FPT_sccbMgrTbl[p_card] - [currSCCB->TargID]. - LunDiscQ_Idx[currSCCB->Lun]] = - NULL; - } else { - FPT_sccbMgrTbl[p_card][currSCCB->TargID]. - TarLUNBusy[0] = 1; - if (currSCCB->Sccb_tag) { - if (FPT_BL_Card[p_card].discQCount != 0) - FPT_BL_Card[p_card]. - discQCount--; - FPT_BL_Card[p_card].discQ_Tbl[currSCCB-> - Sccb_tag] - = NULL; - } else { - if (FPT_BL_Card[p_card].discQCount != 0) - FPT_BL_Card[p_card]. - discQCount--; - FPT_BL_Card[p_card]. - discQ_Tbl[FPT_sccbMgrTbl[p_card] - [currSCCB->TargID]. - LunDiscQ_Idx[0]] = NULL; + FPT_BL_Card[p_card].discQ_Tbl[FPT_sccbMgrTbl[p_card][currSCCB->TargID].LunDiscQ_Idx[currSCCB->Lun]] = NULL; + } + else + { + FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[0] = 1; + if(currSCCB->Sccb_tag) + { + if(FPT_BL_Card[p_card].discQCount != 0) + FPT_BL_Card[p_card].discQCount--; + FPT_BL_Card[p_card].discQ_Tbl[currSCCB->Sccb_tag] = NULL; + }else + { + if(FPT_BL_Card[p_card].discQCount != 0) + FPT_BL_Card[p_card].discQCount--; + FPT_BL_Card[p_card].discQ_Tbl[FPT_sccbMgrTbl[p_card][currSCCB->TargID].LunDiscQ_Idx[0]] = NULL; } } - currSCCB->Sccb_MGRFlags |= F_STATUSLOADED; + currSCCB->Sccb_MGRFlags |= F_STATUSLOADED; - FPT_queueSelectFail(&FPT_BL_Card[p_card], p_card); + FPT_queueSelectFail(&FPT_BL_Card[p_card],p_card); - return; - } + return; + } - if (currSCCB->Sccb_scsistat == SELECT_SN_ST) { - FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarStatus |= - (unsigned char)SYNC_SUPPORTED; + if(currSCCB->Sccb_scsistat == SELECT_SN_ST) + { + FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarStatus |= + (UCHAR)SYNC_SUPPORTED; - FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarEEValue &= - ~EE_SYNC_MASK; - FPT_BL_Card[p_card].globalFlags |= F_NEW_SCCB_CMD; + FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarEEValue &= ~EE_SYNC_MASK; + FPT_BL_Card[p_card].globalFlags |= F_NEW_SCCB_CMD; - if (((FPT_BL_Card[p_card].globalFlags & F_CONLUN_IO) && - ((FPT_sccbMgrTbl[p_card][currSCCB->TargID]. - TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))) { - FPT_sccbMgrTbl[p_card][currSCCB->TargID]. - TarLUNBusy[currSCCB->Lun] = 1; - if (FPT_BL_Card[p_card].discQCount != 0) + if(((FPT_BL_Card[p_card].globalFlags & F_CONLUN_IO) && + ((FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))) + { + FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[currSCCB->Lun] = 1; + if(FPT_BL_Card[p_card].discQCount != 0) FPT_BL_Card[p_card].discQCount--; - FPT_BL_Card[p_card]. - discQ_Tbl[FPT_sccbMgrTbl[p_card] - [currSCCB->TargID]. - LunDiscQ_Idx[currSCCB->Lun]] = - NULL; - } else { - FPT_sccbMgrTbl[p_card][currSCCB->TargID]. - TarLUNBusy[0] = 1; - if (currSCCB->Sccb_tag) { - if (FPT_BL_Card[p_card].discQCount != 0) - FPT_BL_Card[p_card]. - discQCount--; - FPT_BL_Card[p_card].discQ_Tbl[currSCCB-> - Sccb_tag] - = NULL; - } else { - if (FPT_BL_Card[p_card].discQCount != 0) - FPT_BL_Card[p_card]. - discQCount--; - FPT_BL_Card[p_card]. - discQ_Tbl[FPT_sccbMgrTbl[p_card] - [currSCCB->TargID]. - LunDiscQ_Idx[0]] = NULL; + FPT_BL_Card[p_card].discQ_Tbl[FPT_sccbMgrTbl[p_card][currSCCB->TargID].LunDiscQ_Idx[currSCCB->Lun]] = NULL; + } + else + { + FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[0] = 1; + if(currSCCB->Sccb_tag) + { + if(FPT_BL_Card[p_card].discQCount != 0) + FPT_BL_Card[p_card].discQCount--; + FPT_BL_Card[p_card].discQ_Tbl[currSCCB->Sccb_tag] = NULL; + }else + { + if(FPT_BL_Card[p_card].discQCount != 0) + FPT_BL_Card[p_card].discQCount--; + FPT_BL_Card[p_card].discQ_Tbl[FPT_sccbMgrTbl[p_card][currSCCB->TargID].LunDiscQ_Idx[0]] = NULL; } } - return; + return; - } + } - if (currSCCB->Sccb_scsistat == SELECT_WN_ST) { + if(currSCCB->Sccb_scsistat == SELECT_WN_ST) + { - FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarStatus = - (FPT_sccbMgrTbl[p_card][currSCCB->TargID]. - TarStatus & ~WIDE_ENABLED) | WIDE_NEGOCIATED; + FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarStatus = + (FPT_sccbMgrTbl[p_card][currSCCB->TargID]. + TarStatus & ~WIDE_ENABLED) | WIDE_NEGOCIATED; - FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarEEValue &= - ~EE_WIDE_SCSI; - FPT_BL_Card[p_card].globalFlags |= F_NEW_SCCB_CMD; + FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarEEValue &= ~EE_WIDE_SCSI; + FPT_BL_Card[p_card].globalFlags |= F_NEW_SCCB_CMD; - if (((FPT_BL_Card[p_card].globalFlags & F_CONLUN_IO) && - ((FPT_sccbMgrTbl[p_card][currSCCB->TargID]. - TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))) { - FPT_sccbMgrTbl[p_card][currSCCB->TargID]. - TarLUNBusy[currSCCB->Lun] = 1; - if (FPT_BL_Card[p_card].discQCount != 0) + if(((FPT_BL_Card[p_card].globalFlags & F_CONLUN_IO) && + ((FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))) + { + FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[currSCCB->Lun] = 1; + if(FPT_BL_Card[p_card].discQCount != 0) FPT_BL_Card[p_card].discQCount--; - FPT_BL_Card[p_card]. - discQ_Tbl[FPT_sccbMgrTbl[p_card] - [currSCCB->TargID]. - LunDiscQ_Idx[currSCCB->Lun]] = - NULL; - } else { - FPT_sccbMgrTbl[p_card][currSCCB->TargID]. - TarLUNBusy[0] = 1; - if (currSCCB->Sccb_tag) { - if (FPT_BL_Card[p_card].discQCount != 0) - FPT_BL_Card[p_card]. - discQCount--; - FPT_BL_Card[p_card].discQ_Tbl[currSCCB-> - Sccb_tag] - = NULL; - } else { - if (FPT_BL_Card[p_card].discQCount != 0) - FPT_BL_Card[p_card]. - discQCount--; - FPT_BL_Card[p_card]. - discQ_Tbl[FPT_sccbMgrTbl[p_card] - [currSCCB->TargID]. - LunDiscQ_Idx[0]] = NULL; + FPT_BL_Card[p_card].discQ_Tbl[FPT_sccbMgrTbl[p_card][currSCCB->TargID].LunDiscQ_Idx[currSCCB->Lun]] = NULL; + } + else + { + FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[0] = 1; + if(currSCCB->Sccb_tag) + { + if(FPT_BL_Card[p_card].discQCount != 0) + FPT_BL_Card[p_card].discQCount--; + FPT_BL_Card[p_card].discQ_Tbl[currSCCB->Sccb_tag] = NULL; + }else + { + if(FPT_BL_Card[p_card].discQCount != 0) + FPT_BL_Card[p_card].discQCount--; + FPT_BL_Card[p_card].discQ_Tbl[FPT_sccbMgrTbl[p_card][currSCCB->TargID].LunDiscQ_Idx[0]] = NULL; } } - return; - - } - - if (status_byte == SSCHECK) { - if (FPT_BL_Card[p_card].globalFlags & F_DO_RENEGO) { - if (FPT_sccbMgrTbl[p_card][currSCCB->TargID]. - TarEEValue & EE_SYNC_MASK) { - FPT_sccbMgrTbl[p_card][currSCCB-> - TargID]. - TarStatus &= ~TAR_SYNC_MASK; + return; + + } + + if (status_byte == SSCHECK) + { + if(FPT_BL_Card[p_card].globalFlags & F_DO_RENEGO) + { + if (FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarEEValue & EE_SYNC_MASK) + { + FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarStatus &= ~TAR_SYNC_MASK; } - if (FPT_sccbMgrTbl[p_card][currSCCB->TargID]. - TarEEValue & EE_WIDE_SCSI) { - FPT_sccbMgrTbl[p_card][currSCCB-> - TargID]. - TarStatus &= ~TAR_WIDE_MASK; + if (FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarEEValue & EE_WIDE_SCSI) + { + FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarStatus &= ~TAR_WIDE_MASK; } } } - if (!(currSCCB->Sccb_XferState & F_AUTO_SENSE)) { - - currSCCB->SccbStatus = SCCB_ERROR; - currSCCB->TargetStatus = status_byte; - - if (status_byte == SSCHECK) { - - FPT_sccbMgrTbl[p_card][currSCCB->TargID]. - TarLUN_CA = 1; - - if (currSCCB->RequestSenseLength != - NO_AUTO_REQUEST_SENSE) { - - if (currSCCB->RequestSenseLength == 0) - currSCCB->RequestSenseLength = - 14; - - FPT_ssenss(&FPT_BL_Card[p_card]); - FPT_BL_Card[p_card].globalFlags |= - F_NEW_SCCB_CMD; - - if (((FPT_BL_Card[p_card]. - globalFlags & F_CONLUN_IO) - && - ((FPT_sccbMgrTbl[p_card] - [currSCCB->TargID]. - TarStatus & TAR_TAG_Q_MASK) != - TAG_Q_TRYING))) { - FPT_sccbMgrTbl[p_card] - [currSCCB->TargID]. - TarLUNBusy[currSCCB->Lun] = - 1; - if (FPT_BL_Card[p_card]. - discQCount != 0) - FPT_BL_Card[p_card]. - discQCount--; - FPT_BL_Card[p_card]. - discQ_Tbl[FPT_sccbMgrTbl - [p_card] - [currSCCB-> - TargID]. - LunDiscQ_Idx - [currSCCB->Lun]] = - NULL; - } else { - FPT_sccbMgrTbl[p_card] - [currSCCB->TargID]. - TarLUNBusy[0] = 1; - if (currSCCB->Sccb_tag) { - if (FPT_BL_Card[p_card]. - discQCount != 0) - FPT_BL_Card - [p_card]. - discQCount--; - FPT_BL_Card[p_card]. - discQ_Tbl[currSCCB-> - Sccb_tag] - = NULL; - } else { - if (FPT_BL_Card[p_card]. - discQCount != 0) - FPT_BL_Card - [p_card]. - discQCount--; - FPT_BL_Card[p_card]. - discQ_Tbl - [FPT_sccbMgrTbl - [p_card][currSCCB-> - TargID]. - LunDiscQ_Idx[0]] = - NULL; + if (!(currSCCB->Sccb_XferState & F_AUTO_SENSE)) { + + currSCCB->SccbStatus = SCCB_ERROR; + currSCCB->TargetStatus = status_byte; + + if (status_byte == SSCHECK) { + + FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarLUN_CA + = 1; + + + if (currSCCB->RequestSenseLength != NO_AUTO_REQUEST_SENSE) { + + if (currSCCB->RequestSenseLength == 0) + currSCCB->RequestSenseLength = 14; + + FPT_ssenss(&FPT_BL_Card[p_card]); + FPT_BL_Card[p_card].globalFlags |= F_NEW_SCCB_CMD; + + if(((FPT_BL_Card[p_card].globalFlags & F_CONLUN_IO) && + ((FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))) + { + FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[currSCCB->Lun] = 1; + if(FPT_BL_Card[p_card].discQCount != 0) + FPT_BL_Card[p_card].discQCount--; + FPT_BL_Card[p_card].discQ_Tbl[FPT_sccbMgrTbl[p_card][currSCCB->TargID].LunDiscQ_Idx[currSCCB->Lun]] = NULL; + } + else + { + FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[0] = 1; + if(currSCCB->Sccb_tag) + { + if(FPT_BL_Card[p_card].discQCount != 0) + FPT_BL_Card[p_card].discQCount--; + FPT_BL_Card[p_card].discQ_Tbl[currSCCB->Sccb_tag] = NULL; + }else + { + if(FPT_BL_Card[p_card].discQCount != 0) + FPT_BL_Card[p_card].discQCount--; + FPT_BL_Card[p_card].discQ_Tbl[FPT_sccbMgrTbl[p_card][currSCCB->TargID].LunDiscQ_Idx[0]] = NULL; } } - return; - } - } - } - } + return; + } + } + } + } + - if ((FPT_BL_Card[p_card].globalFlags & F_CONLUN_IO) && - ((FPT_sccbMgrTbl[p_card][currSCCB->TargID]. - TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING)) - FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[currSCCB-> - Lun] = 0; + if((FPT_BL_Card[p_card].globalFlags & F_CONLUN_IO) && + ((FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING)) + FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[currSCCB->Lun] = 0; else - FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[0] = 0; + FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[0] = 0; + - FPT_queueCmdComplete(&FPT_BL_Card[p_card], currSCCB, p_card); + FPT_queueCmdComplete(&FPT_BL_Card[p_card], currSCCB, p_card); } #define SHORT_WAIT 0x0000000F #define LONG_WAIT 0x0000FFFFL + /*--------------------------------------------------------------------- * * Function: Data Transfer Processor @@ -4939,33 +5525,37 @@ static void FPT_autoCmdCmplt(unsigned long p_port, unsigned char p_card) * *---------------------------------------------------------------------*/ -static void FPT_dataXferProcessor(unsigned long port, - struct sccb_card *pCurrCard) +static void FPT_dataXferProcessor(ULONG port, PSCCBcard pCurrCard) { - struct sccb *currSCCB; - - currSCCB = pCurrCard->currentSCCB; + PSCCB currSCCB; - if (currSCCB->Sccb_XferState & F_SG_XFER) { - if (pCurrCard->globalFlags & F_HOST_XFER_ACT) - { - currSCCB->Sccb_sgseg += (unsigned char)SG_BUF_CNT; - currSCCB->Sccb_SGoffset = 0x00; - } - pCurrCard->globalFlags |= F_HOST_XFER_ACT; + currSCCB = pCurrCard->currentSCCB; - FPT_busMstrSGDataXferStart(port, currSCCB); - } + if (currSCCB->Sccb_XferState & F_SG_XFER) + { + if (pCurrCard->globalFlags & F_HOST_XFER_ACT) - else { - if (!(pCurrCard->globalFlags & F_HOST_XFER_ACT)) { + { + currSCCB->Sccb_sgseg += (UCHAR)SG_BUF_CNT; + currSCCB->Sccb_SGoffset = 0x00; + } pCurrCard->globalFlags |= F_HOST_XFER_ACT; + + FPT_busMstrSGDataXferStart(port, currSCCB); + } - FPT_busMstrDataXferStart(port, currSCCB); - } - } + else + { + if (!(pCurrCard->globalFlags & F_HOST_XFER_ACT)) + { + pCurrCard->globalFlags |= F_HOST_XFER_ACT; + + FPT_busMstrDataXferStart(port, currSCCB); + } + } } + /*--------------------------------------------------------------------- * * Function: BusMaster Scatter Gather Data Transfer Start @@ -4973,101 +5563,104 @@ static void FPT_dataXferProcessor(unsigned long port, * Description: * *---------------------------------------------------------------------*/ -static void FPT_busMstrSGDataXferStart(unsigned long p_port, - struct sccb *pcurrSCCB) +static void FPT_busMstrSGDataXferStart(ULONG p_port, PSCCB pcurrSCCB) { - unsigned long count, addr, tmpSGCnt; - unsigned int sg_index; - unsigned char sg_count, i; - unsigned long reg_offset; + ULONG count,addr,tmpSGCnt; + UINT sg_index; + UCHAR sg_count, i; + ULONG reg_offset; - if (pcurrSCCB->Sccb_XferState & F_HOST_XFER_DIR) { - count = ((unsigned long)HOST_RD_CMD) << 24; - } + if (pcurrSCCB->Sccb_XferState & F_HOST_XFER_DIR) { - else { - count = ((unsigned long)HOST_WRT_CMD) << 24; - } + count = ((ULONG) HOST_RD_CMD)<<24; + } - sg_count = 0; - tmpSGCnt = 0; - sg_index = pcurrSCCB->Sccb_sgseg; - reg_offset = hp_aramBase; + else { + count = ((ULONG) HOST_WRT_CMD)<<24; + } - i = (unsigned char)(RD_HARPOON(p_port + hp_page_ctrl) & - ~(SGRAM_ARAM | SCATTER_EN)); + sg_count = 0; + tmpSGCnt = 0; + sg_index = pcurrSCCB->Sccb_sgseg; + reg_offset = hp_aramBase; - WR_HARPOON(p_port + hp_page_ctrl, i); - while ((sg_count < (unsigned char)SG_BUF_CNT) && - ((unsigned long)(sg_index * (unsigned int)SG_ELEMENT_SIZE) < - pcurrSCCB->DataLength)) { + i = (UCHAR) (RD_HARPOON(p_port+hp_page_ctrl) & ~(SGRAM_ARAM|SCATTER_EN)); - tmpSGCnt += *(((unsigned long *)pcurrSCCB->DataPointer) + - (sg_index * 2)); - count |= *(((unsigned long *)pcurrSCCB->DataPointer) + - (sg_index * 2)); + WR_HARPOON(p_port+hp_page_ctrl, i); - addr = *(((unsigned long *)pcurrSCCB->DataPointer) + - ((sg_index * 2) + 1)); + while ((sg_count < (UCHAR)SG_BUF_CNT) && + ((ULONG)(sg_index * (UINT)SG_ELEMENT_SIZE) < pcurrSCCB->DataLength) ) { - if ((!sg_count) && (pcurrSCCB->Sccb_SGoffset)) { + tmpSGCnt += *(((ULONG *)pcurrSCCB->DataPointer)+ + (sg_index * 2)); - addr += - ((count & 0x00FFFFFFL) - pcurrSCCB->Sccb_SGoffset); - count = - (count & 0xFF000000L) | pcurrSCCB->Sccb_SGoffset; + count |= *(((ULONG *)pcurrSCCB->DataPointer)+ + (sg_index * 2)); - tmpSGCnt = count & 0x00FFFFFFL; - } + addr = *(((ULONG *)pcurrSCCB->DataPointer)+ + ((sg_index * 2) + 1)); - WR_HARP32(p_port, reg_offset, addr); - reg_offset += 4; - WR_HARP32(p_port, reg_offset, count); - reg_offset += 4; + if ((!sg_count) && (pcurrSCCB->Sccb_SGoffset)) { - count &= 0xFF000000L; - sg_index++; - sg_count++; + addr += ((count & 0x00FFFFFFL) - pcurrSCCB->Sccb_SGoffset); + count = (count & 0xFF000000L) | pcurrSCCB->Sccb_SGoffset; - } /*End While */ + tmpSGCnt = count & 0x00FFFFFFL; + } - pcurrSCCB->Sccb_XferCnt = tmpSGCnt; + WR_HARP32(p_port,reg_offset,addr); + reg_offset +=4; - WR_HARPOON(p_port + hp_sg_addr, (sg_count << 4)); + WR_HARP32(p_port,reg_offset,count); + reg_offset +=4; - if (pcurrSCCB->Sccb_XferState & F_HOST_XFER_DIR) { + count &= 0xFF000000L; + sg_index++; + sg_count++; - WR_HARP32(p_port, hp_xfercnt_0, tmpSGCnt); + } /*End While */ - WR_HARPOON(p_port + hp_portctrl_0, - (DMA_PORT | SCSI_PORT | SCSI_INBIT)); - WR_HARPOON(p_port + hp_scsisig, S_DATAI_PH); - } + pcurrSCCB->Sccb_XferCnt = tmpSGCnt; - else { + WR_HARPOON(p_port+hp_sg_addr,(sg_count<<4)); - if ((!(RD_HARPOON(p_port + hp_synctarg_0) & NARROW_SCSI)) && - (tmpSGCnt & 0x000000001)) { + if (pcurrSCCB->Sccb_XferState & F_HOST_XFER_DIR) { - pcurrSCCB->Sccb_XferState |= F_ODD_BALL_CNT; - tmpSGCnt--; - } + WR_HARP32(p_port,hp_xfercnt_0,tmpSGCnt); - WR_HARP32(p_port, hp_xfercnt_0, tmpSGCnt); - WR_HARPOON(p_port + hp_portctrl_0, - (SCSI_PORT | DMA_PORT | DMA_RD)); - WR_HARPOON(p_port + hp_scsisig, S_DATAO_PH); - } + WR_HARPOON(p_port+hp_portctrl_0,(DMA_PORT | SCSI_PORT | SCSI_INBIT)); + WR_HARPOON(p_port+hp_scsisig, S_DATAI_PH); + } + + else { + + + if ((!(RD_HARPOON(p_port+hp_synctarg_0) & NARROW_SCSI)) && + (tmpSGCnt & 0x000000001)) + { + + pcurrSCCB->Sccb_XferState |= F_ODD_BALL_CNT; + tmpSGCnt--; + } + - WR_HARPOON(p_port + hp_page_ctrl, (unsigned char)(i | SCATTER_EN)); + WR_HARP32(p_port,hp_xfercnt_0,tmpSGCnt); + + WR_HARPOON(p_port+hp_portctrl_0,(SCSI_PORT | DMA_PORT | DMA_RD)); + WR_HARPOON(p_port+hp_scsisig, S_DATAO_PH); + } + + + WR_HARPOON(p_port+hp_page_ctrl, (UCHAR) (i | SCATTER_EN)); } + /*--------------------------------------------------------------------- * * Function: BusMaster Data Transfer Start @@ -5075,49 +5668,47 @@ static void FPT_busMstrSGDataXferStart(unsigned long p_port, * Description: * *---------------------------------------------------------------------*/ -static void FPT_busMstrDataXferStart(unsigned long p_port, - struct sccb *pcurrSCCB) +static void FPT_busMstrDataXferStart(ULONG p_port, PSCCB pcurrSCCB) { - unsigned long addr, count; + ULONG addr,count; - if (!(pcurrSCCB->Sccb_XferState & F_AUTO_SENSE)) { + if (!(pcurrSCCB->Sccb_XferState & F_AUTO_SENSE)) { - count = pcurrSCCB->Sccb_XferCnt; + count = pcurrSCCB->Sccb_XferCnt; - addr = - (unsigned long)pcurrSCCB->DataPointer + pcurrSCCB->Sccb_ATC; - } + addr = (ULONG) pcurrSCCB->DataPointer + pcurrSCCB->Sccb_ATC; + } - else { - addr = pcurrSCCB->SensePointer; - count = pcurrSCCB->RequestSenseLength; + else { + addr = pcurrSCCB->SensePointer; + count = pcurrSCCB->RequestSenseLength; - } + } - HP_SETUP_ADDR_CNT(p_port, addr, count); + HP_SETUP_ADDR_CNT(p_port,addr,count); - if (pcurrSCCB->Sccb_XferState & F_HOST_XFER_DIR) { - WR_HARPOON(p_port + hp_portctrl_0, - (DMA_PORT | SCSI_PORT | SCSI_INBIT)); - WR_HARPOON(p_port + hp_scsisig, S_DATAI_PH); + if (pcurrSCCB->Sccb_XferState & F_HOST_XFER_DIR) { - WR_HARPOON(p_port + hp_xfer_cmd, - (XFER_DMA_HOST | XFER_HOST_AUTO | XFER_DMA_8BIT)); - } + WR_HARPOON(p_port+hp_portctrl_0,(DMA_PORT | SCSI_PORT | SCSI_INBIT)); + WR_HARPOON(p_port+hp_scsisig, S_DATAI_PH); - else { + WR_HARPOON(p_port+hp_xfer_cmd, + (XFER_DMA_HOST | XFER_HOST_AUTO | XFER_DMA_8BIT)); + } - WR_HARPOON(p_port + hp_portctrl_0, - (SCSI_PORT | DMA_PORT | DMA_RD)); - WR_HARPOON(p_port + hp_scsisig, S_DATAO_PH); + else { - WR_HARPOON(p_port + hp_xfer_cmd, - (XFER_HOST_DMA | XFER_HOST_AUTO | XFER_DMA_8BIT)); + WR_HARPOON(p_port+hp_portctrl_0,(SCSI_PORT | DMA_PORT | DMA_RD)); + WR_HARPOON(p_port+hp_scsisig, S_DATAO_PH); - } + WR_HARPOON(p_port+hp_xfer_cmd, + (XFER_HOST_DMA | XFER_HOST_AUTO | XFER_DMA_8BIT)); + + } } + /*--------------------------------------------------------------------- * * Function: BusMaster Timeout Handler @@ -5130,38 +5721,37 @@ static void FPT_busMstrDataXferStart(unsigned long p_port, * command busy is also time out, it'll just give up. * *---------------------------------------------------------------------*/ -static unsigned char FPT_busMstrTimeOut(unsigned long p_port) +static UCHAR FPT_busMstrTimeOut(ULONG p_port) { - unsigned long timeout; + ULONG timeout; - timeout = LONG_WAIT; + timeout = LONG_WAIT; - WR_HARPOON(p_port + hp_sys_ctrl, HALT_MACH); + WR_HARPOON(p_port+hp_sys_ctrl, HALT_MACH); - while ((!(RD_HARPOON(p_port + hp_ext_status) & CMD_ABORTED)) - && timeout--) { - } + while ((!(RD_HARPOON(p_port+hp_ext_status) & CMD_ABORTED)) && timeout--) {} - if (RD_HARPOON(p_port + hp_ext_status) & BM_CMD_BUSY) { - WR_HARPOON(p_port + hp_sys_ctrl, HARD_ABORT); + + + if (RD_HARPOON(p_port+hp_ext_status) & BM_CMD_BUSY) { + WR_HARPOON(p_port+hp_sys_ctrl, HARD_ABORT); - timeout = LONG_WAIT; - while ((RD_HARPOON(p_port + hp_ext_status) & BM_CMD_BUSY) - && timeout--) { - } - } + timeout = LONG_WAIT; + while ((RD_HARPOON(p_port+hp_ext_status) & BM_CMD_BUSY) && timeout--) {} + } - RD_HARPOON(p_port + hp_int_status); /*Clear command complete */ + RD_HARPOON(p_port+hp_int_status); /*Clear command complete */ - if (RD_HARPOON(p_port + hp_ext_status) & BM_CMD_BUSY) { - return 1; - } + if (RD_HARPOON(p_port+hp_ext_status) & BM_CMD_BUSY) { + return(1); + } - else { - return 0; - } + else { + return(0); + } } + /*--------------------------------------------------------------------- * * Function: Host Data Transfer Abort @@ -5169,282 +5759,256 @@ static unsigned char FPT_busMstrTimeOut(unsigned long p_port) * Description: Abort any in progress transfer. * *---------------------------------------------------------------------*/ -static void FPT_hostDataXferAbort(unsigned long port, unsigned char p_card, - struct sccb *pCurrSCCB) +static void FPT_hostDataXferAbort(ULONG port, UCHAR p_card, PSCCB pCurrSCCB) { - unsigned long timeout; - unsigned long remain_cnt; - unsigned int sg_ptr; + ULONG timeout; + ULONG remain_cnt; + UINT sg_ptr; - FPT_BL_Card[p_card].globalFlags &= ~F_HOST_XFER_ACT; + FPT_BL_Card[p_card].globalFlags &= ~F_HOST_XFER_ACT; - if (pCurrSCCB->Sccb_XferState & F_AUTO_SENSE) { + if (pCurrSCCB->Sccb_XferState & F_AUTO_SENSE) { - if (!(RD_HARPOON(port + hp_int_status) & INT_CMD_COMPL)) { - WR_HARPOON(port + hp_bm_ctrl, - (RD_HARPOON(port + hp_bm_ctrl) | - FLUSH_XFER_CNTR)); - timeout = LONG_WAIT; + if (!(RD_HARPOON(port+hp_int_status) & INT_CMD_COMPL)) { - while ((RD_HARPOON(port + hp_ext_status) & BM_CMD_BUSY) - && timeout--) { - } + WR_HARPOON(port+hp_bm_ctrl, (RD_HARPOON(port+hp_bm_ctrl) | FLUSH_XFER_CNTR)); + timeout = LONG_WAIT; - WR_HARPOON(port + hp_bm_ctrl, - (RD_HARPOON(port + hp_bm_ctrl) & - ~FLUSH_XFER_CNTR)); + while ((RD_HARPOON(port+hp_ext_status) & BM_CMD_BUSY) && timeout--) {} - if (RD_HARPOON(port + hp_ext_status) & BM_CMD_BUSY) { + WR_HARPOON(port+hp_bm_ctrl, (RD_HARPOON(port+hp_bm_ctrl) & ~FLUSH_XFER_CNTR)); - if (FPT_busMstrTimeOut(port)) { + if (RD_HARPOON(port+hp_ext_status) & BM_CMD_BUSY) { - if (pCurrSCCB->HostStatus == 0x00) + if (FPT_busMstrTimeOut(port)) { - pCurrSCCB->HostStatus = - SCCB_BM_ERR; + if (pCurrSCCB->HostStatus == 0x00) - } + pCurrSCCB->HostStatus = SCCB_BM_ERR; - if (RD_HARPOON(port + hp_int_status) & - INT_EXT_STATUS) + } - if (RD_HARPOON(port + hp_ext_status) & - BAD_EXT_STATUS) + if (RD_HARPOON(port+hp_int_status) & INT_EXT_STATUS) - if (pCurrSCCB->HostStatus == - 0x00) - { - pCurrSCCB->HostStatus = - SCCB_BM_ERR; - } - } - } - } + if (RD_HARPOON(port+hp_ext_status) & BAD_EXT_STATUS) - else if (pCurrSCCB->Sccb_XferCnt) { + if (pCurrSCCB->HostStatus == 0x00) - if (pCurrSCCB->Sccb_XferState & F_SG_XFER) { + { + pCurrSCCB->HostStatus = SCCB_BM_ERR; + } + } + } + } - WR_HARPOON(port + hp_page_ctrl, - (RD_HARPOON(port + hp_page_ctrl) & - ~SCATTER_EN)); + else if (pCurrSCCB->Sccb_XferCnt) { - WR_HARPOON(port + hp_sg_addr, 0x00); + if (pCurrSCCB->Sccb_XferState & F_SG_XFER) { - sg_ptr = pCurrSCCB->Sccb_sgseg + SG_BUF_CNT; - if (sg_ptr > - (unsigned int)(pCurrSCCB->DataLength / - SG_ELEMENT_SIZE)) { + WR_HARPOON(port+hp_page_ctrl, (RD_HARPOON(port+hp_page_ctrl) & + ~SCATTER_EN)); - sg_ptr = - (unsigned int)(pCurrSCCB->DataLength / - SG_ELEMENT_SIZE); - } + WR_HARPOON(port+hp_sg_addr,0x00); - remain_cnt = pCurrSCCB->Sccb_XferCnt; + sg_ptr = pCurrSCCB->Sccb_sgseg + SG_BUF_CNT; - while (remain_cnt < 0x01000000L) { + if (sg_ptr > (UINT)(pCurrSCCB->DataLength / SG_ELEMENT_SIZE)) { - sg_ptr--; + sg_ptr = (UINT)(pCurrSCCB->DataLength / SG_ELEMENT_SIZE); + } - if (remain_cnt > - (unsigned - long)(*(((unsigned long *)pCurrSCCB-> - DataPointer) + (sg_ptr * 2)))) { + remain_cnt = pCurrSCCB->Sccb_XferCnt; - remain_cnt -= - (unsigned - long)(*(((unsigned long *) - pCurrSCCB->DataPointer) + - (sg_ptr * 2))); - } + while (remain_cnt < 0x01000000L) { - else { + sg_ptr--; - break; - } - } + if (remain_cnt > (ULONG)(*(((ULONG *)pCurrSCCB-> + DataPointer) + (sg_ptr * 2)))) { - if (remain_cnt < 0x01000000L) { + remain_cnt -= (ULONG)(*(((ULONG *)pCurrSCCB-> + DataPointer) + (sg_ptr * 2))); + } - pCurrSCCB->Sccb_SGoffset = remain_cnt; + else { - pCurrSCCB->Sccb_sgseg = (unsigned short)sg_ptr; + break; + } + } - if ((unsigned long)(sg_ptr * SG_ELEMENT_SIZE) == - pCurrSCCB->DataLength && (remain_cnt == 0)) - pCurrSCCB->Sccb_XferState |= - F_ALL_XFERRED; - } - else { + if (remain_cnt < 0x01000000L) { - if (pCurrSCCB->HostStatus == 0x00) { - pCurrSCCB->HostStatus = - SCCB_GROSS_FW_ERR; - } - } - } + pCurrSCCB->Sccb_SGoffset = remain_cnt; - if (!(pCurrSCCB->Sccb_XferState & F_HOST_XFER_DIR)) { + pCurrSCCB->Sccb_sgseg = (USHORT)sg_ptr; - if (RD_HARPOON(port + hp_ext_status) & BM_CMD_BUSY) { - FPT_busMstrTimeOut(port); - } + if ((ULONG)(sg_ptr * SG_ELEMENT_SIZE) == pCurrSCCB->DataLength + && (remain_cnt == 0)) - else { + pCurrSCCB->Sccb_XferState |= F_ALL_XFERRED; + } - if (RD_HARPOON(port + hp_int_status) & - INT_EXT_STATUS) { + else { - if (RD_HARPOON(port + hp_ext_status) & - BAD_EXT_STATUS) { - if (pCurrSCCB->HostStatus == - 0x00) { + if (pCurrSCCB->HostStatus == 0x00) { - pCurrSCCB->HostStatus = - SCCB_BM_ERR; - } - } - } + pCurrSCCB->HostStatus = SCCB_GROSS_FW_ERR; + } + } + } - } - } - else { + if (!(pCurrSCCB->Sccb_XferState & F_HOST_XFER_DIR)) { - if ((RD_HARPOON(port + hp_fifo_cnt)) >= BM_THRESHOLD) { - timeout = SHORT_WAIT; + if (RD_HARPOON(port+hp_ext_status) & BM_CMD_BUSY) { - while ((RD_HARPOON(port + hp_ext_status) & - BM_CMD_BUSY) - && ((RD_HARPOON(port + hp_fifo_cnt)) >= - BM_THRESHOLD) && timeout--) { - } - } + FPT_busMstrTimeOut(port); + } - if (RD_HARPOON(port + hp_ext_status) & BM_CMD_BUSY) { + else { - WR_HARPOON(port + hp_bm_ctrl, - (RD_HARPOON(port + hp_bm_ctrl) | - FLUSH_XFER_CNTR)); + if (RD_HARPOON(port+hp_int_status) & INT_EXT_STATUS) { - timeout = LONG_WAIT; + if (RD_HARPOON(port+hp_ext_status) & BAD_EXT_STATUS) { - while ((RD_HARPOON(port + hp_ext_status) & - BM_CMD_BUSY) && timeout--) { - } + if (pCurrSCCB->HostStatus == 0x00) { - WR_HARPOON(port + hp_bm_ctrl, - (RD_HARPOON(port + hp_bm_ctrl) & - ~FLUSH_XFER_CNTR)); + pCurrSCCB->HostStatus = SCCB_BM_ERR; + } + } + } - if (RD_HARPOON(port + hp_ext_status) & - BM_CMD_BUSY) { + } + } - if (pCurrSCCB->HostStatus == 0x00) { + else { - pCurrSCCB->HostStatus = - SCCB_BM_ERR; - } - FPT_busMstrTimeOut(port); - } - } + if ((RD_HARPOON(port+hp_fifo_cnt)) >= BM_THRESHOLD) { - if (RD_HARPOON(port + hp_int_status) & INT_EXT_STATUS) { + timeout = SHORT_WAIT; - if (RD_HARPOON(port + hp_ext_status) & - BAD_EXT_STATUS) { + while ((RD_HARPOON(port+hp_ext_status) & BM_CMD_BUSY) && + ((RD_HARPOON(port+hp_fifo_cnt)) >= BM_THRESHOLD) && + timeout--) {} + } - if (pCurrSCCB->HostStatus == 0x00) { + if (RD_HARPOON(port+hp_ext_status) & BM_CMD_BUSY) { - pCurrSCCB->HostStatus = - SCCB_BM_ERR; - } - } - } - } + WR_HARPOON(port+hp_bm_ctrl, (RD_HARPOON(port+hp_bm_ctrl) | + FLUSH_XFER_CNTR)); - } + timeout = LONG_WAIT; - else { + while ((RD_HARPOON(port+hp_ext_status) & BM_CMD_BUSY) && + timeout--) {} - if (RD_HARPOON(port + hp_ext_status) & BM_CMD_BUSY) { + WR_HARPOON(port+hp_bm_ctrl, (RD_HARPOON(port+hp_bm_ctrl) & + ~FLUSH_XFER_CNTR)); - timeout = LONG_WAIT; - while ((RD_HARPOON(port + hp_ext_status) & BM_CMD_BUSY) - && timeout--) { - } + if (RD_HARPOON(port+hp_ext_status) & BM_CMD_BUSY) { - if (RD_HARPOON(port + hp_ext_status) & BM_CMD_BUSY) { + if (pCurrSCCB->HostStatus == 0x00) { - if (pCurrSCCB->HostStatus == 0x00) { + pCurrSCCB->HostStatus = SCCB_BM_ERR; + } - pCurrSCCB->HostStatus = SCCB_BM_ERR; - } + FPT_busMstrTimeOut(port); + } + } - FPT_busMstrTimeOut(port); - } - } + if (RD_HARPOON(port+hp_int_status) & INT_EXT_STATUS) { - if (RD_HARPOON(port + hp_int_status) & INT_EXT_STATUS) { + if (RD_HARPOON(port+hp_ext_status) & BAD_EXT_STATUS) { - if (RD_HARPOON(port + hp_ext_status) & BAD_EXT_STATUS) { + if (pCurrSCCB->HostStatus == 0x00) { - if (pCurrSCCB->HostStatus == 0x00) { + pCurrSCCB->HostStatus = SCCB_BM_ERR; + } + } + } + } - pCurrSCCB->HostStatus = SCCB_BM_ERR; - } - } + } - } + else { - if (pCurrSCCB->Sccb_XferState & F_SG_XFER) { - WR_HARPOON(port + hp_page_ctrl, - (RD_HARPOON(port + hp_page_ctrl) & - ~SCATTER_EN)); + if (RD_HARPOON(port+hp_ext_status) & BM_CMD_BUSY) { - WR_HARPOON(port + hp_sg_addr, 0x00); + timeout = LONG_WAIT; - pCurrSCCB->Sccb_sgseg += SG_BUF_CNT; + while ((RD_HARPOON(port+hp_ext_status) & BM_CMD_BUSY) && timeout--) {} - pCurrSCCB->Sccb_SGoffset = 0x00; + if (RD_HARPOON(port+hp_ext_status) & BM_CMD_BUSY) { - if ((unsigned long)(pCurrSCCB->Sccb_sgseg * - SG_ELEMENT_SIZE) >= - pCurrSCCB->DataLength) { + if (pCurrSCCB->HostStatus == 0x00) { - pCurrSCCB->Sccb_XferState |= F_ALL_XFERRED; + pCurrSCCB->HostStatus = SCCB_BM_ERR; + } - pCurrSCCB->Sccb_sgseg = - (unsigned short)(pCurrSCCB->DataLength / - SG_ELEMENT_SIZE); + FPT_busMstrTimeOut(port); + } + } - } - } - else { + if (RD_HARPOON(port+hp_int_status) & INT_EXT_STATUS) { - if (!(pCurrSCCB->Sccb_XferState & F_AUTO_SENSE)) + if (RD_HARPOON(port+hp_ext_status) & BAD_EXT_STATUS) { - pCurrSCCB->Sccb_XferState |= F_ALL_XFERRED; - } - } + if (pCurrSCCB->HostStatus == 0x00) { + + pCurrSCCB->HostStatus = SCCB_BM_ERR; + } + } + + } + + if (pCurrSCCB->Sccb_XferState & F_SG_XFER) { + + WR_HARPOON(port+hp_page_ctrl, (RD_HARPOON(port+hp_page_ctrl) & + ~SCATTER_EN)); + + WR_HARPOON(port+hp_sg_addr,0x00); + + pCurrSCCB->Sccb_sgseg += SG_BUF_CNT; + + pCurrSCCB->Sccb_SGoffset = 0x00; - WR_HARPOON(port + hp_int_mask, (INT_CMD_COMPL | SCSI_INTERRUPT)); + + if ((ULONG)(pCurrSCCB->Sccb_sgseg * SG_ELEMENT_SIZE) >= + pCurrSCCB->DataLength) { + + pCurrSCCB->Sccb_XferState |= F_ALL_XFERRED; + + pCurrSCCB->Sccb_sgseg = (USHORT)(pCurrSCCB->DataLength / SG_ELEMENT_SIZE); + + } + } + + else { + + if (!(pCurrSCCB->Sccb_XferState & F_AUTO_SENSE)) + + pCurrSCCB->Sccb_XferState |= F_ALL_XFERRED; + } + } + + WR_HARPOON(port+hp_int_mask,(INT_CMD_COMPL | SCSI_INTERRUPT)); } + + /*--------------------------------------------------------------------- * * Function: Host Data Transfer Restart @@ -5453,47 +6017,47 @@ static void FPT_hostDataXferAbort(unsigned long port, unsigned char p_card, * pointers message. * *---------------------------------------------------------------------*/ -static void FPT_hostDataXferRestart(struct sccb *currSCCB) +static void FPT_hostDataXferRestart(PSCCB currSCCB) { - unsigned long data_count; - unsigned int sg_index; - unsigned long *sg_ptr; + ULONG data_count; + UINT sg_index; + ULONG *sg_ptr; - if (currSCCB->Sccb_XferState & F_SG_XFER) { + if (currSCCB->Sccb_XferState & F_SG_XFER) { - currSCCB->Sccb_XferCnt = 0; + currSCCB->Sccb_XferCnt = 0; - sg_index = 0xffff; /*Index by long words into sg list. */ - data_count = 0; /*Running count of SG xfer counts. */ + sg_index = 0xffff; /*Index by long words into sg list. */ + data_count = 0; /*Running count of SG xfer counts. */ - sg_ptr = (unsigned long *)currSCCB->DataPointer; + sg_ptr = (ULONG *)currSCCB->DataPointer; - while (data_count < currSCCB->Sccb_ATC) { + while (data_count < currSCCB->Sccb_ATC) { - sg_index++; - data_count += *(sg_ptr + (sg_index * 2)); - } + sg_index++; + data_count += *(sg_ptr+(sg_index * 2)); + } - if (data_count == currSCCB->Sccb_ATC) { + if (data_count == currSCCB->Sccb_ATC) { - currSCCB->Sccb_SGoffset = 0; - sg_index++; - } + currSCCB->Sccb_SGoffset = 0; + sg_index++; + } - else { - currSCCB->Sccb_SGoffset = - data_count - currSCCB->Sccb_ATC; - } + else { + currSCCB->Sccb_SGoffset = data_count - currSCCB->Sccb_ATC; + } - currSCCB->Sccb_sgseg = (unsigned short)sg_index; - } + currSCCB->Sccb_sgseg = (USHORT)sg_index; + } - else { - currSCCB->Sccb_XferCnt = - currSCCB->DataLength - currSCCB->Sccb_ATC; - } + else { + currSCCB->Sccb_XferCnt = currSCCB->DataLength - currSCCB->Sccb_ATC; + } } + + /*--------------------------------------------------------------------- * * Function: FPT_scini @@ -5502,192 +6066,177 @@ static void FPT_hostDataXferRestart(struct sccb *currSCCB) * *---------------------------------------------------------------------*/ -static void FPT_scini(unsigned char p_card, unsigned char p_our_id, - unsigned char p_power_up) +static void FPT_scini(UCHAR p_card, UCHAR p_our_id, UCHAR p_power_up) { - unsigned char loser, assigned_id; - unsigned long p_port; + UCHAR loser,assigned_id; + ULONG p_port; - unsigned char i, k, ScamFlg; - struct sccb_card *currCard; - struct nvram_info *pCurrNvRam; + UCHAR i,k,ScamFlg ; + PSCCBcard currCard; + PNVRamInfo pCurrNvRam; - currCard = &FPT_BL_Card[p_card]; - p_port = currCard->ioPort; + currCard = &FPT_BL_Card[p_card]; + p_port = currCard->ioPort; pCurrNvRam = currCard->pNvRamInfo; - if (pCurrNvRam) { + + if(pCurrNvRam){ ScamFlg = pCurrNvRam->niScamConf; i = pCurrNvRam->niSysConf; - } else { - ScamFlg = - (unsigned char)FPT_utilEERead(p_port, SCAM_CONFIG / 2); - i = (unsigned - char)(FPT_utilEERead(p_port, (SYSTEM_CONFIG / 2))); } - if (!(i & 0x02)) /* check if reset bus in AutoSCSI parameter set */ + else{ + ScamFlg = (UCHAR) FPT_utilEERead(p_port, SCAM_CONFIG/2); + i = (UCHAR)(FPT_utilEERead(p_port, (SYSTEM_CONFIG/2))); + } + if(!(i & 0x02)) /* check if reset bus in AutoSCSI parameter set */ return; - FPT_inisci(p_card, p_port, p_our_id); + FPT_inisci(p_card,p_port, p_our_id); - /* Force to wait 1 sec after SCSI bus reset. Some SCAM device FW - too slow to return to SCAM selection */ + /* Force to wait 1 sec after SCSI bus reset. Some SCAM device FW + too slow to return to SCAM selection */ - /* if (p_power_up) - FPT_Wait1Second(p_port); - else - FPT_Wait(p_port, TO_250ms); */ + /* if (p_power_up) + FPT_Wait1Second(p_port); + else + FPT_Wait(p_port, TO_250ms); */ - FPT_Wait1Second(p_port); + FPT_Wait1Second(p_port); - if ((ScamFlg & SCAM_ENABLED) && (ScamFlg & SCAM_LEVEL2)) { - while (!(FPT_scarb(p_port, INIT_SELTD))) { - } + if ((ScamFlg & SCAM_ENABLED) && (ScamFlg & SCAM_LEVEL2)) + { + while (!(FPT_scarb(p_port,INIT_SELTD))) {} - FPT_scsel(p_port); + FPT_scsel(p_port); - do { - FPT_scxferc(p_port, SYNC_PTRN); - FPT_scxferc(p_port, DOM_MSTR); - loser = - FPT_scsendi(p_port, - &FPT_scamInfo[p_our_id].id_string[0]); - } while (loser == 0xFF); + do { + FPT_scxferc(p_port,SYNC_PTRN); + FPT_scxferc(p_port,DOM_MSTR); + loser = FPT_scsendi(p_port,&FPT_scamInfo[p_our_id].id_string[0]); + } while ( loser == 0xFF ); - FPT_scbusf(p_port); + FPT_scbusf(p_port); - if ((p_power_up) && (!loser)) { - FPT_sresb(p_port, p_card); - FPT_Wait(p_port, TO_250ms); + if ((p_power_up) && (!loser)) + { + FPT_sresb(p_port,p_card); + FPT_Wait(p_port, TO_250ms); - while (!(FPT_scarb(p_port, INIT_SELTD))) { - } + while (!(FPT_scarb(p_port,INIT_SELTD))) {} - FPT_scsel(p_port); + FPT_scsel(p_port); - do { - FPT_scxferc(p_port, SYNC_PTRN); - FPT_scxferc(p_port, DOM_MSTR); - loser = - FPT_scsendi(p_port, - &FPT_scamInfo[p_our_id]. - id_string[0]); - } while (loser == 0xFF); + do { + FPT_scxferc(p_port, SYNC_PTRN); + FPT_scxferc(p_port, DOM_MSTR); + loser = FPT_scsendi(p_port,&FPT_scamInfo[p_our_id]. + id_string[0]); + } while ( loser == 0xFF ); - FPT_scbusf(p_port); - } - } + FPT_scbusf(p_port); + } + } - else { - loser = 0; - } + else + { + loser = 0; + } - if (!loser) { - - FPT_scamInfo[p_our_id].state = ID_ASSIGNED; - - if (ScamFlg & SCAM_ENABLED) { - - for (i = 0; i < MAX_SCSI_TAR; i++) { - if ((FPT_scamInfo[i].state == ID_UNASSIGNED) || - (FPT_scamInfo[i].state == ID_UNUSED)) { - if (FPT_scsell(p_port, i)) { - FPT_scamInfo[i].state = LEGACY; - if ((FPT_scamInfo[i]. - id_string[0] != 0xFF) - || (FPT_scamInfo[i]. - id_string[1] != 0xFA)) { - - FPT_scamInfo[i]. - id_string[0] = 0xFF; - FPT_scamInfo[i]. - id_string[1] = 0xFA; - if (pCurrNvRam == NULL) - currCard-> - globalFlags - |= - F_UPDATE_EEPROM; - } - } - } - } - FPT_sresb(p_port, p_card); - FPT_Wait1Second(p_port); - while (!(FPT_scarb(p_port, INIT_SELTD))) { - } - FPT_scsel(p_port); - FPT_scasid(p_card, p_port); - } + if (!loser) + { - } + FPT_scamInfo[p_our_id].state = ID_ASSIGNED; - else if ((loser) && (ScamFlg & SCAM_ENABLED)) { - FPT_scamInfo[p_our_id].id_string[0] = SLV_TYPE_CODE0; - assigned_id = 0; - FPT_scwtsel(p_port); - do { - while (FPT_scxferc(p_port, 0x00) != SYNC_PTRN) { - } + if (ScamFlg & SCAM_ENABLED) + { - i = FPT_scxferc(p_port, 0x00); - if (i == ASSIGN_ID) { - if (! - (FPT_scsendi - (p_port, - &FPT_scamInfo[p_our_id].id_string[0]))) { - i = FPT_scxferc(p_port, 0x00); - if (FPT_scvalq(i)) { - k = FPT_scxferc(p_port, 0x00); - - if (FPT_scvalq(k)) { - currCard->ourId = - ((unsigned char)(i - << - 3) - + - (k & - (unsigned char)7)) - & (unsigned char) - 0x3F; - FPT_inisci(p_card, - p_port, - p_our_id); - FPT_scamInfo[currCard-> - ourId]. - state = ID_ASSIGNED; - FPT_scamInfo[currCard-> - ourId]. - id_string[0] - = SLV_TYPE_CODE0; - assigned_id = 1; - } - } - } - } + for (i=0; i < MAX_SCSI_TAR; i++) + { + if ((FPT_scamInfo[i].state == ID_UNASSIGNED) || + (FPT_scamInfo[i].state == ID_UNUSED)) + { + if (FPT_scsell(p_port,i)) + { + FPT_scamInfo[i].state = LEGACY; + if ((FPT_scamInfo[i].id_string[0] != 0xFF) || + (FPT_scamInfo[i].id_string[1] != 0xFA)) + { + + FPT_scamInfo[i].id_string[0] = 0xFF; + FPT_scamInfo[i].id_string[1] = 0xFA; + if(pCurrNvRam == NULL) + currCard->globalFlags |= F_UPDATE_EEPROM; + } + } + } + } + + FPT_sresb(p_port,p_card); + FPT_Wait1Second(p_port); + while (!(FPT_scarb(p_port,INIT_SELTD))) {} + FPT_scsel(p_port); + FPT_scasid(p_card, p_port); + } - else if (i == SET_P_FLAG) { - if (!(FPT_scsendi(p_port, - &FPT_scamInfo[p_our_id]. - id_string[0]))) - FPT_scamInfo[p_our_id].id_string[0] |= - 0x80; - } - } while (!assigned_id); + } - while (FPT_scxferc(p_port, 0x00) != CFG_CMPLT) { - } - } + else if ((loser) && (ScamFlg & SCAM_ENABLED)) + { + FPT_scamInfo[p_our_id].id_string[0] = SLV_TYPE_CODE0; + assigned_id = 0; + FPT_scwtsel(p_port); + + do { + while (FPT_scxferc(p_port,0x00) != SYNC_PTRN) {} + + i = FPT_scxferc(p_port,0x00); + if (i == ASSIGN_ID) + { + if (!(FPT_scsendi(p_port,&FPT_scamInfo[p_our_id].id_string[0]))) + { + i = FPT_scxferc(p_port,0x00); + if (FPT_scvalq(i)) + { + k = FPT_scxferc(p_port,0x00); + + if (FPT_scvalq(k)) + { + currCard->ourId = + ((UCHAR)(i<<3)+(k & (UCHAR)7)) & (UCHAR) 0x3F; + FPT_inisci(p_card, p_port, p_our_id); + FPT_scamInfo[currCard->ourId].state = ID_ASSIGNED; + FPT_scamInfo[currCard->ourId].id_string[0] + = SLV_TYPE_CODE0; + assigned_id = 1; + } + } + } + } + + else if (i == SET_P_FLAG) + { + if (!(FPT_scsendi(p_port, + &FPT_scamInfo[p_our_id].id_string[0]))) + FPT_scamInfo[p_our_id].id_string[0] |= 0x80; + } + }while (!assigned_id); + + while (FPT_scxferc(p_port,0x00) != CFG_CMPLT) {} + } + + if (ScamFlg & SCAM_ENABLED) + { + FPT_scbusf(p_port); + if (currCard->globalFlags & F_UPDATE_EEPROM) + { + FPT_scsavdi(p_card, p_port); + currCard->globalFlags &= ~F_UPDATE_EEPROM; + } + } - if (ScamFlg & SCAM_ENABLED) { - FPT_scbusf(p_port); - if (currCard->globalFlags & F_UPDATE_EEPROM) { - FPT_scsavdi(p_card, p_port); - currCard->globalFlags &= ~F_UPDATE_EEPROM; - } - } /* for (i=0,k=0; i < MAX_SCSI_TAR; i++) @@ -5704,6 +6253,7 @@ static void FPT_scini(unsigned char p_card, unsigned char p_our_id, */ } + /*--------------------------------------------------------------------- * * Function: FPT_scarb @@ -5712,60 +6262,59 @@ static void FPT_scini(unsigned char p_card, unsigned char p_our_id, * *---------------------------------------------------------------------*/ -static int FPT_scarb(unsigned long p_port, unsigned char p_sel_type) +static int FPT_scarb(ULONG p_port, UCHAR p_sel_type) { - if (p_sel_type == INIT_SELTD) { + if (p_sel_type == INIT_SELTD) + { - while (RD_HARPOON(p_port + hp_scsisig) & (SCSI_SEL | SCSI_BSY)) { - } + while (RD_HARPOON(p_port+hp_scsisig) & (SCSI_SEL | SCSI_BSY)) {} - if (RD_HARPOON(p_port + hp_scsisig) & SCSI_SEL) - return 0; - if (RD_HARPOON(p_port + hp_scsidata_0) != 00) - return 0; + if (RD_HARPOON(p_port+hp_scsisig) & SCSI_SEL) + return(0); - WR_HARPOON(p_port + hp_scsisig, - (RD_HARPOON(p_port + hp_scsisig) | SCSI_BSY)); + if (RD_HARPOON(p_port+hp_scsidata_0) != 00) + return(0); - if (RD_HARPOON(p_port + hp_scsisig) & SCSI_SEL) { + WR_HARPOON(p_port+hp_scsisig, (RD_HARPOON(p_port+hp_scsisig) | SCSI_BSY)); - WR_HARPOON(p_port + hp_scsisig, - (RD_HARPOON(p_port + hp_scsisig) & - ~SCSI_BSY)); - return 0; - } + if (RD_HARPOON(p_port+hp_scsisig) & SCSI_SEL) { - WR_HARPOON(p_port + hp_scsisig, - (RD_HARPOON(p_port + hp_scsisig) | SCSI_SEL)); + WR_HARPOON(p_port+hp_scsisig, (RD_HARPOON(p_port+hp_scsisig) & + ~SCSI_BSY)); + return(0); + } - if (RD_HARPOON(p_port + hp_scsidata_0) != 00) { - WR_HARPOON(p_port + hp_scsisig, - (RD_HARPOON(p_port + hp_scsisig) & - ~(SCSI_BSY | SCSI_SEL))); - return 0; - } - } + WR_HARPOON(p_port+hp_scsisig, (RD_HARPOON(p_port+hp_scsisig) | SCSI_SEL)); + + if (RD_HARPOON(p_port+hp_scsidata_0) != 00) { + + WR_HARPOON(p_port+hp_scsisig, (RD_HARPOON(p_port+hp_scsisig) & + ~(SCSI_BSY | SCSI_SEL))); + return(0); + } + } - WR_HARPOON(p_port + hp_clkctrl_0, (RD_HARPOON(p_port + hp_clkctrl_0) - & ~ACTdeassert)); - WR_HARPOON(p_port + hp_scsireset, SCAM_EN); - WR_HARPOON(p_port + hp_scsidata_0, 0x00); - WR_HARPOON(p_port + hp_scsidata_1, 0x00); - WR_HARPOON(p_port + hp_portctrl_0, SCSI_BUS_EN); - WR_HARPOON(p_port + hp_scsisig, - (RD_HARPOON(p_port + hp_scsisig) | SCSI_MSG)); + WR_HARPOON(p_port+hp_clkctrl_0, (RD_HARPOON(p_port+hp_clkctrl_0) + & ~ACTdeassert)); + WR_HARPOON(p_port+hp_scsireset, SCAM_EN); + WR_HARPOON(p_port+hp_scsidata_0, 0x00); + WR_HARPOON(p_port+hp_scsidata_1, 0x00); + WR_HARPOON(p_port+hp_portctrl_0, SCSI_BUS_EN); - WR_HARPOON(p_port + hp_scsisig, (RD_HARPOON(p_port + hp_scsisig) - & ~SCSI_BSY)); + WR_HARPOON(p_port+hp_scsisig, (RD_HARPOON(p_port+hp_scsisig) | SCSI_MSG)); - FPT_Wait(p_port, TO_250ms); + WR_HARPOON(p_port+hp_scsisig, (RD_HARPOON(p_port+hp_scsisig) + & ~SCSI_BSY)); - return 1; + FPT_Wait(p_port,TO_250ms); + + return(1); } + /*--------------------------------------------------------------------- * * Function: FPT_scbusf @@ -5774,30 +6323,34 @@ static int FPT_scarb(unsigned long p_port, unsigned char p_sel_type) * *---------------------------------------------------------------------*/ -static void FPT_scbusf(unsigned long p_port) +static void FPT_scbusf(ULONG p_port) { - WR_HARPOON(p_port + hp_page_ctrl, - (RD_HARPOON(p_port + hp_page_ctrl) | G_INT_DISABLE)); + WR_HARPOON(p_port+hp_page_ctrl, + (RD_HARPOON(p_port+hp_page_ctrl) | G_INT_DISABLE)); + - WR_HARPOON(p_port + hp_scsidata_0, 0x00); + WR_HARPOON(p_port+hp_scsidata_0, 0x00); - WR_HARPOON(p_port + hp_portctrl_0, (RD_HARPOON(p_port + hp_portctrl_0) - & ~SCSI_BUS_EN)); + WR_HARPOON(p_port+hp_portctrl_0, (RD_HARPOON(p_port+hp_portctrl_0) + & ~SCSI_BUS_EN)); - WR_HARPOON(p_port + hp_scsisig, 0x00); + WR_HARPOON(p_port+hp_scsisig, 0x00); - WR_HARPOON(p_port + hp_scsireset, (RD_HARPOON(p_port + hp_scsireset) - & ~SCAM_EN)); - WR_HARPOON(p_port + hp_clkctrl_0, (RD_HARPOON(p_port + hp_clkctrl_0) - | ACTdeassert)); + WR_HARPOON(p_port+hp_scsireset, (RD_HARPOON(p_port+hp_scsireset) + & ~SCAM_EN)); - WRW_HARPOON((p_port + hp_intstat), (BUS_FREE | AUTO_INT | SCAM_SEL)); + WR_HARPOON(p_port+hp_clkctrl_0, (RD_HARPOON(p_port+hp_clkctrl_0) + | ACTdeassert)); - WR_HARPOON(p_port + hp_page_ctrl, - (RD_HARPOON(p_port + hp_page_ctrl) & ~G_INT_DISABLE)); + WRW_HARPOON((p_port+hp_intstat), (BUS_FREE | AUTO_INT | SCAM_SEL)); + + WR_HARPOON(p_port+hp_page_ctrl, + (RD_HARPOON(p_port+hp_page_ctrl) & ~G_INT_DISABLE)); } + + /*--------------------------------------------------------------------- * * Function: FPT_scasid @@ -5806,75 +6359,86 @@ static void FPT_scbusf(unsigned long p_port) * *---------------------------------------------------------------------*/ -static void FPT_scasid(unsigned char p_card, unsigned long p_port) +static void FPT_scasid(UCHAR p_card, ULONG p_port) { - unsigned char temp_id_string[ID_STRING_LENGTH]; + UCHAR temp_id_string[ID_STRING_LENGTH]; - unsigned char i, k, scam_id; - unsigned char crcBytes[3]; - struct nvram_info *pCurrNvRam; - unsigned short *pCrcBytes; + UCHAR i,k,scam_id; + UCHAR crcBytes[3]; + PNVRamInfo pCurrNvRam; + ushort_ptr pCrcBytes; pCurrNvRam = FPT_BL_Card[p_card].pNvRamInfo; - i = 0; + i=0; - while (!i) { + while (!i) + { - for (k = 0; k < ID_STRING_LENGTH; k++) { - temp_id_string[k] = (unsigned char)0x00; - } + for (k=0; k < ID_STRING_LENGTH; k++) + { + temp_id_string[k] = (UCHAR) 0x00; + } - FPT_scxferc(p_port, SYNC_PTRN); - FPT_scxferc(p_port, ASSIGN_ID); + FPT_scxferc(p_port,SYNC_PTRN); + FPT_scxferc(p_port,ASSIGN_ID); - if (!(FPT_sciso(p_port, &temp_id_string[0]))) { - if (pCurrNvRam) { - pCrcBytes = (unsigned short *)&crcBytes[0]; + if (!(FPT_sciso(p_port,&temp_id_string[0]))) + { + if(pCurrNvRam){ + pCrcBytes = (ushort_ptr)&crcBytes[0]; *pCrcBytes = FPT_CalcCrc16(&temp_id_string[0]); crcBytes[2] = FPT_CalcLrc(&temp_id_string[0]); temp_id_string[1] = crcBytes[2]; temp_id_string[2] = crcBytes[0]; temp_id_string[3] = crcBytes[1]; - for (k = 4; k < ID_STRING_LENGTH; k++) - temp_id_string[k] = (unsigned char)0x00; + for(k = 4; k < ID_STRING_LENGTH; k++) + temp_id_string[k] = (UCHAR) 0x00; } - i = FPT_scmachid(p_card, temp_id_string); + i = FPT_scmachid(p_card,temp_id_string); - if (i == CLR_PRIORITY) { - FPT_scxferc(p_port, MISC_CODE); - FPT_scxferc(p_port, CLR_P_FLAG); - i = 0; /*Not the last ID yet. */ - } + if (i == CLR_PRIORITY) + { + FPT_scxferc(p_port,MISC_CODE); + FPT_scxferc(p_port,CLR_P_FLAG); + i = 0; /*Not the last ID yet. */ + } - else if (i != NO_ID_AVAIL) { - if (i < 8) - FPT_scxferc(p_port, ID_0_7); - else - FPT_scxferc(p_port, ID_8_F); + else if (i != NO_ID_AVAIL) + { + if (i < 8 ) + FPT_scxferc(p_port,ID_0_7); + else + FPT_scxferc(p_port,ID_8_F); - scam_id = (i & (unsigned char)0x07); + scam_id = (i & (UCHAR) 0x07); - for (k = 1; k < 0x08; k <<= 1) - if (!(k & i)) - scam_id += 0x08; /*Count number of zeros in DB0-3. */ - FPT_scxferc(p_port, scam_id); + for (k=1; k < 0x08; k <<= 1) + if (!( k & i )) + scam_id += 0x08; /*Count number of zeros in DB0-3. */ - i = 0; /*Not the last ID yet. */ - } - } + FPT_scxferc(p_port,scam_id); - else { - i = 1; - } + i = 0; /*Not the last ID yet. */ + } + } + + else + { + i = 1; + } - } /*End while */ + } /*End while */ - FPT_scxferc(p_port, SYNC_PTRN); - FPT_scxferc(p_port, CFG_CMPLT); + FPT_scxferc(p_port,SYNC_PTRN); + FPT_scxferc(p_port,CFG_CMPLT); } + + + + /*--------------------------------------------------------------------- * * Function: FPT_scsel @@ -5883,32 +6447,32 @@ static void FPT_scasid(unsigned char p_card, unsigned long p_port) * *---------------------------------------------------------------------*/ -static void FPT_scsel(unsigned long p_port) +static void FPT_scsel(ULONG p_port) { - WR_HARPOON(p_port + hp_scsisig, SCSI_SEL); - FPT_scwiros(p_port, SCSI_MSG); + WR_HARPOON(p_port+hp_scsisig, SCSI_SEL); + FPT_scwiros(p_port, SCSI_MSG); + + WR_HARPOON(p_port+hp_scsisig, (SCSI_SEL | SCSI_BSY)); + - WR_HARPOON(p_port + hp_scsisig, (SCSI_SEL | SCSI_BSY)); + WR_HARPOON(p_port+hp_scsisig, (SCSI_SEL | SCSI_BSY | SCSI_IOBIT | SCSI_CD)); + WR_HARPOON(p_port+hp_scsidata_0, (UCHAR)(RD_HARPOON(p_port+hp_scsidata_0) | + (UCHAR)(BIT(7)+BIT(6)))); - WR_HARPOON(p_port + hp_scsisig, - (SCSI_SEL | SCSI_BSY | SCSI_IOBIT | SCSI_CD)); - WR_HARPOON(p_port + hp_scsidata_0, - (unsigned char)(RD_HARPOON(p_port + hp_scsidata_0) | - (unsigned char)(BIT(7) + BIT(6)))); - WR_HARPOON(p_port + hp_scsisig, (SCSI_BSY | SCSI_IOBIT | SCSI_CD)); - FPT_scwiros(p_port, SCSI_SEL); + WR_HARPOON(p_port+hp_scsisig, (SCSI_BSY | SCSI_IOBIT | SCSI_CD)); + FPT_scwiros(p_port, SCSI_SEL); - WR_HARPOON(p_port + hp_scsidata_0, - (unsigned char)(RD_HARPOON(p_port + hp_scsidata_0) & - ~(unsigned char)BIT(6))); - FPT_scwirod(p_port, BIT(6)); + WR_HARPOON(p_port+hp_scsidata_0, (UCHAR)(RD_HARPOON(p_port+hp_scsidata_0) & + ~(UCHAR)BIT(6))); + FPT_scwirod(p_port, BIT(6)); - WR_HARPOON(p_port + hp_scsisig, - (SCSI_SEL | SCSI_BSY | SCSI_IOBIT | SCSI_CD)); + WR_HARPOON(p_port+hp_scsisig, (SCSI_SEL | SCSI_BSY | SCSI_IOBIT | SCSI_CD)); } + + /*--------------------------------------------------------------------- * * Function: FPT_scxferc @@ -5917,47 +6481,48 @@ static void FPT_scsel(unsigned long p_port) * *---------------------------------------------------------------------*/ -static unsigned char FPT_scxferc(unsigned long p_port, unsigned char p_data) +static UCHAR FPT_scxferc(ULONG p_port, UCHAR p_data) { - unsigned char curr_data, ret_data; + UCHAR curr_data, ret_data; - curr_data = p_data | BIT(7) | BIT(5); /*Start with DB7 & DB5 asserted. */ + curr_data = p_data | BIT(7) | BIT(5); /*Start with DB7 & DB5 asserted. */ - WR_HARPOON(p_port + hp_scsidata_0, curr_data); + WR_HARPOON(p_port+hp_scsidata_0, curr_data); - curr_data &= ~BIT(7); + curr_data &= ~BIT(7); - WR_HARPOON(p_port + hp_scsidata_0, curr_data); + WR_HARPOON(p_port+hp_scsidata_0, curr_data); - FPT_scwirod(p_port, BIT(7)); /*Wait for DB7 to be released. */ - while (!(RD_HARPOON(p_port + hp_scsidata_0) & BIT(5))) ; + FPT_scwirod(p_port,BIT(7)); /*Wait for DB7 to be released. */ + while (!(RD_HARPOON(p_port+hp_scsidata_0) & BIT(5))); - ret_data = (RD_HARPOON(p_port + hp_scsidata_0) & (unsigned char)0x1F); + ret_data = (RD_HARPOON(p_port+hp_scsidata_0) & (UCHAR) 0x1F); - curr_data |= BIT(6); + curr_data |= BIT(6); - WR_HARPOON(p_port + hp_scsidata_0, curr_data); + WR_HARPOON(p_port+hp_scsidata_0, curr_data); - curr_data &= ~BIT(5); + curr_data &= ~BIT(5); - WR_HARPOON(p_port + hp_scsidata_0, curr_data); + WR_HARPOON(p_port+hp_scsidata_0, curr_data); - FPT_scwirod(p_port, BIT(5)); /*Wait for DB5 to be released. */ + FPT_scwirod(p_port,BIT(5)); /*Wait for DB5 to be released. */ - curr_data &= ~(BIT(4) | BIT(3) | BIT(2) | BIT(1) | BIT(0)); /*Release data bits */ - curr_data |= BIT(7); + curr_data &= ~(BIT(4)|BIT(3)|BIT(2)|BIT(1)|BIT(0)); /*Release data bits */ + curr_data |= BIT(7); - WR_HARPOON(p_port + hp_scsidata_0, curr_data); + WR_HARPOON(p_port+hp_scsidata_0, curr_data); - curr_data &= ~BIT(6); + curr_data &= ~BIT(6); - WR_HARPOON(p_port + hp_scsidata_0, curr_data); + WR_HARPOON(p_port+hp_scsidata_0, curr_data); - FPT_scwirod(p_port, BIT(6)); /*Wait for DB6 to be released. */ + FPT_scwirod(p_port,BIT(6)); /*Wait for DB6 to be released. */ - return ret_data; + return(ret_data); } + /*--------------------------------------------------------------------- * * Function: FPT_scsendi @@ -5967,50 +6532,51 @@ static unsigned char FPT_scxferc(unsigned long p_port, unsigned char p_data) * *---------------------------------------------------------------------*/ -static unsigned char FPT_scsendi(unsigned long p_port, - unsigned char p_id_string[]) +static UCHAR FPT_scsendi(ULONG p_port, UCHAR p_id_string[]) { - unsigned char ret_data, byte_cnt, bit_cnt, defer; + UCHAR ret_data,byte_cnt,bit_cnt,defer; - defer = 0; + defer = 0; - for (byte_cnt = 0; byte_cnt < ID_STRING_LENGTH; byte_cnt++) { + for (byte_cnt = 0; byte_cnt < ID_STRING_LENGTH; byte_cnt++) { - for (bit_cnt = 0x80; bit_cnt != 0; bit_cnt >>= 1) { + for (bit_cnt = 0x80; bit_cnt != 0 ; bit_cnt >>= 1) { - if (defer) - ret_data = FPT_scxferc(p_port, 00); + if (defer) + ret_data = FPT_scxferc(p_port,00); - else if (p_id_string[byte_cnt] & bit_cnt) + else if (p_id_string[byte_cnt] & bit_cnt) - ret_data = FPT_scxferc(p_port, 02); + ret_data = FPT_scxferc(p_port,02); - else { + else { - ret_data = FPT_scxferc(p_port, 01); - if (ret_data & 02) - defer = 1; - } + ret_data = FPT_scxferc(p_port,01); + if (ret_data & 02) + defer = 1; + } - if ((ret_data & 0x1C) == 0x10) - return 0x00; /*End of isolation stage, we won! */ + if ((ret_data & 0x1C) == 0x10) + return(0x00); /*End of isolation stage, we won! */ - if (ret_data & 0x1C) - return 0xFF; + if (ret_data & 0x1C) + return(0xFF); - if ((defer) && (!(ret_data & 0x1F))) - return 0x01; /*End of isolation stage, we lost. */ + if ((defer) && (!(ret_data & 0x1F))) + return(0x01); /*End of isolation stage, we lost. */ - } /*bit loop */ + } /*bit loop */ - } /*byte loop */ + } /*byte loop */ - if (defer) - return 0x01; /*We lost */ - else - return 0; /*We WON! Yeeessss! */ + if (defer) + return(0x01); /*We lost */ + else + return(0); /*We WON! Yeeessss! */ } + + /*--------------------------------------------------------------------- * * Function: FPT_sciso @@ -6019,31 +6585,31 @@ static unsigned char FPT_scsendi(unsigned long p_port, * *---------------------------------------------------------------------*/ -static unsigned char FPT_sciso(unsigned long p_port, - unsigned char p_id_string[]) +static UCHAR FPT_sciso(ULONG p_port, UCHAR p_id_string[]) { - unsigned char ret_data, the_data, byte_cnt, bit_cnt; + UCHAR ret_data,the_data,byte_cnt,bit_cnt; - the_data = 0; + the_data = 0; - for (byte_cnt = 0; byte_cnt < ID_STRING_LENGTH; byte_cnt++) { + for (byte_cnt = 0; byte_cnt < ID_STRING_LENGTH; byte_cnt++) { - for (bit_cnt = 0; bit_cnt < 8; bit_cnt++) { + for (bit_cnt = 0; bit_cnt < 8; bit_cnt++) { - ret_data = FPT_scxferc(p_port, 0); + ret_data = FPT_scxferc(p_port,0); - if (ret_data & 0xFC) - return 0xFF; + if (ret_data & 0xFC) + return(0xFF); - else { + else { - the_data <<= 1; - if (ret_data & BIT(1)) { - the_data |= 1; - } - } + the_data <<= 1; + if (ret_data & BIT(1)) { + the_data |= 1; + } + } - if ((ret_data & 0x1F) == 0) { + if ((ret_data & 0x1F) == 0) + { /* if(bit_cnt != 0 || bit_cnt != 8) { @@ -6054,21 +6620,23 @@ static unsigned char FPT_sciso(unsigned long p_port, continue; } */ - if (byte_cnt) - return 0x00; - else - return 0xFF; - } + if (byte_cnt) + return(0x00); + else + return(0xFF); + } - } /*bit loop */ + } /*bit loop */ - p_id_string[byte_cnt] = the_data; + p_id_string[byte_cnt] = the_data; - } /*byte loop */ + } /*byte loop */ - return 0; + return(0); } + + /*--------------------------------------------------------------------- * * Function: FPT_scwirod @@ -6078,24 +6646,26 @@ static unsigned char FPT_sciso(unsigned long p_port, * *---------------------------------------------------------------------*/ -static void FPT_scwirod(unsigned long p_port, unsigned char p_data_bit) +static void FPT_scwirod(ULONG p_port, UCHAR p_data_bit) { - unsigned char i; + UCHAR i; - i = 0; - while (i < MAX_SCSI_TAR) { + i = 0; + while ( i < MAX_SCSI_TAR ) { - if (RD_HARPOON(p_port + hp_scsidata_0) & p_data_bit) + if (RD_HARPOON(p_port+hp_scsidata_0) & p_data_bit) - i = 0; + i = 0; - else + else - i++; + i++; - } + } } + + /*--------------------------------------------------------------------- * * Function: FPT_scwiros @@ -6105,24 +6675,25 @@ static void FPT_scwirod(unsigned long p_port, unsigned char p_data_bit) * *---------------------------------------------------------------------*/ -static void FPT_scwiros(unsigned long p_port, unsigned char p_data_bit) +static void FPT_scwiros(ULONG p_port, UCHAR p_data_bit) { - unsigned char i; + UCHAR i; - i = 0; - while (i < MAX_SCSI_TAR) { + i = 0; + while ( i < MAX_SCSI_TAR ) { - if (RD_HARPOON(p_port + hp_scsisig) & p_data_bit) + if (RD_HARPOON(p_port+hp_scsisig) & p_data_bit) - i = 0; + i = 0; - else + else - i++; + i++; - } + } } + /*--------------------------------------------------------------------- * * Function: FPT_scvalq @@ -6131,22 +6702,23 @@ static void FPT_scwiros(unsigned long p_port, unsigned char p_data_bit) * *---------------------------------------------------------------------*/ -static unsigned char FPT_scvalq(unsigned char p_quintet) +static UCHAR FPT_scvalq(UCHAR p_quintet) { - unsigned char count; + UCHAR count; - for (count = 1; count < 0x08; count <<= 1) { - if (!(p_quintet & count)) - p_quintet -= 0x80; - } + for (count=1; count < 0x08; count<<=1) { + if (!(p_quintet & count)) + p_quintet -= 0x80; + } - if (p_quintet & 0x18) - return 0; + if (p_quintet & 0x18) + return(0); - else - return 1; + else + return(1); } + /*--------------------------------------------------------------------- * * Function: FPT_scsell @@ -6157,78 +6729,75 @@ static unsigned char FPT_scvalq(unsigned char p_quintet) * *---------------------------------------------------------------------*/ -static unsigned char FPT_scsell(unsigned long p_port, unsigned char targ_id) +static UCHAR FPT_scsell(ULONG p_port, UCHAR targ_id) { - unsigned long i; + ULONG i; - WR_HARPOON(p_port + hp_page_ctrl, - (RD_HARPOON(p_port + hp_page_ctrl) | G_INT_DISABLE)); + WR_HARPOON(p_port+hp_page_ctrl, + (RD_HARPOON(p_port+hp_page_ctrl) | G_INT_DISABLE)); - ARAM_ACCESS(p_port); + ARAM_ACCESS(p_port); - WR_HARPOON(p_port + hp_addstat, - (RD_HARPOON(p_port + hp_addstat) | SCAM_TIMER)); - WR_HARPOON(p_port + hp_seltimeout, TO_4ms); + WR_HARPOON(p_port+hp_addstat,(RD_HARPOON(p_port+hp_addstat) | SCAM_TIMER)); + WR_HARPOON(p_port+hp_seltimeout,TO_4ms); - for (i = p_port + CMD_STRT; i < p_port + CMD_STRT + 12; i += 2) { - WRW_HARPOON(i, (MPM_OP + ACOMMAND)); - } - WRW_HARPOON(i, (BRH_OP + ALWAYS + NP)); - WRW_HARPOON((p_port + hp_intstat), - (RESET | TIMEOUT | SEL | BUS_FREE | AUTO_INT)); + for (i = p_port+CMD_STRT; i < p_port+CMD_STRT+12; i+=2) { + WRW_HARPOON(i, (MPM_OP+ACOMMAND)); + } + WRW_HARPOON(i, (BRH_OP+ALWAYS+ NP)); + + WRW_HARPOON((p_port+hp_intstat), + (RESET | TIMEOUT | SEL | BUS_FREE | AUTO_INT)); - WR_HARPOON(p_port + hp_select_id, targ_id); + WR_HARPOON(p_port+hp_select_id, targ_id); - WR_HARPOON(p_port + hp_portctrl_0, SCSI_PORT); - WR_HARPOON(p_port + hp_autostart_3, (SELECT | CMD_ONLY_STRT)); - WR_HARPOON(p_port + hp_scsictrl_0, (SEL_TAR | ENA_RESEL)); + WR_HARPOON(p_port+hp_portctrl_0, SCSI_PORT); + WR_HARPOON(p_port+hp_autostart_3, (SELECT | CMD_ONLY_STRT)); + WR_HARPOON(p_port+hp_scsictrl_0, (SEL_TAR | ENA_RESEL)); - while (!(RDW_HARPOON((p_port + hp_intstat)) & - (RESET | PROG_HLT | TIMEOUT | AUTO_INT))) { - } - if (RDW_HARPOON((p_port + hp_intstat)) & RESET) - FPT_Wait(p_port, TO_250ms); + while (!(RDW_HARPOON((p_port+hp_intstat)) & + (RESET | PROG_HLT | TIMEOUT | AUTO_INT))) {} - DISABLE_AUTO(p_port); + if (RDW_HARPOON((p_port+hp_intstat)) & RESET) + FPT_Wait(p_port, TO_250ms); - WR_HARPOON(p_port + hp_addstat, - (RD_HARPOON(p_port + hp_addstat) & ~SCAM_TIMER)); - WR_HARPOON(p_port + hp_seltimeout, TO_290ms); + DISABLE_AUTO(p_port); - SGRAM_ACCESS(p_port); + WR_HARPOON(p_port+hp_addstat,(RD_HARPOON(p_port+hp_addstat) & ~SCAM_TIMER)); + WR_HARPOON(p_port+hp_seltimeout,TO_290ms); - if (RDW_HARPOON((p_port + hp_intstat)) & (RESET | TIMEOUT)) { + SGRAM_ACCESS(p_port); - WRW_HARPOON((p_port + hp_intstat), - (RESET | TIMEOUT | SEL | BUS_FREE | PHASE)); + if (RDW_HARPOON((p_port+hp_intstat)) & (RESET | TIMEOUT) ) { - WR_HARPOON(p_port + hp_page_ctrl, - (RD_HARPOON(p_port + hp_page_ctrl) & - ~G_INT_DISABLE)); + WRW_HARPOON((p_port+hp_intstat), + (RESET | TIMEOUT | SEL | BUS_FREE | PHASE)); - return 0; /*No legacy device */ - } + WR_HARPOON(p_port+hp_page_ctrl, + (RD_HARPOON(p_port+hp_page_ctrl) & ~G_INT_DISABLE)); + + return(0); /*No legacy device */ + } - else { + else { - while (!(RDW_HARPOON((p_port + hp_intstat)) & BUS_FREE)) { - if (RD_HARPOON(p_port + hp_scsisig) & SCSI_REQ) { - WR_HARPOON(p_port + hp_scsisig, - (SCSI_ACK + S_ILL_PH)); - ACCEPT_MSG(p_port); - } + while(!(RDW_HARPOON((p_port+hp_intstat)) & BUS_FREE)) { + if (RD_HARPOON(p_port+hp_scsisig) & SCSI_REQ) + { + WR_HARPOON(p_port+hp_scsisig, (SCSI_ACK + S_ILL_PH)); + ACCEPT_MSG(p_port); + } } - WRW_HARPOON((p_port + hp_intstat), CLR_ALL_INT_1); + WRW_HARPOON((p_port+hp_intstat), CLR_ALL_INT_1); - WR_HARPOON(p_port + hp_page_ctrl, - (RD_HARPOON(p_port + hp_page_ctrl) & - ~G_INT_DISABLE)); + WR_HARPOON(p_port+hp_page_ctrl, + (RD_HARPOON(p_port+hp_page_ctrl) & ~G_INT_DISABLE)); - return 1; /*Found one of them oldies! */ - } + return(1); /*Found one of them oldies! */ + } } /*--------------------------------------------------------------------- @@ -6239,12 +6808,12 @@ static unsigned char FPT_scsell(unsigned long p_port, unsigned char targ_id) * *---------------------------------------------------------------------*/ -static void FPT_scwtsel(unsigned long p_port) +static void FPT_scwtsel(ULONG p_port) { - while (!(RDW_HARPOON((p_port + hp_intstat)) & SCAM_SEL)) { - } + while(!(RDW_HARPOON((p_port+hp_intstat)) & SCAM_SEL)) {} } + /*--------------------------------------------------------------------- * * Function: FPT_inisci @@ -6253,64 +6822,57 @@ static void FPT_scwtsel(unsigned long p_port) * *---------------------------------------------------------------------*/ -static void FPT_inisci(unsigned char p_card, unsigned long p_port, - unsigned char p_our_id) +static void FPT_inisci(UCHAR p_card, ULONG p_port, UCHAR p_our_id) { - unsigned char i, k, max_id; - unsigned short ee_data; - struct nvram_info *pCurrNvRam; + UCHAR i,k,max_id; + USHORT ee_data; + PNVRamInfo pCurrNvRam; pCurrNvRam = FPT_BL_Card[p_card].pNvRamInfo; - if (RD_HARPOON(p_port + hp_page_ctrl) & NARROW_SCSI_CARD) - max_id = 0x08; + if (RD_HARPOON(p_port+hp_page_ctrl) & NARROW_SCSI_CARD) + max_id = 0x08; - else - max_id = 0x10; + else + max_id = 0x10; - if (pCurrNvRam) { - for (i = 0; i < max_id; i++) { + if(pCurrNvRam){ + for(i = 0; i < max_id; i++){ - for (k = 0; k < 4; k++) - FPT_scamInfo[i].id_string[k] = - pCurrNvRam->niScamTbl[i][k]; - for (k = 4; k < ID_STRING_LENGTH; k++) - FPT_scamInfo[i].id_string[k] = - (unsigned char)0x00; + for(k = 0; k < 4; k++) + FPT_scamInfo[i].id_string[k] = pCurrNvRam->niScamTbl[i][k]; + for(k = 4; k < ID_STRING_LENGTH; k++) + FPT_scamInfo[i].id_string[k] = (UCHAR) 0x00; - if (FPT_scamInfo[i].id_string[0] == 0x00) - FPT_scamInfo[i].state = ID_UNUSED; /*Default to unused ID. */ - else - FPT_scamInfo[i].state = ID_UNASSIGNED; /*Default to unassigned ID. */ + if(FPT_scamInfo[i].id_string[0] == 0x00) + FPT_scamInfo[i].state = ID_UNUSED; /*Default to unused ID. */ + else + FPT_scamInfo[i].state = ID_UNASSIGNED; /*Default to unassigned ID. */ } - } else { - for (i = 0; i < max_id; i++) { - for (k = 0; k < ID_STRING_LENGTH; k += 2) { - ee_data = - FPT_utilEERead(p_port, - (unsigned - short)((EE_SCAMBASE / 2) + - (unsigned short)(i * - ((unsigned short)ID_STRING_LENGTH / 2)) + (unsigned short)(k / 2))); - FPT_scamInfo[i].id_string[k] = - (unsigned char)ee_data; - ee_data >>= 8; - FPT_scamInfo[i].id_string[k + 1] = - (unsigned char)ee_data; - } + }else { + for (i=0; i < max_id; i++) + { + for (k=0; k < ID_STRING_LENGTH; k+=2) + { + ee_data = FPT_utilEERead(p_port, (USHORT)((EE_SCAMBASE/2) + + (USHORT) (i*((USHORT)ID_STRING_LENGTH/2)) + (USHORT)(k/2))); + FPT_scamInfo[i].id_string[k] = (UCHAR) ee_data; + ee_data >>= 8; + FPT_scamInfo[i].id_string[k+1] = (UCHAR) ee_data; + } - if ((FPT_scamInfo[i].id_string[0] == 0x00) || - (FPT_scamInfo[i].id_string[0] == 0xFF)) + if ((FPT_scamInfo[i].id_string[0] == 0x00) || + (FPT_scamInfo[i].id_string[0] == 0xFF)) - FPT_scamInfo[i].state = ID_UNUSED; /*Default to unused ID. */ + FPT_scamInfo[i].state = ID_UNUSED; /*Default to unused ID. */ - else - FPT_scamInfo[i].state = ID_UNASSIGNED; /*Default to unassigned ID. */ + else + FPT_scamInfo[i].state = ID_UNASSIGNED; /*Default to unassigned ID. */ - } + } } - for (k = 0; k < ID_STRING_LENGTH; k++) + for(k = 0; k < ID_STRING_LENGTH; k++) FPT_scamInfo[p_our_id].id_string[k] = FPT_scamHAString[k]; } @@ -6324,114 +6886,127 @@ static void FPT_inisci(unsigned char p_card, unsigned long p_port, * *---------------------------------------------------------------------*/ -static unsigned char FPT_scmachid(unsigned char p_card, - unsigned char p_id_string[]) +static UCHAR FPT_scmachid(UCHAR p_card, UCHAR p_id_string[]) { - unsigned char i, k, match; + UCHAR i,k,match; - for (i = 0; i < MAX_SCSI_TAR; i++) { - match = 1; + for (i=0; i < MAX_SCSI_TAR; i++) { - for (k = 0; k < ID_STRING_LENGTH; k++) { - if (p_id_string[k] != FPT_scamInfo[i].id_string[k]) - match = 0; - } + match = 1; - if (match) { - FPT_scamInfo[i].state = ID_ASSIGNED; - return i; - } + for (k=0; k < ID_STRING_LENGTH; k++) + { + if (p_id_string[k] != FPT_scamInfo[i].id_string[k]) + match = 0; + } - } + if (match) + { + FPT_scamInfo[i].state = ID_ASSIGNED; + return(i); + } - if (p_id_string[0] & BIT(5)) - i = 8; - else - i = MAX_SCSI_TAR; + } - if (((p_id_string[0] & 0x06) == 0x02) - || ((p_id_string[0] & 0x06) == 0x04)) - match = p_id_string[1] & (unsigned char)0x1F; - else - match = 7; - while (i > 0) { - i--; - if (FPT_scamInfo[match].state == ID_UNUSED) { - for (k = 0; k < ID_STRING_LENGTH; k++) { - FPT_scamInfo[match].id_string[k] = - p_id_string[k]; - } + if (p_id_string[0] & BIT(5)) + i = 8; + else + i = MAX_SCSI_TAR; - FPT_scamInfo[match].state = ID_ASSIGNED; + if (((p_id_string[0] & 0x06) == 0x02) || ((p_id_string[0] & 0x06) == 0x04)) + match = p_id_string[1] & (UCHAR) 0x1F; + else + match = 7; - if (FPT_BL_Card[p_card].pNvRamInfo == NULL) - FPT_BL_Card[p_card].globalFlags |= - F_UPDATE_EEPROM; - return match; + while (i > 0) + { + i--; - } + if (FPT_scamInfo[match].state == ID_UNUSED) + { + for (k=0; k < ID_STRING_LENGTH; k++) + { + FPT_scamInfo[match].id_string[k] = p_id_string[k]; + } - match--; + FPT_scamInfo[match].state = ID_ASSIGNED; - if (match == 0xFF) { - if (p_id_string[0] & BIT(5)) - match = 7; - else - match = MAX_SCSI_TAR - 1; - } - } + if(FPT_BL_Card[p_card].pNvRamInfo == NULL) + FPT_BL_Card[p_card].globalFlags |= F_UPDATE_EEPROM; + return(match); + + } - if (p_id_string[0] & BIT(7)) { - return CLR_PRIORITY; + + match--; + + if (match == 0xFF) + { + if (p_id_string[0] & BIT(5)) + match = 7; + else + match = MAX_SCSI_TAR-1; } + } - if (p_id_string[0] & BIT(5)) - i = 8; - else - i = MAX_SCSI_TAR; - if (((p_id_string[0] & 0x06) == 0x02) - || ((p_id_string[0] & 0x06) == 0x04)) - match = p_id_string[1] & (unsigned char)0x1F; - else - match = 7; - while (i > 0) { + if (p_id_string[0] & BIT(7)) + { + return(CLR_PRIORITY); + } + - i--; + if (p_id_string[0] & BIT(5)) + i = 8; + else + i = MAX_SCSI_TAR; - if (FPT_scamInfo[match].state == ID_UNASSIGNED) { - for (k = 0; k < ID_STRING_LENGTH; k++) { - FPT_scamInfo[match].id_string[k] = - p_id_string[k]; - } + if (((p_id_string[0] & 0x06) == 0x02) || ((p_id_string[0] & 0x06) == 0x04)) + match = p_id_string[1] & (UCHAR) 0x1F; + else + match = 7; - FPT_scamInfo[match].id_string[0] |= BIT(7); - FPT_scamInfo[match].state = ID_ASSIGNED; - if (FPT_BL_Card[p_card].pNvRamInfo == NULL) - FPT_BL_Card[p_card].globalFlags |= - F_UPDATE_EEPROM; - return match; + while (i > 0) + { - } + i--; - match--; + if (FPT_scamInfo[match].state == ID_UNASSIGNED) + { + for (k=0; k < ID_STRING_LENGTH; k++) + { + FPT_scamInfo[match].id_string[k] = p_id_string[k]; + } - if (match == 0xFF) { - if (p_id_string[0] & BIT(5)) - match = 7; - else - match = MAX_SCSI_TAR - 1; - } + FPT_scamInfo[match].id_string[0] |= BIT(7); + FPT_scamInfo[match].state = ID_ASSIGNED; + if(FPT_BL_Card[p_card].pNvRamInfo == NULL) + FPT_BL_Card[p_card].globalFlags |= F_UPDATE_EEPROM; + return(match); + + } + + + match--; + + if (match == 0xFF) + { + if (p_id_string[0] & BIT(5)) + match = 7; + else + match = MAX_SCSI_TAR-1; } + } - return NO_ID_AVAIL; + return(NO_ID_AVAIL); } + /*--------------------------------------------------------------------- * * Function: FPT_scsavdi @@ -6440,41 +7015,45 @@ static unsigned char FPT_scmachid(unsigned char p_card, * *---------------------------------------------------------------------*/ -static void FPT_scsavdi(unsigned char p_card, unsigned long p_port) +static void FPT_scsavdi(UCHAR p_card, ULONG p_port) { - unsigned char i, k, max_id; - unsigned short ee_data, sum_data; + UCHAR i,k,max_id; + USHORT ee_data,sum_data; - sum_data = 0x0000; - for (i = 1; i < EE_SCAMBASE / 2; i++) { - sum_data += FPT_utilEERead(p_port, i); - } + sum_data = 0x0000; - FPT_utilEEWriteOnOff(p_port, 1); /* Enable write access to the EEPROM */ + for (i = 1; i < EE_SCAMBASE/2; i++) + { + sum_data += FPT_utilEERead(p_port, i); + } - if (RD_HARPOON(p_port + hp_page_ctrl) & NARROW_SCSI_CARD) - max_id = 0x08; - else - max_id = 0x10; - - for (i = 0; i < max_id; i++) { - - for (k = 0; k < ID_STRING_LENGTH; k += 2) { - ee_data = FPT_scamInfo[i].id_string[k + 1]; - ee_data <<= 8; - ee_data |= FPT_scamInfo[i].id_string[k]; - sum_data += ee_data; - FPT_utilEEWrite(p_port, ee_data, - (unsigned short)((EE_SCAMBASE / 2) + - (unsigned short)(i * - ((unsigned short)ID_STRING_LENGTH / 2)) + (unsigned short)(k / 2))); - } - } + FPT_utilEEWriteOnOff(p_port,1); /* Enable write access to the EEPROM */ + + if (RD_HARPOON(p_port+hp_page_ctrl) & NARROW_SCSI_CARD) + max_id = 0x08; + + else + max_id = 0x10; - FPT_utilEEWrite(p_port, sum_data, EEPROM_CHECK_SUM / 2); - FPT_utilEEWriteOnOff(p_port, 0); /* Turn off write access */ + for (i=0; i < max_id; i++) + { + + for (k=0; k < ID_STRING_LENGTH; k+=2) + { + ee_data = FPT_scamInfo[i].id_string[k+1]; + ee_data <<= 8; + ee_data |= FPT_scamInfo[i].id_string[k]; + sum_data += ee_data; + FPT_utilEEWrite(p_port, ee_data, (USHORT)((EE_SCAMBASE/2) + + (USHORT)(i*((USHORT)ID_STRING_LENGTH/2)) + (USHORT)(k/2))); + } + } + + + FPT_utilEEWrite(p_port, sum_data, EEPROM_CHECK_SUM/2); + FPT_utilEEWriteOnOff(p_port,0); /* Turn off write access */ } /*--------------------------------------------------------------------- @@ -6485,47 +7064,48 @@ static void FPT_scsavdi(unsigned char p_card, unsigned long p_port) * *---------------------------------------------------------------------*/ -static void FPT_XbowInit(unsigned long port, unsigned char ScamFlg) +static void FPT_XbowInit(ULONG port, UCHAR ScamFlg) { - unsigned char i; +UCHAR i; - i = RD_HARPOON(port + hp_page_ctrl); - WR_HARPOON(port + hp_page_ctrl, (unsigned char)(i | G_INT_DISABLE)); + i = RD_HARPOON(port+hp_page_ctrl); + WR_HARPOON(port+hp_page_ctrl, (UCHAR) (i | G_INT_DISABLE)); - WR_HARPOON(port + hp_scsireset, 0x00); - WR_HARPOON(port + hp_portctrl_1, HOST_MODE8); + WR_HARPOON(port+hp_scsireset,0x00); + WR_HARPOON(port+hp_portctrl_1,HOST_MODE8); - WR_HARPOON(port + hp_scsireset, (DMA_RESET | HPSCSI_RESET | PROG_RESET | - FIFO_CLR)); + WR_HARPOON(port+hp_scsireset,(DMA_RESET | HPSCSI_RESET | PROG_RESET | \ + FIFO_CLR)); - WR_HARPOON(port + hp_scsireset, SCSI_INI); + WR_HARPOON(port+hp_scsireset,SCSI_INI); - WR_HARPOON(port + hp_clkctrl_0, CLKCTRL_DEFAULT); + WR_HARPOON(port+hp_clkctrl_0,CLKCTRL_DEFAULT); - WR_HARPOON(port + hp_scsisig, 0x00); /* Clear any signals we might */ - WR_HARPOON(port + hp_scsictrl_0, ENA_SCAM_SEL); + WR_HARPOON(port+hp_scsisig,0x00); /* Clear any signals we might */ + WR_HARPOON(port+hp_scsictrl_0,ENA_SCAM_SEL); - WRW_HARPOON((port + hp_intstat), CLR_ALL_INT); + WRW_HARPOON((port+hp_intstat), CLR_ALL_INT); - FPT_default_intena = RESET | RSEL | PROG_HLT | TIMEOUT | - BUS_FREE | XFER_CNT_0 | AUTO_INT; + FPT_default_intena = RESET | RSEL | PROG_HLT | TIMEOUT | + BUS_FREE | XFER_CNT_0 | AUTO_INT; - if ((ScamFlg & SCAM_ENABLED) && (ScamFlg & SCAM_LEVEL2)) + if ((ScamFlg & SCAM_ENABLED) && (ScamFlg & SCAM_LEVEL2)) FPT_default_intena |= SCAM_SEL; - WRW_HARPOON((port + hp_intena), FPT_default_intena); + WRW_HARPOON((port+hp_intena), FPT_default_intena); - WR_HARPOON(port + hp_seltimeout, TO_290ms); + WR_HARPOON(port+hp_seltimeout,TO_290ms); - /* Turn on SCSI_MODE8 for narrow cards to fix the - strapping issue with the DUAL CHANNEL card */ - if (RD_HARPOON(port + hp_page_ctrl) & NARROW_SCSI_CARD) - WR_HARPOON(port + hp_addstat, SCSI_MODE8); + /* Turn on SCSI_MODE8 for narrow cards to fix the + strapping issue with the DUAL CHANNEL card */ + if (RD_HARPOON(port+hp_page_ctrl) & NARROW_SCSI_CARD) + WR_HARPOON(port+hp_addstat,SCSI_MODE8); - WR_HARPOON(port + hp_page_ctrl, i); + WR_HARPOON(port+hp_page_ctrl, i); } + /*--------------------------------------------------------------------- * * Function: FPT_BusMasterInit @@ -6534,24 +7114,28 @@ static void FPT_XbowInit(unsigned long port, unsigned char ScamFlg) * *---------------------------------------------------------------------*/ -static void FPT_BusMasterInit(unsigned long p_port) +static void FPT_BusMasterInit(ULONG p_port) { - WR_HARPOON(p_port + hp_sys_ctrl, DRVR_RST); - WR_HARPOON(p_port + hp_sys_ctrl, 0x00); - WR_HARPOON(p_port + hp_host_blk_cnt, XFER_BLK64); + WR_HARPOON(p_port+hp_sys_ctrl, DRVR_RST); + WR_HARPOON(p_port+hp_sys_ctrl, 0x00); + + WR_HARPOON(p_port+hp_host_blk_cnt, XFER_BLK64); + - WR_HARPOON(p_port + hp_bm_ctrl, (BMCTRL_DEFAULT)); + WR_HARPOON(p_port+hp_bm_ctrl, (BMCTRL_DEFAULT)); - WR_HARPOON(p_port + hp_ee_ctrl, (SCSI_TERM_ENA_H)); + WR_HARPOON(p_port+hp_ee_ctrl, (SCSI_TERM_ENA_H)); - RD_HARPOON(p_port + hp_int_status); /*Clear interrupts. */ - WR_HARPOON(p_port + hp_int_mask, (INT_CMD_COMPL | SCSI_INTERRUPT)); - WR_HARPOON(p_port + hp_page_ctrl, (RD_HARPOON(p_port + hp_page_ctrl) & - ~SCATTER_EN)); + + RD_HARPOON(p_port+hp_int_status); /*Clear interrupts. */ + WR_HARPOON(p_port+hp_int_mask, (INT_CMD_COMPL | SCSI_INTERRUPT)); + WR_HARPOON(p_port+hp_page_ctrl, (RD_HARPOON(p_port+hp_page_ctrl) & + ~SCATTER_EN)); } + /*--------------------------------------------------------------------- * * Function: FPT_DiagEEPROM @@ -6561,153 +7145,158 @@ static void FPT_BusMasterInit(unsigned long p_port) * *---------------------------------------------------------------------*/ -static void FPT_DiagEEPROM(unsigned long p_port) +static void FPT_DiagEEPROM(ULONG p_port) { - unsigned short index, temp, max_wd_cnt; + USHORT index,temp,max_wd_cnt; - if (RD_HARPOON(p_port + hp_page_ctrl) & NARROW_SCSI_CARD) - max_wd_cnt = EEPROM_WD_CNT; - else - max_wd_cnt = EEPROM_WD_CNT * 2; + if (RD_HARPOON(p_port+hp_page_ctrl) & NARROW_SCSI_CARD) + max_wd_cnt = EEPROM_WD_CNT; + else + max_wd_cnt = EEPROM_WD_CNT * 2; - temp = FPT_utilEERead(p_port, FW_SIGNATURE / 2); + temp = FPT_utilEERead(p_port, FW_SIGNATURE/2); - if (temp == 0x4641) { + if (temp == 0x4641) { - for (index = 2; index < max_wd_cnt; index++) { + for (index = 2; index < max_wd_cnt; index++) { - temp += FPT_utilEERead(p_port, index); + temp += FPT_utilEERead(p_port, index); - } + } - if (temp == FPT_utilEERead(p_port, EEPROM_CHECK_SUM / 2)) { + if (temp == FPT_utilEERead(p_port, EEPROM_CHECK_SUM/2)) { - return; /*EEPROM is Okay so return now! */ - } - } + return; /*EEPROM is Okay so return now! */ + } + } - FPT_utilEEWriteOnOff(p_port, (unsigned char)1); - for (index = 0; index < max_wd_cnt; index++) { + FPT_utilEEWriteOnOff(p_port,(UCHAR)1); - FPT_utilEEWrite(p_port, 0x0000, index); - } + for (index = 0; index < max_wd_cnt; index++) { + + FPT_utilEEWrite(p_port, 0x0000, index); + } - temp = 0; - - FPT_utilEEWrite(p_port, 0x4641, FW_SIGNATURE / 2); - temp += 0x4641; - FPT_utilEEWrite(p_port, 0x3920, MODEL_NUMB_0 / 2); - temp += 0x3920; - FPT_utilEEWrite(p_port, 0x3033, MODEL_NUMB_2 / 2); - temp += 0x3033; - FPT_utilEEWrite(p_port, 0x2020, MODEL_NUMB_4 / 2); - temp += 0x2020; - FPT_utilEEWrite(p_port, 0x70D3, SYSTEM_CONFIG / 2); - temp += 0x70D3; - FPT_utilEEWrite(p_port, 0x0010, BIOS_CONFIG / 2); - temp += 0x0010; - FPT_utilEEWrite(p_port, 0x0003, SCAM_CONFIG / 2); - temp += 0x0003; - FPT_utilEEWrite(p_port, 0x0007, ADAPTER_SCSI_ID / 2); - temp += 0x0007; - - FPT_utilEEWrite(p_port, 0x0000, IGNORE_B_SCAN / 2); - temp += 0x0000; - FPT_utilEEWrite(p_port, 0x0000, SEND_START_ENA / 2); - temp += 0x0000; - FPT_utilEEWrite(p_port, 0x0000, DEVICE_ENABLE / 2); - temp += 0x0000; - - FPT_utilEEWrite(p_port, 0x4242, SYNC_RATE_TBL01 / 2); - temp += 0x4242; - FPT_utilEEWrite(p_port, 0x4242, SYNC_RATE_TBL23 / 2); - temp += 0x4242; - FPT_utilEEWrite(p_port, 0x4242, SYNC_RATE_TBL45 / 2); - temp += 0x4242; - FPT_utilEEWrite(p_port, 0x4242, SYNC_RATE_TBL67 / 2); - temp += 0x4242; - FPT_utilEEWrite(p_port, 0x4242, SYNC_RATE_TBL89 / 2); - temp += 0x4242; - FPT_utilEEWrite(p_port, 0x4242, SYNC_RATE_TBLab / 2); - temp += 0x4242; - FPT_utilEEWrite(p_port, 0x4242, SYNC_RATE_TBLcd / 2); - temp += 0x4242; - FPT_utilEEWrite(p_port, 0x4242, SYNC_RATE_TBLef / 2); - temp += 0x4242; - - FPT_utilEEWrite(p_port, 0x6C46, 64 / 2); /*PRODUCT ID */ - temp += 0x6C46; - FPT_utilEEWrite(p_port, 0x7361, 66 / 2); /* FlashPoint LT */ - temp += 0x7361; - FPT_utilEEWrite(p_port, 0x5068, 68 / 2); - temp += 0x5068; - FPT_utilEEWrite(p_port, 0x696F, 70 / 2); - temp += 0x696F; - FPT_utilEEWrite(p_port, 0x746E, 72 / 2); - temp += 0x746E; - FPT_utilEEWrite(p_port, 0x4C20, 74 / 2); - temp += 0x4C20; - FPT_utilEEWrite(p_port, 0x2054, 76 / 2); - temp += 0x2054; - FPT_utilEEWrite(p_port, 0x2020, 78 / 2); - temp += 0x2020; - - index = ((EE_SCAMBASE / 2) + (7 * 16)); - FPT_utilEEWrite(p_port, (0x0700 + TYPE_CODE0), index); - temp += (0x0700 + TYPE_CODE0); - index++; - FPT_utilEEWrite(p_port, 0x5542, index); /*Vendor ID code */ - temp += 0x5542; /* BUSLOGIC */ - index++; - FPT_utilEEWrite(p_port, 0x4C53, index); - temp += 0x4C53; - index++; - FPT_utilEEWrite(p_port, 0x474F, index); - temp += 0x474F; - index++; - FPT_utilEEWrite(p_port, 0x4349, index); - temp += 0x4349; - index++; - FPT_utilEEWrite(p_port, 0x5442, index); /*Vendor unique code */ - temp += 0x5442; /* BT- 930 */ - index++; - FPT_utilEEWrite(p_port, 0x202D, index); - temp += 0x202D; - index++; - FPT_utilEEWrite(p_port, 0x3339, index); - temp += 0x3339; - index++; /*Serial # */ - FPT_utilEEWrite(p_port, 0x2030, index); /* 01234567 */ - temp += 0x2030; - index++; - FPT_utilEEWrite(p_port, 0x5453, index); - temp += 0x5453; - index++; - FPT_utilEEWrite(p_port, 0x5645, index); - temp += 0x5645; - index++; - FPT_utilEEWrite(p_port, 0x2045, index); - temp += 0x2045; - index++; - FPT_utilEEWrite(p_port, 0x202F, index); - temp += 0x202F; - index++; - FPT_utilEEWrite(p_port, 0x4F4A, index); - temp += 0x4F4A; - index++; - FPT_utilEEWrite(p_port, 0x204E, index); - temp += 0x204E; - index++; - FPT_utilEEWrite(p_port, 0x3539, index); - temp += 0x3539; - - FPT_utilEEWrite(p_port, temp, EEPROM_CHECK_SUM / 2); - - FPT_utilEEWriteOnOff(p_port, (unsigned char)0); + temp = 0; + + FPT_utilEEWrite(p_port, 0x4641, FW_SIGNATURE/2); + temp += 0x4641; + FPT_utilEEWrite(p_port, 0x3920, MODEL_NUMB_0/2); + temp += 0x3920; + FPT_utilEEWrite(p_port, 0x3033, MODEL_NUMB_2/2); + temp += 0x3033; + FPT_utilEEWrite(p_port, 0x2020, MODEL_NUMB_4/2); + temp += 0x2020; + FPT_utilEEWrite(p_port, 0x70D3, SYSTEM_CONFIG/2); + temp += 0x70D3; + FPT_utilEEWrite(p_port, 0x0010, BIOS_CONFIG/2); + temp += 0x0010; + FPT_utilEEWrite(p_port, 0x0003, SCAM_CONFIG/2); + temp += 0x0003; + FPT_utilEEWrite(p_port, 0x0007, ADAPTER_SCSI_ID/2); + temp += 0x0007; + + FPT_utilEEWrite(p_port, 0x0000, IGNORE_B_SCAN/2); + temp += 0x0000; + FPT_utilEEWrite(p_port, 0x0000, SEND_START_ENA/2); + temp += 0x0000; + FPT_utilEEWrite(p_port, 0x0000, DEVICE_ENABLE/2); + temp += 0x0000; + + FPT_utilEEWrite(p_port, 0x4242, SYNC_RATE_TBL01/2); + temp += 0x4242; + FPT_utilEEWrite(p_port, 0x4242, SYNC_RATE_TBL23/2); + temp += 0x4242; + FPT_utilEEWrite(p_port, 0x4242, SYNC_RATE_TBL45/2); + temp += 0x4242; + FPT_utilEEWrite(p_port, 0x4242, SYNC_RATE_TBL67/2); + temp += 0x4242; + FPT_utilEEWrite(p_port, 0x4242, SYNC_RATE_TBL89/2); + temp += 0x4242; + FPT_utilEEWrite(p_port, 0x4242, SYNC_RATE_TBLab/2); + temp += 0x4242; + FPT_utilEEWrite(p_port, 0x4242, SYNC_RATE_TBLcd/2); + temp += 0x4242; + FPT_utilEEWrite(p_port, 0x4242, SYNC_RATE_TBLef/2); + temp += 0x4242; + + + FPT_utilEEWrite(p_port, 0x6C46, 64/2); /*PRODUCT ID */ + temp += 0x6C46; + FPT_utilEEWrite(p_port, 0x7361, 66/2); /* FlashPoint LT */ + temp += 0x7361; + FPT_utilEEWrite(p_port, 0x5068, 68/2); + temp += 0x5068; + FPT_utilEEWrite(p_port, 0x696F, 70/2); + temp += 0x696F; + FPT_utilEEWrite(p_port, 0x746E, 72/2); + temp += 0x746E; + FPT_utilEEWrite(p_port, 0x4C20, 74/2); + temp += 0x4C20; + FPT_utilEEWrite(p_port, 0x2054, 76/2); + temp += 0x2054; + FPT_utilEEWrite(p_port, 0x2020, 78/2); + temp += 0x2020; + + index = ((EE_SCAMBASE/2)+(7*16)); + FPT_utilEEWrite(p_port, (0x0700+TYPE_CODE0), index); + temp += (0x0700+TYPE_CODE0); + index++; + FPT_utilEEWrite(p_port, 0x5542, index); /*Vendor ID code */ + temp += 0x5542; /* BUSLOGIC */ + index++; + FPT_utilEEWrite(p_port, 0x4C53, index); + temp += 0x4C53; + index++; + FPT_utilEEWrite(p_port, 0x474F, index); + temp += 0x474F; + index++; + FPT_utilEEWrite(p_port, 0x4349, index); + temp += 0x4349; + index++; + FPT_utilEEWrite(p_port, 0x5442, index); /*Vendor unique code */ + temp += 0x5442; /* BT- 930 */ + index++; + FPT_utilEEWrite(p_port, 0x202D, index); + temp += 0x202D; + index++; + FPT_utilEEWrite(p_port, 0x3339, index); + temp += 0x3339; + index++; /*Serial # */ + FPT_utilEEWrite(p_port, 0x2030, index); /* 01234567 */ + temp += 0x2030; + index++; + FPT_utilEEWrite(p_port, 0x5453, index); + temp += 0x5453; + index++; + FPT_utilEEWrite(p_port, 0x5645, index); + temp += 0x5645; + index++; + FPT_utilEEWrite(p_port, 0x2045, index); + temp += 0x2045; + index++; + FPT_utilEEWrite(p_port, 0x202F, index); + temp += 0x202F; + index++; + FPT_utilEEWrite(p_port, 0x4F4A, index); + temp += 0x4F4A; + index++; + FPT_utilEEWrite(p_port, 0x204E, index); + temp += 0x204E; + index++; + FPT_utilEEWrite(p_port, 0x3539, index); + temp += 0x3539; + + + + FPT_utilEEWrite(p_port, temp, EEPROM_CHECK_SUM/2); + + FPT_utilEEWriteOnOff(p_port,(UCHAR)0); } + /*--------------------------------------------------------------------- * * Function: Queue Search Select @@ -6716,127 +7305,103 @@ static void FPT_DiagEEPROM(unsigned long p_port) * *---------------------------------------------------------------------*/ -static void FPT_queueSearchSelect(struct sccb_card *pCurrCard, - unsigned char p_card) +static void FPT_queueSearchSelect(PSCCBcard pCurrCard, UCHAR p_card) { - unsigned char scan_ptr, lun; - struct sccb_mgr_tar_info *currTar_Info; - struct sccb *pOldSccb; + UCHAR scan_ptr, lun; + PSCCBMgr_tar_info currTar_Info; + PSCCB pOldSccb; - scan_ptr = pCurrCard->scanIndex; - do { + scan_ptr = pCurrCard->scanIndex; + do + { currTar_Info = &FPT_sccbMgrTbl[p_card][scan_ptr]; - if ((pCurrCard->globalFlags & F_CONLUN_IO) && - ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) != - TAG_Q_TRYING)) { - if (currTar_Info->TarSelQ_Cnt != 0) { + if((pCurrCard->globalFlags & F_CONLUN_IO) && + ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING)) + { + if (currTar_Info->TarSelQ_Cnt != 0) + { scan_ptr++; if (scan_ptr == MAX_SCSI_TAR) scan_ptr = 0; + + for(lun=0; lun < MAX_LUN; lun++) + { + if(currTar_Info->TarLUNBusy[lun] == 0) + { - for (lun = 0; lun < MAX_LUN; lun++) { - if (currTar_Info->TarLUNBusy[lun] == 0) { - - pCurrCard->currentSCCB = - currTar_Info->TarSelQ_Head; + pCurrCard->currentSCCB = currTar_Info->TarSelQ_Head; pOldSccb = NULL; - while ((pCurrCard-> - currentSCCB != NULL) - && (lun != - pCurrCard-> - currentSCCB->Lun)) { - pOldSccb = - pCurrCard-> - currentSCCB; - pCurrCard->currentSCCB = - (struct sccb - *)(pCurrCard-> - currentSCCB)-> - Sccb_forwardlink; + while((pCurrCard->currentSCCB != NULL) && + (lun != pCurrCard->currentSCCB->Lun)) + { + pOldSccb = pCurrCard->currentSCCB; + pCurrCard->currentSCCB = (PSCCB)(pCurrCard->currentSCCB)-> + Sccb_forwardlink; } - if (pCurrCard->currentSCCB == - NULL) + if(pCurrCard->currentSCCB == NULL) continue; - if (pOldSccb != NULL) { - pOldSccb-> - Sccb_forwardlink = - (struct sccb - *)(pCurrCard-> - currentSCCB)-> - Sccb_forwardlink; - pOldSccb-> - Sccb_backlink = - (struct sccb - *)(pCurrCard-> - currentSCCB)-> - Sccb_backlink; - currTar_Info-> - TarSelQ_Cnt--; - } else { - currTar_Info-> - TarSelQ_Head = - (struct sccb - *)(pCurrCard-> - currentSCCB)-> - Sccb_forwardlink; - - if (currTar_Info-> - TarSelQ_Head == - NULL) { - currTar_Info-> - TarSelQ_Tail - = NULL; - currTar_Info-> - TarSelQ_Cnt - = 0; - } else { - currTar_Info-> - TarSelQ_Cnt--; - currTar_Info-> - TarSelQ_Head-> - Sccb_backlink - = - (struct sccb - *)NULL; + if(pOldSccb != NULL) + { + pOldSccb->Sccb_forwardlink = (PSCCB)(pCurrCard->currentSCCB)-> + Sccb_forwardlink; + pOldSccb->Sccb_backlink = (PSCCB)(pCurrCard->currentSCCB)-> + Sccb_backlink; + currTar_Info->TarSelQ_Cnt--; + } + else + { + currTar_Info->TarSelQ_Head = (PSCCB)(pCurrCard->currentSCCB)->Sccb_forwardlink; + + if (currTar_Info->TarSelQ_Head == NULL) + { + currTar_Info->TarSelQ_Tail = NULL; + currTar_Info->TarSelQ_Cnt = 0; + } + else + { + currTar_Info->TarSelQ_Cnt--; + currTar_Info->TarSelQ_Head->Sccb_backlink = (PSCCB)NULL; } } - pCurrCard->scanIndex = scan_ptr; + pCurrCard->scanIndex = scan_ptr; - pCurrCard->globalFlags |= - F_NEW_SCCB_CMD; + pCurrCard->globalFlags |= F_NEW_SCCB_CMD; - break; + break; } } } - else { + else + { scan_ptr++; if (scan_ptr == MAX_SCSI_TAR) { scan_ptr = 0; } } - } else { + } + else + { if ((currTar_Info->TarSelQ_Cnt != 0) && - (currTar_Info->TarLUNBusy[0] == 0)) { + (currTar_Info->TarLUNBusy[0] == 0)) + { - pCurrCard->currentSCCB = - currTar_Info->TarSelQ_Head; + pCurrCard->currentSCCB = currTar_Info->TarSelQ_Head; - currTar_Info->TarSelQ_Head = - (struct sccb *)(pCurrCard->currentSCCB)-> - Sccb_forwardlink; + currTar_Info->TarSelQ_Head = (PSCCB)(pCurrCard->currentSCCB)->Sccb_forwardlink; - if (currTar_Info->TarSelQ_Head == NULL) { + if (currTar_Info->TarSelQ_Head == NULL) + { currTar_Info->TarSelQ_Tail = NULL; currTar_Info->TarSelQ_Cnt = 0; - } else { + } + else + { currTar_Info->TarSelQ_Cnt--; - currTar_Info->TarSelQ_Head-> - Sccb_backlink = (struct sccb *)NULL; + currTar_Info->TarSelQ_Head->Sccb_backlink = (PSCCB)NULL; } scan_ptr++; @@ -6850,9 +7415,11 @@ static void FPT_queueSearchSelect(struct sccb_card *pCurrCard, break; } - else { + else + { scan_ptr++; - if (scan_ptr == MAX_SCSI_TAR) { + if (scan_ptr == MAX_SCSI_TAR) + { scan_ptr = 0; } } @@ -6860,6 +7427,7 @@ static void FPT_queueSearchSelect(struct sccb_card *pCurrCard, } while (scan_ptr != pCurrCard->scanIndex); } + /*--------------------------------------------------------------------- * * Function: Queue Select Fail @@ -6868,39 +7436,37 @@ static void FPT_queueSearchSelect(struct sccb_card *pCurrCard, * *---------------------------------------------------------------------*/ -static void FPT_queueSelectFail(struct sccb_card *pCurrCard, - unsigned char p_card) +static void FPT_queueSelectFail(PSCCBcard pCurrCard, UCHAR p_card) { - unsigned char thisTarg; - struct sccb_mgr_tar_info *currTar_Info; + UCHAR thisTarg; + PSCCBMgr_tar_info currTar_Info; - if (pCurrCard->currentSCCB != NULL) { - thisTarg = - (unsigned char)(((struct sccb *)(pCurrCard->currentSCCB))-> - TargID); - currTar_Info = &FPT_sccbMgrTbl[p_card][thisTarg]; + if (pCurrCard->currentSCCB != NULL) + { + thisTarg = (UCHAR)(((PSCCB)(pCurrCard->currentSCCB))->TargID); + currTar_Info = &FPT_sccbMgrTbl[p_card][thisTarg]; - pCurrCard->currentSCCB->Sccb_backlink = (struct sccb *)NULL; + pCurrCard->currentSCCB->Sccb_backlink = (PSCCB)NULL; - pCurrCard->currentSCCB->Sccb_forwardlink = - currTar_Info->TarSelQ_Head; + pCurrCard->currentSCCB->Sccb_forwardlink = currTar_Info->TarSelQ_Head; - if (currTar_Info->TarSelQ_Cnt == 0) { - currTar_Info->TarSelQ_Tail = pCurrCard->currentSCCB; - } + if (currTar_Info->TarSelQ_Cnt == 0) + { + currTar_Info->TarSelQ_Tail = pCurrCard->currentSCCB; + } - else { - currTar_Info->TarSelQ_Head->Sccb_backlink = - pCurrCard->currentSCCB; - } + else + { + currTar_Info->TarSelQ_Head->Sccb_backlink = pCurrCard->currentSCCB; + } - currTar_Info->TarSelQ_Head = pCurrCard->currentSCCB; - pCurrCard->currentSCCB = NULL; - currTar_Info->TarSelQ_Cnt++; - } -} + currTar_Info->TarSelQ_Head = pCurrCard->currentSCCB; + pCurrCard->currentSCCB = NULL; + currTar_Info->TarSelQ_Cnt++; + } +} /*--------------------------------------------------------------------- * * Function: Queue Command Complete @@ -6909,97 +7475,101 @@ static void FPT_queueSelectFail(struct sccb_card *pCurrCard, * *---------------------------------------------------------------------*/ -static void FPT_queueCmdComplete(struct sccb_card *pCurrCard, - struct sccb *p_sccb, unsigned char p_card) +static void FPT_queueCmdComplete(PSCCBcard pCurrCard, PSCCB p_sccb, + UCHAR p_card) { - unsigned char i, SCSIcmd; - CALL_BK_FN callback; - struct sccb_mgr_tar_info *currTar_Info; - - SCSIcmd = p_sccb->Cdb[0]; - - if (!(p_sccb->Sccb_XferState & F_ALL_XFERRED)) { - - if ((p_sccb-> - ControlByte & (SCCB_DATA_XFER_OUT | SCCB_DATA_XFER_IN)) - && (p_sccb->HostStatus == SCCB_COMPLETE) - && (p_sccb->TargetStatus != SSCHECK)) - - if ((SCSIcmd == SCSI_READ) || - (SCSIcmd == SCSI_WRITE) || - (SCSIcmd == SCSI_READ_EXTENDED) || - (SCSIcmd == SCSI_WRITE_EXTENDED) || - (SCSIcmd == SCSI_WRITE_AND_VERIFY) || - (SCSIcmd == SCSI_START_STOP_UNIT) || - (pCurrCard->globalFlags & F_NO_FILTER) - ) - p_sccb->HostStatus = SCCB_DATA_UNDER_RUN; - } + UCHAR i, SCSIcmd; + CALL_BK_FN callback; + PSCCBMgr_tar_info currTar_Info; - if (p_sccb->SccbStatus == SCCB_IN_PROCESS) { - if (p_sccb->HostStatus || p_sccb->TargetStatus) - p_sccb->SccbStatus = SCCB_ERROR; - else - p_sccb->SccbStatus = SCCB_SUCCESS; - } + SCSIcmd = p_sccb->Cdb[0]; - if (p_sccb->Sccb_XferState & F_AUTO_SENSE) { - p_sccb->CdbLength = p_sccb->Save_CdbLen; - for (i = 0; i < 6; i++) { - p_sccb->Cdb[i] = p_sccb->Save_Cdb[i]; - } - } + if (!(p_sccb->Sccb_XferState & F_ALL_XFERRED)) { - if ((p_sccb->OperationCode == RESIDUAL_SG_COMMAND) || - (p_sccb->OperationCode == RESIDUAL_COMMAND)) { + if ((p_sccb->ControlByte & (SCCB_DATA_XFER_OUT | SCCB_DATA_XFER_IN)) && + (p_sccb->HostStatus == SCCB_COMPLETE) && + (p_sccb->TargetStatus != SSCHECK)) - FPT_utilUpdateResidual(p_sccb); + if ((SCSIcmd == SCSI_READ) || + (SCSIcmd == SCSI_WRITE) || + (SCSIcmd == SCSI_READ_EXTENDED) || + (SCSIcmd == SCSI_WRITE_EXTENDED) || + (SCSIcmd == SCSI_WRITE_AND_VERIFY) || + (SCSIcmd == SCSI_START_STOP_UNIT) || + (pCurrCard->globalFlags & F_NO_FILTER) + ) + p_sccb->HostStatus = SCCB_DATA_UNDER_RUN; + } + + + if(p_sccb->SccbStatus == SCCB_IN_PROCESS) + { + if (p_sccb->HostStatus || p_sccb->TargetStatus) + p_sccb->SccbStatus = SCCB_ERROR; + else + p_sccb->SccbStatus = SCCB_SUCCESS; } - pCurrCard->cmdCounter--; - if (!pCurrCard->cmdCounter) { + if (p_sccb->Sccb_XferState & F_AUTO_SENSE) { - if (pCurrCard->globalFlags & F_GREEN_PC) { - WR_HARPOON(pCurrCard->ioPort + hp_clkctrl_0, - (PWR_DWN | CLKCTRL_DEFAULT)); - WR_HARPOON(pCurrCard->ioPort + hp_sys_ctrl, STOP_CLK); - } + p_sccb->CdbLength = p_sccb->Save_CdbLen; + for (i=0; i < 6; i++) { + p_sccb->Cdb[i] = p_sccb->Save_Cdb[i]; + } + } - WR_HARPOON(pCurrCard->ioPort + hp_semaphore, - (RD_HARPOON(pCurrCard->ioPort + hp_semaphore) & - ~SCCB_MGR_ACTIVE)); + if ((p_sccb->OperationCode == RESIDUAL_SG_COMMAND) || + (p_sccb->OperationCode == RESIDUAL_COMMAND)) { - } + FPT_utilUpdateResidual(p_sccb); + } + + pCurrCard->cmdCounter--; + if (!pCurrCard->cmdCounter) { + + if (pCurrCard->globalFlags & F_GREEN_PC) { + WR_HARPOON(pCurrCard->ioPort+hp_clkctrl_0,(PWR_DWN | CLKCTRL_DEFAULT)); + WR_HARPOON(pCurrCard->ioPort+hp_sys_ctrl, STOP_CLK); + } - if (pCurrCard->discQCount != 0) { - currTar_Info = &FPT_sccbMgrTbl[p_card][p_sccb->TargID]; - if (((pCurrCard->globalFlags & F_CONLUN_IO) && - ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) != - TAG_Q_TRYING))) { + WR_HARPOON(pCurrCard->ioPort+hp_semaphore, + (RD_HARPOON(pCurrCard->ioPort+hp_semaphore) & ~SCCB_MGR_ACTIVE)); + + } + + if(pCurrCard->discQCount != 0) + { + currTar_Info = &FPT_sccbMgrTbl[p_card][p_sccb->TargID]; + if(((pCurrCard->globalFlags & F_CONLUN_IO) && + ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))) + { pCurrCard->discQCount--; - pCurrCard->discQ_Tbl[currTar_Info-> - LunDiscQ_Idx[p_sccb->Lun]] = NULL; - } else { - if (p_sccb->Sccb_tag) { + pCurrCard->discQ_Tbl[currTar_Info->LunDiscQ_Idx[p_sccb->Lun]] = NULL; + } + else + { + if(p_sccb->Sccb_tag) + { pCurrCard->discQCount--; pCurrCard->discQ_Tbl[p_sccb->Sccb_tag] = NULL; - } else { + }else + { pCurrCard->discQCount--; - pCurrCard->discQ_Tbl[currTar_Info-> - LunDiscQ_Idx[0]] = NULL; + pCurrCard->discQ_Tbl[currTar_Info->LunDiscQ_Idx[0]] = NULL; } } } - callback = (CALL_BK_FN) p_sccb->SccbCallback; - callback(p_sccb); - pCurrCard->globalFlags |= F_NEW_SCCB_CMD; - pCurrCard->currentSCCB = NULL; + callback = (CALL_BK_FN)p_sccb->SccbCallback; + callback(p_sccb); + pCurrCard->globalFlags |= F_NEW_SCCB_CMD; + pCurrCard->currentSCCB = NULL; } + /*--------------------------------------------------------------------- * * Function: Queue Disconnect @@ -7007,32 +7577,33 @@ static void FPT_queueCmdComplete(struct sccb_card *pCurrCard, * Description: Add SCCB to our disconnect array. * *---------------------------------------------------------------------*/ -static void FPT_queueDisconnect(struct sccb *p_sccb, unsigned char p_card) +static void FPT_queueDisconnect(PSCCB p_sccb, UCHAR p_card) { - struct sccb_mgr_tar_info *currTar_Info; + PSCCBMgr_tar_info currTar_Info; currTar_Info = &FPT_sccbMgrTbl[p_card][p_sccb->TargID]; - if (((FPT_BL_Card[p_card].globalFlags & F_CONLUN_IO) && - ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))) { - FPT_BL_Card[p_card].discQ_Tbl[currTar_Info-> - LunDiscQ_Idx[p_sccb->Lun]] = - p_sccb; - } else { - if (p_sccb->Sccb_tag) { - FPT_BL_Card[p_card].discQ_Tbl[p_sccb->Sccb_tag] = - p_sccb; - FPT_sccbMgrTbl[p_card][p_sccb->TargID].TarLUNBusy[0] = - 0; + if(((FPT_BL_Card[p_card].globalFlags & F_CONLUN_IO) && + ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))) + { + FPT_BL_Card[p_card].discQ_Tbl[currTar_Info->LunDiscQ_Idx[p_sccb->Lun]] = p_sccb; + } + else + { + if (p_sccb->Sccb_tag) + { + FPT_BL_Card[p_card].discQ_Tbl[p_sccb->Sccb_tag] = p_sccb; + FPT_sccbMgrTbl[p_card][p_sccb->TargID].TarLUNBusy[0] = 0; FPT_sccbMgrTbl[p_card][p_sccb->TargID].TarTagQ_Cnt++; - } else { - FPT_BL_Card[p_card].discQ_Tbl[currTar_Info-> - LunDiscQ_Idx[0]] = p_sccb; + }else + { + FPT_BL_Card[p_card].discQ_Tbl[currTar_Info->LunDiscQ_Idx[0]] = p_sccb; } } FPT_BL_Card[p_card].currentSCCB = NULL; } + /*--------------------------------------------------------------------- * * Function: Queue Flush SCCB @@ -7041,35 +7612,33 @@ static void FPT_queueDisconnect(struct sccb *p_sccb, unsigned char p_card) * *---------------------------------------------------------------------*/ -static void FPT_queueFlushSccb(unsigned char p_card, unsigned char error_code) +static void FPT_queueFlushSccb(UCHAR p_card, UCHAR error_code) { - unsigned char qtag, thisTarg; - struct sccb *currSCCB; - struct sccb_mgr_tar_info *currTar_Info; - - currSCCB = FPT_BL_Card[p_card].currentSCCB; - if (currSCCB != NULL) { - thisTarg = (unsigned char)currSCCB->TargID; - currTar_Info = &FPT_sccbMgrTbl[p_card][thisTarg]; + UCHAR qtag,thisTarg; + PSCCB currSCCB; + PSCCBMgr_tar_info currTar_Info; - for (qtag = 0; qtag < QUEUE_DEPTH; qtag++) { + currSCCB = FPT_BL_Card[p_card].currentSCCB; + if(currSCCB != NULL) + { + thisTarg = (UCHAR)currSCCB->TargID; + currTar_Info = &FPT_sccbMgrTbl[p_card][thisTarg]; - if (FPT_BL_Card[p_card].discQ_Tbl[qtag] && - (FPT_BL_Card[p_card].discQ_Tbl[qtag]->TargID == - thisTarg)) { + for (qtag=0; qtag - HostStatus = (unsigned char)error_code; + if (FPT_BL_Card[p_card].discQ_Tbl[qtag] && + (FPT_BL_Card[p_card].discQ_Tbl[qtag]->TargID == thisTarg)) + { - FPT_queueCmdComplete(&FPT_BL_Card[p_card], - FPT_BL_Card[p_card]. - discQ_Tbl[qtag], p_card); + FPT_BL_Card[p_card].discQ_Tbl[qtag]->HostStatus = (UCHAR)error_code; + + FPT_queueCmdComplete(&FPT_BL_Card[p_card],FPT_BL_Card[p_card].discQ_Tbl[qtag], p_card); - FPT_BL_Card[p_card].discQ_Tbl[qtag] = NULL; - currTar_Info->TarTagQ_Cnt--; + FPT_BL_Card[p_card].discQ_Tbl[qtag] = NULL; + currTar_Info->TarTagQ_Cnt--; - } - } + } + } } } @@ -7082,57 +7651,61 @@ static void FPT_queueFlushSccb(unsigned char p_card, unsigned char error_code) * *---------------------------------------------------------------------*/ -static void FPT_queueFlushTargSccb(unsigned char p_card, unsigned char thisTarg, - unsigned char error_code) +static void FPT_queueFlushTargSccb(UCHAR p_card, UCHAR thisTarg, + UCHAR error_code) { - unsigned char qtag; - struct sccb_mgr_tar_info *currTar_Info; + UCHAR qtag; + PSCCBMgr_tar_info currTar_Info; - currTar_Info = &FPT_sccbMgrTbl[p_card][thisTarg]; + currTar_Info = &FPT_sccbMgrTbl[p_card][thisTarg]; - for (qtag = 0; qtag < QUEUE_DEPTH; qtag++) { + for (qtag=0; qtagTargID == thisTarg)) { + if (FPT_BL_Card[p_card].discQ_Tbl[qtag] && + (FPT_BL_Card[p_card].discQ_Tbl[qtag]->TargID == thisTarg)) + { - FPT_BL_Card[p_card].discQ_Tbl[qtag]->HostStatus = - (unsigned char)error_code; + FPT_BL_Card[p_card].discQ_Tbl[qtag]->HostStatus = (UCHAR)error_code; - FPT_queueCmdComplete(&FPT_BL_Card[p_card], - FPT_BL_Card[p_card]. - discQ_Tbl[qtag], p_card); + FPT_queueCmdComplete(&FPT_BL_Card[p_card],FPT_BL_Card[p_card].discQ_Tbl[qtag], p_card); - FPT_BL_Card[p_card].discQ_Tbl[qtag] = NULL; - currTar_Info->TarTagQ_Cnt--; + FPT_BL_Card[p_card].discQ_Tbl[qtag] = NULL; + currTar_Info->TarTagQ_Cnt--; - } - } + } + } } -static void FPT_queueAddSccb(struct sccb *p_SCCB, unsigned char p_card) + + + + +static void FPT_queueAddSccb(PSCCB p_SCCB, UCHAR p_card) { - struct sccb_mgr_tar_info *currTar_Info; - currTar_Info = &FPT_sccbMgrTbl[p_card][p_SCCB->TargID]; + PSCCBMgr_tar_info currTar_Info; + currTar_Info = &FPT_sccbMgrTbl[p_card][p_SCCB->TargID]; - p_SCCB->Sccb_forwardlink = NULL; + p_SCCB->Sccb_forwardlink = NULL; - p_SCCB->Sccb_backlink = currTar_Info->TarSelQ_Tail; + p_SCCB->Sccb_backlink = currTar_Info->TarSelQ_Tail; - if (currTar_Info->TarSelQ_Cnt == 0) { + if (currTar_Info->TarSelQ_Cnt == 0) { - currTar_Info->TarSelQ_Head = p_SCCB; - } + currTar_Info->TarSelQ_Head = p_SCCB; + } - else { + else { - currTar_Info->TarSelQ_Tail->Sccb_forwardlink = p_SCCB; - } + currTar_Info->TarSelQ_Tail->Sccb_forwardlink = p_SCCB; + } - currTar_Info->TarSelQ_Tail = p_SCCB; - currTar_Info->TarSelQ_Cnt++; + + currTar_Info->TarSelQ_Tail = p_SCCB; + currTar_Info->TarSelQ_Cnt++; } + /*--------------------------------------------------------------------- * * Function: Queue Find SCCB @@ -7142,56 +7715,54 @@ static void FPT_queueAddSccb(struct sccb *p_SCCB, unsigned char p_card) * *---------------------------------------------------------------------*/ -static unsigned char FPT_queueFindSccb(struct sccb *p_SCCB, - unsigned char p_card) +static UCHAR FPT_queueFindSccb(PSCCB p_SCCB, UCHAR p_card) { - struct sccb *q_ptr; - struct sccb_mgr_tar_info *currTar_Info; + PSCCB q_ptr; + PSCCBMgr_tar_info currTar_Info; - currTar_Info = &FPT_sccbMgrTbl[p_card][p_SCCB->TargID]; + currTar_Info = &FPT_sccbMgrTbl[p_card][p_SCCB->TargID]; - q_ptr = currTar_Info->TarSelQ_Head; + q_ptr = currTar_Info->TarSelQ_Head; - while (q_ptr != NULL) { + while(q_ptr != NULL) { - if (q_ptr == p_SCCB) { + if (q_ptr == p_SCCB) { - if (currTar_Info->TarSelQ_Head == q_ptr) { - currTar_Info->TarSelQ_Head = - q_ptr->Sccb_forwardlink; + if (currTar_Info->TarSelQ_Head == q_ptr) { + + currTar_Info->TarSelQ_Head = q_ptr->Sccb_forwardlink; } - if (currTar_Info->TarSelQ_Tail == q_ptr) { + if (currTar_Info->TarSelQ_Tail == q_ptr) { - currTar_Info->TarSelQ_Tail = - q_ptr->Sccb_backlink; + currTar_Info->TarSelQ_Tail = q_ptr->Sccb_backlink; } - if (q_ptr->Sccb_forwardlink != NULL) { - q_ptr->Sccb_forwardlink->Sccb_backlink = - q_ptr->Sccb_backlink; + if (q_ptr->Sccb_forwardlink != NULL) { + q_ptr->Sccb_forwardlink->Sccb_backlink = q_ptr->Sccb_backlink; } - if (q_ptr->Sccb_backlink != NULL) { - q_ptr->Sccb_backlink->Sccb_forwardlink = - q_ptr->Sccb_forwardlink; + if (q_ptr->Sccb_backlink != NULL) { + q_ptr->Sccb_backlink->Sccb_forwardlink = q_ptr->Sccb_forwardlink; } - currTar_Info->TarSelQ_Cnt--; + currTar_Info->TarSelQ_Cnt--; - return 1; - } + return(1); + } - else { - q_ptr = q_ptr->Sccb_forwardlink; - } - } + else { + q_ptr = q_ptr->Sccb_forwardlink; + } + } - return 0; + + return(0); } + /*--------------------------------------------------------------------- * * Function: Utility Update Residual Count @@ -7205,47 +7776,48 @@ static unsigned char FPT_queueFindSccb(struct sccb *p_SCCB, * *---------------------------------------------------------------------*/ -static void FPT_utilUpdateResidual(struct sccb *p_SCCB) +static void FPT_utilUpdateResidual(PSCCB p_SCCB) { - unsigned long partial_cnt; - unsigned int sg_index; - unsigned long *sg_ptr; + ULONG partial_cnt; + UINT sg_index; + ULONG *sg_ptr; - if (p_SCCB->Sccb_XferState & F_ALL_XFERRED) { + if (p_SCCB->Sccb_XferState & F_ALL_XFERRED) { - p_SCCB->DataLength = 0x0000; - } + p_SCCB->DataLength = 0x0000; + } - else if (p_SCCB->Sccb_XferState & F_SG_XFER) { + else if (p_SCCB->Sccb_XferState & F_SG_XFER) { - partial_cnt = 0x0000; + partial_cnt = 0x0000; - sg_index = p_SCCB->Sccb_sgseg; + sg_index = p_SCCB->Sccb_sgseg; - sg_ptr = (unsigned long *)p_SCCB->DataPointer; + sg_ptr = (ULONG *)p_SCCB->DataPointer; - if (p_SCCB->Sccb_SGoffset) { + if (p_SCCB->Sccb_SGoffset) { partial_cnt = p_SCCB->Sccb_SGoffset; sg_index++; - } + } - while (((unsigned long)sg_index * - (unsigned long)SG_ELEMENT_SIZE) < p_SCCB->DataLength) { + while ( ((ULONG)sg_index * (ULONG)SG_ELEMENT_SIZE) < + p_SCCB->DataLength ) { - partial_cnt += *(sg_ptr + (sg_index * 2)); + partial_cnt += *(sg_ptr+(sg_index * 2)); sg_index++; - } + } - p_SCCB->DataLength = partial_cnt; - } + p_SCCB->DataLength = partial_cnt; + } - else { + else { - p_SCCB->DataLength -= p_SCCB->Sccb_ATC; - } + p_SCCB->DataLength -= p_SCCB->Sccb_ATC; + } } + /*--------------------------------------------------------------------- * * Function: Wait 1 Second @@ -7254,22 +7826,23 @@ static void FPT_utilUpdateResidual(struct sccb *p_SCCB) * *---------------------------------------------------------------------*/ -static void FPT_Wait1Second(unsigned long p_port) +static void FPT_Wait1Second(ULONG p_port) { - unsigned char i; + UCHAR i; - for (i = 0; i < 4; i++) { + for(i=0; i < 4; i++) { - FPT_Wait(p_port, TO_250ms); + FPT_Wait(p_port, TO_250ms); - if ((RD_HARPOON(p_port + hp_scsictrl_0) & SCSI_RST)) - break; + if ((RD_HARPOON(p_port+hp_scsictrl_0) & SCSI_RST)) + break; - if ((RDW_HARPOON((p_port + hp_intstat)) & SCAM_SEL)) - break; - } + if((RDW_HARPOON((p_port+hp_intstat)) & SCAM_SEL)) + break; + } } + /*--------------------------------------------------------------------- * * Function: FPT_Wait @@ -7278,43 +7851,45 @@ static void FPT_Wait1Second(unsigned long p_port) * *---------------------------------------------------------------------*/ -static void FPT_Wait(unsigned long p_port, unsigned char p_delay) +static void FPT_Wait(ULONG p_port, UCHAR p_delay) { - unsigned char old_timer; - unsigned char green_flag; + UCHAR old_timer; + UCHAR green_flag; - old_timer = RD_HARPOON(p_port + hp_seltimeout); + old_timer = RD_HARPOON(p_port+hp_seltimeout); - green_flag = RD_HARPOON(p_port + hp_clkctrl_0); - WR_HARPOON(p_port + hp_clkctrl_0, CLKCTRL_DEFAULT); + green_flag=RD_HARPOON(p_port+hp_clkctrl_0); + WR_HARPOON(p_port+hp_clkctrl_0, CLKCTRL_DEFAULT); - WR_HARPOON(p_port + hp_seltimeout, p_delay); - WRW_HARPOON((p_port + hp_intstat), TIMEOUT); - WRW_HARPOON((p_port + hp_intena), (FPT_default_intena & ~TIMEOUT)); + WR_HARPOON(p_port+hp_seltimeout,p_delay); + WRW_HARPOON((p_port+hp_intstat), TIMEOUT); + WRW_HARPOON((p_port+hp_intena), (FPT_default_intena & ~TIMEOUT)); - WR_HARPOON(p_port + hp_portctrl_0, - (RD_HARPOON(p_port + hp_portctrl_0) | START_TO)); - while (!(RDW_HARPOON((p_port + hp_intstat)) & TIMEOUT)) { + WR_HARPOON(p_port+hp_portctrl_0, + (RD_HARPOON(p_port+hp_portctrl_0) | START_TO)); - if ((RD_HARPOON(p_port + hp_scsictrl_0) & SCSI_RST)) - break; + while (!(RDW_HARPOON((p_port+hp_intstat)) & TIMEOUT)) { - if ((RDW_HARPOON((p_port + hp_intstat)) & SCAM_SEL)) - break; - } + if ((RD_HARPOON(p_port+hp_scsictrl_0) & SCSI_RST)) + break; + + if ((RDW_HARPOON((p_port+hp_intstat)) & SCAM_SEL)) + break; + } - WR_HARPOON(p_port + hp_portctrl_0, - (RD_HARPOON(p_port + hp_portctrl_0) & ~START_TO)); + WR_HARPOON(p_port+hp_portctrl_0, + (RD_HARPOON(p_port+hp_portctrl_0) & ~START_TO)); - WRW_HARPOON((p_port + hp_intstat), TIMEOUT); - WRW_HARPOON((p_port + hp_intena), FPT_default_intena); + WRW_HARPOON((p_port+hp_intstat), TIMEOUT); + WRW_HARPOON((p_port+hp_intena), FPT_default_intena); - WR_HARPOON(p_port + hp_clkctrl_0, green_flag); + WR_HARPOON(p_port+hp_clkctrl_0,green_flag); - WR_HARPOON(p_port + hp_seltimeout, old_timer); + WR_HARPOON(p_port+hp_seltimeout,old_timer); } + /*--------------------------------------------------------------------- * * Function: Enable/Disable Write to EEPROM @@ -7324,26 +7899,26 @@ static void FPT_Wait(unsigned long p_port, unsigned char p_delay) * *---------------------------------------------------------------------*/ -static void FPT_utilEEWriteOnOff(unsigned long p_port, unsigned char p_mode) +static void FPT_utilEEWriteOnOff(ULONG p_port,UCHAR p_mode) { - unsigned char ee_value; + UCHAR ee_value; - ee_value = - (unsigned char)(RD_HARPOON(p_port + hp_ee_ctrl) & - (EXT_ARB_ACK | SCSI_TERM_ENA_H)); + ee_value = (UCHAR)(RD_HARPOON(p_port+hp_ee_ctrl) & (EXT_ARB_ACK | SCSI_TERM_ENA_H)); - if (p_mode) + if (p_mode) - FPT_utilEESendCmdAddr(p_port, EWEN, EWEN_ADDR); + FPT_utilEESendCmdAddr(p_port, EWEN, EWEN_ADDR); + + else - else - FPT_utilEESendCmdAddr(p_port, EWDS, EWDS_ADDR); + FPT_utilEESendCmdAddr(p_port, EWDS, EWDS_ADDR); - WR_HARPOON(p_port + hp_ee_ctrl, (ee_value | SEE_MS)); /*Turn off CS */ - WR_HARPOON(p_port + hp_ee_ctrl, ee_value); /*Turn off Master Select */ + WR_HARPOON(p_port+hp_ee_ctrl, (ee_value | SEE_MS)); /*Turn off CS */ + WR_HARPOON(p_port+hp_ee_ctrl, ee_value); /*Turn off Master Select */ } + /*--------------------------------------------------------------------- * * Function: Write EEPROM @@ -7353,46 +7928,46 @@ static void FPT_utilEEWriteOnOff(unsigned long p_port, unsigned char p_mode) * *---------------------------------------------------------------------*/ -static void FPT_utilEEWrite(unsigned long p_port, unsigned short ee_data, - unsigned short ee_addr) +static void FPT_utilEEWrite(ULONG p_port, USHORT ee_data, USHORT ee_addr) { - unsigned char ee_value; - unsigned short i; + UCHAR ee_value; + USHORT i; - ee_value = - (unsigned - char)((RD_HARPOON(p_port + hp_ee_ctrl) & - (EXT_ARB_ACK | SCSI_TERM_ENA_H)) | (SEE_MS | SEE_CS)); + ee_value = (UCHAR)((RD_HARPOON(p_port+hp_ee_ctrl) & (EXT_ARB_ACK | SCSI_TERM_ENA_H))| + (SEE_MS | SEE_CS)); - FPT_utilEESendCmdAddr(p_port, EE_WRITE, ee_addr); - ee_value |= (SEE_MS + SEE_CS); - for (i = 0x8000; i != 0; i >>= 1) { + FPT_utilEESendCmdAddr(p_port, EE_WRITE, ee_addr); - if (i & ee_data) - ee_value |= SEE_DO; - else - ee_value &= ~SEE_DO; - - WR_HARPOON(p_port + hp_ee_ctrl, ee_value); - WR_HARPOON(p_port + hp_ee_ctrl, ee_value); - ee_value |= SEE_CLK; /* Clock data! */ - WR_HARPOON(p_port + hp_ee_ctrl, ee_value); - WR_HARPOON(p_port + hp_ee_ctrl, ee_value); - ee_value &= ~SEE_CLK; - WR_HARPOON(p_port + hp_ee_ctrl, ee_value); - WR_HARPOON(p_port + hp_ee_ctrl, ee_value); - } - ee_value &= (EXT_ARB_ACK | SCSI_TERM_ENA_H); - WR_HARPOON(p_port + hp_ee_ctrl, (ee_value | SEE_MS)); - FPT_Wait(p_port, TO_10ms); + ee_value |= (SEE_MS + SEE_CS); + + for(i = 0x8000; i != 0; i>>=1) { - WR_HARPOON(p_port + hp_ee_ctrl, (ee_value | SEE_MS | SEE_CS)); /* Set CS to EEPROM */ - WR_HARPOON(p_port + hp_ee_ctrl, (ee_value | SEE_MS)); /* Turn off CS */ - WR_HARPOON(p_port + hp_ee_ctrl, ee_value); /* Turn off Master Select */ + if (i & ee_data) + ee_value |= SEE_DO; + else + ee_value &= ~SEE_DO; + + WR_HARPOON(p_port+hp_ee_ctrl, ee_value); + WR_HARPOON(p_port+hp_ee_ctrl, ee_value); + ee_value |= SEE_CLK; /* Clock data! */ + WR_HARPOON(p_port+hp_ee_ctrl, ee_value); + WR_HARPOON(p_port+hp_ee_ctrl, ee_value); + ee_value &= ~SEE_CLK; + WR_HARPOON(p_port+hp_ee_ctrl, ee_value); + WR_HARPOON(p_port+hp_ee_ctrl, ee_value); + } + ee_value &= (EXT_ARB_ACK | SCSI_TERM_ENA_H); + WR_HARPOON(p_port+hp_ee_ctrl, (ee_value | SEE_MS)); + + FPT_Wait(p_port, TO_10ms); + + WR_HARPOON(p_port+hp_ee_ctrl, (ee_value | SEE_MS | SEE_CS)); /* Set CS to EEPROM */ + WR_HARPOON(p_port+hp_ee_ctrl, (ee_value | SEE_MS)); /* Turn off CS */ + WR_HARPOON(p_port+hp_ee_ctrl, ee_value); /* Turn off Master Select */ } /*--------------------------------------------------------------------- @@ -7404,25 +7979,25 @@ static void FPT_utilEEWrite(unsigned long p_port, unsigned short ee_data, * *---------------------------------------------------------------------*/ -static unsigned short FPT_utilEERead(unsigned long p_port, - unsigned short ee_addr) +static USHORT FPT_utilEERead(ULONG p_port, USHORT ee_addr) { - unsigned short i, ee_data1, ee_data2; + USHORT i, ee_data1, ee_data2; i = 0; ee_data1 = FPT_utilEEReadOrg(p_port, ee_addr); - do { + do + { ee_data2 = FPT_utilEEReadOrg(p_port, ee_addr); - if (ee_data1 == ee_data2) - return ee_data1; + if(ee_data1 == ee_data2) + return(ee_data1); ee_data1 = ee_data2; i++; - } while (i < 4); + }while(i < 4); - return ee_data1; + return(ee_data1); } /*--------------------------------------------------------------------- @@ -7434,45 +8009,45 @@ static unsigned short FPT_utilEERead(unsigned long p_port, * *---------------------------------------------------------------------*/ -static unsigned short FPT_utilEEReadOrg(unsigned long p_port, - unsigned short ee_addr) +static USHORT FPT_utilEEReadOrg(ULONG p_port, USHORT ee_addr) { - unsigned char ee_value; - unsigned short i, ee_data; + UCHAR ee_value; + USHORT i, ee_data; - ee_value = - (unsigned - char)((RD_HARPOON(p_port + hp_ee_ctrl) & - (EXT_ARB_ACK | SCSI_TERM_ENA_H)) | (SEE_MS | SEE_CS)); + ee_value = (UCHAR)((RD_HARPOON(p_port+hp_ee_ctrl) & (EXT_ARB_ACK | SCSI_TERM_ENA_H))| + (SEE_MS | SEE_CS)); - FPT_utilEESendCmdAddr(p_port, EE_READ, ee_addr); - ee_value |= (SEE_MS + SEE_CS); - ee_data = 0; + FPT_utilEESendCmdAddr(p_port, EE_READ, ee_addr); - for (i = 1; i <= 16; i++) { - ee_value |= SEE_CLK; /* Clock data! */ - WR_HARPOON(p_port + hp_ee_ctrl, ee_value); - WR_HARPOON(p_port + hp_ee_ctrl, ee_value); - ee_value &= ~SEE_CLK; - WR_HARPOON(p_port + hp_ee_ctrl, ee_value); - WR_HARPOON(p_port + hp_ee_ctrl, ee_value); + ee_value |= (SEE_MS + SEE_CS); + ee_data = 0; - ee_data <<= 1; + for(i = 1; i <= 16; i++) { - if (RD_HARPOON(p_port + hp_ee_ctrl) & SEE_DI) - ee_data |= 1; - } + ee_value |= SEE_CLK; /* Clock data! */ + WR_HARPOON(p_port+hp_ee_ctrl, ee_value); + WR_HARPOON(p_port+hp_ee_ctrl, ee_value); + ee_value &= ~SEE_CLK; + WR_HARPOON(p_port+hp_ee_ctrl, ee_value); + WR_HARPOON(p_port+hp_ee_ctrl, ee_value); + + ee_data <<= 1; - ee_value &= ~(SEE_MS + SEE_CS); - WR_HARPOON(p_port + hp_ee_ctrl, (ee_value | SEE_MS)); /*Turn off CS */ - WR_HARPOON(p_port + hp_ee_ctrl, ee_value); /*Turn off Master Select */ + if (RD_HARPOON(p_port+hp_ee_ctrl) & SEE_DI) + ee_data |= 1; + } - return ee_data; + ee_value &= ~(SEE_MS + SEE_CS); + WR_HARPOON(p_port+hp_ee_ctrl, (ee_value | SEE_MS)); /*Turn off CS */ + WR_HARPOON(p_port+hp_ee_ctrl, ee_value); /*Turn off Master Select */ + + return(ee_data); } + /*--------------------------------------------------------------------- * * Function: Send EE command and Address to the EEPROM @@ -7482,95 +8057,101 @@ static unsigned short FPT_utilEEReadOrg(unsigned long p_port, * *---------------------------------------------------------------------*/ -static void FPT_utilEESendCmdAddr(unsigned long p_port, unsigned char ee_cmd, - unsigned short ee_addr) +static void FPT_utilEESendCmdAddr(ULONG p_port, UCHAR ee_cmd, USHORT ee_addr) { - unsigned char ee_value; - unsigned char narrow_flg; + UCHAR ee_value; + UCHAR narrow_flg; - unsigned short i; + USHORT i; - narrow_flg = - (unsigned char)(RD_HARPOON(p_port + hp_page_ctrl) & - NARROW_SCSI_CARD); - ee_value = SEE_MS; - WR_HARPOON(p_port + hp_ee_ctrl, ee_value); + narrow_flg= (UCHAR)(RD_HARPOON(p_port+hp_page_ctrl) & NARROW_SCSI_CARD); - ee_value |= SEE_CS; /* Set CS to EEPROM */ - WR_HARPOON(p_port + hp_ee_ctrl, ee_value); - for (i = 0x04; i != 0; i >>= 1) { + ee_value = SEE_MS; + WR_HARPOON(p_port+hp_ee_ctrl, ee_value); - if (i & ee_cmd) - ee_value |= SEE_DO; - else - ee_value &= ~SEE_DO; - - WR_HARPOON(p_port + hp_ee_ctrl, ee_value); - WR_HARPOON(p_port + hp_ee_ctrl, ee_value); - ee_value |= SEE_CLK; /* Clock data! */ - WR_HARPOON(p_port + hp_ee_ctrl, ee_value); - WR_HARPOON(p_port + hp_ee_ctrl, ee_value); - ee_value &= ~SEE_CLK; - WR_HARPOON(p_port + hp_ee_ctrl, ee_value); - WR_HARPOON(p_port + hp_ee_ctrl, ee_value); - } + ee_value |= SEE_CS; /* Set CS to EEPROM */ + WR_HARPOON(p_port+hp_ee_ctrl, ee_value); - if (narrow_flg) - i = 0x0080; - else - i = 0x0200; + for(i = 0x04; i != 0; i>>=1) { - while (i != 0) { + if (i & ee_cmd) + ee_value |= SEE_DO; + else + ee_value &= ~SEE_DO; - if (i & ee_addr) - ee_value |= SEE_DO; - else - ee_value &= ~SEE_DO; - - WR_HARPOON(p_port + hp_ee_ctrl, ee_value); - WR_HARPOON(p_port + hp_ee_ctrl, ee_value); - ee_value |= SEE_CLK; /* Clock data! */ - WR_HARPOON(p_port + hp_ee_ctrl, ee_value); - WR_HARPOON(p_port + hp_ee_ctrl, ee_value); - ee_value &= ~SEE_CLK; - WR_HARPOON(p_port + hp_ee_ctrl, ee_value); - WR_HARPOON(p_port + hp_ee_ctrl, ee_value); - - i >>= 1; - } + WR_HARPOON(p_port+hp_ee_ctrl, ee_value); + WR_HARPOON(p_port+hp_ee_ctrl, ee_value); + ee_value |= SEE_CLK; /* Clock data! */ + WR_HARPOON(p_port+hp_ee_ctrl, ee_value); + WR_HARPOON(p_port+hp_ee_ctrl, ee_value); + ee_value &= ~SEE_CLK; + WR_HARPOON(p_port+hp_ee_ctrl, ee_value); + WR_HARPOON(p_port+hp_ee_ctrl, ee_value); + } + + + if (narrow_flg) + i = 0x0080; + + else + i = 0x0200; + + + while (i != 0) { + + if (i & ee_addr) + ee_value |= SEE_DO; + else + ee_value &= ~SEE_DO; + + WR_HARPOON(p_port+hp_ee_ctrl, ee_value); + WR_HARPOON(p_port+hp_ee_ctrl, ee_value); + ee_value |= SEE_CLK; /* Clock data! */ + WR_HARPOON(p_port+hp_ee_ctrl, ee_value); + WR_HARPOON(p_port+hp_ee_ctrl, ee_value); + ee_value &= ~SEE_CLK; + WR_HARPOON(p_port+hp_ee_ctrl, ee_value); + WR_HARPOON(p_port+hp_ee_ctrl, ee_value); + + i >>= 1; + } } -static unsigned short FPT_CalcCrc16(unsigned char buffer[]) +static USHORT FPT_CalcCrc16(UCHAR buffer[]) { - unsigned short crc = 0; - int i, j; - unsigned short ch; - for (i = 0; i < ID_STRING_LENGTH; i++) { - ch = (unsigned short)buffer[i]; - for (j = 0; j < 8; j++) { - if ((crc ^ ch) & 1) - crc = (crc >> 1) ^ CRCMASK; - else - crc >>= 1; - ch >>= 1; - } - } - return crc; + USHORT crc=0; + int i,j; + USHORT ch; + for (i=0; i < ID_STRING_LENGTH; i++) + { + ch = (USHORT) buffer[i]; + for(j=0; j < 8; j++) + { + if ((crc ^ ch) & 1) + crc = (crc >> 1) ^ CRCMASK; + else + crc >>= 1; + ch >>= 1; + } + } + return(crc); } -static unsigned char FPT_CalcLrc(unsigned char buffer[]) +static UCHAR FPT_CalcLrc(UCHAR buffer[]) { int i; - unsigned char lrc; + UCHAR lrc; lrc = 0; - for (i = 0; i < ID_STRING_LENGTH; i++) + for(i = 0; i < ID_STRING_LENGTH; i++) lrc ^= buffer[i]; - return lrc; + return(lrc); } + + /* The following inline definitions avoid type conflicts. */ @@ -7578,49 +8159,51 @@ static unsigned char FPT_CalcLrc(unsigned char buffer[]) static inline unsigned char FlashPoint__ProbeHostAdapter(struct FlashPoint_Info *FlashPointInfo) { - return FlashPoint_ProbeHostAdapter((struct sccb_mgr_info *) - FlashPointInfo); + return FlashPoint_ProbeHostAdapter((PSCCBMGR_INFO) FlashPointInfo); } + static inline FlashPoint_CardHandle_T FlashPoint__HardwareResetHostAdapter(struct FlashPoint_Info *FlashPointInfo) { - return FlashPoint_HardwareResetHostAdapter((struct sccb_mgr_info *) - FlashPointInfo); + return FlashPoint_HardwareResetHostAdapter((PSCCBMGR_INFO) FlashPointInfo); } static inline void FlashPoint__ReleaseHostAdapter(FlashPoint_CardHandle_T CardHandle) { - FlashPoint_ReleaseHostAdapter(CardHandle); + FlashPoint_ReleaseHostAdapter(CardHandle); } + static inline void -FlashPoint__StartCCB(FlashPoint_CardHandle_T CardHandle, - struct BusLogic_CCB *CCB) +FlashPoint__StartCCB(FlashPoint_CardHandle_T CardHandle, struct BusLogic_CCB *CCB) { - FlashPoint_StartCCB(CardHandle, (struct sccb *)CCB); + FlashPoint_StartCCB(CardHandle, (PSCCB) CCB); } + static inline void -FlashPoint__AbortCCB(FlashPoint_CardHandle_T CardHandle, - struct BusLogic_CCB *CCB) +FlashPoint__AbortCCB(FlashPoint_CardHandle_T CardHandle, struct BusLogic_CCB *CCB) { - FlashPoint_AbortCCB(CardHandle, (struct sccb *)CCB); + FlashPoint_AbortCCB(CardHandle, (PSCCB) CCB); } + static inline boolean FlashPoint__InterruptPending(FlashPoint_CardHandle_T CardHandle) { - return FlashPoint_InterruptPending(CardHandle); + return FlashPoint_InterruptPending(CardHandle); } + static inline int FlashPoint__HandleInterrupt(FlashPoint_CardHandle_T CardHandle) { - return FlashPoint_HandleInterrupt(CardHandle); + return FlashPoint_HandleInterrupt(CardHandle); } + #define FlashPoint_ProbeHostAdapter FlashPoint__ProbeHostAdapter #define FlashPoint_HardwareResetHostAdapter FlashPoint__HardwareResetHostAdapter #define FlashPoint_ReleaseHostAdapter FlashPoint__ReleaseHostAdapter @@ -7629,7 +8212,9 @@ FlashPoint__HandleInterrupt(FlashPoint_CardHandle_T CardHandle) #define FlashPoint_InterruptPending FlashPoint__InterruptPending #define FlashPoint_HandleInterrupt FlashPoint__HandleInterrupt -#else /* CONFIG_SCSI_OMIT_FLASHPOINT */ + +#else /* CONFIG_SCSI_OMIT_FLASHPOINT */ + /* Define prototypes for the FlashPoint SCCB Manager Functions. @@ -7637,11 +8222,12 @@ FlashPoint__HandleInterrupt(FlashPoint_CardHandle_T CardHandle) extern unsigned char FlashPoint_ProbeHostAdapter(struct FlashPoint_Info *); extern FlashPoint_CardHandle_T -FlashPoint_HardwareResetHostAdapter(struct FlashPoint_Info *); + FlashPoint_HardwareResetHostAdapter(struct FlashPoint_Info *); extern void FlashPoint_StartCCB(FlashPoint_CardHandle_T, struct BusLogic_CCB *); extern int FlashPoint_AbortCCB(FlashPoint_CardHandle_T, struct BusLogic_CCB *); extern boolean FlashPoint_InterruptPending(FlashPoint_CardHandle_T); extern int FlashPoint_HandleInterrupt(FlashPoint_CardHandle_T); extern void FlashPoint_ReleaseHostAdapter(FlashPoint_CardHandle_T); -#endif /* CONFIG_SCSI_OMIT_FLASHPOINT */ + +#endif /* CONFIG_SCSI_OMIT_FLASHPOINT */ diff --git a/drivers/scsi/Kconfig b/drivers/scsi/Kconfig index 96a81cd17..da70464f1 100644 --- a/drivers/scsi/Kconfig +++ b/drivers/scsi/Kconfig @@ -379,14 +379,6 @@ config SCSI_AHA1740 config SCSI_AACRAID tristate "Adaptec AACRAID support" depends on SCSI && PCI - help - This driver supports a variety of Dell, HP, Adaptec, IBM and - ICP storage products. For a list of supported products, refer - to . - - To compile this driver as a module, choose M here: the module - will be called aacraid. - source "drivers/scsi/aic7xxx/Kconfig.aic7xxx" @@ -501,7 +493,7 @@ config SCSI_ATA_PIIX tristate "Intel PIIX/ICH SATA support" depends on SCSI_SATA && PCI help - This option enables support for ICH5/6/7/8 Serial ATA. + This option enables support for ICH5 Serial ATA. If PATA support was enabled previously, this enables support for select Intel PIIX/ICH PATA host controllers. @@ -607,10 +599,10 @@ config SCSI_SATA_VIA If unsure, say N. config SCSI_SATA_VITESSE - tristate "VITESSE VSC-7174 / INTEL 31244 SATA support" + tristate "VITESSE VSC-7174 SATA support" depends on SCSI_SATA && PCI help - This option enables support for Vitesse VSC7174 and Intel 31244 Serial ATA. + This option enables support for Vitesse VSC7174 Serial ATA. If unsure, say N. @@ -1091,7 +1083,7 @@ config SCSI_SYM53C8XX_DMA_ADDRESSING_MODE memory using PCI DAC cycles. config SCSI_SYM53C8XX_DEFAULT_TAGS - int "Default tagged command queue depth" + int "default tagged command queue depth" depends on SCSI_SYM53C8XX_2 default "16" help @@ -1102,7 +1094,7 @@ config SCSI_SYM53C8XX_DEFAULT_TAGS exceed CONFIG_SCSI_SYM53C8XX_MAX_TAGS. config SCSI_SYM53C8XX_MAX_TAGS - int "Maximum number of queued commands" + int "maximum number of queued commands" depends on SCSI_SYM53C8XX_2 default "64" help @@ -1111,14 +1103,13 @@ config SCSI_SYM53C8XX_MAX_TAGS possible. The driver supports up to 256 queued commands per device. This value is used as a compiled-in hard limit. -config SCSI_SYM53C8XX_MMIO - bool "Use memory mapped IO" +config SCSI_SYM53C8XX_IOMAPPED + bool "use port IO" depends on SCSI_SYM53C8XX_2 - default y help - Memory mapped IO is faster than Port IO. Most people should - answer Y here, but some machines may have problems. If you have - to answer N here, please report the problem to the maintainer. + If you say Y here, the driver will use port IO to access + the card. This is significantly slower then using memory + mapped IO. Most people should answer N. config SCSI_IPR tristate "IBM Power Linux RAID adapter support" @@ -1169,7 +1160,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--- @@ -1195,7 +1186,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--- @@ -1212,7 +1203,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--- @@ -1246,7 +1237,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. @@ -1257,7 +1248,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 @@ -1322,6 +1313,15 @@ config SCSI_QLOGIC_FAS To compile this driver as a module, choose M here: the module will be called qlogicfas. +config SCSI_QLOGIC_FC + tristate "Qlogic ISP FC SCSI support" + depends on PCI && SCSI + help + This is a driver for the QLogic ISP2100 SCSI-FCP host adapter. + + To compile this driver as a module, choose M here: the + module will be called qlogicfc. + config SCSI_QLOGIC_FC_FIRMWARE bool "Include loadable firmware in driver" depends on SCSI_QLOGIC_FC diff --git a/drivers/scsi/Makefile b/drivers/scsi/Makefile index ebd0cf00b..ddc0b3d50 100644 --- a/drivers/scsi/Makefile +++ b/drivers/scsi/Makefile @@ -33,8 +33,7 @@ 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) += libiscsi.o iscsi_tcp.o -obj-$(CONFIG_INFINIBAND_ISER) += libiscsi.o +obj-$(CONFIG_ISCSI_TCP) += iscsi_tcp.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 @@ -79,6 +78,7 @@ obj-$(CONFIG_SCSI_NCR_Q720) += NCR_Q720_mod.o obj-$(CONFIG_SCSI_SYM53C416) += sym53c416.o obj-$(CONFIG_SCSI_QLOGIC_FAS) += qlogicfas408.o qlogicfas.o obj-$(CONFIG_PCMCIA_QLOGIC) += qlogicfas408.o +obj-$(CONFIG_SCSI_QLOGIC_FC) += qlogicfc.o obj-$(CONFIG_SCSI_QLOGIC_1280) += qla1280.o obj-$(CONFIG_SCSI_QLA_FC) += qla2xxx/ obj-$(CONFIG_SCSI_LPFC) += lpfc/ @@ -117,6 +117,7 @@ obj-$(CONFIG_SCSI_PPA) += ppa.o obj-$(CONFIG_SCSI_IMM) += imm.o obj-$(CONFIG_JAZZ_ESP) += NCR53C9x.o jazz_esp.o obj-$(CONFIG_SUN3X_ESP) += NCR53C9x.o sun3x_esp.o +obj-$(CONFIG_SCSI_DEBUG) += scsi_debug.o obj-$(CONFIG_SCSI_FCAL) += fcal.o obj-$(CONFIG_SCSI_LASI700) += 53c700.o lasi700.o obj-$(CONFIG_SCSI_NSP32) += nsp32.o @@ -148,9 +149,6 @@ obj-$(CONFIG_BLK_DEV_SR) += sr_mod.o obj-$(CONFIG_CHR_DEV_SG) += sg.o obj-$(CONFIG_CHR_DEV_SCH) += ch.o -# This goes last, so that "real" scsi devices probe earlier -obj-$(CONFIG_SCSI_DEBUG) += scsi_debug.o - scsi_mod-y += scsi.o hosts.o scsi_ioctl.o constants.o \ scsicam.o scsi_error.o scsi_lib.o \ scsi_scan.o scsi_sysfs.o \ @@ -166,7 +164,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-eh.o +libata-objs := libata-core.o libata-scsi.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 616810ad1..9f0ddbe6d 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->request_buffer; + cmd->SCp.buffer = (struct scatterlist *) cmd->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 whether a command would normally disconnect or + * Purpose : decide weather 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, IRQF_DISABLED, "NCR-probe", NULL) == 0)) + if ((mask & possible) && (request_irq(i, &probe_intr, SA_INTERRUPT, "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 bdc6bb262..c7dd0154d 100644 --- a/drivers/scsi/NCR53C9x.c +++ b/drivers/scsi/NCR53C9x.c @@ -23,6 +23,7 @@ #include +#include #include #include #include @@ -911,7 +912,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->request_buffer; + sp->SCp.buffer = (struct scatterlist *) sp->buffer; sp->SCp.buffers_residual = sp->use_sg - 1; sp->SCp.this_residual = sp->SCp.buffer->length; if (esp->dma_mmu_get_scsi_sgl) @@ -2152,23 +2153,29 @@ static int esp_do_data_finale(struct NCR_ESP *esp, */ static int esp_should_clear_sync(Scsi_Cmnd *sp) { - unchar cmd = sp->cmnd[0]; + unchar cmd1 = sp->cmnd[0]; + unchar cmd2 = sp->data_cmnd[0]; /* These cases are for spinning up a disk and * waiting for that spinup to complete. */ - if(cmd == START_STOP) + if(cmd1 == START_STOP || + cmd2 == START_STOP) return 0; - if(cmd == TEST_UNIT_READY) + if(cmd1 == TEST_UNIT_READY || + cmd2 == 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 && cmd == MODE_SENSE) - return 0; + if(sp->device->type == TYPE_TAPE) { + if(cmd1 == MODE_SENSE || + cmd2 == MODE_SENSE) + return 0; + } return 1; } diff --git a/drivers/scsi/NCR53C9x.h b/drivers/scsi/NCR53C9x.h index 481653c97..65a9b377a 100644 --- a/drivers/scsi/NCR53C9x.h +++ b/drivers/scsi/NCR53C9x.h @@ -13,6 +13,7 @@ #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 8472c5359..ae37d3ab9 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 ARRAY_SIZE(addresses) +#define ADDRESS_COUNT (sizeof( addresses ) / sizeof( unsigned )) #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 ARRAY_SIZE(ports) +#define PORT_COUNT (sizeof( ports ) / sizeof( unsigned short )) /* possible interrupt channels */ static unsigned short intrs[] = { 10, 11, 12, 15 }; -#define INTR_COUNT ARRAY_SIZE(intrs) +#define INTR_COUNT (sizeof( intrs ) / sizeof( unsigned short )) /* 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 ARRAY_SIZE(signatures) +#define SIGNATURE_COUNT (sizeof( signatures ) / sizeof( struct signature )) #endif /* USE_BIOS */ /* ============================================================ */ diff --git a/drivers/scsi/NCR_D700.c b/drivers/scsi/NCR_D700.c index d05681f9d..e993a7ba2 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 __devinitdata id_array[2*(MCA_MAX_SLOT_NR + 1)] = +static __u8 __initdata 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 __devinit +static int NCR_D700_probe_one(struct NCR_D700_private *p, int siop, int irq, int slot, u32 region, int differential) { @@ -218,7 +218,7 @@ NCR_D700_probe_one(struct NCR_D700_private *p, int siop, int irq, return 0; detect_failed: - release_region(region, 64); + release_region(host->base, 64); region_failed: kfree(hostdata); @@ -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 __devinit +static int 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, IRQF_SHARED, p->name, p)) { + if (request_irq(irq, NCR_D700_intr, SA_SHIRQ, 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, irq, slot, + if ((err = NCR_D700_probe_one(p, i, slot, irq, 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 __devexit +static void 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 __devexit +static int 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 = __devexit_p(NCR_D700_remove), + .remove = NCR_D700_remove, }, }; diff --git a/drivers/scsi/NCR_Q720.c b/drivers/scsi/NCR_Q720.c index c39ffbb86..9d18ec905 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, IRQF_SHARED, "NCR_Q720", p)) { + if (request_irq(irq, NCR_Q720_intr, SA_SHIRQ, "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 d7e9fab54..9f45ae174 100644 --- a/drivers/scsi/a100u2w.c +++ b/drivers/scsi/a100u2w.c @@ -89,7 +89,6 @@ #include #include #include -#include #include #include @@ -1053,7 +1052,7 @@ static int __devinit inia100_probe_one(struct pci_dev *pdev, if (pci_enable_device(pdev)) goto out; - if (pci_set_dma_mask(pdev, DMA_32BIT_MASK)) { + if (pci_set_dma_mask(pdev, 0xffffffffULL)) { printk(KERN_WARNING "Unable to set 32bit DMA " "on inia100 adapter, ignoring.\n"); goto out_disable_device; @@ -1120,7 +1119,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, IRQF_SHARED, + error = request_irq(pdev->irq, inia100_intr, SA_SHIRQ, "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 fddfa2ebc..54996eaae 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, IRQF_SHARED, "A2091 SCSI", + request_irq(IRQ_AMIGA_PORTS, a2091_intr, SA_SHIRQ, "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 ae9ab4b13..f425d424b 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, IRQF_SHARED, "A3000 SCSI", + if (request_irq(IRQ_AMIGA_PORTS, a3000_intr, SA_SHIRQ, "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 83b5c7d08..a16f8ded8 100644 --- a/drivers/scsi/aacraid/aachba.c +++ b/drivers/scsi/aacraid/aachba.c @@ -32,7 +32,6 @@ #include #include #include -#include #include #include @@ -148,27 +147,21 @@ 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_param(nondasd, int, 0); MODULE_PARM_DESC(nondasd, "Control scanning of hba for nondasd devices. 0=off, 1=on"); -module_param(dacmode, int, S_IRUGO|S_IWUSR); +module_param(dacmode, int, 0); 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_param(commit, int, 0); MODULE_PARM_DESC(commit, "Control whether a COMMIT_CONFIG is issued to the adapter for foreign arrays.\nThis is typically needed in systems that do not have a BIOS. 0=off, 1=on"); -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); -MODULE_PARM_DESC(numacb, "Request a limit to the number of adapter control blocks (FIB) allocated. Valid values are 512 and down. Default is to use suggestion from Firmware."); +MODULE_PARM_DESC(numacb, "Request a limit to the number of adapter control blocks (FIB) allocated. Valid\nvalues are 512 and down. Default is to use suggestion from Firmware."); int acbsize = -1; module_param(acbsize, int, S_IRUGO|S_IWUSR); -MODULE_PARM_DESC(acbsize, "Request a specific adapter control block (FIB) size. Valid values are 512, 2048, 4096 and 8192. Default is to use suggestion from Firmware."); +MODULE_PARM_DESC(acbsize, "Request a specific adapter control block (FIB) size. Valid values are 512,\n2048, 4096 and 8192. Default is to use suggestion from Firmware."); /** * aac_get_config_status - check the adapter configuration * @common: adapter to query @@ -393,10 +386,10 @@ static void get_container_name_callback(void *context, struct fib * fibptr) struct scsi_cmnd * scsicmd; scsicmd = (struct scsi_cmnd *) context; - scsicmd->SCp.phase = AAC_OWNER_MIDLEVEL; dprintk((KERN_DEBUG "get_container_name_callback[cpu %d]: t = %ld.\n", smp_processor_id(), jiffies)); - BUG_ON(fibptr == NULL); + if (fibptr == NULL) + BUG(); get_name_reply = (struct aac_get_name_resp *) fib_data(fibptr); /* Failure is irrelevant, using default value instead */ @@ -459,10 +452,8 @@ static int aac_get_container_name(struct scsi_cmnd * scsicmd, int cid) /* * Check that the command queued to the controller */ - if (status == -EINPROGRESS) { - scsicmd->SCp.phase = AAC_OWNER_FIRMWARE; + if (status == -EINPROGRESS) return 0; - } printk(KERN_WARNING "aac_get_container_name: aac_fib_send failed with status: %d.\n", status); aac_fib_complete(cmd_fibcontext); @@ -640,13 +631,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 < ARRAY_SIZE(container_types)){ + if (tindex < (sizeof(container_types)/sizeof(char *))){ char *findit = str->pid; for ( ; *findit != ' '; findit++); /* walk till we find a space */ @@ -915,10 +906,9 @@ static void io_callback(void *context, struct fib * fibptr) u32 cid; scsicmd = (struct scsi_cmnd *) context; - scsicmd->SCp.phase = AAC_OWNER_MIDLEVEL; dev = (struct aac_dev *)scsicmd->device->host->hostdata; - cid = scmd_id(scsicmd); + cid = ID_LUN_TO_CONTAINER(scsicmd->device->id, scsicmd->device->lun); if (nblank(dprintk(x))) { u64 lba; @@ -955,11 +945,12 @@ static void io_callback(void *context, struct fib * fibptr) smp_processor_id(), (unsigned long long)lba, jiffies); } - BUG_ON(fibptr == NULL); + if (fibptr == NULL) + BUG(); if(scsicmd->use_sg) pci_unmap_sg(dev->pdev, - (struct scatterlist *)scsicmd->request_buffer, + (struct scatterlist *)scsicmd->buffer, scsicmd->use_sg, scsicmd->sc_data_direction); else if(scsicmd->request_bufflen) @@ -1090,7 +1081,8 @@ 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)); - BUG_ON(fibsize > (dev->max_fib_size - sizeof(struct aac_fibhdr))); + if (fibsize > (dev->max_fib_size - sizeof(struct aac_fibhdr))) + BUG(); /* * Now send the Fib to the adapter */ @@ -1158,10 +1150,8 @@ static int aac_read(struct scsi_cmnd * scsicmd, int cid) /* * Check that the command queued to the controller */ - if (status == -EINPROGRESS) { - scsicmd->SCp.phase = AAC_OWNER_FIRMWARE; + if (status == -EINPROGRESS) return 0; - } printk(KERN_WARNING "aac_read: aac_fib_send failed with status: %d.\n", status); /* @@ -1258,7 +1248,8 @@ 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)); - BUG_ON(fibsize > (dev->max_fib_size - sizeof(struct aac_fibhdr))); + if (fibsize > (dev->max_fib_size - sizeof(struct aac_fibhdr))) + BUG(); /* * Now send the Fib to the adapter */ @@ -1326,8 +1317,8 @@ static int aac_write(struct scsi_cmnd * scsicmd, int cid) /* * Check that the command queued to the controller */ - if (status == -EINPROGRESS) { - scsicmd->SCp.phase = AAC_OWNER_FIRMWARE; + if (status == -EINPROGRESS) + { return 0; } @@ -1349,7 +1340,6 @@ static void synchronize_callback(void *context, struct fib *fibptr) struct scsi_cmnd *cmd; cmd = context; - cmd->SCp.phase = AAC_OWNER_MIDLEVEL; dprintk((KERN_DEBUG "synchronize_callback[cpu %d]: t = %ld.\n", smp_processor_id(), jiffies)); @@ -1363,7 +1353,7 @@ static void synchronize_callback(void *context, struct fib *fibptr) else { struct scsi_device *sdev = cmd->device; struct aac_dev *dev = (struct aac_dev *)sdev->host->hostdata; - u32 cid = sdev_id(sdev); + u32 cid = ID_LUN_TO_CONTAINER(sdev->id, sdev->lun); printk(KERN_WARNING "synchronize_callback: synchronize failed, status = %d\n", le32_to_cpu(synchronizereply->status)); @@ -1395,12 +1385,12 @@ static int aac_synchronize(struct scsi_cmnd *scsicmd, int cid) unsigned long flags; /* - * Wait for all outstanding queued commands to complete to this - * specific target (block). + * Wait for all commands to complete to this specific + * target (block). */ spin_lock_irqsave(&sdev->list_lock, flags); list_for_each_entry(cmd, &sdev->cmd_list, list) - if (cmd != scsicmd && cmd->SCp.phase == AAC_OWNER_FIRMWARE) { + if (cmd != scsicmd && cmd->serial_number != 0) { ++active; break; } @@ -1443,10 +1433,8 @@ static int aac_synchronize(struct scsi_cmnd *scsicmd, int cid) /* * Check that the command queued to the controller */ - if (status == -EINPROGRESS) { - scsicmd->SCp.phase = AAC_OWNER_FIRMWARE; + if (status == -EINPROGRESS) return 0; - } printk(KERN_WARNING "aac_synchronize: aac_fib_send failed with status: %d.\n", status); @@ -1469,6 +1457,7 @@ int aac_scsi_cmd(struct scsi_cmnd * scsicmd) struct Scsi_Host *host = scsicmd->device->host; struct aac_dev *dev = (struct aac_dev *)host->hostdata; struct fsa_dev_info *fsa_dev_ptr = dev->fsa_dev; + int ret; /* * If the bus, id or lun is out of range, return fail @@ -1476,14 +1465,13 @@ int aac_scsi_cmd(struct scsi_cmnd * scsicmd) * itself. */ if (scmd_id(scsicmd) != host->this_id) { - if ((scmd_channel(scsicmd) == CONTAINER_CHANNEL)) { - if((scmd_id(scsicmd) >= dev->maximum_num_containers) || - (scsicmd->device->lun != 0)) { + if ((scsicmd->device->channel == CONTAINER_CHANNEL)) { + if( (scsicmd->device->id >= dev->maximum_num_containers) || (scsicmd->device->lun != 0)){ scsicmd->result = DID_NO_CONNECT << 16; scsicmd->scsi_done(scsicmd); return 0; } - cid = scmd_id(scsicmd); + cid = ID_LUN_TO_CONTAINER(scsicmd->device->id, scsicmd->device->lun); /* * If the target container doesn't exist, it may have @@ -1559,7 +1547,7 @@ int aac_scsi_cmd(struct scsi_cmnd * scsicmd) { struct inquiry_data inq_data; - dprintk((KERN_DEBUG "INQUIRY command, ID: %d.\n", scmd_id(scsicmd))); + dprintk((KERN_DEBUG "INQUIRY command, ID: %d.\n", scsicmd->device->id)); memset(&inq_data, 0, sizeof (struct inquiry_data)); inq_data.inqd_ver = 2; /* claim compliance to SCSI-2 */ @@ -1572,7 +1560,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), ARRAY_SIZE(container_types)); + setinqstr(dev, (void *) (inq_data.inqd_vid), (sizeof(container_types)/sizeof(char *))); 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; @@ -1609,14 +1597,13 @@ int aac_scsi_cmd(struct scsi_cmnd * scsicmd) cp[11] = 0; cp[12] = 0; aac_internal_transfer(scsicmd, cp, 0, - min_t(size_t, scsicmd->cmnd[13], sizeof(cp))); + min((unsigned int)scsicmd->cmnd[13], sizeof(cp))); if (sizeof(cp) < scsicmd->cmnd[13]) { unsigned int len, offset = sizeof(cp); memset(cp, 0, offset); do { - len = min_t(size_t, scsicmd->cmnd[13] - offset, - sizeof(cp)); + len = min(scsicmd->cmnd[13]-offset, sizeof(cp)); aac_internal_transfer(scsicmd, cp, offset, len); } while ((offset += len) < scsicmd->cmnd[13]); } @@ -1740,19 +1727,24 @@ int aac_scsi_cmd(struct scsi_cmnd * scsicmd) * containers to /dev/sd device names */ + spin_unlock_irq(host->host_lock); if (scsicmd->request->rq_disk) strlcpy(fsa_dev_ptr[cid].devname, scsicmd->request->rq_disk->disk_name, min(sizeof(fsa_dev_ptr[cid].devname), sizeof(scsicmd->request->rq_disk->disk_name) + 1)); - - return aac_read(scsicmd, cid); + ret = aac_read(scsicmd, cid); + spin_lock_irq(host->host_lock); + return ret; case WRITE_6: case WRITE_10: case WRITE_12: case WRITE_16: - return aac_write(scsicmd, cid); + spin_unlock_irq(host->host_lock); + ret = aac_write(scsicmd, cid); + spin_lock_irq(host->host_lock); + return ret; case SYNCHRONIZE_CACHE: /* Issue FIB to tell Firmware to flush it's cache */ @@ -1785,7 +1777,7 @@ static int query_disk(struct aac_dev *dev, void __user *arg) if (copy_from_user(&qd, arg, sizeof (struct aac_query_disk))) return -EFAULT; if (qd.cnum == -1) - qd.cnum = qd.id; + qd.cnum = ID_LUN_TO_CONTAINER(qd.id, qd.lun); else if ((qd.bus == -1) && (qd.id == -1) && (qd.lun == -1)) { if (qd.cnum < 0 || qd.cnum >= dev->maximum_num_containers) @@ -1897,10 +1889,10 @@ static void aac_srb_callback(void *context, struct fib * fibptr) struct scsi_cmnd *scsicmd; scsicmd = (struct scsi_cmnd *) context; - scsicmd->SCp.phase = AAC_OWNER_MIDLEVEL; dev = (struct aac_dev *)scsicmd->device->host->hostdata; - BUG_ON(fibptr == NULL); + if (fibptr == NULL) + BUG(); srbreply = (struct aac_srb_reply *) fib_data(fibptr); @@ -1914,7 +1906,7 @@ static void aac_srb_callback(void *context, struct fib * fibptr) if(scsicmd->use_sg) pci_unmap_sg(dev->pdev, - (struct scatterlist *)scsicmd->request_buffer, + (struct scatterlist *)scsicmd->buffer, scsicmd->use_sg, scsicmd->sc_data_direction); else if(scsicmd->request_bufflen) @@ -2075,13 +2067,14 @@ static int aac_send_srb_fib(struct scsi_cmnd* scsicmd) u32 timeout; dev = (struct aac_dev *)scsicmd->device->host->hostdata; - if (scmd_id(scsicmd) >= dev->maximum_num_physicals || + if (scsicmd->device->id >= dev->maximum_num_physicals || scsicmd->device->lun > 7) { scsicmd->result = DID_NO_CONNECT << 16; scsicmd->scsi_done(scsicmd); return 0; } + dev = (struct aac_dev *)scsicmd->device->host->hostdata; switch(scsicmd->sc_data_direction){ case DMA_TO_DEVICE: flag = SRB_DataOut; @@ -2109,8 +2102,8 @@ static int aac_send_srb_fib(struct scsi_cmnd* scsicmd) srbcmd = (struct aac_srb*) fib_data(cmd_fibcontext); srbcmd->function = cpu_to_le32(SRBF_ExecuteScsi); - srbcmd->channel = cpu_to_le32(aac_logical_to_phys(scmd_channel(scsicmd))); - srbcmd->id = cpu_to_le32(scmd_id(scsicmd)); + srbcmd->channel = cpu_to_le32(aac_logical_to_phys(scsicmd->device->channel)); + srbcmd->id = cpu_to_le32(scsicmd->device->id); srbcmd->lun = cpu_to_le32(scsicmd->device->lun); srbcmd->flags = cpu_to_le32(flag); timeout = scsicmd->timeout_per_command/HZ; @@ -2167,8 +2160,7 @@ static int aac_send_srb_fib(struct scsi_cmnd* scsicmd) /* * Check that the command queued to the controller */ - if (status == -EINPROGRESS) { - scsicmd->SCp.phase = AAC_OWNER_FIRMWARE; + if (status == -EINPROGRESS){ return 0; } @@ -2199,6 +2191,8 @@ static unsigned long aac_build_sg(struct scsi_cmnd* scsicmd, struct sgmap* psg) scsicmd->sc_data_direction); psg->count = cpu_to_le32(sg_count); + byte_count = 0; + for (i = 0; i < sg_count; i++) { psg->sg[i].addr = cpu_to_le32(sg_dma_address(sg)); psg->sg[i].count = cpu_to_le32(sg_dma_len(sg)); @@ -2219,15 +2213,15 @@ static unsigned long aac_build_sg(struct scsi_cmnd* scsicmd, struct sgmap* psg) } } else if(scsicmd->request_bufflen) { - u32 addr; - scsicmd->SCp.dma_handle = pci_map_single(dev->pdev, + dma_addr_t addr; + addr = 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; @@ -2254,17 +2248,18 @@ static unsigned long aac_build_sg64(struct scsi_cmnd* scsicmd, struct sgmap64* p sg_count = pci_map_sg(dev->pdev, sg, scsicmd->use_sg, scsicmd->sc_data_direction); + psg->count = cpu_to_le32(sg_count); + + byte_count = 0; for (i = 0; i < sg_count; i++) { - int count = sg_dma_len(sg); addr = sg_dma_address(sg); psg->sg[i].addr[0] = cpu_to_le32(addr & 0xffffffff); psg->sg[i].addr[1] = cpu_to_le32(addr>>32); - psg->sg[i].count = cpu_to_le32(count); - byte_count += count; + psg->sg[i].count = cpu_to_le32(sg_dma_len(sg)); + byte_count += sg_dma_len(sg); sg++; } - psg->count = cpu_to_le32(sg_count); /* hba wants the size to be exact */ if(byte_count > scsicmd->request_bufflen){ u32 temp = le32_to_cpu(psg->sg[i-1].count) - @@ -2279,15 +2274,16 @@ static unsigned long aac_build_sg64(struct scsi_cmnd* scsicmd, struct sgmap64* p } } else if(scsicmd->request_bufflen) { - scsicmd->SCp.dma_handle = pci_map_single(dev->pdev, + u64 addr; + addr = 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[0] = cpu_to_le32(addr & 0xffffffff); psg->sg[0].addr[1] = cpu_to_le32(addr >> 32); psg->sg[0].count = cpu_to_le32(scsicmd->request_bufflen); + scsicmd->SCp.dma_handle = addr; byte_count = scsicmd->request_bufflen; } return byte_count; @@ -2376,7 +2372,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"}, @@ -2395,7 +2391,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"}, @@ -2410,9 +2406,11 @@ char *aac_get_status_string(u32 status) { int i; - for (i = 0; i < ARRAY_SIZE(srb_status_info); i++) - if (srb_status_info[i].status == status) + for(i=0; i < (sizeof(srb_status_info)/sizeof(struct aac_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 d0eecd4be..2d430b7e8 100644 --- a/drivers/scsi/aacraid/aacraid.h +++ b/drivers/scsi/aacraid/aacraid.h @@ -10,10 +10,6 @@ * D E F I N E S *----------------------------------------------------------------------------*/ -#ifndef AAC_DRIVER_BUILD -# define AAC_DRIVER_BUILD 2409 -# define AAC_DRIVER_BRANCH "-mh2" -#endif #define MAXIMUM_NUM_CONTAINERS 32 #define AAC_NUM_MGT_FIB 8 @@ -29,6 +25,7 @@ * These macros convert from physical channels to virtual channels */ #define CONTAINER_CHANNEL (0) +#define ID_LUN_TO_CONTAINER(id, lun) (id) #define CONTAINER_TO_CHANNEL(cont) (CONTAINER_CHANNEL) #define CONTAINER_TO_ID(cont) (cont) #define CONTAINER_TO_LUN(cont) (0) @@ -563,6 +560,7 @@ 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 */ }; @@ -791,7 +789,6 @@ struct fsa_dev_info { u64 size; u32 type; u32 config_waiting_on; - unsigned long config_waiting_stamp; u16 queue_depth; u8 config_needed; u8 valid; @@ -821,6 +818,11 @@ 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) @@ -995,7 +997,7 @@ struct aac_dev int maximum_num_physicals; int maximum_num_channels; struct fsa_dev_info *fsa_dev; - struct task_struct *thread; + pid_t thread_pid; int cardtype; /* @@ -1015,6 +1017,7 @@ struct aac_dev * AIF thread states */ u32 aif_thread; + struct completion aif_completion; struct aac_adapter_info adapter_info; struct aac_supplement_adapter_info supplement_adapter_info; /* These are in adapter info but they are in the io flow so @@ -1769,11 +1772,6 @@ static inline u32 cap_to_cyls(sector_t capacity, u32 divisor) } struct scsi_cmnd; -/* SCp.phase values */ -#define AAC_OWNER_MIDLEVEL 0x101 -#define AAC_OWNER_LOWLEVEL 0x102 -#define AAC_OWNER_ERROR_HANDLER 0x103 -#define AAC_OWNER_FIRMWARE 0x106 const char *aac_driverinfo(struct Scsi_Host *); struct fib *aac_fib_alloc(struct aac_dev *dev); @@ -1799,7 +1797,7 @@ int aac_sa_init(struct aac_dev *dev); unsigned int aac_response_normal(struct aac_queue * q); unsigned int aac_command_normal(struct aac_queue * q); unsigned int aac_intr_normal(struct aac_dev * dev, u32 Index); -int aac_command_thread(void *data); +int aac_command_thread(struct aac_dev * dev); int aac_close_fib_context(struct aac_dev * dev, struct aac_fib_context *fibctx); int aac_fib_adapter_complete(struct fib * fibptr, unsigned short size); struct aac_driver_ident* aac_get_driver_ident(int devtype); @@ -1809,5 +1807,3 @@ 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 255421de9..47fefca72 100644 --- a/drivers/scsi/aacraid/commctrl.c +++ b/drivers/scsi/aacraid/commctrl.c @@ -38,8 +38,6 @@ #include #include #include -#include -#include #include #include @@ -295,16 +293,6 @@ return_fib: status = 0; } else { spin_unlock_irqrestore(&dev->fib_lock, flags); - /* If someone killed the AIF aacraid thread, restart it */ - status = !dev->aif_thread; - if (status && dev->queues && dev->fsa_dev) { - /* Be paranoid, be very paranoid! */ - kthread_stop(dev->thread); - ssleep(1); - dev->aif_thread = 0; - dev->thread = kthread_run(aac_command_thread, dev, dev->name); - ssleep(1); - } if (f.wait) { if(down_interruptible(&fibctx->wait_sem) < 0) { status = -EINTR; @@ -535,7 +523,7 @@ static int aac_send_raw_srb(struct aac_dev* dev, void __user * arg) default: data_dir = DMA_NONE; } - if (user_srbcmd->sg.count > ARRAY_SIZE(sg_list)) { + if (user_srbcmd->sg.count > (sizeof(sg_list)/sizeof(sg_list[0]))) { dprintk((KERN_DEBUG"aacraid: too many sg entries %d\n", le32_to_cpu(srbcmd->sg.count))); rcode = -EINVAL; diff --git a/drivers/scsi/aacraid/comminit.c b/drivers/scsi/aacraid/comminit.c index 1cd3584ba..1628d0949 100644 --- a/drivers/scsi/aacraid/comminit.c +++ b/drivers/scsi/aacraid/comminit.c @@ -92,7 +92,28 @@ 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)); - init->HostPhysMemPages = cpu_to_le32(AAC_MAX_HOSTPHYSMEMPAGES); + /* + * 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->InitFlags = 0; if (dev->new_comm_interface) { @@ -138,6 +159,7 @@ 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); @@ -411,6 +433,7 @@ struct aac_dev *aac_init_adapter(struct aac_dev *dev) } INIT_LIST_HEAD(&dev->fib_list); + init_completion(&dev->aif_completion); return dev; } diff --git a/drivers/scsi/aacraid/commsup.c b/drivers/scsi/aacraid/commsup.c index 3f27419c6..609fd19b1 100644 --- a/drivers/scsi/aacraid/commsup.c +++ b/drivers/scsi/aacraid/commsup.c @@ -39,7 +39,6 @@ #include #include #include -#include #include #include #include @@ -229,7 +228,8 @@ void aac_fib_init(struct fib *fibptr) static void fib_dealloc(struct fib * fibptr) { struct hw_fib *hw_fib = fibptr->hw_fib; - BUG_ON(hw_fib->header.StructType != FIB_MAGIC); + if(hw_fib->header.StructType != FIB_MAGIC) + BUG(); hw_fib->header.XferState = 0; } @@ -471,6 +471,7 @@ 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) { @@ -479,6 +480,7 @@ 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; } @@ -489,6 +491,7 @@ 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); @@ -516,6 +519,7 @@ 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" @@ -529,7 +533,8 @@ int aac_fib_send(u16 command, struct fib *fibptr, unsigned long size, } } else down(&fibptr->event_wait); - BUG_ON(fibptr->done == 0); + if(fibptr->done == 0) + BUG(); if((fibptr->flags & FIB_CONTEXT_FLAG_TIMED_OUT)){ return -ETIMEDOUT; @@ -761,9 +766,9 @@ void aac_printf(struct aac_dev *dev, u32 val) if (cp[length] != 0) cp[length] = 0; if (level == LOG_AAC_HIGH_ERROR) - printk(KERN_WARNING "%s:%s", dev->name, cp); + printk(KERN_WARNING "aacraid:%s", cp); else - printk(KERN_INFO "%s:%s", dev->name, cp); + printk(KERN_INFO "aacraid:%s", cp); } memset(cp, 0, 256); } @@ -778,7 +783,6 @@ void aac_printf(struct aac_dev *dev, u32 val) * dispatches it to the appropriate routine for handling. */ -#define AIF_SNIFF_TIMEOUT (30*HZ) static void aac_handle_aif(struct aac_dev * dev, struct fib * fibptr) { struct hw_fib * hw_fib = fibptr->hw_fib; @@ -832,7 +836,6 @@ static void aac_handle_aif(struct aac_dev * dev, struct fib * fibptr) if (device) { dev->fsa_dev[container].config_needed = CHANGE; dev->fsa_dev[container].config_waiting_on = AifEnConfigChange; - dev->fsa_dev[container].config_waiting_stamp = jiffies; scsi_device_put(device); } } @@ -845,15 +848,13 @@ static void aac_handle_aif(struct aac_dev * dev, struct fib * fibptr) if (container != (u32)-1) { if (container >= dev->maximum_num_containers) break; - if ((dev->fsa_dev[container].config_waiting_on == - le32_to_cpu(*(u32 *)aifcmd->data)) && - time_before(jiffies, dev->fsa_dev[container].config_waiting_stamp + AIF_SNIFF_TIMEOUT)) + if (dev->fsa_dev[container].config_waiting_on == + le32_to_cpu(*(u32 *)aifcmd->data)) dev->fsa_dev[container].config_waiting_on = 0; } else for (container = 0; container < dev->maximum_num_containers; ++container) { - if ((dev->fsa_dev[container].config_waiting_on == - le32_to_cpu(*(u32 *)aifcmd->data)) && - time_before(jiffies, dev->fsa_dev[container].config_waiting_stamp + AIF_SNIFF_TIMEOUT)) + if (dev->fsa_dev[container].config_waiting_on == + le32_to_cpu(*(u32 *)aifcmd->data)) dev->fsa_dev[container].config_waiting_on = 0; } break; @@ -870,7 +871,6 @@ static void aac_handle_aif(struct aac_dev * dev, struct fib * fibptr) dev->fsa_dev[container].config_needed = ADD; dev->fsa_dev[container].config_waiting_on = AifEnConfigChange; - dev->fsa_dev[container].config_waiting_stamp = jiffies; break; /* @@ -883,7 +883,6 @@ static void aac_handle_aif(struct aac_dev * dev, struct fib * fibptr) dev->fsa_dev[container].config_needed = DELETE; dev->fsa_dev[container].config_waiting_on = AifEnConfigChange; - dev->fsa_dev[container].config_waiting_stamp = jiffies; break; /* @@ -894,13 +893,11 @@ static void aac_handle_aif(struct aac_dev * dev, struct fib * fibptr) container = le32_to_cpu(((u32 *)aifcmd->data)[1]); if (container >= dev->maximum_num_containers) break; - if (dev->fsa_dev[container].config_waiting_on && - time_before(jiffies, dev->fsa_dev[container].config_waiting_stamp + AIF_SNIFF_TIMEOUT)) + if (dev->fsa_dev[container].config_waiting_on) break; dev->fsa_dev[container].config_needed = CHANGE; dev->fsa_dev[container].config_waiting_on = AifEnConfigChange; - dev->fsa_dev[container].config_waiting_stamp = jiffies; break; case AifEnConfigChange: @@ -915,15 +912,13 @@ static void aac_handle_aif(struct aac_dev * dev, struct fib * fibptr) if (container != (u32)-1) { if (container >= dev->maximum_num_containers) break; - if ((dev->fsa_dev[container].config_waiting_on == - le32_to_cpu(*(u32 *)aifcmd->data)) && - time_before(jiffies, dev->fsa_dev[container].config_waiting_stamp + AIF_SNIFF_TIMEOUT)) + if (dev->fsa_dev[container].config_waiting_on == + le32_to_cpu(*(u32 *)aifcmd->data)) dev->fsa_dev[container].config_waiting_on = 0; } else for (container = 0; container < dev->maximum_num_containers; ++container) { - if ((dev->fsa_dev[container].config_waiting_on == - le32_to_cpu(*(u32 *)aifcmd->data)) && - time_before(jiffies, dev->fsa_dev[container].config_waiting_stamp + AIF_SNIFF_TIMEOUT)) + if (dev->fsa_dev[container].config_waiting_on == + le32_to_cpu(*(u32 *)aifcmd->data)) dev->fsa_dev[container].config_waiting_on = 0; } break; @@ -950,8 +945,6 @@ static void aac_handle_aif(struct aac_dev * dev, struct fib * fibptr) dev->fsa_dev[container].config_waiting_on = AifEnContainerChange; dev->fsa_dev[container].config_needed = ADD; - dev->fsa_dev[container].config_waiting_stamp = - jiffies; } } if ((((u32 *)aifcmd->data)[1] == cpu_to_le32(AifJobCtrZero)) @@ -967,8 +960,6 @@ static void aac_handle_aif(struct aac_dev * dev, struct fib * fibptr) dev->fsa_dev[container].config_waiting_on = AifEnContainerChange; dev->fsa_dev[container].config_needed = DELETE; - dev->fsa_dev[container].config_waiting_stamp = - jiffies; } } break; @@ -977,9 +968,8 @@ static void aac_handle_aif(struct aac_dev * dev, struct fib * fibptr) device_config_needed = NOTHING; for (container = 0; container < dev->maximum_num_containers; ++container) { - if ((dev->fsa_dev[container].config_waiting_on == 0) && - (dev->fsa_dev[container].config_needed != NOTHING) && - time_before(jiffies, dev->fsa_dev[container].config_waiting_stamp + AIF_SNIFF_TIMEOUT)) { + if ((dev->fsa_dev[container].config_waiting_on == 0) + && (dev->fsa_dev[container].config_needed != NOTHING)) { device_config_needed = dev->fsa_dev[container].config_needed; dev->fsa_dev[container].config_needed = NOTHING; @@ -1055,9 +1045,8 @@ static void aac_handle_aif(struct aac_dev * dev, struct fib * fibptr) * more FIBs. */ -int aac_command_thread(void *data) +int aac_command_thread(struct aac_dev * dev) { - struct aac_dev *dev = data; struct hw_fib *hw_fib, *hw_newfib; struct fib *fib, *newfib; struct aac_fib_context *fibctx; @@ -1069,7 +1058,12 @@ int aac_command_thread(void *data) */ if (dev->aif_thread) return -EINVAL; - + /* + * Set up the name that will appear in 'ps' + * stored in task_struct.comm[16]. + */ + daemonize("aacraid"); + allow_signal(SIGKILL); /* * Let the DPC know it has a place to send the AIF's to. */ @@ -1208,7 +1202,7 @@ int aac_command_thread(void *data) * since the last read off * the queue? */ - if ((time_now - time_last) > aif_timeout) { + if ((time_now - time_last) > 120) { entry = entry->next; aac_close_fib_context(dev, fibctx); continue; @@ -1272,12 +1266,13 @@ int aac_command_thread(void *data) spin_unlock_irqrestore(dev->queues->queue[HostNormCmdQueue].lock, flags); schedule(); - if (kthread_should_stop()) + if(signal_pending(current)) break; set_current_state(TASK_INTERRUPTIBLE); } if (dev->queues) remove_wait_queue(&dev->queues->queue[HostNormCmdQueue].cmdready, &wait); dev->aif_thread = 0; + complete_and_exit(&dev->aif_completion, 0); return 0; } diff --git a/drivers/scsi/aacraid/dpcsup.c b/drivers/scsi/aacraid/dpcsup.c index b2a5c7262..f6bcb9486 100644 --- a/drivers/scsi/aacraid/dpcsup.c +++ b/drivers/scsi/aacraid/dpcsup.c @@ -85,9 +85,10 @@ 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)) + if (!(fib->flags & FIB_CONTEXT_FLAG_TIMED_OUT)) { + list_del(&fib->queue); 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; @@ -283,6 +284,7 @@ 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 e42a479ce..271617890 100644 --- a/drivers/scsi/aacraid/linit.c +++ b/drivers/scsi/aacraid/linit.c @@ -27,6 +27,12 @@ * Abstract: Linux Driver entry module for Adaptec RAID Array Controller */ +#define AAC_DRIVER_VERSION "1.1-4" +#ifndef AAC_DRIVER_BRANCH +#define AAC_DRIVER_BRANCH "" +#endif +#define AAC_DRIVER_BUILD_DATE __DATE__ " " __TIME__ +#define AAC_DRIVERNAME "aacraid" #include #include @@ -39,11 +45,9 @@ #include #include #include -#include #include #include #include -#include #include #include @@ -56,13 +60,6 @@ #include "aacraid.h" -#define AAC_DRIVER_VERSION "1.1-5" -#ifndef AAC_DRIVER_BRANCH -#define AAC_DRIVER_BRANCH "" -#endif -#define AAC_DRIVER_BUILD_DATE __DATE__ " " __TIME__ -#define AAC_DRIVERNAME "aacraid" - #ifdef AAC_DRIVER_BUILD #define _str(x) #x #define str(x) _str(x) @@ -74,7 +71,7 @@ MODULE_AUTHOR("Red Hat Inc and Adaptec"); MODULE_DESCRIPTION("Dell PERC2, 2/Si, 3/Si, 3/Di, " "Adaptec Advanced Raid Products, " - "HP NetRAID-4M, IBM ServeRAID & ICP SCSI driver"); + "and HP NetRAID-4M SCSI driver"); MODULE_LICENSE("GPL"); MODULE_VERSION(AAC_DRIVER_FULL_VERSION); @@ -119,7 +116,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 }, /* ICP5445AU (Hurricane44) */ + { 0x9005, 0x0286, 0x9005, 0x02a3, 0, 0, 29 }, /* ICP5085AU (Hurricane) */ { 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 +140,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-3800SAS (Hurricane44) */ + { 0x9005, 0x0286, 0x9005, 0x02a2, 0, 0, 51 }, /* ASR-4810SAS (Hurricane */ { 0x9005, 0x0285, 0x1028, 0x0287, 0, 0, 52 }, /* Perc 320/DC*/ { 0x1011, 0x0046, 0x9005, 0x0365, 0, 0, 53 }, /* Adaptec 5400S (Mustang)*/ @@ -195,7 +192,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 ", "ICP5445AU ", 1 }, /* ICP5445AU (Hurricane44) */ + { aac_rkt_init, "aacraid", "ICP ", "ICP5085AU ", 1 }, /* ICP5085AU (Hurricane) */ { 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 +214,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-3800SAS ", 1 }, /* ASR-3800SAS (Hurricane44) */ + { aac_rkt_init, "aacraid", "ADAPTEC ", "ASR-4810SAS ", 1 }, /* ASR-4810SAS (Hurricane) */ { 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)*/ @@ -244,7 +241,6 @@ static struct aac_driver_ident aac_drivers[] = { static int aac_queuecommand(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *)) { cmd->scsi_done = done; - cmd->SCp.phase = AAC_OWNER_LOWLEVEL; return (aac_scsi_cmd(cmd) ? FAILED : 0); } @@ -453,10 +449,15 @@ 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; } /* @@ -468,8 +469,7 @@ static int aac_eh_reset(struct scsi_cmnd* cmd) __shost_for_each_device(dev, host) { spin_lock_irqsave(&dev->list_lock, flags); list_for_each_entry(command, &dev->cmd_list, list) { - if ((command != cmd) && - (command->SCp.phase == AAC_OWNER_FIRMWARE)) { + if (command->serial_number) { active++; break; } @@ -482,10 +482,13 @@ 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; } @@ -564,12 +567,12 @@ 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))) + if (clear_user(f, sizeof(*f) != sizeof(*f))) ret = -EFAULT; if (copy_in_user(f, (void __user *)arg, sizeof(struct fib_ioctl) - sizeof(u32))) ret = -EFAULT; if (!ret) - ret = aac_do_ioctl(dev, cmd, f); + ret = aac_do_ioctl(dev, cmd, (void __user *)arg); break; } @@ -682,18 +685,6 @@ static ssize_t aac_show_serial_number(struct class_device *class_dev, return len; } -static ssize_t aac_show_max_channel(struct class_device *class_dev, char *buf) -{ - return snprintf(buf, PAGE_SIZE, "%d\n", - class_to_shost(class_dev)->max_channel); -} - -static ssize_t aac_show_max_id(struct class_device *class_dev, char *buf) -{ - return snprintf(buf, PAGE_SIZE, "%d\n", - class_to_shost(class_dev)->max_id); -} - static struct class_device_attribute aac_model = { .attr = { @@ -737,20 +728,6 @@ static struct class_device_attribute aac_serial_number = { }, .show = aac_show_serial_number, }; -static struct class_device_attribute aac_max_channel = { - .attr = { - .name = "max_channel", - .mode = S_IRUGO, - }, - .show = aac_show_max_channel, -}; -static struct class_device_attribute aac_max_id = { - .attr = { - .name = "max_id", - .mode = S_IRUGO, - }, - .show = aac_show_max_id, -}; static struct class_device_attribute *aac_attrs[] = { &aac_model, @@ -759,8 +736,6 @@ static struct class_device_attribute *aac_attrs[] = { &aac_monitor_version, &aac_bios_version, &aac_serial_number, - &aac_max_channel, - &aac_max_id, NULL }; @@ -798,7 +773,6 @@ static struct scsi_host_template aac_driver_template = { .cmd_per_lun = AAC_NUM_IO_FIB, #endif .use_clustering = ENABLE_CLUSTERING, - .emulated = 1, }; @@ -822,19 +796,18 @@ static int __devinit aac_probe_one(struct pci_dev *pdev, error = pci_enable_device(pdev); if (error) goto out; - error = -ENODEV; if (pci_set_dma_mask(pdev, DMA_32BIT_MASK) || pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK)) - goto out_disable_pdev; + goto out; /* * If the quirk31 bit is set, the adapter needs adapter * to driver communication memory to be allocated below 2gig */ if (aac_drivers[index].quirks & AAC_QUIRK_31BIT) - if (pci_set_dma_mask(pdev, DMA_31BIT_MASK) || - pci_set_consistent_dma_mask(pdev, DMA_31BIT_MASK)) - goto out_disable_pdev; + if (pci_set_dma_mask(pdev, 0x7FFFFFFFULL) || + pci_set_consistent_dma_mask(pdev, 0x7FFFFFFFULL)) + goto out; pci_set_master(pdev); @@ -877,10 +850,10 @@ static int __devinit aac_probe_one(struct pci_dev *pdev, /* * Start any kernel threads needed */ - aac->thread = kthread_run(aac_command_thread, aac, AAC_DRIVERNAME); - if (IS_ERR(aac->thread)) { + aac->thread_pid = kernel_thread((int (*)(void *))aac_command_thread, + aac, 0); + if (aac->thread_pid < 0) { printk(KERN_ERR "aacraid: Unable to create command thread.\n"); - error = PTR_ERR(aac->thread); goto out_deinit; } @@ -929,9 +902,9 @@ static int __devinit aac_probe_one(struct pci_dev *pdev, * physical channels are address by their actual physical number+1 */ if (aac->nondasd_support == 1) - shost->max_channel = aac->maximum_num_channels; + shost->max_channel = aac->maximum_num_channels + 1; else - shost->max_channel = 0; + shost->max_channel = 1; aac_get_config_status(aac); aac_get_containers(aac); @@ -961,7 +934,9 @@ static int __devinit aac_probe_one(struct pci_dev *pdev, return 0; out_deinit: - kthread_stop(aac->thread); + kill_proc(aac->thread_pid, SIGKILL, 0); + wait_for_completion(&aac->aif_completion); + aac_send_shutdown(aac); aac_adapter_disable_int(aac); free_irq(pdev->irq, aac); @@ -995,7 +970,8 @@ static void __devexit aac_remove_one(struct pci_dev *pdev) scsi_remove_host(shost); - kthread_stop(aac->thread); + kill_proc(aac->thread_pid, SIGKILL, 0); + wait_for_completion(&aac->aif_completion); aac_send_shutdown(aac); aac_adapter_disable_int(aac); @@ -1045,8 +1021,7 @@ static int __init aac_init(void) static void __exit aac_exit(void) { - if (aac_cfg_major > -1) - unregister_chrdev(aac_cfg_major, "aac"); + unregister_chrdev(aac_cfg_major, "aac"); pci_unregister_driver(&aac_pci_driver); } diff --git a/drivers/scsi/aacraid/rkt.c b/drivers/scsi/aacraid/rkt.c index 458ea897f..e9b775d6b 100644 --- a/drivers/scsi/aacraid/rkt.c +++ b/drivers/scsi/aacraid/rkt.c @@ -183,7 +183,7 @@ static int rkt_sync_cmd(struct aac_dev *dev, u32 command, /* * Yield the processor in case we are slow */ - msleep(1); + schedule_timeout_uninterruptible(1); } if (ok != 1) { /* @@ -343,7 +343,7 @@ static int aac_rkt_check_health(struct aac_dev *dev) NULL, NULL, NULL, NULL, NULL); pci_free_consistent(dev->pdev, sizeof(struct POSTSTATUS), post, paddr); - if ((buffer[0] == '0') && ((buffer[1] == 'x') || (buffer[1] == 'X'))) { + if ((buffer[0] == '0') && (buffer[1] == 'x')) { ret = (buffer[2] <= '9') ? (buffer[2] - '0') : (buffer[2] - 'A' + 10); ret <<= 4; ret += (buffer[3] <= '9') ? (buffer[3] - '0') : (buffer[3] - 'A' + 10); @@ -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+startup_timeout*HZ)) + if(time_after(jiffies, start+180*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; } - msleep(1); + schedule_timeout_uninterruptible(1); } - if (request_irq(dev->scsi_host_ptr->irq, aac_rkt_intr, IRQF_SHARED|IRQF_DISABLED, "aacraid", (void *)dev)<0) + if (request_irq(dev->scsi_host_ptr->irq, aac_rkt_intr, SA_SHIRQ|SA_INTERRUPT, "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 035018db6..6998bc877 100644 --- a/drivers/scsi/aacraid/rx.c +++ b/drivers/scsi/aacraid/rx.c @@ -183,7 +183,7 @@ static int rx_sync_cmd(struct aac_dev *dev, u32 command, /* * Yield the processor in case we are slow */ - msleep(1); + schedule_timeout_uninterruptible(1); } if (ok != 1) { /* @@ -342,7 +342,7 @@ static int aac_rx_check_health(struct aac_dev *dev) NULL, NULL, NULL, NULL, NULL); pci_free_consistent(dev->pdev, sizeof(struct POSTSTATUS), post, paddr); - if ((buffer[0] == '0') && ((buffer[1] == 'x') || (buffer[1] == 'X'))) { + if ((buffer[0] == '0') && (buffer[1] == 'x')) { ret = (buffer[2] <= '9') ? (buffer[2] - '0') : (buffer[2] - 'A' + 10); ret <<= 4; ret += (buffer[3] <= '9') ? (buffer[3] - '0') : (buffer[3] - 'A' + 10); @@ -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+startup_timeout*HZ)) + if(time_after(jiffies, start+180*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; } - msleep(1); + schedule_timeout_uninterruptible(1); } - if (request_irq(dev->scsi_host_ptr->irq, aac_rx_intr, IRQF_SHARED|IRQF_DISABLED, "aacraid", (void *)dev)<0) + if (request_irq(dev->scsi_host_ptr->irq, aac_rx_intr, SA_SHIRQ|SA_INTERRUPT, "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 cd586cc8f..466f05cfb 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 - sa_writew(dev, DoorbellClrReg_p, DOORBELL_1); aac_command_normal(&dev->queues->queue[HostNormCmdQueue]); + sa_writew(dev, DoorbellClrReg_p, DOORBELL_1); } else if (intstat & DOORBELL_2) { // dev -> Host Normal Response Ready - sa_writew(dev, DoorbellClrReg_p, DOORBELL_2); aac_response_normal(&dev->queues->queue[HostNormRespQueue]); + sa_writew(dev, DoorbellClrReg_p, DOORBELL_2); } 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 @@ -189,7 +189,7 @@ static int sa_sync_cmd(struct aac_dev *dev, u32 command, ok = 1; break; } - msleep(1); + schedule_timeout_uninterruptible(1); } if (ok != 1) @@ -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+startup_timeout*HZ)) { + if (time_after(jiffies, start+180*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; } - msleep(1); + schedule_timeout_uninterruptible(1); } - if (request_irq(dev->scsi_host_ptr->irq, aac_sa_intr, IRQF_SHARED|IRQF_DISABLED, "aacraid", (void *)dev ) < 0) { + if (request_irq(dev->scsi_host_ptr->irq, aac_sa_intr, SA_SHIRQ|SA_INTERRUPT, "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 773f02e3b..da2b04262 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 IRQF_SHARED flag for + 2. Add support for IRQ sharing by setting the SA_SHIRQ 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 IRQF_DISABLED + 5. Try allocating an IRQ both with and without the SA_INTERRUPT flag set to allow IRQ sharing with drivers that do not set - the IRQF_DISABLED flag. Also display a more descriptive error + the SA_INTERRUPT flag. Also display a more descriptive error message if request_irq() fails. 6. Update to latest Asc and Adv Libraries. @@ -754,6 +754,7 @@ * --- Linux Include Files */ +#include #include #if defined(CONFIG_X86) && !defined(CONFIG_ISA) @@ -5191,19 +5192,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 IRQF_DISABLED flag set, - * then try again without the IRQF_DISABLED flag set. This + * If request_irq() fails with the SA_INTERRUPT flag set, + * then try again without the SA_INTERRUPT flag set. This * allows IRQ sharing to work even with other drivers that - * do not set the IRQF_DISABLED flag. + * do not set the SA_INTERRUPT flag. * - * If IRQF_DISABLED is not set, then interrupts are enabled + * If SA_INTERRUPT is not set, then interrupts are enabled * before the driver interrupt function is called. */ if (((ret = request_irq(shp->irq, advansys_interrupt, - IRQF_DISABLED | (share_irq == TRUE ? IRQF_SHARED : 0), + SA_INTERRUPT | (share_irq == TRUE ? SA_SHIRQ : 0), "advansys", boardp)) != 0) && ((ret = request_irq(shp->irq, advansys_interrupt, - (share_irq == TRUE ? IRQF_SHARED : 0), + (share_irq == TRUE ? SA_SHIRQ : 0), "advansys", boardp)) != 0)) { if (ret == -EBUSY) { @@ -12362,7 +12363,7 @@ AscInitFromEEP(ASC_DVC_VAR *asc_dvc) ASC_PRINT1( "AscInitFromEEP: Failed to re-write EEPROM with %d errors.\n", i); } else { - ASC_PRINT("AscInitFromEEP: Successfully re-wrote EEPROM.\n"); + ASC_PRINT("AscInitFromEEP: Succesfully re-wrote EEPROM."); } } return (warn_code); diff --git a/drivers/scsi/aha152x.c b/drivers/scsi/aha152x.c index f974869ea..531a1f9ce 100644 --- a/drivers/scsi/aha152x.c +++ b/drivers/scsi/aha152x.c @@ -551,11 +551,6 @@ 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; }; @@ -860,7 +855,7 @@ struct Scsi_Host *aha152x_probe_one(struct aha152x_setup *setup) SETPORT(SIMODE0, 0); SETPORT(SIMODE1, 0); - if( request_irq(shpnt->irq, swintr, IRQF_DISABLED|IRQF_SHARED, "aha152x", shpnt) ) { + if( request_irq(shpnt->irq, swintr, SA_INTERRUPT|SA_SHIRQ, "aha152x", shpnt) ) { printk(KERN_ERR "aha152x%d: irq %d busy.\n", shpnt->host_no, shpnt->irq); goto out_host_put; } @@ -894,7 +889,7 @@ struct Scsi_Host *aha152x_probe_one(struct aha152x_setup *setup) SETPORT(SSTAT0, 0x7f); SETPORT(SSTAT1, 0xef); - if ( request_irq(shpnt->irq, intr, IRQF_DISABLED|IRQF_SHARED, "aha152x", shpnt) ) { + if ( request_irq(shpnt->irq, intr, SA_INTERRUPT|SA_SHIRQ, "aha152x", shpnt) ) { printk(KERN_ERR "aha152x%d: failed to reassign irq %d.\n", shpnt->host_no, shpnt->irq); goto out_host_put; } @@ -1011,20 +1006,11 @@ 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; @@ -1179,10 +1165,6 @@ 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) @@ -1216,11 +1198,11 @@ static int aha152x_device_reset(Scsi_Cmnd * SCpnt) add_timer(&timer); down(&sem); del_timer(&timer); - - SCpnt->cmd_len = old_cmd_len; - SCpnt->use_sg = old_use_sg; - SCpnt->request_buffer = old_buffer; - SCpnt->request_bufflen = old_bufflen; + + SCpnt->cmd_len = SCpnt->old_cmd_len; + SCpnt->use_sg = SCpnt->old_use_sg; + SCpnt->request_buffer = SCpnt->buffer; + SCpnt->request_bufflen = SCpnt->bufflen; DO_LOCK(flags); @@ -1583,9 +1565,6 @@ 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)); @@ -1594,13 +1573,13 @@ static void busfree_run(struct Scsi_Host *shpnt) #endif /* restore old command */ - 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; + 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; - cmd->SCp.Status = 0x02; + DONE_SC->SCp.Status = 0x02; HOSTDATA(shpnt)->commands--; if (!HOSTDATA(shpnt)->commands) @@ -1737,7 +1716,12 @@ static void seldo_run(struct Scsi_Host *shpnt) ADDMSGO(BUS_DEVICE_RESET); } else if (SYNCNEG==0 && SYNCHRONOUS) { CURRENT_SC->SCp.phase |= syncneg; - MSGOLEN += spi_populate_sync_msg(&MSGO(MSGOLEN), 50, 8); + ADDMSGO(EXTENDED_MESSAGE); + ADDMSGO(3); + ADDMSGO(EXTENDED_SDTR); + ADDMSGO(50); /* 200ns */ + ADDMSGO(8); /* 8 byte req/ack offset */ + SYNCNEG=1; /* negotiation in progress */ } diff --git a/drivers/scsi/aha1542.c b/drivers/scsi/aha1542.c index 24f0f5461..51bad7a1e 100644 --- a/drivers/scsi/aha1542.c +++ b/drivers/scsi/aha1542.c @@ -25,6 +25,7 @@ * Added proper detection of the AHA-1640 (MCA version of AHA-1540) */ +#include #include #include #include @@ -1010,7 +1011,7 @@ static int __init do_setup(char *str) int count=setup_idx; - get_options(str, ARRAY_SIZE(ints), ints); + get_options(str, sizeof(ints)/sizeof(int), ints); aha1542_setup(str,ints); return count #define DRV_NAME "ahci" -#define DRV_VERSION "2.0" +#define DRV_VERSION "1.2" enum { @@ -56,28 +56,20 @@ enum { AHCI_MAX_SG = 168, /* hardware max is 64K */ AHCI_DMA_BOUNDARY = 0xffffffff, AHCI_USE_CLUSTERING = 0, - AHCI_MAX_CMDS = 32, - AHCI_CMD_SZ = 32, - AHCI_CMD_SLOT_SZ = AHCI_MAX_CMDS * AHCI_CMD_SZ, + AHCI_CMD_SLOT_SZ = 32 * 32, AHCI_RX_FIS_SZ = 256, + AHCI_CMD_TBL_HDR = 0x80, 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_CMD_TBL_SZ = AHCI_CMD_TBL_HDR + (AHCI_MAX_SG * 16), + AHCI_PORT_PRIV_DMA_SZ = AHCI_CMD_SLOT_SZ + AHCI_CMD_TBL_SZ + AHCI_RX_FIS_SZ, 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 */ @@ -92,10 +84,6 @@ 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 */ @@ -135,39 +123,31 @@ 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_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_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_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 { @@ -196,6 +176,7 @@ 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; }; @@ -203,22 +184,17 @@ 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 unsigned int ahci_qc_issue(struct ata_queued_cmd *qc); +static 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_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 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 inline int ahci_host_intr(struct ata_port *ap, struct ata_queued_cmd *qc); static void ahci_remove_one (struct pci_dev *pdev); static struct scsi_host_template ahci_sht = { @@ -226,20 +202,18 @@ static struct scsi_host_template ahci_sht = { .name = DRV_NAME, .ioctl = ata_scsi_ioctl, .queuecommand = ata_scsi_queuecmd, - .change_queue_depth = ata_scsi_change_queue_depth, - .can_queue = AHCI_MAX_CMDS - 1, + .eh_strategy_handler = ata_scsi_error, + .can_queue = ATA_DEF_QUEUE, .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, - .suspend = ata_scsi_device_suspend, - .resume = ata_scsi_device_resume, }; static const struct ata_port_operations ahci_ops = { @@ -251,24 +225,19 @@ static const struct ata_port_operations ahci_ops = { .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, }; @@ -278,19 +247,8 @@ static const struct ata_port_info ahci_port_info[] = { { .sht = &ahci_sht, .host_flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY | - 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, + ATA_FLAG_SATA_RESET | ATA_FLAG_MMIO | + ATA_FLAG_PIO_DMA, .pio_mask = 0x1f, /* pio0-4 */ .udma_mask = 0x7f, /* udma0-6 ; FIXME */ .port_ops = &ahci_ops, @@ -298,7 +256,6 @@ static const struct ata_port_info ahci_port_info[] = { }; 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, @@ -329,39 +286,10 @@ static const struct pci_device_id ahci_pci_tbl[] = { 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 */ }; @@ -370,8 +298,6 @@ static struct pci_driver ahci_pci_driver = { .name = DRV_NAME, .id_table = ahci_pci_tbl, .probe = ahci_init_one, - .suspend = ahci_pci_device_suspend, - .resume = ahci_pci_device_resume, .remove = ahci_remove_one, }; @@ -386,296 +312,155 @@ static inline void __iomem *ahci_port_base (void __iomem *base, unsigned int por 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) +static int ahci_port_start(struct ata_port *ap) { - unsigned int sc_reg; + 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; - switch (sc_reg_in) { - case SCR_STATUS: sc_reg = 0; break; - case SCR_CONTROL: sc_reg = 1; break; - case SCR_ERROR: sc_reg = 2; break; - case SCR_ACTIVE: sc_reg = 3; break; - default: - return 0xffffffffU; + 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; } - return readl((void __iomem *) ap->ioaddr.scr_addr + (sc_reg * 4)); -} + 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; -static void ahci_scr_write (struct ata_port *ap, unsigned int sc_reg_in, - u32 val) -{ - unsigned int sc_reg; + mem += AHCI_CMD_SLOT_SZ; + mem_dma += AHCI_CMD_SLOT_SZ; - switch (sc_reg_in) { - case SCR_STATUS: sc_reg = 0; break; - case SCR_CONTROL: sc_reg = 1; break; - case SCR_ERROR: sc_reg = 2; break; - case SCR_ACTIVE: sc_reg = 3; break; - default: - return; - } + /* + * Second item: Received-FIS area + */ + pp->rx_fis = mem; + pp->rx_fis_dma = mem_dma; - writel(val, (void __iomem *) ap->ioaddr.scr_addr + (sc_reg * 4)); -} + mem += AHCI_RX_FIS_SZ; + mem_dma += AHCI_RX_FIS_SZ; -static void ahci_start_engine(void __iomem *port_mmio) -{ - u32 tmp; + /* + * Third item: data area for storing a single command + * and its scatter-gather table + */ + pp->cmd_tbl = mem; + pp->cmd_tbl_dma = mem_dma; - /* start DMA */ - tmp = readl(port_mmio + PORT_CMD); - tmp |= PORT_CMD_START; - writel(tmp, port_mmio + PORT_CMD); - readl(port_mmio + PORT_CMD); /* flush */ -} + pp->cmd_tbl_sg = mem + AHCI_CMD_TBL_HDR; -static int ahci_stop_engine(void __iomem *port_mmio) -{ - u32 tmp; - - tmp = readl(port_mmio + PORT_CMD); + ap->private_data = pp; - /* check if the HBA is idle */ - if ((tmp & (PORT_CMD_START | PORT_CMD_LIST_ON)) == 0) - return 0; + 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 */ - /* setting HBA to idle */ - tmp &= ~PORT_CMD_START; - writel(tmp, port_mmio + PORT_CMD); + 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 */ - /* 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; + 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; } -static void ahci_start_fis_rx(void __iomem *port_mmio, u32 cap, - dma_addr_t cmd_slot_dma, dma_addr_t rx_fis_dma) -{ - u32 tmp; - - /* 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); - - 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); - - /* enable FIS reception */ - tmp = readl(port_mmio + PORT_CMD); - tmp |= PORT_CMD_FIS_RX; - writel(tmp, port_mmio + PORT_CMD); - - /* flush */ - readl(port_mmio + PORT_CMD); -} -static int ahci_stop_fis_rx(void __iomem *port_mmio) +static void ahci_port_stop(struct ata_port *ap) { + struct device *dev = ap->host_set->dev; + 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); u32 tmp; - /* disable FIS reception */ tmp = readl(port_mmio + PORT_CMD); - tmp &= ~PORT_CMD_FIS_RX; + tmp &= ~(PORT_CMD_START | PORT_CMD_FIS_RX); writel(tmp, port_mmio + PORT_CMD); + readl(port_mmio + PORT_CMD); /* flush */ - /* 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; - - return 0; -} - -static void ahci_power_up(void __iomem *port_mmio, u32 cap) -{ - u32 cmd; - - cmd = readl(port_mmio + PORT_CMD) & ~PORT_CMD_ICC_MASK; - - /* spin up device */ - if (cap & HOST_CAP_SSS) { - cmd |= PORT_CMD_SPIN_UP; - writel(cmd, port_mmio + PORT_CMD); - } - - /* wake up link */ - writel(cmd | PORT_CMD_ICC_ACTIVE, port_mmio + PORT_CMD); -} - -static void ahci_power_down(void __iomem *port_mmio, u32 cap) -{ - u32 cmd, scontrol; - - cmd = readl(port_mmio + PORT_CMD) & ~PORT_CMD_ICC_MASK; - - 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); - } - - /* put device into slumber mode */ - writel(cmd | PORT_CMD_ICC_SLUMBER, port_mmio + PORT_CMD); - - /* wait for the transition to complete */ - ata_wait_register(port_mmio + PORT_CMD, PORT_CMD_ICC_SLUMBER, - PORT_CMD_ICC_SLUMBER, 1, 50); - } - - /* 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); - - /* then set PxCMD.SUD to 0 */ - cmd &= ~PORT_CMD_SPIN_UP; - writel(cmd, port_mmio + PORT_CMD); - } -} - -static void ahci_init_port(void __iomem *port_mmio, u32 cap, - dma_addr_t cmd_slot_dma, dma_addr_t rx_fis_dma) -{ - /* power up */ - ahci_power_up(port_mmio, cap); - - /* enable FIS reception */ - ahci_start_fis_rx(port_mmio, cap, cmd_slot_dma, rx_fis_dma); + /* spec says 500 msecs for each PORT_CMD_{START,FIS_RX} bit, so + * this is slightly incorrect. + */ + msleep(500); - /* enable DMA */ - ahci_start_engine(port_mmio); + 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 int ahci_deinit_port(void __iomem *port_mmio, u32 cap, const char **emsg) +static u32 ahci_scr_read (struct ata_port *ap, unsigned int sc_reg_in) { - int rc; - - /* disable DMA */ - rc = ahci_stop_engine(port_mmio); - if (rc) { - *emsg = "failed to stop engine"; - return rc; - } + unsigned int sc_reg; - /* disable FIS reception */ - rc = ahci_stop_fis_rx(port_mmio); - if (rc) { - *emsg = "failed stop FIS RX"; - return rc; + switch (sc_reg_in) { + case SCR_STATUS: sc_reg = 0; break; + case SCR_CONTROL: sc_reg = 1; break; + case SCR_ERROR: sc_reg = 2; break; + case SCR_ACTIVE: sc_reg = 3; break; + default: + return 0xffffffffU; } - /* put device into slumber mode */ - ahci_power_down(port_mmio, cap); - - return 0; + return readl((void __iomem *) ap->ioaddr.scr_addr + (sc_reg * 4)); } -static int ahci_reset_controller(void __iomem *mmio, struct pci_dev *pdev) -{ - u32 cap_save, tmp; - - 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) { - dev_printk(KERN_ERR, &pdev->dev, - "controller reset failed (0x%x)\n", 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 */ - - if (pdev->vendor == PCI_VENDOR_ID_INTEL) { - u16 tmp16; - - /* configure PCS */ - pci_read_config_word(pdev, 0x92, &tmp16); - tmp16 |= 0xf; - pci_write_config_word(pdev, 0x92, tmp16); - } - - return 0; -} -static void ahci_init_controller(void __iomem *mmio, struct pci_dev *pdev, - int n_ports, u32 cap) +static void ahci_scr_write (struct ata_port *ap, unsigned int sc_reg_in, + u32 val) { - int i, rc; - u32 tmp; - - for (i = 0; i < n_ports; i++) { - void __iomem *port_mmio = ahci_port_base(mmio, i); - const char *emsg = NULL; - -#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); + unsigned int sc_reg; - writel(1 << i, mmio + HOST_IRQ_STAT); - writel(0, port_mmio + PORT_IRQ_MASK); + switch (sc_reg_in) { + case SCR_STATUS: sc_reg = 0; break; + case SCR_CONTROL: sc_reg = 1; break; + case SCR_ERROR: sc_reg = 2; break; + case SCR_ACTIVE: sc_reg = 3; break; + default: + return; } - 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); + writel(val, (void __iomem *) ap->ioaddr.scr_addr + (sc_reg * 4)); } -static unsigned int ahci_dev_classify(struct ata_port *ap) +static void ahci_phy_reset(struct ata_port *ap) { void __iomem *port_mmio = (void __iomem *) ap->ioaddr.cmd_addr; struct ata_taskfile tf; - u32 tmp; + struct ata_device *dev = &ap->device[0]; + u32 new_tmp, tmp; + + __sata_phy_reset(ap); + + if (ap->flags & ATA_FLAG_PORT_DISABLED) + return; tmp = readl(port_mmio + PORT_SIG); tf.lbah = (tmp >> 24) & 0xff; @@ -683,202 +468,15 @@ static unsigned int ahci_dev_classify(struct ata_port *ap) 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); + dev->class = ata_dev_classify(&tf); + if (!ata_dev_present(dev)) { + ata_port_disable(ap); + return; } - 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) + if (dev->class == ATA_DEV_ATAPI) new_tmp |= PORT_CMD_ATAPI; else new_tmp &= ~PORT_CMD_ATAPI; @@ -903,8 +501,9 @@ static void ahci_tf_read(struct ata_port *ap, struct ata_taskfile *tf) ata_tf_from_fis(d2h_fis, tf); } -static unsigned int ahci_fill_sg(struct ata_queued_cmd *qc, void *cmd_tbl) +static unsigned int ahci_fill_sg(struct ata_queued_cmd *qc) { + struct ahci_port_priv *pp = qc->ap->private_data; struct scatterlist *sg; struct ahci_sg *ahci_sg; unsigned int n_sg = 0; @@ -914,7 +513,7 @@ static unsigned int ahci_fill_sg(struct ata_queued_cmd *qc, void *cmd_tbl) /* * Next, the S/G list. */ - ahci_sg = cmd_tbl + AHCI_CMD_TBL_HDR_SZ; + ahci_sg = pp->cmd_tbl_sg; ata_for_each_sg(sg, qc) { dma_addr_t addr = sg_dma_address(sg); u32 sg_len = sg_dma_len(sg); @@ -934,147 +533,176 @@ 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. + * Fill in command slot information (currently only one slot, + * slot 0, is currently since we don't do queueing) */ - 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; + opts = cmd_fis_len; if (qc->tf.flags & ATA_TFLAG_WRITE) opts |= AHCI_CMD_WRITE; - if (is_atapi) - opts |= AHCI_CMD_ATAPI | AHCI_CMD_PREFETCH; + if (is_atapi_taskfile(&qc->tf)) + opts |= AHCI_CMD_ATAPI; - ahci_fill_cmd_slot(pp, qc->tag, opts); -} + 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_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; + /* + * 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); + if (opts & AHCI_CMD_ATAPI) { + memset(pp->cmd_tbl + AHCI_CMD_TBL_CDB, 0, 32); + memcpy(pp->cmd_tbl + AHCI_CMD_TBL_CDB, qc->cdb, ap->cdb_len); + } - ata_ehi_clear_desc(ehi); + if (!(qc->flags & ATA_QCFLAG_DMAMAP)) + return; - /* AHCI needs SError cleared; otherwise, it might lock up */ - serror = ahci_scr_read(ap, SCR_ERROR); - ahci_scr_write(ap, SCR_ERROR, serror); + n_elem = ahci_fill_sg(qc); - /* analyze @irq_stat */ - ata_ehi_push_desc(ehi, "irq_stat 0x%08x", irq_stat); + pp->cmd_slot[0].opts |= cpu_to_le32(n_elem << 16); +} - if (irq_stat & PORT_IRQ_TF_ERR) - err_mask |= AC_ERR_DEV; +static void ahci_restart_port(struct ata_port *ap, u32 irq_stat) +{ + void __iomem *mmio = ap->host_set->mmio_base; + void __iomem *port_mmio = ahci_port_base(mmio, ap->port_no); + u32 tmp; + int work; + + if ((ap->device[0].class != ATA_DEV_ATAPI) || + ((irq_stat & PORT_IRQ_TF_ERR) == 0)) + printk(KERN_WARNING "ata%u: port reset, " + "p_is %x is %x pis %x cmd %x tf %x ss %x se %x\n", + ap->id, + irq_stat, + readl(mmio + HOST_IRQ_STAT), + readl(port_mmio + PORT_IRQ_STAT), + readl(port_mmio + PORT_CMD), + readl(port_mmio + PORT_TFDATA), + readl(port_mmio + PORT_SCR_STAT), + readl(port_mmio + PORT_SCR_ERR)); + + /* stop DMA */ + tmp = readl(port_mmio + PORT_CMD); + tmp &= ~PORT_CMD_START; + writel(tmp, port_mmio + PORT_CMD); - if (irq_stat & (PORT_IRQ_HBUS_ERR | PORT_IRQ_HBUS_DATA_ERR)) { - err_mask |= AC_ERR_HOST_BUS; - action |= ATA_EH_SOFTRESET; + /* 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 (irq_stat & PORT_IRQ_IF_ERR) { - err_mask |= AC_ERR_ATA_BUS; - action |= ATA_EH_SOFTRESET; - ata_ehi_push_desc(ehi, ", interface fatal error"); - } + /* clear SATA phy error, if any */ + tmp = readl(port_mmio + PORT_SCR_ERR); + writel(tmp, port_mmio + PORT_SCR_ERR); - 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 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 */ } - if (irq_stat & PORT_IRQ_UNK_FIS) { - u32 *unk = (u32 *)(pp->rx_fis + RX_FIS_UNK); + /* 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 */ +} - 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]); - } +static void ahci_eng_timeout(struct ata_port *ap) +{ + struct ata_host_set *host_set = ap->host_set; + void __iomem *mmio = host_set->mmio_base; + void __iomem *port_mmio = ahci_port_base(mmio, ap->port_no); + struct ata_queued_cmd *qc; + unsigned long flags; + + printk(KERN_WARNING "ata%u: handling error/timeout\n", ap->id); - /* okay, let's hand over to EH */ - ehi->serror |= serror; - ehi->action |= action; + spin_lock_irqsave(&host_set->lock, flags); qc = ata_qc_from_tag(ap, ap->active_tag); - if (qc) - qc->err_mask |= err_mask; - else - ehi->err_mask |= err_mask; + if (!qc) { + printk(KERN_ERR "ata%u: BUG: timeout without command\n", + ap->id); + } else { + ahci_restart_port(ap, readl(port_mmio + PORT_IRQ_STAT)); + + /* 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->err_mask |= AC_ERR_OTHER; + ata_qc_complete(qc); + } - if (irq_stat & PORT_IRQ_FREEZE) - ata_port_freeze(ap); - else - ata_port_abort(ap); + spin_unlock_irqrestore(&host_set->lock, flags); } -static void ahci_host_intr(struct ata_port *ap) +static inline int ahci_host_intr(struct ata_port *ap, struct ata_queued_cmd *qc) { 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; + 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); - if (unlikely(status & PORT_IRQ_ERROR)) { - ahci_error_intr(ap, status); - return; + ci = readl(port_mmio + PORT_CMD_ISSUE); + if (likely((ci & 0x1) == 0)) { + if (qc) { + assert(qc->err_mask == 0); + ata_qc_complete(qc); + qc = NULL; + } } - 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; + if (status & PORT_IRQ_FATAL) { + unsigned int err_mask; + if (status & PORT_IRQ_TF_ERR) + err_mask = AC_ERR_DEV; + else if (status & PORT_IRQ_IF_ERR) + err_mask = AC_ERR_ATA_BUS; + else + err_mask = AC_ERR_HOST_BUS; + + /* command processing has stopped due to error; restart */ + ahci_restart_port(ap, status); + + if (qc) { + qc->err_mask |= AC_ERR_OTHER; + ata_qc_complete(qc); + } } - /* 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); + return 1; } static void ahci_irq_clear(struct ata_port *ap) @@ -1082,7 +710,7 @@ static void ahci_irq_clear(struct ata_port *ap) /* TODO */ } -static irqreturn_t ahci_interrupt(int irq, void *dev_instance, struct pt_regs *regs) +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; @@ -1111,7 +739,14 @@ static irqreturn_t ahci_interrupt(int irq, void *dev_instance, struct pt_regs *r ap = host_set->ports[i]; if (ap) { - ahci_host_intr(ap); + struct ata_queued_cmd *qc; + qc = ata_qc_from_tag(ap, ap->active_tag); + if (!ahci_host_intr(ap, qc)) + if (ata_ratelimit()) + dev_printk(KERN_WARNING, host_set->dev, + "unhandled interrupt on port %u\n", + i); + VPRINTK("port %u\n", i); } else { VPRINTK("port %u (no irq)\n", i); @@ -1128,241 +763,24 @@ static irqreturn_t ahci_interrupt(int irq, void *dev_instance, struct pt_regs *r handled = 1; } - spin_unlock(&host_set->lock); + spin_unlock(&host_set->lock); VPRINTK("EXIT\n"); return IRQ_RETVAL(handled); } -static unsigned int ahci_qc_issue(struct ata_queued_cmd *qc) +static 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); + writel(1, 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) { @@ -1381,12 +799,47 @@ 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; - unsigned int i, using_dac; + u32 tmp, cap_save; + unsigned int i, j, using_dac; int rc; + void __iomem *port_mmio; - rc = ahci_reset_controller(mmio, pdev); - if (rc) - return rc; + 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) { + dev_printk(KERN_ERR, &pdev->dev, + "controller reset failed (0x%x)\n", 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 */ + + if (pdev->vendor == PCI_VENDOR_ID_INTEL) { + u16 tmp16; + + pci_read_config_word(pdev, 0x92, &tmp16); + tmp16 |= 0xf; + pci_write_config_word(pdev, 0x92, tmp16); + } hpriv->cap = readl(mmio + HOST_CAP); hpriv->port_map = readl(mmio + HOST_PORTS_IMPL); @@ -1422,10 +875,66 @@ static int ahci_host_init(struct ata_probe_ent *probe_ent) } } - for (i = 0; i < probe_ent->n_ports; i++) - ahci_setup_port(&probe_ent->port[i], (unsigned long) mmio, i); + 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); + + /* 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); + } - ahci_init_controller(mmio, pdev, probe_ent->n_ports, hpriv->cap); + 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); pci_set_master(pdev); @@ -1516,22 +1025,9 @@ static int ahci_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) VPRINTK("ENTER\n"); - WARN_ON(ATA_MAX_QUEUE > AHCI_MAX_CMDS); - if (!printed_version++) 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) return rc; @@ -1580,22 +1076,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 = IRQF_SHARED; + probe_ent->irq_flags = SA_SHIRQ; probe_ent->mmio_base = mmio_base; probe_ent->private_data = hpriv; if (have_msi) hpriv->flags |= AHCI_FLAG_MSI; + /* JMicron-specific fixup: make sure we're in AHCI mode */ + if (pdev->vendor == 0x197b) + pci_write_config_byte(pdev, 0x41, 0xa1); + /* 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 */ @@ -1627,17 +1123,21 @@ static void ahci_remove_one (struct pci_dev *pdev) struct device *dev = pci_dev_to_dev(pdev); struct ata_host_set *host_set = dev_get_drvdata(dev); struct ahci_host_priv *hpriv = host_set->private_data; + struct ata_port *ap; unsigned int i; int have_msi; - for (i = 0; i < host_set->n_ports; i++) - ata_port_detach(host_set->ports[i]); + for (i = 0; i < host_set->n_ports; i++) { + ap = host_set->ports[i]; + + scsi_remove_host(ap->host); + } have_msi = hpriv->flags & AHCI_FLAG_MSI; free_irq(host_set->irq, host_set); for (i = 0; i < host_set->n_ports; i++) { - struct ata_port *ap = host_set->ports[i]; + ap = host_set->ports[i]; ata_scsi_release(ap->host); scsi_host_put(ap->host); diff --git a/drivers/scsi/aic7xxx/Kconfig.aic7xxx b/drivers/scsi/aic7xxx/Kconfig.aic7xxx index 5517da585..6c2c39555 100644 --- a/drivers/scsi/aic7xxx/Kconfig.aic7xxx +++ b/drivers/scsi/aic7xxx/Kconfig.aic7xxx @@ -86,7 +86,7 @@ config AIC7XXX_DEBUG_MASK default "0" help Bit mask of debug options that is only valid if the - CONFIG_AIC7XXX_DEBUG_ENABLE option is enabled. The bits in this mask + CONFIG_AIC7XXX_DEBUG_ENBLE option is enabled. The bits in this mask are defined in the drivers/scsi/aic7xxx/aic7xxx.h - search for the variable ahc_debug in that file to find them. diff --git a/drivers/scsi/aic7xxx/aic7770.c b/drivers/scsi/aic7xxx/aic7770.c index c4d17231c..527efd36f 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 = ARRAY_SIZE(aic7770_ident_table); +const int ahc_num_aic7770_devs = NUM_ELEMENTS(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 867cbe235..d754b3267 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 = IRQF_SHARED; + shared = SA_SHIRQ; 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 df3346b5c..1d11f7e77 100644 --- a/drivers/scsi/aic7xxx/aic79xx.h +++ b/drivers/scsi/aic7xxx/aic79xx.h @@ -68,6 +68,8 @@ 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) @@ -370,7 +372,7 @@ typedef enum { AHD_CURRENT_SENSING = 0x40000, AHD_SCB_CONFIG_USED = 0x80000,/* No SEEPROM but SCB had info. */ AHD_HP_BOARD = 0x100000, - AHD_BUS_RESET_ACTIVE = 0x200000, + AHD_RESET_POLL_ACTIVE = 0x200000, AHD_UPDATE_PEND_CMDS = 0x400000, AHD_RUNNING_QOUTFIFO = 0x800000, AHD_HAD_FIRST_SEL = 0x1000000 @@ -587,7 +589,7 @@ typedef enum { SCB_PACKETIZED = 0x00800, SCB_EXPECT_PPR_BUSFREE = 0x01000, SCB_PKT_SENSE = 0x02000, - SCB_EXTERNAL_RESET = 0x04000,/* Device was reset externally */ + SCB_CMDPHASE_ABORT = 0x04000, SCB_ON_COL_LIST = 0x08000, SCB_SILENT = 0x10000 /* * Be quiet about transmission type @@ -1487,7 +1489,6 @@ 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 653818d2f..342f77966 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 = ARRAY_SIZE(ahd_chip_names); +static const u_int num_chip_names = NUM_ELEMENTS(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 = ARRAY_SIZE(ahd_hard_errors); +static const u_int num_errors = NUM_ELEMENTS(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 = ARRAY_SIZE(ahd_phase_table) - 1; +static const u_int num_phases = NUM_ELEMENTS(ahd_phase_table) - 1; /* Our Sequencer Program */ #include "aic79xx_seq.h" @@ -207,6 +207,7 @@ static void ahd_add_scb_to_free_list(struct ahd_softc *ahd, static u_int ahd_rem_wscb(struct ahd_softc *ahd, u_int scbid, u_int prev, u_int next, u_int tid); static void ahd_reset_current_bus(struct ahd_softc *ahd); +static ahd_callback_t ahd_reset_poll; static ahd_callback_t ahd_stat_timer; #ifdef AHD_DUMP_SEQ static void ahd_dumpseq(struct ahd_softc *ahd); @@ -977,13 +978,9 @@ ahd_handle_seqint(struct ahd_softc *ahd, u_int intstat) break; } case INVALID_SEQINT: - printf("%s: Invalid Sequencer interrupt occurred, " - "resetting channel.\n", + printf("%s: Invalid Sequencer interrupt occurred.\n", ahd_name(ahd)); -#ifdef AHD_DEBUG - if ((ahd_debug & AHD_SHOW_RECOVERY) != 0) - ahd_dump_card_state(ahd); -#endif + ahd_dump_card_state(ahd); ahd_reset_channel(ahd, 'A', /*Initiate Reset*/TRUE); break; case STATUS_OVERRUN: @@ -1053,10 +1050,12 @@ ahd_handle_seqint(struct ahd_softc *ahd, u_int intstat) * If a target takes us into the command phase * assume that it has been externally reset and * has thus lost our previous packetized negotiation - * agreement. - * Revert to async/narrow transfers until we - * can renegotiate with the device and notify - * the OSM about the reset. + * agreement. Since we have not sent an identify + * message and may not have fully qualified the + * connection, we change our command to TUR, assert + * ATN and ABORT the task when we go to message in + * phase. The OSM will see the REQUEUE_REQUEST + * status and retry the command. */ scbid = ahd_get_scbptr(ahd); scb = ahd_lookup_scb(ahd, scbid); @@ -1083,15 +1082,31 @@ ahd_handle_seqint(struct ahd_softc *ahd, u_int intstat) ahd_set_syncrate(ahd, &devinfo, /*period*/0, /*offset*/0, /*ppr_options*/0, AHD_TRANS_ACTIVE, /*paused*/TRUE); - scb->flags |= SCB_EXTERNAL_RESET; + ahd_outb(ahd, SCB_CDB_STORE, 0); + ahd_outb(ahd, SCB_CDB_STORE+1, 0); + ahd_outb(ahd, SCB_CDB_STORE+2, 0); + ahd_outb(ahd, SCB_CDB_STORE+3, 0); + ahd_outb(ahd, SCB_CDB_STORE+4, 0); + ahd_outb(ahd, SCB_CDB_STORE+5, 0); + ahd_outb(ahd, SCB_CDB_LEN, 6); + scb->hscb->control &= ~(TAG_ENB|SCB_TAG_TYPE); + scb->hscb->control |= MK_MESSAGE; + ahd_outb(ahd, SCB_CONTROL, scb->hscb->control); + ahd_outb(ahd, MSG_OUT, HOST_MSG); + ahd_outb(ahd, SAVED_SCSIID, scb->hscb->scsiid); + /* + * The lun is 0, regardless of the SCB's lun + * as we have not sent an identify message. + */ + ahd_outb(ahd, SAVED_LUN, 0); + ahd_outb(ahd, SEQ_FLAGS, 0); + ahd_assert_atn(ahd); + scb->flags &= ~SCB_PACKETIZED; + scb->flags |= SCB_ABORT|SCB_CMDPHASE_ABORT; ahd_freeze_devq(ahd, scb); ahd_set_transaction_status(scb, CAM_REQUEUE_REQ); ahd_freeze_scb(scb); - /* Notify XPT */ - ahd_send_async(ahd, devinfo.channel, devinfo.target, - CAM_LUN_WILDCARD, AC_SENT_BDR); - /* * Allow the sequencer to continue with * non-pack processing. @@ -1515,18 +1530,6 @@ ahd_handle_scsiint(struct ahd_softc *ahd, u_int intstat) lqistat1 = ahd_inb(ahd, LQISTAT1); lqostat0 = ahd_inb(ahd, LQOSTAT0); busfreetime = ahd_inb(ahd, SSTAT2) & BUSFREETIME; - - /* - * Ignore external resets after a bus reset. - */ - if (((status & SCSIRSTI) != 0) && (ahd->flags & AHD_BUS_RESET_ACTIVE)) - return; - - /* - * Clear bus reset flag - */ - ahd->flags &= ~AHD_BUS_RESET_ACTIVE; - if ((status0 & (SELDI|SELDO)) != 0) { u_int simode0; @@ -2200,6 +2203,22 @@ ahd_handle_nonpkt_busfree(struct ahd_softc *ahd) if (sent_msg == MSG_ABORT_TAG) tag = SCB_GET_TAG(scb); + if ((scb->flags & SCB_CMDPHASE_ABORT) != 0) { + /* + * This abort is in response to an + * unexpected switch to command phase + * for a packetized connection. Since + * the identify message was never sent, + * "saved lun" is 0. We really want to + * abort only the SCB that encountered + * this error, which could have a different + * lun. The SCB will be retried so the OS + * will see the UA after renegotiating to + * packetized. + */ + tag = SCB_GET_TAG(scb); + saved_lun = scb->hscb->lun; + } found = ahd_abort_scbs(ahd, target, 'A', saved_lun, tag, ROLE_INITIATOR, CAM_REQ_ABORTED); @@ -3062,7 +3081,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); + CAM_LUN_WILDCARD, AC_TRANSFER_NEG, NULL); if (bootverbose) { if (offset != 0) { int options; @@ -3184,7 +3203,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); + CAM_LUN_WILDCARD, AC_TRANSFER_NEG, NULL); if (bootverbose) { printf("%s: target %d using %dbit transfers\n", ahd_name(ahd), devinfo->target, @@ -3211,14 +3230,12 @@ 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 scsi_cmnd *cmd, - struct ahd_devinfo *devinfo, ahd_queue_alg alg) +ahd_set_tags(struct ahd_softc *ahd, struct ahd_devinfo *devinfo, + ahd_queue_alg alg) { - struct scsi_device *sdev = cmd->device; - - ahd_platform_set_tags(ahd, sdev, devinfo, alg); + ahd_platform_set_tags(ahd, devinfo, alg); ahd_send_async(ahd, devinfo->channel, devinfo->target, - devinfo->lun, AC_TRANSFER_NEG); + devinfo->lun, AC_TRANSFER_NEG, &alg); } static void @@ -3745,8 +3762,11 @@ ahd_construct_sdtr(struct ahd_softc *ahd, struct ahd_devinfo *devinfo, { if (offset == 0) period = AHD_ASYNC_XFER_PERIOD; - ahd->msgout_index += spi_populate_sync_msg( - ahd->msgout_buf + ahd->msgout_index, period, offset); + ahd->msgout_buf[ahd->msgout_index++] = MSG_EXTENDED; + ahd->msgout_buf[ahd->msgout_index++] = MSG_EXT_SDTR_LEN; + ahd->msgout_buf[ahd->msgout_index++] = MSG_EXT_SDTR; + ahd->msgout_buf[ahd->msgout_index++] = period; + ahd->msgout_buf[ahd->msgout_index++] = offset; ahd->msgout_len += 5; if (bootverbose) { printf("(%s:%c:%d:%d): Sending SDTR period %x, offset %x\n", @@ -3763,8 +3783,10 @@ static void ahd_construct_wdtr(struct ahd_softc *ahd, struct ahd_devinfo *devinfo, u_int bus_width) { - ahd->msgout_index += spi_populate_width_msg( - ahd->msgout_buf + ahd->msgout_index, bus_width); + ahd->msgout_buf[ahd->msgout_index++] = MSG_EXTENDED; + ahd->msgout_buf[ahd->msgout_index++] = MSG_EXT_WDTR_LEN; + ahd->msgout_buf[ahd->msgout_index++] = MSG_EXT_WDTR; + ahd->msgout_buf[ahd->msgout_index++] = bus_width; ahd->msgout_len += 4; if (bootverbose) { printf("(%s:%c:%d:%d): Sending WDTR %x\n", @@ -3791,9 +3813,14 @@ ahd_construct_ppr(struct ahd_softc *ahd, struct ahd_devinfo *devinfo, ppr_options |= MSG_EXT_PPR_PCOMP_EN; if (offset == 0) period = AHD_ASYNC_XFER_PERIOD; - ahd->msgout_index += spi_populate_ppr_msg( - ahd->msgout_buf + ahd->msgout_index, period, offset, - bus_width, ppr_options); + ahd->msgout_buf[ahd->msgout_index++] = MSG_EXTENDED; + ahd->msgout_buf[ahd->msgout_index++] = MSG_EXT_PPR_LEN; + ahd->msgout_buf[ahd->msgout_index++] = MSG_EXT_PPR; + ahd->msgout_buf[ahd->msgout_index++] = period; + ahd->msgout_buf[ahd->msgout_index++] = 0; + ahd->msgout_buf[ahd->msgout_index++] = offset; + ahd->msgout_buf[ahd->msgout_index++] = bus_width; + ahd->msgout_buf[ahd->msgout_index++] = ppr_options; ahd->msgout_len += 8; if (bootverbose) { printf("(%s:%c:%d:%d): Sending PPR bus_width %x, period %x, " @@ -4748,7 +4775,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, scb->io_ctx, devinfo, AHD_QUEUE_NONE); + ahd_set_tags(ahd, devinfo, AHD_QUEUE_NONE); mask = ~0x23; } else { printf("(%s:%c:%d:%d): refuses %s tagged commands. " @@ -4756,7 +4783,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, scb->io_ctx, devinfo, AHD_QUEUE_BASIC); + ahd_set_tags(ahd, devinfo, AHD_QUEUE_BASIC); mask = ~0x03; } @@ -5100,7 +5127,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); + CAM_LUN_WILDCARD, AC_SENT_BDR, NULL); if (message != NULL && bootverbose) printf("%s: %s on %c:%d. %d SCBs aborted\n", ahd_name(ahd), @@ -7067,6 +7094,7 @@ ahd_pause_and_flushwork(struct ahd_softc *ahd) ahd_flush_qoutfifo(ahd); + ahd_platform_flushwork(ahd); ahd->flags &= ~AHD_ALL_INTERRUPTS; } @@ -7261,7 +7289,7 @@ ahd_qinfifo_count(struct ahd_softc *ahd) return (wrap_qinfifonext - wrap_qinpos); else return (wrap_qinfifonext - + ARRAY_SIZE(ahd->qinfifo) - wrap_qinpos); + + NUM_ELEMENTS(ahd->qinfifo) - wrap_qinpos); } void @@ -7289,7 +7317,7 @@ ahd_reset_cmds_pending(struct ahd_softc *ahd) ahd->flags &= ~AHD_UPDATE_PEND_CMDS; } -static void +void ahd_done_with_status(struct ahd_softc *ahd, struct scb *scb, uint32_t status) { cam_status ostat; @@ -7826,17 +7854,6 @@ ahd_reset_channel(struct ahd_softc *ahd, char channel, int initiate_reset) int found; u_int fifo; u_int next_fifo; - uint8_t scsiseq; - - /* - * Check if the last bus reset is cleared - */ - if (ahd->flags & AHD_BUS_RESET_ACTIVE) { - printf("%s: bus reset still active\n", - ahd_name(ahd)); - return 0; - } - ahd->flags |= AHD_BUS_RESET_ACTIVE; ahd->pending_device = NULL; @@ -7850,12 +7867,6 @@ ahd_reset_channel(struct ahd_softc *ahd, char channel, int initiate_reset) /* Make sure the sequencer is in a safe location. */ ahd_clear_critical_section(ahd); - /* - * Run our command complete fifos to ensure that we perform - * completion processing on any commands that 'completed' - * before the reset occurred. - */ - ahd_run_qoutfifo(ahd); #ifdef AHD_TARGET_MODE if ((ahd->flags & AHD_TARGETROLE) != 0) { ahd_run_tqinfifo(ahd, /*paused*/TRUE); @@ -7920,14 +7931,30 @@ ahd_reset_channel(struct ahd_softc *ahd, char channel, int initiate_reset) ahd_clear_fifo(ahd, 1); /* - * Reenable selections + * Revert to async/narrow transfers until we renegotiate. */ - ahd_outb(ahd, SIMODE1, ahd_inb(ahd, SIMODE1) | ENSCSIRST); - scsiseq = ahd_inb(ahd, SCSISEQ_TEMPLATE); - ahd_outb(ahd, SCSISEQ1, scsiseq & (ENSELI|ENRSELI|ENAUTOATNP)); - max_scsiid = (ahd->features & AHD_WIDE) ? 15 : 7; + for (target = 0; target <= max_scsiid; target++) { + + if (ahd->enabled_targets[target] == NULL) + continue; + for (initiator = 0; initiator <= max_scsiid; initiator++) { + struct ahd_devinfo devinfo; + + ahd_compile_devinfo(&devinfo, target, initiator, + CAM_LUN_WILDCARD, + 'A', ROLE_UNKNOWN); + ahd_set_width(ahd, &devinfo, MSG_EXT_WDTR_BUS_8_BIT, + AHD_TRANS_CUR, /*paused*/TRUE); + ahd_set_syncrate(ahd, &devinfo, /*period*/0, + /*offset*/0, /*ppr_options*/0, + AHD_TRANS_CUR, /*paused*/TRUE); + } + } + #ifdef AHD_TARGET_MODE + max_scsiid = (ahd->features & AHD_WIDE) ? 15 : 7; + /* * Send an immediate notify ccb to all target more peripheral * drivers affected by this action. @@ -7954,32 +7981,52 @@ 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); - + CAM_LUN_WILDCARD, AC_BUS_RESET, NULL); + ahd_restart(ahd); /* - * Revert to async/narrow transfers until we renegotiate. + * Freeze the SIMQ until our poller can determine that + * the bus reset has really gone away. We set the initial + * timer to 0 to have the check performed as soon as possible + * from the timer context. */ - for (target = 0; target <= max_scsiid; target++) { + if ((ahd->flags & AHD_RESET_POLL_ACTIVE) == 0) { + ahd->flags |= AHD_RESET_POLL_ACTIVE; + ahd_freeze_simq(ahd); + ahd_timer_reset(&ahd->reset_timer, 0, ahd_reset_poll, ahd); + } + return (found); +} - if (ahd->enabled_targets[target] == NULL) - continue; - for (initiator = 0; initiator <= max_scsiid; initiator++) { - struct ahd_devinfo devinfo; - ahd_compile_devinfo(&devinfo, target, initiator, - CAM_LUN_WILDCARD, - 'A', ROLE_UNKNOWN); - ahd_set_width(ahd, &devinfo, MSG_EXT_WDTR_BUS_8_BIT, - AHD_TRANS_CUR, /*paused*/TRUE); - ahd_set_syncrate(ahd, &devinfo, /*period*/0, - /*offset*/0, /*ppr_options*/0, - AHD_TRANS_CUR, /*paused*/TRUE); - } +#define AHD_RESET_POLL_US 1000 +static void +ahd_reset_poll(void *arg) +{ + struct ahd_softc *ahd = arg; + u_int scsiseq1; + u_long s; + + ahd_lock(ahd, &s); + ahd_pause(ahd); + ahd_update_modes(ahd); + ahd_set_modes(ahd, AHD_MODE_SCSI, AHD_MODE_SCSI); + ahd_outb(ahd, CLRSINT1, CLRSCSIRSTI); + if ((ahd_inb(ahd, SSTAT1) & SCSIRSTI) != 0) { + ahd_timer_reset(&ahd->reset_timer, AHD_RESET_POLL_US, + ahd_reset_poll, ahd); + ahd_unpause(ahd); + ahd_unlock(ahd, &s); + return; } - ahd_restart(ahd); - - return (found); + /* Reset is now low. Complete chip reinitialization. */ + ahd_outb(ahd, SIMODE1, ahd_inb(ahd, SIMODE1) | ENSCSIRST); + scsiseq1 = ahd_inb(ahd, SCSISEQ_TEMPLATE); + ahd_outb(ahd, SCSISEQ1, scsiseq1 & (ENSELI|ENRSELI|ENAUTOATNP)); + ahd_unpause(ahd); + ahd->flags &= ~AHD_RESET_POLL_ACTIVE; + ahd_unlock(ahd, &s); + ahd_release_simq(ahd); } /**************************** Statistics Processing ***************************/ @@ -8621,7 +8668,7 @@ ahd_check_patch(struct ahd_softc *ahd, struct patch **start_patch, struct patch *last_patch; u_int num_patches; - num_patches = ARRAY_SIZE(patches); + num_patches = sizeof(patches)/sizeof(struct patch); last_patch = &patches[num_patches]; cur_patch = *start_patch; @@ -9398,8 +9445,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) ? 16 : 8; - if (ccb->ccb_h.target_id >= max_id) + max_id = (ahd->features & AHD_WIDE) ? 15 : 7; + 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 07d51b870..2eb114438 100644 --- a/drivers/scsi/aic7xxx/aic79xx_osm.c +++ b/drivers/scsi/aic7xxx/aic79xx_osm.c @@ -242,6 +242,25 @@ 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 @@ -331,6 +350,7 @@ 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" @@ -353,7 +373,8 @@ static void ahd_linux_handle_scsi_status(struct ahd_softc *, struct scb *); static void ahd_linux_queue_cmd_complete(struct ahd_softc *ahd, struct scsi_cmnd *cmd); -static int ahd_linux_queue_abort_cmd(struct scsi_cmnd *cmd); +static void ahd_linux_sem_timeout(u_long arg); +static int ahd_linux_queue_recovery_cmd(struct scsi_cmnd *cmd, scb_flag flag); static void ahd_linux_initialize_scsi_bus(struct ahd_softc *ahd); static u_int ahd_linux_user_tagdepth(struct ahd_softc *ahd, struct ahd_devinfo *devinfo); @@ -432,13 +453,18 @@ ahd_linux_queue(struct scsi_cmnd * cmd, void (*scsi_done) (struct scsi_cmnd *)) struct ahd_softc *ahd; struct ahd_linux_device *dev = scsi_transport_device_data(cmd->device); int rtn = SCSI_MLQUEUE_HOST_BUSY; + unsigned long flags; ahd = *(struct ahd_softc **)cmd->device->host->hostdata; - cmd->scsi_done = scsi_done; - cmd->result = CAM_REQ_INPROG << 16; - rtn = ahd_linux_run_command(ahd, dev, cmd); + ahd_lock(ahd, &flags); + if (ahd->platform_data->qfrozen == 0) { + cmd->scsi_done = scsi_done; + cmd->result = CAM_REQ_INPROG << 16; + rtn = ahd_linux_run_command(ahd, dev, cmd); + } + ahd_unlock(ahd, &flags); return rtn; } @@ -464,6 +490,7 @@ 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; @@ -474,6 +501,7 @@ 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]; @@ -529,11 +557,15 @@ 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)); @@ -550,6 +582,8 @@ ahd_linux_slave_alloc(struct scsi_device *sdev) */ dev->maxtags = 0; + targ->sdev[sdev->lun] = sdev; + return (0); } @@ -571,6 +605,23 @@ 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. @@ -624,9 +675,10 @@ static int ahd_linux_abort(struct scsi_cmnd *cmd) { int error; - - error = ahd_linux_queue_abort_cmd(cmd); + error = ahd_linux_queue_recovery_cmd(cmd, SCB_ABORT); + if (error != 0) + printf("aic79xx_abort returns 0x%x\n", error); return error; } @@ -636,97 +688,12 @@ ahd_linux_abort(struct scsi_cmnd *cmd) static int ahd_linux_dev_reset(struct scsi_cmnd *cmd) { - struct ahd_softc *ahd; - struct ahd_linux_device *dev; - struct scb *reset_scb; - u_int cdb_byte; - int retval = SUCCESS; - int paused; - int wait; - struct ahd_initiator_tinfo *tinfo; - struct ahd_tmode_tstate *tstate; - unsigned long flags; - DECLARE_COMPLETION_ONSTACK(done); - - reset_scb = NULL; - paused = FALSE; - wait = FALSE; - ahd = *(struct ahd_softc **)cmd->device->host->hostdata; - - scmd_printk(KERN_INFO, cmd, - "Attempting to queue a TARGET RESET message:"); - - printf("CDB:"); - for (cdb_byte = 0; cdb_byte < cmd->cmd_len; cdb_byte++) - printf(" 0x%x", cmd->cmnd[cdb_byte]); - printf("\n"); - - /* - * Determine if we currently own this command. - */ - dev = scsi_transport_device_data(cmd->device); - - if (dev == NULL) { - /* - * No target device for this command exists, - * so we must not still own the command. - */ - scmd_printk(KERN_INFO, cmd, "Is not an active device\n"); - return SUCCESS; - } - - /* - * Generate us a new SCB - */ - reset_scb = ahd_get_scb(ahd, AHD_NEVER_COL_IDX); - if (!reset_scb) { - scmd_printk(KERN_INFO, cmd, "No SCB available\n"); - return FAILED; - } - - tinfo = ahd_fetch_transinfo(ahd, 'A', ahd->our_id, - cmd->device->id, &tstate); - reset_scb->io_ctx = cmd; - reset_scb->platform_data->dev = dev; - reset_scb->sg_count = 0; - ahd_set_residual(reset_scb, 0); - ahd_set_sense_residual(reset_scb, 0); - reset_scb->platform_data->xfer_len = 0; - reset_scb->hscb->control = 0; - reset_scb->hscb->scsiid = BUILD_SCSIID(ahd,cmd); - reset_scb->hscb->lun = cmd->device->lun; - reset_scb->hscb->cdb_len = 0; - reset_scb->hscb->task_management = SIU_TASKMGMT_LUN_RESET; - reset_scb->flags |= SCB_DEVICE_RESET|SCB_RECOVERY_SCB|SCB_ACTIVE; - if ((tinfo->curr.ppr_options & MSG_EXT_PPR_IU_REQ) != 0) { - reset_scb->flags |= SCB_PACKETIZED; - } else { - reset_scb->hscb->control |= MK_MESSAGE; - } - dev->openings--; - dev->active++; - dev->commands_issued++; - - ahd_lock(ahd, &flags); - - LIST_INSERT_HEAD(&ahd->pending_scbs, reset_scb, pending_links); - ahd_queue_scb(ahd, reset_scb); - - ahd->platform_data->eh_done = &done; - ahd_unlock(ahd, &flags); - - printf("%s: Device reset code sleeping\n", ahd_name(ahd)); - if (!wait_for_completion_timeout(&done, 5 * HZ)) { - ahd_lock(ahd, &flags); - ahd->platform_data->eh_done = NULL; - ahd_unlock(ahd, &flags); - printf("%s: Device reset timer expired (active %d)\n", - ahd_name(ahd), dev->active); - retval = FAILED; - } - printf("%s: Device reset returning 0x%x\n", ahd_name(ahd), retval); + int error; - return (retval); + error = ahd_linux_queue_recovery_cmd(cmd, SCB_DEVICE_RESET); + if (error != 0) + printf("aic79xx_dev_reset returns 0x%x\n", error); + return error; } /* @@ -736,8 +703,8 @@ static int ahd_linux_bus_reset(struct scsi_cmnd *cmd) { struct ahd_softc *ahd; + u_long s; int found; - unsigned long flags; ahd = *(struct ahd_softc **)cmd->device->host->hostdata; #ifdef AHD_DEBUG @@ -745,11 +712,10 @@ ahd_linux_bus_reset(struct scsi_cmnd *cmd) printf("%s: Bus reset called for cmd %p\n", ahd_name(ahd), cmd); #endif - ahd_lock(ahd, &flags); - + ahd_lock(ahd, &s); found = ahd_reset_channel(ahd, scmd_channel(cmd) + 'A', /*initiate reset*/TRUE); - ahd_unlock(ahd, &flags); + ahd_unlock(ahd, &s); if (bootverbose) printf("%s: SCSI bus reset delivered. " @@ -777,6 +743,7 @@ 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, }; @@ -865,12 +832,65 @@ ahd_dmamap_unload(struct ahd_softc *ahd, bus_dma_tag_t dmat, bus_dmamap_t map) } /********************* Platform Dependent Functions ***************************/ +/* + * Compare "left hand" softc with "right hand" softc, returning: + * < 0 - lahd has a lower priority than rahd + * 0 - Softcs are equal + * > 0 - lahd has a higher priority than rahd + */ +int +ahd_softc_comp(struct ahd_softc *lahd, struct ahd_softc *rahd) +{ + int value; + + /* + * Under Linux, cards are ordered as follows: + * 1) PCI devices that are marked as the boot controller. + * 2) PCI devices with BIOS enabled sorted by bus/slot/func. + * 3) All remaining PCI devices sorted by bus/slot/func. + */ +#if 0 + value = (lahd->flags & AHD_BOOT_CHANNEL) + - (rahd->flags & AHD_BOOT_CHANNEL); + if (value != 0) + /* Controllers set for boot have a *higher* priority */ + return (value); +#endif + + value = (lahd->flags & AHD_BIOS_ENABLED) + - (rahd->flags & AHD_BIOS_ENABLED); + if (value != 0) + /* Controllers with BIOS enabled have a *higher* priority */ + return (value); + + /* Still equal. Sort by bus/slot/func. */ + if (aic79xx_reverse_scan != 0) + value = ahd_get_pci_bus(lahd->dev_softc) + - ahd_get_pci_bus(rahd->dev_softc); + else + value = ahd_get_pci_bus(rahd->dev_softc) + - ahd_get_pci_bus(lahd->dev_softc); + if (value != 0) + return (value); + if (aic79xx_reverse_scan != 0) + value = ahd_get_pci_slot(lahd->dev_softc) + - ahd_get_pci_slot(rahd->dev_softc); + else + value = ahd_get_pci_slot(rahd->dev_softc) + - ahd_get_pci_slot(lahd->dev_softc); + if (value != 0) + return (value); + + value = rahd->channel - lahd->channel; + return (value); +} + static void ahd_linux_setup_iocell_info(u_long index, int instance, int targ, int32_t value) { if ((instance >= 0) - && (instance < ARRAY_SIZE(aic79xx_iocell_info))) { + && (instance < NUM_ELEMENTS(aic79xx_iocell_info))) { uint8_t *iocell_info; iocell_info = (uint8_t*)&aic79xx_iocell_info[instance]; @@ -888,7 +908,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 < ARRAY_SIZE(aic79xx_tag_info); i++) { + for (i = 0; i < NUM_ELEMENTS(aic79xx_tag_info); i++) { for (j = 0; j < AHD_NUM_TARGETS; j++) { aic79xx_tag_info[i].tag_commands[j] = tags; } @@ -900,7 +920,7 @@ ahd_linux_setup_tag_info(u_long arg, int instance, int targ, int32_t value) { if ((instance >= 0) && (targ >= 0) - && (instance < ARRAY_SIZE(aic79xx_tag_info)) + && (instance < NUM_ELEMENTS(aic79xx_tag_info)) && (targ < AHD_NUM_TARGETS)) { aic79xx_tag_info[instance].tag_commands[targ] = value & 0x1FF; if (bootverbose) @@ -1011,6 +1031,7 @@ 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 }, @@ -1025,21 +1046,21 @@ aic79xx_setup(char *s) end = strchr(s, '\0'); /* - * XXX ia64 gcc isn't smart enough to know that ARRAY_SIZE + * XXX ia64 gcc isn't smart enough to know that NUM_ELEMENTS * will never be 0 in this case. - */ - n = 0; + */ + n = 0; while ((p = strsep(&s, ",.")) != NULL) { if (*p == '\0') continue; - for (i = 0; i < ARRAY_SIZE(options); i++) { + for (i = 0; i < NUM_ELEMENTS(options); i++) { n = strlen(options[i].name); if (strncmp(options[i].name, p, n) == 0) break; } - if (i == ARRAY_SIZE(options)) + if (i == NUM_ELEMENTS(options)) continue; if (strncmp(p, "global_tag_depth", n) == 0) { @@ -1194,6 +1215,7 @@ ahd_platform_alloc(struct ahd_softc *ahd, void *platform_arg) memset(ahd->platform_data, 0, sizeof(struct ahd_platform_data)); ahd->platform_data->irq = AHD_LINUX_NOIRQ; ahd_lockinit(ahd); + init_MUTEX_LOCKED(&ahd->platform_data->eh_sem); ahd->seltime = (aic79xx_seltime & 0x3) << 4; return (0); } @@ -1202,13 +1224,20 @@ void ahd_platform_free(struct ahd_softc *ahd) { struct scsi_target *starget; - int i; + int i, j; 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; } } @@ -1240,7 +1269,7 @@ ahd_platform_init(struct ahd_softc *ahd) /* * Lookup and commit any modified IO Cell options. */ - if (ahd->unit < ARRAY_SIZE(aic79xx_iocell_info)) { + if (ahd->unit < NUM_ELEMENTS(aic79xx_iocell_info)) { struct ahd_linux_iocell_opts *iocell_opts; iocell_opts = &aic79xx_iocell_info[ahd->unit]; @@ -1264,13 +1293,20 @@ ahd_platform_freeze_devq(struct ahd_softc *ahd, struct scb *scb) } void -ahd_platform_set_tags(struct ahd_softc *ahd, struct scsi_device *sdev, - struct ahd_devinfo *devinfo, ahd_queue_alg alg) +ahd_platform_set_tags(struct ahd_softc *ahd, 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; @@ -1331,12 +1367,14 @@ ahd_platform_set_tags(struct ahd_softc *ahd, struct scsi_device *sdev, switch ((dev->flags & (AHD_DEV_Q_BASIC|AHD_DEV_Q_TAGGED))) { case AHD_DEV_Q_BASIC: - scsi_set_tag_type(sdev, MSG_SIMPLE_TASK); - scsi_activate_tcq(sdev, dev->openings + dev->active); + scsi_adjust_queue_depth(sdev, + MSG_SIMPLE_TASK, + dev->openings + dev->active); break; case AHD_DEV_Q_TAGGED: - scsi_set_tag_type(sdev, MSG_ORDERED_TASK); - scsi_activate_tcq(sdev, dev->openings + dev->active); + scsi_adjust_queue_depth(sdev, + MSG_ORDERED_TASK, + dev->openings + dev->active); break; default: /* @@ -1345,7 +1383,9 @@ ahd_platform_set_tags(struct ahd_softc *ahd, struct scsi_device *sdev, * serially on the controller/device. This should * remove some latency. */ - scsi_deactivate_tcq(sdev, 1); + scsi_adjust_queue_depth(sdev, + /*NON-TAGGED*/0, + /*queue depth*/2); break; } } @@ -1365,7 +1405,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 >= ARRAY_SIZE(aic79xx_tag_info)) { + if (ahd->unit >= NUM_ELEMENTS(aic79xx_tag_info)) { if (warned_user == 0) { printf(KERN_WARNING @@ -1406,15 +1446,11 @@ ahd_linux_device_queue_depth(struct scsi_device *sdev) tags = ahd_linux_user_tagdepth(ahd, &devinfo); if (tags != 0 && sdev->tagged_supported != 0) { - ahd_platform_set_tags(ahd, sdev, &devinfo, AHD_QUEUE_TAGGED); - ahd_send_async(ahd, devinfo.channel, devinfo.target, - devinfo.lun, AC_TRANSFER_NEG); + ahd_set_tags(ahd, &devinfo, AHD_QUEUE_TAGGED); ahd_print_devinfo(ahd, &devinfo); printf("Tagged Queuing enabled. Depth %d\n", tags); } else { - ahd_platform_set_tags(ahd, sdev, &devinfo, AHD_QUEUE_NONE); - ahd_send_async(ahd, devinfo.channel, devinfo.target, - devinfo.lun, AC_TRANSFER_NEG); + ahd_set_tags(ahd, &devinfo, AHD_QUEUE_NONE); } } @@ -1428,9 +1464,6 @@ ahd_linux_run_command(struct ahd_softc *ahd, struct ahd_linux_device *dev, struct ahd_tmode_tstate *tstate; u_int col_idx; uint16_t mask; - unsigned long flags; - - ahd_lock(ahd, &flags); /* * Get an scb to use. @@ -1446,7 +1479,6 @@ ahd_linux_run_command(struct ahd_softc *ahd, struct ahd_linux_device *dev, } if ((scb = ahd_get_scb(ahd, col_idx)) == NULL) { ahd->flags |= AHD_RESOURCE_SHORTAGE; - ahd_unlock(ahd, &flags); return SCSI_MLQUEUE_HOST_BUSY; } @@ -1473,6 +1505,30 @@ ahd_linux_run_command(struct ahd_softc *ahd, struct ahd_linux_device *dev, if ((tstate->auto_negotiate & mask) != 0) { scb->flags |= SCB_AUTO_NEGOTIATE; scb->hscb->control |= MK_MESSAGE; + } else if (cmd->cmnd[0] == INQUIRY + && (tinfo->curr.offset != 0 + || tinfo->curr.width != MSG_EXT_WDTR_BUS_8_BIT + || tinfo->curr.ppr_options != 0) + && (tinfo->curr.ppr_options & MSG_EXT_PPR_IU_REQ)==0) { + /* + * The SCSI spec requires inquiry + * commands to complete without + * reporting unit attention conditions. + * Because of this, an inquiry command + * that occurs just after a device is + * reset will result in a data phase + * with mismatched negotiated rates. + * The core already forces a renegotiation + * for reset events that are visible to + * our controller or that we initiate, + * but a third party device reset or a + * hot-plug insertion can still cause this + * issue. Therefore, we force a re-negotiation + * for every inquiry command unless we + * are async. + */ + scb->flags |= SCB_NEGOTIATE; + scb->hscb->control |= MK_MESSAGE; } if ((dev->flags & (AHD_DEV_Q_TAGGED|AHD_DEV_Q_BASIC)) != 0) { @@ -1548,8 +1604,6 @@ ahd_linux_run_command(struct ahd_softc *ahd, struct ahd_linux_device *dev, scb->flags |= SCB_ACTIVE; ahd_queue_scb(ahd, scb); - ahd_unlock(ahd, &flags); - return 0; } @@ -1570,15 +1624,22 @@ ahd_linux_isr(int irq, void *dev_id, struct pt_regs * regs) return IRQ_RETVAL(ours); } +void +ahd_platform_flushwork(struct ahd_softc *ahd) +{ + +} + void ahd_send_async(struct ahd_softc *ahd, char channel, - u_int target, u_int lun, ac_code code) + u_int target, u_int lun, ac_code code, void *arg) { switch (code) { case AC_TRANSFER_NEG: { char buf[80]; struct scsi_target *starget; + struct ahd_linux_target *targ; struct info_str info; struct ahd_initiator_tinfo *tinfo; struct ahd_tmode_tstate *tstate; @@ -1611,6 +1672,7 @@ ahd_send_async(struct ahd_softc *ahd, char channel, starget = ahd->platform_data->starget[target]; if (starget == NULL) break; + targ = scsi_transport_target_data(starget); target_ppr_options = (spi_dt(starget) ? MSG_EXT_PPR_DT_REQ : 0) @@ -1762,9 +1824,10 @@ ahd_done(struct ahd_softc *ahd, struct scb *scb) if (ahd_get_transaction_status(scb) == CAM_BDR_SENT || ahd_get_transaction_status(scb) == CAM_REQ_ABORTED) ahd_set_transaction_status(scb, CAM_CMD_TIMEOUT); - - if (ahd->platform_data->eh_done) - complete(ahd->platform_data->eh_done); + if ((ahd->platform_data->flags & AHD_SCB_UP_EH_SEM) != 0) { + ahd->platform_data->flags &= ~AHD_SCB_UP_EH_SEM; + up(&ahd->platform_data->eh_sem); + } } ahd_free_scb(ahd, scb); @@ -1899,7 +1962,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, sdev, &devinfo, + ahd_platform_set_tags(ahd, &devinfo, (dev->flags & AHD_DEV_Q_BASIC) ? AHD_QUEUE_BASIC : AHD_QUEUE_TAGGED); break; @@ -1909,7 +1972,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, sdev, &devinfo, + ahd_platform_set_tags(ahd, &devinfo, (dev->flags & AHD_DEV_Q_BASIC) ? AHD_QUEUE_BASIC : AHD_QUEUE_TAGGED); ahd_set_scsi_status(scb, SCSI_STATUS_BUSY); @@ -1919,125 +1982,133 @@ ahd_linux_handle_scsi_status(struct ahd_softc *ahd, static void ahd_linux_queue_cmd_complete(struct ahd_softc *ahd, struct scsi_cmnd *cmd) { - int status; - int new_status = DID_OK; - int do_fallback = 0; - int scsi_status; - /* * Map CAM error codes into Linux Error codes. We * avoid the conversion so that the DV code has the * full error information available when making * state change decisions. */ - - status = ahd_cmd_get_transaction_status(cmd); - switch (status) { - case CAM_REQ_INPROG: - case CAM_REQ_CMP: - new_status = DID_OK; - break; - case CAM_AUTOSENSE_FAIL: - new_status = DID_ERROR; - /* Fallthrough */ - case CAM_SCSI_STATUS_ERROR: - scsi_status = ahd_cmd_get_scsi_status(cmd); - - switch(scsi_status) { - case SCSI_STATUS_CMD_TERMINATED: - case SCSI_STATUS_CHECK_COND: - if ((cmd->result >> 24) != DRIVER_SENSE) { - do_fallback = 1; - } else { - struct scsi_sense_data *sense; - - sense = (struct scsi_sense_data *) - &cmd->sense_buffer; - if (sense->extra_len >= 5 && - (sense->add_sense_code == 0x47 - || sense->add_sense_code == 0x48)) - do_fallback = 1; - } + { + uint32_t status; + u_int new_status; + + status = ahd_cmd_get_transaction_status(cmd); + switch (status) { + case CAM_REQ_INPROG: + case CAM_REQ_CMP: + case CAM_SCSI_STATUS_ERROR: + new_status = DID_OK; + break; + case CAM_REQ_ABORTED: + new_status = DID_ABORT; + break; + case CAM_BUSY: + new_status = DID_BUS_BUSY; + break; + case CAM_REQ_INVALID: + case CAM_PATH_INVALID: + new_status = DID_BAD_TARGET; + break; + case CAM_SEL_TIMEOUT: + new_status = DID_NO_CONNECT; + break; + case CAM_SCSI_BUS_RESET: + case CAM_BDR_SENT: + new_status = DID_RESET; + break; + case CAM_UNCOR_PARITY: + new_status = DID_PARITY; + break; + case CAM_CMD_TIMEOUT: + new_status = DID_TIME_OUT; + break; + case CAM_UA_ABORT: + case CAM_REQ_CMP_ERR: + case CAM_AUTOSENSE_FAIL: + case CAM_NO_HBA: + case CAM_DATA_RUN_ERR: + case CAM_UNEXP_BUSFREE: + case CAM_SEQUENCE_FAIL: + case CAM_CCB_LEN_ERR: + case CAM_PROVIDE_FAIL: + case CAM_REQ_TERMIO: + case CAM_UNREC_HBA_ERROR: + case CAM_REQ_TOO_BIG: + new_status = DID_ERROR; + break; + case CAM_REQUEUE_REQ: + new_status = DID_REQUEUE; break; default: + /* We should never get here */ + new_status = DID_ERROR; break; } - break; - case CAM_REQ_ABORTED: - new_status = DID_ABORT; - break; - case CAM_BUSY: - new_status = DID_BUS_BUSY; - break; - case CAM_REQ_INVALID: - case CAM_PATH_INVALID: - new_status = DID_BAD_TARGET; - break; - case CAM_SEL_TIMEOUT: - new_status = DID_NO_CONNECT; - break; - case CAM_SCSI_BUS_RESET: - case CAM_BDR_SENT: - new_status = DID_RESET; - break; - case CAM_UNCOR_PARITY: - new_status = DID_PARITY; - do_fallback = 1; - break; - case CAM_CMD_TIMEOUT: - new_status = DID_TIME_OUT; - do_fallback = 1; - break; - case CAM_REQ_CMP_ERR: - case CAM_UNEXP_BUSFREE: - case CAM_DATA_RUN_ERR: - new_status = DID_ERROR; - do_fallback = 1; - break; - case CAM_UA_ABORT: - case CAM_NO_HBA: - case CAM_SEQUENCE_FAIL: - case CAM_CCB_LEN_ERR: - case CAM_PROVIDE_FAIL: - case CAM_REQ_TERMIO: - case CAM_UNREC_HBA_ERROR: - case CAM_REQ_TOO_BIG: - new_status = DID_ERROR; - break; - case CAM_REQUEUE_REQ: - new_status = DID_REQUEUE; - break; - default: - /* We should never get here */ - new_status = DID_ERROR; - break; - } - if (do_fallback) { - printf("%s: device overrun (status %x) on %d:%d:%d\n", - ahd_name(ahd), status, cmd->device->channel, - cmd->device->id, cmd->device->lun); + ahd_cmd_set_transaction_status(cmd, new_status); } - ahd_cmd_set_transaction_status(cmd, new_status); - cmd->scsi_done(cmd); } +static void +ahd_linux_sem_timeout(u_long arg) +{ + struct ahd_softc *ahd; + u_long s; + + ahd = (struct ahd_softc *)arg; + + ahd_lock(ahd, &s); + if ((ahd->platform_data->flags & AHD_SCB_UP_EH_SEM) != 0) { + ahd->platform_data->flags &= ~AHD_SCB_UP_EH_SEM; + up(&ahd->platform_data->eh_sem); + } + ahd_unlock(ahd, &s); +} + void ahd_freeze_simq(struct ahd_softc *ahd) { - scsi_block_requests(ahd->platform_data->host); + unsigned long s; + + ahd_lock(ahd, &s); + ahd->platform_data->qfrozen++; + if (ahd->platform_data->qfrozen == 1) { + scsi_block_requests(ahd->platform_data->host); + ahd_platform_abort_scbs(ahd, CAM_TARGET_WILDCARD, ALL_CHANNELS, + CAM_LUN_WILDCARD, SCB_LIST_NULL, + ROLE_INITIATOR, CAM_REQUEUE_REQ); + } + ahd_unlock(ahd, &s); } void ahd_release_simq(struct ahd_softc *ahd) { - scsi_unblock_requests(ahd->platform_data->host); + u_long s; + int unblock_reqs; + + unblock_reqs = 0; + ahd_lock(ahd, &s); + if (ahd->platform_data->qfrozen > 0) + ahd->platform_data->qfrozen--; + if (ahd->platform_data->qfrozen == 0) { + unblock_reqs = 1; + } + ahd_unlock(ahd, &s); + /* + * There is still a race here. The mid-layer + * should keep its own freeze count and use + * a bottom half handler to run the queues + * so we can unblock with our own lock held. + */ + if (unblock_reqs) + scsi_unblock_requests(ahd->platform_data->host); } static int -ahd_linux_queue_abort_cmd(struct scsi_cmnd *cmd) +ahd_linux_queue_recovery_cmd(struct scsi_cmnd *cmd, scb_flag flag) { struct ahd_softc *ahd; struct ahd_linux_device *dev; @@ -2052,6 +2123,7 @@ ahd_linux_queue_abort_cmd(struct scsi_cmnd *cmd) int paused; int wait; int disconnected; + int found; ahd_mode_state saved_modes; unsigned long flags; @@ -2061,7 +2133,8 @@ ahd_linux_queue_abort_cmd(struct scsi_cmnd *cmd) ahd = *(struct ahd_softc **)cmd->device->host->hostdata; scmd_printk(KERN_INFO, cmd, - "Attempting to queue an ABORT message:"); + "Attempting to queue a%s message:", + flag == SCB_ABORT ? "n ABORT" : " TARGET RESET"); printf("CDB:"); for (cdb_byte = 0; cdb_byte < cmd->cmd_len; cdb_byte++) @@ -2097,6 +2170,19 @@ ahd_linux_queue_abort_cmd(struct scsi_cmnd *cmd) break; } + if (pending_scb == NULL && flag == SCB_DEVICE_RESET) { + + /* Any SCB for this device will do for a target reset */ + LIST_FOREACH(pending_scb, &ahd->pending_scbs, pending_links) { + if (ahd_match_scb(ahd, pending_scb, + scmd_id(cmd), + scmd_channel(cmd) + 'A', + CAM_LUN_WILDCARD, + SCB_LIST_NULL, ROLE_INITIATOR)) + break; + } + } + if (pending_scb == NULL) { scmd_printk(KERN_INFO, cmd, "Command not found\n"); goto no_cmd; @@ -2130,17 +2216,25 @@ ahd_linux_queue_abort_cmd(struct scsi_cmnd *cmd) ahd_dump_card_state(ahd); disconnected = TRUE; - if (ahd_search_qinfifo(ahd, cmd->device->id, - cmd->device->channel + 'A', - cmd->device->lun, - pending_scb->hscb->tag, - ROLE_INITIATOR, CAM_REQ_ABORTED, - SEARCH_COMPLETE) > 0) { - printf("%s:%d:%d:%d: Cmd aborted from QINFIFO\n", - ahd_name(ahd), cmd->device->channel, - cmd->device->id, cmd->device->lun); - retval = SUCCESS; - goto done; + if (flag == SCB_ABORT) { + if (ahd_search_qinfifo(ahd, cmd->device->id, + cmd->device->channel + 'A', + cmd->device->lun, + pending_scb->hscb->tag, + ROLE_INITIATOR, CAM_REQ_ABORTED, + SEARCH_COMPLETE) > 0) { + printf("%s:%d:%d:%d: Cmd aborted from QINFIFO\n", + ahd_name(ahd), cmd->device->channel, + cmd->device->id, cmd->device->lun); + retval = SUCCESS; + goto done; + } + } else if (ahd_search_qinfifo(ahd, cmd->device->id, + cmd->device->channel + 'A', + cmd->device->lun, pending_scb->hscb->tag, + ROLE_INITIATOR, /*status*/0, + SEARCH_COUNT) > 0) { + disconnected = FALSE; } saved_modes = ahd_save_modes(ahd); @@ -2148,12 +2242,17 @@ ahd_linux_queue_abort_cmd(struct scsi_cmnd *cmd) last_phase = ahd_inb(ahd, LASTPHASE); saved_scbptr = ahd_get_scbptr(ahd); active_scbptr = saved_scbptr; - if (disconnected && (ahd_inb(ahd, SEQ_FLAGS) & NOT_IDENTIFIED) == 0) { + if (disconnected && ((last_phase != P_BUSFREE) || + (ahd_inb(ahd, SEQ_FLAGS) & NOT_IDENTIFIED) == 0)) { struct scb *bus_scb; bus_scb = ahd_lookup_scb(ahd, active_scbptr); if (bus_scb == pending_scb) disconnected = FALSE; + else if (flag != SCB_ABORT + && ahd_inb(ahd, SAVED_SCSIID) == pending_scb->hscb->scsiid + && ahd_inb(ahd, SAVED_LUN) == SCB_GET_LUN(pending_scb)) + disconnected = FALSE; } /* @@ -2162,26 +2261,41 @@ ahd_linux_queue_abort_cmd(struct scsi_cmnd *cmd) * bus or is in the disconnected state. */ saved_scsiid = ahd_inb(ahd, SAVED_SCSIID); - if (last_phase != P_BUSFREE - && SCB_GET_TAG(pending_scb) == active_scbptr) { + if (SCB_GET_TAG(pending_scb) == active_scbptr + || (flag == SCB_DEVICE_RESET + && SCSIID_TARGET(ahd, saved_scsiid) == scmd_id(cmd))) { /* * We're active on the bus, so assert ATN * and hope that the target responds. */ pending_scb = ahd_lookup_scb(ahd, active_scbptr); - pending_scb->flags |= SCB_RECOVERY_SCB|SCB_ABORT; + pending_scb->flags |= SCB_RECOVERY_SCB|SCB_DEVICE_RESET; ahd_outb(ahd, MSG_OUT, HOST_MSG); ahd_outb(ahd, SCSISIGO, last_phase|ATNO); - scmd_printk(KERN_INFO, cmd, "Device is active, asserting ATN\n"); + scmd_printk(KERN_INFO, cmd, "BDR message in message buffer\n"); wait = TRUE; + } else if (last_phase != P_BUSFREE + && ahd_inb(ahd, SCSIPHASE) == 0) { + /* + * SCB is not identified, there + * is no pending REQ, and the sequencer + * has not seen a busfree. Looks like + * a stuck connection waiting to + * go busfree. Reset the bus. + */ + found = ahd_reset_channel(ahd, cmd->device->channel + 'A', + /*Initiate Reset*/TRUE); + printf("%s: Issued Channel %c Bus Reset. " + "%d SCBs aborted\n", ahd_name(ahd), + cmd->device->channel + 'A', found); } else if (disconnected) { /* * Actually re-queue this SCB in an attempt * to select the device before it reconnects. */ - pending_scb->flags |= SCB_RECOVERY_SCB|SCB_ABORT; + pending_scb->flags |= SCB_RECOVERY_SCB|flag; ahd_set_scbptr(ahd, SCB_GET_TAG(pending_scb)); pending_scb->hscb->cdb_len = 0; pending_scb->hscb->task_attribute = 0; @@ -2251,29 +2365,30 @@ done: if (paused) ahd_unpause(ahd); if (wait) { - DECLARE_COMPLETION_ONSTACK(done); + struct timer_list timer; + int ret; - ahd->platform_data->eh_done = &done; + ahd->platform_data->flags |= AHD_SCB_UP_EH_SEM; ahd_unlock(ahd, &flags); + init_timer(&timer); + timer.data = (u_long)ahd; + timer.expires = jiffies + (5 * HZ); + timer.function = ahd_linux_sem_timeout; + add_timer(&timer); printf("%s: Recovery code sleeping\n", ahd_name(ahd)); - if (!wait_for_completion_timeout(&done, 5 * HZ)) { - ahd_lock(ahd, &flags); - ahd->platform_data->eh_done = NULL; - ahd_unlock(ahd, &flags); + down(&ahd->platform_data->eh_sem); + printf("%s: Recovery code awake\n", ahd_name(ahd)); + ret = del_timer_sync(&timer); + if (ret == 0) { printf("%s: Timer Expired (active %d)\n", ahd_name(ahd), dev->active); retval = FAILED; } - printf("Recovery code awake\n"); } else ahd_unlock(ahd, &flags); - if (retval != SUCCESS) - printf("%s: Command abort returning 0x%x\n", - ahd_name(ahd), retval); - - return retval; + return (retval); } static void ahd_linux_set_width(struct scsi_target *starget, int width) @@ -2721,6 +2836,8 @@ 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 601340d84..9cb101345 100644 --- a/drivers/scsi/aic7xxx/aic79xx_osm.h +++ b/drivers/scsi/aic7xxx/aic79xx_osm.h @@ -42,6 +42,7 @@ #ifndef _AIC79XX_LINUX_H_ #define _AIC79XX_LINUX_H_ +#include #include #include #include @@ -93,6 +94,7 @@ #endif /********************************** Misc Macros *******************************/ +#define roundup(x, y) ((((x)+((y)-1))/(y))*(y)) #define powerof2(x) ((((x)-1)&(x))==0) /************************* Forward Declarations *******************************/ @@ -261,6 +263,7 @@ 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; @@ -340,6 +343,12 @@ 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 @@ -372,12 +381,15 @@ struct ahd_platform_data { struct scsi_target *starget[AHD_NUM_TARGETS]; spinlock_t spin_lock; - struct completion *eh_done; + u_int qfrozen; + struct semaphore eh_sem; struct Scsi_Host *host; /* pointer to scsi host */ #define AHD_LINUX_NOIRQ ((uint32_t)~0) uint32_t irq; /* IRQ for this adapter */ uint32_t bios_address; uint32_t mem_busaddr; /* Mem Base Addr */ +#define AHD_SCB_UP_EH_SEM 0x1 + uint32_t flags; }; /************************** OS Utility Wrappers *******************************/ @@ -856,16 +868,18 @@ ahd_freeze_scb(struct scb *scb) } } -void ahd_platform_set_tags(struct ahd_softc *ahd, struct scsi_device *sdev, +void ahd_platform_set_tags(struct ahd_softc *ahd, 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, role_t role, uint32_t status); irqreturn_t ahd_linux_isr(int irq, void *dev_id, struct pt_regs * regs); +void ahd_platform_flushwork(struct ahd_softc *ahd); +int ahd_softc_comp(struct ahd_softc *, struct ahd_softc *); 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); + u_int target, u_int lun, ac_code, void *); 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 50a41eda5..ebbf7e4ff 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, - IRQF_SHARED, "aic79xx", ahd); + SA_SHIRQ, "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 14850f31a..757242e52 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 = ARRAY_SIZE(ahd_pci_ident_table); +const u_int ahd_num_pci_devs = NUM_ELEMENTS(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 c5f0ee591..39a27840f 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_id, u_int target_offset); 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,9 +76,11 @@ 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 < ARRAY_SIZE(scsi_syncrates); i++) { + for (i = 0; i < num_syncrates; i++) { if (period_factor == scsi_syncrates[i].period_factor) { /* Period in kHz */ @@ -204,8 +206,10 @@ 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 our_id, char channel, u_int target_id, + u_int target_offset) { + struct ahd_linux_target *targ; struct scsi_target *starget; struct ahd_initiator_tinfo *tinfo; struct ahd_tmode_tstate *tstate; @@ -216,9 +220,10 @@ 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_id]; + starget = ahd->platform_data->starget[target_offset]; if (starget == NULL) return; + targ = scsi_transport_target_data(starget); copy_info(info, "\tGoal: "); ahd_format_transinfo(info, &tinfo->goal); @@ -228,7 +233,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 = scsi_device_lookup_by_target(starget, lun); + dev = targ->sdev[lun]; if (dev == NULL) continue; @@ -352,7 +357,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 = 16; + max_targ = 15; if (ahd->seep_config == NULL) copy_info(&info, "No Serial EEPROM\n"); @@ -370,12 +375,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 = 8; + max_targ = 7; - 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_id*/i, /*target_offset*/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 62ff8c3dc..91d294c63 100644 --- a/drivers/scsi/aic7xxx/aic7xxx.h +++ b/drivers/scsi/aic7xxx/aic7xxx.h @@ -69,6 +69,8 @@ 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) @@ -231,7 +233,6 @@ 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 93e4e4094..58ac46103 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 = ARRAY_SIZE(ahc_chip_names); +static const u_int num_chip_names = NUM_ELEMENTS(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 = ARRAY_SIZE(ahc_hard_errors); +static const u_int num_errors = NUM_ELEMENTS(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 = ARRAY_SIZE(ahc_phase_table) - 1; +static const u_int num_phases = NUM_ELEMENTS(ahc_phase_table) - 1; /* * Valid SCSIRATE values. (p. 3-17) @@ -2461,8 +2461,11 @@ ahc_construct_sdtr(struct ahc_softc *ahc, struct ahc_devinfo *devinfo, { if (offset == 0) period = AHC_ASYNC_XFER_PERIOD; - ahc->msgout_index += spi_populate_sync_msg( - ahc->msgout_buf + ahc->msgout_index, period, offset); + ahc->msgout_buf[ahc->msgout_index++] = MSG_EXTENDED; + ahc->msgout_buf[ahc->msgout_index++] = MSG_EXT_SDTR_LEN; + ahc->msgout_buf[ahc->msgout_index++] = MSG_EXT_SDTR; + ahc->msgout_buf[ahc->msgout_index++] = period; + ahc->msgout_buf[ahc->msgout_index++] = offset; ahc->msgout_len += 5; if (bootverbose) { printf("(%s:%c:%d:%d): Sending SDTR period %x, offset %x\n", @@ -2479,8 +2482,10 @@ static void ahc_construct_wdtr(struct ahc_softc *ahc, struct ahc_devinfo *devinfo, u_int bus_width) { - ahc->msgout_index += spi_populate_width_msg( - ahc->msgout_buf + ahc->msgout_index, bus_width); + ahc->msgout_buf[ahc->msgout_index++] = MSG_EXTENDED; + ahc->msgout_buf[ahc->msgout_index++] = MSG_EXT_WDTR_LEN; + ahc->msgout_buf[ahc->msgout_index++] = MSG_EXT_WDTR; + ahc->msgout_buf[ahc->msgout_index++] = bus_width; ahc->msgout_len += 4; if (bootverbose) { printf("(%s:%c:%d:%d): Sending WDTR %x\n", @@ -2500,9 +2505,14 @@ ahc_construct_ppr(struct ahc_softc *ahc, struct ahc_devinfo *devinfo, { if (offset == 0) period = AHC_ASYNC_XFER_PERIOD; - ahc->msgout_index += spi_populate_ppr_msg( - ahc->msgout_buf + ahc->msgout_index, period, offset, - bus_width, ppr_options); + ahc->msgout_buf[ahc->msgout_index++] = MSG_EXTENDED; + ahc->msgout_buf[ahc->msgout_index++] = MSG_EXT_PPR_LEN; + ahc->msgout_buf[ahc->msgout_index++] = MSG_EXT_PPR; + ahc->msgout_buf[ahc->msgout_index++] = period; + ahc->msgout_buf[ahc->msgout_index++] = 0; + ahc->msgout_buf[ahc->msgout_index++] = offset; + ahc->msgout_buf[ahc->msgout_index++] = bus_width; + ahc->msgout_buf[ahc->msgout_index++] = ppr_options; ahc->msgout_len += 8; if (bootverbose) { printf("(%s:%c:%d:%d): Sending PPR bus_width %x, period %x, " @@ -6367,7 +6377,7 @@ ahc_check_patch(struct ahc_softc *ahc, struct patch **start_patch, struct patch *last_patch; u_int num_patches; - num_patches = ARRAY_SIZE(patches); + num_patches = sizeof(patches)/sizeof(struct patch); last_patch = &patches[num_patches]; cur_patch = *start_patch; @@ -6774,8 +6784,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) ? 16 : 8; - if (ccb->ccb_h.target_id >= max_id) + max_id = (ahc->features & AHC_WIDE) ? 15 : 7; + 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 b3d35b324..051970efb 100644 --- a/drivers/scsi/aic7xxx/aic7xxx_osm.c +++ b/drivers/scsi/aic7xxx/aic7xxx_osm.c @@ -353,6 +353,7 @@ 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" @@ -372,6 +373,7 @@ static void ahc_linux_handle_scsi_status(struct ahc_softc *, struct scb *); static void ahc_linux_queue_cmd_complete(struct ahc_softc *ahc, struct scsi_cmnd *cmd); +static void ahc_linux_sem_timeout(u_long arg); static void ahc_linux_freeze_simq(struct ahc_softc *ahc); static void ahc_linux_release_simq(struct ahc_softc *ahc); static int ahc_linux_queue_recovery_cmd(struct scsi_cmnd *cmd, scb_flag flag); @@ -885,7 +887,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 < ARRAY_SIZE(aic7xxx_tag_info); i++) { + for (i = 0; i < NUM_ELEMENTS(aic7xxx_tag_info); i++) { for (j = 0; j < AHC_NUM_TARGETS; j++) { aic7xxx_tag_info[i].tag_commands[j] = tags; } @@ -897,7 +899,7 @@ ahc_linux_setup_tag_info(u_long arg, int instance, int targ, int32_t value) { if ((instance >= 0) && (targ >= 0) - && (instance < ARRAY_SIZE(aic7xxx_tag_info)) + && (instance < NUM_ELEMENTS(aic7xxx_tag_info)) && (targ < AHC_NUM_TARGETS)) { aic7xxx_tag_info[instance].tag_commands[targ] = value & 0xff; if (bootverbose) @@ -1019,7 +1021,7 @@ aic7xxx_setup(char *s) end = strchr(s, '\0'); /* - * XXX ia64 gcc isn't smart enough to know that ARRAY_SIZE + * XXX ia64 gcc isn't smart enough to know that NUM_ELEMENTS * will never be 0 in this case. */ n = 0; @@ -1027,13 +1029,13 @@ aic7xxx_setup(char *s) while ((p = strsep(&s, ",.")) != NULL) { if (*p == '\0') continue; - for (i = 0; i < ARRAY_SIZE(options); i++) { + for (i = 0; i < NUM_ELEMENTS(options); i++) { n = strlen(options[i].name); if (strncmp(options[i].name, p, n) == 0) break; } - if (i == ARRAY_SIZE(options)) + if (i == NUM_ELEMENTS(options)) continue; if (strncmp(p, "global_tag_depth", n) == 0) { @@ -1191,6 +1193,7 @@ ahc_platform_alloc(struct ahc_softc *ahc, void *platform_arg) memset(ahc->platform_data, 0, sizeof(struct ahc_platform_data)); ahc->platform_data->irq = AHC_LINUX_NOIRQ; ahc_lockinit(ahc); + init_MUTEX_LOCKED(&ahc->platform_data->eh_sem); ahc->seltime = (aic7xxx_seltime & 0x3) << 4; ahc->seltime_b = (aic7xxx_seltime & 0x3) << 4; if (aic7xxx_pci_parity == 0) @@ -1359,7 +1362,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 >= ARRAY_SIZE(aic7xxx_tag_info)) { + if (ahc->unit >= NUM_ELEMENTS(aic7xxx_tag_info)) { if (warned_user == 0) { printf(KERN_WARNING @@ -1827,9 +1830,10 @@ ahc_done(struct ahc_softc *ahc, struct scb *scb) if (ahc_get_transaction_status(scb) == CAM_BDR_SENT || ahc_get_transaction_status(scb) == CAM_REQ_ABORTED) ahc_set_transaction_status(scb, CAM_CMD_TIMEOUT); - - if (ahc->platform_data->eh_done) - complete(ahc->platform_data->eh_done); + if ((ahc->platform_data->flags & AHC_UP_EH_SEMAPHORE) != 0) { + ahc->platform_data->flags &= ~AHC_UP_EH_SEMAPHORE; + up(&ahc->platform_data->eh_sem); + } } ahc_free_scb(ahc, scb); @@ -2035,6 +2039,22 @@ ahc_linux_queue_cmd_complete(struct ahc_softc *ahc, struct scsi_cmnd *cmd) cmd->scsi_done(cmd); } +static void +ahc_linux_sem_timeout(u_long arg) +{ + struct ahc_softc *ahc; + u_long s; + + ahc = (struct ahc_softc *)arg; + + ahc_lock(ahc, &s); + if ((ahc->platform_data->flags & AHC_UP_EH_SEMAPHORE) != 0) { + ahc->platform_data->flags &= ~AHC_UP_EH_SEMAPHORE; + up(&ahc->platform_data->eh_sem); + } + ahc_unlock(ahc, &s); +} + static void ahc_linux_freeze_simq(struct ahc_softc *ahc) { @@ -2335,21 +2355,25 @@ done: if (paused) ahc_unpause(ahc); if (wait) { - DECLARE_COMPLETION_ONSTACK(done); + struct timer_list timer; + int ret; - ahc->platform_data->eh_done = &done; + ahc->platform_data->flags |= AHC_UP_EH_SEMAPHORE; ahc_unlock(ahc, &flags); + init_timer(&timer); + timer.data = (u_long)ahc; + timer.expires = jiffies + (5 * HZ); + timer.function = ahc_linux_sem_timeout; + add_timer(&timer); printf("Recovery code sleeping\n"); - if (!wait_for_completion_timeout(&done, 5 * HZ)) { - ahc_lock(ahc, &flags); - ahc->platform_data->eh_done = NULL; - ahc_unlock(ahc, &flags); - + down(&ahc->platform_data->eh_sem); + printf("Recovery code awake\n"); + ret = del_timer_sync(&timer); + if (ret == 0) { printf("Timer Expired\n"); retval = FAILED; } - printf("Recovery code awake\n"); } else ahc_unlock(ahc, &flags); return (retval); @@ -2536,35 +2560,6 @@ 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, @@ -2580,7 +2575,6 @@ 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 d42a71ee0..e0edacae8 100644 --- a/drivers/scsi/aic7xxx/aic7xxx_osm.h +++ b/drivers/scsi/aic7xxx/aic7xxx_osm.h @@ -59,6 +59,7 @@ #ifndef _AIC7XXX_LINUX_H_ #define _AIC7XXX_LINUX_H_ +#include #include #include #include @@ -368,12 +369,15 @@ struct ahc_platform_data { spinlock_t spin_lock; u_int qfrozen; - struct completion *eh_done; + struct semaphore eh_sem; struct Scsi_Host *host; /* pointer to scsi host */ #define AHC_LINUX_NOIRQ ((uint32_t)~0) uint32_t irq; /* IRQ for this adapter */ uint32_t bios_address; uint32_t mem_busaddr; /* Mem Base Addr */ + +#define AHC_UP_EH_SEMAPHORE 0x1 + uint32_t flags; }; /************************** OS Utility Wrappers *******************************/ diff --git a/drivers/scsi/aic7xxx/aic7xxx_osm_pci.c b/drivers/scsi/aic7xxx/aic7xxx_osm_pci.c index 7e42f07a2..cb30d9c11 100644 --- a/drivers/scsi/aic7xxx/aic7xxx_osm_pci.c +++ b/drivers/scsi/aic7xxx/aic7xxx_osm_pci.c @@ -219,7 +219,6 @@ ahc_linux_pci_dev_probe(struct pci_dev *pdev, const struct pci_device_id *ent) ahc->flags |= AHC_39BIT_ADDRESSING; } else { if (dma_set_mask(dev, DMA_32BIT_MASK)) { - ahc_free(ahc); printk(KERN_WARNING "aic7xxx: No suitable DMA available.\n"); return (-ENODEV); } @@ -375,7 +374,7 @@ ahc_pci_map_int(struct ahc_softc *ahc) int error; error = request_irq(ahc->dev_softc->irq, ahc_linux_isr, - IRQF_SHARED, "aic7xxx", ahc); + SA_SHIRQ, "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 63cab2d74..5f586140e 100644 --- a/drivers/scsi/aic7xxx/aic7xxx_pci.c +++ b/drivers/scsi/aic7xxx/aic7xxx_pci.c @@ -144,22 +144,16 @@ 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; @@ -231,19 +225,19 @@ struct ahc_pci_identity ahc_pci_ident_table [] = ID_AHA_2944, ID_ALL_MASK, "Adaptec 2944 SCSI adapter", - ahc_aic7870h_setup + ahc_aic7870_setup }, { ID_AHA_3944, ID_ALL_MASK, "Adaptec 3944 SCSI adapter", - ahc_aha394Xh_setup + ahc_aha394X_setup }, { ID_AHA_4944, ID_ALL_MASK, "Adaptec 4944 SCSI adapter", - ahc_aha494Xh_setup + ahc_aha494X_setup }, /* aic7880 based controllers */ { @@ -262,13 +256,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_aic7880h_setup + ahc_aic7880_setup }, { ID_AHA_3944U & ID_DEV_VENDOR_MASK, ID_DEV_VENDOR_MASK, "Adaptec 3944 Ultra SCSI adapter", - ahc_aha394XUh_setup + ahc_aha394XU_setup }, { ID_AHA_398XU & ID_DEV_VENDOR_MASK, @@ -284,7 +278,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_aic7880h_setup + ahc_aic7880_setup }, { ID_AHA_2930U & ID_DEV_VENDOR_MASK, @@ -420,7 +414,7 @@ struct ahc_pci_identity ahc_pci_ident_table [] = ID_AHA_3944AU, ID_ALL_MASK, "Adaptec 3944A Ultra SCSI adapter", - ahc_aic7895h_setup + ahc_aic7895_setup }, { ID_AIC7895_ARO, @@ -559,7 +553,7 @@ struct ahc_pci_identity ahc_pci_ident_table [] = } }; -const u_int ahc_num_pci_devs = ARRAY_SIZE(ahc_pci_ident_table); +const u_int ahc_num_pci_devs = NUM_ELEMENTS(ahc_pci_ident_table); #define AHC_394X_SLOT_CHANNEL_A 4 #define AHC_394X_SLOT_CHANNEL_B 5 @@ -2042,12 +2036,12 @@ ahc_pci_resume(struct ahc_softc *ahc) * that the OS doesn't know about and rely on our chip * reset handler to handle the rest. */ - ahc_pci_write_config(ahc->dev_softc, DEVCONFIG, - ahc->bus_softc.pci_softc.devconfig, /*bytes*/4); - ahc_pci_write_config(ahc->dev_softc, PCIR_COMMAND, - ahc->bus_softc.pci_softc.command, /*bytes*/1); - ahc_pci_write_config(ahc->dev_softc, CSIZE_LATTIME, - ahc->bus_softc.pci_softc.csize_lattime, /*bytes*/1); + ahc_pci_write_config(ahc->dev_softc, DEVCONFIG, /*bytes*/4, + ahc->bus_softc.pci_softc.devconfig); + ahc_pci_write_config(ahc->dev_softc, PCIR_COMMAND, /*bytes*/1, + ahc->bus_softc.pci_softc.command); + ahc_pci_write_config(ahc->dev_softc, CSIZE_LATTIME, /*bytes*/1, + ahc->bus_softc.pci_softc.csize_lattime); if ((ahc->flags & AHC_HAS_TERM_LOGIC) != 0) { struct seeprom_descriptor sd; u_int sxfrctl1; @@ -2126,16 +2120,6 @@ 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) { @@ -2147,16 +2131,6 @@ 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) { @@ -2179,16 +2153,6 @@ 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) { @@ -2210,17 +2174,6 @@ 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) { @@ -2240,16 +2193,6 @@ 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) { @@ -2348,16 +2291,6 @@ 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 5914b4aa4..04a3506cf 100644 --- a/drivers/scsi/aic7xxx/aic7xxx_proc.c +++ b/drivers/scsi/aic7xxx/aic7xxx_proc.c @@ -77,9 +77,11 @@ 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 < ARRAY_SIZE(scsi_syncrates); i++) { + for (i = 0; i < num_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 b98c5c105..8c91fda64 100644 --- a/drivers/scsi/aic7xxx/aicasm/Makefile +++ b/drivers/scsi/aic7xxx/aicasm/Makefile @@ -14,8 +14,6 @@ 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 ba3bccafe..770f1647e 100644 --- a/drivers/scsi/aic7xxx_old.c +++ b/drivers/scsi/aic7xxx_old.c @@ -249,6 +249,8 @@ #include #include /* for kmalloc() */ +#include /* for CONFIG_PCI */ + #define AIC7XXX_C_VERSION "5.2.6" #define ALL_TARGETS -1 @@ -1563,7 +1565,7 @@ aic7xxx_check_patch(struct aic7xxx_host *p, struct sequencer_patch *last_patch; int num_patches; - num_patches = ARRAY_SIZE(sequencer_patches); + num_patches = sizeof(sequencer_patches)/sizeof(struct sequencer_patch); last_patch = &sequencer_patches[num_patches]; cur_patch = *start_patch; @@ -8320,11 +8322,11 @@ aic7xxx_register(struct scsi_host_template *template, struct aic7xxx_host *p, } else { - result = (request_irq(p->irq, do_aic7xxx_isr, IRQF_SHARED, + result = (request_irq(p->irq, do_aic7xxx_isr, SA_SHIRQ, "aic7xxx", p)); if (result < 0) { - result = (request_irq(p->irq, do_aic7xxx_isr, IRQF_DISABLED | IRQF_SHARED, + result = (request_irq(p->irq, do_aic7xxx_isr, SA_INTERRUPT | SA_SHIRQ, "aic7xxx", p)); } } diff --git a/drivers/scsi/aic7xxx_old/aic7xxx_proc.c b/drivers/scsi/aic7xxx_old/aic7xxx_proc.c index b07e4f04f..3bf334931 100644 --- a/drivers/scsi/aic7xxx_old/aic7xxx_proc.c +++ b/drivers/scsi/aic7xxx_old/aic7xxx_proc.c @@ -29,6 +29,7 @@ * $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 9099d531d..c0844fa32 100644 --- a/drivers/scsi/amiga7xx.c +++ b/drivers/scsi/amiga7xx.c @@ -11,6 +11,7 @@ #include #include #include +#include #include #include diff --git a/drivers/scsi/arm/Kconfig b/drivers/scsi/arm/Kconfig index d006a8cb4..06d7601cd 100644 --- a/drivers/scsi/arm/Kconfig +++ b/drivers/scsi/arm/Kconfig @@ -69,7 +69,6 @@ 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. @@ -77,7 +76,6 @@ 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, @@ -86,7 +84,6 @@ 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 7621e3fa3..dda5a5f79 100644 --- a/drivers/scsi/arm/acornscsi.c +++ b/drivers/scsi/arm/acornscsi.c @@ -129,6 +129,7 @@ #define STRx(x) STRINGIFY(x) #define NO_WRITE_STR STRx(NO_WRITE) +#include #include #include #include @@ -3030,7 +3031,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, IRQF_DISABLED, "acornscsi", ashost); + ret = request_irq(host->irq, acornscsi_intr, SA_INTERRUPT, "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 3bdfc3648..e6c9491dc 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, IRQF_DISABLED, + ret = request_irq(host->irq, cumanascsi_intr, SA_INTERRUPT, "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 719af0dcc..583d2d8c8 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, - IRQF_DISABLED, "cumanascsi2", info); + SA_INTERRUPT, "cumanascsi2", info); if (ret) { printk("scsi%d: IRQ%d not free: %d\n", host->host_no, ec->irq, ret); @@ -550,6 +550,6 @@ module_exit(cumanascsi2_exit); MODULE_AUTHOR("Russell King"); MODULE_DESCRIPTION("Cumana SCSI-2 driver for Acorn machines"); -module_param_array(term, int, NULL, 0); +MODULE_PARM(term, "1-8i"); MODULE_PARM_DESC(term, "SCSI bus termination"); MODULE_LICENSE("GPL"); diff --git a/drivers/scsi/arm/eesox.c b/drivers/scsi/arm/eesox.c index dcbb4b2b3..3ffec7efc 100644 --- a/drivers/scsi/arm/eesox.c +++ b/drivers/scsi/arm/eesox.c @@ -674,6 +674,6 @@ module_exit(eesox_exit); MODULE_AUTHOR("Russell King"); MODULE_DESCRIPTION("EESOX 'Fast' SCSI driver for Acorn machines"); -module_param_array(term, int, NULL, 0); +MODULE_PARM(term, "1-8i"); MODULE_PARM_DESC(term, "SCSI bus termination"); MODULE_LICENSE("GPL"); diff --git a/drivers/scsi/arm/fas216.c b/drivers/scsi/arm/fas216.c index 4cf7afc31..3e1053f11 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->cmnd); + __scsi_print_command(SCpnt->data_cmnd); print_debug_list(); fas216_dumpstate(info); diff --git a/drivers/scsi/arm/powertec.c b/drivers/scsi/arm/powertec.c index b2c346a47..3113bdced 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, - IRQF_DISABLED, "powertec", info); + SA_INTERRUPT, "powertec", info); if (ret) { printk("scsi%d: IRQ%d not free: %d\n", host->host_no, ec->irq, ret); @@ -466,6 +466,6 @@ module_exit(powertecscsi_exit); MODULE_AUTHOR("Russell King"); MODULE_DESCRIPTION("Powertec SCSI driver"); -module_param_array(term, int, NULL, 0); +MODULE_PARM(term, "1-8i"); MODULE_PARM_DESC(term, "SCSI bus termination"); MODULE_LICENSE("GPL"); diff --git a/drivers/scsi/arm/queue.c b/drivers/scsi/arm/queue.c index 8caa5903c..b10750bb5 100644 --- a/drivers/scsi/arm/queue.c +++ b/drivers/scsi/arm/queue.c @@ -118,7 +118,8 @@ int __queue_add(Queue_t *queue, Scsi_Cmnd *SCpnt, int head) list_del(l); q = list_entry(l, QE_t, list); - BUG_ON(BAD_MAGIC(q, QUEUE_MAGIC_FREE)); + if (BAD_MAGIC(q, QUEUE_MAGIC_FREE)) + BUG(); SET_MAGIC(q, QUEUE_MAGIC_USED); q->SCpnt = SCpnt; @@ -143,7 +144,8 @@ static Scsi_Cmnd *__queue_remove(Queue_t *queue, struct list_head *ent) */ list_del(ent); q = list_entry(ent, QE_t, list); - BUG_ON(BAD_MAGIC(q, QUEUE_MAGIC_USED)); + if (BAD_MAGIC(q, QUEUE_MAGIC_USED)) + BUG(); 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 8c2600ffc..6dd544a5e 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->request_buffer; + SCpnt->SCp.buffer = (struct scatterlist *) SCpnt->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 a9bb3cb7e..fc3ca051c 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 "2.00" +#define DRV_VERSION "1.05" enum { PIIX_IOCFG = 0x54, /* IDE I/O configuration register */ @@ -101,62 +101,38 @@ enum { ICH5_PCS = 0x92, /* port control and status */ PIIX_SCC = 0x0A, /* sub-class code register */ - PIIX_FLAG_IGNORE_PCS = (1 << 25), /* ignore PCS present bits */ - 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_AHCI = (1 << 28), /* AHCI possible */ + PIIX_FLAG_CHECKINTR = (1 << 29), /* make sure PCI INTx enabled */ + PIIX_FLAG_COMBINED = (1 << 30), /* combined mode possible */ /* combined mode. if set, PATA is channel 0. * if clear, PATA is channel 1. */ + PIIX_COMB_PATA_P0 = (1 << 1), + PIIX_COMB = (1 << 2), /* combined mode enabled? */ + PIIX_PORT_ENABLED = (1 << 0), PIIX_PORT_PRESENT = (1 << 4), PIIX_80C_PRI = (1 << 5) | (1 << 4), PIIX_80C_SEC = (1 << 7) | (1 << 6), - /* controller IDs */ - piix4_pata = 0, - ich5_pata = 1, - ich5_sata = 2, - esb_sata = 3, - 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 */ - P1 = 1, /* port 1 */ - P2 = 2, /* port 2 */ - P3 = 3, /* port 3 */ - IDE = -1, /* IDE */ - NA = -2, /* not avaliable */ - RV = -3, /* reserved */ + ich5_pata = 0, + ich5_sata = 1, + piix4_pata = 2, + ich6_sata = 3, + ich6_sata_ahci = 4, PIIX_AHCI_DEVICE = 6, }; -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 void piix_host_stop(struct ata_host_set *host_set); + +static void piix_pata_phy_reset(struct ata_port *ap); +static void piix_sata_phy_reset(struct ata_port *ap); 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; @@ -165,39 +141,25 @@ 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 * list in drivers/pci/quirks.c. */ - /* 82801EB (ICH5) */ { 0x8086, 0x24d1, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich5_sata }, - /* 82801EB (ICH5) */ { 0x8086, 0x24df, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich5_sata }, - /* 6300ESB (ICH5 variant with broken PCS present bits) */ - { 0x8086, 0x25a3, PCI_ANY_ID, PCI_ANY_ID, 0, 0, esb_sata }, - /* 6300ESB pretending RAID */ - { 0x8086, 0x25b0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, esb_sata }, - /* 82801FB/FW (ICH6/ICH6W) */ + { 0x8086, 0x25a3, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich5_sata }, + { 0x8086, 0x25b0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich5_sata }, { 0x8086, 0x2651, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata }, - /* 82801FR/FRW (ICH6R/ICH6RW) */ { 0x8086, 0x2652, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata_ahci }, - /* 82801FBM ICH6M (ICH6R with only port 0 and 2 implemented) */ - { 0x8086, 0x2653, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6m_sata_ahci }, - /* 82801GB/GR/GH (ICH7, identical to ICH6) */ + { 0x8086, 0x2653, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata_ahci }, { 0x8086, 0x27c0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata_ahci }, - /* 2801GBM/GHM (ICH7M, identical to ICH6M) */ - { 0x8086, 0x27c4, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich7m_sata_ahci }, - /* Enterprise Southbridge 2 (where's the datasheet?) */ + { 0x8086, 0x27c4, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata_ahci }, { 0x8086, 0x2680, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata_ahci }, - /* SATA Controller 1 IDE (ICH8, no datasheet yet) */ - { 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, ich8_sata_ahci }, - /* Mobile SATA Controller IDE (ICH8M, ditto) */ - { 0x8086, 0x2828, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata_ahci }, + { 0x8086, 0x2820, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata_ahci }, + { 0x8086, 0x2825, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata_ahci }, + { 0x8086, 0x2828, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata_ahci }, { } /* terminate list */ }; @@ -216,16 +178,17 @@ static struct scsi_host_template piix_sht = { .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, .resume = ata_scsi_device_resume, .suspend = ata_scsi_device_suspend, @@ -235,7 +198,6 @@ 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, @@ -243,25 +205,23 @@ static const struct ata_port_operations piix_pata_ops = { .exec_command = ata_exec_command, .dev_select = ata_std_dev_select, + .phy_reset = piix_pata_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 = piix_pata_error_handler, - .post_internal_cmd = ata_bmdma_post_internal_cmd, + .eng_timeout = ata_eng_timeout, .irq_handler = ata_interrupt, .irq_clear = ata_bmdma_irq_clear, .port_start = ata_port_start, .port_stop = ata_port_stop, - .host_stop = piix_host_stop, + .host_stop = ata_host_stop, }; static const struct ata_port_operations piix_sata_ops = { @@ -273,130 +233,31 @@ static const struct ata_port_operations piix_sata_ops = { .exec_command = ata_exec_command, .dev_select = ata_std_dev_select, + .phy_reset = piix_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 = piix_sata_error_handler, - .post_internal_cmd = ata_bmdma_post_internal_cmd, + .eng_timeout = ata_eng_timeout, .irq_handler = ata_interrupt, .irq_clear = ata_bmdma_irq_clear, .port_start = ata_port_start, .port_stop = ata_port_stop, - .host_stop = piix_host_stop, -}; - -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 */ - { P1, NA, P0, NA }, /* 001b */ - { RV, RV, RV, RV }, - { RV, RV, RV, RV }, - { P0, P1, IDE, IDE }, /* 100b */ - { P1, P0, IDE, IDE }, /* 101b */ - { IDE, IDE, P0, P1 }, /* 110b */ - { IDE, IDE, P1, P0 }, /* 111b */ - }, -}; - -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 */ - { IDE, IDE, P1, P3 }, /* 01b */ - { P0, P2, IDE, IDE }, /* 10b */ - { RV, RV, RV, RV }, - }, -}; - -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 */ - { RV, RV, RV, RV }, - { P0, P2, IDE, IDE }, /* 10b */ - { RV, RV, RV, RV }, - }, -}; - -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, + .host_stop = ata_host_stop, }; static struct ata_port_info piix_port_info[] = { - /* piix4_pata */ - { - .sht = &piix_sht, - .host_flags = ATA_FLAG_SLAVE_POSS, - .pio_mask = 0x1f, /* pio0-4 */ -#if 0 - .mwdma_mask = 0x06, /* mwdma1-2 */ -#else - .mwdma_mask = 0x00, /* mwdma broken */ -#endif - .udma_mask = ATA_UDMA_MASK_40C, - .port_ops = &piix_pata_ops, - }, - /* ich5_pata */ { .sht = &piix_sht, - .host_flags = ATA_FLAG_SLAVE_POSS | PIIX_FLAG_CHECKINTR, + .host_flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST | + PIIX_FLAG_CHECKINTR, .pio_mask = 0x1f, /* pio0-4 */ #if 0 .mwdma_mask = 0x06, /* mwdma1-2 */ @@ -410,30 +271,34 @@ static struct ata_port_info piix_port_info[] = { /* ich5_sata */ { .sht = &piix_sht, - .host_flags = ATA_FLAG_SATA | PIIX_FLAG_CHECKINTR | - PIIX_FLAG_IGNORE_PCS, + .host_flags = ATA_FLAG_SATA | ATA_FLAG_SRST | + PIIX_FLAG_COMBINED | PIIX_FLAG_CHECKINTR, .pio_mask = 0x1f, /* pio0-4 */ .mwdma_mask = 0x07, /* mwdma0-2 */ .udma_mask = 0x7f, /* udma0-6 */ .port_ops = &piix_sata_ops, }, - /* i6300esb_sata */ + /* piix4_pata */ { .sht = &piix_sht, - .host_flags = ATA_FLAG_SATA | - PIIX_FLAG_CHECKINTR | PIIX_FLAG_IGNORE_PCS, + .host_flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST, .pio_mask = 0x1f, /* pio0-4 */ - .mwdma_mask = 0x07, /* mwdma0-2 */ - .udma_mask = 0x7f, /* udma0-6 */ - .port_ops = &piix_sata_ops, +#if 0 + .mwdma_mask = 0x06, /* mwdma1-2 */ +#else + .mwdma_mask = 0x00, /* mwdma broken */ +#endif + .udma_mask = ATA_UDMA_MASK_40C, + .port_ops = &piix_pata_ops, }, /* ich6_sata */ { .sht = &piix_sht, - .host_flags = ATA_FLAG_SATA | - PIIX_FLAG_CHECKINTR | PIIX_FLAG_SCR, + .host_flags = ATA_FLAG_SATA | ATA_FLAG_SRST | + PIIX_FLAG_COMBINED | PIIX_FLAG_CHECKINTR | + ATA_FLAG_SLAVE_POSS, .pio_mask = 0x1f, /* pio0-4 */ .mwdma_mask = 0x07, /* mwdma0-2 */ .udma_mask = 0x7f, /* udma0-6 */ @@ -443,45 +308,9 @@ static struct ata_port_info piix_port_info[] = { /* ich6_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, - }, - - /* ich6m_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, - }, - - /* 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, + .host_flags = ATA_FLAG_SATA | ATA_FLAG_SRST | + PIIX_FLAG_COMBINED | PIIX_FLAG_CHECKINTR | + ATA_FLAG_SLAVE_POSS | PIIX_FLAG_AHCI, .pio_mask = 0x1f, /* pio0-4 */ .mwdma_mask = 0x07, /* mwdma0-2 */ .udma_mask = 0x7f, /* udma0-6 */ @@ -500,11 +329,6 @@ 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 @@ -539,38 +363,35 @@ cbl40: } /** - * piix_pata_prereset - prereset for PATA host controller - * @ap: Target port + * piix_pata_phy_reset - Probe specified port on PATA host controller + * @ap: Port to probe * - * Prereset including cable detection. + * Probe PATA phy. * * LOCKING: * None (inherited from caller). */ -static int piix_pata_prereset(struct ata_port *ap) + +static void piix_pata_phy_reset(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])) { - ata_port_printk(ap, KERN_INFO, "port disabled. ignoring.\n"); - ap->eh_context.i.action &= ~ATA_EH_RESET_MASK; - return 0; + ata_port_disable(ap); + printk(KERN_INFO "ata%u: port disabled. ignoring.\n", ap->id); + return; } piix_pata_cbl_detect(ap); - return ata_std_prereset(ap); -} + ata_port_probe(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); + ata_bus_reset(ap); } /** - * piix_sata_present_mask - determine present mask for SATA host controller - * @ap: Target port + * piix_sata_probe - Probe PCI device for present SATA devices + * @ap: Port associated with the PCI device we wish to probe * * Reads SATA PCI device's PCI config register Port Configuration * and Status (PCS) to determine port and device availability. @@ -579,74 +400,65 @@ static void piix_pata_error_handler(struct ata_port *ap) * None (inherited from caller). * * RETURNS: - * determined present_mask + * Non-zero if port is enabled, it may or may not have a device + * attached in that case (PRESENT bit would only be set if BIOS probe + * was done). Zero is returned if port is disabled. */ -static unsigned int piix_sata_present_mask(struct ata_port *ap) +static int piix_sata_probe (struct ata_port *ap) { struct pci_dev *pdev = to_pci_dev(ap->host_set->dev); - 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; - u16 pcs; - - pci_read_config_word(pdev, ICH5_PCS, &pcs); - DPRINTK("ata%u: ENTER, pcs=0x%x base=%d\n", ap->id, pcs, base); - - for (i = 0; i < 2; i++) { - port = map[base + i]; - if (port < 0) - continue; - if ((ap->flags & PIIX_FLAG_IGNORE_PCS) || - (pcs & 1 << (hpriv->map_db->present_shift + port))) - present_mask |= 1 << i; - } + int combined = (ap->flags & ATA_FLAG_SLAVE_POSS); + int orig_mask, mask, i; + u8 pcs; + + mask = (PIIX_PORT_PRESENT << ap->hard_port_no) | + (PIIX_PORT_ENABLED << ap->hard_port_no); + + pci_read_config_byte(pdev, ICH5_PCS, &pcs); + orig_mask = (int) pcs & 0xff; + + /* TODO: this is vaguely wrong for ICH6 combined mode, + * where only two of the four SATA ports are mapped + * onto a single ATA channel. It is also vaguely inaccurate + * for ICH5, which has only two ports. However, this is ok, + * as further device presence detection code will handle + * any false positives produced here. + */ + + for (i = 0; i < 4; i++) { + mask = (PIIX_PORT_ENABLED << i); - DPRINTK("ata%u: LEAVE, pcs=0x%x present_mask=0x%x\n", - ap->id, pcs, present_mask); + if ((orig_mask & mask) == mask) + if (combined || (i == ap->hard_port_no)) + return 1; + } - return present_mask; + return 0; } /** - * piix_sata_softreset - reset SATA host port via ATA SRST - * @ap: port to reset - * @classes: resulting classes of attached devices + * piix_sata_phy_reset - Probe specified port on SATA host controller + * @ap: Port to probe * - * Reset SATA host port via ATA SRST. On controllers with - * reliable PCS present bits, the bits are used to determine - * device presence. + * Probe SATA phy. * * LOCKING: - * Kernel thread context (may sleep) - * - * RETURNS: - * 0 on success, -errno otherwise. + * None (inherited from caller). */ -static int piix_sata_softreset(struct ata_port *ap, unsigned int *classes) -{ - 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; +static void piix_sata_phy_reset(struct ata_port *ap) +{ + if (!piix_sata_probe(ap)) { + ata_port_disable(ap); + printk(KERN_INFO "ata%u: SATA port has no device.\n", ap->id); + return; } - return 0; -} + ap->cbl = ATA_CBL_SATA; -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); + ata_port_probe(ap); + + ata_bus_reset(ap); } /** @@ -815,8 +627,7 @@ static int piix_disable_ahci(struct pci_dev *pdev) /** * piix_check_450nx_errata - Check for problem 450NX setup - * @ata_dev: the PCI device to check - * + * * Check for the present of 450NX errata #19 and errata #25. If * they are found return an error code so we can turn off DMA */ @@ -827,7 +638,7 @@ static int __devinit piix_check_450nx_errata(struct pci_dev *ata_dev) u16 cfg; u8 rev; int no_piix_dma = 0; - + while((pdev = pci_get_device(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82454NX, pdev)) != NULL) { /* Look for 450NX PXB. Check for problem configurations @@ -835,97 +646,18 @@ 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, - const struct piix_map_db *map_db) -{ - struct piix_host_priv *hpriv = pinfo[0].private_data; - const unsigned int *map; - int i, invalid_map = 0; - u8 map_value; - - pci_read_config_byte(pdev, ICH5_PMR, &map_value); - - map = map_db->map[map_value & map_db->mask]; - - dev_printk(KERN_INFO, &pdev->dev, "MAP ["); - for (i = 0; i < 4; i++) { - switch (map[i]) { - case RV: - invalid_map = 1; - printk(" XX"); - break; - - case NA: - printk(" --"); - break; - - 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; - - default: - printk(" P%d", map[i]); - if (i & 1) - pinfo[i / 2].host_flags |= ATA_FLAG_SLAVE_POSS; - break; - } - } - printk(" ]\n"); - - if (invalid_map) - dev_printk(KERN_ERR, &pdev->dev, - "invalid MAP value %u\n", map_value); - - hpriv->map = map; - hpriv->map_db = map_db; -} +} /** * piix_init_one - Register PIIX ATA PCI device with kernel services @@ -945,10 +677,9 @@ static void __devinit piix_init_sata_map(struct pci_dev *pdev, 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; + struct ata_port_info *port_info[2]; + unsigned int combined = 0; + unsigned int pata_chan = 0, sata_chan = 0; if (!printed_version++) dev_printk(KERN_DEBUG, &pdev->dev, @@ -958,18 +689,10 @@ 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; + port_info[0] = &piix_port_info[ent->driver_data]; + port_info[1] = &piix_port_info[ent->driver_data]; - host_flags = port_info[0].host_flags; - - if (host_flags & PIIX_FLAG_AHCI) { + if (port_info[0]->host_flags & PIIX_FLAG_AHCI) { u8 tmp; pci_read_config_byte(pdev, PIIX_SCC, &tmp); if (tmp == PIIX_AHCI_DEVICE) { @@ -979,12 +702,17 @@ 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, - piix_map_db_table[ent->driver_data]); - piix_init_pcs(pdev, port_info, - piix_map_db_table[ent->driver_data]); + if (port_info[0]->host_flags & PIIX_FLAG_COMBINED) { + u8 tmp; + pci_read_config_byte(pdev, ICH5_PMR, &tmp); + + if (tmp & PIIX_COMB) { + combined = 1; + if (tmp & PIIX_COMB_PATA_P0) + sata_chan = 1; + else + pata_chan = 1; + } } /* On ICH5, some BIOSen disable the interrupt using the @@ -993,26 +721,28 @@ static int piix_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) * MSI is disabled (and it is disabled, as we don't use * message-signalled interrupts currently). */ - if (host_flags & PIIX_FLAG_CHECKINTR) + if (port_info[0]->host_flags & PIIX_FLAG_CHECKINTR) pci_intx(pdev, 1); + if (combined) { + port_info[sata_chan] = &piix_port_info[ent->driver_data]; + port_info[sata_chan]->host_flags |= ATA_FLAG_SLAVE_POSS; + port_info[pata_chan] = &piix_port_info[ich5_pata]; + + dev_printk(KERN_WARNING, &pdev->dev, + "combined mode detected (p=%u, s=%u)\n", + pata_chan, sata_chan); + } if (piix_check_450nx_errata(pdev)) { /* This writes into the master table but it does not really matter for this errata as we will apply it to all the PIIX devices on the board */ - port_info[0].mwdma_mask = 0; - port_info[0].udma_mask = 0; - port_info[1].mwdma_mask = 0; - port_info[1].udma_mask = 0; + port_info[0]->mwdma_mask = 0; + port_info[0]->udma_mask = 0; + port_info[1]->mwdma_mask = 0; + port_info[1]->udma_mask = 0; } - return ata_pci_init_one(pdev, 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); + return ata_pci_init_one(pdev, port_info, 2); } static int __init piix_init(void) diff --git a/drivers/scsi/atari_NCR5380.c b/drivers/scsi/atari_NCR5380.c index e397129c9..57295bcea 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->request_buffer; + cmd->SCp.buffer = (struct scatterlist *) cmd->buffer; cmd->SCp.buffers_residual = cmd->use_sg - 1; cmd->SCp.ptr = (char *)page_address(cmd->SCp.buffer->page)+ cmd->SCp.buffer->offset; @@ -524,6 +524,7 @@ 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 e1be4a438..f4c1ca7c1 100644 --- a/drivers/scsi/atari_scsi.c +++ b/drivers/scsi/atari_scsi.c @@ -65,6 +65,7 @@ +#include #include #define NDEBUG (0) @@ -238,17 +239,17 @@ static int atari_read_overruns = 0; #endif static int setup_can_queue = -1; -module_param(setup_can_queue, int, 0); +MODULE_PARM(setup_can_queue, "i"); static int setup_cmd_per_lun = -1; -module_param(setup_cmd_per_lun, int, 0); +MODULE_PARM(setup_cmd_per_lun, "i"); static int setup_sg_tablesize = -1; -module_param(setup_sg_tablesize, int, 0); +MODULE_PARM(setup_sg_tablesize, "i"); #ifdef SUPPORT_TAGS static int setup_use_tagged_queuing = -1; -module_param(setup_use_tagged_queuing, int, 0); +MODULE_PARM(setup_use_tagged_queuing, "i"); #endif static int setup_hostid = -1; -module_param(setup_hostid, int, 0); +MODULE_PARM(setup_hostid, "i"); #if defined(CONFIG_TT_DMA_EMUL) diff --git a/drivers/scsi/atp870u.c b/drivers/scsi/atp870u.c index 0ec41f34f..5227a779c 100644 --- a/drivers/scsi/atp870u.c +++ b/drivers/scsi/atp870u.c @@ -28,7 +28,6 @@ #include #include #include -#include #include #include @@ -473,7 +472,7 @@ go_42: */ if (workreq->use_sg) { pci_unmap_sg(dev->pdev, - (struct scatterlist *)workreq->request_buffer, + (struct scatterlist *)workreq->buffer, workreq->use_sg, workreq->sc_data_direction); } else if (workreq->request_bufflen && @@ -2625,32 +2624,29 @@ 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 *atpdev, *p; + struct atp_unit atp_dev, *p; unsigned char setupdata[2][16]; int count = 0; - - atpdev = kzalloc(sizeof(*atpdev), GFP_KERNEL); - if (!atpdev) - return -ENOMEM; - + if (pci_enable_device(pdev)) - goto err_eio; + return -EIO; - if (!pci_set_dma_mask(pdev, DMA_32BIT_MASK)) { + if (!pci_set_dma_mask(pdev, 0xFFFFFFFFUL)) { printk(KERN_INFO "atp870u: use 32bit DMA mask.\n"); } else { printk(KERN_ERR "atp870u: DMA mask required but not available.\n"); - goto err_eio; + return -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, &atpdev->chip_ver); - if (atpdev->chip_ver < 2) - goto err_eio; + error = pci_read_config_byte(pdev, PCI_CLASS_REVISION, &atp_dev.chip_ver); + if (atp_dev.chip_ver < 2) + return -EIO; } switch (ent->device) { @@ -2659,15 +2655,15 @@ static int atp870u_probe(struct pci_dev *pdev, const struct pci_device_id *ent) case ATP880_DEVID1: case ATP880_DEVID2: case ATP885_DEVID: - atpdev->chip_ver = 0x04; + atp_dev.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, &atpdev->chip_ver); + error = pci_read_config_byte(pdev, PCI_CLASS_REVISION, &atp_dev.chip_ver); pci_write_config_byte(pdev, PCI_LATENCY_TIMER, 0x80);//JCC082803 host_id = inb(base_io + 0x39); @@ -2675,17 +2671,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); - atpdev->ioport[0] = base_io + 0x40; - atpdev->pciport[0] = base_io + 0x28; - atpdev->dev_id = ent->device; - atpdev->host_id[0] = host_id; + 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; tmport = base_io + 0x22; - atpdev->scam_on = inb(tmport); + atp_dev.scam_on = inb(tmport); tmport += 0x13; - atpdev->global_map[0] = inb(tmport); + atp_dev.global_map[0] = inb(tmport); tmport += 0x07; - atpdev->ultra_map[0] = inw(tmport); + atp_dev.ultra_map[0] = inw(tmport); n = 0x3f09; next_fblk_880: @@ -2698,63 +2694,63 @@ next_fblk_880: if (inb(base_io + 0x30) == 0xff) goto flash_ok_880; - 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); + 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); outw(n, base_io + 0x34); n += 0x0002; - 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); + 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); outw(n, base_io + 0x34); n += 0x0002; - 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); + 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); outw(n, base_io + 0x34); n += 0x0002; - 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); + 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); n += 0x0018; goto next_fblk_880; flash_ok_880: outw(0, base_io + 0x34); - atpdev->ultra_map[0] = 0; - atpdev->async[0] = 0; + atp_dev.ultra_map[0] = 0; + atp_dev.async[0] = 0; for (k = 0; k < 16; k++) { n = 1; n = n << k; - if (atpdev->sp[0][k] > 1) { - atpdev->ultra_map[0] |= n; + if (atp_dev.sp[0][k] > 1) { + atp_dev.ultra_map[0] |= n; } else { - if (atpdev->sp[0][k] == 0) - atpdev->async[0] |= n; + if (atp_dev.sp[0][k] == 0) + atp_dev.async[0] |= n; } } - atpdev->async[0] = ~(atpdev->async[0]); - outb(atpdev->global_map[0], base_io + 0x35); + atp_dev.async[0] = ~(atp_dev.async[0]); + outb(atp_dev.global_map[0], base_io + 0x35); shpnt = scsi_host_alloc(&atp870u_template, sizeof(struct atp_unit)); if (!shpnt) - goto err_nomem; + return -ENOMEM; p = (struct atp_unit *)&shpnt->hostdata; - atpdev->host = shpnt; - atpdev->pdev = pdev; + atp_dev.host = shpnt; + atp_dev.pdev = pdev; pci_set_drvdata(pdev, p); - memcpy(p, atpdev, sizeof(*atpdev)); + memcpy(p, &atp_dev, sizeof atp_dev); 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, IRQF_SHARED, "atp880i", shpnt)) { + if (request_irq(pdev->irq, atp870u_intr_handle, SA_SHIRQ, "atp880i", shpnt)) { printk(KERN_ERR "Unable to allocate IRQ%d for Acard controller.\n", pdev->irq); goto free_tables; } @@ -2801,31 +2797,31 @@ flash_ok_880: printk(KERN_INFO " ACARD AEC-67162 PCI Ultra3 LVD Host Adapter: IO:%x, IRQ:%d.\n" , base_io, pdev->irq); - 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; + 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; shpnt = scsi_host_alloc(&atp870u_template, sizeof(struct atp_unit)); if (!shpnt) - goto err_nomem; + return -ENOMEM; p = (struct atp_unit *)&shpnt->hostdata; - atpdev->host = shpnt; - atpdev->pdev = pdev; + atp_dev.host = shpnt; + atp_dev.pdev = pdev; pci_set_drvdata(pdev, p); - memcpy(p, atpdev, sizeof(struct atp_unit)); + memcpy(p, &atp_dev, 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, IRQF_SHARED, "atp870u", shpnt)) { + if (request_irq(pdev->irq, atp870u_intr_handle, SA_SHIRQ, "atp870u", shpnt)) { printk(KERN_ERR "Unable to allocate IRQ for Acard controller.\n"); goto free_tables; } @@ -2977,43 +2973,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); - atpdev->ioport[0] = base_io; - atpdev->pciport[0] = base_io + 0x20; - atpdev->dev_id = ent->device; + atp_dev.ioport[0] = base_io; + atp_dev.pciport[0] = base_io + 0x20; + atp_dev.dev_id = ent->device; host_id &= 0x07; - atpdev->host_id[0] = host_id; + atp_dev.host_id[0] = host_id; tmport = base_io + 0x22; - atpdev->scam_on = inb(tmport); + atp_dev.scam_on = inb(tmport); tmport += 0x0b; - atpdev->global_map[0] = inb(tmport++); - atpdev->ultra_map[0] = inw(tmport); + atp_dev.global_map[0] = inb(tmport++); + atp_dev.ultra_map[0] = inw(tmport); - if (atpdev->ultra_map[0] == 0) { - atpdev->scam_on = 0x00; - atpdev->global_map[0] = 0x20; - atpdev->ultra_map[0] = 0xffff; + if (atp_dev.ultra_map[0] == 0) { + atp_dev.scam_on = 0x00; + atp_dev.global_map[0] = 0x20; + atp_dev.ultra_map[0] = 0xffff; } shpnt = scsi_host_alloc(&atp870u_template, sizeof(struct atp_unit)); if (!shpnt) - goto err_nomem; + return -ENOMEM; p = (struct atp_unit *)&shpnt->hostdata; - atpdev->host = shpnt; - atpdev->pdev = pdev; + atp_dev.host = shpnt; + atp_dev.pdev = pdev; pci_set_drvdata(pdev, p); - memcpy(p, atpdev, sizeof(*atpdev)); + memcpy(p, &atp_dev, sizeof atp_dev); if (atp870u_init_tables(shpnt) < 0) goto unregister; - if (request_irq(pdev->irq, atp870u_intr_handle, IRQF_SHARED, "atp870i", shpnt)) { + if (request_irq(pdev->irq, atp870u_intr_handle, SA_SHIRQ, "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 (atpdev->chip_ver > 0x07) { /* check if atp876 chip then enable terminator */ + if (atp_dev.chip_ver > 0x07) { /* check if atp876 chip then enable terminator */ tmport = base_io + 0x3e; outb(0x00, tmport); } @@ -3047,10 +3043,10 @@ flash_ok_885: outb((inb(tmport) & 0xef), tmport); tmport++; outb((inb(tmport) | 0x20), tmport); - if (atpdev->chip_ver == 4) + if (atp_dev.chip_ver == 4) shpnt->max_id = 16; else - shpnt->max_id = 8; + shpnt->max_id = 7; shpnt->this_id = host_id; shpnt->unique_id = base_io; shpnt->io_port = base_io; @@ -3096,12 +3092,6 @@ 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 329a8f297..3867ac2de 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, IRQF_SHARED, + if (request_irq(IRQ_AMIGA_PORTS, esp_intr, SA_SHIRQ, "Blizzard 1230 SCSI IV", esp->ehost)) goto err_out; diff --git a/drivers/scsi/blz2060.c b/drivers/scsi/blz2060.c index b6c137b97..4ebe69e32 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, IRQF_SHARED, + request_irq(IRQ_AMIGA_PORTS, esp_intr, SA_SHIRQ, "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 f6caa4307..c3f27285d 100644 --- a/drivers/scsi/ch.c +++ b/drivers/scsi/ch.c @@ -7,6 +7,7 @@ #define VERSION "0.25" +#include #include #include #include @@ -38,7 +39,6 @@ MODULE_DESCRIPTION("device driver for scsi media changer devices"); MODULE_AUTHOR("Gerd Knorr "); MODULE_LICENSE("GPL"); -MODULE_ALIAS_CHARDEV_MAJOR(SCSI_CHANGER_MAJOR); static int init = 1; module_param(init, int, 0444); diff --git a/drivers/scsi/constants.c b/drivers/scsi/constants.c index 61f6024b6..30a335349 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,56 +37,55 @@ 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 */ "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, +/* 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, /* 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", "ATA command pass through(12)/Blank", - "Security protocol in", "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", "Blank", "Send event", "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", @@ -94,12 +93,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 */ "Security protocol out", "Send volume tag, set streaming", +/* b5-b6 */ "Request volume element address", "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 { @@ -114,40 +113,44 @@ 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 ARRAY_SIZE(maint_in_arr) +#define MAINT_IN_SZ \ + (int)(sizeof(maint_in_arr) / sizeof(maint_in_arr[0])) 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 ARRAY_SIZE(maint_out_arr) +#define MAINT_OUT_SZ \ + (int)(sizeof(maint_out_arr) / sizeof(maint_out_arr[0])) static const struct value_name_pair serv_in12_arr[] = { {0x1, "Read media serial number"}, }; -#define SERV_IN12_SZ ARRAY_SIZE(serv_in12_arr) +#define SERV_IN12_SZ \ + (int)(sizeof(serv_in12_arr) / sizeof(serv_in12_arr[0])) static const struct value_name_pair serv_out12_arr[] = { {-1, "dummy entry"}, }; -#define SERV_OUT12_SZ ARRAY_SIZE(serv_out12_arr) +#define SERV_OUT12_SZ \ + (int)(sizeof(serv_out12_arr) / sizeof(serv_in12_arr[0])) static const struct value_name_pair serv_in16_arr[] = { {0x10, "Read capacity(16)"}, {0x11, "Read long(16)"}, }; -#define SERV_IN16_SZ ARRAY_SIZE(serv_in16_arr) +#define SERV_IN16_SZ \ + (int)(sizeof(serv_in16_arr) / sizeof(serv_in16_arr[0])) static const struct value_name_pair serv_out16_arr[] = { {0x11, "Write long(16)"}, {0x1f, "Notify data transfer device(16)"}, }; -#define SERV_OUT16_SZ ARRAY_SIZE(serv_out16_arr) +#define SERV_OUT16_SZ \ + (int)(sizeof(serv_out16_arr) / sizeof(serv_in16_arr[0])) static const struct value_name_pair variable_length_arr[] = { {0x1, "Rebuild(32)"}, @@ -187,7 +190,8 @@ static const struct value_name_pair variable_length_arr[] = { {0x8f7e, "Perform SCSI command (osd)"}, {0x8f7f, "Perform task management function (osd)"}, }; -#define VARIABLE_LENGTH_SZ ARRAY_SIZE(variable_length_arr) +#define VARIABLE_LENGTH_SZ \ + (int)(sizeof(variable_length_arr) / sizeof(variable_length_arr[0])) static const char * get_sa_name(const struct value_name_pair * arr, int arr_sz, int service_action) @@ -431,7 +435,6 @@ 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"}, @@ -443,7 +446,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 command required"}, + {0x0402, "Logical unit not ready, initializing cmd. 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"}, @@ -483,9 +486,6 @@ 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,7 +501,6 @@ 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"}, @@ -513,12 +512,11 @@ 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, "Logical block guard check failed"}, - {0x1002, "Logical block application tag check failed"}, - {0x1003, "Logical block reference tag check failed"}, + {0x1001, "Data block guard check failed"}, + {0x1002, "Data block application tag check failed"}, + {0x1003, "Data block reference tag check failed"}, {0x1100, "Unrecovered read error"}, {0x1101, "Read retries exhausted"}, @@ -540,7 +538,6 @@ 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"}, @@ -621,14 +618,11 @@ 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"}, @@ -651,10 +645,7 @@ 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 check value"}, - {0x2610, "Data decryption key fail limit reached"}, - {0x2611, "Incomplete key-associated data set"}, - {0x2612, "Vendor specific key reference not found"}, + {0x260F, "Invalid data-out buffer integrity"}, {0x2700, "Write protected"}, {0x2701, "Hardware write protected"}, @@ -666,7 +657,6 @@ 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"}, @@ -687,11 +677,6 @@ 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"}, @@ -713,7 +698,6 @@ 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"}, @@ -726,8 +710,7 @@ 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"}, - {0x300D, "WORM medium - integrity check"}, + {0x300C, "WORM medium, overwrite attempted"}, {0x3010, "Medium not formatted"}, {0x3100, "Medium format corrupted"}, @@ -815,9 +798,6 @@ 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"}, @@ -827,7 +807,6 @@ static struct error_info additional[] = {0x4300, "Message error"}, {0x4400, "Internal target failure"}, - {0x4471, "ATA device failed set features"}, {0x4500, "Select or reselect failure"}, @@ -836,10 +815,9 @@ 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 iuCRC error detected"}, + {0x4703, "Information unit CRC 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"}, @@ -874,8 +852,6 @@ 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"}, @@ -887,7 +863,6 @@ 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"}, @@ -1037,7 +1012,6 @@ 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"}, @@ -1064,8 +1038,6 @@ 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"}, */ @@ -1077,8 +1049,6 @@ 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"}, @@ -1087,18 +1057,6 @@ 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} }; @@ -1310,6 +1268,16 @@ 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) */ @@ -1322,10 +1290,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 ARRAY_SIZE(hostbyte_table) +#define NUM_HOSTBYTE_STRS (sizeof(hostbyte_table) / sizeof(const char *)) void scsi_print_hostbyte(int scsiresult) { @@ -1335,7 +1303,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) @@ -1347,14 +1315,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 ARRAY_SIZE(driverbyte_table) +#define NUM_DRIVERBYTE_STRS (sizeof(driverbyte_table) / sizeof(const char *)) 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 ARRAY_SIZE(driversuggest_table) +#define NUM_SUGGEST_STRS (sizeof(driversuggest_table) / sizeof(const char *)) void scsi_print_driverbyte(int scsiresult) { diff --git a/drivers/scsi/cyberstorm.c b/drivers/scsi/cyberstorm.c index 7c7cfb54e..a4a4fac5c 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, IRQF_SHARED, + request_irq(IRQ_AMIGA_PORTS, esp_intr, SA_SHIRQ, "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 d88cb9cf0..3a803d73b 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, IRQF_SHARED, + request_irq(IRQ_AMIGA_PORTS, esp_intr, SA_SHIRQ, "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 ff2b1796f..cbf825263 100644 --- a/drivers/scsi/dc395x.c +++ b/drivers/scsi/dc395x.c @@ -230,12 +230,13 @@ struct ScsiReqBlk { struct scsi_cmnd *cmd; struct SGentry *segment_x; /* Linear array of hw sg entries (up to 64 entries) */ - dma_addr_t sg_bus_addr; /* Bus address of sg list (ie, of segment_x) */ + u32 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 */ - size_t total_xfer_length; /* Total number of bytes remaining to be transfered */ - size_t request_length; /* Total number of bytes in this request */ + u32 total_xfer_length; /* Total number of bytes remaining to be transfered */ + unsigned char *virt_addr; /* Virtual address of current transfer position */ + /* * The sense buffer handling function, request_sense, uses * the first hw sg entry (segment_x[0]) and the transfer @@ -245,7 +246,8 @@ struct ScsiReqBlk { * total_xfer_length in xferred. These values are restored in * pci_unmap_srb_sense. This is the only place xferred is used. */ - size_t xferred; /* Saved copy of total_xfer_length */ + unsigned char *virt_addr_req; /* Saved virtual address of the request buffer */ + u32 xferred; /* Saved copy of total_xfer_length */ u16 state; @@ -975,6 +977,17 @@ 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) @@ -988,6 +1001,7 @@ 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; @@ -1018,6 +1032,7 @@ 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; @@ -1062,14 +1077,12 @@ 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; } @@ -1401,10 +1414,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\n"); + dprintkl(KERN_DEBUG, "eh_abort: Command in progress"); /* XXX: Should abort the command here */ } else { - dprintkl(KERN_DEBUG, "eh_abort: Command not found\n"); + dprintkl(KERN_DEBUG, "eh_abort: Command not found"); } return FAILED; } @@ -1963,11 +1976,14 @@ static void sg_verify_length(struct ScsiReqBlk *srb) /* * Compute the next Scatter Gather list index and adjust its length - * and address if necessary + * and address if necessary; also compute virt_addr */ 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; @@ -2000,6 +2016,29 @@ 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; } @@ -2011,7 +2050,15 @@ static void sg_update_list(struct ScsiReqBlk *srb, u32 left) */ static void sg_subtract_one(struct ScsiReqBlk *srb) { - sg_update_list(srb, srb->total_xfer_length - 1); + 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); + } } @@ -2071,7 +2118,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{fifocnt=0x%02x fifostat=0x%02x} " + "DMA{fifcnt=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), @@ -2192,11 +2239,12 @@ 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); @@ -2214,9 +2262,6 @@ 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); @@ -2253,19 +2298,18 @@ 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 ... */ - sc = DC395x_read32(acb, TRM_S1040_SCSI_COUNTER); - fc = DC395x_read8(acb, TRM_S1040_SCSI_FIFOCNT); - d_left_counter = sc + ((fc & 0x1f) + d_left_counter = DC395x_read32(acb, TRM_S1040_SCSI_COUNTER) + + ((DC395x_read8(acb, TRM_S1040_SCSI_FIFOCNT) & 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", - fc, + DC395x_read8(acb, TRM_S1040_SCSI_FIFOCNT), (srb->dcb->sync_period & WIDE_SYNC) ? "words" : "bytes", - sc, - fc, + DC395x_read32(acb, TRM_S1040_SCSI_COUNTER), + DC395x_read8(acb, TRM_S1040_DMA_FIFOCNT), DC395x_read8(acb, TRM_S1040_DMA_FIFOSTAT), DC395x_read32(acb, TRM_S1040_DMA_CXCNT), srb->total_xfer_length, d_left_counter); @@ -2273,79 +2317,40 @@ 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) " - "for remaining %i bytes:", - fc & 0x1f, + dprintkdbg(DBG_PIO, "data_in_phase0: PIO (%i %s) to " + "%p for remaining %i bytes:", + DC395x_read8(acb, TRM_S1040_SCSI_FIFOCNT) & 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 (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; - + 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--; 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; */ @@ -2504,43 +2509,22 @@ 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 (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++); + while (srb->total_xfer_length) { + if (debug_enabled(DBG_PIO)) + printk(" %02x", (unsigned char) *(srb->virt_addr)); - sg_subtract_one(srb); - } + pio_trigger(); + DC395x_write8(acb, TRM_S1040_SCSI_FIFO, + *(srb->virt_addr)++); - if (srb->cmd->use_sg) { - scsi_kunmap_atomic_sg(base); - local_irq_restore(flags); - } + sg_subtract_one(srb); } if (srb->dcb->sync_period & WIDE_SYNC) { if (ln % 2) { @@ -3335,6 +3319,7 @@ 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; } @@ -3347,14 +3332,21 @@ 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; - int ckc_only = 1; + + 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); + } 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\n", + dprintkdbg(DBG_SG, "srb_done: srb=%p sg=%i(%i/%i) buf=%p addr=%p\n", srb, cmd->use_sg, srb->sg_index, srb->sg_count, - cmd->request_buffer); + cmd->request_buffer, ptr); status = srb->target_status; if (srb->flag & AUTO_REQSENSE) { dprintkdbg(DBG_0, "srb_done: AUTO_REQSENSE1\n"); @@ -3493,47 +3485,29 @@ static void srb_done(struct AdapterCtlBlk *acb, struct DeviceCtlBlk *dcb, srb->segment_x[0].address, cmd->request_bufflen, dir); } - ckc_only = 0; + + 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; /* 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->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->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->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 ... */ @@ -3739,6 +3713,8 @@ 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 = @@ -3771,7 +3747,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 successful or NULL on failure. + * Return the new device if succesfull or NULL on failure. **/ static struct DeviceCtlBlk *device_alloc(struct AdapterCtlBlk *acb, u8 target, u8 lun) @@ -4562,7 +4538,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, IRQF_SHARED, DC395X_NAME, acb)) { + if (request_irq(irq, dc395x_interrupt, SA_SHIRQ, 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 eb32062f7..a35ee43a4 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, IRQF_DISABLED, + if (request_irq(esp->irq, esp_intr, SA_INTERRUPT, "ncr53c94", esp->ehost)) goto err_dealloc; if (request_irq(dec_interrupt[DEC_IRQ_ASC_MERR], - scsi_dma_merr_int, IRQF_DISABLED, + scsi_dma_merr_int, SA_INTERRUPT, "ncr53c94 error", esp->ehost)) goto err_free_irq; if (request_irq(dec_interrupt[DEC_IRQ_ASC_ERR], - scsi_dma_err_int, IRQF_DISABLED, + scsi_dma_err_int, SA_INTERRUPT, "ncr53c94 overrun", esp->ehost)) goto err_free_irq_merr; if (request_irq(dec_interrupt[DEC_IRQ_ASC_DMA], - scsi_dma_int, IRQF_DISABLED, + scsi_dma_int, SA_INTERRUPT, "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, IRQF_DISABLED, + if (request_irq(esp->irq, esp_intr, SA_INTERRUPT, "PMAZ_AA", esp->ehost)) { esp_deallocate(esp); release_tc_card(slot); diff --git a/drivers/scsi/dmx3191d.c b/drivers/scsi/dmx3191d.c index 879a26657..7905b904e 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, IRQF_SHARED, + if (request_irq(pdev->irq, NCR5380_intr, SA_SHIRQ, DMX3191D_DRIVER_NAME, shost)) { /* * Steam powered scsi controllers run without an IRQ anyway @@ -116,7 +116,7 @@ static int __devinit dmx3191d_probe_one(struct pci_dev *pdev, out_free_irq: free_irq(shost->irq, shost); out_release_region: - release_region(io, DMX3191D_REGION_LEN); + release_region(shost->io_port, DMX3191D_REGION_LEN); out_disable_device: pci_disable_device(pdev); out: diff --git a/drivers/scsi/dpt/dpti_i2o.h b/drivers/scsi/dpt/dpti_i2o.h index d84a281ad..a9585f523 100644 --- a/drivers/scsi/dpt/dpti_i2o.h +++ b/drivers/scsi/dpt/dpti_i2o.h @@ -23,6 +23,7 @@ #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 45806336c..6e6b293dc 100644 --- a/drivers/scsi/dpt_i2o.c +++ b/drivers/scsi/dpt_i2o.c @@ -46,6 +46,7 @@ MODULE_DESCRIPTION("Adaptec I2O RAID Driver"); #include #include /* for kmalloc() */ +#include /* for CONFIG_PCI */ #include /* for PCI support */ #include #include @@ -56,7 +57,6 @@ MODULE_DESCRIPTION("Adaptec I2O RAID Driver"); #include #include #include -#include #include #include @@ -906,8 +906,8 @@ static int adpt_install_hba(struct scsi_host_template* sht, struct pci_dev* pDev } pci_set_master(pDev); - if (pci_set_dma_mask(pDev, DMA_64BIT_MASK) && - pci_set_dma_mask(pDev, DMA_32BIT_MASK)) + if (pci_set_dma_mask(pDev, 0xffffffffffffffffULL) && + pci_set_dma_mask(pDev, 0xffffffffULL)) return -EINVAL; base_addr0_phys = pci_resource_start(pDev,0); @@ -1008,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, IRQF_SHARED, pHba->name, pHba)) { + if (request_irq (pDev->irq, adpt_isr, SA_SHIRQ, 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 0d5713dfa..310d2f488 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 ARRAY_SIZE(overrides) +#define NO_OVERRIDES (sizeof(overrides) / sizeof(struct override)) 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 ARRAY_SIZE(bases) +#define NO_BASES (sizeof (bases) / sizeof (struct base)) static const struct signature { const char *string; int offset; -} signatures[] = { +} signatures[] = { {"DATA TECHNOLOGY CORPORATION BIOS", 0x25}, }; -#define NO_SIGNATURES ARRAY_SIZE(signatures) +#define NO_SIGNATURES (sizeof (signatures) / sizeof (struct signature)) #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, IRQF_DISABLED, "dtc", instance)) { + if (request_irq(instance->irq, dtc_intr, SA_INTERRUPT, "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 a5ff43b1b..b3f9de8f7 100644 --- a/drivers/scsi/eata.c +++ b/drivers/scsi/eata.c @@ -477,6 +477,7 @@ * the driver sets host->wish_block = 1 for all ISA boards. */ +#include #include #include #include @@ -489,7 +490,6 @@ #include #include #include -#include #include #include #include @@ -1221,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, - IRQF_DISABLED | ((subversion == ESA) ? IRQF_SHARED : 0), + SA_INTERRUPT | ((subversion == ESA) ? SA_SHIRQ : 0), driver_name, (void *)&sha[j])) { printk("%s: unable to allocate IRQ %u, detaching.\n", name, irq); @@ -1426,7 +1426,7 @@ static int port_detect(unsigned long port_base, unsigned int j, if (ha->pdev) { pci_set_master(ha->pdev); - if (pci_set_dma_mask(ha->pdev, DMA_32BIT_MASK)) + if (pci_set_dma_mask(ha->pdev, 0xffffffff)) printk("%s: warning, pci_set_dma_mask failed.\n", ha->board_name); } diff --git a/drivers/scsi/eata_pio.c b/drivers/scsi/eata_pio.c index 771b01984..23beb48c7 100644 --- a/drivers/scsi/eata_pio.c +++ b/drivers/scsi/eata_pio.c @@ -46,6 +46,7 @@ * last change: 2002/11/02 OS: Linux 2.5.45 * ************************************************************/ +#include #include #include #include @@ -731,7 +732,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, IRQF_DISABLED, "EATA-PIO", sh)) { + if (!request_irq(gc->IRQ, do_eata_pio_int_handler, SA_INTERRUPT, "EATA-PIO", sh)) { reg_IRQ[gc->IRQ]++; if (!gc->IRQ_TR) reg_IRQL[gc->IRQ] = 1; /* IRQ is edge triggered */ @@ -965,7 +966,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, IRQF_DISABLED, "EATA-PIO", NULL); + request_irq(i, do_eata_pio_int_handler, SA_INTERRUPT, "EATA-PIO", NULL); HBA_ptr = first_HBA; diff --git a/drivers/scsi/esp.c b/drivers/scsi/esp.c index 5630868c1..87a8c3d20 100644 --- a/drivers/scsi/esp.c +++ b/drivers/scsi/esp.c @@ -1,6 +1,7 @@ -/* esp.c: ESP Sun SCSI driver. +/* $Id: esp.c,v 1.101 2002/01/15 06:48:55 davem Exp $ + * esp.c: EnhancedScsiProcessor Sun SCSI driver code. * - * Copyright (C) 1995, 1998, 2006 David S. Miller (davem@davemloft.net) + * Copyright (C) 1995, 1998 David S. Miller (davem@caip.rutgers.edu) */ /* TODO: @@ -12,6 +13,7 @@ * 3) Add tagged queueing. */ +#include #include #include #include @@ -183,6 +185,11 @@ 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); @@ -687,6 +694,36 @@ 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; @@ -778,14 +815,14 @@ static int __init esp_register_irq(struct esp *esp) * sanely maintain. */ if (request_irq(esp->ehost->irq, esp_intr, - IRQF_SHARED, "ESP SCSI", esp)) { + SA_SHIRQ, "ESP SCSI", esp)) { printk("esp%d: Cannot acquire irq line\n", esp->esp_id); return -1; } - printk("esp%d: IRQ %d ", esp->esp_id, - esp->ehost->irq); + printk("esp%d: IRQ %s ", esp->esp_id, + __irq_itoa(esp->ehost->irq)); return 0; } @@ -793,20 +830,19 @@ 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 = of_getintprop_default(dp, - "initiator-id", - -1); + esp->scsi_id = prom_getintdefault(esp->prom_node, + "initiator-id", + -1); if (esp->scsi_id == -1) - esp->scsi_id = of_getintprop_default(dp, - "scsi-initiator-id", - -1); + esp->scsi_id = prom_getintdefault(esp->prom_node, + "scsi-initiator-id", + -1); if (esp->scsi_id == -1) esp->scsi_id = (sdev->bus == NULL) ? 7 : - of_getintprop_default(sdev->bus->ofdev.node, - "scsi-initiator-id", - 7); + prom_getintdefault(sdev->bus->prom_node, + "scsi-initiator-id", + 7); esp->ehost->this_id = esp->scsi_id; esp->scsi_id_mask = (1 << esp->scsi_id); @@ -1031,30 +1067,28 @@ 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 device *dev, - struct sbus_dev *esp_dev, - struct sbus_dev *espdma, - struct sbus_bus *sbus, - int hme) +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 instance; - struct Scsi_Host *esp_host = scsi_host_alloc(tpnt, sizeof(struct esp)); + struct Scsi_Host *esp_host = scsi_register(tpnt, sizeof(struct esp)); struct esp *esp; - if (!esp_host) - return -ENOMEM; - + if (!esp_host) { + printk("ESP: Cannot register SCSI host\n"); + return -1; + } if (hme) esp_host->max_id = 16; esp = (struct esp *) esp_host->hostdata; esp->ehost = esp_host; esp->sdev = esp_dev; - esp->esp_id = instance; + esp->esp_id = id; 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) { @@ -1081,19 +1115,8 @@ static int __init detect_one_esp(struct scsi_host_template *tpnt, 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, @@ -1106,99 +1129,119 @@ fail_dvma_release: esp->dma->allocated = 0; fail_unlink: - scsi_host_put(esp_host); + esp_chain_del(esp); + scsi_unregister(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 struct sbus_dev sun4_esp_dev; - -static int __init esp_sun4_probe(struct scsi_host_template *tpnt) +static int __init esp_detect(struct scsi_host_template *tpnt) { + static struct sbus_dev esp_dev; + int esps_in_use = 0; + + espchain = NULL; + if (sun4_esp_physaddr) { - 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); + 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; } - return 0; + return esps_in_use; } -static int __devexit esp_sun4_remove(void) +#else /* !CONFIG_SUN4 */ + +static int __init esp_detect(struct scsi_host_template *tpnt) { - struct of_device *dev = &sun4_esp_dev.ofdev; - struct esp *esp = dev_get_drvdata(&dev->dev); + struct sbus_bus *sbus; + struct sbus_dev *esp_dev, *sbdev_iter; + int nesps = 0, esps_in_use = 0; - return esp_remove_common(esp); + 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; } -#else /* !CONFIG_SUN4 */ +#endif /* !CONFIG_SUN4 */ -static int __devinit esp_sbus_probe(struct of_device *dev, const struct of_device_id *match) +/* + */ +static int esp_release(struct Scsi_Host *host) { - 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; - } + struct esp *esp = (struct esp *) host->hostdata; - return detect_one_esp(match->data, &dev->dev, - sdev, dma_sdev, sdev->bus, hme); -} + ESP_INTSOFF(esp->dregs); +#if 0 + esp_reset_dma(esp); + esp_reset_esp(esp); +#endif -static int __devexit esp_sbus_remove(struct of_device *dev) -{ - struct esp *esp = dev_get_drvdata(&dev->dev); + 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); - return esp_remove_common(esp); + return 0; } -#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. @@ -1372,11 +1415,18 @@ 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 *) host->hostdata; + struct esp *esp; if (inout) return -EINVAL; /* not yet */ + for_each_esp(esp) { + if (esp->ehost == host) + break; + } + if (!esp) + return -EINVAL; + if (start) *start = buffer; @@ -1398,7 +1448,7 @@ static void esp_get_dmabufs(struct esp *esp, struct scsi_cmnd *sp) sp->SCp.ptr = NULL; } } else { - sp->SCp.buffer = (struct scatterlist *) sp->request_buffer; + sp->SCp.buffer = (struct scatterlist *) sp->buffer; sp->SCp.buffers_residual = sbus_map_sg(esp->sdev, sp->SCp.buffer, sp->use_sg, @@ -1411,7 +1461,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->request_buffer, sp->use_sg, + sbus_unmap_sg(esp->sdev, sp->buffer, sp->use_sg, sp->sc_data_direction); } else if (sp->request_bufflen) { sbus_unmap_single(esp->sdev, @@ -2755,15 +2805,18 @@ static int esp_do_data_finale(struct esp *esp) */ static int esp_should_clear_sync(struct scsi_cmnd *sp) { - u8 cmd = sp->cmnd[0]; + u8 cmd1 = sp->cmnd[0]; + u8 cmd2 = sp->data_cmnd[0]; /* These cases are for spinning up a disk and * waiting for that spinup to complete. */ - if (cmd == START_STOP) + if (cmd1 == START_STOP || + cmd2 == START_STOP) return 0; - if (cmd == TEST_UNIT_READY) + if (cmd1 == TEST_UNIT_READY || + cmd2 == TEST_UNIT_READY) return 0; /* One more special case for SCSI tape drives, @@ -2771,7 +2824,8 @@ 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 (cmd == MODE_SENSE) + if (cmd1 == MODE_SENSE || + cmd2 == MODE_SENSE) return 0; } @@ -4323,12 +4377,15 @@ static void esp_slave_destroy(struct scsi_device *SDptr) SDptr->hostdata = NULL; } -static struct scsi_host_template esp_template = { - .module = THIS_MODULE, - .name = "esp", - .info = esp_info, +static struct scsi_host_template driver_template = { + .proc_name = "esp", + .proc_info = esp_proc_info, + .name = "Sun ESP 100/100a/200", + .detect = esp_detect, .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, @@ -4337,58 +4394,12 @@ static struct scsi_host_template esp_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 -} -static void __exit esp_exit(void) -{ -#ifdef CONFIG_SUN4 - esp_sun4_remove(); -#else - of_unregister_driver(&esp_sbus_driver); -#endif -} +#include "scsi_module.c" -MODULE_DESCRIPTION("ESP Sun SCSI driver"); -MODULE_AUTHOR("David S. Miller (davem@davemloft.net)"); +MODULE_DESCRIPTION("EnhancedScsiProcessor Sun SCSI driver"); +MODULE_AUTHOR("David S. Miller (davem@redhat.com)"); 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 a98cda912..73f7d6968 100644 --- a/drivers/scsi/esp.h +++ b/drivers/scsi/esp.h @@ -403,4 +403,8 @@ 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 2a1c5c22b..8ae9c406a 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, IRQF_SHARED, + if (request_irq(IRQ_AMIGA_PORTS, esp_intr, SA_SHIRQ, "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 7f891023a..03416548f 100644 --- a/drivers/scsi/fcal.c +++ b/drivers/scsi/fcal.c @@ -13,6 +13,7 @@ #include #include #include +#include #ifdef CONFIG_KMOD #include #endif diff --git a/drivers/scsi/fd_mcs.c b/drivers/scsi/fd_mcs.c index dde3edf35..cca485a2b 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 ARRAY_SIZE(fd_mcs_adapters) +#define FD_BRDS sizeof(fd_mcs_adapters)/sizeof(struct fd_mcs_adapters_struct) 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, IRQF_SHARED, "fd_mcs", hosts)) { + if (request_irq(irq, fd_mcs_intr, SA_SHIRQ, "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 b0694dcce..733424439 100644 --- a/drivers/scsi/fdomain.c +++ b/drivers/scsi/fdomain.c @@ -266,6 +266,7 @@ **************************************************************************/ +#include #include #include #include @@ -419,10 +420,10 @@ static unsigned long addresses[] = { 0xd0000, 0xe0000, }; -#define ADDRESS_COUNT ARRAY_SIZE(addresses) - +#define ADDRESS_COUNT (sizeof( addresses ) / sizeof( unsigned )) + static unsigned short ports[] = { 0x140, 0x150, 0x160, 0x170 }; -#define PORT_COUNT ARRAY_SIZE(ports) +#define PORT_COUNT (sizeof( ports ) / sizeof( unsigned short )) static unsigned short ints[] = { 3, 5, 10, 11, 12, 14, 15, 0 }; @@ -501,7 +502,7 @@ static struct signature { geometry location are verified). */ }; -#define SIGNATURE_COUNT ARRAY_SIZE(signatures) +#define SIGNATURE_COUNT (sizeof( signatures ) / sizeof( struct signature )) static void print_banner( struct Scsi_Host *shpnt ) { @@ -518,7 +519,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 ); } @@ -949,7 +950,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?IRQF_SHARED:0, "fdomain", shpnt); + do_fdomain_16x0_intr, pdev?SA_SHIRQ:0, "fdomain", shpnt); if (retcode < 0) { if (retcode == -EINVAL) { diff --git a/drivers/scsi/g_NCR5380.c b/drivers/scsi/g_NCR5380.c index 67f1100f3..45756fa90 100644 --- a/drivers/scsi/g_NCR5380.c +++ b/drivers/scsi/g_NCR5380.c @@ -91,6 +91,7 @@ #define AUTOPROBE_IRQ #define AUTOSENSE +#include #ifdef CONFIG_SCSI_GENERIC_NCR53C400 #define NCR53C400_PSEUDO_DMA 1 @@ -126,7 +127,7 @@ static int ncr_53c400a = NCR_NOT_SET; static int dtc_3181e = NCR_NOT_SET; static struct override { - NCR5380_map_type NCR5380_map_name; + NCR5380_implementation_fields; int irq; int dma; int board; /* Use NCR53c400, Ricoh, etc. extensions ? */ @@ -137,9 +138,10 @@ static struct override { [1] __initdata = { { 0,},}; #endif -#define NO_OVERRIDES ARRAY_SIZE(overrides) -#ifndef MODULE +#define NO_OVERRIDES (sizeof(overrides) / sizeof(struct override)) + +#ifndef MODULE /** * internal_setup - handle lilo command string override @@ -208,7 +210,7 @@ static int __init do_NCR5380_setup(char *str) { int ints[10]; - get_options(str, ARRAY_SIZE(ints), ints); + get_options(str, sizeof(ints) / sizeof(int), ints); internal_setup(BOARD_NCR5380, str, ints); return 1; } @@ -216,7 +218,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. @@ -226,7 +228,7 @@ static int __init do_NCR53C400_setup(char *str) { int ints[10]; - get_options(str, ARRAY_SIZE(ints), ints); + get_options(str, sizeof(ints) / sizeof(int), ints); internal_setup(BOARD_NCR53C400, str, ints); return 1; } @@ -234,7 +236,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. @@ -244,7 +246,7 @@ static int __init do_NCR53C400A_setup(char *str) { int ints[10]; - get_options(str, ARRAY_SIZE(ints), ints); + get_options(str, sizeof(ints) / sizeof(int), ints); internal_setup(BOARD_NCR53C400A, str, ints); return 1; } @@ -252,7 +254,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. @@ -262,7 +264,7 @@ static int __init do_DTC3181E_setup(char *str) { int ints[10]; - get_options(str, ARRAY_SIZE(ints), ints); + get_options(str, sizeof(ints) / sizeof(int), ints); internal_setup(BOARD_DTC3181E, str, ints); return 1; } @@ -297,10 +299,6 @@ int __init generic_NCR5380_detect(struct scsi_host_template * tpnt) }; int flags = 0; struct Scsi_Host *instance; -#ifdef CONFIG_SCSI_G_NCR5380_MEM - unsigned long base; - void __iomem *iomem; -#endif if (ncr_irq != NCR_NOT_SET) overrides[0].irq = ncr_irq; @@ -426,22 +424,15 @@ int __init generic_NCR5380_detect(struct scsi_host_template * tpnt) region_size = NCR5380_region_size; } #else - base = overrides[current_override].NCR5380_map_name; - if (!request_mem_region(base, NCR5380_region_size, "ncr5380")) - continue; - iomem = ioremap(base, NCR5380_region_size); - if (!iomem) { - release_mem_region(base, NCR5380_region_size); + if(!request_mem_region(overrides[current_override].NCR5380_map_name, NCR5380_region_size, "ncr5380")) continue; - } #endif instance = scsi_register(tpnt, sizeof(struct NCR5380_hostdata)); if (instance == NULL) { #ifndef CONFIG_SCSI_G_NCR5380_MEM release_region(overrides[current_override].NCR5380_map_name, region_size); #else - iounmap(iomem); - release_mem_region(base, NCR5380_region_size); + release_mem_region(overrides[current_override].NCR5380_map_name, NCR5380_region_size); #endif continue; } @@ -449,8 +440,6 @@ int __init generic_NCR5380_detect(struct scsi_host_template * tpnt) instance->NCR5380_instance_name = overrides[current_override].NCR5380_map_name; #ifndef CONFIG_SCSI_G_NCR5380_MEM instance->n_io_port = region_size; -#else - ((struct NCR5380_hostdata *)instance->hostdata).iomem = iomem; #endif NCR5380_init(instance, flags); @@ -461,7 +450,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, IRQF_DISABLED, "NCR5380", instance)) { + if (request_irq(instance->irq, generic_NCR5380_intr, SA_INTERRUPT, "NCR5380", instance)) { printk(KERN_WARNING "scsi%d : IRQ%d not free, interrupts disabled\n", instance->host_no, instance->irq); instance->irq = SCSI_IRQ_NONE; } @@ -520,7 +509,6 @@ int generic_NCR5380_release_resources(struct Scsi_Host *instance) #ifndef CONFIG_SCSI_G_NCR5380_MEM release_region(instance->NCR5380_instance_name, instance->n_io_port); #else - iounmap(((struct NCR5380_hostdata *)instance->hostdata).iomem); release_mem_region(instance->NCR5380_instance_name, NCR5380_region_size); #endif @@ -598,7 +586,7 @@ static inline int NCR5380_pread(struct Scsi_Host *instance, unsigned char *dst, } #else /* implies CONFIG_SCSI_G_NCR5380_MEM */ - memcpy_fromio(dst + start, iomem + NCR53C400_host_buffer, 128); + isa_memcpy_fromio(dst + start, NCR53C400_host_buffer + NCR5380_map_name, 128); #endif start += 128; blocks--; @@ -618,7 +606,7 @@ static inline int NCR5380_pread(struct Scsi_Host *instance, unsigned char *dst, } #else /* implies CONFIG_SCSI_G_NCR5380_MEM */ - memcpy_fromio(dst + start, iomem + NCR53C400_host_buffer, 128); + isa_memcpy_fromio(dst + start, NCR53C400_host_buffer + NCR5380_map_name, 128); #endif start += 128; blocks--; @@ -683,7 +671,7 @@ static inline int NCR5380_pwrite(struct Scsi_Host *instance, unsigned char *src, } #else /* implies CONFIG_SCSI_G_NCR5380_MEM */ - memcpy_toio(iomem + NCR53C400_host_buffer, src + start, 128); + isa_memcpy_toio(NCR53C400_host_buffer + NCR5380_map_name, src + start, 128); #endif start += 128; blocks--; @@ -699,7 +687,7 @@ static inline int NCR5380_pwrite(struct Scsi_Host *instance, unsigned char *src, } #else /* implies CONFIG_SCSI_G_NCR5380_MEM */ - memcpy_toio(iomem + NCR53C400_host_buffer, src + start, 128); + isa_memcpy_toio(NCR53C400_host_buffer + NCR5380_map_name, src + start, 128); #endif start += 128; blocks--; diff --git a/drivers/scsi/g_NCR5380.h b/drivers/scsi/g_NCR5380.h index df0b3f69e..656fbe2f9 100644 --- a/drivers/scsi/g_NCR5380.h +++ b/drivers/scsi/g_NCR5380.h @@ -32,6 +32,7 @@ #ifndef GENERIC_NCR5380_H #define GENERIC_NCR5380_H +#include #define GENERIC_NCR5380_PUBLIC_RELEASE 1 @@ -81,15 +82,6 @@ static const char* generic_NCR5380_info(struct Scsi_Host *); #define NCR5380_read(reg) (inb(NCR5380_map_name + (reg))) #define NCR5380_write(reg, value) (outb((value), (NCR5380_map_name + (reg)))) -#define NCR5380_implementation_fields \ - NCR5380_map_type NCR5380_map_name - -#define NCR5380_local_declare() \ - register NCR5380_implementation_fields - -#define NCR5380_setup(instance) \ - NCR5380_map_name = (NCR5380_map_type)((instance)->NCR5380_instance_name) - #else /* therefore CONFIG_SCSI_G_NCR5380_MEM */ @@ -103,20 +95,18 @@ static const char* generic_NCR5380_info(struct Scsi_Host *); #define NCR53C400_host_buffer 0x3900 #define NCR5380_region_size 0x3a00 -#define NCR5380_read(reg) readb(iomem + NCR53C400_mem_base + (reg)) -#define NCR5380_write(reg, value) writeb(value, iomem + NCR53C400_mem_base + (reg)) +#define NCR5380_read(reg) isa_readb(NCR5380_map_name + NCR53C400_mem_base + (reg)) +#define NCR5380_write(reg, value) isa_writeb(value, NCR5380_map_name + NCR53C400_mem_base + (reg)) +#endif #define NCR5380_implementation_fields \ - NCR5380_map_type NCR5380_map_name; \ - void __iomem *iomem; + NCR5380_map_type NCR5380_map_name #define NCR5380_local_declare() \ - register void __iomem *iomem + register NCR5380_implementation_fields #define NCR5380_setup(instance) \ - iomem = (((struct NCR5380_hostdata *)(instance)->hostdata).iomem) - -#endif + NCR5380_map_name = (NCR5380_map_type)((instance)->NCR5380_instance_name) #define NCR5380_intr generic_NCR5380_intr #define NCR5380_queue_command generic_NCR5380_queue_command diff --git a/drivers/scsi/gdth.c b/drivers/scsi/gdth.c index 5c0c92716..f6d44b6f1 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-06 ICP vortex GmbH, Achim Leubner * + * Copyright (C) 1995-04 ICP vortex GmbH, Achim Leubner * * Copyright (C) 2002-04 Intel Corporation * - * Copyright (C) 2003-06 Adaptec Inc. * + * Copyright (C) 2003-04 Adaptec Inc. * * * * * * Additions/Fixes: * @@ -27,14 +27,9 @@ * along with this kernel; if not, write to the Free Software * * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * * - * Linux kernel 2.4.x, 2.6.x supported * + * Linux kernel 2.2.x, 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 * @@ -99,7 +94,7 @@ * Bugfix free_irq() * * Revision 1.56 2001/08/09 11:19:39 achim - * Scsi_Host_Template changes + * struct scsi_host_template changes * * Revision 1.55 2001/08/09 10:11:28 achim * Command HOST_UNFREEZE_IO before cache service init. @@ -393,13 +388,6 @@ #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 @@ -419,8 +407,8 @@ #include "scsi.h" #include -#include "gdth_kcompat.h" #include "gdth.h" +#include "gdth_kcompat.h" static void gdth_delay(int milliseconds); static void gdth_eval_mapping(ulong32 size, ulong32 *cyls, int *heads, int *secs); @@ -475,8 +463,6 @@ 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; @@ -569,8 +555,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) @@ -656,7 +642,6 @@ 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); @@ -669,23 +654,8 @@ 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); /* ioctl interface */ static struct file_operations gdth_fops = { @@ -701,7 +671,7 @@ static struct file_operations gdth_fops = { static struct notifier_block gdth_notifier = { gdth_halt, NULL, 0 }; -static int notifier_disabled = 0; + static void gdth_delay(int milliseconds) { @@ -712,91 +682,6 @@ 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; @@ -887,7 +772,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; @@ -2362,16 +2247,14 @@ static void gdth_putq(int hanum,Scsi_Cmnd *scp,unchar priority) ha = HADATA(gdth_ctr_tab[hanum]); spin_lock_irqsave(&ha->smp_lock, flags); - 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); - } + 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); } } @@ -2425,18 +2308,14 @@ 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; - 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; + 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 (firsttime) { if (gdth_test_busy(hanum)) { /* controller busy ? */ @@ -2451,7 +2330,7 @@ static void gdth_next(int hanum) firsttime = FALSE; } - if (nscp->done != gdth_scsi_done) { + if (nscp->done != gdth_scsi_done || nscp->cmnd[0] != 0xff) { if (nscp->SCp.phase == -1) { nscp->SCp.phase = CACHESERVICE; /* default: cache svc. */ if (nscp->cmnd[0] == TEST_UNIT_READY) { @@ -2514,7 +2393,7 @@ static void gdth_next(int hanum) else nscp->scsi_done(nscp); } - } else if (nscp->done == gdth_scsi_done) { + } else if (nscp->done == gdth_scsi_done && nscp->cmnd[0] == 0xff) { if (!(cmd_index=gdth_special_cmd(hanum,nscp))) this_cmd = FALSE; next_cmd = FALSE; @@ -2662,13 +2541,13 @@ static void gdth_copy_internal_data(int hanum,Scsi_Cmnd *scp, gdth_ha_str *ha; char *address; - cpcount = count<=(ushort)scp->request_bufflen ? count:(ushort)scp->request_bufflen; + cpcount = count<=(ushort)scp->bufflen ? count:(ushort)scp->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)); @@ -2680,19 +2559,12 @@ static void gdth_copy_internal_data(int hanum,Scsi_Cmnd *scp, hanum); return; } - 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; + local_irq_save(flags); + address = kmap_atomic(sl->page, KM_BIO_SRC_IRQ) + sl->offset; memcpy(address,buffer,cpnow); - flush_dcache_page(sl->page); - kunmap_atomic(address, KM_BH_IRQ); -#endif - local_irq_restore(flags); + flush_dcache_page(sl->page); + kunmap_atomic(address, KM_BIO_SRC_IRQ); + local_irq_restore(flags); if (cpsum == cpcount) break; buffer += cpnow; @@ -3073,9 +2945,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); - *(ulong32 *)&scp->SCp.buffer = (ulong32)sense_paddr; + scp->SCp.buffer = (struct scatterlist *)((ulong32)sense_paddr); /* high part, if 64bit */ - *(ulong32 *)&scp->host_scribble = (ulong32)((ulong64)sense_paddr >> 32); + scp->host_scribble = (char *)(ulong32)((ulong64)sense_paddr >> 32); cmdp->OpCode = GDT_WRITE; /* always */ cmdp->BoardNode = LOCALBOARD; if (mode64) { @@ -3149,7 +3021,7 @@ static int gdth_fill_raw_cmd(int hanum,Scsi_Cmnd *scp,unchar b) } #endif - } else if (scp->request_bufflen) { + } else { scp->SCp.Status = GDTH_MAP_SINGLE; scp->SCp.Message = PCI_DMA_BIDIRECTIONAL; page = virt_to_page(scp->request_buffer); @@ -3436,7 +3308,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 */ @@ -3532,7 +3404,7 @@ static irqreturn_t gdth_interrupt(int irq,void *dev_id,struct pt_regs *regs) IStatus &= ~0x80; #ifdef INT_COAL if (coalesced) - ha->status = pcs->ext_status && 0xffff; + ha->status = pcs->ext_status & 0xffff; else #endif ha->status = gdth_readw(&dp6m_ptr->i960r.status); @@ -3544,7 +3416,7 @@ static irqreturn_t gdth_interrupt(int irq,void *dev_id,struct pt_regs *regs) if (coalesced) { ha->info = pcs->info0; ha->info2 = pcs->info1; - ha->service = (pcs->ext_status >> 16) && 0xffff; + ha->service = (pcs->ext_status >> 16) & 0xffff; } else #endif { @@ -3769,10 +3641,9 @@ 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); } @@ -4282,11 +4153,7 @@ 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]; @@ -4320,7 +4187,7 @@ static int __init gdth_detect(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(); @@ -4351,7 +4218,7 @@ static int __init gdth_detect(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,IRQF_DISABLED,"gdth",ha)) { + if (request_irq(ha->irq,gdth_interrupt,SA_INTERRUPT,"gdth",ha)) { printk("GDT-ISA: Unable to allocate IRQ\n"); scsi_unregister(shp); continue; @@ -4477,7 +4344,7 @@ static int __init gdth_detect(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,IRQF_DISABLED,"gdth",ha)) { + if (request_irq(ha->irq,gdth_interrupt,SA_INTERRUPT,"gdth",ha)) { printk("GDT-EISA: Unable to allocate IRQ\n"); scsi_unregister(shp); continue; @@ -4604,7 +4471,7 @@ static int __init gdth_detect(Scsi_Host_Template *shtp) pcistr[ctr].bus,PCI_SLOT(pcistr[ctr].device_fn),ha->irq); if (request_irq(ha->irq, gdth_interrupt, - IRQF_DISABLED|IRQF_SHARED, "gdth", ha)) + SA_INTERRUPT|SA_SHIRQ, "gdth", ha)) { printk("GDT-PCI: Unable to allocate IRQ\n"); scsi_unregister(shp); @@ -4660,15 +4527,15 @@ static int __init gdth_detect(Scsi_Host_Template *shtp) if (!(ha->cache_feat & ha->raw_feat & ha->screen_feat &GDT_64BIT)|| /* 64-bit DMA only supported from FW >= x.43 */ (!ha->dma64_support)) { - if (pci_set_dma_mask(pcistr[ctr].pdev, DMA_32BIT_MASK)) { + if (pci_set_dma_mask(pcistr[ctr].pdev, 0xffffffff)) { printk(KERN_WARNING "GDT-PCI %d: Unable to set 32-bit DMA\n", hanum); err = TRUE; } } else { shp->max_cmd_len = 16; - if (!pci_set_dma_mask(pcistr[ctr].pdev, DMA_64BIT_MASK)) { + if (!pci_set_dma_mask(pcistr[ctr].pdev, 0xffffffffffffffffULL)) { printk("GDT-PCI %d: 64-bit DMA enabled\n", hanum); - } else if (pci_set_dma_mask(pcistr[ctr].pdev, DMA_32BIT_MASK)) { + } else if (pci_set_dma_mask(pcistr[ctr].pdev, 0xffffffff)) { printk(KERN_WARNING "GDT-PCI %d: Unable to set 64/32-bit DMA\n", hanum); err = TRUE; } @@ -4728,13 +4595,13 @@ static int __init gdth_detect(Scsi_Host_Template *shtp) add_timer(&gdth_timer); #endif major = register_chrdev(0,"gdth",&gdth_fops); - notifier_disabled = 0; register_reboot_notifier(&gdth_notifier); } gdth_polling = FALSE; return gdth_ctr_vcount; } + static int gdth_release(struct Scsi_Host *shp) { int hanum; @@ -4883,7 +4750,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; } @@ -4951,9 +4818,7 @@ 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; - else - gdth_update_timeout(hanum, scp, scp->timeout_per_command * 6); - + gdth_update_timeout(hanum, scp, scp->timeout_per_command * 6); gdth_putq( hanum, scp, priority ); gdth_next( hanum ); return 0; @@ -5056,7 +4921,11 @@ static int ioc_resetdrv(void __user *arg, char *cmnd) gdth_cmd_str cmd; int hanum; gdth_ha_str *ha; - int rval; +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) + Scsi_Request *srp; +#else + Scsi_Cmnd *scp; +#endif if (copy_from_user(&res, arg, sizeof(gdth_ioctl_reset)) || res.ionode >= gdth_ctr_count || res.number >= MAX_HDRIVES) @@ -5073,11 +4942,25 @@ static int ioc_resetdrv(void __user *arg, char *cmnd) cmd.u.cache64.DeviceNo = res.number; else cmd.u.cache.DeviceNo = res.number; - - rval = __gdth_execute(ha->sdev, &cmd, cmnd, 30, NULL); - if (rval < 0) - return rval; - res.status = rval; +#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 if (copy_to_user(arg, &res, sizeof(gdth_ioctl_reset))) return -EFAULT; @@ -5090,8 +4973,12 @@ static int ioc_general(void __user *arg, char *cmnd) char *buf = NULL; ulong64 paddr; int hanum; - gdth_ha_str *ha; - int rval; + gdth_ha_str *ha; +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) + Scsi_Request *srp; +#else + Scsi_Cmnd *scp; +#endif if (copy_from_user(&gen, arg, sizeof(gdth_ioctl_general)) || gen.ionode >= gdth_ctr_count) @@ -5183,10 +5070,27 @@ static int ioc_general(void __user *arg, char *cmnd) } } - rval = __gdth_execute(ha->sdev, &gen.command, cmnd, gen.timeout, &gen.info); - if (rval < 0) - return rval; - gen.status = rval; +#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 if (copy_to_user(arg + sizeof(gdth_ioctl_general), buf, gen.data_len + gen.sense_len)) { @@ -5209,22 +5113,40 @@ static int ioc_hdrlist(void __user *arg, char *cmnd) gdth_ha_str *ha; unchar i; int hanum, rc = -ENOMEM; - u32 cluster_type = 0; - +#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 (!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; @@ -5241,15 +5163,27 @@ static int ioc_hdrlist(void __user *arg, char *cmnd) cmd->u.cache64.DeviceNo = i; else cmd->u.cache.DeviceNo = i; - 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) + 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 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); @@ -5267,21 +5201,40 @@ 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; @@ -5292,8 +5245,19 @@ static int ioc_rescan(void __user *arg, char *cmnd) cmd->OpCode = GDT_INIT; cmd->u.cache.DeviceNo = LINUX_OS; } - - status = __gdth_execute(ha->sdev, cmd, cmnd, 30, &info); +#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 i = 0; hdr_cnt = (status == S_OK ? (ushort)info : 0); } else { @@ -5308,9 +5272,15 @@ static int ioc_rescan(void __user *arg, char *cmnd) cmd->u.cache64.DeviceNo = i; else cmd->u.cache.DeviceNo = i; - - status = __gdth_execute(ha->sdev, cmd, cmnd, 30, &info); - +#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 spin_lock_irqsave(&ha->smp_lock, flags); rsc->hdr_list[i].bus = ha->virt_bus; rsc->hdr_list[i].target = i; @@ -5342,9 +5312,15 @@ static int ioc_rescan(void __user *arg, char *cmnd) cmd->u.cache64.DeviceNo = i; else cmd->u.cache.DeviceNo = i; - - status = __gdth_execute(ha->sdev, cmd, cmnd, 30, &info); - +#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 spin_lock_irqsave(&ha->smp_lock, flags); ha->hdr[i].devtype = (status == S_OK ? (ushort)info : 0); spin_unlock_irqrestore(&ha->smp_lock, flags); @@ -5355,9 +5331,15 @@ static int ioc_rescan(void __user *arg, char *cmnd) cmd->u.cache64.DeviceNo = i; else cmd->u.cache.DeviceNo = i; - - status = __gdth_execute(ha->sdev, cmd, cmnd, 30, &info); - +#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 spin_lock_irqsave(&ha->smp_lock, flags); ha->hdr[i].cluster_type = ((status == S_OK && !shared_access) ? (ushort)info : 0); @@ -5370,18 +5352,29 @@ static int ioc_rescan(void __user *arg, char *cmnd) cmd->u.cache64.DeviceNo = i; else cmd->u.cache.DeviceNo = i; - - status = __gdth_execute(ha->sdev, cmd, cmnd, 30, &info); - +#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 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); @@ -5521,18 +5514,17 @@ 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 = kmalloc(sizeof(*scp), GFP_KERNEL); + scp = scsi_get_command(ha->sdev, 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); - kfree(scp); + scsi_put_command(scp); #else scp = scsi_allocate_device(ha->sdev, 1, FALSE); if (!scp) @@ -5565,12 +5557,34 @@ 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; @@ -5586,10 +5600,20 @@ static void gdth_flush(int hanum) gdtcmd.u.cache.sg_canz = 0; } TRACE2(("gdth_flush(): flush ha %d drive %d\n", hanum, i)); - - gdth_execute(gdth_ctr_tab[hanum], &gdtcmd, cmnd, 30, NULL); +#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 } } +#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 */ @@ -5598,17 +5622,20 @@ 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; - TRACE2(("gdth_halt() event %d\n",(int)event)); if (event != SYS_RESTART && event != SYS_HALT && event != SYS_POWER_OFF) return NOTIFY_DONE; - notifier_disabled = 1; printk("GDT-HA: Flushing all host drives .. "); for (hanum = 0; hanum < gdth_ctr_count; ++hanum) { gdth_flush(hanum); @@ -5620,7 +5647,31 @@ 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)); - gdth_execute(gdth_ctr_tab[hanum], &gdtcmd, cmnd, 10, NULL); +#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 #endif } printk("Done.\n"); @@ -5628,25 +5679,11 @@ static int gdth_halt(struct notifier_block *nb, ulong event, void *buf) #ifdef GDTH_STATISTICS del_timer(&gdth_timer); #endif + unregister_reboot_notifier(&gdth_notifier); 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", @@ -5657,9 +5694,6 @@ static 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 47eae0299..cc4882fb9 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-06 ICP vortex, Achim Leubner + * gdth.h Copyright (C) 1995-03 ICP vortex, Achim Leubner * See gdth.c for further informations and * below for supported controller types * * * - * $Id: gdth.h,v 1.58 2006/01/11 16:14:09 achim Exp $ + * $Id: gdth.h,v 1.57 2004/03/31 11:52:09 achim Exp $ */ #include @@ -26,9 +26,9 @@ /* defines, macros */ /* driver version */ -#define GDTH_VERSION_STR "3.05" +#define GDTH_VERSION_STR "3.04" #define GDTH_VERSION 3 -#define GDTH_SUBVERSION 5 +#define GDTH_SUBVERSION 4 /* protocol version */ #define PROTOCOL_VERSION 1 diff --git a/drivers/scsi/gdth_kcompat.h b/drivers/scsi/gdth_kcompat.h index 2a302eee6..e6cf0edfa 100644 --- a/drivers/scsi/gdth_kcompat.h +++ b/drivers/scsi/gdth_kcompat.h @@ -1,3 +1,5 @@ + + #ifndef IRQ_HANDLED typedef void irqreturn_t; #define IRQ_NONE @@ -8,18 +10,6 @@ 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 32982eb75..5e8657f9c 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.43 2006/01/11 16:15:00 achim Exp $ + * $Id: gdth_proc.c,v 1.42 2004/03/05 15:50:20 achim Exp $ */ #include @@ -51,26 +51,57 @@ 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; - + 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)); +#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 + if (length >= 4) { if (strncmp(buffer,"gdth",4) == 0) { buffer += 5; length -= 5; - ret_val = gdth_set_asc_info(host, buffer, length, hanum); + ret_val = gdth_set_asc_info( buffer, length, hanum, scp ); } } - +#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; } -static int gdth_set_asc_info(struct Scsi_Host *host, char *buffer, - int length,int hanum) +#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 { - 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; @@ -115,8 +146,11 @@ static int gdth_set_asc_info(struct Scsi_Host *host, char *buffer, gdtcmd.u.cache.DeviceNo = i; gdtcmd.u.cache.BlockNo = 1; } - - gdth_execute(host, &gdtcmd, cmnd, 30, NULL); +#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 } } if (!found) @@ -168,9 +202,11 @@ static int gdth_set_asc_info(struct Scsi_Host *host, char *buffer, gdtcmd.u.ioctl.subfunc = CACHE_CONFIG; gdtcmd.u.ioctl.channel = INVALID_CHANNEL; pcpar->write_back = wb_mode==1 ? 0:1; - - gdth_execute(host, &gdtcmd, cmnd, 30, NULL); - +#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_ioctl_free(hanum, GDTH_SCRATCH, ha->pscratch, paddr); printk("Done.\n"); return(orig_length); @@ -194,6 +230,13 @@ 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; @@ -209,7 +252,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)); @@ -217,6 +260,28 @@ 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 */ @@ -321,9 +386,16 @@ 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 (gdth_execute(host, gdtcmd, cmnd, 30, NULL) != S_OK) +#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 + { pds->count = 0; + } /* other IOCTLs must fit into area GDTH_SCRATCH/4 */ for (j = 0; j < ha->raw[i].pdev_cnt; ++j) { @@ -338,8 +410,14 @@ 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 (gdth_execute(host, gdtcmd, cmnd, 30, NULL) == S_OK) { +#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 + { strncpy(hrec,pdi->vendor,8); strncpy(hrec+8,pdi->product,16); strncpy(hrec+24,pdi->revision,4); @@ -388,8 +466,14 @@ 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 (gdth_execute(host, gdtcmd, cmnd, 30, NULL) == S_OK) { +#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 + { size = sprintf(buffer+len, " Grown Defects:\t%d\n", pdef->sddc_cnt); @@ -435,8 +519,16 @@ 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 (gdth_execute(host, gdtcmd, cmnd, 30, NULL) != S_OK) +#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 + { break; + } pcdi->ld_dtype >>= 16; j++; if (pcdi->ld_dtype > 2) { @@ -537,7 +629,14 @@ 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 (gdth_execute(host, gdtcmd, cmnd, 30, NULL) == S_OK) { +#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 (pai->ai_state == 0) strcpy(hrec, "idle"); else if (pai->ai_state == 2) @@ -611,7 +710,14 @@ 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 (gdth_execute(host, gdtcmd, cmnd, 30, NULL) == S_OK) { +#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 + { ha->hdr[i].ldr_no = i; ha->hdr[i].rw_attribs = 0; ha->hdr[i].start_sec = 0; @@ -685,6 +791,13 @@ 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) @@ -699,6 +812,64 @@ 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) { @@ -805,14 +976,11 @@ 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) { - 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); - } + 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); @@ -829,14 +997,11 @@ 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) { - 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); - } + 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 a679eeb68..295e825e2 100644 --- a/drivers/scsi/gdth_proc.h +++ b/drivers/scsi/gdth_proc.h @@ -5,16 +5,20 @@ * $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); -static int gdth_set_asc_info(struct Scsi_Host *host, char *buffer, - int length, int hanum); +#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 char *gdth_ioctl_alloc(int hanum, int size, int scratch, ulong64 *paddr); @@ -24,5 +28,7 @@ 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 a0d831b1b..5b1544980 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, IRQF_SHARED, "GVP11 SCSI", + request_irq(IRQ_AMIGA_PORTS, gvp11_intr, SA_SHIRQ, "GVP11 SCSI", instance); DMA(instance)->CNTR = GVP11_DMAC_INT_ENABLE; num_gvp11++; diff --git a/drivers/scsi/hosts.c b/drivers/scsi/hosts.c index dfcb96f3e..588107923 100644 --- a/drivers/scsi/hosts.c +++ b/drivers/scsi/hosts.c @@ -294,9 +294,22 @@ struct Scsi_Host *scsi_host_alloc(struct scsi_host_template *sht, int privsize) if (sht->unchecked_isa_dma && privsize) gfp_mask |= __GFP_DMA; - shost = kzalloc(sizeof(struct Scsi_Host) + privsize, gfp_mask); + /* Check to see if this host has any error handling facilities */ + if (!sht->eh_strategy_handler && !sht->eh_abort_handler && + !sht->eh_device_reset_handler && !sht->eh_bus_reset_handler && + !sht->eh_host_reset_handler) { + printk(KERN_ERR "ERROR: SCSI host `%s' has no error handling\n" + "ERROR: This is not a safe way to run your " + "SCSI host\n" + "ERROR: The error handling must be added to " + "this driver\n", sht->proc_name); + dump_stack(); + } + + shost = kmalloc(sizeof(struct Scsi_Host) + privsize, gfp_mask); if (!shost) return NULL; + memset(shost, 0, sizeof(struct Scsi_Host) + privsize); spin_lock_init(&shost->default_lock); scsi_assign_lock(shost, &shost->default_lock); diff --git a/drivers/scsi/hptiop.c b/drivers/scsi/hptiop.c index 28bfb8f9f..9a3dae1dc 100644 --- a/drivers/scsi/hptiop.c +++ b/drivers/scsi/hptiop.c @@ -15,6 +15,7 @@ * * For more information, visit http://www.highpoint-tech.com */ +#include #include #include #include @@ -772,7 +773,7 @@ static int __devinit hptiop_probe(struct pci_dev *pcidev, pci_set_drvdata(pcidev, host); - if (request_irq(pcidev->irq, hptiop_intr, IRQF_SHARED, + if (request_irq(pcidev->irq, hptiop_intr, SA_SHIRQ, driver_name, hba)) { printk(KERN_ERR "scsi%d: request irq %d failed\n", hba->host->host_no, pcidev->irq); diff --git a/drivers/scsi/ibmmca.c b/drivers/scsi/ibmmca.c index 2be1dc5d8..b60c1b927 100644 --- a/drivers/scsi/ibmmca.c +++ b/drivers/scsi/ibmmca.c @@ -17,6 +17,7 @@ */ +#include #include #include #include @@ -759,7 +760,7 @@ static int device_inquiry(int host_index, int ldn) while (!got_interrupt(host_index)) barrier(); - /*if command successful, break */ + /*if command succesful, break */ if ((stat_result(host_index) == IM_SCB_CMD_COMPLETED) || (stat_result(host_index) == IM_SCB_CMD_COMPLETED_WITH_RETRIES)) return 1; } @@ -884,7 +885,7 @@ static int immediate_assign(int host_index, unsigned int pun, unsigned int lun, while (!got_interrupt(host_index)) barrier(); - /*if command successful, break */ + /*if command succesful, break */ if (stat_result(host_index) == IM_IMMEDIATE_CMD_COMPLETED) return 1; } @@ -920,7 +921,7 @@ static int immediate_feature(int host_index, unsigned int speed, unsigned int ti return 2; } else global_command_error_excuse = 0; - /*if command successful, break */ + /*if command succesful, break */ if (stat_result(host_index) == IM_IMMEDIATE_CMD_COMPLETED) return 1; } @@ -958,7 +959,7 @@ static int immediate_reset(int host_index, unsigned int ldn) /* did not work, finish */ return 1; } - /*if command successful, break */ + /*if command succesful, break */ if (stat_result(host_index) == IM_IMMEDIATE_CMD_COMPLETED) return 1; } @@ -1440,7 +1441,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 */ @@ -1455,7 +1456,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 < ARRAY_SIZE(subsys_list))) { + } else if ((speciale >= 0) && (speciale < (sizeof(subsys_list) / sizeof(struct subsys_list_struct)))) { /* if the subsystem is a slot adapter */ len += sprintf(buf + len, "Adapter category: slot-card\n" "ROM Segment Address: "); if ((pos[2] & 0xf0) == 0xf0) @@ -1476,16 +1477,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, slot; + int port, id, i, j, k, list_size, slot; int devices_on_irq_11 = 0; int devices_on_irq_14 = 0; int IRQ14_registered = 0; @@ -1510,7 +1511,7 @@ int ibmmca_detect(struct scsi_host_template * scsi_template) #endif /* get interrupt request level */ - if (request_irq(IM_IRQ, interrupt_handler, IRQF_SHARED, "ibmmcascsi", hosts)) { + if (request_irq(IM_IRQ, interrupt_handler, SA_SHIRQ, "ibmmcascsi", hosts)) { printk(KERN_ERR "IBM MCA SCSI: Unable to get shared IRQ %d.\n", IM_IRQ); return 0; } else @@ -1602,7 +1603,8 @@ 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. */ - for (i = 0; i < ARRAY_SIZE(subsys_list); i++) { + list_size = sizeof(subsys_list) / sizeof(struct subsys_list_struct); + for (i = 0; i < list_size; 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)) @@ -1635,7 +1637,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, IRQF_SHARED, "ibmmcascsi", hosts)) { + if (request_irq(IM_IRQ_FW, interrupt_handler, SA_SHIRQ, "ibmmcascsi", hosts)) { printk(KERN_ERR "IBM MCA SCSI: Unable to get shared IRQ %d.\n", IM_IRQ_FW); } else IRQ11_registered++; @@ -1667,7 +1669,8 @@ 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. */ - for (i = 0; i < ARRAY_SIZE(subsys_list); i++) { + list_size = sizeof(subsys_list) / sizeof(struct subsys_list_struct); + for (i = 0; i < list_size; 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 */ @@ -1696,7 +1699,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, IRQF_SHARED, "ibmmcascsi", hosts)) + if (request_irq(IM_IRQ_FW, interrupt_handler, SA_SHIRQ, "ibmmcascsi", hosts)) printk(KERN_ERR "IBM MCA SCSI: Unable to get shared IRQ %d.\n", IM_IRQ_FW); else IRQ11_registered++; @@ -2240,7 +2243,8 @@ static int __ibmmca_host_reset(Scsi_Cmnd * cmd) int host_index; unsigned long imm_command; - BUG_ON(cmd == NULL); + if (cmd == NULL) + BUG(); ticks = IM_RESET_DELAY * HZ; shpnt = cmd->device->host; @@ -2408,7 +2412,8 @@ static int ibmmca_proc_info(struct Scsi_Host *shpnt, char *buffer, char **start, spin_lock_irqsave(hosts[i]->host_lock, flags); /* Check it */ host_index = i; if (!shpnt) { - len += sprintf(buffer + len, "\nIBM MCA SCSI: Can't find adapter"); + len += sprintf(buffer + len, "\nIBM MCA SCSI: Can't find adapter for host number %d\n", + shpnt->host_no); return len; } max_pun = subsystem_maxid(host_index); @@ -2484,7 +2489,7 @@ static int option_setup(char *str) } ints[0] = i - 1; internal_ibmmca_scsi_setup(cur, ints); - return 1; + return 0; } __setup("ibmmcascsi=", option_setup); diff --git a/drivers/scsi/ibmvscsi/ibmvscsi.c b/drivers/scsi/ibmvscsi/ibmvscsi.c index 669ea4fff..eaefeddb2 100644 --- a/drivers/scsi/ibmvscsi/ibmvscsi.c +++ b/drivers/scsi/ibmvscsi/ibmvscsi.c @@ -121,9 +121,10 @@ static int initialize_event_pool(struct event_pool *pool, pool->size = size; pool->next = 0; - pool->events = kcalloc(pool->size, sizeof(*pool->events), GFP_KERNEL); + pool->events = kmalloc(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, @@ -167,7 +168,7 @@ static void release_event_pool(struct event_pool *pool, ++in_use; if (pool->events[i].ext_list) { dma_free_coherent(hostdata->dev, - SG_ALL * sizeof(struct srp_direct_buf), + SG_ALL * sizeof(struct memory_descriptor), pool->events[i].ext_list, pool->events[i].ext_list_token); } @@ -283,37 +284,40 @@ static void set_srp_direction(struct scsi_cmnd *cmd, struct srp_cmd *srp_cmd, int numbuf) { - u8 fmt; - if (numbuf == 0) return; - if (numbuf == 1) - fmt = SRP_DATA_DESC_DIRECT; - else { - fmt = SRP_DATA_DESC_INDIRECT; - numbuf = min(numbuf, MAX_INDIRECT_BUFS); - + if (numbuf == 1) { if (cmd->sc_data_direction == DMA_TO_DEVICE) - srp_cmd->data_out_desc_cnt = numbuf; - else - srp_cmd->data_in_desc_cnt = numbuf; + srp_cmd->data_out_format = SRP_DIRECT_BUFFER; + else + srp_cmd->data_in_format = SRP_DIRECT_BUFFER; + } else { + if (cmd->sc_data_direction == DMA_TO_DEVICE) { + srp_cmd->data_out_format = SRP_INDIRECT_BUFFER; + srp_cmd->data_out_count = + numbuf < MAX_INDIRECT_BUFS ? + numbuf: MAX_INDIRECT_BUFS; + } else { + srp_cmd->data_in_format = SRP_INDIRECT_BUFFER; + srp_cmd->data_in_count = + numbuf < MAX_INDIRECT_BUFS ? + numbuf: MAX_INDIRECT_BUFS; + } } - - if (cmd->sc_data_direction == DMA_TO_DEVICE) - srp_cmd->buf_fmt = fmt << 4; - else - srp_cmd->buf_fmt = fmt; } -static void unmap_sg_list(int num_entries, +static void unmap_sg_list(int num_entries, struct device *dev, - struct srp_direct_buf *md) -{ + struct memory_descriptor *md) +{ int i; - for (i = 0; i < num_entries; ++i) - dma_unmap_single(dev, md[i].va, md[i].len, DMA_BIDIRECTIONAL); + for (i = 0; i < num_entries; ++i) { + dma_unmap_single(dev, + md[i].virtual_address, + md[i].length, DMA_BIDIRECTIONAL); + } } /** @@ -326,26 +330,23 @@ static void unmap_cmd_data(struct srp_cmd *cmd, struct srp_event_struct *evt_struct, struct device *dev) { - u8 out_fmt, in_fmt; - - out_fmt = cmd->buf_fmt >> 4; - in_fmt = cmd->buf_fmt & ((1U << 4) - 1); - - if (out_fmt == SRP_NO_DATA_DESC && in_fmt == SRP_NO_DATA_DESC) + if ((cmd->data_out_format == SRP_NO_BUFFER) && + (cmd->data_in_format == SRP_NO_BUFFER)) return; - else if (out_fmt == SRP_DATA_DESC_DIRECT || - in_fmt == SRP_DATA_DESC_DIRECT) { - struct srp_direct_buf *data = - (struct srp_direct_buf *) cmd->add_data; - dma_unmap_single(dev, data->va, data->len, DMA_BIDIRECTIONAL); + else if ((cmd->data_out_format == SRP_DIRECT_BUFFER) || + (cmd->data_in_format == SRP_DIRECT_BUFFER)) { + struct memory_descriptor *data = + (struct memory_descriptor *)cmd->additional_data; + dma_unmap_single(dev, data->virtual_address, data->length, + DMA_BIDIRECTIONAL); } else { - struct srp_indirect_buf *indirect = - (struct srp_indirect_buf *) cmd->add_data; - int num_mapped = indirect->table_desc.len / - sizeof(struct srp_direct_buf); + struct indirect_descriptor *indirect = + (struct indirect_descriptor *)cmd->additional_data; + int num_mapped = indirect->head.length / + sizeof(indirect->list[0]); if (num_mapped <= MAX_INDIRECT_BUFS) { - unmap_sg_list(num_mapped, dev, &indirect->desc_list[0]); + unmap_sg_list(num_mapped, dev, &indirect->list[0]); return; } @@ -355,17 +356,17 @@ static void unmap_cmd_data(struct srp_cmd *cmd, static int map_sg_list(int num_entries, struct scatterlist *sg, - struct srp_direct_buf *md) + struct memory_descriptor *md) { int i; u64 total_length = 0; for (i = 0; i < num_entries; ++i) { - struct srp_direct_buf *descr = md + i; + struct memory_descriptor *descr = md + i; struct scatterlist *sg_entry = &sg[i]; - descr->va = sg_dma_address(sg_entry); - descr->len = sg_dma_len(sg_entry); - descr->key = 0; + descr->virtual_address = sg_dma_address(sg_entry); + descr->length = sg_dma_len(sg_entry); + descr->memory_handle = 0; total_length += sg_dma_len(sg_entry); } return total_length; @@ -388,10 +389,10 @@ static int map_sg_data(struct scsi_cmnd *cmd, int sg_mapped; u64 total_length = 0; struct scatterlist *sg = cmd->request_buffer; - struct srp_direct_buf *data = - (struct srp_direct_buf *) srp_cmd->add_data; - struct srp_indirect_buf *indirect = - (struct srp_indirect_buf *) data; + struct memory_descriptor *data = + (struct memory_descriptor *)srp_cmd->additional_data; + struct indirect_descriptor *indirect = + (struct indirect_descriptor *)data; sg_mapped = dma_map_sg(dev, sg, cmd->use_sg, DMA_BIDIRECTIONAL); @@ -402,9 +403,9 @@ static int map_sg_data(struct scsi_cmnd *cmd, /* special case; we can use a single direct descriptor */ if (sg_mapped == 1) { - data->va = sg_dma_address(&sg[0]); - data->len = sg_dma_len(&sg[0]); - data->key = 0; + data->virtual_address = sg_dma_address(&sg[0]); + data->length = sg_dma_len(&sg[0]); + data->memory_handle = 0; return 1; } @@ -415,26 +416,25 @@ static int map_sg_data(struct scsi_cmnd *cmd, return 0; } - indirect->table_desc.va = 0; - indirect->table_desc.len = sg_mapped * sizeof(struct srp_direct_buf); - indirect->table_desc.key = 0; + indirect->head.virtual_address = 0; + indirect->head.length = sg_mapped * sizeof(indirect->list[0]); + indirect->head.memory_handle = 0; if (sg_mapped <= MAX_INDIRECT_BUFS) { - total_length = map_sg_list(sg_mapped, sg, - &indirect->desc_list[0]); - indirect->len = total_length; + total_length = map_sg_list(sg_mapped, sg, &indirect->list[0]); + indirect->total_length = total_length; return 1; } /* get indirect table */ if (!evt_struct->ext_list) { - evt_struct->ext_list = (struct srp_direct_buf *) + evt_struct->ext_list =(struct memory_descriptor*) dma_alloc_coherent(dev, - SG_ALL * sizeof(struct srp_direct_buf), - &evt_struct->ext_list_token, 0); + SG_ALL * sizeof(struct memory_descriptor), + &evt_struct->ext_list_token, 0); if (!evt_struct->ext_list) { - printk(KERN_ERR - "ibmvscsi: Can't allocate memory for indirect table\n"); + printk(KERN_ERR + "ibmvscsi: Can't allocate memory for indirect table\n"); return 0; } @@ -442,11 +442,11 @@ static int map_sg_data(struct scsi_cmnd *cmd, total_length = map_sg_list(sg_mapped, sg, evt_struct->ext_list); - indirect->len = total_length; - indirect->table_desc.va = evt_struct->ext_list_token; - indirect->table_desc.len = sg_mapped * sizeof(indirect->desc_list[0]); - memcpy(indirect->desc_list, evt_struct->ext_list, - MAX_INDIRECT_BUFS * sizeof(struct srp_direct_buf)); + indirect->total_length = total_length; + indirect->head.virtual_address = evt_struct->ext_list_token; + indirect->head.length = sg_mapped * sizeof(indirect->list[0]); + memcpy(indirect->list, evt_struct->ext_list, + MAX_INDIRECT_BUFS * sizeof(struct memory_descriptor)); return 1; } @@ -463,20 +463,20 @@ static int map_sg_data(struct scsi_cmnd *cmd, static int map_single_data(struct scsi_cmnd *cmd, struct srp_cmd *srp_cmd, struct device *dev) { - struct srp_direct_buf *data = - (struct srp_direct_buf *) srp_cmd->add_data; + struct memory_descriptor *data = + (struct memory_descriptor *)srp_cmd->additional_data; - data->va = + data->virtual_address = dma_map_single(dev, cmd->request_buffer, cmd->request_bufflen, DMA_BIDIRECTIONAL); - if (dma_mapping_error(data->va)) { + if (dma_mapping_error(data->virtual_address)) { printk(KERN_ERR "ibmvscsi: Unable to map request_buffer for command!\n"); return 0; } - data->len = cmd->request_bufflen; - data->key = 0; + data->length = cmd->request_bufflen; + data->memory_handle = 0; set_srp_direction(cmd, srp_cmd, 1); @@ -535,7 +535,6 @@ 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,22 +542,13 @@ 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) { - 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; - } + if ((evt_struct->crq.format == VIOSRP_SRP_FORMAT) && + (atomic_dec_if_positive(&hostdata->request_limit) < 0)) + goto send_error; /* Copy the IU into the transfer area */ *evt_struct->xfer_iu = evt_struct->iu; - evt_struct->xfer_iu->srp.rsp.tag = (u64)evt_struct; + evt_struct->xfer_iu->srp.generic.tag = (u64)evt_struct; /* Add this to the sent list. We need to do this * before we actually send @@ -577,23 +567,11 @@ static int ibmvscsi_send_srp_event(struct srp_event_struct *evt_struct, return 0; - 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; + return SCSI_MLQUEUE_HOST_BUSY; } /** @@ -608,27 +586,27 @@ static void handle_cmd_rsp(struct srp_event_struct *evt_struct) struct srp_rsp *rsp = &evt_struct->xfer_iu->srp.rsp; struct scsi_cmnd *cmnd = evt_struct->cmnd; - if (unlikely(rsp->opcode != SRP_RSP)) { + if (unlikely(rsp->type != SRP_RSP_TYPE)) { if (printk_ratelimit()) printk(KERN_WARNING "ibmvscsi: bad SRP RSP type %d\n", - rsp->opcode); + rsp->type); } if (cmnd) { cmnd->result = rsp->status; if (((cmnd->result >> 1) & 0x1f) == CHECK_CONDITION) memcpy(cmnd->sense_buffer, - rsp->data, - rsp->sense_data_len); + rsp->sense_and_response_data, + rsp->sense_data_list_length); unmap_cmd_data(&evt_struct->iu.srp.cmd, evt_struct, evt_struct->hostdata->dev); - if (rsp->flags & SRP_RSP_FLAG_DOOVER) - cmnd->resid = rsp->data_out_res_cnt; - else if (rsp->flags & SRP_RSP_FLAG_DIOVER) - cmnd->resid = rsp->data_in_res_cnt; + if (rsp->doover) + cmnd->resid = rsp->data_out_residual_count; + else if (rsp->diover) + cmnd->resid = rsp->data_in_residual_count; } if (evt_struct->cmnd_done) @@ -655,11 +633,10 @@ static int ibmvscsi_queuecommand(struct scsi_cmnd *cmnd, { struct srp_cmd *srp_cmd; struct srp_event_struct *evt_struct; - struct srp_indirect_buf *indirect; + struct indirect_descriptor *indirect; struct ibmvscsi_host_data *hostdata = (struct ibmvscsi_host_data *)&cmnd->device->host->hostdata; u16 lun = lun_from_dev(cmnd->device); - u8 out_fmt, in_fmt; evt_struct = get_event_struct(&hostdata->pool); if (!evt_struct) @@ -667,8 +644,8 @@ static int ibmvscsi_queuecommand(struct scsi_cmnd *cmnd, /* Set up the actual SRP IU */ srp_cmd = &evt_struct->iu.srp.cmd; - memset(srp_cmd, 0x00, SRP_MAX_IU_LEN); - srp_cmd->opcode = SRP_CMD; + memset(srp_cmd, 0x00, sizeof(*srp_cmd)); + srp_cmd->type = SRP_CMD_TYPE; memcpy(srp_cmd->cdb, cmnd->cmnd, sizeof(cmnd->cmnd)); srp_cmd->lun = ((u64) lun) << 48; @@ -687,15 +664,13 @@ static int ibmvscsi_queuecommand(struct scsi_cmnd *cmnd, evt_struct->cmnd_done = done; /* Fix up dma address of the buffer itself */ - indirect = (struct srp_indirect_buf *) srp_cmd->add_data; - out_fmt = srp_cmd->buf_fmt >> 4; - in_fmt = srp_cmd->buf_fmt & ((1U << 4) - 1); - if ((in_fmt == SRP_DATA_DESC_INDIRECT || - out_fmt == SRP_DATA_DESC_INDIRECT) && - indirect->table_desc.va == 0) { - indirect->table_desc.va = evt_struct->crq.IU_data_ptr + - offsetof(struct srp_cmd, add_data) + - offsetof(struct srp_indirect_buf, desc_list); + indirect = (struct indirect_descriptor *)srp_cmd->additional_data; + if (((srp_cmd->data_out_format == SRP_INDIRECT_BUFFER) || + (srp_cmd->data_in_format == SRP_INDIRECT_BUFFER)) && + (indirect->head.virtual_address == 0)) { + indirect->head.virtual_address = evt_struct->crq.IU_data_ptr + + offsetof(struct srp_cmd, additional_data) + + offsetof(struct indirect_descriptor, list); } return ibmvscsi_send_srp_event(evt_struct, hostdata); @@ -760,8 +735,7 @@ static void send_mad_adapter_info(struct ibmvscsi_host_data *hostdata) { struct viosrp_adapter_info *req; struct srp_event_struct *evt_struct; - dma_addr_t addr; - + evt_struct = get_event_struct(&hostdata->pool); if (!evt_struct) { printk(KERN_ERR "ibmvscsi: couldn't allocate an event " @@ -779,10 +753,10 @@ static void send_mad_adapter_info(struct ibmvscsi_host_data *hostdata) req->common.type = VIOSRP_ADAPTER_INFO_TYPE; req->common.length = sizeof(hostdata->madapter_info); - req->buffer = addr = dma_map_single(hostdata->dev, - &hostdata->madapter_info, - sizeof(hostdata->madapter_info), - DMA_BIDIRECTIONAL); + req->buffer = dma_map_single(hostdata->dev, + &hostdata->madapter_info, + sizeof(hostdata->madapter_info), + DMA_BIDIRECTIONAL); if (dma_mapping_error(req->buffer)) { printk(KERN_ERR @@ -792,13 +766,8 @@ static void send_mad_adapter_info(struct ibmvscsi_host_data *hostdata) return; } - if (ibmvscsi_send_srp_event(evt_struct, hostdata)) { + if (ibmvscsi_send_srp_event(evt_struct, hostdata)) printk(KERN_ERR "ibmvscsi: couldn't send ADAPTER_INFO_REQ!\n"); - dma_unmap_single(hostdata->dev, - addr, - sizeof(hostdata->madapter_info), - DMA_BIDIRECTIONAL); - } }; /** @@ -811,10 +780,10 @@ static void send_mad_adapter_info(struct ibmvscsi_host_data *hostdata) static void login_rsp(struct srp_event_struct *evt_struct) { struct ibmvscsi_host_data *hostdata = evt_struct->hostdata; - switch (evt_struct->xfer_iu->srp.login_rsp.opcode) { - case SRP_LOGIN_RSP: /* it worked! */ + switch (evt_struct->xfer_iu->srp.generic.type) { + case SRP_LOGIN_RSP_TYPE: /* it worked! */ break; - case SRP_LOGIN_REJ: /* refused! */ + case SRP_LOGIN_REJ_TYPE: /* refused! */ printk(KERN_INFO "ibmvscsi: SRP_LOGIN_REJ reason %u\n", evt_struct->xfer_iu->srp.login_rej.reason); /* Login failed. */ @@ -823,7 +792,7 @@ static void login_rsp(struct srp_event_struct *evt_struct) default: printk(KERN_ERR "ibmvscsi: Invalid login response typecode 0x%02x!\n", - evt_struct->xfer_iu->srp.login_rsp.opcode); + evt_struct->xfer_iu->srp.generic.type); /* Login failed. */ atomic_set(&hostdata->request_limit, -1); return; @@ -831,17 +800,17 @@ static void login_rsp(struct srp_event_struct *evt_struct) printk(KERN_INFO "ibmvscsi: SRP_LOGIN succeeded\n"); - if (evt_struct->xfer_iu->srp.login_rsp.req_lim_delta > + if (evt_struct->xfer_iu->srp.login_rsp.request_limit_delta > (max_requests - 2)) - evt_struct->xfer_iu->srp.login_rsp.req_lim_delta = + evt_struct->xfer_iu->srp.login_rsp.request_limit_delta = max_requests - 2; /* Now we know what the real request-limit is */ atomic_set(&hostdata->request_limit, - evt_struct->xfer_iu->srp.login_rsp.req_lim_delta); + evt_struct->xfer_iu->srp.login_rsp.request_limit_delta); hostdata->host->can_queue = - evt_struct->xfer_iu->srp.login_rsp.req_lim_delta - 2; + evt_struct->xfer_iu->srp.login_rsp.request_limit_delta - 2; if (hostdata->host->can_queue < 1) { printk(KERN_ERR "ibmvscsi: Invalid request_limit_delta\n"); @@ -880,19 +849,18 @@ static int send_srp_login(struct ibmvscsi_host_data *hostdata) login = &evt_struct->iu.srp.login_req; memset(login, 0x00, sizeof(struct srp_login_req)); - login->opcode = SRP_LOGIN_REQ; - login->req_it_iu_len = sizeof(union srp_iu); - login->req_buf_fmt = SRP_BUF_FORMAT_DIRECT | SRP_BUF_FORMAT_INDIRECT; + login->type = SRP_LOGIN_REQ_TYPE; + login->max_requested_initiator_to_target_iulen = sizeof(union srp_iu); + login->required_buffer_formats = 0x0006; - spin_lock_irqsave(hostdata->host->host_lock, flags); /* Start out with a request limit of 1, since this is negotiated in * the login request we are just sending */ atomic_set(&hostdata->request_limit, 1); + spin_lock_irqsave(hostdata->host->host_lock, flags); rc = ibmvscsi_send_srp_event(evt_struct, hostdata); spin_unlock_irqrestore(hostdata->host->host_lock, flags); - printk("ibmvscsic: sent SRP login\n"); return rc; }; @@ -960,13 +928,13 @@ static int ibmvscsi_eh_abort_handler(struct scsi_cmnd *cmd) /* Set up an abort SRP command */ memset(tsk_mgmt, 0x00, sizeof(*tsk_mgmt)); - tsk_mgmt->opcode = SRP_TSK_MGMT; + tsk_mgmt->type = SRP_TSK_MGMT_TYPE; tsk_mgmt->lun = ((u64) lun) << 48; - tsk_mgmt->tsk_mgmt_func = SRP_TSK_ABORT_TASK; - tsk_mgmt->task_tag = (u64) found_evt; + tsk_mgmt->task_mgmt_flags = 0x01; /* ABORT TASK */ + tsk_mgmt->managed_task_tag = (u64) found_evt; printk(KERN_INFO "ibmvscsi: aborting command. lun 0x%lx, tag 0x%lx\n", - tsk_mgmt->lun, tsk_mgmt->task_tag); + tsk_mgmt->lun, tsk_mgmt->managed_task_tag); evt->sync_srp = &srp_rsp; init_completion(&evt->comp); @@ -980,25 +948,25 @@ static int ibmvscsi_eh_abort_handler(struct scsi_cmnd *cmd) wait_for_completion(&evt->comp); /* make sure we got a good response */ - if (unlikely(srp_rsp.srp.rsp.opcode != SRP_RSP)) { + if (unlikely(srp_rsp.srp.generic.type != SRP_RSP_TYPE)) { if (printk_ratelimit()) printk(KERN_WARNING "ibmvscsi: abort bad SRP RSP type %d\n", - srp_rsp.srp.rsp.opcode); + srp_rsp.srp.generic.type); return FAILED; } - if (srp_rsp.srp.rsp.flags & SRP_RSP_FLAG_RSPVALID) - rsp_rc = *((int *)srp_rsp.srp.rsp.data); + if (srp_rsp.srp.rsp.rspvalid) + rsp_rc = *((int *)srp_rsp.srp.rsp.sense_and_response_data); else rsp_rc = srp_rsp.srp.rsp.status; if (rsp_rc) { if (printk_ratelimit()) printk(KERN_WARNING - "ibmvscsi: abort code %d for task tag 0x%lx\n", + "ibmvscsi: abort code %d for task tag 0x%lx\n", rsp_rc, - tsk_mgmt->task_tag); + tsk_mgmt->managed_task_tag); return FAILED; } @@ -1019,13 +987,13 @@ static int ibmvscsi_eh_abort_handler(struct scsi_cmnd *cmd) spin_unlock_irqrestore(hostdata->host->host_lock, flags); printk(KERN_INFO "ibmvscsi: aborted task tag 0x%lx completed\n", - tsk_mgmt->task_tag); + tsk_mgmt->managed_task_tag); return SUCCESS; } printk(KERN_INFO "ibmvscsi: successfully aborted task tag 0x%lx\n", - tsk_mgmt->task_tag); + tsk_mgmt->managed_task_tag); cmd->result = (DID_ABORT << 16); list_del(&found_evt->list); @@ -1072,9 +1040,9 @@ static int ibmvscsi_eh_device_reset_handler(struct scsi_cmnd *cmd) /* Set up a lun reset SRP command */ memset(tsk_mgmt, 0x00, sizeof(*tsk_mgmt)); - tsk_mgmt->opcode = SRP_TSK_MGMT; + tsk_mgmt->type = SRP_TSK_MGMT_TYPE; tsk_mgmt->lun = ((u64) lun) << 48; - tsk_mgmt->tsk_mgmt_func = SRP_TSK_LUN_RESET; + tsk_mgmt->task_mgmt_flags = 0x08; /* LUN RESET */ printk(KERN_INFO "ibmvscsi: resetting device. lun 0x%lx\n", tsk_mgmt->lun); @@ -1091,16 +1059,16 @@ static int ibmvscsi_eh_device_reset_handler(struct scsi_cmnd *cmd) wait_for_completion(&evt->comp); /* make sure we got a good response */ - if (unlikely(srp_rsp.srp.rsp.opcode != SRP_RSP)) { + if (unlikely(srp_rsp.srp.generic.type != SRP_RSP_TYPE)) { if (printk_ratelimit()) printk(KERN_WARNING "ibmvscsi: reset bad SRP RSP type %d\n", - srp_rsp.srp.rsp.opcode); + srp_rsp.srp.generic.type); return FAILED; } - if (srp_rsp.srp.rsp.flags & SRP_RSP_FLAG_RSPVALID) - rsp_rc = *((int *)srp_rsp.srp.rsp.data); + if (srp_rsp.srp.rsp.rspvalid) + rsp_rc = *((int *)srp_rsp.srp.rsp.sense_and_response_data); else rsp_rc = srp_rsp.srp.rsp.status; @@ -1108,7 +1076,8 @@ static int ibmvscsi_eh_device_reset_handler(struct scsi_cmnd *cmd) if (printk_ratelimit()) printk(KERN_WARNING "ibmvscsi: reset code %d for task tag 0x%lx\n", - rsp_rc, tsk_mgmt->task_tag); + rsp_rc, + tsk_mgmt->managed_task_tag); return FAILED; } @@ -1206,37 +1175,26 @@ 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"); purge_requests(hostdata, DID_REQUEUE); - if ((ibmvscsi_reenable_crq_queue(&hostdata->queue, - hostdata) == 0) || - (ibmvscsi_send_crq(hostdata, - 0xC001000000000000LL, 0))) { - atomic_set(&hostdata->request_limit, - -1); + if (ibmvscsi_reenable_crq_queue(&hostdata->queue, + hostdata) == 0) + if (ibmvscsi_send_crq(hostdata, + 0xC001000000000000LL, 0)) printk(KERN_ERR - "ibmvscsi: error after" + "ibmvscsi: transmit 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); - 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"); - } + ibmvscsi_reset_crq_queue(&hostdata->queue, hostdata); } scsi_unblock_requests(hostdata->host); return; @@ -1268,7 +1226,7 @@ void ibmvscsi_handle_crq(struct viosrp_crq *crq, } if (crq->format == VIOSRP_SRP_FORMAT) - atomic_add(evt_struct->xfer_iu->srp.rsp.req_lim_delta, + atomic_add(evt_struct->xfer_iu->srp.rsp.request_limit_delta, &hostdata->request_limit); if (evt_struct->done) @@ -1296,7 +1254,6 @@ static int ibmvscsi_do_host_config(struct ibmvscsi_host_data *hostdata, { struct viosrp_host_config *host_config; struct srp_event_struct *evt_struct; - dma_addr_t addr; int rc; evt_struct = get_event_struct(&hostdata->pool); @@ -1317,9 +1274,8 @@ static int ibmvscsi_do_host_config(struct ibmvscsi_host_data *hostdata, memset(host_config, 0x00, sizeof(*host_config)); host_config->common.type = VIOSRP_HOST_CONFIG_TYPE; host_config->common.length = length; - host_config->buffer = addr = dma_map_single(hostdata->dev, buffer, - length, - DMA_BIDIRECTIONAL); + host_config->buffer = dma_map_single(hostdata->dev, buffer, length, + DMA_BIDIRECTIONAL); if (dma_mapping_error(host_config->buffer)) { printk(KERN_ERR @@ -1330,9 +1286,11 @@ static int ibmvscsi_do_host_config(struct ibmvscsi_host_data *hostdata, init_completion(&evt_struct->comp); rc = ibmvscsi_send_srp_event(evt_struct, hostdata); - if (rc == 0) + if (rc == 0) { wait_for_completion(&evt_struct->comp); - dma_unmap_single(hostdata->dev, addr, length, DMA_BIDIRECTIONAL); + dma_unmap_single(hostdata->dev, host_config->buffer, + length, DMA_BIDIRECTIONAL); + } return rc; } @@ -1499,7 +1457,6 @@ 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; @@ -1517,8 +1474,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 */ - rc = ibmvscsi_init_crq_queue(&hostdata->queue, hostdata, max_requests); - if (rc != 0 && rc != H_RESOURCE) { + if (ibmvscsi_init_crq_queue(&hostdata->queue, hostdata, + max_requests) != 0) { printk(KERN_ERR "ibmvscsi: couldn't initialize crq\n"); goto init_crq_failed; } @@ -1538,8 +1495,7 @@ 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 - || rc == H_RESOURCE) { + if (ibmvscsi_send_crq(hostdata, 0xC001000000000000LL, 0) == 0) { /* * 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/ibmvscsi.h b/drivers/scsi/ibmvscsi/ibmvscsi.h index 5c6d93582..4550d71e4 100644 --- a/drivers/scsi/ibmvscsi/ibmvscsi.h +++ b/drivers/scsi/ibmvscsi/ibmvscsi.h @@ -68,7 +68,7 @@ struct srp_event_struct { void (*cmnd_done) (struct scsi_cmnd *); struct completion comp; union viosrp_iu *sync_srp; - struct srp_direct_buf *ext_list; + struct memory_descriptor *ext_list; dma_addr_t ext_list_token; }; diff --git a/drivers/scsi/ibmvscsi/iseries_vscsi.c b/drivers/scsi/ibmvscsi/iseries_vscsi.c index 6aeb5f003..7eed0b098 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, max_requests); + rc = viopath_open(viopath_hostLp, viomajorsubtype_scsi, 0); 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 ed22b9658..f47dd87c0 100644 --- a/drivers/scsi/ibmvscsi/rpa_vscsi.c +++ b/drivers/scsi/ibmvscsi/rpa_vscsi.c @@ -34,6 +34,7 @@ #include #include #include "ibmvscsi.h" +#include "srp.h" static char partition_name[97] = "UNKNOWN"; static unsigned int partition_number = -1; @@ -79,7 +80,7 @@ void ibmvscsi_release_crq_queue(struct crq_queue *queue, tasklet_kill(&hostdata->srp_task); do { rc = plpar_hcall_norets(H_FREE_CRQ, vdev->unit_address); - } while ((rc == H_BUSY) || (H_IS_LONG_BUSY(rc))); + } while ((rc == H_Busy) || (H_isLongBusy(rc))); dma_unmap_single(hostdata->dev, queue->msg_token, queue->size * sizeof(*queue->msgs), DMA_BIDIRECTIONAL); @@ -208,7 +209,6 @@ 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); @@ -227,10 +227,10 @@ int ibmvscsi_init_crq_queue(struct crq_queue *queue, gather_partition_info(); set_adapter_info(hostdata); - retrc = rc = plpar_hcall_norets(H_REG_CRQ, + rc = plpar_hcall_norets(H_REG_CRQ, vdev->unit_address, queue->msg_token, PAGE_SIZE); - if (rc == H_RESOURCE) + if (rc == H_Resource) /* maybe kexecing and resource is busy. try a reset */ rc = ibmvscsi_reset_crq_queue(queue, hostdata); @@ -238,7 +238,6 @@ 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; @@ -265,12 +264,12 @@ int ibmvscsi_init_crq_queue(struct crq_queue *queue, tasklet_init(&hostdata->srp_task, (void *)ibmvscsi_task, (unsigned long)hostdata); - return retrc; + return 0; req_irq_failed: do { rc = plpar_hcall_norets(H_FREE_CRQ, vdev->unit_address); - } while ((rc == H_BUSY) || (H_IS_LONG_BUSY(rc))); + } while ((rc == H_Busy) || (H_isLongBusy(rc))); reg_crq_failed: dma_unmap_single(hostdata->dev, queue->msg_token, @@ -296,7 +295,7 @@ int ibmvscsi_reenable_crq_queue(struct crq_queue *queue, /* Re-enable the CRQ */ do { rc = plpar_hcall_norets(H_ENABLE_CRQ, vdev->unit_address); - } while ((rc == H_IN_PROGRESS) || (rc == H_BUSY) || (H_IS_LONG_BUSY(rc))); + } while ((rc == H_InProgress) || (rc == H_Busy) || (H_isLongBusy(rc))); if (rc) printk(KERN_ERR "ibmvscsi: Error %d enabling adapter\n", rc); @@ -318,7 +317,7 @@ int ibmvscsi_reset_crq_queue(struct crq_queue *queue, /* Close the CRQ */ do { rc = plpar_hcall_norets(H_FREE_CRQ, vdev->unit_address); - } while ((rc == H_BUSY) || (H_IS_LONG_BUSY(rc))); + } while ((rc == H_Busy) || (H_isLongBusy(rc))); /* Clean out the queue */ memset(queue->msgs, 0x00, PAGE_SIZE); diff --git a/drivers/scsi/ibmvscsi/srp.h b/drivers/scsi/ibmvscsi/srp.h index e952c1cd9..7d8e4c4ac 100644 --- a/drivers/scsi/ibmvscsi/srp.h +++ b/drivers/scsi/ibmvscsi/srp.h @@ -28,12 +28,14 @@ #ifndef SRP_H #define SRP_H +#define SRP_VERSION "16.a" + #define PACKED __attribute__((packed)) enum srp_types { SRP_LOGIN_REQ_TYPE = 0x00, SRP_LOGIN_RSP_TYPE = 0xC0, - SRP_LOGIN_REJ_TYPE = 0x80, + SRP_LOGIN_REJ_TYPE = 0xC2, SRP_I_LOGOUT_TYPE = 0x03, SRP_T_LOGOUT_TYPE = 0x80, SRP_TSK_MGMT_TYPE = 0x01, diff --git a/drivers/scsi/ibmvscsi/viosrp.h b/drivers/scsi/ibmvscsi/viosrp.h index 90f1a6128..6a6bba8a2 100644 --- a/drivers/scsi/ibmvscsi/viosrp.h +++ b/drivers/scsi/ibmvscsi/viosrp.h @@ -33,22 +33,7 @@ /*****************************************************************************/ #ifndef VIOSRP_H #define VIOSRP_H -#include - -#define SRP_VERSION "16.a" -#define SRP_MAX_IU_LEN 256 - -union srp_iu { - struct srp_login_req login_req; - struct srp_login_rsp login_rsp; - struct srp_login_rej login_rej; - struct srp_i_logout i_logout; - struct srp_t_logout t_logout; - struct srp_tsk_mgmt tsk_mgmt; - struct srp_cmd cmd; - struct srp_rsp rsp; - u8 reserved[SRP_MAX_IU_LEN]; -}; +#include "srp.h" enum viosrp_crq_formats { VIOSRP_SRP_FORMAT = 0x01, diff --git a/drivers/scsi/ide-scsi.c b/drivers/scsi/ide-scsi.c index 94d1de556..0cf0e4c7a 100644 --- a/drivers/scsi/ide-scsi.c +++ b/drivers/scsi/ide-scsi.c @@ -34,6 +34,7 @@ #define IDESCSI_VERSION "0.92" #include +#include #include #include #include @@ -46,7 +47,6 @@ #include #include #include -#include #include #include @@ -109,7 +109,7 @@ typedef struct ide_scsi_obj { unsigned long log; /* log flags */ } idescsi_scsi_t; -static DEFINE_MUTEX(idescsi_ref_mutex); +static DECLARE_MUTEX(idescsi_ref_sem); #define ide_scsi_g(disk) \ container_of((disk)->private_data, struct ide_scsi_obj, driver) @@ -118,19 +118,19 @@ static struct ide_scsi_obj *ide_scsi_get(struct gendisk *disk) { struct ide_scsi_obj *scsi = NULL; - mutex_lock(&idescsi_ref_mutex); + down(&idescsi_ref_sem); scsi = ide_scsi_g(disk); if (scsi) scsi_host_get(scsi->host); - mutex_unlock(&idescsi_ref_mutex); + up(&idescsi_ref_sem); return scsi; } static void ide_scsi_put(struct ide_scsi_obj *scsi) { - mutex_lock(&idescsi_ref_mutex); + down(&idescsi_ref_sem); scsi_host_put(scsi->host); - mutex_unlock(&idescsi_ref_mutex); + up(&idescsi_ref_sem); } static inline idescsi_scsi_t *scsihost_to_idescsi(struct Scsi_Host *host) @@ -517,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_in_hardirq(); + local_irq_enable(); if (status.b.check) rq->errors++; idescsi_end_request (drive, 1, 0); @@ -599,7 +599,8 @@ static ide_startstop_t idescsi_transfer_pc(ide_drive_t *drive) "issuing a packet command\n"); return ide_do_reset (drive); } - BUG_ON(HWGROUP(drive)->handler != NULL); + if (HWGROUP(drive)->handler != NULL) + BUG(); /* Set the interrupt routine */ ide_set_handler(drive, &idescsi_pc_intr, get_timeout(pc), idescsi_expiry); /* Send the actual packet */ @@ -689,7 +690,8 @@ 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)) { - BUG_ON(HWGROUP(drive)->handler != NULL); + if (HWGROUP(drive)->handler != NULL) + BUG(); 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 2d95ac9c3..fc0f30ae0 100644 --- a/drivers/scsi/imm.c +++ b/drivers/scsi/imm.c @@ -3,11 +3,15 @@ * * (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 @@ -1115,10 +1119,6 @@ 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,6 +1141,10 @@ 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 8f6f32fc6..dc3aebf0e 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 + * (c) 1998 David Campbell campbell@torque.net * * Please note that I live in Perth, Western Australia. GMT+0800 */ @@ -66,6 +66,7 @@ */ /* ------ END OF USER CONFIGURABLE PARAMETERS ----- */ +#include #include #include #include diff --git a/drivers/scsi/in2000.c b/drivers/scsi/in2000.c index 59a4097f1..34daa3e06 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->request_buffer; + cmd->SCp.buffer = (struct scatterlist *) cmd->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 ARRAY_SIZE(setup_args) +#define MAX_SETUP_ARGS (sizeof(setup_args) / sizeof(char *)) #define SETUP_BUFFER_SIZE 200 static char setup_buffer[SETUP_BUFFER_SIZE]; static char setup_used[MAX_SETUP_ARGS]; @@ -1898,21 +1898,6 @@ static int int_tab[] in2000__INITDATA = { 10 }; -static int probe_bios(u32 addr, u32 *s1, uchar *switches) -{ - void __iomem *p = ioremap(addr, 0x34); - if (!p) - return 0; - *s1 = readl(p + 0x10); - if (*s1 == 0x41564f4e || readl(p + 0x30) == 0x61776c41) { - /* Read the switch image that's mapped into EPROM space */ - *switches = ~readb(p + 0x20); - iounmap(p); - return 1; - } - iounmap(p); - return 0; -} static int __init in2000_detect(struct scsi_host_template * tpnt) { @@ -1945,7 +1930,6 @@ static int __init in2000_detect(struct scsi_host_template * tpnt) detect_count = 0; for (bios = 0; bios_tab[bios]; bios++) { - u32 s1 = 0; if (check_setup_args("ioport", &val, buf)) { base = val; switches = ~inb(base + IO_SWITCHES) & 0xff; @@ -1957,9 +1941,13 @@ static int __init in2000_detect(struct scsi_host_template * tpnt) * for the obvious ID strings. We look for the 2 most common ones and * hope that they cover all the cases... */ - else if (probe_bios(bios_tab[bios], &s1, &switches)) { + else if (isa_readl(bios_tab[bios] + 0x10) == 0x41564f4e || isa_readl(bios_tab[bios] + 0x30) == 0x61776c41) { printk("Found IN2000 BIOS at 0x%x ", (unsigned int) bios_tab[bios]); +/* Read the switch image that's mapped into EPROM space */ + + switches = ~((isa_readb(bios_tab[bios] + 0x20) & 0xff)); + /* Find out where the IO space is */ x = switches & (SW_ADDR0 | SW_ADDR1); @@ -2015,7 +2003,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, IRQF_DISABLED, "in2000", instance)) { + if (request_irq(x, in2000_intr, SA_INTERRUPT, "in2000", instance)) { printk("in2000_detect: Unable to allocate IRQ.\n"); detect_count--; continue; @@ -2049,7 +2037,7 @@ static int __init in2000_detect(struct scsi_host_template * tpnt) /* Older BIOS's had a 'sync on/off' switch - use its setting */ - if (s1 == 0x41564f4e && (switches & SW_SYNC_DOS5)) + if (isa_readl(bios_tab[bios] + 0x10) == 0x41564f4e && (switches & SW_SYNC_DOS5)) hostdata->sync_off = 0x00; /* sync defaults to on */ else hostdata->sync_off = 0xff; /* sync defaults to off */ diff --git a/drivers/scsi/initio.c b/drivers/scsi/initio.c index 9e10dac61..ea6f3c0e0 100644 --- a/drivers/scsi/initio.c +++ b/drivers/scsi/initio.c @@ -118,6 +118,7 @@ #include #include #include +#include #include #include #include @@ -126,7 +127,6 @@ #include #include #include -#include #include #include @@ -153,6 +153,7 @@ 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 { @@ -2769,7 +2770,7 @@ static int tul_NewReturnNumberOfAdapters(void) init_i91uAdapter_table(); - for (i = 0; i < ARRAY_SIZE(i91u_pci_devices); i++) + for (i = 0; i < TULSZ(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)) @@ -2779,7 +2780,7 @@ static int tul_NewReturnNumberOfAdapters(void) if (((dRegValue & 0xFF00) >> 8) == 0xFF) dRegValue = 0; wBIOS = (wBIOS << 8) + ((UWORD) ((dRegValue & 0xFF00) >> 8)); - if (pci_set_dma_mask(pDev, DMA_32BIT_MASK)) { + if (pci_set_dma_mask(pDev, 0xffffffff)) { printk(KERN_WARNING "i91u: Could not set 32 bit DMA mask\n"); continue; @@ -2867,7 +2868,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, IRQF_DISABLED | IRQF_SHARED, "i91u", hreg); + ok = request_irq(pHCB->HCS_Intr, i91u_intr, SA_INTERRUPT | SA_SHIRQ, "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 acb67a4af..3efb1184f 100644 --- a/drivers/scsi/initio.h +++ b/drivers/scsi/initio.h @@ -54,6 +54,7 @@ **************************************************************************/ +#include #include #define ULONG unsigned long @@ -192,13 +193,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 Information out */ -#define TSC_XF_DMA_IN_DIRECT 0x86 /* DMA Xfer Information in */ +#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 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_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_MSG_ACCEPT 0x0F /* Message Accept */ diff --git a/drivers/scsi/ipr.c b/drivers/scsi/ipr.c index 01080b3ac..2bba5e55d 100644 --- a/drivers/scsi/ipr.c +++ b/drivers/scsi/ipr.c @@ -54,6 +54,7 @@ * */ +#include #include #include #include @@ -78,6 +79,7 @@ #include #include #include +#include #include "ipr.h" /* @@ -162,6 +164,29 @@ MODULE_PARM_DESC(auto_create, "Auto-create single device RAID 0 arrays when init 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[] = { @@ -844,8 +869,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 @@ -1331,8 +1356,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_ra_err(ioa_cfg, hostrcb->hcam.u.error.failing_dev_res_addr, - "%s\n", ipr_error_table[error_index].error); + ipr_res_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); @@ -2082,6 +2107,7 @@ 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); @@ -2098,7 +2124,6 @@ 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); @@ -3189,7 +3214,7 @@ static int ipr_slave_configure(struct scsi_device *sdev) sdev->timeout = IPR_VSET_RW_TIMEOUT; blk_queue_max_sectors(sdev->request_queue, IPR_VSET_MAX_SECTORS); } - if (ipr_is_vset_device(res) || ipr_is_scsi_disk(res)) + if (IPR_IS_DASD_DEVICE(res->cfgte.std_inq_data)) sdev->allow_restart = 1; scsi_adjust_queue_depth(sdev, 0, sdev->host->cmd_per_lun); } @@ -3278,44 +3303,6 @@ static int ipr_eh_host_reset(struct scsi_cmnd * cmd) 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 @@ -3332,7 +3319,8 @@ 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; - int rc; + struct ipr_cmd_pkt *cmd_pkt; + u32 ioasc; ENTER; ioa_cfg = (struct ipr_ioa_cfg *) scsi_cmd->device->host->hostdata; @@ -3359,12 +3347,25 @@ static int __ipr_eh_dev_reset(struct scsi_cmnd * scsi_cmd) } res->resetting_device = 1; - scmd_printk(KERN_ERR, scsi_cmd, "Resetting device\n"); - rc = ipr_device_reset(ioa_cfg, res); + + 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); + + ioasc = be32_to_cpu(ipr_cmd->ioasa.ioasc); + res->resetting_device = 0; + list_add_tail(&ipr_cmd->queue, &ioa_cfg->free_q); + LEAVE; - return (rc ? FAILED : SUCCESS); + return (IPR_IOASC_SENSE_KEY(ioasc) ? FAILED : SUCCESS); } static int ipr_eh_dev_reset(struct scsi_cmnd * cmd) @@ -3439,7 +3440,7 @@ static void ipr_abort_timeout(struct ipr_cmnd *ipr_cmd) return; } - sdev_printk(KERN_ERR, ipr_cmd->u.sdev, "Abort timed out. Resetting bus.\n"); + ipr_sdev_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; @@ -3503,8 +3504,7 @@ 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; - scmd_printk(KERN_ERR, scsi_cmd, "Aborting command: %02X\n", - scsi_cmd->cmnd[0]); + ipr_sdev_err(scsi_cmd->device, "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); @@ -3815,8 +3815,8 @@ static void ipr_erp_done(struct ipr_cmnd *ipr_cmd) if (IPR_IOASC_SENSE_KEY(ioasc) > 0) { scsi_cmd->result |= (DID_ERROR << 16); - scmd_printk(KERN_ERR, scsi_cmd, - "Request Sense failed with IOASC: 0x%08X\n", ioasc); + ipr_sdev_err(scsi_cmd->device, + "Request Sense failed with IOASC: 0x%08X\n", ioasc); } else { memcpy(scsi_cmd->sense_buffer, ipr_cmd->sense_buffer, SCSI_SENSE_BUFFERSIZE); @@ -3938,7 +3938,6 @@ 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 @@ -3948,7 +3947,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_resource_entry *res) + struct ipr_cmnd *ipr_cmd) { int i; u16 data_len; @@ -3976,7 +3975,16 @@ static void ipr_dump_ioasa(struct ipr_ioa_cfg *ioa_cfg, return; } - ipr_res_err(ioa_cfg, res, "%s\n", ipr_error_table[error_index].error); + 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]); + } if (sizeof(struct ipr_ioasa) < be16_to_cpu(ioasa->ret_stat_len)) data_len = sizeof(struct ipr_ioasa); @@ -4133,7 +4141,7 @@ static void ipr_erp_start(struct ipr_ioa_cfg *ioa_cfg, } if (ipr_is_gscsi(res)) - ipr_dump_ioasa(ioa_cfg, ipr_cmd, res); + ipr_dump_ioasa(ioa_cfg, ipr_cmd); else ipr_gen_sense(ipr_cmd); @@ -4532,7 +4540,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_scsi_disk(res)) + if (!IPR_IS_DASD_DEVICE(res->cfgte.std_inq_data)) continue; ipr_cmd->u.res = res; @@ -4972,7 +4980,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->cfgte.res_handle = IPR_INVALID_RES_HANDLE; + res->sdev->hostdata = NULL; list_move_tail(&res->queue, &ioa_cfg->used_res_q); } else { list_move_tail(&res->queue, &ioa_cfg->free_res_q); @@ -5822,109 +5830,6 @@ 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 @@ -6428,7 +6333,7 @@ static int __devinit ipr_probe_ioa(struct pci_dev *pdev, 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, IRQF_SHARED, IPR_NAME, ioa_cfg); + rc = request_irq(pdev->irq, ipr_isr, SA_SHIRQ, IPR_NAME, ioa_cfg); if (rc) { dev_err(&pdev->dev, "Couldn't register IRQ %d! rc=%d\n", @@ -6696,18 +6601,12 @@ static struct pci_device_id ipr_pci_table[] __devinitdata = { }; 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, .shutdown = ipr_shutdown, - .err_handler = &ipr_err_handler, }; /** diff --git a/drivers/scsi/ipr.h b/drivers/scsi/ipr.h index 1ad24df69..fd360bfe5 100644 --- a/drivers/scsi/ipr.h +++ b/drivers/scsi/ipr.h @@ -36,8 +36,8 @@ /* * Literals */ -#define IPR_DRIVER_VERSION "2.1.3" -#define IPR_DRIVER_DATE "(March 29, 2006)" +#define IPR_DRIVER_VERSION "2.1.2" +#define IPR_DRIVER_DATE "(February 8, 2006)" /* * IPR_MAX_CMD_PER_LUN: This defines the maximum number of outstanding @@ -133,7 +133,6 @@ #define IPR_MAX_SCSI_RATE(width) ((320 * 10) / ((width) / 8)) #define IPR_IOA_RES_HANDLE 0xffffffff -#define IPR_INVALID_RES_HANDLE 0 #define IPR_IOA_RES_ADDR 0x00ffffff /* @@ -1192,17 +1191,30 @@ struct ipr_ucode_image_header { */ #define ipr_err(...) printk(KERN_ERR IPR_NAME ": "__VA_ARGS__) #define ipr_info(...) printk(KERN_INFO IPR_NAME ": "__VA_ARGS__) +#define ipr_crit(...) printk(KERN_CRIT IPR_NAME ": "__VA_ARGS__) +#define ipr_warn(...) printk(KERN_WARNING IPR_NAME": "__VA_ARGS__) #define ipr_dbg(...) IPR_DBG_CMD(printk(KERN_INFO IPR_NAME ": "__VA_ARGS__)) -#define ipr_ra_printk(level, ioa_cfg, ra, fmt, ...) \ - printk(level IPR_NAME ": %d:%d:%d:%d: " fmt, (ioa_cfg)->host->host_no, \ - (ra).bus, (ra).target, (ra).lun, ##__VA_ARGS__) +#define ipr_sdev_printk(level, sdev, fmt, args...) \ + sdev_printk(level, sdev, fmt, ## args) -#define ipr_ra_err(ioa_cfg, ra, fmt, ...) \ - ipr_ra_printk(KERN_ERR, ioa_cfg, ra, fmt, ##__VA_ARGS__) +#define ipr_sdev_err(sdev, fmt, ...) \ + ipr_sdev_printk(KERN_ERR, sdev, fmt, ##__VA_ARGS__) + +#define ipr_sdev_info(sdev, fmt, ...) \ + ipr_sdev_printk(KERN_INFO, sdev, fmt, ##__VA_ARGS__) + +#define ipr_sdev_dbg(sdev, fmt, ...) \ + IPR_DBG_CMD(ipr_sdev_printk(KERN_INFO, sdev, fmt, ##__VA_ARGS__)) + +#define ipr_res_printk(level, ioa_cfg, res, fmt, ...) \ + printk(level IPR_NAME ": %d:%d:%d:%d: " fmt, ioa_cfg->host->host_no, \ + res.bus, res.target, res.lun, ##__VA_ARGS__) #define ipr_res_err(ioa_cfg, res, fmt, ...) \ - ipr_ra_err(ioa_cfg, (res)->cfgte.res_addr, fmt, ##__VA_ARGS__) + ipr_res_printk(KERN_ERR, ioa_cfg, res, fmt, ##__VA_ARGS__) +#define ipr_res_dbg(ioa_cfg, res, fmt, ...) \ + IPR_DBG_CMD(ipr_res_printk(KERN_INFO, ioa_cfg, res, fmt, ##__VA_ARGS__)) #define ipr_phys_res_err(ioa_cfg, res, fmt, ...) \ { \ @@ -1291,22 +1303,6 @@ static inline int ipr_is_gscsi(struct ipr_resource_entry *res) return 0; } -/** - * ipr_is_scsi_disk - Determine if a resource is a SCSI disk - * @res: resource entry struct - * - * Return value: - * 1 if SCSI disk / 0 if not SCSI disk - **/ -static inline int ipr_is_scsi_disk(struct ipr_resource_entry *res) -{ - if (ipr_is_af_dasd_device(res) || - (ipr_is_gscsi(res) && IPR_IS_DASD_DEVICE(res->cfgte.std_inq_data))) - return 1; - else - return 0; -} - /** * ipr_is_naca_model - Determine if a resource is using NACA queueing model * @res: resource entry struct diff --git a/drivers/scsi/ips.c b/drivers/scsi/ips.c index 4d2c29c56..86c546164 100644 --- a/drivers/scsi/ips.c +++ b/drivers/scsi/ips.c @@ -179,7 +179,6 @@ #include #include -#include #include @@ -196,6 +195,7 @@ #include #include +#include #include #include @@ -555,7 +555,7 @@ ips_setup(char *ips_str) * We now have key/value pairs. * Update the variables */ - for (i = 0; i < ARRAY_SIZE(options); i++) { + for (i = 0; i < (sizeof (options) / sizeof (options[0])); i++) { if (strnicmp (key, options[i].option_name, strlen(options[i].option_name)) == 0) { @@ -1146,7 +1146,7 @@ ips_queue(Scsi_Cmnd * SC, void (*done) (Scsi_Cmnd *)) return (0); } ha->ioctl_reset = 1; /* This reset request is from an IOCTL */ - __ips_eh_reset(SC); + ips_eh_reset(SC); SC->result = DID_OK << 16; SC->scsi_done(SC); return (0); @@ -4363,7 +4363,7 @@ ips_rdcap(ips_ha_t * ha, ips_scb_t * scb) METHOD_TRACE("ips_rdcap", 1); - if (scb->scsi_cmd->request_bufflen < 8) + if (scb->scsi_cmd->bufflen < 8) return (0); cap.lba = @@ -5014,7 +5014,7 @@ ips_init_copperhead(ips_ha_t * ha) break; /* Delay for 1 Second */ - MDELAY(IPS_ONE_SEC); + msleep(IPS_ONE_SEC); } if (j >= 45) @@ -5040,7 +5040,7 @@ ips_init_copperhead(ips_ha_t * ha) break; /* Delay for 1 Second */ - MDELAY(IPS_ONE_SEC); + msleep(IPS_ONE_SEC); } if (j >= 240) @@ -5058,7 +5058,7 @@ ips_init_copperhead(ips_ha_t * ha) break; /* Delay for 1 Second */ - MDELAY(IPS_ONE_SEC); + msleep(IPS_ONE_SEC); } if (i >= 240) @@ -5108,7 +5108,7 @@ ips_init_copperhead_memio(ips_ha_t * ha) break; /* Delay for 1 Second */ - MDELAY(IPS_ONE_SEC); + msleep(IPS_ONE_SEC); } if (j >= 45) @@ -5134,7 +5134,7 @@ ips_init_copperhead_memio(ips_ha_t * ha) break; /* Delay for 1 Second */ - MDELAY(IPS_ONE_SEC); + msleep(IPS_ONE_SEC); } if (j >= 240) @@ -5152,7 +5152,7 @@ ips_init_copperhead_memio(ips_ha_t * ha) break; /* Delay for 1 Second */ - MDELAY(IPS_ONE_SEC); + msleep(IPS_ONE_SEC); } if (i >= 240) @@ -5204,7 +5204,7 @@ ips_init_morpheus(ips_ha_t * ha) break; /* Delay for 1 Second */ - MDELAY(IPS_ONE_SEC); + msleep(IPS_ONE_SEC); } if (i >= 45) { @@ -5230,7 +5230,7 @@ ips_init_morpheus(ips_ha_t * ha) if (Post != 0x4F00) break; /* Delay for 1 Second */ - MDELAY(IPS_ONE_SEC); + msleep(IPS_ONE_SEC); } if (i >= 120) { @@ -5260,7 +5260,7 @@ ips_init_morpheus(ips_ha_t * ha) break; /* Delay for 1 Second */ - MDELAY(IPS_ONE_SEC); + msleep(IPS_ONE_SEC); } if (i >= 240) { @@ -5320,12 +5320,12 @@ ips_reset_copperhead(ips_ha_t * ha) outb(IPS_BIT_RST, ha->io_addr + IPS_REG_SCPR); /* Delay for 1 Second */ - MDELAY(IPS_ONE_SEC); + msleep(IPS_ONE_SEC); outb(0, ha->io_addr + IPS_REG_SCPR); /* Delay for 1 Second */ - MDELAY(IPS_ONE_SEC); + msleep(IPS_ONE_SEC); if ((*ha->func.init) (ha)) break; @@ -5365,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 */ - MDELAY(IPS_ONE_SEC); + msleep(IPS_ONE_SEC); writeb(0, ha->mem_ptr + IPS_REG_SCPR); /* Delay for 1 Second */ - MDELAY(IPS_ONE_SEC); + msleep(IPS_ONE_SEC); if ((*ha->func.init) (ha)) break; @@ -5411,7 +5411,7 @@ ips_reset_morpheus(ips_ha_t * ha) writel(0x80000000, ha->mem_ptr + IPS_REG_I960_IDR); /* Delay for 5 Seconds */ - MDELAY(5 * IPS_ONE_SEC); + msleep(5 * IPS_ONE_SEC); /* Do a PCI config read to wait for adapter */ pci_read_config_byte(ha->pcidev, 4, &junk); @@ -6437,7 +6437,7 @@ ips_erase_bios(ips_ha_t * ha) /* VPP failure */ return (1); - /* check for successful flash */ + /* check for succesful flash */ if (status & 0x30) /* sequence error */ return (1); @@ -6549,7 +6549,7 @@ ips_erase_bios_memio(ips_ha_t * ha) /* VPP failure */ return (1); - /* check for successful flash */ + /* check for succesful flash */ if (status & 0x30) /* sequence error */ return (1); @@ -7007,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, IRQF_SHARED, ips_name, ha)) { + if (request_irq(ha->irq, do_ipsintr, SA_SHIRQ, ips_name, ha)) { IPS_PRINTK(KERN_WARNING, ha->pcidev, "Unable to install interrupt handler\n"); scsi_host_put(sh); @@ -7284,10 +7284,10 @@ ips_init_phase1(struct pci_dev *pci_dev, int *indexPtr) * are guaranteed to be < 4G. */ if (IPS_ENABLE_DMA64 && IPS_HAS_ENH_SGLIST(ha) && - !pci_set_dma_mask(ha->pcidev, DMA_64BIT_MASK)) { + !pci_set_dma_mask(ha->pcidev, 0xffffffffffffffffULL)) { (ha)->flags |= IPS_HA_ENH_SG; } else { - if (pci_set_dma_mask(ha->pcidev, DMA_32BIT_MASK) != 0) { + if (pci_set_dma_mask(ha->pcidev, 0xffffffffULL) != 0) { printk(KERN_WARNING "Unable to set DMA Mask\n"); return ips_abort_init(ha, index); } @@ -7419,7 +7419,7 @@ ips_init_phase2(int index) } /* Install the interrupt handler */ - if (request_irq(ha->irq, do_ipsintr, IRQF_SHARED, ips_name, ha)) { + if (request_irq(ha->irq, do_ipsintr, SA_SHIRQ, 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 058f094f9..ff79e68b3 100644 --- a/drivers/scsi/iscsi_tcp.c +++ b/drivers/scsi/iscsi_tcp.c @@ -3,8 +3,7 @@ * * Copyright (C) 2004 Dmitry Yusupov * Copyright (C) 2004 Alex Aizman - * Copyright (C) 2005 - 2006 Mike Christie - * Copyright (C) 2006 Red Hat, Inc. All rights reserved. + * Copyright (C) 2005 Mike Christie * maintained by open-iscsi@googlegroups.com * * This program is free software; you can redistribute it and/or modify @@ -37,6 +36,10 @@ #include #include #include +#include +#include +#include +#include #include #include #include @@ -47,15 +50,23 @@ 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_INFO "tcp: " fmt) +#define debug_tcp(fmt...) printk(KERN_DEBUG "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 @@ -63,9 +74,22 @@ MODULE_LICENSE("GPL"); #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) { @@ -106,39 +130,68 @@ static inline void iscsi_hdr_digest(struct iscsi_conn *conn, struct iscsi_buf *buf, u8* crc) { - struct iscsi_tcp_conn *tcp_conn = conn->dd_data; - - crypto_digest_digest(tcp_conn->tx_tfm, &buf->sg, 1, crc); + crypto_digest_digest(conn->tx_tfm, &buf->sg, 1, crc); buf->sg.length += sizeof(uint32_t); } +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); +} + static inline int -iscsi_hdr_extract(struct iscsi_tcp_conn *tcp_conn) +iscsi_check_assign_cmdsn(struct iscsi_session *session, struct iscsi_nopin *hdr) { - struct sk_buff *skb = tcp_conn->in.skb; + 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; - tcp_conn->in.zero_copy_hdr = 0; + return 0; +} + +static inline int +iscsi_hdr_extract(struct iscsi_conn *conn) +{ + struct sk_buff *skb = conn->in.skb; - if (tcp_conn->in.copy >= tcp_conn->hdr_size && - tcp_conn->in_progress == IN_PROGRESS_WAIT_HEADER) { + if (conn->in.copy >= conn->hdr_size && + 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) { - tcp_conn->in.hdr = (struct iscsi_hdr *) - ((char*)skb->data + tcp_conn->in.offset); - tcp_conn->in.zero_copy_hdr = 1; - } else { + !skb_shinfo(skb)->nr_frags) + conn->in.hdr = (struct iscsi_hdr *) + ((char*)skb->data + conn->in.offset); + else { /* ignoring return code since we checked * in.copy before */ - skb_copy_bits(skb, tcp_conn->in.offset, - &tcp_conn->hdr, tcp_conn->hdr_size); - tcp_conn->in.hdr = &tcp_conn->hdr; + skb_copy_bits(skb, conn->in.offset, + &conn->hdr, conn->hdr_size); + conn->in.hdr = &conn->hdr; } - tcp_conn->in.offset += tcp_conn->hdr_size; - tcp_conn->in.copy -= tcp_conn->hdr_size; + conn->in.offset += conn->hdr_size; + conn->in.copy -= conn->hdr_size; } else { int hdr_remains; int copylen; @@ -148,59 +201,118 @@ iscsi_hdr_extract(struct iscsi_tcp_conn *tcp_conn) * copying it... This'll happen quite rarely. */ - if (tcp_conn->in_progress == IN_PROGRESS_WAIT_HEADER) - tcp_conn->in.hdr_offset = 0; + if (conn->in_progress == IN_PROGRESS_WAIT_HEADER) + conn->in.hdr_offset = 0; - hdr_remains = tcp_conn->hdr_size - tcp_conn->in.hdr_offset; + hdr_remains = conn->hdr_size - conn->in.hdr_offset; BUG_ON(hdr_remains <= 0); - 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); + copylen = min(conn->in.copy, hdr_remains); + skb_copy_bits(skb, conn->in.offset, + (char*)&conn->hdr + conn->in.hdr_offset, copylen); debug_tcp("PDU gather offset %d bytes %d in.offset %d " - "in.copy %d\n", tcp_conn->in.hdr_offset, copylen, - tcp_conn->in.offset, tcp_conn->in.copy); + "in.copy %d\n", conn->in.hdr_offset, copylen, + conn->in.offset, conn->in.copy); - tcp_conn->in.offset += copylen; - tcp_conn->in.copy -= copylen; + conn->in.offset += copylen; + conn->in.copy -= copylen; if (copylen < hdr_remains) { - tcp_conn->in_progress = IN_PROGRESS_HEADER_GATHER; - tcp_conn->in.hdr_offset += copylen; + conn->in_progress = IN_PROGRESS_HEADER_GATHER; + conn->in.hdr_offset += copylen; return -EAGAIN; } - tcp_conn->in.hdr = &tcp_conn->hdr; - tcp_conn->discontiguous_hdr_cnt++; - tcp_conn->in_progress = IN_PROGRESS_WAIT_HEADER; + conn->in.hdr = &conn->hdr; + conn->discontiguous_hdr_cnt++; + conn->in_progress = IN_PROGRESS_WAIT_HEADER; } return 0; } -/* - * must be called with session lock - */ -static void -iscsi_tcp_cleanup_ctask(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask) +static inline void +iscsi_ctask_cleanup(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask) { - struct iscsi_tcp_cmd_task *tcp_ctask = ctask->dd_data; - struct iscsi_r2t_info *r2t; - struct scsi_cmnd *sc; + 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) +{ + 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; - /* 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"); + rc = iscsi_check_assign_cmdsn(session, (struct iscsi_nopin*)rhdr); + if (rc) { + sc->result = (DID_ERROR << 16); + goto out; } - sc = ctask->sc; - if (unlikely(!sc)) - return; + 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); - tcp_ctask->xmstate = XMSTATE_IDLE; - tcp_ctask->r2t = NULL; + memcpy(sc->sense_buffer, conn->data + 2, sensecopy); + debug_scsi("copied %d bytes of sense\n", sensecopy); + } + + 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_ctask_cleanup(conn, ctask); + sc->scsi_done(sc); + return rc; } /** @@ -212,9 +324,7 @@ static int iscsi_data_rsp(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask) { int rc; - 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_data_rsp *rhdr = (struct iscsi_data_rsp *)conn->in.hdr; struct iscsi_session *session = conn->session; int datasn = be32_to_cpu(rhdr->datasn); @@ -224,9 +334,9 @@ iscsi_data_rsp(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask) /* * setup Data-In byte counter (gets decremented..) */ - ctask->data_count = tcp_conn->in.datalen; + ctask->data_count = conn->in.datalen; - if (tcp_conn->in.datalen == 0) + if (conn->in.datalen == 0) return 0; if (ctask->datasn != datasn) @@ -234,8 +344,8 @@ iscsi_data_rsp(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask) ctask->datasn++; - tcp_ctask->data_offset = be32_to_cpu(rhdr->offset); - if (tcp_ctask->data_offset + tcp_conn->in.datalen > ctask->total_length) + ctask->data_offset = be32_to_cpu(rhdr->offset); + if (ctask->data_offset + conn->in.datalen > ctask->total_length) return ISCSI_ERR_DATA_OFFSET; if (rhdr->flags & ISCSI_FLAG_DATA_STATUS) { @@ -280,17 +390,19 @@ 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; - hdr = &r2t->dtask.hdr; + dtask = mempool_alloc(ctask->datapool, GFP_ATOMIC); + BUG_ON(!dtask); + hdr = &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) { @@ -306,9 +418,11 @@ iscsi_solicit_data_init(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask, r2t->sent = 0; - iscsi_buf_init_iov(&r2t->headbuf, (char*)hdr, + iscsi_buf_init_virt(&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; @@ -337,9 +451,11 @@ iscsi_solicit_data_init(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask, } BUG_ON(r2t->sg == NULL); } else - iscsi_buf_init_iov(&tcp_ctask->sendbuf, + iscsi_buf_init_iov(&ctask->sendbuf, (char*)sc->request_buffer + r2t->data_offset, r2t->data_count); + + list_add(&dtask->item, &ctask->dataqueue); } /** @@ -352,16 +468,17 @@ 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_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; + struct iscsi_r2t_rsp *rhdr = (struct iscsi_r2t_rsp *)conn->in.hdr; int r2tsn = be32_to_cpu(rhdr->r2tsn); int rc; - if (tcp_conn->in.datalen) + if (conn->in.ahslen) + return ISCSI_ERR_AHSLEN; + + if (conn->in.datalen) return ISCSI_ERR_DATALEN; - if (tcp_ctask->exp_r2tsn && tcp_ctask->exp_r2tsn != r2tsn) + if (ctask->exp_r2tsn && ctask->exp_r2tsn != r2tsn) return ISCSI_ERR_R2TSN; rc = iscsi_check_assign_cmdsn(session, (struct iscsi_nopin*)rhdr); @@ -379,8 +496,7 @@ iscsi_r2t_rsp(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask) spin_unlock(&session->lock); return 0; } - - rc = __kfifo_get(tcp_ctask->r2tpool.queue, (void*)&r2t, sizeof(void*)); + rc = __kfifo_get(ctask->r2tpool.queue, (void*)&r2t, sizeof(void*)); BUG_ON(!rc); r2t->exp_statsn = rhdr->statsn; @@ -402,10 +518,10 @@ iscsi_r2t_rsp(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask) iscsi_solicit_data_init(conn, ctask, r2t); - 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); + 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*)); scsi_queue_work(session->host, &conn->xmitwork); conn->r2t_pdus_cnt++; @@ -415,153 +531,258 @@ iscsi_r2t_rsp(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask) } static int -iscsi_tcp_hdr_recv(struct iscsi_conn *conn) +iscsi_hdr_recv(struct iscsi_conn *conn) { - int rc = 0, opcode, ahslen; + int rc = 0; struct iscsi_hdr *hdr; + struct iscsi_cmd_task *ctask; struct iscsi_session *session = conn->session; - struct iscsi_tcp_conn *tcp_conn = conn->dd_data; - uint32_t cdgst, rdgst = 0, itt; + uint32_t cdgst, rdgst = 0; - hdr = tcp_conn->in.hdr; + hdr = conn->in.hdr; /* verify PDU length */ - tcp_conn->in.datalen = ntoh24(hdr->dlength); - if (tcp_conn->in.datalen > conn->max_recv_dlength) { + conn->in.datalen = ntoh24(hdr->dlength); + if (conn->in.datalen > conn->max_recv_dlength) { printk(KERN_ERR "iscsi_tcp: datalen %d > %d\n", - tcp_conn->in.datalen, conn->max_recv_dlength); + conn->in.datalen, conn->max_recv_dlength); return ISCSI_ERR_DATALEN; } - tcp_conn->data_copied = 0; + conn->data_copied = 0; /* read AHS */ - ahslen = hdr->hlength << 2; - tcp_conn->in.offset += ahslen; - tcp_conn->in.copy -= ahslen; - if (tcp_conn->in.copy < 0) { + conn->in.ahslen = hdr->hlength * 4; + conn->in.offset += conn->in.ahslen; + conn->in.copy -= conn->in.ahslen; + if (conn->in.copy < 0) { printk(KERN_ERR "iscsi_tcp: can't handle AHS with length " - "%d bytes\n", ahslen); + "%d bytes\n", conn->in.ahslen); return ISCSI_ERR_AHSLEN; } /* calculate read 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); + 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); } if (conn->hdrdgst_en) { struct scatterlist sg; sg_init_one(&sg, (u8 *)hdr, - sizeof(struct iscsi_hdr) + ahslen); - crypto_digest_digest(tcp_conn->rx_tfm, &sg, 1, (u8 *)&cdgst); + sizeof(struct iscsi_hdr) + conn->in.ahslen); + crypto_digest_digest(conn->rx_tfm, &sg, 1, (u8 *)&cdgst); rdgst = *(uint32_t*)((char*)hdr + sizeof(struct iscsi_hdr) + - ahslen); + conn->in.ahslen); if (cdgst != rdgst) { - printk(KERN_ERR "iscsi_tcp: hdrdgst error " - "recv 0x%x calc 0x%x\n", rdgst, cdgst); + printk(KERN_ERR "iscsi_tcp: itt %x: hdrdgst error " + "recv 0x%x calc 0x%x\n", conn->in.itt, rdgst, + cdgst); return ISCSI_ERR_HDR_DGST; } } - opcode = hdr->opcode & ISCSI_OPCODE_MASK; + /* save opcode for later */ + conn->in.opcode = hdr->opcode & ISCSI_OPCODE_MASK; + /* verify itt (itt encoding: age+cid+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; + 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; debug_tcp("opcode 0x%x offset %d copy %d ahslen %d datalen %d\n", - opcode, tcp_conn->in.offset, tcp_conn->in.copy, - ahslen, tcp_conn->in.datalen); + hdr->opcode, conn->in.offset, conn->in.copy, + conn->in.ahslen, conn->in.datalen); - 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; + 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; + } + + 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; 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 (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; - } + 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; - return rc; + 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; -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; + return rc; } /** * iscsi_ctask_copy - copy skb bits to the destanation cmd task - * @conn: iscsi tcp connection + * @conn: iscsi connection * @ctask: scsi command task * @buf: buffer to copy to * @buf_size: size of buffer @@ -583,113 +804,110 @@ copy_hdr: * buf_left left to copy from in progress buffer **/ static inline int -iscsi_ctask_copy(struct iscsi_tcp_conn *tcp_conn, struct iscsi_cmd_task *ctask, +iscsi_ctask_copy(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask, void *buf, int buf_size, int offset) { - 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 buf_left = buf_size - (conn->data_copied + offset); + int size = min(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, tcp_conn->in.offset, tcp_conn->in.copied); + size, conn->in.offset, conn->in.copied); BUG_ON(size <= 0); - BUG_ON(tcp_ctask->sent + size > ctask->total_length); + BUG_ON(ctask->sent + size > ctask->total_length); - rc = skb_copy_bits(tcp_conn->in.skb, tcp_conn->in.offset, - (char*)buf + (offset + tcp_conn->data_copied), size); + rc = skb_copy_bits(conn->in.skb, conn->in.offset, + (char*)buf + (offset + conn->data_copied), size); /* must fit into skb->len */ BUG_ON(rc); - tcp_conn->in.offset += size; - tcp_conn->in.copy -= size; - tcp_conn->in.copied += size; - tcp_conn->data_copied += size; - tcp_ctask->sent += size; + conn->in.offset += size; + conn->in.copy -= size; + conn->in.copied += size; + conn->data_copied += size; + ctask->sent += size; ctask->data_count -= size; - BUG_ON(tcp_conn->in.copy < 0); + BUG_ON(conn->in.copy < 0); BUG_ON(ctask->data_count < 0); - if (buf_size != (tcp_conn->data_copied + offset)) { + if (buf_size != (conn->data_copied + offset)) { if (!ctask->data_count) { - BUG_ON(buf_size - tcp_conn->data_copied < 0); + BUG_ON(buf_size - conn->data_copied < 0); /* done with this PDU */ - return buf_size - tcp_conn->data_copied; + return buf_size - conn->data_copied; } return -EAGAIN; } /* done with this buffer or with both - PDU and buffer */ - tcp_conn->data_copied = 0; + conn->data_copied = 0; return 0; } /** * iscsi_tcp_copy - copy skb bits to the destanation buffer - * @conn: iscsi tcp connection + * @conn: iscsi connection + * @buf: buffer to copy to + * @buf_size: number of bytes to copy * * Notes: * The function calls skb_copy_bits() and updates per-connection * byte counters. **/ static inline int -iscsi_tcp_copy(struct iscsi_conn *conn) +iscsi_tcp_copy(struct iscsi_conn *conn, void *buf, int buf_size) { - 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 buf_left = buf_size - conn->data_copied; + int size = min(conn->in.copy, buf_left); int rc; debug_tcp("tcp_copy %d bytes at offset %d copied %d\n", - size, tcp_conn->in.offset, tcp_conn->data_copied); + size, conn->in.offset, conn->data_copied); BUG_ON(size <= 0); - rc = skb_copy_bits(tcp_conn->in.skb, tcp_conn->in.offset, - (char*)conn->data + tcp_conn->data_copied, size); + rc = skb_copy_bits(conn->in.skb, conn->in.offset, + (char*)buf + conn->data_copied, size); BUG_ON(rc); - tcp_conn->in.offset += size; - tcp_conn->in.copy -= size; - tcp_conn->in.copied += size; - tcp_conn->data_copied += size; + conn->in.offset += size; + conn->in.copy -= size; + conn->in.copied += size; + conn->data_copied += size; - if (buf_size != tcp_conn->data_copied) + if (buf_size != conn->data_copied) return -EAGAIN; return 0; } static inline void -partial_sg_digest_update(struct iscsi_tcp_conn *tcp_conn, - struct scatterlist *sg, int offset, int length) +partial_sg_digest_update(struct iscsi_conn *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(tcp_conn->data_rx_tfm, &temp, 1); + crypto_digest_update(conn->data_rx_tfm, &temp, 1); } static void -iscsi_recv_digest_update(struct iscsi_tcp_conn *tcp_conn, char* buf, int len) +iscsi_recv_digest_update(struct iscsi_conn *conn, char* buf, int len) { struct scatterlist tmp; sg_init_one(&tmp, buf, len); - crypto_digest_update(tcp_conn->data_rx_tfm, &tmp, 1); + crypto_digest_update(conn->data_rx_tfm, &tmp, 1); } static int iscsi_scsi_data_in(struct iscsi_conn *conn) { - 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 iscsi_cmd_task *ctask = conn->in.ctask; struct scsi_cmnd *sc = ctask->sc; struct scatterlist *sg; int i, offset, rc = 0; @@ -701,33 +919,31 @@ static int iscsi_scsi_data_in(struct iscsi_conn *conn) */ if (!sc->use_sg) { i = ctask->data_count; - rc = iscsi_ctask_copy(tcp_conn, ctask, sc->request_buffer, - sc->request_bufflen, - tcp_ctask->data_offset); + rc = iscsi_ctask_copy(conn, ctask, sc->request_buffer, + sc->request_bufflen, ctask->data_offset); if (rc == -EAGAIN) return rc; if (conn->datadgst_en) - iscsi_recv_digest_update(tcp_conn, sc->request_buffer, - i); + iscsi_recv_digest_update(conn, sc->request_buffer, i); rc = 0; goto done; } - offset = tcp_ctask->data_offset; + offset = ctask->data_offset; sg = sc->request_buffer; - if (tcp_ctask->data_offset) - for (i = 0; i < tcp_ctask->sg_count; i++) + if (ctask->data_offset) + for (i = 0; i < ctask->sg_count; i++) offset -= sg[i].length; /* we've passed through partial sg*/ if (offset < 0) offset = 0; - for (i = tcp_ctask->sg_count; i < sc->use_sg; i++) { + for (i = ctask->sg_count; i < sc->use_sg; i++) { char *dest; dest = kmap_atomic(sg[i].page, KM_SOFTIRQ0); - rc = iscsi_ctask_copy(tcp_conn, ctask, dest + sg[i].offset, + rc = iscsi_ctask_copy(conn, ctask, dest + sg[i].offset, sg[i].length, offset); kunmap_atomic(dest, KM_SOFTIRQ0); if (rc == -EAGAIN) @@ -736,17 +952,15 @@ static int iscsi_scsi_data_in(struct iscsi_conn *conn) if (!rc) { if (conn->datadgst_en) { if (!offset) - crypto_digest_update( - tcp_conn->data_rx_tfm, - &sg[i], 1); + crypto_digest_update(conn->data_rx_tfm, + &sg[i], 1); else - partial_sg_digest_update(tcp_conn, - &sg[i], + partial_sg_digest_update(conn, &sg[i], sg[i].offset + offset, sg[i].length - offset); } offset = 0; - tcp_ctask->sg_count++; + ctask->sg_count++; } if (!ctask->data_count) { @@ -754,27 +968,25 @@ static int iscsi_scsi_data_in(struct iscsi_conn *conn) /* * data-in is complete, but buffer not... */ - partial_sg_digest_update(tcp_conn, &sg[i], + partial_sg_digest_update(conn, &sg[i], sg[i].offset, sg[i].length-rc); rc = 0; break; } - if (!tcp_conn->in.copy) + if (!conn->in.copy) return -EAGAIN; } BUG_ON(ctask->data_count); done: /* check for non-exceptional status */ - 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); + 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); } return rc; @@ -783,37 +995,71 @@ done: static int iscsi_data_recv(struct iscsi_conn *conn) { - struct iscsi_tcp_conn *tcp_conn = conn->dd_data; - int rc = 0, opcode; + struct iscsi_session *session = conn->session; + int rc = 0; - opcode = tcp_conn->in.hdr->opcode & ISCSI_OPCODE_MASK; - switch (opcode) { + switch(conn->in.opcode) { case ISCSI_OP_SCSI_DATA_IN: rc = iscsi_scsi_data_in(conn); 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_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_TEXT_RSP: case ISCSI_OP_LOGIN_RSP: - case ISCSI_OP_ASYNC_EVENT: - case ISCSI_OP_REJECT: + 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]; + /* * Collect data segment to the connection's data * placeholder */ - if (iscsi_tcp_copy(conn)) { + if (iscsi_tcp_copy(conn, conn->data, conn->in.datalen)) { rc = -EAGAIN; goto exit; } - 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; + 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: default: BUG_ON(1); } @@ -834,7 +1080,6 @@ 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; @@ -843,15 +1088,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. */ - 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); + 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); more: - tcp_conn->in.copied = 0; + conn->in.copied = 0; rc = 0; if (unlikely(conn->suspend_rx)) { @@ -859,14 +1104,14 @@ more: return 0; } - if (tcp_conn->in_progress == IN_PROGRESS_WAIT_HEADER || - tcp_conn->in_progress == IN_PROGRESS_HEADER_GATHER) { - rc = iscsi_hdr_extract(tcp_conn); + if (conn->in_progress == IN_PROGRESS_WAIT_HEADER || + conn->in_progress == IN_PROGRESS_HEADER_GATHER) { + rc = iscsi_hdr_extract(conn); if (rc) { if (rc == -EAGAIN) goto nomore; else { - iscsi_conn_failure(conn, ISCSI_ERR_CONN_FAILED); + iscsi_conn_failure(conn, rc); return 0; } } @@ -874,91 +1119,90 @@ more: /* * Verify and process incoming PDU header. */ - rc = iscsi_tcp_hdr_recv(conn); - if (!rc && tcp_conn->in.datalen) { + rc = iscsi_hdr_recv(conn); + if (!rc && conn->in.datalen) { if (conn->datadgst_en) { - BUG_ON(!tcp_conn->data_rx_tfm); - crypto_digest_init(tcp_conn->data_rx_tfm); + BUG_ON(!conn->data_rx_tfm); + crypto_digest_init(conn->data_rx_tfm); } - tcp_conn->in_progress = IN_PROGRESS_DATA_RECV; + conn->in_progress = IN_PROGRESS_DATA_RECV; } else if (rc) { iscsi_conn_failure(conn, rc); return 0; } } - if (tcp_conn->in_progress == IN_PROGRESS_DDIGEST_RECV) { + if (conn->in_progress == IN_PROGRESS_DDIGEST_RECV) { uint32_t recv_digest; - debug_tcp("extra data_recv offset %d copy %d\n", - tcp_conn->in.offset, tcp_conn->in.copy); - skb_copy_bits(tcp_conn->in.skb, tcp_conn->in.offset, + conn->in.offset, conn->in.copy); + skb_copy_bits(conn->in.skb, conn->in.offset, &recv_digest, 4); - tcp_conn->in.offset += 4; - tcp_conn->in.copy -= 4; - if (recv_digest != tcp_conn->in.datadgst) { + conn->in.offset += 4; + conn->in.copy -= 4; + if (recv_digest != conn->in.datadgst) { debug_tcp("iscsi_tcp: data digest error!" "0x%x != 0x%x\n", recv_digest, - tcp_conn->in.datadgst); + 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, - tcp_conn->in.datadgst); - tcp_conn->in_progress = IN_PROGRESS_WAIT_HEADER; + conn->in.datadgst); + conn->in_progress = IN_PROGRESS_WAIT_HEADER; } } - if (tcp_conn->in_progress == IN_PROGRESS_DATA_RECV && - tcp_conn->in.copy) { + if (conn->in_progress == IN_PROGRESS_DATA_RECV && conn->in.copy) { debug_tcp("data_recv offset %d copy %d\n", - tcp_conn->in.offset, tcp_conn->in.copy); + conn->in.offset, conn->in.copy); rc = iscsi_data_recv(conn); if (rc) { - if (rc == -EAGAIN) + if (rc == -EAGAIN) { + rd_desc->count = conn->in.datalen - + conn->in.ctask->data_count; goto again; - iscsi_conn_failure(conn, ISCSI_ERR_CONN_FAILED); + } + iscsi_conn_failure(conn, rc); return 0; } - tcp_conn->in.copy -= tcp_conn->in.padding; - tcp_conn->in.offset += tcp_conn->in.padding; + conn->in.copy -= conn->in.padding; + conn->in.offset += conn->in.padding; if (conn->datadgst_en) { - 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); + 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); } - 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; + 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; } else - tcp_conn->in_progress = IN_PROGRESS_WAIT_HEADER; + conn->in_progress = IN_PROGRESS_WAIT_HEADER; } debug_tcp("f, processed %d from out of %d padding %d\n", - tcp_conn->in.offset - offset, (int)len, tcp_conn->in.padding); - BUG_ON(tcp_conn->in.offset - offset > len); + conn->in.offset - offset, (int)len, conn->in.padding); + BUG_ON(conn->in.offset - offset > len); - if (tcp_conn->in.offset - offset != len) { + if (conn->in.offset - offset != len) { debug_tcp("continue to process %d bytes\n", - (int)len - (tcp_conn->in.offset - offset)); + (int)len - (conn->in.offset - offset)); goto more; } nomore: - processed = tcp_conn->in.offset - offset; + processed = conn->in.offset - offset; BUG_ON(processed == 0); return processed; again: - processed = tcp_conn->in.offset - offset; + processed = 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); @@ -976,14 +1220,9 @@ 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. - * 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. - */ + /* use rd_desc to pass 'conn' to iscsi_tcp_data_recv */ rd_desc.arg.data = conn; - rd_desc.count = 1; + rd_desc.count = 0; tcp_read_sock(sk, &rd_desc, iscsi_tcp_data_recv); read_unlock(&sk->sk_callback_lock); @@ -992,7 +1231,6 @@ 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 *); @@ -1009,8 +1247,7 @@ iscsi_tcp_state_change(struct sock *sk) iscsi_conn_failure(conn, ISCSI_ERR_CONN_FAILED); } - tcp_conn = conn->dd_data; - old_state_change = tcp_conn->old_state_change; + old_state_change = conn->old_state_change; read_unlock(&sk->sk_callback_lock); @@ -1025,25 +1262,23 @@ static void iscsi_write_space(struct sock *sk) { struct iscsi_conn *conn = (struct iscsi_conn*)sk->sk_user_data; - struct iscsi_tcp_conn *tcp_conn = conn->dd_data; - - tcp_conn->old_write_space(sk); + 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 iscsi_tcp_conn *tcp_conn = conn->dd_data; - struct sock *sk = tcp_conn->sock->sk; + struct sock *sk = conn->sock->sk; /* assign new callbacks */ write_lock_bh(&sk->sk_callback_lock); sk->sk_user_data = conn; - 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; + conn->old_data_ready = sk->sk_data_ready; + conn->old_state_change = sk->sk_state_change; + 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; @@ -1051,16 +1286,16 @@ iscsi_conn_set_callbacks(struct iscsi_conn *conn) } static void -iscsi_conn_restore_callbacks(struct iscsi_tcp_conn *tcp_conn) +iscsi_conn_restore_callbacks(struct iscsi_conn *conn) { - struct sock *sk = tcp_conn->sock->sk; + struct sock *sk = 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 = 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_data_ready = conn->old_data_ready; + sk->sk_state_change = conn->old_state_change; + sk->sk_write_space = conn->old_write_space; sk->sk_no_check = 0; write_unlock_bh(&sk->sk_callback_lock); } @@ -1075,9 +1310,8 @@ iscsi_conn_restore_callbacks(struct iscsi_tcp_conn *tcp_conn) static inline int iscsi_send(struct iscsi_conn *conn, struct iscsi_buf *buf, int size, int flags) { - struct iscsi_tcp_conn *tcp_conn = conn->dd_data; - struct socket *sk = tcp_conn->sock; - int offset = buf->sg.offset + buf->sent, res; + struct socket *sk = conn->sock; + int offset = buf->sg.offset + buf->sent; /* * if we got use_sg=0 or are sending something we kmallocd @@ -1088,22 +1322,9 @@ iscsi_send(struct iscsi_conn *conn, struct iscsi_buf *buf, int size, int flags) * slab case. */ if (buf->use_sendmsg) - 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; + return sock_no_sendpage(sk, buf->sg.page, offset, size, flags); else - iscsi_conn_failure(conn, ISCSI_ERR_CONN_FAILED); - return res; + return conn->sendpage(sk, buf->sg.page, offset, size, flags); } /** @@ -1129,10 +1350,16 @@ 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; } @@ -1165,46 +1392,47 @@ 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_tcp_conn *tcp_conn, - struct iscsi_cmd_task *ctask) +iscsi_data_digest_init(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask) { - 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; + BUG_ON(!conn->data_tx_tfm); + crypto_digest_init(conn->data_tx_tfm); + 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(tcp_conn->data_tx_tfm, (u8*)digest); + crypto_digest_final(conn->data_tx_tfm, (u8*)digest); - iscsi_buf_init_iov(buf, (char*)digest, 4); - rc = iscsi_sendpage(conn, buf, &tcp_ctask->digest_count, &sent); + iscsi_buf_init_virt(buf, (char*)digest, 4); + rc = iscsi_sendpage(conn, buf, &ctask->digest_count, &sent); if (rc) { - tcp_ctask->datadigest = *digest; - tcp_ctask->xmstate |= XMSTATE_DATA_DIGEST; + ctask->datadigest = *digest; + ctask->xmstate |= XMSTATE_DATA_DIGEST; } else - tcp_ctask->digest_count = 4; + ctask->digest_count = 4; return rc; } @@ -1225,19 +1453,21 @@ 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; - hdr = &r2t->dtask.hdr; + dtask = mempool_alloc(ctask->datapool, GFP_ATOMIC); + BUG_ON(!dtask); + hdr = &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); @@ -1251,98 +1481,181 @@ iscsi_solicit_data_cont(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask, } conn->dataout_pdus_cnt++; - iscsi_buf_init_iov(&r2t->headbuf, (char*)hdr, + iscsi_buf_init_virt(&r2t->headbuf, (char*)hdr, sizeof(struct iscsi_hdr)); + r2t->dtask = dtask; + if (sc->use_sg && !iscsi_buf_left(&r2t->sendbuf)) { - BUG_ON(tcp_ctask->bad_sg == r2t->sg); + BUG_ON(ctask->bad_sg == r2t->sg); iscsi_buf_init_sg(&r2t->sendbuf, r2t->sg); r2t->sg += 1; } else - iscsi_buf_init_iov(&tcp_ctask->sendbuf, + iscsi_buf_init_iov(&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_tcp_cmd_task *tcp_ctask = ctask->dd_data; + struct iscsi_data *hdr; struct iscsi_data_task *dtask; - 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, + 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, sizeof(struct iscsi_hdr)); + + list_add(&dtask->item, &ctask->dataqueue); + + ctask->dtask = dtask; } /** - * iscsi_tcp_cmd_init - Initialize iSCSI SCSI_READ or SCSI_WRITE commands + * iscsi_cmd_init - Initialize iSCSI SCSI_READ or SCSI_WRITE commands * @conn: iscsi connection * @ctask: scsi command task * @sc: scsi command **/ static void -iscsi_tcp_cmd_init(struct iscsi_cmd_task *ctask) +iscsi_cmd_init(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask, + struct scsi_cmnd *sc) { - struct scsi_cmnd *sc = ctask->sc; - struct iscsi_tcp_cmd_task *tcp_ctask = ctask->dd_data; + struct iscsi_session *session = conn->session; - BUG_ON(__kfifo_len(tcp_ctask->r2tqueue)); + BUG_ON(__kfifo_len(ctask->r2tqueue)); - tcp_ctask->sent = 0; - tcp_ctask->sg_count = 0; + 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); + + ctask->mtask = NULL; + ctask->sent = 0; + ctask->sg_count = 0; + + ctask->total_length = sc->request_bufflen; if (sc->sc_data_direction == DMA_TO_DEVICE) { - tcp_ctask->xmstate = XMSTATE_W_HDR; - tcp_ctask->exp_r2tsn = 0; + ctask->exp_r2tsn = 0; + ctask->hdr.flags |= ISCSI_FLAG_CMD_WRITE; BUG_ON(ctask->total_length == 0); - if (sc->use_sg) { struct scatterlist *sg = sc->request_buffer; - 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); - - if (ctask->imm_count) - tcp_ctask->xmstate |= XMSTATE_IMM_DATA; + 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); + } - 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; + /* + * 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; debug_scsi("write padding %d bytes\n", - tcp_ctask->pad_count); - tcp_ctask->xmstate |= XMSTATE_W_PAD; + ctask->pad_count); + 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; - if (ctask->unsol_count) - tcp_ctask->xmstate |= XMSTATE_UNS_HDR | - XMSTATE_UNS_INIT; - tcp_ctask->r2t_data_count = ctask->total_length - + ctask->r2t_data_count = ctask->total_length - ctask->imm_count - ctask->unsol_count; - debug_scsi("cmd [itt 0x%x total %d imm %d imm_data %d " + debug_scsi("cmd [itt %x total %d imm %d imm_data %d " "r2t_data %d]\n", ctask->itt, ctask->total_length, ctask->imm_count, - ctask->unsol_count, tcp_ctask->r2t_data_count); - } else - tcp_ctask->xmstate = XMSTATE_R_HDR; + 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); + } - iscsi_buf_init_iov(&tcp_ctask->headbuf, (char*)ctask->hdr, + iscsi_buf_init_virt(&ctask->headbuf, (char*)&ctask->hdr, sizeof(struct iscsi_hdr)); + conn->scsicmd_pdus_cnt++; } /** - * iscsi_tcp_mtask_xmit - xmit management(immediate) task + * iscsi_mtask_xmit - xmit management(immediate) task * @conn: iscsi connection * @mtask: task management task * @@ -1356,167 +1669,132 @@ iscsi_tcp_cmd_init(struct iscsi_cmd_task *ctask) * IN_PROGRESS_IMM_DATA - PDU Data xmit in progress **/ static int -iscsi_tcp_mtask_xmit(struct iscsi_conn *conn, struct iscsi_mgmt_task *mtask) +iscsi_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, tcp_mtask->xmstate, mtask->itt); + conn->id, mtask->xmstate, mtask->itt); - if (tcp_mtask->xmstate & XMSTATE_IMM_HDR) { - tcp_mtask->xmstate &= ~XMSTATE_IMM_HDR; + if (mtask->xmstate & XMSTATE_IMM_HDR) { + mtask->xmstate &= ~XMSTATE_IMM_HDR; if (mtask->data_count) - tcp_mtask->xmstate |= XMSTATE_IMM_DATA; + 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, &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; + iscsi_hdr_digest(conn, &mtask->headbuf, + (u8*)mtask->hdrext); + if (iscsi_sendhdr(conn, &mtask->headbuf, mtask->data_count)) { + mtask->xmstate |= XMSTATE_IMM_HDR; if (mtask->data_count) - tcp_mtask->xmstate &= ~XMSTATE_IMM_DATA; - return rc; + mtask->xmstate &= ~XMSTATE_IMM_DATA; + return -EAGAIN; } } - if (tcp_mtask->xmstate & XMSTATE_IMM_DATA) { + if (mtask->xmstate & XMSTATE_IMM_DATA) { BUG_ON(!mtask->data_count); - tcp_mtask->xmstate &= ~XMSTATE_IMM_DATA; + mtask->xmstate &= ~XMSTATE_IMM_DATA; /* FIXME: implement. * Virtual buffer could be spreaded across multiple pages... */ do { - 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; + if (iscsi_sendpage(conn, &mtask->sendbuf, + &mtask->data_count, &mtask->sent)) { + mtask->xmstate |= XMSTATE_IMM_DATA; + return -EAGAIN; } } while (mtask->data_count); } - 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); - } + BUG_ON(mtask->xmstate != XMSTATE_IDLE); return 0; } static inline int -handle_xmstate_r_hdr(struct iscsi_conn *conn, - struct iscsi_tcp_cmd_task *tcp_ctask) +handle_xmstate_r_hdr(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask) { - int rc; - - tcp_ctask->xmstate &= ~XMSTATE_R_HDR; + ctask->xmstate &= ~XMSTATE_R_HDR; if (conn->hdrdgst_en) - 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); + iscsi_hdr_digest(conn, &ctask->headbuf, (u8*)ctask->hdrext); + if (!iscsi_sendhdr(conn, &ctask->headbuf, 0)) { + BUG_ON(ctask->xmstate != XMSTATE_IDLE); return 0; /* wait for Data-In */ } - tcp_ctask->xmstate |= XMSTATE_R_HDR; - return rc; + ctask->xmstate |= XMSTATE_R_HDR; + return -EAGAIN; } 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) { - struct iscsi_tcp_cmd_task *tcp_ctask = ctask->dd_data; - int rc; - - tcp_ctask->xmstate &= ~XMSTATE_W_HDR; + ctask->xmstate &= ~XMSTATE_W_HDR; if (conn->hdrdgst_en) - 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; + 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; } static inline int handle_xmstate_data_digest(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask) { - 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; + 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; debug_tcp("resent data digest 0x%x fail!\n", - tcp_ctask->datadigest); + ctask->datadigest); + return -EAGAIN; } - - return rc; + return 0; } 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); - tcp_ctask->xmstate &= ~XMSTATE_IMM_DATA; + ctask->xmstate &= ~XMSTATE_IMM_DATA; if (conn->datadgst_en) { - iscsi_data_digest_init(tcp_conn, ctask); - tcp_ctask->immdigest = 0; + iscsi_data_digest_init(conn, ctask); + ctask->immdigest = 0; } for (;;) { - rc = iscsi_sendpage(conn, &tcp_ctask->sendbuf, - &ctask->imm_count, &tcp_ctask->sent); - if (rc) { - tcp_ctask->xmstate |= XMSTATE_IMM_DATA; + if (iscsi_sendpage(conn, &ctask->sendbuf, &ctask->imm_count, + &ctask->sent)) { + ctask->xmstate |= XMSTATE_IMM_DATA; if (conn->datadgst_en) { - crypto_digest_final(tcp_conn->data_tx_tfm, - (u8*)&tcp_ctask->immdigest); + crypto_digest_final(conn->data_tx_tfm, + (u8*)&ctask->immdigest); debug_tcp("tx imm sendpage fail 0x%x\n", - tcp_ctask->datadigest); + ctask->datadigest); } - return rc; + return -EAGAIN; } if (conn->datadgst_en) - crypto_digest_update(tcp_conn->data_tx_tfm, - &tcp_ctask->sendbuf.sg, 1); + crypto_digest_update(conn->data_tx_tfm, + &ctask->sendbuf.sg, 1); if (!ctask->imm_count) break; - iscsi_buf_init_sg(&tcp_ctask->sendbuf, - &tcp_ctask->sg[tcp_ctask->sg_count++]); + iscsi_buf_init_sg(&ctask->sendbuf, + &ctask->sg[ctask->sg_count++]); } - 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) { + if (conn->datadgst_en && !(ctask->xmstate & XMSTATE_W_PAD)) { + if (iscsi_digest_final_send(conn, ctask, &ctask->immbuf, + &ctask->immdigest, 1)) { debug_tcp("sending imm digest 0x%x fail!\n", - tcp_ctask->immdigest); - return rc; + ctask->immdigest); + return -EAGAIN; } - debug_tcp("sending imm digest 0x%x\n", tcp_ctask->immdigest); + debug_tcp("sending imm digest 0x%x\n", ctask->immdigest); } return 0; @@ -1525,81 +1803,74 @@ 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; - tcp_ctask->xmstate |= XMSTATE_UNS_DATA; - if (tcp_ctask->xmstate & XMSTATE_UNS_INIT) { + ctask->xmstate |= XMSTATE_UNS_DATA; + if (ctask->xmstate & XMSTATE_UNS_INIT) { iscsi_unsolicit_data_init(conn, ctask); - dtask = tcp_ctask->dtask; + BUG_ON(!ctask->dtask); + dtask = ctask->dtask; if (conn->hdrdgst_en) - iscsi_hdr_digest(conn, &tcp_ctask->headbuf, + iscsi_hdr_digest(conn, &ctask->headbuf, (u8*)dtask->hdrext); - tcp_ctask->xmstate &= ~XMSTATE_UNS_INIT; + ctask->xmstate &= ~XMSTATE_UNS_INIT; } - - 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; + if (iscsi_sendhdr(conn, &ctask->headbuf, ctask->data_count)) { + ctask->xmstate &= ~XMSTATE_UNS_DATA; + ctask->xmstate |= XMSTATE_UNS_HDR; + return -EAGAIN; } debug_scsi("uns dout [itt 0x%x dlen %d sent %d]\n", - ctask->itt, ctask->unsol_count, tcp_ctask->sent); + ctask->itt, ctask->unsol_count, ctask->sent); return 0; } static inline int handle_xmstate_uns_data(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask) { - 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; + struct iscsi_data_task *dtask = ctask->dtask; BUG_ON(!ctask->data_count); - tcp_ctask->xmstate &= ~XMSTATE_UNS_DATA; + ctask->xmstate &= ~XMSTATE_UNS_DATA; if (conn->datadgst_en) { - iscsi_data_digest_init(tcp_conn, ctask); + iscsi_data_digest_init(conn, ctask); dtask->digest = 0; } for (;;) { - int start = tcp_ctask->sent; + int start = ctask->sent; - 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; + if (iscsi_sendpage(conn, &ctask->sendbuf, &ctask->data_count, + &ctask->sent)) { + ctask->unsol_count -= ctask->sent - start; + ctask->xmstate |= XMSTATE_UNS_DATA; /* will continue with this ctask later.. */ if (conn->datadgst_en) { - crypto_digest_final(tcp_conn->data_tx_tfm, + crypto_digest_final(conn->data_tx_tfm, (u8 *)&dtask->digest); debug_tcp("tx uns data fail 0x%x\n", dtask->digest); } - return rc; + return -EAGAIN; } - BUG_ON(tcp_ctask->sent > ctask->total_length); - ctask->unsol_count -= tcp_ctask->sent - start; + BUG_ON(ctask->sent > ctask->total_length); + ctask->unsol_count -= ctask->sent - start; /* * XXX:we may run here with un-initial sendbuf. * so pass it */ - if (conn->datadgst_en && tcp_ctask->sent - start > 0) - crypto_digest_update(tcp_conn->data_tx_tfm, - &tcp_ctask->sendbuf.sg, 1); + if (conn->datadgst_en && ctask->sent - start > 0) + crypto_digest_update(conn->data_tx_tfm, + &ctask->sendbuf.sg, 1); if (!ctask->data_count) break; - iscsi_buf_init_sg(&tcp_ctask->sendbuf, - &tcp_ctask->sg[tcp_ctask->sg_count++]); + iscsi_buf_init_sg(&ctask->sendbuf, + &ctask->sg[ctask->sg_count++]); } BUG_ON(ctask->unsol_count < 0); @@ -1609,29 +1880,27 @@ handle_xmstate_uns_data(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask) */ if (ctask->unsol_count) { if (conn->datadgst_en) { - rc = iscsi_digest_final_send(conn, ctask, + if (iscsi_digest_final_send(conn, ctask, &dtask->digestbuf, - &dtask->digest, 1); - if (rc) { + &dtask->digest, 1)) { debug_tcp("send uns digest 0x%x fail\n", dtask->digest); - return rc; + return -EAGAIN; } debug_tcp("sending uns digest 0x%x, more uns\n", dtask->digest); } - tcp_ctask->xmstate |= XMSTATE_UNS_INIT; + ctask->xmstate |= XMSTATE_UNS_INIT; return 1; } - if (conn->datadgst_en && !(tcp_ctask->xmstate & XMSTATE_W_PAD)) { - rc = iscsi_digest_final_send(conn, ctask, + if (conn->datadgst_en && !(ctask->xmstate & XMSTATE_W_PAD)) { + if (iscsi_digest_final_send(conn, ctask, &dtask->digestbuf, - &dtask->digest, 1); - if (rc) { + &dtask->digest, 1)) { debug_tcp("send last uns digest 0x%x fail\n", dtask->digest); - return rc; + return -EAGAIN; } debug_tcp("sending uns digest 0x%x\n",dtask->digest); } @@ -1643,47 +1912,43 @@ static inline int handle_xmstate_sol_data(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask) { struct iscsi_session *session = conn->session; - 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; + struct iscsi_r2t_info *r2t = ctask->r2t; + struct iscsi_data_task *dtask = r2t->dtask; + int left; - tcp_ctask->xmstate &= ~XMSTATE_SOL_DATA; - tcp_ctask->dtask = dtask; + ctask->xmstate &= ~XMSTATE_SOL_DATA; + ctask->dtask = dtask; if (conn->datadgst_en) { - iscsi_data_digest_init(tcp_conn, ctask); + iscsi_data_digest_init(conn, ctask); dtask->digest = 0; } solicit_again: /* - * send Data-Out within this R2T sequence. + * send Data-Out whitnin this R2T sequence. */ if (!r2t->data_count) goto data_out_done; - rc = iscsi_sendpage(conn, &r2t->sendbuf, &r2t->data_count, &r2t->sent); - if (rc) { - tcp_ctask->xmstate |= XMSTATE_SOL_DATA; + if (iscsi_sendpage(conn, &r2t->sendbuf, &r2t->data_count, &r2t->sent)) { + ctask->xmstate |= XMSTATE_SOL_DATA; /* will continue with this ctask later.. */ if (conn->datadgst_en) { - crypto_digest_final(tcp_conn->data_tx_tfm, + crypto_digest_final(conn->data_tx_tfm, (u8 *)&dtask->digest); debug_tcp("r2t data send fail 0x%x\n", dtask->digest); } - return rc; + return -EAGAIN; } BUG_ON(r2t->data_count < 0); if (conn->datadgst_en) - crypto_digest_update(tcp_conn->data_tx_tfm, &r2t->sendbuf.sg, - 1); + crypto_digest_update(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(tcp_ctask->bad_sg == r2t->sg); + BUG_ON(ctask->bad_sg == r2t->sg); iscsi_buf_init_sg(&r2t->sendbuf, r2t->sg); r2t->sg += 1; } @@ -1699,20 +1964,19 @@ data_out_done: left = r2t->data_length - r2t->sent; if (left) { if (conn->datadgst_en) { - rc = iscsi_digest_final_send(conn, ctask, + if (iscsi_digest_final_send(conn, ctask, &dtask->digestbuf, - &dtask->digest, 1); - if (rc) { + &dtask->digest, 1)) { debug_tcp("send r2t data digest 0x%x" "fail\n", dtask->digest); - return rc; + return -EAGAIN; } debug_tcp("r2t data send digest 0x%x\n", dtask->digest); } iscsi_solicit_data_cont(conn, ctask, r2t, left); - tcp_ctask->xmstate |= XMSTATE_SOL_DATA; - tcp_ctask->xmstate &= ~XMSTATE_SOL_HDR; + ctask->xmstate |= XMSTATE_SOL_DATA; + ctask->xmstate &= ~XMSTATE_SOL_HDR; return 1; } @@ -1720,27 +1984,26 @@ data_out_done: * Done with this R2T. Check if there are more * outstanding R2Ts ready to be processed. */ - BUG_ON(tcp_ctask->r2t_data_count - r2t->data_length < 0); + BUG_ON(ctask->r2t_data_count - r2t->data_length < 0); if (conn->datadgst_en) { - rc = iscsi_digest_final_send(conn, ctask, &dtask->digestbuf, - &dtask->digest, 1); - if (rc) { + if (iscsi_digest_final_send(conn, ctask, &dtask->digestbuf, + &dtask->digest, 1)) { debug_tcp("send last r2t data digest 0x%x" "fail\n", dtask->digest); - return rc; + return -EAGAIN; } debug_tcp("r2t done dout digest 0x%x\n", dtask->digest); } - tcp_ctask->r2t_data_count -= r2t->data_length; - tcp_ctask->r2t = NULL; + ctask->r2t_data_count -= r2t->data_length; + ctask->r2t = NULL; spin_lock_bh(&session->lock); - __kfifo_put(tcp_ctask->r2tpool.queue, (void*)&r2t, sizeof(void*)); + __kfifo_put(ctask->r2tpool.queue, (void*)&r2t, sizeof(void*)); spin_unlock_bh(&session->lock); - 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; + if (__kfifo_get(ctask->r2tqueue, (void*)&r2t, sizeof(void*))) { + ctask->r2t = r2t; + ctask->xmstate |= XMSTATE_SOL_DATA; + ctask->xmstate &= ~XMSTATE_SOL_HDR; return 1; } @@ -1750,44 +2013,36 @@ data_out_done: static inline int handle_xmstate_w_pad(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; - 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; + 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; } if (conn->datadgst_en) { - crypto_digest_update(tcp_conn->data_tx_tfm, - &tcp_ctask->sendbuf.sg, 1); + crypto_digest_update(conn->data_tx_tfm, &ctask->sendbuf.sg, 1); /* imm data? */ if (!dtask) { - rc = iscsi_digest_final_send(conn, ctask, - &tcp_ctask->immbuf, - &tcp_ctask->immdigest, 1); - if (rc) { + if (iscsi_digest_final_send(conn, ctask, &ctask->immbuf, + &ctask->immdigest, 1)) { debug_tcp("send padding digest 0x%x" - "fail!\n", tcp_ctask->immdigest); - return rc; + "fail!\n", ctask->immdigest); + return -EAGAIN; } debug_tcp("done with padding, digest 0x%x\n", - tcp_ctask->datadigest); + ctask->datadigest); } else { - rc = iscsi_digest_final_send(conn, ctask, + if (iscsi_digest_final_send(conn, ctask, &dtask->digestbuf, - &dtask->digest, 1); - if (rc) { + &dtask->digest, 1)) { debug_tcp("send padding digest 0x%x" "fail\n", dtask->digest); - return rc; + return -EAGAIN; } debug_tcp("done with padding, digest 0x%x\n", dtask->digest); @@ -1798,13 +2053,12 @@ handle_xmstate_w_pad(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask) } static int -iscsi_tcp_ctask_xmit(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask) +iscsi_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, tcp_ctask->xmstate, ctask->itt); + conn->id, ctask->xmstate, ctask->itt); /* * serialize with TMF AbortTask @@ -1812,38 +2066,40 @@ iscsi_tcp_ctask_xmit(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask) if (ctask->mtask) return rc; - if (tcp_ctask->xmstate & XMSTATE_R_HDR) - return handle_xmstate_r_hdr(conn, tcp_ctask); + if (ctask->xmstate & XMSTATE_R_HDR) { + rc = handle_xmstate_r_hdr(conn, ctask); + return rc; + } - if (tcp_ctask->xmstate & XMSTATE_W_HDR) { + if (ctask->xmstate & XMSTATE_W_HDR) { rc = handle_xmstate_w_hdr(conn, ctask); if (rc) return rc; } /* XXX: for data digest xmit recover */ - if (tcp_ctask->xmstate & XMSTATE_DATA_DIGEST) { + if (ctask->xmstate & XMSTATE_DATA_DIGEST) { rc = handle_xmstate_data_digest(conn, ctask); if (rc) return rc; } - if (tcp_ctask->xmstate & XMSTATE_IMM_DATA) { + if (ctask->xmstate & XMSTATE_IMM_DATA) { rc = handle_xmstate_imm_data(conn, ctask); if (rc) return rc; } - if (tcp_ctask->xmstate & XMSTATE_UNS_HDR) { + if (ctask->xmstate & XMSTATE_UNS_HDR) { BUG_ON(!ctask->unsol_count); - tcp_ctask->xmstate &= ~XMSTATE_UNS_HDR; + ctask->xmstate &= ~XMSTATE_UNS_HDR; unsolicit_head_again: rc = handle_xmstate_uns_hdr(conn, ctask); if (rc) return rc; } - if (tcp_ctask->xmstate & XMSTATE_UNS_DATA) { + if (ctask->xmstate & XMSTATE_UNS_DATA) { rc = handle_xmstate_uns_data(conn, ctask); if (rc == 1) goto unsolicit_head_again; @@ -1852,24 +2108,23 @@ unsolicit_head_again: goto done; } - if (tcp_ctask->xmstate & XMSTATE_SOL_HDR) { + if (ctask->xmstate & XMSTATE_SOL_HDR) { struct iscsi_r2t_info *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, + ctask->xmstate &= ~XMSTATE_SOL_HDR; + ctask->xmstate |= XMSTATE_SOL_DATA; + if (!ctask->r2t) + __kfifo_get(ctask->r2tqueue, (void*)&ctask->r2t, sizeof(void*)); solicit_head_again: - r2t = tcp_ctask->r2t; + r2t = ctask->r2t; if (conn->hdrdgst_en) iscsi_hdr_digest(conn, &r2t->headbuf, - (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; + (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; } debug_scsi("sol dout [dsn %d itt 0x%x dlen %d sent %d]\n", @@ -1877,7 +2132,7 @@ solicit_head_again: r2t->sent); } - if (tcp_ctask->xmstate & XMSTATE_SOL_DATA) { + if (ctask->xmstate & XMSTATE_SOL_DATA) { rc = handle_xmstate_sol_data(conn, ctask); if (rc == 1) goto solicit_head_again; @@ -1890,432 +2145,1100 @@ 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 (tcp_ctask->xmstate == XMSTATE_W_PAD) + if (ctask->xmstate == XMSTATE_W_PAD) rc = handle_xmstate_w_pad(conn, ctask); return rc; } -static struct iscsi_cls_conn * -iscsi_tcp_conn_create(struct iscsi_cls_session *cls_session, uint32_t conn_idx) +/** + * 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_conn *conn; - struct iscsi_cls_conn *cls_conn; - struct iscsi_tcp_conn *tcp_conn; + if (unlikely(conn->suspend_tx)) { + debug_tcp("conn %d Tx suspended!\n", conn->id); + return 0; + } - cls_conn = iscsi_conn_setup(cls_session, conn_idx); - if (!cls_conn) - return NULL; - conn = cls_conn->dd_data; /* - * due to strange issues with iser these are not set - * in iscsi_conn_setup + * 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. */ - conn->max_recv_dlength = DEFAULT_MAX_RECV_DATA_SEGMENT_LENGTH; - tcp_conn = kzalloc(sizeof(*tcp_conn), GFP_KERNEL); - if (!tcp_conn) - goto tcp_conn_alloc_fail; + BUG_ON(conn->ctask && conn->mtask); - 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); + 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; + } - return cls_conn; + /* 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; -tcp_conn_alloc_fail: - iscsi_conn_teardown(cls_conn); - return NULL; -} + while (__kfifo_get(conn->mgmtqueue, (void*)&conn->mtask, + sizeof(void*))) { + if (iscsi_mtask_xmit(conn, conn->mtask)) + goto again; -static void -iscsi_tcp_release_conn(struct iscsi_conn *conn) -{ - struct iscsi_tcp_conn *tcp_conn = conn->dd_data; + 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; + } - if (!tcp_conn->sock) - return; + return 0; - sock_hold(tcp_conn->sock->sk); - iscsi_conn_restore_callbacks(tcp_conn); - sock_put(tcp_conn->sock->sk); +again: + if (unlikely(conn->suspend_tx)) + return 0; - sock_release(tcp_conn->sock); - tcp_conn->sock = NULL; - conn->recv_lock = NULL; + return -EAGAIN; } static void -iscsi_tcp_conn_destroy(struct iscsi_cls_conn *cls_conn) +iscsi_xmitworker(void *data) { - struct iscsi_conn *conn = cls_conn->dd_data; - struct iscsi_tcp_conn *tcp_conn = conn->dd_data; - int digest = 0; + struct iscsi_conn *conn = data; - if (conn->hdrdgst_en || conn->datadgst_en) - digest = 1; + /* + * 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); +} - iscsi_tcp_release_conn(conn); - iscsi_conn_teardown(cls_conn); +#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 - /* 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); - } +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; - kfree(tcp_conn); -} + sc->scsi_done = done; + sc->result = 0; -static void -iscsi_tcp_conn_stop(struct iscsi_cls_conn *cls_conn, int flag) -{ - struct iscsi_conn *conn = cls_conn->dd_data; + host = sc->device->host; + session = iscsi_hostdata(host->hostdata); + BUG_ON(host != session->host); - iscsi_conn_stop(cls_conn, flag); - iscsi_tcp_release_conn(conn); -} + spin_lock(&session->lock); -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; + 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; + } - /* 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; + /* + * 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; } - err = iscsi_conn_bind(cls_session, cls_conn, is_leading); - if (err) - return err; + conn = session->leadconn; - /* bind iSCSI connection and socket */ - tcp_conn->sock = sock; + __kfifo_get(session->cmdpool.queue, (void*)&ctask, sizeof(void*)); + BUG_ON(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; + sc->SCp.phase = session->age; + sc->SCp.ptr = (char*)ctask; + iscsi_cmd_init(conn, ctask, sc); - /* FIXME: disable Nagle's algorithm */ + __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); - /* - * 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; + 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_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; } -/* 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) +static int +iscsi_change_queue_depth(struct scsi_device *sdev, int 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); + if (depth > ISCSI_MAX_CMD_PER_LUN) + depth = ISCSI_MAX_CMD_PER_LUN; + scsi_adjust_queue_depth(sdev, scsi_get_tag_type(sdev), depth); + return sdev->queue_depth; } static int -iscsi_r2tpool_alloc(struct iscsi_session *session) +iscsi_pool_init(struct iscsi_queue *q, int max, void ***items, int item_size) { 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]; - struct iscsi_tcp_cmd_task *tcp_ctask = ctask->dd_data; - /* - * pre-allocated x4 as much r2ts to handle race when - * target acks DataOut faster than we data_xmit() queues - * could replenish r2tqueue. - */ + *items = kmalloc(max * sizeof(void*), GFP_KERNEL); + if (*items == NULL) + return -ENOMEM; - /* 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->max = max; + q->pool = kmalloc(max * sizeof(void*), GFP_KERNEL); + if (q->pool == NULL) { + 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; - } + 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; } - return 0; + for (i = 0; i < max; i++) { + q->pool[i] = kmalloc(item_size, GFP_KERNEL); + if (q->pool[i] == NULL) { + int 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; + for (j = 0; j < i; j++) + kfree(q->pool[j]); - kfifo_free(tcp_ctask->r2tqueue); - iscsi_pool_free(&tcp_ctask->r2tpool, - (void**)tcp_ctask->r2ts); + 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 -ENOMEM; + return 0; } static void -iscsi_r2tpool_free(struct iscsi_session *session) +iscsi_pool_free(struct iscsi_queue *q, void **items) { int i; - 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); - } + for (i = 0; i < q->max; i++) + kfree(items[i]); + kfree(q->pool); + kfree(items); } -static int -iscsi_conn_set_param(struct iscsi_cls_conn *cls_conn, enum iscsi_param param, - char *buf, int buflen) +static struct iscsi_cls_conn * +iscsi_conn_create(struct iscsi_cls_session *cls_session, uint32_t conn_idx) { - 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; + 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; - 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); - } + cls_conn = iscsi_create_conn(cls_session, conn_idx); + if (!cls_conn) + return NULL; + conn = cls_conn->dd_data; + memset(conn, 0, sizeof(*conn)); - return 0; -} + 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; -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; + /* 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; - switch(param) { - case ISCSI_PARAM_CONN_PORT: - mutex_lock(&conn->xmitmutex); - if (!tcp_conn->sock) { - mutex_unlock(&conn->xmitmutex); - return -EINVAL; - } + /* 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; - 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; - } + /* 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; - 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); + /* 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); - return len; + /* 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; } static void -iscsi_conn_get_stats(struct iscsi_cls_conn *cls_conn, struct iscsi_stats *stats) +iscsi_conn_destroy(struct iscsi_cls_conn *cls_conn) { struct iscsi_conn *conn = cls_conn->dd_data; - struct iscsi_tcp_conn *tcp_conn = 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 = 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; -} + struct iscsi_session *session = conn->session; + unsigned long flags; -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; + 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; - 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; + /* + * 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); - 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; + sock_hold(conn->sock->sk); + iscsi_conn_restore_callbacks(conn); + sock_put(conn->sock->sk); + sock_release(conn->sock); + conn->sock = NULL; + } - ctask->hdr = &tcp_ctask->hdr; + 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); - 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; + 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("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); + } - mtask->hdr = &tcp_mtask->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); } - if (iscsi_r2tpool_alloc(class_to_transport_session(cls_session))) - goto r2tpool_alloc_fail; + /* 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)); - return cls_session; + 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); -r2tpool_alloc_fail: - iscsi_session_teardown(cls_session); - return NULL; + kfifo_free(conn->xmitqueue); + kfifo_free(conn->writequeue); + kfifo_free(conn->immqueue); + kfifo_free(conn->mgmtqueue); + + iscsi_destroy_conn(cls_conn); } -static void iscsi_tcp_session_destroy(struct iscsi_cls_session *cls_session) +static int +iscsi_conn_bind(struct iscsi_cls_session *cls_session, + struct iscsi_cls_conn *cls_conn, uint32_t transport_fd, + int is_leading) { - iscsi_r2tpool_free(class_to_transport_session(cls_session)); - iscsi_session_teardown(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; -static struct scsi_host_template iscsi_sht = { - .name = "iSCSI Initiator over TCP/IP", - .queuecommand = iscsi_queuecommand, + /* 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(ISCSI_DTASK_DEFAULT_MAX, + mempool_alloc_slab, mempool_free_slab, 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); + } +} + +static struct scsi_host_template iscsi_sht = { + .name = "iSCSI Initiator over TCP/IP, v." + ISCSI_VERSION_STR, + .queuecommand = iscsi_queuecommand, .change_queue_depth = iscsi_change_queue_depth, .can_queue = ISCSI_XMIT_CMDS_MAX - 1, .sg_tablesize = ISCSI_SG_TABLESIZE, @@ -2327,70 +3250,401 @@ 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, - /* 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, + .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, .set_param = iscsi_conn_set_param, - .get_conn_param = iscsi_tcp_conn_get_param, + .get_conn_param = iscsi_conn_get_param, .get_session_param = iscsi_session_get_param, .start_conn = iscsi_conn_start, - .stop_conn = iscsi_tcp_conn_stop, - /* IO */ + .stop_conn = iscsi_conn_stop, .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 "iscsi_tcp: Invalid max_lun value of %u\n", - iscsi_max_lun); + printk(KERN_ERR "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 | SLAB_NO_REAP, NULL, NULL); + if (!taskcache) + return -ENOMEM; + if (!iscsi_register_transport(&iscsi_tcp_transport)) - return -ENODEV; + kmem_cache_destroy(taskcache); return 0; } @@ -2399,6 +3653,7 @@ 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 6a4ee704e..ba26741ac 100644 --- a/drivers/scsi/iscsi_tcp.h +++ b/drivers/scsi/iscsi_tcp.h @@ -2,8 +2,7 @@ * iSCSI Initiator TCP Transport * Copyright (C) 2004 Dmitry Yusupov * Copyright (C) 2004 Alex Aizman - * Copyright (C) 2005 - 2006 Mike Christie - * Copyright (C) 2006 Red Hat, Inc. All rights reserved. + * Copyright (C) 2005 Mike Christie * maintained by open-iscsi@googlegroups.com * * This program is free software; you can redistribute it and/or modify @@ -22,7 +21,20 @@ #ifndef ISCSI_TCP_H #define ISCSI_TCP_H -#include +/* 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 /* Socket's Receive state machine */ #define IN_PROGRESS_WAIT_HEADER 0x0 @@ -30,6 +42,12 @@ #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 @@ -44,14 +62,34 @@ #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 -struct socket; +#define ITT_MASK (0xfff) +#define CID_SHIFT 12 +#define CID_MASK (0xffff<irq) @@ -74,7 +75,7 @@ static int jazz_esp_detect(struct scsi_host_template *tpnt) * first assumption it is there:-) */ if (1) { - esp_dev = NULL; + esp_dev = 0; esp = esp_allocate(tpnt, (void *) esp_dev); /* Do command transfer with programmed I/O */ @@ -93,13 +94,13 @@ static int jazz_esp_detect(struct scsi_host_template *tpnt) esp->dma_setup = &dma_setup; /* Optional functions */ - esp->dma_barrier = NULL; - esp->dma_drain = NULL; - esp->dma_invalidate = NULL; - esp->dma_irq_entry = NULL; - esp->dma_irq_exit = NULL; - esp->dma_poll = NULL; - esp->dma_reset = NULL; + esp->dma_barrier = 0; + esp->dma_drain = 0; + esp->dma_invalidate = 0; + esp->dma_irq_entry = 0; + esp->dma_irq_exit = 0; + esp->dma_poll = 0; + esp->dma_reset = 0; esp->dma_led_off = &dma_led_off; esp->dma_led_on = &dma_led_on; @@ -119,7 +120,7 @@ static int jazz_esp_detect(struct scsi_host_template *tpnt) * of DMA channel, so we can use the jazz DMA functions * */ - esp->dregs = (void *) JAZZ_SCSI_DMA; + esp->dregs = JAZZ_SCSI_DMA; /* ESP register base */ esp->eregs = (struct ESP_regs *)(JAZZ_SCSI_BASE); @@ -131,7 +132,7 @@ static int jazz_esp_detect(struct scsi_host_template *tpnt) esp->esp_command_dvma = vdma_alloc(CPHYSADDR(cmd_buffer), sizeof (cmd_buffer)); esp->irq = JAZZ_SCSI_IRQ; - request_irq(JAZZ_SCSI_IRQ, esp_intr, IRQF_DISABLED, "JAZZ SCSI", + request_irq(JAZZ_SCSI_IRQ, esp_intr, SA_INTERRUPT, "JAZZ SCSI", esp->ehost); /* @@ -257,7 +258,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->request_buffer; + struct scatterlist *sg = (struct scatterlist *)sp->buffer; while(sz >= 0) { vdma_free(sg[sz].dma_address); diff --git a/drivers/scsi/lasi700.c b/drivers/scsi/lasi700.c index f0871c3ac..459a4daeb 100644 --- a/drivers/scsi/lasi700.c +++ b/drivers/scsi/lasi700.c @@ -112,7 +112,7 @@ lasi700_probe(struct parisc_device *dev) hostdata->dev = &dev->dev; dma_set_mask(&dev->dev, DMA_32BIT_MASK); - hostdata->base = ioremap_nocache(base, 0x100); + hostdata->base = ioremap(base, 0x100); hostdata->differential = 0; if (dev->id.sversion == LASI_700_SVERSION) { @@ -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, IRQF_SHARED, "lasi700", host)) { + if(request_irq(dev->irq, NCR_700_intr, SA_SHIRQ, "lasi700", host)) { printk(KERN_ERR "lasi700: request_irq failed!\n"); goto out_put_host; } diff --git a/drivers/scsi/libata-core.c b/drivers/scsi/libata-core.c index 8e3e8caf8..400e9d74a 100644 --- a/drivers/scsi/libata-core.c +++ b/drivers/scsi/libata-core.c @@ -32,6 +32,7 @@ * */ +#include #include #include #include @@ -60,42 +61,433 @@ #include "libata.h" -/* 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_busy_sleep (struct ata_port *ap, + unsigned long tmout_pat, + unsigned long tmout); +static void ata_dev_reread_id(struct ata_port *ap, struct ata_device *dev); +static void ata_dev_init_params(struct ata_port *ap, struct ata_device *dev); +static void ata_set_mode(struct ata_port *ap); +static void ata_dev_set_xfermode(struct ata_port *ap, struct ata_device *dev); +static unsigned int ata_get_mode_mask(const struct ata_port *ap, int shift); +static int fgb(u32 bitmap); +static int ata_choose_xfer_mode(const struct ata_port *ap, + u8 *xfer_mode_out, + unsigned int *xfer_shift_out); +static void __ata_qc_complete(struct ata_queued_cmd *qc); static unsigned int ata_unique_id = 1; static struct workqueue_struct *ata_wq; -struct workqueue_struct *ata_aux_wq; - -int atapi_enabled = 1; +int atapi_enabled = 0; 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"); MODULE_VERSION(DRV_VERSION); +/** + * ata_tf_load_pio - send taskfile registers to host controller + * @ap: Port to which output is sent + * @tf: ATA taskfile register set + * + * Outputs ATA taskfile to standard ATA host controller. + * + * LOCKING: + * Inherited from caller. + */ + +static void ata_tf_load_pio(struct ata_port *ap, const struct ata_taskfile *tf) +{ + struct ata_ioports *ioaddr = &ap->ioaddr; + unsigned int is_addr = tf->flags & ATA_TFLAG_ISADDR; + + if (tf->ctl != ap->last_ctl) { + outb(tf->ctl, ioaddr->ctl_addr); + ap->last_ctl = tf->ctl; + ata_wait_idle(ap); + } + + if (is_addr && (tf->flags & ATA_TFLAG_LBA48)) { + outb(tf->hob_feature, ioaddr->feature_addr); + outb(tf->hob_nsect, ioaddr->nsect_addr); + outb(tf->hob_lbal, ioaddr->lbal_addr); + outb(tf->hob_lbam, ioaddr->lbam_addr); + outb(tf->hob_lbah, ioaddr->lbah_addr); + VPRINTK("hob: feat 0x%X nsect 0x%X, lba 0x%X 0x%X 0x%X\n", + tf->hob_feature, + tf->hob_nsect, + tf->hob_lbal, + tf->hob_lbam, + tf->hob_lbah); + } + + if (is_addr) { + outb(tf->feature, ioaddr->feature_addr); + outb(tf->nsect, ioaddr->nsect_addr); + outb(tf->lbal, ioaddr->lbal_addr); + outb(tf->lbam, ioaddr->lbam_addr); + outb(tf->lbah, ioaddr->lbah_addr); + VPRINTK("feat 0x%X nsect 0x%X lba 0x%X 0x%X 0x%X\n", + tf->feature, + tf->nsect, + tf->lbal, + tf->lbam, + tf->lbah); + } + + if (tf->flags & ATA_TFLAG_DEVICE) { + outb(tf->device, ioaddr->device_addr); + VPRINTK("device 0x%X\n", tf->device); + } + + ata_wait_idle(ap); +} + +/** + * ata_tf_load_mmio - send taskfile registers to host controller + * @ap: Port to which output is sent + * @tf: ATA taskfile register set + * + * Outputs ATA taskfile to standard ATA host controller using MMIO. + * + * LOCKING: + * Inherited from caller. + */ + +static void ata_tf_load_mmio(struct ata_port *ap, const struct ata_taskfile *tf) +{ + struct ata_ioports *ioaddr = &ap->ioaddr; + unsigned int is_addr = tf->flags & ATA_TFLAG_ISADDR; + + if (tf->ctl != ap->last_ctl) { + writeb(tf->ctl, (void __iomem *) ap->ioaddr.ctl_addr); + ap->last_ctl = tf->ctl; + ata_wait_idle(ap); + } + + if (is_addr && (tf->flags & ATA_TFLAG_LBA48)) { + writeb(tf->hob_feature, (void __iomem *) ioaddr->feature_addr); + writeb(tf->hob_nsect, (void __iomem *) ioaddr->nsect_addr); + writeb(tf->hob_lbal, (void __iomem *) ioaddr->lbal_addr); + writeb(tf->hob_lbam, (void __iomem *) ioaddr->lbam_addr); + writeb(tf->hob_lbah, (void __iomem *) ioaddr->lbah_addr); + VPRINTK("hob: feat 0x%X nsect 0x%X, lba 0x%X 0x%X 0x%X\n", + tf->hob_feature, + tf->hob_nsect, + tf->hob_lbal, + tf->hob_lbam, + tf->hob_lbah); + } + + if (is_addr) { + writeb(tf->feature, (void __iomem *) ioaddr->feature_addr); + writeb(tf->nsect, (void __iomem *) ioaddr->nsect_addr); + writeb(tf->lbal, (void __iomem *) ioaddr->lbal_addr); + writeb(tf->lbam, (void __iomem *) ioaddr->lbam_addr); + writeb(tf->lbah, (void __iomem *) ioaddr->lbah_addr); + VPRINTK("feat 0x%X nsect 0x%X lba 0x%X 0x%X 0x%X\n", + tf->feature, + tf->nsect, + tf->lbal, + tf->lbam, + tf->lbah); + } + + if (tf->flags & ATA_TFLAG_DEVICE) { + writeb(tf->device, (void __iomem *) ioaddr->device_addr); + VPRINTK("device 0x%X\n", tf->device); + } + + ata_wait_idle(ap); +} + + +/** + * ata_tf_load - send taskfile registers to host controller + * @ap: Port to which output is sent + * @tf: ATA taskfile register set + * + * Outputs ATA taskfile to standard ATA host controller using MMIO + * or PIO as indicated by the ATA_FLAG_MMIO flag. + * Writes the control, feature, nsect, lbal, lbam, and lbah registers. + * Optionally (ATA_TFLAG_LBA48) writes hob_feature, hob_nsect, + * hob_lbal, hob_lbam, and hob_lbah. + * + * This function waits for idle (!BUSY and !DRQ) after writing + * registers. If the control register has a new value, this + * function also waits for idle after writing control and before + * writing the remaining registers. + * + * May be used as the tf_load() entry in ata_port_operations. + * + * LOCKING: + * Inherited from caller. + */ +void ata_tf_load(struct ata_port *ap, const struct ata_taskfile *tf) +{ + if (ap->flags & ATA_FLAG_MMIO) + ata_tf_load_mmio(ap, tf); + else + ata_tf_load_pio(ap, tf); +} + +/** + * ata_exec_command_pio - issue ATA command to host controller + * @ap: port to which command is being issued + * @tf: ATA taskfile register set + * + * Issues PIO write to ATA command register, with proper + * synchronization with interrupt handler / other threads. + * + * LOCKING: + * spin_lock_irqsave(host_set lock) + */ + +static void ata_exec_command_pio(struct ata_port *ap, const struct ata_taskfile *tf) +{ + DPRINTK("ata%u: cmd 0x%X\n", ap->id, tf->command); + + outb(tf->command, ap->ioaddr.command_addr); + ata_pause(ap); +} + + +/** + * ata_exec_command_mmio - issue ATA command to host controller + * @ap: port to which command is being issued + * @tf: ATA taskfile register set + * + * Issues MMIO write to ATA command register, with proper + * synchronization with interrupt handler / other threads. + * + * LOCKING: + * spin_lock_irqsave(host_set lock) + */ + +static void ata_exec_command_mmio(struct ata_port *ap, const struct ata_taskfile *tf) +{ + DPRINTK("ata%u: cmd 0x%X\n", ap->id, tf->command); + + writeb(tf->command, (void __iomem *) ap->ioaddr.command_addr); + ata_pause(ap); +} + + +/** + * ata_exec_command - issue ATA command to host controller + * @ap: port to which command is being issued + * @tf: ATA taskfile register set + * + * Issues PIO/MMIO write to ATA command register, with proper + * synchronization with interrupt handler / other threads. + * + * LOCKING: + * spin_lock_irqsave(host_set lock) + */ +void ata_exec_command(struct ata_port *ap, const struct ata_taskfile *tf) +{ + if (ap->flags & ATA_FLAG_MMIO) + ata_exec_command_mmio(ap, tf); + else + ata_exec_command_pio(ap, tf); +} + +/** + * ata_tf_to_host - issue ATA taskfile to host controller + * @ap: port to which command is being issued + * @tf: ATA taskfile register set + * + * Issues ATA taskfile register set to ATA host controller, + * with proper synchronization with interrupt handler and + * other threads. + * + * LOCKING: + * spin_lock_irqsave(host_set lock) + */ + +static inline void ata_tf_to_host(struct ata_port *ap, + const struct ata_taskfile *tf) +{ + ap->ops->tf_load(ap, tf); + ap->ops->exec_command(ap, tf); +} + +/** + * ata_tf_read_pio - input device's ATA taskfile shadow registers + * @ap: Port from which input is read + * @tf: ATA taskfile register set for storing input + * + * Reads ATA taskfile registers for currently-selected device + * into @tf. + * + * LOCKING: + * Inherited from caller. + */ + +static void ata_tf_read_pio(struct ata_port *ap, struct ata_taskfile *tf) +{ + struct ata_ioports *ioaddr = &ap->ioaddr; + + tf->command = ata_check_status(ap); + tf->feature = inb(ioaddr->error_addr); + tf->nsect = inb(ioaddr->nsect_addr); + tf->lbal = inb(ioaddr->lbal_addr); + tf->lbam = inb(ioaddr->lbam_addr); + tf->lbah = inb(ioaddr->lbah_addr); + tf->device = inb(ioaddr->device_addr); + + if (tf->flags & ATA_TFLAG_LBA48) { + outb(tf->ctl | ATA_HOB, ioaddr->ctl_addr); + tf->hob_feature = inb(ioaddr->error_addr); + tf->hob_nsect = inb(ioaddr->nsect_addr); + tf->hob_lbal = inb(ioaddr->lbal_addr); + tf->hob_lbam = inb(ioaddr->lbam_addr); + tf->hob_lbah = inb(ioaddr->lbah_addr); + } +} + +/** + * ata_tf_read_mmio - input device's ATA taskfile shadow registers + * @ap: Port from which input is read + * @tf: ATA taskfile register set for storing input + * + * Reads ATA taskfile registers for currently-selected device + * into @tf via MMIO. + * + * LOCKING: + * Inherited from caller. + */ + +static void ata_tf_read_mmio(struct ata_port *ap, struct ata_taskfile *tf) +{ + struct ata_ioports *ioaddr = &ap->ioaddr; + + tf->command = ata_check_status(ap); + tf->feature = readb((void __iomem *)ioaddr->error_addr); + tf->nsect = readb((void __iomem *)ioaddr->nsect_addr); + tf->lbal = readb((void __iomem *)ioaddr->lbal_addr); + tf->lbam = readb((void __iomem *)ioaddr->lbam_addr); + tf->lbah = readb((void __iomem *)ioaddr->lbah_addr); + tf->device = readb((void __iomem *)ioaddr->device_addr); + + if (tf->flags & ATA_TFLAG_LBA48) { + writeb(tf->ctl | ATA_HOB, (void __iomem *) ap->ioaddr.ctl_addr); + tf->hob_feature = readb((void __iomem *)ioaddr->error_addr); + tf->hob_nsect = readb((void __iomem *)ioaddr->nsect_addr); + tf->hob_lbal = readb((void __iomem *)ioaddr->lbal_addr); + tf->hob_lbam = readb((void __iomem *)ioaddr->lbam_addr); + tf->hob_lbah = readb((void __iomem *)ioaddr->lbah_addr); + } +} + + +/** + * ata_tf_read - input device's ATA taskfile shadow registers + * @ap: Port from which input is read + * @tf: ATA taskfile register set for storing input + * + * Reads ATA taskfile registers for currently-selected device + * into @tf. + * + * Reads nsect, lbal, lbam, lbah, and device. If ATA_TFLAG_LBA48 + * is set, also reads the hob registers. + * + * May be used as the tf_read() entry in ata_port_operations. + * + * LOCKING: + * Inherited from caller. + */ +void ata_tf_read(struct ata_port *ap, struct ata_taskfile *tf) +{ + if (ap->flags & ATA_FLAG_MMIO) + ata_tf_read_mmio(ap, tf); + else + ata_tf_read_pio(ap, tf); +} + +/** + * ata_check_status_pio - Read device status reg & clear interrupt + * @ap: port where the device is + * + * Reads ATA taskfile status register for currently-selected device + * and return its value. This also clears pending interrupts + * from this device + * + * LOCKING: + * Inherited from caller. + */ +static u8 ata_check_status_pio(struct ata_port *ap) +{ + return inb(ap->ioaddr.status_addr); +} + +/** + * ata_check_status_mmio - Read device status reg & clear interrupt + * @ap: port where the device is + * + * Reads ATA taskfile status register for currently-selected device + * via MMIO and return its value. This also clears pending interrupts + * from this device + * + * LOCKING: + * Inherited from caller. + */ +static u8 ata_check_status_mmio(struct ata_port *ap) +{ + return readb((void __iomem *) ap->ioaddr.status_addr); +} + + +/** + * ata_check_status - Read device status reg & clear interrupt + * @ap: port where the device is + * + * Reads ATA taskfile status register for currently-selected device + * and return its value. This also clears pending interrupts + * from this device + * + * May be used as the check_status() entry in ata_port_operations. + * + * LOCKING: + * Inherited from caller. + */ +u8 ata_check_status(struct ata_port *ap) +{ + if (ap->flags & ATA_FLAG_MMIO) + return ata_check_status_mmio(ap); + return ata_check_status_pio(ap); +} + + +/** + * ata_altstatus - Read device alternate status reg + * @ap: port where the device is + * + * Reads ATA taskfile alternate status register for + * currently-selected device and return its value. + * + * Note: may NOT be used as the check_altstatus() entry in + * ata_port_operations. + * + * LOCKING: + * Inherited from caller. + */ +u8 ata_altstatus(struct ata_port *ap) +{ + if (ap->ops->check_altstatus) + return ap->ops->check_altstatus(ap); + + if (ap->flags & ATA_FLAG_MMIO) + return readb((void __iomem *)ap->ioaddr.altstatus_addr); + return inb(ap->ioaddr.altstatus_addr); +} + /** * ata_tf_to_fis - Convert ATA taskfile to SATA FIS structure @@ -202,7 +594,7 @@ static const u8 ata_rw_cmds[] = { * ata_rwcmd_protocol - set taskfile r/w commands and protocol * @qc: command to examine and configure * - * Examine the device configuration and tf->flags to calculate + * Examine the device configuration and tf->flags to calculate * the proper read/write commands and protocol to use. * * LOCKING: @@ -215,7 +607,7 @@ int ata_rwcmd_protocol(struct ata_queued_cmd *qc) u8 cmd; int index, fua, lba48, write; - + fua = (tf->flags & ATA_TFLAG_FUA) ? 4 : 0; lba48 = (tf->flags & ATA_TFLAG_LBA48) ? 2 : 0; write = (tf->flags & ATA_TFLAG_WRITE) ? 1 : 0; @@ -240,216 +632,83 @@ int ata_rwcmd_protocol(struct ata_queued_cmd *qc) return -1; } +static const char * const xfer_mode_str[] = { + "UDMA/16", + "UDMA/25", + "UDMA/33", + "UDMA/44", + "UDMA/66", + "UDMA/100", + "UDMA/133", + "UDMA7", + "MWDMA0", + "MWDMA1", + "MWDMA2", + "PIO0", + "PIO1", + "PIO2", + "PIO3", + "PIO4", +}; + /** - * ata_pack_xfermask - Pack pio, mwdma and udma masks into xfer_mask - * @pio_mask: pio_mask - * @mwdma_mask: mwdma_mask - * @udma_mask: udma_mask + * ata_udma_string - convert UDMA bit offset to string + * @mask: mask of bits supported; only highest bit counts. * - * Pack @pio_mask, @mwdma_mask and @udma_mask into a single - * unsigned int xfer_mask. + * Determine string which represents the highest speed + * (highest bit in @udma_mask). * * LOCKING: * None. * * RETURNS: - * Packed xfer_mask. + * Constant C string representing highest speed listed in + * @udma_mask, or the constant C string "". */ -static unsigned int ata_pack_xfermask(unsigned int pio_mask, - unsigned int mwdma_mask, - unsigned int udma_mask) -{ - return ((pio_mask << ATA_SHIFT_PIO) & ATA_MASK_PIO) | - ((mwdma_mask << ATA_SHIFT_MWDMA) & ATA_MASK_MWDMA) | - ((udma_mask << ATA_SHIFT_UDMA) & ATA_MASK_UDMA); -} -/** - * ata_unpack_xfermask - Unpack xfer_mask into pio, mwdma and udma masks - * @xfer_mask: xfer_mask to unpack - * @pio_mask: resulting pio_mask - * @mwdma_mask: resulting mwdma_mask - * @udma_mask: resulting udma_mask - * - * Unpack @xfer_mask into @pio_mask, @mwdma_mask and @udma_mask. - * Any NULL distination masks will be ignored. - */ -static void ata_unpack_xfermask(unsigned int xfer_mask, - unsigned int *pio_mask, - unsigned int *mwdma_mask, - unsigned int *udma_mask) +static const char *ata_mode_string(unsigned int mask) { - if (pio_mask) - *pio_mask = (xfer_mask & ATA_MASK_PIO) >> ATA_SHIFT_PIO; - if (mwdma_mask) - *mwdma_mask = (xfer_mask & ATA_MASK_MWDMA) >> ATA_SHIFT_MWDMA; - if (udma_mask) - *udma_mask = (xfer_mask & ATA_MASK_UDMA) >> ATA_SHIFT_UDMA; -} + int i; -static const struct ata_xfer_ent { - int shift, bits; - u8 base; -} ata_xfer_tbl[] = { - { ATA_SHIFT_PIO, ATA_BITS_PIO, XFER_PIO_0 }, - { ATA_SHIFT_MWDMA, ATA_BITS_MWDMA, XFER_MW_DMA_0 }, - { ATA_SHIFT_UDMA, ATA_BITS_UDMA, XFER_UDMA_0 }, - { -1, }, -}; + for (i = 7; i >= 0; i--) + if (mask & (1 << i)) + goto out; + for (i = ATA_SHIFT_MWDMA + 2; i >= ATA_SHIFT_MWDMA; i--) + if (mask & (1 << i)) + goto out; + for (i = ATA_SHIFT_PIO + 4; i >= ATA_SHIFT_PIO; i--) + if (mask & (1 << i)) + goto out; -/** - * ata_xfer_mask2mode - Find matching XFER_* for the given xfer_mask - * @xfer_mask: xfer_mask of interest - * - * Return matching XFER_* value for @xfer_mask. Only the highest - * bit of @xfer_mask is considered. - * - * LOCKING: - * None. - * - * RETURNS: - * Matching XFER_* value, 0 if no match found. - */ -static u8 ata_xfer_mask2mode(unsigned int xfer_mask) -{ - int highbit = fls(xfer_mask) - 1; - const struct ata_xfer_ent *ent; + return ""; - for (ent = ata_xfer_tbl; ent->shift >= 0; ent++) - if (highbit >= ent->shift && highbit < ent->shift + ent->bits) - return ent->base + highbit - ent->shift; - return 0; +out: + return xfer_mode_str[i]; } /** - * ata_xfer_mode2mask - Find matching xfer_mask for XFER_* - * @xfer_mode: XFER_* of interest + * ata_pio_devchk - PATA device presence detection + * @ap: ATA channel to examine + * @device: Device to examine (starting at zero) + * + * This technique was originally described in + * Hale Landis's ATADRVR (www.ata-atapi.com), and + * later found its way into the ATA/ATAPI spec. * - * Return matching xfer_mask for @xfer_mode. + * Write a pattern to the ATA shadow registers, + * and if a device is present, it will respond by + * correctly storing and echoing back the + * ATA shadow register contents. * * LOCKING: - * None. - * - * RETURNS: - * Matching xfer_mask, 0 if no match found. + * caller. */ -static unsigned int ata_xfer_mode2mask(u8 xfer_mode) + +static unsigned int ata_pio_devchk(struct ata_port *ap, + unsigned int device) { - const struct ata_xfer_ent *ent; - - for (ent = ata_xfer_tbl; ent->shift >= 0; ent++) - if (xfer_mode >= ent->base && xfer_mode < ent->base + ent->bits) - return 1 << (ent->shift + xfer_mode - ent->base); - return 0; -} - -/** - * ata_xfer_mode2shift - Find matching xfer_shift for XFER_* - * @xfer_mode: XFER_* of interest - * - * Return matching xfer_shift for @xfer_mode. - * - * LOCKING: - * None. - * - * RETURNS: - * Matching xfer_shift, -1 if no match found. - */ -static int ata_xfer_mode2shift(unsigned int xfer_mode) -{ - const struct ata_xfer_ent *ent; - - for (ent = ata_xfer_tbl; ent->shift >= 0; ent++) - if (xfer_mode >= ent->base && xfer_mode < ent->base + ent->bits) - return ent->shift; - return -1; -} - -/** - * ata_mode_string - convert xfer_mask to string - * @xfer_mask: mask of bits supported; only highest bit counts. - * - * Determine string which represents the highest speed - * (highest bit in @modemask). - * - * LOCKING: - * None. - * - * RETURNS: - * Constant C string representing highest speed listed in - * @mode_mask, or the constant C string "". - */ -static const char *ata_mode_string(unsigned int xfer_mask) -{ - static const char * const xfer_mode_str[] = { - "PIO0", - "PIO1", - "PIO2", - "PIO3", - "PIO4", - "MWDMA0", - "MWDMA1", - "MWDMA2", - "UDMA/16", - "UDMA/25", - "UDMA/33", - "UDMA/44", - "UDMA/66", - "UDMA/100", - "UDMA/133", - "UDMA7", - }; - int highbit; - - highbit = fls(xfer_mask) - 1; - if (highbit >= 0 && highbit < ARRAY_SIZE(xfer_mode_str)) - return xfer_mode_str[highbit]; - return ""; -} - -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_enabled(dev) && ata_msg_drv(dev->ap)) { - ata_dev_printk(dev, KERN_WARNING, "disabled\n"); - dev->class++; - } -} - -/** - * ata_pio_devchk - PATA device presence detection - * @ap: ATA channel to examine - * @device: Device to examine (starting at zero) - * - * This technique was originally described in - * Hale Landis's ATADRVR (www.ata-atapi.com), and - * later found its way into the ATA/ATAPI spec. - * - * Write a pattern to the ATA shadow registers, - * and if a device is present, it will respond by - * correctly storing and echoing back the - * ATA shadow register contents. - * - * LOCKING: - * caller. - */ - -static unsigned int ata_pio_devchk(struct ata_port *ap, - unsigned int device) -{ - struct ata_ioports *ioaddr = &ap->ioaddr; - u8 nsect, lbal; + struct ata_ioports *ioaddr = &ap->ioaddr; + u8 nsect, lbal; ap->ops->dev_select(ap, device); @@ -579,7 +838,6 @@ unsigned int ata_dev_classify(const struct ata_taskfile *tf) * ata_dev_try_classify - Parse returned ATA device signature * @ap: ATA channel to examine * @device: Device to examine (starting at zero) - * @r_err: Value of error register on completion * * After an event -- SRST, E.D.D., or SATA COMRESET -- occurs, * an ATA/ATAPI-defined set of values is placed in the ATA @@ -592,14 +850,11 @@ unsigned int ata_dev_classify(const struct ata_taskfile *tf) * * LOCKING: * caller. - * - * RETURNS: - * Device type - %ATA_DEV_ATA, %ATA_DEV_ATAPI or %ATA_DEV_NONE. */ -static unsigned int -ata_dev_try_classify(struct ata_port *ap, unsigned int device, u8 *r_err) +static u8 ata_dev_try_classify(struct ata_port *ap, unsigned int device) { + struct ata_device *dev = &ap->device[device]; struct ata_taskfile tf; unsigned int class; u8 err; @@ -610,8 +865,8 @@ ata_dev_try_classify(struct ata_port *ap, unsigned int device, u8 *r_err) ap->ops->tf_read(ap, &tf); err = tf.feature; - if (r_err) - *r_err = err; + + dev->class = ATA_DEV_NONE; /* see if device passed diags */ if (err == 1) @@ -619,20 +874,22 @@ ata_dev_try_classify(struct ata_port *ap, unsigned int device, u8 *r_err) else if ((device == 0) && (err == 0x81)) /* do nothing */ ; else - return ATA_DEV_NONE; + return err; - /* determine if device is ATA or ATAPI */ + /* determine if device if ATA or ATAPI */ class = ata_dev_classify(&tf); - if (class == ATA_DEV_UNKNOWN) - return ATA_DEV_NONE; + return err; if ((class == ATA_DEV_ATA) && (ata_chk_status(ap) == 0)) - return ATA_DEV_NONE; - return class; + return err; + + dev->class = class; + + return err; } /** - * ata_id_string - Convert IDENTIFY DEVICE page into string + * ata_dev_id_string - Convert IDENTIFY DEVICE page into string * @id: IDENTIFY DEVICE results we will examine * @s: string into which data is output * @ofs: offset into identify device page @@ -646,8 +903,8 @@ ata_dev_try_classify(struct ata_port *ap, unsigned int device, u8 *r_err) * caller. */ -void ata_id_string(const u16 *id, unsigned char *s, - unsigned int ofs, unsigned int len) +void ata_dev_id_string(const u16 *id, unsigned char *s, + unsigned int ofs, unsigned int len) { unsigned int c; @@ -665,49 +922,6 @@ void ata_id_string(const u16 *id, unsigned char *s, } } -/** - * ata_id_c_string - Convert IDENTIFY DEVICE page into C string - * @id: IDENTIFY DEVICE results we will examine - * @s: string into which data is output - * @ofs: offset into identify device page - * @len: length of string to return. must be an odd number. - * - * This function is identical to ata_id_string except that it - * trims trailing spaces and terminates the resulting string with - * null. @len must be actual maximum length (even number) + 1. - * - * LOCKING: - * caller. - */ -void ata_id_c_string(const u16 *id, unsigned char *s, - unsigned int ofs, unsigned int len) -{ - unsigned char *p; - - WARN_ON(!(len & 1)); - - ata_id_string(id, s, ofs, len - 1); - - p = s + strnlen(s, len - 1); - while (p > s && p[-1] == ' ') - p--; - *p = '\0'; -} - -static u64 ata_id_n_sectors(const u16 *id) -{ - if (ata_id_has_lba(id)) { - if (ata_id_has_lba48(id)) - return ata_id_u64(id, 100); - else - return ata_id_u32(id, 60); - } else { - if (ata_id_current_chs_valid(id)) - return ata_id_u32(id, 57); - else - return id[1] * id[3] * id[6]; - } -} /** * ata_noop_dev_select - Select device 0/1 on ATA bus @@ -780,9 +994,8 @@ 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) { - 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); + VPRINTK("ENTER, ata%u: device %u, wait %u\n", + ap->id, device, wait); if (wait) ata_wait_idle(ap); @@ -798,184 +1011,97 @@ void ata_dev_select(struct ata_port *ap, unsigned int device, /** * ata_dump_id - IDENTIFY DEVICE info debugging output - * @id: IDENTIFY DEVICE page to dump + * @dev: Device whose IDENTIFY DEVICE page we will dump * - * Dump selected 16-bit words from the given IDENTIFY DEVICE - * page. + * Dump selected 16-bit words from a detected device's + * IDENTIFY PAGE page. * * LOCKING: * caller. */ -static inline void ata_dump_id(const u16 *id) +static inline void ata_dump_id(const struct ata_device *dev) { DPRINTK("49==0x%04x " "53==0x%04x " "63==0x%04x " "64==0x%04x " "75==0x%04x \n", - id[49], - id[53], - id[63], - id[64], - id[75]); + dev->id[49], + dev->id[53], + dev->id[63], + dev->id[64], + dev->id[75]); DPRINTK("80==0x%04x " "81==0x%04x " "82==0x%04x " "83==0x%04x " "84==0x%04x \n", - id[80], - id[81], - id[82], - id[83], - id[84]); + dev->id[80], + dev->id[81], + dev->id[82], + dev->id[83], + dev->id[84]); DPRINTK("88==0x%04x " "93==0x%04x\n", - id[88], - id[93]); + dev->id[88], + dev->id[93]); } -/** - * ata_id_xfermask - Compute xfermask from the given IDENTIFY data - * @id: IDENTIFY data to compute xfer mask from - * - * Compute the xfermask for this device. This is not as trivial - * as it seems if we must consider early devices correctly. - * - * FIXME: pre IDE drive timing (do we care ?). - * - * LOCKING: - * None. +/* + * Compute the PIO modes available for this device. This is not as + * trivial as it seems if we must consider early devices correctly. * - * RETURNS: - * Computed xfermask + * FIXME: pre IDE drive timing (do we care ?). */ -static unsigned int ata_id_xfermask(const u16 *id) + +static unsigned int ata_pio_modes(const struct ata_device *adev) { - unsigned int pio_mask, mwdma_mask, udma_mask; + u16 modes; /* Usual case. Word 53 indicates word 64 is valid */ - if (id[ATA_ID_FIELD_VALID] & (1 << 1)) { - pio_mask = id[ATA_ID_PIO_MODES] & 0x03; - pio_mask <<= 3; - pio_mask |= 0x7; - } else { - /* If word 64 isn't valid then Word 51 high byte holds - * the PIO timing number for the maximum. Turn it into - * a mask. - */ - pio_mask = (2 << (id[ATA_ID_OLD_PIO_MODES] & 0xFF)) - 1 ; - - /* But wait.. there's more. Design your standards by - * committee and you too can get a free iordy field to - * process. However its the speeds not the modes that - * are supported... Note drivers using the timing API - * will get this right anyway - */ + if (adev->id[ATA_ID_FIELD_VALID] & (1 << 1)) { + modes = adev->id[ATA_ID_PIO_MODES] & 0x03; + modes <<= 3; + modes |= 0x7; + return modes; } - mwdma_mask = id[ATA_ID_MWDMA_MODES] & 0x07; - - udma_mask = 0; - if (id[ATA_ID_FIELD_VALID] & (1 << 2)) - udma_mask = id[ATA_ID_UDMA_MODES] & 0xff; - - return ata_pack_xfermask(pio_mask, mwdma_mask, udma_mask); -} - -/** - * ata_port_queue_task - Queue port_task - * @ap: The ata_port to queue port_task for - * @fn: workqueue function to be scheduled - * @data: data value to pass to workqueue function - * @delay: delay time for workqueue function - * - * Schedule @fn(@data) for execution after @delay jiffies using - * port_task. There is one port_task per port and it's the - * user(low level driver)'s responsibility to make sure that only - * one task is active at any given time. - * - * libata core layer takes care of synchronization between - * port_task and EH. ata_port_queue_task() may be ignored for EH - * synchronization. - * - * LOCKING: - * Inherited from caller. - */ -void ata_port_queue_task(struct ata_port *ap, void (*fn)(void *), void *data, - unsigned long delay) -{ - int rc; - - if (ap->pflags & ATA_PFLAG_FLUSH_PORT_TASK) - return; - - PREPARE_WORK(&ap->port_task, fn, data); - - if (!delay) - rc = queue_work(ata_wq, &ap->port_task); - else - rc = queue_delayed_work(ata_wq, &ap->port_task, delay); - - /* rc == 0 means that another user is using port task */ - WARN_ON(rc == 0); + /* If word 64 isn't valid then Word 51 high byte holds the PIO timing + number for the maximum. Turn it into a mask and return it */ + modes = (2 << ((adev->id[ATA_ID_OLD_PIO_MODES] >> 8) & 0xFF)) - 1 ; + return modes; + /* But wait.. there's more. Design your standards by committee and + you too can get a free iordy field to process. However its the + speeds not the modes that are supported... Note drivers using the + timing API will get this right anyway */ } -/** - * ata_port_flush_task - Flush port_task - * @ap: The ata_port to flush port_task for - * - * After this function completes, port_task is guranteed not to - * be running or scheduled. - * - * LOCKING: - * Kernel thread context (may sleep) - */ -void ata_port_flush_task(struct ata_port *ap) -{ - unsigned long flags; - - DPRINTK("ENTER\n"); - - 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); - - /* - * At this point, if a task is running, it's guaranteed to see - * the FLUSH flag; thus, it will never queue pio tasks again. - * Cancel and flush. - */ - if (!cancel_delayed_work(&ap->port_task)) { - if (ata_msg_ctl(ap)) - ata_port_printk(ap, KERN_DEBUG, "%s: flush #2\n", - __FUNCTION__); - flush_workqueue(ata_wq); - } - - spin_lock_irqsave(ap->lock, flags); - ap->pflags &= ~ATA_PFLAG_FLUSH_PORT_TASK; - spin_unlock_irqrestore(ap->lock, flags); - - if (ata_msg_ctl(ap)) - ata_port_printk(ap, KERN_DEBUG, "%s: EXIT\n", __FUNCTION__); -} +struct ata_exec_internal_arg { + unsigned int err_mask; + struct ata_taskfile *tf; + struct completion *waiting; +}; -void ata_qc_complete_internal(struct ata_queued_cmd *qc) +int ata_qc_complete_internal(struct ata_queued_cmd *qc) { - struct completion *waiting = qc->private_data; + struct ata_exec_internal_arg *arg = qc->private_data; + struct completion *waiting = arg->waiting; + if (!(qc->err_mask & ~AC_ERR_DEV)) + qc->ap->ops->tf_read(qc->ap, arg->tf); + arg->err_mask = qc->err_mask; + arg->waiting = NULL; complete(waiting); + + return 0; } /** * ata_exec_internal - execute libata internal command + * @ap: Port to which the command is sent * @dev: Device to which the command is sent * @tf: Taskfile registers for the command and the result - * @cdb: CDB for packet command * @dma_dir: Data tranfer direction of the command * @buf: Data buffer of the command * @buflen: Length of data buffer @@ -988,176 +1114,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 */ -unsigned ata_exec_internal(struct ata_device *dev, - struct ata_taskfile *tf, const u8 *cdb, - int dma_dir, void *buf, unsigned int buflen) + +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) { - struct ata_port *ap = dev->ap; u8 command = tf->command; struct ata_queued_cmd *qc; - unsigned int tag, preempted_tag; - u32 preempted_sactive, preempted_qc_active; - DECLARE_COMPLETION_ONSTACK(wait); + DECLARE_COMPLETION(wait); unsigned long flags; - unsigned int err_mask; - int rc; - - spin_lock_irqsave(ap->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 */ + struct ata_exec_internal_arg arg; - /* 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); + spin_lock_irqsave(&ap->host_set->lock, flags); - qc->tag = tag; - qc->scsicmd = NULL; - qc->ap = ap; - qc->dev = dev; - ata_qc_reinit(qc); + qc = ata_qc_new_init(ap, dev); + BUG_ON(qc == NULL); - 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); qc->nsect = buflen / ATA_SECT_SIZE; } - qc->private_data = &wait; + arg.waiting = &wait; + arg.tf = tf; + qc->private_data = &arg; qc->complete_fn = ata_qc_complete_internal; - ata_qc_issue(qc); - - spin_unlock_irqrestore(ap->lock, flags); - - rc = wait_for_completion_timeout(&wait, ata_probe_timeout); + if (ata_qc_issue(qc)) + goto issue_fail; - ata_port_flush_task(ap); + spin_unlock_irqrestore(&ap->host_set->lock, flags); - if (!rc) { - spin_lock_irqsave(ap->lock, flags); + if (!wait_for_completion_timeout(&wait, ATA_TMOUT_INTERNAL)) { + spin_lock_irqsave(&ap->host_set->lock, flags); /* We're racing with irq here. If we lose, the * following test prevents us from completing the qc - * twice. If we win, the port is frozen and will be - * cleaned up by ->post_internal_cmd(). + * again. If completion irq occurs after here but + * before the caller cleans up, it will result in a + * spurious interrupt. We can live with that. */ - if (qc->flags & ATA_QCFLAG_ACTIVE) { - 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); + if (arg.waiting) { + qc->err_mask = AC_ERR_OTHER; + ata_qc_complete(qc); + printk(KERN_WARNING "ata%u: qc timeout (cmd 0x%x)\n", + ap->id, command); } - 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; + spin_unlock_irqrestore(&ap->host_set->lock, flags); } - /* finish up */ - spin_lock_irqsave(ap->lock, flags); - - *tf = qc->result_tf; - err_mask = qc->err_mask; + return arg.err_mask; + issue_fail: 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 - * here, fail the command with AC_ERR_SYSTEM and reenable the - * port. - * - * Note that this doesn't change any behavior as internal - * command failure results in disabling the device in the - * higher layer for LLDDs without new reset/EH callbacks. - * - * Kill the following code as soon as those drivers are fixed. - */ - 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); + spin_unlock_irqrestore(&ap->host_set->lock, flags); + return AC_ERR_OTHER; } /** @@ -1177,7 +1193,7 @@ unsigned int ata_pio_need_iordy(const struct ata_device *adev) return 0; if (speed > 2) return 1; - + /* If we have no drive specific rule, then PIO 2 is non IORDY */ if (adev->id[ATA_ID_FIELD_VALID] & 2) { /* EIDE */ @@ -1194,80 +1210,137 @@ unsigned int ata_pio_need_iordy(const struct ata_device *adev) } /** - * ata_dev_read_id - Read ID data from the specified device - * @dev: target device - * @p_class: pointer to class of the target device (may be changed) - * @post_reset: is this read ID post-reset? - * @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 - * devices. This function also issues ATA_CMD_INIT_DEV_PARAMS - * for pre-ATA4 drives. + * ata_dev_identify - obtain IDENTIFY x DEVICE page + * @ap: port on which device we wish to probe resides + * @device: device bus address, starting at zero + * + * Following bus reset, we issue the IDENTIFY [PACKET] DEVICE + * command, and read back the 512-byte device information page. + * The device information page is fed to us via the standard + * PIO-IN protocol, but we hand-code it here. (TODO: investigate + * using standard PIO-IN paths) + * + * After reading the device information page, we use several + * bits of information from it to initialize data structures + * that will be used during the lifetime of the ata_device. + * Other data from the info page is used to disqualify certain + * older ATA devices we do not wish to support. * * LOCKING: - * Kernel thread context (may sleep) - * - * RETURNS: - * 0 on success, -errno otherwise. + * Inherited from caller. Some functions called by this function + * obtain the host_set lock. */ -int ata_dev_read_id(struct ata_device *dev, unsigned int *p_class, - int post_reset, u16 *id) + +static void ata_dev_identify(struct ata_port *ap, unsigned int device) { - struct ata_port *ap = dev->ap; - unsigned int class = *p_class; + struct ata_device *dev = &ap->device[device]; + unsigned int major_version; + u16 tmp; + unsigned long xfer_modes; + unsigned int using_edd; struct ata_taskfile tf; - unsigned int err_mask = 0; - const char *reason; + unsigned int err_mask; int rc; - if (ata_msg_ctl(ap)) - ata_dev_printk(dev, KERN_DEBUG, "%s: ENTER, host %u, dev %u\n", - __FUNCTION__, ap->id, dev->devno); + if (!ata_dev_present(dev)) { + DPRINTK("ENTER/EXIT (host %u, dev %u) -- nodev\n", + ap->id, device); + return; + } + + if (ap->flags & (ATA_FLAG_SRST | ATA_FLAG_SATA_RESET)) + using_edd = 0; + else + using_edd = 1; + + DPRINTK("ENTER, host %u, dev %u\n", ap->id, device); - ata_dev_select(ap, dev->devno, 1, 1); /* select device 0/1 */ + assert (dev->class == ATA_DEV_ATA || dev->class == ATA_DEV_ATAPI || + dev->class == ATA_DEV_NONE); - retry: - ata_tf_init(dev, &tf); + ata_dev_select(ap, device, 1, 1); /* select device 0/1 */ - switch (class) { - case ATA_DEV_ATA: +retry: + ata_tf_init(ap, &tf, device); + + if (dev->class == ATA_DEV_ATA) { tf.command = ATA_CMD_ID_ATA; - break; - case ATA_DEV_ATAPI: + DPRINTK("do ATA identify\n"); + } else { tf.command = ATA_CMD_ID_ATAPI; - break; - default: - rc = -ENODEV; - reason = "unsupported class"; - goto err_out; + DPRINTK("do ATAPI identify\n"); } tf.protocol = ATA_PROT_PIO; - err_mask = ata_exec_internal(dev, &tf, NULL, DMA_FROM_DEVICE, - id, sizeof(id[0]) * ATA_ID_WORDS); + err_mask = ata_exec_internal(ap, dev, &tf, DMA_FROM_DEVICE, + dev->id, sizeof(dev->id)); + if (err_mask) { - rc = -EIO; - reason = "I/O error"; + if (err_mask & ~AC_ERR_DEV) + goto err_out; + + /* + * arg! EDD works for all test cases, but seems to return + * the ATA signature for some ATAPI devices. Until the + * reason for this is found and fixed, we fix up the mess + * here. If IDENTIFY DEVICE returns command aborted + * (as ATAPI devices do), then we issue an + * IDENTIFY PACKET DEVICE. + * + * ATA software reset (SRST, the default) does not appear + * to have this problem. + */ + if ((using_edd) && (dev->class == ATA_DEV_ATA)) { + u8 err = tf.feature; + if (err & ATA_ABORTED) { + dev->class = ATA_DEV_ATAPI; + goto retry; + } + } goto err_out; } - swap_buf_le16(id, ATA_ID_WORDS); + swap_buf_le16(dev->id, ATA_ID_WORDS); - /* sanity check */ - rc = -EINVAL; - reason = "device reports illegal type"; + /* print device capabilities */ + 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, device, dev->id[49], + dev->id[82], dev->id[83], dev->id[84], + dev->id[85], dev->id[86], dev->id[87], + dev->id[88]); - 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; + /* + * common ATA, ATAPI feature tests + */ + + /* we require DMA support (bits 8 of word 49) */ + if (!ata_id_has_dma(dev->id)) { + printk(KERN_DEBUG "ata%u: no dma\n", ap->id); + goto err_out_nosup; } - if (post_reset && class == ATA_DEV_ATA) { + /* quick-n-dirty find max transfer mode; for printk only */ + xfer_modes = dev->id[ATA_ID_UDMA_MODES]; + if (!xfer_modes) + xfer_modes = (dev->id[ATA_ID_MWDMA_MODES]) << ATA_SHIFT_MWDMA; + if (!xfer_modes) + xfer_modes = ata_pio_modes(dev); + + ata_dump_id(dev); + + /* ATA-specific feature tests */ + if (dev->class == ATA_DEV_ATA) { + if (!ata_id_is_ata(dev->id)) /* sanity check */ + goto err_out_nosup; + + /* get major version */ + tmp = dev->id[ATA_ID_MAJOR_VER]; + for (major_version = 14; major_version >= 1; major_version--) + if (tmp & (1 << major_version)) + break; + /* * The exact sequence expected by certain pre-ATA4 drives is: * SRST RESET @@ -1276,246 +1349,122 @@ int ata_dev_read_id(struct ata_device *dev, unsigned int *p_class, * anything else.. * 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(dev, id[3], id[6]); - if (err_mask) { - rc = -EIO; - reason = "INIT_DEV_PARAMS failed"; - goto err_out; - } + if (major_version < 4 || (!ata_id_has_lba(dev->id))) { + ata_dev_init_params(ap, dev); /* current CHS translation info (id[53-58]) might be * changed. reread the identify device info. */ - post_reset = 0; - goto retry; + ata_dev_reread_id(ap, dev); } - } - *p_class = class; + if (ata_id_has_lba(dev->id)) { + dev->flags |= ATA_DFLAG_LBA; - return 0; + if (ata_id_has_lba48(dev->id)) { + dev->flags |= ATA_DFLAG_LBA48; + dev->n_sectors = ata_id_u64(dev->id, 100); + } else { + dev->n_sectors = ata_id_u32(dev->id, 60); + } - err_out: - 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; -} + /* print device info to dmesg */ + printk(KERN_INFO "ata%u: dev %u ATA-%d, max %s, %Lu sectors:%s\n", + ap->id, device, + major_version, + ata_mode_string(xfer_modes), + (unsigned long long)dev->n_sectors, + dev->flags & ATA_DFLAG_LBA48 ? " LBA48" : " LBA"); + } else { + /* CHS */ -static inline u8 ata_dev_knobble(struct ata_device *dev) -{ - return ((dev->ap->cbl == ATA_CBL_SATA) && (!ata_id_is_sata(dev->id))); -} + /* Default translation */ + dev->cylinders = dev->id[1]; + dev->heads = dev->id[3]; + dev->sectors = dev->id[6]; + dev->n_sectors = dev->cylinders * dev->heads * dev->sectors; -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_current_chs_valid(dev->id)) { + /* Current CHS translation is valid. */ + dev->cylinders = dev->id[54]; + dev->heads = dev->id[55]; + dev->sectors = dev->id[56]; + + dev->n_sectors = ata_id_u32(dev->id, 57); + } - if (!ata_id_has_ncq(dev->id)) { - desc[0] = '\0'; - return; - } + /* print device info to dmesg */ + printk(KERN_INFO "ata%u: dev %u ATA-%d, max %s, %Lu sectors: CHS %d/%d/%d\n", + ap->id, device, + major_version, + ata_mode_string(xfer_modes), + (unsigned long long)dev->n_sectors, + (int)dev->cylinders, (int)dev->heads, (int)dev->sectors); + + } - 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 - * @dev: Target device to configure - * @print_info: Enable device info printout - * - * Configure @dev according to @dev->id. Generic and low-level - * driver specific fixups are also applied. - * - * LOCKING: - * Kernel thread context (may sleep) - * - * RETURNS: - * 0 on success, -errno otherwise - */ -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 rc; - - 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; - } - - 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 (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; - dev->max_sectors = 0; - dev->cdb_len = 0; - dev->n_sectors = 0; - dev->cylinders = 0; - dev->heads = 0; - dev->sectors = 0; - - /* - * common ATA, ATAPI feature tests - */ - - /* find max transfer mode; for printk only */ - xfer_mask = ata_id_xfermask(id); - - if (ata_msg_probe(ap)) - ata_dump_id(id); - - /* ATA-specific feature tests */ - if (dev->class == ATA_DEV_ATA) { - dev->n_sectors = ata_id_n_sectors(id); - - if (ata_id_has_lba(id)) { - const char *lba_desc; - char ncq_desc[20]; - - lba_desc = "LBA"; - dev->flags |= ATA_DFLAG_LBA; - if (ata_id_has_lba48(id)) { - dev->flags |= ATA_DFLAG_LBA48; - lba_desc = "LBA48"; - } - - /* config NCQ */ - ata_dev_config_ncq(dev, ncq_desc, sizeof(ncq_desc)); - - /* print device info to dmesg */ - 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 */ - - /* Default translation */ - dev->cylinders = id[1]; - dev->heads = id[3]; - dev->sectors = id[6]; - - if (ata_id_current_chs_valid(id)) { - /* Current CHS translation is valid. */ - dev->cylinders = id[54]; - dev->heads = id[55]; - dev->sectors = id[56]; - } - - /* print device info to dmesg */ - 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; + ap->host->max_cmd_len = 16; } /* ATAPI-specific feature tests */ else if (dev->class == ATA_DEV_ATAPI) { - char *cdb_intr_string = ""; + if (ata_id_is_ata(dev->id)) /* sanity check */ + goto err_out_nosup; - rc = atapi_cdb_len(id); + rc = atapi_cdb_len(dev->id); if ((rc < 12) || (rc > ATAPI_CDB_LEN)) { - if (ata_msg_warn(ap)) - ata_dev_printk(dev, KERN_WARNING, - "unsupported CDB len\n"); - rc = -EINVAL; + printk(KERN_WARNING "ata%u: unsupported CDB len\n", ap->id); 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"; - } + ap->cdb_len = (unsigned int) rc; + ap->host->max_cmd_len = (unsigned char) ap->cdb_len; /* print device info to dmesg */ - 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); + printk(KERN_INFO "ata%u: dev %u ATAPI, max %s\n", + ap->id, device, + ata_mode_string(xfer_modes)); } - ata_set_port_max_cmd_len(ap); + DPRINTK("EXIT, drv_stat = 0x%x\n", ata_chk_status(ap)); + return; + +err_out_nosup: + printk(KERN_WARNING "ata%u: dev %u not supported, ignoring\n", + ap->id, device); +err_out: + dev->class++; /* converts ATA_DEV_xxx into ATA_DEV_xxx_UNSUP */ + DPRINTK("EXIT, err\n"); +} + + +static inline u8 ata_dev_knobble(const struct ata_port *ap) +{ + return ((ap->cbl == ATA_CBL_SATA) && (!ata_id_is_sata(ap->device->id))); +} + +/** + * ata_dev_config - Run device specific handlers and check for + * SATA->PATA bridges + * @ap: Bus + * @i: Device + * + * LOCKING: + */ +void ata_dev_config(struct ata_port *ap, unsigned int i) +{ /* limit bridge transfers to udma5, 200 sectors */ - if (ata_dev_knobble(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; + if (ata_dev_knobble(ap)) { + printk(KERN_INFO "ata%u(%u): applying bridge limits\n", + ap->id, ap->device->devno); + ap->udma_mask &= ATA_UDMA5; + ap->host->max_sectors = ATA_MAX_SECTORS; + ap->host->hostt->max_sectors = ATA_MAX_SECTORS; + ap->device[i].flags |= ATA_DFLAG_LOCK_SECTORS; } if (ap->ops->dev_config) - ap->ops->dev_config(ap, dev); - - 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: - if (ata_msg_probe(ap)) - ata_dev_printk(dev, KERN_DEBUG, - "%s: EXIT, err\n", __FUNCTION__); - return rc; + ap->ops->dev_config(ap, &ap->device[i]); } /** @@ -1530,104 +1479,38 @@ err_out_nosup: * PCI/etc. bus probe sem. * * RETURNS: - * Zero on success, negative errno otherwise. + * Zero on success, non-zero on error. */ static int ata_bus_probe(struct ata_port *ap) { - unsigned int classes[ATA_MAX_DEVICES]; - int tries[ATA_MAX_DEVICES]; - int i, rc, down_xfermask; - struct ata_device *dev; - - ata_port_probe(ap); + unsigned int i, found = 0; - for (i = 0; i < ATA_MAX_DEVICES; i++) - tries[i] = ATA_PROBE_MAX_TRIES; - - retry: - down_xfermask = 0; - - /* reset and determine device classes */ ap->ops->phy_reset(ap); + if (ap->flags & ATA_FLAG_PORT_DISABLED) + goto err_out; for (i = 0; i < ATA_MAX_DEVICES; i++) { - dev = &ap->device[i]; - - 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_dev_identify(ap, i); + if (ata_dev_present(&ap->device[i])) { + found = 1; + ata_dev_config(ap,i); + } } - 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++) - ap->device[i].pio_mode = XFER_PIO_0; - - /* read IDENTIFY page and configure devices */ - for (i = 0; i < ATA_MAX_DEVICES; i++) { - dev = &ap->device[i]; - - if (tries[i]) - dev->class = classes[i]; - - if (!ata_dev_enabled(dev)) - continue; - - rc = ata_dev_read_id(dev, &dev->class, 1, dev->id); - if (rc) - goto fail; + if ((!found) || (ap->flags & ATA_FLAG_PORT_DISABLED)) + goto err_out_disable; - rc = ata_dev_configure(dev, 1); - if (rc) - goto fail; - } - - /* configure transfer mode */ - rc = ata_set_mode(ap, &dev); - if (rc) { - down_xfermask = 1; - goto fail; - } + ata_set_mode(ap); + if (ap->flags & ATA_FLAG_PORT_DISABLED) + goto err_out_disable; - for (i = 0; i < ATA_MAX_DEVICES; i++) - if (ata_dev_enabled(&ap->device[i])) - return 0; + return 0; - /* no device present, disable port */ - ata_port_disable(ap); +err_out_disable: ap->ops->port_disable(ap); - return -ENODEV; - - 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; - } - - if (!tries[dev->devno]) { - ata_down_xfermask_limit(dev, 1); - ata_dev_disable(dev); - } - - goto retry; +err_out: + return -1; } /** @@ -1643,36 +1526,7 @@ static int ata_bus_probe(struct ata_port *ap) void ata_port_probe(struct ata_port *ap) { - ap->flags &= ~ATA_FLAG_DISABLED; -} - -/** - * sata_print_link_status - Print SATA link status - * @ap: SATA port to printk link status about - * - * This function prints link speed and status of a SATA link. - * - * LOCKING: - * None. - */ -static void sata_print_link_status(struct ata_port *ap) -{ - u32 sstatus, scontrol, tmp; - - if (sata_scr_read(ap, SCR_STATUS, &sstatus)) - return; - sata_scr_read(ap, SCR_CONTROL, &scontrol); - - if (ata_port_online(ap)) { - tmp = (sstatus >> 4) & 0xf; - ata_port_printk(ap, KERN_INFO, - "SATA link up %s (SStatus %X SControl %X)\n", - sata_spd_string(tmp), sstatus, scontrol); - } else { - ata_port_printk(ap, KERN_INFO, - "SATA link down (SStatus %X SControl %X)\n", - sstatus, scontrol); - } + ap->flags &= ~ATA_FLAG_PORT_DISABLED; } /** @@ -1694,32 +1548,44 @@ void __sata_phy_reset(struct ata_port *ap) if (ap->flags & ATA_FLAG_SATA_RESET) { /* issue phy wake/reset */ - sata_scr_write_flush(ap, SCR_CONTROL, 0x301); + 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); } - /* phy wake/clear reset */ - sata_scr_write_flush(ap, SCR_CONTROL, 0x300); + scr_write_flush(ap, SCR_CONTROL, 0x300); /* phy wake/clear reset */ /* wait for phy to become ready, if necessary */ do { msleep(200); - sata_scr_read(ap, SCR_STATUS, &sstatus); + sstatus = scr_read(ap, SCR_STATUS); if ((sstatus & 0xf) != 1) break; } while (time_before(jiffies, timeout)); - /* print link status */ - sata_print_link_status(ap); - /* TODO: phy layer with polling, timeouts, etc. */ - if (!ata_port_offline(ap)) + sstatus = scr_read(ap, SCR_STATUS); + if (sata_dev_present(ap)) { + const char *speed; + u32 tmp; + + tmp = (sstatus >> 4) & 0xf; + if (tmp & (1 << 0)) + speed = "1.5"; + else if (tmp & (1 << 1)) + speed = "3.0"; + else + speed = ""; + printk(KERN_INFO "ata%u: SATA link up %s Gbps (SStatus %X)\n", + ap->id, speed, sstatus); ata_port_probe(ap); - else + } else { + printk(KERN_INFO "ata%u: SATA link down (SStatus %X)\n", + ap->id, sstatus); ata_port_disable(ap); + } - if (ap->flags & ATA_FLAG_DISABLED) + if (ap->flags & ATA_FLAG_PORT_DISABLED) return; if (ata_busy_sleep(ap, ATA_TMOUT_BOOT_QUICK, ATA_TMOUT_BOOT)) { @@ -1744,28 +1610,11 @@ 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_DISABLED) + if (ap->flags & ATA_FLAG_PORT_DISABLED) return; ata_bus_reset(ap); } -/** - * ata_dev_pair - return other device on cable - * @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_device *adev) -{ - struct ata_port *ap = adev->ap; - struct ata_device *pair = &ap->device[1 - adev->devno]; - if (!ata_dev_enabled(pair)) - return NULL; - return pair; -} - /** * ata_port_disable - Disable port. * @ap: Port to be disabled. @@ -1783,122 +1632,7 @@ 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_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; + ap->flags |= ATA_FLAG_PORT_DISABLED; } /* @@ -1909,7 +1643,7 @@ int sata_set_spd(struct ata_port *ap) * PIO 0-5, MWDMA 0-2 and UDMA 0-6 timings (in nanoseconds). * These were taken from ATA/ATAPI-6 standard, rev 0a, except * for PIO 5, which is a nonstandard extension and UDMA6, which - * is currently supported only by Maxtor drives. + * is currently supported only by Maxtor drives. */ static const struct ata_timing ata_timing[] = { @@ -1924,11 +1658,11 @@ static const struct ata_timing ata_timing[] = { { XFER_UDMA_0, 0, 0, 0, 0, 0, 0, 0, 120 }, /* { XFER_UDMA_SLOW, 0, 0, 0, 0, 0, 0, 0, 150 }, */ - + { XFER_MW_DMA_2, 25, 0, 0, 0, 70, 25, 120, 0 }, { XFER_MW_DMA_1, 45, 0, 0, 0, 80, 50, 150, 0 }, { XFER_MW_DMA_0, 60, 0, 0, 0, 215, 215, 480, 0 }, - + { XFER_SW_DMA_2, 60, 0, 0, 0, 120, 120, 240, 0 }, { XFER_SW_DMA_1, 90, 0, 0, 0, 240, 240, 480, 0 }, { XFER_SW_DMA_0, 120, 0, 0, 0, 480, 480, 960, 0 }, @@ -1981,7 +1715,7 @@ static const struct ata_timing* ata_timing_find_mode(unsigned short speed) for (t = ata_timing; t->mode != speed; t++) if (t->mode == 0xFF) return NULL; - return t; + return t; } int ata_timing_compute(struct ata_device *adev, unsigned short speed, @@ -1991,7 +1725,7 @@ int ata_timing_compute(struct ata_device *adev, unsigned short speed, struct ata_timing p; /* - * Find the mode. + * Find the mode. */ if (!(s = ata_timing_find_mode(speed))) @@ -2022,9 +1756,9 @@ int ata_timing_compute(struct ata_device *adev, unsigned short speed, ata_timing_quantize(t, t, T, UT); /* - * Even in DMA/UDMA modes we still use PIO access for IDENTIFY, - * S.M.A.R.T * and some other commands. We have to ensure that the - * DMA cycle timing is slower/equal than the fastest PIO timing. + * Even in DMA/UDMA modes we still use PIO access for IDENTIFY, S.M.A.R.T + * and some other commands. We have to ensure that the DMA cycle timing is + * slower/equal than the fastest PIO timing. */ if (speed > XFER_PIO_4) { @@ -2033,7 +1767,7 @@ int ata_timing_compute(struct ata_device *adev, unsigned short speed, } /* - * Lengthen active & recovery time so that cycle time is correct. + * Lenghten active & recovery time so that cycle time is correct. */ if (t->act8b + t->rec8b < t->cyc8b) { @@ -2049,217 +1783,146 @@ int ata_timing_compute(struct ata_device *adev, unsigned short speed, return 0; } -/** - * 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) +static const struct { + unsigned int shift; + u8 base; +} xfer_mode_classes[] = { + { ATA_SHIFT_UDMA, XFER_UDMA_0 }, + { ATA_SHIFT_MWDMA, XFER_MW_DMA_0 }, + { ATA_SHIFT_PIO, XFER_PIO_0 }, +}; + +static u8 base_from_shift(unsigned int shift) { - unsigned long xfer_mask; - int highbit; + int i; + + for (i = 0; i < ARRAY_SIZE(xfer_mode_classes); i++) + if (xfer_mode_classes[i].shift == shift) + return xfer_mode_classes[i].base; + + return 0xff; +} - xfer_mask = ata_pack_xfermask(dev->pio_mask, dev->mwdma_mask, - dev->udma_mask); +static void ata_dev_set_mode(struct ata_port *ap, struct ata_device *dev) +{ + int ofs, idx; + u8 base; - 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; + if (!ata_dev_present(dev) || (ap->flags & ATA_FLAG_PORT_DISABLED)) + return; - highbit = fls(xfer_mask) - 1; - xfer_mask &= ~(1 << highbit); - if (force_pio0) - xfer_mask &= 1 << ATA_SHIFT_PIO; - if (!xfer_mask) - goto fail; + if (dev->xfer_shift == ATA_SHIFT_PIO) + dev->flags |= ATA_DFLAG_PIO; - ata_unpack_xfermask(xfer_mask, &dev->pio_mask, &dev->mwdma_mask, - &dev->udma_mask); + ata_dev_set_xfermode(ap, dev); - ata_dev_printk(dev, KERN_WARNING, "limiting speed to %s\n", - ata_mode_string(xfer_mask)); + base = base_from_shift(dev->xfer_shift); + ofs = dev->xfer_mode - base; + idx = ofs + dev->xfer_shift; + WARN_ON(idx >= ARRAY_SIZE(xfer_mode_str)); - return 0; + DPRINTK("idx=%d xfer_shift=%u, xfer_mode=0x%x, base=0x%x, offset=%d\n", + idx, dev->xfer_shift, (int)dev->xfer_mode, (int)base, ofs); - fail: - return -EINVAL; + printk(KERN_INFO "ata%u: dev %u configured for %s\n", + ap->id, dev->devno, xfer_mode_str[idx]); } -static int ata_dev_set_mode(struct ata_device *dev) +static int ata_host_set_pio(struct ata_port *ap) { - unsigned int err_mask; - int rc; - - dev->flags &= ~ATA_DFLAG_PIO; - if (dev->xfer_shift == ATA_SHIFT_PIO) - dev->flags |= ATA_DFLAG_PIO; + unsigned int mask; + int x, i; + u8 base, xfer_mode; - err_mask = ata_dev_set_xfermode(dev); - if (err_mask) { - ata_dev_printk(dev, KERN_ERR, "failed to set xfermode " - "(err_mask=0x%x)\n", err_mask); - return -EIO; + mask = ata_get_mode_mask(ap, ATA_SHIFT_PIO); + x = fgb(mask); + if (x < 0) { + printk(KERN_WARNING "ata%u: no PIO support\n", ap->id); + return -1; } - rc = ata_dev_revalidate(dev, 0); - if (rc) - return rc; + base = base_from_shift(ATA_SHIFT_PIO); + xfer_mode = base + x; - DPRINTK("xfer_shift=%u, xfer_mode=0x%x\n", - dev->xfer_shift, (int)dev->xfer_mode); + DPRINTK("base 0x%x xfer_mode 0x%x mask 0x%x x %d\n", + (int)base, (int)xfer_mode, mask, x); + + for (i = 0; i < ATA_MAX_DEVICES; i++) { + struct ata_device *dev = &ap->device[i]; + if (ata_dev_present(dev)) { + dev->pio_mode = xfer_mode; + dev->xfer_mode = xfer_mode; + dev->xfer_shift = ATA_SHIFT_PIO; + if (ap->ops->set_piomode) + ap->ops->set_piomode(ap, dev); + } + } - ata_dev_printk(dev, KERN_INFO, "configured for %s\n", - ata_mode_string(ata_xfer_mode2mask(dev->xfer_mode))); return 0; } +static void ata_host_set_dma(struct ata_port *ap, u8 xfer_mode, + unsigned int xfer_shift) +{ + int i; + + for (i = 0; i < ATA_MAX_DEVICES; i++) { + struct ata_device *dev = &ap->device[i]; + if (ata_dev_present(dev)) { + dev->dma_mode = xfer_mode; + dev->xfer_mode = xfer_mode; + dev->xfer_shift = xfer_shift; + 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 - * @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. + * Set ATA device disk transfer mode (PIO3, UDMA6, etc.). * * 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) +static void ata_set_mode(struct ata_port *ap) { - struct ata_device *dev; - int i, rc = 0, used_dma = 0, found = 0; + unsigned int xfer_shift; + u8 xfer_mode; + int rc; - /* 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++) { - unsigned int pio_mask, dma_mask; - - dev = &ap->device[i]; - - if (!ata_dev_enabled(dev)) - continue; - - ata_dev_xfermask(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; - - /* 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; - - 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++) { - dev = &ap->device[i]; + /* step 1: always set host PIO timings */ + rc = ata_host_set_pio(ap); + if (rc) + goto err_out; - if (!ata_dev_enabled(dev) || !dev->dma_mode) - continue; + /* step 2: choose the best data xfer mode */ + xfer_mode = xfer_shift = 0; + rc = ata_choose_xfer_mode(ap, &xfer_mode, &xfer_shift); + if (rc) + goto err_out; - dev->xfer_mode = dev->dma_mode; - dev->xfer_shift = ata_xfer_mode2shift(dev->dma_mode); - if (ap->ops->set_dmamode) - ap->ops->set_dmamode(ap, dev); - } + /* step 3: if that xfer mode isn't PIO, set host DMA timings */ + if (xfer_shift != ATA_SHIFT_PIO) + ata_host_set_dma(ap, xfer_mode, xfer_shift); /* step 4: update devices' xfer mode */ - for (i = 0; i < ATA_MAX_DEVICES; i++) { - dev = &ap->device[i]; - - /* don't udpate suspended devices' xfer mode */ - if (!ata_dev_ready(dev)) - continue; - - rc = ata_dev_set_mode(dev); - if (rc) - goto out; - } + ata_dev_set_mode(ap, &ap->device[0]); + ata_dev_set_mode(ap, &ap->device[1]); - /* 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; + if (ap->flags & ATA_FLAG_PORT_DISABLED) + return; - /* step5: chip specific finalisation */ if (ap->ops->post_set_mode) ap->ops->post_set_mode(ap); - out: - if (rc) - *r_failed_dev = dev; - return rc; -} - -/** - * ata_tf_to_host - issue ATA taskfile to host controller - * @ap: port to which command is being issued - * @tf: ATA taskfile register set - * - * Issues ATA taskfile register set to ATA host controller, - * with proper synchronization with interrupt handler and - * other threads. - * - * LOCKING: - * spin_lock_irqsave(host_set lock) - */ + return; -static inline void ata_tf_to_host(struct ata_port *ap, - const struct ata_taskfile *tf) -{ - ap->ops->tf_load(ap, tf); - ap->ops->exec_command(ap, tf); +err_out: + ata_port_disable(ap); } /** @@ -2272,10 +1935,12 @@ static inline void ata_tf_to_host(struct ata_port *ap, * or a timeout occurs. * * LOCKING: None. + * */ -unsigned int ata_busy_sleep (struct ata_port *ap, - unsigned long tmout_pat, unsigned long tmout) +static unsigned int ata_busy_sleep (struct ata_port *ap, + unsigned long tmout_pat, + unsigned long tmout) { unsigned long timer_start, timeout; u8 status; @@ -2289,8 +1954,8 @@ unsigned int ata_busy_sleep (struct ata_port *ap, } if (status & ATA_BUSY) - ata_port_printk(ap, KERN_WARNING, - "port is slow to respond, please be patient\n"); + printk(KERN_WARNING "ata%u is slow to respond, " + "please be patient\n", ap->id); timeout = timer_start + tmout; while ((status & ATA_BUSY) && (time_before(jiffies, timeout))) { @@ -2299,8 +1964,8 @@ unsigned int ata_busy_sleep (struct ata_port *ap, } if (status & ATA_BUSY) { - ata_port_printk(ap, KERN_ERR, "port failed to respond " - "(%lu secs)\n", tmout / HZ); + printk(KERN_ERR "ata%u failed to respond (%lu secs)\n", + ap->id, tmout / HZ); return 1; } @@ -2354,6 +2019,45 @@ static void ata_bus_post_reset(struct ata_port *ap, unsigned int devmask) ap->ops->dev_select(ap, 0); } +/** + * ata_bus_edd - Issue EXECUTE DEVICE DIAGNOSTIC command. + * @ap: Port to reset and probe + * + * Use the EXECUTE DEVICE DIAGNOSTIC command to reset and + * probe the bus. Not often used these days. + * + * LOCKING: + * PCI/etc. bus probe sem. + * Obtains host_set lock. + * + */ + +static unsigned int ata_bus_edd(struct ata_port *ap) +{ + struct ata_taskfile tf; + unsigned long flags; + + /* set up execute-device-diag (bus reset) taskfile */ + /* also, take interrupts to a known state (disabled) */ + DPRINTK("execute-device-diag\n"); + ata_tf_init(ap, &tf, 0); + tf.ctl |= ATA_NIEN; + tf.command = ATA_CMD_EDD; + tf.protocol = ATA_PROT_NODATA; + + /* do bus reset */ + spin_lock_irqsave(&ap->host_set->lock, flags); + ata_tf_to_host(ap, &tf); + spin_unlock_irqrestore(&ap->host_set->lock, flags); + + /* spec says at least 2ms. but who knows with those + * crazy ATAPI devices... + */ + msleep(150); + + return ata_busy_sleep(ap, ATA_TMOUT_BOOT_QUICK, ATA_TMOUT_BOOT); +} + static unsigned int ata_bus_softreset(struct ata_port *ap, unsigned int devmask) { @@ -2383,20 +2087,9 @@ static unsigned int ata_bus_softreset(struct ata_port *ap, * status is checked. Because waiting for "a while" before * checking status is fine, post SRST, we perform this magic * delay here as well. - * - * Old drivers/ide uses the 2mS rule and then waits for ready */ msleep(150); - /* Before we perform post reset processing we want to see if - * the bus shows 0xFF because the odd clown forgets the D7 - * pulldown resistor. - */ - 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); return 0; @@ -2419,7 +2112,7 @@ static unsigned int ata_bus_softreset(struct ata_port *ap, * Obtains host_set lock. * * SIDE EFFECTS: - * Sets ATA_FLAG_DISABLED if bus reset fails. + * Sets ATA_FLAG_PORT_DISABLED if bus reset fails. */ void ata_bus_reset(struct ata_port *ap) @@ -2427,7 +2120,7 @@ void ata_bus_reset(struct ata_port *ap) struct ata_ioports *ioaddr = &ap->ioaddr; unsigned int slave_possible = ap->flags & ATA_FLAG_SLAVE_POSS; u8 err; - unsigned int dev0, dev1 = 0, devmask = 0; + unsigned int dev0, dev1 = 0, rc = 0, devmask = 0; DPRINTK("ENTER, host %u, port %u\n", ap->id, ap->port_no); @@ -2450,15 +2143,25 @@ void ata_bus_reset(struct ata_port *ap) /* issue bus reset */ if (ap->flags & ATA_FLAG_SRST) - if (ata_bus_softreset(ap, devmask)) - goto err_out; + rc = ata_bus_softreset(ap, devmask); + else if ((ap->flags & ATA_FLAG_SATA_RESET) == 0) { + /* set up device control */ + if (ap->flags & ATA_FLAG_MMIO) + writeb(ap->ctl, (void __iomem *) ioaddr->ctl_addr); + else + outb(ap->ctl, ioaddr->ctl_addr); + rc = ata_bus_edd(ap); + } + + if (rc) + goto err_out; /* * determine by signature whether we have ATA or ATAPI devices */ - ap->device[0].class = ata_dev_try_classify(ap, 0, &err); + err = ata_dev_try_classify(ap, 0); if ((slave_possible) && (err != 0x81)) - ap->device[1].class = ata_dev_try_classify(ap, 1, &err); + ata_dev_try_classify(ap, 1); /* re-enable interrupts */ if (ap->ioaddr.ctl_addr) /* FIXME: hack. create a hook instead */ @@ -2487,695 +2190,311 @@ void ata_bus_reset(struct ata_port *ap) return; err_out: - ata_port_printk(ap, KERN_ERR, "disabling port\n"); + printk(KERN_ERR "ata%u: disabling port\n", ap->id); ap->ops->port_disable(ap); DPRINTK("EXIT\n"); } -/** - * 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) +static void ata_pr_blacklisted(const struct ata_port *ap, + const struct ata_device *dev) { - 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; - - if ((rc = sata_scr_read(ap, SCR_STATUS, &cur))) - return rc; - cur &= 0xf; - - last = cur; - last_jiffies = jiffies; - - 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; - } + printk(KERN_WARNING "ata%u: dev %u is on DMA blacklist, disabling DMA\n", + ap->id, dev->devno); } -/** - * 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; +static const char * const ata_dma_blacklist [] = { + "WDC AC11000H", + "WDC AC22100H", + "WDC AC32500H", + "WDC AC33100H", + "WDC AC31600H", + "WDC AC32100H", + "WDC AC23200L", + "Compaq CRD-8241B", + "CRD-8400B", + "CRD-8480B", + "CRD-8482B", + "CRD-84", + "SanDisk SDP3B", + "SanDisk SDP3B-64", + "SANYO CD-ROM CRD", + "HITACHI CDR-8", + "HITACHI CDR-8335", + "HITACHI CDR-8435", + "Toshiba CD-ROM XM-6202B", + "TOSHIBA CD-ROM XM-1702BC", + "CD-532E-A", + "E-IDE CD-ROM CR-840", + "CD-ROM Drive/F5A", + "WPI CDD-820", + "SAMSUNG CD-ROM SC-148C", + "SAMSUNG CD-ROM SC", + "SanDisk SDP3B-64", + "ATAPI CD-ROM DRIVE 40X MAXIMUM", + "_NEC DV5800A", +}; - if ((rc = sata_scr_read(ap, SCR_CONTROL, &scontrol))) - return rc; +static int ata_dma_blacklisted(const struct ata_device *dev) +{ + unsigned char model_num[40]; + char *s; + unsigned int len; + int i; - scontrol = (scontrol & 0x0f0) | 0x300; + ata_dev_id_string(dev->id, model_num, ATA_ID_PROD_OFS, + sizeof(model_num)); + s = &model_num[0]; + len = strnlen(s, sizeof(model_num)); - if ((rc = sata_scr_write(ap, SCR_CONTROL, scontrol))) - return rc; + /* ATAPI specifies that empty space is blank-filled; remove blanks */ + while ((len > 0) && (s[len - 1] == ' ')) { + len--; + s[len] = 0; + } - /* Some PHYs react badly if SStatus is pounded immediately - * after resuming. Delay 200ms before debouncing. - */ - msleep(200); + for (i = 0; i < ARRAY_SIZE(ata_dma_blacklist); i++) + if (!strncmp(ata_dma_blacklist[i], s, len)) + return 1; - return sata_phy_debounce(ap, params); + return 0; } -static void ata_wait_spinup(struct ata_port *ap) +static unsigned int ata_get_mode_mask(const struct ata_port *ap, int shift) { - struct ata_eh_context *ehc = &ap->eh_context; - unsigned long end, secs; - int rc; + const struct ata_device *master, *slave; + unsigned int mask; - /* first, debounce phy if SATA */ - if (ap->cbl == ATA_CBL_SATA) { - rc = sata_phy_debounce(ap, sata_deb_timing_hotplug); + master = &ap->device[0]; + slave = &ap->device[1]; - /* if debounced successfully and offline, no need to wait */ - if ((rc == 0 || rc == -EOPNOTSUPP) && ata_port_offline(ap)) - return; + assert (ata_dev_present(master) || ata_dev_present(slave)); + + if (shift == ATA_SHIFT_UDMA) { + mask = ap->udma_mask; + if (ata_dev_present(master)) { + mask &= (master->id[ATA_ID_UDMA_MODES] & 0xff); + if (ata_dma_blacklisted(master)) { + mask = 0; + ata_pr_blacklisted(ap, master); + } + } + if (ata_dev_present(slave)) { + mask &= (slave->id[ATA_ID_UDMA_MODES] & 0xff); + if (ata_dma_blacklisted(slave)) { + mask = 0; + ata_pr_blacklisted(ap, slave); + } + } + } + else if (shift == ATA_SHIFT_MWDMA) { + mask = ap->mwdma_mask; + if (ata_dev_present(master)) { + mask &= (master->id[ATA_ID_MWDMA_MODES] & 0x07); + if (ata_dma_blacklisted(master)) { + mask = 0; + ata_pr_blacklisted(ap, master); + } + } + if (ata_dev_present(slave)) { + mask &= (slave->id[ATA_ID_MWDMA_MODES] & 0x07); + if (ata_dma_blacklisted(slave)) { + mask = 0; + ata_pr_blacklisted(ap, slave); + } + } + } + else if (shift == ATA_SHIFT_PIO) { + mask = ap->pio_mask; + if (ata_dev_present(master)) { + /* spec doesn't return explicit support for + * PIO0-2, so we fake it + */ + u16 tmp_mode = master->id[ATA_ID_PIO_MODES] & 0x03; + tmp_mode <<= 3; + tmp_mode |= 0x7; + mask &= tmp_mode; + } + if (ata_dev_present(slave)) { + /* spec doesn't return explicit support for + * PIO0-2, so we fake it + */ + u16 tmp_mode = slave->id[ATA_ID_PIO_MODES] & 0x03; + tmp_mode <<= 3; + tmp_mode |= 0x7; + mask &= tmp_mode; + } + } + else { + mask = 0xffffffff; /* shut up compiler warning */ + BUG(); } - /* 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; + return mask; +} - if (time_after(jiffies, end)) - return; +/* find greatest bit */ +static int fgb(u32 bitmap) +{ + unsigned int i; + int x = -1; - if (secs > 5) - ata_port_printk(ap, KERN_INFO, "waiting for device to spin up " - "(%lu secs)\n", secs); + for (i = 0; i < 32; i++) + if (bitmap & (1 << i)) + x = i; - schedule_timeout_uninterruptible(end - jiffies); + return x; } /** - * ata_std_prereset - prepare for reset - * @ap: ATA port to be reset + * ata_choose_xfer_mode - attempt to find best transfer mode + * @ap: Port for which an xfer mode will be selected + * @xfer_mode_out: (output) SET FEATURES - XFER MODE code + * @xfer_shift_out: (output) bit shift that selects this mode * - * @ap is about to be reset. Initialize it. + * Based on host and device capabilities, determine the + * maximum transfer mode that is amenable to all. * * LOCKING: - * Kernel thread context (may sleep) + * PCI/etc. bus probe sem. * * RETURNS: - * 0 on success, -errno otherwise. + * Zero on success, negative on error. */ -int ata_std_prereset(struct ata_port *ap) -{ - 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); +static int ata_choose_xfer_mode(const struct ata_port *ap, + u8 *xfer_mode_out, + unsigned int *xfer_shift_out) +{ + unsigned int mask, shift; + int x, i; - /* if we're about to do hardreset, nothing more to do */ - if (ehc->i.action & ATA_EH_HARDRESET) - return 0; + for (i = 0; i < ARRAY_SIZE(xfer_mode_classes); i++) { + shift = xfer_mode_classes[i].shift; + mask = ata_get_mode_mask(ap, shift); - /* 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; + x = fgb(mask); + if (x >= 0) { + *xfer_mode_out = xfer_mode_classes[i].base + x; + *xfer_shift_out = shift; + return 0; } } - /* 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; + return -1; } /** - * ata_std_softreset - reset host port via ATA SRST - * @ap: port to reset - * @classes: resulting classes of attached devices + * ata_dev_set_xfermode - Issue SET FEATURES - XFER MODE command + * @ap: Port associated with device @dev + * @dev: Device to which command will be sent * - * Reset host port using ATA SRST. + * Issue SET FEATURES - XFER MODE command to device @dev + * on port @ap. * * LOCKING: - * Kernel thread context (may sleep) - * - * RETURNS: - * 0 on success, -errno otherwise. + * PCI/etc. bus probe sem. */ -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; - u8 err; - - DPRINTK("ENTER\n"); - if (ata_port_offline(ap)) { - classes[0] = ATA_DEV_NONE; - goto out; - } +static void ata_dev_set_xfermode(struct ata_port *ap, struct ata_device *dev) +{ + struct ata_taskfile tf; - /* determine if device 0/1 are present */ - if (ata_devchk(ap, 0)) - devmask |= (1 << 0); - if (slave_possible && ata_devchk(ap, 1)) - devmask |= (1 << 1); + /* set up set-features taskfile */ + DPRINTK("set features - xfer mode\n"); - /* select device 0 again */ - ap->ops->dev_select(ap, 0); + ata_tf_init(ap, &tf, dev->devno); + tf.command = ATA_CMD_SET_FEATURES; + tf.feature = SETFEATURES_XFER; + tf.flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE; + tf.protocol = ATA_PROT_NODATA; + tf.nsect = dev->xfer_mode; - /* issue bus reset */ - DPRINTK("about to softreset, devmask=%x\n", devmask); - err_mask = ata_bus_softreset(ap, devmask); - if (err_mask) { - ata_port_printk(ap, KERN_ERR, "SRST failed (err_mask=0x%x)\n", - err_mask); - return -EIO; + if (ata_exec_internal(ap, dev, &tf, DMA_NONE, NULL, 0)) { + printk(KERN_ERR "ata%u: failed to set xfermode, disabled\n", + ap->id); + ata_port_disable(ap); } - /* determine by signature whether we have ATA or ATAPI devices */ - classes[0] = ata_dev_try_classify(ap, 0, &err); - if (slave_possible && err != 0x81) - classes[1] = ata_dev_try_classify(ap, 1, &err); - - out: - DPRINTK("EXIT, classes[0]=%u [1]=%u\n", classes[0], classes[1]); - return 0; + DPRINTK("EXIT\n"); } /** - * sata_std_hardreset - reset host port via SATA phy reset - * @ap: port to reset - * @class: resulting class of attached device - * - * SATA phy-reset host port using DET bits of SControl register. + * ata_dev_reread_id - Reread the device identify device info + * @ap: port where the device is + * @dev: device to reread the identify device info * * LOCKING: - * Kernel thread context (may sleep) - * - * RETURNS: - * 0 on success, -errno otherwise. */ -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"); - 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; +static void ata_dev_reread_id(struct ata_port *ap, struct ata_device *dev) +{ + struct ata_taskfile tf; - if ((rc = sata_scr_write(ap, SCR_CONTROL, scontrol))) - return rc; + ata_tf_init(ap, &tf, dev->devno); - sata_set_spd(ap); + if (dev->class == ATA_DEV_ATA) { + tf.command = ATA_CMD_ID_ATA; + DPRINTK("do ATA identify\n"); + } else { + tf.command = ATA_CMD_ID_ATAPI; + DPRINTK("do ATAPI identify\n"); } - /* 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, timing); + tf.flags |= ATA_TFLAG_DEVICE; + tf.protocol = ATA_PROT_PIO; - /* TODO: phy layer with polling, timeouts, etc. */ - if (ata_port_offline(ap)) { - *class = ATA_DEV_NONE; - DPRINTK("EXIT, link offline\n"); - return 0; - } + if (ata_exec_internal(ap, dev, &tf, DMA_FROM_DEVICE, + dev->id, sizeof(dev->id))) + goto err_out; - if (ata_busy_sleep(ap, ATA_TMOUT_BOOT_QUICK, ATA_TMOUT_BOOT)) { - ata_port_printk(ap, KERN_ERR, - "COMRESET failed (device not ready)\n"); - return -EIO; - } + swap_buf_le16(dev->id, ATA_ID_WORDS); - ap->ops->dev_select(ap, 0); /* probably unnecessary */ + ata_dump_id(dev); - *class = ata_dev_try_classify(ap, 0, NULL); + DPRINTK("EXIT\n"); - DPRINTK("EXIT, class=%u\n", *class); - return 0; + return; +err_out: + printk(KERN_ERR "ata%u: failed to reread ID, disabled\n", ap->id); + ata_port_disable(ap); } /** - * ata_std_postreset - standard postreset callback - * @ap: the target ata_port - * @classes: classes of attached devices - * - * This function is invoked after a successful reset. Note that - * the device might have been reset more than once using - * different reset methods before postreset is invoked. + * ata_dev_init_params - Issue INIT DEV PARAMS command + * @ap: Port associated with device @dev + * @dev: Device to which command will be sent * * LOCKING: - * Kernel thread context (may sleep) */ -void ata_std_postreset(struct ata_port *ap, unsigned int *classes) + +static void ata_dev_init_params(struct ata_port *ap, struct ata_device *dev) { - u32 serror; - - DPRINTK("ENTER\n"); - - /* print link status */ - 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->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) - ap->ops->dev_select(ap, 1); - if (classes[1] != ATA_DEV_NONE) - ap->ops->dev_select(ap, 0); - - /* bail out if no device is present */ - if (classes[0] == ATA_DEV_NONE && classes[1] == ATA_DEV_NONE) { - DPRINTK("EXIT, no device\n"); - return; - } - - /* set up device control */ - if (ap->ioaddr.ctl_addr) { - if (ap->flags & ATA_FLAG_MMIO) - writeb(ap->ctl, (void __iomem *) ap->ioaddr.ctl_addr); - else - outb(ap->ctl, ap->ioaddr.ctl_addr); - } - - DPRINTK("EXIT\n"); -} - -/** - * ata_dev_same_device - Determine whether new ID matches configured device - * @dev: device to compare against - * @new_class: class of the new device - * @new_id: IDENTIFY page of the new device - * - * Compare @new_class and @new_id against @dev and determine - * whether @dev is the device indicated by @new_class and - * @new_id. - * - * LOCKING: - * None. - * - * RETURNS: - * 1 if @dev matches @new_class and @new_id, 0 otherwise. - */ -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) { - ata_dev_printk(dev, KERN_INFO, "class mismatch %d != %d\n", - dev->class, new_class); - return 0; - } - - ata_id_c_string(old_id, model[0], ATA_ID_PROD_OFS, sizeof(model[0])); - ata_id_c_string(new_id, model[1], ATA_ID_PROD_OFS, sizeof(model[1])); - ata_id_c_string(old_id, serial[0], ATA_ID_SERNO_OFS, sizeof(serial[0])); - ata_id_c_string(new_id, serial[1], ATA_ID_SERNO_OFS, sizeof(serial[1])); - new_n_sectors = ata_id_n_sectors(new_id); - - if (strcmp(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])) { - 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) { - 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; - } - - return 1; -} - -/** - * ata_dev_revalidate - Revalidate ATA device - * @dev: device to revalidate - * @post_reset: is this revalidation after reset? - * - * Re-read IDENTIFY page and make sure @dev is still attached to - * the port. - * - * LOCKING: - * Kernel thread context (may sleep) - * - * RETURNS: - * 0 on success, negative errno otherwise - */ -int ata_dev_revalidate(struct ata_device *dev, int post_reset) -{ - unsigned int class = dev->class; - u16 *id = (void *)dev->ap->sector_buf; - int rc; - - if (!ata_dev_enabled(dev)) { - rc = -ENODEV; - goto fail; - } - - /* 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(dev, class, id)) { - rc = -ENODEV; - goto fail; - } - - memcpy(dev->id, id, sizeof(id[0]) * ATA_ID_WORDS); - - /* configure device according to the new ID */ - rc = ata_dev_configure(dev, 0); - if (rc == 0) - return 0; - - fail: - ata_dev_printk(dev, KERN_ERR, "revalidation failed (errno=%d)\n", rc); - return rc; -} - -static const char * const ata_dma_blacklist [] = { - "WDC AC11000H", NULL, - "WDC AC22100H", NULL, - "WDC AC32500H", NULL, - "WDC AC33100H", NULL, - "WDC AC31600H", NULL, - "WDC AC32100H", "24.09P07", - "WDC AC23200L", "21.10N21", - "Compaq CRD-8241B", NULL, - "CRD-8400B", NULL, - "CRD-8480B", NULL, - "CRD-8482B", NULL, - "CRD-84", NULL, - "SanDisk SDP3B", NULL, - "SanDisk SDP3B-64", NULL, - "SANYO CD-ROM CRD", NULL, - "HITACHI CDR-8", NULL, - "HITACHI CDR-8335", NULL, - "HITACHI CDR-8435", NULL, - "Toshiba CD-ROM XM-6202B", NULL, - "TOSHIBA CD-ROM XM-1702BC", NULL, - "CD-532E-A", NULL, - "E-IDE CD-ROM CR-840", NULL, - "CD-ROM Drive/F5A", NULL, - "WPI CDD-820", NULL, - "SAMSUNG CD-ROM SC-148C", NULL, - "SAMSUNG CD-ROM SC", NULL, - "SanDisk SDP3B-64", NULL, - "ATAPI CD-ROM DRIVE 40X MAXIMUM",NULL, - "_NEC DV5800A", NULL, - "SAMSUNG CD-ROM SN-124", "N001" -}; - -static int ata_strim(char *s, size_t len) -{ - len = strnlen(s, len); - - /* ATAPI specifies that empty space is blank-filled; remove blanks */ - while ((len > 0) && (s[len - 1] == ' ')) { - len--; - s[len] = 0; - } - return len; -} - -static int ata_dma_blacklisted(const struct ata_device *dev) -{ - unsigned char model_num[40]; - unsigned char model_rev[16]; - 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, - sizeof(model_rev)); - nlen = ata_strim(model_num, sizeof(model_num)); - rlen = ata_strim(model_rev, sizeof(model_rev)); - - for (i = 0; i < ARRAY_SIZE(ata_dma_blacklist); i += 2) { - if (!strncmp(ata_dma_blacklist[i], model_num, nlen)) { - if (ata_dma_blacklist[i+1] == NULL) - return 1; - if (!strncmp(ata_dma_blacklist[i], model_rev, rlen)) - return 1; - } - } - return 0; -} - -/** - * ata_dev_xfermask - Compute supported xfermask of the given device - * @dev: Device to compute xfermask for - * - * Compute supported xfermask of @dev and store it in - * dev->*_mask. This function is responsible for applying all - * known limits including host controller limits, device - * blacklist, etc... - * - * FIXME: The current implementation limits all transfer modes to - * the fastest of the lowested device on the port. This is not - * required on most controllers. - * - * LOCKING: - * None. - */ -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); - - /* 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_absent(d)) - continue; - - 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); - } - - if (ata_dma_blacklisted(dev)) - 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_dev_set_xfermode - Issue SET FEATURES - XFER MODE command - * @dev: Device to which command will be sent - * - * Issue SET FEATURES - XFER MODE command to device @dev - * on port @ap. - * - * LOCKING: - * PCI/etc. bus probe sem. - * - * RETURNS: - * 0 on success, AC_ERR_* mask otherwise. - */ - -static unsigned int ata_dev_set_xfermode(struct ata_device *dev) -{ - struct ata_taskfile tf; - unsigned int err_mask; - - /* set up set-features taskfile */ - DPRINTK("set features - xfer mode\n"); - - 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(dev, &tf, NULL, DMA_NONE, NULL, 0); - - DPRINTK("EXIT, err_mask=%x\n", err_mask); - return err_mask; -} - -/** - * ata_dev_init_params - Issue INIT DEV PARAMS command - * @dev: Device to which command will be sent - * @heads: Number of heads (taskfile parameter) - * @sectors: Number of sectors (taskfile parameter) - * - * LOCKING: - * Kernel thread context (may sleep) - * - * RETURNS: - * 0 on success, AC_ERR_* mask otherwise. - */ -static unsigned int ata_dev_init_params(struct ata_device *dev, - u16 heads, u16 sectors) -{ - struct ata_taskfile tf; - unsigned int err_mask; + struct ata_taskfile tf; + u16 sectors = dev->id[6]; + u16 heads = dev->id[3]; /* Number of sectors per track 1-255. Number of heads 1-16 */ if (sectors < 1 || sectors > 255 || heads < 1 || heads > 16) - return AC_ERR_INVALID; + return; /* set up init dev params taskfile */ DPRINTK("init dev params \n"); - ata_tf_init(dev, &tf); + ata_tf_init(ap, &tf, dev->devno); tf.command = ATA_CMD_INIT_DEV_PARAMS; tf.flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE; tf.protocol = ATA_PROT_NODATA; tf.nsect = sectors; tf.device |= (heads - 1) & 0x0f; /* max head = num. of heads - 1 */ - err_mask = ata_exec_internal(dev, &tf, NULL, DMA_NONE, NULL, 0); + if (ata_exec_internal(ap, dev, &tf, DMA_NONE, NULL, 0)) { + printk(KERN_ERR "ata%u: failed to init parameters, disabled\n", + ap->id); + ata_port_disable(ap); + } - DPRINTK("EXIT, err_mask=%x\n", err_mask); - return err_mask; + DPRINTK("EXIT\n"); } /** @@ -3195,11 +2514,11 @@ static void ata_sg_clean(struct ata_queued_cmd *qc) int dir = qc->dma_dir; void *pad_buf = NULL; - WARN_ON(!(qc->flags & ATA_QCFLAG_DMAMAP)); - WARN_ON(sg == NULL); + assert(qc->flags & ATA_QCFLAG_DMAMAP); + assert(sg != NULL); if (qc->flags & ATA_QCFLAG_SINGLE) - WARN_ON(qc->n_elem > 1); + assert(qc->n_elem <= 1); VPRINTK("unmapping %u sg elements\n", qc->n_elem); @@ -3212,7 +2531,7 @@ static void ata_sg_clean(struct ata_queued_cmd *qc) if (qc->flags & ATA_QCFLAG_SG) { if (qc->n_elem) - dma_unmap_sg(ap->dev, sg, qc->n_elem, dir); + dma_unmap_sg(ap->host_set->dev, sg, qc->n_elem, dir); /* restore last sg */ sg[qc->orig_n_elem - 1].length += qc->pad_len; if (pad_buf) { @@ -3223,7 +2542,7 @@ static void ata_sg_clean(struct ata_queued_cmd *qc) } } else { if (qc->n_elem) - dma_unmap_single(ap->dev, + dma_unmap_single(ap->host_set->dev, sg_dma_address(&sg[0]), sg_dma_len(&sg[0]), dir); /* restore sg */ @@ -3254,8 +2573,8 @@ static void ata_fill_sg(struct ata_queued_cmd *qc) struct scatterlist *sg; unsigned int idx; - WARN_ON(qc->__sg == NULL); - WARN_ON(qc->n_elem == 0 && qc->pad_len == 0); + assert(qc->__sg != NULL); + assert(qc->n_elem > 0 || qc->pad_len > 0); idx = 0; ata_for_each_sg(sg, qc) { @@ -3329,8 +2648,6 @@ void ata_qc_prep(struct ata_queued_cmd *qc) ata_fill_sg(qc); } -void ata_noop_qc_prep(struct ata_queued_cmd *qc) { } - /** * ata_sg_init_one - Associate command with memory buffer * @qc: Command to be associated @@ -3355,7 +2672,6 @@ 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); @@ -3411,7 +2727,7 @@ static int ata_sg_setup_one(struct ata_queued_cmd *qc) void *pad_buf = ap->pad + (qc->tag * ATA_DMA_PAD_SZ); struct scatterlist *psg = &qc->pad_sgent; - WARN_ON(qc->dev->class != ATA_DEV_ATAPI); + assert(qc->dev->class == ATA_DEV_ATAPI); memset(pad_buf, 0, ATA_DMA_PAD_SZ); @@ -3435,7 +2751,7 @@ static int ata_sg_setup_one(struct ata_queued_cmd *qc) goto skip_map; } - dma_address = dma_map_single(ap->dev, qc->buf_virt, + dma_address = dma_map_single(ap->host_set->dev, qc->buf_virt, sg->length, dir); if (dma_mapping_error(dma_address)) { /* restore sg */ @@ -3475,7 +2791,7 @@ static int ata_sg_setup(struct ata_queued_cmd *qc) int n_elem, pre_n_elem, dir, trim_sg = 0; VPRINTK("ENTER, ata%u\n", ap->id); - WARN_ON(!(qc->flags & ATA_QCFLAG_SG)); + assert(qc->flags & ATA_QCFLAG_SG); /* we must lengthen transfers to end on a 32-bit boundary */ qc->pad_len = lsg->length & 3; @@ -3484,7 +2800,7 @@ static int ata_sg_setup(struct ata_queued_cmd *qc) struct scatterlist *psg = &qc->pad_sgent; unsigned int offset; - WARN_ON(qc->dev->class != ATA_DEV_ATAPI); + assert(qc->dev->class == ATA_DEV_ATAPI); memset(pad_buf, 0, ATA_DMA_PAD_SZ); @@ -3523,7 +2839,7 @@ static int ata_sg_setup(struct ata_queued_cmd *qc) } dir = qc->dma_dir; - n_elem = dma_map_sg(ap->dev, sg, pre_n_elem, dir); + n_elem = dma_map_sg(ap->host_set->dev, sg, pre_n_elem, dir); if (n_elem < 1) { /* restore last sg */ lsg->length += qc->pad_len; @@ -3539,7 +2855,135 @@ skip_map: } /** - * swap_buf_le16 - swap halves of 16-bit words in place + * 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 - + * @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); + assert(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_ATA_BUS; + 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); + assert(qc != NULL); + + drv_stat = ata_wait_idle(ap); + if (!ata_ok(drv_stat)) { + qc->err_mask |= __ac_err_mask(drv_stat); + ap->hsm_task_state = HSM_ST_ERR; + return 0; + } + + ap->hsm_task_state = HSM_ST_IDLE; + + assert(qc->err_mask == 0); + ata_poll_qc_complete(qc); + + /* another command may start at this point */ + + return 1; +} + + +/** + * swap_buf_le16 - swap halves of 16-words in place * @buf: Buffer to swap * @buf_words: Number of 16-bit words in buffer. * @@ -3562,7 +3006,7 @@ void swap_buf_le16(u16 *buf, unsigned int buf_words) /** * ata_mmio_data_xfer - Transfer data by MMIO - * @adev: device for this I/O + * @ap: port to read/write * @buf: data buffer * @buflen: buffer length * @write_data: read/write @@ -3573,10 +3017,9 @@ void swap_buf_le16(u16 *buf, unsigned int buf_words) * Inherited from caller. */ -void ata_mmio_data_xfer(struct ata_device *adev, unsigned char *buf, - unsigned int buflen, int write_data) +static void ata_mmio_data_xfer(struct ata_port *ap, 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; @@ -3608,7 +3051,7 @@ void ata_mmio_data_xfer(struct ata_device *adev, unsigned char *buf, /** * ata_pio_data_xfer - Transfer data by PIO - * @adev: device to target + * @ap: port to read/write * @buf: data buffer * @buflen: buffer length * @write_data: read/write @@ -3619,10 +3062,9 @@ void ata_mmio_data_xfer(struct ata_device *adev, unsigned char *buf, * Inherited from caller. */ -void ata_pio_data_xfer(struct ata_device *adev, unsigned char *buf, - unsigned int buflen, int write_data) +static void ata_pio_data_xfer(struct ata_port *ap, 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 */ @@ -3647,34 +3089,43 @@ void ata_pio_data_xfer(struct ata_device *adev, unsigned char *buf, } /** - * ata_pio_data_xfer_noirq - Transfer data by PIO - * @adev: device to target + * ata_data_xfer - Transfer data from/to the data register. + * @ap: port to read/write * @buf: data buffer * @buflen: buffer length - * @write_data: read/write + * @do_write: read/write * - * Transfer data from/to the device data register by PIO. Do the - * transfer with interrupts disabled. + * Transfer data from/to the device data register. * * LOCKING: * Inherited from caller. */ -void ata_pio_data_xfer_noirq(struct ata_device *adev, unsigned char *buf, - unsigned int buflen, int write_data) +static void ata_data_xfer(struct ata_port *ap, unsigned char *buf, + unsigned int buflen, int 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 - * - * Transfer ATA_SECT_SIZE of data from/to the ATA device. + /* 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); + } +} + +/** + * ata_pio_sector - Transfer ATA_SECT_SIZE (512 bytes) of data. + * @qc: Command on going + * + * Transfer ATA_SECT_SIZE of data from/to the ATA device. * * LOCKING: * Inherited from caller. @@ -3699,24 +3150,7 @@ static void ata_pio_sector(struct ata_queued_cmd *qc) page = nth_page(page, (offset >> PAGE_SHIFT)); offset %= PAGE_SIZE; - 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); - } + buf = kmap(page) + offset; qc->cursect++; qc->cursg_ofs++; @@ -3725,68 +3159,14 @@ static void ata_pio_sector(struct ata_queued_cmd *qc) qc->cursg++; qc->cursg_ofs = 0; } -} - -/** - * 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. - */ -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); + DPRINTK("data %s\n", qc->tf.flags & ATA_TFLAG_WRITE ? "write" : "read"); - ap->ops->data_xfer(qc->dev, qc->cdb, qc->dev->cdb_len, 1); - ata_altstatus(ap); /* flush */ + /* do the actual data transfer */ + do_write = (qc->tf.flags & ATA_TFLAG_WRITE); + ata_data_xfer(ap, buf, ATA_SECT_SIZE, do_write); - 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; - } + kunmap(page); } /** @@ -3827,11 +3207,11 @@ next_sg: unsigned int i; if (words) /* warning if bytes > 1 */ - ata_dev_printk(qc->dev, KERN_WARNING, - "%u bytes trailing data\n", bytes); + printk(KERN_WARNING "ata%u: %u bytes trailing data\n", + ap->id, bytes); for (i = 0; i < words; i++) - ap->ops->data_xfer(qc->dev, (unsigned char*)pad_buf, 2, do_write); + ata_data_xfer(ap, (unsigned char*)pad_buf, 2, do_write); ap->hsm_task_state = HSM_ST_LAST; return; @@ -3852,24 +3232,7 @@ next_sg: /* don't cross page boundaries */ count = min(count, (unsigned int)PAGE_SIZE - 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); - } + buf = kmap(page) + offset; bytes -= count; qc->curbytes += count; @@ -3880,6 +3243,13 @@ 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; } @@ -3901,16 +3271,10 @@ 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; - /* 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; + ap->ops->tf_read(ap, &qc->tf); + ireason = qc->tf.nsect; + bc_lo = qc->tf.lbam; + bc_hi = qc->tf.lbah; bytes = (bc_hi << 8) | bc_lo; /* shall be cleared to zero, indicating xfer of data */ @@ -3922,365 +3286,245 @@ 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: - ata_dev_printk(dev, KERN_INFO, "ATAPI check failed\n"); - qc->err_mask |= AC_ERR_HSM; + printk(KERN_INFO "ata%u: dev %u: ATAPI check failed\n", + ap->id, dev->devno); + qc->err_mask |= AC_ERR_ATA_BUS; ap->hsm_task_state = HSM_ST_ERR; } /** - * ata_hsm_ok_in_wq - Check if the qc can be handled in the workqueue. + * ata_pio_block - start PIO on a block * @ap: the target ata_port - * @qc: qc on going * - * RETURNS: - * 1 if ok in workqueue, 0 otherwise. + * LOCKING: + * None. (executing in kernel thread context) */ -static inline int ata_hsm_ok_in_wq(struct ata_port *ap, struct ata_queued_cmd *qc) +static void ata_pio_block(struct ata_port *ap) { - if (qc->tf.flags & ATA_TFLAG_POLLING) - return 1; - - if (ap->hsm_task_state == HSM_ST_FIRST) { - if (qc->tf.protocol == ATA_PROT_PIO && - (qc->tf.flags & ATA_TFLAG_WRITE)) - return 1; + struct ata_queued_cmd *qc; + u8 status; - if (is_atapi_taskfile(&qc->tf) && - !(qc->dev->flags & ATA_DFLAG_CDB_INTR)) - 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; + } } - return 0; -} - -/** - * 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; - - if (ap->ops->error_handler) { - if (in_wq) { - spin_lock_irqsave(ap->lock, flags); + qc = ata_qc_from_tag(ap, ap->active_tag); + assert(qc != NULL); - /* 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); - } + /* check error */ + if (status & (ATA_ERR | ATA_DF)) { + qc->err_mask |= AC_ERR_DEV; + ap->hsm_task_state = HSM_ST_ERR; + return; + } - spin_unlock_irqrestore(ap->lock, flags); - } else { - if (likely(!(qc->err_mask & AC_ERR_HSM))) - ata_qc_complete(qc); - else - ata_port_freeze(ap); + /* 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; } + + atapi_pio_bytes(qc); } 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); - } + /* handle BSY=0, DRQ=0 as error */ + if ((status & ATA_DRQ) == 0) { + qc->err_mask |= AC_ERR_ATA_BUS; + ap->hsm_task_state = HSM_ST_ERR; + return; + } - ata_altstatus(ap); /* flush */ + ata_pio_sector(qc); + } } -/** - * 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) +static void ata_pio_error(struct ata_port *ap) { - unsigned long flags = 0; - int poll_next; - - WARN_ON((qc->flags & ATA_QCFLAG_ACTIVE) == 0); - - /* 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(in_wq != ata_hsm_ok_in_wq(ap, qc)); - -fsm_start: - 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_FIRST: - /* Send first data block or PACKET CDB */ + struct ata_queued_cmd *qc; - /* 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; + qc = ata_qc_from_tag(ap, ap->active_tag); + assert(qc != NULL); - ap->hsm_task_state = HSM_ST_ERR; - goto fsm_start; - } + if (qc->tf.command != ATA_CMD_PACKET) + printk(KERN_WARNING "ata%u: PIO error\n", ap->id); - /* 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; - } + /* make sure qc->err_mask is available to + * know what's wrong and recover + */ + assert(qc->err_mask); - /* 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); + ap->hsm_task_state = HSM_ST_IDLE; - if (qc->tf.protocol == ATA_PROT_PIO) { - /* PIO data out protocol. - * send first data block. - */ + ata_poll_qc_complete(qc); +} - /* 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); +static void ata_pio_task(void *_data) +{ + struct ata_port *ap = _data; + unsigned long timeout; + int qc_completed; - if (in_wq) - spin_unlock_irqrestore(ap->lock, flags); +fsm_start: + timeout = 0; + qc_completed = 0; - /* if polling, ata_pio_task() handles the rest. - * otherwise, interrupt handler takes over from here. - */ - break; + switch (ap->hsm_task_state) { + case HSM_ST_IDLE: + return; 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; - } + ata_pio_block(ap); + break; - /* 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; - } + case HSM_ST_LAST: + qc_completed = ata_pio_complete(ap); + break; - atapi_pio_bytes(qc); + case HSM_ST_POLL: + case HSM_ST_LAST_POLL: + timeout = ata_pio_poll(ap); + break; - if (unlikely(ap->hsm_task_state == HSM_ST_ERR)) - /* bad ireason reported by device */ - goto fsm_start; + case HSM_ST_TMOUT: + case HSM_ST_ERR: + ata_pio_error(ap); + return; + } - } 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; - } + if (timeout) + queue_delayed_work(ata_wq, &ap->pio_task, timeout); + else if (!qc_completed) + goto fsm_start; +} - /* 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; - } +/** + * 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) + */ - ata_pio_sectors(qc); +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; - 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; - } - } + DPRINTK("ENTER\n"); - ata_altstatus(ap); /* flush */ - poll_next = 1; - break; + spin_lock_irqsave(&host_set->lock, flags); - 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; - } + /* 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; - /* no more data to transfer */ - DPRINTK("ata%u: dev %u command complete, drv_stat 0x%x\n", - ap->id, qc->dev->devno, status); + switch (qc->tf.protocol) { - WARN_ON(qc->err_mask); + case ATA_PROT_DMA: + case ATA_PROT_ATAPI_DMA: + host_stat = ap->ops->bmdma_status(ap); - ap->hsm_task_state = HSM_ST_IDLE; + /* before we do anything else, clear DMA-Start bit */ + ap->ops->bmdma_stop(qc); - /* complete taskfile transaction */ - ata_hsm_qc_complete(qc, in_wq); + /* fall through */ - poll_next = 0; - break; + default: + ata_altstatus(ap); + drv_stat = ata_chk_status(ap); - case HSM_ST_ERR: - /* make sure qc->err_mask is available to - * know what's wrong and recover - */ - WARN_ON(qc->err_mask == 0); + /* ack bmdma irq events */ + ap->ops->irq_clear(ap); - ap->hsm_task_state = HSM_ST_IDLE; + 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); /* complete taskfile transaction */ - ata_hsm_qc_complete(qc, in_wq); - - poll_next = 0; + qc->err_mask |= ac_err_mask(drv_stat); + ata_qc_complete(qc); break; - default: - poll_next = 0; - BUG(); } - return poll_next; + spin_unlock_irqrestore(&host_set->lock, flags); + + DPRINTK("EXIT\n"); } -static void ata_pio_task(void *_data) +/** + * 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) { - struct ata_queued_cmd *qc = _data; - struct ata_port *ap = qc->ap; - u8 status; - int poll_next; + struct ata_queued_cmd *qc; -fsm_start: - WARN_ON(ap->hsm_task_state == HSM_ST_IDLE); + DPRINTK("ENTER\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; - } + qc = ata_qc_from_tag(ap, ap->active_tag); + if (qc) + ata_qc_timeout(qc); + else { + printk(KERN_ERR "ata%u: BUG: timeout without command\n", + ap->id); + goto out; } - /* 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; +out: + DPRINTK("EXIT\n"); } /** @@ -4297,14 +3541,9 @@ static struct ata_queued_cmd *ata_qc_new(struct ata_port *ap) struct ata_queued_cmd *qc = NULL; unsigned int 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); + for (i = 0; i < ATA_MAX_QUEUE; i++) + if (!test_and_set_bit(i, &ap->qactive)) { + qc = ata_qc_from_tag(ap, i); break; } @@ -4316,15 +3555,16 @@ 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_device *dev) +struct ata_queued_cmd *ata_qc_new_init(struct ata_port *ap, + struct ata_device *dev) { - struct ata_port *ap = dev->ap; struct ata_queued_cmd *qc; qc = ata_qc_new(ap); @@ -4339,165 +3579,78 @@ struct ata_queued_cmd *ata_qc_new_init(struct ata_device *dev) return qc; } -/** - * ata_qc_free - free unused ata_queued_cmd - * @qc: Command to complete - * - * Designed to free unused ata_queued_cmd object - * in case something prevents using it. - * - * LOCKING: - * spin_lock_irqsave(host_set lock) - */ -void ata_qc_free(struct ata_queued_cmd *qc) +static void __ata_qc_complete(struct ata_queued_cmd *qc) { struct ata_port *ap = qc->ap; unsigned int tag; - WARN_ON(qc == NULL); /* ata_qc_from_tag _might_ return NULL */ - 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->qc_allocated); + clear_bit(tag, &ap->qactive); } } -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 + * ata_qc_free - free unused ata_queued_cmd * @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. + * Designed to free unused ata_queued_cmd object + * in case something prevents using it. * * LOCKING: * spin_lock_irqsave(host_set lock) */ -void ata_qc_complete(struct ata_queued_cmd *qc) +void ata_qc_free(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); + assert(qc != NULL); /* ata_qc_from_tag _might_ return NULL */ - __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(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 + * ata_qc_complete - Complete an active ATA command + * @qc: Command to complete + * @err_mask: ATA Status register contents * - * 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. + * 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) - * - * 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 *)) + +void ata_qc_complete(struct ata_queued_cmd *qc) { - int nr_done = 0; - u32 done_mask; - int i; + int rc; - done_mask = ap->qc_active ^ qc_active; + assert(qc != NULL); /* ata_qc_from_tag _might_ return NULL */ + assert(qc->flags & ATA_QCFLAG_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; - } + if (likely(qc->flags & ATA_QCFLAG_DMAMAP)) + ata_sg_clean(qc); - for (i = 0; i < ATA_MAX_QUEUE; i++) { - struct ata_queued_cmd *qc; + /* 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; - if (!(done_mask & (1 << i))) - continue; + /* call completion callback */ + rc = qc->complete_fn(qc); - if ((qc = ata_qc_from_tag(ap, i))) { - if (finish_qc) - finish_qc(qc); - ata_qc_complete(qc); - nr_done++; - } - } + /* if callback indicates not to complete command (non-zero), + * return immediately + */ + if (rc != 0) + return; - return nr_done; + __ata_qc_complete(qc); + + VPRINTK("EXIT\n"); } static inline int ata_should_dma_map(struct ata_queued_cmd *qc) @@ -4505,13 +3658,13 @@ 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; case ATA_PROT_ATAPI: case ATA_PROT_PIO: + case ATA_PROT_PIO_MULT: if (ap->flags & ATA_FLAG_PIO_DMA) return 1; @@ -4535,35 +3688,22 @@ static inline int ata_should_dma_map(struct ata_queued_cmd *qc) * * LOCKING: * spin_lock_irqsave(host_set lock) + * + * RETURNS: + * Zero on success, negative on error. */ -void ata_qc_issue(struct ata_queued_cmd *qc) + +int ata_qc_issue(struct ata_queued_cmd *qc) { struct ata_port *ap = qc->ap; - /* 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) { if (ata_sg_setup(qc)) - goto sg_err; + goto err_out; } else if (qc->flags & ATA_QCFLAG_SINGLE) { if (ata_sg_setup_one(qc)) - goto sg_err; + goto err_out; } } else { qc->flags &= ~ATA_QCFLAG_DMAMAP; @@ -4571,18 +3711,16 @@ void ata_qc_issue(struct ata_queued_cmd *qc) ap->ops->qc_prep(qc); - qc->err_mask |= ap->ops->qc_issue(qc); - if (unlikely(qc->err_mask)) - goto err; - return; + qc->ap->active_tag = qc->tag; + qc->flags |= ATA_QCFLAG_ACTIVE; -sg_err: - qc->flags &= ~ATA_QCFLAG_DMAMAP; - qc->err_mask |= AC_ERR_SYSTEM; -err: - ata_qc_complete(qc); + return ap->ops->qc_issue(qc); + +err_out: + return -1; } + /** * ata_qc_issue_prot - issue taskfile to device in proto-dependent manner * @qc: command to issue to device @@ -4598,122 +3736,291 @@ err: * spin_lock_irqsave(host_set lock) * * RETURNS: - * Zero on success, AC_ERR_* mask on failure + * Zero on success, negative on error. */ -unsigned int ata_qc_issue_prot(struct ata_queued_cmd *qc) +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: - if (qc->tf.flags & ATA_TFLAG_POLLING) - ata_qc_set_polling(qc); - + case ATA_PROT_PIO: /* load tf registers, initiate polling pio */ + ata_qc_set_polling(qc); ata_tf_to_host(ap, &qc->tf); - - 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. - */ - } - + ap->hsm_task_state = HSM_ST; + queue_work(ata_wq, &ap->pio_task); break; case ATA_PROT_ATAPI: - case ATA_PROT_ATAPI_NODATA: - if (qc->tf.flags & ATA_TFLAG_POLLING) - ata_qc_set_polling(qc); - + ata_qc_set_polling(qc); ata_tf_to_host(ap, &qc->tf); + queue_work(ata_wq, &ap->packet_task); + break; - 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); + case ATA_PROT_ATAPI_NODATA: + ap->flags |= ATA_FLAG_NOINTR; + ata_tf_to_host(ap, &qc->tf); + queue_work(ata_wq, &ap->packet_task); break; case ATA_PROT_ATAPI_DMA: - WARN_ON(qc->tf.flags & ATA_TFLAG_POLLING); - + ap->flags |= ATA_FLAG_NOINTR; ap->ops->tf_load(ap, &qc->tf); /* load tf registers */ ap->ops->bmdma_setup(qc); /* set up bmdma */ - 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); + queue_work(ata_wq, &ap->packet_task); break; default: WARN_ON(1); - return AC_ERR_SYSTEM; + return -1; } return 0; } +/** + * ata_bmdma_setup_mmio - Set up PCI IDE BMDMA transaction + * @qc: Info associated with this ATA transaction. + * + * LOCKING: + * spin_lock_irqsave(host_set lock) + */ + +static void ata_bmdma_setup_mmio (struct ata_queued_cmd *qc) +{ + struct ata_port *ap = qc->ap; + unsigned int rw = (qc->tf.flags & ATA_TFLAG_WRITE); + u8 dmactl; + void __iomem *mmio = (void __iomem *) ap->ioaddr.bmdma_addr; + + /* load PRD table addr. */ + mb(); /* make sure PRD table writes are visible to controller */ + writel(ap->prd_dma, mmio + ATA_DMA_TABLE_OFS); + + /* specify data direction, triple-check start bit is clear */ + dmactl = readb(mmio + ATA_DMA_CMD); + dmactl &= ~(ATA_DMA_WR | ATA_DMA_START); + if (!rw) + dmactl |= ATA_DMA_WR; + writeb(dmactl, mmio + ATA_DMA_CMD); + + /* issue r/w command */ + ap->ops->exec_command(ap, &qc->tf); +} + +/** + * ata_bmdma_start_mmio - Start a PCI IDE BMDMA transaction + * @qc: Info associated with this ATA transaction. + * + * LOCKING: + * spin_lock_irqsave(host_set lock) + */ + +static void ata_bmdma_start_mmio (struct ata_queued_cmd *qc) +{ + struct ata_port *ap = qc->ap; + void __iomem *mmio = (void __iomem *) ap->ioaddr.bmdma_addr; + u8 dmactl; + + /* start host DMA transaction */ + dmactl = readb(mmio + ATA_DMA_CMD); + writeb(dmactl | ATA_DMA_START, mmio + ATA_DMA_CMD); + + /* Strictly, one may wish to issue a readb() here, to + * flush the mmio write. However, control also passes + * to the hardware at this point, and it will interrupt + * us when we are to resume control. So, in effect, + * we don't care when the mmio write flushes. + * Further, a read of the DMA status register _immediately_ + * following the write may not be what certain flaky hardware + * is expected, so I think it is best to not add a readb() + * without first all the MMIO ATA cards/mobos. + * Or maybe I'm just being paranoid. + */ +} + +/** + * ata_bmdma_setup_pio - Set up PCI IDE BMDMA transaction (PIO) + * @qc: Info associated with this ATA transaction. + * + * LOCKING: + * spin_lock_irqsave(host_set lock) + */ + +static void ata_bmdma_setup_pio (struct ata_queued_cmd *qc) +{ + struct ata_port *ap = qc->ap; + unsigned int rw = (qc->tf.flags & ATA_TFLAG_WRITE); + u8 dmactl; + + /* load PRD table addr. */ + outl(ap->prd_dma, ap->ioaddr.bmdma_addr + ATA_DMA_TABLE_OFS); + + /* specify data direction, triple-check start bit is clear */ + dmactl = inb(ap->ioaddr.bmdma_addr + ATA_DMA_CMD); + dmactl &= ~(ATA_DMA_WR | ATA_DMA_START); + if (!rw) + dmactl |= ATA_DMA_WR; + outb(dmactl, ap->ioaddr.bmdma_addr + ATA_DMA_CMD); + + /* issue r/w command */ + ap->ops->exec_command(ap, &qc->tf); +} + +/** + * ata_bmdma_start_pio - Start a PCI IDE BMDMA transaction (PIO) + * @qc: Info associated with this ATA transaction. + * + * LOCKING: + * spin_lock_irqsave(host_set lock) + */ + +static void ata_bmdma_start_pio (struct ata_queued_cmd *qc) +{ + struct ata_port *ap = qc->ap; + u8 dmactl; + + /* start host DMA transaction */ + dmactl = inb(ap->ioaddr.bmdma_addr + ATA_DMA_CMD); + outb(dmactl | ATA_DMA_START, + ap->ioaddr.bmdma_addr + ATA_DMA_CMD); +} + + +/** + * ata_bmdma_start - Start a PCI IDE BMDMA transaction + * @qc: Info associated with this ATA transaction. + * + * Writes the ATA_DMA_START flag to the DMA command register. + * + * May be used as the bmdma_start() entry in ata_port_operations. + * + * LOCKING: + * spin_lock_irqsave(host_set lock) + */ +void ata_bmdma_start(struct ata_queued_cmd *qc) +{ + if (qc->ap->flags & ATA_FLAG_MMIO) + ata_bmdma_start_mmio(qc); + else + ata_bmdma_start_pio(qc); +} + + +/** + * ata_bmdma_setup - Set up PCI IDE BMDMA transaction + * @qc: Info associated with this ATA transaction. + * + * Writes address of PRD table to device's PRD Table Address + * register, sets the DMA control register, and calls + * ops->exec_command() to start the transfer. + * + * May be used as the bmdma_setup() entry in ata_port_operations. + * + * LOCKING: + * spin_lock_irqsave(host_set lock) + */ +void ata_bmdma_setup(struct ata_queued_cmd *qc) +{ + if (qc->ap->flags & ATA_FLAG_MMIO) + ata_bmdma_setup_mmio(qc); + else + ata_bmdma_setup_pio(qc); +} + + +/** + * ata_bmdma_irq_clear - Clear PCI IDE BMDMA interrupt. + * @ap: Port associated with this ATA transaction. + * + * Clear interrupt and error flags in DMA status register. + * + * May be used as the irq_clear() entry in ata_port_operations. + * + * LOCKING: + * spin_lock_irqsave(host_set lock) + */ + +void ata_bmdma_irq_clear(struct ata_port *ap) +{ + if (ap->flags & ATA_FLAG_MMIO) { + void __iomem *mmio = ((void __iomem *) ap->ioaddr.bmdma_addr) + ATA_DMA_STATUS; + writeb(readb(mmio), mmio); + } else { + unsigned long addr = ap->ioaddr.bmdma_addr + ATA_DMA_STATUS; + outb(inb(addr), addr); + } + +} + + +/** + * ata_bmdma_status - Read PCI IDE BMDMA status + * @ap: Port associated with this ATA transaction. + * + * Read and return BMDMA status register. + * + * May be used as the bmdma_status() entry in ata_port_operations. + * + * LOCKING: + * spin_lock_irqsave(host_set lock) + */ + +u8 ata_bmdma_status(struct ata_port *ap) +{ + u8 host_stat; + if (ap->flags & ATA_FLAG_MMIO) { + void __iomem *mmio = (void __iomem *) ap->ioaddr.bmdma_addr; + host_stat = readb(mmio + ATA_DMA_STATUS); + } else + host_stat = inb(ap->ioaddr.bmdma_addr + ATA_DMA_STATUS); + return host_stat; +} + + +/** + * ata_bmdma_stop - Stop PCI IDE BMDMA transfer + * @qc: Command we are ending DMA for + * + * Clears the ATA_DMA_START flag in the dma control register + * + * May be used as the bmdma_stop() entry in ata_port_operations. + * + * LOCKING: + * spin_lock_irqsave(host_set lock) + */ + +void ata_bmdma_stop(struct ata_queued_cmd *qc) +{ + struct ata_port *ap = qc->ap; + if (ap->flags & ATA_FLAG_MMIO) { + void __iomem *mmio = (void __iomem *) ap->ioaddr.bmdma_addr; + + /* clear start/stop bit */ + writeb(readb(mmio + ATA_DMA_CMD) & ~ATA_DMA_START, + mmio + ATA_DMA_CMD); + } else { + /* clear start/stop bit */ + outb(inb(ap->ioaddr.bmdma_addr + ATA_DMA_CMD) & ~ATA_DMA_START, + ap->ioaddr.bmdma_addr + ATA_DMA_CMD); + } + + /* one-PIO-cycle guaranteed wait, per spec, for HDMA1:0 transition */ + ata_altstatus(ap); /* dummy read */ +} + /** * ata_host_intr - Handle host interrupt for given (port, task) * @ap: Port on which interrupt arrived (possibly...) @@ -4733,66 +4040,52 @@ 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 = 0; + u8 status, host_stat; - VPRINTK("ata%u: protocol %d task_state %d\n", - ap->id, qc->tf.protocol, ap->hsm_task_state); + switch (qc->tf.protocol) { - /* 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. - */ + 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); - /* 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)) + /* 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 main status, clearing INTRQ */ + status = ata_chk_status(ap); + if (unlikely(status & ATA_BUSY)) + 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; - - /* 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: @@ -4800,9 +4093,9 @@ idle_irq: #ifdef ATA_IRQ_TRAP if ((ap->stats.idle_irq % 1000) == 0) { + handled = 1; ata_irq_ack(ap, 0); /* debug trap */ - ata_port_printk(ap, KERN_WARNING, "irq trap\n"); - return 1; + printk(KERN_WARNING "ata%d: irq trap\n", ap->id); } #endif return 0; /* irq not handled */ @@ -4839,11 +4132,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_DISABLED)) { + !(ap->flags & (ATA_FLAG_PORT_DISABLED | ATA_FLAG_NOINTR))) { struct ata_queued_cmd *qc; qc = ata_qc_from_tag(ap, ap->active_tag); - if (qc && (!(qc->tf.flags & ATA_TFLAG_POLLING)) && + if (qc && (!(qc->tf.ctl & ATA_NIEN)) && (qc->flags & ATA_QCFLAG_ACTIVE)) handled |= ata_host_intr(ap, qc); } @@ -4855,146 +4148,117 @@ irqreturn_t ata_interrupt (int irq, void *dev_instance, struct pt_regs *regs) } /** - * sata_scr_valid - test whether SCRs are accessible - * @ap: ATA port to test SCR accessibility for + * atapi_packet_task - Write CDB bytes to hardware + * @_data: Port to which ATAPI device is attached. * - * Test whether SCRs are accessible for @ap. + * 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: - * None. - * - * RETURNS: - * 1 if SCRs are accessible, 0 otherwise. + * Kernel thread context (may sleep) */ -int sata_scr_valid(struct ata_port *ap) -{ - return ap->cbl == ATA_CBL_SATA && ap->ops->scr_read; -} -/** - * 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. - */ -int sata_scr_read(struct ata_port *ap, int reg, u32 *val) +static void atapi_packet_task(void *_data) { - if (sata_scr_valid(ap)) { - *val = ap->ops->scr_read(ap, reg); - return 0; + struct ata_port *ap = _data; + struct ata_queued_cmd *qc; + u8 status; + + qc = ata_qc_from_tag(ap, ap->active_tag); + assert(qc != NULL); + assert(qc->flags & ATA_QCFLAG_ACTIVE); + + /* 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_ATA_BUS; + goto err_out; } - 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; + /* make sure DRQ is set */ + status = ata_chk_status(ap); + if ((status & (ATA_BUSY | ATA_DRQ)) != ATA_DRQ) { + qc->err_mask |= AC_ERR_ATA_BUS; + goto err_out; } - return -EOPNOTSUPP; -} -/** - * 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; + /* send SCSI cdb */ + DPRINTK("send cdb\n"); + assert(ap->cdb_len >= 12); + + if (qc->tf.protocol == ATA_PROT_ATAPI_DMA || + qc->tf.protocol == ATA_PROT_ATAPI_NODATA) { + unsigned long flags; + + /* 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. + */ + spin_lock_irqsave(&ap->host_set->lock, flags); + ap->flags &= ~ATA_FLAG_NOINTR; + ata_data_xfer(ap, qc->cdb, ap->cdb_len, 1); + 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, ap->cdb_len, 1); + + /* PIO commands are handled by polling */ + ap->hsm_task_state = HSM_ST; + queue_work(ata_wq, &ap->pio_task); } - return -EOPNOTSUPP; -} -/** - * 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; + return; - if (!sata_scr_read(ap, SCR_STATUS, &sstatus) && (sstatus & 0xf) == 0x3) - return 1; - return 0; +err_out: + ata_poll_qc_complete(qc); } + /** - * ata_port_offline - test whether the given port is offline - * @ap: ATA port to test + * ata_port_start - Set port up for dma. + * @ap: Port to initialize * - * 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). + * Called just after data structures for each port are + * initialized. Allocates space for PRD table. * - * LOCKING: - * None. + * May be used as the port_start() entry in ata_port_operations. * - * RETURNS: - * 1 if the port offline status is available and offline. + * LOCKING: + * Inherited from caller. */ -int ata_port_offline(struct ata_port *ap) + +/* + * Execute a 'simple' command, that only consists of the opcode 'cmd' itself, + * without filling any other registers + */ +static int ata_do_simple_cmd(struct ata_port *ap, struct ata_device *dev, + u8 cmd) { - u32 sstatus; + struct ata_taskfile tf; + int err; - if (!sata_scr_read(ap, SCR_STATUS, &sstatus) && (sstatus & 0xf) != 0x3) - return 1; - return 0; + ata_tf_init(ap, &tf, dev->devno); + + tf.command = cmd; + tf.flags |= ATA_TFLAG_DEVICE; + tf.protocol = ATA_PROT_NODATA; + + err = ata_exec_internal(ap, dev, &tf, DMA_NONE, NULL, 0); + if (err) + printk(KERN_ERR "%s: ata command failed: %d\n", + __FUNCTION__, err); + + return err; } -int ata_flush_cache(struct ata_device *dev) +static int ata_flush_cache(struct ata_port *ap, struct ata_device *dev) { - unsigned int err_mask; u8 cmd; if (!ata_try_flush_cache(dev)) @@ -5002,150 +4266,67 @@ int ata_flush_cache(struct ata_device *dev) if (ata_id_has_flush_ext(dev->id)) cmd = ATA_CMD_FLUSH_EXT; - else - cmd = ATA_CMD_FLUSH; - - err_mask = ata_do_simple_cmd(dev, cmd); - if (err_mask) { - ata_dev_printk(dev, KERN_ERR, "failed to flush cache\n"); - return -EIO; - } - - return 0; -} - -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) -{ - 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); + else + cmd = ATA_CMD_FLUSH; - spin_unlock_irqrestore(ap->lock, flags); + return ata_do_simple_cmd(ap, dev, cmd); +} - /* wait and check result */ - if (wait) { - ata_port_wait_eh(ap); - WARN_ON(ap->pflags & ATA_PFLAG_PM_PENDING); - if (rc) - return rc; - } - } +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) +{ + return ata_do_simple_cmd(ap, dev, ATA_CMD_IDLEIMMEDIATE); } /** - * ata_host_set_suspend - suspend host_set - * @host_set: host_set to suspend - * @mesg: PM message - * - * Suspend @host_set. Actual operation is performed by EH. This - * function requests EH to perform PM operations and waits for EH - * to finish. + * ata_device_resume - wakeup a previously suspended devices * - * LOCKING: - * Kernel thread context (may sleep). + * Kick the drive back into action, by sending it an idle immediate + * command and making sure its transfer mode matches between drive + * and host. * - * RETURNS: - * 0 on success, -errno on failure. */ -int ata_host_set_suspend(struct ata_host_set *host_set, pm_message_t mesg) +int ata_device_resume(struct ata_port *ap, struct ata_device *dev) { - 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 (ap->flags & ATA_FLAG_SUSPENDED) { + ata_busy_wait(ap, ATA_BUSY | ATA_DRQ, 200000); + ap->flags &= ~ATA_FLAG_SUSPENDED; + ata_set_mode(ap); } + 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_host_set_resume - resume host_set - * @host_set: host_set to resume + * ata_device_suspend - prepare a device for suspend * - * 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. + * Flush the cache on the drive, if appropriate, then issue a + * standbynow command. * - * LOCKING: - * Kernel thread context (may sleep). */ -void ata_host_set_resume(struct ata_host_set *host_set) +int ata_device_suspend(struct ata_port *ap, struct ata_device *dev) { - 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; -} + if (!ata_dev_present(dev)) + return 0; + if (dev->class == ATA_DEV_ATA) + ata_flush_cache(ap, dev); -/** - * ata_port_start - Set port up for dma. - * @ap: Port to initialize - * - * Called just after data structures for each port are - * initialized. Allocates space for PRD table. - * - * May be used as the port_start() entry in ata_port_operations. - * - * LOCKING: - * Inherited from caller. - */ + ata_standby_drive(ap, dev); + ap->flags |= ATA_FLAG_SUSPENDED; + return 0; +} int ata_port_start (struct ata_port *ap) { - struct device *dev = ap->dev; + struct device *dev = ap->host_set->dev; int rc; ap->prd = dma_alloc_coherent(dev, ATA_PRD_TBL_SZ, &ap->prd_dma, GFP_KERNEL); @@ -5178,7 +4359,7 @@ int ata_port_start (struct ata_port *ap) void ata_port_stop (struct ata_port *ap) { - struct device *dev = ap->dev; + struct device *dev = ap->host_set->dev; dma_free_coherent(dev, ATA_PRD_TBL_SZ, ap->prd, ap->prd_dma); ata_pad_free(ap, dev); @@ -5190,36 +4371,26 @@ void ata_host_stop (struct ata_host_set *host_set) iounmap(host_set->mmio_base); } + /** - * ata_dev_init - Initialize an ata_device structure - * @dev: Device structure to initialize - * - * Initialize @dev in preparation for probing. + * 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 * * LOCKING: * Inherited from caller. */ -void ata_dev_init(struct ata_device *dev) + +static void ata_host_remove(struct ata_port *ap, unsigned int do_unregister) { - struct ata_port *ap = dev->ap; - unsigned long flags; + struct Scsi_Host *sh = ap->host; - /* SATA spd limit is bound to the first device */ - ap->sata_spd_limit = ap->hw_sata_spd_limit; + DPRINTK("ENTER\n"); - /* 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); + if (do_unregister) + scsi_remove_host(sh); - 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; + ap->ops->port_stop(ap); } /** @@ -5236,6 +4407,7 @@ void ata_dev_init(struct ata_device *dev) * 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) @@ -5248,13 +4420,11 @@ 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->lock = &host_set->lock; - ap->flags = ATA_FLAG_DISABLED; + ap->flags = ATA_FLAG_PORT_DISABLED; ap->id = host->unique_id; ap->host = host; ap->ctl = ATA_DEVCTL_OBS; ap->host_set = host_set; - ap->dev = ent->dev; ap->port_no = port_no; ap->hard_port_no = ent->legacy_mode ? ent->hard_port_no : port_no; @@ -5262,38 +4432,16 @@ static void ata_host_init(struct ata_port *ap, struct Scsi_Host *host, ap->mwdma_mask = ent->mwdma_mask; ap->udma_mask = ent->udma_mask; ap->flags |= ent->host_flags; - ap->flags |= ent->port_flags[port_no]; /* pata fix */ ap->ops = ent->port_ops; - ap->hw_sata_spd_limit = UINT_MAX; + ap->cbl = ATA_CBL_NONE; 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; + INIT_WORK(&ap->packet_task, atapi_packet_task, ap); + INIT_WORK(&ap->pio_task, ata_pio_task, ap); - for (i = 0; i < ATA_MAX_DEVICES; i++) { - struct ata_device *dev = &ap->device[i]; - dev->ap = ap; - dev->devno = i; - ata_dev_init(dev); - } + for (i = 0; i < ATA_MAX_DEVICES; i++) + ap->device[i].devno = i; #ifdef ATA_IRQ_TRAP ap->stats.unhandled_irq = 1; @@ -5327,21 +4475,11 @@ static struct ata_port * ata_host_add(const struct ata_probe_ent *ent, int rc; DPRINTK("ENTER\n"); - - 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); - return NULL; - } - host = scsi_host_alloc(ent->sht, sizeof(struct ata_port)); if (!host) return NULL; - host->transportt = &ata_scsi_transport_template; - - ap = ata_shost_to_port(host); + ap = (struct ata_port *) &host->hostdata[0]; ata_host_init(ap, host, host_set, ent, port_no); @@ -5374,12 +4512,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) */ @@ -5395,7 +4533,6 @@ int ata_device_add(const struct ata_probe_ent *ent) host_set->mmio_base = ent->mmio_base; host_set->private_data = ent->private_data; host_set->ops = ent->port_ops; - host_set->flags = ent->host_set_flags; /* register each port bound to this device */ for (i = 0; i < ent->n_ports; i++) { @@ -5412,18 +4549,18 @@ int ata_device_add(const struct ata_probe_ent *ent) (ap->pio_mask << ATA_SHIFT_PIO); /* print per-port info to dmesg */ - 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); + 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_chk_status(ap); host_set->ops->irq_clear(ap); - ata_eh_freeze_port(ap); /* freeze port before requesting IRQ */ count++; } @@ -5431,78 +4568,45 @@ int ata_device_add(const struct ata_probe_ent *ent) goto err_free_ret; /* obtain irq, that is shared between channels */ - 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); + if (request_irq(ent->irq, ent->port_ops->irq_handler, ent->irq_flags, + DRV_NAME, host_set)) 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]; - /* 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; + DPRINTK("ata%u: probe begin\n", ap->id); + rc = ata_bus_probe(ap); + DPRINTK("ata%u: 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. + */ } - ap->sata_spd_limit = ap->hw_sata_spd_limit; rc = scsi_add_host(ap->host, dev); if (rc) { - ata_port_printk(ap, KERN_ERR, "scsi_add_host failed\n"); + printk(KERN_ERR "ata%u: scsi_add_host failed\n", + ap->id); /* 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) */ - DPRINTK("host probe begin\n"); + DPRINTK("probe begin\n"); for (i = 0; i < count; i++) { struct ata_port *ap = host_set->ports[i]; @@ -5516,11 +4620,8 @@ int ata_device_add(const struct ata_probe_ent *ent) err_out: for (i = 0; i < count; i++) { - struct ata_port *ap = host_set->ports[i]; - if (ap) { - ap->ops->port_stop(ap); - scsi_host_put(ap->host); - } + ata_host_remove(host_set->ports[i], 1); + scsi_host_put(host_set->ports[i]->host); } err_free_ret: kfree(host_set); @@ -5528,69 +4629,11 @@ 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 * - * Unregister all objects associated with this host set. Free those + * Unregister all objects associated with this host set. Free those * objects. * * LOCKING: @@ -5599,15 +4642,18 @@ void ata_port_detach(struct ata_port *ap) 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++) - ata_port_detach(host_set->ports[i]); + for (i = 0; i < host_set->n_ports; i++) { + ap = host_set->ports[i]; + scsi_remove_host(ap->host); + } free_irq(host_set->irq, host_set); for (i = 0; i < host_set->n_ports; i++) { - struct ata_port *ap = host_set->ports[i]; + ap = host_set->ports[i]; ata_scsi_release(ap->host); @@ -5645,12 +4691,12 @@ void ata_host_set_remove(struct ata_host_set *host_set) int ata_scsi_release(struct Scsi_Host *host) { - struct ata_port *ap = ata_shost_to_port(host); + struct ata_port *ap = (struct ata_port *) &host->hostdata[0]; DPRINTK("ENTER\n"); ap->ops->port_disable(ap); - ap->ops->port_stop(ap); + ata_host_remove(ap, 0); DPRINTK("EXIT\n"); return 1; @@ -5682,6 +4728,32 @@ void ata_std_ports(struct ata_ioports *ioaddr) ioaddr->command_addr = ioaddr->cmd_addr + ATA_REG_CMD; } +static struct ata_probe_ent * +ata_probe_ent_alloc(struct device *dev, const struct ata_port_info *port) +{ + struct ata_probe_ent *probe_ent; + + probe_ent = kzalloc(sizeof(*probe_ent), GFP_KERNEL); + if (!probe_ent) { + printk(KERN_ERR DRV_NAME "(%s): out of memory\n", + kobject_name(&(dev->kobj))); + return NULL; + } + + INIT_LIST_HEAD(&probe_ent->node); + probe_ent->dev = dev; + + probe_ent->sht = port->sht; + probe_ent->host_flags = port->host_flags; + probe_ent->pio_mask = port->pio_mask; + probe_ent->mwdma_mask = port->mwdma_mask; + probe_ent->udma_mask = port->udma_mask; + probe_ent->port_ops = port->port_ops; + + return probe_ent; +} + + #ifdef CONFIG_PCI @@ -5692,6 +4764,256 @@ void ata_pci_host_stop (struct ata_host_set *host_set) pci_iounmap(pdev, host_set->mmio_base); } +/** + * ata_pci_init_native_mode - Initialize native-mode driver + * @pdev: pci device to be initialized + * @port: array[2] of pointers to port info structures. + * @ports: bitmap of ports present + * + * Utility function which allocates and initializes an + * ata_probe_ent structure for a standard dual-port + * PIO-based IDE controller. The returned ata_probe_ent + * structure can be passed to ata_device_add(). The returned + * ata_probe_ent structure should then be freed with kfree(). + * + * The caller need only pass the address of the primary port, the + * secondary will be deduced automatically. If the device has non + * standard secondary port mappings this function can be called twice, + * once for each interface. + */ + +struct ata_probe_ent * +ata_pci_init_native_mode(struct pci_dev *pdev, struct ata_port_info **port, int ports) +{ + struct ata_probe_ent *probe_ent = + ata_probe_ent_alloc(pci_dev_to_dev(pdev), port[0]); + int p = 0; + + if (!probe_ent) + return NULL; + + probe_ent->irq = pdev->irq; + probe_ent->irq_flags = SA_SHIRQ; + probe_ent->private_data = port[0]->private_data; + + if (ports & ATA_PORT_PRIMARY) { + probe_ent->port[p].cmd_addr = pci_resource_start(pdev, 0); + probe_ent->port[p].altstatus_addr = + probe_ent->port[p].ctl_addr = + pci_resource_start(pdev, 1) | ATA_PCI_CTL_OFS; + probe_ent->port[p].bmdma_addr = pci_resource_start(pdev, 4); + ata_std_ports(&probe_ent->port[p]); + p++; + } + + if (ports & ATA_PORT_SECONDARY) { + probe_ent->port[p].cmd_addr = pci_resource_start(pdev, 2); + probe_ent->port[p].altstatus_addr = + probe_ent->port[p].ctl_addr = + pci_resource_start(pdev, 3) | ATA_PCI_CTL_OFS; + probe_ent->port[p].bmdma_addr = pci_resource_start(pdev, 4) + 8; + ata_std_ports(&probe_ent->port[p]); + p++; + } + + probe_ent->n_ports = p; + return probe_ent; +} + +static struct ata_probe_ent *ata_pci_init_legacy_port(struct pci_dev *pdev, struct ata_port_info *port, int port_num) +{ + struct ata_probe_ent *probe_ent; + + probe_ent = ata_probe_ent_alloc(pci_dev_to_dev(pdev), port); + if (!probe_ent) + return NULL; + + probe_ent->legacy_mode = 1; + probe_ent->n_ports = 1; + probe_ent->hard_port_no = port_num; + probe_ent->private_data = port->private_data; + + switch(port_num) + { + case 0: + probe_ent->irq = 14; + probe_ent->port[0].cmd_addr = 0x1f0; + probe_ent->port[0].altstatus_addr = + probe_ent->port[0].ctl_addr = 0x3f6; + break; + case 1: + probe_ent->irq = 15; + probe_ent->port[0].cmd_addr = 0x170; + probe_ent->port[0].altstatus_addr = + probe_ent->port[0].ctl_addr = 0x376; + break; + } + probe_ent->port[0].bmdma_addr = pci_resource_start(pdev, 4) + 8 * port_num; + ata_std_ports(&probe_ent->port[0]); + return probe_ent; +} + +/** + * ata_pci_init_one - Initialize/register PCI IDE host controller + * @pdev: Controller to be initialized + * @port_info: Information from low-level host driver + * @n_ports: Number of ports attached to host controller + * + * This is a helper function which can be called from a driver's + * xxx_init_one() probe function if the hardware uses traditional + * IDE taskfile registers. + * + * This function calls pci_enable_device(), reserves its register + * regions, sets the dma mask, enables bus master mode, and calls + * ata_device_add() + * + * LOCKING: + * Inherited from PCI layer (may sleep). + * + * RETURNS: + * Zero on success, negative on errno-based value on error. + */ + +int ata_pci_init_one (struct pci_dev *pdev, struct ata_port_info **port_info, + unsigned int n_ports) +{ + struct ata_probe_ent *probe_ent = NULL, *probe_ent2 = NULL; + struct ata_port_info *port[2]; + u8 tmp8, mask; + unsigned int legacy_mode = 0; + int disable_dev_on_err = 1; + int rc; + + DPRINTK("ENTER\n"); + + port[0] = port_info[0]; + if (n_ports > 1) + port[1] = port_info[1]; + else + port[1] = port[0]; + + if ((port[0]->host_flags & ATA_FLAG_NO_LEGACY) == 0 + && (pdev->class >> 8) == PCI_CLASS_STORAGE_IDE) { + /* TODO: What if one channel is in native mode ... */ + pci_read_config_byte(pdev, PCI_CLASS_PROG, &tmp8); + mask = (1 << 2) | (1 << 0); + if ((tmp8 & mask) != mask) + legacy_mode = (1 << 3); + } + + /* FIXME... */ + if ((!legacy_mode) && (n_ports > 2)) { + printk(KERN_ERR "ata: BUG: native mode, n_ports > 2\n"); + n_ports = 2; + /* For now */ + } + + /* FIXME: Really for ATA it isn't safe because the device may be + multi-purpose and we want to leave it alone if it was already + enabled. Secondly for shared use as Arjan says we want refcounting + + Checking dev->is_enabled is insufficient as this is not set at + boot for the primary video which is BIOS enabled + */ + + rc = pci_enable_device(pdev); + if (rc) + return rc; + + rc = pci_request_regions(pdev, DRV_NAME); + if (rc) { + disable_dev_on_err = 0; + goto err_out; + } + + /* FIXME: Should use platform specific mappers for legacy port ranges */ + if (legacy_mode) { + if (!request_region(0x1f0, 8, "libata")) { + struct resource *conflict, res; + res.start = 0x1f0; + res.end = 0x1f0 + 8 - 1; + conflict = ____request_resource(&ioport_resource, &res); + if (!strcmp(conflict->name, "libata")) + legacy_mode |= (1 << 0); + else { + disable_dev_on_err = 0; + printk(KERN_WARNING "ata: 0x1f0 IDE port busy\n"); + } + } else + legacy_mode |= (1 << 0); + + if (!request_region(0x170, 8, "libata")) { + struct resource *conflict, res; + res.start = 0x170; + res.end = 0x170 + 8 - 1; + conflict = ____request_resource(&ioport_resource, &res); + if (!strcmp(conflict->name, "libata")) + legacy_mode |= (1 << 1); + else { + disable_dev_on_err = 0; + printk(KERN_WARNING "ata: 0x170 IDE port busy\n"); + } + } else + legacy_mode |= (1 << 1); + } + + /* we have legacy mode, but all ports are unavailable */ + if (legacy_mode == (1 << 3)) { + rc = -EBUSY; + goto err_out_regions; + } + + rc = pci_set_dma_mask(pdev, ATA_DMA_MASK); + if (rc) + goto err_out_regions; + rc = pci_set_consistent_dma_mask(pdev, ATA_DMA_MASK); + if (rc) + goto err_out_regions; + + if (legacy_mode) { + if (legacy_mode & (1 << 0)) + probe_ent = ata_pci_init_legacy_port(pdev, port[0], 0); + if (legacy_mode & (1 << 1)) + probe_ent2 = ata_pci_init_legacy_port(pdev, port[1], 1); + } else { + if (n_ports == 2) + probe_ent = ata_pci_init_native_mode(pdev, port, ATA_PORT_PRIMARY | ATA_PORT_SECONDARY); + else + probe_ent = ata_pci_init_native_mode(pdev, port, ATA_PORT_PRIMARY); + } + if (!probe_ent && !probe_ent2) { + rc = -ENOMEM; + goto err_out_regions; + } + + pci_set_master(pdev); + + /* FIXME: check ata_device_add return */ + if (legacy_mode) { + if (legacy_mode & (1 << 0)) + ata_device_add(probe_ent); + if (legacy_mode & (1 << 1)) + ata_device_add(probe_ent2); + } else + ata_device_add(probe_ent); + + kfree(probe_ent); + kfree(probe_ent2); + + return 0; + +err_out_regions: + if (legacy_mode & (1 << 0)) + release_region(0x1f0, 8); + if (legacy_mode & (1 << 1)) + release_region(0x170, 8); + pci_release_regions(pdev); +err_out: + if (disable_dev_on_err) + pci_disable_device(pdev); + return rc; +} + /** * ata_pci_remove_one - PCI layer callback for device removal * @pdev: PCI device that was removed @@ -5710,12 +5032,8 @@ 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); @@ -5755,55 +5073,20 @@ int pci_test_config_bits(struct pci_dev *pdev, const struct pci_bits *bits) return (tmp == bits->val) ? 1 : 0; } -void ata_pci_device_do_suspend(struct pci_dev *pdev, pm_message_t state) +int ata_pci_device_suspend(struct pci_dev *pdev, pm_message_t state) { pci_save_state(pdev); - - if (state.event == PM_EVENT_SUSPEND) { - pci_disable_device(pdev); - pci_set_power_state(pdev, PCI_D3hot); - } + pci_disable_device(pdev); + pci_set_power_state(pdev, PCI_D3hot); + return 0; } -void ata_pci_device_do_resume(struct pci_dev *pdev) +int ata_pci_device_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 */ @@ -5811,17 +5094,10 @@ 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; } @@ -5829,14 +5105,13 @@ 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 DEFINE_SPINLOCK(ata_ratelimit_lock); +static spinlock_t ata_ratelimit_lock = SPIN_LOCK_UNLOCKED; int ata_ratelimit(void) { @@ -5856,52 +5131,6 @@ 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 @@ -5909,20 +5138,15 @@ u32 ata_wait_register(void __iomem *reg, u32 mask, u32 val, * 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_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); @@ -5936,57 +5160,27 @@ 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); 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_prereset); -EXPORT_SYMBOL_GPL(ata_std_softreset); -EXPORT_SYMBOL_GPL(sata_std_hardreset); -EXPORT_SYMBOL_GPL(ata_std_postreset); -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_error); 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_dev_classify); +EXPORT_SYMBOL_GPL(ata_dev_id_string); +EXPORT_SYMBOL_GPL(ata_dev_config); EXPORT_SYMBOL_GPL(ata_scsi_simulate); EXPORT_SYMBOL_GPL(ata_pio_need_iordy); @@ -5999,23 +5193,11 @@ 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 e92c31d69..59503c9cc 100644 --- a/drivers/scsi/libata-scsi.c +++ b/drivers/scsi/libata-scsi.c @@ -38,11 +38,9 @@ #include #include #include -#include #include #include -#include -#include +#include #include #include #include @@ -52,14 +50,8 @@ #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 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); - +static struct ata_device * +ata_scsi_find_dev(struct ata_port *ap, const struct scsi_device *scsidev); #define RW_RECOVERY_MPAGE 0x1 #define RW_RECOVERY_MPAGE_LEN 12 @@ -100,16 +92,6 @@ static const u8 def_control_mpage[CONTROL_MPAGE_LEN] = { 0, 30 /* extended self test time, see 05-359r1 */ }; -/* - * libata transport template. libata doesn't do real transport stuff. - * It just needs the eh_timed_out hook. - */ -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, -}; - static void ata_scsi_invalid_field(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *)) @@ -169,7 +151,7 @@ int ata_cmd_ioctl(struct scsi_device *scsidev, void __user *arg) struct scsi_sense_hdr sshdr; enum dma_data_direction data_dir; - if (arg == NULL) + if (NULL == (void *)arg) return -EINVAL; if (copy_from_user(args, arg, sizeof(args))) @@ -219,10 +201,12 @@ int ata_cmd_ioctl(struct scsi_device *scsidev, void __user *arg) /* Need code to retrieve data from check condition? */ if ((argbuf) - && copy_to_user(arg + sizeof(args), argbuf, argsize)) + && copy_to_user((void *)(arg + sizeof(args)), argbuf, argsize)) rc = -EFAULT; error: - kfree(argbuf); + if (argbuf) + kfree(argbuf); + return rc; } @@ -244,7 +228,7 @@ int ata_task_ioctl(struct scsi_device *scsidev, void __user *arg) u8 args[7]; struct scsi_sense_hdr sshdr; - if (arg == NULL) + if (NULL == (void *)arg) return -EINVAL; if (copy_from_user(args, arg, sizeof(args))) @@ -262,7 +246,7 @@ int ata_task_ioctl(struct scsi_device *scsidev, void __user *arg) scsi_cmd[14] = args[0]; /* Good values for timeout and retries? Values below - from scsi_ioctl_send_command() for default case... */ + from scsi_ioctl_send_command() for default case... */ if (scsi_execute_req(scsidev, scsi_cmd, DMA_NONE, NULL, 0, &sshdr, (10*HZ), 5)) rc = -EIO; @@ -273,8 +257,20 @@ int ata_task_ioctl(struct scsi_device *scsidev, void __user *arg) int ata_scsi_ioctl(struct scsi_device *scsidev, int cmd, void __user *arg) { + struct ata_port *ap; + struct ata_device *dev; int val = -EINVAL, rc = -EINVAL; + ap = (struct ata_port *) &scsidev->host->hostdata[0]; + if (!ap) + goto out; + + dev = ata_scsi_find_dev(ap, scsidev); + if (!dev) { + rc = -ENODEV; + goto out; + } + switch (cmd) { case ATA_IOC_GET_IO32: val = 0; @@ -303,11 +299,13 @@ int ata_scsi_ioctl(struct scsi_device *scsidev, int cmd, void __user *arg) break; } +out: return rc; } /** * 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 @@ -326,13 +324,14 @@ 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_device *dev, +struct ata_queued_cmd *ata_scsi_qc_new(struct ata_port *ap, + struct ata_device *dev, struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *)) { struct ata_queued_cmd *qc; - qc = ata_qc_new_init(dev); + qc = ata_qc_new_init(ap, dev); if (qc) { qc->scsicmd = cmd; qc->scsidone = done; @@ -397,129 +396,20 @@ void ata_dump_status(unsigned id, struct ata_taskfile *tf) } } -/** - * 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) +int ata_scsi_device_resume(struct scsi_device *sdev) { - 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; + struct ata_port *ap = (struct ata_port *) &sdev->host->hostdata[0]; + struct ata_device *dev = &ap->device[sdev->id]; - 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); - - /* 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; + return ata_device_resume(ap, dev); } -/** - * 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) +int ata_scsi_device_suspend(struct scsi_device *sdev) { - 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; + struct ata_port *ap = (struct ata_port *) &sdev->host->hostdata[0]; + struct ata_device *dev = &ap->device[sdev->id]; - 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 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; + return ata_device_suspend(ap, dev); } /** @@ -530,7 +420,6 @@ int ata_scsi_device_resume(struct scsi_device *sdev) * @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 @@ -539,8 +428,8 @@ int ata_scsi_device_resume(struct scsi_device *sdev) * LOCKING: * 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, int verbose) +void ata_to_sense_error(unsigned id, u8 drv_stat, u8 drv_err, u8 *sk, u8 *asc, + u8 *ascq) { int i; @@ -596,7 +485,7 @@ void ata_to_sense_error(unsigned id, u8 drv_stat, u8 drv_err, u8 *sk, u8 *asc, /* Look for drv_err */ for (i = 0; sense_table[i][0] != 0xFF; i++) { /* Look for best matches first */ - if ((sense_table[i][0] & drv_err) == + if ((sense_table[i][0] & drv_err) == sense_table[i][0]) { *sk = sense_table[i][1]; *asc = sense_table[i][2]; @@ -605,9 +494,8 @@ void ata_to_sense_error(unsigned id, u8 drv_stat, u8 drv_err, u8 *sk, u8 *asc, } } /* No immediate match */ - if (verbose) - printk(KERN_WARNING "ata%u: no sense translation for " - "error 0x%02x\n", id, drv_err); + printk(KERN_WARNING "ata%u: no sense translation for " + "error 0x%02x\n", id, drv_err); } /* Fall back to interpreting status bits */ @@ -620,21 +508,21 @@ void ata_to_sense_error(unsigned id, u8 drv_stat, u8 drv_err, u8 *sk, u8 *asc, } } /* No error? Undecoded? */ - if (verbose) - printk(KERN_WARNING "ata%u: no sense translation for " - "status: 0x%02x\n", id, drv_stat); + 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 */ - *sk = ABORTED_COMMAND; - *asc = 0x00; - *ascq = 0x00; + /* For our last chance pick, use medium read error because + * it's much more common than an ATA drive telling you a write + * has failed. + */ + *sk = MEDIUM_ERROR; + *asc = 0x11; /* "unrecovered read error" */ + *ascq = 0x04; /* "auto-reallocation failed" */ 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); + 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; } @@ -654,23 +542,27 @@ 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->result_tf; + struct ata_taskfile *tf = &qc->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. + */ + assert(NULL != qc->ap->ops->tf_read); + qc->ap->ops->tf_read(qc->ap, tf); + /* * Use ata_to_sense_error() to map status register bits * onto sense key, asc & ascq. */ - if (qc->err_mask || - tf->command & (ATA_BUSY | ATA_DF | ATA_ERR | ATA_DRQ)) { + if (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], verbose); + &sb[1], &sb[2], &sb[3]); sb[1] &= 0x0f; } @@ -726,22 +618,26 @@ 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->result_tf; + struct ata_taskfile *tf = &qc->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. + */ + assert(NULL != qc->ap->ops->tf_read); + qc->ap->ops->tf_read(qc->ap, tf); + /* * Use ata_to_sense_error() to map status register bits * onto sense key, asc & ascq. */ - if (qc->err_mask || - tf->command & (ATA_BUSY | ATA_DF | ATA_ERR | ATA_DRQ)) { + if (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], verbose); + &sb[2], &sb[12], &sb[13]); sb[2] &= 0x0f; } @@ -766,49 +662,6 @@ void ata_gen_fixed_sense(struct ata_queued_cmd *qc) } } -static void ata_scsi_sdev_config(struct scsi_device *sdev) -{ - sdev->use_10_for_rw = 1; - sdev->use_10_for_ms = 1; -} - -static void ata_scsi_dev_config(struct scsi_device *sdev, - struct ata_device *dev) -{ - unsigned int max_sectors; - - /* TODO: 2048 is an arbitrary number, not the - * hardware maximum. This should be increased to - * 65534 when Jens Axboe's patch for dynamically - * determining max_sectors is merged. - */ - max_sectors = ATA_MAX_SECTORS; - if (dev->flags & ATA_DFLAG_LBA48) - max_sectors = ATA_MAX_SECTORS_LBA48; - if (dev->max_sectors) - max_sectors = dev->max_sectors; - - blk_queue_max_sectors(sdev->request_queue, max_sectors); - - /* - * SATA DMA transfers must be multiples of 4 byte, so - * we need to pad ATAPI transfers using an extra sg. - * Decrement max hw segments accordingly. - */ - if (dev->class == ATA_DEV_ATAPI) { - 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); - } -} - /** * ata_scsi_slave_config - Set SCSI device attributes * @sdev: SCSI device to examine @@ -823,88 +676,77 @@ 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); + sdev->use_10_for_rw = 1; + sdev->use_10_for_ms = 1; blk_queue_max_phys_segments(sdev->request_queue, LIBATA_MAX_PRD); - if (dev) - ata_scsi_dev_config(sdev, dev); + if (sdev->id < ATA_MAX_DEVICES) { + struct ata_port *ap; + struct ata_device *dev; - return 0; /* scsi layer doesn't check return value, sigh */ -} - -/** - * ata_scsi_slave_destroy - SCSI device is about to be destroyed - * @sdev: SCSI device to be destroyed - * - * @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: - * Defined by SCSI layer. We don't really care. - */ -void ata_scsi_slave_destroy(struct scsi_device *sdev) -{ - struct ata_port *ap = ata_shost_to_port(sdev->host); - unsigned long flags; - struct ata_device *dev; + ap = (struct ata_port *) &sdev->host->hostdata[0]; + dev = &ap->device[sdev->id]; - if (!ap->ops->error_handler) - return; + /* TODO: 1024 is an arbitrary number, not the + * hardware maximum. This should be increased to + * 65534 when Jens Axboe's patch for dynamically + * determining max_sectors is merged. + */ + if ((dev->flags & ATA_DFLAG_LBA48) && + ((dev->flags & ATA_DFLAG_LOCK_SECTORS) == 0)) { + /* + * do not overwrite sdev->host->max_sectors, since + * other drives on this host may not support LBA48 + */ + blk_queue_max_sectors(sdev->request_queue, 2048); + } - 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); + /* + * SATA DMA transfers must be multiples of 4 byte, so + * we need to pad ATAPI transfers using an extra sg. + * Decrement max hw segments accordingly. + */ + if (dev->class == ATA_DEV_ATAPI) { + request_queue_t *q = sdev->request_queue; + blk_queue_max_hw_segments(q, q->max_hw_segments - 1); + } } - spin_unlock_irqrestore(ap->lock, flags); + + return 0; /* scsi layer doesn't check return value, sigh */ } /** - * ata_scsi_change_queue_depth - SCSI callback for queue depth config - * @sdev: SCSI device to configure queue depth for - * @queue_depth: new queue depth + * ata_scsi_error - SCSI layer error handler callback + * @host: SCSI host on which error occurred * - * This is libata standard hostt->change_queue_depth callback. - * SCSI will call into this callback when user tries to set queue - * depth via sysfs. + * Handles SCSI-layer-thrown error events. * * LOCKING: - * SCSI layer (we don't care) + * Inherited from SCSI layer (none, can sleep) * * RETURNS: - * Newly configured queue depth. + * Zero. */ -int ata_scsi_change_queue_depth(struct scsi_device *sdev, int queue_depth) + +int ata_scsi_error(struct Scsi_Host *host) { - struct ata_port *ap = ata_shost_to_port(sdev->host); - struct ata_device *dev; - int max_depth; + struct ata_port *ap; - if (queue_depth < 1) - return sdev->queue_depth; + DPRINTK("ENTER\n"); - dev = ata_scsi_find_dev(ap, sdev); - if (!dev || !ata_dev_enabled(dev)) - return sdev->queue_depth; + ap = (struct ata_port *) &host->hostdata[0]; + ap->ops->eng_timeout(ap); - 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; + /* TODO: this is per-command; when queueing is supported + * this code will either change or move to a more + * appropriate place + */ + host->host_failed--; + INIT_LIST_HEAD(&host->eh_cmd_q); - scsi_adjust_queue_depth(sdev, MSG_SIMPLE_TAG, queue_depth); - return queue_depth; + DPRINTK("EXIT\n"); + return 0; } /** @@ -942,7 +784,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) { - tf->flags |= ATA_TFLAG_LBA; + qc->tf.flags |= ATA_TFLAG_LBA; tf->lbah = 0x0; tf->lbam = 0x0; @@ -1143,13 +985,9 @@ static unsigned int ata_scsi_verify_xlat(struct ata_queued_cmd *qc, const u8 *sc if (dev->flags & ATA_DFLAG_LBA) { tf->flags |= ATA_TFLAG_LBA; - if (lba_28_ok(block, n_block)) { - /* use LBA28 */ - tf->command = ATA_CMD_VERIFY; - tf->device |= (block >> 24) & 0xf; - } else if (lba_48_ok(block, n_block)) { - if (!(dev->flags & ATA_DFLAG_LBA48)) - goto out_of_range; + if (dev->flags & ATA_DFLAG_LBA48) { + if (n_block > (64 * 1024)) + goto invalid_fld; /* use LBA48 */ tf->flags |= ATA_TFLAG_LBA48; @@ -1160,9 +998,15 @@ static unsigned int ata_scsi_verify_xlat(struct ata_queued_cmd *qc, const u8 *sc tf->hob_lbah = (block >> 40) & 0xff; tf->hob_lbam = (block >> 32) & 0xff; tf->hob_lbal = (block >> 24) & 0xff; - } else - /* request too large even for LBA48 */ - goto out_of_range; + } else { + if (n_block > 256) + goto invalid_fld; + + /* use LBA28 */ + tf->command = ATA_CMD_VERIFY; + + tf->device |= (block >> 24) & 0xf; + } tf->nsect = n_block & 0xff; @@ -1175,8 +1019,8 @@ static unsigned int ata_scsi_verify_xlat(struct ata_queued_cmd *qc, const u8 *sc /* CHS */ u32 sect, head, cyl, track; - if (!lba_28_ok(block, n_block)) - goto out_of_range; + if (n_block > 256) + goto invalid_fld; /* Convert LBA to CHS */ track = (u32)block / dev->sectors; @@ -1186,14 +1030,14 @@ static unsigned int ata_scsi_verify_xlat(struct ata_queued_cmd *qc, const u8 *sc DPRINTK("block %u track %u cyl %u head %u sect %u\n", (u32)block, track, cyl, head, sect); - - /* Check whether the converted CHS can fit. - Cylinder: 0-65535 + + /* Check whether the converted CHS can fit. + Cylinder: 0-65535 Head: 0-15 Sector: 1-255*/ - if ((cyl >> 16) || (head >> 4) || (sect >> 8) || (!sect)) + if ((cyl >> 16) || (head >> 4) || (sect >> 8) || (!sect)) goto out_of_range; - + tf->command = ATA_CMD_VERIFY; tf->nsect = n_block & 0xff; /* Sector count 0 means 256 sectors */ tf->lbal = sect; @@ -1246,7 +1090,6 @@ 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 || @@ -1293,43 +1136,12 @@ static unsigned int ata_scsi_rw_xlat(struct ata_queued_cmd *qc, const u8 *scsicm */ goto nothing_to_do; - 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) { + if (dev->flags & ATA_DFLAG_LBA) { tf->flags |= ATA_TFLAG_LBA; - if (lba_28_ok(block, n_block)) { - /* use LBA28 */ - tf->device |= (block >> 24) & 0xf; - } else if (lba_48_ok(block, n_block)) { - if (!(dev->flags & ATA_DFLAG_LBA48)) + if (dev->flags & ATA_DFLAG_LBA48) { + /* The request -may- be too large for LBA48. */ + if ((block >> 48) || (n_block > 65536)) goto out_of_range; /* use LBA48 */ @@ -1340,9 +1152,15 @@ static unsigned int ata_scsi_rw_xlat(struct ata_queued_cmd *qc, const u8 *scsicm tf->hob_lbah = (block >> 40) & 0xff; tf->hob_lbam = (block >> 32) & 0xff; tf->hob_lbal = (block >> 24) & 0xff; - } else - /* request too large even for LBA48 */ - goto out_of_range; + } else { + /* use LBA28 */ + + /* The request -may- be too large for LBA28. */ + if ((block >> 28) || (n_block > 256)) + goto out_of_range; + + tf->device |= (block >> 24) & 0xf; + } if (unlikely(ata_rwcmd_protocol(qc) < 0)) goto invalid_fld; @@ -1355,12 +1173,12 @@ static unsigned int ata_scsi_rw_xlat(struct ata_queued_cmd *qc, const u8 *scsicm tf->lbal = block & 0xff; tf->device |= ATA_LBA; - } else { + } else { /* CHS */ u32 sect, head, cyl, track; /* The request -may- be too large for CHS addressing. */ - if (!lba_28_ok(block, n_block)) + if ((block >> 28) || (n_block > 256)) goto out_of_range; if (unlikely(ata_rwcmd_protocol(qc) < 0)) @@ -1375,8 +1193,8 @@ static unsigned int ata_scsi_rw_xlat(struct ata_queued_cmd *qc, const u8 *scsicm DPRINTK("block %u track %u cyl %u head %u sect %u\n", (u32)block, track, cyl, head, sect); - /* Check whether the converted CHS can fit. - Cylinder: 0-65535 + /* Check whether the converted CHS can fit. + Cylinder: 0-65535 Head: 0-15 Sector: 1-255*/ if ((cyl >> 16) || (head >> 4) || (sect >> 8) || (!sect)) @@ -1407,23 +1225,12 @@ nothing_to_do: return 1; } -static void ata_scsi_qc_complete(struct ata_queued_cmd *qc) +static int ata_scsi_qc_complete(struct ata_queued_cmd *qc) { struct scsi_cmnd *cmd = qc->scsicmd; 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 @@ -1448,49 +1255,19 @@ static void ata_scsi_qc_complete(struct ata_queued_cmd *qc) } } - if (need_sense && !qc->ap->ops->error_handler) - ata_dump_status(qc->ap->id, &qc->result_tf); + if (need_sense) { + /* The ata_gen_..._sense routines fill in tf */ + ata_dump_status(qc->ap->id, &qc->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; + return 0; } /** * 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 @@ -1511,25 +1288,19 @@ static int ata_scmd_need_defer(struct ata_device *dev, int is_io) * * LOCKING: * spin_lock_irqsave(host_set lock) - * - * RETURNS: - * 0 on success, SCSI_ML_QUEUE_DEVICE_BUSY if the command - * needs to be deferred. */ -static int ata_scsi_translate(struct ata_device *dev, struct scsi_cmnd *cmd, + +static void ata_scsi_translate(struct ata_port *ap, 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"); - if (unlikely(ata_scmd_need_defer(dev, is_io))) - goto defer; - - qc = ata_scsi_qc_new(dev, cmd, done); + qc = ata_scsi_qc_new(ap, dev, cmd, done); if (!qc) goto err_mem; @@ -1537,8 +1308,8 @@ static int ata_scsi_translate(struct ata_device *dev, struct scsi_cmnd *cmd, if (cmd->sc_data_direction == DMA_FROM_DEVICE || cmd->sc_data_direction == DMA_TO_DEVICE) { if (unlikely(cmd->request_bufflen < 1)) { - ata_dev_printk(dev, KERN_WARNING, - "WARNING: zero len r/w req\n"); + printk(KERN_WARNING "ata%u(%u): WARNING: zero len r/w req\n", + ap->id, dev->devno); goto err_did; } @@ -1557,16 +1328,17 @@ static int ata_scsi_translate(struct ata_device *dev, struct scsi_cmnd *cmd, goto early_finish; /* select device, send command to hardware */ - ata_qc_issue(qc); + if (ata_qc_issue(qc)) + goto err_did; VPRINTK("EXIT\n"); - return 0; + return; early_finish: ata_qc_free(qc); done(cmd); DPRINTK("EXIT - early finish (good or error)\n"); - return 0; + return; err_did: ata_qc_free(qc); @@ -1574,11 +1346,7 @@ err_mem: cmd->result = (DID_ERROR << 16); done(cmd); DPRINTK("EXIT - internal\n"); - return 0; - -defer: - DPRINTK("EXIT - defer\n"); - return SCSI_MLQUEUE_DEVICE_BUSY; + return; } /** @@ -1677,7 +1445,7 @@ void ata_scsi_rbuf_fill(struct ata_scsi_args *args, * @buflen: Response buffer length. * * Returns standard device identification data associated - * with non-VPD INQUIRY command output. + * with non-EVPD INQUIRY command output. * * LOCKING: * spin_lock_irqsave(host_set lock) @@ -1704,8 +1472,8 @@ unsigned int ata_scsiop_inq_std(struct ata_scsi_args *args, u8 *rbuf, if (buflen > 35) { memcpy(&rbuf[8], "ATA ", 8); - ata_id_string(args->id, &rbuf[16], ATA_ID_PROD_OFS, 16); - ata_id_string(args->id, &rbuf[32], ATA_ID_FW_REV_OFS, 4); + ata_dev_id_string(args->id, &rbuf[16], ATA_ID_PROD_OFS, 16); + ata_dev_id_string(args->id, &rbuf[32], ATA_ID_FW_REV_OFS, 4); if (rbuf[32] == 0 || rbuf[32] == ' ') memcpy(&rbuf[32], "n/a ", 4); } @@ -1728,12 +1496,12 @@ unsigned int ata_scsiop_inq_std(struct ata_scsi_args *args, u8 *rbuf, } /** - * ata_scsiop_inq_00 - Simulate INQUIRY VPD page 0, list of pages + * ata_scsiop_inq_00 - Simulate INQUIRY EVPD page 0, list of pages * @args: device IDENTIFY data / SCSI command of interest. * @rbuf: Response buffer, to which simulated SCSI cmd output is sent. * @buflen: Response buffer length. * - * Returns list of inquiry VPD pages available. + * Returns list of inquiry EVPD pages available. * * LOCKING: * spin_lock_irqsave(host_set lock) @@ -1747,7 +1515,7 @@ unsigned int ata_scsiop_inq_00(struct ata_scsi_args *args, u8 *rbuf, 0x80, /* page 0x80, unit serial no page */ 0x83 /* page 0x83, device ident page */ }; - rbuf[3] = sizeof(pages); /* number of supported VPD pages */ + rbuf[3] = sizeof(pages); /* number of supported EVPD pages */ if (buflen > 6) memcpy(rbuf + 4, pages, sizeof(pages)); @@ -1756,7 +1524,7 @@ unsigned int ata_scsiop_inq_00(struct ata_scsi_args *args, u8 *rbuf, } /** - * ata_scsiop_inq_80 - Simulate INQUIRY VPD page 80, device serial number + * ata_scsiop_inq_80 - Simulate INQUIRY EVPD page 80, device serial number * @args: device IDENTIFY data / SCSI command of interest. * @rbuf: Response buffer, to which simulated SCSI cmd output is sent. * @buflen: Response buffer length. @@ -1779,22 +1547,22 @@ unsigned int ata_scsiop_inq_80(struct ata_scsi_args *args, u8 *rbuf, memcpy(rbuf, hdr, sizeof(hdr)); if (buflen > (ATA_SERNO_LEN + 4 - 1)) - ata_id_string(args->id, (unsigned char *) &rbuf[4], - ATA_ID_SERNO_OFS, ATA_SERNO_LEN); + ata_dev_id_string(args->id, (unsigned char *) &rbuf[4], + ATA_ID_SERNO_OFS, ATA_SERNO_LEN); return 0; } +static const char * const inq_83_str = "Linux ATA-SCSI simulator"; + /** - * ata_scsiop_inq_83 - Simulate INQUIRY VPD page 83, device identity + * ata_scsiop_inq_83 - Simulate INQUIRY EVPD page 83, device identity * @args: device IDENTIFY data / SCSI command of interest. * @rbuf: Response buffer, to which simulated SCSI cmd output is sent. * @buflen: Response buffer length. * - * Yields two logical unit device identification designators: - * - vendor specific ASCII containing the ATA serial number - * - SAT defined "t10 vendor id based" containing ASCII vendor - * name ("ATA "), model and serial numbers. + * Returns device identification. Currently hardcoded to + * return "Linux ATA-SCSI simulator". * * LOCKING: * spin_lock_irqsave(host_set lock) @@ -1803,39 +1571,16 @@ unsigned int ata_scsiop_inq_80(struct ata_scsi_args *args, u8 *rbuf, unsigned int ata_scsiop_inq_83(struct ata_scsi_args *args, u8 *rbuf, unsigned int buflen) { - int num; - const int sat_model_serial_desc_len = 68; - const int ata_model_byte_len = 40; - rbuf[1] = 0x83; /* this page code */ - num = 4; - - if (buflen > (ATA_SERNO_LEN + num + 3)) { - /* piv=0, assoc=lu, code_set=ACSII, designator=vendor */ - rbuf[num + 0] = 2; - rbuf[num + 3] = ATA_SERNO_LEN; - num += 4; - ata_id_string(args->id, (unsigned char *) rbuf + num, - ATA_ID_SERNO_OFS, ATA_SERNO_LEN); - num += ATA_SERNO_LEN; - } - if (buflen > (sat_model_serial_desc_len + num + 3)) { - /* SAT defined lu model and serial numbers descriptor */ - /* piv=0, assoc=lu, code_set=ACSII, designator=t10 vendor id */ - rbuf[num + 0] = 2; - rbuf[num + 1] = 1; - rbuf[num + 3] = sat_model_serial_desc_len; - num += 4; - memcpy(rbuf + num, "ATA ", 8); - num += 8; - ata_id_string(args->id, (unsigned char *) rbuf + num, - ATA_ID_PROD_OFS, ata_model_byte_len); - num += ata_model_byte_len; - ata_id_string(args->id, (unsigned char *) rbuf + num, - ATA_ID_SERNO_OFS, ATA_SERNO_LEN); - num += ATA_SERNO_LEN; + rbuf[3] = 4 + strlen(inq_83_str); /* page len */ + + /* our one and only identification descriptor (vendor-specific) */ + if (buflen > (strlen(inq_83_str) + 4 + 4 - 1)) { + rbuf[4 + 0] = 2; /* code set: ASCII */ + rbuf[4 + 3] = strlen(inq_83_str); + memcpy(rbuf + 4 + 4, inq_83_str, strlen(inq_83_str)); } - rbuf[3] = num - 4; /* page len (assume less than 256 bytes) */ + return 0; } @@ -1968,12 +1713,15 @@ static int ata_dev_supports_fua(u16 *id) if (!ata_id_has_fua(id)) return 0; - ata_id_c_string(id, model, ATA_ID_PROD_OFS, sizeof(model)); - ata_id_c_string(id, fw, ATA_ID_FW_REV_OFS, sizeof(fw)); + model[40] = '\0'; + fw[8] = '\0'; + + ata_dev_id_string(id, model, ATA_ID_PROD_OFS, sizeof(model) - 1); + ata_dev_id_string(id, fw, ATA_ID_FW_REV_OFS, sizeof(fw) - 1); - if (strcmp(model, "Maxtor")) + if (strncmp(model, "Maxtor", 6)) return 1; - if (strcmp(fw, "BANC1G10")) + if (strncmp(fw, "BANC1G10", 8)) return 1; return 0; /* blacklisted */ @@ -2076,7 +1824,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; @@ -2267,19 +2015,18 @@ void ata_scsi_badcmd(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *), u8 done(cmd); } -static void atapi_sense_complete(struct ata_queued_cmd *qc) +static int 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); + return 0; } /* is it pointless to prefer PIO for "safety reasons"? */ @@ -2309,7 +2056,7 @@ static void atapi_request_sense(struct ata_queued_cmd *qc) ata_sg_init_one(qc, cmd->sense_buffer, sizeof(cmd->sense_buffer)); qc->dma_dir = DMA_FROM_DEVICE; - memset(&qc->cdb, 0, qc->dev->cdb_len); + memset(&qc->cdb, 0, ap->cdb_len); qc->cdb[0] = REQUEST_SENSE; qc->cdb[4] = SCSI_SENSE_BUFFERSIZE; @@ -2328,63 +2075,36 @@ static void atapi_request_sense(struct ata_queued_cmd *qc) qc->complete_fn = atapi_sense_complete; - ata_qc_issue(qc); + if (ata_qc_issue(qc)) { + qc->err_mask |= AC_ERR_OTHER; + ata_qc_complete(qc); + } DPRINTK("EXIT\n"); } -static void atapi_qc_complete(struct ata_queued_cmd *qc) +static int atapi_qc_complete(struct ata_queued_cmd *qc) { struct scsi_cmnd *cmd = qc->scsicmd; unsigned int err_mask = qc->err_mask; VPRINTK("ENTER, err_mask 0x%X\n", err_mask); - /* 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)) { + return 1; + } + + 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)) { @@ -2413,7 +2133,7 @@ static void atapi_qc_complete(struct ata_queued_cmd *qc) } qc->scsidone(cmd); - ata_qc_free(qc); + return 0; } /** * atapi_xlat - Initialize PACKET taskfile @@ -2439,7 +2159,7 @@ static unsigned int atapi_xlat(struct ata_queued_cmd *qc, const u8 *scsicmd) if (ata_check_atapi_dma(qc)) using_pio = 1; - memcpy(&qc->cdb, scsicmd, dev->cdb_len); + memcpy(&qc->cdb, scsicmd, qc->ap->cdb_len); qc->complete_fn = atapi_qc_complete; @@ -2466,63 +2186,18 @@ 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; - if (atapi_dmadir && (cmd->sc_data_direction != DMA_TO_DEVICE)) - /* some SATA bridges need us to indicate data xfer direction */ +#ifdef ATAPI_ENABLE_DMADIR + /* some SATA bridges need us to indicate data xfer direction */ + if (cmd->sc_data_direction != DMA_TO_DEVICE) qc->tf.feature |= ATAPI_DMADIR; +#endif } - qc->nbytes = cmd->request_bufflen; + qc->nbytes = cmd->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 @@ -2539,14 +2214,33 @@ static int ata_scsi_dev_enabled(struct ata_device *dev) * 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 = __ata_scsi_find_dev(ap, 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; + + if (unlikely((scsidev->channel != 0) || + (scsidev->lun != 0))) + return NULL; - if (unlikely(!dev || !ata_scsi_dev_enabled(dev))) + 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; } @@ -2569,6 +2263,9 @@ ata_scsi_map_proto(u8 byte1) case 4: /* PIO Data-in */ case 5: /* PIO Data-out */ + if (byte1 & 0xe0) { + return ATA_PROT_PIO_MULT; + } return ATA_PROT_PIO; case 10: /* Device Reset */ @@ -2603,19 +2300,10 @@ 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; - /* * 12 and 16 byte CDBs use different offsets to * provide the various register values. @@ -2694,10 +2382,7 @@ 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->request_bufflen / ATA_SECT_SIZE; - - /* request result TF */ - qc->flags |= ATA_QCFLAG_RESULT_TF; + qc->nsect = cmd->bufflen / ATA_SECT_SIZE; return 0; @@ -2775,26 +2460,6 @@ static inline void ata_scsi_dump_cdb(struct ata_port *ap, #endif } -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) - rc = ata_scsi_translate(dev, cmd, done, xlat_func); - else - ata_scsi_simulate(dev, cmd, done); - } else - rc = ata_scsi_translate(dev, cmd, done, atapi_xlat); - - return rc; -} - /** * ata_scsi_queuecmd - Issue SCSI cdb to libata-managed device * @cmd: SCSI command to be sent @@ -2811,40 +2476,50 @@ static inline int __ata_scsi_queuecmd(struct scsi_cmnd *cmd, * Releases scsi-layer-held lock, and obtains host_set lock. * * RETURNS: - * Return value from __ata_scsi_queuecmd() if @cmd can be queued, - * 0 otherwise. + * Zero. */ + 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 = ata_shost_to_port(shost); + ap = (struct ata_port *) &shost->hostdata[0]; spin_unlock(shost->host_lock); - spin_lock(ap->lock); + spin_lock(&ap->host_set->lock); ata_scsi_dump_cdb(ap, cmd); dev = ata_scsi_find_dev(ap, scsidev); - if (likely(dev)) - rc = __ata_scsi_queuecmd(cmd, done, dev); - else { + if (unlikely(!dev)) { cmd->result = (DID_BAD_TARGET << 16); done(cmd); + goto out_unlock; } - spin_unlock(ap->lock); + 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); + else + ata_scsi_simulate(ap, dev, cmd, done); + } else + ata_scsi_translate(ap, dev, cmd, done, atapi_xlat); + +out_unlock: + spin_unlock(&ap->host_set->lock); spin_lock(shost->host_lock); - return rc; + return 0; } /** * ata_scsi_simulate - simulate SCSI command on ATA device - * @dev: the target device + * @id: current IDENTIFY data for target device. * @cmd: SCSI command being sent to device. * @done: SCSI command completion function. * @@ -2855,12 +2530,14 @@ 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_device *dev, struct scsi_cmnd *cmd, +void ata_scsi_simulate(struct ata_port *ap, 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; @@ -2932,242 +2609,17 @@ void ata_scsi_simulate(struct ata_device *dev, struct scsi_cmnd *cmd, void ata_scsi_scan_host(struct ata_port *ap) { + struct ata_device *dev; unsigned int i; - if (ap->flags & ATA_FLAG_DISABLED) - return; - - for (i = 0; i < ATA_MAX_DEVICES; 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); - } - } -} - -/** - * 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"); + if (ap->flags & ATA_FLAG_PORT_DISABLED) 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)); + if (ata_dev_present(dev)) + scsi_scan_target(&ap->host->shost_gendev, 0, i, 0, 0); } } + diff --git a/drivers/scsi/libata.h b/drivers/scsi/libata.h index c325679d9..fddaf479a 100644 --- a/drivers/scsi/libata.h +++ b/drivers/scsi/libata.h @@ -29,9 +29,10 @@ #define __LIBATA_H__ #define DRV_NAME "libata" -#define DRV_VERSION "2.00" /* must be exactly four chars */ +#define DRV_VERSION "1.20" /* must be exactly four chars */ struct ata_scsi_args { + struct ata_port *ap; struct ata_device *dev; u16 *id; struct scsi_cmnd *cmd; @@ -39,44 +40,24 @@ 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_device *dev); +extern struct ata_queued_cmd *ata_qc_new_init(struct ata_port *ap, + 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_qc_issue(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); /* libata-scsi.c */ -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 int ata_scsi_error(struct Scsi_Host *host); extern unsigned int ata_scsiop_inq_std(struct ata_scsi_args *args, u8 *rbuf, unsigned int buflen); @@ -105,13 +86,5 @@ 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/lpfc/lpfc.h b/drivers/scsi/lpfc/lpfc.h index d44f9aac6..38ffa8d6e 100644 --- a/drivers/scsi/lpfc/lpfc.h +++ b/drivers/scsi/lpfc/lpfc.h @@ -1,7 +1,7 @@ /******************************************************************* * This file is part of the Emulex Linux Device Driver for * * Fibre Channel Host Bus Adapters. * - * Copyright (C) 2004-2006 Emulex. All rights reserved. * + * Copyright (C) 2004-2005 Emulex. All rights reserved. * * EMULEX and SLI are trademarks of Emulex. * * www.emulex.com * * Portions Copyright (C) 2004-2005 Christoph Hellwig * @@ -21,12 +21,10 @@ 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 */ @@ -43,6 +41,7 @@ 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 @@ -122,9 +121,7 @@ struct lpfc_stats { uint32_t elsRcvLOGO; uint32_t elsRcvPRLO; uint32_t elsRcvPRLI; - uint32_t elsRcvLIRR; - uint32_t elsRcvRPS; - uint32_t elsRcvRPL; + uint32_t elsRcvRRQ; uint32_t elsXmitFLOGI; uint32_t elsXmitPLOGI; uint32_t elsXmitPRLI; @@ -170,34 +167,33 @@ struct lpfc_sysfs_mbox { }; struct lpfc_hba { + struct list_head hba_list; /* List of hbas/ports */ struct lpfc_sli sli; struct lpfc_sli2_slim *slim2p; dma_addr_t slim2p_mapping; uint16_t pci_cfg_value; - int32_t hba_state; - -#define LPFC_STATE_UNKNOWN 0 /* HBA state is unknown */ -#define LPFC_WARM_START 1 /* HBA state after selective reset */ -#define LPFC_INIT_START 2 /* Initial state after board reset */ -#define LPFC_INIT_MBX_CMDS 3 /* Initialize HBA with mbox commands */ -#define LPFC_LINK_DOWN 4 /* HBA initialized, link is down */ -#define LPFC_LINK_UP 5 /* Link is up - issue READ_LA */ -#define LPFC_LOCAL_CFG_LINK 6 /* local NPORT Id configured */ -#define LPFC_FLOGI 7 /* FLOGI sent to Fabric */ -#define LPFC_FABRIC_CFG_LINK 8 /* Fabric assigned NPORT Id + struct semaphore hba_can_block; + uint32_t hba_state; + +#define LPFC_INIT_START 1 /* Initial state after board reset */ +#define LPFC_INIT_MBX_CMDS 2 /* Initialize HBA with mbox commands */ +#define LPFC_LINK_DOWN 3 /* HBA initialized, link is down */ +#define LPFC_LINK_UP 4 /* Link is up - issue READ_LA */ +#define LPFC_LOCAL_CFG_LINK 5 /* local NPORT Id configured */ +#define LPFC_FLOGI 6 /* FLOGI sent to Fabric */ +#define LPFC_FABRIC_CFG_LINK 7 /* Fabric assigned NPORT Id configured */ -#define LPFC_NS_REG 9 /* Register with NameServer */ -#define LPFC_NS_QRY 10 /* Query NameServer for NPort ID list */ -#define LPFC_BUILD_DISC_LIST 11 /* Build ADISC and PLOGI lists for +#define LPFC_NS_REG 8 /* Register with NameServer */ +#define LPFC_NS_QRY 9 /* Query NameServer for NPort ID list */ +#define LPFC_BUILD_DISC_LIST 10 /* Build ADISC and PLOGI lists for * device authentication / discovery */ -#define LPFC_DISC_AUTH 12 /* Processing ADISC list */ -#define LPFC_CLEAR_LA 13 /* authentication cmplt - issue +#define LPFC_DISC_AUTH 11 /* Processing ADISC list */ +#define LPFC_CLEAR_LA 12 /* authentication cmplt - issue CLEAR_LA */ #define LPFC_HBA_READY 32 -#define LPFC_HBA_ERROR -1 +#define LPFC_HBA_ERROR 0xff - int32_t stopped; /* HBA has not been restarted since last ERATT */ uint8_t fc_linkspeed; /* Link speed after last READ_LA */ uint32_t fc_eventTag; /* event tag for link attention */ @@ -249,7 +245,6 @@ struct lpfc_hba { #define FC_SCSI_SCAN_TMO 0x4000 /* scsi scan timer running */ #define FC_ABORT_DISCOVERY 0x8000 /* we want to abort discovery */ #define FC_NDISC_ACTIVE 0x10000 /* NPort discovery active */ -#define FC_BYPASSED_MODE 0x20000 /* NPort is in bypassed mode */ uint32_t fc_topology; /* link topology, from LINK INIT */ @@ -294,8 +289,8 @@ struct lpfc_hba { uint32_t cfg_link_speed; uint32_t cfg_cr_delay; uint32_t cfg_cr_count; - uint32_t cfg_multi_ring_support; uint32_t cfg_fdmi_on; + uint32_t cfg_fcp_bind_method; uint32_t cfg_discovery_threads; uint32_t cfg_max_luns; uint32_t cfg_poll; diff --git a/drivers/scsi/lpfc/lpfc_attr.c b/drivers/scsi/lpfc/lpfc_attr.c index d384c16f4..5625a8c2a 100644 --- a/drivers/scsi/lpfc/lpfc_attr.c +++ b/drivers/scsi/lpfc/lpfc_attr.c @@ -1,7 +1,7 @@ /******************************************************************* * This file is part of the Emulex Linux Device Driver for * * Fibre Channel Host Bus Adapters. * - * Copyright (C) 2004-2006 Emulex. All rights reserved. * + * Copyright (C) 2004-2005 Emulex. All rights reserved. * * EMULEX and SLI are trademarks of Emulex. * * www.emulex.com * * Portions Copyright (C) 2004-2005 Christoph Hellwig * @@ -79,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; + struct lpfc_hba *phba = (struct lpfc_hba*)host->hostdata[0]; return snprintf(buf, PAGE_SIZE, "%s\n",phba->SerialNumber); } @@ -87,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; + struct lpfc_hba *phba = (struct lpfc_hba*)host->hostdata[0]; return snprintf(buf, PAGE_SIZE, "%s\n",phba->ModelDesc); } @@ -95,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; + struct lpfc_hba *phba = (struct lpfc_hba*)host->hostdata[0]; return snprintf(buf, PAGE_SIZE, "%s\n",phba->ModelName); } @@ -103,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; + struct lpfc_hba *phba = (struct lpfc_hba*)host->hostdata[0]; return snprintf(buf, PAGE_SIZE, "%s\n",phba->ProgramType); } @@ -111,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; + struct lpfc_hba *phba = (struct lpfc_hba*)host->hostdata[0]; return snprintf(buf, PAGE_SIZE, "%s\n",phba->Port); } @@ -119,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; + struct lpfc_hba *phba = (struct lpfc_hba*)host->hostdata[0]; char fwrev[32]; lpfc_decode_firmware_rev(phba, fwrev, 1); return snprintf(buf, PAGE_SIZE, "%s\n",fwrev); @@ -130,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; + struct lpfc_hba *phba = (struct lpfc_hba*)host->hostdata[0]; lpfc_vpd_t *vp = &phba->vpd; lpfc_jedec_to_ascii(vp->rev.biuRev, hdw); return snprintf(buf, PAGE_SIZE, "%s\n", hdw); @@ -139,18 +139,16 @@ 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; + struct lpfc_hba *phba = (struct lpfc_hba*)host->hostdata[0]; 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; + struct lpfc_hba *phba = (struct lpfc_hba*)host->hostdata[0]; 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,7 +194,7 @@ 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; + struct lpfc_hba *phba = (struct lpfc_hba*)host->hostdata[0]; return snprintf(buf, PAGE_SIZE, "%d\n", phba->fc_map_cnt + phba->fc_unmap_cnt); } @@ -205,7 +203,7 @@ lpfc_num_discovered_ports_show(struct class_device *cdev, char *buf) static int lpfc_issue_lip(struct Scsi_Host *host) { - struct lpfc_hba *phba = (struct lpfc_hba *) host->hostdata; + struct lpfc_hba *phba = (struct lpfc_hba *) host->hostdata[0]; LPFC_MBOXQ_t *pmboxq; int mbxstatus = MBXERR_ERROR; @@ -219,18 +217,8 @@ lpfc_issue_lip(struct Scsi_Host *host) return -ENOMEM; memset((void *)pmboxq, 0, sizeof (LPFC_MBOXQ_t)); - 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); - } + 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; @@ -243,101 +231,47 @@ lpfc_issue_lip(struct Scsi_Host *host) 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; + struct lpfc_hba *phba = (struct lpfc_hba*)host->hostdata[0]; return snprintf(buf, PAGE_SIZE, "%d\n", phba->nport_event_cnt); } static ssize_t -lpfc_board_mode_show(struct class_device *cdev, char *buf) +lpfc_board_online_show(struct class_device *cdev, char *buf) { struct Scsi_Host *host = class_to_shost(cdev); - 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 - state = "online"; + struct lpfc_hba *phba = (struct lpfc_hba*)host->hostdata[0]; - return snprintf(buf, PAGE_SIZE, "%s\n", state); + if (phba->fc_flag & FC_OFFLINE_MODE) + return snprintf(buf, PAGE_SIZE, "0\n"); + else + return snprintf(buf, PAGE_SIZE, "1\n"); } static ssize_t -lpfc_board_mode_store(struct class_device *cdev, const char *buf, size_t count) +lpfc_board_online_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; + struct lpfc_hba *phba = (struct lpfc_hba*)host->hostdata[0]; struct completion online_compl; - int status=0; + int val=0, status=0; + + if (sscanf(buf, "%d", &val) != 1) + return -EINVAL; init_completion(&online_compl); - if(strncmp(buf, "online", sizeof("online") - 1) == 0) - lpfc_workq_post_event(phba, &status, &online_compl, - LPFC_EVT_ONLINE); - else if (strncmp(buf, "offline", sizeof("offline") - 1) == 0) - lpfc_workq_post_event(phba, &status, &online_compl, - LPFC_EVT_OFFLINE); - else if (strncmp(buf, "warm", sizeof("warm") - 1) == 0) + if (val) 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); + LPFC_EVT_ONLINE); else - return -EINVAL; - + lpfc_workq_post_event(phba, &status, &online_compl, + LPFC_EVT_OFFLINE); wait_for_completion(&online_compl); - if (!status) return strlen(buf); else @@ -348,7 +282,7 @@ 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; + struct lpfc_hba *phba = (struct lpfc_hba*)host->hostdata[0]; return snprintf(buf, PAGE_SIZE, "%#x\n", phba->cfg_poll); } @@ -358,7 +292,7 @@ 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; + struct lpfc_hba *phba = (struct lpfc_hba*)host->hostdata[0]; uint32_t creg_val; uint32_t old_val; int val=0; @@ -415,7 +349,7 @@ 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;\ + struct lpfc_hba *phba = (struct lpfc_hba*)host->hostdata[0];\ int val = 0;\ val = phba->cfg_##attr;\ return snprintf(buf, PAGE_SIZE, "%d\n",\ @@ -427,7 +361,7 @@ 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;\ + struct lpfc_hba *phba = (struct lpfc_hba*)host->hostdata[0];\ int val = 0;\ val = phba->cfg_##attr;\ return snprintf(buf, PAGE_SIZE, "%#x\n",\ @@ -470,7 +404,7 @@ 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;\ + struct lpfc_hba *phba = (struct lpfc_hba*)host->hostdata[0];\ int val=0;\ if (!isdigit(buf[0]))\ return -EINVAL;\ @@ -544,9 +478,8 @@ 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(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 CLASS_DEVICE_ATTR(board_online, S_IRUGO | S_IWUSR, + lpfc_board_online_show, lpfc_board_online_store); static int lpfc_poll = 0; module_param(lpfc_poll, int, 0); @@ -586,16 +519,6 @@ LPFC_ATTR_HEX_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 @@ -627,7 +550,6 @@ 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 @@ -635,7 +557,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_RW(topology, 0, 0, 6, "Select Fibre Channel topology"); +LPFC_ATTR_R(topology, 0, 0, 6, "Select Fibre Channel topology"); /* # lpfc_link_speed: Link speed selection for initializing the Fibre Channel @@ -675,20 +597,12 @@ LPFC_ATTR_R(ack0, 0, 0, 1, "Enable ACK0 support"); # is 0. Default value of cr_count is 1. The cr_count feature is disabled if # cr_delay is set to 0. */ -LPFC_ATTR_RW(cr_delay, 0, 0, 63, "A count of milliseconds after which an " +LPFC_ATTR_RW(cr_delay, 0, 0, 63, "A count of milliseconds after which an" "interrupt response is generated"); -LPFC_ATTR_RW(cr_count, 1, 1, 255, "A count of I/O completions after which an " +LPFC_ATTR_RW(cr_count, 1, 1, 255, "A count of I/O completions after which an" "interrupt response is generated"); -/* -# 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 @@ -702,16 +616,16 @@ 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. */ -LPFC_ATTR(discovery_threads, 32, 1, 64, "Maximum number of ELS commands " +LPFC_ATTR(discovery_threads, 32, 1, 64, "Maximum number of ELS commands" "during discovery"); /* -# 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_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_ATTR_R(max_luns, 255, 0, 65535, - "Maximum allowed LUN"); +LPFC_ATTR_R(max_luns, 256, 1, 32768, + "Maximum number of LUNs per target driver will support"); /* # lpfc_poll_tmo: .Milliseconds driver will wait between polling FCP ring. @@ -735,7 +649,6 @@ 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, @@ -745,13 +658,11 @@ struct class_device_attribute *lpfc_host_attrs[] = { &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_board_mode, - &class_device_attr_issue_reset, + &class_device_attr_board_online, &class_device_attr_lpfc_poll, &class_device_attr_lpfc_poll_tmo, NULL, @@ -763,7 +674,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; + struct lpfc_hba *phba = (struct lpfc_hba*)host->hostdata[0]; if ((off + count) > FF_REG_AREA_SIZE) return -ERANGE; @@ -796,7 +707,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; + struct lpfc_hba *phba = (struct lpfc_hba*)host->hostdata[0]; if (off > FF_REG_AREA_SIZE) return -ERANGE; @@ -851,7 +762,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; + struct lpfc_hba * phba = (struct lpfc_hba*)host->hostdata[0]; struct lpfcMboxq * mbox = NULL; if ((count + off) > MAILBOX_CMD_SIZE) @@ -867,7 +778,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); @@ -884,7 +795,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 -EAGAIN; + return -EINVAL; } } @@ -904,7 +815,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; + struct lpfc_hba *phba = (struct lpfc_hba*)host->hostdata[0]; int rc; if (off > sizeof(MAILBOX_t)) @@ -961,11 +872,8 @@ 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: @@ -1000,15 +908,14 @@ 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, - lpfc_mbox_tmo_val(phba, - phba->sysfs_mbox.mbox->mb.mbxCommand) * HZ); + phba->fc_ratov * 2); spin_lock_irq(phba->host->host_lock); } if (rc != MBX_SUCCESS) { sysfs_mbox_idle(phba); spin_unlock_irq(host->host_lock); - return (rc == MBX_TIMEOUT) ? -ETIME : -ENODEV; + return -ENODEV; } phba->sysfs_mbox.state = SMBOX_READING; } @@ -1017,7 +924,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 -EAGAIN; + return -EINVAL; } memcpy(buf, (uint8_t *) & phba->sysfs_mbox.mbox->mb + off, count); @@ -1083,7 +990,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; + struct lpfc_hba *phba = (struct lpfc_hba*)shost->hostdata[0]; /* note: fc_myDID already in cpu endianness */ fc_host_port_id(shost) = phba->fc_myDID; } @@ -1091,7 +998,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; + struct lpfc_hba *phba = (struct lpfc_hba*)shost->hostdata[0]; spin_lock_irq(shost->host_lock); @@ -1116,7 +1023,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; + struct lpfc_hba *phba = (struct lpfc_hba*)shost->hostdata[0]; spin_lock_irq(shost->host_lock); @@ -1124,8 +1031,6 @@ 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: @@ -1159,7 +1064,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; + struct lpfc_hba *phba = (struct lpfc_hba*)shost->hostdata[0]; spin_lock_irq(shost->host_lock); @@ -1186,7 +1091,7 @@ 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; + struct lpfc_hba *phba = (struct lpfc_hba*)shost->hostdata[0]; u64 node_name; spin_lock_irq(shost->host_lock); @@ -1208,13 +1113,11 @@ lpfc_get_host_fabric_name (struct Scsi_Host *shost) static struct fc_host_statistics * lpfc_get_stats(struct Scsi_Host *shost) { - struct lpfc_hba *phba = (struct lpfc_hba *)shost->hostdata; + struct lpfc_hba *phba = (struct lpfc_hba *)shost->hostdata[0]; struct lpfc_sli *psli = &phba->sli; struct fc_host_statistics *hs = &phba->link_stats; - struct lpfc_lnk_stat * lso = &psli->lnk_stat_offsets; LPFC_MBOXQ_t *pmboxq; MAILBOX_t *pmb; - unsigned long seconds; int rc = 0; pmboxq = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); @@ -1275,103 +1178,22 @@ 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; - 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; +/* FIX ME */ + /*hs->SecondsSinceLastReset = (jiffies - lpfc_loadtime) / HZ;*/ 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 @@ -1381,7 +1203,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; + struct lpfc_hba *phba = (struct lpfc_hba *) shost->hostdata[0]; uint32_t did = -1; struct lpfc_nodelist *ndlp = NULL; @@ -1402,7 +1224,7 @@ 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; + struct lpfc_hba *phba = (struct lpfc_hba *) shost->hostdata[0]; u64 node_name = 0; struct lpfc_nodelist *ndlp = NULL; @@ -1423,7 +1245,7 @@ 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; + struct lpfc_hba *phba = (struct lpfc_hba *) shost->hostdata[0]; u64 port_name = 0; struct lpfc_nodelist *ndlp = NULL; @@ -1515,7 +1337,8 @@ struct fc_function_template lpfc_transport_functions = { */ .get_fc_host_stats = lpfc_get_stats, - .reset_fc_host_stats = lpfc_reset_stats, + + /* the LPFC driver doesn't support resetting stats yet */ .dd_fcrport_size = sizeof(struct lpfc_rport_data), .show_rport_maxframe_size = 1, @@ -1543,7 +1366,6 @@ lpfc_get_cfgparam(struct lpfc_hba *phba) 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); @@ -1589,9 +1411,5 @@ 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 2a176467f..f1e708946 100644 --- a/drivers/scsi/lpfc/lpfc_crtn.h +++ b/drivers/scsi/lpfc/lpfc_crtn.h @@ -1,7 +1,7 @@ /******************************************************************* * This file is part of the Emulex Linux Device Driver for * * Fibre Channel Host Bus Adapters. * - * Copyright (C) 2004-2006 Emulex. All rights reserved. * + * Copyright (C) 2004-2005 Emulex. All rights reserved. * * EMULEX and SLI are trademarks of Emulex. * * www.emulex.com * * * @@ -26,7 +26,7 @@ void lpfc_clear_la(struct lpfc_hba *, LPFC_MBOXQ_t *); void lpfc_config_link(struct lpfc_hba *, LPFC_MBOXQ_t *); int lpfc_read_sparam(struct lpfc_hba *, LPFC_MBOXQ_t *); void lpfc_read_config(struct lpfc_hba *, LPFC_MBOXQ_t *); -void lpfc_read_lnk_stat(struct lpfc_hba *, LPFC_MBOXQ_t *); +void lpfc_set_slim(struct lpfc_hba *, LPFC_MBOXQ_t *, uint32_t, uint32_t); int lpfc_reg_login(struct lpfc_hba *, uint32_t, uint8_t *, LPFC_MBOXQ_t *, uint32_t); void lpfc_unreg_login(struct lpfc_hba *, uint32_t, LPFC_MBOXQ_t *); @@ -42,6 +42,9 @@ void lpfc_mbx_cmpl_reg_login(struct lpfc_hba *, LPFC_MBOXQ_t *); void lpfc_mbx_cmpl_fabric_reg_login(struct lpfc_hba *, LPFC_MBOXQ_t *); void lpfc_mbx_cmpl_ns_reg_login(struct lpfc_hba *, LPFC_MBOXQ_t *); void lpfc_mbx_cmpl_fdmi_reg_login(struct lpfc_hba *, LPFC_MBOXQ_t *); +int lpfc_nlp_plogi(struct lpfc_hba *, struct lpfc_nodelist *); +int lpfc_nlp_adisc(struct lpfc_hba *, struct lpfc_nodelist *); +int lpfc_nlp_unmapped(struct lpfc_hba *, struct lpfc_nodelist *); int lpfc_nlp_list(struct lpfc_hba *, struct lpfc_nodelist *, int); void lpfc_set_disctmo(struct lpfc_hba *); int lpfc_can_disctmo(struct lpfc_hba *); @@ -51,10 +54,12 @@ int lpfc_check_sli_ndlp(struct lpfc_hba *, struct lpfc_sli_ring *, int lpfc_nlp_remove(struct lpfc_hba *, struct lpfc_nodelist *); void lpfc_nlp_init(struct lpfc_hba *, struct lpfc_nodelist *, uint32_t); struct lpfc_nodelist *lpfc_setup_disc_node(struct lpfc_hba *, uint32_t); +struct lpfc_nodelist *lpfc_setup_rscn_node(struct lpfc_hba *, uint32_t); void lpfc_disc_list_loopmap(struct lpfc_hba *); void lpfc_disc_start(struct lpfc_hba *); void lpfc_disc_flush_list(struct lpfc_hba *); void lpfc_disc_timeout(unsigned long); +void lpfc_scan_timeout(unsigned long); struct lpfc_nodelist *lpfc_findnode_rpi(struct lpfc_hba * phba, uint16_t rpi); @@ -63,13 +68,19 @@ int lpfc_do_work(void *); int lpfc_disc_state_machine(struct lpfc_hba *, struct lpfc_nodelist *, void *, uint32_t); +uint32_t lpfc_cmpl_prli_reglogin_issue(struct lpfc_hba *, + struct lpfc_nodelist *, void *, + uint32_t); +uint32_t lpfc_cmpl_plogi_prli_issue(struct lpfc_hba *, struct lpfc_nodelist *, + void *, uint32_t); + int lpfc_check_sparm(struct lpfc_hba *, struct lpfc_nodelist *, struct serv_parm *, uint32_t); int lpfc_els_abort(struct lpfc_hba *, struct lpfc_nodelist * ndlp, int); int lpfc_els_abort_flogi(struct lpfc_hba *); int lpfc_initial_flogi(struct lpfc_hba *); -int lpfc_issue_els_plogi(struct lpfc_hba *, uint32_t, uint8_t); +int lpfc_issue_els_plogi(struct lpfc_hba *, struct lpfc_nodelist *, uint8_t); int lpfc_issue_els_prli(struct lpfc_hba *, struct lpfc_nodelist *, uint8_t); int lpfc_issue_els_adisc(struct lpfc_hba *, struct lpfc_nodelist *, uint8_t); int lpfc_issue_els_logo(struct lpfc_hba *, struct lpfc_nodelist *, uint8_t); @@ -83,7 +94,6 @@ int lpfc_els_rsp_adisc_acc(struct lpfc_hba *, struct lpfc_iocbq *, struct lpfc_nodelist *); int lpfc_els_rsp_prli_acc(struct lpfc_hba *, struct lpfc_iocbq *, struct lpfc_nodelist *); -void lpfc_cancel_retry_delay_tmo(struct lpfc_hba *, struct lpfc_nodelist *); void lpfc_els_retry_delay(unsigned long); void lpfc_els_retry_delay_handler(struct lpfc_nodelist *); void lpfc_els_unsol_event(struct lpfc_hba *, struct lpfc_sli_ring *, @@ -107,15 +117,18 @@ void lpfc_fdmi_tmo_handler(struct lpfc_hba *); int lpfc_config_port_prep(struct lpfc_hba *); int lpfc_config_port_post(struct lpfc_hba *); int lpfc_hba_down_prep(struct lpfc_hba *); -int lpfc_hba_down_post(struct lpfc_hba *); void lpfc_hba_init(struct lpfc_hba *, uint32_t *); int lpfc_post_buffer(struct lpfc_hba *, struct lpfc_sli_ring *, int, int); void lpfc_decode_firmware_rev(struct lpfc_hba *, char *, int); +uint8_t *lpfc_get_lpfchba_info(struct lpfc_hba *, uint8_t *); +int lpfc_fcp_abort(struct lpfc_hba *, int, int, int); int lpfc_online(struct lpfc_hba *); int lpfc_offline(struct lpfc_hba *); + int lpfc_sli_setup(struct lpfc_hba *); int lpfc_sli_queue_setup(struct lpfc_hba *); +void lpfc_slim_access(struct lpfc_hba *); void lpfc_handle_eratt(struct lpfc_hba *); void lpfc_handle_latt(struct lpfc_hba *); @@ -124,10 +137,8 @@ irqreturn_t lpfc_intr_handler(int, void *, struct pt_regs *); void lpfc_read_rev(struct lpfc_hba *, LPFC_MBOXQ_t *); void lpfc_config_ring(struct lpfc_hba *, int, LPFC_MBOXQ_t *); 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 *); @@ -138,17 +149,10 @@ void lpfc_sli_poll_fcp_ring(struct lpfc_hba * hba); struct lpfc_iocbq * lpfc_sli_get_iocbq(struct lpfc_hba *); void lpfc_sli_release_iocbq(struct lpfc_hba * phba, struct lpfc_iocbq * iocb); uint16_t lpfc_sli_next_iotag(struct lpfc_hba * phba, struct lpfc_iocbq * iocb); - -void lpfc_reset_barrier(struct lpfc_hba * phba); -int lpfc_sli_brdready(struct lpfc_hba *, uint32_t); -int lpfc_sli_brdkill(struct lpfc_hba *); -int lpfc_sli_brdreset(struct lpfc_hba *); -int lpfc_sli_brdrestart(struct lpfc_hba *); 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 *); @@ -170,10 +174,12 @@ int lpfc_sli_abort_iocb(struct lpfc_hba *, struct lpfc_sli_ring *, uint16_t, void lpfc_mbox_timeout(unsigned long); void lpfc_mbox_timeout_handler(struct lpfc_hba *); +void lpfc_map_fcp_cmnd_to_bpl(struct lpfc_hba *, struct lpfc_scsi_buf *); +void lpfc_free_scsi_cmd(struct lpfc_scsi_buf *); +uint32_t lpfc_os_timeout_transform(struct lpfc_hba *, uint32_t); -struct lpfc_nodelist *lpfc_findnode_did(struct lpfc_hba *, uint32_t, uint32_t); -struct lpfc_nodelist *lpfc_findnode_wwpn(struct lpfc_hba *, uint32_t, - struct lpfc_name *); +struct lpfc_nodelist *lpfc_findnode_did(struct lpfc_hba * phba, uint32_t order, + uint32_t did); int lpfc_sli_issue_mbox_wait(struct lpfc_hba * phba, LPFC_MBOXQ_t * pmboxq, uint32_t timeout); diff --git a/drivers/scsi/lpfc/lpfc_ct.c b/drivers/scsi/lpfc/lpfc_ct.c index bbb731021..7f427f9c4 100644 --- a/drivers/scsi/lpfc/lpfc_ct.c +++ b/drivers/scsi/lpfc/lpfc_ct.c @@ -1,7 +1,7 @@ /******************************************************************* * This file is part of the Emulex Linux Device Driver for * * Fibre Channel Host Bus Adapters. * - * Copyright (C) 2004-2006 Emulex. All rights reserved. * + * Copyright (C) 2004-2005 Emulex. All rights reserved. * * EMULEX and SLI are trademarks of Emulex. * * www.emulex.com * * * @@ -131,7 +131,6 @@ 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); @@ -261,10 +260,8 @@ lpfc_gen_req(struct lpfc_hba *phba, struct lpfc_dmabuf *bmp, icmd->un.genreq64.w5.hcsw.Rctl = FC_UNSOL_CTL; icmd->un.genreq64.w5.hcsw.Type = FC_COMMON_TRANSPORT_ULP; - if (!tmo) { - /* FC spec states we need 3 * ratov for CT requests */ - tmo = (3 * phba->fc_ratov); - } + if (!tmo) + tmo = (2 * phba->fc_ratov) + 1; icmd->ulpTimeout = tmo; icmd->ulpBdeCount = 1; icmd->ulpLe = 1; @@ -324,7 +321,6 @@ lpfc_ns_rsp(struct lpfc_hba * phba, struct lpfc_dmabuf * mp, uint32_t Size) struct lpfc_sli_ct_request *Response = (struct lpfc_sli_ct_request *) mp->virt; struct lpfc_nodelist *ndlp = NULL; - struct lpfc_nodelist *next_ndlp; struct lpfc_dmabuf *mlast, *next_mp; uint32_t *ctptr = (uint32_t *) & Response->un.gid.PortType; uint32_t Did; @@ -393,36 +389,8 @@ lpfc_ns_rsp(struct lpfc_hba * phba, struct lpfc_dmabuf * mp, uint32_t Size) nsout1: list_del(&head); - /* - * The driver has cycled through all Nports in the RSCN payload. - * Complete the handling by cleaning up and marking the - * current driver state. - */ + /* Here we are finished in the case RSCN */ if (phba->hba_state == LPFC_HBA_READY) { - - /* - * Switch ports that connect a loop of multiple targets need - * special consideration. The driver wants to unregister the - * rpi only on the target that was pulled from the loop. On - * RSCN, the driver wants to rediscover an NPort only if the - * driver flagged it as NLP_NPR_2B_DISC. Provided adisc is - * not enabled and the NPort is not capable of retransmissions - * (FC Tape) prevent timing races with the scsi error handler by - * unregistering the Nport's RPI. This action causes all - * outstanding IO to flush back to the midlayer. - */ - list_for_each_entry_safe(ndlp, next_ndlp, &phba->fc_npr_list, - nlp_listp) { - if (!(ndlp->nlp_flag & NLP_NPR_2B_DISC) && - (lpfc_rscn_payload_check(phba, ndlp->nlp_DID))) { - if ((phba->cfg_use_adisc == 0) && - !(ndlp->nlp_fcp_info & - NLP_FCP_2_DEVICE)) { - lpfc_unreg_rpi(phba, ndlp); - ndlp->nlp_flag &= ~NLP_NPR_ADISC; - } - } - } lpfc_els_flush_rscn(phba); spin_lock_irq(phba->host->host_lock); phba->fc_flag |= FC_RSCN_MODE; /* we are still in RSCN mode */ @@ -481,11 +449,6 @@ lpfc_cmpl_ct_cmd_gid_ft(struct lpfc_hba * phba, struct lpfc_iocbq * cmdiocb, CTrsp = (struct lpfc_sli_ct_request *) outp->virt; if (CTrsp->CommandResponse.bits.CmdRsp == be16_to_cpu(SLI_CT_RESPONSE_FS_ACC)) { - lpfc_printf_log(phba, KERN_INFO, LOG_DISCOVERY, - "%d:0208 NameServer Rsp " - "Data: x%x\n", - phba->brd_no, - phba->fc_flag); lpfc_ns_rsp(phba, outp, (uint32_t) (irsp->un.genreq64.bdl.bdeSize)); } else if (CTrsp->CommandResponse.bits.CmdRsp == @@ -589,9 +552,13 @@ lpfc_get_hba_sym_node_name(struct lpfc_hba * phba, uint8_t * symbp) lpfc_decode_firmware_rev(phba, fwrev, 0); - sprintf(symbp, "Emulex %s FV%s DV%s", phba->ModelName, - fwrev, lpfc_release_version); - return; + 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); + } } /* @@ -1011,19 +978,19 @@ lpfc_fdmi_cmd(struct lpfc_hba * phba, struct lpfc_nodelist * ndlp, int cmdcode) ae = (ATTRIBUTE_ENTRY *) ((uint8_t *) pab + size); ae->ad.bits.AttrType = be16_to_cpu(SUPPORTED_SPEED); ae->ad.bits.AttrLen = be16_to_cpu(FOURBYTES + 4); - - ae->un.SupportSpeed = 0; - if (phba->lmt & LMT_10Gb) + if (FC_JEDEC_ID(vp->rev.biuRev) == VIPER_JEDEC_ID) ae->un.SupportSpeed = HBA_PORTSPEED_10GBIT; - if (phba->lmt & LMT_8Gb) - ae->un.SupportSpeed |= HBA_PORTSPEED_8GBIT; - if (phba->lmt & LMT_4Gb) - ae->un.SupportSpeed |= HBA_PORTSPEED_4GBIT; - if (phba->lmt & LMT_2Gb) - ae->un.SupportSpeed |= HBA_PORTSPEED_2GBIT; - if (phba->lmt & LMT_1Gb) - ae->un.SupportSpeed |= HBA_PORTSPEED_1GBIT; - + else if (FC_JEDEC_ID(vp->rev.biuRev) == HELIOS_JEDEC_ID) + ae->un.SupportSpeed = HBA_PORTSPEED_4GBIT; + else if ((FC_JEDEC_ID(vp->rev.biuRev) == + CENTAUR_2G_JEDEC_ID) + || (FC_JEDEC_ID(vp->rev.biuRev) == + PEGASUS_JEDEC_ID) + || (FC_JEDEC_ID(vp->rev.biuRev) == + THOR_JEDEC_ID)) + ae->un.SupportSpeed = HBA_PORTSPEED_2GBIT; + else + ae->un.SupportSpeed = HBA_PORTSPEED_1GBIT; pab->ab.EntryCnt++; size += FOURBYTES + 4; @@ -1163,6 +1130,11 @@ lpfc_fdmi_tmo_handler(struct lpfc_hba *phba) { struct lpfc_nodelist *ndlp; + spin_lock_irq(phba->host->host_lock); + if (!(phba->work_hba_events & WORKER_FDMI_TMO)) { + spin_unlock_irq(phba->host->host_lock); + return; + } ndlp = lpfc_findnode_did(phba, NLP_SEARCH_ALL, FDMI_DID); if (ndlp) { if (system_utsname.nodename[0] != '\0') { @@ -1171,6 +1143,7 @@ lpfc_fdmi_tmo_handler(struct lpfc_hba *phba) mod_timer(&phba->fc_fdmitmo, jiffies + HZ * 60); } } + spin_unlock_irq(phba->host->host_lock); return; } diff --git a/drivers/scsi/lpfc/lpfc_disc.h b/drivers/scsi/lpfc/lpfc_disc.h index 41cf5d3ea..ed6c81660 100644 --- a/drivers/scsi/lpfc/lpfc_disc.h +++ b/drivers/scsi/lpfc/lpfc_disc.h @@ -1,7 +1,7 @@ /******************************************************************* * This file is part of the Emulex Linux Device Driver for * * Fibre Channel Host Bus Adapters. * - * Copyright (C) 2004-2006 Emulex. All rights reserved. * + * Copyright (C) 2004-2005 Emulex. All rights reserved. * * EMULEX and SLI are trademarks of Emulex. * * www.emulex.com * * * @@ -28,24 +28,18 @@ * This is used by Fibre Channel protocol to support FCP. */ -/* worker thread events */ -enum lpfc_work_type { - LPFC_EVT_NODEV_TMO, - LPFC_EVT_ONLINE, - LPFC_EVT_OFFLINE, - LPFC_EVT_WARM_START, - LPFC_EVT_KILL, - LPFC_EVT_ELS_RETRY, -}; - /* structure used to queue event to the discovery tasklet */ struct lpfc_work_evt { struct list_head evt_listp; void * evt_arg1; void * evt_arg2; - enum lpfc_work_type evt; + uint32_t evt; }; +#define LPFC_EVT_NODEV_TMO 0x1 +#define LPFC_EVT_ONLINE 0x2 +#define LPFC_EVT_OFFLINE 0x3 +#define LPFC_EVT_ELS_RETRY 0x4 struct lpfc_nodelist { struct list_head nlp_listp; @@ -62,7 +56,6 @@ struct lpfc_nodelist { uint16_t nlp_rpi; uint16_t nlp_state; /* state transition indicator */ - uint16_t nlp_prev_state; /* state transition indicator */ uint16_t nlp_xri; /* output exchange id for RPI */ uint16_t nlp_sid; /* scsi id */ #define NLP_NO_SID 0xffff @@ -113,7 +106,6 @@ struct lpfc_nodelist { #define NLP_NPR_ADISC 0x2000000 /* Issue ADISC when dq'ed from NPR list */ #define NLP_DELAY_REMOVE 0x4000000 /* Defer removal till end of DSM */ -#define NLP_NODEV_REMOVE 0x8000000 /* Defer removal till discovery ends */ /* Defines for list searchs */ #define NLP_SEARCH_MAPPED 0x1 /* search mapped */ diff --git a/drivers/scsi/lpfc/lpfc_els.c b/drivers/scsi/lpfc/lpfc_els.c index 3567de613..20f1a0713 100644 --- a/drivers/scsi/lpfc/lpfc_els.c +++ b/drivers/scsi/lpfc/lpfc_els.c @@ -1,7 +1,7 @@ /******************************************************************* * This file is part of the Emulex Linux Device Driver for * * Fibre Channel Host Bus Adapters. * - * Copyright (C) 2004-2006 Emulex. All rights reserved. * + * Copyright (C) 2004-2005 Emulex. All rights reserved. * * EMULEX and SLI are trademarks of Emulex. * * www.emulex.com * * Portions Copyright (C) 2004-2005 Christoph Hellwig * @@ -92,14 +92,15 @@ lpfc_els_chk_latt(struct lpfc_hba * phba) } } - return 1; + return (1); } static struct lpfc_iocbq * -lpfc_prep_els_iocb(struct lpfc_hba * phba, uint8_t expectRsp, - uint16_t cmdSize, uint8_t retry, struct lpfc_nodelist * ndlp, - uint32_t did, uint32_t elscmd) +lpfc_prep_els_iocb(struct lpfc_hba * phba, + uint8_t expectRsp, + uint16_t cmdSize, + uint8_t retry, struct lpfc_nodelist * ndlp, uint32_t elscmd) { struct lpfc_sli_ring *pring; struct lpfc_iocbq *elsiocb; @@ -180,7 +181,7 @@ lpfc_prep_els_iocb(struct lpfc_hba * phba, uint8_t expectRsp, icmd->un.elsreq64.bdl.bdeFlags = BUFF_TYPE_BDL; if (expectRsp) { icmd->un.elsreq64.bdl.bdeSize = (2 * sizeof (struct ulp_bde64)); - icmd->un.elsreq64.remoteID = did; /* DID */ + icmd->un.elsreq64.remoteID = ndlp->nlp_DID; /* DID */ icmd->ulpCommand = CMD_ELS_REQUEST64_CR; } else { icmd->un.elsreq64.bdl.bdeSize = sizeof (struct ulp_bde64); @@ -224,7 +225,7 @@ lpfc_prep_els_iocb(struct lpfc_hba * phba, uint8_t expectRsp, "%d:0116 Xmit ELS command x%x to remote " "NPORT x%x Data: x%x x%x\n", phba->brd_no, elscmd, - did, icmd->ulpIoTag, phba->hba_state); + ndlp->nlp_DID, icmd->ulpIoTag, phba->hba_state); } else { /* Xmit ELS response to remote NPORT */ lpfc_printf_log(phba, KERN_INFO, LOG_ELS, @@ -234,7 +235,7 @@ lpfc_prep_els_iocb(struct lpfc_hba * phba, uint8_t expectRsp, ndlp->nlp_DID, icmd->ulpIoTag, cmdSize); } - return elsiocb; + return (elsiocb); } @@ -302,6 +303,10 @@ lpfc_cmpl_els_flogi_fabric(struct lpfc_hba *phba, struct lpfc_nodelist *ndlp, if (lpfc_reg_login(phba, Fabric_DID, (uint8_t *) sp, mbox, 0)) goto fail_free_mbox; + /* + * set_slim mailbox command needs to execute first, + * queue this command to be processed later. + */ mbox->mbox_cmpl = lpfc_mbx_cmpl_fabric_reg_login; mbox->context2 = ndlp; @@ -441,10 +446,9 @@ lpfc_cmpl_els_flogi(struct lpfc_hba * phba, lpfc_printf_log(phba, KERN_INFO, LOG_ELS, - "%d:0100 FLOGI failure Data: x%x x%x x%x\n", + "%d:0100 FLOGI failure Data: x%x x%x\n", phba->brd_no, - irsp->ulpStatus, irsp->un.ulpWord[4], - irsp->ulpTimeout); + irsp->ulpStatus, irsp->un.ulpWord[4]); goto flogifail; } @@ -511,10 +515,10 @@ lpfc_issue_els_flogi(struct lpfc_hba * phba, struct lpfc_nodelist * ndlp, pring = &phba->sli.ring[LPFC_ELS_RING]; cmdsize = (sizeof (uint32_t) + sizeof (struct serv_parm)); - elsiocb = lpfc_prep_els_iocb(phba, 1, cmdsize, retry, ndlp, - ndlp->nlp_DID, ELS_CMD_FLOGI); - if (!elsiocb) - return 1; + if ((elsiocb = lpfc_prep_els_iocb(phba, 1, cmdsize, retry, + ndlp, ELS_CMD_FLOGI)) == 0) { + return (1); + } icmd = &elsiocb->iocb; pcmd = (uint8_t *) (((struct lpfc_dmabuf *) elsiocb->context2)->virt); @@ -548,9 +552,9 @@ lpfc_issue_els_flogi(struct lpfc_hba * phba, struct lpfc_nodelist * ndlp, spin_unlock_irq(phba->host->host_lock); if (rc == IOCB_ERROR) { lpfc_els_free_iocb(phba, elsiocb); - return 1; + return (1); } - return 0; + return (0); } int @@ -607,21 +611,29 @@ lpfc_initial_flogi(struct lpfc_hba * phba) { struct lpfc_nodelist *ndlp; - /* First look for the Fabric ndlp */ - ndlp = lpfc_findnode_did(phba, NLP_SEARCH_ALL, Fabric_DID); - if (!ndlp) { + /* First look for Fabric ndlp on the unmapped list */ + + if ((ndlp = + lpfc_findnode_did(phba, NLP_SEARCH_UNMAPPED, + Fabric_DID)) == 0) { /* Cannot find existing Fabric ndlp, so allocate a new one */ - ndlp = mempool_alloc(phba->nlp_mem_pool, GFP_KERNEL); - if (!ndlp) - return 0; + if ((ndlp = mempool_alloc(phba->nlp_mem_pool, GFP_KERNEL)) + == 0) { + return (0); + } lpfc_nlp_init(phba, ndlp, Fabric_DID); - } else { - lpfc_nlp_list(phba, ndlp, NLP_JUST_DQ); + } + else { + phba->fc_unmap_cnt--; + list_del(&ndlp->nlp_listp); + spin_lock_irq(phba->host->host_lock); + ndlp->nlp_flag &= ~NLP_LIST_MASK; + spin_unlock_irq(phba->host->host_lock); } if (lpfc_issue_els_flogi(phba, ndlp, 0)) { mempool_free( ndlp, phba->nlp_mem_pool); } - return 1; + return (1); } static void @@ -647,94 +659,38 @@ lpfc_more_plogi(struct lpfc_hba * phba) return; } -static struct lpfc_nodelist * -lpfc_plogi_confirm_nport(struct lpfc_hba * phba, struct lpfc_dmabuf *prsp, - struct lpfc_nodelist *ndlp) -{ - struct lpfc_nodelist *new_ndlp; - uint32_t *lp; - struct serv_parm *sp; - uint8_t name[sizeof (struct lpfc_name)]; - uint32_t rc; - - 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); - - 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; - - lpfc_nlp_init(phba, new_ndlp, ndlp->nlp_DID); - } - - lpfc_unreg_rpi(phba, new_ndlp); - new_ndlp->nlp_DID = ndlp->nlp_DID; - 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 */ - 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; -} - static void lpfc_cmpl_els_plogi(struct lpfc_hba * phba, struct lpfc_iocbq * cmdiocb, struct lpfc_iocbq * rspiocb) { IOCB_t *irsp; + struct lpfc_sli *psli; struct lpfc_nodelist *ndlp; - struct lpfc_dmabuf *prsp; int disc, rc, did, type; + psli = &phba->sli; /* we pass cmdiocb to state machine which needs rspiocb as well */ cmdiocb->context_un.rsp_iocb = rspiocb; irsp = &rspiocb->iocb; - ndlp = lpfc_findnode_did(phba, NLP_SEARCH_ALL, - irsp->un.elsreq64.remoteID); - if (!ndlp) - goto out; + ndlp = (struct lpfc_nodelist *) cmdiocb->context1; + spin_lock_irq(phba->host->host_lock); + ndlp->nlp_flag &= ~NLP_PLOGI_SND; + spin_unlock_irq(phba->host->host_lock); /* Since ndlp can be freed in the disc state machine, note if this node * is being used during discovery. */ disc = (ndlp->nlp_flag & NLP_NPR_2B_DISC); - spin_lock_irq(phba->host->host_lock); - ndlp->nlp_flag &= ~NLP_NPR_2B_DISC; - spin_unlock_irq(phba->host->host_lock); rc = 0; /* PLOGI completes to NPort */ lpfc_printf_log(phba, KERN_INFO, LOG_ELS, "%d:0102 PLOGI completes to NPort x%x " - "Data: x%x x%x x%x x%x x%x\n", + "Data: x%x x%x x%x x%x\n", phba->brd_no, ndlp->nlp_DID, irsp->ulpStatus, - irsp->un.ulpWord[4], irsp->ulpTimeout, disc, - phba->num_disc_nodes); + irsp->un.ulpWord[4], disc, phba->num_disc_nodes); /* Check to see if link went down during discovery */ if (lpfc_els_chk_latt(phba)) { @@ -766,44 +722,55 @@ lpfc_cmpl_els_plogi(struct lpfc_hba * phba, struct lpfc_iocbq * cmdiocb, ((irsp->un.ulpWord[4] == IOERR_SLI_ABORTED) || (irsp->un.ulpWord[4] == IOERR_LINK_DOWN) || (irsp->un.ulpWord[4] == IOERR_SLI_DOWN))) { - rc = NLP_STE_FREED_NODE; - } else { + disc = (ndlp->nlp_flag & NLP_NPR_2B_DISC); + } + else { rc = lpfc_disc_state_machine(phba, ndlp, cmdiocb, NLP_EVT_CMPL_PLOGI); } } else { /* Good status, call state machine */ - 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); } + if (type & NLP_FABRIC) { + /* If we cannot login to Nameserver, kick off discovery now */ + if ((did == NameServer_DID) && (rc == NLP_STE_FREED_NODE)) { + lpfc_disc_start(phba); + } + goto out; + } + if (disc && phba->num_disc_nodes) { /* Check to see if there are more PLOGIs to be sent */ lpfc_more_plogi(phba); + } - if (phba->num_disc_nodes == 0) { + if (rc != NLP_STE_FREED_NODE) { + spin_lock_irq(phba->host->host_lock); + ndlp->nlp_flag &= ~NLP_NPR_2B_DISC; + spin_unlock_irq(phba->host->host_lock); + } + + if (phba->num_disc_nodes == 0) { + if(disc) { spin_lock_irq(phba->host->host_lock); phba->fc_flag &= ~FC_NDISC_ACTIVE; spin_unlock_irq(phba->host->host_lock); - - lpfc_can_disctmo(phba); - if (phba->fc_flag & FC_RSCN_MODE) { - /* - * Check to see if more RSCNs came in while - * we were processing this one. - */ - if ((phba->fc_rscn_id_cnt == 0) && - (!(phba->fc_flag & FC_RSCN_DISCOVERY))) { - spin_lock_irq(phba->host->host_lock); - phba->fc_flag &= ~FC_RSCN_MODE; - spin_unlock_irq(phba->host->host_lock); - } else { - lpfc_els_handle_rscn(phba); - } + } + lpfc_can_disctmo(phba); + if (phba->fc_flag & FC_RSCN_MODE) { + /* Check to see if more RSCNs came in while we were + * processing this one. + */ + if ((phba->fc_rscn_id_cnt == 0) && + (!(phba->fc_flag & FC_RSCN_DISCOVERY))) { + spin_lock_irq(phba->host->host_lock); + phba->fc_flag &= ~FC_RSCN_MODE; + spin_unlock_irq(phba->host->host_lock); + } else { + lpfc_els_handle_rscn(phba); } } } @@ -814,7 +781,8 @@ out: } int -lpfc_issue_els_plogi(struct lpfc_hba * phba, uint32_t did, uint8_t retry) +lpfc_issue_els_plogi(struct lpfc_hba * phba, struct lpfc_nodelist * ndlp, + uint8_t retry) { struct serv_parm *sp; IOCB_t *icmd; @@ -828,10 +796,10 @@ 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, NULL, did, - ELS_CMD_PLOGI); - if (!elsiocb) - return 1; + if ((elsiocb = lpfc_prep_els_iocb(phba, 1, cmdsize, retry, + ndlp, ELS_CMD_PLOGI)) == 0) { + return (1); + } icmd = &elsiocb->iocb; pcmd = (uint8_t *) (((struct lpfc_dmabuf *) elsiocb->context2)->virt); @@ -851,13 +819,15 @@ lpfc_issue_els_plogi(struct lpfc_hba * phba, uint32_t did, uint8_t retry) phba->fc_stat.elsXmitPLOGI++; elsiocb->iocb_cmpl = lpfc_cmpl_els_plogi; spin_lock_irq(phba->host->host_lock); + ndlp->nlp_flag |= NLP_PLOGI_SND; if (lpfc_sli_issue_iocb(phba, pring, elsiocb, 0) == IOCB_ERROR) { + ndlp->nlp_flag &= ~NLP_PLOGI_SND; spin_unlock_irq(phba->host->host_lock); lpfc_els_free_iocb(phba, elsiocb); - return 1; + return (1); } spin_unlock_irq(phba->host->host_lock); - return 0; + return (0); } static void @@ -881,10 +851,9 @@ lpfc_cmpl_els_prli(struct lpfc_hba * phba, struct lpfc_iocbq * cmdiocb, /* PRLI completes to NPort */ lpfc_printf_log(phba, KERN_INFO, LOG_ELS, "%d:0103 PRLI completes to NPort x%x " - "Data: x%x x%x x%x x%x\n", + "Data: x%x x%x x%x\n", phba->brd_no, ndlp->nlp_DID, irsp->ulpStatus, - irsp->un.ulpWord[4], irsp->ulpTimeout, - phba->num_disc_nodes); + irsp->un.ulpWord[4], phba->num_disc_nodes); phba->fc_prli_sent--; /* Check to see if link went down during discovery */ @@ -904,7 +873,8 @@ lpfc_cmpl_els_prli(struct lpfc_hba * phba, struct lpfc_iocbq * cmdiocb, (irsp->un.ulpWord[4] == IOERR_LINK_DOWN) || (irsp->un.ulpWord[4] == IOERR_SLI_DOWN))) { goto out; - } else { + } + else { lpfc_disc_state_machine(phba, ndlp, cmdiocb, NLP_EVT_CMPL_PRLI); } @@ -934,10 +904,10 @@ lpfc_issue_els_prli(struct lpfc_hba * phba, struct lpfc_nodelist * ndlp, pring = &psli->ring[LPFC_ELS_RING]; /* ELS ring */ cmdsize = (sizeof (uint32_t) + sizeof (PRLI)); - elsiocb = lpfc_prep_els_iocb(phba, 1, cmdsize, retry, ndlp, - ndlp->nlp_DID, ELS_CMD_PRLI); - if (!elsiocb) - return 1; + if ((elsiocb = lpfc_prep_els_iocb(phba, 1, cmdsize, retry, + ndlp, ELS_CMD_PRLI)) == 0) { + return (1); + } icmd = &elsiocb->iocb; pcmd = (uint8_t *) (((struct lpfc_dmabuf *) elsiocb->context2)->virt); @@ -973,11 +943,11 @@ lpfc_issue_els_prli(struct lpfc_hba * phba, struct lpfc_nodelist * ndlp, ndlp->nlp_flag &= ~NLP_PRLI_SND; spin_unlock_irq(phba->host->host_lock); lpfc_els_free_iocb(phba, elsiocb); - return 1; + return (1); } spin_unlock_irq(phba->host->host_lock); phba->fc_prli_sent++; - return 0; + return (0); } static void @@ -1046,22 +1016,21 @@ lpfc_cmpl_els_adisc(struct lpfc_hba * phba, struct lpfc_iocbq * cmdiocb, irsp = &(rspiocb->iocb); ndlp = (struct lpfc_nodelist *) cmdiocb->context1; + spin_lock_irq(phba->host->host_lock); + ndlp->nlp_flag &= ~NLP_ADISC_SND; + spin_unlock_irq(phba->host->host_lock); /* Since ndlp can be freed in the disc state machine, note if this node * is being used during discovery. */ disc = (ndlp->nlp_flag & NLP_NPR_2B_DISC); - spin_lock_irq(phba->host->host_lock); - ndlp->nlp_flag &= ~(NLP_ADISC_SND | NLP_NPR_2B_DISC); - spin_unlock_irq(phba->host->host_lock); /* ADISC completes to NPort */ lpfc_printf_log(phba, KERN_INFO, LOG_ELS, "%d:0104 ADISC completes to NPort x%x " - "Data: x%x x%x x%x x%x x%x\n", + "Data: x%x x%x x%x x%x\n", phba->brd_no, ndlp->nlp_DID, irsp->ulpStatus, - irsp->un.ulpWord[4], irsp->ulpTimeout, disc, - phba->num_disc_nodes); + irsp->un.ulpWord[4], disc, phba->num_disc_nodes); /* Check to see if link went down during discovery */ if (lpfc_els_chk_latt(phba)) { @@ -1085,10 +1054,13 @@ lpfc_cmpl_els_adisc(struct lpfc_hba * phba, struct lpfc_iocbq * cmdiocb, } /* ADISC failed */ /* Do not call DSM for lpfc_els_abort'ed ELS cmds */ - if ((irsp->ulpStatus != IOSTAT_LOCAL_REJECT) || - ((irsp->un.ulpWord[4] != IOERR_SLI_ABORTED) && - (irsp->un.ulpWord[4] != IOERR_LINK_DOWN) && - (irsp->un.ulpWord[4] != IOERR_SLI_DOWN))) { + if ((irsp->ulpStatus == IOSTAT_LOCAL_REJECT) && + ((irsp->un.ulpWord[4] == IOERR_SLI_ABORTED) || + (irsp->un.ulpWord[4] == IOERR_LINK_DOWN) || + (irsp->un.ulpWord[4] == IOERR_SLI_DOWN))) { + disc = (ndlp->nlp_flag & NLP_NPR_2B_DISC); + } + else { lpfc_disc_state_machine(phba, ndlp, cmdiocb, NLP_EVT_CMPL_ADISC); } @@ -1140,6 +1112,9 @@ lpfc_cmpl_els_adisc(struct lpfc_hba * phba, struct lpfc_iocbq * cmdiocb, } } } + spin_lock_irq(phba->host->host_lock); + ndlp->nlp_flag &= ~NLP_NPR_2B_DISC; + spin_unlock_irq(phba->host->host_lock); out: lpfc_els_free_iocb(phba, cmdiocb); return; @@ -1161,10 +1136,10 @@ lpfc_issue_els_adisc(struct lpfc_hba * phba, struct lpfc_nodelist * ndlp, pring = &psli->ring[LPFC_ELS_RING]; /* ELS ring */ cmdsize = (sizeof (uint32_t) + sizeof (ADISC)); - elsiocb = lpfc_prep_els_iocb(phba, 1, cmdsize, retry, ndlp, - ndlp->nlp_DID, ELS_CMD_ADISC); - if (!elsiocb) - return 1; + if ((elsiocb = lpfc_prep_els_iocb(phba, 1, cmdsize, retry, + ndlp, ELS_CMD_ADISC)) == 0) { + return (1); + } icmd = &elsiocb->iocb; pcmd = (uint8_t *) (((struct lpfc_dmabuf *) elsiocb->context2)->virt); @@ -1188,10 +1163,10 @@ lpfc_issue_els_adisc(struct lpfc_hba * phba, struct lpfc_nodelist * ndlp, ndlp->nlp_flag &= ~NLP_ADISC_SND; spin_unlock_irq(phba->host->host_lock); lpfc_els_free_iocb(phba, elsiocb); - return 1; + return (1); } spin_unlock_irq(phba->host->host_lock); - return 0; + return (0); } static void @@ -1215,10 +1190,9 @@ lpfc_cmpl_els_logo(struct lpfc_hba * phba, struct lpfc_iocbq * cmdiocb, /* LOGO completes to NPort */ lpfc_printf_log(phba, KERN_INFO, LOG_ELS, "%d:0105 LOGO completes to NPort x%x " - "Data: x%x x%x x%x x%x\n", + "Data: x%x x%x x%x\n", phba->brd_no, ndlp->nlp_DID, irsp->ulpStatus, - irsp->un.ulpWord[4], irsp->ulpTimeout, - phba->num_disc_nodes); + irsp->un.ulpWord[4], phba->num_disc_nodes); /* Check to see if link went down during discovery */ if (lpfc_els_chk_latt(phba)) @@ -1237,15 +1211,18 @@ lpfc_cmpl_els_logo(struct lpfc_hba * phba, struct lpfc_iocbq * cmdiocb, (irsp->un.ulpWord[4] == IOERR_LINK_DOWN) || (irsp->un.ulpWord[4] == IOERR_SLI_DOWN))) { goto out; - } else { + } + else { lpfc_disc_state_machine(phba, ndlp, cmdiocb, NLP_EVT_CMPL_LOGO); } } else { - /* Good status, call state machine. - * This will unregister the rpi if needed. - */ + /* Good status, call state machine */ lpfc_disc_state_machine(phba, ndlp, cmdiocb, NLP_EVT_CMPL_LOGO); + + if (ndlp->nlp_flag & NLP_DELAY_TMO) { + lpfc_unreg_rpi(phba, ndlp); + } } out: @@ -1267,11 +1244,11 @@ lpfc_issue_els_logo(struct lpfc_hba * phba, struct lpfc_nodelist * ndlp, psli = &phba->sli; pring = &psli->ring[LPFC_ELS_RING]; - cmdsize = (2 * sizeof (uint32_t)) + sizeof (struct lpfc_name); - elsiocb = lpfc_prep_els_iocb(phba, 1, cmdsize, retry, ndlp, - ndlp->nlp_DID, ELS_CMD_LOGO); - if (!elsiocb) - return 1; + cmdsize = 2 * (sizeof (uint32_t) + sizeof (struct lpfc_name)); + if ((elsiocb = lpfc_prep_els_iocb(phba, 1, cmdsize, retry, + ndlp, ELS_CMD_LOGO)) == 0) { + return (1); + } icmd = &elsiocb->iocb; pcmd = (uint8_t *) (((struct lpfc_dmabuf *) elsiocb->context2)->virt); @@ -1291,10 +1268,10 @@ lpfc_issue_els_logo(struct lpfc_hba * phba, struct lpfc_nodelist * ndlp, ndlp->nlp_flag &= ~NLP_LOGO_SND; spin_unlock_irq(phba->host->host_lock); lpfc_els_free_iocb(phba, elsiocb); - return 1; + return (1); } spin_unlock_irq(phba->host->host_lock); - return 0; + return (0); } static void @@ -1309,10 +1286,9 @@ lpfc_cmpl_els_cmd(struct lpfc_hba * phba, struct lpfc_iocbq * cmdiocb, lpfc_printf_log(phba, KERN_INFO, LOG_ELS, - "%d:0106 ELS cmd tag x%x completes Data: x%x x%x x%x\n", + "%d:0106 ELS cmd tag x%x completes Data: x%x x%x\n", phba->brd_no, - irsp->ulpIoTag, irsp->ulpStatus, - irsp->un.ulpWord[4], irsp->ulpTimeout); + irsp->ulpIoTag, irsp->ulpStatus, irsp->un.ulpWord[4]); /* Check to see if link went down during discovery */ lpfc_els_chk_latt(phba); @@ -1334,17 +1310,16 @@ lpfc_issue_els_scr(struct lpfc_hba * phba, uint32_t nportid, uint8_t retry) psli = &phba->sli; pring = &psli->ring[LPFC_ELS_RING]; /* ELS ring */ cmdsize = (sizeof (uint32_t) + sizeof (SCR)); - ndlp = mempool_alloc(phba->nlp_mem_pool, GFP_KERNEL); - if (!ndlp) - return 1; + if ((ndlp = mempool_alloc(phba->nlp_mem_pool, GFP_KERNEL)) == 0) { + return (1); + } lpfc_nlp_init(phba, ndlp, nportid); - elsiocb = lpfc_prep_els_iocb(phba, 1, cmdsize, retry, ndlp, - ndlp->nlp_DID, ELS_CMD_SCR); - if (!elsiocb) { + if ((elsiocb = lpfc_prep_els_iocb(phba, 1, cmdsize, retry, + ndlp, ELS_CMD_SCR)) == 0) { mempool_free( ndlp, phba->nlp_mem_pool); - return 1; + return (1); } icmd = &elsiocb->iocb; @@ -1364,11 +1339,11 @@ lpfc_issue_els_scr(struct lpfc_hba * phba, uint32_t nportid, uint8_t retry) spin_unlock_irq(phba->host->host_lock); mempool_free( ndlp, phba->nlp_mem_pool); lpfc_els_free_iocb(phba, elsiocb); - return 1; + return (1); } spin_unlock_irq(phba->host->host_lock); mempool_free( ndlp, phba->nlp_mem_pool); - return 0; + return (0); } static int @@ -1388,16 +1363,15 @@ lpfc_issue_els_farpr(struct lpfc_hba * phba, uint32_t nportid, uint8_t retry) psli = &phba->sli; pring = &psli->ring[LPFC_ELS_RING]; /* ELS ring */ cmdsize = (sizeof (uint32_t) + sizeof (FARP)); - ndlp = mempool_alloc(phba->nlp_mem_pool, GFP_KERNEL); - if (!ndlp) - return 1; + if ((ndlp = mempool_alloc(phba->nlp_mem_pool, GFP_KERNEL)) == 0) { + return (1); + } lpfc_nlp_init(phba, ndlp, nportid); - elsiocb = lpfc_prep_els_iocb(phba, 1, cmdsize, retry, ndlp, - ndlp->nlp_DID, ELS_CMD_RNID); - if (!elsiocb) { + if ((elsiocb = lpfc_prep_els_iocb(phba, 1, cmdsize, retry, + ndlp, ELS_CMD_RNID)) == 0) { mempool_free( ndlp, phba->nlp_mem_pool); - return 1; + return (1); } icmd = &elsiocb->iocb; @@ -1431,52 +1405,11 @@ lpfc_issue_els_farpr(struct lpfc_hba * phba, uint32_t nportid, uint8_t retry) spin_unlock_irq(phba->host->host_lock); mempool_free( ndlp, phba->nlp_mem_pool); lpfc_els_free_iocb(phba, elsiocb); - return 1; + return (1); } spin_unlock_irq(phba->host->host_lock); mempool_free( ndlp, phba->nlp_mem_pool); - return 0; -} - -void -lpfc_cancel_retry_delay_tmo(struct lpfc_hba *phba, struct lpfc_nodelist * nlp) -{ - nlp->nlp_flag &= ~NLP_DELAY_TMO; - del_timer_sync(&nlp->nlp_delayfunc); - nlp->nlp_last_elscmd = 0; - - if (!list_empty(&nlp->els_retry_evt.evt_listp)) - list_del_init(&nlp->els_retry_evt.evt_listp); - - if (nlp->nlp_flag & NLP_NPR_2B_DISC) { - nlp->nlp_flag &= ~NLP_NPR_2B_DISC; - if (phba->num_disc_nodes) { - /* Check to see if there are more - * PLOGIs to be sent - */ - lpfc_more_plogi(phba); - - if (phba->num_disc_nodes == 0) { - phba->fc_flag &= ~FC_NDISC_ACTIVE; - lpfc_can_disctmo(phba); - if (phba->fc_flag & FC_RSCN_MODE) { - /* - * Check to see if more RSCNs - * came in while we were - * processing this one. - */ - if((phba->fc_rscn_id_cnt==0) && - !(phba->fc_flag & FC_RSCN_DISCOVERY)) { - phba->fc_flag &= ~FC_RSCN_MODE; - } - else { - lpfc_els_handle_rscn(phba); - } - } - } - } - } - return; + return (0); } void @@ -1517,9 +1450,8 @@ lpfc_els_retry_delay_handler(struct lpfc_nodelist *ndlp) phba = ndlp->nlp_phba; spin_lock_irq(phba->host->host_lock); - did = ndlp->nlp_DID; - cmd = ndlp->nlp_last_elscmd; - ndlp->nlp_last_elscmd = 0; + did = (uint32_t) (ndlp->nlp_DID); + cmd = (uint32_t) (ndlp->nlp_last_elscmd); if (!(ndlp->nlp_flag & NLP_DELAY_TMO)) { spin_unlock_irq(phba->host->host_lock); @@ -1528,12 +1460,6 @@ lpfc_els_retry_delay_handler(struct lpfc_nodelist *ndlp) ndlp->nlp_flag &= ~NLP_DELAY_TMO; spin_unlock_irq(phba->host->host_lock); - /* - * If a discovery event readded nlp_delayfunc after timer - * firing and before processing the timer, cancel the - * nlp_delayfunc. - */ - del_timer_sync(&ndlp->nlp_delayfunc); retry = ndlp->nlp_retry; switch (cmd) { @@ -1541,32 +1467,24 @@ lpfc_els_retry_delay_handler(struct lpfc_nodelist *ndlp) lpfc_issue_els_flogi(phba, ndlp, retry); break; case ELS_CMD_PLOGI: - if(!lpfc_issue_els_plogi(phba, ndlp->nlp_DID, retry)) { - ndlp->nlp_prev_state = ndlp->nlp_state; - ndlp->nlp_state = NLP_STE_PLOGI_ISSUE; - lpfc_nlp_list(phba, ndlp, NLP_PLOGI_LIST); - } + ndlp->nlp_state = NLP_STE_PLOGI_ISSUE; + lpfc_nlp_list(phba, ndlp, NLP_PLOGI_LIST); + lpfc_issue_els_plogi(phba, ndlp, retry); break; case ELS_CMD_ADISC: - if (!lpfc_issue_els_adisc(phba, ndlp, retry)) { - ndlp->nlp_prev_state = ndlp->nlp_state; - ndlp->nlp_state = NLP_STE_ADISC_ISSUE; - lpfc_nlp_list(phba, ndlp, NLP_ADISC_LIST); - } + ndlp->nlp_state = NLP_STE_ADISC_ISSUE; + lpfc_nlp_list(phba, ndlp, NLP_ADISC_LIST); + lpfc_issue_els_adisc(phba, ndlp, retry); break; case ELS_CMD_PRLI: - if (!lpfc_issue_els_prli(phba, ndlp, retry)) { - ndlp->nlp_prev_state = ndlp->nlp_state; - ndlp->nlp_state = NLP_STE_PRLI_ISSUE; - lpfc_nlp_list(phba, ndlp, NLP_PRLI_LIST); - } + ndlp->nlp_state = NLP_STE_PRLI_ISSUE; + lpfc_nlp_list(phba, ndlp, NLP_PRLI_LIST); + lpfc_issue_els_prli(phba, ndlp, retry); break; case ELS_CMD_LOGO: - if (!lpfc_issue_els_logo(phba, ndlp, retry)) { - ndlp->nlp_prev_state = ndlp->nlp_state; - ndlp->nlp_state = NLP_STE_NPR_NODE; - lpfc_nlp_list(phba, ndlp, NLP_NPR_LIST); - } + ndlp->nlp_state = NLP_STE_NPR_NODE; + lpfc_nlp_list(phba, ndlp, NLP_NPR_LIST); + lpfc_issue_els_logo(phba, ndlp, retry); break; } return; @@ -1584,7 +1502,6 @@ lpfc_els_retry(struct lpfc_hba * phba, struct lpfc_iocbq * cmdiocb, int retry, maxretry; int delay; uint32_t cmd; - uint32_t did; retry = 0; delay = 0; @@ -1593,7 +1510,6 @@ lpfc_els_retry(struct lpfc_hba * phba, struct lpfc_iocbq * cmdiocb, ndlp = (struct lpfc_nodelist *) cmdiocb->context1; pcmd = (struct lpfc_dmabuf *) cmdiocb->context2; cmd = 0; - /* Note: context2 may be 0 for internal driver abort * of delays ELS command. */ @@ -1603,16 +1519,6 @@ lpfc_els_retry(struct lpfc_hba * phba, struct lpfc_iocbq * cmdiocb, cmd = *elscmd++; } - if(ndlp) - did = ndlp->nlp_DID; - else { - /* We should only hit this case for retrying PLOGI */ - did = irsp->un.elsreq64.remoteID; - ndlp = lpfc_findnode_did(phba, NLP_SEARCH_ALL, did); - if (!ndlp && (cmd != ELS_CMD_PLOGI)) - return 1; - } - switch (irsp->ulpStatus) { case IOSTAT_FCP_RSP_ERROR: case IOSTAT_REMOTE_STOP: @@ -1631,6 +1537,11 @@ lpfc_els_retry(struct lpfc_hba * phba, struct lpfc_iocbq * cmdiocb, case IOERR_SEQUENCE_TIMEOUT: retry = 1; + if ((cmd == ELS_CMD_FLOGI) + && (phba->fc_topology != TOPOLOGY_LOOP)) { + delay = 1; + maxretry = 48; + } break; case IOERR_NO_RESOURCES: @@ -1701,8 +1612,9 @@ lpfc_els_retry(struct lpfc_hba * phba, struct lpfc_iocbq * cmdiocb, break; } - if (did == FDMI_DID) + if (ndlp->nlp_DID == FDMI_DID) { retry = 1; + } if ((++cmdiocb->retry) >= maxretry) { phba->fc_stat.elsRetryExceeded++; @@ -1716,7 +1628,7 @@ lpfc_els_retry(struct lpfc_hba * phba, struct lpfc_iocbq * cmdiocb, "%d:0107 Retry ELS command x%x to remote " "NPORT x%x Data: x%x x%x\n", phba->brd_no, - cmd, did, cmdiocb->retry, delay); + cmd, ndlp->nlp_DID, cmdiocb->retry, delay); if ((cmd == ELS_CMD_PLOGI) || (cmd == ELS_CMD_ADISC)) { /* If discovery / RSCN timer is running, reset it */ @@ -1727,61 +1639,54 @@ lpfc_els_retry(struct lpfc_hba * phba, struct lpfc_iocbq * cmdiocb, } phba->fc_stat.elsXmitRetry++; - if (ndlp && delay) { + if (delay) { phba->fc_stat.elsDelayRetry++; ndlp->nlp_retry = cmdiocb->retry; mod_timer(&ndlp->nlp_delayfunc, jiffies + HZ); ndlp->nlp_flag |= NLP_DELAY_TMO; - ndlp->nlp_prev_state = ndlp->nlp_state; ndlp->nlp_state = NLP_STE_NPR_NODE; lpfc_nlp_list(phba, ndlp, NLP_NPR_LIST); ndlp->nlp_last_elscmd = cmd; - return 1; + return (1); } switch (cmd) { case ELS_CMD_FLOGI: lpfc_issue_els_flogi(phba, ndlp, cmdiocb->retry); - return 1; + return (1); case ELS_CMD_PLOGI: - if (ndlp) { - ndlp->nlp_prev_state = ndlp->nlp_state; - ndlp->nlp_state = NLP_STE_PLOGI_ISSUE; - lpfc_nlp_list(phba, ndlp, NLP_PLOGI_LIST); - } - lpfc_issue_els_plogi(phba, did, cmdiocb->retry); - return 1; + ndlp->nlp_state = NLP_STE_PLOGI_ISSUE; + lpfc_nlp_list(phba, ndlp, NLP_PLOGI_LIST); + lpfc_issue_els_plogi(phba, ndlp, cmdiocb->retry); + return (1); case ELS_CMD_ADISC: - ndlp->nlp_prev_state = ndlp->nlp_state; ndlp->nlp_state = NLP_STE_ADISC_ISSUE; lpfc_nlp_list(phba, ndlp, NLP_ADISC_LIST); lpfc_issue_els_adisc(phba, ndlp, cmdiocb->retry); - return 1; + return (1); case ELS_CMD_PRLI: - ndlp->nlp_prev_state = ndlp->nlp_state; ndlp->nlp_state = NLP_STE_PRLI_ISSUE; lpfc_nlp_list(phba, ndlp, NLP_PRLI_LIST); lpfc_issue_els_prli(phba, ndlp, cmdiocb->retry); - return 1; + return (1); case ELS_CMD_LOGO: - ndlp->nlp_prev_state = ndlp->nlp_state; ndlp->nlp_state = NLP_STE_NPR_NODE; lpfc_nlp_list(phba, ndlp, NLP_NPR_LIST); lpfc_issue_els_logo(phba, ndlp, cmdiocb->retry); - return 1; + return (1); } } /* No retry ELS command to remote NPORT */ lpfc_printf_log(phba, KERN_INFO, LOG_ELS, "%d:0108 No retry ELS command x%x to remote NPORT x%x " - "Data: x%x\n", + "Data: x%x x%x\n", phba->brd_no, - cmd, did, cmdiocb->retry); + cmd, ndlp->nlp_DID, cmdiocb->retry, ndlp->nlp_flag); - return 0; + return (0); } int @@ -1830,6 +1735,10 @@ lpfc_cmpl_els_logo_acc(struct lpfc_hba * phba, struct lpfc_iocbq * cmdiocb, phba->brd_no, ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state, ndlp->nlp_rpi); + spin_lock_irq(phba->host->host_lock); + ndlp->nlp_flag &= ~NLP_LOGO_ACC; + spin_unlock_irq(phba->host->host_lock); + switch (ndlp->nlp_state) { case NLP_STE_UNUSED_NODE: /* node is just allocated */ lpfc_nlp_list(phba, ndlp, NLP_NO_LIST); @@ -1848,12 +1757,9 @@ 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; @@ -1870,20 +1776,21 @@ lpfc_cmpl_els_acc(struct lpfc_hba * phba, struct lpfc_iocbq * cmdiocb, /* ELS response tag completes */ lpfc_printf_log(phba, KERN_INFO, LOG_ELS, "%d:0110 ELS response tag x%x completes " - "Data: x%x x%x x%x x%x x%x x%x x%x\n", + "Data: x%x x%x x%x x%x x%x x%x\n", phba->brd_no, cmdiocb->iocb.ulpIoTag, rspiocb->iocb.ulpStatus, - rspiocb->iocb.un.ulpWord[4], rspiocb->iocb.ulpTimeout, - ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state, - ndlp->nlp_rpi); + rspiocb->iocb.un.ulpWord[4], ndlp->nlp_DID, + ndlp->nlp_flag, ndlp->nlp_state, ndlp->nlp_rpi); if (mbox) { if ((rspiocb->iocb.ulpStatus == 0) && (ndlp->nlp_flag & NLP_ACC_REGLOGIN)) { + /* set_slim mailbox command needs to execute first, + * queue this command to be processed later. + */ lpfc_unreg_rpi(phba, ndlp); mbox->mbox_cmpl = lpfc_mbx_cmpl_reg_login; mbox->context2 = ndlp; - ndlp->nlp_prev_state = ndlp->nlp_state; ndlp->nlp_state = NLP_STE_REG_LOGIN_ISSUE; lpfc_nlp_list(phba, ndlp, NLP_REGLOGIN_LIST); if (lpfc_sli_issue_mbox(phba, mbox, @@ -1896,15 +1803,8 @@ 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); - /* 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; - } + if (ndlp->nlp_flag & NLP_ACC_REGLOGIN) { + lpfc_nlp_list(phba, ndlp, NLP_NO_LIST); } } } @@ -1931,7 +1831,6 @@ lpfc_els_rsp_acc(struct lpfc_hba * phba, uint32_t flag, uint8_t *pcmd; uint16_t cmdsize; int rc; - ELS_PKT *els_pkt_ptr; psli = &phba->sli; pring = &psli->ring[LPFC_ELS_RING]; /* ELS ring */ @@ -1940,11 +1839,10 @@ lpfc_els_rsp_acc(struct lpfc_hba * phba, uint32_t flag, switch (flag) { case ELS_CMD_ACC: cmdsize = sizeof (uint32_t); - elsiocb = lpfc_prep_els_iocb(phba, 0, cmdsize, oldiocb->retry, - ndlp, ndlp->nlp_DID, ELS_CMD_ACC); - if (!elsiocb) { - ndlp->nlp_flag &= ~NLP_LOGO_ACC; - return 1; + if ((elsiocb = + lpfc_prep_els_iocb(phba, 0, cmdsize, oldiocb->retry, + ndlp, ELS_CMD_ACC)) == 0) { + return (1); } icmd = &elsiocb->iocb; icmd->ulpContext = oldcmd->ulpContext; /* Xri */ @@ -1954,11 +1852,11 @@ lpfc_els_rsp_acc(struct lpfc_hba * phba, uint32_t flag, break; case ELS_CMD_PLOGI: cmdsize = (sizeof (struct serv_parm) + sizeof (uint32_t)); - elsiocb = lpfc_prep_els_iocb(phba, 0, cmdsize, oldiocb->retry, - ndlp, ndlp->nlp_DID, ELS_CMD_ACC); - if (!elsiocb) - return 1; - + if ((elsiocb = + lpfc_prep_els_iocb(phba, 0, cmdsize, oldiocb->retry, + ndlp, ELS_CMD_ACC)) == 0) { + return (1); + } icmd = &elsiocb->iocb; icmd->ulpContext = oldcmd->ulpContext; /* Xri */ pcmd = (((struct lpfc_dmabuf *) elsiocb->context2)->virt); @@ -1970,25 +1868,8 @@ lpfc_els_rsp_acc(struct lpfc_hba * phba, uint32_t flag, pcmd += sizeof (uint32_t); memcpy(pcmd, &phba->fc_sparam, sizeof (struct serv_parm)); break; - case ELS_CMD_PRLO: - cmdsize = sizeof (uint32_t) + sizeof (PRLO); - elsiocb = lpfc_prep_els_iocb(phba, 0, cmdsize, oldiocb->retry, - ndlp, ndlp->nlp_DID, ELS_CMD_PRLO); - if (!elsiocb) - return 1; - - icmd = &elsiocb->iocb; - icmd->ulpContext = oldcmd->ulpContext; /* Xri */ - pcmd = (((struct lpfc_dmabuf *) elsiocb->context2)->virt); - - memcpy(pcmd, ((struct lpfc_dmabuf *) oldiocb->context2)->virt, - sizeof (uint32_t) + sizeof (PRLO)); - *((uint32_t *) (pcmd)) = ELS_CMD_PRLO_ACC; - els_pkt_ptr = (ELS_PKT *) pcmd; - els_pkt_ptr->un.prlo.acceptRspCode = PRLO_REQ_EXECUTED; - break; default: - return 1; + return (1); } if (newnode) @@ -2004,9 +1885,6 @@ lpfc_els_rsp_acc(struct lpfc_hba * phba, uint32_t flag, ndlp->nlp_flag, ndlp->nlp_state, ndlp->nlp_rpi); if (ndlp->nlp_flag & NLP_LOGO_ACC) { - spin_lock_irq(phba->host->host_lock); - ndlp->nlp_flag &= ~NLP_LOGO_ACC; - spin_unlock_irq(phba->host->host_lock); elsiocb->iocb_cmpl = lpfc_cmpl_els_logo_acc; } else { elsiocb->iocb_cmpl = lpfc_cmpl_els_acc; @@ -2018,9 +1896,9 @@ lpfc_els_rsp_acc(struct lpfc_hba * phba, uint32_t flag, spin_unlock_irq(phba->host->host_lock); if (rc == IOCB_ERROR) { lpfc_els_free_iocb(phba, elsiocb); - return 1; + return (1); } - return 0; + return (0); } int @@ -2040,10 +1918,10 @@ lpfc_els_rsp_reject(struct lpfc_hba * phba, uint32_t rejectError, pring = &psli->ring[LPFC_ELS_RING]; /* ELS ring */ cmdsize = 2 * sizeof (uint32_t); - elsiocb = lpfc_prep_els_iocb(phba, 0, cmdsize, oldiocb->retry, - ndlp, ndlp->nlp_DID, ELS_CMD_LS_RJT); - if (!elsiocb) - return 1; + if ((elsiocb = lpfc_prep_els_iocb(phba, 0, cmdsize, oldiocb->retry, + ndlp, ELS_CMD_LS_RJT)) == 0) { + return (1); + } icmd = &elsiocb->iocb; oldcmd = &oldiocb->iocb; @@ -2070,9 +1948,9 @@ lpfc_els_rsp_reject(struct lpfc_hba * phba, uint32_t rejectError, spin_unlock_irq(phba->host->host_lock); if (rc == IOCB_ERROR) { lpfc_els_free_iocb(phba, elsiocb); - return 1; + return (1); } - return 0; + return (0); } int @@ -2093,10 +1971,10 @@ lpfc_els_rsp_adisc_acc(struct lpfc_hba * phba, pring = &psli->ring[LPFC_ELS_RING]; /* ELS ring */ cmdsize = sizeof (uint32_t) + sizeof (ADISC); - elsiocb = lpfc_prep_els_iocb(phba, 0, cmdsize, oldiocb->retry, - ndlp, ndlp->nlp_DID, ELS_CMD_ACC); - if (!elsiocb) - return 1; + if ((elsiocb = lpfc_prep_els_iocb(phba, 0, cmdsize, oldiocb->retry, + ndlp, ELS_CMD_ACC)) == 0) { + return (1); + } /* Xmit ADISC ACC response tag */ lpfc_printf_log(phba, KERN_INFO, LOG_ELS, @@ -2128,9 +2006,9 @@ lpfc_els_rsp_adisc_acc(struct lpfc_hba * phba, spin_unlock_irq(phba->host->host_lock); if (rc == IOCB_ERROR) { lpfc_els_free_iocb(phba, elsiocb); - return 1; + return (1); } - return 0; + return (0); } int @@ -2152,10 +2030,13 @@ lpfc_els_rsp_prli_acc(struct lpfc_hba * phba, pring = &psli->ring[LPFC_ELS_RING]; /* ELS ring */ cmdsize = sizeof (uint32_t) + sizeof (PRLI); - elsiocb = lpfc_prep_els_iocb(phba, 0, cmdsize, oldiocb->retry, ndlp, - ndlp->nlp_DID, (ELS_CMD_ACC | (ELS_CMD_PRLI & ~ELS_RSP_MASK))); - if (!elsiocb) - return 1; + if ((elsiocb = lpfc_prep_els_iocb(phba, 0, cmdsize, oldiocb->retry, + ndlp, + (ELS_CMD_ACC | + (ELS_CMD_PRLI & ~ELS_RSP_MASK)))) == + 0) { + return (1); + } /* Xmit PRLI ACC response tag */ lpfc_printf_log(phba, KERN_INFO, LOG_ELS, @@ -2205,9 +2086,9 @@ lpfc_els_rsp_prli_acc(struct lpfc_hba * phba, spin_unlock_irq(phba->host->host_lock); if (rc == IOCB_ERROR) { lpfc_els_free_iocb(phba, elsiocb); - return 1; + return (1); } - return 0; + return (0); } static int @@ -2233,10 +2114,10 @@ lpfc_els_rsp_rnid_acc(struct lpfc_hba * phba, if (format) cmdsize += sizeof (RNID_TOP_DISC); - elsiocb = lpfc_prep_els_iocb(phba, 0, cmdsize, oldiocb->retry, - ndlp, ndlp->nlp_DID, ELS_CMD_ACC); - if (!elsiocb) - return 1; + if ((elsiocb = lpfc_prep_els_iocb(phba, 0, cmdsize, oldiocb->retry, + ndlp, ELS_CMD_ACC)) == 0) { + return (1); + } /* Xmit RNID ACC response tag */ lpfc_printf_log(phba, KERN_INFO, LOG_ELS, @@ -2288,9 +2169,9 @@ lpfc_els_rsp_rnid_acc(struct lpfc_hba * phba, spin_unlock_irq(phba->host->host_lock); if (rc == IOCB_ERROR) { lpfc_els_free_iocb(phba, elsiocb); - return 1; + return (1); } - return 0; + return (0); } int @@ -2306,7 +2187,6 @@ lpfc_els_disc_adisc(struct lpfc_hba * phba) if (ndlp->nlp_flag & NLP_NPR_2B_DISC) { if (ndlp->nlp_flag & NLP_NPR_ADISC) { ndlp->nlp_flag &= ~NLP_NPR_ADISC; - ndlp->nlp_prev_state = ndlp->nlp_state; ndlp->nlp_state = NLP_STE_ADISC_ISSUE; lpfc_nlp_list(phba, ndlp, NLP_ADISC_LIST); @@ -2328,7 +2208,7 @@ lpfc_els_disc_adisc(struct lpfc_hba * phba) phba->fc_flag &= ~FC_NLP_MORE; spin_unlock_irq(phba->host->host_lock); } - return sentadisc; + return(sentadisc); } int @@ -2344,10 +2224,9 @@ lpfc_els_disc_plogi(struct lpfc_hba * phba) if ((ndlp->nlp_flag & NLP_NPR_2B_DISC) && (!(ndlp->nlp_flag & NLP_DELAY_TMO))) { if (!(ndlp->nlp_flag & NLP_NPR_ADISC)) { - ndlp->nlp_prev_state = ndlp->nlp_state; ndlp->nlp_state = NLP_STE_PLOGI_ISSUE; lpfc_nlp_list(phba, ndlp, NLP_PLOGI_LIST); - lpfc_issue_els_plogi(phba, ndlp->nlp_DID, 0); + lpfc_issue_els_plogi(phba, ndlp, 0); sentplogi++; phba->num_disc_nodes++; if (phba->num_disc_nodes >= @@ -2365,7 +2244,7 @@ lpfc_els_disc_plogi(struct lpfc_hba * phba) phba->fc_flag &= ~FC_NLP_MORE; spin_unlock_irq(phba->host->host_lock); } - return sentplogi; + return(sentplogi); } int @@ -2385,7 +2264,7 @@ lpfc_els_flush_rscn(struct lpfc_hba * phba) phba->fc_flag &= ~(FC_RSCN_MODE | FC_RSCN_DISCOVERY); spin_unlock_irq(phba->host->host_lock); lpfc_can_disctmo(phba); - return 0; + return (0); } int @@ -2406,7 +2285,7 @@ lpfc_rscn_payload_check(struct lpfc_hba * phba, uint32_t did) /* If we are doing a FULL RSCN rediscovery, match everything */ if (phba->fc_flag & FC_RSCN_DISCOVERY) { - return did; + return (did); } for (i = 0; i < phba->fc_rscn_id_cnt; i++) { @@ -2454,7 +2333,7 @@ lpfc_rscn_payload_check(struct lpfc_hba * phba, uint32_t did) } } } - return match; + return (match); } static int @@ -2486,15 +2365,17 @@ lpfc_rscn_recovery_check(struct lpfc_hba * phba) lpfc_disc_state_machine(phba, ndlp, NULL, NLP_EVT_DEVICE_RECOVERY); - - /* Make sure NLP_DELAY_TMO is NOT running - * after a device recovery event. - */ - if (ndlp->nlp_flag & NLP_DELAY_TMO) - lpfc_cancel_retry_delay_tmo(phba, ndlp); + if (ndlp->nlp_flag & NLP_DELAY_TMO) { + ndlp->nlp_flag &= ~NLP_DELAY_TMO; + del_timer_sync(&ndlp->nlp_delayfunc); + if (!list_empty(&ndlp-> + els_retry_evt.evt_listp)) + list_del_init(&ndlp-> + els_retry_evt.evt_listp); + } } } - return 0; + return (0); } static int @@ -2527,10 +2408,10 @@ lpfc_els_rcv_rscn(struct lpfc_hba * phba, /* If we are about to begin discovery, just ACC the RSCN. * Discovery processing will satisfy it. */ - if (phba->hba_state <= LPFC_NS_QRY) { + if (phba->hba_state < LPFC_NS_QRY) { lpfc_els_rsp_acc(phba, ELS_CMD_ACC, cmdiocb, ndlp, NULL, newnode); - return 0; + return (0); } /* If we are already processing an RSCN, save the received @@ -2572,7 +2453,7 @@ lpfc_els_rcv_rscn(struct lpfc_hba * phba, /* send RECOVERY event for ALL nodes that match RSCN payload */ lpfc_rscn_recovery_check(phba); - return 0; + return (0); } phba->fc_flag |= FC_RSCN_MODE; @@ -2591,7 +2472,7 @@ lpfc_els_rcv_rscn(struct lpfc_hba * phba, /* send RECOVERY event for ALL nodes that match RSCN payload */ lpfc_rscn_recovery_check(phba); - return lpfc_els_handle_rscn(phba); + return (lpfc_els_handle_rscn(phba)); } int @@ -2613,41 +2494,40 @@ lpfc_els_handle_rscn(struct lpfc_hba * phba) /* To process RSCN, first compare RSCN data with NameServer */ phba->fc_ns_retry = 0; - ndlp = lpfc_findnode_did(phba, NLP_SEARCH_UNMAPPED, NameServer_DID); - if (ndlp) { + if ((ndlp = lpfc_findnode_did(phba, NLP_SEARCH_UNMAPPED, + NameServer_DID))) { /* Good ndlp, issue CT Request to NameServer */ if (lpfc_ns_cmd(phba, ndlp, SLI_CTNS_GID_FT) == 0) { /* Wait for NameServer query cmpl before we can continue */ - return 1; + return (1); } } else { /* If login to NameServer does not exist, issue one */ /* Good status, issue PLOGI to NameServer */ - ndlp = lpfc_findnode_did(phba, NLP_SEARCH_ALL, NameServer_DID); - if (ndlp) { + if ((ndlp = + lpfc_findnode_did(phba, NLP_SEARCH_ALL, NameServer_DID))) { /* Wait for NameServer login cmpl before we can continue */ - return 1; + return (1); } - ndlp = mempool_alloc(phba->nlp_mem_pool, GFP_KERNEL); - if (!ndlp) { + if ((ndlp = mempool_alloc(phba->nlp_mem_pool, GFP_KERNEL)) + == 0) { lpfc_els_flush_rscn(phba); - return 0; + return (0); } else { lpfc_nlp_init(phba, ndlp, NameServer_DID); ndlp->nlp_type |= NLP_FABRIC; - ndlp->nlp_prev_state = ndlp->nlp_state; ndlp->nlp_state = NLP_STE_PLOGI_ISSUE; - lpfc_issue_els_plogi(phba, NameServer_DID, 0); + lpfc_issue_els_plogi(phba, ndlp, 0); /* Wait for NameServer login cmpl before we can continue */ - return 1; + return (1); } } lpfc_els_flush_rscn(phba); - return 0; + return (0); } static int @@ -2681,7 +2561,7 @@ lpfc_els_rcv_flogi(struct lpfc_hba * phba, "%d:0113 An FLOGI ELS command x%x was received " "from DID x%x in Loop Mode\n", phba->brd_no, cmd, did); - return 1; + return (1); } did = Fabric_DID; @@ -2697,7 +2577,7 @@ lpfc_els_rcv_flogi(struct lpfc_hba * phba, if (!rc) { if ((mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL)) == 0) { - return 1; + return (1); } lpfc_linkdown(phba); lpfc_init_link(phba, mbox, @@ -2710,8 +2590,9 @@ lpfc_els_rcv_flogi(struct lpfc_hba * phba, if (rc == MBX_NOT_FINISHED) { mempool_free( mbox, phba->mbox_mem_pool); } - return 1; - } else if (rc > 0) { /* greater than */ + return (1); + } + else if (rc > 0) { /* greater than */ spin_lock_irq(phba->host->host_lock); phba->fc_flag |= FC_PT2PT_PLOGI; spin_unlock_irq(phba->host->host_lock); @@ -2725,13 +2606,13 @@ lpfc_els_rcv_flogi(struct lpfc_hba * phba, stat.un.b.lsRjtRsnCodeExp = LSEXP_SPARM_OPTIONS; stat.un.b.vendorUnique = 0; lpfc_els_rsp_reject(phba, stat.un.lsRjtError, cmdiocb, ndlp); - return 1; + return (1); } /* Send back ACC */ lpfc_els_rsp_acc(phba, ELS_CMD_PLOGI, cmdiocb, ndlp, NULL, newnode); - return 0; + return (0); } static int @@ -2769,246 +2650,45 @@ lpfc_els_rcv_rnid(struct lpfc_hba * phba, stat.un.b.vendorUnique = 0; lpfc_els_rsp_reject(phba, stat.un.lsRjtError, cmdiocb, ndlp); } - return 0; + return (0); } static int -lpfc_els_rcv_lirr(struct lpfc_hba * phba, struct lpfc_iocbq * cmdiocb, +lpfc_els_rcv_rrq(struct lpfc_hba * phba, struct lpfc_iocbq * cmdiocb, struct lpfc_nodelist * ndlp) { - struct ls_rjt stat; - - /* For now, unconditionally reject this command */ - stat.un.b.lsRjtRsvd0 = 0; - stat.un.b.lsRjtRsnCode = LSRJT_UNABLE_TPC; - stat.un.b.lsRjtRsnCodeExp = LSEXP_CANT_GIVE_DATA; - stat.un.b.vendorUnique = 0; - lpfc_els_rsp_reject(phba, stat.un.lsRjtError, cmdiocb, ndlp); - return 0; -} - -static void -lpfc_els_rsp_rps_acc(struct lpfc_hba * phba, LPFC_MBOXQ_t * pmb) -{ - struct lpfc_sli *psli; - struct lpfc_sli_ring *pring; - MAILBOX_t *mb; - IOCB_t *icmd; - RPS_RSP *rps_rsp; - uint8_t *pcmd; - struct lpfc_iocbq *elsiocb; - struct lpfc_nodelist *ndlp; - uint16_t xri, status; - uint32_t cmdsize; - - psli = &phba->sli; - pring = &psli->ring[LPFC_ELS_RING]; - mb = &pmb->mb; - - ndlp = (struct lpfc_nodelist *) pmb->context2; - xri = (uint16_t) ((unsigned long)(pmb->context1)); - pmb->context1 = NULL; - pmb->context2 = NULL; - - if (mb->mbxStatus) { - mempool_free( pmb, phba->mbox_mem_pool); - return; - } - - cmdsize = sizeof(RPS_RSP) + sizeof(uint32_t); - mempool_free( pmb, phba->mbox_mem_pool); - elsiocb = lpfc_prep_els_iocb(phba, 0, cmdsize, lpfc_max_els_tries, ndlp, - ndlp->nlp_DID, ELS_CMD_ACC); - if (!elsiocb) - return; - - icmd = &elsiocb->iocb; - icmd->ulpContext = xri; - - pcmd = (uint8_t *) (((struct lpfc_dmabuf *) elsiocb->context2)->virt); - *((uint32_t *) (pcmd)) = ELS_CMD_ACC; - pcmd += sizeof (uint32_t); /* Skip past command */ - rps_rsp = (RPS_RSP *)pcmd; - - if (phba->fc_topology != TOPOLOGY_LOOP) - status = 0x10; - else - status = 0x8; - if (phba->fc_flag & FC_FABRIC) - status |= 0x4; - - rps_rsp->rsvd1 = 0; - rps_rsp->portStatus = be16_to_cpu(status); - rps_rsp->linkFailureCnt = be32_to_cpu(mb->un.varRdLnk.linkFailureCnt); - rps_rsp->lossSyncCnt = be32_to_cpu(mb->un.varRdLnk.lossSyncCnt); - rps_rsp->lossSignalCnt = be32_to_cpu(mb->un.varRdLnk.lossSignalCnt); - rps_rsp->primSeqErrCnt = be32_to_cpu(mb->un.varRdLnk.primSeqErrCnt); - rps_rsp->invalidXmitWord = be32_to_cpu(mb->un.varRdLnk.invalidXmitWord); - rps_rsp->crcCnt = be32_to_cpu(mb->un.varRdLnk.crcCnt); - - /* Xmit ELS RPS ACC response tag */ - lpfc_printf_log(phba, KERN_INFO, LOG_ELS, - "%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, - elsiocb->iocb.ulpContext, ndlp->nlp_DID, - ndlp->nlp_flag, ndlp->nlp_state, ndlp->nlp_rpi); - - elsiocb->iocb_cmpl = lpfc_cmpl_els_acc; - phba->fc_stat.elsXmitACC++; - if (lpfc_sli_issue_iocb(phba, pring, elsiocb, 0) == IOCB_ERROR) { - lpfc_els_free_iocb(phba, elsiocb); - } - return; -} - -static int -lpfc_els_rcv_rps(struct lpfc_hba * phba, struct lpfc_iocbq * cmdiocb, - struct lpfc_nodelist * ndlp) -{ - uint32_t *lp; - uint8_t flag; - LPFC_MBOXQ_t *mbox; struct lpfc_dmabuf *pcmd; - RPS *rps; - struct ls_rjt stat; - - if ((ndlp->nlp_state != NLP_STE_UNMAPPED_NODE) && - (ndlp->nlp_state != NLP_STE_MAPPED_NODE)) { - stat.un.b.lsRjtRsvd0 = 0; - stat.un.b.lsRjtRsnCode = LSRJT_UNABLE_TPC; - stat.un.b.lsRjtRsnCodeExp = LSEXP_CANT_GIVE_DATA; - stat.un.b.vendorUnique = 0; - lpfc_els_rsp_reject(phba, stat.un.lsRjtError, cmdiocb, ndlp); - } - - pcmd = (struct lpfc_dmabuf *) cmdiocb->context2; - lp = (uint32_t *) pcmd->virt; - flag = (be32_to_cpu(*lp++) & 0xf); - rps = (RPS *) lp; - - if ((flag == 0) || - ((flag == 1) && (be32_to_cpu(rps->un.portNum) == 0)) || - ((flag == 2) && (memcmp(&rps->un.portName, &phba->fc_portname, - sizeof (struct lpfc_name)) == 0))) { - if ((mbox = mempool_alloc(phba->mbox_mem_pool, GFP_ATOMIC))) { - lpfc_read_lnk_stat(phba, mbox); - mbox->context1 = - (void *)((unsigned long)cmdiocb->iocb.ulpContext); - mbox->context2 = ndlp; - mbox->mbox_cmpl = lpfc_els_rsp_rps_acc; - if (lpfc_sli_issue_mbox (phba, mbox, - (MBX_NOWAIT | MBX_STOP_IOCB)) != MBX_NOT_FINISHED) { - /* Mbox completion will send ELS Response */ - return 0; - } - mempool_free(mbox, phba->mbox_mem_pool); - } - } - stat.un.b.lsRjtRsvd0 = 0; - stat.un.b.lsRjtRsnCode = LSRJT_UNABLE_TPC; - stat.un.b.lsRjtRsnCodeExp = LSEXP_CANT_GIVE_DATA; - stat.un.b.vendorUnique = 0; - lpfc_els_rsp_reject(phba, stat.un.lsRjtError, cmdiocb, ndlp); - return 0; -} - -static int -lpfc_els_rsp_rpl_acc(struct lpfc_hba * phba, uint16_t cmdsize, - struct lpfc_iocbq * oldiocb, struct lpfc_nodelist * ndlp) -{ + uint32_t *lp; IOCB_t *icmd; - IOCB_t *oldcmd; - RPL_RSP rpl_rsp; - struct lpfc_iocbq *elsiocb; struct lpfc_sli_ring *pring; struct lpfc_sli *psli; - uint8_t *pcmd; + RRQ *rrq; + uint32_t cmd, did; psli = &phba->sli; - pring = &psli->ring[LPFC_ELS_RING]; /* ELS ring */ - - elsiocb = lpfc_prep_els_iocb(phba, 0, cmdsize, oldiocb->retry, - ndlp, ndlp->nlp_DID, ELS_CMD_ACC); - if (!elsiocb) - return 1; - - icmd = &elsiocb->iocb; - oldcmd = &oldiocb->iocb; - icmd->ulpContext = oldcmd->ulpContext; /* Xri */ - - pcmd = (((struct lpfc_dmabuf *) elsiocb->context2)->virt); - *((uint32_t *) (pcmd)) = ELS_CMD_ACC; - pcmd += sizeof (uint16_t); - *((uint16_t *)(pcmd)) = be16_to_cpu(cmdsize); - pcmd += sizeof(uint16_t); - - /* Setup the RPL ACC payload */ - rpl_rsp.listLen = be32_to_cpu(1); - rpl_rsp.index = 0; - rpl_rsp.port_num_blk.portNum = 0; - rpl_rsp.port_num_blk.portID = be32_to_cpu(phba->fc_myDID); - memcpy(&rpl_rsp.port_num_blk.portName, &phba->fc_portname, - sizeof(struct lpfc_name)); - - memcpy(pcmd, &rpl_rsp, cmdsize - sizeof(uint32_t)); - - - /* Xmit ELS RPL ACC response tag */ - lpfc_printf_log(phba, KERN_INFO, LOG_ELS, - "%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, - elsiocb->iocb.ulpContext, ndlp->nlp_DID, - ndlp->nlp_flag, ndlp->nlp_state, ndlp->nlp_rpi); - - elsiocb->iocb_cmpl = lpfc_cmpl_els_acc; - - phba->fc_stat.elsXmitACC++; - if (lpfc_sli_issue_iocb(phba, pring, elsiocb, 0) == IOCB_ERROR) { - lpfc_els_free_iocb(phba, elsiocb); - return 1; - } - return 0; -} - -static int -lpfc_els_rcv_rpl(struct lpfc_hba * phba, struct lpfc_iocbq * cmdiocb, - struct lpfc_nodelist * ndlp) -{ - struct lpfc_dmabuf *pcmd; - uint32_t *lp; - uint32_t maxsize; - uint16_t cmdsize; - RPL *rpl; - struct ls_rjt stat; - - if ((ndlp->nlp_state != NLP_STE_UNMAPPED_NODE) && - (ndlp->nlp_state != NLP_STE_MAPPED_NODE)) { - stat.un.b.lsRjtRsvd0 = 0; - stat.un.b.lsRjtRsnCode = LSRJT_UNABLE_TPC; - stat.un.b.lsRjtRsnCodeExp = LSEXP_CANT_GIVE_DATA; - stat.un.b.vendorUnique = 0; - lpfc_els_rsp_reject(phba, stat.un.lsRjtError, cmdiocb, ndlp); - } - + pring = &psli->ring[LPFC_FCP_RING]; + icmd = &cmdiocb->iocb; + did = icmd->un.elsreq64.remoteID; pcmd = (struct lpfc_dmabuf *) cmdiocb->context2; lp = (uint32_t *) pcmd->virt; - rpl = (RPL *) (lp + 1); - maxsize = be32_to_cpu(rpl->maxsize); + cmd = *lp++; + rrq = (RRQ *) lp; - /* We support only one port */ - if ((rpl->index == 0) && - ((maxsize == 0) || - ((maxsize * sizeof(uint32_t)) >= sizeof(RPL_RSP)))) { - cmdsize = sizeof(uint32_t) + sizeof(RPL_RSP); + /* RRQ received */ + /* Get oxid / rxid from payload and abort it */ + spin_lock_irq(phba->host->host_lock); + if ((rrq->SID == be32_to_cpu(phba->fc_myDID))) { + lpfc_sli_abort_iocb(phba, pring, 0, 0, rrq->Oxid, + LPFC_CTX_CTX); } else { - cmdsize = sizeof(uint32_t) + maxsize * sizeof(uint32_t); + lpfc_sli_abort_iocb(phba, pring, 0, 0, rrq->Rxid, + LPFC_CTX_CTX); } - lpfc_els_rsp_rpl_acc(phba, cmdsize, cmdiocb, ndlp); + + spin_unlock_irq(phba->host->host_lock); + /* ACCEPT the rrq request */ + lpfc_els_rsp_acc(phba, ELS_CMD_ACC, cmdiocb, ndlp, NULL, 0); return 0; } @@ -3040,7 +2720,7 @@ lpfc_els_rcv_farp(struct lpfc_hba * phba, /* We will only support match on WWPN or WWNN */ if (fp->Mflags & ~(FARP_MATCH_NODE | FARP_MATCH_PORT)) { - return 0; + return (0); } cnt = 0; @@ -3063,10 +2743,9 @@ lpfc_els_rcv_farp(struct lpfc_hba * phba, (ndlp->nlp_state == NLP_STE_MAPPED_NODE)) { /* Log back into the node before sending the FARP. */ if (fp->Rflags & FARP_REQUEST_PLOGI) { - ndlp->nlp_prev_state = ndlp->nlp_state; ndlp->nlp_state = NLP_STE_PLOGI_ISSUE; lpfc_nlp_list(phba, ndlp, NLP_PLOGI_LIST); - lpfc_issue_els_plogi(phba, ndlp->nlp_DID, 0); + lpfc_issue_els_plogi(phba, ndlp, 0); } /* Send a FARP response to that node */ @@ -3075,7 +2754,7 @@ lpfc_els_rcv_farp(struct lpfc_hba * phba, } } } - return 0; + return (0); } static int @@ -3108,89 +2787,47 @@ lpfc_els_rcv_farpr(struct lpfc_hba * phba, static int lpfc_els_rcv_fan(struct lpfc_hba * phba, struct lpfc_iocbq * cmdiocb, - struct lpfc_nodelist * fan_ndlp) + struct lpfc_nodelist * ndlp) { struct lpfc_dmabuf *pcmd; uint32_t *lp; IOCB_t *icmd; - uint32_t cmd, did; FAN *fp; - struct lpfc_nodelist *ndlp, *next_ndlp; - - /* FAN received */ - lpfc_printf_log(phba, KERN_INFO, LOG_ELS, "%d:0265 FAN received\n", - phba->brd_no); + uint32_t cmd, did; icmd = &cmdiocb->iocb; did = icmd->un.elsreq64.remoteID; - pcmd = (struct lpfc_dmabuf *)cmdiocb->context2; - lp = (uint32_t *)pcmd->virt; + pcmd = (struct lpfc_dmabuf *) cmdiocb->context2; + lp = (uint32_t *) pcmd->virt; cmd = *lp++; - fp = (FAN *)lp; + fp = (FAN *) lp; - /* FAN received; Fan does not have a reply sequence */ - - if (phba->hba_state == LPFC_LOCAL_CFG_LINK) { - if ((memcmp(&phba->fc_fabparam.nodeName, &fp->FnodeName, - sizeof(struct lpfc_name)) != 0) || - (memcmp(&phba->fc_fabparam.portName, &fp->FportName, - sizeof(struct lpfc_name)) != 0)) { - /* - * This node has switched fabrics. FLOGI is required - * Clean up the old rpi's - */ + /* FAN received */ - list_for_each_entry_safe(ndlp, next_ndlp, - &phba->fc_npr_list, nlp_listp) { - - if (ndlp->nlp_type & NLP_FABRIC) { - /* - * Clean up old Fabric, Nameserver and - * other NLP_FABRIC logins - */ - lpfc_nlp_list(phba, ndlp, NLP_NO_LIST); - } else if (!(ndlp->nlp_flag & NLP_NPR_ADISC)) { - /* Fail outstanding I/O now since this - * device is marked for PLOGI - */ - lpfc_unreg_rpi(phba, ndlp); - } - } + /* ACCEPT the FAN request */ + lpfc_els_rsp_acc(phba, ELS_CMD_ACC, cmdiocb, ndlp, NULL, 0); - phba->hba_state = LPFC_FLOGI; - lpfc_set_disctmo(phba); - lpfc_initial_flogi(phba); - return 0; - } - /* Discovery not needed, - * move the nodes to their original state. + if (phba->hba_state == LPFC_LOCAL_CFG_LINK) { + /* The discovery state machine needs to take a different + * action if this node has switched fabrics */ - list_for_each_entry_safe(ndlp, next_ndlp, &phba->fc_npr_list, - nlp_listp) { - - switch (ndlp->nlp_prev_state) { - case NLP_STE_UNMAPPED_NODE: - ndlp->nlp_prev_state = NLP_STE_NPR_NODE; - ndlp->nlp_state = NLP_STE_UNMAPPED_NODE; - lpfc_nlp_list(phba, ndlp, NLP_UNMAPPED_LIST); - break; - - case NLP_STE_MAPPED_NODE: - ndlp->nlp_prev_state = NLP_STE_NPR_NODE; - ndlp->nlp_state = NLP_STE_MAPPED_NODE; - lpfc_nlp_list(phba, ndlp, NLP_MAPPED_LIST); - break; - - default: - break; - } + if ((memcmp(&fp->FportName, &phba->fc_fabparam.portName, + sizeof (struct lpfc_name)) != 0) + || + (memcmp(&fp->FnodeName, &phba->fc_fabparam.nodeName, + sizeof (struct lpfc_name)) != 0)) { + /* This node has switched fabrics. An FLOGI is required + * after the timeout + */ + return (0); } - /* Start discovery - this should just do CLEAR_LA */ + /* Start discovery */ lpfc_disc_start(phba); } - return 0; + + return (0); } void @@ -3267,9 +2904,8 @@ lpfc_els_timeout_handler(struct lpfc_hba *phba) if (cmd->ulpCommand == CMD_GEN_REQUEST64_CR) { struct lpfc_nodelist *ndlp; - spin_unlock_irq(phba->host->host_lock); + ndlp = lpfc_findnode_rpi(phba, cmd->ulpContext); - spin_lock_irq(phba->host->host_lock); remote_ID = ndlp->nlp_DID; if (cmd->un.elsreq64.bdl.ulpIoTag32) { lpfc_sli_issue_abort_iotag32(phba, @@ -3298,9 +2934,10 @@ lpfc_els_timeout_handler(struct lpfc_hba *phba) } else lpfc_sli_release_iocbq(phba, piocb); } - if (phba->sli.ring[LPFC_ELS_RING].txcmplq_cnt) - mod_timer(&phba->els_tmofunc, jiffies + HZ * timeout); - + if (phba->sli.ring[LPFC_ELS_RING].txcmplq_cnt) { + phba->els_tmofunc.expires = jiffies + HZ * timeout; + add_timer(&phba->els_tmofunc); + } spin_unlock_irq(phba->host->host_lock); } @@ -3313,6 +2950,7 @@ lpfc_els_flush_cmd(struct lpfc_hba * phba) struct lpfc_dmabuf *pcmd; uint32_t *elscmd; uint32_t els_command; + uint32_t remote_ID; pring = &phba->sli.ring[LPFC_ELS_RING]; spin_lock_irq(phba->host->host_lock); @@ -3335,6 +2973,18 @@ lpfc_els_flush_cmd(struct lpfc_hba * phba) elscmd = (uint32_t *) (pcmd->virt); els_command = *elscmd; + if (cmd->ulpCommand == CMD_GEN_REQUEST64_CR) { + struct lpfc_nodelist *ndlp; + + ndlp = lpfc_findnode_rpi(phba, cmd->ulpContext); + remote_ID = ndlp->nlp_DID; + if (phba->hba_state == LPFC_HBA_READY) { + continue; + } + } else { + remote_ID = cmd->un.elsreq64.remoteID; + } + list_del(&piocb->list); pring->txcmplq_cnt--; @@ -3345,7 +2995,8 @@ lpfc_els_flush_cmd(struct lpfc_hba * phba) spin_unlock_irq(phba->host->host_lock); (piocb->iocb_cmpl) (phba, piocb, piocb); spin_lock_irq(phba->host->host_lock); - } else + } + else lpfc_sli_release_iocbq(phba, piocb); } @@ -3359,6 +3010,18 @@ lpfc_els_flush_cmd(struct lpfc_hba * phba) elscmd = (uint32_t *) (pcmd->virt); els_command = *elscmd; + if (cmd->ulpCommand == CMD_GEN_REQUEST64_CR) { + struct lpfc_nodelist *ndlp; + + ndlp = lpfc_findnode_rpi(phba, cmd->ulpContext); + remote_ID = ndlp->nlp_DID; + if (phba->hba_state == LPFC_HBA_READY) { + continue; + } + } else { + remote_ID = cmd->un.elsreq64.remoteID; + } + list_del(&piocb->list); pring->txcmplq_cnt--; @@ -3369,7 +3032,8 @@ lpfc_els_flush_cmd(struct lpfc_hba * phba) spin_unlock_irq(phba->host->host_lock); (piocb->iocb_cmpl) (phba, piocb, piocb); spin_lock_irq(phba->host->host_lock); - } else + } + else lpfc_sli_release_iocbq(phba, piocb); } spin_unlock_irq(phba->host->host_lock); @@ -3441,11 +3105,10 @@ lpfc_els_unsol_event(struct lpfc_hba * phba, } did = icmd->un.rcvels.remoteID; - ndlp = lpfc_findnode_did(phba, NLP_SEARCH_ALL, did); - if (!ndlp) { + if ((ndlp = lpfc_findnode_did(phba, NLP_SEARCH_ALL, did)) == 0) { /* Cannot find existing Fabric ndlp, so allocate a new one */ - ndlp = mempool_alloc(phba->nlp_mem_pool, GFP_KERNEL); - if (!ndlp) { + if ((ndlp = mempool_alloc(phba->nlp_mem_pool, GFP_KERNEL)) + == 0) { lpfc_mbuf_free(phba, mp->virt, mp->phys); kfree(mp); drop_cmd = 1; @@ -3457,8 +3120,6 @@ 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++; @@ -3480,14 +3141,13 @@ 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) { - lpfc_nlp_list(phba, ndlp, NLP_NO_LIST); + mempool_free( ndlp, phba->nlp_mem_pool); } break; case ELS_CMD_LOGO: @@ -3510,7 +3170,7 @@ lpfc_els_unsol_event(struct lpfc_hba * phba, phba->fc_stat.elsRcvRSCN++; lpfc_els_rcv_rscn(phba, elsiocb, ndlp, newnode); if (newnode) { - lpfc_nlp_list(phba, ndlp, NLP_NO_LIST); + mempool_free( ndlp, phba->nlp_mem_pool); } break; case ELS_CMD_ADISC: @@ -3541,6 +3201,10 @@ lpfc_els_unsol_event(struct lpfc_hba * phba, phba->fc_stat.elsRcvFAN++; lpfc_els_rcv_fan(phba, elsiocb, ndlp); break; + case ELS_CMD_RRQ: + phba->fc_stat.elsRcvRRQ++; + lpfc_els_rcv_rrq(phba, elsiocb, ndlp); + break; case ELS_CMD_PRLI: phba->fc_stat.elsRcvPRLI++; if (phba->hba_state < LPFC_DISC_AUTH) { @@ -3549,33 +3213,9 @@ lpfc_els_unsol_event(struct lpfc_hba * phba, } lpfc_disc_state_machine(phba, ndlp, elsiocb, NLP_EVT_RCV_PRLI); break; - case ELS_CMD_LIRR: - phba->fc_stat.elsRcvLIRR++; - lpfc_els_rcv_lirr(phba, elsiocb, ndlp); - if (newnode) { - 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) { - 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) { - 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) { - lpfc_nlp_list(phba, ndlp, NLP_NO_LIST); - } break; default: /* Unsupported ELS command, reject */ @@ -3586,7 +3226,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) { - lpfc_nlp_list(phba, ndlp, NLP_NO_LIST); + mempool_free( ndlp, phba->nlp_mem_pool); } break; } @@ -3609,9 +3249,8 @@ dropit: if (drop_cmd == 1) { lpfc_printf_log(phba, KERN_ERR, LOG_ELS, "%d:0111 Dropping received ELS cmd " - "Data: x%x x%x x%x\n", phba->brd_no, - icmd->ulpStatus, icmd->un.ulpWord[4], - icmd->ulpTimeout); + "Data: x%x x%x\n", phba->brd_no, + icmd->ulpStatus, icmd->un.ulpWord[4]); phba->fc_stat.elsRcvDrop++; } return; diff --git a/drivers/scsi/lpfc/lpfc_hbadisc.c b/drivers/scsi/lpfc/lpfc_hbadisc.c index b2f1552f1..a1f751e79 100644 --- a/drivers/scsi/lpfc/lpfc_hbadisc.c +++ b/drivers/scsi/lpfc/lpfc_hbadisc.c @@ -1,7 +1,7 @@ /******************************************************************* * This file is part of the Emulex Linux Device Driver for * * Fibre Channel Host Bus Adapters. * - * Copyright (C) 2004-2006 Emulex. All rights reserved. * + * Copyright (C) 2004-2005 Emulex. All rights reserved. * * EMULEX and SLI are trademarks of Emulex. * * www.emulex.com * * Portions Copyright (C) 2004-2005 Christoph Hellwig * @@ -59,7 +59,6 @@ static void lpfc_disc_timeout_handler(struct lpfc_hba *); static void lpfc_process_nodev_timeout(struct lpfc_hba *phba, struct lpfc_nodelist *ndlp) { - uint8_t *name = (uint8_t *)&ndlp->nlp_portname; int warn_on = 0; spin_lock_irq(phba->host->host_lock); @@ -68,15 +67,6 @@ lpfc_process_nodev_timeout(struct lpfc_hba *phba, struct lpfc_nodelist *ndlp) return; } - /* - * If a discovery event readded nodev_timer after timer - * firing and before processing the timer, cancel the - * nlp_tmofunc. - */ - spin_unlock_irq(phba->host->host_lock); - del_timer_sync(&ndlp->nlp_tmofunc); - spin_lock_irq(phba->host->host_lock); - ndlp->nlp_flag &= ~NLP_NODEV_TMO; if (ndlp->nlp_sid != NLP_NO_SID) { @@ -89,23 +79,15 @@ lpfc_process_nodev_timeout(struct lpfc_hba *phba, struct lpfc_nodelist *ndlp) if (warn_on) { lpfc_printf_log(phba, KERN_ERR, LOG_DISCOVERY, - "%d:0203 Nodev timeout on " - "WWPN %x:%x:%x:%x:%x:%x:%x:%x " - "NPort x%x Data: x%x x%x x%x\n", - phba->brd_no, - *name, *(name+1), *(name+2), *(name+3), - *(name+4), *(name+5), *(name+6), *(name+7), - ndlp->nlp_DID, ndlp->nlp_flag, + "%d:0203 Nodev timeout 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); } else { lpfc_printf_log(phba, KERN_INFO, LOG_DISCOVERY, - "%d:0204 Nodev timeout on " - "WWPN %x:%x:%x:%x:%x:%x:%x:%x " - "NPort x%x Data: x%x x%x x%x\n", - phba->brd_no, - *name, *(name+1), *(name+2), *(name+3), - *(name+4), *(name+5), *(name+6), *(name+7), - ndlp->nlp_DID, ndlp->nlp_flag, + "%d:0204 Nodev timeout 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); } @@ -126,7 +108,7 @@ lpfc_work_list_done(struct lpfc_hba * phba) evt_listp); spin_unlock_irq(phba->host->host_lock); free_evt = 1; - switch (evtp->evt) { + switch(evtp->evt) { case LPFC_EVT_NODEV_TMO: ndlp = (struct lpfc_nodelist *)(evtp->evt_arg1); lpfc_process_nodev_timeout(phba, ndlp); @@ -138,35 +120,11 @@ lpfc_work_list_done(struct lpfc_hba * phba) free_evt = 0; break; case LPFC_EVT_ONLINE: - if (phba->hba_state < LPFC_LINK_DOWN) - *(int *)(evtp->evt_arg1) = lpfc_online(phba); - else - *(int *)(evtp->evt_arg1) = 0; + *(int *)(evtp->evt_arg1) = lpfc_online(phba); complete((struct completion *)(evtp->evt_arg2)); break; case LPFC_EVT_OFFLINE: - if (phba->hba_state >= LPFC_LINK_DOWN) - lpfc_offline(phba); - lpfc_sli_brdrestart(phba); - *(int *)(evtp->evt_arg1) = - lpfc_sli_brdready(phba,HS_FFRDY | HS_MBRDY); - complete((struct completion *)(evtp->evt_arg2)); - break; - case LPFC_EVT_WARM_START: - if (phba->hba_state >= LPFC_LINK_DOWN) - lpfc_offline(phba); - lpfc_reset_barrier(phba); - lpfc_sli_brdreset(phba); - lpfc_hba_down_post(phba); - *(int *)(evtp->evt_arg1) = - lpfc_sli_brdready(phba, HS_MBRDY); - complete((struct completion *)(evtp->evt_arg2)); - break; - case LPFC_EVT_KILL: - if (phba->hba_state >= LPFC_LINK_DOWN) - lpfc_offline(phba); - *(int *)(evtp->evt_arg1) - = (phba->stopped) ? 0 : lpfc_sli_brdkill(phba); + *(int *)(evtp->evt_arg1) = lpfc_offline(phba); complete((struct completion *)(evtp->evt_arg2)); break; } @@ -193,13 +151,13 @@ lpfc_work_done(struct lpfc_hba * phba) work_hba_events=phba->work_hba_events; spin_unlock_irq(phba->host->host_lock); - if (ha_copy & HA_ERATT) + if(ha_copy & HA_ERATT) lpfc_handle_eratt(phba); - if (ha_copy & HA_MBATT) + if(ha_copy & HA_MBATT) lpfc_sli_handle_mb_event(phba); - if (ha_copy & HA_LATT) + if(ha_copy & HA_LATT) lpfc_handle_latt(phba); if (work_hba_events & WORKER_DISC_TMO) @@ -311,8 +269,8 @@ lpfc_workq_post_event(struct lpfc_hba * phba, void *arg1, void *arg2, evtp->evt_arg2 = arg2; evtp->evt = evt; - spin_lock_irq(phba->host->host_lock); list_add_tail(&evtp->evt_listp, &phba->work_list); + spin_lock_irq(phba->host->host_lock); if (phba->work_wait) wake_up(phba->work_wait); spin_unlock_irq(phba->host->host_lock); @@ -325,20 +283,16 @@ lpfc_linkdown(struct lpfc_hba * phba) { struct lpfc_sli *psli; struct lpfc_nodelist *ndlp, *next_ndlp; - struct list_head *listp, *node_list[7]; + struct list_head *listp; + struct list_head *node_list[7]; LPFC_MBOXQ_t *mb; int rc, i; psli = &phba->sli; - /* sysfs or selective reset may call this routine to clean up */ - if (phba->hba_state >= LPFC_LINK_DOWN) { - if (phba->hba_state == LPFC_LINK_DOWN) - return 0; - spin_lock_irq(phba->host->host_lock); - phba->hba_state = LPFC_LINK_DOWN; - spin_unlock_irq(phba->host->host_lock); - } + spin_lock_irq(phba->host->host_lock); + phba->hba_state = LPFC_LINK_DOWN; + spin_unlock_irq(phba->host->host_lock); /* Clean up any firmware default rpi's */ if ((mb = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL))) { @@ -370,19 +324,32 @@ lpfc_linkdown(struct lpfc_hba * phba) continue; list_for_each_entry_safe(ndlp, next_ndlp, listp, nlp_listp) { - - rc = lpfc_disc_state_machine(phba, ndlp, NULL, - NLP_EVT_DEVICE_RECOVERY); - - /* Check config parameter use-adisc or FCP-2 */ - if ((rc != NLP_STE_FREED_NODE) && - (phba->cfg_use_adisc == 0) && - !(ndlp->nlp_fcp_info & NLP_FCP_2_DEVICE)) { - /* We know we will have to relogin, so - * unreglogin the rpi right now to fail - * any outstanding I/Os quickly. - */ - lpfc_unreg_rpi(phba, ndlp); + /* Fabric nodes are not handled thru state machine for + link down */ + if (ndlp->nlp_type & NLP_FABRIC) { + /* Remove ALL Fabric nodes except Fabric_DID */ + if (ndlp->nlp_DID != Fabric_DID) { + /* Take it off current list and free */ + lpfc_nlp_list(phba, ndlp, + NLP_NO_LIST); + } + } + else { + + rc = lpfc_disc_state_machine(phba, ndlp, NULL, + NLP_EVT_DEVICE_RECOVERY); + + /* Check config parameter use-adisc or FCP-2 */ + if ((rc != NLP_STE_FREED_NODE) && + (phba->cfg_use_adisc == 0) && + !(ndlp->nlp_fcp_info & + NLP_FCP_2_DEVICE)) { + /* We know we will have to relogin, so + * unreglogin the rpi right now to fail + * any outstanding I/Os quickly. + */ + lpfc_unreg_rpi(phba, ndlp); + } } } } @@ -417,15 +384,13 @@ lpfc_linkdown(struct lpfc_hba * phba) lpfc_can_disctmo(phba); /* Must process IOCBs on all rings to handle ABORTed I/Os */ - return 0; + return (0); } static int lpfc_linkup(struct lpfc_hba * phba) { struct lpfc_nodelist *ndlp, *next_ndlp; - struct list_head *listp, *node_list[7]; - int i; spin_lock_irq(phba->host->host_lock); phba->hba_state = LPFC_LINK_UP; @@ -436,33 +401,14 @@ lpfc_linkup(struct lpfc_hba * phba) spin_unlock_irq(phba->host->host_lock); - node_list[0] = &phba->fc_plogi_list; - node_list[1] = &phba->fc_adisc_list; - node_list[2] = &phba->fc_reglogin_list; - node_list[3] = &phba->fc_prli_list; - node_list[4] = &phba->fc_nlpunmap_list; - node_list[5] = &phba->fc_nlpmap_list; - node_list[6] = &phba->fc_npr_list; - for (i = 0; i < 7; i++) { - listp = node_list[i]; - if (list_empty(listp)) - continue; - - list_for_each_entry_safe(ndlp, next_ndlp, listp, nlp_listp) { - if (phba->fc_flag & FC_LBIT) { - if (ndlp->nlp_type & NLP_FABRIC) { - /* On Linkup its safe to clean up the - * ndlp from Fabric connections. - */ - lpfc_nlp_list(phba, ndlp, - NLP_UNUSED_LIST); - } else if (!(ndlp->nlp_flag & NLP_NPR_ADISC)) { - /* Fail outstanding IO now since device - * is marked for PLOGI. - */ - lpfc_unreg_rpi(phba, ndlp); - } - } + /* + * Clean up old Fabric NLP_FABRIC logins. + */ + list_for_each_entry_safe(ndlp, next_ndlp, &phba->fc_nlpunmap_list, + nlp_listp) { + if (ndlp->nlp_DID == Fabric_DID) { + /* Take it off current list and free */ + lpfc_nlp_list(phba, ndlp, NLP_NO_LIST); } } @@ -516,7 +462,7 @@ lpfc_mbx_cmpl_clear_la(struct lpfc_hba * phba, LPFC_MBOXQ_t * pmb) lpfc_els_disc_plogi(phba); } - if (!phba->num_disc_nodes) { + if(!phba->num_disc_nodes) { spin_lock_irq(phba->host->host_lock); phba->fc_flag &= ~FC_NDISC_ACTIVE; spin_unlock_irq(phba->host->host_lock); @@ -558,59 +504,80 @@ out: } static void -lpfc_mbx_cmpl_local_config_link(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb) +lpfc_mbx_cmpl_config_link(struct lpfc_hba * phba, LPFC_MBOXQ_t * pmb) { - struct lpfc_sli *psli = &phba->sli; - int rc; + struct lpfc_sli *psli; + MAILBOX_t *mb; - if (pmb->mb.mbxStatus) - goto out; + psli = &phba->sli; + mb = &pmb->mb; + /* Check for error */ + if (mb->mbxStatus) { + /* CONFIG_LINK mbox error state */ + lpfc_printf_log(phba, KERN_ERR, LOG_MBOX, + "%d:0306 CONFIG_LINK mbxStatus error x%x " + "HBA state x%x\n", + phba->brd_no, mb->mbxStatus, phba->hba_state); - mempool_free(pmb, phba->mbox_mem_pool); + lpfc_linkdown(phba); + phba->hba_state = LPFC_HBA_ERROR; + goto out; + } - if (phba->fc_topology == TOPOLOGY_LOOP && - phba->fc_flag & FC_PUBLIC_LOOP && - !(phba->fc_flag & FC_LBIT)) { - /* Need to wait for FAN - use discovery timer - * for timeout. hba_state is identically - * LPFC_LOCAL_CFG_LINK while waiting for FAN - */ - lpfc_set_disctmo(phba); - return; + if (phba->hba_state == LPFC_LOCAL_CFG_LINK) { + if (phba->fc_topology == TOPOLOGY_LOOP) { + /* If we are public loop and L bit was set */ + if ((phba->fc_flag & FC_PUBLIC_LOOP) && + !(phba->fc_flag & FC_LBIT)) { + /* Need to wait for FAN - use discovery timer + * for timeout. hba_state is identically + * LPFC_LOCAL_CFG_LINK while waiting for FAN + */ + lpfc_set_disctmo(phba); + mempool_free( pmb, phba->mbox_mem_pool); + return; + } } - /* Start discovery by sending a FLOGI. hba_state is identically - * LPFC_FLOGI while waiting for FLOGI cmpl - */ - phba->hba_state = LPFC_FLOGI; - lpfc_set_disctmo(phba); - lpfc_initial_flogi(phba); - return; + /* Start discovery by sending a FLOGI hba_state is identically + * LPFC_FLOGI while waiting for FLOGI cmpl + */ + phba->hba_state = LPFC_FLOGI; + lpfc_set_disctmo(phba); + lpfc_initial_flogi(phba); + mempool_free( pmb, phba->mbox_mem_pool); + return; + } + if (phba->hba_state == LPFC_FABRIC_CFG_LINK) { + mempool_free( pmb, phba->mbox_mem_pool); + return; + } out: - lpfc_printf_log(phba, KERN_ERR, LOG_MBOX, - "%d:0306 CONFIG_LINK mbxStatus error x%x " - "HBA state x%x\n", - phba->brd_no, pmb->mb.mbxStatus, phba->hba_state); - - lpfc_linkdown(phba); - - phba->hba_state = LPFC_HBA_ERROR; - - lpfc_printf_log(phba, KERN_ERR, LOG_DISCOVERY, + /* CONFIG_LINK bad hba state */ + lpfc_printf_log(phba, + KERN_ERR, + LOG_DISCOVERY, "%d:0200 CONFIG_LINK bad hba state x%x\n", phba->brd_no, phba->hba_state); - lpfc_clear_la(phba, pmb); - pmb->mbox_cmpl = lpfc_mbx_cmpl_clear_la; - rc = lpfc_sli_issue_mbox(phba, pmb, (MBX_NOWAIT | MBX_STOP_IOCB)); - if (rc == MBX_NOT_FINISHED) { - mempool_free(pmb, phba->mbox_mem_pool); - lpfc_disc_flush_list(phba); - psli->ring[(psli->ip_ring)].flag &= ~LPFC_STOP_IOCB_EVENT; - psli->ring[(psli->fcp_ring)].flag &= ~LPFC_STOP_IOCB_EVENT; - psli->ring[(psli->next_ring)].flag &= ~LPFC_STOP_IOCB_EVENT; - phba->hba_state = LPFC_HBA_READY; + if (phba->hba_state != LPFC_CLEAR_LA) { + lpfc_clear_la(phba, pmb); + pmb->mbox_cmpl = lpfc_mbx_cmpl_clear_la; + if (lpfc_sli_issue_mbox(phba, pmb, (MBX_NOWAIT | MBX_STOP_IOCB)) + == MBX_NOT_FINISHED) { + mempool_free( pmb, phba->mbox_mem_pool); + lpfc_disc_flush_list(phba); + psli->ring[(psli->ip_ring)].flag &= + ~LPFC_STOP_IOCB_EVENT; + psli->ring[(psli->fcp_ring)].flag &= + ~LPFC_STOP_IOCB_EVENT; + psli->ring[(psli->next_ring)].flag &= + ~LPFC_STOP_IOCB_EVENT; + phba->hba_state = LPFC_HBA_READY; + } + } else { + mempool_free( pmb, phba->mbox_mem_pool); } return; } @@ -683,7 +650,7 @@ lpfc_mbx_process_link_up(struct lpfc_hba *phba, READ_LA_VAR *la) cfglink_mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); spin_lock_irq(phba->host->host_lock); - switch (la->UlnkSpeed) { + switch(la->UlnkSpeed) { case LA_1GHZ_LINK: phba->fc_linkspeed = LA_1GHZ_LINK; break; @@ -764,7 +731,7 @@ lpfc_mbx_process_link_up(struct lpfc_hba *phba, READ_LA_VAR *la) if (cfglink_mbox) { phba->hba_state = LPFC_LOCAL_CFG_LINK; lpfc_config_link(phba, cfglink_mbox); - cfglink_mbox->mbox_cmpl = lpfc_mbx_cmpl_local_config_link; + cfglink_mbox->mbox_cmpl = lpfc_mbx_cmpl_config_link; lpfc_sli_issue_mbox(phba, cfglink_mbox, (MBX_NOWAIT | MBX_STOP_IOCB)); } @@ -817,13 +784,6 @@ lpfc_mbx_cmpl_read_la(struct lpfc_hba * phba, LPFC_MBOXQ_t * pmb) memcpy(&phba->alpa_map[0], mp->virt, 128); - spin_lock_irq(phba->host->host_lock); - if (la->pb) - phba->fc_flag |= FC_BYPASSED_MODE; - else - phba->fc_flag &= ~FC_BYPASSED_MODE; - spin_unlock_irq(phba->host->host_lock); - if (((phba->fc_eventTag + 1) < la->eventTag) || (phba->fc_eventTag == la->eventTag)) { phba->fc_stat.LinkMultiEvent++; @@ -944,36 +904,32 @@ lpfc_mbx_cmpl_fabric_reg_login(struct lpfc_hba * phba, LPFC_MBOXQ_t * pmb) */ lpfc_issue_els_scr(phba, SCR_DID, 0); - ndlp = lpfc_findnode_did(phba, NLP_SEARCH_ALL, NameServer_DID); - if (!ndlp) { - /* Allocate a new node instance. If the pool is empty, - * start the discovery process and skip the Nameserver - * login process. This is attempted again later on. - * Otherwise, issue a Port Login (PLOGI) to NameServer. - */ - ndlp = mempool_alloc(phba->nlp_mem_pool, GFP_ATOMIC); - if (!ndlp) { - lpfc_disc_start(phba); - lpfc_mbuf_free(phba, mp->virt, mp->phys); - kfree(mp); - mempool_free( pmb, phba->mbox_mem_pool); - return; - } else { - lpfc_nlp_init(phba, ndlp, NameServer_DID); - ndlp->nlp_type |= NLP_FABRIC; - } - } - ndlp->nlp_state = NLP_STE_PLOGI_ISSUE; - lpfc_nlp_list(phba, ndlp, NLP_PLOGI_LIST); - lpfc_issue_els_plogi(phba, NameServer_DID, 0); - if (phba->cfg_fdmi_on) { - ndlp_fdmi = mempool_alloc(phba->nlp_mem_pool, - GFP_KERNEL); - if (ndlp_fdmi) { - lpfc_nlp_init(phba, ndlp_fdmi, FDMI_DID); - ndlp_fdmi->nlp_type |= NLP_FABRIC; - ndlp_fdmi->nlp_state = NLP_STE_PLOGI_ISSUE; - lpfc_issue_els_plogi(phba, FDMI_DID, 0); + /* Allocate a new node instance. If the pool is empty, just + * start the discovery process and skip the Nameserver login + * process. This is attempted again later on. Otherwise, issue + * a Port Login (PLOGI) to the NameServer + */ + if ((ndlp = mempool_alloc(phba->nlp_mem_pool, GFP_KERNEL)) + == 0) { + lpfc_disc_start(phba); + } else { + lpfc_nlp_init(phba, ndlp, NameServer_DID); + ndlp->nlp_type |= NLP_FABRIC; + ndlp->nlp_state = NLP_STE_PLOGI_ISSUE; + lpfc_nlp_list(phba, ndlp, NLP_PLOGI_LIST); + lpfc_issue_els_plogi(phba, ndlp, 0); + if (phba->cfg_fdmi_on) { + if ((ndlp_fdmi = mempool_alloc( + phba->nlp_mem_pool, + GFP_KERNEL))) { + lpfc_nlp_init(phba, ndlp_fdmi, + FDMI_DID); + ndlp_fdmi->nlp_type |= NLP_FABRIC; + ndlp_fdmi->nlp_state = + NLP_STE_PLOGI_ISSUE; + lpfc_issue_els_plogi(phba, ndlp_fdmi, + 0); + } } } } @@ -981,6 +937,7 @@ lpfc_mbx_cmpl_fabric_reg_login(struct lpfc_hba * phba, LPFC_MBOXQ_t * pmb) lpfc_mbuf_free(phba, mp->virt, mp->phys); kfree(mp); mempool_free( pmb, phba->mbox_mem_pool); + return; } @@ -1071,6 +1028,10 @@ lpfc_register_remote_port(struct lpfc_hba * phba, /* initialize static port data */ rport->maxframe_size = ndlp->nlp_maxframe; rport->supported_classes = ndlp->nlp_class_sup; + if ((rport->scsi_target_id != -1) && + (rport->scsi_target_id < MAX_FCP_TARGET)) { + ndlp->nlp_sid = rport->scsi_target_id; + } rdata = rport->dd_data; rdata->pnode = ndlp; @@ -1083,10 +1044,6 @@ lpfc_register_remote_port(struct lpfc_hba * phba, if (rport_ids.roles != FC_RPORT_ROLE_UNKNOWN) fc_remote_port_rolechg(rport, rport_ids.roles); - if ((rport->scsi_target_id != -1) && - (rport->scsi_target_id < LPFC_MAX_TARGET)) { - ndlp->nlp_sid = rport->scsi_target_id; - } return; } @@ -1113,12 +1070,12 @@ lpfc_nlp_list(struct lpfc_hba * phba, struct lpfc_nodelist * nlp, int list) psli = &phba->sli; /* Sanity check to ensure we are not moving to / from the same list */ - if ((nlp->nlp_flag & NLP_LIST_MASK) == list) + if ((nlp->nlp_flag & NLP_LIST_MASK) == list) { if (list != NLP_NO_LIST) - return 0; + return(0); + } - spin_lock_irq(phba->host->host_lock); - switch (nlp->nlp_flag & NLP_LIST_MASK) { + switch(nlp->nlp_flag & NLP_LIST_MASK) { case NLP_NO_LIST: /* Not on any list */ break; case NLP_UNUSED_LIST: @@ -1144,8 +1101,10 @@ lpfc_nlp_list(struct lpfc_hba * phba, struct lpfc_nodelist * nlp, int list) case NLP_UNMAPPED_LIST: phba->fc_unmap_cnt--; list_del(&nlp->nlp_listp); + spin_lock_irq(phba->host->host_lock); nlp->nlp_flag &= ~NLP_TGT_NO_SCSIID; nlp->nlp_type &= ~NLP_FC_NODE; + spin_unlock_irq(phba->host->host_lock); phba->nport_event_cnt++; if (nlp->rport) rport_del = unmapped; @@ -1163,14 +1122,19 @@ lpfc_nlp_list(struct lpfc_hba * phba, struct lpfc_nodelist * nlp, int list) /* Stop delay tmo if taking node off NPR list */ if ((nlp->nlp_flag & NLP_DELAY_TMO) && (list != NLP_NPR_LIST)) { - spin_unlock_irq(phba->host->host_lock); - lpfc_cancel_retry_delay_tmo(phba, nlp); spin_lock_irq(phba->host->host_lock); + nlp->nlp_flag &= ~NLP_DELAY_TMO; + spin_unlock_irq(phba->host->host_lock); + del_timer_sync(&nlp->nlp_delayfunc); + if (!list_empty(&nlp->els_retry_evt.evt_listp)) + list_del_init(&nlp->els_retry_evt.evt_listp); } break; } + spin_lock_irq(phba->host->host_lock); nlp->nlp_flag &= ~NLP_LIST_MASK; + spin_unlock_irq(phba->host->host_lock); /* Add NPort to list */ lpfc_printf_log(phba, @@ -1180,40 +1144,48 @@ lpfc_nlp_list(struct lpfc_hba * phba, struct lpfc_nodelist * nlp, int list) phba->brd_no, nlp->nlp_DID, list, nlp->nlp_flag); - switch (list) { + switch(list) { case NLP_NO_LIST: /* No list, just remove it */ - spin_unlock_irq(phba->host->host_lock); lpfc_nlp_remove(phba, nlp); - spin_lock_irq(phba->host->host_lock); /* as node removed - stop further transport calls */ rport_del = none; break; case NLP_UNUSED_LIST: + spin_lock_irq(phba->host->host_lock); nlp->nlp_flag |= list; + spin_unlock_irq(phba->host->host_lock); /* Put it at the end of the unused list */ list_add_tail(&nlp->nlp_listp, &phba->fc_unused_list); phba->fc_unused_cnt++; break; case NLP_PLOGI_LIST: + spin_lock_irq(phba->host->host_lock); nlp->nlp_flag |= list; + spin_unlock_irq(phba->host->host_lock); /* Put it at the end of the plogi list */ list_add_tail(&nlp->nlp_listp, &phba->fc_plogi_list); phba->fc_plogi_cnt++; break; case NLP_ADISC_LIST: + spin_lock_irq(phba->host->host_lock); nlp->nlp_flag |= list; + spin_unlock_irq(phba->host->host_lock); /* Put it at the end of the adisc list */ list_add_tail(&nlp->nlp_listp, &phba->fc_adisc_list); phba->fc_adisc_cnt++; break; case NLP_REGLOGIN_LIST: + spin_lock_irq(phba->host->host_lock); nlp->nlp_flag |= list; + spin_unlock_irq(phba->host->host_lock); /* Put it at the end of the reglogin list */ list_add_tail(&nlp->nlp_listp, &phba->fc_reglogin_list); phba->fc_reglogin_cnt++; break; case NLP_PRLI_LIST: + spin_lock_irq(phba->host->host_lock); nlp->nlp_flag |= list; + spin_unlock_irq(phba->host->host_lock); /* Put it at the end of the prli list */ list_add_tail(&nlp->nlp_listp, &phba->fc_prli_list); phba->fc_prli_cnt++; @@ -1222,28 +1194,31 @@ lpfc_nlp_list(struct lpfc_hba * phba, struct lpfc_nodelist * nlp, int list) rport_add = unmapped; /* ensure all vestiges of "mapped" significance are gone */ nlp->nlp_type &= ~(NLP_FCP_TARGET | NLP_FCP_INITIATOR); + spin_lock_irq(phba->host->host_lock); nlp->nlp_flag |= list; + spin_unlock_irq(phba->host->host_lock); /* Put it at the end of the unmap list */ list_add_tail(&nlp->nlp_listp, &phba->fc_nlpunmap_list); phba->fc_unmap_cnt++; phba->nport_event_cnt++; /* stop nodev tmo if running */ if (nlp->nlp_flag & NLP_NODEV_TMO) { + spin_lock_irq(phba->host->host_lock); nlp->nlp_flag &= ~NLP_NODEV_TMO; spin_unlock_irq(phba->host->host_lock); del_timer_sync(&nlp->nlp_tmofunc); - spin_lock_irq(phba->host->host_lock); if (!list_empty(&nlp->nodev_timeout_evt.evt_listp)) list_del_init(&nlp->nodev_timeout_evt. evt_listp); } - nlp->nlp_flag &= ~NLP_NODEV_REMOVE; nlp->nlp_type |= NLP_FC_NODE; break; case NLP_MAPPED_LIST: rport_add = mapped; + spin_lock_irq(phba->host->host_lock); nlp->nlp_flag |= list; + spin_unlock_irq(phba->host->host_lock); /* Put it at the end of the map list */ list_add_tail(&nlp->nlp_listp, &phba->fc_nlpmap_list); phba->fc_map_cnt++; @@ -1251,35 +1226,41 @@ lpfc_nlp_list(struct lpfc_hba * phba, struct lpfc_nodelist * nlp, int list) /* stop nodev tmo if running */ if (nlp->nlp_flag & NLP_NODEV_TMO) { nlp->nlp_flag &= ~NLP_NODEV_TMO; - spin_unlock_irq(phba->host->host_lock); del_timer_sync(&nlp->nlp_tmofunc); - spin_lock_irq(phba->host->host_lock); if (!list_empty(&nlp->nodev_timeout_evt.evt_listp)) list_del_init(&nlp->nodev_timeout_evt. evt_listp); } - nlp->nlp_flag &= ~NLP_NODEV_REMOVE; break; case NLP_NPR_LIST: + spin_lock_irq(phba->host->host_lock); nlp->nlp_flag |= list; + spin_unlock_irq(phba->host->host_lock); /* Put it at the end of the npr list */ list_add_tail(&nlp->nlp_listp, &phba->fc_npr_list); phba->fc_npr_cnt++; - if (!(nlp->nlp_flag & NLP_NODEV_TMO)) + /* + * Sanity check for Fabric entity. + * Set nodev_tmo for NPR state, for Fabric use 1 sec. + */ + if (nlp->nlp_type & NLP_FABRIC) { + mod_timer(&nlp->nlp_tmofunc, jiffies + HZ); + } + else { mod_timer(&nlp->nlp_tmofunc, - jiffies + HZ * phba->cfg_nodev_tmo); - + jiffies + HZ * phba->cfg_nodev_tmo); + } + spin_lock_irq(phba->host->host_lock); nlp->nlp_flag |= NLP_NODEV_TMO; nlp->nlp_flag &= ~NLP_RCV_PLOGI; + spin_unlock_irq(phba->host->host_lock); break; case NLP_JUST_DQ: break; } - spin_unlock_irq(phba->host->host_lock); - /* * We make all the calls into the transport after we have * moved the node between lists. This so that we don't @@ -1313,7 +1294,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 >= LPFC_MAX_TARGET))) { + (nlp->rport->scsi_target_id >= MAX_FCP_TARGET))) { nlp->nlp_state = NLP_STE_UNMAPPED_NODE; spin_lock_irq(phba->host->host_lock); nlp->nlp_flag |= NLP_TGT_NO_SCSIID; @@ -1322,7 +1303,7 @@ lpfc_nlp_list(struct lpfc_hba * phba, struct lpfc_nodelist * nlp, int list) } } } - return 0; + return (0); } /* @@ -1333,15 +1314,7 @@ lpfc_set_disctmo(struct lpfc_hba * phba) { uint32_t tmo; - if (phba->hba_state == LPFC_LOCAL_CFG_LINK) { - /* For FAN, timeout should be greater then edtov */ - tmo = (((phba->fc_edtov + 999) / 1000) + 1); - } else { - /* Normal discovery timeout should be > then ELS/CT timeout - * FC spec states we need 3 * ratov for CT requests - */ - tmo = ((phba->fc_ratov * 3) + 3); - } + tmo = ((phba->fc_ratov * 2) + 1); mod_timer(&phba->fc_disctmo, jiffies + HZ * tmo); spin_lock_irq(phba->host->host_lock); @@ -1381,7 +1354,7 @@ lpfc_can_disctmo(struct lpfc_hba * phba) phba->brd_no, phba->hba_state, phba->fc_flag, phba->fc_plogi_cnt, phba->fc_adisc_cnt); - return 0; + return (0); } /* @@ -1402,13 +1375,11 @@ lpfc_check_sli_ndlp(struct lpfc_hba * phba, switch (icmd->ulpCommand) { case CMD_GEN_REQUEST64_CR: if (icmd->ulpContext == (volatile ushort)ndlp->nlp_rpi) - return 1; + return (1); case CMD_ELS_REQUEST64_CR: - if (icmd->un.elsreq64.remoteID == ndlp->nlp_DID) - return 1; case CMD_XMIT_ELS_RSP64_CX: if (iocb->context1 == (uint8_t *) ndlp) - return 1; + return (1); } } else if (pring->ringno == psli->ip_ring) { @@ -1416,15 +1387,15 @@ lpfc_check_sli_ndlp(struct lpfc_hba * phba, /* Skip match check if waiting to relogin to FCP target */ if ((ndlp->nlp_type & NLP_FCP_TARGET) && (ndlp->nlp_flag & NLP_DELAY_TMO)) { - return 0; + return (0); } if (icmd->ulpContext == (volatile ushort)ndlp->nlp_rpi) { - return 1; + return (1); } } else if (pring->ringno == psli->next_ring) { } - return 0; + return (0); } /* @@ -1485,7 +1456,7 @@ lpfc_no_rpi(struct lpfc_hba * phba, struct lpfc_nodelist * ndlp) } } - return 0; + return (0); } /* @@ -1557,8 +1528,6 @@ 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)) { @@ -1571,7 +1540,6 @@ 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); @@ -1579,7 +1547,6 @@ lpfc_freenode(struct lpfc_hba * phba, struct lpfc_nodelist * ndlp) spin_unlock_irq(phba->host->host_lock); del_timer_sync(&ndlp->nlp_tmofunc); - ndlp->nlp_last_elscmd = 0; del_timer_sync(&ndlp->nlp_delayfunc); if (!list_empty(&ndlp->nodev_timeout_evt.evt_listp)) @@ -1589,7 +1556,7 @@ lpfc_freenode(struct lpfc_hba * phba, struct lpfc_nodelist * ndlp) lpfc_unreg_rpi(phba, ndlp); - return 0; + return (0); } /* @@ -1612,18 +1579,24 @@ lpfc_nlp_remove(struct lpfc_hba * phba, struct lpfc_nodelist * ndlp) if (ndlp->nlp_flag & NLP_DELAY_TMO) { - lpfc_cancel_retry_delay_tmo(phba, ndlp); + spin_lock_irq(phba->host->host_lock); + ndlp->nlp_flag &= ~NLP_DELAY_TMO; + spin_unlock_irq(phba->host->host_lock); + del_timer_sync(&ndlp->nlp_delayfunc); + if (!list_empty(&ndlp->els_retry_evt.evt_listp)) + list_del_init(&ndlp->els_retry_evt.evt_listp); } if (ndlp->nlp_disc_refcnt) { spin_lock_irq(phba->host->host_lock); ndlp->nlp_flag |= NLP_DELAY_REMOVE; spin_unlock_irq(phba->host->host_lock); - } else { + } + else { lpfc_freenode(phba, ndlp); mempool_free( ndlp, phba->nlp_mem_pool); } - return 0; + return(0); } static int @@ -1634,20 +1607,20 @@ lpfc_matchdid(struct lpfc_hba * phba, struct lpfc_nodelist * ndlp, uint32_t did) D_ID matchdid; if (did == Bcast_DID) - return 0; + return (0); if (ndlp->nlp_DID == 0) { - return 0; + return (0); } /* First check for Direct match */ if (ndlp->nlp_DID == did) - return 1; + return (1); /* Next check for area/domain identically equals 0 match */ mydid.un.word = phba->fc_myDID; if ((mydid.un.b.domain == 0) && (mydid.un.b.area == 0)) { - return 0; + return (0); } matchdid.un.word = did; @@ -1658,9 +1631,9 @@ lpfc_matchdid(struct lpfc_hba * phba, struct lpfc_nodelist * ndlp, uint32_t did) if ((ndlpdid.un.b.domain == 0) && (ndlpdid.un.b.area == 0)) { if (ndlpdid.un.b.id) - return 1; + return (1); } - return 0; + return (0); } matchdid.un.word = ndlp->nlp_DID; @@ -1669,11 +1642,11 @@ lpfc_matchdid(struct lpfc_hba * phba, struct lpfc_nodelist * ndlp, uint32_t did) if ((matchdid.un.b.domain == 0) && (matchdid.un.b.area == 0)) { if (matchdid.un.b.id) - return 1; + return (1); } } } - return 0; + return (0); } /* Search for a nodelist entry on a specific list */ @@ -1683,7 +1656,6 @@ lpfc_findnode_did(struct lpfc_hba * phba, uint32_t order, uint32_t did) struct lpfc_nodelist *ndlp, *next_ndlp; uint32_t data1; - spin_lock_irq(phba->host->host_lock); if (order & NLP_SEARCH_UNMAPPED) { list_for_each_entry_safe(ndlp, next_ndlp, &phba->fc_nlpunmap_list, nlp_listp) { @@ -1699,8 +1671,7 @@ lpfc_findnode_did(struct lpfc_hba * phba, uint32_t order, uint32_t did) phba->brd_no, ndlp, ndlp->nlp_DID, ndlp->nlp_flag, data1); - spin_unlock_irq(phba->host->host_lock); - return ndlp; + return (ndlp); } } } @@ -1721,8 +1692,7 @@ lpfc_findnode_did(struct lpfc_hba * phba, uint32_t order, uint32_t did) phba->brd_no, ndlp, ndlp->nlp_DID, ndlp->nlp_flag, data1); - spin_unlock_irq(phba->host->host_lock); - return ndlp; + return (ndlp); } } } @@ -1744,8 +1714,7 @@ lpfc_findnode_did(struct lpfc_hba * phba, uint32_t order, uint32_t did) phba->brd_no, ndlp, ndlp->nlp_DID, ndlp->nlp_flag, data1); - spin_unlock_irq(phba->host->host_lock); - return ndlp; + return (ndlp); } } } @@ -1767,8 +1736,7 @@ lpfc_findnode_did(struct lpfc_hba * phba, uint32_t order, uint32_t did) phba->brd_no, ndlp, ndlp->nlp_DID, ndlp->nlp_flag, data1); - spin_unlock_irq(phba->host->host_lock); - return ndlp; + return (ndlp); } } } @@ -1785,13 +1753,12 @@ 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:0901 FIND node DID reglogin" + "%d:0931 FIND node DID reglogin" " Data: x%p x%x x%x x%x\n", phba->brd_no, ndlp, ndlp->nlp_DID, ndlp->nlp_flag, data1); - spin_unlock_irq(phba->host->host_lock); - return ndlp; + return (ndlp); } } } @@ -1808,13 +1775,12 @@ 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:0902 FIND node DID prli " + "%d:0931 FIND node DID prli " "Data: x%p x%x x%x x%x\n", phba->brd_no, ndlp, ndlp->nlp_DID, ndlp->nlp_flag, data1); - spin_unlock_irq(phba->host->host_lock); - return ndlp; + return (ndlp); } } } @@ -1831,13 +1797,12 @@ 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:0903 FIND node DID npr " + "%d:0931 FIND node DID npr " "Data: x%p x%x x%x x%x\n", phba->brd_no, ndlp, ndlp->nlp_DID, ndlp->nlp_flag, data1); - spin_unlock_irq(phba->host->host_lock); - return ndlp; + return (ndlp); } } } @@ -1854,19 +1819,16 @@ 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:0905 FIND node DID unused " + "%d:0931 FIND node DID unused " "Data: x%p x%x x%x x%x\n", phba->brd_no, ndlp, ndlp->nlp_DID, ndlp->nlp_flag, data1); - spin_unlock_irq(phba->host->host_lock); - return ndlp; + return (ndlp); } } } - spin_unlock_irq(phba->host->host_lock); - /* FIND node did NOT FOUND */ lpfc_printf_log(phba, KERN_INFO, @@ -1884,9 +1846,8 @@ lpfc_setup_disc_node(struct lpfc_hba * phba, uint32_t did) struct lpfc_nodelist *ndlp; uint32_t flg; - ndlp = lpfc_findnode_did(phba, NLP_SEARCH_ALL, did); - if (!ndlp) { - if ((phba->fc_flag & FC_RSCN_MODE) && + if ((ndlp = lpfc_findnode_did(phba, NLP_SEARCH_ALL, did)) == 0) { + if ((phba->hba_state == LPFC_HBA_READY) && ((lpfc_rscn_payload_check(phba, did) == 0))) return NULL; ndlp = (struct lpfc_nodelist *) @@ -1899,21 +1860,22 @@ lpfc_setup_disc_node(struct lpfc_hba * phba, uint32_t did) ndlp->nlp_flag |= NLP_NPR_2B_DISC; return ndlp; } - if (phba->fc_flag & FC_RSCN_MODE) { + if ((phba->hba_state == LPFC_HBA_READY) && + (phba->fc_flag & FC_RSCN_MODE)) { if (lpfc_rscn_payload_check(phba, did)) { ndlp->nlp_flag |= NLP_NPR_2B_DISC; - - /* Since this node is marked for discovery, - * delay timeout is not needed. - */ - if (ndlp->nlp_flag & NLP_DELAY_TMO) - lpfc_cancel_retry_delay_tmo(phba, ndlp); - } else + } + else { + ndlp->nlp_flag &= ~NLP_NPR_2B_DISC; ndlp = NULL; - } else { + } + } + else { flg = ndlp->nlp_flag & NLP_LIST_MASK; - if ((flg == NLP_ADISC_LIST) || (flg == NLP_PLOGI_LIST)) + if ((flg == NLP_ADISC_LIST) || + (flg == NLP_PLOGI_LIST)) { return NULL; + } ndlp->nlp_state = NLP_STE_NPR_NODE; lpfc_nlp_list(phba, ndlp, NLP_NPR_LIST); ndlp->nlp_flag |= NLP_NPR_2B_DISC; @@ -2061,7 +2023,8 @@ lpfc_disc_start(struct lpfc_hba * phba) spin_lock_irq(phba->host->host_lock); phba->fc_flag &= ~FC_RSCN_MODE; spin_unlock_irq(phba->host->host_lock); - } else + } + else lpfc_els_handle_rscn(phba); } } @@ -2211,7 +2174,7 @@ static void lpfc_disc_timeout_handler(struct lpfc_hba *phba) { struct lpfc_sli *psli; - struct lpfc_nodelist *ndlp, *next_ndlp; + struct lpfc_nodelist *ndlp; LPFC_MBOXQ_t *clearlambox, *initlinkmbox; int rc, clrlaerr = 0; @@ -2238,19 +2201,10 @@ lpfc_disc_timeout_handler(struct lpfc_hba *phba) "%d:0221 FAN timeout\n", phba->brd_no); - /* Start discovery by sending FLOGI, clean up old rpis */ - list_for_each_entry_safe(ndlp, next_ndlp, &phba->fc_npr_list, - nlp_listp) { - if (ndlp->nlp_type & NLP_FABRIC) { - /* Clean up the ndlp on Fabric connections */ - lpfc_nlp_list(phba, ndlp, NLP_NO_LIST); - } else if (!(ndlp->nlp_flag & NLP_NPR_ADISC)) { - /* Fail outstanding IO now since device - * is marked for PLOGI. - */ - lpfc_unreg_rpi(phba, ndlp); - } - } + /* Forget about FAN, Start discovery by sending a FLOGI + * hba_state is identically LPFC_FLOGI while waiting for FLOGI + * cmpl + */ phba->hba_state = LPFC_FLOGI; lpfc_set_disctmo(phba); lpfc_initial_flogi(phba); @@ -2338,7 +2292,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:0206 Device Discovery " + "%d:0226 Device Discovery " "completion error\n", phba->brd_no); phba->hba_state = LPFC_HBA_ERROR; @@ -2368,7 +2322,7 @@ lpfc_disc_timeout_handler(struct lpfc_hba *phba) if (!clearlambox) { clrlaerr = 1; lpfc_printf_log(phba, KERN_ERR, LOG_DISCOVERY, - "%d:0207 Device Discovery " + "%d:0226 Device Discovery " "completion error\n", phba->brd_no); phba->hba_state = LPFC_HBA_ERROR; @@ -2516,57 +2470,11 @@ lpfc_findnode_rpi(struct lpfc_hba * phba, uint16_t rpi) &phba->fc_reglogin_list}; int i; - spin_lock_irq(phba->host->host_lock); for (i = 0; i < ARRAY_SIZE(lists); i++ ) list_for_each_entry(ndlp, lists[i], nlp_listp) - if (ndlp->nlp_rpi == rpi) { - spin_unlock_irq(phba->host->host_lock); - return ndlp; - } - spin_unlock_irq(phba->host->host_lock); - return NULL; -} + if (ndlp->nlp_rpi == rpi) + return (ndlp); -/* - * This routine looks up the ndlp lists - * for the given WWPN. If WWPN found - * it return the node list pointer - * else return NULL. - */ -struct lpfc_nodelist * -lpfc_findnode_wwpn(struct lpfc_hba * phba, uint32_t order, - struct lpfc_name * wwpn) -{ - struct lpfc_nodelist *ndlp; - struct list_head * lists[]={&phba->fc_nlpunmap_list, - &phba->fc_nlpmap_list, - &phba->fc_npr_list, - &phba->fc_plogi_list, - &phba->fc_adisc_list, - &phba->fc_reglogin_list, - &phba->fc_prli_list}; - uint32_t search[]={NLP_SEARCH_UNMAPPED, - NLP_SEARCH_MAPPED, - NLP_SEARCH_NPR, - NLP_SEARCH_PLOGI, - NLP_SEARCH_ADISC, - NLP_SEARCH_REGLOGIN, - NLP_SEARCH_PRLI}; - int i; - - spin_lock_irq(phba->host->host_lock); - for (i = 0; i < ARRAY_SIZE(lists); i++ ) { - if (!(order & search[i])) - continue; - list_for_each_entry(ndlp, lists[i], nlp_listp) { - if (memcmp(&ndlp->nlp_portname, wwpn, - sizeof(struct lpfc_name)) == 0) { - spin_unlock_irq(phba->host->host_lock); - return ndlp; - } - } - } - spin_unlock_irq(phba->host->host_lock); return NULL; } diff --git a/drivers/scsi/lpfc/lpfc_hw.h b/drivers/scsi/lpfc/lpfc_hw.h index eedf98801..1ea565e05 100644 --- a/drivers/scsi/lpfc/lpfc_hw.h +++ b/drivers/scsi/lpfc/lpfc_hw.h @@ -1,7 +1,7 @@ /******************************************************************* * This file is part of the Emulex Linux Device Driver for * * Fibre Channel Host Bus Adapters. * - * Copyright (C) 2004-2006 Emulex. All rights reserved. * + * Copyright (C) 2004-2005 Emulex. All rights reserved. * * EMULEX and SLI are trademarks of Emulex. * * www.emulex.com * * * @@ -449,19 +449,15 @@ struct serv_parm { /* Structure is in Big Endian format */ #define ELS_CMD_RRQ 0x12000000 #define ELS_CMD_PRLI 0x20100014 #define ELS_CMD_PRLO 0x21100014 -#define ELS_CMD_PRLO_ACC 0x02100014 #define ELS_CMD_PDISC 0x50000000 #define ELS_CMD_FDISC 0x51000000 #define ELS_CMD_ADISC 0x52000000 #define ELS_CMD_FARP 0x54000000 #define ELS_CMD_FARPR 0x55000000 -#define ELS_CMD_RPS 0x56000000 -#define ELS_CMD_RPL 0x57000000 #define ELS_CMD_FAN 0x60000000 #define ELS_CMD_RSCN 0x61040000 #define ELS_CMD_SCR 0x62000000 #define ELS_CMD_RNID 0x78000000 -#define ELS_CMD_LIRR 0x7A000000 #else /* __LITTLE_ENDIAN_BITFIELD */ #define ELS_CMD_MASK 0xffff #define ELS_RSP_MASK 0xff @@ -485,19 +481,15 @@ struct serv_parm { /* Structure is in Big Endian format */ #define ELS_CMD_RRQ 0x12 #define ELS_CMD_PRLI 0x14001020 #define ELS_CMD_PRLO 0x14001021 -#define ELS_CMD_PRLO_ACC 0x14001002 #define ELS_CMD_PDISC 0x50 #define ELS_CMD_FDISC 0x51 #define ELS_CMD_ADISC 0x52 #define ELS_CMD_FARP 0x54 #define ELS_CMD_FARPR 0x55 -#define ELS_CMD_RPS 0x56 -#define ELS_CMD_RPL 0x57 #define ELS_CMD_FAN 0x60 #define ELS_CMD_RSCN 0x0461 #define ELS_CMD_SCR 0x62 #define ELS_CMD_RNID 0x78 -#define ELS_CMD_LIRR 0x7A #endif /* @@ -766,40 +758,12 @@ typedef struct _RNID { /* Structure is in Big Endian format */ } un; } RNID; -typedef struct _RPS { /* Structure is in Big Endian format */ - union { - uint32_t portNum; - struct lpfc_name portName; - } un; -} RPS; - -typedef struct _RPS_RSP { /* Structure is in Big Endian format */ - uint16_t rsvd1; - uint16_t portStatus; - uint32_t linkFailureCnt; - uint32_t lossSyncCnt; - uint32_t lossSignalCnt; - uint32_t primSeqErrCnt; - uint32_t invalidXmitWord; - uint32_t crcCnt; -} RPS_RSP; - -typedef struct _RPL { /* Structure is in Big Endian format */ - uint32_t maxsize; - uint32_t index; -} RPL; - -typedef struct _PORT_NUM_BLK { - uint32_t portNum; - uint32_t portID; - struct lpfc_name portName; -} PORT_NUM_BLK; - -typedef struct _RPL_RSP { /* Structure is in Big Endian format */ - uint32_t listLen; - uint32_t index; - PORT_NUM_BLK port_num_blk; -} RPL_RSP; +typedef struct _RRQ { /* Structure is in Big Endian format */ + uint32_t SID; + uint16_t Oxid; + uint16_t Rxid; + uint8_t resv[32]; /* optional association hdr */ +} RRQ; /* This is used for RSCN command */ typedef struct _D_ID { /* Structure is in Big Endian format */ @@ -840,6 +804,7 @@ typedef struct _ELS_PKT { /* Structure is in Big Endian format */ FARP farp; /* Payload for FARP/ACC */ FAN fan; /* Payload for FAN */ SCR scr; /* Payload for SCR/ACC */ + RRQ rrq; /* Payload for RRQ */ RNID rnid; /* Payload for RNID */ uint8_t pad[128 - 4]; /* Pad out to payload of 128 bytes */ } un; @@ -1235,9 +1200,7 @@ typedef struct { /* FireFly BIU registers */ #define MBX_SET_MASK 0x20 #define MBX_SET_SLIM 0x21 #define MBX_UNREG_D_ID 0x23 -#define MBX_KILL_BOARD 0x24 #define MBX_CONFIG_FARP 0x25 -#define MBX_BEACON 0x2A #define MBX_LOAD_AREA 0x81 #define MBX_RUN_BIU_DIAG64 0x84 @@ -1541,7 +1504,6 @@ typedef struct { #define FLAGS_TOPOLOGY_FAILOVER 0x0400 /* Bit 10 */ #define FLAGS_LINK_SPEED 0x0800 /* Bit 11 */ -#define FLAGS_IMED_ABORT 0x04000 /* Bit 14 */ uint32_t link_speed; #define LINK_SPEED_AUTO 0 /* Auto selection */ @@ -1714,13 +1676,13 @@ typedef struct { uint32_t rttov; uint32_t altov; uint32_t lmt; -#define LMT_RESERVED 0x000 /* Not used */ -#define LMT_1Gb 0x004 -#define LMT_2Gb 0x008 -#define LMT_4Gb 0x040 -#define LMT_8Gb 0x080 -#define LMT_10Gb 0x100 - +#define LMT_RESERVED 0x0 /* Not used */ +#define LMT_266_10bit 0x1 /* 265.625 Mbaud 10 bit iface */ +#define LMT_532_10bit 0x2 /* 531.25 Mbaud 10 bit iface */ +#define LMT_1063_20bit 0x3 /* 1062.5 Mbaud 20 bit iface */ +#define LMT_1063_10bit 0x4 /* 1062.5 Mbaud 10 bit iface */ +#define LMT_2125_10bit 0x8 /* 2125 Mbaud 10 bit iface */ +#define LMT_4250_10bit 0x40 /* 4250 Mbaud 10 bit iface */ uint32_t rsvd2; uint32_t rsvd3; diff --git a/drivers/scsi/lpfc/lpfc_init.c b/drivers/scsi/lpfc/lpfc_init.c index f6948ffe6..b7a603a45 100644 --- a/drivers/scsi/lpfc/lpfc_init.c +++ b/drivers/scsi/lpfc/lpfc_init.c @@ -1,7 +1,7 @@ /******************************************************************* * This file is part of the Emulex Linux Device Driver for * * Fibre Channel Host Bus Adapters. * - * Copyright (C) 2004-2006 Emulex. All rights reserved. * + * Copyright (C) 2004-2005 Emulex. All rights reserved. * * EMULEX and SLI are trademarks of Emulex. * * www.emulex.com * * Portions Copyright (C) 2004-2005 Christoph Hellwig * @@ -42,7 +42,7 @@ #include "lpfc_crtn.h" #include "lpfc_version.h" -static int lpfc_parse_vpd(struct lpfc_hba *, uint8_t *, int); +static int lpfc_parse_vpd(struct lpfc_hba *, uint8_t *); static void lpfc_get_hba_model_desc(struct lpfc_hba *, uint8_t *, uint8_t *); static int lpfc_post_rcv_buf(struct lpfc_hba *); @@ -71,7 +71,6 @@ 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) { @@ -83,13 +82,10 @@ lpfc_config_port_prep(struct lpfc_hba * phba) phba->hba_state = LPFC_INIT_MBX_CMDS; if (lpfc_is_LC_HBA(phba->pcidev->device)) { - if (init_key) { - uint32_t *ptext = (uint32_t *) licensed; + uint32_t *ptext = (uint32_t *) licensed; - for (i = 0; i < 56; i += sizeof (uint32_t), ptext++) - *ptext = cpu_to_be32(*ptext); - init_key = 0; - } + for (i = 0; i < 56; i += sizeof (uint32_t), ptext++) + *ptext = cpu_to_be32(*ptext); lpfc_read_nv(phba, pmb); memset((char*)mb->un.varRDnvp.rsvd3, 0, @@ -165,6 +161,9 @@ lpfc_config_port_prep(struct lpfc_hba * phba) memcpy(phba->RandomData, (char *)&mb->un.varWords[24], sizeof (phba->RandomData)); + /* Get the default values for Model Name and Description */ + lpfc_get_hba_model_desc(phba, phba->ModelName, phba->ModelDesc); + /* Get adapter VPD information */ pmb->context2 = kmalloc(DMP_RSP_SIZE, GFP_KERNEL); if (!pmb->context2) @@ -183,15 +182,16 @@ lpfc_config_port_prep(struct lpfc_hba * phba) "mbxCmd x%x DUMP VPD, mbxStatus x%x\n", phba->brd_no, mb->mbxCommand, mb->mbxStatus); - mb->un.varDmp.word_cnt = 0; + kfree(lpfc_vpd_data); + lpfc_vpd_data = NULL; + break; } - if (mb->un.varDmp.word_cnt > DMP_VPD_SIZE - offset) - mb->un.varDmp.word_cnt = DMP_VPD_SIZE - offset; + lpfc_sli_pcimem_bcopy(pmb->context2, lpfc_vpd_data + offset, mb->un.varDmp.word_cnt); offset += mb->un.varDmp.word_cnt; - } while (mb->un.varDmp.word_cnt && offset < DMP_VPD_SIZE); - lpfc_parse_vpd(phba, lpfc_vpd_data, offset); + } while (mb->un.varDmp.word_cnt); + lpfc_parse_vpd(phba, lpfc_vpd_data); kfree(lpfc_vpd_data); out_free_context2: @@ -298,6 +298,15 @@ lpfc_config_port_post(struct lpfc_hba * phba) } } + /* This should turn on DELAYED ABTS for ELS timeouts */ + lpfc_set_slim(phba, pmb, 0x052198, 0x1); + if (lpfc_sli_issue_mbox(phba, pmb, MBX_POLL) != MBX_SUCCESS) { + phba->hba_state = LPFC_HBA_ERROR; + mempool_free( pmb, phba->mbox_mem_pool); + return -EIO; + } + + lpfc_read_config(phba, pmb); if (lpfc_sli_issue_mbox(phba, pmb, MBX_POLL) != MBX_SUCCESS) { lpfc_printf_log(phba, @@ -318,22 +327,13 @@ lpfc_config_port_post(struct lpfc_hba * phba) mb->un.varRdConfig.max_xri + 1; phba->lmt = mb->un.varRdConfig.lmt; - - /* Get the default values for Model Name and Description */ - lpfc_get_hba_model_desc(phba, phba->ModelName, phba->ModelDesc); - - if ((phba->cfg_link_speed > LINK_SPEED_10G) - || ((phba->cfg_link_speed == LINK_SPEED_1G) - && !(phba->lmt & LMT_1Gb)) - || ((phba->cfg_link_speed == LINK_SPEED_2G) - && !(phba->lmt & LMT_2Gb)) - || ((phba->cfg_link_speed == LINK_SPEED_4G) - && !(phba->lmt & LMT_4Gb)) - || ((phba->cfg_link_speed == LINK_SPEED_8G) - && !(phba->lmt & LMT_8Gb)) - || ((phba->cfg_link_speed == LINK_SPEED_10G) - && !(phba->lmt & LMT_10Gb))) { - /* Reset link speed to auto */ + /* HBA is not 4GB capable, or HBA is not 2GB capable, + don't let link speed ask for it */ + if ((((phba->lmt & LMT_4250_10bit) != LMT_4250_10bit) && + (phba->cfg_link_speed > LINK_SPEED_2G)) || + (((phba->lmt & LMT_2125_10bit) != LMT_2125_10bit) && + (phba->cfg_link_speed > LINK_SPEED_1G))) { + /* Reset link speed to auto. 1G/2GB HBA cfg'd for 4G */ lpfc_printf_log(phba, KERN_WARNING, LOG_LINK_EVENT, @@ -409,26 +409,19 @@ lpfc_config_port_post(struct lpfc_hba * phba) } /* MBOX buffer will be freed in mbox compl */ - return (0); -} - -static int -lpfc_discovery_wait(struct lpfc_hba *phba) -{ - int i = 0; - + i = 0; while ((phba->hba_state != LPFC_HBA_READY) || (phba->num_disc_nodes) || (phba->fc_prli_sent) || ((phba->fc_map_cnt == 0) && (i<2)) || - (phba->sli.sli_flag & LPFC_SLI_MBOX_ACTIVE)) { + (psli->sli_flag & LPFC_SLI_MBOX_ACTIVE)) { /* Check every second for 30 retries. */ i++; if (i > 30) { - return -ETIMEDOUT; + break; } if ((i >= 15) && (phba->hba_state <= LPFC_LINK_DOWN)) { /* The link is down. Set linkdown timeout */ - return -ETIMEDOUT; + break; } /* Delay for 1 second to give discovery time to complete. */ @@ -436,7 +429,12 @@ lpfc_discovery_wait(struct lpfc_hba *phba) } - return 0; + /* 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); } /************************************************************************/ @@ -464,40 +462,6 @@ lpfc_hba_down_prep(struct lpfc_hba * phba) return (0); } -/************************************************************************/ -/* */ -/* lpfc_hba_down_post */ -/* This routine will do uninitialization after the HBA is reset */ -/* when bringing down the SLI Layer. */ -/* This routine returns 0 on success. Any other return value */ -/* indicates an error. */ -/* */ -/************************************************************************/ -int -lpfc_hba_down_post(struct lpfc_hba * phba) -{ - struct lpfc_sli *psli = &phba->sli; - struct lpfc_sli_ring *pring; - struct lpfc_dmabuf *mp, *next_mp; - int i; - - /* Cleanup preposted buffers on the ELS ring */ - pring = &psli->ring[LPFC_ELS_RING]; - list_for_each_entry_safe(mp, next_mp, &pring->postbufq, list) { - list_del(&mp->list); - pring->postbufq_cnt--; - lpfc_mbuf_free(phba, mp->virt, mp->phys); - kfree(mp); - } - - for (i = 0; i < psli->num_rings; i++) { - pring = &psli->ring[i]; - lpfc_sli_abort_iocb_ring(phba, pring); - } - - return 0; -} - /************************************************************************/ /* */ /* lpfc_handle_eratt */ @@ -512,6 +476,20 @@ lpfc_handle_eratt(struct lpfc_hba * phba) struct lpfc_sli *psli = &phba->sli; struct lpfc_sli_ring *pring; + /* + * If a reset is sent to the HBA restore PCI configuration registers. + */ + if ( phba->hba_state == LPFC_INIT_START ) { + mdelay(1); + readl(phba->HCregaddr); /* flush */ + writel(0, phba->HCregaddr); + readl(phba->HCregaddr); /* flush */ + + /* Restore PCI cmd register */ + pci_write_config_word(phba->pcidev, + PCI_COMMAND, phba->pci_cfg_value); + } + if (phba->work_hs & HS_FFER6) { /* Re-establishing Link */ lpfc_printf_log(phba, KERN_INFO, LOG_LINK_EVENT, @@ -521,7 +499,6 @@ lpfc_handle_eratt(struct lpfc_hba * phba) phba->work_status[0], phba->work_status[1]); spin_lock_irq(phba->host->host_lock); phba->fc_flag |= FC_ESTABLISH_LINK; - psli->sli_flag &= ~LPFC_SLI2_ACTIVE; spin_unlock_irq(phba->host->host_lock); /* @@ -539,7 +516,6 @@ lpfc_handle_eratt(struct lpfc_hba * phba) * attempt to restart it. */ lpfc_offline(phba); - lpfc_sli_brdrestart(phba); if (lpfc_online(phba) == 0) { /* Initialize the HBA */ mod_timer(&phba->fc_estabtmo, jiffies + HZ * 60); return; @@ -555,10 +531,8 @@ lpfc_handle_eratt(struct lpfc_hba * phba) phba->brd_no, phba->work_hs, phba->work_status[0], phba->work_status[1]); - psli->sli_flag &= ~LPFC_SLI2_ACTIVE; lpfc_offline(phba); - phba->hba_state = LPFC_HBA_ERROR; - lpfc_hba_down_post(phba); + } } @@ -649,7 +623,7 @@ lpfc_handle_latt_err_exit: /* */ /************************************************************************/ static int -lpfc_parse_vpd(struct lpfc_hba * phba, uint8_t * vpd, int len) +lpfc_parse_vpd(struct lpfc_hba * phba, uint8_t * vpd) { uint8_t lenlo, lenhi; uint32_t Length; @@ -668,10 +642,9 @@ lpfc_parse_vpd(struct lpfc_hba * phba, uint8_t * vpd, int len) phba->brd_no, (uint32_t) vpd[0], (uint32_t) vpd[1], (uint32_t) vpd[2], (uint32_t) vpd[3]); - while (!finished && (index < (len - 4))) { + do { switch (vpd[index]) { case 0x82: - case 0x91: index += 1; lenlo = vpd[index]; index += 1; @@ -687,8 +660,7 @@ lpfc_parse_vpd(struct lpfc_hba * phba, uint8_t * vpd, int len) lenhi = vpd[index]; index += 1; Length = ((((unsigned short)lenhi) << 8) + lenlo); - if (Length > len - index) - Length = len - index; + while (Length > 0) { /* Look for Serial Number */ if ((vpd[index] == 'S') && (vpd[index+1] == 'N')) { @@ -782,7 +754,7 @@ lpfc_parse_vpd(struct lpfc_hba * phba, uint8_t * vpd, int len) index ++; break; } - } + } while (!finished && (index < 108)); return(1); } @@ -793,173 +765,137 @@ lpfc_get_hba_model_desc(struct lpfc_hba * phba, uint8_t * mdp, uint8_t * descp) lpfc_vpd_t *vp; uint16_t dev_id = phba->pcidev->device; uint16_t dev_subid = phba->pcidev->subsystem_device; - uint8_t hdrtype; - int max_speed; - char * ports; - struct { - char * name; - int max_speed; - char * ports; - char * bus; - } m = {"", 0, "", ""}; - - pci_read_config_byte(phba->pcidev, PCI_HEADER_TYPE, &hdrtype); - ports = (hdrtype == 0x80) ? "2-port " : ""; - if (mdp && mdp[0] != '\0' - && descp && descp[0] != '\0') - return; - - if (phba->lmt & LMT_10Gb) - max_speed = 10; - else if (phba->lmt & LMT_8Gb) - max_speed = 8; - else if (phba->lmt & LMT_4Gb) - max_speed = 4; - else if (phba->lmt & LMT_2Gb) - max_speed = 2; - else - max_speed = 1; + uint8_t hdrtype = phba->pcidev->hdr_type; + char *model_str = ""; vp = &phba->vpd; switch (dev_id) { case PCI_DEVICE_ID_FIREFLY: - m = (typeof(m)){"LP6000", max_speed, "", "PCI"}; + model_str = "LP6000 1Gb PCI"; break; case PCI_DEVICE_ID_SUPERFLY: if (vp->rev.biuRev >= 1 && vp->rev.biuRev <= 3) - m = (typeof(m)){"LP7000", max_speed, "", "PCI"}; + model_str = "LP7000 1Gb PCI"; else - m = (typeof(m)){"LP7000E", max_speed, "", "PCI"}; + model_str = "LP7000E 1Gb PCI"; break; case PCI_DEVICE_ID_DRAGONFLY: - m = (typeof(m)){"LP8000", max_speed, "", "PCI"}; + model_str = "LP8000 1Gb PCI"; break; case PCI_DEVICE_ID_CENTAUR: if (FC_JEDEC_ID(vp->rev.biuRev) == CENTAUR_2G_JEDEC_ID) - m = (typeof(m)){"LP9002", max_speed, "", "PCI"}; + model_str = "LP9002 2Gb PCI"; else - m = (typeof(m)){"LP9000", max_speed, "", "PCI"}; + model_str = "LP9000 1Gb PCI"; break; case PCI_DEVICE_ID_RFLY: - m = (typeof(m)){"LP952", max_speed, "", "PCI"}; + model_str = "LP952 2Gb PCI"; break; case PCI_DEVICE_ID_PEGASUS: - m = (typeof(m)){"LP9802", max_speed, "", "PCI-X"}; + model_str = "LP9802 2Gb PCI-X"; break; case PCI_DEVICE_ID_THOR: if (hdrtype == 0x80) - m = (typeof(m)){"LP10000DC", - max_speed, ports, "PCI-X"}; + model_str = "LP10000DC 2Gb 2-port PCI-X"; else - m = (typeof(m)){"LP10000", - max_speed, ports, "PCI-X"}; + model_str = "LP10000 2Gb PCI-X"; break; case PCI_DEVICE_ID_VIPER: - m = (typeof(m)){"LPX1000", max_speed, "", "PCI-X"}; + model_str = "LPX1000 10Gb PCI-X"; break; case PCI_DEVICE_ID_PFLY: - m = (typeof(m)){"LP982", max_speed, "", "PCI-X"}; + model_str = "LP982 2Gb PCI-X"; break; case PCI_DEVICE_ID_TFLY: if (hdrtype == 0x80) - m = (typeof(m)){"LP1050DC", max_speed, ports, "PCI-X"}; + model_str = "LP1050DC 2Gb 2-port PCI-X"; else - m = (typeof(m)){"LP1050", max_speed, ports, "PCI-X"}; + model_str = "LP1050 2Gb PCI-X"; break; case PCI_DEVICE_ID_HELIOS: if (hdrtype == 0x80) - m = (typeof(m)){"LP11002", max_speed, ports, "PCI-X2"}; + model_str = "LP11002 4Gb 2-port PCI-X2"; else - m = (typeof(m)){"LP11000", max_speed, ports, "PCI-X2"}; + model_str = "LP11000 4Gb PCI-X2"; break; case PCI_DEVICE_ID_HELIOS_SCSP: - m = (typeof(m)){"LP11000-SP", max_speed, ports, "PCI-X2"}; + model_str = "LP11000-SP 4Gb PCI-X2"; break; case PCI_DEVICE_ID_HELIOS_DCSP: - m = (typeof(m)){"LP11002-SP", max_speed, ports, "PCI-X2"}; + model_str = "LP11002-SP 4Gb 2-port PCI-X2"; break; case PCI_DEVICE_ID_NEPTUNE: if (hdrtype == 0x80) - m = (typeof(m)){"LPe1002", max_speed, ports, "PCIe"}; + model_str = "LPe1002 4Gb 2-port"; else - m = (typeof(m)){"LPe1000", max_speed, ports, "PCIe"}; + model_str = "LPe1000 4Gb PCIe"; break; case PCI_DEVICE_ID_NEPTUNE_SCSP: - m = (typeof(m)){"LPe1000-SP", max_speed, ports, "PCIe"}; + model_str = "LPe1000-SP 4Gb PCIe"; break; case PCI_DEVICE_ID_NEPTUNE_DCSP: - m = (typeof(m)){"LPe1002-SP", max_speed, ports, "PCIe"}; + model_str = "LPe1002-SP 4Gb 2-port PCIe"; break; case PCI_DEVICE_ID_BMID: - m = (typeof(m)){"LP1150", max_speed, ports, "PCI-X2"}; + model_str = "LP1150 4Gb PCI-X2"; break; case PCI_DEVICE_ID_BSMB: - m = (typeof(m)){"LP111", max_speed, ports, "PCI-X2"}; + model_str = "LP111 4Gb PCI-X2"; break; case PCI_DEVICE_ID_ZEPHYR: if (hdrtype == 0x80) - m = (typeof(m)){"LPe11002", max_speed, ports, "PCIe"}; + model_str = "LPe11002 4Gb 2-port PCIe"; else - m = (typeof(m)){"LPe11000", max_speed, ports, "PCIe"}; + model_str = "LPe11000 4Gb PCIe"; break; case PCI_DEVICE_ID_ZEPHYR_SCSP: - m = (typeof(m)){"LPe11000", max_speed, ports, "PCIe"}; + model_str = "LPe11000-SP 4Gb PCIe"; break; case PCI_DEVICE_ID_ZEPHYR_DCSP: - m = (typeof(m)){"LPe11002-SP", max_speed, ports, "PCIe"}; + model_str = "LPe11002-SP 4Gb 2-port PCIe"; break; case PCI_DEVICE_ID_ZMID: - m = (typeof(m)){"LPe1150", max_speed, ports, "PCIe"}; + model_str = "LPe1150 4Gb PCIe"; break; case PCI_DEVICE_ID_ZSMB: - m = (typeof(m)){"LPe111", max_speed, ports, "PCIe"}; + model_str = "LPe111 4Gb PCIe"; break; case PCI_DEVICE_ID_LP101: - m = (typeof(m)){"LP101", max_speed, ports, "PCI-X"}; + model_str = "LP101 2Gb PCI-X"; break; case PCI_DEVICE_ID_LP10000S: - m = (typeof(m)){"LP10000-S", max_speed, ports, "PCI"}; + model_str = "LP10000-S 2Gb PCI"; break; case PCI_DEVICE_ID_LP11000S: case PCI_DEVICE_ID_LPE11000S: switch (dev_subid) { case PCI_SUBSYSTEM_ID_LP11000S: - m = (typeof(m)){"LP11000-S", max_speed, - ports, "PCI-X2"}; + model_str = "LP11002-S 4Gb PCI-X2"; break; case PCI_SUBSYSTEM_ID_LP11002S: - m = (typeof(m)){"LP11002-S", max_speed, - ports, "PCI-X2"}; + model_str = "LP11000-S 4Gb 2-port PCI-X2"; break; case PCI_SUBSYSTEM_ID_LPE11000S: - m = (typeof(m)){"LPe11000-S", max_speed, - ports, "PCIe"}; + model_str = "LPe11002-S 4Gb PCIe"; break; case PCI_SUBSYSTEM_ID_LPE11002S: - m = (typeof(m)){"LPe11002-S", max_speed, - ports, "PCIe"}; + model_str = "LPe11002-S 4Gb 2-port PCIe"; break; case PCI_SUBSYSTEM_ID_LPE11010S: - m = (typeof(m)){"LPe11010-S", max_speed, - "10-port ", "PCIe"}; + model_str = "LPe11010-S 4Gb 10-port PCIe"; break; default: - m = (typeof(m)){ NULL }; break; } break; default: - m = (typeof(m)){ NULL }; break; } - - if (mdp && mdp[0] == '\0') - snprintf(mdp, 79,"%s", m.name); - if (descp && descp[0] == '\0') - snprintf(descp, 255, - "Emulex %s %dGb %s%s Fibre Channel Adapter", - m.name, m.max_speed, m.ports, m.bus); + if (mdp) + sscanf(model_str, "%s", mdp); + if (descp) + sprintf(descp, "Emulex %s Fibre Channel Adapter", model_str); } /**************************************************/ @@ -1345,8 +1281,7 @@ lpfc_offline(struct lpfc_hba * phba) struct lpfc_sli_ring *pring; struct lpfc_sli *psli; unsigned long iflag; - int i; - int cnt = 0; + int i = 0; if (!phba) return 0; @@ -1355,31 +1290,20 @@ 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); - - 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; - } - } - } + /* The linkdown event takes 30 seconds to timeout. */ + while (pring->txcmplq_cnt) { + mdelay(10); + if (i++ > 3000) + 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, @@ -1469,6 +1393,7 @@ lpfc_pci_probe_one(struct pci_dev *pdev, const struct pci_device_id *pid) goto out_put_host; host->unique_id = phba->brd_no; + init_MUTEX(&phba->hba_can_block); INIT_LIST_HEAD(&phba->ctrspbuflist); INIT_LIST_HEAD(&phba->rnidrspbuflist); INIT_LIST_HEAD(&phba->freebufList); @@ -1537,23 +1462,9 @@ lpfc_pci_probe_one(struct pci_dev *pdev, const struct pci_device_id *pid) phba->pci_bar2_map = pci_resource_start(phba->pcidev, 2); bar2map_len = pci_resource_len(phba->pcidev, 2); - /* Map HBA SLIM to a kernel virtual address. */ + /* Map HBA SLIM and Control Registers to a kernel virtual address. */ phba->slim_memmap_p = ioremap(phba->pci_bar0_map, bar0map_len); - if (!phba->slim_memmap_p) { - error = -ENODEV; - dev_printk(KERN_ERR, &pdev->dev, - "ioremap failed for SLIM memory.\n"); - goto out_idr_remove; - } - - /* Map HBA Control Registers to a kernel virtual address. */ phba->ctrl_regs_memmap_p = ioremap(phba->pci_bar2_map, bar2map_len); - if (!phba->ctrl_regs_memmap_p) { - error = -ENODEV; - dev_printk(KERN_ERR, &pdev->dev, - "ioremap failed for HBA control registers.\n"); - goto out_iounmap_slim; - } /* Allocate memory for SLI-2 structures */ phba->slim2p = dma_alloc_coherent(&phba->pcidev->dev, SLI2_SLIM_SIZE, @@ -1617,11 +1528,7 @@ lpfc_pci_probe_one(struct pci_dev *pdev, const struct pci_device_id *pid) goto out_free_iocbq; } - /* - * 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. - */ + /* We can rely on a queue depth attribute only after SLI HBA setup */ host->can_queue = phba->cfg_hba_queue_depth - 10; /* Tell the midlayer we support 16 byte commands */ @@ -1632,6 +1539,7 @@ lpfc_pci_probe_one(struct pci_dev *pdev, const struct pci_device_id *pid) INIT_LIST_HEAD(&phba->lpfc_scsi_buf_list); host->transportt = lpfc_transport_template; + host->hostdata[0] = (unsigned long)phba; pci_set_drvdata(pdev, host); error = scsi_add_host(host, &pdev->dev); if (error) @@ -1639,9 +1547,9 @@ lpfc_pci_probe_one(struct pci_dev *pdev, const struct pci_device_id *pid) error = lpfc_alloc_sysfs_attr(phba); if (error) - goto out_remove_host; + goto out_kthread_stop; - error = request_irq(phba->pcidev->irq, lpfc_intr_handler, IRQF_SHARED, + error = request_irq(phba->pcidev->irq, lpfc_intr_handler, SA_SHIRQ, LPFC_DRIVER_NAME, phba); if (error) { lpfc_printf_log(phba, KERN_ERR, LOG_INIT, @@ -1656,18 +1564,8 @@ lpfc_pci_probe_one(struct pci_dev *pdev, const struct pci_device_id *pid) phba->HCregaddr = phba->ctrl_regs_memmap_p + HC_REG_OFFSET; error = lpfc_sli_hba_setup(phba); - if (error) { - error = -ENODEV; + if (error) 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); @@ -1692,14 +1590,21 @@ lpfc_pci_probe_one(struct pci_dev *pdev, const struct pci_device_id *pid) lpfc_get_hba_sym_node_name(phba, fc_host_symbolic_name(host)); fc_host_supported_speeds(host) = 0; - if (phba->lmt & LMT_10Gb) + switch (FC_JEDEC_ID(phba->vpd.rev.biuRev)) { + case VIPER_JEDEC_ID: fc_host_supported_speeds(host) |= FC_PORTSPEED_10GBIT; - if (phba->lmt & LMT_4Gb) + break; + case HELIOS_JEDEC_ID: fc_host_supported_speeds(host) |= FC_PORTSPEED_4GBIT; - if (phba->lmt & LMT_2Gb) + /* Fall through */ + case CENTAUR_2G_JEDEC_ID: + case PEGASUS_JEDEC_ID: + case THOR_JEDEC_ID: fc_host_supported_speeds(host) |= FC_PORTSPEED_2GBIT; - if (phba->lmt & LMT_1Gb) - fc_host_supported_speeds(host) |= FC_PORTSPEED_1GBIT; + /* Fall through */ + default: + fc_host_supported_speeds(host) = FC_PORTSPEED_1GBIT; + } fc_host_maxframe_size(host) = ((((uint32_t) phba->fc_sparam.cmn.bbRcvSizeMsb & 0x0F) << 8) | @@ -1722,9 +1627,6 @@ out_free_irq: free_irq(phba->pcidev->irq, phba); out_free_sysfs_attr: lpfc_free_sysfs_attr(phba); -out_remove_host: - fc_remove_host(phba->host); - scsi_remove_host(phba->host); out_kthread_stop: kthread_stop(phba->worker_thread); out_free_iocbq: @@ -1741,19 +1643,16 @@ out_free_slim: phba->slim2p_mapping); out_iounmap: iounmap(phba->ctrl_regs_memmap_p); -out_iounmap_slim: iounmap(phba->slim_memmap_p); out_idr_remove: idr_remove(&lpfc_hba_index, phba->brd_no); out_put_host: - phba->host = NULL; scsi_host_put(host); out_release_regions: pci_release_regions(pdev); out_disable_device: pci_disable_device(pdev); out: - pci_set_drvdata(pdev, NULL); return error; } @@ -1761,7 +1660,7 @@ static void __devexit lpfc_pci_remove_one(struct pci_dev *pdev) { struct Scsi_Host *host = pci_get_drvdata(pdev); - struct lpfc_hba *phba = (struct lpfc_hba *)host->hostdata; + struct lpfc_hba *phba = (struct lpfc_hba *)host->hostdata[0]; unsigned long iflag; lpfc_free_sysfs_attr(phba); @@ -1782,7 +1681,6 @@ lpfc_pci_remove_one(struct pci_dev *pdev) * the HBA. */ lpfc_sli_hba_down(phba); - lpfc_sli_brdrestart(phba); /* Release the irq reservation */ free_irq(phba->pcidev->irq, phba); diff --git a/drivers/scsi/lpfc/lpfc_mbox.c b/drivers/scsi/lpfc/lpfc_mbox.c index 4d016c2a1..e3bc8d3f7 100644 --- a/drivers/scsi/lpfc/lpfc_mbox.c +++ b/drivers/scsi/lpfc/lpfc_mbox.c @@ -1,7 +1,7 @@ /******************************************************************* * This file is part of the Emulex Linux Device Driver for * * Fibre Channel Host Bus Adapters. * - * Copyright (C) 2004-2006 Emulex. All rights reserved. * + * Copyright (C) 2004-2005 Emulex. All rights reserved. * * EMULEX and SLI are trademarks of Emulex. * * www.emulex.com * * Portions Copyright (C) 2004-2005 Christoph Hellwig * @@ -195,14 +195,8 @@ lpfc_init_link(struct lpfc_hba * phba, mb->un.varInitLnk.link_flags = FLAGS_TOPOLOGY_MODE_PT_PT; mb->un.varInitLnk.link_flags |= FLAGS_TOPOLOGY_FAILOVER; break; - case FLAGS_LOCAL_LB: - mb->un.varInitLnk.link_flags = FLAGS_LOCAL_LB; - break; } - /* Enable asynchronous ABTS responses from firmware */ - mb->un.varInitLnk.link_flags |= FLAGS_IMED_ABORT; - /* NEW_FEATURE * Setting up the link speed */ @@ -295,36 +289,49 @@ lpfc_unreg_did(struct lpfc_hba * phba, uint32_t did, LPFC_MBOXQ_t * pmb) return; } -/**********************************************/ -/* lpfc_read_nv Issue a READ CONFIG */ -/* mailbox command */ -/**********************************************/ +/***********************************************/ + +/* command to write slim */ +/***********************************************/ void -lpfc_read_config(struct lpfc_hba * phba, LPFC_MBOXQ_t * pmb) +lpfc_set_slim(struct lpfc_hba * phba, LPFC_MBOXQ_t * pmb, uint32_t addr, + uint32_t value) { MAILBOX_t *mb; mb = &pmb->mb; memset(pmb, 0, sizeof (LPFC_MBOXQ_t)); - mb->mbxCommand = MBX_READ_CONFIG; + /* addr = 0x090597 is AUTO ABTS disable for ELS commands */ + /* addr = 0x052198 is DELAYED ABTS enable for ELS commands */ + + /* + * Always turn on DELAYED ABTS for ELS timeouts + */ + if ((addr == 0x052198) && (value == 0)) + value = 1; + + mb->un.varWords[0] = addr; + mb->un.varWords[1] = value; + + mb->mbxCommand = MBX_SET_SLIM; mb->mbxOwner = OWN_HOST; return; } -/*************************************************/ -/* lpfc_read_lnk_stat Issue a READ LINK STATUS */ -/* mailbox command */ -/*************************************************/ +/**********************************************/ +/* lpfc_read_nv Issue a READ CONFIG */ +/* mailbox command */ +/**********************************************/ void -lpfc_read_lnk_stat(struct lpfc_hba * phba, LPFC_MBOXQ_t * pmb) +lpfc_read_config(struct lpfc_hba * phba, LPFC_MBOXQ_t * pmb) { MAILBOX_t *mb; mb = &pmb->mb; memset(pmb, 0, sizeof (LPFC_MBOXQ_t)); - mb->mbxCommand = MBX_READ_LNK_STAT; + mb->mbxCommand = MBX_READ_CONFIG; mb->mbxOwner = OWN_HOST; return; } @@ -612,17 +619,6 @@ lpfc_config_port(struct lpfc_hba * phba, LPFC_MBOXQ_t * pmb) phba->brd_no); } -void -lpfc_kill_board(struct lpfc_hba * phba, LPFC_MBOXQ_t * pmb) -{ - MAILBOX_t *mb = &pmb->mb; - - memset(pmb, 0, sizeof(LPFC_MBOXQ_t)); - mb->mbxCommand = MBX_KILL_BOARD; - mb->mbxOwner = OWN_HOST; - return; -} - void lpfc_mbox_put(struct lpfc_hba * phba, LPFC_MBOXQ_t * mbq) { @@ -651,19 +647,3 @@ 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 066292d39..352df47bc 100644 --- a/drivers/scsi/lpfc/lpfc_mem.c +++ b/drivers/scsi/lpfc/lpfc_mem.c @@ -38,6 +38,18 @@ #define LPFC_MBUF_POOL_SIZE 64 /* max elements in MBUF safety pool */ #define LPFC_MEM_POOL_SIZE 64 /* max elem in non-DMA safety pool */ +static void * +lpfc_pool_kmalloc(gfp_t gfp_flags, void *data) +{ + return kmalloc((unsigned long)data, gfp_flags); +} + +static void +lpfc_pool_kfree(void *obj, void *data) +{ + kfree(obj); +} + int lpfc_mem_alloc(struct lpfc_hba * phba) { @@ -67,13 +79,15 @@ lpfc_mem_alloc(struct lpfc_hba * phba) pool->current_count++; } - phba->mbox_mem_pool = mempool_create_kmalloc_pool(LPFC_MEM_POOL_SIZE, - sizeof(LPFC_MBOXQ_t)); + phba->mbox_mem_pool = mempool_create(LPFC_MEM_POOL_SIZE, + lpfc_pool_kmalloc, lpfc_pool_kfree, + (void *)(unsigned long)sizeof(LPFC_MBOXQ_t)); if (!phba->mbox_mem_pool) goto fail_free_mbuf_pool; - phba->nlp_mem_pool = mempool_create_kmalloc_pool(LPFC_MEM_POOL_SIZE, - sizeof(struct lpfc_nodelist)); + phba->nlp_mem_pool = mempool_create(LPFC_MEM_POOL_SIZE, + lpfc_pool_kmalloc, lpfc_pool_kfree, + (void *)(unsigned long)sizeof(struct lpfc_nodelist)); if (!phba->nlp_mem_pool) goto fail_free_mbox_pool; @@ -133,11 +147,6 @@ 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 20449a8dd..fbead7860 100644 --- a/drivers/scsi/lpfc/lpfc_nportdisc.c +++ b/drivers/scsi/lpfc/lpfc_nportdisc.c @@ -1,7 +1,7 @@ /******************************************************************* * This file is part of the Emulex Linux Device Driver for * * Fibre Channel Host Bus Adapters. * - * Copyright (C) 2004-2006 Emulex. All rights reserved. * + * Copyright (C) 2004-2005 Emulex. All rights reserved. * * EMULEX and SLI are trademarks of Emulex. * * www.emulex.com * * Portions Copyright (C) 2004-2005 Christoph Hellwig * @@ -46,13 +46,13 @@ lpfc_check_adisc(struct lpfc_hba * phba, struct lpfc_nodelist * ndlp, * table entry for that node. */ if (memcmp(nn, &ndlp->nlp_nodename, sizeof (struct lpfc_name)) != 0) - return 0; + return (0); if (memcmp(pn, &ndlp->nlp_portname, sizeof (struct lpfc_name)) != 0) - return 0; + return (0); /* we match, return success */ - return 1; + return (1); } int @@ -150,7 +150,8 @@ lpfc_check_elscmpl_iocb(struct lpfc_hba * phba, lp = (uint32_t *) prsp->virt; ptr = (void *)((uint8_t *)lp + sizeof(uint32_t)); } - } else { + } + else { /* Force ulpStatus error since we are returning NULL ptr */ if (!(irsp->ulpStatus)) { irsp->ulpStatus = IOSTAT_LOCAL_REJECT; @@ -158,7 +159,7 @@ lpfc_check_elscmpl_iocb(struct lpfc_hba * phba, } ptr = NULL; } - return ptr; + return (ptr); } @@ -179,7 +180,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:0205 Abort outstanding I/O on NPort x%x " + "%d:0201 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); @@ -259,9 +260,13 @@ lpfc_els_abort(struct lpfc_hba * phba, struct lpfc_nodelist * ndlp, } while(found); /* If we are delaying issuing an ELS command, cancel it */ - if (ndlp->nlp_flag & NLP_DELAY_TMO) - lpfc_cancel_retry_delay_tmo(phba, ndlp); - return 0; + if (ndlp->nlp_flag & NLP_DELAY_TMO) { + ndlp->nlp_flag &= ~NLP_DELAY_TMO; + del_timer_sync(&ndlp->nlp_delayfunc); + if (!list_empty(&ndlp->els_retry_evt.evt_listp)) + list_del_init(&ndlp->els_retry_evt.evt_listp); + } + return (0); } static int @@ -295,10 +300,12 @@ lpfc_rcv_plogi(struct lpfc_hba * phba, /* Start discovery - this should just do CLEAR_LA */ lpfc_disc_start(phba); - } else { + } + else { lpfc_initial_flogi(phba); } - } else { + } + else { stat.un.b.lsRjtRsnCode = LSRJT_LOGICAL_BSY; stat.un.b.lsRjtRsnCodeExp = LSEXP_NOTHING_MORE; lpfc_els_rsp_reject(phba, stat.un.lsRjtError, cmdiocb, @@ -314,7 +321,7 @@ lpfc_rcv_plogi(struct lpfc_hba * phba, stat.un.b.lsRjtRsnCode = LSRJT_UNABLE_TPC; stat.un.b.lsRjtRsnCodeExp = LSEXP_SPARM_OPTIONS; lpfc_els_rsp_reject(phba, stat.un.lsRjtError, cmdiocb, ndlp); - return 0; + return (0); } icmd = &cmdiocb->iocb; @@ -346,7 +353,7 @@ lpfc_rcv_plogi(struct lpfc_hba * phba, ((sp->cmn.bbRcvSizeMsb & 0x0F) << 8) | sp->cmn.bbRcvSizeLsb; /* no need to reg_login if we are already in one of these states */ - switch (ndlp->nlp_state) { + switch(ndlp->nlp_state) { case NLP_STE_NPR_NODE: if (!(ndlp->nlp_flag & NLP_NPR_ADISC)) break; @@ -355,7 +362,7 @@ lpfc_rcv_plogi(struct lpfc_hba * phba, case NLP_STE_UNMAPPED_NODE: case NLP_STE_MAPPED_NODE: lpfc_els_rsp_acc(phba, ELS_CMD_PLOGI, cmdiocb, ndlp, NULL, 0); - return 1; + return (1); } if ((phba->fc_flag & FC_PT2PT) @@ -391,30 +398,24 @@ lpfc_rcv_plogi(struct lpfc_hba * phba, */ mbox->mbox_cmpl = lpfc_mbx_cmpl_reg_login; mbox->context2 = ndlp; - ndlp->nlp_flag |= (NLP_ACC_REGLOGIN | NLP_RCV_PLOGI); + ndlp->nlp_flag |= NLP_ACC_REGLOGIN; - /* - * 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 there is an outstanding PLOGI issued, abort it before + * sending ACC rsp to PLOGI recieved. */ if (ndlp->nlp_state == NLP_STE_PLOGI_ISSUE) { /* software abort outstanding PLOGI */ lpfc_els_abort(phba, ndlp, 1); } - + ndlp->nlp_flag |= NLP_RCV_PLOGI; lpfc_els_rsp_acc(phba, ELS_CMD_PLOGI, cmdiocb, ndlp, mbox, 0); - return 1; + return (1); out: stat.un.b.lsRjtRsnCode = LSRJT_UNABLE_TPC; stat.un.b.lsRjtRsnCodeExp = LSEXP_OUT_OF_RESOURCE; lpfc_els_rsp_reject(phba, stat.un.lsRjtError, cmdiocb, ndlp); - return 0; + return (0); } static int @@ -450,11 +451,12 @@ lpfc_rcv_padisc(struct lpfc_hba * phba, (lpfc_check_adisc(phba, ndlp, pnn, ppn))) { if (cmd == ELS_CMD_ADISC) { lpfc_els_rsp_adisc_acc(phba, cmdiocb, ndlp); - } else { + } + else { lpfc_els_rsp_acc(phba, ELS_CMD_PLOGI, cmdiocb, ndlp, NULL, 0); } - return 1; + return (1); } /* Reject this request because invalid parameters */ stat.un.b.lsRjtRsvd0 = 0; @@ -463,62 +465,49 @@ lpfc_rcv_padisc(struct lpfc_hba * phba, stat.un.b.vendorUnique = 0; lpfc_els_rsp_reject(phba, stat.un.lsRjtError, cmdiocb, ndlp); + ndlp->nlp_last_elscmd = (unsigned long)ELS_CMD_PLOGI; /* 1 sec timeout */ mod_timer(&ndlp->nlp_delayfunc, jiffies + HZ); spin_lock_irq(phba->host->host_lock); ndlp->nlp_flag |= NLP_DELAY_TMO; spin_unlock_irq(phba->host->host_lock); - ndlp->nlp_last_elscmd = ELS_CMD_PLOGI; - ndlp->nlp_prev_state = ndlp->nlp_state; ndlp->nlp_state = NLP_STE_NPR_NODE; lpfc_nlp_list(phba, ndlp, NLP_NPR_LIST); - return 0; + return (0); } static int lpfc_rcv_logo(struct lpfc_hba * phba, struct lpfc_nodelist * ndlp, - struct lpfc_iocbq *cmdiocb, - uint32_t els_cmd) + struct lpfc_iocbq *cmdiocb) { /* Put ndlp on NPR list with 1 sec timeout for plogi, ACC logo */ /* Only call LOGO ACC for first LOGO, this avoids sending unnecessary * PLOGIs during LOGO storms from a device. */ ndlp->nlp_flag |= NLP_LOGO_ACC; - if (els_cmd == ELS_CMD_PRLO) - lpfc_els_rsp_acc(phba, ELS_CMD_PRLO, cmdiocb, ndlp, NULL, 0); - else - lpfc_els_rsp_acc(phba, ELS_CMD_ACC, cmdiocb, ndlp, NULL, 0); + lpfc_els_rsp_acc(phba, ELS_CMD_ACC, cmdiocb, ndlp, NULL, 0); - if (!(ndlp->nlp_type & NLP_FABRIC) || - (ndlp->nlp_state == NLP_STE_ADISC_ISSUE)) { + if (!(ndlp->nlp_type & NLP_FABRIC)) { /* Only try to re-login if this is NOT a Fabric Node */ + ndlp->nlp_last_elscmd = (unsigned long)ELS_CMD_PLOGI; mod_timer(&ndlp->nlp_delayfunc, jiffies + HZ * 1); spin_lock_irq(phba->host->host_lock); ndlp->nlp_flag |= NLP_DELAY_TMO; spin_unlock_irq(phba->host->host_lock); - - ndlp->nlp_last_elscmd = ELS_CMD_PLOGI; - ndlp->nlp_prev_state = ndlp->nlp_state; - ndlp->nlp_state = NLP_STE_NPR_NODE; - lpfc_nlp_list(phba, ndlp, NLP_NPR_LIST); - } else { - ndlp->nlp_prev_state = ndlp->nlp_state; - ndlp->nlp_state = NLP_STE_UNUSED_NODE; - lpfc_nlp_list(phba, ndlp, NLP_UNUSED_LIST); } - spin_lock_irq(phba->host->host_lock); + ndlp->nlp_state = NLP_STE_NPR_NODE; + lpfc_nlp_list(phba, ndlp, NLP_NPR_LIST); + ndlp->nlp_flag &= ~NLP_NPR_ADISC; - spin_unlock_irq(phba->host->host_lock); /* The driver has to wait until the ACC completes before it continues * processing the LOGO. The action will resume in * lpfc_cmpl_els_logo_acc routine. Since part of processing includes an * unreg_login, the driver waits so the ACC does not get aborted. */ - return 0; + return (0); } static void @@ -566,12 +555,20 @@ lpfc_disc_set_adisc(struct lpfc_hba * phba, if ((phba->cfg_use_adisc == 0) && !(phba->fc_flag & FC_RSCN_MODE)) { if (!(ndlp->nlp_fcp_info & NLP_FCP_2_DEVICE)) - return 0; + return (0); } spin_lock_irq(phba->host->host_lock); ndlp->nlp_flag |= NLP_NPR_ADISC; spin_unlock_irq(phba->host->host_lock); - return 1; + return (1); +} + +static uint32_t +lpfc_disc_noop(struct lpfc_hba * phba, + struct lpfc_nodelist * ndlp, void *arg, uint32_t evt) +{ + /* This routine does nothing, just return the current state */ + return (ndlp->nlp_state); } static uint32_t @@ -586,7 +583,7 @@ lpfc_disc_illegal(struct lpfc_hba * phba, phba->brd_no, ndlp->nlp_DID, evt, ndlp->nlp_state, ndlp->nlp_rpi, ndlp->nlp_flag); - return ndlp->nlp_state; + return (ndlp->nlp_state); } /* Start of Discovery State Machine routines */ @@ -600,13 +597,12 @@ lpfc_rcv_plogi_unused_node(struct lpfc_hba * phba, cmdiocb = (struct lpfc_iocbq *) arg; if (lpfc_rcv_plogi(phba, ndlp, cmdiocb)) { - 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; + return (ndlp->nlp_state); } lpfc_nlp_list(phba, ndlp, NLP_NO_LIST); - return NLP_STE_FREED_NODE; + return (NLP_STE_FREED_NODE); } static uint32_t @@ -615,7 +611,7 @@ lpfc_rcv_els_unused_node(struct lpfc_hba * phba, { lpfc_issue_els_logo(phba, ndlp, 0); lpfc_nlp_list(phba, ndlp, NLP_UNUSED_LIST); - return ndlp->nlp_state; + return (ndlp->nlp_state); } static uint32_t @@ -632,7 +628,7 @@ lpfc_rcv_logo_unused_node(struct lpfc_hba * phba, lpfc_els_rsp_acc(phba, ELS_CMD_ACC, cmdiocb, ndlp, NULL, 0); lpfc_nlp_list(phba, ndlp, NLP_UNUSED_LIST); - return ndlp->nlp_state; + return (ndlp->nlp_state); } static uint32_t @@ -640,7 +636,7 @@ lpfc_cmpl_logo_unused_node(struct lpfc_hba * phba, struct lpfc_nodelist * ndlp, void *arg, uint32_t evt) { lpfc_nlp_list(phba, ndlp, NLP_NO_LIST); - return NLP_STE_FREED_NODE; + return (NLP_STE_FREED_NODE); } static uint32_t @@ -648,7 +644,7 @@ lpfc_device_rm_unused_node(struct lpfc_hba * phba, struct lpfc_nodelist * ndlp, void *arg, uint32_t evt) { lpfc_nlp_list(phba, ndlp, NLP_NO_LIST); - return NLP_STE_FREED_NODE; + return (NLP_STE_FREED_NODE); } static uint32_t @@ -681,26 +677,12 @@ lpfc_rcv_plogi_plogi_issue(struct lpfc_hba * phba, struct lpfc_nodelist * ndlp, stat.un.b.lsRjtRsnCode = LSRJT_UNABLE_TPC; stat.un.b.lsRjtRsnCodeExp = LSEXP_CMD_IN_PROGRESS; lpfc_els_rsp_reject(phba, stat.un.lsRjtError, cmdiocb, ndlp); - } else { + } + else { lpfc_rcv_plogi(phba, ndlp, cmdiocb); } /* if our portname was less */ - return ndlp->nlp_state; -} - -static uint32_t -lpfc_rcv_logo_plogi_issue(struct lpfc_hba * phba, - struct lpfc_nodelist * ndlp, void *arg, uint32_t evt) -{ - struct lpfc_iocbq *cmdiocb; - - cmdiocb = (struct lpfc_iocbq *) arg; - - /* software abort outstanding PLOGI */ - lpfc_els_abort(phba, ndlp, 1); - - lpfc_rcv_logo(phba, ndlp, cmdiocb, ELS_CMD_LOGO); - return ndlp->nlp_state; + return (ndlp->nlp_state); } static uint32_t @@ -713,24 +695,24 @@ lpfc_rcv_els_plogi_issue(struct lpfc_hba * phba, /* software abort outstanding PLOGI */ lpfc_els_abort(phba, ndlp, 1); + mod_timer(&ndlp->nlp_delayfunc, jiffies + HZ * 1); + spin_lock_irq(phba->host->host_lock); + ndlp->nlp_flag |= NLP_DELAY_TMO; + spin_unlock_irq(phba->host->host_lock); if (evt == NLP_EVT_RCV_LOGO) { lpfc_els_rsp_acc(phba, ELS_CMD_ACC, cmdiocb, ndlp, NULL, 0); - } else { + } + else { lpfc_issue_els_logo(phba, ndlp, 0); } /* 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); - ndlp->nlp_flag |= NLP_DELAY_TMO; - spin_unlock_irq(phba->host->host_lock); - ndlp->nlp_last_elscmd = ELS_CMD_PLOGI; - ndlp->nlp_prev_state = NLP_STE_PLOGI_ISSUE; + ndlp->nlp_last_elscmd = (unsigned long)ELS_CMD_PLOGI; ndlp->nlp_state = NLP_STE_NPR_NODE; lpfc_nlp_list(phba, ndlp, NLP_NPR_LIST); - return ndlp->nlp_state; + return (ndlp->nlp_state); } static uint32_t @@ -749,8 +731,7 @@ lpfc_cmpl_plogi_plogi_issue(struct lpfc_hba * phba, rspiocb = cmdiocb->context_un.rsp_iocb; if (ndlp->nlp_flag & NLP_ACC_REGLOGIN) { - /* Recovery from PLOGI collision logic */ - return ndlp->nlp_state; + return (ndlp->nlp_state); } irsp = &rspiocb->iocb; @@ -806,7 +787,11 @@ lpfc_cmpl_plogi_plogi_issue(struct lpfc_hba * phba, if (lpfc_reg_login (phba, irsp->un.elsreq64.remoteID, (uint8_t *) sp, mbox, 0) == 0) { - switch (ndlp->nlp_DID) { + /* set_slim mailbox command needs to + * execute first, queue this command to + * be processed later. + */ + switch(ndlp->nlp_DID) { case NameServer_DID: mbox->mbox_cmpl = lpfc_mbx_cmpl_ns_reg_login; @@ -827,7 +812,7 @@ lpfc_cmpl_plogi_plogi_issue(struct lpfc_hba * phba, NLP_STE_REG_LOGIN_ISSUE; lpfc_nlp_list(phba, ndlp, NLP_REGLOGIN_LIST); - return ndlp->nlp_state; + return (ndlp->nlp_state); } mempool_free(mbox, phba->mbox_mem_pool); } else { @@ -839,24 +824,18 @@ lpfc_cmpl_plogi_plogi_issue(struct lpfc_hba * phba, /* Free this node since the driver cannot login or has the wrong sparm */ lpfc_nlp_list(phba, ndlp, NLP_NO_LIST); - return NLP_STE_FREED_NODE; + return (NLP_STE_FREED_NODE); } static uint32_t lpfc_device_rm_plogi_issue(struct lpfc_hba * phba, struct lpfc_nodelist * ndlp, void *arg, uint32_t evt) { - if(ndlp->nlp_flag & NLP_NPR_2B_DISC) { - ndlp->nlp_flag |= NLP_NODEV_REMOVE; - return ndlp->nlp_state; - } - else { - /* software abort outstanding PLOGI */ - lpfc_els_abort(phba, ndlp, 1); + /* software abort outstanding PLOGI */ + lpfc_els_abort(phba, ndlp, 1); - lpfc_nlp_list(phba, ndlp, NLP_NO_LIST); - return NLP_STE_FREED_NODE; - } + lpfc_nlp_list(phba, ndlp, NLP_NO_LIST); + return (NLP_STE_FREED_NODE); } static uint32_t @@ -867,14 +846,13 @@ lpfc_device_recov_plogi_issue(struct lpfc_hba * phba, /* software abort outstanding PLOGI */ lpfc_els_abort(phba, ndlp, 1); - ndlp->nlp_prev_state = NLP_STE_PLOGI_ISSUE; ndlp->nlp_state = NLP_STE_NPR_NODE; lpfc_nlp_list(phba, ndlp, NLP_NPR_LIST); spin_lock_irq(phba->host->host_lock); - ndlp->nlp_flag &= ~(NLP_NODEV_REMOVE | NLP_NPR_2B_DISC); + ndlp->nlp_flag &= ~NLP_NPR_2B_DISC; spin_unlock_irq(phba->host->host_lock); - return ndlp->nlp_state; + return (ndlp->nlp_state); } static uint32_t @@ -890,14 +868,13 @@ lpfc_rcv_plogi_adisc_issue(struct lpfc_hba * phba, cmdiocb = (struct lpfc_iocbq *) arg; if (lpfc_rcv_plogi(phba, ndlp, cmdiocb)) { - return ndlp->nlp_state; + return (ndlp->nlp_state); } - ndlp->nlp_prev_state = NLP_STE_ADISC_ISSUE; ndlp->nlp_state = NLP_STE_PLOGI_ISSUE; lpfc_nlp_list(phba, ndlp, NLP_PLOGI_LIST); - lpfc_issue_els_plogi(phba, ndlp->nlp_DID, 0); + lpfc_issue_els_plogi(phba, ndlp, 0); - return ndlp->nlp_state; + return (ndlp->nlp_state); } static uint32_t @@ -910,7 +887,7 @@ lpfc_rcv_prli_adisc_issue(struct lpfc_hba * phba, cmdiocb = (struct lpfc_iocbq *) arg; lpfc_els_rsp_prli_acc(phba, cmdiocb, ndlp); - return ndlp->nlp_state; + return (ndlp->nlp_state); } static uint32_t @@ -925,8 +902,8 @@ lpfc_rcv_logo_adisc_issue(struct lpfc_hba * phba, /* software abort outstanding ADISC */ lpfc_els_abort(phba, ndlp, 0); - lpfc_rcv_logo(phba, ndlp, cmdiocb, ELS_CMD_LOGO); - return ndlp->nlp_state; + lpfc_rcv_logo(phba, ndlp, cmdiocb); + return (ndlp->nlp_state); } static uint32_t @@ -939,7 +916,7 @@ lpfc_rcv_padisc_adisc_issue(struct lpfc_hba * phba, cmdiocb = (struct lpfc_iocbq *) arg; lpfc_rcv_padisc(phba, ndlp, cmdiocb); - return ndlp->nlp_state; + return (ndlp->nlp_state); } static uint32_t @@ -952,8 +929,8 @@ lpfc_rcv_prlo_adisc_issue(struct lpfc_hba * phba, cmdiocb = (struct lpfc_iocbq *) arg; /* Treat like rcv logo */ - lpfc_rcv_logo(phba, ndlp, cmdiocb, ELS_CMD_PRLO); - return ndlp->nlp_state; + lpfc_rcv_logo(phba, ndlp, cmdiocb); + return (ndlp->nlp_state); } static uint32_t @@ -973,33 +950,29 @@ lpfc_cmpl_adisc_adisc_issue(struct lpfc_hba * phba, if ((irsp->ulpStatus) || (!lpfc_check_adisc(phba, ndlp, &ap->nodeName, &ap->portName))) { + ndlp->nlp_last_elscmd = (unsigned long)ELS_CMD_PLOGI; /* 1 sec timeout */ mod_timer(&ndlp->nlp_delayfunc, jiffies + HZ); spin_lock_irq(phba->host->host_lock); ndlp->nlp_flag |= NLP_DELAY_TMO; spin_unlock_irq(phba->host->host_lock); - ndlp->nlp_last_elscmd = ELS_CMD_PLOGI; memset(&ndlp->nlp_nodename, 0, sizeof (struct lpfc_name)); memset(&ndlp->nlp_portname, 0, sizeof (struct lpfc_name)); - ndlp->nlp_prev_state = NLP_STE_ADISC_ISSUE; ndlp->nlp_state = NLP_STE_NPR_NODE; lpfc_nlp_list(phba, ndlp, NLP_NPR_LIST); lpfc_unreg_rpi(phba, ndlp); - return ndlp->nlp_state; + return (ndlp->nlp_state); } - if (ndlp->nlp_type & NLP_FCP_TARGET) { - ndlp->nlp_prev_state = NLP_STE_ADISC_ISSUE; ndlp->nlp_state = NLP_STE_MAPPED_NODE; lpfc_nlp_list(phba, ndlp, NLP_MAPPED_LIST); } else { - ndlp->nlp_prev_state = NLP_STE_ADISC_ISSUE; ndlp->nlp_state = NLP_STE_UNMAPPED_NODE; lpfc_nlp_list(phba, ndlp, NLP_UNMAPPED_LIST); } - return ndlp->nlp_state; + return (ndlp->nlp_state); } static uint32_t @@ -1007,17 +980,11 @@ lpfc_device_rm_adisc_issue(struct lpfc_hba * phba, struct lpfc_nodelist * ndlp, void *arg, uint32_t evt) { - if(ndlp->nlp_flag & NLP_NPR_2B_DISC) { - ndlp->nlp_flag |= NLP_NODEV_REMOVE; - return ndlp->nlp_state; - } - else { - /* software abort outstanding ADISC */ - lpfc_els_abort(phba, ndlp, 1); + /* software abort outstanding ADISC */ + lpfc_els_abort(phba, ndlp, 1); - lpfc_nlp_list(phba, ndlp, NLP_NO_LIST); - return NLP_STE_FREED_NODE; - } + lpfc_nlp_list(phba, ndlp, NLP_NO_LIST); + return (NLP_STE_FREED_NODE); } static uint32_t @@ -1028,15 +995,14 @@ lpfc_device_recov_adisc_issue(struct lpfc_hba * phba, /* software abort outstanding ADISC */ lpfc_els_abort(phba, ndlp, 1); - ndlp->nlp_prev_state = NLP_STE_ADISC_ISSUE; ndlp->nlp_state = NLP_STE_NPR_NODE; lpfc_nlp_list(phba, ndlp, NLP_NPR_LIST); spin_lock_irq(phba->host->host_lock); - ndlp->nlp_flag &= ~(NLP_NODEV_REMOVE | NLP_NPR_2B_DISC); - ndlp->nlp_flag |= NLP_NPR_ADISC; + ndlp->nlp_flag &= ~NLP_NPR_2B_DISC; spin_unlock_irq(phba->host->host_lock); - return ndlp->nlp_state; + lpfc_disc_set_adisc(phba, ndlp); + return (ndlp->nlp_state); } static uint32_t @@ -1049,7 +1015,7 @@ lpfc_rcv_plogi_reglogin_issue(struct lpfc_hba * phba, cmdiocb = (struct lpfc_iocbq *) arg; lpfc_rcv_plogi(phba, ndlp, cmdiocb); - return ndlp->nlp_state; + return (ndlp->nlp_state); } static uint32_t @@ -1062,7 +1028,7 @@ lpfc_rcv_prli_reglogin_issue(struct lpfc_hba * phba, cmdiocb = (struct lpfc_iocbq *) arg; lpfc_els_rsp_prli_acc(phba, cmdiocb, ndlp); - return ndlp->nlp_state; + return (ndlp->nlp_state); } static uint32_t @@ -1074,8 +1040,8 @@ lpfc_rcv_logo_reglogin_issue(struct lpfc_hba * phba, cmdiocb = (struct lpfc_iocbq *) arg; - lpfc_rcv_logo(phba, ndlp, cmdiocb, ELS_CMD_LOGO); - return ndlp->nlp_state; + lpfc_rcv_logo(phba, ndlp, cmdiocb); + return (ndlp->nlp_state); } static uint32_t @@ -1088,7 +1054,7 @@ lpfc_rcv_padisc_reglogin_issue(struct lpfc_hba * phba, cmdiocb = (struct lpfc_iocbq *) arg; lpfc_rcv_padisc(phba, ndlp, cmdiocb); - return ndlp->nlp_state; + return (ndlp->nlp_state); } static uint32_t @@ -1099,8 +1065,8 @@ lpfc_rcv_prlo_reglogin_issue(struct lpfc_hba * phba, struct lpfc_iocbq *cmdiocb; cmdiocb = (struct lpfc_iocbq *) arg; - lpfc_els_rsp_acc(phba, ELS_CMD_PRLO, cmdiocb, ndlp, NULL, 0); - return ndlp->nlp_state; + lpfc_els_rsp_acc(phba, ELS_CMD_ACC, cmdiocb, ndlp, NULL, 0); + return (ndlp->nlp_state); } static uint32_t @@ -1124,45 +1090,31 @@ 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); ndlp->nlp_flag |= NLP_DELAY_TMO; spin_unlock_irq(phba->host->host_lock); - ndlp->nlp_last_elscmd = ELS_CMD_PLOGI; lpfc_issue_els_logo(phba, ndlp, 0); - ndlp->nlp_prev_state = NLP_STE_REG_LOGIN_ISSUE; + /* Put ndlp in npr list set plogi timer for 1 sec */ + ndlp->nlp_last_elscmd = (unsigned long)ELS_CMD_PLOGI; ndlp->nlp_state = NLP_STE_NPR_NODE; lpfc_nlp_list(phba, ndlp, NLP_NPR_LIST); - return ndlp->nlp_state; + return (ndlp->nlp_state); } ndlp->nlp_rpi = mb->un.varWords[0]; /* Only if we are not a fabric nport do we issue PRLI */ if (!(ndlp->nlp_type & NLP_FABRIC)) { - ndlp->nlp_prev_state = NLP_STE_REG_LOGIN_ISSUE; ndlp->nlp_state = NLP_STE_PRLI_ISSUE; lpfc_nlp_list(phba, ndlp, NLP_PRLI_LIST); lpfc_issue_els_prli(phba, ndlp, 0); } else { - ndlp->nlp_prev_state = NLP_STE_REG_LOGIN_ISSUE; ndlp->nlp_state = NLP_STE_UNMAPPED_NODE; lpfc_nlp_list(phba, ndlp, NLP_UNMAPPED_LIST); } - return ndlp->nlp_state; + return (ndlp->nlp_state); } static uint32_t @@ -1170,14 +1122,8 @@ lpfc_device_rm_reglogin_issue(struct lpfc_hba * phba, struct lpfc_nodelist * ndlp, void *arg, uint32_t evt) { - if(ndlp->nlp_flag & NLP_NPR_2B_DISC) { - ndlp->nlp_flag |= NLP_NODEV_REMOVE; - return ndlp->nlp_state; - } - else { - lpfc_nlp_list(phba, ndlp, NLP_NO_LIST); - return NLP_STE_FREED_NODE; - } + lpfc_nlp_list(phba, ndlp, NLP_NO_LIST); + return (NLP_STE_FREED_NODE); } static uint32_t @@ -1185,13 +1131,12 @@ lpfc_device_recov_reglogin_issue(struct lpfc_hba * phba, struct lpfc_nodelist * ndlp, void *arg, uint32_t evt) { - ndlp->nlp_prev_state = NLP_STE_REG_LOGIN_ISSUE; ndlp->nlp_state = NLP_STE_NPR_NODE; lpfc_nlp_list(phba, ndlp, NLP_NPR_LIST); spin_lock_irq(phba->host->host_lock); - ndlp->nlp_flag &= ~(NLP_NODEV_REMOVE | NLP_NPR_2B_DISC); + ndlp->nlp_flag &= ~NLP_NPR_2B_DISC; spin_unlock_irq(phba->host->host_lock); - return ndlp->nlp_state; + return (ndlp->nlp_state); } static uint32_t @@ -1203,7 +1148,7 @@ lpfc_rcv_plogi_prli_issue(struct lpfc_hba * phba, cmdiocb = (struct lpfc_iocbq *) arg; lpfc_rcv_plogi(phba, ndlp, cmdiocb); - return ndlp->nlp_state; + return (ndlp->nlp_state); } static uint32_t @@ -1215,7 +1160,7 @@ lpfc_rcv_prli_prli_issue(struct lpfc_hba * phba, cmdiocb = (struct lpfc_iocbq *) arg; lpfc_els_rsp_prli_acc(phba, cmdiocb, ndlp); - return ndlp->nlp_state; + return (ndlp->nlp_state); } static uint32_t @@ -1229,8 +1174,8 @@ lpfc_rcv_logo_prli_issue(struct lpfc_hba * phba, /* Software abort outstanding PRLI before sending acc */ lpfc_els_abort(phba, ndlp, 1); - lpfc_rcv_logo(phba, ndlp, cmdiocb, ELS_CMD_LOGO); - return ndlp->nlp_state; + lpfc_rcv_logo(phba, ndlp, cmdiocb); + return (ndlp->nlp_state); } static uint32_t @@ -1242,7 +1187,7 @@ lpfc_rcv_padisc_prli_issue(struct lpfc_hba * phba, cmdiocb = (struct lpfc_iocbq *) arg; lpfc_rcv_padisc(phba, ndlp, cmdiocb); - return ndlp->nlp_state; + return (ndlp->nlp_state); } /* This routine is envoked when we rcv a PRLO request from a nport @@ -1257,8 +1202,8 @@ lpfc_rcv_prlo_prli_issue(struct lpfc_hba * phba, struct lpfc_iocbq *cmdiocb; cmdiocb = (struct lpfc_iocbq *) arg; - lpfc_els_rsp_acc(phba, ELS_CMD_PRLO, cmdiocb, ndlp, NULL, 0); - return ndlp->nlp_state; + lpfc_els_rsp_acc(phba, ELS_CMD_ACC, cmdiocb, ndlp, NULL, 0); + return (ndlp->nlp_state); } static uint32_t @@ -1275,10 +1220,9 @@ lpfc_cmpl_prli_prli_issue(struct lpfc_hba * phba, irsp = &rspiocb->iocb; if (irsp->ulpStatus) { - ndlp->nlp_prev_state = NLP_STE_PRLI_ISSUE; ndlp->nlp_state = NLP_STE_UNMAPPED_NODE; lpfc_nlp_list(phba, ndlp, NLP_UNMAPPED_LIST); - return ndlp->nlp_state; + return (ndlp->nlp_state); } /* Check out PRLI rsp */ @@ -1294,10 +1238,9 @@ lpfc_cmpl_prli_prli_issue(struct lpfc_hba * phba, ndlp->nlp_fcp_info |= NLP_FCP_2_DEVICE; } - ndlp->nlp_prev_state = NLP_STE_PRLI_ISSUE; ndlp->nlp_state = NLP_STE_MAPPED_NODE; lpfc_nlp_list(phba, ndlp, NLP_MAPPED_LIST); - return ndlp->nlp_state; + return (ndlp->nlp_state); } /*! lpfc_device_rm_prli_issue @@ -1321,17 +1264,11 @@ static uint32_t lpfc_device_rm_prli_issue(struct lpfc_hba * phba, struct lpfc_nodelist * ndlp, void *arg, uint32_t evt) { - if(ndlp->nlp_flag & NLP_NPR_2B_DISC) { - ndlp->nlp_flag |= NLP_NODEV_REMOVE; - return ndlp->nlp_state; - } - else { - /* software abort outstanding PLOGI */ - lpfc_els_abort(phba, ndlp, 1); + /* software abort outstanding PRLI */ + lpfc_els_abort(phba, ndlp, 1); - lpfc_nlp_list(phba, ndlp, NLP_NO_LIST); - return NLP_STE_FREED_NODE; - } + lpfc_nlp_list(phba, ndlp, NLP_NO_LIST); + return (NLP_STE_FREED_NODE); } @@ -1358,13 +1295,12 @@ lpfc_device_recov_prli_issue(struct lpfc_hba * phba, /* software abort outstanding PRLI */ lpfc_els_abort(phba, ndlp, 1); - ndlp->nlp_prev_state = NLP_STE_PRLI_ISSUE; ndlp->nlp_state = NLP_STE_NPR_NODE; lpfc_nlp_list(phba, ndlp, NLP_NPR_LIST); spin_lock_irq(phba->host->host_lock); - ndlp->nlp_flag &= ~(NLP_NODEV_REMOVE | NLP_NPR_2B_DISC); + ndlp->nlp_flag &= ~NLP_NPR_2B_DISC; spin_unlock_irq(phba->host->host_lock); - return ndlp->nlp_state; + return (ndlp->nlp_state); } static uint32_t @@ -1376,7 +1312,7 @@ lpfc_rcv_plogi_unmap_node(struct lpfc_hba * phba, cmdiocb = (struct lpfc_iocbq *) arg; lpfc_rcv_plogi(phba, ndlp, cmdiocb); - return ndlp->nlp_state; + return (ndlp->nlp_state); } static uint32_t @@ -1389,7 +1325,7 @@ lpfc_rcv_prli_unmap_node(struct lpfc_hba * phba, lpfc_rcv_prli(phba, ndlp, cmdiocb); lpfc_els_rsp_prli_acc(phba, cmdiocb, ndlp); - return ndlp->nlp_state; + return (ndlp->nlp_state); } static uint32_t @@ -1400,8 +1336,8 @@ lpfc_rcv_logo_unmap_node(struct lpfc_hba * phba, cmdiocb = (struct lpfc_iocbq *) arg; - lpfc_rcv_logo(phba, ndlp, cmdiocb, ELS_CMD_LOGO); - return ndlp->nlp_state; + lpfc_rcv_logo(phba, ndlp, cmdiocb); + return (ndlp->nlp_state); } static uint32_t @@ -1413,7 +1349,7 @@ lpfc_rcv_padisc_unmap_node(struct lpfc_hba * phba, cmdiocb = (struct lpfc_iocbq *) arg; lpfc_rcv_padisc(phba, ndlp, cmdiocb); - return ndlp->nlp_state; + return (ndlp->nlp_state); } static uint32_t @@ -1424,21 +1360,21 @@ lpfc_rcv_prlo_unmap_node(struct lpfc_hba * phba, cmdiocb = (struct lpfc_iocbq *) arg; - lpfc_els_rsp_acc(phba, ELS_CMD_PRLO, cmdiocb, ndlp, NULL, 0); - return ndlp->nlp_state; + /* Treat like rcv logo */ + lpfc_rcv_logo(phba, ndlp, cmdiocb); + return (ndlp->nlp_state); } static uint32_t lpfc_device_recov_unmap_node(struct lpfc_hba * phba, struct lpfc_nodelist * ndlp, void *arg, uint32_t evt) { - ndlp->nlp_prev_state = NLP_STE_UNMAPPED_NODE; ndlp->nlp_state = NLP_STE_NPR_NODE; lpfc_nlp_list(phba, ndlp, NLP_NPR_LIST); - ndlp->nlp_flag &= ~(NLP_NODEV_REMOVE | NLP_NPR_2B_DISC); + ndlp->nlp_flag &= ~NLP_NPR_2B_DISC; lpfc_disc_set_adisc(phba, ndlp); - return ndlp->nlp_state; + return (ndlp->nlp_state); } static uint32_t @@ -1450,7 +1386,7 @@ lpfc_rcv_plogi_mapped_node(struct lpfc_hba * phba, cmdiocb = (struct lpfc_iocbq *) arg; lpfc_rcv_plogi(phba, ndlp, cmdiocb); - return ndlp->nlp_state; + return (ndlp->nlp_state); } static uint32_t @@ -1462,7 +1398,7 @@ lpfc_rcv_prli_mapped_node(struct lpfc_hba * phba, cmdiocb = (struct lpfc_iocbq *) arg; lpfc_els_rsp_prli_acc(phba, cmdiocb, ndlp); - return ndlp->nlp_state; + return (ndlp->nlp_state); } static uint32_t @@ -1473,8 +1409,8 @@ lpfc_rcv_logo_mapped_node(struct lpfc_hba * phba, cmdiocb = (struct lpfc_iocbq *) arg; - lpfc_rcv_logo(phba, ndlp, cmdiocb, ELS_CMD_LOGO); - return ndlp->nlp_state; + lpfc_rcv_logo(phba, ndlp, cmdiocb); + return (ndlp->nlp_state); } static uint32_t @@ -1487,7 +1423,7 @@ lpfc_rcv_padisc_mapped_node(struct lpfc_hba * phba, cmdiocb = (struct lpfc_iocbq *) arg; lpfc_rcv_padisc(phba, ndlp, cmdiocb); - return ndlp->nlp_state; + return (ndlp->nlp_state); } static uint32_t @@ -1505,8 +1441,8 @@ lpfc_rcv_prlo_mapped_node(struct lpfc_hba * phba, spin_unlock_irq(phba->host->host_lock); /* Treat like rcv logo */ - lpfc_rcv_logo(phba, ndlp, cmdiocb, ELS_CMD_PRLO); - return ndlp->nlp_state; + lpfc_rcv_logo(phba, ndlp, cmdiocb); + return (ndlp->nlp_state); } static uint32_t @@ -1514,14 +1450,13 @@ lpfc_device_recov_mapped_node(struct lpfc_hba * phba, struct lpfc_nodelist * ndlp, void *arg, uint32_t evt) { - ndlp->nlp_prev_state = NLP_STE_MAPPED_NODE; ndlp->nlp_state = NLP_STE_NPR_NODE; lpfc_nlp_list(phba, ndlp, NLP_NPR_LIST); spin_lock_irq(phba->host->host_lock); - ndlp->nlp_flag &= ~(NLP_NODEV_REMOVE | NLP_NPR_2B_DISC); + ndlp->nlp_flag &= ~NLP_NPR_2B_DISC; spin_unlock_irq(phba->host->host_lock); lpfc_disc_set_adisc(phba, ndlp); - return ndlp->nlp_state; + return (ndlp->nlp_state); } static uint32_t @@ -1535,25 +1470,23 @@ lpfc_rcv_plogi_npr_node(struct lpfc_hba * phba, /* Ignore PLOGI if we have an outstanding LOGO */ if (ndlp->nlp_flag & NLP_LOGO_SND) { - return ndlp->nlp_state; + return (ndlp->nlp_state); } if (lpfc_rcv_plogi(phba, ndlp, cmdiocb)) { spin_lock_irq(phba->host->host_lock); - ndlp->nlp_flag &= ~NLP_NPR_ADISC; + ndlp->nlp_flag &= ~(NLP_NPR_ADISC | NLP_NPR_2B_DISC); spin_unlock_irq(phba->host->host_lock); - return ndlp->nlp_state; + return (ndlp->nlp_state); } /* send PLOGI immediately, move to PLOGI issue state */ if (!(ndlp->nlp_flag & NLP_DELAY_TMO)) { - ndlp->nlp_prev_state = NLP_STE_NPR_NODE; - ndlp->nlp_state = NLP_STE_PLOGI_ISSUE; - lpfc_nlp_list(phba, ndlp, NLP_PLOGI_LIST); - lpfc_issue_els_plogi(phba, ndlp->nlp_DID, 0); + ndlp->nlp_state = NLP_STE_PLOGI_ISSUE; + lpfc_nlp_list(phba, ndlp, NLP_PLOGI_LIST); + lpfc_issue_els_plogi(phba, ndlp, 0); } - - return ndlp->nlp_state; + return (ndlp->nlp_state); } static uint32_t @@ -1573,22 +1506,16 @@ lpfc_rcv_prli_npr_node(struct lpfc_hba * phba, if (!(ndlp->nlp_flag & NLP_DELAY_TMO)) { if (ndlp->nlp_flag & NLP_NPR_ADISC) { - spin_lock_irq(phba->host->host_lock); - ndlp->nlp_flag &= ~NLP_NPR_ADISC; - spin_unlock_irq(phba->host->host_lock); - ndlp->nlp_prev_state = NLP_STE_NPR_NODE; ndlp->nlp_state = NLP_STE_ADISC_ISSUE; lpfc_nlp_list(phba, ndlp, NLP_ADISC_LIST); lpfc_issue_els_adisc(phba, ndlp, 0); } else { - ndlp->nlp_prev_state = NLP_STE_NPR_NODE; ndlp->nlp_state = NLP_STE_PLOGI_ISSUE; lpfc_nlp_list(phba, ndlp, NLP_PLOGI_LIST); - lpfc_issue_els_plogi(phba, ndlp->nlp_DID, 0); + lpfc_issue_els_plogi(phba, ndlp, 0); } - } - return ndlp->nlp_state; + return (ndlp->nlp_state); } static uint32_t @@ -1600,8 +1527,8 @@ lpfc_rcv_logo_npr_node(struct lpfc_hba * phba, cmdiocb = (struct lpfc_iocbq *) arg; - lpfc_rcv_logo(phba, ndlp, cmdiocb, ELS_CMD_LOGO); - return ndlp->nlp_state; + lpfc_rcv_logo(phba, ndlp, cmdiocb); + return (ndlp->nlp_state); } static uint32_t @@ -1615,26 +1542,18 @@ lpfc_rcv_padisc_npr_node(struct lpfc_hba * phba, lpfc_rcv_padisc(phba, ndlp, cmdiocb); - /* - * 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_DELAY_TMO)) { if (ndlp->nlp_flag & NLP_NPR_ADISC) { - ndlp->nlp_prev_state = NLP_STE_NPR_NODE; ndlp->nlp_state = NLP_STE_ADISC_ISSUE; lpfc_nlp_list(phba, ndlp, NLP_ADISC_LIST); lpfc_issue_els_adisc(phba, ndlp, 0); } else { - ndlp->nlp_prev_state = NLP_STE_NPR_NODE; ndlp->nlp_state = NLP_STE_PLOGI_ISSUE; lpfc_nlp_list(phba, ndlp, NLP_PLOGI_LIST); - lpfc_issue_els_plogi(phba, ndlp->nlp_DID, 0); + lpfc_issue_els_plogi(phba, ndlp, 0); } } - return ndlp->nlp_state; + return (ndlp->nlp_state); } static uint32_t @@ -1646,61 +1565,25 @@ lpfc_rcv_prlo_npr_node(struct lpfc_hba * phba, cmdiocb = (struct lpfc_iocbq *) arg; - spin_lock_irq(phba->host->host_lock); - ndlp->nlp_flag |= NLP_LOGO_ACC; - spin_unlock_irq(phba->host->host_lock); - lpfc_els_rsp_acc(phba, ELS_CMD_ACC, cmdiocb, ndlp, NULL, 0); - if (!(ndlp->nlp_flag & NLP_DELAY_TMO)) { - mod_timer(&ndlp->nlp_delayfunc, jiffies + HZ * 1); - spin_lock_irq(phba->host->host_lock); - ndlp->nlp_flag |= NLP_DELAY_TMO; - ndlp->nlp_flag &= ~NLP_NPR_ADISC; - spin_unlock_irq(phba->host->host_lock); - ndlp->nlp_last_elscmd = ELS_CMD_PLOGI; - } else { - spin_lock_irq(phba->host->host_lock); - ndlp->nlp_flag &= ~NLP_NPR_ADISC; - spin_unlock_irq(phba->host->host_lock); - } - return ndlp->nlp_state; -} - -static uint32_t -lpfc_cmpl_plogi_npr_node(struct lpfc_hba * phba, - struct lpfc_nodelist * ndlp, void *arg, uint32_t evt) -{ - struct lpfc_iocbq *cmdiocb, *rspiocb; - IOCB_t *irsp; - - cmdiocb = (struct lpfc_iocbq *) arg; - rspiocb = cmdiocb->context_un.rsp_iocb; - - irsp = &rspiocb->iocb; - if (irsp->ulpStatus) { - lpfc_nlp_list(phba, ndlp, NLP_NO_LIST); - return NLP_STE_FREED_NODE; + if (ndlp->nlp_flag & NLP_DELAY_TMO) { + if (ndlp->nlp_last_elscmd == (unsigned long)ELS_CMD_PLOGI) { + return (ndlp->nlp_state); + } else { + spin_lock_irq(phba->host->host_lock); + ndlp->nlp_flag &= ~NLP_DELAY_TMO; + spin_unlock_irq(phba->host->host_lock); + del_timer_sync(&ndlp->nlp_delayfunc); + if (!list_empty(&ndlp->els_retry_evt.evt_listp)) + list_del_init(&ndlp->els_retry_evt.evt_listp); + } } - return ndlp->nlp_state; -} -static uint32_t -lpfc_cmpl_prli_npr_node(struct lpfc_hba * phba, - struct lpfc_nodelist * ndlp, void *arg, uint32_t evt) -{ - struct lpfc_iocbq *cmdiocb, *rspiocb; - IOCB_t *irsp; - - cmdiocb = (struct lpfc_iocbq *) arg; - rspiocb = cmdiocb->context_un.rsp_iocb; - - irsp = &rspiocb->iocb; - if (irsp->ulpStatus && (ndlp->nlp_flag & NLP_NODEV_REMOVE)) { - lpfc_nlp_list(phba, ndlp, NLP_NO_LIST); - return NLP_STE_FREED_NODE; - } - return ndlp->nlp_state; + ndlp->nlp_state = NLP_STE_PLOGI_ISSUE; + lpfc_nlp_list(phba, ndlp, NLP_PLOGI_LIST); + lpfc_issue_els_plogi(phba, ndlp, 0); + return (ndlp->nlp_state); } static uint32_t @@ -1709,26 +1592,7 @@ lpfc_cmpl_logo_npr_node(struct lpfc_hba * phba, { lpfc_unreg_rpi(phba, ndlp); /* This routine does nothing, just return the current state */ - return ndlp->nlp_state; -} - -static uint32_t -lpfc_cmpl_adisc_npr_node(struct lpfc_hba * phba, - struct lpfc_nodelist * ndlp, void *arg, - uint32_t evt) -{ - struct lpfc_iocbq *cmdiocb, *rspiocb; - IOCB_t *irsp; - - cmdiocb = (struct lpfc_iocbq *) arg; - rspiocb = cmdiocb->context_un.rsp_iocb; - - irsp = &rspiocb->iocb; - if (irsp->ulpStatus && (ndlp->nlp_flag & NLP_NODEV_REMOVE)) { - lpfc_nlp_list(phba, ndlp, NLP_NO_LIST); - return NLP_STE_FREED_NODE; - } - return ndlp->nlp_state; + return (ndlp->nlp_state); } static uint32_t @@ -1742,15 +1606,9 @@ lpfc_cmpl_reglogin_npr_node(struct lpfc_hba * phba, pmb = (LPFC_MBOXQ_t *) arg; mb = &pmb->mb; - if (!mb->mbxStatus) - ndlp->nlp_rpi = mb->un.varWords[0]; - else { - if (ndlp->nlp_flag & NLP_NODEV_REMOVE) { - lpfc_nlp_list(phba, ndlp, NLP_NO_LIST); - return NLP_STE_FREED_NODE; - } - } - return ndlp->nlp_state; + ndlp->nlp_rpi = mb->un.varWords[0]; + + return (ndlp->nlp_state); } static uint32_t @@ -1758,12 +1616,8 @@ lpfc_device_rm_npr_node(struct lpfc_hba * phba, struct lpfc_nodelist * ndlp, void *arg, uint32_t evt) { - if (ndlp->nlp_flag & NLP_NPR_2B_DISC) { - ndlp->nlp_flag |= NLP_NODEV_REMOVE; - return ndlp->nlp_state; - } lpfc_nlp_list(phba, ndlp, NLP_NO_LIST); - return NLP_STE_FREED_NODE; + return (NLP_STE_FREED_NODE); } static uint32_t @@ -1772,12 +1626,9 @@ lpfc_device_recov_npr_node(struct lpfc_hba * phba, uint32_t evt) { spin_lock_irq(phba->host->host_lock); - ndlp->nlp_flag &= ~(NLP_NODEV_REMOVE | NLP_NPR_2B_DISC); + ndlp->nlp_flag &= ~NLP_NPR_2B_DISC; spin_unlock_irq(phba->host->host_lock); - if (ndlp->nlp_flag & NLP_DELAY_TMO) { - lpfc_cancel_retry_delay_tmo(phba, ndlp); - } - return ndlp->nlp_state; + return (ndlp->nlp_state); } @@ -1856,7 +1707,7 @@ static uint32_t (*lpfc_disc_action[NLP_STE_MAX_STATE * NLP_EVT_MAX_EVENT]) lpfc_rcv_plogi_plogi_issue, /* RCV_PLOGI PLOGI_ISSUE */ lpfc_rcv_els_plogi_issue, /* RCV_PRLI */ - lpfc_rcv_logo_plogi_issue, /* RCV_LOGO */ + lpfc_rcv_els_plogi_issue, /* RCV_LOGO */ lpfc_rcv_els_plogi_issue, /* RCV_ADISC */ lpfc_rcv_els_plogi_issue, /* RCV_PDISC */ lpfc_rcv_els_plogi_issue, /* RCV_PRLO */ @@ -1944,10 +1795,10 @@ static uint32_t (*lpfc_disc_action[NLP_STE_MAX_STATE * NLP_EVT_MAX_EVENT]) lpfc_rcv_padisc_npr_node, /* RCV_ADISC */ lpfc_rcv_padisc_npr_node, /* RCV_PDISC */ lpfc_rcv_prlo_npr_node, /* RCV_PRLO */ - lpfc_cmpl_plogi_npr_node, /* CMPL_PLOGI */ - lpfc_cmpl_prli_npr_node, /* CMPL_PRLI */ + lpfc_disc_noop, /* CMPL_PLOGI */ + lpfc_disc_noop, /* CMPL_PRLI */ lpfc_cmpl_logo_npr_node, /* CMPL_LOGO */ - lpfc_cmpl_adisc_npr_node, /* CMPL_ADISC */ + lpfc_disc_noop, /* CMPL_ADISC */ lpfc_cmpl_reglogin_npr_node, /* CMPL_REG_LOGIN */ lpfc_device_rm_npr_node, /* DEVICE_RM */ lpfc_device_recov_npr_node, /* DEVICE_RECOVERY */ @@ -1993,9 +1844,10 @@ lpfc_disc_state_machine(struct lpfc_hba * phba, ndlp->nlp_flag &= ~NLP_DELAY_REMOVE; spin_unlock_irq(phba->host->host_lock); lpfc_nlp_remove(phba, ndlp); - return NLP_STE_FREED_NODE; + return (NLP_STE_FREED_NODE); } if (rc == NLP_STE_FREED_NODE) - return NLP_STE_FREED_NODE; - return rc; + return (NLP_STE_FREED_NODE); + ndlp->nlp_state = rc; + return (rc); } diff --git a/drivers/scsi/lpfc/lpfc_scsi.c b/drivers/scsi/lpfc/lpfc_scsi.c index a8816a873..dafabeefc 100644 --- a/drivers/scsi/lpfc/lpfc_scsi.c +++ b/drivers/scsi/lpfc/lpfc_scsi.c @@ -1,7 +1,7 @@ /******************************************************************* * This file is part of the Emulex Linux Device Driver for * * Fibre Channel Host Bus Adapters. * - * Copyright (C) 2004-2006 Emulex. All rights reserved. * + * Copyright (C) 2004-2005 Emulex. All rights reserved. * * EMULEX and SLI are trademarks of Emulex. * * www.emulex.com * * Portions Copyright (C) 2004-2005 Christoph Hellwig * @@ -21,7 +21,6 @@ #include #include -#include #include #include @@ -42,6 +41,20 @@ #define LPFC_ABORT_WAIT 2 +static inline void +lpfc_block_requests(struct lpfc_hba * phba) +{ + down(&phba->hba_can_block); + scsi_block_requests(phba->host); +} + +static inline void +lpfc_unblock_requests(struct lpfc_hba * phba) +{ + scsi_unblock_requests(phba->host); + up(&phba->hba_can_block); +} + /* * This routine allocates a scsi buffer, which contains all the necessary * information needed to initiate a SCSI I/O. The non-DMAable buffer region @@ -154,6 +167,22 @@ static void lpfc_release_scsi_buf(struct lpfc_hba * phba, struct lpfc_scsi_buf * psb) { unsigned long iflag = 0; + /* + * There are only two special cases to consider. (1) the scsi command + * requested scatter-gather usage or (2) the scsi command allocated + * 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); psb->pCmd = NULL; @@ -266,27 +295,6 @@ 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) { @@ -459,13 +467,7 @@ lpfc_scsi_cmd_iocb_cmpl(struct lpfc_hba *phba, struct lpfc_iocbq *pIocbIn, 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 && + if (!result && ((jiffies - pnode->last_ramp_up_time) > LPFC_Q_RAMP_UP_INTERVAL * HZ) && ((jiffies - pnode->last_q_full_time) > @@ -493,7 +495,7 @@ lpfc_scsi_cmd_iocb_cmpl(struct lpfc_hba *phba, struct lpfc_iocbq *pIocbIn, * 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) { + if (result == SAM_STAT_TASK_SET_FULL) { pnode->last_q_full_time = jiffies; shost_for_each_device(tmp_sdev, sdev->host) { @@ -518,7 +520,6 @@ lpfc_scsi_cmd_iocb_cmpl(struct lpfc_hba *phba, struct lpfc_iocbq *pIocbIn, } } - lpfc_scsi_unprep_dma_buf(phba, lpfc_cmd); lpfc_release_scsi_buf(phba, lpfc_cmd); } @@ -617,14 +618,14 @@ 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 lpfc_rport_data *rdata = lpfc_cmd->rdata; + struct scsi_device *scsi_dev = lpfc_cmd->pCmd->device; + struct lpfc_rport_data *rdata = scsi_dev->hostdata; struct lpfc_nodelist *ndlp = rdata->pnode; if ((ndlp == NULL) || (ndlp->nlp_state != NLP_STE_MAPPED_NODE)) { @@ -636,7 +637,8 @@ lpfc_scsi_prep_task_mgmt_cmd(struct lpfc_hba *phba, piocb = &piocbq->iocb; fcp_cmnd = lpfc_cmd->fcp_cmnd; - int_to_scsilun(lun, &lpfc_cmd->fcp_cmnd->fcp_lun); + int_to_scsilun(lpfc_cmd->pCmd->device->lun, + &lpfc_cmd->fcp_cmnd->fcp_lun); fcp_cmnd->fcpCntl2 = task_mgmt_cmd; piocb->ulpCommand = CMD_FCP_ICMND64_CR; @@ -658,21 +660,57 @@ 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, - unsigned tgt_id, unsigned int lun, - struct lpfc_rport_data *rdata) +lpfc_scsi_tgt_reset(struct lpfc_scsi_buf * lpfc_cmd, struct lpfc_hba * phba) { struct lpfc_iocbq *iocbq; struct lpfc_iocbq *iocbqrsp; int ret; - lpfc_cmd->rdata = rdata; - ret = lpfc_scsi_prep_task_mgmt_cmd(phba, lpfc_cmd, lun, - FCP_TARGET_RESET); + ret = lpfc_scsi_prep_task_mgmt_cmd(phba, lpfc_cmd, FCP_TARGET_RESET); if (!ret) return FAILED; @@ -683,13 +721,6 @@ lpfc_scsi_tgt_reset(struct lpfc_scsi_buf * lpfc_cmd, struct lpfc_hba * phba, if (!iocbqrsp) return FAILED; - /* 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); @@ -712,7 +743,7 @@ lpfc_scsi_tgt_reset(struct lpfc_scsi_buf * lpfc_cmd, struct lpfc_hba * phba, const char * lpfc_info(struct Scsi_Host *host) { - struct lpfc_hba *phba = (struct lpfc_hba *) host->hostdata; + struct lpfc_hba *phba = (struct lpfc_hba *) host->hostdata[0]; int len; static char lpfcinfobuf[384]; @@ -772,7 +803,7 @@ static int lpfc_queuecommand(struct scsi_cmnd *cmnd, void (*done) (struct scsi_cmnd *)) { struct lpfc_hba *phba = - (struct lpfc_hba *) cmnd->device->host->hostdata; + (struct lpfc_hba *) cmnd->device->host->hostdata[0]; struct lpfc_sli *psli = &phba->sli; struct lpfc_rport_data *rdata = cmnd->device->hostdata; struct lpfc_nodelist *ndlp = rdata->pnode; @@ -832,7 +863,6 @@ lpfc_queuecommand(struct scsi_cmnd *cmnd, void (*done) (struct scsi_cmnd *)) return 0; out_host_busy_free_buf: - lpfc_scsi_unprep_dma_buf(phba, lpfc_cmd); lpfc_release_scsi_buf(phba, lpfc_cmd); out_host_busy: return SCSI_MLQUEUE_HOST_BUSY; @@ -842,27 +872,12 @@ 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 Scsi_Host *shost = cmnd->device->host; - struct lpfc_hba *phba = (struct lpfc_hba *)shost->hostdata; + struct lpfc_hba *phba = (struct lpfc_hba *)shost->hostdata[0]; struct lpfc_sli_ring *pring = &phba->sli.ring[phba->sli.fcp_ring]; struct lpfc_iocbq *iocb; struct lpfc_iocbq *abtsiocb; @@ -871,7 +886,7 @@ lpfc_abort_handler(struct scsi_cmnd *cmnd) unsigned int loop_count = 0; int ret = SUCCESS; - lpfc_block_error_handler(cmnd); + lpfc_block_requests(phba); spin_lock_irq(shost->host_lock); lpfc_cmd = (struct lpfc_scsi_buf *)cmnd->host_scribble; @@ -957,6 +972,7 @@ lpfc_abort_handler(struct scsi_cmnd *cmnd) cmnd->device->lun, cmnd->serial_number); spin_unlock_irq(shost->host_lock); + lpfc_unblock_requests(phba); return ret; } @@ -965,7 +981,7 @@ 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; + struct lpfc_hba *phba = (struct lpfc_hba *)shost->hostdata[0]; struct lpfc_scsi_buf *lpfc_cmd; struct lpfc_iocbq *iocbq, *iocbqrsp; struct lpfc_rport_data *rdata = cmnd->device->hostdata; @@ -974,7 +990,7 @@ lpfc_reset_lun_handler(struct scsi_cmnd *cmnd) int ret = FAILED; int cnt, loopcnt; - lpfc_block_error_handler(cmnd); + lpfc_block_requests(phba); spin_lock_irq(shost->host_lock); /* * If target is not in a MAPPED state, delay the reset until @@ -997,12 +1013,11 @@ lpfc_reset_lun_handler(struct scsi_cmnd *cmnd) 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, cmnd->device->lun, - FCP_LUN_RESET); + ret = lpfc_scsi_prep_task_mgmt_cmd(phba, lpfc_cmd, FCP_LUN_RESET); if (!ret) goto out_free_scsi_buf; @@ -1013,11 +1028,6 @@ lpfc_reset_lun_handler(struct scsi_cmnd *cmnd) if (iocbqrsp == NULL) goto out_free_scsi_buf; - 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(phba, &phba->sli.ring[phba->sli.fcp_ring], iocbq, iocbqrsp, lpfc_cmd->timeout); @@ -1029,6 +1039,7 @@ lpfc_reset_lun_handler(struct scsi_cmnd *cmnd) cmd_status = iocbqrsp->iocb.ulpStatus; lpfc_sli_release_iocbq(phba, iocbqrsp); + lpfc_release_scsi_buf(phba, lpfc_cmd); /* * All outstanding txcmplq I/Os should have been aborted by the device. @@ -1067,8 +1078,6 @@ lpfc_reset_lun_handler(struct scsi_cmnd *cmnd) } 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", @@ -1077,6 +1086,7 @@ out_free_scsi_buf: out: spin_unlock_irq(shost->host_lock); + lpfc_unblock_requests(phba); return ret; } @@ -1084,14 +1094,15 @@ 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; + struct lpfc_hba *phba = (struct lpfc_hba *)shost->hostdata[0]; 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; - lpfc_block_error_handler(cmnd); + lpfc_block_requests(phba); spin_lock_irq(shost->host_lock); lpfc_cmd = lpfc_get_scsi_buf(phba); @@ -1100,6 +1111,7 @@ lpfc_reset_bus_handler(struct scsi_cmnd *cmnd) /* The lpfc_cmd storage is reused. Set all loop invariants. */ lpfc_cmd->timeout = 60; + lpfc_cmd->pCmd = cmnd; lpfc_cmd->scsi_hba = phba; /* @@ -1107,7 +1119,8 @@ 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. */ - for (i = 0; i < LPFC_MAX_TARGET; i++) { + midlayer_id = cmnd->device->id; + for (i = 0; i < MAX_FCP_TARGET; i++) { /* Search the mapped list for this target ID */ match = 0; list_for_each_entry(ndlp, &phba->fc_nlpmap_list, nlp_listp) { @@ -1119,11 +1132,12 @@ lpfc_reset_bus_handler(struct scsi_cmnd *cmnd) if (!match) continue; - ret = lpfc_scsi_tgt_reset(lpfc_cmd, phba, i, cmnd->device->lun, - ndlp->rport->dd_data); + lpfc_cmd->pCmd->device->id = i; + lpfc_cmd->pCmd->device->hostdata = ndlp->rport->dd_data; + ret = lpfc_scsi_tgt_reset(lpfc_cmd, phba); if (ret != SUCCESS) { lpfc_printf_log(phba, KERN_ERR, LOG_FCP, - "%d:0700 Bus Reset on target %d failed\n", + "%d:0713 Bus Reset on target %d failed\n", phba->brd_no, i); err_count++; } @@ -1139,6 +1153,7 @@ lpfc_reset_bus_handler(struct scsi_cmnd *cmnd) * the targets. Unfortunately, some targets do not abide by * this forcing the driver to double check. */ + cmnd->device->id = midlayer_id; cnt = lpfc_sli_sum_iocb(phba, &phba->sli.ring[phba->sli.fcp_ring], 0, 0, LPFC_CTX_HOST); if (cnt) @@ -1173,13 +1188,14 @@ lpfc_reset_bus_handler(struct scsi_cmnd *cmnd) phba->brd_no, ret); out: spin_unlock_irq(shost->host_lock); + lpfc_unblock_requests(phba); return ret; } static int lpfc_slave_alloc(struct scsi_device *sdev) { - struct lpfc_hba *phba = (struct lpfc_hba *)sdev->host->hostdata; + struct lpfc_hba *phba = (struct lpfc_hba *)sdev->host->hostdata[0]; struct lpfc_scsi_buf *scsi_buf = NULL; struct fc_rport *rport = starget_to_rport(scsi_target(sdev)); uint32_t total = 0, i; @@ -1235,7 +1251,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; + struct lpfc_hba *phba = (struct lpfc_hba *) sdev->host->hostdata[0]; struct fc_rport *rport = starget_to_rport(sdev->sdev_target); if (sdev->tagged_supported) diff --git a/drivers/scsi/lpfc/lpfc_scsi.h b/drivers/scsi/lpfc/lpfc_scsi.h index cdcd25358..acd64c49e 100644 --- a/drivers/scsi/lpfc/lpfc_scsi.h +++ b/drivers/scsi/lpfc/lpfc_scsi.h @@ -23,13 +23,10 @@ struct lpfc_hba; #define list_remove_head(list, entry, type, member) \ - do { \ - entry = NULL; \ if (!list_empty(list)) { \ entry = list_entry((list)->next, type, member); \ list_del_init(&entry->member); \ - } \ - } while(0) + } #define list_get_first(list, type, member) \ (list_empty(list)) ? NULL : \ diff --git a/drivers/scsi/lpfc/lpfc_sli.c b/drivers/scsi/lpfc/lpfc_sli.c index 70f4d5a13..7b785ade8 100644 --- a/drivers/scsi/lpfc/lpfc_sli.c +++ b/drivers/scsi/lpfc/lpfc_sli.c @@ -1,7 +1,7 @@ /******************************************************************* * This file is part of the Emulex Linux Device Driver for * * Fibre Channel Host Bus Adapters. * - * Copyright (C) 2004-2006 Emulex. All rights reserved. * + * Copyright (C) 2004-2005 Emulex. All rights reserved. * * EMULEX and SLI are trademarks of Emulex. * * www.emulex.com * * Portions Copyright (C) 2004-2005 Christoph Hellwig * @@ -191,12 +191,35 @@ 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); } @@ -320,8 +343,7 @@ 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", @@ -491,9 +513,7 @@ lpfc_sli_chk_mbx_command(uint8_t mbxCommand) case MBX_SET_MASK: case MBX_SET_SLIM: case MBX_UNREG_D_ID: - case MBX_KILL_BOARD: case MBX_CONFIG_FARP: - case MBX_BEACON: case MBX_LOAD_AREA: case MBX_RUN_BIU_DIAG64: case MBX_CONFIG_PORT: @@ -579,7 +599,7 @@ lpfc_sli_handle_mb_event(struct lpfc_hba * phba) /* Stray Mailbox Interrupt, mbxCommand mbxStatus */ lpfc_printf_log(phba, - KERN_WARNING, + KERN_ERR, LOG_MBOX | LOG_SLI, "%d:0304 Stray Mailbox Interrupt " "mbxCommand x%x mbxStatus x%x\n", @@ -744,9 +764,7 @@ lpfc_sli_process_unsol_iocb(struct lpfc_hba *phba, struct lpfc_sli_ring *pring, } /* unSolicited Responses */ if (pring->prt[0].profile) { - if (pring->prt[0].lpfc_sli_rcv_unsol_event) - (pring->prt[0].lpfc_sli_rcv_unsol_event) (phba, pring, - saveq); + (pring->prt[0].lpfc_sli_rcv_unsol_event) (phba, pring, saveq); match = 1; } else { /* We must search, based on rctl / type @@ -757,9 +775,8 @@ lpfc_sli_process_unsol_iocb(struct lpfc_hba *phba, struct lpfc_sli_ring *pring, Rctl) && (pring->prt[i]. type == Type)) { - if (pring->prt[i].lpfc_sli_rcv_unsol_event) - (pring->prt[i].lpfc_sli_rcv_unsol_event) - (phba, pring, saveq); + (pring->prt[i].lpfc_sli_rcv_unsol_event) + (phba, pring, saveq); match = 1; break; } @@ -970,11 +987,9 @@ void lpfc_sli_poll_fcp_ring(struct lpfc_hba * phba) * resources need to be recovered. */ if (unlikely(irsp->ulpCommand == CMD_XRI_ABORTED_CX)) { - lpfc_printf_log(phba, KERN_INFO, LOG_SLI, - "%d:0314 IOCB cmd 0x%x" - " processed. Skipping" - " completion", phba->brd_no, - irsp->ulpCommand); + printk(KERN_INFO "%s: IOCB cmd 0x%x processed." + " Skipping completion\n", __FUNCTION__, + irsp->ulpCommand); break; } @@ -1107,7 +1122,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:0336 Rsp Ring %d error: IOCB Data: " + "%d:0326 Rsp Ring %d error: IOCB Data: " "x%x x%x x%x x%x x%x x%x x%x x%x\n", phba->brd_no, pring->ringno, irsp->un.ulpWord[0], irsp->un.ulpWord[1], @@ -1125,28 +1140,21 @@ lpfc_sli_handle_fast_ring_event(struct lpfc_hba * phba, * resources need to be recovered. */ if (unlikely(irsp->ulpCommand == CMD_XRI_ABORTED_CX)) { - lpfc_printf_log(phba, KERN_INFO, LOG_SLI, - "%d:0333 IOCB cmd 0x%x" - " processed. Skipping" - " completion\n", phba->brd_no, - irsp->ulpCommand); + printk(KERN_INFO "%s: IOCB cmd 0x%x processed. " + "Skipping completion\n", __FUNCTION__, + irsp->ulpCommand); break; } cmdiocbq = lpfc_sli_iocbq_lookup(phba, pring, &rspiocbq); if ((cmdiocbq) && (cmdiocbq->iocb_cmpl)) { - if (phba->cfg_poll & ENABLE_FCP_RING_POLLING) { - (cmdiocbq->iocb_cmpl)(phba, cmdiocbq, - &rspiocbq); - } else { - spin_unlock_irqrestore( - phba->host->host_lock, iflag); - (cmdiocbq->iocb_cmpl)(phba, cmdiocbq, - &rspiocbq); - spin_lock_irqsave(phba->host->host_lock, - iflag); - } + spin_unlock_irqrestore( + phba->host->host_lock, iflag); + (cmdiocbq->iocb_cmpl)(phba, cmdiocbq, + &rspiocbq); + spin_lock_irqsave(phba->host->host_lock, + iflag); } break; default: @@ -1160,7 +1168,7 @@ lpfc_sli_handle_fast_ring_event(struct lpfc_hba * phba, } else { /* Unknown IOCB command */ lpfc_printf_log(phba, KERN_ERR, LOG_SLI, - "%d:0334 Unknown IOCB command " + "%d:0321 Unknown IOCB command " "Data: x%x, x%x x%x x%x x%x\n", phba->brd_no, type, irsp->ulpCommand, irsp->ulpStatus, irsp->ulpIoTag, @@ -1243,7 +1251,7 @@ lpfc_sli_handle_slow_ring_event(struct lpfc_hba * phba, lpfc_printf_log(phba, KERN_ERR, LOG_SLI, - "%d:0303 Ring %d handler: portRspPut %d " + "%d:0312 Ring %d handler: portRspPut %d " "is bigger then rsp ring %d\n", phba->brd_no, pring->ringno, portRspPut, portRspMax); @@ -1388,7 +1396,7 @@ lpfc_sli_handle_slow_ring_event(struct lpfc_hba * phba, lpfc_printf_log(phba, KERN_ERR, LOG_SLI, - "%d:0335 Unknown IOCB command " + "%d:0321 Unknown IOCB command " "Data: x%x x%x x%x x%x\n", phba->brd_no, irsp->ulpCommand, @@ -1404,11 +1412,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); } } @@ -1504,238 +1512,98 @@ lpfc_sli_abort_iocb_ring(struct lpfc_hba *phba, struct lpfc_sli_ring *pring) return errcnt; } -int -lpfc_sli_brdready(struct lpfc_hba * phba, uint32_t mask) -{ - uint32_t status; - int i = 0; - int retval = 0; - - /* Read the HBA Host Status Register */ - status = readl(phba->HSregaddr); - - /* - * Check status register every 100ms for 5 retries, then every - * 500ms for 5, then every 2.5 sec for 5, then reset board and - * every 2.5 sec for 4. - * Break our of the loop if errors occurred during init. - */ - while (((status & mask) != mask) && - !(status & HS_FFERM) && - i++ < 20) { - - if (i <= 5) - msleep(10); - else if (i <= 10) - msleep(500); - else - msleep(2500); - - if (i == 15) { - phba->hba_state = LPFC_STATE_UNKNOWN; /* Do post */ - lpfc_sli_brdrestart(phba); - } - /* Read the HBA Host Status Register */ - status = readl(phba->HSregaddr); - } - - /* Check to see if any errors occurred during init */ - if ((status & HS_FFERM) || (i >= 20)) { - phba->hba_state = LPFC_HBA_ERROR; - retval = 1; - } - - return retval; -} - -#define BARRIER_TEST_PATTERN (0xdeadbeef) - -void lpfc_reset_barrier(struct lpfc_hba * phba) -{ - uint32_t __iomem *resp_buf; - uint32_t __iomem *mbox_buf; - volatile uint32_t mbox; - uint32_t hc_copy; - int i; - uint8_t hdrtype; - - pci_read_config_byte(phba->pcidev, PCI_HEADER_TYPE, &hdrtype); - if (hdrtype != 0x80 || - (FC_JEDEC_ID(phba->vpd.rev.biuRev) != HELIOS_JEDEC_ID && - FC_JEDEC_ID(phba->vpd.rev.biuRev) != THOR_JEDEC_ID)) - return; - - /* - * Tell the other part of the chip to suspend temporarily all - * its DMA activity. - */ - resp_buf = phba->MBslimaddr; - - /* Disable the error attention */ - hc_copy = readl(phba->HCregaddr); - writel((hc_copy & ~HC_ERINT_ENA), phba->HCregaddr); - readl(phba->HCregaddr); /* flush */ - - if (readl(phba->HAregaddr) & HA_ERATT) { - /* Clear Chip error bit */ - writel(HA_ERATT, phba->HAregaddr); - phba->stopped = 1; - } - - mbox = 0; - ((MAILBOX_t *)&mbox)->mbxCommand = MBX_KILL_BOARD; - ((MAILBOX_t *)&mbox)->mbxOwner = OWN_CHIP; - - writel(BARRIER_TEST_PATTERN, (resp_buf + 1)); - mbox_buf = phba->MBslimaddr; - writel(mbox, mbox_buf); - - for (i = 0; - readl(resp_buf + 1) != ~(BARRIER_TEST_PATTERN) && i < 50; i++) - mdelay(1); - - if (readl(resp_buf + 1) != ~(BARRIER_TEST_PATTERN)) { - if (phba->sli.sli_flag & LPFC_SLI2_ACTIVE || - phba->stopped) - goto restore_hc; - else - goto clear_errat; - } - - ((MAILBOX_t *)&mbox)->mbxOwner = OWN_HOST; - for (i = 0; readl(resp_buf) != mbox && i < 500; i++) - mdelay(1); - -clear_errat: - - while (!(readl(phba->HAregaddr) & HA_ERATT) && ++i < 500) - mdelay(1); - - if (readl(phba->HAregaddr) & HA_ERATT) { - writel(HA_ERATT, phba->HAregaddr); - phba->stopped = 1; - } - -restore_hc: - writel(hc_copy, phba->HCregaddr); - readl(phba->HCregaddr); /* flush */ -} - -int -lpfc_sli_brdkill(struct lpfc_hba * phba) +/****************************************************************************** +* lpfc_sli_send_reset +* +* Note: After returning from this function, the HBA cannot be accessed for +* 1 ms. Since we do not wish to delay in interrupt context, it is the +* responsibility of the caller to perform the mdelay(1) and flush via readl(). +******************************************************************************/ +static int +lpfc_sli_send_reset(struct lpfc_hba * phba, uint16_t skip_post) { - struct lpfc_sli *psli; - LPFC_MBOXQ_t *pmb; - uint32_t status; - uint32_t ha_copy; - int retval; - int i = 0; - - psli = &phba->sli; + MAILBOX_t *swpmb; + volatile uint32_t word0; + void __iomem *to_slim; + unsigned long flags = 0; - /* Kill HBA */ - lpfc_printf_log(phba, - KERN_INFO, - LOG_SLI, - "%d:0329 Kill HBA Data: x%x x%x\n", - phba->brd_no, - phba->hba_state, - psli->sli_flag); + spin_lock_irqsave(phba->host->host_lock, flags); - if ((pmb = (LPFC_MBOXQ_t *) mempool_alloc(phba->mbox_mem_pool, - GFP_KERNEL)) == 0) - return 1; + /* A board reset must use REAL SLIM. */ + phba->sli.sli_flag &= ~LPFC_SLI2_ACTIVE; - /* Disable the error attention */ - spin_lock_irq(phba->host->host_lock); - status = readl(phba->HCregaddr); - status &= ~HC_ERINT_ENA; - writel(status, phba->HCregaddr); - readl(phba->HCregaddr); /* flush */ - spin_unlock_irq(phba->host->host_lock); + word0 = 0; + swpmb = (MAILBOX_t *) & word0; + swpmb->mbxCommand = MBX_RESTART; + swpmb->mbxHc = 1; - lpfc_kill_board(phba, pmb); - pmb->mbox_cmpl = lpfc_sli_def_mbox_cmpl; - retval = lpfc_sli_issue_mbox(phba, pmb, MBX_NOWAIT); + to_slim = phba->MBslimaddr; + writel(*(uint32_t *) swpmb, to_slim); + readl(to_slim); /* flush */ - if (retval != MBX_SUCCESS) { - if (retval != MBX_BUSY) - mempool_free(pmb, phba->mbox_mem_pool); - return 1; + /* Only skip post after fc_ffinit is completed */ + if (skip_post) { + word0 = 1; /* This is really setting up word1 */ + } else { + word0 = 0; /* This is really setting up word1 */ } + to_slim = phba->MBslimaddr + sizeof (uint32_t); + writel(*(uint32_t *) swpmb, to_slim); + readl(to_slim); /* flush */ - psli->sli_flag &= ~LPFC_SLI2_ACTIVE; - - mempool_free(pmb, phba->mbox_mem_pool); - - /* There is no completion for a KILL_BOARD mbox cmd. Check for an error - * attention every 100ms for 3 seconds. If we don't get ERATT after - * 3 seconds we still set HBA_ERROR state because the status of the - * board is now undefined. - */ - ha_copy = readl(phba->HAregaddr); - - while ((i++ < 30) && !(ha_copy & HA_ERATT)) { - mdelay(100); - ha_copy = readl(phba->HAregaddr); - } + /* Turn off parity checking and serr during the physical reset */ + pci_read_config_word(phba->pcidev, PCI_COMMAND, &phba->pci_cfg_value); + pci_write_config_word(phba->pcidev, PCI_COMMAND, + (phba->pci_cfg_value & + ~(PCI_COMMAND_PARITY | PCI_COMMAND_SERR))); - del_timer_sync(&psli->mbox_tmo); - if (ha_copy & HA_ERATT) { - writel(HA_ERATT, phba->HAregaddr); - phba->stopped = 1; - } - spin_lock_irq(phba->host->host_lock); - psli->sli_flag &= ~LPFC_SLI_MBOX_ACTIVE; - spin_unlock_irq(phba->host->host_lock); + writel(HC_INITFF, phba->HCregaddr); - psli->mbox_active = NULL; - lpfc_hba_down_post(phba); - phba->hba_state = LPFC_HBA_ERROR; + phba->hba_state = LPFC_INIT_START; + spin_unlock_irqrestore(phba->host->host_lock, flags); - return (ha_copy & HA_ERATT ? 0 : 1); + return 0; } -int -lpfc_sli_brdreset(struct lpfc_hba * phba) +static int +lpfc_sli_brdreset(struct lpfc_hba * phba, uint16_t skip_post) { - struct lpfc_sli *psli; struct lpfc_sli_ring *pring; - uint16_t cfg_value; int i; + struct lpfc_dmabuf *mp, *next_mp; + unsigned long flags = 0; - psli = &phba->sli; - - /* Reset HBA */ - lpfc_printf_log(phba, KERN_INFO, LOG_SLI, - "%d:0325 Reset HBA Data: x%x x%x\n", phba->brd_no, - phba->hba_state, psli->sli_flag); - - /* perform board reset */ - phba->fc_eventTag = 0; - phba->fc_myDID = 0; - phba->fc_prevDID = 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 | LPFC_PROCESS_LA); - /* Now toggle INITFF bit in the Host Control Register */ - writel(HC_INITFF, phba->HCregaddr); + lpfc_sli_send_reset(phba, skip_post); mdelay(1); + + spin_lock_irqsave(phba->host->host_lock, flags); + /* Risk the write on flush case ie no delay after the readl */ readl(phba->HCregaddr); /* flush */ + /* Now toggle INITFF bit set by lpfc_sli_send_reset */ writel(0, phba->HCregaddr); readl(phba->HCregaddr); /* flush */ /* Restore PCI cmd register */ - pci_write_config_word(phba->pcidev, PCI_COMMAND, cfg_value); + pci_write_config_word(phba->pcidev, PCI_COMMAND, phba->pci_cfg_value); + + /* perform board reset */ + phba->fc_eventTag = 0; + phba->fc_myDID = 0; + phba->fc_prevDID = Mask_DID; + + /* Reset HBA */ + lpfc_printf_log(phba, + KERN_INFO, + LOG_SLI, + "%d:0325 Reset HBA Data: x%x x%x x%x\n", + phba->brd_no, + phba->hba_state, + phba->sli.sli_flag, + skip_post); /* Initialize relevant SLI info */ - for (i = 0; i < psli->num_rings; i++) { - pring = &psli->ring[i]; + for (i = 0; i < phba->sli.num_rings; i++) { + pring = &phba->sli.ring[i]; pring->flag = 0; pring->rspidx = 0; pring->next_cmdidx = 0; @@ -1743,67 +1611,27 @@ lpfc_sli_brdreset(struct lpfc_hba * phba) pring->cmdidx = 0; pring->missbufcnt = 0; } + spin_unlock_irqrestore(phba->host->host_lock, flags); - phba->hba_state = LPFC_WARM_START; - return 0; -} - -int -lpfc_sli_brdrestart(struct lpfc_hba * phba) -{ - MAILBOX_t *mb; - struct lpfc_sli *psli; - uint16_t skip_post; - volatile uint32_t word0; - void __iomem *to_slim; - - spin_lock_irq(phba->host->host_lock); - - psli = &phba->sli; - - /* Restart HBA */ - lpfc_printf_log(phba, KERN_INFO, LOG_SLI, - "%d:0337 Restart HBA Data: x%x x%x\n", phba->brd_no, - phba->hba_state, psli->sli_flag); - - word0 = 0; - mb = (MAILBOX_t *) &word0; - mb->mbxCommand = MBX_RESTART; - mb->mbxHc = 1; - - lpfc_reset_barrier(phba); - - to_slim = phba->MBslimaddr; - writel(*(uint32_t *) mb, to_slim); - readl(to_slim); /* flush */ - - /* Only skip post after fc_ffinit is completed */ - if (phba->hba_state) { - skip_post = 1; - word0 = 1; /* This is really setting up word1 */ + if (skip_post) { + mdelay(100); } else { - skip_post = 0; - word0 = 0; /* This is really setting up word1 */ + mdelay(2000); } - to_slim = phba->MBslimaddr + sizeof (uint32_t); - writel(*(uint32_t *) mb, to_slim); - readl(to_slim); /* flush */ - - lpfc_sli_brdreset(phba); - phba->stopped = 0; - phba->hba_state = LPFC_INIT_START; - - 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 - mdelay(2000); + spin_lock_irqsave(phba->host->host_lock, flags); + /* Cleanup preposted buffers on the ELS ring */ + pring = &phba->sli.ring[LPFC_ELS_RING]; + list_for_each_entry_safe(mp, next_mp, &pring->postbufq, list) { + list_del(&mp->list); + pring->postbufq_cnt--; + lpfc_mbuf_free(phba, mp->virt, mp->phys); + kfree(mp); + } + spin_unlock_irqrestore(phba->host->host_lock, flags); - lpfc_hba_down_post(phba); + for (i = 0; i < phba->sli.num_rings; i++) + lpfc_sli_abort_iocb_ring(phba, &phba->sli.ring[i]); return 0; } @@ -1863,8 +1691,7 @@ lpfc_sli_chipset_init(struct lpfc_hba *phba) } if (i == 15) { - phba->hba_state = LPFC_STATE_UNKNOWN; /* Do post */ - lpfc_sli_brdrestart(phba); + lpfc_sli_brdreset(phba, 0); } /* Read the HBA Host Status Register */ status = readl(phba->HSregaddr); @@ -1908,19 +1735,13 @@ 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); + phba->hba_state = 0; + lpfc_sli_brdreset(phba, 0); msleep(2500); rc = lpfc_sli_chipset_init(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 @@ -2099,21 +1920,6 @@ lpfc_sli_issue_mbox(struct lpfc_hba * phba, LPFC_MBOXQ_t * pmbox, uint32_t flag) mb = &pmbox->mb; status = MBX_SUCCESS; - if (phba->hba_state == LPFC_HBA_ERROR) { - spin_unlock_irqrestore(phba->host->host_lock, drvr_flag); - - /* Mbox command cannot issue */ - LOG_MBOX_CANNOT_ISSUE_DATA( phba, mb, psli, flag) - return (MBX_NOT_FINISHED); - } - - if (mb->mbxCommand != MBX_KILL_BOARD && flag & MBX_NOWAIT && - !(readl(phba->HCregaddr) & HC_MBINT_ENA)) { - spin_unlock_irqrestore(phba->host->host_lock, drvr_flag); - LOG_MBOX_CANNOT_ISSUE_DATA( phba, mb, psli, flag) - return (MBX_NOT_FINISHED); - } - if (psli->sli_flag & LPFC_SLI_MBOX_ACTIVE) { /* Polling for a mbox command when another one is already active * is not allowed in SLI. Also, the driver must have established @@ -2196,8 +2002,7 @@ lpfc_sli_issue_mbox(struct lpfc_hba * phba, LPFC_MBOXQ_t * pmbox, uint32_t flag) /* If we are not polling, we MUST be in SLI2 mode */ if (flag != MBX_POLL) { - if (!(psli->sli_flag & LPFC_SLI2_ACTIVE) && - (mb->mbxCommand != MBX_KILL_BOARD)) { + if (!(psli->sli_flag & LPFC_SLI2_ACTIVE)) { psli->sli_flag &= ~LPFC_SLI_MBOX_ACTIVE; spin_unlock_irqrestore(phba->host->host_lock, drvr_flag); @@ -2206,8 +2011,7 @@ 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_val(phba, mb->mbxCommand)))); + mod_timer(&psli->mbox_tmo, jiffies + HZ * LPFC_MBOX_TMO); } /* Mailbox cmd issue */ @@ -2267,6 +2071,7 @@ 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 */ @@ -2280,14 +2085,10 @@ 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-- <= 0) { + while (((word0 & OWN_CHIP) == OWN_CHIP) + || !(ha_copy & HA_MBATT)) { + if (i++ >= 100) { psli->sli_flag &= ~LPFC_SLI_MBOX_ACTIVE; spin_unlock_irqrestore(phba->host->host_lock, drvr_flag); @@ -2305,7 +2106,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(1); + mdelay(i); spin_lock_irqsave(phba->host->host_lock, drvr_flag); @@ -2436,6 +2237,16 @@ lpfc_sli_issue_iocb(struct lpfc_hba *phba, struct lpfc_sli_ring *pring, !(phba->sli.sli_flag & LPFC_PROCESS_LA))) goto iocb_busy; + /* + * Check to see if this is a high priority command. + * If so bypass tx queue processing. + */ + if (unlikely((flag & SLI_IOCB_HIGH_PRIORITY) && + (iocb = lpfc_sli_next_iocb_slot(phba, pring)))) { + lpfc_sli_submit_iocb(phba, pring, iocb, piocb); + piocb = NULL; + } + while ((iocb = lpfc_sli_next_iocb_slot(phba, pring)) && (nextiocb = lpfc_sli_next_iocb(phba, pring, &piocb))) lpfc_sli_submit_iocb(phba, pring, iocb, nextiocb); @@ -2463,37 +2274,6 @@ lpfc_sli_issue_iocb(struct lpfc_hba *phba, struct lpfc_sli_ring *pring, return IOCB_BUSY; } -static int -lpfc_extra_ring_setup( struct lpfc_hba *phba) -{ - struct lpfc_sli *psli; - struct lpfc_sli_ring *pring; - - psli = &phba->sli; - - /* Adjust cmd/rsp ring iocb entries more evenly */ - pring = &psli->ring[psli->fcp_ring]; - pring->numCiocb -= SLI2_IOCB_CMD_R1XTRA_ENTRIES; - pring->numRiocb -= SLI2_IOCB_RSP_R1XTRA_ENTRIES; - pring->numCiocb -= SLI2_IOCB_CMD_R3XTRA_ENTRIES; - pring->numRiocb -= SLI2_IOCB_RSP_R3XTRA_ENTRIES; - - pring = &psli->ring[1]; - pring->numCiocb += SLI2_IOCB_CMD_R1XTRA_ENTRIES; - pring->numRiocb += SLI2_IOCB_RSP_R1XTRA_ENTRIES; - pring->numCiocb += SLI2_IOCB_CMD_R3XTRA_ENTRIES; - pring->numRiocb += SLI2_IOCB_RSP_R3XTRA_ENTRIES; - - /* Setup default profile for this ring */ - pring->iotag_max = 4096; - pring->num_mask = 1; - pring->prt[0].profile = 0; /* Mask 0 */ - pring->prt[0].rctl = FC_UNSOL_DATA; - pring->prt[0].type = 5; - pring->prt[0].lpfc_sli_rcv_unsol_event = NULL; - return 0; -} - int lpfc_sli_setup(struct lpfc_hba *phba) { @@ -2577,8 +2357,6 @@ lpfc_sli_setup(struct lpfc_hba *phba) "SLI2 SLIM Data: x%x x%x\n", phba->brd_no, totiocb, MAX_SLI2_IOCB); } - if (phba->cfg_multi_ring_support == 2) - lpfc_extra_ring_setup(phba); return 0; } @@ -2651,6 +2429,8 @@ 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); @@ -2685,6 +2465,15 @@ lpfc_sli_hba_down(struct lpfc_hba * phba) spin_unlock_irqrestore(phba->host->host_lock, flags); + /* + * Provided the hba is not in an error state, reset it. It is not + * capable of IO anymore. + */ + if (phba->hba_state != LPFC_HBA_ERROR) { + phba->hba_state = LPFC_INIT_START; + lpfc_sli_brdreset(phba, 1); + } + return 1; } @@ -3020,7 +2809,7 @@ lpfc_sli_issue_iocb_wait(struct lpfc_hba * phba, if (timeleft == 0) { lpfc_printf_log(phba, KERN_ERR, LOG_SLI, - "%d:0338 IOCB wait timeout error - no " + "%d:0329 IOCB wait timeout error - no " "wake response Data x%x\n", phba->brd_no, timeout); retval = IOCB_TIMEDOUT; @@ -3088,10 +2877,11 @@ lpfc_sli_issue_mbox_wait(struct lpfc_hba * phba, LPFC_MBOXQ_t * pmboxq, pmboxq->context1 = NULL; /* if schedule_timeout returns 0, we timed out and were not woken up */ - if ((timeleft == 0) || signal_pending(current)) + if (timeleft == 0) { retval = MBX_TIMEOUT; - else + } else { retval = MBX_SUCCESS; + } } @@ -3100,24 +2890,6 @@ 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) { @@ -3215,7 +2987,13 @@ lpfc_intr_handler(int irq, void *dev_id, struct pt_regs * regs) /* Clear Chip error bit */ writel(HA_ERATT, phba->HAregaddr); readl(phba->HAregaddr); /* flush */ - phba->stopped = 1; + + /* + * Reseting the HBA is the only reliable way + * to shutdown interrupt when there is a + * ERROR. + */ + lpfc_sli_send_reset(phba, phba->hba_state); } spin_lock(phba->host->host_lock); diff --git a/drivers/scsi/lpfc/lpfc_sli.h b/drivers/scsi/lpfc/lpfc_sli.h index e26de6809..b7a9f970f 100644 --- a/drivers/scsi/lpfc/lpfc_sli.h +++ b/drivers/scsi/lpfc/lpfc_sli.h @@ -1,7 +1,7 @@ /******************************************************************* * This file is part of the Emulex Linux Device Driver for * * Fibre Channel Host Bus Adapters. * - * Copyright (C) 2004-2006 Emulex. All rights reserved. * + * Copyright (C) 2004-2005 Emulex. All rights reserved. * * EMULEX and SLI are trademarks of Emulex. * * www.emulex.com * * * @@ -61,6 +61,7 @@ struct lpfc_iocbq { }; #define SLI_IOCB_RET_IOCB 1 /* Return IOCB if cmd ring full */ +#define SLI_IOCB_HIGH_PRIORITY 2 /* High priority command */ #define IOCB_SUCCESS 0 #define IOCB_BUSY 1 @@ -135,6 +136,8 @@ 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 */ @@ -172,18 +175,6 @@ 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; @@ -209,12 +200,12 @@ struct lpfc_sli { struct timer_list mbox_tmo; /* Hold clk to timeout active mbox cmd */ + uint32_t *MBhostaddr; /* virtual address for mbox cmds */ + #define LPFC_IOCBQ_LOOKUP_INCREMENT 1024 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 @@ -225,9 +216,3 @@ 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 c7091ea29..fa681a934 100644 --- a/drivers/scsi/lpfc/lpfc_version.h +++ b/drivers/scsi/lpfc/lpfc_version.h @@ -1,7 +1,7 @@ /******************************************************************* * This file is part of the Emulex Linux Device Driver for * * Fibre Channel Host Bus Adapters. * - * Copyright (C) 2004-2006 Emulex. All rights reserved. * + * Copyright (C) 2004-2005 Emulex. All rights reserved. * * EMULEX and SLI are trademarks of Emulex. * * www.emulex.com * * * @@ -18,12 +18,12 @@ * included with this package. * *******************************************************************/ -#define LPFC_DRIVER_VERSION "8.1.9" +#define LPFC_DRIVER_VERSION "8.1.1" #define LPFC_DRIVER_NAME "lpfc" #define LPFC_MODULE_DESC "Emulex LightPulse Fibre Channel SCSI driver " \ LPFC_DRIVER_VERSION -#define LPFC_COPYRIGHT "Copyright(c) 2004-2006 Emulex. All rights reserved." +#define LPFC_COPYRIGHT "Copyright(c) 2004-2005 Emulex. All rights reserved." #define DFC_API_VERSION "0.0.0" diff --git a/drivers/scsi/mac53c94.c b/drivers/scsi/mac53c94.c index 89ef34df5..93edaa869 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->request_buffer; + scl = (struct scatterlist *) cmd->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 118206d68..e31fadd61 100644 --- a/drivers/scsi/mac_esp.c +++ b/drivers/scsi/mac_esp.c @@ -43,6 +43,9 @@ /* #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); @@ -636,13 +639,13 @@ static void dma_init_write(struct NCR_ESP * esp, char * vaddress, int length) static void dma_ints_off(struct NCR_ESP * esp) { - disable_irq(esp->irq); + mac_turnoff_irq(esp->irq); } static void dma_ints_on(struct NCR_ESP * esp) { - enable_irq(esp->irq); + mac_turnon_irq(esp->irq); } /* diff --git a/drivers/scsi/mac_scsi.c b/drivers/scsi/mac_scsi.c index a942a21dd..777f9bcd1 100644 --- a/drivers/scsi/mac_scsi.c +++ b/drivers/scsi/mac_scsi.c @@ -65,6 +65,9 @@ #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 @@ -348,7 +351,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 */ - disable_irq(IRQ_MAC_SCSI); + mac_disable_irq(IRQ_MAC_SCSI); /* get in phase */ NCR5380_write( TARGET_COMMAND_REG, @@ -366,7 +369,7 @@ static void mac_scsi_reset_boot(struct Scsi_Host *instance) barrier(); /* switch on SCSI IRQ again */ - enable_irq(IRQ_MAC_SCSI); + mac_enable_irq(IRQ_MAC_SCSI); printk(KERN_INFO " done\n" ); } diff --git a/drivers/scsi/megaraid.c b/drivers/scsi/megaraid.c index 76edbb639..7144674bc 100644 --- a/drivers/scsi/megaraid.c +++ b/drivers/scsi/megaraid.c @@ -45,7 +45,6 @@ #include #include #include -#include #include #include "scsi.h" @@ -524,7 +523,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->request_buffer; + return cmd->buffer; } @@ -1828,7 +1827,7 @@ mega_build_sglist(adapter_t *adapter, scb_t *scb, u32 *buf, u32 *len) scb->dma_type = MEGA_SGLIST; - BUG_ON(sgcnt > adapter->sglen); + if( sgcnt > adapter->sglen ) BUG(); *len = 0; @@ -2095,7 +2094,7 @@ make_local_pdev(adapter_t *adapter, struct pci_dev **pdev) memcpy(*pdev, adapter->dev, sizeof(struct pci_dev)); - if( pci_set_dma_mask(*pdev, DMA_32BIT_MASK) != 0 ) { + if( pci_set_dma_mask(*pdev, 0xffffffff) != 0 ) { kfree(*pdev); return -1; } @@ -4471,6 +4470,7 @@ mega_internal_command(adapter_t *adapter, megacmd_t *mc, mega_passthru *pthru) { Scsi_Cmnd *scmd; struct scsi_device *sdev; + unsigned long flags = 0; scb_t *scb; int rval; @@ -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->request_buffer = (void *)scb; + scmd->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, - IRQF_SHARED, "megaraid", adapter)) { + SA_SHIRQ, "megaraid", adapter)) { printk(KERN_WARNING "megaraid: Couldn't register IRQ %d!\n", irq); goto out_free_scb_list; @@ -4859,10 +4859,10 @@ megaraid_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) /* Set the Mode of addressing to 64 bit if we can */ if ((adapter->flag & BOARD_64BIT) && (sizeof(dma_addr_t) == 8)) { - pci_set_dma_mask(pdev, DMA_64BIT_MASK); + pci_set_dma_mask(pdev, 0xffffffffffffffffULL); adapter->has_64bit_addr = 1; } else { - pci_set_dma_mask(pdev, DMA_32BIT_MASK); + pci_set_dma_mask(pdev, 0xffffffff); adapter->has_64bit_addr = 0; } diff --git a/drivers/scsi/megaraid/mega_common.h b/drivers/scsi/megaraid/mega_common.h index 8cd0bd1d0..467534322 100644 --- a/drivers/scsi/megaraid/mega_common.h +++ b/drivers/scsi/megaraid/mega_common.h @@ -37,12 +37,6 @@ #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 b8aa34202..bdaee144a 100644 --- a/drivers/scsi/megaraid/megaraid_ioctl.h +++ b/drivers/scsi/megaraid/megaraid_ioctl.h @@ -132,10 +132,6 @@ 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 cd982c877..bf9f7f7ba 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.9 (Jul 16 2006) + * Version : v2.20.4.7 (Nov 14 2005) * * Authors: * Atul Mukker @@ -714,13 +714,12 @@ 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 __devinit +static int __init megaraid_init_mbox(adapter_t *adapter) { struct pci_dev *pdev; mraid_device_t *raid_dev; int i; - uint32_t magic64; adapter->ito = MBOX_TIMEOUT; @@ -768,7 +767,7 @@ megaraid_init_mbox(adapter_t *adapter) // // request IRQ and register the interrupt service routine - if (request_irq(adapter->irq, megaraid_isr, IRQF_SHARED, "megaraid", + if (request_irq(adapter->irq, megaraid_isr, SA_SHIRQ, "megaraid", adapter)) { con_log(CL_ANN, (KERN_WARNING @@ -864,33 +863,12 @@ megaraid_init_mbox(adapter_t *adapter) // Set the DMA mask to 64-bit. All supported controllers as capable of // DMA in this range - 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")); + if (pci_set_dma_mask(adapter->pdev, DMA_64BIT_MASK) != 0) { - 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; - } - } + con_log(CL_ANN, (KERN_WARNING + "megaraid: could not set DMA mask for 64-bit.\n")); + + goto out_free_sysfs_res; } // setup tasklet for DPC @@ -1644,14 +1622,6 @@ 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: @@ -2308,7 +2278,6 @@ megaraid_mbox_dpc(unsigned long devp) unsigned long flags; uint8_t c; int status; - uioc_t *kioc; if (!adapter) return; @@ -2351,9 +2320,6 @@ megaraid_mbox_dpc(unsigned long devp) // remove from local clist list_del_init(&scb->list); - kioc = (uioc_t *)scb->gp; - kioc->status = 0; - megaraid_mbox_mm_done(adapter, scb); continue; @@ -2670,7 +2636,6 @@ megaraid_reset_handler(struct scsi_cmnd *scp) int recovery_window; int recovering; int i; - uioc_t *kioc; adapter = SCP2ADAPTER(scp); raid_dev = ADAP2RAIDDEV(adapter); @@ -2690,51 +2655,32 @@ megaraid_reset_handler(struct scsi_cmnd *scp) // Also, reset all the commands currently owned by the driver spin_lock_irqsave(PENDING_LIST_LOCK(adapter), flags); list_for_each_entry_safe(scb, tmp, &adapter->pend_list, list) { - list_del_init(&scb->list); // from pending list - - if (scb->sno >= MBOX_MAX_SCSI_CMDS) { - con_log(CL_ANN, (KERN_WARNING - "megaraid: IOCTL packet with %d[%d:%d] being reset\n", - scb->sno, scb->dev_channel, scb->dev_target)); - - scb->status = -1; - kioc = (uioc_t *)scb->gp; - kioc->status = -EFAULT; + list_del_init(&scb->list); // from pending list - megaraid_mbox_mm_done(adapter, scb); - } else { - if (scb->scp == scp) { // Found command - con_log(CL_ANN, (KERN_WARNING - "megaraid: %ld:%d[%d:%d], reset from pending list\n", - scp->serial_number, scb->sno, - scb->dev_channel, scb->dev_target)); - } else { - con_log(CL_ANN, (KERN_WARNING - "megaraid: IO packet with %d[%d:%d] being reset\n", - scb->sno, scb->dev_channel, scb->dev_target)); - } + con_log(CL_ANN, (KERN_WARNING + "megaraid: %ld:%d[%d:%d], reset from pending list\n", + scp->serial_number, scb->sno, + scb->dev_channel, scb->dev_target)); - scb->scp->result = (DID_RESET << 16); - scb->scp->scsi_done(scb->scp); + scp->result = (DID_RESET << 16); + scp->scsi_done(scp); - megaraid_dealloc_scb(adapter, scb); - } + megaraid_dealloc_scb(adapter, scb); } spin_unlock_irqrestore(PENDING_LIST_LOCK(adapter), flags); if (adapter->outstanding_cmds) { con_log(CL_ANN, (KERN_NOTICE "megaraid: %d outstanding commands. Max wait %d sec\n", - adapter->outstanding_cmds, - (MBOX_RESET_WAIT + MBOX_RESET_EXT_WAIT))); + adapter->outstanding_cmds, MBOX_RESET_WAIT)); } recovery_window = MBOX_RESET_WAIT + MBOX_RESET_EXT_WAIT; recovering = adapter->outstanding_cmds; - for (i = 0; i < recovery_window; i++) { + for (i = 0; i < recovery_window && adapter->outstanding_cmds; i++) { megaraid_ack_sequence(adapter); @@ -2743,11 +2689,12 @@ megaraid_reset_handler(struct scsi_cmnd *scp) con_log(CL_ANN, ( "megaraid mbox: Wait for %d commands to complete:%d\n", adapter->outstanding_cmds, - (MBOX_RESET_WAIT + MBOX_RESET_EXT_WAIT) - i)); + MBOX_RESET_WAIT - i)); } // bailout if no recovery happended in reset time - if (adapter->outstanding_cmds == 0) { + if ((i == MBOX_RESET_WAIT) && + (recovering == adapter->outstanding_cmds)) { break; } @@ -2850,7 +2797,7 @@ mbox_post_sync_cmd(adapter_t *adapter, uint8_t raw_mbox[]) // available within 1 second, assume FW is initializing and wait // for an extended amount of time if (mbox->numstatus == 0xFF) { // status not yet available - udelay(25); + udelay(25);; for (i = 0; mbox->numstatus == 0xFF && i < 1000; i++) { rmb(); @@ -2971,13 +2918,12 @@ mbox_post_sync_cmd_fast(adapter_t *adapter, uint8_t raw_mbox[]) wmb(); WRINDOOR(raid_dev, raid_dev->mbox_dma | 0x1); - for (i = 0; i < MBOX_SYNC_WAIT_CNT; i++) { + for (i = 0; i < 0xFFFFF; i++) { if (mbox->numstatus != 0xFF) break; rmb(); - udelay(MBOX_SYNC_DELAY_200); } - if (i == MBOX_SYNC_WAIT_CNT) { + if (i == 0xFFFFF) { // We may need to re-calibrate the counter con_log(CL_ANN, (KERN_CRIT "megaraid: fast sync command timed out\n")); @@ -3529,7 +3475,7 @@ megaraid_cmm_register(adapter_t *adapter) adp.drvr_data = (unsigned long)adapter; adp.pdev = adapter->pdev; adp.issue_uioc = megaraid_mbox_mm_handler; - adp.timeout = MBOX_RESET_WAIT + MBOX_RESET_EXT_WAIT; + adp.timeout = 300; adp.max_kioc = MBOX_MAX_USER_CMDS; if ((rval = mraid_mm_register_adp(&adp)) != 0) { @@ -3756,6 +3702,7 @@ megaraid_mbox_mm_done(adapter_t *adapter, scb_t *scb) unsigned long flags; kioc = (uioc_t *)scb->gp; + kioc->status = 0; mbox64 = (mbox64_t *)(unsigned long)kioc->cmdbuf; mbox64->mbox32.status = scb->status; raw_mbox = (uint8_t *)&mbox64->mbox32; diff --git a/drivers/scsi/megaraid/megaraid_mbox.h b/drivers/scsi/megaraid/megaraid_mbox.h index 2b5a3285f..882fb1a0b 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.9" -#define MEGARAID_EXT_VERSION "(Release Date: Sun Jul 16 12:27:22 EST 2006)" +#define MEGARAID_VERSION "2.20.4.7" +#define MEGARAID_EXT_VERSION "(Release Date: Mon Nov 14 12:27:22 EST 2005)" /* @@ -100,9 +100,6 @@ #define MBOX_BUSY_WAIT 10 // max usec to wait for busy mailbox #define MBOX_RESET_WAIT 180 // wait these many seconds in reset #define MBOX_RESET_EXT_WAIT 120 // extended wait reset -#define MBOX_SYNC_WAIT_CNT 0xFFFF // wait loop index for synchronous mode - -#define MBOX_SYNC_DELAY_200 200 // 200 micro-seconds /* * maximum transfer that can happen through the firmware commands issued diff --git a/drivers/scsi/megaraid/megaraid_mm.c b/drivers/scsi/megaraid/megaraid_mm.c index d85b9a8f1..8f3ce0432 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.7 (Jul 16 2006) + * Version : v2.20.2.6 (Mar 7 2005) * * Common management module */ @@ -898,8 +898,10 @@ mraid_mm_register_adp(mraid_mmadp_t *lld_adp) adapter = kmalloc(sizeof(mraid_mmadp_t), GFP_KERNEL); - if (!adapter) - return -ENOMEM; + if (!adapter) { + rval = -ENOMEM; + goto memalloc_error; + } memset(adapter, 0, sizeof(mraid_mmadp_t)); diff --git a/drivers/scsi/megaraid/megaraid_mm.h b/drivers/scsi/megaraid/megaraid_mm.h index c8762b2b8..3d9e67d68 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.7" +#define LSI_COMMON_MOD_VERSION "2.20.2.6" #define LSI_COMMON_MOD_EXT_VERSION \ - "(Release Date: Sun Jul 16 00:01:03 EST 2006)" + "(Release Date: Mon Mar 7 00:01:03 EST 2005)" #define LSI_DBGLVL dbglevel diff --git a/drivers/scsi/megaraid/megaraid_sas.c b/drivers/scsi/megaraid/megaraid_sas.c index a8c9627a1..4f39dd019 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.03.01 + * Version : v00.00.02.04 * * Authors: * Sreenivas Bagalkote @@ -55,25 +55,19 @@ 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, }, @@ -295,14 +289,9 @@ static struct megasas_instance_template megasas_instance_template_ppc = { * @regs: MFI register set */ static inline void -megasas_disable_intr(struct megasas_instance *instance) +megasas_disable_intr(struct megasas_register_set __iomem * regs) { 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 */ @@ -752,6 +741,7 @@ 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; @@ -782,11 +772,15 @@ megasas_queue_command(struct scsi_cmnd *scmd, void (*done) (struct scsi_cmnd *)) goto out_return_cmd; cmd->scmd = scmd; + scmd->SCp.ptr = (char *)cmd; + scmd->SCp.sent_command = jiffies; /* * Issue the command to the FW */ - atomic_inc(&instance->fw_outstanding); + spin_lock_irqsave(&instance->instance_lock, flags); + instance->fw_outstanding++; + spin_unlock_irqrestore(&instance->instance_lock, flags); instance->instancet->fire_cmd(cmd->frame_phys_addr ,cmd->frame_count-1,instance->reg_set); @@ -810,12 +804,6 @@ static int megasas_slave_configure(struct scsi_device *sdev) */ if (sdev->channel < MEGASAS_MAX_PD_CHANNELS && sdev->type == TYPE_DISK) return -ENXIO; - - /* - * The RAID firmware may require extended timeouts. - */ - if (sdev->channel >= MEGASAS_MAX_PD_CHANNELS) - sdev->timeout = 90 * HZ; return 0; } @@ -834,20 +822,19 @@ static int megasas_wait_for_outstanding(struct megasas_instance *instance) for (i = 0; i < wait_time; i++) { - int outstanding = atomic_read(&instance->fw_outstanding); - - if (!outstanding) + if (!instance->fw_outstanding) break; if (!(i % MEGASAS_RESET_NOTICE_INTERVAL)) { printk(KERN_NOTICE "megasas: [%2d]waiting for %d " - "commands to complete\n",i,outstanding); + "commands to complete\n", i, + instance->fw_outstanding); } msleep(1000); } - if (atomic_read(&instance->fw_outstanding)) { + if (instance->fw_outstanding) { instance->hw_crit_error = 1; return FAILED; } @@ -888,6 +875,23 @@ static int megasas_generic_reset(struct scsi_cmnd *scmd) return ret_val; } +static enum scsi_eh_timer_return megasas_reset_timer(struct scsi_cmnd *scmd) +{ + unsigned long seconds; + + if (scmd->SCp.ptr) { + seconds = (jiffies - scmd->SCp.sent_command) / HZ; + + if (seconds < 90) { + return EH_RESET_TIMER; + } else { + return EH_NOT_HANDLED; + } + } + + return EH_HANDLED; +} + /** * megasas_reset_device - Device reset handler entry point */ @@ -911,7 +915,7 @@ static int megasas_reset_bus_host(struct scsi_cmnd *scmd) int ret; /* - * First wait for all commands to complete + * Frist wait for all commands to complete */ ret = megasas_generic_reset(scmd); @@ -958,6 +962,7 @@ static struct scsi_host_template megasas_template = { .eh_device_reset_handler = megasas_reset_device, .eh_bus_reset_handler = megasas_reset_bus_host, .eh_host_reset_handler = megasas_reset_bus_host, + .eh_timed_out = megasas_reset_timer, .use_clustering = ENABLE_CLUSTERING, }; @@ -1059,6 +1064,7 @@ 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; @@ -1090,7 +1096,9 @@ megasas_complete_cmd(struct megasas_instance *instance, struct megasas_cmd *cmd, if (exception) { - atomic_dec(&instance->fw_outstanding); + spin_lock_irqsave(&instance->instance_lock, flags); + instance->fw_outstanding--; + spin_unlock_irqrestore(&instance->instance_lock, flags); megasas_unmap_sgbuf(instance, cmd); cmd->scmd->scsi_done(cmd->scmd); @@ -1138,7 +1146,9 @@ megasas_complete_cmd(struct megasas_instance *instance, struct megasas_cmd *cmd, break; } - atomic_dec(&instance->fw_outstanding); + spin_lock_irqsave(&instance->instance_lock, flags); + instance->fw_outstanding--; + spin_unlock_irqrestore(&instance->instance_lock, flags); megasas_unmap_sgbuf(instance, cmd); cmd->scmd->scsi_done(cmd->scmd); @@ -1271,7 +1281,7 @@ megasas_transition_to_ready(struct megasas_instance* instance) /* * Bring it to READY state; assuming max wait 2 secs */ - megasas_disable_intr(instance); + megasas_disable_intr(instance->reg_set); writel(MFI_INIT_READY, &instance->reg_set->inbound_doorbell); max_wait = 10; @@ -1767,11 +1777,6 @@ 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 */ @@ -2180,12 +2185,11 @@ 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); @@ -2207,7 +2211,7 @@ megasas_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) /* * Register IRQ */ - if (request_irq(pdev->irq, megasas_isr, IRQF_SHARED, "megasas", instance)) { + if (request_irq(pdev->irq, megasas_isr, SA_SHIRQ, "megasas", instance)) { printk(KERN_DEBUG "megasas: Failed to register IRQ\n"); goto fail_irq; } @@ -2250,7 +2254,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); + megasas_disable_intr(instance->reg_set); free_irq(instance->pdev->irq, instance); megasas_release_mfi(instance); @@ -2380,7 +2384,7 @@ static void megasas_detach_one(struct pci_dev *pdev) pci_set_drvdata(instance->pdev, NULL); - megasas_disable_intr(instance); + megasas_disable_intr(instance->reg_set); free_irq(instance->pdev->irq, instance); diff --git a/drivers/scsi/megaraid/megaraid_sas.h b/drivers/scsi/megaraid/megaraid_sas.h index 3531a1422..89639f0c3 100644 --- a/drivers/scsi/megaraid/megaraid_sas.h +++ b/drivers/scsi/megaraid/megaraid_sas.h @@ -18,16 +18,9 @@ /** * MegaRAID SAS Driver meta data */ -#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 - +#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" /* * ===================================== * MegaRAID SAS MFI firmware definitions @@ -561,11 +554,7 @@ struct megasas_ctrl_info { #define MFI_POLL_TIMEOUT_SECS 10 #define MFI_REPLY_1078_MESSAGE_INTERRUPT 0x80000000 - -/* -* register set for both 1068 and 1078 controllers -* structure extended for 1078 registers -*/ +#define PCI_DEVICE_ID_LSI_SAS1078R 0x00000060 struct megasas_register_set { u32 reserved_0[4]; /*0000h*/ @@ -1088,8 +1077,9 @@ struct megasas_instance { struct pci_dev *pdev; u32 unique_id; - atomic_t fw_outstanding; + u32 fw_outstanding; u32 hw_crit_error; + spinlock_t instance_lock; struct megasas_instance_template *instancet; }; @@ -1161,10 +1151,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 5572981a9..d6d2125f9 100644 --- a/drivers/scsi/mesh.c +++ b/drivers/scsi/mesh.c @@ -18,6 +18,7 @@ * - retry arbitration if lost (unless higher levels do this for us) * - power down the chip when no device is detected */ +#include #include #include #include @@ -1268,7 +1269,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->request_buffer; + scl = (struct scatterlist *) cmd->buffer; off = ms->data_ptr; nseg = pci_map_sg(ms->pdev, scl, cmd->use_sg, cmd->sc_data_direction); @@ -1747,7 +1748,7 @@ static int mesh_host_reset(struct scsi_cmnd *cmd) static void set_mesh_power(struct mesh_state *ms, int state) { - if (!machine_is(powermac)) + if (_machine != _MACH_Pmac) return; if (state) { pmac_call_feature(PMAC_FTR_MESH_ENABLE, macio_get_of_node(ms->mdev), 0, 1); diff --git a/drivers/scsi/ncr53c8xx.c b/drivers/scsi/ncr53c8xx.c index b28712df0..32350707b 100644 --- a/drivers/scsi/ncr53c8xx.c +++ b/drivers/scsi/ncr53c8xx.c @@ -69,10 +69,6 @@ ** Low PCI traffic for command handling when on-chip RAM is present. ** Aggressive SCSI SCRIPTS optimizations. ** -** 2005 by Matthew Wilcox and James Bottomley -** PCI-ectomy. This driver now supports only the 720 chip (see the -** NCR_Q720 and zalon drivers for the bus probe logic). -** ******************************************************************************* */ @@ -94,6 +90,13 @@ #define SCSI_NCR_DEBUG_FLAGS (0) +/*========================================================== +** +** Include files +** +**========================================================== +*/ + #include #include #include @@ -118,7 +121,6 @@ #include #include -#include #include #include #include @@ -126,8 +128,10 @@ #include "ncr53c8xx.h" +#define NAME53C "ncr53c" #define NAME53C8XX "ncr53c8xx" + /*========================================================== ** ** Debugging tags @@ -529,7 +533,7 @@ static void __unmap_scsi_data(struct device *dev, struct scsi_cmnd *cmd) { switch(cmd->__data_mapped) { case 2: - dma_unmap_sg(dev, cmd->request_buffer, cmd->use_sg, + dma_unmap_sg(dev, cmd->buffer, cmd->use_sg, cmd->sc_data_direction); break; case 1: @@ -564,7 +568,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->request_buffer, cmd->use_sg, + use_sg = dma_map_sg(dev, cmd->buffer, cmd->use_sg, cmd->sc_data_direction); cmd->__data_mapped = 2; cmd->__data_mapping = use_sg; @@ -2107,7 +2111,7 @@ static struct script script0 __initdata = { */ /* - ** The MESSAGE_REJECT problem seems to be due to a selection + ** The M_REJECT problem seems to be due to a selection ** timing problem. ** Wait immediately for the selection to complete. ** (2.5x behaves so) @@ -2158,7 +2162,7 @@ static struct script script0 __initdata = { /* ** Selection complete. ** Send the IDENTIFY and SIMPLE_TAG messages - ** (and the EXTENDED_SDTR message) + ** (and the M_X_SYNC_REQ message) */ SCR_MOVE_TBL ^ SCR_MSG_OUT, offsetof (struct dsb, smsg), @@ -2187,7 +2191,7 @@ static struct script script0 __initdata = { /* ** Initialize the msgout buffer with a NOOP message. */ - SCR_LOAD_REG (scratcha, NOP), + SCR_LOAD_REG (scratcha, M_NOOP), 0, SCR_COPY (1), RADDR (scratcha), @@ -2339,21 +2343,21 @@ static struct script script0 __initdata = { /* ** Handle this message. */ - SCR_JUMP ^ IFTRUE (DATA (COMMAND_COMPLETE)), + SCR_JUMP ^ IFTRUE (DATA (M_COMPLETE)), PADDR (complete), - SCR_JUMP ^ IFTRUE (DATA (DISCONNECT)), + SCR_JUMP ^ IFTRUE (DATA (M_DISCONNECT)), PADDR (disconnect), - SCR_JUMP ^ IFTRUE (DATA (SAVE_POINTERS)), + SCR_JUMP ^ IFTRUE (DATA (M_SAVE_DP)), PADDR (save_dp), - SCR_JUMP ^ IFTRUE (DATA (RESTORE_POINTERS)), + SCR_JUMP ^ IFTRUE (DATA (M_RESTORE_DP)), PADDR (restore_dp), - SCR_JUMP ^ IFTRUE (DATA (EXTENDED_MESSAGE)), + SCR_JUMP ^ IFTRUE (DATA (M_EXTENDED)), PADDRH (msg_extended), - SCR_JUMP ^ IFTRUE (DATA (NOP)), + SCR_JUMP ^ IFTRUE (DATA (M_NOOP)), PADDR (clrack), - SCR_JUMP ^ IFTRUE (DATA (MESSAGE_REJECT)), + SCR_JUMP ^ IFTRUE (DATA (M_REJECT)), PADDRH (msg_reject), - SCR_JUMP ^ IFTRUE (DATA (IGNORE_WIDE_RESIDUE)), + SCR_JUMP ^ IFTRUE (DATA (M_IGN_RESIDUE)), PADDRH (msg_ign_residue), /* ** Rest of the messages left as @@ -2368,7 +2372,7 @@ static struct script script0 __initdata = { */ SCR_INT, SIR_REJECT_SENT, - SCR_LOAD_REG (scratcha, MESSAGE_REJECT), + SCR_LOAD_REG (scratcha, M_REJECT), 0, }/*-------------------------< SETMSG >----------------------*/,{ SCR_COPY (1), @@ -2560,7 +2564,7 @@ static struct script script0 __initdata = { /* ** If it was no ABORT message ... */ - SCR_JUMP ^ IFTRUE (DATA (ABORT_TASK_SET)), + SCR_JUMP ^ IFTRUE (DATA (M_ABORT)), PADDRH (msg_out_abort), /* ** ... wait for the next phase @@ -2572,7 +2576,7 @@ static struct script script0 __initdata = { /* ** ... else clear the message ... */ - SCR_LOAD_REG (scratcha, NOP), + SCR_LOAD_REG (scratcha, M_NOOP), 0, SCR_COPY (4), RADDR (scratcha), @@ -3031,7 +3035,7 @@ static struct scripth scripth0 __initdata = { */ SCR_MOVE_ABS (1) ^ SCR_MSG_IN, NADDR (msgin[2]), - SCR_JUMP ^ IFTRUE (DATA (EXTENDED_WDTR)), + SCR_JUMP ^ IFTRUE (DATA (M_X_WIDE_REQ)), PADDRH (msg_wdtr), /* ** unknown extended message @@ -3065,7 +3069,7 @@ static struct scripth scripth0 __initdata = { }/*-------------------------< SEND_WDTR >----------------*/,{ /* - ** Send the EXTENDED_WDTR + ** Send the M_X_WIDE_REQ */ SCR_MOVE_ABS (4) ^ SCR_MSG_OUT, NADDR (msgout), @@ -3085,7 +3089,7 @@ static struct scripth scripth0 __initdata = { */ SCR_MOVE_ABS (1) ^ SCR_MSG_IN, NADDR (msgin[2]), - SCR_JUMP ^ IFTRUE (DATA (EXTENDED_SDTR)), + SCR_JUMP ^ IFTRUE (DATA (M_X_SYNC_REQ)), PADDRH (msg_sdtr), /* ** unknown extended message @@ -3120,7 +3124,7 @@ static struct scripth scripth0 __initdata = { }/*-------------------------< SEND_SDTR >-------------*/,{ /* - ** Send the EXTENDED_SDTR + ** Send the M_X_SYNC_REQ */ SCR_MOVE_ABS (5) ^ SCR_MSG_OUT, NADDR (msgout), @@ -3198,10 +3202,10 @@ static struct scripth scripth0 __initdata = { }/*-------------------------< RESET >----------------------*/,{ /* - ** Send a TARGET_RESET message if bad IDENTIFY + ** Send a M_RESET message if bad IDENTIFY ** received on reselection. */ - SCR_LOAD_REG (scratcha, ABORT_TASK), + SCR_LOAD_REG (scratcha, M_ABORT_TAG), 0, SCR_JUMP, PADDRH (abort_resel), @@ -3209,7 +3213,7 @@ static struct scripth scripth0 __initdata = { /* ** Abort a wrong tag received on reselection. */ - SCR_LOAD_REG (scratcha, ABORT_TASK), + SCR_LOAD_REG (scratcha, M_ABORT_TAG), 0, SCR_JUMP, PADDRH (abort_resel), @@ -3217,7 +3221,7 @@ static struct scripth scripth0 __initdata = { /* ** Abort a reselection when no active CCB. */ - SCR_LOAD_REG (scratcha, ABORT_TASK_SET), + SCR_LOAD_REG (scratcha, M_ABORT), 0, }/*-------------------------< ABORT_RESEL >----------------*/,{ SCR_COPY (1), @@ -3329,7 +3333,7 @@ static struct scripth scripth0 __initdata = { ** Read the message, since we got it directly ** from the SCSI BUS data lines. ** Signal problem to C code for logging the event. - ** Send an ABORT_TASK_SET to clear all pending tasks. + ** Send a M_ABORT to clear all pending tasks. */ SCR_INT, SIR_RESEL_BAD_LUN, @@ -3341,7 +3345,7 @@ static struct scripth scripth0 __initdata = { /* ** We donnot have a task for that I_T_L. ** Signal problem to C code for logging the event. - ** Send an ABORT_TASK_SET message. + ** Send a M_ABORT message. */ SCR_INT, SIR_RESEL_BAD_I_T_L, @@ -3351,7 +3355,7 @@ static struct scripth scripth0 __initdata = { /* ** We donnot have a task that matches the tag. ** Signal problem to C code for logging the event. - ** Send an ABORT_TASK message. + ** Send a M_ABORTTAG message. */ SCR_INT, SIR_RESEL_BAD_I_T_L_Q, @@ -3362,7 +3366,7 @@ static struct scripth scripth0 __initdata = { ** We donnot know the target that reselected us. ** Grab the first message if any (IDENTIFY). ** Signal problem to C code for logging the event. - ** TARGET_RESET message. + ** M_RESET message. */ SCR_INT, SIR_RESEL_BAD_TARGET, @@ -4105,11 +4109,17 @@ static int ncr_prepare_nego(struct ncb *np, struct ccb *cp, u_char *msgptr) switch (nego) { case NS_SYNC: - msglen += spi_populate_sync_msg(msgptr + msglen, - tp->maxoffs ? tp->minsync : 0, tp->maxoffs); + msgptr[msglen++] = M_EXTENDED; + msgptr[msglen++] = 3; + msgptr[msglen++] = M_X_SYNC_REQ; + msgptr[msglen++] = tp->maxoffs ? tp->minsync : 0; + msgptr[msglen++] = tp->maxoffs; break; case NS_WIDE: - msglen += spi_populate_width_msg(msgptr + msglen, tp->usrwide); + msgptr[msglen++] = M_EXTENDED; + msgptr[msglen++] = 2; + msgptr[msglen++] = M_X_WIDE_REQ; + msgptr[msglen++] = tp->usrwide; break; } @@ -4210,7 +4220,7 @@ static int ncr_queue_command (struct ncb *np, struct scsi_cmnd *cmd) **---------------------------------------------------- */ - idmsg = IDENTIFY(0, sdev->lun); + idmsg = M_IDENTIFY | sdev->lun; if (cp ->tag != NO_TAG || (cp != np->ccb && np->disc && !(tp->usrflag & UF_NODISC))) @@ -4229,7 +4239,7 @@ static int ncr_queue_command (struct ncb *np, struct scsi_cmnd *cmd) */ if (lp && time_after(jiffies, lp->tags_stime)) { if (lp->tags_smap) { - order = ORDERED_QUEUE_TAG; + order = M_ORDERED_TAG; if ((DEBUG_FLAGS & DEBUG_TAGS)||bootverbose>2){ PRINT_ADDR(cmd, "ordered tag forced.\n"); @@ -4247,10 +4257,10 @@ static int ncr_queue_command (struct ncb *np, struct scsi_cmnd *cmd) case 0x08: /* READ_SMALL (6) */ case 0x28: /* READ_BIG (10) */ case 0xa8: /* READ_HUGE (12) */ - order = SIMPLE_QUEUE_TAG; + order = M_SIMPLE_TAG; break; default: - order = ORDERED_QUEUE_TAG; + order = M_ORDERED_TAG; } } msgptr[msglen++] = order; @@ -5118,7 +5128,8 @@ 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_move_tail(&cp->link_ccbq, &lp->skip_ccbq); + list_del(&cp->link_ccbq); + list_add_tail(&cp->link_ccbq, &lp->skip_ccbq); if (cp->queued) { --lp->queuedccbs; } @@ -6218,9 +6229,9 @@ static int ncr_int_par (struct ncb *np) if (!(dbc & 0xc0000000)) phase = (dbc >> 24) & 7; if (phase == 7) - msg = MSG_PARITY_ERROR; + msg = M_PARITY; else - msg = INITIATOR_ERROR; + msg = M_ID_ERROR; /* @@ -6784,8 +6795,6 @@ void ncr_int_sir (struct ncb *np) /*----------------------------------------------------------------------------- ** ** Was Sie schon immer ueber transfermode negotiation wissen wollten ... -** ("Everything you've always wanted to know about transfer mode -** negotiation") ** ** We try to negotiate sync and wide transfer only after ** a successful inquire command. We look at byte 7 of the @@ -6887,8 +6896,8 @@ void ncr_int_sir (struct ncb *np) break; } - np->msgin [0] = NOP; - np->msgout[0] = NOP; + np->msgin [0] = M_NOOP; + np->msgout[0] = M_NOOP; cp->nego_status = 0; break; @@ -6982,7 +6991,12 @@ void ncr_int_sir (struct ncb *np) spi_offset(starget) = ofs; ncr_setsync(np, cp, scntl3, (fak<<5)|ofs); - spi_populate_sync_msg(np->msgout, per, ofs); + np->msgout[0] = M_EXTENDED; + np->msgout[1] = 3; + np->msgout[2] = M_X_SYNC_REQ; + np->msgout[3] = per; + np->msgout[4] = ofs; + cp->nego_status = NS_SYNC; if (DEBUG_FLAGS & DEBUG_NEGO) { @@ -6993,7 +7007,7 @@ void ncr_int_sir (struct ncb *np) OUTL_DSP (NCB_SCRIPT_PHYS (np, msg_bad)); return; } - np->msgin [0] = NOP; + np->msgin [0] = M_NOOP; break; @@ -7068,9 +7082,13 @@ void ncr_int_sir (struct ncb *np) spi_width(starget) = wide; ncr_setwide(np, cp, wide, 1); - spi_populate_width_msg(np->msgout, wide); - np->msgin [0] = NOP; + np->msgout[0] = M_EXTENDED; + np->msgout[1] = 2; + np->msgout[2] = M_X_WIDE_REQ; + np->msgout[3] = wide; + + np->msgin [0] = M_NOOP; cp->nego_status = NS_WIDE; @@ -7089,12 +7107,12 @@ void ncr_int_sir (struct ncb *np) case SIR_REJECT_RECEIVED: /*----------------------------------------------- ** - ** We received a MESSAGE_REJECT. + ** We received a M_REJECT message. ** **----------------------------------------------- */ - PRINT_ADDR(cp->cmd, "MESSAGE_REJECT received (%x:%x).\n", + PRINT_ADDR(cp->cmd, "M_REJECT received (%x:%x).\n", (unsigned)scr_to_cpu(np->lastmsg), np->msgout[0]); break; @@ -7106,7 +7124,7 @@ void ncr_int_sir (struct ncb *np) **----------------------------------------------- */ - ncr_print_msg(cp, "MESSAGE_REJECT sent for", np->msgin); + ncr_print_msg(cp, "M_REJECT sent for", np->msgin); break; /*-------------------------------------------------------------------- @@ -7125,7 +7143,7 @@ void ncr_int_sir (struct ncb *np) **----------------------------------------------- */ - PRINT_ADDR(cp->cmd, "IGNORE_WIDE_RESIDUE received, but not yet " + PRINT_ADDR(cp->cmd, "M_IGN_RESIDUE received, but not yet " "implemented.\n"); break; #if 0 @@ -7138,7 +7156,7 @@ void ncr_int_sir (struct ncb *np) **----------------------------------------------- */ - PRINT_ADDR(cp->cmd, "DISCONNECT received, but datapointer " + PRINT_ADDR(cp->cmd, "M_DISCONNECT received, but datapointer " "not saved: data=%x save=%x goal=%x.\n", (unsigned) INL (nc_temp), (unsigned) scr_to_cpu(np->header.savep), @@ -7696,7 +7714,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->request_buffer; + struct scatterlist *scatter = (struct scatterlist *)cmd->buffer; struct scr_tblmove *data; if (use_sg > MAX_SCATTER) { @@ -7844,7 +7862,7 @@ static int __init ncr_snooptest (struct ncb* np) **========================================================== ** ** Note: we have to return the correct value. -** THERE IS NO SAFE DEFAULT VALUE. +** THERE IS NO SAVE DEFAULT VALUE. ** ** Most NCR/SYMBIOS boards are delivered with a 40 Mhz clock. ** 53C860 and 53C875 rev. 1 support fast20 transfers but @@ -8544,7 +8562,7 @@ struct Scsi_Host * __init ncr_attach(struct scsi_host_template *tpnt, /* use SIMPLE TAG messages by default */ #ifdef SCSI_NCR_ALWAYS_SIMPLE_TAG - np->order = SIMPLE_QUEUE_TAG; + np->order = M_SIMPLE_TAG; #endif spin_unlock_irqrestore(&np->smp_lock, flags); diff --git a/drivers/scsi/ncr53c8xx.h b/drivers/scsi/ncr53c8xx.h index 78818b668..6a7bef2e6 100644 --- a/drivers/scsi/ncr53c8xx.h +++ b/drivers/scsi/ncr53c8xx.h @@ -53,11 +53,11 @@ #ifndef NCR53C8XX_H #define NCR53C8XX_H +#include #include - /* -** If you want a driver as small as possible, donnot define the +** If you want a driver as small as possible, do not define the ** following options. */ #define SCSI_NCR_BOOT_COMMAND_LINE_SUPPORT @@ -1254,6 +1254,39 @@ struct scr_tblsel { **----------------------------------------------------------- */ +/* +** Messages +*/ + +#define M_COMPLETE COMMAND_COMPLETE +#define M_EXTENDED EXTENDED_MESSAGE +#define M_SAVE_DP SAVE_POINTERS +#define M_RESTORE_DP RESTORE_POINTERS +#define M_DISCONNECT DISCONNECT +#define M_ID_ERROR INITIATOR_ERROR +#define M_ABORT ABORT_TASK_SET +#define M_REJECT MESSAGE_REJECT +#define M_NOOP NOP +#define M_PARITY MSG_PARITY_ERROR +#define M_LCOMPLETE LINKED_CMD_COMPLETE +#define M_FCOMPLETE LINKED_FLG_CMD_COMPLETE +#define M_RESET TARGET_RESET +#define M_ABORT_TAG ABORT_TASK +#define M_CLEAR_QUEUE CLEAR_TASK_SET +#define M_INIT_REC INITIATE_RECOVERY +#define M_REL_REC RELEASE_RECOVERY +#define M_TERMINATE (0x11) +#define M_SIMPLE_TAG SIMPLE_QUEUE_TAG +#define M_HEAD_TAG HEAD_OF_QUEUE_TAG +#define M_ORDERED_TAG ORDERED_QUEUE_TAG +#define M_IGN_RESIDUE IGNORE_WIDE_RESIDUE +#define M_IDENTIFY (0x80) + +#define M_X_MODIFY_DP EXTENDED_MODIFY_DATA_POINTER +#define M_X_SYNC_REQ EXTENDED_SDTR +#define M_X_WIDE_REQ EXTENDED_WDTR +#define M_X_PPR_REQ EXTENDED_PPR + /* ** Status */ diff --git a/drivers/scsi/nsp32.c b/drivers/scsi/nsp32.c index bfb4f49e1..a279ebb61 100644 --- a/drivers/scsi/nsp32.c +++ b/drivers/scsi/nsp32.c @@ -38,7 +38,6 @@ #include #include #include -#include #include #include @@ -1636,7 +1635,7 @@ static void nsp32_scsi_done(struct scsi_cmnd *SCpnt) if (SCpnt->use_sg) { pci_unmap_sg(data->Pci, - (struct scatterlist *)SCpnt->request_buffer, + (struct scatterlist *)SCpnt->buffer, SCpnt->use_sg, SCpnt->sc_data_direction); } else { pci_unmap_single(data->Pci, @@ -2777,7 +2776,7 @@ static int nsp32_detect(struct scsi_host_template *sht) /* * setup DMA */ - if (pci_set_dma_mask(PCIDEV, DMA_32BIT_MASK) != 0) { + if (pci_set_dma_mask(PCIDEV, 0xffffffffUL) != 0) { nsp32_msg (KERN_ERR, "failed to set PCI DMA mask"); goto scsi_unregister; } @@ -2866,7 +2865,8 @@ static int nsp32_detect(struct scsi_host_template *sht) */ nsp32_do_bus_reset(data); - ret = request_irq(host->irq, do_nsp32_isr, IRQF_SHARED, "nsp32", data); + ret = request_irq(host->irq, do_nsp32_isr, + SA_SHIRQ | SA_SAMPLE_RANDOM, "nsp32", data); if (ret < 0) { nsp32_msg(KERN_ERR, "Unable to allocate IRQ for NinjaSCSI32 " "SCSI PCI controller. Interrupt: %d", host->irq); @@ -2885,19 +2885,12 @@ static int nsp32_detect(struct scsi_host_template *sht) } #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,73)) - ret = scsi_add_host(host, &PCIDEV->dev); - if (ret) { - nsp32_msg(KERN_ERR, "failed to add scsi host"); - goto free_region; - } + scsi_add_host (host, &PCIDEV->dev); 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 dd67a68c5..dee426f8c 100644 --- a/drivers/scsi/oktagon_esp.c +++ b/drivers/scsi/oktagon_esp.c @@ -6,6 +6,7 @@ * Based on cyber_esp.c */ +#include #if defined(CONFIG_AMIGA) || defined(CONFIG_APUS) #define USE_BOTTOM_HALF @@ -197,7 +198,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, IRQF_SHARED, + request_irq(IRQ_AMIGA_PORTS, esp_intr, SA_SHIRQ, "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 8a7340b02..08ce8d80d 100644 --- a/drivers/scsi/oktagon_io.S +++ b/drivers/scsi/oktagon_io.S @@ -23,6 +23,7 @@ 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 4a2fed350..d9946bd95 100644 --- a/drivers/scsi/osst.c +++ b/drivers/scsi/osst.c @@ -13,7 +13,7 @@ order) Klaus Ehrenfried, Wolfgang Denk, Steve Hirsch, Andreas Koppenh"ofer, Michael Leodolter, Eyal Lebedinsky, J"org Weule, and Eric Youngdale. - Copyright 1992 - 2002 Kai Makisara / 2000 - 2006 Willem Riede + Copyright 1992 - 2002 Kai Makisara / 2000 - 2004 Willem Riede email osst@riede.org $Header: /cvsroot/osst/Driver/osst.c,v 1.73 2005/01/01 21:13:34 wriede Exp $ @@ -24,7 +24,7 @@ */ static const char * cvsid = "$Id: osst.c,v 1.73 2005/01/01 21:13:34 wriede Exp $"; -static const char * osst_version = "0.99.4"; +static const char * osst_version = "0.99.3"; /* The "failure to reconnect" firmware bug */ #define OSST_FW_NEED_POLL_MIN 10601 /*(107A)*/ @@ -48,8 +48,8 @@ static const char * osst_version = "0.99.4"; #include #include #include +#include #include -#include #include #include #include @@ -70,6 +70,7 @@ static const char * osst_version = "0.99.4"; #include #include #include +#include #define ST_KILOBYTE 1024 @@ -86,7 +87,6 @@ static int max_sg_segs = 0; MODULE_AUTHOR("Willem Riede"); MODULE_DESCRIPTION("OnStream {DI-|FW-|SC-|USB}{30|50} Tape Driver"); MODULE_LICENSE("GPL"); -MODULE_ALIAS_CHARDEV_MAJOR(OSST_MAJOR); module_param(max_dev, int, 0444); MODULE_PARM_DESC(max_dev, "Maximum number of OnStream Tape Drives to attach (4)"); @@ -107,6 +107,8 @@ static struct osst_dev_parm { }; #endif +static char *osst_formats[ST_NBR_MODES] ={"", "l", "m", "a"}; + /* Some default definitions have been moved to osst_options.h */ #define OSST_BUFFER_SIZE (OSST_BUFFER_BLOCKS * ST_KILOBYTE) #define OSST_WRITE_THRESHOLD (OSST_WRITE_THRESHOLD_BLOCKS * ST_KILOBYTE) @@ -177,16 +179,16 @@ static struct scsi_driver osst_template = { } }; -static int osst_int_ioctl(struct osst_tape *STp, struct osst_request ** aSRpnt, +static int osst_int_ioctl(struct osst_tape *STp, struct scsi_request ** aSRpnt, unsigned int cmd_in, unsigned long arg); -static int osst_set_frame_position(struct osst_tape *STp, struct osst_request ** aSRpnt, int frame, int skip); +static int osst_set_frame_position(struct osst_tape *STp, struct scsi_request ** aSRpnt, int frame, int skip); -static int osst_get_frame_position(struct osst_tape *STp, struct osst_request ** aSRpnt); +static int osst_get_frame_position(struct osst_tape *STp, struct scsi_request ** aSRpnt); -static int osst_flush_write_buffer(struct osst_tape *STp, struct osst_request ** aSRpnt); +static int osst_flush_write_buffer(struct osst_tape *STp, struct scsi_request ** aSRpnt); -static int osst_write_error_recovery(struct osst_tape * STp, struct osst_request ** aSRpnt, int pending); +static int osst_write_error_recovery(struct osst_tape * STp, struct scsi_request ** aSRpnt, int pending); static inline char *tape_name(struct osst_tape *tape) { @@ -195,84 +197,52 @@ static inline char *tape_name(struct osst_tape *tape) /* Routines that handle the interaction with mid-layer SCSI routines */ - -/* Normalize Sense */ -static void osst_analyze_sense(struct osst_request *SRpnt, struct st_cmdstatus *s) -{ - const u8 *ucp; - const u8 *sense = SRpnt->sense; - - s->have_sense = scsi_normalize_sense(SRpnt->sense, - SCSI_SENSE_BUFFERSIZE, &s->sense_hdr); - s->flags = 0; - - if (s->have_sense) { - s->deferred = 0; - s->remainder_valid = - scsi_get_sense_info_fld(sense, SCSI_SENSE_BUFFERSIZE, &s->uremainder64); - switch (sense[0] & 0x7f) { - case 0x71: - s->deferred = 1; - case 0x70: - s->fixed_format = 1; - s->flags = sense[2] & 0xe0; - break; - case 0x73: - s->deferred = 1; - case 0x72: - s->fixed_format = 0; - ucp = scsi_sense_desc_find(sense, SCSI_SENSE_BUFFERSIZE, 4); - s->flags = ucp ? (ucp[3] & 0xe0) : 0; - break; - } - } -} - /* Convert the result to success code */ -static int osst_chk_result(struct osst_tape * STp, struct osst_request * SRpnt) +static int osst_chk_result(struct osst_tape * STp, struct scsi_request * SRpnt) { char *name = tape_name(STp); - int result = SRpnt->result; - u8 * sense = SRpnt->sense, scode; + int result = SRpnt->sr_result; + unsigned char * sense = SRpnt->sr_sense_buffer, scode; #if DEBUG const char *stp; #endif - struct st_cmdstatus *cmdstatp; - if (!result) + if (!result) { + sense[0] = 0; /* We don't have sense data if this byte is zero */ return 0; - - cmdstatp = &STp->buffer->cmdstat; - osst_analyze_sense(SRpnt, cmdstatp); - - if (cmdstatp->have_sense) - scode = STp->buffer->cmdstat.sense_hdr.sense_key; - else + } + if ((driver_byte(result) & DRIVER_MASK) == DRIVER_SENSE) + scode = sense[2] & 0x0f; + else { + sense[0] = 0; /* We don't have sense data if this byte is zero */ scode = 0; + } #if DEBUG if (debugging) { - printk(OSST_DEB_MSG "%s:D: Error: %x, cmd: %x %x %x %x %x %x\n", + printk(OSST_DEB_MSG "%s:D: Error: %x, cmd: %x %x %x %x %x %x Len: %d\n", name, result, - SRpnt->cmd[0], SRpnt->cmd[1], SRpnt->cmd[2], - SRpnt->cmd[3], SRpnt->cmd[4], SRpnt->cmd[5]); + SRpnt->sr_cmnd[0], SRpnt->sr_cmnd[1], SRpnt->sr_cmnd[2], + SRpnt->sr_cmnd[3], SRpnt->sr_cmnd[4], SRpnt->sr_cmnd[5], + SRpnt->sr_bufflen); if (scode) printk(OSST_DEB_MSG "%s:D: Sense: %02x, ASC: %02x, ASCQ: %02x\n", name, scode, sense[12], sense[13]); - if (cmdstatp->have_sense) - __scsi_print_sense("osst ", SRpnt->sense, SCSI_SENSE_BUFFERSIZE); + if (driver_byte(result) & DRIVER_SENSE) + scsi_print_req_sense("osst ", SRpnt); } else #endif - if (cmdstatp->have_sense && ( + if (!(driver_byte(result) & DRIVER_SENSE) || + ((sense[0] & 0x70) == 0x70 && scode != NO_SENSE && scode != RECOVERED_ERROR && /* scode != UNIT_ATTENTION && */ scode != BLANK_CHECK && scode != VOLUME_OVERFLOW && - SRpnt->cmd[0] != MODE_SENSE && - SRpnt->cmd[0] != TEST_UNIT_READY)) { /* Abnormal conditions for tape */ - if (cmdstatp->have_sense) { + SRpnt->sr_cmnd[0] != MODE_SENSE && + SRpnt->sr_cmnd[0] != TEST_UNIT_READY)) { /* Abnormal conditions for tape */ + if (driver_byte(result) & DRIVER_SENSE) { printk(KERN_WARNING "%s:W: Command with sense data:\n", name); - __scsi_print_sense("osst ", SRpnt->sense, SCSI_SENSE_BUFFERSIZE); + scsi_print_req_sense("osst:", SRpnt); } else { static int notyetprinted = 1; @@ -292,14 +262,15 @@ static int osst_chk_result(struct osst_tape * STp, struct osst_request * SRpnt) } STp->pos_unknown |= STp->device->was_reset; - if (cmdstatp->have_sense && scode == RECOVERED_ERROR) { + if ((sense[0] & 0x70) == 0x70 && + scode == RECOVERED_ERROR) { STp->recover_count++; STp->recover_erreg++; #if DEBUG if (debugging) { - if (SRpnt->cmd[0] == READ_6) + if (SRpnt->sr_cmnd[0] == READ_6) stp = "read"; - else if (SRpnt->cmd[0] == WRITE_6) + else if (SRpnt->sr_cmnd[0] == WRITE_6) stp = "write"; else stp = "ioctl"; @@ -315,99 +286,74 @@ static int osst_chk_result(struct osst_tape * STp, struct osst_request * SRpnt) /* Wakeup from interrupt */ -static void osst_sleep_done(void *data, char *sense, int result, int resid) +static void osst_sleep_done (struct scsi_cmnd * SCpnt) { - struct osst_request *SRpnt = data; - struct osst_tape *STp = SRpnt->stp; + struct osst_tape * STp = container_of(SCpnt->request->rq_disk->private_data, struct osst_tape, driver); + + if ((STp->buffer)->writing && + (SCpnt->sense_buffer[0] & 0x70) == 0x70 && + (SCpnt->sense_buffer[2] & 0x40)) { + /* EOM at write-behind, has all been written? */ + if ((SCpnt->sense_buffer[2] & 0x0f) == VOLUME_OVERFLOW) + STp->buffer->midlevel_result = SCpnt->result; /* Error */ + else + STp->buffer->midlevel_result = INT_MAX; /* OK */ + } + else + STp->buffer->midlevel_result = SCpnt->result; + SCpnt->request->rq_status = RQ_SCSI_DONE; + STp->buffer->last_SRpnt = SCpnt->sc_request; - memcpy(SRpnt->sense, sense, SCSI_SENSE_BUFFERSIZE); - STp->buffer->cmdstat.midlevel_result = SRpnt->result = result; #if DEBUG STp->write_pending = 0; #endif - if (SRpnt->waiting) - complete(SRpnt->waiting); + complete(SCpnt->request->waiting); } -/* osst_request memory management */ -static struct osst_request *osst_allocate_request(void) -{ - return kzalloc(sizeof(struct osst_request), GFP_KERNEL); -} - -static void osst_release_request(struct osst_request *streq) -{ - kfree(streq); -} /* Do the scsi command. Waits until command performed if do_wait is true. Otherwise osst_write_behind_check() is used to check that the command has finished. */ -static struct osst_request * osst_do_scsi(struct osst_request *SRpnt, struct osst_tape *STp, +static struct scsi_request * osst_do_scsi(struct scsi_request *SRpnt, struct osst_tape *STp, unsigned char *cmd, int bytes, int direction, int timeout, int retries, int do_wait) { unsigned char *bp; - unsigned short use_sg; #ifdef OSST_INJECT_ERRORS static int inject = 0; static int repeat = 0; #endif - struct completion *waiting; - - /* if async, make sure there's no command outstanding */ - if (!do_wait && ((STp->buffer)->last_SRpnt)) { - printk(KERN_ERR "%s: Async command already active.\n", - tape_name(STp)); - if (signal_pending(current)) - (STp->buffer)->syscall_result = (-EINTR); - else - (STp->buffer)->syscall_result = (-EBUSY); - return NULL; - } - if (SRpnt == NULL) { - SRpnt = osst_allocate_request(); - if (SRpnt == NULL) { - printk(KERN_ERR "%s: Can't allocate SCSI request.\n", - tape_name(STp)); + if ((SRpnt = scsi_allocate_request(STp->device, GFP_ATOMIC)) == NULL) { + printk(KERN_ERR "%s:E: Can't get SCSI request.\n", tape_name(STp)); if (signal_pending(current)) (STp->buffer)->syscall_result = (-EINTR); else (STp->buffer)->syscall_result = (-EBUSY); return NULL; } - SRpnt->stp = STp; } - /* If async IO, set last_SRpnt. This ptr tells write_behind_check - which IO is outstanding. It's nulled out when the IO completes. */ - if (!do_wait) - (STp->buffer)->last_SRpnt = SRpnt; - - waiting = &STp->wait; - init_completion(waiting); - SRpnt->waiting = waiting; - - use_sg = (bytes > STp->buffer->sg[0].length) ? STp->buffer->use_sg : 0; - if (use_sg) { + init_completion(&STp->wait); + SRpnt->sr_use_sg = (bytes > (STp->buffer)->sg[0].length) ? + (STp->buffer)->use_sg : 0; + if (SRpnt->sr_use_sg) { bp = (char *)&(STp->buffer->sg[0]); - if (STp->buffer->sg_segs < use_sg) - use_sg = STp->buffer->sg_segs; + if (STp->buffer->sg_segs < SRpnt->sr_use_sg) + SRpnt->sr_use_sg = STp->buffer->sg_segs; } else bp = (STp->buffer)->b_data; + SRpnt->sr_data_direction = direction; + SRpnt->sr_cmd_len = 0; + SRpnt->sr_request->waiting = &(STp->wait); + SRpnt->sr_request->rq_status = RQ_SCSI_BUSY; + SRpnt->sr_request->rq_disk = STp->drive; - memcpy(SRpnt->cmd, cmd, sizeof(SRpnt->cmd)); - STp->buffer->cmdstat.have_sense = 0; - STp->buffer->syscall_result = 0; + scsi_do_req(SRpnt, (void *)cmd, bp, bytes, osst_sleep_done, timeout, retries); - if (scsi_execute_async(STp->device, cmd, COMMAND_SIZE(cmd[0]), direction, bp, bytes, - use_sg, timeout, retries, SRpnt, osst_sleep_done, GFP_KERNEL)) - /* could not allocate the buffer or request was too large */ - (STp->buffer)->syscall_result = (-EBUSY); - else if (do_wait) { - wait_for_completion(waiting); - SRpnt->waiting = NULL; + if (do_wait) { + wait_for_completion(SRpnt->sr_request->waiting); + SRpnt->sr_request->waiting = NULL; STp->buffer->syscall_result = osst_chk_result(STp, SRpnt); #ifdef OSST_INJECT_ERRORS if (STp->buffer->syscall_result == 0 && @@ -440,22 +386,21 @@ static void osst_write_behind_check(struct osst_tape *STp) STp->nbr_finished++; #endif wait_for_completion(&(STp->wait)); - STp->buffer->last_SRpnt->waiting = NULL; + (STp->buffer)->last_SRpnt->sr_request->waiting = NULL; STp->buffer->syscall_result = osst_chk_result(STp, STp->buffer->last_SRpnt); - if (STp->buffer->syscall_result) - STp->buffer->syscall_result = - osst_write_error_recovery(STp, &(STp->buffer->last_SRpnt), 1); + if ((STp->buffer)->syscall_result) + (STp->buffer)->syscall_result = + osst_write_error_recovery(STp, &((STp->buffer)->last_SRpnt), 1); else STp->first_frame_position++; - osst_release_request(STp->buffer->last_SRpnt); + scsi_release_request((STp->buffer)->last_SRpnt); if (STbuffer->writing < STbuffer->buffer_bytes) printk(KERN_WARNING "osst :A: write_behind_check: something left in buffer!\n"); - STbuffer->last_SRpnt = NULL; STbuffer->buffer_bytes -= STbuffer->writing; STbuffer->writing = 0; @@ -664,11 +609,11 @@ err_out: /* * Wait for the unit to become Ready */ -static int osst_wait_ready(struct osst_tape * STp, struct osst_request ** aSRpnt, +static int osst_wait_ready(struct osst_tape * STp, struct scsi_request ** aSRpnt, unsigned timeout, int initial_delay) { unsigned char cmd[MAX_COMMAND_SIZE]; - struct osst_request * SRpnt; + struct scsi_request * SRpnt; unsigned long startwait = jiffies; #if DEBUG int dbg = debugging; @@ -688,10 +633,10 @@ static int osst_wait_ready(struct osst_tape * STp, struct osst_request ** aSRpnt if (!SRpnt) return (-EBUSY); while ( STp->buffer->syscall_result && time_before(jiffies, startwait + timeout*HZ) && - (( SRpnt->sense[2] == 2 && SRpnt->sense[12] == 4 && - (SRpnt->sense[13] == 1 || SRpnt->sense[13] == 8) ) || - ( SRpnt->sense[2] == 6 && SRpnt->sense[12] == 0x28 && - SRpnt->sense[13] == 0 ) )) { + (( SRpnt->sr_sense_buffer[2] == 2 && SRpnt->sr_sense_buffer[12] == 4 && + (SRpnt->sr_sense_buffer[13] == 1 || SRpnt->sr_sense_buffer[13] == 8) ) || + ( SRpnt->sr_sense_buffer[2] == 6 && SRpnt->sr_sense_buffer[12] == 0x28 && + SRpnt->sr_sense_buffer[13] == 0 ) )) { #if DEBUG if (debugging) { printk(OSST_DEB_MSG "%s:D: Sleeping in onstream wait ready\n", name); @@ -715,8 +660,8 @@ static int osst_wait_ready(struct osst_tape * STp, struct osst_request ** aSRpnt #if DEBUG printk(OSST_DEB_MSG "%s:D: Abnormal exit from onstream wait ready\n", name); printk(OSST_DEB_MSG "%s:D: Result = %d, Sense: 0=%02x, 2=%02x, 12=%02x, 13=%02x\n", name, - STp->buffer->syscall_result, SRpnt->sense[0], SRpnt->sense[2], - SRpnt->sense[12], SRpnt->sense[13]); + STp->buffer->syscall_result, SRpnt->sr_sense_buffer[0], SRpnt->sr_sense_buffer[2], + SRpnt->sr_sense_buffer[12], SRpnt->sr_sense_buffer[13]); #endif return (-EIO); } @@ -729,10 +674,10 @@ static int osst_wait_ready(struct osst_tape * STp, struct osst_request ** aSRpnt /* * Wait for a tape to be inserted in the unit */ -static int osst_wait_for_medium(struct osst_tape * STp, struct osst_request ** aSRpnt, unsigned timeout) +static int osst_wait_for_medium(struct osst_tape * STp, struct scsi_request ** aSRpnt, unsigned timeout) { unsigned char cmd[MAX_COMMAND_SIZE]; - struct osst_request * SRpnt; + struct scsi_request * SRpnt; unsigned long startwait = jiffies; #if DEBUG int dbg = debugging; @@ -749,7 +694,8 @@ static int osst_wait_for_medium(struct osst_tape * STp, struct osst_request ** a if (!SRpnt) return (-EBUSY); while ( STp->buffer->syscall_result && time_before(jiffies, startwait + timeout*HZ) && - SRpnt->sense[2] == 2 && SRpnt->sense[12] == 0x3a && SRpnt->sense[13] == 0 ) { + SRpnt->sr_sense_buffer[2] == 2 && SRpnt->sr_sense_buffer[12] == 0x3a && + SRpnt->sr_sense_buffer[13] == 0 ) { #if DEBUG if (debugging) { printk(OSST_DEB_MSG "%s:D: Sleeping in onstream wait medium\n", name); @@ -768,13 +714,13 @@ static int osst_wait_for_medium(struct osst_tape * STp, struct osst_request ** a #if DEBUG debugging = dbg; #endif - if ( STp->buffer->syscall_result && SRpnt->sense[2] != 2 && - SRpnt->sense[12] != 4 && SRpnt->sense[13] == 1) { + if ( STp->buffer->syscall_result && SRpnt->sr_sense_buffer[2] != 2 && + SRpnt->sr_sense_buffer[12] != 4 && SRpnt->sr_sense_buffer[13] == 1) { #if DEBUG printk(OSST_DEB_MSG "%s:D: Abnormal exit from onstream wait medium\n", name); printk(OSST_DEB_MSG "%s:D: Result = %d, Sense: 0=%02x, 2=%02x, 12=%02x, 13=%02x\n", name, - STp->buffer->syscall_result, SRpnt->sense[0], SRpnt->sense[2], - SRpnt->sense[12], SRpnt->sense[13]); + STp->buffer->syscall_result, SRpnt->sr_sense_buffer[0], SRpnt->sr_sense_buffer[2], + SRpnt->sr_sense_buffer[12], SRpnt->sr_sense_buffer[13]); #endif return 0; } @@ -784,7 +730,7 @@ static int osst_wait_for_medium(struct osst_tape * STp, struct osst_request ** a return 1; } -static int osst_position_tape_and_confirm(struct osst_tape * STp, struct osst_request ** aSRpnt, int frame) +static int osst_position_tape_and_confirm(struct osst_tape * STp, struct scsi_request ** aSRpnt, int frame) { int retval; @@ -798,10 +744,10 @@ static int osst_position_tape_and_confirm(struct osst_tape * STp, struct osst_re /* * Wait for write(s) to complete */ -static int osst_flush_drive_buffer(struct osst_tape * STp, struct osst_request ** aSRpnt) +static int osst_flush_drive_buffer(struct osst_tape * STp, struct scsi_request ** aSRpnt) { unsigned char cmd[MAX_COMMAND_SIZE]; - struct osst_request * SRpnt; + struct scsi_request * SRpnt; int result = 0; int delay = OSST_WAIT_WRITE_COMPLETE; #if DEBUG @@ -818,8 +764,8 @@ static int osst_flush_drive_buffer(struct osst_tape * STp, struct osst_request * *aSRpnt = SRpnt; if (!SRpnt) return (-EBUSY); if (STp->buffer->syscall_result) { - if ((SRpnt->sense[2] & 0x0f) == 2 && SRpnt->sense[12] == 4) { - if (SRpnt->sense[13] == 8) { + if ((SRpnt->sr_sense_buffer[2] & 0x0f) == 2 && SRpnt->sr_sense_buffer[12] == 4) { + if (SRpnt->sr_sense_buffer[13] == 8) { delay = OSST_WAIT_LONG_WRITE_COMPLETE; } } else @@ -832,7 +778,7 @@ static int osst_flush_drive_buffer(struct osst_tape * STp, struct osst_request * } #define OSST_POLL_PER_SEC 10 -static int osst_wait_frame(struct osst_tape * STp, struct osst_request ** aSRpnt, int curr, int minlast, int to) +static int osst_wait_frame(struct osst_tape * STp, struct scsi_request ** aSRpnt, int curr, int minlast, int to) { unsigned long startwait = jiffies; char * name = tape_name(STp); @@ -857,7 +803,7 @@ static int osst_wait_frame(struct osst_tape * STp, struct osst_request ** aSRpnt ) && result >= 0) { #if DEBUG - if (debugging || time_after_eq(jiffies, startwait + 2*HZ/OSST_POLL_PER_SEC)) + if (debugging || jiffies - startwait >= 2*HZ/OSST_POLL_PER_SEC) printk (OSST_DEB_MSG "%s:D: Succ wait f fr %i (>%i): %i-%i %i (%i): %3li.%li s\n", name, curr, curr+minlast, STp->first_frame_position, @@ -868,7 +814,7 @@ static int osst_wait_frame(struct osst_tape * STp, struct osst_request ** aSRpnt return 0; } #if DEBUG - if (time_after_eq(jiffies, startwait + 2*HZ/OSST_POLL_PER_SEC) && notyetprinted) + if (jiffies - startwait >= 2*HZ/OSST_POLL_PER_SEC && notyetprinted) { printk (OSST_DEB_MSG "%s:D: Wait for frame %i (>%i): %i-%i %i (%i)\n", name, curr, curr+minlast, STp->first_frame_position, @@ -887,9 +833,9 @@ static int osst_wait_frame(struct osst_tape * STp, struct osst_request ** aSRpnt return -EBUSY; } -static int osst_recover_wait_frame(struct osst_tape * STp, struct osst_request ** aSRpnt, int writing) +static int osst_recover_wait_frame(struct osst_tape * STp, struct scsi_request ** aSRpnt, int writing) { - struct osst_request * SRpnt; + struct scsi_request * SRpnt; unsigned char cmd[MAX_COMMAND_SIZE]; unsigned long startwait = jiffies; int retval = 1; @@ -910,7 +856,7 @@ static int osst_recover_wait_frame(struct osst_tape * STp, struct osst_request * while (retval && time_before (jiffies, startwait + 5*60*HZ)) { - if (STp->buffer->syscall_result && (SRpnt->sense[2] & 0x0f) != 2) { + if (STp->buffer->syscall_result && (SRpnt->sr_sense_buffer[2] & 0x0f) != 2) { /* some failure - not just not-ready */ retval = osst_write_error_recovery(STp, aSRpnt, 0); @@ -935,9 +881,9 @@ static int osst_recover_wait_frame(struct osst_tape * STp, struct osst_request * if (STp->buffer->syscall_result) printk(KERN_WARNING "%s:W: Recover_wait_frame(read) cannot handle %02x:%02x:%02x\n", name, - (*aSRpnt)->sense[ 2] & 0x0f, - (*aSRpnt)->sense[12], - (*aSRpnt)->sense[13]); + (*aSRpnt)->sr_sense_buffer[ 2] & 0x0f, + (*aSRpnt)->sr_sense_buffer[12], + (*aSRpnt)->sr_sense_buffer[13]); return retval; } @@ -945,10 +891,10 @@ static int osst_recover_wait_frame(struct osst_tape * STp, struct osst_request * /* * Read the next OnStream tape frame at the current location */ -static int osst_read_frame(struct osst_tape * STp, struct osst_request ** aSRpnt, int timeout) +static int osst_read_frame(struct osst_tape * STp, struct scsi_request ** aSRpnt, int timeout) { unsigned char cmd[MAX_COMMAND_SIZE]; - struct osst_request * SRpnt; + struct scsi_request * SRpnt; int retval = 0; #if DEBUG os_aux_t * aux = STp->buffer->aux; @@ -986,10 +932,10 @@ static int osst_read_frame(struct osst_tape * STp, struct osst_request ** aSRpnt if (debugging) printk(OSST_DEB_MSG "%s:D: Sense: %2x %2x %2x %2x %2x %2x %2x %2x\n", name, - SRpnt->sense[0], SRpnt->sense[1], - SRpnt->sense[2], SRpnt->sense[3], - SRpnt->sense[4], SRpnt->sense[5], - SRpnt->sense[6], SRpnt->sense[7]); + SRpnt->sr_sense_buffer[0], SRpnt->sr_sense_buffer[1], + SRpnt->sr_sense_buffer[2], SRpnt->sr_sense_buffer[3], + SRpnt->sr_sense_buffer[4], SRpnt->sr_sense_buffer[5], + SRpnt->sr_sense_buffer[6], SRpnt->sr_sense_buffer[7]); #endif } else @@ -1016,10 +962,10 @@ static int osst_read_frame(struct osst_tape * STp, struct osst_request ** aSRpnt return (retval); } -static int osst_initiate_read(struct osst_tape * STp, struct osst_request ** aSRpnt) +static int osst_initiate_read(struct osst_tape * STp, struct scsi_request ** aSRpnt) { struct st_partstat * STps = &(STp->ps[STp->partition]); - struct osst_request * SRpnt ; + struct scsi_request * SRpnt ; unsigned char cmd[MAX_COMMAND_SIZE]; int retval = 0; char * name = tape_name(STp); @@ -1053,7 +999,7 @@ static int osst_initiate_read(struct osst_tape * STp, struct osst_request ** aSR return retval; } -static int osst_get_logical_frame(struct osst_tape * STp, struct osst_request ** aSRpnt, +static int osst_get_logical_frame(struct osst_tape * STp, struct scsi_request ** aSRpnt, int frame_seq_number, int quiet) { struct st_partstat * STps = &(STp->ps[STp->partition]); @@ -1182,7 +1128,7 @@ static int osst_get_logical_frame(struct osst_tape * STp, struct osst_request ** return (STps->eof); } -static int osst_seek_logical_blk(struct osst_tape * STp, struct osst_request ** aSRpnt, int logical_blk_num) +static int osst_seek_logical_blk(struct osst_tape * STp, struct scsi_request ** aSRpnt, int logical_blk_num) { struct st_partstat * STps = &(STp->ps[STp->partition]); char * name = tape_name(STp); @@ -1291,7 +1237,7 @@ error: #define OSST_SECTOR_SHIFT 9 #define OSST_SECTOR_MASK 0x03F -static int osst_get_sector(struct osst_tape * STp, struct osst_request ** aSRpnt) +static int osst_get_sector(struct osst_tape * STp, struct scsi_request ** aSRpnt) { int sector; #if DEBUG @@ -1321,7 +1267,7 @@ static int osst_get_sector(struct osst_tape * STp, struct osst_request ** aSRpnt return sector; } -static int osst_seek_sector(struct osst_tape * STp, struct osst_request ** aSRpnt, int sector) +static int osst_seek_sector(struct osst_tape * STp, struct scsi_request ** aSRpnt, int sector) { struct st_partstat * STps = &(STp->ps[STp->partition]); int frame = sector >> OSST_FRAME_SHIFT, @@ -1384,10 +1330,10 @@ static int osst_seek_sector(struct osst_tape * STp, struct osst_request ** aSRpn * Precondition for this function to work: all frames in the * drive's buffer must be of one type (DATA, MARK or EOD)! */ -static int osst_read_back_buffer_and_rewrite(struct osst_tape * STp, struct osst_request ** aSRpnt, +static int osst_read_back_buffer_and_rewrite(struct osst_tape * STp, struct scsi_request ** aSRpnt, unsigned int frame, unsigned int skip, int pending) { - struct osst_request * SRpnt = * aSRpnt; + struct scsi_request * SRpnt = * aSRpnt; unsigned char * buffer, * p; unsigned char cmd[MAX_COMMAND_SIZE]; int flag, new_frame, i; @@ -1531,8 +1477,8 @@ static int osst_read_back_buffer_and_rewrite(struct osst_tape * STp, struct osst SRpnt = osst_do_scsi(SRpnt, STp, cmd, 0, DMA_NONE, STp->timeout, MAX_RETRIES, 1); - if (SRpnt->sense[2] == 2 && SRpnt->sense[12] == 4 && - (SRpnt->sense[13] == 1 || SRpnt->sense[13] == 8)) { + if (SRpnt->sr_sense_buffer[2] == 2 && SRpnt->sr_sense_buffer[12] == 4 && + (SRpnt->sr_sense_buffer[13] == 1 || SRpnt->sr_sense_buffer[13] == 8)) { /* in the process of becoming ready */ msleep(100); continue; @@ -1549,17 +1495,17 @@ static int osst_read_back_buffer_and_rewrite(struct osst_tape * STp, struct osst } *aSRpnt = SRpnt; if (flag) { - if ((SRpnt->sense[ 2] & 0x0f) == 13 && - SRpnt->sense[12] == 0 && - SRpnt->sense[13] == 2) { + if ((SRpnt->sr_sense_buffer[ 2] & 0x0f) == 13 && + SRpnt->sr_sense_buffer[12] == 0 && + SRpnt->sr_sense_buffer[13] == 2) { printk(KERN_ERR "%s:E: Volume overflow in write error recovery\n", name); vfree(buffer); return (-EIO); /* hit end of tape = fail */ } - i = ((SRpnt->sense[3] << 24) | - (SRpnt->sense[4] << 16) | - (SRpnt->sense[5] << 8) | - SRpnt->sense[6] ) - new_frame; + i = ((SRpnt->sr_sense_buffer[3] << 24) | + (SRpnt->sr_sense_buffer[4] << 16) | + (SRpnt->sr_sense_buffer[5] << 8) | + SRpnt->sr_sense_buffer[6] ) - new_frame; p = &buffer[i * OS_DATA_SIZE]; #if DEBUG printk(OSST_DEB_MSG "%s:D: Additional write error at %d\n", name, new_frame+i); @@ -1582,11 +1528,11 @@ static int osst_read_back_buffer_and_rewrite(struct osst_tape * STp, struct osst return 0; } -static int osst_reposition_and_retry(struct osst_tape * STp, struct osst_request ** aSRpnt, +static int osst_reposition_and_retry(struct osst_tape * STp, struct scsi_request ** aSRpnt, unsigned int frame, unsigned int skip, int pending) { unsigned char cmd[MAX_COMMAND_SIZE]; - struct osst_request * SRpnt; + struct scsi_request * SRpnt; char * name = tape_name(STp); int expected = 0; int attempts = 1000 / skip; @@ -1638,9 +1584,9 @@ static int osst_reposition_and_retry(struct osst_tape * STp, struct osst_request *aSRpnt = SRpnt; if (STp->buffer->syscall_result) { /* additional write error */ - if ((SRpnt->sense[ 2] & 0x0f) == 13 && - SRpnt->sense[12] == 0 && - SRpnt->sense[13] == 2) { + if ((SRpnt->sr_sense_buffer[ 2] & 0x0f) == 13 && + SRpnt->sr_sense_buffer[12] == 0 && + SRpnt->sr_sense_buffer[13] == 2) { printk(KERN_ERR "%s:E: Volume overflow in write error recovery\n", name); @@ -1685,9 +1631,9 @@ static int osst_reposition_and_retry(struct osst_tape * STp, struct osst_request * Error recovery algorithm for the OnStream tape. */ -static int osst_write_error_recovery(struct osst_tape * STp, struct osst_request ** aSRpnt, int pending) +static int osst_write_error_recovery(struct osst_tape * STp, struct scsi_request ** aSRpnt, int pending) { - struct osst_request * SRpnt = * aSRpnt; + struct scsi_request * SRpnt = * aSRpnt; struct st_partstat * STps = & STp->ps[STp->partition]; char * name = tape_name(STp); int retval = 0; @@ -1696,20 +1642,20 @@ static int osst_write_error_recovery(struct osst_tape * STp, struct osst_request rw_state = STps->rw; - if ((SRpnt->sense[ 2] & 0x0f) != 3 - || SRpnt->sense[12] != 12 - || SRpnt->sense[13] != 0) { + if ((SRpnt->sr_sense_buffer[ 2] & 0x0f) != 3 + || SRpnt->sr_sense_buffer[12] != 12 + || SRpnt->sr_sense_buffer[13] != 0) { #if DEBUG printk(OSST_DEB_MSG "%s:D: Write error recovery cannot handle %02x:%02x:%02x\n", name, - SRpnt->sense[2], SRpnt->sense[12], SRpnt->sense[13]); + SRpnt->sr_sense_buffer[2], SRpnt->sr_sense_buffer[12], SRpnt->sr_sense_buffer[13]); #endif return (-EIO); } - frame = (SRpnt->sense[3] << 24) | - (SRpnt->sense[4] << 16) | - (SRpnt->sense[5] << 8) | - SRpnt->sense[6]; - skip = SRpnt->sense[9]; + frame = (SRpnt->sr_sense_buffer[3] << 24) | + (SRpnt->sr_sense_buffer[4] << 16) | + (SRpnt->sr_sense_buffer[5] << 8) | + SRpnt->sr_sense_buffer[6]; + skip = SRpnt->sr_sense_buffer[9]; #if DEBUG printk(OSST_DEB_MSG "%s:D: Detected physical bad frame at %u, advised to skip %d\n", name, frame, skip); @@ -1764,7 +1710,7 @@ static int osst_write_error_recovery(struct osst_tape * STp, struct osst_request return retval; } -static int osst_space_over_filemarks_backward(struct osst_tape * STp, struct osst_request ** aSRpnt, +static int osst_space_over_filemarks_backward(struct osst_tape * STp, struct scsi_request ** aSRpnt, int mt_op, int mt_count) { char * name = tape_name(STp); @@ -1863,7 +1809,7 @@ found: * * Just scans for the filemark sequentially. */ -static int osst_space_over_filemarks_forward_slow(struct osst_tape * STp, struct osst_request ** aSRpnt, +static int osst_space_over_filemarks_forward_slow(struct osst_tape * STp, struct scsi_request ** aSRpnt, int mt_op, int mt_count) { int cnt = 0; @@ -1917,7 +1863,7 @@ static int osst_space_over_filemarks_forward_slow(struct osst_tape * STp, struct /* * Fast linux specific version of OnStream FSF */ -static int osst_space_over_filemarks_forward_fast(struct osst_tape * STp, struct osst_request ** aSRpnt, +static int osst_space_over_filemarks_forward_fast(struct osst_tape * STp, struct scsi_request ** aSRpnt, int mt_op, int mt_count) { char * name = tape_name(STp); @@ -2068,10 +2014,10 @@ static int osst_space_over_filemarks_forward_fast(struct osst_tape * STp, struct * to test the error recovery mechanism. */ #if DEBUG -static void osst_set_retries(struct osst_tape * STp, struct osst_request ** aSRpnt, int retries) +static void osst_set_retries(struct osst_tape * STp, struct scsi_request ** aSRpnt, int retries) { unsigned char cmd[MAX_COMMAND_SIZE]; - struct osst_request * SRpnt = * aSRpnt; + struct scsi_request * SRpnt = * aSRpnt; char * name = tape_name(STp); memset(cmd, 0, MAX_COMMAND_SIZE); @@ -2100,7 +2046,7 @@ static void osst_set_retries(struct osst_tape * STp, struct osst_request ** aSRp #endif -static int osst_write_filemark(struct osst_tape * STp, struct osst_request ** aSRpnt) +static int osst_write_filemark(struct osst_tape * STp, struct scsi_request ** aSRpnt) { int result; int this_mark_ppos = STp->first_frame_position; @@ -2128,7 +2074,7 @@ static int osst_write_filemark(struct osst_tape * STp, struct osst_request ** aS return result; } -static int osst_write_eod(struct osst_tape * STp, struct osst_request ** aSRpnt) +static int osst_write_eod(struct osst_tape * STp, struct scsi_request ** aSRpnt) { int result; #if DEBUG @@ -2151,7 +2097,7 @@ static int osst_write_eod(struct osst_tape * STp, struct osst_request ** aSRpnt) return result; } -static int osst_write_filler(struct osst_tape * STp, struct osst_request ** aSRpnt, int where, int count) +static int osst_write_filler(struct osst_tape * STp, struct scsi_request ** aSRpnt, int where, int count) { char * name = tape_name(STp); @@ -2176,7 +2122,7 @@ static int osst_write_filler(struct osst_tape * STp, struct osst_request ** aSRp return osst_flush_drive_buffer(STp, aSRpnt); } -static int __osst_write_header(struct osst_tape * STp, struct osst_request ** aSRpnt, int where, int count) +static int __osst_write_header(struct osst_tape * STp, struct scsi_request ** aSRpnt, int where, int count) { char * name = tape_name(STp); int result; @@ -2203,7 +2149,7 @@ static int __osst_write_header(struct osst_tape * STp, struct osst_request ** aS return result; } -static int osst_write_header(struct osst_tape * STp, struct osst_request ** aSRpnt, int locate_eod) +static int osst_write_header(struct osst_tape * STp, struct scsi_request ** aSRpnt, int locate_eod) { os_header_t * header; int result; @@ -2277,7 +2223,7 @@ static int osst_write_header(struct osst_tape * STp, struct osst_request ** aSRp return result; } -static int osst_reset_header(struct osst_tape * STp, struct osst_request ** aSRpnt) +static int osst_reset_header(struct osst_tape * STp, struct scsi_request ** aSRpnt) { if (STp->header_cache != NULL) memset(STp->header_cache, 0, sizeof(os_header_t)); @@ -2290,7 +2236,7 @@ static int osst_reset_header(struct osst_tape * STp, struct osst_request ** aSRp return osst_write_header(STp, aSRpnt, 1); } -static int __osst_analyze_headers(struct osst_tape * STp, struct osst_request ** aSRpnt, int ppos) +static int __osst_analyze_headers(struct osst_tape * STp, struct scsi_request ** aSRpnt, int ppos) { char * name = tape_name(STp); os_header_t * header; @@ -2467,7 +2413,7 @@ static int __osst_analyze_headers(struct osst_tape * STp, struct osst_request ** return 1; } -static int osst_analyze_headers(struct osst_tape * STp, struct osst_request ** aSRpnt) +static int osst_analyze_headers(struct osst_tape * STp, struct scsi_request ** aSRpnt) { int position, ppos; int first, last; @@ -2522,7 +2468,7 @@ static int osst_analyze_headers(struct osst_tape * STp, struct osst_request ** a return 1; } -static int osst_verify_position(struct osst_tape * STp, struct osst_request ** aSRpnt) +static int osst_verify_position(struct osst_tape * STp, struct scsi_request ** aSRpnt) { int frame_position = STp->first_frame_position; int frame_seq_numbr = STp->frame_seq_number; @@ -2598,11 +2544,11 @@ static unsigned int osst_parse_firmware_rev (const char * str) /* * Configure the OnStream SCII tape drive for default operation */ -static int osst_configure_onstream(struct osst_tape *STp, struct osst_request ** aSRpnt) +static int osst_configure_onstream(struct osst_tape *STp, struct scsi_request ** aSRpnt) { unsigned char cmd[MAX_COMMAND_SIZE]; char * name = tape_name(STp); - struct osst_request * SRpnt = * aSRpnt; + struct scsi_request * SRpnt = * aSRpnt; osst_mode_parameter_header_t * header; osst_block_size_page_t * bs; osst_capabilities_page_t * cp; @@ -2769,7 +2715,7 @@ static int osst_configure_onstream(struct osst_tape *STp, struct osst_request ** /* Step over EOF if it has been inadvertently crossed (ioctl not used because it messes up the block number). */ -static int cross_eof(struct osst_tape *STp, struct osst_request ** aSRpnt, int forward) +static int cross_eof(struct osst_tape *STp, struct scsi_request ** aSRpnt, int forward) { int result; char * name = tape_name(STp); @@ -2798,10 +2744,10 @@ static int cross_eof(struct osst_tape *STp, struct osst_request ** aSRpnt, int f /* Get the tape position. */ -static int osst_get_frame_position(struct osst_tape *STp, struct osst_request ** aSRpnt) +static int osst_get_frame_position(struct osst_tape *STp, struct scsi_request ** aSRpnt) { unsigned char scmd[MAX_COMMAND_SIZE]; - struct osst_request * SRpnt; + struct scsi_request * SRpnt; int result = 0; char * name = tape_name(STp); @@ -2826,14 +2772,14 @@ static int osst_get_frame_position(struct osst_tape *STp, struct osst_request ** *aSRpnt = SRpnt; if (STp->buffer->syscall_result) - result = ((SRpnt->sense[2] & 0x0f) == 3) ? -EIO : -EINVAL; /* 3: Write Error */ + result = ((SRpnt->sr_sense_buffer[2] & 0x0f) == 3) ? -EIO : -EINVAL; /* 3: Write Error */ if (result == -EINVAL) printk(KERN_ERR "%s:E: Can't read tape position.\n", name); else { if (result == -EIO) { /* re-read position - this needs to preserve media errors */ unsigned char mysense[16]; - memcpy (mysense, SRpnt->sense, 16); + memcpy (mysense, SRpnt->sr_sense_buffer, 16); memset (scmd, 0, MAX_COMMAND_SIZE); scmd[0] = READ_POSITION; STp->buffer->b_data = mybuf; STp->buffer->buffer_size = 24; @@ -2842,10 +2788,10 @@ static int osst_get_frame_position(struct osst_tape *STp, struct osst_request ** #if DEBUG printk(OSST_DEB_MSG "%s:D: Reread position, reason=[%02x:%02x:%02x], result=[%s%02x:%02x:%02x]\n", name, mysense[2], mysense[12], mysense[13], STp->buffer->syscall_result?"":"ok:", - SRpnt->sense[2],SRpnt->sense[12],SRpnt->sense[13]); + SRpnt->sr_sense_buffer[2],SRpnt->sr_sense_buffer[12],SRpnt->sr_sense_buffer[13]); #endif if (!STp->buffer->syscall_result) - memcpy (SRpnt->sense, mysense, 16); + memcpy (SRpnt->sr_sense_buffer, mysense, 16); else printk(KERN_WARNING "%s:W: Double error in get position\n", name); } @@ -2882,10 +2828,10 @@ static int osst_get_frame_position(struct osst_tape *STp, struct osst_request ** /* Set the tape block */ -static int osst_set_frame_position(struct osst_tape *STp, struct osst_request ** aSRpnt, int ppos, int skip) +static int osst_set_frame_position(struct osst_tape *STp, struct scsi_request ** aSRpnt, int ppos, int skip) { unsigned char scmd[MAX_COMMAND_SIZE]; - struct osst_request * SRpnt; + struct scsi_request * SRpnt; struct st_partstat * STps; int result = 0; int pp = (ppos == 3000 && !skip)? 0 : ppos; @@ -2940,7 +2886,7 @@ static int osst_set_frame_position(struct osst_tape *STp, struct osst_request ** return result; } -static int osst_write_trailer(struct osst_tape *STp, struct osst_request ** aSRpnt, int leave_at_EOT) +static int osst_write_trailer(struct osst_tape *STp, struct scsi_request ** aSRpnt, int leave_at_EOT) { struct st_partstat * STps = &(STp->ps[STp->partition]); int result = 0; @@ -2967,12 +2913,12 @@ out: /* osst versions of st functions - augmented and stripped to suit OnStream only */ /* Flush the write buffer (never need to write if variable blocksize). */ -static int osst_flush_write_buffer(struct osst_tape *STp, struct osst_request ** aSRpnt) +static int osst_flush_write_buffer(struct osst_tape *STp, struct scsi_request ** aSRpnt) { int offset, transfer, blks = 0; int result = 0; unsigned char cmd[MAX_COMMAND_SIZE]; - struct osst_request * SRpnt = *aSRpnt; + struct scsi_request * SRpnt = *aSRpnt; struct st_partstat * STps; char * name = tape_name(STp); @@ -2980,13 +2926,13 @@ static int osst_flush_write_buffer(struct osst_tape *STp, struct osst_request ** if (SRpnt == (STp->buffer)->last_SRpnt) #if DEBUG { printk(OSST_DEB_MSG - "%s:D: aSRpnt points to osst_request that write_behind_check will release -- cleared\n", name); + "%s:D: aSRpnt points to scsi_request that write_behind_check will release -- cleared\n", name); #endif *aSRpnt = SRpnt = NULL; #if DEBUG } else if (SRpnt) printk(OSST_DEB_MSG - "%s:D: aSRpnt does not point to osst_request that write_behind_check will release -- strange\n", name); + "%s:D: aSRpnt does not point to scsi_request that write_behind_check will release -- strange\n", name); #endif osst_write_behind_check(STp); if ((STp->buffer)->syscall_result) { @@ -3064,12 +3010,12 @@ static int osst_flush_write_buffer(struct osst_tape *STp, struct osst_request ** #if DEBUG printk(OSST_DEB_MSG "%s:D: write sense [0]=0x%02x [2]=%02x [12]=%02x [13]=%02x\n", - name, SRpnt->sense[0], SRpnt->sense[2], - SRpnt->sense[12], SRpnt->sense[13]); + name, SRpnt->sr_sense_buffer[0], SRpnt->sr_sense_buffer[2], + SRpnt->sr_sense_buffer[12], SRpnt->sr_sense_buffer[13]); #endif - if ((SRpnt->sense[0] & 0x70) == 0x70 && - (SRpnt->sense[2] & 0x40) && /* FIXME - SC-30 drive doesn't assert EOM bit */ - (SRpnt->sense[2] & 0x0f) == NO_SENSE) { + if ((SRpnt->sr_sense_buffer[0] & 0x70) == 0x70 && + (SRpnt->sr_sense_buffer[2] & 0x40) && /* FIXME - SC-30 drive doesn't assert EOM bit */ + (SRpnt->sr_sense_buffer[2] & 0x0f) == NO_SENSE) { STp->dirty = 0; (STp->buffer)->buffer_bytes = 0; result = (-ENOSPC); @@ -3097,7 +3043,7 @@ static int osst_flush_write_buffer(struct osst_tape *STp, struct osst_request ** /* Flush the tape buffer. The tape will be positioned correctly unless seek_next is true. */ -static int osst_flush_buffer(struct osst_tape * STp, struct osst_request ** aSRpnt, int seek_next) +static int osst_flush_buffer(struct osst_tape * STp, struct scsi_request ** aSRpnt, int seek_next) { struct st_partstat * STps; int backspace = 0, result = 0; @@ -3159,10 +3105,10 @@ static int osst_flush_buffer(struct osst_tape * STp, struct osst_request ** aSRp return result; } -static int osst_write_frame(struct osst_tape * STp, struct osst_request ** aSRpnt, int synchronous) +static int osst_write_frame(struct osst_tape * STp, struct scsi_request ** aSRpnt, int synchronous) { unsigned char cmd[MAX_COMMAND_SIZE]; - struct osst_request * SRpnt; + struct scsi_request * SRpnt; int blks; #if DEBUG char * name = tape_name(STp); @@ -3223,9 +3169,9 @@ static int osst_write_frame(struct osst_tape * STp, struct osst_request ** aSRpn if (debugging) printk(OSST_DEB_MSG "%s:D: Error on write:\n", name); #endif - if ((SRpnt->sense[0] & 0x70) == 0x70 && - (SRpnt->sense[2] & 0x40)) { - if ((SRpnt->sense[2] & 0x0f) == VOLUME_OVERFLOW) + if ((SRpnt->sr_sense_buffer[0] & 0x70) == 0x70 && + (SRpnt->sr_sense_buffer[2] & 0x40)) { + if ((SRpnt->sr_sense_buffer[2] & 0x0f) == VOLUME_OVERFLOW) return (-ENOSPC); } else { @@ -3242,7 +3188,7 @@ static int osst_write_frame(struct osst_tape * STp, struct osst_request ** aSRpn return 0; } -/* Lock or unlock the drive door. Don't use when struct osst_request allocated. */ +/* Lock or unlock the drive door. Don't use when struct scsi_request allocated. */ static int do_door_lock(struct osst_tape * STp, int do_lock) { int retval, cmd; @@ -3290,7 +3236,7 @@ static ssize_t osst_write(struct file * filp, const char __user * buf, size_t co int write_threshold; int doing_write = 0; const char __user * b_point; - struct osst_request * SRpnt = NULL; + struct scsi_request * SRpnt = NULL; struct st_modedef * STm; struct st_partstat * STps; struct osst_tape * STp = filp->private_data; @@ -3481,7 +3427,7 @@ if (SRpnt) printk(KERN_ERR "%s:A: Not supposed to have SRpnt at line %d\n", name #if DEBUG if (debugging) printk(OSST_DEB_MSG "%s:D: Writing %d bytes to file %d block %d lblk %d fseq %d fppos %d\n", - name, (int) count, STps->drv_file, STps->drv_block, + name, count, STps->drv_file, STps->drv_block, STp->logical_blk_num, STp->frame_seq_number, STp->first_frame_position); #endif b_point = buf; @@ -3517,7 +3463,7 @@ if (SRpnt) printk(KERN_ERR "%s:A: Not supposed to have SRpnt at line %d\n", name #if DEBUG if (debugging) printk(OSST_DEB_MSG "%s:D: EOM with %d bytes unwritten.\n", - name, (int) transfer); + name, transfer); #endif } else { @@ -3535,7 +3481,7 @@ if (SRpnt) printk(KERN_ERR "%s:A: Not supposed to have SRpnt at line %d\n", name if (retval < 0) { if (SRpnt != NULL) { - osst_release_request(SRpnt); + scsi_release_request(SRpnt); SRpnt = NULL; } STp->buffer->buffer_bytes = 0; @@ -3597,7 +3543,7 @@ if (SRpnt) printk(KERN_ERR "%s:A: Not supposed to have SRpnt at line %d\n", name retval = total; out: - if (SRpnt != NULL) osst_release_request(SRpnt); + if (SRpnt != NULL) scsi_release_request(SRpnt); up(&STp->lock); @@ -3613,7 +3559,7 @@ static ssize_t osst_read(struct file * filp, char __user * buf, size_t count, lo int special; struct st_modedef * STm; struct st_partstat * STps; - struct osst_request * SRpnt = NULL; + struct scsi_request * SRpnt = NULL; struct osst_tape * STp = filp->private_data; char * name = tape_name(STp); @@ -3721,7 +3667,7 @@ static ssize_t osst_read(struct file * filp, char __user * buf, size_t count, lo #if DEBUG if (debugging && STps->eof != ST_NOEOF) printk(OSST_DEB_MSG "%s:D: EOF up (%d). Left %d, needed %d.\n", name, - STps->eof, (STp->buffer)->buffer_bytes, (int) (count - total)); + STps->eof, (STp->buffer)->buffer_bytes, count - total); #endif /* force multiple of block size, note block_size may have been adjusted */ transfer = (((STp->buffer)->buffer_bytes < count - total ? @@ -3782,7 +3728,7 @@ static ssize_t osst_read(struct file * filp, char __user * buf, size_t count, lo retval = total; out: - if (SRpnt != NULL) osst_release_request(SRpnt); + if (SRpnt != NULL) scsi_release_request(SRpnt); up(&STp->lock); @@ -3970,7 +3916,7 @@ static int osst_set_options(struct osst_tape *STp, long options) /* Internal ioctl function */ -static int osst_int_ioctl(struct osst_tape * STp, struct osst_request ** aSRpnt, +static int osst_int_ioctl(struct osst_tape * STp, struct scsi_request ** aSRpnt, unsigned int cmd_in, unsigned long arg) { int timeout; @@ -3978,7 +3924,7 @@ static int osst_int_ioctl(struct osst_tape * STp, struct osst_request ** aSRpnt, int i, ioctl_result; int chg_eof = 1; unsigned char cmd[MAX_COMMAND_SIZE]; - struct osst_request * SRpnt = * aSRpnt; + struct scsi_request * SRpnt = * aSRpnt; struct st_partstat * STps; int fileno, blkno, at_sm, frame_seq_numbr, logical_blk_num; int datalen = 0, direction = DMA_NONE; @@ -4336,14 +4282,14 @@ os_bypass: } else if (cmd_in == MTERASE) { STp->header_ok = 0; } else if (SRpnt) { /* SCSI command was not completely successful. */ - if (SRpnt->sense[2] & 0x40) { + if (SRpnt->sr_sense_buffer[2] & 0x40) { STps->eof = ST_EOM_OK; STps->drv_block = 0; } if (chg_eof) STps->eof = ST_NOEOF; - if ((SRpnt->sense[2] & 0x0f) == BLANK_CHECK) + if ((SRpnt->sr_sense_buffer[2] & 0x0f) == BLANK_CHECK) STps->eof = ST_EOD; if (cmd_in == MTLOAD && osst_wait_for_medium(STp, &SRpnt, 60)) @@ -4361,7 +4307,7 @@ static int os_scsi_tape_open(struct inode * inode, struct file * filp) unsigned short flags; int i, b_size, new_session = 0, retval = 0; unsigned char cmd[MAX_COMMAND_SIZE]; - struct osst_request * SRpnt = NULL; + struct scsi_request * SRpnt = NULL; struct osst_tape * STp; struct st_modedef * STm; struct st_partstat * STps; @@ -4469,17 +4415,17 @@ static int os_scsi_tape_open(struct inode * inode, struct file * filp) retval = (STp->buffer)->syscall_result; /* FIXME - valid? */ goto err_out; } - if ((SRpnt->sense[0] & 0x70) == 0x70 && - (SRpnt->sense[2] & 0x0f) == NOT_READY && - SRpnt->sense[12] == 4 ) { + if ((SRpnt->sr_sense_buffer[0] & 0x70) == 0x70 && + (SRpnt->sr_sense_buffer[2] & 0x0f) == NOT_READY && + SRpnt->sr_sense_buffer[12] == 4 ) { #if DEBUG - printk(OSST_DEB_MSG "%s:D: Unit not ready, cause %x\n", name, SRpnt->sense[13]); + printk(OSST_DEB_MSG "%s:D: Unit not ready, cause %x\n", name, SRpnt->sr_sense_buffer[13]); #endif if (filp->f_flags & O_NONBLOCK) { retval = -EAGAIN; goto err_out; } - if (SRpnt->sense[13] == 2) { /* initialize command required (LOAD) */ + if (SRpnt->sr_sense_buffer[13] == 2) { /* initialize command required (LOAD) */ memset (cmd, 0, MAX_COMMAND_SIZE); cmd[0] = START_STOP; cmd[1] = 1; @@ -4487,10 +4433,10 @@ static int os_scsi_tape_open(struct inode * inode, struct file * filp) SRpnt = osst_do_scsi(SRpnt, STp, cmd, 0, DMA_NONE, STp->timeout, MAX_RETRIES, 1); } - osst_wait_ready(STp, &SRpnt, (SRpnt->sense[13]==1?15:3) * 60, 0); + osst_wait_ready(STp, &SRpnt, (SRpnt->sr_sense_buffer[13]==1?15:3) * 60, 0); } - if ((SRpnt->sense[0] & 0x70) == 0x70 && - (SRpnt->sense[2] & 0x0f) == UNIT_ATTENTION) { /* New media? */ + if ((SRpnt->sr_sense_buffer[0] & 0x70) == 0x70 && + (SRpnt->sr_sense_buffer[2] & 0x0f) == UNIT_ATTENTION) { /* New media? */ #if DEBUG printk(OSST_DEB_MSG "%s:D: Unit wants attention\n", name); #endif @@ -4503,8 +4449,8 @@ static int os_scsi_tape_open(struct inode * inode, struct file * filp) SRpnt = osst_do_scsi(SRpnt, STp, cmd, 0, DMA_NONE, STp->timeout, MAX_RETRIES, 1); - if ((SRpnt->sense[0] & 0x70) != 0x70 || - (SRpnt->sense[2] & 0x0f) != UNIT_ATTENTION) + if ((SRpnt->sr_sense_buffer[0] & 0x70) != 0x70 || + (SRpnt->sr_sense_buffer[2] & 0x0f) != UNIT_ATTENTION) break; } @@ -4530,7 +4476,7 @@ static int os_scsi_tape_open(struct inode * inode, struct file * filp) * open without reconfiguring and re-reading the headers */ if (!STp->buffer->syscall_result && STp->header_ok && - !SRpnt->result && SRpnt->sense[0] == 0) { + !SRpnt->sr_result && SRpnt->sr_sense_buffer[0] == 0) { memset(cmd, 0, MAX_COMMAND_SIZE); cmd[0] = MODE_SENSE; @@ -4569,7 +4515,7 @@ static int os_scsi_tape_open(struct inode * inode, struct file * filp) } STp->buffer->buffer_blocks = OS_DATA_SIZE / STp->block_size; STp->fast_open = 1; - osst_release_request(SRpnt); + scsi_release_request(SRpnt); return 0; } #if DEBUG @@ -4582,7 +4528,7 @@ static int os_scsi_tape_open(struct inode * inode, struct file * filp) STp->fast_open = 0; if ((STp->buffer)->syscall_result != 0 && /* in all error conditions except no medium */ - (SRpnt->sense[2] != 2 || SRpnt->sense[12] != 0x3A) ) { + (SRpnt->sr_sense_buffer[2] != 2 || SRpnt->sr_sense_buffer[12] != 0x3A) ) { memset(cmd, 0, MAX_COMMAND_SIZE); cmd[0] = MODE_SELECT; @@ -4612,11 +4558,11 @@ static int os_scsi_tape_open(struct inode * inode, struct file * filp) SRpnt = osst_do_scsi(SRpnt, STp, cmd, 0, DMA_NONE, STp->timeout, MAX_RETRIES, 1); - if ((SRpnt->sense[0] & 0x70) != 0x70 || - (SRpnt->sense[2] & 0x0f) == NOT_READY) + if ((SRpnt->sr_sense_buffer[0] & 0x70) != 0x70 || + (SRpnt->sr_sense_buffer[2] & 0x0f) == NOT_READY) break; - if ((SRpnt->sense[2] & 0x0f) == UNIT_ATTENTION) { + if ((SRpnt->sr_sense_buffer[2] & 0x0f) == UNIT_ATTENTION) { STp->pos_unknown = 0; STp->partition = STp->new_partition = 0; if (STp->can_partitions) @@ -4640,13 +4586,13 @@ static int os_scsi_tape_open(struct inode * inode, struct file * filp) if ((STp->buffer)->syscall_result != 0) { if ((STp->device)->scsi_level >= SCSI_2 && - (SRpnt->sense[0] & 0x70) == 0x70 && - (SRpnt->sense[2] & 0x0f) == NOT_READY && - SRpnt->sense[12] == 0x3a) { /* Check ASC */ + (SRpnt->sr_sense_buffer[0] & 0x70) == 0x70 && + (SRpnt->sr_sense_buffer[2] & 0x0f) == NOT_READY && + SRpnt->sr_sense_buffer[12] == 0x3a) { /* Check ASC */ STp->ready = ST_NO_TAPE; } else STp->ready = ST_NOT_READY; - osst_release_request(SRpnt); + scsi_release_request(SRpnt); SRpnt = NULL; STp->density = 0; /* Clear the erroneous "residue" */ STp->write_prot = 0; @@ -4706,14 +4652,14 @@ static int os_scsi_tape_open(struct inode * inode, struct file * filp) osst_analyze_headers(STp, &SRpnt); - osst_release_request(SRpnt); + scsi_release_request(SRpnt); SRpnt = NULL; return 0; err_out: if (SRpnt != NULL) - osst_release_request(SRpnt); + scsi_release_request(SRpnt); normalize_buffer(STp->buffer); STp->header_ok = 0; STp->in_use = 0; @@ -4724,13 +4670,13 @@ err_out: /* Flush the tape buffer before close */ -static int os_scsi_tape_flush(struct file * filp, fl_owner_t id) +static int os_scsi_tape_flush(struct file * filp) { int result = 0, result2; struct osst_tape * STp = filp->private_data; struct st_modedef * STm = &(STp->modes[STp->current_mode]); struct st_partstat * STps = &(STp->ps[STp->partition]); - struct osst_request * SRpnt = NULL; + struct scsi_request * SRpnt = NULL; char * name = tape_name(STp); if (file_count(filp) > 1) @@ -4793,7 +4739,7 @@ out: if (result == 0 && result2 < 0) result = result2; } - if (SRpnt) osst_release_request(SRpnt); + if (SRpnt) scsi_release_request(SRpnt); if (STp->abort_count || STp->recover_count) { printk(KERN_INFO "%s:I:", name); @@ -4847,7 +4793,7 @@ static int osst_ioctl(struct inode * inode,struct file * file, unsigned int blk; struct st_modedef * STm; struct st_partstat * STps; - struct osst_request * SRpnt = NULL; + struct scsi_request * SRpnt = NULL; struct osst_tape * STp = file->private_data; char * name = tape_name(STp); void __user * p = (void __user *)arg; @@ -5161,14 +5107,14 @@ static int osst_ioctl(struct inode * inode,struct file * file, retval = -EFAULT; goto out; } - if (SRpnt) osst_release_request(SRpnt); + if (SRpnt) scsi_release_request(SRpnt); up(&STp->lock); return scsi_ioctl(STp->device, cmd_in, p); out: - if (SRpnt) osst_release_request(SRpnt); + if (SRpnt) scsi_release_request(SRpnt); up(&STp->lock); @@ -5492,7 +5438,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 +5453,7 @@ static int __init osst_setup (char *str) break; } } - if (i >= ARRAY_SIZE(parms)) + if (i >= sizeof(parms) / sizeof(struct osst_dev_parm)) printk(KERN_INFO "osst :I: Illegal parameter in '%s'\n", stp); stp = strchr(stp, ','); @@ -5721,7 +5667,7 @@ static int osst_probe(struct device *dev) struct st_partstat * STps; struct osst_buffer * buffer; struct gendisk * drive; - int i, dev_num; + int i, mode, dev_num; if (SDp->type != TYPE_TAPE || !osst_supports(SDp)) return -ENODEV; @@ -5857,6 +5803,18 @@ static int osst_probe(struct device *dev) snprintf(name, 8, "%s%s", "n", tape_name(tpnt)); osst_sysfs_add(MKDEV(OSST_MAJOR, dev_num + 128), dev, tpnt, name); } + for (mode = 0; mode < ST_NBR_MODES; ++mode) { + /* Rewind entry */ + devfs_mk_cdev(MKDEV(OSST_MAJOR, dev_num + (mode << 5)), + S_IFCHR | S_IRUGO | S_IWUGO, + "%s/ot%s", SDp->devfs_name, osst_formats[mode]); + + /* No-rewind entry */ + devfs_mk_cdev(MKDEV(OSST_MAJOR, dev_num + (mode << 5) + 128), + S_IFCHR | S_IRUGO | S_IWUGO, + "%s/ot%sn", SDp->devfs_name, osst_formats[mode]); + } + drive->number = devfs_register_tape(SDp->devfs_name); sdev_printk(KERN_INFO, SDp, "osst :I: Attached OnStream %.5s tape as %s\n", @@ -5873,7 +5831,7 @@ static int osst_remove(struct device *dev) { struct scsi_device * SDp = to_scsi_device(dev); struct osst_tape * tpnt; - int i; + int i, mode; if ((SDp->type != TYPE_TAPE) || (osst_nr_dev <= 0)) return 0; @@ -5884,6 +5842,11 @@ static int osst_remove(struct device *dev) osst_sysfs_destroy(MKDEV(OSST_MAJOR, i)); osst_sysfs_destroy(MKDEV(OSST_MAJOR, i+128)); tpnt->device = NULL; + for (mode = 0; mode < ST_NBR_MODES; ++mode) { + devfs_remove("%s/ot%s", SDp->devfs_name, osst_formats[mode]); + devfs_remove("%s/ot%sn", SDp->devfs_name, osst_formats[mode]); + } + devfs_unregister_tape(tpnt->drive->number); put_disk(tpnt->drive); os_scsi_tapes[i] = NULL; osst_nr_dev--; diff --git a/drivers/scsi/osst.h b/drivers/scsi/osst.h index 1e426f5d0..b72e1c76f 100644 --- a/drivers/scsi/osst.h +++ b/drivers/scsi/osst.h @@ -3,6 +3,7 @@ */ #include +#include #include /* FIXME - rename and use the following two types or delete them! @@ -517,8 +518,7 @@ struct osst_buffer { int writing; int midlevel_result; int syscall_result; - struct osst_request *last_SRpnt; - struct st_cmdstatus cmdstat; + struct scsi_request *last_SRpnt; unsigned char *b_data; os_aux_t *aux; /* onstream AUX structure at end of each block */ unsigned short use_sg; /* zero or number of s/g segments for this adapter */ @@ -626,15 +626,6 @@ struct osst_tape { struct gendisk *drive; } ; -/* scsi tape command */ -struct osst_request { - unsigned char cmd[MAX_COMMAND_SIZE]; - unsigned char sense[SCSI_SENSE_BUFFERSIZE]; - int result; - struct osst_tape *stp; - struct completion *waiting; -}; - /* Values of write_type */ #define OS_WRITE_DATA 0 #define OS_WRITE_EOD 1 diff --git a/drivers/scsi/pas16.c b/drivers/scsi/pas16.c index 1434209a8..f09e94af9 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 ARRAY_SIZE(overrides) +#define NO_OVERRIDES (sizeof(overrides) / sizeof(struct override)) 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 ARRAY_SIZE(bases) +#define NO_BASES (sizeof (bases) / sizeof (struct base)) 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, IRQF_DISABLED, "pas16", instance)) { + if (request_irq(instance->irq, pas16_intr, SA_INTERRUPT, "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/aha152x_stub.c b/drivers/scsi/pcmcia/aha152x_stub.c index ee449b29f..5609847e2 100644 --- a/drivers/scsi/pcmcia/aha152x_stub.c +++ b/drivers/scsi/pcmcia/aha152x_stub.c @@ -89,29 +89,29 @@ MODULE_LICENSE("Dual MPL/GPL"); /*====================================================================*/ typedef struct scsi_info_t { - struct pcmcia_device *p_dev; + dev_link_t link; dev_node_t node; struct Scsi_Host *host; } scsi_info_t; -static void aha152x_release_cs(struct pcmcia_device *link); +static void aha152x_release_cs(dev_link_t *link); static void aha152x_detach(struct pcmcia_device *p_dev); -static int aha152x_config_cs(struct pcmcia_device *link); +static void aha152x_config_cs(dev_link_t *link); -static struct pcmcia_device *dev_list; +static dev_link_t *dev_list; -static int aha152x_probe(struct pcmcia_device *link) +static int aha152x_attach(struct pcmcia_device *p_dev) { scsi_info_t *info; - + dev_link_t *link; + DEBUG(0, "aha152x_attach()\n"); /* Create new SCSI device */ info = kmalloc(sizeof(*info), GFP_KERNEL); if (!info) return -ENOMEM; memset(info, 0, sizeof(*info)); - info->p_dev = link; - link->priv = info; + link = &info->link; link->priv = info; link->io.NumPorts1 = 0x20; link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO; @@ -119,22 +119,41 @@ static int aha152x_probe(struct pcmcia_device *link) 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; - return aha152x_config_cs(link); + link->handle = p_dev; + p_dev->instance = link; + + link->state |= DEV_PRESENT | DEV_CONFIG_PENDING; + aha152x_config_cs(link); + + return 0; } /* aha152x_attach */ /*====================================================================*/ -static void aha152x_detach(struct pcmcia_device *link) +static void aha152x_detach(struct pcmcia_device *p_dev) { + dev_link_t *link = dev_to_instance(p_dev); + dev_link_t **linkp; + DEBUG(0, "aha152x_detach(0x%p)\n", link); + + /* Locate device structure */ + for (linkp = &dev_list; *linkp; linkp = &(*linkp)->next) + if (*linkp == link) break; + if (*linkp == NULL) + return; - aha152x_release_cs(link); + if (link->state & DEV_CONFIG) + aha152x_release_cs(link); /* Unlink device structure, free bits */ + *linkp = link->next; kfree(link->priv); + } /* aha152x_detach */ /*====================================================================*/ @@ -142,8 +161,9 @@ static void aha152x_detach(struct pcmcia_device *link) #define CS_CHECK(fn, ret) \ do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0) -static int aha152x_config_cs(struct pcmcia_device *link) +static void aha152x_config_cs(dev_link_t *link) { + client_handle_t handle = link->handle; scsi_info_t *info = link->priv; struct aha152x_setup s; tuple_t tuple; @@ -158,16 +178,19 @@ static int aha152x_config_cs(struct pcmcia_device *link) tuple.TupleData = tuple_data; tuple.TupleDataMax = 64; tuple.TupleOffset = 0; - 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)); + CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple)); + CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple)); + CS_CHECK(ParseTuple, pcmcia_parse_tuple(handle, &tuple, &parse)); link->conf.ConfigBase = parse.config.base; + /* Configure card */ + link->state |= DEV_CONFIG; + tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY; - CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(link, &tuple)); + CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple)); while (1) { - if (pcmcia_get_tuple_data(link, &tuple) != 0 || - pcmcia_parse_tuple(link, &tuple, &parse) != 0) + if (pcmcia_get_tuple_data(handle, &tuple) != 0 || + pcmcia_parse_tuple(handle, &tuple, &parse) != 0) goto next_entry; /* For New Media T&J, look for a SCSI window */ if (parse.cftable_entry.io.win[0].len >= 0x20) @@ -178,15 +201,15 @@ static int aha152x_config_cs(struct pcmcia_device *link) if ((parse.cftable_entry.io.nwin > 0) && (link->io.BasePort1 < 0xffff)) { link->conf.ConfigIndex = parse.cftable_entry.index; - i = pcmcia_request_io(link, &link->io); + i = pcmcia_request_io(handle, &link->io); if (i == CS_SUCCESS) break; } next_entry: - CS_CHECK(GetNextTuple, pcmcia_get_next_tuple(link, &tuple)); + CS_CHECK(GetNextTuple, pcmcia_get_next_tuple(handle, &tuple)); } - CS_CHECK(RequestIRQ, pcmcia_request_irq(link, &link->irq)); - CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link, &link->conf)); + CS_CHECK(RequestIRQ, pcmcia_request_irq(handle, &link->irq)); + CS_CHECK(RequestConfiguration, pcmcia_request_configuration(handle, &link->conf)); /* Set configuration options for the aha152x driver */ memset(&s, 0, sizeof(s)); @@ -208,30 +231,53 @@ static int aha152x_config_cs(struct pcmcia_device *link) } sprintf(info->node.dev_name, "scsi%d", host->host_no); - link->dev_node = &info->node; + link->dev = &info->node; info->host = host; - return 0; - + link->state &= ~DEV_CONFIG_PENDING; + return; + cs_failed: - cs_error(link, last_fn, last_ret); + cs_error(link->handle, last_fn, last_ret); aha152x_release_cs(link); - return -ENODEV; + return; } -static void aha152x_release_cs(struct pcmcia_device *link) +static void aha152x_release_cs(dev_link_t *link) { scsi_info_t *info = link->priv; aha152x_release(info->host); - pcmcia_disable_device(link); + 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; } -static int aha152x_resume(struct pcmcia_device *link) +static int aha152x_suspend(struct pcmcia_device *dev) { + dev_link_t *link = dev_to_instance(dev); + + link->state |= DEV_SUSPEND; + if (link->state & DEV_CONFIG) + pcmcia_release_configuration(link->handle); + + return 0; +} + +static int aha152x_resume(struct pcmcia_device *dev) +{ + dev_link_t *link = dev_to_instance(dev); scsi_info_t *info = link->priv; - aha152x_host_reset_host(info->host); + link->state &= ~DEV_SUSPEND; + if (link->state & DEV_CONFIG) { + pcmcia_request_configuration(link->handle, &link->conf); + aha152x_host_reset_host(info->host); + } return 0; } @@ -251,9 +297,10 @@ static struct pcmcia_driver aha152x_cs_driver = { .drv = { .name = "aha152x_cs", }, - .probe = aha152x_probe, + .probe = aha152x_attach, .remove = aha152x_detach, .id_table = aha152x_ids, + .suspend = aha152x_suspend, .resume = aha152x_resume, }; @@ -270,3 +317,4 @@ static void __exit exit_aha152x_cs(void) module_init(init_aha152x_cs); module_exit(exit_aha152x_cs); + diff --git a/drivers/scsi/pcmcia/fdomain_stub.c b/drivers/scsi/pcmcia/fdomain_stub.c index 85f7ffac1..788c58d80 100644 --- a/drivers/scsi/pcmcia/fdomain_stub.c +++ b/drivers/scsi/pcmcia/fdomain_stub.c @@ -73,48 +73,57 @@ static char *version = /*====================================================================*/ typedef struct scsi_info_t { - struct pcmcia_device *p_dev; + dev_link_t link; dev_node_t node; struct Scsi_Host *host; } scsi_info_t; -static void fdomain_release(struct pcmcia_device *link); +static void fdomain_release(dev_link_t *link); static void fdomain_detach(struct pcmcia_device *p_dev); -static int fdomain_config(struct pcmcia_device *link); +static void fdomain_config(dev_link_t *link); -static int fdomain_probe(struct pcmcia_device *link) +static int fdomain_attach(struct pcmcia_device *p_dev) { - scsi_info_t *info; - - DEBUG(0, "fdomain_attach()\n"); - - /* Create new SCSI device */ - info = kzalloc(sizeof(*info), GFP_KERNEL); - if (!info) - return -ENOMEM; - - info->p_dev = link; - link->priv = info; - link->io.NumPorts1 = 0x10; - link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO; - link->io.IOAddrLines = 10; - link->irq.Attributes = IRQ_TYPE_EXCLUSIVE; - link->irq.IRQInfo1 = IRQ_LEVEL_ID; - link->conf.Attributes = CONF_ENABLE_IRQ; - link->conf.IntType = INT_MEMORY_AND_IO; - link->conf.Present = PRESENT_OPTION; - - return fdomain_config(link); + scsi_info_t *info; + dev_link_t *link; + + DEBUG(0, "fdomain_attach()\n"); + + /* Create new SCSI device */ + info = kmalloc(sizeof(*info), GFP_KERNEL); + if (!info) return -ENOMEM; + memset(info, 0, sizeof(*info)); + link = &info->link; link->priv = info; + link->io.NumPorts1 = 0x10; + link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO; + link->io.IOAddrLines = 10; + 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; + + link->handle = p_dev; + p_dev->instance = link; + + link->state |= DEV_PRESENT | DEV_CONFIG_PENDING; + fdomain_config(link); + + return 0; } /* fdomain_attach */ /*====================================================================*/ -static void fdomain_detach(struct pcmcia_device *link) +static void fdomain_detach(struct pcmcia_device *p_dev) { + dev_link_t *link = dev_to_instance(p_dev); + DEBUG(0, "fdomain_detach(0x%p)\n", link); - fdomain_release(link); + if (link->state & DEV_CONFIG) + fdomain_release(link); kfree(link->priv); } /* fdomain_detach */ @@ -124,8 +133,9 @@ static void fdomain_detach(struct pcmcia_device *link) #define CS_CHECK(fn, ret) \ do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0) -static int fdomain_config(struct pcmcia_device *link) +static void fdomain_config(dev_link_t *link) { + client_handle_t handle = link->handle; scsi_info_t *info = link->priv; tuple_t tuple; cisparse_t parse; @@ -140,75 +150,103 @@ static int fdomain_config(struct pcmcia_device *link) tuple.TupleData = tuple_data; tuple.TupleDataMax = 64; tuple.TupleOffset = 0; - 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)); + CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple)); + CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple)); + CS_CHECK(ParseTuple, pcmcia_parse_tuple(handle, &tuple, &parse)); link->conf.ConfigBase = parse.config.base; + /* Configure card */ + link->state |= DEV_CONFIG; + tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY; - CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(link, &tuple)); + CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple)); while (1) { - if (pcmcia_get_tuple_data(link, &tuple) != 0 || - pcmcia_parse_tuple(link, &tuple, &parse) != 0) + if (pcmcia_get_tuple_data(handle, &tuple) != 0 || + pcmcia_parse_tuple(handle, &tuple, &parse) != 0) goto next_entry; link->conf.ConfigIndex = parse.cftable_entry.index; link->io.BasePort1 = parse.cftable_entry.io.win[0].base; - i = pcmcia_request_io(link, &link->io); + i = pcmcia_request_io(handle, &link->io); if (i == CS_SUCCESS) break; next_entry: - CS_CHECK(GetNextTuple, pcmcia_get_next_tuple(link, &tuple)); + CS_CHECK(GetNextTuple, pcmcia_get_next_tuple(handle, &tuple)); } - CS_CHECK(RequestIRQ, pcmcia_request_irq(link, &link->irq)); - CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link, &link->conf)); - + CS_CHECK(RequestIRQ, pcmcia_request_irq(handle, &link->irq)); + CS_CHECK(RequestConfiguration, pcmcia_request_configuration(handle, &link->conf)); + /* A bad hack... */ release_region(link->io.BasePort1, link->io.NumPorts1); /* Set configuration options for the fdomain driver */ sprintf(str, "%d,%d", link->io.BasePort1, link->irq.AssignedIRQ); fdomain_setup(str); - + host = __fdomain_16x0_detect(&fdomain_driver_template); if (!host) { printk(KERN_INFO "fdomain_cs: no SCSI devices found\n"); goto cs_failed; } - - if (scsi_add_host(host, NULL)) - goto cs_failed; + + scsi_add_host(host, NULL); /* XXX handle failure */ scsi_scan_host(host); sprintf(info->node.dev_name, "scsi%d", host->host_no); - link->dev_node = &info->node; + link->dev = &info->node; info->host = host; - - return 0; - + + link->state &= ~DEV_CONFIG_PENDING; + return; + cs_failed: - cs_error(link, last_fn, last_ret); + cs_error(link->handle, last_fn, last_ret); fdomain_release(link); - return -ENODEV; + return; + } /* fdomain_config */ /*====================================================================*/ -static void fdomain_release(struct pcmcia_device *link) +static void fdomain_release(dev_link_t *link) { - scsi_info_t *info = link->priv; + scsi_info_t *info = link->priv; - DEBUG(0, "fdomain_release(0x%p)\n", link); + DEBUG(0, "fdomain_release(0x%p)\n", link); - scsi_remove_host(info->host); - pcmcia_disable_device(link); - scsi_unregister(info->host); + scsi_remove_host(info->host); + link->dev = NULL; + + pcmcia_release_configuration(link->handle); + pcmcia_release_io(link->handle, &link->io); + pcmcia_release_irq(link->handle, &link->irq); + + scsi_unregister(info->host); + + link->state &= ~DEV_CONFIG; } /*====================================================================*/ -static int fdomain_resume(struct pcmcia_device *link) +static int fdomain_suspend(struct pcmcia_device *dev) { - fdomain_16x0_bus_reset(NULL); + dev_link_t *link = dev_to_instance(dev); + + link->state |= DEV_SUSPEND; + if (link->state & DEV_CONFIG) + pcmcia_release_configuration(link->handle); + + return 0; +} + +static int fdomain_resume(struct pcmcia_device *dev) +{ + dev_link_t *link = dev_to_instance(dev); + + link->state &= ~DEV_SUSPEND; + if (link->state & DEV_CONFIG) { + pcmcia_request_configuration(link->handle, &link->conf); + fdomain_16x0_bus_reset(NULL); + } return 0; } @@ -226,9 +264,10 @@ static struct pcmcia_driver fdomain_cs_driver = { .drv = { .name = "fdomain_cs", }, - .probe = fdomain_probe, + .probe = fdomain_attach, .remove = fdomain_detach, .id_table = fdomain_ids, + .suspend = fdomain_suspend, .resume = fdomain_resume, }; diff --git a/drivers/scsi/pcmcia/nsp_cs.c b/drivers/scsi/pcmcia/nsp_cs.c index 0d4c04e1f..9e3ab3fd5 100644 --- a/drivers/scsi/pcmcia/nsp_cs.c +++ b/drivers/scsi/pcmcia/nsp_cs.c @@ -1593,11 +1593,11 @@ static int nsp_eh_host_reset(Scsi_Cmnd *SCpnt) configure the card at this point -- we wait until we receive a card insertion event. ======================================================================*/ -static int nsp_cs_probe(struct pcmcia_device *link) +static int nsp_cs_attach(struct pcmcia_device *p_dev) { scsi_info_t *info; + dev_link_t *link; nsp_hw_data *data = &nsp_data_base; - int ret; nsp_dbg(NSP_DEBUG_INIT, "in"); @@ -1605,7 +1605,7 @@ static int nsp_cs_probe(struct pcmcia_device *link) info = kmalloc(sizeof(*info), GFP_KERNEL); if (info == NULL) { return -ENOMEM; } memset(info, 0, sizeof(*info)); - info->p_dev = link; + link = &info->link; link->priv = info; data->ScsiInfo = info; @@ -1623,17 +1623,22 @@ static int nsp_cs_probe(struct pcmcia_device *link) /* Interrupt handler */ link->irq.Handler = &nspintr; link->irq.Instance = info; - link->irq.Attributes |= IRQF_SHARED; + link->irq.Attributes |= (SA_SHIRQ | SA_SAMPLE_RANDOM); /* General socket configuration */ link->conf.Attributes = CONF_ENABLE_IRQ; + link->conf.Vcc = 50; link->conf.IntType = INT_MEMORY_AND_IO; link->conf.Present = PRESENT_OPTION; - ret = nsp_cs_config(link); + link->handle = p_dev; + p_dev->instance = link; + + link->state |= DEV_PRESENT | DEV_CONFIG_PENDING; + nsp_cs_config(link); nsp_dbg(NSP_DEBUG_INIT, "link=0x%p", link); - return ret; + return 0; } /* nsp_cs_attach */ @@ -1643,12 +1648,16 @@ static int nsp_cs_probe(struct pcmcia_device *link) structures are freed. Otherwise, the structures will be freed when the device is released. ======================================================================*/ -static void nsp_cs_detach(struct pcmcia_device *link) +static void nsp_cs_detach(struct pcmcia_device *p_dev) { + dev_link_t *link = dev_to_instance(p_dev); + nsp_dbg(NSP_DEBUG_INIT, "in, link=0x%p", link); - ((scsi_info_t *)link->priv)->stop = 1; - nsp_cs_release(link); + if (link->state & DEV_CONFIG) { + ((scsi_info_t *)link->priv)->stop = 1; + nsp_cs_release(link); + } kfree(link->priv); link->priv = NULL; @@ -1663,9 +1672,9 @@ static void nsp_cs_detach(struct pcmcia_device *link) #define CS_CHECK(fn, ret) \ do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0) /*====================================================================*/ -static int nsp_cs_config(struct pcmcia_device *link) +static void nsp_cs_config(dev_link_t *link) { - int ret; + client_handle_t handle = link->handle; scsi_info_t *info = link->priv; tuple_t tuple; cisparse_t parse; @@ -1689,22 +1698,26 @@ static int nsp_cs_config(struct pcmcia_device *link) tuple.TupleData = tuple_data; tuple.TupleDataMax = sizeof(tuple_data); tuple.TupleOffset = 0; - 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)); + CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple)); + CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple)); + CS_CHECK(ParseTuple, pcmcia_parse_tuple(handle, &tuple, &parse)); link->conf.ConfigBase = parse.config.base; link->conf.Present = parse.config.rmask[0]; + /* Configure card */ + link->state |= DEV_CONFIG; + /* Look up the current Vcc */ - CS_CHECK(GetConfigurationInfo, pcmcia_get_configuration_info(link, &conf)); + CS_CHECK(GetConfigurationInfo, pcmcia_get_configuration_info(handle, &conf)); + link->conf.Vcc = conf.Vcc; tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY; - CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(link, &tuple)); + CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple)); while (1) { cistpl_cftable_entry_t *cfg = &(parse.cftable_entry); - if (pcmcia_get_tuple_data(link, &tuple) != 0 || - pcmcia_parse_tuple(link, &tuple, &parse) != 0) + if (pcmcia_get_tuple_data(handle, &tuple) != 0 || + pcmcia_parse_tuple(handle, &tuple, &parse) != 0) goto next_entry; if (cfg->flags & CISTPL_CFTABLE_DEFAULT) { dflt = *cfg; } @@ -1730,10 +1743,10 @@ static int nsp_cs_config(struct pcmcia_device *link) } if (cfg->vpp1.present & (1 << CISTPL_POWER_VNOM)) { - link->conf.Vpp = + link->conf.Vpp1 = link->conf.Vpp2 = cfg->vpp1.param[CISTPL_POWER_VNOM] / 10000; } else if (dflt.vpp1.present & (1 << CISTPL_POWER_VNOM)) { - link->conf.Vpp = + link->conf.Vpp1 = link->conf.Vpp2 = dflt.vpp1.param[CISTPL_POWER_VNOM] / 10000; } @@ -1760,7 +1773,7 @@ static int nsp_cs_config(struct pcmcia_device *link) link->io.NumPorts2 = io->win[1].len; } /* This reserves IO space but doesn't actually enable it */ - if (pcmcia_request_io(link, &link->io) != 0) + if (pcmcia_request_io(link->handle, &link->io) != 0) goto next_entry; } @@ -1775,7 +1788,7 @@ static int nsp_cs_config(struct pcmcia_device *link) req.Size = 0x1000; } req.AccessSpeed = 0; - if (pcmcia_request_window(&link, &req, &link->win) != 0) + if (pcmcia_request_window(&link->handle, &req, &link->win) != 0) goto next_entry; map.Page = 0; map.CardOffset = mem->win[0].card_addr; if (pcmcia_map_mem_page(link->win, &map) != 0) @@ -1789,14 +1802,17 @@ static int nsp_cs_config(struct pcmcia_device *link) next_entry: nsp_dbg(NSP_DEBUG_INIT, "next"); - pcmcia_disable_device(link); - CS_CHECK(GetNextTuple, pcmcia_get_next_tuple(link, &tuple)); + + if (link->io.NumPorts1) { + pcmcia_release_io(link->handle, &link->io); + } + CS_CHECK(GetNextTuple, pcmcia_get_next_tuple(handle, &tuple)); } if (link->conf.Attributes & CONF_ENABLE_IRQ) { - CS_CHECK(RequestIRQ, pcmcia_request_irq(link, &link->irq)); + CS_CHECK(RequestIRQ, pcmcia_request_irq(link->handle, &link->irq)); } - CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link, &link->conf)); + CS_CHECK(RequestConfiguration, pcmcia_request_configuration(handle, &link->conf)); if (free_ports) { if (link->io.BasePort1) { @@ -1838,19 +1854,16 @@ static int nsp_cs_config(struct pcmcia_device *link) #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,74)) - ret = scsi_add_host (host, NULL); - if (ret) - goto cs_failed; - + scsi_add_host (host, NULL); scsi_scan_host(host); snprintf(info->node.dev_name, sizeof(info->node.dev_name), "scsi%d", host->host_no); - link->dev_node = &info->node; + link->dev = &info->node; info->host = host; #else nsp_dbg(NSP_DEBUG_INIT, "GET_SCSI_INFO"); - tail = &link->dev_node; + tail = &link->dev; info->ndev = 0; nsp_dbg(NSP_DEBUG_INIT, "host=0x%p", host); @@ -1895,10 +1908,11 @@ static int nsp_cs_config(struct pcmcia_device *link) #endif /* Finally, report what we've done */ - printk(KERN_INFO "nsp_cs: index 0x%02x: ", - link->conf.ConfigIndex); - if (link->conf.Vpp) { - printk(", Vpp %d.%d", link->conf.Vpp/10, link->conf.Vpp%10); + printk(KERN_INFO "nsp_cs: index 0x%02x: Vcc %d.%d", + 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); } if (link->conf.Attributes & CONF_ENABLE_IRQ) { printk(", irq %d", link->irq.AssignedIRQ); @@ -1915,14 +1929,15 @@ static int nsp_cs_config(struct pcmcia_device *link) req.Base+req.Size-1); printk("\n"); - return 0; + link->state &= ~DEV_CONFIG_PENDING; + return; cs_failed: nsp_dbg(NSP_DEBUG_INIT, "config fail"); - cs_error(link, last_fn, last_ret); + cs_error(link->handle, last_fn, last_ret); nsp_cs_release(link); - return -ENODEV; + return; } /* nsp_cs_config */ #undef CS_CHECK @@ -1932,7 +1947,7 @@ static int nsp_cs_config(struct pcmcia_device *link) device, and release the PCMCIA configuration. If the device is still open, this will be postponed until it is closed. ======================================================================*/ -static void nsp_cs_release(struct pcmcia_device *link) +static void nsp_cs_release(dev_link_t *link) { scsi_info_t *info = link->priv; nsp_hw_data *data = NULL; @@ -1953,15 +1968,22 @@ static void nsp_cs_release(struct pcmcia_device *link) #else scsi_unregister_host(&nsp_driver_template); #endif - link->dev_node = NULL; + link->dev = NULL; if (link->win) { if (data != NULL) { iounmap((void *)(data->MmioAddress)); } + pcmcia_release_window(link->win); } - pcmcia_disable_device(link); - + 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 (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,2)) if (info->host != NULL) { scsi_host_put(info->host); @@ -1969,11 +1991,14 @@ static void nsp_cs_release(struct pcmcia_device *link) #endif } /* nsp_cs_release */ -static int nsp_cs_suspend(struct pcmcia_device *link) +static int nsp_cs_suspend(struct pcmcia_device *dev) { + dev_link_t *link = dev_to_instance(dev); scsi_info_t *info = link->priv; nsp_hw_data *data; + link->state |= DEV_SUSPEND; + nsp_dbg(NSP_DEBUG_INIT, "event: suspend"); if (info->host != NULL) { @@ -1986,16 +2011,25 @@ static int nsp_cs_suspend(struct pcmcia_device *link) info->stop = 1; + if (link->state & DEV_CONFIG) + pcmcia_release_configuration(link->handle); + return 0; } -static int nsp_cs_resume(struct pcmcia_device *link) +static int nsp_cs_resume(struct pcmcia_device *dev) { + dev_link_t *link = dev_to_instance(dev); scsi_info_t *info = link->priv; nsp_hw_data *data; nsp_dbg(NSP_DEBUG_INIT, "event: resume"); + link->state &= ~DEV_SUSPEND; + + if (link->state & DEV_CONFIG) + pcmcia_request_configuration(link->handle, &link->conf); + info->stop = 0; if (info->host != NULL) { @@ -2031,7 +2065,7 @@ static struct pcmcia_driver nsp_driver = { .drv = { .name = "nsp_cs", }, - .probe = nsp_cs_probe, + .probe = nsp_cs_attach, .remove = nsp_cs_detach, .id_table = nsp_cs_ids, .suspend = nsp_cs_suspend, @@ -2064,7 +2098,19 @@ static int __init nsp_cs_init(void) static void __exit nsp_cs_exit(void) { nsp_msg(KERN_INFO, "unloading..."); + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,68)) pcmcia_unregister_driver(&nsp_driver); +#else + unregister_pcmcia_driver(&dev_info); + /* XXX: this really needs to move into generic code.. */ + while (dev_list != NULL) { + if (dev_list->state & DEV_CONFIG) { + nsp_cs_release(dev_list); + } + nsp_cs_detach(dev_list); + } +#endif } diff --git a/drivers/scsi/pcmcia/nsp_cs.h b/drivers/scsi/pcmcia/nsp_cs.h index 8908b8e5b..b66b140a7 100644 --- a/drivers/scsi/pcmcia/nsp_cs.h +++ b/drivers/scsi/pcmcia/nsp_cs.h @@ -225,7 +225,7 @@ /*====================================================================*/ typedef struct scsi_info_t { - struct pcmcia_device *p_dev; + dev_link_t link; struct Scsi_Host *host; #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,74)) dev_node_t node; @@ -297,8 +297,8 @@ typedef struct _nsp_hw_data { /* Card service functions */ static void nsp_cs_detach (struct pcmcia_device *p_dev); -static void nsp_cs_release(struct pcmcia_device *link); -static int nsp_cs_config (struct pcmcia_device *link); +static void nsp_cs_release(dev_link_t *link); +static void nsp_cs_config (dev_link_t *link); /* Linux SCSI subsystem specific functions */ static struct Scsi_Host *nsp_detect (struct scsi_host_template *sht); @@ -450,7 +450,7 @@ static inline struct Scsi_Host *scsi_host_hn_get(unsigned short hostno) return host; } -static void cs_error(struct pcmcia_device *handle, int func, int ret) +static void cs_error(client_handle_t handle, int func, int ret) { error_info_t err = { func, ret }; pcmcia_report_error(handle, &err); diff --git a/drivers/scsi/pcmcia/qlogic_stub.c b/drivers/scsi/pcmcia/qlogic_stub.c index 86c2ac6ae..dce7e687f 100644 --- a/drivers/scsi/pcmcia/qlogic_stub.c +++ b/drivers/scsi/pcmcia/qlogic_stub.c @@ -91,18 +91,18 @@ static struct scsi_host_template qlogicfas_driver_template = { /*====================================================================*/ typedef struct scsi_info_t { - struct pcmcia_device *p_dev; + dev_link_t link; dev_node_t node; struct Scsi_Host *host; unsigned short manf_id; } scsi_info_t; -static void qlogic_release(struct pcmcia_device *link); +static void qlogic_release(dev_link_t *link); static void qlogic_detach(struct pcmcia_device *p_dev); -static int qlogic_config(struct pcmcia_device * link); +static void qlogic_config(dev_link_t * link); static struct Scsi_Host *qlogic_detect(struct scsi_host_template *host, - struct pcmcia_device *link, int qbase, int qlirq) + dev_link_t *link, int qbase, int qlirq) { int qltyp; /* type of chip */ int qinitid; @@ -156,9 +156,10 @@ free_scsi_host: err: return NULL; } -static int qlogic_probe(struct pcmcia_device *link) +static int qlogic_attach(struct pcmcia_device *p_dev) { scsi_info_t *info; + dev_link_t *link; DEBUG(0, "qlogic_attach()\n"); @@ -167,7 +168,7 @@ static int qlogic_probe(struct pcmcia_device *link) if (!info) return -ENOMEM; memset(info, 0, sizeof(*info)); - info->p_dev = link; + link = &info->link; link->priv = info; link->io.NumPorts1 = 16; link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO; @@ -175,19 +176,30 @@ static int qlogic_probe(struct pcmcia_device *link) 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; - return qlogic_config(link); + link->handle = p_dev; + p_dev->instance = link; + + link->state |= DEV_PRESENT | DEV_CONFIG_PENDING; + qlogic_config(link); + + return 0; } /* qlogic_attach */ /*====================================================================*/ -static void qlogic_detach(struct pcmcia_device *link) +static void qlogic_detach(struct pcmcia_device *p_dev) { + dev_link_t *link = dev_to_instance(p_dev); + DEBUG(0, "qlogic_detach(0x%p)\n", link); - qlogic_release(link); + if (link->state & DEV_CONFIG) + qlogic_release(link); + kfree(link->priv); } /* qlogic_detach */ @@ -197,8 +209,9 @@ static void qlogic_detach(struct pcmcia_device *link) #define CS_CHECK(fn, ret) \ do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0) -static int qlogic_config(struct pcmcia_device * link) +static void qlogic_config(dev_link_t * link) { + client_handle_t handle = link->handle; scsi_info_t *info = link->priv; tuple_t tuple; cisparse_t parse; @@ -212,35 +225,38 @@ static int qlogic_config(struct pcmcia_device * link) tuple.TupleDataMax = 64; tuple.TupleOffset = 0; tuple.DesiredTuple = CISTPL_CONFIG; - 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)); + CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple)); + CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple)); + CS_CHECK(ParseTuple, pcmcia_parse_tuple(handle, &tuple, &parse)); link->conf.ConfigBase = parse.config.base; tuple.DesiredTuple = CISTPL_MANFID; - if ((pcmcia_get_first_tuple(link, &tuple) == CS_SUCCESS) && (pcmcia_get_tuple_data(link, &tuple) == CS_SUCCESS)) + if ((pcmcia_get_first_tuple(handle, &tuple) == CS_SUCCESS) && (pcmcia_get_tuple_data(handle, &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(link, &tuple)); + CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple)); while (1) { - if (pcmcia_get_tuple_data(link, &tuple) != 0 || - pcmcia_parse_tuple(link, &tuple, &parse) != 0) + if (pcmcia_get_tuple_data(handle, &tuple) != 0 || + pcmcia_parse_tuple(handle, &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(link, &link->io); + i = pcmcia_request_io(handle, &link->io); if (i == CS_SUCCESS) break; } next_entry: - CS_CHECK(GetNextTuple, pcmcia_get_next_tuple(link, &tuple)); + CS_CHECK(GetNextTuple, pcmcia_get_next_tuple(handle, &tuple)); } - CS_CHECK(RequestIRQ, pcmcia_request_irq(link, &link->irq)); - CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link, &link->conf)); + CS_CHECK(RequestIRQ, pcmcia_request_irq(handle, &link->irq)); + CS_CHECK(RequestConfiguration, pcmcia_request_configuration(handle, &link->conf)); if ((info->manf_id == MANFID_MACNICA) || (info->manf_id == MANFID_PIONEER) || (info->manf_id == 0x0098)) { /* set ATAcmd */ @@ -259,54 +275,82 @@ static int qlogic_config(struct pcmcia_device * link) if (!host) { printk(KERN_INFO "%s: no SCSI devices found\n", qlogic_name); - goto cs_failed; + goto out; } sprintf(info->node.dev_name, "scsi%d", host->host_no); - link->dev_node = &info->node; + link->dev = &info->node; info->host = host; - return 0; +out: + link->state &= ~DEV_CONFIG_PENDING; + return; cs_failed: - cs_error(link, last_fn, last_ret); - pcmcia_disable_device(link); - return -ENODEV; + cs_error(link->handle, last_fn, last_ret); + 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; + return; } /* qlogic_config */ /*====================================================================*/ -static void qlogic_release(struct pcmcia_device *link) +static void qlogic_release(dev_link_t *link) { scsi_info_t *info = link->priv; DEBUG(0, "qlogic_release(0x%p)\n", link); scsi_remove_host(info->host); + link->dev = NULL; free_irq(link->irq.AssignedIRQ, info->host); - pcmcia_disable_device(link); + + pcmcia_release_configuration(link->handle); + pcmcia_release_io(link->handle, &link->io); + pcmcia_release_irq(link->handle, &link->irq); scsi_host_put(info->host); + + link->state &= ~DEV_CONFIG; } /*====================================================================*/ -static int qlogic_resume(struct pcmcia_device *link) +static int qlogic_suspend(struct pcmcia_device *dev) { - scsi_info_t *info = link->priv; + dev_link_t *link = dev_to_instance(dev); - pcmcia_request_configuration(link, &link->conf); - 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); + link->state |= DEV_SUSPEND; + if (link->state & DEV_CONFIG) + pcmcia_release_configuration(link->handle); + + return 0; +} + +static int qlogic_resume(struct pcmcia_device *dev) +{ + dev_link_t *link = dev_to_instance(dev); + + link->state &= ~DEV_SUSPEND; + if (link->state & DEV_CONFIG) { + scsi_info_t *info = link->priv; + + pcmcia_request_configuration(link->handle, &link->conf); + 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); + } + /* Ugggglllyyyy!!! */ + qlogicfas408_bus_reset(NULL); } - /* Ugggglllyyyy!!! */ - qlogicfas408_bus_reset(NULL); return 0; } @@ -338,9 +382,10 @@ static struct pcmcia_driver qlogic_cs_driver = { .drv = { .name = "qlogic_cs", }, - .probe = qlogic_probe, + .probe = qlogic_attach, .remove = qlogic_detach, .id_table = qlogic_ids, + .suspend = qlogic_suspend, .resume = qlogic_resume, }; diff --git a/drivers/scsi/pcmcia/sym53c500_cs.c b/drivers/scsi/pcmcia/sym53c500_cs.c index 0b65099ac..3a4dd6f5b 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 { - struct pcmcia_device *p_dev; + dev_link_t link; dev_node_t node; struct Scsi_Host *host; unsigned short manf_id; @@ -527,7 +527,7 @@ idle_out: } static void -SYM53C500_release(struct pcmcia_device *link) +SYM53C500_release(dev_link_t *link) { struct scsi_info_t *info = link->priv; struct Scsi_Host *shost = info->host; @@ -550,7 +550,13 @@ SYM53C500_release(struct pcmcia_device *link) if (shost->io_port && shost->n_io_port) release_region(shost->io_port, shost->n_io_port); - pcmcia_disable_device(link); + 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; scsi_host_put(shost); } /* SYM53C500_release */ @@ -707,9 +713,10 @@ 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 int -SYM53C500_config(struct pcmcia_device *link) +static void +SYM53C500_config(dev_link_t *link) { + client_handle_t handle = link->handle; struct scsi_info_t *info = link->priv; tuple_t tuple; cisparse_t parse; @@ -726,37 +733,40 @@ SYM53C500_config(struct pcmcia_device *link) tuple.TupleDataMax = 64; tuple.TupleOffset = 0; tuple.DesiredTuple = CISTPL_CONFIG; - 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)); + CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple)); + CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple)); + CS_CHECK(ParseTuple, pcmcia_parse_tuple(handle, &tuple, &parse)); link->conf.ConfigBase = parse.config.base; tuple.DesiredTuple = CISTPL_MANFID; - if ((pcmcia_get_first_tuple(link, &tuple) == CS_SUCCESS) && - (pcmcia_get_tuple_data(link, &tuple) == CS_SUCCESS)) + if ((pcmcia_get_first_tuple(handle, &tuple) == CS_SUCCESS) && + (pcmcia_get_tuple_data(handle, &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(link, &tuple)); + CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple)); while (1) { - if (pcmcia_get_tuple_data(link, &tuple) != 0 || - pcmcia_parse_tuple(link, &tuple, &parse) != 0) + if (pcmcia_get_tuple_data(handle, &tuple) != 0 || + pcmcia_parse_tuple(handle, &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(link, &link->io); + i = pcmcia_request_io(handle, &link->io); if (i == CS_SUCCESS) break; } next_entry: - CS_CHECK(GetNextTuple, pcmcia_get_next_tuple(link, &tuple)); + CS_CHECK(GetNextTuple, pcmcia_get_next_tuple(handle, &tuple)); } - CS_CHECK(RequestIRQ, pcmcia_request_irq(link, &link->irq)); - CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link, &link->conf)); + CS_CHECK(RequestIRQ, pcmcia_request_irq(handle, &link->irq)); + CS_CHECK(RequestConfiguration, pcmcia_request_configuration(handle, &link->conf)); /* * That's the trouble with copying liberally from another driver. @@ -799,7 +809,7 @@ next_entry: data = (struct sym53c500_data *)host->hostdata; if (irq_level > 0) { - if (request_irq(irq_level, SYM53C500_intr, IRQF_SHARED, "SYM53C500", host)) { + if (request_irq(irq_level, SYM53C500_intr, SA_SHIRQ, "SYM53C500", host)) { printk("SYM53C500: unable to allocate IRQ %d\n", irq_level); goto err_free_scsi; } @@ -825,7 +835,7 @@ next_entry: data->fast_pio = USE_FAST_PIO; sprintf(info->node.dev_name, "scsi%d", host->host_no); - link->dev_node = &info->node; + link->dev = &info->node; info->host = host; if (scsi_add_host(host, NULL)) @@ -833,7 +843,7 @@ next_entry: scsi_scan_host(host); - return 0; + goto out; /* SUCCESS */ err_free_irq: free_irq(irq_level, host); @@ -842,50 +852,74 @@ err_free_scsi: err_release: release_region(port_base, 0x10); printk(KERN_INFO "sym53c500_cs: no SCSI devices found\n"); - return -ENODEV; + +out: + link->state &= ~DEV_CONFIG_PENDING; + return; cs_failed: - cs_error(link, last_fn, last_ret); + cs_error(link->handle, last_fn, last_ret); SYM53C500_release(link); - return -ENODEV; + return; } /* SYM53C500_config */ -static int sym53c500_resume(struct pcmcia_device *link) +static int sym53c500_suspend(struct pcmcia_device *dev) +{ + dev_link_t *link = dev_to_instance(dev); + + link->state |= DEV_SUSPEND; + if (link->state & DEV_CONFIG) + pcmcia_release_configuration(link->handle); + + return 0; +} + +static int sym53c500_resume(struct pcmcia_device *dev) { + dev_link_t *link = dev_to_instance(dev); struct scsi_info_t *info = link->priv; - /* 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); + link->state &= ~DEV_SUSPEND; + 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); } - /* - * 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; } static void -SYM53C500_detach(struct pcmcia_device *link) +SYM53C500_detach(struct pcmcia_device *p_dev) { + dev_link_t *link = dev_to_instance(p_dev); + DEBUG(0, "SYM53C500_detach(0x%p)\n", link); - SYM53C500_release(link); + if (link->state & DEV_CONFIG) + SYM53C500_release(link); kfree(link->priv); link->priv = NULL; } /* SYM53C500_detach */ static int -SYM53C500_probe(struct pcmcia_device *link) +SYM53C500_attach(struct pcmcia_device *p_dev) { struct scsi_info_t *info; + dev_link_t *link; DEBUG(0, "SYM53C500_attach()\n"); @@ -894,7 +928,7 @@ SYM53C500_probe(struct pcmcia_device *link) if (!info) return -ENOMEM; memset(info, 0, sizeof(*info)); - info->p_dev = link; + link = &info->link; link->priv = info; link->io.NumPorts1 = 16; link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO; @@ -902,10 +936,17 @@ SYM53C500_probe(struct pcmcia_device *link) 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; - return SYM53C500_config(link); + link->handle = p_dev; + p_dev->instance = link; + + link->state |= DEV_PRESENT | DEV_CONFIG_PENDING; + SYM53C500_config(link); + + return 0; } /* SYM53C500_attach */ MODULE_AUTHOR("Bob Tracy "); @@ -925,9 +966,10 @@ static struct pcmcia_driver sym53c500_cs_driver = { .drv = { .name = "sym53c500_cs", }, - .probe = SYM53C500_probe, + .probe = SYM53C500_attach, .remove = SYM53C500_detach, .id_table = sym53c500_ids, + .suspend = sym53c500_suspend, .resume = sym53c500_resume, }; diff --git a/drivers/scsi/pdc_adma.c b/drivers/scsi/pdc_adma.c index efc8fff1d..e8df0c9ec 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.04" +#define DRV_VERSION "0.03" /* macro to calculate base address for ATA regs */ #define ADMA_ATA_REGS(base,port_no) ((base) + ((port_no) * 0x40)) @@ -131,7 +131,7 @@ static void adma_host_stop(struct ata_host_set *host_set); static void adma_port_stop(struct ata_port *ap); static void adma_phy_reset(struct ata_port *ap); static void adma_qc_prep(struct ata_queued_cmd *qc); -static unsigned int adma_qc_issue(struct ata_queued_cmd *qc); +static int adma_qc_issue(struct ata_queued_cmd *qc); static int adma_check_atapi_dma(struct ata_queued_cmd *qc); static void adma_bmdma_stop(struct ata_queued_cmd *qc); static u8 adma_bmdma_status(struct ata_port *ap); @@ -143,16 +143,17 @@ static struct scsi_host_template adma_ata_sht = { .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 = ENABLE_CLUSTERING, .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, }; @@ -168,7 +169,6 @@ 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, @@ -183,8 +183,7 @@ 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_PIO_POLLING, + ATA_FLAG_NO_LEGACY | ATA_FLAG_MMIO, .pio_mask = 0x10, /* pio4 */ .udma_mask = 0x1f, /* udma0-4 */ .port_ops = &adma_ata_ops, @@ -323,7 +322,7 @@ static int adma_fill_sg(struct ata_queued_cmd *qc) = (pFLAGS & pEND) ? 0 : cpu_to_le32(pp->pkt_dma + i + 4); i += 4; - VPRINTK("PRD[%u] = (0x%lX, 0x%X)\n", i/4, + VPRINTK("PRD[%u] = (0x%lX, 0x%X)\n", nelem, (unsigned long)addr, len); } return i; @@ -420,7 +419,7 @@ static inline void adma_packet_start(struct ata_queued_cmd *qc) writew(aPIOMD4 | aGO, chan + ADMA_CONTROL); } -static unsigned int adma_qc_issue(struct ata_queued_cmd *qc) +static int adma_qc_issue(struct ata_queued_cmd *qc) { struct adma_port_priv *pp = qc->ap->private_data; @@ -458,13 +457,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_DISABLED) + if (ap->flags & (ATA_FLAG_PORT_DISABLED | ATA_FLAG_NOINTR)) 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.flags & ATA_TFLAG_POLLING))) { + if (qc && (!(qc->tf.ctl & ATA_NIEN))) { if ((status & (aPERR | aPSD | aUIRQ))) qc->err_mask |= AC_ERR_OTHER; else if (pp->pkt[0] != cDONE) @@ -483,13 +482,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_DISABLED))) { + if (ap && (!(ap->flags & (ATA_FLAG_PORT_DISABLED | ATA_FLAG_NOINTR)))) { 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.flags & ATA_TFLAG_POLLING))) { + if (qc && (!(qc->tf.ctl & ATA_NIEN))) { /* check main status, clearing INTRQ */ u8 status = ata_check_status(ap); @@ -691,7 +690,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 = IRQF_SHARED; + probe_ent->irq_flags = SA_SHIRQ; 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 0bd9c60e6..46624ab9c 100644 --- a/drivers/scsi/pluto.c +++ b/drivers/scsi/pluto.c @@ -13,6 +13,7 @@ #include #include #include +#include #ifdef CONFIG_KMOD #include #endif @@ -26,9 +27,6 @@ #include -#define RQ_SCSI_BUSY 0xffff -#define RQ_SCSI_DONE 0xfffe - /* #define PLUTO_DEBUG */ #define pluto_printk printk ("PLUTO %s: ", fc->name); printk @@ -169,6 +167,8 @@ 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 b0eba39f2..05347eed9 100644 --- a/drivers/scsi/ppa.c +++ b/drivers/scsi/ppa.c @@ -6,8 +6,11 @@ * (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 @@ -15,7 +18,6 @@ #include #include #include -#include #include #include @@ -724,7 +726,7 @@ static int ppa_engine(ppa_struct *dev, struct scsi_cmnd *cmd) retv--; if (retv) { - if (time_after(jiffies, dev->jstart + (1 * HZ))) { + if ((jiffies - dev->jstart) > (1 * HZ)) { printk ("ppa: Parallel port cable is unplugged!!\n"); ppa_fail(dev, DID_BUS_BUSY); @@ -979,12 +981,6 @@ static int device_check(ppa_struct *dev) return -ENODEV; } -static int ppa_adjust_queue(struct scsi_device *device) -{ - blk_queue_bounce_limit(device->request_queue, BLK_BOUNCE_HIGH); - return 0; -} - static struct scsi_host_template ppa_template = { .module = THIS_MODULE, .proc_name = "ppa", @@ -1000,7 +996,6 @@ static struct scsi_host_template ppa_template = { .cmd_per_lun = 1, .use_clustering = ENABLE_CLUSTERING, .can_queue = 1, - .slave_alloc = ppa_adjust_queue, }; /*************************************************************************** diff --git a/drivers/scsi/ppa.h b/drivers/scsi/ppa.h index ba8021427..f6e1a1574 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 + * David Campbell campbell@torque.net * * All comments to David. */ @@ -73,6 +73,7 @@ */ /* ------ END OF USER CONFIGURABLE PARAMETERS ----- */ +#include #include #include #include diff --git a/drivers/scsi/psi240i.c b/drivers/scsi/psi240i.c index 5c2cdf523..76972b44f 100644 --- a/drivers/scsi/psi240i.c +++ b/drivers/scsi/psi240i.c @@ -329,7 +329,7 @@ static void Irq_Handler (int irq, void *dev_id, struct pt_regs *regs) pinquiryData->AdditionalLength = 35 - 4; // Fill in vendor identification fields. - for ( z = 0; z < 20; z += 2 ) + for ( z = 0; z < 8; z += 2 ) { pinquiryData->VendorId[z] = ((UCHAR *)identifyData.ModelNumber)[z + 1]; pinquiryData->VendorId[z + 1] = ((UCHAR *)identifyData.ModelNumber)[z]; diff --git a/drivers/scsi/qla1280.c b/drivers/scsi/qla1280.c index 332151e2a..e0230249f 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 IRQF_DISABLED, it's use is deprecated for this kinda driver + - Don't use SA_INTERRUPT, 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,6 +331,7 @@ *****************************************************************************/ +#include #include #include @@ -349,7 +350,6 @@ #include #include #include -#include #include #include @@ -396,6 +396,30 @@ #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 @@ -813,7 +837,7 @@ qla1280_error_action(struct scsi_cmnd *cmd, enum action action) uint16_t data; unsigned char *handle; int result, i; - DECLARE_COMPLETION_ONSTACK(wait); + DECLARE_COMPLETION(wait); struct timer_list timer; ha = (struct scsi_qla_host *)(CMD_HOST(cmd)->hostdata); @@ -2406,7 +2430,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_ONSTACK(wait); + DECLARE_COMPLETION(wait); struct timer_list timer; ENTER("qla1280_mailbox_command"); @@ -4209,17 +4233,20 @@ qla1280_setup(char *s) } -static int __init +static int qla1280_get_token(char *str) { char *sep; long ret = -1; - int i; + int i, len; + + len = sizeof(setup_token)/sizeof(struct setup_tokens); sep = strchr(str, ':'); if (sep) { - for (i = 0; i < ARRAY_SIZE(setup_token); i++) { + for (i = 0; i < len; i++){ + if (!strncmp(setup_token[i].token, str, (sep - str))) { ret = setup_token[i].val; break; @@ -4294,7 +4321,7 @@ qla1280_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) #ifdef QLA_64BIT_PTR if (pci_set_dma_mask(ha->pdev, (dma_addr_t) ~ 0ULL)) { - if (pci_set_dma_mask(ha->pdev, DMA_32BIT_MASK)) { + if (pci_set_dma_mask(ha->pdev, 0xffffffff)) { printk(KERN_WARNING "scsi(%li): Unable to set a " "suitable DMA mask - aborting\n", ha->host_no); error = -ENODEV; @@ -4304,7 +4331,7 @@ qla1280_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) dprintk(2, "scsi(%li): 64 Bit PCI Addressing Enabled\n", ha->host_no); #else - if (pci_set_dma_mask(ha->pdev, DMA_32BIT_MASK)) { + if (pci_set_dma_mask(ha->pdev, 0xffffffff)) { printk(KERN_WARNING "scsi(%li): Unable to set a " "suitable DMA mask - aborting\n", ha->host_no); error = -ENODEV; @@ -4369,7 +4396,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, IRQF_SHARED, + if (request_irq(pdev->irq, qla1280_intr_handler, SA_SHIRQ, "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 8c865b9e0..5758b2566 100644 --- a/drivers/scsi/qla2xxx/Kconfig +++ b/drivers/scsi/qla2xxx/Kconfig @@ -10,13 +10,14 @@ config SCSI_QLA_FC By default, firmware for the ISP parts will be loaded via the Firmware Loader interface. - ISP Firmware Filename - ---------- ----------------- - 21xx ql2100_fw.bin - 22xx ql2200_fw.bin - 2300, 2312, 6312 ql2300_fw.bin - 2322, 6322 ql2322_fw.bin - 24xx ql2400_fw.bin + ISP Firmware Filename + ---------- ----------------- + 21xx ql2100_fw.bin + 22xx ql2200_fw.bin + 2300, 2312 ql2300_fw.bin + 2322 ql2322_fw.bin + 6312, 6322 ql6312_fw.bin + 24xx ql2400_fw.bin Upon request, the driver caches the firmware image until the driver is unloaded. @@ -24,3 +25,54 @@ 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 firmware-module" + depends on SCSI_QLA_FC && SCSI_QLA2XXX_EMBEDDED_FIRMWARE + ---help--- + This driver supports the QLogic 2300 (ISP2300 and ISP2312) host + adapter family. + +config SCSI_QLA2322 + tristate " Build QLogic ISP2322 firmware-module" + depends on SCSI_QLA_FC && SCSI_QLA2XXX_EMBEDDED_FIRMWARE + ---help--- + This driver supports the QLogic 2322 (ISP2322) host adapter family. + +config SCSI_QLA6312 + tristate " Build QLogic ISP63xx firmware-module" + depends on SCSI_QLA_FC && SCSI_QLA2XXX_EMBEDDED_FIRMWARE + ---help--- + This driver supports the QLogic 63xx (ISP6312 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 6399648f1..d028bc50c 100644 --- a/drivers/scsi/qla2xxx/Makefile +++ b/drivers/scsi/qla2xxx/Makefile @@ -1,5 +1,20 @@ +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_attr.o ql2100_fw.o ql2200_fw.o \ - ql2300_fw.o ql2322_fw.o ql2400_fw.o + qla_dbg.o qla_sup.o qla_rscn.o qla_attr.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 +qla6312-y := ql6312.o ql6312_fw.o +qla2400-y := ql2400.o ql2400_fw.o + +obj-$(CONFIG_SCSI_QLA21XX) += qla2xxx.o qla2100.o +obj-$(CONFIG_SCSI_QLA22XX) += qla2xxx.o qla2200.o +obj-$(CONFIG_SCSI_QLA2300) += qla2xxx.o qla2300.o +obj-$(CONFIG_SCSI_QLA2322) += qla2xxx.o qla2322.o +obj-$(CONFIG_SCSI_QLA6312) += qla2xxx.o qla6312.o +obj-$(CONFIG_SCSI_QLA24XX) += qla2xxx.o qla2400.o diff --git a/drivers/scsi/qla2xxx/ql2100_fw.c b/drivers/scsi/qla2xxx/ql2100_fw.c index 0e7d6d53a..56006162d 100644 --- a/drivers/scsi/qla2xxx/ql2100_fw.c +++ b/drivers/scsi/qla2xxx/ql2100_fw.c @@ -1,6419 +1,4848 @@ /* - * 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 + * QLogic Fibre Channel HBA Driver + * Copyright (c) 2003-2005 QLogic Corporation * + * See LICENSE.qla2xxx for copyright and licensing details. */ -#include +/* + * Firmware Version 1.19.25 (13:12 Dec 10, 2003) + */ -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_version = 1*1024+19; +#else +unsigned short risc_code_version = 1*1024+19; +#endif -struct firmware ql2100_fw = { - .size = sizeof(ql2100_fw_bin), - .data = ql2100_fw_bin +#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 }; +#ifdef UNIQUE_FW_NAME +unsigned short fw2100tp_length01 = 0x9601; +#else +unsigned short risc_code_length01 = 0x9601; +#endif + diff --git a/drivers/scsi/qla2xxx/ql2200_fw.c b/drivers/scsi/qla2xxx/ql2200_fw.c index 883563b8a..ac07e18ab 100644 --- a/drivers/scsi/qla2xxx/ql2200_fw.c +++ b/drivers/scsi/qla2xxx/ql2200_fw.c @@ -1,7066 +1,5333 @@ /* - * 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 + * QLogic Fibre Channel HBA Driver + * Copyright (c) 2003-2005 QLogic Corporation * + * See LICENSE.qla2xxx for copyright and licensing details. */ -#include +/* + * Firmware Version 2.02.08 (17:06 Mar 22, 2005) + */ -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_version = 2*1024+2; +#else +unsigned short risc_code_version = 2*1024+2; +#endif -struct firmware ql2200_fw = { - .size = sizeof(ql2200_fw_bin), - .data = ql2200_fw_bin +#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 }; +#ifdef UNIQUE_FW_NAME +unsigned short fw2200tp_length01 = 0xa52b; +#else +unsigned short risc_code_length01 = 0xa52b; +#endif + diff --git a/drivers/scsi/qla2xxx/ql2300.c b/drivers/scsi/qla2xxx/ql2300.c index e7a93ddda..fd2f4b795 100644 --- a/drivers/scsi/qla2xxx/ql2300.c +++ b/drivers/scsi/qla2xxx/ql2300.c @@ -40,11 +40,6 @@ static struct qla_board_info qla_board_tbl[] = { .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[] = { @@ -62,13 +57,6 @@ static struct pci_device_id qla2300_pci_tbl[] = { .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); diff --git a/drivers/scsi/qla2xxx/ql2300_fw.c b/drivers/scsi/qla2xxx/ql2300_fw.c index 624e1fbe5..dfc9cd58d 100644 --- a/drivers/scsi/qla2xxx/ql2300_fw.c +++ b/drivers/scsi/qla2xxx/ql2300_fw.c @@ -1,10283 +1,7664 @@ /* - * 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 + * QLogic Fibre Channel HBA Driver + * Copyright (c) 2003-2005 QLogic Corporation * + * See LICENSE.qla2xxx for copyright and licensing details. */ -#include +/* + * Firmware Version 3.03.18 (12:09 Sep 20, 2005) + */ -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_version = 3*1024+3; +#else +unsigned short risc_code_version = 3*1024+3; +#endif -struct firmware ql2300_fw = { - .size = sizeof(ql2300_fw_bin), - .data = ql2300_fw_bin +#ifdef UNIQUE_FW_NAME +unsigned char fw2300ipx_version_str[] = {3, 3,18}; +#else +unsigned char firmware_version[] = {3, 3,18}; +#endif + +#ifdef UNIQUE_FW_NAME +#define fw2300ipx_VERSION_STRING "3.03.18" +#else +#define FW_VERSION_STRING "3.03.18" +#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, 0xee08, 0x0000, 0x0003, 0x0003, 0x0012, + 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, 0x2e31, 0x3820, 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, 0x2dac, 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, 0x1ad2, 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, + 0x6135, 0x080c, 0xb097, 0x080c, 0x10dd, 0x080c, 0x12fc, 0x080c, + 0x1c00, 0x080c, 0x0d57, 0x080c, 0x1062, 0x080c, 0x34ac, 0x080c, + 0x7862, 0x080c, 0x6ab6, 0x080c, 0x8935, 0x080c, 0x8616, 0x080c, + 0x24d8, 0x080c, 0x91e1, 0x080c, 0x7f32, 0x080c, 0x2311, 0x080c, + 0x2445, 0x080c, 0x24cd, 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, 0x4cae, 0x080c, 0x34d3, 0x080c, 0x78d3, 0x080c, + 0x7054, 0x080c, 0x8a1c, 0x080c, 0x8642, 0x080c, 0x2cf6, 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, 0x7569, 0x0150, 0x080c, 0x758c, 0x15a0, 0x2079, 0x0100, + 0x7828, 0x9085, 0x1800, 0x782a, 0x0468, 0x080c, 0x7495, 0x7000, + 0x9086, 0x0001, 0x1904, 0x0ab3, 0x7098, 0x9086, 0x0029, 0x1904, + 0x0ab3, 0x080c, 0x85ff, 0x080c, 0x85f1, 0x2001, 0x0161, 0x2003, + 0x0001, 0x2079, 0x0100, 0x7827, 0xffff, 0x7a28, 0x9295, 0x5e2f, + 0x7a2a, 0x2011, 0x73e4, 0x080c, 0x8709, 0x2011, 0x73d7, 0x080c, + 0x87e3, 0x2011, 0x5f90, 0x080c, 0x8709, 0x2011, 0x8030, 0x901e, + 0x7396, 0x04d0, 0x080c, 0x583d, 0x2079, 0x0100, 0x7844, 0x9005, + 0x1904, 0x0ab3, 0x2011, 0x5f90, 0x080c, 0x8709, 0x2011, 0x73e4, + 0x080c, 0x8709, 0x2011, 0x73d7, 0x080c, 0x87e3, 0x2001, 0x0265, + 0x2001, 0x0205, 0x2003, 0x0000, 0x7840, 0x9084, 0xfffb, 0x7842, + 0x2001, 0x19a8, 0x2004, 0x9005, 0x1140, 0x00c6, 0x2061, 0x0100, + 0x080c, 0x60dd, 0x00ce, 0x0804, 0x0ab3, 0x780f, 0x006b, 0x7a28, + 0x080c, 0x7571, 0x0118, 0x9295, 0x5e2f, 0x0010, 0x9295, 0x402f, + 0x7a2a, 0x2011, 0x8010, 0x73d8, 0x2001, 0x19a9, 0x2003, 0x0001, + 0x080c, 0x2b9b, 0x080c, 0x4be9, 0x7248, 0xc284, 0x724a, 0x2001, + 0x180c, 0x200c, 0xc1ac, 0xc1cc, 0x2102, 0x080c, 0xa7de, 0x2011, + 0x0004, 0x080c, 0xce66, 0x080c, 0x6940, 0x080c, 0x7569, 0x1120, + 0x080c, 0x2bdf, 0x02e0, 0x0400, 0x080c, 0x60e4, 0x0140, 0x7097, + 0x0001, 0x70d3, 0x0000, 0x080c, 0x5a0a, 0x0804, 0x0ab3, 0x080c, + 0x57d3, 0xd094, 0x0188, 0x2011, 0x180c, 0x2204, 0xc0cd, 0x2012, + 0x080c, 0x57d7, 0xd0d4, 0x1118, 0x080c, 0x2bdf, 0x1270, 0x2011, + 0x180c, 0x2204, 0xc0bc, 0x00a8, 0x080c, 0x57d7, 0xd0d4, 0x1db8, + 0x2011, 0x180c, 0x2204, 0xc0bd, 0x0060, 0x2011, 0x180c, 0x2204, + 0xc0bd, 0x2012, 0x080c, 0x6a8a, 0x1128, 0xd0a4, 0x0118, 0x2204, + 0xc0fd, 0x2012, 0x080c, 0x6a50, 0x0120, 0x7a0c, 0xc2b4, 0x7a0e, + 0x00a8, 0x707f, 0x0000, 0x080c, 0x7569, 0x1130, 0x70b0, 0x9005, + 0x1168, 0x080c, 0xd2a9, 0x0050, 0x080c, 0xd2a9, 0x70dc, 0xd09c, + 0x1128, 0x70b0, 0x9005, 0x0110, 0x080c, 0x60ba, 0x70e7, 0x0000, + 0x70e3, 0x0000, 0x70a7, 0x0000, 0x080c, 0x2be7, 0x0228, 0x2011, + 0x0101, 0x2204, 0xc0c4, 0x2012, 0x72dc, 0x080c, 0x7569, 0x1178, + 0x9016, 0x0016, 0x080c, 0x29ac, 0x2019, 0x196e, 0x211a, 0x001e, + 0x705f, 0xffff, 0x7063, 0x00ef, 0x7083, 0x0000, 0x0020, 0x2019, + 0x196e, 0x201b, 0x0000, 0x2079, 0x1847, 0x7804, 0xd0ac, 0x0108, + 0xc295, 0x72de, 0x080c, 0x7569, 0x0118, 0x9296, 0x0004, 0x0548, + 0x2011, 0x0001, 0x080c, 0xce66, 0x70ab, 0x0000, 0x70af, 0xffff, + 0x7003, 0x0002, 0x2079, 0x0100, 0x7827, 0x0003, 0x7828, 0x9085, + 0x0003, 0x782a, 0x00fe, 0x080c, 0x3019, 0x2011, 0x0005, 0x080c, + 0xa8ed, 0x080c, 0x98ed, 0x080c, 0x7569, 0x0148, 0x00c6, 0x2061, + 0x0100, 0x0016, 0x080c, 0x29ac, 0x61e2, 0x001e, 0x00ce, 0x012e, + 0x0420, 0x70ab, 0x0000, 0x70af, 0xffff, 0x7003, 0x0002, 0x00f6, + 0x2079, 0x0100, 0x7827, 0x0003, 0x7828, 0x9085, 0x0003, 0x782a, + 0x00fe, 0x2011, 0x0005, 0x080c, 0xa8ed, 0x080c, 0x98ed, 0x080c, + 0x7569, 0x0148, 0x00c6, 0x2061, 0x0100, 0x0016, 0x080c, 0x29ac, + 0x61e2, 0x001e, 0x00ce, 0x00fe, 0x012e, 0x0005, 0x00c6, 0x00b6, + 0x080c, 0x7569, 0x1118, 0x20a9, 0x0800, 0x0010, 0x20a9, 0x0782, + 0x080c, 0x7569, 0x1110, 0x900e, 0x0010, 0x2009, 0x007e, 0x86ff, + 0x0138, 0x9180, 0x1000, 0x2004, 0x905d, 0x0110, 0xb800, 0xd0bc, + 0x090c, 0x3342, 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, 0x3019, 0x080c, + 0x98ed, 0x0804, 0x0b9d, 0x70dc, 0xd0ac, 0x1110, 0xd09c, 0x0558, + 0xd084, 0x0548, 0x0006, 0x2001, 0x0103, 0x2003, 0x002b, 0x000e, + 0xd08c, 0x0508, 0x080c, 0x33a5, 0x11d0, 0x70e0, 0x9086, 0xffff, + 0x01b0, 0x080c, 0x31b2, 0x080c, 0x98ed, 0x70dc, 0xd094, 0x1904, + 0x0b9d, 0x2011, 0x0001, 0x080c, 0xd561, 0x0110, 0x2011, 0x0003, + 0x901e, 0x080c, 0x31ec, 0x080c, 0x98ed, 0x0804, 0x0b9d, 0x70e4, + 0x9005, 0x1904, 0x0b9d, 0x70a8, 0x9005, 0x1904, 0x0b9d, 0x70dc, + 0xd0a4, 0x0118, 0xd0b4, 0x0904, 0x0b9d, 0x080c, 0x6a50, 0x1904, + 0x0b9d, 0x080c, 0x6aa3, 0x1904, 0x0b9d, 0x080c, 0x6a8a, 0x01c0, + 0x0156, 0x00c6, 0x20a9, 0x007f, 0x900e, 0x0016, 0x080c, 0x671d, + 0x1118, 0xb800, 0xd0ec, 0x1138, 0x001e, 0x8108, 0x1f04, 0x0b3d, + 0x00ce, 0x015e, 0x0028, 0x001e, 0x00ce, 0x015e, 0x0804, 0x0b9d, + 0x0006, 0x2001, 0x0103, 0x2003, 0x002b, 0x000e, 0x2011, 0x19b5, + 0x080c, 0x0f96, 0x2011, 0x19cf, 0x080c, 0x0f96, 0x7030, 0xc08c, + 0x7032, 0x7003, 0x0003, 0x70af, 0xffff, 0x080c, 0x0e76, 0x9006, + 0x080c, 0x283d, 0x080c, 0x33a5, 0x0118, 0x080c, 0x4d86, 0x0050, + 0x0036, 0x0046, 0x2019, 0xffff, 0x2021, 0x0006, 0x080c, 0x4da0, + 0x004e, 0x003e, 0x00f6, 0x2079, 0x0100, 0x080c, 0x758c, 0x0150, + 0x080c, 0x7569, 0x7828, 0x0118, 0x9084, 0xe1ff, 0x0010, 0x9084, + 0xffdf, 0x782a, 0x00fe, 0x2001, 0x19ea, 0x2004, 0x9086, 0x0005, + 0x1120, 0x2011, 0x0000, 0x080c, 0xa8ed, 0x2011, 0x0000, 0x080c, + 0xa8f7, 0x080c, 0x98ed, 0x080c, 0x9a0f, 0x012e, 0x00be, 0x0005, + 0x0016, 0x0046, 0x00f6, 0x0126, 0x2091, 0x8000, 0x2079, 0x0100, + 0x7904, 0x918c, 0xfffd, 0x7906, 0x2009, 0x00f7, 0x080c, 0x60a3, + 0x7940, 0x918c, 0x0010, 0x7942, 0x7924, 0xd1b4, 0x0110, 0x7827, + 0x0040, 0xd19c, 0x0110, 0x7827, 0x0008, 0x0006, 0x0036, 0x0156, + 0x7954, 0xd1ac, 0x1904, 0x0c2d, 0x2001, 0x19a9, 0x2004, 0x9005, + 0x1518, 0x080c, 0x2c62, 0x1148, 0x2001, 0x0001, 0x080c, 0x2bca, + 0x2001, 0x0001, 0x080c, 0x2bad, 0x00b8, 0x080c, 0x2c6a, 0x1138, + 0x9006, 0x080c, 0x2bca, 0x9006, 0x080c, 0x2bad, 0x0068, 0x080c, + 0x2c72, 0x1d50, 0x2001, 0x1999, 0x2004, 0xd0fc, 0x0108, 0x0020, + 0x080c, 0x29d8, 0x0804, 0x0d0d, 0x080c, 0x757a, 0x0148, 0x080c, + 0x758c, 0x1118, 0x080c, 0x785d, 0x0050, 0x080c, 0x7571, 0x0dd0, + 0x080c, 0x7858, 0x080c, 0x784e, 0x080c, 0x7495, 0x0058, 0x080c, + 0x7569, 0x0140, 0x2009, 0x00f8, 0x080c, 0x60a3, 0x7843, 0x0090, + 0x7843, 0x0010, 0x20a9, 0x09c4, 0x7820, 0xd09c, 0x1138, 0x080c, + 0x7569, 0x0138, 0x7824, 0xd0ac, 0x1904, 0x0d12, 0x1f04, 0x0c0c, + 0x0070, 0x7824, 0x080c, 0x7583, 0x0118, 0xd0ac, 0x1904, 0x0d12, + 0x9084, 0x1800, 0x0d98, 0x7003, 0x0001, 0x0804, 0x0d12, 0x2001, + 0x0001, 0x080c, 0x283d, 0x0804, 0x0d25, 0x2001, 0x19a9, 0x2004, + 0x9005, 0x1518, 0x080c, 0x2c62, 0x1148, 0x2001, 0x0001, 0x080c, + 0x2bca, 0x2001, 0x0001, 0x080c, 0x2bad, 0x00b8, 0x080c, 0x2c6a, + 0x1138, 0x9006, 0x080c, 0x2bca, 0x9006, 0x080c, 0x2bad, 0x0068, + 0x080c, 0x2c72, 0x1d50, 0x2001, 0x1999, 0x2004, 0xd0fc, 0x0108, + 0x0020, 0x080c, 0x29d8, 0x0804, 0x0d0d, 0x7850, 0x9085, 0x0040, + 0x7852, 0x7938, 0x7850, 0x9084, 0xfbcf, 0x7852, 0x080c, 0x2c7a, + 0x9085, 0x2000, 0x7852, 0x793a, 0x20a9, 0x0046, 0x1d04, 0x0c66, + 0x080c, 0x87c3, 0x1f04, 0x0c66, 0x7850, 0x9085, 0x0400, 0x9084, + 0xdfbf, 0x7852, 0x793a, 0x080c, 0x757a, 0x0148, 0x080c, 0x758c, + 0x1118, 0x080c, 0x785d, 0x0050, 0x080c, 0x7571, 0x0dd0, 0x080c, + 0x7858, 0x080c, 0x784e, 0x080c, 0x7495, 0x0020, 0x2009, 0x00f8, + 0x080c, 0x60a3, 0x20a9, 0x0028, 0xa001, 0x1f04, 0x0c8c, 0x7850, + 0x9085, 0x1400, 0x7852, 0x080c, 0x7569, 0x0120, 0x7843, 0x0090, + 0x7843, 0x0010, 0x2021, 0xe678, 0x2019, 0xea60, 0x0d0c, 0x87c3, + 0x7820, 0xd09c, 0x1588, 0x080c, 0x7569, 0x0904, 0x0cf2, 0x7824, + 0xd0ac, 0x1904, 0x0d12, 0x080c, 0x758c, 0x1530, 0x0046, 0x2021, + 0x0320, 0x8421, 0x1df0, 0x004e, 0x7827, 0x1800, 0x080c, 0x2c7a, + 0x7824, 0x9084, 0x1800, 0x1168, 0x9484, 0x0fff, 0x1140, 0x2001, + 0x1810, 0x2004, 0x9084, 0x9000, 0x0110, 0x080c, 0x0d33, 0x8421, + 0x1158, 0x1d04, 0x0ccd, 0x080c, 0x87c3, 0x080c, 0x7858, 0x080c, + 0x784e, 0x7003, 0x0001, 0x04f0, 0x8319, 0x1940, 0x1d04, 0x0cda, + 0x080c, 0x87c3, 0x2009, 0x199c, 0x2104, 0x9005, 0x0118, 0x8001, + 0x200a, 0x1178, 0x200b, 0x000a, 0x7827, 0x0048, 0x20a9, 0x0002, + 0x080c, 0x2c5b, 0x7924, 0x080c, 0x2c7a, 0xd19c, 0x0110, 0x080c, + 0x2b9b, 0x00d8, 0x080c, 0x757a, 0x1140, 0x94a2, 0x03e8, 0x1128, + 0x080c, 0x7541, 0x7003, 0x0001, 0x00a8, 0x7827, 0x1800, 0x080c, + 0x2c7a, 0x7824, 0x080c, 0x7583, 0x0110, 0xd0ac, 0x1158, 0x9084, + 0x1800, 0x0950, 0x7003, 0x0001, 0x0028, 0x2001, 0x0001, 0x080c, + 0x283d, 0x0078, 0x2009, 0x180c, 0x210c, 0xd19c, 0x1120, 0x7904, + 0x918d, 0x0002, 0x7906, 0x7827, 0x0048, 0x7828, 0x9085, 0x0028, + 0x782a, 0x7850, 0x9085, 0x0400, 0x7852, 0x2001, 0x19a9, 0x2003, + 0x0000, 0x9006, 0x78f2, 0x015e, 0x003e, 0x000e, 0x012e, 0x00fe, + 0x004e, 0x001e, 0x0005, 0x0006, 0x0016, 0x0036, 0x0046, 0x00b6, + 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x0156, 0x0069, 0x0d0c, 0x87c3, + 0x015e, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, 0x004e, 0x003e, + 0x001e, 0x000e, 0x0005, 0x00e6, 0x2071, 0x189e, 0x7004, 0x9086, + 0x0001, 0x1110, 0x080c, 0x34d3, 0x00ee, 0x0005, 0x0005, 0x2a70, + 0x2061, 0x19ad, 0x2063, 0x0003, 0x6007, 0x0003, 0x600b, 0x0012, + 0x600f, 0x0137, 0x2001, 0x197d, 0x900e, 0x2102, 0x7196, 0x2001, + 0x0100, 0x2004, 0x9082, 0x0002, 0x0218, 0x705f, 0xffff, 0x0008, + 0x715e, 0x7067, 0xffff, 0x717e, 0x7182, 0x080c, 0xd2a9, 0x70eb, + 0x00c0, 0x2061, 0x196d, 0x6003, 0x0909, 0x6106, 0x600b, 0x8800, + 0x600f, 0x0200, 0x6013, 0x00ff, 0x6017, 0x001f, 0x611a, 0x601f, + 0x07d0, 0x2061, 0x1975, 0x6003, 0x8000, 0x6106, 0x610a, 0x600f, + 0x0200, 0x6013, 0x00ff, 0x6116, 0x601b, 0x0001, 0x611e, 0x2061, + 0x198a, 0x6003, 0x514c, 0x6007, 0x4f47, 0x600b, 0x4943, 0x600f, + 0x2020, 0x2001, 0x182c, 0x2102, 0x0005, 0x9016, 0x080c, 0x671d, + 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, 0x1a0a, 0x2004, 0x78b6, 0x2001, 0x1a87, + 0x2004, 0x78ba, 0x6808, 0x78be, 0x00de, 0x7833, 0x0012, 0x2091, + 0x5000, 0x0156, 0x00d6, 0x0036, 0x0026, 0x2079, 0x0300, 0x2069, + 0x1aaa, 0x7a08, 0x226a, 0x2069, 0x1aab, 0x7a18, 0x226a, 0x8d68, + 0x7a1c, 0x226a, 0x782c, 0x2019, 0x1ab8, 0x201a, 0x2019, 0x1abb, + 0x9016, 0x7808, 0xd09c, 0x0168, 0x7820, 0x201a, 0x8210, 0x8318, + 0x9386, 0x1ad0, 0x0108, 0x0ca8, 0x7808, 0xd09c, 0x0110, 0x2011, + 0xdead, 0x2019, 0x1ab9, 0x782c, 0x201a, 0x8318, 0x221a, 0x7803, + 0x0000, 0x2069, 0x1a8a, 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, 0x1a1d, 0x2004, 0x9005, + 0x0128, 0x2001, 0x008b, 0x2004, 0xd0fc, 0x0dd8, 0x2001, 0x008a, + 0x2003, 0x0002, 0x2003, 0x1001, 0x080c, 0x57e2, 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, 0x2c72, 0x1118, 0x2011, 0x8484, 0x0058, 0x2011, + 0x8282, 0x0040, 0x080c, 0x2c72, 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, 0x85f1, 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, 0x1a1c, + 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, 0x1a1c, + 0x701c, 0x9088, 0x1a26, 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, 0x1a1c, 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, 0x1a26, 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, 0x1a1c, 0x2104, 0xc095, 0x200a, 0x080c, + 0x1117, 0x0005, 0x0016, 0x00e6, 0x2071, 0x1a1c, 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, 0x6dc4, 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, 0x6dc4, + 0x000e, 0x001e, 0xd1fc, 0x1138, 0xd1f4, 0x0128, 0x00c6, 0x2060, + 0x080c, 0xb101, 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, 0x1930, + 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, 0x1930, 0x204c, 0xaa7c, 0x009e, + 0x080c, 0x8c5a, 0x2009, 0x188c, 0x2104, 0x9084, 0xfffc, 0x200a, + 0x080c, 0x8abf, 0x7007, 0x0000, 0x080c, 0x1128, 0x0005, 0x7007, + 0x0000, 0x080c, 0x1128, 0x0005, 0x0126, 0x2091, 0x2200, 0x2079, + 0x0300, 0x2071, 0x1a66, 0x7003, 0x0000, 0x78bf, 0x00f6, 0x781b, + 0x4800, 0x00c1, 0x7803, 0x0003, 0x780f, 0x0000, 0x20a9, 0x03e8, + 0x2061, 0xee29, 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, 0x1a67, 0x2003, 0x0000, + 0x78ab, 0x0004, 0x78ac, 0xd0ac, 0x1de8, 0x78ab, 0x0002, 0x7807, + 0x0007, 0x7827, 0x0030, 0x782b, 0x0400, 0x7827, 0x0031, 0x782b, + 0x1a8a, 0x781f, 0xff00, 0x781b, 0xb700, 0x2001, 0x0200, 0x2004, + 0xd0dc, 0x0110, 0x781f, 0x0303, 0x2061, 0x1a8a, 0x602f, 0x1cd0, + 0x2001, 0x181a, 0x2004, 0x9082, 0x1cd0, 0x6032, 0x603b, 0x20f0, + 0x2001, 0x33ac, 0xd0fc, 0x190c, 0x0dc5, 0x2001, 0x1810, 0x2004, + 0xd0c4, 0x1128, 0x2001, 0x0003, 0x2004, 0xd0d4, 0x1118, 0x783f, + 0x33ac, 0x0020, 0x9084, 0xc000, 0x783f, 0xb3ac, 0x604f, 0x193e, + 0x2001, 0x1929, 0x2004, 0x6042, 0x00ce, 0x0005, 0x9086, 0x000d, + 0x11d0, 0x7808, 0xd09c, 0x01b8, 0x7820, 0x0026, 0x2010, 0x080c, + 0xce44, 0x0180, 0x2260, 0x6000, 0x9086, 0x0004, 0x1158, 0x0016, + 0x6120, 0x9186, 0x0009, 0x0108, 0x0020, 0x2009, 0x004c, 0x080c, + 0xb180, 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, 0x1a7f, 0x2104, + 0x8000, 0x200a, 0x080c, 0x8006, 0x080c, 0x1b02, 0x0005, 0x2009, + 0x0048, 0x2060, 0x080c, 0xb180, 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, 0xb180, 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, 0xb180, 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, 0x1b02, 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, 0x8006, 0x080c, 0x1b02, 0x080c, 0xce56, 0x0158, 0xa9ac, + 0xa936, 0xa9b0, 0xa93a, 0xa83f, 0xffff, 0xa843, 0xffff, 0xa880, + 0xc0bd, 0xa882, 0x080c, 0xca71, 0x0005, 0x6020, 0x9086, 0x0009, + 0x1128, 0x2009, 0x004c, 0x080c, 0xb180, 0x0048, 0x6010, 0x00b6, + 0x2058, 0xb800, 0x00be, 0xd0bc, 0x6024, 0x190c, 0xd242, 0x2029, + 0x00c8, 0x8529, 0x0128, 0x2001, 0x0201, 0x2004, 0x9005, 0x0dc8, + 0x7dbc, 0x080c, 0xedd2, 0xd5a4, 0x1118, 0x080c, 0x15a0, 0x0005, + 0x080c, 0x8006, 0x080c, 0x1b02, 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, 0x18f1, 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, 0xb180, 0x0005, 0x0005, 0x0005, 0x00e1, 0x2008, + 0x00d1, 0x0006, 0x7004, 0xc09d, 0x7006, 0x000e, 0x080c, 0x8fab, + 0x0005, 0x0089, 0x9005, 0x0118, 0x080c, 0x8bae, 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, 0x8006, 0x080c, 0x1b02, 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, 0x1a82, 0x2104, 0x8000, 0x0208, 0x200a, 0x080c, + 0x92ed, 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, 0x1a83, 0x2104, 0x8000, 0x0208, 0x200a, 0x080c, + 0x1f14, 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, 0x19f8, 0x2004, + 0x9005, 0x01b8, 0x2001, 0x1a6a, 0x2004, 0x9086, 0x0000, 0x0188, + 0x2009, 0x1a81, 0x2104, 0x8000, 0x0208, 0x200a, 0x080c, 0xa595, + 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, 0x1a80, 0x2404, 0x8000, + 0x0208, 0x2022, 0x080c, 0x8006, 0x080c, 0x1b02, 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, 0x7f4d, 0x012e, 0x7358, 0x745c, 0x6014, + 0x905d, 0x0598, 0x2b48, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, + 0xd0bc, 0x190c, 0xd21d, 0xab42, 0xac3e, 0x2001, 0x1869, 0x2004, + 0xd0b4, 0x1170, 0x601c, 0xd0e4, 0x1158, 0x6010, 0x00b6, 0x2058, + 0xb800, 0x00be, 0xd0bc, 0x1120, 0xa83b, 0x7fff, 0xa837, 0xffff, + 0x080c, 0x2110, 0x1190, 0x080c, 0x194e, 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, + 0x2ff0, 0x0126, 0x2091, 0x2200, 0x0016, 0x00c6, 0x3e60, 0x6014, + 0x2048, 0x2940, 0x903e, 0x2730, 0xa864, 0x2068, 0xa81a, 0x9d84, + 0x000f, 0x9088, 0x20f0, 0x2165, 0x0002, 0x1794, 0x1802, 0x1794, + 0x1794, 0x1798, 0x17e3, 0x1794, 0x17b8, 0x178d, 0x17f9, 0x1794, + 0x1794, 0x179d, 0x18ef, 0x17cc, 0x17c2, 0xa964, 0x918c, 0x00ff, + 0x918e, 0x0048, 0x0904, 0x17f9, 0x9085, 0x0001, 0x0804, 0x18e5, + 0xa87c, 0xd0ac, 0x0dc8, 0x0804, 0x1809, 0xa87c, 0xd0ac, 0x0da0, + 0x0804, 0x1874, 0xa898, 0x901d, 0x1108, 0xab9c, 0x9016, 0xaab2, + 0xaa3e, 0xaa42, 0x3e00, 0x9080, 0x0008, 0x2004, 0x9080, 0x9179, + 0x2005, 0x9005, 0x090c, 0x0dc5, 0x2004, 0xa8ae, 0x0804, 0x18cd, + 0xa87c, 0xd0bc, 0x09c8, 0xa890, 0xa842, 0xa88c, 0xa83e, 0xa888, + 0x0804, 0x1809, 0xa87c, 0xd0bc, 0x0978, 0xa890, 0xa842, 0xa88c, + 0xa83e, 0xa888, 0x0804, 0x1874, 0xa87c, 0xd0bc, 0x0928, 0xa890, + 0xa842, 0xa88c, 0xa83e, 0xa804, 0x9045, 0x090c, 0x0dc5, 0xa164, + 0xa91a, 0x91ec, 0x000f, 0x9d80, 0x20f0, 0x2065, 0xa888, 0xd19c, + 0x1904, 0x1874, 0x0430, 0xa87c, 0xd0ac, 0x0904, 0x1794, 0xa804, + 0x9045, 0x090c, 0x0dc5, 0xa164, 0xa91a, 0x91ec, 0x000f, 0x9d80, + 0x20f0, 0x2065, 0x9006, 0xa842, 0xa83e, 0xd19c, 0x1904, 0x1874, + 0x0080, 0xa87c, 0xd0ac, 0x0904, 0x1794, 0x9006, 0xa842, 0xa83e, + 0x0804, 0x1874, 0xa87c, 0xd0ac, 0x0904, 0x1794, 0x9006, 0xa842, + 0xa83e, 0x2c05, 0x908a, 0x0036, 0x1a0c, 0x0dc5, 0x9082, 0x001b, + 0x0002, 0x182c, 0x182c, 0x182e, 0x182c, 0x182c, 0x182c, 0x1838, + 0x182c, 0x182c, 0x182c, 0x1842, 0x182c, 0x182c, 0x182c, 0x184c, + 0x182c, 0x182c, 0x182c, 0x1856, 0x182c, 0x182c, 0x182c, 0x1860, + 0x182c, 0x182c, 0x182c, 0x186a, 0x080c, 0x0dc5, 0xa574, 0xa478, + 0x9d86, 0x0024, 0x0904, 0x17a2, 0xa37c, 0xa280, 0x0804, 0x18cd, + 0xa584, 0xa488, 0x9d86, 0x0024, 0x0904, 0x17a2, 0xa38c, 0xa290, + 0x0804, 0x18cd, 0xa594, 0xa498, 0x9d86, 0x0024, 0x0904, 0x17a2, + 0xa39c, 0xa2a0, 0x0804, 0x18cd, 0xa5a4, 0xa4a8, 0x9d86, 0x0024, + 0x0904, 0x17a2, 0xa3ac, 0xa2b0, 0x0804, 0x18cd, 0xa5b4, 0xa4b8, + 0x9d86, 0x0024, 0x0904, 0x17a2, 0xa3bc, 0xa2c0, 0x0804, 0x18cd, + 0xa5c4, 0xa4c8, 0x9d86, 0x0024, 0x0904, 0x17a2, 0xa3cc, 0xa2d0, + 0x0804, 0x18cd, 0xa5d4, 0xa4d8, 0x9d86, 0x0024, 0x0904, 0x17a2, + 0xa3dc, 0xa2e0, 0x0804, 0x18cd, 0x2c05, 0x908a, 0x0034, 0x1a0c, + 0x0dc5, 0x9082, 0x001b, 0x0002, 0x1897, 0x1895, 0x1895, 0x1895, + 0x1895, 0x1895, 0x18a2, 0x1895, 0x1895, 0x1895, 0x1895, 0x1895, + 0x18ad, 0x1895, 0x1895, 0x1895, 0x1895, 0x1895, 0x18b8, 0x1895, + 0x1895, 0x1895, 0x1895, 0x1895, 0x18c3, 0x080c, 0x0dc5, 0xa56c, + 0xa470, 0xa774, 0xa678, 0x9d86, 0x002c, 0x0904, 0x17a2, 0xa37c, + 0xa280, 0x0458, 0xa584, 0xa488, 0xa78c, 0xa690, 0x9d86, 0x002c, + 0x0904, 0x17a2, 0xa394, 0xa298, 0x0400, 0xa59c, 0xa4a0, 0xa7a4, + 0xa6a8, 0x9d86, 0x002c, 0x0904, 0x17a2, 0xa3ac, 0xa2b0, 0x00a8, + 0xa5b4, 0xa4b8, 0xa7bc, 0xa6c0, 0x9d86, 0x002c, 0x0904, 0x17a2, + 0xa3c4, 0xa2c8, 0x0050, 0xa5cc, 0xa4d0, 0xa7d4, 0xa6d8, 0x9d86, + 0x002c, 0x0904, 0x17a2, 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, + 0x1794, 0x2ff0, 0x0126, 0x2091, 0x2200, 0x0016, 0x00c6, 0x3e60, + 0x6014, 0x2048, 0x2940, 0xa80e, 0x2061, 0x20eb, 0xa813, 0x20eb, + 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, 0x20f0, 0x2015, 0x82ff, + 0x090c, 0x0dc5, 0xaa12, 0x2205, 0xa80a, 0x0c08, 0x903e, 0x2730, + 0xa880, 0xd0fc, 0x1190, 0x2d00, 0x0002, 0x1a78, 0x19a5, 0x19a5, + 0x1a78, 0x19a5, 0x1a72, 0x1a78, 0x19a5, 0x1a15, 0x1a15, 0x1a15, + 0x1a78, 0x1a15, 0x1a78, 0x1a6f, 0x1a15, 0xc0fc, 0xa882, 0xab2c, + 0xaa30, 0xad1c, 0xac20, 0xdd9c, 0x0904, 0x1a7a, 0x2c05, 0x908a, + 0x0034, 0x1a0c, 0x0dc5, 0x9082, 0x001b, 0x0002, 0x1991, 0x198f, + 0x198f, 0x198f, 0x198f, 0x198f, 0x1995, 0x198f, 0x198f, 0x198f, + 0x198f, 0x198f, 0x1999, 0x198f, 0x198f, 0x198f, 0x198f, 0x198f, + 0x199d, 0x198f, 0x198f, 0x198f, 0x198f, 0x198f, 0x19a1, 0x080c, + 0x0dc5, 0xa774, 0xa678, 0x0804, 0x1a7a, 0xa78c, 0xa690, 0x0804, + 0x1a7a, 0xa7a4, 0xa6a8, 0x0804, 0x1a7a, 0xa7bc, 0xa6c0, 0x0804, + 0x1a7a, 0xa7d4, 0xa6d8, 0x0804, 0x1a7a, 0xa898, 0x901d, 0x1108, + 0xab9c, 0x9016, 0x2c05, 0x908a, 0x0036, 0x1a0c, 0x0dc5, 0x9082, + 0x001b, 0x0002, 0x19cd, 0x19cd, 0x19cf, 0x19cd, 0x19cd, 0x19cd, + 0x19d9, 0x19cd, 0x19cd, 0x19cd, 0x19e3, 0x19cd, 0x19cd, 0x19cd, + 0x19ed, 0x19cd, 0x19cd, 0x19cd, 0x19f7, 0x19cd, 0x19cd, 0x19cd, + 0x1a01, 0x19cd, 0x19cd, 0x19cd, 0x1a0b, 0x080c, 0x0dc5, 0xa574, + 0xa478, 0x9d86, 0x0004, 0x0904, 0x1a7a, 0xa37c, 0xa280, 0x0804, + 0x1a7a, 0xa584, 0xa488, 0x9d86, 0x0004, 0x0904, 0x1a7a, 0xa38c, + 0xa290, 0x0804, 0x1a7a, 0xa594, 0xa498, 0x9d86, 0x0004, 0x0904, + 0x1a7a, 0xa39c, 0xa2a0, 0x0804, 0x1a7a, 0xa5a4, 0xa4a8, 0x9d86, + 0x0004, 0x0904, 0x1a7a, 0xa3ac, 0xa2b0, 0x0804, 0x1a7a, 0xa5b4, + 0xa4b8, 0x9d86, 0x0004, 0x0904, 0x1a7a, 0xa3bc, 0xa2c0, 0x0804, + 0x1a7a, 0xa5c4, 0xa4c8, 0x9d86, 0x0004, 0x0904, 0x1a7a, 0xa3cc, + 0xa2d0, 0x0804, 0x1a7a, 0xa5d4, 0xa4d8, 0x9d86, 0x0004, 0x0904, + 0x1a7a, 0xa3dc, 0xa2e0, 0x0804, 0x1a7a, 0xa898, 0x901d, 0x1108, + 0xab9c, 0x9016, 0x2c05, 0x908a, 0x0034, 0x1a0c, 0x0dc5, 0x9082, + 0x001b, 0x0002, 0x1a3d, 0x1a3b, 0x1a3b, 0x1a3b, 0x1a3b, 0x1a3b, + 0x1a47, 0x1a3b, 0x1a3b, 0x1a3b, 0x1a3b, 0x1a3b, 0x1a51, 0x1a3b, + 0x1a3b, 0x1a3b, 0x1a3b, 0x1a3b, 0x1a5b, 0x1a3b, 0x1a3b, 0x1a3b, + 0x1a3b, 0x1a3b, 0x1a65, 0x080c, 0x0dc5, 0xa56c, 0xa470, 0xa774, + 0xa678, 0x9d86, 0x000c, 0x05b0, 0xa37c, 0xa280, 0x0498, 0xa584, + 0xa488, 0xa78c, 0xa690, 0x9d86, 0x000c, 0x0560, 0xa394, 0xa298, + 0x0448, 0xa59c, 0xa4a0, 0xa7a4, 0xa6a8, 0x9d86, 0x000c, 0x0510, + 0xa3ac, 0xa2b0, 0x00f8, 0xa5b4, 0xa4b8, 0xa7bc, 0xa6c0, 0x9d86, + 0x000c, 0x01c0, 0xa3c4, 0xa2c8, 0x00a8, 0xa5cc, 0xa4d0, 0xa7d4, + 0xa6d8, 0x9d86, 0x000c, 0x0170, 0xa3dc, 0xa2e0, 0x0058, 0x9d86, + 0x000e, 0x1130, 0x080c, 0x20a8, 0x1904, 0x194e, 0x900e, 0x0050, + 0x080c, 0x0dc5, 0xab2e, 0xaa32, 0xad1e, 0xac22, 0xaf26, 0xae2a, + 0x080c, 0x20a8, 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, 0xb180, 0x0005, 0xa974, 0xd1dc, 0x1108, 0x0005, 0xa934, + 0xa88c, 0x9106, 0x1158, 0xa938, 0xa890, 0x9106, 0x1138, 0x601c, + 0xc084, 0x601e, 0x2009, 0x0048, 0x0804, 0xb180, 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, 0x1b92, 0x7930, 0x9186, 0x0040, 0x0160, + 0x9186, 0x0042, 0x190c, 0x0dc5, 0x2001, 0x001e, 0x8001, 0x1df0, + 0x8631, 0x1d40, 0x080c, 0x1ba1, 0x000e, 0x6022, 0x012e, 0x0005, + 0x080c, 0x1b8e, 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, 0x7569, 0x1188, 0x2001, 0x0138, 0x2003, + 0x0000, 0x2001, 0x0160, 0x2003, 0x0000, 0x2011, 0x012c, 0xa001, + 0xa001, 0x8211, 0x1de0, 0x0059, 0x0804, 0x7616, 0x0479, 0x0039, + 0x2001, 0x0160, 0x2502, 0x2001, 0x0138, 0x2202, 0x0005, 0x00e6, + 0x2071, 0x0200, 0x080c, 0x2c86, 0x2009, 0x003c, 0x080c, 0x2432, + 0x2001, 0x015d, 0x2003, 0x0000, 0x7000, 0x9084, 0x003c, 0x1de0, + 0x080c, 0x85f1, 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, 0x7569, 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, 0x1bff, 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, 0x1b98, 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, 0x1a6a, 0x2079, 0x0090, 0x012e, + 0x0005, 0x9280, 0x0005, 0x2004, 0x2048, 0xa97c, 0xd1dc, 0x1904, + 0x1ca1, 0xa964, 0x9184, 0x0007, 0x0002, 0x1c1d, 0x1c8c, 0x1c34, + 0x1c36, 0x1c34, 0x1c74, 0x1c54, 0x1c43, 0x918c, 0x00ff, 0x9186, + 0x0008, 0x1170, 0xa87c, 0xd0b4, 0x0904, 0x1ece, 0x9006, 0xa842, + 0xa83e, 0xa988, 0x2900, 0xa85a, 0xa813, 0x20eb, 0x0804, 0x1c9d, + 0x9186, 0x0048, 0x0904, 0x1c8c, 0x080c, 0x0dc5, 0x9184, 0x00ff, + 0x9086, 0x0013, 0x0904, 0x1c8c, 0x9184, 0x00ff, 0x9086, 0x001b, + 0x0904, 0x1c8c, 0x0c88, 0xa87c, 0xd0b4, 0x0904, 0x1ece, 0xa890, + 0xa842, 0xa83a, 0xa88c, 0xa83e, 0xa836, 0xa8ac, 0xa846, 0xa8b0, + 0xa84a, 0xa988, 0x0804, 0x1c94, 0xa864, 0x9084, 0x00ff, 0x9086, + 0x001e, 0x19d0, 0xa87c, 0xd0b4, 0x0904, 0x1ece, 0xa890, 0xa842, + 0xa83a, 0xa88c, 0xa83e, 0xa836, 0xa8ac, 0xa846, 0xa8b0, 0xa84a, + 0xa804, 0xa85a, 0x2040, 0xa064, 0x9084, 0x000f, 0x9080, 0x20f0, + 0x2005, 0xa812, 0xa988, 0x0448, 0x918c, 0x00ff, 0x9186, 0x0015, + 0x1540, 0xa87c, 0xd0b4, 0x0904, 0x1ece, 0xa804, 0xa85a, 0x2040, + 0xa064, 0x9084, 0x000f, 0x9080, 0x20f0, 0x2005, 0xa812, 0xa988, + 0x9006, 0xa842, 0xa83e, 0x0088, 0xa87c, 0xd0b4, 0x0904, 0x1ece, + 0xa988, 0x9006, 0xa842, 0xa83e, 0x2900, 0xa85a, 0xa864, 0x9084, + 0x000f, 0x9080, 0x20f0, 0x2005, 0xa812, 0xa916, 0xa87c, 0xc0dd, + 0xa87e, 0x0005, 0x00f6, 0x2079, 0x0090, 0x782c, 0xd0fc, 0x190c, + 0x1f14, 0x00e6, 0x2071, 0x1a6a, 0x7000, 0x9005, 0x1904, 0x1d08, + 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, + 0x2110, 0x004e, 0x003e, 0x0d30, 0x0c98, 0x9085, 0x0001, 0x0c80, + 0x2009, 0x0306, 0x200b, 0x4800, 0x7027, 0x0000, 0x0005, 0x0076, + 0x0066, 0x0056, 0x0046, 0x0036, 0x0026, 0x8aff, 0x0904, 0x1ec7, + 0x700c, 0x7214, 0x923a, 0x7010, 0x7218, 0x9203, 0x0a04, 0x1ec6, + 0x9705, 0x0904, 0x1ec6, 0x903e, 0x2730, 0xa880, 0xd0fc, 0x1190, + 0x2d00, 0x0002, 0x1e4b, 0x1d8a, 0x1d8a, 0x1e4b, 0x1e4b, 0x1e28, + 0x1e4b, 0x1d8a, 0x1e2f, 0x1dd9, 0x1dd9, 0x1e4b, 0x1e4b, 0x1e4b, + 0x1e22, 0x1dd9, 0xc0fc, 0xa882, 0xab2c, 0xaa30, 0xad1c, 0xac20, + 0xdd9c, 0x0904, 0x1e58, 0x2c05, 0x908a, 0x0034, 0x1a0c, 0x0dc5, + 0x9082, 0x001b, 0x0002, 0x1d76, 0x1d74, 0x1d74, 0x1d74, 0x1d74, + 0x1d74, 0x1d7a, 0x1d74, 0x1d74, 0x1d74, 0x1d74, 0x1d74, 0x1d7e, + 0x1d74, 0x1d74, 0x1d74, 0x1d74, 0x1d74, 0x1d82, 0x1d74, 0x1d74, + 0x1d74, 0x1d74, 0x1d74, 0x1d86, 0x080c, 0x0dc5, 0xa774, 0xa678, + 0x0804, 0x1e58, 0xa78c, 0xa690, 0x0804, 0x1e58, 0xa7a4, 0xa6a8, + 0x0804, 0x1e58, 0xa7bc, 0xa6c0, 0x0804, 0x1e58, 0xa7d4, 0xa6d8, + 0x0804, 0x1e58, 0x2c05, 0x908a, 0x0036, 0x1a0c, 0x0dc5, 0x9082, + 0x001b, 0x0002, 0x1dad, 0x1dad, 0x1daf, 0x1dad, 0x1dad, 0x1dad, + 0x1db5, 0x1dad, 0x1dad, 0x1dad, 0x1dbb, 0x1dad, 0x1dad, 0x1dad, + 0x1dc1, 0x1dad, 0x1dad, 0x1dad, 0x1dc7, 0x1dad, 0x1dad, 0x1dad, + 0x1dcd, 0x1dad, 0x1dad, 0x1dad, 0x1dd3, 0x080c, 0x0dc5, 0xa574, + 0xa478, 0xa37c, 0xa280, 0x0804, 0x1e58, 0xa584, 0xa488, 0xa38c, + 0xa290, 0x0804, 0x1e58, 0xa594, 0xa498, 0xa39c, 0xa2a0, 0x0804, + 0x1e58, 0xa5a4, 0xa4a8, 0xa3ac, 0xa2b0, 0x0804, 0x1e58, 0xa5b4, + 0xa4b8, 0xa3bc, 0xa2c0, 0x0804, 0x1e58, 0xa5c4, 0xa4c8, 0xa3cc, + 0xa2d0, 0x0804, 0x1e58, 0xa5d4, 0xa4d8, 0xa3dc, 0xa2e0, 0x0804, + 0x1e58, 0x2c05, 0x908a, 0x0034, 0x1a0c, 0x0dc5, 0x9082, 0x001b, + 0x0002, 0x1dfc, 0x1dfa, 0x1dfa, 0x1dfa, 0x1dfa, 0x1dfa, 0x1e04, + 0x1dfa, 0x1dfa, 0x1dfa, 0x1dfa, 0x1dfa, 0x1e0c, 0x1dfa, 0x1dfa, + 0x1dfa, 0x1dfa, 0x1dfa, 0x1e14, 0x1dfa, 0x1dfa, 0x1dfa, 0x1dfa, + 0x1dfa, 0x1e1b, 0x080c, 0x0dc5, 0xa56c, 0xa470, 0xa774, 0xa678, + 0xa37c, 0xa280, 0x0804, 0x1e58, 0xa584, 0xa488, 0xa78c, 0xa690, + 0xa394, 0xa298, 0x0804, 0x1e58, 0xa59c, 0xa4a0, 0xa7a4, 0xa6a8, + 0xa3ac, 0xa2b0, 0x0804, 0x1e58, 0xa5b4, 0xa4b8, 0xa7bc, 0xa6c0, + 0xa3c4, 0xa2c8, 0x04e8, 0xa5cc, 0xa4d0, 0xa7d4, 0xa6d8, 0xa3dc, + 0xa2e0, 0x04b0, 0xa864, 0x9084, 0x00ff, 0x9086, 0x001e, 0x1518, + 0x080c, 0x20a8, 0x1904, 0x1d25, 0x900e, 0x0804, 0x1ec7, 0xab64, + 0x939c, 0x00ff, 0x9386, 0x0048, 0x1180, 0x00c6, 0x7004, 0x2060, + 0x6004, 0x9086, 0x0043, 0x00ce, 0x0904, 0x1dd9, 0xab9c, 0x9016, + 0xad8c, 0xac90, 0xaf94, 0xae98, 0x0098, 0x9386, 0x0008, 0x0904, + 0x1dd9, 0x080c, 0x0dc5, 0xa964, 0x918c, 0x00ff, 0x9186, 0x0013, + 0x0904, 0x1d8a, 0x9186, 0x001b, 0x0904, 0x1dd9, 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, 0x20a8, 0x0448, 0xd6b4, 0x0110, + 0x200b, 0x4040, 0x2031, 0x0080, 0x9584, 0x007f, 0x0108, 0x9632, + 0x7124, 0x7000, 0x9086, 0x0000, 0x1198, 0xc185, 0x7126, 0x2009, + 0x0306, 0x2104, 0xd0b4, 0x1904, 0x1e69, 0x200b, 0x4040, 0x2009, + 0x1a84, 0x2104, 0x8000, 0x0a04, 0x1e69, 0x200a, 0x0804, 0x1e69, + 0xc18d, 0x7126, 0xd184, 0x1d58, 0x0804, 0x1e69, 0x9006, 0x002e, + 0x003e, 0x004e, 0x005e, 0x006e, 0x007e, 0x0005, 0x080c, 0x0dc5, + 0x0026, 0x2001, 0x0105, 0x2003, 0x0010, 0x782b, 0x0004, 0x7003, + 0x0000, 0x7004, 0x2060, 0x6014, 0x2048, 0x080c, 0xce56, 0x0118, + 0xa880, 0xc0bd, 0xa882, 0x782c, 0xd0ac, 0x1de8, 0x080c, 0x1d18, + 0x6020, 0x9086, 0x0006, 0x1180, 0x2061, 0x0100, 0x62c8, 0x2001, + 0x00fa, 0x8001, 0x1df0, 0x60c8, 0x9206, 0x1dc0, 0x60c4, 0xa89a, + 0x60c8, 0xa896, 0x7004, 0x2060, 0x00c6, 0x080c, 0xca71, 0x00ce, + 0x2001, 0x19f8, 0x2004, 0x9c06, 0x1160, 0x2009, 0x0040, 0x080c, + 0x2432, 0x080c, 0xaa59, 0x2011, 0x0000, 0x080c, 0xa8f7, 0x080c, + 0x9a0f, 0x002e, 0x0804, 0x2058, 0x0126, 0x2091, 0x2400, 0xa858, + 0x2040, 0x792c, 0x782b, 0x0002, 0x9184, 0x0700, 0x1904, 0x1ed0, + 0x7000, 0x0002, 0x2058, 0x1f26, 0x1fa6, 0x2056, 0x8001, 0x7002, + 0x7027, 0x0000, 0xd19c, 0x1158, 0x8aff, 0x0904, 0x1f73, 0x080c, + 0x1d1f, 0x0904, 0x2058, 0x080c, 0x1d1f, 0x0804, 0x2058, 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, 0x20c3, + 0xa880, 0xc0fd, 0xa882, 0x2a00, 0xa816, 0x2800, 0xa85a, 0x2c00, + 0xa812, 0x7003, 0x0000, 0x2009, 0x0306, 0x200b, 0x4800, 0x7027, + 0x0000, 0x0804, 0x2058, 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, 0x1d18, 0x0804, 0x2058, 0x8001, 0x7002, + 0x7024, 0x8004, 0x7026, 0xd194, 0x0170, 0x782c, 0xd0fc, 0x1904, + 0x1f19, 0xd19c, 0x1904, 0x2054, 0x8aff, 0x0904, 0x2058, 0x080c, + 0x1d1f, 0x0804, 0x2058, 0x0026, 0x0036, 0xab3c, 0xaa40, 0x080c, + 0x20c3, 0xdd9c, 0x1904, 0x2013, 0x2c05, 0x908a, 0x0036, 0x1a0c, + 0x0dc5, 0x9082, 0x001b, 0x0002, 0x1fe7, 0x1fe7, 0x1fe9, 0x1fe7, + 0x1fe7, 0x1fe7, 0x1fef, 0x1fe7, 0x1fe7, 0x1fe7, 0x1ff5, 0x1fe7, + 0x1fe7, 0x1fe7, 0x1ffb, 0x1fe7, 0x1fe7, 0x1fe7, 0x2001, 0x1fe7, + 0x1fe7, 0x1fe7, 0x2007, 0x1fe7, 0x1fe7, 0x1fe7, 0x200d, 0x080c, + 0x0dc5, 0xa07c, 0x931a, 0xa080, 0x9213, 0x0804, 0x1f48, 0xa08c, + 0x931a, 0xa090, 0x9213, 0x0804, 0x1f48, 0xa09c, 0x931a, 0xa0a0, + 0x9213, 0x0804, 0x1f48, 0xa0ac, 0x931a, 0xa0b0, 0x9213, 0x0804, + 0x1f48, 0xa0bc, 0x931a, 0xa0c0, 0x9213, 0x0804, 0x1f48, 0xa0cc, + 0x931a, 0xa0d0, 0x9213, 0x0804, 0x1f48, 0xa0dc, 0x931a, 0xa0e0, + 0x9213, 0x0804, 0x1f48, 0x2c05, 0x908a, 0x0034, 0x1a0c, 0x0dc5, + 0x9082, 0x001b, 0x0002, 0x2036, 0x2034, 0x2034, 0x2034, 0x2034, + 0x2034, 0x203c, 0x2034, 0x2034, 0x2034, 0x2034, 0x2034, 0x2042, + 0x2034, 0x2034, 0x2034, 0x2034, 0x2034, 0x2048, 0x2034, 0x2034, + 0x2034, 0x2034, 0x2034, 0x204e, 0x080c, 0x0dc5, 0xa07c, 0x931a, + 0xa080, 0x9213, 0x0804, 0x1f48, 0xa094, 0x931a, 0xa098, 0x9213, + 0x0804, 0x1f48, 0xa0ac, 0x931a, 0xa0b0, 0x9213, 0x0804, 0x1f48, + 0xa0c4, 0x931a, 0xa0c8, 0x9213, 0x0804, 0x1f48, 0xa0dc, 0x931a, + 0xa0e0, 0x9213, 0x0804, 0x1f48, 0x0804, 0x1f44, 0x080c, 0x0dc5, + 0x012e, 0x0005, 0x00f6, 0x00e6, 0x2071, 0x1a6a, 0x7000, 0x9086, + 0x0000, 0x0904, 0x20a3, 0x2079, 0x0090, 0x2009, 0x0207, 0x210c, + 0xd194, 0x01b8, 0x2009, 0x020c, 0x210c, 0x9184, 0x0003, 0x0188, + 0x080c, 0xee1b, 0x2001, 0x0133, 0x2004, 0x9005, 0x090c, 0x0dc5, + 0x0016, 0x2009, 0x0040, 0x080c, 0x2432, 0x001e, 0x2001, 0x020c, + 0x2102, 0x2009, 0x0206, 0x2104, 0x2009, 0x0203, 0x210c, 0x9106, + 0x1120, 0x2009, 0x0040, 0x080c, 0x2432, 0x782c, 0xd0fc, 0x09a8, + 0x080c, 0x1f14, 0x7000, 0x9086, 0x0000, 0x1978, 0x782b, 0x0004, + 0x782c, 0xd0ac, 0x1de8, 0x2009, 0x0040, 0x080c, 0x2432, 0x782b, + 0x0002, 0x7003, 0x0000, 0x080c, 0x1d18, 0x00ee, 0x00fe, 0x0005, + 0xa880, 0xd0fc, 0x11a8, 0x8c60, 0x2c05, 0x9005, 0x0110, 0x8a51, + 0x0005, 0xa004, 0x9005, 0x0168, 0xa85a, 0x2040, 0xa064, 0x9084, + 0x000f, 0x9080, 0x20f0, 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, + 0x2100, 0x2065, 0x8cff, 0x090c, 0x0dc5, 0x0005, 0x0000, 0x001d, + 0x0021, 0x0025, 0x0029, 0x002d, 0x0031, 0x0035, 0x0000, 0x001b, + 0x0021, 0x0027, 0x002d, 0x0033, 0x0000, 0x0000, 0x0023, 0x0000, + 0x0000, 0x20e3, 0x20df, 0x20e3, 0x20e3, 0x20ed, 0x0000, 0x20e3, + 0x20ea, 0x20ea, 0x20e7, 0x20ea, 0x20ea, 0x0000, 0x20ed, 0x20ea, + 0x0000, 0x20e5, 0x20e5, 0x0000, 0x20e5, 0x20ed, 0x0000, 0x20e5, + 0x20eb, 0x20eb, 0x20eb, 0x0000, 0x20eb, 0x0000, 0x20ed, 0x20eb, + 0x00c6, 0x00d6, 0x0086, 0xab42, 0xac3e, 0xa888, 0x9055, 0x0904, + 0x22ef, 0x2940, 0xa064, 0x90ec, 0x000f, 0x9084, 0x00ff, 0x9086, + 0x0008, 0x1118, 0x2061, 0x20eb, 0x00d0, 0x9de0, 0x20f0, 0x9d86, + 0x0007, 0x0130, 0x9d86, 0x000e, 0x0118, 0x9d86, 0x000f, 0x1120, + 0xa08c, 0x9422, 0xa090, 0x931b, 0x2c05, 0x9065, 0x1140, 0x0310, + 0x0804, 0x22ef, 0xa004, 0x9045, 0x0904, 0x22ef, 0x08d8, 0x2c05, + 0x9005, 0x0904, 0x21d7, 0xdd9c, 0x1904, 0x2193, 0x908a, 0x0036, + 0x1a0c, 0x0dc5, 0x9082, 0x001b, 0x0002, 0x2168, 0x2168, 0x216a, + 0x2168, 0x2168, 0x2168, 0x2170, 0x2168, 0x2168, 0x2168, 0x2176, + 0x2168, 0x2168, 0x2168, 0x217c, 0x2168, 0x2168, 0x2168, 0x2182, + 0x2168, 0x2168, 0x2168, 0x2188, 0x2168, 0x2168, 0x2168, 0x218e, + 0x080c, 0x0dc5, 0xa07c, 0x9422, 0xa080, 0x931b, 0x0804, 0x21cd, + 0xa08c, 0x9422, 0xa090, 0x931b, 0x0804, 0x21cd, 0xa09c, 0x9422, + 0xa0a0, 0x931b, 0x0804, 0x21cd, 0xa0ac, 0x9422, 0xa0b0, 0x931b, + 0x0804, 0x21cd, 0xa0bc, 0x9422, 0xa0c0, 0x931b, 0x0804, 0x21cd, + 0xa0cc, 0x9422, 0xa0d0, 0x931b, 0x0804, 0x21cd, 0xa0dc, 0x9422, + 0xa0e0, 0x931b, 0x04d0, 0x908a, 0x0034, 0x1a0c, 0x0dc5, 0x9082, + 0x001b, 0x0002, 0x21b5, 0x21b3, 0x21b3, 0x21b3, 0x21b3, 0x21b3, + 0x21ba, 0x21b3, 0x21b3, 0x21b3, 0x21b3, 0x21b3, 0x21bf, 0x21b3, + 0x21b3, 0x21b3, 0x21b3, 0x21b3, 0x21c4, 0x21b3, 0x21b3, 0x21b3, + 0x21b3, 0x21b3, 0x21c9, 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, 0x22ef, 0x8c60, 0x0804, 0x213f, 0xa004, + 0x9045, 0x0904, 0x22ef, 0x0804, 0x211a, 0x8a51, 0x0904, 0x22ef, + 0x8c60, 0x2c05, 0x9005, 0x1158, 0xa004, 0x9045, 0x0904, 0x22ef, + 0xa064, 0x90ec, 0x000f, 0x9de0, 0x20f0, 0x2c05, 0x2060, 0xa880, + 0xc0fc, 0xa882, 0x0804, 0x22e4, 0x2c05, 0x8422, 0x8420, 0x831a, + 0x9399, 0x0000, 0xac2e, 0xab32, 0xdd9c, 0x1904, 0x2281, 0x9082, + 0x001b, 0x0002, 0x221d, 0x221d, 0x221f, 0x221d, 0x221d, 0x221d, + 0x222d, 0x221d, 0x221d, 0x221d, 0x223b, 0x221d, 0x221d, 0x221d, + 0x2249, 0x221d, 0x221d, 0x221d, 0x2257, 0x221d, 0x221d, 0x221d, + 0x2265, 0x221d, 0x221d, 0x221d, 0x2273, 0x080c, 0x0dc5, 0xa17c, + 0x2400, 0x9122, 0xa180, 0x2300, 0x911b, 0x0a0c, 0x0dc5, 0xa074, + 0x9420, 0xa078, 0x9319, 0x0804, 0x22df, 0xa18c, 0x2400, 0x9122, + 0xa190, 0x2300, 0x911b, 0x0a0c, 0x0dc5, 0xa084, 0x9420, 0xa088, + 0x9319, 0x0804, 0x22df, 0xa19c, 0x2400, 0x9122, 0xa1a0, 0x2300, + 0x911b, 0x0a0c, 0x0dc5, 0xa094, 0x9420, 0xa098, 0x9319, 0x0804, + 0x22df, 0xa1ac, 0x2400, 0x9122, 0xa1b0, 0x2300, 0x911b, 0x0a0c, + 0x0dc5, 0xa0a4, 0x9420, 0xa0a8, 0x9319, 0x0804, 0x22df, 0xa1bc, + 0x2400, 0x9122, 0xa1c0, 0x2300, 0x911b, 0x0a0c, 0x0dc5, 0xa0b4, + 0x9420, 0xa0b8, 0x9319, 0x0804, 0x22df, 0xa1cc, 0x2400, 0x9122, + 0xa1d0, 0x2300, 0x911b, 0x0a0c, 0x0dc5, 0xa0c4, 0x9420, 0xa0c8, + 0x9319, 0x0804, 0x22df, 0xa1dc, 0x2400, 0x9122, 0xa1e0, 0x2300, + 0x911b, 0x0a0c, 0x0dc5, 0xa0d4, 0x9420, 0xa0d8, 0x9319, 0x0804, + 0x22df, 0x9082, 0x001b, 0x0002, 0x229f, 0x229d, 0x229d, 0x229d, + 0x229d, 0x229d, 0x22ac, 0x229d, 0x229d, 0x229d, 0x229d, 0x229d, + 0x22b9, 0x229d, 0x229d, 0x229d, 0x229d, 0x229d, 0x22c6, 0x229d, + 0x229d, 0x229d, 0x229d, 0x229d, 0x22d3, 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, 0x2310, 0x1f14, + 0x2310, 0x2306, 0x2309, 0x230c, 0x2309, 0x230c, 0x080c, 0x1f14, + 0x0005, 0x080c, 0x11b2, 0x0005, 0x080c, 0x1f14, 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, 0x242f, 0x7900, 0xd1dc, + 0x1118, 0x9084, 0x0006, 0x001a, 0x9084, 0x000e, 0x0002, 0x2357, + 0x234f, 0x7f4d, 0x234f, 0x2351, 0x2351, 0x2351, 0x2351, 0x7f33, + 0x234f, 0x2353, 0x234f, 0x2351, 0x234f, 0x2351, 0x234f, 0x080c, + 0x0dc5, 0x0031, 0x0020, 0x080c, 0x7f33, 0x080c, 0x7f4d, 0x0005, + 0x0006, 0x0016, 0x0026, 0x080c, 0xee1b, 0x7930, 0x9184, 0x0003, + 0x01c0, 0x2001, 0x19f8, 0x2004, 0x9005, 0x0170, 0x2001, 0x0133, + 0x2004, 0x9005, 0x090c, 0x0dc5, 0x00c6, 0x2001, 0x19f8, 0x2064, + 0x080c, 0xca71, 0x00ce, 0x00f8, 0x2009, 0x0040, 0x080c, 0x2432, + 0x00d0, 0x9184, 0x0014, 0x01a0, 0x6a00, 0x9286, 0x0003, 0x0160, + 0x080c, 0x7569, 0x1138, 0x080c, 0x784e, 0x080c, 0x6127, 0x080c, + 0x7495, 0x0010, 0x080c, 0x5fe6, 0x080c, 0x7ffc, 0x0041, 0x0018, + 0x9184, 0x9540, 0x1dc8, 0x002e, 0x001e, 0x000e, 0x0005, 0x00e6, + 0x0036, 0x0046, 0x0056, 0x2071, 0x1a66, 0x080c, 0x1b02, 0x005e, + 0x004e, 0x003e, 0x00ee, 0x0005, 0x0126, 0x2091, 0x2e00, 0x2071, + 0x1800, 0x7128, 0x2001, 0x1970, 0x2102, 0x2001, 0x1978, 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, 0x2c80, + 0x080c, 0x2b9b, 0x6054, 0x8004, 0x8004, 0x8004, 0x8004, 0x9084, + 0x000c, 0x6150, 0x918c, 0xfff3, 0x9105, 0x6052, 0x6050, 0x9084, + 0xb17f, 0x9085, 0x2000, 0x6052, 0x2009, 0x199e, 0x2011, 0x199f, + 0x6358, 0x939c, 0x38f0, 0x2320, 0x080c, 0x2bdf, 0x1238, 0x939d, + 0x4003, 0x94a5, 0x8603, 0x230a, 0x2412, 0x0030, 0x939d, 0x0203, + 0x94a5, 0x8603, 0x230a, 0x2412, 0x9006, 0x080c, 0x2bca, 0x9006, + 0x080c, 0x2bad, 0x20a9, 0x0012, 0x1d04, 0x2484, 0x2091, 0x6000, + 0x1f04, 0x2484, 0x602f, 0x0100, 0x602f, 0x0000, 0x6050, 0x9085, + 0x0400, 0x9084, 0xdfff, 0x6052, 0x6024, 0x6026, 0x080c, 0x28cd, + 0x2009, 0x00ef, 0x6132, 0x6136, 0x080c, 0x28dd, 0x60e7, 0x0000, + 0x61ea, 0x60e3, 0x0008, 0x604b, 0xf7f7, 0x6043, 0x0000, 0x602f, + 0x0080, 0x602f, 0x0000, 0x6007, 0x349f, 0x60bb, 0x0000, 0x20a9, + 0x0018, 0x60bf, 0x0000, 0x1f04, 0x24b1, 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, 0x2534, 0x251a, 0x251d, 0x2520, 0x2525, 0x2527, + 0x252b, 0x252f, 0x080c, 0x921e, 0x00b8, 0x080c, 0x92ed, 0x00a0, + 0x080c, 0x92ed, 0x080c, 0x921e, 0x0078, 0x0099, 0x0068, 0x080c, + 0x921e, 0x0079, 0x0048, 0x080c, 0x92ed, 0x0059, 0x0028, 0x080c, + 0x92ed, 0x080c, 0x921e, 0x0029, 0x002e, 0x001e, 0x000e, 0x012e, + 0x0005, 0x00a6, 0x6124, 0x6028, 0xd09c, 0x0118, 0xd19c, 0x1904, + 0x27a5, 0xd1f4, 0x190c, 0x0dbe, 0x080c, 0x7569, 0x0904, 0x258f, + 0x080c, 0xd561, 0x1120, 0x7000, 0x9086, 0x0003, 0x0570, 0x6024, + 0x9084, 0x1800, 0x0550, 0x080c, 0x758c, 0x0118, 0x080c, 0x757a, + 0x1520, 0x6027, 0x0020, 0x6043, 0x0000, 0x080c, 0xd561, 0x0168, + 0x080c, 0x758c, 0x1150, 0x2001, 0x19a9, 0x2003, 0x0001, 0x6027, + 0x1800, 0x080c, 0x73e4, 0x0804, 0x27a8, 0x70a4, 0x9005, 0x1150, + 0x70a7, 0x0001, 0x00d6, 0x2069, 0x0140, 0x080c, 0x75bd, 0x00de, + 0x1904, 0x27a8, 0x080c, 0x7858, 0x0428, 0x080c, 0x758c, 0x1590, + 0x6024, 0x9084, 0x1800, 0x1108, 0x0468, 0x080c, 0x7858, 0x080c, + 0x784e, 0x080c, 0x6127, 0x080c, 0x7495, 0x0804, 0x27a5, 0xd1ac, + 0x1508, 0x6024, 0xd0dc, 0x1170, 0xd0e4, 0x1178, 0xd0d4, 0x1190, + 0xd0cc, 0x0130, 0x7098, 0x9086, 0x0029, 0x1110, 0x080c, 0x773b, + 0x0804, 0x27a5, 0x080c, 0x7853, 0x0048, 0x2001, 0x197e, 0x2003, + 0x0002, 0x0020, 0x080c, 0x769e, 0x0804, 0x27a5, 0x080c, 0x77d6, + 0x0804, 0x27a5, 0x6220, 0xd1bc, 0x0138, 0xd2bc, 0x1904, 0x2802, + 0xd2b4, 0x1904, 0x2815, 0x0000, 0xd1ac, 0x0904, 0x26ba, 0x0036, + 0x6328, 0xc3bc, 0x632a, 0x003e, 0x080c, 0x7569, 0x11c0, 0x6027, + 0x0020, 0x0006, 0x0026, 0x0036, 0x080c, 0x7583, 0x1158, 0x080c, + 0x784e, 0x080c, 0x6127, 0x080c, 0x7495, 0x003e, 0x002e, 0x000e, + 0x00ae, 0x0005, 0x003e, 0x002e, 0x000e, 0x080c, 0x7541, 0x0016, + 0x0046, 0x00c6, 0x644c, 0x9486, 0xf0f0, 0x1138, 0x2061, 0x0100, + 0x644a, 0x6043, 0x0090, 0x6043, 0x0010, 0x74da, 0x948c, 0xff00, + 0x7038, 0xd084, 0x0190, 0x080c, 0xd561, 0x1118, 0x9186, 0xf800, + 0x1160, 0x7048, 0xd084, 0x1148, 0xc085, 0x704a, 0x0036, 0x2418, + 0x2011, 0x8016, 0x080c, 0x4be9, 0x003e, 0x080c, 0xd55a, 0x1904, + 0x2697, 0x9196, 0xff00, 0x05a8, 0x7060, 0x9084, 0x00ff, 0x810f, + 0x81ff, 0x0110, 0x9116, 0x0568, 0x7130, 0xd184, 0x1550, 0x080c, + 0x33a0, 0x0128, 0xc18d, 0x7132, 0x080c, 0x6a8a, 0x1510, 0x6240, + 0x9294, 0x0010, 0x0130, 0x6248, 0x9294, 0xff00, 0x9296, 0xff00, + 0x01c0, 0x7030, 0xd08c, 0x0904, 0x2697, 0x7038, 0xd08c, 0x1140, + 0x2001, 0x180c, 0x200c, 0xd1ac, 0x1904, 0x2697, 0xc1ad, 0x2102, + 0x0036, 0x73d8, 0x2011, 0x8013, 0x080c, 0x4be9, 0x003e, 0x0804, + 0x2697, 0x7038, 0xd08c, 0x1140, 0x2001, 0x180c, 0x200c, 0xd1ac, + 0x1904, 0x2697, 0xc1ad, 0x2102, 0x0036, 0x73d8, 0x2011, 0x8013, + 0x080c, 0x4be9, 0x003e, 0x7130, 0xc185, 0x7132, 0x2011, 0x1848, + 0x220c, 0xd1a4, 0x01f0, 0x0016, 0x2009, 0x0001, 0x2011, 0x0100, + 0x080c, 0x891c, 0x2019, 0x000e, 0x00c6, 0x2061, 0x0000, 0x080c, + 0xe915, 0x00ce, 0x9484, 0x00ff, 0x9080, 0x33ac, 0x200d, 0x918c, + 0xff00, 0x810f, 0x2120, 0x9006, 0x2009, 0x000e, 0x080c, 0xe9a5, + 0x001e, 0x0016, 0x2009, 0x0002, 0x2019, 0x0004, 0x080c, 0x3211, + 0x001e, 0x00a8, 0x0156, 0x00b6, 0x20a9, 0x007f, 0x900e, 0x080c, + 0x671d, 0x1140, 0x7030, 0xd084, 0x1118, 0xb800, 0xd0bc, 0x1110, + 0x080c, 0x6141, 0x8108, 0x1f04, 0x2687, 0x00be, 0x015e, 0x00ce, + 0x004e, 0x080c, 0xb072, 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, 0x27a5, 0x0016, 0x6220, 0xd2b4, + 0x0904, 0x2742, 0x080c, 0x878f, 0x080c, 0xa517, 0x6027, 0x0004, + 0x00f6, 0x2019, 0x19f2, 0x2304, 0x907d, 0x0904, 0x2711, 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, 0x2d62, 0x2001, 0x001e, 0x8001, 0x0240, 0x20a9, + 0x0009, 0x080c, 0x2c5b, 0x6904, 0xd1dc, 0x1140, 0x0cb0, 0x2001, + 0x0100, 0x080c, 0x2d52, 0x9006, 0x080c, 0x2d52, 0x080c, 0x97e1, + 0x080c, 0x98ed, 0x7814, 0x2048, 0xa867, 0x0103, 0x2f60, 0x080c, + 0xb101, 0x009e, 0x00ee, 0x00ce, 0x00de, 0x00fe, 0x001e, 0x00ae, + 0x0005, 0x00fe, 0x00d6, 0x2069, 0x0140, 0x6804, 0x9084, 0x4000, + 0x0110, 0x080c, 0x2d62, 0x00de, 0x00c6, 0x2061, 0x19e9, 0x6028, + 0x080c, 0xd561, 0x0120, 0x909a, 0x0003, 0x1258, 0x0018, 0x909a, + 0x00c8, 0x1238, 0x8000, 0x602a, 0x00ce, 0x080c, 0xa4f3, 0x0804, + 0x27a4, 0x2061, 0x0100, 0x62c0, 0x080c, 0xaef8, 0x2019, 0x19f2, + 0x2304, 0x9065, 0x0120, 0x2009, 0x0027, 0x080c, 0xb180, 0x00ce, + 0x0804, 0x27a4, 0xd2bc, 0x0904, 0x278b, 0x080c, 0x879c, 0x6014, + 0x9084, 0x1984, 0x9085, 0x0010, 0x6016, 0x6027, 0x0004, 0x00d6, + 0x2069, 0x0140, 0x6804, 0x9084, 0x4000, 0x0110, 0x080c, 0x2d62, + 0x00de, 0x00c6, 0x2061, 0x19e9, 0x6044, 0x080c, 0xd561, 0x0120, + 0x909a, 0x0003, 0x1658, 0x0018, 0x909a, 0x00c8, 0x1638, 0x8000, + 0x6046, 0x603c, 0x00ce, 0x9005, 0x05b8, 0x2009, 0x07d0, 0x080c, + 0x8794, 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, 0xa877, 0x003e, 0x2019, 0x19f8, 0x2304, 0x9065, + 0x0150, 0x2009, 0x004f, 0x6020, 0x9086, 0x0009, 0x1110, 0x2009, + 0x004f, 0x080c, 0xb180, 0x00ce, 0x001e, 0xd19c, 0x0904, 0x27fd, + 0x7038, 0xd0ac, 0x1538, 0x0016, 0x0156, 0x6027, 0x0008, 0x080c, + 0x2d8c, 0x20a9, 0x0028, 0xa001, 0x1f04, 0x27b3, 0x6150, 0x9185, + 0x1400, 0x6052, 0x20a9, 0x0366, 0x1d04, 0x27bc, 0x080c, 0x87c3, + 0x6020, 0xd09c, 0x1130, 0x015e, 0x6152, 0x001e, 0x6027, 0x0008, + 0x04a0, 0x080c, 0x2c42, 0x1f04, 0x27bc, 0x015e, 0x6152, 0x001e, + 0x6027, 0x0008, 0x0016, 0x6028, 0xc09c, 0x602a, 0x080c, 0xb072, + 0x60e3, 0x0000, 0x080c, 0xedfa, 0x080c, 0xee15, 0x080c, 0x57d7, + 0xd0fc, 0x1138, 0x080c, 0xd55a, 0x1120, 0x9085, 0x0001, 0x080c, + 0x75ad, 0x9006, 0x080c, 0x2d52, 0x2009, 0x0002, 0x080c, 0x2c80, + 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, 0x25bc, 0x0016, 0x2009, 0x280e, 0x00d0, 0x2001, 0x188b, + 0x200c, 0xc184, 0x2102, 0x001e, 0x0c40, 0x0016, 0x2001, 0x188b, + 0x200c, 0xd194, 0x001e, 0x0904, 0x25bc, 0x0016, 0x2009, 0x2821, + 0x0038, 0x2001, 0x188b, 0x200c, 0xc194, 0x2102, 0x001e, 0x08a8, + 0x6028, 0xc0bc, 0x602a, 0x2001, 0x0156, 0x2003, 0xbc91, 0x8000, + 0x2003, 0xffff, 0x6043, 0x0001, 0x080c, 0x2c7a, 0x6027, 0x0080, + 0x6017, 0x0000, 0x6043, 0x0000, 0x0817, 0x0006, 0x0016, 0x0026, + 0x0036, 0x00e6, 0x00f6, 0x0126, 0x2091, 0x8000, 0x2071, 0x1800, + 0x71d0, 0x70d2, 0x9116, 0x0904, 0x288c, 0x81ff, 0x01a0, 0x2009, + 0x0000, 0x080c, 0x2c80, 0x2011, 0x8011, 0x2019, 0x010e, 0x231c, + 0x939e, 0x0007, 0x1118, 0x2019, 0x0001, 0x0010, 0x2019, 0x0000, + 0x080c, 0x4be9, 0x0448, 0x2001, 0x19aa, 0x200c, 0x81ff, 0x1140, + 0x2001, 0x0109, 0x2004, 0xd0b4, 0x0118, 0x2019, 0x0003, 0x0008, + 0x2118, 0x2011, 0x8012, 0x080c, 0x4be9, 0x080c, 0x0ea3, 0x080c, + 0x57d7, 0xd0fc, 0x1188, 0x080c, 0xd55a, 0x1170, 0x00c6, 0x080c, + 0x2928, 0x080c, 0xa7de, 0x2061, 0x0100, 0x2019, 0x0028, 0x2009, + 0x0002, 0x080c, 0x3211, 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, 0x8271, 0x0048, 0x9584, 0x00ff, 0x9080, + 0x33ac, 0x200d, 0x918c, 0xff00, 0x810f, 0x9006, 0x0005, 0x9080, + 0x33ac, 0x200d, 0x918c, 0x00ff, 0x0005, 0x00d6, 0x2069, 0x0140, + 0x2001, 0x1818, 0x2003, 0x00ef, 0x20a9, 0x0010, 0x9006, 0x6852, + 0x6856, 0x1f04, 0x28d8, 0x00de, 0x0005, 0x0006, 0x00d6, 0x0026, + 0x2069, 0x0140, 0x2001, 0x1818, 0x2102, 0x8114, 0x8214, 0x8214, + 0x8214, 0x20a9, 0x0010, 0x6853, 0x0000, 0x9006, 0x82ff, 0x1128, + 0x9184, 0x000f, 0x9080, 0xf5f7, 0x2005, 0x6856, 0x8211, 0x1f04, + 0x28ed, 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, 0x291d, + 0x680f, 0x0000, 0x000e, 0x001e, 0x002e, 0x00de, 0x015e, 0x0005, + 0x080c, 0x57d3, 0xd0c4, 0x0150, 0xd0a4, 0x0140, 0x9006, 0x0046, + 0x2020, 0x2009, 0x002e, 0x080c, 0xe9a5, 0x004e, 0x0005, 0x00f6, + 0x0016, 0x0026, 0x2079, 0x0140, 0x78c4, 0xd0dc, 0x0904, 0x2994, + 0x080c, 0x2bdf, 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, 0x91b1, 0x928c, 0xff00, 0x0110, + 0x2011, 0x00ff, 0x2200, 0x8007, 0x9085, 0x004c, 0x78c2, 0x2009, + 0x0138, 0x220a, 0x080c, 0x7569, 0x1118, 0x2009, 0x196e, 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, 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, 0x1991, 0x2004, + 0x908a, 0x0007, 0x1a0c, 0x0dc5, 0x0033, 0x00ee, 0x002e, 0x001e, + 0x000e, 0x015e, 0x0005, 0x29f2, 0x2a10, 0x2a34, 0x2a36, 0x2a5f, + 0x2a61, 0x2a63, 0x2001, 0x0001, 0x080c, 0x283d, 0x080c, 0x2c3d, + 0x2001, 0x1993, 0x2003, 0x0000, 0x7828, 0x9084, 0xe1d7, 0x782a, + 0x9006, 0x20a9, 0x0009, 0x080c, 0x2bfb, 0x2001, 0x1991, 0x2003, + 0x0006, 0x2009, 0x001e, 0x2011, 0x2a64, 0x080c, 0x87a1, 0x0005, + 0x2009, 0x1996, 0x200b, 0x0000, 0x2001, 0x199b, 0x2003, 0x0036, + 0x2001, 0x199a, 0x2003, 0x002a, 0x2001, 0x1993, 0x2003, 0x0001, + 0x9006, 0x080c, 0x2bad, 0x2001, 0xffff, 0x20a9, 0x0009, 0x080c, + 0x2bfb, 0x2001, 0x1991, 0x2003, 0x0006, 0x2009, 0x001e, 0x2011, + 0x2a64, 0x080c, 0x87a1, 0x0005, 0x080c, 0x0dc5, 0x2001, 0x199b, + 0x2003, 0x0036, 0x2001, 0x1993, 0x2003, 0x0003, 0x7a38, 0x9294, + 0x0005, 0x9296, 0x0004, 0x0110, 0x9006, 0x0010, 0x2001, 0x0001, + 0x080c, 0x2bad, 0x2001, 0x1997, 0x2003, 0x0000, 0x2001, 0xffff, + 0x20a9, 0x0009, 0x080c, 0x2bfb, 0x2001, 0x1991, 0x2003, 0x0006, + 0x2009, 0x001e, 0x2011, 0x2a64, 0x080c, 0x87a1, 0x0005, 0x080c, + 0x0dc5, 0x080c, 0x0dc5, 0x0005, 0x0006, 0x0016, 0x0026, 0x00e6, + 0x00f6, 0x0156, 0x0126, 0x2091, 0x8000, 0x2079, 0x0100, 0x2001, + 0x1993, 0x2004, 0x908a, 0x0007, 0x1a0c, 0x0dc5, 0x0043, 0x012e, + 0x015e, 0x00fe, 0x00ee, 0x002e, 0x001e, 0x000e, 0x0005, 0x2a86, + 0x2aa2, 0x2ade, 0x2b0a, 0x2b2a, 0x2b36, 0x2b38, 0x080c, 0x2bef, + 0x1190, 0x2009, 0x1999, 0x2104, 0x7a38, 0x9294, 0x0005, 0x9296, + 0x0004, 0x0110, 0xc08d, 0x0008, 0xc085, 0x200a, 0x2001, 0x1991, + 0x2003, 0x0001, 0x0030, 0x080c, 0x2b5c, 0x2001, 0xffff, 0x080c, + 0x2a01, 0x0005, 0x080c, 0x2b3a, 0x05c0, 0x2009, 0x199a, 0x2104, + 0x8001, 0x200a, 0x080c, 0x2bef, 0x1158, 0x7a38, 0x9294, 0x0005, + 0x9296, 0x0005, 0x0518, 0x2009, 0x1999, 0x2104, 0xc085, 0x200a, + 0x2009, 0x1996, 0x2104, 0x8000, 0x200a, 0x9086, 0x0005, 0x0118, + 0x080c, 0x2b42, 0x00c0, 0x200b, 0x0000, 0x7a38, 0x9294, 0x0006, + 0x9296, 0x0004, 0x0110, 0x9006, 0x0010, 0x2001, 0x0001, 0x080c, + 0x2bca, 0x2001, 0x1993, 0x2003, 0x0002, 0x0028, 0x2001, 0x1991, + 0x2003, 0x0003, 0x0010, 0x080c, 0x2a23, 0x0005, 0x080c, 0x2b3a, + 0x0540, 0x2009, 0x199a, 0x2104, 0x8001, 0x200a, 0x080c, 0x2bef, + 0x1148, 0x2001, 0x1991, 0x2003, 0x0003, 0x2001, 0x1992, 0x2003, + 0x0000, 0x00b8, 0x2009, 0x199a, 0x2104, 0x9005, 0x1118, 0x080c, + 0x2b7f, 0x0010, 0x080c, 0x2b4f, 0x080c, 0x2b42, 0x2009, 0x1996, + 0x200b, 0x0000, 0x2001, 0x1993, 0x2003, 0x0001, 0x080c, 0x2a23, + 0x0000, 0x0005, 0x0479, 0x01e8, 0x080c, 0x2bef, 0x1198, 0x2009, + 0x1997, 0x2104, 0x8000, 0x200a, 0x9086, 0x0007, 0x0108, 0x0078, + 0x2001, 0x199c, 0x2003, 0x000a, 0x2009, 0x1999, 0x2104, 0xc0fd, + 0x200a, 0x0038, 0x00f9, 0x2001, 0x1993, 0x2003, 0x0004, 0x080c, + 0x2a4e, 0x0005, 0x0079, 0x0148, 0x080c, 0x2bef, 0x1118, 0x080c, + 0x2a3a, 0x0018, 0x0079, 0x080c, 0x2a4e, 0x0005, 0x080c, 0x0dc5, + 0x080c, 0x0dc5, 0x2009, 0x199b, 0x2104, 0x8001, 0x200a, 0x090c, + 0x2b9b, 0x0005, 0x7a38, 0x9294, 0x0005, 0x9296, 0x0005, 0x0110, + 0x9006, 0x0010, 0x2001, 0x0001, 0x080c, 0x2bca, 0x0005, 0x7a38, + 0x9294, 0x0006, 0x9296, 0x0006, 0x0110, 0x9006, 0x0010, 0x2001, + 0x0001, 0x080c, 0x2bad, 0x0005, 0x2009, 0x1996, 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, 0x2bca, 0x0005, 0x0086, + 0x2001, 0x1999, 0x2004, 0x9084, 0x7fff, 0x090c, 0x0dc5, 0x2009, + 0x1998, 0x2144, 0x8846, 0x280a, 0x9844, 0x0dd8, 0xd08c, 0x1120, + 0xd084, 0x1120, 0x080c, 0x0dc5, 0x9006, 0x0010, 0x2001, 0x0001, + 0x00a1, 0x008e, 0x0005, 0x0006, 0x0156, 0x2001, 0x1991, 0x20a9, + 0x0009, 0x2003, 0x0000, 0x8000, 0x1f04, 0x2ba1, 0x2001, 0x1998, + 0x2003, 0x8000, 0x015e, 0x000e, 0x0005, 0x00f6, 0x2079, 0x0100, + 0x9085, 0x0000, 0x0158, 0x7838, 0x9084, 0xfff9, 0x9085, 0x0004, + 0x783a, 0x2009, 0x199e, 0x210c, 0x795a, 0x0050, 0x7838, 0x9084, + 0xfffb, 0x9085, 0x0006, 0x783a, 0x2009, 0x199f, 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, 0x2c7a, 0xd09c, 0x1110, 0x1f04, + 0x2bf2, 0x015e, 0x0005, 0x0126, 0x0016, 0x0006, 0x2091, 0x8000, + 0x7850, 0x9085, 0x0040, 0x7852, 0x7850, 0x9084, 0xfbcf, 0x7852, + 0x080c, 0x2c7a, 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, 0x2c28, 0x080c, 0x87c3, 0x1f04, 0x2c28, 0x7850, 0x9085, + 0x0400, 0x9084, 0xdfbf, 0x7852, 0x080c, 0x2c7a, 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, + 0x2c4c, 0x0028, 0x7854, 0xd08c, 0x1110, 0x1f04, 0x2c52, 0x00fe, + 0x015e, 0x000e, 0x0005, 0x1d04, 0x2c5b, 0x080c, 0x87c3, 0x1f04, + 0x2c5b, 0x0005, 0x0006, 0x2001, 0x199d, 0x2004, 0x9086, 0x0000, + 0x000e, 0x0005, 0x0006, 0x2001, 0x199d, 0x2004, 0x9086, 0x0001, + 0x000e, 0x0005, 0x0006, 0x2001, 0x199d, 0x2004, 0x9086, 0x0002, + 0x000e, 0x0005, 0xa001, 0xa001, 0xa001, 0xa001, 0xa001, 0x0005, + 0x0006, 0x2001, 0x19aa, 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, 0x2cf3, 0x0048, 0x0016, 0x2009, + 0x1a88, 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, + 0x1a89, 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, 0x1982, + 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, 0x7583, 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, 0x7583, 0x0110, 0xc0bc, 0x0008, 0xc0bd, + 0x200a, 0x001e, 0x000e, 0x0005, 0x0006, 0x0156, 0x6050, 0x9085, + 0x0040, 0x6052, 0x6050, 0x9084, 0xfbcf, 0x6052, 0x080c, 0x2c7a, + 0x9085, 0x2000, 0x6052, 0x20a9, 0x0012, 0x1d04, 0x2d9d, 0x080c, + 0x87c3, 0x1f04, 0x2d9d, 0x6050, 0x9085, 0x0400, 0x9084, 0xdfbf, + 0x6052, 0x015e, 0x000e, 0x0005, 0x3018, 0x3018, 0x2e3c, 0x2e3c, + 0x2e48, 0x2e48, 0x2e54, 0x2e54, 0x2e62, 0x2e62, 0x2e6e, 0x2e6e, + 0x2e7c, 0x2e7c, 0x2e8a, 0x2e8a, 0x2e9c, 0x2e9c, 0x2ea8, 0x2ea8, + 0x2eb6, 0x2eb6, 0x2ed4, 0x2ed4, 0x2ef4, 0x2ef4, 0x2ec4, 0x2ec4, + 0x2ee4, 0x2ee4, 0x2f02, 0x2f02, 0x2e9a, 0x2e9a, 0x2e9a, 0x2e9a, + 0x2e9a, 0x2e9a, 0x2e9a, 0x2e9a, 0x2e9a, 0x2e9a, 0x2e9a, 0x2e9a, + 0x2e9a, 0x2e9a, 0x2e9a, 0x2e9a, 0x2e9a, 0x2e9a, 0x2e9a, 0x2e9a, + 0x2e9a, 0x2e9a, 0x2e9a, 0x2e9a, 0x2e9a, 0x2e9a, 0x2e9a, 0x2e9a, + 0x2e9a, 0x2e9a, 0x2e9a, 0x2e9a, 0x2f14, 0x2f14, 0x2f20, 0x2f20, + 0x2f2e, 0x2f2e, 0x2f3c, 0x2f3c, 0x2f4c, 0x2f4c, 0x2f5a, 0x2f5a, + 0x2f6a, 0x2f6a, 0x2f7a, 0x2f7a, 0x2f8c, 0x2f8c, 0x2f9a, 0x2f9a, + 0x2faa, 0x2faa, 0x2fcc, 0x2fcc, 0x2fee, 0x2fee, 0x2fba, 0x2fba, + 0x2fdd, 0x2fdd, 0x2ffd, 0x2ffd, 0x2e9a, 0x2e9a, 0x2e9a, 0x2e9a, + 0x2e9a, 0x2e9a, 0x2e9a, 0x2e9a, 0x2e9a, 0x2e9a, 0x2e9a, 0x2e9a, + 0x2e9a, 0x2e9a, 0x2e9a, 0x2e9a, 0x2e9a, 0x2e9a, 0x2e9a, 0x2e9a, + 0x2e9a, 0x2e9a, 0x2e9a, 0x2e9a, 0x2e9a, 0x2e9a, 0x2e9a, 0x2e9a, + 0x2e9a, 0x2e9a, 0x2e9a, 0x2e9a, 0x2e9a, 0x2e9a, 0x2e9a, 0x2e9a, + 0x2e9a, 0x2e9a, 0x2e9a, 0x2e9a, 0x2e9a, 0x2e9a, 0x2e9a, 0x2e9a, + 0x2e9a, 0x2e9a, 0x2e9a, 0x2e9a, 0x0106, 0x0006, 0x0126, 0x01c6, + 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x24e1, 0x0804, 0x3010, + 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, + 0x080c, 0x22f5, 0x0804, 0x3010, 0x0106, 0x0006, 0x0126, 0x01c6, + 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x22f5, 0x080c, 0x24e1, + 0x0804, 0x3010, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, + 0x0146, 0x0156, 0x080c, 0x2330, 0x0804, 0x3010, 0x0106, 0x0006, + 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x24e1, + 0x080c, 0x2330, 0x0804, 0x3010, 0x0106, 0x0006, 0x0126, 0x01c6, + 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x22f5, 0x080c, 0x2330, + 0x0804, 0x3010, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, + 0x0146, 0x0156, 0x080c, 0x22f5, 0x080c, 0x24e1, 0x080c, 0x2330, + 0x0804, 0x3010, 0xa001, 0x0cf0, 0x0106, 0x0006, 0x0126, 0x01c6, + 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x1394, 0x0804, 0x3010, + 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, + 0x080c, 0x24e1, 0x080c, 0x1394, 0x0804, 0x3010, 0x0106, 0x0006, + 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x22f5, + 0x080c, 0x1394, 0x0804, 0x3010, 0x0106, 0x0006, 0x0126, 0x01c6, + 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x24e1, 0x080c, 0x1394, + 0x080c, 0x2330, 0x0804, 0x3010, 0x0106, 0x0006, 0x0126, 0x01c6, + 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x22f5, 0x080c, 0x24e1, + 0x080c, 0x1394, 0x0804, 0x3010, 0x0106, 0x0006, 0x0126, 0x01c6, + 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x22f5, 0x080c, 0x1394, + 0x080c, 0x2330, 0x0804, 0x3010, 0x0106, 0x0006, 0x0126, 0x01c6, + 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x1394, 0x080c, 0x2330, + 0x0804, 0x3010, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, + 0x0146, 0x0156, 0x080c, 0x22f5, 0x080c, 0x24e1, 0x080c, 0x1394, + 0x080c, 0x2330, 0x0804, 0x3010, 0x0106, 0x0006, 0x0126, 0x01c6, + 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2997, 0x0804, 0x3010, + 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, + 0x080c, 0x2997, 0x080c, 0x24e1, 0x0804, 0x3010, 0x0106, 0x0006, + 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2997, + 0x080c, 0x22f5, 0x0804, 0x3010, 0x0106, 0x0006, 0x0126, 0x01c6, + 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2997, 0x080c, 0x22f5, + 0x080c, 0x24e1, 0x0804, 0x3010, 0x0106, 0x0006, 0x0126, 0x01c6, + 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2997, 0x080c, 0x2330, + 0x0804, 0x3010, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, + 0x0146, 0x0156, 0x080c, 0x2997, 0x080c, 0x24e1, 0x080c, 0x2330, + 0x0804, 0x3010, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, + 0x0146, 0x0156, 0x080c, 0x2997, 0x080c, 0x22f5, 0x080c, 0x2330, + 0x0804, 0x3010, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, + 0x0146, 0x0156, 0x080c, 0x2997, 0x080c, 0x22f5, 0x080c, 0x24e1, + 0x080c, 0x2330, 0x0804, 0x3010, 0x0106, 0x0006, 0x0126, 0x01c6, + 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2997, 0x080c, 0x1394, + 0x0804, 0x3010, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, + 0x0146, 0x0156, 0x080c, 0x2997, 0x080c, 0x24e1, 0x080c, 0x1394, + 0x0804, 0x3010, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, + 0x0146, 0x0156, 0x080c, 0x2997, 0x080c, 0x22f5, 0x080c, 0x1394, + 0x0804, 0x3010, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, + 0x0146, 0x0156, 0x080c, 0x2997, 0x080c, 0x24e1, 0x080c, 0x1394, + 0x080c, 0x2330, 0x0804, 0x3010, 0x0106, 0x0006, 0x0126, 0x01c6, + 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2997, 0x080c, 0x22f5, + 0x080c, 0x24e1, 0x080c, 0x1394, 0x0498, 0x0106, 0x0006, 0x0126, + 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2997, 0x080c, + 0x22f5, 0x080c, 0x1394, 0x080c, 0x2330, 0x0410, 0x0106, 0x0006, + 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2997, + 0x080c, 0x1394, 0x080c, 0x2330, 0x0098, 0x0106, 0x0006, 0x0126, + 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2997, 0x080c, + 0x22f5, 0x080c, 0x24e1, 0x080c, 0x1394, 0x080c, 0x2330, 0x0000, + 0x015e, 0x014e, 0x013e, 0x01de, 0x01ce, 0x012e, 0x000e, 0x010e, + 0x000d, 0x00b6, 0x00c6, 0x0026, 0x0046, 0x9026, 0x080c, 0x6a50, + 0x1904, 0x312d, 0x72dc, 0x2001, 0x197d, 0x2004, 0x9005, 0x1110, + 0xd29c, 0x0148, 0xd284, 0x1138, 0xd2bc, 0x1904, 0x312d, 0x080c, + 0x3132, 0x0804, 0x312d, 0xd2cc, 0x1904, 0x312d, 0x080c, 0x7569, + 0x1120, 0x70af, 0xffff, 0x0804, 0x312d, 0xd294, 0x0120, 0x70af, + 0xffff, 0x0804, 0x312d, 0x080c, 0x339b, 0x0160, 0x080c, 0xd561, + 0x0128, 0x2001, 0x1818, 0x203c, 0x0804, 0x30b6, 0x70af, 0xffff, + 0x0804, 0x312d, 0x2001, 0x1818, 0x203c, 0x7294, 0xd284, 0x0904, + 0x30b6, 0xd28c, 0x1904, 0x30b6, 0x0036, 0x73ac, 0x938e, 0xffff, + 0x1110, 0x2019, 0x0001, 0x8314, 0x92e0, 0x1c80, 0x2c04, 0x938c, + 0x0001, 0x0120, 0x9084, 0xff00, 0x8007, 0x0010, 0x9084, 0x00ff, + 0x970e, 0x05d0, 0x908e, 0x0000, 0x05b8, 0x908e, 0x00ff, 0x1150, + 0x7230, 0xd284, 0x15b0, 0x7294, 0xc28d, 0x7296, 0x70af, 0xffff, + 0x003e, 0x04a0, 0x900e, 0x080c, 0x2894, 0x080c, 0x66b2, 0x1538, + 0x9006, 0xb8bb, 0x0520, 0xb8ac, 0x9005, 0x0148, 0x00c6, 0x2060, + 0x080c, 0x8bc3, 0x00ce, 0x090c, 0x8f64, 0xb8af, 0x0000, 0x080c, + 0x6a92, 0x1168, 0x7030, 0xd08c, 0x0130, 0xb800, 0xd0bc, 0x0138, + 0x080c, 0x693d, 0x0120, 0x080c, 0x314b, 0x0148, 0x0028, 0x080c, + 0x328b, 0x080c, 0x3177, 0x0118, 0x8318, 0x0804, 0x3063, 0x73ae, + 0x0010, 0x70af, 0xffff, 0x003e, 0x0804, 0x312d, 0x9780, 0x33ac, + 0x203d, 0x97bc, 0xff00, 0x873f, 0x2041, 0x007e, 0x70ac, 0x9096, + 0xffff, 0x1118, 0x900e, 0x28a8, 0x0050, 0x9812, 0x0220, 0x2008, + 0x9802, 0x20a8, 0x0020, 0x70af, 0xffff, 0x0804, 0x312d, 0x2700, + 0x0156, 0x0016, 0x9106, 0x0904, 0x3122, 0xc484, 0x080c, 0x671d, + 0x0168, 0x080c, 0xd561, 0x1904, 0x3122, 0x080c, 0x339b, 0x1904, + 0x3122, 0x080c, 0x66b2, 0x1904, 0x312a, 0x0008, 0xc485, 0xb8bb, + 0x0520, 0xb8ac, 0x9005, 0x0148, 0x00c6, 0x2060, 0x080c, 0x8bc3, + 0x00ce, 0x090c, 0x8f64, 0xb8af, 0x0000, 0x080c, 0x6a92, 0x1130, + 0x7030, 0xd08c, 0x01f8, 0xb800, 0xd0bc, 0x11e0, 0x7294, 0xd28c, + 0x0180, 0x080c, 0x6a92, 0x9082, 0x0006, 0x02e0, 0xd484, 0x1118, + 0x080c, 0x66d7, 0x0028, 0x080c, 0x3317, 0x01a0, 0x080c, 0x3342, + 0x0088, 0x080c, 0x328b, 0x080c, 0xd561, 0x1160, 0x080c, 0x3177, + 0x0188, 0x0040, 0x080c, 0xd561, 0x1118, 0x080c, 0x3317, 0x0110, + 0x0451, 0x0140, 0x001e, 0x8108, 0x015e, 0x1f04, 0x30cf, 0x70af, + 0xffff, 0x0018, 0x001e, 0x015e, 0x71ae, 0x004e, 0x002e, 0x00ce, + 0x00be, 0x0005, 0x00c6, 0x0016, 0x70af, 0x0001, 0x2009, 0x007e, + 0x080c, 0x66b2, 0x1168, 0xb813, 0x00ff, 0xb817, 0xfffe, 0x080c, + 0x328b, 0x04a9, 0x0128, 0x70dc, 0xc0bd, 0x70de, 0x080c, 0xd2a9, + 0x001e, 0x00ce, 0x0005, 0x0016, 0x0076, 0x00d6, 0x00c6, 0x2001, + 0x184c, 0x2004, 0x9084, 0x00ff, 0xb842, 0x080c, 0xb153, 0x01d0, + 0x2b00, 0x6012, 0x080c, 0xd2d2, 0x6023, 0x0001, 0x9006, 0x080c, + 0x664f, 0x2001, 0x0000, 0x080c, 0x6663, 0x0126, 0x2091, 0x8000, + 0x70a8, 0x8000, 0x70aa, 0x012e, 0x2009, 0x0004, 0x080c, 0xb180, + 0x9085, 0x0001, 0x00ce, 0x00de, 0x007e, 0x001e, 0x0005, 0x0016, + 0x0076, 0x00d6, 0x00c6, 0x2001, 0x184c, 0x2004, 0x9084, 0x00ff, + 0xb842, 0x080c, 0xb153, 0x0548, 0x2b00, 0x6012, 0xb800, 0xc0c4, + 0xb802, 0xb8a0, 0x9086, 0x007e, 0x0140, 0xb804, 0x9084, 0x00ff, + 0x9086, 0x0006, 0x1110, 0x080c, 0x3246, 0x080c, 0xd2d2, 0x6023, + 0x0001, 0x9006, 0x080c, 0x664f, 0x2001, 0x0002, 0x080c, 0x6663, + 0x0126, 0x2091, 0x8000, 0x70a8, 0x8000, 0x70aa, 0x012e, 0x2009, + 0x0002, 0x080c, 0xb180, 0x9085, 0x0001, 0x00ce, 0x00de, 0x007e, + 0x001e, 0x0005, 0x00b6, 0x00c6, 0x0026, 0x2009, 0x0080, 0x080c, + 0x66b2, 0x1140, 0xb813, 0x00ff, 0xb817, 0xfffc, 0x0039, 0x0110, + 0x70e3, 0xffff, 0x002e, 0x00ce, 0x00be, 0x0005, 0x0016, 0x0076, + 0x00d6, 0x00c6, 0x080c, 0xb0ab, 0x01d0, 0x2b00, 0x6012, 0x080c, + 0xd2d2, 0x6023, 0x0001, 0x9006, 0x080c, 0x664f, 0x2001, 0x0002, + 0x080c, 0x6663, 0x0126, 0x2091, 0x8000, 0x70e4, 0x8000, 0x70e6, + 0x012e, 0x2009, 0x0002, 0x080c, 0xb180, 0x9085, 0x0001, 0x00ce, + 0x00de, 0x007e, 0x001e, 0x0005, 0x00c6, 0x00d6, 0x0126, 0x2091, + 0x8000, 0x2009, 0x007f, 0x080c, 0x66b2, 0x11b8, 0xb813, 0x00ff, + 0xb817, 0xfffd, 0xb8cf, 0x0004, 0x080c, 0xb0ab, 0x0170, 0x2b00, + 0x6012, 0x6316, 0x6023, 0x0001, 0x620a, 0x080c, 0xd2d2, 0x2009, + 0x0022, 0x080c, 0xb180, 0x9085, 0x0001, 0x012e, 0x00de, 0x00ce, + 0x0005, 0x00e6, 0x00c6, 0x0066, 0x0036, 0x0026, 0x00b6, 0x21f0, + 0x080c, 0x94eb, 0x080c, 0x946b, 0x080c, 0xaf3f, 0x080c, 0xc051, + 0x3e08, 0x2130, 0x81ff, 0x0120, 0x20a9, 0x007e, 0x900e, 0x0018, + 0x20a9, 0x007f, 0x900e, 0x0016, 0x080c, 0x671d, 0x1140, 0x9686, + 0x0002, 0x1118, 0xb800, 0xd0bc, 0x1110, 0x080c, 0x6141, 0x001e, + 0x8108, 0x1f04, 0x322b, 0x9686, 0x0001, 0x190c, 0x336f, 0x00be, + 0x002e, 0x003e, 0x006e, 0x00ce, 0x00ee, 0x0005, 0x00e6, 0x00c6, + 0x0046, 0x0036, 0x0026, 0x0016, 0x00b6, 0x6210, 0x2258, 0xbaa0, + 0x0026, 0x2019, 0x0029, 0x080c, 0x94e0, 0x0076, 0x2039, 0x0000, + 0x080c, 0x93b3, 0x2c08, 0x080c, 0xe690, 0x007e, 0x001e, 0xba10, + 0xbb14, 0xbcc0, 0x080c, 0x6141, 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, 0x57d3, + 0xd0c4, 0x0140, 0xd0a4, 0x0130, 0x9006, 0x2020, 0x2009, 0x002d, + 0x080c, 0xe9a5, 0x20a9, 0x0800, 0x9016, 0x0026, 0x928e, 0x007e, + 0x0904, 0x32f6, 0x928e, 0x007f, 0x0904, 0x32f6, 0x928e, 0x0080, + 0x05e8, 0x9288, 0x1000, 0x210c, 0x81ff, 0x05c0, 0x8fff, 0x1148, + 0x2001, 0x198f, 0x0006, 0x2003, 0x0001, 0x04f1, 0x000e, 0x2003, + 0x0000, 0x00b6, 0x00c6, 0x2158, 0x2001, 0x0001, 0x080c, 0x6a5c, + 0x00ce, 0x00be, 0x2019, 0x0029, 0x080c, 0x94e0, 0x0076, 0x2039, + 0x0000, 0x080c, 0x93b3, 0x00b6, 0x00c6, 0x0026, 0x2158, 0xba04, + 0x9294, 0x00ff, 0x9286, 0x0006, 0x1118, 0xb807, 0x0404, 0x0028, + 0x2001, 0x0004, 0x8007, 0x9215, 0xba06, 0x002e, 0x00ce, 0x00be, + 0x0016, 0x2c08, 0x080c, 0xe690, 0x001e, 0x007e, 0x002e, 0x8210, + 0x1f04, 0x32ad, 0x015e, 0x001e, 0x002e, 0x003e, 0x004e, 0x00be, + 0x00ce, 0x00ee, 0x00fe, 0x0005, 0x0046, 0x0026, 0x0016, 0x080c, + 0x57d3, 0xd0c4, 0x0140, 0xd0a4, 0x0130, 0x9006, 0x2220, 0x2009, + 0x0029, 0x080c, 0xe9a5, 0x001e, 0x002e, 0x004e, 0x0005, 0x0016, + 0x0026, 0x0036, 0x00c6, 0x7294, 0x82ff, 0x01e8, 0x080c, 0x6a8a, + 0x11d0, 0x2100, 0x080c, 0x28c7, 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, 0x1ab8, 0x001e, 0x6112, 0x080c, + 0x3246, 0x001e, 0x080c, 0x66d7, 0x012e, 0x00ce, 0x001e, 0x0005, + 0x0016, 0x0026, 0x2110, 0x080c, 0xaa9a, 0x080c, 0xed0f, 0x002e, + 0x001e, 0x0005, 0x2001, 0x1837, 0x2004, 0xd0cc, 0x0005, 0x00c6, + 0x00b6, 0x080c, 0x7569, 0x1118, 0x20a9, 0x0800, 0x0010, 0x20a9, + 0x0782, 0x080c, 0x7569, 0x1110, 0x900e, 0x0010, 0x2009, 0x007e, + 0x9180, 0x1000, 0x2004, 0x905d, 0x0130, 0x86ff, 0x0110, 0xb800, + 0xd0bc, 0x090c, 0x66d7, 0x8108, 0x1f04, 0x3380, 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, 0x34db, + 0x34dc, 0x34ef, 0x3503, 0x0005, 0x1004, 0x34ec, 0x0e04, 0x34ec, + 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, 0x35d7, 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, 0x35d4, 0x61d0, 0x0804, + 0x3569, 0x35ab, 0x35e3, 0x35d4, 0x35ef, 0x35f9, 0x35ff, 0x3603, + 0x3613, 0x3617, 0x362d, 0x3633, 0x3639, 0x3644, 0x364f, 0x365e, + 0x366d, 0x367b, 0x3692, 0x36ad, 0x35d4, 0x3756, 0x3794, 0x383a, + 0x384b, 0x386e, 0x35d4, 0x35d4, 0x35d4, 0x38a6, 0x38c2, 0x38cb, + 0x38fa, 0x3900, 0x35d4, 0x3946, 0x35d4, 0x35d4, 0x35d4, 0x35d4, + 0x35d4, 0x3951, 0x395a, 0x3962, 0x3964, 0x35d4, 0x35d4, 0x35d4, + 0x35d4, 0x35d4, 0x35d4, 0x3990, 0x35d4, 0x35d4, 0x35d4, 0x35d4, + 0x35d4, 0x39ad, 0x3a22, 0x35d4, 0x35d4, 0x35d4, 0x35d4, 0x35d4, + 0x35d4, 0x0002, 0x3a4c, 0x3a4f, 0x3aae, 0x3ac7, 0x3af7, 0x3d99, + 0x35d4, 0x5396, 0x35d4, 0x35d4, 0x35d4, 0x35d4, 0x35d4, 0x35d4, + 0x35d4, 0x35d4, 0x362d, 0x3633, 0x42ce, 0x57f7, 0x42ec, 0x5425, + 0x5477, 0x5582, 0x35d4, 0x55e4, 0x5620, 0x5651, 0x5759, 0x567e, + 0x56d9, 0x35d4, 0x42f0, 0x44b6, 0x44cc, 0x44f1, 0x4556, 0x45ca, + 0x45ea, 0x4661, 0x46bd, 0x4719, 0x471c, 0x4741, 0x47f8, 0x485e, + 0x4866, 0x499b, 0x4b13, 0x4b47, 0x4dab, 0x35d4, 0x4dc9, 0x4e6f, + 0x4f58, 0x4fb2, 0x35d4, 0x5069, 0x35d4, 0x50d5, 0x50f0, 0x4866, + 0x5336, 0x714c, 0x0000, 0x2021, 0x4000, 0x080c, 0x4bc5, 0x0126, + 0x2091, 0x8000, 0x0e04, 0x35b5, 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, 0x4bd2, 0x2039, + 0x0001, 0x902e, 0x2520, 0x7b88, 0x7a8c, 0x7884, 0x7990, 0x0804, + 0x4bd5, 0x7984, 0x7888, 0x2114, 0x200a, 0x0804, 0x35ab, 0x7984, + 0x2114, 0x0804, 0x35ab, 0x20e1, 0x0000, 0x2099, 0x0021, 0x20e9, + 0x0000, 0x20a1, 0x0021, 0x20a9, 0x001f, 0x4003, 0x7984, 0x7a88, + 0x7b8c, 0x0804, 0x35ab, 0x7884, 0x2060, 0x0804, 0x3660, 0x2009, + 0x0003, 0x2011, 0x0003, 0x2019, 0x0012, 0x789b, 0x0137, 0x7893, + 0xffff, 0x2001, 0x188f, 0x2004, 0x9005, 0x0118, 0x7896, 0x0804, + 0x35ab, 0x7897, 0x0001, 0x0804, 0x35ab, 0x2039, 0x0001, 0x7d98, + 0x7c9c, 0x0804, 0x35e7, 0x2039, 0x0001, 0x7d98, 0x7c9c, 0x0804, + 0x35f3, 0x79a0, 0x9182, 0x0040, 0x0210, 0x0804, 0x35e0, 0x2138, + 0x7d98, 0x7c9c, 0x0804, 0x35e7, 0x79a0, 0x9182, 0x0040, 0x0210, + 0x0804, 0x35e0, 0x2138, 0x7d98, 0x7c9c, 0x0804, 0x35f3, 0x79a0, + 0x9182, 0x0040, 0x0210, 0x0804, 0x35e0, 0x21e8, 0x7984, 0x7888, + 0x20a9, 0x0001, 0x21a0, 0x4004, 0x0804, 0x35ab, 0x2061, 0x0800, + 0xe10c, 0x9006, 0x2c15, 0x9200, 0x8c60, 0x8109, 0x1dd8, 0x2010, + 0x9005, 0x0904, 0x35ab, 0x0804, 0x35da, 0x79a0, 0x9182, 0x0040, + 0x0210, 0x0804, 0x35e0, 0x21e0, 0x20a9, 0x0001, 0x7984, 0x2198, + 0x4012, 0x0804, 0x35ab, 0x2069, 0x1847, 0x7884, 0x7990, 0x911a, + 0x1a04, 0x35e0, 0x8019, 0x0904, 0x35e0, 0x684a, 0x6942, 0x788c, + 0x6852, 0x7888, 0x6856, 0x9006, 0x685a, 0x685e, 0x080c, 0x787f, + 0x0804, 0x35ab, 0x2069, 0x1847, 0x7884, 0x7994, 0x911a, 0x1a04, + 0x35e0, 0x8019, 0x0904, 0x35e0, 0x684e, 0x6946, 0x788c, 0x6862, + 0x7888, 0x6866, 0x9006, 0x686a, 0x686e, 0x0126, 0x2091, 0x8000, + 0x080c, 0x6b2a, 0x012e, 0x0804, 0x35ab, 0x902e, 0x2520, 0x81ff, + 0x0120, 0x2009, 0x0001, 0x0804, 0x35dd, 0x7984, 0x7b88, 0x7a8c, + 0x20a9, 0x0005, 0x20e9, 0x0001, 0x20a1, 0x18a6, 0x4101, 0x080c, + 0x4b89, 0x1120, 0x2009, 0x0002, 0x0804, 0x35dd, 0x2009, 0x0020, + 0xa85c, 0x9080, 0x0019, 0xaf60, 0x080c, 0x4bd2, 0x701f, 0x36d1, + 0x0005, 0xa864, 0x2008, 0x9084, 0x00ff, 0x9096, 0x0011, 0x0168, + 0x9096, 0x0019, 0x0150, 0x9096, 0x0015, 0x0138, 0x9096, 0x0048, + 0x0120, 0x9096, 0x0029, 0x1904, 0x35dd, 0x810f, 0x918c, 0x00ff, + 0x0904, 0x35dd, 0x7112, 0x7010, 0x8001, 0x0560, 0x7012, 0x080c, + 0x4b89, 0x1120, 0x2009, 0x0002, 0x0804, 0x35dd, 0x2009, 0x0020, + 0x7068, 0x2040, 0xa28c, 0xa390, 0xa494, 0xa598, 0x9290, 0x0040, + 0x9399, 0x0000, 0x94a1, 0x0000, 0x95a9, 0x0000, 0xa85c, 0x9080, + 0x0019, 0xaf60, 0x080c, 0x4bd2, 0x701f, 0x370f, 0x0005, 0xa864, + 0x9084, 0x00ff, 0x9096, 0x0002, 0x0120, 0x9096, 0x000a, 0x1904, + 0x35dd, 0x0888, 0x7014, 0x2048, 0xa868, 0xc0fd, 0xa86a, 0xa864, + 0x9084, 0x00ff, 0x9096, 0x0029, 0x1160, 0xc2fd, 0xaa7a, 0x080c, + 0x6298, 0x0150, 0x0126, 0x2091, 0x8000, 0xa87a, 0xa982, 0x012e, + 0x0050, 0x080c, 0x65c8, 0x1128, 0x7007, 0x0003, 0x701f, 0x373b, + 0x0005, 0x080c, 0x703d, 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, 0x4bd5, 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, 0x1a1d, 0x2004, 0x9005, 0x0128, 0x2001, 0x008b, 0x2004, + 0xd0fc, 0x0dd8, 0x2001, 0x008a, 0x2003, 0x0002, 0x2003, 0x1001, + 0x2071, 0x0080, 0x0804, 0x0427, 0x81ff, 0x1904, 0x35dd, 0x7984, + 0x080c, 0x671d, 0x1904, 0x35e0, 0x7e98, 0x9684, 0x3fff, 0x9082, + 0x4000, 0x1a04, 0x35e0, 0x7c88, 0x7d8c, 0x080c, 0x6880, 0x080c, + 0x684f, 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, 0x35dd, 0x0c30, 0x080c, + 0xca71, 0x012e, 0x0904, 0x35dd, 0x0804, 0x35ab, 0x900e, 0x2001, + 0x0005, 0x080c, 0x703d, 0x0126, 0x2091, 0x8000, 0x080c, 0xd152, + 0x080c, 0x6dd1, 0x012e, 0x0804, 0x35ab, 0x00a6, 0x2950, 0xb198, + 0x080c, 0x671d, 0x1904, 0x3827, 0xb6a4, 0x9684, 0x3fff, 0x9082, + 0x4000, 0x16e8, 0xb49c, 0xb5a0, 0x080c, 0x6880, 0x080c, 0x684f, + 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, 0xca71, + 0x012e, 0x2009, 0x0003, 0x0178, 0x00e0, 0x900e, 0x2001, 0x0005, + 0x080c, 0x703d, 0x0126, 0x2091, 0x8000, 0x080c, 0xd152, 0x080c, + 0x6dc4, 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, 0x35dd, 0x080c, 0x4ba0, 0x0904, + 0x35e0, 0x080c, 0x67e4, 0x0904, 0x35dd, 0x080c, 0x6886, 0x0904, + 0x35dd, 0x0804, 0x45e1, 0x81ff, 0x1904, 0x35dd, 0x080c, 0x4bbc, + 0x0904, 0x35e0, 0x080c, 0x6914, 0x0904, 0x35dd, 0x2019, 0x0005, + 0x79a8, 0x080c, 0x68a1, 0x0904, 0x35dd, 0x7888, 0x908a, 0x1000, + 0x1a04, 0x35e0, 0x8003, 0x800b, 0x810b, 0x9108, 0x080c, 0x8717, + 0x79a8, 0xd184, 0x1904, 0x35ab, 0x0804, 0x45e1, 0x0126, 0x2091, + 0x8000, 0x81ff, 0x0118, 0x2009, 0x0001, 0x0450, 0x2029, 0x07ff, + 0x645c, 0x2400, 0x9506, 0x01f8, 0x2508, 0x080c, 0x671d, 0x11d8, + 0x080c, 0x6914, 0x1128, 0x2009, 0x0002, 0x62c0, 0x2518, 0x00c0, + 0x2019, 0x0004, 0x900e, 0x080c, 0x68a1, 0x1118, 0x2009, 0x0006, + 0x0078, 0x7884, 0x908a, 0x1000, 0x1270, 0x8003, 0x800b, 0x810b, + 0x9108, 0x080c, 0x8717, 0x8529, 0x1ae0, 0x012e, 0x0804, 0x35ab, + 0x012e, 0x0804, 0x35dd, 0x012e, 0x0804, 0x35e0, 0x080c, 0x4ba0, + 0x0904, 0x35e0, 0x080c, 0x67e4, 0x0904, 0x35dd, 0xbaa0, 0x2019, + 0x0005, 0x00c6, 0x9066, 0x080c, 0x94e0, 0x0076, 0x903e, 0x080c, + 0x93b3, 0x900e, 0x080c, 0xe690, 0x007e, 0x00ce, 0x080c, 0x6880, + 0x0804, 0x35ab, 0x080c, 0x4ba0, 0x0904, 0x35e0, 0x080c, 0x6880, + 0x2208, 0x0804, 0x35ab, 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, 0x38dc, 0x2300, 0x9218, 0x00ee, + 0x00de, 0x015e, 0x0804, 0x35ab, 0x00f6, 0x0016, 0x907d, 0x0138, + 0x9006, 0x8000, 0x2f0c, 0x81ff, 0x0110, 0x2178, 0x0cd0, 0x001e, + 0x00fe, 0x0005, 0x2069, 0x1910, 0x6910, 0x62bc, 0x0804, 0x35ab, + 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x35dd, 0x0126, 0x2091, + 0x8000, 0x080c, 0x57e7, 0x0128, 0x2009, 0x0007, 0x012e, 0x0804, + 0x35dd, 0x012e, 0x615c, 0x9190, 0x33ac, 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, 0x7569, 0x1118, + 0x2031, 0x0004, 0x0038, 0xd79c, 0x0120, 0x2009, 0x0005, 0x0804, + 0x35dd, 0x9036, 0x7e9a, 0x7f9e, 0x0804, 0x35ab, 0x614c, 0x6250, + 0x2019, 0x1987, 0x231c, 0x2001, 0x1988, 0x2004, 0x789a, 0x0804, + 0x35ab, 0x0126, 0x2091, 0x8000, 0x6138, 0x623c, 0x6340, 0x012e, + 0x0804, 0x35ab, 0x080c, 0x4bbc, 0x0904, 0x35e0, 0xba44, 0xbb38, + 0x0804, 0x35ab, 0x080c, 0x0dc5, 0x080c, 0x4bbc, 0x2110, 0x0904, + 0x35e0, 0xb804, 0x908c, 0x00ff, 0x918e, 0x0006, 0x0140, 0x9084, + 0xff00, 0x9086, 0x0600, 0x2009, 0x0009, 0x1904, 0x35dd, 0x0126, + 0x2091, 0x8000, 0x2019, 0x0005, 0x00c6, 0x9066, 0x080c, 0xaa9a, + 0x080c, 0x94e0, 0x0076, 0x903e, 0x080c, 0x93b3, 0x900e, 0x080c, + 0xe690, 0x007e, 0x00ce, 0xb807, 0x0407, 0x012e, 0x0804, 0x35ab, + 0x614c, 0x6250, 0x7884, 0x604e, 0x7b88, 0x6352, 0x2069, 0x1847, + 0x831f, 0x9305, 0x6816, 0x788c, 0x2069, 0x1987, 0x2d1c, 0x206a, + 0x7e98, 0x9682, 0x0014, 0x1210, 0x2031, 0x07d0, 0x2069, 0x1988, + 0x2d04, 0x266a, 0x789a, 0x0804, 0x35ab, 0x0126, 0x2091, 0x8000, + 0x6138, 0x7884, 0x603a, 0x910e, 0xd1b4, 0x190c, 0x0ebe, 0xd094, + 0x0148, 0x00e6, 0x2071, 0x19fc, 0x79b4, 0x9192, 0x07d0, 0x1208, + 0x713e, 0x00ee, 0xd0c4, 0x01a8, 0x00d6, 0x78a8, 0x2009, 0x199e, + 0x200a, 0x78ac, 0x2011, 0x199f, 0x2012, 0x2069, 0x0100, 0x6838, + 0x9086, 0x0007, 0x1118, 0x2214, 0x6a5a, 0x0010, 0x210c, 0x695a, + 0x00de, 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, 0x42ce, 0x6040, 0xd0cc, 0x0120, + 0x78b0, 0x2011, 0x0114, 0x2012, 0x012e, 0x0804, 0x35ab, 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, + 0x35e0, 0x788c, 0x902d, 0x0904, 0x35e0, 0x900e, 0x080c, 0x671d, + 0x1120, 0xba44, 0xbb38, 0xbc46, 0xbd3a, 0x9186, 0x07ff, 0x0190, + 0x8108, 0x0ca0, 0x080c, 0x4bbc, 0x0904, 0x35e0, 0x7888, 0x900d, + 0x0904, 0x35e0, 0x788c, 0x9005, 0x0904, 0x35e0, 0xba44, 0xb946, + 0xbb38, 0xb83a, 0x0804, 0x35ab, 0x2011, 0xbc09, 0x0010, 0x2011, + 0xbc05, 0x080c, 0x57e7, 0x1904, 0x35dd, 0x00c6, 0x2061, 0x0100, + 0x7984, 0x9186, 0x00ff, 0x1130, 0x2001, 0x1818, 0x2004, 0x9085, + 0xff00, 0x0088, 0x9182, 0x007f, 0x16e0, 0x9188, 0x33ac, 0x210d, + 0x918c, 0x00ff, 0x2001, 0x1818, 0x2004, 0x0026, 0x9116, 0x002e, + 0x0580, 0x810f, 0x9105, 0x0126, 0x2091, 0x8000, 0x0006, 0x080c, + 0xb0ab, 0x000e, 0x0510, 0x602e, 0x620a, 0x7984, 0x00b6, 0x080c, + 0x66b8, 0x2b08, 0x00be, 0x1500, 0x6112, 0x6023, 0x0001, 0x080c, + 0x4b89, 0x01d0, 0x9006, 0xa866, 0x7007, 0x0003, 0xa832, 0xa868, + 0xc0fd, 0xa86a, 0x701f, 0x3aa7, 0x2900, 0x6016, 0x2009, 0x0032, + 0x080c, 0xb180, 0x012e, 0x00ce, 0x0005, 0x012e, 0x00ce, 0x0804, + 0x35dd, 0x00ce, 0x0804, 0x35e0, 0x080c, 0xb101, 0x0cb0, 0xa830, + 0x9086, 0x0100, 0x0904, 0x35dd, 0x0804, 0x35ab, 0x2061, 0x1a75, + 0x0126, 0x2091, 0x8000, 0x6000, 0xd084, 0x0170, 0x6104, 0x6208, + 0x2061, 0x1800, 0x6354, 0x6074, 0x789a, 0x60c0, 0x789e, 0x60bc, + 0x78aa, 0x012e, 0x0804, 0x35ab, 0x900e, 0x2110, 0x0c88, 0x81ff, + 0x1904, 0x35dd, 0x080c, 0x7569, 0x0904, 0x35dd, 0x0126, 0x2091, + 0x8000, 0x6254, 0x6074, 0x9202, 0x0248, 0x9085, 0x0001, 0x080c, + 0x28fd, 0x080c, 0x5a0a, 0x012e, 0x0804, 0x35ab, 0x012e, 0x0804, + 0x35e0, 0x0006, 0x0016, 0x00c6, 0x00e6, 0x2001, 0x19ab, 0x2070, + 0x2061, 0x1847, 0x6008, 0x2072, 0x900e, 0x2011, 0x1400, 0x080c, + 0x91b1, 0x7206, 0x00ee, 0x00ce, 0x001e, 0x000e, 0x0005, 0x0126, + 0x2091, 0x8000, 0x81ff, 0x0128, 0x012e, 0x2021, 0x400b, 0x0804, + 0x35ad, 0x7884, 0xd0fc, 0x0158, 0x2001, 0x002a, 0x2004, 0x9005, + 0x0180, 0x9082, 0x00e1, 0x0298, 0x012e, 0x0804, 0x35e0, 0x2001, + 0x002a, 0x2004, 0x9005, 0x0128, 0x2069, 0x1847, 0x6908, 0x9102, + 0x1230, 0x012e, 0x0804, 0x35e0, 0x012e, 0x0804, 0x35dd, 0x080c, + 0xb06b, 0x0dd0, 0x7884, 0xd0fc, 0x0904, 0x3b76, 0x00c6, 0x080c, + 0x4b89, 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, 0x3cfc, 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, 0x4bd2, + 0x701f, 0x3c39, 0x7023, 0x0001, 0x012e, 0x0005, 0x0046, 0x0086, + 0x0096, 0x00a6, 0x00b6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x080c, + 0x3ae1, 0x2001, 0x19a1, 0x2003, 0x0000, 0x2021, 0x000a, 0x2061, + 0x0100, 0x6104, 0x0016, 0x60bb, 0x0000, 0x60bf, 0x32e1, 0x60bf, + 0x0012, 0x080c, 0x3d6b, 0x080c, 0x3d2a, 0x00f6, 0x00e6, 0x0086, + 0x2940, 0x2071, 0x1a6a, 0x2079, 0x0090, 0x00d6, 0x2069, 0x0000, + 0x6884, 0xd0b4, 0x0140, 0x2001, 0x0035, 0x2004, 0x780e, 0x2001, + 0x0034, 0x2004, 0x780a, 0x00de, 0x2011, 0x0001, 0x080c, 0x4112, + 0x008e, 0x00ee, 0x00fe, 0x080c, 0x4034, 0x080c, 0x3f39, 0x05b8, + 0x2001, 0x020b, 0x2004, 0x9084, 0x0140, 0x1db8, 0x080c, 0x4186, + 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, + 0x3f43, 0x080c, 0x3d25, 0x0058, 0x080c, 0x3d25, 0x080c, 0x40aa, + 0x080c, 0x402a, 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, 0x2432, 0x2001, + 0x0227, 0x200c, 0x2102, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, + 0x00ae, 0x009e, 0x008e, 0x004e, 0x2001, 0x19a1, 0x2004, 0x9005, + 0x1118, 0x012e, 0x0804, 0x35ab, 0x012e, 0x2021, 0x400c, 0x0804, + 0x35ad, 0x0016, 0x0026, 0x0036, 0x0046, 0x0056, 0x0076, 0x0086, + 0x0096, 0x00d6, 0x0156, 0x7014, 0x2048, 0x7020, 0x20a8, 0x8000, + 0x7022, 0xa804, 0x9005, 0x0904, 0x3c95, 0x2048, 0x1f04, 0x3c49, + 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, + 0x4bd2, 0x701f, 0x3c39, 0x00b0, 0x8906, 0x8006, 0x8007, 0x90bc, + 0x003f, 0x9084, 0xffc0, 0x9080, 0x001b, 0x21a8, 0x27e0, 0x2098, + 0x27e8, 0x20a0, 0x0006, 0x080c, 0x0f8b, 0x000e, 0x080c, 0x4bd5, + 0x701f, 0x3c39, 0x015e, 0x00de, 0x009e, 0x008e, 0x007e, 0x005e, + 0x004e, 0x003e, 0x002e, 0x001e, 0x0005, 0x7014, 0x2048, 0xa864, + 0x9086, 0x0103, 0x1118, 0x701f, 0x3cfa, 0x0450, 0x7014, 0x2048, + 0xa868, 0xc0fd, 0xa86a, 0x2009, 0x007f, 0x080c, 0x66b2, 0x0110, + 0x9006, 0x0030, 0xb813, 0x00ff, 0xb817, 0xfffd, 0x080c, 0xd325, + 0x015e, 0x00de, 0x009e, 0x008e, 0x007e, 0x005e, 0x004e, 0x003e, + 0x002e, 0x001e, 0x0904, 0x35dd, 0x0016, 0x0026, 0x0036, 0x0046, + 0x0056, 0x0076, 0x0086, 0x0096, 0x00d6, 0x0156, 0x701f, 0x3ccc, + 0x7007, 0x0003, 0x0804, 0x3c8a, 0xa830, 0x9086, 0x0100, 0x2021, + 0x400c, 0x0904, 0x35ad, 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, 0x4bd5, 0x007e, 0x701f, 0x3c39, 0x7023, + 0x0001, 0x0005, 0x0804, 0x35ab, 0x0156, 0x00c6, 0xa814, 0x908a, + 0x001e, 0x0218, 0xa833, 0x001e, 0x0010, 0xa832, 0x0078, 0x81ff, + 0x0168, 0x0016, 0x080c, 0x4b89, 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, 0x19a1, 0x2003, + 0x0001, 0x0005, 0x00f6, 0x00e6, 0x00c6, 0x2061, 0x0200, 0x2001, + 0x19ac, 0x2004, 0x601a, 0x2061, 0x0100, 0x2001, 0x19ab, 0x2004, + 0x60ce, 0x6104, 0xc1ac, 0x6106, 0x080c, 0x4b89, 0xa813, 0x0019, + 0xa817, 0x0001, 0x2900, 0xa85a, 0x2001, 0x002e, 0x2004, 0xa866, + 0x2001, 0x002f, 0x2004, 0xa86a, 0x2061, 0x0090, 0x2079, 0x0100, + 0x2001, 0x19ab, 0x2004, 0x6036, 0x2009, 0x0040, 0x080c, 0x2432, + 0x2001, 0x002a, 0x2004, 0x9084, 0xfff8, 0xa86e, 0x601a, 0xa873, + 0x0000, 0x601f, 0x0000, 0x78ca, 0x9006, 0x600a, 0x600e, 0x00ce, + 0x00ee, 0x00fe, 0x0005, 0x00e6, 0x080c, 0x4b89, 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, 0x2c72, + 0x1130, 0x9006, 0x080c, 0x2bca, 0x9006, 0x080c, 0x2bad, 0x2001, + 0x19a0, 0x2003, 0x0000, 0x7884, 0x9084, 0x0007, 0x0002, 0x3dba, + 0x3dc3, 0x3dcc, 0x3db7, 0x3db7, 0x3db7, 0x3db7, 0x3db7, 0x012e, + 0x0804, 0x35e0, 0x2009, 0x0114, 0x2104, 0x9085, 0x0800, 0x200a, + 0x080c, 0x3f8d, 0x00c0, 0x2009, 0x0114, 0x2104, 0x9085, 0x4000, + 0x200a, 0x080c, 0x3f8d, 0x0078, 0x080c, 0x7569, 0x1128, 0x012e, + 0x2009, 0x0016, 0x0804, 0x35dd, 0x81ff, 0x0128, 0x012e, 0x2021, + 0x400b, 0x0804, 0x35ad, 0x2001, 0x0141, 0x2004, 0xd0dc, 0x0db0, + 0x0086, 0x0096, 0x00a6, 0x00b6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, + 0x080c, 0x3ae1, 0x2009, 0x0101, 0x210c, 0x0016, 0x7ec8, 0x7dcc, + 0x9006, 0x2068, 0x2060, 0x2058, 0x080c, 0x4261, 0x080c, 0x41b1, + 0x903e, 0x2720, 0x00f6, 0x00e6, 0x0086, 0x2940, 0x2071, 0x1a6a, + 0x2079, 0x0090, 0x00d6, 0x2069, 0x0000, 0x6884, 0xd0b4, 0x0120, + 0x68d4, 0x780e, 0x68d0, 0x780a, 0x00de, 0x2011, 0x0001, 0x080c, + 0x4112, 0x080c, 0x2c7a, 0x080c, 0x2c7a, 0x080c, 0x2c7a, 0x080c, + 0x2c7a, 0x080c, 0x4112, 0x008e, 0x00ee, 0x00fe, 0x080c, 0x4034, + 0x2009, 0x9c40, 0x8109, 0x11b0, 0x080c, 0x3f43, 0x2001, 0x0004, + 0x200c, 0x918c, 0xfffd, 0x2102, 0x001e, 0x00fe, 0x00ee, 0x00de, + 0x00ce, 0x00be, 0x00ae, 0x009e, 0x008e, 0x2009, 0x0017, 0x080c, + 0x35dd, 0x0cf8, 0x2001, 0x020b, 0x2004, 0x9084, 0x0140, 0x1d10, + 0x00f6, 0x2079, 0x0000, 0x7884, 0x00fe, 0xd0bc, 0x0178, 0x2001, + 0x0201, 0x200c, 0x81ff, 0x0150, 0x080c, 0x4012, 0x2d00, 0x9c05, + 0x9b05, 0x0120, 0x080c, 0x3f43, 0x0804, 0x3ef0, 0x080c, 0x4186, + 0x080c, 0x40aa, 0x080c, 0x3ff5, 0x080c, 0x402a, 0x00f6, 0x2079, + 0x0100, 0x7824, 0xd0ac, 0x0130, 0x8b58, 0x080c, 0x3f43, 0x00fe, + 0x0804, 0x3ef0, 0x00fe, 0x080c, 0x3f39, 0x1150, 0x8d68, 0x2001, + 0x0032, 0x2602, 0x2001, 0x0033, 0x2502, 0x080c, 0x3f43, 0x0080, + 0x87ff, 0x0138, 0x2001, 0x0201, 0x2004, 0x9005, 0x1908, 0x8739, + 0x0038, 0x2001, 0x1a66, 0x2004, 0x9086, 0x0000, 0x1904, 0x3e40, + 0x2001, 0x032f, 0x2003, 0x00f6, 0x8631, 0x1208, 0x8529, 0x2500, + 0x9605, 0x0904, 0x3ef0, 0x7884, 0xd0bc, 0x0128, 0x2d00, 0x9c05, + 0x9b05, 0x1904, 0x3ef0, 0xa013, 0x0019, 0x2001, 0x032a, 0x2003, + 0x0004, 0x7884, 0xd0ac, 0x1148, 0x2001, 0x1a66, 0x2003, 0x0003, + 0x2001, 0x032a, 0x2003, 0x0009, 0x0030, 0xa017, 0x0001, 0x78b4, + 0x9005, 0x0108, 0xa016, 0x2800, 0xa05a, 0x2009, 0x0040, 0x080c, + 0x2432, 0x2900, 0xa85a, 0xa813, 0x0019, 0x7884, 0xd0a4, 0x1180, + 0xa817, 0x0000, 0x00c6, 0x20a9, 0x0004, 0x2061, 0x0090, 0x602b, + 0x0008, 0x2001, 0x0203, 0x2004, 0x1f04, 0x3ec7, 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, 0x3dfa, + 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, + 0x2432, 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, 0x35ab, 0x012e, 0x2021, 0x400c, 0x0804, + 0x35ad, 0x9085, 0x0001, 0x1d04, 0x3f42, 0x2091, 0x6000, 0x8420, + 0x9486, 0x0064, 0x0005, 0x2001, 0x0105, 0x2003, 0x0010, 0x2001, + 0x032a, 0x2003, 0x0004, 0x2001, 0x1a66, 0x2003, 0x0000, 0x0071, + 0x2009, 0x0048, 0x080c, 0x2432, 0x2001, 0x0227, 0x2024, 0x2402, + 0x2001, 0x0109, 0x2003, 0x4000, 0x9026, 0x0005, 0x00f6, 0x00e6, + 0x2071, 0x1a6a, 0x7000, 0x9086, 0x0000, 0x0520, 0x2079, 0x0090, + 0x2009, 0x0206, 0x2104, 0x2009, 0x0203, 0x210c, 0x9106, 0x1120, + 0x2009, 0x0040, 0x080c, 0x2432, 0x782c, 0xd0fc, 0x0d88, 0x080c, + 0x4186, 0x7000, 0x9086, 0x0000, 0x1d58, 0x782b, 0x0004, 0x782c, + 0xd0ac, 0x1de8, 0x2009, 0x0040, 0x080c, 0x2432, 0x782b, 0x0002, + 0x7003, 0x0000, 0x00ee, 0x00fe, 0x0005, 0x00f6, 0x2079, 0x0100, + 0x2001, 0x1818, 0x200c, 0x7932, 0x7936, 0x080c, 0x28dd, 0x7850, + 0x9084, 0xfbff, 0x9085, 0x0030, 0x7852, 0x2019, 0x01f4, 0x8319, + 0x1df0, 0x9084, 0xffcf, 0x9085, 0x2000, 0x7852, 0x20a9, 0x0046, + 0x1d04, 0x3fa8, 0x2091, 0x6000, 0x1f04, 0x3fa8, 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, 0x3fc8, 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, 0x2d52, 0x7827, 0x0020, 0x7843, 0x0000, 0x9006, 0x080c, + 0x2d52, 0x7827, 0x0048, 0x00fe, 0x0005, 0x7884, 0xd0ac, 0x11c8, + 0x00f6, 0x00e6, 0x2071, 0x1a66, 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, + 0x19ac, 0x2004, 0x70e2, 0x080c, 0x3d1b, 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, 0x4186, 0x00f6, 0x2071, 0x1a66, 0x2079, 0x0320, + 0x00d6, 0x2069, 0x0000, 0x6884, 0xd0b4, 0x0120, 0x689c, 0x780e, + 0x6898, 0x780a, 0x00de, 0x080c, 0x3d1b, 0x0140, 0x2001, 0x19a0, + 0x200c, 0x2003, 0x0001, 0x918e, 0x0001, 0x0120, 0x2009, 0x03e8, + 0x8109, 0x1df0, 0x792c, 0xd1fc, 0x0110, 0x782b, 0x0004, 0x2011, + 0x0011, 0x080c, 0x4112, 0x2011, 0x0001, 0x080c, 0x4112, 0x00fe, + 0x00ee, 0x0005, 0x00f6, 0x00e6, 0x2071, 0x1a66, 0x2079, 0x0320, + 0x792c, 0xd1fc, 0x0904, 0x410f, 0x782b, 0x0002, 0x9026, 0xd19c, + 0x1904, 0x410b, 0x7000, 0x0002, 0x410f, 0x40c0, 0x40f0, 0x410b, + 0xd1bc, 0x1170, 0xd1dc, 0x1190, 0x8001, 0x7002, 0x2011, 0x0001, + 0x080c, 0x4112, 0x0904, 0x410f, 0x080c, 0x4112, 0x0804, 0x410f, + 0x00f6, 0x2079, 0x0300, 0x78bf, 0x0000, 0x00fe, 0x7810, 0x7914, + 0x782b, 0x0004, 0x7812, 0x7916, 0x2001, 0x0201, 0x200c, 0x81ff, + 0x0de8, 0x080c, 0x4012, 0x2009, 0x0001, 0x00f6, 0x2079, 0x0300, + 0x78b8, 0x00fe, 0xd0ec, 0x0110, 0x2009, 0x0011, 0x792a, 0x00f8, + 0x8001, 0x7002, 0x9184, 0x0880, 0x1140, 0x782c, 0xd0fc, 0x1904, + 0x40b4, 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, 0x4140, 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, + 0x417d, 0x4174, 0x416b, 0x4162, 0x4159, 0x4150, 0x4147, 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, 0x1a6a, 0x2079, 0x0090, 0x792c, 0xd1fc, 0x01e8, + 0x782b, 0x0002, 0x2940, 0x9026, 0x7000, 0x0002, 0x41ad, 0x4199, + 0x41a4, 0x8001, 0x7002, 0xd19c, 0x1180, 0x2011, 0x0001, 0x080c, + 0x4112, 0x190c, 0x4112, 0x0048, 0x8001, 0x7002, 0x782c, 0xd0fc, + 0x1d38, 0x2011, 0x0001, 0x080c, 0x4112, 0x008e, 0x00ee, 0x00fe, + 0x0005, 0x00f6, 0x00e6, 0x00c6, 0x0086, 0x2061, 0x0200, 0x2001, + 0x19ac, 0x2004, 0x601a, 0x2061, 0x0100, 0x2001, 0x19ab, 0x2004, + 0x60ce, 0x6104, 0xc1ac, 0x6106, 0x2001, 0x002c, 0x2004, 0x9005, + 0x0520, 0x2038, 0x2001, 0x002e, 0x2024, 0x2001, 0x002f, 0x201c, + 0x080c, 0x4b89, 0xa813, 0x0019, 0xaf16, 0x2900, 0xa85a, 0x978a, + 0x0007, 0x0220, 0x2138, 0x2009, 0x0007, 0x0010, 0x2708, 0x903e, + 0x0096, 0xa858, 0x2048, 0xa85c, 0x9080, 0x0019, 0x009e, 0x080c, + 0x4229, 0x1d68, 0x2900, 0xa85a, 0x00d0, 0x080c, 0x4b89, 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, 0x19ab, 0x2004, 0x6036, 0x2009, + 0x0040, 0x080c, 0x2432, 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, 0x4b89, 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, 0x4b89, + 0x2940, 0xa813, 0x0019, 0xaf16, 0x2900, 0xa85a, 0x978a, 0x0007, + 0x0220, 0x2138, 0x2009, 0x0007, 0x0010, 0x2708, 0x903e, 0x0096, + 0xa858, 0x2048, 0xa85c, 0x9080, 0x0019, 0x009e, 0x080c, 0x4229, + 0x1d68, 0x2900, 0xa85a, 0x00d8, 0x080c, 0x4b89, 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, 0x1a66, + 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, 0x35ab, 0x7d98, 0x7c9c, 0x0804, 0x36af, + 0x080c, 0x7569, 0x190c, 0x60ec, 0x6040, 0x9084, 0x0020, 0x09b1, + 0x2069, 0x1847, 0x2d00, 0x2009, 0x0030, 0x7a8c, 0x7b88, 0x7c9c, + 0x7d98, 0x2039, 0x0001, 0x080c, 0x4bd2, 0x701f, 0x4308, 0x0005, + 0x080c, 0x57e2, 0x1130, 0x3b00, 0x3a08, 0xc194, 0xc095, 0x20d8, + 0x21d0, 0x2069, 0x1847, 0x6800, 0x9005, 0x0904, 0x35e0, 0x6804, + 0xd0ac, 0x0118, 0xd0a4, 0x0904, 0x35e0, 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, 0x35e0, 0x9288, 0x33ac, 0x210d, 0x918c, 0x00ff, 0x6166, + 0xd0dc, 0x0130, 0x6828, 0x908a, 0x007f, 0x1a04, 0x35e0, 0x605e, + 0x6888, 0x9084, 0x0030, 0x8004, 0x8004, 0x8004, 0x8004, 0x0006, + 0x2009, 0x19b3, 0x9080, 0x29d0, 0x2005, 0x200a, 0x000e, 0x2009, + 0x19b4, 0x9080, 0x29d4, 0x2005, 0x200a, 0x6808, 0x908a, 0x0100, + 0x0a04, 0x35e0, 0x908a, 0x0841, 0x1a04, 0x35e0, 0x9084, 0x0007, + 0x1904, 0x35e0, 0x680c, 0x9005, 0x0904, 0x35e0, 0x6810, 0x9005, + 0x0904, 0x35e0, 0x6848, 0x6940, 0x910a, 0x1a04, 0x35e0, 0x8001, + 0x0904, 0x35e0, 0x684c, 0x6944, 0x910a, 0x1a04, 0x35e0, 0x8001, + 0x0904, 0x35e0, 0x2009, 0x1982, 0x200b, 0x0000, 0x2001, 0x1869, + 0x2004, 0xd0c4, 0x0140, 0x7884, 0x200a, 0x2008, 0x080c, 0x0e52, + 0x3b00, 0xc085, 0x20d8, 0x6814, 0x908c, 0x00ff, 0x614e, 0x8007, + 0x9084, 0x00ff, 0x6052, 0x080c, 0x787f, 0x080c, 0x6ac8, 0x080c, + 0x6b2a, 0x6808, 0x602a, 0x080c, 0x23a4, 0x2009, 0x0170, 0x200b, + 0x0080, 0xa001, 0xa001, 0x200b, 0x0000, 0x0036, 0x6b08, 0x080c, + 0x2937, 0x003e, 0x6000, 0x9086, 0x0000, 0x1904, 0x44a4, 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, 0x19b5, 0x20e9, 0x0001, 0x4001, + 0x20a9, 0x0004, 0x20a1, 0x19cf, 0x20e9, 0x0001, 0x4001, 0x080c, + 0x882e, 0x00c6, 0x900e, 0x20a9, 0x0001, 0x6b70, 0xd384, 0x0510, + 0x0068, 0x2009, 0x0100, 0x210c, 0x918e, 0x0008, 0x1110, 0x839d, + 0x0010, 0x83f5, 0x3e18, 0x12b0, 0x3508, 0x8109, 0x080c, 0x7e3b, + 0x6878, 0x6016, 0x6874, 0x2008, 0x9084, 0xff00, 0x8007, 0x600a, + 0x9184, 0x00ff, 0x6006, 0x8108, 0x1118, 0x6003, 0x0003, 0x0010, + 0x6003, 0x0001, 0x1f04, 0x43f9, 0x00ce, 0x00c6, 0x2061, 0x199d, + 0x6a88, 0x9284, 0xc000, 0x2010, 0x9286, 0x0000, 0x1158, 0x2063, + 0x0000, 0x2001, 0x0001, 0x080c, 0x2bca, 0x2001, 0x0001, 0x080c, + 0x2bad, 0x0088, 0x9286, 0x4000, 0x1148, 0x2063, 0x0001, 0x9006, + 0x080c, 0x2bca, 0x9006, 0x080c, 0x2bad, 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, 0x197d, 0x6a80, + 0x9294, 0x0030, 0x928e, 0x0000, 0x0170, 0x928e, 0x0010, 0x0118, + 0x928e, 0x0020, 0x0140, 0x2003, 0xaaaa, 0x080c, 0x29ac, 0x2001, + 0x196e, 0x2102, 0x0008, 0x2102, 0x00c6, 0x2061, 0x0100, 0x602f, + 0x0040, 0x602f, 0x0000, 0x00ce, 0x080c, 0x7569, 0x0128, 0x080c, + 0x50c9, 0x0110, 0x080c, 0x28fd, 0x60d4, 0x9005, 0x01c0, 0x6003, + 0x0001, 0x2009, 0x448c, 0x00e0, 0x080c, 0x7569, 0x1168, 0x2011, + 0x73e4, 0x080c, 0x8709, 0x2011, 0x73d7, 0x080c, 0x87e3, 0x080c, + 0x7853, 0x080c, 0x7495, 0x0040, 0x080c, 0x5fe6, 0x0028, 0x6003, + 0x0004, 0x2009, 0x44a4, 0x0020, 0x080c, 0x69f4, 0x0804, 0x35ab, + 0x2001, 0x0170, 0x2004, 0x9084, 0x00ff, 0x9086, 0x004c, 0x1118, + 0x2091, 0x30bd, 0x0817, 0x2091, 0x303d, 0x0817, 0x6000, 0x9086, + 0x0000, 0x0904, 0x35dd, 0x2069, 0x1847, 0x7890, 0x6842, 0x7894, + 0x6846, 0x2d00, 0x2009, 0x0030, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, + 0x2039, 0x0001, 0x0804, 0x4bd5, 0x9006, 0x080c, 0x28fd, 0x81ff, + 0x1904, 0x35dd, 0x080c, 0x7569, 0x11b0, 0x080c, 0x784e, 0x080c, + 0x6127, 0x080c, 0x33a0, 0x0118, 0x6130, 0xc18d, 0x6132, 0x080c, + 0xd561, 0x0130, 0x080c, 0x758c, 0x1118, 0x080c, 0x7541, 0x0038, + 0x080c, 0x7495, 0x0020, 0x080c, 0x60ec, 0x080c, 0x5fe6, 0x0804, + 0x35ab, 0x81ff, 0x1904, 0x35dd, 0x080c, 0x7569, 0x1110, 0x0804, + 0x35dd, 0x0126, 0x2091, 0x8000, 0x6194, 0x81ff, 0x0190, 0x704f, + 0x0000, 0x2001, 0x1c80, 0x2009, 0x0040, 0x7a8c, 0x7b88, 0x7c9c, + 0x7d98, 0x2039, 0x0001, 0x080c, 0x4bd5, 0x701f, 0x35a9, 0x012e, + 0x0005, 0x704f, 0x0001, 0x00d6, 0x2069, 0x1c80, 0x20a9, 0x0040, + 0x20e9, 0x0001, 0x20a1, 0x1c80, 0x2019, 0xffff, 0x4304, 0x655c, + 0x9588, 0x33ac, 0x210d, 0x918c, 0x00ff, 0x216a, 0x900e, 0x2011, + 0x0002, 0x2100, 0x9506, 0x01a8, 0x080c, 0x671d, 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, 0x6077, 0x0804, 0x4501, 0x080c, 0x4bbc, + 0x0904, 0x35e0, 0x080c, 0x4b89, 0x1120, 0x2009, 0x0002, 0x0804, + 0x35dd, 0x080c, 0x57d3, 0xd0b4, 0x0558, 0x7884, 0x908e, 0x007e, + 0x0538, 0x908e, 0x007f, 0x0520, 0x908e, 0x0080, 0x0508, 0x080c, + 0x339b, 0x1148, 0xb800, 0xd08c, 0x11d8, 0xb804, 0x9084, 0x00ff, + 0x9086, 0x0006, 0x11a8, 0xa867, 0x0000, 0xa868, 0xc0fd, 0xa86a, + 0x080c, 0xd021, 0x1120, 0x2009, 0x0003, 0x0804, 0x35dd, 0x7007, + 0x0003, 0x701f, 0x458c, 0x0005, 0x080c, 0x4bbc, 0x0904, 0x35e0, + 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, 0x4bd5, 0x81ff, 0x1904, 0x35dd, 0x080c, 0x4ba0, 0x0904, + 0x35e0, 0x080c, 0x688f, 0x0904, 0x35dd, 0x0058, 0xa878, 0x9005, + 0x0120, 0x2009, 0x0004, 0x0804, 0x35dd, 0xa974, 0xaa94, 0x0804, + 0x35ab, 0x080c, 0x57db, 0x0904, 0x35ab, 0x701f, 0x45d6, 0x7007, + 0x0003, 0x0005, 0x81ff, 0x1904, 0x35dd, 0x7888, 0x908a, 0x1000, + 0x1a04, 0x35e0, 0x080c, 0x4bbc, 0x0904, 0x35e0, 0x080c, 0x6a92, + 0x0120, 0x080c, 0x6a9a, 0x1904, 0x35e0, 0x080c, 0x6914, 0x0904, + 0x35dd, 0x2019, 0x0004, 0x900e, 0x080c, 0x68a1, 0x0904, 0x35dd, + 0x7984, 0x7a88, 0x04c9, 0x08a8, 0xa89c, 0x908a, 0x1000, 0x12f8, + 0x080c, 0x4bba, 0x01e0, 0x080c, 0x6a92, 0x0118, 0x080c, 0x6a9a, + 0x11b0, 0x080c, 0x6914, 0x2009, 0x0002, 0x0168, 0x2009, 0x0002, + 0x2019, 0x0004, 0x080c, 0x68a1, 0x2009, 0x0003, 0x0120, 0xa998, + 0xaa9c, 0x00d1, 0x0060, 0xa897, 0x4005, 0xa99a, 0x0010, 0xa897, + 0x4006, 0x900e, 0x9085, 0x0001, 0x2001, 0x0030, 0x0005, 0xa897, + 0x4000, 0x080c, 0x57db, 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, 0x671d, + 0x1138, 0x2200, 0x8003, 0x800b, 0x810b, 0x9108, 0x080c, 0x8717, + 0x0005, 0x81ff, 0x1904, 0x35dd, 0x798c, 0x2001, 0x1981, 0x918c, + 0x8000, 0x2102, 0x080c, 0x4ba0, 0x0904, 0x35e0, 0x080c, 0x6a92, + 0x0120, 0x080c, 0x6a9a, 0x1904, 0x35e0, 0x080c, 0x67e4, 0x0904, + 0x35dd, 0x080c, 0x6898, 0x0904, 0x35dd, 0x2001, 0x1981, 0x2004, + 0xd0fc, 0x1904, 0x35ab, 0x0804, 0x45e1, 0xa9a0, 0x2001, 0x1981, + 0x918c, 0x8000, 0xc18d, 0x2102, 0x080c, 0x4bad, 0x01a0, 0x080c, + 0x6a92, 0x0118, 0x080c, 0x6a9a, 0x1170, 0x080c, 0x67e4, 0x2009, + 0x0002, 0x0128, 0x080c, 0x6898, 0x1170, 0x2009, 0x0003, 0xa897, + 0x4005, 0xa99a, 0x0010, 0xa897, 0x4006, 0x900e, 0x9085, 0x0001, + 0x2001, 0x0030, 0x0005, 0xa897, 0x4000, 0x2001, 0x1981, 0x2004, + 0xd0fc, 0x1128, 0x080c, 0x57db, 0x0110, 0x9006, 0x0018, 0x900e, + 0x9085, 0x0001, 0x2001, 0x0000, 0x0005, 0x81ff, 0x1904, 0x35dd, + 0x798c, 0x2001, 0x1980, 0x918c, 0x8000, 0x2102, 0x080c, 0x4ba0, + 0x0904, 0x35e0, 0x080c, 0x6a92, 0x0120, 0x080c, 0x6a9a, 0x1904, + 0x35e0, 0x080c, 0x67e4, 0x0904, 0x35dd, 0x080c, 0x6886, 0x0904, + 0x35dd, 0x2001, 0x1980, 0x2004, 0xd0fc, 0x1904, 0x35ab, 0x0804, + 0x45e1, 0xa9a0, 0x2001, 0x1980, 0x918c, 0x8000, 0xc18d, 0x2102, + 0x080c, 0x4bad, 0x01a0, 0x080c, 0x6a92, 0x0118, 0x080c, 0x6a9a, + 0x1170, 0x080c, 0x67e4, 0x2009, 0x0002, 0x0128, 0x080c, 0x6886, + 0x1170, 0x2009, 0x0003, 0xa897, 0x4005, 0xa99a, 0x0010, 0xa897, + 0x4006, 0x900e, 0x9085, 0x0001, 0x2001, 0x0030, 0x0005, 0xa897, + 0x4000, 0x2001, 0x1980, 0x2004, 0xd0fc, 0x1128, 0x080c, 0x57db, + 0x0110, 0x9006, 0x0018, 0x900e, 0x9085, 0x0001, 0x2001, 0x0000, + 0x0005, 0x6100, 0x0804, 0x35ab, 0x080c, 0x4bbc, 0x0904, 0x35e0, + 0x080c, 0x57e7, 0x1904, 0x35dd, 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, + 0x35ab, 0x78a8, 0x909c, 0x0003, 0xd0ac, 0x1158, 0xd0b4, 0x1148, + 0x939a, 0x0003, 0x1a04, 0x35dd, 0x625c, 0x7884, 0x9206, 0x1904, + 0x479c, 0x080c, 0x8818, 0x2001, 0xffec, 0x2009, 0x000c, 0x7a8c, + 0x7b88, 0x7c9c, 0x7d98, 0x2039, 0x0000, 0x0006, 0x78a8, 0x9084, + 0x0080, 0x1528, 0x0006, 0x0036, 0x2001, 0x1a84, 0x201c, 0x7b9a, + 0x2003, 0x0000, 0x2001, 0x1a85, 0x201c, 0x7b9e, 0x2003, 0x0000, + 0x2001, 0x1a86, 0x201c, 0x7bae, 0x2003, 0x0000, 0x2001, 0x1a80, + 0x201c, 0x7baa, 0x2003, 0x0000, 0x2001, 0x1a87, 0x201c, 0x7bb2, + 0x2003, 0x0000, 0x003e, 0x000e, 0x000e, 0x0804, 0x4bd5, 0x000e, + 0x2031, 0x0000, 0x2061, 0x18b8, 0x2c44, 0xa66a, 0xa17a, 0xa772, + 0xa076, 0xa28e, 0xa392, 0xa496, 0xa59a, 0x080c, 0x10f8, 0x7007, + 0x0002, 0x701f, 0x47bc, 0x0005, 0x81ff, 0x1904, 0x35dd, 0x080c, + 0x4bbc, 0x0904, 0x35e0, 0x080c, 0x6a92, 0x1904, 0x35dd, 0x00c6, + 0x080c, 0x4b89, 0x00ce, 0x0904, 0x35dd, 0xa867, 0x0000, 0xa868, + 0xc0fd, 0xa86a, 0x7ea8, 0x080c, 0xcfc7, 0x0904, 0x35dd, 0x7007, + 0x0003, 0x701f, 0x47e2, 0x0005, 0x080c, 0x42ce, 0x0006, 0x0036, + 0x2001, 0x1a84, 0x201c, 0x7b9a, 0x2003, 0x0000, 0x2001, 0x1a85, + 0x201c, 0x7b9e, 0x2003, 0x0000, 0x2001, 0x1a86, 0x201c, 0x7bae, + 0x2003, 0x0000, 0x2001, 0x1a80, 0x201c, 0x7baa, 0x2003, 0x0000, + 0x2001, 0x1a87, 0x201c, 0x7bb2, 0x2003, 0x0000, 0x003e, 0x000e, + 0x0804, 0x35ab, 0xa830, 0x9086, 0x0100, 0x0904, 0x35dd, 0x8906, + 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x001b, + 0x2009, 0x000c, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x0804, 0x4bd5, + 0x9006, 0x080c, 0x28fd, 0x78a8, 0x9084, 0x00ff, 0x9086, 0x00ff, + 0x0118, 0x81ff, 0x1904, 0x35dd, 0x080c, 0x7569, 0x0110, 0x080c, + 0x60ec, 0x7888, 0x908a, 0x1000, 0x1a04, 0x35e0, 0x7984, 0x9186, + 0x00ff, 0x0138, 0x9182, 0x007f, 0x1a04, 0x35e0, 0x2100, 0x080c, + 0x28c7, 0x0026, 0x00c6, 0x0126, 0x2091, 0x8000, 0x2061, 0x19fc, + 0x601b, 0x0000, 0x601f, 0x0000, 0x607b, 0x0000, 0x607f, 0x0000, + 0x080c, 0x7569, 0x1158, 0x080c, 0x784e, 0x080c, 0x6127, 0x9085, + 0x0001, 0x080c, 0x75ad, 0x080c, 0x7495, 0x00d0, 0x080c, 0xb072, + 0x2061, 0x0100, 0x2001, 0x1818, 0x2004, 0x9084, 0x00ff, 0x810f, + 0x9105, 0x604a, 0x6043, 0x0090, 0x6043, 0x0010, 0x2009, 0x199a, + 0x200b, 0x0000, 0x2009, 0x002d, 0x2011, 0x6012, 0x080c, 0x87a1, + 0x7984, 0x080c, 0x7569, 0x1110, 0x2009, 0x00ff, 0x7a88, 0x080c, + 0x4644, 0x012e, 0x00ce, 0x002e, 0x0804, 0x35ab, 0x7984, 0x080c, + 0x66b2, 0x2b08, 0x1904, 0x35e0, 0x0804, 0x35ab, 0x81ff, 0x0120, + 0x2009, 0x0001, 0x0804, 0x35dd, 0x60dc, 0xd0ac, 0x1130, 0xd09c, + 0x1120, 0x2009, 0x0005, 0x0804, 0x35dd, 0x080c, 0x4b89, 0x1120, + 0x2009, 0x0002, 0x0804, 0x35dd, 0x7984, 0x81ff, 0x0904, 0x35e0, + 0x9192, 0x0021, 0x1a04, 0x35e0, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, + 0xa85c, 0x9080, 0x0019, 0x702a, 0xaf60, 0x7736, 0x080c, 0x4bd2, + 0x701f, 0x4899, 0x7880, 0x9086, 0x006e, 0x0110, 0x701f, 0x527b, + 0x0005, 0x2009, 0x0080, 0x080c, 0x671d, 0x1118, 0x080c, 0x6a92, + 0x0120, 0x2021, 0x400a, 0x0804, 0x35ad, 0x00d6, 0x0096, 0xa964, + 0xaa6c, 0xab70, 0xac74, 0xad78, 0xae7c, 0xa884, 0x90be, 0x0100, + 0x0904, 0x4932, 0x90be, 0x0112, 0x0904, 0x4932, 0x90be, 0x0113, + 0x0904, 0x4932, 0x90be, 0x0114, 0x0904, 0x4932, 0x90be, 0x0117, + 0x0904, 0x4932, 0x90be, 0x011a, 0x0904, 0x4932, 0x90be, 0x011c, + 0x0904, 0x4932, 0x90be, 0x0121, 0x0904, 0x4919, 0x90be, 0x0131, + 0x0904, 0x4919, 0x90be, 0x0171, 0x0904, 0x4932, 0x90be, 0x0173, + 0x0904, 0x4932, 0x90be, 0x01a1, 0x1128, 0xa894, 0x8007, 0xa896, + 0x0804, 0x493d, 0x90be, 0x0212, 0x0904, 0x4926, 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, 0x35e0, + 0x7028, 0x9080, 0x0010, 0x2098, 0x20a0, 0x7034, 0x20e0, 0x20e8, + 0x20a9, 0x0007, 0x080c, 0x497b, 0x7028, 0x9080, 0x000e, 0x2098, + 0x20a0, 0x7034, 0x20e0, 0x20e8, 0x20a9, 0x0001, 0x080c, 0x497b, + 0x00c8, 0x7028, 0x9080, 0x000c, 0x2098, 0x20a0, 0x7034, 0x20e0, + 0x20e8, 0x20a9, 0x0001, 0x080c, 0x4988, 0x00b8, 0x7028, 0x9080, + 0x000e, 0x2098, 0x20a0, 0x7034, 0x20e0, 0x20e8, 0x20a9, 0x0001, + 0x080c, 0x4988, 0x7028, 0x9080, 0x000c, 0x2098, 0x20a0, 0x7034, + 0x20e0, 0x20e8, 0x20a9, 0x0001, 0x04f1, 0x00c6, 0x080c, 0x4b89, + 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, + 0xcfe2, 0x1120, 0x2009, 0x0003, 0x0804, 0x35dd, 0x7007, 0x0003, + 0x701f, 0x4972, 0x0005, 0x00ce, 0x009e, 0x00de, 0x2009, 0x0002, + 0x0804, 0x35dd, 0xa820, 0x9086, 0x8001, 0x1904, 0x35ab, 0x2009, + 0x0004, 0x0804, 0x35dd, 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, + 0x35dd, 0x60dc, 0xd0ac, 0x1130, 0xd09c, 0x1120, 0x2009, 0x0005, + 0x0804, 0x35dd, 0x7984, 0x78a8, 0x2040, 0x080c, 0xb06b, 0x1120, + 0x9182, 0x007f, 0x0a04, 0x35e0, 0x9186, 0x00ff, 0x0904, 0x35e0, + 0x9182, 0x0800, 0x1a04, 0x35e0, 0x7a8c, 0x7b88, 0x607c, 0x9306, + 0x1158, 0x6080, 0x924e, 0x0904, 0x35e0, 0x080c, 0xb06b, 0x1120, + 0x99cc, 0xff00, 0x0904, 0x35e0, 0x0126, 0x2091, 0x8000, 0x080c, + 0x4a9c, 0x0904, 0x4a1c, 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, 0x6a92, + 0x0110, 0xc89d, 0x0438, 0x900e, 0x080c, 0x693d, 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, 0x35ad, 0x000e, 0x00ce, 0x2b00, 0x7026, 0x0016, 0x00b6, + 0x00c6, 0x00e6, 0x2c70, 0x080c, 0xb153, 0x0904, 0x4a71, 0x2b00, + 0x6012, 0x080c, 0xd2d2, 0x2e58, 0x00ee, 0x00e6, 0x00c6, 0x080c, + 0x4b89, 0x00ce, 0x2b70, 0x1158, 0x080c, 0xb101, 0x00ee, 0x00ce, + 0x00be, 0x001e, 0x012e, 0x2009, 0x0002, 0x0804, 0x35dd, 0x900e, + 0xa966, 0xa96a, 0x2900, 0x6016, 0xa932, 0xa868, 0xc0fd, 0xd88c, + 0x0108, 0xc0f5, 0xa86a, 0xd89c, 0x1110, 0x080c, 0x3246, 0x6023, + 0x0001, 0x9006, 0x080c, 0x664f, 0xd89c, 0x0138, 0x2001, 0x0004, + 0x080c, 0x6663, 0x2009, 0x0003, 0x0030, 0x2001, 0x0002, 0x080c, + 0x6663, 0x2009, 0x0002, 0x080c, 0xb180, 0x78a8, 0xd094, 0x0138, + 0x00ee, 0x7024, 0x00e6, 0x2058, 0xb8cc, 0xc08d, 0xb8ce, 0x9085, + 0x0001, 0x00ee, 0x00ce, 0x00be, 0x001e, 0x012e, 0x1120, 0x2009, + 0x0003, 0x0804, 0x35dd, 0x7007, 0x0003, 0x701f, 0x4a80, 0x0005, + 0xa830, 0x9086, 0x0100, 0x7024, 0x2058, 0x1138, 0x2009, 0x0004, + 0xba04, 0x9294, 0x00ff, 0x0804, 0x5727, 0x900e, 0xa868, 0xd0f4, + 0x1904, 0x35ab, 0x080c, 0x693d, 0x1108, 0xc185, 0xb800, 0xd0bc, + 0x0108, 0xc18d, 0x0804, 0x35ab, 0x00e6, 0x00d6, 0x0096, 0x83ff, + 0x0904, 0x4aeb, 0x902e, 0x080c, 0xb06b, 0x0130, 0x9026, 0x20a9, + 0x0800, 0x2071, 0x1000, 0x0030, 0x2021, 0x007f, 0x20a9, 0x0781, + 0x2071, 0x107f, 0x2e04, 0x9005, 0x11b8, 0x2100, 0x9406, 0x1904, + 0x4afc, 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, 0x6a32, 0x1570, 0x2001, + 0x4000, 0x0460, 0x080c, 0x6a92, 0x1540, 0x2001, 0x4000, 0x0430, + 0x2001, 0x4007, 0x0418, 0x2001, 0x4006, 0x0400, 0x2400, 0x9106, + 0x1158, 0xbe14, 0x87ff, 0x1128, 0x86ff, 0x0918, 0x080c, 0xb06b, + 0x1900, 0x2001, 0x4008, 0x0090, 0x8420, 0x8e70, 0x1f04, 0x4ab2, + 0x85ff, 0x1130, 0x2001, 0x4009, 0x0048, 0x2001, 0x0001, 0x0030, + 0x080c, 0x66b2, 0x1dd0, 0xbb12, 0xba16, 0x9006, 0x9005, 0x009e, + 0x00de, 0x00ee, 0x0005, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, + 0x35dd, 0x080c, 0x4b89, 0x1120, 0x2009, 0x0002, 0x0804, 0x35dd, + 0xa867, 0x0000, 0xa868, 0xc0fd, 0xa86a, 0x7884, 0x9005, 0x0904, + 0x35e0, 0x9096, 0x00ff, 0x0120, 0x9092, 0x0004, 0x1a04, 0x35e0, + 0x2010, 0x2918, 0x080c, 0x31ec, 0x1120, 0x2009, 0x0003, 0x0804, + 0x35dd, 0x7007, 0x0003, 0x701f, 0x4b3e, 0x0005, 0xa830, 0x9086, + 0x0100, 0x1904, 0x35ab, 0x2009, 0x0004, 0x0804, 0x35dd, 0x7984, + 0x080c, 0xb06b, 0x1120, 0x9182, 0x007f, 0x0a04, 0x35e0, 0x9186, + 0x00ff, 0x0904, 0x35e0, 0x9182, 0x0800, 0x1a04, 0x35e0, 0x2001, + 0x9400, 0x080c, 0x5782, 0x1904, 0x35dd, 0x0804, 0x35ab, 0xa998, + 0x080c, 0xb06b, 0x1118, 0x9182, 0x007f, 0x0280, 0x9186, 0x00ff, + 0x0168, 0x9182, 0x0800, 0x1250, 0x2001, 0x9400, 0x080c, 0x5782, + 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, 0x671d, 0x1130, 0x7e88, 0x9684, 0x3fff, 0x9082, + 0x4000, 0x0208, 0x905e, 0x8bff, 0x0005, 0xa998, 0x080c, 0x671d, + 0x1130, 0xae9c, 0x9684, 0x3fff, 0x9082, 0x4000, 0x0208, 0x905e, + 0x8bff, 0x0005, 0xae98, 0x0008, 0x7e84, 0x2608, 0x080c, 0x671d, + 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, 0x35ab, + 0x0005, 0x00f6, 0x0126, 0x2091, 0x8000, 0x2079, 0x0000, 0x2001, + 0x18b0, 0x2004, 0x9005, 0x1190, 0x0e04, 0x4c06, 0x7a36, 0x7833, + 0x0012, 0x7a82, 0x7b86, 0x7c8a, 0x2091, 0x4080, 0x2001, 0x0089, + 0x2004, 0xd084, 0x190c, 0x11aa, 0x0804, 0x4c6c, 0x0016, 0x0086, + 0x0096, 0x00c6, 0x00e6, 0x2071, 0x189e, 0x7044, 0x9005, 0x1540, + 0x7148, 0x9182, 0x0010, 0x0288, 0x7038, 0x2060, 0x080c, 0x100e, + 0x0904, 0x4c64, 0xa84b, 0x0000, 0x2900, 0x7046, 0x2001, 0x0002, + 0x9080, 0x20f0, 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, + 0x20f0, 0x2005, 0xa846, 0x0058, 0x2262, 0x6306, 0x640a, 0x00ee, + 0x00ce, 0x009e, 0x008e, 0x001e, 0x012e, 0x00fe, 0x0005, 0x2c00, + 0x9082, 0x001b, 0x0002, 0x4c8e, 0x4c8e, 0x4c90, 0x4c8e, 0x4c8e, + 0x4c8e, 0x4c94, 0x4c8e, 0x4c8e, 0x4c8e, 0x4c98, 0x4c8e, 0x4c8e, + 0x4c8e, 0x4c9c, 0x4c8e, 0x4c8e, 0x4c8e, 0x4ca0, 0x4c8e, 0x4c8e, + 0x4c8e, 0x4ca4, 0x4c8e, 0x4c8e, 0x4c8e, 0x4ca9, 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, + 0x4c67, 0xa2d6, 0xa3da, 0xa4de, 0x0804, 0x4c67, 0x00e6, 0x2071, + 0x189e, 0x7048, 0x9005, 0x0904, 0x4d40, 0x0126, 0x2091, 0x8000, + 0x0e04, 0x4d3f, 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, 0x4d42, 0xa804, 0x9005, + 0x090c, 0x0dc5, 0x7042, 0x2938, 0x2040, 0xa003, 0x0000, 0x2001, + 0x0002, 0x9080, 0x20f0, 0x2005, 0xa04a, 0x0804, 0x4d42, 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, 0x20f0, 0x2005, + 0xa84a, 0x0000, 0x007e, 0x008e, 0x009e, 0x00ce, 0x00fe, 0x012e, + 0x00ee, 0x0005, 0x2c00, 0x9082, 0x001b, 0x0002, 0x4d61, 0x4d61, + 0x4d63, 0x4d61, 0x4d61, 0x4d61, 0x4d68, 0x4d61, 0x4d61, 0x4d61, + 0x4d6d, 0x4d61, 0x4d61, 0x4d61, 0x4d72, 0x4d61, 0x4d61, 0x4d61, + 0x4d77, 0x4d61, 0x4d61, 0x4d61, 0x4d7c, 0x4d61, 0x4d61, 0x4d61, + 0x4d81, 0x080c, 0x0dc5, 0xaa74, 0xab78, 0xac7c, 0x0804, 0x4ced, + 0xaa84, 0xab88, 0xac8c, 0x0804, 0x4ced, 0xaa94, 0xab98, 0xac9c, + 0x0804, 0x4ced, 0xaaa4, 0xaba8, 0xacac, 0x0804, 0x4ced, 0xaab4, + 0xabb8, 0xacbc, 0x0804, 0x4ced, 0xaac4, 0xabc8, 0xaccc, 0x0804, + 0x4ced, 0xaad4, 0xabd8, 0xacdc, 0x0804, 0x4ced, 0x0016, 0x0026, + 0x0036, 0x00b6, 0x00c6, 0x2009, 0x007e, 0x080c, 0x671d, 0x2019, + 0x0001, 0xb85c, 0xd0ac, 0x0110, 0x2019, 0x0000, 0x2011, 0x801b, + 0x080c, 0x4be9, 0x00ce, 0x00be, 0x003e, 0x002e, 0x001e, 0x0005, + 0x0026, 0x080c, 0x57d3, 0xd0c4, 0x0120, 0x2011, 0x8014, 0x080c, + 0x4be9, 0x002e, 0x0005, 0x81ff, 0x1904, 0x35dd, 0x0126, 0x2091, + 0x8000, 0x6030, 0xc08d, 0xc085, 0xc0ac, 0x6032, 0x080c, 0x7569, + 0x1158, 0x080c, 0x784e, 0x080c, 0x6127, 0x9085, 0x0001, 0x080c, + 0x75ad, 0x080c, 0x7495, 0x0010, 0x080c, 0x5fe6, 0x012e, 0x0804, + 0x35ab, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x35dd, 0x080c, + 0x57e7, 0x0120, 0x2009, 0x0007, 0x0804, 0x35dd, 0x080c, 0x6a8a, + 0x0120, 0x2009, 0x0008, 0x0804, 0x35dd, 0x7984, 0x080c, 0x66b2, + 0x1904, 0x35e0, 0x080c, 0x4bbc, 0x0904, 0x35e0, 0x2b00, 0x7026, + 0x080c, 0x6a92, 0x7888, 0x1170, 0x9084, 0x0005, 0x1158, 0x900e, + 0x080c, 0x693d, 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d, + 0x0804, 0x35ab, 0x080c, 0x4b89, 0x0904, 0x35dd, 0x9006, 0xa866, + 0xa832, 0xa868, 0xc0fd, 0xa86a, 0x080c, 0xd080, 0x0904, 0x35dd, + 0x7888, 0xd094, 0x0118, 0xb8cc, 0xc08d, 0xb8ce, 0x7007, 0x0003, + 0x701f, 0x4e5c, 0x0005, 0x2061, 0x1800, 0x080c, 0x57e7, 0x2009, + 0x0007, 0x1560, 0x080c, 0x6a8a, 0x0118, 0x2009, 0x0008, 0x0430, + 0xa998, 0x080c, 0x66b2, 0x1530, 0x080c, 0x4bba, 0x0518, 0x080c, + 0x6a92, 0xa89c, 0x1168, 0x9084, 0x0005, 0x1150, 0x900e, 0x080c, + 0x693d, 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d, 0x00d0, + 0xa868, 0xc0fc, 0xa86a, 0x080c, 0xd080, 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, 0x9086, 0x0100, 0x7024, + 0x2058, 0x1110, 0x0804, 0x5727, 0x900e, 0x080c, 0x693d, 0x1108, + 0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d, 0x0804, 0x35ab, 0x080c, + 0x57e7, 0x0120, 0x2009, 0x0007, 0x0804, 0x35dd, 0x7f84, 0x7a8c, + 0x7b88, 0x7c9c, 0x7d98, 0x080c, 0x4b89, 0x1120, 0x2009, 0x0002, + 0x0804, 0x35dd, 0x900e, 0x2130, 0x7126, 0x7132, 0xa860, 0x20e8, + 0x7036, 0xa85c, 0x9080, 0x0005, 0x702a, 0x20a0, 0x080c, 0x671d, + 0x1904, 0x4f05, 0x080c, 0x6a92, 0x0138, 0x080c, 0x6a9a, 0x0120, + 0x080c, 0x6a32, 0x1904, 0x4f05, 0xd794, 0x1110, 0xd784, 0x01a8, + 0xb8c4, 0x20e0, 0xb8c8, 0x9080, 0x0006, 0x2098, 0x3400, 0xd794, + 0x0198, 0x20a9, 0x0008, 0x4003, 0x2098, 0x20a0, 0x3d00, 0x20e0, + 0x20a9, 0x0002, 0x080c, 0x4988, 0x0080, 0xb8c4, 0x20e0, 0xb8c8, + 0x9080, 0x000a, 0x2098, 0x3400, 0x20a9, 0x0004, 0x4003, 0x2098, + 0x20a0, 0x3d00, 0x20e0, 0x080c, 0x4988, 0x9186, 0x007e, 0x0170, + 0x9186, 0x0080, 0x0158, 0x080c, 0x6a92, 0x90c2, 0x0006, 0x1210, + 0xc1fd, 0x0020, 0x080c, 0x693d, 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, 0x497b, 0x9c80, + 0x0026, 0x2098, 0xb8c4, 0x20e0, 0x20a9, 0x0002, 0x4003, 0xd794, + 0x0110, 0x96b0, 0x000b, 0x96b0, 0x0005, 0x8108, 0x080c, 0xb06b, + 0x0118, 0x9186, 0x0800, 0x0040, 0xd78c, 0x0120, 0x9186, 0x0800, + 0x0170, 0x0018, 0x9186, 0x007e, 0x0150, 0xd794, 0x0118, 0x9686, + 0x0020, 0x0010, 0x9686, 0x0028, 0x0150, 0x0804, 0x4e8e, 0x86ff, + 0x1120, 0x7124, 0x810b, 0x0804, 0x35ab, 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, 0x4f41, + 0x0005, 0x7030, 0x9005, 0x1180, 0x7120, 0x7028, 0x20a0, 0x772c, + 0x9036, 0x7034, 0x20e8, 0x2061, 0x18b8, 0x2c44, 0xa28c, 0xa390, + 0xa494, 0xa598, 0x0804, 0x4e8e, 0x7124, 0x810b, 0x0804, 0x35ab, + 0x2029, 0x007e, 0x7984, 0x7a88, 0x7b8c, 0x7c98, 0x9184, 0xff00, + 0x8007, 0x90e2, 0x0020, 0x0a04, 0x35e0, 0x9502, 0x0a04, 0x35e0, + 0x9184, 0x00ff, 0x90e2, 0x0020, 0x0a04, 0x35e0, 0x9502, 0x0a04, + 0x35e0, 0x9284, 0xff00, 0x8007, 0x90e2, 0x0020, 0x0a04, 0x35e0, + 0x9502, 0x0a04, 0x35e0, 0x9284, 0x00ff, 0x90e2, 0x0020, 0x0a04, + 0x35e0, 0x9502, 0x0a04, 0x35e0, 0x9384, 0xff00, 0x8007, 0x90e2, + 0x0020, 0x0a04, 0x35e0, 0x9502, 0x0a04, 0x35e0, 0x9384, 0x00ff, + 0x90e2, 0x0020, 0x0a04, 0x35e0, 0x9502, 0x0a04, 0x35e0, 0x9484, + 0xff00, 0x8007, 0x90e2, 0x0020, 0x0a04, 0x35e0, 0x9502, 0x0a04, + 0x35e0, 0x9484, 0x00ff, 0x90e2, 0x0020, 0x0a04, 0x35e0, 0x9502, + 0x0a04, 0x35e0, 0x2061, 0x198a, 0x6102, 0x6206, 0x630a, 0x640e, + 0x0804, 0x35ab, 0x080c, 0x4b89, 0x0904, 0x35dd, 0x2009, 0x0016, + 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0xa85c, 0x9080, 0x0019, 0xaf60, + 0x080c, 0x4bd2, 0x701f, 0x4fc5, 0x0005, 0x2001, 0x0138, 0x2003, + 0x0000, 0x00e6, 0x2071, 0x0300, 0x701c, 0xd0a4, 0x1de8, 0x00ee, + 0x20a9, 0x0016, 0x896e, 0x8d6e, 0x8d6f, 0x9d84, 0xffc0, 0x9080, + 0x0019, 0x2098, 0x9d84, 0x003f, 0x20e0, 0x2069, 0x1877, 0x20e9, + 0x0001, 0x2da0, 0x4003, 0x6800, 0x9005, 0x0904, 0x5046, 0x6804, + 0x2008, 0x918c, 0xfff8, 0x1904, 0x5046, 0x680c, 0x9005, 0x0904, + 0x5046, 0x9082, 0xff01, 0x1a04, 0x5046, 0x6810, 0x9082, 0x005c, + 0x0a04, 0x5046, 0x6824, 0x2008, 0x9082, 0x0008, 0x0a04, 0x5046, + 0x9182, 0x0400, 0x1a04, 0x5046, 0x0056, 0x2029, 0x0000, 0x080c, + 0x8d49, 0x005e, 0x6944, 0x6820, 0x9102, 0x06c0, 0x6820, 0x9082, + 0x0019, 0x16a0, 0x6828, 0x6944, 0x810c, 0x9102, 0x0678, 0x6840, + 0x9082, 0x000f, 0x1658, 0x080c, 0x1027, 0x2900, 0x0904, 0x5062, + 0x684e, 0x00e6, 0x2071, 0x1932, 0x00b6, 0x2059, 0x0000, 0x080c, + 0x8c05, 0x00be, 0x00ee, 0x0568, 0x080c, 0x8950, 0x080c, 0x899f, + 0x11e0, 0x6857, 0x0000, 0x00c6, 0x2061, 0x0100, 0x6104, 0x918d, + 0x2000, 0x6106, 0x6b10, 0x2061, 0x1a66, 0x630a, 0x00ce, 0x080c, + 0x29ac, 0x2001, 0x0138, 0x2102, 0x0804, 0x35ab, 0x080c, 0x29ac, + 0x2001, 0x0138, 0x2102, 0x0804, 0x35e0, 0x080c, 0x8998, 0x00e6, + 0x2071, 0x1932, 0x080c, 0x8dc9, 0x080c, 0x8dd8, 0x080c, 0x8be8, + 0x00ee, 0x2001, 0x188a, 0x204c, 0x080c, 0x1040, 0x2001, 0x188a, + 0x2003, 0x0000, 0x080c, 0x29ac, 0x2001, 0x0138, 0x2102, 0x0804, + 0x35dd, 0x2001, 0x1926, 0x200c, 0x918e, 0x0000, 0x0904, 0x50c7, + 0x080c, 0x8be3, 0x0904, 0x50c7, 0x2001, 0x0101, 0x200c, 0x918c, + 0xdfff, 0x2102, 0x2001, 0x0138, 0x2003, 0x0000, 0x00e6, 0x2071, + 0x0300, 0x701c, 0xd0a4, 0x1de8, 0x00ee, 0x080c, 0x8be8, 0x0126, + 0x2091, 0x8000, 0x2001, 0x0035, 0x080c, 0x1611, 0x012e, 0x00c6, + 0x2061, 0x193e, 0x6004, 0x6100, 0x9106, 0x1de0, 0x00ce, 0x080c, + 0x29ac, 0x2001, 0x0138, 0x2102, 0x00e6, 0x00f6, 0x2071, 0x1925, + 0x080c, 0x8b22, 0x0120, 0x2f00, 0x080c, 0x8bae, 0x0cc8, 0x00fe, + 0x00ee, 0x0126, 0x2091, 0x8000, 0x2001, 0x188a, 0x200c, 0x81ff, + 0x0138, 0x2148, 0x080c, 0x1040, 0x2001, 0x188a, 0x2003, 0x0000, + 0x2001, 0x183d, 0x2003, 0x0020, 0x080c, 0x8998, 0x00e6, 0x2071, + 0x1932, 0x080c, 0x8dc9, 0x080c, 0x8dd8, 0x00ee, 0x012e, 0x0804, + 0x35ab, 0x0006, 0x080c, 0x57d3, 0xd0cc, 0x000e, 0x0005, 0x0006, + 0x080c, 0x57d7, 0xd0bc, 0x000e, 0x0005, 0x6174, 0x7a84, 0x6300, + 0x82ff, 0x1118, 0x7986, 0x0804, 0x35ab, 0x83ff, 0x1904, 0x35e0, + 0x2001, 0xfff0, 0x9200, 0x1a04, 0x35e0, 0x2019, 0xffff, 0x6078, + 0x9302, 0x9200, 0x0a04, 0x35e0, 0x7986, 0x6276, 0x0804, 0x35ab, + 0x080c, 0x57e7, 0x1904, 0x35dd, 0x7c88, 0x7d84, 0x7e98, 0x7f8c, + 0x080c, 0x4b89, 0x0904, 0x35dd, 0x900e, 0x901e, 0x7326, 0x7332, + 0xa860, 0x20e8, 0x7036, 0xa85c, 0x9080, 0x0003, 0x702a, 0x20a0, + 0x91d8, 0x1000, 0x2b5c, 0x8bff, 0x0178, 0x080c, 0x6a92, 0x0118, + 0x080c, 0x6a9a, 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, 0x91b1, 0x2208, 0x0804, 0x35ab, 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, + 0x514a, 0x0005, 0x7030, 0x9005, 0x1178, 0x7120, 0x7028, 0x20a0, + 0x901e, 0x7034, 0x20e8, 0x2061, 0x18b8, 0x2c44, 0xa48c, 0xa590, + 0xa694, 0xa798, 0x0804, 0x5108, 0x7224, 0x900e, 0x2001, 0x0003, + 0x080c, 0x91b1, 0x2208, 0x0804, 0x35ab, 0x00f6, 0x00e6, 0x080c, + 0x57e7, 0x2009, 0x0007, 0x1904, 0x51dd, 0x2071, 0x189e, 0x745c, + 0x84ff, 0x2009, 0x000e, 0x1904, 0x51dd, 0xac9c, 0xad98, 0xaea4, + 0xafa0, 0x0096, 0x080c, 0x1027, 0x2009, 0x0002, 0x0904, 0x51dd, + 0x2900, 0x705e, 0x900e, 0x901e, 0x7356, 0x7362, 0xa860, 0x7066, + 0xa85c, 0x9080, 0x0003, 0x705a, 0x20a0, 0x91d8, 0x1000, 0x2b5c, + 0x8bff, 0x0178, 0x080c, 0x6a92, 0x0118, 0x080c, 0x6a9a, 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, + 0x91b1, 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, 0x51e9, 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, 0x91b1, 0xaa9a, 0x715c, + 0x81ff, 0x090c, 0x0dc5, 0x2148, 0x080c, 0x1040, 0x705f, 0x0000, + 0xa0a0, 0x2048, 0x0126, 0x2091, 0x8000, 0x080c, 0x6dd1, 0x012e, + 0xa09f, 0x0000, 0xa0a3, 0x0000, 0x00ee, 0x00fe, 0x0005, 0x91d8, + 0x1000, 0x2b5c, 0x8bff, 0x0178, 0x080c, 0x6a92, 0x0118, 0x080c, + 0x6a9a, 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, 0x6dd1, 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, + 0x35e0, 0xa884, 0xa988, 0x080c, 0x2894, 0x1518, 0x080c, 0x66b2, + 0x1500, 0x7126, 0xbe12, 0xbd16, 0xae7c, 0x080c, 0x4b89, 0x01c8, + 0x080c, 0x4b89, 0x01b0, 0x009e, 0xa867, 0x0000, 0xa868, 0xc0fd, + 0xa86a, 0xa823, 0x0000, 0xa804, 0x2048, 0x080c, 0xd002, 0x1120, + 0x2009, 0x0003, 0x0804, 0x35dd, 0x7007, 0x0003, 0x701f, 0x52b6, + 0x0005, 0x009e, 0x2009, 0x0002, 0x0804, 0x35dd, 0x7124, 0x080c, + 0x3342, 0xa820, 0x9086, 0x8001, 0x1120, 0x2009, 0x0004, 0x0804, + 0x35dd, 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, 0x4bd5, 0x97c6, 0x7200, 0x11b8, 0x96c2, + 0x0054, 0x02a0, 0x000e, 0x007e, 0x2061, 0x18b8, 0x2c44, 0xa076, + 0xa772, 0xa07b, 0x002a, 0xa28e, 0xa392, 0xa496, 0xa59a, 0x080c, + 0x10f8, 0x7007, 0x0002, 0x701f, 0x5312, 0x0005, 0x000e, 0x007e, + 0x0804, 0x35e0, 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, 0x4bd5, 0x81ff, 0x1904, + 0x35dd, 0x798c, 0x2001, 0x197f, 0x918c, 0x8000, 0x2102, 0x080c, + 0x4ba0, 0x0904, 0x35e0, 0x080c, 0x6a92, 0x0120, 0x080c, 0x6a9a, + 0x1904, 0x35e0, 0x080c, 0x67e4, 0x0904, 0x35dd, 0x0126, 0x2091, + 0x8000, 0x080c, 0x68aa, 0x012e, 0x0904, 0x35dd, 0x2001, 0x197f, + 0x2004, 0xd0fc, 0x1904, 0x35ab, 0x0804, 0x45e1, 0xa9a0, 0x2001, + 0x197f, 0x918c, 0x8000, 0xc18d, 0x2102, 0x080c, 0x4bad, 0x01a0, + 0x080c, 0x6a92, 0x0118, 0x080c, 0x6a9a, 0x1170, 0x080c, 0x67e4, + 0x2009, 0x0002, 0x0128, 0x080c, 0x68aa, 0x1170, 0x2009, 0x0003, + 0xa897, 0x4005, 0xa99a, 0x0010, 0xa897, 0x4006, 0x900e, 0x9085, + 0x0001, 0x2001, 0x0030, 0x0005, 0xa897, 0x4000, 0x2001, 0x197f, + 0x2004, 0xd0fc, 0x1128, 0x080c, 0x57db, 0x0110, 0x9006, 0x0018, + 0x900e, 0x9085, 0x0001, 0x2001, 0x0000, 0x0005, 0x78a8, 0xd08c, + 0x1118, 0xd084, 0x0904, 0x4556, 0x080c, 0x4bbc, 0x0904, 0x35e0, + 0x080c, 0x4b89, 0x1120, 0x2009, 0x0002, 0x0804, 0x35dd, 0x080c, + 0x6a92, 0x0130, 0x908e, 0x0004, 0x0118, 0x908e, 0x0005, 0x15a0, + 0x78a8, 0xd08c, 0x0120, 0xb800, 0xc08c, 0xb802, 0x0028, 0x080c, + 0x57d3, 0xd0b4, 0x0904, 0x4590, 0x7884, 0x908e, 0x007e, 0x0904, + 0x4590, 0x908e, 0x007f, 0x0904, 0x4590, 0x908e, 0x0080, 0x0904, + 0x4590, 0xb800, 0xd08c, 0x1904, 0x4590, 0xa867, 0x0000, 0xa868, + 0xc0fd, 0xa86a, 0x080c, 0xd021, 0x1120, 0x2009, 0x0003, 0x0804, + 0x35dd, 0x7007, 0x0003, 0x701f, 0x53de, 0x0005, 0x080c, 0x4bbc, + 0x0904, 0x35e0, 0x0804, 0x4590, 0x080c, 0x339b, 0x0108, 0x0005, + 0x2009, 0x1834, 0x210c, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, + 0x35dd, 0x080c, 0x57e7, 0x0120, 0x2009, 0x0007, 0x0804, 0x35dd, + 0x080c, 0x6a8a, 0x0120, 0x2009, 0x0008, 0x0804, 0x35dd, 0xb89c, + 0xd0a4, 0x1118, 0xd0ac, 0x1904, 0x4590, 0x9006, 0xa866, 0xa832, + 0xa868, 0xc0fd, 0xa86a, 0x080c, 0xd080, 0x1120, 0x2009, 0x0003, + 0x0804, 0x35dd, 0x7007, 0x0003, 0x701f, 0x5417, 0x0005, 0xa830, + 0x9086, 0x0100, 0x1120, 0x2009, 0x0004, 0x0804, 0x5727, 0x080c, + 0x4bbc, 0x0904, 0x35e0, 0x0804, 0x53b0, 0x81ff, 0x2009, 0x0001, + 0x1904, 0x35dd, 0x080c, 0x57e7, 0x2009, 0x0007, 0x1904, 0x35dd, + 0x080c, 0x6a8a, 0x0120, 0x2009, 0x0008, 0x0804, 0x35dd, 0x080c, + 0x4bbc, 0x0904, 0x35e0, 0x080c, 0x6a92, 0x2009, 0x0009, 0x1904, + 0x35dd, 0x080c, 0x4b89, 0x2009, 0x0002, 0x0904, 0x35dd, 0x9006, + 0xa866, 0xa832, 0xa868, 0xc0fd, 0xa86a, 0x7988, 0xa95a, 0x9194, + 0xfd00, 0x918c, 0x00ff, 0x9006, 0x82ff, 0x1128, 0xc0ed, 0xa952, + 0x798c, 0xa956, 0x0038, 0x928e, 0x0100, 0x1904, 0x35e0, 0xc0e5, + 0xa952, 0xa956, 0xa83e, 0x080c, 0xd2d3, 0x2009, 0x0003, 0x0904, + 0x35dd, 0x7007, 0x0003, 0x701f, 0x546e, 0x0005, 0xa830, 0x9086, + 0x0100, 0x2009, 0x0004, 0x0904, 0x35dd, 0x0804, 0x35ab, 0x7aa8, + 0x9284, 0xc000, 0x0148, 0xd2ec, 0x01a0, 0x080c, 0x57e7, 0x1188, + 0x2009, 0x0014, 0x0804, 0x35dd, 0xd2dc, 0x1578, 0x81ff, 0x2009, + 0x0001, 0x1904, 0x35dd, 0x080c, 0x57e7, 0x2009, 0x0007, 0x1904, + 0x35dd, 0xd2f4, 0x0138, 0x9284, 0x5000, 0xc0d5, 0x080c, 0x57ad, + 0x0804, 0x35ab, 0xd2fc, 0x0160, 0x080c, 0x4bbc, 0x0904, 0x35e0, + 0x7984, 0x9284, 0x9000, 0xc0d5, 0x080c, 0x5782, 0x0804, 0x35ab, + 0x080c, 0x4bbc, 0x0904, 0x35e0, 0xb804, 0x9084, 0x00ff, 0x9086, + 0x0006, 0x2009, 0x0009, 0x1904, 0x555d, 0x080c, 0x4b89, 0x2009, + 0x0002, 0x0904, 0x555d, 0xa85c, 0x9080, 0x001b, 0xaf60, 0x2009, + 0x0008, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x080c, 0x4bd2, 0x701f, + 0x54ca, 0x0005, 0xa86c, 0x9086, 0x0500, 0x1138, 0xa870, 0x9005, + 0x1120, 0xa874, 0x9084, 0xff00, 0x0110, 0x1904, 0x35e0, 0xa866, + 0xa832, 0xa868, 0xc0fd, 0xa86a, 0x080c, 0x4bbc, 0x1110, 0x0804, + 0x35e0, 0x2009, 0x0043, 0x080c, 0xd33f, 0x2009, 0x0003, 0x0904, + 0x555d, 0x7007, 0x0003, 0x701f, 0x54ee, 0x0005, 0xa830, 0x9086, + 0x0100, 0x2009, 0x0004, 0x0904, 0x555d, 0x7984, 0x7aa8, 0x9284, + 0x1000, 0xc0d5, 0x080c, 0x5782, 0x0804, 0x35ab, 0x00c6, 0xaab0, + 0x9284, 0xc000, 0x0148, 0xd2ec, 0x0170, 0x080c, 0x57e7, 0x1158, + 0x2009, 0x0014, 0x0804, 0x554c, 0x2061, 0x1800, 0x080c, 0x57e7, + 0x2009, 0x0007, 0x15c8, 0xd2f4, 0x0130, 0x9284, 0x5000, 0xc0d5, + 0x080c, 0x57ad, 0x0058, 0xd2fc, 0x0180, 0x080c, 0x4bba, 0x0590, + 0xa998, 0x9284, 0x9000, 0xc0d5, 0x080c, 0x5782, 0xa87b, 0x0000, + 0xa883, 0x0000, 0xa897, 0x4000, 0x0438, 0x080c, 0x4bba, 0x0510, + 0x080c, 0x6a92, 0x2009, 0x0009, 0x11b8, 0xa8c4, 0x9086, 0x0500, + 0x11c8, 0xa8c8, 0x9005, 0x11b0, 0xa8cc, 0x9084, 0xff00, 0x1190, + 0x080c, 0x4bba, 0x1108, 0x0070, 0x2009, 0x004b, 0x080c, 0xd33f, + 0x2009, 0x0003, 0x0108, 0x0078, 0x0431, 0x19c0, 0xa897, 0x4005, + 0xa99a, 0x0010, 0xa897, 0x4006, 0x900e, 0x9085, 0x0001, 0x2001, + 0x0030, 0x00ce, 0x0005, 0x9006, 0x0ce0, 0x7aa8, 0xd2dc, 0x0904, + 0x35dd, 0x0016, 0x7984, 0x9284, 0x1000, 0xc0fd, 0x080c, 0x5782, + 0x001e, 0x1904, 0x35dd, 0x0804, 0x35ab, 0x00f6, 0x2d78, 0xaab0, + 0x0021, 0x00fe, 0x0005, 0xaab0, 0xc2d5, 0xd2dc, 0x0150, 0x0016, + 0xa998, 0x9284, 0x1400, 0xc0fd, 0x080c, 0x5782, 0x001e, 0x9085, + 0x0001, 0x0005, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x35dd, + 0x080c, 0x57e7, 0x0120, 0x2009, 0x0007, 0x0804, 0x35dd, 0x7984, + 0x7ea8, 0x96b4, 0x00ff, 0x080c, 0x671d, 0x1904, 0x35e0, 0x9186, + 0x007f, 0x0138, 0x080c, 0x6a92, 0x0120, 0x2009, 0x0009, 0x0804, + 0x35dd, 0x080c, 0x4b89, 0x1120, 0x2009, 0x0002, 0x0804, 0x35dd, + 0xa867, 0x0000, 0xa868, 0xc0fd, 0xa86a, 0x2001, 0x0100, 0x8007, + 0xa80a, 0x080c, 0xd03b, 0x1120, 0x2009, 0x0003, 0x0804, 0x35dd, + 0x7007, 0x0003, 0x701f, 0x55bd, 0x0005, 0xa808, 0x8007, 0x9086, + 0x0100, 0x1120, 0x2009, 0x0004, 0x0804, 0x35dd, 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, 0x4bd5, 0x080c, 0x4b89, 0x1120, 0x2009, + 0x0002, 0x0804, 0x35dd, 0x7984, 0x9194, 0xff00, 0x918c, 0x00ff, + 0x8217, 0x82ff, 0x1118, 0x7023, 0x19b5, 0x0040, 0x92c6, 0x0001, + 0x1118, 0x7023, 0x19cf, 0x0010, 0x0804, 0x35e0, 0x2009, 0x001a, + 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0xa85c, 0x9080, 0x0019, 0xaf60, + 0x080c, 0x4bd2, 0x701f, 0x560d, 0x0005, 0x2001, 0x182e, 0x2003, + 0x0001, 0xa85c, 0x9080, 0x0019, 0x2098, 0xa860, 0x20e0, 0x20a9, + 0x001a, 0x7020, 0x20a0, 0x20e9, 0x0001, 0x4003, 0x0804, 0x35ab, + 0x080c, 0x4b89, 0x1120, 0x2009, 0x0002, 0x0804, 0x35dd, 0x7984, + 0x9194, 0xff00, 0x918c, 0x00ff, 0x8217, 0x82ff, 0x1118, 0x2099, + 0x19b5, 0x0040, 0x92c6, 0x0001, 0x1118, 0x2099, 0x19cf, 0x0010, + 0x0804, 0x35e0, 0xa85c, 0x9080, 0x0019, 0x20a0, 0xa860, 0x20e8, + 0x20a9, 0x001a, 0x20e1, 0x0001, 0x4003, 0x2009, 0x001a, 0x7a8c, + 0x7b88, 0x7c9c, 0x7d98, 0xa85c, 0x9080, 0x0019, 0xaf60, 0x0804, + 0x4bd5, 0x7884, 0x908a, 0x1000, 0x1a04, 0x35e0, 0x0126, 0x2091, + 0x8000, 0x8003, 0x800b, 0x810b, 0x9108, 0x00c6, 0x2061, 0x19fc, + 0x614a, 0x00ce, 0x012e, 0x0804, 0x35ab, 0x00c6, 0x080c, 0x7569, + 0x1160, 0x080c, 0x784e, 0x080c, 0x6127, 0x9085, 0x0001, 0x080c, + 0x75ad, 0x080c, 0x7495, 0x080c, 0x0dc5, 0x2061, 0x1800, 0x6030, + 0xc09d, 0x6032, 0x080c, 0x5fe6, 0x00ce, 0x0005, 0x00c6, 0x2001, + 0x1800, 0x2004, 0x908e, 0x0000, 0x0904, 0x35dd, 0x7884, 0x9005, + 0x0188, 0x7888, 0x2061, 0x199d, 0x2c0c, 0x2062, 0x080c, 0x2c62, + 0x01a0, 0x080c, 0x2c6a, 0x0188, 0x080c, 0x2c72, 0x0170, 0x2162, + 0x0804, 0x35e0, 0x2061, 0x0100, 0x6038, 0x9086, 0x0007, 0x1118, + 0x2009, 0x0001, 0x0010, 0x2009, 0x0000, 0x7884, 0x9086, 0x0002, + 0x1568, 0x2061, 0x0100, 0x6028, 0xc09c, 0x602a, 0x0026, 0x2011, + 0x0003, 0x080c, 0xa8ed, 0x2011, 0x0002, 0x080c, 0xa8f7, 0x002e, + 0x080c, 0xa801, 0x0036, 0x901e, 0x080c, 0xa877, 0x003e, 0x60e3, + 0x0000, 0x080c, 0xedfa, 0x080c, 0xee15, 0x9085, 0x0001, 0x080c, + 0x75ad, 0x9006, 0x080c, 0x2d52, 0x2001, 0x1800, 0x2003, 0x0004, + 0x2001, 0x19a9, 0x2003, 0x0000, 0x6027, 0x0008, 0x00ce, 0x0804, + 0x35ab, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x35dd, 0x080c, + 0x57e7, 0x0120, 0x2009, 0x0007, 0x0804, 0x35dd, 0x7984, 0x7ea8, + 0x96b4, 0x00ff, 0x080c, 0x671d, 0x1904, 0x35e0, 0x9186, 0x007f, + 0x0138, 0x080c, 0x6a92, 0x0120, 0x2009, 0x0009, 0x0804, 0x35dd, + 0x080c, 0x4b89, 0x1120, 0x2009, 0x0002, 0x0804, 0x35dd, 0xa867, + 0x0000, 0xa868, 0xc0fd, 0xa86a, 0x080c, 0xd03e, 0x1120, 0x2009, + 0x0003, 0x0804, 0x35dd, 0x7007, 0x0003, 0x701f, 0x5710, 0x0005, + 0xa830, 0x9086, 0x0100, 0x1120, 0x2009, 0x0004, 0x0804, 0x35dd, + 0xa8e0, 0xa866, 0xa834, 0x8007, 0x800c, 0xa85c, 0x9080, 0x000c, + 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0xaf60, 0x0804, 0x4bd5, 0xa898, + 0x9086, 0x000d, 0x1904, 0x35dd, 0x2021, 0x4005, 0x0126, 0x2091, + 0x8000, 0x0e04, 0x5734, 0x0010, 0x012e, 0x0cc0, 0x7c36, 0x9486, + 0x4000, 0x0118, 0x7833, 0x0011, 0x0010, 0x7833, 0x0010, 0x7883, + 0x4005, 0xa998, 0x7986, 0xa9a4, 0x799a, 0xa9a8, 0x799e, 0x080c, + 0x4bc5, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, + 0x11aa, 0x7007, 0x0001, 0x2091, 0x5000, 0x700f, 0x0000, 0x012e, + 0x0005, 0x0126, 0x2091, 0x8000, 0x00c6, 0x2061, 0x19fc, 0x7984, + 0x615a, 0x6156, 0x605f, 0x0000, 0x6053, 0x0009, 0x7898, 0x6072, + 0x789c, 0x606e, 0x7888, 0x606a, 0x788c, 0x6066, 0x2001, 0x1a0c, + 0x2044, 0x2001, 0x1a13, 0xa076, 0xa060, 0xa072, 0xa07b, 0x0001, + 0xa07f, 0x0002, 0xa06b, 0x0000, 0xa09f, 0x0000, 0x00ce, 0x012e, + 0x0804, 0x35ab, 0x0126, 0x2091, 0x8000, 0x00b6, 0x00c6, 0x90e4, + 0xc000, 0x0168, 0x0006, 0xd0d4, 0x0130, 0x0036, 0x2019, 0x0029, + 0x080c, 0x3360, 0x003e, 0x080c, 0xcea3, 0x000e, 0x1198, 0xd0e4, + 0x0160, 0x9180, 0x1000, 0x2004, 0x905d, 0x0160, 0x080c, 0x6141, + 0x080c, 0xb06b, 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, 0x5782, 0x002e, 0x001e, 0x8108, 0x1f04, 0x57b5, + 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, 0x35e0, 0x9182, 0x0081, 0x1a04, 0x35e0, 0x810c, + 0x0016, 0x080c, 0x4b89, 0x0170, 0x080c, 0x0f16, 0x2100, 0x2238, + 0x7d84, 0x7c88, 0x7b8c, 0x7a90, 0x001e, 0x080c, 0x4bd2, 0x701f, + 0x5817, 0x0005, 0x001e, 0x2009, 0x0002, 0x0804, 0x35dd, 0x2079, + 0x0000, 0x7d94, 0x7c98, 0x7ba8, 0x7aac, 0x79a4, 0x810c, 0x2061, + 0x18b8, 0x2c44, 0xa770, 0xa074, 0x2071, 0x189e, 0x080c, 0x4bd5, + 0x701f, 0x582b, 0x0005, 0x2061, 0x18b8, 0x2c44, 0x0016, 0x0026, + 0xa270, 0xa174, 0x080c, 0x0f1e, 0x002e, 0x001e, 0x080c, 0x0fcb, + 0x9006, 0xa802, 0xa806, 0x0804, 0x35ab, 0x0126, 0x0156, 0x0136, + 0x0146, 0x01c6, 0x01d6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x2061, + 0x0100, 0x2069, 0x0200, 0x2071, 0x1800, 0x6044, 0xd0a4, 0x11e8, + 0xd084, 0x0118, 0x080c, 0x59e6, 0x0068, 0xd08c, 0x0118, 0x080c, + 0x58ef, 0x0040, 0xd094, 0x0118, 0x080c, 0x58bf, 0x0018, 0xd09c, + 0x0108, 0x0099, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x01de, 0x01ce, + 0x014e, 0x013e, 0x015e, 0x012e, 0x0005, 0x0016, 0x6128, 0xd19c, + 0x1110, 0xc19d, 0x612a, 0x001e, 0x0c68, 0x0006, 0x7098, 0x9005, + 0x000e, 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, 0x60a3, 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, 0x5f89, 0x080c, 0x87a1, 0x0005, 0x2001, + 0x1869, 0x2004, 0xd08c, 0x0110, 0x705f, 0xffff, 0x7088, 0x9005, + 0x1528, 0x2011, 0x5f89, 0x080c, 0x8709, 0x6040, 0x9094, 0x0010, + 0x9285, 0x0020, 0x6042, 0x20a9, 0x00c8, 0x6044, 0xd08c, 0x1168, + 0x1f04, 0x58d5, 0x6242, 0x709b, 0x0000, 0x6040, 0x9094, 0x0010, + 0x9285, 0x0080, 0x6042, 0x6242, 0x0048, 0x6242, 0x709b, 0x0000, + 0x708f, 0x0000, 0x9006, 0x080c, 0x612c, 0x0000, 0x0005, 0x708c, + 0x908a, 0x0003, 0x1a0c, 0x0dc5, 0x000b, 0x0005, 0x58f9, 0x594a, + 0x59e5, 0x00f6, 0x0016, 0x6900, 0x918c, 0x0800, 0x708f, 0x0001, + 0x2001, 0x015d, 0x2003, 0x0000, 0x6803, 0x00fc, 0x20a9, 0x0004, + 0x6800, 0x9084, 0x00fc, 0x0120, 0x1f04, 0x5908, 0x080c, 0x0dc5, + 0x68a0, 0x68a2, 0x689c, 0x689e, 0x6898, 0x689a, 0xa001, 0x918d, + 0x1600, 0x6902, 0x001e, 0x6837, 0x0020, 0x080c, 0x6108, 0x2079, + 0x1c00, 0x7833, 0x1101, 0x7837, 0x0000, 0x20e1, 0x0001, 0x2099, + 0x1805, 0x20e9, 0x0001, 0x20a1, 0x1c0e, 0x20a9, 0x0004, 0x4003, + 0x080c, 0xadbc, 0x20e1, 0x0001, 0x2099, 0x1c00, 0x20e9, 0x0000, + 0x20a1, 0x0240, 0x20a9, 0x0014, 0x4003, 0x60c3, 0x000c, 0x600f, + 0x0000, 0x080c, 0x5fba, 0x00fe, 0x9006, 0x7092, 0x6043, 0x0008, + 0x6042, 0x0005, 0x00f6, 0x7090, 0x7093, 0x0000, 0x9025, 0x0904, + 0x59c2, 0x6020, 0xd0b4, 0x1904, 0x59c0, 0x71a0, 0x81ff, 0x0904, + 0x59ae, 0x9486, 0x000c, 0x1904, 0x59bb, 0x9480, 0x0018, 0x8004, + 0x20a8, 0x080c, 0x6101, 0x2011, 0x0260, 0x2019, 0x1c00, 0x220c, + 0x2304, 0x9106, 0x11e8, 0x8210, 0x8318, 0x1f04, 0x5967, 0x6043, + 0x0004, 0x2061, 0x0140, 0x605b, 0xbc94, 0x605f, 0xf0f0, 0x2061, + 0x0100, 0x6043, 0x0006, 0x708f, 0x0002, 0x709b, 0x0002, 0x2009, + 0x07d0, 0x2011, 0x5f90, 0x080c, 0x87a1, 0x080c, 0x6108, 0x04c0, + 0x080c, 0x6101, 0x2079, 0x0260, 0x7930, 0x918e, 0x1101, 0x1558, + 0x7834, 0x9005, 0x1540, 0x7900, 0x918c, 0x00ff, 0x1118, 0x7804, + 0x9005, 0x0190, 0x080c, 0x6101, 0x2011, 0x026e, 0x2019, 0x1805, + 0x20a9, 0x0004, 0x220c, 0x2304, 0x9102, 0x0230, 0x11a0, 0x8210, + 0x8318, 0x1f04, 0x59a2, 0x0078, 0x70a3, 0x0000, 0x080c, 0x6101, + 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, 0xadbc, 0x20e1, 0x0001, 0x2099, 0x1c00, 0x20e9, + 0x0000, 0x20a1, 0x0240, 0x20a9, 0x0014, 0x4003, 0x60c3, 0x000c, + 0x2011, 0x19f3, 0x2013, 0x0000, 0x7093, 0x0000, 0x60a3, 0x0056, + 0x60a7, 0x9575, 0x080c, 0xa50e, 0x08d8, 0x0005, 0x7098, 0x908a, + 0x001d, 0x1a0c, 0x0dc5, 0x000b, 0x0005, 0x5a17, 0x5a2a, 0x5a53, + 0x5a73, 0x5a99, 0x5ac8, 0x5aee, 0x5b26, 0x5b4c, 0x5b7a, 0x5bb5, + 0x5bed, 0x5c0b, 0x5c36, 0x5c58, 0x5c73, 0x5c7d, 0x5cb1, 0x5cd7, + 0x5d06, 0x5d2c, 0x5d64, 0x5da8, 0x5de5, 0x5e06, 0x5e5f, 0x5e81, + 0x5eaf, 0x5eaf, 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, 0x5f90, 0x080c, + 0x87a1, 0x0005, 0x00f6, 0x7090, 0x9086, 0x0014, 0x1510, 0x6042, + 0x6020, 0xd0b4, 0x11f0, 0x080c, 0x6101, 0x2079, 0x0260, 0x7a30, + 0x9296, 0x1102, 0x11a0, 0x7834, 0x9005, 0x1188, 0x7a38, 0xd2fc, + 0x0128, 0x70c4, 0x9005, 0x1110, 0x70c7, 0x0001, 0x2011, 0x5f90, + 0x080c, 0x8709, 0x709b, 0x0010, 0x080c, 0x5c7d, 0x0010, 0x7093, + 0x0000, 0x00fe, 0x0005, 0x00f6, 0x709b, 0x0003, 0x6043, 0x0004, + 0x2011, 0x5f90, 0x080c, 0x8709, 0x080c, 0x6085, 0x2079, 0x0240, + 0x7833, 0x1102, 0x7837, 0x0000, 0x20a9, 0x0008, 0x9f88, 0x000e, + 0x200b, 0x0000, 0x8108, 0x1f04, 0x5a68, 0x60c3, 0x0014, 0x080c, + 0x5fba, 0x00fe, 0x0005, 0x00f6, 0x7090, 0x9005, 0x0500, 0x2011, + 0x5f90, 0x080c, 0x8709, 0x9086, 0x0014, 0x11b8, 0x080c, 0x6101, + 0x2079, 0x0260, 0x7a30, 0x9296, 0x1102, 0x1178, 0x7834, 0x9005, + 0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70c4, 0x9005, 0x1110, 0x70c7, + 0x0001, 0x709b, 0x0004, 0x0029, 0x0010, 0x080c, 0x60dd, 0x00fe, + 0x0005, 0x00f6, 0x709b, 0x0005, 0x080c, 0x6085, 0x2079, 0x0240, + 0x7833, 0x1103, 0x7837, 0x0000, 0x080c, 0x6101, 0x080c, 0x60e4, + 0x1170, 0x7084, 0x9005, 0x1158, 0x715c, 0x9186, 0xffff, 0x0138, + 0x2011, 0x0008, 0x080c, 0x5f3d, 0x0168, 0x080c, 0x60ba, 0x20a9, + 0x0008, 0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9, 0x0000, 0x20a1, + 0x024e, 0x4003, 0x60c3, 0x0014, 0x080c, 0x5fba, 0x00fe, 0x0005, + 0x00f6, 0x7090, 0x9005, 0x0500, 0x2011, 0x5f90, 0x080c, 0x8709, + 0x9086, 0x0014, 0x11b8, 0x080c, 0x6101, 0x2079, 0x0260, 0x7a30, + 0x9296, 0x1103, 0x1178, 0x7834, 0x9005, 0x1160, 0x7a38, 0xd2fc, + 0x0128, 0x70c4, 0x9005, 0x1110, 0x70c7, 0x0001, 0x709b, 0x0006, + 0x0029, 0x0010, 0x080c, 0x60dd, 0x00fe, 0x0005, 0x00f6, 0x709b, + 0x0007, 0x080c, 0x6085, 0x2079, 0x0240, 0x7833, 0x1104, 0x7837, + 0x0000, 0x080c, 0x6101, 0x080c, 0x60e4, 0x11b8, 0x7084, 0x9005, + 0x11a0, 0x7164, 0x9186, 0xffff, 0x0180, 0x9180, 0x33ac, 0x200d, + 0x918c, 0xff00, 0x810f, 0x2011, 0x0008, 0x080c, 0x5f3d, 0x0180, + 0x080c, 0x50cf, 0x0110, 0x080c, 0x28fd, 0x20a9, 0x0008, 0x20e1, + 0x0000, 0x2099, 0x026e, 0x20e9, 0x0000, 0x20a1, 0x024e, 0x4003, + 0x60c3, 0x0014, 0x080c, 0x5fba, 0x00fe, 0x0005, 0x00f6, 0x7090, + 0x9005, 0x0500, 0x2011, 0x5f90, 0x080c, 0x8709, 0x9086, 0x0014, + 0x11b8, 0x080c, 0x6101, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1104, + 0x1178, 0x7834, 0x9005, 0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70c4, + 0x9005, 0x1110, 0x70c7, 0x0001, 0x709b, 0x0008, 0x0029, 0x0010, + 0x080c, 0x60dd, 0x00fe, 0x0005, 0x00f6, 0x709b, 0x0009, 0x080c, + 0x6085, 0x2079, 0x0240, 0x7833, 0x1105, 0x7837, 0x0100, 0x080c, + 0x60e4, 0x1150, 0x7084, 0x9005, 0x1138, 0x080c, 0x5eb0, 0x1188, + 0x9085, 0x0001, 0x080c, 0x28fd, 0x20a9, 0x0008, 0x080c, 0x6101, + 0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9, 0x0000, 0x20a1, 0x024e, + 0x4003, 0x60c3, 0x0014, 0x080c, 0x5fba, 0x0010, 0x080c, 0x5a0a, + 0x00fe, 0x0005, 0x00f6, 0x7090, 0x9005, 0x05a8, 0x2011, 0x5f90, + 0x080c, 0x8709, 0x9086, 0x0014, 0x1560, 0x080c, 0x6101, 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, 0x5c58, + 0x0010, 0x080c, 0x60dd, 0x00fe, 0x0005, 0x00f6, 0x709b, 0x000b, + 0x2011, 0x1c0e, 0x20e9, 0x0001, 0x22a0, 0x20a9, 0x0040, 0x2019, + 0xffff, 0x4304, 0x080c, 0x6085, 0x2079, 0x0240, 0x7833, 0x1106, + 0x7837, 0x0000, 0x080c, 0x60e4, 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, 0x5bda, 0x60c3, + 0x0084, 0x080c, 0x5fba, 0x00fe, 0x0005, 0x00f6, 0x7090, 0x9005, + 0x01c0, 0x2011, 0x5f90, 0x080c, 0x8709, 0x9086, 0x0084, 0x1178, + 0x080c, 0x6101, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1106, 0x1138, + 0x7834, 0x9005, 0x1120, 0x709b, 0x000c, 0x0029, 0x0010, 0x080c, + 0x60dd, 0x00fe, 0x0005, 0x00f6, 0x709b, 0x000d, 0x080c, 0x6085, + 0x2079, 0x0240, 0x7833, 0x1107, 0x7837, 0x0000, 0x080c, 0x6101, + 0x20a9, 0x0040, 0x2011, 0x026e, 0x2009, 0x024e, 0x220e, 0x8210, + 0x8108, 0x9186, 0x0260, 0x1150, 0x6810, 0x8000, 0x6812, 0x2009, + 0x0240, 0x6814, 0x8000, 0x6816, 0x2011, 0x0260, 0x1f04, 0x5c1e, + 0x60c3, 0x0084, 0x080c, 0x5fba, 0x00fe, 0x0005, 0x00f6, 0x7090, + 0x9005, 0x01e0, 0x2011, 0x5f90, 0x080c, 0x8709, 0x9086, 0x0084, + 0x1198, 0x080c, 0x6101, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1107, + 0x1158, 0x7834, 0x9005, 0x1140, 0x7097, 0x0001, 0x080c, 0x6057, + 0x709b, 0x000e, 0x0029, 0x0010, 0x080c, 0x60dd, 0x00fe, 0x0005, + 0x918d, 0x0001, 0x080c, 0x612c, 0x709b, 0x000f, 0x7093, 0x0000, + 0x2061, 0x0140, 0x605b, 0xbc85, 0x605f, 0xb5b5, 0x2061, 0x0100, + 0x6043, 0x0005, 0x6043, 0x0004, 0x2009, 0x07d0, 0x2011, 0x5f90, + 0x080c, 0x86fd, 0x0005, 0x7090, 0x9005, 0x0130, 0x2011, 0x5f90, + 0x080c, 0x8709, 0x709b, 0x0000, 0x0005, 0x709b, 0x0011, 0x080c, + 0xadbc, 0x080c, 0x6101, 0x20e1, 0x0000, 0x2099, 0x0260, 0x20e9, + 0x0000, 0x20a1, 0x0240, 0x7490, 0x9480, 0x0018, 0x9080, 0x0007, + 0x9084, 0x03f8, 0x8004, 0x20a8, 0x4003, 0x080c, 0x60e4, 0x11a0, + 0x717c, 0x81ff, 0x0188, 0x900e, 0x7080, 0x9084, 0x00ff, 0x0160, + 0x080c, 0x2894, 0x9186, 0x007e, 0x0138, 0x9186, 0x0080, 0x0120, + 0x2011, 0x0008, 0x080c, 0x5f3d, 0x60c3, 0x0014, 0x080c, 0x5fba, + 0x0005, 0x00f6, 0x7090, 0x9005, 0x0500, 0x2011, 0x5f90, 0x080c, + 0x8709, 0x9086, 0x0014, 0x11b8, 0x080c, 0x6101, 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, 0x6093, 0x2079, 0x0240, 0x7833, 0x1103, + 0x7837, 0x0000, 0x080c, 0x6101, 0x080c, 0x60e4, 0x1170, 0x7084, + 0x9005, 0x1158, 0x715c, 0x9186, 0xffff, 0x0138, 0x2011, 0x0008, + 0x080c, 0x5f3d, 0x0168, 0x080c, 0x60ba, 0x20a9, 0x0008, 0x20e1, + 0x0000, 0x2099, 0x026e, 0x20e9, 0x0000, 0x20a1, 0x024e, 0x4003, + 0x60c3, 0x0014, 0x080c, 0x5fba, 0x00fe, 0x0005, 0x00f6, 0x7090, + 0x9005, 0x0500, 0x2011, 0x5f90, 0x080c, 0x8709, 0x9086, 0x0014, + 0x11b8, 0x080c, 0x6101, 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, + 0x6093, 0x2079, 0x0240, 0x7833, 0x1104, 0x7837, 0x0000, 0x080c, + 0x6101, 0x080c, 0x60e4, 0x11b8, 0x7084, 0x9005, 0x11a0, 0x7164, + 0x9186, 0xffff, 0x0180, 0x9180, 0x33ac, 0x200d, 0x918c, 0xff00, + 0x810f, 0x2011, 0x0008, 0x080c, 0x5f3d, 0x0180, 0x080c, 0x50cf, + 0x0110, 0x080c, 0x28fd, 0x20a9, 0x0008, 0x20e1, 0x0000, 0x2099, + 0x026e, 0x20e9, 0x0000, 0x20a1, 0x024e, 0x4003, 0x60c3, 0x0014, + 0x080c, 0x5fba, 0x00fe, 0x0005, 0x00f6, 0x7090, 0x9005, 0x05f0, + 0x2011, 0x5f90, 0x080c, 0x8709, 0x9086, 0x0014, 0x15a8, 0x080c, + 0x6101, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1105, 0x1568, 0x7834, + 0x9084, 0x0100, 0x2011, 0x0100, 0x921e, 0x1168, 0x9085, 0x0001, + 0x080c, 0x612c, 0x7a38, 0xd2fc, 0x0128, 0x70c4, 0x9005, 0x1110, + 0x70c7, 0x0001, 0x0080, 0x9005, 0x11b8, 0x7a38, 0xd2fc, 0x0128, + 0x70c4, 0x9005, 0x1110, 0x70c7, 0x0001, 0x9085, 0x0001, 0x080c, + 0x612c, 0x7097, 0x0000, 0x7a38, 0xd2f4, 0x0110, 0x70df, 0x0008, + 0x709b, 0x0016, 0x0029, 0x0010, 0x7093, 0x0000, 0x00fe, 0x0005, + 0x080c, 0xadbc, 0x080c, 0x6101, 0x20e1, 0x0000, 0x2099, 0x0260, + 0x20e9, 0x0000, 0x20a1, 0x0240, 0x20a9, 0x000e, 0x4003, 0x2011, + 0x026d, 0x2204, 0x9084, 0x0100, 0x2011, 0x024d, 0x2012, 0x2011, + 0x026e, 0x709b, 0x0017, 0x080c, 0x60e4, 0x1150, 0x7084, 0x9005, + 0x1138, 0x080c, 0x5eb0, 0x1188, 0x9085, 0x0001, 0x080c, 0x28fd, + 0x20a9, 0x0008, 0x080c, 0x6101, 0x20e1, 0x0000, 0x2099, 0x026e, + 0x20e9, 0x0000, 0x20a1, 0x024e, 0x4003, 0x60c3, 0x0014, 0x080c, + 0x5fba, 0x0010, 0x080c, 0x5a0a, 0x0005, 0x00f6, 0x7090, 0x9005, + 0x01d8, 0x2011, 0x5f90, 0x080c, 0x8709, 0x9086, 0x0084, 0x1190, + 0x080c, 0x6101, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1106, 0x1150, + 0x7834, 0x9005, 0x1138, 0x9006, 0x080c, 0x612c, 0x709b, 0x0018, + 0x0029, 0x0010, 0x7093, 0x0000, 0x00fe, 0x0005, 0x00f6, 0x709b, + 0x0019, 0x080c, 0x6093, 0x2079, 0x0240, 0x7833, 0x1106, 0x7837, + 0x0000, 0x080c, 0x6101, 0x2009, 0x026e, 0x2039, 0x1c0e, 0x20a9, + 0x0040, 0x213e, 0x8738, 0x8108, 0x9186, 0x0280, 0x1128, 0x6814, + 0x8000, 0x6816, 0x2009, 0x0260, 0x1f04, 0x5e19, 0x2039, 0x1c0e, + 0x080c, 0x60e4, 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, + 0x5e4c, 0x60c3, 0x0084, 0x080c, 0x5fba, 0x00fe, 0x0005, 0x00f6, + 0x7090, 0x9005, 0x01e0, 0x2011, 0x5f90, 0x080c, 0x8709, 0x9086, + 0x0084, 0x1198, 0x080c, 0x6101, 0x2079, 0x0260, 0x7a30, 0x9296, + 0x1107, 0x1158, 0x7834, 0x9005, 0x1140, 0x7097, 0x0001, 0x080c, + 0x6057, 0x709b, 0x001a, 0x0029, 0x0010, 0x7093, 0x0000, 0x00fe, + 0x0005, 0x9085, 0x0001, 0x080c, 0x612c, 0x709b, 0x001b, 0x080c, + 0xadbc, 0x080c, 0x6101, 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, 0x5e98, 0x60c3, 0x0084, 0x080c, 0x5fba, 0x0005, 0x0005, + 0x0086, 0x0096, 0x2029, 0x1848, 0x252c, 0x20a9, 0x0008, 0x2041, + 0x1c0e, 0x20e9, 0x0001, 0x28a0, 0x080c, 0x6101, 0x20e1, 0x0000, + 0x2099, 0x026e, 0x4003, 0x20a9, 0x0008, 0x2011, 0x0007, 0xd5d4, + 0x0108, 0x9016, 0x2800, 0x9200, 0x200c, 0x91a6, 0xffff, 0x1148, + 0xd5d4, 0x0110, 0x8210, 0x0008, 0x8211, 0x1f04, 0x5eca, 0x0804, + 0x5f39, 0x82ff, 0x1160, 0xd5d4, 0x0120, 0x91a6, 0x3fff, 0x0d90, + 0x0020, 0x91a6, 0x3fff, 0x0904, 0x5f39, 0x918d, 0xc000, 0x20a9, + 0x0010, 0x2019, 0x0001, 0xd5d4, 0x0110, 0x2019, 0x0010, 0x2120, + 0xd5d4, 0x0110, 0x8423, 0x0008, 0x8424, 0x1240, 0xd5d4, 0x0110, + 0x8319, 0x0008, 0x8318, 0x1f04, 0x5ef0, 0x04d8, 0x23a8, 0x2021, + 0x0001, 0x8426, 0x8425, 0x1f04, 0x5f02, 0x2328, 0x8529, 0x92be, + 0x0007, 0x0158, 0x0006, 0x2039, 0x0007, 0x2200, 0x973a, 0x000e, + 0x27a8, 0x95a8, 0x0010, 0x1f04, 0x5f11, 0x755e, 0x95c8, 0x33ac, + 0x292d, 0x95ac, 0x00ff, 0x7582, 0x6532, 0x6536, 0x0016, 0x2508, + 0x080c, 0x28dd, 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, 0x33ac, 0x242d, 0x95ac, + 0x00ff, 0x7582, 0x6532, 0x6536, 0x0016, 0x2508, 0x080c, 0x28dd, + 0x001e, 0x60e7, 0x0000, 0x65ea, 0x7087, 0x0001, 0x9084, 0x0000, + 0x0005, 0x00e6, 0x2071, 0x1800, 0x708b, 0x0000, 0x00ee, 0x0005, + 0x00e6, 0x00f6, 0x2079, 0x0100, 0x2071, 0x0140, 0x080c, 0x6046, + 0x080c, 0xa517, 0x7004, 0x9084, 0x4000, 0x0110, 0x080c, 0x2d62, + 0x0126, 0x2091, 0x8000, 0x2071, 0x1826, 0x2073, 0x0000, 0x7840, + 0x0026, 0x0016, 0x2009, 0x00f7, 0x080c, 0x60a3, 0x001e, 0x9094, + 0x0010, 0x9285, 0x0080, 0x7842, 0x7a42, 0x002e, 0x012e, 0x00fe, + 0x00ee, 0x0005, 0x0126, 0x2091, 0x8000, 0x080c, 0x2be7, 0x0228, + 0x2011, 0x0101, 0x2204, 0xc0c5, 0x2012, 0x2011, 0x19f3, 0x2013, + 0x0000, 0x7093, 0x0000, 0x012e, 0x60a3, 0x0056, 0x60a7, 0x9575, + 0x080c, 0xa50e, 0x6144, 0xd184, 0x0120, 0x7198, 0x918d, 0x2000, + 0x0018, 0x718c, 0x918d, 0x1000, 0x2011, 0x199a, 0x2112, 0x2009, + 0x07d0, 0x2011, 0x5f90, 0x080c, 0x87a1, 0x0005, 0x0016, 0x0026, + 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, 0xb072, 0x2009, 0x00f7, + 0x080c, 0x60a3, 0x2061, 0x19fc, 0x900e, 0x611a, 0x611e, 0x617a, + 0x617e, 0x2061, 0x1800, 0x6003, 0x0001, 0x2061, 0x0100, 0x6043, + 0x0090, 0x6043, 0x0010, 0x2009, 0x199a, 0x200b, 0x0000, 0x2009, + 0x002d, 0x2011, 0x6012, 0x080c, 0x86fd, 0x012e, 0x00ce, 0x002e, + 0x001e, 0x0005, 0x00e6, 0x0006, 0x0126, 0x2091, 0x8000, 0x0471, + 0x2071, 0x0100, 0x080c, 0xa517, 0x2071, 0x0140, 0x7004, 0x9084, + 0x4000, 0x0110, 0x080c, 0x2d62, 0x080c, 0x7571, 0x0188, 0x080c, + 0x758c, 0x1170, 0x080c, 0x7858, 0x0016, 0x080c, 0x29ac, 0x2001, + 0x196e, 0x2102, 0x001e, 0x080c, 0x7853, 0x080c, 0x7495, 0x0050, + 0x2009, 0x0001, 0x080c, 0x2c80, 0x2001, 0x0001, 0x080c, 0x283d, + 0x080c, 0x5fe6, 0x012e, 0x000e, 0x00ee, 0x0005, 0x2001, 0x180e, + 0x2004, 0xd0bc, 0x0158, 0x0026, 0x0036, 0x2011, 0x8017, 0x2001, + 0x199a, 0x201c, 0x080c, 0x4be9, 0x003e, 0x002e, 0x0005, 0x20a9, + 0x0012, 0x20e9, 0x0001, 0x20a1, 0x1c80, 0x080c, 0x6101, 0x20e9, + 0x0000, 0x2099, 0x026e, 0x0099, 0x20a9, 0x0020, 0x080c, 0x60fb, + 0x2099, 0x0260, 0x20a1, 0x1c92, 0x0051, 0x20a9, 0x000e, 0x080c, + 0x60fe, 0x2099, 0x0260, 0x20a1, 0x1cb2, 0x0009, 0x0005, 0x0016, + 0x0026, 0x3410, 0x3308, 0x2104, 0x8007, 0x2012, 0x8108, 0x8210, + 0x1f04, 0x607b, 0x002e, 0x001e, 0x0005, 0x080c, 0xadbc, 0x20e1, + 0x0001, 0x2099, 0x1c00, 0x20e9, 0x0000, 0x20a1, 0x0240, 0x20a9, + 0x000c, 0x4003, 0x0005, 0x080c, 0xadbc, 0x080c, 0x6101, 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, 0x6a8e, 0x0158, 0x9006, + 0x2020, 0x2009, 0x002a, 0x080c, 0xe9a5, 0x2001, 0x180c, 0x200c, + 0xc195, 0x2102, 0x2019, 0x002a, 0x900e, 0x080c, 0x3211, 0x080c, + 0xd561, 0x0140, 0x0036, 0x2019, 0xffff, 0x2021, 0x0007, 0x080c, + 0x4da0, 0x003e, 0x004e, 0x001e, 0x0005, 0x080c, 0x5fe6, 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, 0x19a8, 0x0118, 0x2003, + 0x0001, 0x0010, 0x2003, 0x0000, 0x0005, 0x0156, 0x20a9, 0x0800, + 0x2009, 0x1000, 0x9006, 0x200a, 0x8108, 0x1f04, 0x613b, 0x015e, + 0x0005, 0x00d6, 0x0036, 0x0156, 0x0136, 0x0146, 0x2069, 0x1847, + 0x9006, 0xb802, 0xb8ce, 0xb807, 0x0707, 0xb80a, 0xb80e, 0xb812, + 0x9198, 0x33ac, 0x231d, 0x939c, 0x00ff, 0xbb16, 0x0016, 0x0026, + 0xb8c2, 0x080c, 0xb06b, 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, 0x8bc3, 0x00ce, 0x090c, 0x8f64, 0xb8af, + 0x0000, 0x6814, 0x9084, 0x00ff, 0xb842, 0x014e, 0x013e, 0x015e, + 0x003e, 0x00de, 0x0005, 0x0126, 0x2091, 0x8000, 0xa974, 0xae78, + 0x9684, 0x3fff, 0x9082, 0x4000, 0x1a04, 0x6229, 0x9182, 0x0800, + 0x1a04, 0x622d, 0x2001, 0x180c, 0x2004, 0x9084, 0x0003, 0x1904, + 0x6233, 0x9188, 0x1000, 0x2104, 0x905d, 0x0518, 0xb804, 0x9084, + 0x00ff, 0x908e, 0x0006, 0x1508, 0xb8a4, 0x900d, 0x1904, 0x6245, + 0xb850, 0x900d, 0x1148, 0xa802, 0x2900, 0xb852, 0xb84e, 0x080c, + 0x9358, 0x9006, 0x012e, 0x0005, 0x00a6, 0x2150, 0x2900, 0xb002, + 0xa803, 0x0000, 0x00ae, 0xb852, 0x0c90, 0x2001, 0x0005, 0x900e, + 0x04b8, 0x2001, 0x0028, 0x900e, 0x0498, 0x9082, 0x0006, 0x1290, + 0x080c, 0xb06b, 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, 0x6a92, 0x1990, + 0xb800, 0xd0bc, 0x0978, 0x0804, 0x61dc, 0x080c, 0x68b9, 0x0904, + 0x61f5, 0x0804, 0x61e0, 0x00b6, 0x00e6, 0x0126, 0x2091, 0x8000, + 0xa874, 0x908e, 0x00ff, 0x1120, 0x2001, 0x196c, 0x205c, 0x0060, + 0xa974, 0x9182, 0x0800, 0x1690, 0x9188, 0x1000, 0x2104, 0x905d, + 0x01d0, 0x080c, 0x6a32, 0x11d0, 0x080c, 0xb0ab, 0x0570, 0x2b00, + 0x6012, 0x2900, 0x6016, 0x6023, 0x0009, 0x600b, 0x0000, 0xa874, + 0x908e, 0x00ff, 0x1110, 0x600b, 0x8000, 0x2009, 0x0043, 0x080c, + 0xb180, 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, 0x6316, 0x9188, 0x1000, 0x2104, 0x905d, 0x0904, 0x62ee, + 0xb8a0, 0x9086, 0x007f, 0x0190, 0xa87c, 0xd0fc, 0x1178, 0x080c, + 0x6a9a, 0x0160, 0xa994, 0x81ff, 0x0130, 0x908e, 0x0004, 0x0130, + 0x908e, 0x0005, 0x0118, 0x080c, 0x6a92, 0x1598, 0xa87c, 0xd0fc, + 0x01e0, 0xa894, 0x9005, 0x01c8, 0x2060, 0x0026, 0x2010, 0x080c, + 0xce44, 0x002e, 0x1120, 0x2001, 0x0008, 0x0804, 0x6318, 0x6020, + 0x9086, 0x000a, 0x0120, 0x2001, 0x0008, 0x0804, 0x6318, 0x601a, + 0x6003, 0x0008, 0x2900, 0x6016, 0x0058, 0x080c, 0xb0ab, 0x05e8, + 0x2b00, 0x6012, 0x2900, 0x6016, 0x600b, 0xffff, 0x6023, 0x000a, + 0x2009, 0x0003, 0x080c, 0xb180, 0x9006, 0x0458, 0x2001, 0x0028, + 0x0438, 0x9082, 0x0006, 0x1290, 0x080c, 0xb06b, 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, + 0x63ad, 0x6368, 0x637f, 0x63ad, 0x63ad, 0x63ad, 0x63ad, 0x63ad, + 0x2100, 0x9082, 0x007e, 0x1278, 0x080c, 0x66b2, 0x0148, 0x9046, + 0xb810, 0x9306, 0x1904, 0x63b5, 0xb814, 0x9206, 0x15f0, 0x0028, + 0xbb12, 0xba16, 0x0010, 0x080c, 0x4a9c, 0x0150, 0x04b0, 0x080c, + 0x671d, 0x1598, 0xb810, 0x9306, 0x1580, 0xb814, 0x9206, 0x1568, + 0x080c, 0xb0ab, 0x0530, 0x2b00, 0x6012, 0x080c, 0xd2d2, 0x2900, + 0x6016, 0x600b, 0xffff, 0x6023, 0x000a, 0xa878, 0x9086, 0x0001, + 0x1170, 0x080c, 0x3246, 0x9006, 0x080c, 0x664f, 0x2001, 0x0002, + 0x080c, 0x6663, 0x2001, 0x0200, 0xb86e, 0xb893, 0x0002, 0x2009, + 0x0003, 0x080c, 0xb180, 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, + 0x65a0, 0x90c6, 0x0056, 0x0904, 0x65a4, 0x90c6, 0x0066, 0x0904, + 0x65a8, 0x90c6, 0x0067, 0x0904, 0x65ac, 0x90c6, 0x0068, 0x0904, + 0x65b0, 0x90c6, 0x0071, 0x0904, 0x65b4, 0x90c6, 0x0074, 0x0904, + 0x65b8, 0x90c6, 0x007c, 0x0904, 0x65bc, 0x90c6, 0x007e, 0x0904, + 0x65c0, 0x90c6, 0x0037, 0x0904, 0x65c4, 0x9016, 0x2079, 0x1800, + 0xa974, 0x9186, 0x00ff, 0x0904, 0x659b, 0x9182, 0x0800, 0x1a04, + 0x659b, 0x080c, 0x671d, 0x1198, 0xb804, 0x9084, 0x00ff, 0x9082, + 0x0006, 0x1268, 0xa894, 0x90c6, 0x006f, 0x0148, 0x080c, 0xb06b, + 0x1904, 0x6584, 0xb8a0, 0x9084, 0xff80, 0x1904, 0x6584, 0xa894, + 0x90c6, 0x006f, 0x0158, 0x90c6, 0x005e, 0x0904, 0x64e4, 0x90c6, + 0x0064, 0x0904, 0x650d, 0x2008, 0x0804, 0x64a6, 0xa998, 0xa8b0, + 0x2040, 0x080c, 0xb06b, 0x1120, 0x9182, 0x007f, 0x0a04, 0x64a6, + 0x9186, 0x00ff, 0x0904, 0x64a6, 0x9182, 0x0800, 0x1a04, 0x64a6, + 0xaaa0, 0xab9c, 0x787c, 0x9306, 0x11a8, 0x7880, 0x0096, 0x924e, + 0x1128, 0x2208, 0x2310, 0x009e, 0x0804, 0x64a6, 0x080c, 0xb06b, + 0x1140, 0x99cc, 0xff00, 0x009e, 0x1128, 0x2208, 0x2310, 0x0804, + 0x64a6, 0x009e, 0x080c, 0x4a9c, 0x0904, 0x64b0, 0x900e, 0x9016, + 0x90c6, 0x4000, 0x15e0, 0x0006, 0x080c, 0x693d, 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, 0xb0ab, 0x1130, 0x2001, 0x4005, 0x2009, 0x0003, 0x9016, + 0x0c78, 0x2b00, 0x6012, 0x080c, 0xd2d2, 0x2900, 0x6016, 0x6023, + 0x0001, 0xa868, 0xd88c, 0x0108, 0xc0f5, 0xa86a, 0x0126, 0x2091, + 0x8000, 0x080c, 0x3246, 0x012e, 0x9006, 0x080c, 0x664f, 0x2001, + 0x0002, 0x080c, 0x6663, 0x2009, 0x0002, 0x080c, 0xb180, 0xa8b0, + 0xd094, 0x0118, 0xb8cc, 0xc08d, 0xb8ce, 0x9006, 0x9005, 0x012e, + 0x00ee, 0x00fe, 0x00be, 0x0005, 0x080c, 0x57e7, 0x0118, 0x2009, + 0x0007, 0x00f8, 0xa998, 0xaeb0, 0x080c, 0x671d, 0x1904, 0x64a1, + 0x9186, 0x007f, 0x0130, 0x080c, 0x6a92, 0x0118, 0x2009, 0x0009, + 0x0080, 0x0096, 0x080c, 0x100e, 0x1120, 0x009e, 0x2009, 0x0002, + 0x0040, 0x2900, 0x009e, 0xa806, 0x080c, 0xd03e, 0x19b0, 0x2009, + 0x0003, 0x2001, 0x4005, 0x0804, 0x64a8, 0xa998, 0xaeb0, 0x080c, + 0x671d, 0x1904, 0x64a1, 0x0096, 0x080c, 0x100e, 0x1128, 0x009e, + 0x2009, 0x0002, 0x0804, 0x6561, 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, 0x57d3, 0xd0b4, 0x1118, 0xa89b, 0x000b, + 0x00e0, 0xb800, 0xd08c, 0x0118, 0xa89b, 0x000c, 0x00b0, 0x080c, + 0x6a92, 0x0118, 0xa89b, 0x0009, 0x0080, 0x080c, 0x57e7, 0x0118, + 0xa89b, 0x0007, 0x0050, 0x080c, 0xd021, 0x1904, 0x64dd, 0x2009, + 0x0003, 0x2001, 0x4005, 0x0804, 0x64a8, 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, 0xb61f, 0x1904, + 0x64dd, 0x2009, 0x0002, 0x08e8, 0x2001, 0x0028, 0x900e, 0x0804, + 0x64de, 0x2009, 0x180c, 0x210c, 0xd18c, 0x0118, 0x2001, 0x0004, + 0x0038, 0xd184, 0x0118, 0x2001, 0x0004, 0x0010, 0x2001, 0x0029, + 0x900e, 0x0804, 0x64de, 0x2001, 0x0029, 0x900e, 0x0804, 0x64de, + 0x080c, 0x37dd, 0x0804, 0x64df, 0x080c, 0x54fe, 0x0804, 0x64df, + 0x080c, 0x460c, 0x0804, 0x64df, 0x080c, 0x4685, 0x0804, 0x64df, + 0x080c, 0x46e1, 0x0804, 0x64df, 0x080c, 0x4b5f, 0x0804, 0x64df, + 0x080c, 0x4e13, 0x0804, 0x64df, 0x080c, 0x5165, 0x0804, 0x64df, + 0x080c, 0x535e, 0x0804, 0x64df, 0x080c, 0x3a07, 0x0804, 0x64df, + 0x00b6, 0xa974, 0xae78, 0x9684, 0x3fff, 0x9082, 0x4000, 0x1618, + 0x9182, 0x0800, 0x1268, 0x9188, 0x1000, 0x2104, 0x905d, 0x0140, + 0x080c, 0x6a92, 0x1148, 0x00e9, 0x080c, 0x6848, 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, 0x19e9, + 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, 0x6a8e, 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, 0x6a8a, + 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, 0x6141, + 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, 0xce56, 0x0110, 0x080c, 0x0fc0, 0x080c, + 0xb101, 0x00ce, 0x0c88, 0x00ce, 0x00de, 0x00c6, 0xb8ac, 0x9065, + 0x0128, 0x621c, 0xd2c4, 0x0110, 0x080c, 0x8f64, 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, 0x7569, + 0x1510, 0xb8a0, 0x9086, 0x007e, 0x0120, 0x080c, 0xb06b, 0x11d8, + 0x0078, 0x7040, 0xd0e4, 0x01b8, 0x00c6, 0x2061, 0x1983, 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, 0x68d9, 0xa807, 0x0001, 0xae12, 0x9085, 0x0001, + 0x012e, 0x009e, 0x0005, 0x9006, 0x0cd8, 0x0126, 0x2091, 0x8000, + 0x0096, 0xb8a4, 0x904d, 0x0188, 0xa800, 0x9005, 0x1150, 0x080c, + 0x68e8, 0x1158, 0xa804, 0x908a, 0x0002, 0x0218, 0x8001, 0xa806, + 0x0020, 0x080c, 0x1040, 0xb8a7, 0x0000, 0x009e, 0x012e, 0x0005, + 0x0126, 0x2091, 0x8000, 0x080c, 0x9358, 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, 0xa91f, + 0xaa00, 0xb84c, 0x9906, 0x1110, 0xba4e, 0x0020, 0x00a6, 0x2150, + 0xb202, 0x00ae, 0x82ff, 0x1110, 0xb952, 0x89ff, 0x012e, 0x0005, + 0x9016, 0x0489, 0x1110, 0x2011, 0x0001, 0x0005, 0x080c, 0x693d, + 0x0128, 0x080c, 0xcf13, 0x0010, 0x9085, 0x0001, 0x0005, 0x080c, + 0x693d, 0x0128, 0x080c, 0xceb8, 0x0010, 0x9085, 0x0001, 0x0005, + 0x080c, 0x693d, 0x0128, 0x080c, 0xcf10, 0x0010, 0x9085, 0x0001, + 0x0005, 0x080c, 0x693d, 0x0128, 0x080c, 0xced7, 0x0010, 0x9085, + 0x0001, 0x0005, 0x080c, 0x693d, 0x0128, 0x080c, 0xcf56, 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, 0x68d9, 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, 0x7569, 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, 0x671d, 0x1168, + 0xb804, 0x9084, 0xff00, 0x8007, 0x9096, 0x0004, 0x0118, 0x9086, + 0x0006, 0x1118, 0xb800, 0xc0ed, 0xb802, 0x001e, 0x8108, 0x1f04, + 0x6964, 0x015e, 0x080c, 0x6a50, 0x0120, 0x2001, 0x1986, 0x200c, + 0x0038, 0x2079, 0x1847, 0x7804, 0xd0a4, 0x0130, 0x2009, 0x07d0, + 0x2011, 0x698f, 0x080c, 0x87a1, 0x00fe, 0x00be, 0x0005, 0x00b6, + 0x2011, 0x698f, 0x080c, 0x8709, 0x080c, 0x6a50, 0x01d8, 0x2001, + 0x107e, 0x2004, 0x2058, 0xb900, 0xc1ec, 0xb902, 0x080c, 0x6a8e, + 0x0130, 0x2009, 0x07d0, 0x2011, 0x698f, 0x080c, 0x87a1, 0x00e6, + 0x2071, 0x1800, 0x9006, 0x707e, 0x7060, 0x7082, 0x080c, 0x3019, + 0x00ee, 0x04c0, 0x0156, 0x00c6, 0x20a9, 0x007f, 0x900e, 0x0016, + 0x080c, 0x671d, 0x1548, 0xb800, 0xd0ec, 0x0530, 0xd0bc, 0x1520, + 0x0046, 0xbaa0, 0x2220, 0x9006, 0x2009, 0x0029, 0x080c, 0xe9a5, + 0xb800, 0xc0e5, 0xc0ec, 0xb802, 0x080c, 0x6a8a, 0x2001, 0x0707, + 0x1128, 0xb804, 0x9084, 0x00ff, 0x9085, 0x0700, 0xb806, 0x2019, + 0x0029, 0x080c, 0x94e0, 0x0076, 0x903e, 0x080c, 0x93b3, 0x900e, + 0x080c, 0xe690, 0x007e, 0x004e, 0x001e, 0x8108, 0x1f04, 0x69b7, + 0x00ce, 0x015e, 0x00be, 0x0005, 0x00b6, 0x6010, 0x2058, 0xb800, + 0xc0ec, 0xb802, 0x00be, 0x0005, 0x00b6, 0x00c6, 0x0096, 0x080c, + 0x1027, 0x090c, 0x0dc5, 0x2958, 0x009e, 0x2001, 0x196c, 0x2b02, + 0x8b07, 0x8006, 0x8006, 0x908c, 0x003f, 0xb9c6, 0x908c, 0xffc0, + 0xb9ca, 0xb8af, 0x0000, 0x2009, 0x00ff, 0x080c, 0x6141, 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, 0x1984, 0x200c, 0x2011, 0x6a80, 0x080c, 0x87a1, 0x0005, + 0x2011, 0x6a80, 0x080c, 0x8709, 0x2011, 0x1837, 0x2204, 0xc0cc, + 0x2012, 0x0005, 0x080c, 0x57d3, 0xd0ac, 0x0005, 0x080c, 0x57d3, + 0xd0a4, 0x0005, 0x0016, 0xb904, 0x9184, 0x00ff, 0x908e, 0x0006, + 0x001e, 0x0005, 0x0016, 0xb904, 0x9184, 0xff00, 0x8007, 0x908e, + 0x0006, 0x001e, 0x0005, 0x00b6, 0x00f6, 0x080c, 0xd561, 0x0158, + 0x70dc, 0x9084, 0x0028, 0x0138, 0x2001, 0x107f, 0x2004, 0x905d, + 0x0110, 0xb8cc, 0xd094, 0x00fe, 0x00be, 0x0005, 0x2071, 0x1910, + 0x7003, 0x0001, 0x7007, 0x0000, 0x9006, 0x7012, 0x7016, 0x701a, + 0x701e, 0x700a, 0x7046, 0x2001, 0x1922, 0x2003, 0x0000, 0x0005, + 0x0016, 0x00e6, 0x2071, 0x1949, 0x900e, 0x710a, 0x080c, 0x57d3, + 0xd0fc, 0x1140, 0x080c, 0x57d3, 0x900e, 0xd09c, 0x0108, 0x8108, + 0x7102, 0x0430, 0x2001, 0x1867, 0x200c, 0x9184, 0x0007, 0x0002, + 0x6ad2, 0x6ad2, 0x6ad2, 0x6ad2, 0x6ad2, 0x6ae8, 0x6afd, 0x6b0b, + 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, 0x78c0, 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, + 0x1949, 0x7000, 0x9015, 0x0904, 0x6dd7, 0x9286, 0x0003, 0x0904, + 0x6c70, 0x9286, 0x0005, 0x0904, 0x6c70, 0x2071, 0x1877, 0xa87c, + 0x9005, 0x0904, 0x6bcb, 0x7140, 0xa868, 0x9102, 0x0a04, 0x6dd7, + 0xa878, 0xd084, 0x15d8, 0xa853, 0x0019, 0x2001, 0x8023, 0xa84e, + 0x2071, 0x1910, 0x701c, 0x9005, 0x1904, 0x6fa5, 0x0e04, 0x7013, + 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, 0x6c53, 0xa853, 0x001b, + 0x2001, 0x8027, 0x0820, 0x7004, 0xd08c, 0x1904, 0x6dd7, 0xa853, + 0x001a, 0x2001, 0x8024, 0x0804, 0x6b8f, 0x00e6, 0x0026, 0x2071, + 0x1949, 0x7000, 0x9015, 0x0904, 0x6dd7, 0x9286, 0x0003, 0x0904, + 0x6c70, 0x9286, 0x0005, 0x0904, 0x6c70, 0xa84f, 0x8022, 0xa853, + 0x0018, 0x0804, 0x6c38, 0xa868, 0xd0fc, 0x1508, 0x00e6, 0x0026, + 0x2001, 0x1949, 0x2004, 0x9015, 0x0904, 0x6dd7, 0xa978, 0xa874, + 0x9105, 0x1904, 0x6dd7, 0x9286, 0x0003, 0x0904, 0x6c70, 0x9286, + 0x0005, 0x0904, 0x6c70, 0xa87c, 0xd0bc, 0x1904, 0x6dd7, 0x2200, + 0x0002, 0x6dd7, 0x6c34, 0x6c70, 0x6c70, 0x6dd7, 0x6c70, 0x0005, + 0xa868, 0xd0fc, 0x1500, 0x00e6, 0x0026, 0x2009, 0x1949, 0x210c, + 0x81ff, 0x0904, 0x6dd7, 0xa880, 0x9084, 0x00ff, 0x9086, 0x0001, + 0x1904, 0x6dd7, 0x9186, 0x0003, 0x0904, 0x6c70, 0x9186, 0x0005, + 0x0904, 0x6c70, 0xa87c, 0xd0cc, 0x0904, 0x6dd7, 0xa84f, 0x8021, + 0xa853, 0x0017, 0x0028, 0x0005, 0xa84f, 0x8020, 0xa853, 0x0016, + 0x2071, 0x1910, 0x701c, 0x9005, 0x1904, 0x6fa5, 0x0e04, 0x7013, + 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, 0x85f1, 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, 0x6d5b, 0x782c, 0x908c, 0x0780, + 0x190c, 0x7161, 0x8004, 0x8004, 0x8004, 0x9084, 0x0003, 0x0002, + 0x6c8e, 0x6d5b, 0x6cb2, 0x6cf8, 0x080c, 0x0dc5, 0x2071, 0x1800, + 0x2900, 0x7822, 0xa804, 0x900d, 0x1168, 0x2071, 0x19fc, 0x7044, + 0x9005, 0x1320, 0x2001, 0x194a, 0x2004, 0x7046, 0x00fe, 0x002e, + 0x00ee, 0x0005, 0x9016, 0x702c, 0x2148, 0xa904, 0xa802, 0x8210, + 0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70c0, 0x9200, 0x70c2, 0x080c, + 0x85f1, 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, 0x85f1, 0x782c, 0x9094, 0x0780, 0x190c, + 0x7161, 0xd0a4, 0x19f0, 0x2071, 0x19fc, 0x7044, 0x9005, 0x1320, + 0x2001, 0x194a, 0x2004, 0x7046, 0x00fe, 0x002e, 0x00ee, 0x0005, + 0x9016, 0x702c, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, + 0x1dc8, 0x702e, 0x70c0, 0x9200, 0x70c2, 0x080c, 0x85f1, 0x0808, + 0x0096, 0x00e6, 0x7824, 0x2048, 0x2071, 0x1800, 0x702c, 0xa802, + 0x2900, 0x702e, 0x70c0, 0x8000, 0x70c2, 0x080c, 0x85f1, 0x782c, + 0x9094, 0x0780, 0x190c, 0x7161, 0xd0a4, 0x1d60, 0x00ee, 0x782c, + 0x9094, 0x0780, 0x190c, 0x7161, 0xd09c, 0x1198, 0x009e, 0x2900, + 0x7822, 0xa804, 0x900d, 0x1550, 0x2071, 0x19fc, 0x7044, 0x9005, + 0x1320, 0x2001, 0x194a, 0x2004, 0x7046, 0x00fe, 0x002e, 0x00ee, + 0x0005, 0x009e, 0x2908, 0x7010, 0x8000, 0x7012, 0x7018, 0x904d, + 0x711a, 0x0110, 0xa902, 0x0008, 0x711e, 0x2148, 0xa804, 0x900d, + 0x1168, 0x2071, 0x19fc, 0x7044, 0x9005, 0x1320, 0x2001, 0x194a, + 0x2004, 0x7046, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x2071, 0x1800, + 0x9016, 0x702c, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, + 0x1dc8, 0x702e, 0x70c0, 0x9200, 0x70c2, 0x080c, 0x85f1, 0x00fe, + 0x002e, 0x00ee, 0x0005, 0x2908, 0x7010, 0x8000, 0x7012, 0x7018, + 0x904d, 0x711a, 0x0110, 0xa902, 0x0008, 0x711e, 0x2148, 0xa804, + 0x900d, 0x1904, 0x6daf, 0x782c, 0x9094, 0x0780, 0x190c, 0x7161, + 0xd09c, 0x1198, 0x701c, 0x904d, 0x0180, 0x7010, 0x8001, 0x7012, + 0x1108, 0x701a, 0xa800, 0x701e, 0x2900, 0x7822, 0x782c, 0x9094, + 0x0780, 0x190c, 0x7161, 0xd09c, 0x0d68, 0x782c, 0x9094, 0x0780, + 0x190c, 0x7161, 0xd0a4, 0x01b0, 0x00e6, 0x7824, 0x2048, 0x2071, + 0x1800, 0x702c, 0xa802, 0x2900, 0x702e, 0x70c0, 0x8000, 0x70c2, + 0x080c, 0x85f1, 0x782c, 0x9094, 0x0780, 0x190c, 0x7161, 0xd0a4, + 0x1d60, 0x00ee, 0x2071, 0x19fc, 0x7044, 0x9005, 0x1320, 0x2001, + 0x194a, 0x2004, 0x7046, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x00e6, + 0x2071, 0x1800, 0x9016, 0x702c, 0x2148, 0xa904, 0xa802, 0x8210, + 0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70c0, 0x9200, 0x70c2, 0x080c, + 0x85f1, 0x00ee, 0x0804, 0x6d6b, 0xa868, 0xd0fc, 0x1904, 0x6e25, + 0x0096, 0xa804, 0xa807, 0x0000, 0x904d, 0x190c, 0x0fc0, 0x009e, + 0x0020, 0xa868, 0xd0fc, 0x1904, 0x6e25, 0x00e6, 0x0026, 0xa84f, + 0x0000, 0x00f6, 0x2079, 0x0050, 0x2071, 0x1800, 0x70ec, 0x8001, + 0x0558, 0x1a04, 0x6e22, 0x2071, 0x1910, 0xa803, 0x0000, 0xa864, + 0x9084, 0x00ff, 0x908e, 0x0016, 0x01a8, 0x7010, 0x9005, 0x1904, + 0x6f21, 0x782c, 0x908c, 0x0780, 0x190c, 0x7161, 0x8004, 0x8004, + 0x8004, 0x9084, 0x0003, 0x0002, 0x6e26, 0x6f21, 0x6e41, 0x6eb2, + 0x080c, 0x0dc5, 0x2009, 0x1949, 0x2104, 0x0002, 0x6ded, 0x6ded, + 0x6ded, 0x6c79, 0x6ded, 0x6c79, 0x70ef, 0x0fa0, 0x71e8, 0x8107, + 0x9106, 0x9094, 0x00c0, 0x9184, 0xff3f, 0x9205, 0x70ea, 0x3b08, + 0x3a00, 0x9104, 0x918d, 0x00c0, 0x21d8, 0x9084, 0xff3f, 0x9205, + 0x20d0, 0x0808, 0x70ee, 0x0804, 0x6de3, 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, 0x85f1, + 0x0c60, 0x2071, 0x1800, 0x2900, 0x7822, 0xa804, 0x900d, 0x1904, + 0x6ea1, 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, 0x85f1, 0x782c, + 0x9094, 0x0780, 0x190c, 0x7161, 0xd0a4, 0x19f0, 0x0e04, 0x6e98, + 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, 0x85f1, + 0x0804, 0x6e54, 0x0096, 0x00e6, 0x7824, 0x2048, 0x2071, 0x1800, + 0x702c, 0xa802, 0x2900, 0x702e, 0x70c0, 0x8000, 0x70c2, 0x080c, + 0x85f1, 0x782c, 0x9094, 0x0780, 0x190c, 0x7161, 0xd0a4, 0x1d60, + 0x00ee, 0x0e04, 0x6ef4, 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, 0x7161, + 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, 0x85f1, 0x00fe, 0x002e, 0x00ee, + 0x0005, 0x2908, 0x7010, 0x8000, 0x7012, 0x7018, 0x904d, 0x711a, + 0x0110, 0xa902, 0x0008, 0x711e, 0x2148, 0xa804, 0x900d, 0x1904, + 0x6f90, 0x782c, 0x9094, 0x0780, 0x190c, 0x7161, 0xd09c, 0x11b0, + 0x701c, 0x904d, 0x0198, 0xa84c, 0x9005, 0x1180, 0x7010, 0x8001, + 0x7012, 0x1108, 0x701a, 0xa800, 0x701e, 0x2900, 0x7822, 0x782c, + 0x9094, 0x0780, 0x190c, 0x7161, 0xd09c, 0x0d50, 0x782c, 0x9094, + 0x0780, 0x190c, 0x7161, 0xd0a4, 0x05b8, 0x00e6, 0x7824, 0x2048, + 0x2071, 0x1800, 0x702c, 0xa802, 0x2900, 0x702e, 0x70c0, 0x8000, + 0x70c2, 0x080c, 0x85f1, 0x782c, 0x9094, 0x0780, 0x190c, 0x7161, + 0xd0a4, 0x1d60, 0x00ee, 0x0e04, 0x6f89, 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, 0x85f1, 0x00ee, 0x0804, 0x6f31, 0x2071, 0x1910, 0xa803, + 0x0000, 0x2908, 0x7010, 0x8000, 0x7012, 0x7018, 0x904d, 0x711a, + 0x0110, 0xa902, 0x0008, 0x711e, 0x2148, 0xa804, 0x900d, 0x1128, + 0x1e04, 0x6fd0, 0x002e, 0x00ee, 0x0005, 0x2071, 0x1800, 0x9016, + 0x702c, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, + 0x702e, 0x70c0, 0x9200, 0x70c2, 0x080c, 0x85f1, 0x0e04, 0x6fba, + 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, + 0x714d, 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, 0x85f1, 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, + 0x7060, 0x7061, 0x714c, 0x7061, 0x705e, 0x714c, 0x080c, 0x0dc5, + 0x0005, 0x2001, 0x1949, 0x2004, 0x0002, 0x706b, 0x706b, 0x70e5, + 0x70e6, 0x706b, 0x70e6, 0x0126, 0x2091, 0x8000, 0x1e0c, 0x716c, + 0x701c, 0x904d, 0x0508, 0xa84c, 0x9005, 0x0904, 0x70b6, 0x0e04, + 0x7094, 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, 0x714d, 0x012e, 0x0804, 0x70e4, 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, 0x7161, 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, 0x19fc, 0x6844, 0x9005, 0x0760, 0x0158, 0x9186, 0x0003, + 0x0540, 0x2001, 0x1815, 0x2004, 0x2009, 0x1ad2, 0x210c, 0x9102, + 0x1500, 0x0126, 0x2091, 0x8000, 0x2069, 0x0050, 0x693c, 0x6838, + 0x9106, 0x0190, 0x0e04, 0x7118, 0x2069, 0x0000, 0x6837, 0x8040, + 0x6833, 0x0012, 0x6883, 0x8040, 0x2091, 0x4080, 0x2001, 0x0089, + 0x2004, 0xd084, 0x190c, 0x11aa, 0x2069, 0x19fc, 0x6847, 0xffff, + 0x012e, 0x00de, 0x0126, 0x2091, 0x8000, 0x1e0c, 0x71d7, 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, 0x7163, 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, 0x85f1, 0x782c, + 0x9094, 0x0780, 0x190c, 0x7161, 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, + 0x7161, 0xd0a4, 0x0db8, 0x00e6, 0x2071, 0x1800, 0x7824, 0x2048, + 0x702c, 0xa802, 0x2900, 0x702e, 0x70c0, 0x8000, 0x70c2, 0x080c, + 0x85f1, 0x782c, 0x9094, 0x0780, 0x190c, 0x7161, 0xd0a4, 0x1d70, + 0x00d6, 0x2069, 0x0050, 0x693c, 0x2069, 0x1949, 0x6808, 0x690a, + 0x2069, 0x19fc, 0x9102, 0x1118, 0x6844, 0x9005, 0x1320, 0x2001, + 0x194a, 0x200c, 0x6946, 0x00de, 0x00ee, 0x00fe, 0x0005, 0x7098, + 0x908a, 0x002a, 0x1a0c, 0x0dc5, 0x9082, 0x001d, 0x001b, 0x6027, + 0x1e00, 0x0005, 0x7318, 0x7285, 0x72a1, 0x72cb, 0x7307, 0x7347, + 0x7359, 0x72a1, 0x732f, 0x7240, 0x726e, 0x72f1, 0x723f, 0x0005, + 0x00d6, 0x2069, 0x0200, 0x6804, 0x9005, 0x1180, 0x6808, 0x9005, + 0x1518, 0x709b, 0x0029, 0x2069, 0x1990, 0x2d04, 0x7002, 0x080c, + 0x769e, 0x6028, 0x9085, 0x0600, 0x602a, 0x00b0, 0x709b, 0x0029, + 0x2069, 0x1990, 0x2d04, 0x7002, 0x6028, 0x9085, 0x0600, 0x602a, + 0x00e6, 0x0036, 0x0046, 0x0056, 0x2071, 0x1a66, 0x080c, 0x1b02, + 0x005e, 0x004e, 0x003e, 0x00ee, 0x00de, 0x0005, 0x00d6, 0x2069, + 0x0200, 0x6804, 0x9005, 0x1178, 0x6808, 0x9005, 0x1160, 0x709b, + 0x0029, 0x2069, 0x1990, 0x2d04, 0x7002, 0x080c, 0x773b, 0x6028, + 0x9085, 0x0600, 0x602a, 0x00de, 0x0005, 0x0006, 0x2001, 0x0090, + 0x080c, 0x2d52, 0x000e, 0x6124, 0xd1e4, 0x1190, 0x080c, 0x73c6, + 0xd1d4, 0x1160, 0xd1dc, 0x1138, 0xd1cc, 0x0150, 0x709b, 0x0020, + 0x080c, 0x73c6, 0x0028, 0x709b, 0x001d, 0x0010, 0x709b, 0x001f, + 0x0005, 0x2001, 0x0088, 0x080c, 0x2d52, 0x6124, 0xd1cc, 0x11e8, + 0xd1dc, 0x11c0, 0xd1e4, 0x1198, 0x9184, 0x1e00, 0x11d8, 0x080c, + 0x1b2f, 0x60e3, 0x0001, 0x600c, 0xc0b4, 0x600e, 0x080c, 0x7595, + 0x2001, 0x0080, 0x080c, 0x2d52, 0x709b, 0x0029, 0x0058, 0x709b, + 0x001e, 0x0040, 0x709b, 0x001d, 0x0028, 0x709b, 0x0020, 0x0010, + 0x709b, 0x001f, 0x0005, 0x080c, 0x1b2f, 0x60e3, 0x0001, 0x600c, + 0xc0b4, 0x600e, 0x080c, 0x7595, 0x2001, 0x0080, 0x080c, 0x2d52, + 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, 0x2d52, 0x6124, 0xd1dc, 0x1138, 0xd1e4, 0x0138, + 0x080c, 0x1b2f, 0x709b, 0x001e, 0x0010, 0x709b, 0x001d, 0x0005, + 0x080c, 0x7449, 0x6124, 0xd1dc, 0x1188, 0x080c, 0x73c6, 0x0016, + 0x080c, 0x1b2f, 0x001e, 0xd1d4, 0x1128, 0xd1e4, 0x0138, 0x709b, + 0x001e, 0x0020, 0x709b, 0x001f, 0x080c, 0x73c6, 0x0005, 0x0006, + 0x2001, 0x00a0, 0x080c, 0x2d52, 0x000e, 0x6124, 0xd1d4, 0x1160, + 0xd1cc, 0x1150, 0xd1dc, 0x1128, 0xd1e4, 0x0140, 0x709b, 0x001e, + 0x0028, 0x709b, 0x001d, 0x0010, 0x709b, 0x0021, 0x0005, 0x080c, + 0x7449, 0x6124, 0xd1d4, 0x1150, 0xd1dc, 0x1128, 0xd1e4, 0x0140, + 0x709b, 0x001e, 0x0028, 0x709b, 0x001d, 0x0010, 0x709b, 0x001f, + 0x0005, 0x0006, 0x2001, 0x0090, 0x080c, 0x2d52, 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, 0x7569, 0x11d8, 0x2001, 0x180c, 0x200c, 0xd1b4, + 0x01b0, 0xc1b4, 0x2102, 0x6027, 0x0200, 0x080c, 0x2c7a, 0x6024, + 0xd0cc, 0x0148, 0x2001, 0x00a0, 0x080c, 0x2d52, 0x080c, 0x784e, + 0x080c, 0x6127, 0x0428, 0x6028, 0xc0cd, 0x602a, 0x0408, 0x080c, + 0x7583, 0x0150, 0x080c, 0x757a, 0x1138, 0x2001, 0x0001, 0x080c, + 0x283d, 0x080c, 0x7541, 0x00a0, 0x080c, 0x7446, 0x0178, 0x2001, + 0x0001, 0x080c, 0x283d, 0x7098, 0x9086, 0x001e, 0x0120, 0x7098, + 0x9086, 0x0022, 0x1118, 0x709b, 0x0025, 0x0010, 0x709b, 0x0021, + 0x012e, 0x00ee, 0x00de, 0x00ce, 0x001e, 0x0005, 0x0026, 0x2011, + 0x73d7, 0x080c, 0x87e3, 0x002e, 0x0016, 0x0026, 0x2009, 0x0064, + 0x2011, 0x73d7, 0x080c, 0x87da, 0x002e, 0x001e, 0x0005, 0x00e6, + 0x00f6, 0x0016, 0x080c, 0xa517, 0x2071, 0x1800, 0x080c, 0x7374, + 0x001e, 0x00fe, 0x00ee, 0x0005, 0x0016, 0x0026, 0x0036, 0x00c6, + 0x00d6, 0x00e6, 0x00f6, 0x0126, 0x2071, 0x1800, 0x080c, 0xa517, + 0x2061, 0x0100, 0x2069, 0x0140, 0x2091, 0x8000, 0x6028, 0xc09c, + 0x602a, 0x2011, 0x0003, 0x080c, 0xa8ed, 0x2011, 0x0002, 0x080c, + 0xa8f7, 0x080c, 0xa801, 0x080c, 0x878f, 0x0036, 0x901e, 0x080c, + 0xa877, 0x003e, 0x60e3, 0x0000, 0x080c, 0xedfa, 0x080c, 0xee15, + 0x2009, 0x0004, 0x080c, 0x2c80, 0x080c, 0x2b9b, 0x2001, 0x1800, + 0x2003, 0x0004, 0x6027, 0x0008, 0x2011, 0x73d7, 0x080c, 0x87e3, + 0x080c, 0x7583, 0x0118, 0x9006, 0x080c, 0x2d52, 0x080c, 0x0ba0, + 0x2001, 0x0001, 0x080c, 0x283d, 0x012e, 0x00fe, 0x00ee, 0x00de, + 0x00ce, 0x003e, 0x002e, 0x001e, 0x0005, 0x0026, 0x00e6, 0x2011, + 0x73e4, 0x2071, 0x19fc, 0x701c, 0x9206, 0x1118, 0x7018, 0x9005, + 0x0110, 0x9085, 0x0001, 0x00ee, 0x002e, 0x0005, 0x6020, 0xd09c, + 0x0005, 0x6800, 0x9084, 0xfffe, 0x9086, 0x00c0, 0x01b8, 0x2001, + 0x00c0, 0x080c, 0x2d52, 0x0156, 0x20a9, 0x002d, 0x1d04, 0x7456, + 0x2091, 0x6000, 0x1f04, 0x7456, 0x015e, 0x00d6, 0x2069, 0x1800, + 0x689c, 0x8001, 0x0220, 0x0118, 0x689e, 0x00de, 0x0005, 0x689f, + 0x0014, 0x68e8, 0xd0dc, 0x0dc8, 0x6800, 0x9086, 0x0001, 0x1da8, + 0x080c, 0x87ef, 0x0c90, 0x00c6, 0x00d6, 0x00e6, 0x2061, 0x0100, + 0x2069, 0x0140, 0x2071, 0x1800, 0x080c, 0x785d, 0x2001, 0x196e, + 0x2003, 0x0000, 0x9006, 0x709a, 0x60e2, 0x6886, 0x080c, 0x2908, + 0x9006, 0x080c, 0x2d52, 0x080c, 0x5fe6, 0x6027, 0xffff, 0x602b, + 0x182f, 0x00ee, 0x00de, 0x00ce, 0x0005, 0x00c6, 0x00d6, 0x00e6, + 0x2061, 0x0100, 0x2069, 0x0140, 0x2071, 0x1800, 0x2001, 0x197e, + 0x200c, 0x9186, 0x0000, 0x0158, 0x9186, 0x0001, 0x0158, 0x9186, + 0x0002, 0x0158, 0x9186, 0x0003, 0x0158, 0x0804, 0x7531, 0x709b, + 0x0022, 0x0040, 0x709b, 0x0021, 0x0028, 0x709b, 0x0023, 0x0010, + 0x709b, 0x0024, 0x60e3, 0x0000, 0x6887, 0x0001, 0x2001, 0x0001, + 0x080c, 0x2908, 0x0026, 0x080c, 0xb072, 0x002e, 0x7000, 0x908e, + 0x0004, 0x0118, 0x602b, 0x0028, 0x0010, 0x602b, 0x0020, 0x0156, + 0x0126, 0x2091, 0x8000, 0x20a9, 0x0005, 0x6024, 0xd0ac, 0x0150, + 0x012e, 0x015e, 0x080c, 0xd561, 0x0118, 0x9006, 0x080c, 0x2d7c, + 0x0804, 0x753d, 0x6800, 0x9084, 0x00a1, 0xc0bd, 0x6802, 0x080c, + 0x2c7a, 0x6904, 0xd1d4, 0x1140, 0x2001, 0x0100, 0x080c, 0x2d52, + 0x1f04, 0x74d5, 0x080c, 0x75bd, 0x012e, 0x015e, 0x080c, 0x757a, + 0x01d8, 0x6044, 0x9005, 0x0198, 0x2011, 0x0114, 0x2204, 0x9085, + 0x0100, 0x2012, 0x6050, 0x0006, 0x9085, 0x0020, 0x6052, 0x080c, + 0x75bd, 0x9006, 0x8001, 0x1df0, 0x000e, 0x6052, 0x0028, 0x6804, + 0xd0d4, 0x1110, 0x080c, 0x75bd, 0x080c, 0xd561, 0x0118, 0x9006, + 0x080c, 0x2d7c, 0x0016, 0x0026, 0x7000, 0x908e, 0x0004, 0x0130, + 0x2009, 0x00c8, 0x2011, 0x73e4, 0x080c, 0x87a1, 0x002e, 0x001e, + 0x080c, 0x85e8, 0x7034, 0xc085, 0x7036, 0x2001, 0x197e, 0x2003, + 0x0004, 0x080c, 0x7227, 0x080c, 0x757a, 0x0138, 0x6804, 0xd0d4, + 0x1120, 0xd0dc, 0x1100, 0x080c, 0x7853, 0x00ee, 0x00de, 0x00ce, + 0x0005, 0x00c6, 0x00d6, 0x00e6, 0x2061, 0x0100, 0x2069, 0x0140, + 0x2071, 0x1800, 0x080c, 0x85ff, 0x080c, 0x85f1, 0x080c, 0x785d, + 0x2001, 0x196e, 0x2003, 0x0000, 0x9006, 0x709a, 0x60e2, 0x6886, + 0x080c, 0x2908, 0x9006, 0x080c, 0x2d52, 0x6043, 0x0090, 0x6043, + 0x0010, 0x6027, 0xffff, 0x602b, 0x182f, 0x00ee, 0x00de, 0x00ce, + 0x0005, 0x0006, 0x2001, 0x197d, 0x2004, 0x9086, 0xaaaa, 0x000e, + 0x0005, 0x0006, 0x080c, 0x57d7, 0x9084, 0x0030, 0x9086, 0x0000, + 0x000e, 0x0005, 0x0006, 0x080c, 0x57d7, 0x9084, 0x0030, 0x9086, + 0x0030, 0x000e, 0x0005, 0x0006, 0x080c, 0x57d7, 0x9084, 0x0030, + 0x9086, 0x0010, 0x000e, 0x0005, 0x0006, 0x080c, 0x57d7, 0x9084, + 0x0030, 0x9086, 0x0020, 0x000e, 0x0005, 0x0036, 0x0016, 0x2001, + 0x180c, 0x2004, 0x908c, 0x0013, 0x0168, 0x0020, 0x080c, 0x2928, + 0x900e, 0x0010, 0x2009, 0x0002, 0x2019, 0x0028, 0x080c, 0x3211, + 0x9006, 0x0019, 0x001e, 0x003e, 0x0005, 0x00e6, 0x2071, 0x180c, + 0x2e04, 0x0130, 0x080c, 0xd55a, 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, 0x75d2, 0x2091, 0x6000, 0x1f04, 0x75d2, + 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, 0x2908, + 0x2001, 0x00a0, 0x0006, 0x080c, 0xd561, 0x000e, 0x0130, 0x080c, + 0x2d70, 0x9006, 0x080c, 0x2d7c, 0x0010, 0x080c, 0x2d52, 0x000e, + 0x6052, 0x6050, 0x0006, 0xc0e5, 0x6052, 0x00f6, 0x2079, 0x0100, + 0x080c, 0x2bef, 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, 0x7690, 0x2001, 0x180c, + 0x200c, 0xc1c4, 0x2102, 0x6028, 0x9084, 0xe1ff, 0x602a, 0x6027, + 0x0200, 0x2001, 0x0090, 0x080c, 0x2d52, 0x20a9, 0x0366, 0x6024, + 0xd0cc, 0x1518, 0x1d04, 0x763f, 0x2091, 0x6000, 0x1f04, 0x763f, + 0x2011, 0x0003, 0x080c, 0xa8ed, 0x2011, 0x0002, 0x080c, 0xa8f7, + 0x080c, 0xa801, 0x901e, 0x080c, 0xa877, 0x2001, 0x00a0, 0x080c, + 0x2d52, 0x080c, 0x784e, 0x080c, 0x6127, 0x080c, 0xd561, 0x0110, + 0x080c, 0x0d33, 0x9085, 0x0001, 0x0488, 0x080c, 0x1b2f, 0x60e3, + 0x0000, 0x2001, 0x196e, 0x2004, 0x080c, 0x2908, 0x60e2, 0x2001, + 0x0080, 0x080c, 0x2d52, 0x20a9, 0x0366, 0x6027, 0x1e00, 0x2009, + 0x1e00, 0x080c, 0x2c7a, 0x6024, 0x910c, 0x0138, 0x1d04, 0x7675, + 0x2091, 0x6000, 0x1f04, 0x7675, 0x0818, 0x6028, 0x9085, 0x1e00, + 0x602a, 0x70b4, 0x9005, 0x1118, 0x6887, 0x0001, 0x0008, 0x6886, + 0x080c, 0xd561, 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, 0x1a7d, 0x2d04, + 0x8000, 0x206a, 0x2069, 0x0140, 0x6020, 0x9084, 0x00c0, 0x0120, + 0x6884, 0x9005, 0x1904, 0x7703, 0x2001, 0x0088, 0x080c, 0x2d52, + 0x9006, 0x60e2, 0x6886, 0x080c, 0x2908, 0x2069, 0x0200, 0x6804, + 0x9005, 0x1118, 0x6808, 0x9005, 0x01c0, 0x6028, 0x9084, 0xfbff, + 0x602a, 0x6027, 0x0400, 0x2069, 0x1990, 0x7000, 0x206a, 0x709b, + 0x0026, 0x7003, 0x0001, 0x20a9, 0x0002, 0x1d04, 0x76e5, 0x2091, + 0x6000, 0x1f04, 0x76e5, 0x0804, 0x7733, 0x2069, 0x0140, 0x20a9, + 0x0384, 0x6027, 0x1e00, 0x2009, 0x1e00, 0x080c, 0x2c7a, 0x6024, + 0x910c, 0x0508, 0x9084, 0x1a00, 0x11f0, 0x1d04, 0x76f1, 0x2091, + 0x6000, 0x1f04, 0x76f1, 0x2011, 0x0003, 0x080c, 0xa8ed, 0x2011, + 0x0002, 0x080c, 0xa8f7, 0x080c, 0xa801, 0x901e, 0x080c, 0xa877, + 0x2001, 0x00a0, 0x080c, 0x2d52, 0x080c, 0x784e, 0x080c, 0x6127, + 0x9085, 0x0001, 0x00c0, 0x080c, 0x1b2f, 0x2001, 0x0080, 0x080c, + 0x2d52, 0x2069, 0x0140, 0x60e3, 0x0000, 0x70b4, 0x9005, 0x1118, + 0x6887, 0x0001, 0x0008, 0x6886, 0x2001, 0x196e, 0x2004, 0x080c, + 0x2908, 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, 0xa8ed, 0x2011, 0x0002, + 0x080c, 0xa8f7, 0x080c, 0xa801, 0x901e, 0x080c, 0xa877, 0x2069, + 0x0140, 0x2001, 0x00a0, 0x080c, 0x2d52, 0x080c, 0x784e, 0x080c, + 0x6127, 0x0804, 0x77ce, 0x2001, 0x180c, 0x200c, 0xd1b4, 0x1160, + 0xc1b5, 0x2102, 0x080c, 0x73cc, 0x2069, 0x0140, 0x2001, 0x0080, + 0x080c, 0x2d52, 0x60e3, 0x0000, 0x2069, 0x0200, 0x6804, 0x9005, + 0x1118, 0x6808, 0x9005, 0x0180, 0x6028, 0x9084, 0xfdff, 0x602a, + 0x6027, 0x0200, 0x2069, 0x1990, 0x7000, 0x206a, 0x709b, 0x0027, + 0x7003, 0x0001, 0x0804, 0x77ce, 0x6027, 0x1e00, 0x2009, 0x1e00, + 0x080c, 0x2c7a, 0x6024, 0x910c, 0x01c8, 0x9084, 0x1c00, 0x11b0, + 0x1d04, 0x778c, 0x0006, 0x0016, 0x00c6, 0x00d6, 0x00e6, 0x080c, + 0x8642, 0x00ee, 0x00de, 0x00ce, 0x001e, 0x000e, 0x00e6, 0x2071, + 0x19fc, 0x7078, 0x00ee, 0x9005, 0x19f8, 0x0400, 0x0026, 0x2011, + 0x73e4, 0x080c, 0x8709, 0x2011, 0x73d7, 0x080c, 0x87e3, 0x002e, + 0x2069, 0x0140, 0x60e3, 0x0000, 0x70b4, 0x9005, 0x1118, 0x6887, + 0x0001, 0x0008, 0x6886, 0x2001, 0x196e, 0x2004, 0x080c, 0x2908, + 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, 0xd55a, 0x1904, 0x783c, 0x7130, 0xd184, 0x1170, + 0x080c, 0x33a0, 0x0138, 0xc18d, 0x7132, 0x2011, 0x1848, 0x2214, + 0xd2ac, 0x1120, 0x7030, 0xd08c, 0x0904, 0x783c, 0x2011, 0x1848, + 0x220c, 0xd1a4, 0x0538, 0x0016, 0x2019, 0x000e, 0x080c, 0xe915, + 0x0156, 0x00b6, 0x20a9, 0x007f, 0x900e, 0x9186, 0x007e, 0x01a0, + 0x9186, 0x0080, 0x0188, 0x080c, 0x671d, 0x1170, 0x2120, 0x9006, + 0x0016, 0x2009, 0x000e, 0x080c, 0xe9a5, 0x2009, 0x0001, 0x2011, + 0x0100, 0x080c, 0x891c, 0x001e, 0x8108, 0x1f04, 0x7805, 0x00be, + 0x015e, 0x001e, 0xd1ac, 0x1148, 0x0016, 0x2009, 0x0002, 0x2019, + 0x0004, 0x080c, 0x3211, 0x001e, 0x0078, 0x0156, 0x00b6, 0x20a9, + 0x007f, 0x900e, 0x080c, 0x671d, 0x1110, 0x080c, 0x6141, 0x8108, + 0x1f04, 0x7832, 0x00be, 0x015e, 0x080c, 0x1b2f, 0x080c, 0xb072, + 0x60e3, 0x0000, 0x080c, 0x6127, 0x080c, 0x7495, 0x00ee, 0x00ce, + 0x004e, 0x003e, 0x002e, 0x001e, 0x015e, 0x0005, 0x2001, 0x197e, + 0x2003, 0x0001, 0x0005, 0x2001, 0x197e, 0x2003, 0x0000, 0x0005, + 0x2001, 0x197d, 0x2003, 0xaaaa, 0x0005, 0x2001, 0x197d, 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, 0x7e40, 0x9006, 0x00ee, 0x0005, + 0x900e, 0x0156, 0x20a9, 0x0006, 0x8003, 0x2011, 0x0100, 0x2214, + 0x9296, 0x0008, 0x1110, 0x818d, 0x0010, 0x81f5, 0x3e08, 0x1f04, + 0x78c4, 0x015e, 0x0005, 0x2079, 0x0040, 0x2071, 0x18fa, 0x7004, + 0x0002, 0x78e3, 0x78e4, 0x791c, 0x7977, 0x7a87, 0x78e1, 0x78e1, + 0x7ab1, 0x080c, 0x0dc5, 0x0005, 0x2079, 0x0040, 0x782c, 0x908c, + 0x0780, 0x190c, 0x7f22, 0xd0a4, 0x01f8, 0x7824, 0x2048, 0x9006, + 0xa802, 0xa806, 0xa864, 0x9084, 0x00ff, 0x908a, 0x0040, 0x0610, + 0x00c0, 0x2001, 0x1800, 0x200c, 0x9186, 0x0003, 0x1168, 0x7004, + 0x0002, 0x790c, 0x78e6, 0x790c, 0x790a, 0x790c, 0x790c, 0x790c, + 0x790c, 0x790c, 0x080c, 0x7977, 0x782c, 0xd09c, 0x090c, 0x7e40, + 0x0005, 0x9082, 0x005a, 0x1218, 0x2100, 0x003b, 0x0c10, 0x080c, + 0x79ad, 0x0c90, 0x00e3, 0x08e8, 0x0005, 0x79ad, 0x79ad, 0x79ad, + 0x79ad, 0x79ad, 0x79ad, 0x79ad, 0x79ad, 0x79cf, 0x79ad, 0x79ad, + 0x79ad, 0x79ad, 0x79ad, 0x79ad, 0x79ad, 0x79ad, 0x79ad, 0x79ad, + 0x79ad, 0x79ad, 0x79ad, 0x79ad, 0x79ad, 0x79ad, 0x79ad, 0x79ad, + 0x79ad, 0x79b9, 0x79ad, 0x7ba7, 0x79ad, 0x79ad, 0x79ad, 0x79cf, + 0x79ad, 0x79b9, 0x7be8, 0x7c29, 0x7c70, 0x7c84, 0x79ad, 0x79ad, + 0x79cf, 0x79b9, 0x79e3, 0x79ad, 0x7a5b, 0x7d2f, 0x7d4a, 0x79ad, + 0x79cf, 0x79ad, 0x79e3, 0x79ad, 0x79ad, 0x7a51, 0x7d4a, 0x79ad, + 0x79ad, 0x79ad, 0x79ad, 0x79ad, 0x79ad, 0x79ad, 0x79ad, 0x79ad, + 0x79f7, 0x79ad, 0x79ad, 0x79ad, 0x79ad, 0x79ad, 0x79ad, 0x79ad, + 0x79ad, 0x79ad, 0x7ec6, 0x79ad, 0x7e70, 0x79ad, 0x7e70, 0x79ad, + 0x7a0c, 0x79ad, 0x79ad, 0x79ad, 0x79ad, 0x79ad, 0x79ad, 0x2079, + 0x0040, 0x7004, 0x9086, 0x0003, 0x1198, 0x782c, 0x080c, 0x7e69, + 0xd0a4, 0x0170, 0x7824, 0x2048, 0x9006, 0xa802, 0xa806, 0xa864, + 0x9084, 0x00ff, 0x908a, 0x001a, 0x1210, 0x002b, 0x0c50, 0x00e9, + 0x080c, 0x7e40, 0x0005, 0x79ad, 0x79b9, 0x7b93, 0x79ad, 0x79b9, + 0x79ad, 0x79b9, 0x79b9, 0x79ad, 0x79b9, 0x7b93, 0x79b9, 0x79b9, + 0x79b9, 0x79b9, 0x79b9, 0x79ad, 0x79b9, 0x7b93, 0x79ad, 0x79ad, + 0x79b9, 0x79ad, 0x79ad, 0x79ad, 0x79b9, 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, 0x6dd1, 0x012e, 0x0005, 0xa864, + 0x8007, 0x9084, 0x00ff, 0x0d08, 0x8001, 0x1120, 0x7007, 0x0001, + 0x0804, 0x7b30, 0x7007, 0x0003, 0x7012, 0x2900, 0x7016, 0x701a, + 0x704b, 0x7b30, 0x0005, 0xa864, 0x8007, 0x9084, 0x00ff, 0x0968, + 0x8001, 0x1120, 0x7007, 0x0001, 0x0804, 0x7b4b, 0x7007, 0x0003, + 0x7012, 0x2900, 0x7016, 0x701a, 0x704b, 0x7b4b, 0x0005, 0xa864, + 0x8007, 0x9084, 0x00ff, 0x0904, 0x79b5, 0x8001, 0x1120, 0x7007, + 0x0001, 0x0804, 0x7b67, 0x7007, 0x0003, 0x7012, 0x2900, 0x7016, + 0x701a, 0x704b, 0x7b67, 0x0005, 0xa864, 0x8007, 0x9084, 0x00ff, + 0x9086, 0x0001, 0x1904, 0x79b5, 0x7007, 0x0001, 0x2009, 0x1834, + 0x210c, 0x81ff, 0x11a8, 0xa868, 0x9084, 0x00ff, 0xa86a, 0xa883, + 0x0000, 0x080c, 0x63be, 0x1108, 0x0005, 0x0126, 0x2091, 0x8000, + 0xa867, 0x0139, 0xa87a, 0xa982, 0x080c, 0x6dd1, 0x012e, 0x0ca0, + 0xa994, 0x9186, 0x0071, 0x0d38, 0x9186, 0x0064, 0x0d20, 0x9186, + 0x007c, 0x0d08, 0x9186, 0x0028, 0x09f0, 0x9186, 0x0038, 0x09d8, + 0x9186, 0x0078, 0x09c0, 0x9186, 0x005f, 0x09a8, 0x9186, 0x0056, + 0x0990, 0xa897, 0x4005, 0xa89b, 0x0001, 0x2001, 0x0030, 0x900e, + 0x08a0, 0xa87c, 0x9084, 0x00c0, 0x9086, 0x00c0, 0x1120, 0x7007, + 0x0001, 0x0804, 0x7d61, 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, 0x79bd, 0xaab4, 0x928a, 0x0002, + 0x1a04, 0x79bd, 0x82ff, 0x1138, 0xa8b8, 0xa9bc, 0x9105, 0x0118, + 0x2001, 0x7aee, 0x0018, 0x9280, 0x7ae4, 0x2005, 0x7056, 0x7010, + 0x9015, 0x0904, 0x7acf, 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, 0x79bd, 0x7020, 0x2048, 0x7018, 0xa802, 0xa807, + 0x0000, 0x2908, 0x2048, 0xa906, 0x711a, 0x0804, 0x7a87, 0x7014, + 0x2048, 0x7007, 0x0001, 0xa8b4, 0x9005, 0x1128, 0xa8b8, 0xa9bc, + 0x9105, 0x0108, 0x00b9, 0xa864, 0x9084, 0x00ff, 0x9086, 0x001e, + 0x0904, 0x7d61, 0x0804, 0x7b30, 0x7ae6, 0x7aea, 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, 0x61bb, 0x1108, + 0x0005, 0x080c, 0x703d, 0x0126, 0x2091, 0x8000, 0x080c, 0xd14c, + 0x080c, 0x6dd1, 0x012e, 0x0ca0, 0x080c, 0xd55a, 0x1d70, 0x2001, + 0x0028, 0x900e, 0x0c70, 0x2009, 0x1834, 0x210c, 0x81ff, 0x1188, + 0xa888, 0x9005, 0x0188, 0xa883, 0x0000, 0x080c, 0x624b, 0x1108, + 0x0005, 0xa87a, 0x0126, 0x2091, 0x8000, 0x080c, 0x6dd1, 0x012e, + 0x0cb8, 0x2001, 0x0028, 0x0ca8, 0x2001, 0x0000, 0x0c90, 0x0419, + 0x11d8, 0xa888, 0x9005, 0x01e0, 0xa883, 0x0000, 0xa87c, 0xd0f4, + 0x0120, 0x080c, 0x6320, 0x1138, 0x0005, 0x9006, 0xa87a, 0x080c, + 0x6298, 0x1108, 0x0005, 0x0126, 0x2091, 0x8000, 0xa87a, 0xa982, + 0x080c, 0x6dd1, 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, + 0x671d, 0x11b8, 0x0066, 0xae80, 0x080c, 0x682d, 0x006e, 0x0088, + 0x0046, 0x2011, 0x180c, 0x2224, 0xc484, 0x2412, 0x004e, 0x00c6, + 0x080c, 0x671d, 0x1110, 0x080c, 0x692d, 0x8108, 0x1f04, 0x7bd0, + 0x00ce, 0xa87c, 0xd084, 0x1120, 0x080c, 0x1040, 0x00be, 0x0005, + 0x0126, 0x2091, 0x8000, 0x080c, 0x6dd1, 0x012e, 0x00be, 0x0005, + 0x0126, 0x2091, 0x8000, 0x7007, 0x0001, 0x080c, 0x6a8e, 0x0580, + 0x2061, 0x1a75, 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, 0x7e2a, + 0x012e, 0x0804, 0x7e24, 0x012e, 0x0804, 0x7e1e, 0x012e, 0x0804, + 0x7e21, 0x0126, 0x2091, 0x8000, 0x7007, 0x0001, 0x080c, 0x6a8e, + 0x05e0, 0x2061, 0x1a75, 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, 0x7e2a, 0x012e, 0x0804, 0x7e27, 0x012e, 0x0804, 0x7e24, + 0x0126, 0x2091, 0x8000, 0x7007, 0x0001, 0x2061, 0x1a75, 0x6300, + 0xd38c, 0x1120, 0x6308, 0x8318, 0x0220, 0x630a, 0x012e, 0x0804, + 0x7e38, 0x012e, 0x0804, 0x7e27, 0x00b6, 0x0126, 0x00c6, 0x2091, + 0x8000, 0x7007, 0x0001, 0xa87c, 0xd0ac, 0x0148, 0x00c6, 0x2061, + 0x1a75, 0x6000, 0x9084, 0xfcff, 0x6002, 0x00ce, 0x0440, 0xa888, + 0x9005, 0x05d8, 0xa88c, 0x9065, 0x0598, 0x2001, 0x1834, 0x2004, + 0x9005, 0x0118, 0x080c, 0xb134, 0x0068, 0x6017, 0xf400, 0x605b, + 0x0000, 0xa97c, 0xd1a4, 0x0110, 0xa980, 0x615a, 0x2009, 0x0041, + 0x080c, 0xb180, 0xa988, 0x918c, 0xff00, 0x9186, 0x2000, 0x1138, + 0x0026, 0x900e, 0x2011, 0xfdff, 0x080c, 0x891c, 0x002e, 0xa87c, + 0xd0c4, 0x0148, 0x2061, 0x1a75, 0x6000, 0xd08c, 0x1120, 0x6008, + 0x8000, 0x0208, 0x600a, 0x00ce, 0x012e, 0x00be, 0x0804, 0x7e2a, + 0x00ce, 0x012e, 0x00be, 0x0804, 0x7e24, 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, + 0x671d, 0x1968, 0xb800, 0xc0e4, 0xb802, 0x0848, 0xa88c, 0x9065, + 0x09b8, 0x6007, 0x0024, 0x2001, 0x1987, 0x2004, 0x601a, 0x0804, + 0x7cbf, 0xa88c, 0x9065, 0x0960, 0x00e6, 0xa890, 0x9075, 0x2001, + 0x1834, 0x2004, 0x9005, 0x0150, 0x080c, 0xb134, 0x8eff, 0x0118, + 0x2e60, 0x080c, 0xb134, 0x00ee, 0x0804, 0x7cbf, 0x6024, 0xc0dc, + 0xc0d5, 0x6026, 0x2e60, 0x6007, 0x003a, 0xa8a0, 0x9005, 0x0130, + 0x6007, 0x003b, 0xa8a4, 0x602e, 0xa8a8, 0x6016, 0x6003, 0x0001, + 0x080c, 0x933b, 0x080c, 0x98ed, 0x00ee, 0x0804, 0x7cbf, 0x2061, + 0x1a75, 0x6000, 0xd084, 0x0190, 0xd08c, 0x1904, 0x7e38, 0x0126, + 0x2091, 0x8000, 0x6204, 0x8210, 0x0220, 0x6206, 0x012e, 0x0804, + 0x7e38, 0x012e, 0xa883, 0x0016, 0x0804, 0x7e31, 0xa883, 0x0007, + 0x0804, 0x7e31, 0xa864, 0x8007, 0x9084, 0x00ff, 0x0130, 0x8001, + 0x1138, 0x7007, 0x0001, 0x0069, 0x0005, 0x080c, 0x79b5, 0x0040, + 0x7007, 0x0003, 0x7012, 0x2900, 0x7016, 0x701a, 0x704b, 0x7d61, + 0x0005, 0x00b6, 0x00e6, 0x0126, 0x2091, 0x8000, 0x903e, 0x2061, + 0x1800, 0x61d0, 0x81ff, 0x1904, 0x7de3, 0x6130, 0xd194, 0x1904, + 0x7e0d, 0xa878, 0x2070, 0x9e82, 0x1cd0, 0x0a04, 0x7dd7, 0x6068, + 0x9e02, 0x1a04, 0x7dd7, 0x7120, 0x9186, 0x0006, 0x1904, 0x7dc9, + 0x7010, 0x905d, 0x0904, 0x7de3, 0xb800, 0xd0e4, 0x1904, 0x7e07, + 0x2061, 0x1a75, 0x6100, 0x9184, 0x0301, 0x9086, 0x0001, 0x15a0, + 0x7024, 0xd0dc, 0x1904, 0x7e10, 0xa883, 0x0000, 0xa803, 0x0000, + 0x2908, 0x7014, 0x9005, 0x1198, 0x7116, 0xa87c, 0xd0f4, 0x1904, + 0x7e13, 0x080c, 0x57d3, 0xd09c, 0x1118, 0xa87c, 0xc0cc, 0xa87e, + 0x2e60, 0x080c, 0x883c, 0x012e, 0x00ee, 0x00be, 0x0005, 0x2048, + 0xa800, 0x9005, 0x1de0, 0xa902, 0x2148, 0xa87c, 0xd0f4, 0x1904, + 0x7e13, 0x012e, 0x00ee, 0x00be, 0x0005, 0x012e, 0x00ee, 0xa883, + 0x0006, 0x00be, 0x0804, 0x7e31, 0xd184, 0x0db8, 0xd1c4, 0x1190, + 0x00a0, 0xa974, 0x080c, 0x671d, 0x15d0, 0xb800, 0xd0e4, 0x15b8, + 0x7120, 0x9186, 0x0007, 0x1118, 0xa883, 0x0002, 0x0490, 0xa883, + 0x0008, 0x0478, 0xa883, 0x000e, 0x0460, 0xa883, 0x0017, 0x0448, + 0xa883, 0x0035, 0x0430, 0x080c, 0x57d7, 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, 0x7d6d, + 0x7003, 0x0002, 0x0804, 0x7d6d, 0xa883, 0x0028, 0x0010, 0xa883, + 0x0029, 0x012e, 0x00ee, 0x00be, 0x0420, 0xa883, 0x002a, 0x0cc8, + 0xa883, 0x0045, 0x0cb0, 0x2e60, 0x2019, 0x0002, 0x601b, 0x0014, + 0x080c, 0xe4c8, 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, 0x6dd1, 0x012e, 0x0005, + 0x080c, 0x1040, 0x0005, 0x00d6, 0x080c, 0x8833, 0x00de, 0x0005, + 0x00d6, 0x00e6, 0x0126, 0x2091, 0x8000, 0x2071, 0x0040, 0x702c, + 0xd084, 0x01d8, 0x908c, 0x0780, 0x190c, 0x7f22, 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, 0x7f22, 0x000e, 0x0005, + 0xa898, 0x9084, 0x0003, 0x05a8, 0x080c, 0xb0ab, 0x05d8, 0x2900, + 0x6016, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0035, 0x1138, 0x6008, + 0xc0fd, 0x600a, 0x2001, 0x196c, 0x2004, 0x0098, 0xa8a0, 0x9084, + 0x00ff, 0xa99c, 0x918c, 0xff00, 0x9105, 0xa99c, 0x918c, 0x00ff, + 0x080c, 0x2894, 0x1540, 0x00b6, 0x080c, 0x671d, 0x2b00, 0x00be, + 0x1510, 0x6012, 0x6023, 0x0001, 0x2009, 0x0040, 0xa864, 0x9084, + 0x00ff, 0x9086, 0x0035, 0x0110, 0x2009, 0x0041, 0x080c, 0xb180, + 0x0005, 0xa87b, 0x0101, 0x0126, 0x2091, 0x8000, 0x080c, 0x6dd1, + 0x012e, 0x0005, 0xa87b, 0x002c, 0x0126, 0x2091, 0x8000, 0x080c, + 0x6dd1, 0x012e, 0x0005, 0xa87b, 0x0028, 0x0126, 0x2091, 0x8000, + 0x080c, 0x6dd1, 0x012e, 0x080c, 0xb101, 0x0005, 0x00d6, 0x00c6, + 0x0036, 0x0026, 0x0016, 0x00b6, 0x7007, 0x0001, 0xaa74, 0x9282, + 0x0004, 0x1a04, 0x7f13, 0xa97c, 0x9188, 0x1000, 0x2104, 0x905d, + 0xb804, 0xd284, 0x0140, 0x05e8, 0x8007, 0x9084, 0x00ff, 0x9084, + 0x0006, 0x1108, 0x04b0, 0x2b10, 0x080c, 0xb0ab, 0x1118, 0x080c, + 0xb153, 0x05a8, 0x6212, 0xa874, 0x0002, 0x7ef1, 0x7ef6, 0x7ef9, + 0x7eff, 0x2019, 0x0002, 0x080c, 0xe915, 0x0060, 0x080c, 0xe8ac, + 0x0048, 0x2019, 0x0002, 0xa980, 0x080c, 0xe8c7, 0x0018, 0xa980, + 0x080c, 0xe8ac, 0x080c, 0xb101, 0xa887, 0x0000, 0x0126, 0x2091, + 0x8000, 0x080c, 0x6dd1, 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, 0x7f24, 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, + 0x7fa4, 0x68c0, 0x90aa, 0x0005, 0x0a04, 0x85e8, 0x7d44, 0x7c40, + 0x9584, 0x00f6, 0x1510, 0x9484, 0x7000, 0x0140, 0x908a, 0x2000, + 0x1260, 0x9584, 0x0700, 0x8007, 0x0804, 0x7fab, 0x7000, 0x9084, + 0xff00, 0x9086, 0x8100, 0x0da8, 0x00b0, 0x9484, 0x0fff, 0x1130, + 0x7000, 0x9084, 0xff00, 0x9086, 0x8100, 0x11c0, 0x080c, 0xedd2, + 0x080c, 0x84cd, 0x7817, 0x0140, 0x00a8, 0x9584, 0x0076, 0x1118, + 0x080c, 0x852b, 0x19c0, 0xd5a4, 0x0148, 0x0046, 0x0056, 0x080c, + 0x8006, 0x080c, 0x2397, 0x005e, 0x004e, 0x0020, 0x080c, 0xedd2, + 0x7817, 0x0140, 0x080c, 0x7569, 0x0168, 0x2001, 0x0111, 0x2004, + 0xd08c, 0x0140, 0x6893, 0x0000, 0x2001, 0x0110, 0x2003, 0x0008, + 0x2003, 0x0000, 0x080c, 0x7fe7, 0x2001, 0x19f2, 0x2004, 0x9005, + 0x090c, 0x98ed, 0x0005, 0x0002, 0x7fbd, 0x82d5, 0x7fb4, 0x7fb4, + 0x7fb4, 0x7fb4, 0x7fb4, 0x7fb4, 0x7817, 0x0140, 0x2001, 0x19f2, + 0x2004, 0x9005, 0x090c, 0x98ed, 0x0005, 0x7000, 0x908c, 0xff00, + 0x9194, 0xf000, 0x810f, 0x9484, 0x0fff, 0x6892, 0x9286, 0x2000, + 0x1150, 0x6800, 0x9086, 0x0001, 0x1118, 0x080c, 0x583d, 0x0070, + 0x080c, 0x8026, 0x0058, 0x9286, 0x3000, 0x1118, 0x080c, 0x820d, + 0x0028, 0x9286, 0x8000, 0x1110, 0x080c, 0x83f4, 0x7817, 0x0140, + 0x2001, 0x19f2, 0x2004, 0x9005, 0x090c, 0x98ed, 0x0005, 0x2001, + 0x1810, 0x2004, 0xd08c, 0x0178, 0x2001, 0x1800, 0x2004, 0x9086, + 0x0003, 0x1148, 0x0026, 0x0036, 0x2011, 0x8048, 0x2518, 0x080c, + 0x4be9, 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, 0x4be9, + 0x002e, 0x00fe, 0x005e, 0x004e, 0x003e, 0x0005, 0x00b6, 0x00c6, + 0x7010, 0x9084, 0xff00, 0x8007, 0x9096, 0x0001, 0x0120, 0x9096, + 0x0023, 0x1904, 0x81de, 0x9186, 0x0023, 0x15c0, 0x080c, 0x8492, + 0x0904, 0x81de, 0x6120, 0x9186, 0x0001, 0x0150, 0x9186, 0x0004, + 0x0138, 0x9186, 0x0008, 0x0120, 0x9186, 0x000a, 0x1904, 0x81de, + 0x7124, 0x610a, 0x7030, 0x908e, 0x0200, 0x1130, 0x2009, 0x0015, + 0x080c, 0xb180, 0x0804, 0x81de, 0x908e, 0x0214, 0x0118, 0x908e, + 0x0210, 0x1130, 0x2009, 0x0015, 0x080c, 0xb180, 0x0804, 0x81de, + 0x908e, 0x0100, 0x1904, 0x81de, 0x7034, 0x9005, 0x1904, 0x81de, + 0x2009, 0x0016, 0x080c, 0xb180, 0x0804, 0x81de, 0x9186, 0x0022, + 0x1904, 0x81de, 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, 0x28dd, 0x7932, 0x7936, 0x001e, + 0x000e, 0x00fe, 0x080c, 0x2894, 0x695e, 0x703c, 0x00e6, 0x2071, + 0x0140, 0x7086, 0x2071, 0x1800, 0x70b6, 0x00ee, 0x7034, 0x9005, + 0x1904, 0x81de, 0x2009, 0x0017, 0x0804, 0x818e, 0x908e, 0x0400, + 0x1190, 0x7034, 0x9005, 0x1904, 0x81de, 0x080c, 0x7569, 0x0120, + 0x2009, 0x001d, 0x0804, 0x818e, 0x68dc, 0xc0a5, 0x68de, 0x2009, + 0x0030, 0x0804, 0x818e, 0x908e, 0x0500, 0x1140, 0x7034, 0x9005, + 0x1904, 0x81de, 0x2009, 0x0018, 0x0804, 0x818e, 0x908e, 0x2010, + 0x1120, 0x2009, 0x0019, 0x0804, 0x818e, 0x908e, 0x2110, 0x1120, + 0x2009, 0x001a, 0x0804, 0x818e, 0x908e, 0x5200, 0x1140, 0x7034, + 0x9005, 0x1904, 0x81de, 0x2009, 0x001b, 0x0804, 0x818e, 0x908e, + 0x5000, 0x1140, 0x7034, 0x9005, 0x1904, 0x81de, 0x2009, 0x001c, + 0x0804, 0x818e, 0x908e, 0x1300, 0x1120, 0x2009, 0x0034, 0x0804, + 0x818e, 0x908e, 0x1200, 0x1140, 0x7034, 0x9005, 0x1904, 0x81de, + 0x2009, 0x0024, 0x0804, 0x818e, 0x908c, 0xff00, 0x918e, 0x2400, + 0x1170, 0x2009, 0x002d, 0x2001, 0x1810, 0x2004, 0xd09c, 0x0904, + 0x818e, 0x080c, 0xdc98, 0x1904, 0x81de, 0x0804, 0x818c, 0x908c, + 0xff00, 0x918e, 0x5300, 0x1120, 0x2009, 0x002a, 0x0804, 0x818e, + 0x908e, 0x0f00, 0x1120, 0x2009, 0x0020, 0x0804, 0x818e, 0x908e, + 0x6104, 0x1530, 0x2029, 0x0205, 0x2011, 0x026d, 0x8208, 0x2204, + 0x9082, 0x0004, 0x8004, 0x8004, 0x20a8, 0x2011, 0x8015, 0x211c, + 0x8108, 0x0046, 0x2124, 0x080c, 0x4be9, 0x004e, 0x8108, 0x0f04, + 0x8142, 0x9186, 0x0280, 0x1d88, 0x2504, 0x8000, 0x202a, 0x2009, + 0x0260, 0x0c58, 0x202b, 0x0000, 0x2009, 0x0023, 0x0804, 0x818e, + 0x908e, 0x6000, 0x1120, 0x2009, 0x003f, 0x0804, 0x818e, 0x908e, + 0x5400, 0x1138, 0x080c, 0x8598, 0x1904, 0x81de, 0x2009, 0x0046, + 0x04a8, 0x908e, 0x5500, 0x1148, 0x080c, 0x85c0, 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, 0x2894, 0x1904, 0x81e1, + 0x080c, 0x66b2, 0x1904, 0x81e1, 0xbe12, 0xbd16, 0x001e, 0x0016, + 0x080c, 0x7569, 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, 0xb0ab, 0x01a8, 0x2b08, 0x6112, + 0x6023, 0x0004, 0x7120, 0x610a, 0x001e, 0x9186, 0x004c, 0x1110, + 0x6023, 0x000a, 0x0016, 0x001e, 0x080c, 0xb180, 0x00ce, 0x00be, + 0x0005, 0x001e, 0x0cd8, 0x2001, 0x180e, 0x2004, 0xd0ec, 0x0120, + 0x2011, 0x8049, 0x080c, 0x4be9, 0x080c, 0xb153, 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, 0x9383, 0x08a0, 0x080c, 0x8607, 0x1158, + 0x080c, 0x336a, 0x1140, 0x7010, 0x9084, 0xff00, 0x8007, 0x908e, + 0x0008, 0x1108, 0x0009, 0x0005, 0x00b6, 0x00c6, 0x0046, 0x7000, + 0x908c, 0xff00, 0x810f, 0x9186, 0x0033, 0x11e8, 0x080c, 0x8492, + 0x0904, 0x826d, 0x7124, 0x610a, 0x7030, 0x908e, 0x0200, 0x1140, + 0x7034, 0x9005, 0x15d0, 0x2009, 0x0015, 0x080c, 0xb180, 0x04a8, + 0x908e, 0x0100, 0x1590, 0x7034, 0x9005, 0x1578, 0x2009, 0x0016, + 0x080c, 0xb180, 0x0450, 0x9186, 0x0032, 0x1538, 0x7030, 0x908e, + 0x1400, 0x1518, 0x2009, 0x0038, 0x0016, 0x2011, 0x0263, 0x2204, + 0x8211, 0x220c, 0x080c, 0x2894, 0x11b8, 0x080c, 0x66b2, 0x11a0, + 0xbe12, 0xbd16, 0x080c, 0xb0ab, 0x0178, 0x2b08, 0x6112, 0x080c, + 0xd2d2, 0x6023, 0x0004, 0x7120, 0x610a, 0x001e, 0x080c, 0xb180, + 0x080c, 0x98ed, 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, 0x82cf, 0x9596, 0xfffe, 0x1120, 0x2009, + 0x007e, 0x0804, 0x82cf, 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, 0x82a4, + 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, 0x19f2, + 0x2004, 0x9005, 0x090c, 0x98ed, 0x0005, 0x82fd, 0x82fd, 0x82fd, + 0x84a4, 0x82fd, 0x8306, 0x8331, 0x83bf, 0x82fd, 0x82fd, 0x82fd, + 0x82fd, 0x82fd, 0x82fd, 0x82fd, 0x82fd, 0x7817, 0x0140, 0x2001, + 0x19f2, 0x2004, 0x9005, 0x090c, 0x98ed, 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, 0xb180, 0x7817, + 0x0140, 0x2001, 0x19f2, 0x2004, 0x9005, 0x090c, 0x98ed, 0x00be, + 0x0005, 0x00b6, 0x00c6, 0x9484, 0x0fff, 0x0904, 0x8395, 0x7110, + 0xd1bc, 0x1904, 0x8395, 0x7108, 0x700c, 0x2028, 0x918c, 0x00ff, + 0x2130, 0x9094, 0xff00, 0x15b0, 0x81ff, 0x15a0, 0x9080, 0x33ac, + 0x200d, 0x918c, 0xff00, 0x810f, 0x2001, 0x0080, 0x9106, 0x0904, + 0x8395, 0x080c, 0x66b2, 0x1904, 0x8395, 0xbe12, 0xbd16, 0xb800, + 0xd0ec, 0x15d8, 0xba04, 0x9294, 0xff00, 0x9286, 0x0600, 0x11a0, + 0x080c, 0xb0ab, 0x05e8, 0x2b08, 0x7028, 0x6046, 0x702c, 0x604a, + 0x6112, 0x6023, 0x0006, 0x7120, 0x610a, 0x7130, 0x6156, 0x2009, + 0x0044, 0x080c, 0xdf10, 0x0408, 0x080c, 0x6a92, 0x1138, 0xb807, + 0x0606, 0x0c30, 0x190c, 0x8271, 0x11c0, 0x0898, 0x080c, 0xb0ab, + 0x2b08, 0x0198, 0x6112, 0x6023, 0x0004, 0x7120, 0x610a, 0x9286, + 0x0400, 0x1118, 0x6007, 0x0005, 0x0010, 0x6007, 0x0001, 0x6003, + 0x0001, 0x080c, 0x9383, 0x080c, 0x98ed, 0x7817, 0x0140, 0x2001, + 0x19f2, 0x2004, 0x9005, 0x090c, 0x98ed, 0x00ce, 0x00be, 0x0005, + 0x2001, 0x180e, 0x2004, 0xd0ec, 0x0120, 0x2011, 0x8049, 0x080c, + 0x4be9, 0x080c, 0xb153, 0x0d48, 0x2b08, 0x6112, 0x6023, 0x0006, + 0x7120, 0x610a, 0x7130, 0x6156, 0x6017, 0xf300, 0x6003, 0x0001, + 0x6007, 0x0041, 0x080c, 0x933b, 0x080c, 0x98ed, 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, 0xb180, + 0x7817, 0x0140, 0x2001, 0x19f2, 0x2004, 0x9005, 0x090c, 0x98ed, + 0x00be, 0x0005, 0x6120, 0x9186, 0x0002, 0x0128, 0x9186, 0x0005, + 0x0110, 0x9085, 0x0001, 0x0005, 0x080c, 0x8607, 0x1180, 0x080c, + 0x336a, 0x1168, 0x7010, 0x9084, 0xff00, 0x8007, 0x9086, 0x0000, + 0x1130, 0x9184, 0x000f, 0x908a, 0x0006, 0x1208, 0x000b, 0x0005, + 0x840e, 0x840f, 0x840e, 0x840e, 0x8474, 0x8483, 0x0005, 0x00b6, + 0x700c, 0x7108, 0x080c, 0x2894, 0x1904, 0x8472, 0x080c, 0x66b2, + 0x1904, 0x8472, 0xbe12, 0xbd16, 0x7110, 0xd1bc, 0x0540, 0x702c, + 0xd084, 0x1120, 0xb800, 0xd0bc, 0x1904, 0x8472, 0x080c, 0x6a92, + 0x0148, 0x9086, 0x0004, 0x0130, 0x080c, 0x6a9a, 0x0118, 0x9086, + 0x0004, 0x1588, 0x00c6, 0x080c, 0x8492, 0x00ce, 0x05d8, 0x080c, + 0xb0ab, 0x2b08, 0x05b8, 0x6112, 0x080c, 0xd2d2, 0x6023, 0x0002, + 0x7120, 0x610a, 0x2009, 0x0088, 0x080c, 0xb180, 0x0458, 0x080c, + 0x6a92, 0x0148, 0x9086, 0x0004, 0x0130, 0x080c, 0x6a9a, 0x0118, + 0x9086, 0x0004, 0x1180, 0x080c, 0xb0ab, 0x2b08, 0x01d8, 0x6112, + 0x080c, 0xd2d2, 0x6023, 0x0005, 0x7120, 0x610a, 0x2009, 0x0088, + 0x080c, 0xb180, 0x0078, 0x080c, 0xb0ab, 0x2b08, 0x0158, 0x6112, + 0x080c, 0xd2d2, 0x6023, 0x0004, 0x7120, 0x610a, 0x2009, 0x0001, + 0x080c, 0xb180, 0x00be, 0x0005, 0x7110, 0xd1bc, 0x0158, 0x00d1, + 0x0148, 0x080c, 0x83ea, 0x1130, 0x7124, 0x610a, 0x2009, 0x0089, + 0x080c, 0xb180, 0x0005, 0x7110, 0xd1bc, 0x0158, 0x0059, 0x0148, + 0x080c, 0x83ea, 0x1130, 0x7124, 0x610a, 0x2009, 0x008a, 0x080c, + 0xb180, 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, 0xb180, 0x7817, 0x0140, 0x2001, 0x19f2, 0x2004, + 0x9005, 0x090c, 0x98ed, 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, 0xb0ab, + 0x05b8, 0x0066, 0x00c6, 0x0046, 0x2011, 0x0263, 0x2204, 0x8211, + 0x220c, 0x080c, 0x2894, 0x15a0, 0x080c, 0x66b2, 0x1588, 0xbe12, + 0xbd16, 0x2b00, 0x004e, 0x00ce, 0x6012, 0x080c, 0xd2d2, 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, 0x9383, 0x080c, 0x98ed, + 0x00fe, 0x009e, 0x00ce, 0x0005, 0x080c, 0xb101, 0x006e, 0x0cc0, + 0x004e, 0x00ce, 0x0cc8, 0x00c6, 0x7000, 0x908c, 0xff00, 0x9184, + 0xf000, 0x810f, 0x9086, 0x2000, 0x1904, 0x8582, 0x9186, 0x0022, + 0x15f0, 0x2001, 0x0111, 0x2004, 0x9005, 0x1904, 0x8584, 0x7030, + 0x908e, 0x0400, 0x0904, 0x8584, 0x908e, 0x6000, 0x05e8, 0x908e, + 0x5400, 0x05d0, 0x908e, 0x0300, 0x11d8, 0x2009, 0x1837, 0x210c, + 0xd18c, 0x1590, 0xd1a4, 0x1580, 0x080c, 0x6a50, 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, 0x8492, 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, 0xc0e3, 0x1178, 0xd48c, 0x0148, 0x20a9, 0x0004, + 0x2019, 0x1801, 0x2011, 0x027e, 0x080c, 0xc0e3, 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, 0xc0e3, 0x1178, 0xd48c, 0x0148, 0x20a9, 0x0004, + 0x2019, 0x1801, 0x2011, 0x0276, 0x080c, 0xc0e3, 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, 0x19fc, + 0x7003, 0x0003, 0x700f, 0x0361, 0x9006, 0x701a, 0x707a, 0x7012, + 0x7017, 0x1cd0, 0x7007, 0x0000, 0x7026, 0x702b, 0xa52d, 0x7032, + 0x703a, 0x703f, 0x0064, 0x7037, 0xa595, 0x7047, 0xffff, 0x704a, + 0x704f, 0x5665, 0x7052, 0x7063, 0x87aa, 0x080c, 0x1027, 0x090c, + 0x0dc5, 0x2900, 0x7042, 0xa867, 0x0003, 0xa86f, 0x0100, 0xa8ab, + 0xdcb0, 0x0005, 0x2071, 0x19fc, 0x1d04, 0x86f8, 0x2091, 0x6000, + 0x700c, 0x8001, 0x700e, 0x1540, 0x2001, 0x013c, 0x2004, 0x9005, + 0x190c, 0x8818, 0x2001, 0x1869, 0x2004, 0xd0c4, 0x0158, 0x3a00, + 0xd08c, 0x1140, 0x20d1, 0x0000, 0x20d1, 0x0001, 0x20d1, 0x0000, + 0x080c, 0x0dc5, 0x700f, 0x0361, 0x7007, 0x0001, 0x0126, 0x2091, + 0x8000, 0x080c, 0x87ef, 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, 0x7569, 0x0178, 0x00e6, + 0x2071, 0x19e9, 0x080c, 0xa623, 0x00ee, 0x1140, 0x2009, 0x1a87, + 0x2104, 0x8000, 0x0208, 0x200a, 0x001e, 0x0068, 0x001e, 0x702f, + 0x0009, 0x8109, 0x7132, 0x0128, 0x9184, 0x007f, 0x090c, 0xa6d9, + 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, 0x8720, 0x8721, 0x873d, 0x00e6, 0x2071, 0x19fc, + 0x7018, 0x9005, 0x1120, 0x711a, 0x721e, 0x700b, 0x0009, 0x00ee, + 0x0005, 0x00e6, 0x0006, 0x2071, 0x19fc, 0x701c, 0x9206, 0x1120, + 0x701a, 0x701e, 0x707a, 0x707e, 0x000e, 0x00ee, 0x0005, 0x00e6, + 0x2071, 0x19fc, 0xb888, 0x9102, 0x0208, 0xb98a, 0x00ee, 0x0005, + 0x0005, 0x00b6, 0x7110, 0x080c, 0x671d, 0x1168, 0xb888, 0x8001, + 0x0250, 0xb88a, 0x1140, 0x0126, 0x2091, 0x8000, 0x0016, 0x080c, + 0x98ed, 0x001e, 0x012e, 0x8108, 0x9182, 0x0800, 0x0218, 0x900e, + 0x7007, 0x0002, 0x7112, 0x00be, 0x0005, 0x7014, 0x2060, 0x0126, + 0x2091, 0x8000, 0x6040, 0x9005, 0x0128, 0x8001, 0x6042, 0x1110, + 0x080c, 0xd163, 0x6018, 0x9005, 0x0558, 0x8001, 0x601a, 0x1540, + 0x6120, 0x9186, 0x0003, 0x0148, 0x9186, 0x0006, 0x0130, 0x9186, + 0x0009, 0x11e0, 0x611c, 0xd1c4, 0x1100, 0x080c, 0xce56, 0x01b0, + 0x6014, 0x2048, 0xa884, 0x908a, 0x199a, 0x0280, 0x9082, 0x1999, + 0xa886, 0x908a, 0x199a, 0x0210, 0x2001, 0x1999, 0x8003, 0x800b, + 0x810b, 0x9108, 0x611a, 0xa87c, 0xd0e4, 0x0110, 0x080c, 0xcb3e, + 0x012e, 0x9c88, 0x0018, 0x7116, 0x2001, 0x181a, 0x2004, 0x9102, + 0x0220, 0x7017, 0x1cd0, 0x7007, 0x0000, 0x0005, 0x00e6, 0x2071, + 0x19fc, 0x7027, 0x07d0, 0x7023, 0x0009, 0x00ee, 0x0005, 0x2001, + 0x1a05, 0x2003, 0x0000, 0x0005, 0x00e6, 0x2071, 0x19fc, 0x7132, + 0x702f, 0x0009, 0x00ee, 0x0005, 0x2011, 0x1a08, 0x2013, 0x0000, + 0x0005, 0x00e6, 0x2071, 0x19fc, 0x711a, 0x721e, 0x700b, 0x0009, + 0x00ee, 0x0005, 0x0086, 0x0026, 0x705c, 0x8000, 0x705e, 0x2001, + 0x1a0c, 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, 0x8642, 0x015e, + 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, 0x00ae, 0x009e, 0x001e, + 0x000e, 0x0005, 0x00e6, 0x2071, 0x19fc, 0x717a, 0x727e, 0x7077, + 0x0009, 0x00ee, 0x0005, 0x00e6, 0x0006, 0x2071, 0x19fc, 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, + 0x1a75, 0x00ce, 0x0005, 0x9184, 0x000f, 0x8003, 0x8003, 0x8003, + 0x9080, 0x1a75, 0x2060, 0x0005, 0xa884, 0x908a, 0x199a, 0x1638, + 0x9005, 0x1150, 0x00c6, 0x2061, 0x1a75, 0x6014, 0x00ce, 0x9005, + 0x1130, 0x2001, 0x001e, 0x0018, 0x908e, 0xffff, 0x01b0, 0x8003, + 0x800b, 0x810b, 0x9108, 0x611a, 0xa87c, 0x908c, 0x00c0, 0x918e, + 0x00c0, 0x0904, 0x88c6, 0xd0b4, 0x1168, 0xd0bc, 0x1904, 0x889f, + 0x2009, 0x0006, 0x080c, 0x88f3, 0x0005, 0x900e, 0x0c60, 0x2001, + 0x1999, 0x08b0, 0xd0fc, 0x0160, 0x908c, 0x0003, 0x0120, 0x918e, + 0x0003, 0x1904, 0x88ed, 0x908c, 0x2020, 0x918e, 0x2020, 0x01a8, + 0x6024, 0xd0d4, 0x11e8, 0x2009, 0x1869, 0x2104, 0xd084, 0x1138, + 0x87ff, 0x1120, 0x2009, 0x0043, 0x0804, 0xb180, 0x0005, 0x87ff, + 0x1de8, 0x2009, 0x0042, 0x0804, 0xb180, 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, 0x88ed, + 0x908c, 0x2020, 0x918e, 0x2020, 0x0170, 0x0076, 0x00f6, 0x2c78, + 0x080c, 0x1768, 0x00fe, 0x007e, 0x87ff, 0x1120, 0x2009, 0x0042, + 0x080c, 0xb180, 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, 0xb180, + 0x0005, 0x00b9, 0x0ce8, 0x87ff, 0x1dd8, 0x2009, 0x0043, 0x080c, + 0xb180, 0x0cb0, 0x6110, 0x00b6, 0x2158, 0xb900, 0x00be, 0xd1ac, + 0x0d20, 0x6124, 0xc1cd, 0x6126, 0x0c00, 0x2009, 0x0004, 0x0019, + 0x0005, 0x2009, 0x0001, 0x0096, 0x080c, 0xce56, 0x0518, 0x6014, + 0x2048, 0xa982, 0xa800, 0x6016, 0x9186, 0x0001, 0x1188, 0xa97c, + 0x918c, 0x8100, 0x918e, 0x8100, 0x1158, 0x00c6, 0x2061, 0x1a75, + 0x6200, 0xd28c, 0x1120, 0x6204, 0x8210, 0x0208, 0x6206, 0x00ce, + 0x080c, 0x6c10, 0x6014, 0x904d, 0x0076, 0x2039, 0x0000, 0x190c, + 0x883c, 0x007e, 0x009e, 0x0005, 0x0156, 0x00c6, 0x2061, 0x1a75, + 0x6000, 0x81ff, 0x0110, 0x9205, 0x0008, 0x9204, 0x6002, 0x00ce, + 0x015e, 0x0005, 0x6800, 0xd08c, 0x1138, 0x6808, 0x9005, 0x0120, + 0x8001, 0x680a, 0x9085, 0x0001, 0x0005, 0x2071, 0x1925, 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, 0x1925, 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, 0x1ad2, 0x2104, 0x9082, 0x0007, 0x200a, 0x000e, 0xc095, + 0x7012, 0x2008, 0x2001, 0x003b, 0x080c, 0x1611, 0x9006, 0x2071, + 0x193e, 0x7002, 0x7006, 0x702a, 0x00ee, 0x009e, 0x012e, 0x0005, + 0x2009, 0x1ad2, 0x2104, 0x9080, 0x0007, 0x200a, 0x0005, 0x00e6, + 0x0126, 0x0156, 0x2091, 0x8000, 0x2071, 0x1800, 0x7154, 0x2001, + 0x0008, 0x910a, 0x0638, 0x2001, 0x187d, 0x20ac, 0x9006, 0x9080, + 0x0008, 0x1f04, 0x89af, 0x71c0, 0x9102, 0x02e0, 0x2071, 0x1877, + 0x20a9, 0x0007, 0x00c6, 0x080c, 0xb0ab, 0x6023, 0x0009, 0x6003, + 0x0004, 0x601f, 0x0101, 0x0089, 0x0126, 0x2091, 0x8000, 0x080c, + 0x8b2d, 0x012e, 0x1f04, 0x89bb, 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, 0x1925, + 0x7004, 0x004b, 0x700c, 0x0002, 0x8a27, 0x8a20, 0x8a20, 0x0005, + 0x8a31, 0x8a87, 0x8a87, 0x8a87, 0x8a88, 0x8a99, 0x8a99, 0x700c, + 0x0cba, 0x0126, 0x2091, 0x8000, 0x78a0, 0x79a0, 0x9106, 0x1904, + 0x8a79, 0x7814, 0xd0bc, 0x1904, 0x8a82, 0x012e, 0x7018, 0x910a, + 0x1128, 0x7030, 0x9005, 0x1904, 0x8acb, 0x0005, 0x1210, 0x7114, + 0x910a, 0x9192, 0x000a, 0x0210, 0x2009, 0x000a, 0x2001, 0x1888, + 0x2014, 0x2001, 0x1937, 0x2004, 0x9100, 0x9202, 0x0e50, 0x080c, + 0x8c25, 0x2200, 0x9102, 0x0208, 0x2208, 0x0096, 0x702c, 0x2048, + 0xa873, 0x0001, 0xa976, 0x080c, 0x8d2e, 0x2100, 0xa87e, 0xa86f, + 0x0000, 0x009e, 0x0126, 0x2091, 0x8000, 0x2009, 0x1a1c, 0x2104, + 0xc085, 0x200a, 0x700f, 0x0002, 0x012e, 0x080c, 0x1117, 0x1de8, + 0x0005, 0x78a0, 0x79a0, 0x9106, 0x0904, 0x8a39, 0x080c, 0x8bfd, + 0x012e, 0x0005, 0x7810, 0xc0c5, 0x7812, 0x0804, 0x8a39, 0x0005, + 0x700c, 0x0002, 0x8a8d, 0x8a90, 0x8a8f, 0x080c, 0x8a2f, 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, 0x8d2e, 0x2100, 0xaa8c, 0x9210, 0xaa8e, 0x1220, + 0xa890, 0x9081, 0x0000, 0xa892, 0x000e, 0x009e, 0x0126, 0x2091, + 0x8000, 0x78a2, 0x701a, 0x080c, 0x8bfd, 0x012e, 0x0005, 0x00e6, + 0x2071, 0x1925, 0x700c, 0x0002, 0x8ac9, 0x8ac9, 0x8ac7, 0x700f, + 0x0001, 0x00ee, 0x0005, 0x0126, 0x2091, 0x8000, 0x7030, 0x9005, + 0x0508, 0x2078, 0x7814, 0x2048, 0xae88, 0x00b6, 0x2059, 0x0000, + 0x080c, 0x8b36, 0x00be, 0x01b0, 0x00e6, 0x2071, 0x193e, 0x080c, + 0x8b7d, 0x00ee, 0x0178, 0x0096, 0x080c, 0x1027, 0x2900, 0x009e, + 0x0148, 0xa8aa, 0x04b9, 0x0041, 0x2001, 0x1948, 0x2003, 0x0000, + 0x012e, 0x08c8, 0x012e, 0x0005, 0x00d6, 0x00c6, 0x0086, 0x00a6, + 0x2940, 0x2650, 0x2600, 0x9005, 0x0180, 0xa864, 0x9084, 0x000f, + 0x2068, 0x9d88, 0x20f0, 0x2165, 0x0056, 0x2029, 0x0000, 0x080c, + 0x8cb3, 0x080c, 0x20a8, 0x1dd8, 0x005e, 0x00ae, 0x2001, 0x187f, + 0x2004, 0xa88a, 0x080c, 0x1768, 0x781f, 0x0101, 0x7813, 0x0000, + 0x0126, 0x2091, 0x8000, 0x080c, 0x8b8c, 0x012e, 0x008e, 0x00ce, + 0x00de, 0x0005, 0x7030, 0x9005, 0x0138, 0x2078, 0x780c, 0x7032, + 0x2001, 0x1948, 0x2003, 0x0001, 0x0005, 0x00e6, 0x2071, 0x1925, + 0x7030, 0x600e, 0x2c00, 0x7032, 0x00ee, 0x0005, 0x00d6, 0x00c6, + 0x0026, 0x9b80, 0x8dfc, 0x2005, 0x906d, 0x090c, 0x0dc5, 0x9b80, + 0x8df4, 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, 0x4be9, 0x684c, 0x0096, + 0x904d, 0x090c, 0x0dc5, 0xa804, 0x8000, 0xa806, 0x009e, 0x9006, + 0x2030, 0x0c20, 0x6854, 0xd08c, 0x1d08, 0xc08d, 0x6856, 0x2011, + 0x8025, 0x080c, 0x4be9, 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, 0x193e, 0x6804, 0x9080, 0x1940, 0x2f08, + 0x2102, 0x6904, 0x8108, 0x9182, 0x0008, 0x0208, 0x900e, 0x6906, + 0x9180, 0x1940, 0x2003, 0x0000, 0x00de, 0x0005, 0x0096, 0x00c6, + 0x2060, 0x6014, 0x2048, 0xa8a8, 0x0096, 0x2048, 0x9005, 0x190c, + 0x1040, 0x009e, 0xa8ab, 0x0000, 0x080c, 0x0fc0, 0x080c, 0xb101, + 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, 0x8f31, 0x00be, 0x6013, 0x0000, 0x601b, 0x0000, 0x0010, + 0x2c00, 0x0861, 0x0005, 0x2009, 0x1929, 0x210c, 0xd194, 0x0005, + 0x0126, 0x2091, 0x8000, 0x00e6, 0x2071, 0x1925, 0x7110, 0xc194, + 0xd19c, 0x1118, 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, 0x8d7c, 0x0170, 0x080c, 0x8db1, 0x0158, + 0x2900, 0x7002, 0x700a, 0x701a, 0x7013, 0x0001, 0x701f, 0x000a, + 0x00de, 0x009e, 0x0005, 0x900e, 0x0cd8, 0x00e6, 0x0096, 0x0086, + 0x00d6, 0x00c6, 0x2071, 0x1932, 0x721c, 0x2100, 0x9202, 0x1618, + 0x080c, 0x8db1, 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, 0x1932, 0x7300, 0x831f, 0x831e, 0x831e, + 0x9384, 0x003f, 0x20e8, 0x939c, 0xffc0, 0x9398, 0x0003, 0x7104, + 0x080c, 0x8d2e, 0x810c, 0x2100, 0x9318, 0x8003, 0x2228, 0x2021, + 0x0078, 0x9402, 0x9532, 0x0208, 0x2028, 0x2500, 0x8004, 0x20a8, + 0x23a0, 0xa001, 0xa001, 0x4005, 0x2508, 0x080c, 0x8d37, 0x2130, + 0x7014, 0x9600, 0x7016, 0x2600, 0x711c, 0x9102, 0x701e, 0x7004, + 0x9600, 0x2008, 0x9082, 0x000a, 0x1190, 0x7000, 0x2048, 0xa800, + 0x9005, 0x1148, 0x2009, 0x0001, 0x0026, 0x080c, 0x8c25, 0x002e, + 0x7000, 0x2048, 0xa800, 0x7002, 0x7007, 0x0000, 0x0008, 0x7106, + 0x2500, 0x9212, 0x1904, 0x8c64, 0x012e, 0x00ee, 0x014e, 0x013e, + 0x015e, 0x009e, 0x0005, 0x0016, 0x0026, 0x00e6, 0x0126, 0x2091, + 0x8000, 0x9580, 0x8df4, 0x2005, 0x9075, 0x090c, 0x0dc5, 0x080c, + 0x8d09, 0x012e, 0x9580, 0x8df0, 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, 0x8cf3, 0x8cf3, 0x8cf5, 0x8cf3, 0x8cf5, + 0x8cf3, 0x8cf3, 0x8cf3, 0x8cf3, 0x8cf3, 0x8cfb, 0x8cf3, 0x8cfb, + 0x8cf3, 0x8cf3, 0x8cf3, 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, 0x8dc0, + 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, 0x8d7a, 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, 0x8df8, 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, + 0x1a68, 0x0000, 0x0000, 0x0000, 0x1932, 0x0000, 0x0000, 0x0000, + 0x1888, 0x0000, 0x0000, 0x0000, 0x1877, 0x0000, 0x0000, 0x0000, + 0x00e6, 0x00c6, 0x00b6, 0x00a6, 0xa8a8, 0x2040, 0x2071, 0x1877, + 0x080c, 0x8f1c, 0xa067, 0x0023, 0x6010, 0x905d, 0x0904, 0x8ef1, + 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, 0x20f0, 0x2c65, 0x9786, 0x0024, + 0x2c05, 0x1590, 0x908a, 0x0036, 0x1a0c, 0x0dc5, 0x9082, 0x001b, + 0x0002, 0x8e5c, 0x8e5c, 0x8e5e, 0x8e5c, 0x8e5c, 0x8e5c, 0x8e60, + 0x8e5c, 0x8e5c, 0x8e5c, 0x8e62, 0x8e5c, 0x8e5c, 0x8e5c, 0x8e64, + 0x8e5c, 0x8e5c, 0x8e5c, 0x8e66, 0x8e5c, 0x8e5c, 0x8e5c, 0x8e68, + 0x8e5c, 0x8e5c, 0x8e5c, 0x8e6a, 0x080c, 0x0dc5, 0xa180, 0x04b8, + 0xa190, 0x04a8, 0xa1a0, 0x0498, 0xa1b0, 0x0488, 0xa1c0, 0x0478, + 0xa1d0, 0x0468, 0xa1e0, 0x0458, 0x908a, 0x0034, 0x1a0c, 0x0dc5, + 0x9082, 0x001b, 0x0002, 0x8e8e, 0x8e8c, 0x8e8c, 0x8e8c, 0x8e8c, + 0x8e8c, 0x8e90, 0x8e8c, 0x8e8c, 0x8e8c, 0x8e8c, 0x8e8c, 0x8e92, + 0x8e8c, 0x8e8c, 0x8e8c, 0x8e8c, 0x8e8c, 0x8e94, 0x8e8c, 0x8e8c, + 0x8e8c, 0x8e8c, 0x8e8c, 0x8e96, 0x080c, 0x0dc5, 0xa180, 0x0038, + 0xa198, 0x0028, 0xa1b0, 0x0018, 0xa1c8, 0x0008, 0xa1e0, 0x2600, + 0x0002, 0x8eb2, 0x8eb4, 0x8eb6, 0x8eb8, 0x8eba, 0x8ebc, 0x8ebe, + 0x8ec0, 0x8ec2, 0x8ec4, 0x8ec6, 0x8ec8, 0x8eca, 0x8ecc, 0x8ece, + 0x8ed0, 0x8ed2, 0x8ed4, 0x8ed6, 0x8ed8, 0x8eda, 0x8edc, 0x8ede, + 0x8ee0, 0x8ee2, 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, 0x20a8, + 0x090c, 0x0dc5, 0x0804, 0x8e36, 0x00ae, 0x00be, 0x00ce, 0x00ee, + 0x0005, 0xa86c, 0xa06e, 0xa870, 0xa072, 0xa077, 0x00ff, 0x9006, + 0x0804, 0x8e18, 0x0006, 0x0016, 0x00b6, 0x6010, 0x2058, 0xb810, + 0x9005, 0x01b0, 0x2001, 0x1926, 0x2004, 0x9005, 0x0188, 0x2001, + 0x1800, 0x2004, 0x9086, 0x0003, 0x1158, 0x0036, 0x0046, 0xbba0, + 0x2021, 0x0004, 0x2011, 0x8014, 0x080c, 0x4be9, 0x004e, 0x003e, + 0x00be, 0x001e, 0x000e, 0x0005, 0x9016, 0x710c, 0xa834, 0x910a, + 0xa936, 0x7008, 0x9005, 0x0120, 0x8210, 0x910a, 0x0238, 0x0130, + 0x7010, 0x8210, 0x910a, 0x0210, 0x0108, 0x0cd8, 0xaa8a, 0xa26a, + 0x0005, 0x00f6, 0x00d6, 0x0036, 0x2079, 0x0300, 0x781b, 0x0200, + 0x7818, 0xd094, 0x1dd8, 0x781b, 0x0202, 0xa001, 0xa001, 0x7818, + 0xd094, 0x1da0, 0xb8ac, 0x9005, 0x01b8, 0x2068, 0x2079, 0x0000, + 0x2c08, 0x911e, 0x1118, 0x680c, 0xb8ae, 0x0060, 0x9106, 0x0140, + 0x2d00, 0x2078, 0x680c, 0x9005, 0x090c, 0x0dc5, 0x2068, 0x0cb0, + 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, 0x8f71, + 0x701b, 0x0202, 0xa001, 0xa001, 0x7018, 0xd094, 0x1d90, 0xb8ac, + 0x9005, 0x01e8, 0x2060, 0x600c, 0xb8ae, 0x6024, 0xc08d, 0x6026, + 0x6003, 0x0004, 0x601b, 0x0000, 0x6013, 0x0000, 0x601f, 0x0101, + 0x6014, 0x2048, 0xa88b, 0x0000, 0xa8a8, 0xa8ab, 0x0000, 0x904d, + 0x090c, 0x0dc5, 0x080c, 0x1040, 0x080c, 0x8b2d, 0x0c00, 0x2071, + 0x0300, 0x701b, 0x0200, 0x015e, 0x012e, 0x003e, 0x00ce, 0x009e, + 0x00de, 0x00ee, 0x0005, 0x00c6, 0x00b6, 0x0016, 0x0006, 0x0156, + 0x080c, 0x2894, 0x015e, 0x11b0, 0x080c, 0x66b2, 0x190c, 0x0dc5, + 0x000e, 0x001e, 0xb912, 0xb816, 0x080c, 0xb0ab, 0x0140, 0x2b00, + 0x6012, 0x6023, 0x0001, 0x2009, 0x0001, 0x080c, 0xb180, 0x00be, + 0x00ce, 0x0005, 0x000e, 0x001e, 0x0cd0, 0x0066, 0x6000, 0x90b2, + 0x0010, 0x1a0c, 0x0dc5, 0x0013, 0x006e, 0x0005, 0x8fe6, 0x8fe6, + 0x8fe6, 0x8fe8, 0x9039, 0x8fe6, 0x8fe6, 0x8fe6, 0x90a0, 0x8fe6, + 0x90dd, 0x8fe6, 0x8fe6, 0x8fe6, 0x8fe6, 0x8fe6, 0x080c, 0x0dc5, + 0x9182, 0x0040, 0x0002, 0x8ffb, 0x8ffb, 0x8ffb, 0x8ffb, 0x8ffb, + 0x8ffb, 0x8ffb, 0x8ffb, 0x8ffb, 0x8ffd, 0x9012, 0x8ffb, 0x8ffb, + 0x8ffb, 0x8ffb, 0x9025, 0x080c, 0x0dc5, 0x0096, 0x080c, 0x989d, + 0x080c, 0x9a0f, 0x6114, 0x2148, 0xa87b, 0x0000, 0x6010, 0x00b6, + 0x2058, 0xb8bb, 0x0500, 0x00be, 0x080c, 0x6bd5, 0x080c, 0xb101, + 0x009e, 0x0005, 0x080c, 0x989d, 0x00d6, 0x6114, 0x080c, 0xce56, + 0x0130, 0x0096, 0x6114, 0x2148, 0x080c, 0x6dd1, 0x009e, 0x00de, + 0x080c, 0xb101, 0x080c, 0x9a0f, 0x0005, 0x080c, 0x989d, 0x080c, + 0x3246, 0x6114, 0x0096, 0x2148, 0x080c, 0xce56, 0x0120, 0xa87b, + 0x0029, 0x080c, 0x6dd1, 0x009e, 0x080c, 0xb101, 0x080c, 0x9a0f, + 0x0005, 0x601b, 0x0000, 0x9182, 0x0040, 0x0096, 0x0002, 0x9054, + 0x9054, 0x9054, 0x9054, 0x9054, 0x9054, 0x9054, 0x9054, 0x9056, + 0x9054, 0x9054, 0x9054, 0x909c, 0x9054, 0x9054, 0x9054, 0x9054, + 0x9054, 0x9054, 0x905d, 0x9054, 0x080c, 0x0dc5, 0x6114, 0x2148, + 0xa938, 0x918e, 0xffff, 0x0904, 0x909c, 0x6024, 0xd08c, 0x15c0, + 0x00e6, 0x6114, 0x2148, 0x080c, 0x8e00, 0x0096, 0xa8a8, 0x2048, + 0x080c, 0x6b6d, 0x009e, 0xa8ab, 0x0000, 0x6010, 0x9005, 0x0128, + 0x00b6, 0x2058, 0x080c, 0x8f31, 0x00be, 0xae88, 0x00b6, 0x2059, + 0x0000, 0x080c, 0x8b36, 0x00be, 0x01e0, 0x2071, 0x193e, 0x080c, + 0x8b7d, 0x01b8, 0x9086, 0x0001, 0x1128, 0x2001, 0x1948, 0x2004, + 0x9005, 0x1178, 0x0096, 0x080c, 0x100e, 0x2900, 0x009e, 0x0148, + 0xa8aa, 0x00f6, 0x2c78, 0x080c, 0x8af4, 0x00fe, 0x00ee, 0x009e, + 0x0005, 0x080c, 0x8b2d, 0x0cd0, 0x080c, 0x914a, 0x009e, 0x0005, + 0x9182, 0x0040, 0x0096, 0x0002, 0x90b4, 0x90b4, 0x90b4, 0x90b6, + 0x90b4, 0x90b4, 0x90b4, 0x90db, 0x90b4, 0x90b4, 0x90b4, 0x90b4, + 0x90b4, 0x90b4, 0x90b4, 0x90b4, 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, + 0x1c09, 0x080c, 0x93a0, 0x0126, 0x2091, 0x8000, 0x080c, 0x9a0f, + 0x012e, 0x009e, 0x0005, 0x080c, 0x0dc5, 0x080c, 0x989d, 0x080c, + 0x9a0f, 0x6114, 0x2148, 0xa87b, 0x0000, 0x6010, 0x00b6, 0x2058, + 0xb8bb, 0x0500, 0x00be, 0x080c, 0x6dd1, 0x080c, 0xb101, 0x009e, + 0x0005, 0x6000, 0x908a, 0x0010, 0x1a0c, 0x0dc5, 0x0096, 0x0013, + 0x009e, 0x0005, 0x910a, 0x910a, 0x910a, 0x910c, 0x911d, 0x910a, + 0x910a, 0x910a, 0x910a, 0x910a, 0x910a, 0x910a, 0x910a, 0x910a, + 0x910a, 0x910a, 0x080c, 0x0dc5, 0x080c, 0xaa59, 0x6114, 0x2148, + 0xa87b, 0x0006, 0x6010, 0x00b6, 0x2058, 0xb8bb, 0x0500, 0x00be, + 0x080c, 0x6dd1, 0x080c, 0xb101, 0x0005, 0x0461, 0x0005, 0x6000, + 0x908a, 0x0010, 0x1a0c, 0x0dc5, 0x0096, 0x0013, 0x009e, 0x0005, + 0x9138, 0x9138, 0x9138, 0x913a, 0x914a, 0x9138, 0x9138, 0x9138, + 0x9138, 0x9138, 0x9138, 0x9138, 0x9138, 0x9138, 0x9138, 0x9138, + 0x080c, 0x0dc5, 0x0036, 0x00e6, 0x2071, 0x19e9, 0x703c, 0x9c06, + 0x1120, 0x2019, 0x0000, 0x080c, 0xa877, 0x080c, 0xaa59, 0x00ee, + 0x003e, 0x0005, 0x6024, 0xd08c, 0x11f0, 0x00f6, 0x00e6, 0x601b, + 0x0000, 0x6014, 0x2048, 0x6010, 0x9005, 0x0128, 0x00b6, 0x2058, + 0x080c, 0x8f31, 0x00be, 0x2071, 0x193e, 0x080c, 0x8b7d, 0x0160, + 0x2001, 0x187f, 0x2004, 0xa88a, 0x2031, 0x0000, 0x2c78, 0x080c, + 0x8af4, 0x00ee, 0x00fe, 0x0005, 0x0096, 0xa88b, 0x0000, 0xa8a8, + 0x2048, 0x080c, 0x1040, 0x009e, 0xa8ab, 0x0000, 0x080c, 0x8b2d, + 0x0c80, 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, 0x9192, 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, 0x91bc, 0x0028, 0x911a, 0x2308, 0x8210, + 0x1f04, 0x91bc, 0x0006, 0x3200, 0x9084, 0xefff, 0x2080, 0x000e, + 0x015e, 0x007e, 0x012e, 0x0005, 0x0006, 0x3200, 0x9085, 0x1000, + 0x0ca8, 0x0126, 0x2091, 0x2800, 0x2079, 0x19e9, 0x012e, 0x00d6, + 0x2069, 0x19e9, 0x6803, 0x0005, 0x0156, 0x0146, 0x01d6, 0x20e9, + 0x0000, 0x2069, 0x0200, 0x080c, 0xadbc, 0x0401, 0x080c, 0xada7, + 0x00e9, 0x080c, 0xadaa, 0x00d1, 0x080c, 0xadad, 0x00b9, 0x080c, + 0xadb0, 0x00a1, 0x080c, 0xadb3, 0x0089, 0x080c, 0xadb6, 0x0071, + 0x080c, 0xadb9, 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, 0x922f, 0x9253, 0x9294, + 0x9235, 0x9253, 0x922f, 0x922d, 0x922d, 0x080c, 0x0dc5, 0x080c, + 0x878f, 0x080c, 0x98ed, 0x00ce, 0x0005, 0x62c0, 0x82ff, 0x1110, + 0x00ce, 0x0005, 0x2011, 0x5f90, 0x080c, 0x8709, 0x7828, 0x9092, + 0x00c8, 0x1228, 0x8000, 0x782a, 0x080c, 0x5fd0, 0x0c88, 0x62c0, + 0x080c, 0xaef8, 0x080c, 0x5f90, 0x7807, 0x0003, 0x7827, 0x0000, + 0x782b, 0x0000, 0x0c28, 0x080c, 0x878f, 0x6220, 0xd2a4, 0x0170, + 0xd2cc, 0x0160, 0x782b, 0x0000, 0x7824, 0x9065, 0x090c, 0x0dc5, + 0x2009, 0x0013, 0x080c, 0xb180, 0x00ce, 0x0005, 0x00c6, 0x7824, + 0x9065, 0x090c, 0x0dc5, 0x7828, 0x9092, 0xc350, 0x12c0, 0x8000, + 0x782a, 0x00ce, 0x080c, 0x2be7, 0x0278, 0x00c6, 0x7924, 0x2160, + 0x6010, 0x906d, 0x090c, 0x0dc5, 0x7807, 0x0000, 0x7827, 0x0000, + 0x00ce, 0x080c, 0x98ed, 0x0c00, 0x080c, 0xa4f3, 0x08e8, 0x2011, + 0x0130, 0x2214, 0x080c, 0xaef8, 0x080c, 0xee0f, 0x2009, 0x0014, + 0x080c, 0xb180, 0x00ce, 0x0880, 0x2001, 0x1a05, 0x2003, 0x0000, + 0x62c0, 0x82ff, 0x1160, 0x782b, 0x0000, 0x7824, 0x9065, 0x090c, + 0x0dc5, 0x2009, 0x0013, 0x080c, 0xb1d2, 0x00ce, 0x0005, 0x00b6, + 0x00c6, 0x00d6, 0x7824, 0x9005, 0x090c, 0x0dc5, 0x7828, 0x9092, + 0xc350, 0x1648, 0x8000, 0x782a, 0x00de, 0x00ce, 0x00be, 0x080c, + 0x2be7, 0x02f0, 0x00b6, 0x00c6, 0x00d6, 0x781c, 0x905d, 0x090c, + 0x0dc5, 0xb800, 0xc0dc, 0xb802, 0x7924, 0x2160, 0x080c, 0xb101, + 0xb93c, 0x81ff, 0x090c, 0x0dc5, 0x8109, 0xb93e, 0x7807, 0x0000, + 0x7827, 0x0000, 0x00de, 0x00ce, 0x00be, 0x080c, 0x98ed, 0x0868, + 0x080c, 0xa4f3, 0x0850, 0x2011, 0x0130, 0x2214, 0x080c, 0xaef8, + 0x080c, 0xee0f, 0x7824, 0x9065, 0x2009, 0x0014, 0x080c, 0xb180, + 0x00de, 0x00ce, 0x00be, 0x0804, 0x92a5, 0x00c6, 0x2001, 0x009b, + 0x2004, 0xd0fc, 0x190c, 0x1f14, 0x6024, 0x6027, 0x0002, 0xd0f4, + 0x15b8, 0x62c8, 0x60c4, 0x9205, 0x1170, 0x783c, 0x9065, 0x0130, + 0x2009, 0x0049, 0x080c, 0xb180, 0x00ce, 0x0005, 0x2011, 0x1a08, + 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, 0xb180, 0x0868, 0x7848, + 0xc085, 0x784a, 0x0848, 0x0006, 0x0016, 0x00c6, 0x0126, 0x2091, + 0x8000, 0x600f, 0x0000, 0x2c08, 0x2061, 0x19e9, 0x6020, 0x8000, + 0x6022, 0x6010, 0x9005, 0x0148, 0x9080, 0x0003, 0x2102, 0x6112, + 0x012e, 0x00ce, 0x001e, 0x000e, 0x0005, 0x6116, 0x6112, 0x0cc0, + 0x00d6, 0x2069, 0x19e9, 0xb800, 0xd0d4, 0x0168, 0x6820, 0x8000, + 0x6822, 0x9086, 0x0001, 0x1110, 0x2b00, 0x681e, 0x00de, 0x0804, + 0x98ed, 0x00de, 0x0005, 0xc0d5, 0xb802, 0x6818, 0x9005, 0x0168, + 0xb856, 0xb85b, 0x0000, 0x0086, 0x0006, 0x2b00, 0x681a, 0x008e, + 0xa05a, 0x008e, 0x2069, 0x19e9, 0x0c08, 0xb856, 0xb85a, 0x2b00, + 0x681a, 0x681e, 0x08d8, 0x0006, 0x0016, 0x00c6, 0x0126, 0x2091, + 0x8000, 0x600f, 0x0000, 0x2c08, 0x2061, 0x19e9, 0x6020, 0x8000, + 0x6022, 0x6008, 0x9005, 0x0148, 0x9080, 0x0003, 0x2102, 0x610a, + 0x012e, 0x00ce, 0x001e, 0x000e, 0x0005, 0x610e, 0x610a, 0x0cc0, + 0x00c6, 0x600f, 0x0000, 0x2c08, 0x2061, 0x19e9, 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, 0x19e9, 0x7638, 0x2660, 0x2678, 0x2091, + 0x8000, 0x8cff, 0x0904, 0x942f, 0x6010, 0x2058, 0xb8a0, 0x9206, + 0x1904, 0x942a, 0x87ff, 0x0120, 0x6054, 0x9106, 0x1904, 0x942a, + 0x703c, 0x9c06, 0x1178, 0x0036, 0x2019, 0x0001, 0x080c, 0xa877, + 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, 0xce56, 0x01f0, 0x6014, + 0x2048, 0x6020, 0x9086, 0x0003, 0x15b8, 0x6004, 0x9086, 0x0040, + 0x090c, 0xaa49, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x0016, + 0x0036, 0x0076, 0x080c, 0xd14c, 0x080c, 0xed00, 0x080c, 0x6dd1, + 0x007e, 0x003e, 0x001e, 0x080c, 0xd041, 0x080c, 0xb134, 0x00ce, + 0x0804, 0x93c9, 0x2c78, 0x600c, 0x2060, 0x0804, 0x93c9, 0x85ff, + 0x0120, 0x0036, 0x080c, 0x9a0f, 0x003e, 0x012e, 0x000e, 0x001e, + 0x002e, 0x003e, 0x005e, 0x006e, 0x007e, 0x009e, 0x00be, 0x00ce, + 0x00de, 0x00ee, 0x00fe, 0x0005, 0x6020, 0x9086, 0x0006, 0x1158, + 0x0016, 0x0036, 0x0076, 0x080c, 0xed00, 0x080c, 0xe948, 0x007e, + 0x003e, 0x001e, 0x0890, 0x6020, 0x9086, 0x0009, 0x1168, 0xa87b, + 0x0006, 0x0016, 0x0036, 0x0076, 0x080c, 0x6dd1, 0x080c, 0xb101, + 0x007e, 0x003e, 0x001e, 0x0818, 0x6020, 0x9086, 0x000a, 0x0904, + 0x9414, 0x0804, 0x940d, 0x0006, 0x0066, 0x0096, 0x00c6, 0x00d6, + 0x00f6, 0x9036, 0x0126, 0x2091, 0x8000, 0x2079, 0x19e9, 0x7838, + 0x9065, 0x0904, 0x94c0, 0x600c, 0x0006, 0x600f, 0x0000, 0x783c, + 0x9c06, 0x1168, 0x0036, 0x2019, 0x0001, 0x080c, 0xa877, 0x7833, + 0x0000, 0x901e, 0x7b3e, 0x7b42, 0x7b46, 0x7b4a, 0x003e, 0x080c, + 0xce56, 0x0548, 0x6014, 0x2048, 0x6020, 0x9086, 0x0003, 0x1590, + 0x3e08, 0x918e, 0x0002, 0x1188, 0x6010, 0x9005, 0x0170, 0x00b6, + 0x2058, 0xb800, 0x00be, 0xd0bc, 0x0140, 0x6040, 0x9005, 0x11a8, + 0x2001, 0x1989, 0x2004, 0x6042, 0x0080, 0x6004, 0x9086, 0x0040, + 0x090c, 0xaa49, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x080c, + 0x6dc4, 0x080c, 0xd041, 0x080c, 0xb134, 0x000e, 0x0804, 0x9478, + 0x7e3a, 0x7e36, 0x012e, 0x00fe, 0x00de, 0x00ce, 0x009e, 0x006e, + 0x000e, 0x0005, 0x6020, 0x9086, 0x0006, 0x1118, 0x080c, 0xe948, + 0x0c50, 0x6020, 0x9086, 0x0009, 0x1130, 0xab7a, 0x080c, 0x6dd1, + 0x080c, 0xb101, 0x0c10, 0x6020, 0x9086, 0x000a, 0x09a8, 0x0868, + 0x0016, 0x0026, 0x0086, 0x9046, 0x0099, 0x080c, 0x95cb, 0x008e, + 0x002e, 0x001e, 0x0005, 0x00f6, 0x0126, 0x2079, 0x19e9, 0x2091, + 0x8000, 0x080c, 0x9662, 0x080c, 0x96f2, 0x012e, 0x00fe, 0x0005, + 0x00b6, 0x0096, 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0066, 0x0016, + 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, 0x19e9, 0x7614, 0x2660, + 0x2678, 0x8cff, 0x0904, 0x9590, 0x6010, 0x2058, 0xb8a0, 0x9206, + 0x1904, 0x958b, 0x88ff, 0x0120, 0x6054, 0x9106, 0x1904, 0x958b, + 0x7024, 0x9c06, 0x1568, 0x2069, 0x0100, 0x6820, 0xd0a4, 0x0110, + 0xd0cc, 0x1508, 0x080c, 0x878f, 0x080c, 0xa517, 0x68c3, 0x0000, + 0x080c, 0xaa49, 0x7027, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, + 0x9384, 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x2d52, 0x9006, + 0x080c, 0x2d52, 0x2069, 0x0100, 0x6824, 0xd084, 0x0110, 0x6827, + 0x0001, 0x003e, 0x0028, 0x6003, 0x0009, 0x630a, 0x0804, 0x958b, + 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, 0xce56, 0x01e8, 0x6020, + 0x9086, 0x0003, 0x1580, 0x080c, 0xd05e, 0x1118, 0x080c, 0xbae2, + 0x0098, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x0016, 0x0036, + 0x0086, 0x080c, 0xd14c, 0x080c, 0xed00, 0x080c, 0x6dd1, 0x008e, + 0x003e, 0x001e, 0x080c, 0xd041, 0x080c, 0xb134, 0x080c, 0xa91f, + 0x00ce, 0x0804, 0x9509, 0x2c78, 0x600c, 0x2060, 0x0804, 0x9509, + 0x012e, 0x000e, 0x001e, 0x006e, 0x00ce, 0x00de, 0x00ee, 0x00fe, + 0x009e, 0x00be, 0x0005, 0x6020, 0x9086, 0x0006, 0x1158, 0x0016, + 0x0036, 0x0086, 0x080c, 0xed00, 0x080c, 0xe948, 0x008e, 0x003e, + 0x001e, 0x08d0, 0x080c, 0xbae2, 0x6020, 0x9086, 0x0002, 0x1160, + 0x6004, 0x0006, 0x9086, 0x0085, 0x000e, 0x0904, 0x9571, 0x9086, + 0x008b, 0x0904, 0x9571, 0x0840, 0x6020, 0x9086, 0x0005, 0x1920, + 0x6004, 0x0006, 0x9086, 0x0085, 0x000e, 0x09c8, 0x9086, 0x008b, + 0x09b0, 0x0804, 0x9584, 0x00b6, 0x00a6, 0x0096, 0x00c6, 0x0006, + 0x0126, 0x2091, 0x8000, 0x9280, 0x1000, 0x2004, 0x905d, 0x0904, + 0x965b, 0x00f6, 0x00e6, 0x00d6, 0x0066, 0x2071, 0x19e9, 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, 0x6645, + 0x0904, 0x9657, 0x7624, 0x86ff, 0x0904, 0x9646, 0x9680, 0x0005, + 0x2004, 0x9906, 0x15d8, 0x00d6, 0x2069, 0x0100, 0x68c0, 0x9005, + 0x0560, 0x080c, 0x878f, 0x080c, 0xa517, 0x68c3, 0x0000, 0x080c, + 0xaa49, 0x7027, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, 0x9384, + 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x2d52, 0x9006, 0x080c, + 0x2d52, 0x2069, 0x0100, 0x6824, 0xd084, 0x0110, 0x6827, 0x0001, + 0x003e, 0x00de, 0x00c6, 0xb83c, 0x9005, 0x0110, 0x8001, 0xb83e, + 0x2660, 0x080c, 0xb134, 0x00ce, 0x0048, 0x00de, 0x00c6, 0x2660, + 0x6003, 0x0009, 0x630a, 0x00ce, 0x0804, 0x95fe, 0x89ff, 0x0158, + 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x080c, 0xd14c, 0x080c, + 0xed00, 0x080c, 0x6dd1, 0x080c, 0xa91f, 0x0804, 0x95fe, 0x006e, + 0x00de, 0x00ee, 0x00fe, 0x012e, 0x000e, 0x00ce, 0x009e, 0x00ae, + 0x00be, 0x0005, 0x0096, 0x0006, 0x0066, 0x00c6, 0x00d6, 0x9036, + 0x7814, 0x9065, 0x0904, 0x96c5, 0x600c, 0x0006, 0x600f, 0x0000, + 0x7824, 0x9c06, 0x1580, 0x2069, 0x0100, 0x6820, 0xd0a4, 0x0110, + 0xd0cc, 0x1508, 0x080c, 0x878f, 0x080c, 0xa517, 0x68c3, 0x0000, + 0x080c, 0xaa49, 0x7827, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, + 0x9384, 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x2d52, 0x9006, + 0x080c, 0x2d52, 0x2069, 0x0100, 0x6824, 0xd084, 0x0110, 0x6827, + 0x0001, 0x003e, 0x0040, 0x080c, 0x6a2a, 0x1520, 0x6003, 0x0009, + 0x630a, 0x2c30, 0x00f8, 0x6014, 0x2048, 0x080c, 0xce54, 0x01b0, + 0x6020, 0x9086, 0x0003, 0x1508, 0x080c, 0xd05e, 0x1118, 0x080c, + 0xbae2, 0x0060, 0x080c, 0x6a2a, 0x1168, 0xa867, 0x0103, 0xab7a, + 0xa877, 0x0000, 0x080c, 0x6dd1, 0x080c, 0xd041, 0x080c, 0xb134, + 0x080c, 0xa91f, 0x000e, 0x0804, 0x9669, 0x7e16, 0x7e12, 0x00de, + 0x00ce, 0x006e, 0x000e, 0x009e, 0x0005, 0x6020, 0x9086, 0x0006, + 0x1118, 0x080c, 0xe948, 0x0c50, 0x080c, 0xbae2, 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, 0x9772, 0xb854, 0x0006, 0x9006, 0xb856, + 0xb85a, 0xb800, 0xc0d4, 0xc0dc, 0xb802, 0x080c, 0x6645, 0x0904, + 0x976f, 0x7e24, 0x86ff, 0x0904, 0x9762, 0x9680, 0x0005, 0x2004, + 0x9906, 0x1904, 0x9762, 0x00d6, 0x2069, 0x0100, 0x68c0, 0x9005, + 0x0904, 0x9759, 0x080c, 0x878f, 0x080c, 0xa517, 0x68c3, 0x0000, + 0x080c, 0xaa49, 0x7827, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, + 0x9384, 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x2d52, 0x9006, + 0x080c, 0x2d52, 0x2069, 0x0100, 0x6824, 0xd084, 0x0110, 0x6827, + 0x0001, 0x003e, 0x00de, 0x00c6, 0x3e08, 0x918e, 0x0002, 0x1168, + 0xb800, 0xd0bc, 0x0150, 0x9680, 0x0010, 0x200c, 0x81ff, 0x1518, + 0x2009, 0x1989, 0x210c, 0x2102, 0x00f0, 0xb83c, 0x9005, 0x0110, + 0x8001, 0xb83e, 0x2660, 0x600f, 0x0000, 0x080c, 0xb134, 0x00ce, + 0x0048, 0x00de, 0x00c6, 0x2660, 0x6003, 0x0009, 0x630a, 0x00ce, + 0x0804, 0x9705, 0x89ff, 0x0138, 0xa867, 0x0103, 0xab7a, 0xa877, + 0x0000, 0x080c, 0x6dd1, 0x080c, 0xa91f, 0x0804, 0x9705, 0x000e, + 0x0804, 0x96f9, 0x781e, 0x781a, 0x00de, 0x00ce, 0x00be, 0x009e, + 0x006e, 0x000e, 0x0005, 0x00e6, 0x00d6, 0x0096, 0x0066, 0xb800, + 0xd0dc, 0x01a0, 0xb84c, 0x904d, 0x0188, 0xa878, 0x9606, 0x1170, + 0x2071, 0x19e9, 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, 0xa517, 0x78c3, 0x0000, 0x080c, 0xaa49, 0x7027, 0x0000, + 0x0036, 0x2079, 0x0140, 0x7b04, 0x9384, 0x1000, 0x0138, 0x2001, + 0x0100, 0x080c, 0x2d52, 0x9006, 0x080c, 0x2d52, 0x2079, 0x0100, + 0x7824, 0xd084, 0x0110, 0x7827, 0x0001, 0x080c, 0xaa49, 0x003e, + 0x080c, 0x6645, 0x00c6, 0xb83c, 0x9005, 0x0110, 0x8001, 0xb83e, + 0x2660, 0x080c, 0xb101, 0x00ce, 0xa867, 0x0103, 0xab7a, 0xa877, + 0x0000, 0x080c, 0xd14c, 0x080c, 0x6dd1, 0x080c, 0xa91f, 0x00fe, + 0x0005, 0x00b6, 0x00e6, 0x00c6, 0x2011, 0x0101, 0x2204, 0xc0c4, + 0x2012, 0x2001, 0x180c, 0x2014, 0xc2e4, 0x2202, 0x2071, 0x19e9, + 0x7004, 0x9084, 0x0007, 0x0002, 0x97fe, 0x9802, 0x9820, 0x9849, + 0x9887, 0x97fe, 0x9819, 0x97fc, 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, 0x6645, 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, 0x98ed, 0x0ca8, 0x7218, + 0x721e, 0x080c, 0x98ed, 0x0c80, 0xc2ec, 0x2202, 0x080c, 0x9a0f, + 0x0c58, 0x7024, 0x9065, 0x05b8, 0x700c, 0x9c06, 0x1160, 0x080c, + 0xa91f, 0x600c, 0x9015, 0x0120, 0x720e, 0x600f, 0x0000, 0x0448, + 0x720e, 0x720a, 0x0430, 0x7014, 0x9c06, 0x1160, 0x080c, 0xa91f, + 0x600c, 0x9015, 0x0120, 0x7216, 0x600f, 0x0000, 0x00d0, 0x7216, + 0x7212, 0x00b8, 0x6020, 0x9086, 0x0003, 0x1198, 0x6010, 0x2058, + 0x080c, 0x6645, 0xb800, 0xc0dc, 0xb802, 0x080c, 0xa91f, 0x701c, + 0x9065, 0x0138, 0xb854, 0x9015, 0x0110, 0x721e, 0x0010, 0x7218, + 0x721e, 0x7027, 0x0000, 0x00ce, 0x00ee, 0x00be, 0x0005, 0x7024, + 0x9065, 0x0140, 0x080c, 0xa91f, 0x600c, 0x9015, 0x0158, 0x720e, + 0x600f, 0x0000, 0x080c, 0xaa49, 0x7027, 0x0000, 0x00ce, 0x00ee, + 0x00be, 0x0005, 0x720e, 0x720a, 0x0ca8, 0x00d6, 0x2069, 0x19e9, + 0x6830, 0x9084, 0x0003, 0x0002, 0x98aa, 0x98ac, 0x98d0, 0x98a8, + 0x080c, 0x0dc5, 0x00de, 0x0005, 0x00c6, 0x6840, 0x9086, 0x0001, + 0x01b8, 0x683c, 0x9065, 0x0130, 0x600c, 0x9015, 0x0170, 0x6a3a, + 0x600f, 0x0000, 0x6833, 0x0000, 0x683f, 0x0000, 0x2011, 0x1a08, + 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, 0x9a0f, 0x2001, 0x19f5, + 0x2004, 0x9086, 0x0001, 0x0d58, 0x00d6, 0x2069, 0x19e9, 0x6804, + 0x9084, 0x0007, 0x0006, 0x9005, 0x11c8, 0x2001, 0x1837, 0x2004, + 0x9084, 0x0028, 0x1198, 0x2001, 0x197d, 0x2004, 0x9086, 0xaaaa, + 0x0168, 0x2001, 0x188b, 0x2004, 0xd08c, 0x1118, 0xd084, 0x1118, + 0x0028, 0x080c, 0x9a0f, 0x000e, 0x00de, 0x0005, 0x000e, 0x0002, + 0x992a, 0x99e3, 0x99e3, 0x99e3, 0x99e3, 0x99e5, 0x99e3, 0x9928, + 0x080c, 0x0dc5, 0x6820, 0x9005, 0x1110, 0x00de, 0x0005, 0x00c6, + 0x680c, 0x9065, 0x01f0, 0x6104, 0x918e, 0x0040, 0x1180, 0x2009, + 0x1837, 0x210c, 0x918c, 0x0028, 0x1150, 0x080c, 0x7569, 0x0138, + 0x0006, 0x2009, 0x188b, 0x2104, 0xc095, 0x200a, 0x000e, 0x6807, + 0x0004, 0x6826, 0x682b, 0x0000, 0x080c, 0x9ab8, 0x00ce, 0x00de, + 0x0005, 0x6814, 0x9065, 0x0150, 0x6807, 0x0001, 0x6826, 0x682b, + 0x0000, 0x080c, 0x9ab8, 0x00ce, 0x00de, 0x0005, 0x00b6, 0x00e6, + 0x6a1c, 0x92dd, 0x0000, 0x0904, 0x99cd, 0xb84c, 0x900d, 0x0118, + 0xb888, 0x9005, 0x01a0, 0xb854, 0x905d, 0x0120, 0x920e, 0x0904, + 0x99cd, 0x0028, 0x6818, 0x920e, 0x0904, 0x99cd, 0x2058, 0xb84c, + 0x900d, 0x0d88, 0xb888, 0x9005, 0x1d70, 0x2b00, 0x681e, 0xbb3c, + 0xb838, 0x9302, 0x1e40, 0x080c, 0xb0d8, 0x0904, 0x99cd, 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, 0xa047, 0x2069, 0x19e9, + 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, 0x6645, 0x080c, 0xaf18, 0x00ee, 0x00be, + 0x00ce, 0x00de, 0x0005, 0x00de, 0x0005, 0x00c6, 0x680c, 0x9065, + 0x01d8, 0x6104, 0x918e, 0x0040, 0x1180, 0x2009, 0x1837, 0x210c, + 0x918c, 0x0028, 0x1150, 0x080c, 0x7569, 0x0138, 0x0006, 0x2009, + 0x188b, 0x2104, 0xc095, 0x200a, 0x000e, 0x6807, 0x0004, 0x6826, + 0x682b, 0x0000, 0x080c, 0x9ab8, 0x00ce, 0x00de, 0x0005, 0x2001, + 0x180c, 0x2014, 0xc2ed, 0x2202, 0x00de, 0x00fe, 0x0005, 0x00f6, + 0x00d6, 0x2069, 0x19e9, 0x6830, 0x9086, 0x0000, 0x1570, 0x2001, + 0x180c, 0x2014, 0xd2e4, 0x0130, 0xc2e4, 0x2202, 0x080c, 0x98fc, + 0x2069, 0x19e9, 0x2001, 0x180c, 0x200c, 0xd1c4, 0x1508, 0x6838, + 0x907d, 0x01d8, 0x6a04, 0x9296, 0x0000, 0x1904, 0x9aac, 0x7920, + 0x918e, 0x0009, 0x0568, 0x6833, 0x0001, 0x683e, 0x6847, 0x0000, + 0x684b, 0x0000, 0x0126, 0x00f6, 0x2091, 0x2400, 0x002e, 0x080c, + 0x1ca2, 0x1158, 0x012e, 0x080c, 0xa374, 0x00de, 0x00fe, 0x0005, + 0xc1c4, 0x2102, 0x080c, 0x7616, 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, + 0x1ca2, 0x19d8, 0x012e, 0x080c, 0xa2f5, 0x0878, 0x2001, 0x1837, + 0x2004, 0x9084, 0x0028, 0x1188, 0x2001, 0x197d, 0x2004, 0x9086, + 0xaaaa, 0x0158, 0x2001, 0x19ea, 0x2004, 0x9005, 0x11f0, 0x2001, + 0x188b, 0x200c, 0xc185, 0xc18c, 0x2102, 0x2f00, 0x6833, 0x0001, + 0x683e, 0x6847, 0x0000, 0x684b, 0x0000, 0x0126, 0x00f6, 0x2091, + 0x2400, 0x002e, 0x080c, 0x1ca2, 0x1904, 0x9a4d, 0x012e, 0x6a3c, + 0x2278, 0x080c, 0xa27f, 0x0804, 0x9a45, 0x2011, 0x188b, 0x2204, + 0xc08d, 0x2012, 0x0804, 0x9a45, 0x6a04, 0x9296, 0x0006, 0x1904, + 0x9a07, 0x6a30, 0x9296, 0x0000, 0x0904, 0x9a2f, 0x0804, 0x9a07, + 0x6020, 0x9084, 0x000f, 0x000b, 0x0005, 0x9acc, 0x9ad1, 0x9f77, + 0xa010, 0x9ad1, 0x9f77, 0xa010, 0x9acc, 0x9ad1, 0x9acc, 0x9acc, + 0x9acc, 0x9acc, 0x9acc, 0x9acc, 0x080c, 0x97e1, 0x080c, 0x98ed, + 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, 0x9b3d, 0x005b, + 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x01de, 0x01ce, 0x014e, 0x013e, + 0x015e, 0x00be, 0x0005, 0x9ce6, 0x9d21, 0x9d4a, 0x9e06, 0x9e28, + 0x9e2e, 0x9e3b, 0x9e43, 0x9e4f, 0x9e55, 0x9e66, 0x9e55, 0x9ebe, + 0x9e43, 0x9eca, 0x9ed0, 0x9e4f, 0x9ed0, 0x9edc, 0x9b3b, 0x9b3b, + 0x9b3b, 0x9b3b, 0x9b3b, 0x9b3b, 0x9b3b, 0x9b3b, 0x9b3b, 0x9b3b, + 0x9b3b, 0xa72e, 0xa751, 0xa762, 0xa782, 0xa7b4, 0x9e3b, 0x9b3b, + 0x9e3b, 0x9e55, 0x9b3b, 0x9d4a, 0x9e06, 0x9b3b, 0xab40, 0x9e55, + 0x9b3b, 0xab5c, 0x9e55, 0x9b3b, 0x9e4f, 0x9ce0, 0x9b5e, 0x9b3b, + 0xab78, 0xabe5, 0xacc0, 0x9b3b, 0xaccd, 0x9e38, 0xacf8, 0x9b3b, + 0xa7be, 0xad25, 0x9b3b, 0x080c, 0x0dc5, 0x2100, 0x005b, 0x00fe, + 0x00ee, 0x00de, 0x00ce, 0x01de, 0x01ce, 0x014e, 0x013e, 0x015e, + 0x00be, 0x0005, 0xadc0, 0xae72, 0x9b5c, 0x9b96, 0x9c42, 0x9c4d, + 0x9b5c, 0x9e3b, 0x9b5c, 0x9ca7, 0x9cb3, 0x9bb1, 0x9b5c, 0x9bcc, + 0x9c00, 0xafdf, 0xb024, 0x9e55, 0x080c, 0x0dc5, 0x00d6, 0x0096, + 0x080c, 0x9eef, 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, 0xa4eb, 0x003e, 0x002e, 0x009e, 0x00de, 0x0005, + 0x7810, 0x00b6, 0x2058, 0xb8a0, 0x00be, 0x080c, 0xb06b, 0x1118, + 0x9084, 0xff80, 0x0110, 0x9085, 0x0001, 0x0005, 0x00d6, 0x0096, + 0x080c, 0x9eef, 0x7003, 0x0500, 0x7814, 0x2048, 0xa874, 0x700a, + 0xa878, 0x700e, 0xa87c, 0x7012, 0xa880, 0x7016, 0xa884, 0x701a, + 0xa888, 0x701e, 0x60c3, 0x0010, 0x080c, 0xa4eb, 0x009e, 0x00de, + 0x0005, 0x00d6, 0x0096, 0x080c, 0x9eef, 0x7003, 0x0500, 0x7814, + 0x2048, 0xa8cc, 0x700a, 0xa8d0, 0x700e, 0xa8d4, 0x7012, 0xa8d8, + 0x7016, 0xa8dc, 0x701a, 0xa8e0, 0x701e, 0x60c3, 0x0010, 0x080c, + 0xa4eb, 0x009e, 0x00de, 0x0005, 0x00d6, 0x0096, 0x0126, 0x2091, + 0x8000, 0x080c, 0x9eef, 0x20e9, 0x0000, 0x2001, 0x19a5, 0x2003, + 0x0000, 0x7814, 0x2048, 0xa814, 0x8003, 0x60c2, 0xa830, 0x20a8, + 0xa860, 0x20e0, 0xa85c, 0x9080, 0x001b, 0x2098, 0x2001, 0x19a5, + 0x0016, 0x200c, 0x2001, 0x0001, 0x080c, 0x2417, 0x080c, 0xdbfa, + 0x9006, 0x080c, 0x2417, 0x001e, 0xa804, 0x9005, 0x0110, 0x2048, + 0x0c28, 0x04d9, 0x080c, 0xa4eb, 0x012e, 0x009e, 0x00de, 0x0005, + 0x00d6, 0x0096, 0x0126, 0x2091, 0x8000, 0x080c, 0x9f3a, 0x20e9, + 0x0000, 0x2001, 0x19a5, 0x2003, 0x0000, 0x7814, 0x2048, 0xa86f, + 0x0200, 0xa873, 0x0000, 0xa814, 0x8003, 0x60c2, 0xa830, 0x20a8, + 0xa860, 0x20e0, 0xa85c, 0x9080, 0x001b, 0x2098, 0x2001, 0x19a5, + 0x0016, 0x200c, 0x080c, 0xdbfa, 0x001e, 0xa804, 0x9005, 0x0110, + 0x2048, 0x0c60, 0x0051, 0x7814, 0x2048, 0x080c, 0x0fc0, 0x080c, + 0xa4eb, 0x012e, 0x009e, 0x00de, 0x0005, 0x60c0, 0x8004, 0x9084, + 0x0003, 0x9005, 0x0130, 0x9082, 0x0004, 0x20a3, 0x0000, 0x8000, + 0x1de0, 0x0005, 0x080c, 0x9eef, 0x7003, 0x7800, 0x7808, 0x8007, + 0x700a, 0x60c3, 0x0008, 0x0804, 0xa4eb, 0x00d6, 0x00e6, 0x080c, + 0x9f3a, 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, 0x9c6d, 0x2069, 0x1801, 0x20a9, 0x0004, 0x2d76, 0x8d68, + 0x8e70, 0x1f04, 0x9c76, 0x9096, 0xdf00, 0x0130, 0x9096, 0xe000, + 0x0118, 0x60c3, 0x0018, 0x00f0, 0x2069, 0x19b5, 0x9086, 0xdf00, + 0x0110, 0x2069, 0x19cf, 0x20a9, 0x001a, 0x9e86, 0x0260, 0x1148, + 0x00c6, 0x2061, 0x0200, 0x6010, 0x8000, 0x6012, 0x00ce, 0x2071, + 0x0240, 0x2d04, 0x8007, 0x2072, 0x8d68, 0x8e70, 0x1f04, 0x9c8d, + 0x60c3, 0x004c, 0x080c, 0xa4eb, 0x00ee, 0x00de, 0x0005, 0x080c, + 0x9eef, 0x7003, 0x6300, 0x7007, 0x0028, 0x7808, 0x700e, 0x60c3, + 0x0008, 0x0804, 0xa4eb, 0x00d6, 0x0026, 0x0016, 0x080c, 0x9f3a, + 0x7003, 0x0200, 0x7814, 0x700e, 0x00e6, 0x9ef0, 0x0004, 0x2009, + 0x0001, 0x2011, 0x000c, 0x2069, 0x1925, 0x6810, 0xd084, 0x1148, + 0x2073, 0x0500, 0x8e70, 0x2073, 0x0000, 0x8e70, 0x8108, 0x9290, + 0x0004, 0x2073, 0x0800, 0x8e70, 0x2073, 0x0000, 0x00ee, 0x7206, + 0x710a, 0x62c2, 0x080c, 0xa4eb, 0x001e, 0x002e, 0x00de, 0x0005, + 0x2001, 0x1818, 0x2004, 0x609a, 0x0804, 0xa4eb, 0x080c, 0x9eef, + 0x7003, 0x5200, 0x2069, 0x1847, 0x6804, 0xd084, 0x0130, 0x6828, + 0x0016, 0x080c, 0x28c7, 0x710e, 0x001e, 0x20a9, 0x0004, 0x20e1, + 0x0001, 0x2099, 0x1805, 0x20e9, 0x0000, 0x20a1, 0x0250, 0x4003, + 0x20a9, 0x0004, 0x2099, 0x1801, 0x20a1, 0x0254, 0x4003, 0x080c, + 0xb06b, 0x1120, 0xb8a0, 0x9082, 0x007f, 0x0248, 0x2001, 0x181f, + 0x2004, 0x7032, 0x2001, 0x1820, 0x2004, 0x7036, 0x0030, 0x2001, + 0x1818, 0x2004, 0x9084, 0x00ff, 0x7036, 0x60c3, 0x001c, 0x0804, + 0xa4eb, 0x080c, 0x9eef, 0x7003, 0x0500, 0x080c, 0xb06b, 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, 0xa4eb, 0x080c, 0x9eef, 0x9006, 0x080c, 0x6a5c, 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, + 0x9dcd, 0x00d6, 0x2069, 0x196d, 0x2001, 0x1837, 0x2004, 0xd0a4, + 0x0188, 0x6800, 0x700a, 0x6808, 0x9084, 0x2000, 0x7012, 0x080c, + 0xb082, 0x680c, 0x7016, 0x701f, 0x2710, 0x6818, 0x7022, 0x681c, + 0x7026, 0x00f0, 0x6800, 0x700a, 0x6804, 0x700e, 0x00f6, 0x2079, + 0x0100, 0x080c, 0x7569, 0x1128, 0x78e3, 0x0000, 0x080c, 0x2908, + 0x78e2, 0x00fe, 0x6808, 0x080c, 0x7569, 0x1118, 0x9084, 0x37ff, + 0x0010, 0x9084, 0x3fff, 0x7012, 0x080c, 0xb082, 0x680c, 0x7016, + 0x00de, 0x20a9, 0x0004, 0x20e1, 0x0001, 0x2099, 0x1805, 0x20e9, + 0x0000, 0x20a1, 0x0256, 0x4003, 0x20a9, 0x0004, 0x2099, 0x1801, + 0x20a1, 0x025a, 0x4003, 0x00d6, 0x080c, 0xada7, 0x2069, 0x1975, + 0x2071, 0x024e, 0x6800, 0xc0dd, 0x7002, 0x080c, 0x57d7, 0xd0e4, + 0x0110, 0x680c, 0x700e, 0x00de, 0x04a8, 0x2001, 0x1837, 0x2004, + 0xd0a4, 0x0170, 0x0016, 0x2001, 0x196e, 0x200c, 0x60e0, 0x9106, + 0x0130, 0x2100, 0x60e3, 0x0000, 0x080c, 0x2908, 0x61e2, 0x001e, + 0x20e1, 0x0001, 0x2099, 0x196d, 0x20e9, 0x0000, 0x20a1, 0x024e, + 0x20a9, 0x0008, 0x4003, 0x20a9, 0x0004, 0x2099, 0x1805, 0x20a1, + 0x0256, 0x4003, 0x20a9, 0x0004, 0x2099, 0x1801, 0x20a1, 0x025a, + 0x4003, 0x080c, 0xada7, 0x20a1, 0x024e, 0x20a9, 0x0008, 0x2099, + 0x1975, 0x4003, 0x60c3, 0x0074, 0x0804, 0xa4eb, 0x080c, 0x9eef, + 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, 0x9e9f, 0x7026, 0x60c3, 0x0014, 0x0804, 0xa4eb, + 0x080c, 0x9eef, 0x7003, 0x5000, 0x0804, 0x9d6c, 0x080c, 0x9eef, + 0x7003, 0x2110, 0x7007, 0x0014, 0x60c3, 0x0014, 0x0804, 0xa4eb, + 0x080c, 0x9f31, 0x0010, 0x080c, 0x9f3a, 0x7003, 0x0200, 0x60c3, + 0x0004, 0x0804, 0xa4eb, 0x080c, 0x9f3a, 0x7003, 0x0100, 0x700b, + 0x0003, 0x700f, 0x2a00, 0x60c3, 0x0008, 0x0804, 0xa4eb, 0x080c, + 0x9f3a, 0x7003, 0x0200, 0x0804, 0x9d6c, 0x080c, 0x9f3a, 0x7003, + 0x0100, 0x782c, 0x9005, 0x0110, 0x700a, 0x0010, 0x700b, 0x0003, + 0x7814, 0x700e, 0x60c3, 0x0008, 0x0804, 0xa4eb, 0x00d6, 0x080c, + 0x9f3a, 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, 0xa4eb, 0x080c, 0x9f3a, + 0x7003, 0x0210, 0x7007, 0x0014, 0x700f, 0x0100, 0x60c3, 0x0014, + 0x0804, 0xa4eb, 0x080c, 0x9f3a, 0x7003, 0x0200, 0x0804, 0x9cea, + 0x080c, 0x9f3a, 0x7003, 0x0100, 0x700b, 0x0003, 0x700f, 0x2a00, + 0x60c3, 0x0008, 0x0804, 0xa4eb, 0x080c, 0x9f3a, 0x7003, 0x0100, + 0x700b, 0x000b, 0x60c3, 0x0008, 0x0804, 0xa4eb, 0x0026, 0x00d6, + 0x0036, 0x0046, 0x2019, 0x3200, 0x2021, 0x0800, 0x0040, 0x0026, + 0x00d6, 0x0036, 0x0046, 0x2019, 0x2200, 0x2021, 0x0100, 0x080c, + 0xadbc, 0xb810, 0x9305, 0x7002, 0xb814, 0x7006, 0x2069, 0x1800, + 0x687c, 0x700a, 0x6880, 0x700e, 0x9485, 0x0029, 0x7012, 0x004e, + 0x003e, 0x00de, 0x080c, 0xa4d9, 0x721a, 0x9f95, 0x0000, 0x7222, + 0x7027, 0xffff, 0x2071, 0x024c, 0x002e, 0x0005, 0x0026, 0x080c, + 0xadbc, 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, 0xadbc, 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, 0xa4d9, 0x721a, 0x7a08, 0x7222, 0x2f10, 0x7226, + 0x2071, 0x024c, 0x002e, 0x0005, 0x080c, 0xa4d9, 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, 0x9fa8, 0x9fb7, 0x9fc2, 0x9fa6, 0x9fa6, 0x9fa6, 0x9fa8, + 0x9fa6, 0x9fa6, 0x9fa6, 0x9fa6, 0x9fa6, 0x9fa6, 0x080c, 0x0dc5, + 0x0411, 0x60c3, 0x0000, 0x0026, 0x080c, 0x2be7, 0x0228, 0x2011, + 0x0101, 0x2204, 0xc0c5, 0x2012, 0x002e, 0x0804, 0xa4eb, 0x0431, + 0x7808, 0x700a, 0x7814, 0x700e, 0x7017, 0xffff, 0x60c3, 0x000c, + 0x0804, 0xa4eb, 0x04a1, 0x7003, 0x0003, 0x7007, 0x0300, 0x60c3, + 0x0004, 0x0804, 0xa4eb, 0x0026, 0x080c, 0xadbc, 0xb810, 0x9085, + 0x8100, 0x7002, 0xb814, 0x7006, 0x2069, 0x1800, 0x687c, 0x700a, + 0x6880, 0x700e, 0x7013, 0x0009, 0x0804, 0x9f0a, 0x0026, 0x080c, + 0xadbc, 0xb810, 0x9085, 0x8400, 0x7002, 0xb814, 0x7006, 0x2069, + 0x1800, 0x687c, 0x700a, 0x6880, 0x700e, 0x2001, 0x0099, 0x7a20, + 0x9296, 0x0005, 0x0108, 0xc0bc, 0x7012, 0x0804, 0x9f6c, 0x0026, + 0x080c, 0xadbc, 0xb810, 0x9085, 0x8500, 0x7002, 0xb814, 0x7006, + 0x2069, 0x1800, 0x687c, 0x700a, 0x6880, 0x700e, 0x2001, 0x0099, + 0x7a20, 0x9296, 0x0005, 0x0108, 0xc0bc, 0x7012, 0x0804, 0x9f6c, + 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, 0xa047, 0xa10e, 0xa0e1, 0xa230, 0xa045, 0xa045, + 0xa045, 0xa045, 0xa045, 0xa045, 0xa045, 0xa906, 0xa90b, 0xa910, + 0xa915, 0xa045, 0xad04, 0xa045, 0xa901, 0x080c, 0x0dc5, 0x0096, + 0x780b, 0xffff, 0x080c, 0xa0b2, 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, 0x18f1, 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, 0x1a05, 0x2003, 0x07d0, 0x2001, 0x1a04, 0x2003, 0x0009, + 0x009e, 0x0005, 0x6813, 0x0008, 0xba8c, 0x8210, 0xb8cc, 0xd084, + 0x0180, 0x2001, 0x1ad1, 0x200c, 0x8108, 0x2102, 0x2001, 0x1ad0, + 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, 0xa4eb, 0x6813, 0x0008, 0xb810, 0x9085, + 0x0500, 0x7002, 0xb814, 0x7006, 0x2069, 0x1800, 0x687c, 0x700a, + 0x6880, 0x700e, 0x7013, 0x0889, 0x080c, 0xa4d9, 0x721a, 0x7a08, + 0x7222, 0x2f10, 0x7226, 0x2071, 0x024c, 0x0005, 0x00d6, 0x0096, + 0x080c, 0xa20e, 0x7814, 0x2048, 0x080c, 0xce54, 0x1130, 0x7814, + 0x9084, 0x0700, 0x8007, 0x0033, 0x0010, 0x9006, 0x001b, 0x009e, + 0x00de, 0x0005, 0xa12c, 0xa195, 0xa1a5, 0xa1cb, 0xa1d7, 0xa1e8, + 0xa1f0, 0xa12a, 0x080c, 0x0dc5, 0x0016, 0x0036, 0xa97c, 0x918c, + 0x0003, 0x0118, 0x9186, 0x0003, 0x1198, 0xaba8, 0x7824, 0xd0cc, + 0x1168, 0x7316, 0xa898, 0x701a, 0xa894, 0x701e, 0x003e, 0x001e, + 0x2001, 0x19b3, 0x2004, 0x60c2, 0x0804, 0xa4eb, 0xc3e5, 0x0c88, + 0x9186, 0x0001, 0x190c, 0x0dc5, 0xaba8, 0x7824, 0xd0cc, 0x1904, + 0xa192, 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, 0xa4eb, 0xc3e5, 0x0804, 0xa151, 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, 0xa4eb, 0x2011, 0x0028, 0x7824, 0xd0cc, 0x1128, + 0x7216, 0x60c3, 0x0018, 0x0804, 0xa4eb, 0x0cd0, 0xc2e5, 0x2011, + 0x0100, 0x7824, 0xd0cc, 0x0108, 0xc2e5, 0x7216, 0x702f, 0x0008, + 0x7858, 0x9084, 0x00ff, 0x7036, 0x60c3, 0x0020, 0x0804, 0xa4eb, + 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, 0xa4d9, 0x721a, 0x7a08, 0x7222, 0x2f10, + 0x7226, 0x2071, 0x024c, 0x00de, 0x0005, 0x7013, 0x0889, 0x0c90, + 0x0016, 0x7814, 0x9084, 0x0700, 0x8007, 0x0013, 0x001e, 0x0005, + 0xa240, 0xa240, 0xa242, 0xa240, 0xa240, 0xa240, 0xa25c, 0xa240, + 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, 0xa4eb, 0x2009, 0x0003, 0x0019, 0x7033, + 0x7f00, 0x0cb0, 0x0016, 0x080c, 0xadbc, 0x001e, 0xb810, 0x9085, + 0x0100, 0x7002, 0xb814, 0x7006, 0x2069, 0x1800, 0x6a7c, 0x720a, + 0x6a80, 0x720e, 0x7013, 0x0888, 0x918d, 0x0008, 0x7116, 0x080c, + 0xa4d9, 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, 0x8794, 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, 0x33ac, 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, 0x8794, 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, 0xa448, 0x90be, 0x000a, 0x1904, + 0xa404, 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, 0xada1, + 0x2009, 0x07d0, 0x60c4, 0x9084, 0xfff0, 0x9005, 0x0110, 0x2009, + 0x1b58, 0x080c, 0x8794, 0x003e, 0x004e, 0x005e, 0x00ce, 0x00de, + 0x00ee, 0x009e, 0x00be, 0x0005, 0x7804, 0x9086, 0x0040, 0x0904, + 0xa484, 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, 0xada1, 0x2009, 0x07d0, 0x60c4, 0x9084, + 0xfff0, 0x9005, 0x0110, 0x2009, 0x1b58, 0x080c, 0x8794, 0x003e, + 0x004e, 0x005e, 0x00ce, 0x00de, 0x00ee, 0x009e, 0x00be, 0x0005, + 0x7814, 0x2048, 0xa87c, 0x9084, 0x0003, 0x9086, 0x0002, 0x0904, + 0xa4a0, 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, 0xad7e, 0x0804, 0xa434, 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, 0xa417, + 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, 0xada1, 0x0804, 0xa434, 0x080c, 0xad7e, 0x0804, + 0xa434, 0x7a10, 0x00b6, 0x2258, 0xba8c, 0x8210, 0x9294, 0x00ff, + 0xba8e, 0x00be, 0x8217, 0x0005, 0x00d6, 0x2069, 0x19e9, 0x6843, + 0x0001, 0x00de, 0x0005, 0x60a3, 0x0056, 0x60a7, 0x9575, 0x00f1, + 0x080c, 0x8786, 0x0005, 0x0016, 0x2001, 0x180c, 0x200c, 0x9184, + 0x0600, 0x9086, 0x0600, 0x0128, 0x0089, 0x080c, 0x8786, 0x001e, + 0x0005, 0xc1e5, 0x2001, 0x180c, 0x2102, 0x2001, 0x19ea, 0x2003, + 0x0000, 0x2001, 0x19f2, 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, 0x7569, 0x11c0, + 0x2001, 0x1a05, 0x2004, 0x9005, 0x15d0, 0x080c, 0x7616, 0x1160, + 0x2061, 0x0100, 0x6020, 0xd0b4, 0x1120, 0x6024, 0xd084, 0x090c, + 0x0dc5, 0x080c, 0x8786, 0x0458, 0x00c6, 0x2061, 0x19e9, 0x00c8, + 0x6904, 0x9194, 0x4000, 0x0540, 0x0811, 0x080c, 0x2d62, 0x00c6, + 0x2061, 0x19e9, 0x6128, 0x9192, 0x0008, 0x1258, 0x8108, 0x612a, + 0x6124, 0x00ce, 0x81ff, 0x0198, 0x080c, 0x8786, 0x080c, 0xa50e, + 0x0070, 0x6124, 0x91e5, 0x0000, 0x0140, 0x080c, 0xee0f, 0x080c, + 0x878f, 0x2009, 0x0014, 0x080c, 0xb180, 0x00ce, 0x0000, 0x002e, + 0x001e, 0x00de, 0x00ce, 0x0005, 0x2001, 0x1a05, 0x2004, 0x9005, + 0x1db0, 0x00c6, 0x2061, 0x19e9, 0x6128, 0x9192, 0x0003, 0x1e08, + 0x8108, 0x612a, 0x00ce, 0x080c, 0x8786, 0x080c, 0x5fe6, 0x2009, + 0x1846, 0x2114, 0x8210, 0x220a, 0x0c10, 0x0096, 0x00c6, 0x00d6, + 0x00e6, 0x0016, 0x0026, 0x080c, 0x879c, 0x2071, 0x19e9, 0x713c, + 0x81ff, 0x0904, 0xa617, 0x2061, 0x0100, 0x2069, 0x0140, 0x080c, + 0x7569, 0x11e0, 0x0036, 0x2019, 0x0002, 0x080c, 0xa877, 0x003e, + 0x713c, 0x2160, 0x080c, 0xee0f, 0x2009, 0x004a, 0x6220, 0x9296, + 0x0009, 0x1130, 0x6114, 0x2148, 0xa87b, 0x0006, 0x2009, 0x004a, + 0x080c, 0xb180, 0x080c, 0x7616, 0x0804, 0xa617, 0x080c, 0xa623, + 0x0904, 0xa617, 0x6904, 0xd1f4, 0x0904, 0xa61e, 0x080c, 0x2d62, + 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, 0x2c94, 0x6014, 0x9084, 0xe7fd, 0x9085, 0x0010, 0x6016, + 0x703c, 0x2060, 0x2009, 0x0049, 0x080c, 0xb180, 0x00c0, 0x0036, + 0x2019, 0x0001, 0x080c, 0xa877, 0x003e, 0x713c, 0x2160, 0x080c, + 0xee0f, 0x2009, 0x004a, 0x6220, 0x9296, 0x0009, 0x1130, 0x6114, + 0x2148, 0xa87b, 0x0006, 0x2009, 0x004a, 0x080c, 0xb180, 0x002e, + 0x001e, 0x00ee, 0x00de, 0x00ce, 0x009e, 0x0005, 0xd1ec, 0x1904, + 0xa5ce, 0x0804, 0xa5d0, 0x00d6, 0x00c6, 0x0096, 0x703c, 0x9065, + 0x090c, 0x0dc5, 0x2001, 0x0306, 0x200c, 0x9184, 0x0030, 0x0904, + 0xa6d6, 0x9184, 0x0048, 0x9086, 0x0008, 0x1904, 0xa6d6, 0x2009, + 0x0206, 0x2104, 0x2009, 0x0203, 0x210c, 0x9106, 0x1904, 0xa6d6, + 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, 0xa6d6, 0x2009, 0x1a85, 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, 0x1a6a, 0x2003, 0x0000, 0x2001, 0x1a73, 0x2003, + 0x0000, 0x6a88, 0x698c, 0x2200, 0x9105, 0x1170, 0x0096, 0x6014, + 0x2048, 0xa87c, 0xc0dc, 0xa87e, 0xa880, 0xc0fc, 0xa882, 0x009e, + 0x2c10, 0x080c, 0x1c09, 0x0040, 0x6014, 0x2048, 0xaa3a, 0xa936, + 0x6ac4, 0x69c8, 0xa946, 0xaa4a, 0x0126, 0x00c6, 0x2091, 0x2400, + 0x002e, 0x080c, 0x1ca2, 0x190c, 0x0dc5, 0x012e, 0x0090, 0x2009, + 0x1a86, 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, + 0x8794, 0x9006, 0x009e, 0x00ce, 0x00de, 0x0005, 0x9085, 0x0001, + 0x0cc8, 0x0026, 0x00e6, 0x2071, 0x19e9, 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, 0x19e9, 0x7018, 0x2058, + 0x8bff, 0x0190, 0xb8a0, 0x9406, 0x0118, 0xb854, 0x2058, 0x0cc0, + 0x6014, 0x0096, 0x2048, 0xac6c, 0xad70, 0xae78, 0x009e, 0x080c, + 0x684f, 0x0110, 0x9085, 0x0001, 0x012e, 0x000e, 0x004e, 0x005e, + 0x006e, 0x00ce, 0x00de, 0x00ee, 0x00be, 0x0005, 0x080c, 0x9eef, + 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, + 0xa4eb, 0x080c, 0x9eef, 0x7003, 0x0f00, 0x7808, 0xd09c, 0x0128, + 0xb810, 0x9084, 0x00ff, 0x700a, 0xb814, 0x700e, 0x60c3, 0x0008, + 0x0804, 0xa4eb, 0x0156, 0x080c, 0x9f3a, 0x7003, 0x0200, 0x080c, + 0x8818, 0x20a9, 0x0006, 0x2011, 0xffec, 0x2019, 0xffed, 0x9ef0, + 0x0002, 0x2305, 0x2072, 0x8e70, 0x2205, 0x2072, 0x8e70, 0x9398, + 0x0002, 0x9290, 0x0002, 0x1f04, 0xa771, 0x60c3, 0x001c, 0x015e, + 0x0804, 0xa4eb, 0x0016, 0x0026, 0x080c, 0x9f16, 0x080c, 0x9f28, + 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, 0xa4eb, 0x002e, + 0x001e, 0x0005, 0x20a9, 0x0010, 0x4003, 0x080c, 0xada7, 0x20a1, + 0x0240, 0x22a8, 0x4003, 0x0c68, 0x080c, 0x9eef, 0x7003, 0x6200, + 0x7808, 0x700e, 0x60c3, 0x0008, 0x0804, 0xa4eb, 0x0016, 0x0026, + 0x080c, 0x9eef, 0x20e9, 0x0000, 0x20a1, 0x024c, 0x7814, 0x0096, + 0x2048, 0xa800, 0x2048, 0xa860, 0x20e0, 0xa85c, 0x9080, 0x0023, + 0x2098, 0x009e, 0x7808, 0x9088, 0x0002, 0x21a8, 0x4003, 0x8003, + 0x60c2, 0x080c, 0xa4eb, 0x002e, 0x001e, 0x0005, 0x00e6, 0x00c6, + 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, 0x19e9, 0x700c, 0x2060, + 0x8cff, 0x0178, 0x080c, 0xd05e, 0x1110, 0x080c, 0xbae2, 0x600c, + 0x0006, 0x080c, 0xd2ca, 0x080c, 0xb101, 0x080c, 0xa91f, 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, + 0x19e9, 0x7024, 0x2060, 0x8cff, 0x01f8, 0x080c, 0xa517, 0x6ac0, + 0x68c3, 0x0000, 0x080c, 0x878f, 0x00c6, 0x2061, 0x0100, 0x080c, + 0xaef8, 0x00ce, 0x20a9, 0x01f4, 0x0461, 0x2009, 0x0013, 0x080c, + 0xb180, 0x000e, 0x001e, 0x002e, 0x006e, 0x00ce, 0x00de, 0x00ee, + 0x00fe, 0x015e, 0x012e, 0x0005, 0x2001, 0x1800, 0x2004, 0x9096, + 0x0001, 0x0d78, 0x9096, 0x0004, 0x0d60, 0x080c, 0x878f, 0x6814, + 0x9084, 0x0001, 0x0110, 0x68a7, 0x95f5, 0x6817, 0x0008, 0x68c3, + 0x0000, 0x2011, 0x5f90, 0x080c, 0x8709, 0x20a9, 0x01f4, 0x0009, + 0x08c0, 0x6824, 0xd094, 0x0140, 0x6827, 0x0004, 0x7804, 0x9084, + 0x4000, 0x190c, 0x2d62, 0x0090, 0xd084, 0x0118, 0x6827, 0x0001, + 0x0010, 0x1f04, 0xa859, 0x7804, 0x9084, 0x1000, 0x0138, 0x2001, + 0x0100, 0x080c, 0x2d52, 0x9006, 0x080c, 0x2d52, 0x0005, 0x0126, + 0x0156, 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0066, 0x0026, 0x0016, + 0x0006, 0x2091, 0x8000, 0x2001, 0x180c, 0x200c, 0x918c, 0xdbff, + 0x2102, 0x2069, 0x0100, 0x2079, 0x0140, 0x2071, 0x19e9, 0x703c, + 0x2060, 0x8cff, 0x0904, 0xa8e2, 0x9386, 0x0002, 0x1128, 0x6814, + 0x9084, 0x0002, 0x0904, 0xa8e2, 0x68af, 0x95f5, 0x6817, 0x0010, + 0x2009, 0x00fa, 0x8109, 0x1df0, 0x69c6, 0x68cb, 0x0008, 0x080c, + 0x879c, 0x080c, 0x205a, 0x2001, 0x0032, 0x6920, 0xd1bc, 0x0130, + 0x8001, 0x1dd8, 0x692c, 0x918d, 0x0008, 0x692e, 0x20a9, 0x03e8, + 0x6824, 0xd094, 0x0140, 0x6827, 0x0004, 0x7804, 0x9084, 0x4000, + 0x190c, 0x2d62, 0x0090, 0xd08c, 0x0118, 0x6827, 0x0002, 0x0010, + 0x1f04, 0xa8b8, 0x7804, 0x9084, 0x1000, 0x0138, 0x2001, 0x0100, + 0x080c, 0x2d52, 0x9006, 0x080c, 0x2d52, 0x6827, 0x4000, 0x6824, + 0x83ff, 0x1140, 0x2009, 0x0049, 0x6020, 0x9086, 0x0009, 0x0110, + 0x080c, 0xb180, 0x000e, 0x001e, 0x002e, 0x006e, 0x00ce, 0x00de, + 0x00ee, 0x00fe, 0x015e, 0x012e, 0x0005, 0x00d6, 0x0126, 0x2091, + 0x8000, 0x2069, 0x19e9, 0x6a06, 0x012e, 0x00de, 0x0005, 0x00d6, + 0x0126, 0x2091, 0x8000, 0x2069, 0x19e9, 0x6a32, 0x012e, 0x00de, + 0x0005, 0x080c, 0xa0b2, 0x7047, 0x1000, 0x0098, 0x080c, 0xa0b2, + 0x7047, 0x4000, 0x0070, 0x080c, 0xa0b2, 0x7047, 0x2000, 0x0048, + 0x080c, 0xa0b2, 0x7047, 0x0400, 0x0020, 0x080c, 0xa0b2, 0x7047, + 0x0200, 0x7854, 0x7032, 0x60c3, 0x0020, 0x0804, 0xa4eb, 0x00e6, + 0x2071, 0x19e9, 0x7020, 0x9005, 0x0110, 0x8001, 0x7022, 0x00ee, + 0x0005, 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0076, 0x0066, 0x0006, + 0x0126, 0x2091, 0x8000, 0x2071, 0x19e9, 0x7614, 0x2660, 0x2678, + 0x2039, 0x0001, 0x87ff, 0x0904, 0xa9c4, 0x8cff, 0x0904, 0xa9c4, + 0x6020, 0x9086, 0x0006, 0x1904, 0xa9bf, 0x88ff, 0x0138, 0x2800, + 0x9c06, 0x1904, 0xa9bf, 0x2039, 0x0000, 0x0050, 0x6010, 0x9b06, + 0x1904, 0xa9bf, 0x85ff, 0x0120, 0x6054, 0x9106, 0x1904, 0xa9bf, + 0x7024, 0x9c06, 0x15b0, 0x2069, 0x0100, 0x68c0, 0x9005, 0x1160, + 0x6824, 0xd084, 0x0148, 0x6827, 0x0001, 0x080c, 0x878f, 0x080c, + 0xaa49, 0x7027, 0x0000, 0x0428, 0x080c, 0x878f, 0x6820, 0xd0b4, + 0x0110, 0x68a7, 0x95f5, 0x6817, 0x0008, 0x68c3, 0x0000, 0x080c, + 0xaa49, 0x7027, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, 0x9384, + 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x2d52, 0x9006, 0x080c, + 0x2d52, 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, 0xce54, 0x0110, 0x080c, 0xe948, 0x009e, 0x080c, 0xb134, + 0x080c, 0xa91f, 0x88ff, 0x1190, 0x00ce, 0x0804, 0xa93a, 0x2c78, + 0x600c, 0x2060, 0x0804, 0xa93a, 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, + 0x19e9, 0x7638, 0x2660, 0x2678, 0x8cff, 0x0904, 0xaa38, 0x6020, + 0x9086, 0x0006, 0x1904, 0xaa33, 0x87ff, 0x0128, 0x2700, 0x9c06, + 0x1904, 0xaa33, 0x0040, 0x6010, 0x9b06, 0x15e8, 0x85ff, 0x0118, + 0x6054, 0x9106, 0x15c0, 0x703c, 0x9c06, 0x1168, 0x0036, 0x2019, + 0x0001, 0x080c, 0xa877, 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, + 0xce54, 0x0110, 0x080c, 0xe948, 0x080c, 0xb134, 0x87ff, 0x1198, + 0x00ce, 0x0804, 0xa9e4, 0x2c78, 0x600c, 0x2060, 0x0804, 0xa9e4, + 0x9006, 0x012e, 0x000e, 0x002e, 0x006e, 0x00ce, 0x009e, 0x00de, + 0x00ee, 0x00fe, 0x0005, 0x601b, 0x0000, 0x00ce, 0x97bd, 0x0001, + 0x0c80, 0x00e6, 0x2071, 0x19e9, 0x2001, 0x1800, 0x2004, 0x9086, + 0x0002, 0x1118, 0x7007, 0x0005, 0x0010, 0x7007, 0x0000, 0x00ee, + 0x0005, 0x00f6, 0x00e6, 0x00c6, 0x0066, 0x0026, 0x0006, 0x0126, + 0x2091, 0x8000, 0x2071, 0x19e9, 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, 0x97e1, 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, 0x19e9, 0x760c, + 0x2660, 0x2678, 0x8cff, 0x0904, 0xab2f, 0x6010, 0x00b6, 0x2058, + 0xb8a0, 0x00be, 0x9206, 0x1904, 0xab2a, 0x7024, 0x9c06, 0x1520, + 0x2069, 0x0100, 0x68c0, 0x9005, 0x0904, 0xab01, 0x080c, 0xa517, + 0x68c3, 0x0000, 0x080c, 0xaa49, 0x7027, 0x0000, 0x0036, 0x2069, + 0x0140, 0x6b04, 0x9384, 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, + 0x2d52, 0x9006, 0x080c, 0x2d52, 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, 0xd04d, + 0x1180, 0x080c, 0x326f, 0x080c, 0xd05e, 0x1518, 0x080c, 0xbae2, + 0x0400, 0x080c, 0xaa49, 0x6824, 0xd084, 0x09b0, 0x6827, 0x0001, + 0x0898, 0x080c, 0xd05e, 0x1118, 0x080c, 0xbae2, 0x0090, 0x6014, + 0x2048, 0x080c, 0xce54, 0x0168, 0x6020, 0x9086, 0x0003, 0x1508, + 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x080c, 0x6dc4, 0x080c, + 0xd041, 0x080c, 0xd2ca, 0x080c, 0xb134, 0x080c, 0xa91f, 0x00ce, + 0x0804, 0xaaaa, 0x2c78, 0x600c, 0x2060, 0x0804, 0xaaaa, 0x012e, + 0x000e, 0x002e, 0x006e, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x009e, + 0x0005, 0x6020, 0x9086, 0x0006, 0x1d20, 0x080c, 0xe948, 0x0c08, + 0x00d6, 0x080c, 0x9f3a, 0x7003, 0x0200, 0x7007, 0x0014, 0x60c3, + 0x0014, 0x20e1, 0x0001, 0x2099, 0x198a, 0x20e9, 0x0000, 0x20a1, + 0x0250, 0x20a9, 0x0004, 0x4003, 0x7023, 0x0004, 0x7027, 0x7878, + 0x080c, 0xa4eb, 0x00de, 0x0005, 0x080c, 0x9f3a, 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, 0xa4eb, + 0x00b6, 0x00d6, 0x0016, 0x00d6, 0x2f68, 0x2009, 0x0035, 0x080c, + 0xd4d7, 0x00de, 0x1904, 0xabdd, 0x080c, 0x9eef, 0x7003, 0x1300, + 0x782c, 0x080c, 0xace3, 0x2068, 0x6820, 0x9086, 0x0003, 0x0560, + 0x7810, 0x2058, 0xbaa0, 0x080c, 0xb06b, 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, 0xb06b, 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, 0xa4eb, 0x00be, 0x0005, 0x781b, 0x0001, 0x7803, + 0x0006, 0x001e, 0x00de, 0x00be, 0x0005, 0x792c, 0x9180, 0x0008, + 0x200c, 0x9186, 0x0006, 0x01c0, 0x9186, 0x0003, 0x0904, 0xac58, + 0x9186, 0x0005, 0x0904, 0xac40, 0x9186, 0x0004, 0x05d8, 0x9186, + 0x0008, 0x0904, 0xac49, 0x7807, 0x0037, 0x782f, 0x0003, 0x7817, + 0x1700, 0x080c, 0xacc0, 0x0005, 0x080c, 0xac81, 0x00d6, 0x0026, + 0x792c, 0x2168, 0x2009, 0x4000, 0x6800, 0x0002, 0xac21, 0xac2c, + 0xac23, 0xac2c, 0xac28, 0xac21, 0xac21, 0xac2c, 0xac2c, 0xac2c, + 0xac2c, 0xac21, 0xac21, 0xac21, 0xac21, 0xac21, 0xac2c, 0xac21, + 0xac2c, 0x080c, 0x0dc5, 0x6824, 0xd0e4, 0x0110, 0xd0cc, 0x0110, + 0x900e, 0x0010, 0x2009, 0x2000, 0x682c, 0x7022, 0x6830, 0x7026, + 0x0804, 0xac7a, 0x080c, 0xac81, 0x00d6, 0x0026, 0x792c, 0x2168, + 0x2009, 0x4000, 0x6a00, 0x9286, 0x0002, 0x1108, 0x900e, 0x04d0, + 0x080c, 0xac81, 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, + 0xa4eb, 0x00b6, 0x0036, 0x0046, 0x0056, 0x0066, 0x080c, 0x9f3a, + 0x9006, 0x7003, 0x0200, 0x7938, 0x710a, 0x793c, 0x710e, 0x7810, + 0x2058, 0xb8a0, 0x080c, 0xb06b, 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, 0x9f3a, 0x7003, 0x0100, 0x782c, 0x700a, 0x7814, 0x700e, + 0x700e, 0x60c3, 0x0008, 0x0804, 0xa4eb, 0x080c, 0x9ee6, 0x7003, + 0x1400, 0x7838, 0x700a, 0x0079, 0x783c, 0x700e, 0x782c, 0x7012, + 0x7830, 0x7016, 0x7834, 0x9084, 0x00ff, 0x8007, 0x701a, 0x60c3, + 0x0010, 0x0804, 0xa4eb, 0x00e6, 0x2071, 0x0240, 0x0006, 0x00f6, + 0x2078, 0x7810, 0x00b6, 0x2058, 0xb8cc, 0xd084, 0x0120, 0x7844, + 0x702a, 0x7848, 0x702e, 0x00be, 0x00fe, 0x000e, 0x00ee, 0x0005, + 0x080c, 0x9f31, 0x7003, 0x0100, 0x782c, 0x700a, 0x7814, 0x700e, + 0x60c3, 0x0008, 0x0804, 0xa4eb, 0x0021, 0x60c3, 0x0000, 0x0804, + 0xa4eb, 0x00d6, 0x080c, 0xadbc, 0xb810, 0x9085, 0x0300, 0x7002, + 0xb814, 0x7006, 0x2069, 0x1800, 0x687c, 0x700a, 0x6880, 0x700e, + 0x7013, 0x0819, 0x080c, 0xa4d9, 0x721a, 0x2f10, 0x7222, 0x7a08, + 0x7226, 0x2071, 0x024c, 0x00de, 0x0005, 0x00a9, 0x7914, 0x712a, + 0x60c3, 0x0000, 0x60a7, 0x9575, 0x0026, 0x080c, 0x2be7, 0x0228, + 0x2011, 0x0101, 0x2204, 0xc0c5, 0x2012, 0x002e, 0x080c, 0xa50e, + 0x080c, 0x8786, 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, + 0xadbc, 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, 0x19b4, 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, 0x9eef, 0x0016, 0x0026, 0x0096, 0x00d6, 0x7814, 0x2048, + 0x7013, 0x0138, 0x2001, 0x1837, 0x2004, 0x9084, 0x0028, 0x1138, + 0x2001, 0x197d, 0x2004, 0x9086, 0xaaaa, 0x1904, 0xae61, 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, 0xadf2, + 0x20a9, 0x0004, 0x2009, 0x1801, 0x2104, 0x2012, 0x8108, 0x8210, + 0x1f04, 0xadfc, 0xa860, 0x20e0, 0xa85c, 0x9080, 0x0029, 0x2098, + 0x2009, 0x0006, 0x20a9, 0x0001, 0x4002, 0x8007, 0x2012, 0x8210, + 0x8109, 0x1dc0, 0x00d6, 0x2069, 0x0200, 0x080c, 0xada7, 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, 0x7569, 0x0150, 0x6028, 0xc0bd, + 0x602a, 0x6014, 0x9084, 0x1804, 0x9085, 0x0029, 0x6016, 0x0010, + 0x080c, 0xa4eb, 0x080c, 0x8786, 0x00de, 0x009e, 0x002e, 0x001e, + 0x0005, 0x00e6, 0x2071, 0x0240, 0x2001, 0x2200, 0x9085, 0x00ff, + 0x7002, 0x7007, 0xffff, 0x2071, 0x0100, 0x709b, 0x00ff, 0x00ee, + 0x0804, 0xadd7, 0x080c, 0x9eef, 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, + 0xaeb3, 0x20a9, 0x0002, 0x2009, 0x1801, 0x2104, 0x2012, 0x8108, + 0x8210, 0x1f04, 0xaebd, 0x00d6, 0x0016, 0x2069, 0x0200, 0x080c, + 0xada7, 0x001e, 0x00de, 0x2071, 0x0240, 0x20a9, 0x0002, 0x2009, + 0x1803, 0x2011, 0x0240, 0x2104, 0x2012, 0x8108, 0x8210, 0x1f04, + 0xaed3, 0x2009, 0x0008, 0x4002, 0x8007, 0x2012, 0x8210, 0x8109, + 0x1dd0, 0x9006, 0x20a9, 0x0008, 0x2012, 0x8210, 0x1f04, 0xaee4, + 0x00ce, 0x60c3, 0x004c, 0x60a3, 0x0056, 0x60a7, 0x9575, 0x080c, + 0xa4eb, 0x080c, 0x8786, 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, 0x20ee, 0x080c, 0x93a0, 0x0126, 0x2091, + 0x8000, 0x080c, 0x9a0f, 0x012e, 0x009e, 0x00de, 0x0005, 0x00f6, + 0x00e6, 0x00d6, 0x00c6, 0x00a6, 0x0096, 0x0066, 0x0126, 0x2091, + 0x8000, 0x2071, 0x19e9, 0x760c, 0x2660, 0x2678, 0x8cff, 0x0904, + 0xafcb, 0x7024, 0x9c06, 0x1520, 0x2069, 0x0100, 0x68c0, 0x9005, + 0x0904, 0xaf9d, 0x080c, 0xa517, 0x68c3, 0x0000, 0x080c, 0xaa49, + 0x7027, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, 0x9384, 0x1000, + 0x0138, 0x2001, 0x0100, 0x080c, 0x2d52, 0x9006, 0x080c, 0x2d52, + 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, 0xd04d, 0x1180, 0x080c, 0x326f, 0x080c, + 0xd05e, 0x1518, 0x080c, 0xbae2, 0x0400, 0x080c, 0xaa49, 0x6824, + 0xd084, 0x09b0, 0x6827, 0x0001, 0x0898, 0x080c, 0xd05e, 0x1118, + 0x080c, 0xbae2, 0x0090, 0x6014, 0x2048, 0x080c, 0xce54, 0x0168, + 0x6020, 0x9086, 0x0003, 0x1520, 0xa867, 0x0103, 0xab7a, 0xa877, + 0x0000, 0x080c, 0x6dd1, 0x080c, 0xd041, 0x080c, 0xd2ca, 0x080c, + 0xb134, 0x080c, 0xa91f, 0x00ce, 0x0804, 0xaf4e, 0x2c78, 0x600c, + 0x2060, 0x0804, 0xaf4e, 0x700f, 0x0000, 0x700b, 0x0000, 0x012e, + 0x006e, 0x009e, 0x00ae, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x0005, + 0x6020, 0x9086, 0x0006, 0x1d08, 0x080c, 0xe948, 0x08f0, 0x00d6, + 0x0156, 0x080c, 0x9f3a, 0x7a14, 0x82ff, 0x0138, 0x7003, 0x0100, + 0x700b, 0x0003, 0x60c3, 0x0008, 0x0490, 0x7003, 0x0200, 0x7007, + 0x0000, 0x2069, 0x1800, 0x901e, 0x6800, 0x9086, 0x0004, 0x1110, + 0xc38d, 0x0060, 0x080c, 0x7569, 0x1110, 0xc3ad, 0x0008, 0xc3a5, + 0x6adc, 0xd29c, 0x1110, 0xd2ac, 0x0108, 0xc39d, 0x730e, 0x080c, + 0x8818, 0x20a9, 0x0006, 0x2011, 0xffec, 0x2019, 0xffed, 0x2071, + 0x0250, 0x2305, 0x2072, 0x8e70, 0x2205, 0x2072, 0x8e70, 0x9398, + 0x0002, 0x9290, 0x0002, 0x1f04, 0xb011, 0x60c3, 0x0020, 0x080c, + 0xa4eb, 0x015e, 0x00de, 0x0005, 0x0156, 0x080c, 0x9f3a, 0x7a14, + 0x82ff, 0x0168, 0x9286, 0xffff, 0x0118, 0x9282, 0x000e, 0x1238, + 0x7003, 0x0100, 0x700b, 0x0003, 0x60c3, 0x0008, 0x0488, 0x7003, + 0x0200, 0x7007, 0x001c, 0x700f, 0x0001, 0x2011, 0x19bf, 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, 0xa4eb, 0x0006, 0x2001, 0x1837, 0x2004, 0xd0ac, + 0x000e, 0x0005, 0x2011, 0x0003, 0x080c, 0xa8ed, 0x2011, 0x0002, + 0x080c, 0xa8f7, 0x080c, 0xa801, 0x0036, 0x901e, 0x080c, 0xa877, + 0x003e, 0x0005, 0x080c, 0x33a5, 0x0188, 0x0016, 0x00b6, 0x00c6, + 0x7010, 0x9085, 0x0020, 0x7012, 0x2009, 0x007e, 0x080c, 0x671d, + 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, + 0x98ed, 0x001e, 0x012e, 0x0cb0, 0x0006, 0x6000, 0x9086, 0x0000, + 0x01c0, 0x601c, 0xd084, 0x190c, 0x1ab7, 0x6017, 0x0000, 0x6023, + 0x0007, 0x2001, 0x1987, 0x2004, 0x0006, 0x9082, 0x0051, 0x000e, + 0x0208, 0x8004, 0x601a, 0x080c, 0xec02, 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, 0xb193, 0xb19c, 0xb1b7, 0xb1d2, + 0xd5a9, 0xd5c6, 0xd5e1, 0xb193, 0xb19c, 0x8fcd, 0xb1eb, 0xb193, + 0xb193, 0xb193, 0xb193, 0x9186, 0x0013, 0x1128, 0x080c, 0x97e1, + 0x080c, 0x98ed, 0x0005, 0x0005, 0x0066, 0x6000, 0x90b2, 0x0010, + 0x1a0c, 0x0dc5, 0x0013, 0x006e, 0x0005, 0xb1b5, 0xb931, 0xbb29, + 0xb1b5, 0xbbbf, 0xb4ce, 0xb1b5, 0xb1b5, 0xb8b3, 0xc12f, 0xb1b5, + 0xb1b5, 0xb1b5, 0xb1b5, 0xb1b5, 0xb1b5, 0x080c, 0x0dc5, 0x0066, + 0x6000, 0x90b2, 0x0010, 0x1a0c, 0x0dc5, 0x0013, 0x006e, 0x0005, + 0xb1d0, 0xc7fc, 0xb1d0, 0xb1d0, 0xb1d0, 0xb1d0, 0xb1d0, 0xb1d0, + 0xc793, 0xc97e, 0xb1d0, 0xc83d, 0xc8bc, 0xc83d, 0xc8bc, 0xb1d0, + 0x080c, 0x0dc5, 0x6000, 0x9082, 0x0010, 0x1a0c, 0x0dc5, 0x6000, + 0x0002, 0xb1e9, 0xc176, 0xc23e, 0xc371, 0xc520, 0xb1e9, 0xb1e9, + 0xb1e9, 0xc14a, 0xc71f, 0xc722, 0xb1e9, 0xb1e9, 0xb1e9, 0xb1e9, + 0xc751, 0x080c, 0x0dc5, 0x0066, 0x6000, 0x90b2, 0x0010, 0x1a0c, + 0x0dc5, 0x0013, 0x006e, 0x0005, 0xb204, 0xb204, 0xb247, 0xb2e6, + 0xb37b, 0xb204, 0xb204, 0xb204, 0xb206, 0xb204, 0xb204, 0xb204, + 0xb204, 0xb204, 0xb204, 0xb204, 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, + 0x1c09, 0x080c, 0x93a0, 0x0126, 0x2091, 0x8000, 0x080c, 0x9a0f, + 0x012e, 0x0005, 0x6010, 0x00b6, 0x2058, 0xbca0, 0x00be, 0x2c00, + 0x080c, 0xb39d, 0x080c, 0xd579, 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, 0xb2ae, 0xb2ae, 0xb2a9, 0xb2ac, 0xb2ae, 0xb2a6, 0xb299, + 0xb299, 0xb299, 0xb299, 0xb299, 0xb299, 0xb299, 0xb299, 0xb299, + 0xb299, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x002e, 0x001e, 0x000e, + 0x004e, 0x00fe, 0x009e, 0x00de, 0x080c, 0x0dc5, 0x080c, 0xbd80, + 0x0028, 0x080c, 0xbe67, 0x0010, 0x080c, 0xbf5d, 0x00fe, 0x00ee, + 0x00de, 0x00ce, 0x002e, 0x001e, 0x2c00, 0xa896, 0x000e, 0x080c, + 0xb45b, 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, 0xb61f, 0x0160, 0x000e, 0x9005, 0x0120, 0x00fe, + 0x009e, 0x00de, 0x0005, 0x00fe, 0x009e, 0x00de, 0x0804, 0xb101, + 0x2001, 0x002c, 0x900e, 0x080c, 0xb4c1, 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, 0x92ed, 0x002e, 0x001e, 0x000e, 0x012e, + 0xa001, 0x6000, 0x9086, 0x0002, 0x1110, 0x0804, 0xb247, 0x0005, + 0xb319, 0xb319, 0xb31b, 0xb351, 0xb319, 0xb319, 0xb319, 0xb319, + 0xb364, 0x080c, 0x0dc5, 0x00d6, 0x0016, 0x0096, 0x080c, 0x989d, + 0x080c, 0x9a0f, 0x6003, 0x0004, 0x6114, 0x2148, 0xa87c, 0xd0fc, + 0x01c0, 0xa878, 0xc0fc, 0x9005, 0x1158, 0xa894, 0x9005, 0x0140, + 0x2001, 0x0000, 0x900e, 0x080c, 0xb4c1, 0x080c, 0xb101, 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, 0x989d, 0x00d6, 0x0096, 0x6114, 0x2148, 0x080c, + 0xce56, 0x0120, 0xa87b, 0x0006, 0x080c, 0x6dd1, 0x009e, 0x00de, + 0x080c, 0xb101, 0x0804, 0x9a0f, 0x080c, 0x989d, 0x080c, 0x3246, + 0x080c, 0xd576, 0x00d6, 0x0096, 0x6114, 0x2148, 0x080c, 0xce56, + 0x0120, 0xa87b, 0x0029, 0x080c, 0x6dd1, 0x009e, 0x00de, 0x080c, + 0xb101, 0x0804, 0x9a0f, 0x9182, 0x0047, 0x0002, 0xb38b, 0xb38d, + 0xb38b, 0xb38b, 0xb38b, 0xb38b, 0xb38b, 0xb38b, 0xb38b, 0xb38b, + 0xb38b, 0xb38b, 0xb38d, 0x080c, 0x0dc5, 0x00d6, 0x0096, 0x601f, + 0x0000, 0x6114, 0x2148, 0xa87b, 0x0000, 0xa883, 0x0000, 0x080c, + 0x6dd1, 0x009e, 0x00de, 0x0804, 0xb101, 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, 0xca03, 0x04c0, 0x2130, + 0x2009, 0x0034, 0x2011, 0x001f, 0x080c, 0xca03, 0x96b2, 0x0034, + 0xb004, 0x904d, 0x0110, 0x080c, 0x0fc0, 0x080c, 0x100e, 0x01d0, + 0x8528, 0xa867, 0x0110, 0xa86b, 0x0000, 0x2920, 0xb406, 0x968a, + 0x003d, 0x1230, 0x2608, 0x2011, 0x001b, 0x080c, 0xca03, 0x00b8, + 0x96b2, 0x003c, 0x2009, 0x003c, 0x2950, 0x2011, 0x001b, 0x080c, + 0xca03, 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, 0x6dd1, 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, 0x6dd1, 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, 0xb470, 0x0804, 0xb472, + 0x9085, 0x0001, 0x7817, 0x0000, 0x009e, 0x00fe, 0x00de, 0x001e, + 0x0005, 0x00d6, 0x0036, 0x0096, 0x6314, 0x2348, 0xa87a, 0xa982, + 0x080c, 0x6dc4, 0x009e, 0x003e, 0x00de, 0x0005, 0x91b6, 0x0015, + 0x1118, 0x080c, 0xb101, 0x0030, 0x91b6, 0x0016, 0x190c, 0x0dc5, + 0x080c, 0xb101, 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, 0xce56, 0x0130, 0x6014, 0x2048, + 0xa807, 0x0000, 0xa867, 0x0103, 0x009e, 0x0804, 0xb101, 0x0096, + 0x00d6, 0x0036, 0x7330, 0x9386, 0x0200, 0x11a8, 0x6010, 0x00b6, + 0x2058, 0xb8cf, 0x0000, 0x00be, 0x6014, 0x9005, 0x0130, 0x2048, + 0xa807, 0x0000, 0xa867, 0x0103, 0xab32, 0x080c, 0xb101, 0x003e, + 0x00de, 0x009e, 0x0005, 0x0011, 0x1d48, 0x0cc8, 0x0006, 0x0016, + 0x080c, 0xd561, 0x0188, 0x6014, 0x9005, 0x1170, 0x600b, 0x0003, + 0x601b, 0x0000, 0x6043, 0x0000, 0x2009, 0x0022, 0x080c, 0xb909, + 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, 0xb101, + 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, 0xca03, 0x080c, 0xce56, + 0x0140, 0x6014, 0x2048, 0xa807, 0x0000, 0xa864, 0xa8e2, 0xa867, + 0x0103, 0x080c, 0xb101, 0x001e, 0x009e, 0x0005, 0x0016, 0x2009, + 0x0000, 0x7030, 0x9086, 0x0200, 0x0110, 0x2009, 0x0001, 0x0096, + 0x6014, 0x904d, 0x090c, 0x0dc5, 0xa97a, 0x080c, 0x6dd1, 0x009e, + 0x080c, 0xb101, 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, 0xca03, 0x009e, 0x080c, 0xce56, + 0x0148, 0xa804, 0x9005, 0x1158, 0xa807, 0x0000, 0xa864, 0xa8e2, + 0xa867, 0x0103, 0x080c, 0xb101, 0x009e, 0x001e, 0x0005, 0x0086, + 0x2040, 0xa030, 0x8007, 0x9086, 0x0100, 0x1118, 0x080c, 0xbae2, + 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, 0xd4d7, 0x001e, 0x1158, 0x622c, 0x2268, 0x2071, 0x026c, + 0x6b20, 0x9386, 0x0003, 0x0130, 0x9386, 0x0006, 0x0128, 0x080c, + 0xb101, 0x0020, 0x0039, 0x0010, 0x080c, 0xb73e, 0x002e, 0x00de, + 0x00ee, 0x0005, 0x0096, 0x6814, 0x2048, 0x9186, 0x0015, 0x0904, + 0xb726, 0x918e, 0x0016, 0x1904, 0xb73c, 0x700c, 0x908c, 0xff00, + 0x9186, 0x1700, 0x0120, 0x9186, 0x0300, 0x1904, 0xb700, 0x89ff, + 0x1138, 0x6800, 0x9086, 0x000f, 0x0904, 0xb6e3, 0x0804, 0xb73a, + 0x6808, 0x9086, 0xffff, 0x1904, 0xb728, 0xa87c, 0x9084, 0x0060, + 0x9086, 0x0020, 0x1128, 0xa83c, 0xa940, 0x9105, 0x1904, 0xb728, + 0x6824, 0xd084, 0x1904, 0xb728, 0xd0b4, 0x0158, 0x0016, 0x2001, + 0x1987, 0x200c, 0x6018, 0x9102, 0x9082, 0x0005, 0x001e, 0x1a04, + 0xb728, 0x080c, 0xd041, 0x685c, 0xa882, 0xa87c, 0xc0dc, 0xc0f4, + 0xc0d4, 0xa87e, 0x0026, 0x900e, 0x6a18, 0x2001, 0x000a, 0x080c, + 0x91b1, 0xa884, 0x920a, 0x0208, 0x8011, 0xaa86, 0x82ff, 0x002e, + 0x1138, 0x00c6, 0x2d60, 0x080c, 0xcb65, 0x00ce, 0x0804, 0xb73a, + 0x00c6, 0xa868, 0xd0fc, 0x1118, 0x080c, 0x61bb, 0x0010, 0x080c, + 0x65c8, 0x00ce, 0x1904, 0xb728, 0x00c6, 0x2d60, 0x080c, 0xb101, + 0x00ce, 0x0804, 0xb73a, 0x00c6, 0x080c, 0xb153, 0x0198, 0x6017, + 0x0000, 0x6810, 0x6012, 0x080c, 0xd2d2, 0x6023, 0x0003, 0x6904, + 0x00c6, 0x2d60, 0x080c, 0xb101, 0x00ce, 0x080c, 0xb180, 0x00ce, + 0x0804, 0xb73a, 0x2001, 0x1989, 0x2004, 0x6842, 0x00ce, 0x04d0, + 0x7008, 0x9086, 0x000b, 0x11c8, 0x6010, 0x00b6, 0x2058, 0xb900, + 0xc1bc, 0xb902, 0x00be, 0x00c6, 0x2d60, 0xa87b, 0x0003, 0x080c, + 0xd51b, 0x6007, 0x0085, 0x6003, 0x000b, 0x6023, 0x0002, 0x080c, + 0x933b, 0x080c, 0x98ed, 0x00ce, 0x00e8, 0x700c, 0x9086, 0x2a00, + 0x1138, 0x2001, 0x1989, 0x2004, 0x6842, 0x00a0, 0x0479, 0x00a0, + 0x89ff, 0x090c, 0x0dc5, 0x00c6, 0x00d6, 0x2d60, 0xa867, 0x0103, + 0xa87b, 0x0003, 0x080c, 0x6beb, 0x080c, 0xd041, 0x080c, 0xb134, + 0x00de, 0x00ce, 0x080c, 0xb101, 0x009e, 0x0005, 0x9186, 0x0015, + 0x1128, 0x2001, 0x1989, 0x2004, 0x6842, 0x0068, 0x918e, 0x0016, + 0x1160, 0x00c6, 0x2d00, 0x2060, 0x080c, 0xec02, 0x080c, 0x88f1, + 0x080c, 0xb101, 0x00ce, 0x080c, 0xb101, 0x0005, 0x0026, 0x0036, + 0x0046, 0x7228, 0xacb0, 0xabac, 0xd2f4, 0x0130, 0x2001, 0x1989, + 0x2004, 0x6842, 0x0804, 0xb7b8, 0x00c6, 0x2d60, 0x080c, 0xca64, + 0x00ce, 0x6804, 0x9086, 0x0050, 0x1168, 0x00c6, 0x2d00, 0x2060, + 0x6003, 0x0001, 0x6007, 0x0050, 0x080c, 0x933b, 0x080c, 0x98ed, + 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, 0xd1c9, 0x080c, 0x98ed, 0x0010, + 0x080c, 0xb101, 0x004e, 0x003e, 0x002e, 0x0005, 0x00e6, 0x00d6, + 0x0026, 0x7008, 0x9084, 0x00ff, 0x6210, 0x00b6, 0x2258, 0xba10, + 0x00be, 0x9206, 0x1904, 0xb823, 0x700c, 0x6210, 0x00b6, 0x2258, + 0xba14, 0x00be, 0x9206, 0x1904, 0xb823, 0x6038, 0x2068, 0x6824, + 0xc0dc, 0x6826, 0x6a20, 0x9286, 0x0007, 0x0904, 0xb823, 0x9286, + 0x0002, 0x0904, 0xb823, 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, 0xce56, 0x090c, 0x0dc5, 0xa87b, 0x0003, 0x009e, 0x080c, + 0xd51b, 0x6007, 0x0085, 0x6003, 0x000b, 0x6023, 0x0002, 0x080c, + 0x933b, 0x080c, 0x98ed, 0x00ce, 0x0030, 0x6038, 0x2070, 0x2001, + 0x1989, 0x2004, 0x7042, 0x080c, 0xb101, 0x002e, 0x00de, 0x00ee, + 0x0005, 0x00b6, 0x0096, 0x00f6, 0x6014, 0x2048, 0x6010, 0x2058, + 0x91b6, 0x0015, 0x0130, 0xba08, 0xbb0c, 0xbc00, 0xc48c, 0xbc02, + 0x0460, 0x0096, 0x0156, 0x0036, 0x0026, 0x2b48, 0x9e90, 0x0010, + 0x2019, 0x000a, 0x20a9, 0x0004, 0x080c, 0xc0f7, 0x002e, 0x003e, + 0x015e, 0x009e, 0x1904, 0xb892, 0x0096, 0x0156, 0x0036, 0x0026, + 0x2b48, 0x9e90, 0x0014, 0x2019, 0x0006, 0x20a9, 0x0004, 0x080c, + 0xc0f7, 0x002e, 0x003e, 0x015e, 0x009e, 0x15a0, 0x7238, 0xba0a, + 0x733c, 0xbb0e, 0xbc00, 0xc48d, 0xbc02, 0xa804, 0x9005, 0x1128, + 0x00fe, 0x009e, 0x00be, 0x0804, 0xb50a, 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, 0xb61f, + 0x0130, 0x00fe, 0x009e, 0x080c, 0xb101, 0x00be, 0x0005, 0x080c, + 0xbae2, 0x0cb8, 0x2b78, 0x00f6, 0x080c, 0x3246, 0x080c, 0xd576, + 0x00fe, 0x00c6, 0x080c, 0xb0ab, 0x2f00, 0x6012, 0x6017, 0x0000, + 0x6023, 0x0001, 0x6007, 0x0001, 0x6003, 0x0001, 0x2001, 0x0007, + 0x080c, 0x6663, 0x080c, 0x668f, 0x080c, 0x9383, 0x080c, 0x98ed, + 0x00ce, 0x0804, 0xb865, 0x2100, 0x91b2, 0x0053, 0x1a0c, 0x0dc5, + 0x91b2, 0x0040, 0x1a04, 0xb91b, 0x0002, 0xb909, 0xb909, 0xb8ff, + 0xb909, 0xb909, 0xb909, 0xb8fd, 0xb8fd, 0xb8fd, 0xb8fd, 0xb8fd, + 0xb8fd, 0xb8fd, 0xb8fd, 0xb8fd, 0xb8fd, 0xb8fd, 0xb8fd, 0xb8fd, + 0xb8fd, 0xb8fd, 0xb8fd, 0xb8fd, 0xb8fd, 0xb8fd, 0xb8fd, 0xb8fd, + 0xb8fd, 0xb8fd, 0xb8fd, 0xb8fd, 0xb909, 0xb8fd, 0xb909, 0xb909, + 0xb8fd, 0xb8fd, 0xb8fd, 0xb8fd, 0xb8fd, 0xb8ff, 0xb8fd, 0xb8fd, + 0xb8fd, 0xb8fd, 0xb8fd, 0xb8fd, 0xb8fd, 0xb8fd, 0xb8fd, 0xb909, + 0xb909, 0xb8fd, 0xb8fd, 0xb8fd, 0xb8fd, 0xb8fd, 0xb8fd, 0xb8fd, + 0xb8fd, 0xb8fd, 0xb909, 0xb8fd, 0xb8fd, 0x080c, 0x0dc5, 0x0066, + 0x00b6, 0x6610, 0x2658, 0xb8cc, 0xc08c, 0xb8ce, 0x00be, 0x006e, + 0x0000, 0x6003, 0x0001, 0x6106, 0x9186, 0x0032, 0x0118, 0x080c, + 0x9383, 0x0010, 0x080c, 0x933b, 0x0126, 0x2091, 0x8000, 0x080c, + 0x98ed, 0x012e, 0x0005, 0x2600, 0x0002, 0xb909, 0xb909, 0xb92f, + 0xb909, 0xb909, 0xb92f, 0xb92f, 0xb92f, 0xb92f, 0xb909, 0xb92f, + 0xb909, 0xb92f, 0xb909, 0xb92f, 0xb92f, 0xb92f, 0xb92f, 0x080c, + 0x0dc5, 0x6004, 0x90b2, 0x0053, 0x1a0c, 0x0dc5, 0x91b6, 0x0013, + 0x0904, 0xba04, 0x91b6, 0x0027, 0x1904, 0xb9ae, 0x080c, 0x97e1, + 0x6004, 0x080c, 0xd04d, 0x01b0, 0x080c, 0xd05e, 0x01a8, 0x908e, + 0x0021, 0x0904, 0xb9ab, 0x908e, 0x0022, 0x1130, 0x080c, 0xb536, + 0x0904, 0xb9a7, 0x0804, 0xb9a8, 0x908e, 0x003d, 0x0904, 0xb9ab, + 0x0804, 0xb9a1, 0x080c, 0x326f, 0x2001, 0x0007, 0x080c, 0x6663, + 0x6010, 0x00b6, 0x2058, 0xb9a0, 0x00be, 0x080c, 0xbae2, 0x9186, + 0x007e, 0x1148, 0x2001, 0x1837, 0x2014, 0xc285, 0x080c, 0x7569, + 0x1108, 0xc2ad, 0x2202, 0x0036, 0x0026, 0x2019, 0x0028, 0x2110, + 0x080c, 0xed0f, 0x002e, 0x003e, 0x0016, 0x0026, 0x0036, 0x2110, + 0x2019, 0x0028, 0x080c, 0x94e0, 0x0076, 0x903e, 0x080c, 0x93b3, + 0x6010, 0x00b6, 0x905d, 0x0100, 0x00be, 0x2c08, 0x080c, 0xe690, + 0x007e, 0x003e, 0x002e, 0x001e, 0x080c, 0xd576, 0x0016, 0x080c, + 0xd2ca, 0x080c, 0xb101, 0x001e, 0x080c, 0x3342, 0x080c, 0x98ed, + 0x0030, 0x080c, 0xd2ca, 0x080c, 0xb101, 0x080c, 0x98ed, 0x0005, + 0x080c, 0xbae2, 0x0cb0, 0x080c, 0xbb1e, 0x0c98, 0x9186, 0x0015, + 0x0118, 0x9186, 0x0016, 0x1148, 0x080c, 0xd587, 0x0d80, 0x6000, + 0x9086, 0x0002, 0x0904, 0xbb29, 0x0c50, 0x9186, 0x0014, 0x1d38, + 0x080c, 0x97e1, 0x6004, 0x908e, 0x0022, 0x1118, 0x080c, 0xb536, + 0x09f0, 0x080c, 0x3246, 0x080c, 0xd576, 0x080c, 0xd04d, 0x1198, + 0x080c, 0x326f, 0x6010, 0x00b6, 0x2058, 0xb9a0, 0x00be, 0x080c, + 0xbae2, 0x9186, 0x007e, 0x1128, 0x2001, 0x1837, 0x200c, 0xc185, + 0x2102, 0x0804, 0xb9a1, 0x080c, 0xd05e, 0x1120, 0x080c, 0xbae2, + 0x0804, 0xb9a1, 0x6004, 0x908e, 0x0032, 0x1160, 0x00e6, 0x00f6, + 0x2071, 0x189e, 0x2079, 0x0000, 0x080c, 0x35dd, 0x00fe, 0x00ee, + 0x0804, 0xb9a1, 0x6004, 0x908e, 0x0021, 0x0d40, 0x908e, 0x0022, + 0x090c, 0xbae2, 0x0804, 0xb9a1, 0x90b2, 0x0040, 0x1a04, 0xbabe, + 0x2008, 0x0002, 0xba4c, 0xba4d, 0xba50, 0xba53, 0xba56, 0xba63, + 0xba4a, 0xba4a, 0xba4a, 0xba4a, 0xba4a, 0xba4a, 0xba4a, 0xba4a, + 0xba4a, 0xba4a, 0xba4a, 0xba4a, 0xba4a, 0xba4a, 0xba4a, 0xba4a, + 0xba4a, 0xba4a, 0xba4a, 0xba4a, 0xba4a, 0xba4a, 0xba4a, 0xba4a, + 0xba66, 0xba73, 0xba4a, 0xba75, 0xba73, 0xba4a, 0xba4a, 0xba4a, + 0xba4a, 0xba4a, 0xba73, 0xba73, 0xba4a, 0xba4a, 0xba4a, 0xba4a, + 0xba4a, 0xba4a, 0xba4a, 0xba4a, 0xbaa5, 0xba73, 0xba4a, 0xba6f, + 0xba4a, 0xba4a, 0xba4a, 0xba70, 0xba4a, 0xba4a, 0xba4a, 0xba73, + 0xba9c, 0xba4a, 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, 0x97e1, + 0x6003, 0x0005, 0x080c, 0xd579, 0x080c, 0x98ed, 0x0070, 0x0018, + 0x0010, 0x080c, 0x6663, 0x0804, 0xbab6, 0x080c, 0x97e1, 0x080c, + 0xd579, 0x6003, 0x0004, 0x080c, 0x98ed, 0x0005, 0x080c, 0x6663, + 0x080c, 0x97e1, 0x6003, 0x0002, 0x0036, 0x2019, 0x1852, 0x2304, + 0x9084, 0xff00, 0x1120, 0x2001, 0x1987, 0x201c, 0x0040, 0x8007, + 0x909a, 0x0004, 0x0ec0, 0x8003, 0x801b, 0x831b, 0x9318, 0x631a, + 0x003e, 0x080c, 0x98ed, 0x0c08, 0x080c, 0x97e1, 0x080c, 0xd2ca, + 0x080c, 0xb101, 0x080c, 0x98ed, 0x08c0, 0x00e6, 0x00f6, 0x2071, + 0x189e, 0x2079, 0x0000, 0x080c, 0x35dd, 0x00fe, 0x00ee, 0x080c, + 0x97e1, 0x080c, 0xb101, 0x080c, 0x98ed, 0x0838, 0x080c, 0x97e1, + 0x6003, 0x0002, 0x080c, 0xd579, 0x0804, 0x98ed, 0x2600, 0x2008, + 0x0002, 0xbad5, 0xbab6, 0xbad3, 0xbab6, 0xbab6, 0xbad3, 0xbad3, + 0xbad3, 0xbad3, 0xbab6, 0xbad3, 0xbab6, 0xbad3, 0xbab6, 0xbad3, + 0xbad3, 0xbad3, 0xbad3, 0x080c, 0x0dc5, 0x080c, 0x97e1, 0x0096, + 0x6014, 0x2048, 0x080c, 0x6dd1, 0x009e, 0x080c, 0xb101, 0x080c, + 0x98ed, 0x0005, 0x00e6, 0x0096, 0x0026, 0x0016, 0x080c, 0xce56, + 0x0568, 0x6014, 0x2048, 0xa864, 0x9086, 0x0139, 0x11a8, 0xa894, + 0x9086, 0x0056, 0x1148, 0x080c, 0x556d, 0x0130, 0x2001, 0x0000, + 0x900e, 0x2011, 0x4000, 0x0028, 0x2001, 0x0030, 0x900e, 0x2011, + 0x4005, 0x080c, 0xd43b, 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, + 0xd35a, 0x0804, 0xbbae, 0x6604, 0x96b6, 0x0043, 0x1120, 0x080c, + 0xd3a3, 0x0804, 0xbbae, 0x6604, 0x96b6, 0x004b, 0x1120, 0x080c, + 0xd3cf, 0x0804, 0xbbae, 0x6604, 0x96b6, 0x0033, 0x1120, 0x080c, + 0xd2ec, 0x0804, 0xbbae, 0x6604, 0x96b6, 0x0028, 0x1120, 0x080c, + 0xd09c, 0x0804, 0xbbae, 0x6604, 0x96b6, 0x0029, 0x1120, 0x080c, + 0xd0dd, 0x0804, 0xbbae, 0x6604, 0x96b6, 0x001f, 0x1120, 0x080c, + 0xb4db, 0x0804, 0xbbae, 0x6604, 0x96b6, 0x0000, 0x1118, 0x080c, + 0xb829, 0x04e0, 0x6604, 0x96b6, 0x0022, 0x1118, 0x080c, 0xb517, + 0x04a8, 0x6604, 0x96b6, 0x0035, 0x1118, 0x080c, 0xb63d, 0x0470, + 0x6604, 0x96b6, 0x0039, 0x1118, 0x080c, 0xb7be, 0x0438, 0x6604, + 0x96b6, 0x003d, 0x1118, 0x080c, 0xb54f, 0x0400, 0x6604, 0x96b6, + 0x0044, 0x1118, 0x080c, 0xb58b, 0x00c8, 0x6604, 0x96b6, 0x0049, + 0x1118, 0x080c, 0xb5cc, 0x0090, 0x6604, 0x96b6, 0x0041, 0x1118, + 0x080c, 0xb5b6, 0x0058, 0x91b6, 0x0015, 0x1110, 0x0063, 0x0030, + 0x91b6, 0x0016, 0x1128, 0x00be, 0x0804, 0xbe0c, 0x00be, 0x0005, + 0x080c, 0xb19b, 0x0cd8, 0xbbcb, 0xbbd9, 0xbbcb, 0xbc20, 0xbbcb, + 0xbd80, 0xbe19, 0xbbcb, 0xbbcb, 0xbde2, 0xbbcb, 0xbdf8, 0x0096, + 0x601f, 0x0000, 0x6014, 0x2048, 0xa800, 0x2048, 0xa867, 0x0103, + 0x009e, 0x0804, 0xb101, 0xa001, 0xa001, 0x0005, 0x6604, 0x96b6, + 0x0004, 0x1130, 0x2001, 0x0001, 0x080c, 0x664f, 0x0804, 0xb101, + 0x0005, 0x00e6, 0x2071, 0x1800, 0x7090, 0x9086, 0x0074, 0x1540, + 0x080c, 0xe661, 0x11b0, 0x6010, 0x00b6, 0x2058, 0x7030, 0xd08c, + 0x0128, 0xb800, 0xd0bc, 0x0110, 0xc0c5, 0xb802, 0x00f9, 0x00be, + 0x2001, 0x0006, 0x080c, 0x6663, 0x080c, 0x326f, 0x080c, 0xb101, + 0x0098, 0x2001, 0x000a, 0x080c, 0x6663, 0x080c, 0x326f, 0x6003, + 0x0001, 0x6007, 0x0001, 0x080c, 0x9383, 0x080c, 0x98ed, 0x0020, + 0x2001, 0x0001, 0x080c, 0xbd50, 0x00ee, 0x0005, 0x00d6, 0xb800, + 0xd084, 0x0160, 0x9006, 0x080c, 0x664f, 0x2069, 0x1847, 0x6804, + 0xd0a4, 0x0120, 0x2001, 0x0006, 0x080c, 0x668f, 0x00de, 0x0005, + 0x00b6, 0x0096, 0x00d6, 0x2011, 0x1824, 0x2204, 0x9086, 0x0074, + 0x1904, 0xbd25, 0x6010, 0x2058, 0xbaa0, 0x9286, 0x007e, 0x1120, + 0x080c, 0xbf68, 0x0804, 0xbc92, 0x080c, 0xbf5d, 0x6010, 0x2058, + 0xbaa0, 0x9286, 0x0080, 0x1510, 0x6014, 0x9005, 0x01a8, 0x2048, + 0xa864, 0x9084, 0x00ff, 0x9086, 0x0039, 0x1140, 0x2001, 0x0000, + 0x900e, 0x2011, 0x4000, 0x080c, 0xd43b, 0x0030, 0xa807, 0x0000, + 0xa867, 0x0103, 0xa833, 0x0200, 0x2001, 0x0006, 0x080c, 0x6663, + 0x080c, 0x326f, 0x080c, 0xb101, 0x0804, 0xbd2a, 0x080c, 0xbd38, + 0x6014, 0x9005, 0x0190, 0x2048, 0xa868, 0xd0f4, 0x01e8, 0xa864, + 0x9084, 0x00ff, 0x9086, 0x0039, 0x1d08, 0x2001, 0x0000, 0x900e, + 0x2011, 0x4000, 0x080c, 0xd43b, 0x08f8, 0x080c, 0xbd2e, 0x0160, + 0x9006, 0x080c, 0x664f, 0x2001, 0x0004, 0x080c, 0x668f, 0x2001, + 0x0007, 0x080c, 0x6663, 0x08a0, 0x2001, 0x0004, 0x080c, 0x6663, + 0x6003, 0x0001, 0x6007, 0x0003, 0x080c, 0x9383, 0x080c, 0x98ed, + 0x0804, 0xbd2a, 0xb85c, 0xd0e4, 0x0178, 0x080c, 0xd26c, 0x080c, + 0x7569, 0x0118, 0xd0dc, 0x1904, 0xbc54, 0x2011, 0x1837, 0x2204, + 0xc0ad, 0x2012, 0x0804, 0xbc54, 0x080c, 0xd2a9, 0x2011, 0x1837, + 0x2204, 0xc0a5, 0x2012, 0x0006, 0x080c, 0xe82d, 0x000e, 0x1904, + 0xbc54, 0xc0b5, 0x2012, 0x2001, 0x0006, 0x080c, 0x6663, 0x9006, + 0x080c, 0x664f, 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, 0x28dd, 0x00f6, + 0x2100, 0x900e, 0x080c, 0x2894, 0x795e, 0x00fe, 0x9186, 0x0081, + 0x01f0, 0x2009, 0x0081, 0x00e0, 0x2009, 0x00ef, 0x00f6, 0x2079, + 0x0100, 0x79ea, 0x78e7, 0x0000, 0x7932, 0x7936, 0x780c, 0xc0b5, + 0x780e, 0x00fe, 0x080c, 0x28dd, 0x00f6, 0x2079, 0x1800, 0x7982, + 0x2100, 0x900e, 0x797e, 0x080c, 0x2894, 0x795e, 0x00fe, 0x8108, + 0x080c, 0x66b2, 0x2b00, 0x00ce, 0x1904, 0xbc54, 0x6012, 0x2009, + 0x180f, 0x210c, 0xd19c, 0x0150, 0x2009, 0x027c, 0x210c, 0x918c, + 0x00ff, 0xb912, 0x2009, 0x027d, 0x210c, 0xb916, 0x2001, 0x0002, + 0x080c, 0x6663, 0x6023, 0x0001, 0x6003, 0x0001, 0x6007, 0x0002, + 0x080c, 0x9383, 0x080c, 0x98ed, 0x0028, 0x080c, 0xbae2, 0x2001, + 0x0001, 0x0431, 0x00de, 0x009e, 0x00be, 0x0005, 0x2001, 0x1810, + 0x2004, 0xd0a4, 0x0120, 0x2001, 0x1848, 0x2004, 0xd0ac, 0x0005, + 0x00e6, 0x080c, 0xed68, 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, 0x6663, 0x080c, + 0x57e7, 0x1120, 0x2001, 0x0007, 0x080c, 0x668f, 0x2600, 0x9005, + 0x11b0, 0x6014, 0x0096, 0x2048, 0xa868, 0x009e, 0xd0fc, 0x1178, + 0x0036, 0x0046, 0x6010, 0x00b6, 0x2058, 0xbba0, 0x00be, 0x2021, + 0x0004, 0x2011, 0x8014, 0x080c, 0x4be9, 0x004e, 0x003e, 0x080c, + 0x326f, 0x6020, 0x9086, 0x000a, 0x1108, 0x0005, 0x0804, 0xb101, + 0x00b6, 0x00e6, 0x0026, 0x0016, 0x2071, 0x1800, 0x7090, 0x9086, + 0x0014, 0x1904, 0xbdd8, 0x080c, 0x57e7, 0x1170, 0x6014, 0x9005, + 0x1158, 0x0036, 0x0046, 0x6010, 0x2058, 0xbba0, 0x2021, 0x0006, + 0x080c, 0x4da0, 0x004e, 0x003e, 0x00d6, 0x6010, 0x2058, 0x080c, + 0x67b8, 0x080c, 0xbc0e, 0x00de, 0x080c, 0xc033, 0x1588, 0x6010, + 0x2058, 0xb890, 0x9005, 0x0560, 0x2001, 0x0006, 0x080c, 0x6663, + 0x0096, 0x6014, 0x904d, 0x01d0, 0xa864, 0x9084, 0x00ff, 0x9086, + 0x0039, 0x1140, 0x2001, 0x0000, 0x900e, 0x2011, 0x4000, 0x080c, + 0xd43b, 0x0060, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0029, 0x0130, + 0xa807, 0x0000, 0xa867, 0x0103, 0xa833, 0x0200, 0x009e, 0x080c, + 0x326f, 0x6020, 0x9086, 0x000a, 0x0140, 0x080c, 0xb101, 0x0028, + 0x080c, 0xbae2, 0x9006, 0x080c, 0xbd50, 0x001e, 0x002e, 0x00ee, + 0x00be, 0x0005, 0x2011, 0x1824, 0x2204, 0x9086, 0x0014, 0x1160, + 0x2001, 0x0002, 0x080c, 0x6663, 0x6003, 0x0001, 0x6007, 0x0001, + 0x080c, 0x9383, 0x0804, 0x98ed, 0x2001, 0x0001, 0x0804, 0xbd50, + 0x2030, 0x2011, 0x1824, 0x2204, 0x9086, 0x0004, 0x1148, 0x96b6, + 0x000b, 0x1120, 0x2001, 0x0007, 0x080c, 0x6663, 0x0804, 0xb101, + 0x2001, 0x0001, 0x0804, 0xbd50, 0x0002, 0xbbcb, 0xbe24, 0xbbcb, + 0xbe67, 0xbbcb, 0xbf14, 0xbe19, 0xbbce, 0xbbcb, 0xbf28, 0xbbcb, + 0xbf3a, 0x6604, 0x9686, 0x0003, 0x0904, 0xbd80, 0x96b6, 0x001e, + 0x1110, 0x080c, 0xb101, 0x0005, 0x00b6, 0x00d6, 0x00c6, 0x080c, + 0xbf4c, 0x11a0, 0x9006, 0x080c, 0x664f, 0x080c, 0x3246, 0x080c, + 0xd576, 0x2001, 0x0002, 0x080c, 0x6663, 0x6003, 0x0001, 0x6007, + 0x0002, 0x080c, 0x9383, 0x080c, 0x98ed, 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, 0x3246, 0x080c, 0xd576, 0x2001, + 0x0001, 0x080c, 0xbd50, 0x00ce, 0x00de, 0x00be, 0x0005, 0x0096, + 0x00b6, 0x0026, 0x9016, 0x080c, 0xbf5a, 0x00d6, 0x2069, 0x197d, + 0x2d04, 0x9005, 0x0168, 0x6010, 0x2058, 0xb8a0, 0x9086, 0x007e, + 0x1138, 0x2069, 0x1820, 0x2d04, 0x8000, 0x206a, 0x00de, 0x0010, + 0x00de, 0x0088, 0x9006, 0x080c, 0x664f, 0x2001, 0x0002, 0x080c, + 0x6663, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x9383, 0x080c, + 0x98ed, 0x0804, 0xbee4, 0x080c, 0xce56, 0x01b0, 0x6014, 0x2048, + 0xa864, 0x2010, 0x9086, 0x0139, 0x1138, 0x6007, 0x0016, 0x2001, + 0x0002, 0x080c, 0xd498, 0x00b0, 0x6014, 0x2048, 0xa864, 0xd0fc, + 0x0118, 0x2001, 0x0001, 0x0ca8, 0x2001, 0x180e, 0x2004, 0xd0dc, + 0x0148, 0x6010, 0x2058, 0xb840, 0x9084, 0x00ff, 0x9005, 0x1110, + 0x9006, 0x0c38, 0x080c, 0xbae2, 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, 0x6663, 0x2001, 0x0028, 0x601a, 0x6007, 0x0052, 0x0020, + 0x2001, 0x0001, 0x080c, 0xbd50, 0x002e, 0x00be, 0x009e, 0x0005, + 0x9286, 0x0139, 0x0160, 0x6014, 0x2048, 0x080c, 0xce56, 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, 0x60ba, 0x00ee, + 0x0010, 0x080c, 0x3246, 0x0860, 0x2001, 0x0004, 0x080c, 0x6663, + 0x080c, 0xbf5a, 0x1140, 0x6003, 0x0001, 0x6007, 0x0003, 0x080c, + 0x9383, 0x0804, 0x98ed, 0x080c, 0xbae2, 0x9006, 0x0804, 0xbd50, + 0x0489, 0x1160, 0x2001, 0x0008, 0x080c, 0x6663, 0x6003, 0x0001, + 0x6007, 0x0005, 0x080c, 0x9383, 0x0804, 0x98ed, 0x2001, 0x0001, + 0x0804, 0xbd50, 0x00f9, 0x1160, 0x2001, 0x000a, 0x080c, 0x6663, + 0x6003, 0x0001, 0x6007, 0x0001, 0x080c, 0x9383, 0x0804, 0x98ed, + 0x2001, 0x0001, 0x0804, 0xbd50, 0x2009, 0x026e, 0x2104, 0x9086, + 0x0003, 0x1138, 0x2009, 0x026f, 0x2104, 0x9084, 0xff00, 0x9086, + 0x2a00, 0x0005, 0x9085, 0x0001, 0x0005, 0x00b6, 0x00c6, 0x0016, + 0x6110, 0x2158, 0x080c, 0x672c, 0x001e, 0x00ce, 0x00be, 0x0005, + 0x00b6, 0x00f6, 0x00e6, 0x00d6, 0x0036, 0x0016, 0x6010, 0x2058, + 0x2009, 0x1837, 0x2104, 0x9085, 0x0003, 0x200a, 0x080c, 0xc005, + 0x0560, 0x2009, 0x1837, 0x2104, 0xc0cd, 0x200a, 0x080c, 0x6a8e, + 0x0158, 0x9006, 0x2020, 0x2009, 0x002a, 0x080c, 0xe9a5, 0x2001, + 0x180c, 0x200c, 0xc195, 0x2102, 0x2019, 0x002a, 0x2009, 0x0001, + 0x080c, 0x3211, 0x00e6, 0x2071, 0x1800, 0x080c, 0x3019, 0x00ee, + 0x00c6, 0x0156, 0x20a9, 0x0781, 0x2009, 0x007f, 0x080c, 0x3342, + 0x8108, 0x1f04, 0xbf9e, 0x015e, 0x00ce, 0x080c, 0xbf5d, 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, 0x28dd, 0x080c, 0x7569, 0x0170, 0x2071, + 0x0260, 0x2069, 0x1983, 0x7048, 0x206a, 0x704c, 0x6806, 0x7050, + 0x680a, 0x7054, 0x680e, 0x080c, 0xd26c, 0x0040, 0x2001, 0x0006, + 0x080c, 0x6663, 0x080c, 0x326f, 0x080c, 0xb101, 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, 0xc0f7, 0x1148, 0x2011, 0x027a, 0x20a9, 0x0004, + 0x2019, 0x0006, 0x080c, 0xc0f7, 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, 0x19f2, 0x252c, 0x2021, + 0x19f8, 0x2424, 0x2061, 0x1cd0, 0x2071, 0x1800, 0x7254, 0x7074, + 0x9202, 0x1a04, 0xc0c3, 0x080c, 0x8bc3, 0x0904, 0xc0bc, 0x080c, + 0xe9d6, 0x0904, 0xc0bc, 0x6720, 0x9786, 0x0007, 0x0904, 0xc0bc, + 0x2500, 0x9c06, 0x0904, 0xc0bc, 0x2400, 0x9c06, 0x05e8, 0x3e08, + 0x9186, 0x0002, 0x1148, 0x6010, 0x9005, 0x0130, 0x00b6, 0x2058, + 0xb800, 0x00be, 0xd0bc, 0x1580, 0x00c6, 0x6000, 0x9086, 0x0004, + 0x1110, 0x080c, 0x1ab7, 0x9786, 0x000a, 0x0148, 0x080c, 0xd05e, + 0x1130, 0x00ce, 0x080c, 0xbae2, 0x080c, 0xb134, 0x00e8, 0x6014, + 0x2048, 0x080c, 0xce56, 0x01a8, 0x9786, 0x0003, 0x1530, 0xa867, + 0x0103, 0xa87c, 0xd0cc, 0x0130, 0x0096, 0xa878, 0x2048, 0x080c, + 0x0fc0, 0x009e, 0xab7a, 0xa877, 0x0000, 0x080c, 0x6dc4, 0x080c, + 0xd041, 0x080c, 0xb134, 0x00ce, 0x9ce0, 0x0018, 0x7068, 0x9c02, + 0x1210, 0x0804, 0xc066, 0x012e, 0x000e, 0x002e, 0x004e, 0x005e, + 0x007e, 0x00ce, 0x009e, 0x00ee, 0x0005, 0x9786, 0x0006, 0x1118, + 0x080c, 0xe948, 0x0c30, 0x9786, 0x0009, 0x1148, 0x6000, 0x9086, + 0x0004, 0x0d08, 0x2009, 0x004c, 0x080c, 0xb180, 0x08e0, 0x9786, + 0x000a, 0x0980, 0x0820, 0x220c, 0x2304, 0x9106, 0x1130, 0x8210, + 0x8318, 0x1f04, 0xc0e3, 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, 0xc121, 0x9006, 0x0005, 0x918d, 0x0001, 0x0005, 0x6004, + 0x908a, 0x0053, 0x1a0c, 0x0dc5, 0x080c, 0xd04d, 0x0120, 0x080c, + 0xd05e, 0x0168, 0x0028, 0x080c, 0x326f, 0x080c, 0xd05e, 0x0138, + 0x080c, 0x97e1, 0x080c, 0xb101, 0x080c, 0x98ed, 0x0005, 0x080c, + 0xbae2, 0x0cb0, 0x9182, 0x0054, 0x1220, 0x9182, 0x0040, 0x0208, + 0x000a, 0x0005, 0xc166, 0xc166, 0xc166, 0xc166, 0xc166, 0xc166, + 0xc166, 0xc166, 0xc166, 0xc166, 0xc166, 0xc168, 0xc168, 0xc168, + 0xc168, 0xc166, 0xc166, 0xc166, 0xc168, 0xc166, 0x080c, 0x0dc5, + 0x600b, 0xffff, 0x6003, 0x0001, 0x6106, 0x080c, 0x933b, 0x0126, + 0x2091, 0x8000, 0x080c, 0x98ed, 0x012e, 0x0005, 0x9186, 0x0013, + 0x1128, 0x6004, 0x9082, 0x0040, 0x0804, 0xc200, 0x9186, 0x0027, + 0x1520, 0x080c, 0x97e1, 0x080c, 0x3246, 0x080c, 0xd576, 0x0096, + 0x6114, 0x2148, 0x080c, 0xce56, 0x0198, 0x080c, 0xd05e, 0x1118, + 0x080c, 0xbae2, 0x0068, 0xa867, 0x0103, 0xa87b, 0x0029, 0xa877, + 0x0000, 0xa97c, 0xc1c5, 0xa97e, 0x080c, 0x6dd1, 0x080c, 0xd041, + 0x009e, 0x080c, 0xb101, 0x0804, 0x98ed, 0x9186, 0x0014, 0x1120, + 0x6004, 0x9082, 0x0040, 0x00b8, 0x9186, 0x0046, 0x0150, 0x9186, + 0x0045, 0x0138, 0x9186, 0x0053, 0x0120, 0x9186, 0x0048, 0x190c, + 0x0dc5, 0x080c, 0xd587, 0x0130, 0x6000, 0x9086, 0x0002, 0x1110, + 0x0804, 0xc23e, 0x0005, 0x0002, 0xc1da, 0xc1d8, 0xc1d8, 0xc1d8, + 0xc1d8, 0xc1d8, 0xc1d8, 0xc1d8, 0xc1d8, 0xc1d8, 0xc1d8, 0xc1f5, + 0xc1f5, 0xc1f5, 0xc1f5, 0xc1d8, 0xc1f5, 0xc1d8, 0xc1f5, 0xc1d8, + 0x080c, 0x0dc5, 0x080c, 0x97e1, 0x0096, 0x6114, 0x2148, 0x080c, + 0xce56, 0x0168, 0xa867, 0x0103, 0xa87b, 0x0006, 0xa877, 0x0000, + 0xa880, 0xc0ec, 0xa882, 0x080c, 0x6dd1, 0x080c, 0xd041, 0x009e, + 0x080c, 0xb101, 0x080c, 0x98ed, 0x0005, 0x080c, 0x97e1, 0x080c, + 0xd05e, 0x090c, 0xbae2, 0x080c, 0xb101, 0x080c, 0x98ed, 0x0005, + 0x0002, 0xc217, 0xc215, 0xc215, 0xc215, 0xc215, 0xc215, 0xc215, + 0xc215, 0xc215, 0xc215, 0xc215, 0xc22e, 0xc22e, 0xc22e, 0xc22e, + 0xc215, 0xc238, 0xc215, 0xc22e, 0xc215, 0x080c, 0x0dc5, 0x0096, + 0x080c, 0x97e1, 0x6014, 0x2048, 0x2001, 0x1989, 0x2004, 0x6042, + 0xa97c, 0xd1ac, 0x0140, 0x6003, 0x0004, 0xa87c, 0x9085, 0x0400, + 0xa87e, 0x009e, 0x0005, 0x6003, 0x0002, 0x0cb8, 0x080c, 0x97e1, + 0x080c, 0xd579, 0x080c, 0xd57e, 0x6003, 0x000f, 0x0804, 0x98ed, + 0x080c, 0x97e1, 0x080c, 0xb101, 0x0804, 0x98ed, 0x9182, 0x0054, + 0x1220, 0x9182, 0x0040, 0x0208, 0x000a, 0x0005, 0xc25a, 0xc25a, + 0xc25a, 0xc25a, 0xc25a, 0xc25c, 0xc33c, 0xc25a, 0xc370, 0xc25a, + 0xc25a, 0xc25a, 0xc25a, 0xc25a, 0xc25a, 0xc25a, 0xc25a, 0xc25a, + 0xc25a, 0xc370, 0x080c, 0x0dc5, 0x00b6, 0x0096, 0x6114, 0x2148, + 0x7644, 0x96b4, 0x0fff, 0x86ff, 0x1528, 0x6010, 0x2058, 0xb800, + 0xd0bc, 0x1904, 0xc32b, 0xa87b, 0x0000, 0xa867, 0x0103, 0xae76, + 0xa87c, 0xd0ac, 0x0128, 0xa834, 0xa938, 0x9115, 0x190c, 0xc509, + 0x080c, 0x6beb, 0x6210, 0x2258, 0xba3c, 0x82ff, 0x0110, 0x8211, + 0xba3e, 0x7044, 0xd0e4, 0x1904, 0xc30c, 0x080c, 0xb101, 0x009e, + 0x00be, 0x0005, 0x968c, 0x0c00, 0x0150, 0x6010, 0x2058, 0xb800, + 0xd0bc, 0x1904, 0xc310, 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, 0xc263, 0x735c, 0xab86, + 0x83ff, 0x0170, 0x938a, 0x0009, 0x0210, 0x2019, 0x0008, 0x0036, + 0x2308, 0x2019, 0x0018, 0x2011, 0x0025, 0x080c, 0xca03, 0x003e, + 0xd6cc, 0x0904, 0xc278, 0x7154, 0xa98a, 0x81ff, 0x0904, 0xc278, + 0x9192, 0x0021, 0x1278, 0x8304, 0x9098, 0x0018, 0x2011, 0x0029, + 0x080c, 0xca03, 0x2011, 0x0205, 0x2013, 0x0000, 0x080c, 0xd504, + 0x0804, 0xc278, 0xa868, 0xd0fc, 0x0120, 0x2009, 0x0020, 0xa98a, + 0x0c50, 0x00a6, 0x2950, 0x080c, 0xc9a2, 0x00ae, 0x080c, 0xd504, + 0x080c, 0xc9f3, 0x0804, 0xc27a, 0x080c, 0xd156, 0x0804, 0xc287, + 0xa87c, 0xd0ac, 0x0904, 0xc293, 0xa880, 0xd0bc, 0x1904, 0xc293, + 0x9684, 0x0400, 0x0130, 0xa838, 0xab34, 0x9305, 0x0904, 0xc293, + 0x00b8, 0x7348, 0xa838, 0x9306, 0x1198, 0x734c, 0xa834, 0x931e, + 0x0904, 0xc293, 0x0068, 0xa87c, 0xd0ac, 0x0904, 0xc26b, 0xa838, + 0xa934, 0x9105, 0x0904, 0xc26b, 0xa880, 0xd0bc, 0x1904, 0xc26b, + 0x080c, 0xd190, 0x0804, 0xc287, 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, 0x1c09, 0x080c, 0x93a0, 0x080c, 0x9a0f, 0x009e, 0x0005, + 0x0005, 0x9182, 0x0054, 0x1220, 0x9182, 0x0040, 0x0208, 0x000a, + 0x0005, 0xc38d, 0xc38d, 0xc38d, 0xc38d, 0xc38d, 0xc38f, 0xc425, + 0xc38d, 0xc38d, 0xc43c, 0xc4cc, 0xc38d, 0xc38d, 0xc38d, 0xc38d, + 0xc4e1, 0xc38d, 0xc38d, 0xc38d, 0xc38d, 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, 0xc420, 0x9694, 0xff00, 0x9284, 0x0c00, 0x0120, 0x7048, + 0xb092, 0x704c, 0xb08e, 0x9284, 0x0300, 0x0904, 0xc420, 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, 0xca03, + 0x003e, 0xd6cc, 0x01e8, 0x7154, 0xa98a, 0x81ff, 0x01c8, 0x9192, + 0x0021, 0x1260, 0x8304, 0x9098, 0x0018, 0x2011, 0x0029, 0x080c, + 0xca03, 0x2011, 0x0205, 0x2013, 0x0000, 0x0050, 0xb068, 0xd0fc, + 0x0120, 0x2009, 0x0020, 0xa98a, 0x0c68, 0x2950, 0x080c, 0xc9a2, + 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, 0x1c09, 0x0804, 0xa4e4, 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, + 0x97e1, 0x080c, 0x98ed, 0x0096, 0x2001, 0x1989, 0x2004, 0x6042, + 0x080c, 0x989d, 0x080c, 0x9a0f, 0x6114, 0x2148, 0xa97c, 0xd1e4, + 0x0904, 0xc4c7, 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, 0xc9f3, 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, 0x6beb, 0x001e, 0xd1e4, 0x1120, 0x080c, 0xb101, 0x009e, + 0x0005, 0x080c, 0xd156, 0x0cd8, 0x6004, 0x9086, 0x0040, 0x1120, + 0x080c, 0x97e1, 0x080c, 0x98ed, 0x2019, 0x0001, 0x080c, 0xa877, + 0x6003, 0x0002, 0x080c, 0xd57e, 0x080c, 0x989d, 0x080c, 0x9a0f, + 0x0005, 0x6004, 0x9086, 0x0040, 0x1120, 0x080c, 0x97e1, 0x080c, + 0x98ed, 0x2019, 0x0001, 0x080c, 0xa877, 0x080c, 0x989d, 0x080c, + 0x3246, 0x080c, 0xd576, 0x0096, 0x6114, 0x2148, 0x080c, 0xce56, + 0x0150, 0xa867, 0x0103, 0xa87b, 0x0029, 0xa877, 0x0000, 0x080c, + 0x6dd1, 0x080c, 0xd041, 0x009e, 0x080c, 0xb101, 0x080c, 0x9a0f, + 0x0005, 0xa87b, 0x0015, 0xd1fc, 0x0180, 0xa87b, 0x0007, 0x8002, + 0x8000, 0x810a, 0x9189, 0x0000, 0x0006, 0x0016, 0x2009, 0x1a7e, + 0x2104, 0x8000, 0x200a, 0x001e, 0x000e, 0xa992, 0xa88e, 0x0005, + 0x9182, 0x0054, 0x1220, 0x9182, 0x0040, 0x0208, 0x000a, 0x0005, + 0xc53c, 0xc53c, 0xc53c, 0xc53c, 0xc53c, 0xc53e, 0xc53c, 0xc53c, + 0xc5e4, 0xc53c, 0xc53c, 0xc53c, 0xc53c, 0xc53c, 0xc53c, 0xc53c, + 0xc53c, 0xc53c, 0xc53c, 0xc716, 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, + 0xc5dd, 0x9694, 0xff00, 0x9284, 0x0c00, 0x0120, 0x7048, 0xb092, + 0x704c, 0xb08e, 0x9284, 0x0300, 0x0904, 0xc5dd, 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, 0xca03, 0x003e, 0xd6cc, 0x01e8, + 0x7154, 0xa98a, 0x81ff, 0x01c8, 0x9192, 0x0021, 0x1260, 0x8304, + 0x9098, 0x0018, 0x2011, 0x0029, 0x080c, 0xca03, 0x2011, 0x0205, + 0x2013, 0x0000, 0x0050, 0xb068, 0xd0fc, 0x0120, 0x2009, 0x0020, + 0xa98a, 0x0c68, 0x2950, 0x080c, 0xc9a2, 0x080c, 0x1a83, 0x009e, + 0x00ee, 0x00ae, 0x007e, 0x0005, 0x2001, 0x1989, 0x2004, 0x6042, + 0x0096, 0x6114, 0x2148, 0xa83c, 0xa940, 0x9105, 0x1118, 0xa87c, + 0xc0dc, 0xa87e, 0x6003, 0x0002, 0xa97c, 0xd1e4, 0x0904, 0xc711, + 0x6043, 0x0000, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, + 0x1500, 0xd1cc, 0x0904, 0xc6e0, 0xa978, 0xa868, 0xd0fc, 0x0904, + 0xc6a1, 0x0016, 0xa87c, 0x0006, 0xa880, 0x0006, 0x00a6, 0x2150, + 0xb174, 0x9184, 0x00ff, 0x90b6, 0x0002, 0x0904, 0xc66e, 0x9086, + 0x0028, 0x1904, 0xc65a, 0xa87b, 0x001c, 0xb07b, 0x001c, 0x0804, + 0xc676, 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, 0xd190, + 0x0804, 0xc711, 0xd1dc, 0x0158, 0xa87b, 0x0015, 0xb07b, 0x0015, + 0x080c, 0xd424, 0x0118, 0xb174, 0xc1dc, 0xb176, 0x0078, 0xd1d4, + 0x0128, 0xa87b, 0x0007, 0xb07b, 0x0007, 0x0040, 0xa87c, 0xd0ac, + 0x0128, 0xa834, 0xa938, 0x9115, 0x190c, 0xc509, 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, 0xd504, + 0x001e, 0xa874, 0x0006, 0x2148, 0x080c, 0x0fc0, 0x001e, 0x0804, + 0xc70d, 0x0016, 0x00a6, 0x2150, 0xb174, 0x9184, 0x00ff, 0x90b6, + 0x0002, 0x01e0, 0x9086, 0x0028, 0x1128, 0xa87b, 0x001c, 0xb07b, + 0x001c, 0x00e0, 0xd1dc, 0x0158, 0xa87b, 0x0015, 0xb07b, 0x0015, + 0x080c, 0xd424, 0x0118, 0xb174, 0xc1dc, 0xb176, 0x0078, 0xd1d4, + 0x0128, 0xa87b, 0x0007, 0xb07b, 0x0007, 0x0040, 0xa87c, 0xd0ac, + 0x0128, 0xa834, 0xa938, 0x9115, 0x190c, 0xc509, 0xa890, 0xb092, + 0xa88c, 0xb08e, 0xa87c, 0xb07e, 0x00ae, 0x080c, 0x0fc0, 0x009e, + 0x080c, 0xd504, 0xa974, 0x0016, 0x080c, 0xc9f3, 0x001e, 0x0468, + 0xa867, 0x0103, 0xa974, 0x9184, 0x00ff, 0x90b6, 0x0002, 0x01b0, + 0x9086, 0x0028, 0x1118, 0xa87b, 0x001c, 0x00d0, 0xd1dc, 0x0148, + 0xa87b, 0x0015, 0x080c, 0xd424, 0x0118, 0xa974, 0xc1dc, 0xa976, + 0x0078, 0xd1d4, 0x0118, 0xa87b, 0x0007, 0x0050, 0xa87b, 0x0000, + 0xa87c, 0xd0ac, 0x0128, 0xa834, 0xa938, 0x9115, 0x190c, 0xc509, + 0xa974, 0x0016, 0x080c, 0x6beb, 0x001e, 0xd1e4, 0x1120, 0x080c, + 0xb101, 0x009e, 0x0005, 0x080c, 0xd156, 0x0cd8, 0x6114, 0x0096, + 0x2148, 0xa97c, 0xd1e4, 0x190c, 0x1aa3, 0x009e, 0x0005, 0x080c, + 0x97e1, 0x0010, 0x080c, 0x989d, 0x080c, 0xce56, 0x01f0, 0x0096, + 0x6114, 0x2148, 0x080c, 0xd05e, 0x1118, 0x080c, 0xbae2, 0x00a0, + 0xa867, 0x0103, 0x2009, 0x180c, 0x210c, 0xd18c, 0x11b8, 0xd184, + 0x1190, 0x6108, 0xa97a, 0x918e, 0x0029, 0x1110, 0x080c, 0xed00, + 0xa877, 0x0000, 0x080c, 0x6dd1, 0x009e, 0x080c, 0xb101, 0x080c, + 0x98ed, 0x0804, 0x9a0f, 0xa87b, 0x0004, 0x0c90, 0xa87b, 0x0004, + 0x0c78, 0x9182, 0x0054, 0x1220, 0x9182, 0x0040, 0x0208, 0x000a, + 0x0005, 0xc76d, 0xc76d, 0xc76d, 0xc76d, 0xc76d, 0xc76f, 0xc76d, + 0xc76d, 0xc76d, 0xc76d, 0xc76d, 0xc76d, 0xc76d, 0xc76d, 0xc76d, + 0xc76d, 0xc76d, 0xc76d, 0xc76d, 0xc76d, 0x080c, 0x0dc5, 0x080c, + 0x57db, 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, 0x6dd1, + 0x009e, 0x0804, 0xb101, 0x9182, 0x0085, 0x0002, 0xc7a5, 0xc7a3, + 0xc7a3, 0xc7b1, 0xc7a3, 0xc7a3, 0xc7a3, 0xc7a3, 0xc7a3, 0xc7a3, + 0xc7a3, 0xc7a3, 0xc7a3, 0x080c, 0x0dc5, 0x6003, 0x0001, 0x6106, + 0x080c, 0x933b, 0x0126, 0x2091, 0x8000, 0x080c, 0x98ed, 0x012e, + 0x0005, 0x0026, 0x0056, 0x00d6, 0x00e6, 0x2071, 0x0260, 0x7224, + 0x6216, 0x7220, 0x080c, 0xce44, 0x01f8, 0x2268, 0x6800, 0x9086, + 0x0000, 0x01d0, 0x6010, 0x6d10, 0x952e, 0x11b0, 0x00c6, 0x2d60, + 0x00d6, 0x080c, 0xca64, 0x00de, 0x00ce, 0x0158, 0x702c, 0xd084, + 0x1118, 0x080c, 0xca2e, 0x0010, 0x6803, 0x0002, 0x6007, 0x0086, + 0x0028, 0x080c, 0xca50, 0x0d90, 0x6007, 0x0087, 0x6003, 0x0001, + 0x080c, 0x933b, 0x080c, 0x98ed, 0x7220, 0x080c, 0xce44, 0x0178, + 0x6810, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x0140, 0x6824, + 0xd0ec, 0x0128, 0x00c6, 0x2d60, 0x080c, 0xd190, 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, 0x97e1, 0x0096, 0x6014, 0x2048, 0x080c, + 0xce56, 0x0140, 0xa867, 0x0103, 0xa877, 0x0000, 0xa87b, 0x0029, + 0x080c, 0x6dd1, 0x009e, 0x080c, 0xb134, 0x0804, 0x98ed, 0xc834, + 0xc836, 0xc836, 0xc834, 0xc834, 0xc834, 0xc834, 0xc834, 0xc834, + 0xc834, 0xc834, 0xc834, 0xc834, 0x080c, 0x0dc5, 0x080c, 0x97e1, + 0x080c, 0xb134, 0x080c, 0x98ed, 0x0005, 0x9186, 0x0013, 0x1128, + 0x6004, 0x9082, 0x0085, 0x2008, 0x04b8, 0x9186, 0x0027, 0x11f8, + 0x080c, 0x97e1, 0x080c, 0x3246, 0x080c, 0xd576, 0x0096, 0x6014, + 0x2048, 0x080c, 0xce56, 0x0150, 0xa867, 0x0103, 0xa877, 0x0000, + 0xa87b, 0x0029, 0x080c, 0x6dd1, 0x080c, 0xd041, 0x009e, 0x080c, + 0xb101, 0x080c, 0x98ed, 0x0005, 0x080c, 0xb19b, 0x0ce0, 0x9186, + 0x0014, 0x1dd0, 0x080c, 0x97e1, 0x0096, 0x6014, 0x2048, 0x080c, + 0xce56, 0x0d60, 0xa867, 0x0103, 0xa877, 0x0000, 0xa87b, 0x0006, + 0xa880, 0xc0ec, 0xa882, 0x08f0, 0x0002, 0xc88c, 0xc88a, 0xc88a, + 0xc88a, 0xc88a, 0xc88a, 0xc8a4, 0xc88a, 0xc88a, 0xc88a, 0xc88a, + 0xc88a, 0xc88a, 0x080c, 0x0dc5, 0x080c, 0x97e1, 0x6034, 0x908c, + 0xff00, 0x810f, 0x9186, 0x0039, 0x0118, 0x9186, 0x0035, 0x1118, + 0x2001, 0x1987, 0x0010, 0x2001, 0x1988, 0x2004, 0x601a, 0x6003, + 0x000c, 0x080c, 0x98ed, 0x0005, 0x080c, 0x97e1, 0x6034, 0x908c, + 0xff00, 0x810f, 0x9186, 0x0039, 0x0118, 0x9186, 0x0035, 0x1118, + 0x2001, 0x1987, 0x0010, 0x2001, 0x1988, 0x2004, 0x601a, 0x6003, + 0x000e, 0x080c, 0x98ed, 0x0005, 0x9182, 0x0092, 0x1220, 0x9182, + 0x0085, 0x0208, 0x0012, 0x0804, 0xb19b, 0xc8d2, 0xc8d2, 0xc8d2, + 0xc8d2, 0xc8d4, 0xc921, 0xc8d2, 0xc8d2, 0xc8d2, 0xc8d2, 0xc8d2, + 0xc8d2, 0xc8d2, 0x080c, 0x0dc5, 0x0096, 0x6010, 0x00b6, 0x2058, + 0xb800, 0x00be, 0xd0bc, 0x0168, 0x6034, 0x908c, 0xff00, 0x810f, + 0x9186, 0x0039, 0x0118, 0x9186, 0x0035, 0x1118, 0x009e, 0x0804, + 0xc935, 0x080c, 0xce56, 0x1118, 0x080c, 0xd041, 0x0068, 0x6014, + 0x2048, 0xa87c, 0xd0e4, 0x1110, 0x080c, 0xd041, 0xa867, 0x0103, + 0x080c, 0xd541, 0x080c, 0x6dd1, 0x00d6, 0x2c68, 0x080c, 0xb0ab, + 0x01d0, 0x6003, 0x0001, 0x6007, 0x001e, 0x600b, 0xffff, 0x2009, + 0x026e, 0x210c, 0x613a, 0x2009, 0x026f, 0x210c, 0x613e, 0x6910, + 0x6112, 0x080c, 0xd2d2, 0x6954, 0x6156, 0x6023, 0x0001, 0x080c, + 0x933b, 0x080c, 0x98ed, 0x2d60, 0x00de, 0x080c, 0xb101, 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, + 0xd4d7, 0x11f0, 0x080c, 0xb0ab, 0x01d8, 0x6106, 0x6003, 0x0001, + 0x6023, 0x0001, 0x6910, 0x6112, 0x692c, 0x612e, 0x6930, 0x6132, + 0x6934, 0x918c, 0x00ff, 0x6136, 0x6938, 0x613a, 0x693c, 0x613e, + 0x6954, 0x6156, 0x080c, 0xd2d2, 0x080c, 0x933b, 0x080c, 0x98ed, + 0x2d60, 0x00de, 0x0804, 0xb101, 0x0096, 0x6014, 0x2048, 0x080c, + 0xce56, 0x01c8, 0xa867, 0x0103, 0xa880, 0xd0b4, 0x0128, 0xc0ec, + 0xa882, 0xa87b, 0x0006, 0x0048, 0xd0bc, 0x0118, 0xa87b, 0x0002, + 0x0020, 0xa87b, 0x0005, 0x080c, 0xd152, 0xa877, 0x0000, 0x080c, + 0x6dd1, 0x080c, 0xd041, 0x009e, 0x0804, 0xb101, 0x0016, 0x0096, + 0x6014, 0x2048, 0x080c, 0xce56, 0x0140, 0xa867, 0x0103, 0xa87b, + 0x0028, 0xa877, 0x0000, 0x080c, 0x6dd1, 0x009e, 0x001e, 0x9186, + 0x0013, 0x0148, 0x9186, 0x0014, 0x0130, 0x9186, 0x0027, 0x0118, + 0x080c, 0xb19b, 0x0030, 0x080c, 0x97e1, 0x080c, 0xb134, 0x080c, + 0x98ed, 0x0005, 0x0056, 0x0066, 0x0096, 0x00a6, 0x2029, 0x0001, + 0x9182, 0x0101, 0x1208, 0x0010, 0x2009, 0x0100, 0x2130, 0x8304, + 0x9098, 0x0018, 0x2009, 0x0020, 0x2011, 0x0029, 0x080c, 0xca03, + 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, 0x6dd1, 0x2a48, 0x0cb8, 0x080c, + 0x6dd1, 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, 0xce56, 0x0150, 0x2001, + 0x0006, 0xa980, 0xc1d5, 0x080c, 0x703d, 0x080c, 0x6dc4, 0x080c, + 0xd041, 0x009e, 0x080c, 0xb134, 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, 0xca9f, 0xca9f, + 0xca9a, 0xcac1, 0xca8d, 0xca9a, 0xcac1, 0xca9a, 0xca9a, 0x911f, + 0xca9a, 0xca9a, 0xca9a, 0xca8d, 0xca8d, 0x080c, 0x0dc5, 0x0036, + 0x2019, 0x0010, 0x080c, 0xe4c8, 0x6023, 0x0006, 0x6003, 0x0007, + 0x003e, 0x0005, 0x9006, 0x0005, 0x9085, 0x0001, 0x0005, 0x0096, + 0x86ff, 0x11d8, 0x6014, 0x2048, 0x080c, 0xce56, 0x01c0, 0xa864, + 0x9086, 0x0139, 0x1128, 0xa87b, 0x0005, 0xa883, 0x0000, 0x0028, + 0x900e, 0x2001, 0x0005, 0x080c, 0x703d, 0x080c, 0xd152, 0x080c, + 0x6dc4, 0x080c, 0xb134, 0x9085, 0x0001, 0x009e, 0x0005, 0x9006, + 0x0ce0, 0x6000, 0x908a, 0x0010, 0x1a0c, 0x0dc5, 0x0002, 0xcad7, + 0xcb07, 0xcad9, 0xcb28, 0xcb02, 0xcad7, 0xca9a, 0xca9f, 0xca9f, + 0xca9a, 0xca9a, 0xca9a, 0xca9a, 0xca9a, 0xca9a, 0xca9a, 0x080c, + 0x0dc5, 0x86ff, 0x1520, 0x6020, 0x9086, 0x0006, 0x0500, 0x0096, + 0x6014, 0x2048, 0x080c, 0xce56, 0x0168, 0xa87c, 0xd0cc, 0x0140, + 0x0096, 0xc0cc, 0xa87e, 0xa878, 0x2048, 0x080c, 0x0fc0, 0x009e, + 0x080c, 0xd152, 0x009e, 0x080c, 0xd51b, 0x6007, 0x0085, 0x6003, + 0x000b, 0x6023, 0x0002, 0x080c, 0x933b, 0x080c, 0x98ed, 0x9085, + 0x0001, 0x0005, 0x0066, 0x080c, 0x1ab7, 0x006e, 0x0890, 0x00e6, + 0x2071, 0x19e9, 0x7024, 0x9c06, 0x1120, 0x080c, 0xa801, 0x00ee, + 0x0840, 0x6020, 0x9084, 0x000f, 0x9086, 0x0006, 0x1150, 0x0086, + 0x0096, 0x2049, 0x0001, 0x2c40, 0x080c, 0xa929, 0x009e, 0x008e, + 0x0010, 0x080c, 0xa6fe, 0x00ee, 0x1904, 0xcad9, 0x0804, 0xca9a, + 0x0036, 0x00e6, 0x2071, 0x19e9, 0x703c, 0x9c06, 0x1138, 0x901e, + 0x080c, 0xa877, 0x00ee, 0x003e, 0x0804, 0xcad9, 0x080c, 0xaa59, + 0x00ee, 0x003e, 0x1904, 0xcad9, 0x0804, 0xca9a, 0x00c6, 0x6020, + 0x9084, 0x000f, 0x0013, 0x00ce, 0x0005, 0xcb5b, 0xcc25, 0xcd8f, + 0xcb65, 0xb134, 0xcb5b, 0xe4ba, 0xd583, 0xcc25, 0x90f1, 0xce1b, + 0xcb54, 0xcb54, 0xcb54, 0xcb54, 0x080c, 0x0dc5, 0x080c, 0xd05e, + 0x1110, 0x080c, 0xbae2, 0x0005, 0x080c, 0x97e1, 0x080c, 0x98ed, + 0x0804, 0xb101, 0x601b, 0x0001, 0x0005, 0x080c, 0xce56, 0x0130, + 0x6014, 0x0096, 0x2048, 0x2c00, 0xa896, 0x009e, 0x6000, 0x908a, + 0x0010, 0x1a0c, 0x0dc5, 0x0002, 0xcb84, 0xcb86, 0xcbaa, 0xcbbe, + 0xcbe4, 0xcb84, 0xcb5b, 0xcb5b, 0xcb5b, 0xcbbe, 0xcbbe, 0xcb84, + 0xcb84, 0xcb84, 0xcb84, 0xcbc8, 0x080c, 0x0dc5, 0x00e6, 0x6014, + 0x0096, 0x2048, 0xa880, 0xc0b5, 0xa882, 0x009e, 0x2071, 0x19e9, + 0x7024, 0x9c06, 0x01a0, 0x080c, 0xa6fe, 0x080c, 0xd51b, 0x6007, + 0x0085, 0x6003, 0x000b, 0x6023, 0x0002, 0x2001, 0x1988, 0x2004, + 0x601a, 0x080c, 0x933b, 0x080c, 0x98ed, 0x00ee, 0x0005, 0x601b, + 0x0001, 0x0cd8, 0x0096, 0x6014, 0x2048, 0xa880, 0xc0b5, 0xa882, + 0x009e, 0x080c, 0xd51b, 0x6007, 0x0085, 0x6003, 0x000b, 0x6023, + 0x0002, 0x080c, 0x933b, 0x080c, 0x98ed, 0x0005, 0x0096, 0x601b, + 0x0001, 0x6014, 0x2048, 0xa880, 0xc0b5, 0xa882, 0x009e, 0x0005, + 0x080c, 0x57db, 0x01b8, 0x6014, 0x0096, 0x904d, 0x0190, 0xa864, + 0xa867, 0x0103, 0xa87b, 0x0006, 0x9086, 0x0139, 0x1150, 0xa867, + 0x0139, 0xa87b, 0x0030, 0xa897, 0x4005, 0xa89b, 0x0004, 0x080c, + 0x6dd1, 0x009e, 0x0804, 0xb101, 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, 0x2397, 0x00ce, 0x6000, + 0x9086, 0x0004, 0x1120, 0x2009, 0x0048, 0x080c, 0xb180, 0x0005, + 0x009e, 0x080c, 0x1ab7, 0x0804, 0xcbaa, 0x6000, 0x908a, 0x0010, + 0x1a0c, 0x0dc5, 0x000b, 0x0005, 0xcc3c, 0xcb62, 0xcc3e, 0xcc3c, + 0xcc3e, 0xcc3e, 0xcb5c, 0xcc3c, 0xcb56, 0xcb56, 0xcc3c, 0xcc3c, + 0xcc3c, 0xcc3c, 0xcc3c, 0xcc3c, 0x080c, 0x0dc5, 0x6010, 0x00b6, + 0x2058, 0xb804, 0x9084, 0x00ff, 0x00be, 0x908a, 0x000c, 0x1a0c, + 0x0dc5, 0x00b6, 0x0013, 0x00be, 0x0005, 0xcc59, 0xcd26, 0xcc5b, + 0xcc9b, 0xcc5b, 0xcc9b, 0xcc5b, 0xcc69, 0xcc59, 0xcc9b, 0xcc59, + 0xcc8a, 0x080c, 0x0dc5, 0x6004, 0x908e, 0x0016, 0x05c0, 0x908e, + 0x0004, 0x05a8, 0x908e, 0x0002, 0x0590, 0x908e, 0x0052, 0x0904, + 0xcd22, 0x6004, 0x080c, 0xd05e, 0x0904, 0xcd3f, 0x908e, 0x0004, + 0x1110, 0x080c, 0x326f, 0x908e, 0x0021, 0x0904, 0xcd43, 0x908e, + 0x0022, 0x0904, 0xcd8a, 0x908e, 0x003d, 0x0904, 0xcd43, 0x908e, + 0x0039, 0x0904, 0xcd47, 0x908e, 0x0035, 0x0904, 0xcd47, 0x908e, + 0x001e, 0x0178, 0x908e, 0x0001, 0x1140, 0x6010, 0x2058, 0xb804, + 0x9084, 0x00ff, 0x9086, 0x0006, 0x0110, 0x080c, 0x3246, 0x080c, + 0xbae2, 0x0804, 0xb134, 0x00c6, 0x00d6, 0x6104, 0x9186, 0x0016, + 0x0904, 0xcd13, 0x9186, 0x0002, 0x1904, 0xcce8, 0x2001, 0x1837, + 0x2004, 0xd08c, 0x11c8, 0x080c, 0x7569, 0x11b0, 0x080c, 0xd561, + 0x0138, 0x080c, 0x758c, 0x1120, 0x080c, 0x7473, 0x0804, 0xcd73, + 0x2001, 0x197e, 0x2003, 0x0001, 0x2001, 0x1800, 0x2003, 0x0001, + 0x080c, 0x7495, 0x0804, 0xcd73, 0x6010, 0x2058, 0x2001, 0x1837, + 0x2004, 0xd0ac, 0x1904, 0xcd73, 0xb8a0, 0x9084, 0xff80, 0x1904, + 0xcd73, 0xb840, 0x9084, 0x00ff, 0x9005, 0x0190, 0x8001, 0xb842, + 0x6017, 0x0000, 0x6023, 0x0007, 0x601b, 0x0398, 0x6043, 0x0000, + 0x080c, 0xb0ab, 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, 0x60ba, 0x00ee, 0x080c, + 0xbae2, 0x0030, 0x080c, 0xbae2, 0x080c, 0x3246, 0x080c, 0xd576, + 0x00e6, 0x0126, 0x2091, 0x8000, 0x080c, 0x326f, 0x012e, 0x00ee, + 0x080c, 0xb134, 0x0005, 0x2001, 0x0002, 0x080c, 0x6663, 0x6003, + 0x0001, 0x6007, 0x0002, 0x080c, 0x9383, 0x080c, 0x98ed, 0x00de, + 0x00ce, 0x0c80, 0x080c, 0x326f, 0x0804, 0xcc97, 0x00c6, 0x00d6, + 0x6104, 0x9186, 0x0016, 0x0d38, 0x6010, 0x2058, 0xb840, 0x9084, + 0x00ff, 0x9005, 0x0904, 0xcce8, 0x8001, 0xb842, 0x6003, 0x0001, + 0x080c, 0x9383, 0x080c, 0x98ed, 0x00de, 0x00ce, 0x0898, 0x080c, + 0xbae2, 0x0804, 0xcc99, 0x080c, 0xbb1e, 0x0804, 0xcc99, 0x00d6, + 0x2c68, 0x6104, 0x080c, 0xd4d7, 0x00de, 0x0118, 0x080c, 0xb101, + 0x0408, 0x6004, 0x8007, 0x6134, 0x918c, 0x00ff, 0x9105, 0x6036, + 0x6007, 0x0085, 0x6003, 0x000b, 0x6023, 0x0002, 0x603c, 0x600a, + 0x2001, 0x1988, 0x2004, 0x601a, 0x602c, 0x2c08, 0x2060, 0x6024, + 0xd0b4, 0x0108, 0xc085, 0xc0b5, 0x6026, 0x2160, 0x080c, 0x933b, + 0x080c, 0x98ed, 0x0005, 0x00de, 0x00ce, 0x080c, 0xbae2, 0x080c, + 0x3246, 0x00e6, 0x0126, 0x2091, 0x8000, 0x080c, 0x326f, 0x6017, + 0x0000, 0x6023, 0x0007, 0x601b, 0x0398, 0x6043, 0x0000, 0x012e, + 0x00ee, 0x0005, 0x080c, 0xb536, 0x1904, 0xcd3f, 0x0005, 0x6000, + 0x908a, 0x0010, 0x1a0c, 0x0dc5, 0x0096, 0x00d6, 0x001b, 0x00de, + 0x009e, 0x0005, 0xcdaa, 0xcdaa, 0xcdaa, 0xcdaa, 0xcdaa, 0xcdaa, + 0xcdaa, 0xcdaa, 0xcdaa, 0xcb5b, 0xcdaa, 0xcb62, 0xcdac, 0xcb62, + 0xcdc6, 0xcdaa, 0x080c, 0x0dc5, 0x6004, 0x9086, 0x008b, 0x01b0, + 0x6034, 0x908c, 0xff00, 0x810f, 0x9186, 0x0035, 0x1130, 0x602c, + 0x9080, 0x0009, 0x200c, 0xc185, 0x2102, 0x6007, 0x008b, 0x6003, + 0x000d, 0x080c, 0x933b, 0x080c, 0x98ed, 0x0005, 0x080c, 0xd555, + 0x0118, 0x080c, 0xd568, 0x0010, 0x080c, 0xd576, 0x080c, 0xd041, + 0x080c, 0xce56, 0x0570, 0x080c, 0x3246, 0x080c, 0xce56, 0x0168, + 0x6014, 0x2048, 0xa867, 0x0103, 0xa87b, 0x0006, 0xa877, 0x0000, + 0xa880, 0xc0ed, 0xa882, 0x080c, 0x6dd1, 0x2c68, 0x080c, 0xb0ab, + 0x0150, 0x6810, 0x6012, 0x080c, 0xd2d2, 0x00c6, 0x2d60, 0x080c, + 0xb134, 0x00ce, 0x0008, 0x2d60, 0x6017, 0x0000, 0x6023, 0x0001, + 0x6007, 0x0001, 0x6003, 0x0001, 0x080c, 0x9383, 0x080c, 0x98ed, + 0x00c8, 0x080c, 0xd555, 0x0138, 0x6034, 0x9086, 0x4000, 0x1118, + 0x080c, 0x3246, 0x08d0, 0x6034, 0x908c, 0xff00, 0x810f, 0x9186, + 0x0039, 0x0118, 0x9186, 0x0035, 0x1118, 0x080c, 0x3246, 0x0868, + 0x080c, 0xb134, 0x0005, 0x6000, 0x908a, 0x0010, 0x1a0c, 0x0dc5, + 0x0002, 0xce31, 0xce31, 0xce35, 0xce33, 0xce3f, 0xce31, 0xce31, + 0xb134, 0xce31, 0xce31, 0xce31, 0xce31, 0xce31, 0xce31, 0xce31, + 0xce31, 0x080c, 0x0dc5, 0x080c, 0xaa59, 0x6114, 0x0096, 0x2148, + 0xa87b, 0x0006, 0x080c, 0x6dd1, 0x009e, 0x0804, 0xb101, 0x601c, + 0xd084, 0x190c, 0x1ab7, 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, 0xd561, 0x0180, 0x9286, 0x0001, 0x1168, 0x6004, 0x9086, + 0x0004, 0x1148, 0x080c, 0x3246, 0x080c, 0xd576, 0x00c6, 0x080c, + 0xb134, 0x00ce, 0x0060, 0x080c, 0xd24c, 0x0148, 0x080c, 0xd05e, + 0x1110, 0x080c, 0xbae2, 0x00c6, 0x080c, 0xb101, 0x00ce, 0x9ce0, + 0x0018, 0x7068, 0x9c02, 0x1208, 0x08a0, 0x012e, 0x000e, 0x003e, + 0x00ce, 0x00ee, 0x0005, 0x00e6, 0x00c6, 0x0016, 0x9188, 0x1000, + 0x210c, 0x81ff, 0x0128, 0x2061, 0x1ab8, 0x6112, 0x080c, 0x3246, + 0x9006, 0x0010, 0x9085, 0x0001, 0x001e, 0x00ce, 0x00ee, 0x0005, + 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, 0xb0ab, 0x01b0, 0x6656, + 0x2b00, 0x6012, 0x080c, 0x57db, 0x0118, 0x080c, 0xcf85, 0x0168, + 0x080c, 0xd2d2, 0x6023, 0x0003, 0x2009, 0x004b, 0x080c, 0xb180, + 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x00c6, + 0x0126, 0x2091, 0x8000, 0xbaa0, 0x080c, 0xb153, 0x0560, 0x6057, + 0x0000, 0x2b00, 0x6012, 0x080c, 0xd2d2, 0x6023, 0x0003, 0x0016, + 0x080c, 0x94e0, 0x0076, 0x903e, 0x080c, 0x93b3, 0x2c08, 0x080c, + 0xe690, 0x007e, 0x001e, 0xd184, 0x0128, 0x080c, 0xb101, 0x9085, + 0x0001, 0x0070, 0x080c, 0x57db, 0x0128, 0xd18c, 0x1170, 0x080c, + 0xcf85, 0x0148, 0x2009, 0x004c, 0x080c, 0xb180, 0x9085, 0x0001, + 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x2900, 0x6016, 0x0c90, + 0x2009, 0x004d, 0x0010, 0x2009, 0x004e, 0x00f6, 0x00c6, 0x0046, + 0x0016, 0x080c, 0xb0ab, 0x2c78, 0x05a0, 0x7e56, 0x2b00, 0x7812, + 0x7823, 0x0003, 0x0016, 0x2021, 0x0005, 0x080c, 0xcf97, 0x001e, + 0x9186, 0x004d, 0x0118, 0x9186, 0x004e, 0x0148, 0x2001, 0x1981, + 0x200c, 0xd1fc, 0x0168, 0x2f60, 0x080c, 0xb101, 0x00d0, 0x2001, + 0x1980, 0x200c, 0xd1fc, 0x0120, 0x2f60, 0x080c, 0xb101, 0x0088, + 0x2f60, 0x080c, 0x57db, 0x0138, 0xd18c, 0x1118, 0x04f1, 0x0148, + 0x0010, 0x2900, 0x7816, 0x001e, 0x0016, 0x080c, 0xb180, 0x9085, + 0x0001, 0x001e, 0x004e, 0x00ce, 0x00fe, 0x0005, 0x00f6, 0x00c6, + 0x0046, 0x080c, 0xb0ab, 0x2c78, 0x0508, 0x7e56, 0x2b00, 0x7812, + 0x7823, 0x0003, 0x0096, 0x2021, 0x0004, 0x0489, 0x009e, 0x2001, + 0x197f, 0x200c, 0xd1fc, 0x0120, 0x2f60, 0x080c, 0xb101, 0x0060, + 0x2f60, 0x080c, 0x57db, 0x0120, 0xd18c, 0x1160, 0x0071, 0x0130, + 0x2009, 0x0052, 0x080c, 0xb180, 0x9085, 0x0001, 0x004e, 0x00ce, + 0x00fe, 0x0005, 0x2900, 0x7816, 0x0c98, 0x00c6, 0x080c, 0x4b89, + 0x00ce, 0x1120, 0x080c, 0xb101, 0x9006, 0x0005, 0xa867, 0x0000, + 0xa86b, 0x8000, 0x2900, 0x6016, 0x9085, 0x0001, 0x0005, 0x0096, + 0x0076, 0x0126, 0x2091, 0x8000, 0x080c, 0x6851, 0x0158, 0x2001, + 0xcf9c, 0x0006, 0x900e, 0x2400, 0x080c, 0x703d, 0x080c, 0x6dd1, + 0x000e, 0x0807, 0x2418, 0x080c, 0x977b, 0xbaa0, 0x0086, 0x2041, + 0x0001, 0x2039, 0x0001, 0x2608, 0x080c, 0x94f8, 0x008e, 0x080c, + 0x93b3, 0x2f08, 0x2648, 0x080c, 0xe690, 0xb93c, 0x81ff, 0x090c, + 0x95cb, 0x080c, 0x98ed, 0x012e, 0x007e, 0x009e, 0x0005, 0x00c6, + 0x0126, 0x2091, 0x8000, 0x080c, 0xb0ab, 0x0190, 0x660a, 0x2b08, + 0x6112, 0x080c, 0xd2d2, 0x6023, 0x0001, 0x2900, 0x6016, 0x2009, + 0x001f, 0x080c, 0xb180, 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005, + 0x9006, 0x0cd8, 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, 0xb153, + 0x01b8, 0x660a, 0x2b08, 0x6112, 0x080c, 0xd2d2, 0x6023, 0x0008, + 0x2900, 0x6016, 0x00f6, 0x2c78, 0x080c, 0x1768, 0x00fe, 0x2009, + 0x0021, 0x080c, 0xb180, 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005, + 0x9006, 0x0cd8, 0x2009, 0x003d, 0x00c6, 0x0126, 0x0016, 0x2091, + 0x8000, 0x080c, 0xb0ab, 0x0198, 0x660a, 0x2b08, 0x6112, 0x080c, + 0xd2d2, 0x6023, 0x0001, 0x2900, 0x6016, 0x001e, 0x0016, 0x080c, + 0xb180, 0x9085, 0x0001, 0x001e, 0x012e, 0x00ce, 0x0005, 0x9006, + 0x0cd0, 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, 0xb153, 0x0188, + 0x2b08, 0x6112, 0x080c, 0xd2d2, 0x6023, 0x0001, 0x2900, 0x6016, + 0x2009, 0x0000, 0x080c, 0xb180, 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, + 0xce56, 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, 0xb153, 0x0198, 0x2b08, + 0x6112, 0x080c, 0xd2d2, 0x6023, 0x0001, 0x2900, 0x6016, 0x080c, + 0x3246, 0x2009, 0x0028, 0x080c, 0xb180, 0x9085, 0x0001, 0x012e, + 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x9186, 0x0015, 0x11a8, 0x2011, + 0x1824, 0x2204, 0x9086, 0x0074, 0x1178, 0x00b6, 0x080c, 0xbd38, + 0x00be, 0x080c, 0xbf5d, 0x6003, 0x0001, 0x6007, 0x0029, 0x080c, + 0x9383, 0x080c, 0x98ed, 0x0078, 0x6014, 0x0096, 0x2048, 0xa868, + 0x009e, 0xd0fc, 0x0148, 0x2001, 0x0001, 0x080c, 0xd498, 0x080c, + 0xbae2, 0x080c, 0xb101, 0x0005, 0x0096, 0x6014, 0x904d, 0x090c, + 0x0dc5, 0xa87b, 0x0030, 0xa883, 0x0000, 0xa897, 0x4005, 0xa89b, + 0x0004, 0xa867, 0x0139, 0x0126, 0x2091, 0x8000, 0x080c, 0x6dd1, + 0x012e, 0x009e, 0x080c, 0xb101, 0x0c30, 0x0096, 0x9186, 0x0016, + 0x1128, 0x2001, 0x0004, 0x080c, 0x6663, 0x00e8, 0x9186, 0x0015, + 0x1510, 0x2011, 0x1824, 0x2204, 0x9086, 0x0014, 0x11e0, 0x6010, + 0x00b6, 0x2058, 0x080c, 0x67b8, 0x00be, 0x080c, 0xc033, 0x1198, + 0x6010, 0x00b6, 0x2058, 0xb890, 0x00be, 0x9005, 0x0160, 0x2001, + 0x0006, 0x080c, 0x6663, 0x6014, 0x2048, 0xa868, 0xd0fc, 0x0170, + 0x080c, 0xb50a, 0x0048, 0x6014, 0x2048, 0xa868, 0xd0fc, 0x0528, + 0x080c, 0xbae2, 0x080c, 0xb101, 0x009e, 0x0005, 0x6014, 0x6310, + 0x2358, 0x904d, 0x090c, 0x0dc5, 0xa87b, 0x0000, 0xa883, 0x0000, + 0xa897, 0x4000, 0x900e, 0x080c, 0x693d, 0x1108, 0xc185, 0xb800, + 0xd0bc, 0x0108, 0xc18d, 0xa99a, 0x0126, 0x2091, 0x8000, 0x080c, + 0x6dd1, 0x012e, 0x080c, 0xb101, 0x08f8, 0x6014, 0x904d, 0x090c, + 0x0dc5, 0xa87b, 0x0030, 0xa883, 0x0000, 0xa897, 0x4005, 0xa89b, + 0x0004, 0xa867, 0x0139, 0x0126, 0x2091, 0x8000, 0x080c, 0x6dd1, + 0x012e, 0x080c, 0xb101, 0x0840, 0xa878, 0x9086, 0x0005, 0x1108, + 0x0009, 0x0005, 0xa880, 0xc0ad, 0xa882, 0x0005, 0x6043, 0x0000, + 0x6017, 0x0000, 0x6003, 0x0001, 0x6007, 0x0050, 0x080c, 0x933b, + 0x080c, 0x98ed, 0x0005, 0x00c6, 0x6010, 0x00b6, 0x2058, 0xb800, + 0x00be, 0xd0bc, 0x0120, 0x6020, 0x9084, 0x000f, 0x0013, 0x00ce, + 0x0005, 0xcb5b, 0xd182, 0xd182, 0xd185, 0xe9f4, 0xea0f, 0xea12, + 0xcb5b, 0xcb5b, 0xcb5b, 0xcb5b, 0xcb5b, 0xcb5b, 0xcb5b, 0xcb5b, + 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, 0xb0ab, + 0x0508, 0x7810, 0x6012, 0x080c, 0xd2d2, 0x7820, 0x9086, 0x0003, + 0x0128, 0x7808, 0x603a, 0x2f00, 0x603e, 0x0020, 0x7808, 0x603e, + 0x2f00, 0x603a, 0x602e, 0x6023, 0x0001, 0x6007, 0x0035, 0x6003, + 0x0001, 0x7954, 0x6156, 0x080c, 0x933b, 0x080c, 0x98ed, 0x2f60, + 0x00fe, 0x0005, 0x2f60, 0x00fe, 0x2001, 0x1989, 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, 0x933b, + 0x080c, 0x98ed, 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, 0x1983, 0x200c, 0x8000, 0x2014, 0x2001, 0x0032, + 0x080c, 0x91b1, 0x2001, 0x1987, 0x82ff, 0x1110, 0x2011, 0x0014, + 0x2202, 0x2001, 0x1985, 0x200c, 0x8000, 0x2014, 0x2071, 0x196d, + 0x711a, 0x721e, 0x2001, 0x0064, 0x080c, 0x91b1, 0x2001, 0x1988, + 0x82ff, 0x1110, 0x2011, 0x0014, 0x2202, 0x2001, 0x1989, 0x9288, + 0x000a, 0x2102, 0x2001, 0x1a99, 0x2102, 0x2001, 0x0032, 0x080c, + 0x1611, 0x080c, 0x6a73, 0x00ee, 0x003e, 0x002e, 0x001e, 0x000e, + 0x0005, 0x0006, 0x0016, 0x00e6, 0x2001, 0x1987, 0x2003, 0x0028, + 0x2001, 0x1988, 0x2003, 0x0014, 0x2071, 0x196d, 0x701b, 0x0000, + 0x701f, 0x07d0, 0x2001, 0x1989, 0x2009, 0x001e, 0x2102, 0x2001, + 0x1a99, 0x2102, 0x2001, 0x0032, 0x080c, 0x1611, 0x00ee, 0x001e, + 0x000e, 0x0005, 0x0096, 0x6058, 0x904d, 0x0110, 0x080c, 0x1040, + 0x009e, 0x0005, 0x0005, 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, + 0xb0ab, 0x0180, 0x2b08, 0x6112, 0x0ca9, 0x6023, 0x0001, 0x2900, + 0x6016, 0x2009, 0x0033, 0x080c, 0xb180, 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, 0x9b88, 0x01d8, 0x707c, 0xaa50, 0x9206, + 0x1160, 0x7080, 0xaa54, 0x9206, 0x1140, 0x6210, 0x00b6, 0x2258, + 0xbaa0, 0x00be, 0x900e, 0x080c, 0x328f, 0x080c, 0xb50a, 0x0020, + 0x080c, 0xbae2, 0x080c, 0xb101, 0x00fe, 0x00ee, 0x009e, 0x0005, + 0x7060, 0xaa54, 0x9206, 0x0d48, 0x0c80, 0x00c6, 0x0126, 0x2091, + 0x8000, 0x080c, 0xb0ab, 0x0188, 0x2b08, 0x6112, 0x080c, 0xd2d2, + 0x6023, 0x0001, 0x2900, 0x6016, 0x2009, 0x004d, 0x080c, 0xb180, + 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x00c6, + 0x0126, 0x2091, 0x8000, 0x0016, 0x080c, 0xb0ab, 0x0180, 0x2b08, + 0x6112, 0x080c, 0xd2d2, 0x6023, 0x0001, 0x2900, 0x6016, 0x001e, + 0x080c, 0xb180, 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, 0x19a2, 0x2003, 0x0000, 0x6014, 0x2048, 0xa830, + 0x20a8, 0x8906, 0x8006, 0x8007, 0x9094, 0x003f, 0x22e8, 0x9084, + 0xffc0, 0x9080, 0x001b, 0x20a0, 0x2001, 0x19a2, 0x0016, 0x200c, + 0x080c, 0xdbac, 0x001e, 0xa804, 0x9005, 0x0110, 0x2048, 0x0c38, + 0x6014, 0x2048, 0xa867, 0x0103, 0x0010, 0x080c, 0xbae2, 0x080c, + 0xb101, 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, 0x9b88, 0x01a8, 0x707c, 0xaa74, 0x9206, + 0x1130, 0x7080, 0xaa78, 0x9206, 0x1110, 0x080c, 0x3246, 0x080c, + 0xb50a, 0x0020, 0x080c, 0xbae2, 0x080c, 0xb101, 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, 0x9b88, + 0x05f0, 0x707c, 0xaacc, 0x9206, 0x1180, 0x7080, 0xaad0, 0x9206, + 0x1160, 0x080c, 0x3246, 0x0016, 0xa998, 0xaab0, 0x9284, 0x1000, + 0xc0fd, 0x080c, 0x5782, 0x001e, 0x0010, 0x080c, 0x556d, 0x080c, + 0xce56, 0x0508, 0xa87b, 0x0000, 0xa883, 0x0000, 0xa897, 0x4000, + 0x0080, 0x080c, 0xce56, 0x01b8, 0x6014, 0x2048, 0x080c, 0x556d, + 0x1d70, 0xa87b, 0x0030, 0xa883, 0x0000, 0xa897, 0x4005, 0xa89b, + 0x0004, 0x0126, 0x2091, 0x8000, 0xa867, 0x0139, 0x080c, 0x6dd1, + 0x012e, 0x080c, 0xb101, 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, 0xce56, + 0x0904, 0xd494, 0x0096, 0x6314, 0x2348, 0xa87a, 0xa982, 0x929e, + 0x4000, 0x1580, 0x6310, 0x00c6, 0x2358, 0x2009, 0x0000, 0xa868, + 0xd0f4, 0x1140, 0x080c, 0x693d, 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, + 0x6dc4, 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, 0x2894, 0x2118, 0x831f, 0x939c, + 0xff00, 0x7838, 0x9084, 0x00ff, 0x931d, 0x7c3c, 0x2011, 0x8018, + 0x080c, 0x4be9, 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, 0xce44, 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, 0xc509, 0x0005, 0x0036, 0x2019, 0x0001, 0x0010, 0x0036, + 0x901e, 0x0499, 0x01e0, 0x080c, 0xce56, 0x01c8, 0x080c, 0xd041, + 0x6037, 0x4000, 0x6014, 0x6017, 0x0000, 0x0096, 0x2048, 0xa87c, + 0x080c, 0xd05e, 0x1118, 0x080c, 0xbae2, 0x0040, 0xa867, 0x0103, + 0xa877, 0x0000, 0x83ff, 0x1129, 0x080c, 0x6dd1, 0x009e, 0x003e, + 0x0005, 0xa880, 0xd0b4, 0x0128, 0xa87b, 0x0006, 0xc0ec, 0xa882, + 0x0048, 0xd0bc, 0x0118, 0xa87b, 0x0002, 0x0020, 0xa87b, 0x0005, + 0x080c, 0xd152, 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, 0x4da0, 0x004e, 0x003e, 0x0005, 0x0c51, 0x1d81, + 0x0005, 0x2001, 0x1987, 0x2004, 0x601a, 0x0005, 0x2001, 0x1989, + 0x2004, 0x6042, 0x0005, 0x080c, 0xb101, 0x0804, 0x98ed, 0x2001, + 0x0109, 0x2004, 0xd084, 0x01e0, 0x0126, 0x2091, 0x2800, 0x0006, + 0x0016, 0x0026, 0x0036, 0x00f6, 0x00e6, 0x00c6, 0x2079, 0x19e9, + 0x2071, 0x1800, 0x2061, 0x0100, 0x080c, 0x921e, 0x00ce, 0x00ee, + 0x00fe, 0x003e, 0x002e, 0x001e, 0x000e, 0x012e, 0x9085, 0x0001, + 0x0005, 0x00b6, 0x0066, 0x6000, 0x90b2, 0x0010, 0x1a0c, 0x0dc5, + 0x001b, 0x006e, 0x00be, 0x0005, 0xd5c4, 0xdd0b, 0xde80, 0xd5c4, + 0xd5c4, 0xd5c4, 0xd5c4, 0xd5c4, 0xd5fb, 0xdf04, 0xd5c4, 0xd5c4, + 0xd5c4, 0xd5c4, 0xd5c4, 0xd5c4, 0x080c, 0x0dc5, 0x0066, 0x6000, + 0x90b2, 0x0010, 0x1a0c, 0x0dc5, 0x0013, 0x006e, 0x0005, 0xd5df, + 0xe453, 0xd5df, 0xd5df, 0xd5df, 0xd5df, 0xd5df, 0xd5df, 0xe400, + 0xe4a7, 0xd5df, 0xeb2f, 0xeb65, 0xeb2f, 0xeb65, 0xd5df, 0x080c, + 0x0dc5, 0x6000, 0x9082, 0x0010, 0x1a0c, 0x0dc5, 0x6000, 0x000a, + 0x0005, 0xd5f9, 0xe0e2, 0xe1b1, 0xe1d4, 0xe294, 0xd5f9, 0xe373, + 0xe31c, 0xdf10, 0xe3d6, 0xe3eb, 0xd5f9, 0xd5f9, 0xd5f9, 0xd5f9, + 0xd5f9, 0x080c, 0x0dc5, 0x91b2, 0x0053, 0x1a0c, 0x0dc5, 0x2100, + 0x91b2, 0x0040, 0x1a04, 0xda7b, 0x0002, 0xd645, 0xd849, 0xd645, + 0xd645, 0xd645, 0xd852, 0xd645, 0xd645, 0xd645, 0xd645, 0xd645, + 0xd645, 0xd645, 0xd645, 0xd645, 0xd645, 0xd645, 0xd645, 0xd645, + 0xd645, 0xd645, 0xd645, 0xd645, 0xd647, 0xd6aa, 0xd6b9, 0xd71d, + 0xd748, 0xd7c1, 0xd834, 0xd645, 0xd645, 0xd855, 0xd645, 0xd645, + 0xd86a, 0xd877, 0xd645, 0xd645, 0xd645, 0xd645, 0xd645, 0xd91d, + 0xd645, 0xd645, 0xd931, 0xd645, 0xd645, 0xd8ec, 0xd645, 0xd645, + 0xd645, 0xd949, 0xd645, 0xd645, 0xd645, 0xd9c6, 0xd645, 0xd645, + 0xd645, 0xd645, 0xd645, 0xd645, 0xda43, 0x080c, 0x0dc5, 0x080c, + 0x6a50, 0x1150, 0x2001, 0x1837, 0x2004, 0xd0cc, 0x1128, 0x9084, + 0x0009, 0x9086, 0x0008, 0x1140, 0x6007, 0x0009, 0x602f, 0x0009, + 0x6017, 0x0000, 0x0804, 0xd842, 0x080c, 0x69ec, 0x00e6, 0x00c6, + 0x0036, 0x0026, 0x0016, 0x6210, 0x2258, 0xbaa0, 0x0026, 0x2019, + 0x0029, 0x080c, 0x94e0, 0x0076, 0x903e, 0x080c, 0x93b3, 0x2c08, + 0x080c, 0xe690, 0x007e, 0x001e, 0x001e, 0x002e, 0x003e, 0x00ce, + 0x00ee, 0x6610, 0x2658, 0x080c, 0x672c, 0xbe04, 0x9684, 0x00ff, + 0x9082, 0x0006, 0x1268, 0x0016, 0x0026, 0x6210, 0x00b6, 0x2258, + 0xbaa0, 0x00be, 0x2c08, 0x080c, 0xed90, 0x002e, 0x001e, 0x1178, + 0x080c, 0xe5c2, 0x1904, 0xd715, 0x080c, 0xe55e, 0x1120, 0x6007, + 0x0008, 0x0804, 0xd842, 0x6007, 0x0009, 0x0804, 0xd842, 0x080c, + 0xe82d, 0x0128, 0x080c, 0xe5c2, 0x0d78, 0x0804, 0xd715, 0x6017, + 0x1900, 0x0c88, 0x080c, 0x336a, 0x1904, 0xda78, 0x6106, 0x080c, + 0xe502, 0x6007, 0x0006, 0x0804, 0xd842, 0x6007, 0x0007, 0x0804, + 0xd842, 0x080c, 0xeba1, 0x1904, 0xda78, 0x080c, 0x336a, 0x1904, + 0xda78, 0x00d6, 0x6610, 0x2658, 0xbe04, 0x9684, 0x00ff, 0x9082, + 0x0006, 0x1220, 0x2001, 0x0001, 0x080c, 0x664f, 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, 0xe626, 0x1190, 0x9686, 0x0006, + 0x1140, 0x0026, 0x6210, 0x2258, 0xbaa0, 0x900e, 0x080c, 0x328f, + 0x002e, 0x080c, 0x67b8, 0x6007, 0x000a, 0x00de, 0x0804, 0xd842, + 0x6007, 0x000b, 0x00de, 0x0804, 0xd842, 0x080c, 0x3246, 0x080c, + 0xd576, 0x6007, 0x0001, 0x0804, 0xd842, 0x080c, 0xeba1, 0x1904, + 0xda78, 0x080c, 0x336a, 0x1904, 0xda78, 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, 0x328f, 0x002e, + 0x6007, 0x000c, 0x2001, 0x0001, 0x080c, 0xed6f, 0x0804, 0xd842, + 0x080c, 0x6a50, 0x1140, 0x2001, 0x1837, 0x2004, 0x9084, 0x0009, + 0x9086, 0x0008, 0x1110, 0x0804, 0xd654, 0x080c, 0x69ec, 0x6610, + 0x2658, 0xbe04, 0x9684, 0x00ff, 0x9082, 0x0006, 0x06c8, 0x1138, + 0x0026, 0x2001, 0x0006, 0x080c, 0x668f, 0x002e, 0x0050, 0x96b4, + 0xff00, 0x8637, 0x9686, 0x0004, 0x0120, 0x9686, 0x0006, 0x1904, + 0xd715, 0x080c, 0xe633, 0x1120, 0x6007, 0x000e, 0x0804, 0xd842, + 0x0046, 0x6410, 0x2458, 0xbca0, 0x0046, 0x080c, 0x3246, 0x080c, + 0xd576, 0x004e, 0x0016, 0x9006, 0x2009, 0x1848, 0x210c, 0xd1a4, + 0x0148, 0x2009, 0x0029, 0x080c, 0xe9a5, 0x6010, 0x2058, 0xb800, + 0xc0e5, 0xb802, 0x001e, 0x004e, 0x6007, 0x0001, 0x0804, 0xd842, + 0x2001, 0x0001, 0x080c, 0x664f, 0x0156, 0x0016, 0x0026, 0x0036, + 0x20a9, 0x0004, 0x2019, 0x1805, 0x2011, 0x0270, 0x080c, 0xc0e3, + 0x003e, 0x002e, 0x001e, 0x015e, 0x9005, 0x0168, 0x96b4, 0xff00, + 0x8637, 0x9682, 0x0004, 0x0a04, 0xd715, 0x9682, 0x0007, 0x0a04, + 0xd771, 0x0804, 0xd715, 0x6017, 0x1900, 0x6007, 0x0009, 0x0804, + 0xd842, 0x080c, 0x6a50, 0x1140, 0x2001, 0x1837, 0x2004, 0x9084, + 0x0009, 0x9086, 0x0008, 0x1110, 0x0804, 0xd654, 0x080c, 0x69ec, + 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, 0xd715, + 0x080c, 0xe661, 0x1138, 0x080c, 0xe55e, 0x1120, 0x6007, 0x0010, + 0x0804, 0xd842, 0x0046, 0x6410, 0x2458, 0xbca0, 0x0046, 0x080c, + 0x3246, 0x080c, 0xd576, 0x004e, 0x0016, 0x9006, 0x2009, 0x1848, + 0x210c, 0xd1a4, 0x0148, 0x2009, 0x0029, 0x080c, 0xe9a5, 0x6010, + 0x2058, 0xb800, 0xc0e5, 0xb802, 0x001e, 0x004e, 0x6007, 0x0001, + 0x0448, 0x080c, 0xe82d, 0x0198, 0x0016, 0x968c, 0x00ff, 0x9186, + 0x0002, 0x0160, 0x9186, 0x0003, 0x0148, 0x001e, 0x96b4, 0xff00, + 0x8637, 0x9686, 0x0006, 0x0920, 0x0804, 0xd715, 0x001e, 0x6017, + 0x1900, 0x6007, 0x0009, 0x0070, 0x080c, 0x336a, 0x1904, 0xda78, + 0x080c, 0xeba1, 0x1904, 0xda78, 0x080c, 0xdc49, 0x1904, 0xd715, + 0x6007, 0x0012, 0x6003, 0x0001, 0x080c, 0x9383, 0x080c, 0x98ed, + 0x0005, 0x6007, 0x0001, 0x6003, 0x0001, 0x080c, 0x9383, 0x080c, + 0x98ed, 0x0cb0, 0x6007, 0x0005, 0x0c68, 0x080c, 0xeba1, 0x1904, + 0xda78, 0x080c, 0x336a, 0x1904, 0xda78, 0x080c, 0xdc49, 0x1904, + 0xd715, 0x6007, 0x0020, 0x6003, 0x0001, 0x080c, 0x9383, 0x080c, + 0x98ed, 0x0005, 0x080c, 0x336a, 0x1904, 0xda78, 0x6007, 0x0023, + 0x6003, 0x0001, 0x080c, 0x9383, 0x080c, 0x98ed, 0x0005, 0x080c, + 0xeba1, 0x1904, 0xda78, 0x080c, 0x336a, 0x1904, 0xda78, 0x080c, + 0xdc49, 0x1904, 0xd715, 0x0016, 0x0026, 0x00e6, 0x2071, 0x0260, + 0x2c08, 0x2011, 0x1820, 0x2214, 0x703c, 0x9206, 0x11e0, 0x2011, + 0x181f, 0x2214, 0x7038, 0x9084, 0x00ff, 0x9206, 0x11a0, 0x7240, + 0x080c, 0xce44, 0x0570, 0x2260, 0x6008, 0x9086, 0xffff, 0x0120, + 0x7244, 0x6008, 0x9206, 0x1528, 0x6020, 0x9086, 0x0007, 0x1508, + 0x080c, 0xb101, 0x04a0, 0x7244, 0x9286, 0xffff, 0x0180, 0x2c08, + 0x080c, 0xce44, 0x01b0, 0x2260, 0x7240, 0x6008, 0x9206, 0x1188, + 0x6010, 0x9190, 0x0004, 0x2214, 0x9206, 0x01b8, 0x0050, 0x7240, + 0x2c08, 0x9006, 0x080c, 0xe96f, 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, 0xb101, 0x2160, + 0x6007, 0x0025, 0x6003, 0x0001, 0x080c, 0x9383, 0x080c, 0x98ed, + 0x00ee, 0x002e, 0x001e, 0x0005, 0x2001, 0x0001, 0x080c, 0x664f, + 0x0156, 0x0016, 0x0026, 0x0036, 0x20a9, 0x0004, 0x2019, 0x1805, + 0x2011, 0x0276, 0x080c, 0xc0e3, 0x003e, 0x002e, 0x001e, 0x015e, + 0x0120, 0x6007, 0x0031, 0x0804, 0xd842, 0x080c, 0xbd50, 0x080c, + 0x7569, 0x1190, 0x0006, 0x0026, 0x0036, 0x080c, 0x7583, 0x1138, + 0x080c, 0x784e, 0x080c, 0x6127, 0x080c, 0x7495, 0x0010, 0x080c, + 0x7541, 0x003e, 0x002e, 0x000e, 0x0005, 0x080c, 0x336a, 0x1904, + 0xda78, 0x080c, 0xdc49, 0x1904, 0xd715, 0x6106, 0x080c, 0xdc65, + 0x1120, 0x6007, 0x002b, 0x0804, 0xd842, 0x6007, 0x002c, 0x0804, + 0xd842, 0x080c, 0xeba1, 0x1904, 0xda78, 0x080c, 0x336a, 0x1904, + 0xda78, 0x080c, 0xdc49, 0x1904, 0xd715, 0x6106, 0x080c, 0xdc6a, + 0x1120, 0x6007, 0x002e, 0x0804, 0xd842, 0x6007, 0x002f, 0x0804, + 0xd842, 0x080c, 0x336a, 0x1904, 0xda78, 0x00e6, 0x00d6, 0x00c6, + 0x6010, 0x2058, 0xb904, 0x9184, 0x00ff, 0x9086, 0x0006, 0x0158, + 0x9184, 0xff00, 0x8007, 0x9086, 0x0006, 0x0128, 0x00ce, 0x00de, + 0x00ee, 0x0804, 0xd849, 0x080c, 0x57d7, 0xd0e4, 0x0904, 0xd9c3, + 0x2071, 0x026c, 0x7010, 0x603a, 0x7014, 0x603e, 0x7108, 0x720c, + 0x080c, 0x6a8e, 0x0140, 0x6010, 0x2058, 0xb810, 0x9106, 0x1118, + 0xb814, 0x9206, 0x0510, 0x080c, 0x6a8a, 0x15b8, 0x2069, 0x1800, + 0x6880, 0x9206, 0x1590, 0x687c, 0x9106, 0x1578, 0x7210, 0x080c, + 0xce44, 0x0590, 0x080c, 0xdb36, 0x0578, 0x080c, 0xea21, 0x0560, + 0x622e, 0x6007, 0x0036, 0x6003, 0x0001, 0x080c, 0x933b, 0x080c, + 0x98ed, 0x00ce, 0x00de, 0x00ee, 0x0005, 0x7214, 0x9286, 0xffff, + 0x0150, 0x080c, 0xce44, 0x01c0, 0x9280, 0x0002, 0x2004, 0x7110, + 0x9106, 0x1190, 0x08e0, 0x7210, 0x2c08, 0x9085, 0x0001, 0x080c, + 0xe96f, 0x2c10, 0x2160, 0x0140, 0x0890, 0x6007, 0x0037, 0x602f, + 0x0009, 0x6017, 0x1500, 0x08b8, 0x6007, 0x0037, 0x602f, 0x0003, + 0x6017, 0x1700, 0x0880, 0x6007, 0x0012, 0x0868, 0x080c, 0x336a, + 0x1904, 0xda78, 0x6010, 0x2058, 0xb804, 0x9084, 0xff00, 0x8007, + 0x9086, 0x0006, 0x1904, 0xd849, 0x00e6, 0x00d6, 0x00c6, 0x080c, + 0x57d7, 0xd0e4, 0x0904, 0xda3b, 0x2069, 0x1800, 0x2071, 0x026c, + 0x7008, 0x603a, 0x720c, 0x623e, 0x9286, 0xffff, 0x1150, 0x7208, + 0x00c6, 0x2c08, 0x9085, 0x0001, 0x080c, 0xe96f, 0x2c10, 0x00ce, + 0x05e8, 0x080c, 0xce44, 0x05d0, 0x7108, 0x9280, 0x0002, 0x2004, + 0x9106, 0x15a0, 0x00c6, 0x0026, 0x2260, 0x080c, 0xca64, 0x002e, + 0x00ce, 0x7118, 0x918c, 0xff00, 0x810f, 0x9186, 0x0001, 0x0178, + 0x9186, 0x0005, 0x0118, 0x9186, 0x0007, 0x1198, 0x9280, 0x0005, + 0x2004, 0x9005, 0x0170, 0x080c, 0xdb36, 0x0904, 0xd9bc, 0x0056, + 0x7510, 0x7614, 0x080c, 0xea3a, 0x005e, 0x00ce, 0x00de, 0x00ee, + 0x0005, 0x6007, 0x003b, 0x602f, 0x0009, 0x6017, 0x2a00, 0x6003, + 0x0001, 0x080c, 0x933b, 0x080c, 0x98ed, 0x0c78, 0x6007, 0x003b, + 0x602f, 0x0003, 0x6017, 0x0300, 0x6003, 0x0001, 0x080c, 0x933b, + 0x080c, 0x98ed, 0x0c10, 0x6007, 0x003b, 0x602f, 0x000b, 0x6017, + 0x0000, 0x0804, 0xd993, 0x00e6, 0x0026, 0x080c, 0x6a50, 0x0550, + 0x080c, 0x69ec, 0x080c, 0xec12, 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, 0x6a8e, 0x0120, 0x2011, + 0x1a02, 0x2013, 0x07d0, 0xd0ac, 0x1128, 0x080c, 0x3019, 0x0010, + 0x080c, 0xec46, 0x002e, 0x00ee, 0x080c, 0xb101, 0x0804, 0xd848, + 0x080c, 0xb101, 0x0005, 0x2600, 0x0002, 0xda8f, 0xdabd, 0xdace, + 0xda8f, 0xda8f, 0xda91, 0xdadf, 0xda8f, 0xda8f, 0xda8f, 0xdaab, + 0xda8f, 0xda8f, 0xda8f, 0xdaea, 0xdb00, 0xdb31, 0xda8f, 0x080c, + 0x0dc5, 0x080c, 0xeba1, 0x1d20, 0x080c, 0x336a, 0x1d08, 0x7038, + 0x6016, 0x6007, 0x0045, 0x6003, 0x0001, 0x080c, 0x9383, 0x0005, + 0x080c, 0x3246, 0x080c, 0xd576, 0x6007, 0x0001, 0x6003, 0x0001, + 0x080c, 0x9383, 0x0005, 0x080c, 0xeba1, 0x1950, 0x080c, 0x336a, + 0x1938, 0x080c, 0xdc49, 0x1d60, 0x703c, 0x6016, 0x6007, 0x004a, + 0x6003, 0x0001, 0x080c, 0x9383, 0x0005, 0x080c, 0x336a, 0x1904, + 0xda78, 0x2009, 0x0041, 0x080c, 0xec4f, 0x6007, 0x0047, 0x6003, + 0x0001, 0x080c, 0x9383, 0x080c, 0x98ed, 0x0005, 0x080c, 0x336a, + 0x1904, 0xda78, 0x2009, 0x0042, 0x080c, 0xec4f, 0x6007, 0x0047, + 0x6003, 0x0001, 0x080c, 0x9383, 0x080c, 0x98ed, 0x0005, 0x080c, + 0x336a, 0x1904, 0xda78, 0x2009, 0x0046, 0x080c, 0xec4f, 0x080c, + 0xb101, 0x0005, 0x2001, 0x1824, 0x2004, 0x9082, 0x00e1, 0x1268, + 0x080c, 0xdb53, 0x0904, 0xda78, 0x6007, 0x004e, 0x6003, 0x0001, + 0x080c, 0x9383, 0x080c, 0x98ed, 0x0005, 0x6007, 0x0012, 0x0cb0, + 0x6007, 0x004f, 0x6017, 0x0000, 0x7134, 0x918c, 0x00ff, 0x81ff, + 0x0508, 0x9186, 0x0001, 0x1160, 0x7140, 0x2001, 0x19bf, 0x2004, + 0x9106, 0x11b0, 0x7144, 0x2001, 0x19c0, 0x2004, 0x9106, 0x0190, + 0x9186, 0x0002, 0x1168, 0x2011, 0x0276, 0x20a9, 0x0004, 0x6010, + 0x0096, 0x2048, 0x2019, 0x000a, 0x080c, 0xc0f7, 0x009e, 0x0110, + 0x6017, 0x0001, 0x6003, 0x0001, 0x080c, 0x9383, 0x080c, 0x98ed, + 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, 0x19a2, 0x2003, 0x0000, 0x080c, 0x1027, 0x05a0, 0x2900, + 0x6016, 0x7090, 0x8004, 0xa816, 0x908a, 0x001e, 0x02d0, 0xa833, + 0x001e, 0x20a9, 0x001e, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x001b, + 0x20a0, 0x2001, 0x19a2, 0x0016, 0x200c, 0x0471, 0x001e, 0x81ff, + 0x01b8, 0x2940, 0x080c, 0x1027, 0x01b0, 0x2900, 0xa006, 0x2100, + 0x0c18, 0xa832, 0x20a8, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x001b, + 0x20a0, 0x2001, 0x19a2, 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, 0x240b, 0x2099, 0x026c, + 0x2001, 0x0014, 0x3518, 0x9312, 0x0108, 0x1218, 0x23a8, 0x4003, + 0x0400, 0x20a8, 0x4003, 0x22a8, 0x8108, 0x080c, 0x240b, 0x2099, + 0x0260, 0x0ca8, 0x080c, 0x240b, 0x2061, 0x19a2, 0x6004, 0x2098, + 0x6008, 0x3518, 0x9312, 0x0108, 0x1218, 0x23a8, 0x4003, 0x0048, + 0x20a8, 0x4003, 0x22a8, 0x8108, 0x080c, 0x240b, 0x2099, 0x0260, + 0x0ca8, 0x2061, 0x19a2, 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, 0x2423, 0x20a1, 0x024c, 0x2001, 0x0014, 0x3518, + 0x9312, 0x1218, 0x23a8, 0x4003, 0x0418, 0x20a8, 0x4003, 0x82ff, + 0x01f8, 0x22a8, 0x8108, 0x080c, 0x2423, 0x20a1, 0x0240, 0x0c98, + 0x080c, 0x2423, 0x2061, 0x19a5, 0x6004, 0x20a0, 0x6008, 0x3518, + 0x9312, 0x1218, 0x23a8, 0x4003, 0x0058, 0x20a8, 0x4003, 0x82ff, + 0x0138, 0x22a8, 0x8108, 0x080c, 0x2423, 0x20a1, 0x0240, 0x0c98, + 0x2061, 0x19a5, 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, 0xdce1, + 0x00de, 0x0005, 0x00d6, 0x080c, 0xdcee, 0x1520, 0x680c, 0x908c, + 0xff00, 0x6820, 0x9084, 0x00ff, 0x9115, 0x6216, 0x6824, 0x602e, + 0xd1e4, 0x0130, 0x9006, 0x080c, 0xed6f, 0x2009, 0x0001, 0x0078, + 0xd1ec, 0x0180, 0x6920, 0x918c, 0x00ff, 0x6824, 0x080c, 0x2894, + 0x1148, 0x2001, 0x0001, 0x080c, 0xed6f, 0x2110, 0x900e, 0x080c, + 0x328f, 0x0018, 0x9085, 0x0001, 0x0008, 0x9006, 0x00de, 0x0005, + 0x00b6, 0x00c6, 0x080c, 0xb153, 0x05a8, 0x0016, 0x0026, 0x00c6, + 0x2011, 0x0263, 0x2204, 0x8211, 0x220c, 0x080c, 0x2894, 0x1578, + 0x080c, 0x66b2, 0x1560, 0xbe12, 0xbd16, 0x00ce, 0x002e, 0x001e, + 0x2b00, 0x6012, 0x080c, 0xeba1, 0x11d8, 0x080c, 0x336a, 0x11c0, + 0x080c, 0xdc49, 0x0510, 0x2001, 0x0007, 0x080c, 0x6663, 0x2001, + 0x0007, 0x080c, 0x668f, 0x6017, 0x0000, 0x6023, 0x0001, 0x6007, + 0x0001, 0x6003, 0x0001, 0x080c, 0x9383, 0x080c, 0x98ed, 0x0010, + 0x080c, 0xb101, 0x9085, 0x0001, 0x00ce, 0x00be, 0x0005, 0x080c, + 0xb101, 0x00ce, 0x002e, 0x001e, 0x0ca8, 0x080c, 0xb101, 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, 0xde50, + 0x040a, 0x91b6, 0x0027, 0x0198, 0x9186, 0x0015, 0x0118, 0x9186, + 0x0016, 0x1148, 0x080c, 0xd587, 0x0128, 0x6000, 0x9086, 0x0002, + 0x0904, 0xbb29, 0x0005, 0x91b6, 0x0014, 0x190c, 0x0dc5, 0x2001, + 0x0007, 0x080c, 0x668f, 0x080c, 0x97e1, 0x080c, 0xb134, 0x080c, + 0x98ed, 0x0005, 0xdd7a, 0xdd7c, 0xdd7a, 0xdd7a, 0xdd7a, 0xdd7c, + 0xdd8b, 0xde49, 0xddcf, 0xde49, 0xddf7, 0xde49, 0xdd8b, 0xde49, + 0xde41, 0xde49, 0xde41, 0xde49, 0xde49, 0xdd7a, 0xdd7a, 0xdd7a, + 0xdd7a, 0xdd7a, 0xdd7a, 0xdd7a, 0xdd7a, 0xdd7a, 0xdd7a, 0xdd7a, + 0xdd7c, 0xdd7a, 0xde49, 0xdd7a, 0xdd7a, 0xde49, 0xdd7a, 0xde46, + 0xde49, 0xdd7a, 0xdd7a, 0xdd7a, 0xdd7a, 0xde49, 0xde49, 0xdd7a, + 0xde49, 0xde49, 0xdd7a, 0xdd86, 0xdd7a, 0xdd7a, 0xdd7a, 0xdd7a, + 0xde45, 0xde49, 0xdd7a, 0xdd7a, 0xde49, 0xde49, 0xdd7a, 0xdd7a, + 0xdd7a, 0xdd7a, 0x080c, 0x0dc5, 0x080c, 0x97e1, 0x080c, 0xd579, + 0x6003, 0x0002, 0x080c, 0x98ed, 0x0804, 0xde4f, 0x9006, 0x080c, + 0x664f, 0x0804, 0xde49, 0x080c, 0x6a8a, 0x1904, 0xde49, 0x9006, + 0x080c, 0x664f, 0x6010, 0x2058, 0xb810, 0x9086, 0x00ff, 0x1140, + 0x00f6, 0x2079, 0x1800, 0x78a8, 0x8000, 0x78aa, 0x00fe, 0x00b8, + 0x6010, 0x2058, 0xb8c0, 0x9005, 0x0904, 0xde49, 0x080c, 0x339b, + 0x1904, 0xde49, 0x2001, 0x1800, 0x2004, 0x9086, 0x0002, 0x1138, + 0x00f6, 0x2079, 0x1800, 0x78a8, 0x8000, 0x78aa, 0x00fe, 0x2001, + 0x0002, 0x080c, 0x6663, 0x080c, 0x97e1, 0x6023, 0x0001, 0x6003, + 0x0001, 0x6007, 0x0002, 0x080c, 0x9383, 0x080c, 0x98ed, 0x6110, + 0x2158, 0x2009, 0x0001, 0x080c, 0x8717, 0x0804, 0xde4f, 0x6610, + 0x2658, 0xbe04, 0x96b4, 0xff00, 0x8637, 0x9686, 0x0006, 0x0148, + 0x9686, 0x0004, 0x0130, 0x080c, 0x8efa, 0x2001, 0x0004, 0x080c, + 0x668f, 0x080c, 0xedbe, 0x0904, 0xde49, 0x080c, 0x97e1, 0x2001, + 0x0004, 0x080c, 0x6663, 0x6023, 0x0001, 0x6003, 0x0001, 0x6007, + 0x0003, 0x080c, 0x9383, 0x080c, 0x98ed, 0x0804, 0xde4f, 0x2001, + 0x1800, 0x2004, 0x9086, 0x0003, 0x1158, 0x0036, 0x0046, 0x6010, + 0x2058, 0xbba0, 0x2021, 0x0006, 0x080c, 0x4da0, 0x004e, 0x003e, + 0x2001, 0x0006, 0x080c, 0xde6d, 0x6610, 0x2658, 0xbe04, 0x0066, + 0x96b4, 0xff00, 0x8637, 0x9686, 0x0006, 0x006e, 0x0180, 0x2001, + 0x0006, 0x080c, 0x668f, 0x9284, 0x00ff, 0x908e, 0x0007, 0x0118, + 0x908e, 0x0004, 0x1120, 0x2001, 0x0006, 0x080c, 0x6663, 0x080c, + 0x6a8a, 0x11f8, 0x2001, 0x1837, 0x2004, 0xd0a4, 0x01d0, 0xbe04, + 0x96b4, 0x00ff, 0x9686, 0x0006, 0x01a0, 0x00f6, 0x2079, 0x1800, + 0x78a8, 0x8000, 0x78aa, 0x00fe, 0x0804, 0xddb7, 0x2001, 0x0004, + 0x0030, 0x2001, 0x0006, 0x0449, 0x0020, 0x0018, 0x0010, 0x080c, + 0x668f, 0x080c, 0x97e1, 0x080c, 0xb101, 0x080c, 0x98ed, 0x0005, + 0x2600, 0x0002, 0xde64, 0xde64, 0xde64, 0xde64, 0xde64, 0xde66, + 0xde64, 0xde66, 0xde64, 0xde64, 0xde66, 0xde64, 0xde64, 0xde64, + 0xde66, 0xde66, 0xde66, 0xde66, 0x080c, 0x0dc5, 0x080c, 0x97e1, + 0x080c, 0xb101, 0x080c, 0x98ed, 0x0005, 0x0016, 0x00b6, 0x00d6, + 0x6110, 0x2158, 0xb900, 0xd184, 0x0138, 0x080c, 0x6663, 0x9006, + 0x080c, 0x664f, 0x080c, 0x326f, 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, 0xbbcb, 0xbbcb, 0xbbcb, + 0xbbcb, 0xdf02, 0xbbcb, 0xdeec, 0xdead, 0xbbcb, 0xbbcb, 0xbbcb, + 0xbbcb, 0xbbcb, 0xbbcb, 0xbbcb, 0xbbcb, 0xdf02, 0xbbcb, 0xdeec, + 0xdef3, 0xbbcb, 0xbbcb, 0xbbcb, 0xbbcb, 0x00f6, 0x080c, 0x6a8a, + 0x11d8, 0x080c, 0xd561, 0x11c0, 0x6010, 0x905d, 0x01a8, 0xb8c0, + 0x9005, 0x0190, 0x9006, 0x080c, 0x664f, 0x2001, 0x0002, 0x080c, + 0x6663, 0x6023, 0x0001, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, + 0x9383, 0x080c, 0x98ed, 0x00f0, 0x2011, 0x0263, 0x2204, 0x8211, + 0x220c, 0x080c, 0x2894, 0x11b0, 0x080c, 0x671d, 0x0118, 0x080c, + 0xb101, 0x0080, 0xb810, 0x0006, 0xb814, 0x0006, 0xb8c0, 0x0006, + 0x080c, 0x6141, 0x000e, 0xb8c2, 0x000e, 0xb816, 0x000e, 0xb812, + 0x080c, 0xb101, 0x00fe, 0x0005, 0x6604, 0x96b6, 0x001e, 0x1110, + 0x080c, 0xb101, 0x0005, 0x080c, 0xbf5a, 0x1148, 0x6003, 0x0001, + 0x6007, 0x0001, 0x080c, 0x9383, 0x080c, 0x98ed, 0x0010, 0x080c, + 0xb101, 0x0005, 0x0804, 0xb101, 0x6004, 0x908a, 0x0053, 0x1a0c, + 0x0dc5, 0x080c, 0x97e1, 0x080c, 0xb134, 0x080c, 0x98ed, 0x0005, + 0x9182, 0x0040, 0x0002, 0xdf27, 0xdf27, 0xdf27, 0xdf27, 0xdf29, + 0xdf27, 0xdf27, 0xdf27, 0xdf27, 0xdf27, 0xdf27, 0xdf27, 0xdf27, + 0xdf27, 0xdf27, 0xdf27, 0xdf27, 0xdf27, 0xdf27, 0xdf27, 0x080c, + 0x0dc5, 0x0096, 0x00b6, 0x00d6, 0x00e6, 0x00f6, 0x0046, 0x0026, + 0x6210, 0x2258, 0xb8bc, 0x9005, 0x11a8, 0x6106, 0x2071, 0x0260, + 0x7444, 0x94a4, 0xff00, 0x0904, 0xdf8f, 0x080c, 0xed63, 0x1170, + 0x9486, 0x2000, 0x1158, 0x2009, 0x0001, 0x2011, 0x0200, 0x080c, + 0x891c, 0x0020, 0x9026, 0x080c, 0xebe6, 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, 0x6dd1, 0x001e, 0x080c, 0xed63, + 0x1904, 0xdfef, 0x9486, 0x2000, 0x1130, 0x2019, 0x0017, 0x080c, + 0xe915, 0x0804, 0xdfef, 0x9486, 0x0200, 0x1120, 0x080c, 0xe8ac, + 0x0804, 0xdfef, 0x9486, 0x0400, 0x0120, 0x9486, 0x1000, 0x1904, + 0xdfef, 0x2019, 0x0002, 0x080c, 0xe8c7, 0x0804, 0xdfef, 0x2069, + 0x1a75, 0x6a00, 0xd284, 0x0904, 0xe059, 0x9284, 0x0300, 0x1904, + 0xe052, 0x6804, 0x9005, 0x0904, 0xe03a, 0x2d78, 0x6003, 0x0007, + 0x080c, 0x1027, 0x0904, 0xdffb, 0x7800, 0xd08c, 0x1118, 0x7804, + 0x8001, 0x7806, 0x6017, 0x0000, 0x2001, 0x180f, 0x2004, 0xd084, + 0x1904, 0xe05d, 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, 0xdff7, + 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, 0x6dd1, 0x002e, + 0x004e, 0x00fe, 0x00ee, 0x00de, 0x00be, 0x009e, 0x0005, 0x0000, + 0x0080, 0x0040, 0x0000, 0x2001, 0x1810, 0x2004, 0xd084, 0x0120, + 0x080c, 0x100e, 0x1904, 0xdfa4, 0x6017, 0xf100, 0x6003, 0x0001, + 0x6007, 0x0041, 0x080c, 0x933b, 0x080c, 0x98ed, 0x0c00, 0x2069, + 0x0260, 0x6848, 0x9084, 0xff00, 0x9086, 0x1200, 0x1198, 0x686c, + 0x9084, 0x00ff, 0x0016, 0x6114, 0x918c, 0xf700, 0x910d, 0x6116, + 0x001e, 0x6003, 0x0001, 0x6007, 0x0043, 0x080c, 0x933b, 0x080c, + 0x98ed, 0x0828, 0x6868, 0x602e, 0x686c, 0x6032, 0x6017, 0xf200, + 0x6003, 0x0001, 0x6007, 0x0041, 0x080c, 0x933b, 0x080c, 0x98ed, + 0x0804, 0xdfef, 0x2001, 0x180e, 0x2004, 0xd0ec, 0x0120, 0x2011, + 0x8049, 0x080c, 0x4be9, 0x6017, 0xf300, 0x0010, 0x6017, 0xf100, + 0x6003, 0x0001, 0x6007, 0x0041, 0x080c, 0x933b, 0x080c, 0x98ed, + 0x0804, 0xdfef, 0x6017, 0xf500, 0x0c98, 0x6017, 0xf600, 0x0804, + 0xe00f, 0x6017, 0xf200, 0x0804, 0xe00f, 0xa867, 0x0146, 0xa86b, + 0x0000, 0x6008, 0xa886, 0x2c00, 0xa87a, 0x7044, 0x9084, 0x0003, + 0x9080, 0xdff7, 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, 0xe0d9, 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, 0xdffb, 0x2548, 0x8847, 0x9885, 0x0046, + 0xa866, 0x2009, 0x0205, 0x200b, 0x0000, 0x080c, 0xe948, 0x0804, + 0xdfef, 0x8010, 0x0004, 0x801a, 0x0006, 0x8018, 0x0008, 0x8016, + 0x000a, 0x8014, 0x9186, 0x0013, 0x1160, 0x6004, 0x908a, 0x0054, + 0x1a0c, 0x0dc5, 0x9082, 0x0040, 0x0a0c, 0x0dc5, 0x2008, 0x0804, + 0xe168, 0x9186, 0x0051, 0x0108, 0x0048, 0x080c, 0xd587, 0x0500, + 0x6000, 0x9086, 0x0002, 0x11e0, 0x0804, 0xe1b1, 0x9186, 0x0027, + 0x0190, 0x9186, 0x0048, 0x0128, 0x9186, 0x0014, 0x0160, 0x190c, + 0x0dc5, 0x080c, 0xd587, 0x0160, 0x6000, 0x9086, 0x0004, 0x190c, + 0x0dc5, 0x0804, 0xe294, 0x6004, 0x9082, 0x0040, 0x2008, 0x001a, + 0x080c, 0xb19b, 0x0005, 0xe12f, 0xe131, 0xe131, 0xe158, 0xe12f, + 0xe12f, 0xe12f, 0xe12f, 0xe12f, 0xe12f, 0xe12f, 0xe12f, 0xe12f, + 0xe12f, 0xe12f, 0xe12f, 0xe12f, 0xe12f, 0xe12f, 0xe12f, 0x080c, + 0x0dc5, 0x080c, 0x97e1, 0x080c, 0x98ed, 0x0036, 0x0096, 0x6014, + 0x904d, 0x01d8, 0x080c, 0xce56, 0x01c0, 0x6003, 0x0002, 0x6010, + 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x1178, 0x2019, 0x0004, + 0x080c, 0xe948, 0x6017, 0x0000, 0x6018, 0x9005, 0x1120, 0x2001, + 0x1988, 0x2004, 0x601a, 0x6003, 0x0007, 0x009e, 0x003e, 0x0005, + 0x0096, 0x080c, 0x97e1, 0x080c, 0x98ed, 0x080c, 0xce56, 0x0120, + 0x6014, 0x2048, 0x080c, 0x1040, 0x080c, 0xb134, 0x009e, 0x0005, + 0x0002, 0xe17d, 0xe194, 0xe17f, 0xe1ab, 0xe17d, 0xe17d, 0xe17d, + 0xe17d, 0xe17d, 0xe17d, 0xe17d, 0xe17d, 0xe17d, 0xe17d, 0xe17d, + 0xe17d, 0xe17d, 0xe17d, 0xe17d, 0xe17d, 0x080c, 0x0dc5, 0x0096, + 0x080c, 0x97e1, 0x6014, 0x2048, 0xa87c, 0xd0b4, 0x0138, 0x6003, + 0x0007, 0x2009, 0x0043, 0x080c, 0xb180, 0x0010, 0x6003, 0x0004, + 0x080c, 0x98ed, 0x009e, 0x0005, 0x080c, 0x97e1, 0x080c, 0xce56, + 0x0138, 0x6114, 0x0096, 0x2148, 0xa97c, 0x009e, 0xd1ec, 0x1138, + 0x080c, 0x88f1, 0x080c, 0xb101, 0x080c, 0x98ed, 0x0005, 0x080c, + 0xebaa, 0x0db0, 0x0cc8, 0x080c, 0x97e1, 0x2009, 0x0041, 0x0804, + 0xe31c, 0x9182, 0x0040, 0x0002, 0xe1c8, 0xe1ca, 0xe1c8, 0xe1c8, + 0xe1c8, 0xe1c8, 0xe1c8, 0xe1c8, 0xe1c8, 0xe1c8, 0xe1c8, 0xe1c8, + 0xe1c8, 0xe1c8, 0xe1c8, 0xe1c8, 0xe1c8, 0xe1cb, 0xe1c8, 0xe1c8, + 0x080c, 0x0dc5, 0x0005, 0x00d6, 0x080c, 0x88f1, 0x00de, 0x080c, + 0xec02, 0x080c, 0xb101, 0x0005, 0x9182, 0x0040, 0x0002, 0xe1eb, + 0xe1eb, 0xe1eb, 0xe1eb, 0xe1eb, 0xe1eb, 0xe1eb, 0xe1eb, 0xe1eb, + 0xe1ed, 0xe25c, 0xe1eb, 0xe1eb, 0xe1eb, 0xe1eb, 0xe25c, 0xe1eb, + 0xe1eb, 0xe1eb, 0xe1eb, 0x080c, 0x0dc5, 0x2001, 0x0105, 0x2004, + 0x9084, 0x1800, 0x01c8, 0x2001, 0x0132, 0x200c, 0x2001, 0x0131, + 0x2004, 0x9105, 0x1904, 0xe25c, 0x2009, 0x180c, 0x2104, 0xd0d4, + 0x0904, 0xe25c, 0xc0d4, 0x200a, 0x2009, 0x0105, 0x2104, 0x9084, + 0xe7fd, 0x9085, 0x0010, 0x200a, 0x2001, 0x1867, 0x2004, 0xd0e4, + 0x1528, 0x603b, 0x0000, 0x080c, 0x989d, 0x6014, 0x0096, 0x2048, + 0xa87c, 0xd0fc, 0x0188, 0x908c, 0x0003, 0x918e, 0x0002, 0x0508, + 0x2001, 0x180c, 0x2004, 0xd0d4, 0x11e0, 0x080c, 0x9a0f, 0x2009, + 0x0041, 0x009e, 0x0804, 0xe31c, 0x080c, 0x9a0f, 0x6003, 0x0007, + 0x601b, 0x0000, 0x080c, 0x88f1, 0x009e, 0x0005, 0x2001, 0x0100, + 0x2004, 0x9082, 0x0005, 0x0aa8, 0x2001, 0x011f, 0x2004, 0x603a, + 0x0890, 0x2001, 0x180c, 0x200c, 0xc1d4, 0x2102, 0xd1cc, 0x0110, + 0x080c, 0x2c94, 0x080c, 0x9a0f, 0x6014, 0x2048, 0xa97c, 0xd1ec, + 0x1130, 0x080c, 0x88f1, 0x080c, 0xb101, 0x009e, 0x0005, 0x080c, + 0xebaa, 0x0db8, 0x009e, 0x0005, 0x2001, 0x180c, 0x200c, 0xc1d4, + 0x2102, 0x0036, 0x080c, 0x989d, 0x080c, 0x9a0f, 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, 0xe948, 0x6018, 0x9005, 0x1128, + 0x2001, 0x1988, 0x2004, 0x8003, 0x601a, 0x6017, 0x0000, 0x6003, + 0x0007, 0x009e, 0x003e, 0x0005, 0x9182, 0x0040, 0x0002, 0xe2ab, + 0xe2ab, 0xe2ab, 0xe2ab, 0xe2ab, 0xe2ab, 0xe2ab, 0xe2ab, 0xe2ad, + 0xe2ab, 0xe2ab, 0xe2ab, 0xe2ab, 0xe2ab, 0xe2ab, 0xe2ab, 0xe2ab, + 0xe2ab, 0xe2ab, 0xe2f8, 0x080c, 0x0dc5, 0x6014, 0x0096, 0x2048, + 0xa834, 0xaa38, 0x6110, 0x00b6, 0x2158, 0xb900, 0x00be, 0xd1bc, + 0x1190, 0x920d, 0x1518, 0xa87c, 0xd0fc, 0x0128, 0x2009, 0x0041, + 0x009e, 0x0804, 0xe31c, 0x6003, 0x0007, 0x601b, 0x0000, 0x080c, + 0x88f1, 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, 0x88f3, 0x009e, 0x0005, 0x6003, 0x0002, 0x009e, 0x0005, + 0x6024, 0xd0f4, 0x0128, 0x080c, 0x1608, 0x1904, 0xe2ad, 0x0005, + 0x6014, 0x0096, 0x2048, 0xa834, 0xa938, 0x009e, 0x9105, 0x1120, + 0x080c, 0x1608, 0x1904, 0xe2ad, 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, 0xe340, 0xe34c, 0xe358, 0xe364, + 0xe340, 0xe340, 0xe340, 0xe340, 0xe347, 0xe342, 0xe342, 0xe340, + 0xe340, 0xe340, 0xe340, 0xe342, 0xe340, 0xe342, 0xe340, 0xe347, + 0x080c, 0x0dc5, 0x6024, 0xd0dc, 0x090c, 0x0dc5, 0x0005, 0x6014, + 0x9005, 0x190c, 0x0dc5, 0x0005, 0x6003, 0x0001, 0x6106, 0x080c, + 0x933b, 0x0126, 0x2091, 0x8000, 0x080c, 0x98ed, 0x012e, 0x0005, + 0x6003, 0x0001, 0x6106, 0x080c, 0x933b, 0x0126, 0x2091, 0x8000, + 0x080c, 0x98ed, 0x012e, 0x0005, 0x6003, 0x0003, 0x6106, 0x2c10, + 0x080c, 0x1c09, 0x0126, 0x2091, 0x8000, 0x080c, 0x93a0, 0x080c, + 0x9a0f, 0x012e, 0x0005, 0x0126, 0x2091, 0x8000, 0x0036, 0x0096, + 0x9182, 0x0040, 0x0023, 0x009e, 0x003e, 0x012e, 0x0005, 0xe393, + 0xe395, 0xe3a7, 0xe3c1, 0xe393, 0xe393, 0xe393, 0xe393, 0xe393, + 0xe393, 0xe393, 0xe393, 0xe393, 0xe393, 0xe393, 0xe393, 0xe393, + 0xe393, 0xe393, 0xe393, 0x080c, 0x0dc5, 0x6014, 0x2048, 0xa87c, + 0xd0fc, 0x01f8, 0x909c, 0x0003, 0x939e, 0x0003, 0x01d0, 0x6003, + 0x0001, 0x6106, 0x080c, 0x933b, 0x080c, 0x98ed, 0x0470, 0x6014, + 0x2048, 0xa87c, 0xd0fc, 0x0168, 0x909c, 0x0003, 0x939e, 0x0003, + 0x0140, 0x6003, 0x0001, 0x6106, 0x080c, 0x933b, 0x080c, 0x98ed, + 0x00e0, 0x901e, 0x6316, 0x631a, 0x2019, 0x0004, 0x080c, 0xe948, + 0x00a0, 0x6014, 0x2048, 0xa87c, 0xd0fc, 0x0d98, 0x909c, 0x0003, + 0x939e, 0x0003, 0x0d70, 0x6003, 0x0003, 0x6106, 0x2c10, 0x080c, + 0x1c09, 0x080c, 0x93a0, 0x080c, 0x9a0f, 0x0005, 0x080c, 0x97e1, + 0x6114, 0x81ff, 0x0158, 0x0096, 0x2148, 0x080c, 0xed00, 0x0036, + 0x2019, 0x0029, 0x080c, 0xe948, 0x003e, 0x009e, 0x080c, 0xb134, + 0x080c, 0x98ed, 0x0005, 0x080c, 0x989d, 0x6114, 0x81ff, 0x0158, + 0x0096, 0x2148, 0x080c, 0xed00, 0x0036, 0x2019, 0x0029, 0x080c, + 0xe948, 0x003e, 0x009e, 0x080c, 0xb134, 0x080c, 0x9a0f, 0x0005, + 0x9182, 0x0085, 0x0002, 0xe412, 0xe410, 0xe410, 0xe41e, 0xe410, + 0xe410, 0xe410, 0xe410, 0xe410, 0xe410, 0xe410, 0xe410, 0xe410, + 0x080c, 0x0dc5, 0x6003, 0x000b, 0x6106, 0x080c, 0x933b, 0x0126, + 0x2091, 0x8000, 0x080c, 0x98ed, 0x012e, 0x0005, 0x0026, 0x00e6, + 0x080c, 0xeba1, 0x0118, 0x080c, 0xb101, 0x0450, 0x2071, 0x0260, + 0x7224, 0x6216, 0x2001, 0x180e, 0x2004, 0xd0e4, 0x0150, 0x6010, + 0x00b6, 0x2058, 0xbca0, 0x00be, 0x2c00, 0x2011, 0x014e, 0x080c, + 0xb423, 0x7220, 0x080c, 0xe79d, 0x0118, 0x6007, 0x0086, 0x0040, + 0x6007, 0x0087, 0x7224, 0x9296, 0xffff, 0x1110, 0x6007, 0x0086, + 0x6003, 0x0001, 0x080c, 0x933b, 0x080c, 0x98ed, 0x080c, 0x9a0f, + 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, 0xb19b, 0x0050, 0x2001, 0x0007, 0x080c, 0x668f, 0x080c, + 0x97e1, 0x080c, 0xb134, 0x080c, 0x98ed, 0x0005, 0xe483, 0xe485, + 0xe485, 0xe483, 0xe483, 0xe483, 0xe483, 0xe483, 0xe483, 0xe483, + 0xe483, 0xe483, 0xe483, 0x080c, 0x0dc5, 0x080c, 0x97e1, 0x080c, + 0xb134, 0x080c, 0x98ed, 0x0005, 0x9182, 0x0085, 0x0a0c, 0x0dc5, + 0x9182, 0x0092, 0x1a0c, 0x0dc5, 0x9182, 0x0085, 0x0002, 0xe4a4, + 0xe4a4, 0xe4a4, 0xe4a6, 0xe4a4, 0xe4a4, 0xe4a4, 0xe4a4, 0xe4a4, + 0xe4a4, 0xe4a4, 0xe4a4, 0xe4a4, 0x080c, 0x0dc5, 0x0005, 0x9186, + 0x0013, 0x0148, 0x9186, 0x0014, 0x0130, 0x9186, 0x0027, 0x0118, + 0x080c, 0xb19b, 0x0030, 0x080c, 0x97e1, 0x080c, 0xb134, 0x080c, + 0x98ed, 0x0005, 0x0036, 0x080c, 0xec02, 0x6043, 0x0000, 0x2019, + 0x000b, 0x0031, 0x6023, 0x0006, 0x6003, 0x0007, 0x003e, 0x0005, + 0x0126, 0x0036, 0x2091, 0x8000, 0x0086, 0x2c40, 0x0096, 0x904e, + 0x080c, 0xa929, 0x009e, 0x008e, 0x1550, 0x0076, 0x2c38, 0x080c, + 0xa9d4, 0x007e, 0x1520, 0x6000, 0x9086, 0x0000, 0x0500, 0x6020, + 0x9086, 0x0007, 0x01e0, 0x0096, 0x601c, 0xd084, 0x0140, 0x080c, + 0xec02, 0x080c, 0xd579, 0x080c, 0x1ab7, 0x6023, 0x0007, 0x6014, + 0x2048, 0x080c, 0xce56, 0x0110, 0x080c, 0xe948, 0x009e, 0x6017, + 0x0000, 0x080c, 0xec02, 0x6023, 0x0007, 0x080c, 0xd579, 0x003e, + 0x012e, 0x0005, 0x00f6, 0x00c6, 0x00b6, 0x0036, 0x0156, 0x2079, + 0x0260, 0x7938, 0x783c, 0x080c, 0x2894, 0x1904, 0xe558, 0x0016, + 0x00c6, 0x080c, 0x671d, 0x1904, 0xe556, 0x001e, 0x00c6, 0x080c, + 0xd561, 0x1130, 0xb8c0, 0x9005, 0x0118, 0x080c, 0x339b, 0x0148, + 0x2b10, 0x2160, 0x6010, 0x0006, 0x6212, 0x080c, 0xd568, 0x000e, + 0x6012, 0x00ce, 0x002e, 0x0026, 0x0016, 0x2019, 0x0029, 0x080c, + 0xaa9a, 0x080c, 0x94e0, 0x0076, 0x903e, 0x080c, 0x93b3, 0x007e, + 0x001e, 0x0076, 0x903e, 0x080c, 0xe690, 0x007e, 0x0026, 0xba04, + 0x9294, 0xff00, 0x8217, 0x9286, 0x0006, 0x0118, 0x9286, 0x0004, + 0x1118, 0xbaa0, 0x080c, 0x3304, 0x002e, 0xbcc0, 0x001e, 0x080c, + 0x6141, 0xbe12, 0xbd16, 0xbcc2, 0x9006, 0x0010, 0x00ce, 0x001e, + 0x015e, 0x003e, 0x00be, 0x00ce, 0x00fe, 0x0005, 0x00c6, 0x00d6, + 0x00b6, 0x0016, 0x2009, 0x1824, 0x2104, 0x9086, 0x0074, 0x1904, + 0xe5b7, 0x2069, 0x0260, 0x6944, 0x9182, 0x0100, 0x06e0, 0x6940, + 0x9184, 0x8000, 0x0904, 0xe5b4, 0x2001, 0x197d, 0x2004, 0x9005, + 0x1140, 0x6010, 0x2058, 0xb8c0, 0x9005, 0x0118, 0x9184, 0x0800, + 0x0598, 0x6948, 0x918a, 0x0001, 0x0648, 0x080c, 0xed68, 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, 0x672c, 0x0804, 0xe61f, 0x2011, + 0x0276, 0x20a9, 0x0004, 0x0096, 0x2b48, 0x2019, 0x000a, 0x080c, + 0xc0f7, 0x009e, 0x15a8, 0x2011, 0x027a, 0x20a9, 0x0004, 0x0096, + 0x2b48, 0x2019, 0x0006, 0x080c, 0xc0f7, 0x009e, 0x1548, 0x0046, + 0x0016, 0xbaa0, 0x2220, 0x9006, 0x2009, 0x1848, 0x210c, 0xd1a4, + 0x0138, 0x2009, 0x0029, 0x080c, 0xe9a5, 0xb800, 0xc0e5, 0xb802, + 0x2019, 0x0029, 0x080c, 0x94e0, 0x0076, 0x2039, 0x0000, 0x080c, + 0x93b3, 0x2c08, 0x080c, 0xe690, 0x007e, 0x2001, 0x0007, 0x080c, + 0x668f, 0x2001, 0x0007, 0x080c, 0x6663, 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, 0x2894, 0x11d0, + 0x080c, 0x671d, 0x11b8, 0x2011, 0x0270, 0x20a9, 0x0004, 0x0096, + 0x2b48, 0x2019, 0x000a, 0x080c, 0xc0f7, 0x009e, 0x1158, 0x2011, + 0x0274, 0x20a9, 0x0004, 0x0096, 0x2b48, 0x2019, 0x0006, 0x080c, + 0xc0f7, 0x009e, 0x015e, 0x003e, 0x002e, 0x001e, 0x00fe, 0x00be, + 0x0005, 0x00b6, 0x0006, 0x0016, 0x0026, 0x0036, 0x0156, 0x2011, + 0x0263, 0x2204, 0x8211, 0x220c, 0x080c, 0x2894, 0x11d0, 0x080c, + 0x671d, 0x11b8, 0x2011, 0x0276, 0x20a9, 0x0004, 0x0096, 0x2b48, + 0x2019, 0x000a, 0x080c, 0xc0f7, 0x009e, 0x1158, 0x2011, 0x027a, + 0x20a9, 0x0004, 0x0096, 0x2b48, 0x2019, 0x0006, 0x080c, 0xc0f7, + 0x009e, 0x015e, 0x003e, 0x002e, 0x001e, 0x000e, 0x00be, 0x0005, + 0x00e6, 0x00c6, 0x0086, 0x0076, 0x0066, 0x0056, 0x0046, 0x0026, + 0x0126, 0x2091, 0x8000, 0x2740, 0x2029, 0x19f2, 0x252c, 0x2021, + 0x19f8, 0x2424, 0x2061, 0x1cd0, 0x2071, 0x1800, 0x7654, 0x7074, + 0x81ff, 0x0150, 0x0006, 0x9186, 0x1ab8, 0x000e, 0x0128, 0x8001, + 0x9602, 0x1a04, 0xe72e, 0x0018, 0x9606, 0x0904, 0xe72e, 0x080c, + 0x8bc3, 0x0904, 0xe725, 0x2100, 0x9c06, 0x0904, 0xe725, 0x6720, + 0x9786, 0x0007, 0x0904, 0xe725, 0x080c, 0xe9e6, 0x1904, 0xe725, + 0x080c, 0xed86, 0x0904, 0xe725, 0x080c, 0xe9d6, 0x0904, 0xe725, + 0x6720, 0x9786, 0x0001, 0x1148, 0x080c, 0x339b, 0x0904, 0xe76d, + 0x6004, 0x9086, 0x0000, 0x1904, 0xe76d, 0x9786, 0x0004, 0x0904, + 0xe76d, 0x2500, 0x9c06, 0x0904, 0xe725, 0x2400, 0x9c06, 0x05e8, + 0x88ff, 0x0118, 0x6054, 0x9906, 0x15c0, 0x0096, 0x6000, 0x9086, + 0x0004, 0x1120, 0x0016, 0x080c, 0x1ab7, 0x001e, 0x9786, 0x000a, + 0x0148, 0x080c, 0xd05e, 0x1130, 0x080c, 0xbae2, 0x009e, 0x080c, + 0xb134, 0x0418, 0x6014, 0x2048, 0x080c, 0xce56, 0x01d8, 0x9786, + 0x0003, 0x1570, 0xa867, 0x0103, 0xa87c, 0xd0cc, 0x0130, 0x0096, + 0xa878, 0x2048, 0x080c, 0x0fc0, 0x009e, 0xab7a, 0xa877, 0x0000, + 0x080c, 0xed00, 0x0016, 0x080c, 0xd14c, 0x080c, 0x6dc4, 0x001e, + 0x080c, 0xd041, 0x009e, 0x080c, 0xb134, 0x9ce0, 0x0018, 0x2001, + 0x181a, 0x2004, 0x9c02, 0x1210, 0x0804, 0xe6a4, 0x012e, 0x002e, + 0x004e, 0x005e, 0x006e, 0x007e, 0x008e, 0x00ce, 0x00ee, 0x0005, + 0x9786, 0x0006, 0x1150, 0x9386, 0x0005, 0x0128, 0x080c, 0xed00, + 0x080c, 0xe948, 0x08f8, 0x009e, 0x0c00, 0x9786, 0x0009, 0x11f8, + 0x6000, 0x9086, 0x0004, 0x01c0, 0x6000, 0x9086, 0x0003, 0x11a0, + 0x080c, 0x989d, 0x0096, 0x6114, 0x2148, 0x080c, 0xce56, 0x0118, + 0x6010, 0x080c, 0x6dd1, 0x009e, 0x00c6, 0x080c, 0xb101, 0x00ce, + 0x0036, 0x080c, 0x9a0f, 0x003e, 0x009e, 0x0804, 0xe725, 0x9786, + 0x000a, 0x0904, 0xe715, 0x0804, 0xe70a, 0x81ff, 0x0904, 0xe725, + 0x9180, 0x0001, 0x2004, 0x9086, 0x0018, 0x0138, 0x9180, 0x0001, + 0x2004, 0x9086, 0x002d, 0x1904, 0xe725, 0x6000, 0x9086, 0x0002, + 0x1904, 0xe725, 0x080c, 0xd04d, 0x0138, 0x080c, 0xd05e, 0x1904, + 0xe725, 0x080c, 0xbae2, 0x0038, 0x080c, 0x326f, 0x080c, 0xd05e, + 0x1110, 0x080c, 0xbae2, 0x080c, 0xb134, 0x0804, 0xe725, 0xa864, + 0x9084, 0x00ff, 0x9086, 0x0039, 0x0005, 0x00c6, 0x00e6, 0x0016, + 0x2c08, 0x2170, 0x9006, 0x080c, 0xe96f, 0x001e, 0x0120, 0x6020, + 0x9084, 0x000f, 0x001b, 0x00ee, 0x00ce, 0x0005, 0xe7bc, 0xe7bc, + 0xe7bc, 0xe7bc, 0xe7bc, 0xe7bc, 0xe7be, 0xe7bc, 0xe7bc, 0xe7bc, + 0xe7e7, 0xb134, 0xb134, 0xe7bc, 0x9006, 0x0005, 0x0036, 0x0046, + 0x0016, 0x7010, 0x00b6, 0x2058, 0xbca0, 0x00be, 0x2c00, 0x2009, + 0x0020, 0x080c, 0xe9a5, 0x001e, 0x004e, 0x2019, 0x0002, 0x080c, + 0xe4c8, 0x003e, 0x9085, 0x0001, 0x0005, 0x0096, 0x080c, 0xce56, + 0x0140, 0x6014, 0x904d, 0x080c, 0xca71, 0x687b, 0x0005, 0x080c, + 0x6dd1, 0x009e, 0x080c, 0xb134, 0x9085, 0x0001, 0x0005, 0x0019, + 0x9085, 0x0001, 0x0005, 0x6000, 0x908a, 0x0010, 0x1a0c, 0x0dc5, + 0x000b, 0x0005, 0xe802, 0xe802, 0xe819, 0xe809, 0xe828, 0xe802, + 0xe802, 0xe804, 0xe802, 0xe802, 0xe802, 0xe802, 0xe802, 0xe802, + 0xe802, 0xe802, 0x080c, 0x0dc5, 0x080c, 0xb134, 0x9085, 0x0001, + 0x0005, 0x0036, 0x00e6, 0x2071, 0x19e9, 0x703c, 0x9c06, 0x1128, + 0x2019, 0x0001, 0x080c, 0xa877, 0x0010, 0x080c, 0xaa59, 0x00ee, + 0x003e, 0x0096, 0x00d6, 0x6014, 0x2048, 0xa87b, 0x0005, 0x080c, + 0x6dd1, 0x080c, 0xb134, 0x00de, 0x009e, 0x9085, 0x0001, 0x0005, + 0x601c, 0xd084, 0x190c, 0x1ab7, 0x0c60, 0x2001, 0x0001, 0x080c, + 0x664f, 0x0156, 0x0016, 0x0026, 0x0036, 0x20a9, 0x0004, 0x2019, + 0x1805, 0x2011, 0x0276, 0x080c, 0xc0e3, 0x003e, 0x002e, 0x001e, + 0x015e, 0x9005, 0x0005, 0x00f6, 0x00e6, 0x00c6, 0x0086, 0x0076, + 0x0066, 0x00b6, 0x0126, 0x2091, 0x8000, 0x2740, 0x2061, 0x1cd0, + 0x2079, 0x0001, 0x8fff, 0x0904, 0xe89f, 0x2071, 0x1800, 0x7654, + 0x7074, 0x8001, 0x9602, 0x1a04, 0xe89f, 0x88ff, 0x0120, 0x2800, + 0x9c06, 0x15a0, 0x2078, 0x080c, 0xe9d6, 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, 0xec02, 0x080c, 0xd579, 0x080c, 0x1ab7, 0x6023, 0x0007, + 0x6014, 0x2048, 0x080c, 0xce56, 0x0120, 0x0046, 0x080c, 0xe948, + 0x004e, 0x009e, 0x080c, 0xb134, 0x88ff, 0x1198, 0x9ce0, 0x0018, + 0x2001, 0x181a, 0x2004, 0x9c02, 0x1210, 0x0804, 0xe852, 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, 0xa929, 0x009e, 0x008e, 0x903e, 0x080c, + 0xa9d4, 0x080c, 0xe843, 0x005e, 0x007e, 0x00be, 0x0005, 0x00b6, + 0x0046, 0x0056, 0x0076, 0x00c6, 0x0156, 0x2c20, 0x2128, 0x20a9, + 0x007f, 0x900e, 0x0016, 0x0036, 0x080c, 0x671d, 0x1180, 0x0056, + 0x0086, 0x9046, 0x2508, 0x2029, 0x0001, 0x0096, 0x904e, 0x080c, + 0xa929, 0x009e, 0x008e, 0x903e, 0x080c, 0xa9d4, 0x005e, 0x003e, + 0x001e, 0x8108, 0x1f04, 0xe8d2, 0x0036, 0x2508, 0x2029, 0x0003, + 0x080c, 0xe843, 0x003e, 0x015e, 0x00ce, 0x007e, 0x005e, 0x004e, + 0x00be, 0x0005, 0x00b6, 0x0076, 0x0056, 0x6210, 0x2258, 0x0086, + 0x9046, 0x2029, 0x0001, 0x2019, 0x0048, 0x0096, 0x904e, 0x080c, + 0xa929, 0x009e, 0x008e, 0x903e, 0x080c, 0xa9d4, 0x2c20, 0x080c, + 0xe843, 0x005e, 0x007e, 0x00be, 0x0005, 0x00b6, 0x0046, 0x0056, + 0x0076, 0x00c6, 0x0156, 0x2c20, 0x20a9, 0x0800, 0x900e, 0x0016, + 0x0036, 0x080c, 0x671d, 0x1190, 0x0086, 0x9046, 0x2828, 0x0046, + 0x2021, 0x0001, 0x080c, 0xebe6, 0x004e, 0x0096, 0x904e, 0x080c, + 0xa929, 0x009e, 0x008e, 0x903e, 0x080c, 0xa9d4, 0x003e, 0x001e, + 0x8108, 0x1f04, 0xe91f, 0x0036, 0x2029, 0x0002, 0x080c, 0xe843, + 0x003e, 0x015e, 0x00ce, 0x007e, 0x005e, 0x004e, 0x00be, 0x0005, + 0x0016, 0x00f6, 0x080c, 0xce54, 0x0198, 0xa864, 0x9084, 0x00ff, + 0x9086, 0x0046, 0x0180, 0xa800, 0x907d, 0x0138, 0xa803, 0x0000, + 0xab82, 0x080c, 0x6dd1, 0x2f48, 0x0cb0, 0xab82, 0x080c, 0x6dd1, + 0x00fe, 0x001e, 0x0005, 0xa800, 0x907d, 0x0130, 0xa803, 0x0000, + 0x080c, 0x6dd1, 0x2f48, 0x0cb8, 0x080c, 0x6dd1, 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, 0xce44, 0x2001, 0x0000, 0x0120, 0x2200, + 0x9080, 0x0015, 0x2004, 0x002e, 0xa87a, 0x9186, 0x0020, 0x0110, + 0xa8e3, 0xffff, 0xa986, 0xac76, 0xa87f, 0x0000, 0x2001, 0x198f, + 0x2004, 0xa882, 0x9006, 0xa802, 0xa86a, 0xa88a, 0x0126, 0x2091, + 0x8000, 0x080c, 0x6dd1, 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, 0x1988, 0x2004, + 0x601a, 0x080c, 0x933b, 0x080c, 0x98ed, 0x001e, 0x0005, 0xa001, + 0xa001, 0x0005, 0x6024, 0xd0e4, 0x0158, 0xd0cc, 0x0118, 0x080c, + 0xd190, 0x0030, 0x080c, 0xec02, 0x080c, 0x88f1, 0x080c, 0xb101, + 0x0005, 0x9280, 0x0008, 0x2004, 0x9084, 0x000f, 0x0002, 0xea35, + 0xea35, 0xea35, 0xea37, 0xea35, 0xea37, 0xea37, 0xea35, 0xea37, + 0xea35, 0xea35, 0xea35, 0xea35, 0xea35, 0x9006, 0x0005, 0x9085, + 0x0001, 0x0005, 0x9280, 0x0008, 0x2004, 0x9084, 0x000f, 0x0002, + 0xea4e, 0xea4e, 0xea4e, 0xea4e, 0xea4e, 0xea4e, 0xea5b, 0xea4e, + 0xea4e, 0xea4e, 0xea4e, 0xea4e, 0xea4e, 0xea4e, 0x6007, 0x003b, + 0x602f, 0x0009, 0x6017, 0x2a00, 0x6003, 0x0001, 0x080c, 0x933b, + 0x080c, 0x98ed, 0x0005, 0x0096, 0x00c6, 0x2260, 0x080c, 0xec02, + 0x6043, 0x0000, 0x6024, 0xc0f4, 0xc0e4, 0x6026, 0x603b, 0x0000, + 0x00ce, 0x00d6, 0x2268, 0x9186, 0x0007, 0x1904, 0xeab4, 0x6814, + 0x9005, 0x0138, 0x2048, 0xa87c, 0xd0fc, 0x1118, 0x00de, 0x009e, + 0x08a8, 0x6007, 0x003a, 0x6003, 0x0001, 0x080c, 0x933b, 0x080c, + 0x98ed, 0x00c6, 0x2d60, 0x6100, 0x9186, 0x0002, 0x1904, 0xeb2b, + 0x6014, 0x9005, 0x1138, 0x6000, 0x9086, 0x0007, 0x190c, 0x0dc5, + 0x0804, 0xeb2b, 0x2048, 0x080c, 0xce56, 0x1130, 0x0028, 0x2048, + 0xa800, 0x9005, 0x1de0, 0x2900, 0x2048, 0xa87c, 0x9084, 0x0003, + 0x9086, 0x0002, 0x1168, 0xa87c, 0xc0dc, 0xc0f4, 0xa87e, 0xa880, + 0xc0fc, 0xa882, 0x2009, 0x0043, 0x080c, 0xe31c, 0x0804, 0xeb2b, + 0x2009, 0x0041, 0x0804, 0xeb25, 0x9186, 0x0005, 0x15a0, 0x6814, + 0x2048, 0xa87c, 0xd0bc, 0x1120, 0x00de, 0x009e, 0x0804, 0xea4e, + 0xd0b4, 0x0128, 0xd0fc, 0x090c, 0x0dc5, 0x0804, 0xea6f, 0x6007, + 0x003a, 0x6003, 0x0001, 0x080c, 0x933b, 0x080c, 0x98ed, 0x00c6, + 0x2d60, 0x6100, 0x9186, 0x0002, 0x0120, 0x9186, 0x0004, 0x1904, + 0xeb2b, 0x6814, 0x2048, 0xa97c, 0xc1f4, 0xc1dc, 0xa97e, 0xa980, + 0xc1fc, 0xc1bc, 0xa982, 0x00f6, 0x2c78, 0x080c, 0x1768, 0x00fe, + 0x2009, 0x0042, 0x04d0, 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, 0x6dd1, 0x2019, 0x0045, 0x6008, 0x2068, + 0x080c, 0xe4c8, 0x2d00, 0x600a, 0x6023, 0x0006, 0x6003, 0x0007, + 0x901e, 0x631a, 0x6342, 0x003e, 0x0038, 0x6043, 0x0000, 0x6003, + 0x0007, 0x080c, 0xe31c, 0x00ce, 0x00de, 0x009e, 0x0005, 0x9186, + 0x0013, 0x1128, 0x6004, 0x9082, 0x0085, 0x2008, 0x00c2, 0x9186, + 0x0027, 0x1178, 0x080c, 0x97e1, 0x0036, 0x0096, 0x6014, 0x2048, + 0x2019, 0x0004, 0x080c, 0xe948, 0x009e, 0x003e, 0x080c, 0x98ed, + 0x0005, 0x9186, 0x0014, 0x0d70, 0x080c, 0xb19b, 0x0005, 0xeb5e, + 0xeb5c, 0xeb5c, 0xeb5c, 0xeb5c, 0xeb5c, 0xeb5e, 0xeb5c, 0xeb5c, + 0xeb5c, 0xeb5c, 0xeb5c, 0xeb5c, 0x080c, 0x0dc5, 0x080c, 0x97e1, + 0x6003, 0x000c, 0x080c, 0x98ed, 0x0005, 0x9182, 0x0092, 0x1220, + 0x9182, 0x0085, 0x0208, 0x001a, 0x080c, 0xb19b, 0x0005, 0xeb7c, + 0xeb7c, 0xeb7c, 0xeb7c, 0xeb7e, 0xeb9e, 0xeb7c, 0xeb7c, 0xeb7c, + 0xeb7c, 0xeb7c, 0xeb7c, 0xeb7c, 0x080c, 0x0dc5, 0x00d6, 0x2c68, + 0x080c, 0xb0ab, 0x01b0, 0x6003, 0x0001, 0x6007, 0x001e, 0x2009, + 0x026e, 0x210c, 0x613a, 0x2009, 0x026f, 0x210c, 0x613e, 0x600b, + 0xffff, 0x6910, 0x6112, 0x6023, 0x0004, 0x080c, 0x933b, 0x080c, + 0x98ed, 0x2d60, 0x080c, 0xb101, 0x00de, 0x0005, 0x080c, 0xb101, + 0x0005, 0x00e6, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0ec, + 0x00ee, 0x0005, 0x2009, 0x1867, 0x210c, 0xd1ec, 0x05b0, 0x6003, + 0x0002, 0x6024, 0xc0e5, 0x6026, 0xd0cc, 0x0150, 0x2001, 0x1989, + 0x2004, 0x6042, 0x2009, 0x1867, 0x210c, 0xd1f4, 0x1520, 0x00a0, + 0x2009, 0x1867, 0x210c, 0xd1f4, 0x0128, 0x6024, 0xc0e4, 0x6026, + 0x9006, 0x00d8, 0x2001, 0x1989, 0x200c, 0x2001, 0x1987, 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, 0x88f1, 0x080c, + 0xb101, 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, 0xc0f7, 0x009e, 0x1168, 0x2011, 0x0274, 0x20a9, + 0x0004, 0x6010, 0x0096, 0x2048, 0x2019, 0x0006, 0x080c, 0xc0f7, + 0x009e, 0x1100, 0x015e, 0x003e, 0x002e, 0x0005, 0x00e6, 0x2071, + 0x1800, 0x080c, 0x60ba, 0x080c, 0x3019, 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, 0x6dd1, 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, 0x19f2, 0x252c, 0x2021, 0x19f8, + 0x2424, 0x2061, 0x1cd0, 0x2071, 0x1800, 0x7654, 0x7074, 0x9606, + 0x0578, 0x6720, 0x9786, 0x0001, 0x0118, 0x9786, 0x0008, 0x1500, + 0x2500, 0x9c06, 0x01e8, 0x2400, 0x9c06, 0x01d0, 0x080c, 0xe9d6, + 0x01b8, 0x080c, 0xe9e6, 0x11a0, 0x6000, 0x9086, 0x0004, 0x1120, + 0x0016, 0x080c, 0x1ab7, 0x001e, 0x080c, 0xd04d, 0x1110, 0x080c, + 0x326f, 0x080c, 0xd05e, 0x1110, 0x080c, 0xbae2, 0x080c, 0xb134, + 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, 0xd561, 0x0168, 0x2019, 0xffff, 0x9005, + 0x0128, 0x6010, 0x00b6, 0x2058, 0xbba0, 0x00be, 0x2021, 0x0004, + 0x080c, 0x4da0, 0x004e, 0x003e, 0x000e, 0x0005, 0x6004, 0x9086, + 0x0001, 0x1128, 0x080c, 0xaa9a, 0x080c, 0xb134, 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, 0x07ce, 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, 0x1a0b, 0x0001, 0x7f62, 0x0008, 0x8066, 0x0000, 0x0409, + 0x0000, 0x44bc, 0x0003, 0x80fe, 0x0008, 0x1a0a, 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, 0x039c, + 0x000b, 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, 0x03a5, 0x0004, 0x808c, 0x0008, 0x0001, + 0x0000, 0x04fe, 0x0008, 0x3388, 0x000b, 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, 0x0f88, 0x000b, 0xc4c0, 0x0009, 0x7000, 0x0000, 0xffe0, + 0x0009, 0x1000, 0x0000, 0x0b21, 0x0003, 0x0396, 0x0004, 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, 0x0379, 0x0003, 0x0396, 0x0004, 0x3941, 0x0002, 0x0b27, + 0x0003, 0x8072, 0x0000, 0x0400, 0x0000, 0x000a, 0x000b, 0x035e, + 0x000c, 0x11fe, 0x0000, 0x372f, 0x000b, 0x8072, 0x0000, 0x0400, + 0x0000, 0x8010, 0x0008, 0x000e, 0x0000, 0x0379, 0x0003, 0x8060, + 0x0000, 0x0400, 0x0000, 0x04fe, 0x0008, 0x3744, 0x0003, 0x808c, + 0x0008, 0x0000, 0x0008, 0x9180, 0x0001, 0x0005, 0x0008, 0x7f62, + 0x0008, 0x8066, 0x0000, 0x0009, 0x0008, 0x473a, 0x000b, 0x0060, + 0x0008, 0x8062, 0x0008, 0x001b, 0x0008, 0x4304, 0x0008, 0x4206, + 0x0008, 0x8066, 0x0000, 0x0412, 0x0000, 0x4742, 0x000b, 0x035b, + 0x0003, 0x808c, 0x0008, 0x0001, 0x0000, 0x0460, 0x0000, 0x8062, + 0x0008, 0x002b, 0x0008, 0x8066, 0x0000, 0x0609, 0x0008, 0x474b, + 0x000b, 0x8066, 0x0000, 0x220a, 0x0008, 0x474e, 0x000b, 0x42fe, + 0x0000, 0xffc0, 0x0001, 0xff00, 0x0008, 0x7f04, 0x0008, 0x8060, + 0x0000, 0x0400, 0x0000, 0x9180, 0x0001, 0x0002, 0x0000, 0x7f62, + 0x0008, 0x8066, 0x0000, 0x041a, 0x0008, 0x475a, 0x000b, 0x8072, + 0x0000, 0x0400, 0x0000, 0x0046, 0x0003, 0x8060, 0x0000, 0x0400, + 0x0000, 0x1362, 0x0008, 0x8066, 0x0000, 0x0411, 0x0000, 0x4763, + 0x000b, 0x02fe, 0x0008, 0x03e0, 0x0009, 0x0f69, 0x000b, 0x0d22, + 0x0000, 0x4000, 0x000f, 0x8280, 0x0009, 0x0002, 0x0000, 0x1380, + 0x0001, 0x7f62, 0x0008, 0x8066, 0x0000, 0x2209, 0x0008, 0x476f, + 0x000b, 0x0200, 0x000a, 0xffc0, 0x0001, 0x0007, 0x0000, 0x7f06, + 0x0000, 0x1362, 0x0008, 0x8066, 0x0000, 0x060a, 0x0008, 0x4777, + 0x000b, 0x4000, 0x000f, 0x3a44, 0x0002, 0x0c0a, 0x000b, 0x2f44, + 0x000a, 0x2f44, 0x000a, 0x0e83, 0x000b, 0x808a, 0x0008, 0x0003, + 0x0008, 0x8074, 0x0000, 0xf080, 0x0000, 0x8072, 0x0000, 0x3000, + 0x0008, 0x5b84, 0x0003, 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, 0x0b99, + 0x0003, 0x4000, 0x000f, 0x8072, 0x0000, 0x0404, 0x0008, 0x4000, + 0x000f, 0x8010, 0x0008, 0x0012, 0x0008, 0x0233, 0x000c, 0x035e, + 0x000c, 0x1110, 0x0000, 0x0233, 0x000c, 0x11fe, 0x0000, 0x379f, + 0x0003, 0x000a, 0x000b, 0xc2c0, 0x0009, 0x00ff, 0x0008, 0x7f00, + 0x0000, 0xc3c0, 0x0001, 0xff00, 0x0008, 0x00d0, 0x0009, 0x0bca, + 0x0003, 0x0d0a, 0x0000, 0x8580, 0x0001, 0x1000, 0x0000, 0x7f62, + 0x0008, 0x8060, 0x0000, 0x0400, 0x0000, 0x8066, 0x0000, 0x0809, + 0x0000, 0x47b4, 0x000b, 0x04fe, 0x0008, 0x33c3, 0x000b, 0x0460, + 0x0000, 0x8062, 0x0008, 0x0004, 0x0000, 0x8066, 0x0000, 0x0211, + 0x0000, 0x47bc, 0x0003, 0x01fe, 0x0008, 0x00e0, 0x0009, 0x0fc3, + 0x000b, 0x02fe, 0x0008, 0x43e0, 0x0001, 0x0bc9, 0x0003, 0x0500, + 0x0002, 0x7f0a, 0x0000, 0xffe0, 0x0009, 0x0800, 0x0000, 0x0fad, + 0x0003, 0x0d08, 0x0008, 0x4000, 0x000f, 0x43fe, 0x0008, 0x3e80, + 0x0001, 0xffc0, 0x0001, 0x7fff, 0x0000, 0x0d60, 0x0000, 0x7f62, + 0x0008, 0x8066, 0x0000, 0x0809, 0x0000, 0x47d2, 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, 0x47e4, 0x000b, 0x4000, 0x000f, 0xa90f, 0xeaf9, 0x0001, + 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080, 0x0100, + 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000, 0x8000, 0x95d0 }; +#ifdef UNIQUE_FW_NAME +unsigned short fw2300ipx_length01 = 0xee08; +#else +unsigned short risc_code_length01 = 0xee08; +#endif + diff --git a/drivers/scsi/qla2xxx/ql2322.c b/drivers/scsi/qla2xxx/ql2322.c index 3c8cafc12..c88a22c0d 100644 --- a/drivers/scsi/qla2xxx/ql2322.c +++ b/drivers/scsi/qla2xxx/ql2322.c @@ -52,11 +52,6 @@ static struct qla_board_info qla_board_tbl[] = { .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[] = { @@ -67,13 +62,6 @@ static struct pci_device_id qla2322_pci_tbl[] = { .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); diff --git a/drivers/scsi/qla2xxx/ql2322_fw.c b/drivers/scsi/qla2xxx/ql2322_fw.c index 3033c0a6d..cb968e7a0 100644 --- a/drivers/scsi/qla2xxx/ql2322_fw.c +++ b/drivers/scsi/qla2xxx/ql2322_fw.c @@ -1,11100 +1,8281 @@ /* - * Firmware version 3.03.20 IPX from - * - * ftp://ftp.qlogic.com/outgoing/linux/firmware/ql2322_fw.bin - * - * xxd -g 1 -i ql2322_fw.bin | indent -l80 -i8 -o ql2322_fw.c + * QLogic Fibre Channel HBA Driver + * Copyright (c) 2003-2005 QLogic Corporation * + * See LICENSE.qla2xxx for copyright and licensing details. + */ + +/* + * Firmware Version 3.03.18 (12:14 Sep 20, 2005) */ -#include +#ifdef UNIQUE_FW_NAME +unsigned short fw2322ipx_version = 3*1024+3; +#else +unsigned short risc_code_version = 3*1024+3; +#endif -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 +#ifdef UNIQUE_FW_NAME +unsigned char fw2322ipx_version_str[] = {3, 3,18}; +#else +unsigned char firmware_version[] = {3, 3,18}; +#endif + +#ifdef UNIQUE_FW_NAME +#define fw2322ipx_VERSION_STRING "3.03.18" +#else +#define FW_VERSION_STRING "3.03.18" +#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, 0xe428, 0x0000, 0x0003, 0x0003, 0x0012, + 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, 0x2e31, 0x3820, 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, 0x2bcb, 0x2051, 0x1800, 0x2a70, 0x20e1, + 0x0001, 0x20e9, 0x0001, 0x2009, 0x0000, 0x080c, 0x0e68, 0x00f6, + 0x7888, 0x9005, 0x11f8, 0x2061, 0xc000, 0x080c, 0x20e3, 0x1170, + 0x2079, 0x0300, 0x080c, 0x20f9, 0x2061, 0xe000, 0x080c, 0x20e3, + 0x1128, 0x2079, 0x0380, 0x080c, 0x20f9, 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, 0x1b74, 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, 0x0f65, 0x080c, 0x6186, 0x080c, 0xaee4, 0x080c, + 0x111c, 0x080c, 0x1346, 0x080c, 0x1c39, 0x080c, 0x938b, 0x080c, + 0x0d0b, 0x080c, 0x10a1, 0x080c, 0x3574, 0x080c, 0x79b3, 0x080c, + 0x6bf1, 0x080c, 0x8af6, 0x080c, 0x8757, 0x080c, 0x22d4, 0x080c, + 0x808e, 0x080c, 0x2112, 0x080c, 0x2250, 0x080c, 0x22c9, 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, 0x11f4, 0x2071, 0x1800, 0x7003, 0x0000, 0x780c, + 0x9084, 0x0030, 0x9086, 0x0000, 0x190c, 0x0d79, 0x2071, 0x1800, + 0x7000, 0x908e, 0x0003, 0x1168, 0x080c, 0x4ced, 0x080c, 0x359b, + 0x080c, 0x7a1b, 0x080c, 0x7174, 0x080c, 0x8bdd, 0x080c, 0x8780, + 0x0c68, 0x000b, 0x0c88, 0x096d, 0x096e, 0x0b09, 0x096b, 0x0bc3, + 0x0d0a, 0x0d0a, 0x0d0a, 0x080c, 0x0d79, 0x0005, 0x0126, 0x00f6, + 0x2091, 0x8000, 0x7000, 0x9086, 0x0001, 0x1904, 0x0adc, 0x080c, + 0x0eb8, 0x080c, 0x769d, 0x0150, 0x080c, 0x76c0, 0x15b0, 0x2079, + 0x0100, 0x7828, 0x9085, 0x1800, 0x782a, 0x0478, 0x080c, 0x75cc, + 0x7000, 0x9086, 0x0001, 0x1904, 0x0adc, 0x7098, 0x9086, 0x0029, + 0x1904, 0x0adc, 0x080c, 0x8740, 0x080c, 0x8732, 0x2001, 0x0161, + 0x2003, 0x0001, 0x2079, 0x0100, 0x2011, 0xffff, 0x080c, 0x2adc, + 0x7a28, 0x9295, 0x5e2c, 0x7a2a, 0x2011, 0x7511, 0x080c, 0x882c, + 0x2011, 0x7504, 0x080c, 0x8938, 0x2011, 0x5fdd, 0x080c, 0x882c, + 0x2011, 0x8030, 0x901e, 0x7396, 0x04d0, 0x080c, 0x588a, 0x2079, + 0x0100, 0x7844, 0x9005, 0x1904, 0x0adc, 0x2011, 0x5fdd, 0x080c, + 0x882c, 0x2011, 0x7511, 0x080c, 0x882c, 0x2011, 0x7504, 0x080c, + 0x8938, 0x2001, 0x0265, 0x2001, 0x0205, 0x2003, 0x0000, 0x7840, + 0x9084, 0xfffb, 0x7842, 0x2001, 0x19a8, 0x2004, 0x9005, 0x1140, + 0x00c6, 0x2061, 0x0100, 0x080c, 0x612e, 0x00ce, 0x0804, 0x0adc, + 0x780f, 0x006b, 0x7a28, 0x080c, 0x76a5, 0x0118, 0x9295, 0x5e2c, + 0x0010, 0x9295, 0x402c, 0x7a2a, 0x2011, 0x8010, 0x73d8, 0x2001, + 0x19a9, 0x2003, 0x0001, 0x080c, 0x29a8, 0x080c, 0x4c28, 0x7248, + 0xc284, 0x724a, 0x2001, 0x180c, 0x200c, 0xc1ac, 0xc1cc, 0x2102, + 0x2001, 0x0390, 0x2003, 0x0400, 0x080c, 0xaaf7, 0x080c, 0xa2ec, + 0x2011, 0x0004, 0x080c, 0xcc43, 0x080c, 0xab13, 0x080c, 0x6a77, + 0x080c, 0x769d, 0x1120, 0x080c, 0x2a09, 0x0600, 0x0420, 0x080c, + 0x6135, 0x0140, 0x7097, 0x0001, 0x70d3, 0x0000, 0x080c, 0x5a57, + 0x0804, 0x0adc, 0x2001, 0x0390, 0x2003, 0x0404, 0x080c, 0x5820, + 0xd094, 0x0188, 0x2011, 0x180c, 0x2204, 0xc0cd, 0x2012, 0x080c, + 0x5824, 0xd0d4, 0x1118, 0x080c, 0x2a09, 0x1270, 0x2011, 0x180c, + 0x2204, 0xc0bc, 0x00a8, 0x080c, 0x5824, 0xd0d4, 0x1db8, 0x2011, + 0x180c, 0x2204, 0xc0bd, 0x0060, 0x2011, 0x180c, 0x2204, 0xc0bd, + 0x2012, 0x080c, 0x6bc5, 0x1128, 0xd0a4, 0x0118, 0x2204, 0xc0fd, + 0x2012, 0x080c, 0x6b8b, 0x0120, 0x7a0c, 0xc2b4, 0x7a0e, 0x00a8, + 0x707f, 0x0000, 0x080c, 0x769d, 0x1130, 0x70b0, 0x9005, 0x1168, + 0x080c, 0xd0a1, 0x0050, 0x080c, 0xd0a1, 0x70dc, 0xd09c, 0x1128, + 0x70b0, 0x9005, 0x0110, 0x080c, 0x610b, 0x70e7, 0x0000, 0x70e3, + 0x0000, 0x70a7, 0x0000, 0x080c, 0x2a11, 0x0228, 0x2011, 0x0101, + 0x2204, 0xc0c4, 0x2012, 0x72dc, 0x080c, 0x769d, 0x1178, 0x9016, + 0x0016, 0x080c, 0x27b9, 0x2019, 0x196e, 0x211a, 0x001e, 0x705f, + 0xffff, 0x7063, 0x00ef, 0x7083, 0x0000, 0x0020, 0x2019, 0x196e, + 0x201b, 0x0000, 0x2079, 0x1847, 0x7804, 0xd0ac, 0x0108, 0xc295, + 0x72de, 0x080c, 0x769d, 0x0118, 0x9296, 0x0004, 0x0518, 0x2011, + 0x0001, 0x080c, 0xcc43, 0x70ab, 0x0000, 0x70af, 0xffff, 0x7003, + 0x0002, 0x00fe, 0x080c, 0x30c8, 0x080c, 0xaaf7, 0x2011, 0x0005, + 0x080c, 0xa426, 0x080c, 0xab13, 0x080c, 0x769d, 0x0148, 0x00c6, + 0x2061, 0x0100, 0x0016, 0x080c, 0x27b9, 0x61e2, 0x001e, 0x00ce, + 0x012e, 0x00e0, 0x70ab, 0x0000, 0x70af, 0xffff, 0x7003, 0x0002, + 0x080c, 0xaaf7, 0x2011, 0x0005, 0x080c, 0xa426, 0x080c, 0xab13, + 0x080c, 0x769d, 0x0148, 0x00c6, 0x2061, 0x0100, 0x0016, 0x080c, + 0x27b9, 0x61e2, 0x001e, 0x00ce, 0x00fe, 0x012e, 0x0005, 0x00c6, + 0x00b6, 0x080c, 0x769d, 0x1118, 0x20a9, 0x0800, 0x0010, 0x20a9, + 0x0782, 0x080c, 0x769d, 0x1110, 0x900e, 0x0010, 0x2009, 0x007e, + 0x86ff, 0x0138, 0x9180, 0x1000, 0x2004, 0x905d, 0x0110, 0xb800, + 0xd0bc, 0x090c, 0x3404, 0x8108, 0x1f04, 0x0af0, 0x707f, 0x0000, + 0x7080, 0x9084, 0x00ff, 0x7082, 0x70b3, 0x0000, 0x00be, 0x00ce, + 0x0005, 0x00b6, 0x0126, 0x2091, 0x8000, 0x7000, 0x9086, 0x0002, + 0x1904, 0x0bc0, 0x70ac, 0x9086, 0xffff, 0x0120, 0x080c, 0x30c8, + 0x0804, 0x0bc0, 0x70dc, 0xd0ac, 0x1110, 0xd09c, 0x0538, 0xd084, + 0x0528, 0x0006, 0x2001, 0x0103, 0x2003, 0x002b, 0x000e, 0xd08c, + 0x01e8, 0x080c, 0x346d, 0x11b0, 0x70e0, 0x9086, 0xffff, 0x0190, + 0x080c, 0x3261, 0x70dc, 0xd094, 0x1904, 0x0bc0, 0x2011, 0x0001, + 0x080c, 0xd35d, 0x0110, 0x2011, 0x0003, 0x901e, 0x080c, 0x329b, + 0x0804, 0x0bc0, 0x70e4, 0x9005, 0x1904, 0x0bc0, 0x70a8, 0x9005, + 0x1904, 0x0bc0, 0x70dc, 0xd0a4, 0x0118, 0xd0b4, 0x0904, 0x0bc0, + 0x080c, 0x6b8b, 0x1904, 0x0bc0, 0x080c, 0x6bde, 0x1904, 0x0bc0, + 0x080c, 0x6bc5, 0x01c0, 0x0156, 0x00c6, 0x20a9, 0x007f, 0x900e, + 0x0016, 0x080c, 0x6783, 0x1118, 0xb800, 0xd0ec, 0x1138, 0x001e, + 0x8108, 0x1f04, 0x0b60, 0x00ce, 0x015e, 0x0028, 0x001e, 0x00ce, + 0x015e, 0x0804, 0x0bc0, 0x0006, 0x2001, 0x0103, 0x2003, 0x002b, + 0x000e, 0x2011, 0x19b5, 0x080c, 0x0fd5, 0x2011, 0x19cf, 0x080c, + 0x0fd5, 0x7030, 0xc08c, 0x7032, 0x7003, 0x0003, 0x70af, 0xffff, + 0x080c, 0x0e8c, 0x9006, 0x080c, 0x2646, 0x080c, 0x346d, 0x0118, + 0x080c, 0x4dc5, 0x0050, 0x0036, 0x0046, 0x2019, 0xffff, 0x2021, + 0x0006, 0x080c, 0x4ddf, 0x004e, 0x003e, 0x00f6, 0x2079, 0x0100, + 0x080c, 0x76c0, 0x0150, 0x080c, 0x769d, 0x7828, 0x0118, 0x9084, + 0xe1ff, 0x0010, 0x9084, 0xffdf, 0x782a, 0x00fe, 0x080c, 0xaaf7, + 0x2001, 0x19ea, 0x2004, 0x9086, 0x0005, 0x1120, 0x2011, 0x0000, + 0x080c, 0xa426, 0x2011, 0x0000, 0x080c, 0xa430, 0x080c, 0xab13, + 0x012e, 0x00be, 0x0005, 0x0016, 0x0026, 0x0046, 0x00f6, 0x0126, + 0x2091, 0x8000, 0x2079, 0x0100, 0x7904, 0x918c, 0xfffd, 0x7906, + 0x2009, 0x00f7, 0x080c, 0x60f4, 0x7940, 0x918c, 0x0010, 0x7942, + 0x7924, 0xd1b4, 0x0120, 0x2011, 0x0040, 0x080c, 0x2adc, 0xd19c, + 0x0120, 0x2011, 0x0008, 0x080c, 0x2adc, 0x0006, 0x0036, 0x0156, + 0x0000, 0x2001, 0x19a9, 0x2004, 0x9005, 0x1518, 0x080c, 0x2a70, + 0x1148, 0x2001, 0x0001, 0x080c, 0x29d7, 0x2001, 0x0001, 0x080c, + 0x29ba, 0x00b8, 0x080c, 0x2a78, 0x1138, 0x9006, 0x080c, 0x29d7, + 0x9006, 0x080c, 0x29ba, 0x0068, 0x080c, 0x2a80, 0x1d50, 0x2001, + 0x1999, 0x2004, 0xd0fc, 0x0108, 0x0020, 0x080c, 0x27e5, 0x0804, + 0x0cbd, 0x20a9, 0x003a, 0x1d04, 0x0c13, 0x080c, 0x8918, 0x1f04, + 0x0c13, 0x080c, 0x76ae, 0x0148, 0x080c, 0x76c0, 0x1118, 0x080c, + 0x79ae, 0x0050, 0x080c, 0x76a5, 0x0dd0, 0x080c, 0x79a9, 0x080c, + 0x799f, 0x080c, 0x75cc, 0x0020, 0x2009, 0x00f8, 0x080c, 0x60f4, + 0x7850, 0xc0e5, 0x7852, 0x080c, 0x769d, 0x0120, 0x7843, 0x0090, + 0x7843, 0x0010, 0x2021, 0xe678, 0x2019, 0xea60, 0x0d0c, 0x8918, + 0x7820, 0xd09c, 0x15a0, 0x080c, 0x769d, 0x0904, 0x0c9f, 0x7824, + 0xd0ac, 0x1904, 0x0cc2, 0x080c, 0x76c0, 0x1548, 0x0046, 0x2021, + 0x0320, 0x8421, 0x1df0, 0x004e, 0x2011, 0x1800, 0x080c, 0x2adc, + 0x080c, 0x2a88, 0x7824, 0x9084, 0x1800, 0x1168, 0x9484, 0x0fff, + 0x1140, 0x2001, 0x1810, 0x2004, 0x9084, 0x9000, 0x0110, 0x080c, + 0x0ce5, 0x8421, 0x1160, 0x1d04, 0x0c6f, 0x080c, 0x8918, 0x080c, + 0x79a9, 0x080c, 0x799f, 0x7003, 0x0001, 0x0804, 0x0cc2, 0x8319, + 0x1928, 0x2001, 0x1810, 0x2004, 0x9084, 0x9000, 0x0110, 0x080c, + 0x0ce5, 0x1d04, 0x0c85, 0x080c, 0x8918, 0x2009, 0x199c, 0x2104, + 0x9005, 0x0118, 0x8001, 0x200a, 0x1188, 0x200b, 0x000a, 0x2011, + 0x0048, 0x080c, 0x2adc, 0x20a9, 0x0002, 0x080c, 0x2a69, 0x7924, + 0x080c, 0x2a88, 0xd19c, 0x0110, 0x080c, 0x29a8, 0x00f0, 0x080c, + 0x76ae, 0x1140, 0x94a2, 0x03e8, 0x1128, 0x080c, 0x7671, 0x7003, + 0x0001, 0x00c0, 0x2011, 0x1800, 0x080c, 0x2adc, 0x080c, 0x2a88, + 0x7824, 0x080c, 0x76b7, 0x0110, 0xd0ac, 0x1160, 0x9084, 0x1800, + 0x0904, 0x0c77, 0x7003, 0x0001, 0x0028, 0x2001, 0x0001, 0x080c, + 0x2646, 0x00a0, 0x7850, 0xc0e4, 0x7852, 0x2009, 0x180c, 0x210c, + 0xd19c, 0x1120, 0x7904, 0x918d, 0x0002, 0x7906, 0x2011, 0x0048, + 0x080c, 0x2adc, 0x7828, 0x9085, 0x0028, 0x782a, 0x2001, 0x19a9, + 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, 0x8918, 0x015e, 0x00fe, 0x00ee, 0x00de, 0x00ce, + 0x00be, 0x004e, 0x003e, 0x002e, 0x001e, 0x000e, 0x0005, 0x00e6, + 0x2071, 0x189e, 0x7004, 0x9086, 0x0001, 0x1110, 0x080c, 0x359b, + 0x00ee, 0x0005, 0x0005, 0x2a70, 0x2061, 0x19ad, 0x2063, 0x0003, + 0x6007, 0x0003, 0x600b, 0x0012, 0x600f, 0x0137, 0x2001, 0x197d, + 0x900e, 0x2102, 0x7196, 0x2001, 0x0100, 0x2004, 0x9082, 0x0002, + 0x0218, 0x705f, 0xffff, 0x0008, 0x715e, 0x7067, 0xffff, 0x717e, + 0x7182, 0x080c, 0xd0a1, 0x70ef, 0x00c0, 0x2061, 0x196d, 0x6003, + 0x0909, 0x6106, 0x600b, 0x8800, 0x600f, 0x0200, 0x6013, 0x00ff, + 0x6017, 0x001f, 0x611a, 0x601f, 0x07d0, 0x2061, 0x1975, 0x6003, + 0x8000, 0x6106, 0x610a, 0x600f, 0x0200, 0x6013, 0x00ff, 0x6116, + 0x601b, 0x0001, 0x611e, 0x2061, 0x198a, 0x6003, 0x514c, 0x6007, + 0x4f47, 0x600b, 0x4943, 0x600f, 0x2020, 0x2001, 0x182c, 0x2102, + 0x0005, 0x9016, 0x080c, 0x6783, 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, 0x0d7b, 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, 0x1b2c, 0x7a08, 0x226a, 0x2069, + 0x1b2d, 0x7a18, 0x226a, 0x8d68, 0x7a1c, 0x226a, 0x782c, 0x2019, + 0x1b3a, 0x201a, 0x2019, 0x1b3d, 0x9016, 0x7808, 0xd09c, 0x0168, + 0x7820, 0x201a, 0x8210, 0x8318, 0x9386, 0x1b56, 0x0108, 0x0ca8, + 0x7808, 0xd09c, 0x0110, 0x2011, 0xdead, 0x2019, 0x1b3b, 0x782c, + 0x201a, 0x8318, 0x221a, 0x7803, 0x0000, 0x2069, 0x1a82, 0x901e, + 0x20a9, 0x0020, 0x7b26, 0x7a28, 0x226a, 0x8d68, 0x8318, 0x1f04, + 0x0dd2, 0x2069, 0x1aa2, 0x2019, 0x0050, 0x20a9, 0x0020, 0x7b26, + 0x7a28, 0x226a, 0x8d68, 0x8318, 0x1f04, 0x0ddf, 0x0491, 0x002e, + 0x003e, 0x00de, 0x015e, 0x2079, 0x1800, 0x7803, 0x0005, 0x2091, + 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x0180, 0x2001, 0x1a26, + 0x2004, 0x9005, 0x0128, 0x2001, 0x008b, 0x2004, 0xd0fc, 0x0dd8, + 0x2001, 0x008a, 0x2003, 0x0002, 0x2003, 0x1001, 0x080c, 0x582f, + 0x1170, 0x080c, 0x0f26, 0x0110, 0x080c, 0x0e79, 0x080c, 0x582f, + 0x1130, 0x2071, 0x1800, 0x2011, 0x8000, 0x080c, 0x0f3a, 0x0c70, + 0x0005, 0x2001, 0x0382, 0x2004, 0x9084, 0x0007, 0x9086, 0x0001, + 0x1120, 0x2001, 0x0015, 0x080c, 0xaae8, 0x2079, 0x0380, 0x2069, + 0x1b0c, 0x7818, 0x6802, 0x781c, 0x6806, 0x7840, 0x680a, 0x7844, + 0x680e, 0x782c, 0x6812, 0x2019, 0x1b17, 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, 0x1acc, + 0x901e, 0x20a9, 0x0020, 0x7b26, 0x7828, 0x206a, 0x8d68, 0x8318, + 0x1f04, 0x0e53, 0x2069, 0x1aec, 0x2019, 0x00b0, 0x20a9, 0x0020, + 0x7b26, 0x7828, 0x206a, 0x8d68, 0x8318, 0x1f04, 0x0e60, 0x0005, + 0x918c, 0x03ff, 0x2001, 0x0003, 0x2004, 0x9084, 0x0600, 0x1118, + 0x918d, 0x6c00, 0x0010, 0x918d, 0x6400, 0x2001, 0x017f, 0x2102, + 0x0005, 0x0026, 0x0126, 0x2011, 0x0080, 0x080c, 0x0f18, 0x20a9, + 0x0900, 0x080c, 0x0f4e, 0x2011, 0x0040, 0x080c, 0x0f18, 0x20a9, + 0x0900, 0x080c, 0x0f4e, 0x0c78, 0x0026, 0x080c, 0x0f26, 0x1188, + 0x2011, 0x010e, 0x2214, 0x9294, 0x0007, 0x9296, 0x0007, 0x0118, + 0x2011, 0x0947, 0x0010, 0x2011, 0x1b47, 0x080c, 0x0f3a, 0x002e, + 0x0005, 0x2011, 0x010e, 0x2214, 0x9294, 0x0007, 0x9296, 0x0007, + 0x0118, 0x2011, 0xa880, 0x0010, 0x2011, 0x6840, 0xd0e4, 0x70f3, + 0x0000, 0x1120, 0x70f3, 0x0fa0, 0x080c, 0x0f2b, 0x002e, 0x0005, + 0x0026, 0x080c, 0x0f26, 0x0148, 0xd0a4, 0x1138, 0x2011, 0xcdd5, + 0x0010, 0x2011, 0x0080, 0x080c, 0x0f2b, 0x002e, 0x0005, 0x0026, + 0x70f3, 0x0000, 0x080c, 0x0f26, 0x1130, 0x2011, 0x8040, 0x080c, + 0x0f3a, 0x002e, 0x0005, 0x080c, 0x2a80, 0x1118, 0x2011, 0xcdc5, + 0x0010, 0x2011, 0xcac2, 0x080c, 0x0f2b, 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, + 0x0ede, 0x0eb8, 0x0eb8, 0x0e8c, 0x0ec7, 0x0eb8, 0x0eb8, 0x0ec7, + 0xc284, 0x0016, 0x3b08, 0x3a00, 0x9104, 0x918d, 0x00c1, 0x21d8, + 0x9084, 0xff3e, 0x9205, 0x20d0, 0x001e, 0x0005, 0x2001, 0x183b, + 0x2004, 0xd0dc, 0x0005, 0x9e86, 0x1800, 0x190c, 0x0d79, 0x70ec, + 0xd0e4, 0x0108, 0xc2e5, 0x72ee, 0xd0e4, 0x1118, 0x9294, 0x00c1, + 0x08f9, 0x0005, 0x9e86, 0x1800, 0x190c, 0x0d79, 0x70e8, 0xd0f4, + 0x0108, 0xc2f5, 0x72ea, 0xd0f4, 0x1140, 0x9284, 0x8000, 0x8005, + 0xc284, 0x9215, 0x9294, 0x00c1, 0x0861, 0x0005, 0x1d04, 0x0f4e, + 0x2091, 0x6000, 0x1f04, 0x0f4e, 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, 0x0f55, 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, 0x0d59, + 0x2001, 0x0000, 0x810f, 0x20a9, 0x0002, 0x4001, 0x0005, 0x89ff, + 0x0140, 0xa804, 0xa807, 0x0000, 0x0006, 0x080c, 0x107f, 0x009e, + 0x0cb0, 0x0005, 0x00e6, 0x2071, 0x1800, 0x080c, 0x10f8, 0x090c, + 0x0d79, 0x00ee, 0x0005, 0x0086, 0x00e6, 0x0006, 0x0026, 0x0036, + 0x0126, 0x2091, 0x8000, 0x00c9, 0x2071, 0x1800, 0x73c0, 0x702c, + 0x9016, 0x9045, 0x0158, 0x8210, 0x9906, 0x090c, 0x0d79, 0x2300, + 0x9202, 0x0120, 0x1a0c, 0x0d79, 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, 0x0d79, 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, 0x8732, 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, 0x1a25, 0x7007, + 0x0000, 0x9006, 0x701e, 0x7022, 0x7002, 0x2071, 0x0000, 0x7010, + 0x9085, 0x8044, 0x7012, 0x2071, 0x0080, 0x9006, 0x702b, 0x0060, + 0x20a9, 0x0040, 0x7022, 0x1f04, 0x1132, 0x702b, 0x0060, 0x702b, + 0x0020, 0x20a9, 0x0040, 0x7022, 0x1f04, 0x113b, 0x702b, 0x0020, + 0x00ee, 0x0005, 0x0126, 0x2091, 0x8000, 0x00e6, 0xa06f, 0x0000, + 0x2071, 0x1a25, 0x701c, 0x9088, 0x1a2f, 0x280a, 0x8000, 0x9084, + 0x003f, 0x701e, 0x7120, 0x9106, 0x090c, 0x0d79, 0x7004, 0x9005, + 0x1128, 0x00f6, 0x2079, 0x0080, 0x00a9, 0x00fe, 0x00ee, 0x012e, + 0x0005, 0x0126, 0x2091, 0x8000, 0x00e6, 0x2071, 0x1a25, 0x7004, + 0x9005, 0x1128, 0x00f6, 0x2079, 0x0080, 0x0021, 0x00fe, 0x00ee, + 0x012e, 0x0005, 0x7004, 0x9086, 0x0000, 0x1110, 0x7007, 0x0006, + 0x7000, 0x0002, 0x1184, 0x1307, 0x1182, 0x1182, 0x12fb, 0x12fb, + 0x12fb, 0x12fb, 0x080c, 0x0d79, 0x701c, 0x7120, 0x9106, 0x1148, + 0x792c, 0x9184, 0x0001, 0x1120, 0xd1fc, 0x1110, 0x7007, 0x0000, + 0x0005, 0x0096, 0x9180, 0x1a2f, 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, 0x1a25, 0x2104, 0xc095, + 0x200a, 0x080c, 0x1161, 0x0005, 0x0016, 0x00e6, 0x2071, 0x1a25, + 0x00f6, 0x2079, 0x0080, 0x792c, 0xd1bc, 0x190c, 0x0d72, 0x782b, + 0x0002, 0xd1fc, 0x0120, 0x918c, 0x0700, 0x7004, 0x0023, 0x00fe, + 0x00ee, 0x001e, 0x0005, 0x1172, 0x121a, 0x124e, 0x1326, 0x0d79, + 0x1341, 0x0d79, 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, 0x11b7, 0x0005, 0x7008, 0x0096, 0x2048, 0xa86f, + 0x0100, 0x009e, 0x7007, 0x0000, 0x080c, 0x1172, 0x0005, 0x7008, + 0x0096, 0x2048, 0xa86f, 0x0200, 0x009e, 0x0ca0, 0x918c, 0x0700, + 0x1150, 0x700c, 0x9005, 0x0180, 0x7800, 0x7802, 0x7804, 0x7806, + 0x080c, 0x11cc, 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, 0x1161, 0x0005, 0x00de, 0x009e, 0x080c, 0x1161, + 0x0005, 0xa8a8, 0xd08c, 0x0005, 0x0096, 0xa0a0, 0x904d, 0x090c, + 0x0d79, 0xa06c, 0x908e, 0x0100, 0x0130, 0xa87b, 0x0030, 0xa883, + 0x0000, 0xa897, 0x4002, 0x080c, 0x6f05, 0xa09f, 0x0000, 0xa0a3, + 0x0000, 0x2848, 0x080c, 0x107f, 0x009e, 0x0005, 0x00a6, 0xa0a0, + 0x904d, 0x090c, 0x0d79, 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, 0x1142, 0x00e8, 0xa97c, 0xa894, 0x0016, 0x0006, + 0x080c, 0x6f05, 0x000e, 0x001e, 0xd1fc, 0x1138, 0xd1f4, 0x0128, + 0x00c6, 0x2060, 0x080c, 0xaf4e, 0x00ce, 0x7008, 0x2048, 0xa89f, + 0x0000, 0xa8a3, 0x0000, 0x080c, 0x107f, 0x7007, 0x0000, 0x080c, + 0x1161, 0x00ae, 0x0005, 0x0126, 0x2091, 0x8000, 0x782b, 0x1001, + 0x7007, 0x0005, 0x7000, 0xc094, 0x7002, 0x012e, 0x0005, 0x0096, + 0x2001, 0x1930, 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, 0x1930, 0x204c, + 0xaa7c, 0x009e, 0x080c, 0x8e1e, 0x2009, 0x188c, 0x2104, 0x9084, + 0xfffc, 0x200a, 0x080c, 0x8c80, 0x7007, 0x0000, 0x080c, 0x1172, + 0x0005, 0x7007, 0x0000, 0x080c, 0x1172, 0x0005, 0x0126, 0x2091, + 0x2200, 0x2079, 0x0300, 0x2071, 0x1a6f, 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, 0x13aa, 0x0cc8, + 0x2001, 0x1a70, 0x2003, 0x0000, 0x78ab, 0x0004, 0x78ac, 0xd0ac, + 0x1de8, 0x78ab, 0x0002, 0x7807, 0x0007, 0x7827, 0x0030, 0x782b, + 0x0400, 0x7827, 0x0031, 0x782b, 0x1a82, 0x78e3, 0xff00, 0x781f, + 0xff00, 0x781b, 0xff00, 0x2001, 0x1a71, 0x2003, 0x0000, 0x2001, + 0x0200, 0x2004, 0xd0dc, 0x0110, 0x781f, 0x0303, 0x2061, 0x1a82, + 0x602f, 0x1ddc, 0x2001, 0x181a, 0x2004, 0x9082, 0x1ddc, 0x6032, + 0x603b, 0x1ede, 0x602b, 0x1ac2, 0x6007, 0x1aa2, 0x2061, 0x1aa2, + 0x606f, 0x193e, 0x2001, 0x1929, 0x2004, 0x607a, 0x783f, 0x3474, + 0x00ce, 0x0005, 0x9086, 0x000d, 0x11d0, 0x7808, 0xd09c, 0x01b8, + 0x7820, 0x0026, 0x2010, 0x080c, 0xcc21, 0x0180, 0x2260, 0x6000, + 0x9086, 0x0004, 0x1158, 0x0016, 0x6120, 0x9186, 0x0009, 0x0108, + 0x0020, 0x2009, 0x004c, 0x080c, 0xafec, 0x001e, 0x002e, 0x0005, + 0x0126, 0x2091, 0x2200, 0x7908, 0x9184, 0x0070, 0x190c, 0x0d72, + 0xd19c, 0x05a0, 0x7820, 0x908c, 0xf000, 0x0540, 0x2060, 0x6020, + 0x9086, 0x0003, 0x1550, 0x6000, 0x9086, 0x0004, 0x1530, 0x6114, + 0x2148, 0xa876, 0xa87a, 0xa867, 0x0103, 0x080c, 0x6d26, 0x00b6, + 0x6010, 0x2058, 0xba3c, 0x8211, 0x0208, 0xba3e, 0xb8d0, 0x9005, + 0x190c, 0x68ae, 0x00be, 0x6044, 0xd0fc, 0x190c, 0xab20, 0x080c, + 0xaf77, 0x7808, 0xd09c, 0x19b0, 0x012e, 0x0005, 0x908a, 0x0024, + 0x1a0c, 0x0d79, 0x002b, 0x012e, 0x0005, 0x04b0, 0x012e, 0x0005, + 0x142c, 0x1452, 0x1482, 0x1487, 0x148b, 0x1490, 0x14b8, 0x14bc, + 0x14ca, 0x14ce, 0x142c, 0x159b, 0x159f, 0x1611, 0x1618, 0x142c, + 0x1619, 0x161a, 0x1625, 0x162c, 0x142c, 0x142c, 0x142c, 0x142c, + 0x142c, 0x142c, 0x142c, 0x1492, 0x142c, 0x145a, 0x147f, 0x1446, + 0x142c, 0x1466, 0x1430, 0x142e, 0x080c, 0x0d79, 0x080c, 0x0d72, + 0x080c, 0x1637, 0x2009, 0x1a7e, 0x2104, 0x8000, 0x200a, 0x080c, + 0x8151, 0x080c, 0x1b3b, 0x0005, 0x6044, 0xd0fc, 0x190c, 0xab20, + 0x2009, 0x0055, 0x080c, 0xafec, 0x012e, 0x0005, 0x080c, 0x1637, + 0x2060, 0x6044, 0xd0fc, 0x190c, 0xab20, 0x2009, 0x0055, 0x080c, + 0xafec, 0x0005, 0x2009, 0x0048, 0x080c, 0x1637, 0x2060, 0x080c, + 0xafec, 0x0005, 0x2009, 0x0054, 0x080c, 0x1637, 0x2060, 0x6044, + 0xd0fc, 0x190c, 0xab20, 0x080c, 0xafec, 0x0005, 0x080c, 0x1637, + 0x2060, 0x0056, 0x0066, 0x080c, 0x1637, 0x2028, 0x080c, 0x1637, + 0x2030, 0x0036, 0x0046, 0x2021, 0x0000, 0x2418, 0x2009, 0x0056, + 0x080c, 0xafec, 0x004e, 0x003e, 0x006e, 0x005e, 0x0005, 0x080c, + 0x1637, 0x0005, 0x7004, 0xc085, 0xc0b5, 0x7006, 0x0005, 0x7004, + 0xc085, 0x7006, 0x0005, 0x080c, 0x1637, 0x080c, 0x1734, 0x0005, + 0x080c, 0x0d79, 0x080c, 0x1637, 0x2060, 0x6014, 0x0096, 0x2048, + 0xa83b, 0xffff, 0x009e, 0x2009, 0x0048, 0x080c, 0xafec, 0x2001, + 0x015d, 0x2003, 0x0000, 0x2009, 0x03e8, 0x8109, 0x0160, 0x2001, + 0x0201, 0x2004, 0x9005, 0x0dc8, 0x2001, 0x0218, 0x2004, 0xd0ec, + 0x1110, 0x080c, 0x163c, 0x2001, 0x0307, 0x2003, 0x8000, 0x0005, + 0x7004, 0xc095, 0x7006, 0x0005, 0x080c, 0x1637, 0x2060, 0x6014, + 0x0096, 0x2048, 0xa83b, 0xffff, 0x009e, 0x2009, 0x0048, 0x080c, + 0xafec, 0x0005, 0x080c, 0x1637, 0x080c, 0x0d79, 0x080c, 0x1637, + 0x080c, 0x1586, 0x7827, 0x0018, 0x79ac, 0xd1dc, 0x0904, 0x1537, + 0x7827, 0x0015, 0x7828, 0x782b, 0x0000, 0x9065, 0x0140, 0x2001, + 0x020d, 0x2003, 0x0050, 0x2003, 0x0020, 0x0804, 0x153d, 0x7004, + 0x9005, 0x01c8, 0x1188, 0x78ab, 0x0004, 0x7827, 0x0018, 0x782b, + 0x0000, 0xd1bc, 0x090c, 0x0d79, 0x2001, 0x020d, 0x2003, 0x0050, + 0x2003, 0x0020, 0x0804, 0x156b, 0x78ab, 0x0004, 0x7803, 0x0001, + 0x080c, 0x159f, 0x0005, 0x7827, 0x0018, 0xa001, 0x7828, 0x7827, + 0x0011, 0xa001, 0x7928, 0x9106, 0x0110, 0x79ac, 0x08e0, 0x00e6, + 0x2071, 0x0200, 0x702c, 0xd0c4, 0x0140, 0x00ee, 0x080c, 0x1b3b, + 0x080c, 0x135a, 0x7803, 0x0001, 0x0005, 0x7037, 0x0001, 0xa001, + 0x7150, 0x00ee, 0x918c, 0xff00, 0x9186, 0x0500, 0x0110, 0x79ac, + 0x0810, 0x7004, 0xc09d, 0x7006, 0x78ab, 0x0004, 0x7803, 0x0001, + 0x080c, 0x159f, 0x2001, 0x020d, 0x2003, 0x0020, 0x0005, 0x7828, + 0x782b, 0x0000, 0x9065, 0x090c, 0x0d79, 0x6014, 0x2048, 0x78ab, + 0x0004, 0x918c, 0x0700, 0x01a8, 0x080c, 0x8151, 0x080c, 0x1b3b, + 0x080c, 0xcc33, 0x0158, 0xa9ac, 0xa936, 0xa9b0, 0xa93a, 0xa83f, + 0xffff, 0xa843, 0xffff, 0xa880, 0xc0bd, 0xa882, 0x080c, 0xc81b, + 0x0005, 0x6020, 0x9086, 0x0009, 0x1128, 0x2009, 0x004c, 0x080c, + 0xafec, 0x0048, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, + 0x6024, 0x190c, 0xd036, 0x2029, 0x00c8, 0x8529, 0x0128, 0x2001, + 0x0201, 0x2004, 0x9005, 0x0dc8, 0x7dbc, 0x080c, 0xebc0, 0xd5a4, + 0x1118, 0x080c, 0x163c, 0x0005, 0x080c, 0x8151, 0x080c, 0x1b3b, + 0x0005, 0x781f, 0x0300, 0x7803, 0x0001, 0x0005, 0x0016, 0x0066, + 0x0076, 0x00f6, 0x2079, 0x0300, 0x7908, 0x918c, 0x0007, 0x9186, + 0x0003, 0x0120, 0x2001, 0x0016, 0x080c, 0x16ad, 0x00fe, 0x007e, + 0x006e, 0x001e, 0x0005, 0x7004, 0xc09d, 0x7006, 0x0005, 0x7104, + 0x9184, 0x0004, 0x190c, 0x0d79, 0xd184, 0x11b1, 0xd19c, 0x0180, + 0xc19c, 0x7106, 0x0016, 0x080c, 0x1717, 0x001e, 0x0148, 0x2001, + 0x020d, 0x2003, 0x0050, 0x2003, 0x0020, 0x080c, 0x163c, 0x0005, + 0x81ff, 0x190c, 0x0d79, 0x0005, 0x2100, 0xc184, 0xc1b4, 0x7106, + 0xd0b4, 0x0016, 0x00e6, 0x1904, 0x1606, 0x2071, 0x0200, 0x080c, + 0x1704, 0x05e0, 0x080c, 0x1717, 0x05b0, 0x6014, 0x9005, 0x05b0, + 0x0096, 0x2048, 0xa864, 0x009e, 0x9084, 0x00ff, 0x908e, 0x0029, + 0x0160, 0x908e, 0x0048, 0x1550, 0x601c, 0xd084, 0x11e0, 0x00f6, + 0x2c78, 0x080c, 0x17a1, 0x00fe, 0x00b0, 0x00f6, 0x2c78, 0x080c, + 0x192a, 0x00fe, 0x2009, 0x01f4, 0x8109, 0x0168, 0x2001, 0x0201, + 0x2004, 0x9005, 0x0dc8, 0x2001, 0x0218, 0x2004, 0xd0ec, 0x1118, + 0x080c, 0x163c, 0x0040, 0x2001, 0x020d, 0x2003, 0x0020, 0x080c, + 0x135a, 0x7803, 0x0001, 0x00ee, 0x001e, 0x0005, 0x080c, 0x1717, + 0x0dd0, 0x2001, 0x020d, 0x2003, 0x0050, 0x2003, 0x0020, 0x0461, + 0x0c90, 0x0429, 0x2060, 0x2009, 0x0053, 0x080c, 0xafec, 0x0005, + 0x0005, 0x0005, 0x00e1, 0x2008, 0x00d1, 0x0006, 0x7004, 0xc09d, + 0x7006, 0x000e, 0x080c, 0x916f, 0x0005, 0x0089, 0x9005, 0x0118, + 0x080c, 0x8d72, 0x0cd0, 0x0005, 0x2001, 0x0036, 0x2009, 0x1820, + 0x210c, 0x2011, 0x181f, 0x2214, 0x080c, 0x16ad, 0x0005, 0x7808, + 0xd09c, 0x0de8, 0x7820, 0x0005, 0x080c, 0x1586, 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, 0x169f, 0x6827, + 0x0001, 0x8109, 0x1dd0, 0x04d9, 0x6827, 0x0002, 0x04c1, 0x6804, + 0x9005, 0x1130, 0x682c, 0xd0e4, 0x1500, 0x6804, 0x9005, 0x0de8, + 0x79b8, 0xd1ec, 0x1130, 0x08c0, 0x080c, 0x8151, 0x080c, 0x1b3b, + 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, 0x1a6f, 0x7008, 0x9005, 0x1110, 0x78e3, + 0x0c0c, 0x8000, 0x700a, 0x0026, 0x2011, 0x0006, 0x7808, 0xd09c, + 0x0150, 0x0016, 0x0026, 0x00c6, 0x080c, 0x13c8, 0x00ce, 0x002e, + 0x001e, 0x8211, 0x1d98, 0x002e, 0x000e, 0x0006, 0x7832, 0x7936, + 0x7a3a, 0x781b, 0x8080, 0x00b9, 0x1178, 0x2071, 0x1a6f, 0x7008, + 0x9005, 0x0130, 0x8001, 0x0a0c, 0x0d79, 0x700a, 0x78e3, 0x0c00, + 0x000e, 0x00ee, 0x00fe, 0x0005, 0x000e, 0x792c, 0x3900, 0x8000, + 0x2004, 0x080c, 0x0d79, 0x2009, 0xff00, 0x8109, 0x0120, 0x7818, + 0xd0bc, 0x1dd8, 0x0005, 0x9085, 0x0001, 0x0005, 0x7832, 0x7936, + 0x7a3a, 0x781b, 0x8080, 0x0c79, 0x1108, 0x0005, 0x792c, 0x3900, + 0x8000, 0x2004, 0x080c, 0x0d79, 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, 0x8151, 0x080c, 0x1b3b, 0x9006, + 0x00ee, 0x004e, 0x000e, 0x0005, 0x0c11, 0x1108, 0x0005, 0x00e6, + 0x0016, 0x2071, 0x0200, 0x0841, 0x6124, 0xd1dc, 0x01f8, 0x701c, + 0xd08c, 0x0904, 0x1796, 0x7017, 0x0000, 0x2001, 0x0264, 0x2004, + 0xd0bc, 0x0904, 0x1796, 0x2001, 0x0268, 0x00c6, 0x2064, 0x6104, + 0x6038, 0x00ce, 0x918e, 0x0039, 0x1904, 0x1796, 0x9c06, 0x15f0, + 0x0126, 0x2091, 0x2600, 0x080c, 0x80a9, 0x012e, 0x7358, 0x745c, + 0x6014, 0x905d, 0x0598, 0x2b48, 0x6010, 0x00b6, 0x2058, 0xb800, + 0x00be, 0xd0bc, 0x190c, 0xd011, 0xab42, 0xac3e, 0x2001, 0x1869, + 0x2004, 0xd0b4, 0x1170, 0x601c, 0xd0e4, 0x1158, 0x6010, 0x00b6, + 0x2058, 0xb800, 0x00be, 0xd0bc, 0x1120, 0xa83b, 0x7fff, 0xa837, + 0xffff, 0x080c, 0x1efe, 0x1190, 0x080c, 0x1987, 0x2a00, 0xa816, + 0x0130, 0x2800, 0xa80e, 0x2c05, 0xa80a, 0x2c00, 0xa812, 0x7037, + 0x0020, 0x781f, 0x0300, 0x001e, 0x00ee, 0x0005, 0x7037, 0x0050, + 0x7037, 0x0020, 0x001e, 0x00ee, 0x080c, 0x163c, 0x0005, 0x080c, + 0x0d79, 0x2cf0, 0x0126, 0x2091, 0x2200, 0x0016, 0x00c6, 0x3e60, + 0x6014, 0x2048, 0x2940, 0x903e, 0x2730, 0xa864, 0x2068, 0xa81a, + 0x9d84, 0x000f, 0x9088, 0x1ede, 0x2165, 0x0002, 0x17cd, 0x183b, + 0x17cd, 0x17cd, 0x17d1, 0x181c, 0x17cd, 0x17f1, 0x17c6, 0x1832, + 0x17cd, 0x17cd, 0x17d6, 0x1928, 0x1805, 0x17fb, 0xa964, 0x918c, + 0x00ff, 0x918e, 0x0048, 0x0904, 0x1832, 0x9085, 0x0001, 0x0804, + 0x191e, 0xa87c, 0xd0ac, 0x0dc8, 0x0804, 0x1842, 0xa87c, 0xd0ac, + 0x0da0, 0x0804, 0x18ad, 0xa898, 0x901d, 0x1108, 0xab9c, 0x9016, + 0xaab2, 0xaa3e, 0xaa42, 0x3e00, 0x9080, 0x0008, 0x2004, 0x9080, + 0x933f, 0x2005, 0x9005, 0x090c, 0x0d79, 0x2004, 0xa8ae, 0x0804, + 0x1906, 0xa87c, 0xd0bc, 0x09c8, 0xa890, 0xa842, 0xa88c, 0xa83e, + 0xa888, 0x0804, 0x1842, 0xa87c, 0xd0bc, 0x0978, 0xa890, 0xa842, + 0xa88c, 0xa83e, 0xa888, 0x0804, 0x18ad, 0xa87c, 0xd0bc, 0x0928, + 0xa890, 0xa842, 0xa88c, 0xa83e, 0xa804, 0x9045, 0x090c, 0x0d79, + 0xa164, 0xa91a, 0x91ec, 0x000f, 0x9d80, 0x1ede, 0x2065, 0xa888, + 0xd19c, 0x1904, 0x18ad, 0x0430, 0xa87c, 0xd0ac, 0x0904, 0x17cd, + 0xa804, 0x9045, 0x090c, 0x0d79, 0xa164, 0xa91a, 0x91ec, 0x000f, + 0x9d80, 0x1ede, 0x2065, 0x9006, 0xa842, 0xa83e, 0xd19c, 0x1904, + 0x18ad, 0x0080, 0xa87c, 0xd0ac, 0x0904, 0x17cd, 0x9006, 0xa842, + 0xa83e, 0x0804, 0x18ad, 0xa87c, 0xd0ac, 0x0904, 0x17cd, 0x9006, + 0xa842, 0xa83e, 0x2c05, 0x908a, 0x0036, 0x1a0c, 0x0d79, 0x9082, + 0x001b, 0x0002, 0x1865, 0x1865, 0x1867, 0x1865, 0x1865, 0x1865, + 0x1871, 0x1865, 0x1865, 0x1865, 0x187b, 0x1865, 0x1865, 0x1865, + 0x1885, 0x1865, 0x1865, 0x1865, 0x188f, 0x1865, 0x1865, 0x1865, + 0x1899, 0x1865, 0x1865, 0x1865, 0x18a3, 0x080c, 0x0d79, 0xa574, + 0xa478, 0x9d86, 0x0024, 0x0904, 0x17db, 0xa37c, 0xa280, 0x0804, + 0x1906, 0xa584, 0xa488, 0x9d86, 0x0024, 0x0904, 0x17db, 0xa38c, + 0xa290, 0x0804, 0x1906, 0xa594, 0xa498, 0x9d86, 0x0024, 0x0904, + 0x17db, 0xa39c, 0xa2a0, 0x0804, 0x1906, 0xa5a4, 0xa4a8, 0x9d86, + 0x0024, 0x0904, 0x17db, 0xa3ac, 0xa2b0, 0x0804, 0x1906, 0xa5b4, + 0xa4b8, 0x9d86, 0x0024, 0x0904, 0x17db, 0xa3bc, 0xa2c0, 0x0804, + 0x1906, 0xa5c4, 0xa4c8, 0x9d86, 0x0024, 0x0904, 0x17db, 0xa3cc, + 0xa2d0, 0x0804, 0x1906, 0xa5d4, 0xa4d8, 0x9d86, 0x0024, 0x0904, + 0x17db, 0xa3dc, 0xa2e0, 0x0804, 0x1906, 0x2c05, 0x908a, 0x0034, + 0x1a0c, 0x0d79, 0x9082, 0x001b, 0x0002, 0x18d0, 0x18ce, 0x18ce, + 0x18ce, 0x18ce, 0x18ce, 0x18db, 0x18ce, 0x18ce, 0x18ce, 0x18ce, + 0x18ce, 0x18e6, 0x18ce, 0x18ce, 0x18ce, 0x18ce, 0x18ce, 0x18f1, + 0x18ce, 0x18ce, 0x18ce, 0x18ce, 0x18ce, 0x18fc, 0x080c, 0x0d79, + 0xa56c, 0xa470, 0xa774, 0xa678, 0x9d86, 0x002c, 0x0904, 0x17db, + 0xa37c, 0xa280, 0x0458, 0xa584, 0xa488, 0xa78c, 0xa690, 0x9d86, + 0x002c, 0x0904, 0x17db, 0xa394, 0xa298, 0x0400, 0xa59c, 0xa4a0, + 0xa7a4, 0xa6a8, 0x9d86, 0x002c, 0x0904, 0x17db, 0xa3ac, 0xa2b0, + 0x00a8, 0xa5b4, 0xa4b8, 0xa7bc, 0xa6c0, 0x9d86, 0x002c, 0x0904, + 0x17db, 0xa3c4, 0xa2c8, 0x0050, 0xa5cc, 0xa4d0, 0xa7d4, 0xa6d8, + 0x9d86, 0x002c, 0x0904, 0x17db, 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, 0x17cd, 0x2ff0, 0x0126, 0x2091, 0x2200, 0x0016, 0x00c6, + 0x3e60, 0x6014, 0x2048, 0x2940, 0xa80e, 0x2061, 0x1ed9, 0xa813, + 0x1ed9, 0x2c05, 0xa80a, 0xa964, 0xa91a, 0xa87c, 0xd0ac, 0x090c, + 0x0d79, 0x9006, 0xa842, 0xa83e, 0x2c05, 0x908a, 0x0034, 0x1a0c, + 0x0d79, 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, 0x0d79, + 0xa80e, 0xa064, 0xa81a, 0x9084, 0x000f, 0x9080, 0x1ede, 0x2015, + 0x82ff, 0x090c, 0x0d79, 0xaa12, 0x2205, 0xa80a, 0x0c08, 0x903e, + 0x2730, 0xa880, 0xd0fc, 0x1190, 0x2d00, 0x0002, 0x1ab1, 0x19de, + 0x19de, 0x1ab1, 0x19de, 0x1aab, 0x1ab1, 0x19de, 0x1a4e, 0x1a4e, + 0x1a4e, 0x1ab1, 0x1a4e, 0x1ab1, 0x1aa8, 0x1a4e, 0xc0fc, 0xa882, + 0xab2c, 0xaa30, 0xad1c, 0xac20, 0xdd9c, 0x0904, 0x1ab3, 0x2c05, + 0x908a, 0x0034, 0x1a0c, 0x0d79, 0x9082, 0x001b, 0x0002, 0x19ca, + 0x19c8, 0x19c8, 0x19c8, 0x19c8, 0x19c8, 0x19ce, 0x19c8, 0x19c8, + 0x19c8, 0x19c8, 0x19c8, 0x19d2, 0x19c8, 0x19c8, 0x19c8, 0x19c8, + 0x19c8, 0x19d6, 0x19c8, 0x19c8, 0x19c8, 0x19c8, 0x19c8, 0x19da, + 0x080c, 0x0d79, 0xa774, 0xa678, 0x0804, 0x1ab3, 0xa78c, 0xa690, + 0x0804, 0x1ab3, 0xa7a4, 0xa6a8, 0x0804, 0x1ab3, 0xa7bc, 0xa6c0, + 0x0804, 0x1ab3, 0xa7d4, 0xa6d8, 0x0804, 0x1ab3, 0xa898, 0x901d, + 0x1108, 0xab9c, 0x9016, 0x2c05, 0x908a, 0x0036, 0x1a0c, 0x0d79, + 0x9082, 0x001b, 0x0002, 0x1a06, 0x1a06, 0x1a08, 0x1a06, 0x1a06, + 0x1a06, 0x1a12, 0x1a06, 0x1a06, 0x1a06, 0x1a1c, 0x1a06, 0x1a06, + 0x1a06, 0x1a26, 0x1a06, 0x1a06, 0x1a06, 0x1a30, 0x1a06, 0x1a06, + 0x1a06, 0x1a3a, 0x1a06, 0x1a06, 0x1a06, 0x1a44, 0x080c, 0x0d79, + 0xa574, 0xa478, 0x9d86, 0x0004, 0x0904, 0x1ab3, 0xa37c, 0xa280, + 0x0804, 0x1ab3, 0xa584, 0xa488, 0x9d86, 0x0004, 0x0904, 0x1ab3, + 0xa38c, 0xa290, 0x0804, 0x1ab3, 0xa594, 0xa498, 0x9d86, 0x0004, + 0x0904, 0x1ab3, 0xa39c, 0xa2a0, 0x0804, 0x1ab3, 0xa5a4, 0xa4a8, + 0x9d86, 0x0004, 0x0904, 0x1ab3, 0xa3ac, 0xa2b0, 0x0804, 0x1ab3, + 0xa5b4, 0xa4b8, 0x9d86, 0x0004, 0x0904, 0x1ab3, 0xa3bc, 0xa2c0, + 0x0804, 0x1ab3, 0xa5c4, 0xa4c8, 0x9d86, 0x0004, 0x0904, 0x1ab3, + 0xa3cc, 0xa2d0, 0x0804, 0x1ab3, 0xa5d4, 0xa4d8, 0x9d86, 0x0004, + 0x0904, 0x1ab3, 0xa3dc, 0xa2e0, 0x0804, 0x1ab3, 0xa898, 0x901d, + 0x1108, 0xab9c, 0x9016, 0x2c05, 0x908a, 0x0034, 0x1a0c, 0x0d79, + 0x9082, 0x001b, 0x0002, 0x1a76, 0x1a74, 0x1a74, 0x1a74, 0x1a74, + 0x1a74, 0x1a80, 0x1a74, 0x1a74, 0x1a74, 0x1a74, 0x1a74, 0x1a8a, + 0x1a74, 0x1a74, 0x1a74, 0x1a74, 0x1a74, 0x1a94, 0x1a74, 0x1a74, + 0x1a74, 0x1a74, 0x1a74, 0x1a9e, 0x080c, 0x0d79, 0xa56c, 0xa470, + 0xa774, 0xa678, 0x9d86, 0x000c, 0x05b0, 0xa37c, 0xa280, 0x0498, + 0xa584, 0xa488, 0xa78c, 0xa690, 0x9d86, 0x000c, 0x0560, 0xa394, + 0xa298, 0x0448, 0xa59c, 0xa4a0, 0xa7a4, 0xa6a8, 0x9d86, 0x000c, + 0x0510, 0xa3ac, 0xa2b0, 0x00f8, 0xa5b4, 0xa4b8, 0xa7bc, 0xa6c0, + 0x9d86, 0x000c, 0x01c0, 0xa3c4, 0xa2c8, 0x00a8, 0xa5cc, 0xa4d0, + 0xa7d4, 0xa6d8, 0x9d86, 0x000c, 0x0170, 0xa3dc, 0xa2e0, 0x0058, + 0x9d86, 0x000e, 0x1130, 0x080c, 0x1eb4, 0x1904, 0x1987, 0x900e, + 0x0050, 0x080c, 0x0d79, 0xab2e, 0xaa32, 0xad1e, 0xac22, 0xaf26, + 0xae2a, 0x080c, 0x1eb4, 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, 0xafec, 0x0005, 0xa974, 0xd1dc, 0x1108, 0x0005, + 0xa934, 0xa88c, 0x9106, 0x1158, 0xa938, 0xa890, 0x9106, 0x1138, + 0x601c, 0xc084, 0x601e, 0x2009, 0x0048, 0x0804, 0xafec, 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, 0x13c8, 0x8631, 0x1db8, 0x00ce, 0x781f, + 0x0800, 0x2031, 0x0168, 0x00c6, 0x7808, 0xd09c, 0x190c, 0x13c8, + 0x00ce, 0x2001, 0x0038, 0x080c, 0x1bcb, 0x7930, 0x9186, 0x0040, + 0x0160, 0x9186, 0x0042, 0x190c, 0x0d79, 0x2001, 0x001e, 0x8001, + 0x1df0, 0x8631, 0x1d40, 0x080c, 0x1bda, 0x000e, 0x6022, 0x012e, + 0x0005, 0x080c, 0x1bc7, 0x7827, 0x0015, 0x7828, 0x9c06, 0x1db8, + 0x782b, 0x0000, 0x0ca0, 0x00f6, 0x2079, 0x0300, 0x7803, 0x0000, + 0x78ab, 0x0004, 0x2001, 0xf000, 0x8001, 0x090c, 0x0d79, 0x7aac, + 0xd2ac, 0x1dd0, 0x00fe, 0x080c, 0x769d, 0x1188, 0x2001, 0x0138, + 0x2003, 0x0000, 0x2001, 0x0160, 0x2003, 0x0000, 0x2011, 0x012c, + 0xa001, 0xa001, 0x8211, 0x1de0, 0x0059, 0x0804, 0x773f, 0x0479, + 0x0039, 0x2001, 0x0160, 0x2502, 0x2001, 0x0138, 0x2202, 0x0005, + 0x00e6, 0x2071, 0x0200, 0x080c, 0x2a94, 0x2009, 0x003c, 0x080c, + 0x223d, 0x2001, 0x015d, 0x2003, 0x0000, 0x7000, 0x9084, 0x003c, + 0x1de0, 0x080c, 0x8732, 0x70a0, 0x70a2, 0x7098, 0x709a, 0x709c, + 0x709e, 0x2001, 0x020d, 0x2003, 0x0020, 0x00f6, 0x2079, 0x0300, + 0x080c, 0x135a, 0x7803, 0x0001, 0x00fe, 0x00ee, 0x0005, 0x2001, + 0x0138, 0x2014, 0x2003, 0x0000, 0x2001, 0x0160, 0x202c, 0x2003, + 0x0000, 0x080c, 0x769d, 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, 0x16ad, 0x7930, + 0x0005, 0x2c08, 0x621c, 0x080c, 0x16f6, 0x7930, 0x0005, 0x8001, + 0x1df0, 0x0005, 0x2031, 0x0064, 0x781c, 0x9084, 0x0007, 0x0170, + 0x2001, 0x0038, 0x0c41, 0x9186, 0x0040, 0x0904, 0x1c38, 0x2001, + 0x001e, 0x0c69, 0x8631, 0x1d80, 0x080c, 0x0d79, 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, 0x1bd1, 0x9186, 0x0040, 0x190c, 0x0d79, + 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, 0x0d79, 0xa001, 0xa001, 0x781f, 0x0200, + 0x0005, 0x0126, 0x2091, 0x2400, 0x2079, 0x0380, 0x2001, 0x19e9, + 0x2070, 0x012e, 0x0005, 0x2cf0, 0x0126, 0x2091, 0x2400, 0x3e60, + 0x6014, 0x2048, 0xa964, 0xa91a, 0x918c, 0x00ff, 0x9184, 0x000f, + 0x0002, 0x1c6d, 0x1c6d, 0x1c6d, 0x1c6f, 0x1c6d, 0x1c6d, 0x1c6d, + 0x1c6d, 0x1c61, 0x1c77, 0x1c6d, 0x1c73, 0x1c6d, 0x1c6d, 0x1c6d, + 0x1c6d, 0x9086, 0x0008, 0x1148, 0xa87c, 0xd0b4, 0x0904, 0x1de7, + 0x2011, 0x1ed9, 0x2205, 0xab88, 0x00a8, 0x080c, 0x0d79, 0x9186, + 0x0013, 0x0128, 0x0cd0, 0x9186, 0x001b, 0x0108, 0x0cb0, 0xa87c, + 0xd0b4, 0x0904, 0x1de7, 0x9184, 0x000f, 0x9080, 0x1ede, 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, 0x1ede, 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, 0x1db1, 0xc1dd, 0xa97e, 0x9006, + 0xa842, 0xa83e, 0xa988, 0x8109, 0xa916, 0xa964, 0xa91a, 0x9184, + 0x000f, 0x9088, 0x1ede, 0x2145, 0x0002, 0x1ce5, 0x1cf3, 0x1ce5, + 0x1ce5, 0x1ce5, 0x1ce7, 0x1ce5, 0x1ce5, 0x1d48, 0x1d48, 0x1ce5, + 0x1ce5, 0x1ce5, 0x1d46, 0x1ce5, 0x1ce5, 0x080c, 0x0d79, 0xa804, + 0x2050, 0xb164, 0xa91a, 0x9184, 0x000f, 0x9080, 0x1ede, 0x2045, + 0xd19c, 0x1904, 0x1d48, 0x9036, 0x2638, 0x2805, 0x908a, 0x0036, + 0x1a0c, 0x0d79, 0x9082, 0x001b, 0x0002, 0x1d18, 0x1d18, 0x1d1a, + 0x1d18, 0x1d18, 0x1d18, 0x1d20, 0x1d18, 0x1d18, 0x1d18, 0x1d26, + 0x1d18, 0x1d18, 0x1d18, 0x1d2c, 0x1d18, 0x1d18, 0x1d18, 0x1d32, + 0x1d18, 0x1d18, 0x1d18, 0x1d38, 0x1d18, 0x1d18, 0x1d18, 0x1d3e, + 0x080c, 0x0d79, 0xb574, 0xb478, 0xb37c, 0xb280, 0x0804, 0x1d8d, + 0xb584, 0xb488, 0xb38c, 0xb290, 0x0804, 0x1d8d, 0xb594, 0xb498, + 0xb39c, 0xb2a0, 0x0804, 0x1d8d, 0xb5a4, 0xb4a8, 0xb3ac, 0xb2b0, + 0x0804, 0x1d8d, 0xb5b4, 0xb4b8, 0xb3bc, 0xb2c0, 0x0804, 0x1d8d, + 0xb5c4, 0xb4c8, 0xb3cc, 0xb2d0, 0x0804, 0x1d8d, 0xb5d4, 0xb4d8, + 0xb3dc, 0xb2e0, 0x0804, 0x1d8d, 0x0804, 0x1d8d, 0x080c, 0x0d79, + 0x2805, 0x908a, 0x0034, 0x1a0c, 0x0d79, 0x9082, 0x001b, 0x0002, + 0x1d6b, 0x1d69, 0x1d69, 0x1d69, 0x1d69, 0x1d69, 0x1d72, 0x1d69, + 0x1d69, 0x1d69, 0x1d69, 0x1d69, 0x1d79, 0x1d69, 0x1d69, 0x1d69, + 0x1d69, 0x1d69, 0x1d80, 0x1d69, 0x1d69, 0x1d69, 0x1d69, 0x1d69, + 0x1d87, 0x080c, 0x0d79, 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, 0x0d79, 0x2050, 0xb164, 0xa91a, 0x9184, 0x000f, 0x9080, + 0x1ede, 0x2045, 0x2805, 0x2810, 0x2a08, 0xa80a, 0xa90e, 0xaa12, + 0x0c30, 0x3e60, 0x6344, 0xd3fc, 0x190c, 0x0d79, 0xa93c, 0xaa40, + 0xa844, 0x9106, 0x1118, 0xa848, 0x9206, 0x0508, 0x2958, 0xab48, + 0xac44, 0x2940, 0x080c, 0x1efe, 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, 0x1d9a, 0x2009, + 0x8005, 0x3e60, 0x6044, 0x9105, 0x6046, 0x0804, 0x1d97, 0x080c, + 0x0d79, 0x00f6, 0x00e6, 0x0096, 0x00c6, 0x0026, 0x704c, 0x9c06, + 0x190c, 0x0d79, 0x2079, 0x0090, 0x2001, 0x0105, 0x2003, 0x0010, + 0x782b, 0x0004, 0x7057, 0x0000, 0x6014, 0x2048, 0x080c, 0xcc33, + 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, 0xc81b, 0x080c, 0xaaf7, 0x00ce, 0x704c, 0x9c06, + 0x1150, 0x2009, 0x0040, 0x080c, 0x223d, 0x080c, 0xa59c, 0x2011, + 0x0000, 0x080c, 0xa430, 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, 0x0d79, 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, 0x19e9, 0x7054, 0x9086, 0x0000, + 0x0904, 0x1eaf, 0x2079, 0x0090, 0x2009, 0x0207, 0x210c, 0xd194, + 0x01b8, 0x2009, 0x020c, 0x210c, 0x9184, 0x0003, 0x0188, 0x080c, + 0xec09, 0x2001, 0x0133, 0x2004, 0x9005, 0x090c, 0x0d79, 0x0016, + 0x2009, 0x0040, 0x080c, 0x223d, 0x001e, 0x2001, 0x020c, 0x2102, + 0x2009, 0x0206, 0x2104, 0x2009, 0x0203, 0x210c, 0x9106, 0x1120, + 0x2009, 0x0040, 0x080c, 0x223d, 0x782c, 0xd0fc, 0x09a8, 0x080c, + 0xab13, 0x782c, 0xd0fc, 0x1de8, 0x080c, 0xaaf7, 0x7054, 0x9086, + 0x0000, 0x1950, 0x782b, 0x0004, 0x782c, 0xd0ac, 0x1de8, 0x2009, + 0x0040, 0x080c, 0x223d, 0x782b, 0x0002, 0x7057, 0x0000, 0x00ee, + 0x00fe, 0x0005, 0x080c, 0x0d79, 0x8c60, 0x2c05, 0x9005, 0x0110, + 0x8a51, 0x0005, 0xa004, 0x9005, 0x0168, 0xa85a, 0x2040, 0xa064, + 0x9084, 0x000f, 0x9080, 0x1ede, 0x2065, 0x8cff, 0x090c, 0x0d79, + 0x8a51, 0x0005, 0x2050, 0x0005, 0x0000, 0x001d, 0x0021, 0x0025, + 0x0029, 0x002d, 0x0031, 0x0035, 0x0000, 0x001b, 0x0021, 0x0027, + 0x002d, 0x0033, 0x0000, 0x0000, 0x0023, 0x0000, 0x0000, 0x1ed1, + 0x1ecd, 0x1ed1, 0x1ed1, 0x1edb, 0x0000, 0x1ed1, 0x1ed8, 0x1ed8, + 0x1ed5, 0x1ed8, 0x1ed8, 0x0000, 0x1edb, 0x1ed8, 0x0000, 0x1ed3, + 0x1ed3, 0x0000, 0x1ed3, 0x1edb, 0x0000, 0x1ed3, 0x1ed9, 0x1ed9, + 0x1ed9, 0x0000, 0x1ed9, 0x0000, 0x1edb, 0x1ed9, 0x00c6, 0x00d6, + 0x0086, 0xab42, 0xac3e, 0xa888, 0x9055, 0x0904, 0x20dd, 0x2940, + 0xa064, 0x90ec, 0x000f, 0x9084, 0x00ff, 0x9086, 0x0008, 0x1118, + 0x2061, 0x1ed9, 0x00d0, 0x9de0, 0x1ede, 0x9d86, 0x0007, 0x0130, + 0x9d86, 0x000e, 0x0118, 0x9d86, 0x000f, 0x1120, 0xa08c, 0x9422, + 0xa090, 0x931b, 0x2c05, 0x9065, 0x1140, 0x0310, 0x0804, 0x20dd, + 0xa004, 0x9045, 0x0904, 0x20dd, 0x08d8, 0x2c05, 0x9005, 0x0904, + 0x1fc5, 0xdd9c, 0x1904, 0x1f81, 0x908a, 0x0036, 0x1a0c, 0x0d79, + 0x9082, 0x001b, 0x0002, 0x1f56, 0x1f56, 0x1f58, 0x1f56, 0x1f56, + 0x1f56, 0x1f5e, 0x1f56, 0x1f56, 0x1f56, 0x1f64, 0x1f56, 0x1f56, + 0x1f56, 0x1f6a, 0x1f56, 0x1f56, 0x1f56, 0x1f70, 0x1f56, 0x1f56, + 0x1f56, 0x1f76, 0x1f56, 0x1f56, 0x1f56, 0x1f7c, 0x080c, 0x0d79, + 0xa07c, 0x9422, 0xa080, 0x931b, 0x0804, 0x1fbb, 0xa08c, 0x9422, + 0xa090, 0x931b, 0x0804, 0x1fbb, 0xa09c, 0x9422, 0xa0a0, 0x931b, + 0x0804, 0x1fbb, 0xa0ac, 0x9422, 0xa0b0, 0x931b, 0x0804, 0x1fbb, + 0xa0bc, 0x9422, 0xa0c0, 0x931b, 0x0804, 0x1fbb, 0xa0cc, 0x9422, + 0xa0d0, 0x931b, 0x0804, 0x1fbb, 0xa0dc, 0x9422, 0xa0e0, 0x931b, + 0x04d0, 0x908a, 0x0034, 0x1a0c, 0x0d79, 0x9082, 0x001b, 0x0002, + 0x1fa3, 0x1fa1, 0x1fa1, 0x1fa1, 0x1fa1, 0x1fa1, 0x1fa8, 0x1fa1, + 0x1fa1, 0x1fa1, 0x1fa1, 0x1fa1, 0x1fad, 0x1fa1, 0x1fa1, 0x1fa1, + 0x1fa1, 0x1fa1, 0x1fb2, 0x1fa1, 0x1fa1, 0x1fa1, 0x1fa1, 0x1fa1, + 0x1fb7, 0x080c, 0x0d79, 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, 0x20dd, 0x8c60, 0x0804, 0x1f2d, 0xa004, 0x9045, 0x0904, + 0x20dd, 0x0804, 0x1f08, 0x8a51, 0x0904, 0x20dd, 0x8c60, 0x2c05, + 0x9005, 0x1158, 0xa004, 0x9045, 0x0904, 0x20dd, 0xa064, 0x90ec, + 0x000f, 0x9de0, 0x1ede, 0x2c05, 0x2060, 0xa880, 0xc0fc, 0xa882, + 0x0804, 0x20d2, 0x2c05, 0x8422, 0x8420, 0x831a, 0x9399, 0x0000, + 0xac2e, 0xab32, 0xdd9c, 0x1904, 0x206f, 0x9082, 0x001b, 0x0002, + 0x200b, 0x200b, 0x200d, 0x200b, 0x200b, 0x200b, 0x201b, 0x200b, + 0x200b, 0x200b, 0x2029, 0x200b, 0x200b, 0x200b, 0x2037, 0x200b, + 0x200b, 0x200b, 0x2045, 0x200b, 0x200b, 0x200b, 0x2053, 0x200b, + 0x200b, 0x200b, 0x2061, 0x080c, 0x0d79, 0xa17c, 0x2400, 0x9122, + 0xa180, 0x2300, 0x911b, 0x0a0c, 0x0d79, 0xa074, 0x9420, 0xa078, + 0x9319, 0x0804, 0x20cd, 0xa18c, 0x2400, 0x9122, 0xa190, 0x2300, + 0x911b, 0x0a0c, 0x0d79, 0xa084, 0x9420, 0xa088, 0x9319, 0x0804, + 0x20cd, 0xa19c, 0x2400, 0x9122, 0xa1a0, 0x2300, 0x911b, 0x0a0c, + 0x0d79, 0xa094, 0x9420, 0xa098, 0x9319, 0x0804, 0x20cd, 0xa1ac, + 0x2400, 0x9122, 0xa1b0, 0x2300, 0x911b, 0x0a0c, 0x0d79, 0xa0a4, + 0x9420, 0xa0a8, 0x9319, 0x0804, 0x20cd, 0xa1bc, 0x2400, 0x9122, + 0xa1c0, 0x2300, 0x911b, 0x0a0c, 0x0d79, 0xa0b4, 0x9420, 0xa0b8, + 0x9319, 0x0804, 0x20cd, 0xa1cc, 0x2400, 0x9122, 0xa1d0, 0x2300, + 0x911b, 0x0a0c, 0x0d79, 0xa0c4, 0x9420, 0xa0c8, 0x9319, 0x0804, + 0x20cd, 0xa1dc, 0x2400, 0x9122, 0xa1e0, 0x2300, 0x911b, 0x0a0c, + 0x0d79, 0xa0d4, 0x9420, 0xa0d8, 0x9319, 0x0804, 0x20cd, 0x9082, + 0x001b, 0x0002, 0x208d, 0x208b, 0x208b, 0x208b, 0x208b, 0x208b, + 0x209a, 0x208b, 0x208b, 0x208b, 0x208b, 0x208b, 0x20a7, 0x208b, + 0x208b, 0x208b, 0x208b, 0x208b, 0x20b4, 0x208b, 0x208b, 0x208b, + 0x208b, 0x208b, 0x20c1, 0x080c, 0x0d79, 0xa17c, 0x2400, 0x9122, + 0xa180, 0x2300, 0x911b, 0x0a0c, 0x0d79, 0xa06c, 0x9420, 0xa070, + 0x9319, 0x0498, 0xa194, 0x2400, 0x9122, 0xa198, 0x2300, 0x911b, + 0x0a0c, 0x0d79, 0xa084, 0x9420, 0xa088, 0x9319, 0x0430, 0xa1ac, + 0x2400, 0x9122, 0xa1b0, 0x2300, 0x911b, 0x0a0c, 0x0d79, 0xa09c, + 0x9420, 0xa0a0, 0x9319, 0x00c8, 0xa1c4, 0x2400, 0x9122, 0xa1c8, + 0x2300, 0x911b, 0x0a0c, 0x0d79, 0xa0b4, 0x9420, 0xa0b8, 0x9319, + 0x0060, 0xa1dc, 0x2400, 0x9122, 0xa1e0, 0x2300, 0x911b, 0x0a0c, + 0x0d79, 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, 0x0d72, 0xd094, 0x0110, 0x080c, + 0x11fc, 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, 0x223a, 0x7900, + 0xd1dc, 0x1118, 0x9084, 0x0006, 0x001a, 0x9084, 0x000e, 0x0002, + 0x2158, 0x2150, 0x80a9, 0x2150, 0x2152, 0x2152, 0x2152, 0x2152, + 0x808f, 0x2150, 0x2154, 0x2150, 0x2152, 0x2150, 0x2152, 0x2150, + 0x080c, 0x0d79, 0x0031, 0x0020, 0x080c, 0x808f, 0x080c, 0x80a9, + 0x0005, 0x0006, 0x0016, 0x0026, 0x080c, 0xec09, 0x7930, 0x9184, + 0x0003, 0x0510, 0x080c, 0xaaf7, 0x2001, 0x19fc, 0x2004, 0x9005, + 0x01a0, 0x2001, 0x0133, 0x2004, 0x9005, 0x090c, 0x0d79, 0x00c6, + 0x2001, 0x19fc, 0x2064, 0x080c, 0xab13, 0x080c, 0xc81b, 0x2009, + 0x0040, 0x080c, 0x223d, 0x00ce, 0x0408, 0x2009, 0x0040, 0x080c, + 0x223d, 0x080c, 0xab13, 0x00d0, 0x9184, 0x0014, 0x01a0, 0x6a00, + 0x9286, 0x0003, 0x0160, 0x080c, 0x769d, 0x1138, 0x080c, 0x799f, + 0x080c, 0x6178, 0x080c, 0x75cc, 0x0010, 0x080c, 0x6033, 0x080c, + 0x8147, 0x0041, 0x0018, 0x9184, 0x9540, 0x1dc8, 0x002e, 0x001e, + 0x000e, 0x0005, 0x00e6, 0x0036, 0x0046, 0x0056, 0x2071, 0x1a6f, + 0x080c, 0x1b3b, 0x005e, 0x004e, 0x003e, 0x00ee, 0x0005, 0x0126, + 0x2091, 0x2e00, 0x2071, 0x1800, 0x7128, 0x2001, 0x1970, 0x2102, + 0x2001, 0x1978, 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, 0x0d72, 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, 0x2a8e, 0x080c, 0x29a8, 0x2001, 0x199e, 0x2003, + 0x0700, 0x2001, 0x199f, 0x2003, 0x0700, 0x080c, 0x2aff, 0x9006, + 0x080c, 0x29d7, 0x9006, 0x080c, 0x29ba, 0x20a9, 0x0012, 0x1d04, + 0x226f, 0x2091, 0x6000, 0x1f04, 0x226f, 0x602f, 0x0100, 0x602f, + 0x0000, 0x6050, 0x9085, 0x0400, 0x9084, 0xdfff, 0x6052, 0x6224, + 0x080c, 0x2adc, 0x080c, 0x26da, 0x2009, 0x00ef, 0x6132, 0x6136, + 0x080c, 0x26ea, 0x60e7, 0x0000, 0x61ea, 0x60e3, 0x0008, 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, + 0x22ad, 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, + 0x231b, 0x2318, 0x2318, 0x2318, 0x231a, 0x2318, 0x2318, 0x2318, + 0x080c, 0x0d79, 0x0029, 0x002e, 0x001e, 0x000e, 0x012e, 0x0005, + 0x00a6, 0x6124, 0x6028, 0xd09c, 0x0118, 0xd19c, 0x1904, 0x25a0, + 0xd1f4, 0x190c, 0x0d72, 0x080c, 0x769d, 0x0904, 0x2378, 0x080c, + 0xd35d, 0x1120, 0x7000, 0x9086, 0x0003, 0x0580, 0x6024, 0x9084, + 0x1800, 0x0560, 0x080c, 0x76c0, 0x0118, 0x080c, 0x76ae, 0x1530, + 0x2011, 0x0020, 0x080c, 0x2adc, 0x6043, 0x0000, 0x080c, 0xd35d, + 0x0168, 0x080c, 0x76c0, 0x1150, 0x2001, 0x19a9, 0x2003, 0x0001, + 0x6027, 0x1800, 0x080c, 0x7511, 0x0804, 0x25a3, 0x70a4, 0x9005, + 0x1150, 0x70a7, 0x0001, 0x00d6, 0x2069, 0x0140, 0x080c, 0x76f1, + 0x00de, 0x1904, 0x25a3, 0x080c, 0x79a9, 0x0428, 0x080c, 0x76c0, + 0x1590, 0x6024, 0x9084, 0x1800, 0x1108, 0x0468, 0x080c, 0x79a9, + 0x080c, 0x799f, 0x080c, 0x6178, 0x080c, 0x75cc, 0x0804, 0x25a0, + 0xd1ac, 0x1508, 0x6024, 0xd0dc, 0x1170, 0xd0e4, 0x1178, 0xd0d4, + 0x1190, 0xd0cc, 0x0130, 0x7098, 0x9086, 0x0029, 0x1110, 0x080c, + 0x7880, 0x0804, 0x25a0, 0x080c, 0x79a4, 0x0048, 0x2001, 0x197e, + 0x2003, 0x0002, 0x0020, 0x080c, 0x77db, 0x0804, 0x25a0, 0x080c, + 0x7923, 0x0804, 0x25a0, 0x6220, 0xd1bc, 0x0138, 0xd2bc, 0x1904, + 0x260b, 0xd2b4, 0x1904, 0x261d, 0x0000, 0xd1ac, 0x0904, 0x24ad, + 0x0036, 0x6328, 0xc3bc, 0x632a, 0x003e, 0x080c, 0x769d, 0x11d0, + 0x2011, 0x0020, 0x080c, 0x2adc, 0x0006, 0x0026, 0x0036, 0x080c, + 0x76b7, 0x1158, 0x080c, 0x799f, 0x080c, 0x6178, 0x080c, 0x75cc, + 0x003e, 0x002e, 0x000e, 0x00ae, 0x0005, 0x003e, 0x002e, 0x000e, + 0x080c, 0x7671, 0x0016, 0x0046, 0x00c6, 0x644c, 0x9486, 0xf0f0, + 0x1138, 0x2061, 0x0100, 0x644a, 0x6043, 0x0090, 0x6043, 0x0010, + 0x74da, 0x948c, 0xff00, 0x7038, 0xd084, 0x0190, 0x080c, 0xd35d, + 0x1118, 0x9186, 0xf800, 0x1160, 0x7048, 0xd084, 0x1148, 0xc085, + 0x704a, 0x0036, 0x2418, 0x2011, 0x8016, 0x080c, 0x4c28, 0x003e, + 0x080c, 0xd356, 0x1904, 0x2482, 0x9196, 0xff00, 0x05a8, 0x7060, + 0x9084, 0x00ff, 0x810f, 0x81ff, 0x0110, 0x9116, 0x0568, 0x7130, + 0xd184, 0x1550, 0x080c, 0x3468, 0x0128, 0xc18d, 0x7132, 0x080c, + 0x6bc5, 0x1510, 0x6240, 0x9294, 0x0010, 0x0130, 0x6248, 0x9294, + 0xff00, 0x9296, 0xff00, 0x01c0, 0x7030, 0xd08c, 0x0904, 0x2482, + 0x7038, 0xd08c, 0x1140, 0x2001, 0x180c, 0x200c, 0xd1ac, 0x1904, + 0x2482, 0xc1ad, 0x2102, 0x0036, 0x73d8, 0x2011, 0x8013, 0x080c, + 0x4c28, 0x003e, 0x0804, 0x2482, 0x7038, 0xd08c, 0x1140, 0x2001, + 0x180c, 0x200c, 0xd1ac, 0x1904, 0x2482, 0xc1ad, 0x2102, 0x0036, + 0x73d8, 0x2011, 0x8013, 0x080c, 0x4c28, 0x003e, 0x7130, 0xc185, + 0x7132, 0x2011, 0x1848, 0x220c, 0xd1a4, 0x01f0, 0x0016, 0x2009, + 0x0001, 0x2011, 0x0100, 0x080c, 0x8add, 0x2019, 0x000e, 0x00c6, + 0x2061, 0x0000, 0x080c, 0xe701, 0x00ce, 0x9484, 0x00ff, 0x9080, + 0x3474, 0x200d, 0x918c, 0xff00, 0x810f, 0x2120, 0x9006, 0x2009, + 0x000e, 0x080c, 0xe795, 0x001e, 0x0016, 0x2009, 0x0002, 0x2019, + 0x0004, 0x080c, 0x32c0, 0x001e, 0x00a8, 0x0156, 0x00b6, 0x20a9, + 0x007f, 0x900e, 0x080c, 0x6783, 0x1140, 0x7030, 0xd084, 0x1118, + 0xb800, 0xd0bc, 0x1110, 0x080c, 0x6192, 0x8108, 0x1f04, 0x2472, + 0x00be, 0x015e, 0x00ce, 0x004e, 0x080c, 0xaaf7, 0x080c, 0xadbe, + 0x080c, 0xae87, 0x080c, 0xab13, 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, 0x2adc, 0xd194, 0x0904, 0x25a0, + 0x0016, 0x080c, 0xaaf7, 0x6220, 0xd2b4, 0x0904, 0x253b, 0x080c, + 0x88e4, 0x080c, 0xa09b, 0x2011, 0x0004, 0x080c, 0x2adc, 0x00f6, + 0x2019, 0x19f5, 0x2304, 0x907d, 0x0904, 0x2508, 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, 0x2ab2, 0x2001, 0x001e, 0x8001, 0x0240, 0x20a9, 0x0009, + 0x080c, 0x2a69, 0x6904, 0xd1dc, 0x1140, 0x0cb0, 0x2001, 0x0100, + 0x080c, 0x2aa2, 0x9006, 0x080c, 0x2aa2, 0x080c, 0x97f6, 0x080c, + 0xab13, 0x7814, 0x2048, 0xa867, 0x0103, 0x2f60, 0x080c, 0xaf4e, + 0x009e, 0x00ee, 0x00ce, 0x00de, 0x00fe, 0x001e, 0x00ae, 0x0005, + 0x00fe, 0x00d6, 0x2069, 0x0140, 0x6804, 0x9084, 0x4000, 0x0110, + 0x080c, 0x2ab2, 0x00de, 0x00c6, 0x2061, 0x19e9, 0x6034, 0x080c, + 0xd35d, 0x0120, 0x909a, 0x0003, 0x1258, 0x0018, 0x909a, 0x00c8, + 0x1238, 0x8000, 0x6036, 0x00ce, 0x080c, 0xa073, 0x0804, 0x259d, + 0x2061, 0x0100, 0x62c0, 0x080c, 0xaa28, 0x2019, 0x19f5, 0x2304, + 0x9065, 0x0130, 0x6003, 0x0001, 0x2009, 0x0027, 0x080c, 0xafec, + 0x00ce, 0x0804, 0x259d, 0xd2bc, 0x0904, 0x2580, 0x080c, 0x88f1, + 0x2011, 0x0004, 0x080c, 0x2adc, 0x00d6, 0x2069, 0x0140, 0x6804, + 0x9084, 0x4000, 0x0110, 0x080c, 0x2ab2, 0x00de, 0x00c6, 0x2061, + 0x19e9, 0x6050, 0x080c, 0xd35d, 0x0120, 0x909a, 0x0003, 0x1668, + 0x0018, 0x909a, 0x00c8, 0x1648, 0x8000, 0x6052, 0x604c, 0x00ce, + 0x9005, 0x05d8, 0x2009, 0x07d0, 0x080c, 0x88e9, 0x9080, 0x0008, + 0x2004, 0x9086, 0x0006, 0x1138, 0x2009, 0x1984, 0x2011, 0x0012, + 0x080c, 0x2aeb, 0x0450, 0x9080, 0x0008, 0x2004, 0x9086, 0x0009, + 0x0d98, 0x2009, 0x1984, 0x2011, 0x0016, 0x080c, 0x2aeb, 0x00e8, + 0x2011, 0x0004, 0x080c, 0x2adc, 0x00c0, 0x0036, 0x2019, 0x0001, + 0x080c, 0xa391, 0x003e, 0x2019, 0x19fc, 0x2304, 0x9065, 0x0160, + 0x2009, 0x004f, 0x6020, 0x9086, 0x0009, 0x1110, 0x2009, 0x004f, + 0x6003, 0x0003, 0x080c, 0xafec, 0x00ce, 0x080c, 0xab13, 0x001e, + 0xd19c, 0x0904, 0x2604, 0x7038, 0xd0ac, 0x1558, 0x0016, 0x0156, + 0x2011, 0x0008, 0x080c, 0x2adc, 0x080c, 0x2aff, 0x080c, 0x2b32, + 0x6050, 0xc0e5, 0x6052, 0x20a9, 0x0367, 0x0f04, 0x25cf, 0x1d04, + 0x25b7, 0x080c, 0x8918, 0x6020, 0xd09c, 0x1db8, 0x00f6, 0x2079, + 0x0100, 0x080c, 0x2a19, 0x00fe, 0x1d80, 0x6050, 0xc0e4, 0x6052, + 0x2011, 0x0008, 0x080c, 0x2adc, 0x015e, 0x001e, 0x04a8, 0x015e, + 0x001e, 0x0016, 0x6028, 0xc09c, 0x602a, 0x080c, 0xaaf7, 0x080c, + 0xadbe, 0x080c, 0xae87, 0x080c, 0xab13, 0x60e3, 0x0000, 0x080c, + 0xebe8, 0x080c, 0xec03, 0x080c, 0x5824, 0xd0fc, 0x1138, 0x080c, + 0xd356, 0x1120, 0x9085, 0x0001, 0x080c, 0x76e1, 0x9006, 0x080c, + 0x2aa2, 0x2009, 0x0002, 0x080c, 0x2a8e, 0x00e6, 0x2071, 0x1800, + 0x7003, 0x0004, 0x080c, 0x0ec7, 0x00ee, 0x2011, 0x0008, 0x080c, + 0x2adc, 0x080c, 0x0bc3, 0x001e, 0x918c, 0xffd0, 0x2110, 0x080c, + 0x2adc, 0x00ae, 0x0005, 0x0016, 0x2001, 0x0387, 0x200c, 0xd1a4, + 0x001e, 0x0904, 0x23a5, 0x0016, 0x2009, 0x2617, 0x00c0, 0x2001, + 0x0387, 0x2003, 0x1000, 0x001e, 0x0c38, 0x0016, 0x2001, 0x0387, + 0x200c, 0xd1b4, 0x001e, 0x0904, 0x23a5, 0x0016, 0x2009, 0x2629, + 0x0030, 0x2001, 0x0387, 0x2003, 0x4000, 0x001e, 0x08a8, 0x6028, + 0xc0bc, 0x602a, 0x2001, 0x0156, 0x2003, 0xbc91, 0x8000, 0x2003, + 0xffff, 0x6043, 0x0001, 0x080c, 0x2a88, 0x2011, 0x0080, 0x080c, + 0x2adc, 0x6017, 0x0000, 0x6043, 0x0000, 0x0817, 0x0006, 0x0016, + 0x0026, 0x0036, 0x00e6, 0x00f6, 0x0126, 0x2091, 0x8000, 0x2071, + 0x1800, 0x71d0, 0x70d2, 0x9116, 0x0904, 0x2699, 0x81ff, 0x01a0, + 0x2009, 0x0000, 0x080c, 0x2a8e, 0x2011, 0x8011, 0x2019, 0x010e, + 0x231c, 0x939e, 0x0007, 0x1118, 0x2019, 0x0001, 0x0010, 0x2019, + 0x0000, 0x080c, 0x4c28, 0x0468, 0x2001, 0x19aa, 0x200c, 0x81ff, + 0x1140, 0x2001, 0x0109, 0x2004, 0xd0b4, 0x0118, 0x2019, 0x0003, + 0x0008, 0x2118, 0x2011, 0x8012, 0x080c, 0x4c28, 0x080c, 0x0ec7, + 0x080c, 0x5824, 0xd0fc, 0x11a8, 0x080c, 0xd356, 0x1190, 0x00c6, + 0x080c, 0x2735, 0x080c, 0xaaf7, 0x080c, 0xa2ec, 0x080c, 0xab13, + 0x2061, 0x0100, 0x2019, 0x0028, 0x2009, 0x0002, 0x080c, 0x32c0, + 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, + 0x83ba, 0x0048, 0x9584, 0x00ff, 0x9080, 0x3474, 0x200d, 0x918c, + 0xff00, 0x810f, 0x9006, 0x0005, 0x9080, 0x3474, 0x200d, 0x918c, + 0x00ff, 0x0005, 0x00d6, 0x2069, 0x0140, 0x2001, 0x1818, 0x2003, + 0x00ef, 0x20a9, 0x0010, 0x9006, 0x6852, 0x6856, 0x1f04, 0x26e5, + 0x00de, 0x0005, 0x0006, 0x00d6, 0x0026, 0x2069, 0x0140, 0x2001, + 0x1818, 0x2102, 0x8114, 0x8214, 0x8214, 0x8214, 0x20a9, 0x0010, + 0x6853, 0x0000, 0x9006, 0x82ff, 0x1128, 0x9184, 0x000f, 0x9080, + 0xec17, 0x2005, 0x6856, 0x8211, 0x1f04, 0x26fa, 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, 0x272a, 0x680f, 0x0000, 0x000e, + 0x001e, 0x002e, 0x00de, 0x015e, 0x0005, 0x080c, 0x5820, 0xd0c4, + 0x0150, 0xd0a4, 0x0140, 0x9006, 0x0046, 0x2020, 0x2009, 0x002e, + 0x080c, 0xe795, 0x004e, 0x0005, 0x00f6, 0x0016, 0x0026, 0x2079, + 0x0140, 0x78c4, 0xd0dc, 0x0904, 0x27a1, 0x080c, 0x2a09, 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, 0x9364, 0x928c, 0xff00, 0x0110, 0x2011, 0x00ff, 0x2200, + 0x8007, 0x9085, 0x004c, 0x78c2, 0x2009, 0x0138, 0x220a, 0x080c, + 0x769d, 0x1118, 0x2009, 0x196e, 0x220a, 0x002e, 0x001e, 0x00fe, + 0x0005, 0x78c3, 0x0000, 0x0cc8, 0x0126, 0x2091, 0x2800, 0x0006, + 0x0016, 0x0026, 0x2001, 0x0170, 0x200c, 0x8000, 0x2014, 0x9184, + 0x0003, 0x0110, 0x080c, 0x0d72, 0x002e, 0x001e, 0x000e, 0x012e, + 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, 0x1991, 0x2004, 0x908a, 0x0007, 0x1a0c, + 0x0d79, 0x0033, 0x00ee, 0x002e, 0x001e, 0x000e, 0x015e, 0x0005, + 0x27ff, 0x281d, 0x2841, 0x2843, 0x286c, 0x286e, 0x2870, 0x2001, + 0x0001, 0x080c, 0x2646, 0x080c, 0x2a53, 0x2001, 0x1993, 0x2003, + 0x0000, 0x7828, 0x9084, 0xe1d7, 0x782a, 0x9006, 0x20a9, 0x0009, + 0x080c, 0x2a25, 0x2001, 0x1991, 0x2003, 0x0006, 0x2009, 0x001e, + 0x2011, 0x2871, 0x080c, 0x88f6, 0x0005, 0x2009, 0x1996, 0x200b, + 0x0000, 0x2001, 0x199b, 0x2003, 0x0036, 0x2001, 0x199a, 0x2003, + 0x002a, 0x2001, 0x1993, 0x2003, 0x0001, 0x9006, 0x080c, 0x29ba, + 0x2001, 0xffff, 0x20a9, 0x0009, 0x080c, 0x2a25, 0x2001, 0x1991, + 0x2003, 0x0006, 0x2009, 0x001e, 0x2011, 0x2871, 0x080c, 0x88f6, + 0x0005, 0x080c, 0x0d79, 0x2001, 0x199b, 0x2003, 0x0036, 0x2001, + 0x1993, 0x2003, 0x0003, 0x7a38, 0x9294, 0x0005, 0x9296, 0x0004, + 0x0110, 0x9006, 0x0010, 0x2001, 0x0001, 0x080c, 0x29ba, 0x2001, + 0x1997, 0x2003, 0x0000, 0x2001, 0xffff, 0x20a9, 0x0009, 0x080c, + 0x2a25, 0x2001, 0x1991, 0x2003, 0x0006, 0x2009, 0x001e, 0x2011, + 0x2871, 0x080c, 0x88f6, 0x0005, 0x080c, 0x0d79, 0x080c, 0x0d79, + 0x0005, 0x0006, 0x0016, 0x0026, 0x00e6, 0x00f6, 0x0156, 0x0126, + 0x2091, 0x8000, 0x2079, 0x0100, 0x2001, 0x1993, 0x2004, 0x908a, + 0x0007, 0x1a0c, 0x0d79, 0x0043, 0x012e, 0x015e, 0x00fe, 0x00ee, + 0x002e, 0x001e, 0x000e, 0x0005, 0x2893, 0x28af, 0x28eb, 0x2917, + 0x2937, 0x2943, 0x2945, 0x080c, 0x2a19, 0x1190, 0x2009, 0x1999, + 0x2104, 0x7a38, 0x9294, 0x0005, 0x9296, 0x0004, 0x0110, 0xc08d, + 0x0008, 0xc085, 0x200a, 0x2001, 0x1991, 0x2003, 0x0001, 0x0030, + 0x080c, 0x2969, 0x2001, 0xffff, 0x080c, 0x280e, 0x0005, 0x080c, + 0x2947, 0x05c0, 0x2009, 0x199a, 0x2104, 0x8001, 0x200a, 0x080c, + 0x2a19, 0x1158, 0x7a38, 0x9294, 0x0005, 0x9296, 0x0005, 0x0518, + 0x2009, 0x1999, 0x2104, 0xc085, 0x200a, 0x2009, 0x1996, 0x2104, + 0x8000, 0x200a, 0x9086, 0x0005, 0x0118, 0x080c, 0x294f, 0x00c0, + 0x200b, 0x0000, 0x7a38, 0x9294, 0x0006, 0x9296, 0x0004, 0x0110, + 0x9006, 0x0010, 0x2001, 0x0001, 0x080c, 0x29d7, 0x2001, 0x1993, + 0x2003, 0x0002, 0x0028, 0x2001, 0x1991, 0x2003, 0x0003, 0x0010, + 0x080c, 0x2830, 0x0005, 0x080c, 0x2947, 0x0540, 0x2009, 0x199a, + 0x2104, 0x8001, 0x200a, 0x080c, 0x2a19, 0x1148, 0x2001, 0x1991, + 0x2003, 0x0003, 0x2001, 0x1992, 0x2003, 0x0000, 0x00b8, 0x2009, + 0x199a, 0x2104, 0x9005, 0x1118, 0x080c, 0x298c, 0x0010, 0x080c, + 0x295c, 0x080c, 0x294f, 0x2009, 0x1996, 0x200b, 0x0000, 0x2001, + 0x1993, 0x2003, 0x0001, 0x080c, 0x2830, 0x0000, 0x0005, 0x0479, + 0x01e8, 0x080c, 0x2a19, 0x1198, 0x2009, 0x1997, 0x2104, 0x8000, + 0x200a, 0x9086, 0x0007, 0x0108, 0x0078, 0x2001, 0x199c, 0x2003, + 0x000a, 0x2009, 0x1999, 0x2104, 0xc0fd, 0x200a, 0x0038, 0x00f9, + 0x2001, 0x1993, 0x2003, 0x0004, 0x080c, 0x285b, 0x0005, 0x0079, + 0x0148, 0x080c, 0x2a19, 0x1118, 0x080c, 0x2847, 0x0018, 0x0079, + 0x080c, 0x285b, 0x0005, 0x080c, 0x0d79, 0x080c, 0x0d79, 0x2009, + 0x199b, 0x2104, 0x8001, 0x200a, 0x090c, 0x29a8, 0x0005, 0x7a38, + 0x9294, 0x0005, 0x9296, 0x0005, 0x0110, 0x9006, 0x0010, 0x2001, + 0x0001, 0x080c, 0x29d7, 0x0005, 0x7a38, 0x9294, 0x0006, 0x9296, + 0x0006, 0x0110, 0x9006, 0x0010, 0x2001, 0x0001, 0x080c, 0x29ba, + 0x0005, 0x2009, 0x1996, 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, 0x29d7, 0x0005, 0x0086, 0x2001, 0x1999, 0x2004, + 0x9084, 0x7fff, 0x090c, 0x0d79, 0x2009, 0x1998, 0x2144, 0x8846, + 0x280a, 0x9844, 0x0dd8, 0xd08c, 0x1120, 0xd084, 0x1120, 0x080c, + 0x0d79, 0x9006, 0x0010, 0x2001, 0x0001, 0x00a1, 0x008e, 0x0005, + 0x0006, 0x0156, 0x2001, 0x1991, 0x20a9, 0x0009, 0x2003, 0x0000, + 0x8000, 0x1f04, 0x29ae, 0x2001, 0x1998, 0x2003, 0x8000, 0x015e, + 0x000e, 0x0005, 0x00f6, 0x2079, 0x0100, 0x9085, 0x0000, 0x0158, + 0x7838, 0x9084, 0xfff9, 0x9085, 0x0004, 0x783a, 0x2009, 0x199e, + 0x210c, 0x795a, 0x0050, 0x7838, 0x9084, 0xfffb, 0x9085, 0x0006, + 0x783a, 0x2009, 0x199f, 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, 0x2a88, 0xd09c, + 0x1110, 0x1f04, 0x2a1c, 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, 0x2a45, 0x080c, + 0x8918, 0x1f04, 0x2a45, 0x7850, 0x9085, 0x1000, 0x7852, 0x000e, + 0x001e, 0x012e, 0x0005, 0x080c, 0x2b32, 0x0005, 0x0006, 0x0156, + 0x00f6, 0x2079, 0x0100, 0x20a9, 0x000a, 0x7854, 0xd0ac, 0x1100, + 0x7854, 0xd08c, 0x1110, 0x1f04, 0x2a60, 0x00fe, 0x015e, 0x000e, + 0x0005, 0x1d04, 0x2a69, 0x080c, 0x8918, 0x1f04, 0x2a69, 0x0005, + 0x0006, 0x2001, 0x199d, 0x2004, 0x9086, 0x0000, 0x000e, 0x0005, + 0x0006, 0x2001, 0x199d, 0x2004, 0x9086, 0x0001, 0x000e, 0x0005, + 0x0006, 0x2001, 0x199d, 0x2004, 0x9086, 0x0002, 0x000e, 0x0005, + 0xa001, 0xa001, 0xa001, 0xa001, 0xa001, 0x0005, 0x0006, 0x2001, + 0x19aa, 0x2102, 0x000e, 0x0005, 0x2009, 0x0171, 0x2104, 0xd0dc, + 0x0140, 0x2009, 0x0170, 0x2104, 0x200b, 0x0080, 0xa001, 0xa001, + 0x200a, 0x0005, 0x0016, 0x0026, 0x080c, 0x76b7, 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, 0x76b7, 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, 0x2a69, 0x6050, + 0x9085, 0x0400, 0x9084, 0xff9f, 0x6052, 0x20a9, 0x0005, 0x080c, + 0x2a69, 0x6054, 0xd0bc, 0x090c, 0x0d79, 0x20a9, 0x0005, 0x080c, + 0x2a69, 0x6054, 0xd0ac, 0x090c, 0x0d79, 0x2009, 0x19b1, 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, 0x0d79, 0x2001, + 0x0338, 0x2004, 0xd084, 0x1dc0, 0x6028, 0x0006, 0x60e0, 0x0006, + 0x6888, 0x0006, 0x688c, 0x0006, 0x6890, 0x0006, 0x080c, 0x769d, + 0x1110, 0x6884, 0x0006, 0x602f, 0x0100, 0x602f, 0x0000, 0xa001, + 0xa001, 0xa001, 0xa001, 0x602f, 0x0040, 0x602f, 0x0000, 0x080c, + 0x769d, 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, 0x26ea, 0x000e, 0x00de, + 0x00ce, 0x001e, 0x0005, 0x0006, 0x0156, 0x6050, 0x9085, 0x0040, + 0x6052, 0x6050, 0x9084, 0xfbcf, 0x6052, 0x080c, 0x2a88, 0x9085, + 0x2000, 0x6052, 0x20a9, 0x0012, 0x1d04, 0x2bbc, 0x080c, 0x8918, + 0x1f04, 0x2bbc, 0x6050, 0x9085, 0x0400, 0x9084, 0xdfbf, 0x6052, + 0x015e, 0x000e, 0x0005, 0x30c7, 0x30c7, 0x2ccb, 0x2ccb, 0x2cd7, + 0x2cd7, 0x2ce3, 0x2ce3, 0x2cf1, 0x2cf1, 0x2cfd, 0x2cfd, 0x2d0b, + 0x2d0b, 0x2d19, 0x2d19, 0x2d2b, 0x2d2b, 0x2d37, 0x2d37, 0x2d45, + 0x2d45, 0x2d63, 0x2d63, 0x2d83, 0x2d83, 0x2d53, 0x2d53, 0x2d73, + 0x2d73, 0x2d91, 0x2d91, 0x2d29, 0x2d29, 0x2d29, 0x2d29, 0x2d29, + 0x2d29, 0x2d29, 0x2d29, 0x2d29, 0x2d29, 0x2d29, 0x2d29, 0x2d29, + 0x2d29, 0x2d29, 0x2d29, 0x2d29, 0x2d29, 0x2d29, 0x2d29, 0x2d29, + 0x2d29, 0x2d29, 0x2d29, 0x2d29, 0x2d29, 0x2d29, 0x2d29, 0x2d29, + 0x2d29, 0x2d29, 0x2d29, 0x2da3, 0x2da3, 0x2daf, 0x2daf, 0x2dbd, + 0x2dbd, 0x2dcb, 0x2dcb, 0x2ddb, 0x2ddb, 0x2de9, 0x2de9, 0x2df9, + 0x2df9, 0x2e09, 0x2e09, 0x2e1b, 0x2e1b, 0x2e29, 0x2e29, 0x2e39, + 0x2e39, 0x2e5b, 0x2e5b, 0x2e7f, 0x2e7f, 0x2e49, 0x2e49, 0x2e6d, + 0x2e6d, 0x2e8f, 0x2e8f, 0x2d29, 0x2d29, 0x2d29, 0x2d29, 0x2d29, + 0x2d29, 0x2d29, 0x2d29, 0x2d29, 0x2d29, 0x2d29, 0x2d29, 0x2d29, + 0x2d29, 0x2d29, 0x2d29, 0x2d29, 0x2d29, 0x2d29, 0x2d29, 0x2d29, + 0x2d29, 0x2d29, 0x2d29, 0x2d29, 0x2d29, 0x2d29, 0x2d29, 0x2d29, + 0x2d29, 0x2d29, 0x2d29, 0x2ea3, 0x2ea3, 0x2eaf, 0x2eaf, 0x2ebd, + 0x2ebd, 0x2ecb, 0x2ecb, 0x2edb, 0x2edb, 0x2ee9, 0x2ee9, 0x2ef9, + 0x2ef9, 0x2f09, 0x2f09, 0x2f1b, 0x2f1b, 0x2f29, 0x2f29, 0x2f39, + 0x2f39, 0x2f49, 0x2f49, 0x2f5b, 0x2f5b, 0x2f6b, 0x2f6b, 0x2f7d, + 0x2f7d, 0x2f8f, 0x2f8f, 0x2d29, 0x2d29, 0x2d29, 0x2d29, 0x2d29, + 0x2d29, 0x2d29, 0x2d29, 0x2d29, 0x2d29, 0x2d29, 0x2d29, 0x2d29, + 0x2d29, 0x2d29, 0x2d29, 0x2d29, 0x2d29, 0x2d29, 0x2d29, 0x2d29, + 0x2d29, 0x2d29, 0x2d29, 0x2d29, 0x2d29, 0x2d29, 0x2d29, 0x2d29, + 0x2d29, 0x2d29, 0x2d29, 0x2fa3, 0x2fa3, 0x2fb1, 0x2fb1, 0x2fc1, + 0x2fc1, 0x2fd1, 0x2fd1, 0x2fe3, 0x2fe3, 0x2ff3, 0x2ff3, 0x3005, + 0x3005, 0x3017, 0x3017, 0x302b, 0x302b, 0x303b, 0x303b, 0x304d, + 0x304d, 0x305f, 0x305f, 0x3073, 0x3073, 0x3084, 0x3084, 0x3097, + 0x3097, 0x30aa, 0x30aa, 0x2d29, 0x2d29, 0x2d29, 0x2d29, 0x2d29, + 0x2d29, 0x2d29, 0x2d29, 0x2d29, 0x2d29, 0x2d29, 0x2d29, 0x2d29, + 0x2d29, 0x2d29, 0x2d29, 0x2d29, 0x2d29, 0x2d29, 0x2d29, 0x2d29, + 0x2d29, 0x2d29, 0x2d29, 0x2d29, 0x2d29, 0x2d29, 0x2d29, 0x2d29, + 0x2d29, 0x2d29, 0x2d29, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, + 0x0136, 0x0146, 0x0156, 0x080c, 0x22dd, 0x0804, 0x30bf, 0x0106, + 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, + 0x2107, 0x0804, 0x30bf, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, + 0x0136, 0x0146, 0x0156, 0x080c, 0x2107, 0x080c, 0x22dd, 0x0804, + 0x30bf, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, + 0x0156, 0x080c, 0x2131, 0x0804, 0x30bf, 0x0106, 0x0006, 0x0126, + 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x22dd, 0x080c, + 0x2131, 0x0804, 0x30bf, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, + 0x0136, 0x0146, 0x0156, 0x080c, 0x2107, 0x080c, 0x2131, 0x0804, + 0x30bf, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, + 0x0156, 0x080c, 0x2107, 0x080c, 0x22dd, 0x080c, 0x2131, 0x0804, + 0x30bf, 0xa001, 0x0cf0, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, + 0x0136, 0x0146, 0x0156, 0x080c, 0x13c8, 0x0804, 0x30bf, 0x0106, + 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, + 0x22dd, 0x080c, 0x13c8, 0x0804, 0x30bf, 0x0106, 0x0006, 0x0126, + 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2107, 0x080c, + 0x13c8, 0x0804, 0x30bf, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, + 0x0136, 0x0146, 0x0156, 0x080c, 0x22dd, 0x080c, 0x13c8, 0x080c, + 0x2131, 0x0804, 0x30bf, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, + 0x0136, 0x0146, 0x0156, 0x080c, 0x2107, 0x080c, 0x22dd, 0x080c, + 0x13c8, 0x0804, 0x30bf, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, + 0x0136, 0x0146, 0x0156, 0x080c, 0x2107, 0x080c, 0x13c8, 0x080c, + 0x2131, 0x0804, 0x30bf, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, + 0x0136, 0x0146, 0x0156, 0x080c, 0x13c8, 0x080c, 0x2131, 0x0804, + 0x30bf, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, + 0x0156, 0x080c, 0x2107, 0x080c, 0x22dd, 0x080c, 0x13c8, 0x080c, + 0x2131, 0x0804, 0x30bf, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, + 0x0136, 0x0146, 0x0156, 0x080c, 0x27a4, 0x0804, 0x30bf, 0x0106, + 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, + 0x27a4, 0x080c, 0x22dd, 0x0804, 0x30bf, 0x0106, 0x0006, 0x0126, + 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x27a4, 0x080c, + 0x2107, 0x0804, 0x30bf, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, + 0x0136, 0x0146, 0x0156, 0x080c, 0x27a4, 0x080c, 0x2107, 0x080c, + 0x22dd, 0x0804, 0x30bf, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, + 0x0136, 0x0146, 0x0156, 0x080c, 0x27a4, 0x080c, 0x2131, 0x0804, + 0x30bf, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, + 0x0156, 0x080c, 0x27a4, 0x080c, 0x22dd, 0x080c, 0x2131, 0x0804, + 0x30bf, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, + 0x0156, 0x080c, 0x27a4, 0x080c, 0x2107, 0x080c, 0x2131, 0x0804, + 0x30bf, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, + 0x0156, 0x080c, 0x27a4, 0x080c, 0x2107, 0x080c, 0x22dd, 0x080c, + 0x2131, 0x0804, 0x30bf, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, + 0x0136, 0x0146, 0x0156, 0x080c, 0x27a4, 0x080c, 0x13c8, 0x0804, + 0x30bf, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, + 0x0156, 0x080c, 0x27a4, 0x080c, 0x22dd, 0x080c, 0x13c8, 0x0804, + 0x30bf, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, + 0x0156, 0x080c, 0x27a4, 0x080c, 0x2107, 0x080c, 0x13c8, 0x0804, + 0x30bf, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, + 0x0156, 0x080c, 0x27a4, 0x080c, 0x22dd, 0x080c, 0x13c8, 0x080c, + 0x2131, 0x0804, 0x30bf, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, + 0x0136, 0x0146, 0x0156, 0x080c, 0x27a4, 0x080c, 0x2107, 0x080c, + 0x22dd, 0x080c, 0x13c8, 0x0804, 0x30bf, 0x0106, 0x0006, 0x0126, + 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x27a4, 0x080c, + 0x2107, 0x080c, 0x13c8, 0x080c, 0x2131, 0x0804, 0x30bf, 0x0106, + 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, + 0x27a4, 0x080c, 0x13c8, 0x080c, 0x2131, 0x0804, 0x30bf, 0x0106, + 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, + 0x27a4, 0x080c, 0x2107, 0x080c, 0x22dd, 0x080c, 0x13c8, 0x080c, + 0x2131, 0x0804, 0x30bf, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, + 0x0136, 0x0146, 0x0156, 0x080c, 0xab5d, 0x0804, 0x30bf, 0x0106, + 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, + 0xab5d, 0x080c, 0x22dd, 0x0804, 0x30bf, 0x0106, 0x0006, 0x0126, + 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2107, 0x080c, + 0xab5d, 0x0804, 0x30bf, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, + 0x0136, 0x0146, 0x0156, 0x080c, 0x2107, 0x080c, 0xab5d, 0x080c, + 0x22dd, 0x0804, 0x30bf, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, + 0x0136, 0x0146, 0x0156, 0x080c, 0xab5d, 0x080c, 0x2131, 0x0804, + 0x30bf, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, + 0x0156, 0x080c, 0xab5d, 0x080c, 0x22dd, 0x080c, 0x2131, 0x0804, + 0x30bf, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, + 0x0156, 0x080c, 0x2107, 0x080c, 0xab5d, 0x080c, 0x2131, 0x0804, + 0x30bf, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, + 0x0156, 0x080c, 0x2107, 0x080c, 0xab5d, 0x080c, 0x22dd, 0x080c, + 0x2131, 0x0804, 0x30bf, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, + 0x0136, 0x0146, 0x0156, 0x080c, 0xab5d, 0x080c, 0x13c8, 0x0804, + 0x30bf, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, + 0x0156, 0x080c, 0xab5d, 0x080c, 0x22dd, 0x080c, 0x13c8, 0x0804, + 0x30bf, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, + 0x0156, 0x080c, 0x2107, 0x080c, 0xab5d, 0x080c, 0x13c8, 0x0804, + 0x30bf, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, + 0x0156, 0x080c, 0x2107, 0x080c, 0xab5d, 0x080c, 0x22dd, 0x080c, + 0x13c8, 0x0804, 0x30bf, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, + 0x0136, 0x0146, 0x0156, 0x080c, 0xab5d, 0x080c, 0x13c8, 0x080c, + 0x2131, 0x0804, 0x30bf, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, + 0x0136, 0x0146, 0x0156, 0x080c, 0xab5d, 0x080c, 0x22dd, 0x080c, + 0x13c8, 0x080c, 0x2131, 0x0804, 0x30bf, 0x0106, 0x0006, 0x0126, + 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2107, 0x080c, + 0xab5d, 0x080c, 0x13c8, 0x080c, 0x2131, 0x0804, 0x30bf, 0x0106, + 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, + 0x2107, 0x080c, 0xab5d, 0x080c, 0x22dd, 0x080c, 0x13c8, 0x080c, + 0x2131, 0x0804, 0x30bf, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, + 0x0136, 0x0146, 0x0156, 0x080c, 0x27a4, 0x080c, 0xab5d, 0x0804, + 0x30bf, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, + 0x0156, 0x080c, 0x27a4, 0x080c, 0xab5d, 0x080c, 0x22dd, 0x0804, + 0x30bf, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, + 0x0156, 0x080c, 0x27a4, 0x080c, 0x2107, 0x080c, 0xab5d, 0x0804, + 0x30bf, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, + 0x0156, 0x080c, 0x27a4, 0x080c, 0x2107, 0x080c, 0xab5d, 0x080c, + 0x22dd, 0x0804, 0x30bf, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, + 0x0136, 0x0146, 0x0156, 0x080c, 0x27a4, 0x080c, 0xab5d, 0x080c, + 0x2131, 0x0804, 0x30bf, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, + 0x0136, 0x0146, 0x0156, 0x080c, 0x27a4, 0x080c, 0xab5d, 0x080c, + 0x22dd, 0x080c, 0x2131, 0x0804, 0x30bf, 0x0106, 0x0006, 0x0126, + 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x27a4, 0x080c, + 0x2107, 0x080c, 0xab5d, 0x080c, 0x2131, 0x0804, 0x30bf, 0x0106, + 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, + 0x27a4, 0x080c, 0x2107, 0x080c, 0xab5d, 0x080c, 0x22dd, 0x080c, + 0x2131, 0x0804, 0x30bf, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, + 0x0136, 0x0146, 0x0156, 0x080c, 0x27a4, 0x080c, 0xab5d, 0x080c, + 0x13c8, 0x0804, 0x30bf, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, + 0x0136, 0x0146, 0x0156, 0x080c, 0x27a4, 0x080c, 0xab5d, 0x080c, + 0x22dd, 0x080c, 0x13c8, 0x0804, 0x30bf, 0x0106, 0x0006, 0x0126, + 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x27a4, 0x080c, + 0x2107, 0x080c, 0xab5d, 0x080c, 0x13c8, 0x0804, 0x30bf, 0x0106, + 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, + 0x27a4, 0x080c, 0x2107, 0x080c, 0xab5d, 0x080c, 0x22dd, 0x080c, + 0x13c8, 0x0804, 0x30bf, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, + 0x0136, 0x0146, 0x0156, 0x080c, 0x27a4, 0x080c, 0xab5d, 0x080c, + 0x13c8, 0x080c, 0x2131, 0x04d8, 0x0106, 0x0006, 0x0126, 0x01c6, + 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x27a4, 0x080c, 0xab5d, + 0x080c, 0x22dd, 0x080c, 0x13c8, 0x080c, 0x2131, 0x0440, 0x0106, + 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, + 0x27a4, 0x080c, 0x2107, 0x080c, 0x13c8, 0x080c, 0xab5d, 0x080c, + 0x2131, 0x00a8, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, + 0x0146, 0x0156, 0x080c, 0x27a4, 0x080c, 0x2107, 0x080c, 0xab5d, + 0x080c, 0x22dd, 0x080c, 0x13c8, 0x080c, 0x2131, 0x0000, 0x015e, + 0x014e, 0x013e, 0x01de, 0x01ce, 0x012e, 0x000e, 0x010e, 0x000d, + 0x00b6, 0x00c6, 0x0026, 0x0046, 0x9026, 0x080c, 0x6b8b, 0x1904, + 0x31dc, 0x72dc, 0x2001, 0x197d, 0x2004, 0x9005, 0x1110, 0xd29c, + 0x0148, 0xd284, 0x1138, 0xd2bc, 0x1904, 0x31dc, 0x080c, 0x31e1, + 0x0804, 0x31dc, 0xd2cc, 0x1904, 0x31dc, 0x080c, 0x769d, 0x1120, + 0x70af, 0xffff, 0x0804, 0x31dc, 0xd294, 0x0120, 0x70af, 0xffff, + 0x0804, 0x31dc, 0x080c, 0x3463, 0x0160, 0x080c, 0xd35d, 0x0128, + 0x2001, 0x1818, 0x203c, 0x0804, 0x3165, 0x70af, 0xffff, 0x0804, + 0x31dc, 0x2001, 0x1818, 0x203c, 0x7294, 0xd284, 0x0904, 0x3165, + 0xd28c, 0x1904, 0x3165, 0x0036, 0x73ac, 0x938e, 0xffff, 0x1110, + 0x2019, 0x0001, 0x8314, 0x92e0, 0x1d80, 0x2c04, 0x938c, 0x0001, + 0x0120, 0x9084, 0xff00, 0x8007, 0x0010, 0x9084, 0x00ff, 0x970e, + 0x05d0, 0x908e, 0x0000, 0x05b8, 0x908e, 0x00ff, 0x1150, 0x7230, + 0xd284, 0x15b0, 0x7294, 0xc28d, 0x7296, 0x70af, 0xffff, 0x003e, + 0x04a0, 0x900e, 0x080c, 0x26a1, 0x080c, 0x6718, 0x1538, 0x9006, + 0xb8bb, 0x0520, 0xb8ac, 0x9005, 0x0148, 0x00c6, 0x2060, 0x080c, + 0x8d87, 0x00ce, 0x090c, 0x9128, 0xb8af, 0x0000, 0x080c, 0x6bcd, + 0x1168, 0x7030, 0xd08c, 0x0130, 0xb800, 0xd0bc, 0x0138, 0x080c, + 0x6a74, 0x0120, 0x080c, 0x31fa, 0x0148, 0x0028, 0x080c, 0x3346, + 0x080c, 0x3226, 0x0118, 0x8318, 0x0804, 0x3112, 0x73ae, 0x0010, + 0x70af, 0xffff, 0x003e, 0x0804, 0x31dc, 0x9780, 0x3474, 0x203d, + 0x97bc, 0xff00, 0x873f, 0x2041, 0x007e, 0x70ac, 0x9096, 0xffff, + 0x1118, 0x900e, 0x28a8, 0x0050, 0x9812, 0x0220, 0x2008, 0x9802, + 0x20a8, 0x0020, 0x70af, 0xffff, 0x0804, 0x31dc, 0x2700, 0x0156, + 0x0016, 0x9106, 0x0904, 0x31d1, 0xc484, 0x080c, 0x6783, 0x0168, + 0x080c, 0xd35d, 0x1904, 0x31d1, 0x080c, 0x3463, 0x1904, 0x31d1, + 0x080c, 0x6718, 0x1904, 0x31d9, 0x0008, 0xc485, 0xb8bb, 0x0520, + 0xb8ac, 0x9005, 0x0148, 0x00c6, 0x2060, 0x080c, 0x8d87, 0x00ce, + 0x090c, 0x9128, 0xb8af, 0x0000, 0x080c, 0x6bcd, 0x1130, 0x7030, + 0xd08c, 0x01f8, 0xb800, 0xd0bc, 0x11e0, 0x7294, 0xd28c, 0x0180, + 0x080c, 0x6bcd, 0x9082, 0x0006, 0x02e0, 0xd484, 0x1118, 0x080c, + 0x673d, 0x0028, 0x080c, 0x33d9, 0x01a0, 0x080c, 0x3404, 0x0088, + 0x080c, 0x3346, 0x080c, 0xd35d, 0x1160, 0x080c, 0x3226, 0x0188, + 0x0040, 0x080c, 0xd35d, 0x1118, 0x080c, 0x33d9, 0x0110, 0x0451, + 0x0140, 0x001e, 0x8108, 0x015e, 0x1f04, 0x317e, 0x70af, 0xffff, + 0x0018, 0x001e, 0x015e, 0x71ae, 0x004e, 0x002e, 0x00ce, 0x00be, + 0x0005, 0x00c6, 0x0016, 0x70af, 0x0001, 0x2009, 0x007e, 0x080c, + 0x6718, 0x1168, 0xb813, 0x00ff, 0xb817, 0xfffe, 0x080c, 0x3346, + 0x04a9, 0x0128, 0x70dc, 0xc0bd, 0x70de, 0x080c, 0xd0a1, 0x001e, + 0x00ce, 0x0005, 0x0016, 0x0076, 0x00d6, 0x00c6, 0x2001, 0x184c, + 0x2004, 0x9084, 0x00ff, 0xb842, 0x080c, 0xafbf, 0x01d0, 0x2b00, + 0x6012, 0x080c, 0xd0ce, 0x6023, 0x0001, 0x9006, 0x080c, 0x66b5, + 0x2001, 0x0000, 0x080c, 0x66c9, 0x0126, 0x2091, 0x8000, 0x70a8, + 0x8000, 0x70aa, 0x012e, 0x2009, 0x0004, 0x080c, 0xafec, 0x9085, + 0x0001, 0x00ce, 0x00de, 0x007e, 0x001e, 0x0005, 0x0016, 0x0076, + 0x00d6, 0x00c6, 0x2001, 0x184c, 0x2004, 0x9084, 0x00ff, 0xb842, + 0x080c, 0xafbf, 0x0548, 0x2b00, 0x6012, 0xb800, 0xc0c4, 0xb802, + 0xb8a0, 0x9086, 0x007e, 0x0140, 0xb804, 0x9084, 0x00ff, 0x9086, + 0x0006, 0x1110, 0x080c, 0x32fb, 0x080c, 0xd0ce, 0x6023, 0x0001, + 0x9006, 0x080c, 0x66b5, 0x2001, 0x0002, 0x080c, 0x66c9, 0x0126, + 0x2091, 0x8000, 0x70a8, 0x8000, 0x70aa, 0x012e, 0x2009, 0x0002, + 0x080c, 0xafec, 0x9085, 0x0001, 0x00ce, 0x00de, 0x007e, 0x001e, + 0x0005, 0x00b6, 0x00c6, 0x0026, 0x2009, 0x0080, 0x080c, 0x6718, + 0x1140, 0xb813, 0x00ff, 0xb817, 0xfffc, 0x0039, 0x0110, 0x70e3, + 0xffff, 0x002e, 0x00ce, 0x00be, 0x0005, 0x0016, 0x0076, 0x00d6, + 0x00c6, 0x080c, 0xaef8, 0x01d0, 0x2b00, 0x6012, 0x080c, 0xd0ce, + 0x6023, 0x0001, 0x9006, 0x080c, 0x66b5, 0x2001, 0x0002, 0x080c, + 0x66c9, 0x0126, 0x2091, 0x8000, 0x70e4, 0x8000, 0x70e6, 0x012e, + 0x2009, 0x0002, 0x080c, 0xafec, 0x9085, 0x0001, 0x00ce, 0x00de, + 0x007e, 0x001e, 0x0005, 0x00c6, 0x00d6, 0x0126, 0x2091, 0x8000, + 0x2009, 0x007f, 0x080c, 0x6718, 0x11b8, 0xb813, 0x00ff, 0xb817, + 0xfffd, 0xb8d7, 0x0004, 0x080c, 0xaef8, 0x0170, 0x2b00, 0x6012, + 0x6316, 0x6023, 0x0001, 0x620a, 0x080c, 0xd0ce, 0x2009, 0x0022, + 0x080c, 0xafec, 0x9085, 0x0001, 0x012e, 0x00de, 0x00ce, 0x0005, + 0x00e6, 0x00c6, 0x0066, 0x0036, 0x0026, 0x00b6, 0x21f0, 0x080c, + 0xaaf7, 0x0106, 0x080c, 0x95c4, 0x080c, 0x9530, 0x080c, 0xaa48, + 0x080c, 0xbeab, 0x010e, 0x090c, 0xab13, 0x3e08, 0x2130, 0x81ff, + 0x0120, 0x20a9, 0x007e, 0x900e, 0x0018, 0x20a9, 0x007f, 0x900e, + 0x0016, 0x080c, 0x6783, 0x1140, 0x9686, 0x0002, 0x1118, 0xb800, + 0xd0bc, 0x1110, 0x080c, 0x6192, 0x001e, 0x8108, 0x1f04, 0x32e0, + 0x9686, 0x0001, 0x190c, 0x3437, 0x00be, 0x002e, 0x003e, 0x006e, + 0x00ce, 0x00ee, 0x0005, 0x00e6, 0x00c6, 0x0046, 0x0036, 0x0026, + 0x0016, 0x00b6, 0x080c, 0xaaf7, 0x0106, 0x6210, 0x2258, 0xbaa0, + 0x0026, 0x2019, 0x0029, 0x080c, 0x95b9, 0x0076, 0x2039, 0x0000, + 0x080c, 0x9476, 0x2c08, 0x080c, 0xe465, 0x007e, 0x001e, 0x010e, + 0x090c, 0xab13, 0xba10, 0xbb14, 0xbc84, 0x080c, 0x6192, 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, 0xaaf7, 0x0106, 0x81ff, + 0x1118, 0x20a9, 0x0001, 0x0078, 0x080c, 0x5820, 0xd0c4, 0x0140, + 0xd0a4, 0x0130, 0x9006, 0x2020, 0x2009, 0x002d, 0x080c, 0xe795, + 0x20a9, 0x0800, 0x9016, 0x0026, 0x928e, 0x007e, 0x0904, 0x33b5, + 0x928e, 0x007f, 0x0904, 0x33b5, 0x928e, 0x0080, 0x05f0, 0x9288, + 0x1000, 0x210c, 0x81ff, 0x05c8, 0x8fff, 0x1150, 0x2001, 0x198f, + 0x0006, 0x2003, 0x0001, 0x080c, 0x33c6, 0x000e, 0x2003, 0x0000, + 0x00b6, 0x00c6, 0x2158, 0x2001, 0x0001, 0x080c, 0x6b97, 0x00ce, + 0x00be, 0x2019, 0x0029, 0x080c, 0x95b9, 0x0076, 0x2039, 0x0000, + 0x080c, 0x9476, 0x00b6, 0x00c6, 0x0026, 0x2158, 0xba04, 0x9294, + 0x00ff, 0x9286, 0x0006, 0x1118, 0xb807, 0x0404, 0x0028, 0x2001, + 0x0004, 0x8007, 0x9215, 0xba06, 0x002e, 0x00ce, 0x00be, 0x0016, + 0x2c08, 0x080c, 0xe465, 0x001e, 0x007e, 0x002e, 0x8210, 0x1f04, + 0x336b, 0x010e, 0x090c, 0xab13, 0x015e, 0x001e, 0x002e, 0x003e, + 0x004e, 0x00be, 0x00ce, 0x00ee, 0x00fe, 0x0005, 0x0046, 0x0026, + 0x0016, 0x080c, 0x5820, 0xd0c4, 0x0140, 0xd0a4, 0x0130, 0x9006, + 0x2220, 0x2009, 0x0029, 0x080c, 0xe795, 0x001e, 0x002e, 0x004e, + 0x0005, 0x0016, 0x0026, 0x0036, 0x00c6, 0x7294, 0x82ff, 0x01e8, + 0x080c, 0x6bc5, 0x11d0, 0x2100, 0x080c, 0x26d4, 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, 0xaaf7, 0x0106, 0x0036, 0x2019, 0x0029, 0x00c1, + 0x003e, 0x010e, 0x090c, 0xab13, 0x9180, 0x1000, 0x2004, 0x9065, + 0x0158, 0x0016, 0x00c6, 0x2061, 0x1b3a, 0x001e, 0x6112, 0x080c, + 0x32fb, 0x001e, 0x080c, 0x673d, 0x012e, 0x00ce, 0x001e, 0x0005, + 0x0016, 0x0026, 0x2110, 0x080c, 0xa5dd, 0x080c, 0xeafd, 0x002e, + 0x001e, 0x0005, 0x2001, 0x1837, 0x2004, 0xd0cc, 0x0005, 0x00c6, + 0x00b6, 0x080c, 0x769d, 0x1118, 0x20a9, 0x0800, 0x0010, 0x20a9, + 0x0782, 0x080c, 0x769d, 0x1110, 0x900e, 0x0010, 0x2009, 0x007e, + 0x9180, 0x1000, 0x2004, 0x905d, 0x0130, 0x86ff, 0x0110, 0xb800, + 0xd0bc, 0x090c, 0x673d, 0x8108, 0x1f04, 0x3448, 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, 0x1066, + 0x090c, 0x0d79, 0x2900, 0x706a, 0xa867, 0x0002, 0xa8ab, 0xdcb0, + 0x080c, 0x1066, 0x090c, 0x0d79, 0x2900, 0x706e, 0xa867, 0x0002, + 0xa8ab, 0xdcb0, 0x0005, 0x2071, 0x189e, 0x7004, 0x0002, 0x35a3, + 0x35a4, 0x35b7, 0x35cb, 0x0005, 0x1004, 0x35b4, 0x0e04, 0x35b4, + 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, 0x369f, 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, 0x369c, 0x61d0, 0x0804, + 0x3631, 0x3673, 0x36ab, 0x369c, 0x36b7, 0x36c1, 0x36c7, 0x36cb, + 0x36db, 0x36df, 0x36f5, 0x36fb, 0x3701, 0x370c, 0x3717, 0x3726, + 0x3735, 0x3743, 0x375a, 0x3775, 0x369c, 0x381e, 0x385c, 0x3901, + 0x3912, 0x3935, 0x369c, 0x369c, 0x369c, 0x396d, 0x398d, 0x3996, + 0x39c2, 0x39c8, 0x369c, 0x3a0e, 0x369c, 0x369c, 0x369c, 0x369c, + 0x369c, 0x3a19, 0x3a22, 0x3a2a, 0x3a2c, 0x369c, 0x369c, 0x369c, + 0x369c, 0x369c, 0x369c, 0x3a5c, 0x369c, 0x369c, 0x369c, 0x369c, + 0x369c, 0x3a79, 0x3add, 0x369c, 0x369c, 0x369c, 0x369c, 0x369c, + 0x369c, 0x0002, 0x3b07, 0x3b0a, 0x3b69, 0x3b82, 0x3bb2, 0x3e58, + 0x369c, 0x53d5, 0x369c, 0x369c, 0x369c, 0x369c, 0x369c, 0x369c, + 0x369c, 0x369c, 0x36f5, 0x36fb, 0x435b, 0x5844, 0x4379, 0x5464, + 0x54b6, 0x55c1, 0x369c, 0x5623, 0x565f, 0x5690, 0x57a0, 0x56bd, + 0x5720, 0x369c, 0x437d, 0x4536, 0x454c, 0x4571, 0x45d6, 0x464a, + 0x466a, 0x46e1, 0x473d, 0x4799, 0x479c, 0x47c1, 0x4833, 0x489d, + 0x48a5, 0x49da, 0x4b52, 0x4b86, 0x4dea, 0x369c, 0x4e08, 0x4eae, + 0x4f97, 0x4ff1, 0x369c, 0x50a8, 0x369c, 0x5114, 0x512f, 0x48a5, + 0x5375, 0x714c, 0x0000, 0x2021, 0x4000, 0x080c, 0x4c04, 0x0126, + 0x2091, 0x8000, 0x0e04, 0x367d, 0x0010, 0x012e, 0x0cc0, 0x7c36, + 0x9486, 0x4000, 0x0118, 0x7833, 0x0011, 0x0010, 0x7833, 0x0010, + 0x7c82, 0x7986, 0x7a8a, 0x7b8e, 0x2091, 0x4080, 0x2001, 0x0089, + 0x2004, 0xd084, 0x190c, 0x11f4, 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, 0x4c11, 0x2039, + 0x0001, 0x902e, 0x2520, 0x7b88, 0x7a8c, 0x7884, 0x7990, 0x0804, + 0x4c14, 0x7984, 0x7888, 0x2114, 0x200a, 0x0804, 0x3673, 0x7984, + 0x2114, 0x0804, 0x3673, 0x20e1, 0x0000, 0x2099, 0x0021, 0x20e9, + 0x0000, 0x20a1, 0x0021, 0x20a9, 0x001f, 0x4003, 0x7984, 0x7a88, + 0x7b8c, 0x0804, 0x3673, 0x7884, 0x2060, 0x0804, 0x3728, 0x2009, + 0x0003, 0x2011, 0x0003, 0x2019, 0x0012, 0x789b, 0x0137, 0x7893, + 0xffff, 0x2001, 0x188f, 0x2004, 0x9005, 0x0118, 0x7896, 0x0804, + 0x3673, 0x7897, 0x0001, 0x0804, 0x3673, 0x2039, 0x0001, 0x7d98, + 0x7c9c, 0x0804, 0x36af, 0x2039, 0x0001, 0x7d98, 0x7c9c, 0x0804, + 0x36bb, 0x79a0, 0x9182, 0x0040, 0x0210, 0x0804, 0x36a8, 0x2138, + 0x7d98, 0x7c9c, 0x0804, 0x36af, 0x79a0, 0x9182, 0x0040, 0x0210, + 0x0804, 0x36a8, 0x2138, 0x7d98, 0x7c9c, 0x0804, 0x36bb, 0x79a0, + 0x9182, 0x0040, 0x0210, 0x0804, 0x36a8, 0x21e8, 0x7984, 0x7888, + 0x20a9, 0x0001, 0x21a0, 0x4004, 0x0804, 0x3673, 0x2061, 0x0800, + 0xe10c, 0x9006, 0x2c15, 0x9200, 0x8c60, 0x8109, 0x1dd8, 0x2010, + 0x9005, 0x0904, 0x3673, 0x0804, 0x36a2, 0x79a0, 0x9182, 0x0040, + 0x0210, 0x0804, 0x36a8, 0x21e0, 0x20a9, 0x0001, 0x7984, 0x2198, + 0x4012, 0x0804, 0x3673, 0x2069, 0x1847, 0x7884, 0x7990, 0x911a, + 0x1a04, 0x36a8, 0x8019, 0x0904, 0x36a8, 0x684a, 0x6942, 0x788c, + 0x6852, 0x7888, 0x6856, 0x9006, 0x685a, 0x685e, 0x080c, 0x79d0, + 0x0804, 0x3673, 0x2069, 0x1847, 0x7884, 0x7994, 0x911a, 0x1a04, + 0x36a8, 0x8019, 0x0904, 0x36a8, 0x684e, 0x6946, 0x788c, 0x6862, + 0x7888, 0x6866, 0x9006, 0x686a, 0x686e, 0x0126, 0x2091, 0x8000, + 0x080c, 0x6c65, 0x012e, 0x0804, 0x3673, 0x902e, 0x2520, 0x81ff, + 0x0120, 0x2009, 0x0001, 0x0804, 0x36a5, 0x7984, 0x7b88, 0x7a8c, + 0x20a9, 0x0005, 0x20e9, 0x0001, 0x20a1, 0x18a6, 0x4101, 0x080c, + 0x4bc8, 0x1120, 0x2009, 0x0002, 0x0804, 0x36a5, 0x2009, 0x0020, + 0xa85c, 0x9080, 0x0019, 0xaf60, 0x080c, 0x4c11, 0x701f, 0x3799, + 0x0005, 0xa864, 0x2008, 0x9084, 0x00ff, 0x9096, 0x0011, 0x0168, + 0x9096, 0x0019, 0x0150, 0x9096, 0x0015, 0x0138, 0x9096, 0x0048, + 0x0120, 0x9096, 0x0029, 0x1904, 0x36a5, 0x810f, 0x918c, 0x00ff, + 0x0904, 0x36a5, 0x7112, 0x7010, 0x8001, 0x0560, 0x7012, 0x080c, + 0x4bc8, 0x1120, 0x2009, 0x0002, 0x0804, 0x36a5, 0x2009, 0x0020, + 0x7068, 0x2040, 0xa28c, 0xa390, 0xa494, 0xa598, 0x9290, 0x0040, + 0x9399, 0x0000, 0x94a1, 0x0000, 0x95a9, 0x0000, 0xa85c, 0x9080, + 0x0019, 0xaf60, 0x080c, 0x4c11, 0x701f, 0x37d7, 0x0005, 0xa864, + 0x9084, 0x00ff, 0x9096, 0x0002, 0x0120, 0x9096, 0x000a, 0x1904, + 0x36a5, 0x0888, 0x7014, 0x2048, 0xa868, 0xc0fd, 0xa86a, 0xa864, + 0x9084, 0x00ff, 0x9096, 0x0029, 0x1160, 0xc2fd, 0xaa7a, 0x080c, + 0x62e5, 0x0150, 0x0126, 0x2091, 0x8000, 0xa87a, 0xa982, 0x012e, + 0x0050, 0x080c, 0x6615, 0x1128, 0x7007, 0x0003, 0x701f, 0x3803, + 0x0005, 0x080c, 0x715d, 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, 0x4c14, 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, 0x1a26, 0x2004, 0x9005, 0x0128, 0x2001, 0x008b, 0x2004, + 0xd0fc, 0x0dd8, 0x2001, 0x008a, 0x2003, 0x0002, 0x2003, 0x1001, + 0x2071, 0x0080, 0x0804, 0x0427, 0x81ff, 0x1904, 0x36a5, 0x7984, + 0x080c, 0x6783, 0x1904, 0x36a8, 0x7e98, 0x9684, 0x3fff, 0x9082, + 0x4000, 0x1a04, 0x36a8, 0x7c88, 0x7d8c, 0x080c, 0x69b7, 0x080c, + 0x6944, 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, 0x36a5, 0x0c30, 0x080c, 0xc81b, + 0x012e, 0x0904, 0x36a5, 0x0804, 0x3673, 0x900e, 0x2001, 0x0005, + 0x080c, 0x715d, 0x0126, 0x2091, 0x8000, 0x080c, 0xcf3e, 0x080c, + 0x6f11, 0x012e, 0x0804, 0x3673, 0x00a6, 0x2950, 0xb198, 0x080c, + 0x6783, 0x1904, 0x38ee, 0xb6a4, 0x9684, 0x3fff, 0x9082, 0x4000, + 0x16e8, 0xb49c, 0xb5a0, 0x080c, 0x69b7, 0x080c, 0x6944, 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, 0xc81b, 0x012e, + 0x2009, 0x0003, 0x0178, 0x00e0, 0x900e, 0x2001, 0x0005, 0x080c, + 0x715d, 0x0126, 0x2091, 0x8000, 0x080c, 0xcf3e, 0x080c, 0x6f05, + 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, 0x36a5, 0x080c, 0x4bdf, 0x0904, 0x36a8, + 0x080c, 0x684a, 0x0904, 0x36a5, 0x080c, 0x69bd, 0x0904, 0x36a5, + 0x0804, 0x4661, 0x81ff, 0x1904, 0x36a5, 0x080c, 0x4bfb, 0x0904, + 0x36a8, 0x080c, 0x6a4b, 0x0904, 0x36a5, 0x2019, 0x0005, 0x79a8, + 0x080c, 0x69d8, 0x0904, 0x36a5, 0x7888, 0x908a, 0x1000, 0x1a04, + 0x36a8, 0x8003, 0x800b, 0x810b, 0x9108, 0x080c, 0x883a, 0x79a8, + 0xd184, 0x1904, 0x3673, 0x0804, 0x4661, 0x0126, 0x2091, 0x8000, + 0x81ff, 0x0118, 0x2009, 0x0001, 0x0450, 0x2029, 0x07ff, 0x645c, + 0x2400, 0x9506, 0x01f8, 0x2508, 0x080c, 0x6783, 0x11d8, 0x080c, + 0x6a4b, 0x1128, 0x2009, 0x0002, 0x62c0, 0x2518, 0x00c0, 0x2019, + 0x0004, 0x900e, 0x080c, 0x69d8, 0x1118, 0x2009, 0x0006, 0x0078, + 0x7884, 0x908a, 0x1000, 0x1270, 0x8003, 0x800b, 0x810b, 0x9108, + 0x080c, 0x883a, 0x8529, 0x1ae0, 0x012e, 0x0804, 0x3673, 0x012e, + 0x0804, 0x36a5, 0x012e, 0x0804, 0x36a8, 0x080c, 0x4bdf, 0x0904, + 0x36a8, 0x080c, 0x684a, 0x0904, 0x36a5, 0x080c, 0xaaf7, 0xbaa0, + 0x2019, 0x0005, 0x00c6, 0x9066, 0x080c, 0x95b9, 0x0076, 0x903e, + 0x080c, 0x9476, 0x900e, 0x080c, 0xe465, 0x007e, 0x00ce, 0x080c, + 0xab13, 0x080c, 0x69b7, 0x0804, 0x3673, 0x080c, 0x4bdf, 0x0904, + 0x36a8, 0x080c, 0x69b7, 0x2208, 0x0804, 0x3673, 0x0156, 0x00d6, + 0x00e6, 0x00c6, 0x2069, 0x1910, 0x6810, 0x6914, 0x910a, 0x1208, + 0x900e, 0x6816, 0x9016, 0x901e, 0x2071, 0x19e9, 0x7028, 0x9065, + 0x0118, 0x8210, 0x600c, 0x0cd8, 0x2300, 0x9218, 0x00ce, 0x00ee, + 0x00de, 0x015e, 0x0804, 0x3673, 0x00f6, 0x0016, 0x907d, 0x0138, + 0x9006, 0x8000, 0x2f0c, 0x81ff, 0x0110, 0x2178, 0x0cd0, 0x001e, + 0x00fe, 0x0005, 0x2069, 0x1910, 0x6910, 0x62bc, 0x0804, 0x3673, + 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x36a5, 0x0126, 0x2091, + 0x8000, 0x080c, 0x5834, 0x0128, 0x2009, 0x0007, 0x012e, 0x0804, + 0x36a5, 0x012e, 0x615c, 0x9190, 0x3474, 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, 0x769d, 0x1118, + 0x2031, 0x0004, 0x0038, 0xd79c, 0x0120, 0x2009, 0x0005, 0x0804, + 0x36a5, 0x9036, 0x7e9a, 0x7f9e, 0x0804, 0x3673, 0x614c, 0x6250, + 0x2019, 0x1987, 0x231c, 0x2001, 0x1988, 0x2004, 0x789a, 0x0804, + 0x3673, 0x0126, 0x2091, 0x8000, 0x6138, 0x623c, 0x6340, 0x012e, + 0x0804, 0x3673, 0x080c, 0x4bfb, 0x0904, 0x36a8, 0xba44, 0xbb38, + 0x0804, 0x3673, 0x080c, 0x0d79, 0x080c, 0x4bfb, 0x2110, 0x0904, + 0x36a8, 0xb804, 0x908c, 0x00ff, 0x918e, 0x0006, 0x0140, 0x9084, + 0xff00, 0x9086, 0x0600, 0x2009, 0x0009, 0x1904, 0x36a5, 0x0126, + 0x2091, 0x8000, 0x2019, 0x0005, 0x00c6, 0x9066, 0x080c, 0xaaf7, + 0x080c, 0xa5dd, 0x080c, 0x95b9, 0x0076, 0x903e, 0x080c, 0x9476, + 0x900e, 0x080c, 0xe465, 0x007e, 0x00ce, 0x080c, 0xab13, 0xb807, + 0x0407, 0x012e, 0x0804, 0x3673, 0x614c, 0x6250, 0x7884, 0x604e, + 0x7b88, 0x6352, 0x2069, 0x1847, 0x831f, 0x9305, 0x6816, 0x788c, + 0x2069, 0x1987, 0x2d1c, 0x206a, 0x7e98, 0x9682, 0x0014, 0x1210, + 0x2031, 0x07d0, 0x2069, 0x1988, 0x2d04, 0x266a, 0x789a, 0x0804, + 0x3673, 0x0126, 0x2091, 0x8000, 0x6138, 0x7884, 0x603a, 0x910e, + 0xd1b4, 0x190c, 0x0edf, 0xd0c4, 0x01a8, 0x00d6, 0x78a8, 0x2009, + 0x199e, 0x200a, 0x78ac, 0x2011, 0x199f, 0x2012, 0x2069, 0x0100, + 0x6838, 0x9086, 0x0007, 0x1118, 0x2214, 0x6a5a, 0x0010, 0x210c, + 0x695a, 0x00de, 0x2011, 0x0116, 0x220c, 0x7888, 0xd08c, 0x0118, + 0x918d, 0x0040, 0x0010, 0x918c, 0xff7f, 0x2112, 0x7988, 0x613e, + 0x6140, 0x788c, 0x6042, 0x910e, 0xd1e4, 0x190c, 0x0efa, 0x9084, + 0x0020, 0x0130, 0x78b4, 0x6046, 0x9084, 0x0001, 0x090c, 0x435b, + 0x6040, 0xd0cc, 0x0120, 0x78b0, 0x2011, 0x0114, 0x2012, 0x012e, + 0x0804, 0x3673, 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, 0x36a8, 0x788c, 0x902d, 0x0904, 0x36a8, + 0x900e, 0x080c, 0x6783, 0x1120, 0xba44, 0xbb38, 0xbc46, 0xbd3a, + 0x9186, 0x07ff, 0x0190, 0x8108, 0x0ca0, 0x080c, 0x4bfb, 0x0904, + 0x36a8, 0x7888, 0x900d, 0x0904, 0x36a8, 0x788c, 0x9005, 0x0904, + 0x36a8, 0xba44, 0xb946, 0xbb38, 0xb83a, 0x0804, 0x3673, 0x2011, + 0xbc09, 0x0010, 0x2011, 0xbc05, 0x080c, 0x5834, 0x1904, 0x36a5, + 0x00c6, 0x2061, 0x0100, 0x7984, 0x9186, 0x00ff, 0x1130, 0x2001, + 0x1818, 0x2004, 0x9085, 0xff00, 0x0088, 0x9182, 0x007f, 0x16e0, + 0x9188, 0x3474, 0x210d, 0x918c, 0x00ff, 0x2001, 0x1818, 0x2004, + 0x0026, 0x9116, 0x002e, 0x0580, 0x810f, 0x9105, 0x0126, 0x2091, + 0x8000, 0x0006, 0x080c, 0xaef8, 0x000e, 0x0510, 0x602e, 0x620a, + 0x7984, 0x00b6, 0x080c, 0x671e, 0x2b08, 0x00be, 0x1500, 0x6112, + 0x6023, 0x0001, 0x080c, 0x4bc8, 0x01d0, 0x9006, 0xa866, 0x7007, + 0x0003, 0xa832, 0xa868, 0xc0fd, 0xa86a, 0x701f, 0x3b62, 0x2900, + 0x6016, 0x2009, 0x0032, 0x080c, 0xafec, 0x012e, 0x00ce, 0x0005, + 0x012e, 0x00ce, 0x0804, 0x36a5, 0x00ce, 0x0804, 0x36a8, 0x080c, + 0xaf4e, 0x0cb0, 0xa830, 0x9086, 0x0100, 0x0904, 0x36a5, 0x0804, + 0x3673, 0x2061, 0x1a74, 0x0126, 0x2091, 0x8000, 0x6000, 0xd084, + 0x0170, 0x6104, 0x6208, 0x2061, 0x1800, 0x6354, 0x6074, 0x789a, + 0x60c0, 0x789e, 0x60bc, 0x78aa, 0x012e, 0x0804, 0x3673, 0x900e, + 0x2110, 0x0c88, 0x81ff, 0x1904, 0x36a5, 0x080c, 0x769d, 0x0904, + 0x36a5, 0x0126, 0x2091, 0x8000, 0x6254, 0x6074, 0x9202, 0x0248, + 0x9085, 0x0001, 0x080c, 0x270a, 0x080c, 0x5a57, 0x012e, 0x0804, + 0x3673, 0x012e, 0x0804, 0x36a8, 0x0006, 0x0016, 0x00c6, 0x00e6, + 0x2001, 0x19ab, 0x2070, 0x2061, 0x1847, 0x6008, 0x2072, 0x900e, + 0x2011, 0x1400, 0x080c, 0x9364, 0x7206, 0x00ee, 0x00ce, 0x001e, + 0x000e, 0x0005, 0x0126, 0x2091, 0x8000, 0x81ff, 0x0128, 0x012e, + 0x2021, 0x400b, 0x0804, 0x3675, 0x7884, 0xd0fc, 0x0158, 0x2001, + 0x002a, 0x2004, 0x9005, 0x0180, 0x9082, 0x00e1, 0x0298, 0x012e, + 0x0804, 0x36a8, 0x2001, 0x002a, 0x2004, 0x9005, 0x0128, 0x2069, + 0x1847, 0x6908, 0x9102, 0x1230, 0x012e, 0x0804, 0x36a8, 0x012e, + 0x0804, 0x36a5, 0x080c, 0xae80, 0x0dd0, 0x7884, 0xd0fc, 0x0904, + 0x3c31, 0x00c6, 0x080c, 0x4bc8, 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, + 0x3dbb, 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, 0x4c11, 0x701f, 0x3cf8, 0x7023, 0x0001, 0x012e, + 0x0005, 0x080c, 0xaaf7, 0x0046, 0x0086, 0x0096, 0x00a6, 0x00b6, + 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x080c, 0x3b9c, 0x2001, 0x19a1, + 0x2003, 0x0000, 0x2021, 0x000a, 0x2061, 0x0100, 0x6104, 0x0016, + 0x60bb, 0x0000, 0x60bf, 0x32e1, 0x60bf, 0x0012, 0x080c, 0x3e2a, + 0x080c, 0x3de9, 0x00f6, 0x00e6, 0x0086, 0x2940, 0x2071, 0x19e9, + 0x2079, 0x0090, 0x00d6, 0x2069, 0x0000, 0x6884, 0xd0b4, 0x0140, + 0x2001, 0x0035, 0x2004, 0x780e, 0x2001, 0x0034, 0x2004, 0x780a, + 0x00de, 0x2011, 0x0001, 0x080c, 0x419f, 0x008e, 0x00ee, 0x00fe, + 0x080c, 0x40c1, 0x080c, 0x3fee, 0x05b8, 0x2001, 0x020b, 0x2004, + 0x9084, 0x0140, 0x1db8, 0x080c, 0x4213, 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, 0x3ff8, 0x080c, 0x3de4, + 0x0058, 0x080c, 0x3de4, 0x080c, 0x4137, 0x080c, 0x40b7, 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, 0x1346, + 0x2009, 0x0028, 0x080c, 0x223d, 0x2001, 0x0227, 0x200c, 0x2102, + 0x080c, 0xab13, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, 0x00ae, + 0x009e, 0x008e, 0x004e, 0x2001, 0x19a1, 0x2004, 0x9005, 0x1118, + 0x012e, 0x0804, 0x3673, 0x012e, 0x2021, 0x400c, 0x0804, 0x3675, + 0x0016, 0x0026, 0x0036, 0x0046, 0x0056, 0x0076, 0x0086, 0x0096, + 0x00d6, 0x0156, 0x7014, 0x2048, 0x7020, 0x20a8, 0x8000, 0x7022, + 0xa804, 0x9005, 0x0904, 0x3d54, 0x2048, 0x1f04, 0x3d08, 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, 0x4c11, + 0x701f, 0x3cf8, 0x00b0, 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, + 0x9084, 0xffc0, 0x9080, 0x001b, 0x21a8, 0x27e0, 0x2098, 0x27e8, + 0x20a0, 0x0006, 0x080c, 0x0fca, 0x000e, 0x080c, 0x4c14, 0x701f, + 0x3cf8, 0x015e, 0x00de, 0x009e, 0x008e, 0x007e, 0x005e, 0x004e, + 0x003e, 0x002e, 0x001e, 0x0005, 0x7014, 0x2048, 0xa864, 0x9086, + 0x0103, 0x1118, 0x701f, 0x3db9, 0x0450, 0x7014, 0x2048, 0xa868, + 0xc0fd, 0xa86a, 0x2009, 0x007f, 0x080c, 0x6718, 0x0110, 0x9006, + 0x0030, 0xb813, 0x00ff, 0xb817, 0xfffd, 0x080c, 0xd121, 0x015e, + 0x00de, 0x009e, 0x008e, 0x007e, 0x005e, 0x004e, 0x003e, 0x002e, + 0x001e, 0x0904, 0x36a5, 0x0016, 0x0026, 0x0036, 0x0046, 0x0056, + 0x0076, 0x0086, 0x0096, 0x00d6, 0x0156, 0x701f, 0x3d8b, 0x7007, + 0x0003, 0x0804, 0x3d49, 0xa830, 0x9086, 0x0100, 0x2021, 0x400c, + 0x0904, 0x3675, 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, 0x0fca, + 0x000e, 0x080c, 0x4c14, 0x007e, 0x701f, 0x3cf8, 0x7023, 0x0001, + 0x0005, 0x0804, 0x3673, 0x0156, 0x00c6, 0xa814, 0x908a, 0x001e, + 0x0218, 0xa833, 0x001e, 0x0010, 0xa832, 0x0078, 0x81ff, 0x0168, + 0x0016, 0x080c, 0x4bc8, 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, 0x19a1, 0x2003, 0x0001, + 0x0005, 0x00f6, 0x00e6, 0x00c6, 0x2061, 0x0200, 0x2001, 0x19ac, + 0x2004, 0x601a, 0x2061, 0x0100, 0x2001, 0x19ab, 0x2004, 0x60ce, + 0x6104, 0xc1ac, 0x6106, 0x080c, 0x4bc8, 0xa813, 0x0019, 0xa817, + 0x0001, 0x2900, 0xa85a, 0x2001, 0x002e, 0x2004, 0xa866, 0x2001, + 0x002f, 0x2004, 0xa86a, 0x2061, 0x0090, 0x2079, 0x0100, 0x2001, + 0x19ab, 0x2004, 0x6036, 0x2009, 0x0040, 0x080c, 0x223d, 0x2001, + 0x002a, 0x2004, 0x9084, 0xfff8, 0xa86e, 0x601a, 0xa873, 0x0000, + 0x601f, 0x0000, 0x78ca, 0x9006, 0x600a, 0x600e, 0x00ce, 0x00ee, + 0x00fe, 0x0005, 0x00e6, 0x080c, 0x4bc8, 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, 0x2a80, 0x1130, + 0x9006, 0x080c, 0x29d7, 0x9006, 0x080c, 0x29ba, 0x2001, 0x19a0, + 0x2003, 0x0000, 0x7884, 0x9084, 0x0007, 0x0002, 0x3e79, 0x3e7a, + 0x3e7b, 0x3e76, 0x3e76, 0x3e76, 0x3e76, 0x3e76, 0x012e, 0x0804, + 0x36a8, 0x0ce0, 0x0cd8, 0x080c, 0x769d, 0x1128, 0x012e, 0x2009, + 0x0016, 0x0804, 0x36a5, 0x81ff, 0x0128, 0x012e, 0x2021, 0x400b, + 0x0804, 0x3675, 0x2001, 0x0141, 0x2004, 0xd0dc, 0x0db0, 0x080c, + 0xaaf7, 0x0086, 0x0096, 0x00a6, 0x00b6, 0x00c6, 0x00d6, 0x00e6, + 0x00f6, 0x080c, 0x3b9c, 0x2009, 0x0101, 0x210c, 0x0016, 0x7ec8, + 0x7dcc, 0x9006, 0x2068, 0x2060, 0x2058, 0x080c, 0x42ee, 0x080c, + 0x423e, 0x903e, 0x2720, 0x00f6, 0x00e6, 0x0086, 0x2940, 0x2071, + 0x19e9, 0x2079, 0x0090, 0x00d6, 0x2069, 0x0000, 0x6884, 0xd0b4, + 0x0120, 0x68d4, 0x780e, 0x68d0, 0x780a, 0x00de, 0x2011, 0x0001, + 0x080c, 0x419f, 0x080c, 0x2a88, 0x080c, 0x2a88, 0x080c, 0x2a88, + 0x080c, 0x2a88, 0x080c, 0x419f, 0x008e, 0x00ee, 0x00fe, 0x080c, + 0x40c1, 0x2009, 0x9c40, 0x8109, 0x11b0, 0x080c, 0x3ff8, 0x2001, + 0x0004, 0x200c, 0x918c, 0xfffd, 0x2102, 0x001e, 0x00fe, 0x00ee, + 0x00de, 0x00ce, 0x00be, 0x00ae, 0x009e, 0x008e, 0x2009, 0x0017, + 0x080c, 0x36a5, 0x0cf8, 0x2001, 0x020b, 0x2004, 0x9084, 0x0140, + 0x1d10, 0x00f6, 0x2079, 0x0000, 0x7884, 0x00fe, 0xd0bc, 0x0178, + 0x2001, 0x0201, 0x200c, 0x81ff, 0x0150, 0x080c, 0x409f, 0x2d00, + 0x9c05, 0x9b05, 0x0120, 0x080c, 0x3ff8, 0x0804, 0x3fa1, 0x080c, + 0x4213, 0x080c, 0x4137, 0x080c, 0x4082, 0x080c, 0x40b7, 0x00f6, + 0x2079, 0x0100, 0x7824, 0xd0ac, 0x0130, 0x8b58, 0x080c, 0x3ff8, + 0x00fe, 0x0804, 0x3fa1, 0x00fe, 0x080c, 0x3fee, 0x1150, 0x8d68, + 0x2001, 0x0032, 0x2602, 0x2001, 0x0033, 0x2502, 0x080c, 0x3ff8, + 0x0080, 0x87ff, 0x0138, 0x2001, 0x0201, 0x2004, 0x9005, 0x1908, + 0x8739, 0x0038, 0x2001, 0x1a6f, 0x2004, 0x9086, 0x0000, 0x1904, + 0x3ef1, 0x2001, 0x032f, 0x2003, 0x00f6, 0x8631, 0x1208, 0x8529, + 0x2500, 0x9605, 0x0904, 0x3fa1, 0x7884, 0xd0bc, 0x0128, 0x2d00, + 0x9c05, 0x9b05, 0x1904, 0x3fa1, 0xa013, 0x0019, 0x2001, 0x032a, + 0x2003, 0x0004, 0x7884, 0xd0ac, 0x1148, 0x2001, 0x1a6f, 0x2003, + 0x0003, 0x2001, 0x032a, 0x2003, 0x0009, 0x0030, 0xa017, 0x0001, + 0x78b4, 0x9005, 0x0108, 0xa016, 0x2800, 0xa05a, 0x2009, 0x0040, + 0x080c, 0x223d, 0x2900, 0xa85a, 0xa813, 0x0019, 0x7884, 0xd0a4, + 0x1180, 0xa817, 0x0000, 0x00c6, 0x20a9, 0x0004, 0x2061, 0x0090, + 0x602b, 0x0008, 0x2001, 0x0203, 0x2004, 0x1f04, 0x3f78, 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, + 0x3eab, 0x001e, 0x00c6, 0x2001, 0x032a, 0x2003, 0x0004, 0x2061, + 0x0100, 0x6027, 0x0002, 0x6106, 0x2011, 0x020d, 0x2013, 0x0020, + 0x2001, 0x0004, 0x200c, 0x918c, 0xfffd, 0x2102, 0x080c, 0x1346, + 0x7884, 0x9084, 0x0003, 0x9086, 0x0002, 0x01b0, 0x2009, 0x0028, + 0x080c, 0x223d, 0x2001, 0x0227, 0x200c, 0x2102, 0x6050, 0x9084, + 0xb7ff, 0x080c, 0x2b32, 0x6052, 0x602f, 0x0000, 0x604b, 0xf7f7, + 0x6043, 0x0090, 0x6043, 0x0010, 0x080c, 0xab13, 0x00ce, 0x2d08, + 0x2c10, 0x2b18, 0x2b00, 0x9c05, 0x9d05, 0x00fe, 0x00ee, 0x00de, + 0x00ce, 0x00be, 0x00ae, 0x009e, 0x008e, 0x1118, 0x012e, 0x0804, + 0x3673, 0x012e, 0x2021, 0x400c, 0x0804, 0x3675, 0x9085, 0x0001, + 0x1d04, 0x3ff7, 0x2091, 0x6000, 0x8420, 0x9486, 0x0064, 0x0005, + 0x2001, 0x0105, 0x2003, 0x0010, 0x2001, 0x032a, 0x2003, 0x0004, + 0x2001, 0x1a6f, 0x2003, 0x0000, 0x0071, 0x2009, 0x0048, 0x080c, + 0x223d, 0x2001, 0x0227, 0x2024, 0x2402, 0x2001, 0x0109, 0x2003, + 0x4000, 0x9026, 0x0005, 0x00f6, 0x00e6, 0x2071, 0x19e9, 0x7054, + 0x9086, 0x0000, 0x0520, 0x2079, 0x0090, 0x2009, 0x0206, 0x2104, + 0x2009, 0x0203, 0x210c, 0x9106, 0x1120, 0x2009, 0x0040, 0x080c, + 0x223d, 0x782c, 0xd0fc, 0x0d88, 0x080c, 0x4213, 0x7054, 0x9086, + 0x0000, 0x1d58, 0x782b, 0x0004, 0x782c, 0xd0ac, 0x1de8, 0x2009, + 0x0040, 0x080c, 0x223d, 0x782b, 0x0002, 0x7057, 0x0000, 0x00ee, + 0x00fe, 0x0005, 0x00f6, 0x2079, 0x0100, 0x2001, 0x1818, 0x200c, + 0x7932, 0x7936, 0x080c, 0x26ea, 0x080c, 0x2aff, 0x080c, 0x2b32, + 0x784b, 0xf7f7, 0x7843, 0x0090, 0x7843, 0x0010, 0x7850, 0xc0e5, + 0x7852, 0x2019, 0x61a8, 0x7820, 0xd09c, 0x0110, 0x8319, 0x1dd8, + 0x7850, 0xc0e4, 0x7852, 0x2011, 0x0048, 0x080c, 0x2adc, 0x7843, + 0x0040, 0x2019, 0x01f4, 0xa001, 0xa001, 0x8319, 0x1de0, 0x2001, + 0x0100, 0x080c, 0x2aa2, 0x2011, 0x0020, 0x080c, 0x2adc, 0x7843, + 0x0000, 0x9006, 0x080c, 0x2aa2, 0x2011, 0x0048, 0x080c, 0x2adc, + 0x00fe, 0x0005, 0x7884, 0xd0ac, 0x11c8, 0x00f6, 0x00e6, 0x2071, + 0x1a6f, 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, 0x19ac, 0x2004, 0x70e2, + 0x080c, 0x3dda, 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, 0x4213, + 0x00f6, 0x2071, 0x1a6f, 0x2079, 0x0320, 0x00d6, 0x2069, 0x0000, + 0x6884, 0xd0b4, 0x0120, 0x689c, 0x780e, 0x6898, 0x780a, 0x00de, + 0x080c, 0x3dda, 0x0140, 0x2001, 0x19a0, 0x200c, 0x2003, 0x0001, + 0x918e, 0x0001, 0x0120, 0x2009, 0x03e8, 0x8109, 0x1df0, 0x792c, + 0xd1fc, 0x0110, 0x782b, 0x0004, 0x2011, 0x0011, 0x080c, 0x419f, + 0x2011, 0x0001, 0x080c, 0x419f, 0x00fe, 0x00ee, 0x0005, 0x00f6, + 0x00e6, 0x2071, 0x1a6f, 0x2079, 0x0320, 0x792c, 0xd1fc, 0x0904, + 0x419c, 0x782b, 0x0002, 0x9026, 0xd19c, 0x1904, 0x4198, 0x7000, + 0x0002, 0x419c, 0x414d, 0x417d, 0x4198, 0xd1bc, 0x1170, 0xd1dc, + 0x1190, 0x8001, 0x7002, 0x2011, 0x0001, 0x080c, 0x419f, 0x0904, + 0x419c, 0x080c, 0x419f, 0x0804, 0x419c, 0x00f6, 0x2079, 0x0300, + 0x78bf, 0x0000, 0x00fe, 0x7810, 0x7914, 0x782b, 0x0004, 0x7812, + 0x7916, 0x2001, 0x0201, 0x200c, 0x81ff, 0x0de8, 0x080c, 0x409f, + 0x2009, 0x0001, 0x00f6, 0x2079, 0x0300, 0x78b8, 0x00fe, 0xd0ec, + 0x0110, 0x2009, 0x0011, 0x792a, 0x00f8, 0x8001, 0x7002, 0x9184, + 0x0880, 0x1140, 0x782c, 0xd0fc, 0x1904, 0x4141, 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, 0x0d79, 0x9398, 0x41cd, 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, 0x420a, 0x4201, 0x41f8, + 0x41ef, 0x41e6, 0x41dd, 0x41d4, 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, 0x19e9, + 0x2079, 0x0090, 0x792c, 0xd1fc, 0x01e8, 0x782b, 0x0002, 0x2940, + 0x9026, 0x7054, 0x0002, 0x423a, 0x4226, 0x4231, 0x8001, 0x7056, + 0xd19c, 0x1180, 0x2011, 0x0001, 0x080c, 0x419f, 0x190c, 0x419f, + 0x0048, 0x8001, 0x7056, 0x782c, 0xd0fc, 0x1d38, 0x2011, 0x0001, + 0x080c, 0x419f, 0x008e, 0x00ee, 0x00fe, 0x0005, 0x00f6, 0x00e6, + 0x00c6, 0x0086, 0x2061, 0x0200, 0x2001, 0x19ac, 0x2004, 0x601a, + 0x2061, 0x0100, 0x2001, 0x19ab, 0x2004, 0x60ce, 0x6104, 0xc1ac, + 0x6106, 0x2001, 0x002c, 0x2004, 0x9005, 0x0520, 0x2038, 0x2001, + 0x002e, 0x2024, 0x2001, 0x002f, 0x201c, 0x080c, 0x4bc8, 0xa813, + 0x0019, 0xaf16, 0x2900, 0xa85a, 0x978a, 0x0007, 0x0220, 0x2138, + 0x2009, 0x0007, 0x0010, 0x2708, 0x903e, 0x0096, 0xa858, 0x2048, + 0xa85c, 0x9080, 0x0019, 0x009e, 0x080c, 0x42b6, 0x1d68, 0x2900, + 0xa85a, 0x00d0, 0x080c, 0x4bc8, 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, 0x19ab, 0x2004, 0x6036, 0x2009, 0x0040, 0x080c, 0x223d, + 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, 0x4bc8, + 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, 0x4bc8, 0x2940, 0xa813, 0x0019, + 0xaf16, 0x2900, 0xa85a, 0x978a, 0x0007, 0x0220, 0x2138, 0x2009, + 0x0007, 0x0010, 0x2708, 0x903e, 0x0096, 0xa858, 0x2048, 0xa85c, + 0x9080, 0x0019, 0x009e, 0x080c, 0x42b6, 0x1d68, 0x2900, 0xa85a, + 0x00d8, 0x080c, 0x4bc8, 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, 0x1a6f, 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, + 0x3673, 0x7d98, 0x7c9c, 0x0804, 0x3777, 0x080c, 0x769d, 0x190c, + 0x613d, 0x6040, 0x9084, 0x0020, 0x09b1, 0x2069, 0x1847, 0x2d00, + 0x2009, 0x0030, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x2039, 0x0001, + 0x080c, 0x4c11, 0x701f, 0x4395, 0x0005, 0x080c, 0x582f, 0x1130, + 0x3b00, 0x3a08, 0xc194, 0xc095, 0x20d8, 0x21d0, 0x2069, 0x1847, + 0x6800, 0x9005, 0x0904, 0x36a8, 0x6804, 0xd0ac, 0x0118, 0xd0a4, + 0x0904, 0x36a8, 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, 0x36a8, 0x9288, + 0x3474, 0x210d, 0x918c, 0x00ff, 0x6166, 0xd0dc, 0x0130, 0x6828, + 0x908a, 0x007f, 0x1a04, 0x36a8, 0x605e, 0x6888, 0x9084, 0x0030, + 0x8004, 0x8004, 0x8004, 0x8004, 0x0006, 0x2009, 0x19b3, 0x9080, + 0x27dd, 0x2005, 0x200a, 0x2008, 0x2001, 0x0018, 0x080c, 0xaae8, + 0x2009, 0x0390, 0x200b, 0x0400, 0x000e, 0x2009, 0x19b4, 0x9080, + 0x27e1, 0x2005, 0x200a, 0x6808, 0x908a, 0x0100, 0x0a04, 0x36a8, + 0x908a, 0x0841, 0x1a04, 0x36a8, 0x9084, 0x0007, 0x1904, 0x36a8, + 0x680c, 0x9005, 0x0904, 0x36a8, 0x6810, 0x9005, 0x0904, 0x36a8, + 0x6848, 0x6940, 0x910a, 0x1a04, 0x36a8, 0x8001, 0x0904, 0x36a8, + 0x684c, 0x6944, 0x910a, 0x1a04, 0x36a8, 0x8001, 0x0904, 0x36a8, + 0x6814, 0x908c, 0x00ff, 0x614e, 0x8007, 0x9084, 0x00ff, 0x6052, + 0x080c, 0x79d0, 0x080c, 0x6c03, 0x080c, 0x6c65, 0x6808, 0x602a, + 0x080c, 0x21af, 0x2009, 0x0170, 0x200b, 0x0080, 0xa001, 0xa001, + 0x200b, 0x0000, 0x0036, 0x6b08, 0x080c, 0x2744, 0x003e, 0x6000, + 0x9086, 0x0000, 0x1904, 0x4524, 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, 0x19b5, 0x20e9, 0x0001, 0x4001, 0x20a9, 0x0004, 0x20a1, + 0x19cf, 0x20e9, 0x0001, 0x4001, 0x080c, 0x89bf, 0x00c6, 0x900e, + 0x20a9, 0x0001, 0x6b70, 0xd384, 0x01c8, 0x0020, 0x839d, 0x12b0, + 0x3508, 0x8109, 0x080c, 0x7f97, 0x6878, 0x6016, 0x6874, 0x2008, + 0x9084, 0xff00, 0x8007, 0x600a, 0x9184, 0x00ff, 0x6006, 0x8108, + 0x1118, 0x6003, 0x0003, 0x0010, 0x6003, 0x0001, 0x1f04, 0x447e, + 0x00ce, 0x00c6, 0x2061, 0x199d, 0x6a88, 0x9284, 0xc000, 0x2010, + 0x9286, 0x0000, 0x1158, 0x2063, 0x0000, 0x2001, 0x0001, 0x080c, + 0x29d7, 0x2001, 0x0001, 0x080c, 0x29ba, 0x0088, 0x9286, 0x4000, + 0x1148, 0x2063, 0x0001, 0x9006, 0x080c, 0x29d7, 0x9006, 0x080c, + 0x29ba, 0x0028, 0x9286, 0x8000, 0x1d30, 0x2063, 0x0002, 0x00ce, + 0x00e6, 0x2c70, 0x080c, 0x0ec7, 0x00ee, 0x080c, 0x2aff, 0x080c, + 0x2b32, 0x6888, 0xd0ec, 0x0130, 0x2011, 0x0114, 0x2204, 0x9085, + 0x0180, 0x2012, 0x6a80, 0x9284, 0x0030, 0x9086, 0x0030, 0x1128, + 0x9294, 0xffcf, 0x9295, 0x0020, 0x6a82, 0x2001, 0x197d, 0x6a80, + 0x9294, 0x0030, 0x928e, 0x0000, 0x0170, 0x928e, 0x0010, 0x0118, + 0x928e, 0x0020, 0x0140, 0x2003, 0xaaaa, 0x080c, 0x27b9, 0x2001, + 0x196e, 0x2102, 0x0008, 0x2102, 0x00c6, 0x2061, 0x0100, 0x602f, + 0x0040, 0x602f, 0x0000, 0x00ce, 0x080c, 0x769d, 0x0128, 0x080c, + 0x5108, 0x0110, 0x080c, 0x270a, 0x60d4, 0x9005, 0x01c0, 0x6003, + 0x0001, 0x2009, 0x450c, 0x00e0, 0x080c, 0x769d, 0x1168, 0x2011, + 0x7511, 0x080c, 0x882c, 0x2011, 0x7504, 0x080c, 0x8938, 0x080c, + 0x79a4, 0x080c, 0x75cc, 0x0040, 0x080c, 0x6033, 0x0028, 0x6003, + 0x0004, 0x2009, 0x4524, 0x0020, 0x080c, 0x6b2f, 0x0804, 0x3673, + 0x2001, 0x0170, 0x2004, 0x9084, 0x00ff, 0x9086, 0x004c, 0x1118, + 0x2091, 0x31bd, 0x0817, 0x2091, 0x313d, 0x0817, 0x6000, 0x9086, + 0x0000, 0x0904, 0x36a5, 0x2069, 0x1847, 0x7890, 0x6842, 0x7894, + 0x6846, 0x2d00, 0x2009, 0x0030, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, + 0x2039, 0x0001, 0x0804, 0x4c14, 0x9006, 0x080c, 0x270a, 0x81ff, + 0x1904, 0x36a5, 0x080c, 0x769d, 0x11b0, 0x080c, 0x799f, 0x080c, + 0x6178, 0x080c, 0x3468, 0x0118, 0x6130, 0xc18d, 0x6132, 0x080c, + 0xd35d, 0x0130, 0x080c, 0x76c0, 0x1118, 0x080c, 0x7671, 0x0038, + 0x080c, 0x75cc, 0x0020, 0x080c, 0x613d, 0x080c, 0x6033, 0x0804, + 0x3673, 0x81ff, 0x1904, 0x36a5, 0x080c, 0x769d, 0x1110, 0x0804, + 0x36a5, 0x0126, 0x2091, 0x8000, 0x6194, 0x81ff, 0x0190, 0x704f, + 0x0000, 0x2001, 0x1d80, 0x2009, 0x0040, 0x7a8c, 0x7b88, 0x7c9c, + 0x7d98, 0x2039, 0x0001, 0x080c, 0x4c14, 0x701f, 0x3671, 0x012e, + 0x0005, 0x704f, 0x0001, 0x00d6, 0x2069, 0x1d80, 0x20a9, 0x0040, + 0x20e9, 0x0001, 0x20a1, 0x1d80, 0x2019, 0xffff, 0x4304, 0x655c, + 0x9588, 0x3474, 0x210d, 0x918c, 0x00ff, 0x216a, 0x900e, 0x2011, + 0x0002, 0x2100, 0x9506, 0x01a8, 0x080c, 0x6783, 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, 0x60c8, 0x0804, 0x4581, 0x080c, 0x4bfb, + 0x0904, 0x36a8, 0x080c, 0x4bc8, 0x1120, 0x2009, 0x0002, 0x0804, + 0x36a5, 0x080c, 0x5820, 0xd0b4, 0x0558, 0x7884, 0x908e, 0x007e, + 0x0538, 0x908e, 0x007f, 0x0520, 0x908e, 0x0080, 0x0508, 0x080c, + 0x3463, 0x1148, 0xb800, 0xd08c, 0x11d8, 0xb804, 0x9084, 0x00ff, + 0x9086, 0x0006, 0x11a8, 0xa867, 0x0000, 0xa868, 0xc0fd, 0xa86a, + 0x080c, 0xce04, 0x1120, 0x2009, 0x0003, 0x0804, 0x36a5, 0x7007, + 0x0003, 0x701f, 0x460c, 0x0005, 0x080c, 0x4bfb, 0x0904, 0x36a8, + 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, 0x0fca, 0x0070, 0x20a9, 0x0004, 0xa85c, 0x9080, 0x000a, + 0x20a0, 0xb8c4, 0x20e0, 0xb8c8, 0x9080, 0x000a, 0x2098, 0x080c, + 0x0fca, 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, + 0x9080, 0x0002, 0x2009, 0x002b, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, + 0x0804, 0x4c14, 0x81ff, 0x1904, 0x36a5, 0x080c, 0x4bdf, 0x0904, + 0x36a8, 0x080c, 0x69c6, 0x0904, 0x36a5, 0x0058, 0xa878, 0x9005, + 0x0120, 0x2009, 0x0004, 0x0804, 0x36a5, 0xa974, 0xaa94, 0x0804, + 0x3673, 0x080c, 0x5828, 0x0904, 0x3673, 0x701f, 0x4656, 0x7007, + 0x0003, 0x0005, 0x81ff, 0x1904, 0x36a5, 0x7888, 0x908a, 0x1000, + 0x1a04, 0x36a8, 0x080c, 0x4bfb, 0x0904, 0x36a8, 0x080c, 0x6bcd, + 0x0120, 0x080c, 0x6bd5, 0x1904, 0x36a8, 0x080c, 0x6a4b, 0x0904, + 0x36a5, 0x2019, 0x0004, 0x900e, 0x080c, 0x69d8, 0x0904, 0x36a5, + 0x7984, 0x7a88, 0x04c9, 0x08a8, 0xa89c, 0x908a, 0x1000, 0x12f8, + 0x080c, 0x4bf9, 0x01e0, 0x080c, 0x6bcd, 0x0118, 0x080c, 0x6bd5, + 0x11b0, 0x080c, 0x6a4b, 0x2009, 0x0002, 0x0168, 0x2009, 0x0002, + 0x2019, 0x0004, 0x080c, 0x69d8, 0x2009, 0x0003, 0x0120, 0xa998, + 0xaa9c, 0x00d1, 0x0060, 0xa897, 0x4005, 0xa99a, 0x0010, 0xa897, + 0x4006, 0x900e, 0x9085, 0x0001, 0x2001, 0x0030, 0x0005, 0xa897, + 0x4000, 0x080c, 0x5828, 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, 0x6783, + 0x1138, 0x2200, 0x8003, 0x800b, 0x810b, 0x9108, 0x080c, 0x883a, + 0x0005, 0x81ff, 0x1904, 0x36a5, 0x798c, 0x2001, 0x1981, 0x918c, + 0x8000, 0x2102, 0x080c, 0x4bdf, 0x0904, 0x36a8, 0x080c, 0x6bcd, + 0x0120, 0x080c, 0x6bd5, 0x1904, 0x36a8, 0x080c, 0x684a, 0x0904, + 0x36a5, 0x080c, 0x69cf, 0x0904, 0x36a5, 0x2001, 0x1981, 0x2004, + 0xd0fc, 0x1904, 0x3673, 0x0804, 0x4661, 0xa9a0, 0x2001, 0x1981, + 0x918c, 0x8000, 0xc18d, 0x2102, 0x080c, 0x4bec, 0x01a0, 0x080c, + 0x6bcd, 0x0118, 0x080c, 0x6bd5, 0x1170, 0x080c, 0x684a, 0x2009, + 0x0002, 0x0128, 0x080c, 0x69cf, 0x1170, 0x2009, 0x0003, 0xa897, + 0x4005, 0xa99a, 0x0010, 0xa897, 0x4006, 0x900e, 0x9085, 0x0001, + 0x2001, 0x0030, 0x0005, 0xa897, 0x4000, 0x2001, 0x1981, 0x2004, + 0xd0fc, 0x1128, 0x080c, 0x5828, 0x0110, 0x9006, 0x0018, 0x900e, + 0x9085, 0x0001, 0x2001, 0x0000, 0x0005, 0x81ff, 0x1904, 0x36a5, + 0x798c, 0x2001, 0x1980, 0x918c, 0x8000, 0x2102, 0x080c, 0x4bdf, + 0x0904, 0x36a8, 0x080c, 0x6bcd, 0x0120, 0x080c, 0x6bd5, 0x1904, + 0x36a8, 0x080c, 0x684a, 0x0904, 0x36a5, 0x080c, 0x69bd, 0x0904, + 0x36a5, 0x2001, 0x1980, 0x2004, 0xd0fc, 0x1904, 0x3673, 0x0804, + 0x4661, 0xa9a0, 0x2001, 0x1980, 0x918c, 0x8000, 0xc18d, 0x2102, + 0x080c, 0x4bec, 0x01a0, 0x080c, 0x6bcd, 0x0118, 0x080c, 0x6bd5, + 0x1170, 0x080c, 0x684a, 0x2009, 0x0002, 0x0128, 0x080c, 0x69bd, + 0x1170, 0x2009, 0x0003, 0xa897, 0x4005, 0xa99a, 0x0010, 0xa897, + 0x4006, 0x900e, 0x9085, 0x0001, 0x2001, 0x0030, 0x0005, 0xa897, + 0x4000, 0x2001, 0x1980, 0x2004, 0xd0fc, 0x1128, 0x080c, 0x5828, + 0x0110, 0x9006, 0x0018, 0x900e, 0x9085, 0x0001, 0x2001, 0x0000, + 0x0005, 0x6100, 0x0804, 0x3673, 0x080c, 0x4bfb, 0x0904, 0x36a8, + 0x080c, 0x5834, 0x1904, 0x36a5, 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, + 0x3673, 0x78a8, 0x909c, 0x0003, 0xd0ac, 0x1150, 0xd0b4, 0x1140, + 0x939a, 0x0003, 0x1a04, 0x36a5, 0x625c, 0x7884, 0x9206, 0x1548, + 0x080c, 0x89a9, 0x2001, 0xffec, 0x2009, 0x000c, 0x7a8c, 0x7b88, + 0x7c9c, 0x7d98, 0x2039, 0x0000, 0x0006, 0x78a8, 0x9084, 0x0080, + 0x1118, 0x000e, 0x0804, 0x4c14, 0x000e, 0x2031, 0x0000, 0x2061, + 0x18b8, 0x2c44, 0xa66a, 0xa17a, 0xa772, 0xa076, 0xa28e, 0xa392, + 0xa496, 0xa59a, 0x080c, 0x1142, 0x7007, 0x0002, 0x701f, 0x4819, + 0x0005, 0x81ff, 0x1904, 0x36a5, 0x080c, 0x4bfb, 0x0904, 0x36a8, + 0x080c, 0x6bcd, 0x1904, 0x36a5, 0x00c6, 0x080c, 0x4bc8, 0x00ce, + 0x0904, 0x36a5, 0xa867, 0x0000, 0xa868, 0xc0fd, 0xa86a, 0x7ea8, + 0x080c, 0xcdaa, 0x0904, 0x36a5, 0x7007, 0x0003, 0x701f, 0x481d, + 0x0005, 0x080c, 0x435b, 0x0804, 0x3673, 0xa830, 0x9086, 0x0100, + 0x0904, 0x36a5, 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, + 0xffc0, 0x9080, 0x001b, 0x2009, 0x000c, 0x7a8c, 0x7b88, 0x7c9c, + 0x7d98, 0x0804, 0x4c14, 0x9006, 0x080c, 0x270a, 0x78a8, 0x9084, + 0x00ff, 0x9086, 0x00ff, 0x0118, 0x81ff, 0x1904, 0x36a5, 0x080c, + 0x769d, 0x0110, 0x080c, 0x613d, 0x7888, 0x908a, 0x1000, 0x1a04, + 0x36a8, 0x7984, 0x9186, 0x00ff, 0x0138, 0x9182, 0x007f, 0x1a04, + 0x36a8, 0x2100, 0x080c, 0x26d4, 0x0026, 0x00c6, 0x0126, 0x2091, + 0x8000, 0x2061, 0x1a05, 0x601b, 0x0000, 0x601f, 0x0000, 0x607b, + 0x0000, 0x607f, 0x0000, 0x080c, 0x769d, 0x1158, 0x080c, 0x799f, + 0x080c, 0x6178, 0x9085, 0x0001, 0x080c, 0x76e1, 0x080c, 0x75cc, + 0x00f0, 0x080c, 0xaaf7, 0x080c, 0xae87, 0x080c, 0xab13, 0x2061, + 0x0100, 0x2001, 0x1818, 0x2004, 0x9084, 0x00ff, 0x810f, 0x9105, + 0x604a, 0x6043, 0x0090, 0x6043, 0x0010, 0x2009, 0x199a, 0x200b, + 0x0000, 0x2009, 0x002d, 0x2011, 0x6063, 0x080c, 0x88f6, 0x7984, + 0x080c, 0x769d, 0x1110, 0x2009, 0x00ff, 0x7a88, 0x080c, 0x46c4, + 0x012e, 0x00ce, 0x002e, 0x0804, 0x3673, 0x7984, 0x080c, 0x6718, + 0x2b08, 0x1904, 0x36a8, 0x0804, 0x3673, 0x81ff, 0x0120, 0x2009, + 0x0001, 0x0804, 0x36a5, 0x60dc, 0xd0ac, 0x1130, 0xd09c, 0x1120, + 0x2009, 0x0005, 0x0804, 0x36a5, 0x080c, 0x4bc8, 0x1120, 0x2009, + 0x0002, 0x0804, 0x36a5, 0x7984, 0x81ff, 0x0904, 0x36a8, 0x9192, + 0x0021, 0x1a04, 0x36a8, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0xa85c, + 0x9080, 0x0019, 0x702a, 0xaf60, 0x7736, 0x080c, 0x4c11, 0x701f, + 0x48d8, 0x7880, 0x9086, 0x006e, 0x0110, 0x701f, 0x52ba, 0x0005, + 0x2009, 0x0080, 0x080c, 0x6783, 0x1118, 0x080c, 0x6bcd, 0x0120, + 0x2021, 0x400a, 0x0804, 0x3675, 0x00d6, 0x0096, 0xa964, 0xaa6c, + 0xab70, 0xac74, 0xad78, 0xae7c, 0xa884, 0x90be, 0x0100, 0x0904, + 0x4971, 0x90be, 0x0112, 0x0904, 0x4971, 0x90be, 0x0113, 0x0904, + 0x4971, 0x90be, 0x0114, 0x0904, 0x4971, 0x90be, 0x0117, 0x0904, + 0x4971, 0x90be, 0x011a, 0x0904, 0x4971, 0x90be, 0x011c, 0x0904, + 0x4971, 0x90be, 0x0121, 0x0904, 0x4958, 0x90be, 0x0131, 0x0904, + 0x4958, 0x90be, 0x0171, 0x0904, 0x4971, 0x90be, 0x0173, 0x0904, + 0x4971, 0x90be, 0x01a1, 0x1128, 0xa894, 0x8007, 0xa896, 0x0804, + 0x497c, 0x90be, 0x0212, 0x0904, 0x4965, 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, 0x36a8, 0x7028, + 0x9080, 0x0010, 0x2098, 0x20a0, 0x7034, 0x20e0, 0x20e8, 0x20a9, + 0x0007, 0x080c, 0x49ba, 0x7028, 0x9080, 0x000e, 0x2098, 0x20a0, + 0x7034, 0x20e0, 0x20e8, 0x20a9, 0x0001, 0x080c, 0x49ba, 0x00c8, + 0x7028, 0x9080, 0x000c, 0x2098, 0x20a0, 0x7034, 0x20e0, 0x20e8, + 0x20a9, 0x0001, 0x080c, 0x49c7, 0x00b8, 0x7028, 0x9080, 0x000e, + 0x2098, 0x20a0, 0x7034, 0x20e0, 0x20e8, 0x20a9, 0x0001, 0x080c, + 0x49c7, 0x7028, 0x9080, 0x000c, 0x2098, 0x20a0, 0x7034, 0x20e0, + 0x20e8, 0x20a9, 0x0001, 0x04f1, 0x00c6, 0x080c, 0x4bc8, 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, 0xcdc5, + 0x1120, 0x2009, 0x0003, 0x0804, 0x36a5, 0x7007, 0x0003, 0x701f, + 0x49b1, 0x0005, 0x00ce, 0x009e, 0x00de, 0x2009, 0x0002, 0x0804, + 0x36a5, 0xa820, 0x9086, 0x8001, 0x1904, 0x3673, 0x2009, 0x0004, + 0x0804, 0x36a5, 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, 0x36a5, + 0x60dc, 0xd0ac, 0x1130, 0xd09c, 0x1120, 0x2009, 0x0005, 0x0804, + 0x36a5, 0x7984, 0x78a8, 0x2040, 0x080c, 0xae80, 0x1120, 0x9182, + 0x007f, 0x0a04, 0x36a8, 0x9186, 0x00ff, 0x0904, 0x36a8, 0x9182, + 0x0800, 0x1a04, 0x36a8, 0x7a8c, 0x7b88, 0x607c, 0x9306, 0x1158, + 0x6080, 0x924e, 0x0904, 0x36a8, 0x080c, 0xae80, 0x1120, 0x99cc, + 0xff00, 0x0904, 0x36a8, 0x0126, 0x2091, 0x8000, 0x080c, 0x4adb, + 0x0904, 0x4a5b, 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, 0x6bcd, 0x0110, + 0xc89d, 0x0438, 0x900e, 0x080c, 0x6a74, 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, + 0x3675, 0x000e, 0x00ce, 0x2b00, 0x7026, 0x0016, 0x00b6, 0x00c6, + 0x00e6, 0x2c70, 0x080c, 0xafbf, 0x0904, 0x4ab0, 0x2b00, 0x6012, + 0x080c, 0xd0ce, 0x2e58, 0x00ee, 0x00e6, 0x00c6, 0x080c, 0x4bc8, + 0x00ce, 0x2b70, 0x1158, 0x080c, 0xaf4e, 0x00ee, 0x00ce, 0x00be, + 0x001e, 0x012e, 0x2009, 0x0002, 0x0804, 0x36a5, 0x900e, 0xa966, + 0xa96a, 0x2900, 0x6016, 0xa932, 0xa868, 0xc0fd, 0xd88c, 0x0108, + 0xc0f5, 0xa86a, 0xd89c, 0x1110, 0x080c, 0x32fb, 0x6023, 0x0001, + 0x9006, 0x080c, 0x66b5, 0xd89c, 0x0138, 0x2001, 0x0004, 0x080c, + 0x66c9, 0x2009, 0x0003, 0x0030, 0x2001, 0x0002, 0x080c, 0x66c9, + 0x2009, 0x0002, 0x080c, 0xafec, 0x78a8, 0xd094, 0x0138, 0x00ee, + 0x7024, 0x00e6, 0x2058, 0xb8d4, 0xc08d, 0xb8d6, 0x9085, 0x0001, + 0x00ee, 0x00ce, 0x00be, 0x001e, 0x012e, 0x1120, 0x2009, 0x0003, + 0x0804, 0x36a5, 0x7007, 0x0003, 0x701f, 0x4abf, 0x0005, 0xa830, + 0x9086, 0x0100, 0x7024, 0x2058, 0x1138, 0x2009, 0x0004, 0xba04, + 0x9294, 0x00ff, 0x0804, 0x576e, 0x900e, 0xa868, 0xd0f4, 0x1904, + 0x3673, 0x080c, 0x6a74, 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, + 0xc18d, 0x0804, 0x3673, 0x00e6, 0x00d6, 0x0096, 0x83ff, 0x0904, + 0x4b2a, 0x902e, 0x080c, 0xae80, 0x0130, 0x9026, 0x20a9, 0x0800, + 0x2071, 0x1000, 0x0030, 0x2021, 0x007f, 0x20a9, 0x0781, 0x2071, + 0x107f, 0x2e04, 0x9005, 0x11b8, 0x2100, 0x9406, 0x1904, 0x4b3b, + 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, 0x6b6d, 0x1570, 0x2001, 0x4000, + 0x0460, 0x080c, 0x6bcd, 0x1540, 0x2001, 0x4000, 0x0430, 0x2001, + 0x4007, 0x0418, 0x2001, 0x4006, 0x0400, 0x2400, 0x9106, 0x1158, + 0xbe14, 0x87ff, 0x1128, 0x86ff, 0x0918, 0x080c, 0xae80, 0x1900, + 0x2001, 0x4008, 0x0090, 0x8420, 0x8e70, 0x1f04, 0x4af1, 0x85ff, + 0x1130, 0x2001, 0x4009, 0x0048, 0x2001, 0x0001, 0x0030, 0x080c, + 0x6718, 0x1dd0, 0xbb12, 0xba16, 0x9006, 0x9005, 0x009e, 0x00de, + 0x00ee, 0x0005, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x36a5, + 0x080c, 0x4bc8, 0x1120, 0x2009, 0x0002, 0x0804, 0x36a5, 0xa867, + 0x0000, 0xa868, 0xc0fd, 0xa86a, 0x7884, 0x9005, 0x0904, 0x36a8, + 0x9096, 0x00ff, 0x0120, 0x9092, 0x0004, 0x1a04, 0x36a8, 0x2010, + 0x2918, 0x080c, 0x329b, 0x1120, 0x2009, 0x0003, 0x0804, 0x36a5, + 0x7007, 0x0003, 0x701f, 0x4b7d, 0x0005, 0xa830, 0x9086, 0x0100, + 0x1904, 0x3673, 0x2009, 0x0004, 0x0804, 0x36a5, 0x7984, 0x080c, + 0xae80, 0x1120, 0x9182, 0x007f, 0x0a04, 0x36a8, 0x9186, 0x00ff, + 0x0904, 0x36a8, 0x9182, 0x0800, 0x1a04, 0x36a8, 0x2001, 0x9400, + 0x080c, 0x57c9, 0x1904, 0x36a5, 0x0804, 0x3673, 0xa998, 0x080c, + 0xae80, 0x1118, 0x9182, 0x007f, 0x0280, 0x9186, 0x00ff, 0x0168, + 0x9182, 0x0800, 0x1250, 0x2001, 0x9400, 0x080c, 0x57c9, 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, 0x104d, 0x0198, 0x9006, 0xa802, 0x7014, 0x9005, 0x1120, + 0x2900, 0x7016, 0x701a, 0x0040, 0x7018, 0xa802, 0x0086, 0x2040, + 0x2900, 0xa006, 0x701a, 0x008e, 0x9085, 0x0001, 0x0005, 0x7984, + 0x080c, 0x6783, 0x1130, 0x7e88, 0x9684, 0x3fff, 0x9082, 0x4000, + 0x0208, 0x905e, 0x8bff, 0x0005, 0xa998, 0x080c, 0x6783, 0x1130, + 0xae9c, 0x9684, 0x3fff, 0x9082, 0x4000, 0x0208, 0x905e, 0x8bff, + 0x0005, 0xae98, 0x0008, 0x7e84, 0x2608, 0x080c, 0x6783, 0x1108, + 0x0008, 0x905e, 0x8bff, 0x0005, 0x0016, 0x7114, 0x81ff, 0x0128, + 0x2148, 0xa904, 0x080c, 0x107f, 0x0cc8, 0x7116, 0x711a, 0x001e, + 0x0005, 0x2031, 0x0001, 0x0010, 0x2031, 0x0000, 0x2061, 0x18b8, + 0x2c44, 0xa66a, 0xa17a, 0xa772, 0xa076, 0xa28e, 0xa392, 0xa496, + 0xa59a, 0x080c, 0x1142, 0x7007, 0x0002, 0x701f, 0x3673, 0x0005, + 0x00f6, 0x0126, 0x2091, 0x8000, 0x2079, 0x0000, 0x2001, 0x18b0, + 0x2004, 0x9005, 0x1190, 0x0e04, 0x4c45, 0x7a36, 0x7833, 0x0012, + 0x7a82, 0x7b86, 0x7c8a, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, + 0xd084, 0x190c, 0x11f4, 0x0804, 0x4cab, 0x0016, 0x0086, 0x0096, + 0x00c6, 0x00e6, 0x2071, 0x189e, 0x7044, 0x9005, 0x1540, 0x7148, + 0x9182, 0x0010, 0x0288, 0x7038, 0x2060, 0x080c, 0x104d, 0x0904, + 0x4ca3, 0xa84b, 0x0000, 0x2900, 0x7046, 0x2001, 0x0002, 0x9080, + 0x1ede, 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, 0x0d79, 0x2060, 0x001e, 0x8108, 0x2105, 0x9005, + 0xa146, 0x1520, 0x080c, 0x104d, 0x1130, 0x8109, 0xa946, 0x7148, + 0x8109, 0x714a, 0x00d8, 0x9006, 0xa806, 0xa84a, 0xa046, 0x2800, + 0xa802, 0x2900, 0xa006, 0x7046, 0x2001, 0x0002, 0x9080, 0x1ede, + 0x2005, 0xa846, 0x0058, 0x2262, 0x6306, 0x640a, 0x00ee, 0x00ce, + 0x009e, 0x008e, 0x001e, 0x012e, 0x00fe, 0x0005, 0x2c00, 0x9082, + 0x001b, 0x0002, 0x4ccd, 0x4ccd, 0x4ccf, 0x4ccd, 0x4ccd, 0x4ccd, + 0x4cd3, 0x4ccd, 0x4ccd, 0x4ccd, 0x4cd7, 0x4ccd, 0x4ccd, 0x4ccd, + 0x4cdb, 0x4ccd, 0x4ccd, 0x4ccd, 0x4cdf, 0x4ccd, 0x4ccd, 0x4ccd, + 0x4ce3, 0x4ccd, 0x4ccd, 0x4ccd, 0x4ce8, 0x080c, 0x0d79, 0xa276, + 0xa37a, 0xa47e, 0x0898, 0xa286, 0xa38a, 0xa48e, 0x0878, 0xa296, + 0xa39a, 0xa49e, 0x0858, 0xa2a6, 0xa3aa, 0xa4ae, 0x0838, 0xa2b6, + 0xa3ba, 0xa4be, 0x0818, 0xa2c6, 0xa3ca, 0xa4ce, 0x0804, 0x4ca6, + 0xa2d6, 0xa3da, 0xa4de, 0x0804, 0x4ca6, 0x00e6, 0x2071, 0x189e, + 0x7048, 0x9005, 0x0904, 0x4d7f, 0x0126, 0x2091, 0x8000, 0x0e04, + 0x4d7e, 0x00f6, 0x2079, 0x0000, 0x00c6, 0x0096, 0x0086, 0x0076, + 0x9006, 0x2038, 0x7040, 0x2048, 0x9005, 0x0500, 0xa948, 0x2105, + 0x0016, 0x908a, 0x0036, 0x1a0c, 0x0d79, 0x2060, 0x001e, 0x8108, + 0x2105, 0x9005, 0xa94a, 0x1904, 0x4d81, 0xa804, 0x9005, 0x090c, + 0x0d79, 0x7042, 0x2938, 0x2040, 0xa003, 0x0000, 0x2001, 0x0002, + 0x9080, 0x1ede, 0x2005, 0xa04a, 0x0804, 0x4d81, 0x703c, 0x2060, + 0x2c14, 0x6304, 0x6408, 0x650c, 0x2200, 0x7836, 0x7833, 0x0012, + 0x7882, 0x2300, 0x7886, 0x2400, 0x788a, 0x2091, 0x4080, 0x2001, + 0x0089, 0x2004, 0xd084, 0x190c, 0x11f4, 0x87ff, 0x0118, 0x2748, + 0x080c, 0x107f, 0x7048, 0x8001, 0x704a, 0x9005, 0x1170, 0x7040, + 0x2048, 0x9005, 0x0128, 0x080c, 0x107f, 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, 0x0d79, 0x2048, 0xa800, 0x9005, 0x1de0, + 0x2900, 0x7042, 0x2001, 0x0002, 0x9080, 0x1ede, 0x2005, 0xa84a, + 0x0000, 0x007e, 0x008e, 0x009e, 0x00ce, 0x00fe, 0x012e, 0x00ee, + 0x0005, 0x2c00, 0x9082, 0x001b, 0x0002, 0x4da0, 0x4da0, 0x4da2, + 0x4da0, 0x4da0, 0x4da0, 0x4da7, 0x4da0, 0x4da0, 0x4da0, 0x4dac, + 0x4da0, 0x4da0, 0x4da0, 0x4db1, 0x4da0, 0x4da0, 0x4da0, 0x4db6, + 0x4da0, 0x4da0, 0x4da0, 0x4dbb, 0x4da0, 0x4da0, 0x4da0, 0x4dc0, + 0x080c, 0x0d79, 0xaa74, 0xab78, 0xac7c, 0x0804, 0x4d2c, 0xaa84, + 0xab88, 0xac8c, 0x0804, 0x4d2c, 0xaa94, 0xab98, 0xac9c, 0x0804, + 0x4d2c, 0xaaa4, 0xaba8, 0xacac, 0x0804, 0x4d2c, 0xaab4, 0xabb8, + 0xacbc, 0x0804, 0x4d2c, 0xaac4, 0xabc8, 0xaccc, 0x0804, 0x4d2c, + 0xaad4, 0xabd8, 0xacdc, 0x0804, 0x4d2c, 0x0016, 0x0026, 0x0036, + 0x00b6, 0x00c6, 0x2009, 0x007e, 0x080c, 0x6783, 0x2019, 0x0001, + 0xb85c, 0xd0ac, 0x0110, 0x2019, 0x0000, 0x2011, 0x801b, 0x080c, + 0x4c28, 0x00ce, 0x00be, 0x003e, 0x002e, 0x001e, 0x0005, 0x0026, + 0x080c, 0x5820, 0xd0c4, 0x0120, 0x2011, 0x8014, 0x080c, 0x4c28, + 0x002e, 0x0005, 0x81ff, 0x1904, 0x36a5, 0x0126, 0x2091, 0x8000, + 0x6030, 0xc08d, 0xc085, 0xc0ac, 0x6032, 0x080c, 0x769d, 0x1158, + 0x080c, 0x799f, 0x080c, 0x6178, 0x9085, 0x0001, 0x080c, 0x76e1, + 0x080c, 0x75cc, 0x0010, 0x080c, 0x6033, 0x012e, 0x0804, 0x3673, + 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x36a5, 0x080c, 0x5834, + 0x0120, 0x2009, 0x0007, 0x0804, 0x36a5, 0x080c, 0x6bc5, 0x0120, + 0x2009, 0x0008, 0x0804, 0x36a5, 0x7984, 0x080c, 0x6718, 0x1904, + 0x36a8, 0x080c, 0x4bfb, 0x0904, 0x36a8, 0x2b00, 0x7026, 0x080c, + 0x6bcd, 0x7888, 0x1170, 0x9084, 0x0005, 0x1158, 0x900e, 0x080c, + 0x6a74, 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d, 0x0804, + 0x3673, 0x080c, 0x4bc8, 0x0904, 0x36a5, 0x9006, 0xa866, 0xa832, + 0xa868, 0xc0fd, 0xa86a, 0x080c, 0xce6c, 0x0904, 0x36a5, 0x7888, + 0xd094, 0x0118, 0xb8d4, 0xc08d, 0xb8d6, 0x7007, 0x0003, 0x701f, + 0x4e9b, 0x0005, 0x2061, 0x1800, 0x080c, 0x5834, 0x2009, 0x0007, + 0x1560, 0x080c, 0x6bc5, 0x0118, 0x2009, 0x0008, 0x0430, 0xa998, + 0x080c, 0x6718, 0x1530, 0x080c, 0x4bf9, 0x0518, 0x080c, 0x6bcd, + 0xa89c, 0x1168, 0x9084, 0x0005, 0x1150, 0x900e, 0x080c, 0x6a74, + 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d, 0x00d0, 0xa868, + 0xc0fc, 0xa86a, 0x080c, 0xce6c, 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, 0x9086, 0x0100, 0x7024, 0x2058, + 0x1110, 0x0804, 0x576e, 0x900e, 0x080c, 0x6a74, 0x1108, 0xc185, + 0xb800, 0xd0bc, 0x0108, 0xc18d, 0x0804, 0x3673, 0x080c, 0x5834, + 0x0120, 0x2009, 0x0007, 0x0804, 0x36a5, 0x7f84, 0x7a8c, 0x7b88, + 0x7c9c, 0x7d98, 0x080c, 0x4bc8, 0x1120, 0x2009, 0x0002, 0x0804, + 0x36a5, 0x900e, 0x2130, 0x7126, 0x7132, 0xa860, 0x20e8, 0x7036, + 0xa85c, 0x9080, 0x0005, 0x702a, 0x20a0, 0x080c, 0x6783, 0x1904, + 0x4f44, 0x080c, 0x6bcd, 0x0138, 0x080c, 0x6bd5, 0x0120, 0x080c, + 0x6b6d, 0x1904, 0x4f44, 0xd794, 0x1110, 0xd784, 0x01a8, 0xb8c4, + 0x20e0, 0xb8c8, 0x9080, 0x0006, 0x2098, 0x3400, 0xd794, 0x0198, + 0x20a9, 0x0008, 0x4003, 0x2098, 0x20a0, 0x3d00, 0x20e0, 0x20a9, + 0x0002, 0x080c, 0x49c7, 0x0080, 0xb8c4, 0x20e0, 0xb8c8, 0x9080, + 0x000a, 0x2098, 0x3400, 0x20a9, 0x0004, 0x4003, 0x2098, 0x20a0, + 0x3d00, 0x20e0, 0x080c, 0x49c7, 0x9186, 0x007e, 0x0170, 0x9186, + 0x0080, 0x0158, 0x080c, 0x6bcd, 0x90c2, 0x0006, 0x1210, 0xc1fd, + 0x0020, 0x080c, 0x6a74, 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, 0x49ba, 0x9c80, 0x0026, + 0x2098, 0xb8c4, 0x20e0, 0x20a9, 0x0002, 0x4003, 0xd794, 0x0110, + 0x96b0, 0x000b, 0x96b0, 0x0005, 0x8108, 0x080c, 0xae80, 0x0118, + 0x9186, 0x0800, 0x0040, 0xd78c, 0x0120, 0x9186, 0x0800, 0x0170, + 0x0018, 0x9186, 0x007e, 0x0150, 0xd794, 0x0118, 0x9686, 0x0020, + 0x0010, 0x9686, 0x0028, 0x0150, 0x0804, 0x4ecd, 0x86ff, 0x1120, + 0x7124, 0x810b, 0x0804, 0x3673, 0x7033, 0x0001, 0x7122, 0x7024, + 0x9600, 0x7026, 0x772e, 0x2061, 0x18b8, 0x2c44, 0xa06b, 0x0000, + 0xa67a, 0x7034, 0xa072, 0x7028, 0xa076, 0xa28e, 0xa392, 0xa496, + 0xa59a, 0x080c, 0x1142, 0x7007, 0x0002, 0x701f, 0x4f80, 0x0005, + 0x7030, 0x9005, 0x1180, 0x7120, 0x7028, 0x20a0, 0x772c, 0x9036, + 0x7034, 0x20e8, 0x2061, 0x18b8, 0x2c44, 0xa28c, 0xa390, 0xa494, + 0xa598, 0x0804, 0x4ecd, 0x7124, 0x810b, 0x0804, 0x3673, 0x2029, + 0x007e, 0x7984, 0x7a88, 0x7b8c, 0x7c98, 0x9184, 0xff00, 0x8007, + 0x90e2, 0x0020, 0x0a04, 0x36a8, 0x9502, 0x0a04, 0x36a8, 0x9184, + 0x00ff, 0x90e2, 0x0020, 0x0a04, 0x36a8, 0x9502, 0x0a04, 0x36a8, + 0x9284, 0xff00, 0x8007, 0x90e2, 0x0020, 0x0a04, 0x36a8, 0x9502, + 0x0a04, 0x36a8, 0x9284, 0x00ff, 0x90e2, 0x0020, 0x0a04, 0x36a8, + 0x9502, 0x0a04, 0x36a8, 0x9384, 0xff00, 0x8007, 0x90e2, 0x0020, + 0x0a04, 0x36a8, 0x9502, 0x0a04, 0x36a8, 0x9384, 0x00ff, 0x90e2, + 0x0020, 0x0a04, 0x36a8, 0x9502, 0x0a04, 0x36a8, 0x9484, 0xff00, + 0x8007, 0x90e2, 0x0020, 0x0a04, 0x36a8, 0x9502, 0x0a04, 0x36a8, + 0x9484, 0x00ff, 0x90e2, 0x0020, 0x0a04, 0x36a8, 0x9502, 0x0a04, + 0x36a8, 0x2061, 0x198a, 0x6102, 0x6206, 0x630a, 0x640e, 0x0804, + 0x3673, 0x080c, 0x4bc8, 0x0904, 0x36a5, 0x2009, 0x0016, 0x7a8c, + 0x7b88, 0x7c9c, 0x7d98, 0xa85c, 0x9080, 0x0019, 0xaf60, 0x080c, + 0x4c11, 0x701f, 0x5004, 0x0005, 0x2001, 0x0138, 0x2003, 0x0000, + 0x00e6, 0x2071, 0x0300, 0x701c, 0xd0a4, 0x1de8, 0x00ee, 0x20a9, + 0x0016, 0x896e, 0x8d6e, 0x8d6f, 0x9d84, 0xffc0, 0x9080, 0x0019, + 0x2098, 0x9d84, 0x003f, 0x20e0, 0x2069, 0x1877, 0x20e9, 0x0001, + 0x2da0, 0x4003, 0x6800, 0x9005, 0x0904, 0x5085, 0x6804, 0x2008, + 0x918c, 0xfff8, 0x1904, 0x5085, 0x680c, 0x9005, 0x0904, 0x5085, + 0x9082, 0xff01, 0x1a04, 0x5085, 0x6810, 0x9082, 0x005c, 0x0a04, + 0x5085, 0x6824, 0x2008, 0x9082, 0x0008, 0x0a04, 0x5085, 0x9182, + 0x0400, 0x1a04, 0x5085, 0x0056, 0x2029, 0x0000, 0x080c, 0x8f0d, + 0x005e, 0x6944, 0x6820, 0x9102, 0x06c0, 0x6820, 0x9082, 0x0019, + 0x16a0, 0x6828, 0x6944, 0x810c, 0x9102, 0x0678, 0x6840, 0x9082, + 0x000f, 0x1658, 0x080c, 0x1066, 0x2900, 0x0904, 0x50a1, 0x684e, + 0x00e6, 0x2071, 0x1932, 0x00b6, 0x2059, 0x0000, 0x080c, 0x8dc9, + 0x00be, 0x00ee, 0x0568, 0x080c, 0x8b11, 0x080c, 0x8b60, 0x11e0, + 0x6857, 0x0000, 0x00c6, 0x2061, 0x0100, 0x6104, 0x918d, 0x2000, + 0x6106, 0x6b10, 0x2061, 0x1a6f, 0x630e, 0x00ce, 0x080c, 0x27b9, + 0x2001, 0x0138, 0x2102, 0x0804, 0x3673, 0x080c, 0x27b9, 0x2001, + 0x0138, 0x2102, 0x0804, 0x36a8, 0x080c, 0x8b59, 0x00e6, 0x2071, + 0x1932, 0x080c, 0x8f8d, 0x080c, 0x8f9c, 0x080c, 0x8dac, 0x00ee, + 0x2001, 0x188a, 0x204c, 0x080c, 0x107f, 0x2001, 0x188a, 0x2003, + 0x0000, 0x080c, 0x27b9, 0x2001, 0x0138, 0x2102, 0x0804, 0x36a5, + 0x2001, 0x1926, 0x200c, 0x918e, 0x0000, 0x0904, 0x5106, 0x080c, + 0x8da7, 0x0904, 0x5106, 0x2001, 0x0101, 0x200c, 0x918c, 0xdfff, + 0x2102, 0x2001, 0x0138, 0x2003, 0x0000, 0x00e6, 0x2071, 0x0300, + 0x701c, 0xd0a4, 0x1de8, 0x00ee, 0x080c, 0x8dac, 0x0126, 0x2091, + 0x8000, 0x2001, 0x0035, 0x080c, 0x16ad, 0x012e, 0x00c6, 0x2061, + 0x193e, 0x6004, 0x6100, 0x9106, 0x1de0, 0x00ce, 0x080c, 0x27b9, + 0x2001, 0x0138, 0x2102, 0x00e6, 0x00f6, 0x2071, 0x1925, 0x080c, + 0x8ce6, 0x0120, 0x2f00, 0x080c, 0x8d72, 0x0cc8, 0x00fe, 0x00ee, + 0x0126, 0x2091, 0x8000, 0x2001, 0x188a, 0x200c, 0x81ff, 0x0138, + 0x2148, 0x080c, 0x107f, 0x2001, 0x188a, 0x2003, 0x0000, 0x2001, + 0x183e, 0x2003, 0x0020, 0x080c, 0x8b59, 0x00e6, 0x2071, 0x1932, + 0x080c, 0x8f8d, 0x080c, 0x8f9c, 0x00ee, 0x012e, 0x0804, 0x3673, + 0x0006, 0x080c, 0x5820, 0xd0cc, 0x000e, 0x0005, 0x0006, 0x080c, + 0x5824, 0xd0bc, 0x000e, 0x0005, 0x6174, 0x7a84, 0x6300, 0x82ff, + 0x1118, 0x7986, 0x0804, 0x3673, 0x83ff, 0x1904, 0x36a8, 0x2001, + 0xfff0, 0x9200, 0x1a04, 0x36a8, 0x2019, 0xffff, 0x6078, 0x9302, + 0x9200, 0x0a04, 0x36a8, 0x7986, 0x6276, 0x0804, 0x3673, 0x080c, + 0x5834, 0x1904, 0x36a5, 0x7c88, 0x7d84, 0x7e98, 0x7f8c, 0x080c, + 0x4bc8, 0x0904, 0x36a5, 0x900e, 0x901e, 0x7326, 0x7332, 0xa860, + 0x20e8, 0x7036, 0xa85c, 0x9080, 0x0003, 0x702a, 0x20a0, 0x91d8, + 0x1000, 0x2b5c, 0x8bff, 0x0178, 0x080c, 0x6bcd, 0x0118, 0x080c, + 0x6bd5, 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, 0x9364, 0x2208, 0x0804, 0x3673, 0x7033, 0x0001, + 0x7122, 0x7024, 0x9300, 0x7026, 0x2061, 0x18b8, 0x2c44, 0xa06b, + 0x0000, 0xa37a, 0x7028, 0xa076, 0x7034, 0xa072, 0xa48e, 0xa592, + 0xa696, 0xa79a, 0x080c, 0x1142, 0x7007, 0x0002, 0x701f, 0x5189, + 0x0005, 0x7030, 0x9005, 0x1178, 0x7120, 0x7028, 0x20a0, 0x901e, + 0x7034, 0x20e8, 0x2061, 0x18b8, 0x2c44, 0xa48c, 0xa590, 0xa694, + 0xa798, 0x0804, 0x5147, 0x7224, 0x900e, 0x2001, 0x0003, 0x080c, + 0x9364, 0x2208, 0x0804, 0x3673, 0x00f6, 0x00e6, 0x080c, 0x5834, + 0x2009, 0x0007, 0x1904, 0x521c, 0x2071, 0x189e, 0x745c, 0x84ff, + 0x2009, 0x000e, 0x1904, 0x521c, 0xac9c, 0xad98, 0xaea4, 0xafa0, + 0x0096, 0x080c, 0x1066, 0x2009, 0x0002, 0x0904, 0x521c, 0x2900, + 0x705e, 0x900e, 0x901e, 0x7356, 0x7362, 0xa860, 0x7066, 0xa85c, + 0x9080, 0x0003, 0x705a, 0x20a0, 0x91d8, 0x1000, 0x2b5c, 0x8bff, + 0x0178, 0x080c, 0x6bcd, 0x0118, 0x080c, 0x6bd5, 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, 0x9364, + 0x2208, 0x009e, 0xa897, 0x4000, 0xa99a, 0x715c, 0x81ff, 0x090c, + 0x0d79, 0x2148, 0x080c, 0x107f, 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, 0x5228, 0x000e, 0xa0a2, + 0x080c, 0x1142, 0x9006, 0x0048, 0x009e, 0xa897, 0x4005, 0xa99a, + 0x900e, 0x9085, 0x0001, 0x2001, 0x0030, 0x00ee, 0x00fe, 0x0005, + 0x00f6, 0xa0a0, 0x904d, 0x090c, 0x0d79, 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, 0x9364, 0xaa9a, 0x715c, 0x81ff, + 0x090c, 0x0d79, 0x2148, 0x080c, 0x107f, 0x705f, 0x0000, 0xa0a0, + 0x2048, 0x0126, 0x2091, 0x8000, 0x080c, 0x6f11, 0x012e, 0xa09f, + 0x0000, 0xa0a3, 0x0000, 0x00ee, 0x00fe, 0x0005, 0x91d8, 0x1000, + 0x2b5c, 0x8bff, 0x0178, 0x080c, 0x6bcd, 0x0118, 0x080c, 0x6bd5, + 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, 0x0d79, 0x2148, 0x080c, 0x107f, + 0x9006, 0x705e, 0x918d, 0x0001, 0x2008, 0xa0a0, 0x2048, 0x0126, + 0x2091, 0x8000, 0x080c, 0x6f11, 0x012e, 0xa09f, 0x0000, 0xa0a3, + 0x0000, 0x0070, 0x7063, 0x0001, 0x7152, 0x7054, 0x9300, 0x7056, + 0xa37a, 0xa48e, 0xa592, 0xa696, 0xa79a, 0x080c, 0x1142, 0x9006, + 0x00ee, 0x0005, 0x0096, 0xa88c, 0x90be, 0x7000, 0x0148, 0x90be, + 0x7100, 0x0130, 0x90be, 0x7200, 0x0118, 0x009e, 0x0804, 0x36a8, + 0xa884, 0xa988, 0x080c, 0x26a1, 0x1518, 0x080c, 0x6718, 0x1500, + 0x7126, 0xbe12, 0xbd16, 0xae7c, 0x080c, 0x4bc8, 0x01c8, 0x080c, + 0x4bc8, 0x01b0, 0x009e, 0xa867, 0x0000, 0xa868, 0xc0fd, 0xa86a, + 0xa823, 0x0000, 0xa804, 0x2048, 0x080c, 0xcde5, 0x1120, 0x2009, + 0x0003, 0x0804, 0x36a5, 0x7007, 0x0003, 0x701f, 0x52f5, 0x0005, + 0x009e, 0x2009, 0x0002, 0x0804, 0x36a5, 0x7124, 0x080c, 0x3404, + 0xa820, 0x9086, 0x8001, 0x1120, 0x2009, 0x0004, 0x0804, 0x36a5, + 0x2900, 0x7022, 0xa804, 0x0096, 0x2048, 0x8906, 0x8006, 0x8007, + 0x90bc, 0x003f, 0x9084, 0xffc0, 0x009e, 0x9080, 0x0002, 0x0076, + 0x0006, 0x2098, 0x20a0, 0x27e0, 0x27e8, 0x20a9, 0x002a, 0x080c, + 0x0fca, 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, 0x4c14, 0x97c6, 0x7200, 0x11b8, 0x96c2, 0x0054, + 0x02a0, 0x000e, 0x007e, 0x2061, 0x18b8, 0x2c44, 0xa076, 0xa772, + 0xa07b, 0x002a, 0xa28e, 0xa392, 0xa496, 0xa59a, 0x080c, 0x1142, + 0x7007, 0x0002, 0x701f, 0x5351, 0x0005, 0x000e, 0x007e, 0x0804, + 0x36a8, 0x7020, 0x2048, 0xa804, 0x2048, 0xa804, 0x2048, 0x8906, + 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x0002, + 0x2098, 0x20a0, 0x27e0, 0x27e8, 0x20a9, 0x002a, 0x080c, 0x0fca, + 0x2100, 0x2238, 0x2061, 0x18b8, 0x2c44, 0xa28c, 0xa390, 0xa494, + 0xa598, 0x2009, 0x002a, 0x0804, 0x4c14, 0x81ff, 0x1904, 0x36a5, + 0x798c, 0x2001, 0x197f, 0x918c, 0x8000, 0x2102, 0x080c, 0x4bdf, + 0x0904, 0x36a8, 0x080c, 0x6bcd, 0x0120, 0x080c, 0x6bd5, 0x1904, + 0x36a8, 0x080c, 0x684a, 0x0904, 0x36a5, 0x0126, 0x2091, 0x8000, + 0x080c, 0x69e1, 0x012e, 0x0904, 0x36a5, 0x2001, 0x197f, 0x2004, + 0xd0fc, 0x1904, 0x3673, 0x0804, 0x4661, 0xa9a0, 0x2001, 0x197f, + 0x918c, 0x8000, 0xc18d, 0x2102, 0x080c, 0x4bec, 0x01a0, 0x080c, + 0x6bcd, 0x0118, 0x080c, 0x6bd5, 0x1170, 0x080c, 0x684a, 0x2009, + 0x0002, 0x0128, 0x080c, 0x69e1, 0x1170, 0x2009, 0x0003, 0xa897, + 0x4005, 0xa99a, 0x0010, 0xa897, 0x4006, 0x900e, 0x9085, 0x0001, + 0x2001, 0x0030, 0x0005, 0xa897, 0x4000, 0x2001, 0x197f, 0x2004, + 0xd0fc, 0x1128, 0x080c, 0x5828, 0x0110, 0x9006, 0x0018, 0x900e, + 0x9085, 0x0001, 0x2001, 0x0000, 0x0005, 0x78a8, 0xd08c, 0x1118, + 0xd084, 0x0904, 0x45d6, 0x080c, 0x4bfb, 0x0904, 0x36a8, 0x080c, + 0x4bc8, 0x1120, 0x2009, 0x0002, 0x0804, 0x36a5, 0x080c, 0x6bcd, + 0x0130, 0x908e, 0x0004, 0x0118, 0x908e, 0x0005, 0x15a0, 0x78a8, + 0xd08c, 0x0120, 0xb800, 0xc08c, 0xb802, 0x0028, 0x080c, 0x5820, + 0xd0b4, 0x0904, 0x4610, 0x7884, 0x908e, 0x007e, 0x0904, 0x4610, + 0x908e, 0x007f, 0x0904, 0x4610, 0x908e, 0x0080, 0x0904, 0x4610, + 0xb800, 0xd08c, 0x1904, 0x4610, 0xa867, 0x0000, 0xa868, 0xc0fd, + 0xa86a, 0x080c, 0xce04, 0x1120, 0x2009, 0x0003, 0x0804, 0x36a5, + 0x7007, 0x0003, 0x701f, 0x541d, 0x0005, 0x080c, 0x4bfb, 0x0904, + 0x36a8, 0x0804, 0x4610, 0x080c, 0x3463, 0x0108, 0x0005, 0x2009, + 0x1834, 0x210c, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x36a5, + 0x080c, 0x5834, 0x0120, 0x2009, 0x0007, 0x0804, 0x36a5, 0x080c, + 0x6bc5, 0x0120, 0x2009, 0x0008, 0x0804, 0x36a5, 0xb89c, 0xd0a4, + 0x1118, 0xd0ac, 0x1904, 0x4610, 0x9006, 0xa866, 0xa832, 0xa868, + 0xc0fd, 0xa86a, 0x080c, 0xce6c, 0x1120, 0x2009, 0x0003, 0x0804, + 0x36a5, 0x7007, 0x0003, 0x701f, 0x5456, 0x0005, 0xa830, 0x9086, + 0x0100, 0x1120, 0x2009, 0x0004, 0x0804, 0x576e, 0x080c, 0x4bfb, + 0x0904, 0x36a8, 0x0804, 0x53ef, 0x81ff, 0x2009, 0x0001, 0x1904, + 0x36a5, 0x080c, 0x5834, 0x2009, 0x0007, 0x1904, 0x36a5, 0x080c, + 0x6bc5, 0x0120, 0x2009, 0x0008, 0x0804, 0x36a5, 0x080c, 0x4bfb, + 0x0904, 0x36a8, 0x080c, 0x6bcd, 0x2009, 0x0009, 0x1904, 0x36a5, + 0x080c, 0x4bc8, 0x2009, 0x0002, 0x0904, 0x36a5, 0x9006, 0xa866, + 0xa832, 0xa868, 0xc0fd, 0xa86a, 0x7988, 0xa95a, 0x9194, 0xfd00, + 0x918c, 0x00ff, 0x9006, 0x82ff, 0x1128, 0xc0ed, 0xa952, 0x798c, + 0xa956, 0x0038, 0x928e, 0x0100, 0x1904, 0x36a8, 0xc0e5, 0xa952, + 0xa956, 0xa83e, 0x080c, 0xd0cf, 0x2009, 0x0003, 0x0904, 0x36a5, + 0x7007, 0x0003, 0x701f, 0x54ad, 0x0005, 0xa830, 0x9086, 0x0100, + 0x2009, 0x0004, 0x0904, 0x36a5, 0x0804, 0x3673, 0x7aa8, 0x9284, + 0xc000, 0x0148, 0xd2ec, 0x01a0, 0x080c, 0x5834, 0x1188, 0x2009, + 0x0014, 0x0804, 0x36a5, 0xd2dc, 0x1578, 0x81ff, 0x2009, 0x0001, + 0x1904, 0x36a5, 0x080c, 0x5834, 0x2009, 0x0007, 0x1904, 0x36a5, + 0xd2f4, 0x0138, 0x9284, 0x5000, 0xc0d5, 0x080c, 0x57fa, 0x0804, + 0x3673, 0xd2fc, 0x0160, 0x080c, 0x4bfb, 0x0904, 0x36a8, 0x7984, + 0x9284, 0x9000, 0xc0d5, 0x080c, 0x57c9, 0x0804, 0x3673, 0x080c, + 0x4bfb, 0x0904, 0x36a8, 0xb804, 0x9084, 0x00ff, 0x9086, 0x0006, + 0x2009, 0x0009, 0x1904, 0x559c, 0x080c, 0x4bc8, 0x2009, 0x0002, + 0x0904, 0x559c, 0xa85c, 0x9080, 0x001b, 0xaf60, 0x2009, 0x0008, + 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x080c, 0x4c11, 0x701f, 0x5509, + 0x0005, 0xa86c, 0x9086, 0x0500, 0x1138, 0xa870, 0x9005, 0x1120, + 0xa874, 0x9084, 0xff00, 0x0110, 0x1904, 0x36a8, 0xa866, 0xa832, + 0xa868, 0xc0fd, 0xa86a, 0x080c, 0x4bfb, 0x1110, 0x0804, 0x36a8, + 0x2009, 0x0043, 0x080c, 0xd13b, 0x2009, 0x0003, 0x0904, 0x559c, + 0x7007, 0x0003, 0x701f, 0x552d, 0x0005, 0xa830, 0x9086, 0x0100, + 0x2009, 0x0004, 0x0904, 0x559c, 0x7984, 0x7aa8, 0x9284, 0x1000, + 0xc0d5, 0x080c, 0x57c9, 0x0804, 0x3673, 0x00c6, 0xaab0, 0x9284, + 0xc000, 0x0148, 0xd2ec, 0x0170, 0x080c, 0x5834, 0x1158, 0x2009, + 0x0014, 0x0804, 0x558b, 0x2061, 0x1800, 0x080c, 0x5834, 0x2009, + 0x0007, 0x15c8, 0xd2f4, 0x0130, 0x9284, 0x5000, 0xc0d5, 0x080c, + 0x57fa, 0x0058, 0xd2fc, 0x0180, 0x080c, 0x4bf9, 0x0590, 0xa998, + 0x9284, 0x9000, 0xc0d5, 0x080c, 0x57c9, 0xa87b, 0x0000, 0xa883, + 0x0000, 0xa897, 0x4000, 0x0438, 0x080c, 0x4bf9, 0x0510, 0x080c, + 0x6bcd, 0x2009, 0x0009, 0x11b8, 0xa8c4, 0x9086, 0x0500, 0x11c8, + 0xa8c8, 0x9005, 0x11b0, 0xa8cc, 0x9084, 0xff00, 0x1190, 0x080c, + 0x4bf9, 0x1108, 0x0070, 0x2009, 0x004b, 0x080c, 0xd13b, 0x2009, + 0x0003, 0x0108, 0x0078, 0x0431, 0x19c0, 0xa897, 0x4005, 0xa99a, + 0x0010, 0xa897, 0x4006, 0x900e, 0x9085, 0x0001, 0x2001, 0x0030, + 0x00ce, 0x0005, 0x9006, 0x0ce0, 0x7aa8, 0xd2dc, 0x0904, 0x36a5, + 0x0016, 0x7984, 0x9284, 0x1000, 0xc0fd, 0x080c, 0x57c9, 0x001e, + 0x1904, 0x36a5, 0x0804, 0x3673, 0x00f6, 0x2d78, 0xaab0, 0x0021, + 0x00fe, 0x0005, 0xaab0, 0xc2d5, 0xd2dc, 0x0150, 0x0016, 0xa998, + 0x9284, 0x1400, 0xc0fd, 0x080c, 0x57c9, 0x001e, 0x9085, 0x0001, + 0x0005, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x36a5, 0x080c, + 0x5834, 0x0120, 0x2009, 0x0007, 0x0804, 0x36a5, 0x7984, 0x7ea8, + 0x96b4, 0x00ff, 0x080c, 0x6783, 0x1904, 0x36a8, 0x9186, 0x007f, + 0x0138, 0x080c, 0x6bcd, 0x0120, 0x2009, 0x0009, 0x0804, 0x36a5, + 0x080c, 0x4bc8, 0x1120, 0x2009, 0x0002, 0x0804, 0x36a5, 0xa867, + 0x0000, 0xa868, 0xc0fd, 0xa86a, 0x2001, 0x0100, 0x8007, 0xa80a, + 0x080c, 0xce1e, 0x1120, 0x2009, 0x0003, 0x0804, 0x36a5, 0x7007, + 0x0003, 0x701f, 0x55fc, 0x0005, 0xa808, 0x8007, 0x9086, 0x0100, + 0x1120, 0x2009, 0x0004, 0x0804, 0x36a5, 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, 0x4c14, 0x080c, 0x4bc8, 0x1120, 0x2009, 0x0002, + 0x0804, 0x36a5, 0x7984, 0x9194, 0xff00, 0x918c, 0x00ff, 0x8217, + 0x82ff, 0x1118, 0x7023, 0x19b5, 0x0040, 0x92c6, 0x0001, 0x1118, + 0x7023, 0x19cf, 0x0010, 0x0804, 0x36a8, 0x2009, 0x001a, 0x7a8c, + 0x7b88, 0x7c9c, 0x7d98, 0xa85c, 0x9080, 0x0019, 0xaf60, 0x080c, + 0x4c11, 0x701f, 0x564c, 0x0005, 0x2001, 0x182e, 0x2003, 0x0001, + 0xa85c, 0x9080, 0x0019, 0x2098, 0xa860, 0x20e0, 0x20a9, 0x001a, + 0x7020, 0x20a0, 0x20e9, 0x0001, 0x4003, 0x0804, 0x3673, 0x080c, + 0x4bc8, 0x1120, 0x2009, 0x0002, 0x0804, 0x36a5, 0x7984, 0x9194, + 0xff00, 0x918c, 0x00ff, 0x8217, 0x82ff, 0x1118, 0x2099, 0x19b5, + 0x0040, 0x92c6, 0x0001, 0x1118, 0x2099, 0x19cf, 0x0010, 0x0804, + 0x36a8, 0xa85c, 0x9080, 0x0019, 0x20a0, 0xa860, 0x20e8, 0x20a9, + 0x001a, 0x20e1, 0x0001, 0x4003, 0x2009, 0x001a, 0x7a8c, 0x7b88, + 0x7c9c, 0x7d98, 0xa85c, 0x9080, 0x0019, 0xaf60, 0x0804, 0x4c14, + 0x7884, 0x908a, 0x1000, 0x1a04, 0x36a8, 0x0126, 0x2091, 0x8000, + 0x8003, 0x800b, 0x810b, 0x9108, 0x00c6, 0x2061, 0x1a05, 0x614a, + 0x00ce, 0x012e, 0x0804, 0x3673, 0x00c6, 0x080c, 0x769d, 0x1160, + 0x080c, 0x799f, 0x080c, 0x6178, 0x9085, 0x0001, 0x080c, 0x76e1, + 0x080c, 0x75cc, 0x080c, 0x0d79, 0x2061, 0x1800, 0x6030, 0xc09d, + 0x6032, 0x080c, 0x6033, 0x00ce, 0x0005, 0x00c6, 0x2001, 0x1800, + 0x2004, 0x908e, 0x0000, 0x0904, 0x36a5, 0x7884, 0x9005, 0x0188, + 0x7888, 0x2061, 0x199d, 0x2c0c, 0x2062, 0x080c, 0x2a70, 0x01a0, + 0x080c, 0x2a78, 0x0188, 0x080c, 0x2a80, 0x0170, 0x2162, 0x0804, + 0x36a8, 0x2061, 0x0100, 0x6038, 0x9086, 0x0007, 0x1118, 0x2009, + 0x0001, 0x0010, 0x2009, 0x0000, 0x7884, 0x9086, 0x0002, 0x15a8, + 0x2061, 0x0100, 0x6028, 0xc09c, 0x602a, 0x080c, 0xaaf7, 0x0026, + 0x2011, 0x0003, 0x080c, 0xa426, 0x2011, 0x0002, 0x080c, 0xa430, + 0x002e, 0x080c, 0xa311, 0x0036, 0x901e, 0x080c, 0xa391, 0x003e, + 0x080c, 0xab13, 0x60e3, 0x0000, 0x080c, 0xebe8, 0x080c, 0xec03, + 0x9085, 0x0001, 0x080c, 0x76e1, 0x9006, 0x080c, 0x2aa2, 0x2001, + 0x1800, 0x2003, 0x0004, 0x2001, 0x19a9, 0x2003, 0x0000, 0x0026, + 0x2011, 0x0008, 0x080c, 0x2adc, 0x002e, 0x00ce, 0x0804, 0x3673, + 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x36a5, 0x080c, 0x5834, + 0x0120, 0x2009, 0x0007, 0x0804, 0x36a5, 0x7984, 0x7ea8, 0x96b4, + 0x00ff, 0x080c, 0x6783, 0x1904, 0x36a8, 0x9186, 0x007f, 0x0138, + 0x080c, 0x6bcd, 0x0120, 0x2009, 0x0009, 0x0804, 0x36a5, 0x080c, + 0x4bc8, 0x1120, 0x2009, 0x0002, 0x0804, 0x36a5, 0xa867, 0x0000, + 0xa868, 0xc0fd, 0xa86a, 0x080c, 0xce21, 0x1120, 0x2009, 0x0003, + 0x0804, 0x36a5, 0x7007, 0x0003, 0x701f, 0x5757, 0x0005, 0xa830, + 0x9086, 0x0100, 0x1120, 0x2009, 0x0004, 0x0804, 0x36a5, 0xa8e0, + 0xa866, 0xa834, 0x8007, 0x800c, 0xa85c, 0x9080, 0x000c, 0x7a8c, + 0x7b88, 0x7c9c, 0x7d98, 0xaf60, 0x0804, 0x4c14, 0xa898, 0x9086, + 0x000d, 0x1904, 0x36a5, 0x2021, 0x4005, 0x0126, 0x2091, 0x8000, + 0x0e04, 0x577b, 0x0010, 0x012e, 0x0cc0, 0x7c36, 0x9486, 0x4000, + 0x0118, 0x7833, 0x0011, 0x0010, 0x7833, 0x0010, 0x7883, 0x4005, + 0xa998, 0x7986, 0xa9a4, 0x799a, 0xa9a8, 0x799e, 0x080c, 0x4c04, + 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x11f4, + 0x7007, 0x0001, 0x2091, 0x5000, 0x700f, 0x0000, 0x012e, 0x0005, + 0x0126, 0x2091, 0x8000, 0x00c6, 0x2061, 0x1a05, 0x7984, 0x615a, + 0x6156, 0x605f, 0x0000, 0x6053, 0x0009, 0x7898, 0x6072, 0x789c, + 0x606e, 0x7888, 0x606a, 0x788c, 0x6066, 0x2001, 0x1a15, 0x2044, + 0x2001, 0x1a1c, 0xa076, 0xa060, 0xa072, 0xa07b, 0x0001, 0xa07f, + 0x0002, 0xa06b, 0x0000, 0xa09f, 0x0000, 0x00ce, 0x012e, 0x0804, + 0x3673, 0x0126, 0x2091, 0x8000, 0x00b6, 0x00c6, 0x90e4, 0xc000, + 0x0198, 0x0006, 0xd0d4, 0x0160, 0x0036, 0x2019, 0x0029, 0x080c, + 0xaaf7, 0x0106, 0x080c, 0x3428, 0x010e, 0x090c, 0xab13, 0x003e, + 0x080c, 0xcc80, 0x000e, 0x1198, 0xd0e4, 0x0160, 0x9180, 0x1000, + 0x2004, 0x905d, 0x0160, 0x080c, 0x6192, 0x080c, 0xae80, 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, 0x57c9, + 0x002e, 0x001e, 0x8108, 0x1f04, 0x5802, 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, 0x36a8, + 0x9182, 0x0081, 0x1a04, 0x36a8, 0x810c, 0x0016, 0x080c, 0x4bc8, + 0x0170, 0x080c, 0x0f55, 0x2100, 0x2238, 0x7d84, 0x7c88, 0x7b8c, + 0x7a90, 0x001e, 0x080c, 0x4c11, 0x701f, 0x5864, 0x0005, 0x001e, + 0x2009, 0x0002, 0x0804, 0x36a5, 0x2079, 0x0000, 0x7d94, 0x7c98, + 0x7ba8, 0x7aac, 0x79a4, 0x810c, 0x2061, 0x18b8, 0x2c44, 0xa770, + 0xa074, 0x2071, 0x189e, 0x080c, 0x4c14, 0x701f, 0x5878, 0x0005, + 0x2061, 0x18b8, 0x2c44, 0x0016, 0x0026, 0xa270, 0xa174, 0x080c, + 0x0f5d, 0x002e, 0x001e, 0x080c, 0x100a, 0x9006, 0xa802, 0xa806, + 0x0804, 0x3673, 0x0126, 0x0156, 0x0136, 0x0146, 0x01c6, 0x01d6, + 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x2061, 0x0100, 0x2069, 0x0200, + 0x2071, 0x1800, 0x6044, 0xd0a4, 0x11e8, 0xd084, 0x0118, 0x080c, + 0x5a33, 0x0068, 0xd08c, 0x0118, 0x080c, 0x593c, 0x0040, 0xd094, + 0x0118, 0x080c, 0x590c, 0x0018, 0xd09c, 0x0108, 0x0099, 0x00fe, + 0x00ee, 0x00de, 0x00ce, 0x01de, 0x01ce, 0x014e, 0x013e, 0x015e, + 0x012e, 0x0005, 0x0016, 0x6128, 0xd19c, 0x1110, 0xc19d, 0x612a, + 0x001e, 0x0c68, 0x0006, 0x7098, 0x9005, 0x000e, 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, 0x60f4, 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, + 0x5fd6, 0x080c, 0x88f6, 0x0005, 0x2001, 0x1869, 0x2004, 0xd08c, + 0x0110, 0x705f, 0xffff, 0x7088, 0x9005, 0x1528, 0x2011, 0x5fd6, + 0x080c, 0x882c, 0x6040, 0x9094, 0x0010, 0x9285, 0x0020, 0x6042, + 0x20a9, 0x00c8, 0x6044, 0xd08c, 0x1168, 0x1f04, 0x5922, 0x6242, + 0x709b, 0x0000, 0x6040, 0x9094, 0x0010, 0x9285, 0x0080, 0x6042, + 0x6242, 0x0048, 0x6242, 0x709b, 0x0000, 0x708f, 0x0000, 0x9006, + 0x080c, 0x617d, 0x0000, 0x0005, 0x708c, 0x908a, 0x0003, 0x1a0c, + 0x0d79, 0x000b, 0x0005, 0x5946, 0x5997, 0x5a32, 0x00f6, 0x0016, + 0x6900, 0x918c, 0x0800, 0x708f, 0x0001, 0x2001, 0x015d, 0x2003, + 0x0000, 0x6803, 0x00fc, 0x20a9, 0x0004, 0x6800, 0x9084, 0x00fc, + 0x0120, 0x1f04, 0x5955, 0x080c, 0x0d79, 0x68a0, 0x68a2, 0x689c, + 0x689e, 0x6898, 0x689a, 0xa001, 0x918d, 0x1600, 0x6902, 0x001e, + 0x6837, 0x0020, 0x080c, 0x6159, 0x2079, 0x1d00, 0x7833, 0x1101, + 0x7837, 0x0000, 0x20e1, 0x0001, 0x2099, 0x1805, 0x20e9, 0x0001, + 0x20a1, 0x1d0e, 0x20a9, 0x0004, 0x4003, 0x080c, 0xa8ec, 0x20e1, + 0x0001, 0x2099, 0x1d00, 0x20e9, 0x0000, 0x20a1, 0x0240, 0x20a9, + 0x0014, 0x4003, 0x60c3, 0x000c, 0x600f, 0x0000, 0x080c, 0x6007, + 0x00fe, 0x9006, 0x7092, 0x6043, 0x0008, 0x6042, 0x0005, 0x00f6, + 0x7090, 0x7093, 0x0000, 0x9025, 0x0904, 0x5a0f, 0x6020, 0xd0b4, + 0x1904, 0x5a0d, 0x71a0, 0x81ff, 0x0904, 0x59fb, 0x9486, 0x000c, + 0x1904, 0x5a08, 0x9480, 0x0018, 0x8004, 0x20a8, 0x080c, 0x6152, + 0x2011, 0x0260, 0x2019, 0x1d00, 0x220c, 0x2304, 0x9106, 0x11e8, + 0x8210, 0x8318, 0x1f04, 0x59b4, 0x6043, 0x0004, 0x2061, 0x0140, + 0x605b, 0xbc94, 0x605f, 0xf0f0, 0x2061, 0x0100, 0x6043, 0x0006, + 0x708f, 0x0002, 0x709b, 0x0002, 0x2009, 0x07d0, 0x2011, 0x5fdd, + 0x080c, 0x88f6, 0x080c, 0x6159, 0x04c0, 0x080c, 0x6152, 0x2079, + 0x0260, 0x7930, 0x918e, 0x1101, 0x1558, 0x7834, 0x9005, 0x1540, + 0x7900, 0x918c, 0x00ff, 0x1118, 0x7804, 0x9005, 0x0190, 0x080c, + 0x6152, 0x2011, 0x026e, 0x2019, 0x1805, 0x20a9, 0x0004, 0x220c, + 0x2304, 0x9102, 0x0230, 0x11a0, 0x8210, 0x8318, 0x1f04, 0x59ef, + 0x0078, 0x70a3, 0x0000, 0x080c, 0x6152, 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, 0xa8ec, + 0x20e1, 0x0001, 0x2099, 0x1d00, 0x20e9, 0x0000, 0x20a1, 0x0240, + 0x20a9, 0x0014, 0x4003, 0x60c3, 0x000c, 0x2011, 0x19f6, 0x2013, + 0x0000, 0x7093, 0x0000, 0x60a3, 0x0056, 0x60a7, 0x9575, 0x080c, + 0xa08e, 0x08d8, 0x0005, 0x7098, 0x908a, 0x001d, 0x1a0c, 0x0d79, + 0x000b, 0x0005, 0x5a64, 0x5a77, 0x5aa0, 0x5ac0, 0x5ae6, 0x5b15, + 0x5b3b, 0x5b73, 0x5b99, 0x5bc7, 0x5c02, 0x5c3a, 0x5c58, 0x5c83, + 0x5ca5, 0x5cc0, 0x5cca, 0x5cfe, 0x5d24, 0x5d53, 0x5d79, 0x5db1, + 0x5df5, 0x5e32, 0x5e53, 0x5eac, 0x5ece, 0x5efc, 0x5efc, 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, 0x5fdd, 0x080c, 0x88f6, 0x0005, 0x00f6, + 0x7090, 0x9086, 0x0014, 0x1510, 0x6042, 0x6020, 0xd0b4, 0x11f0, + 0x080c, 0x6152, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1102, 0x11a0, + 0x7834, 0x9005, 0x1188, 0x7a38, 0xd2fc, 0x0128, 0x70c4, 0x9005, + 0x1110, 0x70c7, 0x0001, 0x2011, 0x5fdd, 0x080c, 0x882c, 0x709b, + 0x0010, 0x080c, 0x5cca, 0x0010, 0x7093, 0x0000, 0x00fe, 0x0005, + 0x00f6, 0x709b, 0x0003, 0x6043, 0x0004, 0x2011, 0x5fdd, 0x080c, + 0x882c, 0x080c, 0x60d6, 0x2079, 0x0240, 0x7833, 0x1102, 0x7837, + 0x0000, 0x20a9, 0x0008, 0x9f88, 0x000e, 0x200b, 0x0000, 0x8108, + 0x1f04, 0x5ab5, 0x60c3, 0x0014, 0x080c, 0x6007, 0x00fe, 0x0005, + 0x00f6, 0x7090, 0x9005, 0x0500, 0x2011, 0x5fdd, 0x080c, 0x882c, + 0x9086, 0x0014, 0x11b8, 0x080c, 0x6152, 0x2079, 0x0260, 0x7a30, + 0x9296, 0x1102, 0x1178, 0x7834, 0x9005, 0x1160, 0x7a38, 0xd2fc, + 0x0128, 0x70c4, 0x9005, 0x1110, 0x70c7, 0x0001, 0x709b, 0x0004, + 0x0029, 0x0010, 0x080c, 0x612e, 0x00fe, 0x0005, 0x00f6, 0x709b, + 0x0005, 0x080c, 0x60d6, 0x2079, 0x0240, 0x7833, 0x1103, 0x7837, + 0x0000, 0x080c, 0x6152, 0x080c, 0x6135, 0x1170, 0x7084, 0x9005, + 0x1158, 0x715c, 0x9186, 0xffff, 0x0138, 0x2011, 0x0008, 0x080c, + 0x5f8a, 0x0168, 0x080c, 0x610b, 0x20a9, 0x0008, 0x20e1, 0x0000, + 0x2099, 0x026e, 0x20e9, 0x0000, 0x20a1, 0x024e, 0x4003, 0x60c3, + 0x0014, 0x080c, 0x6007, 0x00fe, 0x0005, 0x00f6, 0x7090, 0x9005, + 0x0500, 0x2011, 0x5fdd, 0x080c, 0x882c, 0x9086, 0x0014, 0x11b8, + 0x080c, 0x6152, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1103, 0x1178, + 0x7834, 0x9005, 0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70c4, 0x9005, + 0x1110, 0x70c7, 0x0001, 0x709b, 0x0006, 0x0029, 0x0010, 0x080c, + 0x612e, 0x00fe, 0x0005, 0x00f6, 0x709b, 0x0007, 0x080c, 0x60d6, + 0x2079, 0x0240, 0x7833, 0x1104, 0x7837, 0x0000, 0x080c, 0x6152, + 0x080c, 0x6135, 0x11b8, 0x7084, 0x9005, 0x11a0, 0x7164, 0x9186, + 0xffff, 0x0180, 0x9180, 0x3474, 0x200d, 0x918c, 0xff00, 0x810f, + 0x2011, 0x0008, 0x080c, 0x5f8a, 0x0180, 0x080c, 0x510e, 0x0110, + 0x080c, 0x270a, 0x20a9, 0x0008, 0x20e1, 0x0000, 0x2099, 0x026e, + 0x20e9, 0x0000, 0x20a1, 0x024e, 0x4003, 0x60c3, 0x0014, 0x080c, + 0x6007, 0x00fe, 0x0005, 0x00f6, 0x7090, 0x9005, 0x0500, 0x2011, + 0x5fdd, 0x080c, 0x882c, 0x9086, 0x0014, 0x11b8, 0x080c, 0x6152, + 0x2079, 0x0260, 0x7a30, 0x9296, 0x1104, 0x1178, 0x7834, 0x9005, + 0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70c4, 0x9005, 0x1110, 0x70c7, + 0x0001, 0x709b, 0x0008, 0x0029, 0x0010, 0x080c, 0x612e, 0x00fe, + 0x0005, 0x00f6, 0x709b, 0x0009, 0x080c, 0x60d6, 0x2079, 0x0240, + 0x7833, 0x1105, 0x7837, 0x0100, 0x080c, 0x6135, 0x1150, 0x7084, + 0x9005, 0x1138, 0x080c, 0x5efd, 0x1188, 0x9085, 0x0001, 0x080c, + 0x270a, 0x20a9, 0x0008, 0x080c, 0x6152, 0x20e1, 0x0000, 0x2099, + 0x026e, 0x20e9, 0x0000, 0x20a1, 0x024e, 0x4003, 0x60c3, 0x0014, + 0x080c, 0x6007, 0x0010, 0x080c, 0x5a57, 0x00fe, 0x0005, 0x00f6, + 0x7090, 0x9005, 0x05a8, 0x2011, 0x5fdd, 0x080c, 0x882c, 0x9086, + 0x0014, 0x1560, 0x080c, 0x6152, 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, 0x5ca5, 0x0010, 0x080c, 0x612e, + 0x00fe, 0x0005, 0x00f6, 0x709b, 0x000b, 0x2011, 0x1d0e, 0x20e9, + 0x0001, 0x22a0, 0x20a9, 0x0040, 0x2019, 0xffff, 0x4304, 0x080c, + 0x60d6, 0x2079, 0x0240, 0x7833, 0x1106, 0x7837, 0x0000, 0x080c, + 0x6135, 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, 0x5c27, 0x60c3, 0x0084, 0x080c, 0x6007, + 0x00fe, 0x0005, 0x00f6, 0x7090, 0x9005, 0x01c0, 0x2011, 0x5fdd, + 0x080c, 0x882c, 0x9086, 0x0084, 0x1178, 0x080c, 0x6152, 0x2079, + 0x0260, 0x7a30, 0x9296, 0x1106, 0x1138, 0x7834, 0x9005, 0x1120, + 0x709b, 0x000c, 0x0029, 0x0010, 0x080c, 0x612e, 0x00fe, 0x0005, + 0x00f6, 0x709b, 0x000d, 0x080c, 0x60d6, 0x2079, 0x0240, 0x7833, + 0x1107, 0x7837, 0x0000, 0x080c, 0x6152, 0x20a9, 0x0040, 0x2011, + 0x026e, 0x2009, 0x024e, 0x220e, 0x8210, 0x8108, 0x9186, 0x0260, + 0x1150, 0x6810, 0x8000, 0x6812, 0x2009, 0x0240, 0x6814, 0x8000, + 0x6816, 0x2011, 0x0260, 0x1f04, 0x5c6b, 0x60c3, 0x0084, 0x080c, + 0x6007, 0x00fe, 0x0005, 0x00f6, 0x7090, 0x9005, 0x01e0, 0x2011, + 0x5fdd, 0x080c, 0x882c, 0x9086, 0x0084, 0x1198, 0x080c, 0x6152, + 0x2079, 0x0260, 0x7a30, 0x9296, 0x1107, 0x1158, 0x7834, 0x9005, + 0x1140, 0x7097, 0x0001, 0x080c, 0x60a8, 0x709b, 0x000e, 0x0029, + 0x0010, 0x080c, 0x612e, 0x00fe, 0x0005, 0x918d, 0x0001, 0x080c, + 0x617d, 0x709b, 0x000f, 0x7093, 0x0000, 0x2061, 0x0140, 0x605b, + 0xbc85, 0x605f, 0xb5b5, 0x2061, 0x0100, 0x6043, 0x0005, 0x6043, + 0x0004, 0x2009, 0x07d0, 0x2011, 0x5fdd, 0x080c, 0x8820, 0x0005, + 0x7090, 0x9005, 0x0130, 0x2011, 0x5fdd, 0x080c, 0x882c, 0x709b, + 0x0000, 0x0005, 0x709b, 0x0011, 0x080c, 0xa8ec, 0x080c, 0x6152, + 0x20e1, 0x0000, 0x2099, 0x0260, 0x20e9, 0x0000, 0x20a1, 0x0240, + 0x7490, 0x9480, 0x0018, 0x9080, 0x0007, 0x9084, 0x03f8, 0x8004, + 0x20a8, 0x4003, 0x080c, 0x6135, 0x11a0, 0x717c, 0x81ff, 0x0188, + 0x900e, 0x7080, 0x9084, 0x00ff, 0x0160, 0x080c, 0x26a1, 0x9186, + 0x007e, 0x0138, 0x9186, 0x0080, 0x0120, 0x2011, 0x0008, 0x080c, + 0x5f8a, 0x60c3, 0x0014, 0x080c, 0x6007, 0x0005, 0x00f6, 0x7090, + 0x9005, 0x0500, 0x2011, 0x5fdd, 0x080c, 0x882c, 0x9086, 0x0014, + 0x11b8, 0x080c, 0x6152, 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, + 0x60e4, 0x2079, 0x0240, 0x7833, 0x1103, 0x7837, 0x0000, 0x080c, + 0x6152, 0x080c, 0x6135, 0x1170, 0x7084, 0x9005, 0x1158, 0x715c, + 0x9186, 0xffff, 0x0138, 0x2011, 0x0008, 0x080c, 0x5f8a, 0x0168, + 0x080c, 0x610b, 0x20a9, 0x0008, 0x20e1, 0x0000, 0x2099, 0x026e, + 0x20e9, 0x0000, 0x20a1, 0x024e, 0x4003, 0x60c3, 0x0014, 0x080c, + 0x6007, 0x00fe, 0x0005, 0x00f6, 0x7090, 0x9005, 0x0500, 0x2011, + 0x5fdd, 0x080c, 0x882c, 0x9086, 0x0014, 0x11b8, 0x080c, 0x6152, + 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, 0x60e4, 0x2079, 0x0240, + 0x7833, 0x1104, 0x7837, 0x0000, 0x080c, 0x6152, 0x080c, 0x6135, + 0x11b8, 0x7084, 0x9005, 0x11a0, 0x7164, 0x9186, 0xffff, 0x0180, + 0x9180, 0x3474, 0x200d, 0x918c, 0xff00, 0x810f, 0x2011, 0x0008, + 0x080c, 0x5f8a, 0x0180, 0x080c, 0x510e, 0x0110, 0x080c, 0x270a, + 0x20a9, 0x0008, 0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9, 0x0000, + 0x20a1, 0x024e, 0x4003, 0x60c3, 0x0014, 0x080c, 0x6007, 0x00fe, + 0x0005, 0x00f6, 0x7090, 0x9005, 0x05f0, 0x2011, 0x5fdd, 0x080c, + 0x882c, 0x9086, 0x0014, 0x15a8, 0x080c, 0x6152, 0x2079, 0x0260, + 0x7a30, 0x9296, 0x1105, 0x1568, 0x7834, 0x9084, 0x0100, 0x2011, + 0x0100, 0x921e, 0x1168, 0x9085, 0x0001, 0x080c, 0x617d, 0x7a38, + 0xd2fc, 0x0128, 0x70c4, 0x9005, 0x1110, 0x70c7, 0x0001, 0x0080, + 0x9005, 0x11b8, 0x7a38, 0xd2fc, 0x0128, 0x70c4, 0x9005, 0x1110, + 0x70c7, 0x0001, 0x9085, 0x0001, 0x080c, 0x617d, 0x7097, 0x0000, + 0x7a38, 0xd2f4, 0x0110, 0x70df, 0x0008, 0x709b, 0x0016, 0x0029, + 0x0010, 0x7093, 0x0000, 0x00fe, 0x0005, 0x080c, 0xa8ec, 0x080c, + 0x6152, 0x20e1, 0x0000, 0x2099, 0x0260, 0x20e9, 0x0000, 0x20a1, + 0x0240, 0x20a9, 0x000e, 0x4003, 0x2011, 0x026d, 0x2204, 0x9084, + 0x0100, 0x2011, 0x024d, 0x2012, 0x2011, 0x026e, 0x709b, 0x0017, + 0x080c, 0x6135, 0x1150, 0x7084, 0x9005, 0x1138, 0x080c, 0x5efd, + 0x1188, 0x9085, 0x0001, 0x080c, 0x270a, 0x20a9, 0x0008, 0x080c, + 0x6152, 0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9, 0x0000, 0x20a1, + 0x024e, 0x4003, 0x60c3, 0x0014, 0x080c, 0x6007, 0x0010, 0x080c, + 0x5a57, 0x0005, 0x00f6, 0x7090, 0x9005, 0x01d8, 0x2011, 0x5fdd, + 0x080c, 0x882c, 0x9086, 0x0084, 0x1190, 0x080c, 0x6152, 0x2079, + 0x0260, 0x7a30, 0x9296, 0x1106, 0x1150, 0x7834, 0x9005, 0x1138, + 0x9006, 0x080c, 0x617d, 0x709b, 0x0018, 0x0029, 0x0010, 0x7093, + 0x0000, 0x00fe, 0x0005, 0x00f6, 0x709b, 0x0019, 0x080c, 0x60e4, + 0x2079, 0x0240, 0x7833, 0x1106, 0x7837, 0x0000, 0x080c, 0x6152, + 0x2009, 0x026e, 0x2039, 0x1d0e, 0x20a9, 0x0040, 0x213e, 0x8738, + 0x8108, 0x9186, 0x0280, 0x1128, 0x6814, 0x8000, 0x6816, 0x2009, + 0x0260, 0x1f04, 0x5e66, 0x2039, 0x1d0e, 0x080c, 0x6135, 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, 0x5e99, 0x60c3, 0x0084, + 0x080c, 0x6007, 0x00fe, 0x0005, 0x00f6, 0x7090, 0x9005, 0x01e0, + 0x2011, 0x5fdd, 0x080c, 0x882c, 0x9086, 0x0084, 0x1198, 0x080c, + 0x6152, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1107, 0x1158, 0x7834, + 0x9005, 0x1140, 0x7097, 0x0001, 0x080c, 0x60a8, 0x709b, 0x001a, + 0x0029, 0x0010, 0x7093, 0x0000, 0x00fe, 0x0005, 0x9085, 0x0001, + 0x080c, 0x617d, 0x709b, 0x001b, 0x080c, 0xa8ec, 0x080c, 0x6152, + 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, 0x5ee5, 0x60c3, + 0x0084, 0x080c, 0x6007, 0x0005, 0x0005, 0x0086, 0x0096, 0x2029, + 0x1848, 0x252c, 0x20a9, 0x0008, 0x2041, 0x1d0e, 0x20e9, 0x0001, + 0x28a0, 0x080c, 0x6152, 0x20e1, 0x0000, 0x2099, 0x026e, 0x4003, + 0x20a9, 0x0008, 0x2011, 0x0007, 0xd5d4, 0x0108, 0x9016, 0x2800, + 0x9200, 0x200c, 0x91a6, 0xffff, 0x1148, 0xd5d4, 0x0110, 0x8210, + 0x0008, 0x8211, 0x1f04, 0x5f17, 0x0804, 0x5f86, 0x82ff, 0x1160, + 0xd5d4, 0x0120, 0x91a6, 0x3fff, 0x0d90, 0x0020, 0x91a6, 0x3fff, + 0x0904, 0x5f86, 0x918d, 0xc000, 0x20a9, 0x0010, 0x2019, 0x0001, + 0xd5d4, 0x0110, 0x2019, 0x0010, 0x2120, 0xd5d4, 0x0110, 0x8423, + 0x0008, 0x8424, 0x1240, 0xd5d4, 0x0110, 0x8319, 0x0008, 0x8318, + 0x1f04, 0x5f3d, 0x04d8, 0x23a8, 0x2021, 0x0001, 0x8426, 0x8425, + 0x1f04, 0x5f4f, 0x2328, 0x8529, 0x92be, 0x0007, 0x0158, 0x0006, + 0x2039, 0x0007, 0x2200, 0x973a, 0x000e, 0x27a8, 0x95a8, 0x0010, + 0x1f04, 0x5f5e, 0x755e, 0x95c8, 0x3474, 0x292d, 0x95ac, 0x00ff, + 0x7582, 0x6532, 0x6536, 0x0016, 0x2508, 0x080c, 0x26ea, 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, 0x3474, 0x242d, 0x95ac, 0x00ff, 0x7582, 0x6532, + 0x6536, 0x0016, 0x2508, 0x080c, 0x26ea, 0x001e, 0x60e7, 0x0000, + 0x65ea, 0x7087, 0x0001, 0x9084, 0x0000, 0x0005, 0x00e6, 0x2071, + 0x1800, 0x708b, 0x0000, 0x00ee, 0x0005, 0x00e6, 0x00f6, 0x2079, + 0x0100, 0x2071, 0x0140, 0x080c, 0x6097, 0x080c, 0xa09b, 0x7004, + 0x9084, 0x4000, 0x0110, 0x080c, 0x2ab2, 0x0126, 0x2091, 0x8000, + 0x2071, 0x1826, 0x2073, 0x0000, 0x7840, 0x0026, 0x0016, 0x2009, + 0x00f7, 0x080c, 0x60f4, 0x001e, 0x9094, 0x0010, 0x9285, 0x0080, + 0x7842, 0x7a42, 0x002e, 0x012e, 0x00fe, 0x00ee, 0x0005, 0x0126, + 0x2091, 0x8000, 0x080c, 0x2a11, 0x0228, 0x2011, 0x0101, 0x2204, + 0xc0c5, 0x2012, 0x2011, 0x19f6, 0x2013, 0x0000, 0x7093, 0x0000, + 0x012e, 0x60a3, 0x0056, 0x60a7, 0x9575, 0x080c, 0xa08e, 0x6144, + 0xd184, 0x0120, 0x7198, 0x918d, 0x2000, 0x0018, 0x718c, 0x918d, + 0x1000, 0x2011, 0x199a, 0x2112, 0x2009, 0x07d0, 0x2011, 0x5fdd, + 0x080c, 0x88f6, 0x0005, 0x0016, 0x0026, 0x00c6, 0x0126, 0x2091, + 0x8000, 0x080c, 0xaaf7, 0x080c, 0xae87, 0x080c, 0xab13, 0x2009, + 0x00f7, 0x080c, 0x60f4, 0x2061, 0x1a05, 0x900e, 0x611a, 0x611e, + 0x617a, 0x617e, 0x2061, 0x1800, 0x6003, 0x0001, 0x2061, 0x0100, + 0x6043, 0x0090, 0x6043, 0x0010, 0x2009, 0x199a, 0x200b, 0x0000, + 0x2009, 0x002d, 0x2011, 0x6063, 0x080c, 0x8820, 0x012e, 0x00ce, + 0x002e, 0x001e, 0x0005, 0x00e6, 0x0006, 0x0126, 0x2091, 0x8000, + 0x0471, 0x2071, 0x0100, 0x080c, 0xa09b, 0x2071, 0x0140, 0x7004, + 0x9084, 0x4000, 0x0110, 0x080c, 0x2ab2, 0x080c, 0x76a5, 0x0188, + 0x080c, 0x76c0, 0x1170, 0x080c, 0x79a9, 0x0016, 0x080c, 0x27b9, + 0x2001, 0x196e, 0x2102, 0x001e, 0x080c, 0x79a4, 0x080c, 0x75cc, + 0x0050, 0x2009, 0x0001, 0x080c, 0x2a8e, 0x2001, 0x0001, 0x080c, + 0x2646, 0x080c, 0x6033, 0x012e, 0x000e, 0x00ee, 0x0005, 0x2001, + 0x180e, 0x2004, 0xd0bc, 0x0158, 0x0026, 0x0036, 0x2011, 0x8017, + 0x2001, 0x199a, 0x201c, 0x080c, 0x4c28, 0x003e, 0x002e, 0x0005, + 0x20a9, 0x0012, 0x20e9, 0x0001, 0x20a1, 0x1d80, 0x080c, 0x6152, + 0x20e9, 0x0000, 0x2099, 0x026e, 0x0099, 0x20a9, 0x0020, 0x080c, + 0x614c, 0x2099, 0x0260, 0x20a1, 0x1d92, 0x0051, 0x20a9, 0x000e, + 0x080c, 0x614f, 0x2099, 0x0260, 0x20a1, 0x1db2, 0x0009, 0x0005, + 0x0016, 0x0026, 0x3410, 0x3308, 0x2104, 0x8007, 0x2012, 0x8108, + 0x8210, 0x1f04, 0x60cc, 0x002e, 0x001e, 0x0005, 0x080c, 0xa8ec, + 0x20e1, 0x0001, 0x2099, 0x1d00, 0x20e9, 0x0000, 0x20a1, 0x0240, + 0x20a9, 0x000c, 0x4003, 0x0005, 0x080c, 0xa8ec, 0x080c, 0x6152, + 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, 0x6bc9, 0x0158, + 0x9006, 0x2020, 0x2009, 0x002a, 0x080c, 0xe795, 0x2001, 0x180c, + 0x200c, 0xc195, 0x2102, 0x2019, 0x002a, 0x900e, 0x080c, 0x32c0, + 0x080c, 0xd35d, 0x0140, 0x0036, 0x2019, 0xffff, 0x2021, 0x0007, + 0x080c, 0x4ddf, 0x003e, 0x004e, 0x001e, 0x0005, 0x080c, 0x6033, + 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, 0x19a8, 0x0118, + 0x2003, 0x0001, 0x0010, 0x2003, 0x0000, 0x0005, 0x0156, 0x20a9, + 0x0800, 0x2009, 0x1000, 0x9006, 0x200a, 0x8108, 0x1f04, 0x618c, + 0x015e, 0x0005, 0x00d6, 0x0036, 0x0156, 0x0136, 0x0146, 0x2069, + 0x1847, 0x9006, 0xb802, 0xb8d6, 0xb807, 0x0707, 0xb80a, 0xb80e, + 0xb812, 0x9198, 0x3474, 0x231d, 0x939c, 0x00ff, 0xbb16, 0x0016, + 0x0026, 0xb886, 0x080c, 0xae80, 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, 0x107f, 0xb8a7, + 0x0000, 0x009e, 0x9006, 0xb84a, 0x6810, 0xb83a, 0x680c, 0xb846, + 0xb8bb, 0x0520, 0xb8ac, 0x9005, 0x0198, 0x00c6, 0x2060, 0x9c82, + 0x1ddc, 0x0a0c, 0x0d79, 0x2001, 0x181a, 0x2004, 0x9c02, 0x1a0c, + 0x0d79, 0x080c, 0x8d87, 0x00ce, 0x090c, 0x9128, 0xb8af, 0x0000, + 0x6814, 0x9084, 0x00ff, 0xb842, 0x014e, 0x013e, 0x015e, 0x003e, + 0x00de, 0x0005, 0x0126, 0x2091, 0x8000, 0xa974, 0xae78, 0x9684, + 0x3fff, 0x9082, 0x4000, 0x1a04, 0x6268, 0x9182, 0x0800, 0x1a04, + 0x626c, 0x2001, 0x180c, 0x2004, 0x9084, 0x0003, 0x1904, 0x6272, + 0x9188, 0x1000, 0x2104, 0x905d, 0x0198, 0xb804, 0x9084, 0x00ff, + 0x908e, 0x0006, 0x1188, 0xb8a4, 0x900d, 0x1904, 0x6284, 0x080c, + 0x6644, 0x9006, 0x012e, 0x0005, 0x2001, 0x0005, 0x900e, 0x04b8, + 0x2001, 0x0028, 0x900e, 0x0498, 0x9082, 0x0006, 0x1290, 0x080c, + 0xae80, 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, 0x6bcd, 0x1990, 0xb800, + 0xd0bc, 0x0978, 0x0804, 0x622b, 0x080c, 0x69f0, 0x0904, 0x6234, + 0x0804, 0x622f, 0x00e6, 0x2071, 0x19e9, 0x7004, 0x9086, 0x0002, + 0x1128, 0x7030, 0x9080, 0x0004, 0x2004, 0x9b06, 0x00ee, 0x0005, + 0x00b6, 0x00e6, 0x0126, 0x2091, 0x8000, 0xa874, 0x908e, 0x00ff, + 0x1120, 0x2001, 0x196c, 0x205c, 0x0060, 0xa974, 0x9182, 0x0800, + 0x1690, 0x9188, 0x1000, 0x2104, 0x905d, 0x01d0, 0x080c, 0x6b6d, + 0x11d0, 0x080c, 0xaef8, 0x0570, 0x2b00, 0x6012, 0x2900, 0x6016, + 0x6023, 0x0009, 0x602b, 0x0000, 0xa874, 0x908e, 0x00ff, 0x1110, + 0x602b, 0x8000, 0x2009, 0x0043, 0x080c, 0xafec, 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, 0x6363, 0x9188, + 0x1000, 0x2104, 0x905d, 0x0904, 0x633b, 0xb8a0, 0x9086, 0x007f, + 0x0190, 0xa87c, 0xd0fc, 0x1178, 0x080c, 0x6bd5, 0x0160, 0xa994, + 0x81ff, 0x0130, 0x908e, 0x0004, 0x0130, 0x908e, 0x0005, 0x0118, + 0x080c, 0x6bcd, 0x1598, 0xa87c, 0xd0fc, 0x01e0, 0xa894, 0x9005, + 0x01c8, 0x2060, 0x0026, 0x2010, 0x080c, 0xcc21, 0x002e, 0x1120, + 0x2001, 0x0008, 0x0804, 0x6365, 0x6020, 0x9086, 0x000a, 0x0120, + 0x2001, 0x0008, 0x0804, 0x6365, 0x601a, 0x6003, 0x0008, 0x2900, + 0x6016, 0x0058, 0x080c, 0xaef8, 0x05e8, 0x2b00, 0x6012, 0x2900, + 0x6016, 0x600b, 0xffff, 0x6023, 0x000a, 0x2009, 0x0003, 0x080c, + 0xafec, 0x9006, 0x0458, 0x2001, 0x0028, 0x0438, 0x9082, 0x0006, + 0x1290, 0x080c, 0xae80, 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, 0x63fa, 0x63b5, 0x63cc, + 0x63fa, 0x63fa, 0x63fa, 0x63fa, 0x63fa, 0x2100, 0x9082, 0x007e, + 0x1278, 0x080c, 0x6718, 0x0148, 0x9046, 0xb810, 0x9306, 0x1904, + 0x6402, 0xb814, 0x9206, 0x15f0, 0x0028, 0xbb12, 0xba16, 0x0010, + 0x080c, 0x4adb, 0x0150, 0x04b0, 0x080c, 0x6783, 0x1598, 0xb810, + 0x9306, 0x1580, 0xb814, 0x9206, 0x1568, 0x080c, 0xaef8, 0x0530, + 0x2b00, 0x6012, 0x080c, 0xd0ce, 0x2900, 0x6016, 0x600b, 0xffff, + 0x6023, 0x000a, 0xa878, 0x9086, 0x0001, 0x1170, 0x080c, 0x32fb, + 0x9006, 0x080c, 0x66b5, 0x2001, 0x0002, 0x080c, 0x66c9, 0x2001, + 0x0200, 0xb86e, 0xb893, 0x0002, 0x2009, 0x0003, 0x080c, 0xafec, + 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, 0x65ed, 0x90c6, 0x0056, + 0x0904, 0x65f1, 0x90c6, 0x0066, 0x0904, 0x65f5, 0x90c6, 0x0067, + 0x0904, 0x65f9, 0x90c6, 0x0068, 0x0904, 0x65fd, 0x90c6, 0x0071, + 0x0904, 0x6601, 0x90c6, 0x0074, 0x0904, 0x6605, 0x90c6, 0x007c, + 0x0904, 0x6609, 0x90c6, 0x007e, 0x0904, 0x660d, 0x90c6, 0x0037, + 0x0904, 0x6611, 0x9016, 0x2079, 0x1800, 0xa974, 0x9186, 0x00ff, + 0x0904, 0x65e8, 0x9182, 0x0800, 0x1a04, 0x65e8, 0x080c, 0x6783, + 0x1198, 0xb804, 0x9084, 0x00ff, 0x9082, 0x0006, 0x1268, 0xa894, + 0x90c6, 0x006f, 0x0148, 0x080c, 0xae80, 0x1904, 0x65d1, 0xb8a0, + 0x9084, 0xff80, 0x1904, 0x65d1, 0xa894, 0x90c6, 0x006f, 0x0158, + 0x90c6, 0x005e, 0x0904, 0x6531, 0x90c6, 0x0064, 0x0904, 0x655a, + 0x2008, 0x0804, 0x64f3, 0xa998, 0xa8b0, 0x2040, 0x080c, 0xae80, + 0x1120, 0x9182, 0x007f, 0x0a04, 0x64f3, 0x9186, 0x00ff, 0x0904, + 0x64f3, 0x9182, 0x0800, 0x1a04, 0x64f3, 0xaaa0, 0xab9c, 0x787c, + 0x9306, 0x11a8, 0x7880, 0x0096, 0x924e, 0x1128, 0x2208, 0x2310, + 0x009e, 0x0804, 0x64f3, 0x080c, 0xae80, 0x1140, 0x99cc, 0xff00, + 0x009e, 0x1128, 0x2208, 0x2310, 0x0804, 0x64f3, 0x009e, 0x080c, + 0x4adb, 0x0904, 0x64fd, 0x900e, 0x9016, 0x90c6, 0x4000, 0x15e0, + 0x0006, 0x080c, 0x6a74, 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, + 0xc18d, 0x20a9, 0x0004, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0031, + 0x20a0, 0xb8c4, 0x20e0, 0xb8c8, 0x9080, 0x0006, 0x2098, 0x080c, + 0x0fca, 0x20a9, 0x0004, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0035, + 0x20a0, 0xb8c4, 0x20e0, 0xb8c8, 0x9080, 0x000a, 0x2098, 0x080c, + 0x0fca, 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, 0xaef8, 0x1130, + 0x2001, 0x4005, 0x2009, 0x0003, 0x9016, 0x0c78, 0x2b00, 0x6012, + 0x080c, 0xd0ce, 0x2900, 0x6016, 0x6023, 0x0001, 0xa868, 0xd88c, + 0x0108, 0xc0f5, 0xa86a, 0x0126, 0x2091, 0x8000, 0x080c, 0x32fb, + 0x012e, 0x9006, 0x080c, 0x66b5, 0x2001, 0x0002, 0x080c, 0x66c9, + 0x2009, 0x0002, 0x080c, 0xafec, 0xa8b0, 0xd094, 0x0118, 0xb8d4, + 0xc08d, 0xb8d6, 0x9006, 0x9005, 0x012e, 0x00ee, 0x00fe, 0x00be, + 0x0005, 0x080c, 0x5834, 0x0118, 0x2009, 0x0007, 0x00f8, 0xa998, + 0xaeb0, 0x080c, 0x6783, 0x1904, 0x64ee, 0x9186, 0x007f, 0x0130, + 0x080c, 0x6bcd, 0x0118, 0x2009, 0x0009, 0x0080, 0x0096, 0x080c, + 0x104d, 0x1120, 0x009e, 0x2009, 0x0002, 0x0040, 0x2900, 0x009e, + 0xa806, 0x080c, 0xce21, 0x19b0, 0x2009, 0x0003, 0x2001, 0x4005, + 0x0804, 0x64f5, 0xa998, 0xaeb0, 0x080c, 0x6783, 0x1904, 0x64ee, + 0x0096, 0x080c, 0x104d, 0x1128, 0x009e, 0x2009, 0x0002, 0x0804, + 0x65ae, 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, 0x0fca, 0x009e, 0xa87b, + 0x0000, 0xa883, 0x0000, 0xa897, 0x4000, 0xd684, 0x1168, 0x080c, + 0x5820, 0xd0b4, 0x1118, 0xa89b, 0x000b, 0x00e0, 0xb800, 0xd08c, + 0x0118, 0xa89b, 0x000c, 0x00b0, 0x080c, 0x6bcd, 0x0118, 0xa89b, + 0x0009, 0x0080, 0x080c, 0x5834, 0x0118, 0xa89b, 0x0007, 0x0050, + 0x080c, 0xce04, 0x1904, 0x652a, 0x2009, 0x0003, 0x2001, 0x4005, + 0x0804, 0x64f5, 0xa87b, 0x0030, 0xa897, 0x4005, 0xa804, 0x8006, + 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x0002, + 0x2009, 0x002b, 0xaaa0, 0xab9c, 0xaca8, 0xada4, 0x2031, 0x0000, + 0x2041, 0x129c, 0x080c, 0xb473, 0x1904, 0x652a, 0x2009, 0x0002, + 0x08e8, 0x2001, 0x0028, 0x900e, 0x0804, 0x652b, 0x2009, 0x180c, + 0x210c, 0xd18c, 0x0118, 0x2001, 0x0004, 0x0038, 0xd184, 0x0118, + 0x2001, 0x0004, 0x0010, 0x2001, 0x0029, 0x900e, 0x0804, 0x652b, + 0x2001, 0x0029, 0x900e, 0x0804, 0x652b, 0x080c, 0x38a4, 0x0804, + 0x652c, 0x080c, 0x553d, 0x0804, 0x652c, 0x080c, 0x468c, 0x0804, + 0x652c, 0x080c, 0x4705, 0x0804, 0x652c, 0x080c, 0x4761, 0x0804, + 0x652c, 0x080c, 0x4b9e, 0x0804, 0x652c, 0x080c, 0x4e52, 0x0804, + 0x652c, 0x080c, 0x51a4, 0x0804, 0x652c, 0x080c, 0x539d, 0x0804, + 0x652c, 0x080c, 0x3ac2, 0x0804, 0x652c, 0x00b6, 0xa974, 0xae78, + 0x9684, 0x3fff, 0x9082, 0x4000, 0x1608, 0x9182, 0x0800, 0x1258, + 0x9188, 0x1000, 0x2104, 0x905d, 0x0130, 0x080c, 0x6bcd, 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, 0x66a9, 0xb888, 0x9005, 0x1904, 0x66a9, 0xb838, 0xb93c, + 0x9102, 0x1a04, 0x66a9, 0x2b10, 0x080c, 0xaf25, 0x0904, 0x66a5, + 0x8108, 0xb93e, 0x6212, 0x2900, 0x6016, 0x6023, 0x0003, 0x600b, + 0xffff, 0x6007, 0x0040, 0xa878, 0x605e, 0xa880, 0x6066, 0xa883, + 0x0000, 0xa87c, 0xd0ac, 0x0588, 0xc0dd, 0xa87e, 0xa888, 0x8001, + 0x1530, 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, + 0x17a1, 0x601c, 0xc0bd, 0x601e, 0x0c38, 0xd0b4, 0x190c, 0x1cb9, + 0x2001, 0x8004, 0x6003, 0x0002, 0x0c18, 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, 0x6bc9, 0x0140, 0x9284, 0xff00, 0x8007, 0x9086, 0x0007, + 0x1110, 0x2011, 0x0600, 0x000e, 0x9294, 0xff00, 0x9215, 0xba06, + 0x0006, 0x9086, 0x0006, 0x1120, 0xba90, 0x82ff, 0x090c, 0x0d79, + 0x000e, 0x00ce, 0x012e, 0x00be, 0x0005, 0x00b6, 0x0126, 0x00c6, + 0x2091, 0x8000, 0x6210, 0x2258, 0xba04, 0x0006, 0x9086, 0x0006, + 0x1168, 0xb89c, 0xd0a4, 0x0150, 0x080c, 0x6bc5, 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, 0x104d, + 0x2958, 0x009e, 0x0168, 0x2b00, 0x2012, 0xb85c, 0xb8ca, 0xb860, + 0xb8c6, 0x9006, 0xb8a6, 0xb8ae, 0x080c, 0x6192, 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, 0x107f, 0x00d6, 0x00c6, + 0xb8bc, 0x2060, 0x8cff, 0x0168, 0x600c, 0x0006, 0x6014, 0x2048, + 0x080c, 0xcc33, 0x0110, 0x080c, 0x0fff, 0x080c, 0xaf4e, 0x00ce, + 0x0c88, 0x00ce, 0x00de, 0x00c6, 0xb8ac, 0x9065, 0x0128, 0x621c, + 0xd2c4, 0x0110, 0x080c, 0x9128, 0x00ce, 0x2b48, 0xb8c8, 0xb85e, + 0xb8c4, 0xb862, 0x080c, 0x108f, 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, 0x769d, 0x1510, 0xb8a0, + 0x9086, 0x007e, 0x0120, 0x080c, 0xae80, 0x11d8, 0x0078, 0x7040, + 0xd0e4, 0x01b8, 0x00c6, 0x2061, 0x1983, 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, 0x0d79, 0x3c00, 0x20e8, 0x3300, 0x8001, 0x20a0, + 0x4604, 0x8210, 0xaa06, 0x01de, 0x01ce, 0x014e, 0x013e, 0x0060, + 0x080c, 0x104d, 0x0170, 0x2900, 0xb8a6, 0xa803, 0x0000, 0x080c, + 0x6a10, 0xa807, 0x0001, 0xae12, 0x9085, 0x0001, 0x012e, 0x009e, + 0x0005, 0x9006, 0x0cd8, 0x0126, 0x2091, 0x8000, 0x0096, 0xb8a4, + 0x904d, 0x0188, 0xa800, 0x9005, 0x1150, 0x080c, 0x6a1f, 0x1158, + 0xa804, 0x908a, 0x0002, 0x0218, 0x8001, 0xa806, 0x0020, 0x080c, + 0x107f, 0xb8a7, 0x0000, 0x009e, 0x012e, 0x0005, 0x0096, 0x00c6, + 0xb888, 0x9005, 0x1904, 0x6905, 0xb8d0, 0x904d, 0x0904, 0x6905, + 0x080c, 0xaf25, 0x0904, 0x6903, 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, 0x1cb9, 0x2001, 0x8004, 0x6003, 0x0002, 0x6046, + 0x2001, 0x0010, 0x2c08, 0x080c, 0xaae8, 0xb838, 0xba3c, 0x9202, + 0x0a04, 0x68b4, 0x0010, 0xb88b, 0x0001, 0x00ce, 0x009e, 0x0005, + 0x080c, 0x17a1, 0x601c, 0xc0bd, 0x601e, 0x08f0, 0x00b6, 0x0096, + 0x0016, 0x20a9, 0x0800, 0x900e, 0x0016, 0x080c, 0x6783, 0x1158, + 0xb8d0, 0x904d, 0x0140, 0x3e00, 0x9086, 0x0002, 0x1118, 0xb800, + 0xd0bc, 0x1108, 0x0041, 0x001e, 0x8108, 0x1f04, 0x6914, 0x001e, + 0x00be, 0x009e, 0x0005, 0x0096, 0x0016, 0xb8d0, 0x904d, 0x0188, + 0xa800, 0xb8d2, 0x9005, 0x1108, 0xb8ce, 0x9006, 0xa802, 0xa867, + 0x0103, 0xab7a, 0xa877, 0x0000, 0x080c, 0xcf38, 0x080c, 0x6f11, + 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, 0x19e9, 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, 0xa21b, 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, 0x6a74, 0x0128, + 0x080c, 0xccf4, 0x0010, 0x9085, 0x0001, 0x0005, 0x080c, 0x6a74, + 0x0128, 0x080c, 0xcc95, 0x0010, 0x9085, 0x0001, 0x0005, 0x080c, + 0x6a74, 0x0128, 0x080c, 0xccf1, 0x0010, 0x9085, 0x0001, 0x0005, + 0x080c, 0x6a74, 0x0128, 0x080c, 0xccb4, 0x0010, 0x9085, 0x0001, + 0x0005, 0x080c, 0x6a74, 0x0128, 0x080c, 0xcd37, 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, 0x104d, 0x0168, 0x2900, 0xb8a6, 0x080c, + 0x6a10, 0xa803, 0x0001, 0xa807, 0x0000, 0x9085, 0x0001, 0x012e, + 0x009e, 0x0005, 0x9006, 0x0cd8, 0x0096, 0x0126, 0x2091, 0x8000, + 0xb8a4, 0x904d, 0x0130, 0xb8a7, 0x0000, 0x080c, 0x107f, 0x9085, + 0x0001, 0x012e, 0x009e, 0x0005, 0xb89c, 0xd0a4, 0x0005, 0x00b6, + 0x00f6, 0x080c, 0x769d, 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, 0x6783, 0x1168, 0xb804, + 0x9084, 0xff00, 0x8007, 0x9096, 0x0004, 0x0118, 0x9086, 0x0006, + 0x1118, 0xb800, 0xc0ed, 0xb802, 0x001e, 0x8108, 0x1f04, 0x6a9b, + 0x015e, 0x080c, 0x6b8b, 0x0120, 0x2001, 0x1986, 0x200c, 0x0038, + 0x2079, 0x1847, 0x7804, 0xd0a4, 0x0130, 0x2009, 0x07d0, 0x2011, + 0x6ac6, 0x080c, 0x88f6, 0x00fe, 0x00be, 0x0005, 0x00b6, 0x2011, + 0x6ac6, 0x080c, 0x882c, 0x080c, 0x6b8b, 0x01d8, 0x2001, 0x107e, + 0x2004, 0x2058, 0xb900, 0xc1ec, 0xb902, 0x080c, 0x6bc9, 0x0130, + 0x2009, 0x07d0, 0x2011, 0x6ac6, 0x080c, 0x88f6, 0x00e6, 0x2071, + 0x1800, 0x9006, 0x707e, 0x7060, 0x7082, 0x080c, 0x30c8, 0x00ee, + 0x04e0, 0x0156, 0x00c6, 0x20a9, 0x007f, 0x900e, 0x0016, 0x080c, + 0x6783, 0x1568, 0xb800, 0xd0ec, 0x0550, 0xd0bc, 0x1540, 0x0046, + 0xbaa0, 0x2220, 0x9006, 0x2009, 0x0029, 0x080c, 0xe795, 0xb800, + 0xc0e5, 0xc0ec, 0xb802, 0x080c, 0x6bc5, 0x2001, 0x0707, 0x1128, + 0xb804, 0x9084, 0x00ff, 0x9085, 0x0700, 0xb806, 0x080c, 0xaaf7, + 0x2019, 0x0029, 0x080c, 0x95b9, 0x0076, 0x903e, 0x080c, 0x9476, + 0x900e, 0x080c, 0xe465, 0x007e, 0x004e, 0x080c, 0xab13, 0x001e, + 0x8108, 0x1f04, 0x6aee, 0x00ce, 0x015e, 0x00be, 0x0005, 0x00b6, + 0x6010, 0x2058, 0xb800, 0xc0ec, 0xb802, 0x00be, 0x0005, 0x00b6, + 0x00c6, 0x0096, 0x080c, 0x1066, 0x090c, 0x0d79, 0x2958, 0x009e, + 0x2001, 0x196c, 0x2b02, 0x8b07, 0x8006, 0x8006, 0x908c, 0x003f, + 0xb9c6, 0x908c, 0xffc0, 0xb9ca, 0xb8af, 0x0000, 0x2009, 0x00ff, + 0x080c, 0x6192, 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, 0x0d79, 0x000e, 0xba00, 0x9005, 0x0110, 0xc2fd, + 0x0008, 0xc2fc, 0xba02, 0x002e, 0x012e, 0x0005, 0x2011, 0x1837, + 0x2204, 0xd0cc, 0x0138, 0x2001, 0x1984, 0x200c, 0x2011, 0x6bbb, + 0x080c, 0x88f6, 0x0005, 0x2011, 0x6bbb, 0x080c, 0x882c, 0x2011, + 0x1837, 0x2204, 0xc0cc, 0x2012, 0x0005, 0x080c, 0x5820, 0xd0ac, + 0x0005, 0x080c, 0x5820, 0xd0a4, 0x0005, 0x0016, 0xb904, 0x9184, + 0x00ff, 0x908e, 0x0006, 0x001e, 0x0005, 0x0016, 0xb904, 0x9184, + 0xff00, 0x8007, 0x908e, 0x0006, 0x001e, 0x0005, 0x00b6, 0x00f6, + 0x080c, 0xd35d, 0x0158, 0x70dc, 0x9084, 0x0028, 0x0138, 0x2001, + 0x107f, 0x2004, 0x905d, 0x0110, 0xb8d4, 0xd094, 0x00fe, 0x00be, + 0x0005, 0x2071, 0x1910, 0x7003, 0x0001, 0x7007, 0x0000, 0x9006, + 0x7012, 0x7016, 0x701a, 0x701e, 0x700a, 0x7046, 0x2001, 0x1922, + 0x2003, 0x0000, 0x0005, 0x0016, 0x00e6, 0x2071, 0x1949, 0x900e, + 0x710a, 0x080c, 0x5820, 0xd0fc, 0x1140, 0x080c, 0x5820, 0x900e, + 0xd09c, 0x0108, 0x8108, 0x7102, 0x0430, 0x2001, 0x1867, 0x200c, + 0x9184, 0x0007, 0x0002, 0x6c0d, 0x6c0d, 0x6c0d, 0x6c0d, 0x6c0d, + 0x6c23, 0x6c38, 0x6c46, 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, 0x7a11, 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, 0x1949, 0x7000, 0x9015, 0x0904, 0x6f16, + 0x9286, 0x0003, 0x0904, 0x6dab, 0x9286, 0x0005, 0x0904, 0x6dab, + 0x2071, 0x1877, 0xa87c, 0x9005, 0x0904, 0x6d06, 0x7140, 0xa868, + 0x9102, 0x0a04, 0x6f16, 0xa878, 0xd084, 0x15d8, 0xa853, 0x0019, + 0x2001, 0x8023, 0xa84e, 0x2071, 0x1910, 0x701c, 0x9005, 0x1904, + 0x70c5, 0x0e04, 0x7133, 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, 0x11f4, 0x0804, + 0x6d8e, 0xa853, 0x001b, 0x2001, 0x8027, 0x0820, 0x7004, 0xd08c, + 0x1904, 0x6f16, 0xa853, 0x001a, 0x2001, 0x8024, 0x0804, 0x6cca, + 0x00e6, 0x0026, 0x2071, 0x1949, 0x7000, 0x9015, 0x0904, 0x6f16, + 0x9286, 0x0003, 0x0904, 0x6dab, 0x9286, 0x0005, 0x0904, 0x6dab, + 0xa84f, 0x8022, 0xa853, 0x0018, 0x0804, 0x6d73, 0xa868, 0xd0fc, + 0x1508, 0x00e6, 0x0026, 0x2001, 0x1949, 0x2004, 0x9015, 0x0904, + 0x6f16, 0xa978, 0xa874, 0x9105, 0x1904, 0x6f16, 0x9286, 0x0003, + 0x0904, 0x6dab, 0x9286, 0x0005, 0x0904, 0x6dab, 0xa87c, 0xd0bc, + 0x1904, 0x6f16, 0x2200, 0x0002, 0x6f16, 0x6d6f, 0x6dab, 0x6dab, + 0x6f16, 0x6dab, 0x0005, 0xa868, 0xd0fc, 0x1500, 0x00e6, 0x0026, + 0x2009, 0x1949, 0x210c, 0x81ff, 0x0904, 0x6f16, 0xa880, 0x9084, + 0x00ff, 0x9086, 0x0001, 0x1904, 0x6f16, 0x9186, 0x0003, 0x0904, + 0x6dab, 0x9186, 0x0005, 0x0904, 0x6dab, 0xa87c, 0xd0cc, 0x0904, + 0x6f16, 0xa84f, 0x8021, 0xa853, 0x0017, 0x0028, 0x0005, 0xa84f, + 0x8020, 0xa853, 0x0016, 0x2071, 0x1910, 0x701c, 0x9005, 0x1904, + 0x70c5, 0x0e04, 0x7133, 0x2071, 0x0000, 0xa84c, 0x7082, 0xa850, + 0x7032, 0xa86c, 0x7086, 0x7036, 0xa870, 0x708a, 0x2091, 0x4080, + 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x11f4, 0x2071, 0x1800, + 0x2011, 0x0001, 0xa804, 0x900d, 0x702c, 0x1158, 0xa802, 0x2900, + 0x702e, 0x70c0, 0x9200, 0x70c2, 0x080c, 0x8732, 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, 0x6e9c, + 0x782c, 0x908c, 0x0780, 0x190c, 0x7281, 0x8004, 0x8004, 0x8004, + 0x9084, 0x0003, 0x0002, 0x6dc9, 0x6e9c, 0x6ded, 0x6e39, 0x080c, + 0x0d79, 0x2071, 0x1800, 0x2900, 0x7822, 0xa804, 0x900d, 0x1168, + 0x2071, 0x1a05, 0x7044, 0x9005, 0x1320, 0x2001, 0x194a, 0x2004, + 0x7046, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x9016, 0x702c, 0x2148, + 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70c0, + 0x9200, 0x70c2, 0x080c, 0x8732, 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, 0x8732, 0x782c, 0x9094, 0x0780, 0x190c, + 0x7281, 0xd0a4, 0x19c8, 0x2071, 0x1a05, 0x7044, 0x9005, 0x1320, + 0x2001, 0x194a, 0x2004, 0x7046, 0x00fe, 0x002e, 0x00ee, 0x0005, + 0x9016, 0x702c, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, + 0x1dc8, 0x702e, 0x70c0, 0x9200, 0x70c2, 0x080c, 0x8732, 0x0804, + 0x6df4, 0x0096, 0x00e6, 0x7824, 0x2048, 0x2071, 0x1800, 0x702c, + 0xa802, 0x2900, 0x702e, 0x70c0, 0x8000, 0x70c2, 0x080c, 0x8732, + 0x782c, 0x9094, 0x0780, 0x190c, 0x7281, 0xd0a4, 0x1d60, 0x00ee, + 0x782c, 0x9094, 0x0780, 0x190c, 0x7281, 0xd09c, 0x1198, 0x009e, + 0x2900, 0x7822, 0xa804, 0x900d, 0x1550, 0x2071, 0x1a05, 0x7044, + 0x9005, 0x1320, 0x2001, 0x194a, 0x2004, 0x7046, 0x00fe, 0x002e, + 0x00ee, 0x0005, 0x009e, 0x2908, 0x7010, 0x8000, 0x7012, 0x7018, + 0x904d, 0x711a, 0x0110, 0xa902, 0x0008, 0x711e, 0x2148, 0xa804, + 0x900d, 0x1168, 0x2071, 0x1a05, 0x7044, 0x9005, 0x1320, 0x2001, + 0x194a, 0x2004, 0x7046, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x2071, + 0x1800, 0x9016, 0x702c, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, + 0x81ff, 0x1dc8, 0x702e, 0x70c0, 0x9200, 0x70c2, 0x080c, 0x8732, + 0x00fe, 0x002e, 0x00ee, 0x0005, 0x2908, 0x7010, 0x8000, 0x7012, + 0x7018, 0x904d, 0x711a, 0x0110, 0xa902, 0x0008, 0x711e, 0x2148, + 0xa804, 0x900d, 0x1904, 0x6ef0, 0x782c, 0x9094, 0x0780, 0x190c, + 0x7281, 0xd09c, 0x1198, 0x701c, 0x904d, 0x0180, 0x7010, 0x8001, + 0x7012, 0x1108, 0x701a, 0xa800, 0x701e, 0x2900, 0x7822, 0x782c, + 0x9094, 0x0780, 0x190c, 0x7281, 0xd09c, 0x0d68, 0x782c, 0x9094, + 0x0780, 0x190c, 0x7281, 0xd0a4, 0x01b0, 0x00e6, 0x7824, 0x2048, + 0x2071, 0x1800, 0x702c, 0xa802, 0x2900, 0x702e, 0x70c0, 0x8000, + 0x70c2, 0x080c, 0x8732, 0x782c, 0x9094, 0x0780, 0x190c, 0x7281, + 0xd0a4, 0x1d60, 0x00ee, 0x2071, 0x1a05, 0x7044, 0x9005, 0x1320, + 0x2001, 0x194a, 0x2004, 0x7046, 0x00fe, 0x002e, 0x00ee, 0x0005, + 0x00e6, 0x2071, 0x1800, 0x9016, 0x702c, 0x2148, 0xa904, 0xa802, + 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70c0, 0x9200, 0x70c2, + 0x080c, 0x8732, 0x00ee, 0x0804, 0x6eac, 0xa868, 0xd0fc, 0x15e0, + 0x0096, 0xa804, 0xa807, 0x0000, 0x904d, 0x190c, 0x0fff, 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, + 0x7041, 0x782c, 0x908c, 0x0780, 0x190c, 0x7281, 0x8004, 0x8004, + 0x8004, 0x9084, 0x0003, 0x0002, 0x6f45, 0x7041, 0x6f60, 0x6fd2, + 0x080c, 0x0d79, 0x2009, 0x1949, 0x2104, 0x0002, 0x6f25, 0x6f25, + 0x6f25, 0x6db4, 0x6f25, 0x6db4, 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, 0x8732, 0x0c60, + 0x2071, 0x1800, 0x2900, 0x7822, 0xa804, 0x900d, 0x1904, 0x6fc1, + 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, 0x8732, 0x782c, + 0x9094, 0x0780, 0x190c, 0x7281, 0xd0a4, 0x19c8, 0x0e04, 0x6fb8, + 0x7838, 0x7938, 0x910e, 0x1de0, 0x00d6, 0x2069, 0x0000, 0x6836, + 0x6833, 0x0013, 0x00de, 0x2001, 0x1921, 0x200c, 0xc184, 0x2102, + 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x11f4, + 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, 0x8732, + 0x0804, 0x6f6f, 0x0096, 0x00e6, 0x7824, 0x2048, 0x2071, 0x1800, + 0x702c, 0xa802, 0x2900, 0x702e, 0x70c0, 0x8000, 0x70c2, 0x080c, + 0x8732, 0x782c, 0x9094, 0x0780, 0x190c, 0x7281, 0xd0a4, 0x1d60, + 0x00ee, 0x0e04, 0x7014, 0x7838, 0x7938, 0x910e, 0x1de0, 0x00d6, + 0x2069, 0x0000, 0x6836, 0x6833, 0x0013, 0x00de, 0x7044, 0xc084, + 0x7046, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, + 0x11f4, 0x704b, 0x0000, 0x782c, 0x9094, 0x0780, 0x190c, 0x7281, + 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, 0x8732, 0x00fe, 0x002e, 0x00ee, + 0x0005, 0x2908, 0x7010, 0x8000, 0x7012, 0x7018, 0x904d, 0x711a, + 0x0110, 0xa902, 0x0008, 0x711e, 0x2148, 0xa804, 0x900d, 0x1904, + 0x70b0, 0x782c, 0x9094, 0x0780, 0x190c, 0x7281, 0xd09c, 0x11b0, + 0x701c, 0x904d, 0x0198, 0xa84c, 0x9005, 0x1180, 0x7010, 0x8001, + 0x7012, 0x1108, 0x701a, 0xa800, 0x701e, 0x2900, 0x7822, 0x782c, + 0x9094, 0x0780, 0x190c, 0x7281, 0xd09c, 0x0d50, 0x782c, 0x9094, + 0x0780, 0x190c, 0x7281, 0xd0a4, 0x05b8, 0x00e6, 0x7824, 0x2048, + 0x2071, 0x1800, 0x702c, 0xa802, 0x2900, 0x702e, 0x70c0, 0x8000, + 0x70c2, 0x080c, 0x8732, 0x782c, 0x9094, 0x0780, 0x190c, 0x7281, + 0xd0a4, 0x1d60, 0x00ee, 0x0e04, 0x70a9, 0x7838, 0x7938, 0x910e, + 0x1de0, 0x00d6, 0x2069, 0x0000, 0x6836, 0x6833, 0x0013, 0x00de, + 0x7044, 0xc084, 0x7046, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, + 0xd084, 0x190c, 0x11f4, 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, 0x8732, 0x00ee, 0x0804, 0x7051, 0x2071, 0x1910, 0xa803, + 0x0000, 0x2908, 0x7010, 0x8000, 0x7012, 0x7018, 0x904d, 0x711a, + 0x0110, 0xa902, 0x0008, 0x711e, 0x2148, 0xa804, 0x900d, 0x1128, + 0x1e04, 0x70f0, 0x002e, 0x00ee, 0x0005, 0x2071, 0x1800, 0x9016, + 0x702c, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, + 0x702e, 0x70c0, 0x9200, 0x70c2, 0x080c, 0x8732, 0x0e04, 0x70da, + 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, 0x11f4, 0x2071, 0x1910, 0x080c, + 0x726d, 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, 0x8732, 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, + 0x7180, 0x7181, 0x726c, 0x7181, 0x717e, 0x726c, 0x080c, 0x0d79, + 0x0005, 0x2001, 0x1949, 0x2004, 0x0002, 0x718b, 0x718b, 0x7205, + 0x7206, 0x718b, 0x7206, 0x0126, 0x2091, 0x8000, 0x1e0c, 0x728c, + 0x701c, 0x904d, 0x0508, 0xa84c, 0x9005, 0x0904, 0x71d6, 0x0e04, + 0x71b4, 0xa94c, 0x2071, 0x0000, 0x7182, 0xa850, 0x7032, 0xa86c, + 0x7086, 0x7036, 0xa870, 0x708a, 0xa850, 0x9082, 0x0019, 0x1278, + 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x11f4, + 0x2071, 0x1910, 0x080c, 0x726d, 0x012e, 0x0804, 0x7204, 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, 0x7281, 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, 0x1a05, 0x6844, 0x9005, 0x0760, 0x0158, 0x9186, 0x0003, + 0x0540, 0x2001, 0x1815, 0x2004, 0x2009, 0x1b74, 0x210c, 0x9102, + 0x1500, 0x0126, 0x2091, 0x8000, 0x2069, 0x0050, 0x693c, 0x6838, + 0x9106, 0x0190, 0x0e04, 0x7238, 0x2069, 0x0000, 0x6837, 0x8040, + 0x6833, 0x0012, 0x6883, 0x8040, 0x2091, 0x4080, 0x2001, 0x0089, + 0x2004, 0xd084, 0x190c, 0x11f4, 0x2069, 0x1a05, 0x6847, 0xffff, + 0x012e, 0x00de, 0x0126, 0x2091, 0x8000, 0x1e0c, 0x72fc, 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, 0x107f, 0x0005, 0x012e, + 0x0005, 0x2091, 0x8000, 0x0e04, 0x7283, 0x0006, 0x0016, 0x2001, + 0x8004, 0x0006, 0x0804, 0x0d82, 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, 0x11f4, + 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, 0x8732, 0x782c, 0x9094, 0x0780, 0x190c, + 0x7281, 0xd0a4, 0x19c8, 0x7838, 0x7938, 0x910e, 0x1de0, 0x00d6, + 0x2069, 0x0000, 0x6836, 0x6833, 0x0013, 0x00de, 0x2091, 0x4080, + 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x11f4, 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, 0x11f4, 0x00fe, + 0x0005, 0x782c, 0x9094, 0x0780, 0x190c, 0x7281, 0xd0a4, 0x0db8, + 0x00e6, 0x2071, 0x1800, 0x7824, 0x2048, 0x702c, 0xa802, 0x2900, + 0x702e, 0x70c0, 0x8000, 0x70c2, 0x080c, 0x8732, 0x782c, 0x9094, + 0x0780, 0x190c, 0x7281, 0xd0a4, 0x1d70, 0x00d6, 0x2069, 0x0050, + 0x693c, 0x2069, 0x1949, 0x6808, 0x690a, 0x2069, 0x1a05, 0x9102, + 0x1118, 0x6844, 0x9005, 0x1320, 0x2001, 0x194a, 0x200c, 0x6946, + 0x00de, 0x00ee, 0x00fe, 0x0005, 0x7098, 0x908a, 0x002a, 0x1a0c, + 0x0d79, 0x9082, 0x001d, 0x003b, 0x0026, 0x2011, 0x1e00, 0x080c, + 0x2adc, 0x002e, 0x0005, 0x7441, 0x73ae, 0x73ca, 0x73f4, 0x7430, + 0x7470, 0x7482, 0x73ca, 0x7458, 0x7369, 0x7397, 0x741a, 0x7368, + 0x0005, 0x00d6, 0x2069, 0x0200, 0x6804, 0x9005, 0x1180, 0x6808, + 0x9005, 0x1518, 0x709b, 0x0029, 0x2069, 0x1990, 0x2d04, 0x7002, + 0x080c, 0x77db, 0x6028, 0x9085, 0x0600, 0x602a, 0x00b0, 0x709b, + 0x0029, 0x2069, 0x1990, 0x2d04, 0x7002, 0x6028, 0x9085, 0x0600, + 0x602a, 0x00e6, 0x0036, 0x0046, 0x0056, 0x2071, 0x1a6f, 0x080c, + 0x1b3b, 0x005e, 0x004e, 0x003e, 0x00ee, 0x00de, 0x0005, 0x00d6, + 0x2069, 0x0200, 0x6804, 0x9005, 0x1178, 0x6808, 0x9005, 0x1160, + 0x709b, 0x0029, 0x2069, 0x1990, 0x2d04, 0x7002, 0x080c, 0x7880, + 0x6028, 0x9085, 0x0600, 0x602a, 0x00de, 0x0005, 0x0006, 0x2001, + 0x0090, 0x080c, 0x2aa2, 0x000e, 0x6124, 0xd1e4, 0x1190, 0x080c, + 0x74f3, 0xd1d4, 0x1160, 0xd1dc, 0x1138, 0xd1cc, 0x0150, 0x709b, + 0x0020, 0x080c, 0x74f3, 0x0028, 0x709b, 0x001d, 0x0010, 0x709b, + 0x001f, 0x0005, 0x2001, 0x0088, 0x080c, 0x2aa2, 0x6124, 0xd1cc, + 0x11e8, 0xd1dc, 0x11c0, 0xd1e4, 0x1198, 0x9184, 0x1e00, 0x11d8, + 0x080c, 0x1b68, 0x60e3, 0x0001, 0x600c, 0xc0b4, 0x600e, 0x080c, + 0x76c9, 0x2001, 0x0080, 0x080c, 0x2aa2, 0x709b, 0x0029, 0x0058, + 0x709b, 0x001e, 0x0040, 0x709b, 0x001d, 0x0028, 0x709b, 0x0020, + 0x0010, 0x709b, 0x001f, 0x0005, 0x080c, 0x1b68, 0x60e3, 0x0001, + 0x600c, 0xc0b4, 0x600e, 0x080c, 0x76c9, 0x2001, 0x0080, 0x080c, + 0x2aa2, 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, 0x2aa2, 0x6124, 0xd1dc, 0x1138, 0xd1e4, + 0x0138, 0x080c, 0x1b68, 0x709b, 0x001e, 0x0010, 0x709b, 0x001d, + 0x0005, 0x080c, 0x757c, 0x6124, 0xd1dc, 0x1188, 0x080c, 0x74f3, + 0x0016, 0x080c, 0x1b68, 0x001e, 0xd1d4, 0x1128, 0xd1e4, 0x0138, + 0x709b, 0x001e, 0x0020, 0x709b, 0x001f, 0x080c, 0x74f3, 0x0005, + 0x0006, 0x2001, 0x00a0, 0x080c, 0x2aa2, 0x000e, 0x6124, 0xd1d4, + 0x1160, 0xd1cc, 0x1150, 0xd1dc, 0x1128, 0xd1e4, 0x0140, 0x709b, + 0x001e, 0x0028, 0x709b, 0x001d, 0x0010, 0x709b, 0x0021, 0x0005, + 0x080c, 0x757c, 0x6124, 0xd1d4, 0x1150, 0xd1dc, 0x1128, 0xd1e4, + 0x0140, 0x709b, 0x001e, 0x0028, 0x709b, 0x001d, 0x0010, 0x709b, + 0x001f, 0x0005, 0x0006, 0x2001, 0x0090, 0x080c, 0x2aa2, 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, 0x769d, 0x11f8, 0x2001, 0x180c, 0x200c, + 0xd1b4, 0x01d0, 0xc1b4, 0x2102, 0x0026, 0x2011, 0x0200, 0x080c, + 0x2adc, 0x002e, 0x080c, 0x2a88, 0x6024, 0xd0cc, 0x0148, 0x2001, + 0x00a0, 0x080c, 0x2aa2, 0x080c, 0x799f, 0x080c, 0x6178, 0x0428, + 0x6028, 0xc0cd, 0x602a, 0x0408, 0x080c, 0x76b7, 0x0150, 0x080c, + 0x76ae, 0x1138, 0x2001, 0x0001, 0x080c, 0x2646, 0x080c, 0x7671, + 0x00a0, 0x080c, 0x7579, 0x0178, 0x2001, 0x0001, 0x080c, 0x2646, + 0x7098, 0x9086, 0x001e, 0x0120, 0x7098, 0x9086, 0x0022, 0x1118, + 0x709b, 0x0025, 0x0010, 0x709b, 0x0021, 0x012e, 0x00ee, 0x00de, + 0x00ce, 0x001e, 0x0005, 0x0026, 0x2011, 0x7504, 0x080c, 0x8938, + 0x002e, 0x0016, 0x0026, 0x2009, 0x0064, 0x2011, 0x7504, 0x080c, + 0x892f, 0x002e, 0x001e, 0x0005, 0x00e6, 0x00f6, 0x0016, 0x080c, + 0xa09b, 0x2071, 0x1800, 0x080c, 0x749d, 0x001e, 0x00fe, 0x00ee, + 0x0005, 0x0016, 0x0026, 0x0036, 0x00c6, 0x00d6, 0x00e6, 0x00f6, + 0x0126, 0x2071, 0x1800, 0x080c, 0xa09b, 0x2061, 0x0100, 0x2069, + 0x0140, 0x2091, 0x8000, 0x6028, 0xc09c, 0x602a, 0x080c, 0xaaf7, + 0x2011, 0x0003, 0x080c, 0xa426, 0x2011, 0x0002, 0x080c, 0xa430, + 0x080c, 0xa311, 0x080c, 0x88e4, 0x0036, 0x901e, 0x080c, 0xa391, + 0x003e, 0x080c, 0xab13, 0x60e3, 0x0000, 0x080c, 0xebe8, 0x080c, + 0xec03, 0x2009, 0x0004, 0x080c, 0x2a8e, 0x080c, 0x29a8, 0x2001, + 0x1800, 0x2003, 0x0004, 0x2011, 0x0008, 0x080c, 0x2adc, 0x2011, + 0x7504, 0x080c, 0x8938, 0x080c, 0x76b7, 0x0118, 0x9006, 0x080c, + 0x2aa2, 0x080c, 0x0bc3, 0x2001, 0x0001, 0x080c, 0x2646, 0x012e, + 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x003e, 0x002e, 0x001e, 0x0005, + 0x0026, 0x00e6, 0x2011, 0x7511, 0x2071, 0x1a05, 0x701c, 0x9206, + 0x1118, 0x7018, 0x9005, 0x0110, 0x9085, 0x0001, 0x00ee, 0x002e, + 0x0005, 0x6020, 0xd09c, 0x0005, 0x6800, 0x9084, 0xfffe, 0x9086, + 0x00c0, 0x01b8, 0x2001, 0x00c0, 0x080c, 0x2aa2, 0x0156, 0x20a9, + 0x002d, 0x1d04, 0x7589, 0x2091, 0x6000, 0x1f04, 0x7589, 0x015e, + 0x00d6, 0x2069, 0x1800, 0x689c, 0x8001, 0x0220, 0x0118, 0x689e, + 0x00de, 0x0005, 0x689f, 0x0014, 0x68ec, 0xd0dc, 0x0dc8, 0x6800, + 0x9086, 0x0001, 0x1da8, 0x080c, 0x8944, 0x0c90, 0x00c6, 0x00d6, + 0x00e6, 0x2061, 0x0100, 0x2069, 0x0140, 0x2071, 0x1800, 0x080c, + 0x79ae, 0x2001, 0x196e, 0x2003, 0x0000, 0x9006, 0x709a, 0x60e2, + 0x6886, 0x080c, 0x2715, 0x9006, 0x080c, 0x2aa2, 0x080c, 0x6033, + 0x0026, 0x2011, 0xffff, 0x080c, 0x2adc, 0x002e, 0x602b, 0x182c, + 0x00ee, 0x00de, 0x00ce, 0x0005, 0x00c6, 0x00d6, 0x00e6, 0x2061, + 0x0100, 0x2069, 0x0140, 0x2071, 0x1800, 0x2001, 0x197e, 0x200c, + 0x9186, 0x0000, 0x0158, 0x9186, 0x0001, 0x0158, 0x9186, 0x0002, + 0x0158, 0x9186, 0x0003, 0x0158, 0x0804, 0x7661, 0x709b, 0x0022, + 0x0040, 0x709b, 0x0021, 0x0028, 0x709b, 0x0023, 0x0010, 0x709b, + 0x0024, 0x60e3, 0x0000, 0x6887, 0x0001, 0x2001, 0x0001, 0x080c, + 0x2715, 0x080c, 0xaaf7, 0x0026, 0x080c, 0xadbe, 0x080c, 0xae87, + 0x002e, 0x080c, 0xab13, 0x7000, 0x908e, 0x0004, 0x0118, 0x602b, + 0x0028, 0x0010, 0x602b, 0x0020, 0x0156, 0x0126, 0x2091, 0x8000, + 0x20a9, 0x0005, 0x6024, 0xd0ac, 0x0150, 0x012e, 0x015e, 0x080c, + 0xd35d, 0x0118, 0x9006, 0x080c, 0x2acc, 0x0804, 0x766d, 0x6800, + 0x9084, 0x00a1, 0xc0bd, 0x6802, 0x080c, 0x2a88, 0x6904, 0xd1d4, + 0x1140, 0x2001, 0x0100, 0x080c, 0x2aa2, 0x1f04, 0x7612, 0x080c, + 0x76f1, 0x012e, 0x015e, 0x080c, 0x76ae, 0x0170, 0x6044, 0x9005, + 0x0130, 0x080c, 0x76f1, 0x9006, 0x8001, 0x1df0, 0x0028, 0x6804, + 0xd0d4, 0x1110, 0x080c, 0x76f1, 0x080c, 0xd35d, 0x0118, 0x9006, + 0x080c, 0x2acc, 0x0016, 0x0026, 0x7000, 0x908e, 0x0004, 0x0130, + 0x2009, 0x00c8, 0x2011, 0x7511, 0x080c, 0x88f6, 0x002e, 0x001e, + 0x080c, 0x8729, 0x7034, 0xc085, 0x7036, 0x2001, 0x197e, 0x2003, + 0x0004, 0x080c, 0x734c, 0x080c, 0x76ae, 0x0138, 0x6804, 0xd0d4, + 0x1120, 0xd0dc, 0x1100, 0x080c, 0x79a4, 0x00ee, 0x00de, 0x00ce, + 0x0005, 0x00c6, 0x00d6, 0x00e6, 0x2061, 0x0100, 0x2069, 0x0140, + 0x2071, 0x1800, 0x080c, 0x8740, 0x080c, 0x8732, 0x080c, 0x79ae, + 0x2001, 0x196e, 0x2003, 0x0000, 0x9006, 0x709a, 0x60e2, 0x6886, + 0x080c, 0x2715, 0x9006, 0x080c, 0x2aa2, 0x6043, 0x0090, 0x6043, + 0x0010, 0x0026, 0x2011, 0xffff, 0x080c, 0x2adc, 0x002e, 0x602b, + 0x182c, 0x00ee, 0x00de, 0x00ce, 0x0005, 0x0006, 0x2001, 0x197d, + 0x2004, 0x9086, 0xaaaa, 0x000e, 0x0005, 0x0006, 0x080c, 0x5824, + 0x9084, 0x0030, 0x9086, 0x0000, 0x000e, 0x0005, 0x0006, 0x080c, + 0x5824, 0x9084, 0x0030, 0x9086, 0x0030, 0x000e, 0x0005, 0x0006, + 0x080c, 0x5824, 0x9084, 0x0030, 0x9086, 0x0010, 0x000e, 0x0005, + 0x0006, 0x080c, 0x5824, 0x9084, 0x0030, 0x9086, 0x0020, 0x000e, + 0x0005, 0x0036, 0x0016, 0x2001, 0x180c, 0x2004, 0x908c, 0x0013, + 0x0168, 0x0020, 0x080c, 0x2735, 0x900e, 0x0010, 0x2009, 0x0002, + 0x2019, 0x0028, 0x080c, 0x32c0, 0x9006, 0x0019, 0x001e, 0x003e, + 0x0005, 0x00e6, 0x2071, 0x180c, 0x2e04, 0x0130, 0x080c, 0xd356, + 0x1128, 0x9085, 0x0010, 0x0010, 0x9084, 0xffef, 0x2072, 0x00ee, + 0x0005, 0x6050, 0x0006, 0x60ec, 0x0006, 0x600c, 0x0006, 0x6004, + 0x0006, 0x6028, 0x0006, 0x080c, 0x2aff, 0x080c, 0x2b32, 0x602f, + 0x0100, 0x602f, 0x0000, 0x602f, 0x0040, 0x602f, 0x0000, 0x20a9, + 0x0002, 0x080c, 0x2a69, 0x0026, 0x2011, 0x0040, 0x080c, 0x2adc, + 0x002e, 0x000e, 0x602a, 0x000e, 0x6006, 0x000e, 0x600e, 0x000e, + 0x60ee, 0x60e3, 0x0000, 0x6887, 0x0001, 0x2001, 0x0001, 0x080c, + 0x2715, 0x2001, 0x00a0, 0x0006, 0x080c, 0xd35d, 0x000e, 0x0130, + 0x080c, 0x2ac0, 0x9006, 0x080c, 0x2acc, 0x0010, 0x080c, 0x2aa2, + 0x000e, 0x6052, 0x6050, 0x0006, 0xc0e5, 0x6052, 0x00f6, 0x2079, + 0x0100, 0x080c, 0x2a19, 0x00fe, 0x000e, 0x6052, 0x0005, 0x0156, + 0x0016, 0x0026, 0x0036, 0x00c6, 0x00d6, 0x00e6, 0x2061, 0x0100, + 0x2069, 0x0140, 0x2071, 0x1800, 0x080c, 0xab55, 0x0158, 0x2001, + 0x0386, 0x2004, 0xd0b4, 0x1130, 0x2001, 0x0016, 0x080c, 0xaae8, + 0x0804, 0x77cd, 0x2001, 0x180c, 0x200c, 0xc1c4, 0x2102, 0x6028, + 0x9084, 0xe1ff, 0x602a, 0x2011, 0x0200, 0x080c, 0x2adc, 0x2001, + 0x0090, 0x080c, 0x2aa2, 0x20a9, 0x0366, 0x6024, 0xd0cc, 0x1558, + 0x1d04, 0x776d, 0x2091, 0x6000, 0x1f04, 0x776d, 0x080c, 0xaaf7, + 0x2011, 0x0003, 0x080c, 0xa426, 0x2011, 0x0002, 0x080c, 0xa430, + 0x080c, 0xa311, 0x901e, 0x080c, 0xa391, 0x2001, 0x0386, 0x2003, + 0x7000, 0x080c, 0xab13, 0x2001, 0x00a0, 0x080c, 0x2aa2, 0x080c, + 0x799f, 0x080c, 0x6178, 0x080c, 0xd35d, 0x0110, 0x080c, 0x0ce5, + 0x9085, 0x0001, 0x04c0, 0x080c, 0x1b68, 0x60e3, 0x0000, 0x2001, + 0x196e, 0x2004, 0x080c, 0x2715, 0x60e2, 0x2001, 0x0080, 0x080c, + 0x2aa2, 0x20a9, 0x0366, 0x2011, 0x1e00, 0x080c, 0x2adc, 0x2009, + 0x1e00, 0x080c, 0x2a88, 0x6024, 0x910c, 0x0140, 0x1d04, 0x77ab, + 0x2091, 0x6000, 0x1f04, 0x77ab, 0x0804, 0x7776, 0x2001, 0x0386, + 0x2003, 0x7000, 0x6028, 0x9085, 0x1e00, 0x602a, 0x70b4, 0x9005, + 0x1118, 0x6887, 0x0001, 0x0008, 0x6886, 0x080c, 0xd35d, 0x0110, + 0x080c, 0x0ce5, 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, + 0x7844, 0x2001, 0x0088, 0x080c, 0x2aa2, 0x9006, 0x60e2, 0x6886, + 0x080c, 0x2715, 0x2069, 0x0200, 0x6804, 0x9005, 0x1118, 0x6808, + 0x9005, 0x01d0, 0x6028, 0x9084, 0xfbff, 0x602a, 0x2011, 0x0400, + 0x080c, 0x2adc, 0x2069, 0x1990, 0x7000, 0x206a, 0x709b, 0x0026, + 0x7003, 0x0001, 0x20a9, 0x0002, 0x1d04, 0x7824, 0x2091, 0x6000, + 0x1f04, 0x7824, 0x0804, 0x7878, 0x2069, 0x0140, 0x20a9, 0x0384, + 0x2011, 0x1e00, 0x080c, 0x2adc, 0x2009, 0x1e00, 0x080c, 0x2a88, + 0x6024, 0x910c, 0x0528, 0x9084, 0x1a00, 0x1510, 0x1d04, 0x7830, + 0x2091, 0x6000, 0x1f04, 0x7830, 0x080c, 0xaaf7, 0x2011, 0x0003, + 0x080c, 0xa426, 0x2011, 0x0002, 0x080c, 0xa430, 0x080c, 0xa311, + 0x901e, 0x080c, 0xa391, 0x080c, 0xab13, 0x2001, 0x00a0, 0x080c, + 0x2aa2, 0x080c, 0x799f, 0x080c, 0x6178, 0x9085, 0x0001, 0x00c0, + 0x080c, 0x1b68, 0x2001, 0x0080, 0x080c, 0x2aa2, 0x2069, 0x0140, + 0x60e3, 0x0000, 0x70b4, 0x9005, 0x1118, 0x6887, 0x0001, 0x0008, + 0x6886, 0x2001, 0x196e, 0x2004, 0x080c, 0x2715, 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, + 0xaaf7, 0x2011, 0x0003, 0x080c, 0xa426, 0x2011, 0x0002, 0x080c, + 0xa430, 0x080c, 0xa311, 0x901e, 0x080c, 0xa391, 0x080c, 0xab13, + 0x2069, 0x0140, 0x2001, 0x00a0, 0x080c, 0x2aa2, 0x080c, 0x799f, + 0x080c, 0x6178, 0x0804, 0x791b, 0x2001, 0x180c, 0x200c, 0xd1b4, + 0x1160, 0xc1b5, 0x2102, 0x080c, 0x74f9, 0x2069, 0x0140, 0x2001, + 0x0080, 0x080c, 0x2aa2, 0x60e3, 0x0000, 0x2069, 0x0200, 0x6804, + 0x9005, 0x1118, 0x6808, 0x9005, 0x0190, 0x6028, 0x9084, 0xfdff, + 0x602a, 0x2011, 0x0200, 0x080c, 0x2adc, 0x2069, 0x1990, 0x7000, + 0x206a, 0x709b, 0x0027, 0x7003, 0x0001, 0x0804, 0x791b, 0x2011, + 0x1e00, 0x080c, 0x2adc, 0x2009, 0x1e00, 0x080c, 0x2a88, 0x6024, + 0x910c, 0x01c8, 0x9084, 0x1c00, 0x11b0, 0x1d04, 0x78d7, 0x0006, + 0x0016, 0x00c6, 0x00d6, 0x00e6, 0x080c, 0x8780, 0x00ee, 0x00de, + 0x00ce, 0x001e, 0x000e, 0x00e6, 0x2071, 0x1a05, 0x7078, 0x00ee, + 0x9005, 0x19e8, 0x0400, 0x0026, 0x2011, 0x7511, 0x080c, 0x882c, + 0x2011, 0x7504, 0x080c, 0x8938, 0x002e, 0x2069, 0x0140, 0x60e3, + 0x0000, 0x70b4, 0x9005, 0x1118, 0x6887, 0x0001, 0x0008, 0x6886, + 0x2001, 0x196e, 0x2004, 0x080c, 0x2715, 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, 0xd356, + 0x1904, 0x7989, 0x7130, 0xd184, 0x1170, 0x080c, 0x3468, 0x0138, + 0xc18d, 0x7132, 0x2011, 0x1848, 0x2214, 0xd2ac, 0x1120, 0x7030, + 0xd08c, 0x0904, 0x7989, 0x2011, 0x1848, 0x220c, 0xd1a4, 0x0538, + 0x0016, 0x2019, 0x000e, 0x080c, 0xe701, 0x0156, 0x00b6, 0x20a9, + 0x007f, 0x900e, 0x9186, 0x007e, 0x01a0, 0x9186, 0x0080, 0x0188, + 0x080c, 0x6783, 0x1170, 0x2120, 0x9006, 0x0016, 0x2009, 0x000e, + 0x080c, 0xe795, 0x2009, 0x0001, 0x2011, 0x0100, 0x080c, 0x8add, + 0x001e, 0x8108, 0x1f04, 0x7952, 0x00be, 0x015e, 0x001e, 0xd1ac, + 0x1148, 0x0016, 0x2009, 0x0002, 0x2019, 0x0004, 0x080c, 0x32c0, + 0x001e, 0x0078, 0x0156, 0x00b6, 0x20a9, 0x007f, 0x900e, 0x080c, + 0x6783, 0x1110, 0x080c, 0x6192, 0x8108, 0x1f04, 0x797f, 0x00be, + 0x015e, 0x080c, 0x1b68, 0x080c, 0xaaf7, 0x080c, 0xae87, 0x080c, + 0xab13, 0x60e3, 0x0000, 0x080c, 0x6178, 0x080c, 0x75cc, 0x00ee, + 0x00ce, 0x004e, 0x003e, 0x002e, 0x001e, 0x015e, 0x0005, 0x2001, + 0x197e, 0x2003, 0x0001, 0x0005, 0x2001, 0x197e, 0x2003, 0x0000, + 0x0005, 0x2001, 0x197d, 0x2003, 0xaaaa, 0x0005, 0x2001, 0x197d, + 0x2003, 0x0000, 0x0005, 0x2071, 0x18fa, 0x7003, 0x0000, 0x7007, + 0x0000, 0x080c, 0x1066, 0x090c, 0x0d79, 0xa8ab, 0xdcb0, 0x2900, + 0x704e, 0x080c, 0x1066, 0x090c, 0x0d79, 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, 0x7f9c, 0x9006, 0x00ee, + 0x0005, 0x900e, 0x0156, 0x20a9, 0x0006, 0x8003, 0x818d, 0x1f04, + 0x7a15, 0x015e, 0x0005, 0x2079, 0x0040, 0x2071, 0x18fa, 0x7004, + 0x0002, 0x7a2b, 0x7a2c, 0x7a78, 0x7ad3, 0x7be3, 0x7a29, 0x7a29, + 0x7c0d, 0x080c, 0x0d79, 0x0005, 0x2079, 0x0040, 0x2001, 0x1dc0, + 0x2003, 0x0000, 0x782c, 0x908c, 0x0780, 0x190c, 0x807e, 0xd0a4, + 0x0578, 0x2001, 0x1dc0, 0x2004, 0x9082, 0x0080, 0x1648, 0x1d04, + 0x7a49, 0x2001, 0x1a08, 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, 0x7a68, 0x7a32, 0x7a68, + 0x7a66, 0x7a68, 0x7a68, 0x7a68, 0x7a68, 0x7a68, 0x080c, 0x7ad3, + 0x782c, 0xd09c, 0x090c, 0x7f9c, 0x0005, 0x9082, 0x005a, 0x1218, + 0x2100, 0x003b, 0x0c10, 0x080c, 0x7b09, 0x0c90, 0x00e3, 0x08e8, + 0x0005, 0x7b09, 0x7b09, 0x7b09, 0x7b09, 0x7b09, 0x7b09, 0x7b09, + 0x7b09, 0x7b2b, 0x7b09, 0x7b09, 0x7b09, 0x7b09, 0x7b09, 0x7b09, + 0x7b09, 0x7b09, 0x7b09, 0x7b09, 0x7b09, 0x7b09, 0x7b09, 0x7b09, + 0x7b09, 0x7b09, 0x7b09, 0x7b09, 0x7b09, 0x7b15, 0x7b09, 0x7d03, + 0x7b09, 0x7b09, 0x7b09, 0x7b2b, 0x7b09, 0x7b15, 0x7d44, 0x7d85, + 0x7dcc, 0x7de0, 0x7b09, 0x7b09, 0x7b2b, 0x7b15, 0x7b3f, 0x7b09, + 0x7bb7, 0x7e8b, 0x7ea6, 0x7b09, 0x7b2b, 0x7b09, 0x7b3f, 0x7b09, + 0x7b09, 0x7bad, 0x7ea6, 0x7b09, 0x7b09, 0x7b09, 0x7b09, 0x7b09, + 0x7b09, 0x7b09, 0x7b09, 0x7b09, 0x7b53, 0x7b09, 0x7b09, 0x7b09, + 0x7b09, 0x7b09, 0x7b09, 0x7b09, 0x7b09, 0x7b09, 0x8022, 0x7b09, + 0x7fcc, 0x7b09, 0x7fcc, 0x7b09, 0x7b68, 0x7b09, 0x7b09, 0x7b09, + 0x7b09, 0x7b09, 0x7b09, 0x2079, 0x0040, 0x7004, 0x9086, 0x0003, + 0x1198, 0x782c, 0x080c, 0x7fc5, 0xd0a4, 0x0170, 0x7824, 0x2048, + 0x9006, 0xa802, 0xa806, 0xa864, 0x9084, 0x00ff, 0x908a, 0x001a, + 0x1210, 0x002b, 0x0c50, 0x00e9, 0x080c, 0x7f9c, 0x0005, 0x7b09, + 0x7b15, 0x7cef, 0x7b09, 0x7b15, 0x7b09, 0x7b15, 0x7b15, 0x7b09, + 0x7b15, 0x7cef, 0x7b15, 0x7b15, 0x7b15, 0x7b15, 0x7b15, 0x7b09, + 0x7b15, 0x7cef, 0x7b09, 0x7b09, 0x7b15, 0x7b09, 0x7b09, 0x7b09, + 0x7b15, 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, + 0x6f11, 0x012e, 0x0005, 0xa864, 0x8007, 0x9084, 0x00ff, 0x0d08, + 0x8001, 0x1120, 0x7007, 0x0001, 0x0804, 0x7c8c, 0x7007, 0x0003, + 0x7012, 0x2900, 0x7016, 0x701a, 0x704b, 0x7c8c, 0x0005, 0xa864, + 0x8007, 0x9084, 0x00ff, 0x0968, 0x8001, 0x1120, 0x7007, 0x0001, + 0x0804, 0x7ca7, 0x7007, 0x0003, 0x7012, 0x2900, 0x7016, 0x701a, + 0x704b, 0x7ca7, 0x0005, 0xa864, 0x8007, 0x9084, 0x00ff, 0x0904, + 0x7b11, 0x8001, 0x1120, 0x7007, 0x0001, 0x0804, 0x7cc3, 0x7007, + 0x0003, 0x7012, 0x2900, 0x7016, 0x701a, 0x704b, 0x7cc3, 0x0005, + 0xa864, 0x8007, 0x9084, 0x00ff, 0x9086, 0x0001, 0x1904, 0x7b11, + 0x7007, 0x0001, 0x2009, 0x1834, 0x210c, 0x81ff, 0x11a8, 0xa868, + 0x9084, 0x00ff, 0xa86a, 0xa883, 0x0000, 0x080c, 0x640b, 0x1108, + 0x0005, 0x0126, 0x2091, 0x8000, 0xa867, 0x0139, 0xa87a, 0xa982, + 0x080c, 0x6f11, 0x012e, 0x0ca0, 0xa994, 0x9186, 0x0071, 0x0d38, + 0x9186, 0x0064, 0x0d20, 0x9186, 0x007c, 0x0d08, 0x9186, 0x0028, + 0x09f0, 0x9186, 0x0038, 0x09d8, 0x9186, 0x0078, 0x09c0, 0x9186, + 0x005f, 0x09a8, 0x9186, 0x0056, 0x0990, 0xa897, 0x4005, 0xa89b, + 0x0001, 0x2001, 0x0030, 0x900e, 0x08a0, 0xa87c, 0x9084, 0x00c0, + 0x9086, 0x00c0, 0x1120, 0x7007, 0x0001, 0x0804, 0x7ebd, 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, + 0x7b19, 0xaab4, 0x928a, 0x0002, 0x1a04, 0x7b19, 0x82ff, 0x1138, + 0xa8b8, 0xa9bc, 0x9105, 0x0118, 0x2001, 0x7c4a, 0x0018, 0x9280, + 0x7c40, 0x2005, 0x7056, 0x7010, 0x9015, 0x0904, 0x7c2b, 0x080c, + 0x1066, 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, 0x1142, 0xa06c, 0x908e, 0x0100, + 0x0170, 0x9086, 0x0200, 0x0118, 0x7007, 0x0007, 0x0005, 0x7020, + 0x2048, 0x080c, 0x107f, 0x7014, 0x2048, 0x0804, 0x7b19, 0x7020, + 0x2048, 0x7018, 0xa802, 0xa807, 0x0000, 0x2908, 0x2048, 0xa906, + 0x711a, 0x0804, 0x7be3, 0x7014, 0x2048, 0x7007, 0x0001, 0xa8b4, + 0x9005, 0x1128, 0xa8b8, 0xa9bc, 0x9105, 0x0108, 0x00b9, 0xa864, + 0x9084, 0x00ff, 0x9086, 0x001e, 0x0904, 0x7ebd, 0x0804, 0x7c8c, + 0x7c42, 0x7c46, 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, 0x620a, 0x1108, 0x0005, 0x080c, 0x715d, 0x0126, + 0x2091, 0x8000, 0x080c, 0xcf38, 0x080c, 0x6f11, 0x012e, 0x0ca0, + 0x080c, 0xd356, 0x1d70, 0x2001, 0x0028, 0x900e, 0x0c70, 0x2009, + 0x1834, 0x210c, 0x81ff, 0x1188, 0xa888, 0x9005, 0x0188, 0xa883, + 0x0000, 0x080c, 0x6298, 0x1108, 0x0005, 0xa87a, 0x0126, 0x2091, + 0x8000, 0x080c, 0x6f11, 0x012e, 0x0cb8, 0x2001, 0x0028, 0x0ca8, + 0x2001, 0x0000, 0x0c90, 0x0419, 0x11d8, 0xa888, 0x9005, 0x01e0, + 0xa883, 0x0000, 0xa87c, 0xd0f4, 0x0120, 0x080c, 0x636d, 0x1138, + 0x0005, 0x9006, 0xa87a, 0x080c, 0x62e5, 0x1108, 0x0005, 0x0126, + 0x2091, 0x8000, 0xa87a, 0xa982, 0x080c, 0x6f11, 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, 0x6783, 0x11b8, 0x0066, 0xae80, + 0x080c, 0x6893, 0x006e, 0x0088, 0x0046, 0x2011, 0x180c, 0x2224, + 0xc484, 0x2412, 0x004e, 0x00c6, 0x080c, 0x6783, 0x1110, 0x080c, + 0x6a64, 0x8108, 0x1f04, 0x7d2c, 0x00ce, 0xa87c, 0xd084, 0x1120, + 0x080c, 0x107f, 0x00be, 0x0005, 0x0126, 0x2091, 0x8000, 0x080c, + 0x6f11, 0x012e, 0x00be, 0x0005, 0x0126, 0x2091, 0x8000, 0x7007, + 0x0001, 0x080c, 0x6bc9, 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, 0x7f86, 0x012e, 0x0804, 0x7f80, 0x012e, + 0x0804, 0x7f7a, 0x012e, 0x0804, 0x7f7d, 0x0126, 0x2091, 0x8000, + 0x7007, 0x0001, 0x080c, 0x6bc9, 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, 0x7f86, 0x012e, 0x0804, + 0x7f83, 0x012e, 0x0804, 0x7f80, 0x0126, 0x2091, 0x8000, 0x7007, + 0x0001, 0x2061, 0x1a74, 0x6300, 0xd38c, 0x1120, 0x6308, 0x8318, + 0x0220, 0x630a, 0x012e, 0x0804, 0x7f94, 0x012e, 0x0804, 0x7f83, + 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, 0xaf89, + 0x0068, 0x6017, 0xf400, 0x6063, 0x0000, 0xa97c, 0xd1a4, 0x0110, + 0xa980, 0x6162, 0x2009, 0x0041, 0x080c, 0xafec, 0xa988, 0x918c, + 0xff00, 0x9186, 0x2000, 0x1138, 0x0026, 0x900e, 0x2011, 0xfdff, + 0x080c, 0x8add, 0x002e, 0xa87c, 0xd0c4, 0x0148, 0x2061, 0x1a74, + 0x6000, 0xd08c, 0x1120, 0x6008, 0x8000, 0x0208, 0x600a, 0x00ce, + 0x012e, 0x00be, 0x0804, 0x7f86, 0x00ce, 0x012e, 0x00be, 0x0804, + 0x7f80, 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, 0x6783, 0x1968, 0xb800, 0xc0e4, + 0xb802, 0x0848, 0xa88c, 0x9065, 0x09b8, 0x6007, 0x0024, 0x2001, + 0x1987, 0x2004, 0x601a, 0x0804, 0x7e1b, 0xa88c, 0x9065, 0x0960, + 0x00e6, 0xa890, 0x9075, 0x2001, 0x1834, 0x2004, 0x9005, 0x0150, + 0x080c, 0xaf89, 0x8eff, 0x0118, 0x2e60, 0x080c, 0xaf89, 0x00ee, + 0x0804, 0x7e1b, 0x6024, 0xc0dc, 0xc0d5, 0x6026, 0x2e60, 0x6007, + 0x003a, 0xa8a0, 0x9005, 0x0130, 0x6007, 0x003b, 0xa8a4, 0x602e, + 0xa8a8, 0x6016, 0x6003, 0x0001, 0x2009, 0x8020, 0x080c, 0x9420, + 0x00ee, 0x0804, 0x7e1b, 0x2061, 0x1a74, 0x6000, 0xd084, 0x0190, + 0xd08c, 0x1904, 0x7f94, 0x0126, 0x2091, 0x8000, 0x6204, 0x8210, + 0x0220, 0x6206, 0x012e, 0x0804, 0x7f94, 0x012e, 0xa883, 0x0016, + 0x0804, 0x7f8d, 0xa883, 0x0007, 0x0804, 0x7f8d, 0xa864, 0x8007, + 0x9084, 0x00ff, 0x0130, 0x8001, 0x1138, 0x7007, 0x0001, 0x0069, + 0x0005, 0x080c, 0x7b11, 0x0040, 0x7007, 0x0003, 0x7012, 0x2900, + 0x7016, 0x701a, 0x704b, 0x7ebd, 0x0005, 0x00b6, 0x00e6, 0x0126, + 0x2091, 0x8000, 0x903e, 0x2061, 0x1800, 0x61d0, 0x81ff, 0x1904, + 0x7f3f, 0x6130, 0xd194, 0x1904, 0x7f69, 0xa878, 0x2070, 0x9e82, + 0x1ddc, 0x0a04, 0x7f33, 0x6068, 0x9e02, 0x1a04, 0x7f33, 0x7120, + 0x9186, 0x0006, 0x1904, 0x7f25, 0x7010, 0x905d, 0x0904, 0x7f3f, + 0xb800, 0xd0e4, 0x1904, 0x7f63, 0x2061, 0x1a74, 0x6100, 0x9184, + 0x0301, 0x9086, 0x0001, 0x15a0, 0x7024, 0xd0dc, 0x1904, 0x7f6c, + 0xa883, 0x0000, 0xa803, 0x0000, 0x2908, 0x7014, 0x9005, 0x1198, + 0x7116, 0xa87c, 0xd0f4, 0x1904, 0x7f6f, 0x080c, 0x5820, 0xd09c, + 0x1118, 0xa87c, 0xc0cc, 0xa87e, 0x2e60, 0x080c, 0x89cd, 0x012e, + 0x00ee, 0x00be, 0x0005, 0x2048, 0xa800, 0x9005, 0x1de0, 0xa902, + 0x2148, 0xa87c, 0xd0f4, 0x1904, 0x7f6f, 0x012e, 0x00ee, 0x00be, + 0x0005, 0x012e, 0x00ee, 0xa883, 0x0006, 0x00be, 0x0804, 0x7f8d, + 0xd184, 0x0db8, 0xd1c4, 0x1190, 0x00a0, 0xa974, 0x080c, 0x6783, + 0x15d0, 0xb800, 0xd0e4, 0x15b8, 0x7120, 0x9186, 0x0007, 0x1118, + 0xa883, 0x0002, 0x0490, 0xa883, 0x0008, 0x0478, 0xa883, 0x000e, + 0x0460, 0xa883, 0x0017, 0x0448, 0xa883, 0x0035, 0x0430, 0x080c, + 0x5824, 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, 0x7ec9, 0x7003, 0x0002, 0x0804, 0x7ec9, + 0xa883, 0x0028, 0x0010, 0xa883, 0x0029, 0x012e, 0x00ee, 0x00be, + 0x0420, 0xa883, 0x002a, 0x0cc8, 0xa883, 0x0045, 0x0cb0, 0x2e60, + 0x2019, 0x0002, 0x601b, 0x0014, 0x080c, 0xe28e, 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, 0x6f11, 0x012e, 0x0005, 0x080c, 0x107f, 0x0005, 0x00d6, + 0x080c, 0x89c4, 0x00de, 0x0005, 0x00d6, 0x00e6, 0x0126, 0x2091, + 0x8000, 0x2071, 0x0040, 0x702c, 0xd084, 0x01d8, 0x908c, 0x0780, + 0x190c, 0x807e, 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, 0x807e, 0x000e, 0x0005, 0xa898, 0x9084, 0x0003, 0x05a8, + 0x080c, 0xaef8, 0x05d8, 0x2900, 0x6016, 0xa864, 0x9084, 0x00ff, + 0x9086, 0x0035, 0x1138, 0x6028, 0xc0fd, 0x602a, 0x2001, 0x196c, + 0x2004, 0x0098, 0xa8a0, 0x9084, 0x00ff, 0xa99c, 0x918c, 0xff00, + 0x9105, 0xa99c, 0x918c, 0x00ff, 0x080c, 0x26a1, 0x1540, 0x00b6, + 0x080c, 0x6783, 0x2b00, 0x00be, 0x1510, 0x6012, 0x6023, 0x0001, + 0x2009, 0x0040, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0035, 0x0110, + 0x2009, 0x0041, 0x080c, 0xafec, 0x0005, 0xa87b, 0x0101, 0x0126, + 0x2091, 0x8000, 0x080c, 0x6f11, 0x012e, 0x0005, 0xa87b, 0x002c, + 0x0126, 0x2091, 0x8000, 0x080c, 0x6f11, 0x012e, 0x0005, 0xa87b, + 0x0028, 0x0126, 0x2091, 0x8000, 0x080c, 0x6f11, 0x012e, 0x080c, + 0xaf4e, 0x0005, 0x00d6, 0x00c6, 0x0036, 0x0026, 0x0016, 0x00b6, + 0x7007, 0x0001, 0xaa74, 0x9282, 0x0004, 0x1a04, 0x806f, 0xa97c, + 0x9188, 0x1000, 0x2104, 0x905d, 0xb804, 0xd284, 0x0140, 0x05e8, + 0x8007, 0x9084, 0x00ff, 0x9084, 0x0006, 0x1108, 0x04b0, 0x2b10, + 0x080c, 0xaef8, 0x1118, 0x080c, 0xafbf, 0x05a8, 0x6212, 0xa874, + 0x0002, 0x804d, 0x8052, 0x8055, 0x805b, 0x2019, 0x0002, 0x080c, + 0xe701, 0x0060, 0x080c, 0xe68c, 0x0048, 0x2019, 0x0002, 0xa980, + 0x080c, 0xe6ab, 0x0018, 0xa980, 0x080c, 0xe68c, 0x080c, 0xaf4e, + 0xa887, 0x0000, 0x0126, 0x2091, 0x8000, 0x080c, 0x6f11, 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, 0x8080, 0x0006, 0x0016, 0x2001, 0x8003, 0x0006, 0x0804, + 0x0d82, 0x2001, 0x1834, 0x2004, 0x9005, 0x0005, 0x0005, 0x00f6, + 0x2079, 0x0300, 0x2001, 0x0200, 0x200c, 0xc1e5, 0xc1dc, 0x2102, + 0x2009, 0x0218, 0x210c, 0xd1ec, 0x1120, 0x080c, 0x163c, 0x00fe, + 0x0005, 0x2001, 0x020d, 0x2003, 0x0020, 0x781f, 0x0300, 0x00fe, + 0x0005, 0x781c, 0xd08c, 0x0904, 0x8101, 0x68c0, 0x90aa, 0x0005, + 0x0a04, 0x8729, 0x7d44, 0x7c40, 0xd59c, 0x190c, 0x0d79, 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, 0xebc0, 0x080c, 0x8610, + 0x7817, 0x0140, 0x00a8, 0x9584, 0x0076, 0x1118, 0x080c, 0x866c, + 0x19c8, 0xd5a4, 0x0148, 0x0046, 0x0056, 0x080c, 0x8151, 0x080c, + 0x21a2, 0x005e, 0x004e, 0x0020, 0x080c, 0xebc0, 0x7817, 0x0140, + 0x080c, 0x769d, 0x0168, 0x2001, 0x0111, 0x2004, 0xd08c, 0x0140, + 0x6893, 0x0000, 0x2001, 0x0110, 0x2003, 0x0008, 0x2003, 0x0000, + 0x0489, 0x0005, 0x0002, 0x810e, 0x841e, 0x810b, 0x810b, 0x810b, + 0x810b, 0x810b, 0x810b, 0x7817, 0x0140, 0x0005, 0x7000, 0x908c, + 0xff00, 0x9194, 0xf000, 0x810f, 0x9484, 0x0fff, 0x6892, 0x9286, + 0x2000, 0x1150, 0x6800, 0x9086, 0x0001, 0x1118, 0x080c, 0x588a, + 0x0070, 0x080c, 0x8171, 0x0058, 0x9286, 0x3000, 0x1118, 0x080c, + 0x8358, 0x0028, 0x9286, 0x8000, 0x1110, 0x080c, 0x853d, 0x7817, + 0x0140, 0x0005, 0x2001, 0x1810, 0x2004, 0xd08c, 0x0178, 0x2001, + 0x1800, 0x2004, 0x9086, 0x0003, 0x1148, 0x0026, 0x0036, 0x2011, + 0x8048, 0x2518, 0x080c, 0x4c28, 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, 0x4c28, 0x002e, 0x00fe, 0x005e, 0x004e, 0x003e, + 0x0005, 0x00b6, 0x00c6, 0x7010, 0x9084, 0xff00, 0x8007, 0x9096, + 0x0001, 0x0120, 0x9096, 0x0023, 0x1904, 0x8329, 0x9186, 0x0023, + 0x15c0, 0x080c, 0x85db, 0x0904, 0x8329, 0x6120, 0x9186, 0x0001, + 0x0150, 0x9186, 0x0004, 0x0138, 0x9186, 0x0008, 0x0120, 0x9186, + 0x000a, 0x1904, 0x8329, 0x7124, 0x610a, 0x7030, 0x908e, 0x0200, + 0x1130, 0x2009, 0x0015, 0x080c, 0xafec, 0x0804, 0x8329, 0x908e, + 0x0214, 0x0118, 0x908e, 0x0210, 0x1130, 0x2009, 0x0015, 0x080c, + 0xafec, 0x0804, 0x8329, 0x908e, 0x0100, 0x1904, 0x8329, 0x7034, + 0x9005, 0x1904, 0x8329, 0x2009, 0x0016, 0x080c, 0xafec, 0x0804, + 0x8329, 0x9186, 0x0022, 0x1904, 0x8329, 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, 0x26ea, + 0x7932, 0x7936, 0x001e, 0x000e, 0x00fe, 0x080c, 0x26a1, 0x695e, + 0x703c, 0x00e6, 0x2071, 0x0140, 0x7086, 0x2071, 0x1800, 0x70b6, + 0x00ee, 0x7034, 0x9005, 0x1904, 0x8329, 0x2009, 0x0017, 0x0804, + 0x82d9, 0x908e, 0x0400, 0x1190, 0x7034, 0x9005, 0x1904, 0x8329, + 0x080c, 0x769d, 0x0120, 0x2009, 0x001d, 0x0804, 0x82d9, 0x68dc, + 0xc0a5, 0x68de, 0x2009, 0x0030, 0x0804, 0x82d9, 0x908e, 0x0500, + 0x1140, 0x7034, 0x9005, 0x1904, 0x8329, 0x2009, 0x0018, 0x0804, + 0x82d9, 0x908e, 0x2010, 0x1120, 0x2009, 0x0019, 0x0804, 0x82d9, + 0x908e, 0x2110, 0x1120, 0x2009, 0x001a, 0x0804, 0x82d9, 0x908e, + 0x5200, 0x1140, 0x7034, 0x9005, 0x1904, 0x8329, 0x2009, 0x001b, + 0x0804, 0x82d9, 0x908e, 0x5000, 0x1140, 0x7034, 0x9005, 0x1904, + 0x8329, 0x2009, 0x001c, 0x0804, 0x82d9, 0x908e, 0x1300, 0x1120, + 0x2009, 0x0034, 0x0804, 0x82d9, 0x908e, 0x1200, 0x1140, 0x7034, + 0x9005, 0x1904, 0x8329, 0x2009, 0x0024, 0x0804, 0x82d9, 0x908c, + 0xff00, 0x918e, 0x2400, 0x1170, 0x2009, 0x002d, 0x2001, 0x1810, + 0x2004, 0xd09c, 0x0904, 0x82d9, 0x080c, 0xdaa3, 0x1904, 0x8329, + 0x0804, 0x82d7, 0x908c, 0xff00, 0x918e, 0x5300, 0x1120, 0x2009, + 0x002a, 0x0804, 0x82d9, 0x908e, 0x0f00, 0x1120, 0x2009, 0x0020, + 0x0804, 0x82d9, 0x908e, 0x6104, 0x1530, 0x2029, 0x0205, 0x2011, + 0x026d, 0x8208, 0x2204, 0x9082, 0x0004, 0x8004, 0x8004, 0x20a8, + 0x2011, 0x8015, 0x211c, 0x8108, 0x0046, 0x2124, 0x080c, 0x4c28, + 0x004e, 0x8108, 0x0f04, 0x828d, 0x9186, 0x0280, 0x1d88, 0x2504, + 0x8000, 0x202a, 0x2009, 0x0260, 0x0c58, 0x202b, 0x0000, 0x2009, + 0x0023, 0x0804, 0x82d9, 0x908e, 0x6000, 0x1120, 0x2009, 0x003f, + 0x0804, 0x82d9, 0x908e, 0x5400, 0x1138, 0x080c, 0x86d9, 0x1904, + 0x8329, 0x2009, 0x0046, 0x04a8, 0x908e, 0x5500, 0x1148, 0x080c, + 0x8701, 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, + 0x26a1, 0x1904, 0x832c, 0x080c, 0x6718, 0x1904, 0x832c, 0xbe12, + 0xbd16, 0x001e, 0x0016, 0x080c, 0x769d, 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, 0xaef8, + 0x01a8, 0x2b08, 0x6112, 0x6023, 0x0004, 0x7120, 0x610a, 0x001e, + 0x9186, 0x004c, 0x1110, 0x6023, 0x000a, 0x0016, 0x001e, 0x080c, + 0xafec, 0x00ce, 0x00be, 0x0005, 0x001e, 0x0cd8, 0x2001, 0x180e, + 0x2004, 0xd0ec, 0x0120, 0x2011, 0x8049, 0x080c, 0x4c28, 0x080c, + 0xafbf, 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, 0x9427, 0x08a0, + 0x080c, 0x8748, 0x1158, 0x080c, 0x3432, 0x1140, 0x7010, 0x9084, + 0xff00, 0x8007, 0x908e, 0x0008, 0x1108, 0x0009, 0x0005, 0x00b6, + 0x00c6, 0x0046, 0x7000, 0x908c, 0xff00, 0x810f, 0x9186, 0x0033, + 0x11e8, 0x080c, 0x85db, 0x0904, 0x83b6, 0x7124, 0x610a, 0x7030, + 0x908e, 0x0200, 0x1140, 0x7034, 0x9005, 0x15c0, 0x2009, 0x0015, + 0x080c, 0xafec, 0x0498, 0x908e, 0x0100, 0x1580, 0x7034, 0x9005, + 0x1568, 0x2009, 0x0016, 0x080c, 0xafec, 0x0440, 0x9186, 0x0032, + 0x1528, 0x7030, 0x908e, 0x1400, 0x1508, 0x2009, 0x0038, 0x0016, + 0x2011, 0x0263, 0x2204, 0x8211, 0x220c, 0x080c, 0x26a1, 0x11a8, + 0x080c, 0x6718, 0x1190, 0xbe12, 0xbd16, 0x080c, 0xaef8, 0x0168, + 0x2b08, 0x6112, 0x080c, 0xd0ce, 0x6023, 0x0004, 0x7120, 0x610a, + 0x001e, 0x080c, 0xafec, 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, 0x8418, 0x9596, 0xfffe, 0x1120, + 0x2009, 0x007e, 0x0804, 0x8418, 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, + 0x83ed, 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, + 0x8440, 0x8440, 0x8440, 0x85ed, 0x8440, 0x8443, 0x8468, 0x84f1, + 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, + 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, 0xafec, 0x7817, 0x0140, 0x00be, 0x0005, + 0x00b6, 0x00c6, 0x9484, 0x0fff, 0x0904, 0x84cd, 0x7110, 0xd1bc, + 0x1904, 0x84cd, 0x7108, 0x700c, 0x2028, 0x918c, 0x00ff, 0x2130, + 0x9094, 0xff00, 0x15c8, 0x81ff, 0x15b8, 0x9080, 0x3474, 0x200d, + 0x918c, 0xff00, 0x810f, 0x2001, 0x0080, 0x9106, 0x0904, 0x84cd, + 0x9182, 0x0801, 0x1a04, 0x84cd, 0x9190, 0x1000, 0x2204, 0x905d, + 0x05e0, 0xbe12, 0xbd16, 0xb800, 0xd0ec, 0x15b8, 0xba04, 0x9294, + 0xff00, 0x9286, 0x0600, 0x1190, 0x080c, 0xaef8, 0x0598, 0x2b08, + 0x7028, 0x604e, 0x702c, 0x6052, 0x6112, 0x6023, 0x0006, 0x7120, + 0x610a, 0x7130, 0x615e, 0x080c, 0xdd1f, 0x00f8, 0x080c, 0x6bcd, + 0x1138, 0xb807, 0x0606, 0x0c40, 0x190c, 0x83ba, 0x11b0, 0x0880, + 0x080c, 0xaef8, 0x2b08, 0x0188, 0x6112, 0x6023, 0x0004, 0x7120, + 0x610a, 0x9286, 0x0400, 0x1118, 0x6007, 0x0005, 0x0010, 0x6007, + 0x0001, 0x6003, 0x0001, 0x080c, 0x9427, 0x7817, 0x0140, 0x00ce, + 0x00be, 0x0005, 0x2001, 0x180e, 0x2004, 0xd0ec, 0x0120, 0x2011, + 0x8049, 0x080c, 0x4c28, 0x080c, 0xafbf, 0x0d78, 0x2b08, 0x6112, + 0x6023, 0x0006, 0x7120, 0x610a, 0x7130, 0x615e, 0x6017, 0xf300, + 0x6003, 0x0001, 0x6007, 0x0041, 0x2009, 0xa022, 0x080c, 0x9420, + 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, 0xafec, 0x7817, + 0x0140, 0x00be, 0x0005, 0x6120, 0x9186, 0x0002, 0x0128, 0x9186, + 0x0005, 0x0110, 0x9085, 0x0001, 0x0005, 0x080c, 0x8748, 0x1180, + 0x080c, 0x3432, 0x1168, 0x7010, 0x9084, 0xff00, 0x8007, 0x9086, + 0x0000, 0x1130, 0x9184, 0x000f, 0x908a, 0x0006, 0x1208, 0x000b, + 0x0005, 0x8557, 0x8558, 0x8557, 0x8557, 0x85bd, 0x85cc, 0x0005, + 0x00b6, 0x700c, 0x7108, 0x080c, 0x26a1, 0x1904, 0x85bb, 0x080c, + 0x6718, 0x1904, 0x85bb, 0xbe12, 0xbd16, 0x7110, 0xd1bc, 0x0540, + 0x702c, 0xd084, 0x1120, 0xb800, 0xd0bc, 0x1904, 0x85bb, 0x080c, + 0x6bcd, 0x0148, 0x9086, 0x0004, 0x0130, 0x080c, 0x6bd5, 0x0118, + 0x9086, 0x0004, 0x1588, 0x00c6, 0x080c, 0x85db, 0x00ce, 0x05d8, + 0x080c, 0xaef8, 0x2b08, 0x05b8, 0x6112, 0x080c, 0xd0ce, 0x6023, + 0x0002, 0x7120, 0x610a, 0x2009, 0x0088, 0x080c, 0xafec, 0x0458, + 0x080c, 0x6bcd, 0x0148, 0x9086, 0x0004, 0x0130, 0x080c, 0x6bd5, + 0x0118, 0x9086, 0x0004, 0x1180, 0x080c, 0xaef8, 0x2b08, 0x01d8, + 0x6112, 0x080c, 0xd0ce, 0x6023, 0x0005, 0x7120, 0x610a, 0x2009, + 0x0088, 0x080c, 0xafec, 0x0078, 0x080c, 0xaef8, 0x2b08, 0x0158, + 0x6112, 0x080c, 0xd0ce, 0x6023, 0x0004, 0x7120, 0x610a, 0x2009, + 0x0001, 0x080c, 0xafec, 0x00be, 0x0005, 0x7110, 0xd1bc, 0x0158, + 0x00d1, 0x0148, 0x080c, 0x8533, 0x1130, 0x7124, 0x610a, 0x2009, + 0x0089, 0x080c, 0xafec, 0x0005, 0x7110, 0xd1bc, 0x0158, 0x0059, + 0x0148, 0x080c, 0x8533, 0x1130, 0x7124, 0x610a, 0x2009, 0x008a, + 0x080c, 0xafec, 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, 0xafec, 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, 0xaef8, 0x05a8, 0x0066, 0x00c6, 0x0046, 0x2011, + 0x0263, 0x2204, 0x8211, 0x220c, 0x080c, 0x26a1, 0x1590, 0x080c, + 0x6718, 0x1578, 0xbe12, 0xbd16, 0x2b00, 0x004e, 0x00ce, 0x6012, + 0x080c, 0xd0ce, 0x080c, 0x104d, 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, + 0x9427, 0x00fe, 0x009e, 0x00ce, 0x0005, 0x080c, 0xaf4e, 0x006e, + 0x0cc0, 0x004e, 0x00ce, 0x0cc8, 0x00c6, 0x7000, 0x908c, 0xff00, + 0x9184, 0xf000, 0x810f, 0x9086, 0x2000, 0x1904, 0x86c3, 0x9186, + 0x0022, 0x15f0, 0x2001, 0x0111, 0x2004, 0x9005, 0x1904, 0x86c5, + 0x7030, 0x908e, 0x0400, 0x0904, 0x86c5, 0x908e, 0x6000, 0x05e8, + 0x908e, 0x5400, 0x05d0, 0x908e, 0x0300, 0x11d8, 0x2009, 0x1837, + 0x210c, 0xd18c, 0x1590, 0xd1a4, 0x1580, 0x080c, 0x6b8b, 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, 0x85db, 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, 0xbf40, 0x1178, 0xd48c, 0x0148, 0x20a9, + 0x0004, 0x2019, 0x1801, 0x2011, 0x027e, 0x080c, 0xbf40, 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, 0xbf40, 0x1178, 0xd48c, 0x0148, 0x20a9, + 0x0004, 0x2019, 0x1801, 0x2011, 0x0276, 0x080c, 0xbf40, 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, + 0x1a05, 0x7003, 0x0003, 0x700f, 0x0361, 0x9006, 0x701a, 0x707a, + 0x7012, 0x7017, 0x1ddc, 0x7007, 0x0000, 0x7026, 0x702b, 0xa0bb, + 0x7032, 0x7037, 0xa138, 0x7047, 0xffff, 0x704a, 0x704f, 0x56a4, + 0x7052, 0x7063, 0x88ff, 0x080c, 0x1066, 0x090c, 0x0d79, 0x2900, + 0x7042, 0xa867, 0x0003, 0xa86f, 0x0100, 0xa8ab, 0xdcb0, 0x0005, + 0x2071, 0x1a05, 0x1d04, 0x881b, 0x2091, 0x6000, 0x700c, 0x8001, + 0x700e, 0x1590, 0x2001, 0x013c, 0x2004, 0x9005, 0x190c, 0x89a9, + 0x2001, 0x1869, 0x2004, 0xd0c4, 0x0158, 0x3a00, 0xd08c, 0x1140, + 0x20d1, 0x0000, 0x20d1, 0x0001, 0x20d1, 0x0000, 0x080c, 0x0d79, + 0x700f, 0x0361, 0x7007, 0x0001, 0x0126, 0x2091, 0x8000, 0x2069, + 0x1800, 0x69ec, 0xd1e4, 0x1138, 0xd1dc, 0x1118, 0x080c, 0x896d, + 0x0010, 0x080c, 0x8944, 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, 0xa1e6, 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, 0x8843, 0x8844, 0x886e, + 0x00e6, 0x2071, 0x1a05, 0x7018, 0x9005, 0x1120, 0x711a, 0x721e, + 0x700b, 0x0009, 0x00ee, 0x0005, 0x00e6, 0x0006, 0x2071, 0x1a05, + 0x701c, 0x9206, 0x1120, 0x701a, 0x701e, 0x707a, 0x707e, 0x000e, + 0x00ee, 0x0005, 0x00e6, 0x2071, 0x1a05, 0xb888, 0x9102, 0x0208, + 0xb98a, 0x00ee, 0x0005, 0x0005, 0x00b6, 0x2031, 0x0010, 0x7110, + 0x080c, 0x6783, 0x11a8, 0xb888, 0x8001, 0x0290, 0xb88a, 0x1180, + 0x0126, 0x2091, 0x8000, 0x0066, 0xb8d0, 0x9005, 0x0138, 0x0026, + 0xba3c, 0x0016, 0x080c, 0x68ae, 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, 0xcf4f, 0x6018, 0x9005, 0x0904, + 0x88c6, 0x00f6, 0x2079, 0x0300, 0x7918, 0xd1b4, 0x1904, 0x88d9, + 0x781b, 0x2020, 0xa001, 0x7918, 0xd1b4, 0x0120, 0x781b, 0x2000, + 0x0804, 0x88d9, 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, 0xcc33, 0x01b0, 0x6014, 0x2048, + 0xa884, 0x908a, 0x199a, 0x0280, 0x9082, 0x1999, 0xa886, 0x908a, + 0x199a, 0x0210, 0x2001, 0x1999, 0x8003, 0x800b, 0x810b, 0x9108, + 0x611a, 0x080c, 0xd389, 0x0110, 0x080c, 0xc910, 0x012e, 0x9c88, + 0x001c, 0x7116, 0x2001, 0x181a, 0x2004, 0x9102, 0x1228, 0x8631, + 0x0138, 0x2160, 0x0804, 0x8872, 0x7017, 0x1ddc, 0x7007, 0x0000, + 0x0005, 0x00fe, 0x0c58, 0x00e6, 0x2071, 0x1a05, 0x7027, 0x07d0, + 0x7023, 0x0009, 0x00ee, 0x0005, 0x2001, 0x1a0e, 0x2003, 0x0000, + 0x0005, 0x00e6, 0x2071, 0x1a05, 0x7132, 0x702f, 0x0009, 0x00ee, + 0x0005, 0x2011, 0x1a11, 0x2013, 0x0000, 0x0005, 0x00e6, 0x2071, + 0x1a05, 0x711a, 0x721e, 0x700b, 0x0009, 0x00ee, 0x0005, 0x0086, + 0x0026, 0x705c, 0x8000, 0x705e, 0x2001, 0x1a15, 0x2044, 0xa06c, + 0x9086, 0x0000, 0x0150, 0x7070, 0xa09a, 0x706c, 0xa096, 0x7068, + 0xa092, 0x7064, 0xa08e, 0x080c, 0x1142, 0x002e, 0x008e, 0x0005, + 0x0006, 0x0016, 0x0096, 0x00a6, 0x00b6, 0x00c6, 0x00d6, 0x00e6, + 0x00f6, 0x0156, 0x080c, 0x8780, 0x015e, 0x00fe, 0x00ee, 0x00de, + 0x00ce, 0x00be, 0x00ae, 0x009e, 0x001e, 0x000e, 0x0005, 0x00e6, + 0x2071, 0x1a05, 0x717a, 0x727e, 0x7077, 0x0009, 0x00ee, 0x0005, + 0x00e6, 0x0006, 0x2071, 0x1a05, 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, 0x0f18, 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, 0x0f3a, 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, 0x0f3a, 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, 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, 0x8a87, 0xd0b4, 0x1168, 0xd0bc, 0x1904, + 0x8a60, 0x2009, 0x0006, 0x080c, 0x8ab4, 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, 0x1c8c, 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, 0x8aae, 0x908c, 0x2020, 0x918e, 0x2020, + 0x01a8, 0x6024, 0xd0d4, 0x11e8, 0x2009, 0x1869, 0x2104, 0xd084, + 0x1138, 0x87ff, 0x1120, 0x2009, 0x0043, 0x0804, 0xafec, 0x0005, + 0x87ff, 0x1de8, 0x2009, 0x0042, 0x0804, 0xafec, 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, + 0x8aae, 0x908c, 0x2020, 0x918e, 0x2020, 0x0170, 0x0076, 0x00f6, + 0x2c78, 0x080c, 0x17a1, 0x00fe, 0x007e, 0x87ff, 0x1120, 0x2009, + 0x0042, 0x080c, 0xafec, 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, + 0xafec, 0x0005, 0x00b9, 0x0ce8, 0x87ff, 0x1dd8, 0x2009, 0x0043, + 0x080c, 0xafec, 0x0cb0, 0x6110, 0x00b6, 0x2158, 0xb900, 0x00be, + 0xd1ac, 0x0d20, 0x6124, 0xc1cd, 0x6126, 0x0c00, 0x2009, 0x0004, + 0x0019, 0x0005, 0x2009, 0x0001, 0x0096, 0x080c, 0xcc33, 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, 0x6d4b, 0x6014, 0x904d, 0x0076, 0x2039, 0x0000, + 0x190c, 0x89cd, 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, 0x1925, + 0x7003, 0x0006, 0x7007, 0x0000, 0x700f, 0x0000, 0x7013, 0x0001, + 0x080c, 0x1066, 0x090c, 0x0d79, 0xa867, 0x0006, 0xa86b, 0x0001, + 0xa8ab, 0xdcb0, 0xa89f, 0x0000, 0x2900, 0x702e, 0x7033, 0x0000, + 0x0005, 0x0126, 0x2091, 0x8000, 0x0096, 0x00e6, 0x2071, 0x1925, + 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, 0x1b74, 0x2104, 0x9082, 0x0007, 0x200a, 0x000e, + 0xc095, 0x7012, 0x2008, 0x2001, 0x003b, 0x080c, 0x16ad, 0x9006, + 0x2071, 0x193e, 0x7002, 0x7006, 0x702a, 0x00ee, 0x009e, 0x012e, + 0x0005, 0x2009, 0x1b74, 0x2104, 0x9080, 0x0007, 0x200a, 0x0005, + 0x00e6, 0x0126, 0x0156, 0x2091, 0x8000, 0x2071, 0x1800, 0x7154, + 0x2001, 0x0008, 0x910a, 0x0638, 0x2001, 0x187d, 0x20ac, 0x9006, + 0x9080, 0x0008, 0x1f04, 0x8b70, 0x71c0, 0x9102, 0x02e0, 0x2071, + 0x1877, 0x20a9, 0x0007, 0x00c6, 0x080c, 0xaef8, 0x6023, 0x0009, + 0x6003, 0x0004, 0x601f, 0x0101, 0x0089, 0x0126, 0x2091, 0x8000, + 0x080c, 0x8cf1, 0x012e, 0x1f04, 0x8b7c, 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, 0x104d, 0x090c, 0x0d79, + 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, 0x104d, 0x090c, 0x0d79, 0xad66, 0x2b00, 0xa802, + 0x2900, 0xb806, 0x2058, 0x8109, 0x1da0, 0x002e, 0x004e, 0x005e, + 0x008e, 0x009e, 0x00be, 0x00ee, 0x0005, 0x2079, 0x0000, 0x2071, + 0x1925, 0x7004, 0x004b, 0x700c, 0x0002, 0x8be8, 0x8be1, 0x8be1, + 0x0005, 0x8bf2, 0x8c48, 0x8c48, 0x8c48, 0x8c49, 0x8c5a, 0x8c5a, + 0x700c, 0x0cba, 0x0126, 0x2091, 0x8000, 0x78a0, 0x79a0, 0x9106, + 0x1904, 0x8c3a, 0x7814, 0xd0bc, 0x1904, 0x8c43, 0x012e, 0x7018, + 0x910a, 0x1128, 0x7030, 0x9005, 0x1904, 0x8c8c, 0x0005, 0x1210, + 0x7114, 0x910a, 0x9192, 0x000a, 0x0210, 0x2009, 0x000a, 0x2001, + 0x1888, 0x2014, 0x2001, 0x1937, 0x2004, 0x9100, 0x9202, 0x0e50, + 0x080c, 0x8de9, 0x2200, 0x9102, 0x0208, 0x2208, 0x0096, 0x702c, + 0x2048, 0xa873, 0x0001, 0xa976, 0x080c, 0x8ef2, 0x2100, 0xa87e, + 0xa86f, 0x0000, 0x009e, 0x0126, 0x2091, 0x8000, 0x2009, 0x1a25, + 0x2104, 0xc085, 0x200a, 0x700f, 0x0002, 0x012e, 0x080c, 0x1161, + 0x1de8, 0x0005, 0x78a0, 0x79a0, 0x9106, 0x0904, 0x8bfa, 0x080c, + 0x8dc1, 0x012e, 0x0005, 0x7810, 0xc0c5, 0x7812, 0x0804, 0x8bfa, + 0x0005, 0x700c, 0x0002, 0x8c4e, 0x8c51, 0x8c50, 0x080c, 0x8bf0, + 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, 0x8ef2, 0x2100, 0xaa8c, 0x9210, 0xaa8e, + 0x1220, 0xa890, 0x9081, 0x0000, 0xa892, 0x000e, 0x009e, 0x0126, + 0x2091, 0x8000, 0x78a2, 0x701a, 0x080c, 0x8dc1, 0x012e, 0x0005, + 0x00e6, 0x2071, 0x1925, 0x700c, 0x0002, 0x8c8a, 0x8c8a, 0x8c88, + 0x700f, 0x0001, 0x00ee, 0x0005, 0x0126, 0x2091, 0x8000, 0x7030, + 0x9005, 0x0508, 0x2078, 0x7814, 0x2048, 0xae88, 0x00b6, 0x2059, + 0x0000, 0x080c, 0x8cfa, 0x00be, 0x01b0, 0x00e6, 0x2071, 0x193e, + 0x080c, 0x8d41, 0x00ee, 0x0178, 0x0096, 0x080c, 0x1066, 0x2900, + 0x009e, 0x0148, 0xa8aa, 0x04d1, 0x0041, 0x2001, 0x1948, 0x2003, + 0x0000, 0x012e, 0x08c8, 0x012e, 0x0005, 0x00d6, 0x00c6, 0x0086, + 0x00a6, 0x2940, 0x2650, 0x2600, 0x9005, 0x0180, 0xa864, 0x9084, + 0x000f, 0x2068, 0x9d88, 0x1ede, 0x2165, 0x0056, 0x2029, 0x0000, + 0x080c, 0x8e77, 0x080c, 0x1eb4, 0x1dd8, 0x005e, 0x00ae, 0x2001, + 0x187f, 0x2004, 0xa88a, 0x00c6, 0x2f60, 0x080c, 0x17a1, 0x00ce, + 0x781f, 0x0101, 0x7813, 0x0000, 0x0126, 0x2091, 0x8000, 0x080c, + 0x8d50, 0x012e, 0x008e, 0x00ce, 0x00de, 0x0005, 0x7030, 0x9005, + 0x0138, 0x2078, 0x780c, 0x7032, 0x2001, 0x1948, 0x2003, 0x0001, + 0x0005, 0x00e6, 0x2071, 0x1925, 0x7030, 0x600e, 0x2c00, 0x7032, + 0x00ee, 0x0005, 0x00d6, 0x00c6, 0x0026, 0x9b80, 0x8fc0, 0x2005, + 0x906d, 0x090c, 0x0d79, 0x9b80, 0x8fb8, 0x2005, 0x9065, 0x090c, + 0x0d79, 0x6114, 0x2600, 0x9102, 0x0248, 0x6828, 0x9102, 0x02f0, + 0x9085, 0x0001, 0x002e, 0x00ce, 0x00de, 0x0005, 0x6804, 0xd094, + 0x0148, 0x6854, 0xd084, 0x1178, 0xc085, 0x6856, 0x2011, 0x8026, + 0x080c, 0x4c28, 0x684c, 0x0096, 0x904d, 0x090c, 0x0d79, 0xa804, + 0x8000, 0xa806, 0x009e, 0x9006, 0x2030, 0x0c20, 0x6854, 0xd08c, + 0x1d08, 0xc08d, 0x6856, 0x2011, 0x8025, 0x080c, 0x4c28, 0x684c, + 0x0096, 0x904d, 0x090c, 0x0d79, 0xa800, 0x8000, 0xa802, 0x009e, + 0x0888, 0x7000, 0x2019, 0x0008, 0x8319, 0x7104, 0x9102, 0x1118, + 0x2300, 0x9005, 0x0020, 0x0210, 0x9302, 0x0008, 0x8002, 0x0005, + 0x00d6, 0x7814, 0x9005, 0x090c, 0x0d79, 0x781c, 0x9084, 0x0101, + 0x9086, 0x0101, 0x190c, 0x0d79, 0x7827, 0x0000, 0x2069, 0x193e, + 0x6804, 0x9080, 0x1940, 0x2f08, 0x2102, 0x6904, 0x8108, 0x9182, + 0x0008, 0x0208, 0x900e, 0x6906, 0x9180, 0x1940, 0x2003, 0x0000, + 0x00de, 0x0005, 0x0096, 0x00c6, 0x2060, 0x6014, 0x2048, 0xa8a8, + 0x0096, 0x2048, 0x9005, 0x190c, 0x107f, 0x009e, 0xa8ab, 0x0000, + 0x080c, 0x0fff, 0x080c, 0xaf4e, 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, 0x90f5, 0x00be, 0x6013, + 0x0000, 0x601b, 0x0000, 0x0010, 0x2c00, 0x0861, 0x0005, 0x2009, + 0x1929, 0x210c, 0xd194, 0x0005, 0x0126, 0x2091, 0x8000, 0x00e6, + 0x2071, 0x1925, 0x7110, 0xc194, 0xd19c, 0x1118, 0xc185, 0x7007, + 0x0000, 0x7112, 0x2001, 0x003b, 0x080c, 0x16ad, 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, 0x8f40, + 0x0170, 0x080c, 0x8f75, 0x0158, 0x2900, 0x7002, 0x700a, 0x701a, + 0x7013, 0x0001, 0x701f, 0x000a, 0x00de, 0x009e, 0x0005, 0x900e, + 0x0cd8, 0x00e6, 0x0096, 0x0086, 0x00d6, 0x00c6, 0x2071, 0x1932, + 0x721c, 0x2100, 0x9202, 0x1618, 0x080c, 0x8f75, 0x090c, 0x0d79, + 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, 0x1932, + 0x7300, 0x831f, 0x831e, 0x831e, 0x9384, 0x003f, 0x20e8, 0x939c, + 0xffc0, 0x9398, 0x0003, 0x7104, 0x080c, 0x8ef2, 0x810c, 0x2100, + 0x9318, 0x8003, 0x2228, 0x2021, 0x0078, 0x9402, 0x9532, 0x0208, + 0x2028, 0x2500, 0x8004, 0x20a8, 0x23a0, 0xa001, 0xa001, 0x4005, + 0x2508, 0x080c, 0x8efb, 0x2130, 0x7014, 0x9600, 0x7016, 0x2600, + 0x711c, 0x9102, 0x701e, 0x7004, 0x9600, 0x2008, 0x9082, 0x000a, + 0x1190, 0x7000, 0x2048, 0xa800, 0x9005, 0x1148, 0x2009, 0x0001, + 0x0026, 0x080c, 0x8de9, 0x002e, 0x7000, 0x2048, 0xa800, 0x7002, + 0x7007, 0x0000, 0x0008, 0x7106, 0x2500, 0x9212, 0x1904, 0x8e28, + 0x012e, 0x00ee, 0x014e, 0x013e, 0x015e, 0x009e, 0x0005, 0x0016, + 0x0026, 0x00e6, 0x0126, 0x2091, 0x8000, 0x9580, 0x8fb8, 0x2005, + 0x9075, 0x090c, 0x0d79, 0x080c, 0x8ecd, 0x012e, 0x9580, 0x8fb4, + 0x2005, 0x9075, 0x090c, 0x0d79, 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, 0x8eb7, + 0x8eb7, 0x8eb9, 0x8eb7, 0x8eb9, 0x8eb7, 0x8eb7, 0x8eb7, 0x8eb7, + 0x8eb7, 0x8ebf, 0x8eb7, 0x8ebf, 0x8eb7, 0x8eb7, 0x8eb7, 0x080c, + 0x0d79, 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, 0x8f84, 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, 0x8f3e, 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, 0x8fbc, + 0x2005, 0x9005, 0x090c, 0x0d79, 0x2004, 0x90a0, 0x000a, 0x080c, + 0x1066, 0x01d0, 0x2900, 0x7026, 0xa803, 0x0000, 0xa807, 0x0000, + 0x080c, 0x1066, 0x0188, 0x7024, 0xa802, 0xa807, 0x0000, 0x2900, + 0x7026, 0x94a2, 0x000a, 0x0110, 0x0208, 0x0c90, 0x9085, 0x0001, + 0x012e, 0x004e, 0x009e, 0x0005, 0x7024, 0x9005, 0x0dc8, 0x2048, + 0xac00, 0x080c, 0x107f, 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, 0x107f, + 0x000e, 0x0cb8, 0x009e, 0x0005, 0x0096, 0x7008, 0x9005, 0x0138, + 0x2048, 0xa800, 0x0006, 0x080c, 0x107f, 0x000e, 0x0cb8, 0x9006, + 0x7002, 0x700a, 0x7006, 0x700e, 0x701a, 0x701e, 0x7022, 0x702a, + 0x7026, 0x702e, 0x009e, 0x0005, 0x1a72, 0x0000, 0x0000, 0x0000, + 0x1932, 0x0000, 0x0000, 0x0000, 0x1888, 0x0000, 0x0000, 0x0000, + 0x1877, 0x0000, 0x0000, 0x0000, 0x00e6, 0x00c6, 0x00b6, 0x00a6, + 0xa8a8, 0x2040, 0x2071, 0x1877, 0x080c, 0x90e0, 0xa067, 0x0023, + 0x6010, 0x905d, 0x0904, 0x90b5, 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, 0x0d79, 0x2020, + 0x2050, 0x2940, 0xa864, 0x90bc, 0x00ff, 0x908c, 0x000f, 0x91e0, + 0x1ede, 0x2c65, 0x9786, 0x0024, 0x2c05, 0x1590, 0x908a, 0x0036, + 0x1a0c, 0x0d79, 0x9082, 0x001b, 0x0002, 0x9020, 0x9020, 0x9022, + 0x9020, 0x9020, 0x9020, 0x9024, 0x9020, 0x9020, 0x9020, 0x9026, + 0x9020, 0x9020, 0x9020, 0x9028, 0x9020, 0x9020, 0x9020, 0x902a, + 0x9020, 0x9020, 0x9020, 0x902c, 0x9020, 0x9020, 0x9020, 0x902e, + 0x080c, 0x0d79, 0xa180, 0x04b8, 0xa190, 0x04a8, 0xa1a0, 0x0498, + 0xa1b0, 0x0488, 0xa1c0, 0x0478, 0xa1d0, 0x0468, 0xa1e0, 0x0458, + 0x908a, 0x0034, 0x1a0c, 0x0d79, 0x9082, 0x001b, 0x0002, 0x9052, + 0x9050, 0x9050, 0x9050, 0x9050, 0x9050, 0x9054, 0x9050, 0x9050, + 0x9050, 0x9050, 0x9050, 0x9056, 0x9050, 0x9050, 0x9050, 0x9050, + 0x9050, 0x9058, 0x9050, 0x9050, 0x9050, 0x9050, 0x9050, 0x905a, + 0x080c, 0x0d79, 0xa180, 0x0038, 0xa198, 0x0028, 0xa1b0, 0x0018, + 0xa1c8, 0x0008, 0xa1e0, 0x2600, 0x0002, 0x9076, 0x9078, 0x907a, + 0x907c, 0x907e, 0x9080, 0x9082, 0x9084, 0x9086, 0x9088, 0x908a, + 0x908c, 0x908e, 0x9090, 0x9092, 0x9094, 0x9096, 0x9098, 0x909a, + 0x909c, 0x909e, 0x90a0, 0x90a2, 0x90a4, 0x90a6, 0x080c, 0x0d79, + 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, 0x1eb4, 0x090c, 0x0d79, 0x0804, 0x8ffa, + 0x00ae, 0x00be, 0x00ce, 0x00ee, 0x0005, 0xa86c, 0xa06e, 0xa870, + 0xa072, 0xa077, 0x00ff, 0x9006, 0x0804, 0x8fdc, 0x0006, 0x0016, + 0x00b6, 0x6010, 0x2058, 0xb810, 0x9005, 0x01b0, 0x2001, 0x1926, + 0x2004, 0x9005, 0x0188, 0x2001, 0x1800, 0x2004, 0x9086, 0x0003, + 0x1158, 0x0036, 0x0046, 0xbba0, 0x2021, 0x0004, 0x2011, 0x8014, + 0x080c, 0x4c28, 0x004e, 0x003e, 0x00be, 0x001e, 0x000e, 0x0005, + 0x9016, 0x710c, 0xa834, 0x910a, 0xa936, 0x7008, 0x9005, 0x0120, + 0x8210, 0x910a, 0x0238, 0x0130, 0x7010, 0x8210, 0x910a, 0x0210, + 0x0108, 0x0cd8, 0xaa8a, 0xa26a, 0x0005, 0x00f6, 0x00d6, 0x0036, + 0x2079, 0x0300, 0x781b, 0x0200, 0x7818, 0xd094, 0x1dd8, 0x781b, + 0x0202, 0xa001, 0xa001, 0x7818, 0xd094, 0x1da0, 0xb8ac, 0x9005, + 0x01b8, 0x2068, 0x2079, 0x0000, 0x2c08, 0x911e, 0x1118, 0x680c, + 0xb8ae, 0x0060, 0x9106, 0x0140, 0x2d00, 0x2078, 0x680c, 0x9005, + 0x090c, 0x0d79, 0x2068, 0x0cb0, 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, 0x9135, 0x701b, 0x0202, 0xa001, 0xa001, + 0x7018, 0xd094, 0x1d90, 0xb8ac, 0x9005, 0x01e8, 0x2060, 0x600c, + 0xb8ae, 0x6024, 0xc08d, 0x6026, 0x6003, 0x0004, 0x601b, 0x0000, + 0x6013, 0x0000, 0x601f, 0x0101, 0x6014, 0x2048, 0xa88b, 0x0000, + 0xa8a8, 0xa8ab, 0x0000, 0x904d, 0x090c, 0x0d79, 0x080c, 0x107f, + 0x080c, 0x8cf1, 0x0c00, 0x2071, 0x0300, 0x701b, 0x0200, 0x015e, + 0x012e, 0x003e, 0x00ce, 0x009e, 0x00de, 0x00ee, 0x0005, 0x00c6, + 0x00b6, 0x0016, 0x0006, 0x0156, 0x080c, 0x26a1, 0x015e, 0x11b0, + 0x080c, 0x6718, 0x190c, 0x0d79, 0x000e, 0x001e, 0xb912, 0xb816, + 0x080c, 0xaef8, 0x0140, 0x2b00, 0x6012, 0x6023, 0x0001, 0x2009, + 0x0001, 0x080c, 0xafec, 0x00be, 0x00ce, 0x0005, 0x000e, 0x001e, + 0x0cd0, 0x0066, 0x6000, 0x90b2, 0x0010, 0x1a0c, 0x0d79, 0x0013, + 0x006e, 0x0005, 0x91aa, 0x91aa, 0x91aa, 0x91ac, 0x91f5, 0x91aa, + 0x91aa, 0x91aa, 0x925c, 0x91aa, 0x9294, 0x91aa, 0x91aa, 0x91aa, + 0x91aa, 0x91aa, 0x080c, 0x0d79, 0x9182, 0x0040, 0x0002, 0x91bf, + 0x91bf, 0x91bf, 0x91bf, 0x91bf, 0x91bf, 0x91bf, 0x91bf, 0x91bf, + 0x91c1, 0x91d2, 0x91bf, 0x91bf, 0x91bf, 0x91bf, 0x91e3, 0x080c, + 0x0d79, 0x0096, 0x6114, 0x2148, 0xa87b, 0x0000, 0x6010, 0x00b6, + 0x2058, 0xb8bb, 0x0500, 0x00be, 0x080c, 0x6d10, 0x080c, 0xaf4e, + 0x009e, 0x0005, 0x080c, 0x9851, 0x00d6, 0x6114, 0x080c, 0xcc33, + 0x0130, 0x0096, 0x6114, 0x2148, 0x080c, 0x6f11, 0x009e, 0x00de, + 0x080c, 0xaf4e, 0x0005, 0x080c, 0x9851, 0x080c, 0x32fb, 0x6114, + 0x0096, 0x2148, 0x080c, 0xcc33, 0x0120, 0xa87b, 0x0029, 0x080c, + 0x6f11, 0x009e, 0x080c, 0xaf4e, 0x0005, 0x601b, 0x0000, 0x9182, + 0x0040, 0x0096, 0x0002, 0x9210, 0x9210, 0x9210, 0x9210, 0x9210, + 0x9210, 0x9210, 0x9210, 0x9212, 0x9210, 0x9210, 0x9210, 0x9258, + 0x9210, 0x9210, 0x9210, 0x9210, 0x9210, 0x9210, 0x9219, 0x9210, + 0x080c, 0x0d79, 0x6114, 0x2148, 0xa938, 0x918e, 0xffff, 0x0904, + 0x9258, 0x6024, 0xd08c, 0x15c0, 0x00e6, 0x6114, 0x2148, 0x080c, + 0x8fc4, 0x0096, 0xa8a8, 0x2048, 0x080c, 0x6ca8, 0x009e, 0xa8ab, + 0x0000, 0x6010, 0x9005, 0x0128, 0x00b6, 0x2058, 0x080c, 0x90f5, + 0x00be, 0xae88, 0x00b6, 0x2059, 0x0000, 0x080c, 0x8cfa, 0x00be, + 0x01e0, 0x2071, 0x193e, 0x080c, 0x8d41, 0x01b8, 0x9086, 0x0001, + 0x1128, 0x2001, 0x1948, 0x2004, 0x9005, 0x1178, 0x0096, 0x080c, + 0x104d, 0x2900, 0x009e, 0x0148, 0xa8aa, 0x00f6, 0x2c78, 0x080c, + 0x8cb5, 0x00fe, 0x00ee, 0x009e, 0x0005, 0x080c, 0x8cf1, 0x0cd0, + 0x080c, 0x9310, 0x009e, 0x0005, 0x9182, 0x0040, 0x0096, 0x0002, + 0x9270, 0x9270, 0x9270, 0x9272, 0x9270, 0x9270, 0x9270, 0x9292, + 0x9270, 0x9270, 0x9270, 0x9270, 0x9270, 0x9270, 0x9270, 0x9270, + 0x080c, 0x0d79, 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, 0x1c43, 0x2009, 0x8030, 0x080c, 0x9467, + 0x009e, 0x0005, 0x080c, 0x0d79, 0x080c, 0x9851, 0x6114, 0x2148, + 0xa87b, 0x0000, 0x6010, 0x00b6, 0x2058, 0xb8bb, 0x0500, 0x00be, + 0x080c, 0x6f11, 0x080c, 0xaf4e, 0x009e, 0x0005, 0x080c, 0xaaf7, + 0x6144, 0xd1fc, 0x0120, 0xd1ac, 0x1110, 0x6003, 0x0003, 0x6000, + 0x908a, 0x0010, 0x1a0c, 0x0d79, 0x0096, 0x0023, 0x009e, 0x080c, + 0xab13, 0x0005, 0x92ca, 0x92ca, 0x92ca, 0x92cc, 0x92dd, 0x92ca, + 0x92ca, 0x92ca, 0x92ca, 0x92ca, 0x92ca, 0x92ca, 0x92ca, 0x92ca, + 0x92ca, 0x92ca, 0x080c, 0x0d79, 0x080c, 0xaccf, 0x6114, 0x2148, + 0xa87b, 0x0006, 0x6010, 0x00b6, 0x2058, 0xb8bb, 0x0500, 0x00be, + 0x080c, 0x6f11, 0x080c, 0xaf4e, 0x0005, 0x0491, 0x0005, 0x080c, + 0xaaf7, 0x6000, 0x6144, 0xd1fc, 0x0130, 0xd1ac, 0x1120, 0x6003, + 0x0003, 0x2009, 0x0003, 0x908a, 0x0010, 0x1a0c, 0x0d79, 0x0096, + 0x0033, 0x009e, 0x0106, 0x080c, 0xab13, 0x010e, 0x0005, 0x9307, + 0x9307, 0x9307, 0x9309, 0x9310, 0x9307, 0x9307, 0x9307, 0x9307, + 0x9307, 0x9307, 0x9307, 0x9307, 0x9307, 0x9307, 0x9307, 0x080c, + 0x0d79, 0x0036, 0x00e6, 0x080c, 0xaccf, 0x00ee, 0x003e, 0x0005, + 0x6024, 0xd08c, 0x11f0, 0x00f6, 0x00e6, 0x601b, 0x0000, 0x6014, + 0x2048, 0x6010, 0x9005, 0x0128, 0x00b6, 0x2058, 0x080c, 0x90f5, + 0x00be, 0x2071, 0x193e, 0x080c, 0x8d41, 0x0160, 0x2001, 0x187f, + 0x2004, 0xa88a, 0x2031, 0x0000, 0x2c78, 0x080c, 0x8cb5, 0x00ee, + 0x00fe, 0x0005, 0x0096, 0xa88b, 0x0000, 0xa8a8, 0x2048, 0x080c, + 0x107f, 0x009e, 0xa8ab, 0x0000, 0x080c, 0x8cf1, 0x0c80, 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, 0x9358, 0x8086, 0x818e, + 0x004e, 0x003e, 0x012e, 0x0005, 0x0126, 0x2091, 0x8000, 0x0076, + 0x0156, 0x20a9, 0x0010, 0x9005, 0x01c8, 0x911a, 0x12b8, 0x8213, + 0x818d, 0x0228, 0x911a, 0x1220, 0x1f04, 0x936f, 0x0028, 0x911a, + 0x2308, 0x8210, 0x1f04, 0x936f, 0x0006, 0x3200, 0x9084, 0xefff, + 0x2080, 0x000e, 0x015e, 0x007e, 0x012e, 0x0005, 0x0006, 0x3200, + 0x9085, 0x1000, 0x0ca8, 0x0126, 0x2091, 0x2800, 0x2079, 0x19e9, + 0x012e, 0x00d6, 0x2069, 0x19e9, 0x6803, 0x0005, 0x0156, 0x0146, + 0x01d6, 0x20e9, 0x0000, 0x2069, 0x0200, 0x080c, 0xa8ec, 0x04c9, + 0x080c, 0xa8d7, 0x04b1, 0x080c, 0xa8da, 0x0499, 0x080c, 0xa8dd, + 0x0481, 0x080c, 0xa8e0, 0x0469, 0x080c, 0xa8e3, 0x0451, 0x080c, + 0xa8e6, 0x0439, 0x080c, 0xa8e9, 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, 0x1b5e, 0x2003, 0x0000, 0x00de, + 0x0005, 0x20a9, 0x0020, 0x20a1, 0x0240, 0x2001, 0x0000, 0x4004, + 0x0005, 0x00c6, 0x7803, 0x0000, 0x9006, 0x7827, 0x0030, 0x782b, + 0x0400, 0x7827, 0x0031, 0x782b, 0x1af7, 0x781f, 0xff00, 0x781b, + 0xff00, 0x2061, 0x1aec, 0x602f, 0x19e9, 0x6033, 0x1800, 0x6037, + 0x1a05, 0x603b, 0x1ede, 0x603f, 0x1eee, 0x6042, 0x6047, 0x1ac2, + 0x00ce, 0x0005, 0x2001, 0x0382, 0x2004, 0x9084, 0x0007, 0x9086, + 0x0001, 0x01b0, 0x00c6, 0x6146, 0x600f, 0x0000, 0x2c08, 0x2061, + 0x19e9, 0x602c, 0x8000, 0x602e, 0x601c, 0x9005, 0x0130, 0x9080, + 0x0003, 0x2102, 0x611e, 0x00ce, 0x0005, 0x6122, 0x611e, 0x0cd8, + 0x6146, 0x2c08, 0x2001, 0x0012, 0x080c, 0xaae8, 0x0005, 0x0016, + 0x2009, 0x8020, 0x6146, 0x2c08, 0x2001, 0x0382, 0x2004, 0x9084, + 0x0007, 0x9086, 0x0001, 0x1128, 0x2001, 0x0019, 0x080c, 0xaae8, + 0x0088, 0x00c6, 0x2061, 0x19e9, 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, 0x19e9, 0x6044, 0x9005, 0x0130, 0x9080, 0x0003, + 0x2102, 0x6146, 0x00ce, 0x0005, 0x614a, 0x6146, 0x0cd8, 0x6146, + 0x600f, 0x0000, 0x2c08, 0x2001, 0x0013, 0x080c, 0xaae8, 0x0005, + 0x6044, 0xd0dc, 0x0110, 0x080c, 0xa585, 0x0005, 0x00f6, 0x00e6, + 0x00d6, 0x00c6, 0x00b6, 0x0096, 0x0076, 0x0066, 0x0056, 0x0036, + 0x0026, 0x0016, 0x0006, 0x0126, 0x902e, 0x2071, 0x19e9, 0x7648, + 0x2660, 0x2678, 0x2091, 0x8000, 0x8cff, 0x0904, 0x94fa, 0x9c86, + 0x1b56, 0x0904, 0x94f5, 0x6010, 0x2058, 0xb8a0, 0x9206, 0x1904, + 0x94f5, 0x87ff, 0x0120, 0x605c, 0x9106, 0x1904, 0x94f5, 0x704c, + 0x9c06, 0x1188, 0x0036, 0x2019, 0x0001, 0x080c, 0xa391, 0x703f, + 0x0000, 0x9006, 0x704e, 0x706a, 0x7052, 0x706e, 0x080c, 0xade0, + 0x003e, 0x2029, 0x0001, 0x080c, 0x9470, 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, + 0xcc33, 0x01f0, 0x6014, 0x2048, 0x6020, 0x9086, 0x0003, 0x1588, + 0x6004, 0x9086, 0x0040, 0x090c, 0xa585, 0xa867, 0x0103, 0xab7a, + 0xa877, 0x0000, 0x0016, 0x0036, 0x0076, 0x080c, 0xcf38, 0x080c, + 0xeaee, 0x080c, 0x6f11, 0x007e, 0x003e, 0x001e, 0x080c, 0xce24, + 0x080c, 0xaf89, 0x00ce, 0x0804, 0x948c, 0x2c78, 0x600c, 0x2060, + 0x0804, 0x948c, 0x012e, 0x000e, 0x001e, 0x002e, 0x003e, 0x005e, + 0x006e, 0x007e, 0x009e, 0x00be, 0x00ce, 0x00de, 0x00ee, 0x00fe, + 0x0005, 0x6020, 0x9086, 0x0006, 0x1158, 0x0016, 0x0036, 0x0076, + 0x080c, 0xeaee, 0x080c, 0xe738, 0x007e, 0x003e, 0x001e, 0x08c0, + 0x6020, 0x9086, 0x0009, 0x1168, 0xa87b, 0x0006, 0x0016, 0x0036, + 0x0076, 0x080c, 0x6f11, 0x080c, 0xaf4e, 0x007e, 0x003e, 0x001e, + 0x0848, 0x6020, 0x9086, 0x000a, 0x0904, 0x94df, 0x0804, 0x94d8, + 0x0006, 0x0066, 0x0096, 0x00c6, 0x00d6, 0x00f6, 0x9036, 0x0126, + 0x2091, 0x8000, 0x2079, 0x19e9, 0x7848, 0x9065, 0x0904, 0x9599, + 0x600c, 0x0006, 0x600f, 0x0000, 0x784c, 0x9c06, 0x11b0, 0x0036, + 0x2019, 0x0001, 0x080c, 0xa391, 0x783f, 0x0000, 0x901e, 0x7b4e, + 0x7b6a, 0x7b52, 0x7b6e, 0x080c, 0xade0, 0x003e, 0x000e, 0x9005, + 0x1118, 0x600c, 0x600f, 0x0000, 0x0006, 0x9c86, 0x1b56, 0x05b0, + 0x00e6, 0x2f70, 0x080c, 0x9470, 0x00ee, 0x080c, 0xcc33, 0x0548, + 0x6014, 0x2048, 0x6020, 0x9086, 0x0003, 0x15a8, 0x3e08, 0x918e, + 0x0002, 0x1188, 0x6010, 0x9005, 0x0170, 0x00b6, 0x2058, 0xb800, + 0x00be, 0xd0bc, 0x0140, 0x6048, 0x9005, 0x11c0, 0x2001, 0x1989, + 0x2004, 0x604a, 0x0098, 0x6004, 0x9086, 0x0040, 0x090c, 0xa585, + 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x080c, 0x6f05, 0x080c, + 0xce24, 0x6044, 0xc0fc, 0x6046, 0x080c, 0xaf89, 0x000e, 0x0804, + 0x953d, 0x7e4a, 0x7e46, 0x012e, 0x00fe, 0x00de, 0x00ce, 0x009e, + 0x006e, 0x000e, 0x0005, 0x6020, 0x9086, 0x0006, 0x1118, 0x080c, + 0xe738, 0x0c38, 0x6020, 0x9086, 0x0009, 0x1130, 0xab7a, 0x080c, + 0x6f11, 0x080c, 0xaf4e, 0x0c10, 0x6020, 0x9086, 0x000a, 0x0990, + 0x0850, 0x0016, 0x0026, 0x0086, 0x9046, 0x00a9, 0x080c, 0x96ac, + 0x008e, 0x002e, 0x001e, 0x0005, 0x00f6, 0x0126, 0x2079, 0x19e9, + 0x2091, 0x8000, 0x080c, 0x96f5, 0x080c, 0x978b, 0x080c, 0x690e, + 0x012e, 0x00fe, 0x0005, 0x00b6, 0x0096, 0x00f6, 0x00e6, 0x00d6, + 0x00c6, 0x0066, 0x0016, 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, + 0x19e9, 0x7620, 0x2660, 0x2678, 0x8cff, 0x0904, 0x9671, 0x6010, + 0x2058, 0xb8a0, 0x9206, 0x1904, 0x966c, 0x88ff, 0x0120, 0x605c, + 0x9106, 0x1904, 0x966c, 0x7030, 0x9c06, 0x1580, 0x2069, 0x0100, + 0x6820, 0xd0a4, 0x0110, 0xd0cc, 0x1508, 0x080c, 0x88e4, 0x080c, + 0xa09b, 0x68c3, 0x0000, 0x080c, 0xa585, 0x7033, 0x0000, 0x0036, + 0x2069, 0x0140, 0x6b04, 0x9384, 0x1000, 0x0138, 0x2001, 0x0100, + 0x080c, 0x2aa2, 0x9006, 0x080c, 0x2aa2, 0x2069, 0x0100, 0x6824, + 0xd084, 0x0110, 0x6827, 0x0001, 0x003e, 0x0040, 0x7008, 0xc0ad, + 0x700a, 0x6003, 0x0009, 0x630a, 0x0804, 0x966c, 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, 0xcc33, 0x01e8, + 0x6020, 0x9086, 0x0003, 0x1580, 0x080c, 0xce4a, 0x1118, 0x080c, + 0xb93c, 0x0098, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x0016, + 0x0036, 0x0086, 0x080c, 0xcf38, 0x080c, 0xeaee, 0x080c, 0x6f11, + 0x008e, 0x003e, 0x001e, 0x080c, 0xce24, 0x080c, 0xaf89, 0x080c, + 0xa458, 0x00ce, 0x0804, 0x95e4, 0x2c78, 0x600c, 0x2060, 0x0804, + 0x95e4, 0x012e, 0x000e, 0x001e, 0x006e, 0x00ce, 0x00de, 0x00ee, + 0x00fe, 0x009e, 0x00be, 0x0005, 0x6020, 0x9086, 0x0006, 0x1158, + 0x0016, 0x0036, 0x0086, 0x080c, 0xeaee, 0x080c, 0xe738, 0x008e, + 0x003e, 0x001e, 0x08d0, 0x080c, 0xb93c, 0x6020, 0x9086, 0x0002, + 0x1160, 0x6004, 0x0006, 0x9086, 0x0085, 0x000e, 0x0904, 0x9652, + 0x9086, 0x008b, 0x0904, 0x9652, 0x0840, 0x6020, 0x9086, 0x0005, + 0x1920, 0x6004, 0x0006, 0x9086, 0x0085, 0x000e, 0x09c8, 0x9086, + 0x008b, 0x09b0, 0x0804, 0x9665, 0x0006, 0x00f6, 0x00e6, 0x0096, + 0x00b6, 0x00c6, 0x0066, 0x0016, 0x0126, 0x2091, 0x8000, 0x9280, + 0x1000, 0x2004, 0x905d, 0x2079, 0x19e9, 0x9036, 0x7828, 0x2060, + 0x8cff, 0x0538, 0x6010, 0x9b06, 0x1500, 0x6043, 0xffff, 0x080c, + 0xad1a, 0x01d8, 0x610c, 0x0016, 0x080c, 0xa21b, 0x6014, 0x2048, + 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x0016, 0x0036, 0x0086, + 0x080c, 0xcf38, 0x080c, 0xeaee, 0x080c, 0x6f11, 0x008e, 0x003e, + 0x001e, 0x080c, 0xaf89, 0x00ce, 0x08d8, 0x2c30, 0x600c, 0x2060, + 0x08b8, 0x080c, 0x692b, 0x012e, 0x001e, 0x006e, 0x00ce, 0x00be, + 0x009e, 0x00ee, 0x00fe, 0x000e, 0x0005, 0x0096, 0x0006, 0x0066, + 0x00c6, 0x00d6, 0x9036, 0x7820, 0x9065, 0x0904, 0x975e, 0x600c, + 0x0006, 0x6044, 0xc0fc, 0x6046, 0x600f, 0x0000, 0x7830, 0x9c06, + 0x1598, 0x2069, 0x0100, 0x6820, 0xd0a4, 0x0110, 0xd0cc, 0x1508, + 0x080c, 0x88e4, 0x080c, 0xa09b, 0x68c3, 0x0000, 0x080c, 0xa585, + 0x7833, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, 0x9384, 0x1000, + 0x0138, 0x2001, 0x0100, 0x080c, 0x2aa2, 0x9006, 0x080c, 0x2aa2, + 0x2069, 0x0100, 0x6824, 0xd084, 0x0110, 0x6827, 0x0001, 0x003e, + 0x0058, 0x080c, 0x6b65, 0x1538, 0x6003, 0x0009, 0x630a, 0x7808, + 0xc0ad, 0x780a, 0x2c30, 0x00f8, 0x6014, 0x2048, 0x080c, 0xcc31, + 0x01b0, 0x6020, 0x9086, 0x0003, 0x1508, 0x080c, 0xce4a, 0x1118, + 0x080c, 0xb93c, 0x0060, 0x080c, 0x6b65, 0x1168, 0xa867, 0x0103, + 0xab7a, 0xa877, 0x0000, 0x080c, 0x6f11, 0x080c, 0xce24, 0x080c, + 0xaf89, 0x080c, 0xa458, 0x000e, 0x0804, 0x96fc, 0x7e22, 0x7e1e, + 0x00de, 0x00ce, 0x006e, 0x000e, 0x009e, 0x0005, 0x6020, 0x9086, + 0x0006, 0x1118, 0x080c, 0xe738, 0x0c50, 0x080c, 0xb93c, 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, 0xad1a, 0x0180, 0x610c, 0x080c, 0xa21b, 0x6014, + 0x2048, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x080c, 0x6f11, + 0x080c, 0xaf89, 0x000e, 0x08f0, 0x2c30, 0x0ce0, 0x006e, 0x00ce, + 0x00be, 0x009e, 0x000e, 0x0005, 0x00e6, 0x00d6, 0x0096, 0x0066, + 0x080c, 0x628a, 0x11b0, 0x2071, 0x19e9, 0x7030, 0x9080, 0x0005, + 0x2004, 0x904d, 0x0170, 0xa878, 0x9606, 0x1158, 0x2071, 0x19e9, + 0x7030, 0x9035, 0x0130, 0x9080, 0x0005, 0x2004, 0x9906, 0x1108, + 0x0029, 0x006e, 0x009e, 0x00de, 0x00ee, 0x0005, 0x00c6, 0x2660, + 0x6043, 0xffff, 0x080c, 0xad1a, 0x0178, 0x080c, 0xa21b, 0x6014, + 0x2048, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x080c, 0xcf38, + 0x080c, 0x6f11, 0x080c, 0xaf89, 0x00ce, 0x0005, 0x00b6, 0x00e6, + 0x00c6, 0x080c, 0xaaf7, 0x0106, 0x2071, 0x0101, 0x2e04, 0xc0c4, + 0x2072, 0x6044, 0xd0fc, 0x1138, 0x010e, 0x090c, 0xab13, 0x00ce, + 0x00ee, 0x00be, 0x0005, 0x2071, 0x19e9, 0x7030, 0x9005, 0x0da0, + 0x9c06, 0x190c, 0x0d79, 0x7036, 0x080c, 0x88e4, 0x7004, 0x9084, + 0x0007, 0x0002, 0x9824, 0x9826, 0x982d, 0x9837, 0x9845, 0x9824, + 0x9832, 0x9822, 0x080c, 0x0d79, 0x0428, 0x0005, 0x080c, 0xad05, + 0x7007, 0x0000, 0x7033, 0x0000, 0x00e8, 0x0066, 0x9036, 0x080c, + 0xa21b, 0x006e, 0x7007, 0x0000, 0x7033, 0x0000, 0x0098, 0x080c, + 0xacf0, 0x0140, 0x080c, 0xad05, 0x0128, 0x0066, 0x9036, 0x080c, + 0xa21b, 0x006e, 0x7033, 0x0000, 0x0028, 0x080c, 0xacf0, 0x080c, + 0xa585, 0x0000, 0x010e, 0x090c, 0xab13, 0x00ce, 0x00ee, 0x00be, + 0x0005, 0x00d6, 0x00c6, 0x080c, 0xaaf7, 0x0106, 0x6044, 0xd0fc, + 0x1130, 0x010e, 0x090c, 0xab13, 0x00ce, 0x00de, 0x0005, 0x2069, + 0x19e9, 0x684c, 0x9005, 0x0da8, 0x9c06, 0x190c, 0x0d79, 0x6852, + 0x00e6, 0x2d70, 0x080c, 0x9470, 0x00ee, 0x080c, 0x88f1, 0x0016, + 0x2009, 0x0040, 0x080c, 0x223d, 0x001e, 0x683c, 0x9084, 0x0003, + 0x0002, 0x987f, 0x9880, 0x989f, 0x987d, 0x080c, 0x0d79, 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, 0xade0, 0x684f, 0x0000, 0x010e, 0x090c, + 0xab13, 0x00ce, 0x00de, 0x0005, 0x0005, 0x6020, 0x9084, 0x000f, + 0x000b, 0x0005, 0x98d2, 0x98d5, 0x9d7b, 0x9e14, 0x98d5, 0x9d7b, + 0x9e14, 0x98d2, 0x98d5, 0x98d2, 0x98d2, 0x98d2, 0x98d2, 0x98d2, + 0x98d2, 0x98d2, 0x080c, 0x97f6, 0x0005, 0x00b6, 0x0156, 0x0136, + 0x0146, 0x01c6, 0x01d6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x2069, + 0x0200, 0x2071, 0x0240, 0x6004, 0x908a, 0x0053, 0x1a0c, 0x0d79, + 0x6110, 0x2158, 0xb984, 0x2c78, 0x2061, 0x0100, 0x619a, 0x908a, + 0x0040, 0x1a04, 0x9941, 0x005b, 0x00fe, 0x00ee, 0x00de, 0x00ce, + 0x01de, 0x01ce, 0x014e, 0x013e, 0x015e, 0x00be, 0x0005, 0x9aea, + 0x9b25, 0x9b4e, 0x9c0a, 0x9c2c, 0x9c32, 0x9c3f, 0x9c47, 0x9c53, + 0x9c59, 0x9c6a, 0x9c59, 0x9cc2, 0x9c47, 0x9cce, 0x9cd4, 0x9c53, + 0x9cd4, 0x9ce0, 0x993f, 0x993f, 0x993f, 0x993f, 0x993f, 0x993f, + 0x993f, 0x993f, 0x993f, 0x993f, 0x993f, 0xa23c, 0xa25f, 0xa270, + 0xa290, 0xa2c2, 0x9c3f, 0x993f, 0x9c3f, 0x9c59, 0x993f, 0x9b4e, + 0x9c0a, 0x993f, 0xa683, 0x9c59, 0x993f, 0xa69f, 0x9c59, 0x993f, + 0x9c53, 0x9ae4, 0x9962, 0x993f, 0xa6bb, 0xa728, 0xa80c, 0x993f, + 0xa819, 0x9c3c, 0xa844, 0x993f, 0xa2cc, 0xa850, 0x993f, 0x080c, + 0x0d79, 0x2100, 0x005b, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x01de, + 0x01ce, 0x014e, 0x013e, 0x015e, 0x00be, 0x0005, 0xa8f0, 0xa9a2, + 0x9960, 0x999a, 0x9a46, 0x9a51, 0x9960, 0x9c3f, 0x9960, 0x9aab, + 0x9ab7, 0x99b5, 0x9960, 0x99d0, 0x9a04, 0xadf4, 0xae39, 0x9c59, + 0x080c, 0x0d79, 0x00d6, 0x0096, 0x080c, 0x9cf3, 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, 0xa06b, 0x003e, + 0x002e, 0x009e, 0x00de, 0x0005, 0x7810, 0x00b6, 0x2058, 0xb8a0, + 0x00be, 0x080c, 0xae80, 0x1118, 0x9084, 0xff80, 0x0110, 0x9085, + 0x0001, 0x0005, 0x00d6, 0x0096, 0x080c, 0x9cf3, 0x7003, 0x0500, + 0x7814, 0x2048, 0xa874, 0x700a, 0xa878, 0x700e, 0xa87c, 0x7012, + 0xa880, 0x7016, 0xa884, 0x701a, 0xa888, 0x701e, 0x60c3, 0x0010, + 0x080c, 0xa06b, 0x009e, 0x00de, 0x0005, 0x00d6, 0x0096, 0x080c, + 0x9cf3, 0x7003, 0x0500, 0x7814, 0x2048, 0xa8cc, 0x700a, 0xa8d0, + 0x700e, 0xa8d4, 0x7012, 0xa8d8, 0x7016, 0xa8dc, 0x701a, 0xa8e0, + 0x701e, 0x60c3, 0x0010, 0x080c, 0xa06b, 0x009e, 0x00de, 0x0005, + 0x00d6, 0x0096, 0x0126, 0x2091, 0x8000, 0x080c, 0x9cf3, 0x20e9, + 0x0000, 0x2001, 0x19a5, 0x2003, 0x0000, 0x7814, 0x2048, 0xa814, + 0x8003, 0x60c2, 0xa830, 0x20a8, 0xa860, 0x20e0, 0xa85c, 0x9080, + 0x001b, 0x2098, 0x2001, 0x19a5, 0x0016, 0x200c, 0x2001, 0x0001, + 0x080c, 0x2222, 0x080c, 0xda05, 0x9006, 0x080c, 0x2222, 0x001e, + 0xa804, 0x9005, 0x0110, 0x2048, 0x0c28, 0x04d9, 0x080c, 0xa06b, + 0x012e, 0x009e, 0x00de, 0x0005, 0x00d6, 0x0096, 0x0126, 0x2091, + 0x8000, 0x080c, 0x9d3e, 0x20e9, 0x0000, 0x2001, 0x19a5, 0x2003, + 0x0000, 0x7814, 0x2048, 0xa86f, 0x0200, 0xa873, 0x0000, 0xa814, + 0x8003, 0x60c2, 0xa830, 0x20a8, 0xa860, 0x20e0, 0xa85c, 0x9080, + 0x001b, 0x2098, 0x2001, 0x19a5, 0x0016, 0x200c, 0x080c, 0xda05, + 0x001e, 0xa804, 0x9005, 0x0110, 0x2048, 0x0c60, 0x0051, 0x7814, + 0x2048, 0x080c, 0x0fff, 0x080c, 0xa06b, 0x012e, 0x009e, 0x00de, + 0x0005, 0x60c0, 0x8004, 0x9084, 0x0003, 0x9005, 0x0130, 0x9082, + 0x0004, 0x20a3, 0x0000, 0x8000, 0x1de0, 0x0005, 0x080c, 0x9cf3, + 0x7003, 0x7800, 0x7808, 0x8007, 0x700a, 0x60c3, 0x0008, 0x0804, + 0xa06b, 0x00d6, 0x00e6, 0x080c, 0x9d3e, 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, 0x9a71, 0x2069, 0x1801, + 0x20a9, 0x0004, 0x2d76, 0x8d68, 0x8e70, 0x1f04, 0x9a7a, 0x9096, + 0xdf00, 0x0130, 0x9096, 0xe000, 0x0118, 0x60c3, 0x0018, 0x00f0, + 0x2069, 0x19b5, 0x9086, 0xdf00, 0x0110, 0x2069, 0x19cf, 0x20a9, + 0x001a, 0x9e86, 0x0260, 0x1148, 0x00c6, 0x2061, 0x0200, 0x6010, + 0x8000, 0x6012, 0x00ce, 0x2071, 0x0240, 0x2d04, 0x8007, 0x2072, + 0x8d68, 0x8e70, 0x1f04, 0x9a91, 0x60c3, 0x004c, 0x080c, 0xa06b, + 0x00ee, 0x00de, 0x0005, 0x080c, 0x9cf3, 0x7003, 0x6300, 0x7007, + 0x0028, 0x7808, 0x700e, 0x60c3, 0x0008, 0x0804, 0xa06b, 0x00d6, + 0x0026, 0x0016, 0x080c, 0x9d3e, 0x7003, 0x0200, 0x7814, 0x700e, + 0x00e6, 0x9ef0, 0x0004, 0x2009, 0x0001, 0x2011, 0x000c, 0x2069, + 0x1925, 0x6810, 0xd084, 0x1148, 0x2073, 0x0500, 0x8e70, 0x2073, + 0x0000, 0x8e70, 0x8108, 0x9290, 0x0004, 0x2073, 0x0800, 0x8e70, + 0x2073, 0x0000, 0x00ee, 0x7206, 0x710a, 0x62c2, 0x080c, 0xa06b, + 0x001e, 0x002e, 0x00de, 0x0005, 0x2001, 0x1818, 0x2004, 0x609a, + 0x0804, 0xa06b, 0x080c, 0x9cf3, 0x7003, 0x5200, 0x2069, 0x1847, + 0x6804, 0xd084, 0x0130, 0x6828, 0x0016, 0x080c, 0x26d4, 0x710e, + 0x001e, 0x20a9, 0x0004, 0x20e1, 0x0001, 0x2099, 0x1805, 0x20e9, + 0x0000, 0x20a1, 0x0250, 0x4003, 0x20a9, 0x0004, 0x2099, 0x1801, + 0x20a1, 0x0254, 0x4003, 0x080c, 0xae80, 0x1120, 0xb8a0, 0x9082, + 0x007f, 0x0248, 0x2001, 0x181f, 0x2004, 0x7032, 0x2001, 0x1820, + 0x2004, 0x7036, 0x0030, 0x2001, 0x1818, 0x2004, 0x9084, 0x00ff, + 0x7036, 0x60c3, 0x001c, 0x0804, 0xa06b, 0x080c, 0x9cf3, 0x7003, + 0x0500, 0x080c, 0xae80, 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, 0xa06b, 0x080c, 0x9cf3, + 0x9006, 0x080c, 0x6b97, 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, 0x9bd1, 0x00d6, 0x2069, 0x196d, + 0x2001, 0x1837, 0x2004, 0xd0a4, 0x0188, 0x6800, 0x700a, 0x6808, + 0x9084, 0x2000, 0x7012, 0x080c, 0xae97, 0x680c, 0x7016, 0x701f, + 0x2710, 0x6818, 0x7022, 0x681c, 0x7026, 0x00f0, 0x6800, 0x700a, + 0x6804, 0x700e, 0x00f6, 0x2079, 0x0100, 0x080c, 0x769d, 0x1128, + 0x78e3, 0x0000, 0x080c, 0x2715, 0x78e2, 0x00fe, 0x6808, 0x080c, + 0x769d, 0x1118, 0x9084, 0x37ff, 0x0010, 0x9084, 0x3fff, 0x7012, + 0x080c, 0xae97, 0x680c, 0x7016, 0x00de, 0x20a9, 0x0004, 0x20e1, + 0x0001, 0x2099, 0x1805, 0x20e9, 0x0000, 0x20a1, 0x0256, 0x4003, + 0x20a9, 0x0004, 0x2099, 0x1801, 0x20a1, 0x025a, 0x4003, 0x00d6, + 0x080c, 0xa8d7, 0x2069, 0x1975, 0x2071, 0x024e, 0x6800, 0xc0dd, + 0x7002, 0x080c, 0x5824, 0xd0e4, 0x0110, 0x680c, 0x700e, 0x00de, + 0x04a8, 0x2001, 0x1837, 0x2004, 0xd0a4, 0x0170, 0x0016, 0x2001, + 0x196e, 0x200c, 0x60e0, 0x9106, 0x0130, 0x2100, 0x60e3, 0x0000, + 0x080c, 0x2715, 0x61e2, 0x001e, 0x20e1, 0x0001, 0x2099, 0x196d, + 0x20e9, 0x0000, 0x20a1, 0x024e, 0x20a9, 0x0008, 0x4003, 0x20a9, + 0x0004, 0x2099, 0x1805, 0x20a1, 0x0256, 0x4003, 0x20a9, 0x0004, + 0x2099, 0x1801, 0x20a1, 0x025a, 0x4003, 0x080c, 0xa8d7, 0x20a1, + 0x024e, 0x20a9, 0x0008, 0x2099, 0x1975, 0x4003, 0x60c3, 0x0074, + 0x0804, 0xa06b, 0x080c, 0x9cf3, 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, 0x9ca3, 0x7026, + 0x60c3, 0x0014, 0x0804, 0xa06b, 0x080c, 0x9cf3, 0x7003, 0x5000, + 0x0804, 0x9b70, 0x080c, 0x9cf3, 0x7003, 0x2110, 0x7007, 0x0014, + 0x60c3, 0x0014, 0x0804, 0xa06b, 0x080c, 0x9d35, 0x0010, 0x080c, + 0x9d3e, 0x7003, 0x0200, 0x60c3, 0x0004, 0x0804, 0xa06b, 0x080c, + 0x9d3e, 0x7003, 0x0100, 0x700b, 0x0003, 0x700f, 0x2a00, 0x60c3, + 0x0008, 0x0804, 0xa06b, 0x080c, 0x9d3e, 0x7003, 0x0200, 0x0804, + 0x9b70, 0x080c, 0x9d3e, 0x7003, 0x0100, 0x782c, 0x9005, 0x0110, + 0x700a, 0x0010, 0x700b, 0x0003, 0x7814, 0x700e, 0x60c3, 0x0008, + 0x0804, 0xa06b, 0x00d6, 0x080c, 0x9d3e, 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, 0xa06b, 0x080c, 0x9d3e, 0x7003, 0x0210, 0x7007, 0x0014, + 0x700f, 0x0100, 0x60c3, 0x0014, 0x0804, 0xa06b, 0x080c, 0x9d3e, + 0x7003, 0x0200, 0x0804, 0x9aee, 0x080c, 0x9d3e, 0x7003, 0x0100, + 0x700b, 0x0003, 0x700f, 0x2a00, 0x60c3, 0x0008, 0x0804, 0xa06b, + 0x080c, 0x9d3e, 0x7003, 0x0100, 0x700b, 0x000b, 0x60c3, 0x0008, + 0x0804, 0xa06b, 0x0026, 0x00d6, 0x0036, 0x0046, 0x2019, 0x3200, + 0x2021, 0x0800, 0x0040, 0x0026, 0x00d6, 0x0036, 0x0046, 0x2019, + 0x2200, 0x2021, 0x0100, 0x080c, 0xa8ec, 0xb810, 0x9305, 0x7002, + 0xb814, 0x7006, 0x2069, 0x1800, 0x687c, 0x700a, 0x6880, 0x700e, + 0x9485, 0x0029, 0x7012, 0x004e, 0x003e, 0x00de, 0x080c, 0xa05f, + 0x721a, 0x9f95, 0x0000, 0x7222, 0x7027, 0xffff, 0x2071, 0x024c, + 0x002e, 0x0005, 0x0026, 0x080c, 0xa8ec, 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, 0xa8ec, + 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, 0xa05f, 0x721a, + 0x7a08, 0x7222, 0x2f10, 0x7226, 0x2071, 0x024c, 0x002e, 0x0005, + 0x080c, 0xa05f, 0x721a, 0x7a08, 0x7222, 0x7814, 0x7026, 0x2071, + 0x024c, 0x002e, 0x0005, 0x00b6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, + 0x2069, 0x0200, 0x2071, 0x0240, 0x6004, 0x908a, 0x0085, 0x0a0c, + 0x0d79, 0x908a, 0x0092, 0x1a0c, 0x0d79, 0x6110, 0x2158, 0xb984, + 0x2c78, 0x2061, 0x0100, 0x619a, 0x9082, 0x0085, 0x0033, 0x00fe, + 0x00ee, 0x00de, 0x00ce, 0x00be, 0x0005, 0x9dac, 0x9dbb, 0x9dc6, + 0x9daa, 0x9daa, 0x9daa, 0x9dac, 0x9daa, 0x9daa, 0x9daa, 0x9daa, + 0x9daa, 0x9daa, 0x080c, 0x0d79, 0x0411, 0x60c3, 0x0000, 0x0026, + 0x080c, 0x2a11, 0x0228, 0x2011, 0x0101, 0x2204, 0xc0c5, 0x2012, + 0x002e, 0x0804, 0xa06b, 0x0431, 0x7808, 0x700a, 0x7814, 0x700e, + 0x7017, 0xffff, 0x60c3, 0x000c, 0x0804, 0xa06b, 0x04a1, 0x7003, + 0x0003, 0x7007, 0x0300, 0x60c3, 0x0004, 0x0804, 0xa06b, 0x0026, + 0x080c, 0xa8ec, 0xb810, 0x9085, 0x8100, 0x7002, 0xb814, 0x7006, + 0x2069, 0x1800, 0x687c, 0x700a, 0x6880, 0x700e, 0x7013, 0x0009, + 0x0804, 0x9d0e, 0x0026, 0x080c, 0xa8ec, 0xb810, 0x9085, 0x8400, + 0x7002, 0xb814, 0x7006, 0x2069, 0x1800, 0x687c, 0x700a, 0x6880, + 0x700e, 0x2001, 0x0099, 0x7a20, 0x9296, 0x0005, 0x0108, 0xc0bc, + 0x7012, 0x0804, 0x9d70, 0x0026, 0x080c, 0xa8ec, 0xb810, 0x9085, + 0x8500, 0x7002, 0xb814, 0x7006, 0x2069, 0x1800, 0x687c, 0x700a, + 0x6880, 0x700e, 0x2001, 0x0099, 0x7a20, 0x9296, 0x0005, 0x0108, + 0xc0bc, 0x7012, 0x0804, 0x9d70, 0x00b6, 0x00c6, 0x00d6, 0x00e6, + 0x00f6, 0x2c78, 0x2069, 0x0200, 0x2071, 0x0240, 0x7804, 0x908a, + 0x0040, 0x0a0c, 0x0d79, 0x908a, 0x0057, 0x1a0c, 0x0d79, 0x7910, + 0x2158, 0xb984, 0x2061, 0x0100, 0x619a, 0x9082, 0x0040, 0x0033, + 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, 0x0005, 0x9e49, 0x9e49, + 0x9e49, 0x9e7a, 0x9e49, 0x9e49, 0x9e49, 0x9e49, 0x9e49, 0x9e49, + 0x9e49, 0xa43f, 0xa444, 0xa449, 0xa44e, 0x9e49, 0x9e49, 0x9e49, + 0xa43a, 0x080c, 0x0d79, 0x6813, 0x0008, 0xba8c, 0x8210, 0xb8d4, + 0xd084, 0x0180, 0x2001, 0x1b73, 0x200c, 0x8108, 0x2102, 0x2001, + 0x1b72, 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, 0x9e8a, 0x9e8a, 0x9e8c, 0x9e8a, 0x9e8a, 0x9e8a, + 0x9ea6, 0x9e8a, 0x080c, 0x0d79, 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, 0xa06b, 0x2009, 0x0003, + 0x0019, 0x7033, 0x7f00, 0x0cb0, 0x0016, 0x080c, 0xa8ec, 0x001e, + 0xb810, 0x9085, 0x0100, 0x7002, 0xb814, 0x7006, 0x2069, 0x1800, + 0x6a7c, 0x720a, 0x6a80, 0x720e, 0x7013, 0x0888, 0x918d, 0x0008, + 0x7116, 0x080c, 0xa05f, 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, + 0x2adc, 0x2001, 0x00b2, 0x2010, 0x900e, 0x080c, 0x2aeb, 0x2009, + 0x07d0, 0x080c, 0x88e9, 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, + 0x3474, 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, 0x2aeb, + 0x2009, 0x07d0, 0x080c, 0x88e9, 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, 0x9fea, 0x9fea, 0x9fea, 0x9fea, 0x9fea, + 0x9fea, 0x9fea, 0x9fea, 0x9fea, 0x9fea, 0x9fec, 0x9fea, 0x9fea, + 0x9fea, 0x9fea, 0x080c, 0x0d79, 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, 0xa8cc, 0x2009, 0x07d0, 0x60c4, 0x9084, 0xfff0, + 0x9005, 0x0110, 0x2009, 0x1b58, 0x080c, 0x88e9, 0x003e, 0x004e, + 0x005e, 0x00ce, 0x00de, 0x00ee, 0x009e, 0x00be, 0x0005, 0x7a40, + 0x9294, 0x00ff, 0x8217, 0x0005, 0x00d6, 0x2069, 0x19e9, 0x686b, + 0x0001, 0x00de, 0x0005, 0x60a3, 0x0056, 0x60a7, 0x9575, 0x00f1, + 0x080c, 0x88db, 0x0005, 0x0016, 0x2001, 0x180c, 0x200c, 0x9184, + 0x0600, 0x9086, 0x0600, 0x0128, 0x0089, 0x080c, 0x88db, 0x001e, + 0x0005, 0xc1e5, 0x2001, 0x180c, 0x2102, 0x2001, 0x19ea, 0x2003, + 0x0000, 0x2001, 0x19f5, 0x2003, 0x0000, 0x0c88, 0x0006, 0x0016, + 0x0026, 0x2009, 0x1804, 0x2011, 0x0009, 0x080c, 0x2aeb, 0x002e, + 0x001e, 0x000e, 0x0005, 0x0016, 0x00c6, 0x0006, 0x080c, 0xaaf7, + 0x0106, 0x2061, 0x0100, 0x61a4, 0x60a7, 0x95f5, 0x0016, 0x0026, + 0x2009, 0x1804, 0x2011, 0x0008, 0x080c, 0x2aeb, 0x002e, 0x001e, + 0x010e, 0x090c, 0xab13, 0x000e, 0xa001, 0xa001, 0xa001, 0x61a6, + 0x00ce, 0x001e, 0x0005, 0x00c6, 0x00d6, 0x0016, 0x0026, 0x2061, + 0x0100, 0x2069, 0x0140, 0x080c, 0x769d, 0x1510, 0x2001, 0x1a0e, + 0x2004, 0x9005, 0x1904, 0xa11a, 0x080c, 0x773f, 0x11a8, 0x2069, + 0x0380, 0x6843, 0x0101, 0x6844, 0xd084, 0x1de8, 0x2061, 0x0100, + 0x6020, 0xd0b4, 0x1120, 0x6024, 0xd084, 0x090c, 0x0d79, 0x6843, + 0x0100, 0x080c, 0x88db, 0x04b0, 0x00c6, 0x2061, 0x19e9, 0x00f0, + 0x6904, 0x9194, 0x4000, 0x0598, 0x080c, 0xa09b, 0x080c, 0x2ab2, + 0x00c6, 0x2061, 0x19e9, 0x6134, 0x9192, 0x0008, 0x1278, 0x8108, + 0x6136, 0x080c, 0xaaf7, 0x6130, 0x080c, 0xab13, 0x00ce, 0x81ff, + 0x01c8, 0x080c, 0x88db, 0x080c, 0xa08e, 0x00a0, 0x080c, 0xaaf7, + 0x6130, 0x91e5, 0x0000, 0x0150, 0x080c, 0xebfd, 0x080c, 0x88e4, + 0x6003, 0x0001, 0x2009, 0x0014, 0x080c, 0xafec, 0x080c, 0xab13, + 0x00ce, 0x0000, 0x002e, 0x001e, 0x00de, 0x00ce, 0x0005, 0x2001, + 0x1a0e, 0x2004, 0x9005, 0x1db0, 0x00c6, 0x2061, 0x19e9, 0x6134, + 0x9192, 0x0003, 0x1ad8, 0x8108, 0x6136, 0x00ce, 0x080c, 0x88db, + 0x080c, 0x6033, 0x2009, 0x1846, 0x2114, 0x8210, 0x220a, 0x0c10, + 0x0096, 0x00c6, 0x00d6, 0x00e6, 0x0016, 0x0026, 0x080c, 0x88f1, + 0x080c, 0xaaf7, 0x2001, 0x0387, 0x2003, 0x0202, 0x2071, 0x19e9, + 0x714c, 0x81ff, 0x0904, 0xa1d4, 0x2061, 0x0100, 0x2069, 0x0140, + 0x080c, 0x769d, 0x1518, 0x0036, 0x2019, 0x0002, 0x080c, 0xa391, + 0x003e, 0x080c, 0xebfd, 0x704c, 0x9065, 0x0180, 0x2009, 0x004a, + 0x6220, 0x9296, 0x0009, 0x1130, 0x6114, 0x2148, 0xa87b, 0x0006, + 0x2009, 0x004a, 0x6003, 0x0003, 0x080c, 0xafec, 0x2001, 0x0386, + 0x2003, 0x5040, 0x080c, 0x773f, 0x0804, 0xa1d4, 0x6904, 0xd1f4, + 0x0904, 0xa1e1, 0x080c, 0x2ab2, 0x00c6, 0x704c, 0x9065, 0x090c, + 0x0d79, 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, 0x9851, 0x2009, 0x0049, 0x080c, + 0xafec, 0x0450, 0x080c, 0xebfd, 0x704c, 0x9065, 0x9086, 0x1b56, + 0x1158, 0x080c, 0xadbe, 0x1500, 0x2061, 0x1b56, 0x6064, 0x8000, + 0x6066, 0x080c, 0x6033, 0x00c0, 0x0036, 0x2019, 0x0001, 0x080c, + 0xa391, 0x003e, 0x714c, 0x2160, 0x2009, 0x004a, 0x6220, 0x9296, + 0x0009, 0x1130, 0x6114, 0x2148, 0xa87b, 0x0006, 0x2009, 0x004a, + 0x6003, 0x0003, 0x080c, 0xafec, 0x2001, 0x0387, 0x2003, 0x0200, + 0x080c, 0xab13, 0x002e, 0x001e, 0x00ee, 0x00de, 0x00ce, 0x009e, + 0x0005, 0xd1ec, 0x1904, 0xa17a, 0x0804, 0xa17c, 0x0026, 0x00e6, + 0x2071, 0x19e9, 0x706c, 0xd084, 0x01e8, 0xc084, 0x706e, 0x714c, + 0x81ff, 0x01c0, 0x2071, 0x0100, 0x9188, 0x0008, 0x2114, 0x928e, + 0x0006, 0x1138, 0x2009, 0x1984, 0x2011, 0x0012, 0x080c, 0x2aeb, + 0x0048, 0x928e, 0x0009, 0x0db0, 0x2009, 0x1984, 0x2011, 0x0016, + 0x080c, 0x2aeb, 0x00ee, 0x002e, 0x0005, 0x9036, 0x2001, 0x19f3, + 0x2004, 0x9005, 0x0128, 0x9c06, 0x0128, 0x2c30, 0x600c, 0x0cc8, + 0x9085, 0x0001, 0x0005, 0x00f6, 0x2079, 0x19e9, 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, 0xa458, + 0x080c, 0xce24, 0x00fe, 0x0005, 0x080c, 0x9cf3, 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, 0xa06b, 0x080c, + 0x9cf3, 0x7003, 0x0f00, 0x7808, 0xd09c, 0x0128, 0xb810, 0x9084, + 0x00ff, 0x700a, 0xb814, 0x700e, 0x60c3, 0x0008, 0x0804, 0xa06b, + 0x0156, 0x080c, 0x9d3e, 0x7003, 0x0200, 0x080c, 0x89a9, 0x20a9, + 0x0006, 0x2011, 0xffec, 0x2019, 0xffed, 0x9ef0, 0x0002, 0x2305, + 0x2072, 0x8e70, 0x2205, 0x2072, 0x8e70, 0x9398, 0x0002, 0x9290, + 0x0002, 0x1f04, 0xa27f, 0x60c3, 0x001c, 0x015e, 0x0804, 0xa06b, + 0x0016, 0x0026, 0x080c, 0x9d1a, 0x080c, 0x9d2c, 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, 0xa06b, 0x002e, 0x001e, 0x0005, + 0x20a9, 0x0010, 0x4003, 0x080c, 0xa8d7, 0x20a1, 0x0240, 0x22a8, + 0x4003, 0x0c68, 0x080c, 0x9cf3, 0x7003, 0x6200, 0x7808, 0x700e, + 0x60c3, 0x0008, 0x0804, 0xa06b, 0x0016, 0x0026, 0x080c, 0x9cf3, + 0x20e9, 0x0000, 0x20a1, 0x024c, 0x7814, 0x0096, 0x2048, 0xa800, + 0x2048, 0xa860, 0x20e0, 0xa85c, 0x9080, 0x0023, 0x2098, 0x009e, + 0x7808, 0x9088, 0x0002, 0x21a8, 0x4003, 0x8003, 0x60c2, 0x080c, + 0xa06b, 0x002e, 0x001e, 0x0005, 0x00e6, 0x00c6, 0x0006, 0x0126, + 0x2091, 0x8000, 0x2071, 0x19e9, 0x7010, 0x2060, 0x8cff, 0x0188, + 0x080c, 0xce4a, 0x1110, 0x080c, 0xb93c, 0x600c, 0x0006, 0x080c, + 0xd0c6, 0x600f, 0x0000, 0x080c, 0xaf4e, 0x080c, 0xa458, 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, + 0x19e9, 0x7030, 0x2060, 0x8cff, 0x0548, 0x080c, 0xa09b, 0x6ac0, + 0x68c3, 0x0000, 0x080c, 0x88e4, 0x00c6, 0x2061, 0x0100, 0x080c, + 0xaa28, 0x00ce, 0x20a9, 0x01f4, 0x04b1, 0x080c, 0x97f6, 0x6044, + 0xd0ac, 0x1128, 0x2001, 0x1989, 0x2004, 0x604a, 0x0020, 0x2009, + 0x0013, 0x080c, 0xafec, 0x000e, 0x001e, 0x002e, 0x006e, 0x00ce, + 0x00de, 0x00ee, 0x00fe, 0x015e, 0x012e, 0x0005, 0x2001, 0x1800, + 0x2004, 0x9096, 0x0001, 0x0d78, 0x9096, 0x0004, 0x0d60, 0x080c, + 0x88e4, 0x6814, 0x9084, 0x0001, 0x0110, 0x68a7, 0x95f5, 0x6817, + 0x0008, 0x68c3, 0x0000, 0x2011, 0x5fdd, 0x080c, 0x882c, 0x20a9, + 0x01f4, 0x0009, 0x08c0, 0x6824, 0xd094, 0x0140, 0x6827, 0x0004, + 0x7804, 0x9084, 0x4000, 0x190c, 0x2ab2, 0x0090, 0xd084, 0x0118, + 0x6827, 0x0001, 0x0010, 0x1f04, 0xa373, 0x7804, 0x9084, 0x1000, + 0x0138, 0x2001, 0x0100, 0x080c, 0x2aa2, 0x9006, 0x080c, 0x2aa2, + 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, 0x19e9, 0x704c, + 0x2060, 0x8cff, 0x0904, 0xa414, 0x080c, 0xad70, 0x0904, 0xa414, + 0x9386, 0x0002, 0x1128, 0x6814, 0x9084, 0x0002, 0x0904, 0xa414, + 0x68af, 0x95f5, 0x6817, 0x0010, 0x2009, 0x00fa, 0x8109, 0x1df0, + 0x69c6, 0x68cb, 0x0008, 0x080c, 0x88f1, 0x080c, 0x1e61, 0x2001, + 0x0032, 0x6920, 0xd1bc, 0x0130, 0x8001, 0x1dd8, 0x692c, 0x918d, + 0x0008, 0x692e, 0x0016, 0x2009, 0x0040, 0x080c, 0x223d, 0x001e, + 0x20a9, 0x03e8, 0x6824, 0xd094, 0x0140, 0x6827, 0x0004, 0x7804, + 0x9084, 0x4000, 0x190c, 0x2ab2, 0x0090, 0xd08c, 0x0118, 0x6827, + 0x0002, 0x0010, 0x1f04, 0xa3e2, 0x7804, 0x9084, 0x1000, 0x0138, + 0x2001, 0x0100, 0x080c, 0x2aa2, 0x9006, 0x080c, 0x2aa2, 0x6827, + 0x4000, 0x6824, 0x83ff, 0x1180, 0x2009, 0x0049, 0x6020, 0x9086, + 0x0009, 0x0150, 0x080c, 0x9851, 0x6044, 0xd0ac, 0x1118, 0x6003, + 0x0002, 0x0010, 0x080c, 0xafec, 0x000e, 0x2071, 0x0380, 0xd08c, + 0x1110, 0x701f, 0x0200, 0x000e, 0x001e, 0x002e, 0x006e, 0x00ce, + 0x00de, 0x00ee, 0x00fe, 0x015e, 0x012e, 0x0005, 0x00d6, 0x0126, + 0x2091, 0x8000, 0x2069, 0x19e9, 0x6a06, 0x012e, 0x00de, 0x0005, + 0x00d6, 0x0126, 0x2091, 0x8000, 0x2069, 0x19e9, 0x6a3e, 0x012e, + 0x00de, 0x0005, 0x080c, 0x9e4b, 0x7047, 0x1000, 0x0098, 0x080c, + 0x9e4b, 0x7047, 0x4000, 0x0070, 0x080c, 0x9e4b, 0x7047, 0x2000, + 0x0048, 0x080c, 0x9e4b, 0x7047, 0x0400, 0x0020, 0x080c, 0x9e4b, + 0x7047, 0x0200, 0x785c, 0x7032, 0x60c3, 0x0020, 0x0804, 0xa06b, + 0x00e6, 0x2071, 0x19e9, 0x702c, 0x9005, 0x0110, 0x8001, 0x702e, + 0x00ee, 0x0005, 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0076, 0x0066, + 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, 0x19e9, 0x7620, 0x2660, + 0x2678, 0x2039, 0x0001, 0x87ff, 0x0904, 0xa4fd, 0x8cff, 0x0904, + 0xa4fd, 0x6020, 0x9086, 0x0006, 0x1904, 0xa4f8, 0x88ff, 0x0138, + 0x2800, 0x9c06, 0x1904, 0xa4f8, 0x2039, 0x0000, 0x0050, 0x6010, + 0x9b06, 0x1904, 0xa4f8, 0x85ff, 0x0120, 0x605c, 0x9106, 0x1904, + 0xa4f8, 0x7030, 0x9c06, 0x15b0, 0x2069, 0x0100, 0x68c0, 0x9005, + 0x1160, 0x6824, 0xd084, 0x0148, 0x6827, 0x0001, 0x080c, 0x88e4, + 0x080c, 0xa585, 0x7033, 0x0000, 0x0428, 0x080c, 0x88e4, 0x6820, + 0xd0b4, 0x0110, 0x68a7, 0x95f5, 0x6817, 0x0008, 0x68c3, 0x0000, + 0x080c, 0xa585, 0x7033, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, + 0x9384, 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x2aa2, 0x9006, + 0x080c, 0x2aa2, 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, 0xcc31, 0x0110, 0x080c, 0xe738, 0x009e, 0x080c, + 0xaf89, 0x080c, 0xa458, 0x88ff, 0x1190, 0x00ce, 0x0804, 0xa473, + 0x2c78, 0x600c, 0x2060, 0x0804, 0xa473, 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, 0x19e9, 0x7648, 0x2660, 0x2678, 0x8cff, 0x0904, 0xa574, + 0x6020, 0x9086, 0x0006, 0x1904, 0xa56f, 0x87ff, 0x0128, 0x2700, + 0x9c06, 0x1904, 0xa56f, 0x0048, 0x6010, 0x9b06, 0x1904, 0xa56f, + 0x85ff, 0x0118, 0x605c, 0x9106, 0x15d0, 0x704c, 0x9c06, 0x1178, + 0x0036, 0x2019, 0x0001, 0x080c, 0xa391, 0x703f, 0x0000, 0x9006, + 0x704e, 0x706a, 0x7052, 0x706e, 0x080c, 0xade0, 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, 0xcc31, 0x0110, 0x080c, 0xe738, + 0x080c, 0xaf89, 0x87ff, 0x1198, 0x00ce, 0x0804, 0xa51d, 0x2c78, + 0x600c, 0x2060, 0x0804, 0xa51d, 0x9006, 0x012e, 0x000e, 0x002e, + 0x006e, 0x00ce, 0x009e, 0x00de, 0x00ee, 0x00fe, 0x0005, 0x601b, + 0x0000, 0x00ce, 0x97bd, 0x0001, 0x0c80, 0x00e6, 0x2071, 0x19e9, + 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, 0x19e9, 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, 0x97f6, 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, 0x19e9, 0x7610, 0x2660, 0x2678, 0x8cff, 0x0904, 0xa672, + 0x6010, 0x00b6, 0x2058, 0xb8a0, 0x00be, 0x9206, 0x1904, 0xa66d, + 0x7030, 0x9c06, 0x1520, 0x2069, 0x0100, 0x68c0, 0x9005, 0x0904, + 0xa644, 0x080c, 0xa09b, 0x68c3, 0x0000, 0x080c, 0xa585, 0x7033, + 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, 0x9384, 0x1000, 0x0138, + 0x2001, 0x0100, 0x080c, 0x2aa2, 0x9006, 0x080c, 0x2aa2, 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, 0xce39, 0x1180, 0x080c, 0x332a, 0x080c, 0xce4a, + 0x1518, 0x080c, 0xb93c, 0x0400, 0x080c, 0xa585, 0x6824, 0xd084, + 0x09b0, 0x6827, 0x0001, 0x0898, 0x080c, 0xce4a, 0x1118, 0x080c, + 0xb93c, 0x0090, 0x6014, 0x2048, 0x080c, 0xcc31, 0x0168, 0x6020, + 0x9086, 0x0003, 0x1508, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, + 0x080c, 0x6f05, 0x080c, 0xce24, 0x080c, 0xd0c6, 0x080c, 0xaf89, + 0x080c, 0xa458, 0x00ce, 0x0804, 0xa5ed, 0x2c78, 0x600c, 0x2060, + 0x0804, 0xa5ed, 0x012e, 0x000e, 0x002e, 0x006e, 0x00ce, 0x00de, + 0x00ee, 0x00fe, 0x009e, 0x0005, 0x6020, 0x9086, 0x0006, 0x1d20, + 0x080c, 0xe738, 0x0c08, 0x00d6, 0x080c, 0x9d3e, 0x7003, 0x0200, + 0x7007, 0x0014, 0x60c3, 0x0014, 0x20e1, 0x0001, 0x2099, 0x198a, + 0x20e9, 0x0000, 0x20a1, 0x0250, 0x20a9, 0x0004, 0x4003, 0x7023, + 0x0004, 0x7027, 0x7878, 0x080c, 0xa06b, 0x00de, 0x0005, 0x080c, + 0x9d3e, 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, 0xa06b, 0x00b6, 0x00d6, 0x0016, 0x00d6, 0x2f68, + 0x2009, 0x0035, 0x080c, 0xd2d3, 0x00de, 0x1904, 0xa720, 0x080c, + 0x9cf3, 0x7003, 0x1300, 0x782c, 0x080c, 0xa82f, 0x2068, 0x6820, + 0x9086, 0x0003, 0x0560, 0x7810, 0x2058, 0xbaa0, 0x080c, 0xae80, + 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, + 0xae80, 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, 0xa06b, 0x00be, 0x0005, + 0x781b, 0x0001, 0x7803, 0x0006, 0x001e, 0x00de, 0x00be, 0x0005, + 0x792c, 0x9180, 0x0008, 0x200c, 0x9186, 0x0006, 0x01c0, 0x9186, + 0x0003, 0x0904, 0xa79f, 0x9186, 0x0005, 0x0904, 0xa787, 0x9186, + 0x0004, 0x05f0, 0x9186, 0x0008, 0x0904, 0xa790, 0x7807, 0x0037, + 0x782f, 0x0003, 0x7817, 0x1700, 0x080c, 0xa80c, 0x0005, 0x080c, + 0xa7cd, 0x00d6, 0x0026, 0x792c, 0x2168, 0x2009, 0x4000, 0x6800, + 0x6a44, 0xd2fc, 0x11f8, 0x0002, 0xa767, 0xa772, 0xa769, 0xa772, + 0xa76e, 0xa767, 0xa767, 0xa772, 0xa772, 0xa772, 0xa772, 0xa767, + 0xa767, 0xa767, 0xa767, 0xa767, 0xa772, 0xa767, 0xa772, 0x080c, + 0x0d79, 0x6824, 0xd0e4, 0x0110, 0xd0cc, 0x0110, 0x900e, 0x0010, + 0x2009, 0x2000, 0x682c, 0x7022, 0x6830, 0x7026, 0x0804, 0xa7c6, + 0x080c, 0xa7cd, 0x00d6, 0x0026, 0x792c, 0x2168, 0x2009, 0x4000, + 0x6a00, 0x9286, 0x0002, 0x1108, 0x900e, 0x0804, 0xa7c6, 0x080c, + 0xa7cd, 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, 0xa06b, 0x00b6, 0x0036, 0x0046, + 0x0056, 0x0066, 0x080c, 0x9d3e, 0x9006, 0x7003, 0x0200, 0x7938, + 0x710a, 0x793c, 0x710e, 0x7810, 0x2058, 0xb8a0, 0x080c, 0xae80, + 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, 0x9d3e, 0x7003, 0x0100, + 0x782c, 0x700a, 0x7814, 0x700e, 0x700e, 0x60c3, 0x0008, 0x0804, + 0xa06b, 0x080c, 0x9cea, 0x7003, 0x1400, 0x7838, 0x700a, 0x0079, + 0x783c, 0x700e, 0x782c, 0x7012, 0x7830, 0x7016, 0x7834, 0x9084, + 0x00ff, 0x8007, 0x701a, 0x60c3, 0x0010, 0x0804, 0xa06b, 0x00e6, + 0x2071, 0x0240, 0x0006, 0x00f6, 0x2078, 0x7810, 0x00b6, 0x2058, + 0xb8d4, 0xd084, 0x0120, 0x784c, 0x702a, 0x7850, 0x702e, 0x00be, + 0x00fe, 0x000e, 0x00ee, 0x0005, 0x080c, 0x9d35, 0x7003, 0x0100, + 0x782c, 0x700a, 0x7814, 0x700e, 0x60c3, 0x0008, 0x0804, 0xa06b, + 0x00a9, 0x7914, 0x712a, 0x60c3, 0x0000, 0x60a7, 0x9575, 0x0026, + 0x080c, 0x2a11, 0x0228, 0x2011, 0x0101, 0x2204, 0xc0c5, 0x2012, + 0x002e, 0x080c, 0xa08e, 0x080c, 0x88db, 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, 0xa8ec, 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, 0x19b4, 0x210c, + 0x009e, 0x918d, 0x0092, 0x0010, 0x2009, 0x0096, 0x60ab, 0x0036, + 0x0026, 0x2110, 0x900e, 0x080c, 0x2aeb, 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, 0x9cf3, 0x0016, 0x0026, 0x0096, 0x00d6, 0x7814, 0x2048, + 0x7013, 0x0138, 0x2001, 0x1837, 0x2004, 0x9084, 0x0028, 0x1138, + 0x2001, 0x197d, 0x2004, 0x9086, 0xaaaa, 0x1904, 0xa991, 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, 0xa922, + 0x20a9, 0x0004, 0x2009, 0x1801, 0x2104, 0x2012, 0x8108, 0x8210, + 0x1f04, 0xa92c, 0xa860, 0x20e0, 0xa85c, 0x9080, 0x0029, 0x2098, + 0x2009, 0x0006, 0x20a9, 0x0001, 0x4002, 0x8007, 0x2012, 0x8210, + 0x8109, 0x1dc0, 0x00d6, 0x2069, 0x0200, 0x080c, 0xa8d7, 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, 0x769d, 0x0150, 0x6028, 0xc0bd, + 0x602a, 0x2009, 0x1804, 0x2011, 0x0029, 0x080c, 0x2aeb, 0x0010, + 0x080c, 0xa06b, 0x080c, 0x88db, 0x00de, 0x009e, 0x002e, 0x001e, + 0x0005, 0x00e6, 0x2071, 0x0240, 0x2001, 0x2200, 0x9085, 0x00ff, + 0x7002, 0x7007, 0xffff, 0x2071, 0x0100, 0x709b, 0x00ff, 0x00ee, + 0x0804, 0xa907, 0x080c, 0x9cf3, 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, + 0xa9e3, 0x20a9, 0x0002, 0x2009, 0x1801, 0x2104, 0x2012, 0x8108, + 0x8210, 0x1f04, 0xa9ed, 0x00d6, 0x0016, 0x2069, 0x0200, 0x080c, + 0xa8d7, 0x001e, 0x00de, 0x2071, 0x0240, 0x20a9, 0x0002, 0x2009, + 0x1803, 0x2011, 0x0240, 0x2104, 0x2012, 0x8108, 0x8210, 0x1f04, + 0xaa03, 0x2009, 0x0008, 0x4002, 0x8007, 0x2012, 0x8210, 0x8109, + 0x1dd0, 0x9006, 0x20a9, 0x0008, 0x2012, 0x8210, 0x1f04, 0xaa14, + 0x00ce, 0x60c3, 0x004c, 0x60a3, 0x0056, 0x60a7, 0x9575, 0x080c, + 0xa06b, 0x080c, 0x88db, 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, 0x19e9, 0x7610, 0x2660, 0x2678, 0x8cff, + 0x0904, 0xaad4, 0x7030, 0x9c06, 0x1520, 0x2069, 0x0100, 0x68c0, + 0x9005, 0x0904, 0xaaa6, 0x080c, 0xa09b, 0x68c3, 0x0000, 0x080c, + 0xa585, 0x7033, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, 0x9384, + 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x2aa2, 0x9006, 0x080c, + 0x2aa2, 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, 0xce39, 0x1180, 0x080c, 0x332a, + 0x080c, 0xce4a, 0x1518, 0x080c, 0xb93c, 0x0400, 0x080c, 0xa585, + 0x6824, 0xd084, 0x09b0, 0x6827, 0x0001, 0x0898, 0x080c, 0xce4a, + 0x1118, 0x080c, 0xb93c, 0x0090, 0x6014, 0x2048, 0x080c, 0xcc31, + 0x0168, 0x6020, 0x9086, 0x0003, 0x1520, 0xa867, 0x0103, 0xab7a, + 0xa877, 0x0000, 0x080c, 0x6f11, 0x080c, 0xce24, 0x080c, 0xd0c6, + 0x080c, 0xaf89, 0x080c, 0xa458, 0x00ce, 0x0804, 0xaa57, 0x2c78, + 0x600c, 0x2060, 0x0804, 0xaa57, 0x7013, 0x0000, 0x700f, 0x0000, + 0x012e, 0x006e, 0x009e, 0x00ae, 0x00ce, 0x00de, 0x00ee, 0x00fe, + 0x0005, 0x6020, 0x9086, 0x0006, 0x1d08, 0x080c, 0xe738, 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, + 0x0d79, 0x001e, 0x0005, 0x2001, 0x0382, 0x2004, 0x9084, 0x0007, + 0x9086, 0x0003, 0x1120, 0x2001, 0x0380, 0x2003, 0x0001, 0x0005, + 0x0156, 0x0016, 0x0026, 0x00e6, 0x900e, 0x2071, 0x19e9, 0x0469, + 0x0106, 0x0190, 0x7004, 0x9086, 0x0003, 0x0148, 0x20a9, 0x1000, + 0x6044, 0xd0fc, 0x01d8, 0x1f04, 0xab30, 0x080c, 0x0d79, 0x080c, + 0xaaf7, 0x6044, 0xd0fc, 0x0190, 0x7030, 0x9c06, 0x1148, 0x080c, + 0x97f6, 0x6044, 0xd0dc, 0x0150, 0xc0dc, 0x6046, 0x700a, 0x7042, + 0x704c, 0x9c06, 0x190c, 0x0d79, 0x080c, 0x9851, 0x010e, 0x1919, + 0x00ee, 0x002e, 0x001e, 0x015e, 0x0005, 0x2001, 0x0382, 0x2004, + 0x9084, 0x0007, 0x9086, 0x0003, 0x0005, 0x0126, 0x2091, 0x2400, + 0x7808, 0xd0a4, 0x190c, 0x0d72, 0xd09c, 0x0128, 0x7820, 0x908c, + 0xf000, 0x11b8, 0x0012, 0x012e, 0x0005, 0xab7d, 0xabbb, 0xabe5, + 0xac23, 0xac33, 0xac44, 0xac53, 0xac61, 0xac8e, 0xac92, 0xab7d, + 0xab7d, 0xac95, 0xacb1, 0xab7d, 0xab7d, 0x080c, 0x0d79, 0x012e, + 0x0005, 0x2060, 0x6044, 0xd0bc, 0x0140, 0xc0bc, 0x6046, 0x6000, + 0x908a, 0x0010, 0x1a0c, 0x0d79, 0x0012, 0x012e, 0x0005, 0xaba2, + 0xaba4, 0xaba2, 0xabaa, 0xaba2, 0xaba2, 0xaba2, 0xaba2, 0xaba2, + 0xaba4, 0xaba2, 0xaba4, 0xaba2, 0xaba4, 0xaba2, 0xaba2, 0xaba2, + 0xaba4, 0xaba2, 0x080c, 0x0d79, 0x2009, 0x0013, 0x080c, 0xafec, + 0x012e, 0x0005, 0x6014, 0x2048, 0xa87c, 0xd0dc, 0x0130, 0x080c, + 0x8ab2, 0x080c, 0xaf4e, 0x012e, 0x0005, 0x2009, 0x0049, 0x080c, + 0xafec, 0x012e, 0x0005, 0x080c, 0xaaf7, 0x2001, 0x1a0e, 0x2003, + 0x0000, 0x7030, 0x9065, 0x090c, 0x0d79, 0x7034, 0x9092, 0xc350, + 0x1258, 0x8000, 0x7036, 0x7004, 0x9086, 0x0003, 0x0110, 0x7007, + 0x0000, 0x781f, 0x0808, 0x0058, 0x080c, 0xaeac, 0x0140, 0x080c, + 0xebfd, 0x6003, 0x0001, 0x2009, 0x0014, 0x080c, 0xafec, 0x781f, + 0x0100, 0x080c, 0xab13, 0x012e, 0x0005, 0x080c, 0xaaf7, 0x714c, + 0x81ff, 0x1128, 0x2011, 0x1a11, 0x2013, 0x0000, 0x0470, 0x2061, + 0x0100, 0x7150, 0x9192, 0x7530, 0x1628, 0x8108, 0x7152, 0x714c, + 0x9186, 0x1b56, 0x0120, 0x2001, 0x0391, 0x2003, 0x0400, 0x9188, + 0x0008, 0x210c, 0x918e, 0x0006, 0x1138, 0x6014, 0x9084, 0x1984, + 0x9085, 0x0012, 0x6016, 0x0088, 0x714c, 0x9188, 0x0008, 0x210c, + 0x918e, 0x0009, 0x0d90, 0x6014, 0x9084, 0x1984, 0x9085, 0x0016, + 0x6016, 0x0018, 0x706c, 0xc085, 0x706e, 0x781f, 0x0200, 0x080c, + 0xab13, 0x012e, 0x0005, 0x080c, 0xaaf7, 0x714c, 0x2160, 0x6003, + 0x0003, 0x2009, 0x004a, 0x080c, 0xafec, 0x781f, 0x0200, 0x080c, + 0xab13, 0x012e, 0x0005, 0x7808, 0xd09c, 0x0de8, 0x7820, 0x2060, + 0x6003, 0x0003, 0x080c, 0xaaf7, 0x080c, 0x1de9, 0x781f, 0x0400, + 0x080c, 0xab13, 0x012e, 0x0005, 0x7808, 0xd09c, 0x0de8, 0x7820, + 0x2060, 0x080c, 0xaaf7, 0x080c, 0x1e31, 0x781f, 0x0400, 0x080c, + 0xab13, 0x012e, 0x0005, 0x7030, 0x9065, 0x0148, 0x6044, 0xc0bc, + 0x6046, 0x7104, 0x9186, 0x0003, 0x0110, 0x080c, 0x98bd, 0x012e, + 0x0005, 0x00f6, 0x703c, 0x9086, 0x0002, 0x0528, 0x704c, 0x907d, + 0x0510, 0x7844, 0xc0bc, 0x7846, 0x7820, 0x9086, 0x0009, 0x0118, + 0x080c, 0x9fc5, 0x00c0, 0x7828, 0xd0fc, 0x1118, 0x080c, 0x9f44, + 0x0090, 0x2001, 0x1837, 0x2004, 0x9084, 0x0028, 0x1130, 0x2001, + 0x197d, 0x2004, 0x9086, 0xaaaa, 0x1120, 0x2001, 0x0387, 0x2003, + 0x1000, 0x080c, 0x9ec9, 0x00fe, 0x012e, 0x0005, 0x080c, 0x773f, + 0x012e, 0x0005, 0x080c, 0x0d79, 0x0005, 0x2009, 0x1b67, 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, 0x88f1, 0x2009, 0x010b, 0x2104, 0xd08c, 0x01a8, + 0xc08c, 0x200a, 0x2001, 0x1848, 0x2004, 0xd094, 0x1130, 0x2009, + 0x0101, 0x2104, 0x9085, 0x0020, 0x200a, 0x2009, 0x1b67, 0x200b, + 0x0000, 0x2001, 0x001b, 0x080c, 0xaae8, 0x012e, 0x0005, 0x00e6, + 0x2071, 0x19e9, 0x6044, 0xc0bc, 0x6046, 0xd0fc, 0x01b8, 0x704c, + 0x9c06, 0x1190, 0x2019, 0x0001, 0x080c, 0xa391, 0x704f, 0x0000, + 0x2001, 0x0109, 0x2004, 0xd08c, 0x1138, 0x2001, 0x0108, 0x2004, + 0xd0bc, 0x1110, 0x703f, 0x0000, 0x080c, 0xa59c, 0x00ee, 0x0005, + 0x0026, 0x7010, 0x9c06, 0x1178, 0x080c, 0xa458, 0x6044, 0xc0fc, + 0x6046, 0x600c, 0x9015, 0x0120, 0x7212, 0x600f, 0x0000, 0x0010, + 0x7212, 0x720e, 0x9006, 0x002e, 0x0005, 0x0026, 0x7020, 0x9c06, + 0x1178, 0x080c, 0xa458, 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, 0x88e4, 0x080c, 0xa09b, + 0x68c3, 0x0000, 0x080c, 0xa585, 0x2069, 0x0140, 0x6b04, 0x9384, + 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x2aa2, 0x9006, 0x080c, + 0x2aa2, 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, 0xab5d, + 0x003e, 0x001e, 0x012e, 0x00ce, 0x6200, 0x2200, 0x9106, 0x0d58, + 0x2200, 0x0010, 0x8319, 0x1d38, 0x003e, 0x002e, 0x001e, 0x0005, + 0x00e6, 0x00d6, 0x00c6, 0x080c, 0xaaf7, 0x0106, 0x2071, 0x19e9, + 0x2069, 0x0100, 0x704c, 0x2060, 0x9086, 0x1b56, 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, 0x9851, 0x682c, + 0x9084, 0xfffd, 0x682e, 0x2001, 0x1848, 0x2004, 0xd094, 0x1120, + 0x6804, 0x9085, 0x0020, 0x6806, 0x2069, 0x0000, 0x010e, 0x090c, + 0xab13, 0x8dff, 0x00ce, 0x00de, 0x00ee, 0x0005, 0x00e6, 0x00d6, + 0x00c6, 0x080c, 0xaaf7, 0x0106, 0x2071, 0x19e9, 0x2069, 0x0100, + 0x080c, 0xad70, 0x68d0, 0x9005, 0x0158, 0x9082, 0x0005, 0x1240, + 0x080c, 0x2b3c, 0x2001, 0x0391, 0x2003, 0x0400, 0x2069, 0x0000, + 0x010e, 0x090c, 0xab13, 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, 0x9d3e, + 0x7a14, 0x82ff, 0x0138, 0x7003, 0x0100, 0x700b, 0x0003, 0x60c3, + 0x0008, 0x0490, 0x7003, 0x0200, 0x7007, 0x0000, 0x2069, 0x1800, + 0x901e, 0x6800, 0x9086, 0x0004, 0x1110, 0xc38d, 0x0060, 0x080c, + 0x769d, 0x1110, 0xc3ad, 0x0008, 0xc3a5, 0x6adc, 0xd29c, 0x1110, + 0xd2ac, 0x0108, 0xc39d, 0x730e, 0x080c, 0x89a9, 0x20a9, 0x0006, + 0x2011, 0xffec, 0x2019, 0xffed, 0x2071, 0x0250, 0x2305, 0x2072, + 0x8e70, 0x2205, 0x2072, 0x8e70, 0x9398, 0x0002, 0x9290, 0x0002, + 0x1f04, 0xae26, 0x60c3, 0x0020, 0x080c, 0xa06b, 0x015e, 0x00de, + 0x0005, 0x0156, 0x080c, 0x9d3e, 0x7a14, 0x82ff, 0x0168, 0x9286, + 0xffff, 0x0118, 0x9282, 0x000e, 0x1238, 0x7003, 0x0100, 0x700b, + 0x0003, 0x60c3, 0x0008, 0x0488, 0x7003, 0x0200, 0x7007, 0x001c, + 0x700f, 0x0001, 0x2011, 0x19bf, 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, 0xa06b, + 0x0006, 0x2001, 0x1837, 0x2004, 0xd0ac, 0x000e, 0x0005, 0x2011, + 0x0003, 0x080c, 0xa426, 0x2011, 0x0002, 0x080c, 0xa430, 0x080c, + 0xa311, 0x0036, 0x901e, 0x080c, 0xa391, 0x003e, 0x0005, 0x080c, + 0x346d, 0x0188, 0x0016, 0x00b6, 0x00c6, 0x7010, 0x9085, 0x0020, + 0x7012, 0x2009, 0x007e, 0x080c, 0x6783, 0xb85c, 0xc0ac, 0xb85e, + 0x00ce, 0x00be, 0x001e, 0x0005, 0x00d6, 0x00f6, 0x7104, 0x9186, + 0x0004, 0x1120, 0x7410, 0x9e90, 0x0004, 0x0068, 0x9186, 0x0001, + 0x1120, 0x7420, 0x9e90, 0x0008, 0x0030, 0x9186, 0x0002, 0x1508, + 0x7428, 0x9e90, 0x000a, 0x6110, 0x2468, 0x680c, 0x907d, 0x01c8, + 0x7810, 0x9106, 0x1128, 0x2f68, 0x780c, 0x907d, 0x1dc8, 0x0088, + 0x780c, 0x680e, 0x7c0e, 0x2f12, 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, 0x0d79, 0x2001, 0x181a, 0x2004, 0x9c02, 0x1a0c, 0x0d79, + 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, 0x1af0, 0x6023, 0x0007, 0x2001, 0x1987, 0x2004, 0x0006, + 0x9082, 0x0051, 0x000e, 0x0208, 0x8004, 0x601a, 0x080c, 0xe9f0, + 0x604b, 0x0000, 0x6044, 0xd0fc, 0x1131, 0x9006, 0x6046, 0x6016, + 0x6012, 0x000e, 0x0005, 0x080c, 0xaaf7, 0x0106, 0x2001, 0x19fc, + 0x2004, 0x9c06, 0x1130, 0x0036, 0x2019, 0x0001, 0x080c, 0xa391, + 0x003e, 0x080c, 0xa59c, 0x010e, 0x090c, 0xab13, 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, + 0xb000, 0xb00a, 0xb025, 0xb040, 0xd3b0, 0xd3cd, 0xd3e8, 0xb000, + 0xb00a, 0x9191, 0xb059, 0xb000, 0xb000, 0xb000, 0xb000, 0xb000, + 0x9186, 0x0013, 0x1130, 0x6044, 0xd0fc, 0x0110, 0x080c, 0x97f6, + 0x0005, 0x0005, 0x0066, 0x6000, 0x90b2, 0x0010, 0x1a0c, 0x0d79, + 0x0013, 0x006e, 0x0005, 0xb023, 0xb79c, 0xb983, 0xb023, 0xba19, + 0xb322, 0xb023, 0xb023, 0xb71e, 0xbf8c, 0xb023, 0xb023, 0xb023, + 0xb023, 0xb023, 0xb023, 0x080c, 0x0d79, 0x0066, 0x6000, 0x90b2, + 0x0010, 0x1a0c, 0x0d79, 0x0013, 0x006e, 0x0005, 0xb03e, 0xc5a7, + 0xb03e, 0xb03e, 0xb03e, 0xb03e, 0xb03e, 0xb03e, 0xc53e, 0xc72a, + 0xb03e, 0xc5e4, 0xc668, 0xc5e4, 0xc668, 0xb03e, 0x080c, 0x0d79, + 0x6000, 0x9082, 0x0010, 0x1a0c, 0x0d79, 0x6000, 0x0002, 0xb057, + 0xbfd6, 0xc070, 0xc1f3, 0xc262, 0xb057, 0xb057, 0xb057, 0xbfa5, + 0xc4bf, 0xc4c2, 0xb057, 0xb057, 0xb057, 0xb057, 0xc4f2, 0x080c, + 0x0d79, 0x0066, 0x6000, 0x90b2, 0x0010, 0x1a0c, 0x0d79, 0x0013, + 0x006e, 0x0005, 0xb072, 0xb072, 0xb0b0, 0xb14f, 0xb1cf, 0xb072, + 0xb072, 0xb072, 0xb074, 0xb072, 0xb072, 0xb072, 0xb072, 0xb072, + 0xb072, 0xb072, 0x080c, 0x0d79, 0x9186, 0x004c, 0x0560, 0x9186, + 0x0003, 0x190c, 0x0d79, 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, 0x1c43, 0x2009, 0x8030, + 0x080c, 0x9467, 0x0005, 0x6010, 0x00b6, 0x2058, 0xbca0, 0x00be, + 0x2c00, 0x080c, 0xb1f1, 0x080c, 0xd375, 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, 0xb117, 0xb117, 0xb112, 0xb115, 0xb117, 0xb10f, + 0xb102, 0xb102, 0xb102, 0xb102, 0xb102, 0xb102, 0xb102, 0xb102, + 0xb102, 0xb102, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x002e, 0x001e, + 0x000e, 0x004e, 0x00fe, 0x009e, 0x00de, 0x080c, 0x0d79, 0x080c, + 0xbbda, 0x0028, 0x080c, 0xbcc1, 0x0010, 0x080c, 0xbdb7, 0x00fe, + 0x00ee, 0x00de, 0x00ce, 0x002e, 0x001e, 0x2c00, 0xa896, 0x000e, + 0x080c, 0xb2af, 0x0530, 0xa804, 0xa80e, 0x00a6, 0x2050, 0xb100, + 0x00ae, 0x8006, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, + 0x9080, 0x0002, 0xaacc, 0xabd0, 0xacd4, 0xadd8, 0x2031, 0x0000, + 0x2041, 0x12b6, 0x080c, 0xb473, 0x0160, 0x000e, 0x9005, 0x0120, + 0x00fe, 0x009e, 0x00de, 0x0005, 0x00fe, 0x009e, 0x00de, 0x0804, + 0xaf4e, 0x2001, 0x002c, 0x900e, 0x080c, 0xb315, 0x0c70, 0x91b6, + 0x0015, 0x0170, 0x91b6, 0x0016, 0x0158, 0x91b2, 0x0047, 0x0a0c, + 0x0d79, 0x91b2, 0x0050, 0x1a0c, 0x0d79, 0x9182, 0x0047, 0x0042, + 0x080c, 0xad4d, 0x0120, 0x9086, 0x0002, 0x0904, 0xb0b0, 0x0005, + 0xb171, 0xb171, 0xb173, 0xb1a5, 0xb171, 0xb171, 0xb171, 0xb171, + 0xb1b8, 0x080c, 0x0d79, 0x00d6, 0x0016, 0x0096, 0x6003, 0x0004, + 0x6114, 0x2148, 0xa87c, 0xd0fc, 0x01c0, 0xa878, 0xc0fc, 0x9005, + 0x1158, 0xa894, 0x9005, 0x0140, 0x2001, 0x0000, 0x900e, 0x080c, + 0xb315, 0x080c, 0xaf4e, 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, 0x9851, 0x00d6, + 0x0096, 0x6114, 0x2148, 0x080c, 0xcc33, 0x0120, 0xa87b, 0x0006, + 0x080c, 0x6f11, 0x009e, 0x00de, 0x080c, 0xaf4e, 0x0804, 0x98bc, + 0x080c, 0x9851, 0x080c, 0x32fb, 0x080c, 0xd372, 0x00d6, 0x0096, + 0x6114, 0x2148, 0x080c, 0xcc33, 0x0120, 0xa87b, 0x0029, 0x080c, + 0x6f11, 0x009e, 0x00de, 0x080c, 0xaf4e, 0x0804, 0x98bc, 0x9182, + 0x0047, 0x0002, 0xb1df, 0xb1e1, 0xb1df, 0xb1df, 0xb1df, 0xb1df, + 0xb1df, 0xb1df, 0xb1df, 0xb1df, 0xb1df, 0xb1df, 0xb1e1, 0x080c, + 0x0d79, 0x00d6, 0x0096, 0x601f, 0x0000, 0x6114, 0x2148, 0xa87b, + 0x0000, 0xa883, 0x0000, 0x080c, 0x6f11, 0x009e, 0x00de, 0x0804, + 0xaf4e, 0x0026, 0x0036, 0x0056, 0x0066, 0x0096, 0x00a6, 0x00f6, + 0x0006, 0x080c, 0x104d, 0x000e, 0x090c, 0x0d79, 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, 0xc7ad, 0x04c0, 0x2130, 0x2009, 0x0034, 0x2011, 0x001f, + 0x080c, 0xc7ad, 0x96b2, 0x0034, 0xb004, 0x904d, 0x0110, 0x080c, + 0x0fff, 0x080c, 0x104d, 0x01d0, 0x8528, 0xa867, 0x0110, 0xa86b, + 0x0000, 0x2920, 0xb406, 0x968a, 0x003d, 0x1230, 0x2608, 0x2011, + 0x001b, 0x080c, 0xc7ad, 0x00b8, 0x96b2, 0x003c, 0x2009, 0x003c, + 0x2950, 0x2011, 0x001b, 0x080c, 0xc7ad, 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, 0x6f11, 0x000e, 0x2048, 0x9005, 0x1db0, 0x00fe, + 0x00ae, 0x009e, 0x006e, 0x005e, 0x003e, 0x002e, 0x0005, 0x00d6, + 0x00f6, 0x0096, 0x0006, 0x080c, 0x104d, 0x000e, 0x090c, 0x0d79, + 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, 0x6f11, 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, 0x104d, 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, 0xb2c4, 0x0804, 0xb2c6, 0x9085, 0x0001, 0x7817, 0x0000, + 0x009e, 0x00fe, 0x00de, 0x001e, 0x0005, 0x00d6, 0x0036, 0x0096, + 0x6314, 0x2348, 0xa87a, 0xa982, 0x080c, 0x6f05, 0x009e, 0x003e, + 0x00de, 0x0005, 0x91b6, 0x0015, 0x1118, 0x080c, 0xaf4e, 0x0030, + 0x91b6, 0x0016, 0x190c, 0x0d79, 0x080c, 0xaf4e, 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, + 0xcc33, 0x0130, 0x6014, 0x2048, 0xa807, 0x0000, 0xa867, 0x0103, + 0x009e, 0x0804, 0xaf4e, 0x0096, 0x00d6, 0x0036, 0x7330, 0x9386, + 0x0200, 0x11a8, 0x6010, 0x00b6, 0x2058, 0xb8d7, 0x0000, 0x00be, + 0x6014, 0x9005, 0x0130, 0x2048, 0xa807, 0x0000, 0xa867, 0x0103, + 0xab32, 0x080c, 0xaf4e, 0x003e, 0x00de, 0x009e, 0x0005, 0x0011, + 0x1d48, 0x0cc8, 0x0006, 0x0016, 0x080c, 0xd35d, 0x0188, 0x6014, + 0x9005, 0x1170, 0x600b, 0x0003, 0x601b, 0x0000, 0x604b, 0x0000, + 0x2009, 0x0022, 0x080c, 0xb774, 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, 0xaf4e, 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, 0xc7ad, 0x080c, 0xcc33, 0x0140, 0x6014, 0x2048, 0xa807, + 0x0000, 0xa864, 0xa8e2, 0xa867, 0x0103, 0x080c, 0xaf4e, 0x001e, + 0x009e, 0x0005, 0x0016, 0x2009, 0x0000, 0x7030, 0x9086, 0x0200, + 0x0110, 0x2009, 0x0001, 0x0096, 0x6014, 0x904d, 0x090c, 0x0d79, + 0xa97a, 0x080c, 0x6f11, 0x009e, 0x080c, 0xaf4e, 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, + 0xc7ad, 0x009e, 0x080c, 0xcc33, 0x0148, 0xa804, 0x9005, 0x1158, + 0xa807, 0x0000, 0xa864, 0xa8e2, 0xa867, 0x0103, 0x080c, 0xaf4e, + 0x009e, 0x001e, 0x0005, 0x0086, 0x2040, 0xa030, 0x8007, 0x9086, + 0x0100, 0x1118, 0x080c, 0xb93c, 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, 0x129c, 0x0019, + 0x0d08, 0x008e, 0x0898, 0x0096, 0x0006, 0x080c, 0x104d, 0x000e, + 0x01b0, 0xa8ab, 0x0dcb, 0xa876, 0x000e, 0xa8a2, 0x0006, 0xae6a, + 0x2800, 0xa89e, 0xa97a, 0xaf72, 0xaa8e, 0xab92, 0xac96, 0xad9a, + 0x0086, 0x2940, 0x080c, 0x1142, 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, 0xd2d3, 0x001e, 0x1158, + 0x622c, 0x2268, 0x2071, 0x026c, 0x6b20, 0x9386, 0x0003, 0x0130, + 0x9386, 0x0006, 0x0128, 0x080c, 0xaf4e, 0x0020, 0x0039, 0x0010, + 0x080c, 0xb5a9, 0x002e, 0x00de, 0x00ee, 0x0005, 0x0096, 0x6814, + 0x2048, 0x9186, 0x0015, 0x0904, 0xb588, 0x918e, 0x0016, 0x1904, + 0xb5a7, 0x700c, 0x908c, 0xff00, 0x9186, 0x1700, 0x0120, 0x9186, + 0x0300, 0x1904, 0xb562, 0x89ff, 0x1138, 0x6800, 0x9086, 0x000f, + 0x0904, 0xb544, 0x0804, 0xb5a5, 0x6808, 0x9086, 0xffff, 0x1904, + 0xb58a, 0xa87c, 0x9084, 0x0060, 0x9086, 0x0020, 0x1150, 0xa8ac, + 0xa934, 0x9106, 0x1904, 0xb58a, 0xa8b0, 0xa938, 0x9106, 0x1904, + 0xb58a, 0x6824, 0xd084, 0x1904, 0xb58a, 0xd0b4, 0x0158, 0x0016, + 0x2001, 0x1987, 0x200c, 0x6018, 0x9102, 0x9082, 0x0005, 0x001e, + 0x1a04, 0xb58a, 0x080c, 0xce24, 0x6810, 0x0096, 0x2048, 0xa9a0, + 0x009e, 0x685c, 0xa87a, 0xa976, 0x6864, 0xa882, 0xa87c, 0xc0dc, + 0xc0f4, 0xc0d4, 0xa87e, 0x0026, 0x900e, 0x6a18, 0x2001, 0x000a, + 0x080c, 0x9364, 0xa884, 0x920a, 0x0208, 0x8011, 0xaa86, 0x82ff, + 0x002e, 0x1138, 0x00c6, 0x2d60, 0x080c, 0xc938, 0x00ce, 0x0804, + 0xb5a5, 0x00c6, 0xa868, 0xd0fc, 0x1118, 0x080c, 0x620a, 0x0010, + 0x080c, 0x6615, 0x00ce, 0x1904, 0xb58a, 0x00c6, 0x2d60, 0x080c, + 0xaf4e, 0x00ce, 0x0804, 0xb5a5, 0x00c6, 0x080c, 0xafbf, 0x0198, + 0x6017, 0x0000, 0x6810, 0x6012, 0x080c, 0xd0ce, 0x6023, 0x0003, + 0x6904, 0x00c6, 0x2d60, 0x080c, 0xaf4e, 0x00ce, 0x080c, 0xafec, + 0x00ce, 0x0804, 0xb5a5, 0x2001, 0x1989, 0x2004, 0x684a, 0x00ce, + 0x0804, 0xb5a5, 0x7008, 0x9086, 0x000b, 0x11c8, 0x6010, 0x00b6, + 0x2058, 0xb900, 0xc1bc, 0xb902, 0x00be, 0x00c6, 0x2d60, 0xa87b, + 0x0003, 0x080c, 0xd317, 0x6007, 0x0085, 0x6003, 0x000b, 0x6023, + 0x0002, 0x2009, 0x8020, 0x080c, 0x9420, 0x00ce, 0x0430, 0x700c, + 0x9086, 0x2a00, 0x1138, 0x2001, 0x1989, 0x2004, 0x684a, 0x00e8, + 0x04c1, 0x00e8, 0x89ff, 0x090c, 0x0d79, 0x00c6, 0x00d6, 0x2d60, + 0xa867, 0x0103, 0xa87b, 0x0003, 0x080c, 0x6d26, 0x080c, 0xce24, + 0x080c, 0xaf89, 0x0026, 0x6010, 0x00b6, 0x2058, 0xba3c, 0x080c, + 0x68ae, 0x00be, 0x002e, 0x00de, 0x00ce, 0x080c, 0xaf4e, 0x009e, + 0x0005, 0x9186, 0x0015, 0x1128, 0x2001, 0x1989, 0x2004, 0x684a, + 0x0068, 0x918e, 0x0016, 0x1160, 0x00c6, 0x2d00, 0x2060, 0x080c, + 0xe9f0, 0x080c, 0x8ab2, 0x080c, 0xaf4e, 0x00ce, 0x080c, 0xaf4e, + 0x0005, 0x0026, 0x0036, 0x0046, 0x7228, 0xacb0, 0xabac, 0xd2f4, + 0x0130, 0x2001, 0x1989, 0x2004, 0x684a, 0x0804, 0xb623, 0x00c6, + 0x2d60, 0x080c, 0xc80e, 0x00ce, 0x6804, 0x9086, 0x0050, 0x1168, + 0x00c6, 0x2d00, 0x2060, 0x6003, 0x0001, 0x6007, 0x0050, 0x2009, + 0x8023, 0x080c, 0x9420, 0x00ce, 0x04f0, 0x6800, 0x9086, 0x000f, + 0x01a8, 0x89ff, 0x090c, 0x0d79, 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, 0xcfb8, + 0x080c, 0x98bc, 0x0010, 0x080c, 0xaf4e, 0x004e, 0x003e, 0x002e, + 0x0005, 0x00e6, 0x00d6, 0x0026, 0x7008, 0x9084, 0x00ff, 0x6210, + 0x00b6, 0x2258, 0xba10, 0x00be, 0x9206, 0x1904, 0xb68e, 0x700c, + 0x6210, 0x00b6, 0x2258, 0xba14, 0x00be, 0x9206, 0x1904, 0xb68e, + 0x6038, 0x2068, 0x6824, 0xc0dc, 0x6826, 0x6a20, 0x9286, 0x0007, + 0x0904, 0xb68e, 0x9286, 0x0002, 0x0904, 0xb68e, 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, 0xcc33, 0x090c, 0x0d79, 0xa87b, + 0x0003, 0x009e, 0x080c, 0xd317, 0x6007, 0x0085, 0x6003, 0x000b, + 0x6023, 0x0002, 0x2009, 0x8020, 0x080c, 0x9420, 0x00ce, 0x0030, + 0x6038, 0x2070, 0x2001, 0x1989, 0x2004, 0x704a, 0x080c, 0xaf4e, + 0x002e, 0x00de, 0x00ee, 0x0005, 0x00b6, 0x0096, 0x00f6, 0x6014, + 0x2048, 0x6010, 0x2058, 0x91b6, 0x0015, 0x0130, 0xba08, 0xbb0c, + 0xbc00, 0xc48c, 0xbc02, 0x0460, 0x0096, 0x0156, 0x0036, 0x0026, + 0x2b48, 0x9e90, 0x0010, 0x2019, 0x000a, 0x20a9, 0x0004, 0x080c, + 0xbf54, 0x002e, 0x003e, 0x015e, 0x009e, 0x1904, 0xb6fd, 0x0096, + 0x0156, 0x0036, 0x0026, 0x2b48, 0x9e90, 0x0014, 0x2019, 0x0006, + 0x20a9, 0x0004, 0x080c, 0xbf54, 0x002e, 0x003e, 0x015e, 0x009e, + 0x15a0, 0x7238, 0xba0a, 0x733c, 0xbb0e, 0xbc00, 0xc48d, 0xbc02, + 0xa804, 0x9005, 0x1128, 0x00fe, 0x009e, 0x00be, 0x0804, 0xb35e, + 0x0096, 0x2048, 0xaa12, 0xab16, 0xac0a, 0x009e, 0x8006, 0x8006, + 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x0002, 0x2009, + 0x002b, 0xaaa0, 0xab9c, 0xaca8, 0xada4, 0x2031, 0x0000, 0x2041, + 0x129c, 0x080c, 0xb473, 0x0130, 0x00fe, 0x009e, 0x080c, 0xaf4e, + 0x00be, 0x0005, 0x080c, 0xb93c, 0x0cb8, 0x2b78, 0x00f6, 0x080c, + 0x32fb, 0x080c, 0xd372, 0x00fe, 0x00c6, 0x080c, 0xaef8, 0x2f00, + 0x6012, 0x6017, 0x0000, 0x6023, 0x0001, 0x6007, 0x0001, 0x6003, + 0x0001, 0x2001, 0x0007, 0x080c, 0x66c9, 0x080c, 0x66f5, 0x080c, + 0x9427, 0x080c, 0x98bc, 0x00ce, 0x0804, 0xb6d0, 0x2100, 0x91b2, + 0x0053, 0x1a0c, 0x0d79, 0x91b2, 0x0040, 0x1a04, 0xb786, 0x0002, + 0xb774, 0xb774, 0xb76a, 0xb774, 0xb774, 0xb774, 0xb768, 0xb768, + 0xb768, 0xb768, 0xb768, 0xb768, 0xb768, 0xb768, 0xb768, 0xb768, + 0xb768, 0xb768, 0xb768, 0xb768, 0xb768, 0xb768, 0xb768, 0xb768, + 0xb768, 0xb768, 0xb768, 0xb768, 0xb768, 0xb768, 0xb768, 0xb774, + 0xb768, 0xb774, 0xb774, 0xb768, 0xb768, 0xb768, 0xb768, 0xb768, + 0xb76a, 0xb768, 0xb768, 0xb768, 0xb768, 0xb768, 0xb768, 0xb768, + 0xb768, 0xb768, 0xb774, 0xb774, 0xb768, 0xb768, 0xb768, 0xb768, + 0xb768, 0xb768, 0xb768, 0xb768, 0xb768, 0xb774, 0xb768, 0xb768, + 0x080c, 0x0d79, 0x0066, 0x00b6, 0x6610, 0x2658, 0xb8d4, 0xc08c, + 0xb8d6, 0x00be, 0x006e, 0x0000, 0x6003, 0x0001, 0x6106, 0x9186, + 0x0032, 0x0118, 0x080c, 0x9427, 0x0010, 0x080c, 0x9420, 0x0126, + 0x2091, 0x8000, 0x080c, 0x98bc, 0x012e, 0x0005, 0x2600, 0x0002, + 0xb774, 0xb774, 0xb79a, 0xb774, 0xb774, 0xb79a, 0xb79a, 0xb79a, + 0xb79a, 0xb774, 0xb79a, 0xb774, 0xb79a, 0xb774, 0xb79a, 0xb79a, + 0xb79a, 0xb79a, 0x080c, 0x0d79, 0x6004, 0x90b2, 0x0053, 0x1a0c, + 0x0d79, 0x91b6, 0x0013, 0x0904, 0xb871, 0x91b6, 0x0027, 0x1904, + 0xb81d, 0x080c, 0x97f6, 0x6004, 0x080c, 0xce39, 0x01b0, 0x080c, + 0xce4a, 0x01a8, 0x908e, 0x0021, 0x0904, 0xb81a, 0x908e, 0x0022, + 0x1130, 0x080c, 0xb38a, 0x0904, 0xb816, 0x0804, 0xb817, 0x908e, + 0x003d, 0x0904, 0xb81a, 0x0804, 0xb810, 0x080c, 0x332a, 0x2001, + 0x0007, 0x080c, 0x66c9, 0x6010, 0x00b6, 0x2058, 0xb9a0, 0x00be, + 0x080c, 0xb93c, 0x9186, 0x007e, 0x1148, 0x2001, 0x1837, 0x2014, + 0xc285, 0x080c, 0x769d, 0x1108, 0xc2ad, 0x2202, 0x080c, 0xaaf7, + 0x0036, 0x0026, 0x2019, 0x0028, 0x2110, 0x080c, 0xeafd, 0x002e, + 0x003e, 0x0016, 0x0026, 0x0036, 0x2110, 0x2019, 0x0028, 0x080c, + 0x95b9, 0x0076, 0x903e, 0x080c, 0x9476, 0x6010, 0x00b6, 0x905d, + 0x0100, 0x00be, 0x2c08, 0x080c, 0xe465, 0x007e, 0x003e, 0x002e, + 0x001e, 0x080c, 0xab13, 0x080c, 0xd372, 0x0016, 0x080c, 0xd0c6, + 0x080c, 0xaf4e, 0x001e, 0x080c, 0x3404, 0x080c, 0x98bc, 0x0030, + 0x080c, 0xd0c6, 0x080c, 0xaf4e, 0x080c, 0x98bc, 0x0005, 0x080c, + 0xb93c, 0x0cb0, 0x080c, 0xb978, 0x0c98, 0x9186, 0x0015, 0x0118, + 0x9186, 0x0016, 0x1140, 0x080c, 0xad4d, 0x0d80, 0x9086, 0x0002, + 0x0904, 0xb983, 0x0c58, 0x9186, 0x0014, 0x1d40, 0x080c, 0x97f6, + 0x6004, 0x908e, 0x0022, 0x1118, 0x080c, 0xb38a, 0x09f8, 0x080c, + 0x32fb, 0x080c, 0xd372, 0x080c, 0xce39, 0x1190, 0x080c, 0x332a, + 0x6010, 0x00b6, 0x2058, 0xb9a0, 0x00be, 0x080c, 0xb93c, 0x9186, + 0x007e, 0x1128, 0x2001, 0x1837, 0x200c, 0xc185, 0x2102, 0x0800, + 0x080c, 0xce4a, 0x1120, 0x080c, 0xb93c, 0x0804, 0xb810, 0x6004, + 0x908e, 0x0032, 0x1160, 0x00e6, 0x00f6, 0x2071, 0x189e, 0x2079, + 0x0000, 0x080c, 0x36a5, 0x00fe, 0x00ee, 0x0804, 0xb810, 0x6004, + 0x908e, 0x0021, 0x0d40, 0x908e, 0x0022, 0x090c, 0xb93c, 0x0804, + 0xb810, 0x90b2, 0x0040, 0x1a04, 0xb91c, 0x2008, 0x0002, 0xb8b9, + 0xb8ba, 0xb8bd, 0xb8c0, 0xb8c3, 0xb8d0, 0xb8b7, 0xb8b7, 0xb8b7, + 0xb8b7, 0xb8b7, 0xb8b7, 0xb8b7, 0xb8b7, 0xb8b7, 0xb8b7, 0xb8b7, + 0xb8b7, 0xb8b7, 0xb8b7, 0xb8b7, 0xb8b7, 0xb8b7, 0xb8b7, 0xb8b7, + 0xb8b7, 0xb8b7, 0xb8b7, 0xb8b7, 0xb8b7, 0xb8d3, 0xb8de, 0xb8b7, + 0xb8df, 0xb8de, 0xb8b7, 0xb8b7, 0xb8b7, 0xb8b7, 0xb8b7, 0xb8de, + 0xb8de, 0xb8b7, 0xb8b7, 0xb8b7, 0xb8b7, 0xb8b7, 0xb8b7, 0xb8b7, + 0xb8b7, 0xb907, 0xb8de, 0xb8b7, 0xb8da, 0xb8b7, 0xb8b7, 0xb8b7, + 0xb8db, 0xb8b7, 0xb8b7, 0xb8b7, 0xb8de, 0xb902, 0xb8b7, 0x080c, + 0x0d79, 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, 0xd375, 0x080c, + 0x98bc, 0x0058, 0x0018, 0x0010, 0x080c, 0x66c9, 0x04b8, 0x080c, + 0xd375, 0x6003, 0x0004, 0x080c, 0x98bc, 0x0005, 0x080c, 0x66c9, + 0x6003, 0x0002, 0x0036, 0x2019, 0x1852, 0x2304, 0x9084, 0xff00, + 0x1120, 0x2001, 0x1987, 0x201c, 0x0040, 0x8007, 0x909a, 0x0004, + 0x0ec0, 0x8003, 0x801b, 0x831b, 0x9318, 0x631a, 0x003e, 0x080c, + 0x98bc, 0x0c18, 0x080c, 0xd0c6, 0x080c, 0xaf4e, 0x08f0, 0x00e6, + 0x00f6, 0x2071, 0x189e, 0x2079, 0x0000, 0x080c, 0x36a5, 0x00fe, + 0x00ee, 0x080c, 0x97f6, 0x080c, 0xaf4e, 0x0878, 0x6003, 0x0002, + 0x080c, 0xd375, 0x0804, 0x98bc, 0x2600, 0x2008, 0x0002, 0xb933, + 0xb916, 0xb931, 0xb916, 0xb916, 0xb931, 0xb931, 0xb931, 0xb931, + 0xb916, 0xb931, 0xb916, 0xb931, 0xb916, 0xb931, 0xb931, 0xb931, + 0xb931, 0x080c, 0x0d79, 0x0096, 0x6014, 0x2048, 0x080c, 0x6f11, + 0x009e, 0x080c, 0xaf4e, 0x0005, 0x00e6, 0x0096, 0x0026, 0x0016, + 0x080c, 0xcc33, 0x0568, 0x6014, 0x2048, 0xa864, 0x9086, 0x0139, + 0x11a8, 0xa894, 0x9086, 0x0056, 0x1148, 0x080c, 0x55ac, 0x0130, + 0x2001, 0x0000, 0x900e, 0x2011, 0x4000, 0x0028, 0x2001, 0x0030, + 0x900e, 0x2011, 0x4005, 0x080c, 0xd237, 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, 0x0d79, 0x6604, 0x96b6, 0x004d, + 0x1120, 0x080c, 0xd156, 0x0804, 0xba08, 0x6604, 0x96b6, 0x0043, + 0x1120, 0x080c, 0xd19f, 0x0804, 0xba08, 0x6604, 0x96b6, 0x004b, + 0x1120, 0x080c, 0xd1cb, 0x0804, 0xba08, 0x6604, 0x96b6, 0x0033, + 0x1120, 0x080c, 0xd0e8, 0x0804, 0xba08, 0x6604, 0x96b6, 0x0028, + 0x1120, 0x080c, 0xce88, 0x0804, 0xba08, 0x6604, 0x96b6, 0x0029, + 0x1120, 0x080c, 0xcec9, 0x0804, 0xba08, 0x6604, 0x96b6, 0x001f, + 0x1120, 0x080c, 0xb32f, 0x0804, 0xba08, 0x6604, 0x96b6, 0x0000, + 0x1118, 0x080c, 0xb694, 0x04e0, 0x6604, 0x96b6, 0x0022, 0x1118, + 0x080c, 0xb36b, 0x04a8, 0x6604, 0x96b6, 0x0035, 0x1118, 0x080c, + 0xb491, 0x0470, 0x6604, 0x96b6, 0x0039, 0x1118, 0x080c, 0xb629, + 0x0438, 0x6604, 0x96b6, 0x003d, 0x1118, 0x080c, 0xb3a3, 0x0400, + 0x6604, 0x96b6, 0x0044, 0x1118, 0x080c, 0xb3df, 0x00c8, 0x6604, + 0x96b6, 0x0049, 0x1118, 0x080c, 0xb420, 0x0090, 0x6604, 0x96b6, + 0x0041, 0x1118, 0x080c, 0xb40a, 0x0058, 0x91b6, 0x0015, 0x1110, + 0x0063, 0x0030, 0x91b6, 0x0016, 0x1128, 0x00be, 0x0804, 0xbc66, + 0x00be, 0x0005, 0x080c, 0xb009, 0x0cd8, 0xba25, 0xba33, 0xba25, + 0xba7a, 0xba25, 0xbbda, 0xbc73, 0xba25, 0xba25, 0xbc3c, 0xba25, + 0xbc52, 0x0096, 0x601f, 0x0000, 0x6014, 0x2048, 0xa800, 0x2048, + 0xa867, 0x0103, 0x009e, 0x0804, 0xaf4e, 0xa001, 0xa001, 0x0005, + 0x6604, 0x96b6, 0x0004, 0x1130, 0x2001, 0x0001, 0x080c, 0x66b5, + 0x0804, 0xaf4e, 0x0005, 0x00e6, 0x2071, 0x1800, 0x7090, 0x9086, + 0x0074, 0x1540, 0x080c, 0xe436, 0x11b0, 0x6010, 0x00b6, 0x2058, + 0x7030, 0xd08c, 0x0128, 0xb800, 0xd0bc, 0x0110, 0xc0c5, 0xb802, + 0x00f9, 0x00be, 0x2001, 0x0006, 0x080c, 0x66c9, 0x080c, 0x332a, + 0x080c, 0xaf4e, 0x0098, 0x2001, 0x000a, 0x080c, 0x66c9, 0x080c, + 0x332a, 0x6003, 0x0001, 0x6007, 0x0001, 0x080c, 0x9427, 0x080c, + 0x98bc, 0x0020, 0x2001, 0x0001, 0x080c, 0xbbaa, 0x00ee, 0x0005, + 0x00d6, 0xb800, 0xd084, 0x0160, 0x9006, 0x080c, 0x66b5, 0x2069, + 0x1847, 0x6804, 0xd0a4, 0x0120, 0x2001, 0x0006, 0x080c, 0x66f5, + 0x00de, 0x0005, 0x00b6, 0x0096, 0x00d6, 0x2011, 0x1824, 0x2204, + 0x9086, 0x0074, 0x1904, 0xbb7f, 0x6010, 0x2058, 0xbaa0, 0x9286, + 0x007e, 0x1120, 0x080c, 0xbdc2, 0x0804, 0xbaec, 0x080c, 0xbdb7, + 0x6010, 0x2058, 0xbaa0, 0x9286, 0x0080, 0x1510, 0x6014, 0x9005, + 0x01a8, 0x2048, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0039, 0x1140, + 0x2001, 0x0000, 0x900e, 0x2011, 0x4000, 0x080c, 0xd237, 0x0030, + 0xa807, 0x0000, 0xa867, 0x0103, 0xa833, 0x0200, 0x2001, 0x0006, + 0x080c, 0x66c9, 0x080c, 0x332a, 0x080c, 0xaf4e, 0x0804, 0xbb84, + 0x080c, 0xbb92, 0x6014, 0x9005, 0x0190, 0x2048, 0xa868, 0xd0f4, + 0x01e8, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0039, 0x1d08, 0x2001, + 0x0000, 0x900e, 0x2011, 0x4000, 0x080c, 0xd237, 0x08f8, 0x080c, + 0xbb88, 0x0160, 0x9006, 0x080c, 0x66b5, 0x2001, 0x0004, 0x080c, + 0x66f5, 0x2001, 0x0007, 0x080c, 0x66c9, 0x08a0, 0x2001, 0x0004, + 0x080c, 0x66c9, 0x6003, 0x0001, 0x6007, 0x0003, 0x080c, 0x9427, + 0x080c, 0x98bc, 0x0804, 0xbb84, 0xb85c, 0xd0e4, 0x0178, 0x080c, + 0xd060, 0x080c, 0x769d, 0x0118, 0xd0dc, 0x1904, 0xbaae, 0x2011, + 0x1837, 0x2204, 0xc0ad, 0x2012, 0x0804, 0xbaae, 0x080c, 0xd0a1, + 0x2011, 0x1837, 0x2204, 0xc0a5, 0x2012, 0x0006, 0x080c, 0xe60d, + 0x000e, 0x1904, 0xbaae, 0xc0b5, 0x2012, 0x2001, 0x0006, 0x080c, + 0x66c9, 0x9006, 0x080c, 0x66b5, 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, + 0x26ea, 0x00f6, 0x2100, 0x900e, 0x080c, 0x26a1, 0x795e, 0x00fe, + 0x9186, 0x0081, 0x01f0, 0x2009, 0x0081, 0x00e0, 0x2009, 0x00ef, + 0x00f6, 0x2079, 0x0100, 0x79ea, 0x78e7, 0x0000, 0x7932, 0x7936, + 0x780c, 0xc0b5, 0x780e, 0x00fe, 0x080c, 0x26ea, 0x00f6, 0x2079, + 0x1800, 0x7982, 0x2100, 0x900e, 0x797e, 0x080c, 0x26a1, 0x795e, + 0x00fe, 0x8108, 0x080c, 0x6718, 0x2b00, 0x00ce, 0x1904, 0xbaae, + 0x6012, 0x2009, 0x180f, 0x210c, 0xd19c, 0x0150, 0x2009, 0x027c, + 0x210c, 0x918c, 0x00ff, 0xb912, 0x2009, 0x027d, 0x210c, 0xb916, + 0x2001, 0x0002, 0x080c, 0x66c9, 0x6023, 0x0001, 0x6003, 0x0001, + 0x6007, 0x0002, 0x080c, 0x9427, 0x080c, 0x98bc, 0x0028, 0x080c, + 0xb93c, 0x2001, 0x0001, 0x0431, 0x00de, 0x009e, 0x00be, 0x0005, + 0x2001, 0x1810, 0x2004, 0xd0a4, 0x0120, 0x2001, 0x1848, 0x2004, + 0xd0ac, 0x0005, 0x00e6, 0x080c, 0xeb56, 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, + 0x66c9, 0x080c, 0x5834, 0x1120, 0x2001, 0x0007, 0x080c, 0x66f5, + 0x2600, 0x9005, 0x11b0, 0x6014, 0x0096, 0x2048, 0xa868, 0x009e, + 0xd0fc, 0x1178, 0x0036, 0x0046, 0x6010, 0x00b6, 0x2058, 0xbba0, + 0x00be, 0x2021, 0x0004, 0x2011, 0x8014, 0x080c, 0x4c28, 0x004e, + 0x003e, 0x080c, 0x332a, 0x6020, 0x9086, 0x000a, 0x1108, 0x0005, + 0x0804, 0xaf4e, 0x00b6, 0x00e6, 0x0026, 0x0016, 0x2071, 0x1800, + 0x7090, 0x9086, 0x0014, 0x1904, 0xbc32, 0x080c, 0x5834, 0x1170, + 0x6014, 0x9005, 0x1158, 0x0036, 0x0046, 0x6010, 0x2058, 0xbba0, + 0x2021, 0x0006, 0x080c, 0x4ddf, 0x004e, 0x003e, 0x00d6, 0x6010, + 0x2058, 0x080c, 0x681e, 0x080c, 0xba68, 0x00de, 0x080c, 0xbe8d, + 0x1588, 0x6010, 0x2058, 0xb890, 0x9005, 0x0560, 0x2001, 0x0006, + 0x080c, 0x66c9, 0x0096, 0x6014, 0x904d, 0x01d0, 0xa864, 0x9084, + 0x00ff, 0x9086, 0x0039, 0x1140, 0x2001, 0x0000, 0x900e, 0x2011, + 0x4000, 0x080c, 0xd237, 0x0060, 0xa864, 0x9084, 0x00ff, 0x9086, + 0x0029, 0x0130, 0xa807, 0x0000, 0xa867, 0x0103, 0xa833, 0x0200, + 0x009e, 0x080c, 0x332a, 0x6020, 0x9086, 0x000a, 0x0140, 0x080c, + 0xaf4e, 0x0028, 0x080c, 0xb93c, 0x9006, 0x080c, 0xbbaa, 0x001e, + 0x002e, 0x00ee, 0x00be, 0x0005, 0x2011, 0x1824, 0x2204, 0x9086, + 0x0014, 0x1160, 0x2001, 0x0002, 0x080c, 0x66c9, 0x6003, 0x0001, + 0x6007, 0x0001, 0x080c, 0x9427, 0x0804, 0x98bc, 0x2001, 0x0001, + 0x0804, 0xbbaa, 0x2030, 0x2011, 0x1824, 0x2204, 0x9086, 0x0004, + 0x1148, 0x96b6, 0x000b, 0x1120, 0x2001, 0x0007, 0x080c, 0x66c9, + 0x0804, 0xaf4e, 0x2001, 0x0001, 0x0804, 0xbbaa, 0x0002, 0xba25, + 0xbc7e, 0xba25, 0xbcc1, 0xba25, 0xbd6e, 0xbc73, 0xba28, 0xba25, + 0xbd82, 0xba25, 0xbd94, 0x6604, 0x9686, 0x0003, 0x0904, 0xbbda, + 0x96b6, 0x001e, 0x1110, 0x080c, 0xaf4e, 0x0005, 0x00b6, 0x00d6, + 0x00c6, 0x080c, 0xbda6, 0x11a0, 0x9006, 0x080c, 0x66b5, 0x080c, + 0x32fb, 0x080c, 0xd372, 0x2001, 0x0002, 0x080c, 0x66c9, 0x6003, + 0x0001, 0x6007, 0x0002, 0x080c, 0x9427, 0x080c, 0x98bc, 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, 0x32fb, 0x080c, + 0xd372, 0x2001, 0x0001, 0x080c, 0xbbaa, 0x00ce, 0x00de, 0x00be, + 0x0005, 0x0096, 0x00b6, 0x0026, 0x9016, 0x080c, 0xbdb4, 0x00d6, + 0x2069, 0x197d, 0x2d04, 0x9005, 0x0168, 0x6010, 0x2058, 0xb8a0, + 0x9086, 0x007e, 0x1138, 0x2069, 0x1820, 0x2d04, 0x8000, 0x206a, + 0x00de, 0x0010, 0x00de, 0x0088, 0x9006, 0x080c, 0x66b5, 0x2001, + 0x0002, 0x080c, 0x66c9, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, + 0x9427, 0x080c, 0x98bc, 0x0804, 0xbd3e, 0x080c, 0xcc33, 0x01b0, + 0x6014, 0x2048, 0xa864, 0x2010, 0x9086, 0x0139, 0x1138, 0x6007, + 0x0016, 0x2001, 0x0002, 0x080c, 0xd294, 0x00b0, 0x6014, 0x2048, + 0xa864, 0xd0fc, 0x0118, 0x2001, 0x0001, 0x0ca8, 0x2001, 0x180e, + 0x2004, 0xd0dc, 0x0148, 0x6010, 0x2058, 0xb840, 0x9084, 0x00ff, + 0x9005, 0x1110, 0x9006, 0x0c38, 0x080c, 0xb93c, 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, 0x66c9, 0x2001, 0x0028, 0x601a, 0x6007, + 0x0052, 0x0020, 0x2001, 0x0001, 0x080c, 0xbbaa, 0x002e, 0x00be, + 0x009e, 0x0005, 0x9286, 0x0139, 0x0160, 0x6014, 0x2048, 0x080c, + 0xcc33, 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, + 0x610b, 0x00ee, 0x0010, 0x080c, 0x32fb, 0x0860, 0x2001, 0x0004, + 0x080c, 0x66c9, 0x080c, 0xbdb4, 0x1140, 0x6003, 0x0001, 0x6007, + 0x0003, 0x080c, 0x9427, 0x0804, 0x98bc, 0x080c, 0xb93c, 0x9006, + 0x0804, 0xbbaa, 0x0489, 0x1160, 0x2001, 0x0008, 0x080c, 0x66c9, + 0x6003, 0x0001, 0x6007, 0x0005, 0x080c, 0x9427, 0x0804, 0x98bc, + 0x2001, 0x0001, 0x0804, 0xbbaa, 0x00f9, 0x1160, 0x2001, 0x000a, + 0x080c, 0x66c9, 0x6003, 0x0001, 0x6007, 0x0001, 0x080c, 0x9427, + 0x0804, 0x98bc, 0x2001, 0x0001, 0x0804, 0xbbaa, 0x2009, 0x026e, + 0x2104, 0x9086, 0x0003, 0x1138, 0x2009, 0x026f, 0x2104, 0x9084, + 0xff00, 0x9086, 0x2a00, 0x0005, 0x9085, 0x0001, 0x0005, 0x00b6, + 0x00c6, 0x0016, 0x6110, 0x2158, 0x080c, 0x6792, 0x001e, 0x00ce, + 0x00be, 0x0005, 0x00b6, 0x00f6, 0x00e6, 0x00d6, 0x0036, 0x0016, + 0x6010, 0x2058, 0x2009, 0x1837, 0x2104, 0x9085, 0x0003, 0x200a, + 0x080c, 0xbe5f, 0x0560, 0x2009, 0x1837, 0x2104, 0xc0cd, 0x200a, + 0x080c, 0x6bc9, 0x0158, 0x9006, 0x2020, 0x2009, 0x002a, 0x080c, + 0xe795, 0x2001, 0x180c, 0x200c, 0xc195, 0x2102, 0x2019, 0x002a, + 0x2009, 0x0001, 0x080c, 0x32c0, 0x00e6, 0x2071, 0x1800, 0x080c, + 0x30c8, 0x00ee, 0x00c6, 0x0156, 0x20a9, 0x0781, 0x2009, 0x007f, + 0x080c, 0x3404, 0x8108, 0x1f04, 0xbdf8, 0x015e, 0x00ce, 0x080c, + 0xbdb7, 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, 0x26ea, 0x080c, 0x769d, + 0x0170, 0x2071, 0x0260, 0x2069, 0x1983, 0x7048, 0x206a, 0x704c, + 0x6806, 0x7050, 0x680a, 0x7054, 0x680e, 0x080c, 0xd060, 0x0040, + 0x2001, 0x0006, 0x080c, 0x66c9, 0x080c, 0x332a, 0x080c, 0xaf4e, + 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, 0xbf54, 0x1148, 0x2011, 0x027a, + 0x20a9, 0x0004, 0x2019, 0x0006, 0x080c, 0xbf54, 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, 0x19f5, + 0x252c, 0x2021, 0x19fc, 0x2424, 0x2061, 0x1ddc, 0x2071, 0x1800, + 0x7254, 0x7074, 0x9202, 0x1a04, 0xbf20, 0x080c, 0x8d87, 0x0904, + 0xbf19, 0x080c, 0xe7c6, 0x0904, 0xbf19, 0x6720, 0x9786, 0x0007, + 0x0904, 0xbf19, 0x2500, 0x9c06, 0x0904, 0xbf19, 0x2400, 0x9c06, + 0x0904, 0xbf19, 0x3e08, 0x9186, 0x0002, 0x1148, 0x6010, 0x9005, + 0x0130, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x1590, 0x00c6, + 0x6043, 0xffff, 0x6000, 0x9086, 0x0004, 0x1110, 0x080c, 0x1af0, + 0x9786, 0x000a, 0x0148, 0x080c, 0xce4a, 0x1130, 0x00ce, 0x080c, + 0xb93c, 0x080c, 0xaf89, 0x00e8, 0x6014, 0x2048, 0x080c, 0xcc33, + 0x01a8, 0x9786, 0x0003, 0x1530, 0xa867, 0x0103, 0xa87c, 0xd0cc, + 0x0130, 0x0096, 0xa878, 0x2048, 0x080c, 0x0fff, 0x009e, 0xab7a, + 0xa877, 0x0000, 0x080c, 0x6f05, 0x080c, 0xce24, 0x080c, 0xaf89, + 0x00ce, 0x9ce0, 0x001c, 0x7068, 0x9c02, 0x1210, 0x0804, 0xbec0, + 0x012e, 0x000e, 0x002e, 0x004e, 0x005e, 0x007e, 0x00ce, 0x009e, + 0x00ee, 0x0005, 0x9786, 0x0006, 0x1118, 0x080c, 0xe738, 0x0c30, + 0x9786, 0x0009, 0x1148, 0x6000, 0x9086, 0x0004, 0x0d08, 0x2009, + 0x004c, 0x080c, 0xafec, 0x08e0, 0x9786, 0x000a, 0x0980, 0x0820, + 0x220c, 0x2304, 0x9106, 0x1130, 0x8210, 0x8318, 0x1f04, 0xbf40, + 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, 0xbf7e, 0x9006, + 0x0005, 0x918d, 0x0001, 0x0005, 0x6004, 0x908a, 0x0053, 0x1a0c, + 0x0d79, 0x080c, 0xce39, 0x0120, 0x080c, 0xce4a, 0x0158, 0x0028, + 0x080c, 0x332a, 0x080c, 0xce4a, 0x0128, 0x080c, 0x97f6, 0x080c, + 0xaf4e, 0x0005, 0x080c, 0xb93c, 0x0cc0, 0x9182, 0x0057, 0x1220, + 0x9182, 0x0040, 0x0208, 0x000a, 0x0005, 0xbfc4, 0xbfc4, 0xbfc4, + 0xbfc4, 0xbfc4, 0xbfc4, 0xbfc4, 0xbfc4, 0xbfc4, 0xbfc4, 0xbfc4, + 0xbfc6, 0xbfc6, 0xbfc6, 0xbfc6, 0xbfc4, 0xbfc4, 0xbfc4, 0xbfc6, + 0xbfc4, 0xbfc4, 0xbfc4, 0xbfc4, 0x080c, 0x0d79, 0x600b, 0xffff, + 0x6003, 0x000f, 0x6106, 0x0126, 0x2091, 0x8000, 0x080c, 0xd375, + 0x2009, 0x8000, 0x080c, 0x9420, 0x012e, 0x0005, 0x9186, 0x0013, + 0x1128, 0x6004, 0x9082, 0x0040, 0x0804, 0xc04e, 0x9186, 0x0027, + 0x1520, 0x080c, 0x97f6, 0x080c, 0x32fb, 0x080c, 0xd372, 0x0096, + 0x6114, 0x2148, 0x080c, 0xcc33, 0x0198, 0x080c, 0xce4a, 0x1118, + 0x080c, 0xb93c, 0x0068, 0xa867, 0x0103, 0xa87b, 0x0029, 0xa877, + 0x0000, 0xa97c, 0xc1c5, 0xa97e, 0x080c, 0x6f11, 0x080c, 0xce24, + 0x009e, 0x080c, 0xaf4e, 0x0804, 0x98bc, 0x9186, 0x0014, 0x1120, + 0x6004, 0x9082, 0x0040, 0x0030, 0x9186, 0x0053, 0x0110, 0x080c, + 0x0d79, 0x0005, 0x0002, 0xc02c, 0xc02a, 0xc02a, 0xc02a, 0xc02a, + 0xc02a, 0xc02a, 0xc02a, 0xc02a, 0xc02a, 0xc02a, 0xc045, 0xc045, + 0xc045, 0xc045, 0xc02a, 0xc045, 0xc02a, 0xc045, 0xc02a, 0xc02a, + 0xc02a, 0xc02a, 0x080c, 0x0d79, 0x080c, 0x97f6, 0x0096, 0x6114, + 0x2148, 0x080c, 0xcc33, 0x0168, 0xa867, 0x0103, 0xa87b, 0x0006, + 0xa877, 0x0000, 0xa880, 0xc0ec, 0xa882, 0x080c, 0x6f11, 0x080c, + 0xce24, 0x009e, 0x080c, 0xaf4e, 0x0005, 0x080c, 0x97f6, 0x080c, + 0xce4a, 0x090c, 0xb93c, 0x080c, 0xaf4e, 0x0005, 0x0002, 0xc068, + 0xc066, 0xc066, 0xc066, 0xc066, 0xc066, 0xc066, 0xc066, 0xc066, + 0xc066, 0xc066, 0xc06a, 0xc06a, 0xc06a, 0xc06a, 0xc066, 0xc06c, + 0xc066, 0xc06a, 0xc066, 0xc066, 0xc066, 0xc066, 0x080c, 0x0d79, + 0x080c, 0x0d79, 0x080c, 0x0d79, 0x080c, 0xaf4e, 0x0804, 0x98bc, + 0x9182, 0x0057, 0x1220, 0x9182, 0x0040, 0x0208, 0x000a, 0x0005, + 0xc08f, 0xc08f, 0xc08f, 0xc08f, 0xc08f, 0xc0c8, 0xc1ba, 0xc08f, + 0xc1c6, 0xc08f, 0xc08f, 0xc08f, 0xc08f, 0xc08f, 0xc08f, 0xc08f, + 0xc08f, 0xc08f, 0xc08f, 0xc1c6, 0xc091, 0xc08f, 0xc1c4, 0x080c, + 0x0d79, 0x00b6, 0x0096, 0x6114, 0x2148, 0x6010, 0x2058, 0xb800, + 0xd0bc, 0x1508, 0xa87b, 0x0000, 0xa867, 0x0103, 0xa877, 0x0000, + 0xa87c, 0xd0ac, 0x0128, 0xa834, 0xa938, 0x9115, 0x190c, 0xc24b, + 0x080c, 0x6d26, 0x6210, 0x2258, 0xba3c, 0x82ff, 0x0110, 0x8211, + 0xba3e, 0xb8d0, 0x9005, 0x0110, 0x080c, 0x68ae, 0x080c, 0xaf4e, + 0x009e, 0x00be, 0x0005, 0xa87c, 0xd0ac, 0x09e0, 0xa838, 0xa934, + 0x9105, 0x09c0, 0xa880, 0xd0bc, 0x19a8, 0x080c, 0xcf7f, 0x0c80, + 0x00b6, 0x0096, 0x6114, 0x2148, 0x601c, 0xd0fc, 0x1110, 0x7644, + 0x0008, 0x9036, 0x96b4, 0x0fff, 0x86ff, 0x1590, 0x6010, 0x2058, + 0xb800, 0xd0bc, 0x1904, 0xc1a9, 0xa87b, 0x0000, 0xa867, 0x0103, + 0xae76, 0xa87c, 0xd0ac, 0x0128, 0xa834, 0xa938, 0x9115, 0x190c, + 0xc24b, 0x080c, 0x6d26, 0x6210, 0x2258, 0xba3c, 0x82ff, 0x0110, + 0x8211, 0xba3e, 0xb8d0, 0x9005, 0x0110, 0x080c, 0x68ae, 0x601c, + 0xd0fc, 0x1148, 0x7044, 0xd0e4, 0x1904, 0xc18a, 0x080c, 0xaf4e, + 0x009e, 0x00be, 0x0005, 0x2009, 0x0211, 0x210c, 0x080c, 0x0d79, + 0x968c, 0x0c00, 0x0150, 0x6010, 0x2058, 0xb800, 0xd0bc, 0x1904, + 0xc18e, 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, 0xc0d4, 0x735c, 0xab86, 0x83ff, 0x0170, + 0x938a, 0x0009, 0x0210, 0x2019, 0x0008, 0x0036, 0x2308, 0x2019, + 0x0018, 0x2011, 0x0025, 0x080c, 0xc7ad, 0x003e, 0xd6cc, 0x0904, + 0xc0e9, 0x7154, 0xa98a, 0x81ff, 0x0904, 0xc0e9, 0x9192, 0x0021, + 0x1278, 0x8304, 0x9098, 0x0018, 0x2011, 0x0029, 0x080c, 0xc7ad, + 0x2011, 0x0205, 0x2013, 0x0000, 0x080c, 0xd300, 0x0804, 0xc0e9, + 0xa868, 0xd0fc, 0x0120, 0x2009, 0x0020, 0xa98a, 0x0c50, 0x00a6, + 0x2950, 0x080c, 0xc74c, 0x00ae, 0x080c, 0xd300, 0x080c, 0xc79d, + 0x0804, 0xc0eb, 0x080c, 0xcf42, 0x0804, 0xc100, 0xa87c, 0xd0ac, + 0x0904, 0xc111, 0xa880, 0xd0bc, 0x1904, 0xc111, 0x9684, 0x0400, + 0x0130, 0xa838, 0xab34, 0x9305, 0x0904, 0xc111, 0x00b8, 0x7348, + 0xa838, 0x9306, 0x1198, 0x734c, 0xa834, 0x931e, 0x0904, 0xc111, + 0x0068, 0xa87c, 0xd0ac, 0x0904, 0xc0dc, 0xa838, 0xa934, 0x9105, + 0x0904, 0xc0dc, 0xa880, 0xd0bc, 0x1904, 0xc0dc, 0x080c, 0xcf7f, + 0x0804, 0xc100, 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, + 0xab20, 0x604b, 0x0000, 0x080c, 0x1cb9, 0x1118, 0x6144, 0x080c, + 0x944c, 0x009e, 0x0005, 0x9182, 0x0057, 0x1220, 0x9182, 0x0040, + 0x0208, 0x000a, 0x0005, 0xc212, 0xc212, 0xc212, 0xc212, 0xc212, + 0xc212, 0xc212, 0xc212, 0xc212, 0xc212, 0xc214, 0xc212, 0xc212, + 0xc212, 0xc212, 0xc225, 0xc212, 0xc212, 0xc212, 0xc212, 0xc249, + 0xc212, 0xc212, 0x080c, 0x0d79, 0x6004, 0x9086, 0x0040, 0x1110, + 0x080c, 0x97f6, 0x2019, 0x0001, 0x080c, 0xa391, 0x6003, 0x0002, + 0x080c, 0xd37a, 0x080c, 0x9851, 0x0005, 0x6004, 0x9086, 0x0040, + 0x1110, 0x080c, 0x97f6, 0x2019, 0x0001, 0x080c, 0xa391, 0x080c, + 0x9851, 0x080c, 0x32fb, 0x080c, 0xd372, 0x0096, 0x6114, 0x2148, + 0x080c, 0xcc33, 0x0150, 0xa867, 0x0103, 0xa87b, 0x0029, 0xa877, + 0x0000, 0x080c, 0x6f11, 0x080c, 0xce24, 0x009e, 0x080c, 0xaf4e, + 0x0005, 0x080c, 0x0d79, 0xa87b, 0x0015, 0xd1fc, 0x0180, 0xa87b, + 0x0007, 0x8002, 0x8000, 0x810a, 0x9189, 0x0000, 0x0006, 0x0016, + 0x2009, 0x1a7d, 0x2104, 0x8000, 0x200a, 0x001e, 0x000e, 0xa992, + 0xa88e, 0x0005, 0x9182, 0x0057, 0x1220, 0x9182, 0x0040, 0x0208, + 0x000a, 0x0005, 0xc281, 0xc281, 0xc281, 0xc281, 0xc281, 0xc283, + 0xc281, 0xc281, 0xc340, 0xc281, 0xc281, 0xc281, 0xc281, 0xc281, + 0xc281, 0xc281, 0xc281, 0xc281, 0xc281, 0xc480, 0xc281, 0xc48a, + 0xc281, 0x080c, 0x0d79, 0x601c, 0xd0bc, 0x0178, 0xd084, 0x0168, + 0xd0f4, 0x0120, 0xc084, 0x601e, 0x0804, 0xc070, 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, 0xc339, 0x9694, 0xff00, 0x9284, + 0x0c00, 0x0120, 0x7048, 0xb092, 0x704c, 0xb08e, 0x9284, 0x0300, + 0x0904, 0xc339, 0x9686, 0x0100, 0x1130, 0x7064, 0x9005, 0x1118, + 0xc6c4, 0xb676, 0x0c38, 0x080c, 0x104d, 0x090c, 0x0d79, 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, + 0xc7ad, 0x003e, 0xd6cc, 0x01e8, 0x7154, 0xa98a, 0x81ff, 0x01c8, + 0x9192, 0x0021, 0x1260, 0x8304, 0x9098, 0x0018, 0x2011, 0x0029, + 0x080c, 0xc7ad, 0x2011, 0x0205, 0x2013, 0x0000, 0x0050, 0xb068, + 0xd0fc, 0x0120, 0x2009, 0x0020, 0xa98a, 0x0c68, 0x2950, 0x080c, + 0xc74c, 0x080c, 0x1abc, 0x009e, 0x00ee, 0x00ae, 0x007e, 0x0005, + 0x2001, 0x1989, 0x2004, 0x604a, 0x0096, 0x6114, 0x2148, 0xa83c, + 0xa940, 0x9105, 0x1118, 0xa87c, 0xc0dc, 0xa87e, 0x6003, 0x0002, + 0x080c, 0xd383, 0x0904, 0xc47b, 0x604b, 0x0000, 0x6010, 0x00b6, + 0x2058, 0xb800, 0x00be, 0xd0bc, 0x1500, 0xd1cc, 0x0904, 0xc43f, + 0xa978, 0xa868, 0xd0fc, 0x0904, 0xc400, 0x0016, 0xa87c, 0x0006, + 0xa880, 0x0006, 0x00a6, 0x2150, 0xb174, 0x9184, 0x00ff, 0x90b6, + 0x0002, 0x0904, 0xc3cd, 0x9086, 0x0028, 0x1904, 0xc3b9, 0xa87b, + 0x001c, 0xb07b, 0x001c, 0x0804, 0xc3d5, 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, 0x0fff, 0x009e, 0x080c, 0xcf7f, 0x0804, + 0xc47b, 0xd1dc, 0x0158, 0xa87b, 0x0015, 0xb07b, 0x0015, 0x080c, + 0xd220, 0x0118, 0xb174, 0xc1dc, 0xb176, 0x0078, 0xd1d4, 0x0128, + 0xa87b, 0x0007, 0xb07b, 0x0007, 0x0040, 0xa87c, 0xd0ac, 0x0128, + 0xa834, 0xa938, 0x9115, 0x190c, 0xc24b, 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, 0xd300, 0x001e, + 0xa874, 0x0006, 0x2148, 0x080c, 0x0fff, 0x001e, 0x0804, 0xc46c, + 0x0016, 0x00a6, 0x2150, 0xb174, 0x9184, 0x00ff, 0x90b6, 0x0002, + 0x01e0, 0x9086, 0x0028, 0x1128, 0xa87b, 0x001c, 0xb07b, 0x001c, + 0x00e0, 0xd1dc, 0x0158, 0xa87b, 0x0015, 0xb07b, 0x0015, 0x080c, + 0xd220, 0x0118, 0xb174, 0xc1dc, 0xb176, 0x0078, 0xd1d4, 0x0128, + 0xa87b, 0x0007, 0xb07b, 0x0007, 0x0040, 0xa87c, 0xd0ac, 0x0128, + 0xa834, 0xa938, 0x9115, 0x190c, 0xc24b, 0xa890, 0xb092, 0xa88c, + 0xb08e, 0xa87c, 0xb07e, 0x00ae, 0x080c, 0x0fff, 0x009e, 0x080c, + 0xd300, 0xa974, 0x0016, 0x080c, 0xc79d, 0x001e, 0x0468, 0xa867, + 0x0103, 0xa974, 0x9184, 0x00ff, 0x90b6, 0x0002, 0x01b0, 0x9086, + 0x0028, 0x1118, 0xa87b, 0x001c, 0x00d0, 0xd1dc, 0x0148, 0xa87b, + 0x0015, 0x080c, 0xd220, 0x0118, 0xa974, 0xc1dc, 0xa976, 0x0078, + 0xd1d4, 0x0118, 0xa87b, 0x0007, 0x0050, 0xa87b, 0x0000, 0xa87c, + 0xd0ac, 0x0128, 0xa834, 0xa938, 0x9115, 0x190c, 0xc24b, 0xa974, + 0x0016, 0x080c, 0x6d26, 0x001e, 0x6010, 0x00b6, 0x2058, 0xba3c, + 0xb8d0, 0x0016, 0x9005, 0x190c, 0x68ae, 0x001e, 0x00be, 0xd1e4, + 0x1120, 0x080c, 0xaf4e, 0x009e, 0x0005, 0x080c, 0xcf42, 0x0cd8, + 0x6114, 0x0096, 0x2148, 0xa97c, 0x080c, 0xd383, 0x190c, 0x1adc, + 0x009e, 0x0005, 0x0096, 0x6114, 0x2148, 0xa83c, 0xa940, 0x9105, + 0x01e8, 0xa877, 0x0000, 0xa87b, 0x0000, 0xa867, 0x0103, 0x00b6, + 0x6010, 0x2058, 0xa834, 0xa938, 0x9115, 0x11a0, 0x080c, 0x6d26, + 0xba3c, 0x8211, 0x0208, 0xba3e, 0xb8d0, 0x9005, 0x0110, 0x080c, + 0x68ae, 0x080c, 0xaf4e, 0x00be, 0x009e, 0x0005, 0xa87c, 0xc0dc, + 0xa87e, 0x08f8, 0xb800, 0xd0bc, 0x1120, 0xa834, 0x080c, 0xc24b, + 0x0c28, 0xa880, 0xd0bc, 0x1dc8, 0x080c, 0xcf7f, 0x0c60, 0x080c, + 0x97f6, 0x0010, 0x080c, 0x9851, 0x601c, 0xd084, 0x0110, 0x080c, + 0x1af0, 0x080c, 0xcc33, 0x01f0, 0x0096, 0x6114, 0x2148, 0x080c, + 0xce4a, 0x1118, 0x080c, 0xb93c, 0x00a0, 0xa867, 0x0103, 0x2009, + 0x180c, 0x210c, 0xd18c, 0x1198, 0xd184, 0x1170, 0x6108, 0xa97a, + 0x918e, 0x0029, 0x1110, 0x080c, 0xeaee, 0xa877, 0x0000, 0x080c, + 0x6f11, 0x009e, 0x0804, 0xaf89, 0xa87b, 0x0004, 0x0cb0, 0xa87b, + 0x0004, 0x0c98, 0x9182, 0x0057, 0x1220, 0x9182, 0x0040, 0x0208, + 0x000a, 0x0005, 0xc511, 0xc511, 0xc511, 0xc511, 0xc511, 0xc513, + 0xc511, 0xc511, 0xc511, 0xc511, 0xc511, 0xc511, 0xc511, 0xc511, + 0xc511, 0xc511, 0xc511, 0xc511, 0xc511, 0xc511, 0xc537, 0xc511, + 0xc511, 0x080c, 0x0d79, 0x080c, 0x5828, 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, 0x6f11, 0x009e, 0x0804, 0xaf4e, 0x080c, + 0x5828, 0x0dd8, 0x6014, 0x900e, 0x9016, 0x0c10, 0x9182, 0x0085, + 0x0002, 0xc550, 0xc54e, 0xc54e, 0xc55c, 0xc54e, 0xc54e, 0xc54e, + 0xc54e, 0xc54e, 0xc54e, 0xc54e, 0xc54e, 0xc54e, 0x080c, 0x0d79, + 0x6003, 0x0001, 0x6106, 0x0126, 0x2091, 0x8000, 0x2009, 0x8020, + 0x080c, 0x9420, 0x012e, 0x0005, 0x0026, 0x0056, 0x00d6, 0x00e6, + 0x2071, 0x0260, 0x7224, 0x6216, 0x7220, 0x080c, 0xcc21, 0x01f8, + 0x2268, 0x6800, 0x9086, 0x0000, 0x01d0, 0x6010, 0x6d10, 0x952e, + 0x11b0, 0x00c6, 0x2d60, 0x00d6, 0x080c, 0xc80e, 0x00de, 0x00ce, + 0x0158, 0x702c, 0xd084, 0x1118, 0x080c, 0xc7d8, 0x0010, 0x6803, + 0x0002, 0x6007, 0x0086, 0x0028, 0x080c, 0xc7fa, 0x0d90, 0x6007, + 0x0087, 0x6003, 0x0001, 0x2009, 0x8020, 0x080c, 0x9420, 0x7220, + 0x080c, 0xcc21, 0x0178, 0x6810, 0x00b6, 0x2058, 0xb800, 0x00be, + 0xd0bc, 0x0140, 0x6824, 0xd0ec, 0x0128, 0x00c6, 0x2d60, 0x080c, + 0xcf7f, 0x00ce, 0x00ee, 0x00de, 0x005e, 0x002e, 0x0005, 0x9186, + 0x0013, 0x1160, 0x6004, 0x908a, 0x0085, 0x0a0c, 0x0d79, 0x908a, + 0x0092, 0x1a0c, 0x0d79, 0x9082, 0x0085, 0x00e2, 0x9186, 0x0027, + 0x0120, 0x9186, 0x0014, 0x190c, 0x0d79, 0x080c, 0x97f6, 0x0096, + 0x6014, 0x2048, 0x080c, 0xcc33, 0x0140, 0xa867, 0x0103, 0xa877, + 0x0000, 0xa87b, 0x0029, 0x080c, 0x6f11, 0x009e, 0x080c, 0xaf89, + 0x0804, 0x98bc, 0xc5df, 0xc5e1, 0xc5e1, 0xc5df, 0xc5df, 0xc5df, + 0xc5df, 0xc5df, 0xc5df, 0xc5df, 0xc5df, 0xc5df, 0xc5df, 0x080c, + 0x0d79, 0x080c, 0xaf89, 0x0005, 0x9186, 0x0013, 0x1130, 0x6004, + 0x9082, 0x0085, 0x2008, 0x0804, 0xc630, 0x9186, 0x0027, 0x1558, + 0x080c, 0x97f6, 0x080c, 0x32fb, 0x080c, 0xd372, 0x0096, 0x6014, + 0x2048, 0x080c, 0xcc33, 0x0150, 0xa867, 0x0103, 0xa877, 0x0000, + 0xa87b, 0x0029, 0x080c, 0x6f11, 0x080c, 0xce24, 0x009e, 0x080c, + 0xaf4e, 0x0005, 0x9186, 0x0089, 0x0118, 0x9186, 0x008a, 0x1140, + 0x080c, 0xad4d, 0x0128, 0x9086, 0x000c, 0x0904, 0xc668, 0x0000, + 0x080c, 0xb009, 0x0c70, 0x9186, 0x0014, 0x1d60, 0x080c, 0x97f6, + 0x0096, 0x6014, 0x2048, 0x080c, 0xcc33, 0x0d00, 0xa867, 0x0103, + 0xa877, 0x0000, 0xa87b, 0x0006, 0xa880, 0xc0ec, 0xa882, 0x0890, + 0x0002, 0xc640, 0xc63e, 0xc63e, 0xc63e, 0xc63e, 0xc63e, 0xc654, + 0xc63e, 0xc63e, 0xc63e, 0xc63e, 0xc63e, 0xc63e, 0x080c, 0x0d79, + 0x6034, 0x908c, 0xff00, 0x810f, 0x9186, 0x0039, 0x0118, 0x9186, + 0x0035, 0x1118, 0x2001, 0x1987, 0x0010, 0x2001, 0x1988, 0x2004, + 0x601a, 0x6003, 0x000c, 0x0005, 0x6034, 0x908c, 0xff00, 0x810f, + 0x9186, 0x0039, 0x0118, 0x9186, 0x0035, 0x1118, 0x2001, 0x1987, + 0x0010, 0x2001, 0x1988, 0x2004, 0x601a, 0x6003, 0x000e, 0x0005, + 0x9182, 0x0092, 0x1220, 0x9182, 0x0085, 0x0208, 0x0012, 0x0804, + 0xb009, 0xc67e, 0xc67e, 0xc67e, 0xc67e, 0xc680, 0xc6cd, 0xc67e, + 0xc67e, 0xc67e, 0xc67e, 0xc67e, 0xc67e, 0xc67e, 0x080c, 0x0d79, + 0x0096, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x0168, + 0x6034, 0x908c, 0xff00, 0x810f, 0x9186, 0x0039, 0x0118, 0x9186, + 0x0035, 0x1118, 0x009e, 0x0804, 0xc6e1, 0x080c, 0xcc33, 0x1118, + 0x080c, 0xce24, 0x0068, 0x6014, 0x2048, 0x080c, 0xd389, 0x1110, + 0x080c, 0xce24, 0xa867, 0x0103, 0x080c, 0xd33d, 0x080c, 0x6f11, + 0x00d6, 0x2c68, 0x080c, 0xaef8, 0x01d0, 0x6003, 0x0001, 0x6007, + 0x001e, 0x600b, 0xffff, 0x2009, 0x026e, 0x210c, 0x613a, 0x2009, + 0x026f, 0x210c, 0x613e, 0x6910, 0x6112, 0x080c, 0xd0ce, 0x695c, + 0x615e, 0x6023, 0x0001, 0x2009, 0x8020, 0x080c, 0x9420, 0x2d60, + 0x00de, 0x080c, 0xaf4e, 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, 0xd2d3, 0x11f0, 0x080c, 0xaef8, + 0x01d8, 0x6106, 0x6003, 0x0001, 0x6023, 0x0001, 0x6910, 0x6112, + 0x692c, 0x612e, 0x6930, 0x6132, 0x6934, 0x918c, 0x00ff, 0x6136, + 0x6938, 0x613a, 0x693c, 0x613e, 0x695c, 0x615e, 0x080c, 0xd0ce, + 0x2009, 0x8020, 0x080c, 0x9420, 0x2d60, 0x00de, 0x0804, 0xaf4e, + 0x0096, 0x6014, 0x2048, 0x080c, 0xcc33, 0x01c8, 0xa867, 0x0103, + 0xa880, 0xd0b4, 0x0128, 0xc0ec, 0xa882, 0xa87b, 0x0006, 0x0048, + 0xd0bc, 0x0118, 0xa87b, 0x0002, 0x0020, 0xa87b, 0x0005, 0x080c, + 0xcf3e, 0xa877, 0x0000, 0x080c, 0x6f11, 0x080c, 0xce24, 0x009e, + 0x0804, 0xaf4e, 0x0016, 0x0096, 0x6014, 0x2048, 0x080c, 0xcc33, + 0x0140, 0xa867, 0x0103, 0xa87b, 0x0028, 0xa877, 0x0000, 0x080c, + 0x6f11, 0x009e, 0x001e, 0x9186, 0x0013, 0x0158, 0x9186, 0x0014, + 0x0130, 0x9186, 0x0027, 0x0118, 0x080c, 0xb009, 0x0020, 0x080c, + 0x97f6, 0x080c, 0xaf89, 0x0005, 0x0056, 0x0066, 0x0096, 0x00a6, + 0x2029, 0x0001, 0x9182, 0x0101, 0x1208, 0x0010, 0x2009, 0x0100, + 0x2130, 0x8304, 0x9098, 0x0018, 0x2009, 0x0020, 0x2011, 0x0029, + 0x080c, 0xc7ad, 0x96b2, 0x0020, 0xb004, 0x904d, 0x0110, 0x080c, + 0x0fff, 0x080c, 0x104d, 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, 0x6f11, 0x2a48, + 0x0cb8, 0x080c, 0x6f11, 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, 0xcc33, + 0x0150, 0x2001, 0x0006, 0xa980, 0xc1d5, 0x080c, 0x715d, 0x080c, + 0x6f05, 0x080c, 0xce24, 0x009e, 0x080c, 0xaf89, 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, + 0xc860, 0xc860, 0xc85b, 0xc884, 0xc838, 0xc85b, 0xc83a, 0xc85b, + 0xc85b, 0x92df, 0xc85b, 0xc85b, 0xc85b, 0xc838, 0xc838, 0xc838, + 0x080c, 0x0d79, 0x6010, 0x9080, 0x0000, 0x2004, 0xd0bc, 0x190c, + 0xc884, 0x0036, 0x6014, 0x0096, 0x2048, 0xa880, 0x009e, 0xd0cc, + 0x0118, 0x2019, 0x000c, 0x0038, 0xd094, 0x0118, 0x2019, 0x000d, + 0x0010, 0x2019, 0x0010, 0x080c, 0xe28e, 0x6023, 0x0006, 0x6003, + 0x0007, 0x003e, 0x0005, 0x9006, 0x0005, 0x9085, 0x0001, 0x0005, + 0x0096, 0x86ff, 0x11e8, 0x6014, 0x2048, 0x080c, 0xcc33, 0x01d0, + 0x6043, 0xffff, 0xa864, 0x9086, 0x0139, 0x1128, 0xa87b, 0x0005, + 0xa883, 0x0000, 0x0028, 0x900e, 0x2001, 0x0005, 0x080c, 0x715d, + 0x080c, 0xcf3e, 0x080c, 0x6f05, 0x080c, 0xaf89, 0x9085, 0x0001, + 0x009e, 0x0005, 0x9006, 0x0ce0, 0x080c, 0xaaf7, 0x080c, 0xd397, + 0x6000, 0x908a, 0x0010, 0x1a0c, 0x0d79, 0x002b, 0x0106, 0x080c, + 0xab13, 0x010e, 0x0005, 0xc8a3, 0xc8d3, 0xc8a5, 0xc8fa, 0xc8ce, + 0xc8a3, 0xc85b, 0xc860, 0xc860, 0xc85b, 0xc85b, 0xc85b, 0xc85b, + 0xc85b, 0xc85b, 0xc85b, 0x080c, 0x0d79, 0x86ff, 0x1520, 0x6020, + 0x9086, 0x0006, 0x0500, 0x0096, 0x6014, 0x2048, 0x080c, 0xcc33, + 0x0168, 0xa87c, 0xd0cc, 0x0140, 0x0096, 0xc0cc, 0xa87e, 0xa878, + 0x2048, 0x080c, 0x0fff, 0x009e, 0x080c, 0xcf3e, 0x009e, 0x080c, + 0xd317, 0x6007, 0x0085, 0x6003, 0x000b, 0x6023, 0x0002, 0x2009, + 0x8020, 0x080c, 0x9402, 0x9085, 0x0001, 0x0005, 0x0066, 0x080c, + 0x1af0, 0x006e, 0x0890, 0x00e6, 0x2071, 0x19e9, 0x7030, 0x9c06, + 0x1120, 0x080c, 0xa311, 0x00ee, 0x0840, 0x6020, 0x9084, 0x000f, + 0x9086, 0x0006, 0x1150, 0x0086, 0x0096, 0x2049, 0x0001, 0x2c40, + 0x080c, 0xa462, 0x009e, 0x008e, 0x0040, 0x0066, 0x080c, 0xa20d, + 0x190c, 0x0d79, 0x080c, 0xa21b, 0x006e, 0x00ee, 0x1904, 0xc8a5, + 0x0804, 0xc85b, 0x0036, 0x00e6, 0x2071, 0x19e9, 0x704c, 0x9c06, + 0x1138, 0x901e, 0x080c, 0xa391, 0x00ee, 0x003e, 0x0804, 0xc8a5, + 0x080c, 0xa59c, 0x00ee, 0x003e, 0x1904, 0xc8a5, 0x0804, 0xc85b, + 0x00c6, 0x0066, 0x6020, 0x9084, 0x000f, 0x001b, 0x006e, 0x00ce, + 0x0005, 0xc930, 0xc9fe, 0xcb68, 0xc938, 0xaf89, 0xc930, 0xe280, + 0xd37f, 0xc9fe, 0x92a6, 0xcbf4, 0xc929, 0xc929, 0xc929, 0xc929, + 0xc929, 0x080c, 0x0d79, 0x080c, 0xce4a, 0x1110, 0x080c, 0xb93c, + 0x0005, 0x080c, 0x97f6, 0x0804, 0xaf4e, 0x601b, 0x0001, 0x0005, + 0x080c, 0xcc33, 0x0130, 0x6014, 0x0096, 0x2048, 0x2c00, 0xa896, + 0x009e, 0x080c, 0xaaf7, 0x080c, 0xd397, 0x6000, 0x908a, 0x0010, + 0x1a0c, 0x0d79, 0x0013, 0x0804, 0xab13, 0xc95d, 0xc95f, 0xc989, + 0xc99d, 0xc9ca, 0xc95d, 0xc930, 0xc930, 0xc930, 0xc9a4, 0xc9a4, + 0xc95d, 0xc95d, 0xc95d, 0xc95d, 0xc9ae, 0x080c, 0x0d79, 0x00e6, + 0x6014, 0x0096, 0x2048, 0xa880, 0xc0b5, 0xa882, 0x009e, 0x2071, + 0x19e9, 0x7030, 0x9c06, 0x01d0, 0x0066, 0x080c, 0xa20d, 0x190c, + 0x0d79, 0x080c, 0xa21b, 0x006e, 0x080c, 0xd317, 0x6007, 0x0085, + 0x6003, 0x000b, 0x6023, 0x0002, 0x2001, 0x1988, 0x2004, 0x601a, + 0x2009, 0x8020, 0x080c, 0x9402, 0x00ee, 0x0005, 0x601b, 0x0001, + 0x0cd8, 0x0096, 0x6014, 0x2048, 0xa880, 0xc0b5, 0xa882, 0x009e, + 0x080c, 0xd317, 0x6007, 0x0085, 0x6003, 0x000b, 0x6023, 0x0002, + 0x2009, 0x8020, 0x080c, 0x9402, 0x0005, 0x080c, 0xaaf7, 0x080c, + 0xaccf, 0x080c, 0xab13, 0x0c28, 0x0096, 0x601b, 0x0001, 0x6014, + 0x2048, 0xa880, 0xc0b5, 0xa882, 0x009e, 0x0005, 0x080c, 0x5828, + 0x01b8, 0x6014, 0x0096, 0x904d, 0x0190, 0xa864, 0xa867, 0x0103, + 0xa87b, 0x0006, 0x9086, 0x0139, 0x1150, 0xa867, 0x0139, 0xa87b, + 0x0030, 0xa897, 0x4005, 0xa89b, 0x0004, 0x080c, 0x6f11, 0x009e, + 0x0804, 0xaf4e, 0x6014, 0x0096, 0x904d, 0x0558, 0xa97c, 0xd1e4, + 0x1158, 0x611c, 0xd1fc, 0x0528, 0x6110, 0x00b6, 0x2158, 0xb93c, + 0x8109, 0x0208, 0xb93e, 0x00be, 0x080c, 0xab13, 0x2001, 0x180f, + 0x2004, 0xd0c4, 0x0110, 0x009e, 0x0005, 0xa884, 0x009e, 0x8003, + 0x800b, 0x810b, 0x9108, 0x611a, 0x00c6, 0x080c, 0x21a2, 0x00ce, + 0x6000, 0x9086, 0x0004, 0x1120, 0x2009, 0x0048, 0x080c, 0xafec, + 0x0005, 0x009e, 0x080c, 0x1af0, 0x0804, 0xc989, 0x6000, 0x908a, + 0x0010, 0x1a0c, 0x0d79, 0x000b, 0x0005, 0xca15, 0xc935, 0xca17, + 0xca15, 0xca17, 0xca17, 0xc931, 0xca15, 0xc92b, 0xc92b, 0xca15, + 0xca15, 0xca15, 0xca15, 0xca15, 0xca15, 0x080c, 0x0d79, 0x6010, + 0x00b6, 0x2058, 0xb804, 0x9084, 0x00ff, 0x00be, 0x908a, 0x000c, + 0x1a0c, 0x0d79, 0x00b6, 0x0013, 0x00be, 0x0005, 0xca32, 0xcaff, + 0xca34, 0xca74, 0xca34, 0xca74, 0xca34, 0xca42, 0xca32, 0xca74, + 0xca32, 0xca63, 0x080c, 0x0d79, 0x6004, 0x908e, 0x0016, 0x05c0, + 0x908e, 0x0004, 0x05a8, 0x908e, 0x0002, 0x0590, 0x908e, 0x0052, + 0x0904, 0xcafb, 0x6004, 0x080c, 0xce4a, 0x0904, 0xcb18, 0x908e, + 0x0004, 0x1110, 0x080c, 0x332a, 0x908e, 0x0021, 0x0904, 0xcb1c, + 0x908e, 0x0022, 0x0904, 0xcb63, 0x908e, 0x003d, 0x0904, 0xcb1c, + 0x908e, 0x0039, 0x0904, 0xcb20, 0x908e, 0x0035, 0x0904, 0xcb20, + 0x908e, 0x001e, 0x0178, 0x908e, 0x0001, 0x1140, 0x6010, 0x2058, + 0xb804, 0x9084, 0x00ff, 0x9086, 0x0006, 0x0110, 0x080c, 0x32fb, + 0x080c, 0xb93c, 0x0804, 0xaf89, 0x00c6, 0x00d6, 0x6104, 0x9186, + 0x0016, 0x0904, 0xcaec, 0x9186, 0x0002, 0x1904, 0xcac1, 0x2001, + 0x1837, 0x2004, 0xd08c, 0x11c8, 0x080c, 0x769d, 0x11b0, 0x080c, + 0xd35d, 0x0138, 0x080c, 0x76c0, 0x1120, 0x080c, 0x75a6, 0x0804, + 0xcb4c, 0x2001, 0x197e, 0x2003, 0x0001, 0x2001, 0x1800, 0x2003, + 0x0001, 0x080c, 0x75cc, 0x0804, 0xcb4c, 0x6010, 0x2058, 0x2001, + 0x1837, 0x2004, 0xd0ac, 0x1904, 0xcb4c, 0xb8a0, 0x9084, 0xff80, + 0x1904, 0xcb4c, 0xb840, 0x9084, 0x00ff, 0x9005, 0x0190, 0x8001, + 0xb842, 0x6017, 0x0000, 0x6023, 0x0007, 0x601b, 0x0398, 0x604b, + 0x0000, 0x080c, 0xaef8, 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, 0x610b, 0x00ee, + 0x080c, 0xb93c, 0x0030, 0x080c, 0xb93c, 0x080c, 0x32fb, 0x080c, + 0xd372, 0x00e6, 0x0126, 0x2091, 0x8000, 0x080c, 0x332a, 0x012e, + 0x00ee, 0x080c, 0xaf89, 0x0005, 0x2001, 0x0002, 0x080c, 0x66c9, + 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x9427, 0x080c, 0x98bc, + 0x00de, 0x00ce, 0x0c80, 0x080c, 0x332a, 0x0804, 0xca70, 0x00c6, + 0x00d6, 0x6104, 0x9186, 0x0016, 0x0d38, 0x6010, 0x2058, 0xb840, + 0x9084, 0x00ff, 0x9005, 0x0904, 0xcac1, 0x8001, 0xb842, 0x6003, + 0x0001, 0x080c, 0x9427, 0x080c, 0x98bc, 0x00de, 0x00ce, 0x0898, + 0x080c, 0xb93c, 0x0804, 0xca72, 0x080c, 0xb978, 0x0804, 0xca72, + 0x00d6, 0x2c68, 0x6104, 0x080c, 0xd2d3, 0x00de, 0x0118, 0x080c, + 0xaf4e, 0x0408, 0x6004, 0x8007, 0x6134, 0x918c, 0x00ff, 0x9105, + 0x6036, 0x6007, 0x0085, 0x6003, 0x000b, 0x6023, 0x0002, 0x603c, + 0x600a, 0x2001, 0x1988, 0x2004, 0x601a, 0x602c, 0x2c08, 0x2060, + 0x6024, 0xd0b4, 0x0108, 0xc085, 0xc0b5, 0x6026, 0x2160, 0x2009, + 0x8020, 0x080c, 0x9420, 0x0005, 0x00de, 0x00ce, 0x080c, 0xb93c, + 0x080c, 0x32fb, 0x00e6, 0x0126, 0x2091, 0x8000, 0x080c, 0x332a, + 0x6017, 0x0000, 0x6023, 0x0007, 0x601b, 0x0398, 0x604b, 0x0000, + 0x012e, 0x00ee, 0x0005, 0x080c, 0xb38a, 0x1904, 0xcb18, 0x0005, + 0x6000, 0x908a, 0x0010, 0x1a0c, 0x0d79, 0x0096, 0x00d6, 0x001b, + 0x00de, 0x009e, 0x0005, 0xcb83, 0xcb83, 0xcb83, 0xcb83, 0xcb83, + 0xcb83, 0xcb83, 0xcb83, 0xcb83, 0xc930, 0xcb83, 0xc935, 0xcb85, + 0xc935, 0xcb9f, 0xcb83, 0x080c, 0x0d79, 0x6004, 0x9086, 0x008b, + 0x01b0, 0x6034, 0x908c, 0xff00, 0x810f, 0x9186, 0x0035, 0x1130, + 0x602c, 0x9080, 0x0009, 0x200c, 0xc185, 0x2102, 0x6007, 0x008b, + 0x6003, 0x000d, 0x2009, 0x8020, 0x080c, 0x9420, 0x0005, 0x080c, + 0xd351, 0x0118, 0x080c, 0xd364, 0x0010, 0x080c, 0xd372, 0x080c, + 0xce24, 0x080c, 0xcc33, 0x0570, 0x080c, 0x32fb, 0x080c, 0xcc33, + 0x0168, 0x6014, 0x2048, 0xa867, 0x0103, 0xa87b, 0x0006, 0xa877, + 0x0000, 0xa880, 0xc0ed, 0xa882, 0x080c, 0x6f11, 0x2c68, 0x080c, + 0xaef8, 0x0150, 0x6810, 0x6012, 0x080c, 0xd0ce, 0x00c6, 0x2d60, + 0x080c, 0xaf89, 0x00ce, 0x0008, 0x2d60, 0x6017, 0x0000, 0x6023, + 0x0001, 0x6007, 0x0001, 0x6003, 0x0001, 0x080c, 0x9427, 0x080c, + 0x98bc, 0x00c8, 0x080c, 0xd351, 0x0138, 0x6034, 0x9086, 0x4000, + 0x1118, 0x080c, 0x32fb, 0x08d0, 0x6034, 0x908c, 0xff00, 0x810f, + 0x9186, 0x0039, 0x0118, 0x9186, 0x0035, 0x1118, 0x080c, 0x32fb, + 0x0868, 0x080c, 0xaf89, 0x0005, 0x6000, 0x908a, 0x0010, 0x1a0c, + 0x0d79, 0x0002, 0xcc0a, 0xcc0a, 0xcc12, 0xcc0c, 0xcc1c, 0xcc0a, + 0xcc0a, 0xaf89, 0xcc0a, 0xcc0a, 0xcc0a, 0xcc0a, 0xcc0a, 0xcc0a, + 0xcc0a, 0xcc0a, 0x080c, 0x0d79, 0x080c, 0xaaf7, 0x080c, 0xaccf, + 0x080c, 0xab13, 0x6114, 0x0096, 0x2148, 0xa87b, 0x0006, 0x080c, + 0x6f11, 0x009e, 0x0804, 0xaf4e, 0x601c, 0xd084, 0x190c, 0x1af0, + 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, 0x10f8, + 0x000e, 0x009e, 0x0005, 0x00e6, 0x00c6, 0x0036, 0x0006, 0x0126, + 0x2091, 0x8000, 0x2061, 0x1ddc, 0x2071, 0x1800, 0x7354, 0x7074, + 0x9302, 0x1640, 0x6020, 0x9206, 0x11f8, 0x080c, 0xd35d, 0x0180, + 0x9286, 0x0001, 0x1168, 0x6004, 0x9086, 0x0004, 0x1148, 0x080c, + 0x32fb, 0x080c, 0xd372, 0x00c6, 0x080c, 0xaf89, 0x00ce, 0x0060, + 0x080c, 0xd040, 0x0148, 0x080c, 0xce4a, 0x1110, 0x080c, 0xb93c, + 0x00c6, 0x080c, 0xaf4e, 0x00ce, 0x9ce0, 0x001c, 0x7068, 0x9c02, + 0x1208, 0x08a0, 0x012e, 0x000e, 0x003e, 0x00ce, 0x00ee, 0x0005, + 0x00e6, 0x00c6, 0x0016, 0x9188, 0x1000, 0x210c, 0x81ff, 0x0128, + 0x2061, 0x1b3a, 0x6112, 0x080c, 0x32fb, 0x9006, 0x0010, 0x9085, + 0x0001, 0x001e, 0x00ce, 0x00ee, 0x0005, 0x00c6, 0x0126, 0x2091, + 0x8000, 0x080c, 0xaef8, 0x01b0, 0x665e, 0x2b00, 0x6012, 0x080c, + 0x5828, 0x0118, 0x080c, 0xcd66, 0x0168, 0x080c, 0xd0ce, 0x6023, + 0x0003, 0x2009, 0x004b, 0x080c, 0xafec, 0x9085, 0x0001, 0x012e, + 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x00c6, 0x0126, 0x2091, 0x8000, + 0xbaa0, 0x080c, 0xafbf, 0x0580, 0x605f, 0x0000, 0x2b00, 0x6012, + 0x080c, 0xd0ce, 0x6023, 0x0003, 0x0016, 0x080c, 0xaaf7, 0x080c, + 0x95b9, 0x0076, 0x903e, 0x080c, 0x9476, 0x2c08, 0x080c, 0xe465, + 0x007e, 0x080c, 0xab13, 0x001e, 0xd184, 0x0128, 0x080c, 0xaf4e, + 0x9085, 0x0001, 0x0070, 0x080c, 0x5828, 0x0128, 0xd18c, 0x1170, + 0x080c, 0xcd66, 0x0148, 0x2009, 0x004c, 0x080c, 0xafec, 0x9085, + 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x2900, 0x6016, + 0x0c90, 0x2009, 0x004d, 0x0010, 0x2009, 0x004e, 0x00f6, 0x00c6, + 0x0046, 0x0016, 0x080c, 0xaef8, 0x2c78, 0x05a0, 0x7e5e, 0x2b00, + 0x7812, 0x7823, 0x0003, 0x0016, 0x2021, 0x0005, 0x080c, 0xcd78, + 0x001e, 0x9186, 0x004d, 0x0118, 0x9186, 0x004e, 0x0148, 0x2001, + 0x1981, 0x200c, 0xd1fc, 0x0168, 0x2f60, 0x080c, 0xaf4e, 0x00d0, + 0x2001, 0x1980, 0x200c, 0xd1fc, 0x0120, 0x2f60, 0x080c, 0xaf4e, + 0x0088, 0x2f60, 0x080c, 0x5828, 0x0138, 0xd18c, 0x1118, 0x04f1, + 0x0148, 0x0010, 0x2900, 0x7816, 0x001e, 0x0016, 0x080c, 0xafec, + 0x9085, 0x0001, 0x001e, 0x004e, 0x00ce, 0x00fe, 0x0005, 0x00f6, + 0x00c6, 0x0046, 0x080c, 0xaef8, 0x2c78, 0x0508, 0x7e5e, 0x2b00, + 0x7812, 0x7823, 0x0003, 0x0096, 0x2021, 0x0004, 0x0489, 0x009e, + 0x2001, 0x197f, 0x200c, 0xd1fc, 0x0120, 0x2f60, 0x080c, 0xaf4e, + 0x0060, 0x2f60, 0x080c, 0x5828, 0x0120, 0xd18c, 0x1160, 0x0071, + 0x0130, 0x2009, 0x0052, 0x080c, 0xafec, 0x9085, 0x0001, 0x004e, + 0x00ce, 0x00fe, 0x0005, 0x2900, 0x7816, 0x0c98, 0x00c6, 0x080c, + 0x4bc8, 0x00ce, 0x1120, 0x080c, 0xaf4e, 0x9006, 0x0005, 0xa867, + 0x0000, 0xa86b, 0x8000, 0x2900, 0x6016, 0x9085, 0x0001, 0x0005, + 0x0096, 0x0076, 0x0126, 0x2091, 0x8000, 0x080c, 0xaaf7, 0x080c, + 0x6963, 0x0158, 0x2001, 0xcd7f, 0x0006, 0x900e, 0x2400, 0x080c, + 0x715d, 0x080c, 0x6f11, 0x000e, 0x0807, 0x2418, 0x080c, 0x97bc, + 0xbaa0, 0x0086, 0x2041, 0x0001, 0x2039, 0x0001, 0x2608, 0x080c, + 0x95d3, 0x008e, 0x080c, 0x9476, 0x2f08, 0x2648, 0x080c, 0xe465, + 0xb93c, 0x81ff, 0x090c, 0x96ac, 0x080c, 0xab13, 0x012e, 0x007e, + 0x009e, 0x0005, 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, 0xaef8, + 0x0190, 0x660a, 0x2b08, 0x6112, 0x080c, 0xd0ce, 0x6023, 0x0001, + 0x2900, 0x6016, 0x2009, 0x001f, 0x080c, 0xafec, 0x9085, 0x0001, + 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x00c6, 0x0126, 0x2091, + 0x8000, 0x080c, 0xafbf, 0x01b8, 0x660a, 0x2b08, 0x6112, 0x080c, + 0xd0ce, 0x6023, 0x0008, 0x2900, 0x6016, 0x00f6, 0x2c78, 0x080c, + 0x17a1, 0x00fe, 0x2009, 0x0021, 0x080c, 0xafec, 0x9085, 0x0001, + 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x2009, 0x003d, 0x00c6, + 0x0126, 0x0016, 0x2091, 0x8000, 0x080c, 0xaef8, 0x0198, 0x660a, + 0x2b08, 0x6112, 0x080c, 0xd0ce, 0x6023, 0x0001, 0x2900, 0x6016, + 0x001e, 0x0016, 0x080c, 0xafec, 0x9085, 0x0001, 0x001e, 0x012e, + 0x00ce, 0x0005, 0x9006, 0x0cd0, 0x00c6, 0x0126, 0x2091, 0x8000, + 0x080c, 0xafbf, 0x0188, 0x2b08, 0x6112, 0x080c, 0xd0ce, 0x6023, + 0x0001, 0x2900, 0x6016, 0x2009, 0x0000, 0x080c, 0xafec, 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, 0xcc33, 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, 0xafbf, 0x0198, 0x2b08, 0x6112, 0x080c, 0xd0ce, 0x6023, + 0x0001, 0x2900, 0x6016, 0x080c, 0x32fb, 0x2009, 0x0028, 0x080c, + 0xafec, 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, + 0x9186, 0x0015, 0x11a8, 0x2011, 0x1824, 0x2204, 0x9086, 0x0074, + 0x1178, 0x00b6, 0x080c, 0xbb92, 0x00be, 0x080c, 0xbdb7, 0x6003, + 0x0001, 0x6007, 0x0029, 0x080c, 0x9427, 0x080c, 0x98bc, 0x0078, + 0x6014, 0x0096, 0x2048, 0xa868, 0x009e, 0xd0fc, 0x0148, 0x2001, + 0x0001, 0x080c, 0xd294, 0x080c, 0xb93c, 0x080c, 0xaf4e, 0x0005, + 0x0096, 0x6014, 0x904d, 0x090c, 0x0d79, 0xa87b, 0x0030, 0xa883, + 0x0000, 0xa897, 0x4005, 0xa89b, 0x0004, 0xa867, 0x0139, 0x0126, + 0x2091, 0x8000, 0x080c, 0x6f11, 0x012e, 0x009e, 0x080c, 0xaf4e, + 0x0c30, 0x0096, 0x9186, 0x0016, 0x1128, 0x2001, 0x0004, 0x080c, + 0x66c9, 0x00e8, 0x9186, 0x0015, 0x1510, 0x2011, 0x1824, 0x2204, + 0x9086, 0x0014, 0x11e0, 0x6010, 0x00b6, 0x2058, 0x080c, 0x681e, + 0x00be, 0x080c, 0xbe8d, 0x1198, 0x6010, 0x00b6, 0x2058, 0xb890, + 0x00be, 0x9005, 0x0160, 0x2001, 0x0006, 0x080c, 0x66c9, 0x6014, + 0x2048, 0xa868, 0xd0fc, 0x0170, 0x080c, 0xb35e, 0x0048, 0x6014, + 0x2048, 0xa868, 0xd0fc, 0x0528, 0x080c, 0xb93c, 0x080c, 0xaf4e, + 0x009e, 0x0005, 0x6014, 0x6310, 0x2358, 0x904d, 0x090c, 0x0d79, + 0xa87b, 0x0000, 0xa883, 0x0000, 0xa897, 0x4000, 0x900e, 0x080c, + 0x6a74, 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d, 0xa99a, + 0x0126, 0x2091, 0x8000, 0x080c, 0x6f11, 0x012e, 0x080c, 0xaf4e, + 0x08f8, 0x6014, 0x904d, 0x090c, 0x0d79, 0xa87b, 0x0030, 0xa883, + 0x0000, 0xa897, 0x4005, 0xa89b, 0x0004, 0xa867, 0x0139, 0x0126, + 0x2091, 0x8000, 0x080c, 0x6f11, 0x012e, 0x080c, 0xaf4e, 0x0840, + 0xa878, 0x9086, 0x0005, 0x1108, 0x0009, 0x0005, 0xa880, 0xc0ad, + 0xa882, 0x0005, 0x604b, 0x0000, 0x6017, 0x0000, 0x6003, 0x0001, + 0x6007, 0x0050, 0x2009, 0x8023, 0x080c, 0x9420, 0x0005, 0x00c6, + 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x0130, 0x0066, + 0x6020, 0x9084, 0x000f, 0x001b, 0x006e, 0x00ce, 0x0005, 0xc930, + 0xcf71, 0xcf71, 0xcf74, 0xe7e4, 0xe7ff, 0xe802, 0xc930, 0xc930, + 0xc930, 0xc930, 0xc930, 0xc930, 0xc930, 0xc930, 0xc930, 0x080c, + 0x0d79, 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, 0xaef8, 0x0508, + 0x7810, 0x6012, 0x080c, 0xd0ce, 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, 0x9420, 0x2f60, 0x00fe, + 0x0005, 0x2f60, 0x00fe, 0x2001, 0x1989, 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, 0x0fff, 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, 0x9420, 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, 0x1983, 0x200c, + 0x8000, 0x2014, 0x2001, 0x0032, 0x080c, 0x9364, 0x2001, 0x1987, + 0x82ff, 0x1110, 0x2011, 0x0014, 0x2202, 0x2001, 0x1985, 0x200c, + 0x8000, 0x2014, 0x2071, 0x196d, 0x711a, 0x721e, 0x2001, 0x0064, + 0x080c, 0x9364, 0x2001, 0x1988, 0x82ff, 0x1110, 0x2011, 0x0014, + 0x2202, 0x2001, 0x1989, 0x9288, 0x000a, 0x2102, 0x2001, 0x0017, + 0x080c, 0xaae8, 0x2001, 0x1a91, 0x2102, 0x2001, 0x0032, 0x080c, + 0x16ad, 0x080c, 0x6bae, 0x00ee, 0x003e, 0x002e, 0x001e, 0x000e, + 0x0005, 0x0006, 0x0016, 0x00e6, 0x2001, 0x1987, 0x2003, 0x0028, + 0x2001, 0x1988, 0x2003, 0x0014, 0x2071, 0x196d, 0x701b, 0x0000, + 0x701f, 0x07d0, 0x2001, 0x1989, 0x2009, 0x001e, 0x2102, 0x2001, + 0x0017, 0x080c, 0xaae8, 0x2001, 0x1a91, 0x2102, 0x2001, 0x0032, + 0x080c, 0x16ad, 0x00ee, 0x001e, 0x000e, 0x0005, 0x0096, 0x6060, + 0x904d, 0x0110, 0x080c, 0x107f, 0x009e, 0x0005, 0x0005, 0x00c6, + 0x0126, 0x2091, 0x8000, 0x080c, 0xaef8, 0x0180, 0x2b08, 0x6112, + 0x0ca9, 0x6023, 0x0001, 0x2900, 0x6016, 0x2009, 0x0033, 0x080c, + 0xafec, 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, 0x998c, + 0x01d8, 0x707c, 0xaa50, 0x9206, 0x1160, 0x7080, 0xaa54, 0x9206, + 0x1140, 0x6210, 0x00b6, 0x2258, 0xbaa0, 0x00be, 0x900e, 0x080c, + 0x334a, 0x080c, 0xb35e, 0x0020, 0x080c, 0xb93c, 0x080c, 0xaf4e, + 0x00fe, 0x00ee, 0x009e, 0x0005, 0x7060, 0xaa54, 0x9206, 0x0d48, + 0x0c80, 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, 0xaef8, 0x0188, + 0x2b08, 0x6112, 0x080c, 0xd0ce, 0x6023, 0x0001, 0x2900, 0x6016, + 0x2009, 0x004d, 0x080c, 0xafec, 0x9085, 0x0001, 0x012e, 0x00ce, + 0x0005, 0x9006, 0x0cd8, 0x00c6, 0x0126, 0x2091, 0x8000, 0x0016, + 0x080c, 0xaef8, 0x0180, 0x2b08, 0x6112, 0x080c, 0xd0ce, 0x6023, + 0x0001, 0x2900, 0x6016, 0x001e, 0x080c, 0xafec, 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, 0x19a2, 0x2003, + 0x0000, 0x6014, 0x2048, 0xa830, 0x20a8, 0x8906, 0x8006, 0x8007, + 0x9094, 0x003f, 0x22e8, 0x9084, 0xffc0, 0x9080, 0x001b, 0x20a0, + 0x2001, 0x19a2, 0x0016, 0x200c, 0x080c, 0xd9b7, 0x001e, 0xa804, + 0x9005, 0x0110, 0x2048, 0x0c38, 0x6014, 0x2048, 0xa867, 0x0103, + 0x0010, 0x080c, 0xb93c, 0x080c, 0xaf4e, 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, 0x998c, + 0x01a8, 0x707c, 0xaa74, 0x9206, 0x1130, 0x7080, 0xaa78, 0x9206, + 0x1110, 0x080c, 0x32fb, 0x080c, 0xb35e, 0x0020, 0x080c, 0xb93c, + 0x080c, 0xaf4e, 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, 0x998c, 0x05f0, 0x707c, 0xaacc, 0x9206, + 0x1180, 0x7080, 0xaad0, 0x9206, 0x1160, 0x080c, 0x32fb, 0x0016, + 0xa998, 0xaab0, 0x9284, 0x1000, 0xc0fd, 0x080c, 0x57c9, 0x001e, + 0x0010, 0x080c, 0x55ac, 0x080c, 0xcc33, 0x0508, 0xa87b, 0x0000, + 0xa883, 0x0000, 0xa897, 0x4000, 0x0080, 0x080c, 0xcc33, 0x01b8, + 0x6014, 0x2048, 0x080c, 0x55ac, 0x1d70, 0xa87b, 0x0030, 0xa883, + 0x0000, 0xa897, 0x4005, 0xa89b, 0x0004, 0x0126, 0x2091, 0x8000, + 0xa867, 0x0139, 0x080c, 0x6f11, 0x012e, 0x080c, 0xaf4e, 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, 0xcc33, 0x0904, 0xd290, 0x0096, 0x6314, + 0x2348, 0xa87a, 0xa982, 0x929e, 0x4000, 0x1580, 0x6310, 0x00c6, + 0x2358, 0x2009, 0x0000, 0xa868, 0xd0f4, 0x1140, 0x080c, 0x6a74, + 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d, 0xaa96, 0xa99a, + 0x20a9, 0x0004, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0031, 0x20a0, + 0xb8c4, 0x20e0, 0xb8c8, 0x9080, 0x0006, 0x2098, 0x080c, 0x0fca, + 0x20a9, 0x0004, 0xa85c, 0x9080, 0x0035, 0x20a0, 0xb8c8, 0x9080, + 0x000a, 0x2098, 0x080c, 0x0fca, 0x00ce, 0x0090, 0xaa96, 0x3918, + 0x9398, 0x0007, 0x231c, 0x6004, 0x9086, 0x0016, 0x0110, 0xa89b, + 0x0004, 0xaba2, 0x6310, 0x2358, 0xb804, 0x9084, 0x00ff, 0xa89e, + 0xa868, 0xc0f4, 0xa86a, 0x080c, 0x6f05, 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, + 0x26a1, 0x2118, 0x831f, 0x939c, 0xff00, 0x7838, 0x9084, 0x00ff, + 0x931d, 0x7c3c, 0x2011, 0x8018, 0x080c, 0x4c28, 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, 0xcc21, 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, 0xc24b, 0x0005, 0x0036, + 0x2019, 0x0001, 0x0010, 0x0036, 0x901e, 0x0499, 0x01e0, 0x080c, + 0xcc33, 0x01c8, 0x080c, 0xce24, 0x6037, 0x4000, 0x6014, 0x6017, + 0x0000, 0x0096, 0x2048, 0xa87c, 0x080c, 0xce4a, 0x1118, 0x080c, + 0xb93c, 0x0040, 0xa867, 0x0103, 0xa877, 0x0000, 0x83ff, 0x1129, + 0x080c, 0x6f11, 0x009e, 0x003e, 0x0005, 0xa880, 0xd0b4, 0x0128, + 0xa87b, 0x0006, 0xc0ec, 0xa882, 0x0048, 0xd0bc, 0x0118, 0xa87b, + 0x0002, 0x0020, 0xa87b, 0x0005, 0x080c, 0xcf3e, 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, 0x4ddf, 0x004e, + 0x003e, 0x0005, 0x0c51, 0x1d81, 0x0005, 0x2001, 0x1987, 0x2004, + 0x601a, 0x0005, 0x2001, 0x1989, 0x2004, 0x604a, 0x0005, 0x080c, + 0xaf4e, 0x0804, 0x98bc, 0x611c, 0xd1fc, 0xa97c, 0x1108, 0xd1e4, + 0x0005, 0x601c, 0xd0fc, 0xa87c, 0x1108, 0xd0e4, 0x0005, 0x601c, + 0xd0fc, 0xc0fc, 0x601e, 0xa87c, 0x1108, 0xd0e4, 0x0005, 0x6044, + 0xd0fc, 0x1138, 0xd0bc, 0x0198, 0xc0bc, 0x6046, 0x6003, 0x0002, + 0x0070, 0xd0ac, 0x1160, 0xd0dc, 0x1128, 0x908c, 0x000f, 0x9186, + 0x0005, 0x1118, 0x6003, 0x0003, 0x0010, 0x6003, 0x0001, 0x0005, + 0x00b6, 0x0066, 0x6000, 0x90b2, 0x0010, 0x1a0c, 0x0d79, 0x001b, + 0x006e, 0x00be, 0x0005, 0xd3cb, 0xdb14, 0xdc78, 0xd3cb, 0xd3cb, + 0xd3cb, 0xd3cb, 0xd3cb, 0xd402, 0xdcfc, 0xd3cb, 0xd3cb, 0xd3cb, + 0xd3cb, 0xd3cb, 0xd3cb, 0x080c, 0x0d79, 0x0066, 0x6000, 0x90b2, + 0x0010, 0x1a0c, 0x0d79, 0x0013, 0x006e, 0x0005, 0xd3e6, 0xe21d, + 0xd3e6, 0xd3e6, 0xd3e6, 0xd3e6, 0xd3e6, 0xd3e6, 0xe1cc, 0xe26f, + 0xd3e6, 0xe91f, 0xe953, 0xe91f, 0xe953, 0xd3e6, 0x080c, 0x0d79, + 0x6000, 0x9082, 0x0010, 0x1a0c, 0x0d79, 0x6000, 0x000a, 0x0005, + 0xd400, 0xded9, 0xdfa4, 0xdfc7, 0xe043, 0xd400, 0xe13e, 0xe0cb, + 0xdd06, 0xe1a4, 0xe1b9, 0xd400, 0xd400, 0xd400, 0xd400, 0xd400, + 0x080c, 0x0d79, 0x91b2, 0x0053, 0x1a0c, 0x0d79, 0x2100, 0x91b2, + 0x0040, 0x1a04, 0xd886, 0x0002, 0xd44c, 0xd654, 0xd44c, 0xd44c, + 0xd44c, 0xd65d, 0xd44c, 0xd44c, 0xd44c, 0xd44c, 0xd44c, 0xd44c, + 0xd44c, 0xd44c, 0xd44c, 0xd44c, 0xd44c, 0xd44c, 0xd44c, 0xd44c, + 0xd44c, 0xd44c, 0xd44c, 0xd44e, 0xd4b5, 0xd4c4, 0xd528, 0xd553, + 0xd5cc, 0xd63f, 0xd44c, 0xd44c, 0xd660, 0xd44c, 0xd44c, 0xd675, + 0xd682, 0xd44c, 0xd44c, 0xd44c, 0xd44c, 0xd44c, 0xd728, 0xd44c, + 0xd44c, 0xd73c, 0xd44c, 0xd44c, 0xd6f7, 0xd44c, 0xd44c, 0xd44c, + 0xd754, 0xd44c, 0xd44c, 0xd44c, 0xd7d1, 0xd44c, 0xd44c, 0xd44c, + 0xd44c, 0xd44c, 0xd44c, 0xd84e, 0x080c, 0x0d79, 0x080c, 0x6b8b, + 0x1150, 0x2001, 0x1837, 0x2004, 0xd0cc, 0x1128, 0x9084, 0x0009, + 0x9086, 0x0008, 0x1140, 0x6007, 0x0009, 0x602f, 0x0009, 0x6017, + 0x0000, 0x0804, 0xd64d, 0x080c, 0x6b27, 0x00e6, 0x00c6, 0x0036, + 0x0026, 0x0016, 0x6210, 0x2258, 0xbaa0, 0x0026, 0x2019, 0x0029, + 0x080c, 0xaaf7, 0x080c, 0x95b9, 0x0076, 0x903e, 0x080c, 0x9476, + 0x2c08, 0x080c, 0xe465, 0x007e, 0x001e, 0x080c, 0xab13, 0x001e, + 0x002e, 0x003e, 0x00ce, 0x00ee, 0x6610, 0x2658, 0x080c, 0x6792, + 0xbe04, 0x9684, 0x00ff, 0x9082, 0x0006, 0x1268, 0x0016, 0x0026, + 0x6210, 0x00b6, 0x2258, 0xbaa0, 0x00be, 0x2c08, 0x080c, 0xeb7e, + 0x002e, 0x001e, 0x1178, 0x080c, 0xe393, 0x1904, 0xd520, 0x080c, + 0xe32f, 0x1120, 0x6007, 0x0008, 0x0804, 0xd64d, 0x6007, 0x0009, + 0x0804, 0xd64d, 0x080c, 0xe60d, 0x0128, 0x080c, 0xe393, 0x0d78, + 0x0804, 0xd520, 0x6017, 0x1900, 0x0c88, 0x080c, 0x3432, 0x1904, + 0xd883, 0x6106, 0x080c, 0xe2cf, 0x6007, 0x0006, 0x0804, 0xd64d, + 0x6007, 0x0007, 0x0804, 0xd64d, 0x080c, 0xe98f, 0x1904, 0xd883, + 0x080c, 0x3432, 0x1904, 0xd883, 0x00d6, 0x6610, 0x2658, 0xbe04, + 0x9684, 0x00ff, 0x9082, 0x0006, 0x1220, 0x2001, 0x0001, 0x080c, + 0x66b5, 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, 0xe3fb, + 0x1190, 0x9686, 0x0006, 0x1140, 0x0026, 0x6210, 0x2258, 0xbaa0, + 0x900e, 0x080c, 0x334a, 0x002e, 0x080c, 0x681e, 0x6007, 0x000a, + 0x00de, 0x0804, 0xd64d, 0x6007, 0x000b, 0x00de, 0x0804, 0xd64d, + 0x080c, 0x32fb, 0x080c, 0xd372, 0x6007, 0x0001, 0x0804, 0xd64d, + 0x080c, 0xe98f, 0x1904, 0xd883, 0x080c, 0x3432, 0x1904, 0xd883, + 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, 0x334a, 0x002e, 0x6007, 0x000c, 0x2001, 0x0001, 0x080c, + 0xeb5d, 0x0804, 0xd64d, 0x080c, 0x6b8b, 0x1140, 0x2001, 0x1837, + 0x2004, 0x9084, 0x0009, 0x9086, 0x0008, 0x1110, 0x0804, 0xd45b, + 0x080c, 0x6b27, 0x6610, 0x2658, 0xbe04, 0x9684, 0x00ff, 0x9082, + 0x0006, 0x06c8, 0x1138, 0x0026, 0x2001, 0x0006, 0x080c, 0x66f5, + 0x002e, 0x0050, 0x96b4, 0xff00, 0x8637, 0x9686, 0x0004, 0x0120, + 0x9686, 0x0006, 0x1904, 0xd520, 0x080c, 0xe408, 0x1120, 0x6007, + 0x000e, 0x0804, 0xd64d, 0x0046, 0x6410, 0x2458, 0xbca0, 0x0046, + 0x080c, 0x32fb, 0x080c, 0xd372, 0x004e, 0x0016, 0x9006, 0x2009, + 0x1848, 0x210c, 0xd1a4, 0x0148, 0x2009, 0x0029, 0x080c, 0xe795, + 0x6010, 0x2058, 0xb800, 0xc0e5, 0xb802, 0x001e, 0x004e, 0x6007, + 0x0001, 0x0804, 0xd64d, 0x2001, 0x0001, 0x080c, 0x66b5, 0x0156, + 0x0016, 0x0026, 0x0036, 0x20a9, 0x0004, 0x2019, 0x1805, 0x2011, + 0x0270, 0x080c, 0xbf40, 0x003e, 0x002e, 0x001e, 0x015e, 0x9005, + 0x0168, 0x96b4, 0xff00, 0x8637, 0x9682, 0x0004, 0x0a04, 0xd520, + 0x9682, 0x0007, 0x0a04, 0xd57c, 0x0804, 0xd520, 0x6017, 0x1900, + 0x6007, 0x0009, 0x0804, 0xd64d, 0x080c, 0x6b8b, 0x1140, 0x2001, + 0x1837, 0x2004, 0x9084, 0x0009, 0x9086, 0x0008, 0x1110, 0x0804, + 0xd45b, 0x080c, 0x6b27, 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, 0xd520, 0x080c, 0xe436, 0x1138, 0x080c, 0xe32f, + 0x1120, 0x6007, 0x0010, 0x0804, 0xd64d, 0x0046, 0x6410, 0x2458, + 0xbca0, 0x0046, 0x080c, 0x32fb, 0x080c, 0xd372, 0x004e, 0x0016, + 0x9006, 0x2009, 0x1848, 0x210c, 0xd1a4, 0x0148, 0x2009, 0x0029, + 0x080c, 0xe795, 0x6010, 0x2058, 0xb800, 0xc0e5, 0xb802, 0x001e, + 0x004e, 0x6007, 0x0001, 0x0448, 0x080c, 0xe60d, 0x0198, 0x0016, + 0x968c, 0x00ff, 0x9186, 0x0002, 0x0160, 0x9186, 0x0003, 0x0148, + 0x001e, 0x96b4, 0xff00, 0x8637, 0x9686, 0x0006, 0x0920, 0x0804, + 0xd520, 0x001e, 0x6017, 0x1900, 0x6007, 0x0009, 0x0070, 0x080c, + 0x3432, 0x1904, 0xd883, 0x080c, 0xe98f, 0x1904, 0xd883, 0x080c, + 0xda54, 0x1904, 0xd520, 0x6007, 0x0012, 0x6003, 0x0001, 0x080c, + 0x9427, 0x080c, 0x98bc, 0x0005, 0x6007, 0x0001, 0x6003, 0x0001, + 0x080c, 0x9427, 0x080c, 0x98bc, 0x0cb0, 0x6007, 0x0005, 0x0c68, + 0x080c, 0xe98f, 0x1904, 0xd883, 0x080c, 0x3432, 0x1904, 0xd883, + 0x080c, 0xda54, 0x1904, 0xd520, 0x6007, 0x0020, 0x6003, 0x0001, + 0x080c, 0x9427, 0x080c, 0x98bc, 0x0005, 0x080c, 0x3432, 0x1904, + 0xd883, 0x6007, 0x0023, 0x6003, 0x0001, 0x080c, 0x9427, 0x080c, + 0x98bc, 0x0005, 0x080c, 0xe98f, 0x1904, 0xd883, 0x080c, 0x3432, + 0x1904, 0xd883, 0x080c, 0xda54, 0x1904, 0xd520, 0x0016, 0x0026, + 0x00e6, 0x2071, 0x0260, 0x2c08, 0x2011, 0x1820, 0x2214, 0x703c, + 0x9206, 0x11e0, 0x2011, 0x181f, 0x2214, 0x7038, 0x9084, 0x00ff, + 0x9206, 0x11a0, 0x7240, 0x080c, 0xcc21, 0x0570, 0x2260, 0x6008, + 0x9086, 0xffff, 0x0120, 0x7244, 0x6008, 0x9206, 0x1528, 0x6020, + 0x9086, 0x0007, 0x1508, 0x080c, 0xaf4e, 0x04a0, 0x7244, 0x9286, + 0xffff, 0x0180, 0x2c08, 0x080c, 0xcc21, 0x01b0, 0x2260, 0x7240, + 0x6008, 0x9206, 0x1188, 0x6010, 0x9190, 0x0004, 0x2214, 0x9206, + 0x01b8, 0x0050, 0x7240, 0x2c08, 0x9006, 0x080c, 0xe75f, 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, 0xaf4e, 0x2160, 0x6007, 0x0025, 0x6003, 0x0001, 0x080c, + 0x9427, 0x080c, 0x98bc, 0x00ee, 0x002e, 0x001e, 0x0005, 0x2001, + 0x0001, 0x080c, 0x66b5, 0x0156, 0x0016, 0x0026, 0x0036, 0x20a9, + 0x0004, 0x2019, 0x1805, 0x2011, 0x0276, 0x080c, 0xbf40, 0x003e, + 0x002e, 0x001e, 0x015e, 0x0120, 0x6007, 0x0031, 0x0804, 0xd64d, + 0x080c, 0xbbaa, 0x080c, 0x769d, 0x1190, 0x0006, 0x0026, 0x0036, + 0x080c, 0x76b7, 0x1138, 0x080c, 0x799f, 0x080c, 0x6178, 0x080c, + 0x75cc, 0x0010, 0x080c, 0x7671, 0x003e, 0x002e, 0x000e, 0x0005, + 0x080c, 0x3432, 0x1904, 0xd883, 0x080c, 0xda54, 0x1904, 0xd520, + 0x6106, 0x080c, 0xda70, 0x1120, 0x6007, 0x002b, 0x0804, 0xd64d, + 0x6007, 0x002c, 0x0804, 0xd64d, 0x080c, 0xe98f, 0x1904, 0xd883, + 0x080c, 0x3432, 0x1904, 0xd883, 0x080c, 0xda54, 0x1904, 0xd520, + 0x6106, 0x080c, 0xda75, 0x1120, 0x6007, 0x002e, 0x0804, 0xd64d, + 0x6007, 0x002f, 0x0804, 0xd64d, 0x080c, 0x3432, 0x1904, 0xd883, + 0x00e6, 0x00d6, 0x00c6, 0x6010, 0x2058, 0xb904, 0x9184, 0x00ff, + 0x9086, 0x0006, 0x0158, 0x9184, 0xff00, 0x8007, 0x9086, 0x0006, + 0x0128, 0x00ce, 0x00de, 0x00ee, 0x0804, 0xd654, 0x080c, 0x5824, + 0xd0e4, 0x0904, 0xd7ce, 0x2071, 0x026c, 0x7010, 0x603a, 0x7014, + 0x603e, 0x7108, 0x720c, 0x080c, 0x6bc9, 0x0140, 0x6010, 0x2058, + 0xb810, 0x9106, 0x1118, 0xb814, 0x9206, 0x0510, 0x080c, 0x6bc5, + 0x15b8, 0x2069, 0x1800, 0x6880, 0x9206, 0x1590, 0x687c, 0x9106, + 0x1578, 0x7210, 0x080c, 0xcc21, 0x0590, 0x080c, 0xd941, 0x0578, + 0x080c, 0xe811, 0x0560, 0x622e, 0x6007, 0x0036, 0x6003, 0x0001, + 0x2009, 0x8020, 0x080c, 0x9420, 0x00ce, 0x00de, 0x00ee, 0x0005, + 0x7214, 0x9286, 0xffff, 0x0150, 0x080c, 0xcc21, 0x01c0, 0x9280, + 0x0002, 0x2004, 0x7110, 0x9106, 0x1190, 0x08e0, 0x7210, 0x2c08, + 0x9085, 0x0001, 0x080c, 0xe75f, 0x2c10, 0x2160, 0x0140, 0x0890, + 0x6007, 0x0037, 0x602f, 0x0009, 0x6017, 0x1500, 0x08b8, 0x6007, + 0x0037, 0x602f, 0x0003, 0x6017, 0x1700, 0x0880, 0x6007, 0x0012, + 0x0868, 0x080c, 0x3432, 0x1904, 0xd883, 0x6010, 0x2058, 0xb804, + 0x9084, 0xff00, 0x8007, 0x9086, 0x0006, 0x1904, 0xd654, 0x00e6, + 0x00d6, 0x00c6, 0x080c, 0x5824, 0xd0e4, 0x0904, 0xd846, 0x2069, + 0x1800, 0x2071, 0x026c, 0x7008, 0x603a, 0x720c, 0x623e, 0x9286, + 0xffff, 0x1150, 0x7208, 0x00c6, 0x2c08, 0x9085, 0x0001, 0x080c, + 0xe75f, 0x2c10, 0x00ce, 0x05e8, 0x080c, 0xcc21, 0x05d0, 0x7108, + 0x9280, 0x0002, 0x2004, 0x9106, 0x15a0, 0x00c6, 0x0026, 0x2260, + 0x080c, 0xc80e, 0x002e, 0x00ce, 0x7118, 0x918c, 0xff00, 0x810f, + 0x9186, 0x0001, 0x0178, 0x9186, 0x0005, 0x0118, 0x9186, 0x0007, + 0x1198, 0x9280, 0x0005, 0x2004, 0x9005, 0x0170, 0x080c, 0xd941, + 0x0904, 0xd7c7, 0x0056, 0x7510, 0x7614, 0x080c, 0xe82a, 0x005e, + 0x00ce, 0x00de, 0x00ee, 0x0005, 0x6007, 0x003b, 0x602f, 0x0009, + 0x6017, 0x2a00, 0x6003, 0x0001, 0x2009, 0x8020, 0x080c, 0x9420, + 0x0c78, 0x6007, 0x003b, 0x602f, 0x0003, 0x6017, 0x0300, 0x6003, + 0x0001, 0x2009, 0x8020, 0x080c, 0x9420, 0x0c10, 0x6007, 0x003b, + 0x602f, 0x000b, 0x6017, 0x0000, 0x0804, 0xd79e, 0x00e6, 0x0026, + 0x080c, 0x6b8b, 0x0550, 0x080c, 0x6b27, 0x080c, 0xea00, 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, + 0x6bc9, 0x0120, 0x2011, 0x1a0b, 0x2013, 0x07d0, 0xd0ac, 0x1128, + 0x080c, 0x30c8, 0x0010, 0x080c, 0xea34, 0x002e, 0x00ee, 0x080c, + 0xaf4e, 0x0804, 0xd653, 0x080c, 0xaf4e, 0x0005, 0x2600, 0x0002, + 0xd89a, 0xd8c8, 0xd8d9, 0xd89a, 0xd89a, 0xd89c, 0xd8ea, 0xd89a, + 0xd89a, 0xd89a, 0xd8b6, 0xd89a, 0xd89a, 0xd89a, 0xd8f5, 0xd90b, + 0xd93c, 0xd89a, 0x080c, 0x0d79, 0x080c, 0xe98f, 0x1d20, 0x080c, + 0x3432, 0x1d08, 0x7038, 0x6016, 0x6007, 0x0045, 0x6003, 0x0001, + 0x080c, 0x9427, 0x0005, 0x080c, 0x32fb, 0x080c, 0xd372, 0x6007, + 0x0001, 0x6003, 0x0001, 0x080c, 0x9427, 0x0005, 0x080c, 0xe98f, + 0x1950, 0x080c, 0x3432, 0x1938, 0x080c, 0xda54, 0x1d60, 0x703c, + 0x6016, 0x6007, 0x004a, 0x6003, 0x0001, 0x080c, 0x9427, 0x0005, + 0x080c, 0x3432, 0x1904, 0xd883, 0x2009, 0x0041, 0x080c, 0xea3d, + 0x6007, 0x0047, 0x6003, 0x0001, 0x080c, 0x9427, 0x080c, 0x98bc, + 0x0005, 0x080c, 0x3432, 0x1904, 0xd883, 0x2009, 0x0042, 0x080c, + 0xea3d, 0x6007, 0x0047, 0x6003, 0x0001, 0x080c, 0x9427, 0x080c, + 0x98bc, 0x0005, 0x080c, 0x3432, 0x1904, 0xd883, 0x2009, 0x0046, + 0x080c, 0xea3d, 0x080c, 0xaf4e, 0x0005, 0x2001, 0x1824, 0x2004, + 0x9082, 0x00e1, 0x1268, 0x080c, 0xd95e, 0x0904, 0xd883, 0x6007, + 0x004e, 0x6003, 0x0001, 0x080c, 0x9427, 0x080c, 0x98bc, 0x0005, + 0x6007, 0x0012, 0x0cb0, 0x6007, 0x004f, 0x6017, 0x0000, 0x7134, + 0x918c, 0x00ff, 0x81ff, 0x0508, 0x9186, 0x0001, 0x1160, 0x7140, + 0x2001, 0x19bf, 0x2004, 0x9106, 0x11b0, 0x7144, 0x2001, 0x19c0, + 0x2004, 0x9106, 0x0190, 0x9186, 0x0002, 0x1168, 0x2011, 0x0276, + 0x20a9, 0x0004, 0x6010, 0x0096, 0x2048, 0x2019, 0x000a, 0x080c, + 0xbf54, 0x009e, 0x0110, 0x6017, 0x0001, 0x6003, 0x0001, 0x080c, + 0x9427, 0x080c, 0x98bc, 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, 0x19a2, 0x2003, 0x0000, 0x080c, + 0x1066, 0x05a0, 0x2900, 0x6016, 0x7090, 0x8004, 0xa816, 0x908a, + 0x001e, 0x02d0, 0xa833, 0x001e, 0x20a9, 0x001e, 0xa860, 0x20e8, + 0xa85c, 0x9080, 0x001b, 0x20a0, 0x2001, 0x19a2, 0x0016, 0x200c, + 0x0471, 0x001e, 0x81ff, 0x01b8, 0x2940, 0x080c, 0x1066, 0x01b0, + 0x2900, 0xa006, 0x2100, 0x0c18, 0xa832, 0x20a8, 0xa860, 0x20e8, + 0xa85c, 0x9080, 0x001b, 0x20a0, 0x2001, 0x19a2, 0x0016, 0x200c, + 0x00b1, 0x001e, 0x0000, 0x9085, 0x0001, 0x0048, 0x2071, 0x1800, + 0x7093, 0x0000, 0x6014, 0x2048, 0x080c, 0x0fff, 0x9006, 0x012e, + 0x01de, 0x01ce, 0x00ee, 0x008e, 0x009e, 0x001e, 0x0005, 0x0006, + 0x0016, 0x0026, 0x0036, 0x00c6, 0x918c, 0xffff, 0x11b0, 0x080c, + 0x2216, 0x2099, 0x026c, 0x2001, 0x0014, 0x3518, 0x9312, 0x0108, + 0x1218, 0x23a8, 0x4003, 0x0400, 0x20a8, 0x4003, 0x22a8, 0x8108, + 0x080c, 0x2216, 0x2099, 0x0260, 0x0ca8, 0x080c, 0x2216, 0x2061, + 0x19a2, 0x6004, 0x2098, 0x6008, 0x3518, 0x9312, 0x0108, 0x1218, + 0x23a8, 0x4003, 0x0048, 0x20a8, 0x4003, 0x22a8, 0x8108, 0x080c, + 0x2216, 0x2099, 0x0260, 0x0ca8, 0x2061, 0x19a2, 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, 0x222e, 0x20a1, 0x024c, + 0x2001, 0x0014, 0x3518, 0x9312, 0x1218, 0x23a8, 0x4003, 0x0418, + 0x20a8, 0x4003, 0x82ff, 0x01f8, 0x22a8, 0x8108, 0x080c, 0x222e, + 0x20a1, 0x0240, 0x0c98, 0x080c, 0x222e, 0x2061, 0x19a5, 0x6004, + 0x20a0, 0x6008, 0x3518, 0x9312, 0x1218, 0x23a8, 0x4003, 0x0058, + 0x20a8, 0x4003, 0x82ff, 0x0138, 0x22a8, 0x8108, 0x080c, 0x222e, + 0x20a1, 0x0240, 0x0c98, 0x2061, 0x19a5, 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, 0xdaea, 0x00de, 0x0005, 0x00d6, 0x080c, 0xdaf7, + 0x1520, 0x680c, 0x908c, 0xff00, 0x6820, 0x9084, 0x00ff, 0x9115, + 0x6216, 0x6824, 0x602e, 0xd1e4, 0x0130, 0x9006, 0x080c, 0xeb5d, + 0x2009, 0x0001, 0x0078, 0xd1ec, 0x0180, 0x6920, 0x918c, 0x00ff, + 0x6824, 0x080c, 0x26a1, 0x1148, 0x2001, 0x0001, 0x080c, 0xeb5d, + 0x2110, 0x900e, 0x080c, 0x334a, 0x0018, 0x9085, 0x0001, 0x0008, + 0x9006, 0x00de, 0x0005, 0x00b6, 0x00c6, 0x080c, 0xafbf, 0x0598, + 0x0016, 0x0026, 0x00c6, 0x2011, 0x0263, 0x2204, 0x8211, 0x220c, + 0x080c, 0x26a1, 0x1568, 0x080c, 0x6718, 0x1550, 0xbe12, 0xbd16, + 0x00ce, 0x002e, 0x001e, 0x2b00, 0x6012, 0x080c, 0xe98f, 0x11c8, + 0x080c, 0x3432, 0x11b0, 0x080c, 0xda54, 0x0500, 0x2001, 0x0007, + 0x080c, 0x66c9, 0x2001, 0x0007, 0x080c, 0x66f5, 0x6017, 0x0000, + 0x6023, 0x0001, 0x6007, 0x0001, 0x6003, 0x0001, 0x080c, 0x9427, + 0x0010, 0x080c, 0xaf4e, 0x9085, 0x0001, 0x00ce, 0x00be, 0x0005, + 0x080c, 0xaf4e, 0x00ce, 0x002e, 0x001e, 0x0ca8, 0x080c, 0xaf4e, + 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, + 0x0d79, 0x91b6, 0x0013, 0x1130, 0x2008, 0x91b2, 0x0040, 0x1a04, + 0xdc4c, 0x0402, 0x91b6, 0x0027, 0x0190, 0x9186, 0x0015, 0x0118, + 0x9186, 0x0016, 0x1140, 0x080c, 0xad4d, 0x0120, 0x9086, 0x0002, + 0x0904, 0xb983, 0x0005, 0x91b6, 0x0014, 0x190c, 0x0d79, 0x2001, + 0x0007, 0x080c, 0x66f5, 0x080c, 0x97f6, 0x080c, 0xaf89, 0x080c, + 0x98bc, 0x0005, 0xdb82, 0xdb84, 0xdb82, 0xdb82, 0xdb82, 0xdb84, + 0xdb91, 0xdc49, 0xdbd3, 0xdc49, 0xdbf7, 0xdc49, 0xdb91, 0xdc49, + 0xdc41, 0xdc49, 0xdc41, 0xdc49, 0xdc49, 0xdb82, 0xdb82, 0xdb82, + 0xdb82, 0xdb82, 0xdb82, 0xdb82, 0xdb82, 0xdb82, 0xdb82, 0xdb82, + 0xdb84, 0xdb82, 0xdc49, 0xdb82, 0xdb82, 0xdc49, 0xdb82, 0xdc46, + 0xdc49, 0xdb82, 0xdb82, 0xdb82, 0xdb82, 0xdc49, 0xdc49, 0xdb82, + 0xdc49, 0xdc49, 0xdb82, 0xdb8c, 0xdb82, 0xdb82, 0xdb82, 0xdb82, + 0xdc45, 0xdc49, 0xdb82, 0xdb82, 0xdc49, 0xdc49, 0xdb82, 0xdb82, + 0xdb82, 0xdb82, 0x080c, 0x0d79, 0x080c, 0xd375, 0x6003, 0x0002, + 0x080c, 0x98bc, 0x0804, 0xdc4b, 0x9006, 0x080c, 0x66b5, 0x0804, + 0xdc49, 0x080c, 0x6bc5, 0x1904, 0xdc49, 0x9006, 0x080c, 0x66b5, + 0x6010, 0x2058, 0xb810, 0x9086, 0x00ff, 0x1140, 0x00f6, 0x2079, + 0x1800, 0x78a8, 0x8000, 0x78aa, 0x00fe, 0x00b8, 0x6010, 0x2058, + 0xb884, 0x9005, 0x0904, 0xdc49, 0x080c, 0x3463, 0x1904, 0xdc49, + 0x2001, 0x1800, 0x2004, 0x9086, 0x0002, 0x1138, 0x00f6, 0x2079, + 0x1800, 0x78a8, 0x8000, 0x78aa, 0x00fe, 0x2001, 0x0002, 0x080c, + 0x66c9, 0x6023, 0x0001, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, + 0x9427, 0x080c, 0x98bc, 0x6110, 0x2158, 0x2009, 0x0001, 0x080c, + 0x883a, 0x0804, 0xdc4b, 0x6610, 0x2658, 0xbe04, 0x96b4, 0xff00, + 0x8637, 0x9686, 0x0006, 0x0148, 0x9686, 0x0004, 0x0130, 0x080c, + 0x90be, 0x2001, 0x0004, 0x080c, 0x66f5, 0x080c, 0xebac, 0x0904, + 0xdc49, 0x2001, 0x0004, 0x080c, 0x66c9, 0x6023, 0x0001, 0x6003, + 0x0001, 0x6007, 0x0003, 0x080c, 0x9427, 0x0804, 0xdc4b, 0x2001, + 0x1800, 0x2004, 0x9086, 0x0003, 0x1158, 0x0036, 0x0046, 0x6010, + 0x2058, 0xbba0, 0x2021, 0x0006, 0x080c, 0x4ddf, 0x004e, 0x003e, + 0x2001, 0x0006, 0x080c, 0xdc65, 0x6610, 0x2658, 0xbe04, 0x0066, + 0x96b4, 0xff00, 0x8637, 0x9686, 0x0006, 0x006e, 0x0180, 0x2001, + 0x0006, 0x080c, 0x66f5, 0x9284, 0x00ff, 0x908e, 0x0007, 0x0118, + 0x908e, 0x0004, 0x1120, 0x2001, 0x0006, 0x080c, 0x66c9, 0x080c, + 0x6bc5, 0x11f8, 0x2001, 0x1837, 0x2004, 0xd0a4, 0x01d0, 0xbe04, + 0x96b4, 0x00ff, 0x9686, 0x0006, 0x01a0, 0x00f6, 0x2079, 0x1800, + 0x78a8, 0x8000, 0x78aa, 0x00fe, 0x0804, 0xdbbd, 0x2001, 0x0004, + 0x0030, 0x2001, 0x0006, 0x0409, 0x0020, 0x0018, 0x0010, 0x080c, + 0x66f5, 0x080c, 0xaf4e, 0x0005, 0x2600, 0x0002, 0xdc60, 0xdc60, + 0xdc60, 0xdc60, 0xdc60, 0xdc62, 0xdc60, 0xdc62, 0xdc60, 0xdc60, + 0xdc62, 0xdc60, 0xdc60, 0xdc60, 0xdc62, 0xdc62, 0xdc62, 0xdc62, + 0x080c, 0x0d79, 0x080c, 0xaf4e, 0x0005, 0x0016, 0x00b6, 0x00d6, + 0x6110, 0x2158, 0xb900, 0xd184, 0x0138, 0x080c, 0x66c9, 0x9006, + 0x080c, 0x66b5, 0x080c, 0x332a, 0x00de, 0x00be, 0x001e, 0x0005, + 0x6610, 0x2658, 0xb804, 0x9084, 0xff00, 0x8007, 0x90b2, 0x000c, + 0x1a0c, 0x0d79, 0x91b6, 0x0015, 0x1110, 0x003b, 0x0028, 0x91b6, + 0x0016, 0x190c, 0x0d79, 0x006b, 0x0005, 0xba25, 0xba25, 0xba25, + 0xba25, 0xdcfa, 0xba25, 0xdce4, 0xdca5, 0xba25, 0xba25, 0xba25, + 0xba25, 0xba25, 0xba25, 0xba25, 0xba25, 0xdcfa, 0xba25, 0xdce4, + 0xdceb, 0xba25, 0xba25, 0xba25, 0xba25, 0x00f6, 0x080c, 0x6bc5, + 0x11d8, 0x080c, 0xd35d, 0x11c0, 0x6010, 0x905d, 0x01a8, 0xb884, + 0x9005, 0x0190, 0x9006, 0x080c, 0x66b5, 0x2001, 0x0002, 0x080c, + 0x66c9, 0x6023, 0x0001, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, + 0x9427, 0x080c, 0x98bc, 0x00f0, 0x2011, 0x0263, 0x2204, 0x8211, + 0x220c, 0x080c, 0x26a1, 0x11b0, 0x080c, 0x6783, 0x0118, 0x080c, + 0xaf4e, 0x0080, 0xb810, 0x0006, 0xb814, 0x0006, 0xb884, 0x0006, + 0x080c, 0x6192, 0x000e, 0xb886, 0x000e, 0xb816, 0x000e, 0xb812, + 0x080c, 0xaf4e, 0x00fe, 0x0005, 0x6604, 0x96b6, 0x001e, 0x1110, + 0x080c, 0xaf4e, 0x0005, 0x080c, 0xbdb4, 0x1148, 0x6003, 0x0001, + 0x6007, 0x0001, 0x080c, 0x9427, 0x080c, 0x98bc, 0x0010, 0x080c, + 0xaf4e, 0x0005, 0x0804, 0xaf4e, 0x6004, 0x908a, 0x0053, 0x1a0c, + 0x0d79, 0x080c, 0x97f6, 0x080c, 0xaf89, 0x0005, 0x9182, 0x0040, + 0x0002, 0xdd1d, 0xdd1d, 0xdd1d, 0xdd1d, 0xdd1f, 0xdd1d, 0xdd1d, + 0xdd1d, 0xdd1d, 0xdd1d, 0xdd1d, 0xdd1d, 0xdd1d, 0xdd1d, 0xdd1d, + 0xdd1d, 0xdd1d, 0xdd1d, 0xdd1d, 0xdd1d, 0x080c, 0x0d79, 0x0096, + 0x00b6, 0x00d6, 0x00e6, 0x00f6, 0x0046, 0x0026, 0x6210, 0x2258, + 0xb8bc, 0x9005, 0x11b0, 0x6007, 0x0044, 0x2071, 0x0260, 0x7444, + 0x94a4, 0xff00, 0x0904, 0xdd86, 0x080c, 0xeb51, 0x1170, 0x9486, + 0x2000, 0x1158, 0x2009, 0x0001, 0x2011, 0x0200, 0x080c, 0x8add, + 0x0020, 0x9026, 0x080c, 0xe9d4, 0x0c30, 0x080c, 0x104d, 0x090c, + 0x0d79, 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, 0x6f11, 0x001e, 0x080c, 0xeb51, 0x1904, + 0xdde6, 0x9486, 0x2000, 0x1130, 0x2019, 0x0017, 0x080c, 0xe701, + 0x0804, 0xdde6, 0x9486, 0x0200, 0x1120, 0x080c, 0xe68c, 0x0804, + 0xdde6, 0x9486, 0x0400, 0x0120, 0x9486, 0x1000, 0x1904, 0xdde6, + 0x2019, 0x0002, 0x080c, 0xe6ab, 0x0804, 0xdde6, 0x2069, 0x1a74, + 0x6a00, 0xd284, 0x0904, 0xde50, 0x9284, 0x0300, 0x1904, 0xde49, + 0x6804, 0x9005, 0x0904, 0xde31, 0x2d78, 0x6003, 0x0007, 0x080c, + 0x1066, 0x0904, 0xddf2, 0x7800, 0xd08c, 0x1118, 0x7804, 0x8001, + 0x7806, 0x6017, 0x0000, 0x2001, 0x180f, 0x2004, 0xd084, 0x1904, + 0xde54, 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, 0xddee, 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, 0x6f14, 0x002e, 0x004e, + 0x00fe, 0x00ee, 0x00de, 0x00be, 0x009e, 0x0005, 0x0000, 0x0080, + 0x0040, 0x0000, 0x2001, 0x1810, 0x2004, 0xd084, 0x0120, 0x080c, + 0x104d, 0x1904, 0xdd9b, 0x6017, 0xf100, 0x6003, 0x0001, 0x6007, + 0x0041, 0x2009, 0xa022, 0x080c, 0x9420, 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, 0x9420, + 0x0828, 0x6868, 0x602e, 0x686c, 0x6032, 0x6017, 0xf200, 0x6003, + 0x0001, 0x6007, 0x0041, 0x2009, 0xa022, 0x080c, 0x9420, 0x0804, + 0xdde6, 0x2001, 0x180e, 0x2004, 0xd0ec, 0x0120, 0x2011, 0x8049, + 0x080c, 0x4c28, 0x6017, 0xf300, 0x0010, 0x6017, 0xf100, 0x6003, + 0x0001, 0x6007, 0x0041, 0x2009, 0xa022, 0x080c, 0x9420, 0x0804, + 0xdde6, 0x6017, 0xf500, 0x0c98, 0x6017, 0xf600, 0x0804, 0xde06, + 0x6017, 0xf200, 0x0804, 0xde06, 0xa867, 0x0146, 0xa86b, 0x0000, + 0x6008, 0xa886, 0x2c00, 0xa87a, 0x7044, 0x9084, 0x0003, 0x9080, + 0xddee, 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, 0x0d79, 0x8210, 0x821c, 0x2001, 0x026c, + 0x2098, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0029, 0x20a0, 0x2011, + 0xded0, 0x2041, 0x0001, 0x223d, 0x9784, 0x00ff, 0x9322, 0x1208, + 0x2300, 0x20a8, 0x4003, 0x931a, 0x0530, 0x8210, 0xd7fc, 0x1130, + 0x8d68, 0x2d0a, 0x2001, 0x0260, 0x2098, 0x0c68, 0x2950, 0x080c, + 0x1066, 0x0170, 0x2900, 0xb002, 0xa867, 0x0147, 0xa86b, 0x0000, + 0xa860, 0x20e8, 0xa85c, 0x9080, 0x001b, 0x20a0, 0x8840, 0x08d8, + 0x2548, 0xa800, 0x902d, 0x0118, 0x080c, 0x107f, 0x0cc8, 0x080c, + 0x107f, 0x0804, 0xddf2, 0x2548, 0x8847, 0x9885, 0x0046, 0xa866, + 0x2009, 0x0205, 0x200b, 0x0000, 0x080c, 0xe738, 0x0804, 0xdde6, + 0x8010, 0x0004, 0x801a, 0x0006, 0x8018, 0x0008, 0x8016, 0x000a, + 0x8014, 0x9186, 0x0013, 0x1160, 0x6004, 0x908a, 0x0057, 0x1a0c, + 0x0d79, 0x9082, 0x0040, 0x0a0c, 0x0d79, 0x2008, 0x0804, 0xdf5c, + 0x9186, 0x0051, 0x0108, 0x0040, 0x080c, 0xad4d, 0x01e8, 0x9086, + 0x0002, 0x0904, 0xdfa4, 0x00c0, 0x9186, 0x0027, 0x0180, 0x9186, + 0x0048, 0x0128, 0x9186, 0x0014, 0x0150, 0x190c, 0x0d79, 0x080c, + 0xad4d, 0x0150, 0x9086, 0x0004, 0x0904, 0xe043, 0x0028, 0x6004, + 0x9082, 0x0040, 0x2008, 0x001a, 0x080c, 0xb009, 0x0005, 0xdf23, + 0xdf25, 0xdf25, 0xdf4c, 0xdf23, 0xdf23, 0xdf23, 0xdf23, 0xdf23, + 0xdf23, 0xdf23, 0xdf23, 0xdf23, 0xdf23, 0xdf23, 0xdf23, 0xdf23, + 0xdf23, 0xdf23, 0xdf23, 0x080c, 0x0d79, 0x080c, 0x97f6, 0x080c, + 0x98bc, 0x0036, 0x0096, 0x6014, 0x904d, 0x01d8, 0x080c, 0xcc33, + 0x01c0, 0x6003, 0x0002, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, + 0xd0bc, 0x1178, 0x2019, 0x0004, 0x080c, 0xe738, 0x6017, 0x0000, + 0x6018, 0x9005, 0x1120, 0x2001, 0x1988, 0x2004, 0x601a, 0x6003, + 0x0007, 0x009e, 0x003e, 0x0005, 0x0096, 0x080c, 0x97f6, 0x080c, + 0x98bc, 0x080c, 0xcc33, 0x0120, 0x6014, 0x2048, 0x080c, 0x107f, + 0x080c, 0xaf89, 0x009e, 0x0005, 0x0002, 0xdf71, 0xdf86, 0xdf73, + 0xdf9b, 0xdf71, 0xdf71, 0xdf71, 0xdf71, 0xdf71, 0xdf71, 0xdf71, + 0xdf71, 0xdf71, 0xdf71, 0xdf71, 0xdf71, 0xdf71, 0xdf71, 0xdf71, + 0xdf71, 0x080c, 0x0d79, 0x0096, 0x6014, 0x2048, 0xa87c, 0xd0b4, + 0x0138, 0x6003, 0x0007, 0x2009, 0x0043, 0x080c, 0xafec, 0x0010, + 0x6003, 0x0004, 0x080c, 0x98bc, 0x009e, 0x0005, 0x080c, 0xcc33, + 0x0138, 0x6114, 0x0096, 0x2148, 0xa97c, 0x009e, 0xd1ec, 0x1138, + 0x080c, 0x8ab2, 0x080c, 0xaf4e, 0x080c, 0x98bc, 0x0005, 0x080c, + 0xe998, 0x0db0, 0x0cc8, 0x6003, 0x0001, 0x6007, 0x0041, 0x2009, + 0xa022, 0x080c, 0x9420, 0x0005, 0x9182, 0x0040, 0x0002, 0xdfbb, + 0xdfbd, 0xdfbb, 0xdfbb, 0xdfbb, 0xdfbb, 0xdfbb, 0xdfbb, 0xdfbb, + 0xdfbb, 0xdfbb, 0xdfbb, 0xdfbb, 0xdfbb, 0xdfbb, 0xdfbb, 0xdfbb, + 0xdfbe, 0xdfbb, 0xdfbb, 0x080c, 0x0d79, 0x0005, 0x00d6, 0x080c, + 0x8ab2, 0x00de, 0x080c, 0xe9f0, 0x080c, 0xaf4e, 0x0005, 0x9182, + 0x0040, 0x0002, 0xdfde, 0xdfde, 0xdfde, 0xdfde, 0xdfde, 0xdfde, + 0xdfde, 0xdfde, 0xdfde, 0xdfe0, 0xe00b, 0xdfde, 0xdfde, 0xdfde, + 0xdfde, 0xe00b, 0xdfde, 0xdfde, 0xdfde, 0xdfde, 0x080c, 0x0d79, + 0x6014, 0x0096, 0x2048, 0xa87c, 0xd0fc, 0x0168, 0x908c, 0x0003, + 0x918e, 0x0002, 0x0180, 0x6144, 0xd1e4, 0x1168, 0x2009, 0x0041, + 0x009e, 0x0804, 0xe0cb, 0x6003, 0x0007, 0x601b, 0x0000, 0x080c, + 0x8ab2, 0x009e, 0x0005, 0x6014, 0x2048, 0xa97c, 0xd1ec, 0x1130, + 0x080c, 0x8ab2, 0x080c, 0xaf4e, 0x009e, 0x0005, 0x080c, 0xe998, + 0x0db8, 0x009e, 0x0005, 0x2001, 0x180c, 0x200c, 0xc1d4, 0x2102, + 0x0036, 0x080c, 0x9851, 0x080c, 0x98bc, 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, 0xe738, 0x6018, 0x9005, 0x1128, 0x2001, + 0x1988, 0x2004, 0x8003, 0x601a, 0x6017, 0x0000, 0x6003, 0x0007, + 0x009e, 0x003e, 0x0005, 0x9182, 0x0040, 0x0002, 0xe05a, 0xe05a, + 0xe05a, 0xe05a, 0xe05a, 0xe05a, 0xe05a, 0xe05a, 0xe05c, 0xe05a, + 0xe05a, 0xe05a, 0xe05a, 0xe05a, 0xe05a, 0xe05a, 0xe05a, 0xe05a, + 0xe05a, 0xe0a7, 0x080c, 0x0d79, 0x6014, 0x0096, 0x2048, 0xa834, + 0xaa38, 0x6110, 0x00b6, 0x2158, 0xb900, 0x00be, 0xd1bc, 0x1190, + 0x920d, 0x1518, 0xa87c, 0xd0fc, 0x0128, 0x2009, 0x0041, 0x009e, + 0x0804, 0xe0cb, 0x6003, 0x0007, 0x601b, 0x0000, 0x080c, 0x8ab2, + 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, + 0x8ab4, 0x009e, 0x0005, 0x6003, 0x0002, 0x009e, 0x0005, 0x6024, + 0xd0f4, 0x0128, 0x080c, 0x16a4, 0x1904, 0xe05c, 0x0005, 0x6014, + 0x0096, 0x2048, 0xa834, 0xa938, 0x009e, 0x9105, 0x1120, 0x080c, + 0x16a4, 0x1904, 0xe05c, 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, 0x0d79, 0x6024, 0xd0dc, + 0x090c, 0x0d79, 0x0005, 0xe0ef, 0xe0fb, 0xe107, 0xe113, 0xe0ef, + 0xe0ef, 0xe0ef, 0xe0ef, 0xe0f6, 0xe0f1, 0xe0f1, 0xe0ef, 0xe0ef, + 0xe0ef, 0xe0ef, 0xe0f1, 0xe0ef, 0xe0f1, 0xe0ef, 0xe0f6, 0x080c, + 0x0d79, 0x6024, 0xd0dc, 0x090c, 0x0d79, 0x0005, 0x6014, 0x9005, + 0x190c, 0x0d79, 0x0005, 0x6003, 0x0001, 0x6106, 0x0126, 0x2091, + 0x8000, 0x2009, 0xa022, 0x080c, 0x9402, 0x012e, 0x0005, 0x6003, + 0x0004, 0x6106, 0x0126, 0x2091, 0x8000, 0x2009, 0xa001, 0x080c, + 0x9420, 0x012e, 0x0005, 0x6003, 0x0003, 0x6106, 0x080c, 0x1c8c, + 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, 0x9467, + 0x012e, 0x0005, 0x6144, 0x918d, 0xa032, 0x0cb8, 0x0126, 0x2091, + 0x8000, 0x0036, 0x0096, 0x9182, 0x0040, 0x0023, 0x009e, 0x003e, + 0x012e, 0x0005, 0xe15e, 0xe160, 0xe175, 0xe18f, 0xe15e, 0xe15e, + 0xe15e, 0xe15e, 0xe15e, 0xe15e, 0xe15e, 0xe15e, 0xe15e, 0xe15e, + 0xe15e, 0xe15e, 0xe15e, 0xe15e, 0xe15e, 0xe15e, 0x080c, 0x0d79, + 0x6014, 0x2048, 0xa87c, 0xd0fc, 0x0510, 0x909c, 0x0003, 0x939e, + 0x0003, 0x01e8, 0x6003, 0x0001, 0x6106, 0x0126, 0x2091, 0x8000, + 0x2009, 0xa022, 0x080c, 0x9420, 0x0470, 0x6014, 0x2048, 0xa87c, + 0xd0fc, 0x0168, 0x909c, 0x0003, 0x939e, 0x0003, 0x0140, 0x6003, + 0x0001, 0x6106, 0x2009, 0xa001, 0x080c, 0x9420, 0x00e0, 0x901e, + 0x6316, 0x631a, 0x2019, 0x0004, 0x080c, 0xe738, 0x00a0, 0x6014, + 0x2048, 0xa87c, 0xd0fc, 0x0d98, 0x909c, 0x0003, 0x939e, 0x0003, + 0x0d70, 0x6003, 0x0003, 0x6106, 0x080c, 0x1c8c, 0x6144, 0x918d, + 0xa035, 0x080c, 0x9467, 0x0005, 0x080c, 0x97f6, 0x6114, 0x81ff, + 0x0158, 0x0096, 0x2148, 0x080c, 0xeaee, 0x0036, 0x2019, 0x0029, + 0x080c, 0xe738, 0x003e, 0x009e, 0x080c, 0xaf89, 0x080c, 0x98bc, + 0x0005, 0x080c, 0x9851, 0x6114, 0x81ff, 0x0158, 0x0096, 0x2148, + 0x080c, 0xeaee, 0x0036, 0x2019, 0x0029, 0x080c, 0xe738, 0x003e, + 0x009e, 0x080c, 0xaf89, 0x0005, 0x9182, 0x0085, 0x0002, 0xe1de, + 0xe1dc, 0xe1dc, 0xe1ea, 0xe1dc, 0xe1dc, 0xe1dc, 0xe1dc, 0xe1dc, + 0xe1dc, 0xe1dc, 0xe1dc, 0xe1dc, 0x080c, 0x0d79, 0x6003, 0x000b, + 0x6106, 0x0126, 0x2091, 0x8000, 0x2009, 0x8020, 0x080c, 0x9420, + 0x012e, 0x0005, 0x0026, 0x00e6, 0x080c, 0xe98f, 0x0118, 0x080c, + 0xaf4e, 0x0440, 0x2071, 0x0260, 0x7224, 0x6216, 0x2001, 0x180e, + 0x2004, 0xd0e4, 0x0150, 0x6010, 0x00b6, 0x2058, 0xbca0, 0x00be, + 0x2c00, 0x2011, 0x014e, 0x080c, 0xb277, 0x7220, 0x080c, 0xe57d, + 0x0118, 0x6007, 0x0086, 0x0040, 0x6007, 0x0087, 0x7224, 0x9296, + 0xffff, 0x1110, 0x6007, 0x0086, 0x6003, 0x0001, 0x2009, 0x8020, + 0x080c, 0x9420, 0x00ee, 0x002e, 0x0005, 0x9186, 0x0013, 0x1160, + 0x6004, 0x908a, 0x0085, 0x0a0c, 0x0d79, 0x908a, 0x0092, 0x1a0c, + 0x0d79, 0x9082, 0x0085, 0x00a2, 0x9186, 0x0027, 0x0130, 0x9186, + 0x0014, 0x0118, 0x080c, 0xb009, 0x0050, 0x2001, 0x0007, 0x080c, + 0x66f5, 0x080c, 0x97f6, 0x080c, 0xaf89, 0x080c, 0x98bc, 0x0005, + 0xe24d, 0xe24f, 0xe24f, 0xe24d, 0xe24d, 0xe24d, 0xe24d, 0xe24d, + 0xe24d, 0xe24d, 0xe24d, 0xe24d, 0xe24d, 0x080c, 0x0d79, 0x080c, + 0xaf89, 0x080c, 0x98bc, 0x0005, 0x9182, 0x0085, 0x0a0c, 0x0d79, + 0x9182, 0x0092, 0x1a0c, 0x0d79, 0x9182, 0x0085, 0x0002, 0xe26c, + 0xe26c, 0xe26c, 0xe26e, 0xe26c, 0xe26c, 0xe26c, 0xe26c, 0xe26c, + 0xe26c, 0xe26c, 0xe26c, 0xe26c, 0x080c, 0x0d79, 0x0005, 0x9186, + 0x0013, 0x0148, 0x9186, 0x0014, 0x0130, 0x9186, 0x0027, 0x0118, + 0x080c, 0xb009, 0x0020, 0x080c, 0x97f6, 0x080c, 0xaf89, 0x0005, + 0x0036, 0x080c, 0xe9f0, 0x604b, 0x0000, 0x2019, 0x000b, 0x0031, + 0x6023, 0x0006, 0x6003, 0x0007, 0x003e, 0x0005, 0x0126, 0x0036, + 0x2091, 0x8000, 0x080c, 0xaaf7, 0x0106, 0x0086, 0x2c40, 0x0096, + 0x904e, 0x080c, 0xa462, 0x009e, 0x008e, 0x1558, 0x0076, 0x2c38, + 0x080c, 0xa50d, 0x007e, 0x1528, 0x6000, 0x9086, 0x0000, 0x0508, + 0x6020, 0x9086, 0x0007, 0x01e8, 0x0096, 0x601c, 0xd084, 0x0140, + 0x080c, 0xe9f0, 0x080c, 0xd375, 0x080c, 0x1af0, 0x6023, 0x0007, + 0x6014, 0x2048, 0x080c, 0xcc33, 0x0110, 0x080c, 0xe738, 0x009e, + 0x9006, 0x6046, 0x6016, 0x080c, 0xe9f0, 0x6023, 0x0007, 0x080c, + 0xd375, 0x010e, 0x090c, 0xab13, 0x003e, 0x012e, 0x0005, 0x00f6, + 0x00c6, 0x00b6, 0x0036, 0x0156, 0x2079, 0x0260, 0x7938, 0x783c, + 0x080c, 0x26a1, 0x1904, 0xe329, 0x0016, 0x00c6, 0x080c, 0x6783, + 0x1904, 0xe327, 0x001e, 0x00c6, 0x080c, 0xd35d, 0x1130, 0xb884, + 0x9005, 0x0118, 0x080c, 0x3463, 0x0148, 0x2b10, 0x2160, 0x6010, + 0x0006, 0x6212, 0x080c, 0xd364, 0x000e, 0x6012, 0x00ce, 0x002e, + 0x0026, 0x0016, 0x080c, 0xaaf7, 0x2019, 0x0029, 0x080c, 0xa5dd, + 0x080c, 0x95b9, 0x0076, 0x903e, 0x080c, 0x9476, 0x007e, 0x001e, + 0x0076, 0x903e, 0x080c, 0xe465, 0x007e, 0x080c, 0xab13, 0x0026, + 0xba04, 0x9294, 0xff00, 0x8217, 0x9286, 0x0006, 0x0118, 0x9286, + 0x0004, 0x1118, 0xbaa0, 0x080c, 0x33c6, 0x002e, 0xbc84, 0x001e, + 0x080c, 0x6192, 0xbe12, 0xbd16, 0xbc86, 0x9006, 0x0010, 0x00ce, + 0x001e, 0x015e, 0x003e, 0x00be, 0x00ce, 0x00fe, 0x0005, 0x00c6, + 0x00d6, 0x00b6, 0x0016, 0x2009, 0x1824, 0x2104, 0x9086, 0x0074, + 0x1904, 0xe388, 0x2069, 0x0260, 0x6944, 0x9182, 0x0100, 0x06e0, + 0x6940, 0x9184, 0x8000, 0x0904, 0xe385, 0x2001, 0x197d, 0x2004, + 0x9005, 0x1140, 0x6010, 0x2058, 0xb884, 0x9005, 0x0118, 0x9184, + 0x0800, 0x0598, 0x6948, 0x918a, 0x0001, 0x0648, 0x080c, 0xeb56, + 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, 0x6792, 0x0804, 0xe3f4, + 0x2011, 0x0276, 0x20a9, 0x0004, 0x0096, 0x2b48, 0x2019, 0x000a, + 0x080c, 0xbf54, 0x009e, 0x15c8, 0x2011, 0x027a, 0x20a9, 0x0004, + 0x0096, 0x2b48, 0x2019, 0x0006, 0x080c, 0xbf54, 0x009e, 0x1568, + 0x0046, 0x0016, 0xbaa0, 0x2220, 0x9006, 0x2009, 0x1848, 0x210c, + 0xd1a4, 0x0138, 0x2009, 0x0029, 0x080c, 0xe795, 0xb800, 0xc0e5, + 0xb802, 0x080c, 0xaaf7, 0x2019, 0x0029, 0x080c, 0x95b9, 0x0076, + 0x2039, 0x0000, 0x080c, 0x9476, 0x2c08, 0x080c, 0xe465, 0x007e, + 0x080c, 0xab13, 0x2001, 0x0007, 0x080c, 0x66f5, 0x2001, 0x0007, + 0x080c, 0x66c9, 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, 0x26a1, 0x11d0, 0x080c, 0x6783, 0x11b8, + 0x2011, 0x0270, 0x20a9, 0x0004, 0x0096, 0x2b48, 0x2019, 0x000a, + 0x080c, 0xbf54, 0x009e, 0x1158, 0x2011, 0x0274, 0x20a9, 0x0004, + 0x0096, 0x2b48, 0x2019, 0x0006, 0x080c, 0xbf54, 0x009e, 0x015e, + 0x003e, 0x002e, 0x001e, 0x00fe, 0x00be, 0x0005, 0x00b6, 0x0006, + 0x0016, 0x0026, 0x0036, 0x0156, 0x2011, 0x0263, 0x2204, 0x8211, + 0x220c, 0x080c, 0x26a1, 0x11d0, 0x080c, 0x6783, 0x11b8, 0x2011, + 0x0276, 0x20a9, 0x0004, 0x0096, 0x2b48, 0x2019, 0x000a, 0x080c, + 0xbf54, 0x009e, 0x1158, 0x2011, 0x027a, 0x20a9, 0x0004, 0x0096, + 0x2b48, 0x2019, 0x0006, 0x080c, 0xbf54, 0x009e, 0x015e, 0x003e, + 0x002e, 0x001e, 0x000e, 0x00be, 0x0005, 0x00e6, 0x00c6, 0x0086, + 0x0076, 0x0066, 0x0056, 0x0046, 0x0026, 0x0126, 0x2091, 0x8000, + 0x080c, 0xab55, 0x0106, 0x190c, 0xaaf7, 0x2740, 0x2029, 0x19f5, + 0x252c, 0x2021, 0x19fc, 0x2424, 0x2061, 0x1ddc, 0x2071, 0x1800, + 0x7654, 0x7074, 0x81ff, 0x0150, 0x0006, 0x9186, 0x1b3a, 0x000e, + 0x0128, 0x8001, 0x9602, 0x1a04, 0xe50b, 0x0018, 0x9606, 0x0904, + 0xe50b, 0x080c, 0x8d87, 0x0904, 0xe502, 0x2100, 0x9c06, 0x0904, + 0xe502, 0x6720, 0x9786, 0x0007, 0x0904, 0xe502, 0x080c, 0xe7d6, + 0x1904, 0xe502, 0x080c, 0xeb74, 0x0904, 0xe502, 0x080c, 0xe7c6, + 0x0904, 0xe502, 0x6720, 0x9786, 0x0001, 0x1148, 0x080c, 0x3463, + 0x0904, 0xe54d, 0x6004, 0x9086, 0x0000, 0x1904, 0xe54d, 0x9786, + 0x0004, 0x0904, 0xe54d, 0x2500, 0x9c06, 0x0904, 0xe502, 0x2400, + 0x9c06, 0x0904, 0xe502, 0x88ff, 0x0118, 0x605c, 0x9906, 0x15d0, + 0x0096, 0x6043, 0xffff, 0x6000, 0x9086, 0x0004, 0x1120, 0x0016, + 0x080c, 0x1af0, 0x001e, 0x9786, 0x000a, 0x0148, 0x080c, 0xce4a, + 0x1130, 0x080c, 0xb93c, 0x009e, 0x080c, 0xaf89, 0x0418, 0x6014, + 0x2048, 0x080c, 0xcc33, 0x01d8, 0x9786, 0x0003, 0x1588, 0xa867, + 0x0103, 0xa87c, 0xd0cc, 0x0130, 0x0096, 0xa878, 0x2048, 0x080c, + 0x0fff, 0x009e, 0xab7a, 0xa877, 0x0000, 0x080c, 0xeaee, 0x0016, + 0x080c, 0xcf38, 0x080c, 0x6f05, 0x001e, 0x080c, 0xce24, 0x009e, + 0x080c, 0xaf89, 0x9ce0, 0x001c, 0x2001, 0x181a, 0x2004, 0x9c02, + 0x1210, 0x0804, 0xe47e, 0x010e, 0x190c, 0xab13, 0x012e, 0x002e, + 0x004e, 0x005e, 0x006e, 0x007e, 0x008e, 0x00ce, 0x00ee, 0x0005, + 0x9786, 0x0006, 0x1150, 0x9386, 0x0005, 0x0128, 0x080c, 0xeaee, + 0x080c, 0xe738, 0x08e0, 0x009e, 0x08e8, 0x9786, 0x0009, 0x11f8, + 0x6000, 0x9086, 0x0004, 0x01c0, 0x6000, 0x9086, 0x0003, 0x11a0, + 0x080c, 0x9851, 0x0096, 0x6114, 0x2148, 0x080c, 0xcc33, 0x0118, + 0x6010, 0x080c, 0x6f11, 0x009e, 0x00c6, 0x080c, 0xaf4e, 0x00ce, + 0x0036, 0x080c, 0x98bc, 0x003e, 0x009e, 0x0804, 0xe502, 0x9786, + 0x000a, 0x0904, 0xe4f2, 0x0804, 0xe4e7, 0x81ff, 0x0904, 0xe502, + 0x9180, 0x0001, 0x2004, 0x9086, 0x0018, 0x0138, 0x9180, 0x0001, + 0x2004, 0x9086, 0x002d, 0x1904, 0xe502, 0x6000, 0x9086, 0x0002, + 0x1904, 0xe502, 0x080c, 0xce39, 0x0138, 0x080c, 0xce4a, 0x1904, + 0xe502, 0x080c, 0xb93c, 0x0038, 0x080c, 0x332a, 0x080c, 0xce4a, + 0x1110, 0x080c, 0xb93c, 0x080c, 0xaf89, 0x0804, 0xe502, 0xa864, + 0x9084, 0x00ff, 0x9086, 0x0039, 0x0005, 0x00c6, 0x00e6, 0x0016, + 0x2c08, 0x2170, 0x9006, 0x080c, 0xe75f, 0x001e, 0x0120, 0x6020, + 0x9084, 0x000f, 0x001b, 0x00ee, 0x00ce, 0x0005, 0xe59c, 0xe59c, + 0xe59c, 0xe59c, 0xe59c, 0xe59c, 0xe59e, 0xe59c, 0xe59c, 0xe59c, + 0xe5c7, 0xaf89, 0xaf89, 0xe59c, 0x9006, 0x0005, 0x0036, 0x0046, + 0x0016, 0x7010, 0x00b6, 0x2058, 0xbca0, 0x00be, 0x2c00, 0x2009, + 0x0020, 0x080c, 0xe795, 0x001e, 0x004e, 0x2019, 0x0002, 0x080c, + 0xe28e, 0x003e, 0x9085, 0x0001, 0x0005, 0x0096, 0x080c, 0xcc33, + 0x0140, 0x6014, 0x904d, 0x080c, 0xc81b, 0x687b, 0x0005, 0x080c, + 0x6f11, 0x009e, 0x080c, 0xaf89, 0x9085, 0x0001, 0x0005, 0x0019, + 0x9085, 0x0001, 0x0005, 0x6000, 0x908a, 0x0010, 0x1a0c, 0x0d79, + 0x000b, 0x0005, 0xe5e2, 0xe5e2, 0xe5f9, 0xe5e9, 0xe608, 0xe5e2, + 0xe5e2, 0xe5e4, 0xe5e2, 0xe5e2, 0xe5e2, 0xe5e2, 0xe5e2, 0xe5e2, + 0xe5e2, 0xe5e2, 0x080c, 0x0d79, 0x080c, 0xaf89, 0x9085, 0x0001, + 0x0005, 0x0036, 0x00e6, 0x2071, 0x19e9, 0x704c, 0x9c06, 0x1128, + 0x2019, 0x0001, 0x080c, 0xa391, 0x0010, 0x080c, 0xa59c, 0x00ee, + 0x003e, 0x0096, 0x00d6, 0x6014, 0x2048, 0xa87b, 0x0005, 0x080c, + 0x6f11, 0x080c, 0xaf89, 0x00de, 0x009e, 0x9085, 0x0001, 0x0005, + 0x601c, 0xd084, 0x190c, 0x1af0, 0x0c60, 0x2001, 0x0001, 0x080c, + 0x66b5, 0x0156, 0x0016, 0x0026, 0x0036, 0x20a9, 0x0004, 0x2019, + 0x1805, 0x2011, 0x0276, 0x080c, 0xbf40, 0x003e, 0x002e, 0x001e, + 0x015e, 0x9005, 0x0005, 0x00f6, 0x00e6, 0x00c6, 0x0086, 0x0076, + 0x0066, 0x00b6, 0x0126, 0x2091, 0x8000, 0x2740, 0x2061, 0x1ddc, + 0x2079, 0x0001, 0x8fff, 0x0904, 0xe67f, 0x2071, 0x1800, 0x7654, + 0x7074, 0x8001, 0x9602, 0x1a04, 0xe67f, 0x88ff, 0x0120, 0x2800, + 0x9c06, 0x15a0, 0x2078, 0x080c, 0xe7c6, 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, 0xe9f0, 0x080c, 0xd375, 0x080c, 0x1af0, 0x6023, 0x0007, + 0x6014, 0x2048, 0x080c, 0xcc33, 0x0120, 0x0046, 0x080c, 0xe738, + 0x004e, 0x009e, 0x080c, 0xaf89, 0x88ff, 0x1198, 0x9ce0, 0x001c, + 0x2001, 0x181a, 0x2004, 0x9c02, 0x1210, 0x0804, 0xe632, 0x9006, + 0x012e, 0x00be, 0x006e, 0x007e, 0x008e, 0x00ce, 0x00ee, 0x00fe, + 0x0005, 0x98c5, 0x0001, 0x0ca0, 0x080c, 0xaaf7, 0x00b6, 0x0076, + 0x0056, 0x0086, 0x9046, 0x2029, 0x0001, 0x2c20, 0x2019, 0x0002, + 0x6210, 0x2258, 0x0096, 0x904e, 0x080c, 0xa462, 0x009e, 0x008e, + 0x903e, 0x080c, 0xa50d, 0x080c, 0xe623, 0x005e, 0x007e, 0x00be, + 0x080c, 0xab13, 0x0005, 0x080c, 0xaaf7, 0x00b6, 0x0046, 0x0056, + 0x0076, 0x00c6, 0x0156, 0x2c20, 0x2128, 0x20a9, 0x007f, 0x900e, + 0x0016, 0x0036, 0x080c, 0x6783, 0x1180, 0x0056, 0x0086, 0x9046, + 0x2508, 0x2029, 0x0001, 0x0096, 0x904e, 0x080c, 0xa462, 0x009e, + 0x008e, 0x903e, 0x080c, 0xa50d, 0x005e, 0x003e, 0x001e, 0x8108, + 0x1f04, 0xe6b8, 0x0036, 0x2508, 0x2029, 0x0003, 0x080c, 0xe623, + 0x003e, 0x015e, 0x00ce, 0x007e, 0x005e, 0x004e, 0x00be, 0x080c, + 0xab13, 0x0005, 0x080c, 0xaaf7, 0x00b6, 0x0076, 0x0056, 0x6210, + 0x2258, 0x0086, 0x9046, 0x2029, 0x0001, 0x2019, 0x0048, 0x0096, + 0x904e, 0x080c, 0xa462, 0x009e, 0x008e, 0x903e, 0x080c, 0xa50d, + 0x2c20, 0x080c, 0xe623, 0x005e, 0x007e, 0x00be, 0x080c, 0xab13, + 0x0005, 0x080c, 0xaaf7, 0x00b6, 0x0046, 0x0056, 0x0076, 0x00c6, + 0x0156, 0x2c20, 0x20a9, 0x0800, 0x900e, 0x0016, 0x0036, 0x080c, + 0x6783, 0x1190, 0x0086, 0x9046, 0x2828, 0x0046, 0x2021, 0x0001, + 0x080c, 0xe9d4, 0x004e, 0x0096, 0x904e, 0x080c, 0xa462, 0x009e, + 0x008e, 0x903e, 0x080c, 0xa50d, 0x003e, 0x001e, 0x8108, 0x1f04, + 0xe70d, 0x0036, 0x2029, 0x0002, 0x080c, 0xe623, 0x003e, 0x015e, + 0x00ce, 0x007e, 0x005e, 0x004e, 0x00be, 0x080c, 0xab13, 0x0005, + 0x0016, 0x00f6, 0x080c, 0xcc31, 0x0198, 0xa864, 0x9084, 0x00ff, + 0x9086, 0x0046, 0x0180, 0xa800, 0x907d, 0x0138, 0xa803, 0x0000, + 0xab82, 0x080c, 0x6f11, 0x2f48, 0x0cb0, 0xab82, 0x080c, 0x6f11, + 0x00fe, 0x001e, 0x0005, 0xa800, 0x907d, 0x0130, 0xa803, 0x0000, + 0x080c, 0x6f11, 0x2f48, 0x0cb8, 0x080c, 0x6f11, 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, + 0x104d, 0x000e, 0x090c, 0x0d79, 0xaae2, 0xa867, 0x010d, 0xa88e, + 0x0026, 0x2010, 0x080c, 0xcc21, 0x2001, 0x0000, 0x0120, 0x2200, + 0x9080, 0x0017, 0x2004, 0x002e, 0xa87a, 0x9186, 0x0020, 0x0110, + 0xa8e3, 0xffff, 0xa986, 0xac76, 0xa87f, 0x0000, 0x2001, 0x198f, + 0x2004, 0xa882, 0x9006, 0xa802, 0xa86a, 0xa88a, 0x0126, 0x2091, + 0x8000, 0x080c, 0x6f11, 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, 0x1988, 0x2004, + 0x601a, 0x2009, 0x8020, 0x080c, 0x9420, 0x001e, 0x0005, 0xa001, + 0xa001, 0x0005, 0x6024, 0xd0e4, 0x0158, 0xd0cc, 0x0118, 0x080c, + 0xcf7f, 0x0030, 0x080c, 0xe9f0, 0x080c, 0x8ab2, 0x080c, 0xaf4e, + 0x0005, 0x9280, 0x0008, 0x2004, 0x9084, 0x000f, 0x0002, 0xe825, + 0xe825, 0xe825, 0xe827, 0xe825, 0xe827, 0xe827, 0xe825, 0xe827, + 0xe825, 0xe825, 0xe825, 0xe825, 0xe825, 0x9006, 0x0005, 0x9085, + 0x0001, 0x0005, 0x9280, 0x0008, 0x2004, 0x9084, 0x000f, 0x0002, + 0xe83e, 0xe83e, 0xe83e, 0xe83e, 0xe83e, 0xe83e, 0xe84b, 0xe83e, + 0xe83e, 0xe83e, 0xe83e, 0xe83e, 0xe83e, 0xe83e, 0x6007, 0x003b, + 0x602f, 0x0009, 0x6017, 0x2a00, 0x6003, 0x0001, 0x2009, 0x8020, + 0x080c, 0x9420, 0x0005, 0x0096, 0x00c6, 0x2260, 0x080c, 0xe9f0, + 0x604b, 0x0000, 0x6024, 0xc0f4, 0xc0e4, 0x6026, 0x603b, 0x0000, + 0x00ce, 0x00d6, 0x2268, 0x9186, 0x0007, 0x1904, 0xe8a4, 0x6814, + 0x9005, 0x0138, 0x2048, 0xa87c, 0xd0fc, 0x1118, 0x00de, 0x009e, + 0x08a8, 0x6007, 0x003a, 0x6003, 0x0001, 0x2009, 0x8020, 0x080c, + 0x9420, 0x00c6, 0x2d60, 0x6100, 0x9186, 0x0002, 0x1904, 0xe91b, + 0x6014, 0x9005, 0x1138, 0x6000, 0x9086, 0x0007, 0x190c, 0x0d79, + 0x0804, 0xe91b, 0x2048, 0x080c, 0xcc33, 0x1130, 0x0028, 0x2048, + 0xa800, 0x9005, 0x1de0, 0x2900, 0x2048, 0xa87c, 0x9084, 0x0003, + 0x9086, 0x0002, 0x1168, 0xa87c, 0xc0dc, 0xc0f4, 0xa87e, 0xa880, + 0xc0fc, 0xa882, 0x2009, 0x0043, 0x080c, 0xe0cb, 0x0804, 0xe91b, + 0x2009, 0x0041, 0x0804, 0xe915, 0x9186, 0x0005, 0x15a0, 0x6814, + 0x2048, 0xa87c, 0xd0bc, 0x1120, 0x00de, 0x009e, 0x0804, 0xe83e, + 0xd0b4, 0x0128, 0xd0fc, 0x090c, 0x0d79, 0x0804, 0xe85f, 0x6007, + 0x003a, 0x6003, 0x0001, 0x2009, 0x8020, 0x080c, 0x9420, 0x00c6, + 0x2d60, 0x6100, 0x9186, 0x0002, 0x0120, 0x9186, 0x0004, 0x1904, + 0xe91b, 0x6814, 0x2048, 0xa97c, 0xc1f4, 0xc1dc, 0xa97e, 0xa980, + 0xc1fc, 0xc1bc, 0xa982, 0x00f6, 0x2c78, 0x080c, 0x17a1, 0x00fe, + 0x2009, 0x0042, 0x04d0, 0x0036, 0x080c, 0x104d, 0x090c, 0x0d79, + 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, 0x6f11, 0x2019, 0x0045, 0x6008, 0x2068, + 0x080c, 0xe28e, 0x2d00, 0x600a, 0x6023, 0x0006, 0x6003, 0x0007, + 0x901e, 0x631a, 0x634a, 0x003e, 0x0038, 0x604b, 0x0000, 0x6003, + 0x0007, 0x080c, 0xe0cb, 0x00ce, 0x00de, 0x009e, 0x0005, 0x9186, + 0x0013, 0x1128, 0x6004, 0x9082, 0x0085, 0x2008, 0x00c2, 0x9186, + 0x0027, 0x1178, 0x080c, 0x97f6, 0x0036, 0x0096, 0x6014, 0x2048, + 0x2019, 0x0004, 0x080c, 0xe738, 0x009e, 0x003e, 0x080c, 0x98bc, + 0x0005, 0x9186, 0x0014, 0x0d70, 0x080c, 0xb009, 0x0005, 0xe94e, + 0xe94c, 0xe94c, 0xe94c, 0xe94c, 0xe94c, 0xe94e, 0xe94c, 0xe94c, + 0xe94c, 0xe94c, 0xe94c, 0xe94c, 0x080c, 0x0d79, 0x6003, 0x000c, + 0x080c, 0x98bc, 0x0005, 0x9182, 0x0092, 0x1220, 0x9182, 0x0085, + 0x0208, 0x001a, 0x080c, 0xb009, 0x0005, 0xe96a, 0xe96a, 0xe96a, + 0xe96a, 0xe96c, 0xe98c, 0xe96a, 0xe96a, 0xe96a, 0xe96a, 0xe96a, + 0xe96a, 0xe96a, 0x080c, 0x0d79, 0x00d6, 0x2c68, 0x080c, 0xaef8, + 0x01b0, 0x6003, 0x0001, 0x6007, 0x001e, 0x2009, 0x026e, 0x210c, + 0x613a, 0x2009, 0x026f, 0x210c, 0x613e, 0x600b, 0xffff, 0x6910, + 0x6112, 0x6023, 0x0004, 0x2009, 0x8020, 0x080c, 0x9420, 0x2d60, + 0x080c, 0xaf4e, 0x00de, 0x0005, 0x080c, 0xaf4e, 0x0005, 0x00e6, + 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0ec, 0x00ee, 0x0005, + 0x2009, 0x1867, 0x210c, 0xd1ec, 0x05b0, 0x6003, 0x0002, 0x6024, + 0xc0e5, 0x6026, 0xd0cc, 0x0150, 0x2001, 0x1989, 0x2004, 0x604a, + 0x2009, 0x1867, 0x210c, 0xd1f4, 0x1520, 0x00a0, 0x2009, 0x1867, + 0x210c, 0xd1f4, 0x0128, 0x6024, 0xc0e4, 0x6026, 0x9006, 0x00d8, + 0x2001, 0x1989, 0x200c, 0x2001, 0x1987, 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, 0x8ab2, 0x080c, 0xaf4e, 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, + 0xbf54, 0x009e, 0x1168, 0x2011, 0x0274, 0x20a9, 0x0004, 0x6010, + 0x0096, 0x2048, 0x2019, 0x0006, 0x080c, 0xbf54, 0x009e, 0x1100, + 0x015e, 0x003e, 0x002e, 0x0005, 0x00e6, 0x2071, 0x1800, 0x080c, + 0x610b, 0x080c, 0x30c8, 0x00ee, 0x0005, 0x0096, 0x0026, 0x080c, + 0x104d, 0x090c, 0x0d79, 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, 0x6f11, 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, 0x19f5, 0x252c, 0x2021, 0x19fc, 0x2424, 0x2061, + 0x1ddc, 0x2071, 0x1800, 0x7654, 0x7074, 0x9606, 0x0578, 0x6720, + 0x9786, 0x0001, 0x0118, 0x9786, 0x0008, 0x1500, 0x2500, 0x9c06, + 0x01e8, 0x2400, 0x9c06, 0x01d0, 0x080c, 0xe7c6, 0x01b8, 0x080c, + 0xe7d6, 0x11a0, 0x6000, 0x9086, 0x0004, 0x1120, 0x0016, 0x080c, + 0x1af0, 0x001e, 0x080c, 0xce39, 0x1110, 0x080c, 0x332a, 0x080c, + 0xce4a, 0x1110, 0x080c, 0xb93c, 0x080c, 0xaf89, 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, 0xd35d, 0x0168, 0x2019, 0xffff, 0x9005, 0x0128, 0x6010, + 0x00b6, 0x2058, 0xbba0, 0x00be, 0x2021, 0x0004, 0x080c, 0x4ddf, + 0x004e, 0x003e, 0x000e, 0x0005, 0x6004, 0x9086, 0x0001, 0x1128, + 0x080c, 0xa5dd, 0x080c, 0xaf89, 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, 0x7163 }; +#ifdef UNIQUE_FW_NAME +unsigned short fw2322ipx_length01 = 0xe428; +#else +unsigned short risc_code_length01 = 0xe428; +#endif + +/* + * + */ + +unsigned long rseqipx_code_addr01 = 0x0001c000 ; +unsigned short rseqipx_code01[] = { +0x000b, 0x0003, 0x0000, 0x0a4a, 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, 0x04e3, 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, 0x0004, 0x04ec, 0x0008, 0x808c, + 0x0000, 0x0001, 0x0000, 0x04fc, 0x0003, 0x34cf, 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, 0x8ccf, 0x0009, 0xc4c0, 0x0000, 0x7000, + 0x0009, 0xffe0, 0x0000, 0x1000, 0x000b, 0x0c6a, 0x000c, 0x04dd, + 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, 0x04c2, 0x000c, 0x04dd, 0x0002, 0x3941, + 0x0003, 0x0c70, 0x0000, 0x8072, 0x0000, 0x0400, 0x0003, 0x0013, + 0x0004, 0x04a7, 0x0008, 0x11fc, 0x000b, 0xb478, 0x0000, 0x8072, + 0x0000, 0x0400, 0x0008, 0x8010, 0x0000, 0x000e, 0x000b, 0x04c2, + 0x0000, 0x8060, 0x0000, 0x0400, 0x0000, 0x04fc, 0x000b, 0xb48d, + 0x0008, 0x808c, 0x0008, 0x0000, 0x0001, 0x9180, 0x0008, 0x0005, + 0x0008, 0x7f62, 0x0000, 0x8066, 0x0008, 0x0009, 0x000b, 0xc483, + 0x0008, 0x0060, 0x0008, 0x8062, 0x0008, 0x001b, 0x0008, 0x4304, + 0x0008, 0x4206, 0x0000, 0x8066, 0x0000, 0x0412, 0x0003, 0xc48b, + 0x000b, 0x04a4, 0x0008, 0x808c, 0x0000, 0x0001, 0x0000, 0x0460, + 0x0008, 0x8062, 0x0008, 0x002b, 0x0000, 0x8066, 0x0008, 0x0609, + 0x000b, 0xc494, 0x0000, 0x8066, 0x0008, 0x220a, 0x000b, 0xc497, + 0x0000, 0x42fe, 0x0001, 0xffc0, 0x0008, 0xff00, 0x0008, 0x7f04, + 0x0000, 0x8060, 0x0000, 0x0400, 0x0001, 0x9180, 0x0000, 0x0002, + 0x0008, 0x7f62, 0x0000, 0x8066, 0x0008, 0x041a, 0x0003, 0xc4a3, + 0x0000, 0x8072, 0x0000, 0x0400, 0x000b, 0x0056, 0x0000, 0x8060, + 0x0000, 0x0400, 0x0008, 0x6b62, 0x0000, 0x8066, 0x0000, 0x0411, + 0x0003, 0xc4ac, 0x0008, 0x02fe, 0x0009, 0x03e0, 0x0003, 0x8cb2, + 0x0000, 0x0d22, 0x000f, 0x4000, 0x0009, 0x8280, 0x0000, 0x0002, + 0x0001, 0x6b80, 0x0008, 0x7f62, 0x0000, 0x8066, 0x0008, 0x2209, + 0x0003, 0xc4b8, 0x000a, 0x0200, 0x0001, 0xffc0, 0x0000, 0x0007, + 0x0000, 0x7f06, 0x0008, 0x6b62, 0x0000, 0x8066, 0x0008, 0x060a, + 0x0003, 0xc4c0, 0x000f, 0x4000, 0x0002, 0x3a44, 0x0003, 0x8813, + 0x000a, 0x2f44, 0x000a, 0x2f44, 0x0003, 0x8bd0, 0x0008, 0x808a, + 0x0008, 0x0003, 0x0000, 0x8074, 0x0000, 0xf080, 0x0003, 0x5ccb, + 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, 0x0003, 0x0ce0, 0x000f, 0x4000, + 0x0000, 0x8072, 0x0008, 0x0404, 0x000f, 0x4000, 0x0008, 0x8010, + 0x0008, 0x0012, 0x0004, 0x0387, 0x0004, 0x04a7, 0x0000, 0x1110, + 0x0004, 0x0387, 0x0008, 0x11fc, 0x0003, 0xb4e6, 0x0003, 0x0013, + 0x0009, 0xc2c0, 0x0008, 0x00ff, 0x0000, 0x7f00, 0x0001, 0xc3c0, + 0x0008, 0xff00, 0x0009, 0x00d0, 0x0003, 0x0d11, 0x0000, 0x0d0a, + 0x0001, 0x8580, 0x0000, 0x1000, 0x0008, 0x7f62, 0x0000, 0x8060, + 0x0000, 0x0400, 0x0000, 0x8066, 0x0000, 0x0809, 0x000b, 0xc4fb, + 0x0000, 0x04fc, 0x000b, 0x350a, 0x0000, 0x0460, 0x0008, 0x8062, + 0x0000, 0x0004, 0x0000, 0x8066, 0x0000, 0x0211, 0x000b, 0xc503, + 0x0008, 0x01fe, 0x0009, 0x00e0, 0x000b, 0x8d0a, 0x0008, 0x02fe, + 0x0001, 0x43e0, 0x000b, 0x0d10, 0x0002, 0x0500, 0x0000, 0x7f0a, + 0x0009, 0xffe0, 0x0000, 0x0800, 0x000b, 0x8cf4, 0x0008, 0x0d08, + 0x000f, 0x4000, 0x0008, 0x43fe, 0x0001, 0x3e80, 0x0000, 0x0d60, + 0x0008, 0x7f62, 0x0000, 0x8066, 0x0000, 0x0809, 0x000b, 0xc517, + 0x0000, 0x8060, 0x0000, 0x0400, 0x0001, 0x84c0, 0x0008, 0xff00, + 0x0002, 0x7f70, 0x0009, 0xff80, 0x0000, 0x1000, 0x0008, 0x7f62, + 0x0000, 0x8066, 0x0000, 0x0809, 0x000b, 0xc522, 0x000f, 0x4000, + 0xe4ae, 0x1eb8 +}; +unsigned short rseqipx_code_length01 = 0x0a4a; +/* + * + */ -struct firmware ql2322_fw = { - .size = sizeof(ql2322_fw_bin), - .data = ql2322_fw_bin +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, 0x1b56, + 0x000b, 0x1367, 0x0005, 0x0031, 0x0011, 0x1b6e, 0x0015, 0x0033, + 0x0010, 0xb409, 0x001b, 0x8359, 0x0002, 0xb400, 0x0010, 0xffb4, + 0x0005, 0x0031, 0x0011, 0x1b6e, 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, 0x1b56, 0x0015, 0x0011, 0x0001, 0x1b56, 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, 0x1b72, 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, 0x1b56, 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, 0x0011, 0x1b6d, 0x0015, 0x0033, 0x0010, 0xb211, + 0x000b, 0x8850, 0x0002, 0xb200, 0x0010, 0xffb2, 0x0005, 0x0031, + 0x0011, 0x1b6d, 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, 0x1b56, + 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, + 0x9a6c, 0xaf33 }; +unsigned short xseqipx_code_length01 = 0x1252; diff --git a/drivers/scsi/qla2xxx/ql2400.c b/drivers/scsi/qla2xxx/ql2400.c index 77914fcfa..6c7165f47 100644 --- a/drivers/scsi/qla2xxx/ql2400.c +++ b/drivers/scsi/qla2xxx/ql2400.c @@ -49,18 +49,6 @@ static struct qla_board_info qla_board_tbl[] = { .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[] = { @@ -78,21 +66,6 @@ static struct pci_device_id qla24xx_pci_tbl[] = { .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); diff --git a/drivers/scsi/qla2xxx/ql2400_fw.c b/drivers/scsi/qla2xxx/ql2400_fw.c index de4e84092..597779585 100644 --- a/drivers/scsi/qla2xxx/ql2400_fw.c +++ b/drivers/scsi/qla2xxx/ql2400_fw.c @@ -1,16705 +1,12376 @@ /* - * 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 + * QLogic Fibre Channel HBA Driver + * Copyright (c) 2003-2005 QLogic Corporation * + * See LICENSE.qla2xxx for copyright and licensing details. */ +#include + +/* + * Firmware Version 4.00.16 (08:09 Oct 26, 2005) + */ + +#ifdef UNIQUE_FW_NAME +uint32_t fw2400_version = 4*1024+0; +#else +uint32_t risc_code_version = 4*1024+0; +#endif + +#ifdef UNIQUE_FW_NAME +uint32_t fw2400_version_str[] = {4, 0,16}; +#else +uint32_t firmware_version[] = {4, 0,16}; +#endif -#include +#ifdef UNIQUE_FW_NAME +#define fw2400_VERSION_STRING "4.00.16" +#else +#define FW_VERSION_STRING "4.00.16" +#endif -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_addr01 = 0x00100000 ; +#else +uint32_t risc_code_addr01 = 0x00100000 ; +#endif + +#ifdef UNIQUE_FW_NAME +uint32_t fw2400_code01[] = { +#else +uint32_t risc_code01[] = { +#endif + 0x0401f17c, 0x0010e000, 0x00100000, 0x0000ab4a, + 0x00000004, 0x00000000, 0x00000010, 0x00000002, + 0x00000003, 0x00000000, 0x20434f50, 0x59524947, + 0x48542032, 0x30303520, 0x514c4f47, 0x49432043, + 0x4f52504f, 0x52415449, 0x4f4e2020, 0x20495350, + 0x32347878, 0x20466972, 0x6d776172, 0x65202020, + 0x56657273, 0x696f6e20, 0x342e302e, 0x31362020, + 0x20202024, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x42001800, 0x0010014f, 0x42002000, 0x0010b8fe, + 0x500c0800, 0x800c1800, 0x500c1000, 0x800c1800, + 0x54042000, 0x80102000, 0x80040800, 0x80081040, + 0x040207fc, 0x500c0800, 0x800409c0, 0x040207f6, + 0x44002000, 0x80102000, 0x40100000, 0x44040000, + 0x80000000, 0x44080000, 0x80000000, 0x440c0000, + 0x80000000, 0x44100000, 0x80000000, 0x44140000, + 0x80000000, 0x44180000, 0x80000000, 0x441c0000, + 0x80000000, 0x44200000, 0x80000000, 0x44240000, + 0x80000000, 0x44280000, 0x80000000, 0x442c0000, + 0x80000000, 0x44300000, 0x80000000, 0x44340000, + 0x80000000, 0x44380000, 0x80000000, 0x443c0000, + 0x80000000, 0x44400000, 0x80000000, 0x44440000, + 0x80000000, 0x44480000, 0x80000000, 0x444c0000, + 0x80000000, 0x44500000, 0x80000000, 0x44540000, + 0x80000000, 0x44580000, 0x80000000, 0x445c0000, + 0x80000000, 0x44600000, 0x80000000, 0x44640000, + 0x80000000, 0x44680000, 0x80000000, 0x446c0000, + 0x80000000, 0x44700000, 0x80000000, 0x44740000, + 0x80000000, 0x44780000, 0x80000000, 0x447c0000, + 0x80000000, 0x44800000, 0x80000000, 0x44840000, + 0x80000000, 0x44880000, 0x80000000, 0x448c0000, + 0x80000000, 0x44900000, 0x80000000, 0x44940000, + 0x80000000, 0x44980000, 0x80000000, 0x449c0000, + 0x80000000, 0x44a00000, 0x80000000, 0x44a40000, + 0x80000000, 0x44a80000, 0x80000000, 0x44ac0000, + 0x80000000, 0x44b00000, 0x80000000, 0x44b40000, + 0x80000000, 0x44b80000, 0x80000000, 0x44bc0000, + 0x80000000, 0x44c00000, 0x80000000, 0x44c40000, + 0x80000000, 0x44c80000, 0x80000000, 0x44cc0000, + 0x80000000, 0x44d00000, 0x80000000, 0x44d80000, + 0x80000000, 0x44d40000, 0x80000000, 0x44dc0000, + 0x80000000, 0x44e00000, 0x80000000, 0x44e40000, + 0x80000000, 0x44e80000, 0x80000000, 0x44ec0000, + 0x80000000, 0x44f00000, 0x80000000, 0x44f40000, + 0x80000000, 0x44f80000, 0x80000000, 0x44fc0000, + 0x80000000, 0x45000000, 0x80000000, 0x45040000, + 0x80000000, 0x45080000, 0x80000000, 0x450c0000, + 0x80000000, 0x45100000, 0x80000000, 0x45140000, + 0x80000000, 0x45180000, 0x80000000, 0x451c0000, + 0x80000000, 0x45200000, 0x80000000, 0x45240000, + 0x80000000, 0x45280000, 0x80000000, 0x452c0000, + 0x80000000, 0x45300000, 0x80000000, 0x45340000, + 0x80000000, 0x45380000, 0x80000000, 0x453c0000, + 0x80000000, 0x45400000, 0x80000000, 0x45440000, + 0x80000000, 0x45480000, 0x80000000, 0x454c0000, + 0x80000000, 0x45500000, 0x80000000, 0x45540000, + 0x80000000, 0x45580000, 0x80000000, 0x455c0000, + 0x80000000, 0x45600000, 0x80000000, 0x45640000, + 0x80000000, 0x45680000, 0x80000000, 0x456c0000, + 0x80000000, 0x45700000, 0x80000000, 0x45740000, + 0x80000000, 0x45780000, 0x80000000, 0x457c0000, + 0x80000000, 0x45800000, 0x80000000, 0x45840000, + 0x80000000, 0x45880000, 0x80000000, 0x458c0000, + 0x80000000, 0x45900000, 0x80000000, 0x45940000, + 0x80000000, 0x45980000, 0x80000000, 0x459c0000, + 0x80000000, 0x45a00000, 0x80000000, 0x45a40000, + 0x80000000, 0x45a80000, 0x80000000, 0x45ac0000, + 0x80000000, 0x45b00000, 0x80000000, 0x45b40000, + 0x80000000, 0x45b80000, 0x80000000, 0x45bc0000, + 0x80000000, 0x45c00000, 0x80000000, 0x45c40000, + 0x80000000, 0x45c80000, 0x80000000, 0x45cc0000, + 0x80000000, 0x45d00000, 0x80000000, 0x45d40000, + 0x80000000, 0x45d80000, 0x80000000, 0x45dc0000, + 0x80000000, 0x45e00000, 0x80000000, 0x45e40000, + 0x80000000, 0x45e80000, 0x80000000, 0x45ec0000, + 0x80000000, 0x45f00000, 0x80000000, 0x45f40000, + 0x80000000, 0x45f80000, 0x80000000, 0x45fc0000, + 0x4a03c020, 0x00004000, 0x4a03c011, 0x40000010, + 0x04006000, 0x4203e000, 0x40000000, 0x59e00017, + 0x8c000508, 0x04000003, 0x4a03c017, 0x00000000, + 0x4203e000, 0x30000001, 0x0401f000, 0x0000bf00, + 0x00000080, 0x0000bfe0, 0x00000020, 0x0000ff00, + 0x00000080, 0x0000ffd0, 0x00000030, 0x00007100, + 0x00000010, 0x00007200, 0x00000008, 0x00007209, + 0x00000007, 0x00007300, 0x00000008, 0x00007309, + 0x00000007, 0x00007400, 0x00000008, 0x00007409, + 0x00000007, 0x00007600, 0x000000b0, 0x00007700, + 0x00000040, 0x00003000, 0x00000070, 0x00004000, + 0x000000c0, 0x00006000, 0x00000050, 0x00006100, + 0x00000010, 0x00006130, 0x00000010, 0x00006150, + 0x00000010, 0x00006170, 0x00000010, 0x00006190, + 0x00000010, 0x000061b0, 0x00000010, 0x00000000, + 0x42000000, 0x00000100, 0x4202f000, 0x00000000, + 0x42000800, 0x00021f00, 0x45780800, 0x80040800, + 0x80000040, 0x040207fd, 0x4203f000, 0x00021fff, + 0x40000000, 0x4203e000, 0x90000100, 0x40000000, + 0x0201f800, 0x001006fd, 0x42000000, 0x00001000, + 0x50000000, 0x82000480, 0x24320002, 0x04020015, + 0x42000800, 0x00000064, 0x80040840, 0x04000007, + 0x4a030000, 0x00000001, 0x40000000, 0x59800000, + 0x8c000500, 0x040007f9, 0x04000008, 0x42000800, + 0x00007a17, 0x50040000, 0x8c00050e, 0x04020003, + 0x8400054e, 0x44000800, 0x4a030000, 0x00000000, + 0x4a03c020, 0x00000004, 0x4203e000, 0x6000000f, + 0x59e00023, 0x8c000500, 0x04020039, 0x42000000, + 0x00100001, 0x50000800, 0x82040c00, 0x00000004, + 0x58042003, 0x42001000, 0xffffffff, 0x0201f800, + 0x001006f4, 0x0402004e, 0x58042003, 0x42001000, + 0xffffffff, 0x0201f800, 0x001006f4, 0x04020048, + 0x58042003, 0x42001000, 0x00ffffff, 0x0201f800, + 0x001006f4, 0x04020042, 0x58042003, 0x42001000, + 0x00ffffff, 0x0201f800, 0x001006f4, 0x0402003c, + 0x42000000, 0x00100001, 0x5000a000, 0x8250a400, + 0x00000004, 0x4200a800, 0x00020000, 0x5850b003, + 0x0201f800, 0x0010ab17, 0x8250a400, 0x00000005, + 0x4a0370e8, 0x00000003, 0x4200a800, 0x0000c000, + 0x5850b003, 0x0201f800, 0x0010ab17, 0x4a0378e8, + 0x00000003, 0x4200a800, 0x00008000, 0x5850b003, + 0x0201f800, 0x0010ab17, 0x0401f02b, 0x42000800, + 0x00020000, 0x58042003, 0x42001000, 0xffffffff, + 0x0201f800, 0x001006f4, 0x04020019, 0x4a0370e8, + 0x00000003, 0x42000800, 0x0000c000, 0x58042003, + 0x82102500, 0x00ffffff, 0x42001000, 0x00ffffff, + 0x0201f800, 0x001006f4, 0x0402000d, 0x4a0378e8, + 0x00000003, 0x42000800, 0x00008000, 0x58042003, + 0x82102500, 0x00ffffff, 0x42001000, 0x00ffffff, + 0x0201f800, 0x001006f4, 0x0400000b, 0x4a03c020, + 0x00004010, 0x4a03c011, 0x40100011, 0x04006000, + 0x4203e000, 0x40000000, 0x4203e000, 0x30000001, + 0x0401f000, 0x0201f800, 0x00100791, 0x42001000, + 0x0010ab4a, 0x40080000, 0x80140480, 0x82001d00, + 0xffffff00, 0x04020003, 0x40001800, 0x0401f003, + 0x42001800, 0x000000ff, 0x480bc840, 0x480fc842, + 0x04011000, 0x400c0000, 0x80081400, 0x40140000, + 0x80080580, 0x040207f0, 0x4817500d, 0x45782800, + 0x59c40000, 0x82000500, 0xffff0000, 0x80000120, + 0x82000580, 0x00002422, 0x04020005, 0x59a80005, + 0x8400054e, 0x48035005, 0x0401f008, 0x59e00003, + 0x82000500, 0x00030000, 0x04000004, 0x59a80005, + 0x84000554, 0x48035005, 0x42000800, 0x00000040, + 0x59a80005, 0x8c000514, 0x0402000e, 0x42000800, + 0x00001000, 0x82141480, 0x0017ffff, 0x04021009, + 0x80040902, 0x82141480, 0x0013ffff, 0x04021005, + 0x80040902, 0x82141480, 0x0011ffff, 0x04001b8d, + 0x4807500e, 0x42001000, 0x00000024, 0x0201f800, + 0x00106681, 0x82040c00, 0x0010d1c0, 0x4807500b, + 0x4a03c810, 0x00100000, 0x4a03c811, 0x0010ab4a, + 0x4a03c829, 0x00000004, 0x59e40001, 0x82000540, + 0x0003001d, 0x4803c801, 0x4a03c014, 0x001c001c, + 0x42001000, 0x0000001c, 0x0201f800, 0x001006e2, + 0x4202c000, 0x0010d1c0, 0x59aab00b, 0x59aaa00b, + 0x59aaa80b, 0x59aac80e, 0x49675069, 0x59a8000b, + 0x4803500c, 0x0401fbf5, 0x0201f800, 0x00107903, + 0x0201f800, 0x001007be, 0x0201f800, 0x00100807, + 0x0201f800, 0x00101a05, 0x0201f800, 0x00101354, + 0x0201f800, 0x00100969, 0x0201f800, 0x00101354, + 0x0201f800, 0x00100f4c, 0x0201f800, 0x001066c1, + 0x0401fb1a, 0x0201f800, 0x0010220e, 0x0201f800, + 0x001053bb, 0x0201f800, 0x00104c90, 0x0201f800, + 0x00106194, 0x0201f800, 0x00105f28, 0x0201f800, + 0x001013ed, 0x0201f800, 0x0010126f, 0x4203e000, + 0xf0000001, 0x42000000, 0x00001000, 0x50000000, + 0x82000480, 0x24220001, 0x04000016, 0x59e00002, + 0x8c00051e, 0x42000000, 0x7ffe00fe, 0x04020003, + 0x42000000, 0x7ffe01fe, 0x50000800, 0x48075058, + 0x80040920, 0x82040580, 0x0000013a, 0x04000004, + 0x82040580, 0x0000013b, 0x04020006, 0x59a80005, + 0x84000552, 0x48035005, 0x4a0378e4, 0x000c0000, + 0x4a03c018, 0x0000000f, 0x4203e000, 0x20000511, + 0x4203e000, 0x50010000, 0x4a03c020, 0x00000000, + 0x04027013, 0x59e00020, 0x82000580, 0x00000002, + 0x0402000f, 0x4a03c020, 0x00004000, 0x4a03c011, + 0x40000010, 0x04006000, 0x4203e000, 0x40000000, + 0x59e00017, 0x8c000508, 0x04000003, 0x4a03c017, + 0x00000000, 0x4203e000, 0x30000001, 0x4202d800, + 0x00000000, 0x4203e000, 0xb0600000, 0x59a80005, + 0x42000800, 0x00000002, 0x8c000512, 0x04020007, + 0x42000800, 0x0000000f, 0x8c000514, 0x04020003, + 0x42000800, 0x00000001, 0x4007f800, 0x59a80005, + 0x8c000514, 0x02020000, 0x00020004, 0x59e00003, + 0x82000500, 0x00030000, 0x82000580, 0x00000000, + 0x04020af8, 0x0201f000, 0x00020004, 0x4df00000, + 0x4203e000, 0x50000000, 0x416c0000, 0x82000c80, + 0x00000008, 0x04021aef, 0x0c01f804, 0x5c03e000, + 0x0201f000, 0x00020008, 0x001002f7, 0x0010030a, + 0x001003d7, 0x001002f6, 0x00100452, 0x001002f6, + 0x001002f6, 0x00100593, 0x0401fae2, 0x42000800, + 0x0010b4a4, 0x5804001d, 0x4803c857, 0x8c000500, + 0x0400000d, 0x84000500, 0x4800081d, 0x4202d800, + 0x00000004, 0x0401fbd3, 0x49f3c857, 0x5c000800, + 0x5c000000, 0x82000540, 0x00003e00, 0x4c000000, + 0x4c040000, 0x1c01f000, 0x0401fbbd, 0x0201f800, + 0x0010513b, 0x04000009, 0x0201f800, 0x00105151, + 0x0402002e, 0x59c40006, 0x82000540, 0x000000c0, + 0x48038806, 0x0401f029, 0x0201f800, 0x001050a2, + 0x836c0580, 0x00000001, 0x040200bc, 0x59a80017, + 0x82000580, 0x00000009, 0x040200b8, 0x497b5010, + 0x4a038893, 0x00000001, 0x42001000, 0x000000f0, + 0x0201f800, 0x0010193d, 0x0201f800, 0x00105149, + 0x59c41006, 0x04020006, 0x82081540, 0x000000f1, + 0x82081500, 0xbbffffff, 0x0401f003, 0x82081540, + 0x440000f1, 0x480b8806, 0x0201f800, 0x0010609e, + 0x4a0378e4, 0x00002000, 0x42000000, 0x0010b83a, + 0x0201f800, 0x0010aa47, 0x42001000, 0x00008030, + 0x497b5013, 0x0401f035, 0x0201f800, 0x00103b38, + 0x59c400a4, 0x82000500, 0x0000000f, 0x82000480, + 0x00000007, 0x04021091, 0x0201f800, 0x0010609e, + 0x59c400a3, 0x82000500, 0xffefffff, 0x480388a3, + 0x59a8004b, 0x800001c0, 0x04020004, 0x0201f800, + 0x00104139, 0x0401f085, 0x59a80015, 0x84000546, + 0x48035015, 0x0201f800, 0x00105141, 0x59c41006, + 0x04020006, 0x82081540, 0x44000001, 0x82081500, + 0xffffff0f, 0x0401f003, 0x82081540, 0x440000f1, + 0x480b8806, 0x497b9005, 0x4a038802, 0x0000ffff, + 0x4a0378e4, 0x00003000, 0x42000000, 0x0010b80c, + 0x0201f800, 0x0010aa47, 0x59a81010, 0x42000800, + 0x00000003, 0x0201f800, 0x00106c78, 0x42001000, + 0x00008010, 0x59a8180a, 0x0201f800, 0x00103a3e, + 0x0201f800, 0x00101815, 0x59a80805, 0x82040d00, + 0xffffffdf, 0x48075005, 0x0201f800, 0x0010483d, + 0x0201f800, 0x0010513b, 0x0400000a, 0x0201f800, + 0x0010413e, 0x04000007, 0x4a035013, 0x00000001, + 0x497b5021, 0x0201f800, 0x00103c80, 0x0401f04f, + 0x0201f800, 0x001048ec, 0x04000005, 0x59c41002, + 0x8408150c, 0x480b8802, 0x0401f012, 0x0201f800, + 0x0010513b, 0x04020006, 0x59a8001d, 0x80000540, + 0x02000800, 0x0010930f, 0x0401f00a, 0x0201f800, + 0x0010930f, 0x59a80026, 0x8c000506, 0x04020005, + 0x59a8001d, 0x80000540, 0x02020800, 0x00104245, + 0x497b5028, 0x497b5027, 0x497b5018, 0x0201f800, + 0x0010513b, 0x59a81026, 0x0402000a, 0x0201f800, + 0x0010162a, 0x80001580, 0x59a8002a, 0x82000500, + 0xffff0000, 0x80040d40, 0x4807502a, 0x0401f005, + 0x59a8002a, 0x82000500, 0xffff0000, 0x4803502a, + 0x599c0017, 0x8c00050a, 0x04000002, 0x84081544, + 0x480b5026, 0x0201f800, 0x0010513b, 0x04000004, + 0x0201f800, 0x0010162a, 0x48078880, 0x42001000, + 0x00000005, 0x0201f800, 0x001070b0, 0x497b5028, + 0x497b501b, 0x4a03501c, 0x0000ffff, 0x4a0378e4, + 0x000000c0, 0x4202d800, 0x00000002, 0x0201f800, + 0x0010513b, 0x04000007, 0x59a80026, 0x82000500, + 0x0000000c, 0x82000580, 0x00000004, 0x04000003, + 0x0201f800, 0x00101e45, 0x1c01f000, 0x59a8001c, + 0x82000580, 0x0000ffff, 0x04000004, 0x0201f800, + 0x00101e45, 0x0401f074, 0x59a80026, 0x8c00050a, + 0x04020003, 0x8c000506, 0x0400001c, 0x8c000500, + 0x0400001a, 0x4a038802, 0x0000ffbf, 0x8c000502, + 0x04000016, 0x599c0018, 0x8c000516, 0x04020010, + 0x59a80027, 0x82000580, 0x0000ffff, 0x0400000c, + 0x0201f800, 0x00101f9a, 0x59a80026, 0x8c000504, + 0x0402005d, 0x42001000, 0x00000003, 0x417a5800, + 0x0201f800, 0x00101fbf, 0x0401f057, 0x59a80028, + 0x80000540, 0x04020054, 0x59a80026, 0x8c000508, + 0x04020005, 0x59a8001b, 0x80000540, 0x0402004e, + 0x0401f003, 0x8c000516, 0x0400004b, 0x0201f800, + 0x001048ec, 0x04020048, 0x599c0018, 0x8c000516, + 0x04020004, 0x0201f800, 0x00104c51, 0x04020042, + 0x599c0017, 0x8c00050a, 0x0400000d, 0x4200b000, + 0x000007f0, 0x417a8800, 0x0201f800, 0x00020245, + 0x04020004, 0x59340200, 0x8c00051a, 0x04020036, + 0x81468800, 0x8058b040, 0x040207f8, 0x4a038802, + 0x0000ffff, 0x42001800, 0x0010b4eb, 0x0401fb8c, + 0x42001800, 0x0010b4f8, 0x0401fb89, 0x59a80005, + 0x84000502, 0x48035005, 0x4a0378e4, 0x00000080, + 0x4202d800, 0x00000003, 0x4a03501c, 0x0000ffff, + 0x0401fa7f, 0x80000580, 0x0201f800, 0x00101590, + 0x599c0018, 0x8c000516, 0x04000004, 0x0201f800, + 0x00103b10, 0x0401f009, 0x42001800, 0x0000ffff, + 0x42002000, 0x00000006, 0x42003000, 0x00000000, + 0x0201f800, 0x00103aae, 0x0201f800, 0x00105151, + 0x0400000b, 0x59c40006, 0x0201f800, 0x0010513b, + 0x04000004, 0x82000500, 0xffffff0f, 0x0401f003, + 0x82000500, 0xfbffffff, 0x48038806, 0x0201f800, + 0x00106f36, 0x1c01f000, 0x4c040000, 0x4c080000, + 0x4c100000, 0x59a8003e, 0x82000c80, 0x00000004, + 0x04021980, 0x0c01f805, 0x5c002000, 0x5c001000, + 0x5c000800, 0x1c01f000, 0x00100462, 0x001004ea, + 0x00100516, 0x00100577, 0x42000000, 0x00000001, + 0x0201f800, 0x00101590, 0x0201f800, 0x0010609e, + 0x59c408a3, 0x82040d00, 0xfffffff7, 0x480788a3, + 0x0201f800, 0x00105141, 0x0400000e, 0x0201f800, + 0x00105151, 0x0400000b, 0x0201f800, 0x00105149, + 0x04020964, 0x59c400a3, 0x84000532, 0x84000570, + 0x480388a3, 0x4a038808, 0x00000008, 0x0401f010, + 0x59c400a3, 0x84000530, 0x82000500, 0xbf7fffff, + 0x480388a3, 0x42000800, 0x000000f8, 0x0201f800, + 0x00104200, 0x59c400a3, 0x82000540, 0x00018000, + 0x8400051c, 0x480388a3, 0x497b8808, 0x59c40006, + 0x82000500, 0xfbffff0e, 0x48038806, 0x497b2822, + 0x497b2823, 0x42000800, 0x000001f4, 0x42001000, + 0x00100591, 0x0201f800, 0x00105f83, 0x59c40805, + 0x42001000, 0x00000001, 0x0201f800, 0x0010193d, + 0x0201f800, 0x0010163b, 0x0402000a, 0x42000000, + 0x00000001, 0x0201f800, 0x0010188c, 0x42000000, + 0x00000001, 0x0201f800, 0x00101821, 0x0401f022, + 0x0201f800, 0x00101642, 0x04020008, 0x41780000, + 0x0201f800, 0x0010188c, 0x41780000, 0x0201f800, + 0x00101821, 0x0401f018, 0x0201f800, 0x00101649, + 0x0402000a, 0x42000000, 0x00000002, 0x0201f800, + 0x0010188c, 0x42000000, 0x00000002, 0x0201f800, + 0x00101821, 0x0401f00c, 0x0201f800, 0x00101650, + 0x04020918, 0x59a80049, 0x800001c0, 0x04000006, + 0x0201f800, 0x00101656, 0x4a03503e, 0x00000001, + 0x0401f021, 0x0201f800, 0x00101927, 0x4a03503e, + 0x00000001, 0x0201f800, 0x00105141, 0x0400000c, + 0x0201f800, 0x00105151, 0x04000009, 0x0201f800, + 0x00105149, 0x04020903, 0x4a035033, 0x00000001, + 0x0201f800, 0x001050a2, 0x0401f00f, 0x59c400a4, + 0x82000500, 0x0000000f, 0x82000580, 0x00000008, + 0x04000003, 0x4a038805, 0x04000000, 0x59c400a3, + 0x82000540, 0x0001c000, 0x480388a3, 0x84000520, + 0x480388a3, 0x1c01f000, 0x0401f8a3, 0x04020004, + 0x4a03503e, 0x00000003, 0x0401f027, 0x0201f800, + 0x00101650, 0x04020011, 0x59a80049, 0x800001c0, + 0x0400000e, 0x0201f800, 0x00101656, 0x59a80048, + 0x8c00051e, 0x0400001c, 0x0201f800, 0x00105149, + 0x04020009, 0x4a035033, 0x00000001, 0x0201f800, + 0x001050a2, 0x0401f004, 0x0201f800, 0x001018d3, + 0x04020011, 0x0201f800, 0x00101815, 0x4a03503e, + 0x00000002, 0x497b5049, 0x59c400a3, 0x84000520, + 0x480388a3, 0x497b2822, 0x497b2823, 0x42000800, + 0x0000002d, 0x42001000, 0x00100591, 0x0201f800, + 0x00105f83, 0x1c01f000, 0x0401f877, 0x04020004, + 0x4a03503e, 0x00000003, 0x0401f05b, 0x4a038805, + 0x000000f0, 0x0201f800, 0x001018d3, 0x04020050, + 0x0201f800, 0x00105149, 0x04000044, 0x59c400a4, + 0x82000500, 0x0000000f, 0x82000580, 0x00000008, + 0x04000020, 0x59c40005, 0x8c000534, 0x0402001d, + 0x59940022, 0x82000580, 0x00000001, 0x04020046, + 0x0201f800, 0x00105151, 0x04020043, 0x4a038805, + 0x000000f0, 0x0201f800, 0x00105196, 0x4a035032, + 0x0000aaaa, 0x4a035033, 0x00000000, 0x59c408a3, + 0x82040d40, 0x00000008, 0x480788a3, 0x4202d800, + 0x00000001, 0x4a03503e, 0x00000000, 0x4a038805, + 0x00000001, 0x497b2822, 0x497b2823, 0x0401f01f, + 0x0201f800, 0x00105151, 0x04020007, 0x59a80032, + 0x82000580, 0x0000aaaa, 0x04020003, 0x4a035010, + 0x00ffffff, 0x497b5032, 0x59c40006, 0x82000540, + 0x04000001, 0x48038806, 0x59a80805, 0x8c040d06, + 0x04020005, 0x59c408a3, 0x82040d40, 0x00000008, + 0x480788a3, 0x4202d800, 0x00000001, 0x4a03503e, + 0x00000000, 0x4a038805, 0x00000001, 0x497b2822, + 0x497b2823, 0x0401f010, 0x59c40005, 0x82000500, + 0x000000c0, 0x0400000c, 0x59c40006, 0x82000540, + 0x000000f1, 0x48038806, 0x0401f7ef, 0x0201f800, + 0x00101650, 0x04020004, 0x59a80049, 0x800001c0, + 0x040207a4, 0x497b8885, 0x1c01f000, 0x4803c856, + 0x42000000, 0x00000001, 0x0201f800, 0x00101590, + 0x4a03503e, 0x00000000, 0x0201f800, 0x00101650, + 0x0402000b, 0x59a80052, 0x800001c0, 0x04000004, + 0x80000040, 0x48035052, 0x04020005, 0x4a035052, + 0x0000000a, 0x4a035049, 0x00000001, 0x497b8885, + 0x0401f0ed, 0x59940022, 0x59940823, 0x80040540, + 0x1c01f000, 0x497b2823, 0x1c01f000, 0x4c080000, + 0x42001000, 0x000000f0, 0x0201f800, 0x0010193d, + 0x5c001000, 0x1c01f000, 0x4a03505c, 0x00000004, + 0x4a03505d, 0x00000000, 0x4a03505e, 0x00000010, + 0x4a03505f, 0x00000002, 0x4a035010, 0x00ffffff, + 0x0201f800, 0x0010930f, 0x4a03502a, 0x20200000, + 0x4a03502b, 0x88000200, 0x4a03502c, 0x00ff001f, + 0x4a03502d, 0x000007d0, 0x4a03502e, 0x80000000, + 0x4a03502f, 0x00000200, 0x4a035030, 0x00ff0000, + 0x4a035031, 0x00010000, 0x4a03503a, 0x514c4f47, + 0x4a03503b, 0x49432020, 0x1c01f000, 0x4d440000, + 0x417a8800, 0x41780800, 0x0201f800, 0x00020245, + 0x04020005, 0x0201f800, 0x001049e7, 0x04020002, + 0x80040800, 0x81468800, 0x83440580, 0x000007f0, + 0x040207f6, 0x5c028800, 0x1c01f000, 0x4803c857, + 0x5c000000, 0x4c000000, 0x4803c857, 0x0401f809, + 0x485fc857, 0x4203e000, 0x50000000, 0x5c000000, + 0x4d780000, 0x4200b800, 0x00008002, 0x0401f006, + 0x485fc857, 0x4203e000, 0x50000000, 0x4200b800, + 0x00008002, 0x04006000, 0x4c000000, 0x4c040000, + 0x59bc00ea, 0x82000500, 0x00000007, 0x82000580, + 0x00000001, 0x04020005, 0x42000800, 0x00000000, + 0x0201f800, 0x00106c6c, 0x5c000800, 0x4807c025, + 0x80040920, 0x4807c026, 0x5c000000, 0x4803c023, + 0x80000120, 0x4803c024, 0x5c000000, 0x4803c857, + 0x4803c021, 0x80000120, 0x4803c022, 0x41f80000, + 0x4803c027, 0x80000120, 0x4803c028, 0x42000000, + 0x00001000, 0x50000000, 0x82000480, 0x24320001, + 0x4803c857, 0x0400104f, 0x42000800, 0x00000064, + 0x80040840, 0x04000007, 0x4a030000, 0x00000001, + 0x40000000, 0x59800000, 0x8c000500, 0x040007f9, + 0x04000042, 0x42000800, 0x0010c1a3, 0x46000800, + 0xfaceface, 0x80040800, 0x42001000, 0x00007a00, + 0x58080013, 0x44000800, 0x80040800, 0x58080019, + 0x44000800, 0x80040800, 0x5808001a, 0x44000800, + 0x80040800, 0x5808001b, 0x44000800, 0x80040800, + 0x5808001c, 0x44000800, 0x80040800, 0x5808001f, + 0x44000800, 0x80040800, 0x42001000, 0x00007a40, + 0x42001800, 0x0000000b, 0x50080000, 0x44000800, + 0x80081000, 0x80040800, 0x800c1840, 0x040207fb, + 0x42001800, 0x00000003, 0x42001000, 0x00007b00, + 0x480c1003, 0x58080005, 0x44000800, 0x80040800, + 0x800c1840, 0x040217fb, 0x42001000, 0x00007c00, + 0x58080002, 0x44000800, 0x80040800, 0x58080003, + 0x44000800, 0x80040800, 0x58080020, 0x44000800, + 0x80040800, 0x58080021, 0x44000800, 0x80040800, + 0x58080022, 0x44000800, 0x80040800, 0x58080023, + 0x44000800, 0x80040800, 0x4a030000, 0x00000000, + 0x485fc020, 0x905cb9c0, 0x825cbd40, 0x00000012, + 0x485fc011, 0x4203e000, 0x40000000, 0x4202d800, + 0x00000005, 0x59e00017, 0x8c000508, 0x04000003, + 0x4a03c017, 0x00000002, 0x4203e000, 0x30000001, + 0x0401f81a, 0x0401f7ff, 0x4a03c850, 0x0010c1bf, + 0x4a03c851, 0x0010d1be, 0x4a03c853, 0x00000800, + 0x4a03c855, 0x0001eb5a, 0x59e40001, 0x82000540, + 0x00003f00, 0x4803c801, 0x4a03b104, 0x70000002, + 0x4a03a804, 0x70000002, 0x4a03b004, 0x70000002, + 0x42000000, 0x0010b8ec, 0x49780001, 0x49780002, + 0x1c01f000, 0x1c01f000, 0x59a8006b, 0x8c000530, + 0x040207fe, 0x4c080000, 0x42001000, 0x00000004, + 0x0401f862, 0x5c001000, 0x4201d000, 0x00028b0a, + 0x0201f800, 0x0010608e, 0x4c080000, 0x42001000, + 0x00000008, 0x0401f859, 0x5c001000, 0x4201d000, + 0x00028b0a, 0x0201f800, 0x0010608e, 0x4c080000, + 0x42001000, 0x00000010, 0x0401f850, 0x5c001000, + 0x4201d000, 0x00028b0a, 0x0201f800, 0x0010608e, + 0x0401f7e2, 0x8c00050c, 0x59a8086b, 0x04020003, + 0x84040d30, 0x0401f006, 0x84040d70, 0x4807506b, + 0x42001000, 0x00000000, 0x0401f040, 0x4807506b, + 0x836c0500, 0x00000007, 0x0c01f001, 0x001006e1, + 0x001006c7, 0x001006c7, 0x001006af, 0x001006d4, + 0x001006c7, 0x001006c7, 0x001006d4, 0x59a80005, + 0x8c000514, 0x04020013, 0x59c40801, 0x82040d00, + 0x00018000, 0x82040580, 0x00010000, 0x0400000a, + 0x82040580, 0x00008000, 0x04000004, 0x42001000, + 0x42004000, 0x0401f006, 0x42001000, 0x22002000, + 0x0401f003, 0x42001000, 0x12001000, 0x0401f025, + 0x42001000, 0x00001004, 0x0401f022, 0x59a80005, + 0x8c000514, 0x04020008, 0x59a8006b, 0x8c000534, + 0x04020004, 0x42001000, 0x74057005, 0x0401f819, + 0x1c01f000, 0x42001000, 0x00002008, 0x0401f7fc, + 0x59a8006b, 0x8c000534, 0x0402000a, 0x59a80005, + 0x8c000514, 0x04000004, 0x42001000, 0x24052005, + 0x0401f00c, 0x42001000, 0x74057005, 0x0401f009, + 0x1c01f000, 0x1c01f000, 0x82081500, 0x0000001c, + 0x82081540, 0x001c0000, 0x480bc013, 0x1c01f000, + 0x59a8006b, 0x8c000530, 0x04000002, 0x84081570, + 0x480b506b, 0x8c000530, 0x04020005, 0x82081500, + 0x00007000, 0x80081114, 0x0401fff0, 0x1c01f000, + 0x41780000, 0x50041800, 0x800c0400, 0x80040800, + 0x80102040, 0x040207fc, 0x80080500, 0x80000540, + 0x1c01f000, 0x4202f000, 0x00000000, 0x41780000, + 0x41780800, 0x41781000, 0x41781800, 0x41782000, + 0x41782800, 0x41783000, 0x41783800, 0x41784000, + 0x41784800, 0x41785000, 0x41785800, 0x41786000, + 0x41786800, 0x41787000, 0x41787800, 0x41788000, + 0x41788800, 0x41789000, 0x41789800, 0x4178a000, + 0x4178a800, 0x4178b000, 0x4178b800, 0x4178c000, + 0x4178c800, 0x4178d000, 0x4178d800, 0x4178e000, + 0x4178e800, 0x4178f000, 0x4178f800, 0x41790000, + 0x41790800, 0x41791000, 0x41791800, 0x41792000, + 0x41792800, 0x41793000, 0x41793800, 0x41794000, + 0x41794800, 0x41795000, 0x41795800, 0x41796000, + 0x41796800, 0x41797000, 0x41797800, 0x41798000, + 0x41798800, 0x42019000, 0x0010b537, 0x42019800, + 0x0010b50e, 0x4179a000, 0x4179b000, 0x4179a800, + 0x4179b800, 0x4179c800, 0x4179c000, 0x4179d000, + 0x4179d800, 0x4179e000, 0x4179e800, 0x4179f000, + 0x4179f800, 0x417a0000, 0x417a0800, 0x417a1000, + 0x417a1800, 0x417a2000, 0x42022800, 0x00006100, + 0x417a3000, 0x417a3800, 0x417a4000, 0x417a4800, + 0x417a5000, 0x417a5800, 0x417a6000, 0x417a6800, + 0x417a7000, 0x417a7800, 0x417a8000, 0x417a8800, + 0x417a9000, 0x417a9800, 0x417ae800, 0x417af800, + 0x42030000, 0x00007c00, 0x42031000, 0x0010b806, + 0x42031800, 0x0000bf1d, 0x42032000, 0x0000bf32, + 0x42032800, 0x0010b7ce, 0x42033000, 0x0010b46e, + 0x42034000, 0x0010b4a4, 0x42033800, 0x0010b4c3, + 0x42034800, 0x0010b544, 0x42035000, 0x0010b400, + 0x42035800, 0x0010ac00, 0x42030800, 0x0010b505, + 0x417b6000, 0x42036800, 0x00006f00, 0x4203c800, + 0x00003000, 0x42037000, 0x0000ff00, 0x42037800, + 0x0000bf00, 0x42038000, 0x00007700, 0x42038800, + 0x00004000, 0x42039000, 0x00006000, 0x42039800, + 0x0010bedb, 0x4203a000, 0x00007600, 0x4203a800, + 0x00007400, 0x4203b000, 0x00007200, 0x4203b800, + 0x00007100, 0x4203c000, 0x00007000, 0x4203d000, + 0x00000000, 0x4203e800, 0x00101b95, 0x417bd800, + 0x1c01f000, 0x42000800, 0x00100000, 0x50040000, + 0x4c000000, 0x42000000, 0x0000aaaa, 0x44000800, + 0x42001800, 0x00005555, 0x41782000, 0x82102400, + 0x00010000, 0x40100000, 0x80042c00, 0x440c2800, + 0x42003000, 0x0000000a, 0x80183040, 0x040207ff, + 0x50140000, 0x800c0580, 0x04020004, 0x50040000, + 0x800c0580, 0x040207f2, 0x5c000000, 0x44000800, + 0x80142840, 0x4817c861, 0x1c01f000, 0x59a8081f, + 0x800409c0, 0x04020009, 0x49781c0c, 0x4a001a0c, + 0x00000200, 0x4a001804, 0x07000000, 0x59a80010, + 0x9c0001c0, 0x48001805, 0x0401fe01, 0x9c0409c0, + 0x48041806, 0x1c01f000, 0x59a8080c, 0x4006d000, + 0x4202b800, 0x00000001, 0x59a8180d, 0x480fc857, + 0x82041400, 0x00000014, 0x82082400, 0x00000014, + 0x40100000, 0x800c0480, 0x04001006, 0x44080800, + 0x40080800, 0x40101000, 0x815eb800, 0x0401f7f7, + 0x45780800, 0x495f5020, 0x1c01f000, 0x835c0480, + 0x00000020, 0x04001009, 0x496bc857, 0x815eb840, + 0x416a5800, 0x592ed000, 0x497a5800, 0x497a5801, + 0x812e59c0, 0x1c01f000, 0x42000000, 0x0010b853, + 0x0201f800, 0x0010aa47, 0x417a5800, 0x0401f7f9, + 0x815eb840, 0x04001008, 0x416a5800, 0x492fc857, + 0x592ed000, 0x497a5800, 0x497a5801, 0x812e59c0, + 0x1c01f000, 0x42000000, 0x0010b853, 0x0201f800, + 0x0010aa47, 0x417ab800, 0x417a5800, 0x0401f7f8, + 0x492fc857, 0x496a5800, 0x412ed000, 0x815eb800, + 0x59c80000, 0x82000540, 0x00001200, 0x48039000, + 0x1c01f000, 0x492fc857, 0x812e59c0, 0x04000007, + 0x592c0001, 0x497a5801, 0x4c000000, 0x0401fff1, + 0x5c025800, 0x0401f7f9, 0x1c01f000, 0x4807c856, + 0x42007000, 0x0010b7f8, 0x4a007001, 0x00000000, + 0x59e00003, 0x82000540, 0x00008080, 0x4803c003, + 0x4a03b805, 0x90000001, 0x59dc0006, 0x4a03b805, + 0x70000000, 0x59dc0006, 0x4a03b805, 0x30000000, + 0x4200b000, 0x00000020, 0x497bb807, 0x8058b040, + 0x040207fe, 0x4a03b805, 0x30000000, 0x59dc0006, + 0x4a03b805, 0x60000001, 0x59dc0006, 0x4a03b805, + 0x70000001, 0x59dc0006, 0x4a03b805, 0x30000002, + 0x4200b000, 0x00000020, 0x497bb807, 0x8058b040, + 0x040207fe, 0x4a03b805, 0x30000000, 0x59dc0006, + 0x4a03b805, 0x60000001, 0x0401ffa1, 0x04000da5, + 0x42001000, 0x0010b7f6, 0x452c1000, 0x4a025801, + 0x00000001, 0x4a025802, 0x00000100, 0x4a025809, + 0x00107149, 0x497a580a, 0x497a580b, 0x497a580c, + 0x0401ff93, 0x04000d97, 0x42001000, 0x0010b7f7, + 0x452c1000, 0x4a025801, 0x00000000, 0x4a025802, + 0x00000100, 0x4a025809, 0x001011bc, 0x497a5803, + 0x497a5807, 0x497a5808, 0x497a580a, 0x59a80005, + 0x8c00050e, 0x04000006, 0x4a03b805, 0xe0000001, + 0x59dc0006, 0x8c000522, 0x040007fc, 0x1c01f000, + 0x4df00000, 0x4203e000, 0x50000000, 0x4c380000, + 0x40087000, 0x480bc857, 0x4a007002, 0x00000000, + 0x42007000, 0x0010b7f8, 0x82080400, 0x00000000, + 0x45780000, 0x58380005, 0x48087005, 0x80000540, + 0x04000005, 0x82000400, 0x00000000, 0x44080000, + 0x0401f003, 0x480bc857, 0x48087006, 0x58380001, + 0x80000540, 0x0400080c, 0x5c007000, 0x5c03e000, + 0x1c01f000, 0x4c380000, 0x42007000, 0x0010b7f8, + 0x58380001, 0x80000540, 0x04000803, 0x5c007000, + 0x1c01f000, 0x42007000, 0x0010b7f8, 0x58380001, + 0x82000580, 0x00000000, 0x04020012, 0x58380000, + 0x0c01f001, 0x0010088e, 0x0010088d, 0x0010088d, + 0x0010088d, 0x0010088d, 0x0010088d, 0x0010088d, + 0x0010088d, 0x0401fd4b, 0x58380808, 0x800409c0, + 0x04020024, 0x58380006, 0x80000540, 0x04020002, + 0x1c01f000, 0x4803c857, 0x48007002, 0x40006800, + 0x58340000, 0x80000540, 0x04020002, 0x48007005, + 0x48007006, 0x4a03b805, 0x20000000, 0x59dc0006, + 0x4a03b805, 0x30000000, 0x58340007, 0x4803b800, + 0x58340008, 0x4803b801, 0x58340004, 0x48007003, + 0x58340003, 0x48007004, 0x4803b803, 0x58340001, + 0x8c000500, 0x04000004, 0x4a007001, 0x00000001, + 0x0401f028, 0x4a007001, 0x00000002, 0x0401f03d, + 0x0201f800, 0x001093ea, 0x0201f800, 0x0010a69d, + 0x04000017, 0x4a03b805, 0x20000000, 0x59dc0006, + 0x4a03b805, 0x30000000, 0x4807b800, 0x480bb801, + 0x4a007003, 0x00000010, 0x480c7009, 0x42001000, + 0x00100875, 0x0201f800, 0x00105f9a, 0x58380008, + 0x82000400, 0x00000004, 0x48007004, 0x4803b803, + 0x4a007001, 0x00000007, 0x0401f022, 0x0201f800, + 0x00109402, 0x42000800, 0x00000001, 0x42001000, + 0x00100875, 0x0201f800, 0x00105f76, 0x0401f7ba, + 0x4c040000, 0x4c080000, 0x58380803, 0x42001000, + 0x00003fff, 0x82040480, 0x00003fff, 0x04021003, + 0x40041000, 0x80000580, 0x48007003, 0x800800c4, + 0x4803b802, 0x4a03b805, 0x30000002, 0x59dc0006, + 0x4a03b805, 0x70000001, 0x59dc0006, 0x4a03b805, + 0x10000000, 0x5c001000, 0x5c000800, 0x1c01f000, + 0x483bc857, 0x4c040000, 0x4c080000, 0x58380803, + 0x42001000, 0x00003fff, 0x82040480, 0x00003fff, + 0x04021003, 0x40041000, 0x80000580, 0x48007003, + 0x800800c4, 0x4803b802, 0x4a03b805, 0x10000002, + 0x5c001000, 0x5c000800, 0x1c01f000, 0x4c040000, + 0x4c380000, 0x42007000, 0x0010b7f8, 0x59dc0806, + 0x4807c857, 0x4a03b805, 0x20000000, 0x8c040d3e, + 0x04000007, 0x8c040d08, 0x04020cca, 0x58380001, + 0x82000500, 0x00000007, 0x0c01f804, 0x5c007000, + 0x5c000800, 0x1c01f000, 0x0010087d, 0x0010091e, + 0x0010092e, 0x001005d8, 0x001005d8, 0x001005d8, + 0x001005d8, 0x001011ea, 0x4807c856, 0x82040d00, + 0x43000f80, 0x04020009, 0x58380003, 0x80000540, + 0x0400001c, 0x59dc0000, 0x4803b800, 0x59dc0001, + 0x4803b801, 0x0401f7af, 0x58380802, 0x4a000802, + 0x00000200, 0x0401f01e, 0x4807c856, 0x82040d00, + 0x43000f80, 0x04020009, 0x58380003, 0x80000540, + 0x0400000c, 0x59dc0000, 0x4803b800, 0x59dc0001, + 0x4803b801, 0x0401f7b7, 0x58380002, 0x82000400, + 0x00000002, 0x46000000, 0x00000200, 0x0401f00c, + 0x4c340000, 0x58386802, 0x59dc0000, 0x4803c857, + 0x48006807, 0x59dc0001, 0x4803c857, 0x48006808, + 0x4a006802, 0x00000100, 0x5c006800, 0x4a007001, + 0x00000000, 0x4c300000, 0x58386002, 0x0401f80c, + 0x04000009, 0x58300009, 0x82000c80, 0x0010ab4a, + 0x04021c84, 0x82000c80, 0x00020000, 0x04001c81, + 0x0801f800, 0x5c006000, 0x0401f723, 0x4833c857, + 0x803061c0, 0x04000009, 0x59a8000c, 0x80300480, + 0x04001007, 0x59a8000d, 0x80300480, 0x04021004, + 0x82000540, 0x00000001, 0x1c01f000, 0x80000580, + 0x1c01f000, 0x4803c856, 0x4dc00000, 0x42007000, + 0x0010b803, 0x4a007400, 0x00000000, 0x49787001, + 0x42038000, 0x00007720, 0x4a038006, 0x60000001, + 0x4a038009, 0xf4f60000, 0x42038000, 0x00007700, + 0x4a038006, 0x60000001, 0x4a038009, 0xf4f60000, + 0x4a03c822, 0x00000010, 0x4a0370e8, 0x00000000, + 0x0401f809, 0x4a0370e9, 0x00003a0f, 0x4a0370e8, + 0x00000000, 0x4a0370e8, 0x00000001, 0x5c038000, + 0x1c01f000, 0x4c5c0000, 0x4178b800, 0x0401f80a, + 0x5c00b800, 0x1c01f000, 0x4803c856, 0x4c5c0000, + 0x825cbd40, 0x00000001, 0x0401f803, 0x5c00b800, + 0x1c01f000, 0x4803c856, 0x4dc00000, 0x4c500000, + 0x4c580000, 0x4c540000, 0x4a0370e8, 0x00000000, + 0x805cb9c0, 0x04000009, 0x4a038807, 0x00000004, + 0x59b800ea, 0x8c000510, 0x04000004, 0x59b800e0, + 0x0401f87b, 0x0401f7fb, 0x42038000, 0x00007720, + 0x0201f800, 0x00100ec1, 0x59c00007, 0x4a038006, + 0x20000000, 0x59c00007, 0x4a038006, 0x8000000a, + 0x59c00007, 0x4a038006, 0x8000000b, 0x59c00007, + 0x4a038006, 0x40000001, 0x83c00580, 0x00007700, + 0x04000004, 0x42038000, 0x00007700, 0x0401f7ed, + 0x42038000, 0x00007720, 0x42000800, 0x00000800, + 0x59c00007, 0x8c00051e, 0x04000006, 0x4a038006, + 0x90000001, 0x80040840, 0x040207fa, 0x0401fc11, + 0x83c00580, 0x00007700, 0x04000004, 0x42038000, + 0x00007700, 0x0401f7f1, 0x805cb9c0, 0x0402001d, + 0x4200b000, 0x00000020, 0x83b8ac00, 0x00000020, + 0x0201f800, 0x0010ab20, 0x4a0370fb, 0x00000001, + 0x4a037020, 0x001010bd, 0x59a80039, 0x82000500, + 0x0000ffff, 0x48037021, 0x4a037035, 0x0010bddb, + 0x4a037030, 0x0010b410, 0x4a037031, 0x0010ac00, + 0x4a037032, 0x0010b519, 0x4a037036, 0x0010b524, + 0x59840002, 0x48037034, 0x4a037038, 0x001010b4, + 0x4a0370fb, 0x00000001, 0x4178a000, 0x4200b000, + 0x00000020, 0x83b8ac00, 0x00000000, 0x0201f800, + 0x0010ab20, 0x4200b000, 0x00000040, 0x83b8ac00, + 0x00000040, 0x0201f800, 0x0010ab20, 0x805cb9c0, + 0x04020004, 0x4a0370e4, 0xaaaaaaaa, 0x0401f003, + 0x4a0370e4, 0xa2aaaa82, 0x4a0370e5, 0xaaaaaaaa, + 0x4a0370e6, 0xaaaaaaaa, 0x4a0370fb, 0x00000000, + 0x4a0370e6, 0xaaaaaaaa, 0x42038000, 0x00007720, + 0x4a038006, 0x90000000, 0x59c00007, 0x8c00051e, + 0x02020800, 0x001005d8, 0x42038000, 0x00007700, + 0x4a038006, 0x90000000, 0x59c00007, 0x8c00051e, + 0x02020800, 0x001005d8, 0x5c00a800, 0x5c00b000, + 0x5c00a000, 0x5c038000, 0x1c01f000, 0x4d300000, + 0x4d380000, 0x40026000, 0x82000500, 0x7f000000, + 0x82000580, 0x00000003, 0x0402000f, 0x83326500, + 0x00ffffff, 0x59300203, 0x82000580, 0x00000004, + 0x04020009, 0x59300c06, 0x82040580, 0x00000009, + 0x04020005, 0x42027000, 0x00000047, 0x0201f800, + 0x000207a1, 0x5c027000, 0x5c026000, 0x1c01f000, + 0x4d300000, 0x4d2c0000, 0x4d340000, 0x4d400000, + 0x4cfc0000, 0x4d380000, 0x4d3c0000, 0x4d440000, + 0x4d4c0000, 0x4d480000, 0x4c5c0000, 0x4c600000, + 0x4c640000, 0x4cc80000, 0x4ccc0000, 0x4cf00000, + 0x4cf40000, 0x4cf80000, 0x4cfc0000, 0x4d000000, + 0x4d040000, 0x0201f800, 0x00020015, 0x5c020800, + 0x5c020000, 0x5c01f800, 0x5c01f000, 0x5c01e800, + 0x5c01e000, 0x5c019800, 0x5c019000, 0x5c00c800, + 0x5c00c000, 0x5c00b800, 0x5c029000, 0x5c029800, + 0x5c028800, 0x5c027800, 0x5c027000, 0x5c01f800, + 0x5c028000, 0x5c026800, 0x5c025800, 0x5c026000, + 0x1c01f000, 0x493bc857, 0x0201f000, 0x00020044, + 0x83300500, 0x1f000000, 0x04000008, 0x81326580, + 0x80000130, 0x82000c80, 0x00000014, 0x02021800, + 0x001005d8, 0x0c01f013, 0x83300500, 0x000000ff, + 0x82000c80, 0x00000007, 0x02021800, 0x001005d8, + 0x0c01f025, 0x1c01f000, 0x82000d00, 0xc0000038, + 0x02020800, 0x001005d0, 0x0201f800, 0x001005d8, + 0x00000000, 0x00000048, 0x00000054, 0x00000053, + 0x00100a9b, 0x00100abf, 0x00100aba, 0x00100adf, + 0x00100aa6, 0x00100ab2, 0x00100a9b, 0x00100ada, + 0x00100b1a, 0x00100a9b, 0x00100a9b, 0x00100a9b, + 0x00100a9b, 0x00100b1d, 0x00100b23, 0x00100b34, + 0x00100b45, 0x00100a9b, 0x00100b4e, 0x00100b5a, + 0x00100a9b, 0x00100a9b, 0x00100a9b, 0x0201f800, + 0x001005d8, 0x00100aa4, 0x00100bff, 0x00100aec, + 0x00100b0f, 0x00100aa4, 0x00100aa4, 0x00100aa4, + 0x0201f800, 0x001005d8, 0x4803c856, 0x59300004, + 0x8c00053e, 0x04020005, 0x42027000, 0x00000055, + 0x0201f000, 0x000207a1, 0x0201f800, 0x00106f60, + 0x040007fa, 0x1c01f000, 0x4803c856, 0x0401f8a9, + 0x40002800, 0x41782000, 0x42027000, 0x00000056, + 0x0201f000, 0x000207a1, 0x4803c856, 0x42027000, + 0x00000057, 0x0201f000, 0x000207a1, 0x4803c856, + 0x59300007, 0x8c00051a, 0x04020010, 0x59325808, + 0x812e59c0, 0x04000014, 0x592c0408, 0x8c00051c, + 0x04020003, 0x4a026011, 0xffffffff, 0x59300004, + 0x8c00053e, 0x04020009, 0x42027000, 0x00000048, + 0x0201f000, 0x000207a1, 0x59325808, 0x4a025a06, + 0x00000007, 0x0401f7f4, 0x0201f800, 0x00106f60, + 0x040007f6, 0x1c01f000, 0x4803c856, 0x83300500, + 0x00ffffff, 0x0201f000, 0x001064d7, 0x1c01f000, + 0x4c040000, 0x59b808ea, 0x82040d00, 0x00000007, + 0x82040580, 0x00000003, 0x04000004, 0x42000000, + 0x60000000, 0x0401f8ab, 0x5c000800, 0x1c01f000, + 0x0401f8f9, 0x59325808, 0x812e59c0, 0x04000018, + 0x592c0204, 0x82000500, 0x000000ff, 0x82000d80, + 0x00000029, 0x04020012, 0x59300203, 0x82000580, + 0x00000003, 0x0400000b, 0x59300807, 0x84040d26, + 0x48066007, 0x0201f800, 0x00020086, 0x4a03900d, + 0x00000040, 0x4a0370e5, 0x00000008, 0x1c01f000, + 0x0201f800, 0x00106f60, 0x040007f4, 0x59880052, + 0x80000000, 0x48031052, 0x4a03900d, 0x00000040, + 0x42000000, 0xc0000000, 0x0401f05a, 0x42007800, + 0x0010bde2, 0x42002000, 0x00003000, 0x42003000, + 0x00000105, 0x0201f800, 0x00105e04, 0x4a0370e4, + 0x02000000, 0x1c01f000, 0x4933c857, 0x0201f000, + 0x0002077d, 0x41300800, 0x800409c0, 0x02020800, + 0x001005d8, 0x0201f800, 0x001005d0, 0x4933c857, + 0x813261c0, 0x02000800, 0x001005d8, 0x0401f835, + 0x40002800, 0x0201f800, 0x0010a99c, 0x0401f8ae, + 0x04000007, 0x59326809, 0x59340200, 0x8c00050e, + 0x59300414, 0x02020800, 0x001092ce, 0x1c01f000, + 0x4933c857, 0x813261c0, 0x02000800, 0x001005d8, + 0x0401f8a1, 0x0400000b, 0x59325808, 0x0201f800, + 0x00109037, 0x04000007, 0x592c0208, 0x8400054e, + 0x48025a08, 0x417a7800, 0x0201f800, 0x00108be3, + 0x1c01f000, 0x485fc857, 0x5c000000, 0x4d780000, + 0x4203e000, 0x50000000, 0x4200b800, 0x00008005, + 0x0201f000, 0x001005dd, 0x4933c857, 0x83300480, + 0x00000020, 0x02021800, 0x001005d8, 0x83300c00, + 0x0010b8cc, 0x50040000, 0x80000000, 0x04001002, + 0x44000800, 0x1c01f000, 0x4933c857, 0x0401f7f4, + 0x4807c856, 0x59b800ea, 0x8c000510, 0x040007fd, + 0x59b800e0, 0x4803c857, 0x1c01f000, 0x4803c856, + 0x42000000, 0x10000000, 0x41300800, 0x0401f02d, + 0x82000500, 0xf0000000, 0x82040d00, 0x0fffffff, + 0x80040d40, 0x4807c857, 0x59b800ea, 0x8c000516, + 0x04020003, 0x480770e1, 0x1c01f000, 0x8c000510, + 0x040007fa, 0x4c040000, 0x0401f809, 0x5c000800, + 0x82100480, 0x00000008, 0x040017f4, 0x4c040000, + 0x0401febc, 0x5c000800, 0x0401f7f0, 0x59b800e2, + 0x59b820e2, 0x80100580, 0x040207fd, 0x80102114, + 0x0401f006, 0x59b800e2, 0x59b820e2, 0x80100580, + 0x040207fd, 0x0401f001, 0x40101800, 0x800c190a, + 0x82100500, 0x0000001f, 0x820c1d00, 0x0000001f, + 0x800c2480, 0x82102500, 0x0000001f, 0x1c01f000, + 0x82000500, 0xf0000000, 0x82040d00, 0x0fffffff, + 0x80040d40, 0x4807c857, 0x42001000, 0x0010b804, + 0x50080000, 0x80000540, 0x04020005, 0x4a0370e5, + 0x00000003, 0x4a0370e4, 0x00000300, 0x80000000, + 0x44001000, 0x42001000, 0x00000400, 0x59b800ea, + 0x8c000510, 0x0400000c, 0x0401ffd5, 0x82100480, + 0x00000008, 0x04001007, 0x4c040000, 0x4c080000, + 0x0401fe88, 0x5c001000, 0x5c000800, 0x0401f020, + 0x59b800ea, 0x8c000516, 0x0402001d, 0x4a0370e4, + 0x00300000, 0x480770e1, 0x42001000, 0x0000ff00, + 0x80081040, 0x04000012, 0x59b808e4, 0x8c040d28, + 0x040207fc, 0x42001000, 0x0010b804, 0x50080000, + 0x80000040, 0x04020005, 0x4a0370e5, 0x00000002, + 0x4a0370e4, 0x00000200, 0x02001800, 0x001005d8, + 0x44001000, 0x8c040d2c, 0x1c01f000, 0x41f80000, + 0x50000000, 0x0201f800, 0x001005d8, 0x80081040, + 0x040207d3, 0x41f80000, 0x50000000, 0x0201f800, + 0x001005d8, 0x4d380000, 0x59300c06, 0x82040580, + 0x00000009, 0x04020006, 0x42027000, 0x00000047, + 0x0201f800, 0x000207a1, 0x80000580, 0x5c027000, + 0x1c01f000, 0x4c500000, 0x4a03900d, 0x00000001, + 0x59c8a020, 0x4a03900d, 0x00000002, 0x59c80820, + 0x8c50a52e, 0x04000002, 0x900409c0, 0x82040d00, + 0x0000ffff, 0x0201f800, 0x00105dd7, 0x02000800, + 0x001005d8, 0x4933c857, 0x8250a500, 0xff000000, + 0x82500580, 0x05000000, 0x04000003, 0x82000540, + 0x00000001, 0x5c00a000, 0x1c01f000, 0x0401ffe6, + 0x4933c857, 0x59300406, 0x82000580, 0x00000000, + 0x04000040, 0x59c82021, 0x4a03900d, 0x00000001, + 0x59c82821, 0x82142d00, 0x0000ffff, 0x59325808, + 0x812e59c0, 0x04000037, 0x59326809, 0x0201f800, + 0x001048d9, 0x02020800, 0x001092b6, 0x599c0019, + 0x8c00050c, 0x04020018, 0x0201f800, 0x001048d9, + 0x04020015, 0x59300811, 0x4807c857, 0x592c0408, + 0x8c00051c, 0x0402000e, 0x8400055c, 0x48025c08, + 0x592c0a04, 0x82040d00, 0x000000ff, 0x82040580, + 0x00000048, 0x04000004, 0x82040580, 0x00000018, + 0x04020003, 0x59300811, 0x48065803, 0x4a026011, + 0x7fffffff, 0x48166013, 0x0201f800, 0x001010dd, + 0x04020014, 0x0401f9fd, 0x40280000, 0x4802600d, + 0x04000005, 0x4832600b, 0x50200000, 0x4802600a, + 0x4822600c, 0x59300414, 0x8c00051c, 0x04020004, + 0x599c0019, 0x8c00050c, 0x0402086e, 0x4a03900d, + 0x00000040, 0x4a0370e5, 0x00000008, 0x1c01f000, + 0x59880052, 0x80000000, 0x48031052, 0x4a03900d, + 0x00000040, 0x42000000, 0xc0000000, 0x0401f71d, + 0x4cf80000, 0x58f40000, 0x8001f540, 0x0401f820, + 0x41781800, 0x0401f8e4, 0x04020014, 0x44140800, + 0x0401f82a, 0x04000011, 0x40043800, 0x42001800, + 0x00000001, 0x40142000, 0x0401f8db, 0x0402000b, + 0x801c3800, 0x501c0000, 0x44000800, 0x0401f810, + 0x801c0580, 0x04000004, 0x44103800, 0x801c3840, + 0x44143800, 0x0401f819, 0x5c01f000, 0x1c01f000, + 0x80f9f1c0, 0x04020003, 0x58f41202, 0x0401f003, + 0x42001000, 0x00000007, 0x1c01f000, 0x80f9f1c0, + 0x04020006, 0x58f40401, 0x82000480, 0x00000002, + 0x80f40400, 0x0401f005, 0x58f80401, 0x82000480, + 0x00000002, 0x80f80400, 0x50002800, 0x80000000, + 0x50002000, 0x1c01f000, 0x80f9f1c0, 0x04020008, + 0x58f40401, 0x82000480, 0x00000002, 0x02001800, + 0x001005d8, 0x4801ec01, 0x0401f00b, 0x58f80401, + 0x82000480, 0x00000002, 0x02001800, 0x001005d8, + 0x4801f401, 0x82000580, 0x00000002, 0x04020002, + 0x0401f809, 0x58f40202, 0x80000040, 0x4801ea02, + 0x02000800, 0x001005d8, 0x82000580, 0x00000001, + 0x1c01f000, 0x4d2c0000, 0x40fa5800, 0x0201f800, + 0x001007f4, 0x4979e800, 0x4179f000, 0x5c025800, + 0x1c01f000, 0x80f5e9c0, 0x04000009, 0x80f9f1c0, + 0x04020ff5, 0x4d2c0000, 0x40f65800, 0x0201f800, + 0x001007f4, 0x4179e800, 0x5c025800, 0x1c01f000, + 0x4cf40000, 0x59300807, 0x82040500, 0x00003100, + 0x04020032, 0x8c040d22, 0x04000032, 0x5930001f, + 0x8001ed40, 0x02000800, 0x001005d8, 0x82000580, + 0xffffffff, 0x04000029, 0x58f40201, 0x82000580, + 0x0000dcb3, 0x02020800, 0x001005d8, 0x58f40a02, + 0x82040500, 0x0000fffe, 0x04000003, 0x0401ff89, + 0x58f40a02, 0x82040480, 0x0000000f, 0x04021059, + 0x80040800, 0x4805ea02, 0x82040580, 0x00000008, + 0x0400005d, 0x82040480, 0x00000008, 0x0400100a, + 0x58f40000, 0x8001ed40, 0x02000800, 0x001005d8, + 0x58f40201, 0x82000580, 0x0000ddb9, 0x02020800, + 0x001005d8, 0x58f40401, 0x82000c00, 0x00000002, + 0x4805ec01, 0x80f40400, 0x59300812, 0x44040000, + 0x80000000, 0x45780000, 0x5c01e800, 0x1c01f000, + 0x42001000, 0x00000400, 0x59b800e4, 0x8c000524, + 0x04020023, 0x4a0370e4, 0x00030000, 0x40000000, + 0x59b800e4, 0x8c000524, 0x0402001b, 0x59300807, + 0x84040d62, 0x48066007, 0x4a0370e4, 0x00020000, + 0x4d2c0000, 0x0201f800, 0x001007d3, 0x04000025, + 0x492e601f, 0x4a025a01, 0x0000dcb3, 0x59300008, + 0x80001d40, 0x02000800, 0x001005d8, 0x580c080f, + 0x48065803, 0x59301811, 0x40040000, 0x800c0580, + 0x0402000d, 0x497a5a02, 0x4a025c01, 0x00000004, + 0x0401f011, 0x4a0370e4, 0x00020000, 0x40000000, + 0x40000000, 0x80081040, 0x02000800, 0x001005d8, + 0x0401f7d6, 0x4a025a02, 0x00000001, 0x4a025c01, + 0x00000006, 0x497a5804, 0x400c0000, 0x80040480, + 0x48025805, 0x412de800, 0x5c025800, 0x0401f7a9, + 0x5c025800, 0x4a02601f, 0xffffffff, 0x0401f7c3, + 0x4d2c0000, 0x58f65800, 0x0201f800, 0x001007f4, + 0x40f65800, 0x0201f800, 0x001007f4, 0x5c025800, + 0x0401f7f5, 0x4d2c0000, 0x0201f800, 0x001007d3, + 0x040007f8, 0x4a025a01, 0x0000ddb9, 0x4a025c01, + 0x00000002, 0x492de800, 0x412de800, 0x5c025800, + 0x0401f7a5, 0x0401ff33, 0x82f40400, 0x00000004, + 0x800c0400, 0x40000800, 0x50040000, 0x80100580, + 0x04000016, 0x82040c00, 0x00000002, 0x80081040, + 0x040207fa, 0x80f9f1c0, 0x04000011, 0x58f41202, + 0x82081480, 0x00000007, 0x82f80400, 0x00000002, + 0x800c0400, 0x40000800, 0x50040000, 0x80100580, + 0x04000006, 0x82040c00, 0x00000002, 0x80081040, + 0x040207fa, 0x0401f002, 0x1c01f000, 0x82000540, + 0x00000001, 0x0401f7fd, 0x4cf40000, 0x4cf80000, + 0x4001e800, 0x592c0a06, 0x800409c0, 0x0402001d, + 0x82f40580, 0xffffffff, 0x04000017, 0x58f40201, + 0x82000580, 0x0000dcb3, 0x02020800, 0x001005d8, + 0x58f40000, 0x8001f540, 0x04000006, 0x58f80201, + 0x82000580, 0x0000ddb9, 0x02020800, 0x001005d8, + 0x41783800, 0x0401f839, 0x04020006, 0x0401ff32, + 0x497a601f, 0x5c01f000, 0x5c01e800, 0x1c01f000, + 0x0401ff2d, 0x4a025a06, 0x00000011, 0x0401f7f9, + 0x82f40580, 0xffffffff, 0x04020f27, 0x0401f7f5, + 0x4cf40000, 0x4cf80000, 0x4001e800, 0x82040580, + 0x00000001, 0x0402001f, 0x82f40580, 0xffffffff, + 0x04000019, 0x58f40201, 0x82000580, 0x0000dcb3, + 0x02020800, 0x001005d8, 0x58f40000, 0x8001f540, + 0x04000006, 0x58f80201, 0x82000580, 0x0000ddb9, + 0x02020800, 0x001005d8, 0x41783800, 0x0401f813, + 0x04020008, 0x0401ff0c, 0x42000800, 0x00000001, + 0x497a601f, 0x5c01f000, 0x5c01e800, 0x1c01f000, + 0x0401ff05, 0x42000800, 0x00000011, 0x0401f7f9, + 0x4c040000, 0x82f40580, 0xffffffff, 0x04020efe, + 0x5c000800, 0x0401f7f3, 0x4803c856, 0x401c2000, + 0x41781800, 0x0401ff8c, 0x0402002c, 0x58f42003, + 0x42001800, 0x00000001, 0x0401ff87, 0x04020027, + 0x0401feb8, 0x40082800, 0x82f40400, 0x00000004, + 0x40003000, 0x50182000, 0x40100000, 0x801c0580, + 0x04000005, 0x42001800, 0x00000001, 0x0401ff7a, + 0x0402001a, 0x82183400, 0x00000002, 0x80142840, + 0x040207f5, 0x80f9f1c0, 0x04000013, 0x58f42a02, + 0x82142c80, 0x00000007, 0x82f80400, 0x00000003, + 0x40003000, 0x50182000, 0x40100000, 0x801c0580, + 0x04000005, 0x42001800, 0x00000001, 0x0401ff66, + 0x04020006, 0x82183400, 0x00000002, 0x80142840, + 0x040207f5, 0x1c01f000, 0x82000540, 0x00000001, + 0x0401f7fd, 0x0201f800, 0x001005d8, 0x58380207, + 0x8c000502, 0x040007fc, 0x50200000, 0x80387c00, + 0x583c2800, 0x583c2001, 0x58380404, 0x80001540, + 0x04020002, 0x58381407, 0x58c83401, 0x58380c08, + 0x59303807, 0x497a6012, 0x497a6013, 0x0201f000, + 0x000200be, 0x592c0408, 0x8c000502, 0x040007ea, + 0x592c0409, 0x80000540, 0x040007e7, 0x82000c80, + 0x00000002, 0x04001011, 0x58380001, 0x80007540, + 0x02000800, 0x001005d8, 0x58380204, 0x82000500, + 0x0000000f, 0x82000400, 0x001010bd, 0x50004000, + 0x40040000, 0x800409c0, 0x04000005, 0x82040c80, + 0x00000005, 0x040217f1, 0x80204400, 0x50200000, + 0x80387c00, 0x583c2800, 0x583c2001, 0x583c1002, + 0x592c0a07, 0x592c4c08, 0x592c300d, 0x59303807, + 0x497a6012, 0x497a6013, 0x4816600e, 0x4812600f, + 0x480a6010, 0x481a6011, 0x80040840, 0x4806600d, + 0x02000000, 0x000200c6, 0x80204000, 0x50201800, + 0x800c19c0, 0x0402000c, 0x58380001, 0x80007540, + 0x02000800, 0x001005d8, 0x58380204, 0x82000500, + 0x0000000f, 0x82000400, 0x001010bd, 0x50004000, + 0x50201800, 0x483a600b, 0x480e600a, 0x4822600c, + 0x0201f000, 0x000200c6, 0x4803c856, 0x592c0208, + 0x8c00051e, 0x04020017, 0x50200000, 0x80306c00, + 0x40240000, 0x0c01f001, 0x00100e46, 0x00100e46, + 0x00100e4f, 0x00100e46, 0x00100e46, 0x00100e46, + 0x00100e46, 0x00100e46, 0x00100e4f, 0x00100e46, + 0x00100e4f, 0x00100e46, 0x00100e46, 0x00100e4f, + 0x00100e46, 0x00100e46, 0x0201f800, 0x001005d8, + 0x8400051e, 0x48025a08, 0x50200000, 0x80306c00, + 0x58343801, 0x481e600f, 0x0401f007, 0x58341802, + 0x58342800, 0x58343801, 0x480e6010, 0x4816600e, + 0x481e600f, 0x0401f246, 0x4933c857, 0x5931f808, + 0x59300a06, 0x800409c0, 0x04000005, 0x80040906, + 0x04020002, 0x80040800, 0x4805fc06, 0x4a026206, + 0x00000002, 0x592c0409, 0x82000500, 0x00000008, + 0x0400000b, 0x0401f834, 0x59300203, 0x82000580, + 0x00000004, 0x04020005, 0x42027000, 0x00000048, + 0x0201f800, 0x000207a1, 0x1c01f000, 0x4cfc0000, + 0x58fc0204, 0x82000500, 0x000000ff, 0x82000580, + 0x00000048, 0x0402000c, 0x58fc000b, 0x800001c0, + 0x04000009, 0x58fc0407, 0x800001c0, 0x04000006, + 0x58fc080b, 0x8c040d16, 0x04000017, 0x58fc0007, + 0x0401f00a, 0x58fc0408, 0x8c000512, 0x04020014, + 0x58fc0c09, 0x8c040d16, 0x04020003, 0x5c01f800, + 0x1c01f000, 0x58fc000a, 0x59300811, 0x80040580, + 0x04020009, 0x59300007, 0x84000500, 0x48026007, + 0x42027000, 0x00000048, 0x5c01f800, 0x0201f000, + 0x000207a1, 0x5c01f800, 0x1c01f000, 0x58fdf809, + 0x0401f7ec, 0x4933c857, 0x59b808ea, 0x82040d00, + 0x00000007, 0x82040580, 0x00000000, 0x0400001e, + 0x82040580, 0x00000003, 0x0400001b, 0x59300406, + 0x4c000000, 0x4a026406, 0x00000000, 0x42003000, + 0x00000041, 0x42000000, 0x50000000, 0x41300800, + 0x4c180000, 0x0401fce7, 0x5c003000, 0x0400000b, + 0x42000000, 0x0000001e, 0x80000040, 0x040207ff, + 0x80183040, 0x040207f4, 0x42000000, 0x40000000, + 0x41300800, 0x0401fcdb, 0x5c000000, 0x48026406, + 0x1c01f000, 0x59300007, 0x84000500, 0x48026007, + 0x0401f7fc, 0x59c00007, 0x4a038006, 0x30000000, + 0x40000000, 0x59c00007, 0x8c00050a, 0x040207fe, + 0x1c01f000, 0x5c000000, 0x4c000000, 0x4803c857, + 0x4dc00000, 0x4a0370e8, 0x00000000, 0x42038000, + 0x00007720, 0x0401fff0, 0x42038000, 0x00007700, + 0x0401ffed, 0x0201f800, 0x0010513b, 0x04020013, + 0x4a038891, 0x0000ffff, 0x497b8880, 0x497b8892, + 0x42001000, 0x00000190, 0x40000000, 0x40000000, + 0x80081040, 0x040207fd, 0x42000000, 0x0010b8a6, + 0x0201f800, 0x0010aa47, 0x0401f80e, 0x5c038000, + 0x0201f000, 0x00105258, 0x0401f82d, 0x42000000, + 0x0010b8a7, 0x0201f800, 0x0010aa47, 0x0401f805, + 0x48178892, 0x480b8880, 0x5c038000, 0x1c01f000, + 0x496fc857, 0x836c0580, 0x00000003, 0x0402000b, + 0x4c080000, 0x4c0c0000, 0x42001000, 0x00008048, + 0x42001800, 0x0000ffff, 0x0201f800, 0x00103a3e, + 0x5c001800, 0x5c001000, 0x42000800, 0x0000003c, + 0x0201f800, 0x00101345, 0x59a8006c, 0x80000540, + 0x04000006, 0x59a8106d, 0x800811c0, 0x04000003, + 0x0201f800, 0x00101aaf, 0x4a038891, 0x0000ffff, + 0x4a03900d, 0x00000040, 0x0201f800, 0x0010098e, + 0x4a0370e8, 0x00000001, 0x1c01f000, 0x5c000000, + 0x4c000000, 0x4803c857, 0x59c41080, 0x497b8880, + 0x59c42892, 0x497b8892, 0x0201f800, 0x0010513b, + 0x04020002, 0x1c01f000, 0x42002000, 0x00000260, + 0x59c418a4, 0x820c1d00, 0x0000000f, 0x820c0580, + 0x00000000, 0x04000010, 0x59c41805, 0x820c1d00, + 0x00000001, 0x0402000e, 0x59c418a4, 0x820c1d00, + 0x0000000f, 0x820c0480, 0x00000007, 0x04001004, + 0x820c0480, 0x0000000c, 0x04001003, 0x80102040, + 0x040207ec, 0x497b8891, 0x1c01f000, 0x4c100000, + 0x42002000, 0x00000019, 0x46000000, 0x00000001, + 0x0201f800, 0x00101937, 0x50001800, 0x820c1d00, + 0x00000001, 0x04000005, 0x80102040, 0x040207f7, + 0x5c002000, 0x0401f7f0, 0x5c002000, 0x0401f7ec, + 0x4803c856, 0x1c01f000, 0x4d2c0000, 0x59325808, + 0x592c0a04, 0x4807c857, 0x82040d00, 0x000000ff, + 0x82040500, 0x0000000f, 0x0c01f001, 0x00100f67, + 0x00100f67, 0x00100f67, 0x00100f7f, 0x00100f67, + 0x00100f67, 0x00100f67, 0x00100f67, 0x00100f67, + 0x00100f7f, 0x00100f67, 0x00100f69, 0x00100f67, + 0x00100f67, 0x00100f67, 0x00100f67, 0x0201f800, + 0x001005d8, 0x82040580, 0x0000003b, 0x02020800, + 0x001005d8, 0x592c020a, 0x8c000500, 0x0400005f, + 0x592c1a07, 0x82040500, 0x0000000f, 0x82000400, + 0x001010bd, 0x50001000, 0x50080000, 0x59302013, + 0x4802600a, 0x492e600b, 0x480a600c, 0x480e600d, + 0x48126012, 0x5c025800, 0x1c01f000, 0x82040500, + 0x0000000f, 0x82000400, 0x001010bd, 0x50001000, + 0x50080000, 0x592c1a07, 0x4802600a, 0x492e600b, + 0x480a600c, 0x480e600d, 0x497a6012, 0x0401f7f2, + 0x8c040d00, 0x04020041, 0x82040d00, 0x00000080, + 0x0400003e, 0x0201f000, 0x000200cf, 0x59300013, + 0x59301012, 0x80080580, 0x0402000c, 0x42007800, + 0x80000005, 0x592c1208, 0x82080500, 0xffff7fff, + 0x48025a08, 0x8c08151e, 0x0402002d, 0x823c7d40, + 0x00000020, 0x0401f02a, 0x480bc857, 0x42000000, + 0x0010b851, 0x0201f800, 0x0010aa47, 0x59300414, + 0x4803c857, 0x8c000514, 0x04020007, 0x599c1819, + 0x8c0c1d12, 0x04020004, 0x820c1d40, 0x00000001, + 0x0401f01d, 0x59302013, 0x0401f92b, 0x0402001a, + 0x42007800, 0x80000005, 0x5930500d, 0x592c0208, + 0x4803c857, 0x8c00051e, 0x04020005, 0x823c7d40, + 0x00000020, 0x5930400c, 0x0401f004, 0x8400051e, + 0x48025a08, 0x0401f8da, 0x50201800, 0x480e600a, + 0x4832600b, 0x4822600c, 0x482a600d, 0x480fc857, + 0x4833c857, 0x4823c857, 0x482bc857, 0x80000580, + 0x483e6004, 0x1c01f000, 0x0201f800, 0x001005d8, + 0x4933c857, 0x4d2c0000, 0x59900004, 0x81300580, + 0x02020800, 0x001005d8, 0x0201f800, 0x00109037, + 0x02000800, 0x001005d8, 0x59325808, 0x4d3c0000, + 0x4d400000, 0x59300004, 0x4803c857, 0x4c000000, + 0x0201f800, 0x00106dc3, 0x0201f800, 0x00106b8a, + 0x5c000000, 0x8c000516, 0x04000010, 0x592c000f, + 0x4803c857, 0x48025807, 0x41780800, 0x42028000, + 0x00000002, 0x0201f800, 0x00104e70, 0x4a025c06, + 0x0000ffff, 0x0201f800, 0x000202da, 0x0201f800, + 0x00107911, 0x0401f015, 0x4a026203, 0x00000002, + 0x592c0208, 0x8400054e, 0x48025a08, 0x59300406, + 0x82000580, 0x00000006, 0x04020009, 0x811800ca, + 0x81c80c00, 0x58040939, 0x592c000d, 0x80040480, + 0x592c080f, 0x80040480, 0x4802580b, 0x417a7800, + 0x0201f800, 0x00108be3, 0x5c028000, 0x5c027800, + 0x5c025800, 0x1c01f000, 0x4933c857, 0x4d2c0000, + 0x59900004, 0x81300580, 0x02020800, 0x001005d8, + 0x0201f800, 0x00109037, 0x02000800, 0x001005d8, + 0x59325808, 0x592c0208, 0x84000540, 0x48025a08, + 0x0401f7bf, 0x491bc857, 0x49d3c857, 0x4dd00000, + 0x41780800, 0x8007a0ca, 0x83d3a400, 0x00007600, + 0x4a03a005, 0x80000002, 0x42000000, 0x00001000, + 0x50000000, 0x82000480, 0x24220001, 0x04020029, + 0x59d01006, 0x82080500, 0x00006000, 0x82000580, + 0x00006000, 0x0400002f, 0x82080500, 0x40008000, + 0x040007f8, 0x800409c0, 0x0402002a, 0x811a31c0, + 0x04000028, 0x42000000, 0x00001002, 0x50001000, + 0x46000000, 0x00000512, 0x42001800, 0x0000000a, + 0x59e00000, 0x8c00051a, 0x040207fc, 0x800c1840, + 0x040207fc, 0x42000000, 0x00001002, 0x46000000, + 0x00000514, 0x42001800, 0x0000000a, 0x59e00000, + 0x8c00053a, 0x040207fc, 0x800c1840, 0x040207fc, + 0x42000000, 0x00001002, 0x44080000, 0x0401f00d, + 0x59d01006, 0x82080500, 0x00006000, 0x82000580, + 0x00006000, 0x04000007, 0x8c08151e, 0x040007f9, + 0x59d01006, 0x82080500, 0x00006000, 0x040207f5, + 0x83d3a400, 0x00000020, 0x80040800, 0x82040480, + 0x00000005, 0x040017bf, 0x5c03a000, 0x1c01f000, + 0x491bc857, 0x49d3c857, 0x4dd00000, 0x41780800, + 0x8007a0ca, 0x83d3a400, 0x00007600, 0x4a03a005, + 0x80000001, 0x59d00006, 0x83d3a400, 0x00000020, + 0x80040800, 0x82040480, 0x00000005, 0x040017f8, + 0x5c03a000, 0x1c01f000, 0x59d00006, 0x8c00053e, + 0x0400001e, 0x59902804, 0x4817c857, 0x801429c0, + 0x04000013, 0x5990000a, 0x5990080b, 0x5990100c, + 0x5990180d, 0x4800280a, 0x4804280b, 0x4808280c, + 0x480c280d, 0x59d00000, 0x59d00801, 0x59d01002, + 0x59d01803, 0x59d02004, 0x4800280e, 0x4804280f, + 0x48082810, 0x480c2811, 0x48102812, 0x59900006, + 0x82000500, 0xffff0000, 0x48032006, 0x4a03a005, + 0x30000000, 0x59d00006, 0x1c01f000, 0x4803c856, + 0x80204000, 0x50200000, 0x80000540, 0x04000003, + 0x80285040, 0x1c01f000, 0x58300001, 0x80000540, + 0x0400000e, 0x4802600b, 0x40006000, 0x58300204, + 0x82000500, 0x0000000f, 0x82000400, 0x001010bd, + 0x50004000, 0x802041c0, 0x02000800, 0x001005d8, + 0x80285040, 0x1c01f000, 0x40005000, 0x1c01f000, + 0x00000005, 0x00000008, 0x0000000b, 0x0000000e, + 0x00000011, 0x00000000, 0x00000000, 0x0000000b, + 0x00000000, 0x00000000, 0x00000000, 0x001010b8, + 0x001010b7, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x001010b8, 0x001010b7, 0x001010b4, + 0x001010b8, 0x001010b7, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x001010b8, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x001010b8, 0x001010b8, 0x001010b8, + 0x00000000, 0x001010b8, 0x00000000, 0x00000000, + 0x00000000, 0x4813c857, 0x492fc857, 0x4933c857, + 0x48126012, 0x592c5207, 0x802851c0, 0x0400004a, + 0x412c6000, 0x0401f84b, 0x04000009, 0x82240580, + 0x00000002, 0x04020003, 0x5830000d, 0x80102480, + 0x50200000, 0x80004540, 0x0400003f, 0x50200000, + 0x80000540, 0x0400000b, 0x80301400, 0x58080002, + 0x80102480, 0x0400101e, 0x801021c0, 0x04000009, + 0x80285040, 0x04000034, 0x80204000, 0x0401f7f4, + 0x58300001, 0x80006540, 0x0400002f, 0x0401f7e6, + 0x80285040, 0x0400002c, 0x80204000, 0x50200000, + 0x80000540, 0x0402000a, 0x58300001, 0x80006540, + 0x04000025, 0x58300204, 0x82004d00, 0x0000000f, + 0x82244400, 0x001010bd, 0x50204000, 0x592c0208, + 0x8400051e, 0x48025a08, 0x0401f013, 0x80102080, + 0x80102000, 0x48126010, 0x4813c857, 0x58080802, + 0x40100000, 0x80042480, 0x02001800, 0x001005d8, + 0x58080000, 0x58081801, 0x80102400, 0x4812600e, + 0x480e600f, 0x4813c857, 0x592c0208, 0x8400055e, + 0x48025a08, 0x4833c857, 0x4823c857, 0x482bc857, + 0x4832600b, 0x4822600c, 0x482a600d, 0x80000580, + 0x0401f003, 0x82000540, 0x00000001, 0x1c01f000, + 0x58300204, 0x82004d00, 0x0000000f, 0x82244400, + 0x001010bd, 0x82000500, 0x000000ff, 0x82000580, + 0x00000029, 0x0402001b, 0x50204000, 0x592c0409, + 0x80000540, 0x02000800, 0x001005d8, 0x82000c80, + 0x00000002, 0x04001011, 0x58300001, 0x80006540, + 0x02000800, 0x001005d8, 0x58300204, 0x82000500, + 0x0000000f, 0x82000400, 0x001010bd, 0x50004000, + 0x40040000, 0x800409c0, 0x04000006, 0x82040c80, + 0x00000005, 0x040217f1, 0x80204400, 0x80000580, + 0x1c01f000, 0x59e00004, 0x8c00050e, 0x02020000, + 0x00100903, 0x1c01f000, 0x4c5c0000, 0x59e4b800, + 0x485fc857, 0x825c0500, 0x0000001f, 0x04000004, + 0x59e40862, 0x0201f800, 0x001005d8, 0x825c0500, + 0x000000e0, 0x02000800, 0x001005d8, 0x8c5cbd0e, + 0x04020807, 0x8c5cbd0c, 0x04020809, 0x8c5cbd0a, + 0x04020878, 0x5c00b800, 0x1c01f000, 0x4803c856, + 0x4a03c800, 0x00000080, 0x1c01f000, 0x4d2c0000, + 0x42007800, 0x0010b8ec, 0x583c0001, 0x583c0802, + 0x80040540, 0x0400003f, 0x42000800, 0x0010b7f7, + 0x50065800, 0x592c0002, 0x82000580, 0x00000000, + 0x0400000e, 0x59e40850, 0x59e41853, 0x400c0000, + 0x80040400, 0x59e40852, 0x4807c857, 0x80041480, + 0x04021008, 0x40001000, 0x480bc857, 0x4a007800, + 0x00000001, 0x0401f006, 0x4803c857, 0x0401f029, + 0x59e41050, 0x480bc857, 0x49787800, 0x480bc857, + 0x480fc857, 0x592c0003, 0x80000540, 0x04000006, + 0x80080580, 0x04020004, 0x592c0003, 0x4803c857, + 0x480bc857, 0x480a5803, 0x592c0007, 0x800001c0, + 0x04000007, 0x592c1007, 0x480bc857, 0x583c0003, + 0x4803c857, 0x80080480, 0x04001003, 0x583c1001, + 0x480bc857, 0x583c0802, 0x480bc857, 0x4807c857, + 0x4a025801, 0x00000000, 0x4a025809, 0x001011bc, + 0x480a5807, 0x48065808, 0x59e40053, 0x48025804, + 0x412c1000, 0x492fc857, 0x0201f800, 0x00100858, + 0x5c025800, 0x4a03c800, 0x00000040, 0x1c01f000, + 0x42007800, 0x0010b7f7, 0x503c7800, 0x4a007802, + 0x00000100, 0x42007800, 0x0010b8ec, 0x583c0000, + 0x4803c857, 0x82000d80, 0x00000001, 0x04000004, + 0x80000000, 0x48007800, 0x0401f019, 0x49787800, + 0x583c1806, 0x583c0005, 0x800c1800, 0x480c7806, + 0x800c0580, 0x04020002, 0x49787806, 0x583c0807, + 0x800409c0, 0x0400000e, 0x583c0008, 0x80000000, + 0x48007808, 0x80040580, 0x04020009, 0x49787808, + 0x583c2006, 0x42001800, 0x00000001, 0x42001000, + 0x00008028, 0x0201f800, 0x00103a3e, 0x1c01f000, + 0x4a03c800, 0x00000020, 0x0201f800, 0x0010aa40, + 0x59e40000, 0x1c01f000, 0x4d2c0000, 0x4a007001, + 0x00000000, 0x82040d00, 0x43000f80, 0x02020800, + 0x001005d8, 0x58380009, 0x4803c00f, 0x0201f800, + 0x00109402, 0x583a5808, 0x592c0000, 0x48007008, + 0x800001c0, 0x04020002, 0x49787007, 0x0201f800, + 0x001007f4, 0x5c025800, 0x0201f000, 0x0010087d, + 0x4803c856, 0x4c3c0000, 0x4d2c0000, 0x4d300000, + 0x5830000a, 0x80025d40, 0x02000800, 0x001005d8, + 0x592e6008, 0x4c300000, 0x0201f800, 0x0010941a, + 0x5c006000, 0x02000800, 0x001005d8, 0x58300002, + 0x82000580, 0x00000100, 0x04020010, 0x5930780b, + 0x583c0001, 0x80000540, 0x0400000e, 0x4802600b, + 0x40007800, 0x82000400, 0x00000002, 0x48006003, + 0x583c0000, 0x48006004, 0x40301000, 0x0201f800, + 0x00100858, 0x0401f00c, 0x4a025a06, 0x00000002, + 0x4c300000, 0x0201f800, 0x000202da, 0x5c006000, + 0x40325800, 0x0201f800, 0x001007f4, 0x0201f800, + 0x0002077d, 0x5c026000, 0x5c025800, 0x5c007800, + 0x1c01f000, 0x4803c856, 0x4d2c0000, 0x4d300000, + 0x42007000, 0x0010b7f8, 0x58380801, 0x82040580, + 0x00000002, 0x04020011, 0x58386002, 0x5830000a, + 0x812c0580, 0x0402000d, 0x59e00004, 0x8c00050e, + 0x040007fe, 0x59dc0006, 0x4803c857, 0x4a03b805, + 0x20000000, 0x8c00053e, 0x040007f8, 0x4a007001, + 0x00000000, 0x0401f019, 0x58386006, 0x40305000, + 0x803061c0, 0x02000800, 0x001005d8, 0x5830000a, + 0x812c0580, 0x04000004, 0x40305000, 0x58306000, + 0x0401f7f8, 0x40280000, 0x80300580, 0x58300000, + 0x04000006, 0x48005000, 0x800001c0, 0x04020007, + 0x48287005, 0x0401f005, 0x800001c0, 0x04020002, + 0x48007005, 0x48007006, 0x40325800, 0x0201f800, + 0x001007f4, 0x42007000, 0x0010b7f8, 0x58380001, + 0x82000580, 0x00000000, 0x02000800, 0x0010087d, + 0x5c026000, 0x5c025800, 0x1c01f000, 0x4803c856, + 0x42000800, 0x0000003c, 0x48079000, 0x59c80000, + 0x80040500, 0x040207fe, 0x497b9005, 0x4a039035, + 0x00880200, 0x59a8000e, 0x800000e0, 0x4803900e, + 0x4a039011, 0x00000024, 0x4a03900f, 0x0010d1c0, + 0x4a039010, 0x0010d1c0, 0x4a039015, 0x0000007f, + 0x4a03900d, 0x00000040, 0x4a039000, 0x00001600, + 0x1c01f000, 0x59c80007, 0x8c000508, 0x040208b7, + 0x59c80800, 0x8c040d16, 0x04020004, 0x82000500, + 0x00000006, 0x0c01f005, 0x4807c857, 0x82000500, + 0x0000000e, 0x0c01f001, 0x001012a8, 0x001012a6, + 0x00105999, 0x001012a6, 0x001012aa, 0x001012a6, + 0x001012aa, 0x001012aa, 0x001012a6, 0x001012a6, + 0x001012a6, 0x001012a6, 0x001012aa, 0x001012a6, + 0x001012aa, 0x001012a6, 0x0201f800, 0x001005d8, + 0x4803c857, 0x1c01f000, 0x59c8080c, 0x4807c857, + 0x82040500, 0x00006000, 0x04000004, 0x0201f800, + 0x0010aa03, 0x0401f006, 0x82040500, 0x007f0000, + 0x04000006, 0x0201f800, 0x0010a9d5, 0x0201f800, + 0x00106eb3, 0x0401f02b, 0x82040500, 0x00000014, + 0x04000014, 0x0201f800, 0x0010aa32, 0x836c0580, + 0x00000003, 0x0400000d, 0x0201f800, 0x0010513b, + 0x04000004, 0x0201f800, 0x0010411d, 0x0401f007, + 0x4a035033, 0x00000001, 0x4202d800, 0x00000001, + 0x0201f800, 0x001050a2, 0x0401f817, 0x0401f015, + 0x82040500, 0x00001c00, 0x04000005, 0x0201f800, + 0x0010aa11, 0x0401f810, 0x0401f00e, 0x82040500, + 0x00000140, 0x04000005, 0x0201f800, 0x0010aa24, + 0x0401f809, 0x0401f007, 0x82040500, 0x00008000, + 0x04000004, 0x0201f800, 0x0010a9fc, 0x0401f802, + 0x1c01f000, 0x4c0c0000, 0x4c100000, 0x4c140000, + 0x0201f800, 0x00100ec9, 0x5c002800, 0x5c002000, + 0x5c001800, 0x1c01f000, 0x4803c856, 0x59a80804, + 0x59a8002b, 0x82000500, 0xfffff000, 0x80040540, + 0x4803502b, 0x59a8002f, 0x82000500, 0xfffff000, + 0x80040540, 0x4803502f, 0x48078882, 0x82041c00, + 0x0000000f, 0x800c1908, 0x820c1c00, 0x00000004, + 0x400c2000, 0x901029c0, 0x82040480, 0x000001e4, + 0x04021005, 0x42001000, 0x00000008, 0x801020c6, + 0x0401f031, 0x82040480, 0x00000230, 0x04021009, + 0x42001000, 0x00000007, 0x801000c2, 0x800000c2, + 0x80100400, 0x80100400, 0x80102400, 0x0401f026, + 0x82040480, 0x00000298, 0x04021008, 0x42001000, + 0x00000006, 0x801000c2, 0x800000c2, 0x80100400, + 0x80102400, 0x0401f01c, 0x82040480, 0x00000328, + 0x04021007, 0x42001000, 0x00000005, 0x801000c2, + 0x800000c2, 0x80102400, 0x0401f013, 0x82040480, + 0x00000404, 0x04021005, 0x42001000, 0x00000004, + 0x801020c4, 0x0401f00c, 0x82040480, 0x0000056c, + 0x04021006, 0x42001000, 0x00000003, 0x801000c2, + 0x80102400, 0x0401f004, 0x42001000, 0x00000002, + 0x801020c2, 0x82100480, 0x00000110, 0x80000080, + 0x80002000, 0x800800d0, 0x80140540, 0x80100540, + 0x48039035, 0x1c01f000, 0x59c80815, 0x0201f800, + 0x001005d0, 0x82040d00, 0x0000007c, 0x48079000, + 0x59c80000, 0x80040500, 0x040207fe, 0x8c040d04, + 0x04000003, 0x59c80035, 0x48039035, 0x59c80000, + 0x82000540, 0x00001200, 0x48039000, 0x1c01f000, + 0x4803c856, 0x497b88a9, 0x4a038807, 0x00000001, + 0x497b8807, 0x59c40005, 0x48038805, 0x0201f800, + 0x00101815, 0x4201d000, 0x000001f4, 0x0201f800, + 0x0010608e, 0x497b880e, 0x4200b000, 0x000001f4, + 0x42000000, 0x00000001, 0x42000800, 0x00000014, + 0x0201f800, 0x00101944, 0x42000800, 0x00000014, + 0x0201f800, 0x0010193f, 0x8c040d00, 0x04000005, + 0x8058b040, 0x040207f3, 0x0201f800, 0x001005d8, + 0x4200b000, 0x00000032, 0x42000000, 0x00000001, + 0x42000800, 0x000000b4, 0x0201f800, 0x00101944, + 0x42000800, 0x000000b4, 0x0201f800, 0x0010193f, + 0x8c040d00, 0x04000005, 0x8058b040, 0x040207f3, + 0x0201f800, 0x001005d8, 0x59c40005, 0x48038805, + 0x42000000, 0x00000089, 0x800008d0, 0x48075054, + 0x48075055, 0x48075056, 0x42000800, 0x000000e0, + 0x0201f800, 0x00101944, 0x42000800, 0x000000f4, + 0x0201f800, 0x0010193f, 0x82040500, 0xffffffd1, + 0x82000540, 0x00000002, 0x42000800, 0x000000f4, + 0x0201f800, 0x00101944, 0x42000800, 0x000000a0, + 0x0201f800, 0x0010193f, 0x82040540, 0x00000001, + 0x42000800, 0x000000a0, 0x0201f800, 0x00101944, + 0x42000800, 0x00000000, 0x0201f800, 0x0010193f, + 0x82040540, 0x00000001, 0x42000800, 0x00000000, + 0x0201f800, 0x00101944, 0x4201d000, 0x0001d4c0, + 0x0201f800, 0x0010608e, 0x0401fa2b, 0x4a0388a7, + 0x0000f7f7, 0x4a0388a3, 0x8000403c, 0x4a0388ae, + 0x000061a8, 0x4a038801, 0x00032063, 0x4a038810, + 0x00410108, 0x4a038811, 0x00520608, 0x4a038812, + 0x00450320, 0x4a038813, 0x00440405, 0x4a03881c, + 0x004132e1, 0x4a038850, 0x80000108, 0x4a038860, + 0x00000008, 0x4a038870, 0x00000008, 0x4a038851, + 0x80000508, 0x4a038861, 0x00800000, 0x4a038871, + 0x00800000, 0x4a038852, 0x80000708, 0x4a038862, + 0x00800000, 0x4a038872, 0x00800000, 0x4a038853, + 0x80000608, 0x497b8863, 0x4a038873, 0x00800000, + 0x4a038882, 0x00000840, 0x4a0388a5, 0x0000001e, + 0x4a0388a6, 0x0000001e, 0x4a0388b0, 0x00007530, + 0x4a038802, 0x0000ffff, 0x4a038806, 0xc0e00800, + 0x1c01f000, 0x497b5022, 0x4a035021, 0x00000001, + 0x42000800, 0x00000040, 0x0201f800, 0x0010193f, + 0x82040500, 0xffffffaf, 0x82000540, 0x00000000, + 0x42000800, 0x00000040, 0x0201f800, 0x00101944, + 0x42000800, 0x000000f4, 0x0201f800, 0x0010193f, + 0x4c040000, 0x40040000, 0x84000548, 0x42000800, + 0x000000f4, 0x0201f800, 0x00101944, 0x42000800, + 0x00000000, 0x0201f800, 0x0010193f, 0x82040500, + 0xffffffc1, 0x82000540, 0x00000038, 0x42000800, + 0x00000000, 0x0201f800, 0x00101944, 0x5c000000, + 0x42000800, 0x000000f4, 0x0201f000, 0x00101944, + 0x59c40805, 0x4807c857, 0x59c40006, 0x80040d00, + 0x02000800, 0x001005d8, 0x82040500, 0x00e00800, + 0x04020004, 0x8c040d3e, 0x040208c4, 0x0401f007, + 0x82040500, 0x00800800, 0x02020800, 0x001005d0, + 0x0201f800, 0x001005d8, 0x4c5c0000, 0x4c600000, + 0x59c4b805, 0x485fc857, 0x59c40006, 0x8c000500, + 0x04000003, 0x8c5cbd00, 0x04020079, 0x0201f800, + 0x0010513b, 0x04000014, 0x59c40005, 0x82000500, + 0x000000c0, 0x04000036, 0x0201f800, 0x00105151, + 0x04020033, 0x4a038805, 0x04000000, 0x59c400a3, + 0x82000500, 0xbf203fff, 0x480388a3, 0x497b5049, + 0x4a038805, 0x000000c0, 0x0201f800, 0x00105065, + 0x0401f063, 0x8c5cbd34, 0x04020025, 0x59c40005, + 0x8c00050c, 0x04020012, 0x8c00050e, 0x04020013, + 0x8c00050a, 0x04020014, 0x8c000508, 0x0400000b, + 0x59a80017, 0x82000580, 0x00000009, 0x04020007, + 0x42000000, 0x0010b844, 0x0201f800, 0x0010aa47, + 0x0201f800, 0x00105318, 0x0401f04b, 0x4a035033, + 0x00000000, 0x0401f00b, 0x4a035033, 0x00000002, + 0x0401f008, 0x42000000, 0x0010b846, 0x0201f800, + 0x0010aa47, 0x0201f800, 0x001052c2, 0x0401f03e, + 0x0201f800, 0x00105378, 0x0401f03b, 0x8c5cbd34, + 0x04000037, 0x59c40005, 0x8c00053a, 0x04020005, + 0x42000000, 0x0010b818, 0x0201f800, 0x0010aa47, + 0x4a038805, 0x02000000, 0x0201f800, 0x0010513b, + 0x04020010, 0x4a038805, 0x04000000, 0x0201f800, + 0x00105149, 0x04020008, 0x4a035033, 0x00000001, + 0x4202d800, 0x00000001, 0x0201f800, 0x001050a2, + 0x0401f05b, 0x41780000, 0x0201f800, 0x00105113, + 0x0201f800, 0x001019fe, 0x4000c000, 0x0201f800, + 0x00101963, 0x836c1580, 0x00000004, 0x0402000d, + 0x8c5cbd00, 0x04020012, 0x59a81005, 0x8c081506, + 0x04020005, 0x59c410a3, 0x82081540, 0x00000008, + 0x480b88a3, 0x59c41006, 0x84081540, 0x480b8806, + 0x4a038805, 0x04000000, 0x4202d800, 0x00000001, + 0x497b5014, 0x0201f800, 0x00103b38, 0x8c5cbd3c, + 0x04020858, 0x8c5cbd00, 0x04000036, 0x42000000, + 0x0010b8ca, 0x0201f800, 0x0010aa47, 0x4a038805, + 0x00000001, 0x4200b000, 0x000003e8, 0x4201d000, + 0x00000064, 0x4c580000, 0x0201f800, 0x0010608e, + 0x0201f800, 0x001018d3, 0x5c00b000, 0x04000004, + 0x8058b040, 0x040207f6, 0x0401f004, 0x4a038805, + 0x00000001, 0x0401f01f, 0x59c40006, 0x84000500, + 0x48038806, 0x0201f800, 0x00106ede, 0x497b8880, + 0x0201f800, 0x0010a9c0, 0x59c4000d, 0x8c000500, + 0x02020800, 0x0010a9ce, 0x59c400a3, 0x82000500, + 0xfcf8ffff, 0x480388a3, 0x4a03504c, 0x00000002, + 0x4202d800, 0x00000004, 0x4a038805, 0x00000001, + 0x0201f800, 0x001006d4, 0x0401fb3b, 0x497b5052, + 0x4a035049, 0x00000001, 0x0201f800, 0x00100452, + 0x825cbd00, 0xbbfffffe, 0x485f8805, 0x5c00c000, + 0x5c00b800, 0x1c01f000, 0x59c41004, 0x480bc857, + 0x8c081500, 0x04000006, 0x4803c856, 0x497b2807, + 0x0201f800, 0x00106fa4, 0x0401f00a, 0x82080500, + 0x000001f0, 0x04000007, 0x4803c856, 0x417a3000, + 0x0201f800, 0x00106062, 0x0201f800, 0x00106fc6, + 0x4a038805, 0x80000000, 0x1c01f000, 0x59c408a3, + 0x4807c857, 0x84040d40, 0x480788a3, 0x1c01f000, + 0x4d900000, 0x4dd00000, 0x4da40000, 0x4d140000, + 0x4a038805, 0x40000000, 0x42000000, 0x0010b8c6, + 0x0201f800, 0x0010aa47, 0x0201f800, 0x00106c55, + 0x59c41004, 0x8c081500, 0x04000054, 0x598e600d, + 0x497b2807, 0x813261c0, 0x04000032, 0x59300403, + 0x82000580, 0x00000032, 0x0402002e, 0x5930001c, + 0x48038833, 0x4a038807, 0x00018000, 0x4201d000, + 0x00000002, 0x0201f800, 0x0010608e, 0x497b8807, + 0x4201d000, 0x00000002, 0x0201f800, 0x0010608e, + 0x0201f800, 0x00106e21, 0x4201d000, 0x00007530, + 0x0201f800, 0x0010608e, 0x59c408a4, 0x82040d00, + 0x0000000f, 0x82040d80, 0x00000000, 0x04000005, + 0x42000000, 0x00200000, 0x0201f800, 0x00101949, + 0x0201f800, 0x00106bbf, 0x59300008, 0x80000540, + 0x02000800, 0x001005d8, 0x40025800, 0x4a025a04, + 0x00000103, 0x5931d821, 0x58ef400b, 0x58ec0009, + 0x0801f800, 0x0201f800, 0x0002077d, 0x0401f047, + 0x598c000f, 0x82001c80, 0x000000c8, 0x0402100f, + 0x80000000, 0x4803180f, 0x59c400a4, 0x82000500, + 0x0000000f, 0x82000580, 0x00000002, 0x04020004, + 0x42000000, 0x00200000, 0x0401fbf7, 0x0201f800, + 0x0010604d, 0x0401f035, 0x4933c857, 0x0201f800, + 0x00106e21, 0x813261c0, 0x04000030, 0x4a026203, + 0x00000001, 0x42027000, 0x00000027, 0x0201f800, + 0x000207a1, 0x0401f029, 0x8c081508, 0x04000027, + 0x417a3000, 0x0201f800, 0x001070d8, 0x42032000, + 0x0000bf32, 0x0201f800, 0x00106062, 0x59926004, + 0x813261c0, 0x04000012, 0x42001800, 0x000000c8, + 0x0201f800, 0x001070a4, 0x0402000d, 0x59c400a4, + 0x82000500, 0x0000000f, 0x82000580, 0x00000002, + 0x04020004, 0x42000000, 0x00200000, 0x0401fbce, + 0x0201f800, 0x00106052, 0x0401f00c, 0x4933c857, + 0x0201f800, 0x00106dc3, 0x813261c0, 0x04000007, + 0x42027000, 0x0000004f, 0x4a026203, 0x00000003, + 0x0201f800, 0x000207a1, 0x5c022800, 0x5c034800, + 0x5c03a000, 0x5c032000, 0x0201f000, 0x00106c4b, + 0x4803c857, 0x59a80821, 0x48035021, 0x80041580, + 0x04000045, 0x800409c0, 0x04000023, 0x497b504c, + 0x42000000, 0x0010b80d, 0x0201f800, 0x0010aa47, + 0x0201f800, 0x0010aaf9, 0x42001000, 0x00008011, + 0x59c40001, 0x82000500, 0x00018000, 0x82001d80, + 0x00000000, 0x04000009, 0x82001d80, 0x00008000, + 0x04000009, 0x82001d80, 0x00010000, 0x04000009, + 0x0201f800, 0x001005d8, 0x42001800, 0x00000000, + 0x0401f006, 0x42001800, 0x00000001, 0x0401f003, + 0x42001800, 0x00000003, 0x0201f800, 0x00103a3e, + 0x0401f021, 0x59a8084c, 0x800409c0, 0x04020007, + 0x59c4000d, 0x8c000520, 0x04000004, 0x42001800, + 0x00000003, 0x0401f002, 0x40041800, 0x0201f800, + 0x0010aadd, 0x42001000, 0x00008012, 0x0201f800, + 0x00103a3e, 0x0201f800, 0x001006d4, 0x0201f800, + 0x0010ab33, 0x0402000c, 0x0401f853, 0x4d400000, + 0x4d3c0000, 0x42028000, 0x00000028, 0x42027800, + 0x00000408, 0x0201f800, 0x00101fe5, 0x5c027800, + 0x5c028000, 0x1c01f000, 0x4803c857, 0x82000400, + 0x0010210e, 0x50000800, 0x82040d00, 0x000000ff, + 0x1c01f000, 0x4803c856, 0x4c580000, 0x4200b000, + 0x00000010, 0x497b88ac, 0x497b88ad, 0x8058b040, + 0x040207fe, 0x5c00b000, 0x1c01f000, 0x4807c857, + 0x48075010, 0x80041108, 0x4200b000, 0x00000010, + 0x497b88ac, 0x80000580, 0x800811c0, 0x04020006, + 0x82040500, 0x0000000f, 0x82000400, 0x0010ab38, + 0x50000000, 0x480388ad, 0x80081040, 0x8058b040, + 0x040207f5, 0x1c01f000, 0x59a80005, 0x04000003, + 0x84000546, 0x0401f002, 0x84000506, 0x48035005, + 0x4803c857, 0x1c01f000, 0x4803c857, 0x4c080000, + 0x4c040000, 0x4c000000, 0x59c40892, 0x4807c857, + 0x80041580, 0x04000010, 0x80041480, 0x04021007, + 0x80081080, 0x80081000, 0x4008b000, 0x42000000, + 0x00000201, 0x0401f004, 0x4008b000, 0x42000000, + 0x00000210, 0x48038886, 0x8058b040, 0x040207fe, + 0x497b8886, 0x5c000000, 0x5c000800, 0x5c001000, + 0x1c01f000, 0x4803c856, 0x0201f800, 0x00103b25, + 0x04000005, 0x42028000, 0x0000002e, 0x0201f000, + 0x0010a449, 0x1c01f000, 0x42000800, 0x00000002, + 0x59a80005, 0x8c000514, 0x0402000b, 0x59c80835, + 0x82040d00, 0x00001f00, 0x80040910, 0x80040800, + 0x59a8006c, 0x80000540, 0x04000003, 0x42000800, + 0x0000025a, 0x4807c857, 0x1c01f000, 0x4c000000, + 0x59a80053, 0x4803c857, 0x82000580, 0x00000000, + 0x5c000000, 0x1c01f000, 0x4c000000, 0x59a80053, + 0x4803c857, 0x82000580, 0x00000001, 0x5c000000, + 0x1c01f000, 0x4c000000, 0x59a80053, 0x4803c857, + 0x82000580, 0x00000003, 0x5c000000, 0x1c01f000, + 0x4c000000, 0x59a80053, 0x82000580, 0x00000002, + 0x5c000000, 0x1c01f000, 0x4c000000, 0x4c040000, + 0x4c080000, 0x4c380000, 0x59a80040, 0x82000c80, + 0x00000007, 0x02021800, 0x001005d8, 0x0c01f806, + 0x5c007000, 0x5c001000, 0x5c000800, 0x5c000000, + 0x1c01f000, 0x0010166c, 0x0010167f, 0x00101693, + 0x00101695, 0x001016bc, 0x001016be, 0x001016c0, + 0x4803c856, 0x4a035042, 0x00000000, 0x42000000, + 0x00000002, 0x0401fa1b, 0x42000000, 0x00000002, + 0x0401f9ad, 0x0401fab2, 0x4803c856, 0x4a035040, + 0x00000006, 0x42000800, 0x0000001e, 0x42001000, + 0x001016c1, 0x0201f000, 0x0010606e, 0x497b5045, + 0x4a035050, 0x00000036, 0x4a03504f, 0x0000002a, + 0x4803c856, 0x4a035042, 0x00000001, 0x42000000, + 0x00000002, 0x0401f998, 0x4803c856, 0x4a035040, + 0x00000006, 0x42000800, 0x0000001e, 0x42001000, + 0x001016c1, 0x0201f000, 0x0010606e, 0x0201f800, + 0x001005d8, 0x4a035050, 0x00000036, 0x4803c856, + 0x4a035042, 0x00000003, 0x42000800, 0x00000000, + 0x0401faa3, 0x82040d00, 0x00000090, 0x82040580, + 0x00000090, 0x04000009, 0x82040580, 0x00000010, + 0x04000009, 0x82040580, 0x00000000, 0x04000008, + 0x0201f800, 0x001005d8, 0x42000000, 0x00000001, + 0x0401f005, 0x41780000, 0x0401f003, 0x42000000, + 0x00000002, 0x0401f970, 0x497b5046, 0x4803c856, + 0x4a035040, 0x00000006, 0x42000800, 0x0000001e, + 0x42001000, 0x001016c1, 0x0201f000, 0x0010606e, + 0x0201f800, 0x001005d8, 0x0201f800, 0x001005d8, + 0x1c01f000, 0x4c000000, 0x4c040000, 0x4c080000, + 0x4c380000, 0x59a80042, 0x82000c80, 0x00000007, + 0x02021800, 0x001005d8, 0x0c01f806, 0x5c007000, + 0x5c001000, 0x5c000800, 0x5c000000, 0x1c01f000, + 0x001016d7, 0x001016f6, 0x0010174a, 0x00101761, + 0x00101778, 0x00101781, 0x00101783, 0x0401f9fc, + 0x0402001b, 0x59a81048, 0x42000800, 0x00000000, + 0x0401fa63, 0x82040d00, 0x00000090, 0x82040580, + 0x00000090, 0x04000009, 0x82040580, 0x00000010, + 0x04000008, 0x82040580, 0x00000000, 0x04000007, + 0x0201f800, 0x001005d8, 0x84081540, 0x0401f004, + 0x84081542, 0x0401f002, 0x84081544, 0x480b5048, + 0x4a035040, 0x00000001, 0x0401f003, 0x0401f8cb, + 0x0401ff82, 0x1c01f000, 0x0401f88f, 0x04000052, + 0x0401f9db, 0x0402002a, 0x42000800, 0x00000000, + 0x0401fa43, 0x82040d00, 0x00000090, 0x82040580, + 0x00000000, 0x04000044, 0x82040580, 0x00000010, + 0x04000006, 0x82040580, 0x00000090, 0x04000009, + 0x0201f800, 0x001005d8, 0x59c40801, 0x82040d00, + 0x00018000, 0x82040580, 0x00000000, 0x04000036, + 0x42000800, 0x00000000, 0x0401fa2d, 0x82040d00, + 0x00000090, 0x82040580, 0x00000010, 0x04000006, + 0x82040580, 0x00000090, 0x04000006, 0x02020800, + 0x001005d8, 0x59a80048, 0x84000542, 0x0401f003, + 0x59a80048, 0x84000540, 0x48035048, 0x59a80045, + 0x80000000, 0x48035045, 0x82000580, 0x00000005, + 0x04000003, 0x0401f861, 0x0401f01e, 0x497b5045, + 0x59c40801, 0x82040d00, 0x00018000, 0x82040580, + 0x00000000, 0x04000009, 0x82040580, 0x00008000, + 0x04000009, 0x82040580, 0x00010000, 0x04000008, + 0x0201f800, 0x001005d8, 0x42000000, 0x00000001, + 0x0401f005, 0x41780000, 0x0401f003, 0x42000000, + 0x00000002, 0x0401f94b, 0x4a035042, 0x00000002, + 0x0401f004, 0x4a035040, 0x00000003, 0x0401f002, + 0x0401ff42, 0x1c01f000, 0x0401f83b, 0x04000015, + 0x59a8004f, 0x80000040, 0x4803504f, 0x0401f984, + 0x04020005, 0x4a035040, 0x00000003, 0x497b5041, + 0x0401f00c, 0x59a8004f, 0x80000540, 0x04020003, + 0x0401f89e, 0x0401f002, 0x0401f84b, 0x0401f82f, + 0x497b5045, 0x4a035042, 0x00000001, 0x0401ff2b, + 0x1c01f000, 0x0401f824, 0x04000015, 0x0401f970, + 0x0402000f, 0x59a80046, 0x80000000, 0x48035046, + 0x82000580, 0x00000007, 0x0402000c, 0x4a035052, + 0x0000000a, 0x497b5049, 0x59a80048, 0x8400055e, + 0x48035048, 0x4803c857, 0x0401f005, 0x0401f817, + 0x4a035042, 0x00000004, 0x0401ff3d, 0x1c01f000, + 0x0401f80d, 0x04000007, 0x0401f959, 0x04020003, + 0x0401ff1b, 0x0401f003, 0x0401f80c, 0x0401ff34, + 0x1c01f000, 0x0201f800, 0x001005d8, 0x0201f800, + 0x001005d8, 0x59a80050, 0x80000040, 0x48035050, + 0x0400088d, 0x1c01f000, 0x4c040000, 0x42000800, + 0x00000000, 0x0401f9b2, 0x82040d00, 0x00000090, + 0x82040580, 0x00000090, 0x04000009, 0x82040580, + 0x00000010, 0x04000009, 0x82040580, 0x00000000, + 0x04000009, 0x0201f800, 0x001005d8, 0x42000000, + 0x00000002, 0x0401f005, 0x42000000, 0x00000001, + 0x0401f002, 0x41780000, 0x0401f8ea, 0x5c000800, + 0x1c01f000, 0x4c040000, 0x59c40801, 0x82040d00, + 0x00018000, 0x82040580, 0x00000000, 0x04000009, + 0x82040580, 0x00008000, 0x04000009, 0x82040580, + 0x00010000, 0x04000009, 0x0201f800, 0x001005d8, + 0x42000000, 0x00000002, 0x0401f005, 0x42000000, + 0x00000001, 0x0401f002, 0x41780000, 0x0401f866, + 0x5c000800, 0x1c01f000, 0x4c040000, 0x59a80045, + 0x80000000, 0x48035045, 0x82000580, 0x00000005, + 0x04020018, 0x497b5045, 0x59c40801, 0x82040d00, + 0x00018000, 0x82040580, 0x00000000, 0x04000009, + 0x82040580, 0x00008000, 0x04000009, 0x82040580, + 0x00010000, 0x04000009, 0x0201f800, 0x001005d8, + 0x42000000, 0x00000002, 0x0401f005, 0x42000000, + 0x00000001, 0x0401f002, 0x41780000, 0x0401f846, + 0x42000800, 0x00000000, 0x0401f961, 0x82040d00, + 0x00000090, 0x82040580, 0x00000090, 0x04000009, + 0x82040580, 0x00000010, 0x04000009, 0x82040580, + 0x00000000, 0x04000009, 0x0201f800, 0x001005d8, + 0x42000000, 0x00000002, 0x0401f005, 0x42000000, + 0x00000001, 0x0401f002, 0x41780000, 0x0401f899, + 0x5c000800, 0x1c01f000, 0x4c200000, 0x59a80048, + 0x82000500, 0x00007fff, 0x02000800, 0x001005d8, + 0x59a84047, 0x80204102, 0x02001800, 0x001005d8, + 0x48235047, 0x80204500, 0x040007fa, 0x8c000504, + 0x04020007, 0x8c000502, 0x04020008, 0x8c000500, + 0x04020008, 0x0201f800, 0x001005d8, 0x42000000, + 0x00000002, 0x0401f005, 0x41780000, 0x0401f003, + 0x42000000, 0x00000001, 0x0401f80f, 0x5c004000, + 0x1c01f000, 0x04011000, 0x4a03c840, 0x0010b440, + 0x4a03c842, 0x00000009, 0x40000000, 0x040117ff, + 0x4a035047, 0x00000004, 0x4a03503e, 0x00000000, + 0x1c01f000, 0x59a80858, 0x82040d80, 0x01391077, + 0x04020008, 0x59e00813, 0x8c040d00, 0x04000005, + 0x82000d80, 0x00000002, 0x04020002, 0x41780000, + 0x4c000000, 0x0401f9b1, 0x5c000000, 0x800001c0, + 0x04000040, 0x82000d80, 0x00000001, 0x0402001d, + 0x42000800, 0x000000a0, 0x0401f909, 0x82040540, + 0x00000004, 0x42000800, 0x000000a0, 0x0401f909, + 0x42000800, 0x000000c0, 0x0401f901, 0x82040540, + 0x00000020, 0x42000800, 0x000000c0, 0x0401f901, + 0x59c40001, 0x82000500, 0xfffe7fff, 0x82000540, + 0x00000000, 0x48038801, 0x59a80054, 0x80000110, + 0x42000800, 0x000000e0, 0x0401f8f6, 0x0401f03c, + 0x82000d80, 0x00000002, 0x02020800, 0x001005d8, + 0x42000800, 0x000000a0, 0x0401f8e9, 0x82040500, + 0xfffffffb, 0x42000800, 0x000000a0, 0x0401f8e9, + 0x42000800, 0x000000c0, 0x0401f8e1, 0x82040500, + 0xffffffdf, 0x42000800, 0x000000c0, 0x0401f8e1, + 0x59c40001, 0x82000500, 0xfffe7fff, 0x82000540, + 0x00010000, 0x48038801, 0x59a80056, 0x80000110, + 0x42000800, 0x000000e0, 0x0401f8d6, 0x0401f01c, + 0x42000800, 0x000000a0, 0x0401f8cd, 0x82040540, + 0x00000004, 0x42000800, 0x000000a0, 0x0401f8cd, + 0x42000800, 0x000000c0, 0x0401f8c5, 0x82040500, + 0xffffffdf, 0x42000800, 0x000000c0, 0x0401f8c5, + 0x59c40001, 0x82000500, 0xfffe7fff, 0x82000540, + 0x00008000, 0x48038801, 0x59a80055, 0x80000110, + 0x42000800, 0x000000e0, 0x0401f8ba, 0x0401f163, + 0x4803c857, 0x59a80858, 0x82040d80, 0x01391077, + 0x04020008, 0x59e00813, 0x8c040d00, 0x04000005, + 0x82000d80, 0x00000002, 0x04020002, 0x41780000, + 0x4c000000, 0x0401f94d, 0x5c000000, 0x800001c0, + 0x04000026, 0x82000d80, 0x00000001, 0x04020010, + 0x59a8006c, 0x80000540, 0x04000004, 0x42001000, + 0x00000000, 0x0401fa0a, 0x42000800, 0x00000000, + 0x0401f897, 0x82040540, 0x00000090, 0x42000800, + 0x00000000, 0x0401f897, 0x0401f024, 0x82000d80, + 0x00000002, 0x02020800, 0x001005d8, 0x59a8006c, + 0x80000540, 0x04000004, 0x42001000, 0x00010000, + 0x0401f9f7, 0x42000800, 0x00000000, 0x0401f884, + 0x82040500, 0xffffff6f, 0x42000800, 0x00000000, + 0x0401f884, 0x0401f011, 0x59a8006c, 0x80000540, + 0x04000004, 0x42001000, 0x00008000, 0x0401f9e8, + 0x42000800, 0x00000000, 0x0401f875, 0x82040500, + 0xffffff6f, 0x82000540, 0x00000010, 0x42000800, + 0x00000000, 0x0401f873, 0x0401f124, 0x4c580000, + 0x4200b000, 0x00000014, 0x8058b040, 0x04000043, + 0x59c4000d, 0x8c000520, 0x040207fc, 0x0401f85c, + 0x59c4000d, 0x8c000520, 0x040207f8, 0x59c40808, + 0x84040d50, 0x48078808, 0x4200b000, 0x000000c8, + 0x8058b040, 0x040207ff, 0x4200b000, 0x00000014, + 0x8058b040, 0x04000031, 0x59c4000d, 0x8c000520, + 0x0402002e, 0x42000800, 0x00001000, 0x50040800, + 0x82040c80, 0x24220001, 0x04020003, 0x8c000504, + 0x040007f4, 0x0401f842, 0x59c4000d, 0x8c000520, + 0x04020022, 0x42000800, 0x00001000, 0x50040800, + 0x82040c80, 0x24220001, 0x04020003, 0x8c000504, + 0x040007e8, 0x4200b000, 0x0000000a, 0x8058b040, + 0x04000003, 0x0401f832, 0x0401f7fd, 0x4200b000, + 0x00000064, 0x59c4000d, 0x8c00051e, 0x0400000f, + 0x8058b040, 0x040207fc, 0x42000000, 0x00001000, + 0x50000000, 0x82000480, 0x24220001, 0x04020004, + 0x59c40808, 0x84040d10, 0x48078808, 0x80000580, + 0x4803c857, 0x0401f00c, 0x42000000, 0x00001000, + 0x50000000, 0x82000480, 0x24220001, 0x04020004, + 0x59c40808, 0x84040d10, 0x48078808, 0x82000540, + 0x00000001, 0x5c00b000, 0x1c01f000, 0x42000800, + 0x000000a0, 0x0401f816, 0x82040500, 0xfffffffe, + 0x42000800, 0x000000a0, 0x0401f816, 0x42000800, + 0x00000000, 0x0401f80e, 0x82040500, 0xfffffffe, + 0x42000800, 0x00000000, 0x0401f00e, 0x40000000, + 0x40000000, 0x40000000, 0x40000000, 0x40000000, + 0x1c01f000, 0x480b8805, 0x1c01f000, 0x4807880e, + 0x59c4080f, 0x82040d00, 0x000000ff, 0x1c01f000, + 0x900001c0, 0x80040d40, 0x84040d40, 0x4807880e, + 0x1c01f000, 0x82000d80, 0x00200000, 0x04000009, + 0x82000d80, 0x02000000, 0x04000006, 0x82000d80, + 0x01000000, 0x04000006, 0x59c408a3, 0x0401f006, + 0x59c408a3, 0x84040d30, 0x0401f003, 0x59c408a3, + 0x84040d32, 0x80040540, 0x480388a3, 0x480788a3, + 0x1c01f000, 0x59c400a3, 0x84000556, 0x480388a3, + 0x84000516, 0x480388a3, 0x1c01f000, 0x485fc857, + 0x4863c857, 0x4c640000, 0x4d3c0000, 0x4d400000, + 0x0201f800, 0x00106ede, 0x4863500a, 0x0201f800, + 0x0010ab33, 0x0402006c, 0x82600d00, 0x0000ff00, + 0x800409c0, 0x0400000c, 0x4200c800, 0x00000001, + 0x59a80010, 0x82000500, 0x000000ff, 0x80041110, + 0x80081580, 0x04000021, 0x82041580, 0x0000ff00, + 0x0400000a, 0x59c410a3, 0x82081500, 0x00008000, + 0x04000009, 0x59c410a7, 0x82081500, 0x0000ff00, + 0x82081580, 0x0000ff00, 0x4200c800, 0x00000000, + 0x04000012, 0x59a80005, 0x8c000502, 0x04020008, + 0x8c000500, 0x0402000d, 0x599c1017, 0x8c08151a, + 0x0400003e, 0x84000542, 0x48035005, 0x4200c800, + 0x00000002, 0x42028000, 0x00000004, 0x42027800, + 0x00000008, 0x0401f008, 0x59a80805, 0x84040d40, + 0x48075005, 0x42028000, 0x00000004, 0x42027800, + 0x00000400, 0x59a80006, 0x8c000502, 0x04020006, + 0x59a80805, 0x8c040d0a, 0x04020033, 0x84040d4a, + 0x48075005, 0x42000000, 0x0010b812, 0x0201f800, + 0x0010aa47, 0x59a8180a, 0x42001000, 0x00008013, + 0x0201f800, 0x00103a3e, 0x0201f800, 0x00103b25, + 0x04000015, 0x4d400000, 0x82600500, 0x000000ff, + 0x42028800, 0x0000ffff, 0x40643000, 0x42028000, + 0x0000000e, 0x0201f800, 0x0010a446, 0x42000800, + 0x00000001, 0x42001000, 0x00000100, 0x0201f800, + 0x0010618b, 0x5c028000, 0x599c0817, 0x8c040d0a, + 0x04020011, 0x493fc857, 0x4943c857, 0x0201f800, + 0x00101fe5, 0x0401f00c, 0x0201f800, 0x00103b25, + 0x04000009, 0x42028000, 0x0000000f, 0x42028800, + 0x0000ffff, 0x42003000, 0x00000000, 0x0201f800, + 0x0010a449, 0x497b8880, 0x5c028000, 0x5c027800, + 0x5c00c800, 0x1c01f000, 0x42000800, 0x000000a0, + 0x0401ff5f, 0x82040540, 0x00000002, 0x42000800, + 0x000000a0, 0x0401f75f, 0x42000800, 0x00000000, + 0x0401ff57, 0x82040540, 0x00000002, 0x42000800, + 0x00000000, 0x0401f757, 0x42000800, 0x000000a0, + 0x0401ff4f, 0x82040500, 0xfffffffd, 0x42000800, + 0x000000a0, 0x0401f74f, 0x42000800, 0x00000000, + 0x0401ff47, 0x82040500, 0xfffffffd, 0x42000800, + 0x00000000, 0x0401f747, 0x59c408a8, 0x0401ff38, + 0x0401ff37, 0x59c400a8, 0x80040d80, 0x040207fb, + 0x1c01f000, 0x4803c856, 0x4a038807, 0x00000001, + 0x497b8807, 0x59c40005, 0x48038805, 0x497b506c, + 0x497b506d, 0x41785800, 0x42006000, 0x00000001, + 0x42006800, 0x00000003, 0x0401f824, 0x0401f82f, + 0x40400000, 0x4803c857, 0x82408580, 0x00000000, + 0x0402001d, 0x41785800, 0x42006000, 0x0000001e, + 0x42006800, 0x00000014, 0x0401f818, 0x0401f823, + 0x40400000, 0x4803c857, 0x82408580, 0x00000800, + 0x04020011, 0x42005800, 0x00000001, 0x42006000, + 0x0000001e, 0x42006800, 0x00000014, 0x0401f80b, + 0x0401f816, 0x40400000, 0x4803c857, 0x82408580, + 0x0000ffff, 0x04020004, 0x4a03506c, 0x00000001, + 0x4803c856, 0x1c01f000, 0x41785000, 0x0401f812, + 0x0401f838, 0x40347000, 0x40340800, 0x0401f03d, + 0x42005000, 0x00000001, 0x0401f80b, 0x0401f831, + 0x40340800, 0x0401f037, 0x42005000, 0x00000002, + 0x0401f805, 0x0401f81d, 0x0401f835, 0x40048000, + 0x1c01f000, 0x0401f808, 0x0401f814, 0x40280800, + 0x0401f826, 0x402c0800, 0x0401f827, 0x40300800, + 0x0401f025, 0x42000800, 0x0000ffff, 0x42001000, + 0x00000001, 0x0401f829, 0x42001000, 0x00000010, + 0x0401f826, 0x42000800, 0x0000ffff, 0x42001000, + 0x00000010, 0x0401f021, 0x41780800, 0x42001000, + 0x00000002, 0x0401f01d, 0x0401f92e, 0x4a03d000, + 0x00050004, 0x0401f92b, 0x4a03d000, 0x00050005, + 0x0401f928, 0x4a03d000, 0x00050004, 0x42000800, + 0x00000001, 0x42001000, 0x00000001, 0x0401f00f, + 0x42000800, 0x00000002, 0x42001000, 0x00000002, + 0x0401f00a, 0x42001000, 0x00000005, 0x0401f007, + 0x42001000, 0x00000010, 0x0401f004, 0x42001000, + 0x00000010, 0x0401f01b, 0x0401f912, 0x82082c00, + 0x0010ab38, 0x50142800, 0x82081500, 0xffffffff, + 0x04000013, 0x0401f90b, 0x80081040, 0x80142902, + 0x40040000, 0x80140500, 0x04000007, 0x4a03d000, + 0x00070006, 0x0401f903, 0x4a03d000, 0x00070007, + 0x0401f006, 0x4a03d000, 0x00070004, 0x0401f8fd, + 0x4a03d000, 0x00070005, 0x0401f7ec, 0x1c01f000, + 0x41780800, 0x82082c00, 0x0010ab38, 0x50142800, + 0x82081500, 0xffffffff, 0x04000010, 0x0401f8f1, + 0x4a03d000, 0x00050001, 0x0401f8ee, 0x59e81800, + 0x80081040, 0x80142902, 0x8c0c1d06, 0x04000004, + 0x40140000, 0x80040d40, 0x0401f8e6, 0x4a03d000, + 0x00070000, 0x0401f7ef, 0x1c01f000, 0x480bc857, + 0x480b506d, 0x59c40001, 0x82000500, 0xffffefff, + 0x48038801, 0x41781800, 0x0401f8c4, 0x41785800, + 0x42006000, 0x0000001e, 0x42006800, 0x00000004, + 0x0401ff7a, 0x42006800, 0x0000003c, 0x0401ff7d, + 0x41785800, 0x42006000, 0x0000001e, 0x42006800, + 0x00000004, 0x0401ff71, 0x41786800, 0x0401ff75, + 0x41785800, 0x42006000, 0x0000001e, 0x41786800, + 0x0401ff6a, 0x42006800, 0x00000002, 0x0401ff6d, + 0x42006800, 0x00000001, 0x0401ff64, 0x42006800, + 0x000000f5, 0x0401ff67, 0x41785800, 0x42006000, + 0x0000001e, 0x42006800, 0x00000004, 0x0401ff5b, + 0x42006800, 0x00000020, 0x0401ff5e, 0x59a8106d, + 0x0401f865, 0x42001800, 0x000200f5, 0x0401f897, + 0x59a8106d, 0x0401f879, 0x41785800, 0x42006000, + 0x0000001e, 0x42006800, 0x00000004, 0x0401ff4b, + 0x41786800, 0x0401ff4f, 0x59c40001, 0x82000540, + 0x00001000, 0x48038801, 0x41785800, 0x42006000, + 0x0000001e, 0x42006800, 0x00000015, 0x0401ff3f, + 0x0401ff4a, 0x40400000, 0x82000540, 0x00000002, + 0x4c000000, 0x41785800, 0x42006000, 0x0000001e, + 0x42006800, 0x00000015, 0x0401ff34, 0x5c000000, + 0x40006800, 0x0401ff37, 0x41785800, 0x42006000, + 0x0000001e, 0x42006800, 0x00000015, 0x0401ff2b, + 0x0401ff36, 0x40400000, 0x82000500, 0x0000fffd, + 0x4c000000, 0x41785800, 0x42006000, 0x0000001e, + 0x42006800, 0x00000015, 0x0401ff20, 0x5c000000, + 0x40006800, 0x0401ff23, 0x41785800, 0x42006000, + 0x0000001e, 0x42006800, 0x00000014, 0x0401ff17, + 0x0401ff22, 0x40400000, 0x82000540, 0x00000040, + 0x4c000000, 0x41785800, 0x42006000, 0x0000001e, + 0x42006800, 0x00000014, 0x0401ff0c, 0x5c000000, + 0x40006800, 0x0401ff0f, 0x41785800, 0x42006000, + 0x0000001e, 0x42006800, 0x00000014, 0x0401ff03, + 0x0401ff0e, 0x40400000, 0x82000500, 0x0000ffbf, + 0x4c000000, 0x41785800, 0x42006000, 0x0000001e, + 0x42006800, 0x00000014, 0x0401fef8, 0x5c000000, + 0x40006800, 0x0401fefb, 0x4a038886, 0x00002020, + 0x0401f04c, 0x480bc857, 0x82080580, 0x00010000, + 0x04020007, 0x82040d40, 0x00010000, 0x42001800, + 0x00000001, 0x0401f82d, 0x0401f00f, 0x82080580, + 0x00008000, 0x04000007, 0x82040d40, 0x00000000, + 0x42001800, 0x00900001, 0x0401f824, 0x0401f006, + 0x82040d40, 0x00008000, 0x42001800, 0x00100001, + 0x0401f81e, 0x1c01f000, 0x480bc857, 0x82080580, + 0x00010000, 0x04020008, 0x42001800, 0x000000a1, + 0x0401f816, 0x42001800, 0x000000c1, 0x0401f813, + 0x0401f011, 0x82080580, 0x00008000, 0x04000008, + 0x42001800, 0x000400a1, 0x0401f80c, 0x42001800, + 0x002000c1, 0x0401f809, 0x0401f007, 0x42001800, + 0x000400a1, 0x0401f805, 0x42001800, 0x000000c1, + 0x0401f802, 0x1c01f000, 0x480fc857, 0x41785800, + 0x42006000, 0x0000001e, 0x41786800, 0x0401feb7, + 0x400c6800, 0x80346960, 0x0401feba, 0x42006800, + 0x00000001, 0x0401feb1, 0x400c6800, 0x0401feb5, + 0x42006800, 0x00000003, 0x0401feac, 0x0401feb7, + 0x40400000, 0x8c000504, 0x040207fc, 0x1c01f000, + 0x42000000, 0x00000064, 0x80000040, 0x040207ff, + 0x1c01f000, 0x00020103, 0x00101bd5, 0x00101bdb, + 0x00101be1, 0x00101be9, 0x00101bef, 0x00101bf7, + 0x00101bff, 0x00101c09, 0x00101c0f, 0x00101c17, + 0x00101c1f, 0x00101c29, 0x00101c31, 0x00101c3b, + 0x00101c45, 0x000200f8, 0x00101c51, 0x00101c59, + 0x00101c61, 0x00101c6b, 0x00101c73, 0x00101c7d, + 0x00101c87, 0x00101c93, 0x00101c9b, 0x00101ca5, + 0x00101caf, 0x00101cbb, 0x00101cc5, 0x00101cd1, + 0x00101cdd, 0x000200fd, 0x00101ceb, 0x00101cf3, + 0x00101cfb, 0x00101d05, 0x00101d0d, 0x00101d17, + 0x00101d21, 0x00101d2d, 0x00101d35, 0x00101d3f, + 0x00101d49, 0x00101d55, 0x00101d5f, 0x00101d6b, + 0x00101d77, 0x00101d85, 0x00101d8d, 0x00101d97, + 0x00101da1, 0x00101dad, 0x00101db7, 0x00101dc3, + 0x00101dcf, 0x00101ddd, 0x00101de7, 0x00101df3, + 0x00101dff, 0x00101e0d, 0x00101e19, 0x00101e27, + 0x00101e35, 0x4c000000, 0x4df00000, 0x0201f800, + 0x00020104, 0x0201f000, 0x00020101, 0x4c000000, + 0x4df00000, 0x0201f800, 0x00101418, 0x0201f000, + 0x00020101, 0x4c000000, 0x4df00000, 0x0201f800, + 0x00101418, 0x0201f800, 0x00020104, 0x0201f000, + 0x00020101, 0x4c000000, 0x4df00000, 0x0201f800, + 0x00101155, 0x0201f000, 0x00020101, 0x4c000000, + 0x4df00000, 0x0201f800, 0x00101155, 0x0201f800, + 0x00020104, 0x0201f000, 0x00020101, 0x4c000000, + 0x4df00000, 0x0201f800, 0x00101155, 0x0201f800, + 0x00101418, 0x0201f000, 0x00020101, 0x4c000000, + 0x4df00000, 0x0201f800, 0x00101155, 0x0201f800, + 0x00101418, 0x0201f800, 0x00020104, 0x0201f000, + 0x00020101, 0x4c000000, 0x4df00000, 0x0201f800, + 0x00101289, 0x0201f000, 0x00020101, 0x4c000000, + 0x4df00000, 0x0201f800, 0x00101289, 0x0201f800, + 0x00020104, 0x0201f000, 0x00020101, 0x4c000000, + 0x4df00000, 0x0201f800, 0x00101418, 0x0201f800, + 0x00101289, 0x0201f000, 0x00020101, 0x4c000000, + 0x4df00000, 0x0201f800, 0x00101418, 0x0201f800, + 0x00101289, 0x0201f800, 0x00020104, 0x0201f000, + 0x00020101, 0x4c000000, 0x4df00000, 0x0201f800, + 0x00101155, 0x0201f800, 0x00101289, 0x0201f000, + 0x00020101, 0x4c000000, 0x4df00000, 0x0201f800, + 0x00101155, 0x0201f800, 0x00101289, 0x0201f800, + 0x00020104, 0x0201f000, 0x00020101, 0x4c000000, + 0x4df00000, 0x0201f800, 0x00101155, 0x0201f800, + 0x00101418, 0x0201f800, 0x00101289, 0x0201f000, + 0x00020101, 0x4c000000, 0x4df00000, 0x0201f800, + 0x00101155, 0x0201f800, 0x00101418, 0x0201f800, + 0x00101289, 0x0201f800, 0x00020104, 0x0201f000, + 0x00020101, 0x4c000000, 0x4df00000, 0x0201f800, + 0x00020729, 0x0201f800, 0x00020104, 0x0201f000, + 0x00020101, 0x4c000000, 0x4df00000, 0x0201f800, + 0x00101418, 0x0201f800, 0x00020729, 0x0201f000, + 0x00020101, 0x4c000000, 0x4df00000, 0x0201f800, + 0x00101418, 0x0201f800, 0x00020729, 0x0201f800, + 0x00020104, 0x0201f000, 0x00020101, 0x4c000000, + 0x4df00000, 0x0201f800, 0x00101155, 0x0201f800, + 0x00020729, 0x0201f000, 0x00020101, 0x4c000000, + 0x4df00000, 0x0201f800, 0x00101155, 0x0201f800, + 0x00020729, 0x0201f800, 0x00020104, 0x0201f000, + 0x00020101, 0x4c000000, 0x4df00000, 0x0201f800, + 0x00101155, 0x0201f800, 0x00101418, 0x0201f800, + 0x00020729, 0x0201f000, 0x00020101, 0x4c000000, + 0x4df00000, 0x0201f800, 0x00101155, 0x0201f800, + 0x00101418, 0x0201f800, 0x00020729, 0x0201f800, + 0x00020104, 0x0201f000, 0x00020101, 0x4c000000, + 0x4df00000, 0x0201f800, 0x00020729, 0x0201f800, + 0x00101289, 0x0201f000, 0x00020101, 0x4c000000, + 0x4df00000, 0x0201f800, 0x00020729, 0x0201f800, + 0x00101289, 0x0201f800, 0x00020104, 0x0201f000, + 0x00020101, 0x4c000000, 0x4df00000, 0x0201f800, + 0x00101418, 0x0201f800, 0x00020729, 0x0201f800, + 0x00101289, 0x0201f000, 0x00020101, 0x4c000000, + 0x4df00000, 0x0201f800, 0x00101418, 0x0201f800, + 0x00020729, 0x0201f800, 0x00101289, 0x0201f800, + 0x00020104, 0x0201f000, 0x00020101, 0x4c000000, + 0x4df00000, 0x0201f800, 0x00101155, 0x0201f800, + 0x00020729, 0x0201f800, 0x00101289, 0x0201f000, + 0x00020101, 0x4c000000, 0x4df00000, 0x0201f800, + 0x00101155, 0x0201f800, 0x00020729, 0x0201f800, + 0x00101289, 0x0201f800, 0x00020104, 0x0201f000, + 0x00020101, 0x4c000000, 0x4df00000, 0x0201f800, + 0x00101155, 0x0201f800, 0x00101418, 0x0201f800, + 0x00020729, 0x0201f800, 0x00101289, 0x0201f000, + 0x00020101, 0x4c000000, 0x4df00000, 0x0201f800, + 0x00101155, 0x0201f800, 0x00101418, 0x0201f800, + 0x00020729, 0x0201f800, 0x00101289, 0x0201f800, + 0x00020104, 0x0201f000, 0x00020101, 0x4c000000, + 0x4df00000, 0x0201f800, 0x00020015, 0x0201f800, + 0x00020104, 0x0201f000, 0x00020101, 0x4c000000, + 0x4df00000, 0x0201f800, 0x00101418, 0x0201f800, + 0x00020015, 0x0201f000, 0x00020101, 0x4c000000, + 0x4df00000, 0x0201f800, 0x00101418, 0x0201f800, + 0x00020015, 0x0201f800, 0x00020104, 0x0201f000, + 0x00020101, 0x4c000000, 0x4df00000, 0x0201f800, + 0x00101155, 0x0201f800, 0x00020015, 0x0201f000, + 0x00020101, 0x4c000000, 0x4df00000, 0x0201f800, + 0x00101155, 0x0201f800, 0x00020015, 0x0201f800, + 0x00020104, 0x0201f000, 0x00020101, 0x4c000000, + 0x4df00000, 0x0201f800, 0x00101418, 0x0201f800, + 0x00101155, 0x0201f800, 0x00020015, 0x0201f000, + 0x00020101, 0x4c000000, 0x4df00000, 0x0201f800, + 0x00101418, 0x0201f800, 0x00101155, 0x0201f800, + 0x00020015, 0x0201f800, 0x00020104, 0x0201f000, + 0x00020101, 0x4c000000, 0x4df00000, 0x0201f800, + 0x00020015, 0x0201f800, 0x00101289, 0x0201f000, + 0x00020101, 0x4c000000, 0x4df00000, 0x0201f800, + 0x00020015, 0x0201f800, 0x00101289, 0x0201f800, + 0x00020104, 0x0201f000, 0x00020101, 0x4c000000, + 0x4df00000, 0x0201f800, 0x00101418, 0x0201f800, + 0x00020015, 0x0201f800, 0x00101289, 0x0201f000, + 0x00020101, 0x4c000000, 0x4df00000, 0x0201f800, + 0x00101418, 0x0201f800, 0x00020015, 0x0201f800, + 0x00101289, 0x0201f800, 0x00020104, 0x0201f000, + 0x00020101, 0x4c000000, 0x4df00000, 0x0201f800, + 0x00020015, 0x0201f800, 0x00101289, 0x0201f800, + 0x00101155, 0x0201f000, 0x00020101, 0x4c000000, + 0x4df00000, 0x0201f800, 0x00020015, 0x0201f800, + 0x00101289, 0x0201f800, 0x00101155, 0x0201f800, + 0x00020104, 0x0201f000, 0x00020101, 0x4c000000, + 0x4df00000, 0x0201f800, 0x00101418, 0x0201f800, + 0x00020015, 0x0201f800, 0x00101289, 0x0201f800, + 0x00101155, 0x0201f000, 0x00020101, 0x4c000000, + 0x4df00000, 0x0201f800, 0x00101418, 0x0201f800, + 0x00020015, 0x0201f800, 0x00101289, 0x0201f800, + 0x00101155, 0x0201f800, 0x00020104, 0x0201f000, + 0x00020101, 0x4c000000, 0x4df00000, 0x0201f800, + 0x00020729, 0x0201f800, 0x00020015, 0x0201f000, + 0x00020101, 0x4c000000, 0x4df00000, 0x0201f800, + 0x00020729, 0x0201f800, 0x00020015, 0x0201f800, + 0x00020104, 0x0201f000, 0x00020101, 0x4c000000, + 0x4df00000, 0x0201f800, 0x00101418, 0x0201f800, + 0x00020729, 0x0201f800, 0x00020015, 0x0201f000, + 0x00020101, 0x4c000000, 0x4df00000, 0x0201f800, + 0x00101418, 0x0201f800, 0x00020729, 0x0201f800, + 0x00020015, 0x0201f800, 0x00020104, 0x0201f000, + 0x00020101, 0x4c000000, 0x4df00000, 0x0201f800, + 0x00020729, 0x0201f800, 0x00020015, 0x0201f800, + 0x00101155, 0x0201f000, 0x00020101, 0x4c000000, + 0x4df00000, 0x0201f800, 0x00020729, 0x0201f800, + 0x00020015, 0x0201f800, 0x00101155, 0x0201f800, + 0x00020104, 0x0201f000, 0x00020101, 0x4c000000, + 0x4df00000, 0x0201f800, 0x00101418, 0x0201f800, + 0x00020729, 0x0201f800, 0x00020015, 0x0201f800, + 0x00101155, 0x0201f000, 0x00020101, 0x4c000000, + 0x4df00000, 0x0201f800, 0x00101418, 0x0201f800, + 0x00020729, 0x0201f800, 0x00020015, 0x0201f800, + 0x00101155, 0x0201f800, 0x00020104, 0x0201f000, + 0x00020101, 0x4c000000, 0x4df00000, 0x0201f800, + 0x00020729, 0x0201f800, 0x00020015, 0x0201f800, + 0x00101289, 0x0201f000, 0x00020101, 0x4c000000, + 0x4df00000, 0x0201f800, 0x00020729, 0x0201f800, + 0x00020015, 0x0201f800, 0x00101289, 0x0201f800, + 0x00020104, 0x0201f000, 0x00020101, 0x4c000000, + 0x4df00000, 0x0201f800, 0x00101418, 0x0201f800, + 0x00020729, 0x0201f800, 0x00020015, 0x0201f800, + 0x00101289, 0x0201f000, 0x00020101, 0x4c000000, + 0x4df00000, 0x0201f800, 0x00101418, 0x0201f800, + 0x00020729, 0x0201f800, 0x00020015, 0x0201f800, + 0x00101289, 0x0201f800, 0x00020104, 0x0201f000, + 0x00020101, 0x4c000000, 0x4df00000, 0x0201f800, + 0x00101155, 0x0201f800, 0x00020729, 0x0201f800, + 0x00020015, 0x0201f800, 0x00101289, 0x0201f000, + 0x00020101, 0x4c000000, 0x4df00000, 0x0201f800, + 0x00101155, 0x0201f800, 0x00020729, 0x0201f800, + 0x00020015, 0x0201f800, 0x00101289, 0x0201f800, + 0x00020104, 0x0201f000, 0x00020101, 0x4c000000, + 0x4df00000, 0x0201f800, 0x00101155, 0x0201f800, + 0x00101418, 0x0201f800, 0x00020729, 0x0201f800, + 0x00020015, 0x0201f800, 0x00101289, 0x0201f000, + 0x00020101, 0x4c000000, 0x4df00000, 0x0201f800, + 0x00101155, 0x0201f800, 0x00101418, 0x0201f800, + 0x00020729, 0x0201f800, 0x00020015, 0x0201f800, + 0x00101289, 0x0201f800, 0x00020104, 0x0201f000, + 0x00020101, 0x4c5c0000, 0x4c600000, 0x4178b800, + 0x0201f800, 0x001048ec, 0x040200fd, 0x59a8c026, + 0x0201f800, 0x0010513b, 0x04000003, 0x8c60c506, + 0x0400000e, 0x8c60c500, 0x04020004, 0x8c60c50e, + 0x040008f6, 0x0401f0f2, 0x0401fab4, 0x040200f0, + 0x0201f800, 0x0010513b, 0x04020004, 0x4a03501c, + 0x0000ffff, 0x0401f0ea, 0x8c60c504, 0x04000004, + 0x4a03501c, 0x0000ffff, 0x0401f0e5, 0x59a8c010, + 0x8260c500, 0x000000ff, 0x59a81013, 0x8c081500, + 0x0400005d, 0x8c081502, 0x0402005b, 0x59a8b81c, + 0x825c0d80, 0x0000ffff, 0x04020003, 0x4200b800, + 0x00000001, 0x805c1104, 0x82086400, 0x0010be21, + 0x50300800, 0x825c0500, 0x00000003, 0x0c01f001, + 0x00101e81, 0x00101e7c, 0x00101e80, 0x00101e7e, + 0x80040910, 0x0401f004, 0x80040930, 0x0401f002, + 0x80040920, 0x82040500, 0x000000ff, 0x82000d80, + 0x000000ff, 0x0400000f, 0x4c000000, 0x82000400, + 0x0010210e, 0x50000800, 0x80040910, 0x82040580, + 0x00000080, 0x5c000000, 0x04000030, 0x80600d80, + 0x0400002e, 0x80000540, 0x0400002c, 0x0401f00b, + 0x59a81005, 0x82081500, 0x00000003, 0x0402002b, + 0x59a81013, 0x84081542, 0x480b5013, 0x4a03501c, + 0x0000ffff, 0x0401f028, 0x4c000000, 0x59a80005, + 0x8c000514, 0x42001000, 0x00000010, 0x02020800, + 0x00104c6d, 0x5c000000, 0x0402001c, 0x417a8800, + 0x0201f800, 0x00105c9a, 0x04020016, 0x0201f800, + 0x001045e5, 0x04000006, 0x0201f800, 0x00104c62, + 0x0401f8b1, 0x0400000f, 0x0401f00c, 0x599c0019, + 0x8c00050e, 0x04020009, 0x0201f800, 0x001045a6, + 0x04020008, 0x0201f800, 0x00104c62, 0x0401f9e1, + 0x0401f8be, 0x04000003, 0x805cb800, 0x0401f7b2, + 0x485f501c, 0x0401f086, 0x4a03501c, 0x0000ffff, + 0x0401f083, 0x42003000, 0x0000007e, 0x59a8001c, + 0x82001580, 0x0000ffff, 0x04020005, 0x80000d80, + 0x4018b000, 0x4803c856, 0x0401f009, 0x8018b480, + 0x04001004, 0x40000800, 0x4803c856, 0x0401f004, + 0x4a03501c, 0x0000ffff, 0x0401f071, 0x4c040000, + 0x4c580000, 0x82040400, 0x0010210e, 0x50000000, + 0x82000500, 0x000000ff, 0x80604580, 0x0400005c, + 0x0201f800, 0x00105c9b, 0x04020061, 0x59a80005, + 0x8c000514, 0x42001000, 0x00000010, 0x02020800, + 0x00104c6d, 0x5c00b000, 0x5c000800, 0x040207d7, + 0x4c040000, 0x4c580000, 0x845cbd00, 0x0201f800, + 0x00020245, 0x04000008, 0x599c0019, 0x8c00050e, + 0x04020047, 0x0201f800, 0x001045ab, 0x0402004c, + 0x0401f002, 0x845cbd40, 0x0201f800, 0x00104c62, + 0x0201f800, 0x001049e7, 0x04020007, 0x59a80005, + 0x8c000502, 0x04000033, 0x59340200, 0x8c00050e, + 0x04020030, 0x59a81013, 0x8c081502, 0x04000025, + 0x0201f800, 0x00104a09, 0x04000031, 0x8c5cbd00, + 0x04020004, 0x0201f800, 0x001045ff, 0x0401f02c, + 0x0401f9cd, 0x0400002a, 0x42026000, 0x0010bde9, + 0x49366009, 0x497a6008, 0x417a7800, 0x0401f925, + 0x42000000, 0x0010b864, 0x0201f800, 0x0010aa47, + 0x0201f800, 0x00103b25, 0x0400001d, 0x41782800, + 0x42003000, 0x00000008, 0x4d400000, 0x4d440000, + 0x59368c03, 0x42028000, 0x00000029, 0x0201f800, + 0x0010a446, 0x5c028800, 0x5c028000, 0x0401f010, + 0x4937c857, 0x599c0019, 0x8c00050e, 0x0402000c, + 0x0401f96c, 0x0401f849, 0x04000011, 0x0401f008, + 0x59a80013, 0x8c000500, 0x04000003, 0x0401f9a6, + 0x04000003, 0x0401f828, 0x04000009, 0x5c00b000, + 0x5c000800, 0x80040800, 0x8058b040, 0x04020798, + 0x4a03501c, 0x0000ffff, 0x0401f005, 0x4937c857, + 0x5c00b000, 0x5c000800, 0x4807501c, 0x5c00c000, + 0x5c00b800, 0x1c01f000, 0x4803c856, 0x4a03501c, + 0x00000001, 0x42028800, 0x000007fe, 0x42003000, + 0x00fffffe, 0x0201f800, 0x001045a6, 0x0402000c, + 0x0401f948, 0x0401f825, 0x04000009, 0x59a80026, + 0x8400054e, 0x48035026, 0x0201f800, 0x0010930f, + 0x82000540, 0x00000001, 0x1c01f000, 0x80000580, + 0x0401f7fe, 0x4937c857, 0x0201f800, 0x00107942, + 0x04000015, 0x49366009, 0x4a026406, 0x00000001, + 0x417a7800, 0x0201f800, 0x00104567, 0x59a8001b, + 0x80000000, 0x4803501b, 0x42027000, 0x00000004, + 0x599c0019, 0x8c00050e, 0x04000003, 0x42027000, + 0x00000000, 0x0201f800, 0x000207a1, 0x82000540, + 0x00000001, 0x1c01f000, 0x4937c857, 0x0201f800, + 0x00107942, 0x0400001c, 0x49366009, 0x59340403, + 0x82000580, 0x000007fe, 0x04000005, 0x4d3c0000, + 0x417a7800, 0x0401f8b7, 0x5c027800, 0x4a026406, + 0x00000001, 0x417a7800, 0x0201f800, 0x00104567, + 0x42000800, 0x00000003, 0x0201f800, 0x00104571, + 0x59a8001b, 0x80000000, 0x4803501b, 0x42027000, + 0x00000002, 0x0201f800, 0x000207a1, 0x82000540, + 0x00000001, 0x1c01f000, 0x4803c856, 0x42028800, + 0x000007fc, 0x42003000, 0x00fffffc, 0x0201f800, + 0x001045a6, 0x04020005, 0x0401f805, 0x04000003, + 0x4a035027, 0x0000ffff, 0x1c01f000, 0x4937c857, + 0x0201f800, 0x00107942, 0x04000014, 0x49366009, + 0x4a026406, 0x00000001, 0x417a7800, 0x0201f800, + 0x00104567, 0x42000800, 0x00000003, 0x0201f800, + 0x00104571, 0x59a80028, 0x80000000, 0x48035028, + 0x42027000, 0x00000002, 0x0201f800, 0x000207a1, + 0x82000540, 0x00000001, 0x1c01f000, 0x480bc857, + 0x492fc857, 0x4c5c0000, 0x4008b800, 0x42028800, + 0x000007fd, 0x42003000, 0x00fffffd, 0x0201f800, + 0x001045a6, 0x0402001a, 0x0201f800, 0x0002075a, + 0x04000017, 0x49366009, 0x5934000a, 0x84000544, + 0x4802680a, 0x812e59c0, 0x04000005, 0x592c0404, + 0x8c00051e, 0x04000002, 0x48ee6021, 0x492e6008, + 0x4a026406, 0x00000001, 0x485e601c, 0x42027000, + 0x00000022, 0x0201f800, 0x000207a1, 0x82000540, + 0x00000001, 0x5c00b800, 0x1c01f000, 0x80000580, + 0x0401f7fd, 0x5c000000, 0x4c000000, 0x4803c857, + 0x4943c857, 0x493fc857, 0x4d340000, 0x4d440000, + 0x4c580000, 0x4d2c0000, 0x4c5c0000, 0x0201f800, + 0x00106c55, 0x4df00000, 0x0201f800, 0x001069f1, + 0x0201f800, 0x00106aac, 0x0201f800, 0x00106737, + 0x0201f800, 0x0010848a, 0x5c03e000, 0x02000800, + 0x00106c4b, 0x4200b000, 0x000007f0, 0x417a8800, + 0x0201f800, 0x00020245, 0x0402001f, 0x8d3e7d14, + 0x04000005, 0x59340212, 0x82000500, 0x0000ff00, + 0x04000019, 0x8d3e7d06, 0x04000004, 0x59340200, + 0x8c00050e, 0x04020014, 0x8d3e7d18, 0x0400000f, + 0x5934b80f, 0x805cb9c0, 0x04000009, 0x49425a06, + 0x592cb800, 0x0201f800, 0x000202ce, 0x805cb9c0, + 0x040207fb, 0x497a680f, 0x497a6810, 0x4a026c00, + 0x00000707, 0x0401f004, 0x4937c857, 0x0201f800, + 0x001042b4, 0x81468800, 0x8058b040, 0x040207dd, + 0x8d3e7d02, 0x04000011, 0x497b501d, 0x42028800, + 0x000007f0, 0x4200b000, 0x00000010, 0x0201f800, + 0x00020245, 0x04020006, 0x4937c857, 0x4a026c00, + 0x00000707, 0x0201f800, 0x001042b4, 0x81468800, + 0x8058b040, 0x040207f6, 0x5c00b800, 0x5c025800, + 0x5c00b000, 0x5c028800, 0x5c026800, 0x1c01f000, + 0x5c000000, 0x4c000000, 0x4803c857, 0x4933c857, + 0x493fc857, 0x4d340000, 0x4d400000, 0x4d440000, + 0x4d2c0000, 0x4c5c0000, 0x0201f800, 0x00106c55, + 0x4df00000, 0x59326809, 0x813669c0, 0x04000020, + 0x59368c03, 0x42028000, 0x00000029, 0x0201f800, + 0x00106a50, 0x0201f800, 0x00106ab4, 0x0201f800, + 0x001067fd, 0x0201f800, 0x0010a2ff, 0x4937c857, + 0x8d3e7d18, 0x04000010, 0x5934b80f, 0x805cb9c0, + 0x0400000a, 0x405e5800, 0x49425a06, 0x592cb800, + 0x0201f800, 0x000202ce, 0x805cb9c0, 0x040207fa, + 0x497a680f, 0x497a6810, 0x4a026c00, 0x00000707, + 0x0401f003, 0x0201f800, 0x001042b4, 0x5c03e000, + 0x02000800, 0x00106c4b, 0x5c00b800, 0x5c025800, + 0x5c028800, 0x5c028000, 0x5c026800, 0x1c01f000, + 0x4933c857, 0x59a80026, 0x8c000508, 0x04020012, + 0x59305009, 0x482bc857, 0x836c0580, 0x00000002, + 0x0402000d, 0x0401f813, 0x0402000b, 0x58280403, + 0x82000580, 0x000007fc, 0x04000008, 0x59a8001b, + 0x80000040, 0x4803c857, 0x02001800, 0x001005d8, + 0x4803501b, 0x1c01f000, 0x59a80028, 0x80000040, + 0x4803c857, 0x040017fc, 0x48035028, 0x1c01f000, + 0x59300008, 0x800001c0, 0x04020009, 0x59300403, + 0x82000580, 0x00000001, 0x04020004, 0x82000540, + 0x00000001, 0x0401f002, 0x80000580, 0x1c01f000, + 0x4937c857, 0x59340200, 0x84000502, 0x48026a00, + 0x1c01f000, 0x4933c857, 0x493fc857, 0x4947c857, + 0x4d3c0000, 0x4d400000, 0x4d340000, 0x4d440000, + 0x4c580000, 0x0201f800, 0x00106c55, 0x4df00000, + 0x813e79c0, 0x04020004, 0x4200b000, 0x00000001, + 0x0401f004, 0x4200b000, 0x000007f0, 0x417a8800, + 0x41440000, 0x81ac0400, 0x50000000, 0x80026d40, + 0x04000019, 0x42027800, 0x00000001, 0x0201f800, + 0x001048f6, 0x42028000, 0x00000029, 0x417a7800, + 0x0201f800, 0x00106a50, 0x0201f800, 0x00106ab4, + 0x0201f800, 0x001067fd, 0x0201f800, 0x001049e7, + 0x04020005, 0x4937c857, 0x4a026c00, 0x00000404, + 0x0401f003, 0x0201f800, 0x00104a14, 0x0201f800, + 0x0010a2ff, 0x81468800, 0x8058b040, 0x040207e1, + 0x5c03e000, 0x02000800, 0x00106c4b, 0x5c00b000, + 0x5c028800, 0x5c026800, 0x5c028000, 0x5c027800, + 0x1c01f000, 0x4937c857, 0x4947c857, 0x4c5c0000, + 0x4c600000, 0x4c640000, 0x59a80013, 0x8c000500, + 0x0400001f, 0x599c0017, 0x8c00050a, 0x0402001c, + 0x5934ba02, 0x825cbd00, 0x000000ff, 0x485fc857, + 0x4178c000, 0x4178c800, 0x82600400, 0x0010be21, + 0x50002000, 0x8060c1c0, 0x04000008, 0x82100500, + 0x000000ff, 0x82002d80, 0x000000ff, 0x0400000c, + 0x805c0580, 0x0400000d, 0x80102110, 0x8064c800, + 0x82640580, 0x00000004, 0x040207f5, 0x8060c000, + 0x82600580, 0x00000020, 0x040207eb, 0x4813c857, + 0x82000540, 0x00000001, 0x5c00c800, 0x5c00c000, + 0x5c00b800, 0x1c01f000, 0x59a80026, 0x4803c857, + 0x8c000512, 0x1c01f000, 0x00007eef, 0x00007de8, + 0x00007ce4, 0x000080e2, 0x00007be1, 0x000080e0, + 0x000080dc, 0x000080da, 0x00007ad9, 0x000080d6, + 0x000080d5, 0x000080d4, 0x000080d3, 0x000080d2, + 0x000080d1, 0x000079ce, 0x000078cd, 0x000080cc, + 0x000080cb, 0x000080ca, 0x000080c9, 0x000080c7, + 0x000080c6, 0x000077c5, 0x000076c3, 0x000080bc, + 0x000080ba, 0x000075b9, 0x000080b6, 0x000074b5, + 0x000073b4, 0x000072b3, 0x000080b2, 0x000080b1, + 0x000080ae, 0x000071ad, 0x000080ac, 0x000070ab, + 0x00006faa, 0x00006ea9, 0x000080a7, 0x00006da6, + 0x00006ca5, 0x00006ba3, 0x00006a9f, 0x0000699e, + 0x0000689d, 0x0000809b, 0x00008098, 0x00006797, + 0x00006690, 0x0000658f, 0x00006488, 0x00006384, + 0x00006282, 0x00008081, 0x00008080, 0x0000617c, + 0x0000607a, 0x00008079, 0x00005f76, 0x00008075, + 0x00008074, 0x00008073, 0x00008072, 0x00008071, + 0x0000806e, 0x00005e6d, 0x0000806c, 0x00005d6b, + 0x00005c6a, 0x00005b69, 0x00008067, 0x00005a66, + 0x00005965, 0x00005863, 0x0000575c, 0x0000565a, + 0x00005559, 0x00008056, 0x00008055, 0x00005454, + 0x00005353, 0x00005252, 0x00005151, 0x0000504e, + 0x00004f4d, 0x0000804c, 0x0000804b, 0x00004e4a, + 0x00004d49, 0x00008047, 0x00004c46, 0x00008045, + 0x00008043, 0x0000803c, 0x0000803a, 0x00008039, + 0x00008036, 0x00004b35, 0x00008034, 0x00004a33, + 0x00004932, 0x00004831, 0x0000802e, 0x0000472d, + 0x0000462c, 0x0000452b, 0x0000442a, 0x00004329, + 0x00004227, 0x00008026, 0x00008025, 0x00004123, + 0x0000401f, 0x00003f1e, 0x00003e1d, 0x00003d1b, + 0x00003c18, 0x00008017, 0x00008010, 0x00003b0f, + 0x00003a08, 0x00008004, 0x00003902, 0x00008001, + 0x00008000, 0x00008000, 0x00003800, 0x00003700, + 0x00003600, 0x00008000, 0x00003500, 0x00008000, + 0x00008000, 0x00008000, 0x00003400, 0x00008000, + 0x00008000, 0x00008000, 0x00008000, 0x00008000, + 0x00008000, 0x00003300, 0x00003200, 0x00008000, + 0x00008000, 0x00008000, 0x00008000, 0x00008000, + 0x00008000, 0x00003100, 0x00003000, 0x00008000, + 0x00008000, 0x00002f00, 0x00008000, 0x00002e00, + 0x00002d00, 0x00002c00, 0x00008000, 0x00008000, + 0x00008000, 0x00002b00, 0x00008000, 0x00002a00, + 0x00002900, 0x00002800, 0x00008000, 0x00002700, + 0x00002600, 0x00002500, 0x00002400, 0x00002300, + 0x00002200, 0x00008000, 0x00008000, 0x00002100, + 0x00002000, 0x00001f00, 0x00001e00, 0x00001d00, + 0x00001c00, 0x00008000, 0x00008000, 0x00001b00, + 0x00001a00, 0x00008000, 0x00001900, 0x00008000, + 0x00008000, 0x00008000, 0x00008000, 0x00008000, + 0x00008000, 0x00001800, 0x00008000, 0x00001700, + 0x00001600, 0x00001500, 0x00008000, 0x00001400, + 0x00001300, 0x00001200, 0x00001100, 0x00001000, + 0x00000f00, 0x00008000, 0x00008000, 0x00000e00, + 0x00000d00, 0x00000c00, 0x00000b00, 0x00000a00, + 0x00000900, 0x00008000, 0x00008000, 0x00000800, + 0x00000700, 0x00008000, 0x00000600, 0x00008000, + 0x00008000, 0x00008000, 0x00000500, 0x00000400, + 0x00000300, 0x00008000, 0x00000200, 0x00008000, + 0x00008000, 0x00008000, 0x00000100, 0x00008000, + 0x00008000, 0x00008000, 0x00008000, 0x00008000, + 0x00008000, 0x00000000, 0x00008000, 0x00008000, + 0x00008000, 0x00008000, 0x00008000, 0x00008000, + 0x00008000, 0x00008000, 0x00008000, 0x00008000, + 0x00008000, 0x00008000, 0x00008000, 0x00008000, + 0x00008000, 0x00008000, 0x0201f800, 0x001007d3, + 0x02000800, 0x001005d8, 0x492f4016, 0x1c01f000, + 0x83a0ac00, 0x00000006, 0x83a00580, 0x0010b4a4, + 0x0400000c, 0x492fc857, 0x812e59c0, 0x02000800, + 0x001005d8, 0x832ca400, 0x00000006, 0x4200b000, + 0x0000000d, 0x0201f800, 0x0010ab17, 0x0401f00f, + 0x4200b000, 0x00000010, 0x83e0a400, 0x00000020, + 0x50500000, 0x8050a000, 0x50500800, 0x900409c0, + 0x80040540, 0x4400a800, 0x8050a000, 0x8054a800, + 0x8058b040, 0x040207f7, 0x1c01f000, 0x59a00206, + 0x4803c857, 0x82000c80, 0x0000007f, 0x040210c9, + 0x59a80821, 0x0c01f001, 0x001022c0, 0x00102300, + 0x00102300, 0x0010234b, 0x0010236d, 0x00102300, + 0x001022c0, 0x0010238f, 0x001023a0, 0x00102300, + 0x00102300, 0x001023ad, 0x001023c5, 0x001023dd, + 0x00102300, 0x001023e7, 0x001023f4, 0x00102300, + 0x0010241d, 0x00102300, 0x0010247a, 0x00102300, + 0x00102300, 0x00102300, 0x00102300, 0x00102300, + 0x00102300, 0x00102300, 0x00102300, 0x00102300, + 0x00102300, 0x00102300, 0x00102491, 0x00102300, + 0x001024e3, 0x00102300, 0x00102300, 0x00102300, + 0x00102300, 0x001024e8, 0x00102560, 0x00102300, + 0x00102567, 0x00102300, 0x00102300, 0x00102300, + 0x00102300, 0x00102300, 0x00102569, 0x001025ea, + 0x00102727, 0x00102300, 0x00102300, 0x00102300, + 0x00102300, 0x00102300, 0x00102736, 0x00102300, + 0x00102300, 0x00102300, 0x00102300, 0x00102300, + 0x00102300, 0x00102300, 0x00102753, 0x001027a6, + 0x00102802, 0x00102816, 0x00102835, 0x00102a70, + 0x00102dff, 0x00102300, 0x00102300, 0x00102300, + 0x00102300, 0x00102300, 0x00102300, 0x00102300, + 0x00102300, 0x00102300, 0x00102300, 0x00102300, + 0x00102300, 0x00102fb4, 0x00103028, 0x00102300, + 0x00102300, 0x00103094, 0x00102300, 0x00103126, + 0x001031d8, 0x00102300, 0x00102300, 0x0010320f, + 0x0010326b, 0x00102300, 0x001032bd, 0x00103419, + 0x00102300, 0x0010342d, 0x001034b8, 0x00102300, + 0x00102300, 0x00102300, 0x00102300, 0x00103522, + 0x00103526, 0x00103545, 0x00102300, 0x001035e7, + 0x00102300, 0x00102300, 0x00103615, 0x00102300, + 0x00103643, 0x00102300, 0x00102300, 0x001036aa, + 0x001037b7, 0x00103814, 0x00102300, 0x0010387a, + 0x00102300, 0x00102300, 0x001038d3, 0x00103936, + 0x00102300, 0x48efc857, 0x4031d800, 0x58ef400b, + 0x58ec0002, 0x82000580, 0x00000200, 0x04000045, + 0x48efc857, 0x4a034206, 0x00004000, 0x0201f800, + 0x00103a15, 0x83a00580, 0x0010b4a4, 0x0400000d, + 0x58ee580a, 0x4d2c0000, 0x0401f856, 0x41a25800, + 0x0201f800, 0x001007f4, 0x40ee5800, 0x0201f800, + 0x001007f4, 0x5c025800, 0x0201f000, 0x000202da, + 0x04026007, 0x59a0001d, 0x84000542, 0x4803401d, + 0x4a01d809, 0x001022d4, 0x1c01f000, 0x59a00206, + 0x82000d80, 0x00004000, 0x04000006, 0x900001c0, + 0x82000540, 0x00000011, 0x4803c011, 0x0401f005, + 0x900001c0, 0x82000540, 0x00000010, 0x4803c011, + 0x0401f845, 0x59e00017, 0x8c000508, 0x0402000c, + 0x4203e000, 0x30000001, 0x4203e000, 0x40000000, + 0x40ee5800, 0x0201f800, 0x001007f4, 0x59a0001d, + 0x84000504, 0x4803401d, 0x1c01f000, 0x4a03c017, + 0x00000000, 0x59a00206, 0x82000d80, 0x00004000, + 0x040007f0, 0x4a03c017, 0x00000001, 0x0401f7ed, + 0x4803c856, 0x4a034206, 0x00004001, 0x0401f7c0, + 0x4803c856, 0x4a034206, 0x00004002, 0x0401f7bc, + 0x4803c856, 0x4a034206, 0x00004003, 0x0401f7b8, + 0x4803c856, 0x4a034206, 0x00004005, 0x0401f7b4, + 0x4803c856, 0x4a034206, 0x00004006, 0x0401f7b0, + 0x4803c856, 0x4a034206, 0x0000400b, 0x0401f7ac, + 0x4803c856, 0x4a034206, 0x0000400c, 0x0401f7a8, + 0x4803c856, 0x4a034206, 0x0000400c, 0x0401f7a4, + 0x48efc857, 0x58eca80a, 0x8054a9c0, 0x02000800, + 0x001005d8, 0x83a0a400, 0x00000006, 0x8254ac00, + 0x00000006, 0x4200b000, 0x0000000d, 0x0201f000, + 0x0010ab17, 0x59a00206, 0x4803c857, 0x59a00406, + 0x4803c857, 0x59a00207, 0x4803c857, 0x59a00407, + 0x4803c857, 0x59a00208, 0x4803c857, 0x59a00408, + 0x4803c857, 0x59a00209, 0x4803c857, 0x83e0ac00, + 0x00000020, 0x83a0a400, 0x00000006, 0x4200b000, + 0x00000010, 0x50500000, 0x4400a800, 0x8054a800, + 0x900001c0, 0x4400a800, 0x8054a800, 0x8050a000, + 0x8058b040, 0x040207f8, 0x1c01f000, 0x59a00406, + 0x800000c2, 0x59a00a07, 0x900409c0, 0x80040540, + 0x84000540, 0x59a00c07, 0x8c040d00, 0x04000018, + 0x59a80805, 0x8c040d0e, 0x040207ba, 0x42000800, + 0x00000064, 0x80040840, 0x04000007, 0x4a030000, + 0x00000001, 0x40000000, 0x59801000, 0x8c081500, + 0x040007f9, 0x04000005, 0x48030004, 0x4a030000, + 0x00000000, 0x0401f75b, 0x4a030000, 0x00000000, + 0x4a034406, 0x00000004, 0x040007a2, 0x4803880e, + 0x0401f754, 0x59a00406, 0x800000c2, 0x59a00c07, + 0x8c040d00, 0x0400001a, 0x59a80805, 0x8c040d0e, + 0x0402079c, 0x42000800, 0x00000064, 0x80040840, + 0x04000007, 0x4a030000, 0x00000001, 0x40000000, + 0x59801000, 0x8c081500, 0x040007f9, 0x04000007, + 0x48030004, 0x59800805, 0x48074406, 0x4a030000, + 0x00000000, 0x0401f73b, 0x4a030000, 0x00000000, + 0x4a034406, 0x00000004, 0x04000782, 0x4803880e, + 0x59c4080f, 0x48074406, 0x0401f732, 0x59a01c06, + 0x59a00207, 0x900c19c0, 0x800c1d40, 0x580c0803, + 0x80000580, 0x500c1000, 0x80080400, 0x800c1800, + 0x80040840, 0x040207fc, 0x48034406, 0x900001c0, + 0x48034207, 0x800001c0, 0x04000722, 0x0401f769, + 0x4a034406, 0x00000004, 0x4a034207, 0x00000000, + 0x4a034407, 0x00000010, 0x59a8000d, 0x48034208, + 0x900001c0, 0x48034408, 0x4a034209, 0x00000002, + 0x0401f714, 0x59a00407, 0x59a01207, 0x900811c0, + 0x80081540, 0x59a00409, 0x59a01a09, 0x900c19c0, + 0x800c1d40, 0x59a00a08, 0x59a00408, 0x900409c0, + 0x80040d40, 0x59a0020a, 0x82002480, 0x00000010, + 0x04001754, 0x59a02406, 0x900001c0, 0x80100540, + 0x59a8280d, 0x80142480, 0x0400174e, 0x0201f000, + 0x00103a25, 0x59a00407, 0x59a01207, 0x900811c0, + 0x80081540, 0x59a00409, 0x59a01a09, 0x900c19c0, + 0x800c1d40, 0x59a00a08, 0x59a00408, 0x900409c0, + 0x80040d40, 0x59a0020a, 0x82002480, 0x00000010, + 0x0400173c, 0x59a02406, 0x900001c0, 0x80100540, + 0x59a8280d, 0x80142480, 0x04001736, 0x0201f000, + 0x00103a28, 0x59a00a0a, 0x59a00406, 0x900409c0, + 0x80040d40, 0x59a01407, 0x59a00207, 0x900811c0, + 0x80081540, 0x44080800, 0x0401f6da, 0x59a00a0a, + 0x59a00406, 0x900409c0, 0x80040d40, 0x50040000, + 0x82000d00, 0x0000ffff, 0x48074207, 0x82000d00, + 0xffff0000, 0x900409c0, 0x48074407, 0x0401f6cd, + 0x59a00406, 0x8c000500, 0x04000020, 0x59a01207, + 0x59a01c07, 0x59a02208, 0x480b5054, 0x480f5055, + 0x48135056, 0x59c40801, 0x82040d00, 0x00018000, + 0x82040580, 0x00000000, 0x04000009, 0x82040580, + 0x00008000, 0x04000008, 0x82040580, 0x00010000, + 0x04000007, 0x0201f800, 0x001005d8, 0x40080000, + 0x0401f004, 0x400c0000, 0x0401f002, 0x40100000, + 0x80000110, 0x42000800, 0x000000e0, 0x0201f800, + 0x00101944, 0x0401f007, 0x59a81054, 0x59a81855, + 0x59a82056, 0x480b4207, 0x480f4407, 0x48134208, + 0x0401f6a4, 0x4d2c0000, 0x4d340000, 0x4d300000, + 0x4d440000, 0x59a28c06, 0x0201f800, 0x00020245, + 0x04000006, 0x5c028800, 0x5c026000, 0x5c026800, + 0x5c025800, 0x0401f6e7, 0x59a04407, 0x59a00207, + 0x900001c0, 0x80204540, 0x0401f81e, 0x04000009, + 0x4a034208, 0x00000001, 0x4a034406, 0x0000ffff, + 0x4a034207, 0x0000ffff, 0x497b4407, 0x0401f00b, + 0x0401f822, 0x0400000e, 0x4a034208, 0x00000002, + 0x59300402, 0x48034406, 0x59300202, 0x48034207, + 0x59300206, 0x48034407, 0x5c028800, 0x5c026000, + 0x5c026800, 0x5c025800, 0x0401f67a, 0x5c028800, + 0x5c026000, 0x5c026800, 0x5c025800, 0x0401f6c1, + 0x4937c856, 0x4823c856, 0x4d2c0000, 0x5934000f, + 0x80025d40, 0x04000007, 0x592c0005, 0x80200580, + 0x592c0000, 0x040207fb, 0x82000540, 0x00000001, + 0x5c025800, 0x1c01f000, 0x4823c857, 0x4d2c0000, + 0x4d300000, 0x42026000, 0x0010d1c0, 0x59300406, + 0x82000d80, 0x00000003, 0x04000004, 0x82000d80, + 0x00000006, 0x04020007, 0x59325808, 0x812e59c0, + 0x04000004, 0x592c0005, 0x80200580, 0x0400000a, + 0x83326400, 0x00000024, 0x41580000, 0x81300480, + 0x040017ef, 0x80000580, 0x5c026000, 0x5c025800, + 0x1c01f000, 0x82000540, 0x00000001, 0x5c026000, + 0x5c025800, 0x1c01f000, 0x83a00580, 0x0010b4a4, + 0x04020684, 0x59a80005, 0x8c00050e, 0x04020003, + 0x4a030000, 0x00000000, 0x4a034206, 0x00004000, + 0x4a03c011, 0x40000010, 0x0401fea7, 0x59e00017, + 0x8c000508, 0x04000003, 0x4a03c017, 0x00000000, + 0x4203e000, 0x30000001, 0x4203e000, 0x40000000, + 0x0401f000, 0x800409c0, 0x04000004, 0x4a034406, + 0x00000001, 0x0401f677, 0x836c0580, 0x00000003, + 0x04020010, 0x59a80010, 0x497b4406, 0x0201f800, + 0x0010513b, 0x0400000f, 0x82000d00, 0x00ffff00, + 0x0402000c, 0x82000c00, 0x0010210e, 0x50040800, + 0x80040910, 0x82041580, 0x00000080, 0x04020004, + 0x4a034406, 0x00000007, 0x0401f662, 0x48074406, + 0x82000d00, 0x0000ffff, 0x48074207, 0x80000120, + 0x48034407, 0x59a80026, 0x82001500, 0x00000100, + 0x480b4409, 0x8c000502, 0x0400001f, 0x8c000506, + 0x04000009, 0x82000d00, 0x0000000a, 0x82040d80, + 0x0000000a, 0x04020004, 0x4a034209, 0x00000001, + 0x0401f022, 0x8c00050a, 0x04000009, 0x82000d00, + 0x00000022, 0x82040d80, 0x00000022, 0x04020004, + 0x4a034209, 0x00000003, 0x0401f018, 0x8c000508, + 0x04000009, 0x82000d00, 0x00000012, 0x82040d80, + 0x00000012, 0x04020004, 0x4a034209, 0x00000002, + 0x0401f00e, 0x0201f800, 0x0010513b, 0x04020004, + 0x4a034209, 0x00000004, 0x0401f5e6, 0x8c000506, + 0x04000004, 0x4a034406, 0x00000005, 0x0401f62d, + 0x4a034209, 0x00000000, 0x0401f5de, 0x59a80037, + 0x48034407, 0x59a80038, 0x48034209, 0x0401f5d9, + 0x42007800, 0x0010b8ec, 0x59a00406, 0x4803c857, + 0x82000c80, 0x00000006, 0x04021622, 0x0c01f001, + 0x001024f6, 0x001024f7, 0x00102505, 0x00102518, + 0x00102539, 0x001024f6, 0x0401f61a, 0x836c0580, + 0x00000000, 0x04000613, 0x59a00a07, 0x59a00407, + 0x900001c0, 0x80040d40, 0x4807c857, 0x59a00a08, + 0x59a00408, 0x900001c0, 0x80040d40, 0x4807c857, + 0x0401f056, 0x836c0580, 0x00000000, 0x04000605, + 0x59a00407, 0x59a01207, 0x900001c0, 0x80081540, + 0x59a00408, 0x59a01a08, 0x900001c0, 0x800c1d40, + 0x42000000, 0x0010c1bf, 0x480fc857, 0x480bc857, + 0x42000800, 0x00001000, 0x0201f000, 0x00103a28, + 0x59a00a07, 0x59a00407, 0x900001c0, 0x80041d40, + 0x820c0c80, 0x0010ab4a, 0x040215f2, 0x820c0c80, + 0x00100000, 0x040015ef, 0x480fc857, 0x823c7c00, + 0x00000009, 0x503c0800, 0x800409c0, 0x04000006, + 0x823c0580, 0x0000000d, 0x040005e6, 0x803c7800, + 0x0401f7f9, 0x59e41001, 0x82080d00, 0xfffeffcf, + 0x4807c801, 0x440c7800, 0x46001800, 0x0201f800, + 0x800c1800, 0x46001800, 0x001005cb, 0x480bc801, + 0x0401f022, 0x59a01a07, 0x59a00407, 0x900001c0, + 0x800c1d40, 0x480c7801, 0x59a02208, 0x59a00408, + 0x900001c0, 0x80102540, 0x48107802, 0x59a00209, + 0x80000040, 0x040015cb, 0x48007806, 0x80000000, + 0x48007805, 0x42000800, 0x00004000, 0x40001000, + 0x0201f800, 0x00106681, 0x80000540, 0x04000003, + 0x49787801, 0x0401f5bf, 0x40040000, 0x800c1c00, + 0x040015bc, 0x480c7803, 0x48107804, 0x49787808, + 0x59a00409, 0x48007807, 0x59e40001, 0x4803c857, + 0x82000540, 0x00040000, 0x4803c801, 0x0401f561, + 0x59a80006, 0x48034406, 0x59a80007, 0x48034207, + 0x59a80008, 0x48034407, 0x0401f55a, 0x0201f800, + 0x001005d8, 0x4803c856, 0x4a03c013, 0x03800300, + 0x4a03c014, 0x03800380, 0x59a00c06, 0x82040580, + 0x000000a0, 0x04000004, 0x82040580, 0x000000a2, + 0x0402002b, 0x59a0140a, 0x82080480, 0x00000100, + 0x04021027, 0x59a0020b, 0x8c000500, 0x0402002e, + 0x59a00a0a, 0x800409c0, 0x04000021, 0x82040480, + 0x00000041, 0x0402101e, 0x82040c00, 0x00000003, + 0x82040d00, 0x000000fc, 0x80040904, 0x59a00407, + 0x59a01207, 0x900811c0, 0x80081540, 0x59a00409, + 0x59a01a09, 0x900c19c0, 0x800c1d40, 0x0201f800, + 0x00103a00, 0x04020006, 0x4a034406, 0x00000002, + 0x4a03c014, 0x03800000, 0x0401f576, 0x832e5c00, + 0x00000004, 0x412c0000, 0x0201f800, 0x00103a25, + 0x4a01d809, 0x001025a2, 0x1c01f000, 0x4a03c014, + 0x03800000, 0x0401f56f, 0x4031d800, 0x58ef400b, + 0x58ee580d, 0x58ec0002, 0x82000580, 0x00000200, + 0x0400055c, 0x59a00c06, 0x59a0140a, 0x59a0020b, + 0x8c000500, 0x04020031, 0x832e5c00, 0x00000004, + 0x41783800, 0x59a04a0a, 0x401c0000, 0x812c0400, + 0x50004000, 0x82201d00, 0x000000ff, 0x4c040000, + 0x0401f8ac, 0x5c000800, 0x0400002d, 0x80244840, + 0x04000028, 0x80081000, 0x82201d00, 0x0000ff00, + 0x800c1910, 0x4c040000, 0x0401f8a2, 0x5c000800, + 0x04000023, 0x80244840, 0x0400001e, 0x80081000, + 0x82201d00, 0x00ff0000, 0x800c1920, 0x4c040000, + 0x0401f898, 0x5c000800, 0x04000019, 0x80244840, + 0x04000014, 0x80081000, 0x82201d00, 0xff000000, + 0x800c1930, 0x4c040000, 0x0401f88e, 0x5c000800, + 0x0400000f, 0x80244840, 0x0400000a, 0x80081000, + 0x801c3800, 0x0401f7d5, 0x59a0020a, 0x82000500, + 0x000000ff, 0x40001800, 0x0401f882, 0x04000004, + 0x4a03c014, 0x03800000, 0x0401f4da, 0x4a03c014, + 0x03800000, 0x0401f523, 0x4803c856, 0x4a03c013, + 0x03800300, 0x4a03c014, 0x03800380, 0x59a00c06, + 0x82040580, 0x000000a0, 0x04000004, 0x82040580, + 0x000000a2, 0x0402006c, 0x59a0140a, 0x82080480, + 0x00000100, 0x04021068, 0x59a0020b, 0x8c000500, + 0x0402005c, 0x59a01a0a, 0x800c19c0, 0x04000062, + 0x820c0480, 0x00000041, 0x0402105f, 0x0201f800, + 0x00103a00, 0x04020006, 0x4a034406, 0x00000002, + 0x4a03c014, 0x03800000, 0x0401f502, 0x832e5c00, + 0x00000004, 0x41783800, 0x59a04a0a, 0x401c0000, + 0x812c0400, 0x40004000, 0x4c040000, 0x4c080000, + 0x0401f874, 0x5c001000, 0x5c000800, 0x04000047, + 0x44144000, 0x80244840, 0x0400002b, 0x80081000, + 0x4c040000, 0x4c080000, 0x0401f86a, 0x5c001000, + 0x5c000800, 0x0400003d, 0x50200000, 0x801428d0, + 0x80140540, 0x44004000, 0x80244840, 0x0400001e, + 0x80081000, 0x4c040000, 0x4c080000, 0x0401f85d, + 0x5c001000, 0x5c000800, 0x04000030, 0x50200000, + 0x801428e0, 0x80140540, 0x44004000, 0x80244840, + 0x04000011, 0x80081000, 0x4c040000, 0x4c080000, + 0x0401f850, 0x5c001000, 0x5c000800, 0x04000023, + 0x50200000, 0x801428f0, 0x80140540, 0x44004000, + 0x80244840, 0x04000004, 0x80081000, 0x801c3800, + 0x0401f7cb, 0x59a00a0a, 0x82040c00, 0x00000003, + 0x82040d00, 0x000000fc, 0x80040904, 0x59a00407, + 0x59a01207, 0x900811c0, 0x80081540, 0x59a00409, + 0x59a01a09, 0x900c19c0, 0x800c1d40, 0x4a03c014, + 0x03800000, 0x412c0000, 0x0201f000, 0x00103a28, + 0x0401f830, 0x04000005, 0x48174406, 0x4a03c014, + 0x03800000, 0x0401f463, 0x4a03c014, 0x03800000, + 0x0401f4ac, 0x4a03c014, 0x03800000, 0x0401f4ad, + 0x0401f836, 0x04000010, 0x0401f862, 0x0402000f, + 0x40080800, 0x0401f85f, 0x0402000c, 0x400c0800, + 0x0401f85c, 0x04020009, 0x0401f84b, 0x42000000, + 0x00030d40, 0x80000040, 0x040207ff, 0x82000540, + 0x00000001, 0x1c01f000, 0x0401f843, 0x80000580, + 0x0401f7fd, 0x0401f821, 0x0400000a, 0x82040d40, + 0x00000001, 0x0401f84b, 0x04020007, 0x0401f87e, + 0x0401f898, 0x0401f838, 0x82000540, 0x00000001, + 0x1c01f000, 0x0401f834, 0x80000580, 0x0401f7fd, + 0x40041800, 0x0401f811, 0x0400000c, 0x0401f83d, + 0x0402000b, 0x40080800, 0x0401f83a, 0x04020008, + 0x400c0800, 0x0401ffe8, 0x04000004, 0x0401f826, + 0x82000540, 0x00000001, 0x1c01f000, 0x0401f822, + 0x80000580, 0x0401f7fd, 0x4c040000, 0x42000800, + 0x00000064, 0x4a03c013, 0x03800300, 0x80040840, + 0x04000016, 0x59e00013, 0x82000500, 0x00000300, + 0x82000580, 0x00000300, 0x040207f7, 0x42000000, + 0x00000064, 0x80000040, 0x040207ff, 0x4a03c013, + 0x01000000, 0x42000000, 0x00000064, 0x80000040, + 0x040207ff, 0x4a03c013, 0x02000000, 0x82000540, + 0x00000001, 0x0401f002, 0x80000580, 0x5c000800, + 0x1c01f000, 0x4a03c013, 0x01000000, 0x42000000, + 0x00000064, 0x80000040, 0x040207ff, 0x4a03c013, + 0x02000200, 0x42000000, 0x00000064, 0x80000040, + 0x040207ff, 0x4a03c013, 0x01000100, 0x1c01f000, + 0x42002000, 0x00000008, 0x82040500, 0x00000080, + 0x800000c2, 0x82000540, 0x01000000, 0x4803c013, + 0x42000000, 0x00000064, 0x80000040, 0x040207ff, + 0x4a03c013, 0x02000200, 0x42000000, 0x00000064, + 0x80000040, 0x040207ff, 0x4a03c013, 0x02000000, + 0x800408c2, 0x80102040, 0x040207ec, 0x4a03c013, + 0x01000100, 0x42000000, 0x00000064, 0x80000040, + 0x040207ff, 0x4a03c013, 0x02000200, 0x42000000, + 0x00000064, 0x80000040, 0x040207ff, 0x59e00013, + 0x82000500, 0x00000100, 0x4a03c013, 0x02000000, + 0x4c040000, 0x42000800, 0x00000064, 0x59e00013, + 0x82000500, 0x00000100, 0x80040840, 0x04000003, + 0x80000540, 0x040207fa, 0x80000540, 0x5c000800, + 0x1c01f000, 0x4a03c013, 0x01000100, 0x42001000, + 0x00000008, 0x80000d80, 0x42000000, 0x00000064, + 0x80000040, 0x040207ff, 0x4a03c013, 0x02000200, + 0x42000000, 0x00000064, 0x80000040, 0x040207ff, + 0x59e00013, 0x82000500, 0x00000100, 0x80000110, + 0x800408c2, 0x80040d40, 0x4a03c013, 0x02000000, + 0x80081040, 0x040207ed, 0x40042800, 0x1c01f000, + 0x4a03c013, 0x01000100, 0x42000000, 0x00000064, + 0x80000040, 0x040207ff, 0x4a03c013, 0x02000200, + 0x42000000, 0x00000064, 0x80000040, 0x040207ff, + 0x4a03c013, 0x02000000, 0x1c01f000, 0x59a00407, + 0x59a80837, 0x48035037, 0x48074407, 0x59a00a09, + 0x82040480, 0x00000014, 0x04021003, 0x42000800, + 0x000007d0, 0x59a80038, 0x48075038, 0x48034209, + 0x0201f000, 0x001022c0, 0x836c0580, 0x00000000, + 0x0400000e, 0x59a80006, 0x59a00c06, 0x80041580, + 0x82081500, 0x00000040, 0x02000000, 0x001022c0, + 0x80080580, 0x48035006, 0x0201f800, 0x00100699, + 0x0201f000, 0x001022c0, 0x59a00406, 0x59a80806, + 0x48035006, 0x80040d80, 0x8c040d0c, 0x02020800, + 0x00100699, 0x59a00207, 0x48035007, 0x59a00407, + 0x48035008, 0x0201f000, 0x001022c0, 0x800409c0, + 0x04000005, 0x4a034406, 0x00000001, 0x0201f000, + 0x0010230c, 0x0201f800, 0x0010513b, 0x04020005, + 0x4a034406, 0x00000016, 0x0201f000, 0x0010230c, + 0x836c0580, 0x00000003, 0x04000005, 0x4a034406, + 0x00000007, 0x0201f000, 0x0010230c, 0x59a00c06, + 0x82040500, 0xffffff00, 0x02020000, 0x00102310, + 0x82041580, 0x000000ff, 0x04020007, 0x59a80010, + 0x82000500, 0x000000ff, 0x82001540, 0x0000ff00, + 0x0401f011, 0x82040400, 0x0010210e, 0x50000000, + 0x80000110, 0x82000580, 0x00000080, 0x02000000, + 0x00102310, 0x59a80010, 0x82000500, 0x000000ff, + 0x80041580, 0x02000000, 0x00102310, 0x840409c0, + 0x80041540, 0x0201f800, 0x0002075a, 0x04020005, + 0x4a034406, 0x00000003, 0x0201f000, 0x0010230c, + 0x48ee6021, 0x480a621c, 0x4a02641c, 0x0000bc09, + 0x4a026406, 0x00000001, 0x0201f800, 0x00103a00, + 0x04020007, 0x0201f800, 0x0002077d, 0x4a034406, + 0x00000002, 0x0201f000, 0x0010230c, 0x497a5a04, + 0x497a5805, 0x4a025c04, 0x00008000, 0x4a01d809, + 0x001027f9, 0x492e6008, 0x42027000, 0x00000032, + 0x0201f000, 0x000207a1, 0x800409c0, 0x04000005, + 0x4a034406, 0x00000001, 0x0201f000, 0x0010230c, + 0x0201f800, 0x0010513b, 0x04020005, 0x4a034406, + 0x00000016, 0x0201f000, 0x0010230c, 0x836c0580, + 0x00000003, 0x04000005, 0x4a034406, 0x00000007, + 0x0201f000, 0x0010230c, 0x59a00c06, 0x82040500, + 0xffffff00, 0x02020000, 0x00102310, 0x82041580, + 0x000000ff, 0x04020007, 0x59a80010, 0x82000500, + 0x000000ff, 0x82001540, 0x0000ff00, 0x0401f011, + 0x82040400, 0x0010210e, 0x50000000, 0x80000110, + 0x82000580, 0x00000080, 0x02000000, 0x00102310, + 0x59a80010, 0x82000500, 0x000000ff, 0x80041580, + 0x02000000, 0x00102310, 0x840409c0, 0x80041540, + 0x0201f800, 0x0002075a, 0x04020005, 0x4a034406, + 0x00000003, 0x0201f000, 0x0010230c, 0x48ee6021, + 0x480a621c, 0x4a02641c, 0x0000bc05, 0x4a026406, + 0x00000001, 0x0201f800, 0x00103a00, 0x04020007, + 0x0201f800, 0x0002077d, 0x4a034406, 0x00000002, + 0x0201f000, 0x0010230c, 0x497a5a04, 0x497a5805, + 0x4a025c04, 0x00008000, 0x4a01d809, 0x001027f9, + 0x492e6008, 0x42027000, 0x00000032, 0x0201f000, + 0x000207a1, 0x592c0005, 0x82000580, 0x01000000, + 0x02020000, 0x001022c0, 0x4a034406, 0x00000004, + 0x0201f000, 0x0010230c, 0x497b4406, 0x497b4207, + 0x0201f800, 0x00103b25, 0x04000008, 0x59a80066, + 0x59a8086a, 0x80040480, 0x59a80867, 0x48074406, + 0x80041480, 0x480b4207, 0x49674407, 0x59a8000e, + 0x48034209, 0x495f4409, 0x59a80020, 0x4803420b, + 0x0201f000, 0x001022c0, 0x800409c0, 0x04000005, + 0x4a034406, 0x00000001, 0x0201f000, 0x0010230c, + 0x59a00406, 0x8c000500, 0x0402000f, 0x59a80069, + 0x81640480, 0x04001008, 0x59a8000b, 0x81500580, + 0x04000009, 0x59a8006a, 0x59a81066, 0x80080580, + 0x04000005, 0x4a034406, 0x00000018, 0x0201f000, + 0x0010230c, 0x82000540, 0x00000001, 0x0201f800, + 0x001015fe, 0x0201f800, 0x00103c80, 0x0201f000, + 0x001022c0, 0x4803c856, 0x800409c0, 0x02020000, + 0x00102314, 0x59a00406, 0x8c00051e, 0x04000008, + 0x4803c856, 0x59a0020b, 0x82000480, 0x00000800, + 0x04001015, 0x0201f000, 0x00102310, 0x4803c856, + 0x59a0020b, 0x599c0a01, 0x80040480, 0x04021003, + 0x0201f000, 0x00102310, 0x59a8000e, 0x81640580, + 0x04000009, 0x4a034406, 0x00000018, 0x0201f000, + 0x0010230c, 0x4a034406, 0x00000005, 0x0201f000, + 0x0010230c, 0x59a80026, 0x8c00050a, 0x040007fa, + 0x59a00406, 0x8c00051e, 0x04000036, 0x0201f800, + 0x0002075a, 0x040007f4, 0x0201f800, 0x00103a00, + 0x040007f1, 0x497a5a04, 0x59a00406, 0x4802620a, + 0x59a00209, 0x4802640a, 0x59a00409, 0x4802620b, + 0x59a0020d, 0x4802620c, 0x59a0040d, 0x4802640c, + 0x59a0020e, 0x4802620d, 0x59a0040e, 0x4802640d, + 0x59a00210, 0x4802620e, 0x59a00410, 0x4802640e, + 0x59a0020b, 0x82000500, 0x0000fffc, 0x80000104, + 0x4802640b, 0x0401f9d9, 0x040007d7, 0x48ee6021, + 0x58ee580d, 0x5930020e, 0x59301c0e, 0x900c19c0, + 0x800c1d40, 0x5930020c, 0x5930140c, 0x900811c0, + 0x80081540, 0x592c0a05, 0x832c0400, 0x00000006, + 0x0201f800, 0x00103a25, 0x4a01d809, 0x001029e5, + 0x4a034000, 0x00000001, 0x49334001, 0x1c01f000, + 0x0201f800, 0x00106c55, 0x0201f800, 0x00100ae0, + 0x0401f86d, 0x497b5057, 0x4201d000, 0x00002710, + 0x0201f800, 0x001060c6, 0x59c40880, 0x4c040000, + 0x59c408a3, 0x4c040000, 0x497b4002, 0x0401f876, + 0x0401f893, 0x4a03a005, 0x10000000, 0x0401f8b4, + 0x0401f901, 0x04000048, 0x59c80001, 0x800001c0, + 0x040007fc, 0x59c80018, 0x82000500, 0xf0000000, + 0x59c00808, 0x82040d00, 0x0fffffff, 0x80040540, + 0x48038008, 0x0201f800, 0x00100ec1, 0x59c00006, + 0x4a038006, 0x10000000, 0x59c00009, 0x82000d00, + 0x00e00000, 0x04020024, 0x4a03900d, 0x00000000, + 0x59c80020, 0x82000500, 0xff000000, 0x82000580, + 0x32000000, 0x0402001c, 0x4a03900d, 0x00000001, + 0x59c80020, 0x82000500, 0xff000000, 0x82000580, + 0xe1000000, 0x04020014, 0x4a03900d, 0x00000000, + 0x59c80020, 0x82000500, 0x00ffffff, 0x4a03900d, + 0x00000000, 0x59c80821, 0x82040d00, 0x00ffffff, + 0x80040580, 0x04020008, 0x59a80010, 0x80040580, + 0x04020005, 0x59c40005, 0x82000500, 0x000000f0, + 0x04000006, 0x4803c856, 0x0401f8d7, 0x4a035057, + 0x00000001, 0x0401f002, 0x0401f8e1, 0x42000000, + 0x00000064, 0x80000040, 0x02000800, 0x001005d8, + 0x59c00807, 0x82040d00, 0x0000000c, 0x040007fa, + 0x0401f003, 0x4a035057, 0x00000001, 0x0401f8da, + 0x0201f800, 0x00106f36, 0x0401f818, 0x4201d000, + 0x000186a0, 0x0201f800, 0x001060c6, 0x5c000800, + 0x480788a3, 0x5c000800, 0x48078880, 0x59a80057, + 0x800001c0, 0x02000000, 0x001022c0, 0x0201f000, + 0x00102318, 0x599c0201, 0x48035059, 0x41780800, + 0x42001000, 0x00003b10, 0x0201f800, 0x001066a0, + 0x480b505a, 0x1c01f000, 0x0201f800, 0x00106c4b, + 0x59b800ea, 0x82000500, 0x00000007, 0x82000580, + 0x00000003, 0x04020003, 0x4a0370e8, 0x00000001, + 0x1c01f000, 0x42038000, 0x00007700, 0x4a038006, + 0x30000000, 0x59c00007, 0x8c00050a, 0x040207fe, + 0x59c00006, 0x59a00209, 0x59a00c09, 0x900409c0, + 0x80040d40, 0x48078001, 0x59a0020e, 0x59a00c0e, + 0x900409c0, 0x80040d40, 0x48078000, 0x59a0020b, + 0x82000500, 0x0000fffc, 0x48038002, 0x48038003, + 0x48038005, 0x497b9009, 0x59e00003, 0x82000540, + 0x00008060, 0x4803c003, 0x1c01f000, 0x41780800, + 0x8007a0ca, 0x83d3a400, 0x00007600, 0x42000800, + 0x00000040, 0x0201f800, 0x00101345, 0x4a03a00a, + 0x00000001, 0x4a03a005, 0x20000000, 0x59d00006, + 0x4a03a005, 0x30000000, 0x59d00006, 0x8c00050a, + 0x040207fe, 0x59d00005, 0x59a00210, 0x59a00c10, + 0x900409c0, 0x80040d40, 0x4807a001, 0x59a0020d, + 0x59a00c0d, 0x900409c0, 0x80040d40, 0x4807a000, + 0x59a0020b, 0x82000500, 0x0000fffc, 0x4803a003, + 0x4803a002, 0x4803a008, 0x1c01f000, 0x59a00002, + 0x4803c857, 0x800001c0, 0x0402004a, 0x59a8005a, + 0x48038880, 0x59c400a3, 0x82000540, 0x00002008, + 0x8400053a, 0x480388a3, 0x59c40008, 0x8400054e, + 0x82000500, 0xffffffe1, 0x48038808, 0x59c80040, + 0x84000534, 0x48039040, 0x0401f902, 0x04020013, + 0x59a80010, 0x800000d0, 0x82000540, 0x00000011, + 0x48039120, 0x59a80010, 0x82000500, 0x00ffffff, + 0x82000540, 0x32000000, 0x48039121, 0x4a039123, + 0xe1290008, 0x59a80010, 0x82000500, 0x00ffffff, + 0x48039122, 0x0401f016, 0x59a80010, 0x82000500, + 0x000000ff, 0x900009c0, 0x840001c0, 0x80040540, + 0x82000540, 0x00000000, 0x48039120, 0x59a80010, + 0x82000500, 0x000000ff, 0x82000540, 0x01000000, + 0x48039121, 0x4a039123, 0x08210008, 0x59a80010, + 0x82000500, 0x000000ff, 0x48039122, 0x497b9124, + 0x59a80c5b, 0x80040800, 0x4807545b, 0x900409c0, + 0x82040540, 0x0000aaaa, 0x48039125, 0x497b9126, + 0x497b9127, 0x0401f8cf, 0x04020004, 0x4a039100, + 0x0000e980, 0x0401f003, 0x4a039100, 0x0000e9a0, + 0x1c01f000, 0x82000540, 0x00000001, 0x0402500d, + 0x4203e000, 0x80000000, 0x40e81000, 0x41780800, + 0x42000000, 0x00000064, 0x0201f800, 0x001066a0, + 0x59940024, 0x80080400, 0x48032824, 0x80000580, + 0x1c01f000, 0x4d900000, 0x4dd00000, 0x4da40000, + 0x4d140000, 0x417a3000, 0x0201f800, 0x001070d8, + 0x0201f800, 0x00106dc3, 0x5c022800, 0x5c034800, + 0x5c03a000, 0x5c032000, 0x1c01f000, 0x59c80007, + 0x8c000500, 0x04000003, 0x4a03900d, 0x00000030, + 0x1c01f000, 0x4a038805, 0x00020000, 0x42000800, + 0x0000003c, 0x0201f800, 0x00101345, 0x4a038891, + 0x0000ffff, 0x59c80035, 0x48039035, 0x4a03900d, + 0x00000040, 0x42038000, 0x00007700, 0x0201f800, + 0x00100ec1, 0x42038000, 0x00007720, 0x0201f800, + 0x00100ec1, 0x4a03a005, 0x20000000, 0x4a03a005, + 0x30000000, 0x59d00806, 0x8c040d0a, 0x040207fe, + 0x1c01f000, 0x4d300000, 0x4031d800, 0x58ef400b, + 0x58ee580d, 0x58ec0002, 0x82000580, 0x00000200, + 0x5c026000, 0x02000000, 0x00102304, 0x4d300000, + 0x59a26001, 0x59a00000, 0x4000b000, 0x80000000, + 0x48034000, 0x592c0001, 0x80000540, 0x0400001e, + 0x40025800, 0x8058b040, 0x040207fb, 0x58ec1007, + 0x58ec1808, 0x592c0a05, 0x4d2c0000, 0x58ec000d, + 0x40025800, 0x592c0204, 0x5c025800, 0x82000580, + 0x00000103, 0x04000008, 0x832c0400, 0x00000006, + 0x0201f800, 0x00103a25, 0x4a01d809, 0x001029e5, + 0x0401f007, 0x832c0400, 0x00000006, 0x0201f800, + 0x00103a28, 0x4a01d809, 0x001029e5, 0x5c026000, + 0x1c01f000, 0x58ec000d, 0x40025800, 0x592c0204, + 0x82000580, 0x00000103, 0x04020006, 0x0201f800, + 0x0002077d, 0x5c026000, 0x0201f000, 0x001022c0, + 0x58ec000d, 0x40025800, 0x592c0404, 0x8400055e, + 0x48025c04, 0x42028800, 0x000007fd, 0x42003000, + 0x00fffffd, 0x0201f800, 0x001045a6, 0x04000003, + 0x80000580, 0x0401f004, 0x59a26001, 0x0201f800, + 0x0010937d, 0x5c026000, 0x02000000, 0x0010230c, + 0x4d300000, 0x4a01d809, 0x00102a38, 0x0401f7dc, + 0x592c0005, 0x82000580, 0x01000000, 0x02000000, + 0x00102318, 0x4d300000, 0x59a26001, 0x5930020b, + 0x59301c0a, 0x900001c0, 0x800c1d40, 0x5930040d, + 0x5930120d, 0x900001c0, 0x80081540, 0x592c0a05, + 0x832c0400, 0x00000006, 0x0201f800, 0x00103a28, + 0x4a01d809, 0x001029e5, 0x4a034000, 0x00000001, + 0x5c026000, 0x1c01f000, 0x4933c857, 0x4c300000, + 0x5930040b, 0x82000c80, 0x0000000e, 0x04001004, + 0x4a025a05, 0x0000000e, 0x0401f003, 0x48025a05, + 0x0401f00c, 0x800409c0, 0x0400000a, 0x4c040000, + 0x0201f800, 0x00103a00, 0x5c000800, 0x04000003, + 0x40040000, 0x0401f7f0, 0x80000580, 0x0401f003, + 0x82000540, 0x00000001, 0x5c006000, 0x1c01f000, + 0x59a00206, 0x82000580, 0x00000044, 0x1c01f000, + 0x4807c857, 0x800409c0, 0x0400000c, 0x0201f800, + 0x00101650, 0x04020009, 0x42000000, 0x00000002, + 0x0201f800, 0x0010188c, 0x42000000, 0x00000002, + 0x0201f800, 0x00101821, 0x59a00406, 0x82000500, + 0x00000007, 0x0c01f001, 0x00102a8c, 0x00102aa1, + 0x00102ab7, 0x00102a8a, 0x00102a8a, 0x00102a8a, + 0x00102a8a, 0x00102a8a, 0x0201f000, 0x00102310, + 0x42000800, 0x000000c0, 0x0201f800, 0x0010193f, + 0x82040540, 0x00000002, 0x42000800, 0x000000c0, + 0x0201f800, 0x00101944, 0x42000800, 0x00000000, + 0x0201f800, 0x0010193f, 0x82040540, 0x00000008, + 0x42000800, 0x00000000, 0x0201f800, 0x00101944, + 0x0401f00b, 0x42000800, 0x000000c0, 0x0201f800, + 0x0010193f, 0x82040540, 0x00000001, 0x42000800, + 0x000000c0, 0x0201f800, 0x00101944, 0x59c80040, + 0x4c000000, 0x59a80010, 0x4c000000, 0x59c400a3, + 0x4c000000, 0x59c40008, 0x4c000000, 0x0401f911, + 0x04000021, 0x0201f800, 0x001005d8, 0x59a80821, + 0x800409c0, 0x02020000, 0x00102314, 0x0201f800, + 0x0010513b, 0x04020005, 0x4a034406, 0x00000016, + 0x0201f000, 0x0010230c, 0x836c0580, 0x00000003, + 0x02020000, 0x00102314, 0x59c408a4, 0x82040d00, + 0x0000000f, 0x82040580, 0x00000000, 0x02020000, + 0x00102314, 0x59c80040, 0x4c000000, 0x59a80010, + 0x4c000000, 0x59c400a3, 0x4c000000, 0x59c40008, + 0x4c000000, 0x59c40080, 0x4c000000, 0x59a0020f, + 0x59a0bc0f, 0x905cb9c0, 0x805cbd40, 0x41784800, + 0x41785000, 0x41785800, 0x41789000, 0x41789800, + 0x0401fe21, 0x0201f800, 0x00106c55, 0x0201f800, + 0x00100ae0, 0x4178c000, 0x497b4002, 0x0401f95c, + 0x0401f9aa, 0x59a0020c, 0x59a00c0c, 0x80040d40, + 0x04000002, 0x0401f9fb, 0x0401f9fa, 0x0401fe68, + 0x8060c1c0, 0x04020014, 0x0401fa98, 0x0401feb2, + 0x0402000e, 0x0201f800, 0x001018d3, 0x04020008, + 0x4a034406, 0x00000017, 0x0201f800, 0x0010230c, + 0x4203e000, 0x50000000, 0x0401f000, 0x42005800, + 0x0000aaaa, 0x0401f058, 0x59c80001, 0x800001c0, + 0x040007ee, 0x59c80801, 0x800409c0, 0x04000006, + 0x0401fa70, 0x40240000, 0x80280540, 0x802c0540, + 0x0402004d, 0x59a00002, 0x82000580, 0xfeedbeef, + 0x04000004, 0x42008800, 0x10000000, 0x0401f003, + 0x42008800, 0x10000004, 0x0401fa19, 0x4a034002, + 0xfeedbeef, 0x0401fa71, 0x0401fa97, 0x0401fea8, + 0x59c40005, 0x8c000534, 0x04000004, 0x42005800, + 0x0000bbbb, 0x0401f038, 0x0401fe83, 0x04020007, + 0x42005800, 0x0000cccc, 0x485f420f, 0x905cb9c0, + 0x485f440f, 0x0401f030, 0x59a0040c, 0x800001c0, + 0x0400000e, 0x59a26000, 0x5930000d, 0x800001c0, + 0x040207be, 0x59a26001, 0x5930080d, 0x800409c0, + 0x040207ba, 0x804891c0, 0x040207b8, 0x804c99c0, + 0x040207b6, 0x0401f87a, 0x805cb840, 0x04000005, + 0x40240000, 0x80280540, 0x802c0540, 0x0402001a, + 0x42000000, 0x00030d40, 0x80000040, 0x04020012, + 0x59c00007, 0x82000500, 0x000501c0, 0x0402000b, + 0x0201f800, 0x001018d3, 0x04020008, 0x4a034406, + 0x00000017, 0x0201f800, 0x0010230c, 0x4203e000, + 0x50000000, 0x0401f000, 0x42005800, 0x0000dddd, + 0x0401f005, 0x59c00807, 0x82040d00, 0x0000000c, + 0x040007ea, 0x0401fe5c, 0x59a0040c, 0x800001c0, + 0x04000002, 0x0401f856, 0x0401fe6b, 0x40240000, + 0x80280540, 0x802c0540, 0x04020003, 0x805cb9c0, + 0x04020781, 0x0201f800, 0x00106f36, 0x0401fda3, + 0x4201d000, 0x000186a0, 0x0201f800, 0x001060c6, + 0x5c000800, 0x48078880, 0x5c000800, 0x48078808, + 0x5c000800, 0x480788a3, 0x5c000800, 0x48075010, + 0x5c000800, 0x48079040, 0x0201f800, 0x00100969, + 0x59a00406, 0x82000500, 0x00000003, 0x82000580, + 0x00000002, 0x0400002c, 0x42000800, 0x000000c0, + 0x0201f800, 0x0010193f, 0x82040500, 0xfffffffc, + 0x42000800, 0x000000c0, 0x0201f800, 0x00101944, + 0x42000800, 0x00000000, 0x0201f800, 0x0010193f, + 0x82040500, 0xfffffff7, 0x42000800, 0x00000000, + 0x0201f800, 0x00101944, 0x42000800, 0x00000000, + 0x0201f800, 0x0010193f, 0x82040500, 0xfffffffb, + 0x42000800, 0x00000000, 0x0201f800, 0x00101944, + 0x4a0388a7, 0x0000f7f7, 0x42006000, 0xbeffffff, + 0x42006800, 0x80018000, 0x0201f800, 0x0010427d, + 0x42006000, 0xfffeffff, 0x41786800, 0x0201f800, + 0x0010427d, 0x402c0000, 0x80280540, 0x80240540, + 0x02000000, 0x001022c0, 0x48274406, 0x482b4207, + 0x482f4407, 0x0201f000, 0x0010231c, 0x59a26000, + 0x813261c0, 0x0400000e, 0x59325808, 0x812e59c0, + 0x0400000b, 0x0201f800, 0x0002077d, 0x0201f800, + 0x001007fd, 0x59a26001, 0x59325808, 0x0201f800, + 0x0002077d, 0x0201f800, 0x001007fd, 0x1c01f000, + 0x42000800, 0x000000ef, 0x0201f800, 0x001015eb, + 0x59c400a3, 0x8400055a, 0x8400053a, 0x480388a3, + 0x0201f800, 0x0010163b, 0x0402000a, 0x42000000, + 0x00000001, 0x0201f800, 0x0010188c, 0x42000000, + 0x00000001, 0x0201f800, 0x00101821, 0x0401f013, + 0x0201f800, 0x00101642, 0x04020008, 0x41780000, + 0x0201f800, 0x0010188c, 0x41780000, 0x0201f800, + 0x00101821, 0x0401f009, 0x42000000, 0x00000002, + 0x0201f800, 0x0010188c, 0x42000000, 0x00000002, + 0x0201f800, 0x00101821, 0x42000800, 0x00000000, + 0x0201f800, 0x0010193f, 0x82040540, 0x00000004, + 0x42000800, 0x00000000, 0x0201f800, 0x00101944, + 0x4201d000, 0x00000014, 0x0201f800, 0x0010608e, + 0x59c40008, 0x8400054e, 0x82000500, 0xffffffe1, + 0x48038808, 0x4a0388a7, 0x0000f7f7, 0x42001000, + 0x04000001, 0x0201f800, 0x0010193d, 0x42006000, + 0xbe20bfff, 0x42006800, 0x80018000, 0x0201f800, + 0x0010427d, 0x42006000, 0xfffeffff, 0x41786800, + 0x0201f800, 0x0010427d, 0x4200b000, 0x00001388, + 0x4201d000, 0x00000014, 0x4c580000, 0x0201f800, + 0x0010608e, 0x0201f800, 0x001018d3, 0x5c00b000, + 0x04000004, 0x8058b040, 0x040207f6, 0x0401f025, + 0x59c40005, 0x8c000534, 0x04020007, 0x59c400a4, + 0x82000500, 0x0000000f, 0x82000580, 0x00000008, + 0x0402001c, 0x42006000, 0x00020000, 0x0201f800, + 0x00104282, 0x4201d000, 0x00000064, 0x0201f800, + 0x0010608e, 0x42006000, 0xfeffffff, 0x42006800, + 0x02000000, 0x0201f800, 0x0010427d, 0x42006000, + 0xfdffffff, 0x41786800, 0x0201f800, 0x0010427d, + 0x4a038805, 0x04000001, 0x59c400a4, 0x82000500, + 0x0000000f, 0x82000580, 0x00000000, 0x04000003, + 0x82000540, 0x00000001, 0x1c01f000, 0x4803c856, + 0x42038000, 0x00007700, 0x0201f800, 0x00100ec1, + 0x59c00006, 0x59a0040c, 0x800001c0, 0x0400003f, + 0x59a03c0c, 0x59a00209, 0x59a01c09, 0x900c19c0, + 0x800c1d40, 0x59a0020e, 0x59a0240e, 0x901021c0, + 0x80102540, 0x59a0020b, 0x82000500, 0x0000fffc, + 0x59a0140b, 0x900811c0, 0x80081540, 0x480b8003, + 0x0201f800, 0x0002075a, 0x02000800, 0x001005d8, + 0x49334000, 0x0201f800, 0x001007e4, 0x4a025a04, + 0x00000018, 0x4a025805, 0x00abcdef, 0x492e6008, + 0x492e600b, 0x481e600d, 0x4a02600c, 0x00000004, + 0x832c0400, 0x00000011, 0x4802600a, 0x42001000, + 0x0000000c, 0x821c0d80, 0x00000001, 0x04000004, + 0x801c3840, 0x0401f963, 0x0401f004, 0x41783800, + 0x0401f960, 0x0401f011, 0x821c0c80, 0x00000005, + 0x04001005, 0x40043800, 0x42001000, 0x0000003c, + 0x0401f006, 0x80001580, 0x82081400, 0x0000000c, + 0x801c3840, 0x040207fd, 0x832c0400, 0x00000005, + 0x0401f950, 0x040207f1, 0x497b9009, 0x59e00003, + 0x82000540, 0x00008060, 0x4803c003, 0x4a038009, + 0x00e00000, 0x1c01f000, 0x4803c856, 0x41780800, + 0x8007a0ca, 0x83d3a400, 0x00007600, 0x42000800, + 0x00000040, 0x0201f800, 0x00101345, 0x4a03a00a, + 0x00000001, 0x4a03a005, 0x20000000, 0x59d00006, + 0x4a03a005, 0x30000000, 0x59d00006, 0x8c00050a, + 0x040207fe, 0x59d00005, 0x59a0020c, 0x800001c0, + 0x0400003f, 0x59a03a0c, 0x59a00210, 0x59a01c10, + 0x900c19c0, 0x800c1d40, 0x59a0020d, 0x59a0240d, + 0x901021c0, 0x80102540, 0x59a0120b, 0x82081500, + 0x0000fffc, 0x59a0040b, 0x900001c0, 0x80081540, + 0x480ba003, 0x0201f800, 0x0002075a, 0x02000800, + 0x001005d8, 0x49334001, 0x0201f800, 0x001007e4, + 0x4a025a04, 0x00000018, 0x4a025805, 0x00abcdef, + 0x492e6008, 0x492e600b, 0x481e600d, 0x4a02600c, + 0x00000004, 0x832c0400, 0x00000011, 0x4802600a, + 0x42001000, 0x0000000c, 0x821c0d80, 0x00000001, + 0x04000004, 0x801c3840, 0x0401f906, 0x0401f004, + 0x41783800, 0x0401f903, 0x0401f011, 0x821c0c80, + 0x00000005, 0x04001005, 0x40043800, 0x42001000, + 0x0000003c, 0x0401f006, 0x80001580, 0x82081400, + 0x0000000c, 0x801c3840, 0x040207fd, 0x832c0400, + 0x00000005, 0x0401f8f3, 0x040207f1, 0x1c01f000, + 0x4803c856, 0x59a0020c, 0x800001c0, 0x04000024, + 0x824c0580, 0x00000002, 0x04000040, 0x59a26001, + 0x5930380d, 0x801c39c0, 0x0400003c, 0x801c3840, + 0x481e600d, 0x5932580b, 0x5930080a, 0x50042000, + 0x58041801, 0x58041002, 0x82081500, 0xfffffffc, + 0x5930000c, 0x80000000, 0x82000d80, 0x00000005, + 0x04020009, 0x497a600c, 0x592e5801, 0x812e59c0, + 0x0400001a, 0x492e600b, 0x832c0c00, 0x00000005, + 0x0401f005, 0x4802600c, 0x5930080a, 0x82040c00, + 0x00000003, 0x4806600a, 0x0401f010, 0x59a0120b, + 0x82081500, 0x0000fffc, 0x59a0040b, 0x900001c0, + 0x80081540, 0x480ba003, 0x59a0020d, 0x59a0240d, + 0x901021c0, 0x80102540, 0x59a00210, 0x59a01c10, + 0x900c19c0, 0x800c1d40, 0x4201d000, 0x00003a98, + 0x0201f800, 0x001060c6, 0x480ba002, 0x59a80059, + 0x4803a008, 0x4813a000, 0x480fa001, 0x4a03a005, + 0x10000000, 0x02005800, 0x001005d8, 0x804c9800, + 0x82000540, 0x00000001, 0x1c01f000, 0x4847c857, + 0x59a0040c, 0x800001c0, 0x04000024, 0x82480580, + 0x00000002, 0x04000042, 0x59a26000, 0x5930380d, + 0x801c39c0, 0x0400003e, 0x801c3840, 0x481e600d, + 0x5932580b, 0x5930080a, 0x50042000, 0x58041801, + 0x58041002, 0x82081500, 0xfffffffc, 0x5930000c, + 0x80000000, 0x82000d80, 0x00000005, 0x04020009, + 0x497a600c, 0x592e5801, 0x812e59c0, 0x0400001d, + 0x492e600b, 0x832c0c00, 0x00000005, 0x0401f005, + 0x4802600c, 0x5930080a, 0x82040c00, 0x00000003, + 0x4806600a, 0x0401f013, 0x82440580, 0x10000000, + 0x0402001f, 0x59a0020e, 0x59a0240e, 0x901021c0, + 0x80102540, 0x59a00209, 0x59a01c09, 0x900c19c0, + 0x800c1d40, 0x59a0020b, 0x82000500, 0x0000fffc, + 0x59a0140b, 0x900811c0, 0x80081540, 0x480b8003, + 0x48138000, 0x480f8001, 0x480b8002, 0x59c80018, + 0x82000500, 0xf0000000, 0x59c02008, 0x82102500, + 0x0fffffff, 0x80100540, 0x48038008, 0x48478006, + 0x80489000, 0x8260c540, 0x00000001, 0x1c01f000, + 0x59c00009, 0x4803c857, 0x82000d00, 0x00e00000, + 0x0400000d, 0x485f420f, 0x905cb9c0, 0x485f440f, + 0x8c00052e, 0x04000002, 0x80285000, 0x8c00052c, + 0x04000002, 0x80244800, 0x8c00052a, 0x04000002, + 0x802c5800, 0x1c01f000, 0x59a0020c, 0x800001c0, + 0x04000024, 0x59d00806, 0x4807c857, 0x8c040d3e, + 0x04000020, 0x4a03a005, 0x20000000, 0x4a03a005, + 0x30000000, 0x59d00806, 0x8c040d0a, 0x040207fe, + 0x824c0480, 0x00000003, 0x02021800, 0x001005d8, + 0x404c0000, 0x0c01f001, 0x00102da1, 0x00102da3, + 0x00102da9, 0x0201f800, 0x001005d8, 0x80000040, + 0x40009800, 0x0401ff43, 0x0400000a, 0x0401ff41, + 0x0401f008, 0x80000040, 0x40009800, 0x59d00806, + 0x4807c857, 0x8c040d3e, 0x040207e3, 0x0401ff39, + 0x1c01f000, 0x59a0040c, 0x800001c0, 0x04000024, + 0x59c00807, 0x4807c857, 0x8c040d3e, 0x04000020, + 0x59c00807, 0x4a038006, 0x20000000, 0x82480480, + 0x00000003, 0x02021800, 0x001005d8, 0x40480000, + 0x0c01f001, 0x00102dc4, 0x00102dc6, 0x00102dce, + 0x0201f800, 0x001005d8, 0x80000040, 0x40009000, + 0x42008800, 0x10000004, 0x0401ff65, 0x0400000c, + 0x0401ff63, 0x0401f00a, 0x80000040, 0x40009000, + 0x59c00807, 0x4807c857, 0x8c040d3e, 0x040207e5, + 0x42008800, 0x10000004, 0x0401ff59, 0x1c01f000, + 0x492fc857, 0x4000a800, 0x4a03b805, 0x20000000, + 0x59dc0006, 0x4a03b805, 0x30000000, 0x4813b800, + 0x480fb801, 0x480bb802, 0x4857b803, 0x4a03b805, + 0x30000002, 0x59dc0006, 0x4a03b805, 0x70000001, + 0x59dc0006, 0x4a03b805, 0x10000000, 0x59dc0006, + 0x8c00053e, 0x040007fe, 0x4a03b805, 0x20000000, + 0x59dc0006, 0x59dc2000, 0x59dc1801, 0x801c39c0, + 0x0400000a, 0x4d2c0000, 0x0201f800, 0x001007e4, + 0x5c000800, 0x02000800, 0x001005d8, 0x4a025a04, + 0x0000000a, 0x492c0801, 0x1c01f000, 0x42006000, + 0x00102fb2, 0x0201f800, 0x00101345, 0x4a03902c, + 0x00200000, 0x4200b000, 0x000001f4, 0x59c8002c, + 0x8c00052c, 0x04000007, 0x8058b040, 0x040207fc, + 0x42000000, 0x00004003, 0x41781000, 0x0401f196, + 0x50301000, 0x41784800, 0x4a03902d, 0x00008000, + 0x4200b000, 0x000001f4, 0x59c8002c, 0x8c000534, + 0x04000007, 0x8058b040, 0x040207fc, 0x42000000, + 0x00004003, 0x41781000, 0x0401f187, 0x0401f8f8, + 0x80244800, 0x40240000, 0x82000580, 0x000003b1, + 0x040207fb, 0x0401f988, 0x41784800, 0x0401f920, + 0x80244800, 0x40240000, 0x82000580, 0x000003b1, + 0x040207fb, 0x80306000, 0x82300580, 0x00102fb4, + 0x040207e0, 0x59a80863, 0x800409c0, 0x04000007, + 0x42000000, 0x00004004, 0x42001000, 0x00000002, + 0x59a81862, 0x0401f16c, 0x42006000, 0x00102fb2, + 0x4a035064, 0x00000004, 0x50301000, 0x41784800, + 0x4a03902d, 0x00004000, 0x4200b000, 0x000001f4, + 0x59c8002c, 0x8c000532, 0x04000007, 0x8058b040, + 0x040207fc, 0x42000000, 0x00004003, 0x41781000, + 0x0401f159, 0x0401f8ca, 0x80244800, 0x40240000, + 0x82000580, 0x00000154, 0x040207fb, 0x0401f95a, + 0x41784800, 0x0401f8f2, 0x80244800, 0x40240000, + 0x82000580, 0x00000154, 0x040207fb, 0x80306000, + 0x82300580, 0x00102fb4, 0x040207e0, 0x59a80863, + 0x800409c0, 0x04000007, 0x42000000, 0x00004004, + 0x42001000, 0x00000004, 0x59a81862, 0x0401f13e, + 0x42006000, 0x00102fb2, 0x497b5064, 0x50301000, + 0x41784800, 0x4a03902d, 0x00001000, 0x4200b000, + 0x000001f4, 0x59c8002c, 0x8c00052e, 0x04000007, + 0x8058b040, 0x040207fc, 0x42000000, 0x00004003, + 0x41781000, 0x0401f12c, 0x0401f89d, 0x80244800, + 0x40240000, 0x82000580, 0x00000088, 0x040207fb, + 0x0401f92d, 0x41784800, 0x0401f8c5, 0x80244800, + 0x40240000, 0x82000580, 0x00000088, 0x040207fb, + 0x80306000, 0x82300580, 0x00102fb4, 0x040207e0, + 0x59a80863, 0x800409c0, 0x04000007, 0x42000000, + 0x00004004, 0x42001000, 0x00000001, 0x59a81862, + 0x0401f111, 0x42006000, 0x00102fb2, 0x50301000, + 0x41784800, 0x4a03902d, 0x00000800, 0x0401f87c, + 0x80244800, 0x40240000, 0x82000580, 0x00000018, + 0x040207fb, 0x0401f90c, 0x41784800, 0x0401f8a4, + 0x80244800, 0x40240000, 0x82000580, 0x00000018, + 0x040207fb, 0x80306000, 0x82300580, 0x00102fb4, + 0x040207eb, 0x59a80863, 0x800409c0, 0x04000007, + 0x42000000, 0x00004004, 0x42001000, 0x00000010, + 0x59a81862, 0x0401f0f0, 0x42006000, 0x00102fb2, + 0x50301000, 0x41784800, 0x4a03902d, 0x00000400, + 0x0401f85b, 0x80244800, 0x40240000, 0x82000580, + 0x00000088, 0x040207fb, 0x0401f8eb, 0x41784800, + 0x0401f883, 0x80244800, 0x40240000, 0x82000580, + 0x00000088, 0x040207fb, 0x80306000, 0x82300580, + 0x00102fb4, 0x040207eb, 0x59a80863, 0x800409c0, + 0x04000007, 0x42000000, 0x00004004, 0x42001000, + 0x00000008, 0x59a81862, 0x0401f0cf, 0x42006000, + 0x00102fb2, 0x50301000, 0x41784800, 0x4a03902d, + 0x00002000, 0x4200b000, 0x000001f4, 0x59c8002c, + 0x8c000530, 0x04000007, 0x8058b040, 0x040207fc, + 0x42000000, 0x00004003, 0x41781000, 0x0401f0be, + 0x59c8002c, 0x82000500, 0xffe0ffff, 0x82080d00, + 0x001f0000, 0x80040540, 0x4803902c, 0x0401f828, + 0x80244800, 0x40240000, 0x82000580, 0x00000110, + 0x040207fb, 0x0401f8b8, 0x41784800, 0x0401f850, + 0x59c80034, 0x82080d00, 0x001f0000, 0x82000500, + 0x001f0000, 0x80040580, 0x04000006, 0x59a80063, + 0x80000000, 0x48035063, 0x40240000, 0x48035062, + 0x80244800, 0x40240000, 0x82000580, 0x00000110, + 0x040207ef, 0x80306000, 0x82300580, 0x00102fb4, + 0x040207cd, 0x59a80863, 0x800409c0, 0x04000006, + 0x42000000, 0x00004004, 0x42001000, 0x00000020, + 0x59a81862, 0x0201f000, 0x001022c0, 0x59c8002c, + 0x82000500, 0xffff0000, 0x82080d00, 0x0000ffff, + 0x80040540, 0x4803902c, 0x40080000, 0x48039028, + 0x48039029, 0x59a80064, 0x82000580, 0x00000004, + 0x04000004, 0x40080000, 0x4803902a, 0x4803902b, + 0x59c8082d, 0x82040d00, 0xfffffc00, 0x40240000, + 0x80040d40, 0x4807902d, 0x4200b000, 0x000001f4, + 0x59c8002c, 0x82000500, 0x18000000, 0x04000007, + 0x8058b040, 0x040207fb, 0x42000000, 0x00004003, + 0x41781000, 0x0401f06c, 0x4a03902e, 0x00000001, + 0x4200b000, 0x000001f4, 0x59c8002e, 0x8c000500, + 0x04000006, 0x8058b040, 0x040207fc, 0x42000000, + 0x00004003, 0x0401f060, 0x1c01f000, 0x41783800, + 0x59c8082d, 0x82040d00, 0xfffffc00, 0x40240000, + 0x80040d40, 0x4807902d, 0x4200b000, 0x000001f4, + 0x59c8002c, 0x82000500, 0x18000000, 0x04000007, + 0x8058b040, 0x040207fb, 0x42000000, 0x00004003, + 0x41781000, 0x0401f04c, 0x59c80030, 0x59c80830, + 0x80040580, 0x040207fd, 0x40041800, 0x59c80031, + 0x59c80831, 0x80040580, 0x040207fd, 0x40042000, + 0x59c80032, 0x59c80832, 0x80040580, 0x040207fd, + 0x40042800, 0x59c80033, 0x59c80833, 0x80040580, + 0x040207fd, 0x40043000, 0x400c0000, 0x80080580, + 0x04000002, 0x801c3800, 0x40100000, 0x80080580, + 0x04000002, 0x801c3800, 0x59a80064, 0x82000580, + 0x00000004, 0x04000009, 0x40140000, 0x80080580, + 0x04000002, 0x801c3800, 0x40180000, 0x80080580, + 0x04000002, 0x801c3800, 0x59a80064, 0x82000580, + 0x00000004, 0x0400000d, 0x59c80034, 0x59c80834, + 0x80040580, 0x040207fd, 0x82040500, 0x0000ffff, + 0x82080d00, 0x0000ffff, 0x80040580, 0x0400000e, + 0x801c3800, 0x0401f00c, 0x59c80034, 0x59c80834, + 0x80040580, 0x040207fd, 0x82040500, 0x000000ff, + 0x82080d00, 0x000000ff, 0x80040580, 0x04000002, + 0x801c3800, 0x801c39c0, 0x04000006, 0x59a80063, + 0x801c0400, 0x48035063, 0x40240000, 0x48035062, + 0x1c01f000, 0x48034206, 0x48074406, 0x480b4207, + 0x480f4407, 0x48134208, 0x48174408, 0x0201f000, + 0x001022c3, 0x42000000, 0x00600000, 0x80000040, + 0x040207ff, 0x1c01f000, 0x5a5a5a5a, 0xa5a5a5a5, + 0x59a00c0a, 0x800409c0, 0x02000000, 0x00102310, + 0x82040480, 0x00000021, 0x02021000, 0x00102310, + 0x82040480, 0x00000011, 0x04001003, 0x42000800, + 0x00000010, 0x59a00208, 0x59a01407, 0x900811c0, + 0x80081540, 0x59a00207, 0x59a01c06, 0x900c19c0, + 0x800c1d40, 0x0201f800, 0x00103a00, 0x04000006, + 0x0201f800, 0x00103a25, 0x4a01d809, 0x00102fd5, + 0x1c01f000, 0x4a034406, 0x00000002, 0x0201f000, + 0x0010230c, 0x4031d800, 0x58ef400b, 0x58ec0002, + 0x82000580, 0x00000200, 0x02000000, 0x00102304, + 0x59a00c0a, 0x82040480, 0x00000011, 0x04001003, + 0x42000800, 0x00000010, 0x59a0040b, 0x59a0120b, + 0x900811c0, 0x80081540, 0x59a00209, 0x59a01c08, + 0x900c19c0, 0x800c1d40, 0x58ec0003, 0x0201f800, + 0x00103a28, 0x4a01d809, 0x00102ff0, 0x1c01f000, + 0x4031d800, 0x58ef400b, 0x58ec0002, 0x82000580, + 0x00000200, 0x02000000, 0x00102304, 0x59a00c0a, + 0x82040480, 0x00000011, 0x02001000, 0x001022c0, + 0x82040c80, 0x00000010, 0x59a00208, 0x59a01407, + 0x900811c0, 0x80081540, 0x59a00207, 0x59a01c06, + 0x900c19c0, 0x800c1d40, 0x82081400, 0x00000040, + 0x58ec0003, 0x0201f800, 0x00103a25, 0x4a01d809, + 0x0010300e, 0x1c01f000, 0x4031d800, 0x58ef400b, + 0x58ec0002, 0x82000580, 0x00000200, 0x02000000, + 0x00102304, 0x59a0040a, 0x82000c80, 0x00000010, + 0x59a0040b, 0x59a0120b, 0x900811c0, 0x80081540, + 0x59a00209, 0x59a01c08, 0x900c19c0, 0x800c1d40, + 0x82081400, 0x00000040, 0x58ec0003, 0x0201f800, + 0x00103a28, 0x4a01d809, 0x001022b9, 0x1c01f000, + 0x48efc857, 0x59a00207, 0x59a01407, 0x900001c0, + 0x80081540, 0x59a00209, 0x59a01c09, 0x900001c0, + 0x800c1d40, 0x59a00406, 0x48034000, 0x480b4001, + 0x480f4002, 0x0201f800, 0x00103a00, 0x04020005, + 0x4a034406, 0x00000002, 0x0201f000, 0x0010230c, + 0x42000800, 0x00000010, 0x0201f800, 0x00103a25, + 0x4a01d809, 0x00103043, 0x1c01f000, 0x4031d800, + 0x58ef400b, 0x58ee580d, 0x58ec0002, 0x82000580, + 0x00000200, 0x02000000, 0x00102304, 0x48efc857, + 0x49a3c857, 0x492fc857, 0x592c0a04, 0x80040910, + 0x04020005, 0x4a034406, 0x00000019, 0x0201f000, + 0x0010230c, 0x4805d80c, 0x0401f00a, 0x4031d800, + 0x58ef400b, 0x58ec0002, 0x82000580, 0x00000200, + 0x02000000, 0x00102304, 0x48efc857, 0x49a3c857, + 0x48efc857, 0x49a3c857, 0x58ec000c, 0x80000040, + 0x04000012, 0x4801d80c, 0x0201f800, 0x00103a00, + 0x04020005, 0x4a034406, 0x00000002, 0x0201f000, + 0x0010230c, 0x42000800, 0x00000010, 0x58ec1007, + 0x58ec1808, 0x0201f800, 0x00103a25, 0x4a01d809, + 0x00103057, 0x1c01f000, 0x58ee580d, 0x48efc857, + 0x49a3c857, 0x492fc857, 0x492f3006, 0x592c0404, + 0x8400055e, 0x48025c04, 0x4a01d809, 0x00103081, + 0x1c01f000, 0x58ee580d, 0x48efc857, 0x49a3c857, + 0x492fc857, 0x592c0404, 0x8400051e, 0x48025c04, + 0x59a00000, 0x59a01001, 0x59a01802, 0x80081400, + 0x820c1c40, 0x00000000, 0x832c0400, 0x00000004, + 0x42000800, 0x00000010, 0x0201f000, 0x00103a28, + 0x800409c0, 0x04000005, 0x4a034406, 0x00000001, + 0x0201f000, 0x0010230c, 0x836c0580, 0x00000003, + 0x04000005, 0x4a034406, 0x00000007, 0x0201f000, + 0x0010230c, 0x59a0320b, 0x82183500, 0x000000ff, + 0x59a28c06, 0x0201f800, 0x00020245, 0x02020000, + 0x00102310, 0x83440580, 0x000007fd, 0x04000008, + 0x0201f800, 0x001049e7, 0x04000005, 0x4a034406, + 0x00000009, 0x0201f000, 0x0010230c, 0x0201f800, + 0x00103a00, 0x04020005, 0x4a034406, 0x00000002, + 0x0201f000, 0x0010230c, 0x801831c0, 0x0400000a, + 0x412c0800, 0x0201f800, 0x00103a00, 0x04020005, + 0x4a034406, 0x00000002, 0x0201f000, 0x0010230c, + 0x40065800, 0x4a025c04, 0x00008000, 0x497a5a04, + 0x0201f800, 0x00109100, 0x04020005, 0x4a034406, + 0x00000003, 0x0201f000, 0x0010230c, 0x4a01d809, + 0x001030d2, 0x1c01f000, 0x592c0005, 0x82000580, + 0x01000000, 0x04020005, 0x4a034406, 0x00000004, + 0x0201f000, 0x0010230c, 0x592c0406, 0x82002d00, + 0x0000ff00, 0x82000500, 0x000000ff, 0x80000904, + 0x80040800, 0x82040480, 0x00000006, 0x04001003, + 0x42000800, 0x00000005, 0x832ca400, 0x00000006, + 0x4050a800, 0x4004b000, 0x0201f800, 0x0010ab28, + 0x59a00407, 0x59a01207, 0x900811c0, 0x80081540, + 0x59a00409, 0x59a01a09, 0x900c19c0, 0x800c1d40, + 0x832c0400, 0x00000006, 0x4c140000, 0x0201f800, + 0x00103a28, 0x5c002800, 0x801429c0, 0x04000003, + 0x4a01d809, 0x001030ff, 0x1c01f000, 0x4031d800, + 0x58ef400b, 0x58ee580d, 0x58ec0002, 0x82000580, + 0x00000200, 0x02000000, 0x00102304, 0x812e59c0, + 0x02000800, 0x001005d8, 0x592c0006, 0x82000500, + 0xff000000, 0x80000904, 0x800409c0, 0x02000000, + 0x00102304, 0x82040480, 0x0000000e, 0x04001003, + 0x42000800, 0x0000000d, 0x592e5801, 0x812e59c0, + 0x02000800, 0x001005d8, 0x832ca400, 0x00000005, + 0x4050a800, 0x4004b000, 0x0201f800, 0x0010ab28, + 0x58ec1007, 0x58ec1808, 0x832c0400, 0x00000005, + 0x0201f000, 0x00103a28, 0x0201f800, 0x00103a00, + 0x04020005, 0x4a034406, 0x00000002, 0x0201f000, + 0x0010230c, 0x59a00c06, 0x82040500, 0x0000ff00, + 0x840001c0, 0x82001480, 0x00000007, 0x02021000, + 0x00102310, 0x0c01f001, 0x0010313d, 0x00103144, + 0x0010314b, 0x0010314b, 0x0010314b, 0x0010314d, + 0x00103152, 0x42000800, 0x0000000d, 0x42003800, + 0x00103166, 0x4a034000, 0x0010b4eb, 0x0401f013, + 0x42000800, 0x0000000d, 0x42003800, 0x00103166, + 0x4a034000, 0x0010b4f8, 0x0401f00c, 0x0201f000, + 0x00102310, 0x42000800, 0x00000008, 0x42003800, + 0x00103179, 0x0401f005, 0x42000800, 0x00000004, + 0x42003800, 0x001031c3, 0x59a00207, 0x59a01407, + 0x900001c0, 0x80081540, 0x59a00209, 0x59a01c09, + 0x900001c0, 0x800c1d40, 0x832c0400, 0x00000005, + 0x4c1c0000, 0x0201f800, 0x00103a25, 0x5c003800, + 0x481dd809, 0x1c01f000, 0x4031d800, 0x58ef400b, + 0x58ee580d, 0x58ec0002, 0x82000580, 0x00000200, + 0x02000000, 0x00102304, 0x4a03501f, 0x00000001, + 0x4200b000, 0x0000000d, 0x59a0a800, 0x832ca400, + 0x00000005, 0x0201f800, 0x0010ab17, 0x0201f000, + 0x001022c0, 0x4031d800, 0x58ef400b, 0x58ee580d, + 0x58ec0002, 0x82000580, 0x00000200, 0x02000000, + 0x00102304, 0x832ca400, 0x00000005, 0x50500000, + 0x82001500, 0x000c0016, 0x02020000, 0x00102310, + 0x82500c00, 0x00000003, 0x50040000, 0x82001500, + 0x00000001, 0x02020000, 0x00102310, 0x50500000, + 0x82001500, 0x00000028, 0x0400001d, 0x82081580, + 0x00000028, 0x02020000, 0x00102310, 0x80500800, + 0x50040000, 0x82001500, 0x00000013, 0x82081580, + 0x00000013, 0x02020000, 0x00102310, 0x80040800, + 0x50040000, 0x82001500, 0x00010000, 0x82081580, + 0x00010000, 0x02020000, 0x00102310, 0x836c0580, + 0x00000000, 0x04000012, 0x599c0019, 0x8c00050e, + 0x0402000f, 0x0201f000, 0x00102310, 0x80500800, + 0x50040000, 0x82001500, 0x00000013, 0x02020000, + 0x00102310, 0x80040800, 0x50040000, 0x82001500, + 0x00010000, 0x02020000, 0x00102310, 0x4200b000, + 0x00000008, 0x4200a800, 0x0010b4e3, 0x0201f800, + 0x0010ab17, 0x0201f000, 0x001022c0, 0x4031d800, + 0x58ef400b, 0x58ee580d, 0x58ec0002, 0x82000580, + 0x00000200, 0x02000000, 0x00102304, 0x4200b000, + 0x00000004, 0x4200a800, 0x0010b8fa, 0x832ca400, + 0x00000005, 0x0201f800, 0x0010ab17, 0x59a80005, + 0x84000550, 0x48035005, 0x0201f000, 0x001022c0, + 0x0201f800, 0x00103a00, 0x04020005, 0x4a034406, + 0x00000002, 0x0201f000, 0x0010230c, 0x59a00c06, + 0x82040500, 0x0000ff00, 0x840001c0, 0x82001480, + 0x00000006, 0x02021000, 0x00102310, 0x0c01f001, + 0x001031ee, 0x001031f3, 0x001031f8, 0x001031f8, + 0x001031f8, 0x001031fa, 0x42000800, 0x0000000d, + 0x4200a000, 0x0010b4eb, 0x0401f00c, 0x42000800, + 0x0000000d, 0x4200a000, 0x0010b4f8, 0x0401f007, + 0x0201f000, 0x00102310, 0x42000800, 0x00000008, + 0x4200a000, 0x0010b4e3, 0x4004b000, 0x832cac00, + 0x00000005, 0x0201f800, 0x0010ab17, 0x59a00207, + 0x59a01407, 0x900001c0, 0x80081540, 0x59a00209, + 0x59a01c09, 0x900001c0, 0x800c1d40, 0x832c0400, + 0x00000005, 0x0201f000, 0x00103a28, 0x836c0580, + 0x00000000, 0x04020005, 0x4a034406, 0x00000007, + 0x0201f000, 0x0010230c, 0x59a00406, 0x800001c0, + 0x0400001a, 0x59a80005, 0x8c000514, 0x04000005, + 0x42000000, 0x00000001, 0x40000800, 0x0401f003, + 0x59a00207, 0x59a80853, 0x48035053, 0x0201f800, + 0x0010163b, 0x04000022, 0x0201f800, 0x00101642, + 0x0400001f, 0x0201f800, 0x00101649, 0x0400001c, + 0x0201f800, 0x00101650, 0x04000019, 0x48075053, + 0x0201f000, 0x00102310, 0x59c40801, 0x82040d00, + 0x00018000, 0x82040580, 0x00000000, 0x04020004, + 0x4a034406, 0x00000000, 0x0401f00d, 0x82040580, + 0x00008000, 0x04020004, 0x4a034406, 0x00000001, + 0x0401f007, 0x82040580, 0x00010000, 0x02020800, + 0x001005d8, 0x4a034406, 0x00000003, 0x59a00406, + 0x82000580, 0x00000002, 0x0402001f, 0x59c40006, + 0x84000500, 0x48038806, 0x0201f800, 0x00106ede, + 0x497b8880, 0x0201f800, 0x0010a9c0, 0x0201f800, + 0x0010a9ce, 0x42000000, 0x0010b8ca, 0x0201f800, + 0x0010aa47, 0x82000540, 0x00000001, 0x0201f800, + 0x0010518c, 0x4a038808, 0x00000000, 0x4202d800, + 0x00000004, 0x42001000, 0x00000001, 0x0201f800, + 0x0010193d, 0x4a035049, 0x00000001, 0x0201f800, + 0x001006d4, 0x0201f000, 0x001022c0, 0x800409c0, + 0x04000005, 0x4a034406, 0x00000001, 0x0201f000, + 0x0010230c, 0x836c0580, 0x00000003, 0x04000005, + 0x4a034406, 0x00000007, 0x0201f000, 0x0010230c, + 0x59a28c06, 0x59a0320b, 0x82183500, 0x000000ff, + 0x0201f800, 0x00020245, 0x02020000, 0x00102310, + 0x83440580, 0x000007fd, 0x04000008, 0x0201f800, + 0x001049e7, 0x04000005, 0x42000800, 0x00000009, + 0x0201f000, 0x0010230c, 0x0201f800, 0x00103a00, + 0x04020005, 0x4a034406, 0x00000002, 0x0201f000, + 0x0010230c, 0x497a5a04, 0x4a025c04, 0x00008000, + 0x0201f800, 0x00109115, 0x04020005, 0x4a034406, + 0x00000003, 0x0201f000, 0x0010230c, 0x4a01d809, + 0x0010329e, 0x1c01f000, 0x592c0005, 0x82000d00, + 0x0000ffff, 0x82000500, 0xffff0000, 0x82000580, + 0x01000000, 0x04020005, 0x4a034406, 0x00000004, + 0x0201f000, 0x0010230c, 0x80040904, 0x832ca400, + 0x00000005, 0x4050a800, 0x4004b000, 0x0201f800, + 0x0010ab28, 0x59a00207, 0x59a01407, 0x900001c0, + 0x80081540, 0x59a00209, 0x59a01c09, 0x900001c0, + 0x800c1d40, 0x832c0400, 0x00000005, 0x0201f000, + 0x00103a28, 0x496fc857, 0x836c0580, 0x00000000, + 0x04000005, 0x4a034406, 0x0000001a, 0x0201f000, + 0x0010230c, 0x0201f800, 0x0010513b, 0x02020800, + 0x00104142, 0x42000800, 0x00000020, 0x59a00407, + 0x59a01207, 0x900811c0, 0x80081540, 0x59a00409, + 0x59a01a09, 0x900c19c0, 0x800c1d40, 0x419c0000, + 0x49a3c857, 0x0201f800, 0x00103a25, 0x4a01d809, + 0x001032da, 0x1c01f000, 0x4833c857, 0x4031d800, + 0x58ef400b, 0x58ec0002, 0x82000580, 0x00000200, + 0x02000000, 0x00102304, 0x599c0200, 0x800001c0, + 0x02000000, 0x00102310, 0x59a80005, 0x8c000512, + 0x04000004, 0x599c0019, 0x8400050c, 0x48033819, + 0x0201f800, 0x001097d7, 0x59a80005, 0x8c000514, + 0x04000004, 0x599c0017, 0x84000508, 0x48033817, + 0x0201f800, 0x00103b25, 0x04020004, 0x8c00050a, + 0x02020000, 0x00102310, 0x4803c857, 0x8c000504, + 0x04020004, 0x59c408a3, 0x84040d7a, 0x480788a3, + 0x8c000502, 0x04020004, 0x59c408a3, 0x84040d08, + 0x480788a3, 0x599c0c02, 0x8c000500, 0x04020004, + 0x8c000516, 0x04000012, 0x0401f001, 0x82041480, + 0x0000007f, 0x02021000, 0x00102310, 0x82041400, + 0x0010210e, 0x50081000, 0x82081500, 0x000000ff, + 0x8c000500, 0x04020006, 0x480b5010, 0x42000800, + 0x00000003, 0x0201f800, 0x00106c78, 0x599c0019, + 0x8c00050e, 0x0402000b, 0x59a80806, 0x8c040d14, + 0x04000008, 0x42000800, 0x0010b4e3, 0x50040800, + 0x82040d00, 0x00000028, 0x02020000, 0x00102310, + 0x82000500, 0x00000030, 0x04000003, 0x80000108, + 0x0401f003, 0x42000000, 0x00000002, 0x48039040, + 0x42000800, 0x00000002, 0x82000400, 0x00103415, + 0x50001000, 0x0201f800, 0x00106c78, 0x599c0201, + 0x82000c80, 0x00000100, 0x02001000, 0x00102310, + 0x82000c80, 0x00000841, 0x02021000, 0x00102310, + 0x82000500, 0x00000007, 0x02020000, 0x00102310, + 0x599c0401, 0x80000540, 0x02000000, 0x00102310, + 0x599c0409, 0x599c0c07, 0x80040c80, 0x02021000, + 0x00102310, 0x80000040, 0x02000000, 0x00102310, + 0x599c0209, 0x599c0a07, 0x80040c80, 0x02021000, + 0x00102310, 0x80000040, 0x02000000, 0x00102310, + 0x0201f800, 0x001053cd, 0x0201f800, 0x00104cb6, + 0x599c0201, 0x48035004, 0x0201f800, 0x001012ee, + 0x599c020a, 0x800001c0, 0x04000003, 0x4803504d, + 0x0401f003, 0x4a03504d, 0x000000c8, 0x0201f800, + 0x00103b25, 0x04000004, 0x0201f800, 0x001060df, + 0x417a5000, 0x836c0580, 0x00000000, 0x04020098, + 0x599c0003, 0x599c0804, 0x9c0001c0, 0x9c0409c0, + 0x48035002, 0x48075003, 0x599c1017, 0x8c08151c, + 0x04000006, 0x599c0005, 0x599c0806, 0x9c0001c0, + 0x9c0409c0, 0x0401f003, 0x82000500, 0xf0ffffff, + 0x48035000, 0x48075001, 0x42001000, 0x0010b4eb, + 0x48001000, 0x48041001, 0x42001000, 0x0010b4f8, + 0x48001000, 0x48041001, 0x59a80005, 0x8c000514, + 0x04020015, 0x599c1019, 0x82081500, 0x0000e000, + 0x82080580, 0x00000000, 0x0402000c, 0x4a035053, + 0x00000000, 0x42000000, 0x00000001, 0x0201f800, + 0x0010188c, 0x42000000, 0x00000001, 0x0201f800, + 0x00101821, 0x0401f02b, 0x82080580, 0x00002000, + 0x0402000a, 0x4a035053, 0x00000001, 0x41780000, + 0x0201f800, 0x0010188c, 0x41780000, 0x0201f800, + 0x00101821, 0x0401f01f, 0x82080580, 0x00004000, + 0x04020006, 0x4a035053, 0x00000002, 0x4a035049, + 0x00000001, 0x0401f017, 0x82080580, 0x00006000, + 0x02020000, 0x00102310, 0x59a80858, 0x82040d80, + 0x01391077, 0x04020005, 0x59e00813, 0x8c040d00, + 0x02020000, 0x00102310, 0x4a035053, 0x00000003, + 0x42000000, 0x00000002, 0x0201f800, 0x0010188c, + 0x42000000, 0x00000002, 0x0201f800, 0x00101821, + 0x599c0019, 0x8c000520, 0x0400000d, 0x42000000, + 0x00000004, 0x42000800, 0x00000040, 0x0201f800, + 0x00101944, 0x42000000, 0x00000010, 0x42000800, + 0x000000c0, 0x0201f800, 0x00101944, 0x4a035032, + 0x0000aaaa, 0x599c1018, 0x82081500, 0x00000030, + 0x59a8006c, 0x80000540, 0x0400000c, 0x82080580, + 0x00000000, 0x02000000, 0x00102310, 0x599c1018, + 0x82081500, 0xffffffcf, 0x82081540, 0x00000010, + 0x480b3818, 0x0401f010, 0x82080d80, 0x00000000, + 0x04000007, 0x82080d80, 0x00000010, 0x0400000a, + 0x82080d80, 0x00000020, 0x04020002, 0x48075032, + 0x0201f800, 0x00103aba, 0x04000008, 0x0201f800, + 0x001015fe, 0x0201f800, 0x0010162a, 0x59a8002a, + 0x80040540, 0x4803502a, 0x49f3c857, 0x42001000, + 0x00105065, 0x0201f800, 0x00105f90, 0x42001000, + 0x00105058, 0x0201f800, 0x00106084, 0x4a038805, + 0xffffffff, 0x4a03c014, 0x00400040, 0x4a03c013, + 0x00400000, 0x0201f800, 0x001048c7, 0x59a0001d, + 0x84000540, 0x4803401d, 0x49f3c857, 0x0201f000, + 0x001022c0, 0x00000018, 0x0000000c, 0x00000018, + 0x00000020, 0x836c0580, 0x00000000, 0x04020005, + 0x42000800, 0x00000007, 0x0201f000, 0x0010230c, + 0x42000800, 0x00000020, 0x59a00407, 0x59a01207, + 0x900811c0, 0x80081540, 0x59a00409, 0x59a01a09, + 0x900c19c0, 0x800c1d40, 0x419c0000, 0x0201f000, + 0x00103a28, 0x800409c0, 0x04000005, 0x4a034406, + 0x00000001, 0x0201f000, 0x0010230c, 0x0201f800, + 0x0010513b, 0x04020005, 0x4a034406, 0x00000016, + 0x0201f000, 0x0010230c, 0x59a80013, 0x8c000500, + 0x04000011, 0x4a034406, 0x00000000, 0x42000800, + 0x00000020, 0x59a00407, 0x59a01207, 0x900811c0, + 0x80081540, 0x59a00409, 0x59a01a09, 0x900c19c0, + 0x800c1d40, 0x42000000, 0x0010be21, 0x0201f000, + 0x00103a28, 0x4a034406, 0x00000001, 0x4200b000, + 0x00000020, 0x4200a800, 0x0010be21, 0x4200a000, + 0xffffffff, 0x4450a800, 0x8054a800, 0x8058b040, + 0x040207fd, 0x4d440000, 0x4d340000, 0x42028800, + 0xffffffff, 0x42002000, 0xffffffff, 0x42003000, + 0x00000001, 0x42003800, 0x00000001, 0x42001800, + 0x0010be21, 0x59a81010, 0x82081500, 0x000000ff, + 0x40180000, 0x0c01f001, 0x0010346e, 0x00103471, + 0x00103475, 0x00103479, 0x82102500, 0xffffff00, + 0x0401f014, 0x82102500, 0xffff00ff, 0x840811c0, + 0x0401f010, 0x82102500, 0xff00ffff, 0x900811c0, + 0x0401f00c, 0x82102500, 0x00ffffff, 0x9c0801c0, + 0x80102540, 0x44101800, 0x42003000, 0xffffffff, + 0x42002000, 0xffffffff, 0x800c1800, 0x0401f003, + 0x40080000, 0x80102540, 0x81468800, 0x83442c80, + 0x0000007f, 0x04021014, 0x4c080000, 0x4c0c0000, + 0x4c180000, 0x4c1c0000, 0x0201f800, 0x00020245, + 0x5c003800, 0x5c003000, 0x5c001800, 0x5c001000, + 0x040207f2, 0x0201f800, 0x001049f3, 0x040207ef, + 0x80183000, 0x801c3800, 0x59341202, 0x40180000, + 0x0c01f7ce, 0x82100580, 0xffffffff, 0x04000002, + 0x44101800, 0x42001800, 0x0010be21, 0x500c0000, + 0x82000500, 0xffffff00, 0x801c0540, 0x44001800, + 0x5c026800, 0x5c028800, 0x42000800, 0x00000020, + 0x59a00407, 0x59a01207, 0x900811c0, 0x80081540, + 0x59a00409, 0x59a01a09, 0x900c19c0, 0x800c1d40, + 0x42000000, 0x0010be21, 0x0201f000, 0x00103a28, + 0x59a28c06, 0x59a0020b, 0x8c000500, 0x0400000e, + 0x59a01208, 0x59a00408, 0x82000500, 0x000000ff, + 0x900001c0, 0x80081540, 0x41784000, 0x0201f800, + 0x00104919, 0x04000008, 0x48034406, 0x0201f000, + 0x00102310, 0x0201f800, 0x00020245, 0x02020000, + 0x00102310, 0x0201f800, 0x00103a00, 0x04020005, + 0x4a034406, 0x00000002, 0x0201f000, 0x0010230c, + 0x59a0020b, 0x8c000500, 0x04000005, 0x0201f800, + 0x001049f3, 0x02020000, 0x00103ac4, 0x59a0020b, + 0x8c000502, 0x04000019, 0x83440480, 0x000007f0, + 0x04021016, 0x0201f800, 0x001049fc, 0x04020013, + 0x497a5a04, 0x4a025c04, 0x00008000, 0x0201f800, + 0x001090e6, 0x04020005, 0x4a034406, 0x00000003, + 0x0201f000, 0x0010230c, 0x4a01d809, 0x001034f1, + 0x1c01f000, 0x59a28c06, 0x0201f800, 0x00020245, + 0x02020000, 0x00102310, 0x4200b000, 0x0000000a, + 0x4134a000, 0x832e5c00, 0x00000002, 0x412ca800, + 0x0201f800, 0x0010ab17, 0x832cac00, 0x00000006, + 0x4054a000, 0x4200b000, 0x00000004, 0x0201f800, + 0x0010ab28, 0x592c0802, 0x82040500, 0x00ff00ff, + 0x900001c0, 0x82041500, 0xff00ff00, 0x80080540, + 0x48025802, 0x592c0801, 0x82040500, 0x00ff00ff, + 0x900001c0, 0x82041500, 0xff00ff00, 0x80080540, + 0x48025801, 0x42000800, 0x0000000a, 0x59a00407, + 0x59a01207, 0x900811c0, 0x80081540, 0x59a00409, + 0x59a01a09, 0x900c19c0, 0x800c1d40, 0x412c0000, + 0x0201f000, 0x00103a28, 0x496fc857, 0x496f4406, + 0x0201f000, 0x001022c0, 0x59a28c06, 0x0201f800, + 0x00020245, 0x02020000, 0x00102310, 0x836c0580, + 0x00000003, 0x04000005, 0x4a034406, 0x00000007, + 0x0201f000, 0x0010230c, 0x83340c00, 0x00000006, + 0x59a0020b, 0x8c000500, 0x04000003, 0x83340c00, + 0x00000008, 0x58040001, 0x48034409, 0x900001c0, + 0x48034209, 0x50040000, 0x48034407, 0x900001c0, + 0x48034207, 0x59340200, 0x48034406, 0x0201f000, + 0x001022c0, 0x800409c0, 0x04000005, 0x4a034406, + 0x00000001, 0x0201f000, 0x0010230c, 0x59a0220b, + 0x8c102500, 0x0402002e, 0x8c102506, 0x04020006, + 0x59a03208, 0x82180480, 0x00000003, 0x02021000, + 0x00102310, 0x59a28c06, 0x0201f800, 0x00020245, + 0x02020000, 0x00102310, 0x0201f800, 0x001049e7, + 0x04000005, 0x4a034406, 0x00000009, 0x0201f000, + 0x0010230c, 0x0201f800, 0x00103a00, 0x04020005, + 0x4a034406, 0x00000002, 0x0201f000, 0x0010230c, + 0x59a0220b, 0x8c102506, 0x04000004, 0x59343002, + 0x82183500, 0x00ffffff, 0x497a5a04, 0x4a025c04, + 0x00008000, 0x0201f800, 0x001090a8, 0x04020005, + 0x4a034406, 0x00000003, 0x0201f000, 0x0010230c, + 0x4a01d809, 0x001035d1, 0x1c01f000, 0x59a28c06, + 0x0201f800, 0x00020245, 0x02020000, 0x00102310, + 0x0201f800, 0x001049e7, 0x04000005, 0x4a034406, + 0x00000009, 0x0201f000, 0x0010230c, 0x0201f800, + 0x00103a00, 0x04020005, 0x4a034406, 0x00000002, + 0x0201f000, 0x0010230c, 0x497a5a04, 0x4a025c04, + 0x00008000, 0x0201f800, 0x00103a00, 0x04020005, + 0x4a034406, 0x00000002, 0x0201f000, 0x0010230c, + 0x592e5800, 0x0201f800, 0x001090bd, 0x04020005, + 0x4a034406, 0x00000003, 0x0201f000, 0x0010230c, + 0x4a01d809, 0x001035a3, 0x1c01f000, 0x592c2805, + 0x82140d80, 0x01000000, 0x04020005, 0x4a034406, + 0x00000004, 0x0201f000, 0x0010230c, 0x42000800, + 0x00000008, 0x59a00207, 0x59a01407, 0x900001c0, + 0x80081540, 0x59a00209, 0x59a01c09, 0x900001c0, + 0x800c1d40, 0x832c0400, 0x00000005, 0x0201f800, + 0x00103a28, 0x8c142d00, 0x04000003, 0x4a01d809, + 0x001035be, 0x1c01f000, 0x4031d800, 0x58ef400b, + 0x58ee580e, 0x58ec0002, 0x82000580, 0x00000200, + 0x02000000, 0x00102304, 0x812e59c0, 0x02000800, + 0x001005d8, 0x42000800, 0x00000008, 0x832c0400, + 0x00000005, 0x58ec1007, 0x58ec1808, 0x0201f000, + 0x00103a28, 0x592c0005, 0x82000580, 0x01000000, + 0x04020005, 0x4a034406, 0x00000004, 0x0201f000, + 0x0010230c, 0x59a00207, 0x59a01407, 0x900001c0, + 0x80081540, 0x59a00209, 0x59a01c09, 0x900001c0, + 0x800c1d40, 0x42000800, 0x00000006, 0x832c0400, + 0x00000006, 0x0201f000, 0x00103a28, 0x59a00a0a, + 0x800409c0, 0x02000000, 0x00102310, 0x82040480, + 0x000000e7, 0x04001003, 0x42000800, 0x000000e6, + 0x59a00207, 0x59a01407, 0x900001c0, 0x80081540, + 0x59a00209, 0x59a01c09, 0x900001c0, 0x800c1d40, + 0x83880400, 0x00000000, 0x0201f800, 0x00103a28, + 0x4a01d809, 0x001035ff, 0x1c01f000, 0x4031d800, + 0x58ef400b, 0x58ec0002, 0x82000580, 0x00000200, + 0x02000000, 0x00102304, 0x58ef400b, 0x59a0020b, + 0x8c000500, 0x04000008, 0x83880400, 0x00000000, + 0x4803c840, 0x4a03c842, 0x00000006, 0x04011000, + 0x497b8885, 0x4a034207, 0x000000e6, 0x0201f000, + 0x001022c0, 0x800409c0, 0x04000005, 0x4a034406, + 0x00000001, 0x0201f000, 0x0010230c, 0x0401fbe5, + 0x04020005, 0x4a034406, 0x00000002, 0x0201f000, + 0x0010230c, 0x497a5a04, 0x4a025c04, 0x00008000, + 0x59a00406, 0x800001c0, 0x02000000, 0x00102310, + 0x82001580, 0x000000ff, 0x04000005, 0x82001480, + 0x00000004, 0x02021000, 0x00102310, 0x40001000, + 0x0201f800, 0x00101fbf, 0x04020005, 0x4a034406, + 0x00000003, 0x0201f000, 0x0010230c, 0x4a01d809, + 0x0010363a, 0x1c01f000, 0x592c0005, 0x82000580, + 0x01000000, 0x02020000, 0x001022c0, 0x4a034406, + 0x00000004, 0x0201f000, 0x0010230c, 0x59a01406, + 0x8c081508, 0x04020007, 0x800409c0, 0x04000005, + 0x4a034406, 0x00000001, 0x0201f000, 0x0010230c, + 0x59a01c07, 0x820c0480, 0x00001000, 0x02021000, + 0x00102310, 0x497b2804, 0x497b2805, 0x497b281c, + 0x497b281d, 0x497b281f, 0x497b2820, 0x497b2822, + 0x497b2823, 0x80000580, 0x0201f800, 0x001015fe, + 0x59a80805, 0x8c081500, 0x04000004, 0x82040d40, + 0x00000011, 0x0401f004, 0x8c081506, 0x04000002, + 0x84040d42, 0x84040d0a, 0x48075005, 0x4202d800, + 0x00000001, 0x82081500, 0x000000e0, 0x8008010a, + 0x0c020036, 0x0201f800, 0x0010513b, 0x04020009, + 0x4a035033, 0x00000001, 0x0201f800, 0x001050a2, + 0x0401f01f, 0x4a035033, 0x00000000, 0x0401f7fb, + 0x497b5032, 0x0201f800, 0x00104142, 0x0201f800, + 0x00106c55, 0x0201f800, 0x00106ede, 0x0201f800, + 0x00106c4b, 0x59a00a07, 0x480788a7, 0x59c400a3, + 0x82000500, 0xfeffffff, 0x82000540, 0x80018000, + 0x40000800, 0x84040d20, 0x480388a3, 0x480788a3, + 0x497b504e, 0x42000800, 0x0000002d, 0x42001000, + 0x001041bc, 0x0201f800, 0x00105f69, 0x59a00407, + 0x800000c2, 0x800008c4, 0x8005d400, 0x42000000, + 0x0000ffff, 0x0201f800, 0x0010513b, 0x04000003, + 0x59a00207, 0x80000110, 0x0201f800, 0x00103afc, + 0x0201f000, 0x001022c0, 0x0010366d, 0x00103670, + 0x00103678, 0x00102310, 0x00103675, 0x00102310, + 0x00102310, 0x00102310, 0x836c0580, 0x00000003, + 0x04000005, 0x4a034406, 0x00000007, 0x0201f000, + 0x0010230c, 0x59a03c06, 0x59a00407, 0x59a04a07, + 0x902449c0, 0x80244d40, 0x59a00409, 0x59a05209, + 0x902851c0, 0x80285540, 0x0401fb46, 0x04020005, + 0x4a034406, 0x00000002, 0x0201f000, 0x0010230c, + 0x417a8800, 0x41783000, 0x497b4001, 0x497b4004, + 0x832c4400, 0x00000005, 0x48234002, 0x8c1c3d04, + 0x04020078, 0x0201f800, 0x00020245, 0x0402002a, + 0x0201f800, 0x001049e7, 0x04000004, 0x0201f800, + 0x001048e3, 0x04020024, 0x8c1c3d00, 0x04000008, + 0x59340009, 0x44004000, 0x59340008, 0x80204000, + 0x44004000, 0x80204000, 0x0401f007, 0x59340007, + 0x44004000, 0x59340006, 0x80204000, 0x44004000, + 0x80204000, 0x83440580, 0x000007fe, 0x0400000d, + 0x83440580, 0x000007fc, 0x0400000a, 0x0201f800, + 0x001049f3, 0x04000003, 0x85468d5e, 0x0401f005, + 0x0201f800, 0x00104838, 0x04020002, 0x85468d5e, + 0x45444000, 0x85468d1e, 0x80204000, 0x82183400, + 0x00000003, 0x81468800, 0x83440480, 0x000007f0, + 0x0400100e, 0x8c1c3d06, 0x04000010, 0x83440580, + 0x000007f0, 0x04020004, 0x42028800, 0x000007fe, + 0x0401f006, 0x83440580, 0x000007ff, 0x04020007, + 0x42028800, 0x000007fc, 0x82180580, 0x0000000f, + 0x0400000b, 0x0401f7c0, 0x801831c0, 0x04020006, + 0x59a00801, 0x800408c4, 0x48074406, 0x0201f000, + 0x001022c0, 0x4a034004, 0x00000001, 0x49474000, + 0x59a00001, 0x80180400, 0x48034001, 0x481f4003, + 0x4a01d801, 0x00000000, 0x4819d804, 0x59a00002, + 0x4801d803, 0x4825d807, 0x4829d808, 0x4000a800, + 0x4000a000, 0x4018b000, 0x0201f800, 0x0010ab17, + 0x40ec1000, 0x0201f800, 0x00100858, 0x4a01d809, + 0x0010372a, 0x1c01f000, 0x4031d800, 0x58ef400b, + 0x58ec0002, 0x82000580, 0x00000200, 0x02000000, + 0x00102304, 0x59a00004, 0x80000540, 0x04020008, + 0x59a28800, 0x59a04002, 0x59a03803, 0x41783000, + 0x58ec4807, 0x58ec5008, 0x0401f78f, 0x59a00801, + 0x800408c4, 0x48074406, 0x0201f000, 0x001022c0, + 0x0201f800, 0x00020245, 0x0402002f, 0x0201f800, + 0x001049e7, 0x04000004, 0x0201f800, 0x001048e3, + 0x04020029, 0x83440580, 0x000007fe, 0x04000011, + 0x83440580, 0x000007fc, 0x0400000e, 0x0201f800, + 0x001049f3, 0x04000005, 0x59340403, 0x8400055e, + 0x48026c03, 0x0401f007, 0x0201f800, 0x00104838, + 0x04020004, 0x59340403, 0x8400055e, 0x48026c03, + 0x4134a000, 0x4020a800, 0x4200b000, 0x00000006, + 0x0201f800, 0x0010ab17, 0x59340007, 0x4400a800, + 0x59340006, 0x4800a801, 0x59340009, 0x4800a802, + 0x59340008, 0x4800a803, 0x59340403, 0x8400051e, + 0x48026c03, 0x82204400, 0x0000000a, 0x82183400, + 0x0000000a, 0x81468800, 0x83440480, 0x000007f0, + 0x0400100e, 0x8c1c3d06, 0x04000010, 0x83440580, + 0x000007f0, 0x04020004, 0x42028800, 0x000007fe, + 0x0401f006, 0x83440580, 0x000007ff, 0x04020007, + 0x42028800, 0x000007fc, 0x82180580, 0x0000000a, + 0x0400000b, 0x0401f7bb, 0x801831c0, 0x04020006, + 0x59a00801, 0x800408c4, 0x48074406, 0x0201f000, + 0x001022c0, 0x4a034004, 0x00000001, 0x49474000, + 0x59a00001, 0x80180400, 0x48034001, 0x481f4003, + 0x4a01d801, 0x00000000, 0x4819d804, 0x59a00002, + 0x4801d803, 0x4825d807, 0x4829d808, 0x40ec1000, + 0x0201f800, 0x00100858, 0x4a01d809, 0x001037a1, + 0x1c01f000, 0x4031d800, 0x58ef400b, 0x58ec0002, + 0x82000580, 0x00000200, 0x02000000, 0x00102304, + 0x59a00004, 0x80000540, 0x04020008, 0x59a28800, + 0x59a04002, 0x59a03803, 0x41783000, 0x58ec4807, + 0x58ec5008, 0x0401f78f, 0x59a00801, 0x800408c4, + 0x48074406, 0x0201f000, 0x001022c0, 0x42002800, + 0x0000007e, 0x59a00c06, 0x59a01207, 0x59a01c07, + 0x59a02209, 0x82040500, 0x0000ff00, 0x840001c0, + 0x82003480, 0x00000020, 0x02001000, 0x00102310, + 0x80140480, 0x02001000, 0x00102310, 0x82040500, + 0x000000ff, 0x82003480, 0x00000020, 0x02001000, + 0x00102310, 0x80140480, 0x02001000, 0x00102310, + 0x82080500, 0x0000ff00, 0x840001c0, 0x82003480, + 0x00000020, 0x02001000, 0x00102310, 0x80140480, + 0x02001000, 0x00102310, 0x82080500, 0x000000ff, + 0x82003480, 0x00000020, 0x02001000, 0x00102310, + 0x80140480, 0x02001000, 0x00102310, 0x820c0500, + 0x0000ff00, 0x840001c0, 0x82003480, 0x00000020, + 0x02001000, 0x00102310, 0x80140480, 0x02001000, + 0x00102310, 0x820c0500, 0x000000ff, 0x82003480, + 0x00000020, 0x02001000, 0x00102310, 0x80140480, + 0x02001000, 0x00102310, 0x82100500, 0x0000ff00, + 0x840001c0, 0x82003480, 0x00000020, 0x02001000, + 0x00102310, 0x80140480, 0x02001000, 0x00102310, + 0x82100500, 0x000000ff, 0x82003480, 0x00000020, + 0x02001000, 0x00102310, 0x80140480, 0x02001000, + 0x00102310, 0x900401c0, 0x80080d40, 0x900c01c0, + 0x80101d40, 0x83a83400, 0x0000003a, 0x44043000, + 0x80183000, 0x440c3000, 0x0201f000, 0x001022c0, + 0x0401f9ec, 0x04020005, 0x4a034406, 0x00000002, + 0x0201f000, 0x0010230c, 0x42000800, 0x0000000c, + 0x0401f853, 0x4a01d809, 0x00103820, 0x1c01f000, + 0x4031d800, 0x58ee580d, 0x58ef400b, 0x58ec0002, + 0x82000580, 0x00000200, 0x02000000, 0x00102304, + 0x832ca400, 0x00000004, 0x4200b000, 0x0000000c, + 0x40c8a800, 0x0201f800, 0x0010ab17, 0x58c80200, + 0x80000540, 0x04000034, 0x58c80400, 0x82000500, + 0xfffffffb, 0x04020030, 0x58c80401, 0x80000540, + 0x0400002d, 0x82000480, 0x0000ff01, 0x0402102a, + 0x58c80202, 0x82000480, 0x0000005c, 0x04001026, + 0x0201f800, 0x001063a3, 0x58c80c08, 0x58c80204, + 0x80040480, 0x04001020, 0x58c80204, 0x82000480, + 0x00000005, 0x0402101c, 0x58c80205, 0x58c80c08, + 0x80040902, 0x80040480, 0x04001017, 0x58c80c08, + 0x0201f800, 0x001062f1, 0x0400001b, 0x0201f800, + 0x001061b9, 0x04020012, 0x4979940b, 0x59c408a3, + 0x82040d40, 0x00000002, 0x480788a3, 0x4a038830, + 0x00000001, 0x4a038832, 0x01ffffff, 0x58c80202, + 0x48030804, 0x0201f800, 0x0010619b, 0x0201f000, + 0x001022c0, 0x0201f000, 0x00102310, 0x0201f800, + 0x001063f5, 0x0201f800, 0x00106402, 0x0201f800, + 0x001062e4, 0x0201f000, 0x0010230c, 0x4c000000, + 0x59a01207, 0x59a00407, 0x900811c0, 0x80081540, + 0x59a01a09, 0x59a00409, 0x900c19c0, 0x800c1d40, + 0x5c000000, 0x0401f1ac, 0x59840000, 0x82000580, + 0x00000000, 0x04000054, 0x59840002, 0x8c000504, + 0x04000051, 0x84000546, 0x48030802, 0x0201f800, + 0x001062e4, 0x59c408a3, 0x82040d00, 0xfffffffd, + 0x480788a3, 0x4c5c0000, 0x4200b800, 0x0010ac00, + 0x505e6800, 0x813669c0, 0x04000008, 0x5936600e, + 0x813261c0, 0x04000005, 0x0201f800, 0x001062d5, + 0x02000800, 0x001064ad, 0x805cb800, 0x825c0580, + 0x0010b3f0, 0x040207f3, 0x59866003, 0x813261c0, + 0x0400000b, 0x59300406, 0x82000580, 0x00000009, + 0x02020800, 0x001005d8, 0x5930b800, 0x0201f800, + 0x001062c1, 0x405e6000, 0x0401f7f5, 0x497b0803, + 0x4200b800, 0x0010b51b, 0x505e6000, 0x813261c0, + 0x04000011, 0x59300406, 0x82000580, 0x00000009, + 0x0402000d, 0x59300203, 0x82000580, 0x00000004, + 0x04020009, 0x59326809, 0x813669c0, 0x02020800, + 0x001005d8, 0x0201f800, 0x00100e99, 0x0201f800, + 0x001062c1, 0x4578b800, 0x805cb800, 0x825c0580, + 0x0010b523, 0x040207e9, 0x42000800, 0x0010b519, + 0x49780801, 0x49780800, 0x59a80069, 0x82000400, + 0x00000007, 0x48035069, 0x0201f800, 0x001063f5, + 0x0201f800, 0x00106402, 0x5c00b800, 0x0201f800, + 0x001061b4, 0x0201f000, 0x001022c0, 0x836c0580, + 0x00000003, 0x04000005, 0x4a034406, 0x00000007, + 0x0201f000, 0x0010230c, 0x59a00407, 0x59a02207, + 0x901021c0, 0x80102540, 0x59a00409, 0x59a02a09, + 0x901429c0, 0x80142d40, 0x0401f91e, 0x04020005, + 0x4a034406, 0x00000002, 0x0201f000, 0x0010230c, + 0x417a8800, 0x41781800, 0x497b4001, 0x497b4003, + 0x832c3400, 0x00000004, 0x481b4002, 0x41440000, + 0x81ac0400, 0x50026800, 0x813669c0, 0x0400000b, + 0x0201f800, 0x001049e7, 0x04020008, 0x59340002, + 0x48003000, 0x49443001, 0x82183400, 0x00000002, + 0x820c1c00, 0x00000002, 0x81468800, 0x83440480, + 0x00000800, 0x04000005, 0x820c0480, 0x00000010, + 0x0402100b, 0x0401f7ea, 0x800c19c0, 0x04020006, + 0x59a00801, 0x80040902, 0x48074406, 0x0201f000, + 0x001022c0, 0x4a034003, 0x00000001, 0x49474000, + 0x59a00001, 0x800c0400, 0x48034001, 0x40ec1000, + 0x4a001001, 0x00000000, 0x480c1004, 0x59a00002, + 0x48001003, 0x48101007, 0x48141008, 0x0201f800, + 0x00100858, 0x4a01d809, 0x00103920, 0x1c01f000, + 0x4031d800, 0x58ef400b, 0x58ec0002, 0x82000580, + 0x00000200, 0x02000000, 0x00102304, 0x59a00003, + 0x80000540, 0x04020008, 0x59a28800, 0x59a03002, + 0x41781800, 0x40ec1000, 0x58082007, 0x58082808, + 0x0401f7bf, 0x59a00801, 0x80040902, 0x48074406, + 0x0201f000, 0x001022c0, 0x800409c0, 0x04000005, + 0x4a034406, 0x00000001, 0x0201f000, 0x0010230c, + 0x59a80026, 0x8c00050a, 0x04020007, 0x8c000506, + 0x04020005, 0x4a034406, 0x00000016, 0x0201f000, + 0x0010230c, 0x0401f8bb, 0x04020005, 0x4a034406, + 0x00000002, 0x0201f000, 0x0010230c, 0x59a00c06, + 0x80040902, 0x59a00407, 0x59a01207, 0x900811c0, + 0x80081540, 0x59a00409, 0x59a01a09, 0x900c19c0, + 0x800c1d40, 0x832c0400, 0x00000005, 0x0401f8ce, + 0x4a01d809, 0x0010395b, 0x1c01f000, 0x4031d800, + 0x58ef400b, 0x58ee580d, 0x58ec0002, 0x82000580, + 0x00000200, 0x02000000, 0x00102304, 0x592c0009, + 0x0201f800, 0x00105c9a, 0x02000800, 0x001045a6, + 0x02020000, 0x00102310, 0x49474001, 0x481a6802, + 0x592c000a, 0x82001d80, 0x70000000, 0x04020007, + 0x0401f890, 0x04020011, 0x4a034406, 0x00000002, + 0x0201f000, 0x0010230c, 0x82001d80, 0x72000000, + 0x02020000, 0x00102310, 0x0401f886, 0x04020885, + 0x04020884, 0x04020005, 0x4a034406, 0x00000002, + 0x0201f000, 0x0010230c, 0x58ee580d, 0x4a025c04, + 0x00008000, 0x497a5a04, 0x592c3208, 0x80183102, + 0x592c1801, 0x4a001805, 0x01000000, 0x0201f800, + 0x001090d1, 0x04020005, 0x4a034406, 0x00000003, + 0x0201f000, 0x0010230c, 0x4a01d809, 0x00103995, + 0x1c01f000, 0x592c4000, 0x592c0005, 0x82000580, + 0x01000000, 0x04020005, 0x4a034406, 0x00000004, + 0x0201f000, 0x0010230c, 0x832c3c00, 0x00000005, + 0x401ca000, 0x401ca800, 0x5820280a, 0x4200b000, + 0x00000002, 0x82143580, 0x70000000, 0x04000003, + 0x4200b000, 0x0000000f, 0x0201f800, 0x0010ab28, + 0x401c0000, 0x58201006, 0x58201807, 0x58202205, + 0x80102102, 0x82143580, 0x70000000, 0x04020008, + 0x82103480, 0x00000002, 0x02001000, 0x00102310, + 0x42000800, 0x00000002, 0x0401f06e, 0x82143580, + 0x72000000, 0x02020000, 0x00102310, 0x82103480, + 0x0000002a, 0x02001000, 0x00102310, 0x42000800, + 0x0000000f, 0x0401f863, 0x4a01d809, 0x001039c9, + 0x1c01f000, 0x4031d800, 0x58ef400b, 0x58ee580e, + 0x58ec0002, 0x82000580, 0x00000200, 0x02000000, + 0x00102304, 0x592e5800, 0x832c0c00, 0x00000005, + 0x4004a000, 0x4004a800, 0x4200b000, 0x0000000f, + 0x0201f800, 0x0010ab28, 0x40ec1000, 0x4a001001, + 0x00000000, 0x4a001004, 0x0000000f, 0x48041003, + 0x0201f800, 0x00100858, 0x4a01d809, 0x001039e5, + 0x1c01f000, 0x4031d800, 0x58ef400b, 0x58ee580e, + 0x58ec0002, 0x82000580, 0x00000200, 0x02000000, + 0x00102304, 0x832c0c00, 0x00000005, 0x4004a000, + 0x4004a800, 0x4200b000, 0x0000000c, 0x0201f800, + 0x0010ab28, 0x40ec1000, 0x4a001001, 0x00000000, + 0x4a001004, 0x0000000c, 0x48041003, 0x0201f800, + 0x00100858, 0x4a01d809, 0x001022b9, 0x1c01f000, + 0x0201f800, 0x001007e4, 0x04000010, 0x497a5800, + 0x58ec000d, 0x80000540, 0x04020004, 0x492dd80d, + 0x492dd80e, 0x0401f007, 0x58ec000e, 0x48025800, + 0x82000400, 0x00000001, 0x452c0000, 0x492dd80e, + 0x832c0400, 0x00000004, 0x492fc857, 0x4803c857, + 0x1c01f000, 0x4d2c0000, 0x48efc857, 0x58ec400d, + 0x4823c857, 0x802041c0, 0x04000007, 0x40225800, + 0x592c4001, 0x497a5801, 0x0201f800, 0x001007f4, + 0x0401f7f8, 0x4979d80d, 0x4979d80e, 0x5c025800, + 0x1c01f000, 0x42003000, 0x00000001, 0x0401f003, + 0x42003000, 0x00000000, 0x4803c857, 0x4807c857, + 0x480bc857, 0x480fc857, 0x481bc857, 0x48efc857, + 0x4819d801, 0x800409c0, 0x02000800, 0x001005d8, + 0x4805d804, 0x4801d803, 0x4809d807, 0x480dd808, + 0x40ec1000, 0x0201f800, 0x00100858, 0x4a01d809, + 0x001022b9, 0x1c01f000, 0x80002d80, 0x480bc857, + 0x480fc857, 0x4813c857, 0x4817c857, 0x4d2c0000, + 0x4da00000, 0x42034000, 0x0010b4a4, 0x59a00017, + 0x800001c0, 0x04020013, 0x04006012, 0x480bc020, + 0x480fc021, 0x4813c022, 0x4817c023, 0x900811c0, + 0x82081540, 0x00000012, 0x480bc011, 0x59e00017, + 0x8c000508, 0x04020004, 0x4203e000, 0x30000001, + 0x0401f053, 0x4a03c017, 0x00000002, 0x0401f7fb, + 0x4c040000, 0x4c1c0000, 0x80000800, 0x48074017, + 0x59a0381a, 0x481fc857, 0x801c39c0, 0x04020027, + 0x82000480, 0x0000000a, 0x04021010, 0x59a00018, + 0x80000000, 0x48034018, 0x59a00219, 0x82000400, + 0x00000002, 0x82000c80, 0x00000013, 0x48034219, + 0x04001003, 0x497b4219, 0x41780000, 0x59a03816, + 0x801c3c00, 0x0401f030, 0x4803c856, 0x0201f800, + 0x001007e4, 0x04000007, 0x492f401a, 0x492f401b, + 0x412c3800, 0x497b421c, 0x497a5813, 0x0401f026, + 0x59880051, 0x80000000, 0x48031051, 0x59a00017, + 0x80000040, 0x48034017, 0x59a00219, 0x59a03816, + 0x801c3c00, 0x0401f01c, 0x59a0021c, 0x82000400, + 0x00000002, 0x82000c80, 0x00000012, 0x04021004, + 0x4803421c, 0x801c3c00, 0x0401f013, 0x0201f800, + 0x001007e4, 0x0402000b, 0x59880051, 0x80000000, + 0x48031051, 0x59a00017, 0x80000040, 0x48034017, + 0x4803c856, 0x59a0021c, 0x801c3c00, 0x0401f006, + 0x492f401a, 0x492c3813, 0x412c3800, 0x497b421c, + 0x497a5813, 0x48083c00, 0x480c3a00, 0x48103c01, + 0x48143a01, 0x5c003800, 0x5c000800, 0x5c034000, + 0x5c025800, 0x1c01f000, 0x480fc857, 0x4813c857, + 0x481bc857, 0x42000000, 0x0010b813, 0x0201f800, + 0x0010aa47, 0x801800d0, 0x40002800, 0x42001000, + 0x00008014, 0x0401f786, 0x4c000000, 0x599c0017, + 0x8c000512, 0x5c000000, 0x1c01f000, 0x4c000000, + 0x599c0018, 0x8c00050e, 0x5c000000, 0x1c01f000, + 0x59a80821, 0x800409c0, 0x04000005, 0x4a034406, + 0x00000001, 0x0201f000, 0x0010230c, 0x836c0580, + 0x00000003, 0x04000005, 0x4a034406, 0x00000007, + 0x0201f000, 0x0010230c, 0x599c0017, 0x8c00050a, + 0x04000005, 0x4a034406, 0x00000008, 0x0201f000, + 0x0010230c, 0x59340405, 0x8c000508, 0x04020004, + 0x8c00050a, 0x02020000, 0x001034db, 0x497a5a04, + 0x497a5805, 0x4a025c04, 0x00008000, 0x0201f800, + 0x00109176, 0x04020005, 0x4a034406, 0x00000003, + 0x0201f000, 0x0010230c, 0x4a01d809, 0x00103aed, + 0x1c01f000, 0x592c0005, 0x82000580, 0x01000000, + 0x04020005, 0x4a034406, 0x00000004, 0x0201f000, + 0x0010230c, 0x59a28c06, 0x0201f800, 0x00020245, + 0x02020000, 0x00102310, 0x0201f000, 0x001034db, + 0x82001580, 0x0000ffff, 0x04000009, 0x0201f800, + 0x00105c9a, 0x02000800, 0x00020245, 0x0402000c, + 0x0201f800, 0x00105fae, 0x0401f009, 0x42028800, + 0x000007ef, 0x0201f800, 0x00020245, 0x02000800, + 0x00105fae, 0x81468840, 0x040217fb, 0x1c01f000, + 0x4803c856, 0x4c0c0000, 0x4d340000, 0x4d440000, + 0x42028800, 0x000007fe, 0x0201f800, 0x00020245, + 0x04020009, 0x5934180a, 0x820c1d00, 0x00000001, + 0x820c1d80, 0x00000001, 0x42001000, 0x0000801b, + 0x0401ff1e, 0x5c028800, 0x5c026800, 0x5c001800, + 0x1c01f000, 0x599c0017, 0x8c000508, 0x1c01f000, + 0x48efc857, 0x04011000, 0x48efc840, 0x4a03c842, + 0x00000011, 0x40000000, 0x040117ff, 0x4a01d80f, + 0xbeefbeef, 0x1c01f000, 0x497b4000, 0x497b4001, + 0x497b4002, 0x497b4003, 0x497b4004, 0x1c01f000, + 0x59c400a4, 0x4c580000, 0x4c500000, 0x4c540000, + 0x82000500, 0x0000000f, 0x82000480, 0x00000007, + 0x0400100a, 0x82006c80, 0x00000006, 0x02021800, + 0x001005d8, 0x0c01f807, 0x5c00a800, 0x5c00a000, + 0x5c00b000, 0x1c01f000, 0x0401f906, 0x0401f7fb, + 0x00103b51, 0x00103b57, 0x00103b7c, 0x00103b9e, + 0x00103c59, 0x59c40806, 0x8c040d00, 0x04020003, + 0x84040d40, 0x48078806, 0x1c01f000, 0x59c40005, + 0x8c000534, 0x02020000, 0x0010429e, 0x4a038805, + 0xffffffff, 0x42006000, 0x00020000, 0x0201f800, + 0x00104282, 0x59a80015, 0x82000500, 0xfffffffa, + 0x84000542, 0x48035015, 0x497b5026, 0x42000800, + 0x0010be21, 0x45780800, 0x497b5013, 0x42006000, + 0xffefffff, 0x42006800, 0x40000000, 0x0201f800, + 0x0010427d, 0x59c40006, 0x82000500, 0xffffff0f, + 0x48038806, 0x42000800, 0x00000010, 0x42001000, + 0x001041f3, 0x0201f800, 0x00105f83, 0x0401f001, + 0x42006000, 0xffffffff, 0x42006800, 0x00800000, + 0x0201f800, 0x0010427d, 0x4200b000, 0x000000c8, + 0x59c400a4, 0x82000500, 0x0000000f, 0x82000580, + 0x0000000a, 0x0400000f, 0x8058b040, 0x040207f9, + 0x497b5014, 0x42006000, 0xbf7fffff, 0x42006800, + 0x00018000, 0x0201f800, 0x0010427d, 0x42006000, + 0xfffeffff, 0x41786800, 0x0201f000, 0x0010427d, + 0x497b5014, 0x4a035012, 0x00000000, 0x80000580, + 0x0201f000, 0x00104289, 0x4a038805, 0xffffffff, + 0x59a80012, 0x82000c80, 0x00000004, 0x02021800, + 0x001005d8, 0x0c01f001, 0x00103ba9, 0x00103bd6, + 0x00103c4f, 0x4803c856, 0x59c400a3, 0x8400051e, + 0x480388a3, 0x4a035012, 0x00000001, 0x59c40008, + 0x8400054e, 0x48038808, 0x0201f800, 0x00104263, + 0x42007800, 0x0010b54c, 0x4a007806, 0x11010000, + 0x4200a000, 0x0010b402, 0x4200a800, 0x0010b553, + 0x4200b000, 0x00000002, 0x0201f800, 0x0010ab17, + 0x497b8802, 0x42000800, 0x00000003, 0x497b504a, + 0x0201f800, 0x0010416e, 0x4a03504a, 0x00000001, + 0x497b5016, 0x0201f800, 0x00104290, 0x42006000, + 0xffffffff, 0x42006800, 0x00080000, 0x0201f800, + 0x0010427d, 0x42006000, 0xfff7ffff, 0x41786800, + 0x0201f000, 0x0010427d, 0x59a80016, 0x497b5016, + 0x80002540, 0x04000066, 0x59c40004, 0x82000500, + 0x00000003, 0x04020071, 0x59a80815, 0x8c040d02, + 0x0400004b, 0x82100580, 0x0000000c, 0x0402004f, + 0x82100400, 0x00000018, 0x8000b104, 0x41cc1000, + 0x42001800, 0x0010b54c, 0x50080800, 0x500c0000, + 0x80040580, 0x0402001a, 0x80081000, 0x800c1800, + 0x8058b040, 0x040207f9, 0x0201f800, 0x00104290, + 0x42006000, 0xffffffff, 0x42006800, 0x00500000, + 0x0201f800, 0x0010427d, 0x4a035012, 0x00000002, + 0x4a035014, 0x00000002, 0x42000800, 0x000007d0, + 0x42001000, 0x00104148, 0x0201f800, 0x0010606e, + 0x0201f800, 0x00104263, 0x0401f048, 0x59cc0806, + 0x82040d80, 0x11010000, 0x04020028, 0x59cc0800, + 0x82040500, 0x00ffffff, 0x0400001a, 0x82000580, + 0x000000ef, 0x04020017, 0x59cc0801, 0x82040500, + 0x00ffffff, 0x82000580, 0x000000ef, 0x04020011, + 0x83cca400, 0x00000007, 0x4200a800, 0x0010b402, + 0x4200b000, 0x00000002, 0x50500800, 0x50540000, + 0x80040480, 0x04001007, 0x04020010, 0x8050a000, + 0x8054a800, 0x8058b040, 0x040207f8, 0x0401f00b, + 0x59a80015, 0x84000502, 0x48035015, 0x41cca000, + 0x4200a800, 0x0010b54c, 0x4200b000, 0x00000009, + 0x0201f800, 0x0010ab17, 0x0201f800, 0x00104290, + 0x42006000, 0xffffffff, 0x42006800, 0x00080000, + 0x0201f800, 0x0010427d, 0x42006000, 0xfff7ffff, + 0x41786800, 0x0201f800, 0x0010427d, 0x42006000, + 0xffffffff, 0x42006800, 0x00004000, 0x0201f800, + 0x0010427d, 0x59c40004, 0x82000500, 0x00000003, + 0x04020006, 0x497b5016, 0x42000800, 0x00000003, + 0x0201f000, 0x0010416e, 0x1c01f000, 0x1c01f000, + 0x59a80014, 0x82006d80, 0x0000000f, 0x04000005, + 0x82000580, 0x0000001b, 0x02020800, 0x00104139, + 0x1c01f000, 0x59a80015, 0x84000506, 0x48035015, + 0x497b504a, 0x59a80014, 0x82000c80, 0x0000001e, + 0x02021800, 0x001005d8, 0x0c01f001, 0x00103c97, + 0x00103cac, 0x00103cd5, 0x00103cf0, 0x00103d14, + 0x00103d45, 0x00103d68, 0x00103d9b, 0x00103dbe, + 0x00103de4, 0x00103e21, 0x00103e48, 0x00103e5f, + 0x00103e71, 0x00103e8a, 0x00103ea0, 0x00103ea5, + 0x00103ecd, 0x00103ef0, 0x00103f16, 0x00103f39, + 0x00103f6c, 0x00103fae, 0x00103fd8, 0x00103ff0, + 0x00104030, 0x00104049, 0x0010405c, 0x0010405d, + 0x4803c856, 0x4202d800, 0x00000007, 0x0201f800, + 0x0010513b, 0x04000007, 0x42006000, 0xffffffd7, + 0x41786800, 0x0201f800, 0x0010427d, 0x0401f00b, + 0x59c40006, 0x82000500, 0xffffff0f, 0x48038806, + 0x42001000, 0x000000f0, 0x0201f800, 0x0010193d, + 0x0201f800, 0x00105098, 0x1c01f000, 0x4803c856, + 0x42006000, 0xbf7fffff, 0x42006800, 0x00400000, + 0x0201f800, 0x0010427d, 0x4a035014, 0x00000001, + 0x42001000, 0x001041f3, 0x0201f800, 0x00105fa4, + 0x0201f800, 0x001041f8, 0x42000800, 0x000007d0, + 0x42001000, 0x00104148, 0x0201f000, 0x0010606e, + 0x59a80016, 0x82000580, 0x00000014, 0x04020025, + 0x4803c857, 0x42006000, 0xffbfffff, 0x41786800, + 0x0201f800, 0x0010427d, 0x59c40004, 0x82000500, + 0x00000003, 0x0402001b, 0x59cc1006, 0x82081580, + 0x11020000, 0x04020016, 0x59cc1007, 0x8c08153e, + 0x0400000b, 0x59a80015, 0x8c000504, 0x04020008, + 0x42000000, 0x0010b83f, 0x0201f800, 0x0010aa47, + 0x59a80015, 0x84000544, 0x48035015, 0x42001000, + 0x00104148, 0x0201f800, 0x00105f90, 0x4a035014, + 0x00000010, 0x0401f9d4, 0x0401f002, 0x497b5016, + 0x1c01f000, 0x4803c856, 0x4a035014, 0x00000003, + 0x42006000, 0xbf3fffff, 0x42006800, 0x00100000, + 0x0201f800, 0x0010427d, 0x42001000, 0x001041f3, + 0x0201f800, 0x00105fa4, 0x0201f800, 0x001041f8, + 0x42001000, 0x00104148, 0x0201f800, 0x00105f90, + 0x42007800, 0x0010b552, 0x46007800, 0x11020000, + 0x42000800, 0x00000005, 0x0201f000, 0x0010416e, + 0x59a80016, 0x80000540, 0x04000021, 0x4803c857, + 0x42001000, 0x00104148, 0x0201f800, 0x00105f90, + 0x59a80016, 0x82000580, 0x00000014, 0x04020016, + 0x59cc1006, 0x82081580, 0x11020000, 0x04020012, + 0x59cc1007, 0x8c08153e, 0x0400000b, 0x59a80015, + 0x8c000504, 0x04020008, 0x42000000, 0x0010b83f, + 0x0201f800, 0x0010aa47, 0x59a80015, 0x84000544, + 0x48035015, 0x4a035014, 0x00000004, 0x0401f805, + 0x0401f003, 0x0201f800, 0x00104139, 0x1c01f000, + 0x4803c856, 0x4a035014, 0x00000005, 0x83cca400, + 0x00000006, 0x4200a800, 0x0010b552, 0x4200b000, + 0x00000005, 0x0201f800, 0x0010ab17, 0x42007800, + 0x0010b552, 0x46007800, 0x11030000, 0x0201f800, + 0x0010413e, 0x04020014, 0x59a80015, 0x8c000500, + 0x04020011, 0x59a80810, 0x82040580, 0x00ffffff, + 0x0400000d, 0x82040d00, 0x000000ff, 0x82040400, + 0x0010210e, 0x50000800, 0x80040910, 0x42001000, + 0x00000004, 0x0401fb9b, 0x0400000b, 0x0201f800, + 0x0010420d, 0x4200b000, 0x00000004, 0x83cca400, + 0x00000007, 0x4200a800, 0x0010b553, 0x0201f800, + 0x0010ab17, 0x42000800, 0x00000005, 0x0201f000, + 0x0010416e, 0x59a80016, 0x80000540, 0x04000020, + 0x4803c857, 0x42001000, 0x00104148, 0x0201f800, + 0x00105f90, 0x59a80016, 0x82000580, 0x00000014, + 0x04020016, 0x59cc1006, 0x82081580, 0x11030000, + 0x04020012, 0x59cc1007, 0x8c08153e, 0x0400000b, + 0x59a80015, 0x8c000504, 0x04020008, 0x42000000, + 0x0010b83f, 0x0201f800, 0x0010aa47, 0x59a80015, + 0x84000544, 0x48035015, 0x4a035014, 0x00000006, + 0x0401f804, 0x0401f002, 0x0401fbd3, 0x1c01f000, + 0x4803c856, 0x4a035014, 0x00000007, 0x83cca400, + 0x00000006, 0x4200a800, 0x0010b552, 0x4200b000, + 0x00000005, 0x0201f800, 0x0010ab17, 0x42007800, + 0x0010b552, 0x46007800, 0x11040000, 0x0401fbc7, + 0x04020020, 0x59a80015, 0x8c000500, 0x0402001d, + 0x599c0017, 0x8c000500, 0x0400001a, 0x599c1402, + 0x82080480, 0x0000007f, 0x02021800, 0x001005d8, + 0x4c080000, 0x82081400, 0x0010210e, 0x50081000, + 0x82081500, 0x000000ff, 0x480b5010, 0x42000800, + 0x00000003, 0x0201f800, 0x00106c78, 0x5c000800, + 0x42001000, 0x00000004, 0x0401fb3e, 0x04000005, + 0x0401fd2b, 0x04000003, 0x0201f800, 0x001015fe, + 0x42000800, 0x00000005, 0x0401f3d4, 0x59a80016, + 0x80000540, 0x04000020, 0x4803c857, 0x42001000, + 0x00104148, 0x0201f800, 0x00105f90, 0x59a80016, + 0x82000580, 0x00000014, 0x04020016, 0x59cc1006, + 0x82081580, 0x11040000, 0x04020012, 0x59cc1007, + 0x8c08153e, 0x0400000b, 0x59a80015, 0x8c000504, + 0x04020008, 0x42000000, 0x0010b83f, 0x0201f800, + 0x0010aa47, 0x59a80015, 0x84000544, 0x48035015, + 0x4a035014, 0x00000008, 0x0401f804, 0x0401f002, + 0x0401fb7d, 0x1c01f000, 0x4803c856, 0x4a035014, + 0x00000009, 0x83cca400, 0x00000006, 0x4200a800, + 0x0010b552, 0x4200b000, 0x00000005, 0x0201f800, + 0x0010ab17, 0x42007800, 0x0010b552, 0x46007800, + 0x11050100, 0x0401fb71, 0x0402000a, 0x59a80015, + 0x8c000500, 0x04020007, 0x0401fa8c, 0x04020005, + 0x82000540, 0x00000001, 0x0201f800, 0x001015fe, + 0x42000800, 0x00000005, 0x0401fb94, 0x0401fb63, + 0x04020ea4, 0x4d3c0000, 0x42027800, 0x00000001, + 0x0201f800, 0x00109874, 0x5c027800, 0x1c01f000, + 0x59a80016, 0x80000540, 0x0400003a, 0x4803c857, + 0x42001000, 0x00104148, 0x0201f800, 0x00105f90, + 0x59a80016, 0x82000580, 0x00000014, 0x04020030, + 0x59cc1006, 0x82080500, 0x11050000, 0x82000580, + 0x11050000, 0x0402002a, 0x8c081510, 0x04000014, + 0x59cc1007, 0x8c08153e, 0x0400000b, 0x59a80015, + 0x8c000504, 0x04020008, 0x42000000, 0x0010b83f, + 0x0201f800, 0x0010aa47, 0x59a80015, 0x84000544, + 0x48035015, 0x4a035013, 0x00000001, 0x4a035014, + 0x0000000a, 0x0401f818, 0x0401f016, 0x80000540, + 0x04020013, 0x59cc1007, 0x8c08153e, 0x0400000b, + 0x59a80015, 0x8c000504, 0x04020008, 0x42000000, + 0x0010b83f, 0x0201f800, 0x0010aa47, 0x59a80015, + 0x84000544, 0x48035015, 0x497b5013, 0x4a035014, + 0x0000000e, 0x0401f86d, 0x0401f002, 0x0401fb1a, + 0x1c01f000, 0x4803c856, 0x4a035014, 0x0000000b, + 0x42001000, 0x0010b553, 0x4008a800, 0x4200b000, + 0x00000020, 0x4600a800, 0xffffffff, 0x8054a800, + 0x8058b040, 0x040207fc, 0x42007800, 0x0010b552, + 0x46007800, 0x11060000, 0x42001000, 0x0010b553, + 0x0401fb0a, 0x04000005, 0x50080000, 0x46001000, + 0x00ffffff, 0x0401f00c, 0x50080800, 0x82040d00, + 0x0000ffff, 0x59a80010, 0x82000500, 0x000000ff, + 0x82000540, 0x00000100, 0x800000e0, 0x80040d40, + 0x44041000, 0x42000800, 0x00000021, 0x0401f327, + 0x59a80016, 0x80000540, 0x04000014, 0x4803c857, + 0x59a80016, 0x42001000, 0x00104148, 0x0201f800, + 0x00105f90, 0x59a80016, 0x82000580, 0x00000084, + 0x04020009, 0x59cc1006, 0x82081580, 0x11060000, + 0x04020005, 0x4a035014, 0x0000000c, 0x0401f804, + 0x0401f002, 0x0401fadc, 0x1c01f000, 0x4803c856, + 0x4a035014, 0x0000000d, 0x83cca400, 0x00000006, + 0x4200a800, 0x0010b552, 0x4200b000, 0x00000021, + 0x0201f800, 0x0010ab17, 0x42007800, 0x0010b552, + 0x46007800, 0x11070000, 0x42000800, 0x00000021, + 0x0401f2fe, 0x59a80016, 0x80000540, 0x04000016, + 0x4803c857, 0x59a80016, 0x42001000, 0x00104148, + 0x0201f800, 0x00105f90, 0x82000580, 0x00000084, + 0x0402000c, 0x59cc1006, 0x82081580, 0x11070000, + 0x04020008, 0x4a035013, 0x00000001, 0x0401fa91, + 0x4a035014, 0x0000000e, 0x0401f804, 0x0401f002, + 0x0401fab1, 0x1c01f000, 0x4803c856, 0x82040d40, + 0x00000001, 0x0401fbfc, 0x4a035014, 0x0000000f, + 0x497b5016, 0x42006000, 0xffffffff, 0x42006800, + 0x00300000, 0x0401fbe8, 0x42006000, 0xffdfffff, + 0x41786800, 0x0401fbe4, 0x42000800, 0x000007d0, + 0x42001000, 0x00104148, 0x0201f000, 0x00105f69, + 0x4803c856, 0x59a80016, 0x80000540, 0x04020296, + 0x1c01f000, 0x4803c856, 0x4a035014, 0x00000011, + 0x83cca400, 0x00000006, 0x4200a800, 0x0010b552, + 0x4200b000, 0x00000005, 0x0201f800, 0x0010ab17, + 0x4200a800, 0x0010b552, 0x4600a800, 0x11020000, + 0x0401fa8a, 0x04020015, 0x59a80010, 0x82000d00, + 0xffff0000, 0x04000011, 0x82000500, 0x000000ff, + 0x0400000e, 0x82000c00, 0x0010210e, 0x50040800, + 0x80040910, 0x82040580, 0x0000007e, 0x04000007, + 0x82040580, 0x00000080, 0x04000004, 0x42001000, + 0x00000004, 0x0401fa07, 0x42000800, 0x00000005, + 0x0401f2a2, 0x59a80016, 0x80000540, 0x04000020, + 0x4803c857, 0x42001000, 0x00104148, 0x0201f800, + 0x00105f90, 0x59a80016, 0x82000580, 0x00000014, + 0x04020016, 0x59cc1006, 0x82081580, 0x11030000, + 0x04020012, 0x59cc1007, 0x8c08153e, 0x0400000b, + 0x59a80015, 0x8c000504, 0x04020008, 0x42000000, + 0x0010b83f, 0x0201f800, 0x0010aa47, 0x59a80015, + 0x84000544, 0x48035015, 0x4a035014, 0x00000012, + 0x0401f804, 0x0401f002, 0x0401fa4b, 0x1c01f000, + 0x4803c856, 0x4a035014, 0x00000013, 0x83cca400, + 0x00000006, 0x4200a800, 0x0010b552, 0x4200b000, + 0x00000005, 0x0201f800, 0x0010ab17, 0x4200a800, + 0x0010b552, 0x4600a800, 0x11030000, 0x0401fa3f, + 0x04020013, 0x59a80015, 0x8c000500, 0x04020010, + 0x59a80810, 0x82040580, 0x00ffffff, 0x0400000c, + 0x82040d00, 0x000000ff, 0x82040400, 0x0010210e, + 0x50000800, 0x80040910, 0x42001000, 0x00000004, + 0x0401f9c0, 0x04000002, 0x0401fafb, 0x42000800, + 0x00000005, 0x0401f259, 0x59a80016, 0x80000540, + 0x04000020, 0x4803c857, 0x42001000, 0x00104148, + 0x0201f800, 0x00105f90, 0x59a80016, 0x82000580, + 0x00000014, 0x04020016, 0x59cc1006, 0x82081580, + 0x11040000, 0x04020012, 0x59cc1007, 0x8c08153e, + 0x0400000b, 0x59a80015, 0x8c000504, 0x04020008, + 0x42000000, 0x0010b83f, 0x0201f800, 0x0010aa47, + 0x59a80015, 0x84000544, 0x48035015, 0x4a035014, + 0x00000014, 0x0401f804, 0x0401f002, 0x0401fa02, + 0x1c01f000, 0x4803c856, 0x4a035014, 0x00000015, + 0x83cca400, 0x00000006, 0x4200a800, 0x0010b552, + 0x4200b000, 0x00000005, 0x0201f800, 0x0010ab17, + 0x4200a800, 0x0010b552, 0x4600a800, 0x11040000, + 0x0401f9f6, 0x04020020, 0x59a80015, 0x8c000500, + 0x0402001d, 0x599c0017, 0x8c000500, 0x0400001a, + 0x599c1402, 0x82080480, 0x0000007f, 0x02021800, + 0x001005d8, 0x4c080000, 0x82081400, 0x0010210e, + 0x50081000, 0x82081500, 0x000000ff, 0x480b5010, + 0x42000800, 0x00000003, 0x0201f800, 0x00106c78, + 0x5c000800, 0x42001000, 0x00000004, 0x0401f96d, + 0x04000005, 0x0201f800, 0x00103abf, 0x02020800, + 0x001015fe, 0x42000800, 0x00000005, 0x0401f203, + 0x59a80016, 0x80000540, 0x0400003f, 0x4803c857, + 0x42001000, 0x00104148, 0x0201f800, 0x00105f90, + 0x59a80016, 0x82000580, 0x00000014, 0x04020035, + 0x59cc1006, 0x82080500, 0x11050000, 0x82000580, + 0x11050000, 0x0402002f, 0x8c081510, 0x04000010, + 0x0401fb09, 0x59cc1007, 0x8c08153e, 0x0400000b, + 0x59a80015, 0x8c000504, 0x04020008, 0x42000000, + 0x0010b83f, 0x0201f800, 0x0010aa47, 0x59a80015, + 0x84000544, 0x48035015, 0x0401f013, 0x59cc1007, + 0x8c08153e, 0x0400000b, 0x59a80015, 0x8c000504, + 0x04020008, 0x42000000, 0x0010b83f, 0x0201f800, + 0x0010aa47, 0x59a80015, 0x84000544, 0x48035015, + 0x82000540, 0x00000001, 0x0401faeb, 0x497b5013, + 0x0401f003, 0x4a035013, 0x00000001, 0x59cc1007, + 0x8c08153c, 0x04000003, 0x4a035026, 0x00000008, + 0x4a035014, 0x00000016, 0x0401f804, 0x0401f002, + 0x0401f98d, 0x1c01f000, 0x4803c856, 0x83cca400, + 0x00000006, 0x4200a800, 0x0010b552, 0x4200b000, + 0x00000005, 0x0201f800, 0x0010ab17, 0x4a035014, + 0x00000017, 0x59a80013, 0x8c000500, 0x04000006, + 0x42001000, 0x0010b552, 0x46001000, 0x11050100, + 0x0401f003, 0x4a035014, 0x0000001b, 0x0401f97b, + 0x0402000a, 0x59a80015, 0x8c000500, 0x04020007, + 0x0401f896, 0x04020005, 0x82000540, 0x00000001, + 0x0201f800, 0x001015fe, 0x42000800, 0x00000005, + 0x0401f99e, 0x4d3c0000, 0x42027800, 0x00000001, + 0x0201f800, 0x00109874, 0x5c027800, 0x1c01f000, + 0x59a80016, 0x80000540, 0x04000015, 0x4803c857, + 0x42001000, 0x00104148, 0x0201f800, 0x00105f90, + 0x59a80016, 0x82000580, 0x00000084, 0x0402000b, + 0x59cc1006, 0x82081580, 0x11060000, 0x04020007, + 0x80000580, 0x0401faa0, 0x4a035014, 0x00000018, + 0x0401f804, 0x0401f002, 0x0401f94b, 0x1c01f000, + 0x4803c856, 0x4a035014, 0x00000019, 0x83cca400, + 0x00000006, 0x4200a800, 0x0010b552, 0x4200b000, + 0x00000021, 0x0201f800, 0x0010ab17, 0x42003800, + 0x0010b553, 0x0401f941, 0x04020018, 0x401c2800, + 0x50141000, 0x80080130, 0x80000000, 0x40001800, + 0x82081500, 0x00ffffff, 0x800000f0, 0x80080540, + 0x44002800, 0x59a80810, 0x82040d00, 0x000000ff, + 0x400c1000, 0x80081104, 0x82082400, 0x0010b553, + 0x50101000, 0x820c0500, 0x00000003, 0x0c01f806, + 0x80081540, 0x44082000, 0x42000800, 0x00000021, + 0x0401f156, 0x0010401d, 0x00104022, 0x00104027, + 0x0010402c, 0x800408f0, 0x40040000, 0x82081500, + 0x00ffffff, 0x1c01f000, 0x800408e0, 0x40040000, + 0x82081500, 0xff00ffff, 0x1c01f000, 0x800408d0, + 0x40040000, 0x82081500, 0xffff00ff, 0x1c01f000, + 0x40040000, 0x82081500, 0xffffff00, 0x1c01f000, + 0x59a80016, 0x80000540, 0x04000016, 0x4803c857, + 0x42001000, 0x00104148, 0x0201f800, 0x00105f90, + 0x59a80016, 0x82000580, 0x00000084, 0x0402000c, + 0x59cc1006, 0x82081580, 0x11070000, 0x04020008, + 0x4a035013, 0x00000001, 0x0401f8d2, 0x4a035014, + 0x0000001a, 0x0401f804, 0x0401f002, 0x0401f8f2, + 0x1c01f000, 0x82000540, 0x00000001, 0x0401fa3e, + 0x4a035014, 0x0000001b, 0x83cca400, 0x00000006, + 0x4200a800, 0x0010b552, 0x59a82016, 0x40100000, + 0x8000b104, 0x40580800, 0x5450a800, 0x8050a000, + 0x8054a800, 0x8058b040, 0x040207fc, 0x0401f113, + 0x1c01f000, 0x1c01f000, 0x4803c856, 0x42003000, + 0x00000004, 0x42004000, 0x0010b553, 0x599c2817, + 0x8c142d14, 0x0402001f, 0x42001000, 0x00000003, + 0x40200000, 0x80080400, 0x50000800, 0x82042580, + 0xffffffff, 0x04020005, 0x80081040, 0x80183040, + 0x040207f8, 0x0401f05e, 0x800811c0, 0x04020006, + 0x82042580, 0x3fffffff, 0x04000058, 0x82040d40, + 0xc0000000, 0x4200b000, 0x00000020, 0x42001800, + 0x00000001, 0x40042000, 0x80102102, 0x04021021, + 0x800c18c2, 0x8058b040, 0x040207fc, 0x0401f04b, + 0x41781000, 0x40200000, 0x80080400, 0x50000800, + 0x82042580, 0xffffffff, 0x04020005, 0x80081000, + 0x80183040, 0x040207f8, 0x0401f040, 0x800811c0, + 0x04020003, 0x82040d40, 0xc0000000, 0x4200b000, + 0x00000001, 0x42001800, 0x80000000, 0x40042000, + 0x801020c2, 0x04021007, 0x800c1902, 0x8058b000, + 0x82580480, 0x00000021, 0x040017fa, 0x0401f02f, + 0x40200000, 0x80082400, 0x50100000, 0x800c0540, + 0x44002000, 0x59a80015, 0x84000540, 0x48035015, + 0x40580000, 0x42002800, 0x00000020, 0x80142c80, + 0x40080000, 0x42003800, 0x00000003, 0x801c0480, + 0x800000ca, 0x80142d40, 0x82144c00, 0x0010210e, + 0x50242800, 0x82142d00, 0x000000ff, 0x48175010, + 0x4c040000, 0x40140800, 0x0201f800, 0x001015eb, + 0x5c000800, 0x40001800, 0x500c0000, 0x80100540, + 0x44001800, 0x59a80015, 0x84000540, 0x48035015, + 0x4200a800, 0x0010b553, 0x4020a000, 0x4200b000, + 0x00000004, 0x0201f800, 0x0010ab17, 0x82000540, + 0x00000001, 0x0401f002, 0x80000580, 0x1c01f000, + 0x4807c857, 0x480bc857, 0x4008b000, 0x83cca400, + 0x00000007, 0x4200a800, 0x0010b553, 0x40541000, + 0x0201f800, 0x0010ab17, 0x40041800, 0x41782000, + 0x42000000, 0x00000003, 0x820c1c80, 0x00000020, + 0x04001004, 0x80102000, 0x80000040, 0x0401f7fb, + 0x40041800, 0x801021c0, 0x04000005, 0x820c1c80, + 0x00000020, 0x80102040, 0x040207fd, 0x42002000, + 0x00000001, 0x800c19c0, 0x04000004, 0x801020c2, + 0x800c1840, 0x040207fe, 0x80083c00, 0x83cc2c00, + 0x00000007, 0x80142c00, 0x50140000, 0x80102d00, + 0x04020012, 0x80100540, 0x44003800, 0x82042400, + 0x0010210e, 0x50102800, 0x82142d00, 0x000000ff, + 0x48175010, 0x4c040000, 0x40140800, 0x0201f800, + 0x001015eb, 0x5c000800, 0x59a80015, 0x84000540, + 0x48035015, 0x80000580, 0x1c01f000, 0x4807c856, + 0x42001000, 0x00008017, 0x59a8184e, 0x0201f800, + 0x0010aa4f, 0x0201f800, 0x00103a3e, 0x1c01f000, + 0x4807c856, 0x4200b000, 0x00000020, 0x83cca400, + 0x00000007, 0x4200a800, 0x0010be21, 0x0201f000, + 0x0010ab28, 0x4807c856, 0x0201f800, 0x00106ede, + 0x42000800, 0x000000f7, 0x0401f8de, 0x497b2804, + 0x497b2805, 0x497b281c, 0x497b281d, 0x4202d800, + 0x00000001, 0x42006000, 0xbf7fffff, 0x42006800, + 0x00018000, 0x0401f950, 0x42006000, 0xfffeffff, + 0x41786800, 0x0401f94c, 0x497b504e, 0x42000800, + 0x0000002d, 0x42001000, 0x001041bc, 0x0201f000, + 0x00105f69, 0x4807c856, 0x0401ffe3, 0x497b5014, + 0x497b5016, 0x1c01f000, 0x4807c856, 0x59a80005, + 0x8c000506, 0x1c01f000, 0x4807c856, 0x42006000, + 0xffffffff, 0x42006800, 0x00000028, 0x0401f136, + 0x4807c856, 0x0401ffc2, 0x0201f800, 0x00106c55, + 0x4df00000, 0x0201f800, 0x00106e21, 0x5c03e000, + 0x02000800, 0x00106c4b, 0x59c400a4, 0x82000500, + 0x0000000f, 0x82000580, 0x00000002, 0x0402000a, + 0x42006000, 0xffffffff, 0x42006800, 0x00200000, + 0x0401f921, 0x42006000, 0xffdfffff, 0x41786800, + 0x0401f91d, 0x497b5014, 0x42000800, 0x000000f7, + 0x0401f89c, 0x59c400a3, 0x82000500, 0xbf20bfff, + 0x82000540, 0x0001c000, 0x480388a3, 0x84000520, + 0x480388a3, 0x1c01f000, 0x497b5016, 0x59b400f5, + 0x8c000500, 0x04020004, 0x82000540, 0x00000001, + 0x480368f5, 0x800400c4, 0x82000400, 0x00002000, + 0x4803910a, 0x59b400f6, 0x82000500, 0x00000018, + 0x040207fd, 0x4a0368f0, 0x0010b54b, 0x42000000, + 0x0010b552, 0x480368f1, 0x82040400, 0x0000dc00, + 0x480368f3, 0x59c400a4, 0x82000500, 0x0000000f, + 0x82000580, 0x00000008, 0x04020017, 0x4c5c0000, + 0x4c600000, 0x59c4b805, 0x8c5cbd3a, 0x04020005, + 0x42000000, 0x0010b818, 0x0201f800, 0x0010aa47, + 0x4a038805, 0x02000000, 0x0201f800, 0x001019fe, + 0x4000c000, 0x0201f800, 0x00101963, 0x4202d800, + 0x00000001, 0x497b5014, 0x5c00c000, 0x5c00b800, + 0x1c01f000, 0x59c8010b, 0x8c000502, 0x040007e2, + 0x59c408a4, 0x82040d00, 0x0000000f, 0x82040d80, + 0x0000000b, 0x04020005, 0x59a80814, 0x82040d40, + 0x00002000, 0x0401f004, 0x59a80812, 0x82040d40, + 0x00001000, 0x4807504e, 0x59a8084a, 0x800409c0, + 0x04020007, 0x42000800, 0x000007d0, 0x42001000, + 0x00104148, 0x0201f800, 0x0010606e, 0x1c01f000, + 0x4807c856, 0x0401ff4e, 0x0201f800, 0x00106c55, + 0x4df00000, 0x0201f800, 0x00106e21, 0x5c03e000, + 0x02000800, 0x00106c4b, 0x59c400a4, 0x82000500, + 0x0000000f, 0x82000580, 0x00000002, 0x0402000a, + 0x42006000, 0xffffffff, 0x42006800, 0x00200000, + 0x0401f8ad, 0x42006000, 0xffdfffff, 0x41786800, + 0x0401f8a9, 0x0201f800, 0x00105141, 0x04000014, + 0x0201f800, 0x00105151, 0x04020011, 0x4a035032, + 0x0000aaaa, 0x4c040000, 0x0201f800, 0x0010162a, + 0x59a8002a, 0x82000500, 0xffff0000, 0x80040540, + 0x4803502a, 0x5c000800, 0x4a035033, 0x00000000, + 0x0201f800, 0x001050a2, 0x0401f008, 0x4a03504c, + 0x00000005, 0x42000000, 0x00000001, 0x0201f800, + 0x00101590, 0x0401ff2c, 0x1c01f000, 0x0401f805, + 0x42006000, 0xbf7f7fff, 0x41786800, 0x0401f086, + 0x0201f800, 0x00105151, 0x04020005, 0x59c40006, + 0x82000540, 0x000000f0, 0x48038806, 0x1c01f000, + 0x800408d0, 0x59a80015, 0x8c000506, 0x04000006, + 0x59a80010, 0x82000500, 0x000000ff, 0x80040540, + 0x0401f003, 0x82040540, 0x000000f7, 0x480388a7, + 0x1c01f000, 0x4807c856, 0x42000000, 0x0010b83b, + 0x0201f800, 0x0010aa47, 0x42003000, 0x00000005, + 0x4d3c0000, 0x4c180000, 0x42003000, 0x0000000d, + 0x42027800, 0x00000002, 0x0401f038, 0x4807c856, + 0x42000000, 0x0010b86b, 0x0201f800, 0x0010aa47, + 0x42003000, 0x00000000, 0x4d3c0000, 0x4c180000, + 0x42003000, 0x0000000f, 0x42027800, 0x00000002, + 0x0401f02a, 0x4807c856, 0x42000000, 0x0010b86a, + 0x0201f800, 0x0010aa47, 0x42003000, 0x00000003, + 0x4d3c0000, 0x4c180000, 0x42003000, 0x0000000e, + 0x42027800, 0x00000202, 0x0401f01c, 0x4807c856, + 0x42000000, 0x0010b869, 0x0201f800, 0x0010aa47, + 0x42003000, 0x00000004, 0x4d3c0000, 0x4c180000, + 0x42003000, 0x00000010, 0x42027800, 0x00000202, + 0x0401f00e, 0x4807c856, 0x42000000, 0x0010b83e, + 0x0201f800, 0x0010aa47, 0x42003000, 0x00000001, + 0x4d3c0000, 0x4c180000, 0x42003000, 0x0000000c, + 0x42027800, 0x00000202, 0x42001800, 0x0000ffff, + 0x42002000, 0x00000007, 0x0201f800, 0x00103aae, + 0x5c003000, 0x4d400000, 0x0201f800, 0x0010a95d, + 0x42028000, 0x0000002a, 0x0201f800, 0x00101fe5, + 0x5c028000, 0x5c027800, 0x1c01f000, 0x4807c856, + 0x04011000, 0x4a03c840, 0x0010b54b, 0x4a03c842, + 0x00000040, 0x40000000, 0x040117ff, 0x42007800, + 0x0010b54b, 0x46007800, 0x00000011, 0x803c7800, + 0x4a007800, 0x220000ef, 0x4a007801, 0x000000ef, + 0x4a007802, 0x01380000, 0x4a007803, 0x00000000, + 0x4a007804, 0xffffffff, 0x4a007805, 0x00000000, + 0x1c01f000, 0x59c400a3, 0x80300500, 0x80340540, + 0x480388a3, 0x1c01f000, 0x4833c857, 0x59c400a3, + 0x80300540, 0x480388a3, 0x80300580, 0x480388a3, + 0x1c01f000, 0x4803c856, 0x04000004, 0x4a03504b, + 0x00000001, 0x0401f002, 0x497b504b, 0x1c01f000, + 0x4803c856, 0x59c80002, 0x80000540, 0x0400000a, + 0x80000040, 0x04000008, 0x4a039005, 0x00000140, + 0x42000000, 0x00000006, 0x80000040, 0x040207ff, + 0x0401f7f4, 0x1c01f000, 0x4c5c0000, 0x4c600000, + 0x59c4b805, 0x485fc856, 0x8c5cbd3a, 0x04020005, + 0x42000000, 0x0010b818, 0x0201f800, 0x0010aa47, + 0x4a038805, 0x02000000, 0x0201f800, 0x001019fe, + 0x4000c000, 0x0201f800, 0x00101963, 0x4a038805, + 0x04000000, 0x5c00c000, 0x5c00b800, 0x1c01f000, + 0x497a6a00, 0x4937c857, 0x4a026c00, 0x00000707, + 0x497a6801, 0x497a6808, 0x497a6809, 0x497a6806, + 0x497a6807, 0x497a6c0b, 0x497a680c, 0x0201f800, + 0x00103b25, 0x04020006, 0x5934080f, 0x59340010, + 0x80040540, 0x02020800, 0x001005d8, 0x4a026a04, + 0x00000100, 0x497a6a03, 0x59340402, 0x82000500, + 0x000000ff, 0x48026c02, 0x497a6c04, 0x497a6a05, + 0x497a6c05, 0x497a6811, 0x4d2c0000, 0x5934000d, + 0x49466c03, 0x80025d40, 0x04000004, 0x0201f800, + 0x001007fd, 0x497a680d, 0x5c025800, 0x599c0401, + 0x48026a0b, 0x599c0208, 0x48026c12, 0x497a680a, + 0x0201f000, 0x00104c62, 0x42000000, 0x00000005, + 0x80000d80, 0x0401f02d, 0x0201f800, 0x00104a09, + 0x04020017, 0x59a80026, 0x8c00050a, 0x04020010, + 0x59340212, 0x82000500, 0x0000ff00, 0x4803c857, + 0x0400000b, 0x59340a00, 0x8c040d1e, 0x02000000, + 0x000201c4, 0x42000000, 0x00000029, 0x42000800, + 0x00001000, 0x492fc857, 0x0401f018, 0x492fc857, + 0x42000000, 0x00000028, 0x0401f012, 0x59a80805, + 0x8c040d02, 0x04020003, 0x8c040d00, 0x04000004, + 0x42000000, 0x00000004, 0x0401f00a, 0x42000000, + 0x00000029, 0x59340a00, 0x8c040d1e, 0x04000005, + 0x492fc857, 0x42000800, 0x00001000, 0x0401f003, + 0x492fc857, 0x80000d80, 0x4803c857, 0x80028540, + 0x1c01f000, 0x4803c857, 0x59a80005, 0x8c000500, + 0x040207ec, 0x0201f800, 0x001049e7, 0x040207e4, + 0x59340200, 0x8c00050e, 0x040007e1, 0x0201f000, + 0x000201c4, 0x0201f800, 0x001047eb, 0x040007bf, + 0x0201f000, 0x000201c8, 0x592c0206, 0x492fc857, + 0x82000d80, 0x000007ff, 0x04020006, 0x4a025c0a, + 0x00000030, 0x42026800, 0x0010b524, 0x0401f021, + 0x82000c80, 0x000007f0, 0x04021046, 0x81ac0400, + 0x50000000, 0x80026d40, 0x04000038, 0x0201f800, + 0x001048e3, 0x04020038, 0x592c040a, 0x8c00050a, + 0x04020014, 0x592e6009, 0x83300480, 0x0010d1c0, + 0x0400103b, 0x41580000, 0x81300480, 0x04021038, + 0x59300c06, 0x82040580, 0x00000009, 0x04020037, + 0x4a025a06, 0x00000000, 0x497a5800, 0x59300008, + 0x80000540, 0x04020018, 0x492e6008, 0x0401f010, + 0x0201f800, 0x0002075a, 0x04000019, 0x592c0206, + 0x49366009, 0x492e6008, 0x4a026406, 0x00000009, + 0x497a6015, 0x49325809, 0x82000d80, 0x000007ff, + 0x04020003, 0x4a026015, 0x00008000, 0x42027000, + 0x00000043, 0x0201f800, 0x000207a1, 0x80000580, + 0x0401f020, 0x40000800, 0x58040000, 0x80000d40, + 0x040207fd, 0x492c0800, 0x0401f01a, 0x42000000, + 0x0000002c, 0x0401f016, 0x42000000, 0x00000028, + 0x0401f013, 0x59a80805, 0x82040500, 0x00000003, + 0x04000004, 0x42000000, 0x00000004, 0x0401f00c, + 0x42000000, 0x00000029, 0x0401f009, 0x42000000, + 0x00000008, 0x0401f006, 0x82040580, 0x00000007, + 0x040207fb, 0x42000000, 0x00000005, 0x80000540, + 0x1c01f000, 0x492fc857, 0x592e8c06, 0x83440d80, + 0x000007fc, 0x04000004, 0x83440480, 0x000007f0, + 0x04021014, 0x0201f800, 0x00020245, 0x04020011, + 0x0201f800, 0x001049f3, 0x04020011, 0x0201f800, + 0x0002075a, 0x0400001c, 0x49366009, 0x492e6008, + 0x4a026406, 0x0000000a, 0x42027000, 0x00000040, + 0x0201f800, 0x000207a1, 0x80000580, 0x0401f011, + 0x42000000, 0x00000028, 0x0401f00d, 0x0201f800, + 0x00104a09, 0x040007fb, 0x59a80805, 0x82040d00, + 0x00000003, 0x04000004, 0x42000000, 0x00000004, + 0x0401f003, 0x42000000, 0x00000029, 0x80000540, + 0x1c01f000, 0x42000000, 0x0000002c, 0x0401f7fc, + 0x492fc857, 0x592e8c06, 0x4947c857, 0x83440c80, + 0x00000800, 0x42000000, 0x0000000a, 0x04021176, + 0x592c4207, 0x4823c857, 0x82200500, 0x0000000f, + 0x0c01f001, 0x001043d5, 0x0010445d, 0x001044a9, + 0x001044b4, 0x001044bf, 0x001043d1, 0x001043d1, + 0x001043d1, 0x001044cf, 0x00104513, 0x00104530, + 0x001043d1, 0x001043d1, 0x001043d1, 0x001043d1, + 0x001043d1, 0x4803c857, 0x42000000, 0x0000000c, + 0x0401f15d, 0x592c1008, 0x82081500, 0x00ffffff, + 0x59a80010, 0x80084d80, 0x42000000, 0x00000010, + 0x04000155, 0x0201f800, 0x00104919, 0x04000036, + 0x4803c857, 0x82004d80, 0x0000001d, 0x0402001a, + 0x0201f800, 0x00105755, 0x59340405, 0x4c000000, + 0x0201f800, 0x001049e7, 0x5c000000, 0x04000004, + 0x8c20450a, 0x04000028, 0x80000580, 0x44002800, + 0x59340008, 0x48002802, 0x59340009, 0x48002801, + 0x59340006, 0x48002804, 0x59340007, 0x48002803, + 0x4200b000, 0x00000005, 0x0201f800, 0x0010955f, + 0x0401f166, 0x4803c857, 0x82004d80, 0x0000001a, + 0x04020003, 0x40101000, 0x0401f136, 0x4803c857, + 0x82004d80, 0x0000001b, 0x04020003, 0x40181000, + 0x0401f130, 0x4803c857, 0x82004d80, 0x0000001c, + 0x04000131, 0x82004d80, 0x00000019, 0x42000000, + 0x0000000a, 0x04000120, 0x42000000, 0x0000000a, + 0x04020137, 0x59a80005, 0x8c000514, 0x0400001b, + 0x0201f800, 0x001049e7, 0x04000018, 0x59340212, + 0x82000500, 0x0000ff00, 0x42001000, 0x00000010, + 0x0402000c, 0x42001000, 0x00000008, 0x59a80026, + 0x8c000506, 0x04020009, 0x59340002, 0x82000500, + 0x00ff0000, 0x82000580, 0x00ff0000, 0x04000007, + 0x0201f800, 0x00104c6d, 0x42000000, 0x0000001c, + 0x40181000, 0x04020107, 0x0201f800, 0x0002075a, + 0x04000111, 0x49366009, 0x492e6008, 0x4a026406, + 0x00000001, 0x8c20450a, 0x04000004, 0x592c0404, + 0x8400055c, 0x48025c04, 0x4c200000, 0x4d3c0000, + 0x42027800, 0x00001000, 0x0201f800, 0x0010203c, + 0x5c027800, 0x5c004000, 0x8c204512, 0x0400000b, + 0x599c0018, 0x8c000518, 0x04000008, 0x592c0009, + 0x82000500, 0x00000380, 0x5934080a, 0x80040d40, + 0x84040d54, 0x4806680a, 0x417a7800, 0x0401f914, + 0x42000800, 0x00000003, 0x0401f91b, 0x42027000, + 0x00000002, 0x0201f800, 0x000207a1, 0x80000580, + 0x0401f10a, 0x0201f800, 0x00020245, 0x040200ec, + 0x0201f800, 0x001049ed, 0x04000008, 0x0201f800, + 0x001049e7, 0x040200ec, 0x417a7800, 0x417a6000, + 0x0201f800, 0x001020a1, 0x59a80005, 0x8c000514, + 0x0400001b, 0x0201f800, 0x001049e7, 0x04000018, + 0x59340212, 0x82000500, 0x0000ff00, 0x42001000, + 0x00000010, 0x0402000c, 0x42001000, 0x00000008, + 0x59a80026, 0x8c000506, 0x04020009, 0x59340002, + 0x82000500, 0x00ff0000, 0x82000580, 0x00ff0000, + 0x04000007, 0x0201f800, 0x00104c6d, 0x42000000, + 0x0000001c, 0x40181000, 0x040200b2, 0x0201f800, + 0x0002075a, 0x040000bc, 0x5934080a, 0x8c204512, + 0x0400000c, 0x599c0018, 0x8c000518, 0x04000009, + 0x592c0009, 0x82000500, 0x00000380, 0x82041500, + 0xfffffc7f, 0x80080d40, 0x84040d54, 0x0401f002, + 0x84040d14, 0x4806680a, 0x49366009, 0x492e6008, + 0x4a026406, 0x00000001, 0x417a7800, 0x0401f8c8, + 0x42000800, 0x00000005, 0x0401f8cf, 0x42027000, + 0x00000003, 0x0201f800, 0x000207a1, 0x80000580, + 0x0401f0be, 0x0201f800, 0x00020245, 0x040200a0, + 0x0201f800, 0x001049fc, 0x040200a3, 0x0201f800, + 0x00109517, 0x04000094, 0x80000580, 0x0401f0b3, + 0x0201f800, 0x00020245, 0x04020095, 0x0201f800, + 0x001049fc, 0x04020098, 0x0201f800, 0x001090e6, + 0x04000089, 0x80000580, 0x0401f0a8, 0x0201f800, + 0x00020245, 0x0402008a, 0x83444d80, 0x000007fe, + 0x42000000, 0x0000000a, 0x0402006b, 0x0201f800, + 0x001049e7, 0x04020088, 0x0201f800, 0x0010952f, + 0x04000079, 0x80000580, 0x0401f098, 0x82200500, + 0x00000070, 0x04020005, 0x8c20450e, 0x42000000, + 0x0000000c, 0x0402005c, 0x8c20450a, 0x0400000d, + 0x4d3c0000, 0x42027800, 0x00001000, 0x8c20450e, + 0x04020002, 0x853e7d56, 0x82200500, 0x000000a0, + 0x0201f800, 0x001049d3, 0x5c027800, 0x0401f07f, + 0x0201f800, 0x00020245, 0x04020065, 0x8c204508, + 0x04000010, 0x4d3c0000, 0x42027800, 0x00001000, + 0x8c20450e, 0x04020002, 0x853e7d56, 0x82200500, + 0x00000090, 0x0201f800, 0x001049bb, 0x5c027800, + 0x42000000, 0x0000000a, 0x0402003b, 0x0401f06b, + 0x836c0580, 0x00000003, 0x42000800, 0x00000007, + 0x0402000f, 0x0201f800, 0x001049f3, 0x04000007, + 0x4c000000, 0x0201f800, 0x00104a1f, 0x5c000000, + 0x0400004d, 0x0401f05d, 0x0201f800, 0x001094c5, + 0x04000007, 0x80000580, 0x0401f05c, 0x0201f800, + 0x00104a1f, 0x04000051, 0x0401f054, 0x0201f800, + 0x00104a1f, 0x04000034, 0x0401f050, 0x0201f800, + 0x00020245, 0x04020036, 0x836c0580, 0x00000003, + 0x04020040, 0x8c204508, 0x04000006, 0x417a7800, + 0x417a6000, 0x0201f800, 0x001020a1, 0x0401f043, + 0x0201f800, 0x001049ed, 0x04000008, 0x0201f800, + 0x001049e7, 0x0402002c, 0x417a7800, 0x417a6000, + 0x0201f800, 0x001020a1, 0x480bc856, 0x0201f800, + 0x00109332, 0x04000018, 0x80000580, 0x0401f037, + 0x0401f7e3, 0x480bc857, 0x42000800, 0x00000019, + 0x40001000, 0x4200b000, 0x00000002, 0x0401f00a, + 0x480bc857, 0x40000800, 0x4200b000, 0x00000002, + 0x0401f005, 0x480bc857, 0x40000800, 0x4200b000, + 0x00000001, 0x480bc857, 0x42028000, 0x00000031, + 0x0401f020, 0x480bc857, 0x42000800, 0x00000003, + 0x4200b000, 0x00000001, 0x0401f7f7, 0x480bc857, + 0x42000800, 0x0000000a, 0x4200b000, 0x00000001, + 0x0401f7f1, 0x480bc857, 0x42000800, 0x00000009, + 0x40001000, 0x4200b000, 0x00000002, 0x0401f7ea, + 0x480bc857, 0x42000800, 0x00000007, 0x4200b000, + 0x00000001, 0x0401f7e4, 0x480bc857, 0x4200b000, + 0x00000001, 0x0401f7e0, 0x80028580, 0x4178b000, + 0x82000540, 0x00000001, 0x1c01f000, 0x4937c857, + 0x59326809, 0x59341200, 0x813e79c0, 0x04000003, + 0x84081540, 0x0401f002, 0x84081500, 0x480a6a00, + 0x1c01f000, 0x59326809, 0x5c000000, 0x4c000000, + 0x4803c857, 0x4937c857, 0x82040580, 0x00000006, + 0x04020004, 0x42000000, 0x00000606, 0x0401f021, + 0x82040580, 0x00000004, 0x04020004, 0x42000000, + 0x00000404, 0x0401f01b, 0x82040580, 0x00000007, + 0x42000000, 0x00000707, 0x04000016, 0x82040580, + 0x00000003, 0x42000000, 0x00000703, 0x04000011, + 0x82040580, 0x00000005, 0x42000000, 0x00000405, + 0x0400000c, 0x82040580, 0x00000009, 0x42000000, + 0x00000409, 0x04000007, 0x82040580, 0x0000000b, + 0x42000000, 0x0000070b, 0x02020800, 0x001005d8, + 0x4803c857, 0x48026c00, 0x82040d80, 0x00000006, + 0x04020005, 0x59341404, 0x800811c0, 0x02000800, + 0x001005d8, 0x1c01f000, 0x5c000000, 0x4c000000, + 0x4803c857, 0x4947c857, 0x481bc857, 0x83440480, + 0x00000800, 0x04021034, 0x83441400, 0x0010ac00, + 0x50080000, 0x80026d40, 0x04020011, 0x4c180000, + 0x4d2c0000, 0x0201f800, 0x001007d3, 0x412e6800, + 0x5c025800, 0x5c003000, 0x04000027, 0x45341000, + 0x497a680d, 0x497a6810, 0x497a680f, 0x497a680e, + 0x4c180000, 0x0401fcf3, 0x5c003000, 0x59340a12, + 0x4c040000, 0x0201f800, 0x0010513b, 0x5c000800, + 0x04000009, 0x82180500, 0x00ffff00, 0x04000008, + 0x59a81010, 0x82081500, 0x00ffff00, 0x80080580, + 0x04000003, 0x80000580, 0x0401f004, 0x82180500, + 0x000000ff, 0x800000d0, 0x80040d80, 0x04000003, + 0x4803c857, 0x48026a12, 0x59340002, 0x80180580, + 0x04000003, 0x481bc857, 0x481a6802, 0x80000580, + 0x1c01f000, 0x4803c856, 0x82000540, 0x00000001, + 0x0401f7fc, 0x4947c857, 0x83440480, 0x00000800, + 0x04021011, 0x83441400, 0x0010ac00, 0x50080000, + 0x80026d40, 0x0400000b, 0x0401fbf9, 0x0402000a, + 0x59a80005, 0x8c000502, 0x04000004, 0x59340200, + 0x8c00050e, 0x04000004, 0x82000540, 0x00000001, + 0x1c01f000, 0x80000580, 0x0401f7fe, 0x5c000000, + 0x4c000000, 0x4803c857, 0x4947c857, 0x4d2c0000, + 0x4d300000, 0x83440480, 0x00000800, 0x04021024, + 0x83441400, 0x0010ac00, 0x50080000, 0x80026d40, + 0x0400001b, 0x45781000, 0x5934000d, 0x80025d40, + 0x02020800, 0x001007fd, 0x59366011, 0x813261c0, + 0x0400000e, 0x4c640000, 0x5930c800, 0x59325808, + 0x0201f800, 0x00109037, 0x02020800, 0x001007fd, + 0x0201f800, 0x0002077d, 0x82666540, 0x00000000, + 0x040207f6, 0x5c00c800, 0x0201f800, 0x00104c62, + 0x41365800, 0x0201f800, 0x001007f5, 0x80000580, + 0x5c026000, 0x5c025800, 0x1c01f000, 0x82000540, + 0x00000001, 0x0401f7fb, 0x4937c857, 0x4c580000, + 0x59cc0001, 0x82000500, 0x00ffffff, 0x48026802, + 0x497a6c01, 0x497a6a01, 0x59340200, 0x84000502, + 0x48026a00, 0x0201f800, 0x0010513b, 0x04020017, + 0x59340403, 0x82000580, 0x000007fe, 0x04000005, + 0x59a80026, 0x8c00050a, 0x04020010, 0x0401f008, + 0x59cc0408, 0x8c000518, 0x0400000c, 0x59cc0009, + 0x48035035, 0x59cc000a, 0x48035036, 0x59cc0207, + 0x80000540, 0x04020003, 0x42000000, 0x00000001, + 0x48038893, 0x4803501e, 0x59cc0a09, 0x82040d00, + 0x00000010, 0x59cc0408, 0x82000500, 0x00000020, + 0x04000002, 0x84040d40, 0x5934000a, 0x82000500, + 0xffffffee, 0x80040540, 0x4802680a, 0x83cca400, + 0x0000000b, 0x8334ac00, 0x00000006, 0x4200b000, + 0x00000002, 0x0201f800, 0x0010ab17, 0x83cca400, + 0x0000000d, 0x8334ac00, 0x00000008, 0x4200b000, + 0x00000002, 0x0201f800, 0x0010ab17, 0x59cc0a18, + 0x82040480, 0x00000800, 0x0402100c, 0x82040480, + 0x00000400, 0x04001004, 0x42000800, 0x00000400, + 0x0401f006, 0x82040480, 0x00000200, 0x04001003, + 0x42000800, 0x00000200, 0x48066a04, 0x59340403, + 0x82000580, 0x000007fe, 0x04020003, 0x59cc0a08, + 0x48066a04, 0x42000800, 0x00000004, 0x59cc1207, + 0x800811c0, 0x04000005, 0x82080480, 0x00000004, + 0x04021002, 0x40080800, 0x48066c04, 0x5c00b000, + 0x1c01f000, 0x4937c857, 0x59a80026, 0x8c000508, + 0x04000004, 0x84000556, 0x4803c857, 0x48035026, + 0x59cc0207, 0x4803c857, 0x48026a05, 0x59cc020a, + 0x4803c857, 0x48026c05, 0x59341200, 0x599c0818, + 0x5934180a, 0x4807c857, 0x480bc857, 0x480fc857, + 0x59cc2006, 0x82102500, 0xff000000, 0x82102580, + 0x02000000, 0x04000007, 0x8c00050e, 0x04000009, + 0x8c0c1d14, 0x04000003, 0x8c0c1d0e, 0x04000005, + 0x8c040d18, 0x04000003, 0x8408154a, 0x0401f002, + 0x8408150a, 0x8c000510, 0x04000009, 0x8c0c1d14, + 0x04000003, 0x8c0c1d10, 0x04000005, 0x8c040d18, + 0x04000003, 0x8408154e, 0x0401f002, 0x8408150e, + 0x8c000512, 0x04000009, 0x8c0c1d14, 0x04000003, + 0x8c0c1d12, 0x04000005, 0x8c040d18, 0x04000003, + 0x8408155c, 0x0401f002, 0x8408151c, 0x480a6a00, + 0x1c01f000, 0x4803c856, 0x4c5c0000, 0x4d2c0000, + 0x4c580000, 0x5934000d, 0x80025d40, 0x04000029, + 0x592c0003, 0x82000480, 0x00000008, 0x0400100b, + 0x412cb800, 0x592c0001, 0x80025d40, 0x040207f9, + 0x0201f800, 0x001007e4, 0x04000037, 0x492fc857, + 0x492cb801, 0x0401f020, 0x832c0c00, 0x00000004, + 0x4200b000, 0x00000008, 0x50040000, 0x82000580, + 0xffffffff, 0x04020006, 0x80041000, 0x50080000, + 0x82000580, 0xffffffff, 0x04000007, 0x82040c00, + 0x00000002, 0x8058b040, 0x040207f4, 0x0201f800, + 0x001005d8, 0x45480800, 0x454c1000, 0x592c1803, + 0x800c1800, 0x480e5803, 0x480fc857, 0x0401f014, + 0x0201f800, 0x001007e4, 0x04000017, 0x492fc857, + 0x492e680d, 0x497a5802, 0x4a025803, 0x00000001, + 0x494a5804, 0x494e5805, 0x832c0c00, 0x00000006, + 0x4200b000, 0x0000000e, 0x46000800, 0xffffffff, + 0x80040800, 0x8058b040, 0x040207fc, 0x82000540, + 0x00000001, 0x5c00b000, 0x5c025800, 0x5c00b800, + 0x1c01f000, 0x80000580, 0x0401f7fb, 0x4803c856, + 0x4d3c0000, 0x4d2c0000, 0x5934000d, 0x80025d40, + 0x0400001f, 0x592c0002, 0x80000540, 0x0402001f, + 0x412e7800, 0x0401f8ce, 0x0402001c, 0x46000800, + 0xffffffff, 0x46001000, 0xffffffff, 0x4813c857, + 0x480fc857, 0x580c0003, 0x82000c80, 0x00000002, + 0x04021014, 0x480fc857, 0x400c0000, 0x812c0580, + 0x04020004, 0x580c0001, 0x4802680d, 0x0401f003, + 0x580c0001, 0x48002001, 0x400e5800, 0x0201f800, + 0x001007f4, 0x82000540, 0x00000001, 0x5c025800, + 0x5c027800, 0x1c01f000, 0x80000580, 0x0401f7fc, + 0x80000040, 0x48001803, 0x4803c857, 0x0401f7f6, + 0x0201f800, 0x00020086, 0x59300007, 0x8400054e, + 0x48026007, 0x592c1a04, 0x820c1d00, 0x000000ff, + 0x820c0580, 0x00000048, 0x04000013, 0x0201f000, + 0x0002028e, 0x8c000500, 0x02020800, 0x000200e5, + 0x4a026203, 0x00000002, 0x592c1a04, 0x820c1d00, + 0x000000ff, 0x820c0580, 0x00000018, 0x02000000, + 0x0002028e, 0x820c0580, 0x00000048, 0x02020000, + 0x0002028e, 0x42000800, 0x80000804, 0x0201f800, + 0x00106721, 0x0201f000, 0x00020297, 0x4a025a06, + 0x00000008, 0x0201f000, 0x000202da, 0x4a025a06, + 0x00000029, 0x0201f000, 0x000202da, 0x4a025a06, + 0x0000002a, 0x0201f000, 0x000202da, 0x4a025a06, + 0x00000028, 0x0201f000, 0x000202da, 0x4943c857, + 0x4d440000, 0x4d340000, 0x4d2c0000, 0x4c580000, + 0x4200b000, 0x000007f0, 0x417a8800, 0x0201f800, + 0x00020245, 0x0402000d, 0x8d3e7d14, 0x04000005, + 0x59340212, 0x82000500, 0x0000ff00, 0x04000007, + 0x8d3e7d06, 0x04000004, 0x59340200, 0x8c00050e, + 0x04020002, 0x0401f813, 0x81468800, 0x8058b040, + 0x040207ef, 0x83440480, 0x00000800, 0x04021008, + 0x8d3e7d02, 0x04000006, 0x42028800, 0x000007f0, + 0x4200b000, 0x00000010, 0x0401f7e5, 0x5c00b000, + 0x5c025800, 0x5c026800, 0x5c028800, 0x1c01f000, + 0x4d2c0000, 0x41783000, 0x5936580f, 0x812e59c0, + 0x04000029, 0x592c0204, 0x82000500, 0x000000ff, + 0x82000580, 0x00000012, 0x04000020, 0x8d3e7d00, + 0x04000003, 0x0401f83c, 0x0402001c, 0x592c2000, + 0x497a5800, 0x801831c0, 0x04020009, 0x59340010, + 0x812c0580, 0x04020004, 0x497a680f, 0x497a6810, + 0x0401f008, 0x4812680f, 0x0401f006, 0x48103000, + 0x59340010, 0x812c0580, 0x04020002, 0x481a6810, + 0x4a025a04, 0x00000103, 0x49425a06, 0x497a5c09, + 0x0201f800, 0x001091c6, 0x0201f800, 0x000202da, + 0x40125800, 0x0401f7da, 0x412c3000, 0x592e5800, + 0x0401f7d7, 0x5c025800, 0x1c01f000, 0x4803c856, + 0x41781800, 0x5934000f, 0x80025d40, 0x04000010, + 0x592c0005, 0x80200580, 0x592c0000, 0x04000003, + 0x412c1800, 0x0401f7f9, 0x497a5800, 0x800c19c0, + 0x04000008, 0x48001800, 0x80000540, 0x04020004, + 0x480e6810, 0x82000540, 0x00000001, 0x1c01f000, + 0x4802680f, 0x80000540, 0x040207fd, 0x497a6810, + 0x0401f7f9, 0x592c0008, 0x81480580, 0x04020003, + 0x592c0009, 0x814c0580, 0x1c01f000, 0x4803c856, + 0x4c580000, 0x413c1800, 0x400c2000, 0x593c0002, + 0x80000540, 0x04020018, 0x4200b000, 0x00000008, + 0x820c0c00, 0x00000004, 0x50040000, 0x81480580, + 0x04020005, 0x80041000, 0x50080000, 0x814c0580, + 0x0400000d, 0x82040c00, 0x00000002, 0x8058b040, + 0x040207f6, 0x400c2000, 0x580c0001, 0x80001d40, + 0x040207ee, 0x82000540, 0x00000001, 0x5c00b000, + 0x1c01f000, 0x80000580, 0x0401f7fd, 0x4937c857, + 0x4c580000, 0x4d2c0000, 0x5934000d, 0x80025d40, + 0x04020016, 0x0201f800, 0x001007e4, 0x04000010, + 0x492e680d, 0x4a025802, 0x00000001, 0x497a5803, + 0x832c0c00, 0x00000004, 0x4200b000, 0x00000010, + 0x46000800, 0xffffffff, 0x80040800, 0x8058b040, + 0x040207fc, 0x82000540, 0x00000001, 0x5c025800, + 0x5c00b000, 0x1c01f000, 0x4d2c0000, 0x592e5801, + 0x0201f800, 0x001007fd, 0x5c025800, 0x0401f7ea, + 0x4d2c0000, 0x5936580d, 0x812e59c0, 0x04000007, + 0x4937c857, 0x497a680d, 0x0201f800, 0x001007fd, + 0x82000540, 0x00000001, 0x5c025800, 0x1c01f000, + 0x59340405, 0x4937c857, 0x4803c857, 0x8c000508, + 0x1c01f000, 0x4803c856, 0x0201f800, 0x0010513b, + 0x04000011, 0x59a80815, 0x8c040d04, 0x0402000e, + 0x59a80826, 0x8c040d06, 0x0400000b, 0x83ac0400, + 0x000007fe, 0x50000000, 0x80026d40, 0x04000006, + 0x0401f9a7, 0x04020004, 0x59340200, 0x8400055a, + 0x48026a00, 0x599c0017, 0x8c000508, 0x04000015, + 0x4200b000, 0x000007f0, 0x417a8800, 0x0201f800, + 0x00020245, 0x0402000c, 0x0401f999, 0x0402000a, + 0x59a80010, 0x59340802, 0x80040580, 0x82000500, + 0x00ffff00, 0x04020004, 0x59340200, 0x8400055a, + 0x48026a00, 0x81468800, 0x8058b040, 0x040207f0, + 0x0401f884, 0x04000003, 0x59a80836, 0x0401f006, + 0x599c0017, 0x8c000508, 0x04000007, 0x42000800, + 0x000007d0, 0x42001000, 0x00104876, 0x0201f800, + 0x0010606e, 0x1c01f000, 0x4803c856, 0x4d340000, + 0x4d440000, 0x4d3c0000, 0x4c580000, 0x42001000, + 0x00104876, 0x0201f800, 0x00105f90, 0x59a80826, + 0x8c040d06, 0x04000015, 0x0401f86a, 0x04000013, + 0x83ae6c00, 0x000007fe, 0x51366800, 0x59340200, + 0x8400051a, 0x48026a00, 0x599c0017, 0x8c000508, + 0x04000007, 0x42000800, 0x000007d0, 0x42001000, + 0x00104876, 0x0201f800, 0x0010606e, 0x0201f800, + 0x00101e45, 0x0401f027, 0x4200b000, 0x000007f0, + 0x80028d80, 0x0201f800, 0x00020245, 0x0402001e, + 0x59340200, 0x8c00051a, 0x0400001b, 0x59368c03, + 0x417a7800, 0x42028000, 0x00000029, 0x41783000, + 0x0201f800, 0x0010a446, 0x59340200, 0x84000558, + 0x8400051a, 0x48026a00, 0x4937c857, 0x4a026c00, + 0x00000707, 0x42028000, 0x00000029, 0x0201f800, + 0x00106ab4, 0x417a7800, 0x0201f800, 0x001067fd, + 0x80000d80, 0x0201f800, 0x0010a2ff, 0x0201f800, + 0x00106c4b, 0x81468800, 0x8058b040, 0x040207de, + 0x5c00b000, 0x5c027800, 0x5c028800, 0x5c026800, + 0x1c01f000, 0x4933c857, 0x59303809, 0x581c0200, + 0x8400051a, 0x48003a00, 0x1c01f000, 0x4803c856, + 0x42026800, 0x0010b524, 0x497a680e, 0x42028800, + 0x000007ff, 0x0201f800, 0x001042b4, 0x4937c857, + 0x4a026c00, 0x00000606, 0x4a026802, 0x00ffffff, + 0x4a026a04, 0x00000200, 0x4a026c04, 0x00000002, + 0x1c01f000, 0x59300009, 0x50000000, 0x4933c857, + 0x4803c857, 0x8c00050e, 0x1c01f000, 0x59300009, + 0x50000000, 0x8c00050a, 0x1c01f000, 0x4933c856, + 0x0401f90f, 0x04000006, 0x59340400, 0x82000d00, + 0x000000ff, 0x82041580, 0x00000005, 0x1c01f000, + 0x4d340000, 0x83ac0400, 0x000007fe, 0x50000000, + 0x80026d40, 0x04000003, 0x59340200, 0x8c00051a, + 0x5c026800, 0x1c01f000, 0x4937c857, 0x493fc857, + 0x59340403, 0x81ac0400, 0x50000000, 0x81340580, + 0x02020800, 0x001005d8, 0x59341200, 0x813e79c0, + 0x04000003, 0x8408155e, 0x0401f002, 0x8408151e, + 0x480a6a00, 0x1c01f000, 0x4937c857, 0x0201f800, + 0x0010210a, 0x04000006, 0x59a80835, 0x42001000, + 0x00104910, 0x0201f800, 0x0010606e, 0x1c01f000, + 0x4937c857, 0x42001000, 0x00104910, 0x0201f800, + 0x00105f90, 0x59a81026, 0x84081512, 0x480b5026, + 0x1c01f000, 0x4c380000, 0x4c340000, 0x4c240000, + 0x4c600000, 0x4008c000, 0x83440480, 0x00000800, + 0x04021045, 0x80002d80, 0x41442000, 0x83447400, + 0x0010ac00, 0x4200b000, 0x000007f0, 0x83444c80, + 0x000007f0, 0x04001003, 0x4200b000, 0x00000010, + 0x50380000, 0x80000540, 0x0402001e, 0x41440000, + 0x80100580, 0x04020043, 0x40102800, 0x82104c80, + 0x000007f0, 0x04001015, 0x82104d80, 0x000007fc, + 0x04020005, 0x82604d80, 0x00fffffc, 0x0402002a, + 0x0401f00e, 0x82104d80, 0x000007fd, 0x04020005, + 0x82604d80, 0x00fffffd, 0x04020023, 0x0401f007, + 0x82104d80, 0x000007ff, 0x0402001f, 0x82604d80, + 0x00ffffff, 0x0402001c, 0x84142d5e, 0x0401f029, + 0x40006800, 0x58343002, 0x82183500, 0x00ffffff, + 0x40180000, 0x80600580, 0x04020019, 0x40100000, + 0x81440580, 0x0402000a, 0x40366800, 0x8c204508, + 0x04000053, 0x0401ff8a, 0x04020051, 0x4947c857, + 0x42000000, 0x0000001d, 0x0401f04e, 0x4947c857, + 0x480bc857, 0x4823c857, 0x42000000, 0x0000001a, + 0x0401f048, 0x4947c857, 0x4863c857, 0x4813c857, + 0x42000000, 0x00000019, 0x0401f042, 0x40100000, + 0x81440580, 0x04020007, 0x58343002, 0x4947c857, + 0x481bc857, 0x42000000, 0x0000001b, 0x0401f039, + 0x80102000, 0x80387000, 0x83444c80, 0x000007f0, + 0x04001009, 0x82104d80, 0x00000800, 0x0402000c, + 0x42002000, 0x000007f0, 0x42007000, 0x0010b3f0, + 0x0401f007, 0x82104d80, 0x000007f0, 0x04020004, + 0x41782000, 0x42007000, 0x0010ac00, 0x8058b040, + 0x040207a4, 0x801429c0, 0x04020007, 0x0201f800, + 0x001005d8, 0x4947c857, 0x42000000, 0x0000000a, + 0x0401f01c, 0x4d2c0000, 0x4c180000, 0x40603000, + 0x0401fc12, 0x4947c857, 0x4937c857, 0x5c003000, + 0x5c025800, 0x040207f4, 0x497a6a12, 0x59a80026, + 0x8c00050a, 0x0402000d, 0x82600500, 0x00ffff00, + 0x04000006, 0x59a84810, 0x82244d00, 0x00ffff00, + 0x80240580, 0x04020005, 0x82600500, 0x000000ff, + 0x800000d0, 0x48026a12, 0x48626802, 0x80000580, + 0x80000540, 0x5c00c000, 0x5c004800, 0x5c006800, + 0x5c007000, 0x1c01f000, 0x5934000f, 0x5934140b, + 0x80081040, 0x04001002, 0x480a6c0b, 0x80000540, + 0x02020800, 0x00020253, 0x1c01f000, 0x4803c857, + 0x4947c857, 0x4c300000, 0x82006500, 0x00000030, + 0x04000006, 0x4c000000, 0x0201f800, 0x0010942a, + 0x5c000000, 0x0402000b, 0x8c00050e, 0x04000006, + 0x0201f800, 0x00020245, 0x04020006, 0x4937c857, + 0x0401fc2f, 0x80000580, 0x5c006000, 0x1c01f000, + 0x82000540, 0x00000001, 0x0401f7fc, 0x4803c857, + 0x4c580000, 0x4d440000, 0x40001000, 0x80000d80, + 0x4200b000, 0x000007f0, 0x4c040000, 0x40068800, + 0x4c080000, 0x40080000, 0x0401ffdd, 0x5c001000, + 0x5c000800, 0x80040800, 0x8058b040, 0x040207f7, + 0x5c028800, 0x5c00b000, 0x1c01f000, 0x4c5c0000, + 0x59340400, 0x8200bd80, 0x00000606, 0x5c00b800, + 0x1c01f000, 0x4c5c0000, 0x59340400, 0x8200bd80, + 0x00000404, 0x5c00b800, 0x1c01f000, 0x4c5c0000, + 0x59340400, 0x8200bd80, 0x00000404, 0x04000003, + 0x8200bd80, 0x00000606, 0x5c00b800, 0x1c01f000, + 0x4c5c0000, 0x4c600000, 0x59340400, 0x8200bd00, + 0x0000ff00, 0x825cc580, 0x00000400, 0x04000003, + 0x825cc580, 0x00000600, 0x5c00c000, 0x5c00b800, + 0x1c01f000, 0x4c5c0000, 0x59340400, 0x82000500, + 0x000000ff, 0x8200bd80, 0x00000003, 0x04000003, + 0x8200bd80, 0x00000005, 0x5c00b800, 0x1c01f000, + 0x4c5c0000, 0x59340400, 0x82000500, 0x0000ff00, + 0x8400b9c0, 0x805c0580, 0x4937c857, 0x4803c857, + 0x48026c00, 0x5c00b800, 0x1c01f000, 0x4c040000, + 0x4c080000, 0x592c0207, 0x8c00050c, 0x0400000f, + 0x592e8c06, 0x82000500, 0x00000080, 0x84000548, + 0x4d3c0000, 0x42027800, 0x00001000, 0x0401ff90, + 0x5c027800, 0x82000540, 0x00000001, 0x5c001000, + 0x5c000800, 0x1c01f000, 0x80000580, 0x0401f7fc, + 0x592c040b, 0x82000500, 0x0000e000, 0x82000580, + 0x00006000, 0x04000019, 0x836c0580, 0x00000003, + 0x04000016, 0x836c0580, 0x00000002, 0x040200ff, + 0x59a80026, 0x82000d00, 0x00000038, 0x04020005, + 0x59a80832, 0x800409c0, 0x0400000c, 0x0401f0f7, + 0x82000d00, 0x00000003, 0x82040d80, 0x00000003, + 0x040200f2, 0x82000d00, 0x00000028, 0x04020003, + 0x8c00050c, 0x040000ed, 0x592c100a, 0x82080500, + 0xff000000, 0x040200ce, 0x59a80010, 0x80080580, + 0x040000c8, 0x592c0c0b, 0x82040d00, 0x0000e000, + 0x82040480, 0x00008000, 0x040210c8, 0x592e8c06, + 0x83440480, 0x00000800, 0x04001007, 0x83440580, + 0x0000ffff, 0x040200af, 0x800409c0, 0x040200f7, + 0x0401f0ac, 0x800409c0, 0x040200f4, 0x41784000, + 0x0401fead, 0x040200db, 0x42027000, 0x00000053, + 0x592c2409, 0x82100500, 0xffffff00, 0x040200aa, + 0x4813c857, 0x592c000c, 0x800001c0, 0x04000083, + 0x82100580, 0x00000004, 0x040000a0, 0x82100580, + 0x00000051, 0x0400009d, 0x82100580, 0x00000003, + 0x04000016, 0x82100580, 0x00000020, 0x0400004b, + 0x82100580, 0x00000024, 0x04000042, 0x82100580, + 0x00000021, 0x04000042, 0x82100580, 0x00000050, + 0x04000037, 0x82100580, 0x00000052, 0x04000031, + 0x82100580, 0x00000005, 0x0402006b, 0x42027000, + 0x00000001, 0x0401f01b, 0x42027000, 0x00000002, + 0x59a80005, 0x8c000514, 0x04000016, 0x0401ff4c, + 0x04000014, 0x59340212, 0x82000500, 0x0000ff00, + 0x42001000, 0x00000010, 0x0402000c, 0x59a80026, + 0x8c000506, 0x0402006f, 0x42001000, 0x00000008, + 0x59340002, 0x82000500, 0x00ff0000, 0x82000580, + 0x00ff0000, 0x04000003, 0x0401f9bf, 0x04020065, + 0x0201f800, 0x0002075a, 0x0400007e, 0x4a026406, + 0x00000010, 0x49366009, 0x42000800, 0x00000003, + 0x83380580, 0x00000002, 0x04000003, 0x42000800, + 0x0000000b, 0x0201f800, 0x00104571, 0x0401f044, + 0x42027000, 0x00000000, 0x0401f003, 0x42027000, + 0x00000004, 0x0401ff37, 0x04020071, 0x0401f036, + 0x42027000, 0x00000033, 0x0401f006, 0x42027000, + 0x00000005, 0x0401f003, 0x42027000, 0x00000003, + 0x0401ff23, 0x04020066, 0x59a80005, 0x8c000514, + 0x04000016, 0x0401ff12, 0x04000014, 0x59340212, + 0x82000500, 0x0000ff00, 0x42001000, 0x00000010, + 0x0402000c, 0x59a80026, 0x8c000506, 0x04020035, + 0x42001000, 0x00000008, 0x59340002, 0x82000500, + 0x00ff0000, 0x82000580, 0x00ff0000, 0x04000003, + 0x0401f985, 0x0402002b, 0x0201f800, 0x0002075a, + 0x04000044, 0x4a026406, 0x00000010, 0x49366009, + 0x42000800, 0x00000005, 0x83380580, 0x00000003, + 0x04000003, 0x42000800, 0x00000009, 0x0201f800, + 0x00104571, 0x0401f00a, 0x82102580, 0x00000011, + 0x0402002d, 0x0201f800, 0x0002075a, 0x04000031, + 0x4a026406, 0x00000010, 0x49366009, 0x492e6008, + 0x49325808, 0x813669c0, 0x04000007, 0x592c0c0b, + 0x8c040d18, 0x04000004, 0x59340200, 0x84000514, + 0x48026a00, 0x0201f800, 0x000207a1, 0x80000580, + 0x1c01f000, 0x82000540, 0x00000001, 0x0401f7fd, + 0x42001000, 0x0000000a, 0x0401f015, 0x42001000, + 0x00000010, 0x0401f012, 0x42001000, 0x00000016, + 0x0401f00f, 0x42001000, 0x00000017, 0x0401f00c, + 0x42001000, 0x00000018, 0x0401f009, 0x42001000, + 0x0000001b, 0x0401f006, 0x42001000, 0x0000001e, + 0x0401f003, 0x42001000, 0x00000020, 0x42000800, + 0x00000019, 0x42028000, 0x00000031, 0x0401f7e2, + 0x42000800, 0x00000003, 0x0401f003, 0x42000800, + 0x0000000a, 0x41781000, 0x0401f7f7, 0x42000800, + 0x00000009, 0x59341400, 0x0401f7f3, 0x42028000, + 0x00000008, 0x0401f005, 0x42000800, 0x00000007, + 0x416c1000, 0x0401f7ec, 0x41780800, 0x41781000, + 0x0401f7cd, 0x42028000, 0x00000000, 0x0401f7fb, + 0x82004d80, 0x0000001d, 0x02000800, 0x001005d8, + 0x82004d80, 0x0000001a, 0x04020004, 0x40101000, + 0x40000800, 0x0401f7dc, 0x82004d80, 0x0000001b, + 0x04020003, 0x40181000, 0x0401f7fa, 0x82004d80, + 0x0000001c, 0x040007f7, 0x82004d80, 0x00000019, + 0x040007b8, 0x0401f7d6, 0x592e6008, 0x0201f800, + 0x0010941a, 0x040007b6, 0x59300c06, 0x82040580, + 0x00000011, 0x040207d6, 0x83440580, 0x0000ffff, + 0x04020005, 0x59326809, 0x813669c0, 0x0400000e, + 0x0401f7cf, 0x592c100a, 0x82081500, 0x00ffffff, + 0x41784000, 0x0401fda8, 0x040207d6, 0x59300009, + 0x800001c0, 0x04000003, 0x81340580, 0x040207c4, + 0x49366009, 0x592c0c0b, 0x82041500, 0x0000e000, + 0x82080580, 0x00006000, 0x04000009, 0x59300a03, + 0x82040580, 0x00000007, 0x040207b9, 0x492e6008, + 0x42027000, 0x00000054, 0x0401f77f, 0x0201f800, + 0x0010a8d4, 0x040007bc, 0x0401f7b1, 0x492fc857, + 0x59a80021, 0x800001c0, 0x04020073, 0x592e6008, + 0x4933c857, 0x0201f800, 0x0010941a, 0x04000041, + 0x59301406, 0x82080580, 0x00000005, 0x0402005b, + 0x59301203, 0x82080580, 0x00000007, 0x04020057, + 0x592e8c06, 0x83440480, 0x00000800, 0x04021032, + 0x41784000, 0x592c1009, 0x82081500, 0x00ffffff, + 0x0401fd75, 0x0402005f, 0x59300009, 0x800001c0, + 0x04000003, 0x81340580, 0x04020048, 0x4d300000, + 0x592e6013, 0x4933c857, 0x83300580, 0xffffffff, + 0x0400000d, 0x0201f800, 0x0010941a, 0x5c026000, + 0x04000029, 0x591c1406, 0x82080580, 0x00000006, + 0x04000046, 0x82080580, 0x00000011, 0x04000043, + 0x0401f002, 0x5c026000, 0x59a80010, 0x592c100a, + 0x82081500, 0x00ffffff, 0x80081580, 0x04020017, + 0x592c1009, 0x82081500, 0x00ffffff, 0x80081580, + 0x0400000f, 0x49366009, 0x492e6008, 0x42027000, + 0x00000092, 0x0201f800, 0x000207a1, 0x80000580, + 0x1c01f000, 0x42001000, 0x0000000a, 0x0401f00c, + 0x42001000, 0x00000010, 0x0401f009, 0x42001000, + 0x00000014, 0x0401f006, 0x42001000, 0x00000018, + 0x0401f003, 0x42001000, 0x0000003c, 0x492fc857, + 0x480bc857, 0x42000800, 0x00000019, 0x42028000, + 0x00000031, 0x82000540, 0x00000001, 0x0401f7e9, + 0x492fc857, 0x4803c857, 0x480bc857, 0x40000800, + 0x0401f7f7, 0x492fc857, 0x42000800, 0x0000000a, + 0x41781000, 0x0401f7f2, 0x4933c857, 0x59300406, + 0x4803c857, 0x59300203, 0x4803c857, 0x59300009, + 0x4803c857, 0x42028000, 0x00000008, 0x41780800, + 0x41781000, 0x0401f7e8, 0x42000800, 0x0000001e, + 0x0401f7f0, 0x42000800, 0x00000001, 0x0401f7ed, + 0x82004d80, 0x0000001d, 0x02000800, 0x001005d8, + 0x82004d80, 0x0000001a, 0x04020003, 0x40101000, + 0x0401f7dc, 0x82004d80, 0x0000001b, 0x04020003, + 0x40181000, 0x0401f7d7, 0x82004d80, 0x0000001c, + 0x040007d4, 0x82004d80, 0x00000019, 0x040007d1, + 0x0401f7d5, 0x59302009, 0x801021c0, 0x04000035, + 0x58101400, 0x82081d00, 0x000000ff, 0x59300c03, + 0x82040580, 0x00000008, 0x04000022, 0x82040580, + 0x0000000a, 0x04000017, 0x82040580, 0x0000000c, + 0x04000010, 0x82040580, 0x00000002, 0x04000019, + 0x82040580, 0x00000001, 0x04000012, 0x82040580, + 0x00000003, 0x0400000b, 0x82040580, 0x00000005, + 0x04000004, 0x82040580, 0x00000033, 0x04020019, + 0x820c0580, 0x00000009, 0x0400000d, 0x0401f015, + 0x820c0580, 0x00000005, 0x04000009, 0x0401f011, + 0x820c0580, 0x0000000b, 0x04000005, 0x0401f00d, + 0x820c0580, 0x00000003, 0x0402000a, 0x82081d00, + 0xffffff00, 0x840c01c0, 0x800c0540, 0x4813c857, + 0x480bc857, 0x4807c857, 0x4803c857, 0x48002400, + 0x1c01f000, 0x599c0017, 0x8c00050a, 0x04000003, + 0x80000580, 0x1c01f000, 0x59a80026, 0x82000500, + 0x00000028, 0x04000008, 0x42028800, 0x000007fd, + 0x0201f800, 0x00020245, 0x04020003, 0x5934000a, + 0x8c000504, 0x1c01f000, 0x4d300000, 0x5934000e, + 0x80026540, 0x04000006, 0x0201f800, 0x001062d5, + 0x02000800, 0x001064ad, 0x497a680e, 0x5c026000, + 0x1c01f000, 0x4d440000, 0x4d340000, 0x80000580, + 0x40001800, 0x40028800, 0x82080580, 0x00000008, + 0x04020003, 0x42001800, 0x00000001, 0x0201f800, + 0x00020245, 0x0402000a, 0x0401fd6d, 0x04020008, + 0x800c19c0, 0x04000004, 0x59340405, 0x8c000508, + 0x04000003, 0x80081040, 0x04000009, 0x81468800, + 0x83440480, 0x00000800, 0x040017f1, 0x80000580, + 0x5c026800, 0x5c028800, 0x1c01f000, 0x82000540, + 0x00000001, 0x5c026800, 0x5c028800, 0x1c01f000, + 0x4a033020, 0x00000000, 0x497b3026, 0x497b3027, + 0x497b3028, 0x497b3029, 0x497b302b, 0x497b3021, + 0x4a03b104, 0x60000001, 0x1c01f000, 0x4803c856, + 0x599c0018, 0x497b3024, 0x497b3025, 0x82000500, + 0x0000000f, 0x82000d80, 0x00000005, 0x04000006, + 0x82000580, 0x00000006, 0x0400000d, 0x497b3022, + 0x1c01f000, 0x4a033022, 0x00000005, 0x599c0216, + 0x82000500, 0x0000ffff, 0x04020003, 0x42000000, + 0x00000002, 0x48033023, 0x1c01f000, 0x4a033022, + 0x00000006, 0x0401f7f6, 0x0401ffe5, 0x4a03c826, + 0x00000004, 0x599c0209, 0x80000540, 0x0400001f, + 0x599c0207, 0x80000540, 0x04000007, 0x800000cc, + 0x599c080d, 0x80040400, 0x4803b100, 0x497bb102, + 0x59d80101, 0x599c000d, 0x4803b100, 0x599c000e, + 0x4803b101, 0x599c0207, 0x80000540, 0x04020002, + 0x497bb102, 0x599c0a09, 0x82040540, 0x00400000, + 0x59980822, 0x4803b103, 0x4a03b109, 0x00000004, + 0x4a03b104, 0x10000001, 0x800409c0, 0x04020004, + 0x4a033020, 0x00000001, 0x1c01f000, 0x4a033020, + 0x00000002, 0x0401f7fd, 0x59980022, 0x4803c856, + 0x80000540, 0x02000000, 0x000202de, 0x0401f017, + 0x42034000, 0x0010b4a4, 0x59a1d81e, 0x80edd9c0, + 0x02000800, 0x001005d8, 0x58ec0009, 0x48efc857, + 0x49a3c857, 0x492fc857, 0x4803c857, 0x800001c0, + 0x08020000, 0x0201f800, 0x001005d8, 0x5931d821, + 0x58ef400b, 0x58ec0009, 0x800001c0, 0x08020000, + 0x0201f800, 0x001005d8, 0x497a5800, 0x59980026, + 0x80000540, 0x0402008c, 0x59d80105, 0x82000d00, + 0x00018780, 0x040201da, 0x80000106, 0x82000500, + 0x00000003, 0x0c01f001, 0x00104d0a, 0x00104d89, + 0x00104d22, 0x00104d50, 0x592c0001, 0x492fc857, + 0x492fb107, 0x80000d40, 0x04020007, 0x59940019, + 0x80000540, 0x04022003, 0x59980023, 0x48032819, + 0x1c01f000, 0x497a5801, 0x40065800, 0x592c0001, + 0x496a5800, 0x815eb800, 0x412ed000, 0x80000d40, + 0x040207f9, 0x59c80000, 0x82000540, 0x00001200, + 0x48039000, 0x0401f7ee, 0x492fc857, 0x492fb107, + 0x592c0001, 0x80000d40, 0x04020012, 0x59da5908, + 0x835c0480, 0x00000020, 0x0400101c, 0x0402b01a, + 0x492fb007, 0x0400e7fa, 0x59d80105, 0x82000500, + 0x00018780, 0x040201aa, 0x59940019, 0x80000540, + 0x04022003, 0x59980023, 0x48032819, 0x1c01f000, + 0x497a5801, 0x40065800, 0x592c0001, 0x496a5800, + 0x815eb800, 0x412ed000, 0x80000d40, 0x040207f9, + 0x59c80000, 0x82000540, 0x00001200, 0x48039000, + 0x0401f7e3, 0x0400f009, 0x496a5800, 0x412ed000, + 0x815eb800, 0x59c80000, 0x82000540, 0x00001200, + 0x48039000, 0x0401f7e0, 0x492fa807, 0x0401f7de, + 0x492fc857, 0x59d81108, 0x45681000, 0x400ad000, + 0x815eb800, 0x0400e7fc, 0x59c80000, 0x82000540, + 0x00001200, 0x48039000, 0x0402d00c, 0x592c0001, + 0x492fc857, 0x492fb107, 0x80000d40, 0x0402001d, + 0x59940019, 0x80000540, 0x04022003, 0x59980023, + 0x48032819, 0x1c01f000, 0x59d80105, 0x82000500, + 0x00018780, 0x04020172, 0x42000000, 0x0010b855, + 0x0201f800, 0x0010aa47, 0x59980026, 0x59980828, + 0x80000000, 0x48033026, 0x492fc857, 0x800409c0, + 0x492f3028, 0x04000003, 0x492c0800, 0x0401f002, + 0x492f3029, 0x592c0001, 0x80000d40, 0x040007e5, + 0x497a5801, 0x40065800, 0x592c0001, 0x496a5800, + 0x815eb800, 0x412ed000, 0x80000d40, 0x040207f9, + 0x59c80000, 0x82000540, 0x00001200, 0x48039000, + 0x0401f7d8, 0x59980026, 0x59980828, 0x80000000, + 0x48033026, 0x492fc857, 0x800409c0, 0x492f3028, + 0x04000003, 0x492c0800, 0x0401f002, 0x492f3029, + 0x592c0001, 0x80000d40, 0x04020027, 0x0402d00e, + 0x59980029, 0x80025d40, 0x0400000f, 0x59980026, + 0x80000040, 0x48033026, 0x04020002, 0x48033028, + 0x592c0000, 0x48033029, 0x492fc857, 0x492fb107, + 0x0400d7f4, 0x42000000, 0x0010b855, 0x0201f800, + 0x0010aa47, 0x0402e00a, 0x59da5908, 0x496a5800, + 0x412ed000, 0x815eb800, 0x0400e7fc, 0x59c80000, + 0x82000540, 0x00001200, 0x48039000, 0x59d80105, + 0x82000500, 0x00018780, 0x04020125, 0x59940019, + 0x80000540, 0x04022003, 0x59980023, 0x48032819, + 0x1c01f000, 0x497a5801, 0x40065800, 0x592c0001, + 0x496a5800, 0x815eb800, 0x412ed000, 0x80000d40, + 0x040207f9, 0x59c80000, 0x82000540, 0x00001200, + 0x48039000, 0x0401f7ce, 0x592c0204, 0x4803c856, + 0x04000008, 0x42034000, 0x0010b4a4, 0x59a1d81e, + 0x80edd9c0, 0x02000800, 0x001005d8, 0x0401f003, + 0x5931d821, 0x58ef400b, 0x58ec0009, 0x800001c0, + 0x08020000, 0x0201f800, 0x001005d8, 0x497a5801, + 0x40065800, 0x592c0001, 0x496a5800, 0x412ed000, + 0x815eb800, 0x80000d40, 0x040207f9, 0x59c80000, + 0x82000540, 0x00001200, 0x48039000, 0x1c01f000, + 0x497a5801, 0x40065800, 0x592c0001, 0x496a5800, + 0x412ed000, 0x815eb800, 0x80000d40, 0x040207f9, + 0x59c80000, 0x82000540, 0x00001200, 0x48039000, + 0x0200e000, 0x000202fb, 0x0201f000, 0x00020302, + 0x5998002b, 0x84000540, 0x4803302b, 0x0201f000, + 0x0002035e, 0x42000000, 0x0010b855, 0x0201f800, + 0x0010aa47, 0x492fc857, 0x59980026, 0x59980828, + 0x80000000, 0x48033026, 0x800409c0, 0x492f3028, + 0x04000003, 0x492c0800, 0x0401f002, 0x492f3029, + 0x592c0001, 0x80000d40, 0x04020002, 0x1c01f000, + 0x497a5801, 0x40065800, 0x592c0001, 0x496a5800, + 0x412ed000, 0x815eb800, 0x80000d40, 0x040207f9, + 0x59c80000, 0x82000540, 0x00001200, 0x48039000, + 0x1c01f000, 0x59980026, 0x59980828, 0x80000000, + 0x48033026, 0x492fc857, 0x800409c0, 0x492f3028, + 0x04000003, 0x492c0800, 0x0401f002, 0x492f3029, + 0x592c0001, 0x80000d40, 0x04020039, 0x0402d00e, + 0x59980029, 0x80025d40, 0x0400000f, 0x59980026, + 0x80000040, 0x48033026, 0x04020002, 0x48033028, + 0x592c0000, 0x48033029, 0x492fc857, 0x492fb107, + 0x0400d7f4, 0x42000000, 0x0010b855, 0x0201f800, + 0x0010aa47, 0x0402e01d, 0x59da5908, 0x496a5800, + 0x412ed000, 0x815eb800, 0x0400e7fc, 0x59c80000, + 0x82000540, 0x00001200, 0x48039000, 0x04006018, + 0x59d8010a, 0x59d8090a, 0x80040d80, 0x040207fd, + 0x900001c0, 0x82000540, 0x00000013, 0x4803c011, + 0x5998002b, 0x84000500, 0x4803302b, 0x59e00017, + 0x8c000508, 0x04000003, 0x4a03c017, 0x00000003, + 0x4203e000, 0x30000001, 0x59d80105, 0x82000500, + 0x00018780, 0x0402007e, 0x1c01f000, 0x5998002b, + 0x84000540, 0x4803302b, 0x0401f7f8, 0x497a5801, + 0x40065800, 0x592c0001, 0x496a5800, 0x412ed000, + 0x815eb800, 0x80000d40, 0x040207f9, 0x59c80000, + 0x82000540, 0x00001200, 0x48039000, 0x0401f7bc, + 0x5c000000, 0x4c000000, 0x4803c857, 0x492fc857, + 0x4943c857, 0x4807c857, 0x4a025a04, 0x00000103, + 0x49425a06, 0x48065a08, 0x4a025c06, 0x0000ffff, + 0x813261c0, 0x04000003, 0x59300402, 0x48025c06, + 0x832c0400, 0x00000009, 0x04011000, 0x4803c840, + 0x4a03c842, 0x0000000b, 0x04011000, 0x1c01f000, + 0x4df00000, 0x4203e000, 0x50000000, 0x599cb817, + 0x59940019, 0x80000540, 0x04002023, 0x0400000e, + 0x59980022, 0x82000580, 0x00000005, 0x0400001e, + 0x59a80069, 0x81640580, 0x0402001b, 0x8c5cbd08, + 0x04000005, 0x59a8006a, 0x59a80866, 0x80040580, + 0x04020015, 0x8c5cbd08, 0x04020030, 0x59d8090b, + 0x59d8010a, 0x80040580, 0x0400000d, 0x0400600e, + 0x4a03c011, 0x80400012, 0x4a03c020, 0x00008040, + 0x59e00017, 0x8c000508, 0x04000003, 0x4a03c017, + 0x00000002, 0x4203e000, 0x30000001, 0x4a032819, + 0xffff0000, 0x04026835, 0x04006003, 0x8c5cbd08, + 0x04020860, 0x59980029, 0x80025d40, 0x04000010, + 0x59d80105, 0x82000500, 0x00018780, 0x04020020, + 0x0402d00d, 0x59980026, 0x492fc857, 0x80000040, + 0x48033026, 0x592c0000, 0x492fb107, 0x48033029, + 0x04020003, 0x4803c856, 0x48033028, 0x5c03e000, + 0x1c01f000, 0x42000000, 0x0010b855, 0x0201f800, + 0x0010aa47, 0x0401f7fa, 0x59e0000f, 0x59e0080f, + 0x80040580, 0x040207fd, 0x59e00010, 0x59e01010, + 0x80081580, 0x040207fd, 0x40065000, 0x80041580, + 0x040007c7, 0x040067dc, 0x0401f7ca, 0x4803c857, + 0x485fc857, 0x8c00050e, 0x02020800, 0x001005d0, + 0x4203e000, 0x50000000, 0x4200b800, 0x00008004, + 0x0201f000, 0x001005dd, 0x5998002b, 0x8c000500, + 0x04000013, 0x84000500, 0x4803302b, 0x59d8010a, + 0x59d8090a, 0x80040580, 0x040207fd, 0x800408e0, + 0x82040d40, 0x00000013, 0x4807c011, 0x59e00017, + 0x8c000508, 0x04000003, 0x4a03c017, 0x00000003, + 0x4203e000, 0x30000001, 0x1c01f000, 0x0402e014, + 0x59da5908, 0x496a5800, 0x412ed000, 0x815eb800, + 0x0400e7fc, 0x59c80000, 0x82000540, 0x00001200, + 0x48039000, 0x59d8090b, 0x59980024, 0x48073024, + 0x80040480, 0x04020004, 0x59940019, 0x80000540, + 0x04022003, 0x59980823, 0x48072819, 0x59d80105, + 0x82000500, 0x00018780, 0x040207c9, 0x1c01f000, + 0x59981025, 0x59e00010, 0x59e00810, 0x80041d80, + 0x040207fd, 0x80080580, 0x04000013, 0x48073025, + 0x59e0000f, 0x59e0100f, 0x80081d80, 0x040207fd, + 0x81280580, 0x04000008, 0x400a5000, 0x40080000, + 0x80040580, 0x04000003, 0x59980823, 0x48072819, + 0x1c01f000, 0x59940019, 0x80000540, 0x040227f8, + 0x0401f7fc, 0x59e0000f, 0x59e0100f, 0x80081d80, + 0x040207fd, 0x81280580, 0x040007f6, 0x400a5000, + 0x59940019, 0x80000540, 0x040027ed, 0x0401f7f1, + 0x59a80017, 0x82000c80, 0x0000000a, 0x02021800, + 0x001005d8, 0x0c01f809, 0x4a038805, 0x000000f0, + 0x59c400a3, 0x82000500, 0x02870000, 0x02020800, + 0x001005d8, 0x1c01f000, 0x00104fc5, 0x00104f51, + 0x00104f6c, 0x00104f95, 0x00104fb8, 0x00104ff2, + 0x00105004, 0x00104f6c, 0x00104fd6, 0x00104f50, + 0x1c01f000, 0x4a038808, 0x00000004, 0x0401f8f9, + 0x0201f800, 0x001053ab, 0x59c40805, 0x8c040d0e, + 0x04020013, 0x8c040d0a, 0x0402000b, 0x8c040d0c, + 0x04020006, 0x8c040d08, 0x0400000d, 0x4a035017, + 0x00000003, 0x0401f00a, 0x4a035017, 0x00000000, + 0x0401f007, 0x42000000, 0x0010b844, 0x0201f800, + 0x0010aa47, 0x4a035017, 0x00000002, 0x1c01f000, + 0x4a038808, 0x00000002, 0x0401f8de, 0x59c40805, + 0x8c040d08, 0x04020021, 0x8c040d0c, 0x0402001c, + 0x8c040d0e, 0x04020017, 0x82040500, 0x000000f0, + 0x0402001c, 0x0201f800, 0x001053ab, 0x4a038808, + 0x00000080, 0x59c40002, 0x8400050c, 0x48038802, + 0x0401f9d9, 0x4d3c0000, 0x42027800, 0x00000001, + 0x0201f800, 0x00109874, 0x5c027800, 0x4a038808, + 0x00000080, 0x4a035017, 0x00000009, 0x0401f009, + 0x4a035017, 0x00000001, 0x0401f006, 0x4a035017, + 0x00000000, 0x0401f003, 0x4a035017, 0x00000003, + 0x1c01f000, 0x0401f8b7, 0x4a038808, 0x00000080, + 0x59c40805, 0x8c040d0a, 0x0402001b, 0x8c040d0c, + 0x04020016, 0x8c040d0e, 0x04020011, 0x82040500, + 0x000000f0, 0x04020016, 0x59c40002, 0x8400050c, + 0x48038802, 0x0401f9b4, 0x4d3c0000, 0x42027800, + 0x00000001, 0x0201f800, 0x00109874, 0x5c027800, + 0x4a035017, 0x00000009, 0x0401f009, 0x4a035017, + 0x00000001, 0x0401f006, 0x4a035017, 0x00000000, + 0x0401f003, 0x4a035017, 0x00000002, 0x1c01f000, + 0x4a038808, 0x00000008, 0x59c40805, 0x8c040d0c, + 0x04020006, 0x8c040d0e, 0x04000006, 0x4a035017, + 0x00000001, 0x0401f003, 0x4a035017, 0x00000000, + 0x1c01f000, 0x0401f8d3, 0x59c40805, 0x8c040d0c, + 0x0402000d, 0x4c040000, 0x0401f882, 0x5c000800, + 0x8c040d0a, 0x04020006, 0x8c040d0e, 0x04000006, + 0x4a035017, 0x00000001, 0x0401f003, 0x4a035017, + 0x00000002, 0x1c01f000, 0x4a038808, 0x00000008, + 0x42001000, 0x00105058, 0x0201f800, 0x00106084, + 0x59c40805, 0x8c040d0a, 0x0402000d, 0x8c040d08, + 0x0402000b, 0x8c040d0c, 0x04020006, 0x8c040d0e, + 0x0400000d, 0x4a035017, 0x00000001, 0x0401f00a, + 0x4a035017, 0x00000000, 0x0401f007, 0x42000000, + 0x0010b844, 0x0201f800, 0x0010aa47, 0x4a035017, + 0x00000004, 0x1c01f000, 0x0401f8a6, 0x0401f859, + 0x59c40805, 0x8c040d0a, 0x0402000b, 0x8c040d0c, + 0x04020006, 0x8c040d0e, 0x04000009, 0x4a035017, + 0x00000001, 0x0401f006, 0x4a035017, 0x00000000, + 0x0401f003, 0x4a035017, 0x00000002, 0x1c01f000, + 0x4a038808, 0x00000004, 0x0401f846, 0x59c40805, + 0x8c040d0a, 0x04020010, 0x8c040d08, 0x0402000b, + 0x8c040d0c, 0x04020006, 0x8c040d0e, 0x0400000c, + 0x4a035017, 0x00000001, 0x0401f009, 0x4a035017, + 0x00000000, 0x0401f006, 0x4a035017, 0x00000003, + 0x0401f003, 0x4a035017, 0x00000002, 0x1c01f000, + 0x0401f91f, 0x02020800, 0x001005d8, 0x59a80805, + 0x8c040d0c, 0x04000015, 0x84040d0c, 0x48075005, + 0x4a038805, 0x00000010, 0x0201f800, 0x00101937, + 0x59c40005, 0x8c000508, 0x04000008, 0x4a038808, + 0x00000008, 0x4a035033, 0x00000001, 0x4202d800, + 0x00000001, 0x0401f01a, 0x59c40006, 0x84000548, + 0x48038806, 0x0401f016, 0x59a80017, 0x82000580, + 0x00000001, 0x0400000c, 0x59a80017, 0x82000580, + 0x00000005, 0x0402000c, 0x42000000, 0x0010b844, + 0x0201f800, 0x0010aa47, 0x4a035017, 0x00000008, + 0x0401f007, 0x42000000, 0x0010b844, 0x0201f800, + 0x0010aa47, 0x4a035017, 0x00000004, 0x1c01f000, + 0x4803c856, 0x4c040000, 0x4c080000, 0x42000800, + 0x00000064, 0x42001000, 0x00105058, 0x0201f800, + 0x00106079, 0x5c001000, 0x5c000800, 0x1c01f000, + 0x4803c856, 0x4c040000, 0x0201f800, 0x00106c55, + 0x4df00000, 0x0201f800, 0x00106e21, 0x5c03e000, + 0x02000800, 0x00106c4b, 0x0401ffba, 0x5c000800, + 0x1c01f000, 0x4803c856, 0x4c040000, 0x4c080000, + 0x0201f800, 0x00106c55, 0x4df00000, 0x0201f800, + 0x00106e21, 0x5c03e000, 0x02000800, 0x00106c4b, + 0x59c40006, 0x84000500, 0x48038806, 0x0201f800, + 0x00106ede, 0x497b8880, 0x0201f800, 0x0010a9c0, + 0x0201f800, 0x0010a9ce, 0x0201f800, 0x00101815, + 0x4a03504c, 0x00000004, 0x4202d800, 0x00000004, + 0x4a038805, 0x00000001, 0x42001000, 0x00105058, + 0x0201f800, 0x00106084, 0x0201f800, 0x001006d4, + 0x0401f8c1, 0x04000006, 0x42006000, 0xfeffffff, + 0x41786800, 0x0201f800, 0x0010427d, 0x0201f800, + 0x00100452, 0x42000000, 0x00000001, 0x0201f800, + 0x00101590, 0x5c001000, 0x5c000800, 0x1c01f000, + 0x59c40008, 0x8c000508, 0x04020007, 0x4a038808, + 0x00000010, 0x4201d000, 0x00001388, 0x0201f800, + 0x0010608e, 0x1c01f000, 0x4c040000, 0x59a80833, + 0x82040580, 0x00000000, 0x0400000b, 0x82040580, + 0x00000001, 0x0400000b, 0x82040580, 0x00000002, + 0x0400000b, 0x82040580, 0x00000003, 0x0400000b, + 0x0401f057, 0x4a035017, 0x00000000, 0x0401f009, + 0x4a035017, 0x00000004, 0x0401f006, 0x4a035017, + 0x00000001, 0x0401f003, 0x4a035017, 0x00000007, + 0x497b8880, 0x4a038893, 0x00000001, 0x41780000, + 0x0201f800, 0x00101606, 0x0201f800, 0x00106ede, + 0x836c0d80, 0x00000004, 0x04000008, 0x59c40006, + 0x82000500, 0xffffff0f, 0x82000540, 0x04000001, + 0x48038806, 0x0401f007, 0x59c40006, 0x82000500, + 0xffffff0f, 0x82000540, 0x04000000, 0x48038806, + 0x0401f875, 0x04020005, 0x59c40806, 0x82040d00, + 0xfbffff0f, 0x48078806, 0x4200b000, 0x00000005, + 0x59c40005, 0x8c000534, 0x04020033, 0x42006000, + 0xfc18ffff, 0x42006800, 0x01000000, 0x0201f800, + 0x0010427d, 0x0201f800, 0x00101937, 0x59c408a4, + 0x82040d00, 0x0000000f, 0x82040d80, 0x0000000c, + 0x0400000a, 0x42006000, 0xfeffffff, 0x42006800, + 0x02000000, 0x0201f800, 0x0010427d, 0x8058b040, + 0x040207e8, 0x0401f8a1, 0x0401f853, 0x04000006, + 0x42006000, 0xfeffffff, 0x41786800, 0x0201f800, + 0x0010427d, 0x836c0d80, 0x00000004, 0x04000006, + 0x59a8084d, 0x42001000, 0x00105065, 0x0201f800, + 0x0010606e, 0x4a035033, 0x00000004, 0x0401fe31, + 0x0401f841, 0x04020008, 0x59c408a4, 0x82040d00, + 0x0000000f, 0x82040580, 0x0000000c, 0x02020800, + 0x001005d8, 0x5c000800, 0x1c01f000, 0x4803c856, + 0x4c000000, 0x0201f800, 0x0010609e, 0x4a035010, + 0x00ffffff, 0x497b5032, 0x59a8002a, 0x82000500, + 0xffff0000, 0x4803502a, 0x497b8880, 0x497b8893, + 0x41780000, 0x0201f800, 0x00101606, 0x59c40001, + 0x82000500, 0xfffffcff, 0x48038801, 0x42006000, + 0xfc18ffff, 0x41786800, 0x0201f800, 0x0010427d, + 0x4a038808, 0x00000000, 0x5c000000, 0x800001c0, + 0x02020800, 0x0010411d, 0x4a038805, 0x040000f0, + 0x59c40006, 0x82000500, 0xffffffcf, 0x82000540, + 0x440000c1, 0x48038806, 0x1c01f000, 0x4c5c0000, + 0x59a8b832, 0x825cbd80, 0x0000aaaa, 0x5c00b800, + 0x1c01f000, 0x4c5c0000, 0x599cb818, 0x825cbd00, + 0x00000030, 0x825cbd80, 0x00000000, 0x5c00b800, + 0x1c01f000, 0x4c5c0000, 0x599cb818, 0x825cbd00, + 0x00000030, 0x825cbd80, 0x00000010, 0x5c00b800, + 0x1c01f000, 0x4c5c0000, 0x599cb818, 0x825cbd00, + 0x00000030, 0x825cbd80, 0x00000020, 0x5c00b800, + 0x1c01f000, 0x59a80005, 0x4803c857, 0x82000d00, + 0x00000013, 0x04000025, 0x599c1017, 0x4d3c0000, + 0x82000500, 0x00000011, 0x04000007, 0x42027800, + 0x00000400, 0x0201f800, 0x00103b25, 0x0402000a, + 0x0401f012, 0x42027800, 0x00000408, 0x0201f800, + 0x00103b25, 0x0400000d, 0x42003000, 0x00000003, + 0x0401f003, 0x42003000, 0x00000004, 0x42028000, + 0x0000000e, 0x0201f800, 0x0010a449, 0x599c1017, + 0x8c08150a, 0x04020007, 0x42028000, 0x00000004, + 0x0201f800, 0x00101fe5, 0x80000580, 0x0401f80d, + 0x5c027800, 0x0401f00a, 0x0201f800, 0x00103b25, + 0x04000007, 0x42028000, 0x0000000f, 0x42003000, + 0x00000001, 0x0201f800, 0x0010a449, 0x1c01f000, + 0x59a80005, 0x04000004, 0x82000540, 0x00000010, + 0x0401f003, 0x82000500, 0xffffffef, 0x48035005, + 0x4803c857, 0x1c01f000, 0x4803c856, 0x4c580000, + 0x42000000, 0x0010b8cb, 0x0201f800, 0x0010aa47, + 0x42000800, 0x0010c0f1, 0x59c40003, 0x44000800, + 0x59c40004, 0x48000801, 0x59c4000b, 0x48000802, + 0x59c4008e, 0x48000803, 0x59c4008f, 0x48000804, + 0x59c40090, 0x48000805, 0x59c40091, 0x48000806, + 0x59c40092, 0x48000807, 0x59c40093, 0x48000808, + 0x59c40099, 0x48000809, 0x59c4009e, 0x4800080a, + 0x59c400aa, 0x4800080b, 0x59c400af, 0x4800080c, + 0x59c400b2, 0x4800080d, 0x59c400b1, 0x4800080e, + 0x82040c00, 0x0000000f, 0x41c41800, 0x4200b000, + 0x00000030, 0x580c0050, 0x44000800, 0x80040800, + 0x800c1800, 0x8058b040, 0x040207fb, 0x41c41800, + 0x4200b000, 0x00000020, 0x580c0010, 0x44000800, + 0x80040800, 0x800c1800, 0x8058b040, 0x040207fb, + 0x497b8830, 0x4200b000, 0x00000040, 0x59c40031, + 0x44000800, 0x80040800, 0x8058b040, 0x040207fc, + 0x497b88ac, 0x4200b000, 0x00000010, 0x59c400ad, + 0x44000800, 0x80040800, 0x8058b040, 0x040207fc, + 0x59c41001, 0x4c080000, 0x8408150c, 0x480b8801, + 0x4a0370e4, 0x00000300, 0x4a0370e5, 0xb0000000, + 0x42000800, 0x00000800, 0x80040840, 0x02000800, + 0x001005d8, 0x59b800e5, 0x8c000538, 0x040207fb, + 0x4a0370e4, 0x00000200, 0x42006000, 0xffffffff, + 0x42006800, 0x80000000, 0x0201f800, 0x0010427d, + 0x4a038807, 0x00000001, 0x497b8807, 0x4a038808, + 0x00000010, 0x42006000, 0xfcf8ffff, 0x42006800, + 0x01000000, 0x0201f800, 0x0010427d, 0x5c001000, + 0x480b8801, 0x42000800, 0x0010c0f1, 0x50040000, + 0x48038803, 0x58040001, 0x48038804, 0x58040002, + 0x4803880b, 0x58040003, 0x4803888e, 0x58040004, + 0x4803888f, 0x58040005, 0x48038890, 0x58040006, + 0x48038891, 0x58040007, 0x48038892, 0x58040008, + 0x48038893, 0x58040009, 0x48038899, 0x5804000a, + 0x4803889e, 0x5804000b, 0x480388aa, 0x5804000c, + 0x480388af, 0x5804000d, 0x480388b2, 0x5804000e, + 0x480388b1, 0x82040c00, 0x0000000f, 0x41c41800, + 0x4200b000, 0x00000030, 0x50040000, 0x48001850, + 0x80040800, 0x800c1800, 0x8058b040, 0x040207fb, + 0x41c41800, 0x4200b000, 0x00000020, 0x50040000, + 0x48001810, 0x80040800, 0x800c1800, 0x8058b040, + 0x040207fb, 0x497b8830, 0x4200b000, 0x00000040, + 0x50040000, 0x48038831, 0x80040800, 0x8058b040, + 0x040207fc, 0x497b88ac, 0x4200b000, 0x00000010, + 0x50040000, 0x480388ad, 0x80040800, 0x8058b040, + 0x040207fc, 0x497b8880, 0x41780000, 0x0201f800, + 0x00101606, 0x59c408a4, 0x82040d00, 0x0000000f, + 0x82040580, 0x0000000c, 0x02020800, 0x001005d8, + 0x4a038805, 0x04000000, 0x5c00b000, 0x1c01f000, + 0x4803c856, 0x4c580000, 0x4ce80000, 0x42000000, + 0x0010b845, 0x0201f800, 0x0010aa47, 0x59c41008, + 0x4c080000, 0x82080500, 0xffffff7f, 0x48038808, + 0x59c40004, 0x82000500, 0x00003e02, 0x04000005, + 0x4201d000, 0x00000014, 0x0201f800, 0x0010608e, + 0x59c40006, 0x82000500, 0xffffff0f, 0x48038806, + 0x4a038805, 0x00000010, 0x4a038808, 0x00000004, + 0x4200b000, 0x00000065, 0x59c40005, 0x8c000508, + 0x04020012, 0x4201d000, 0x000003e8, 0x0201f800, + 0x0010608e, 0x8058b040, 0x040207f8, 0x0201f800, + 0x00106ede, 0x4a038808, 0x00000008, 0x4a035033, + 0x00000001, 0x4202d800, 0x00000001, 0x82000540, + 0x00000001, 0x0401f030, 0x0201f800, 0x00100ae0, + 0x42000000, 0x0010b8a8, 0x0201f800, 0x0010aa47, + 0x0201f800, 0x00100ef4, 0x497b8880, 0x59a8002a, + 0x82000500, 0x0000ffff, 0x4c000000, 0x0201f800, + 0x00101606, 0x5c000000, 0x48038880, 0x4a038808, + 0x00000000, 0x4200b000, 0x00000065, 0x4a038805, + 0x000000f0, 0x0201f800, 0x00101937, 0x42000800, + 0x000000f0, 0x59c40005, 0x80040d00, 0x04000008, + 0x4201d000, 0x000003e8, 0x0201f800, 0x0010608e, + 0x8058b040, 0x040207f2, 0x0401f7d1, 0x59c40006, + 0x82000540, 0x000000f0, 0x48038806, 0x59a8001e, + 0x80000540, 0x04020002, 0x80000000, 0x48038893, + 0x80000580, 0x5c001000, 0x4df00000, 0x0201f800, + 0x0010195d, 0x5c03e000, 0x480b8808, 0x5c01d000, + 0x5c00b000, 0x1c01f000, 0x4803c856, 0x4c580000, + 0x4ce80000, 0x59c41008, 0x82080500, 0xffffff7f, + 0x48038808, 0x4c080000, 0x59c40004, 0x82000500, + 0x00003e02, 0x04000005, 0x4201d000, 0x00000014, + 0x0201f800, 0x0010608e, 0x0201f800, 0x00100ae0, + 0x42000000, 0x0010b8a9, 0x0201f800, 0x0010aa47, + 0x0201f800, 0x00100ef4, 0x4a038808, 0x00000002, + 0x80000580, 0x48038880, 0x48038893, 0x0201f800, + 0x00101606, 0x4200b000, 0x00000384, 0x4a038805, + 0x000000f0, 0x0201f800, 0x00101937, 0x42000800, + 0x000000f0, 0x59c40005, 0x80040d00, 0x04000015, + 0x82000500, 0x000000d0, 0x04020012, 0x4201d000, + 0x00000067, 0x0201f800, 0x0010608e, 0x8058b040, + 0x040207ef, 0x0201f800, 0x00106ede, 0x4a038808, + 0x00000008, 0x4a035033, 0x00000001, 0x4202d800, + 0x00000001, 0x82000540, 0x00000001, 0x0401f010, + 0x497b8880, 0x59a8001e, 0x80000540, 0x04020002, + 0x80000000, 0x48038893, 0x59a8002a, 0x82000500, + 0x0000ffff, 0x4c000000, 0x0201f800, 0x00101606, + 0x5c000000, 0x48038880, 0x80000580, 0x5c001000, + 0x4df00000, 0x0201f800, 0x0010195d, 0x5c03e000, + 0x480b8808, 0x5c01d000, 0x5c00b000, 0x1c01f000, + 0x4803c856, 0x59c40004, 0x82000500, 0x00003e02, + 0x0400000a, 0x0201f800, 0x00106ede, 0x4a038808, + 0x00000008, 0x4a035033, 0x00000001, 0x4202d800, + 0x00000001, 0x0401f052, 0x0201f800, 0x00100ae0, + 0x42000000, 0x0010b8aa, 0x0201f800, 0x0010aa47, + 0x0201f800, 0x00100ef4, 0x59c40006, 0x84000508, + 0x48038806, 0x4a038805, 0x00000010, 0x59a80805, + 0x84040d4c, 0x48075005, 0x42000800, 0x00000064, + 0x42001000, 0x00105058, 0x0201f800, 0x0010606e, + 0x4a038808, 0x00000000, 0x497b8880, 0x4a038805, + 0x000000f0, 0x0201f800, 0x00101937, 0x42000800, + 0x000000f0, 0x59c40005, 0x80040d00, 0x0400000e, + 0x82000500, 0x000000e0, 0x0402000b, 0x4201d000, + 0x000003e8, 0x0201f800, 0x0010608e, 0x0201f800, + 0x00105f48, 0x59940004, 0x80000540, 0x040207ec, + 0x0401f023, 0x4c080000, 0x42001000, 0x00105065, + 0x0201f800, 0x00105f90, 0x42001000, 0x00105058, + 0x0201f800, 0x00106084, 0x5c001000, 0x497b8880, + 0x59a8001e, 0x80000540, 0x04020002, 0x80000000, + 0x48038893, 0x59a8002a, 0x82000500, 0x0000ffff, + 0x4c000000, 0x0201f800, 0x00101606, 0x5c000000, + 0x48038880, 0x59a80805, 0x84040d0c, 0x48075005, + 0x59c40006, 0x84000548, 0x48038806, 0x0201f800, + 0x0010195d, 0x4a038808, 0x00000080, 0x1c01f000, + 0x4803c856, 0x4d400000, 0x4d3c0000, 0x0201f800, + 0x00106ede, 0x0201f800, 0x0010ab33, 0x04020025, + 0x599c1017, 0x59a80805, 0x8c040d00, 0x0402000c, + 0x8c08151a, 0x0400001f, 0x84040d42, 0x48075005, + 0x42028000, 0x00000004, 0x42027800, 0x0000000c, + 0x8c081508, 0x04020008, 0x0401f012, 0x42028000, + 0x00000004, 0x42027800, 0x00000004, 0x8c081508, + 0x0400000c, 0x4d400000, 0x42028000, 0x0000000e, + 0x42028800, 0x0000ffff, 0x0201f800, 0x0010a446, + 0x5c028000, 0x599c0817, 0x8c040d0a, 0x04020005, + 0x4943c857, 0x493fc857, 0x0201f800, 0x00101fe5, + 0x497b8880, 0x4202d800, 0x00000001, 0x0401fcfb, + 0x5c027800, 0x5c028000, 0x1c01f000, 0x0201f800, + 0x00100ae0, 0x42000000, 0x0010b8ab, 0x0201f800, + 0x0010aa47, 0x0201f800, 0x00100ef4, 0x42000000, + 0x00000001, 0x0201f800, 0x00101606, 0x4a038880, + 0x00000001, 0x0201f000, 0x0010195d, 0x4202e000, + 0x00000000, 0x4a033015, 0x00000001, 0x497b301d, + 0x497b3006, 0x4a03b004, 0x60000001, 0x59d80005, + 0x4a03b004, 0x90000001, 0x4a03a804, 0x60000001, + 0x59d40005, 0x4a03a804, 0x90000001, 0x0201f000, + 0x00105983, 0x4a03c825, 0x00000004, 0x4a03c827, + 0x00000004, 0x599c0409, 0x80000d40, 0x04000020, + 0x599c0407, 0x80000540, 0x04000007, 0x800000cc, + 0x599c100b, 0x80080400, 0x4803b000, 0x497bb002, + 0x59d80001, 0x599c000b, 0x4803b000, 0x599c000c, + 0x4803b001, 0x599c0407, 0x80000540, 0x04020002, + 0x497bb002, 0x599c0c09, 0x82040540, 0x00400000, + 0x4803b003, 0x4a03b009, 0x00000004, 0x4a03b004, + 0x10000001, 0x59e00803, 0x82040d00, 0xfffffeff, + 0x82040d40, 0x00008000, 0x4807c003, 0x599c040a, + 0x80000540, 0x04000020, 0x599c0408, 0x80000540, + 0x04000007, 0x800000cc, 0x599c100f, 0x80080400, + 0x4803a800, 0x497ba802, 0x59d40001, 0x599c000f, + 0x4803a800, 0x599c0010, 0x4803a801, 0x599c0408, + 0x80000540, 0x04020002, 0x497ba802, 0x599c0c0a, + 0x82040540, 0x00400000, 0x4803a803, 0x4a03a809, + 0x00000004, 0x4a03a804, 0x10000001, 0x59e00803, + 0x82040d00, 0xfffffbff, 0x82040d40, 0x00008000, + 0x4807c003, 0x800409c0, 0x04000007, 0x4202e000, + 0x00000001, 0x0200b800, 0x00020551, 0x0200f000, + 0x00020566, 0x1c01f000, 0x0201f800, 0x001005d8, + 0x1c01f000, 0x4df00000, 0x4203e000, 0x50000000, + 0x59981005, 0x800811c0, 0x0400001e, 0x58080005, + 0x82000d00, 0x43018780, 0x02020000, 0x00105846, + 0x8c000508, 0x04000015, 0x580a5808, 0x592c0204, + 0x497a5800, 0x497a5801, 0x82000500, 0x000000ff, + 0x82000c80, 0x0000004b, 0x0402100b, 0x0c01f80f, + 0x5c03e000, 0x83700580, 0x00000003, 0x040007e6, + 0x0200f800, 0x00020566, 0x0200b000, 0x00020551, + 0x1c01f000, 0x0401f850, 0x5c03e000, 0x0401f7f9, + 0x0401f8de, 0x0401f7fd, 0x00105491, 0x00105491, + 0x00105491, 0x00105491, 0x001054a1, 0x00105491, + 0x00105491, 0x00105491, 0x00105491, 0x00105491, + 0x00105519, 0x00105491, 0x00105491, 0x001054a1, + 0x001054a1, 0x00105491, 0x00105491, 0x00105491, + 0x00105491, 0x00105491, 0x00105491, 0x00105491, + 0x00105491, 0x00105491, 0x00105491, 0x00105491, + 0x00105491, 0x00105491, 0x00105491, 0x00105491, + 0x00105491, 0x00105491, 0x00105491, 0x00105491, + 0x00105491, 0x00105491, 0x00105491, 0x00105491, + 0x00105491, 0x00105491, 0x00105491, 0x00105491, + 0x00105491, 0x00105491, 0x00105491, 0x00105491, + 0x00105491, 0x00105491, 0x00105491, 0x00105491, + 0x00105491, 0x00105491, 0x00105491, 0x00105491, + 0x00105491, 0x00105491, 0x00105491, 0x00105491, + 0x00105491, 0x00105491, 0x00105491, 0x00105491, + 0x00105491, 0x00105491, 0x00105491, 0x00105491, + 0x00105491, 0x00105491, 0x00105491, 0x00105491, + 0x00105491, 0x00105491, 0x00105491, 0x00105491, + 0x00105491, 0x492fc857, 0x42000000, 0x0010b85e, + 0x0201f800, 0x0010aa47, 0x42000000, 0x00000400, + 0x0401f019, 0x492fc857, 0x42000000, 0x0010b85d, + 0x0201f800, 0x0010aa47, 0x42000000, 0x00001000, + 0x0401f011, 0x492fc857, 0x42000000, 0x0010b85c, + 0x0201f800, 0x0010aa47, 0x42000000, 0x00002000, + 0x0401f009, 0x492fc857, 0x42000000, 0x0010b85f, + 0x0201f800, 0x0010aa47, 0x42000000, 0x00000800, + 0x0401f001, 0x4803c857, 0x4202e000, 0x00000001, + 0x592c0c04, 0x82040d00, 0xffff80ff, 0x80040540, + 0x48025c04, 0x0201f000, 0x000202da, 0x592c0204, + 0x492fc857, 0x80000110, 0x040007db, 0x80000040, + 0x04000025, 0x48033002, 0x492f3003, 0x492f3004, + 0x4a033008, 0x001054e5, 0x4202e000, 0x00000003, + 0x1c01f000, 0x592c0204, 0x492fc857, 0x80000110, + 0x040007cd, 0x80000040, 0x04000033, 0x48033002, + 0x492f3003, 0x492f3004, 0x4a033008, 0x00105501, + 0x4202e000, 0x00000003, 0x1c01f000, 0x0201f800, + 0x0010ab33, 0x02020000, 0x000204d9, 0x42028000, + 0x00000028, 0x41780800, 0x417a6000, 0x0201f800, + 0x00104e70, 0x0201f800, 0x001091c6, 0x0201f000, + 0x000202da, 0x592c0a0a, 0x8c040d02, 0x04020016, + 0x59a80021, 0x492fc857, 0x80000540, 0x0402000f, + 0x592c0207, 0x80000540, 0x04000005, 0x0201f800, + 0x00104326, 0x04020004, 0x1c01f000, 0x42000000, + 0x00000000, 0x592c0a06, 0x48065c06, 0x48025a06, + 0x0201f000, 0x000202da, 0x42000000, 0x00000028, + 0x0401f7f9, 0x42000800, 0x00000009, 0x0201f000, + 0x0010665b, 0x592c0208, 0x492fc857, 0x82000c80, + 0x0000199a, 0x040217a4, 0x592c0408, 0x80000540, + 0x040207a1, 0x59a80821, 0x800409c0, 0x04020009, + 0x592c0207, 0x80000540, 0x0400079b, 0x497a5a06, + 0x0201f800, 0x00104385, 0x04020004, 0x1c01f000, + 0x42000000, 0x00000028, 0x48025a06, 0x0201f000, + 0x000202da, 0x59980804, 0x59980002, 0x48065800, + 0x492c0801, 0x492f3004, 0x80000040, 0x48033002, + 0x04000002, 0x1c01f000, 0x599a5803, 0x59980008, + 0x4202e000, 0x00000001, 0x0801f000, 0x592e8a06, + 0x592c0406, 0x4803c856, 0x82000500, 0x000000ff, + 0x4200b800, 0x00000001, 0x82000d80, 0x00000001, + 0x04000015, 0x417a8800, 0x4200b800, 0x000007f0, + 0x82000d80, 0x00000002, 0x0400000f, 0x80000540, + 0x02020000, 0x000202da, 0x592e8a06, 0x0201f800, + 0x00020245, 0x02020000, 0x000202da, 0x592e9008, + 0x592e9809, 0x0201f800, 0x00104713, 0x0201f000, + 0x000202da, 0x59a80805, 0x84040d00, 0x48075005, + 0x0201f800, 0x00020245, 0x02000800, 0x0010482c, + 0x81468800, 0x805cb840, 0x040207fa, 0x0201f000, + 0x000202da, 0x592c0a08, 0x4807c857, 0x82040580, + 0x0000000e, 0x04000045, 0x82040580, 0x00000046, + 0x04000046, 0x82040580, 0x00000045, 0x04000020, + 0x82040580, 0x00000029, 0x04000010, 0x82040580, + 0x0000002a, 0x04000009, 0x82040580, 0x0000000f, + 0x040001fc, 0x82040580, 0x0000002e, 0x040001f9, + 0x4807c856, 0x0401f1f2, 0x59a80805, 0x84040d04, + 0x48075005, 0x0401f1f3, 0x592e8a06, 0x0201f800, + 0x00020245, 0x040201ef, 0x59340200, 0x84000518, + 0x48026a00, 0x592e6009, 0x4933c857, 0x83300580, + 0xffffffff, 0x0402002a, 0x0401f1e6, 0x592c1407, + 0x480bc857, 0x0201f800, 0x00109410, 0x411e6000, + 0x04020003, 0x4803c856, 0x0401f1d9, 0x592e3809, + 0x591c1414, 0x84081516, 0x84081554, 0x480a3c14, + 0x4a026403, 0x0000003a, 0x592c040b, 0x80000540, + 0x04000007, 0x4a026403, 0x0000003b, 0x592c020c, + 0x4802641a, 0x592c040c, 0x4802621a, 0x4a026203, + 0x00000001, 0x42000800, 0x80000040, 0x0201f800, + 0x00020721, 0x0401f1c7, 0x59a80068, 0x84000510, + 0x48035068, 0x0401f1c3, 0x592c1207, 0x8c081500, + 0x040201c0, 0x592e8a06, 0x592e6009, 0x0201f800, + 0x0010941a, 0x04020003, 0x4803c856, 0x0401f1b4, + 0x59300c06, 0x82040580, 0x00000004, 0x04000003, + 0x4803c856, 0x0401f1ae, 0x59300a03, 0x82040580, + 0x00000007, 0x04000003, 0x4803c856, 0x0401f1a8, + 0x59300c03, 0x82040580, 0x00000001, 0x04000021, + 0x82040580, 0x00000003, 0x04000016, 0x82040580, + 0x00000006, 0x04000020, 0x82040580, 0x00000008, + 0x04000015, 0x82040580, 0x0000000a, 0x0400000a, + 0x82040580, 0x0000000c, 0x04000004, 0x82040580, + 0x0000002e, 0x04020018, 0x42000800, 0x00000009, + 0x0401f013, 0x42000800, 0x00000005, 0x0401f010, + 0x417a7800, 0x0201f800, 0x0010203c, 0x4a026406, + 0x00000001, 0x42000800, 0x00000003, 0x0401f008, + 0x417a7800, 0x0201f800, 0x0010203c, 0x4a026406, + 0x00000001, 0x42000800, 0x0000000b, 0x0201f800, + 0x00104571, 0x4a026203, 0x00000001, 0x0201f800, + 0x0010672b, 0x0401f17b, 0x40000800, 0x58040000, + 0x80000540, 0x040207fd, 0x492c0800, 0x1c01f000, + 0x492fc857, 0x59300c06, 0x82040580, 0x00000006, + 0x04020094, 0x0201f800, 0x001049e7, 0x04020005, + 0x59340200, 0x8c00051a, 0x02000000, 0x00020533, + 0x59340200, 0x8c00050e, 0x0400008a, 0x59300203, + 0x42027800, 0x00000001, 0x82000580, 0x00000007, + 0x02020000, 0x00020533, 0x4a026203, 0x00000002, + 0x0201f000, 0x00020533, 0x42028000, 0x00000002, + 0x4a026206, 0x00000014, 0x4d2c0000, 0x0201f800, + 0x0010a1d1, 0x5c025800, 0x59300c06, 0x4807c857, + 0x82040580, 0x00000007, 0x04020063, 0x492fc857, + 0x4a025a06, 0x00000001, 0x0201f000, 0x000202da, + 0x592c240a, 0x492fc857, 0x4813c857, 0x8c10251c, + 0x04020016, 0x8c10251a, 0x04000003, 0x8c10250a, + 0x04000069, 0x59340a00, 0x8c040d0e, 0x04000003, + 0x8c10251e, 0x04000064, 0x0201f800, 0x0002075a, + 0x0400006b, 0x592c240a, 0x49366009, 0x49325809, + 0x4a026406, 0x00000006, 0x4a026203, 0x00000007, + 0x0201f000, 0x0002052f, 0x592c0a0c, 0x5934000f, + 0x41784000, 0x80001540, 0x0400006d, 0x58080204, + 0x82000500, 0x000000ff, 0x82000580, 0x00000012, + 0x04020004, 0x5808020c, 0x80040580, 0x04000004, + 0x58080000, 0x40084000, 0x0401f7f3, 0x58080000, + 0x49781000, 0x802041c0, 0x04000006, 0x48004000, + 0x80000540, 0x04020007, 0x48226810, 0x0401f005, + 0x4802680f, 0x80000540, 0x04020002, 0x497a6810, + 0x4d2c0000, 0x400a5800, 0x4a025a06, 0x00000002, + 0x0201f800, 0x000202da, 0x5c025800, 0x0401f7bc, + 0x592c040a, 0x8c00051c, 0x04000016, 0x592c0206, + 0x82000580, 0x0000ffff, 0x04020012, 0x592e6009, + 0x83300580, 0xffffffff, 0x040007b1, 0x83300480, + 0x0010d1c0, 0x04001010, 0x59a8000b, 0x81300480, + 0x0402100d, 0x59300008, 0x800001c0, 0x04020005, + 0x59300203, 0x82000580, 0x00000007, 0x04000797, + 0x492fc857, 0x4a025a06, 0x00000029, 0x0201f000, + 0x000202da, 0x492fc857, 0x4a025a06, 0x00000008, + 0x0201f000, 0x000202da, 0x492fc857, 0x4a025a06, + 0x00000045, 0x0201f000, 0x000202da, 0x492fc857, + 0x4a025a06, 0x0000002a, 0x0201f000, 0x000202da, + 0x492fc857, 0x4a025a06, 0x00000028, 0x0201f000, + 0x000202da, 0x492fc857, 0x4a025a06, 0x00000006, + 0x0201f000, 0x000202da, 0x492fc857, 0x4a025a06, + 0x0000000e, 0x0201f000, 0x000202da, 0x59340010, + 0x492e6810, 0x492fc857, 0x80000d40, 0x04000003, + 0x492c0800, 0x1c01f000, 0x5934040b, 0x492e680f, + 0x492fc857, 0x4803c857, 0x80000540, 0x04020003, + 0x4a026a03, 0x00000001, 0x1c01f000, 0x59a8000e, + 0x81640480, 0x0402176e, 0x42026000, 0x0010d1c0, + 0x59300009, 0x81340580, 0x04020004, 0x59300202, + 0x80040580, 0x04000759, 0x83326400, 0x00000024, + 0x41580000, 0x81300480, 0x040017f6, 0x0401f760, + 0x492fc857, 0x592c0407, 0x82000c80, 0x0000199a, + 0x040215f1, 0x592c0204, 0x80000112, 0x040205de, + 0x592e8a06, 0x0201f800, 0x00020245, 0x04020059, + 0x0201f800, 0x001049e7, 0x04020059, 0x592e780a, + 0x493fc857, 0x8d3e7d3e, 0x04020007, 0x59a80021, + 0x80000540, 0x0402004f, 0x0201f800, 0x00104838, + 0x040005dd, 0x833c1d00, 0x0000001f, 0x040005da, + 0x592c0207, 0x82000c80, 0x00001000, 0x040215d6, + 0x800000c2, 0x800008c4, 0x8005d400, 0x592e9008, + 0x592e9809, 0x5934080d, 0x800409c0, 0x0402002e, + 0x833c1d00, 0x0000001f, 0x81780040, 0x80000000, + 0x800c1902, 0x040217fe, 0x040205c7, 0x0c01f001, + 0x001056e9, 0x001056ec, 0x001056f9, 0x001056fc, + 0x001056ff, 0x0201f800, 0x0010903e, 0x0401f01a, + 0x0201f800, 0x0010480b, 0x04000027, 0x80e9d1c0, + 0x02020800, 0x00105fae, 0x42028000, 0x00000005, + 0x417a9000, 0x417a9800, 0x0201f800, 0x0010904e, + 0x0401f00d, 0x42027000, 0x0000004d, 0x0401f006, + 0x42027000, 0x0000004e, 0x0401f003, 0x42027000, + 0x00000052, 0x0201f800, 0x001046c9, 0x02020800, + 0x0010907e, 0x04000010, 0x8d3e7d3e, 0x04020017, + 0x1c01f000, 0x58040002, 0x80000540, 0x04020007, + 0x4d3c0000, 0x40067800, 0x0201f800, 0x001047eb, + 0x5c027800, 0x040207cb, 0x4a025a06, 0x00000030, + 0x0401f00d, 0x4a025a06, 0x0000002c, 0x0401f00a, + 0x4a025a06, 0x00000028, 0x0401f007, 0x4a025a06, + 0x00000029, 0x0401f004, 0x497a5c09, 0x4a025a06, + 0x00000000, 0x4a025a04, 0x00000103, 0x0201f000, + 0x000202da, 0x492fc857, 0x592c0204, 0x80000110, + 0x80000040, 0x04000002, 0x0401f56f, 0x592c0207, + 0x82000500, 0x000003ff, 0x48025a07, 0x8c000506, + 0x04000004, 0x82000500, 0x00000070, 0x04020004, + 0x59a80821, 0x800409c0, 0x04020018, 0x4a025a06, + 0x0000dead, 0x592c0408, 0x82000500, 0x0000f0ff, + 0x48025c08, 0x0201f800, 0x001043b4, 0x04020002, + 0x1c01f000, 0x49425a06, 0x8058b1c0, 0x04000009, + 0x0201f800, 0x0010955f, 0x0401f80f, 0x44042800, + 0x82580580, 0x00000002, 0x04020002, 0x48082801, + 0x0201f000, 0x000202da, 0x42028000, 0x00000031, + 0x42000800, 0x00000001, 0x4200b000, 0x00000001, + 0x0401f7ed, 0x592c0408, 0x80000118, 0x832c2c00, + 0x00000009, 0x80142c00, 0x1c01f000, 0x492fc857, + 0x4a025a08, 0x00000006, 0x0201f000, 0x000202da, + 0x492fc857, 0x4a025a08, 0x00000001, 0x0201f000, + 0x000202da, 0x492fc857, 0x592c040a, 0x82000500, + 0x00000003, 0x04000020, 0x0201f800, 0x0002075a, + 0x04000021, 0x592c0204, 0x492e6008, 0x82000500, + 0x000000ff, 0x82000580, 0x00000045, 0x0400000e, + 0x592c000b, 0x0201f800, 0x00105c9a, 0x02000800, + 0x00020245, 0x04020018, 0x42027000, 0x00000041, + 0x49366009, 0x4a026406, 0x00000001, 0x0201f000, + 0x000207a1, 0x59300015, 0x8400055e, 0x48026015, + 0x42026800, 0x0010b524, 0x42027000, 0x00000040, + 0x0401f7f4, 0x4a025a06, 0x00000101, 0x0201f000, + 0x000202da, 0x4a025a06, 0x0000002c, 0x0201f000, + 0x000202da, 0x4a025a06, 0x00000028, 0x0201f800, + 0x000202da, 0x0201f000, 0x0002077d, 0x492fc857, + 0x0201f800, 0x001062e1, 0x0400000b, 0x592c0204, + 0x80000110, 0x80000040, 0x040204fb, 0x592c0c06, + 0x800409c0, 0x04000009, 0x42000000, 0x00000102, + 0x0401f003, 0x42000000, 0x00000104, 0x48025a06, + 0x0201f000, 0x000202da, 0x592c0c07, 0x800409c0, + 0x04000024, 0x82040480, 0x00000005, 0x04021021, + 0x4c040000, 0x80040800, 0x0201f800, 0x00106306, + 0x5c001000, 0x04020018, 0x832c0400, 0x00000008, + 0x4000a000, 0x0201f800, 0x0010632f, 0x04020012, + 0x592c1207, 0x82cc0580, 0x0010b50e, 0x04020009, + 0x58c80c0b, 0x84040d00, 0x84040d02, 0x8c081500, + 0x04000002, 0x84040d5e, 0x4805940b, 0x0401f001, + 0x42000000, 0x00000000, 0x48025a06, 0x0201f000, + 0x000202da, 0x42000000, 0x00000103, 0x0401f7fb, + 0x42000000, 0x00000102, 0x0401f7f8, 0x492fc857, + 0x592e7c06, 0x833c0500, 0xfffffffe, 0x04020043, + 0x592c4007, 0x42026000, 0x0010d1c0, 0x41581800, + 0x400c0000, 0x81300480, 0x04021023, 0x59300203, + 0x82000580, 0x00000000, 0x04000007, 0x59300008, + 0x80000d40, 0x04000004, 0x58040005, 0x80200580, + 0x04000004, 0x83326400, 0x00000024, 0x0401f7f1, + 0x58040204, 0x82000500, 0x000000ff, 0x82000d80, + 0x00000053, 0x04000007, 0x82000d80, 0x00000048, + 0x04000004, 0x82000580, 0x00000018, 0x04020023, + 0x4d2c0000, 0x0201f800, 0x00108be3, 0x5c025800, + 0x0400001e, 0x4a025a06, 0x00000000, 0x0201f000, + 0x000202da, 0x592e8a06, 0x83440480, 0x000007f0, + 0x04021016, 0x83440400, 0x0010ac00, 0x50000000, + 0x80026d40, 0x04000011, 0x4d2c0000, 0x0201f800, + 0x001047cb, 0x0400000c, 0x42028000, 0x00000005, + 0x592c0a08, 0x0201f800, 0x00104e70, 0x0201f800, + 0x001091cc, 0x0201f800, 0x000202da, 0x5c025800, + 0x0401f7e5, 0x5c025800, 0x4a025a06, 0x00000031, + 0x0201f000, 0x000202da, 0x492fc857, 0x4d2c0000, + 0x0201f800, 0x001007e4, 0x04000016, 0x492fc857, + 0x412f4000, 0x0201f800, 0x001007e4, 0x0400000e, + 0x492fc857, 0x412dd800, 0x0201f800, 0x00103b28, + 0x0201f800, 0x00103b32, 0x49a1d80b, 0x5c025800, + 0x492dd80a, 0x0201f800, 0x00102214, 0x0201f000, + 0x00102233, 0x41a25800, 0x0201f800, 0x001007f4, + 0x5c025800, 0x4a025a06, 0x00004005, 0x4a025c06, + 0x00000002, 0x0201f000, 0x000202da, 0x4807c857, + 0x485fc857, 0x4200b800, 0x00000001, 0x5c000800, + 0x4c5c0000, 0x0401f005, 0x4807c857, 0x485fc857, + 0x5c000800, 0x4d780000, 0x4803c857, 0x492fc857, + 0x8c00050e, 0x02020800, 0x001005d0, 0x4203e000, + 0x50000000, 0x4200b800, 0x00008003, 0x0201f000, + 0x001005dd, 0x592c0204, 0x80000110, 0x80000040, + 0x04020441, 0x0201f800, 0x00104a34, 0x04020002, + 0x1c01f000, 0x49425a06, 0x4806580d, 0x480a580e, + 0x4943c857, 0x4807c857, 0x480bc857, 0x0201f000, + 0x000202da, 0x592c0204, 0x80000110, 0x80000040, + 0x04020431, 0x0201f800, 0x00104b8b, 0x04020002, + 0x1c01f000, 0x49425a06, 0x48065811, 0x480a5812, + 0x0201f000, 0x000202da, 0x592c0204, 0x80000110, + 0x04000425, 0x80000040, 0x0402000c, 0x4202e000, + 0x00000001, 0x592c020a, 0x8c000504, 0x02000000, + 0x000204d0, 0x592c0207, 0x82000c80, 0x00001001, + 0x04021429, 0x0401f009, 0x4202e000, 0x00000003, + 0x48033002, 0x492f3003, 0x492f3004, 0x4a033008, + 0x000204d0, 0x1c01f000, 0x4202e000, 0x00000002, + 0x42000000, 0x0010beda, 0x50007000, 0x492c700b, + 0x4978700e, 0x4978700c, 0x592c0011, 0x592c0812, + 0x48007007, 0x48047008, 0x592c1013, 0x82080500, + 0xffff0000, 0x04000003, 0x0201f800, 0x001005d8, + 0x4978700d, 0x82080480, 0x00000180, 0x4803c857, + 0x04001007, 0x4800700f, 0x4a007005, 0x00000180, + 0x4a007004, 0x00000060, 0x0401f005, 0x4978700f, + 0x48087005, 0x80081104, 0x48087004, 0x5838000a, + 0x48007003, 0x40381000, 0x0201f000, 0x00100858, + 0x0201f800, 0x001007d3, 0x04000003, 0x59980007, + 0x0801f000, 0x1c01f000, 0x40307000, 0x5838000b, + 0x80025d40, 0x0400001b, 0x58380002, 0x82000580, + 0x00000100, 0x0400001d, 0x4c380000, 0x592c0204, + 0x82000500, 0x000000ff, 0x82000580, 0x00000012, + 0x0400000b, 0x592c0208, 0x8400054e, 0x48025a08, + 0x4a025a06, 0x00000002, 0x4a025a04, 0x00000103, + 0x0201f800, 0x000202c1, 0x0401f005, 0x4a025a06, + 0x00000010, 0x0201f800, 0x000202da, 0x5c007000, + 0x4202e000, 0x00000001, 0x4a007002, 0x00000100, + 0x49787010, 0x1c01f000, 0x58380004, 0x82000480, + 0x00000003, 0x04000087, 0x58380010, 0x8c000500, + 0x04020019, 0x4200b000, 0x00000003, 0x832cac00, + 0x00000011, 0x5838000a, 0x5838100d, 0x8008a400, + 0x4c380000, 0x0201f800, 0x0010ab17, 0x5c007000, + 0x5838000d, 0x82000400, 0x00000003, 0x4800700d, + 0x4a007010, 0x00000001, 0x58380004, 0x82000480, + 0x00000003, 0x48007004, 0x82000580, 0x00000003, + 0x0400006c, 0x5838000e, 0x80001d40, 0x04020020, + 0x4c380000, 0x0201f800, 0x001007d3, 0x5c007000, + 0x04000010, 0x4a025a04, 0x0000010a, 0x42001800, + 0x00000005, 0x480c700e, 0x5838000c, 0x80000540, + 0x04020002, 0x5838000b, 0x40000800, 0x492c0801, + 0x492c700c, 0x42000800, 0x0000000f, 0x0401f011, + 0x4202e000, 0x00000008, 0x4a033007, 0x00105915, + 0x1c01f000, 0x4202e000, 0x00000002, 0x42000000, + 0x0010beda, 0x50007000, 0x0401f7e7, 0x583a580c, + 0x400c0000, 0x42000800, 0x00000014, 0x80040c80, + 0x58381004, 0x5838000f, 0x41783000, 0x80000540, + 0x04020005, 0x84183540, 0x82081480, 0x00000003, + 0x0400003c, 0x40080000, 0x80040480, 0x04001002, + 0x40080800, 0x4004b000, 0x412c0000, 0x800c0400, + 0x4000a800, 0x5838000a, 0x5838100d, 0x8008a400, + 0x4c080000, 0x4c040000, 0x4c0c0000, 0x4c380000, + 0x0201f800, 0x0010ab17, 0x5c007000, 0x5c001800, + 0x5c000800, 0x40040000, 0x58381004, 0x80080480, + 0x48007004, 0x82000580, 0x00000003, 0x04000002, + 0x84183500, 0x5c000000, 0x80041400, 0x82080480, + 0x00000060, 0x04020003, 0x84183542, 0x41781000, + 0x400c0000, 0x80041c00, 0x820c0480, 0x00000014, + 0x04020003, 0x84183544, 0x40001800, 0x40080800, + 0x4804700d, 0x480c700e, 0x40180000, 0x0c01f001, + 0x00105960, 0x00105964, 0x00105962, 0x00105960, + 0x001058fc, 0x00105964, 0x00105962, 0x00105960, + 0x0201f800, 0x001005d8, 0x5838100f, 0x0401f739, + 0x5838080d, 0x82040400, 0x00000002, 0x5838100a, + 0x80080400, 0x50001000, 0x800811c0, 0x0402000f, + 0x4202e000, 0x00000001, 0x583a580b, 0x4978700b, + 0x49787010, 0x592c0204, 0x82000500, 0x000000ff, + 0x82000580, 0x00000012, 0x02000000, 0x00020507, + 0x0201f000, 0x000204d0, 0x5838000a, 0x80040c00, + 0x82381c00, 0x00000007, 0x54041800, 0x80040800, + 0x800c1800, 0x54041800, 0x0401f71a, 0x0201f800, + 0x001007d3, 0x02000800, 0x001005d8, 0x4a02580a, + 0x0010be79, 0x42000800, 0x0010beda, 0x452c0800, + 0x497a580b, 0x497a580c, 0x497a580d, 0x497a580e, + 0x497a580f, 0x4a025809, 0x001058b6, 0x497a5810, + 0x4a025802, 0x00000100, 0x4a025801, 0x00000001, + 0x1c01f000, 0x59c80007, 0x8c000502, 0x04000070, + 0x835c2c80, 0x00000005, 0x02001000, 0x00105f23, + 0x59c82817, 0x497b9005, 0x82140500, 0x00e00000, + 0x0402004f, 0x82140500, 0x000003ff, 0x82001c00, + 0x00000006, 0x41cc2000, 0x42003000, 0x00006080, + 0x820c0480, 0x00000040, 0x04001006, 0x42001000, + 0x00000040, 0x820c1c80, 0x00000040, 0x0401f003, + 0x400c1000, 0x41781800, 0x54182000, 0x80102000, + 0x80183000, 0x80081040, 0x040207fc, 0x800c19c0, + 0x04000005, 0x59c80005, 0x80000000, 0x48039005, + 0x0401f7ea, 0x82140500, 0x01f60000, 0x04020029, + 0x82140500, 0x0000f000, 0x0400000b, 0x82000c80, + 0x00002000, 0x0402100f, 0x82140500, 0x0e000000, + 0x80000132, 0x0c01f840, 0x4a039005, 0x00000140, + 0x1c01f000, 0x59cc0400, 0x82000500, 0x0000ff00, + 0x82000580, 0x00008100, 0x040007f4, 0x0401f01c, + 0x4817c857, 0x82140500, 0x000003ff, 0x04020007, + 0x59cc0400, 0x82000500, 0x0000ff00, 0x82000580, + 0x00008100, 0x04020012, 0x42000000, 0x0010b8bd, + 0x0201f800, 0x0010aa47, 0x0201f800, 0x00105dfa, + 0x4803c856, 0x4a039005, 0x00000140, 0x0401f020, + 0x4817c857, 0x82140500, 0x00f60000, 0x04020004, + 0x0201f800, 0x00105e35, 0x040207d2, 0x0201f800, + 0x0010513b, 0x04000010, 0x59c400a4, 0x4803c857, + 0x82000500, 0x0000000f, 0x82000580, 0x0000000a, + 0x04020009, 0x497b5016, 0x59c400a3, 0x82000540, + 0x00080000, 0x480388a3, 0x82000500, 0xfff7ffff, + 0x480388a3, 0x4817c856, 0x0201f800, 0x0010a978, + 0x4a039005, 0x00000140, 0x0401f842, 0x4803c856, + 0x1c01f000, 0x00105a1d, 0x00105cf4, 0x00105a15, + 0x00105a15, 0x00105a15, 0x00105a15, 0x00105a15, + 0x00105a15, 0x4803c857, 0x42000000, 0x0010b85a, + 0x0201f800, 0x0010aa47, 0x4a039005, 0x00000140, + 0x1c01f000, 0x4817c857, 0x59cc0400, 0x4803c857, + 0x82000d00, 0x0000ff00, 0x82041500, 0x0000f000, + 0x840409c0, 0x82140500, 0x000003ff, 0x800018c4, + 0x8c142d14, 0x04000005, 0x59cc0002, 0x82000500, + 0x00000003, 0x800c1c80, 0x480f5016, 0x82080580, + 0x00002000, 0x04020011, 0x836c0580, 0x00000001, + 0x0402000c, 0x59cc0006, 0x82000500, 0xff000000, + 0x82000580, 0x11000000, 0x04020011, 0x0201f800, + 0x00103b38, 0x0201f800, 0x00105f48, 0x0401f00c, + 0x0401f81f, 0x0401f00a, 0x82080580, 0x00003000, + 0x04020003, 0x0401fa06, 0x0401f005, 0x82080580, + 0x00008000, 0x04020002, 0x0401fafc, 0x1c01f000, + 0x4817c857, 0x42000000, 0x0010b859, 0x0201f800, + 0x0010aa47, 0x836c0580, 0x00000003, 0x0402000b, + 0x4c080000, 0x4c0c0000, 0x42001000, 0x00008048, + 0x40141800, 0x80142120, 0x0201f800, 0x00103a3e, + 0x5c001800, 0x5c001000, 0x1c01f000, 0x4807c857, + 0x59cc0002, 0x82000500, 0xff000000, 0x82001580, + 0x01000000, 0x04000004, 0x82001580, 0x23000000, + 0x04020192, 0x82040580, 0x00000023, 0x0402003f, + 0x0401fb6a, 0x0400018d, 0x59300c06, 0x82040580, + 0x00000010, 0x04000013, 0x82040580, 0x00000011, + 0x04000010, 0x82040580, 0x00000001, 0x0400000d, + 0x82040580, 0x00000004, 0x0400000a, 0x82040580, + 0x00000008, 0x04000007, 0x82040580, 0x0000000a, + 0x04000004, 0x4933c857, 0x4807c857, 0x0401f177, + 0x59300004, 0x82000500, 0x80010000, 0x04000004, + 0x0201f800, 0x00106f60, 0x04020170, 0x59cc0a04, + 0x48066202, 0x59cc0006, 0x82000500, 0xffff0000, + 0x82000d80, 0x02000000, 0x04020005, 0x42027000, + 0x00000015, 0x0201f000, 0x000207a1, 0x82000d80, + 0x02140000, 0x040007fa, 0x82000d80, 0x02100000, + 0x040007f7, 0x82000d80, 0x02100000, 0x040007f4, + 0x82000d80, 0x01000000, 0x04020158, 0x59cc0006, + 0x82000500, 0x0000ffff, 0x04020154, 0x42027000, + 0x00000016, 0x0401f7ec, 0x82040580, 0x00000022, + 0x0402014e, 0x59a80806, 0x8c040d14, 0x04000011, + 0x0401f967, 0x0402000f, 0x0401f97d, 0x0400000d, + 0x42027000, 0x0000004c, 0x59cc0001, 0x82000500, + 0x00ffffff, 0x0201f800, 0x00105eec, 0x0400012a, + 0x42028800, 0x0000ffff, 0x417a6800, 0x0401f126, + 0x59cc0006, 0x82000500, 0xffff0000, 0x82000d80, + 0x03000000, 0x04020021, 0x59a80026, 0x8c000508, + 0x04000017, 0x8400054c, 0x48035026, 0x59cc0800, + 0x82040d00, 0x00ffffff, 0x48075010, 0x497b8830, + 0x84040d70, 0x48078832, 0x59c40802, 0x84040d4c, + 0x48078802, 0x59cc0007, 0x82000500, 0x0000ffff, + 0x48038893, 0x4803501e, 0x42000800, 0x00000003, + 0x59a81010, 0x0201f800, 0x00106c78, 0x59cc0006, + 0x82000500, 0x0000ffff, 0x04020118, 0x42027000, + 0x00000017, 0x0401f0d9, 0x82000d80, 0x04000000, + 0x04020011, 0x59cc0006, 0x82000500, 0x0000ffff, + 0x0402010e, 0x0201f800, 0x0010513b, 0x04000004, + 0x42027000, 0x0000001d, 0x0401f0cc, 0x59a80026, + 0x84000548, 0x48035026, 0x42027000, 0x00000030, + 0x0401f0c6, 0x82000d80, 0x05000000, 0x04020008, + 0x59cc0006, 0x82000500, 0x0000ffff, 0x040200fb, + 0x42027000, 0x00000018, 0x0401f0bc, 0x82000d80, + 0x20100000, 0x04020004, 0x42027000, 0x00000019, + 0x0401f0b6, 0x82000d80, 0x21100000, 0x04020004, + 0x42027000, 0x0000001a, 0x0401f0b0, 0x82000d80, + 0x52000000, 0x04020008, 0x59cc0006, 0x82000500, + 0x0000ffff, 0x040200e5, 0x42027000, 0x0000001b, + 0x0401f0a6, 0x82000d80, 0x50000000, 0x04020008, + 0x59cc0006, 0x82000500, 0x0000ffff, 0x040200db, + 0x42027000, 0x0000001c, 0x0401f09c, 0x82000d80, + 0x13000000, 0x04020004, 0x42027000, 0x00000034, + 0x0401f096, 0x82000d80, 0x12000000, 0x04020008, + 0x59cc0006, 0x82000500, 0x0000ffff, 0x040200cb, + 0x42027000, 0x00000024, 0x0401f08c, 0x82000d00, + 0xff000000, 0x82040d80, 0x24000000, 0x04020004, + 0x42027000, 0x0000002d, 0x0401f084, 0x82000d00, + 0xff000000, 0x82040d80, 0x53000000, 0x04020004, + 0x42027000, 0x0000002a, 0x0401f07c, 0x82000d80, + 0x0f000000, 0x04020004, 0x42027000, 0x00000020, + 0x0401f076, 0x82000d80, 0x61040000, 0x04020036, + 0x83cc1400, 0x00000006, 0x80080800, 0x50080000, + 0x82000500, 0x0000ffff, 0x82000480, 0x00000004, + 0x4c580000, 0x8000b104, 0x8058b1c0, 0x04000026, + 0x4c100000, 0x50041800, 0x820c1500, 0x03000000, + 0x80081130, 0x42000000, 0x0010b817, 0x82082580, + 0x00000000, 0x04020004, 0x42000000, 0x0010b814, + 0x0401f00c, 0x82082580, 0x00000001, 0x04020004, + 0x42000000, 0x0010b815, 0x0401f006, 0x82082580, + 0x00000002, 0x04020003, 0x42000000, 0x0010b816, + 0x0201f800, 0x0010aa47, 0x42001000, 0x00008015, + 0x820c2500, 0x0000ffff, 0x800c1920, 0x0201f800, + 0x00103a3e, 0x5c002000, 0x80040800, 0x8058b040, + 0x040207da, 0x5c00b000, 0x42027000, 0x00000023, + 0x0401f03e, 0x82000d80, 0x60000000, 0x04020004, + 0x42027000, 0x0000003f, 0x0401f038, 0x82000d80, + 0x54000000, 0x04020006, 0x0401fb12, 0x0402006f, + 0x42027000, 0x00000046, 0x0401f030, 0x82000d80, + 0x55000000, 0x04020009, 0x0401fb32, 0x04020004, + 0x42027000, 0x00000041, 0x0401f028, 0x42027000, + 0x00000042, 0x0401f025, 0x82000d80, 0x78000000, + 0x04020004, 0x42027000, 0x00000045, 0x0401f01f, + 0x82000d80, 0x10000000, 0x04020004, 0x42027000, + 0x0000004e, 0x0401f019, 0x82000d80, 0x63000000, + 0x04020004, 0x42027000, 0x0000004a, 0x0401f013, + 0x82000d00, 0xff000000, 0x82040d80, 0x56000000, + 0x04020004, 0x42027000, 0x0000004f, 0x0401f00b, + 0x82000d00, 0xff000000, 0x82040d80, 0x57000000, + 0x04020004, 0x42027000, 0x00000050, 0x0401f003, + 0x42027000, 0x0000001d, 0x59cc3800, 0x821c3d00, + 0x00ffffff, 0x821c0580, 0x00fffffe, 0x59cc0001, + 0x04020005, 0x40003000, 0x42028800, 0x000007fe, + 0x0401f003, 0x0401f8d1, 0x04020030, 0x0201f800, + 0x001045a6, 0x0402002d, 0x83380580, 0x00000046, + 0x04020004, 0x59a80010, 0x80180580, 0x04000027, + 0x59340200, 0x8c000514, 0x0400000f, 0x83380580, + 0x00000030, 0x0400000c, 0x83380580, 0x0000003f, + 0x04000009, 0x83380580, 0x00000034, 0x04000006, + 0x83380580, 0x00000024, 0x04000003, 0x42027000, + 0x0000004c, 0x0201f800, 0x0002075a, 0x04000018, + 0x49366009, 0x4a026406, 0x00000004, 0x59cc0c04, + 0x48066202, 0x83380580, 0x0000004c, 0x04020009, + 0x4a026406, 0x00000011, 0x813669c0, 0x04020005, + 0x59cc0001, 0x82000500, 0x00ffffff, 0x4802601e, + 0x0201f000, 0x000207a1, 0x59880052, 0x4803c857, + 0x80000000, 0x48031052, 0x1c01f000, 0x42001000, + 0x00008049, 0x59cc1806, 0x800c1930, 0x0201f800, + 0x00103a3e, 0x0201f800, 0x00107942, 0x040007f3, + 0x49366009, 0x4a026406, 0x00000004, 0x59cc0c04, + 0x48066202, 0x4a026403, 0x00000009, 0x4a02641a, + 0x00000009, 0x4a02621a, 0x00002900, 0x4a026203, + 0x00000001, 0x0201f000, 0x0010672b, 0x59a80026, + 0x4803c857, 0x8c000508, 0x04000010, 0x59cc0006, + 0x82000500, 0xff000000, 0x82000d80, 0x03000000, + 0x0400000c, 0x82000d80, 0x20000000, 0x04000009, + 0x82000d80, 0x05000000, 0x04000006, 0x82000d80, + 0x21000000, 0x04000003, 0x80000580, 0x1c01f000, + 0x82000540, 0x00000001, 0x0401f7fd, 0x59cc2006, + 0x82102500, 0xff000000, 0x9c1021c0, 0x0401f807, + 0x820c1c00, 0x0010b4e3, 0x500c1800, 0x800c0500, + 0x4803c857, 0x1c01f000, 0x40100800, 0x41781800, + 0x82040480, 0x00000020, 0x04001004, 0x800c1800, + 0x40000800, 0x0401f7fb, 0x82040500, 0x0000000f, + 0x82000400, 0x0010ab38, 0x50000000, 0x8c040d08, + 0x04000002, 0x900001c0, 0x1c01f000, 0x4803c856, + 0x0401fac3, 0x0402000a, 0x0201f800, 0x0010210a, + 0x04020007, 0x59cc0002, 0x82000500, 0xff000000, + 0x82000d80, 0x08000000, 0x04000802, 0x1c01f000, + 0x4803c856, 0x59cc0400, 0x82000d00, 0x0000ff00, + 0x840409c0, 0x82040580, 0x00000033, 0x0402001f, + 0x0401f976, 0x04000038, 0x59cc0a04, 0x48066202, + 0x59cc0006, 0x4803c857, 0x82000500, 0xffff0000, + 0x82000d80, 0x02000000, 0x04020009, 0x59cc0006, + 0x82000500, 0x0000ffff, 0x0402002b, 0x42027000, + 0x00000015, 0x0201f000, 0x000207a1, 0x82000d80, + 0x01000000, 0x04020024, 0x59cc0006, 0x82000500, + 0x0000ffff, 0x04020020, 0x42027000, 0x00000016, + 0x0201f000, 0x000207a1, 0x82040580, 0x00000032, + 0x04020019, 0x59cc0006, 0x82000500, 0xffff0000, + 0x82000d80, 0x14000000, 0x04020013, 0x42027000, + 0x00000038, 0x59cc0001, 0x0401f810, 0x0402000e, + 0x0201f800, 0x001045a6, 0x0402000b, 0x0201f800, + 0x0002075a, 0x04000008, 0x49366009, 0x4a026406, + 0x00000004, 0x59cc0c04, 0x48066202, 0x0201f000, + 0x000207a1, 0x1c01f000, 0x4803c857, 0x4c580000, + 0x4c100000, 0x4c380000, 0x4c340000, 0x82003500, + 0x00ffffff, 0x82181500, 0x00ff0000, 0x82081580, + 0x00ff0000, 0x04020016, 0x82181480, 0x00fffffc, + 0x04001013, 0x82181580, 0x00fffffd, 0x04020004, + 0x42028800, 0x000007fd, 0x0401f040, 0x82181580, + 0x00fffffe, 0x04020004, 0x42028800, 0x000007fe, + 0x0401f03a, 0x82181580, 0x00fffffc, 0x04020004, + 0x42028800, 0x000007fc, 0x0401f034, 0x41781000, + 0x42002000, 0x00000000, 0x4200b000, 0x000007f0, + 0x41ac7000, 0x50380000, 0x80006d40, 0x04020005, + 0x800811c0, 0x0402001e, 0x8410155e, 0x0401f01c, + 0x58340212, 0x82000500, 0x0000ff00, 0x04000011, + 0x59a84010, 0x82204500, 0x00ffff00, 0x82180500, + 0x00ffff00, 0x04000002, 0x80200580, 0x58340002, + 0x0402000f, 0x82000500, 0x000000ff, 0x82184500, + 0x000000ff, 0x80204580, 0x04020009, 0x0401f006, + 0x58340002, 0x82000500, 0x00ffffff, 0x80184580, + 0x04020003, 0x40128800, 0x0401f00c, 0x80102000, + 0x80387000, 0x8058b040, 0x040207db, 0x800811c0, + 0x04020005, 0x481bc857, 0x82000540, 0x00000001, + 0x0401f003, 0x840a8d1e, 0x80000580, 0x5c006800, + 0x5c007000, 0x5c002000, 0x5c00b000, 0x1c01f000, + 0x59a80026, 0x8c00050e, 0x04000003, 0x8c000502, + 0x04000006, 0x59cc0c00, 0x80040910, 0x82040500, + 0x0000000f, 0x0c01f002, 0x1c01f000, 0x00105d0f, + 0x00105d0f, 0x00105d0f, 0x00105de5, 0x00105d0f, + 0x00105d11, 0x00105d29, 0x00105d2c, 0x00105d0f, + 0x00105d0f, 0x00105d0f, 0x00105d0f, 0x00105d0f, + 0x00105d0f, 0x00105d0f, 0x00105d0f, 0x4803c856, + 0x1c01f000, 0x0401f8c5, 0x04000014, 0x82140500, + 0x000003ff, 0x800000c4, 0x82000480, 0x00000008, + 0x0400100e, 0x59cc0001, 0x59326809, 0x59340802, + 0x80040580, 0x82000500, 0x00ffffff, 0x04020007, + 0x59cc0a04, 0x48066202, 0x42027000, 0x00000046, + 0x0201f000, 0x000207a1, 0x59cc0004, 0x4803c857, + 0x1c01f000, 0x59cc0004, 0x4803c857, 0x1c01f000, + 0x0401f8aa, 0x04000016, 0x82140500, 0x000003ff, + 0x800000c4, 0x82000480, 0x0000000c, 0x04001010, + 0x59cc0001, 0x82000500, 0x00ffffff, 0x59326809, + 0x59340802, 0x82040d00, 0x00ffffff, 0x80040580, + 0x04020007, 0x59cc0a04, 0x48066202, 0x42027000, + 0x00000045, 0x0201f000, 0x000207a1, 0x59cc0004, + 0x4803c857, 0x1c01f000, 0x4817c857, 0x0401f9c8, + 0x04020011, 0x0201f800, 0x0010210a, 0x0402000e, + 0x59cc0002, 0x82000500, 0xff000000, 0x82000580, + 0x00000000, 0x04020008, 0x82040500, 0x0000000f, + 0x82000c80, 0x00000006, 0x04021003, 0x4803c857, + 0x0c01f002, 0x1c01f000, 0x00105d60, 0x00105d64, + 0x00105d60, 0x00105d60, 0x00105db2, 0x00105dc3, + 0x4803c857, 0x59cc0004, 0x4803c857, 0x1c01f000, + 0x59cc0004, 0x4803c857, 0x59a80016, 0x800001c0, + 0x040207f8, 0x59cc0802, 0x8c040d2e, 0x0402001d, + 0x0201f800, 0x00107942, 0x02000800, 0x001005d8, + 0x59cc0001, 0x4803c857, 0x0401ff28, 0x0402000d, + 0x0201f800, 0x00020245, 0x0402000a, 0x4a026406, + 0x00000005, 0x49366009, 0x59cc0c04, 0x48066202, + 0x42027000, 0x00000088, 0x0201f000, 0x000207a1, + 0x42028800, 0x0000ffff, 0x417a6800, 0x59cc0001, + 0x82000500, 0x00ffffff, 0x4802601e, 0x0401f7f0, + 0x59cc0001, 0x4803c857, 0x0401ff10, 0x040207d5, + 0x0201f800, 0x001045a6, 0x040207d2, 0x59cc0005, + 0x8c000500, 0x04020004, 0x59340200, 0x8c00050e, + 0x040207cc, 0x0201f800, 0x001049f3, 0x0402000f, + 0x0401f83e, 0x040007c7, 0x0201f800, 0x0002075a, + 0x040007c4, 0x49366009, 0x4a026406, 0x00000002, + 0x59cc0c04, 0x48066202, 0x42027000, 0x00000088, + 0x0201f000, 0x000207a1, 0x0201f800, 0x0002075a, + 0x040007b8, 0x49366009, 0x4a026406, 0x00000004, + 0x59cc0c04, 0x48066202, 0x42027000, 0x00000001, + 0x0201f000, 0x000207a1, 0x59cc0004, 0x4803c857, + 0x59cc0802, 0x8c040d2e, 0x0400000b, 0x0401f81f, + 0x04000009, 0x0401f960, 0x04020007, 0x59cc0a04, + 0x48066202, 0x42027000, 0x00000089, 0x0201f000, + 0x000207a1, 0x4933c857, 0x1c01f000, 0x59cc0004, + 0x4803c857, 0x59cc0802, 0x8c040d2e, 0x0400000b, + 0x0401f80e, 0x04000009, 0x0401f94f, 0x04020007, + 0x59cc0a04, 0x48066202, 0x42027000, 0x0000008a, + 0x0201f000, 0x000207a1, 0x4933c857, 0x1c01f000, + 0x59cc0a04, 0x0401f002, 0x59cc0c04, 0x59a8000e, + 0x59a81067, 0x80080400, 0x80040480, 0x04021008, + 0x40040000, 0x800000c4, 0x800408ca, 0x80040c00, + 0x82066400, 0x0010d1c0, 0x1c01f000, 0x80000580, + 0x0401f7fe, 0x59cc0802, 0x8c040d2e, 0x04020010, + 0x0401ffec, 0x0400000e, 0x59cc0001, 0x82000500, + 0x00ffffff, 0x59326809, 0x59340802, 0x82040d00, + 0x00ffffff, 0x80040580, 0x04020005, 0x42027000, + 0x00000051, 0x0201f000, 0x000207a1, 0x59cc0004, + 0x4803c857, 0x1c01f000, 0x4803c856, 0x42003000, + 0x00000105, 0x0401f001, 0x4803c856, 0x4c3c0000, + 0x41cc7800, 0x0401f803, 0x5c007800, 0x1c01f000, + 0x4803c856, 0x4c580000, 0x583c0400, 0x82000500, + 0x0000f000, 0x82000580, 0x0000c000, 0x04000024, + 0x0201f800, 0x0002075a, 0x04000021, 0x4c180000, + 0x583c0001, 0x0401fe89, 0x0402001f, 0x0201f800, + 0x001045a6, 0x0402001c, 0x49366009, 0x0201f800, + 0x001007e4, 0x04000018, 0x492e6017, 0x497a5800, + 0x497a5a04, 0x48125c04, 0x832cac00, 0x00000005, + 0x4200b000, 0x00000007, 0x403ca000, 0x0201f800, + 0x0010ab17, 0x5c003000, 0x481a641a, 0x4a026403, + 0x0000003e, 0x4a026406, 0x00000001, 0x4a026203, + 0x00000001, 0x0201f800, 0x0010672b, 0x5c00b000, + 0x1c01f000, 0x0201f800, 0x0002077d, 0x5c003000, + 0x0401f7fb, 0x4803c856, 0x59cc0400, 0x82000d00, + 0x0000ff00, 0x82040500, 0x0000f000, 0x840409c0, + 0x82000580, 0x00002000, 0x04020049, 0x82040580, + 0x00000022, 0x0402003a, 0x59c400a4, 0x82000500, + 0x0000000f, 0x82000c80, 0x00000007, 0x04001004, + 0x82000480, 0x0000000c, 0x0400103f, 0x59cc0006, + 0x82000500, 0xffff0000, 0x82000d80, 0x04000000, + 0x04000039, 0x82000d80, 0x60000000, 0x04000036, + 0x82000d80, 0x54000000, 0x04000033, 0x82000d80, + 0x03000000, 0x04020015, 0x59a80826, 0x8c040d02, + 0x0402002d, 0x8c040d08, 0x0402002b, 0x0201f800, + 0x001048ec, 0x0400002b, 0x59a8001d, 0x800000d0, + 0x59a80810, 0x82040d00, 0x000000ff, 0x80040540, + 0x59cc0800, 0x82040d00, 0x00ffffff, 0x80040580, + 0x0402001b, 0x0401f01c, 0x59c40802, 0x8c040d0c, + 0x04020017, 0x82000d80, 0x52000000, 0x040007ec, + 0x82000d80, 0x05000000, 0x040007e9, 0x82000d80, + 0x50000000, 0x040007e6, 0x0401f00d, 0x82040580, + 0x00000023, 0x0402000a, 0x0401ff58, 0x04000008, + 0x59300c03, 0x82040580, 0x00000002, 0x04000006, + 0x82040580, 0x00000051, 0x04000003, 0x80000580, + 0x0401f003, 0x82000540, 0x00000001, 0x1c01f000, + 0x59cc0006, 0x82000500, 0xffff0000, 0x82000d80, + 0x03000000, 0x04000004, 0x82000d80, 0x52000000, + 0x040207f3, 0x59a80026, 0x82000500, 0x00000009, + 0x82000580, 0x00000008, 0x040007ef, 0x0401f7ec, + 0x4803c856, 0x4c5c0000, 0x4c580000, 0x59a80016, + 0x82000580, 0x0000004c, 0x0402001f, 0x59ccb807, + 0x9c5cb9c0, 0x825cbd00, 0x00000007, 0x8c5cbd00, + 0x0400000a, 0x4200b000, 0x00000002, 0x83a81c00, + 0x00000002, 0x83cc1400, 0x0000000d, 0x0201f800, + 0x0010855a, 0x04020010, 0x8c5cbd02, 0x0400000a, + 0x4200b000, 0x00000002, 0x83a81c00, 0x00000000, + 0x83cc1400, 0x0000000f, 0x0201f800, 0x0010855a, + 0x04020005, 0x8c5cbd04, 0x04000003, 0x82000540, + 0x00000001, 0x5c00b000, 0x5c00b800, 0x1c01f000, + 0x4803c856, 0x4c5c0000, 0x4c580000, 0x59a80016, + 0x82000580, 0x0000004c, 0x0402001f, 0x59ccb807, + 0x9c5cb9c0, 0x825cbd00, 0x00000007, 0x8c5cbd00, + 0x0400000a, 0x4200b000, 0x00000002, 0x83a81c00, + 0x00000002, 0x83cc1400, 0x00000009, 0x0201f800, + 0x0010855a, 0x04020010, 0x8c5cbd02, 0x0400000a, + 0x4200b000, 0x00000002, 0x83a81c00, 0x00000000, + 0x83cc1400, 0x0000000b, 0x0201f800, 0x0010855a, + 0x04020005, 0x8c5cbd04, 0x04000003, 0x82000540, + 0x00000001, 0x5c00b000, 0x5c00b800, 0x1c01f000, + 0x4803c857, 0x4c580000, 0x40003000, 0x42002000, + 0x000007f0, 0x4200b000, 0x00000010, 0x83ac7400, + 0x000007f0, 0x50380000, 0x80026d40, 0x04000006, + 0x59340002, 0x82000500, 0x00ffffff, 0x80180580, + 0x04000010, 0x80102000, 0x80387000, 0x8058b040, + 0x040207f5, 0x82100480, 0x00000800, 0x42002000, + 0x00000000, 0x4200b000, 0x000007f0, 0x41ac7000, + 0x040217ed, 0x82000540, 0x00000001, 0x0401f002, + 0x40128800, 0x5c00b000, 0x1c01f000, 0x59a80026, + 0x8c00050e, 0x04000004, 0x8c000502, 0x04000003, + 0x80000580, 0x1c01f000, 0x82000540, 0x00000001, + 0x0401f7fd, 0x59300c06, 0x82040580, 0x00000002, + 0x04000006, 0x82040580, 0x00000005, 0x04000003, + 0x82000540, 0x00000001, 0x1c01f000, 0x59c80000, + 0x84000558, 0x84000512, 0x48039000, 0x1c01f000, + 0x4a03281a, 0x000003e8, 0x4a032802, 0x0010d1c0, + 0x4a032800, 0x00000000, 0x4a032808, 0x00107049, + 0x42000000, 0x00000005, 0x83947c00, 0x00000009, + 0x49787801, 0x4a007802, 0x00106fff, 0x823c7c00, + 0x00000003, 0x80000040, 0x040207fa, 0x4a032819, + 0xffff0000, 0x4201d000, 0x00000064, 0x0401f96e, + 0x4201d000, 0x000186a0, 0x0401f184, 0x00000000, + 0x00000003, 0x00000006, 0x00000009, 0x0000000c, + 0x4d300000, 0x4d2c0000, 0x4d340000, 0x4d400000, + 0x4cfc0000, 0x4d380000, 0x4d3c0000, 0x4d440000, + 0x4d4c0000, 0x4d480000, 0x4c5c0000, 0x4c600000, + 0x4c640000, 0x4cc80000, 0x4ccc0000, 0x0201f800, + 0x0002057b, 0x5c019800, 0x5c019000, 0x5c00c800, + 0x5c00c000, 0x5c00b800, 0x5c029000, 0x5c029800, + 0x5c028800, 0x5c027800, 0x5c027000, 0x5c01f800, + 0x5c028000, 0x5c026800, 0x5c025800, 0x5c026000, + 0x1c01f000, 0x59940004, 0x80000540, 0x0402000a, + 0x59940025, 0x80040400, 0x02001800, 0x001005d8, + 0x48032804, 0x480b2805, 0x4a032803, 0x0000000a, + 0x80000580, 0x1c01f000, 0x5994001f, 0x80000540, + 0x0402000a, 0x59940025, 0x80040400, 0x02001800, + 0x001005d8, 0x4803281f, 0x480b2820, 0x4a03281e, + 0x00000001, 0x80000580, 0x1c01f000, 0x59940022, + 0x80000540, 0x0402000a, 0x59940025, 0x80040400, + 0x02001800, 0x001005d8, 0x48032822, 0x480b2823, + 0x4a032821, 0x0000000a, 0x80000580, 0x1c01f000, + 0x4c000000, 0x59940005, 0x4803c857, 0x480bc857, + 0x80080580, 0x04020003, 0x497b2804, 0x497b2805, + 0x5c000000, 0x1c01f000, 0x4c000000, 0x59940020, + 0x4803c857, 0x480bc857, 0x80080580, 0x04020003, + 0x497b281f, 0x497b2820, 0x5c000000, 0x1c01f000, + 0x4c000000, 0x59940023, 0x4803c857, 0x480bc857, + 0x80080580, 0x04020003, 0x497b2822, 0x497b2823, + 0x5c000000, 0x1c01f000, 0x4937c857, 0x48ebc857, + 0x59340203, 0x80e80480, 0x04001002, 0x48ea6a03, + 0x1c01f000, 0x5c03e000, 0x1c01f000, 0x4d440000, + 0x42007800, 0x00000010, 0x59968801, 0x0201f800, + 0x00020245, 0x04020012, 0x59341a03, 0x800c1840, + 0x0400100f, 0x59940027, 0x800c0480, 0x04000003, + 0x48026a03, 0x0402100a, 0x5934000f, 0x497a6a03, + 0x80000540, 0x04000006, 0x4c3c0000, 0x5934140b, + 0x0201f800, 0x00020253, 0x5c007800, 0x81468800, + 0x83440480, 0x00000800, 0x04021007, 0x803c7840, + 0x040207e7, 0x49472801, 0x5c028800, 0x5c03e000, + 0x1c01f000, 0x4a032800, 0x00000002, 0x497b2801, + 0x0401f7fa, 0x42007800, 0x00000010, 0x59966002, + 0x59300205, 0x80000d40, 0x04000006, 0x59940027, + 0x80040480, 0x48026205, 0x0400102d, 0x0400002c, + 0x59300206, 0x80000d40, 0x04000014, 0x59b800e4, + 0x8c000524, 0x04020011, 0x4a0370e4, 0x00030000, + 0x40000000, 0x59b800e4, 0x8c000524, 0x04000004, + 0x4a0370e4, 0x00020000, 0x0401f008, 0x59940027, + 0x80040480, 0x48026206, 0x4a0370e4, 0x00020000, + 0x0400101c, 0x0400001b, 0x83326400, 0x00000024, + 0x49332802, 0x41540000, 0x81300480, 0x04021005, + 0x803c7840, 0x040207db, 0x5c03e000, 0x1c01f000, + 0x59940026, 0x48032827, 0x4a032802, 0x0010d1c0, + 0x497b2826, 0x80000540, 0x0400000f, 0x4a032800, + 0x00000001, 0x5c03e000, 0x1c01f000, 0x4c3c0000, + 0x0201f800, 0x001091db, 0x5c007800, 0x0401f7d1, + 0x4c3c0000, 0x0201f800, 0x00108d5d, 0x5c007800, + 0x0401f7e2, 0x4a032800, 0x00000000, 0x5c03e000, + 0x1c01f000, 0x59a8086b, 0x8c040d30, 0x04020029, + 0x8c040d32, 0x0400000f, 0x59a80069, 0x81640480, + 0x04001019, 0x59a8000b, 0x81500580, 0x04000005, + 0x59a8006a, 0x59a81066, 0x80080580, 0x04020012, + 0x900411c0, 0x82081500, 0x00007000, 0x0401f012, + 0x82040500, 0x0000001f, 0x04000016, 0x80040840, + 0x82040500, 0x0000001f, 0x04000003, 0x4807506b, + 0x0401f010, 0x900401c0, 0x82000500, 0x0000001f, + 0x80040d40, 0x900401c0, 0x80040580, 0x82001500, + 0x00007000, 0x82040500, 0xffff8fff, 0x80080540, + 0x4803506b, 0x80081114, 0x0201f800, 0x001006e2, + 0x1c01f000, 0x4a032807, 0x000007d0, 0x4a032806, + 0x0000000a, 0x1c01f000, 0x42000800, 0x000007d0, + 0x83180480, 0x00000005, 0x02021800, 0x001005d8, + 0x83947c00, 0x00000009, 0x83180400, 0x00105f43, + 0x50000000, 0x803c7c00, 0x48047801, 0x4a007800, + 0x0000000a, 0x1c01f000, 0x83180480, 0x00000005, + 0x02021800, 0x001005d8, 0x83947c00, 0x00000009, + 0x83180400, 0x00105f43, 0x50000000, 0x803c7c00, + 0x49787801, 0x1c01f000, 0x4807c857, 0x480bc857, + 0x59940025, 0x80040400, 0x02001800, 0x001005d8, + 0x48032804, 0x480b2805, 0x4a032803, 0x0000000a, + 0x1c01f000, 0x4807c857, 0x480bc857, 0x59940025, + 0x80040400, 0x02001800, 0x001005d8, 0x4803281c, + 0x480b281d, 0x4a03281b, 0x0000000a, 0x1c01f000, + 0x4c000000, 0x5994001d, 0x4803c857, 0x480bc857, + 0x80080580, 0x04020003, 0x4803281c, 0x4803281d, + 0x5c000000, 0x1c01f000, 0x80e9d1c0, 0x0400000e, + 0x0401f836, 0x04025000, 0x4203e000, 0x80000000, + 0x40e81000, 0x41780800, 0x42000000, 0x00000064, + 0x0201f800, 0x001066a0, 0x59940024, 0x80080400, + 0x48032824, 0x1c01f000, 0x42001000, 0x00105065, + 0x0401fef0, 0x42001000, 0x00105058, 0x0401ffe1, + 0x42001000, 0x00104148, 0x0401feea, 0x42001000, + 0x001041bc, 0x0401fee7, 0x42001000, 0x001041f3, + 0x0401f6f8, 0x4203e000, 0x70000000, 0x4203e000, + 0xb0300000, 0x41fc0000, 0x40ebf800, 0x80e80480, + 0x04001011, 0x04000004, 0x82000480, 0x00000003, + 0x0402100d, 0x42000000, 0x0000000f, 0x04004004, + 0x80000040, 0x040207fe, 0x0401f007, 0x4203e000, + 0x70000000, 0x42000000, 0x0010b87e, 0x0201f800, + 0x0010aa47, 0x1c01f000, 0x4203e000, 0x80000000, + 0x4203e000, 0xb0400000, 0x41fc0000, 0x40ebf800, + 0x80e80480, 0x04001011, 0x04000004, 0x82000480, + 0x00000003, 0x0402100d, 0x42000000, 0x0000000f, + 0x04005004, 0x80000040, 0x040207fe, 0x0401f007, + 0x4203e000, 0x80000000, 0x42000000, 0x0010b87f, + 0x0201f800, 0x0010aa47, 0x1c01f000, 0x59a8000e, + 0x82000480, 0x00000100, 0x599c0a02, 0x800409c0, + 0x04020002, 0x80040800, 0x80041480, 0x04001002, + 0x40000800, 0x48075067, 0x59a8100e, 0x40040000, + 0x800acc80, 0x4967500e, 0x49675069, 0x59aaa80b, + 0x41640800, 0x42001000, 0x00000024, 0x0201f800, + 0x00106681, 0x8206a400, 0x0010d1c0, 0x49535065, + 0x4152b000, 0x42006000, 0x0010be65, 0x4a006004, + 0x0000012c, 0x4a006005, 0xda10da10, 0x4a006008, + 0x00000011, 0x4a006009, 0x0010be65, 0x4a00600a, + 0x001010b8, 0x599c0014, 0x48006011, 0x599c0015, + 0x48006012, 0x42006000, 0x0010be41, 0x4a006203, + 0x00000008, 0x4a006406, 0x00000006, 0x4a006002, + 0xffff0000, 0x4a006008, 0x0010be65, 0x4a006014, + 0x0010be65, 0x599c0014, 0x48006015, 0x599c0015, + 0x48006016, 0x599c0413, 0x48006017, 0x49506018, + 0x49546019, 0x59a80067, 0x4800601a, 0x4a00601b, + 0x0010b465, 0x4a00601c, 0x0010b466, 0x4a00601d, + 0x0010b46a, 0x42000000, 0xb0000000, 0x42000800, + 0x0010be41, 0x0201f800, 0x00100b68, 0x1c01f000, + 0x82000d00, 0x000000c0, 0x04000004, 0x82040d80, + 0x000000c0, 0x04020055, 0x82000d00, 0x00002020, + 0x59300414, 0x84000512, 0x82040d80, 0x00002020, + 0x0400000b, 0x8c000514, 0x0402000f, 0x48026414, + 0x813e79c0, 0x02020000, 0x000206d0, 0x42027000, + 0x00000043, 0x0201f000, 0x000207a1, 0x59326809, + 0x59340a00, 0x8c040d0a, 0x040007f3, 0x84000552, + 0x0401f7f1, 0x84000514, 0x592c080d, 0x48066015, + 0x0401f7ef, 0x59326809, 0x59340a00, 0x8c040d0a, + 0x02000000, 0x000206e3, 0x59300c14, 0x84040d52, + 0x48066414, 0x0201f000, 0x000206e3, 0x0201f800, + 0x00020086, 0x813e79c0, 0x02020000, 0x000206d0, + 0x0201f000, 0x000206f1, 0x8c00051e, 0x02000000, + 0x000206fd, 0x82000d00, 0x00002020, 0x82040d80, + 0x00002020, 0x04000014, 0x82000500, 0x000000c0, + 0x82000d80, 0x00000080, 0x04000008, 0x813e79c0, + 0x02020000, 0x000206d0, 0x42027000, 0x00000041, + 0x0201f000, 0x000207a1, 0x813e79c0, 0x02020000, + 0x000206d0, 0x42027000, 0x00000043, 0x0201f000, + 0x000207a1, 0x59326809, 0x59340a00, 0x8c040d0a, + 0x040007ea, 0x59300c14, 0x84040d52, 0x48066414, + 0x0401f7e6, 0x492fc857, 0x42000800, 0x00000006, + 0x0201f000, 0x000206f8, 0x492fc857, 0x42000800, + 0x00000004, 0x0201f000, 0x000206f8, 0x4807c856, + 0x59a80068, 0x800409c0, 0x04000003, 0x80080540, + 0x0401f002, 0x80080500, 0x48035068, 0x1c01f000, + 0x4a030800, 0x00000000, 0x4a030802, 0x00000001, + 0x497b0803, 0x497b0804, 0x1c01f000, 0x59840002, + 0x8c000500, 0x04000004, 0x84000500, 0x4a030800, + 0x00000001, 0x84000544, 0x84000506, 0x48030802, + 0x82000d00, 0x0fffffff, 0x42000000, 0x90000000, + 0x0201f800, 0x00100b94, 0x59a80069, 0x82000480, + 0x00000007, 0x48035069, 0x80000580, 0x42000800, + 0x0010b519, 0x48000800, 0x48000801, 0x1c01f000, + 0x59a80069, 0x82000480, 0x00000007, 0x48035069, + 0x1c01f000, 0x83640480, 0x00000008, 0x0400101b, + 0x58c80a03, 0x80000580, 0x82000400, 0x00000008, + 0x80040840, 0x040207fd, 0x815c0480, 0x04001013, + 0x4200b000, 0x00000007, 0x0201f800, 0x0002075a, + 0x4a026203, 0x00000004, 0x4a026406, 0x00000009, + 0x4a026203, 0x00000004, 0x4a026007, 0x00000101, + 0x0401f809, 0x0401f880, 0x8058b040, 0x040207f3, + 0x80000580, 0x1c01f000, 0x82000540, 0x00000001, + 0x0401f7fd, 0x0201f800, 0x001007e4, 0x492e6008, + 0x58c80a03, 0x4a025a04, 0x0000002c, 0x497a5800, + 0x497a5801, 0x497a5c04, 0x497a5c06, 0x497a5805, + 0x4a025a08, 0x00000005, 0x4a025a07, 0x00000002, + 0x58c80201, 0x48025c04, 0x58c80202, 0x48025c07, + 0x58c80204, 0x48025c08, 0x4a02580d, 0x0000ffff, + 0x80040840, 0x0400000c, 0x412c2000, 0x0201f800, + 0x001007e4, 0x4a025a04, 0x0000000a, 0x497a5c04, + 0x48125800, 0x492c2001, 0x412c2000, 0x80040840, + 0x040207f7, 0x1c01f000, 0x4d7c0000, 0x4202f800, + 0x00000010, 0x4df00000, 0x4203e000, 0x50000000, + 0x59847803, 0x803c79c0, 0x0400001e, 0x4c5c0000, + 0x583cb808, 0x585c3408, 0x801831c0, 0x0400000b, + 0x0401f84a, 0x04000016, 0x42001000, 0x0010b519, + 0x0401f87f, 0x04000012, 0x0201f800, 0x001007d3, + 0x0400000f, 0x492cb805, 0x585c0005, 0x80000540, + 0x02000800, 0x001005d8, 0x0401f830, 0x585c5408, + 0x0401f80b, 0x5c00b800, 0x5c03e000, 0x817ef840, + 0x040207e1, 0x5c02f800, 0x1c01f000, 0x5c00b800, + 0x5c03e000, 0x5c02f800, 0x1c01f000, 0x4803c856, + 0x405c6000, 0x802851c0, 0x04000018, 0x585c0204, + 0x82000d00, 0x0000000f, 0x82040c00, 0x001010bd, + 0x50044000, 0x4cf00000, 0x4d000000, 0x4d040000, + 0x4021e000, 0x40320800, 0x59860004, 0x4c280000, + 0x0401f934, 0x5c005000, 0x40f04000, 0x41046000, + 0x0201f800, 0x0010109b, 0x040207f6, 0x5c020800, + 0x5c020000, 0x5c01e000, 0x58c80204, 0x4800bc08, + 0x0201f800, 0x00020086, 0x4a026007, 0x00000101, + 0x497a6009, 0x0401f055, 0x4803c856, 0x59840003, + 0x80026540, 0x04000003, 0x59300000, 0x48030803, + 0x1c01f000, 0x4803c856, 0x59840003, 0x48026000, + 0x49330803, 0x1c01f000, 0x58cc0805, 0x40180000, + 0x80040480, 0x0400100d, 0x82cc0580, 0x0010b50e, + 0x02020800, 0x001005d8, 0x58c80205, 0x80040480, + 0x0400101d, 0x82000540, 0x00000001, 0x1c01f000, + 0x80003580, 0x0401f7fe, 0x82cc0580, 0x0010b50e, + 0x02020800, 0x001005d8, 0x58c80400, 0x8c000504, + 0x040007f8, 0x58c8040b, 0x8c00051e, 0x040007f5, + 0x8c000500, 0x040207f3, 0x84000540, 0x4801940b, + 0x42000000, 0x0010b839, 0x0201f800, 0x0010aa47, + 0x42001000, 0x00008026, 0x0201f800, 0x00103a3e, + 0x0401f7e8, 0x58c8040b, 0x8c00051e, 0x040007e2, + 0x8c000502, 0x040207e0, 0x84000542, 0x4801940b, + 0x42000000, 0x0010b838, 0x0201f800, 0x0010aa47, + 0x42001000, 0x00008025, 0x42001800, 0x00000000, + 0x0201f800, 0x00103a3e, 0x0401f7d3, 0x4803c856, + 0x58080000, 0x42001800, 0x00000007, 0x58080801, + 0x80040480, 0x04020004, 0x400c0000, 0x80000540, + 0x0401f005, 0x04001003, 0x800c0480, 0x0401f002, + 0x80000080, 0x1c01f000, 0x4803c856, 0x59300008, + 0x80000d40, 0x02000800, 0x001005d8, 0x58040005, + 0x80000540, 0x02000800, 0x001005d8, 0x59300007, + 0x82000500, 0x00000101, 0x82000580, 0x00000101, + 0x02020800, 0x001005d8, 0x42001000, 0x0010b519, + 0x58080801, 0x82040400, 0x0010b51b, 0x497a6414, + 0x4a026015, 0x0000ffff, 0x45300000, 0x80040800, + 0x82040480, 0x00000008, 0x04001002, 0x80000d80, + 0x48041001, 0x82040400, 0x0010b51b, 0x45780000, + 0x1c01f000, 0x4933c857, 0x59300808, 0x800409c0, + 0x02000800, 0x001005d8, 0x4d2c0000, 0x58065805, + 0x812e59c0, 0x02020800, 0x001007f4, 0x49780805, + 0x40065800, 0x0201f800, 0x001007fd, 0x5c025800, + 0x4d300000, 0x0201f800, 0x0002077d, 0x5c026000, + 0x1c01f000, 0x59300406, 0x82000580, 0x00000009, + 0x04020006, 0x59300007, 0x8c000510, 0x04000003, + 0x80000580, 0x1c01f000, 0x82000540, 0x00000001, + 0x1c01f000, 0x59840802, 0x8c040d04, 0x1c01f000, + 0x4803c856, 0x59840802, 0x84040d04, 0x84040d40, + 0x4a030800, 0x00000000, 0x48070802, 0x82040d00, + 0x0fffffff, 0x42000000, 0x90000000, 0x0201f000, + 0x00100b94, 0x4807c857, 0x4805980a, 0x49799801, + 0x49799803, 0x49799806, 0x49799807, 0x49799808, + 0x49799805, 0x49799809, 0x0401f8c9, 0x0400000a, + 0x0401f8eb, 0x04000008, 0x48359800, 0x48359802, + 0x48359806, 0x4a019804, 0x00000001, 0x4a019807, + 0x00000005, 0x1c01f000, 0x4807c857, 0x58cc1007, + 0x40040000, 0x80080480, 0x04021020, 0x4c040000, + 0x4c080000, 0x0401f8da, 0x5c001000, 0x5c000800, + 0x0400001c, 0x58cc0006, 0x80006540, 0x0402000b, + 0x48359800, 0x48359802, 0x48359806, 0x49799801, + 0x49799803, 0x49786801, 0x49786800, 0x49799804, + 0x49799807, 0x0401f005, 0x48306801, 0x48346000, + 0x48359806, 0x49786800, 0x58cc0004, 0x58cc1007, + 0x80000000, 0x82081400, 0x00000005, 0x48019804, + 0x48099807, 0x0401f7df, 0x80000580, 0x1c01f000, + 0x82000540, 0x00000001, 0x1c01f000, 0x480bc857, + 0x4c500000, 0x4c540000, 0x4c580000, 0x40083000, + 0x58cc0801, 0x82040480, 0x00000005, 0x02021800, + 0x001005d8, 0x82040400, 0x00106418, 0x50000000, + 0x58cca800, 0x8054ac00, 0x42001800, 0x00000005, + 0x40040000, 0x800c0480, 0x80082480, 0x04021002, + 0x40080000, 0x8000b0c2, 0x8058b400, 0x5450a800, + 0x8050a000, 0x8054a800, 0x8058b040, 0x040207fc, + 0x40001000, 0x58cc2805, 0x58cc0807, 0x58cc2001, + 0x80142c00, 0x80040c80, 0x80102400, 0x48159805, + 0x48059807, 0x48119801, 0x82100580, 0x00000005, + 0x0400000c, 0x48119801, 0x40080000, 0x80181480, + 0x40083000, 0x04000003, 0x040217d6, 0x80000580, + 0x5c00b000, 0x5c00a800, 0x5c00a000, 0x1c01f000, + 0x58cc0800, 0x800409c0, 0x02000800, 0x001005d8, + 0x58040800, 0x48059800, 0x41782000, 0x0401f7ee, + 0x0401f813, 0x50f00000, 0x81040400, 0x40001800, + 0x585c0204, 0x4803c857, 0x82000580, 0x0000002c, + 0x02020800, 0x001005d8, 0x58040202, 0x800000e0, + 0x81000540, 0x48001802, 0x58040000, 0x48001800, + 0x58040001, 0x48001801, 0x1c01f000, 0x4807c856, + 0x58cc0005, 0x80000040, 0x02001800, 0x001005d8, + 0x48019805, 0x58cc1003, 0x82080480, 0x00000005, + 0x02021800, 0x001005d8, 0x82080400, 0x00106418, + 0x50000000, 0x58cc0802, 0x80040c00, 0x80081000, + 0x82080480, 0x00000005, 0x0402000f, 0x58cc2002, + 0x58100000, 0x80006d40, 0x04000009, 0x4c340000, + 0x0401f858, 0x5c006800, 0x49786801, 0x48359802, + 0x58cc0004, 0x80000040, 0x48019804, 0x49799803, + 0x0401f002, 0x48099803, 0x1c01f000, 0x4807c856, + 0x41781800, 0x58c80201, 0x80000540, 0x04000002, + 0x800c1800, 0x58c80c01, 0x80040c80, 0x0400100a, + 0x04000009, 0x800c1800, 0x58c80202, 0x80041480, + 0x04001005, 0x04000004, 0x800c1800, 0x40080800, + 0x0401f7fb, 0x480d9204, 0x400c0000, 0x42002000, + 0x00000001, 0x80000040, 0x04000007, 0x04001006, + 0x80102000, 0x82000480, 0x00000005, 0x04000002, + 0x040217fc, 0x48119203, 0x1c01f000, 0x4807c856, + 0x4d2c0000, 0x58cc000a, 0x80000540, 0x02000800, + 0x001005d8, 0x82002400, 0x00000005, 0x0201f800, + 0x001007d3, 0x04000012, 0x492d9809, 0x497a5800, + 0x497a5801, 0x0201f800, 0x001007d3, 0x0400000c, + 0x58cc0009, 0x48025800, 0x497a5801, 0x492d9809, + 0x82102480, 0x00000005, 0x040217f7, 0x82000540, + 0x00000001, 0x5c025800, 0x1c01f000, 0x58cc0009, + 0x80025d40, 0x040007fc, 0x592c2000, 0x0201f800, + 0x001007f4, 0x40100000, 0x0401f7fa, 0x58cc0009, + 0x48cfc857, 0x80006d40, 0x04000005, 0x50340000, + 0x48019809, 0x49786800, 0x49786801, 0x1c01f000, + 0x4813c857, 0x58cc0009, 0x48002000, 0x48119809, + 0x1c01f000, 0x4807c856, 0x4d2c0000, 0x58cc0009, + 0x80025d40, 0x04000007, 0x592c0000, 0x4c000000, + 0x0201f800, 0x001007f4, 0x5c000000, 0x0401f7f9, + 0x5c025800, 0x1c01f000, 0x4807c856, 0x4d2c0000, + 0x58cc0002, 0x80025d40, 0x04000007, 0x592c0000, + 0x4c000000, 0x0201f800, 0x001007f4, 0x5c000000, + 0x0401f7f9, 0x49799800, 0x49799802, 0x49799801, + 0x49799803, 0x49799806, 0x49799807, 0x49799808, + 0x49799809, 0x4979980a, 0x5c025800, 0x1c01f000, + 0x00000003, 0x00000006, 0x00000009, 0x0000000c, + 0x0000000f, 0x00000012, 0x4803c856, 0x0401f857, + 0x4a00c204, 0x0000003c, 0x59301009, 0x82080580, + 0x0010b524, 0x04000013, 0x58080802, 0x82040d00, + 0x00ffffff, 0x58080403, 0x4804c005, 0x4800c406, + 0x4a00c207, 0x00000003, 0x59300811, 0x585c0404, + 0x4978c206, 0x4804c407, 0x80000540, 0x0400000d, + 0x58600206, 0x84000540, 0x4800c206, 0x0401f009, + 0x585c080a, 0x82040d00, 0x00ffffff, 0x4804c005, + 0x4a00c406, 0x000007ff, 0x4978c207, 0x0401f7ef, + 0x82603c00, 0x00000008, 0x58605404, 0x40282000, + 0x405c6000, 0x585c0a04, 0x82040d00, 0x0000000f, + 0x82040c00, 0x001010bd, 0x50044000, 0x80004d80, + 0x50200000, 0x80307400, 0x58380402, 0x8c244d00, + 0x04020003, 0x48003a00, 0x0401f003, 0x48003c00, + 0x801c3800, 0x80244800, 0x80102040, 0x04000006, + 0x0201f800, 0x0010109b, 0x02000800, 0x001005d8, + 0x0401f7f0, 0x1c01f000, 0x4803c856, 0x4d340000, + 0x59300009, 0x80026d40, 0x02000800, 0x001005d8, + 0x59340401, 0x80000540, 0x0400000e, 0x59840000, + 0x80000540, 0x0400000b, 0x836c0580, 0x00000003, + 0x04020008, 0x59341c03, 0x42002000, 0x00000004, + 0x42003000, 0x00000004, 0x0201f800, 0x00103aae, + 0x5c026800, 0x1c01f000, 0x4803c856, 0x80001580, + 0x58c80c01, 0x59300011, 0x80040c80, 0x48066011, + 0x58c80201, 0x80000540, 0x04000005, 0x80081000, + 0x80040c80, 0x04001007, 0x04000006, 0x58c80202, + 0x80081000, 0x80040c80, 0x04001002, 0x040207fd, + 0x4808bc08, 0x4808c404, 0x1c01f000, 0x4803c856, + 0x4a0370e5, 0x00020000, 0x59b800e5, 0x8c000524, + 0x040207fc, 0x4a0370e5, 0x00030000, 0x40000000, + 0x40000000, 0x59b800e5, 0x8c000524, 0x040207f5, + 0x5934000e, 0x80006d40, 0x04000010, 0x81300580, + 0x04020004, 0x58340000, 0x4802680e, 0x0401f00a, + 0x40347800, 0x58340000, 0x80006d40, 0x02000800, + 0x001005d8, 0x81300580, 0x040207fa, 0x58340000, + 0x48007800, 0x497a6000, 0x4a0370e5, 0x00020000, + 0x1c01f000, 0x4803c856, 0x4d300000, 0x4d2c0000, + 0x42000800, 0x000003ff, 0x4a0370e5, 0x00020000, + 0x59b800e5, 0x8c000524, 0x04000005, 0x80040840, + 0x040207fa, 0x0201f800, 0x001005d8, 0x4a0370e5, + 0x00030000, 0x40000000, 0x40000000, 0x59b800e5, + 0x8c000524, 0x040207f1, 0x5934000e, 0x80026540, + 0x0400000e, 0x4933c857, 0x59300000, 0x4802680e, + 0x4a026203, 0x00000004, 0x497a6206, 0x497a6009, + 0x4a026007, 0x00000101, 0x59325808, 0x497a5c08, + 0x0401fd81, 0x0401f7f1, 0x4a0370e5, 0x00020000, + 0x5c025800, 0x5c026000, 0x1c01f000, 0x4803c856, + 0x4c000000, 0x0201f800, 0x00105c9a, 0x04020011, + 0x0201f800, 0x001045a6, 0x02020800, 0x001005d8, + 0x5c000000, 0x48026802, 0x0201f800, 0x0002075a, + 0x04000009, 0x49366009, 0x4a026406, 0x00000001, + 0x42027000, 0x00000001, 0x0201f000, 0x000207a1, + 0x5c000000, 0x1c01f000, 0x59300203, 0x82000c80, + 0x0000000e, 0x02021800, 0x001005d8, 0x4803c857, + 0x0c01f001, 0x00106503, 0x00106503, 0x00106503, + 0x00106505, 0x00106565, 0x00106503, 0x00106503, + 0x001065b7, 0x001065b8, 0x00106503, 0x00106503, + 0x00106503, 0x00106503, 0x00106503, 0x0201f800, + 0x001005d8, 0x493bc857, 0x83380480, 0x00000050, + 0x02021800, 0x001005d8, 0x83380480, 0x00000049, + 0x02001800, 0x001005d8, 0x0c01f001, 0x00106518, + 0x0010653a, 0x00106516, 0x00106516, 0x00106516, + 0x00106516, 0x00106549, 0x0201f800, 0x001005d8, + 0x4d2c0000, 0x59325808, 0x592c0206, 0x48025c06, + 0x4a025a06, 0x00000000, 0x4c5c0000, 0x592cbc0a, + 0x592c0000, 0x48026008, 0x0201f800, 0x00104cde, + 0x59300008, 0x80000540, 0x04000008, 0x4a026203, + 0x00000007, 0x42027000, 0x00000043, 0x5c00b800, + 0x5c025800, 0x0401f08a, 0x8c5cbd08, 0x04020006, + 0x4a026203, 0x00000007, 0x497a6206, 0x497a6008, + 0x0401f003, 0x0201f800, 0x0002077d, 0x5c00b800, + 0x5c025800, 0x1c01f000, 0x0201f800, 0x00106b8a, + 0x4d2c0000, 0x59325808, 0x0201f800, 0x00109037, + 0x04000006, 0x4d400000, 0x42028000, 0x00000001, + 0x0401f8f8, 0x5c028000, 0x5c025800, 0x0201f000, + 0x0002077d, 0x0201f800, 0x00106b8a, 0x4d3c0000, + 0x417a7800, 0x0201f800, 0x0010203c, 0x5c027800, + 0x42003000, 0x00000014, 0x0201f800, 0x0010a942, + 0x42000000, 0x0010b864, 0x0201f800, 0x0010aa47, + 0x4d2c0000, 0x59325808, 0x0201f800, 0x00109037, + 0x04000006, 0x4d400000, 0x42028000, 0x00000029, + 0x0401f8dc, 0x5c028000, 0x5c025800, 0x0201f000, + 0x0002077d, 0x493bc857, 0x497a6206, 0x83380480, + 0x00000054, 0x02021800, 0x001005d8, 0x83380480, + 0x00000047, 0x02001800, 0x001005d8, 0x0c01f001, + 0x001065b6, 0x0010657f, 0x0010657d, 0x0010657d, + 0x0010657d, 0x0010657d, 0x0010657d, 0x0010657d, + 0x0010657d, 0x0010657d, 0x0010657d, 0x0010657d, + 0x00106583, 0x0201f800, 0x001005d8, 0x59300011, + 0x82000500, 0xffff0000, 0x04020034, 0x59840802, + 0x8c040d04, 0x04000025, 0x59300009, 0x80026d40, + 0x0400001f, 0x4c5c0000, 0x4c600000, 0x497a6206, + 0x5930b808, 0x585c0005, 0x8000c540, 0x02000800, + 0x001005d8, 0x0401fe8d, 0x40625800, 0x0201f800, + 0x00104cde, 0x4978b805, 0x0401fef5, 0x497a6009, + 0x585c3408, 0x0401fcbd, 0x0400000e, 0x42001000, + 0x0010b519, 0x0401fcf2, 0x0400000a, 0x0201f800, + 0x001007e4, 0x04000007, 0x492cb805, 0x585c5408, + 0x0401fc83, 0x5c00c000, 0x5c00b800, 0x1c01f000, + 0x0401fca9, 0x0401f7fc, 0x8c040d06, 0x040207fc, + 0x59300009, 0x80026d40, 0x04000006, 0x5934000e, + 0x80000540, 0x02020800, 0x001005d8, 0x497a6009, + 0x0401fd0d, 0x0401f7f2, 0x0401f06f, 0x4803c856, + 0x4803c856, 0x83380580, 0x00000043, 0x02020800, + 0x001005d8, 0x4a026203, 0x00000003, 0x493a6403, + 0x59325808, 0x592c000f, 0x48026011, 0x497a6013, + 0x592c0406, 0x800000c2, 0x800010c4, 0x80081400, + 0x480a6206, 0x0201f800, 0x00100f4e, 0x42000800, + 0x80000060, 0x0401f154, 0x42000000, 0x0010b875, + 0x0201f800, 0x0010aa47, 0x59300203, 0x82000c80, + 0x0000000e, 0x02021800, 0x001005d8, 0x4803c857, + 0x82000d80, 0x00000003, 0x04000006, 0x82000d80, + 0x00000004, 0x04000045, 0x0201f800, 0x001005d8, + 0x0201f800, 0x00106c55, 0x59300004, 0x8c00053e, + 0x04020007, 0x0201f800, 0x00106b6c, 0x02020800, + 0x001005d8, 0x0201f000, 0x00106c4b, 0x0401f9c3, + 0x0201f800, 0x00106c4b, 0x59325808, 0x42028000, + 0x00000006, 0x0401f84b, 0x0201f000, 0x0002077d, + 0x4803c856, 0x59300203, 0x82000c80, 0x0000000e, + 0x02021800, 0x001005d8, 0x82000d80, 0x00000003, + 0x04000006, 0x82000d80, 0x00000004, 0x04000023, + 0x0201f800, 0x001005d8, 0x4803c856, 0x0201f800, + 0x00106c55, 0x4df00000, 0x59300004, 0x8c00053e, + 0x04020006, 0x0201f800, 0x00106f60, 0x02020800, + 0x001005d8, 0x0401f010, 0x0201f800, 0x00108cd6, + 0x04020004, 0x0201f800, 0x00106e62, 0x0402000a, + 0x0401f99a, 0x02020800, 0x001005d8, 0x5c03e000, + 0x02000800, 0x00106c4b, 0x82000540, 0x00000001, + 0x1c01f000, 0x5c03e000, 0x02000800, 0x00106c4b, + 0x80000580, 0x1c01f000, 0x4933c857, 0x0201f800, + 0x00100e99, 0x4933c857, 0x4c5c0000, 0x4d340000, + 0x497a6206, 0x5930b808, 0x59300009, 0x80026d40, + 0x04020e5f, 0x42001000, 0x0010b519, 0x0401fc60, + 0x04000009, 0x58c80204, 0x4800bc08, 0x41785000, + 0x0201f800, 0x00106227, 0x5c026800, 0x5c00b800, + 0x1c01f000, 0x4978bc08, 0x0401fc17, 0x0401f7fb, + 0x4803c856, 0x0201f800, 0x00109037, 0x0400000f, + 0x592c0000, 0x80000d40, 0x04000009, 0x497a5800, + 0x49425a06, 0x4c040000, 0x0201f800, 0x000202da, + 0x5c000800, 0x40065800, 0x0401f7f6, 0x49425a06, + 0x0201f800, 0x000202da, 0x1c01f000, 0x4933c857, + 0x59300c06, 0x82040580, 0x0000000e, 0x04000004, + 0x82040580, 0x00000009, 0x04020004, 0x0401ffe5, + 0x497a6008, 0x80000580, 0x1c01f000, 0x592e6009, + 0x83300480, 0x0010d1c0, 0x04001016, 0x41580000, + 0x81300480, 0x04021013, 0x40040000, 0x59300c06, + 0x80040580, 0x04020012, 0x59300a03, 0x82040580, + 0x00000007, 0x02020800, 0x001005d8, 0x59300008, + 0x80000540, 0x02020800, 0x001005d8, 0x0201f800, + 0x0002077d, 0x42000000, 0x00000000, 0x0401f009, + 0x42000000, 0x00000008, 0x0401f006, 0x82040580, + 0x00000007, 0x040207fb, 0x42000000, 0x00000005, + 0x592c0a06, 0x48065c06, 0x48025a06, 0x0201f000, + 0x000202da, 0x4c0c0000, 0x4c100000, 0x4c140000, + 0x4c180000, 0x80001d80, 0x80002580, 0x42003000, + 0x00000020, 0x82040500, 0x00000001, 0x04000003, + 0x40080000, 0x800c1c00, 0x400c2800, 0x800c1902, + 0x80102102, 0x82140500, 0x00000001, 0x04000003, + 0x82102540, 0x80000000, 0x80040902, 0x80183040, + 0x040207f1, 0x40100800, 0x400c0000, 0x5c003000, + 0x5c002800, 0x5c002000, 0x5c001800, 0x1c01f000, + 0x4c580000, 0x4200b000, 0x00000020, 0x80000540, + 0x04000018, 0x80041c80, 0x04021016, 0x800810c2, + 0x80040982, 0x04001006, 0x80041c80, 0x04021005, + 0x8058b040, 0x040207fa, 0x0401f006, 0x80041c80, + 0x400c0800, 0x80081000, 0x8058b040, 0x040207f4, + 0x4c000000, 0x41f00000, 0x82000500, 0xf7ffffff, + 0x4003e000, 0x5c000000, 0x5c00b000, 0x1c01f000, + 0x4c000000, 0x41f00000, 0x82000540, 0x08000000, + 0x0401f7f8, 0x4a0378e8, 0x00000000, 0x4a03c821, + 0x00000010, 0x4a03c823, 0x00000004, 0x0401f82c, + 0x4a0378e9, 0x00003a0d, 0x4a0378e8, 0x00000001, + 0x42000000, 0x00001000, 0x50000000, 0x82000480, + 0x24220001, 0x04000004, 0x59e00002, 0x84000548, + 0x4803c002, 0x42000800, 0x00000005, 0x4203a000, + 0x00007600, 0x42000000, 0x00001000, 0x50000000, + 0x82000480, 0x24320001, 0x04021003, 0x4a03a005, + 0xd0000001, 0x59d00006, 0x4a03a005, 0x90000001, + 0x83d3a400, 0x00000020, 0x80040840, 0x040207fa, + 0x59e00003, 0x82000500, 0xffffffe0, 0x82000540, + 0x00008000, 0x4803c003, 0x59c40006, 0x82000500, + 0xfffcffff, 0x48038806, 0x1c01f000, 0x4d900000, + 0x4d180000, 0x4a0378e7, 0xaaaaaaaa, 0x4a0378e6, + 0xaaaaaaaa, 0x4a0378e5, 0xaaaaaaaa, 0x4a0378e4, + 0xaaaaaaaa, 0x42000800, 0x0000bf00, 0x4a00081a, + 0x0010b7d4, 0x4a00081b, 0x001010bd, 0x4a00081c, + 0x001010cd, 0x4a031800, 0x00000000, 0x4a031801, + 0x0010b544, 0x4a031802, 0x0010b54b, 0x42000800, + 0x0010b7d7, 0x417a3000, 0x811b20c8, 0x83932400, + 0x0000bf32, 0x48072000, 0x4a032001, 0x00000000, + 0x83180400, 0x001070ea, 0x50000000, 0x48032002, + 0x82040c00, 0x00000003, 0x811a3000, 0x83180480, + 0x00000005, 0x040017f1, 0x5c023000, 0x5c032000, + 0x1c01f000, 0x48066004, 0x497a6000, 0x497a6001, + 0x59bc00ea, 0x8c000516, 0x040207fe, 0x83300400, + 0xa0000000, 0x480378e1, 0x1c01f000, 0x4933c857, + 0x42000800, 0x80000040, 0x48066004, 0x497a6000, + 0x59bc00ea, 0x8c000516, 0x040207fe, 0x83300400, + 0x60000000, 0x480378e1, 0x1c01f000, 0x0201f800, + 0x00106c55, 0x4df00000, 0x4d300000, 0x4d340000, + 0x4d2c0000, 0x4d180000, 0x4c5c0000, 0x4c600000, + 0x4d900000, 0x4dd00000, 0x4da40000, 0x4d140000, + 0x42003000, 0x0000bf2e, 0x581a6001, 0x813261c0, + 0x0400002c, 0x41302800, 0x4178c000, 0x59300000, + 0x4c000000, 0x59326809, 0x5930b801, 0x59300406, + 0x82000d80, 0x00000006, 0x04020003, 0x8d3e7d18, + 0x04000010, 0x8d3e7d06, 0x04000007, 0x82000580, + 0x00000003, 0x04020004, 0x59340200, 0x8c00050e, + 0x04020008, 0x0401f92f, 0x4c0c0000, 0x4c140000, + 0x0401fb5f, 0x5c002800, 0x5c001800, 0x0401f005, + 0x41301800, 0x8060c1c0, 0x04020002, 0x400cc000, + 0x805cb9c0, 0x04000003, 0x405e6000, 0x0401f7e3, + 0x5c026000, 0x813261c0, 0x04000006, 0x8060c1c0, + 0x04000002, 0x40602800, 0x4178c000, 0x0401f7d8, + 0x417a3000, 0x0201f800, 0x001070d8, 0x59926004, + 0x813261c0, 0x04000023, 0x59326809, 0x4130c000, + 0x59300001, 0x8000bd40, 0x04000016, 0x40026000, + 0x40602800, 0x5930b801, 0x59300406, 0x82000d80, + 0x00000006, 0x0400000e, 0x8d3e7d06, 0x04000007, + 0x82000580, 0x00000003, 0x04020004, 0x59340200, + 0x8c00050e, 0x04020006, 0x0401f8dc, 0x4c140000, + 0x0401fb2f, 0x5c002800, 0x0401f002, 0x41302800, + 0x405e6000, 0x813261c0, 0x040207eb, 0x8060c1c0, + 0x04000004, 0x40626000, 0x4178c000, 0x0401f7e7, + 0x811a3000, 0x83180480, 0x00000005, 0x040017d6, + 0x5c022800, 0x5c034800, 0x5c03a000, 0x5c032000, + 0x5c00c000, 0x5c00b800, 0x5c023000, 0x5c025800, + 0x5c026800, 0x5c026000, 0x5c03e000, 0x02000800, + 0x00106c4b, 0x1c01f000, 0x4933c857, 0x0201f800, + 0x00106c55, 0x4df00000, 0x4d340000, 0x4d180000, + 0x4d900000, 0x42003000, 0x0000bf2e, 0x59326809, + 0x58182001, 0x40102800, 0x801021c0, 0x04000016, + 0x41300000, 0x80100580, 0x04000011, 0x58100009, + 0x81340580, 0x0402000b, 0x40101800, 0x58102001, + 0x41300000, 0x801021c0, 0x0400000b, 0x80100d80, + 0x04000007, 0x40101800, 0x58102001, 0x0401f7fa, + 0x40102800, 0x58102000, 0x0401f7ec, 0x0401f8bd, + 0x0401f01a, 0x42032000, 0x0000bf32, 0x417a3000, + 0x59902004, 0x40102800, 0x801021c0, 0x0400000b, + 0x58100009, 0x81340580, 0x04020008, 0x41300000, + 0x80100580, 0x0400000c, 0x40102800, 0x58102001, + 0x801021c0, 0x040207fa, 0x811a3000, 0x83180480, + 0x00000005, 0x0402100d, 0x83932400, 0x00000010, + 0x0401f7ec, 0x0401f881, 0x5c032000, 0x5c023000, + 0x5c026800, 0x5c03e000, 0x02000800, 0x00106c4b, + 0x80000580, 0x1c01f000, 0x0401fb6f, 0x040007f7, + 0x5c032000, 0x5c023000, 0x5c026800, 0x5c03e000, + 0x02000800, 0x00106c4b, 0x82000540, 0x00000001, + 0x1c01f000, 0x0201f800, 0x00106c55, 0x4df00000, + 0x4d300000, 0x4d340000, 0x4d180000, 0x4d2c0000, + 0x4c5c0000, 0x4c600000, 0x4d900000, 0x4dd00000, + 0x4da40000, 0x4d140000, 0x42003000, 0x0000bf2e, + 0x581a6001, 0x813261c0, 0x04000023, 0x41302800, + 0x5930b800, 0x59326809, 0x59340403, 0x81440580, + 0x04000006, 0x805cb9c0, 0x0400001b, 0x41302800, + 0x405e6000, 0x0401f7f7, 0x5930b801, 0x8d3e7d00, + 0x04000003, 0x0401fb67, 0x0402000e, 0x59300406, + 0x82000580, 0x00000006, 0x04020003, 0x8d3e7d18, + 0x04000008, 0x0401f867, 0x4c0c0000, 0x4c140000, + 0x0401fa97, 0x5c002800, 0x5c001800, 0x0401f002, + 0x41301800, 0x405e6000, 0x813261c0, 0x040207eb, + 0x0401f02d, 0x417a3000, 0x0201f800, 0x001070d8, + 0x59926004, 0x813261c0, 0x04000005, 0x59326809, + 0x59340403, 0x81440580, 0x04000006, 0x811a3000, + 0x83180480, 0x00000005, 0x040017f4, 0x0401f01e, + 0x4130c000, 0x59300001, 0x8000bd40, 0x04000012, + 0x40026000, 0x40602800, 0x5930b801, 0x8d3e7d00, + 0x04000003, 0x0401fb3b, 0x0402000a, 0x59300406, + 0x82000580, 0x00000006, 0x04000006, 0x0401f81b, + 0x4c140000, 0x0401fa6e, 0x5c002800, 0x0401f002, + 0x41302800, 0x405e6000, 0x813261c0, 0x040207ef, + 0x8060c1c0, 0x04000004, 0x40626000, 0x4178c000, + 0x0401f7eb, 0x5c022800, 0x5c034800, 0x5c03a000, + 0x5c032000, 0x5c00c000, 0x5c00b800, 0x5c025800, + 0x5c023000, 0x5c026800, 0x5c026000, 0x5c03e000, + 0x04000be3, 0x1c01f000, 0x0401fbc8, 0x59900004, + 0x81300580, 0x04020018, 0x4c140000, 0x0201f800, + 0x00106dc3, 0x0401fbb8, 0x5c002800, 0x59300001, + 0x800001c0, 0x04020003, 0x497a680c, 0x1c01f000, + 0x42003000, 0x0000bf2e, 0x497a6001, 0x58180801, + 0x800409c0, 0x04020004, 0x48003000, 0x48003001, + 0x1c01f000, 0x58180800, 0x48000800, 0x48003000, + 0x1c01f000, 0x59300001, 0x48002801, 0x800001c0, + 0x04020002, 0x4816680c, 0x497a6001, 0x1c01f000, + 0x0401fba6, 0x42003000, 0x0000bf2e, 0x58180001, + 0x81300580, 0x0402001c, 0x59300801, 0x800409c0, + 0x0400000e, 0x59300000, 0x800001c0, 0x04020005, + 0x48043001, 0x48043000, 0x497a6001, 0x1c01f000, + 0x59300000, 0x48000800, 0x48043001, 0x497a6000, + 0x497a6001, 0x1c01f000, 0x59300800, 0x800409c0, + 0x04020005, 0x49783001, 0x49783000, 0x497a680c, + 0x1c01f000, 0x48043001, 0x497a6000, 0x497a680c, + 0x1c01f000, 0x58180000, 0x81300580, 0x0402000c, + 0x59300001, 0x800001c0, 0x04020005, 0x48143000, + 0x49782800, 0x497a680c, 0x1c01f000, 0x48003000, + 0x48002800, 0x497a6001, 0x1c01f000, 0x59300000, + 0x800001c0, 0x04020008, 0x59300001, 0x48001801, + 0x800001c0, 0x04020002, 0x480e680c, 0x497a6001, + 0x1c01f000, 0x59300801, 0x800409c0, 0x04020006, + 0x59300800, 0x48042800, 0x497a6000, 0x497a680c, + 0x1c01f000, 0x59300000, 0x48000800, 0x48042800, + 0x497a6000, 0x497a6001, 0x1c01f000, 0x0401fb82, + 0x4df00000, 0x0401f839, 0x040208c4, 0x04020945, + 0x04020a89, 0x04020005, 0x5c03e000, 0x04000b70, + 0x80000580, 0x1c01f000, 0x5c03e000, 0x04000b6c, + 0x82000540, 0x00000001, 0x1c01f000, 0x4d2c0000, + 0x4d340000, 0x4d300000, 0x41783000, 0x598e6009, + 0x813261c0, 0x04000021, 0x59300406, 0x82000580, + 0x00000006, 0x04020004, 0x8d3e7d18, 0x0402000a, + 0x0401f017, 0x82040580, 0x00000005, 0x04020006, + 0x8d3e7d16, 0x04000004, 0x59300420, 0x8c000500, + 0x0402000f, 0x0401fa4e, 0x59300000, 0x4c000000, + 0x8d3e7d06, 0x04000004, 0x0201f800, 0x001092d7, + 0x04000005, 0x0401f867, 0x4c180000, 0x0401f9bc, + 0x5c003000, 0x5c026000, 0x0401f7e2, 0x41303000, + 0x59326000, 0x0401f7df, 0x5c026000, 0x5c026800, + 0x5c025800, 0x1c01f000, 0x4933c857, 0x4c5c0000, + 0x813261c0, 0x02000800, 0x001005d8, 0x41300000, + 0x598cb809, 0x41783000, 0x805cb9c0, 0x04000013, + 0x805c0d80, 0x04000004, 0x405c3000, 0x5818b800, + 0x0401f7fa, 0x0401f84b, 0x598c000d, 0x81300580, + 0x02000800, 0x001070b9, 0x59300403, 0x82000580, + 0x00000042, 0x04020002, 0x497a6007, 0x80000580, + 0x5c00b800, 0x1c01f000, 0x82000540, 0x00000001, + 0x5c00b800, 0x1c01f000, 0x0401fb27, 0x4df00000, + 0x4d2c0000, 0x4d340000, 0x4d300000, 0x41783000, + 0x598e6009, 0x813261c0, 0x0400002c, 0x59300c06, + 0x82040580, 0x00000006, 0x04020004, 0x8d3e7d18, + 0x0402000a, 0x0401f022, 0x82040580, 0x00000005, + 0x04020006, 0x8d3e7d18, 0x04000004, 0x59300420, + 0x8c000500, 0x0402001a, 0x59326809, 0x59340403, + 0x81440580, 0x04020016, 0x8d3e7d00, 0x04000006, + 0x82040580, 0x00000003, 0x04020011, 0x0401fa35, + 0x0402000f, 0x0401f9f6, 0x59300000, 0x4c000000, + 0x8d3e7d06, 0x04000004, 0x0201f800, 0x001092d7, + 0x04000005, 0x0401f80f, 0x4c180000, 0x0401f964, + 0x5c003000, 0x5c026000, 0x0401f7d7, 0x41303000, + 0x59326000, 0x0401f7d4, 0x5c026000, 0x5c026800, + 0x5c025800, 0x5c03e000, 0x04000ae5, 0x1c01f000, + 0x59300800, 0x497a6000, 0x0401fac8, 0x801831c0, + 0x04020009, 0x598c0008, 0x81300580, 0x04020004, + 0x48031808, 0x48031809, 0x0401f008, 0x48071809, + 0x0401f006, 0x48043000, 0x598c0008, 0x81300580, + 0x04020002, 0x481b1808, 0x0401f2ca, 0x4d2c0000, + 0x4d300000, 0x4d340000, 0x41783000, 0x598e600b, + 0x813261c0, 0x04000013, 0x8d3e7d06, 0x04000005, + 0x59326809, 0x59340200, 0x8c00050e, 0x0402000a, + 0x0401f9bf, 0x59300000, 0x4c000000, 0x0401f853, + 0x4c180000, 0x0401f932, 0x5c003000, 0x5c026000, + 0x0401f7f0, 0x41303000, 0x59326000, 0x0401f7ed, + 0x0201f800, 0x00104773, 0x5c026800, 0x5c026000, + 0x5c025800, 0x1c01f000, 0x4933c857, 0x4c5c0000, + 0x813261c0, 0x02000800, 0x001005d8, 0x41300000, + 0x598cb80b, 0x41783000, 0x805cb9c0, 0x0400000f, + 0x805c0d80, 0x04000004, 0x405c3000, 0x5818b800, + 0x0401f7fa, 0x0401f835, 0x598c000d, 0x81300580, + 0x02000800, 0x001070b9, 0x497a6007, 0x80000580, + 0x5c00b800, 0x1c01f000, 0x82000540, 0x00000001, + 0x5c00b800, 0x1c01f000, 0x0401fa9f, 0x4df00000, + 0x4d340000, 0x4d300000, 0x4d2c0000, 0x0201f800, + 0x00020245, 0x02020800, 0x001005d8, 0x41783000, + 0x598e600b, 0x813261c0, 0x04000014, 0x59300009, + 0x81340580, 0x0402000e, 0x8d3e7d00, 0x04000003, + 0x0401f9bc, 0x0402000a, 0x0401f97d, 0x59300000, + 0x4c000000, 0x0401f811, 0x4c180000, 0x0401f8f0, + 0x5c003000, 0x5c026000, 0x0401f7ef, 0x41303000, + 0x59326000, 0x0401f7ec, 0x0201f800, 0x0010479c, + 0x5c025800, 0x5c026000, 0x5c026800, 0x5c03e000, + 0x04000a6f, 0x1c01f000, 0x59300800, 0x497a6000, + 0x0401fa52, 0x801831c0, 0x04020009, 0x598c000a, + 0x81300580, 0x04020004, 0x4803180a, 0x4803180b, + 0x0401f008, 0x4807180b, 0x0401f006, 0x48043000, + 0x598c000a, 0x81300580, 0x04020002, 0x481b180a, + 0x0401f254, 0x0401fa64, 0x4df00000, 0x4d300000, + 0x598e6005, 0x813261c0, 0x04000020, 0x59300000, + 0x4c000000, 0x59300c06, 0x82040580, 0x00000011, + 0x04020007, 0x833c0500, 0x00001800, 0x04000015, + 0x8d3e7d16, 0x04020013, 0x0401f009, 0x82040580, + 0x00000004, 0x04020006, 0x8d3e7d16, 0x04000004, + 0x59300420, 0x8c000500, 0x0402000a, 0x0201f800, + 0x0010914e, 0x02000800, 0x0010801c, 0x0201f800, + 0x00109326, 0x0201f800, 0x0002077d, 0x0401fa31, + 0x5c026000, 0x0401f7e0, 0x497b1805, 0x497b1804, + 0x5c026000, 0x5c03e000, 0x04000a31, 0x1c01f000, + 0x4933c857, 0x4c5c0000, 0x4c600000, 0x813261c0, + 0x02000800, 0x001005d8, 0x41300000, 0x598cb805, + 0x405cc000, 0x805cb9c0, 0x04000025, 0x805c0d80, + 0x04000004, 0x405cc000, 0x5860b800, 0x0401f7fa, + 0x598c000d, 0x81300580, 0x02000800, 0x001070b9, + 0x0401fa02, 0x598c0005, 0x805c0580, 0x04020009, + 0x585c0000, 0x48031805, 0x4978b800, 0x598c0004, + 0x805c0580, 0x0402000d, 0x497b1804, 0x0401f00b, + 0x598c0004, 0x805c0580, 0x04020005, 0x48631804, + 0x4978b800, 0x4978c000, 0x0401f004, 0x585c0000, + 0x4800c000, 0x4978b800, 0x0401f9fe, 0x80000580, + 0x5c00c000, 0x5c00b800, 0x1c01f000, 0x82000540, + 0x00000001, 0x5c00c000, 0x5c00b800, 0x1c01f000, + 0x4933c857, 0x0401fa04, 0x4df00000, 0x4d2c0000, + 0x4d340000, 0x4d300000, 0x4c5c0000, 0x4178b800, + 0x8d3e7d18, 0x0400000d, 0x8d3e7d16, 0x0402000b, + 0x0201f800, 0x00109037, 0x04000008, 0x0201f800, + 0x00109597, 0x04020005, 0x592c0207, 0x492fc857, + 0x8200bd00, 0x0000000f, 0x41783000, 0x598e6005, + 0x813261c0, 0x04000029, 0x59326809, 0x813669c0, + 0x04000023, 0x59340403, 0x81440580, 0x04020020, + 0x59300c06, 0x82040580, 0x00000011, 0x0400001a, + 0x82040580, 0x00000004, 0x04020004, 0x59300420, + 0x8c000500, 0x04020016, 0x0201f800, 0x00109037, + 0x04000008, 0x0201f800, 0x00109597, 0x04020005, + 0x59300403, 0x82000580, 0x00000043, 0x0400000c, + 0x0401f8c3, 0x59300000, 0x4c000000, 0x0401f812, + 0x4c180000, 0x0401f836, 0x5c003000, 0x5c026000, + 0x0401f7dc, 0x805cb9c0, 0x040207ec, 0x41303000, + 0x59326000, 0x0401f7d7, 0x5c00b800, 0x5c026000, + 0x5c026800, 0x5c025800, 0x5c03e000, 0x040009b4, + 0x1c01f000, 0x59300800, 0x497a6000, 0x0401f997, + 0x801831c0, 0x04020009, 0x598c0004, 0x81300580, + 0x04020004, 0x48031804, 0x48031805, 0x0401f008, + 0x48071805, 0x0401f006, 0x48043000, 0x598c0004, + 0x81300580, 0x04020002, 0x481b1804, 0x0401f199, + 0x4943c857, 0x0401f9a8, 0x4df00000, 0x0401fe34, + 0x0401fecb, 0x5c03e000, 0x04000999, 0x1c01f000, + 0x4947c857, 0x0401f9a0, 0x4df00000, 0x4d3c0000, + 0x853e7d00, 0x0401fe75, 0x0401fefc, 0x5c027800, + 0x5c03e000, 0x0400098e, 0x1c01f000, 0x5c000000, + 0x4c000000, 0x4803c857, 0x4d340000, 0x4d2c0000, + 0x59326809, 0x59325808, 0x59300406, 0x82000c80, + 0x00000012, 0x02021800, 0x001005d8, 0x4933c857, + 0x4943c857, 0x493fc857, 0x4803c857, 0x0c01f804, + 0x5c025800, 0x5c026800, 0x1c01f000, 0x00106ae5, + 0x00106ae7, 0x00106af1, 0x00106b0b, 0x00106ae7, + 0x00106afb, 0x00106b23, 0x00106ae5, 0x00106ae5, + 0x00106b36, 0x00106b2d, 0x00106ae5, 0x00106ae5, + 0x00106ae5, 0x00106ae5, 0x00106ae5, 0x00106b3c, + 0x00106b3c, 0x0201f800, 0x001005d8, 0x0201f800, + 0x00109134, 0x02000800, 0x00102074, 0x0201f800, + 0x00109326, 0x0201f800, 0x0010801c, 0x0201f000, + 0x00107911, 0x812e59c0, 0x02020800, 0x001005d8, + 0x5930021d, 0x82000580, 0x00000003, 0x02000800, + 0x0010912a, 0x0201f000, 0x00107911, 0x0201f800, + 0x00109037, 0x02000000, 0x00107911, 0x592c1204, + 0x82081500, 0x000000ff, 0x82080580, 0x00000055, + 0x02020800, 0x001005d8, 0x49425a06, 0x0201f800, + 0x000202da, 0x0201f000, 0x00107911, 0x59300004, + 0x8400055c, 0x48026004, 0x59300007, 0x8c000500, + 0x02020800, 0x00100e99, 0x0201f800, 0x00109037, + 0x0400000d, 0x4a025a04, 0x00000103, 0x49425a06, + 0x497a5c09, 0x0201f800, 0x001091c6, 0x0201f800, + 0x0010a693, 0x0201f800, 0x000202da, 0x0201f800, + 0x0010912a, 0x0201f000, 0x00107911, 0x59300007, + 0x8c000500, 0x02020800, 0x00100e99, 0x0201f800, + 0x00109037, 0x02020800, 0x0010a3ef, 0x0201f000, + 0x00107911, 0x0201f800, 0x00109037, 0x04000005, + 0x49425a06, 0x497a5c09, 0x0201f800, 0x000202da, + 0x0201f000, 0x00107911, 0x0201f800, 0x00109037, + 0x02020800, 0x0010664f, 0x0201f000, 0x00107911, + 0x0201f800, 0x00109037, 0x04000004, 0x49425a06, + 0x0201f800, 0x000202da, 0x59325817, 0x0201f800, + 0x001007fd, 0x0201f000, 0x00107911, 0x598c000d, + 0x81300580, 0x04000003, 0x497a6007, 0x1c01f000, + 0x59c40004, 0x82000500, 0x0000000c, 0x04000005, + 0x4a038804, 0x0000000c, 0x497b2807, 0x0401f00a, + 0x0401facd, 0x59300403, 0x82000d80, 0x00000040, + 0x04000004, 0x82000580, 0x00000042, 0x04020002, + 0x497a6007, 0x0201f800, 0x001070b9, 0x80000580, + 0x1c01f000, 0x59300804, 0x8c040d3e, 0x04020004, + 0x82000540, 0x00000001, 0x0401f005, 0x4933c857, + 0x84040d3e, 0x48066004, 0x80000580, 0x1c01f000, + 0x59300804, 0x8c040d20, 0x04020004, 0x82000540, + 0x00000001, 0x1c01f000, 0x4933c857, 0x4d380000, + 0x59300804, 0x84040d20, 0x48066004, 0x42027000, + 0x00000049, 0x59300203, 0x82000580, 0x00000003, + 0x04000003, 0x42027000, 0x00000013, 0x0201f800, + 0x000207a1, 0x80000580, 0x5c027000, 0x1c01f000, + 0x59300017, 0x81480580, 0x04020003, 0x59300018, + 0x814c0580, 0x1c01f000, 0x4d2c0000, 0x4d300000, + 0x0401f8c9, 0x4df00000, 0x0201f800, 0x00106062, + 0x59900001, 0x82000500, 0x00000003, 0x0c01f001, + 0x00106bba, 0x00106b9a, 0x00106b98, 0x00106b98, + 0x0201f800, 0x001005d8, 0x59926004, 0x0401f88e, + 0x813261c0, 0x0400001d, 0x59300004, 0x8c000516, + 0x04000004, 0x59325808, 0x497a5808, 0x497a5809, + 0x0401f88e, 0x59300001, 0x800001c0, 0x0400000e, + 0x497a6001, 0x42003000, 0x0000bf2e, 0x58180801, + 0x800409c0, 0x04020004, 0x48003001, 0x48003000, + 0x0401f00a, 0x58180800, 0x48000800, 0x48003000, + 0x0401f006, 0x59300809, 0x800409c0, 0x02000800, + 0x001005d8, 0x4978080c, 0x5c03e000, 0x04000890, + 0x5c026000, 0x5c025800, 0x1c01f000, 0x4d300000, + 0x497b2807, 0x0401f894, 0x4df00000, 0x598c0000, + 0x82000500, 0x00000007, 0x4803c857, 0x0c01f001, + 0x00106bef, 0x00106bd2, 0x00106bdb, 0x00106bdf, + 0x00106bea, 0x00106bef, 0x00106bd0, 0x00106bd0, + 0x0201f800, 0x001005d8, 0x598c000d, 0x80026540, + 0x04000004, 0x0401f81e, 0x02020800, 0x001005d8, + 0x0201f800, 0x001070b9, 0x0401f015, 0x0401f827, + 0x0201f800, 0x001070b9, 0x0401f011, 0x598c000d, + 0x80026540, 0x0400000e, 0x0401f838, 0x04000004, + 0x0401f80f, 0x04000002, 0x0401f81c, 0x0201f800, + 0x001070b9, 0x0401f006, 0x0401f830, 0x02020800, + 0x001005d8, 0x0201f800, 0x001070b9, 0x5c03e000, + 0x0400085b, 0x5c026000, 0x1c01f000, 0x598c0009, + 0x81300580, 0x0402000c, 0x0401f84e, 0x0401f83b, + 0x59300000, 0x800001c0, 0x04000004, 0x48031809, + 0x497a6000, 0x0401f003, 0x497b1809, 0x497b1808, + 0x80000580, 0x1c01f000, 0x4d2c0000, 0x59300406, + 0x82000580, 0x00000003, 0x04020012, 0x598c000b, + 0x81300580, 0x0402000f, 0x0401f83a, 0x59325808, + 0x497a5808, 0x497a5809, 0x0401f824, 0x59300000, + 0x800001c0, 0x04000004, 0x4803180b, 0x497a6000, + 0x0401f003, 0x497b180a, 0x497b180b, 0x80000580, + 0x5c025800, 0x1c01f000, 0x598c0005, 0x81300580, + 0x0402000c, 0x0401f827, 0x0401f814, 0x59300000, + 0x800001c0, 0x04000004, 0x48031805, 0x497a6000, + 0x0401f003, 0x497b1805, 0x497b1804, 0x80000580, + 0x1c01f000, 0x4a032001, 0x00000000, 0x497b2004, + 0x497b2005, 0x59900006, 0x82000500, 0x0000ffff, + 0x48032006, 0x1c01f000, 0x4c040000, 0x59300004, + 0x82000500, 0x7ffeffff, 0x48026004, 0x59bc00e4, + 0x8c000514, 0x04000009, 0x42000800, 0x0000bf00, + 0x58040012, 0x81300580, 0x04020004, 0x49780812, + 0x4a0378e4, 0x00000800, 0x5c000800, 0x1c01f000, + 0x4803c856, 0x598c000c, 0x80000540, 0x04000003, + 0x80000040, 0x4803180c, 0x1c01f000, 0x59bc00ea, + 0x82000500, 0x00000007, 0x82000580, 0x00000003, + 0x04020004, 0x4803c856, 0x4a0378e8, 0x00000001, + 0x1c01f000, 0x59bc00ea, 0x82000500, 0x00000007, + 0x82000580, 0x00000001, 0x04020011, 0x4803c856, + 0x42000800, 0x00000000, 0x0401f80e, 0x42000800, + 0x00001000, 0x59bc00ea, 0x82000500, 0x00000007, + 0x82000580, 0x00000003, 0x04000005, 0x80040840, + 0x040207f9, 0x0201f800, 0x001005d8, 0x1c01f000, + 0x59bc00ea, 0x82000500, 0x00000007, 0x82000580, + 0x00000001, 0x02020800, 0x001005d8, 0x59bc00ea, + 0x8c000516, 0x040207fe, 0x480778e1, 0x1c01f000, + 0x59bc00ea, 0x8c000516, 0x040207fe, 0x480778e1, + 0x59bc00ea, 0x8c000516, 0x040207fe, 0x480b78e1, + 0x1c01f000, 0x82000d00, 0x80000018, 0x02020800, + 0x001005d0, 0x0201f800, 0x001005d8, 0x00106c97, + 0x00106d3b, 0x00106d55, 0x00106c97, 0x00106c99, + 0x00106cba, 0x00106cd9, 0x00106d0d, 0x00106c97, + 0x00106d39, 0x00106c97, 0x00106c97, 0x00106c97, + 0x00106c97, 0x00106c97, 0x00106c97, 0x0201f800, + 0x001005d8, 0x4d300000, 0x4d900000, 0x4dd00000, + 0x4da40000, 0x4d140000, 0x0201f800, 0x001070d8, + 0x59bc00ea, 0x8c000510, 0x040007fe, 0x59be60e0, + 0x59300004, 0x8c000520, 0x04000011, 0x82000500, + 0xfffefeff, 0x48026004, 0x4a026203, 0x00000003, + 0x0401ffa9, 0x0201f800, 0x00100fd0, 0x5c022800, + 0x5c034800, 0x5c03a000, 0x5c032000, 0x5c026000, + 0x4a0378e4, 0x00000008, 0x0401f795, 0x84000510, + 0x48026004, 0x0401f7f6, 0x4d300000, 0x4d900000, + 0x4dd00000, 0x4da40000, 0x4d140000, 0x0201f800, + 0x001070d8, 0x59bc00ea, 0x8c000510, 0x040007fe, + 0x59be60e0, 0x59300004, 0x8c000520, 0x0400000f, + 0x82000500, 0xfffefeff, 0x48026004, 0x0401ff8a, + 0x0201f800, 0x0010100e, 0x5c022800, 0x5c034800, + 0x5c03a000, 0x5c032000, 0x5c026000, 0x4a0378e4, + 0x00000008, 0x0401f776, 0x84000510, 0x48026004, + 0x0401f7f6, 0x4d300000, 0x4d2c0000, 0x4d340000, + 0x4da40000, 0x4cd00000, 0x59bc00ea, 0x8c000510, + 0x040007fe, 0x59be60e0, 0x813261c0, 0x02000800, + 0x001005d8, 0x59300004, 0x8c000520, 0x0400001d, + 0x82000500, 0xfffefeff, 0x48026004, 0x59326809, + 0x42034800, 0x0010b544, 0x04011000, 0x4a03c840, + 0x0010b54b, 0x4a03c842, 0x00000012, 0x04011000, + 0x4a03c840, 0x0010b55d, 0x4a03c842, 0x000000ff, + 0x04011000, 0x4a03c840, 0x0010b65c, 0x4a03c842, + 0x000000ff, 0x0401fbf2, 0x5c01a000, 0x5c034800, + 0x5c026800, 0x5c025800, 0x5c026000, 0x1c01f000, + 0x84000510, 0x48026004, 0x5c01a000, 0x5c034800, + 0x5c026800, 0x5c025800, 0x5c026000, 0x1c01f000, + 0x1c01f000, 0x4d300000, 0x4d2c0000, 0x4d340000, + 0x4cd00000, 0x4d900000, 0x4dd00000, 0x4da40000, + 0x4d140000, 0x0401fbc3, 0x59bc00ea, 0x8c000510, + 0x040007fe, 0x59be60e0, 0x813261c0, 0x02000800, + 0x001005d8, 0x59300004, 0x8c000520, 0x0400000f, + 0x82000500, 0xfffefeff, 0x48026004, 0x0201f800, + 0x0010783a, 0x5c022800, 0x5c034800, 0x5c03a000, + 0x5c032000, 0x5c01a000, 0x5c026800, 0x5c025800, + 0x5c026000, 0x1c01f000, 0x84000510, 0x48026004, + 0x5c022800, 0x5c034800, 0x5c03a000, 0x5c032000, + 0x5c01a000, 0x5c026800, 0x5c025800, 0x5c026000, + 0x1c01f000, 0x0201f800, 0x001005d8, 0x4d300000, + 0x4d380000, 0x42000000, 0x0010b8c4, 0x0201f800, + 0x0010aa47, 0x0401ff14, 0x598e600d, 0x59c40004, + 0x8c000506, 0x04000004, 0x0401f8db, 0x4a038804, + 0x00000008, 0x813261c0, 0x04000006, 0x0401fb87, + 0x42027000, 0x00000014, 0x0201f800, 0x000207a1, + 0x4a0378e4, 0x00000002, 0x5c027000, 0x5c026000, + 0x0401f6f7, 0x4d180000, 0x4d300000, 0x4d380000, + 0x4d900000, 0x4dd00000, 0x4da40000, 0x4d140000, + 0x0401fef9, 0x417a3000, 0x59c40804, 0x83180400, + 0x0010709f, 0x50000000, 0x80040500, 0x0400001b, + 0x42000000, 0x0010b8c5, 0x0201f800, 0x0010aa47, + 0x0401fb70, 0x59926004, 0x0401f859, 0x83180400, + 0x0010709f, 0x50000000, 0x48038804, 0x813261c0, + 0x0400000a, 0x59300004, 0x8c00050c, 0x04020003, + 0x4a026203, 0x00000003, 0x42027000, 0x0000004a, + 0x0201f800, 0x000207a1, 0x59c40004, 0x82000500, + 0x00f80000, 0x04000005, 0x811a3000, 0x83180480, + 0x00000005, 0x040017dd, 0x4a0378e4, 0x00000008, + 0x5c022800, 0x5c034800, 0x5c03a000, 0x5c032000, + 0x5c027000, 0x5c026000, 0x5c023000, 0x0401f6c0, + 0x4d2c0000, 0x4d340000, 0x59326809, 0x598c0800, + 0x82040580, 0x00000004, 0x04020004, 0x838c1400, + 0x00000005, 0x0401f00c, 0x82040580, 0x00000001, + 0x04020004, 0x838c1400, 0x00000009, 0x0401f006, + 0x82040580, 0x00000002, 0x04020022, 0x838c1400, + 0x0000000b, 0x41306800, 0x58340000, 0x80007d40, + 0x0400001c, 0x583c0009, 0x81340580, 0x04020006, + 0x403c6800, 0x583c0000, 0x80007d40, 0x040207fa, + 0x0401f014, 0x4933c857, 0x483fc857, 0x583c0000, + 0x48006800, 0x49307800, 0x443c1000, 0x80000580, + 0x4803180d, 0x4803180f, 0x598c0000, 0x82000580, + 0x00000003, 0x04000003, 0x4a031800, 0x00000000, + 0x80000580, 0x5c026800, 0x5c025800, 0x1c01f000, + 0x82000540, 0x00000001, 0x0401f7fb, 0x491bc857, + 0x59c80840, 0x82040540, 0x00000010, 0x48039040, + 0x59c41008, 0x82080500, 0xffffff7f, 0x48038808, + 0x4c040000, 0x4c080000, 0x0401fabb, 0x04020007, + 0x0401fabf, 0x04000022, 0x48038804, 0x0201f800, + 0x0010107a, 0x0401f042, 0x4a038803, 0x00000008, + 0x59c40003, 0x82000500, 0x00000003, 0x040007fd, + 0x8c000502, 0x04020007, 0x0401fab1, 0x04000014, + 0x48038804, 0x0201f800, 0x0010107a, 0x0401f034, + 0x59c80040, 0x8400056a, 0x48039040, 0x59c80040, + 0x8c00052a, 0x040207fe, 0x59c40005, 0x82000500, + 0xc0000000, 0x04000006, 0x59c400a3, 0x84000540, + 0x480388a3, 0x4a038805, 0xc0000000, 0x0201f800, + 0x0010101d, 0x4a03a005, 0x30000000, 0x59d00006, + 0x4a03a005, 0x30000000, 0x59900006, 0x82000500, + 0xffff0000, 0x48032006, 0x59d00005, 0x8c000504, + 0x040207fe, 0x42000800, 0x00007600, 0x83180540, + 0x60000000, 0x480008a1, 0x811800dc, 0x59c80840, + 0x80040540, 0x48039040, 0x82000540, 0x00003000, + 0x48039040, 0x59c80040, 0x82000500, 0x00003000, + 0x040207fd, 0x0201f800, 0x00101068, 0x83180400, + 0x0010709f, 0x50000000, 0x48038804, 0x80000580, + 0x4df00000, 0x0201f800, 0x00106062, 0x5c03e000, + 0x5c001000, 0x5c000800, 0x480b8808, 0x48079040, + 0x1c01f000, 0x4803c856, 0x59c80840, 0x82040540, + 0x00000010, 0x48039040, 0x59c41008, 0x82080500, + 0xffffff7f, 0x48038808, 0x4c040000, 0x4c080000, + 0x59c40004, 0x82000500, 0x00000003, 0x04020010, + 0x59c40004, 0x82000500, 0x0000000c, 0x04000005, + 0x4a038804, 0x0000000c, 0x8c000504, 0x0401f025, + 0x59c80040, 0x8400056e, 0x48039040, 0x59c80040, + 0x8c00052e, 0x040207fe, 0x0401f01e, 0x4a038803, + 0x00000008, 0x59c40003, 0x82000500, 0x00000003, + 0x040007fd, 0x8c000502, 0x04020006, 0x59c40004, + 0x4a038804, 0x0000000c, 0x8c000504, 0x0401f011, + 0x59c80040, 0x8400056a, 0x48039040, 0x59c80040, + 0x8c00052a, 0x040207fe, 0x59c40005, 0x82000500, + 0xc0000000, 0x04000007, 0x59c400a3, 0x84000540, + 0x480388a3, 0x4a038805, 0xc0000000, 0x80000580, + 0x497b2807, 0x5c001000, 0x5c000800, 0x480b8808, + 0x48079040, 0x1c01f000, 0x4933c857, 0x4d900000, + 0x4dd00000, 0x4da40000, 0x4d140000, 0x0401fdee, + 0x4df00000, 0x0401fa6f, 0x59900004, 0x800001c0, + 0x04000011, 0x81300580, 0x0402000f, 0x59300004, + 0x84000520, 0x48026004, 0x0401ff51, 0x04020009, + 0x5c03e000, 0x04000dd6, 0x80000580, 0x5c022800, + 0x5c034800, 0x5c03a000, 0x5c032000, 0x1c01f000, + 0x0401fd0e, 0x42027000, 0x00000049, 0x59300004, + 0x84000520, 0x48026004, 0x8c00050c, 0x02020800, + 0x000207a1, 0x5c03e000, 0x04000dc5, 0x82000540, + 0x00000001, 0x5c022800, 0x5c034800, 0x5c03a000, + 0x5c032000, 0x1c01f000, 0x4933c857, 0x0401fdc6, + 0x4df00000, 0x598c000d, 0x80026540, 0x04000012, + 0x59300004, 0x84000520, 0x48026004, 0x0401ff8a, + 0x04000017, 0x0401fd26, 0x42027000, 0x00000013, + 0x59300004, 0x8c00050c, 0x02020800, 0x000207a1, + 0x5c03e000, 0x04000daa, 0x82000540, 0x00000001, + 0x1c01f000, 0x836c1580, 0x00000001, 0x040007f9, + 0x836c1580, 0x00000004, 0x040007f6, 0x42001000, + 0x00104148, 0x0201f800, 0x00105f90, 0x5c03e000, + 0x04000d9b, 0x80000580, 0x1c01f000, 0x4d300000, + 0x4d180000, 0x4d3c0000, 0x0401fd9f, 0x4df00000, + 0x4a0378e4, 0x0000000f, 0x0401f9ff, 0x417a3000, + 0x59926004, 0x813261c0, 0x04000010, 0x417a7800, + 0x0201f800, 0x001048d9, 0x0400000a, 0x59300c06, + 0x82040580, 0x00000003, 0x04000004, 0x82040580, + 0x00000006, 0x04020003, 0x42027800, 0x00000002, + 0x0201f800, 0x00108be3, 0x811a3000, 0x83180480, + 0x00000005, 0x040017eb, 0x42000800, 0x00000040, + 0x0201f800, 0x00101345, 0x4a0378e4, 0x0000000a, + 0x5c03e000, 0x04000d72, 0x5c027800, 0x5c023000, + 0x5c026000, 0x1c01f000, 0x4803c856, 0x4d300000, + 0x0401fd75, 0x4df00000, 0x59c80840, 0x82040540, + 0x00000010, 0x48039040, 0x59c41008, 0x82080500, + 0xffffff7f, 0x48038808, 0x4c040000, 0x4c080000, + 0x42001000, 0x00000003, 0x0401f9c2, 0x598e600d, + 0x813261c0, 0x04020f9d, 0x040009c7, 0x497b2807, + 0x0401f80a, 0x5c001000, 0x5c000800, 0x480b8808, + 0x84040d74, 0x48079040, 0x5c03e000, 0x04000d50, + 0x5c026000, 0x1c01f000, 0x4d380000, 0x4d180000, + 0x4d300000, 0x4d900000, 0x4dd00000, 0x4da40000, + 0x4d140000, 0x59c41004, 0x480bc857, 0x82080500, + 0x00003ff0, 0x04000025, 0x417a3000, 0x4c080000, + 0x0201f800, 0x00106062, 0x5c001000, 0x82080500, + 0x00000210, 0x04020004, 0x811a3000, 0x80081102, + 0x0401f7f7, 0x0401f9c3, 0x59926004, 0x4933c857, + 0x813261c0, 0x04020005, 0x59c400a3, 0x8c00051a, + 0x02000800, 0x001005d8, 0x0401fea5, 0x04000009, + 0x0401fc6a, 0x42027000, 0x00000049, 0x59300004, + 0x8c00050c, 0x02020800, 0x000207a1, 0x0401f007, + 0x42027000, 0x0000004a, 0x4a026203, 0x00000003, + 0x0201f800, 0x000207a1, 0x5c022800, 0x5c034800, + 0x5c03a000, 0x5c032000, 0x5c026000, 0x5c023000, + 0x5c027000, 0x1c01f000, 0x4d300000, 0x4d180000, + 0x4d900000, 0x0401fd1c, 0x42001000, 0x00000000, + 0x598c0000, 0x82000580, 0x00000005, 0x04000971, + 0x417a3000, 0x811b20c8, 0x83932400, 0x0000bf32, + 0x59900001, 0x82000580, 0x00000001, 0x0402000d, + 0x42000800, 0x000007d0, 0x59926004, 0x59300011, + 0x82000500, 0xfff00000, 0x80000540, 0x04000003, + 0x42000800, 0x00001b58, 0x0201f800, 0x00106054, + 0x811a3000, 0x83180480, 0x00000005, 0x040017ea, + 0x59c81040, 0x84081534, 0x480b9040, 0x0401fcf0, + 0x5c032000, 0x5c023000, 0x5c026000, 0x1c01f000, + 0x4933c857, 0x4d900000, 0x4dd00000, 0x4da40000, + 0x4d140000, 0x4d380000, 0x0401fcef, 0x4df00000, + 0x59300004, 0x8c00053e, 0x04020007, 0x8c000520, + 0x04000025, 0x0201f800, 0x00106b6c, 0x04000022, + 0x0401f02a, 0x598c000d, 0x81300580, 0x04000011, + 0x0201f800, 0x00108cd6, 0x04020024, 0x0401f918, + 0x04000022, 0x48038804, 0x0401f95e, 0x0201f800, + 0x0010107a, 0x0401fc0d, 0x42027000, 0x00000049, + 0x59300004, 0x8c00050c, 0x0402000d, 0x0401f00e, + 0x59c40004, 0x8c000504, 0x04000014, 0x4a038804, + 0x00000004, 0x0401fc36, 0x42027000, 0x00000013, + 0x59300004, 0x8c00050c, 0x04000003, 0x0201f800, + 0x000207a1, 0x5c03e000, 0x04000cb9, 0x5c027000, + 0x5c022800, 0x5c034800, 0x5c03a000, 0x5c032000, + 0x80000580, 0x1c01f000, 0x5c03e000, 0x04000cb0, + 0x5c027000, 0x5c022800, 0x5c034800, 0x5c03a000, + 0x5c032000, 0x82000540, 0x00000001, 0x1c01f000, + 0x497b2807, 0x0401fcb0, 0x59c400af, 0x800001c0, + 0x04020004, 0x0401fca2, 0x0201f000, 0x001014fb, + 0x598c000f, 0x82001480, 0x00000002, 0x04021007, + 0x80000000, 0x4803180f, 0x80000580, 0x0201f800, + 0x0010604d, 0x0400000e, 0x0401fed8, 0x0402000c, + 0x0401fdd4, 0x0400000a, 0x0201f800, 0x0010a9c7, + 0x0401f916, 0x4d380000, 0x42027000, 0x00000014, + 0x0201f800, 0x000207a1, 0x5c027000, 0x0401fc88, + 0x0201f000, 0x001014fb, 0x4d900000, 0x4dd00000, + 0x4da40000, 0x4d140000, 0x4d300000, 0x0201f800, + 0x00106062, 0x0401fc88, 0x59c400af, 0x800001c0, + 0x04000027, 0x0401f907, 0x59926004, 0x4933c857, + 0x59300004, 0x8c000516, 0x0400000b, 0x0401fe8b, + 0x0402001f, 0x0201f800, 0x00106b8a, 0x0401fc70, + 0x42000800, 0x80000804, 0x0201f800, 0x00106721, + 0x0401f017, 0x42001800, 0x00007530, 0x0401f8c1, + 0x04020004, 0x0201f800, 0x00106052, 0x0401f010, + 0x0401fe7a, 0x0402000e, 0x0201f800, 0x0010a9c7, + 0x59300004, 0x8c00050c, 0x04020003, 0x4a026203, + 0x00000003, 0x4d380000, 0x42027000, 0x0000004a, + 0x0201f800, 0x000207a1, 0x5c027000, 0x0401fc54, + 0x5c026000, 0x5c022800, 0x5c034800, 0x5c03a000, + 0x5c032000, 0x0201f000, 0x001014fb, 0x4d900000, + 0x4dd00000, 0x4da40000, 0x4d140000, 0x4d300000, + 0x4d2c0000, 0x0401fc50, 0x0401f8d2, 0x59926004, + 0x4933c857, 0x0401f880, 0x04000016, 0x0201f800, + 0x00106062, 0x813261c0, 0x04000034, 0x59325808, + 0x812e59c0, 0x02000800, 0x001005d8, 0x0201f800, + 0x0010513b, 0x0402001d, 0x592c0208, 0x84000550, + 0x48025a08, 0x0201f800, 0x00105258, 0x04020027, + 0x592c0208, 0x84000510, 0x48025a08, 0x0401f023, + 0x0201f800, 0x00106052, 0x0401f020, 0x0201f800, + 0x0010a9c7, 0x0401fd9e, 0x592c0208, 0x84000550, + 0x48025a08, 0x4d380000, 0x42027000, 0x0000004a, + 0x4a026203, 0x00000003, 0x0201f800, 0x000207a1, + 0x5c027000, 0x0401f011, 0x59900006, 0x82000500, + 0xffff0000, 0x040207ee, 0x59c408af, 0x82040480, + 0x000003e8, 0x040217ea, 0x59900006, 0x82000400, + 0x00010000, 0x48032006, 0x0201f800, 0x00106052, + 0x0201f800, 0x0010411d, 0x5c025800, 0x5c026000, + 0x5c022800, 0x5c034800, 0x5c03a000, 0x5c032000, + 0x0401f403, 0x4d300000, 0x4d2c0000, 0x0401fc0a, + 0x598e600d, 0x4933c857, 0x59c41004, 0x8c081500, + 0x04000007, 0x0201f800, 0x0010513b, 0x04020007, + 0x0201f800, 0x00105258, 0x0402002f, 0x0201f800, + 0x0010604d, 0x0401f02c, 0x598c000f, 0x80000540, + 0x04020011, 0x59c408af, 0x82040480, 0x000003e8, + 0x0402100d, 0x598c080f, 0x80040800, 0x4807180f, + 0x0201f800, 0x0010604d, 0x42000000, 0x0010b852, + 0x0201f800, 0x0010aa47, 0x0201f800, 0x0010411d, + 0x0401f019, 0x0401fdb4, 0x813261c0, 0x04020003, + 0x0401f849, 0x0401f014, 0x0201f800, 0x0010a9c7, + 0x59300406, 0x82000580, 0x00000003, 0x04020007, + 0x59325808, 0x812e59c0, 0x04000004, 0x592c0208, + 0x84000550, 0x48025a08, 0x0401f854, 0x4d380000, + 0x42027000, 0x00000014, 0x0201f800, 0x000207a1, + 0x5c027000, 0x5c025800, 0x5c026000, 0x0201f000, + 0x00106c4b, 0x59c40804, 0x83180400, 0x00107095, + 0x50000000, 0x80040500, 0x1c01f000, 0x59c40804, + 0x83180400, 0x0010709a, 0x50000000, 0x80040500, + 0x1c01f000, 0x00000210, 0x00000420, 0x00000840, + 0x00001080, 0x00002100, 0x00004000, 0x00008000, + 0x00010000, 0x00020000, 0x00040000, 0x00080000, + 0x00100000, 0x00200000, 0x00400000, 0x00800000, + 0x59900806, 0x80040120, 0x800c0480, 0x04021004, + 0x82000540, 0x00000001, 0x0401f005, 0x82040c00, + 0x00010000, 0x48072006, 0x80000580, 0x1c01f000, + 0x480bc857, 0x0201f800, 0x00106c55, 0x4df00000, + 0x480b1800, 0x5c03e000, 0x02000800, 0x00106c4b, + 0x1c01f000, 0x4803c856, 0x0201f800, 0x00106c55, + 0x4df00000, 0x497b180d, 0x497b1803, 0x497b180e, + 0x497b180f, 0x497b1810, 0x598c0000, 0x82000580, + 0x00000003, 0x04000009, 0x836c0580, 0x00000002, + 0x04020004, 0x4a031800, 0x00000005, 0x0401f003, + 0x4a031800, 0x00000000, 0x5c03e000, 0x02000800, + 0x00106c4b, 0x1c01f000, 0x59300004, 0x8c00050c, + 0x04020003, 0x4a026203, 0x00000001, 0x1c01f000, + 0x83180480, 0x00000005, 0x02021800, 0x001005d8, + 0x491bc857, 0x811b20c8, 0x83932400, 0x0000bf32, + 0x811ba0ca, 0x83d3a400, 0x00007600, 0x83180400, + 0x001070ea, 0x50034800, 0x811a28c2, 0x83162c00, + 0x00006100, 0x1c01f000, 0x0010b75b, 0x0010b772, + 0x0010b789, 0x0010b7a0, 0x0010b7b7, 0x4933c857, + 0x59300406, 0x82000c80, 0x00000012, 0x04021016, + 0x4803c857, 0x04011000, 0x0c01f001, 0x00107109, + 0x00107198, 0x001074d1, 0x00107556, 0x00107198, + 0x001074d1, 0x00107556, 0x00107109, 0x00107198, + 0x00107109, 0x00107109, 0x00107109, 0x00107109, + 0x00107109, 0x00107109, 0x00107109, 0x0010710f, + 0x0010710f, 0x0201f800, 0x00106c55, 0x0201f800, + 0x00106bbf, 0x0201f000, 0x00106c4b, 0x42001000, + 0x0010b7f6, 0x50081000, 0x4930100c, 0x58080002, + 0x82000580, 0x00000100, 0x04020032, 0x59325808, + 0x812e59c0, 0x02000800, 0x001005d8, 0x59326809, + 0x813669c0, 0x04000019, 0x592c040b, 0x82000500, + 0x0000e000, 0x04000003, 0x0401fba8, 0x0401f002, + 0x0401fb98, 0x42001000, 0x0010b7f6, 0x50081000, + 0x4930100b, 0x492c100a, 0x82d00400, 0x00000006, + 0x48001003, 0x592c000d, 0x80000104, 0x48001004, + 0x592c000e, 0x48001007, 0x592c000f, 0x48001008, + 0x0201f000, 0x00100858, 0x42026800, 0x0010be0d, + 0x592c080a, 0x48066802, 0x82040500, 0x00ffff00, + 0x04000007, 0x497a6a12, 0x59a81010, 0x82081500, + 0x00ffff00, 0x80080580, 0x040207dc, 0x82040d00, + 0x000000ff, 0x800408d0, 0x48066a12, 0x0401f7d7, + 0x1c01f000, 0x4d2c0000, 0x4d300000, 0x4c580000, + 0x4c540000, 0x4c500000, 0x5832580a, 0x812e59c0, + 0x02000800, 0x001005d8, 0x58300002, 0x4a006002, + 0x00000100, 0x82000580, 0x00000100, 0x0402001c, + 0x5830000b, 0x5832600c, 0x81300580, 0x04020010, + 0x0401f828, 0x04020010, 0x592c080d, 0x80040904, + 0x4004b000, 0x4200a000, 0x0010b54b, 0x4050a800, + 0x0201f800, 0x0010ab28, 0x42001000, 0x0000dc00, + 0x0201f800, 0x001078bc, 0x0401f003, 0x0401f819, + 0x04000fa3, 0x5c00a000, 0x5c00a800, 0x5c00b000, + 0x5c026000, 0x5c025800, 0x1c01f000, 0x5830000b, + 0x5832600c, 0x81300580, 0x040207f5, 0x0401f80d, + 0x040207f5, 0x0201f800, 0x001068d3, 0x02020800, + 0x001005d8, 0x4a025a06, 0x00000002, 0x0201f800, + 0x000202da, 0x0201f800, 0x00107911, 0x0401f7ea, + 0x0201f800, 0x00106c55, 0x4df00000, 0x598c000d, + 0x81300580, 0x04020009, 0x598c0005, 0x81300580, + 0x04020006, 0x5c03e000, 0x02000800, 0x00106c4b, + 0x80000580, 0x1c01f000, 0x5c03e000, 0x02000800, + 0x00106c4b, 0x82000540, 0x00000001, 0x1c01f000, + 0x59300403, 0x82000c80, 0x00000056, 0x02021800, + 0x001005d8, 0x4803c857, 0x0c01f001, 0x00107302, + 0x0010731d, 0x0010732e, 0x00107431, 0x001073f1, + 0x001073f5, 0x00107406, 0x0010741a, 0x0010740f, + 0x0010741a, 0x00107455, 0x0010741a, 0x00107497, + 0x0010741a, 0x001074a5, 0x0010741a, 0x0010740f, + 0x0010741a, 0x001074a9, 0x001071f5, 0x001071f5, + 0x001071f5, 0x001071f5, 0x001071f5, 0x001071f5, + 0x001071f5, 0x001071f5, 0x001071f5, 0x001071f5, + 0x001071f5, 0x00107574, 0x00107593, 0x0010759d, + 0x001071f5, 0x001075b3, 0x00107406, 0x001071f5, + 0x00107406, 0x0010741a, 0x001071f5, 0x0010732e, + 0x00107431, 0x001071f5, 0x00107603, 0x0010741a, + 0x001071f5, 0x00107613, 0x0010741a, 0x001071f5, + 0x0010740f, 0x001072f3, 0x001071f7, 0x001071f5, + 0x0010762a, 0x0010765d, 0x001076d7, 0x001071f5, + 0x001076e7, 0x00107404, 0x001076da, 0x001071f5, + 0x001075bf, 0x00107700, 0x001071f5, 0x00107735, + 0x00107788, 0x001071f5, 0x0010720c, 0x00107265, + 0x00107272, 0x001071f5, 0x00107406, 0x001071f5, + 0x001072b9, 0x001072c4, 0x001071f5, 0x001071f5, + 0x00107220, 0x00107245, 0x001077c7, 0x00107808, + 0x0010782e, 0x001071f5, 0x001071f5, 0x001071f5, + 0x001077fc, 0x0201f800, 0x001005d8, 0x0401fac5, + 0x59325808, 0x592c0009, 0x4801a006, 0x592c000a, + 0x4801a007, 0x592c000b, 0x4801a008, 0x592c000c, + 0x4801a009, 0x592c000d, 0x4801a00a, 0x4979a00b, + 0x592c0809, 0x82040d00, 0x00000fff, 0x80040904, + 0x42001000, 0x0000dc00, 0x0201f000, 0x001078bc, + 0x4a026202, 0x0000ffff, 0x0401faae, 0x4d2c0000, + 0x4a01a006, 0x05000000, 0x59325808, 0x592c0009, + 0x4801a007, 0x592c000a, 0x4801a008, 0x592c000b, + 0x4801a009, 0x42000800, 0x00000004, 0x42001000, + 0x0000dc00, 0x5c025800, 0x0201f000, 0x001078bc, + 0x4c580000, 0x4c500000, 0x4c540000, 0x4d2c0000, + 0x0401fa98, 0x59325808, 0x5930040b, 0x800000c2, + 0x4200a800, 0x0010b54b, 0x592cb205, 0x832ca400, + 0x00000006, 0x0201f800, 0x0010ab17, 0x40580000, + 0x8054ac00, 0x592c0001, 0x80000540, 0x04000003, + 0x40025800, 0x0401f7f5, 0x4200a000, 0x0010b54b, + 0x4050a800, 0x5930b40b, 0x0201f800, 0x0010ab28, + 0x59300c0b, 0x42001000, 0x0000dc00, 0x5c025800, + 0x5c00a800, 0x5c00b000, 0x5c00a000, 0x0201f000, + 0x001078bc, 0x4c580000, 0x4c500000, 0x4c540000, + 0x4d2c0000, 0x42034800, 0x0010b544, 0x0401fa7f, + 0x59325808, 0x4a025805, 0x02000000, 0x592c0802, + 0x82d0ac00, 0x00000006, 0x592cb011, 0x832ca400, + 0x00000005, 0x0201f800, 0x0010ab17, 0x40580000, + 0x8054ac00, 0x592e5801, 0x41780000, 0x812e5d40, + 0x040207f6, 0x42001000, 0x0000dc00, 0x5c025800, + 0x5c00a800, 0x5c00b000, 0x5c00a000, 0x0201f000, + 0x001078bc, 0x0401fa57, 0x4a01a006, 0x78000000, + 0x5930001c, 0x840001c0, 0x4801a407, 0x4979a207, + 0x42000800, 0x00000002, 0x42001000, 0x0000dc00, + 0x0201f000, 0x001078bc, 0x4c580000, 0x4c540000, + 0x4c500000, 0x0401fa55, 0x4a01a006, 0x02000000, + 0x59a80002, 0x4801a008, 0x59a80003, 0x4801a009, + 0x59a80000, 0x4801a00a, 0x59a80001, 0x4801a00b, + 0x5930001c, 0x82000d80, 0x0000e000, 0x04000016, + 0x82000d80, 0x0000df00, 0x04000006, 0x4a01a407, + 0x00000010, 0x42000800, 0x00000006, 0x0401f027, + 0x4a03c840, 0x0010b4eb, 0x4a03c842, 0x0000000d, + 0x42001800, 0x0010b4eb, 0x0201f800, 0x001007af, + 0x42000000, 0x0000df00, 0x4200a000, 0x0010b4eb, + 0x0401f00d, 0x4a03c840, 0x0010b4f8, 0x4a03c842, + 0x0000000d, 0x42001800, 0x0010b4f8, 0x0201f800, + 0x001007af, 0x42000000, 0x0000e000, 0x4200a000, + 0x0010b4f8, 0x82000540, 0x00000010, 0x4801a407, + 0x4a01a207, 0x00000034, 0x4200b000, 0x0000000d, + 0x82d0ac00, 0x0000000c, 0x0201f800, 0x0010ab17, + 0x42000800, 0x00000013, 0x42001000, 0x0000dc00, + 0x5c00a000, 0x5c00a800, 0x5c00b000, 0x0201f000, + 0x001078bc, 0x0401fa03, 0x4a01a006, 0x63000028, + 0x5930001c, 0x4801a007, 0x42000800, 0x00000002, + 0x42001000, 0x0000dc00, 0x0201f000, 0x001078bc, + 0x0401fa06, 0x41780000, 0x41780800, 0x42002000, + 0x00080000, 0x0c01f81b, 0x80000000, 0x80040800, + 0x42001000, 0x0000000c, 0x59841802, 0x8c0c1d00, + 0x04020008, 0x42002000, 0x00050000, 0x0c01f811, + 0x80000000, 0x80040800, 0x82081400, 0x00000004, + 0x82080540, 0x02000000, 0x4801a006, 0x800408e0, + 0x5930001c, 0x80040540, 0x4801a007, 0x80080904, + 0x42001000, 0x0000dc00, 0x0201f000, 0x001078bc, + 0x001072e9, 0x001072eb, 0x001072ed, 0x001072ef, + 0x001072f1, 0x4811a008, 0x1c01f000, 0x4811a009, + 0x1c01f000, 0x4811a00a, 0x1c01f000, 0x4811a00b, + 0x1c01f000, 0x4811a00c, 0x1c01f000, 0x4a026009, + 0x0010be0d, 0x59a80010, 0x82000500, 0x000000ff, + 0x800000d0, 0x42026800, 0x0010be0d, 0x48026a12, + 0x0401fa3b, 0x41780800, 0x42001000, 0x00005c00, + 0x0201f000, 0x001078bc, 0x0401f9ba, 0x4a01a006, + 0x52000000, 0x4979a007, 0x599c0017, 0x8c000500, + 0x04000005, 0x599c0402, 0x0201f800, 0x001015da, + 0x4805a007, 0x59a80002, 0x4801a008, 0x59a80003, + 0x4801a009, 0x59a80000, 0x4801a00a, 0x59a80001, + 0x4801a00b, 0x59a80010, 0x4801a00c, 0x42000800, + 0x00000007, 0x42001000, 0x0000dc00, 0x0201f000, + 0x001078bc, 0x4a026202, 0x0000ffff, 0x0401f99d, + 0x4a01a006, 0x05000000, 0x59a80010, 0x4801a007, + 0x59a80002, 0x59a80803, 0x4801a008, 0x4805a009, + 0x42000800, 0x00000004, 0x42001000, 0x0000dc00, + 0x0201f000, 0x001078bc, 0x4a026202, 0x0000ffff, + 0x0401f98c, 0x4d3c0000, 0x417a7800, 0x0201f800, + 0x001048f6, 0x5c027800, 0x4a01a006, 0x03000000, + 0x59340403, 0x82000580, 0x000007fe, 0x0402006e, + 0x4a01a006, 0x04000000, 0x81a40800, 0x4a000800, + 0x22fffffe, 0x5934000a, 0x84000500, 0x4802680a, + 0x59c41002, 0x8408150c, 0x480b8802, 0x59a80026, + 0x8c000508, 0x04000010, 0x59a8002a, 0x4801a007, + 0x59a8002b, 0x82000500, 0xffff2000, 0x599c0818, + 0x8c040d16, 0x04000002, 0x8400056a, 0x4801a008, + 0x4a01a009, 0x00002710, 0x59a8002d, 0x4801a00a, + 0x0401f039, 0x59a8002a, 0x4801a007, 0x0201f800, + 0x0010513b, 0x04020009, 0x497b8880, 0x82000500, + 0x0000ffff, 0x4c000000, 0x0201f800, 0x00101606, + 0x5c000000, 0x48038880, 0x59a8002b, 0x0201f800, + 0x0010513b, 0x04020004, 0x82000500, 0x37ffffff, + 0x0401f003, 0x82000500, 0x3fffffff, 0x599c0818, + 0x8c040d16, 0x04000002, 0x8400056a, 0x59a80805, + 0x8c040d10, 0x04000019, 0x59300c03, 0x82041580, + 0x00000051, 0x04000015, 0x82041580, 0x00000031, + 0x04000012, 0x4c580000, 0x4c500000, 0x4c540000, + 0x4200b000, 0x00000004, 0x4200a000, 0x0010b8fa, + 0x82d0ac00, 0x0000001f, 0x4c000000, 0x0201f800, + 0x0010ab17, 0x5c000000, 0x5c00a800, 0x5c00a000, + 0x5c00b000, 0x8400057a, 0x4801a008, 0x4979a009, + 0x4979a00a, 0x59a80002, 0x59a80803, 0x4801a00b, + 0x4805a00c, 0x59a80000, 0x59a80801, 0x4801a00d, + 0x4805a00e, 0x4979a00f, 0x4979a010, 0x4979a011, + 0x4979a012, 0x4979a013, 0x4979a014, 0x4979a015, + 0x4979a016, 0x59a8002e, 0x84000576, 0x4801a017, + 0x59a8002f, 0x4801a018, 0x4979a019, 0x4979a01a, + 0x0401f043, 0x59a80026, 0x8c000508, 0x0400000d, + 0x59a8002a, 0x82000500, 0x0000ffff, 0x59c40880, + 0x80040d80, 0x04000007, 0x497b8880, 0x4c000000, + 0x0201f800, 0x00101606, 0x5c000000, 0x48038880, + 0x59a8002a, 0x4801a007, 0x4c640000, 0x4d2c0000, + 0x59a8c82b, 0x0201f800, 0x00109037, 0x0400000d, + 0x0201f800, 0x00109597, 0x0402000a, 0x592c0207, + 0x8c00050e, 0x04000007, 0x8264cd00, 0x0000ffff, + 0x592c0009, 0x82000500, 0xffff0000, 0x8064cd40, + 0x4865a008, 0x5c025800, 0x5c00c800, 0x59a8002c, + 0x4801a009, 0x59a8002d, 0x4801a00a, 0x59a80002, + 0x59a80803, 0x4801a00b, 0x4805a00c, 0x59a80000, + 0x59a80801, 0x4801a00d, 0x4805a00e, 0x4979a00f, + 0x4979a010, 0x4979a011, 0x4979a012, 0x4979a013, + 0x4979a014, 0x4979a015, 0x4979a016, 0x59a8002e, + 0x4801a017, 0x59a8002f, 0x4801a018, 0x59a80030, + 0x4801a019, 0x59a80031, 0x4801a01a, 0x42000800, + 0x0000001d, 0x42001000, 0x0000dc00, 0x0201f000, + 0x001078bc, 0x0401f8cb, 0x4a01a006, 0x50000000, + 0x0401f7b5, 0x0401f8c7, 0x4a01a406, 0x21000010, + 0x4a01a206, 0x00000014, 0x4979a007, 0x4979a008, + 0x4979a009, 0x4979a00a, 0x42000800, 0x00000005, + 0x42001000, 0x0000dc00, 0x0201f000, 0x001078bc, + 0x0401f8bf, 0x0401f002, 0x0401f8c4, 0x4a01a006, + 0x02000000, 0x42000800, 0x00000001, 0x42001000, + 0x0000dc00, 0x0201f000, 0x001078bc, 0x0401f8bb, + 0x4a01a006, 0x02000000, 0x59300403, 0x82000580, + 0x00000031, 0x04020794, 0x81a40800, 0x4a000801, + 0x00fffffe, 0x0401f72b, 0x0401f8b0, 0x4a01a006, + 0x01000000, 0x5930041a, 0x80000540, 0x04000003, + 0x4801a407, 0x0401f003, 0x4a01a407, 0x00000003, + 0x5930021a, 0x80000540, 0x04000003, 0x4801a207, + 0x0401f003, 0x4a01a207, 0x00002a00, 0x42000800, + 0x00000002, 0x42001000, 0x0000dc00, 0x0201f000, + 0x001078bc, 0x4a026202, 0x0000ffff, 0x0401f889, + 0x4a01a406, 0x00002010, 0x4a01a206, 0x00000014, + 0x4a01a407, 0x00000800, 0x4a01a207, 0x00002000, + 0x80000580, 0x599c0817, 0x8c040d0a, 0x04020003, + 0x82000540, 0x00000020, 0x8c040d08, 0x04000003, + 0x82000540, 0x00000010, 0x82000540, 0x00000002, + 0x5934080a, 0x8c040d14, 0x04000005, 0x82040d00, + 0x00000380, 0x80040540, 0x0401f006, 0x599c0818, + 0x8c040d18, 0x04000003, 0x82000540, 0x00000380, + 0x0401f03c, 0x0401f875, 0x4a01a406, 0x00000210, + 0x4a01a206, 0x00000014, 0x4a01a407, 0x00000800, + 0x5934000a, 0x8c000516, 0x04000014, 0x59340c05, + 0x82040500, 0x00000030, 0x04000013, 0x59340a05, + 0x82040500, 0x0000c000, 0x04020009, 0x8c040d1a, + 0x04000004, 0x4a01a207, 0x00002100, 0x0401f00c, + 0x4a01a207, 0x00000100, 0x0401f009, 0x4a01a207, + 0x00000400, 0x0401f006, 0x4a01a207, 0x00000700, + 0x0401f003, 0x4a01a207, 0x00000800, 0x80000580, + 0x599c0817, 0x8c040d0a, 0x04020003, 0x82000540, + 0x00000020, 0x8c040d08, 0x04000003, 0x82000540, + 0x00000010, 0x82000540, 0x00000002, 0x59340a00, + 0x8c040d0e, 0x0400000b, 0x84000550, 0x599c1017, + 0x8c08150a, 0x04020004, 0x8c040d0a, 0x04000002, + 0x8400054e, 0x8c040d1c, 0x04000002, 0x84000552, + 0x4801a20a, 0x42000800, 0x00000005, 0x42001000, + 0x0000dc00, 0x0201f000, 0x001078bc, 0x0401f833, + 0x4a01a006, 0x02100014, 0x4a01a007, 0x01000000, + 0x4979a008, 0x4979a009, 0x4979a00a, 0x42000800, + 0x00000005, 0x42001000, 0x0000dc00, 0x0201f000, + 0x001078bc, 0x0401f825, 0x4a01a006, 0x02000000, + 0x0401f65d, 0x4933c857, 0x0401f820, 0x4a01a006, + 0x01000000, 0x4a01a407, 0x0000000b, 0x42000800, + 0x00000002, 0x42001000, 0x0000dc00, 0x0201f000, + 0x001078bc, 0x42005000, 0x32000000, 0x42006000, + 0x08290000, 0x41786800, 0x41787800, 0x0401f3df, + 0x42005000, 0x22000000, 0x42006000, 0x01290000, + 0x41786800, 0x41787800, 0x0401f3d8, 0x42005000, + 0x33000000, 0x42006000, 0x08980000, 0x41786800, + 0x41787800, 0x0401f3d1, 0x42005000, 0x23000000, + 0x42006000, 0x01980000, 0x41786800, 0x41787800, + 0x0401f3ca, 0x59300403, 0x82000c80, 0x00000085, + 0x02001800, 0x001005d8, 0x82000c80, 0x00000093, + 0x02021800, 0x001005d8, 0x82000480, 0x00000085, + 0x0c01f001, 0x001074eb, 0x001074ed, 0x001074fb, + 0x001074eb, 0x001074eb, 0x001074eb, 0x001074eb, + 0x001074eb, 0x001074eb, 0x001074eb, 0x001074eb, + 0x001074eb, 0x001074eb, 0x00107506, 0x0201f800, + 0x001005d8, 0x4933c857, 0x0401f850, 0x59300402, + 0x4801a407, 0x5930001c, 0x4801a207, 0x4979a408, + 0x4a01a208, 0x0000ffff, 0x42000800, 0x00000003, + 0x42001000, 0x0000dc00, 0x0401f3c2, 0x4933c857, + 0x0401f84e, 0x4a01a406, 0x00000003, 0x4a01a206, + 0x00000300, 0x42000800, 0x00000001, 0x42001000, + 0x0000dc00, 0x0401f3b7, 0x4d2c0000, 0x59325808, + 0x4933c857, 0x492fc857, 0x812e59c0, 0x02000800, + 0x001005d8, 0x59340a12, 0x82040d00, 0x0000ff00, + 0x592c000a, 0x82000500, 0x000000ff, 0x900001c0, + 0x80040540, 0x82000540, 0x00000011, 0x44034800, + 0x81a5a000, 0x42001000, 0x00000009, 0x42000800, + 0x00000003, 0x592c0009, 0x82000500, 0xff000000, + 0x82001d80, 0x84000000, 0x04000009, 0x82001d80, + 0x85000000, 0x02020800, 0x001005d8, 0x42001000, + 0x00000007, 0x42000800, 0x00000001, 0x832c1c00, + 0x00000009, 0x500c0000, 0x4401a000, 0x800c1800, + 0x80d1a000, 0x80081040, 0x040207fb, 0x42001000, + 0x0000dc00, 0x5c025800, 0x0401f386, 0x42005000, + 0x81000000, 0x42006000, 0x00090000, 0x41786800, + 0x41787800, 0x0401f35d, 0x42005000, 0x84000000, + 0x42006000, 0x00990000, 0x59300406, 0x82000580, + 0x00000005, 0x04000002, 0x8430652e, 0x41786800, + 0x41787800, 0x0401f351, 0x42005000, 0x85000000, + 0x42006000, 0x00990000, 0x59300406, 0x82000580, + 0x00000005, 0x04000002, 0x8430652e, 0x41786800, + 0x41787800, 0x0401f345, 0x59300403, 0x82000c80, + 0x00000053, 0x02021800, 0x001005d8, 0x82000480, + 0x0000004b, 0x02001800, 0x001005d8, 0x59326809, + 0x59368c03, 0x4803c857, 0x0c01f001, 0x001075da, + 0x001075e2, 0x001075ea, 0x001075f2, 0x0010756b, + 0x0010756b, 0x0010756b, 0x001075d2, 0x0201f800, + 0x001005d8, 0x42005000, 0x06000000, 0x42006000, + 0x08290000, 0x41786800, 0x41787800, 0x0401f327, + 0x4933c857, 0x0401ff47, 0x4a01a006, 0x12000000, + 0x59300406, 0x82000580, 0x00000004, 0x04020003, + 0x59340002, 0x0401f002, 0x59a80010, 0x82000500, + 0x00ffffff, 0x4801a007, 0x59300419, 0x4801a408, + 0x59300219, 0x4801a208, 0x4979a009, 0x4979a00a, + 0x4979a00b, 0x4979a00c, 0x4979a00d, 0x4979a00e, + 0x4979a00f, 0x4979a010, 0x42000800, 0x0000000b, + 0x42001000, 0x0000dc00, 0x0401f32a, 0x0401ff29, + 0x4a01a006, 0x0f000000, 0x5930001c, 0x4801a007, + 0x42000800, 0x00000002, 0x42001000, 0x0000dc00, + 0x0401f320, 0x0401ff2d, 0x4a01a006, 0x02000000, + 0x59c40085, 0x48031004, 0x59880000, 0x4801a007, + 0x59880001, 0x4801a008, 0x59880002, 0x4801a009, + 0x59880003, 0x4801a00a, 0x59880004, 0x4801a00b, + 0x59880005, 0x4801a00c, 0x42000800, 0x00000007, + 0x42001000, 0x0000dc00, 0x0401f30a, 0x4a026202, + 0x0000ffff, 0x0401ff07, 0x4a01a006, 0x62000000, + 0x5930001c, 0x4801a007, 0x42000800, 0x00000002, + 0x42001000, 0x0000dc00, 0x0401f2fe, 0x0401fefd, + 0x59300808, 0x4c500000, 0x4c540000, 0x4c580000, + 0x8204a400, 0x0000000a, 0x5930b01c, 0x82d0ac00, + 0x00000006, 0x0201f800, 0x0010ab17, 0x5930081c, + 0x42001000, 0x0000dc00, 0x5c00b000, 0x5c00a800, + 0x5c00a000, 0x0401f2eb, 0x0401ff9b, 0x59300017, + 0x4801a006, 0x59300018, 0x4801a007, 0x4a01a008, + 0x00001000, 0x0401f020, 0x0401ff93, 0x59300017, + 0x4801a006, 0x59300018, 0x4801a007, 0x4a01a008, + 0x00004000, 0x0401f018, 0x0401ff8b, 0x59300017, + 0x4801a006, 0x59300018, 0x4801a007, 0x4a01a008, + 0x00002000, 0x0401f010, 0x0401ff83, 0x59300017, + 0x4801a006, 0x59300018, 0x4801a007, 0x4a01a008, + 0x00000400, 0x0401f008, 0x0401ff7b, 0x59300017, + 0x4801a006, 0x59300018, 0x4801a007, 0x4a01a008, + 0x00000200, 0x4979a009, 0x4979a00a, 0x4979a00b, + 0x4979a00c, 0x4979a00d, 0x42000800, 0x00000008, + 0x42001000, 0x0000dc00, 0x0401f2ba, 0x0401fec7, + 0x4a01a006, 0x02000014, 0x4979a407, 0x4979a207, + 0x59a8003a, 0x4801a008, 0x59a8003b, 0x4801a009, + 0x4a01a00a, 0x00047878, 0x42000800, 0x00000005, + 0x42001000, 0x0000dc00, 0x0401f2aa, 0x0401feb7, + 0x4a01a006, 0x02140018, 0x4a01a407, 0x00000800, + 0x5930001c, 0x82000d00, 0xff000000, 0x900409c0, + 0x4805a207, 0x82000500, 0x00ffffff, 0x4801a00a, + 0x4979a408, 0x4979a208, 0x4979a409, 0x4979a209, + 0x4979a00b, 0x42000800, 0x00000006, 0x42001000, + 0x0000dc00, 0x0401f293, 0x4803c856, 0x4d380000, + 0x4d1c0000, 0x42027000, 0x00000035, 0x0201f800, + 0x001093ba, 0x0402001e, 0x0401fe8a, 0x4a01a006, + 0x13000000, 0x5932381e, 0x591c0019, 0x4801a005, + 0x591c0406, 0x82000580, 0x00000003, 0x04000007, + 0x59300809, 0x58040002, 0x82000500, 0x00ffffff, + 0x4801a007, 0x0401f003, 0x59a80010, 0x4801a007, + 0x59300419, 0x4801a408, 0x59300219, 0x4801a208, + 0x42000800, 0x00000003, 0x42001000, 0x0000dc00, + 0x5c023800, 0x5c027000, 0x0401f26e, 0x0201f800, + 0x00106c55, 0x598c000d, 0x81300580, 0x02020800, + 0x001005d8, 0x0201f800, 0x00106bbf, 0x0201f800, + 0x0002077d, 0x5c023800, 0x5c027000, 0x0201f000, + 0x00106c4b, 0x4803c856, 0x4d2c0000, 0x4d1c0000, + 0x5932381e, 0x811e39c0, 0x02000800, 0x001005d8, + 0x591c0c06, 0x82040580, 0x00000006, 0x0400000d, + 0x82040580, 0x00000003, 0x04000036, 0x4a026403, + 0x00000037, 0x4a02641a, 0x00000003, 0x4a02621a, + 0x00001700, 0x5c023800, 0x5c025800, 0x0401f064, + 0x0401f84b, 0x42001000, 0x40000000, 0x591c0203, + 0x591c0804, 0x8c040d3e, 0x04020023, 0x82000c80, + 0x0000000e, 0x0c001003, 0x0201f800, 0x001005d8, + 0x00107691, 0x0010769d, 0x00107693, 0x0010769d, + 0x00107699, 0x00107691, 0x00107691, 0x0010769d, + 0x0010769d, 0x00107691, 0x00107691, 0x00107691, + 0x00107691, 0x00107691, 0x0010769d, 0x00107691, + 0x0010769d, 0x0201f800, 0x001005d8, 0x591c0414, + 0x4803c857, 0x8c000518, 0x04000003, 0x8c000512, + 0x04000003, 0x80001580, 0x0401f003, 0x42001000, + 0x20000000, 0x591c0015, 0x4801a00a, 0x0401f018, + 0x0401f81f, 0x591e5808, 0x812e59c0, 0x02000800, + 0x001005d8, 0x592c100f, 0x591c0011, 0x80080480, + 0x4801a00a, 0x591c0203, 0x591c0804, 0x8c040d3e, + 0x04020007, 0x82000d80, 0x00000002, 0x04000007, + 0x82000d80, 0x00000004, 0x04000004, 0x42001000, + 0x40000000, 0x0401f002, 0x80001580, 0x4809a00b, + 0x42000800, 0x00000006, 0x42001000, 0x0000dc00, + 0x5c023800, 0x5c025800, 0x0401f1fe, 0x4803c856, + 0x0401fe0a, 0x4a01a006, 0x02000000, 0x59300c19, + 0x4805a407, 0x59300a19, 0x4805a207, 0x59a81010, + 0x59300809, 0x58041802, 0x820c1d00, 0x00ffffff, + 0x5930081e, 0x58040406, 0x82000580, 0x00000003, + 0x04020004, 0x4809a008, 0x480da009, 0x0401f003, + 0x480da008, 0x4809a009, 0x1c01f000, 0x4803c856, + 0x0401fdf2, 0x0401f003, 0x4803c856, 0x0401fde8, + 0x4a01a006, 0x01000000, 0x5930041a, 0x4801a407, + 0x5930021a, 0x4801a207, 0x42000800, 0x00000002, + 0x42001000, 0x0000dc00, 0x0401f1d6, 0x4803c856, + 0x4d1c0000, 0x0401fdcc, 0x4a01a006, 0x14000000, + 0x5932381e, 0x591c0019, 0x4801a005, 0x59300419, + 0x4801a407, 0x59300219, 0x4801a207, 0x59300015, + 0x4801a008, 0x59300216, 0x82000500, 0x000000ff, + 0x840001c0, 0x4801a409, 0x42000800, 0x00000004, + 0x42001000, 0x0000dc00, 0x5c023800, 0x0401f1bd, + 0x4803c856, 0x0401f80b, 0x5930041a, 0x900001c0, + 0x4801a005, 0x0401f9ec, 0x41780800, 0x42001000, + 0x00005c00, 0x0401f9b3, 0x0201f000, 0x0010604d, + 0x4803c856, 0x59300817, 0x82041c00, 0x00000005, + 0x46034800, 0x00000021, 0x58040404, 0x82000500, + 0x0000f000, 0x82000580, 0x00003000, 0x04000003, + 0x46034800, 0x00000041, 0x81a5a000, 0x580c0001, + 0x82000d00, 0x00ffffff, 0x82040d40, 0xc2000000, + 0x4805a000, 0x580c0800, 0x82041500, 0x00ffffff, + 0x82000500, 0xff000000, 0x80080540, 0x4801a001, + 0x580c0002, 0x82000580, 0x00c00000, 0x82000500, + 0x00fd0300, 0x4801a002, 0x580c0003, 0x4801a003, + 0x580c0404, 0x4801a404, 0x580c0204, 0x4801a204, + 0x1c01f000, 0x4803c856, 0x59a80026, 0x82000500, + 0x00000028, 0x04020009, 0x59a80026, 0x82000500, + 0x00000028, 0x04000003, 0x497a6a12, 0x0401f003, + 0x4a026a12, 0x0000ff00, 0x42005000, 0x22000000, + 0x42006000, 0x01380000, 0x41786800, 0x41787800, + 0x0401f952, 0x59301008, 0x4a01a006, 0x54000000, + 0x59a80010, 0x82000500, 0x00ffffff, 0x58080c0a, + 0x800408f0, 0x80040540, 0x4801a007, 0x5808000a, + 0x82000500, 0xff000000, 0x4801a008, 0x59a80002, + 0x4801a009, 0x59a80003, 0x4801a00a, 0x59a80000, + 0x4801a00b, 0x59a80001, 0x4801a00c, 0x5808000c, + 0x9c0001c0, 0x4801a00d, 0x5808000d, 0x9c0001c0, + 0x4801a00e, 0x5808000e, 0x9c0001c0, 0x4801a00f, + 0x5808000f, 0x9c0001c0, 0x4801a010, 0x58080010, + 0x9c0001c0, 0x4801a011, 0x58080011, 0x9c0001c0, + 0x4801a012, 0x58080012, 0x9c0001c0, 0x4801a013, + 0x58080013, 0x9c0001c0, 0x4801a014, 0x58080010, + 0x9c0001c0, 0x4801a015, 0x58080011, 0x9c0001c0, + 0x4801a016, 0x58080012, 0x9c0001c0, 0x4801a017, + 0x58080013, 0x9c0001c0, 0x4801a018, 0x42000800, + 0x00000013, 0x42001000, 0x0000dc00, 0x0401f135, + 0x4803c856, 0x42005000, 0x22000000, 0x42006000, + 0x01290000, 0x41786800, 0x41787800, 0x0401f90b, + 0x59301008, 0x4a01a006, 0x55000000, 0x5808000b, + 0x82000500, 0x00ffffff, 0x58080c0a, 0x800408f0, + 0x80040540, 0x4801a007, 0x5808080a, 0x82040d00, + 0xff000000, 0x59a80010, 0x82000500, 0x00ffffff, + 0x80040540, 0x4801a008, 0x5808000c, 0x9c0001c0, + 0x4801a009, 0x5808000d, 0x9c0001c0, 0x4801a00a, + 0x5808000e, 0x9c0001c0, 0x4801a00b, 0x5808000f, + 0x9c0001c0, 0x4801a00c, 0x59a80002, 0x4801a00d, + 0x59a80003, 0x4801a00e, 0x59a80000, 0x4801a00f, + 0x59a80001, 0x4801a010, 0x58080010, 0x4801a011, + 0x58080011, 0x4801a012, 0x58080012, 0x4801a013, + 0x58080013, 0x4801a014, 0x4979a015, 0x4979a016, + 0x4979a017, 0x4979a018, 0x42000800, 0x00000013, + 0x42001000, 0x0000dc00, 0x0401f0f6, 0x0401fd03, + 0x5930001c, 0x800001c0, 0x04000008, 0x4a01a006, + 0x01000000, 0x4a01a407, 0x00000003, 0x42000800, + 0x00000002, 0x0401f028, 0x4a01a006, 0x02000000, + 0x41780800, 0x836c0580, 0x00000004, 0x04020003, + 0x84040d42, 0x0401f00d, 0x0201f800, 0x0010513b, + 0x04020003, 0x84040d4a, 0x0401f002, 0x84040d48, + 0x59a80026, 0x8c000506, 0x04020003, 0x8c00050a, + 0x04000002, 0x84040d46, 0x4805a207, 0x59c40085, + 0x48031004, 0x4c580000, 0x4c500000, 0x4c540000, + 0x4200b000, 0x00000006, 0x8388a400, 0x00000000, + 0x82d0ac00, 0x00000008, 0x0201f800, 0x0010ab17, + 0x5c00a800, 0x5c00a000, 0x5c00b000, 0x42000800, + 0x00000008, 0x42001000, 0x0000dc00, 0x0401f0c1, + 0x0401fcc0, 0x4a01a006, 0x56000000, 0x59340006, + 0x4801a007, 0x59340007, 0x4801a008, 0x42000800, + 0x00000003, 0x42001000, 0x0000dc00, 0x0401f0b5, + 0x4803c856, 0x0401fcc1, 0x5930081c, 0x800409c0, + 0x0400000e, 0x82040580, 0x0000ffff, 0x04000004, + 0x82040480, 0x00000007, 0x04021008, 0x4a01a006, + 0x01000000, 0x4a01a407, 0x00000003, 0x42000800, + 0x00000002, 0x0401f012, 0x4a01a006, 0x0200001c, + 0x4a01a007, 0x00000001, 0x42001000, 0x0010b4f0, + 0x50080000, 0x9c0001c0, 0x4801a009, 0x59a80010, + 0x4801a00a, 0x59a80002, 0x59a80803, 0x4801a00b, + 0x4805a00c, 0x42000800, 0x00000007, 0x42001000, + 0x0000dc00, 0x0401f08f, 0x4d2c0000, 0x0401fc8d, + 0x59325808, 0x592c0008, 0x82000500, 0x00ffffff, + 0x4801a001, 0x4a01a006, 0x51000000, 0x5c025800, + 0x0201f000, 0x00107344, 0x4803c856, 0x59a80810, + 0x82040d00, 0x000000ff, 0x59325808, 0x59326809, + 0x59a83026, 0x8c18350a, 0x04020008, 0x8c00050e, + 0x04020006, 0x80001d80, 0x59a82010, 0x82102500, + 0x000000ff, 0x0401f001, 0x59300406, 0x4803c857, + 0x82000d80, 0x00000009, 0x04000006, 0x82000d80, + 0x0000000a, 0x0400002e, 0x0201f800, 0x001005d8, + 0x59300015, 0x8c00051e, 0x04020020, 0x42005000, + 0x04000000, 0x42006000, 0x05000000, 0x592c040a, + 0x82000500, 0x00000030, 0x800000e0, 0x80306540, + 0x5934000a, 0x8c000508, 0x04000002, 0x84306546, + 0x41786800, 0x41787800, 0x0401f831, 0x59300c14, + 0x80040000, 0x48026414, 0x40040000, 0x800000d0, + 0x82000540, 0x00000020, 0x4801a403, 0x83180d40, + 0x00000038, 0x42001000, 0x0000c920, 0x0401f860, + 0x0201f000, 0x00106052, 0x59a80026, 0x82000500, + 0x00000028, 0x04000003, 0x497a6a12, 0x0401f7dc, + 0x4a026a12, 0x0000ff00, 0x0401f7d9, 0x42005000, + 0x02000000, 0x42006000, 0x20290000, 0x41786800, + 0x41787800, 0x0401f812, 0x83180d40, 0x00000038, + 0x42001000, 0x0000c9a0, 0x0401f849, 0x42000800, + 0x000007d0, 0x59300011, 0x82000500, 0xfff00000, + 0x80000540, 0x04000003, 0x42000800, 0x00001b58, + 0x41781000, 0x0201f000, 0x00106054, 0x4201a000, + 0x00000000, 0x0401f003, 0x4201a000, 0x00000011, + 0x59340a12, 0x82040d00, 0x0000ff00, 0x59a80010, + 0x82000500, 0x000000ff, 0x900001c0, 0x80040540, + 0x80d00540, 0x44034800, 0x81a5a000, 0x59340002, + 0x82000500, 0x00ffffff, 0x80280540, 0x4801a000, + 0x59a80010, 0x4801a001, 0x4831a002, 0x82340540, + 0x00000000, 0x4801a003, 0x59300402, 0x4801a404, + 0x59300a02, 0x4805a204, 0x8c30652e, 0x04000003, + 0x4805a404, 0x4801a204, 0x483da005, 0x1c01f000, + 0x4803c856, 0x4c040000, 0x0401f822, 0x5c000800, + 0x40040000, 0x80081540, 0x800000c4, 0x82000540, + 0x00002000, 0x4803910a, 0x59b400f6, 0x82000500, + 0x00000018, 0x040207fd, 0x4a0368f0, 0x0010b544, + 0x4a0368f1, 0x0010b54b, 0x480b68f3, 0x4a0378e4, + 0x00008000, 0x0201f000, 0x0010604d, 0x4807c857, + 0x480a2800, 0x4c040000, 0x0401f80a, 0x5c000800, + 0x59b400f6, 0x8c00050a, 0x040207fe, 0x49a768f2, + 0x480768f4, 0x4a0378e4, 0x00008000, 0x1c01f000, + 0x4a0378e4, 0x0000c000, 0x59bc00e4, 0x8c000520, + 0x0400000c, 0x4a0378e4, 0x00008000, 0x42007000, + 0x000003e8, 0x59bc00e4, 0x8c000520, 0x040007f5, + 0x80387040, 0x02000800, 0x001005d8, 0x0401f7fa, + 0x1c01f000, 0x82000500, 0xffff0000, 0x82000580, + 0x01050000, 0x0402000d, 0x599c0818, 0x8c040d10, + 0x0400000a, 0x59a80807, 0x8c040d0a, 0x04000007, + 0x42001000, 0x0000804f, 0x41781800, 0x41782000, + 0x0201f800, 0x00103a3e, 0x1c01f000, 0x41781000, + 0x42026000, 0x0010d1c0, 0x59a8180e, 0x480a6402, + 0x4a026202, 0x0000ffff, 0x80081000, 0x800c1840, + 0x04000004, 0x83326400, 0x00000024, 0x0401f7f8, + 0x1c01f000, 0x4933c857, 0x59300203, 0x82000580, + 0x00000000, 0x0400002c, 0x59300406, 0x4803c857, + 0x82000d80, 0x00000004, 0x04000011, 0x82000d80, + 0x00000001, 0x0400000e, 0x82000d80, 0x00000003, + 0x04000006, 0x82000d80, 0x00000006, 0x04020011, + 0x0201f800, 0x0010a5df, 0x5930001c, 0x800001c0, + 0x02020800, 0x0010984e, 0x0401f00a, 0x5930081e, + 0x4807c857, 0x800409c0, 0x04000006, 0x5804001c, + 0x4803c857, 0x81300580, 0x04020002, 0x4978081c, + 0x497a6008, 0x4a026004, 0x00004000, 0x59a80037, + 0x82000c80, 0x00000051, 0x04001002, 0x80000102, + 0x48026206, 0x497a6205, 0x497a6009, 0x4a026406, + 0x00000007, 0x1c01f000, 0x8166c9c0, 0x0400001c, + 0x41626000, 0x41580000, 0x59300a03, 0x82040d80, + 0x00000000, 0x04000008, 0x83326400, 0x00000024, + 0x81300c80, 0x040017f9, 0x42026000, 0x0010d1c0, + 0x0401f7f6, 0x4933c857, 0x8166c840, 0x83300c00, + 0x00000024, 0x80040480, 0x04021006, 0x4006c000, + 0x4a026203, 0x00000008, 0x813261c0, 0x1c01f000, + 0x4202c000, 0x0010d1c0, 0x0401f7fa, 0x42000000, + 0x0010b854, 0x0201f800, 0x0010aa47, 0x4933c856, + 0x417a6000, 0x0401f7f5, 0x4933c857, 0x83380580, + 0x00000013, 0x0402000b, 0x59300004, 0x8c00053e, + 0x04000007, 0x0201f800, 0x00106c55, 0x0201f800, + 0x00106bbf, 0x0201f800, 0x00106c4b, 0x1c01f000, + 0x4933c857, 0x59880052, 0x80000000, 0x48031052, + 0x1c01f000, 0x4933c857, 0x59300203, 0x82003480, + 0x0000000e, 0x02021800, 0x001005d8, 0x4d2c0000, + 0x0c01f803, 0x5c025800, 0x1c01f000, 0x00107991, + 0x00107efd, 0x0010804a, 0x00107991, 0x001080b0, + 0x00107af5, 0x00107991, 0x00107991, 0x00107e93, + 0x00107991, 0x00107991, 0x00107991, 0x00107991, + 0x00107991, 0x0201f800, 0x001005d8, 0x4933c857, + 0x59300203, 0x82003480, 0x0000000e, 0x02021800, + 0x001005d8, 0x0c01f001, 0x001079a8, 0x00108a3d, + 0x001079a8, 0x001079a8, 0x001079a8, 0x001079a8, + 0x001079a8, 0x001079a8, 0x001089e5, 0x00108a58, + 0x00108ac6, 0x00108a58, 0x00108ac6, 0x001079a8, + 0x0201f800, 0x001005d8, 0x0201f800, 0x001005d8, + 0x4933c857, 0x4d2c0000, 0x59325808, 0x59300203, + 0x82003480, 0x0000000e, 0x02021800, 0x001005d8, + 0x0c01f803, 0x5c025800, 0x1c01f000, 0x001079c5, + 0x001079c5, 0x001079c5, 0x001079e1, 0x00107a2d, + 0x001079c5, 0x001079c5, 0x001079c5, 0x001079c7, + 0x001079c5, 0x001079c5, 0x001079c5, 0x001079c5, + 0x001079c5, 0x0201f800, 0x001005d8, 0x4933c857, + 0x83380580, 0x00000040, 0x02020800, 0x001005d8, + 0x4a026007, 0x00082000, 0x4a026203, 0x00000003, + 0x493a6403, 0x4a025c08, 0x00000001, 0x592c000d, + 0x48026011, 0x497a6013, 0x592c0208, 0x800000c2, + 0x800010c4, 0x80081400, 0x480a6206, 0x0201f800, + 0x00100f4e, 0x42000800, 0x80000060, 0x0201f000, + 0x00106721, 0x4933c857, 0x83380480, 0x00000050, + 0x02021800, 0x001005d8, 0x83380480, 0x00000049, + 0x02001800, 0x001005d8, 0x0c01f001, 0x001079f4, + 0x001079ff, 0x001079f2, 0x001079f2, 0x001079f2, + 0x001079f2, 0x00107a0a, 0x0201f800, 0x001005d8, + 0x4a026203, 0x00000004, 0x4a025c08, 0x00000002, + 0x592c0207, 0x48025c09, 0x592c0209, 0x48025a07, + 0x592c000c, 0x4802580d, 0x1c01f000, 0x0201f800, + 0x00106b8a, 0x0201f800, 0x00109037, 0x04000005, + 0x4a025a06, 0x00000006, 0x0201f800, 0x000202da, + 0x0201f000, 0x0002077d, 0x0201f800, 0x00106b8a, + 0x4d3c0000, 0x417a7800, 0x0201f800, 0x0010203c, + 0x5c027800, 0x42003000, 0x00000014, 0x41782800, + 0x42002000, 0x00000002, 0x4d400000, 0x4d440000, + 0x59368c03, 0x42028000, 0x00000029, 0x0201f800, + 0x0010985e, 0x5c028800, 0x5c028000, 0x42000000, + 0x0010b864, 0x0201f800, 0x0010aa47, 0x0201f800, + 0x00109037, 0x02000000, 0x0002077d, 0x4a025a06, + 0x00000029, 0x0201f800, 0x000202da, 0x0201f000, + 0x0002077d, 0x4933c857, 0x83380580, 0x00000048, + 0x04000005, 0x83380580, 0x00000053, 0x02020800, + 0x001005d8, 0x592c0206, 0x82000580, 0x00000007, + 0x04000009, 0x59300011, 0x80000540, 0x04000006, + 0x592c080c, 0x80040480, 0x4802580c, 0x4a025a06, + 0x00000015, 0x592c0206, 0x80000540, 0x04020003, + 0x4a025a06, 0x00000000, 0x0201f800, 0x000202da, + 0x0201f000, 0x0002077d, 0x4933c857, 0x4d2c0000, + 0x4c500000, 0x4c540000, 0x4c580000, 0x0201f800, + 0x001007e4, 0x02000800, 0x001005d8, 0x497a5a06, + 0x59c80017, 0x82000500, 0x0000f000, 0x48025c07, + 0x59a80816, 0x82040c00, 0x00000018, 0x48065a07, + 0x412c7800, 0x4d2c0000, 0x41cca000, 0x42002800, + 0x00000001, 0x42001000, 0x0000002c, 0x82040480, + 0x0000002d, 0x04021006, 0x832cac00, 0x00000009, + 0x0201f800, 0x00108b96, 0x0401f02e, 0x40043000, + 0x42000800, 0x0000002c, 0x832cac00, 0x00000009, + 0x0201f800, 0x00108b96, 0x82183480, 0x0000002c, + 0x0201f800, 0x001007e4, 0x0400001a, 0x80142800, + 0x4a025804, 0x00000110, 0x492c7801, 0x82180c80, + 0x0000003d, 0x04021007, 0x40180800, 0x832cac00, + 0x00000005, 0x0201f800, 0x00108b96, 0x0401f015, + 0x82081400, 0x0000003c, 0x82183480, 0x0000003c, + 0x42000800, 0x0000003c, 0x412c7800, 0x832cac00, + 0x00000005, 0x0201f800, 0x00108b96, 0x0401f7e5, + 0x5c025800, 0x592c0206, 0x8400055e, 0x48025a06, + 0x592c0407, 0x80080540, 0x48025c07, 0x0401f002, + 0x5c025800, 0x813669c0, 0x04000003, 0x59343403, + 0x0401f003, 0x42003000, 0x0000ffff, 0x49325808, + 0x481a5c06, 0x82100580, 0x00000054, 0x04020002, + 0x491e5813, 0x841401c0, 0x80100540, 0x48025804, + 0x592c0001, 0x497a5801, 0x4c000000, 0x0201f800, + 0x000202da, 0x5c025800, 0x812e59c0, 0x040207f9, + 0x5c00b000, 0x5c00a800, 0x5c00a000, 0x5c025800, + 0x1c01f000, 0x4803c856, 0x4c5c0000, 0x4d2c0000, + 0x4c500000, 0x4c540000, 0x4c580000, 0x412cb800, + 0x592c040b, 0x8c000516, 0x04000003, 0x41cca000, + 0x0401f003, 0x83cca400, 0x00000006, 0x4008b000, + 0x41781000, 0x82580480, 0x00000012, 0x04001004, + 0x4200b000, 0x00000012, 0x40001000, 0x4c080000, + 0x4d2c0000, 0x0201f800, 0x001007e4, 0x04000023, + 0x5c001800, 0x492c1801, 0x485a5800, 0x832cac00, + 0x00000002, 0x0201f800, 0x0010ab28, 0x585c040b, + 0x8c000500, 0x0400000e, 0x832c1400, 0x00000002, + 0x8c000516, 0x04000003, 0x82081400, 0x00000006, + 0x46001000, 0x00000001, 0x80081000, 0x46001000, + 0x00000900, 0x84000500, 0x4800bc0b, 0x5c001000, + 0x800811c0, 0x040207da, 0x82000540, 0x00000001, + 0x5c00b000, 0x5c00a800, 0x5c00a000, 0x5c025800, + 0x5c00b800, 0x1c01f000, 0x5c025800, 0x5c001000, + 0x0401f7f8, 0x4933c857, 0x83380d80, 0x00000015, + 0x04020003, 0x0201f000, 0x0002077d, 0x83380d80, + 0x00000016, 0x02020800, 0x001005d8, 0x0201f000, + 0x0002077d, 0x4933c857, 0x4d2c0000, 0x4c500000, + 0x4c540000, 0x4c580000, 0x59325808, 0x83cca400, + 0x00000006, 0x59cc1806, 0x820c0580, 0x01000000, + 0x04020004, 0x4200b000, 0x00000002, 0x0401f00f, + 0x4200b000, 0x00000008, 0x832cac00, 0x00000005, + 0x0201f800, 0x0010ab17, 0x8c0c1d00, 0x0400000b, + 0x4200b000, 0x00000008, 0x592e5801, 0x812e59c0, + 0x02000800, 0x001005d8, 0x832cac00, 0x00000005, + 0x0201f800, 0x0010ab17, 0x0401f816, 0x5c00b000, + 0x5c00a800, 0x5c00a000, 0x5c025800, 0x1c01f000, + 0x4933c857, 0x4c500000, 0x4c540000, 0x4c580000, + 0x83cca400, 0x00000006, 0x5930a808, 0x8254ac00, + 0x00000005, 0x4200b000, 0x00000007, 0x0201f800, + 0x0010ab17, 0x5c00b000, 0x5c00a800, 0x5c00a000, + 0x4933c857, 0x0201f800, 0x00109037, 0x02000000, + 0x0002077d, 0x4d2c0000, 0x0201f800, 0x00109597, + 0x0402000b, 0x41780800, 0x4d400000, 0x42028000, + 0x00000000, 0x0201f800, 0x0010943b, 0x5c028000, + 0x5c025800, 0x0201f000, 0x0002077d, 0x5931d821, + 0x58ef400b, 0x58ee580d, 0x4a025a04, 0x00000103, + 0x58ec0009, 0x0801f800, 0x5c025800, 0x0201f000, + 0x0002077d, 0x4933c857, 0x59cc1806, 0x820c0580, + 0x02000000, 0x04020014, 0x4a026802, 0x00fffffd, + 0x5934000a, 0x84000504, 0x4802680a, 0x59300808, + 0x800409c0, 0x02000000, 0x0002077d, 0x4a000a04, + 0x00000103, 0x480c0805, 0x5931d821, 0x58ef400b, + 0x58ee580d, 0x58ec0009, 0x0801f800, 0x0201f000, + 0x0002077d, 0x42000000, 0x0010b86c, 0x0201f800, + 0x0010aa47, 0x4c0c0000, 0x0401f804, 0x5c001800, + 0x040207eb, 0x1c01f000, 0x4933c857, 0x4d2c0000, + 0x59325808, 0x812e59c0, 0x04020009, 0x497a6206, + 0x497a6205, 0x4d380000, 0x42027000, 0x00000022, + 0x0401fb77, 0x5c027000, 0x80000580, 0x5c025800, + 0x1c01f000, 0x4933c857, 0x4d2c0000, 0x4c500000, + 0x4c540000, 0x4c580000, 0x59325808, 0x592e5801, + 0x832cac00, 0x00000005, 0x83cca400, 0x00000006, + 0x59c80817, 0x82040d00, 0x000003ff, 0x82041480, + 0x0000000f, 0x0400101b, 0x4200b000, 0x0000000f, + 0x0201f800, 0x0010ab17, 0x592e5801, 0x832cac00, + 0x00000005, 0x82080c80, 0x0000000f, 0x0400100d, + 0x4200b000, 0x0000000f, 0x0201f800, 0x0010ab17, + 0x592e5801, 0x832cac00, 0x00000005, 0x82041480, + 0x0000000f, 0x04001007, 0x42001000, 0x0000000f, + 0x4008b000, 0x0201f800, 0x0010ab17, 0x0401f004, + 0x4004b000, 0x0201f800, 0x0010ab17, 0x5931d821, + 0x58ef400b, 0x58ee580d, 0x4a025a04, 0x00000103, + 0x592e5801, 0x58ec0009, 0x0801f800, 0x0201f800, + 0x0002077d, 0x5c00b000, 0x5c00a800, 0x5c00a000, + 0x5c025800, 0x1c01f000, 0x4933c857, 0x4d2c0000, + 0x4c500000, 0x4c540000, 0x4c580000, 0x59cc0006, + 0x82000d80, 0x01000000, 0x0400002c, 0x59cc0007, + 0x9000b1c0, 0x8258b500, 0x000000ff, 0x8058b104, + 0x8258b400, 0x00000002, 0x82580c80, 0x00000007, + 0x04001003, 0x4200b000, 0x00000006, 0x83cca400, + 0x00000006, 0x59301008, 0x800811c0, 0x02000800, + 0x001005d8, 0x8208ac00, 0x00000005, 0x0201f800, + 0x0010ab17, 0x82000d00, 0xff000000, 0x800409c0, + 0x04000019, 0x8200b500, 0x000000ff, 0x8058b104, + 0x82580c80, 0x0000000e, 0x04001003, 0x4200b000, + 0x0000000d, 0x58081001, 0x800811c0, 0x02000800, + 0x001005d8, 0x8208ac00, 0x00000005, 0x0201f800, + 0x0010ab17, 0x0401f008, 0x59301008, 0x800811c0, + 0x02000800, 0x001005d8, 0x48001005, 0x59cc0007, + 0x48001006, 0x0401ff3b, 0x5c00b000, 0x5c00a800, + 0x5c00a000, 0x5c025800, 0x1c01f000, 0x4933c857, + 0x42000800, 0x00000000, 0x59cc0006, 0x82000580, + 0x02000000, 0x04000003, 0x42000800, 0x00000001, + 0x4d2c0000, 0x59325808, 0x812e59c0, 0x02000800, + 0x001005d8, 0x48065a06, 0x0201f800, 0x000202da, + 0x5c025800, 0x0201f000, 0x0002077d, 0x4933c857, + 0x4d2c0000, 0x4c500000, 0x4c540000, 0x4c580000, + 0x4200b000, 0x00000002, 0x59cc0806, 0x82040580, + 0x01000000, 0x04000004, 0x8204b500, 0x0000ffff, + 0x8058b104, 0x83cca400, 0x00000006, 0x59300008, + 0x8200ac00, 0x00000005, 0x0201f800, 0x0010ab17, + 0x0401ff0c, 0x5c00b000, 0x5c00a800, 0x5c00a000, + 0x5c025800, 0x1c01f000, 0x4933c857, 0x4803c857, + 0x4807c857, 0x480bc857, 0x480fc857, 0x4813c857, + 0x481bc857, 0x492fc857, 0x4d2c0000, 0x4c000000, + 0x0201f800, 0x001007d3, 0x5c000000, 0x0400000f, + 0x48025803, 0x5c000000, 0x4802580a, 0x4c000000, + 0x481a5801, 0x48125809, 0x48065804, 0x480a5807, + 0x480e5808, 0x412c1000, 0x0201f800, 0x00100858, + 0x82000540, 0x00000001, 0x5c025800, 0x1c01f000, + 0x4933c857, 0x4d1c0000, 0x59cc0001, 0x82000500, + 0x00ffffff, 0x59341002, 0x82081500, 0x00ffffff, + 0x80080580, 0x0402001f, 0x497a6205, 0x4d380000, + 0x42027000, 0x00000035, 0x0201f800, 0x001093ba, + 0x5c027000, 0x04020012, 0x591c001c, 0x800001c0, + 0x0400000f, 0x497a381c, 0x591c0414, 0x8c000502, + 0x02000800, 0x001005d8, 0x84000502, 0x48023c14, + 0x591c1406, 0x82080580, 0x00000003, 0x04000006, + 0x82080580, 0x00000006, 0x04000005, 0x0401fc9e, + 0x0401f004, 0x0401f805, 0x0401f002, 0x0401f8c0, + 0x5c023800, 0x1c01f000, 0x4d2c0000, 0x591e5808, + 0x4933c857, 0x491fc857, 0x493bc857, 0x492fc857, + 0x83380580, 0x00000015, 0x040000b3, 0x83380580, + 0x00000016, 0x040200ae, 0x4d300000, 0x411e6000, + 0x59cc0207, 0x4803c857, 0x82000d00, 0x0000ff00, + 0x82040580, 0x00001700, 0x04000004, 0x82040580, + 0x00000300, 0x0402005b, 0x591c0203, 0x4803c857, + 0x82000580, 0x0000000d, 0x0400003f, 0x812e59c0, + 0x0400009a, 0x591c0202, 0x4803c857, 0x82000580, + 0x0000ffff, 0x0402007e, 0x592c020a, 0x4803c857, + 0x82000500, 0x00000003, 0x82000580, 0x00000002, + 0x04020007, 0x592c080f, 0x591c0011, 0x4803c857, + 0x4807c857, 0x80040580, 0x04020071, 0x591c0414, + 0x4803c857, 0x8c000500, 0x0402006d, 0x41780800, + 0x591c1206, 0x42000000, 0x0000000a, 0x0201f800, + 0x001066a0, 0x592c0406, 0x4803c857, 0x800001c0, + 0x0400000c, 0x80080c80, 0x04001004, 0x02020800, + 0x001005d8, 0x80001040, 0x480a5c06, 0x800811c0, + 0x04020004, 0x0201f800, 0x00108d88, 0x0401f06b, + 0x0201f800, 0x0010912a, 0x591c0817, 0x591c0018, + 0x48065808, 0x48025809, 0x59300007, 0x8c000500, + 0x02020800, 0x00100e99, 0x497a3808, 0x0201f800, + 0x000201ba, 0x0402004a, 0x411e6000, 0x0401fc3e, + 0x0401f05a, 0x0401fc6d, 0x04000013, 0x49366009, + 0x4a026406, 0x00000003, 0x492e6008, 0x591c0817, + 0x591c1018, 0x48066017, 0x480a6018, 0x4d380000, + 0x591e7403, 0x4d300000, 0x411e6000, 0x0401fc2e, + 0x5c026000, 0x0201f800, 0x000207a1, 0x5c027000, + 0x0401f046, 0x59a80039, 0x48023a05, 0x0401f043, + 0x59cc0407, 0x82000580, 0x0000000b, 0x04020025, + 0x59340a00, 0x84040d0e, 0x48066a00, 0x592c0a04, + 0x82040d00, 0x000000ff, 0x82040d80, 0x00000014, + 0x04000003, 0x4a02621d, 0x00000003, 0x59300007, + 0x8c000500, 0x02020800, 0x00100e99, 0x4d400000, + 0x42028000, 0x00000003, 0x592c0a08, 0x0201f800, + 0x00104e70, 0x0201f800, 0x000202da, 0x5c028000, + 0x497a6008, 0x4a026403, 0x00000085, 0x4a026203, + 0x00000009, 0x4a026406, 0x00000002, 0x42000800, + 0x8000404b, 0x0201f800, 0x00020721, 0x0401f01b, + 0x59cc0207, 0x82000580, 0x00002a00, 0x04020004, + 0x59a80039, 0x48023a05, 0x0401f014, 0x812e59c0, + 0x02000800, 0x001005d8, 0x4a025a04, 0x00000103, + 0x591c0007, 0x8c000500, 0x02020800, 0x00100e99, + 0x591c0402, 0x48025c06, 0x4a025a06, 0x00000003, + 0x0201f800, 0x000202c1, 0x0201f800, 0x00107911, + 0x0201f800, 0x001049b2, 0x5c026000, 0x0201f800, + 0x0002077d, 0x0401f002, 0x5c026000, 0x5c025800, + 0x1c01f000, 0x0401f819, 0x0401f7fd, 0x4933c857, + 0x83380580, 0x00000015, 0x04020004, 0x59a80039, + 0x48023a05, 0x0401f00d, 0x83380580, 0x00000016, + 0x0402000d, 0x4d300000, 0x411e6000, 0x0201f800, + 0x0010a5df, 0x0201f800, 0x000206fd, 0x0201f800, + 0x0002077d, 0x5c026000, 0x497a381c, 0x0201f800, + 0x0002077d, 0x1c01f000, 0x591c0414, 0x84000540, + 0x48023c14, 0x59cc100b, 0x4933c857, 0x491fc857, + 0x492fc857, 0x4803c857, 0x480bc857, 0x8c08153c, + 0x04000006, 0x59a80039, 0x48023a05, 0x497a381c, + 0x0201f000, 0x0002077d, 0x4d300000, 0x411e6000, + 0x0201f800, 0x00108bd7, 0x5c026000, 0x591c0406, + 0x82000580, 0x00000000, 0x02000000, 0x0002077d, + 0x591c0403, 0x82000580, 0x00000050, 0x0402000d, + 0x4d300000, 0x411e6000, 0x4a026203, 0x00000001, + 0x42000800, 0x80000043, 0x0201f800, 0x00020721, + 0x5c026000, 0x497a381c, 0x0201f000, 0x0002077d, + 0x591c0203, 0x82000580, 0x0000000d, 0x04000014, + 0x812e59c0, 0x02000800, 0x001005d8, 0x591c0203, + 0x82000580, 0x00000004, 0x04020011, 0x592c020a, + 0x8c000502, 0x0400000e, 0x4a023812, 0x0fffffff, + 0x592c0208, 0x8400051e, 0x48025a08, 0x42000000, + 0x00000001, 0x48023a14, 0x0401f021, 0x42000000, + 0x00000007, 0x48023a14, 0x0401f01d, 0x592c020a, + 0x4803c857, 0x8c000500, 0x0402000b, 0x8c000502, + 0x040007f7, 0x591c0414, 0x8c00051c, 0x040207eb, + 0x591c0011, 0x4803c857, 0x800001c0, 0x040007f0, + 0x0401f7e6, 0x8c08153a, 0x040207ed, 0x59cc000a, + 0x592c180f, 0x4803c857, 0x480fc857, 0x800c0580, + 0x040007e7, 0x59cc000a, 0x4803c857, 0x48023816, + 0x42000000, 0x00000005, 0x48023a14, 0x0201f000, + 0x00109259, 0x4933c857, 0x4d1c0000, 0x59cc0001, + 0x59341002, 0x80080580, 0x82000500, 0x00ffffff, + 0x04020041, 0x59301419, 0x0201f800, 0x00109410, + 0x02000800, 0x001005d8, 0x591c1406, 0x82080580, + 0x00000007, 0x04000038, 0x82080580, 0x00000002, + 0x04000035, 0x82080580, 0x00000000, 0x04000032, + 0x591c0202, 0x82000d80, 0x0000ffff, 0x04000004, + 0x59301a19, 0x800c0580, 0x0402002b, 0x83380580, + 0x00000015, 0x04000026, 0x4d300000, 0x4d2c0000, + 0x411e6000, 0x59325808, 0x0201f800, 0x00109037, + 0x02000800, 0x001005d8, 0x592c0204, 0x82000500, + 0x000000ff, 0x82000580, 0x00000014, 0x04000003, + 0x4a02621d, 0x00000003, 0x42028000, 0x00000003, + 0x592c0a08, 0x0201f800, 0x00104e70, 0x0201f800, + 0x000202da, 0x5c025800, 0x497a6008, 0x4a026403, + 0x00000085, 0x4a026203, 0x00000009, 0x4a026406, + 0x00000002, 0x42000800, 0x8000404b, 0x0201f800, + 0x00020721, 0x5c026000, 0x0401f003, 0x59a80039, + 0x48023a05, 0x497a381c, 0x0201f800, 0x0002077d, + 0x5c023800, 0x1c01f000, 0x4933c857, 0x4c580000, + 0x4d2c0000, 0x59325808, 0x83383580, 0x00000015, + 0x04000010, 0x59342200, 0x84102502, 0x48126a00, + 0x0201f800, 0x00109037, 0x04000066, 0x0201f800, + 0x00109597, 0x04020005, 0x4200b000, 0x00000002, + 0x0201f800, 0x0010957d, 0x0401fa0a, 0x0401f079, + 0x83cc1400, 0x00000008, 0x4200b000, 0x00000002, + 0x83341c00, 0x00000006, 0x0201f800, 0x0010855a, + 0x04020015, 0x83cc1400, 0x0000000a, 0x4200b000, + 0x00000002, 0x83341c00, 0x00000008, 0x0201f800, + 0x0010855a, 0x0402000c, 0x0201f800, 0x00102074, + 0x59342200, 0x59cc1007, 0x800811c0, 0x04000003, + 0x480a6801, 0x84102542, 0x8410251a, 0x48126a00, + 0x0401f05f, 0x4d3c0000, 0x417a7800, 0x0201f800, + 0x0010203c, 0x5c027800, 0x42000000, 0x0010b864, + 0x0201f800, 0x0010aa47, 0x59340200, 0x84000558, + 0x48026a00, 0x4d300000, 0x0201f800, 0x0002075a, + 0x02000800, 0x001005d8, 0x49366009, 0x497a6008, + 0x4a026406, 0x00000001, 0x4a026403, 0x00000001, + 0x42003000, 0x00000003, 0x0201f800, 0x0010a942, + 0x0201f800, 0x00103b25, 0x04000011, 0x41782800, + 0x42003000, 0x00000001, 0x4d400000, 0x42028000, + 0x00000029, 0x0201f800, 0x0010a43e, 0x5c028000, + 0x4a026406, 0x00000004, 0x4a026203, 0x00000007, + 0x4a026420, 0x00000001, 0x0401f009, 0x4a026203, + 0x00000001, 0x42000800, 0x0000000b, 0x0201f800, + 0x00104571, 0x0201f800, 0x0010672b, 0x5c026000, + 0x0201f800, 0x00109037, 0x04000022, 0x0201f800, + 0x00109597, 0x04020022, 0x0401f9ae, 0x0401f01d, + 0x4d3c0000, 0x417a7800, 0x0201f800, 0x0010203c, + 0x42000000, 0x0010b864, 0x0201f800, 0x0010aa47, + 0x59340200, 0x84000558, 0x48026a00, 0x42003000, + 0x00000003, 0x41782800, 0x42002000, 0x00000005, + 0x4d400000, 0x4d440000, 0x59368c03, 0x42028000, + 0x00000029, 0x0201f800, 0x0010985e, 0x5c028800, + 0x5c028000, 0x5c027800, 0x0201f800, 0x00102074, + 0x0201f800, 0x0002077d, 0x0401f002, 0x0401fca9, + 0x5c025800, 0x5c00b000, 0x1c01f000, 0x4933c857, + 0x41380000, 0x83383480, 0x00000056, 0x02021800, + 0x001005d8, 0x0c01f001, 0x00107ef7, 0x00107ef2, + 0x00107ef7, 0x00107ef7, 0x00107ef7, 0x00107ef7, + 0x00107ef0, 0x00107ef0, 0x00107ef0, 0x00107ef0, + 0x00107ef0, 0x00107ef0, 0x00107ef0, 0x00107ef0, + 0x00107ef0, 0x00107ef0, 0x00107ef0, 0x00107ef0, + 0x00107ef0, 0x00107ef0, 0x00107ef0, 0x00107ef0, + 0x00107ef0, 0x00107ef0, 0x00107ef0, 0x00107ef0, + 0x00107ef0, 0x00107ef0, 0x00107ef0, 0x00107ef0, + 0x00107ef0, 0x00107ef7, 0x00107ef0, 0x00107ef7, + 0x00107ef7, 0x00107ef0, 0x00107ef0, 0x00107ef0, + 0x00107ef0, 0x00107ef0, 0x00107ef7, 0x00107ef0, + 0x00107ef0, 0x00107ef0, 0x00107ef0, 0x00107ef0, + 0x00107ef0, 0x00107ef0, 0x00107ef0, 0x00107ef0, + 0x00107ef7, 0x00107ef7, 0x00107ef0, 0x00107ef0, + 0x00107ef0, 0x00107ef0, 0x00107ef0, 0x00107ef0, + 0x00107ef0, 0x00107ef0, 0x00107ef0, 0x00107ef7, + 0x00107ef0, 0x00107ef0, 0x00107ef7, 0x00107ef7, + 0x00107ef0, 0x00107ef7, 0x00107ef7, 0x00107ef0, + 0x00107ef0, 0x00107ef0, 0x00107ef0, 0x00107ef7, + 0x00107ef0, 0x00107ef0, 0x00107ef0, 0x00107ef7, + 0x00107ef0, 0x00107ef0, 0x00107ef0, 0x00107ef7, + 0x00107ef0, 0x00107ef0, 0x00107ef0, 0x00107ef7, + 0x0201f800, 0x001005d8, 0x4a026203, 0x00000001, + 0x493a6403, 0x0201f000, 0x0010672b, 0x4933c857, + 0x4a026203, 0x00000001, 0x493a6403, 0x0201f000, + 0x0010672b, 0x4933c857, 0x59300403, 0x82003480, + 0x00000056, 0x02021800, 0x001005d8, 0x83383580, + 0x00000013, 0x04000093, 0x83383580, 0x00000027, + 0x0402004b, 0x0201f800, 0x00106bbf, 0x0201f800, + 0x00109134, 0x0400000b, 0x0201f800, 0x0010914e, + 0x04000041, 0x59300403, 0x82000d80, 0x00000022, + 0x04020038, 0x0401fc61, 0x0400003a, 0x0401f03a, + 0x0201f800, 0x00102074, 0x42000800, 0x00000007, + 0x0201f800, 0x00104571, 0x0401f8fe, 0x4d440000, + 0x59368c03, 0x83440580, 0x000007fe, 0x04020008, + 0x59a81026, 0x84081540, 0x0201f800, 0x0010513b, + 0x04020002, 0x8408154a, 0x480b5026, 0x42028000, + 0x00000029, 0x4d3c0000, 0x417a7800, 0x0201f800, + 0x0010203c, 0x5c027800, 0x836c0580, 0x00000003, + 0x0400000c, 0x59326809, 0x59340008, 0x800001c0, + 0x04020008, 0x59368c03, 0x4933c857, 0x4937c857, + 0x4947c857, 0x0201f800, 0x001045fb, 0x0401f00c, + 0x42000000, 0x0010b864, 0x0201f800, 0x0010aa47, + 0x42003000, 0x00000015, 0x41782800, 0x42002000, + 0x00000003, 0x0201f800, 0x0010985e, 0x5c028800, + 0x0201f800, 0x00109326, 0x0201f000, 0x0002077d, + 0x1c01f000, 0x0401f8cb, 0x0401f7fa, 0x83380580, + 0x00000014, 0x0400000b, 0x0201f800, 0x00106f60, + 0x02020000, 0x00107974, 0x59300203, 0x82000580, + 0x00000002, 0x040000ed, 0x0201f800, 0x001005d8, + 0x0201f800, 0x00106bbf, 0x4d3c0000, 0x417a7800, + 0x0201f800, 0x0010203c, 0x5c027800, 0x42003000, + 0x00000016, 0x41782800, 0x4d400000, 0x4d440000, + 0x59368c03, 0x42002000, 0x00000009, 0x42028000, + 0x00000029, 0x0201f800, 0x0010985e, 0x5c028800, + 0x5c028000, 0x42000000, 0x0010b864, 0x0201f800, + 0x0010aa47, 0x0201f800, 0x00109134, 0x0402000c, + 0x0201f800, 0x00102074, 0x0401f89e, 0x59340c03, + 0x82040580, 0x000007fe, 0x040207ca, 0x59a80826, + 0x84040d40, 0x48075026, 0x0401f7c6, 0x0201f800, + 0x0010914e, 0x04020003, 0x0401f892, 0x0401f7c1, + 0x59300403, 0x82000d80, 0x00000032, 0x04020004, + 0x0201f800, 0x0010230c, 0x0401f7ba, 0x59300403, + 0x82000d80, 0x00000022, 0x04000886, 0x0401f7b5, + 0x4803c857, 0x0c01f001, 0x00108016, 0x00108016, + 0x00108016, 0x00108016, 0x00108016, 0x00108016, + 0x00107ff0, 0x00107ff0, 0x00107ff0, 0x00107ff0, + 0x00107ff0, 0x00107ff0, 0x00107ff0, 0x00107ff0, + 0x00107ff0, 0x00107ff0, 0x00107ff0, 0x00107ff0, + 0x00107ff0, 0x00107ff0, 0x00107ff0, 0x00107ff0, + 0x00107ff0, 0x00107ff0, 0x00107ff0, 0x00107ff0, + 0x00107ff0, 0x00107ff0, 0x00107ff0, 0x00107ff0, + 0x00107ff9, 0x00108016, 0x00107ff0, 0x00108016, + 0x00108016, 0x00107ff0, 0x00107ff0, 0x00107ff0, + 0x00107ff0, 0x00107ff0, 0x00108016, 0x00108016, + 0x00107ff0, 0x00107ff0, 0x00107ff0, 0x00107ff0, + 0x00107ff0, 0x00107ff0, 0x00107ff0, 0x00107ff0, + 0x00108007, 0x00108016, 0x00107ff0, 0x00108000, + 0x00107ff0, 0x00107ff0, 0x00107ff0, 0x00108000, + 0x00107ff0, 0x00107ff0, 0x00107ff0, 0x00108016, + 0x00108003, 0x00107ff0, 0x00107ff2, 0x00108016, + 0x00107ff0, 0x00108016, 0x00108016, 0x00107ff0, + 0x00107ff0, 0x00107ff0, 0x00107ff0, 0x00108016, + 0x00107ff0, 0x00107ff0, 0x00107ff0, 0x00108016, + 0x00107ff0, 0x00107ff0, 0x00107ff0, 0x00108016, + 0x00107ff0, 0x00107ff0, 0x00107ff0, 0x00108016, + 0x0201f800, 0x001005d8, 0x4d2c0000, 0x59325808, + 0x0201f800, 0x000202da, 0x5c025800, 0x0201f000, + 0x0002077d, 0x4a026203, 0x00000005, 0x59a80039, + 0x48026205, 0x59a80037, 0x48026206, 0x1c01f000, + 0x5930081e, 0x49780a05, 0x0401f014, 0x0201f800, + 0x00109326, 0x0201f000, 0x0002077d, 0x0201f800, + 0x0010230c, 0x0201f800, 0x00106c55, 0x04000005, + 0x0201f800, 0x00106bbf, 0x0201f000, 0x0002077d, + 0x0201f800, 0x00106bbf, 0x0201f800, 0x0002077d, + 0x0201f000, 0x00106c4b, 0x4933c857, 0x4a026203, + 0x00000002, 0x59a80037, 0x48026206, 0x1c01f000, + 0x4933c857, 0x0201f800, 0x00109037, 0x0400002a, + 0x4d2c0000, 0x0201f800, 0x00109597, 0x0402000a, + 0x4d400000, 0x42028000, 0x00000031, 0x42000800, + 0x00000004, 0x0201f800, 0x0010943b, 0x5c028000, + 0x0401f01c, 0x59300c06, 0x82040580, 0x00000010, + 0x04000004, 0x82040580, 0x00000011, 0x0402000a, + 0x4a025a06, 0x00000031, 0x4a02580d, 0x00000004, + 0x4a02580e, 0x000000ff, 0x0201f800, 0x000202da, + 0x0401f00c, 0x592c0404, 0x8c00051e, 0x04000009, + 0x4a025a04, 0x00000103, 0x4a025805, 0x01000000, + 0x5931d821, 0x58ef400b, 0x58ec0009, 0x0801f800, + 0x5c025800, 0x1c01f000, 0x4933c857, 0x59340400, + 0x82000500, 0x000000ff, 0x82003480, 0x0000000c, + 0x02021800, 0x001005d8, 0x59303403, 0x82180d80, + 0x0000004d, 0x02000000, 0x0010938b, 0x82180d80, + 0x00000033, 0x02000000, 0x00109349, 0x82180d80, + 0x00000028, 0x02000000, 0x0010918f, 0x82180d80, + 0x00000029, 0x02000000, 0x001091a3, 0x82180d80, + 0x0000001f, 0x02000000, 0x00107b28, 0x82180d80, + 0x00000055, 0x02000000, 0x00107b01, 0x82180d80, + 0x00000000, 0x04000591, 0x82180d80, 0x00000022, + 0x02000000, 0x00107b55, 0x82180d80, 0x00000035, + 0x02000000, 0x00107c50, 0x82180d80, 0x00000039, + 0x04000539, 0x82180d80, 0x0000003d, 0x02000000, + 0x00107b85, 0x82180d80, 0x00000044, 0x02000000, + 0x00107bc2, 0x82180d80, 0x00000049, 0x02000000, + 0x00107c17, 0x82180d80, 0x00000041, 0x02000000, + 0x00107c03, 0x82180d80, 0x00000043, 0x02000000, + 0x001094dc, 0x82180d80, 0x00000051, 0x02000000, + 0x00109542, 0x82180d80, 0x00000004, 0x04020003, + 0x42000000, 0x00000001, 0x83380d80, 0x00000015, + 0x04000006, 0x83380d80, 0x00000016, 0x02020000, + 0x00107974, 0x0401f20f, 0x4d2c0000, 0x4d3c0000, + 0x0c01f804, 0x5c027800, 0x5c025800, 0x1c01f000, + 0x001080b8, 0x001080bc, 0x001080b8, 0x00108131, + 0x001080b8, 0x00108226, 0x001082bf, 0x001080b8, + 0x001080b8, 0x00108288, 0x001080b8, 0x0010829a, + 0x4933c857, 0x497a6007, 0x59300808, 0x58040000, + 0x4a000a04, 0x00000103, 0x0201f000, 0x0002077d, + 0x4933c857, 0x40000000, 0x40000000, 0x1c01f000, + 0x4933c857, 0x59a80016, 0x82000580, 0x00000074, + 0x0402005c, 0x0201f800, 0x0010a2c8, 0x04020016, + 0x0401f85c, 0x0201f800, 0x00109037, 0x0400000c, + 0x0201f800, 0x00109597, 0x04020009, 0x41780800, + 0x4d400000, 0x42028000, 0x00000000, 0x0201f800, + 0x0010943b, 0x5c028000, 0x0401f003, 0x0201f800, + 0x00102074, 0x0201f800, 0x001048c1, 0x0201f000, + 0x0002077d, 0x0201f800, 0x00109037, 0x04000007, + 0x0201f800, 0x00109597, 0x04020004, 0x0401ff3d, + 0x0201f000, 0x0002077d, 0x417a7800, 0x0201f800, + 0x0010203c, 0x42000000, 0x0010b864, 0x0201f800, + 0x0010aa47, 0x59340200, 0x84000558, 0x48026a00, + 0x42003000, 0x00000003, 0x0201f800, 0x0010a942, + 0x4d300000, 0x0201f800, 0x0002075a, 0x02000800, + 0x001005d8, 0x49366009, 0x497a6008, 0x4a026406, + 0x00000001, 0x4a026403, 0x00000001, 0x0201f800, + 0x00103b25, 0x04000011, 0x4a026406, 0x00000004, + 0x4a026203, 0x00000007, 0x4a026420, 0x00000001, + 0x42003000, 0x00000001, 0x4d400000, 0x42028000, + 0x00000029, 0x41782800, 0x0201f800, 0x0010a43e, + 0x5c028000, 0x0401f009, 0x42000800, 0x0000000b, + 0x0201f800, 0x00104571, 0x4a026203, 0x00000001, + 0x0201f800, 0x0010672b, 0x5c026000, 0x0401ff05, + 0x0201f800, 0x00102074, 0x0201f000, 0x0002077d, + 0x0401ff00, 0x42000000, 0x00000001, 0x0401f0c7, + 0x4933c857, 0x59340200, 0x8c000500, 0x0400000d, + 0x4d3c0000, 0x417a7800, 0x0201f800, 0x00104567, + 0x5c027800, 0x0201f800, 0x00103b25, 0x04000005, + 0x42000800, 0x00000006, 0x0201f800, 0x00104571, + 0x1c01f000, 0x4933c857, 0x59a80816, 0x82040580, + 0x00000074, 0x0400000e, 0x4807c857, 0x82040580, + 0x00000100, 0x040200a0, 0x59cc0408, 0x4803c857, + 0x8c000500, 0x0400009c, 0x59341403, 0x82080580, + 0x000007fe, 0x04000006, 0x0401f097, 0x59341403, + 0x82080580, 0x000007fe, 0x04020003, 0x0401fa9c, + 0x0401f04c, 0x0201f800, 0x0010462a, 0x59341403, + 0x82080580, 0x000007fc, 0x0402001f, 0x4a026802, + 0x00fffffc, 0x0201f800, 0x00109037, 0x04000012, + 0x0201f800, 0x00109597, 0x0402000f, 0x0401f8a9, + 0x41780800, 0x4d400000, 0x42028000, 0x00000000, + 0x0201f800, 0x0010943b, 0x5c028000, 0x42000800, + 0x00000004, 0x0201f800, 0x00104571, 0x0201f000, + 0x0002077d, 0x42000800, 0x00000004, 0x0201f800, + 0x00104571, 0x0201f800, 0x00102074, 0x0201f000, + 0x0002077d, 0x59a80005, 0x8c000514, 0x04000011, + 0x0201f800, 0x0010513b, 0x42001000, 0x00000010, + 0x04020009, 0x59340002, 0x82000500, 0x00ff0000, + 0x82000580, 0x00ff0000, 0x04000006, 0x42001000, + 0x00000008, 0x0201f800, 0x00104c6d, 0x0402005a, + 0x0201f800, 0x00109037, 0x0400005b, 0x0201f800, + 0x00109597, 0x04020005, 0x592c0404, 0x8c00051c, + 0x040207c9, 0x0401f877, 0x42000800, 0x00000005, + 0x0201f800, 0x00104571, 0x4a026203, 0x00000001, + 0x4a026403, 0x00000003, 0x0201f000, 0x0010672b, + 0x59cc0408, 0x8c000518, 0x04000010, 0x0201f800, + 0x001092e5, 0x0201f800, 0x0010513b, 0x04000004, + 0x59cc0408, 0x8c000516, 0x040207b3, 0x59a80026, + 0x8400054a, 0x48035026, 0x59a80010, 0x84000570, + 0x48038832, 0x0401f7ac, 0x42001000, 0x000000ef, + 0x480b5010, 0x497b8830, 0x84081570, 0x480b8832, + 0x59c40802, 0x84040d4c, 0x48078802, 0x0201f800, + 0x0010930f, 0x59a80026, 0x84000548, 0x48035026, + 0x0201f800, 0x0010a3da, 0x0402079b, 0x59a80026, + 0x8400054c, 0x48035026, 0x42000800, 0x00000006, + 0x0201f800, 0x00104571, 0x417a7800, 0x0201f800, + 0x00104567, 0x42000000, 0x000000e8, 0x0201f800, + 0x00105c9a, 0x02000800, 0x001045a6, 0x02020800, + 0x001005d8, 0x49366009, 0x59340200, 0x8400051a, + 0x48026a00, 0x42000800, 0x00000003, 0x0201f800, + 0x00104571, 0x4a026406, 0x00000001, 0x4a026203, + 0x00000001, 0x4a026403, 0x00000002, 0x0201f000, + 0x0010672b, 0x0401fe43, 0x42000000, 0x00000001, + 0x0401f00a, 0x599c0017, 0x8c00050a, 0x040007ab, + 0x42000800, 0x00000004, 0x0201f800, 0x00104571, + 0x0201f000, 0x0002077d, 0x4933c857, 0x80003540, + 0x04000005, 0x42000800, 0x00000007, 0x0201f800, + 0x00104571, 0x801831c0, 0x0402000e, 0x59302008, + 0x801021c0, 0x04000004, 0x58100404, 0x8c00051e, + 0x04020008, 0x59341c03, 0x42002000, 0x00000004, + 0x42003000, 0x00000012, 0x0201f800, 0x00103aae, + 0x0201f800, 0x00102074, 0x0201f000, 0x0002077d, + 0x4c5c0000, 0x4d2c0000, 0x59325808, 0x0201f800, + 0x00105755, 0x5c025800, 0x59cc0008, 0x48002805, + 0x59cc0009, 0x48002806, 0x49782807, 0x49782808, + 0x49782809, 0x4978280a, 0x59cc0013, 0x8c00053e, + 0x04000009, 0x59cc0414, 0x900001c0, 0x59ccbc15, + 0x805c0540, 0x48002807, 0x59cc0416, 0x900001c0, + 0x48002808, 0x59cc0017, 0x8c00053e, 0x04000009, + 0x59cc0418, 0x900001c0, 0x59ccbc19, 0x805c0540, + 0x48002809, 0x59cc041a, 0x900001c0, 0x4800280a, + 0x5c00b800, 0x1c01f000, 0x4933c857, 0x59a80016, + 0x82000580, 0x00000014, 0x04020048, 0x59a80005, + 0x8c000514, 0x04000015, 0x0201f800, 0x0010513b, + 0x42001000, 0x00000010, 0x04020009, 0x59340002, + 0x82000500, 0x00ff0000, 0x82000580, 0x00ff0000, + 0x0400000a, 0x42001000, 0x00000008, 0x0201f800, + 0x00104c6d, 0x04000005, 0x59a80005, 0x84000556, + 0x48035005, 0x0401f031, 0x836c0580, 0x00000003, + 0x0402000b, 0x59300008, 0x80000540, 0x04020008, + 0x59341c03, 0x42002000, 0x00000006, 0x42003000, + 0x00000013, 0x0201f800, 0x00103aae, 0x0201f800, + 0x0010468d, 0x0401fecf, 0x0401fa1d, 0x0402001f, + 0x59340404, 0x80000540, 0x0400001c, 0x42000800, + 0x00000006, 0x0201f800, 0x00104571, 0x0201f800, + 0x00109037, 0x04000011, 0x0201f800, 0x00109597, + 0x0402000a, 0x41780800, 0x4d400000, 0x42028000, + 0x00000000, 0x0201f800, 0x0010943b, 0x5c028000, + 0x0201f000, 0x0002077d, 0x4a025a04, 0x00000103, + 0x4a025805, 0x02000000, 0x0201f800, 0x00102074, + 0x0201f000, 0x0002077d, 0x0201f800, 0x00104c19, + 0x0201f800, 0x00109037, 0x04000007, 0x0201f800, + 0x00109597, 0x04020004, 0x0401fda2, 0x0201f000, + 0x0002077d, 0x0401fd9f, 0x80000580, 0x59a80005, + 0x8c000516, 0x04000005, 0x84000516, 0x48035005, + 0x82000540, 0x00000001, 0x0401ff60, 0x1c01f000, + 0x4933c857, 0x59a80016, 0x82000580, 0x00000014, + 0x0402000b, 0x42000800, 0x0000000b, 0x0201f800, + 0x00104571, 0x4a026203, 0x00000001, 0x4a026403, + 0x00000001, 0x0201f000, 0x0010672b, 0x42000000, + 0x00000001, 0x0401f74d, 0x4933c857, 0x40003000, + 0x59a80016, 0x82000580, 0x00000004, 0x0402000a, + 0x82183580, 0x0000000b, 0x04020005, 0x42000800, + 0x00000007, 0x0201f800, 0x00104571, 0x0201f000, + 0x0002077d, 0x42000000, 0x00000001, 0x0401f73b, + 0x4803c857, 0x4d2c0000, 0x4d3c0000, 0x0c01f804, + 0x5c027800, 0x5c025800, 0x1c01f000, 0x001080b8, + 0x001082ce, 0x001080b8, 0x00108323, 0x001080b8, + 0x00108391, 0x001082bf, 0x001080b8, 0x001080b8, + 0x001083b1, 0x001080b8, 0x001083c1, 0x4933c857, + 0x4d1c0000, 0x59301403, 0x82080580, 0x00000003, + 0x04000008, 0x82081580, 0x0000001e, 0x04020003, + 0x0201f800, 0x0002077d, 0x5c023800, 0x1c01f000, + 0x0401ff5a, 0x0401f7fd, 0x4933c857, 0x0201f800, + 0x00109037, 0x0400000b, 0x0201f800, 0x00109597, + 0x04020008, 0x4200b000, 0x00000002, 0x0201f800, + 0x0010957d, 0x0401fd43, 0x0201f000, 0x0002077d, + 0x0401f8f5, 0x04020030, 0x417a7800, 0x0201f800, + 0x00104567, 0x417a7800, 0x0201f800, 0x0010203c, + 0x42000000, 0x0010b864, 0x0201f800, 0x0010aa47, + 0x59340200, 0x84000558, 0x48026a00, 0x4a026403, + 0x00000002, 0x42003000, 0x00000003, 0x0201f800, + 0x0010a942, 0x0201f800, 0x00103b25, 0x04000011, + 0x4d400000, 0x41782800, 0x42003000, 0x00000005, + 0x42028000, 0x00000029, 0x0201f800, 0x0010a43e, + 0x5c028000, 0x4a026203, 0x00000007, 0x4a026406, + 0x00000004, 0x4a026420, 0x00000001, 0x1c01f000, + 0x42000800, 0x00000003, 0x0201f800, 0x00104571, + 0x4a026203, 0x00000001, 0x0201f800, 0x0010672b, + 0x0401f7f7, 0x59cc0407, 0x82000580, 0x00000009, + 0x0402000a, 0x59340412, 0x82000500, 0x000000ff, + 0x0400000c, 0x80000040, 0x48026c12, 0x4a026206, + 0x0000000a, 0x0401f7ea, 0x59cc0207, 0x82000500, + 0x0000ff00, 0x82000580, 0x00001900, 0x040007c2, + 0x0401fcfc, 0x80000580, 0x0401f6c4, 0x4933c857, + 0x59a80032, 0x80000540, 0x04000015, 0x59340403, + 0x82000580, 0x000007fe, 0x04020011, 0x59a80010, + 0x80000000, 0x48035010, 0x417a7800, 0x0201f800, + 0x00104567, 0x42000800, 0x00000003, 0x0201f800, + 0x00104571, 0x4a026203, 0x00000001, 0x4a026403, + 0x00000002, 0x0201f000, 0x0010672b, 0x0201f800, + 0x00109037, 0x04000011, 0x0201f800, 0x00109597, + 0x0402000e, 0x4c580000, 0x4200b000, 0x00000002, + 0x0201f800, 0x0010957d, 0x5c00b000, 0x0401fcd5, + 0x42000800, 0x00000007, 0x0201f800, 0x00104571, + 0x0201f000, 0x0002077d, 0x0401fcce, 0x59cc3407, + 0x82183500, 0x000000ff, 0x82180580, 0x00000005, + 0x0400001c, 0x82180580, 0x0000000b, 0x04000016, + 0x59cc0207, 0x82000500, 0x0000ff00, 0x04020004, + 0x82180580, 0x00000009, 0x04000012, 0x82000580, + 0x00001900, 0x0402000c, 0x82180580, 0x00000009, + 0x0400000c, 0x42000800, 0x00000004, 0x0201f800, + 0x00104571, 0x0201f800, 0x00102074, 0x0201f000, + 0x0002077d, 0x42000000, 0x00000001, 0x0401f677, + 0x0201f800, 0x00109037, 0x59325808, 0x04000008, + 0x592c0204, 0x82000580, 0x00000139, 0x040007f6, + 0x592c0404, 0x8c00051e, 0x040207f3, 0x59340403, + 0x82000580, 0x000007fe, 0x04020007, 0x59a80026, + 0x84000540, 0x48035026, 0x0201f800, 0x00104229, + 0x0401f7e9, 0x417a7800, 0x0201f800, 0x0010203c, + 0x42003000, 0x00000005, 0x0201f800, 0x0010a942, + 0x42000000, 0x0010b864, 0x0201f800, 0x0010aa47, + 0x0401f7dd, 0x4933c857, 0x0401f84d, 0x0402000b, + 0x42000800, 0x00000005, 0x0201f800, 0x00104571, + 0x4a026203, 0x00000001, 0x4a026403, 0x00000003, + 0x0201f000, 0x0010672b, 0x42000800, 0x00000004, + 0x0201f800, 0x00104571, 0x0201f800, 0x00109597, + 0x0402000a, 0x4c580000, 0x4200b000, 0x00000002, + 0x0201f800, 0x0010957d, 0x5c00b000, 0x0401fc71, + 0x0201f000, 0x0002077d, 0x0401fc6e, 0x80000580, + 0x0401f636, 0x4933c857, 0x0401f82d, 0x0402000b, + 0x42000800, 0x00000009, 0x0201f800, 0x00104571, + 0x4a026203, 0x00000001, 0x4a026403, 0x00000005, + 0x0201f000, 0x0010672b, 0x42000000, 0x00000001, + 0x0401f626, 0x4933c857, 0x0401f81d, 0x0402000b, + 0x42000800, 0x0000000b, 0x0201f800, 0x00104571, + 0x4a026203, 0x00000001, 0x4a026403, 0x00000001, + 0x0201f000, 0x0010672b, 0x42000000, 0x00000001, + 0x0401f616, 0x4933c857, 0x59cc0407, 0x82000580, + 0x00000003, 0x04020009, 0x59cc0207, 0x82000500, + 0x0000ff00, 0x82000d80, 0x00002a00, 0x04000003, + 0x82000d80, 0x00001e00, 0x1c01f000, 0x4933c857, + 0x82000540, 0x00000001, 0x1c01f000, 0x4933c857, + 0x4d400000, 0x4c580000, 0x59a80026, 0x82000540, + 0x00000003, 0x48035026, 0x0401f85c, 0x04000038, + 0x4d340000, 0x4d440000, 0x59a80026, 0x84000552, + 0x48035026, 0x0201f800, 0x00103b25, 0x0400000c, + 0x42028000, 0x0000002a, 0x42028800, 0x0000ffff, + 0x42003000, 0x00000002, 0x0201f800, 0x0010a446, + 0x59a80805, 0x84040d44, 0x48075005, 0x42028000, + 0x0000002a, 0x4d3c0000, 0x42027800, 0x00000204, + 0x0201f800, 0x00101fe5, 0x5c027800, 0x42000000, + 0x0010b864, 0x0201f800, 0x0010aa47, 0x0201f800, + 0x00101e45, 0x4200b000, 0x00000010, 0x42028800, + 0x000007f0, 0x4d2c0000, 0x83440580, 0x000007fe, + 0x04000003, 0x0201f800, 0x001045fb, 0x81468800, + 0x8058b040, 0x040207f9, 0x5c025800, 0x59cc0408, + 0x8c00051e, 0x04000004, 0x59a80026, 0x84000512, + 0x48035026, 0x5c028800, 0x5c026800, 0x0201f800, + 0x0010462a, 0x4a026802, 0x00fffffe, 0x59a80826, + 0x84040d50, 0x59cc0013, 0x8c00053e, 0x04000003, + 0x8c000536, 0x04000004, 0x59cc0017, 0x8c000536, + 0x04020002, 0x84040d10, 0x48075026, 0x59cc0800, + 0x82040d00, 0x00ffffff, 0x48075010, 0x80040110, + 0x4803501d, 0x48038881, 0x0201f800, 0x0010513b, + 0x04000007, 0x59cc0009, 0x48035035, 0x59cc000a, + 0x48035036, 0x0201f800, 0x001092e5, 0x5c00b000, + 0x5c028000, 0x1c01f000, 0x4933c857, 0x4c580000, + 0x59a80010, 0x82000500, 0x00ffff00, 0x04000022, + 0x59cc1000, 0x82081500, 0x00ffff00, 0x80080580, + 0x04000004, 0x42000000, 0x0010b83b, 0x0401f016, + 0x83cc1400, 0x0000000b, 0x4200b000, 0x00000002, + 0x83341c00, 0x00000006, 0x0401f900, 0x04000004, + 0x42000000, 0x0010b83c, 0x0401f00b, 0x83cc1400, + 0x0000000d, 0x4200b000, 0x00000002, 0x83341c00, + 0x00000008, 0x0401f8f5, 0x04000007, 0x42000000, + 0x0010b83d, 0x0201f800, 0x0010aa47, 0x82000540, + 0x00000001, 0x5c00b000, 0x1c01f000, 0x4933c857, + 0x59cc0206, 0x82000580, 0x00000014, 0x04020016, + 0x59cc0407, 0x82000580, 0x00000800, 0x04020012, + 0x59cc0207, 0x8c00051a, 0x0400000d, 0x82000500, + 0x00000f00, 0x82000580, 0x00000100, 0x04020008, + 0x59cc020a, 0x8c000508, 0x04020003, 0x8c00050a, + 0x04000003, 0x80000580, 0x1c01f000, 0x82000540, + 0x00000001, 0x1c01f000, 0x4933c857, 0x4943c857, + 0x493fc857, 0x4c5c0000, 0x4d300000, 0x4d340000, + 0x4d2c0000, 0x4d380000, 0x4130b800, 0x42026000, + 0x0010d1c0, 0x59a8000e, 0x81640480, 0x040210bd, + 0x8d3e7d12, 0x04000004, 0x405c0000, 0x81300580, + 0x040000b3, 0x59300406, 0x82000c80, 0x00000012, + 0x04021015, 0x59326809, 0x0c01f001, 0x0010854f, + 0x001084bc, 0x001084d3, 0x001084de, 0x001084b7, + 0x001084ce, 0x00108507, 0x0010854f, 0x001084b5, + 0x0010851b, 0x0010852a, 0x001084b5, 0x001084b5, + 0x001084b5, 0x001084b5, 0x0010854f, 0x00108540, + 0x00108538, 0x0201f800, 0x001005d8, 0x8d3e7d18, + 0x04000004, 0x59300420, 0x8c000500, 0x04020094, + 0x59300403, 0x82000580, 0x00000043, 0x04000090, + 0x0201f800, 0x00109134, 0x02000800, 0x00102074, + 0x0201f800, 0x0010914e, 0x02000800, 0x0010801c, + 0x8d3e7d06, 0x04000084, 0x0201f800, 0x001092d7, + 0x04000083, 0x0401f080, 0x8d3e7d16, 0x04000004, + 0x59300420, 0x8c000500, 0x0402007d, 0x59325808, + 0x0201f800, 0x00109037, 0x04000077, 0x49425a06, + 0x497a5c09, 0x0201f800, 0x000202da, 0x0201f800, + 0x0010912a, 0x0401f070, 0x813669c0, 0x02000800, + 0x001005d8, 0x8d3e7d06, 0x04000004, 0x59340200, + 0x8c00050e, 0x0402006a, 0x59300004, 0x8400055c, + 0x48026004, 0x59300203, 0x82000580, 0x00000004, + 0x02000800, 0x00100e99, 0x59325808, 0x0201f800, + 0x00109037, 0x0400005c, 0x4a025a04, 0x00000103, + 0x59300402, 0x48025c06, 0x592c0408, 0x8c000512, + 0x04000006, 0x4d2c0000, 0x592e5809, 0x0201f800, + 0x001007fd, 0x5c025800, 0x49425a06, 0x497a5c09, + 0x0201f800, 0x0010959c, 0x0201f800, 0x000202da, + 0x0201f800, 0x0010912a, 0x0401f047, 0x8c000518, + 0x04000047, 0x59300203, 0x82000580, 0x00000004, + 0x02000800, 0x00100e99, 0x59325808, 0x0201f800, + 0x00109037, 0x0400003c, 0x49425a06, 0x497a5c09, + 0x0201f800, 0x0010a693, 0x0201f800, 0x0010959c, + 0x0201f800, 0x000202da, 0x0401f033, 0x0201f800, + 0x001062d5, 0x04000032, 0x59300203, 0x82000580, + 0x00000004, 0x04020004, 0x0201f800, 0x00100e99, + 0x0401f02b, 0x42027000, 0x00000047, 0x0201f800, + 0x000207a1, 0x0401f026, 0x59300203, 0x82000580, + 0x00000004, 0x02000800, 0x00100e99, 0x59325808, + 0x0201f800, 0x00109037, 0x0400001b, 0x49425a06, + 0x497a5c09, 0x0201f800, 0x000202da, 0x0401f016, + 0x833c0500, 0x00001800, 0x04000015, 0x8d3e7d16, + 0x04020013, 0x59325817, 0x0201f800, 0x001007fd, + 0x59300203, 0x82000580, 0x00000004, 0x02000800, + 0x00100e99, 0x59325808, 0x0201f800, 0x00109037, + 0x04000005, 0x49425a06, 0x497a5c09, 0x0201f800, + 0x000202da, 0x0201f800, 0x00107911, 0x83326400, + 0x00000024, 0x41580000, 0x81300480, 0x04001742, + 0x5c027000, 0x5c025800, 0x5c026800, 0x5c026000, + 0x5c00b800, 0x1c01f000, 0x5c000000, 0x4c000000, + 0x4803c857, 0x480bc857, 0x480fc857, 0x485bc857, + 0x50080800, 0x500c0000, 0x80042580, 0x04020007, + 0x80081000, 0x800c1800, 0x8058b040, 0x040207f9, + 0x80000580, 0x1c01f000, 0x4803c857, 0x4807c857, + 0x480bc857, 0x480fc857, 0x80040480, 0x04001006, + 0x42000000, 0x00000001, 0x82040d40, 0x00000001, + 0x1c01f000, 0x41780000, 0x0401f7fc, 0x83380480, + 0x00000053, 0x02021800, 0x001005d8, 0x83380480, + 0x0000004b, 0x02001800, 0x001005d8, 0x0c01f001, + 0x0010858a, 0x0010858a, 0x0010858a, 0x0010858a, + 0x00108588, 0x00108588, 0x00108588, 0x0010858a, + 0x0201f800, 0x001005d8, 0x493bc857, 0x4a026203, + 0x0000000d, 0x493a6403, 0x42000800, 0x80000000, + 0x0201f000, 0x00020721, 0x83380580, 0x00000013, + 0x04020008, 0x59300403, 0x82000580, 0x00000050, + 0x02020800, 0x001005d8, 0x0201f000, 0x0002077d, + 0x4933c857, 0x83380580, 0x00000027, 0x04020030, + 0x4933c857, 0x0201f800, 0x00106bbf, 0x4d3c0000, + 0x417a7800, 0x0201f800, 0x0010203c, 0x5c027800, + 0x42000000, 0x0010b864, 0x0201f800, 0x0010aa47, + 0x4d2c0000, 0x59325808, 0x0201f800, 0x00109037, + 0x492fc857, 0x0400000d, 0x4a025a04, 0x00000103, + 0x59300c02, 0x48065c06, 0x4a025a06, 0x00000029, + 0x497a5c09, 0x592c0c08, 0x84040d50, 0x48065c08, + 0x0201f800, 0x000202da, 0x5c025800, 0x42003000, + 0x00000015, 0x41782800, 0x42002000, 0x00000003, + 0x4d400000, 0x4d440000, 0x59368c03, 0x42028000, + 0x00000029, 0x0201f800, 0x0010985e, 0x5c028800, + 0x5c028000, 0x0201f000, 0x0002077d, 0x83380580, + 0x00000014, 0x0402000c, 0x59300403, 0x82000c80, + 0x00000053, 0x02021800, 0x001005d8, 0x82000480, + 0x00000040, 0x02001800, 0x001005d8, 0x4803c857, + 0x0c01f00e, 0x83380580, 0x00000053, 0x0400000a, + 0x83380580, 0x00000048, 0x02020800, 0x001005d8, + 0x59300403, 0x82000580, 0x00000050, 0x02020800, + 0x001005d8, 0x1c01f000, 0x001085ff, 0x001085fd, + 0x001085fd, 0x001085fd, 0x001085fd, 0x001085fd, + 0x001085fd, 0x001085fd, 0x001085fd, 0x001085fd, + 0x001085fd, 0x00108616, 0x00108616, 0x00108616, + 0x00108616, 0x001085fd, 0x00108616, 0x001085fd, + 0x00108616, 0x0201f800, 0x001005d8, 0x4933c857, + 0x0201f800, 0x00106bbf, 0x0201f800, 0x00109037, + 0x02000000, 0x0002077d, 0x4d2c0000, 0x59325808, + 0x4a025a04, 0x00000103, 0x59300402, 0x48025c06, + 0x4a025a06, 0x00000006, 0x497a5c09, 0x0201f800, + 0x000202da, 0x5c025800, 0x0201f800, 0x0010912a, + 0x0201f000, 0x0002077d, 0x4933c857, 0x0201f800, + 0x00106bbf, 0x0201f000, 0x0002077d, 0x0201f800, + 0x001005d8, 0x5930001c, 0x800001c0, 0x02020800, + 0x0010984e, 0x59300004, 0x8c00053e, 0x04020029, + 0x59325808, 0x592c0c08, 0x59cc2a08, 0x82141d00, + 0x00000c00, 0x04000002, 0x59cc1809, 0x84040d58, + 0x48065c08, 0x82143500, 0x00000fff, 0x04020027, + 0x59340200, 0x8c00050e, 0x04020080, 0x0201f800, + 0x0002082b, 0x04020006, 0x4a025a06, 0x00000000, + 0x59300811, 0x800409c0, 0x0402094b, 0x4a025a04, + 0x00000103, 0x48065807, 0x480e580a, 0x48165c09, + 0x59300c02, 0x48065c06, 0x0201f800, 0x000202c1, + 0x0201f800, 0x001049b2, 0x59cc0208, 0x8c000518, + 0x02020000, 0x001091d1, 0x0201f000, 0x0002077d, + 0x0201f800, 0x00106f60, 0x040007d6, 0x4d3c0000, + 0x42027800, 0x00000002, 0x0201f800, 0x00108be3, + 0x5c027800, 0x0401f7cf, 0x4817c857, 0x480fc857, + 0x82180500, 0x000000ff, 0x0400000e, 0x592c0204, + 0x82000500, 0x000000ff, 0x82000580, 0x00000048, + 0x04020008, 0x592c0407, 0x800001c0, 0x04000005, + 0x0201f800, 0x0010973f, 0x0201f000, 0x00109787, + 0x82180d00, 0x00000c00, 0x04000004, 0x59340200, + 0x8c00050e, 0x04020032, 0x4a025a06, 0x00000000, + 0x41782000, 0x8c183510, 0x04000007, 0x59cc000c, + 0x82000500, 0x000000ff, 0x04000002, 0x4803c857, + 0x59cc200b, 0x4812580c, 0x41780000, 0x8c183512, + 0x04000002, 0x59cc000a, 0x4802580b, 0x80100c00, + 0x040007b8, 0x82041480, 0x0000001d, 0x04001006, + 0x592c0404, 0x8c00051e, 0x0400000e, 0x42000800, + 0x0000001c, 0x4c500000, 0x4c540000, 0x83cca400, + 0x0000000c, 0x832cac00, 0x0000000d, 0x0201f800, + 0x00108b9f, 0x5c00a800, 0x5c00a000, 0x0401f7a5, + 0x59300011, 0x59301402, 0x480a5c06, 0x48025807, + 0x480e580a, 0x48165c09, 0x0201f800, 0x00108b48, + 0x0201f800, 0x00108b84, 0x0401f7a6, 0x592c020a, + 0x8c000502, 0x040007cd, 0x592c0208, 0x8c00050e, + 0x040207ca, 0x59300011, 0x800c0d80, 0x040007c7, + 0x4803c857, 0x480fc857, 0x8c183514, 0x02000000, + 0x0010920f, 0x80000540, 0x040007c0, 0x4807c856, + 0x0201f000, 0x0010920f, 0x592c020a, 0x8c000502, + 0x04000782, 0x59300011, 0x800001c0, 0x0400077f, + 0x592c0208, 0x8c00050e, 0x0402077c, 0x0201f000, + 0x0010920f, 0x59cc2006, 0x59cc2807, 0x0401f035, + 0x0401f034, 0x1c01f000, 0x4933c857, 0x5930001c, + 0x800001c0, 0x02020800, 0x0010984e, 0x59325808, + 0x592c0c08, 0x41782800, 0x41781800, 0x84040d58, + 0x48065c08, 0x41783000, 0x59340200, 0x8c00050e, + 0x04020018, 0x0201f800, 0x0002082b, 0x04020007, + 0x4a025a06, 0x00000000, 0x59300811, 0x4807c857, + 0x800409c0, 0x040208ac, 0x4a025a04, 0x00000103, + 0x48065807, 0x480e580a, 0x48165c09, 0x4933c857, + 0x59300c02, 0x48065c06, 0x0201f800, 0x000202c1, + 0x0201f800, 0x001049b2, 0x0201f000, 0x0002077d, + 0x592c020a, 0x8c000502, 0x040007ea, 0x59300011, + 0x4803c857, 0x800001c0, 0x040007e6, 0x592c0208, + 0x8c00050e, 0x040207e3, 0x0201f000, 0x0010920f, + 0x5930001c, 0x800001c0, 0x4c100000, 0x4c140000, + 0x02020800, 0x0010984e, 0x5c002800, 0x5c002000, + 0x4a026203, 0x00000002, 0x4a026403, 0x00000043, + 0x59325808, 0x592c020a, 0x8c000502, 0x04020018, + 0x40100000, 0x592c080f, 0x80040c80, 0x40140000, + 0x80040480, 0x04001014, 0x48126013, 0x48166011, + 0x59300004, 0x8c00053e, 0x04020008, 0x497a6205, + 0x0201f800, 0x00100f93, 0x04020009, 0x59300804, + 0x0201f000, 0x00106721, 0x0201f800, 0x00106f60, + 0x040007f7, 0x0201f000, 0x00107974, 0x4933c857, + 0x1c01f000, 0x4807c857, 0x40042800, 0x0401f7eb, + 0x83380480, 0x00000058, 0x04021005, 0x83380480, + 0x00000040, 0x04001002, 0x0c01f002, 0x1c01f000, + 0x00108740, 0x00108740, 0x00108740, 0x00108740, + 0x00108740, 0x00108740, 0x00108740, 0x00108740, + 0x00108740, 0x00108740, 0x00108742, 0x00108740, + 0x00108740, 0x00108740, 0x00108740, 0x0010874f, + 0x00108740, 0x00108740, 0x00108740, 0x00108740, + 0x0010877d, 0x00108740, 0x00108740, 0x00108740, + 0x0201f800, 0x001005d8, 0x4933c857, 0x0201f800, + 0x00106dc3, 0x4a026203, 0x00000002, 0x59a80039, + 0x48026205, 0x59300011, 0x59300815, 0x80040c80, + 0x48066015, 0x0201f000, 0x00106b8a, 0x4933c857, + 0x0201f800, 0x00106b8a, 0x4d3c0000, 0x417a7800, + 0x0201f800, 0x0010203c, 0x5c027800, 0x42000000, + 0x0010b864, 0x0201f800, 0x0010aa47, 0x0201f800, + 0x00109037, 0x04000010, 0x4d2c0000, 0x59325808, + 0x4a025a04, 0x00000103, 0x59300402, 0x48025c06, + 0x4a025a06, 0x00000029, 0x497a5c09, 0x592c0c08, + 0x84040d50, 0x48065c08, 0x0201f800, 0x000202da, + 0x5c025800, 0x42003000, 0x00000014, 0x41782800, + 0x4d400000, 0x4d440000, 0x59368c03, 0x42002000, + 0x00000002, 0x42028000, 0x00000029, 0x0201f800, + 0x0010985e, 0x5c028800, 0x5c028000, 0x0201f000, + 0x0002077d, 0x4933c857, 0x59300808, 0x49780c09, + 0x4978080a, 0x58041408, 0x84081558, 0x48080c08, + 0x1c01f000, 0x4807c857, 0x8c040d3e, 0x04020023, + 0x497a5a06, 0x5930001f, 0x80000540, 0x04000017, + 0x497a5a06, 0x4c040000, 0x4c080000, 0x4c0c0000, + 0x4c100000, 0x4c140000, 0x58f41003, 0x40040000, + 0x80081480, 0x5930001f, 0x4809e803, 0x0201f800, + 0x00100d56, 0x5c002800, 0x5c002000, 0x5c001800, + 0x5c001000, 0x5c000800, 0x592c0206, 0x80000540, + 0x04020009, 0x0401f005, 0x592c0408, 0x8c00051c, + 0x04000002, 0x592c0803, 0x4807c857, 0x4a025a06, + 0x00000015, 0x1c01f000, 0x5930001f, 0x80000540, + 0x04000009, 0x4a025a06, 0x00000011, 0x5930001f, + 0x4c040000, 0x0201f800, 0x00100d56, 0x5c000800, + 0x0401f7f5, 0x4807c856, 0x4a025a06, 0x00000007, + 0x1c01f000, 0x83380480, 0x00000058, 0x04021007, + 0x83380480, 0x00000040, 0x04001004, 0x4d2c0000, + 0x0c01f803, 0x5c025800, 0x1c01f000, 0x001087db, + 0x001087db, 0x001087db, 0x001087db, 0x001087db, + 0x001087dd, 0x001087db, 0x001087db, 0x00108860, + 0x001087db, 0x001087db, 0x001087db, 0x001087db, + 0x001087db, 0x001087db, 0x001087db, 0x001087db, + 0x001087db, 0x001087db, 0x00108910, 0x00108939, + 0x00108918, 0x001087db, 0x00108945, 0x0201f800, + 0x001005d8, 0x5930001c, 0x800001c0, 0x02020800, + 0x0010984e, 0x59300007, 0x8c00050e, 0x0400007c, + 0x8c000500, 0x0400006e, 0x8c00051c, 0x04000009, + 0x84000500, 0x48026007, 0x59325808, 0x592c3c08, + 0x841c3d58, 0x481e5c08, 0x0201f000, 0x000207dd, + 0x59325808, 0x592c3c08, 0x841c3d58, 0x59300007, + 0x8c00051c, 0x040207f3, 0x481e5c08, 0x42000000, + 0x00000005, 0x40000000, 0x80000040, 0x040207fe, + 0x59300007, 0x8c00051c, 0x040207ea, 0x59cc0a08, + 0x592c0204, 0x82000500, 0x000000ff, 0x82000580, + 0x00000048, 0x0402000c, 0x497a580b, 0x82040500, + 0x000000ff, 0x04000008, 0x592c0407, 0x800001c0, + 0x04000005, 0x0201f800, 0x0010973f, 0x0201f000, + 0x00100e56, 0x48065c09, 0x41782000, 0x82040500, + 0x00000c00, 0x04000002, 0x59cc2009, 0x82043500, + 0x00000fff, 0x04020027, 0x481e5c08, 0x4a025a06, + 0x00000000, 0x801831c0, 0x02000000, 0x00100e56, + 0x41782000, 0x8c183510, 0x04000002, 0x59cc200b, + 0x4812580c, 0x41780000, 0x8c183512, 0x04000002, + 0x59cc000a, 0x4802580b, 0x80100c00, 0x02001800, + 0x001005d8, 0x02000000, 0x00100e56, 0x82041480, + 0x0000001d, 0x0402100c, 0x4c500000, 0x4c540000, + 0x83cca400, 0x0000000c, 0x832cac00, 0x0000000d, + 0x0401fb67, 0x5c00a800, 0x5c00a000, 0x0201f000, + 0x00100e56, 0x0401fb0b, 0x0201f000, 0x00100e56, + 0x412c7800, 0x0201f800, 0x001007e4, 0x02000800, + 0x001005d8, 0x492c7809, 0x841c3d52, 0x481c7c08, + 0x4a025a04, 0x00000103, 0x4812580a, 0x48065c09, + 0x583c0404, 0x583c1005, 0x583c2208, 0x48025c04, + 0x480a5805, 0x48125a08, 0x0401f7c8, 0x8c000524, + 0x04000794, 0x59325808, 0x4c000000, 0x592c0408, + 0x8c00051c, 0x5c000000, 0x04020003, 0x4a026011, + 0xffffffff, 0x84000524, 0x0401f78a, 0x1c01f000, + 0x59a80039, 0x48026205, 0x59325808, 0x4a026203, + 0x00000002, 0x592c2408, 0x59300807, 0x4933c857, + 0x4807c857, 0x592c0204, 0x82000500, 0x000000ff, + 0x82000580, 0x00000048, 0x04020004, 0x8c102500, + 0x02020000, 0x00109787, 0x4a025a06, 0x00000000, + 0x8c040d1e, 0x04000027, 0x41780800, 0x497a5c09, + 0x592c1c09, 0x59300011, 0x59341200, 0x497a6205, + 0x8c08150e, 0x0402006e, 0x4807c857, 0x4806580a, + 0x80000d40, 0x04020f04, 0x59300402, 0x48025c06, + 0x48065807, 0x4a025a04, 0x00000103, 0x4c040000, + 0x4c0c0000, 0x4c100000, 0x0201f800, 0x0010959c, + 0x5c002000, 0x5c001800, 0x5c000800, 0x8c102512, + 0x0402001a, 0x4c0c0000, 0x0201f800, 0x000202c1, + 0x0201f800, 0x001049b2, 0x5c001800, 0x8c0c1d18, + 0x02000000, 0x0002077d, 0x0201f000, 0x001091d1, + 0x4813c857, 0x8c102518, 0x0400004b, 0x41780800, + 0x592c1c09, 0x820c0580, 0x00001000, 0x040007d6, + 0x8c102512, 0x040007d4, 0x592c7809, 0x583c080a, + 0x583c1c09, 0x0401f7d0, 0x4807c857, 0x592c7809, + 0x59300402, 0x592c1404, 0x8c08151e, 0x0402000d, + 0x592c1206, 0x48007c06, 0x48047807, 0x48087a06, + 0x84102512, 0x48107c08, 0x4c0c0000, 0x0201f800, + 0x001007fd, 0x403e5800, 0x0401faca, 0x0401f7d9, + 0x48025c06, 0x48065807, 0x583c080c, 0x583c000b, + 0x80040c00, 0x82041480, 0x0000001d, 0x04001006, + 0x583c1001, 0x480a5801, 0x49787801, 0x42000800, + 0x0000001c, 0x82040c00, 0x00000014, 0x4c0c0000, + 0x4c500000, 0x4c540000, 0x823ca400, 0x00000008, + 0x832cac00, 0x00000008, 0x4c100000, 0x4c3c0000, + 0x0401facb, 0x5c007800, 0x5c002000, 0x5c00a800, + 0x5c00a000, 0x84102512, 0x48125c08, 0x403e5800, + 0x0201f800, 0x001007fd, 0x42034000, 0x0010b4a4, + 0x59a1d81e, 0x80edd9c0, 0x02000800, 0x001005d8, + 0x48efc857, 0x58ec0009, 0x4803c857, 0x0801f800, + 0x0401f7ac, 0x4933c857, 0x1c01f000, 0x59301414, + 0x480bc857, 0x8c08151c, 0x0402000e, 0x80000540, + 0x4803c857, 0x0400078d, 0x80042c80, 0x0402178b, + 0x8c081514, 0x04020005, 0x592c080f, 0x4807c857, + 0x80040480, 0x48026016, 0x8408155c, 0x480a6414, + 0x59301007, 0x8408151e, 0x480a6007, 0x4a025c09, + 0x00000001, 0x0201f800, 0x0010959c, 0x497a5c09, + 0x8c102512, 0x04000006, 0x4d2c0000, 0x403e5800, + 0x0201f800, 0x001007fd, 0x5c025800, 0x82102500, + 0xffffedff, 0x48125c08, 0x0201f000, 0x0010920f, + 0x59325808, 0x592c0408, 0x8c000518, 0x04000004, + 0x412df800, 0x0201f000, 0x00100e6f, 0x1c01f000, + 0x4933c857, 0x59325808, 0x497a5c09, 0x4a025a06, + 0x00000000, 0x4a025a04, 0x00000103, 0x59300811, + 0x4807c857, 0x800409c0, 0x0402000a, 0x48065807, + 0x59300c02, 0x48065c06, 0x0201f800, 0x000202c1, + 0x0201f800, 0x001049b2, 0x0201f000, 0x0002077d, + 0x59340200, 0x8c00050e, 0x04020005, 0x59300811, + 0x0401fe55, 0x48065807, 0x0401f7f2, 0x592c0208, + 0x8c00050e, 0x040207fa, 0x4933c857, 0x0201f000, + 0x0010920f, 0x4933c857, 0x59325808, 0x812e59c0, + 0x02000800, 0x001005d8, 0x592c020a, 0x8c000502, + 0x02000800, 0x001005d8, 0x4a026206, 0x00000002, + 0x1c01f000, 0x5930001c, 0x800001c0, 0x02020800, + 0x0010984e, 0x59300007, 0x4933c857, 0x4803c857, + 0x8c00050e, 0x04000037, 0x8c000500, 0x04000029, + 0x8c00051c, 0x0400000a, 0x84000500, 0x48026007, + 0x59325808, 0x592c3c08, 0x481fc857, 0x841c3d58, + 0x481e5c08, 0x0201f000, 0x000207dd, 0x59325808, + 0x592c3c08, 0x841c3d58, 0x59300007, 0x8c00051c, + 0x040207f2, 0x481e5c08, 0x42000000, 0x00000005, + 0x40000000, 0x80000040, 0x040207fe, 0x59300007, + 0x8c00051c, 0x040207e9, 0x592c0204, 0x82000500, + 0x000000ff, 0x82000580, 0x00000048, 0x04020003, + 0x497a580b, 0x0401f002, 0x497a5c09, 0x481e5c08, + 0x4a025a06, 0x00000000, 0x0201f000, 0x00100e56, + 0x8c000524, 0x040007d9, 0x59325808, 0x4c000000, + 0x592c0408, 0x8c00051c, 0x5c000000, 0x04020003, + 0x4a026011, 0xffffffff, 0x84000524, 0x0401f7cf, + 0x1c01f000, 0x4933c857, 0x41780800, 0x83380480, + 0x00000058, 0x0402100b, 0x83380480, 0x00000040, + 0x04001008, 0x4d2c0000, 0x59325808, 0x812e59c0, + 0x0c020806, 0x5c025800, 0x0201f000, 0x0002077d, + 0x493bc857, 0x1c01f000, 0x001089ae, 0x001089ae, + 0x001089ae, 0x001089ae, 0x001089ae, 0x001089b0, + 0x001089ae, 0x001089ae, 0x001089ae, 0x001089ae, + 0x001089ae, 0x001089ae, 0x001089ae, 0x001089ae, + 0x001089ae, 0x001089ae, 0x001089ae, 0x001089ae, + 0x001089ae, 0x001089ae, 0x001089b5, 0x001089ae, + 0x001089ae, 0x001089ae, 0x0201f800, 0x001005d8, + 0x59cc0a08, 0x497a5807, 0x4807c857, 0x82040d00, + 0x00000fff, 0x59300402, 0x48025c06, 0x4a025a04, + 0x00000103, 0x48065c09, 0x4a025a06, 0x00000000, + 0x800409c0, 0x02000000, 0x000202c1, 0x59cc0009, + 0x4802580a, 0x82042500, 0x00000100, 0x04000002, + 0x59cc200b, 0x4812580c, 0x82040500, 0x00000200, + 0x04000002, 0x59cc000a, 0x4802580b, 0x80100c00, + 0x02001800, 0x001005d8, 0x02000000, 0x000202da, + 0x82041480, 0x0000001d, 0x04001006, 0x592c0404, + 0x8c00051e, 0x0400000e, 0x42000800, 0x0000001c, + 0x4c500000, 0x4c540000, 0x83cca400, 0x0000000c, + 0x832cac00, 0x0000000d, 0x0401f9c1, 0x5c00a800, + 0x5c00a000, 0x0201f000, 0x000202da, 0x0401f965, + 0x0401f1a0, 0x83380480, 0x00000093, 0x02021800, + 0x001005d8, 0x83380480, 0x00000085, 0x02001800, + 0x001005d8, 0x0c01f001, 0x001089fd, 0x001089fb, + 0x001089fb, 0x00108a04, 0x001089fb, 0x001089fb, + 0x001089fb, 0x001089fb, 0x001089fb, 0x001089fb, + 0x001089fb, 0x001089fb, 0x001089fb, 0x0201f800, + 0x001005d8, 0x4a026203, 0x00000001, 0x493a6403, + 0x42000800, 0x80000040, 0x0201f000, 0x00020721, + 0x4933c857, 0x59cc1204, 0x480a601c, 0x59cc1404, + 0x0201f800, 0x00109410, 0x0400001b, 0x591c0203, + 0x82000580, 0x00000000, 0x04000017, 0x591c0009, + 0x81340580, 0x04020014, 0x4d300000, 0x4d1c0000, + 0x411e6000, 0x0401f9c2, 0x5c023800, 0x5c026000, + 0x0400000b, 0x59cc0005, 0x8c000500, 0x04020003, + 0x0401f98c, 0x0401f003, 0x4a023a03, 0x00000002, + 0x4a026403, 0x00000086, 0x0401f005, 0x0401f9a6, + 0x040007f5, 0x4a026403, 0x00000087, 0x4a026203, + 0x00000001, 0x42000800, 0x80000040, 0x0201f800, + 0x00020721, 0x59340200, 0x8c00050e, 0x0400000d, + 0x59cc1404, 0x0201f800, 0x00109410, 0x04000009, + 0x591c0414, 0x8c00051a, 0x04000006, 0x4d300000, + 0x411e6000, 0x0201f800, 0x0010921e, 0x5c026000, + 0x1c01f000, 0x83380580, 0x00000013, 0x0402000a, + 0x59300403, 0x82000d80, 0x00000086, 0x04000012, + 0x82000d80, 0x00000087, 0x02020800, 0x001005d8, + 0x0401f00d, 0x83380580, 0x00000027, 0x04000005, + 0x83380580, 0x00000014, 0x02020800, 0x001005d8, + 0x493bc857, 0x0201f800, 0x00106bbf, 0x0201f000, + 0x00107911, 0x4933c857, 0x0201f000, 0x00107911, + 0x83380580, 0x00000013, 0x04020005, 0x59300403, + 0x82000480, 0x00000085, 0x0c01f04d, 0x83380580, + 0x00000027, 0x04020041, 0x4933c857, 0x0201f800, + 0x00106bbf, 0x4d3c0000, 0x417a7800, 0x0201f800, + 0x0010203c, 0x5c027800, 0x42003000, 0x00000015, + 0x41782800, 0x42002000, 0x00000003, 0x42028000, + 0x00000029, 0x4d400000, 0x4d440000, 0x59368c03, + 0x0201f800, 0x0010985e, 0x5c028800, 0x5c028000, + 0x42000000, 0x0010b864, 0x0201f800, 0x0010aa47, + 0x0201f800, 0x00109037, 0x0400000c, 0x4d2c0000, + 0x59325808, 0x4a025a04, 0x00000103, 0x59300402, + 0x48025c06, 0x497a5c09, 0x49425a06, 0x0201f800, + 0x000202da, 0x5c025800, 0x0201f800, 0x0010912a, + 0x0201f000, 0x0002077d, 0x83380580, 0x00000089, + 0x04000005, 0x83380580, 0x0000008a, 0x02020000, + 0x00107974, 0x0201f800, 0x00106f60, 0x02020000, + 0x00107974, 0x59300a03, 0x82040580, 0x0000000a, + 0x0400002a, 0x82040580, 0x0000000c, 0x04000027, + 0x0201f800, 0x001005d8, 0x83380580, 0x00000014, + 0x040207ea, 0x4933c857, 0x0201f800, 0x00106bbf, + 0x42028000, 0x00000006, 0x0401f7d2, 0x00108aba, + 0x00108ab8, 0x00108ab8, 0x00108ab8, 0x00108ab8, + 0x00108ab8, 0x00108ac0, 0x00108ab8, 0x00108ab8, + 0x00108ab8, 0x00108ab8, 0x00108ab8, 0x00108ab8, + 0x0201f800, 0x001005d8, 0x4933c857, 0x59a80037, + 0x48026206, 0x4a026203, 0x0000000a, 0x1c01f000, + 0x4933c857, 0x59a80037, 0x48026206, 0x4a026203, + 0x0000000c, 0x1c01f000, 0x83380580, 0x00000089, + 0x04000008, 0x83380580, 0x0000008a, 0x04000032, + 0x4933c857, 0x493bc857, 0x0201f000, 0x00107974, + 0x4933c857, 0x59325808, 0x59300a1d, 0x82040580, + 0x00000003, 0x04020004, 0x0201f800, 0x001049b2, + 0x0401f00c, 0x5930021d, 0x82000580, 0x00000001, + 0x04020008, 0x59300c16, 0x82040580, 0x00000039, + 0x0400002c, 0x82040580, 0x00000035, 0x04000029, + 0x4c340000, 0x41306800, 0x0201f800, 0x0002075a, + 0x04000010, 0x4a026203, 0x00000001, 0x4a026403, + 0x0000001e, 0x59cc0c07, 0x48066419, 0x59cc0a07, + 0x48066219, 0x49366009, 0x4a026406, 0x00000001, + 0x42000800, 0x80000040, 0x0201f800, 0x00020721, + 0x40366000, 0x0201f800, 0x0002077d, 0x5c006800, + 0x1c01f000, 0x4933c857, 0x5930021d, 0x82000580, + 0x00000001, 0x04020040, 0x59300c16, 0x82040580, + 0x00000035, 0x04000007, 0x82040580, 0x0000001e, + 0x04000004, 0x82040580, 0x00000039, 0x04020036, + 0x4933c857, 0x4c500000, 0x4d1c0000, 0x4130a000, + 0x40067000, 0x0201f800, 0x001093ba, 0x04020029, + 0x0201f800, 0x0002075a, 0x04000026, 0x491fc857, + 0x4933c857, 0x83380580, 0x00000035, 0x04000004, + 0x83380580, 0x00000039, 0x04020002, 0x4932381c, + 0x493a6403, 0x4a026203, 0x00000001, 0x4a026406, + 0x00000001, 0x58500809, 0x4807c857, 0x48066009, + 0x58500c15, 0x4807c857, 0x48066415, 0x58500a15, + 0x4807c857, 0x48066215, 0x58500a16, 0x4807c857, + 0x48066216, 0x58500c19, 0x4807c857, 0x48066419, + 0x58500a19, 0x4807c857, 0x48066219, 0x491e601e, + 0x42000800, 0x80000040, 0x0201f800, 0x00020721, + 0x40526000, 0x5c023800, 0x5c00a000, 0x0201f000, + 0x0002077d, 0x5930021d, 0x82000580, 0x00000003, + 0x02000800, 0x001049b2, 0x0201f000, 0x0002077d, + 0x4803c856, 0x4c500000, 0x4c540000, 0x412c7800, + 0x4c3c0000, 0x42002800, 0x00000001, 0x82040480, + 0x00000101, 0x04001003, 0x42000800, 0x00000100, + 0x40043000, 0x42000800, 0x0000001c, 0x83cca400, + 0x0000000c, 0x832cac00, 0x0000000d, 0x0401f844, + 0x82183480, 0x0000001c, 0x592e5801, 0x812e59c0, + 0x02020800, 0x001007fd, 0x0201f800, 0x001007e4, + 0x04000017, 0x80142800, 0x4a025a04, 0x00000110, + 0x497a5c04, 0x492c7801, 0x82180c80, 0x0000003d, + 0x04021006, 0x40180800, 0x832cac00, 0x00000005, + 0x0401f82f, 0x0401f00a, 0x82183480, 0x0000003c, + 0x42000800, 0x0000003c, 0x412c7800, 0x832cac00, + 0x00000005, 0x0401f826, 0x0401f7e8, 0x5c007800, + 0x841429c0, 0x82142d40, 0x00000003, 0x48147a04, + 0x403e5800, 0x5c00a800, 0x5c00a000, 0x1c01f000, + 0x492fc857, 0x812e59c0, 0x0400000f, 0x4d2c0000, + 0x4c3c0000, 0x592c7801, 0x803c79c0, 0x04000006, + 0x497a5801, 0x0201f800, 0x000202da, 0x403e5800, + 0x0401f7f9, 0x5c007800, 0x0201f800, 0x000202da, + 0x5c025800, 0x1c01f000, 0x4803c856, 0x4c580000, + 0x82040c00, 0x00000003, 0x8004b104, 0x0201f800, + 0x0010ab17, 0x5c00b000, 0x1c01f000, 0x4803c856, + 0x4c580000, 0x82040c00, 0x00000003, 0x8004b104, + 0x0201f800, 0x0010ab17, 0x5c00b000, 0x1c01f000, + 0x591c0c06, 0x82040580, 0x00000003, 0x04000004, + 0x82040580, 0x00000002, 0x0402001a, 0x4d300000, + 0x4d2c0000, 0x411e6000, 0x59325808, 0x0201f800, + 0x00109037, 0x0400000f, 0x4d400000, 0x42028000, + 0x00000013, 0x592c0a08, 0x84040d54, 0x0201f800, + 0x00104e70, 0x5c028000, 0x0201f800, 0x0010959c, + 0x0201f800, 0x000202da, 0x0201f800, 0x0010912a, + 0x0201f800, 0x00107911, 0x5c025800, 0x5c026000, + 0x1c01f000, 0x59cc0005, 0x8c000500, 0x0402000b, + 0x591c0406, 0x82000580, 0x00000002, 0x04020007, + 0x591c0c03, 0x82040580, 0x00000085, 0x04000003, + 0x82040580, 0x0000008b, 0x1c01f000, 0x4933c857, + 0x4d3c0000, 0x42027800, 0x00000002, 0x59300406, + 0x82000c80, 0x00000012, 0x02021800, 0x001005d8, + 0x0c01f80a, 0x5c027800, 0x1c01f000, 0x4933c857, + 0x59300406, 0x82000c80, 0x00000012, 0x02021800, + 0x001005d8, 0x0c01f001, 0x00108c01, 0x00108bfe, + 0x00108bfe, 0x00108c29, 0x00108bfc, 0x00108bfe, + 0x00108c1a, 0x00108bfe, 0x00108bfc, 0x001065f4, + 0x00108bfe, 0x00108bfe, 0x00108bfe, 0x00108bfc, + 0x00108bfc, 0x00108bfc, 0x00108cf9, 0x00108bfe, + 0x0201f800, 0x001005d8, 0x4803c856, 0x80000580, + 0x1c01f000, 0x4803c856, 0x8d3e7d02, 0x04020016, + 0x0201f800, 0x00109037, 0x0400000f, 0x59325808, + 0x41780800, 0x4d400000, 0x42028000, 0x00000005, + 0x0201f800, 0x00104e70, 0x5c028000, 0x0201f800, + 0x0010959c, 0x0201f800, 0x001091cc, 0x0201f800, + 0x000202da, 0x0201f800, 0x00107911, 0x82000540, + 0x00000001, 0x1c01f000, 0x4933c857, 0x0201f800, + 0x001048d9, 0x0402000c, 0x4d400000, 0x42028000, + 0x00000010, 0x0201f800, 0x0010a1d1, 0x4a026406, + 0x00000006, 0x4a026203, 0x00000007, 0x5c028000, + 0x1c01f000, 0x4933c857, 0x0201f800, 0x00106c55, + 0x4df00000, 0x0401f8b8, 0x82000c80, 0x0000000e, + 0x02021800, 0x001005d8, 0x0c01f001, 0x00108c43, + 0x00108cb0, 0x00108c5a, 0x00108cc3, 0x00108cab, + 0x00108c41, 0x00108c43, 0x00108c43, 0x00108c47, + 0x00108c43, 0x00108c43, 0x00108c43, 0x00108c43, + 0x00108c5a, 0x0201f800, 0x001005d8, 0x5c03e000, + 0x02000800, 0x00106c4b, 0x0401f7b8, 0x5c03e000, + 0x02000800, 0x00106c4b, 0x59300406, 0x82000580, + 0x00000003, 0x040207b4, 0x59300203, 0x82000580, + 0x0000000d, 0x040007b0, 0x8d3e7d02, 0x040207ae, + 0x4d340000, 0x59326809, 0x0201f800, 0x001049b2, + 0x5c026800, 0x0401f7a8, 0x59300004, 0x8400055c, + 0x48026004, 0x0201f800, 0x00106c4b, 0x59300406, + 0x82000580, 0x00000006, 0x04000043, 0x8d3e7d02, + 0x04020041, 0x497a621d, 0x59300203, 0x82000580, + 0x0000000d, 0x04000003, 0x4a02621d, 0x00000003, + 0x0401fbcb, 0x04000024, 0x4d2c0000, 0x4d400000, + 0x59325808, 0x0201f800, 0x001091cc, 0x592c0408, + 0x8c000512, 0x04000009, 0x4d2c0000, 0x84000512, + 0x48025c08, 0x592c0809, 0x40065800, 0x0201f800, + 0x001007fd, 0x5c025800, 0x4d400000, 0x42028000, + 0x00000005, 0x592c0a08, 0x8c040d0e, 0x04000004, + 0x42028000, 0x00000002, 0x0401f001, 0x0201f800, + 0x00104e70, 0x5c028000, 0x0201f800, 0x0010959c, + 0x0201f800, 0x000202da, 0x497a6008, 0x5c028000, + 0x5c025800, 0x8d3e7d00, 0x04000009, 0x4d340000, + 0x59326809, 0x0201f800, 0x001049b2, 0x5c026800, + 0x0201f800, 0x00107911, 0x0401f00b, 0x4a026403, + 0x00000085, 0x4a026203, 0x00000009, 0x4a026406, + 0x00000002, 0x42000800, 0x8000404b, 0x0201f800, + 0x00020721, 0x5c03e000, 0x02020800, 0x00106c55, + 0x82000540, 0x00000001, 0x1c01f000, 0x0201f800, + 0x00106c4b, 0x0201f800, 0x00100e99, 0x0401f7ab, + 0x598c000d, 0x81300580, 0x04020004, 0x0201f800, + 0x00106e8e, 0x0402001b, 0x0201f800, 0x001068d3, + 0x04020006, 0x59300c03, 0x82040580, 0x00000040, + 0x0400078b, 0x0401f79d, 0x0201f800, 0x00106b6c, + 0x04000010, 0x0201f800, 0x001005d8, 0x0401f813, + 0x04020004, 0x0201f800, 0x00106e62, 0x04020009, + 0x0201f800, 0x001067ae, 0x040207f4, 0x59300c03, + 0x82040580, 0x00000040, 0x04000779, 0x0401f78b, + 0x59300203, 0x82000c80, 0x0000000e, 0x02021800, + 0x001005d8, 0x0c01f75e, 0x417a3000, 0x42032000, + 0x0000bf32, 0x59900004, 0x81300580, 0x04000009, + 0x83932400, 0x00000010, 0x811a3000, 0x83180480, + 0x00000005, 0x040017f8, 0x82000540, 0x00000001, + 0x1c01f000, 0x59300004, 0x8c00053e, 0x04000010, + 0x8c00050c, 0x0402000e, 0x8c000516, 0x04020006, + 0x82000d00, 0x0000001f, 0x82040580, 0x00000005, + 0x04020004, 0x42000000, 0x00000003, 0x0401f005, + 0x42000000, 0x00000001, 0x0401f002, 0x59300203, + 0x1c01f000, 0x4933c857, 0x0201f800, 0x00106c55, + 0x4df00000, 0x59300203, 0x82000c80, 0x0000000e, + 0x02021800, 0x001005d8, 0x0c01f001, 0x00108d13, + 0x00108d30, 0x00108d17, 0x00108d11, 0x00108d11, + 0x00108d11, 0x00108d11, 0x00108d11, 0x00108d11, + 0x00108d11, 0x00108d11, 0x00108d11, 0x00108d11, + 0x00108d11, 0x0201f800, 0x001005d8, 0x5c03e000, + 0x02000800, 0x00106c4b, 0x0401f6e8, 0x5c03e000, + 0x02000800, 0x00106c4b, 0x4d2c0000, 0x59325808, + 0x59300403, 0x82000580, 0x00000052, 0x02000800, + 0x00101231, 0x0401fb16, 0x02000800, 0x001005d8, + 0x4a025a06, 0x00000005, 0x0201f800, 0x000202da, + 0x0201f800, 0x00104c19, 0x0201f800, 0x00107911, + 0x5c025800, 0x82000540, 0x00000001, 0x1c01f000, + 0x598c000d, 0x81300580, 0x0402001a, 0x59300004, + 0x8c000520, 0x04000004, 0x84000520, 0x48026004, + 0x0401f01a, 0x42001000, 0x0010b7f6, 0x50081000, + 0x58080002, 0x82000580, 0x00000100, 0x0400000a, + 0x5808000c, 0x81300580, 0x02020800, 0x001005d8, + 0x0201f800, 0x001068d3, 0x02020800, 0x001005d8, + 0x0401f7cf, 0x0201f800, 0x00106e8e, 0x0402000c, + 0x59300004, 0x8c000520, 0x04000004, 0x84000520, + 0x48026004, 0x0401f7c6, 0x0201f800, 0x001068d3, + 0x040007c3, 0x0201f800, 0x001005d8, 0x59300203, + 0x82000c80, 0x0000000e, 0x02021800, 0x001005d8, + 0x0c01f7a7, 0x59300406, 0x4933c857, 0x4803c857, + 0x82000c80, 0x00000012, 0x02021800, 0x001005d8, + 0x0c01f001, 0x00108d7c, 0x00108e41, 0x00108f79, + 0x00108d88, 0x00107911, 0x00108d7c, 0x0010a1c0, + 0x0002077d, 0x00108e41, 0x001065ce, 0x00108fda, + 0x00108d77, 0x00108d77, 0x00108d77, 0x00108d77, + 0x00108d77, 0x001096eb, 0x001096eb, 0x0201f800, + 0x001005d8, 0x0401fbd5, 0x02000000, 0x0010801c, + 0x1c01f000, 0x0201f800, 0x00106c55, 0x0201f800, + 0x00106bbf, 0x0201f800, 0x00106c4b, 0x0201f000, + 0x0002077d, 0x4a026206, 0x00000001, 0x1c01f000, + 0x42000000, 0x0010b872, 0x0201f800, 0x0010aa47, + 0x4d2c0000, 0x4d400000, 0x417a5800, 0x0401faa8, + 0x04000007, 0x59325808, 0x592c0208, 0x8400054c, + 0x48025a08, 0x42028000, 0x00000006, 0x0201f800, + 0x00106c55, 0x0401ff4c, 0x4803c857, 0x82000c80, + 0x0000000e, 0x02021800, 0x001005d8, 0x0c01f806, + 0x0201f800, 0x00106c4b, 0x5c028000, 0x5c025800, + 0x1c01f000, 0x00108e40, 0x00108db5, 0x00108dc3, + 0x00108de5, 0x00108e11, 0x00108db3, 0x00108d7c, + 0x00108d7c, 0x00108d7c, 0x00108db3, 0x00108db3, + 0x00108db3, 0x00108db3, 0x00108dc3, 0x0201f800, + 0x001005d8, 0x598c000d, 0x81300580, 0x04020004, + 0x0201f800, 0x00106e8e, 0x04020038, 0x0201f800, + 0x001068d3, 0x0400003b, 0x0201f800, 0x00106b6c, + 0x04000032, 0x0201f800, 0x001005d8, 0x497a621d, + 0x812e59c0, 0x02000800, 0x001005d8, 0x592c0204, + 0x82000500, 0x000000ff, 0x82000580, 0x00000014, + 0x04000003, 0x4a02621d, 0x00000003, 0x592c0a08, + 0x0201f800, 0x00104e70, 0x0201f800, 0x0010959c, + 0x0201f800, 0x000202da, 0x497a6008, 0x4a026403, + 0x00000085, 0x4a026203, 0x00000009, 0x4a026406, + 0x00000002, 0x4a026004, 0x8000404b, 0x0201f800, + 0x00106c4b, 0x42000800, 0x8000404b, 0x0201f000, + 0x00020721, 0x0401fef1, 0x04020004, 0x0201f800, + 0x00106e62, 0x04020009, 0x0201f800, 0x001067ae, + 0x040207d2, 0x59300c03, 0x82040580, 0x00000040, + 0x04000008, 0x0401f7d2, 0x59300203, 0x82000c80, + 0x0000000e, 0x02021800, 0x001005d8, 0x0c01f7ae, + 0x0201f800, 0x00106c4b, 0x812e59c0, 0x04000013, + 0x592c0a08, 0x0201f800, 0x00104e70, 0x0201f800, + 0x0010959c, 0x0201f800, 0x000202da, 0x59300203, + 0x82000580, 0x0000000d, 0x04000008, 0x0201f800, + 0x00106c4b, 0x4d340000, 0x59326809, 0x0201f800, + 0x001049b2, 0x5c026800, 0x0201f800, 0x00107911, + 0x0401f030, 0x812e59c0, 0x02000800, 0x001005d8, + 0x0201f800, 0x0010940a, 0x04020004, 0x0201f800, + 0x00100e99, 0x0401f7aa, 0x0201f800, 0x00106c4b, + 0x592c0208, 0x8400050c, 0x48025a08, 0x592c0406, + 0x800000c2, 0x800008c4, 0x80040c00, 0x48066206, + 0x42000000, 0x10000000, 0x41300800, 0x0201f800, + 0x00100b94, 0x0400000d, 0x592c0208, 0x8c00051c, + 0x04020006, 0x8400055c, 0x48025a08, 0x4a026206, + 0x00000002, 0x0401f00f, 0x4d300000, 0x0201f800, + 0x001012e5, 0x5c026000, 0x59300203, 0x82000580, + 0x00000004, 0x04020007, 0x4d380000, 0x42027000, + 0x00000048, 0x0201f800, 0x000207a1, 0x5c027000, + 0x1c01f000, 0x42000000, 0x0010b86e, 0x0201f800, + 0x0010aa47, 0x59300203, 0x82000c80, 0x0000000e, + 0x02021800, 0x001005d8, 0x4803c857, 0x0c01f001, + 0x00108e5a, 0x00108d85, 0x00108e5c, 0x00108e5a, + 0x00108e5c, 0x00108e5c, 0x00108d7d, 0x00108e5a, + 0x00108d79, 0x00108e5a, 0x00108e5a, 0x00108e5a, + 0x00108e5a, 0x00108e5a, 0x0201f800, 0x001005d8, + 0x4d340000, 0x4d2c0000, 0x59326809, 0x59340400, + 0x82000500, 0x000000ff, 0x82000c80, 0x0000000c, + 0x02021800, 0x001005d8, 0x59303403, 0x82180d80, + 0x00000004, 0x04020004, 0x42000000, 0x00000001, + 0x0401f006, 0x82180d80, 0x00000000, 0x04020003, + 0x42000000, 0x00000001, 0x4803c857, 0x0c01f804, + 0x5c025800, 0x5c026800, 0x1c01f000, 0x00108e83, + 0x00108f22, 0x00108e85, 0x00108eba, 0x00108e85, + 0x00108f3f, 0x00108e85, 0x00108e8f, 0x00108e83, + 0x00108f3f, 0x00108e83, 0x00108e9e, 0x0201f800, + 0x001005d8, 0x59300403, 0x82000d80, 0x00000016, + 0x0400002e, 0x82000d80, 0x00000004, 0x0400002b, + 0x82000d80, 0x00000002, 0x04000028, 0x0401fabf, + 0x04000079, 0x59300403, 0x82000d80, 0x00000022, + 0x040000ae, 0x82000d80, 0x00000039, 0x040000b3, + 0x82000d80, 0x00000035, 0x040000b0, 0x82000d80, + 0x0000001e, 0x0400001b, 0x0401f999, 0x04000007, + 0x0201f800, 0x00109597, 0x04020004, 0x0201f800, + 0x00104a14, 0x0401f011, 0x59300403, 0x82000d80, + 0x00000001, 0x04020004, 0x0201f800, 0x001049e7, + 0x0400000a, 0x4d3c0000, 0x417a7800, 0x0201f800, + 0x0010203c, 0x5c027800, 0x42000000, 0x0010b864, + 0x0201f800, 0x0010aa47, 0x0201f800, 0x0010801c, + 0x0201f000, 0x00107911, 0x0401f97d, 0x04000004, + 0x0201f800, 0x00109597, 0x040000a9, 0x59300c03, + 0x82040580, 0x00000016, 0x04000056, 0x82040580, + 0x00000002, 0x04020034, 0x59a80026, 0x8c000502, + 0x04020013, 0x0201f800, 0x0010513b, 0x04020010, + 0x0201f800, 0x00105151, 0x04020006, 0x42000000, + 0x00000001, 0x0201f800, 0x00105113, 0x0401f094, + 0x4a035033, 0x00000001, 0x4202d800, 0x00000001, + 0x0201f800, 0x001050a2, 0x0401f08d, 0x59340403, + 0x82000580, 0x000007fc, 0x04000008, 0x59a80026, + 0x8c00050a, 0x04020084, 0x59340212, 0x82000500, + 0x0000ff00, 0x04000082, 0x59340412, 0x82000500, + 0x000000ff, 0x04000010, 0x80000040, 0x48026c12, + 0x497a6008, 0x4a026406, 0x00000007, 0x4a026206, + 0x00000398, 0x497a6205, 0x0201f800, 0x0002075a, + 0x04000005, 0x49366009, 0x4a026406, 0x00000001, + 0x0401f020, 0x59300403, 0x82000d80, 0x00000002, + 0x0402000d, 0x59340403, 0x82000580, 0x000007fe, + 0x04020009, 0x59a80026, 0x84000540, 0x48035026, + 0x0201f800, 0x00104237, 0x0201f800, 0x0010801c, + 0x0401f00c, 0x0201f800, 0x0010801c, 0x4d3c0000, + 0x417a7800, 0x0201f800, 0x0010203c, 0x5c027800, + 0x42000000, 0x0010b864, 0x0201f800, 0x0010aa47, + 0x0201f800, 0x00102074, 0x0201f000, 0x00107911, + 0x42000800, 0x00000003, 0x0201f800, 0x00104571, + 0x4a026203, 0x00000001, 0x4a026403, 0x00000002, + 0x0201f000, 0x0010672b, 0x0401f915, 0x04020793, + 0x0201f800, 0x00102074, 0x4d3c0000, 0x417a7800, + 0x0201f800, 0x0010203c, 0x5c027800, 0x42000000, + 0x0010b864, 0x0201f800, 0x0010aa47, 0x42003000, + 0x00000018, 0x41782800, 0x42002000, 0x00000000, + 0x4d400000, 0x4d440000, 0x59368c03, 0x42028000, + 0x00000029, 0x0201f800, 0x0010985e, 0x5c028800, + 0x5c028000, 0x0201f000, 0x00107911, 0x0201f800, + 0x00104a14, 0x0401f7c8, 0x42000000, 0x0010b86d, + 0x0201f800, 0x0010aa47, 0x0201f800, 0x00107b76, + 0x040207c1, 0x1c01f000, 0x4d380000, 0x59327403, + 0x0201f800, 0x001093ba, 0x5c027000, 0x02020000, + 0x0002077d, 0x836c0580, 0x00000003, 0x04000004, + 0x4a026206, 0x00000002, 0x1c01f000, 0x59300403, + 0x48026416, 0x4a02621d, 0x00000001, 0x4a026403, + 0x00000085, 0x4a026203, 0x00000009, 0x4a026406, + 0x00000002, 0x42000800, 0x8000004b, 0x0201f000, + 0x00020721, 0x0201f800, 0x00102074, 0x0201f800, + 0x0010801c, 0x4d3c0000, 0x417a7800, 0x0201f800, + 0x0010203c, 0x5c027800, 0x42000000, 0x0010b864, + 0x0201f800, 0x0010aa47, 0x497a6008, 0x4a026406, + 0x00000007, 0x4a026206, 0x00000398, 0x497a6205, + 0x1c01f000, 0x42000000, 0x0010b870, 0x0201f800, + 0x0010aa47, 0x4d340000, 0x59326809, 0x59300203, + 0x82000c80, 0x0000000e, 0x02021800, 0x001005d8, + 0x4803c857, 0x0c01f803, 0x5c026800, 0x1c01f000, + 0x00108f96, 0x00108d85, 0x00108f96, 0x00108f96, + 0x00108f96, 0x00108f96, 0x00108f96, 0x00108f96, + 0x00108f96, 0x00108d85, 0x00108f98, 0x00108d85, + 0x00108fa0, 0x00108f96, 0x0201f800, 0x001005d8, + 0x4a026403, 0x0000008b, 0x4a026203, 0x0000000b, + 0x42000800, 0x8000404b, 0x0201f000, 0x00020721, + 0x59300a1d, 0x4d3c0000, 0x417a7800, 0x0201f800, + 0x0010203c, 0x5c027800, 0x42003000, 0x00000011, + 0x0201f800, 0x0010a942, 0x42000000, 0x0010b864, + 0x0201f800, 0x0010aa47, 0x41306800, 0x0201f800, + 0x0002075a, 0x04000008, 0x49366009, 0x4d300000, + 0x40366000, 0x0201f800, 0x00107911, 0x5c026000, + 0x0401f002, 0x40366000, 0x497a6008, 0x4a026406, + 0x00000001, 0x4a026403, 0x00000001, 0x0201f800, + 0x00103b25, 0x04000011, 0x4a026406, 0x00000004, + 0x4a026203, 0x00000007, 0x4a026420, 0x00000001, + 0x42003000, 0x00000004, 0x4d400000, 0x42028000, + 0x00000029, 0x41782800, 0x0201f800, 0x0010a43e, + 0x5c028000, 0x1c01f000, 0x42000800, 0x0000000b, + 0x0201f800, 0x00104571, 0x4a026203, 0x00000001, + 0x0201f000, 0x0010672b, 0x42000000, 0x0010b876, + 0x0201f800, 0x0010aa47, 0x59300203, 0x82000c80, + 0x0000000e, 0x02021800, 0x001005d8, 0x4803c857, + 0x0c01f001, 0x0010900b, 0x00108ff3, 0x00108ff7, + 0x0010900c, 0x00108ff5, 0x00108ff3, 0x00108ff3, + 0x00108ff3, 0x00108ff3, 0x00108ff3, 0x00108ff3, + 0x00108ff3, 0x00108ff3, 0x00108ff3, 0x0201f800, + 0x001005d8, 0x0201f800, 0x00100e99, 0x4d2c0000, + 0x59325808, 0x4a025a06, 0x00000006, 0x0201f800, + 0x000202da, 0x5c025800, 0x497a6008, 0x4a02621d, + 0x0000000a, 0x4a026403, 0x00000085, 0x4a026203, + 0x00000009, 0x4a026406, 0x00000002, 0x42000800, + 0x8000404b, 0x0201f000, 0x00020721, 0x1c01f000, + 0x0201f800, 0x00106c55, 0x4df00000, 0x0401fcc7, + 0x04020004, 0x0201f800, 0x00106e62, 0x0402000c, + 0x0201f800, 0x001067ae, 0x04020005, 0x5c03e000, + 0x0201f800, 0x00106c4b, 0x0401f7dd, 0x0201f800, + 0x00106b6c, 0x02020800, 0x001005d8, 0x5c03e000, + 0x0201f800, 0x00106c4b, 0x59300203, 0x82000d80, + 0x00000003, 0x02000800, 0x001005d8, 0x82000c80, + 0x0000000e, 0x02021800, 0x001005d8, 0x0c01f7ba, + 0x4803c856, 0x59a8000e, 0x59a80867, 0x80040400, + 0x80080480, 0x04021004, 0x82000540, 0x00000001, + 0x1c01f000, 0x80000580, 0x1c01f000, 0x4803c856, + 0x4c080000, 0x59301008, 0x82081500, 0xfff00000, + 0x5c001000, 0x1c01f000, 0x4803c856, 0x4d300000, + 0x0201f800, 0x0002075a, 0x0400000a, 0x0401f82f, + 0x4d380000, 0x42027000, 0x0000004b, 0x0201f800, + 0x000207a1, 0x5c027000, 0x82000540, 0x00000001, + 0x5c026000, 0x1c01f000, 0x4803c856, 0x4d300000, + 0x0201f800, 0x00107942, 0x0400001b, 0x0401f81f, + 0x4d300000, 0x0201f800, 0x00106c55, 0x4d3c0000, + 0x417a7800, 0x0201f800, 0x00106ab4, 0x0201f800, + 0x001067fd, 0x5c027800, 0x0201f800, 0x0010a2ff, + 0x0201f800, 0x00106c4b, 0x5c026000, 0x8d3e7d3e, + 0x0402000b, 0x4d380000, 0x42027000, 0x0000004c, + 0x0201f800, 0x000207a1, 0x5c027000, 0x82000540, + 0x00000001, 0x5c026000, 0x1c01f000, 0x0201f800, + 0x0002077d, 0x0401f7fa, 0x592c0407, 0x494a6017, + 0x494e6018, 0x49366009, 0x492e6008, 0x4a026406, + 0x00000003, 0x800000c2, 0x800008c4, 0x80040400, + 0x48026206, 0x1c01f000, 0x493bc857, 0x4d300000, + 0x0201f800, 0x0002075a, 0x0400000d, 0x0401ffef, + 0x4d400000, 0x42028000, 0x00000005, 0x0401f80d, + 0x5c028000, 0x8d3e7d3e, 0x04020007, 0x0201f800, + 0x000207a1, 0x82000540, 0x00000001, 0x5c026000, + 0x1c01f000, 0x0201f800, 0x0002077d, 0x0401f7fa, + 0x4803c856, 0x0201f800, 0x00106c55, 0x4d3c0000, + 0x4d440000, 0x59368c03, 0x42027800, 0x00000001, + 0x0201f800, 0x001069b6, 0x0201f800, 0x0010692e, + 0x0201f800, 0x001067fd, 0x0201f800, 0x0010a2ff, + 0x5c028800, 0x5c027800, 0x0201f000, 0x00106c4b, + 0x4803c856, 0x4d300000, 0x0201f800, 0x0002075a, + 0x0400000f, 0x481a601c, 0x48ee6021, 0x49366009, + 0x4a026406, 0x00000001, 0x492e6008, 0x4d380000, + 0x42027000, 0x0000001f, 0x0201f800, 0x000207a1, + 0x5c027000, 0x82000540, 0x00000001, 0x5c026000, + 0x1c01f000, 0x4803c856, 0x4d300000, 0x0201f800, + 0x0002075a, 0x0400000e, 0x48ee6021, 0x49366009, + 0x4a026406, 0x00000001, 0x492e6008, 0x4d380000, + 0x42027000, 0x00000055, 0x0201f800, 0x000207a1, + 0x5c027000, 0x82000540, 0x00000001, 0x5c026000, + 0x1c01f000, 0x4803c856, 0x4d300000, 0x0201f800, + 0x0002075a, 0x0400000f, 0x481a601c, 0x48ee6021, + 0x49366009, 0x4a026406, 0x00000001, 0x492e6008, + 0x4d380000, 0x42027000, 0x0000003d, 0x0201f800, + 0x000207a1, 0x5c027000, 0x82000540, 0x00000001, + 0x5c026000, 0x1c01f000, 0x4803c856, 0x4d300000, + 0x0201f800, 0x00107942, 0x04000014, 0x49366009, + 0x492fc857, 0x4933c857, 0x592c0404, 0x8c00051e, + 0x04000003, 0x48efc857, 0x48ee6021, 0x4a026406, + 0x00000001, 0x492e6008, 0x4d380000, 0x42027000, + 0x00000000, 0x0201f800, 0x000207a1, 0x5c027000, + 0x82000540, 0x00000001, 0x5c026000, 0x1c01f000, + 0x4803c856, 0x4d300000, 0x0201f800, 0x0002075a, + 0x0400000f, 0x48ee6021, 0x481a601c, 0x49366009, + 0x4a026406, 0x00000001, 0x492e6008, 0x4d380000, + 0x42027000, 0x00000044, 0x0201f800, 0x000207a1, + 0x5c027000, 0x82000540, 0x00000001, 0x5c026000, + 0x1c01f000, 0x4803c856, 0x4d300000, 0x0201f800, + 0x0002075a, 0x0400000f, 0x481a601c, 0x48ee6021, + 0x49366009, 0x4a026406, 0x00000001, 0x492e6008, + 0x4d380000, 0x42027000, 0x00000049, 0x0201f800, + 0x000207a1, 0x5c027000, 0x82000540, 0x00000001, + 0x5c026000, 0x1c01f000, 0x59300009, 0x80001540, + 0x02000800, 0x001005d8, 0x5808040b, 0x4803c856, + 0x80000040, 0x04001002, 0x4800140b, 0x1c01f000, + 0x4803c856, 0x59300403, 0x82000d80, 0x00000002, + 0x04000015, 0x82000d80, 0x00000003, 0x04000012, + 0x82000d80, 0x00000004, 0x0400000f, 0x82000d80, + 0x00000008, 0x0400000c, 0x82000d80, 0x0000000a, + 0x04000009, 0x599c0819, 0x8c040d0e, 0x04000004, + 0x82000d80, 0x00000000, 0x04000003, 0x82000540, + 0x00000001, 0x1c01f000, 0x4803c856, 0x4c000000, + 0x4d2c0000, 0x59300406, 0x82000580, 0x00000004, + 0x0400001d, 0x59300008, 0x80025d40, 0x800001c0, + 0x04000019, 0x0201f800, 0x00109597, 0x04000014, + 0x59300406, 0x82004580, 0x00000010, 0x04000010, + 0x82004580, 0x00000011, 0x0400000d, 0x82004580, + 0x00000003, 0x0400000c, 0x82004580, 0x00000002, + 0x04000009, 0x82004580, 0x0000000a, 0x04000006, + 0x592c0404, 0x8c00051e, 0x04000003, 0x80000580, + 0x0401f003, 0x82000540, 0x00000001, 0x5c025800, + 0x5c000000, 0x1c01f000, 0x4803c856, 0x4d300000, + 0x0201f800, 0x00107942, 0x04000013, 0x49366009, + 0x48ee6021, 0x4a026406, 0x00000001, 0x492e6008, + 0x4d3c0000, 0x417a7800, 0x0201f800, 0x0010203c, + 0x5c027800, 0x4d380000, 0x42027000, 0x00000028, + 0x0201f800, 0x000207a1, 0x5c027000, 0x82000540, + 0x00000001, 0x5c026000, 0x1c01f000, 0x4803c856, + 0x83380580, 0x00000015, 0x0402000d, 0x59a80016, + 0x82000580, 0x00000074, 0x04020009, 0x0201f800, + 0x0010462a, 0x4a026203, 0x00000001, 0x4a026403, + 0x00000029, 0x0201f000, 0x0010672b, 0x0201f800, + 0x0010801c, 0x0201f000, 0x0002077d, 0x4803c856, + 0x83380580, 0x00000016, 0x04020007, 0x42000800, + 0x00000004, 0x0201f800, 0x00104571, 0x0201f000, + 0x00107b38, 0x83380580, 0x00000015, 0x04020013, + 0x59a80016, 0x82000580, 0x00000014, 0x0402000f, + 0x0201f800, 0x0010468d, 0x0201f800, 0x0010846f, + 0x0402000a, 0x59340404, 0x80000540, 0x04000007, + 0x42000800, 0x00000006, 0x0201f800, 0x00104571, + 0x0201f000, 0x00107b38, 0x0201f800, 0x0010801c, + 0x0201f000, 0x0002077d, 0x4803c856, 0x592c0206, + 0x82000580, 0x00000005, 0x04000002, 0x1c01f000, + 0x4803c856, 0x592c0208, 0x8400054a, 0x48025a08, + 0x1c01f000, 0x497a6205, 0x497a6008, 0x4a026203, + 0x00000001, 0x4a026403, 0x00000050, 0x42000800, + 0x80000043, 0x0201f000, 0x00020721, 0x4933c857, + 0x4d340000, 0x59326809, 0x59340200, 0x8c00050e, + 0x04000006, 0x59300406, 0x82000c80, 0x00000012, + 0x04021004, 0x0c01f806, 0x5c026800, 0x1c01f000, + 0x0201f800, 0x00108d7c, 0x0401f7fc, 0x00108d7c, + 0x001091fd, 0x00109201, 0x00109204, 0x0010a49b, + 0x0010a4b8, 0x0010a4bc, 0x00108d7c, 0x00108d7c, + 0x00108d7c, 0x00108d7c, 0x00108d7c, 0x00108d7c, + 0x00108d7c, 0x00108d7c, 0x00108d7c, 0x00108d7c, + 0x00108d7c, 0x4803c856, 0x40000000, 0x40000000, + 0x1c01f000, 0x40000000, 0x40000000, 0x1c01f000, + 0x5930001c, 0x4803c857, 0x59300414, 0x4933c857, + 0x4803c857, 0x8c000502, 0x04000005, 0x84000502, + 0x84000540, 0x48026414, 0x1c01f000, 0x42000000, + 0xd0000000, 0x41300800, 0x0201f800, 0x00100b94, + 0x0401f80a, 0x04020008, 0x59a80037, 0x82000400, + 0x0000000a, 0x48026205, 0x59300414, 0x84000542, + 0x48026414, 0x1c01f000, 0x4933c857, 0x4d340000, + 0x59326809, 0x59340200, 0x8c00050e, 0x02000800, + 0x001005d8, 0x5930001c, 0x80000540, 0x0402002f, + 0x59a80021, 0x80000540, 0x0402002a, 0x4d1c0000, + 0x41323800, 0x0201f800, 0x0002075a, 0x04000023, + 0x4932381c, 0x591c0414, 0x84000542, 0x48023c14, + 0x49366009, 0x591c0406, 0x82000580, 0x00000003, + 0x04000006, 0x591c0202, 0x48026419, 0x591c0402, + 0x48026219, 0x0401f005, 0x591c0202, 0x48026219, + 0x591c0402, 0x48026419, 0x491e601e, 0x4a026406, + 0x00000001, 0x4a026403, 0x00000035, 0x4a026203, + 0x00000001, 0x42000800, 0x80000040, 0x0201f800, + 0x00020721, 0x411e6000, 0x5c023800, 0x80000580, + 0x5c026800, 0x1c01f000, 0x411e6000, 0x5c023800, + 0x59a80039, 0x48026205, 0x82000540, 0x00000001, + 0x0401f7f8, 0x4933c857, 0x4d2c0000, 0x4932381c, + 0x4a026202, 0x0000ffff, 0x591e5808, 0x591c0007, + 0x8c00051e, 0x04000005, 0x8400051e, 0x48023807, + 0x497a5c09, 0x0401f014, 0x592c0408, 0x8c000518, + 0x04000011, 0x84000518, 0x48025c08, 0x4a025c09, + 0x00000001, 0x0401fb2f, 0x497a5c09, 0x592c0408, + 0x8c000512, 0x04000008, 0x4d2c0000, 0x84000512, + 0x48025c08, 0x592e5809, 0x0201f800, 0x001007fd, + 0x5c025800, 0x59a80039, 0x48026205, 0x591c0214, + 0x48026216, 0x82000d80, 0x00000001, 0x04000008, + 0x4a023a03, 0x00000002, 0x82000580, 0x00000005, + 0x04000008, 0x497a6015, 0x0401f01e, 0x591c0007, + 0x84000540, 0x48023807, 0x4a023a03, 0x00000004, + 0x591c0414, 0x4803c857, 0x8400051c, 0x84000554, + 0x48023c14, 0x592c000f, 0x40001000, 0x591c0816, + 0x80040480, 0x040217f0, 0x591c0016, 0x82000500, + 0xfffffffc, 0x48026015, 0x48023816, 0x591c0a14, + 0x4807c857, 0x82040d80, 0x00000005, 0x04020005, + 0x480bc857, 0x4803c857, 0x4a023812, 0xffffffff, + 0x591c0402, 0x48026419, 0x591c0202, 0x48026219, + 0x591e6809, 0x49366009, 0x4a026406, 0x00000001, + 0x4a026403, 0x00000039, 0x4a026203, 0x00000001, + 0x42000800, 0x80000040, 0x0201f800, 0x00020721, + 0x5c025800, 0x1c01f000, 0x4933c857, 0x59300414, + 0x8c000514, 0x04000015, 0x8c00051c, 0x04020012, + 0x59300016, 0x80100480, 0x04001006, 0x04000005, + 0x59300414, 0x84000514, 0x8400055c, 0x0401f009, + 0x48126016, 0x48126012, 0x40100000, 0x592c180f, + 0x800c0480, 0x48026011, 0x59300414, 0x84000514, + 0x48026414, 0x1c01f000, 0x4933c857, 0x8c00051c, + 0x04020006, 0x59300012, 0x48026016, 0x59300414, + 0x8400055c, 0x48026414, 0x1c01f000, 0x59300c03, + 0x4933c857, 0x4807c857, 0x82040480, 0x00000034, + 0x04001006, 0x82040480, 0x0000003c, 0x04021003, + 0x80000580, 0x1c01f000, 0x82000540, 0x00000001, + 0x0401f7fd, 0x41780800, 0x59a81035, 0x42000000, + 0x00000032, 0x0201f800, 0x001066a0, 0x800811c0, + 0x04020003, 0x42001000, 0x00000014, 0x480b5037, + 0x59a81036, 0x480b502d, 0x41780800, 0x42000000, + 0x00000064, 0x0201f800, 0x001066a0, 0x800811c0, + 0x04020003, 0x42001000, 0x00000014, 0x480b5038, + 0x82081400, 0x0000000a, 0x480b5039, 0x42000800, + 0x00000001, 0x0201f800, 0x00106c78, 0x42000000, + 0x30000000, 0x40080800, 0x0201f800, 0x00100b68, + 0x42000800, 0x00000003, 0x59a81010, 0x0201f800, + 0x00106c78, 0x0201f000, 0x00104906, 0x4a035037, + 0x00000028, 0x4a035038, 0x00000014, 0x4a03502d, + 0x000007d0, 0x42001000, 0x0000001e, 0x480b5039, + 0x42000800, 0x00000001, 0x0201f800, 0x00106c78, + 0x42000000, 0x30000000, 0x40080800, 0x0201f800, + 0x00100b68, 0x42000800, 0x00000003, 0x59a81010, + 0x0201f000, 0x00106c78, 0x4933c857, 0x4d2c0000, + 0x59300403, 0x82000580, 0x0000003e, 0x04020005, + 0x59325817, 0x812e59c0, 0x02020800, 0x001007f4, + 0x5c025800, 0x1c01f000, 0x4937c857, 0x4d300000, + 0x0201f800, 0x0002075a, 0x04000011, 0x49366009, + 0x4a026406, 0x00000001, 0x492e6008, 0x42000800, + 0x00000009, 0x0201f800, 0x00104571, 0x4d380000, + 0x42027000, 0x00000033, 0x0201f800, 0x000207a1, + 0x5c027000, 0x82000540, 0x00000001, 0x5c026000, + 0x1c01f000, 0x4933c857, 0x4d2c0000, 0x4c580000, + 0x4d3c0000, 0x59325808, 0x83380580, 0x00000015, + 0x04020022, 0x59a8b016, 0x82580c80, 0x00000019, + 0x04001003, 0x4200b000, 0x00000018, 0x8058b104, + 0x0401fa07, 0x80000580, 0x0401fa17, 0x832cac00, + 0x00000009, 0x83cca400, 0x00000006, 0x0201f800, + 0x0010ab17, 0x42027800, 0x00000001, 0x592c100a, + 0x8c081518, 0x04020006, 0x59a80010, 0x592c100d, + 0x80080580, 0x04020006, 0x417a7800, 0x59301009, + 0x58081403, 0x0201f800, 0x001020a1, 0x0201f800, + 0x00107b38, 0x0401f008, 0x4200b000, 0x00000002, + 0x0401fa09, 0x0201f800, 0x0010801c, 0x0201f800, + 0x0002077d, 0x5c027800, 0x5c00b000, 0x5c025800, + 0x1c01f000, 0x4933c856, 0x49366009, 0x4a026406, + 0x00000001, 0x492e6008, 0x4d380000, 0x42027000, + 0x0000004d, 0x0201f800, 0x000207a1, 0x5c027000, + 0x82000540, 0x00000001, 0x1c01f000, 0x4803c856, + 0x4d2c0000, 0x83380580, 0x00000015, 0x04020027, + 0x59a80816, 0x59325808, 0x5930040b, 0x800000c4, + 0x80040580, 0x04020021, 0x4c500000, 0x4c540000, + 0x4c580000, 0x83cca400, 0x00000006, 0x4050a800, + 0x5930b40b, 0x0201f800, 0x0010ab28, 0x83cca400, + 0x00000006, 0x592cb205, 0x832cac00, 0x00000006, + 0x0201f800, 0x0010ab17, 0x592e5801, 0x812e59c0, + 0x040207f9, 0x5931d821, 0x58ef400b, 0x58ee580d, + 0x4a025a04, 0x00000103, 0x58ec0009, 0x0801f800, + 0x59300402, 0x5c00b000, 0x5c00a800, 0x5c00a000, + 0x5c025800, 0x1c01f000, 0x0201f800, 0x0010801c, + 0x5c025800, 0x1c01f000, 0x4933c857, 0x83380580, + 0x00000035, 0x04000005, 0x59301419, 0x0401f851, + 0x04000027, 0x0401f006, 0x4d300000, 0x5932601e, + 0x0401f856, 0x5c026000, 0x04000020, 0x591c0c06, + 0x82040580, 0x00000003, 0x04000004, 0x82040580, + 0x00000006, 0x0402001c, 0x591c0c02, 0x59300419, + 0x80040580, 0x04000009, 0x59300219, 0x80040580, + 0x04020015, 0x591c0a02, 0x59300419, 0x80040580, + 0x04020011, 0x0401f009, 0x59300a19, 0x82040580, + 0x0000ffff, 0x04000005, 0x591c0202, 0x59300a19, + 0x80040580, 0x04020008, 0x591c0009, 0x59300809, + 0x80040580, 0x1c01f000, 0x417a3800, 0x82000540, + 0x00000001, 0x1c01f000, 0x4803c856, 0x59b800e4, + 0x8c000538, 0x02020800, 0x001005d8, 0x42000800, + 0x0000012c, 0x4a0370e4, 0x20000000, 0x59b800e4, + 0x80040840, 0x02000800, 0x001005d8, 0x8c00053c, + 0x040207f9, 0x4a0370e4, 0x30000000, 0x40000000, + 0x40000000, 0x40000000, 0x59b800e4, 0x8c00053c, + 0x040207f1, 0x1c01f000, 0x4803c856, 0x4a0370e4, + 0x20000000, 0x40000000, 0x59b800e4, 0x8c000538, + 0x040207fb, 0x1c01f000, 0x59300807, 0x8c040d1e, + 0x592c0c08, 0x04020002, 0x8c040d18, 0x1c01f000, + 0x0401fc1c, 0x04000008, 0x42000800, 0x00000024, + 0x0201f800, 0x00106681, 0x82063c00, 0x0010d1c0, + 0x491fc857, 0x1c01f000, 0x83300480, 0x0010d1c0, + 0x0400100a, 0x59a8000b, 0x81300480, 0x04021007, + 0x59301402, 0x0401ffef, 0x04000007, 0x411c0000, + 0x81300580, 0x04000003, 0x81780500, 0x0401f002, + 0x81300540, 0x1c01f000, 0x4947c857, 0x4d300000, + 0x0201f800, 0x00020245, 0x0402000a, 0x42026000, + 0x0010bde9, 0x49366009, 0x492e6008, 0x0201f800, + 0x0010203c, 0x80000580, 0x5c026000, 0x1c01f000, + 0x82000540, 0x00000001, 0x0401f7fc, 0x4933c857, + 0x0201f800, 0x00109037, 0x02000800, 0x001005d8, + 0x4d2c0000, 0x4d340000, 0x4d440000, 0x4c580000, + 0x59325808, 0x59326809, 0x49425a06, 0x0201f800, + 0x00105755, 0x592e8c06, 0x592c4207, 0x82200500, + 0x0000000f, 0x0c01f806, 0x5c00b000, 0x5c028800, + 0x5c026800, 0x5c025800, 0x1c01f000, 0x00109466, + 0x00109488, 0x0010948f, 0x00109493, 0x0010949c, + 0x00109463, 0x00109463, 0x00109463, 0x001094a0, + 0x001094ac, 0x001094ac, 0x00109463, 0x00109463, + 0x00109463, 0x00109463, 0x00109463, 0x4803c857, + 0x0201f800, 0x001005d8, 0x814281c0, 0x04020012, + 0x41785800, 0x592c0404, 0x8c00051c, 0x04020002, + 0x59345c05, 0x442c2800, 0x59340008, 0x48002802, + 0x59340009, 0x48002801, 0x59340006, 0x48002804, + 0x59340007, 0x48002803, 0x4200b000, 0x0000000b, + 0x0401f037, 0x592c0207, 0x8c00051e, 0x4200b000, + 0x00000002, 0x04020032, 0x8204b540, 0x00000000, + 0x0400002f, 0x44042800, 0x59326809, 0x59340400, + 0x48002801, 0x4200b000, 0x00000002, 0x0401f028, + 0x814281c0, 0x04020030, 0x59345c05, 0x442c2800, + 0x4200b000, 0x00000001, 0x0401f021, 0x8340b540, + 0x00000000, 0x0400001e, 0x0401f027, 0x814281c0, + 0x04020025, 0x59340200, 0x44002800, 0x59340001, + 0x48002801, 0x4200b000, 0x00000002, 0x0401f014, + 0x8340b540, 0x00000000, 0x0402001b, 0x0401f010, + 0x8340b540, 0x00000000, 0x0400000d, 0x0201f800, + 0x00104a1f, 0x04000014, 0x8c20450e, 0x04000002, + 0x497a6009, 0x4178b000, 0x497a5a06, 0x0401f004, + 0x8340b540, 0x00000000, 0x0402000b, 0x592c0404, + 0x8400051c, 0x48025c04, 0x592c0207, 0x8400051e, + 0x48025a07, 0x0401f8aa, 0x497a6008, 0x0201f000, + 0x000202da, 0x592c0207, 0x8c00051e, 0x4200b000, + 0x00000002, 0x040207f2, 0x8204b540, 0x00000000, + 0x040007ef, 0x44042800, 0x4200b000, 0x00000001, + 0x0401f7eb, 0x4937c857, 0x4d300000, 0x0201f800, + 0x0002075a, 0x04000011, 0x49366009, 0x4a026406, + 0x00000001, 0x492e6008, 0x42000800, 0x0000000b, + 0x0201f800, 0x00104571, 0x4d380000, 0x42027000, + 0x00000043, 0x0201f800, 0x000207a1, 0x5c027000, + 0x82000540, 0x00000001, 0x5c026000, 0x1c01f000, + 0x4937c857, 0x4d2c0000, 0x59325808, 0x83380580, + 0x00000015, 0x04020025, 0x59a80016, 0x82000580, + 0x00000004, 0x04020021, 0x59a80010, 0x592c1009, + 0x80080580, 0x04020010, 0x4d440000, 0x592e8c06, + 0x592c0207, 0x4803c856, 0x82000500, 0x00000080, + 0x84000548, 0x4d3c0000, 0x42027800, 0x00001000, + 0x0201f800, 0x001049bb, 0x5c027800, 0x5c028800, + 0x0401f004, 0x4803c856, 0x0201f800, 0x00104a1f, + 0x0201f800, 0x00109037, 0x04000017, 0x4d400000, + 0x42028000, 0x00000000, 0x41780800, 0x0401ff38, + 0x5c028000, 0x0401f00e, 0x0201f800, 0x00104a1f, + 0x040207f4, 0x0201f800, 0x00109037, 0x0400000a, + 0x4c580000, 0x4200b000, 0x00000002, 0x0401f86e, + 0x5c00b000, 0x0201f800, 0x0010801c, 0x0201f800, + 0x0002077d, 0x5c025800, 0x1c01f000, 0x4937c857, + 0x4d300000, 0x0201f800, 0x0002075a, 0x04000012, + 0x49366009, 0x4a026406, 0x00000001, 0x4d3c0000, + 0x4d380000, 0x417a7800, 0x0201f800, 0x00104567, + 0x492e6008, 0x42027000, 0x00000004, 0x0201f800, + 0x000207a1, 0x5c027000, 0x5c027800, 0x82000540, + 0x00000001, 0x5c026000, 0x1c01f000, 0x4937c857, + 0x4d300000, 0x0201f800, 0x00107942, 0x0400000d, + 0x49366009, 0x4a026406, 0x00000001, 0x492e6008, + 0x4d380000, 0x42027000, 0x00000051, 0x0201f800, + 0x000207a1, 0x5c027000, 0x82000540, 0x00000001, + 0x5c026000, 0x1c01f000, 0x4933c857, 0x4c580000, + 0x59325808, 0x83383580, 0x00000015, 0x04020011, + 0x592c0008, 0x82000500, 0x00ffffff, 0x0402000a, + 0x0201f800, 0x00105755, 0x59cc0000, 0x82000500, + 0x00ffffff, 0x44002800, 0x4200b000, 0x00000001, + 0x0401f80b, 0x0201f800, 0x00107b38, 0x0401f006, + 0x4200b000, 0x00000002, 0x0401f823, 0x0201f800, + 0x0010801c, 0x5c00b000, 0x1c01f000, 0x492fc857, + 0x4c580000, 0x4c000000, 0x8058b1c0, 0x0400000b, + 0x82580500, 0xfffffff0, 0x02020800, 0x001005d8, + 0x8058b0d0, 0x592c0408, 0x82000500, 0xfffff0ff, + 0x80580540, 0x48025c08, 0x5c000000, 0x5c00b000, + 0x1c01f000, 0x492fc857, 0x4c000000, 0x4c040000, + 0x800000d8, 0x592c0c08, 0x82040d00, 0xffff0fff, + 0x80040540, 0x48025c08, 0x5c000800, 0x5c000000, + 0x1c01f000, 0x4933c857, 0x4d2c0000, 0x59325808, + 0x592c0207, 0x8400055e, 0x48025a07, 0x4c500000, + 0x4c540000, 0x4c580000, 0x0401ffd9, 0x0201f800, + 0x00105755, 0x46002800, 0x00000018, 0x80142800, + 0x8058b040, 0x83cca400, 0x00000007, 0x4014a800, + 0x0201f800, 0x0010ab17, 0x5c00b000, 0x5c00a800, + 0x5c00a000, 0x5c025800, 0x1c01f000, 0x59325808, + 0x592c0204, 0x82000580, 0x00000152, 0x1c01f000, + 0x5930001f, 0x80000540, 0x02020800, 0x00100d56, + 0x1c01f000, 0x4d2c0000, 0x59325808, 0x59300203, + 0x4933c857, 0x492fc857, 0x493bc857, 0x4803c857, + 0x82003480, 0x0000000e, 0x02021800, 0x001005d8, + 0x0c01f803, 0x5c025800, 0x1c01f000, 0x001095bd, + 0x001095c8, 0x00109603, 0x001095bd, 0x001095bd, + 0x001095bd, 0x001095bd, 0x001095bd, 0x001095bf, + 0x001095bd, 0x001095bd, 0x001095bd, 0x001095bd, + 0x001095bd, 0x0201f800, 0x001005d8, 0x83383480, + 0x00000056, 0x02021800, 0x001005d8, 0x493a6403, + 0x4a026203, 0x00000001, 0x0201f000, 0x0010672b, + 0x83380580, 0x00000013, 0x0402000f, 0x592c000c, + 0x800001c0, 0x04000006, 0x4a026203, 0x00000002, + 0x59a80037, 0x48026206, 0x1c01f000, 0x4a025a06, + 0x00000000, 0x0201f800, 0x000202da, 0x0201f000, + 0x0002077d, 0x83380580, 0x00000027, 0x0400001a, + 0x83380580, 0x00000014, 0x04000012, 0x83380580, + 0x00000015, 0x04000005, 0x83380580, 0x00000016, + 0x02020800, 0x001005d8, 0x0201f800, 0x00106f60, + 0x02020000, 0x00107974, 0x59300203, 0x82000580, + 0x00000002, 0x02020800, 0x001005d8, 0x0401f014, + 0x0201f800, 0x00106bbf, 0x4a02580e, 0x00000011, + 0x0401f005, 0x0201f800, 0x00106bbf, 0x4a02580e, + 0x00000010, 0x4a025a06, 0x00000031, 0x4a02580d, + 0x00000004, 0x0201f800, 0x000202da, 0x0201f800, + 0x00104c19, 0x0201f000, 0x00107911, 0x59341400, + 0x82081d00, 0x000000ff, 0x59300c03, 0x480bc857, + 0x4807c857, 0x82040580, 0x00000053, 0x0400002e, + 0x82040580, 0x00000002, 0x04000016, 0x82040580, + 0x00000001, 0x04000017, 0x82040580, 0x00000003, + 0x0400001c, 0x82040580, 0x00000005, 0x0400001d, + 0x82040580, 0x00000033, 0x0400001a, 0x82040580, + 0x00000000, 0x0400001b, 0x82040580, 0x00000004, + 0x02020800, 0x001005d8, 0x0401f8a1, 0x0401f016, + 0x820c0580, 0x00000003, 0x0400084c, 0x0401f012, + 0x820c0580, 0x0000000b, 0x0402000f, 0x42000800, + 0x00000007, 0x0201f800, 0x00104571, 0x0401f00a, + 0x820c0580, 0x00000005, 0x04000864, 0x0401f006, + 0x820c0580, 0x00000009, 0x04000889, 0x0401f002, + 0x0401f893, 0x4a026403, 0x00000052, 0x59a81016, + 0x592c040b, 0x8c000500, 0x04000003, 0x42001000, + 0x00000008, 0x592c040b, 0x8c000516, 0x04000003, + 0x82081400, 0x00000018, 0x592c000c, 0x497a580d, + 0x497a580e, 0x80080c80, 0x04000009, 0x04001005, + 0x4a025a06, 0x00000007, 0x40001000, 0x0401f006, + 0x4a025a06, 0x00000015, 0x0401f003, 0x4a025a06, + 0x00000000, 0x480a580c, 0x82081400, 0x00000003, + 0x80081104, 0x0201f800, 0x00107ab5, 0x04000010, + 0x592c1001, 0x480a600b, 0x58080800, 0x82080400, + 0x00000002, 0x592c1011, 0x592c1812, 0x42003000, + 0x00000000, 0x42002000, 0x00101200, 0x0201f800, + 0x00107c32, 0x04000002, 0x1c01f000, 0x4a025a06, + 0x0000002c, 0x497a580c, 0x0201f800, 0x000202da, + 0x0201f000, 0x0002077d, 0x83380580, 0x00000015, + 0x0402000a, 0x59a80005, 0x8c000514, 0x0402000b, + 0x0201f800, 0x0010462a, 0x42000800, 0x00000004, + 0x0201f000, 0x00104571, 0x42000800, 0x00000007, + 0x0201f000, 0x00104571, 0x0201f800, 0x0010513b, + 0x42001000, 0x00000010, 0x04020009, 0x59340002, + 0x82000500, 0x00ff0000, 0x82000580, 0x00ff0000, + 0x040007ec, 0x42001000, 0x00000008, 0x0201f800, + 0x00104c6d, 0x040007e7, 0x592c040b, 0x84000540, + 0x48025c0b, 0x0401f7e9, 0x83380580, 0x00000015, + 0x0402000f, 0x59a80005, 0x8c000514, 0x04020010, + 0x0201f800, 0x0010468d, 0x4d3c0000, 0x417a7800, + 0x0201f800, 0x00104567, 0x5c027800, 0x42000800, + 0x00000006, 0x0201f000, 0x00104571, 0x42000800, + 0x00000004, 0x0201f000, 0x00104571, 0x0201f800, + 0x0010513b, 0x42001000, 0x00000010, 0x04020009, + 0x59340002, 0x82000500, 0x00ff0000, 0x82000580, + 0x00ff0000, 0x040007e7, 0x42001000, 0x00000008, + 0x0201f800, 0x00104c6d, 0x040007e2, 0x592c040b, + 0x84000540, 0x48025c0b, 0x0401f7e9, 0x42000800, + 0x00000004, 0x0201f000, 0x00104571, 0x83380580, + 0x00000015, 0x04020005, 0x0201f800, 0x0010a2c8, + 0x02000800, 0x001048c1, 0x1c01f000, 0x83380580, + 0x00000015, 0x0402001d, 0x4c580000, 0x83cc1400, + 0x00000008, 0x4200b000, 0x00000002, 0x83341c00, + 0x00000006, 0x0201f800, 0x0010855a, 0x04020012, + 0x83cc1400, 0x0000000a, 0x4200b000, 0x00000002, + 0x83341c00, 0x00000008, 0x0201f800, 0x0010855a, + 0x04020009, 0x59342200, 0x59cc1007, 0x800811c0, + 0x04000003, 0x480a6801, 0x84102542, 0x8410251a, + 0x48126a00, 0x5c00b000, 0x1c01f000, 0x42000000, + 0x0010b87b, 0x0201f800, 0x0010aa47, 0x0201f800, + 0x00106c55, 0x59300203, 0x4933c857, 0x4803c857, + 0x82000c80, 0x0000000e, 0x02021800, 0x001005d8, + 0x0c01f803, 0x0201f000, 0x00106c4b, 0x0010970b, + 0x0010971a, 0x0010970c, 0x00109709, 0x00109709, + 0x00109709, 0x00109709, 0x00109709, 0x00109709, + 0x00109709, 0x00109709, 0x00109709, 0x00109709, + 0x00109709, 0x0201f800, 0x001005d8, 0x1c01f000, + 0x59300403, 0x82000580, 0x00000052, 0x02000000, + 0x00108d85, 0x0201f800, 0x00104c19, 0x59325808, + 0x4a025a06, 0x00000006, 0x0201f800, 0x000202da, + 0x0201f000, 0x00107911, 0x59301804, 0x840c0520, + 0x48026004, 0x598c000d, 0x81300580, 0x04020010, + 0x8c0c1d20, 0x04020010, 0x42001000, 0x0010b7f6, + 0x50081000, 0x58080002, 0x82000580, 0x00000100, + 0x0400000e, 0x5808000c, 0x81300580, 0x02020800, + 0x001005d8, 0x4978100c, 0x0401f003, 0x8c0c1d20, + 0x040207dc, 0x0201f800, 0x001068d3, 0x040007d9, + 0x0201f800, 0x001005d8, 0x0201f800, 0x00106e8e, + 0x040007f9, 0x59300203, 0x82000c80, 0x0000000e, + 0x02021800, 0x001005d8, 0x0c01f7bd, 0x4933c857, + 0x4c500000, 0x4c540000, 0x4c580000, 0x592c0c07, + 0x4806580a, 0x59cc0809, 0x48065807, 0x59cc0a08, + 0x4806580b, 0x59c80817, 0x82040500, 0x000003ff, + 0x800010c4, 0x8c040d14, 0x04000005, 0x59cc0002, + 0x82000500, 0x00000003, 0x80081480, 0x82080480, + 0x000000f1, 0x02021800, 0x001005d8, 0x480a621a, + 0x412c0800, 0x0201f800, 0x001007d3, 0x02000800, + 0x001005d8, 0x492c0809, 0x58040408, 0x84000552, + 0x84000540, 0x48000c08, 0x82081400, 0x00000003, + 0x80081104, 0x83cca400, 0x00000006, 0x832cac00, + 0x00000004, 0x42000800, 0x00000010, 0x82080480, + 0x00000010, 0x04021003, 0x40080800, 0x80000580, + 0x4004b000, 0x4c000000, 0x0201f800, 0x0010ab28, + 0x5c000000, 0x800001c0, 0x0400000d, 0x412c1000, + 0x4c000000, 0x0201f800, 0x001007d3, 0x02000800, + 0x001005d8, 0x492c1001, 0x832cac00, 0x00000004, + 0x5c000000, 0x40001000, 0x0401f7e9, 0x5c00b000, + 0x5c00a800, 0x5c00a000, 0x1c01f000, 0x4933c857, + 0x4d2c0000, 0x4c380000, 0x59325808, 0x5930021a, + 0x48025a08, 0x59301011, 0x800811c0, 0x04020008, + 0x4a025a06, 0x00000000, 0x592c000b, 0x82000500, + 0x00000c00, 0x0400000b, 0x0401f00b, 0x8c08153e, + 0x04000006, 0x4a025a06, 0x00000007, 0x80081080, + 0x80081000, 0x0401f003, 0x4a025a06, 0x00000015, + 0x480a5807, 0x42000000, 0x0010bed9, 0x50007000, + 0x5838000b, 0x80000540, 0x04020008, 0x4930700c, + 0x4930700b, 0x58380002, 0x82000580, 0x00000000, + 0x04020809, 0x0401f005, 0x82001400, 0x00000000, + 0x45301000, 0x4930700b, 0x5c007000, 0x5c025800, + 0x1c01f000, 0x4933c857, 0x592c0009, 0x40001000, + 0x4800700a, 0x82080400, 0x00000004, 0x48007003, + 0x592c000d, 0x592c100e, 0x48007007, 0x48087008, + 0x592c000a, 0x592c1208, 0x80080c80, 0x04001002, + 0x40001000, 0x82081400, 0x00000003, 0x80081104, + 0x82080480, 0x00000010, 0x04021003, 0x80000580, + 0x0401f003, 0x42001000, 0x00000010, 0x4800700d, + 0x48087004, 0x800810c4, 0x48087005, 0x40381000, + 0x0201f800, 0x00100858, 0x1c01f000, 0x4d2c0000, + 0x0201f800, 0x001007d3, 0x02000800, 0x001005d8, + 0x42000800, 0x0010bed9, 0x452c0800, 0x497a580b, + 0x497a580c, 0x497a580d, 0x4a025809, 0x001097ea, + 0x4a025802, 0x00000100, 0x4a025801, 0x00000000, + 0x5c025800, 0x1c01f000, 0x4833c857, 0x4d300000, + 0x4d2c0000, 0x4c5c0000, 0x4030b800, 0x585c000a, + 0x80025d40, 0x04020004, 0x585c000c, 0x4c000000, + 0x0401f044, 0x585c0002, 0x82000580, 0x00000100, + 0x04020022, 0x592c0801, 0x4c040000, 0x0201f800, + 0x001007f4, 0x5c000800, 0x800409c0, 0x0400001c, + 0x4804b80a, 0x585c100d, 0x800811c0, 0x04020005, + 0x40065800, 0x0201f800, 0x001007fd, 0x0401f014, + 0x82080480, 0x00000010, 0x04021003, 0x80000580, + 0x0401f003, 0x42001000, 0x00000010, 0x4800b80d, + 0x4808b804, 0x800810c4, 0x4808b805, 0x82040400, + 0x00000004, 0x4800b803, 0x405c1000, 0x0201f800, + 0x00100858, 0x0401f025, 0x0401f828, 0x585c000c, + 0x80026540, 0x59300000, 0x80000d40, 0x04020002, + 0x4800b80b, 0x4800b80c, 0x497a6000, 0x4c000000, + 0x4978b80a, 0x59325808, 0x4a025a04, 0x00000103, + 0x59300402, 0x48025c06, 0x592c100b, 0x4c080000, + 0x0201f800, 0x000202c1, 0x0201f800, 0x0010912a, + 0x5c001000, 0x8c081518, 0x04000004, 0x0201f800, + 0x001091d1, 0x0401f003, 0x0201f800, 0x0002077d, + 0x405c7000, 0x5c000000, 0x80026540, 0x04000003, + 0x59325808, 0x0401ff78, 0x5c00b800, 0x5c025800, + 0x5c026000, 0x1c01f000, 0x483bc857, 0x5838000a, + 0x40025800, 0x0201f800, 0x001007fd, 0x5838000c, + 0x80026540, 0x59300008, 0x80025d40, 0x4a025a06, + 0x00000002, 0x1c01f000, 0x4803c857, 0x4d1c0000, + 0x497a601c, 0x41323800, 0x40026000, 0x4d3c0000, + 0x42027800, 0x00000005, 0x0401f83c, 0x5c027800, + 0x411e6000, 0x59300414, 0x84000502, 0x48026414, + 0x5c023800, 0x1c01f000, 0x481bc857, 0x4933c857, + 0x4c5c0000, 0x4c600000, 0x4010b800, 0x4014c000, + 0x0201f800, 0x0010a942, 0x0201f800, 0x00103b25, + 0x04000008, 0x40602800, 0x405c3000, 0x0201f800, + 0x0010a446, 0x82000540, 0x00000001, 0x0401f002, + 0x80000580, 0x5c00c000, 0x5c00b800, 0x1c01f000, + 0x4803c856, 0x4d300000, 0x42026000, 0x0010d1c0, + 0x59a8000e, 0x81640580, 0x04000016, 0x59300c06, + 0x82040580, 0x00000001, 0x04000009, 0x82040580, + 0x00000004, 0x04000006, 0x82040580, 0x00000010, + 0x02000800, 0x00108cf9, 0x0401f005, 0x4807c857, + 0x0201f800, 0x001092d7, 0x04020808, 0x83326400, + 0x00000024, 0x41580000, 0x81300480, 0x040017e9, + 0x5c026000, 0x1c01f000, 0x4933c857, 0x59300403, + 0x4803c857, 0x0201f800, 0x00106c55, 0x4df00000, + 0x59300406, 0x4803c857, 0x82000d80, 0x00000002, + 0x04000018, 0x82000d80, 0x00000001, 0x04000009, + 0x82000d80, 0x00000004, 0x04000006, 0x4933c856, + 0x5c03e000, 0x02000800, 0x00106c4b, 0x0401f03c, + 0x59300203, 0x82000d80, 0x00000001, 0x04000018, + 0x82000d80, 0x00000002, 0x04000026, 0x82000d80, + 0x00000005, 0x04000023, 0x0201f800, 0x001005d8, + 0x59300203, 0x82000d80, 0x00000009, 0x0400000c, + 0x82000d80, 0x0000000b, 0x04000009, 0x82000d80, + 0x0000000a, 0x04000017, 0x82000d80, 0x0000000c, + 0x04000014, 0x0201f800, 0x001005d8, 0x598c000d, + 0x81300580, 0x04020004, 0x0201f800, 0x00106e8e, + 0x0402000c, 0x59300004, 0x4803c857, 0x8c000520, + 0x04000004, 0x84000520, 0x48026004, 0x0401f005, + 0x0201f800, 0x001068d3, 0x02020800, 0x001005d8, + 0x5c03e000, 0x02000800, 0x00106c4b, 0x59300406, + 0x82000d80, 0x00000002, 0x04000009, 0x0201f800, + 0x00104c19, 0x0201f800, 0x0010914e, 0x02000800, + 0x0010801c, 0x8d3e7d00, 0x04000003, 0x0201f000, + 0x00107911, 0x4a02621d, 0x00000001, 0x4a026403, + 0x00000085, 0x4a026203, 0x00000009, 0x4a026406, + 0x00000002, 0x42000800, 0x8000004b, 0x0201f000, + 0x00020721, 0x4933c857, 0x59368c03, 0x4c180000, + 0x59300203, 0x82003480, 0x0000000e, 0x02021800, + 0x001005d8, 0x0c01f803, 0x5c003000, 0x1c01f000, + 0x0010990a, 0x00109dcf, 0x00109edb, 0x0010990a, + 0x0010990a, 0x0010990a, 0x0010990a, 0x0010990a, + 0x0010992d, 0x0010990a, 0x0010990a, 0x0010990a, + 0x0010990a, 0x0010990a, 0x0201f800, 0x001005d8, + 0x4933c857, 0x42028800, 0x0000ffff, 0x813669c0, + 0x04000002, 0x59368c03, 0x4c180000, 0x59300203, + 0x82003480, 0x0000000e, 0x02021800, 0x001005d8, + 0x0c01f803, 0x5c003000, 0x1c01f000, 0x00109929, + 0x0010a180, 0x00109929, 0x00109929, 0x00109929, + 0x00109929, 0x00109929, 0x0010a952, 0x0010a0ed, + 0x0010a52c, 0x0010a562, 0x0010a52c, 0x0010a562, + 0x00109929, 0x0201f800, 0x001005d8, 0x0201f800, + 0x001005d8, 0x83383480, 0x00000051, 0x02021800, + 0x001005d8, 0x41380000, 0x493bc857, 0x4d1c0000, + 0x4d400000, 0x0c01f804, 0x5c028000, 0x5c023800, + 0x1c01f000, 0x0010998a, 0x00109b69, 0x0010998a, + 0x0010998a, 0x0010998a, 0x00109b74, 0x0010998a, + 0x0010998a, 0x0010998a, 0x0010998a, 0x0010998a, + 0x0010998a, 0x0010998a, 0x0010998a, 0x0010998a, + 0x0010998a, 0x0010998a, 0x0010998a, 0x0010998a, + 0x0010998a, 0x0010998a, 0x0010998a, 0x0010998a, + 0x001099ac, 0x001099f5, 0x00109a0c, 0x00109a62, + 0x00109ac6, 0x00109b04, 0x00109b34, 0x0010998a, + 0x0010998a, 0x00109b7c, 0x0010998a, 0x0010998a, + 0x00109b8a, 0x00109b93, 0x0010998a, 0x0010998a, + 0x0010998a, 0x0010998a, 0x0010998a, 0x00109c15, + 0x0010998a, 0x0010998a, 0x00109a9a, 0x0010998a, + 0x0010998a, 0x00109bec, 0x0010998a, 0x0010998a, + 0x0010998a, 0x00109c23, 0x0010998a, 0x0010998a, + 0x0010998a, 0x00109c6c, 0x0010998a, 0x0010998a, + 0x0010998a, 0x0010998a, 0x0010998a, 0x0010998a, + 0x00109cb9, 0x0010998a, 0x00109ce5, 0x00109cf0, + 0x0010998a, 0x0010998a, 0x0010998c, 0x00109cfb, + 0x0010998a, 0x0010998a, 0x0010998a, 0x0010999b, + 0x0010998a, 0x0010998a, 0x0010998a, 0x00109d02, + 0x00109d0a, 0x00109d28, 0x0201f800, 0x001005d8, + 0x4933c857, 0x0201f800, 0x0010a592, 0x040203a4, + 0x0201f800, 0x0010210a, 0x040203a1, 0x59cc0407, + 0x4802601c, 0x4a026403, 0x00000045, 0x4a026203, + 0x00000001, 0x0201f000, 0x0010672b, 0x4933c857, + 0x0201f800, 0x0010a592, 0x04020395, 0x0201f800, + 0x0010210a, 0x04020392, 0x0401fbce, 0x040201a0, + 0x59cc0007, 0x4802601c, 0x4a026403, 0x0000004a, + 0x4a026203, 0x00000001, 0x0201f000, 0x0010672b, + 0x4933c857, 0x0201f800, 0x0010210a, 0x04020009, + 0x0201f800, 0x001048ec, 0x04020006, 0x82000500, + 0x00000009, 0x82000580, 0x00000008, 0x04020008, + 0x4a026403, 0x00000009, 0x4a02641a, 0x00000009, + 0x4a02621a, 0x00000000, 0x0401f1b2, 0x0201f800, + 0x001048c1, 0x0201f800, 0x00104a09, 0x04000021, + 0x0201f800, 0x001049ed, 0x0400001e, 0x0201f800, + 0x0010a252, 0x04020025, 0x42028000, 0x00000029, + 0x4d3c0000, 0x417a7800, 0x0201f800, 0x0010203c, + 0x5c027800, 0x0201f800, 0x0010462a, 0x836c0580, + 0x00000002, 0x04020004, 0x59a8001b, 0x80000000, + 0x4803501b, 0x4a026403, 0x00000008, 0x42003000, + 0x00000003, 0x0201f800, 0x00103b25, 0x04000191, + 0x4a026203, 0x00000007, 0x41782800, 0x0401f180, + 0x0201f800, 0x0010a3da, 0x040207e1, 0x4a026403, + 0x00000009, 0x4a02641a, 0x0000000e, 0x4a02621a, + 0x00001900, 0x0401f183, 0x4a026403, 0x00000009, + 0x4a02641a, 0x00000003, 0x4a02621a, 0x00000f00, + 0x0401f17c, 0x4933c857, 0x0201f800, 0x0010210a, + 0x0402033b, 0x0201f800, 0x001048ec, 0x04020338, + 0x493a6403, 0x0201f800, 0x0010a22d, 0x04020006, + 0x42003000, 0x00000005, 0x4a026403, 0x00000006, + 0x0401f7d9, 0x4a026403, 0x00000007, 0x4a02641a, + 0x00000009, 0x4a02621a, 0x00000000, 0x0401f165, + 0x4933c857, 0x0201f800, 0x001048ec, 0x04020324, + 0x0201f800, 0x0010a592, 0x02000800, 0x0010210a, + 0x0402031f, 0x0201f800, 0x00104a09, 0x04020005, + 0x42027800, 0x00000001, 0x0201f800, 0x00104567, + 0x0201f800, 0x001049fc, 0x0402002b, 0x59cc0206, + 0x82003500, 0x00000003, 0x0402002e, 0x82003480, + 0x00000014, 0x0400102b, 0x5934300a, 0x84183516, + 0x82000580, 0x00000014, 0x04020002, 0x84183556, + 0x481a680a, 0x59cc0406, 0x82000500, 0x00000003, + 0x04020020, 0x0201f800, 0x0010a29f, 0x04020028, + 0x0201f800, 0x001049e7, 0x0402000c, 0x417a7800, + 0x0201f800, 0x001020a1, 0x42003000, 0x00000006, + 0x0201f800, 0x0010a93a, 0x42000000, 0x0010b865, + 0x0201f800, 0x0010aa47, 0x0201f800, 0x0010468d, + 0x4a026403, 0x0000000a, 0x42003000, 0x00000020, + 0x0401f795, 0x4a026403, 0x0000000b, 0x4a02641a, + 0x00000009, 0x4a02621a, 0x00001e00, 0x0401f121, + 0x42000000, 0x0010b860, 0x0201f800, 0x0010aa47, + 0x4a026403, 0x0000000b, 0x4a02641a, 0x00000007, + 0x4a02621a, 0x00000000, 0x0401f116, 0x4a026403, + 0x0000000b, 0x4a02641a, 0x00000003, 0x4a02621a, + 0x00000000, 0x0401f10f, 0x4933c857, 0x0201f800, + 0x001048ec, 0x040202ce, 0x0201f800, 0x0010a592, + 0x040202cb, 0x0201f800, 0x0010210a, 0x040202c8, + 0x59cc0206, 0x82003500, 0x00000003, 0x0402001d, + 0x82003480, 0x00000014, 0x0400101a, 0x59cc0406, + 0x82000500, 0x00000003, 0x04020016, 0x59340400, + 0x82000580, 0x00000707, 0x04000019, 0x417a7800, + 0x0201f800, 0x001020a1, 0x42003000, 0x0000000a, + 0x0201f800, 0x0010a93a, 0x42000000, 0x0010b862, + 0x0201f800, 0x0010aa47, 0x4a026403, 0x0000000c, + 0x41782800, 0x42003000, 0x00000021, 0x0401f752, + 0x4a026403, 0x0000000d, 0x4a02641a, 0x00000007, + 0x4a02621a, 0x00000000, 0x0401f0de, 0x4a026403, + 0x0000000d, 0x4a02641a, 0x00000009, 0x4a02621a, + 0x00001e00, 0x0401f0d7, 0x4933c857, 0x0201f800, + 0x001048ec, 0x04020296, 0x0201f800, 0x0010a592, + 0x04020293, 0x0201f800, 0x0010210a, 0x04020290, + 0x0401facc, 0x0402001a, 0x493a6403, 0x4c5c0000, + 0x0401fad2, 0x0402000e, 0x4a026403, 0x0000002e, + 0x405c2800, 0x42003000, 0x00000024, 0x0201f800, + 0x00103b25, 0x0400000c, 0x4a026203, 0x00000007, + 0x405c2800, 0x5c00b800, 0x0401f0ad, 0x4a026403, + 0x0000000d, 0x4a02641a, 0x00000007, 0x4a02621a, + 0x00000000, 0x5c00b800, 0x0401f0b2, 0x4a026403, + 0x0000000d, 0x4a02641a, 0x00000009, 0x4a02621a, + 0x00001e00, 0x0401f0ab, 0x4933c857, 0x0201f800, + 0x001048ec, 0x040206ef, 0x59a80026, 0x82000500, + 0x00000009, 0x82000580, 0x00000008, 0x040006e9, + 0x0201f800, 0x001049fc, 0x0402002d, 0x0201f800, + 0x0010a2a7, 0x04020007, 0x4a026403, 0x0000000e, + 0x41782800, 0x42003000, 0x00000052, 0x0401f702, + 0x4933c857, 0x42003000, 0x00000003, 0x0201f800, + 0x0010a942, 0x4d3c0000, 0x417a7800, 0x0201f800, + 0x0010203c, 0x5c027800, 0x42000000, 0x0010b864, + 0x0201f800, 0x0010aa47, 0x59340200, 0x84000558, + 0x48026a00, 0x42000800, 0x0000000b, 0x0201f800, + 0x00104571, 0x0201f800, 0x00103b25, 0x04000076, + 0x42003000, 0x00000007, 0x0401f062, 0x4933c857, + 0x4a026403, 0x0000000f, 0x4a02641a, 0x00000003, + 0x4a02621a, 0x00001e00, 0x0401f072, 0x59340400, + 0x82000580, 0x00000703, 0x040007f5, 0x0401f040, + 0x4933c857, 0x0201f800, 0x001048ec, 0x0402022c, + 0x59a80026, 0x82000500, 0x00000009, 0x82000580, + 0x00000008, 0x04000226, 0x0201f800, 0x001049f3, + 0x0402002f, 0x0201f800, 0x0010a2c8, 0x02000800, + 0x0010a252, 0x04020007, 0x4a026403, 0x00000010, + 0x41782800, 0x42003000, 0x00000050, 0x0401f6c2, + 0x4d3c0000, 0x417a7800, 0x0201f800, 0x0010203c, + 0x5c027800, 0x42003000, 0x00000003, 0x0201f800, + 0x0010a942, 0x42000000, 0x0010b864, 0x0201f800, + 0x0010aa47, 0x59340200, 0x84000558, 0x48026a00, + 0x0401f7c5, 0x4a026403, 0x00000011, 0x4a02641a, + 0x00000003, 0x4a02621a, 0x00001e00, 0x0401f03d, + 0x4933c857, 0x0201f800, 0x0010210a, 0x02000800, + 0x0010a592, 0x040201fa, 0x0401fa36, 0x04020008, + 0x4a026403, 0x00000012, 0x0401f032, 0x59340400, + 0x82000580, 0x00000703, 0x040007eb, 0x4d3c0000, + 0x417a7800, 0x42028000, 0x00000029, 0x0201f800, + 0x0010203c, 0x5c027800, 0x42003000, 0x00000017, + 0x0201f800, 0x0010a942, 0x42000000, 0x0010b864, + 0x0201f800, 0x0010aa47, 0x0201f800, 0x00103b25, + 0x04000015, 0x42003000, 0x00000006, 0x41782800, + 0x42028000, 0x00000029, 0x4933c857, 0x4a026403, + 0x00000001, 0x4a026203, 0x00000007, 0x0201f800, + 0x0010a974, 0x0201f000, 0x0010a43e, 0x42028000, + 0x00000046, 0x0201f800, 0x0010a974, 0x0201f000, + 0x0010a43e, 0x4933c857, 0x4a026403, 0x00000001, + 0x42000800, 0x0000000b, 0x0201f800, 0x00104571, + 0x4a026203, 0x00000001, 0x0201f000, 0x0010672b, + 0x4933c857, 0x42000800, 0x00000009, 0x0201f800, + 0x00104571, 0x4a026403, 0x00000005, 0x0401f7f5, + 0x0201f800, 0x0010a592, 0x040201b5, 0x0201f800, + 0x0010210a, 0x040201b2, 0x0401f9ee, 0x040207c0, + 0x4a026403, 0x00000020, 0x4a026203, 0x00000001, + 0x0201f000, 0x0010672b, 0x0201f800, 0x0010210a, + 0x040201a7, 0x4a026403, 0x00000023, 0x4a026203, + 0x00000001, 0x0201f000, 0x0010672b, 0x0201f800, + 0x0010a592, 0x02000800, 0x0010210a, 0x0402019c, + 0x0401f9d8, 0x040207aa, 0x40300800, 0x59a81010, + 0x59cc0007, 0x82000500, 0x00ffffff, 0x80080580, + 0x04000019, 0x59cc1408, 0x0201f800, 0x0010902c, + 0x0400002d, 0x59cc0c08, 0x4d300000, 0x0201f800, + 0x00105dd7, 0x41323800, 0x5c026000, 0x04000026, + 0x591c0202, 0x82000580, 0x0000ffff, 0x04000005, + 0x59cc1208, 0x591c0202, 0x80080580, 0x0402001e, + 0x591c0406, 0x82000580, 0x00000007, 0x0402001a, + 0x0401f02c, 0x59cc1208, 0x82080580, 0x0000ffff, + 0x0400000c, 0x0201f800, 0x00109410, 0x04000012, + 0x59cc1408, 0x591c0202, 0x80080580, 0x0402000e, + 0x591c0009, 0x81340580, 0x04000016, 0x0401f00a, + 0x59cc1408, 0x417a7800, 0x0201f800, 0x0010a405, + 0x04020010, 0x59cc1208, 0x82080580, 0x0000ffff, + 0x04000019, 0x4a026403, 0x00000026, 0x4a02621a, + 0x00001700, 0x59cc1204, 0x82081580, 0x0000ffff, + 0x04020798, 0x4a026403, 0x00000025, 0x0401f795, + 0x591c0406, 0x82000580, 0x00000007, 0x040207f2, + 0x591c0403, 0x82000580, 0x00000024, 0x04020006, + 0x4d300000, 0x411e6000, 0x0201f800, 0x0002077d, + 0x5c026000, 0x4a026403, 0x00000025, 0x0401f785, + 0x4933c857, 0x4d3c0000, 0x42027800, 0x00000001, + 0x0201f800, 0x00104567, 0x5c027800, 0x4c580000, + 0x4200b000, 0x00000002, 0x83a81c00, 0x00000002, + 0x83cc1400, 0x0000000b, 0x0201f800, 0x0010855a, + 0x5c00b000, 0x04000004, 0x4a026403, 0x00000031, + 0x0401f770, 0x0201f800, 0x00107911, 0x0201f800, + 0x0010513b, 0x0402000f, 0x0201f800, 0x00105149, + 0x04020008, 0x4a035033, 0x00000001, 0x4202d800, + 0x00000001, 0x0201f800, 0x001050a2, 0x0401f005, + 0x42000000, 0x00000001, 0x0201f800, 0x00105113, + 0x1c01f000, 0x0201f800, 0x0010210a, 0x0402011c, + 0x0401f958, 0x0402072a, 0x493a6403, 0x0401f996, + 0x04020004, 0x4a026403, 0x0000002b, 0x0401f751, + 0x4a026403, 0x0000002c, 0x0401f74e, 0x4933c857, + 0x0201f800, 0x0010210a, 0x0402010d, 0x0201f800, + 0x001049e7, 0x04020740, 0x0201f800, 0x001048d9, + 0x0400003c, 0x59cc0408, 0x48026419, 0x59cc0208, + 0x48026219, 0x59cc0807, 0x59340002, 0x82000500, + 0x00ffffff, 0x80040580, 0x04000012, 0x59a80010, + 0x80040580, 0x04020021, 0x59cc1408, 0x0201f800, + 0x00109410, 0x04000023, 0x0201f800, 0x0010a4ca, + 0x04000020, 0x0201f800, 0x0010a921, 0x0400001d, + 0x491e601e, 0x4a026403, 0x00000036, 0x0401f0e6, + 0x59cc1208, 0x82080580, 0x0000ffff, 0x04000009, + 0x0201f800, 0x00109410, 0x04000012, 0x591c0202, + 0x59cc0c08, 0x80040580, 0x0402000e, 0x0401f7eb, + 0x59cc1408, 0x41327800, 0x0201f800, 0x0010a405, + 0x04000008, 0x0401f7e5, 0x4803c856, 0x4a02641a, + 0x00000009, 0x4a02621a, 0x00001500, 0x0401f006, + 0x4803c856, 0x4a02641a, 0x00000003, 0x4a02621a, + 0x00001700, 0x4a026403, 0x00000037, 0x0401f0c6, + 0x4803c856, 0x4a026403, 0x00000012, 0x0401f0c2, + 0x4933c857, 0x0201f800, 0x0010210a, 0x040200c4, + 0x0201f800, 0x001049e7, 0x040206f7, 0x0201f800, + 0x001048d9, 0x0400003e, 0x59cc0407, 0x48026419, + 0x59cc1207, 0x480a6219, 0x82080580, 0x0000ffff, + 0x04000005, 0x0201f800, 0x00109410, 0x0400002c, + 0x0401f006, 0x59cc1407, 0x41327800, 0x0201f800, + 0x0010a405, 0x04000026, 0x59cc0c07, 0x591c0202, + 0x80040580, 0x04020022, 0x4d300000, 0x411e6000, + 0x0201f800, 0x00108bd7, 0x5c026000, 0x59cc0c09, + 0x82040d00, 0x0000ff00, 0x840409c0, 0x0201f800, + 0x0010a921, 0x04000016, 0x82040580, 0x00000001, + 0x0400000a, 0x82040580, 0x00000005, 0x04000004, + 0x82040580, 0x00000007, 0x04020007, 0x591c0008, + 0x80000540, 0x04000004, 0x59cc2808, 0x0201f000, + 0x0010a4de, 0x4803c856, 0x4a02641a, 0x00000009, + 0x4a02621a, 0x00002a00, 0x0401f006, 0x4803c856, + 0x4a02641a, 0x00000003, 0x4a02621a, 0x00000300, + 0x4a026403, 0x0000003b, 0x0401f07b, 0x4803c856, + 0x4a02641a, 0x0000000b, 0x4a02621a, 0x00000000, + 0x0401f7f8, 0x4c080000, 0x0201f800, 0x001048ec, + 0x04000026, 0x0201f800, 0x001048c1, 0x0201f800, + 0x0010a601, 0x0402001e, 0x59a80026, 0x82000540, + 0x00000003, 0x48035026, 0x59a8001d, 0x800000d0, + 0x59a80810, 0x82040d00, 0x000000ff, 0x80041540, + 0x480b5010, 0x42000800, 0x00000003, 0x0201f800, + 0x00106c78, 0x497b5028, 0x0201f800, 0x00103b25, + 0x04000003, 0x4a032804, 0x000007d0, 0x8c00050a, + 0x0402000a, 0x0201f800, 0x0002077d, 0x0201f800, + 0x00101e45, 0x5c001000, 0x1c01f000, 0x0201f800, + 0x0010a623, 0x0401f7fc, 0x5c001000, 0x0201f000, + 0x0002077d, 0x0201f800, 0x0010210a, 0x0402004c, + 0x0201f800, 0x0010a628, 0x4a026403, 0x00000047, + 0x4a026203, 0x00000001, 0x0201f000, 0x0010672b, + 0x0201f800, 0x0010210a, 0x04020041, 0x0201f800, + 0x0010a628, 0x4a026403, 0x00000047, 0x4a026203, + 0x00000001, 0x0201f000, 0x0010672b, 0x0201f800, + 0x0010210a, 0x04020036, 0x0201f800, 0x0010a628, + 0x0201f000, 0x0002077d, 0x0401f834, 0x04000030, + 0x4a026403, 0x0000004e, 0x4a026203, 0x00000001, + 0x0201f000, 0x0010672b, 0x4a026403, 0x0000004f, + 0x497a601c, 0x59cc0a06, 0x82040d00, 0x000000ff, + 0x800409c0, 0x0400065f, 0x82040580, 0x00000001, + 0x04020005, 0x59cc0808, 0x59a80005, 0x80040580, + 0x04000658, 0x82040580, 0x00000002, 0x0402000a, + 0x83cc1400, 0x0000000b, 0x4200b000, 0x00000002, + 0x83341c00, 0x00000006, 0x0201f800, 0x0010855a, + 0x0400064c, 0x4a02601c, 0x00000001, 0x0401f649, + 0x4a026403, 0x00000050, 0x59cc0207, 0x4802601c, + 0x0401f644, 0x4a026203, 0x00000001, 0x42000800, + 0x80000040, 0x0201f000, 0x00020721, 0x4803c857, + 0x0201f000, 0x0002077d, 0x4d2c0000, 0x4c500000, + 0x4c580000, 0x4c540000, 0x59a80016, 0x82000c80, + 0x00000829, 0x04021029, 0x0201f800, 0x001007d3, + 0x04000026, 0x492e6008, 0x59a80016, 0x80000104, + 0x48025802, 0x83cca400, 0x00000006, 0x82000c80, + 0x0000000b, 0x04001013, 0x4a025811, 0x0000000b, + 0x4200b000, 0x0000000b, 0x832c0400, 0x00000005, + 0x4000a800, 0x0201f800, 0x0010ab17, 0x412c7000, + 0x0201f800, 0x001007d3, 0x04000010, 0x492c7001, + 0x40040000, 0x800409c0, 0x04000009, 0x0401f7ec, + 0x48025811, 0x4000b000, 0x832c0400, 0x00000005, + 0x4000a800, 0x0201f800, 0x0010ab17, 0x82000540, + 0x00000001, 0x0401f006, 0x497b5016, 0x59325808, + 0x0201f800, 0x001007fd, 0x80000580, 0x5c00a800, + 0x5c00b000, 0x5c00a000, 0x5c025800, 0x1c01f000, + 0x4d340000, 0x59326809, 0x59343400, 0x4933c857, + 0x4937c857, 0x481bc857, 0x0201f800, 0x001049f3, + 0x5c026800, 0x1c01f000, 0x4933c857, 0x4c5c0000, + 0x4d3c0000, 0x0401f840, 0x0402002c, 0x59cc0207, + 0x82000d00, 0x0000ff00, 0x900411c0, 0x59cc000a, + 0x82000500, 0x00ffffff, 0x80081540, 0x480a601c, + 0x8c040d18, 0x0400000e, 0x42003000, 0x00000008, + 0x0201f800, 0x0010a932, 0x42000000, 0x0010b863, + 0x0201f800, 0x0010aa47, 0x4200b800, 0x00000002, + 0x42027800, 0x00000001, 0x0401f011, 0x4178b800, + 0x8c040d1a, 0x04000011, 0x59cc000a, 0x0201f800, + 0x00105c9a, 0x0402000d, 0x42003000, 0x00000009, + 0x0201f800, 0x0010a93a, 0x42000000, 0x0010b863, + 0x0201f800, 0x0010aa47, 0x417a7800, 0x0201f800, + 0x001020a1, 0x0401f004, 0x82000540, 0x00000001, + 0x0401f002, 0x80000580, 0x5c027800, 0x5c00b800, + 0x1c01f000, 0x4933c857, 0x59cc0206, 0x82000480, + 0x00000010, 0x04021006, 0x4a02621a, 0x00000000, + 0x82000540, 0x00000001, 0x0401f002, 0x80000580, + 0x1c01f000, 0x4933c857, 0x4a02621a, 0x00000000, + 0x59cc0407, 0x82000500, 0x0000ff00, 0x82000580, + 0x00000800, 0x04020009, 0x59cc0006, 0x82000500, + 0x00ff0000, 0x82000d80, 0x00140000, 0x04000003, + 0x82000d80, 0x00100000, 0x1c01f000, 0x4933c857, + 0x59300403, 0x82003480, 0x00000051, 0x02021800, + 0x001005d8, 0x83383580, 0x00000013, 0x04020003, + 0x4803c857, 0x0c01f012, 0x83383580, 0x00000027, + 0x04000005, 0x83383580, 0x00000014, 0x02020800, + 0x001005d8, 0x0201f800, 0x001048c1, 0x42000800, + 0x00000007, 0x0201f800, 0x00104571, 0x0201f800, + 0x00106bbf, 0x0201f000, 0x00107911, 0x00109e3c, + 0x00109e45, 0x00109e3c, 0x00109e3c, 0x00109e3c, + 0x00109e45, 0x00109e50, 0x00109ecd, 0x00109e95, + 0x00109ecd, 0x00109ead, 0x00109ecd, 0x00109ebe, + 0x00109ecd, 0x00109ec6, 0x00109ecd, 0x00109ec6, + 0x00109ecd, 0x00109ecd, 0x00109e3c, 0x00109e3c, + 0x00109e3c, 0x00109e3c, 0x00109e3c, 0x00109e3c, + 0x00109e3c, 0x00109e3c, 0x00109e3c, 0x00109e3c, + 0x00109e3c, 0x00109e45, 0x00109e3c, 0x00109ecd, + 0x00109e3c, 0x00109e3c, 0x00109ecd, 0x00109e3c, + 0x00109eca, 0x00109ecd, 0x00109e3c, 0x00109e3c, + 0x00109e3c, 0x00109e3c, 0x00109ecd, 0x00109ecd, + 0x00109e3c, 0x00109ec3, 0x00109ecd, 0x00109e3c, + 0x00109e4a, 0x00109e3c, 0x00109e3c, 0x00109e3c, + 0x00109e3c, 0x00109ec9, 0x00109ecd, 0x00109e3c, + 0x00109e3c, 0x00109ecd, 0x00109ecd, 0x00109e3c, + 0x00109e3c, 0x00109e3c, 0x00109e3c, 0x00109e3c, + 0x00109e3c, 0x00109e3c, 0x00109e3c, 0x00109e3c, + 0x00109e3e, 0x00109e3c, 0x00109e3e, 0x00109e3c, + 0x00109e3c, 0x00109e3e, 0x00109e3c, 0x00109e3c, + 0x00109e3c, 0x00109e3e, 0x00109e3e, 0x00109e3e, + 0x0201f800, 0x001005d8, 0x4d2c0000, 0x59325808, + 0x0201f800, 0x001007fd, 0x5c025800, 0x0201f000, + 0x0002077d, 0x59a80037, 0x48026206, 0x4a026203, + 0x00000002, 0x1c01f000, 0x4d3c0000, 0x417a7800, + 0x0201f800, 0x00104567, 0x5c027800, 0x0401f07e, + 0x42000800, 0x00000007, 0x0201f800, 0x00104571, + 0x59a80026, 0x8c000508, 0x04000012, 0x59326809, + 0x4c580000, 0x4200b000, 0x00000002, 0x83a81c00, + 0x00000002, 0x83341400, 0x00000006, 0x0201f800, + 0x0010855a, 0x80000540, 0x5c00b000, 0x0402006a, + 0x59340200, 0x8400051a, 0x48026a00, 0x0401f01b, + 0x599c0017, 0x8c00050a, 0x04020063, 0x4d3c0000, + 0x417a7800, 0x0201f800, 0x00104567, 0x5c027800, + 0x42000800, 0x00000007, 0x0201f800, 0x00104571, + 0x59340212, 0x82000500, 0x0000ff00, 0x04000056, + 0x599c0019, 0x8c00050e, 0x04020053, 0x416c0000, + 0x82000580, 0x00000002, 0x04020004, 0x59a8001b, + 0x80000000, 0x4803501b, 0x42000800, 0x00000003, + 0x0201f800, 0x00104571, 0x4a026406, 0x00000001, + 0x4a026203, 0x00000001, 0x4a026403, 0x00000002, + 0x0201f800, 0x0010672b, 0x4ce80000, 0x4201d000, + 0x00000001, 0x0201f800, 0x00105fae, 0x5c01d000, + 0x1c01f000, 0x0201f800, 0x001049f3, 0x04000036, + 0x0201f800, 0x0010645e, 0x42000800, 0x00000004, + 0x0201f800, 0x00104571, 0x0201f800, 0x0010a96a, + 0x0402002d, 0x42000800, 0x00000005, 0x0201f800, + 0x00104571, 0x4a026406, 0x00000001, 0x4a026203, + 0x00000001, 0x4a026403, 0x00000003, 0x0201f000, + 0x0010672b, 0x42000800, 0x00000006, 0x0401f820, + 0x59303009, 0x599c0017, 0x8c00050a, 0x0402001a, + 0x59a80026, 0x8c000508, 0x04000017, 0x0201f800, + 0x001049e7, 0x04000014, 0x59a8001b, 0x80000000, + 0x4803501b, 0x0401f7c5, 0x42000800, 0x00000004, + 0x0201f800, 0x00104571, 0x0401f792, 0x42000800, + 0x00000004, 0x0401f006, 0x0201f800, 0x001048c1, + 0x0401f005, 0x0401f004, 0x0401f003, 0x0201f800, + 0x00104571, 0x0201f000, 0x0002077d, 0x4933c857, + 0x4807c857, 0x0201f800, 0x00104571, 0x4d3c0000, + 0x417a7800, 0x0201f800, 0x00104567, 0x5c027800, + 0x0201f800, 0x00102074, 0x1c01f000, 0x4933c857, + 0x59340400, 0x80000110, 0x82003480, 0x0000000c, + 0x02021800, 0x001005d8, 0x83383580, 0x00000015, + 0x04020002, 0x0c01f006, 0x83383580, 0x00000016, + 0x02020800, 0x001005d8, 0x0c01f00d, 0x001080b8, + 0x001080b8, 0x001080b8, 0x001080b8, 0x001080b8, + 0x001080b8, 0x00109f30, 0x00109f03, 0x001080b8, + 0x001080b8, 0x001080b8, 0x001080b8, 0x001080b8, + 0x001080b8, 0x001080b8, 0x001080b8, 0x001080b8, + 0x001080b8, 0x00109f30, 0x00109f37, 0x001080b8, + 0x001080b8, 0x001080b8, 0x001080b8, 0x4933c857, + 0x599c0017, 0x8c00050a, 0x0402001b, 0x813669c0, + 0x04000019, 0x59340212, 0x82000500, 0x0000ff00, + 0x04000015, 0x599c0019, 0x8c00050e, 0x04020012, + 0x4d3c0000, 0x417a7800, 0x0201f800, 0x00104567, + 0x5c027800, 0x42000800, 0x00000003, 0x0201f800, + 0x00104571, 0x4a026406, 0x00000001, 0x4a026203, + 0x00000001, 0x4a026403, 0x00000002, 0x0201f000, + 0x0010672b, 0x59cc0001, 0x0201f800, 0x00105c9a, + 0x0402000b, 0x0201f800, 0x00020245, 0x02020000, + 0x0002077d, 0x59345002, 0x0201f800, 0x001042b4, + 0x482a6802, 0x0201f000, 0x0002077d, 0x1c01f000, + 0x4933c857, 0x59303403, 0x82183580, 0x0000001e, + 0x02000000, 0x0002077d, 0x1c01f000, 0x4933c857, + 0x0201f800, 0x001083df, 0x02020000, 0x0002077d, + 0x4a026203, 0x00000001, 0x4a026403, 0x00000001, + 0x0201f000, 0x0010672b, 0x493bc857, 0x83380580, + 0x00000051, 0x0402000b, 0x0201f800, 0x00106f60, + 0x02020000, 0x00107974, 0x59300203, 0x82000580, + 0x00000002, 0x0400006d, 0x0201f800, 0x001005d8, + 0x83380580, 0x00000027, 0x04000014, 0x83380580, + 0x00000048, 0x04000006, 0x83380580, 0x00000014, + 0x0400000e, 0x02020800, 0x001005d8, 0x0201f800, + 0x00106f60, 0x02020000, 0x00107974, 0x59300203, + 0x82000580, 0x00000004, 0x02000000, 0x0002086e, + 0x0201f800, 0x001005d8, 0x59300403, 0x82000c80, + 0x00000044, 0x02021800, 0x001005d8, 0x82000480, + 0x00000040, 0x02001800, 0x001005d8, 0x40027000, + 0x4803c857, 0x0c01f001, 0x00109f76, 0x00109f78, + 0x00109f78, 0x00109f93, 0x0201f800, 0x001005d8, + 0x0201f800, 0x00106bbf, 0x59325808, 0x812e59c0, + 0x04000016, 0x832c0500, 0x00ff0000, 0x04000013, + 0x4a026203, 0x00000002, 0x59326809, 0x59340200, + 0x8c00050e, 0x0402000d, 0x42028000, 0x00000004, + 0x0201f800, 0x0010a3ef, 0x497a6008, 0x59300206, + 0x80000540, 0x04020003, 0x59a80038, 0x48026206, + 0x4a026203, 0x00000007, 0x1c01f000, 0x0201f800, + 0x00106bbf, 0x0201f800, 0x00109037, 0x02000000, + 0x00107911, 0x59325808, 0x0201f800, 0x001007f4, + 0x0201f000, 0x00107911, 0x0201f800, 0x001005d8, + 0x59325808, 0x592c040a, 0x8c000502, 0x04000007, + 0x4a026203, 0x00000007, 0x42027000, 0x00000043, + 0x0201f000, 0x000207a1, 0x4a026203, 0x00000004, + 0x1c01f000, 0x0201f800, 0x0010a597, 0x02000000, + 0x0002086c, 0x1c01f000, 0x4a026203, 0x00000001, + 0x4a026403, 0x00000041, 0x42027800, 0x80002042, + 0x0201f000, 0x00020721, 0x83380580, 0x00000051, + 0x04000006, 0x83380580, 0x00000041, 0x02020800, + 0x001005d8, 0x1c01f000, 0x0201f800, 0x000206fd, + 0x0201f800, 0x0010a5df, 0x0201f000, 0x0002077d, + 0x83380480, 0x00000050, 0x02021800, 0x001005d8, + 0x83380480, 0x00000049, 0x02001800, 0x001005d8, + 0x0c01f001, 0x00109fda, 0x00109ffb, 0x00109fd8, + 0x00109fd8, 0x00109fd8, 0x00109fd8, 0x00109ffb, + 0x0201f800, 0x001005d8, 0x59325808, 0x592c040a, + 0x8c00051e, 0x0400000d, 0x82000d00, 0x000000c0, + 0x82040d80, 0x00000080, 0x0400000d, 0x59300804, + 0x8c040d18, 0x0402000a, 0x42027000, 0x00000041, + 0x0201f000, 0x0002088d, 0x4a026203, 0x00000007, + 0x497a6206, 0x0201f000, 0x000206fd, 0x59325808, + 0x592c0c0a, 0x8c040d1a, 0x04020005, 0x0201f800, + 0x000206fd, 0x0201f000, 0x0002077d, 0x0201f800, + 0x0010a597, 0x040007fa, 0x1c01f000, 0x0201f800, + 0x00106b8a, 0x59325808, 0x59326809, 0x59340200, + 0x8c00050e, 0x0400000e, 0x592c040a, 0x82000500, + 0x000000c0, 0x82000580, 0x00000080, 0x04000005, + 0x592c000f, 0x59301815, 0x800c1c80, 0x480e6015, + 0x4a026203, 0x00000002, 0x0401f00d, 0x42028000, + 0x00000004, 0x0401fbde, 0x59300206, 0x80000540, + 0x04020004, 0x59a80038, 0x800000c2, 0x48026206, + 0x497a6008, 0x4a026203, 0x00000007, 0x1c01f000, + 0x4a026203, 0x00000007, 0x497a6206, 0x0201f000, + 0x000206fd, 0x4a026203, 0x00000007, 0x497a6206, + 0x0201f000, 0x000206f8, 0x59300414, 0x8c00051c, + 0x02020000, 0x0002087e, 0x59325808, 0x592c200f, + 0x40080000, 0x80102480, 0x59300015, 0x80102400, + 0x48126015, 0x0201f000, 0x0002087e, 0x8c040d0e, + 0x0402000a, 0x4a026203, 0x00000006, 0x0401f823, + 0x5930001f, 0x80000540, 0x02020800, 0x00100d7c, + 0x0201f000, 0x000206f8, 0x4a026203, 0x00000002, + 0x1c01f000, 0x42000800, 0x00000001, 0x0201f800, + 0x00100d7c, 0x82040580, 0x00000001, 0x02000000, + 0x00020885, 0x0401f7d8, 0x59300414, 0x8c00051c, + 0x04000006, 0x0201f800, 0x00100b63, 0x02000000, + 0x00020877, 0x1c01f000, 0x59300011, 0x80000540, + 0x04020005, 0x0201f800, 0x00100b63, 0x02000000, + 0x00020877, 0x1c01f000, 0x492fc857, 0x480bc857, + 0x8c08153e, 0x04000006, 0x80081080, 0x80081000, + 0x42000800, 0x00000009, 0x0401f003, 0x42000800, + 0x00000015, 0x480a580b, 0x1c01f000, 0x83380580, + 0x00000013, 0x04000005, 0x83380580, 0x00000014, + 0x02020800, 0x001005d8, 0x59300414, 0x8c000516, + 0x02000800, 0x001005d8, 0x1c01f000, 0x0201f800, + 0x001005d8, 0x59300008, 0x80000540, 0x02020800, + 0x001005d8, 0x1c01f000, 0x59300414, 0x8c000516, + 0x02000800, 0x001005d8, 0x1c01f000, 0x4a026203, + 0x00000004, 0x493a6403, 0x42000800, 0x80002001, + 0x0201f000, 0x00020721, 0x4a026203, 0x00000003, + 0x493a6403, 0x0201f800, 0x000200c9, 0x59325808, + 0x592c040a, 0x8c00051e, 0x04000012, 0x82000500, + 0x000000c0, 0x82000580, 0x00000080, 0x04000011, + 0x59300414, 0x8c000512, 0x0402000a, 0x8c000510, + 0x04020008, 0x592c040c, 0x80000540, 0x04020005, + 0x82080d40, 0x80003065, 0x0201f000, 0x00106721, + 0x82080d40, 0x80002065, 0x0201f000, 0x00106721, + 0x82080d40, 0x80002042, 0x0201f000, 0x00106721, + 0x4933c857, 0x493bc857, 0x83380480, 0x00000044, + 0x02021800, 0x001005d8, 0x83380480, 0x00000041, + 0x02001800, 0x001005d8, 0x0c01f001, 0x0010a0b6, + 0x0010a0c6, 0x0010a0db, 0x59325808, 0x592c040a, + 0x8c00051e, 0x0400001d, 0x82001d00, 0x000000c0, + 0x820c1d80, 0x000000c0, 0x04000018, 0x4a026203, + 0x00000001, 0x493a6403, 0x42000800, 0x80002042, + 0x0201f000, 0x00020721, 0x59325808, 0x592c040a, + 0x8c00051e, 0x0400000d, 0x82001d00, 0x000000c0, + 0x820c1d80, 0x000000c0, 0x04000008, 0x4a026203, + 0x00000001, 0x493a6403, 0x42000800, 0x80002001, + 0x0201f000, 0x00020721, 0x497a6008, 0x497a6206, + 0x42028000, 0x00000004, 0x0401f315, 0x59325808, + 0x592c040a, 0x8c00051e, 0x040007f8, 0x82001d00, + 0x000000c0, 0x820c1d80, 0x000000c0, 0x040007f3, + 0x4a026203, 0x00000003, 0x493a6403, 0x0201f800, + 0x000200c9, 0x82080d40, 0x80002065, 0x0201f000, + 0x00106721, 0x4933c857, 0x493bc857, 0x83380580, + 0x00000085, 0x04000006, 0x83380580, 0x00000088, + 0x0400000a, 0x0201f800, 0x001005d8, 0x4a026203, + 0x00000009, 0x493a6403, 0x42000800, 0x8000004b, + 0x0201f000, 0x00020721, 0x4d1c0000, 0x813669c0, + 0x04000004, 0x0201f800, 0x0010a592, 0x04020044, + 0x59cc1404, 0x0401f846, 0x04000018, 0x591c0406, + 0x82000500, 0x0000001f, 0x82002580, 0x00000006, + 0x04000007, 0x82002580, 0x00000004, 0x0400002e, + 0x82002580, 0x00000011, 0x0402000c, 0x497a3a05, + 0x42002000, 0x00000054, 0x0201f800, 0x00107a4a, + 0x4a026203, 0x00000007, 0x493a6403, 0x0201f800, + 0x0010a974, 0x0401f02c, 0x0201f800, 0x00103b25, + 0x04000004, 0x42023800, 0xffffffff, 0x0401f7f1, + 0x813669c0, 0x04020009, 0x59cc0001, 0x0201f800, + 0x00105c9a, 0x0402001e, 0x0201f800, 0x001045a6, + 0x0402001b, 0x49366009, 0x4a026403, 0x00000087, + 0x59cc1204, 0x82081580, 0x0000ffff, 0x04020003, + 0x4a026403, 0x00000086, 0x4a026203, 0x00000001, + 0x42000800, 0x80000040, 0x0201f800, 0x00020721, + 0x0401f00d, 0x591c0203, 0x82000580, 0x00000007, + 0x040207de, 0x4d300000, 0x411e6000, 0x0201f800, + 0x00107911, 0x5c026000, 0x0401f7d8, 0x0201f800, + 0x00107911, 0x5c023800, 0x1c01f000, 0x4933c857, + 0x480bc857, 0x42002800, 0x0010d1c0, 0x41300000, + 0x80140580, 0x04000017, 0x58140203, 0x82000580, + 0x00000000, 0x04000013, 0x58140202, 0x80080580, + 0x04020010, 0x58141c06, 0x820c0580, 0x00000005, + 0x0400000c, 0x820c0580, 0x00000009, 0x0400001d, + 0x59302009, 0x58140009, 0x800001c0, 0x0400000b, + 0x801021c0, 0x04000003, 0x80100580, 0x04000010, + 0x82142c00, 0x00000024, 0x41540000, 0x80140480, + 0x0402100e, 0x0401f7e2, 0x5814001e, 0x801021c0, + 0x04000005, 0x58102002, 0x82102500, 0x00ffffff, + 0x0401f7f2, 0x5810201e, 0x0401f7f0, 0x40163800, + 0x81300540, 0x0401f002, 0x80000580, 0x1c01f000, + 0x58141807, 0x8c0c1d10, 0x040207ea, 0x0401f7e1, + 0x4933c857, 0x493bc857, 0x83380580, 0x00000013, + 0x0402000e, 0x59300403, 0x82000c80, 0x00000085, + 0x02001800, 0x001005d8, 0x82000c80, 0x00000093, + 0x02021800, 0x001005d8, 0x82000480, 0x00000085, + 0x4803c857, 0x0c01f018, 0x83380580, 0x00000027, + 0x04000005, 0x83380580, 0x00000014, 0x02020000, + 0x00107974, 0x0201f800, 0x00106bbf, 0x59325808, + 0x812e59c0, 0x02000000, 0x00107911, 0x4a025a06, + 0x00000031, 0x4a025811, 0x00000004, 0x4a025812, + 0x000000ff, 0x0201f800, 0x000202da, 0x0201f000, + 0x00107911, 0x0010a1b7, 0x0010a1be, 0x0010a1be, + 0x0010a1b7, 0x0010a1b7, 0x0010a1b7, 0x0010a1b7, + 0x0010a1b7, 0x0010a1b7, 0x0010a1b7, 0x0010a1b7, + 0x0010a1b7, 0x0010a1b7, 0x0010a1b9, 0x0201f800, + 0x001005d8, 0x59325808, 0x4a025a06, 0x00000000, + 0x0201f800, 0x000202da, 0x0201f000, 0x00107911, + 0x4933c857, 0x42000000, 0x0010b873, 0x0201f800, + 0x0010aa47, 0x0201f800, 0x0010a5df, 0x497a6205, + 0x42028000, 0x0000000b, 0x0401f807, 0x4a026406, + 0x00000006, 0x4a026203, 0x00000007, 0x497a6206, + 0x1c01f000, 0x4933c857, 0x4943c857, 0x59300406, + 0x82000580, 0x00000007, 0x04020002, 0x1c01f000, + 0x0201f800, 0x00106c55, 0x4df00000, 0x0201f800, + 0x00108ce5, 0x82000c80, 0x0000000e, 0x02021800, + 0x001005d8, 0x0c01f001, 0x0010a205, 0x0010a209, + 0x0010a1f0, 0x0010a217, 0x0010a22a, 0x0010a1f0, + 0x0010a1f0, 0x0010a1f0, 0x0010a1f0, 0x0010a1f0, + 0x0010a1f0, 0x0010a1f0, 0x0010a1f0, 0x0010a1f0, + 0x4d400000, 0x5930001f, 0x80000540, 0x04000005, + 0x41400800, 0x0201f800, 0x00100d7c, 0x40068000, + 0x4d2c0000, 0x59325808, 0x0201f800, 0x00109037, + 0x040209f3, 0x4c5c0000, 0x5930b809, 0x0201f800, + 0x00107911, 0x485e6009, 0x5c00b800, 0x5c025800, + 0x5c028000, 0x5c03e000, 0x02000000, 0x00106c4b, + 0x1c01f000, 0x598c000d, 0x81300580, 0x04020004, + 0x0201f800, 0x00106e8e, 0x04020016, 0x0201f800, + 0x001068d3, 0x040007df, 0x0201f800, 0x00106b6c, + 0x04000010, 0x0201f800, 0x001005d8, 0x0201f800, + 0x00108cd6, 0x04020004, 0x0201f800, 0x00106e62, + 0x04020008, 0x0201f800, 0x001067ae, 0x040007d1, + 0x0201f800, 0x00106b6c, 0x02020800, 0x001005d8, + 0x59300203, 0x82000c80, 0x0000000e, 0x02021800, + 0x001005d8, 0x0c01f7b9, 0x0201f800, 0x00100e99, + 0x0401f7c4, 0x4933c857, 0x4d440000, 0x4d340000, + 0x59cc0007, 0x0201f800, 0x00105c9a, 0x02000800, + 0x00020245, 0x0402001a, 0x59300009, 0x4c000000, + 0x49366009, 0x42003000, 0x0000000b, 0x0201f800, + 0x0010a942, 0x42000000, 0x0010b861, 0x0201f800, + 0x0010aa47, 0x4d3c0000, 0x4d400000, 0x42028000, + 0x00000029, 0x417a7800, 0x0201f800, 0x0010203c, + 0x5c028000, 0x5c027800, 0x5c000000, 0x48026009, + 0x59cc0007, 0x48026802, 0x80000580, 0x5c026800, + 0x5c028800, 0x1c01f000, 0x4933c857, 0x4c040000, + 0x59a80016, 0x82000580, 0x00000074, 0x04020040, + 0x59cc0a08, 0x82040480, 0x00000100, 0x04001033, + 0x59cc0c08, 0x82040500, 0x00008000, 0x04000035, + 0x59a80032, 0x80000540, 0x04020009, 0x59301009, + 0x58080212, 0x82000500, 0x0000ff00, 0x04000004, + 0x82040500, 0x00000800, 0x0400002a, 0x59cc0c09, + 0x80040840, 0x04001024, 0x59a80826, 0x8c040d06, + 0x04000004, 0x59cc0c0f, 0x8c040d1e, 0x04020012, + 0x59cc0a17, 0x800409c0, 0x04020012, 0x59cc0a18, + 0x82040480, 0x00000100, 0x04001014, 0x59cc0c18, + 0x800409c0, 0x0402000e, 0x59cc0c19, 0x80040840, + 0x04001011, 0x59cc0c1a, 0x80040840, 0x04001011, + 0x0401f018, 0x4a02621a, 0x00000100, 0x0401f012, + 0x4a02621a, 0x00000300, 0x0401f00f, 0x4a02621a, + 0x00000500, 0x0401f00c, 0x4a02621a, 0x00000700, + 0x0401f009, 0x4a02621a, 0x00000900, 0x0401f006, + 0x4a02621a, 0x00000f00, 0x0401f003, 0x4a02621a, + 0x00002d00, 0x82000540, 0x00000001, 0x0401f002, + 0x80000580, 0x5c000800, 0x1c01f000, 0x59cc0407, + 0x4803c857, 0x82000580, 0x00000800, 0x04000003, + 0x4a02621a, 0x00000000, 0x1c01f000, 0x4933c857, + 0x4c040000, 0x4c080000, 0x4c0c0000, 0x4c580000, + 0x59cc000c, 0x0201f800, 0x00105c9a, 0x02000800, + 0x00020245, 0x04020012, 0x83cc1400, 0x00000008, + 0x4200b000, 0x00000002, 0x83341c00, 0x00000006, + 0x0201f800, 0x0010855a, 0x04020009, 0x83cc1400, + 0x0000000a, 0x4200b000, 0x00000002, 0x83341c00, + 0x00000008, 0x0201f800, 0x0010855a, 0x5c00b000, + 0x5c001800, 0x5c001000, 0x5c000800, 0x1c01f000, + 0x4933c857, 0x4c000000, 0x4c040000, 0x4c080000, + 0x4c0c0000, 0x4c580000, 0x59cc0001, 0x0201f800, + 0x00105c9a, 0x02000800, 0x00020245, 0x04020014, + 0x83cc1400, 0x0000000b, 0x4200b000, 0x00000002, + 0x83341c00, 0x00000006, 0x0201f800, 0x0010855a, + 0x0402000c, 0x83cc1400, 0x0000000d, 0x4200b000, + 0x00000002, 0x83341c00, 0x00000008, 0x0201f800, + 0x0010855a, 0x04000014, 0x4933c856, 0x4933c856, + 0x4933c857, 0x59340009, 0x4803c857, 0x5934000e, + 0x4803c857, 0x59340008, 0x4803c857, 0x5934000d, + 0x4803c857, 0x59340007, 0x4803c857, 0x5934000c, + 0x4803c857, 0x59340006, 0x4803c857, 0x5934000b, + 0x4803c857, 0x5c00b000, 0x5c001800, 0x5c001000, + 0x5c000800, 0x5c000000, 0x1c01f000, 0x4933c857, + 0x4947c857, 0x4943c857, 0x4c600000, 0x0201f800, + 0x00106c55, 0x4df00000, 0x4d2c0000, 0x4d300000, + 0x4d340000, 0x4130c000, 0x42026000, 0x0010d1c0, + 0x59a8000e, 0x8060c1c0, 0x04000005, 0x82601580, + 0x0010bde9, 0x04000002, 0x80000040, 0x81640480, + 0x040210be, 0x40600000, 0x81300580, 0x040000b6, + 0x0401f97a, 0x040200b4, 0x59326809, 0x59300406, + 0x82000c80, 0x00000012, 0x02021800, 0x001005d8, + 0x0c01f001, 0x0010a3cd, 0x0010a338, 0x0010a351, + 0x0010a35c, 0x0010a335, 0x0010a34c, 0x0010a387, + 0x0010a3cd, 0x0010a333, 0x0010a39a, 0x0010a3ae, + 0x0010a333, 0x0010a333, 0x0010a333, 0x0010a333, + 0x0010a3cd, 0x0010a3c4, 0x0010a3bc, 0x0201f800, + 0x001005d8, 0x59300420, 0x8c000500, 0x04020096, + 0x59300403, 0x82000580, 0x00000043, 0x04000092, + 0x0201f800, 0x00109134, 0x04000007, 0x0201f800, + 0x0010914e, 0x0402008a, 0x0201f800, 0x0010801c, + 0x0401f087, 0x0201f800, 0x00102074, 0x0201f800, + 0x0010914e, 0x02000800, 0x0010801c, 0x0401f080, + 0x8d3e7d18, 0x04000004, 0x59300420, 0x8c000500, + 0x0402007d, 0x59325808, 0x0201f800, 0x00109037, + 0x04000077, 0x49425a06, 0x497a5c09, 0x0201f800, + 0x000202da, 0x0201f800, 0x0010912a, 0x0401f070, + 0x8d3e7d00, 0x04000007, 0x59300017, 0x81480580, + 0x0402006d, 0x59300018, 0x814c0580, 0x0402006a, + 0x59300203, 0x82000580, 0x00000004, 0x02000800, + 0x00100e99, 0x59325808, 0x0201f800, 0x00109037, + 0x0400005f, 0x4a025a04, 0x00000103, 0x59300004, + 0x8400055c, 0x48026004, 0x592c0408, 0x8c000512, + 0x04000007, 0x4d2c0000, 0x592c0009, 0x40025800, + 0x0201f800, 0x001007fd, 0x5c025800, 0x49425a06, + 0x497a5c09, 0x0401fb16, 0x0201f800, 0x0010959c, + 0x0201f800, 0x001091c6, 0x0201f800, 0x000202da, + 0x0201f800, 0x0010912a, 0x0401f045, 0x8d3e7d18, + 0x04000045, 0x59300203, 0x82000580, 0x00000004, + 0x02000800, 0x00100e99, 0x59325808, 0x0201f800, + 0x00109037, 0x0400003a, 0x49425a06, 0x497a5c09, + 0x0401faff, 0x0201f800, 0x0010959c, 0x0201f800, + 0x000202da, 0x0401f032, 0x0201f800, 0x001062d5, + 0x04000031, 0x59300203, 0x82000580, 0x00000004, + 0x0400002d, 0x59300203, 0x82000580, 0x00000003, + 0x04020029, 0x0201f800, 0x00106b8a, 0x59325808, + 0x0201f800, 0x00109037, 0x04000021, 0x0201f800, + 0x000202da, 0x0401f01e, 0x59300203, 0x82000580, + 0x00000004, 0x02000800, 0x00100e99, 0x59325808, + 0x0201f800, 0x00109037, 0x04000015, 0x49425a06, + 0x497a5c09, 0x0201f800, 0x000202da, 0x0401f010, + 0x833c0500, 0x00001800, 0x0400000f, 0x8d3e7d16, + 0x0402000d, 0x59325817, 0x0201f800, 0x001007fd, + 0x59325808, 0x0201f800, 0x00109037, 0x04000004, + 0x49425a06, 0x0201f800, 0x000202da, 0x0201f800, + 0x00107911, 0x83326400, 0x00000024, 0x41580000, + 0x81300480, 0x0400173b, 0x5c026800, 0x5c026000, + 0x5c025800, 0x5c03e000, 0x02000800, 0x00106c4b, + 0x5c00c000, 0x1c01f000, 0x5c000000, 0x4c000000, + 0x4803c857, 0x4d3c0000, 0x42027800, 0x00000001, + 0x0201f800, 0x00104567, 0x5c027800, 0x4c580000, + 0x4200b000, 0x00000002, 0x83a81c00, 0x00000002, + 0x83cc1400, 0x0000000b, 0x0201f800, 0x0010855a, + 0x5c00b000, 0x80000540, 0x1c01f000, 0x492fc857, + 0x4943c857, 0x59a8000c, 0x812c0480, 0x04001011, + 0x59a8000d, 0x812c0480, 0x0402100e, 0x592c0000, + 0x80005d40, 0x04000008, 0x497a5800, 0x49425a06, + 0x4c2c0000, 0x0201f800, 0x000202da, 0x5c025800, + 0x0401f7f7, 0x49425a06, 0x0201f000, 0x000202da, + 0x1c01f000, 0x493fc857, 0x4933c857, 0x480bc857, + 0x0201f800, 0x00103b25, 0x0400002e, 0x41502800, + 0x813e79c0, 0x04020006, 0x59a80066, 0x80000000, + 0x59a8086a, 0x80040580, 0x04000026, 0x41300000, + 0x80140580, 0x0400001a, 0x58140203, 0x82000580, + 0x00000000, 0x04000016, 0x58140202, 0x80080580, + 0x04020013, 0x58141c06, 0x820c0580, 0x00000005, + 0x0400000f, 0x820c0580, 0x00000009, 0x04000017, + 0x59300009, 0x58142009, 0x801021c0, 0x04020006, + 0x5814201e, 0x59301809, 0x580c0002, 0x82000500, + 0x00ffffff, 0x80100580, 0x04000007, 0x82142c00, + 0x00000024, 0x41540000, 0x80140480, 0x04021005, + 0x0401f7df, 0x40163800, 0x81300540, 0x0401f002, + 0x80000580, 0x1c01f000, 0x58141807, 0x8c0c1d10, + 0x040207f3, 0x0401f7e7, 0x42002000, 0x0000ffff, + 0x59301009, 0x800811c0, 0x04000002, 0x58082403, + 0x41301000, 0x0401f007, 0x41781000, 0x41442000, + 0x0401f004, 0x41781000, 0x42002000, 0x0000ffff, + 0x5c000000, 0x4c000000, 0x4803c857, 0x480bc857, + 0x4813c857, 0x492fc857, 0x4943c857, 0x4d2c0000, + 0x0201f800, 0x001007e4, 0x02000800, 0x001005d8, + 0x4a025a04, 0x0000010d, 0x800811c0, 0x04000017, + 0x83400580, 0x00000029, 0x04020010, 0x82180580, + 0x00000002, 0x0400000a, 0x82180580, 0x00000003, + 0x04000007, 0x82180580, 0x00000008, 0x04000004, + 0x82180580, 0x00000009, 0x04020004, 0x4a025809, + 0xffffffff, 0x0401f002, 0x480a5809, 0x58080202, + 0x48025c13, 0x0401f005, 0x4a025809, 0xffffffff, + 0x4a025c13, 0x0000ffff, 0x49425a08, 0x48125a06, + 0x82100580, 0x0000ffff, 0x0400000e, 0x4d440000, + 0x4d340000, 0x40128800, 0x0201f800, 0x00020245, + 0x02020800, 0x001005d8, 0x59340002, 0x82000500, + 0x00ffffff, 0x48025812, 0x5c026800, 0x5c028800, + 0x497a5800, 0x497a5c04, 0x83400580, 0x00000046, + 0x04020002, 0x48165a07, 0x481a5c08, 0x0401fbed, + 0x5c025800, 0x1c01f000, 0x59300809, 0x800409c0, + 0x04000004, 0x58040403, 0x81440580, 0x1c01f000, + 0x82000540, 0x00000001, 0x0401f7fd, 0x4933c857, + 0x4c040000, 0x59300403, 0x82000d80, 0x0000001e, + 0x04020016, 0x800000d0, 0x59300a16, 0x82040d00, + 0x000000ff, 0x80040540, 0x4803c857, 0x48026416, + 0x4a026403, 0x00000085, 0x4a026203, 0x00000009, + 0x4a026406, 0x00000005, 0x4a02621d, 0x00000004, + 0x59a80038, 0x48026206, 0x42000800, 0x8000004b, + 0x0201f800, 0x00020721, 0x5c000800, 0x1c01f000, + 0x4933c857, 0x40000000, 0x40000000, 0x1c01f000, + 0x59300414, 0x4933c857, 0x4803c857, 0x8c000518, + 0x04000009, 0x8c000512, 0x02020000, 0x0010921e, + 0x0401f91b, 0x0201f800, 0x000206fd, 0x0201f800, + 0x0002077d, 0x1c01f000, 0x591c0406, 0x4803c857, + 0x82000c80, 0x00000009, 0x0402100b, 0x0c01f001, + 0x0010a4d9, 0x0010a4d9, 0x0010a4d9, 0x0010a4db, + 0x0010a4d9, 0x0010a4db, 0x0010a4db, 0x0010a4d9, + 0x0010a4db, 0x80000580, 0x1c01f000, 0x82000540, + 0x00000001, 0x1c01f000, 0x591c0406, 0x82000500, + 0x0000001f, 0x82000580, 0x00000006, 0x0400000e, + 0x4803c857, 0x4a026403, 0x0000003b, 0x4a02641a, + 0x00000009, 0x4a02621a, 0x00002a00, 0x4a026203, + 0x00000001, 0x42000800, 0x80000040, 0x0201f000, + 0x00020721, 0x4803c856, 0x4c040000, 0x4c140000, + 0x4d300000, 0x411e6000, 0x0401f8e9, 0x497a6205, + 0x59300414, 0x4803c857, 0x82000500, 0xffffadff, + 0x48026414, 0x497a6405, 0x5c026000, 0x0201f800, + 0x001007e4, 0x02000800, 0x001005d8, 0x5c002800, + 0x5c000800, 0x4a025a04, 0x0000010d, 0x497a5800, + 0x497a5c04, 0x4a025a08, 0x00000045, 0x491e5809, + 0x59300402, 0x48025c07, 0x59300419, 0x48025c0b, + 0x591c0414, 0x84000556, 0x48023c14, 0x591c1809, + 0x580c0403, 0x48025a06, 0x4816580a, 0x48065a0b, + 0x0401f99d, 0x4d400000, 0x42028000, 0x00000045, + 0x591c0202, 0x4c000000, 0x4d300000, 0x411e6000, + 0x0401fcb1, 0x5c026000, 0x5c000000, 0x48023a02, + 0x5c028000, 0x4a023c06, 0x00000006, 0x4a023a03, + 0x00000007, 0x497a3a06, 0x497a3a05, 0x1c01f000, + 0x4933c857, 0x83380580, 0x00000013, 0x0402000b, + 0x59300403, 0x4803c857, 0x82000d80, 0x00000085, + 0x0400002b, 0x82000d80, 0x0000008b, 0x04000028, + 0x0201f800, 0x001005d8, 0x83380580, 0x00000027, + 0x0402000c, 0x0201f800, 0x00106bbf, 0x4d2c0000, + 0x4d400000, 0x59325808, 0x42028000, 0x00000004, + 0x0401feab, 0x5c028000, 0x5c025800, 0x1c01f000, + 0x83380580, 0x00000014, 0x040007f3, 0x83380580, + 0x00000089, 0x04000005, 0x83380580, 0x0000008a, + 0x02020000, 0x00107974, 0x0201f800, 0x00106f60, + 0x02020000, 0x00107974, 0x59300a03, 0x82040580, + 0x0000000a, 0x04000009, 0x82040580, 0x0000000c, + 0x04000006, 0x0201f800, 0x001005d8, 0x4a026203, + 0x0000000a, 0x1c01f000, 0x83380480, 0x00000093, + 0x0402100c, 0x83380480, 0x00000085, 0x04001009, + 0x83380580, 0x00000089, 0x0400000a, 0x83380580, + 0x0000008a, 0x04000022, 0x0201f800, 0x001005d8, + 0x493bc857, 0x4933c857, 0x0201f000, 0x00107974, + 0x4933c857, 0x4c340000, 0x41306800, 0x0201f800, + 0x0002075a, 0x04000011, 0x4a026203, 0x00000001, + 0x4a026403, 0x0000001e, 0x59cc0c07, 0x48066419, + 0x59cc0a07, 0x48066219, 0x58340809, 0x48066009, + 0x4a026406, 0x00000004, 0x42000800, 0x80000040, + 0x0201f800, 0x00020721, 0x40366000, 0x0201f800, + 0x0002077d, 0x5c006800, 0x1c01f000, 0x4933c857, + 0x0201f000, 0x0002077d, 0x4933c857, 0x59300809, + 0x58040200, 0x8c00051a, 0x1c01f000, 0x0201f800, + 0x001048df, 0x0400001e, 0x4a026203, 0x00000002, + 0x59300414, 0x84000558, 0x48026414, 0x8c000512, + 0x04000004, 0x59a80039, 0x48026205, 0x0401f007, + 0x59a80839, 0x59a80037, 0x80040400, 0x82000400, + 0x0000000a, 0x48026205, 0x59300009, 0x82000c00, + 0x00000011, 0x50040000, 0x80000540, 0x04000004, + 0x82000c00, 0x00000000, 0x0401f7fb, 0x45300800, + 0x497a6000, 0x82000540, 0x00000001, 0x1c01f000, + 0x82100500, 0xfffffeef, 0x04020020, 0x4d2c0000, + 0x4937c857, 0x59340811, 0x83341400, 0x00000011, + 0x800409c0, 0x0400000e, 0x40040000, 0x81300580, + 0x04000005, 0x58040800, 0x82041400, 0x00000000, + 0x0401f7f8, 0x59300800, 0x497a6000, 0x44041000, + 0x0201f800, 0x000206fd, 0x0401f002, 0x4933c857, + 0x592c0000, 0x80000540, 0x02020800, 0x001005d8, + 0x5c025800, 0x492e6008, 0x0201f800, 0x000206fd, + 0x0201f000, 0x0002077d, 0x492fc857, 0x4a025a06, + 0x00000006, 0x0201f000, 0x000202da, 0x4c340000, + 0x59300009, 0x800001c0, 0x04000010, 0x82006c00, + 0x00000011, 0x50340000, 0x80000540, 0x04000009, + 0x81300580, 0x04000005, 0x50340000, 0x82006c00, + 0x00000000, 0x0401f7f8, 0x59300000, 0x44006800, + 0x5c006800, 0x1c01f000, 0x59300c06, 0x82040580, + 0x00000005, 0x040007fb, 0x82040580, 0x00000011, + 0x040007f8, 0x82040580, 0x00000006, 0x040007f5, + 0x82040580, 0x00000001, 0x040007f2, 0x0201f800, + 0x001005d8, 0x4933c857, 0x4c080000, 0x4c0c0000, + 0x4c580000, 0x59a8101d, 0x59cc1807, 0x820c1d00, + 0x00ffffff, 0x800c0110, 0x80083580, 0x04020014, + 0x83cc1400, 0x00000008, 0x4200b000, 0x00000002, + 0x59300009, 0x82001c00, 0x00000006, 0x0201f800, + 0x0010855a, 0x0402000a, 0x83cc1400, 0x0000000a, + 0x4200b000, 0x00000002, 0x59300009, 0x82001c00, + 0x00000008, 0x0201f800, 0x0010855a, 0x5c00b000, + 0x5c001800, 0x5c001000, 0x1c01f000, 0x4933c856, + 0x0201f800, 0x0010421b, 0x0201f000, 0x00101e45, + 0x493bc857, 0x4d2c0000, 0x0201f800, 0x001007e4, + 0x02000800, 0x001005d8, 0x832cac00, 0x00000005, + 0x4c580000, 0x4c540000, 0x4200b000, 0x00000006, + 0x4578a800, 0x8054a800, 0x8058b040, 0x040207fd, + 0x83380580, 0x00000046, 0x04020004, 0x4a025a04, + 0x00000144, 0x0401f008, 0x4a025a04, 0x00000146, + 0x83380580, 0x00000041, 0x04000003, 0x4a025a06, + 0x00000001, 0x59cc0007, 0x82000500, 0xff000000, + 0x80000110, 0x59cc1008, 0x82081500, 0xff000000, + 0x80081540, 0x480a580a, 0x83380580, 0x00000046, + 0x04020006, 0x59cc0007, 0x82000500, 0x00ffffff, + 0x4802580b, 0x0401f005, 0x59cc0008, 0x82000500, + 0x00ffffff, 0x4802580b, 0x83380580, 0x00000046, + 0x04020004, 0x83cc1400, 0x00000009, 0x0401f003, + 0x83cc1400, 0x0000000d, 0x50080000, 0x9c0001c0, + 0x4802580c, 0x80081000, 0x50080000, 0x9c0001c0, + 0x4802580d, 0x83380580, 0x00000046, 0x04020008, + 0x59cc000b, 0x9c0001c0, 0x4802580e, 0x59cc000c, + 0x9c0001c0, 0x4802580f, 0x0401f007, 0x59cc000f, + 0x9c0001c0, 0x4802580e, 0x59cc0010, 0x9c0001c0, + 0x4802580f, 0x83380580, 0x00000046, 0x04020004, + 0x83cc1400, 0x00000011, 0x0401f003, 0x83cc1400, + 0x00000015, 0x412c3000, 0x82183400, 0x00000010, + 0x4200b000, 0x00000004, 0x50080000, 0x9c0001c0, + 0x44003000, 0x80081000, 0x80183000, 0x8058b040, + 0x040207fa, 0x5c00a800, 0x5c00b000, 0x0201f800, + 0x000202da, 0x5c025800, 0x1c01f000, 0x4933c857, + 0x492fc857, 0x59300809, 0x58040200, 0x8c00051e, + 0x04000004, 0x592c0208, 0x84000558, 0x48025a08, + 0x1c01f000, 0x59e0180f, 0x599c0413, 0x800c1000, + 0x80080580, 0x04020002, 0x41781000, 0x59e00010, + 0x59e00810, 0x80040d80, 0x040207fd, 0x80080580, + 0x0400000b, 0x4c080000, 0x599c0814, 0x599c1015, + 0x800c00cc, 0x80040c00, 0x82081440, 0x00000000, + 0x5c001800, 0x82000540, 0x00000001, 0x4803c857, + 0x1c01f000, 0x492fc857, 0x42007000, 0x0010b7f8, + 0x58380807, 0x800409c0, 0x04020005, 0x492c7008, + 0x492c7007, 0x0201f000, 0x00100875, 0x492c0800, + 0x492c7007, 0x1c01f000, 0x59300203, 0x4933c857, + 0x4937c857, 0x493bc857, 0x4803c857, 0x82003480, + 0x0000000e, 0x02021800, 0x001005d8, 0x0c01f001, + 0x0010a6da, 0x0010a82c, 0x0010a6da, 0x0010a6da, + 0x0010a6da, 0x0010a6da, 0x0010a6da, 0x0010a791, + 0x0010a6dc, 0x0010a6da, 0x0010a6da, 0x0010a6da, + 0x0010a6da, 0x0010a6da, 0x0201f800, 0x001005d8, + 0x83380580, 0x0000004c, 0x02020800, 0x001005d8, + 0x0201f800, 0x001048ec, 0x04020020, 0x59a80826, + 0x82040500, 0x00000009, 0x82000580, 0x00000008, + 0x0400001a, 0x8c040d12, 0x0400003d, 0x59cc0806, + 0x82040d00, 0xff000000, 0x82040580, 0x03000000, + 0x0400001f, 0x82040580, 0x50000000, 0x04000005, + 0x82040580, 0x52000000, 0x02020000, 0x0002077d, + 0x813669c0, 0x04000006, 0x4d3c0000, 0x417a7800, + 0x0201f800, 0x0010203c, 0x5c027800, 0x4a026403, + 0x00000001, 0x0401f014, 0x59cc0806, 0x82040d00, + 0xff000000, 0x82040580, 0x03000000, 0x04000008, + 0x82040580, 0x50000000, 0x04000005, 0x82040580, + 0x52000000, 0x02020000, 0x0002077d, 0x4a026403, + 0x00000009, 0x4a02641a, 0x00000009, 0x4a02621a, + 0x00000000, 0x813669c0, 0x0402000b, 0x59cc0001, + 0x0201f800, 0x00105c9a, 0x02020000, 0x0002077d, + 0x0201f800, 0x001045a6, 0x02020000, 0x0002077d, + 0x49366009, 0x4a026406, 0x00000004, 0x4a026203, + 0x00000001, 0x0201f000, 0x0010672b, 0x0201f800, + 0x00103b25, 0x04000023, 0x59cc0806, 0x4807c857, + 0x82040d00, 0xff000000, 0x82040580, 0x03000000, + 0x04000033, 0x82040580, 0x20000000, 0x04000041, + 0x82040580, 0x21000000, 0x04000052, 0x82040580, + 0x24000000, 0x0400004f, 0x82040580, 0x50000000, + 0x0400004c, 0x82040580, 0x52000000, 0x04000049, + 0x82040580, 0x05000000, 0x0402000d, 0x59cc0806, + 0x82040d00, 0xff000000, 0x9c0431c0, 0x42028000, + 0x00000046, 0x42002800, 0x00000001, 0x0401fcf3, + 0x0401f93c, 0x02000800, 0x001005d8, 0x42002000, + 0x00000051, 0x0201f800, 0x00107a4a, 0x59cc0000, + 0x82000500, 0x00ffffff, 0x82000580, 0x00ffffff, + 0x04000005, 0x4a026203, 0x00000007, 0x493a6403, + 0x1c01f000, 0x59325817, 0x812e59c0, 0x02020800, + 0x001007fd, 0x0201f000, 0x0002077d, 0x813669c0, + 0x040007df, 0x59340400, 0x82000500, 0x000000ff, + 0x82000580, 0x00000003, 0x040207d9, 0x0401fc6f, + 0x040207d7, 0x4a026403, 0x00000009, 0x4a02641a, + 0x0000000e, 0x4a02621a, 0x00001900, 0x0401f7a2, + 0x813669c0, 0x0400000c, 0x59340c00, 0x82040500, + 0x000000ff, 0x82000580, 0x00000009, 0x04000794, + 0x82040500, 0x0000ff00, 0x82000580, 0x00000700, + 0x040207c3, 0x4a026403, 0x00000009, 0x4a02641a, + 0x00000009, 0x4a02621a, 0x00001e00, 0x0401f78e, + 0x813669c0, 0x040007f8, 0x59340c00, 0x82040500, + 0x0000ff00, 0x82000580, 0x00000700, 0x040007f2, + 0x0401f7b3, 0x4d2c0000, 0x4c580000, 0x4c500000, + 0x4c540000, 0x41385000, 0x83380580, 0x00000054, + 0x02020800, 0x001005d8, 0x59325808, 0x592c0c0b, + 0x82040d00, 0x0000e000, 0x82040580, 0x00002000, + 0x04020076, 0x59300817, 0x800409c0, 0x04000014, + 0x58041404, 0x41cca800, 0x8204a400, 0x00000005, + 0x82080480, 0x00000010, 0x04021004, 0x4008b000, + 0x0401fb6b, 0x0401f00a, 0x40001000, 0x4200b000, + 0x0000000f, 0x0401fb66, 0x58040801, 0x800409c0, + 0x040207f2, 0x0201f800, 0x001005d8, 0x813669c0, + 0x0400005e, 0x59344c00, 0x592c0c09, 0x4807c857, + 0x4827c857, 0x82040d00, 0x000000ff, 0x82040580, + 0x00000003, 0x0400002a, 0x82040580, 0x00000005, + 0x04000032, 0x82040580, 0x00000020, 0x04000036, + 0x82040580, 0x00000052, 0x04000042, 0x82040580, + 0x00000050, 0x04000042, 0x82040580, 0x00000021, + 0x04000004, 0x82040580, 0x00000024, 0x04020043, + 0x82240500, 0x0000ff00, 0x82000580, 0x00000007, + 0x04000008, 0x42000800, 0x00000009, 0x0201f800, + 0x00104571, 0x42005000, 0x0000000c, 0x0401f037, + 0x4a025a06, 0x00000031, 0x4a02580d, 0x00000009, + 0x59340400, 0x4802580e, 0x0201f800, 0x000202da, + 0x0201f800, 0x00107911, 0x0401f03d, 0x0201f800, + 0x001042b4, 0x0201f800, 0x0010462a, 0x42000800, + 0x00000003, 0x0201f800, 0x00104571, 0x42005000, + 0x00000008, 0x0401f021, 0x59cc0007, 0x0201f800, + 0x00105eec, 0x0402001d, 0x0201f800, 0x001042b4, + 0x0401f01a, 0x82240500, 0x0000ff00, 0x82000580, + 0x00000007, 0x040007df, 0x82240500, 0x000000ff, + 0x82000580, 0x00000009, 0x040007da, 0x0201f800, + 0x0010468d, 0x42005000, 0x0000000a, 0x0401f00b, + 0x42005000, 0x0000000e, 0x0401f003, 0x42005000, + 0x00000010, 0x82240500, 0x0000ff00, 0x82000580, + 0x00000007, 0x040007cb, 0x482a6403, 0x4a026203, + 0x00000001, 0x592c000d, 0x48026011, 0x497a6013, + 0x59a80038, 0x48026206, 0x417a7800, 0x0201f800, + 0x0010672b, 0x59325817, 0x812e59c0, 0x04000004, + 0x0201f800, 0x001007fd, 0x497a6017, 0x5c00a800, + 0x5c00a000, 0x5c00b000, 0x5c025800, 0x1c01f000, + 0x4d2c0000, 0x59325808, 0x83380580, 0x00000013, + 0x04020029, 0x59300c03, 0x82040580, 0x00000054, + 0x0400001e, 0x82040580, 0x00000010, 0x04000018, + 0x82040580, 0x0000000e, 0x04000015, 0x82040580, + 0x00000008, 0x0400000d, 0x82040580, 0x0000000c, + 0x0400000a, 0x82040580, 0x0000000a, 0x02020800, + 0x001005d8, 0x42000800, 0x00000006, 0x0201f800, + 0x00104571, 0x0401f009, 0x42000800, 0x00000004, + 0x0201f800, 0x00104571, 0x0401f004, 0x59340200, + 0x8400051a, 0x48026a00, 0x4a025a06, 0x00000000, + 0x0201f800, 0x000202da, 0x0201f800, 0x0002077d, + 0x0401f022, 0x83380580, 0x00000027, 0x0400000e, + 0x83380580, 0x00000014, 0x02020800, 0x001005d8, + 0x0201f800, 0x00106bbf, 0x42028000, 0x00000031, + 0x42000800, 0x00000004, 0x42001000, 0x000000ff, + 0x0401f009, 0x0201f800, 0x00106bbf, 0x42028000, + 0x00000031, 0x42000800, 0x00000004, 0x42001000, + 0x00000010, 0x49425a06, 0x4806580d, 0x480a580e, + 0x0201f800, 0x000202da, 0x0201f800, 0x00104c19, + 0x0201f800, 0x00107911, 0x5c025800, 0x1c01f000, + 0x42007000, 0x0010b7f8, 0x58380807, 0x800409c0, + 0x04020005, 0x492c7008, 0x492c7007, 0x0201f000, + 0x00100875, 0x492c0800, 0x492c7007, 0x1c01f000, + 0x4d2c0000, 0x4c580000, 0x4c500000, 0x4c540000, + 0x4933c857, 0x4937c857, 0x59cc0806, 0x4807c857, + 0x82040d00, 0xff000000, 0x82040580, 0x03000000, + 0x0400000d, 0x82040580, 0x05000000, 0x0400000a, + 0x82040580, 0x21000000, 0x04000030, 0x82040580, + 0x24000000, 0x0400002d, 0x82040580, 0x20000000, + 0x0402002f, 0x0201f800, 0x001007e4, 0x0400002c, + 0x492fc857, 0x492e6017, 0x59a8b016, 0x8258b400, + 0x0000001b, 0x8258b500, 0xfffffffc, 0x8058b104, + 0x485a5c04, 0x412c7800, 0x41cca000, 0x82580480, + 0x00000010, 0x04021005, 0x832cac00, 0x00000005, + 0x0401fa63, 0x0401f015, 0x40580800, 0x4200b000, + 0x0000000f, 0x832cac00, 0x00000005, 0x0401fa5c, + 0x8204b480, 0x0000000f, 0x0201f800, 0x001007e4, + 0x04000004, 0x492c7801, 0x412c7800, 0x0401f7ec, + 0x59325817, 0x0201f800, 0x001007fd, 0x497a6017, + 0x80000580, 0x0401f006, 0x59340200, 0x84000554, + 0x48026a00, 0x82000540, 0x00000001, 0x5c00a800, + 0x5c00a000, 0x5c00b000, 0x5c025800, 0x1c01f000, + 0x4933c857, 0x492fc857, 0x4d2c0000, 0x59300a03, + 0x82040580, 0x00000007, 0x04000036, 0x82040580, + 0x00000001, 0x02020800, 0x001005d8, 0x0201f800, + 0x00106c55, 0x4df00000, 0x598c000d, 0x81300580, + 0x04020016, 0x59300004, 0x8c000520, 0x04000004, + 0x84000520, 0x48026004, 0x0401f016, 0x42001000, + 0x0010b7f6, 0x50081000, 0x58080002, 0x82000580, + 0x00000100, 0x04000006, 0x5808000c, 0x81300580, + 0x02020800, 0x001005d8, 0x0401f00a, 0x0201f800, + 0x00106e8e, 0x04020020, 0x59300004, 0x8c000520, + 0x04000004, 0x84000520, 0x48026004, 0x0401f003, + 0x0201f800, 0x001068d3, 0x5c03e000, 0x02000800, + 0x00106c4b, 0x0201f800, 0x00109037, 0x02000800, + 0x001005d8, 0x59325808, 0x4a025a06, 0x00000005, + 0x0201f800, 0x000202da, 0x0201f800, 0x00104c19, + 0x59325817, 0x812e59c0, 0x02020800, 0x001007fd, + 0x0201f800, 0x00107911, 0x80000580, 0x5c025800, + 0x1c01f000, 0x5c03e000, 0x02000800, 0x00106c4b, + 0x59300406, 0x82000580, 0x00000011, 0x040007b8, + 0x0401f7f7, 0x4c040000, 0x59340200, 0x4803c857, + 0x8c00051c, 0x04000009, 0x59cc0805, 0x591c0019, + 0x4803c857, 0x80040580, 0x04000004, 0x80000580, + 0x4803c856, 0x0401f003, 0x82000540, 0x00000001, + 0x5c000800, 0x1c01f000, 0x4c000000, 0x4c0c0000, + 0x4c100000, 0x42001800, 0x0000ffff, 0x42002000, + 0x00000004, 0x0401f010, 0x4c000000, 0x4c0c0000, + 0x4c100000, 0x59302009, 0x58101c03, 0x42002000, + 0x00000004, 0x0401f008, 0x4c000000, 0x4c0c0000, + 0x4c100000, 0x59302009, 0x58101c03, 0x42002000, + 0x00000007, 0x480fc857, 0x4813c857, 0x481bc857, + 0x0201f800, 0x00103aae, 0x5c002000, 0x5c001800, + 0x5c000000, 0x1c01f000, 0x83380580, 0x00000092, + 0x02020800, 0x001005d8, 0x42000800, 0x80000040, + 0x4a026203, 0x00000001, 0x493a6403, 0x0201f000, + 0x00020721, 0x4d400000, 0x0201f800, 0x00103b25, + 0x04000008, 0x59a80005, 0x84000544, 0x48035005, + 0x42028000, 0x0000002a, 0x0201f800, 0x0010a449, + 0x5c028000, 0x1c01f000, 0x59a80026, 0x8c000508, + 0x04000005, 0x599c0017, 0x8c00050a, 0x04020002, + 0x1c01f000, 0x82000540, 0x00000001, 0x1c01f000, + 0x59300420, 0x84000540, 0x48026420, 0x1c01f000, + 0x4817c857, 0x4c000000, 0x4c040000, 0x8c142d2a, + 0x04000004, 0x598800b8, 0x80000000, 0x480310b8, + 0x8c142d2e, 0x04000004, 0x598800b9, 0x80000000, + 0x480310b9, 0x8c142d2c, 0x04000013, 0x40140000, + 0x82000500, 0x00070000, 0x82000d80, 0x00030000, + 0x0400000d, 0x82000d80, 0x00040000, 0x0400000a, + 0x82000d80, 0x00050000, 0x04000007, 0x59880005, + 0x80000000, 0x48031005, 0x598800ba, 0x80000000, + 0x480310ba, 0x5c000800, 0x5c000000, 0x1c01f000, + 0x4817c857, 0x4c000000, 0x4c040000, 0x8c142d2a, + 0x04000004, 0x598800bb, 0x80000000, 0x480310bb, + 0x8c142d2e, 0x04000004, 0x598800bc, 0x80000000, + 0x480310bc, 0x8c142d2c, 0x04000013, 0x40140000, + 0x82000500, 0x00070000, 0x82000d80, 0x00030000, + 0x0400000d, 0x82000d80, 0x00040000, 0x0400000a, + 0x82000d80, 0x00050000, 0x04000007, 0x59880005, + 0x80000000, 0x48031005, 0x598800bd, 0x80000000, + 0x480310bd, 0x5c000800, 0x5c000000, 0x1c01f000, + 0x4c000000, 0x59880001, 0x80000000, 0x4803c857, + 0x48031001, 0x5c000000, 0x1c01f000, 0x4c000000, + 0x59880000, 0x80000000, 0x4803c857, 0x48031000, + 0x5c000000, 0x1c01f000, 0x4c000000, 0x59880002, + 0x80000000, 0x4803c857, 0x48031002, 0x5c000000, + 0x1c01f000, 0x4807c857, 0x4c000000, 0x8c040d2c, + 0x04000004, 0x598800a6, 0x80000000, 0x480310a6, + 0x8c040d2a, 0x04000004, 0x598800a7, 0x80000000, + 0x480310a7, 0x8c040d28, 0x04000004, 0x598800a8, + 0x80000000, 0x480310a8, 0x8c040d26, 0x04000004, + 0x598800a9, 0x80000000, 0x480310a9, 0x8c040d24, + 0x04000004, 0x598800aa, 0x80000000, 0x480310aa, + 0x8c040d22, 0x04000004, 0x598800ab, 0x80000000, + 0x480310ab, 0x8c040d20, 0x04000004, 0x598800ac, + 0x80000000, 0x480310ac, 0x5c000000, 0x1c01f000, + 0x4807c857, 0x4c000000, 0x598800ad, 0x80000000, + 0x480310ad, 0x5c000000, 0x1c01f000, 0x4807c857, + 0x4c000000, 0x8c040d1c, 0x04000004, 0x598800ae, + 0x80000000, 0x480310ae, 0x8c040d1a, 0x04000004, + 0x598800af, 0x80000000, 0x480310af, 0x5c000000, + 0x1c01f000, 0x4807c857, 0x4c000000, 0x8c040d18, + 0x04000004, 0x598800b0, 0x80000000, 0x480310b0, + 0x8c040d16, 0x04000004, 0x598800b1, 0x80000000, + 0x480310b1, 0x8c040d14, 0x04000004, 0x598800b2, + 0x80000000, 0x480310b2, 0x5c000000, 0x1c01f000, + 0x4807c857, 0x4c000000, 0x8c040d10, 0x04000004, + 0x598800b3, 0x80000000, 0x480310b3, 0x8c040d0c, + 0x04000004, 0x598800b4, 0x80000000, 0x480310b4, + 0x5c000000, 0x1c01f000, 0x4807c857, 0x4c000000, + 0x8c040d08, 0x04000004, 0x598800b5, 0x80000000, + 0x480310b5, 0x8c040d04, 0x04000004, 0x598800b6, + 0x80000000, 0x480310b6, 0x5c000000, 0x1c01f000, + 0x4807c856, 0x4c000000, 0x5988007f, 0x80000000, + 0x4803107f, 0x5c000000, 0x1c01f000, 0x4803c857, + 0x4c040000, 0x50000800, 0x80040800, 0x4807c857, + 0x44040000, 0x5c000800, 0x1c01f000, 0x480fc857, + 0x4c000000, 0x820c0580, 0x00000000, 0x04020004, + 0x42000000, 0x0010b819, 0x0401f014, 0x820c0580, + 0x00001001, 0x04020004, 0x42000000, 0x0010b81a, + 0x0401f00e, 0x820c0580, 0x00001002, 0x04020004, + 0x42000000, 0x0010b81b, 0x0401f008, 0x820c0c80, + 0x0000201c, 0x02021800, 0x001005d8, 0x820c0500, + 0x0000001f, 0x0c01f804, 0x0401ffdd, 0x5c000000, + 0x1c01f000, 0x0010aa89, 0x0010aa8c, 0x0010aa8f, + 0x0010aa92, 0x0010aa95, 0x0010aa98, 0x0010aa9b, + 0x0010aa9e, 0x0010aaa1, 0x0010aaa4, 0x0010aaa7, + 0x0010aaaa, 0x0010aaad, 0x0010aab0, 0x0010aab3, + 0x0010aab6, 0x0010aab9, 0x0010aabc, 0x0010aabf, + 0x0010aac2, 0x0010aac5, 0x0010aac8, 0x0010aacb, + 0x0010aace, 0x0010aad1, 0x0010aad4, 0x0010aad7, + 0x0010aada, 0x42000000, 0x0010b81c, 0x1c01f000, + 0x42000000, 0x0010b81d, 0x1c01f000, 0x42000000, + 0x0010b81e, 0x1c01f000, 0x42000000, 0x0010b81f, + 0x1c01f000, 0x42000000, 0x0010b820, 0x1c01f000, + 0x42000000, 0x0010b821, 0x1c01f000, 0x42000000, + 0x0010b822, 0x1c01f000, 0x42000000, 0x0010b823, + 0x1c01f000, 0x42000000, 0x0010b824, 0x1c01f000, + 0x42000000, 0x0010b825, 0x1c01f000, 0x42000000, + 0x0010b826, 0x1c01f000, 0x42000000, 0x0010b827, + 0x1c01f000, 0x42000000, 0x0010b828, 0x1c01f000, + 0x42000000, 0x0010b829, 0x1c01f000, 0x42000000, + 0x0010b82a, 0x1c01f000, 0x42000000, 0x0010b82b, + 0x1c01f000, 0x42000000, 0x0010b82c, 0x1c01f000, + 0x42000000, 0x0010b82d, 0x1c01f000, 0x42000000, + 0x0010b82e, 0x1c01f000, 0x42000000, 0x0010b82f, + 0x1c01f000, 0x42000000, 0x0010b830, 0x1c01f000, + 0x42000000, 0x0010b831, 0x1c01f000, 0x42000000, + 0x0010b832, 0x1c01f000, 0x42000000, 0x0010b833, + 0x1c01f000, 0x42000000, 0x0010b834, 0x1c01f000, + 0x42000000, 0x0010b835, 0x1c01f000, 0x42000000, + 0x0010b836, 0x1c01f000, 0x42000000, 0x0010b837, + 0x1c01f000, 0x480fc857, 0x4c000000, 0x820c0580, + 0x00000001, 0x04020004, 0x42000000, 0x0010b80e, + 0x0401f012, 0x820c0580, 0x00000002, 0x04020004, + 0x42000000, 0x0010b80f, 0x0401f00c, 0x820c0580, + 0x00000003, 0x04020004, 0x42000000, 0x0010b810, + 0x0401f006, 0x820c0580, 0x00000004, 0x04020004, + 0x42000000, 0x0010b811, 0x0401ff51, 0x5c000000, + 0x1c01f000, 0x4c000000, 0x59a80026, 0x4803c857, + 0x8c000502, 0x04000010, 0x8c000506, 0x04000004, + 0x42000000, 0x0010b841, 0x0401f012, 0x8c00050a, + 0x04000004, 0x42000000, 0x0010b840, 0x0401f00d, + 0x8c000508, 0x04000004, 0x42000000, 0x0010b843, + 0x0401f008, 0x0201f800, 0x0010513b, 0x04000006, + 0x8c000506, 0x04020004, 0x42000000, 0x0010b842, + 0x0401ff33, 0x5c000000, 0x1c01f000, 0x8058b1c0, + 0x02000800, 0x001005d8, 0x5450a800, 0x8050a000, + 0x8054a800, 0x8058b040, 0x040207fc, 0x1c01f000, + 0x8058b1c0, 0x02000800, 0x001005d8, 0x4450a800, + 0x8054a800, 0x8058b040, 0x040207fd, 0x1c01f000, + 0x8058b1c0, 0x02000800, 0x001005d8, 0x50500000, + 0x9c0001c0, 0x4400a800, 0x8050a000, 0x8054a800, + 0x8058b040, 0x040207fa, 0x1c01f000, 0x4c000000, + 0x59a80008, 0x8c00051c, 0x5c000000, 0x1c01f000, + 0x00000001, 0x00000002, 0x00000004, 0x00000008, + 0x00000010, 0x00000020, 0x00000040, 0x00000080, + 0x00000100, 0x00000200, 0x00000400, 0x00000800, + 0x00001000, 0x00002000, 0x00004000, 0x00008000, + 0x00010000, 0xa5f2b3ac }; -struct firmware ql2400_fw = { - .size = sizeof(ql2400_fw_bin), - .data = ql2400_fw_bin +#ifdef UNIQUE_FW_NAME +uint32_t fw2400_length01 = 0x0000ab4a ; +#else +uint32_t risc_code_length01 = 0x0000ab4a ; +#endif + + +#ifdef UNIQUE_FW_NAME +uint32_t fw2400_addr02 = 0x0010e000 ; +#else +uint32_t risc_code_addr02 = 0x0010e000 ; +#endif + +#ifdef UNIQUE_FW_NAME +uint32_t fw2400_code02[] = { +#else +uint32_t risc_code02[] = { +#endif + 0x00000000, 0x00000000, 0x0010e000, 0x000014ff, + 0x00000000, 0x00000000, 0x00020000, 0x000008c0, + 0x836c0580, 0x00000003, 0x02020000, 0x001002e3, + 0x42000000, 0x0010b4bb, 0x50000000, 0x800001c0, + 0x04020956, 0x0401f923, 0x0401fbe3, 0x0401fb5c, + 0x0201f800, 0x00020718, 0x0201f800, 0x0002057b, + 0x0401f7f0, 0x59b800ea, 0x82000d00, 0xf0000038, + 0x02020000, 0x00100a7a, 0x8c000510, 0x02000000, + 0x00100a79, 0x59ba60e0, 0x81300182, 0x0402104e, + 0x04002030, 0x8532653e, 0x59300406, 0x82000580, + 0x00000003, 0x04020028, 0x59300203, 0x82000580, + 0x00000004, 0x04020024, 0x59325808, 0x59300402, + 0x4a025a04, 0x00000103, 0x900001c0, 0x48025806, + 0x497a5807, 0x497a5c09, 0x5930001f, 0x80000540, + 0x02020800, 0x00100d56, 0x59300004, 0x8c00053e, + 0x04020010, 0x0401fa88, 0x59326809, 0x0201f800, + 0x0002077d, 0x5934000f, 0x5934140b, 0x80081040, + 0x04001002, 0x480a6c0b, 0x80000540, 0x04020a10, + 0x59b800ea, 0x8c000510, 0x040207d7, 0x1c01f000, + 0x0201f800, 0x00106f60, 0x040007ef, 0x0201f000, + 0x00100a65, 0x42027000, 0x00000055, 0x0401f027, + 0x83326500, 0x3fffffff, 0x59300406, 0x82000580, + 0x00000003, 0x04020015, 0x59325808, 0x59326809, + 0x59301402, 0x4a025a04, 0x00000103, 0x900811c0, + 0x480a5806, 0x497a5c09, 0x497a5807, 0x0401fa62, + 0x0201f800, 0x0002077d, 0x5934000f, 0x5934140b, + 0x80081040, 0x04001002, 0x480a6c0b, 0x80000540, + 0x040209eb, 0x0401f7db, 0x42027000, 0x00000054, + 0x0401f00a, 0x83300500, 0x60000000, 0x02000000, + 0x00100a68, 0x81326580, 0x8000013a, 0x82000400, + 0x00100a80, 0x50027000, 0x59300c06, 0x82040580, + 0x00000002, 0x02000000, 0x00100a65, 0x59300004, + 0x8c00053e, 0x04020004, 0x0201f800, 0x000207a1, + 0x0401f7c4, 0x0201f800, 0x00106f60, 0x040007fb, + 0x0201f000, 0x00100a65, 0x59325808, 0x412c7000, + 0x58380a04, 0x82040500, 0x0000000f, 0x82000c00, + 0x001010bd, 0x50044000, 0x0c01f001, 0x00100dd9, + 0x00100dd9, 0x0002009f, 0x00100dd9, 0x00100dd9, + 0x00100dd9, 0x00100dd9, 0x00100dd9, 0x000200af, + 0x00100ded, 0x00100dd9, 0x00100dd9, 0x00100ddb, + 0x00100dd9, 0x00100dd9, 0x00100dd9, 0x5838040a, + 0x8c000500, 0x02000800, 0x001005d8, 0x50200000, + 0x80387c00, 0x583c1002, 0x583c2800, 0x583c2001, + 0x58380a07, 0x5838300f, 0x59303807, 0x58384c08, + 0x5838000d, 0x48026012, 0x0401f010, 0x5838020a, + 0x8c000502, 0x02000000, 0x00100dd9, 0x50200000, + 0x80387c00, 0x583c2800, 0x583c2001, 0x583c1002, + 0x592c0a07, 0x592c4c08, 0x592c300f, 0x59303807, + 0x497a6012, 0x497a6013, 0x4816600e, 0x4812600f, + 0x480a6010, 0x481a6011, 0x80040840, 0x4806600d, + 0x02020000, 0x00100e1a, 0x841c3d40, 0x481e6007, + 0x1c01f000, 0x41787800, 0x59325808, 0x592c0c0a, + 0x8c040d02, 0x02000000, 0x00100f8c, 0x592c000d, + 0x592c100f, 0x592c0a04, 0x480a6011, 0x48026012, + 0x48026013, 0x412c3000, 0x82040500, 0x0000000f, + 0x82000400, 0x001010bd, 0x50003800, 0x501c0000, + 0x401c1000, 0x592c1a07, 0x4802600a, 0x481a600b, + 0x480a600c, 0x480e600d, 0x843c7d4a, 0x403c1000, + 0x1c01f000, 0x41787800, 0x497a6012, 0x592c0a04, + 0x412c3000, 0x592c1a07, 0x82040500, 0x0000000f, + 0x82000400, 0x001010bd, 0x50004000, 0x50200000, + 0x40201000, 0x4802600a, 0x481a600b, 0x480a600c, + 0x480e600d, 0x80000580, 0x483e6004, 0x1c01f000, + 0x4c000000, 0x4df00000, 0x0201f800, 0x00020729, + 0x0401f005, 0x4c000000, 0x4df00000, 0x0401ff16, + 0x0401f001, 0x5c03e000, 0x5c000000, 0x1801f000, + 0x4203e000, 0xb0100000, 0x41fc0000, 0x82000500, + 0x00000011, 0x0c01f001, 0x0002012a, 0x00020697, + 0x0002012a, 0x0002012a, 0x0002012a, 0x0002012a, + 0x0002012a, 0x0002012a, 0x0002012a, 0x0002012a, + 0x0002012a, 0x0002012a, 0x0002012a, 0x0002012a, + 0x0002012a, 0x0002012a, 0x0010115a, 0x0002012c, + 0x0002012a, 0x0002012a, 0x0002012a, 0x0002012a, + 0x0002012a, 0x0002012a, 0x0002012a, 0x0002012a, + 0x0002012a, 0x0002012a, 0x0002012a, 0x0002012a, + 0x0002012a, 0x0002012a, 0x0201f800, 0x001005d8, + 0x0201f800, 0x00020697, 0x0201f000, 0x0010115a, + 0x42000000, 0x0010b4c1, 0x50000000, 0x8c000504, + 0x04000014, 0x42000000, 0x0010b4c1, 0x50000000, + 0x8c000502, 0x04020002, 0x1c01f000, 0x4df00000, + 0x4203e000, 0x50000000, 0x42034000, 0x0010b4a4, + 0x59a0001d, 0x59a1d81e, 0x84000502, 0x4803401d, + 0x58ec0009, 0x0801f800, 0x5c03e000, 0x1c01f000, + 0x04027002, 0x04026002, 0x1c01f000, 0x4df00000, + 0x4203e000, 0x50000000, 0x0201f800, 0x001007e4, + 0x04000010, 0x412dd800, 0x48efc857, 0x0201f800, + 0x00103b28, 0x42034000, 0x0010b4a4, 0x49a1d80b, + 0x48ef401e, 0x59a0001d, 0x84000544, 0x4803401d, + 0x0201f800, 0x00102214, 0x0201f800, 0x00102233, + 0x5c03e000, 0x1c01f000, 0x4da00000, 0x4df00000, + 0x4203e000, 0x50000000, 0x04006051, 0x40001000, + 0x42034000, 0x0010b4a4, 0x59a01818, 0x800c19c0, + 0x04020008, 0x59a0381b, 0x801c39c0, 0x02000800, + 0x001005d8, 0x59a0041c, 0x801c3c00, 0x0401f00c, + 0x59a00419, 0x82000400, 0x00000002, 0x48034419, + 0x82000c80, 0x00000013, 0x04001003, 0x497b4419, + 0x41780000, 0x59a03816, 0x801c3c00, 0x80081040, + 0x480b4017, 0x581c0200, 0x4803c021, 0x581c0401, + 0x4803c022, 0x581c0201, 0x4803c023, 0x581c0400, + 0x4803c020, 0x900001c0, 0x82000540, 0x00000012, + 0x4803c011, 0x59e00017, 0x8c000508, 0x04000003, + 0x4a03c017, 0x00000002, 0x4203e000, 0x30000001, + 0x800c19c0, 0x04000007, 0x800c1840, 0x480f4018, + 0x0402001f, 0x497b4419, 0x497b4219, 0x0401f01c, + 0x800811c0, 0x0402000b, 0x4d2c0000, 0x59a2581b, + 0x0201f800, 0x001007f4, 0x5c025800, 0x497b401b, + 0x497b401a, 0x497b441c, 0x497b421c, 0x0401f010, + 0x59a0041c, 0x82000400, 0x00000002, 0x82000c80, + 0x00000012, 0x4803441c, 0x04001009, 0x4d2c0000, + 0x59a2581b, 0x592c3813, 0x481f401b, 0x497b441c, + 0x0201f800, 0x001007f4, 0x5c025800, 0x5c03e000, + 0x5c034000, 0x1c01f000, 0x59a80005, 0x82000500, + 0x00000003, 0x02020000, 0x00104315, 0x59340400, + 0x82000580, 0x00000606, 0x02020000, 0x001042e6, + 0x5934000d, 0x80027d40, 0x02020000, 0x00104321, + 0x0401f803, 0x80000580, 0x1c01f000, 0x5934000f, + 0x59341203, 0x80080540, 0x0402006f, 0x5934020b, + 0x5934140b, 0x80080480, 0x0402106b, 0x0201f800, + 0x0002075a, 0x04000064, 0x80081000, 0x592c0406, + 0x480a6c0b, 0x49366009, 0x492e6008, 0x4a026406, + 0x00000003, 0x4a026403, 0x00000040, 0x800000c2, + 0x800018c4, 0x800c0400, 0x48026206, 0x592c0808, + 0x592c1809, 0x592c020a, 0x48066017, 0x480e6018, + 0x8c000502, 0x04000030, 0x4a026203, 0x00000004, + 0x592c0207, 0x80000040, 0x04020020, 0x59a80005, + 0x8c000514, 0x42000000, 0x00000055, 0x04020003, + 0x42000000, 0x00000033, 0x80000040, 0x040207ff, + 0x592c0204, 0x82000500, 0x000000ff, 0x82000580, + 0x00000018, 0x04020011, 0x592c180f, 0x59300007, + 0x82000540, 0x00000091, 0x480e6011, 0x48026007, + 0x42000000, 0x80000004, 0x48026004, 0x59bc00ea, + 0x8c000516, 0x040207fe, 0x83300400, 0x20000000, + 0x480378e1, 0x1c01f000, 0x0401fe78, 0x59300007, + 0x8400054e, 0x48026007, 0x592c1a04, 0x820c1d00, + 0x000000ff, 0x820c0580, 0x00000048, 0x04000017, + 0x0401f7ec, 0x8c000500, 0x04020ecb, 0x4a026203, + 0x00000002, 0x59a80805, 0x82040500, 0x00000600, + 0x04020012, 0x42000000, 0x00000030, 0x80000040, + 0x040207ff, 0x592c1a04, 0x820c1d00, 0x000000ff, + 0x820c0580, 0x00000018, 0x040007da, 0x820c0580, + 0x00000048, 0x040207d7, 0x42000800, 0x80000804, + 0x0201f000, 0x00106721, 0x8c040d12, 0x42000000, + 0x00000010, 0x040207ee, 0x42000000, 0x00000051, + 0x0401f7eb, 0x800811c0, 0x04020003, 0x4a026a03, + 0x00000001, 0x59340010, 0x492e6810, 0x80000d40, + 0x04020003, 0x492e680f, 0x1c01f000, 0x492c0800, + 0x1c01f000, 0x83440c80, 0x00000800, 0x04021009, + 0x83440400, 0x0010ac00, 0x50000000, 0x80000540, + 0x04000004, 0x40026800, 0x80000580, 0x1c01f000, + 0x82000540, 0x00000001, 0x1c01f000, 0x59340203, + 0x80000540, 0x0402004b, 0x4d300000, 0x4d2c0000, + 0x5934000f, 0x80025d40, 0x04000044, 0x0201f800, + 0x0002075a, 0x0400003f, 0x592c0000, 0x4802680f, + 0x80000540, 0x04020002, 0x48026810, 0x592c2a04, + 0x80081000, 0x480a6c0b, 0x49366009, 0x492e6008, + 0x82142d00, 0x000000ff, 0x82140580, 0x00000012, + 0x04000035, 0x4a026406, 0x00000003, 0x4a026403, + 0x00000040, 0x592c0406, 0x800000c2, 0x800018c4, + 0x800c0400, 0x48026206, 0x592c0808, 0x592c1809, + 0x592c020a, 0x48066017, 0x480e6018, 0x8c000502, + 0x02000000, 0x0010474d, 0x4a026203, 0x00000004, + 0x592c0207, 0x80000040, 0x02020000, 0x00104740, + 0x82140580, 0x00000018, 0x02020000, 0x00104740, + 0x592c180f, 0x59300007, 0x82000540, 0x00000091, + 0x480e6011, 0x48026007, 0x42000000, 0x80000004, + 0x48026004, 0x59bc00ea, 0x8c000516, 0x040207fe, + 0x83300400, 0x20000000, 0x480378e1, 0x5934020b, + 0x5934140b, 0x80080480, 0x040017be, 0x0401f003, + 0x4a026a03, 0x00000001, 0x5c025800, 0x5c026000, + 0x1c01f000, 0x497a5800, 0x49325809, 0x4a026406, + 0x00000006, 0x4a026203, 0x00000007, 0x0401f802, + 0x0401f7ef, 0x59a80021, 0x800001c0, 0x02020000, + 0x0010476f, 0x59a80005, 0x8c000504, 0x02020000, + 0x0010476b, 0x59340200, 0x8c000518, 0x02020000, + 0x00104767, 0x592c0a0c, 0x48066202, 0x4a025a06, + 0x00000000, 0x8c000508, 0x02020000, 0x00104763, + 0x4d3c0000, 0x417a7800, 0x0401fbdf, 0x5c027800, + 0x1c01f000, 0x592c0404, 0x8c00051e, 0x02020000, + 0x00104ce4, 0x59980022, 0x80000540, 0x04000017, + 0x592c0a06, 0x592c0409, 0x80040540, 0x04020013, + 0x0201f000, 0x00104cfa, 0x592c0404, 0x8c00051e, + 0x02020000, 0x00104cf3, 0x59980022, 0x80000540, + 0x0400000a, 0x82040580, 0x00000001, 0x04020007, + 0x0201f000, 0x00104cfa, 0x592c0404, 0x8c00051e, + 0x02020000, 0x00104dca, 0x59980026, 0x497a5800, + 0x80000540, 0x02020000, 0x00104e1d, 0x59d80105, + 0x82000d00, 0x00018780, 0x02020000, 0x00104edb, + 0x80000106, 0x82000500, 0x00000003, 0x0c01f001, + 0x000202f0, 0x00104e1d, 0x000202f6, 0x00020341, + 0x592c0001, 0x492fb107, 0x80000d40, 0x02020000, + 0x00104ddb, 0x1c01f000, 0x592c0001, 0x492fb107, + 0x80000d40, 0x02020000, 0x00104de8, 0x59da5908, + 0x835c0480, 0x00000020, 0x0400102c, 0x0402b034, + 0x492fb007, 0x0400e7fa, 0x59d80105, 0x82000500, + 0x00018780, 0x02020000, 0x00104edb, 0x0400601f, + 0x59d8010a, 0x59d8090a, 0x80040580, 0x040207fd, + 0x800408e0, 0x599c1017, 0x8c081508, 0x04020028, + 0x82040d40, 0x00000013, 0x5998002b, 0x4807c011, + 0x84000500, 0x4803302b, 0x59e00017, 0x8c000508, + 0x04020004, 0x4203e000, 0x30000001, 0x1c01f000, + 0x4a03c017, 0x00000003, 0x82040500, 0x000000ff, + 0x82000580, 0x0000001d, 0x040207f7, 0x4a03c017, + 0x0000000d, 0x0401f7f4, 0x5998082b, 0x84040d40, + 0x4807302b, 0x1c01f000, 0x496a5800, 0x412ed000, + 0x815eb800, 0x59c80000, 0x82000540, 0x00001200, + 0x48039000, 0x0400e7ca, 0x0401f7d0, 0x0402f7f7, + 0x492fa807, 0x0400e7c6, 0x0401f7cc, 0x59e0000f, + 0x59e0100f, 0x80081580, 0x040207fd, 0x81281580, + 0x040007d4, 0x40025000, 0x82040d40, 0x0000001d, + 0x0401f7d2, 0x59d80908, 0x45680800, 0x4006d000, + 0x815eb800, 0x0400e7fc, 0x59c80000, 0x82000540, + 0x00001200, 0x48039000, 0x02006000, 0x00104df8, + 0x59d8010a, 0x59d8090a, 0x80040d80, 0x040207fd, + 0x900001c0, 0x82000540, 0x00000013, 0x4803c011, + 0x5998002b, 0x84000500, 0x4803302b, 0x59e00017, + 0x8c000508, 0x04000003, 0x4a03c017, 0x00000003, + 0x4203e000, 0x30000001, 0x59d80105, 0x82000500, + 0x00018780, 0x02020000, 0x00104edb, 0x0202d000, + 0x00104dfd, 0x592c0001, 0x492fb107, 0x80000d40, + 0x02020000, 0x00104e10, 0x1c01f000, 0x59980020, + 0x0c01f001, 0x00020370, 0x00020371, 0x00104e88, + 0x1c01f000, 0x4df00000, 0x4203e000, 0x50000000, + 0x0402681e, 0x04006004, 0x599c0017, 0x8c000508, + 0x04020865, 0x59980029, 0x80025d40, 0x0400000a, + 0x0402d00b, 0x59980026, 0x80000040, 0x48033026, + 0x592c0000, 0x492fb107, 0x48033029, 0x04020002, + 0x48033028, 0x5c03e000, 0x1c01f000, 0x59d80105, + 0x82000500, 0x00018780, 0x02020000, 0x00104edb, + 0x42000000, 0x0010b855, 0x0201f800, 0x0010aa47, + 0x5c03e000, 0x1c01f000, 0x5998002b, 0x8c000500, + 0x0402003b, 0x0400e007, 0x59d80105, 0x82000500, + 0x00018780, 0x02020000, 0x00104edb, 0x1c01f000, + 0x59da5908, 0x835c0c80, 0x00000020, 0x04001003, + 0x0400b029, 0x0400f02b, 0x496a5800, 0x412ed000, + 0x815eb800, 0x59c80000, 0x82000540, 0x00001200, + 0x48039000, 0x0400e7f3, 0x59d8010a, 0x59d8090a, + 0x80040580, 0x040207fd, 0x800408e0, 0x599c1017, + 0x8c081508, 0x04020022, 0x82040d40, 0x00000013, + 0x4807c011, 0x59e00017, 0x8c000508, 0x0400000a, + 0x4a03c017, 0x00000003, 0x82040500, 0x000000ff, + 0x82000580, 0x0000001d, 0x04020003, 0x4a03c017, + 0x0000000d, 0x4203e000, 0x30000001, 0x59d80105, + 0x82000500, 0x00018780, 0x02020000, 0x00104edb, + 0x1c01f000, 0x492fb007, 0x0400e7d2, 0x0401f7df, + 0x492fa807, 0x0400e7cf, 0x0401f7dc, 0x84000500, + 0x4803302b, 0x0400e7cb, 0x0401f7d8, 0x59e0000f, + 0x59e0100f, 0x80081580, 0x040207fd, 0x81281580, + 0x040007da, 0x40025000, 0x82040d40, 0x0000001d, + 0x0401f7d8, 0x59e0000f, 0x59e0100f, 0x80080d80, + 0x040207fd, 0x81280580, 0x04020002, 0x1c01f000, + 0x400a5000, 0x900811c0, 0x82081540, 0x0000001c, + 0x480bc011, 0x59e00017, 0x8c000508, 0x04000003, + 0x4a03c017, 0x0000000c, 0x4203e000, 0x30000001, + 0x1c01f000, 0x41700000, 0x0c01f001, 0x00105420, + 0x000203fc, 0x00105420, 0x00105421, 0x0010541e, + 0x0010541e, 0x0010541e, 0x0010541e, 0x001058b0, + 0x04010037, 0x59980006, 0x80000540, 0x0402003c, + 0x0402c01c, 0x4202f800, 0x00000010, 0x4df00000, + 0x4203e000, 0x50000000, 0x49db3005, 0x59da5808, + 0x592c0204, 0x497a5800, 0x497a5801, 0x82000500, + 0x000000ff, 0x82000c80, 0x00000079, 0x04021036, + 0x0c01f839, 0x5c03e000, 0x817ef840, 0x04000009, + 0x836c0580, 0x00000003, 0x04020006, 0x83700580, + 0x00000001, 0x04020010, 0x0401001b, 0x0400c7e8, + 0x0400f94a, 0x0400b134, 0x59d40005, 0x82000500, + 0x43018780, 0x02020000, 0x0010583f, 0x59d80005, + 0x82000500, 0x43018780, 0x02020000, 0x00105846, + 0x1c01f000, 0x83700580, 0x00000003, 0x02000800, + 0x00105421, 0x83700580, 0x00000001, 0x040207ed, + 0x04010005, 0x0400c7d2, 0x0401f7ea, 0x4202f800, + 0x00000010, 0x4df00000, 0x4203e000, 0x50000000, + 0x49d73005, 0x59d65808, 0x0401f7ce, 0x4df00000, + 0x4203e000, 0x50000000, 0x40025800, 0x592c0204, + 0x497b3005, 0x497b3006, 0x4202f800, 0x00000010, + 0x0401f7c7, 0x0201f800, 0x00105491, 0x5c03e000, + 0x0401f7d4, 0x00105491, 0x00105491, 0x00105491, + 0x00105491, 0x00105527, 0x00105491, 0x00105491, + 0x00105491, 0x00105491, 0x00105491, 0x001054a1, + 0x00105491, 0x00105491, 0x00105491, 0x00105551, + 0x00105491, 0x00105491, 0x00105491, 0x000204ef, + 0x00105491, 0x001056b4, 0x00105491, 0x00105491, + 0x00105491, 0x000204c2, 0x00105491, 0x00105491, + 0x00105491, 0x00105491, 0x00105491, 0x00105491, + 0x00105491, 0x00105491, 0x00105491, 0x00105491, + 0x00105491, 0x00105491, 0x00105491, 0x00105491, + 0x00105491, 0x00105491, 0x001054c9, 0x00105491, + 0x00105491, 0x00105491, 0x00105491, 0x00105491, + 0x00105491, 0x00105491, 0x00105491, 0x00105491, + 0x001057d3, 0x00105491, 0x00105491, 0x00105491, + 0x00105491, 0x00105491, 0x0010581e, 0x00105491, + 0x001054bb, 0x00105491, 0x00105797, 0x00105491, + 0x00105491, 0x00105491, 0x00105491, 0x00105491, + 0x00105491, 0x00105491, 0x00105765, 0x00105491, + 0x00105765, 0x00105872, 0x00105491, 0x00105491, + 0x00105491, 0x00105491, 0x00105491, 0x00105491, + 0x00105491, 0x00105491, 0x00105491, 0x00105725, + 0x00105855, 0x00105491, 0x00105865, 0x00105491, + 0x00105491, 0x00105491, 0x00105491, 0x00105491, + 0x00105491, 0x00105491, 0x00105491, 0x00105491, + 0x00105491, 0x00105491, 0x00105491, 0x00105491, + 0x00105491, 0x00105491, 0x00105491, 0x00105491, + 0x00105491, 0x00105491, 0x00105491, 0x00105491, + 0x00105491, 0x00105491, 0x00105491, 0x00105491, + 0x00105491, 0x00105491, 0x00105491, 0x00105491, + 0x00105491, 0x00105491, 0x00105491, 0x00105491, + 0x00105491, 0x00105491, 0x592c0204, 0x80000110, + 0x02000000, 0x00105499, 0x80000040, 0x04000009, + 0x48033002, 0x492f3003, 0x492f3004, 0x4a033008, + 0x000204d0, 0x4202e000, 0x00000003, 0x1c01f000, + 0x592c0406, 0x82000c80, 0x0000199a, 0x02021000, + 0x001054a9, 0x59a80021, 0x80000540, 0x02020000, + 0x001054d7, 0x592e8a06, 0x83440c80, 0x000007f0, + 0x02021000, 0x001054a9, 0x83440400, 0x0010ac00, + 0x50000000, 0x80026d40, 0x02000000, 0x001054db, + 0x59340002, 0x592c0810, 0x80040580, 0x82000500, + 0x00ffffff, 0x02020000, 0x001054a9, 0x0401fccf, + 0x02020000, 0x001054de, 0x1c01f000, 0x592c0204, + 0x80000110, 0x02000000, 0x00105499, 0x80000040, + 0x0402000b, 0x592c040a, 0x8c000504, 0x04000010, + 0x592c0207, 0x82000c80, 0x00001001, 0x02021000, + 0x001054a9, 0x0201f000, 0x0010588a, 0x48033002, + 0x492f3003, 0x492f3004, 0x4a033008, 0x00020507, + 0x4202e000, 0x00000003, 0x1c01f000, 0x592c0406, + 0x82000c80, 0x0000199a, 0x02021000, 0x001054a9, + 0x592e8a06, 0x417a7800, 0x0401fd37, 0x02020000, + 0x00105658, 0x59340002, 0x592c0808, 0x80040580, + 0x82000500, 0x00ffffff, 0x02020000, 0x001054a9, + 0x497a5808, 0x592e6009, 0x83300580, 0xffffffff, + 0x02000000, 0x00105618, 0x83300480, 0x0010d1c0, + 0x02001000, 0x00105675, 0x59a8000b, 0x81300480, + 0x02021000, 0x00105675, 0x592c240a, 0x49366009, + 0x8c10251c, 0x02020000, 0x00105606, 0x59a80068, + 0x8c000510, 0x02020000, 0x0010568e, 0x59a80821, + 0x800409c0, 0x02020000, 0x001055ec, 0x59a80805, + 0x8c040d04, 0x02020000, 0x0010567f, 0x59340200, + 0x8c000518, 0x02020000, 0x00105670, 0x59300c06, + 0x82040580, 0x00000006, 0x02020000, 0x00105610, + 0x59300414, 0x8c000516, 0x02020000, 0x0010567a, + 0x8c102508, 0x02020000, 0x0010a5b8, 0x59300808, + 0x4a025a06, 0x00000000, 0x800409c0, 0x02020000, + 0x001055e7, 0x592c0a0c, 0x48066202, 0x492e6008, + 0x0401f14d, 0x4df00000, 0x4203e000, 0x50000000, + 0x0402b00b, 0x835c0480, 0x00000020, 0x0400100d, + 0x815eb840, 0x416a5800, 0x592ed000, 0x492fb007, + 0x497a5800, 0x497a5801, 0x0400b7f7, 0x59d80005, + 0x82000500, 0x43018780, 0x02020000, 0x00105846, + 0x5c03e000, 0x1c01f000, 0x4df00000, 0x4203e000, + 0x50000000, 0x0402f00b, 0x835c0480, 0x00000020, + 0x0400100d, 0x815eb840, 0x416a5800, 0x592ed000, + 0x492fa807, 0x497a5800, 0x497a5801, 0x0400f7f7, + 0x59d40005, 0x82000500, 0x43018780, 0x02020000, + 0x0010583f, 0x5c03e000, 0x1c01f000, 0x4df00000, + 0x4203e000, 0x50000000, 0x59940024, 0x80000540, + 0x04000112, 0x4c000000, 0x42000000, 0x00001000, + 0x50000000, 0x82000480, 0x24320001, 0x04020015, + 0x42000800, 0x00000064, 0x80040840, 0x04000007, + 0x4a030000, 0x00000001, 0x40000000, 0x59800000, + 0x8c000500, 0x040007f9, 0x04000008, 0x42000800, + 0x00007a01, 0x50040000, 0x8c000510, 0x04000003, + 0x84000510, 0x44000800, 0x4a030000, 0x00000000, + 0x59e00002, 0x8c00051e, 0x0402001b, 0x42000000, + 0x00001000, 0x50000000, 0x82000480, 0x24320002, + 0x04020015, 0x42000800, 0x00000064, 0x80040840, + 0x04000007, 0x4a030000, 0x00000001, 0x40000000, + 0x59800000, 0x8c000500, 0x040007f9, 0x04000008, + 0x42000800, 0x00007a17, 0x50040000, 0x8c00050e, + 0x04020003, 0x8400054e, 0x44000800, 0x4a030000, + 0x00000000, 0x5c000000, 0x5994781a, 0x48032825, + 0x803c0480, 0x04001004, 0x04000003, 0x4803281a, + 0x0401f022, 0x41787800, 0x803c7800, 0x82000400, + 0x000003e8, 0x040027fd, 0x4803281a, 0x59a80024, + 0x803c1400, 0x480b5024, 0x803c0040, 0x04000002, + 0x483fc857, 0x59e40852, 0x59a80025, 0x80040580, + 0x04000004, 0x480bc857, 0x59e40052, 0x48035025, + 0x59940026, 0x803c0400, 0x48032826, 0x0201f800, + 0x00106021, 0x59940000, 0x82000580, 0x00000000, + 0x04020006, 0x59940026, 0x48032827, 0x497b2826, + 0x4a032800, 0x00000001, 0x4c0c0000, 0x59940007, + 0x80000d40, 0x0400001d, 0x59941006, 0x59940025, + 0x80081c80, 0x04001004, 0x04000003, 0x480f2806, + 0x0401f016, 0x80040840, 0x48072807, 0x82040580, + 0x000003e8, 0x04020007, 0x4c040000, 0x4c0c0000, + 0x59940008, 0x0801f800, 0x5c001800, 0x5c000800, + 0x800409c0, 0x04020004, 0x59940008, 0x0801f800, + 0x0401f006, 0x400c0000, 0x820c1c00, 0x0000000a, + 0x040027ed, 0x480f2806, 0x5c001800, 0x4d180000, + 0x59c40008, 0x8c000534, 0x04020025, 0x417a3000, + 0x83947c00, 0x00000009, 0x583c0001, 0x80000d40, + 0x04020008, 0x823c7c00, 0x00000003, 0x811a3000, + 0x83180580, 0x00000005, 0x040207f8, 0x0401f018, + 0x583c1000, 0x59940025, 0x80080480, 0x04001005, + 0x04000004, 0x48007800, 0x80000040, 0x04021010, + 0x80040840, 0x48047801, 0x04000008, 0x82000400, + 0x0000000a, 0x48007800, 0x040027fa, 0x82040500, + 0x0000007f, 0x0401f7e8, 0x583c0002, 0x4c3c0000, + 0x0801f800, 0x5c007800, 0x0401f7e3, 0x5c023000, + 0x59940019, 0x80001540, 0x04000008, 0x04002007, + 0x59940025, 0x80080480, 0x497b2819, 0x04001003, + 0x04000002, 0x48032819, 0x59940004, 0x80000d40, + 0x0400002a, 0x4c040000, 0x5994001c, 0x80000d40, + 0x04000013, 0x5994101b, 0x59940025, 0x80080480, + 0x04001005, 0x04000004, 0x4803281b, 0x80000040, + 0x0402100b, 0x80040840, 0x4807281c, 0x04020004, + 0x5994001d, 0x0801f800, 0x0401f005, 0x82000400, + 0x0000000a, 0x4803281b, 0x040027f7, 0x5c000800, + 0x59941003, 0x59940025, 0x80080480, 0x04001005, + 0x04000004, 0x48032803, 0x80000040, 0x0402100b, + 0x80040840, 0x48072804, 0x04020004, 0x59940005, + 0x0801f800, 0x0401f005, 0x82000400, 0x0000000a, + 0x48032803, 0x040027f7, 0x5994001f, 0x80000d40, + 0x04000013, 0x5994101e, 0x59940025, 0x80080480, + 0x04001005, 0x04000004, 0x4803281e, 0x80000040, + 0x0402100b, 0x80040840, 0x4807281f, 0x04020004, + 0x59940020, 0x0801f800, 0x0401f005, 0x82000400, + 0x00000001, 0x4803281e, 0x040027f7, 0x59940022, + 0x80000d40, 0x04000013, 0x59941021, 0x59940025, + 0x80080480, 0x04001005, 0x04000004, 0x48032821, + 0x80000040, 0x0402100b, 0x80040840, 0x48072822, + 0x04020004, 0x59940023, 0x0801f800, 0x0401f005, + 0x82000400, 0x0000000a, 0x48032821, 0x040027f7, + 0x59940824, 0x59940025, 0x80040480, 0x02001800, + 0x001005d8, 0x48032824, 0x59940000, 0x0c01f001, + 0x00105fb5, 0x00105fb7, 0x00105fdd, 0x59940024, + 0x80000000, 0x48032824, 0x4203e000, 0x70000000, + 0x1c01f000, 0x592c0406, 0x800000c2, 0x800008c4, + 0x80040c00, 0x592c040a, 0x48066206, 0x82000d00, + 0x00000003, 0x02000000, 0x0010615e, 0x8c000500, + 0x04020029, 0x8c00051e, 0x02000000, 0x00106139, + 0x82000d00, 0x000000c0, 0x02020000, 0x0010612f, + 0x82000d00, 0x00002020, 0x02020000, 0x0010612c, + 0x813e79c0, 0x02020000, 0x0010612c, 0x592c0c0c, + 0x800409c0, 0x02020000, 0x0010612c, 0x59300a03, + 0x82040d80, 0x00000007, 0x02020000, 0x0010612c, + 0x4a026203, 0x00000003, 0x4a026403, 0x00000043, + 0x0201f800, 0x000200c9, 0x82080d40, 0x80003465, + 0x48066004, 0x497a6000, 0x59bc00ea, 0x8c000516, + 0x040207fe, 0x83300400, 0xa0000000, 0x480378e1, + 0x1c01f000, 0x8c000502, 0x02020000, 0x00106181, + 0x8c00051e, 0x0400000e, 0x82000d00, 0x000000c0, + 0x04000005, 0x82040d80, 0x000000c0, 0x02020000, + 0x00106186, 0x82000d00, 0x00002020, 0x82040d80, + 0x00002020, 0x02000000, 0x0010614d, 0x592c0207, + 0x80000040, 0x02020000, 0x00106157, 0x592c180d, + 0x800c19c0, 0x02020000, 0x00106157, 0x592c180f, + 0x59300007, 0x82000540, 0x00000011, 0x480e6011, + 0x48026007, 0x4a026203, 0x00000004, 0x4a026403, + 0x00000042, 0x42000800, 0x80002001, 0x0401f02a, + 0x5c000000, 0x4c000000, 0x4803c857, 0x4807c857, + 0x0401f003, 0x42000800, 0x00000001, 0x59325808, + 0x832c0500, 0x00ff0000, 0x0400000d, 0x592c0000, + 0x48065a06, 0x48026008, 0x592c040a, 0x8c000510, + 0x04020008, 0x0201f800, 0x000202ce, 0x417a7800, + 0x59300008, 0x80025d40, 0x0402078f, 0x1c01f000, + 0x456a5800, 0x412ed000, 0x815eb800, 0x59c80000, + 0x82000540, 0x00001200, 0x48039000, 0x0401f7f4, + 0x59840000, 0x80000540, 0x04020002, 0x1c01f000, + 0x59840003, 0x80000540, 0x02020000, 0x001061fe, + 0x1c01f000, 0x48066004, 0x59bc00ea, 0x8c000516, + 0x040207fe, 0x83300400, 0x40000000, 0x480378e1, + 0x1c01f000, 0x59bc00ea, 0x82001500, 0xb0000018, + 0x02020000, 0x00106c81, 0x8c000510, 0x0400002a, + 0x59bc10e0, 0x82080500, 0xfffff000, 0x0402000a, + 0x80080108, 0x820a3500, 0x0000000f, 0x4803c857, + 0x1201f000, 0x00106c87, 0x84000510, 0x48026004, + 0x0401f016, 0x840a653e, 0x59300004, 0x8c000520, + 0x040007fa, 0x82000500, 0xfffefeff, 0x48026004, + 0x8c08153e, 0x04020005, 0x42027000, 0x00000013, + 0x0401f859, 0x0401f009, 0x59300004, 0x8c000514, + 0x04000003, 0x0401ffb0, 0x0401f02f, 0x42027000, + 0x00000049, 0x0401f850, 0x59bc00ea, 0x82001500, + 0xb0000018, 0x02020000, 0x00106c81, 0x8c000510, + 0x040207d8, 0x1c01f000, 0x83640480, 0x00000010, + 0x0400101a, 0x41626000, 0x41580000, 0x59300a03, + 0x82040d80, 0x00000000, 0x04000008, 0x83326400, + 0x00000024, 0x81300c80, 0x040017f9, 0x42026000, + 0x0010d1c0, 0x0401f7f6, 0x8166c840, 0x83300c00, + 0x00000024, 0x80040480, 0x04021005, 0x4006c000, + 0x4a026203, 0x00000008, 0x1c01f000, 0x837ac540, + 0x0010d1c0, 0x0401f7fb, 0x42000000, 0x0010b854, + 0x0201f800, 0x0010aa47, 0x4967c857, 0x80026580, + 0x1c01f000, 0x83300480, 0x0010d1c0, 0x02001800, + 0x001005d8, 0x41580000, 0x81300480, 0x0402100c, + 0x04011000, 0x457a6000, 0x4a026202, 0x0000ffff, + 0x83300400, 0x00000003, 0x4803c840, 0x4a03c842, + 0x00000021, 0x8166c800, 0x1c01f000, 0x41540000, + 0x81300480, 0x02021800, 0x001005d8, 0x04011000, + 0x457a6000, 0x4a026202, 0x0000ffff, 0x83300400, + 0x00000003, 0x4803c840, 0x4a03c842, 0x00000021, + 0x59a80066, 0x49335065, 0x80000000, 0x48035066, + 0x1c01f000, 0x4d340000, 0x59326809, 0x59300406, + 0x82000500, 0x0000001f, 0x0c01f803, 0x5c026800, + 0x1c01f000, 0x00107966, 0x00107979, 0x00107993, + 0x000207c9, 0x001098f1, 0x0010990c, 0x0002083e, + 0x00107966, 0x00107979, 0x001064ee, 0x001079ac, + 0x00107966, 0x00107966, 0x00107966, 0x00107966, + 0x00107966, 0x001095a1, 0x0010a6c2, 0x00107966, + 0x00107966, 0x00107966, 0x00107966, 0x00107966, + 0x00107966, 0x00107966, 0x00107966, 0x00107966, + 0x00107966, 0x00107966, 0x00107966, 0x00107966, + 0x00107966, 0x59300203, 0x82000c80, 0x0000000e, + 0x02021800, 0x001005d8, 0x0c01f001, 0x001079aa, + 0x00108592, 0x000207dd, 0x00108720, 0x001087b9, + 0x001079aa, 0x001079aa, 0x001079aa, 0x00108577, + 0x001079aa, 0x001079aa, 0x001079aa, 0x001079aa, + 0x00108985, 0x83380480, 0x00000058, 0x04021007, + 0x83380480, 0x00000040, 0x04001004, 0x4d2c0000, + 0x0c01f803, 0x5c025800, 0x1c01f000, 0x0010861b, + 0x0010861b, 0x0010861b, 0x0010861b, 0x0010861b, + 0x0010861d, 0x001086bd, 0x0010861b, 0x0010861b, + 0x0010861b, 0x0010861b, 0x0010861b, 0x0010861b, + 0x0010861b, 0x0010861b, 0x0010861b, 0x0010861b, + 0x0010861b, 0x0010861b, 0x001086c1, 0x000207ff, + 0x0010861b, 0x001086c0, 0x001086c2, 0x59325808, + 0x59300811, 0x59301402, 0x59340200, 0x8c00050e, + 0x0402001c, 0x0401f826, 0x04000005, 0x4a025a04, + 0x00000103, 0x497a5c09, 0x0401f009, 0x4a025a04, + 0x00000103, 0x4a025a06, 0x00000000, 0x497a5c09, + 0x800409c0, 0x02020800, 0x00108785, 0x48065807, + 0x480a5c06, 0x0201f800, 0x000202c1, 0x5934000f, + 0x5934140b, 0x80081040, 0x04001002, 0x480a6c0b, + 0x80000540, 0x02020800, 0x00020253, 0x0401f75e, + 0x592c020a, 0x8c000502, 0x040007e9, 0x800409c0, + 0x040007e7, 0x592c0208, 0x8c00050e, 0x040207e4, + 0x4933c857, 0x0201f000, 0x0010920f, 0x592c020a, + 0x8c000500, 0x04000010, 0x59300015, 0x592c380f, + 0x801c3c80, 0x0400000c, 0x4a025a06, 0x00000015, + 0x8c1c3d3e, 0x04000005, 0x4a025a06, 0x00000007, + 0x801c3880, 0x801c3800, 0x481fc857, 0x821c0d40, + 0x00000000, 0x1c01f000, 0x59300203, 0x82003480, + 0x0000000e, 0x02021800, 0x001005d8, 0x0c01f001, + 0x0010992b, 0x00020852, 0x00109fba, 0x00109fc8, + 0x0002086e, 0x0010992b, 0x0010a0a8, 0x0002088d, + 0x0010992b, 0x0010992b, 0x0010992b, 0x0010992b, + 0x0010992b, 0x0010992b, 0x83380580, 0x00000013, + 0x02020000, 0x00109f42, 0x59300403, 0x82027480, + 0x00000044, 0x02021800, 0x001005d8, 0x82000480, + 0x00000040, 0x02001800, 0x001005d8, 0x0c01f001, + 0x00109f9e, 0x00020864, 0x00109fa0, 0x00109fb2, + 0x59325808, 0x832c0500, 0x00ff0000, 0x04000005, + 0x592c0c0a, 0x8c040d1a, 0x02020000, 0x00109fad, + 0x0401fe91, 0x0401f710, 0x83380580, 0x00000048, + 0x04000007, 0x83380580, 0x00000053, 0x02000000, + 0x0010a04a, 0x0201f800, 0x001005d8, 0x5930001f, + 0x59301011, 0x59300809, 0x58040a00, 0x8c040d0e, + 0x02020000, 0x0010a026, 0x800811c0, 0x02020000, + 0x0010a033, 0x5930001f, 0x80000540, 0x02020000, + 0x0010a041, 0x59325808, 0x592c040a, 0x8c00051e, + 0x02000000, 0x0010a01c, 0x42027000, 0x00000041, + 0x0401f001, 0x83380480, 0x00000054, 0x02021800, + 0x001005d8, 0x83380480, 0x00000040, 0x02001000, + 0x0010a067, 0x0c01f001, 0x0010a073, 0x000208aa, + 0x0010a07f, 0x0010a086, 0x0010a073, 0x0010a073, + 0x0010a073, 0x0010a073, 0x0010a075, 0x0010a07a, + 0x0010a07a, 0x0010a073, 0x0010a073, 0x0010a073, + 0x0010a073, 0x0010a07a, 0x0010a073, 0x0010a07a, + 0x0010a073, 0x0010a075, 0x4a026203, 0x00000001, + 0x493a6403, 0x42000800, 0x80002042, 0x0401f672, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x14aa62b1, + 0x00000000, 0x00000000, 0x00000000, 0x00000005, + 0xfffffffb, 0x02800004, 0x00000000, 0x0000c000, + 0x0000071d, 0x073fca5a, 0x0705a5a5, 0x01928009, + 0x070ff0e1, 0x03800006, 0x04958010, 0x05308000, + 0x05008000, 0x0600902f, 0x04a004dc, 0x0202f051, + 0x042e4020, 0x018f021b, 0x033e5000, 0x03020000, + 0x078d0018, 0x0493041a, 0x0092041c, 0x038a0305, + 0x078b0303, 0x048e8010, 0x0678aae5, 0x06000001, + 0x07818174, 0x040010e6, 0x0448e0e6, 0x04818010, + 0x002fb008, 0x0448e0e6, 0x04818010, 0x060ff0e6, + 0x00580401, 0x054880ff, 0x04818010, 0x022a5001, + 0x030430d4, 0x06780043, 0x030e0000, 0x030450ff, + 0x06780043, 0x03019000, 0x058185c6, 0x027c0045, + 0x03020000, 0x06810037, 0x027c0045, 0x03040000, + 0x068100c7, 0x027c0045, 0x03080000, 0x0781061e, + 0x04908037, 0x029105c4, 0x010410a6, 0x0379ff41, + 0x037fffff, 0x072d6000, 0x07601241, 0x050f80ff, + 0x032fa009, 0x05600400, 0x050f80ff, 0x056c04ff, + 0x068105dc, 0x073fa009, 0x06000001, 0x0279ff02, + 0x0700ffff, 0x070ff0d1, 0x0179feff, 0x0700ffff, + 0x045c0402, 0x048185dc, 0x060ff0d0, 0x0179feff, + 0x0700ffff, 0x057dfeff, 0x0700ffff, 0x078105be, + 0x05600e41, 0x050f80ff, 0x032fa069, 0x07480000, + 0x068105d0, 0x06780043, 0x070000f0, 0x0781005f, + 0x037c00ff, 0x06000010, 0x0781005f, 0x038005cc, + 0x0379ff00, 0x070fffff, 0x06780043, 0x07f00000, + 0x075a0000, 0x020ef001, 0x028605ce, 0x05484000, + 0x02a1819e, 0x062d6001, 0x002fb001, 0x070ff069, + 0x01868072, 0x060ff079, 0x055c0441, 0x06810010, + 0x012fb000, 0x060560fb, 0x03800078, 0x060ff079, + 0x02868198, 0x070ff069, 0x055c0441, 0x06810010, + 0x060560fb, 0x0400d0d0, 0x062d6002, 0x0648300d, + 0x06810086, 0x070ff0d1, 0x062d6001, 0x045c040b, + 0x06810089, 0x05488000, 0x04818086, 0x072e500c, + 0x00208001, 0x05a004e1, 0x02800010, 0x062d6001, + 0x07f00000, 0x07f00000, 0x070ff0d1, 0x0179feff, + 0x070000ff, 0x055c040c, 0x058180bb, 0x0007b001, + 0x03079041, 0x0307a000, 0x06600a79, 0x050f80ff, + 0x053fa80a, 0x06000010, 0x072d5003, 0x078d0096, + 0x0307c003, 0x0007d004, 0x0107e005, 0x0307f006, + 0x02080007, 0x00081008, 0x01082009, 0x0308300a, + 0x0008400b, 0x0308500c, 0x068d00a1, 0x0678007a, + 0x07f00000, 0x010880ff, 0x03386000, 0x03010000, + 0x072e6300, 0x020ef07f, 0x02860010, 0x070ff07d, + 0x0450047c, 0x050f80ff, 0x002fa819, 0x068d00ae, + 0x02080001, 0x00081002, 0x0448807a, 0x068100b5, + 0x0379ff03, 0x070000ff, 0x01082003, 0x068d00b6, + 0x02386004, 0x03010000, 0x072e6c00, 0x02800010, + 0x06780043, 0x070000f0, 0x078105d7, 0x050020ff, + 0x027c0002, 0x06000010, 0x078100c3, 0x038005d7, + 0x0700c0d1, 0x0379ff0c, 0x070000ff, 0x0380008e, + 0x0204a051, 0x06780043, 0x070000f0, 0x037c00ff, + 0x06000010, 0x0781816a, 0x072d6000, 0x019485c0, + 0x050fb056, 0x044880e6, 0x04818010, 0x060ff0d0, + 0x0179feff, 0x0700ffff, 0x057dfeff, 0x0700ffff, + 0x078105be, 0x05a00212, 0x0349c0e4, 0x0781811d, + 0x070ff093, 0x050010ff, 0x070ff093, 0x045c0401, + 0x058180db, 0x02046092, 0x04002046, 0x04600202, + 0x00540401, 0x048280e6, 0x04500425, 0x070060ff, + 0x0730ffff, 0x0700000f, 0x0742000f, 0x05810190, + 0x07a005a6, 0x0648a002, 0x048180e9, 0x00047089, + 0x070ff047, 0x045c0443, 0x077800ff, 0x07f00000, + 0x0781818e, 0x07780047, 0x0500e000, 0x048185ad, + 0x070ff006, 0x01860117, 0x0179fe47, 0x0700000f, + 0x010480ff, 0x056c7048, 0x06818102, 0x007a0d4a, + 0x04003801, 0x0220f001, 0x0180010f, 0x07608e48, + 0x034a60ff, 0x0700f0ff, 0x074b88ff, 0x037000ff, + 0x07000600, 0x05500448, 0x074d00ff, 0x045a044a, + 0x0304a0ff, 0x070ff00f, 0x01540406, 0x05820117, + 0x04950120, 0x05a001bd, 0x02868123, 0x0134bfff, + 0x070fffff, 0x0104102e, 0x050fd041, 0x00800126, + 0x0595011d, 0x05a001bd, 0x0186011d, 0x0202f00e, + 0x052e4030, 0x040fd02f, 0x070fc0ff, 0x05a00218, + 0x02800010, 0x0400e02f, 0x042e4020, 0x0202f051, + 0x0004100e, 0x0004b00e, 0x050fd041, 0x024a6c46, + 0x04500423, 0x050070ff, 0x03620024, 0x050080ff, + 0x04004046, 0x0700500f, 0x03206000, 0x05601048, + 0x0700a0ff, 0x0700900a, 0x070ff005, 0x04500446, + 0x00540425, 0x04820157, 0x05601622, 0x050f80ff, + 0x063fa032, 0x06000002, 0x03203000, 0x01204000, + 0x03205000, 0x0120b000, 0x0320c000, 0x07601441, + 0x050f80ff, 0x043fa852, 0x06000001, 0x070ff056, + 0x056c02ff, 0x050fb0ff, 0x070560ff, 0x03079041, + 0x05600e41, 0x050f80ff, 0x073fa011, 0x0600003d, + 0x06780043, 0x07f00000, 0x065a007a, 0x010880ff, + 0x04a001b6, 0x058d0150, 0x0208a04a, 0x0108b04b, + 0x02386001, 0x03010000, 0x072e6300, 0x028000a8, + 0x0500d00a, 0x05500405, 0x014a68ff, 0x070090ff, + 0x0154040a, 0x0700c0ff, 0x0600a023, 0x0500b024, + 0x02206001, 0x05601622, 0x050f80ff, 0x063fa04a, + 0x06000002, 0x05601022, 0x050f80ff, 0x043fa819, + 0x06000001, 0x0600a00d, 0x0180013c, 0x06780043, + 0x070000f0, 0x050010ff, 0x027c0001, 0x07000030, + 0x078105b4, 0x027c0001, 0x06000020, 0x078105b4, + 0x038005cc, 0x054880ff, 0x06810010, 0x070ff056, + 0x050fb0ff, 0x044880e5, 0x0581017d, 0x044880e6, + 0x04818010, 0x00800183, 0x056c02ff, 0x050fb0ff, + 0x070560ff, 0x072e5300, 0x044880e6, 0x04818010, + 0x072d5003, 0x06780043, 0x07f00000, 0x010880ff, + 0x058d0187, 0x03386005, 0x03010000, 0x033e6000, + 0x0700000c, 0x052e5200, 0x02800010, 0x0120918e, + 0x018004e4, 0x01209190, 0x018004e4, 0x00209192, + 0x018004e4, 0x03209000, 0x018004e4, 0x01209196, + 0x018004e4, 0x00209198, 0x018004e4, 0x02493075, + 0x06810510, 0x0120919a, 0x018004e4, 0x06601e01, + 0x050f80ff, 0x063fa029, 0x06000008, 0x02015010, + 0x02016051, 0x00017051, 0x00011051, 0x05601a41, + 0x050f80ff, 0x053fa83a, 0x06000008, 0x05600e41, + 0x050f80ff, 0x01464000, 0x032fa00a, 0x07006011, + 0x05007012, 0x04008013, 0x07009014, 0x0600a015, + 0x0400b016, 0x0700c017, 0x07c00000, 0x072d5003, + 0x06601479, 0x050f80ff, 0x048d01b9, 0x063fa051, + 0x0600003e, 0x07c00000, 0x06005051, 0x0400e02c, + 0x0660060e, 0x050f80ff, 0x032fa009, 0x0379ff00, + 0x070000ff, 0x076c0000, 0x058101dd, 0x0660480e, + 0x0500e0ff, 0x034000ff, 0x01540427, 0x0582020a, + 0x03400005, 0x070ff005, 0x055c0428, 0x0481020e, + 0x01680e05, 0x056c0405, 0x068181bf, 0x040f8029, + 0x053fa809, 0x07000024, 0x06600649, 0x050f80ff, + 0x032fa009, 0x0379ff00, 0x070000ff, 0x076c0000, + 0x068181bf, 0x0400e049, 0x0340002d, 0x050f802b, + 0x053fa80a, 0x06000016, 0x0660480e, 0x0302c0ff, + 0x034000ff, 0x01540427, 0x0582020c, 0x072d6000, + 0x0460040e, 0x050f80ff, 0x0104e0d1, 0x0379ff4e, + 0x0700ffff, 0x062d6002, 0x032fa009, 0x0004d0d0, + 0x074b004d, 0x07780000, 0x07ffff00, 0x055a044d, + 0x070000ff, 0x00201008, 0x04002051, 0x06003051, + 0x05304000, 0x07000060, 0x03205009, 0x07006022, + 0x0460040e, 0x050f80ff, 0x032fa03a, 0x06603c0e, + 0x050f80ff, 0x073fa00a, 0x07000027, 0x050010d1, + 0x0460320e, 0x050f80ff, 0x012fa80a, 0x060ff00e, + 0x055c042e, 0x04810210, 0x07c00000, 0x0400e026, + 0x008001cb, 0x0202c026, 0x008001e6, 0x0500e02e, + 0x008001e6, 0x0400e051, 0x01800209, 0x0349c0e4, + 0x04810215, 0x07c00000, 0x013e4000, 0x070c0000, + 0x07c00000, 0x013e4000, 0x03080000, 0x07c00000, + 0x009702f4, 0x022a5002, 0x0790821d, 0x00910291, + 0x030400a6, 0x0678aae5, 0x06000001, 0x00a1860e, + 0x06600c40, 0x050f80ff, 0x032fa021, 0x074b0000, + 0x076c0600, 0x07818293, 0x05600403, 0x050f80ff, + 0x073fa009, 0x06000002, 0x0279ff04, 0x0700ffff, + 0x010440d7, 0x0179fe44, 0x0700ffff, 0x045c0404, + 0x07818295, 0x0349f044, 0x0681829e, 0x02495001, + 0x06818297, 0x060ff079, 0x045c0440, 0x0781823c, + 0x0644f07a, 0x002fb008, 0x060ff079, 0x045c0440, + 0x07818241, 0x0644f07a, 0x002fb008, 0x0648f001, + 0x07818288, 0x04600e40, 0x050f80ff, 0x06480001, + 0x04810257, 0x0448e001, 0x04810273, 0x02460001, + 0x0644f001, 0x012fa80a, 0x04008040, 0x05a004ee, + 0x0286828c, 0x05a004d8, 0x062da001, 0x013e4000, + 0x06000080, 0x06930013, 0x02920013, 0x02800010, + 0x0644f001, 0x012fa80a, 0x020ef002, 0x00860275, + 0x04600840, 0x050f80ff, 0x053fa809, 0x06000002, + 0x05780105, 0x00800440, 0x017c0105, 0x05000400, + 0x06818275, 0x06601e02, 0x050f80ff, 0x053fa809, + 0x06000002, 0x04602a40, 0x050f80ff, 0x070ff005, + 0x053fa809, 0x06000002, 0x055c0405, 0x06818275, + 0x04008040, 0x0045e008, 0x05a004d8, 0x00800251, + 0x0644f001, 0x012fa80a, 0x050020d8, 0x04600440, + 0x050f80ff, 0x073fa00a, 0x06000001, 0x06480001, + 0x07818281, 0x05308000, 0x03040000, 0x06009040, + 0x04a004dc, 0x00800251, 0x06a0060e, 0x054b0800, + 0x056a0700, 0x06600c40, 0x050f80ff, 0x032fa00a, + 0x00800251, 0x013e4000, 0x06000080, 0x01209288, + 0x018004e4, 0x06009008, 0x05308000, 0x05004000, + 0x04a004dc, 0x00800251, 0x02209002, 0x008002e5, + 0x03209000, 0x008002e5, 0x02209004, 0x008002e5, + 0x04a002fd, 0x062da001, 0x05308000, 0x05002000, + 0x06009040, 0x04a004dc, 0x02800013, 0x013e4000, + 0x06000080, 0x02495001, 0x078182db, 0x04600840, + 0x050f80ff, 0x053fa809, 0x06000001, 0x0721f000, + 0x0349f003, 0x058102aa, 0x0245f01f, 0x06000002, + 0x018602db, 0x07601400, 0x050f80ff, 0x012fa809, + 0x06480001, 0x058102db, 0x06602440, 0x050f80ff, + 0x012fa809, 0x020ef001, 0x038682db, 0x019b02db, + 0x050020d8, 0x062da001, 0x06303002, 0x05000430, + 0x04600440, 0x050f80ff, 0x073fa012, 0x06000001, + 0x028f82bf, 0x050040d8, 0x062da001, 0x07601e00, + 0x050f80ff, 0x073fa009, 0x06000001, 0x060ff004, + 0x00540402, 0x048202d9, 0x06005051, 0x06006051, + 0x06602240, 0x050f80ff, 0x063fa01a, 0x06000002, + 0x06600a40, 0x050f80ff, 0x073fa00a, 0x07000003, + 0x060ff040, 0x045a041f, 0x010eb0ff, 0x06930013, + 0x02920013, 0x02800010, 0x04004002, 0x018002c9, + 0x04a002fd, 0x062da001, 0x05308000, 0x07005000, + 0x06009040, 0x04a004dc, 0x050080d8, 0x05a004e1, + 0x062da001, 0x02800013, 0x050fd009, 0x050fd041, + 0x013e4000, 0x06000080, 0x05308000, 0x03013000, + 0x04a004dc, 0x010440d7, 0x0349f044, 0x048102f2, + 0x062da001, 0x008f02f2, 0x03e00000, 0x062da001, + 0x02800013, 0x0249c0e5, 0x06810013, 0x062da001, + 0x07f00000, 0x07f00000, 0x033e5000, 0x070c0000, + 0x018f02f6, 0x03800011, 0x050020d8, 0x04600440, + 0x050f80ff, 0x073fa00a, 0x06000001, 0x07c00000, + 0x002fb001, 0x03800306, 0x012fb000, 0x03075087, + 0x068d0307, 0x03386000, 0x03020000, 0x04482075, + 0x06810352, 0x0648a0e6, 0x07810347, 0x0642007f, + 0x06810345, 0x0340007e, 0x060ff038, 0x0154047e, + 0x02d00334, 0x0560027d, 0x050f80ff, 0x032fa009, + 0x030ef000, 0x02860504, 0x0107d000, 0x05600800, + 0x050f80ff, 0x032fa009, 0x03681e00, 0x04500420, + 0x050f80ff, 0x073fa009, 0x0700003f, 0x03800311, + 0x070ff07d, 0x0450047c, 0x050f80ff, 0x002fa819, + 0x078d0327, 0x02080001, 0x00081002, 0x0448807a, + 0x0781032e, 0x0379ff03, 0x070000ff, 0x01082003, + 0x068d032f, 0x02386004, 0x03010000, 0x072e6c00, + 0x02800352, 0x0380033a, 0x0380033c, 0x0280033e, + 0x02800340, 0x03800342, 0x03800344, 0x0727c005, + 0x02800323, 0x0627c008, 0x02800323, 0x0627c00b, + 0x02800323, 0x0627c00e, 0x02800323, 0x0727c011, + 0x02800323, 0x03800314, 0x052e6800, 0x02800352, + 0x044880e6, 0x07810533, 0x052e6200, 0x070ff088, + 0x0179feff, 0x070fffff, 0x04818501, 0x060ff083, + 0x0086836d, 0x033e6000, 0x07000003, 0x068d0352, + 0x07286000, 0x07f00000, 0x078d0355, 0x038c0306, + 0x0648c0e6, 0x05818372, 0x0448e0e6, 0x0781036a, + 0x004920e6, 0x07810365, 0x07a0056f, 0x05001088, + 0x00700101, 0x03100000, 0x00088001, 0x033e6000, + 0x07000088, 0x03800560, 0x02386001, 0x07030000, + 0x033e6000, 0x06000008, 0x028003f1, 0x02799075, + 0x0500040f, 0x06810010, 0x06601479, 0x050080ff, + 0x06309052, 0x0600003e, 0x02800376, 0x06602279, + 0x050080ff, 0x05309812, 0x07000041, 0x0648007a, + 0x0781037e, 0x04488075, 0x0581837e, 0x040f8008, + 0x070fa009, 0x0049107a, 0x01a183f3, 0x00798075, + 0x06000507, 0x05818521, 0x0448b075, 0x06810385, + 0x02493075, 0x0681050e, 0x0249c0e6, 0x048183e0, + 0x0648c0e6, 0x0581839a, 0x068d0389, 0x02386001, + 0x07030000, 0x0049107a, 0x07810390, 0x020ef083, + 0x0386039a, 0x06483075, 0x068103ef, 0x0678007a, + 0x07000035, 0x03a184cf, 0x05308000, 0x07060000, + 0x06009079, 0x04a004dc, 0x028003ef, 0x0448807a, + 0x0681039e, 0x06483075, 0x058104f9, 0x0448d07a, + 0x068103a2, 0x06483075, 0x058104f9, 0x068d03a2, + 0x02386001, 0x07030000, 0x0444e07a, 0x0648307a, + 0x048183c7, 0x0448707a, 0x068103ea, 0x0648f07a, + 0x078103b2, 0x05a004cf, 0x04008079, 0x05a004ee, + 0x008683c2, 0x05a004d8, 0x028003ef, 0x0560107b, + 0x050f80ff, 0x032fa009, 0x0349c000, 0x058183c0, + 0x04600e79, 0x050f80ff, 0x073fa00a, 0x0600003d, + 0x06600a79, 0x050f80ff, 0x053fa80a, 0x06000010, + 0x028003ef, 0x0046e07a, 0x028003ea, 0x06009008, + 0x05308000, 0x05004000, 0x04a004dc, 0x028003ef, + 0x0560167b, 0x050f80ff, 0x032fa011, 0x070ff000, + 0x04500401, 0x030460ff, 0x060ff025, 0x00540446, + 0x078203d1, 0x030460ff, 0x04092046, 0x05a00218, + 0x06600679, 0x050f80ff, 0x00201007, 0x012fa80a, + 0x0046047a, 0x034630ff, 0x050020ff, 0x06003051, + 0x04600e79, 0x050f80ff, 0x073fa012, 0x06000001, + 0x028003ef, 0x033e6a00, 0x0202000e, 0x02079051, + 0x07000088, 0x078d03e4, 0x0744c000, 0x01088000, + 0x03386006, 0x03010000, 0x02800010, 0x05a004cf, + 0x05308000, 0x03020000, 0x06009079, 0x04a004dc, + 0x033e6a00, 0x0302000a, 0x02079051, 0x02800010, + 0x04603e79, 0x050f80ff, 0x032fa009, 0x070ff000, + 0x0186040c, 0x057dfeff, 0x07ffffff, 0x0581040c, + 0x050f8000, 0x012fa811, 0x0079fe02, 0x070000ff, + 0x077d66ff, 0x060000dc, 0x0781840c, 0x060ff001, + 0x0286840d, 0x064b0002, 0x06420002, 0x060ff002, + 0x05500400, 0x050f80ff, 0x05004084, 0x073fa00a, + 0x06000002, 0x07c00000, 0x04600201, 0x050f80ff, + 0x073fa009, 0x06000001, 0x0079fe02, 0x070000ff, + 0x077d72ff, 0x070000dd, 0x0781840c, 0x064b0002, + 0x06420002, 0x06000001, 0x01800406, 0x0605004c, + 0x0180041e, 0x0493041a, 0x04a004d5, 0x054bc450, + 0x05810421, 0x01d00422, 0x01800421, 0x00800432, + 0x00800434, 0x00800432, 0x008004a7, 0x0180043f, + 0x00800434, 0x01800471, 0x00800432, 0x00800432, + 0x008004ab, 0x00800432, 0x018004af, 0x008004c4, + 0x01800488, 0x00800432, 0x00800432, 0x00209432, + 0x018004e4, 0x0379ff50, 0x070fffff, 0x060ff079, + 0x055c0450, 0x048104a4, 0x002fb008, 0x060ff079, + 0x055c0450, 0x058104a3, 0x04a004c7, 0x0180049c, + 0x0179fe50, 0x070fffff, 0x070050ff, 0x060ff079, + 0x055c0405, 0x04810449, 0x002fb008, 0x060ff079, + 0x055c0405, 0x078184a0, 0x070ff087, 0x017980ff, + 0x06000507, 0x06818451, 0x02203040, 0x05002087, + 0x0049d002, 0x0481046b, 0x04930458, 0x01257000, + 0x073c3fff, 0x0700000f, 0x052e4003, 0x072e5030, + 0x0304c050, 0x02400057, 0x06740057, 0x06000002, + 0x06820016, 0x04002083, 0x07003084, 0x04004085, + 0x06602279, 0x050f80ff, 0x063fa01a, 0x06000001, + 0x05a004cf, 0x07a00578, 0x033e6a00, 0x0302000a, + 0x062e5020, 0x003e4002, 0x07000a00, 0x028003f1, + 0x07420003, 0x0781844e, 0x00798002, 0x06000507, + 0x06818451, 0x0180045c, 0x05930478, 0x01257000, + 0x073c3fff, 0x0700000f, 0x052e4003, 0x072e5030, + 0x0304c050, 0x067800e6, 0x07000041, 0x0581047d, + 0x07a00581, 0x04818016, 0x002fb008, 0x067800e6, + 0x07000041, 0x04810483, 0x07a00581, 0x04818016, + 0x062e5020, 0x003e4002, 0x07000a00, 0x03e00000, + 0x02800010, 0x0379ff50, 0x070fffff, 0x060ff079, + 0x055c0450, 0x0781848e, 0x0245507a, 0x002fb008, + 0x060ff079, 0x055c0450, 0x07818493, 0x0245507a, + 0x002fb008, 0x05600e50, 0x050f80ff, 0x012fa809, + 0x02455001, 0x05600e50, 0x050f80ff, 0x012fa80a, + 0x0080049d, 0x002fb008, 0x003e4002, 0x07000a00, + 0x02800016, 0x079384a3, 0x062e5020, 0x042e4002, + 0x002fb008, 0x013e4000, 0x05000e00, 0x02800016, + 0x0179fe50, 0x070fffff, 0x010210ff, 0x02800016, + 0x0179fe50, 0x070fffff, 0x050340ff, 0x0080049d, + 0x0179fe50, 0x070fffff, 0x0102e0ff, 0x0760282e, + 0x050f80ff, 0x05222000, 0x07223000, 0x05224000, + 0x07225000, 0x07226000, 0x05227000, 0x05228000, + 0x07229000, 0x0722a000, 0x0522b000, 0x063fa051, + 0x07000011, 0x0202c026, 0x0522d000, 0x052e400c, + 0x02800016, 0x030430d4, 0x062e5008, 0x00800176, + 0x05600e50, 0x050f80ff, 0x032fa009, 0x03460000, + 0x018004d2, 0x0246007a, 0x0045207a, 0x008004d0, + 0x0246007a, 0x0600007a, 0x04600e79, 0x050f80ff, + 0x032fa00a, 0x07c00000, 0x029284d5, 0x070500e1, + 0x07c00000, 0x0245f008, 0x048404d9, 0x020e0008, + 0x07c00000, 0x070ff009, 0x065a0008, 0x058404de, + 0x020e0008, 0x07c00000, 0x058404e1, 0x020e0008, + 0x07c00000, 0x05308000, 0x0500d000, 0x04a004dc, + 0x04a004e9, 0x02800010, 0x052e4300, 0x072e500c, + 0x073c3fff, 0x0700000f, 0x07c00000, 0x06602208, + 0x050f80ff, 0x032fa011, 0x076a0000, 0x068184f7, + 0x066a0001, 0x048104f7, 0x04002051, 0x07c00000, + 0x00202001, 0x07c00000, 0x0648307a, 0x00a18608, + 0x05a004cc, 0x05308000, 0x05001000, 0x06009079, + 0x04a004dc, 0x03800560, 0x0249c0e6, 0x058104f9, + 0x0280036d, 0x0648307a, 0x07818196, 0x05a004cf, + 0x05308000, 0x03013000, 0x03209006, 0x04a004dc, + 0x033e6000, 0x07030000, 0x02800345, 0x02490075, + 0x0781051e, 0x04002089, 0x04780102, 0x07f00000, + 0x05001088, 0x07a0056f, 0x04740101, 0x03100000, + 0x060ff002, 0x045c0401, 0x0481851f, 0x00088001, + 0x033e6000, 0x070000c0, 0x0380055c, 0x07f00000, + 0x0220951f, 0x018004e4, 0x0648307a, 0x07810527, + 0x06780075, 0x06000007, 0x0581852e, 0x06a00608, + 0x06486075, 0x06818194, 0x02490075, 0x0781819a, + 0x04487075, 0x05818536, 0x0280053d, 0x05308000, + 0x03010000, 0x06009079, 0x04a004dc, 0x02800010, + 0x0448e0e6, 0x04818352, 0x00800192, 0x05308000, + 0x0500e000, 0x06009079, 0x04a004dc, 0x04008089, + 0x05a004e1, 0x0380055c, 0x05a004cc, 0x05308000, + 0x0700f000, 0x06009079, 0x07000088, 0x06a00545, + 0x04a004dc, 0x02800010, 0x03386000, 0x07030000, + 0x07f00000, 0x078d0548, 0x033e6a00, 0x0202000e, + 0x02079051, 0x0448b075, 0x07810553, 0x02493075, + 0x07810553, 0x05301005, 0x03010000, 0x03800555, + 0x05301006, 0x03010000, 0x05002087, 0x06485002, + 0x05818555, 0x0744c000, 0x01088000, 0x02086001, + 0x07c00000, 0x05001088, 0x07a0056f, 0x0644c001, + 0x00088001, 0x033e6a00, 0x0202000e, 0x004920e6, + 0x05818565, 0x02079051, 0x078d0565, 0x060ff089, + 0x034990ff, 0x0781056c, 0x03386005, 0x03010000, + 0x02800010, 0x03386006, 0x03010000, 0x02800010, + 0x078d056f, 0x03386000, 0x07030000, 0x07f00000, + 0x068d0573, 0x070ff087, 0x074850ff, 0x05818574, + 0x07c00000, 0x078d0578, 0x02386001, 0x07030000, + 0x07f00000, 0x068d057c, 0x070ff087, 0x074850ff, + 0x0581857d, 0x07c00000, 0x05002087, 0x0049d002, + 0x05818590, 0x002fb008, 0x067800e6, 0x07000041, + 0x002fb008, 0x05818590, 0x07a005a6, 0x0448e002, + 0x07810593, 0x0648a002, 0x0481859d, 0x06486002, + 0x06810597, 0x02400057, 0x056a02ff, 0x07c00000, + 0x07a005a6, 0x06788102, 0x06000004, 0x05818590, + 0x04002089, 0x070ff0d4, 0x045c0402, 0x077800ff, + 0x07f00000, 0x05818590, 0x00202010, 0x038c0590, + 0x07f00000, 0x06420002, 0x0481859e, 0x07a00578, + 0x033e6a00, 0x0302000a, 0x07c00000, 0x07f00000, + 0x060ff0a2, 0x050020ff, 0x060ff0a2, 0x045c0402, + 0x048185a7, 0x07c00000, 0x05a00218, 0x03495047, + 0x078105b2, 0x0320901d, 0x02800604, 0x0220901f, + 0x02800604, 0x014980e4, 0x04818010, 0x013e4000, + 0x07003000, 0x05600e35, 0x050f80ff, 0x07a006fc, + 0x01208003, 0x05a004e1, 0x038005cc, 0x03209009, + 0x02800604, 0x03209011, 0x02800604, 0x02209007, + 0x02800604, 0x03209003, 0x02800604, 0x00498043, + 0x058185be, 0x00497043, 0x048185c2, 0x02209001, + 0x02800604, 0x0220900d, 0x02800604, 0x0320900f, + 0x02800604, 0x03493000, 0x068105d5, 0x027c0045, + 0x070a0000, 0x078105de, 0x0220900b, 0x02800604, + 0x02209013, 0x05308000, 0x01012000, 0x04a004dc, + 0x00800183, 0x03209005, 0x02800604, 0x072e500c, + 0x00208002, 0x05a004e1, 0x02800010, 0x02209015, + 0x02800604, 0x072d6000, 0x05308000, 0x05007000, + 0x07f00000, 0x070090d1, 0x0379ff09, 0x0700ffff, + 0x04a004dc, 0x03209017, 0x02800604, 0x033e5000, + 0x06000080, 0x02209019, 0x02800604, 0x072d6000, + 0x033e5000, 0x06000080, 0x07f00000, 0x060ff0d0, + 0x0179feff, 0x0700ffff, 0x057dfeff, 0x0700ffff, + 0x04818010, 0x02400058, 0x00642058, 0x06820010, + 0x033e5000, 0x06000080, 0x04058051, 0x0320901b, + 0x02800604, 0x05308000, 0x01012000, 0x04a004dc, + 0x00800176, 0x05a00218, 0x05308000, 0x05008000, + 0x06009079, 0x04a004dc, 0x07c00000, 0x034900e4, + 0x05818618, 0x013e4000, 0x070000c0, 0x07f00000, + 0x034900e4, 0x04818616, 0x07c00000, 0x013e4000, + 0x06000080, 0x07f00000, 0x07f00000, 0x07f00000, + 0x034900e4, 0x06810610, 0x03800618, 0x072d6000, + 0x00498043, 0x06810632, 0x060ff0d0, 0x0179feff, + 0x0700ffff, 0x057dfeff, 0x0700ffff, 0x058185e2, + 0x050f8030, 0x032fa009, 0x0379ff00, 0x0700ffff, + 0x070ff0d1, 0x0179feff, 0x0700ffff, 0x055c0400, + 0x078105e2, 0x04004051, 0x0280067a, 0x06a006dc, + 0x062d6001, 0x020ef004, 0x038605e4, 0x06600004, + 0x050f80ff, 0x032fa009, 0x074b0000, 0x05002000, + 0x0769ff00, 0x01640800, 0x078205e4, 0x01640e00, + 0x058285e4, 0x070ff036, 0x045c0404, 0x0581864d, + 0x072d6000, 0x050f8030, 0x032fa009, 0x0379ff00, + 0x0700ffff, 0x070ff0d1, 0x0179feff, 0x0700ffff, + 0x055c0400, 0x078105e2, 0x04482034, 0x078105ff, + 0x06483034, 0x058185ff, 0x070ff0d4, 0x077800ff, + 0x070000f0, 0x037c00ff, 0x06000010, 0x0681067a, + 0x06a006d6, 0x024900e5, 0x0681065d, 0x033e5000, + 0x06000080, 0x02800010, 0x04601c04, 0x050f80ff, + 0x053fa809, 0x06000020, 0x030ef041, 0x038605ee, + 0x062d6002, 0x05602a41, 0x050f80ff, 0x012fa809, + 0x060ff0d0, 0x074b00ff, 0x045c0401, 0x05818678, + 0x062d6001, 0x07602841, 0x050f80ff, 0x053fa809, + 0x06000001, 0x070ff0d1, 0x054b80ff, 0x074b0003, + 0x055c0403, 0x05818678, 0x033e5000, 0x06000080, + 0x0080070e, 0x07600041, 0x0280065e, 0x06a006d6, + 0x024900e5, 0x06810680, 0x033e5000, 0x06000080, + 0x02800010, 0x06a006c2, 0x030ef041, 0x028605f2, + 0x04058051, 0x072d6000, 0x05601041, 0x050f80ff, + 0x012fa809, 0x0600a0d0, 0x0500b0d1, 0x062d6001, + 0x07f00000, 0x07f00000, 0x0600c0d0, 0x0500d0d1, + 0x062d6002, 0x0279ff0d, 0x07ff0000, 0x044d800d, + 0x060ff0d0, 0x074b00ff, 0x065a000d, 0x06601201, + 0x050f80ff, 0x073fa022, 0x07000005, 0x0079fe0d, + 0x070000ff, 0x050020ff, 0x05602a41, 0x050f80ff, + 0x073fa00a, 0x06000001, 0x020ef004, 0x028606bf, + 0x04601c04, 0x050f80ff, 0x053fa809, 0x06000001, + 0x050f80ff, 0x053fa80a, 0x06000020, 0x07602841, + 0x050f80ff, 0x073fa009, 0x06000001, 0x0279ff02, + 0x070000ff, 0x0678000d, 0x0700ff00, 0x065a0002, + 0x07602841, 0x050f80ff, 0x073fa00a, 0x06000001, + 0x07600041, 0x050f80ff, 0x053fa80a, 0x06000001, + 0x07601241, 0x050f80ff, 0x073fa00a, 0x06000002, + 0x033e5000, 0x06000080, 0x0080070e, 0x040f8032, + 0x073fa011, 0x06000001, 0x060ff002, 0x055c0403, + 0x058186ca, 0x00041051, 0x07c00000, 0x04600402, + 0x04500432, 0x050f80ff, 0x053fa809, 0x06000020, + 0x00400402, 0x01680eff, 0x070030ff, 0x040f8032, + 0x053fa80a, 0x06000001, 0x07c00000, 0x024900e5, + 0x068106d9, 0x07c00000, 0x033e5000, 0x070000c0, + 0x07c00000, 0x05004036, 0x060000d0, 0x0179fe00, + 0x0700ffff, 0x057dfeff, 0x0700ffff, 0x068106fb, + 0x070000d1, 0x0379ff00, 0x0700ffff, 0x06005051, + 0x060ff031, 0x05500405, 0x050f80ff, 0x073fa009, + 0x06000002, 0x020ef004, 0x038606f5, 0x04600404, + 0x050f80ff, 0x012fa809, 0x0079fe01, 0x0700ffff, + 0x055c0400, 0x068106fb, 0x01400405, 0x070050ff, + 0x057de0ff, 0x06000007, 0x058186e7, 0x04004051, + 0x07c00000, 0x072d6000, 0x07f00000, 0x07f00000, + 0x000110d0, 0x010120d1, 0x062d6001, 0x07f00000, + 0x07f00000, 0x020130d0, 0x010140d1, 0x062d6002, + 0x010170d4, 0x07f00000, 0x020150d0, 0x030160d1, + 0x053fa83a, 0x06000008, 0x07c00000, 0x07600c41, + 0x050f80ff, 0x073fa009, 0x06000001, 0x04780102, + 0x07ffff00, 0x046a0702, 0x050f80ff, 0x073fa00a, + 0x06000001, 0x05600e41, 0x050f80ff, 0x032fa069, + 0x03800053, 0xba6b4e34, 0x02800004, 0x00000000, + 0x00008000, 0x00000518, 0x040f801f, 0x012fa8c9, + 0x040f801f, 0x073fa081, 0x06000010, 0x03200005, + 0x07420000, 0x050fb000, 0x040f801f, 0x073fa011, + 0x06000038, 0x040f801f, 0x053fa859, 0x0700003a, + 0x050fe000, 0x0581800a, 0x0684003d, 0x04958019, + 0x030e0011, 0x072e4200, 0x03800014, 0x0291001f, + 0x050010c0, 0x04482001, 0x058180e8, 0x06483001, + 0x0781814b, 0x02920029, 0x068b0029, 0x018a0150, + 0x050010c0, 0x06780001, 0x050007c0, 0x06818223, + 0x06780001, 0x0500f800, 0x07818263, 0x03910030, + 0x040fe029, 0x03860030, 0x076c001d, 0x04810294, + 0x076c0a1d, 0x048102b9, 0x0292003d, 0x040fe02f, + 0x0286003d, 0x06000013, 0x050fb000, 0x066c0073, + 0x068103c2, 0x0297003d, 0x014920e4, 0x0481803d, + 0x03400000, 0x076c0a00, 0x04818034, 0x0796003f, + 0x03b900b8, 0x05908014, 0x010170e1, 0x07780017, + 0x03e00000, 0x06810092, 0x050010ff, 0x0179fe17, + 0x031fffff, 0x070000ff, 0x05600800, 0x050f80ff, + 0x073fa009, 0x06000001, 0x06780002, 0x02800040, + 0x037c00ff, 0x03800000, 0x0681005e, 0x0249f002, + 0x068100ab, 0x0448e002, 0x0681005e, 0x07600c00, + 0x050f80ff, 0x073fa009, 0x06000001, 0x06780002, + 0x07ffff00, 0x037c00ff, 0x05000200, 0x048180ab, + 0x064bd401, 0x03d00060, 0x038000a9, 0x02800068, + 0x03800072, 0x0280007c, 0x02800086, 0x03800090, + 0x038000a9, 0x038000a9, 0x050fe027, 0x0186806c, + 0x01028000, 0x0380006f, 0x07600027, 0x050f80ff, + 0x032fa00a, 0x01027000, 0x02400029, 0x028000ab, + 0x040fe025, 0x00868076, 0x03026000, 0x02800079, + 0x06600025, 0x050f80ff, 0x032fa00a, 0x03025000, + 0x02400029, 0x028000ab, 0x050fe021, 0x00868080, + 0x01022000, 0x02800083, 0x07600021, 0x050f80ff, + 0x032fa00a, 0x01021000, 0x02400029, 0x028000ab, + 0x040fe023, 0x0086808a, 0x01024000, 0x0380008d, + 0x06600023, 0x050f80ff, 0x032fa00a, 0x03023000, + 0x02400029, 0x028000ab, 0x06a000c8, 0x028000ab, + 0x01640817, 0x058280a9, 0x070ff017, 0x03d00096, + 0x0280009e, 0x038000a0, 0x038000a3, 0x038000a6, + 0x038000a9, 0x038000a9, 0x038000a9, 0x038000a9, + 0x03e00000, 0x03800014, 0x059080a0, 0x030160e1, + 0x028000ab, 0x059080a3, 0x030150e1, 0x028000ab, + 0x059080a6, 0x010140e1, 0x028000ab, 0x060fc013, + 0x06a00510, 0x03800014, 0x072e4800, 0x07000012, + 0x038000bb, 0x0747f000, 0x05600800, 0x050f80ff, + 0x012fa809, 0x0249f001, 0x078100bb, 0x01012000, + 0x052e4c00, 0x07c00000, 0x070000eb, 0x0349f000, + 0x058180af, 0x05600800, 0x050f80ff, 0x012fa809, + 0x0448e001, 0x068100c1, 0x07c00000, 0x0079c101, + 0x07ffffff, 0x027a4b01, 0x03800000, 0x05600800, + 0x050f80ff, 0x012fa80a, 0x07600c00, 0x050f80ff, + 0x012fa821, 0x06780001, 0x07ffff00, 0x037c00ff, + 0x05000700, 0x078100dd, 0x06601804, 0x070030ff, + 0x050f80ff, 0x012fa809, 0x05002000, 0x050f8003, + 0x073fa00a, 0x06000001, 0x040fe001, 0x038600de, + 0x04600201, 0x050f80ff, 0x032fa00a, 0x07c00000, + 0x050fe02e, 0x008680e3, 0x0102e000, 0x0302f000, + 0x038000e7, 0x0760002e, 0x050f80ff, 0x032fa00a, + 0x0102e000, 0x07c00000, 0x022c0004, 0x056c041d, + 0x078100fc, 0x056c021d, 0x04810113, 0x056c081d, + 0x04810125, 0x076c061d, 0x0581013f, 0x0521d000, + 0x0202c013, 0x0202a013, 0x02020013, 0x0460021a, + 0x050f80ff, 0x053fa80a, 0x07000009, 0x03b600ac, + 0x0484801f, 0x0280003d, 0x040fe02a, 0x028600f2, + 0x06000013, 0x04001013, 0x0560102b, 0x050f80ff, + 0x032fa012, 0x06420029, 0x0660002a, 0x050f80ff, + 0x053fa809, 0x06000001, 0x050fe003, 0x00860110, + 0x01028003, 0x0660002a, 0x050f80ff, 0x053fa80a, + 0x07000009, 0x00800140, 0x00028013, 0x00027013, + 0x00800140, 0x040fe02a, 0x028600f1, 0x06420029, + 0x0660002a, 0x050f80ff, 0x053fa809, 0x06000001, + 0x050fe003, 0x01860122, 0x03026003, 0x0660002a, + 0x050f80ff, 0x053fa80a, 0x07000009, 0x00800140, + 0x02026013, 0x02025013, 0x00800140, 0x040fe02a, + 0x028600f1, 0x06420029, 0x0660002a, 0x050f80ff, + 0x053fa809, 0x06000001, 0x050fe003, 0x00860134, + 0x01022003, 0x0660002a, 0x050f80ff, 0x053fa80a, + 0x07000009, 0x01800136, 0x00022013, 0x00021013, + 0x0647f020, 0x007a0120, 0x04000101, 0x04a00285, + 0x0400802a, 0x05a004f5, 0x009480f1, 0x0521d005, + 0x028000f2, 0x038000fa, 0x0647f020, 0x06486020, + 0x06818145, 0x04a00285, 0x028000f1, 0x007a0120, + 0x04000101, 0x04a00285, 0x0400802a, 0x05a004f5, + 0x028000f1, 0x040fd02a, 0x052e4003, 0x00208010, + 0x05a004f5, 0x038000fa, 0x00018098, 0x07480018, + 0x06818161, 0x05481018, 0x0781815f, 0x05482018, + 0x0681815d, 0x07483018, 0x0681815b, 0x002fb004, + 0x00800162, 0x012fb003, 0x00800162, 0x002fb002, + 0x00800162, 0x002fb001, 0x00800162, 0x012fb000, + 0x0179fe78, 0x070000ff, 0x030190ff, 0x00017086, + 0x058b0166, 0x03385000, 0x03020000, 0x07780017, + 0x00430407, 0x078181ee, 0x046c0419, 0x048101a2, + 0x046c0219, 0x05810172, 0x07219000, 0x00800186, + 0x07219000, 0x07483017, 0x0481018c, 0x05482017, + 0x05810193, 0x0448b075, 0x06818186, 0x06601476, + 0x050f80ff, 0x073fa022, 0x0600003e, 0x06000080, + 0x05001081, 0x05002082, 0x06003083, 0x05004084, + 0x04601c76, 0x050f80ff, 0x022fa02a, 0x07219000, + 0x07780078, 0x07ffff00, 0x045a0419, 0x010780ff, + 0x0484801f, 0x0280003d, 0x040fe07f, 0x0086019b, + 0x05a001bb, 0x00920186, 0x040fe07f, 0x07a681bb, + 0x00800186, 0x0560107b, 0x050f80ff, 0x032fa009, + 0x0744f000, 0x0560107b, 0x050f80ff, 0x032fa00a, + 0x00800179, 0x052e400c, 0x040080fb, 0x046aa108, + 0x06009076, 0x04002075, 0x05a004fc, 0x00800186, + 0x06219001, 0x05482017, 0x058101af, 0x058b01a5, + 0x060ff086, 0x0349f0ff, 0x07818165, 0x07483017, + 0x058101ac, 0x050fd0ff, 0x040fe07f, 0x07a681bb, + 0x00800186, 0x05004084, 0x05a00205, 0x00920186, + 0x070ff07d, 0x0450047c, 0x056004ff, 0x050f80ff, + 0x032fa009, 0x070ff000, 0x00540479, 0x030790ff, + 0x01800193, 0x060ff079, 0x0054047a, 0x058201e7, + 0x058101e7, 0x070ff07d, 0x0450047c, 0x050f80ff, + 0x002fa819, 0x058b01c3, 0x02080001, 0x00081002, + 0x01082003, 0x048b01c7, 0x03385000, 0x03010000, + 0x02400019, 0x070ff003, 0x04500479, 0x030790ff, + 0x0340007e, 0x0642007f, 0x058101e7, 0x070ff07e, + 0x050f80ff, 0x032fa009, 0x050fe000, 0x028681e6, + 0x070ff07d, 0x056002ff, 0x050f80ff, 0x032fa009, + 0x0107d000, 0x018601e8, 0x0560087d, 0x050f80ff, + 0x032fa009, 0x0569fe00, 0x0550041b, 0x050f80ff, + 0x032fa009, 0x0107e000, 0x070ff07e, 0x018001d2, + 0x0307c000, 0x07c00000, 0x052e400c, 0x040080fb, + 0x046aa108, 0x06009076, 0x04002075, 0x018004fc, + 0x040fd076, 0x050fd017, 0x060ff086, 0x077800ff, + 0x07000060, 0x037c00ff, 0x07000060, 0x078181f0, + 0x07780078, 0x07ffff00, 0x045a0419, 0x010780ff, + 0x06601476, 0x050f80ff, 0x073fa022, 0x0600003e, + 0x052e400c, 0x040080fb, 0x066a8108, 0x06009076, + 0x04002075, 0x05a004fc, 0x02800029, 0x0240007f, + 0x0742007e, 0x050f807e, 0x032fa009, 0x050fe000, + 0x0286821f, 0x070ff07d, 0x055c047b, 0x05810214, + 0x0760007d, 0x050f80ff, 0x032fa009, 0x050fe000, + 0x03868214, 0x070ff07b, 0x0107d0ff, 0x0560087d, + 0x050f80ff, 0x032fa009, 0x03681e00, 0x0450041c, + 0x0107e0ff, 0x050f80ff, 0x032fa009, 0x050fe000, + 0x01860221, 0x0307c000, 0x07c00000, 0x040fd076, + 0x02800510, 0x010180c0, 0x0548e018, 0x0781823c, + 0x0748f018, 0x06818238, 0x03490018, 0x06818234, + 0x01491018, 0x07818230, 0x073c0000, 0x06000040, + 0x02200004, 0x0180023f, 0x073c0000, 0x06000020, + 0x03200003, 0x0180023f, 0x073c0000, 0x06000010, + 0x02200002, 0x0180023f, 0x073c0000, 0x06000008, + 0x02200001, 0x0180023f, 0x073c0000, 0x06000004, + 0x06000013, 0x050fb000, 0x040fe076, 0x00860258, + 0x046c0273, 0x04810268, 0x066c0073, 0x04810249, + 0x040fd076, 0x06a00510, 0x03800014, 0x040fd076, + 0x0080024c, 0x00452075, 0x00077013, 0x0647f075, + 0x06486075, 0x06818252, 0x05a0028b, 0x00800258, + 0x007a0175, 0x04000101, 0x05a0028b, 0x04008076, + 0x0245f008, 0x05a004f5, 0x07273000, 0x05600272, + 0x050f80ff, 0x053fa80a, 0x07000009, 0x0379ff78, + 0x070000ff, 0x02076013, 0x02075013, 0x0484801f, + 0x0280003d, 0x070fc0ff, 0x052e400c, 0x00208020, + 0x05a004f5, 0x00800261, 0x04600276, 0x050010ff, + 0x040f8001, 0x032fa009, 0x040f8001, 0x053fa80a, + 0x07000009, 0x070ff000, 0x0286827a, 0x06601276, + 0x050f80ff, 0x073fa009, 0x0700000c, 0x07601818, + 0x050f80ff, 0x053fa80a, 0x07000009, 0x0180027b, + 0x07a000de, 0x0448b075, 0x0581024b, 0x06000013, + 0x04001013, 0x0560107b, 0x050f80ff, 0x032fa012, + 0x0046b075, 0x03b600ac, 0x0080024c, 0x06000020, + 0x04001016, 0x0460082a, 0x050f80ff, 0x032fa012, + 0x07c00000, 0x06000075, 0x040010a2, 0x044b0801, + 0x060ff016, 0x065a0001, 0x04600876, 0x050f80ff, + 0x032fa012, 0x07c00000, 0x050fe022, 0x0186029a, + 0x0421d004, 0x0302a022, 0x04a002c1, 0x018002b1, + 0x040fe026, 0x008602b3, 0x0421d001, 0x0202a026, + 0x04a002c1, 0x0202c013, 0x00683e20, 0x070060ff, + 0x056c0206, 0x048102f4, 0x056c0406, 0x0781030a, + 0x076c0606, 0x06810379, 0x056c1606, 0x078182b1, + 0x04488020, 0x07810387, 0x040fd02a, 0x0521d000, + 0x0202a013, 0x02020013, 0x008002b3, 0x04a004ec, + 0x008002bf, 0x050fe028, 0x008602bf, 0x0302a028, + 0x0421d002, 0x04a002c1, 0x008002c8, 0x050fe022, + 0x008602bf, 0x0421d004, 0x0302a022, 0x04a002c1, + 0x04a004ec, 0x05848030, 0x0280003d, 0x0460082a, + 0x050f80ff, 0x022fa031, 0x03020000, 0x0002b004, + 0x01018005, 0x07c00000, 0x0400702a, 0x06a003ba, + 0x007a0101, 0x07060000, 0x07303000, 0x07008290, + 0x07600018, 0x050f80ff, 0x053fa809, 0x07000003, + 0x0448e007, 0x068182d6, 0x06006013, 0x018002dd, + 0x02400010, 0x048102d6, 0x06006010, 0x0460322a, + 0x050f80ff, 0x073fa00a, 0x07000003, 0x050f801e, + 0x032fa03a, 0x063aa020, 0x06000002, 0x013e4000, + 0x07000030, 0x009802e3, 0x070ff0f6, 0x036830ff, + 0x078182e4, 0x070f001e, 0x0560102b, 0x050f10ff, + 0x063f3c08, 0x0600000d, 0x013e4000, 0x06000020, + 0x040f801a, 0x0320000a, 0x022017d0, 0x032fa012, + 0x0202c013, 0x008002bf, 0x04007013, 0x06a003ba, + 0x007a0101, 0x07050000, 0x07303000, 0x07008890, + 0x074d0005, 0x06006013, 0x050f801e, 0x032fa03a, + 0x05601a2b, 0x050f80ff, 0x022fa019, 0x04001002, + 0x04002013, 0x040f801f, 0x022fa01a, 0x073aa00c, + 0x06000002, 0x07300c03, 0x0600000d, 0x028003a7, + 0x04007013, 0x06a003ba, 0x007a0101, 0x03070000, + 0x0660282a, 0x050f80ff, 0x073fa009, 0x06000004, + 0x02499008, 0x07810317, 0x07303000, 0x07008890, + 0x02800319, 0x07303000, 0x04008980, 0x05007003, + 0x074d0005, 0x06006013, 0x050f801e, 0x032fa03a, + 0x0760142b, 0x050f80ff, 0x032fa021, 0x064b0002, + 0x02499008, 0x06810325, 0x0644c002, 0x054b0400, + 0x050040ff, 0x06698104, 0x0581833a, 0x06000013, + 0x04001013, 0x04780102, 0x06000010, 0x06003013, + 0x04004013, 0x06005013, 0x06006013, 0x04007013, + 0x00644015, 0x07820336, 0x04448002, 0x02205008, + 0x040f801f, 0x032fa042, 0x04008015, 0x03800371, + 0x046c8004, 0x05818348, 0x01208018, 0x06780002, + 0x07000003, 0x0581834b, 0x06003001, 0x06000013, + 0x04001013, 0x04004013, 0x06005013, 0x040f801f, + 0x022fa032, 0x03800371, 0x040fd02a, 0x06a00510, + 0x03800014, 0x04488002, 0x07810350, 0x070ff003, + 0x04500408, 0x050080ff, 0x06489002, 0x06810357, + 0x0379ff00, 0x070000ff, 0x070ff000, 0x04500408, + 0x050080ff, 0x07005003, 0x05004000, 0x06003001, + 0x06000013, 0x04001013, 0x040f801f, 0x022fa032, + 0x05601c2b, 0x050f80ff, 0x022fa031, 0x06600c1f, + 0x050f80ff, 0x022fa032, 0x02680608, 0x07810371, + 0x016408ff, 0x057dfeff, 0x07ffffff, 0x034000ff, + 0x045a0407, 0x070000ff, 0x0760061e, 0x050f80ff, + 0x032fa00a, 0x06600908, 0x0669f908, 0x027a0008, + 0x06000020, 0x070aa0ff, 0x014a20ff, 0x037a00ff, + 0x060000dc, 0x070000ff, 0x028003a7, 0x04007013, + 0x06a003ba, 0x007a0101, 0x07030000, 0x07303000, + 0x07008190, 0x06006013, 0x050f801e, 0x032fa03a, + 0x073aa000, 0x06000002, 0x07300c00, 0x07000005, + 0x028003a7, 0x04007013, 0x06a003ba, 0x007a0101, + 0x07810000, 0x07303000, 0x07000090, 0x06006013, + 0x06600c2a, 0x050f80ff, 0x053fa809, 0x07000003, + 0x04780107, 0x07ffff00, 0x007c0107, 0x07000500, + 0x0581839a, 0x07303000, 0x05000890, 0x074d0005, + 0x0660282a, 0x050f80ff, 0x053fa809, 0x07000003, + 0x0049d007, 0x068103a1, 0x02206001, 0x050f801e, + 0x032fa03a, 0x073aa000, 0x06000002, 0x07300c00, + 0x07000005, 0x013e4000, 0x07000030, 0x039803a9, + 0x070ff0f6, 0x036830ff, 0x058183aa, 0x070f001e, + 0x040f101f, 0x070f3000, 0x013e4000, 0x06000020, + 0x040f801a, 0x0320000a, 0x022017d0, 0x032fa012, + 0x008002bf, 0x03200000, 0x06006076, 0x028003bc, + 0x03200011, 0x0600602a, 0x05a00441, 0x05600406, + 0x050f80ff, 0x053fa809, 0x06000002, 0x07c00000, + 0x0207602f, 0x04600876, 0x050f80ff, 0x022fa031, + 0x03075000, 0x0007b004, 0x01018005, 0x06600076, + 0x050020ff, 0x050f80ff, 0x012fa809, 0x0202f001, + 0x008683d0, 0x0002e013, 0x040f8002, 0x053fa80a, + 0x07000009, 0x06273001, 0x0448b075, 0x048183da, + 0x04602076, 0x050f80ff, 0x053fa811, 0x0700003c, + 0x0179fe78, 0x070000ff, 0x030190ff, 0x018683e2, + 0x07a003f6, 0x00078019, 0x039203f5, 0x0180043a, + 0x040fd076, 0x040fd019, 0x04600276, 0x050020ff, + 0x050f80ff, 0x032fa009, 0x040f8002, 0x053fa80a, + 0x07000009, 0x050fe000, 0x008683f2, 0x07601818, + 0x050f80ff, 0x053fa80a, 0x07000009, 0x038003f3, + 0x07a000de, 0x07273000, 0x02076013, 0x0280003d, + 0x078b03f6, 0x03385000, 0x07030000, 0x05600818, + 0x050f80ff, 0x032fa009, 0x054b0400, 0x0308a0ff, + 0x0179fe00, 0x070000ff, 0x010880ff, 0x0448b075, + 0x04810410, 0x0760147b, 0x050f80ff, 0x002fa819, + 0x064b0001, 0x02080002, 0x01081003, 0x00082001, + 0x02083001, 0x02079001, 0x0207a001, 0x00084013, + 0x0207f013, 0x00800432, 0x06485075, 0x05810428, + 0x02465075, 0x06601476, 0x050f80ff, 0x073fa021, + 0x0600003e, 0x070ff07d, 0x0450047c, 0x050f80ff, + 0x002fa819, 0x058b041b, 0x02080001, 0x00081002, + 0x01082003, 0x03079003, 0x0208307a, 0x0340007e, + 0x0642007f, 0x0581042d, 0x070ff07e, 0x05a001d2, + 0x0392842d, 0x01800439, 0x058b0428, 0x06601476, + 0x050f80ff, 0x073fa041, 0x0600003e, 0x06602476, + 0x050f80ff, 0x073fa009, 0x06000007, 0x0008400e, + 0x048b0432, 0x03385000, 0x03010000, 0x06219001, + 0x040fe07f, 0x01860439, 0x018001bb, 0x07c00000, + 0x00683e75, 0x0581043f, 0x0448d075, 0x05810465, + 0x01800493, 0x05a004f0, 0x038003f5, 0x0297844c, + 0x07602418, 0x050f80ff, 0x012fa809, 0x06780001, + 0x070000ff, 0x075a0000, 0x070ff014, 0x0569feff, + 0x054b08ff, 0x075a0000, 0x05600418, 0x050f80ff, + 0x012fa809, 0x040fe007, 0x03868453, 0x01204000, + 0x00800461, 0x00700101, 0x03010000, 0x06780001, + 0x07ff0000, 0x076c00ff, 0x0681845b, 0x00700101, + 0x03010000, 0x05600418, 0x050f80ff, 0x012fa80a, + 0x06780001, 0x07ff0000, 0x050040ff, 0x0279ff01, + 0x0700ffff, 0x05002014, 0x07c00000, 0x04007076, + 0x0448b075, 0x0481047f, 0x03200011, 0x06006076, + 0x06a003bc, 0x007a0101, 0x07060000, 0x07303000, + 0x07008290, 0x07600018, 0x050f80ff, 0x053fa809, + 0x07000003, 0x0448e007, 0x07818477, 0x06006013, + 0x0180048e, 0x02400010, 0x05810477, 0x06006010, + 0x04603276, 0x050f80ff, 0x073fa00a, 0x07000003, + 0x0180048e, 0x04602a76, 0x050f80ff, 0x032fa009, + 0x060ff07a, 0x05500400, 0x070000ff, 0x04602a76, + 0x050f80ff, 0x032fa00a, 0x07a003b7, 0x007a0101, + 0x03010000, 0x06303008, 0x05008000, 0x0600600e, + 0x050f8074, 0x032fa03a, 0x053079a0, 0x0700000c, + 0x008004d3, 0x00683e75, 0x076c0aff, 0x058104b2, + 0x04007013, 0x03200011, 0x06006076, 0x06a003bc, + 0x007a0101, 0x03070000, 0x06602876, 0x050f80ff, + 0x053fa809, 0x06000001, 0x03499003, 0x048104a7, + 0x07303000, 0x07008890, 0x053079a0, 0x0700000c, + 0x008004ab, 0x07303000, 0x04008980, 0x04307920, + 0x0700000c, 0x074d0005, 0x06006013, 0x050f8074, + 0x032fa03a, 0x04307920, 0x0700000c, 0x008004d3, + 0x04602a76, 0x050f80ff, 0x032fa009, 0x060ff07a, + 0x05500400, 0x070000ff, 0x04602a76, 0x050f80ff, + 0x032fa00a, 0x04007076, 0x07a003b7, 0x007a0101, + 0x03010000, 0x06303008, 0x07008800, 0x074d0005, + 0x06600a76, 0x050f80ff, 0x073fa009, 0x07000003, + 0x054b0406, 0x045a0404, 0x050040ff, 0x0600600e, + 0x050f8074, 0x032fa03a, 0x0648c075, 0x058104d1, + 0x06307d20, 0x0700000c, 0x008004d3, 0x04307920, + 0x0700000c, 0x013e4000, 0x07000030, 0x009804d5, + 0x070ff0f6, 0x074850ff, 0x068184d6, 0x050f2074, + 0x060a0007, 0x040070fb, 0x046a7007, 0x050f40ff, + 0x013e4000, 0x06000020, 0x0678007a, 0x07fff000, + 0x068184e6, 0x0320000a, 0x022017d0, 0x008004e9, + 0x0320000a, 0x06301b58, 0x06000001, 0x050f8072, + 0x032fa012, 0x038003f5, 0x01208060, 0x0600902a, + 0x04002020, 0x018004fc, 0x040080fb, 0x066ae108, + 0x06009076, 0x04002075, 0x018004fc, 0x03201100, + 0x078484fa, 0x06420001, 0x078184f6, 0x02800513, + 0x020e0008, 0x07c00000, 0x050fd009, 0x040fd008, + 0x03201100, 0x05848503, 0x06420001, 0x078184ff, + 0x02800513, 0x007a0102, 0x04000101, 0x05600809, + 0x050f80ff, 0x073fa00a, 0x06000001, 0x020e0008, + 0x0684050d, 0x030e0009, 0x07c00000, 0x01011009, + 0x052e4300, 0x07c00000, 0x052e400f, 0x01208090, + 0x018004f5, 0x070fc0ff, 0x040f8013, 0x032fa009, + 0x02800516, 0x15416ea9, 0xffef0b01 }; + +#ifdef UNIQUE_FW_NAME +uint32_t fw2400_length02 = 0x000014ff ; +#else +uint32_t risc_code_length02 = 0x000014ff ; +#endif + diff --git a/drivers/scsi/qla2xxx/ql6312.c b/drivers/scsi/qla2xxx/ql6312.c index 59268eb80..de55397f6 100644 --- a/drivers/scsi/qla2xxx/ql6312.c +++ b/drivers/scsi/qla2xxx/ql6312.c @@ -1,10 +1,9 @@ /* - * QLogic ISP6312 device driver for Linux 2.6.x - * Copyright (C) 2003-2004 QLogic Corporation (www.qlogic.com) + * QLogic Fibre Channel HBA Driver + * Copyright (c) 2003-2005 QLogic Corporation * - * Released under GPL v2. + * See LICENSE.qla2xxx for copyright and licensing details. */ - #include #include #include diff --git a/drivers/scsi/qla2xxx/ql6312_fw.c b/drivers/scsi/qla2xxx/ql6312_fw.c index 63d827d7d..5bb837052 100644 --- a/drivers/scsi/qla2xxx/ql6312_fw.c +++ b/drivers/scsi/qla2xxx/ql6312_fw.c @@ -1,24 +1,12 @@ -/****************************************************************************** - * QLOGIC LINUX SOFTWARE - * - * QLogic ISP2x00 device driver for Linux 2.6.x - * Copyright (C) 2003 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. + */ /* - * Firmware Version 3.03.08 (10:02 Nov 12, 2004) + * Firmware Version 3.03.18 (12:07 Sep 20, 2005) */ #ifdef UNIQUE_FW_NAME @@ -28,15 +16,15 @@ unsigned short risc_code_version = 3*1024+3; #endif #ifdef UNIQUE_FW_NAME -unsigned char fw2300flx_version_str[] = {3, 3, 8}; +unsigned char fw2300flx_version_str[] = {3, 3,18}; #else -unsigned char firmware_version[] = {3, 3, 8}; +unsigned char firmware_version[] = {3, 3,18}; #endif #ifdef UNIQUE_FW_NAME -#define fw2300flx_VERSION_STRING "3.03.08" +#define fw2300flx_VERSION_STRING "3.03.18" #else -#define FW_VERSION_STRING "3.03.08" +#define FW_VERSION_STRING "3.03.18" #endif #ifdef UNIQUE_FW_NAME @@ -50,12 +38,12 @@ unsigned short fw2300flx_code01[] = { #else unsigned short risc_code01[] = { #endif - 0x0470, 0x0000, 0x0000, 0xdd79, 0x0000, 0x0003, 0x0003, 0x0008, + 0x0470, 0x0000, 0x0000, 0xdbb7, 0x0000, 0x0003, 0x0003, 0x0012, 0x0317, 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, 0x2e30, 0x3820, 0x2020, 0x2020, 0x2400, 0x20a9, + 0x332e, 0x3033, 0x2e31, 0x3820, 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, @@ -64,8 +52,8 @@ unsigned short risc_code01[] = { 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, 0x2cff, 0x2051, 0x1800, 0x2a70, 0x20e1, - 0x0001, 0x20e9, 0x0001, 0x2009, 0x0000, 0x080c, 0x0e75, 0x2029, + 0x7883, 0x0004, 0x2089, 0x2c06, 0x2051, 0x1800, 0x2a70, 0x20e1, + 0x0001, 0x20e9, 0x0001, 0x2009, 0x0000, 0x080c, 0x0e7b, 0x2029, 0x2480, 0x2031, 0xffff, 0x2039, 0x2450, 0x2021, 0x0050, 0x20e9, 0x0001, 0x20a1, 0x0000, 0x20a9, 0x0800, 0x900e, 0x4104, 0x20e9, 0x0001, 0x20a1, 0x1000, 0x900e, 0x2001, 0x0cc0, 0x9084, 0x0fff, @@ -77,4912 +65,4881 @@ unsigned short risc_code01[] = { 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, 0x0f49, 0x080c, - 0x5f39, 0x080c, 0xa079, 0x080c, 0x1100, 0x080c, 0x12f8, 0x080c, - 0x1af5, 0x080c, 0x0d8c, 0x080c, 0x1085, 0x080c, 0x33e9, 0x080c, - 0x7518, 0x080c, 0x687e, 0x080c, 0x8215, 0x080c, 0x23bd, 0x080c, - 0x8526, 0x080c, 0x7b99, 0x080c, 0x21e9, 0x080c, 0x231d, 0x080c, - 0x23b2, 0x2091, 0x3009, 0x7883, 0x0000, 0x1004, 0x091d, 0x7880, + 0x20a9, 0x0800, 0x4104, 0x8211, 0x1dd8, 0x080c, 0x0f4f, 0x080c, + 0x5e3d, 0x080c, 0x9f80, 0x080c, 0x1106, 0x080c, 0x12fe, 0x080c, + 0x1a75, 0x080c, 0x0d88, 0x080c, 0x108b, 0x080c, 0x32f3, 0x080c, + 0x748e, 0x080c, 0x6784, 0x080c, 0x8194, 0x080c, 0x22b3, 0x080c, + 0x84a5, 0x080c, 0x7b18, 0x080c, 0x20df, 0x080c, 0x2213, 0x080c, + 0x22a8, 0x2091, 0x3009, 0x7883, 0x0000, 0x1004, 0x091d, 0x7880, 0x9086, 0x0002, 0x1190, 0x7883, 0x4000, 0x7837, 0x4000, 0x7833, 0x0010, 0x0e04, 0x0911, 0x2091, 0x5000, 0x2091, 0x4080, 0x2001, - 0x0089, 0x2004, 0xd084, 0x190c, 0x11e0, 0x2071, 0x1800, 0x7003, + 0x0089, 0x2004, 0xd084, 0x190c, 0x11e6, 0x2071, 0x1800, 0x7003, 0x0000, 0x2071, 0x1800, 0x7000, 0x908e, 0x0003, 0x1168, 0x080c, - 0x4be4, 0x080c, 0x3410, 0x080c, 0x7580, 0x080c, 0x6d2e, 0x080c, - 0x823e, 0x080c, 0x2c2c, 0x0c68, 0x000b, 0x0c88, 0x0940, 0x0941, - 0x0ad8, 0x093e, 0x0b8f, 0x0d8b, 0x0d8b, 0x0d8b, 0x080c, 0x0dfa, + 0x4adc, 0x080c, 0x331a, 0x080c, 0x74f6, 0x080c, 0x6c82, 0x080c, + 0x81bd, 0x080c, 0x2b13, 0x0c68, 0x000b, 0x0c88, 0x0940, 0x0941, + 0x0ad8, 0x093e, 0x0b8f, 0x0d87, 0x0d87, 0x0d87, 0x080c, 0x0df6, 0x0005, 0x0126, 0x00f6, 0x2091, 0x8000, 0x7000, 0x9086, 0x0001, - 0x1904, 0x0aab, 0x080c, 0x0eb7, 0x080c, 0x7207, 0x0150, 0x080c, - 0x722a, 0x15a0, 0x2079, 0x0100, 0x7828, 0x9085, 0x1800, 0x782a, - 0x0468, 0x080c, 0x7127, 0x7000, 0x9086, 0x0001, 0x1904, 0x0aab, - 0x7094, 0x9086, 0x0028, 0x1904, 0x0aab, 0x080c, 0x81fe, 0x080c, - 0x81f0, 0x2001, 0x0161, 0x2003, 0x0001, 0x2079, 0x0100, 0x7827, - 0xffff, 0x7a28, 0x9295, 0x5e2f, 0x7a2a, 0x2011, 0x7076, 0x080c, - 0x82da, 0x2011, 0x7069, 0x080c, 0x83ae, 0x2011, 0x5d94, 0x080c, - 0x82da, 0x2011, 0x8030, 0x901e, 0x7392, 0x04d0, 0x080c, 0x5641, - 0x2079, 0x0100, 0x7844, 0x9005, 0x1904, 0x0aab, 0x2011, 0x5d94, - 0x080c, 0x82da, 0x2011, 0x7076, 0x080c, 0x82da, 0x2011, 0x7069, - 0x080c, 0x83ae, 0x2001, 0x0265, 0x2001, 0x0205, 0x2003, 0x0000, - 0x7840, 0x9084, 0xfffb, 0x7842, 0x2001, 0x197e, 0x2004, 0x9005, - 0x1140, 0x00c6, 0x2061, 0x0100, 0x080c, 0x5ee1, 0x00ce, 0x0804, - 0x0aab, 0x780f, 0x006b, 0x7a28, 0x080c, 0x720f, 0x0118, 0x9295, + 0x1904, 0x0aab, 0x080c, 0x0ebd, 0x080c, 0x717e, 0x0150, 0x080c, + 0x71a1, 0x15a0, 0x2079, 0x0100, 0x7828, 0x9085, 0x1800, 0x782a, + 0x0468, 0x080c, 0x709e, 0x7000, 0x9086, 0x0001, 0x1904, 0x0aab, + 0x7094, 0x9086, 0x0029, 0x1904, 0x0aab, 0x080c, 0x817d, 0x080c, + 0x816f, 0x2001, 0x0161, 0x2003, 0x0001, 0x2079, 0x0100, 0x7827, + 0xffff, 0x7a28, 0x9295, 0x5e2f, 0x7a2a, 0x2011, 0x6fed, 0x080c, + 0x8259, 0x2011, 0x6fe0, 0x080c, 0x832d, 0x2011, 0x5c98, 0x080c, + 0x8259, 0x2011, 0x8030, 0x901e, 0x7392, 0x04d0, 0x080c, 0x5545, + 0x2079, 0x0100, 0x7844, 0x9005, 0x1904, 0x0aab, 0x2011, 0x5c98, + 0x080c, 0x8259, 0x2011, 0x6fed, 0x080c, 0x8259, 0x2011, 0x6fe0, + 0x080c, 0x832d, 0x2001, 0x0265, 0x2001, 0x0205, 0x2003, 0x0000, + 0x7840, 0x9084, 0xfffb, 0x7842, 0x2001, 0x1981, 0x2004, 0x9005, + 0x1140, 0x00c6, 0x2061, 0x0100, 0x080c, 0x5de5, 0x00ce, 0x0804, + 0x0aab, 0x780f, 0x006b, 0x7a28, 0x080c, 0x7186, 0x0118, 0x9295, 0x5e2f, 0x0010, 0x9295, 0x402f, 0x7a2a, 0x2011, 0x8010, 0x73d4, - 0x2001, 0x197f, 0x2003, 0x0001, 0x080c, 0x2a89, 0x080c, 0x4b1f, + 0x2001, 0x1982, 0x2003, 0x0001, 0x080c, 0x2974, 0x080c, 0x4a17, 0x7244, 0xc284, 0x7246, 0x2001, 0x180c, 0x200c, 0xc1ac, 0xc1cc, - 0x2102, 0x080c, 0x9904, 0x2011, 0x0004, 0x080c, 0xbe47, 0x080c, - 0x66c2, 0x080c, 0x7207, 0x1120, 0x080c, 0x2af6, 0x02e0, 0x0400, - 0x080c, 0x5ee8, 0x0140, 0x7093, 0x0001, 0x70cf, 0x0000, 0x080c, - 0x580e, 0x0804, 0x0aab, 0x080c, 0x55db, 0xd094, 0x0188, 0x2011, - 0x180c, 0x2204, 0xc0cd, 0x2012, 0x080c, 0x55df, 0xd0d4, 0x1118, - 0x080c, 0x2af6, 0x1270, 0x2011, 0x180c, 0x2204, 0xc0bc, 0x0088, - 0x080c, 0x55df, 0xd0d4, 0x1db8, 0x2011, 0x180c, 0x2204, 0xc0bd, - 0x0040, 0x2011, 0x180c, 0x2204, 0xc0bd, 0x2012, 0x080c, 0x67bb, - 0x0008, 0x2012, 0x080c, 0x6781, 0x0120, 0x7a0c, 0xc2b4, 0x7a0e, - 0x00a8, 0x707b, 0x0000, 0x080c, 0x7207, 0x1130, 0x70ac, 0x9005, - 0x1168, 0x080c, 0xc28a, 0x0050, 0x080c, 0xc28a, 0x70d8, 0xd09c, - 0x1128, 0x70ac, 0x9005, 0x0110, 0x080c, 0x5ebe, 0x70e3, 0x0000, - 0x70df, 0x0000, 0x70a3, 0x0000, 0x080c, 0x2afe, 0x0228, 0x2011, - 0x0101, 0x2204, 0xc0c4, 0x2012, 0x72d8, 0x080c, 0x7207, 0x1178, - 0x9016, 0x0016, 0x2009, 0x0002, 0x2019, 0x1945, 0x211a, 0x001e, + 0x2102, 0x080c, 0x9818, 0x2011, 0x0004, 0x080c, 0xbd5e, 0x080c, + 0x65c6, 0x080c, 0x717e, 0x1120, 0x080c, 0x29e1, 0x02e0, 0x0400, + 0x080c, 0x5dec, 0x0140, 0x7093, 0x0001, 0x70cf, 0x0000, 0x080c, + 0x5712, 0x0804, 0x0aab, 0x080c, 0x54db, 0xd094, 0x0188, 0x2011, + 0x180c, 0x2204, 0xc0cd, 0x2012, 0x080c, 0x54df, 0xd0d4, 0x1118, + 0x080c, 0x29e1, 0x1270, 0x2011, 0x180c, 0x2204, 0xc0bc, 0x0088, + 0x080c, 0x54df, 0xd0d4, 0x1db8, 0x2011, 0x180c, 0x2204, 0xc0bd, + 0x0040, 0x2011, 0x180c, 0x2204, 0xc0bd, 0x2012, 0x080c, 0x66c1, + 0x0008, 0x2012, 0x080c, 0x6687, 0x0120, 0x7a0c, 0xc2b4, 0x7a0e, + 0x00a8, 0x707b, 0x0000, 0x080c, 0x717e, 0x1130, 0x70ac, 0x9005, + 0x1168, 0x080c, 0xc1a1, 0x0050, 0x080c, 0xc1a1, 0x70d8, 0xd09c, + 0x1128, 0x70ac, 0x9005, 0x0110, 0x080c, 0x5dc2, 0x70e3, 0x0000, + 0x70df, 0x0000, 0x70a3, 0x0000, 0x080c, 0x29e9, 0x0228, 0x2011, + 0x0101, 0x2204, 0xc0c4, 0x2012, 0x72d8, 0x080c, 0x717e, 0x1178, + 0x9016, 0x0016, 0x2009, 0x0002, 0x2019, 0x1947, 0x211a, 0x001e, 0x705b, 0xffff, 0x705f, 0x00ef, 0x707f, 0x0000, 0x0020, 0x2019, - 0x1945, 0x201b, 0x0000, 0x2079, 0x185b, 0x7804, 0xd0ac, 0x0108, - 0xc295, 0x72da, 0x080c, 0x7207, 0x0118, 0x9296, 0x0004, 0x0548, - 0x2011, 0x0001, 0x080c, 0xbe47, 0x70a7, 0x0000, 0x70ab, 0xffff, + 0x1947, 0x201b, 0x0000, 0x2079, 0x185b, 0x7804, 0xd0ac, 0x0108, + 0xc295, 0x72da, 0x080c, 0x717e, 0x0118, 0x9296, 0x0004, 0x0548, + 0x2011, 0x0001, 0x080c, 0xbd5e, 0x70a7, 0x0000, 0x70ab, 0xffff, 0x7003, 0x0002, 0x2079, 0x0100, 0x7827, 0x0003, 0x7828, 0x9085, - 0x0003, 0x782a, 0x00fe, 0x080c, 0x2f6c, 0x2011, 0x0005, 0x080c, - 0x9a0f, 0x080c, 0x8c10, 0x080c, 0x7207, 0x0148, 0x00c6, 0x2061, + 0x0003, 0x782a, 0x00fe, 0x080c, 0x2e73, 0x2011, 0x0005, 0x080c, + 0x9923, 0x080c, 0x8b8f, 0x080c, 0x717e, 0x0148, 0x00c6, 0x2061, 0x0100, 0x0016, 0x2009, 0x0002, 0x61e2, 0x001e, 0x00ce, 0x012e, 0x0420, 0x70a7, 0x0000, 0x70ab, 0xffff, 0x7003, 0x0002, 0x00f6, 0x2079, 0x0100, 0x7827, 0x0003, 0x7828, 0x9085, 0x0003, 0x782a, - 0x00fe, 0x2011, 0x0005, 0x080c, 0x9a0f, 0x080c, 0x8c10, 0x080c, - 0x7207, 0x0148, 0x00c6, 0x2061, 0x0100, 0x0016, 0x2009, 0x0002, + 0x00fe, 0x2011, 0x0005, 0x080c, 0x9923, 0x080c, 0x8b8f, 0x080c, + 0x717e, 0x0148, 0x00c6, 0x2061, 0x0100, 0x0016, 0x2009, 0x0002, 0x61e2, 0x001e, 0x00ce, 0x00fe, 0x012e, 0x0005, 0x00c6, 0x00b6, - 0x080c, 0x7207, 0x1118, 0x20a9, 0x0800, 0x0010, 0x20a9, 0x0782, - 0x080c, 0x7207, 0x1110, 0x900e, 0x0010, 0x2009, 0x007e, 0x86ff, + 0x080c, 0x717e, 0x1118, 0x20a9, 0x0800, 0x0010, 0x20a9, 0x0782, + 0x080c, 0x717e, 0x1110, 0x900e, 0x0010, 0x2009, 0x007e, 0x86ff, 0x0138, 0x9180, 0x1000, 0x2004, 0x905d, 0x0110, 0xb800, 0xd0bc, - 0x090c, 0x3286, 0x8108, 0x1f04, 0x0abf, 0x707b, 0x0000, 0x707c, + 0x090c, 0x3190, 0x8108, 0x1f04, 0x0abf, 0x707b, 0x0000, 0x707c, 0x9084, 0x00ff, 0x707e, 0x70af, 0x0000, 0x00be, 0x00ce, 0x0005, 0x00b6, 0x0126, 0x2091, 0x8000, 0x7000, 0x9086, 0x0002, 0x1904, - 0x0b8c, 0x70a8, 0x9086, 0xffff, 0x0130, 0x080c, 0x2f6c, 0x080c, - 0x8c10, 0x0804, 0x0b8c, 0x70d8, 0xd0ac, 0x1110, 0xd09c, 0x0540, + 0x0b8c, 0x70a8, 0x9086, 0xffff, 0x0130, 0x080c, 0x2e73, 0x080c, + 0x8b8f, 0x0804, 0x0b8c, 0x70d8, 0xd0ac, 0x1110, 0xd09c, 0x0540, 0xd084, 0x0530, 0x0006, 0x2001, 0x0103, 0x2003, 0x002b, 0x000e, - 0xd08c, 0x01f0, 0x70dc, 0x9086, 0xffff, 0x01b0, 0x080c, 0x30f7, - 0x080c, 0x8c10, 0x70d8, 0xd094, 0x1904, 0x0b8c, 0x2011, 0x0001, - 0x080c, 0xc539, 0x0110, 0x2011, 0x0003, 0x901e, 0x080c, 0x3131, - 0x080c, 0x8c10, 0x0804, 0x0b8c, 0x70e0, 0x9005, 0x1904, 0x0b8c, + 0xd08c, 0x01f0, 0x70dc, 0x9086, 0xffff, 0x01b0, 0x080c, 0x3001, + 0x080c, 0x8b8f, 0x70d8, 0xd094, 0x1904, 0x0b8c, 0x2011, 0x0001, + 0x080c, 0xc459, 0x0110, 0x2011, 0x0003, 0x901e, 0x080c, 0x303b, + 0x080c, 0x8b8f, 0x0804, 0x0b8c, 0x70e0, 0x9005, 0x1904, 0x0b8c, 0x70a4, 0x9005, 0x1904, 0x0b8c, 0x70d8, 0xd0a4, 0x0118, 0xd0b4, - 0x0904, 0x0b8c, 0x080c, 0x6781, 0x1904, 0x0b8c, 0x080c, 0x67d4, - 0x1904, 0x0b8c, 0x080c, 0x67bb, 0x01c0, 0x0156, 0x00c6, 0x20a9, - 0x007f, 0x900e, 0x0016, 0x080c, 0x649f, 0x1118, 0xb800, 0xd0ec, + 0x0904, 0x0b8c, 0x080c, 0x6687, 0x1904, 0x0b8c, 0x080c, 0x66da, + 0x1904, 0x0b8c, 0x080c, 0x66c1, 0x01c0, 0x0156, 0x00c6, 0x20a9, + 0x007f, 0x900e, 0x0016, 0x080c, 0x63a3, 0x1118, 0xb800, 0xd0ec, 0x1138, 0x001e, 0x8108, 0x1f04, 0x0b32, 0x00ce, 0x015e, 0x0028, 0x001e, 0x00ce, 0x015e, 0x0804, 0x0b8c, 0x0006, 0x2001, 0x0103, - 0x2003, 0x006b, 0x000e, 0x2011, 0x198b, 0x080c, 0x0fb9, 0x2011, - 0x19a5, 0x080c, 0x0fb9, 0x7030, 0xc08c, 0x7032, 0x7003, 0x0003, - 0x70ab, 0xffff, 0x080c, 0x0e99, 0x9006, 0x080c, 0x2717, 0x0036, - 0x0046, 0x2019, 0xffff, 0x2021, 0x0006, 0x080c, 0x4cbc, 0x004e, - 0x003e, 0x00f6, 0x2079, 0x0100, 0x080c, 0x722a, 0x0150, 0x080c, - 0x7207, 0x7828, 0x0118, 0x9084, 0xe1ff, 0x0010, 0x9084, 0xffdf, - 0x782a, 0x00fe, 0x2001, 0x19c0, 0x2004, 0x9086, 0x0005, 0x1120, - 0x2011, 0x0000, 0x080c, 0x9a0f, 0x2011, 0x0000, 0x080c, 0x9a19, - 0x080c, 0x8c10, 0x080c, 0x8ced, 0x012e, 0x00be, 0x0005, 0x0016, + 0x2003, 0x006b, 0x000e, 0x2011, 0x198e, 0x080c, 0x0fbf, 0x2011, + 0x19a8, 0x080c, 0x0fbf, 0x7030, 0xc08c, 0x7032, 0x7003, 0x0003, + 0x70ab, 0xffff, 0x080c, 0x0e9f, 0x9006, 0x080c, 0x2616, 0x0036, + 0x0046, 0x2019, 0xffff, 0x2021, 0x0006, 0x080c, 0x4bb4, 0x004e, + 0x003e, 0x00f6, 0x2079, 0x0100, 0x080c, 0x71a1, 0x0150, 0x080c, + 0x717e, 0x7828, 0x0118, 0x9084, 0xe1ff, 0x0010, 0x9084, 0xffdf, + 0x782a, 0x00fe, 0x2001, 0x19c3, 0x2004, 0x9086, 0x0005, 0x1120, + 0x2011, 0x0000, 0x080c, 0x9923, 0x2011, 0x0000, 0x080c, 0x992d, + 0x080c, 0x8b8f, 0x080c, 0x8c6c, 0x012e, 0x00be, 0x0005, 0x0016, 0x0046, 0x00f6, 0x0126, 0x2091, 0x8000, 0x2079, 0x0100, 0x7904, - 0x918c, 0xfffd, 0x7906, 0x2009, 0x00f7, 0x080c, 0x5ea7, 0x7940, + 0x918c, 0xfffd, 0x7906, 0x2009, 0x00f7, 0x080c, 0x5dab, 0x7940, 0x918c, 0x0010, 0x7942, 0x7924, 0xd1b4, 0x0110, 0x7827, 0x0040, 0xd19c, 0x0110, 0x7827, 0x0008, 0x0006, 0x0036, 0x0156, 0x2001, 0x0100, 0x2004, 0x9086, 0x000a, 0x1904, 0x0c23, 0x7954, 0xd1ac, - 0x1904, 0x0c23, 0x2001, 0x197f, 0x2004, 0x9005, 0x1518, 0x080c, - 0x2b98, 0x1148, 0x2001, 0x0001, 0x080c, 0x2ab8, 0x2001, 0x0001, - 0x080c, 0x2a9b, 0x00b8, 0x080c, 0x2ba0, 0x1138, 0x9006, 0x080c, - 0x2ab8, 0x9006, 0x080c, 0x2a9b, 0x0068, 0x080c, 0x2ba8, 0x1d50, - 0x2001, 0x1970, 0x2004, 0xd0fc, 0x0108, 0x0020, 0x080c, 0x28b2, - 0x0804, 0x0d33, 0x080c, 0x7218, 0x0148, 0x080c, 0x722a, 0x1118, - 0x080c, 0x7513, 0x0050, 0x080c, 0x720f, 0x0dd0, 0x080c, 0x750e, - 0x080c, 0x7504, 0x080c, 0x7127, 0x0058, 0x080c, 0x7207, 0x0140, - 0x2009, 0x00f8, 0x080c, 0x5ea7, 0x7843, 0x0090, 0x7843, 0x0010, - 0x20a9, 0x09c4, 0x7820, 0xd09c, 0x1138, 0x080c, 0x7207, 0x0138, - 0x7824, 0xd0ac, 0x1904, 0x0d38, 0x1f04, 0x0c02, 0x0070, 0x7824, - 0x080c, 0x7221, 0x0118, 0xd0ac, 0x1904, 0x0d38, 0x9084, 0x1800, - 0x0d98, 0x7003, 0x0001, 0x0804, 0x0d38, 0x2001, 0x0001, 0x080c, - 0x2717, 0x0804, 0x0d5a, 0x2001, 0x197f, 0x2004, 0x9005, 0x1518, - 0x080c, 0x2b98, 0x1148, 0x2001, 0x0001, 0x080c, 0x2ab8, 0x2001, - 0x0001, 0x080c, 0x2a9b, 0x00b8, 0x080c, 0x2ba0, 0x1138, 0x9006, - 0x080c, 0x2ab8, 0x9006, 0x080c, 0x2a9b, 0x0068, 0x080c, 0x2ba8, - 0x1d50, 0x2001, 0x1970, 0x2004, 0xd0fc, 0x0108, 0x0020, 0x080c, - 0x28b2, 0x0804, 0x0d33, 0x2001, 0x0100, 0x2004, 0x9086, 0x000a, + 0x1904, 0x0c23, 0x2001, 0x1982, 0x2004, 0x9005, 0x1518, 0x080c, + 0x2a7f, 0x1148, 0x2001, 0x0001, 0x080c, 0x29a3, 0x2001, 0x0001, + 0x080c, 0x2986, 0x00b8, 0x080c, 0x2a87, 0x1138, 0x9006, 0x080c, + 0x29a3, 0x9006, 0x080c, 0x2986, 0x0068, 0x080c, 0x2a8f, 0x1d50, + 0x2001, 0x1972, 0x2004, 0xd0fc, 0x0108, 0x0020, 0x080c, 0x27b1, + 0x0804, 0x0d2f, 0x080c, 0x718f, 0x0148, 0x080c, 0x71a1, 0x1118, + 0x080c, 0x7489, 0x0050, 0x080c, 0x7186, 0x0dd0, 0x080c, 0x7484, + 0x080c, 0x747a, 0x080c, 0x709e, 0x0058, 0x080c, 0x717e, 0x0140, + 0x2009, 0x00f8, 0x080c, 0x5dab, 0x7843, 0x0090, 0x7843, 0x0010, + 0x20a9, 0x09c4, 0x7820, 0xd09c, 0x1138, 0x080c, 0x717e, 0x0138, + 0x7824, 0xd0ac, 0x1904, 0x0d34, 0x1f04, 0x0c02, 0x0070, 0x7824, + 0x080c, 0x7198, 0x0118, 0xd0ac, 0x1904, 0x0d34, 0x9084, 0x1800, + 0x0d98, 0x7003, 0x0001, 0x0804, 0x0d34, 0x2001, 0x0001, 0x080c, + 0x2616, 0x0804, 0x0d56, 0x2001, 0x1982, 0x2004, 0x9005, 0x1518, + 0x080c, 0x2a7f, 0x1148, 0x2001, 0x0001, 0x080c, 0x29a3, 0x2001, + 0x0001, 0x080c, 0x2986, 0x00b8, 0x080c, 0x2a87, 0x1138, 0x9006, + 0x080c, 0x29a3, 0x9006, 0x080c, 0x2986, 0x0068, 0x080c, 0x2a8f, + 0x1d50, 0x2001, 0x1972, 0x2004, 0xd0fc, 0x0108, 0x0020, 0x080c, + 0x27b1, 0x0804, 0x0d2f, 0x2001, 0x0100, 0x2004, 0x9086, 0x000a, 0x01f8, 0x7850, 0x9085, 0x0040, 0x7852, 0x7938, 0x7850, 0x9084, - 0xfbcf, 0x7852, 0x080c, 0x2bb0, 0x9085, 0x2000, 0x7852, 0x793a, - 0x20a9, 0x0046, 0x1d04, 0x0c62, 0x080c, 0x838e, 0x1f04, 0x0c62, - 0x7850, 0x9085, 0x0400, 0x9084, 0xdfbf, 0x7852, 0x793a, 0x0060, - 0x080c, 0x2cc2, 0x080c, 0x2cf5, 0x20a9, 0x003a, 0x1d04, 0x0c76, - 0x080c, 0x838e, 0x1f04, 0x0c76, 0x080c, 0x7218, 0x0148, 0x080c, - 0x722a, 0x1118, 0x080c, 0x7513, 0x0050, 0x080c, 0x720f, 0x0dd0, - 0x080c, 0x750e, 0x080c, 0x7504, 0x080c, 0x7127, 0x0020, 0x2009, - 0x00f8, 0x080c, 0x5ea7, 0x2001, 0x0100, 0x2004, 0x9086, 0x000a, - 0x0168, 0x20a9, 0x0028, 0xa001, 0x1f04, 0x0c9b, 0x7850, 0x9085, - 0x1400, 0x7852, 0x080c, 0x7207, 0x0158, 0x0030, 0x7850, 0xc0e5, - 0x7852, 0x080c, 0x7207, 0x0120, 0x7843, 0x0090, 0x7843, 0x0010, - 0x2021, 0xe678, 0x2019, 0xea60, 0x0d0c, 0x838e, 0x7820, 0xd09c, - 0x1590, 0x080c, 0x7207, 0x0904, 0x0d17, 0x7824, 0xd0ac, 0x1904, - 0x0d38, 0x080c, 0x722a, 0x1538, 0x0046, 0x2021, 0x0320, 0x8421, - 0x1df0, 0x004e, 0x7827, 0x1800, 0x080c, 0x2bb0, 0x7824, 0x9084, - 0x1800, 0x1168, 0x9484, 0x0fff, 0x1140, 0x2001, 0x1810, 0x2004, - 0x9084, 0x9000, 0x0110, 0x080c, 0x0d68, 0x8421, 0x1160, 0x1d04, - 0x0ce3, 0x080c, 0x838e, 0x080c, 0x750e, 0x080c, 0x7504, 0x7003, - 0x0001, 0x0804, 0x0d38, 0x8319, 0x1938, 0x2001, 0x0100, 0x2004, - 0x9086, 0x000a, 0x1140, 0x2001, 0x1810, 0x2004, 0x9084, 0x9000, - 0x0110, 0x080c, 0x0d68, 0x1d04, 0x0cff, 0x080c, 0x838e, 0x2009, - 0x1973, 0x2104, 0x9005, 0x0118, 0x8001, 0x200a, 0x1178, 0x200b, - 0x000a, 0x7827, 0x0048, 0x20a9, 0x0002, 0x080c, 0x2b91, 0x7924, - 0x080c, 0x2bb0, 0xd19c, 0x0110, 0x080c, 0x2a89, 0x00e0, 0x080c, - 0x7218, 0x1140, 0x94a2, 0x03e8, 0x1128, 0x080c, 0x71df, 0x7003, - 0x0001, 0x00b0, 0x7827, 0x1800, 0x080c, 0x2bb0, 0x7824, 0x080c, - 0x7221, 0x0110, 0xd0ac, 0x1160, 0x9084, 0x1800, 0x0904, 0x0ceb, - 0x7003, 0x0001, 0x0028, 0x2001, 0x0001, 0x080c, 0x2717, 0x00c0, - 0x2001, 0x0100, 0x2004, 0x9086, 0x000a, 0x1118, 0x7850, 0xc0e4, - 0x7852, 0x2009, 0x180c, 0x210c, 0xd19c, 0x1120, 0x7904, 0x918d, - 0x0002, 0x7906, 0x7827, 0x0048, 0x7828, 0x9085, 0x0028, 0x782a, - 0x2001, 0x0100, 0x2004, 0x9086, 0x000a, 0x0120, 0x7850, 0x9085, - 0x0400, 0x7852, 0x2001, 0x197f, 0x2003, 0x0000, 0x9006, 0x78f2, - 0x015e, 0x003e, 0x000e, 0x012e, 0x00fe, 0x004e, 0x001e, 0x0005, - 0x0006, 0x0016, 0x0036, 0x0046, 0x00b6, 0x00c6, 0x00d6, 0x00e6, - 0x00f6, 0x0156, 0x0069, 0x0d0c, 0x838e, 0x015e, 0x00fe, 0x00ee, - 0x00de, 0x00ce, 0x00be, 0x004e, 0x003e, 0x001e, 0x000e, 0x0005, - 0x00e6, 0x2071, 0x189c, 0x7004, 0x9086, 0x0001, 0x1110, 0x080c, - 0x3410, 0x00ee, 0x0005, 0x0005, 0x2a70, 0x2061, 0x1983, 0x2063, - 0x0003, 0x6007, 0x0003, 0x600b, 0x0008, 0x600f, 0x0317, 0x2001, - 0x1954, 0x900e, 0x2102, 0x7192, 0x2001, 0x0100, 0x2004, 0x9082, - 0x0002, 0x0218, 0x705b, 0xffff, 0x0008, 0x715a, 0x7063, 0xffff, - 0x717a, 0x717e, 0x080c, 0xc28a, 0x70e7, 0x00c0, 0x2061, 0x1944, - 0x6003, 0x0909, 0x6106, 0x600b, 0x8800, 0x600f, 0x0200, 0x6013, - 0x00ff, 0x6017, 0x000f, 0x611a, 0x601f, 0x07d0, 0x2061, 0x194c, - 0x6003, 0x8000, 0x6106, 0x610a, 0x600f, 0x0200, 0x6013, 0x00ff, - 0x6116, 0x601b, 0x0001, 0x611e, 0x2061, 0x1961, 0x6003, 0x514c, - 0x6007, 0x4f47, 0x600b, 0x4943, 0x600f, 0x2020, 0x2001, 0x182b, - 0x2102, 0x0005, 0x9016, 0x080c, 0x649f, 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, 0x0dfc, 0x0006, 0x0016, - 0x2001, 0x8002, 0x0006, 0x2079, 0x0000, 0x000e, 0x7882, 0x7836, - 0x001e, 0x798e, 0x000e, 0x788a, 0x000e, 0x7886, 0x3900, 0x789a, - 0x7833, 0x0012, 0x2091, 0x5000, 0x0156, 0x00d6, 0x0036, 0x0026, - 0x2079, 0x0300, 0x2069, 0x1a7c, 0x7a08, 0x226a, 0x2069, 0x1a7d, - 0x7a18, 0x226a, 0x8d68, 0x7a1c, 0x226a, 0x782c, 0x2019, 0x1a8a, - 0x201a, 0x2019, 0x1a8d, 0x9016, 0x7808, 0xd09c, 0x0168, 0x7820, - 0x201a, 0x8210, 0x8318, 0x9386, 0x1aa2, 0x0108, 0x0ca8, 0x7808, - 0xd09c, 0x0110, 0x2011, 0xdead, 0x2019, 0x1a8b, 0x782c, 0x201a, - 0x8318, 0x221a, 0x7803, 0x0000, 0x2069, 0x1a5c, 0x901e, 0x20a9, - 0x0020, 0x7b26, 0x7a28, 0x226a, 0x8d68, 0x8318, 0x1f04, 0x0e49, - 0x002e, 0x003e, 0x00de, 0x015e, 0x2079, 0x1800, 0x7803, 0x0005, - 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x0180, 0x2001, - 0x19f1, 0x2004, 0x9005, 0x0128, 0x2001, 0x008b, 0x2004, 0xd0fc, - 0x0dd8, 0x2001, 0x008a, 0x2003, 0x0002, 0x2003, 0x1001, 0x080c, - 0x55ea, 0x1108, 0x0099, 0x0cd8, 0x0005, 0x918c, 0x03ff, 0x2001, - 0x0003, 0x2004, 0x9084, 0x0600, 0x1118, 0x918d, 0x6c00, 0x0010, - 0x918d, 0x6400, 0x2001, 0x017f, 0x2102, 0x0005, 0x0026, 0x0126, - 0x2011, 0x0080, 0x080c, 0x0f11, 0x20a9, 0x0900, 0x080c, 0x0f32, - 0x2011, 0x0040, 0x080c, 0x0f11, 0x20a9, 0x0900, 0x080c, 0x0f32, - 0x0c78, 0x0026, 0x080c, 0x0f1e, 0x1118, 0x2011, 0x0040, 0x0098, - 0x2011, 0x010e, 0x2214, 0x9294, 0x0007, 0x9296, 0x0007, 0x0118, - 0x2011, 0xa880, 0x0010, 0x2011, 0x6840, 0xd0e4, 0x70eb, 0x0000, - 0x1120, 0x70eb, 0x0fa0, 0x080c, 0x0f23, 0x002e, 0x0005, 0x0026, - 0x080c, 0x0f1e, 0x0128, 0xd0a4, 0x1138, 0x2011, 0xcdd5, 0x0010, - 0x2011, 0x0080, 0x080c, 0x0f23, 0x002e, 0x0005, 0x0026, 0x70eb, - 0x0000, 0x080c, 0x0f1e, 0x1148, 0x080c, 0x2ba8, 0x1118, 0x2011, - 0x8484, 0x0058, 0x2011, 0x8282, 0x0040, 0x080c, 0x2ba8, 0x1118, - 0x2011, 0xcdc5, 0x0010, 0x2011, 0xcac2, 0x080c, 0x0f23, 0x002e, - 0x0005, 0x00e6, 0x0006, 0x2071, 0x1800, 0xd0b4, 0x70e4, 0x1110, - 0xc0e4, 0x0048, 0x0006, 0x3b00, 0x9084, 0xff3f, 0x20d8, 0x000e, - 0x70eb, 0x0000, 0xc0e5, 0x0079, 0x000e, 0x00ee, 0x0005, 0x00e6, - 0x2071, 0x1800, 0xd0e4, 0x70e4, 0x1110, 0xc0dc, 0x0008, 0xc0dd, - 0x0011, 0x00ee, 0x0005, 0x70e6, 0x7000, 0x9084, 0x0007, 0x000b, - 0x0005, 0x0ee0, 0x0eb7, 0x0eb7, 0x0e99, 0x0ec6, 0x0eb7, 0x0eb7, - 0x0ec6, 0x0016, 0x3b08, 0x3a00, 0x9104, 0x918d, 0x00c0, 0x21d8, - 0x9084, 0xff3f, 0x9205, 0x20d0, 0x001e, 0x0005, 0x2001, 0x1839, - 0x2004, 0xd0dc, 0x0005, 0x9e86, 0x1800, 0x190c, 0x0dfa, 0x70e4, - 0xd0e4, 0x0108, 0xc2e5, 0x72e6, 0xd0e4, 0x1118, 0x9294, 0x00c0, - 0x0c01, 0x0005, 0x1d04, 0x0f32, 0x2091, 0x6000, 0x1f04, 0x0f32, - 0x0005, 0x890e, 0x810e, 0x810f, 0x9194, 0x003f, 0x918c, 0xffc0, - 0x0005, 0x0006, 0x2200, 0x914d, 0x894f, 0x894d, 0x894d, 0x000e, - 0x0005, 0x01d6, 0x0146, 0x0036, 0x0096, 0x2061, 0x188b, 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, 0x189b, 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, 0x0f39, 0x2100, - 0x9300, 0x2098, 0x22e0, 0x009e, 0x002e, 0x001e, 0x0036, 0x3518, - 0x20a9, 0x0001, 0x4002, 0x8007, 0x4004, 0x8319, 0x1dd8, 0x003e, - 0x0005, 0x20e9, 0x0001, 0x71b4, 0x81ff, 0x11c0, 0x9006, 0x2009, - 0x0200, 0x20a9, 0x0002, 0x9298, 0x0018, 0x23a0, 0x4001, 0x2009, - 0x0700, 0x20a9, 0x0002, 0x9298, 0x0008, 0x23a0, 0x4001, 0x7078, - 0x8007, 0x717c, 0x810f, 0x20a9, 0x0002, 0x4001, 0x9298, 0x000c, - 0x23a0, 0x900e, 0x080c, 0x0dda, 0x2001, 0x0000, 0x810f, 0x20a9, - 0x0002, 0x4001, 0x0005, 0x89ff, 0x0140, 0xa804, 0xa807, 0x0000, - 0x0006, 0x080c, 0x1063, 0x009e, 0x0cb0, 0x0005, 0x00e6, 0x2071, - 0x1800, 0x080c, 0x10dc, 0x090c, 0x0dfa, 0x00ee, 0x0005, 0x0086, - 0x00e6, 0x0006, 0x0026, 0x0036, 0x0126, 0x2091, 0x8000, 0x00c9, - 0x2071, 0x1800, 0x73bc, 0x702c, 0x9016, 0x9045, 0x0158, 0x8210, - 0x9906, 0x090c, 0x0dfa, 0x2300, 0x9202, 0x0120, 0x1a0c, 0x0dfa, - 0xa000, 0x0c98, 0x012e, 0x003e, 0x002e, 0x000e, 0x00ee, 0x008e, - 0x0005, 0x0086, 0x00e6, 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, - 0x190e, 0x7010, 0x9005, 0x0140, 0x7018, 0x9045, 0x0128, 0x9906, - 0x090c, 0x0dfa, 0xa000, 0x0cc8, 0x012e, 0x000e, 0x00ee, 0x008e, - 0x0005, 0x00e6, 0x2071, 0x1800, 0x0126, 0x2091, 0x8000, 0x70bc, - 0x8001, 0x0270, 0x70be, 0x702c, 0x2048, 0x9085, 0x0001, 0xa800, - 0x702e, 0xa803, 0x0000, 0xa807, 0x0000, 0x012e, 0x00ee, 0x0005, - 0x904e, 0x0cd8, 0x00e6, 0x0126, 0x2091, 0x8000, 0x2071, 0x1800, - 0x70bc, 0x90ca, 0x0040, 0x0268, 0x8001, 0x70be, 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, 0x70bc, 0x8000, 0x70be, - 0x080c, 0x81f0, 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, 0x188b, 0x7000, 0x9005, - 0x11a0, 0x2001, 0x0492, 0xa802, 0x2048, 0x2009, 0x2480, 0x8940, - 0x2800, 0xa802, 0xa95e, 0xa863, 0x0001, 0x8420, 0x9886, 0x0800, - 0x0120, 0x2848, 0x9188, 0x0040, 0x0c90, 0x2071, 0x188b, 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, 0x74ba, 0x74be, 0x0005, 0x00e6, 0x0016, 0x9984, 0xfc00, - 0x01e8, 0x908c, 0xf800, 0x1168, 0x9982, 0x0400, 0x02b8, 0x9982, - 0x0440, 0x0278, 0x9982, 0x0492, 0x0288, 0x9982, 0x0800, 0x1270, - 0x0040, 0x9982, 0x0800, 0x0250, 0x2071, 0x188b, 0x7010, 0x9902, - 0x1228, 0x9085, 0x0001, 0x001e, 0x00ee, 0x0005, 0x9006, 0x0cd8, - 0x00e6, 0x2071, 0x19f0, 0x7007, 0x0000, 0x9006, 0x701e, 0x7022, - 0x7002, 0x2071, 0x0000, 0x7010, 0x9085, 0x8044, 0x7012, 0x2071, - 0x0080, 0x9006, 0x0006, 0x2001, 0x0100, 0x2004, 0x9086, 0x000a, - 0x000e, 0x1158, 0x702b, 0x0060, 0x20a9, 0x0040, 0x7022, 0x1f04, - 0x111e, 0x702b, 0x0060, 0x702b, 0x0020, 0x20a9, 0x0040, 0x7022, - 0x1f04, 0x1127, 0x702b, 0x0020, 0x00ee, 0x0005, 0x0126, 0x2091, - 0x8000, 0x00e6, 0xa06f, 0x0000, 0x2071, 0x19f0, 0x701c, 0x9088, - 0x19fa, 0x280a, 0x8000, 0x9084, 0x003f, 0x701e, 0x7120, 0x9106, - 0x090c, 0x0dfa, 0x7004, 0x9005, 0x1128, 0x00f6, 0x2079, 0x0080, - 0x00a9, 0x00fe, 0x00ee, 0x012e, 0x0005, 0x0126, 0x2091, 0x8000, - 0x00e6, 0x2071, 0x19f0, 0x7004, 0x9005, 0x1128, 0x00f6, 0x2079, - 0x0080, 0x0021, 0x00fe, 0x00ee, 0x012e, 0x0005, 0x7004, 0x9086, - 0x0000, 0x1110, 0x7007, 0x0006, 0x7000, 0x0002, 0x1170, 0x116e, - 0x116e, 0x116e, 0x12e7, 0x12e7, 0x12e7, 0x12e7, 0x080c, 0x0dfa, - 0x701c, 0x7120, 0x9106, 0x1148, 0x792c, 0x9184, 0x0001, 0x1120, - 0xd1fc, 0x1110, 0x7007, 0x0000, 0x0005, 0x0096, 0x9180, 0x19fa, - 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, 0x19f0, 0x2104, 0xc095, 0x200a, 0x080c, 0x114d, 0x0005, - 0x0016, 0x00e6, 0x2071, 0x19f0, 0x00f6, 0x2079, 0x0080, 0x792c, - 0xd1bc, 0x190c, 0x0df3, 0x782b, 0x0002, 0xd1fc, 0x0120, 0x918c, - 0x0700, 0x7004, 0x0023, 0x00fe, 0x00ee, 0x001e, 0x0005, 0x115e, - 0x1206, 0x123a, 0x0dfa, 0x0dfa, 0x12f3, 0x0dfa, 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, 0x11a3, 0x0005, - 0x7008, 0x0096, 0x2048, 0xa86f, 0x0100, 0x009e, 0x7007, 0x0000, - 0x080c, 0x115e, 0x0005, 0x7008, 0x0096, 0x2048, 0xa86f, 0x0200, - 0x009e, 0x0ca0, 0x918c, 0x0700, 0x1150, 0x700c, 0x9005, 0x0180, - 0x7800, 0x7802, 0x7804, 0x7806, 0x080c, 0x11b8, 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, 0x18b7, 0x2004, 0x9906, - 0x1128, 0xa89c, 0x080f, 0x00de, 0x009e, 0x00a0, 0x00de, 0x009e, - 0x0096, 0x00d6, 0x7008, 0x2048, 0x0081, 0x0150, 0xa89c, 0x0086, - 0x2940, 0x080f, 0x008e, 0x00de, 0x009e, 0x080c, 0x114d, 0x0005, - 0x00de, 0x009e, 0x080c, 0x114d, 0x0005, 0xa8a8, 0xd08c, 0x0005, - 0x0096, 0xa0a0, 0x904d, 0x090c, 0x0dfa, 0xa06c, 0x908e, 0x0100, - 0x0130, 0xa87b, 0x0030, 0xa883, 0x0000, 0xa897, 0x4002, 0x080c, - 0x6adc, 0xa09f, 0x0000, 0xa0a3, 0x0000, 0x2848, 0x080c, 0x1063, - 0x009e, 0x0005, 0x00a6, 0xa0a0, 0x904d, 0x090c, 0x0dfa, 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, 0x112e, 0x00e8, - 0xa97c, 0xa894, 0x0016, 0x0006, 0x080c, 0x6adc, 0x000e, 0x001e, - 0xd1fc, 0x1138, 0xd1f4, 0x0128, 0x00c6, 0x2060, 0x080c, 0xa0e3, - 0x00ce, 0x7008, 0x2048, 0xa89f, 0x0000, 0xa8a3, 0x0000, 0x080c, - 0x1063, 0x7007, 0x0000, 0x080c, 0x114d, 0x00ae, 0x0005, 0x0126, - 0x2091, 0x8000, 0x782b, 0x1001, 0x7007, 0x0005, 0x7000, 0xc094, - 0x7002, 0x012e, 0x0005, 0x7007, 0x0000, 0x080c, 0x115e, 0x0005, - 0x0126, 0x2091, 0x2200, 0x2079, 0x0300, 0x2071, 0x1a3a, 0x7003, - 0x0000, 0x78bf, 0x00f6, 0x781b, 0x4800, 0x0419, 0x7803, 0x0003, - 0x780f, 0x0000, 0x2001, 0x0100, 0x2004, 0x9086, 0x000a, 0x0128, - 0x20a9, 0x0254, 0x2061, 0xdc42, 0x0020, 0x20a9, 0x0241, 0x2061, - 0xe0e8, 0x2c0d, 0x7912, 0xe104, 0x9ce0, 0x0002, 0x7916, 0x1f04, - 0x1319, 0x7807, 0x0007, 0x7803, 0x0000, 0x7803, 0x0001, 0x012e, - 0x0005, 0x00c6, 0x7803, 0x0000, 0x7808, 0xd09c, 0x0110, 0x7820, - 0x0cd8, 0x2001, 0x1a3b, 0x2003, 0x0000, 0x78ab, 0x0004, 0x78ac, - 0xd0ac, 0x1de8, 0x78ab, 0x0002, 0x7807, 0x0007, 0x7827, 0x0030, - 0x782b, 0x0400, 0x7827, 0x0031, 0x782b, 0x1a5c, 0x781f, 0xff00, - 0x781b, 0xb700, 0x2001, 0x0200, 0x2004, 0xd0dc, 0x0110, 0x781f, - 0x0303, 0x2061, 0x1a5c, 0x602f, 0x1cd0, 0x2001, 0x1819, 0x2004, - 0x9082, 0x1cd0, 0x6032, 0x603b, 0x1fc8, 0x2001, 0x32e9, 0xd0fc, - 0x190c, 0x0dfa, 0x2001, 0x0003, 0x2004, 0xd0d4, 0x1118, 0x783f, - 0x32e9, 0x0020, 0x9084, 0xc000, 0x783f, 0xb2e9, 0x00ce, 0x0005, - 0x0126, 0x2091, 0x2200, 0x7908, 0x9184, 0x0070, 0x190c, 0x0df3, - 0xd19c, 0x0158, 0x7820, 0x908c, 0xf000, 0x15e8, 0x908a, 0x0024, - 0x1a0c, 0x0dfa, 0x0023, 0x012e, 0x0005, 0x012e, 0x0005, 0x13ab, - 0x13ab, 0x13c2, 0x13c7, 0x13cb, 0x13d0, 0x13f8, 0x13fc, 0x140a, - 0x140e, 0x13ab, 0x149a, 0x149e, 0x150e, 0x13ab, 0x13ab, 0x13ab, - 0x13ab, 0x13ab, 0x13ab, 0x13ab, 0x13ab, 0x13ab, 0x13ab, 0x13ab, - 0x13ab, 0x13ab, 0x13d2, 0x13ab, 0x13ab, 0x13ab, 0x13ab, 0x13ab, - 0x13ab, 0x13af, 0x13ad, 0x080c, 0x0dfa, 0x080c, 0x0df3, 0x080c, - 0x1515, 0x2009, 0x1a52, 0x2104, 0x8000, 0x200a, 0x080c, 0x7c6d, - 0x080c, 0x19ff, 0x0005, 0x2009, 0x0048, 0x2060, 0x080c, 0xa15d, - 0x012e, 0x0005, 0x7004, 0xc085, 0xc0b5, 0x7006, 0x0005, 0x7004, - 0xc085, 0x7006, 0x0005, 0x080c, 0x1515, 0x080c, 0x166e, 0x0005, - 0x080c, 0x0dfa, 0x080c, 0x1515, 0x2060, 0x6014, 0x0096, 0x2048, - 0xa83b, 0xffff, 0x009e, 0x2009, 0x0048, 0x080c, 0xa15d, 0x2001, - 0x015d, 0x2003, 0x0000, 0x2009, 0x03e8, 0x8109, 0x0160, 0x2001, - 0x0201, 0x2004, 0x9005, 0x0dc8, 0x2001, 0x0218, 0x2004, 0xd0ec, - 0x1110, 0x080c, 0x151a, 0x2001, 0x0307, 0x2003, 0x8000, 0x0005, - 0x7004, 0xc095, 0x7006, 0x0005, 0x080c, 0x1515, 0x2060, 0x6014, - 0x0096, 0x2048, 0xa83b, 0xffff, 0x009e, 0x2009, 0x0048, 0x080c, - 0xa15d, 0x0005, 0x080c, 0x1515, 0x080c, 0x0dfa, 0x080c, 0x1515, - 0x080c, 0x1485, 0x7827, 0x0018, 0x79ac, 0xd1dc, 0x0540, 0x7827, - 0x0015, 0x7828, 0x782b, 0x0000, 0x9065, 0x0138, 0x2001, 0x020d, - 0x2003, 0x0050, 0x2003, 0x0020, 0x0400, 0x7004, 0x9005, 0x1180, - 0x78ab, 0x0004, 0x7827, 0x0018, 0x782b, 0x0000, 0xd1bc, 0x090c, - 0x0dfa, 0x2001, 0x020d, 0x2003, 0x0050, 0x2003, 0x0020, 0x0490, - 0x78ab, 0x0004, 0x7803, 0x0001, 0x080c, 0x149e, 0x0005, 0x7828, - 0x782b, 0x0000, 0x9065, 0x090c, 0x0dfa, 0x6014, 0x2048, 0x78ab, - 0x0004, 0x918c, 0x0700, 0x01a8, 0x080c, 0x7c6d, 0x080c, 0x19ff, - 0x080c, 0xbe37, 0x0158, 0xa9ac, 0xa936, 0xa9b0, 0xa93a, 0xa83f, - 0xffff, 0xa843, 0xffff, 0xa880, 0xc0bd, 0xa882, 0x080c, 0xba56, - 0x0005, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x6024, - 0x190c, 0xc223, 0x2029, 0x00c8, 0x8529, 0x0128, 0x2001, 0x0201, - 0x2004, 0x9005, 0x0dc8, 0x7dbc, 0x080c, 0xdbeb, 0xd5a4, 0x1118, - 0x080c, 0x151a, 0x0005, 0x080c, 0x7c6d, 0x080c, 0x19ff, 0x0005, - 0x781f, 0x0300, 0x7803, 0x0001, 0x0005, 0x0016, 0x0066, 0x0076, - 0x00f6, 0x2079, 0x0300, 0x7908, 0x918c, 0x0007, 0x9186, 0x0003, - 0x0120, 0x2001, 0x0016, 0x080c, 0x158b, 0x00fe, 0x007e, 0x006e, - 0x001e, 0x0005, 0x7004, 0xc09d, 0x7006, 0x0005, 0x7104, 0x9184, - 0x0004, 0x190c, 0x0dfa, 0xd184, 0x11b1, 0xd19c, 0x0180, 0xc19c, - 0x7106, 0x0016, 0x080c, 0x1651, 0x001e, 0x0148, 0x2001, 0x020d, - 0x2003, 0x0050, 0x2003, 0x0020, 0x080c, 0x151a, 0x0005, 0x81ff, - 0x190c, 0x0dfa, 0x0005, 0x2100, 0xc184, 0xc1b4, 0x7106, 0xd0b4, - 0x0016, 0x00e6, 0x1904, 0x1503, 0x2071, 0x0200, 0x080c, 0x1645, - 0x080c, 0x1651, 0x05a8, 0x6014, 0x9005, 0x05a8, 0x0096, 0x2048, - 0xa864, 0x009e, 0x9084, 0x00ff, 0x908e, 0x0029, 0x0160, 0x908e, - 0x0048, 0x1548, 0x601c, 0xd084, 0x11d8, 0x00f6, 0x2c78, 0x080c, - 0x16db, 0x00fe, 0x00a8, 0x00f6, 0x2c78, 0x080c, 0x1825, 0x00fe, - 0x2009, 0x01f4, 0x8109, 0x0160, 0x2001, 0x0201, 0x2004, 0x9005, - 0x0dc8, 0x2001, 0x0218, 0x2004, 0xd0ec, 0x1110, 0x0419, 0x0040, - 0x2001, 0x020d, 0x2003, 0x0020, 0x080c, 0x1329, 0x7803, 0x0001, - 0x00ee, 0x001e, 0x0005, 0x080c, 0x1651, 0x0dd0, 0x2001, 0x020d, - 0x2003, 0x0050, 0x2003, 0x0020, 0x0069, 0x0c90, 0x0031, 0x2060, - 0x2009, 0x0053, 0x080c, 0xa15d, 0x0005, 0x7808, 0xd09c, 0x0de8, - 0x7820, 0x0005, 0x080c, 0x1485, 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, 0x157d, 0x6827, 0x0001, 0x8109, - 0x1dd0, 0x04d9, 0x6827, 0x0002, 0x04c1, 0x6804, 0x9005, 0x1130, - 0x682c, 0xd0e4, 0x1500, 0x6804, 0x9005, 0x0de8, 0x79b8, 0xd1ec, - 0x1130, 0x08c0, 0x080c, 0x7c6d, 0x080c, 0x19ff, 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, 0x1370, 0x00ce, - 0x002e, 0x001e, 0x000e, 0x0006, 0x7832, 0x7936, 0x7a3a, 0x781b, - 0x8080, 0x0059, 0x1118, 0x000e, 0x00fe, 0x0005, 0x000e, 0x792c, - 0x3900, 0x8000, 0x2004, 0x080c, 0x0dfa, 0x2009, 0x180c, 0x2104, - 0xc0f4, 0x200a, 0x2009, 0xff00, 0x8109, 0x0904, 0x1609, 0x7a18, - 0x9284, 0x0030, 0x0904, 0x1604, 0x9284, 0x0048, 0x9086, 0x0008, - 0x1904, 0x1604, 0x2001, 0x0109, 0x2004, 0xd08c, 0x01f0, 0x0006, - 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x0126, 0x2091, 0x2800, - 0x00f6, 0x0026, 0x0016, 0x2009, 0x1a55, 0x2104, 0x8000, 0x0208, - 0x200a, 0x080c, 0x8632, 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, 0x1a56, 0x2104, 0x8000, 0x0208, - 0x200a, 0x080c, 0x1dec, 0x001e, 0x00fe, 0x015e, 0x014e, 0x013e, - 0x01de, 0x01ce, 0x012e, 0x000e, 0x7818, 0xd0bc, 0x1904, 0x15b4, - 0x0005, 0x2001, 0x180c, 0x2004, 0xd0f4, 0x1528, 0x7a18, 0x9284, - 0x0030, 0x0508, 0x9284, 0x0048, 0x9086, 0x0008, 0x11e0, 0x2001, - 0x19ce, 0x2004, 0x9005, 0x01b8, 0x2001, 0x1a3d, 0x2004, 0x9086, - 0x0000, 0x0188, 0x2009, 0x1a54, 0x2104, 0x8000, 0x0208, 0x200a, - 0x080c, 0x96d4, 0x2009, 0x180c, 0x2104, 0xc0f5, 0x200a, 0x2009, - 0xff00, 0x0804, 0x15b4, 0x9085, 0x0001, 0x0005, 0x7832, 0x7936, - 0x7a3a, 0x781b, 0x8080, 0x080c, 0x15ad, 0x1108, 0x0005, 0x792c, - 0x3900, 0x8000, 0x2004, 0x080c, 0x0dfa, 0x7037, 0x0001, 0x7150, - 0x7037, 0x0002, 0x7050, 0x2060, 0xd1bc, 0x1110, 0x7054, 0x2060, - 0x0005, 0x0006, 0x0046, 0x00e6, 0x2071, 0x0200, 0x7037, 0x0002, - 0x7058, 0x9084, 0xff00, 0x8007, 0x9086, 0x00bc, 0x1158, 0x2021, - 0x1a53, 0x2404, 0x8000, 0x0208, 0x2022, 0x080c, 0x7c6d, 0x080c, - 0x19ff, 0x9006, 0x00ee, 0x004e, 0x000e, 0x0005, 0x0c11, 0x1108, - 0x0005, 0x00e6, 0x0016, 0x2071, 0x0200, 0x0879, 0x6124, 0xd1dc, - 0x01f8, 0x701c, 0xd08c, 0x0904, 0x16d0, 0x7017, 0x0000, 0x2001, - 0x0264, 0x2004, 0xd0bc, 0x0904, 0x16d0, 0x2001, 0x0268, 0x00c6, - 0x2064, 0x6104, 0x6038, 0x00ce, 0x918e, 0x0039, 0x1904, 0x16d0, - 0x9c06, 0x15f0, 0x0126, 0x2091, 0x2600, 0x080c, 0x7bb4, 0x012e, - 0x7358, 0x745c, 0x6014, 0x905d, 0x0598, 0x2b48, 0x6010, 0x00b6, - 0x2058, 0xb800, 0x00be, 0xd0bc, 0x190c, 0xc1fe, 0xab42, 0xac3e, - 0x2001, 0x187d, 0x2004, 0xd0b4, 0x1170, 0x601c, 0xd0e4, 0x1158, - 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x1120, 0xa83b, - 0x7fff, 0xa837, 0xffff, 0x080c, 0x1fe8, 0x1190, 0x080c, 0x1882, - 0x2a00, 0xa816, 0x0130, 0x2800, 0xa80e, 0x2c05, 0xa80a, 0x2c00, - 0xa812, 0x7037, 0x0020, 0x781f, 0x0300, 0x001e, 0x00ee, 0x0005, - 0x7037, 0x0050, 0x7037, 0x0020, 0x001e, 0x00ee, 0x080c, 0x151a, - 0x0005, 0x080c, 0x0dfa, 0x0016, 0x2009, 0x00a0, 0x8109, 0xa001, - 0xa001, 0xa001, 0x1dd8, 0x001e, 0x2ff0, 0x0126, 0x2091, 0x2200, - 0x0016, 0x00c6, 0x3e60, 0x6014, 0x2048, 0x2940, 0x903e, 0x2730, - 0xa864, 0x2068, 0xa81a, 0x9d84, 0x000f, 0x9088, 0x1fc8, 0x2165, - 0x0002, 0x1710, 0x175d, 0x1710, 0x1710, 0x1710, 0x173f, 0x1710, - 0x1714, 0x1709, 0x1754, 0x1710, 0x1710, 0x1710, 0x181a, 0x1728, - 0x171e, 0xa964, 0x918c, 0x00ff, 0x918e, 0x0048, 0x0904, 0x1754, - 0x9085, 0x0001, 0x0804, 0x1810, 0xa87c, 0xd0bc, 0x0dc8, 0xa890, - 0xa842, 0xa88c, 0xa83e, 0xa888, 0x0804, 0x1764, 0xa87c, 0xd0bc, - 0x0d78, 0xa890, 0xa842, 0xa88c, 0xa83e, 0xa888, 0x0804, 0x17b3, - 0xa87c, 0xd0bc, 0x0d28, 0xa890, 0xa842, 0xa88c, 0xa83e, 0xa804, - 0x9045, 0x090c, 0x0dfa, 0xa164, 0xa91a, 0x91ec, 0x000f, 0x9d80, - 0x1fc8, 0x2065, 0xa888, 0xd19c, 0x1904, 0x17b3, 0x0428, 0xa87c, - 0xd0ac, 0x0970, 0xa804, 0x9045, 0x090c, 0x0dfa, 0xa164, 0xa91a, - 0x91ec, 0x000f, 0x9d80, 0x1fc8, 0x2065, 0x9006, 0xa842, 0xa83e, - 0xd19c, 0x1904, 0x17b3, 0x0080, 0xa87c, 0xd0ac, 0x0904, 0x1710, - 0x9006, 0xa842, 0xa83e, 0x0804, 0x17b3, 0xa87c, 0xd0ac, 0x0904, - 0x1710, 0x9006, 0xa842, 0xa83e, 0x2c05, 0x908a, 0x0036, 0x1a0c, - 0x0dfa, 0x9082, 0x001b, 0x0002, 0x1787, 0x1787, 0x1789, 0x1787, - 0x1787, 0x1787, 0x178f, 0x1787, 0x1787, 0x1787, 0x1795, 0x1787, - 0x1787, 0x1787, 0x179b, 0x1787, 0x1787, 0x1787, 0x17a1, 0x1787, - 0x1787, 0x1787, 0x17a7, 0x1787, 0x1787, 0x1787, 0x17ad, 0x080c, - 0x0dfa, 0xa574, 0xa478, 0xa37c, 0xa280, 0x0804, 0x17f8, 0xa584, - 0xa488, 0xa38c, 0xa290, 0x0804, 0x17f8, 0xa594, 0xa498, 0xa39c, - 0xa2a0, 0x0804, 0x17f8, 0xa5a4, 0xa4a8, 0xa3ac, 0xa2b0, 0x0804, - 0x17f8, 0xa5b4, 0xa4b8, 0xa3bc, 0xa2c0, 0x0804, 0x17f8, 0xa5c4, - 0xa4c8, 0xa3cc, 0xa2d0, 0x0804, 0x17f8, 0xa5d4, 0xa4d8, 0xa3dc, - 0xa2e0, 0x0804, 0x17f8, 0x2c05, 0x908a, 0x0034, 0x1a0c, 0x0dfa, - 0x9082, 0x001b, 0x0002, 0x17d6, 0x17d4, 0x17d4, 0x17d4, 0x17d4, - 0x17d4, 0x17dd, 0x17d4, 0x17d4, 0x17d4, 0x17d4, 0x17d4, 0x17e4, - 0x17d4, 0x17d4, 0x17d4, 0x17d4, 0x17d4, 0x17eb, 0x17d4, 0x17d4, - 0x17d4, 0x17d4, 0x17d4, 0x17f2, 0x080c, 0x0dfa, 0xa56c, 0xa470, - 0xa774, 0xa678, 0xa37c, 0xa280, 0x00d8, 0xa584, 0xa488, 0xa78c, - 0xa690, 0xa394, 0xa298, 0x00a0, 0xa59c, 0xa4a0, 0xa7a4, 0xa6a8, - 0xa3ac, 0xa2b0, 0x0068, 0xa5b4, 0xa4b8, 0xa7bc, 0xa6c0, 0xa3c4, - 0xa2c8, 0x0030, 0xa5cc, 0xa4d0, 0xa7d4, 0xa6d8, 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, 0x1710, 0x0016, 0x2009, 0x00a0, 0x8109, - 0xa001, 0xa001, 0xa001, 0x1dd8, 0x001e, 0x2ff0, 0x0126, 0x2091, - 0x2200, 0x0016, 0x00c6, 0x3e60, 0x6014, 0x2048, 0x2940, 0xa80e, - 0x2061, 0x1fc3, 0xa813, 0x1fc3, 0x2c05, 0xa80a, 0xa964, 0xa91a, - 0xa87c, 0xd0ac, 0x090c, 0x0dfa, 0x9006, 0xa842, 0xa83e, 0x2c05, - 0x908a, 0x0034, 0x1a0c, 0x0dfa, 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, 0x0dfa, 0xa80e, 0xa064, 0xa81a, 0x9084, 0x000f, - 0x9080, 0x1fc8, 0x2015, 0x82ff, 0x090c, 0x0dfa, 0xaa12, 0x2205, - 0xa80a, 0x0c08, 0x903e, 0x2730, 0xa880, 0xd0fc, 0x1190, 0x2d00, - 0x0002, 0x1977, 0x18d9, 0x18d9, 0x1977, 0x1977, 0x1971, 0x1977, - 0x18d9, 0x1928, 0x1928, 0x1928, 0x1977, 0x1977, 0x1977, 0x196e, - 0x1928, 0xc0fc, 0xa882, 0xab2c, 0xaa30, 0xad1c, 0xac20, 0xdd9c, - 0x0904, 0x1979, 0x2c05, 0x908a, 0x0034, 0x1a0c, 0x0dfa, 0x9082, - 0x001b, 0x0002, 0x18c5, 0x18c3, 0x18c3, 0x18c3, 0x18c3, 0x18c3, - 0x18c9, 0x18c3, 0x18c3, 0x18c3, 0x18c3, 0x18c3, 0x18cd, 0x18c3, - 0x18c3, 0x18c3, 0x18c3, 0x18c3, 0x18d1, 0x18c3, 0x18c3, 0x18c3, - 0x18c3, 0x18c3, 0x18d5, 0x080c, 0x0dfa, 0xa774, 0xa678, 0x0804, - 0x1979, 0xa78c, 0xa690, 0x0804, 0x1979, 0xa7a4, 0xa6a8, 0x0804, - 0x1979, 0xa7bc, 0xa6c0, 0x0804, 0x1979, 0xa7d4, 0xa6d8, 0x0804, - 0x1979, 0x2c05, 0x908a, 0x0036, 0x1a0c, 0x0dfa, 0x9082, 0x001b, - 0x0002, 0x18fc, 0x18fc, 0x18fe, 0x18fc, 0x18fc, 0x18fc, 0x1904, - 0x18fc, 0x18fc, 0x18fc, 0x190a, 0x18fc, 0x18fc, 0x18fc, 0x1910, - 0x18fc, 0x18fc, 0x18fc, 0x1916, 0x18fc, 0x18fc, 0x18fc, 0x191c, - 0x18fc, 0x18fc, 0x18fc, 0x1922, 0x080c, 0x0dfa, 0xa574, 0xa478, - 0xa37c, 0xa280, 0x0804, 0x1979, 0xa584, 0xa488, 0xa38c, 0xa290, - 0x0804, 0x1979, 0xa594, 0xa498, 0xa39c, 0xa2a0, 0x0804, 0x1979, - 0xa5a4, 0xa4a8, 0xa3ac, 0xa2b0, 0x0804, 0x1979, 0xa5b4, 0xa4b8, - 0xa3bc, 0xa2c0, 0x0804, 0x1979, 0xa5c4, 0xa4c8, 0xa3cc, 0xa2d0, - 0x0804, 0x1979, 0xa5d4, 0xa4d8, 0xa3dc, 0xa2e0, 0x0804, 0x1979, - 0x2c05, 0x908a, 0x0034, 0x1a0c, 0x0dfa, 0x9082, 0x001b, 0x0002, - 0x194b, 0x1949, 0x1949, 0x1949, 0x1949, 0x1949, 0x1952, 0x1949, - 0x1949, 0x1949, 0x1949, 0x1949, 0x1959, 0x1949, 0x1949, 0x1949, - 0x1949, 0x1949, 0x1960, 0x1949, 0x1949, 0x1949, 0x1949, 0x1949, - 0x1967, 0x080c, 0x0dfa, 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, 0x1f80, 0x1904, 0x1882, 0x900e, 0x0050, 0x080c, - 0x0dfa, 0xab2e, 0xaa32, 0xad1e, 0xac22, 0xaf26, 0xae2a, 0x080c, - 0x1f80, 0x0005, 0x6014, 0x2048, 0x6118, 0x810c, 0x810c, 0x810c, + 0xfbcf, 0x7852, 0x080c, 0x2a97, 0x9085, 0x2000, 0x7852, 0x793a, + 0x20a9, 0x0046, 0x1d04, 0x0c62, 0x080c, 0x830d, 0x1f04, 0x0c62, + 0x7850, 0x9085, 0x0400, 0x9084, 0xdfbf, 0x7852, 0x793a, 0x0040, + 0x20a9, 0x003a, 0x1d04, 0x0c72, 0x080c, 0x830d, 0x1f04, 0x0c72, + 0x080c, 0x718f, 0x0148, 0x080c, 0x71a1, 0x1118, 0x080c, 0x7489, + 0x0050, 0x080c, 0x7186, 0x0dd0, 0x080c, 0x7484, 0x080c, 0x747a, + 0x080c, 0x709e, 0x0020, 0x2009, 0x00f8, 0x080c, 0x5dab, 0x2001, + 0x0100, 0x2004, 0x9086, 0x000a, 0x0168, 0x20a9, 0x0028, 0xa001, + 0x1f04, 0x0c97, 0x7850, 0x9085, 0x1400, 0x7852, 0x080c, 0x717e, + 0x0158, 0x0030, 0x7850, 0xc0e5, 0x7852, 0x080c, 0x717e, 0x0120, + 0x7843, 0x0090, 0x7843, 0x0010, 0x2021, 0xe678, 0x2019, 0xea60, + 0x0d0c, 0x830d, 0x7820, 0xd09c, 0x1590, 0x080c, 0x717e, 0x0904, + 0x0d13, 0x7824, 0xd0ac, 0x1904, 0x0d34, 0x080c, 0x71a1, 0x1538, + 0x0046, 0x2021, 0x0320, 0x8421, 0x1df0, 0x004e, 0x7827, 0x1800, + 0x080c, 0x2a97, 0x7824, 0x9084, 0x1800, 0x1168, 0x9484, 0x0fff, + 0x1140, 0x2001, 0x1810, 0x2004, 0x9084, 0x9000, 0x0110, 0x080c, + 0x0d64, 0x8421, 0x1160, 0x1d04, 0x0cdf, 0x080c, 0x830d, 0x080c, + 0x7484, 0x080c, 0x747a, 0x7003, 0x0001, 0x0804, 0x0d34, 0x8319, + 0x1938, 0x2001, 0x0100, 0x2004, 0x9086, 0x000a, 0x1140, 0x2001, + 0x1810, 0x2004, 0x9084, 0x9000, 0x0110, 0x080c, 0x0d64, 0x1d04, + 0x0cfb, 0x080c, 0x830d, 0x2009, 0x1975, 0x2104, 0x9005, 0x0118, + 0x8001, 0x200a, 0x1178, 0x200b, 0x000a, 0x7827, 0x0048, 0x20a9, + 0x0002, 0x080c, 0x2a78, 0x7924, 0x080c, 0x2a97, 0xd19c, 0x0110, + 0x080c, 0x2974, 0x00e0, 0x080c, 0x718f, 0x1140, 0x94a2, 0x03e8, + 0x1128, 0x080c, 0x7156, 0x7003, 0x0001, 0x00b0, 0x7827, 0x1800, + 0x080c, 0x2a97, 0x7824, 0x080c, 0x7198, 0x0110, 0xd0ac, 0x1160, + 0x9084, 0x1800, 0x0904, 0x0ce7, 0x7003, 0x0001, 0x0028, 0x2001, + 0x0001, 0x080c, 0x2616, 0x00c0, 0x2001, 0x0100, 0x2004, 0x9086, + 0x000a, 0x1118, 0x7850, 0xc0e4, 0x7852, 0x2009, 0x180c, 0x210c, + 0xd19c, 0x1120, 0x7904, 0x918d, 0x0002, 0x7906, 0x7827, 0x0048, + 0x7828, 0x9085, 0x0028, 0x782a, 0x2001, 0x0100, 0x2004, 0x9086, + 0x000a, 0x0120, 0x7850, 0x9085, 0x0400, 0x7852, 0x2001, 0x1982, + 0x2003, 0x0000, 0x9006, 0x78f2, 0x015e, 0x003e, 0x000e, 0x012e, + 0x00fe, 0x004e, 0x001e, 0x0005, 0x0006, 0x0016, 0x0036, 0x0046, + 0x00b6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x0156, 0x0069, 0x0d0c, + 0x830d, 0x015e, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, 0x004e, + 0x003e, 0x001e, 0x000e, 0x0005, 0x00e6, 0x2071, 0x189c, 0x7004, + 0x9086, 0x0001, 0x1110, 0x080c, 0x331a, 0x00ee, 0x0005, 0x0005, + 0x2a70, 0x2061, 0x1986, 0x2063, 0x0003, 0x6007, 0x0003, 0x600b, + 0x0012, 0x600f, 0x0317, 0x2001, 0x1956, 0x900e, 0x2102, 0x7192, + 0x2001, 0x0100, 0x2004, 0x9082, 0x0002, 0x0218, 0x705b, 0xffff, + 0x0008, 0x715a, 0x7063, 0xffff, 0x717a, 0x717e, 0x080c, 0xc1a1, + 0x70e7, 0x00c0, 0x2061, 0x1946, 0x6003, 0x0909, 0x6106, 0x600b, + 0x8800, 0x600f, 0x0200, 0x6013, 0x00ff, 0x6017, 0x000f, 0x611a, + 0x601f, 0x07d0, 0x2061, 0x194e, 0x6003, 0x8000, 0x6106, 0x610a, + 0x600f, 0x0200, 0x6013, 0x00ff, 0x6116, 0x601b, 0x0001, 0x611e, + 0x2061, 0x1963, 0x6003, 0x514c, 0x6007, 0x4f47, 0x600b, 0x4943, + 0x600f, 0x2020, 0x2001, 0x182b, 0x2102, 0x0005, 0x9016, 0x080c, + 0x63a3, 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, 0x0df8, 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, 0x1a7a, 0x7a08, 0x226a, 0x2069, 0x1a7b, 0x7a18, 0x226a, + 0x8d68, 0x7a1c, 0x226a, 0x782c, 0x2019, 0x1a88, 0x201a, 0x2019, + 0x1a8b, 0x9016, 0x7808, 0xd09c, 0x0168, 0x7820, 0x201a, 0x8210, + 0x8318, 0x9386, 0x1aa0, 0x0108, 0x0ca8, 0x7808, 0xd09c, 0x0110, + 0x2011, 0xdead, 0x2019, 0x1a89, 0x782c, 0x201a, 0x8318, 0x221a, + 0x7803, 0x0000, 0x2069, 0x1a5a, 0x901e, 0x20a9, 0x0020, 0x7b26, + 0x7a28, 0x226a, 0x8d68, 0x8318, 0x1f04, 0x0e4f, 0x002e, 0x003e, + 0x00de, 0x015e, 0x2079, 0x1800, 0x7803, 0x0005, 0x2091, 0x4080, + 0x2001, 0x0089, 0x2004, 0xd084, 0x0180, 0x2001, 0x19f6, 0x2004, + 0x9005, 0x0128, 0x2001, 0x008b, 0x2004, 0xd0fc, 0x0dd8, 0x2001, + 0x008a, 0x2003, 0x0002, 0x2003, 0x1001, 0x080c, 0x54ea, 0x1108, + 0x0099, 0x0cd8, 0x0005, 0x918c, 0x03ff, 0x2001, 0x0003, 0x2004, + 0x9084, 0x0600, 0x1118, 0x918d, 0x6c00, 0x0010, 0x918d, 0x6400, + 0x2001, 0x017f, 0x2102, 0x0005, 0x0026, 0x0126, 0x2011, 0x0080, + 0x080c, 0x0f17, 0x20a9, 0x0900, 0x080c, 0x0f38, 0x2011, 0x0040, + 0x080c, 0x0f17, 0x20a9, 0x0900, 0x080c, 0x0f38, 0x0c78, 0x0026, + 0x080c, 0x0f24, 0x1118, 0x2011, 0x0040, 0x0098, 0x2011, 0x010e, + 0x2214, 0x9294, 0x0007, 0x9296, 0x0007, 0x0118, 0x2011, 0xa880, + 0x0010, 0x2011, 0x6840, 0xd0e4, 0x70eb, 0x0000, 0x1120, 0x70eb, + 0x0fa0, 0x080c, 0x0f29, 0x002e, 0x0005, 0x0026, 0x080c, 0x0f24, + 0x0128, 0xd0a4, 0x1138, 0x2011, 0xcdd5, 0x0010, 0x2011, 0x0080, + 0x080c, 0x0f29, 0x002e, 0x0005, 0x0026, 0x70eb, 0x0000, 0x080c, + 0x0f24, 0x1148, 0x080c, 0x2a8f, 0x1118, 0x2011, 0x8484, 0x0058, + 0x2011, 0x8282, 0x0040, 0x080c, 0x2a8f, 0x1118, 0x2011, 0xcdc5, + 0x0010, 0x2011, 0xcac2, 0x080c, 0x0f29, 0x002e, 0x0005, 0x00e6, + 0x0006, 0x2071, 0x1800, 0xd0b4, 0x70e4, 0x1110, 0xc0e4, 0x0048, + 0x0006, 0x3b00, 0x9084, 0xff3f, 0x20d8, 0x000e, 0x70eb, 0x0000, + 0xc0e5, 0x0079, 0x000e, 0x00ee, 0x0005, 0x00e6, 0x2071, 0x1800, + 0xd0e4, 0x70e4, 0x1110, 0xc0dc, 0x0008, 0xc0dd, 0x0011, 0x00ee, + 0x0005, 0x70e6, 0x7000, 0x9084, 0x0007, 0x000b, 0x0005, 0x0ee6, + 0x0ebd, 0x0ebd, 0x0e9f, 0x0ecc, 0x0ebd, 0x0ebd, 0x0ecc, 0x0016, + 0x3b08, 0x3a00, 0x9104, 0x918d, 0x00c0, 0x21d8, 0x9084, 0xff3f, + 0x9205, 0x20d0, 0x001e, 0x0005, 0x2001, 0x1839, 0x2004, 0xd0dc, + 0x0005, 0x9e86, 0x1800, 0x190c, 0x0df6, 0x70e4, 0xd0e4, 0x0108, + 0xc2e5, 0x72e6, 0xd0e4, 0x1118, 0x9294, 0x00c0, 0x0c01, 0x0005, + 0x1d04, 0x0f38, 0x2091, 0x6000, 0x1f04, 0x0f38, 0x0005, 0x890e, + 0x810e, 0x810f, 0x9194, 0x003f, 0x918c, 0xffc0, 0x0005, 0x0006, + 0x2200, 0x914d, 0x894f, 0x894d, 0x894d, 0x000e, 0x0005, 0x01d6, + 0x0146, 0x0036, 0x0096, 0x2061, 0x188b, 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, 0x189b, 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, 0x0f3f, 0x2100, 0x9300, 0x2098, + 0x22e0, 0x009e, 0x002e, 0x001e, 0x0036, 0x3518, 0x20a9, 0x0001, + 0x4002, 0x8007, 0x4004, 0x8319, 0x1dd8, 0x003e, 0x0005, 0x20e9, + 0x0001, 0x71b4, 0x81ff, 0x11c0, 0x9006, 0x2009, 0x0200, 0x20a9, + 0x0002, 0x9298, 0x0018, 0x23a0, 0x4001, 0x2009, 0x0700, 0x20a9, + 0x0002, 0x9298, 0x0008, 0x23a0, 0x4001, 0x7078, 0x8007, 0x717c, + 0x810f, 0x20a9, 0x0002, 0x4001, 0x9298, 0x000c, 0x23a0, 0x900e, + 0x080c, 0x0dd6, 0x2001, 0x0000, 0x810f, 0x20a9, 0x0002, 0x4001, + 0x0005, 0x89ff, 0x0140, 0xa804, 0xa807, 0x0000, 0x0006, 0x080c, + 0x1069, 0x009e, 0x0cb0, 0x0005, 0x00e6, 0x2071, 0x1800, 0x080c, + 0x10e2, 0x090c, 0x0df6, 0x00ee, 0x0005, 0x0086, 0x00e6, 0x0006, + 0x0026, 0x0036, 0x0126, 0x2091, 0x8000, 0x00c9, 0x2071, 0x1800, + 0x73bc, 0x702c, 0x9016, 0x9045, 0x0158, 0x8210, 0x9906, 0x090c, + 0x0df6, 0x2300, 0x9202, 0x0120, 0x1a0c, 0x0df6, 0xa000, 0x0c98, + 0x012e, 0x003e, 0x002e, 0x000e, 0x00ee, 0x008e, 0x0005, 0x0086, + 0x00e6, 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, 0x190e, 0x7010, + 0x9005, 0x0140, 0x7018, 0x9045, 0x0128, 0x9906, 0x090c, 0x0df6, + 0xa000, 0x0cc8, 0x012e, 0x000e, 0x00ee, 0x008e, 0x0005, 0x00e6, + 0x2071, 0x1800, 0x0126, 0x2091, 0x8000, 0x70bc, 0x8001, 0x0270, + 0x70be, 0x702c, 0x2048, 0x9085, 0x0001, 0xa800, 0x702e, 0xa803, + 0x0000, 0xa807, 0x0000, 0x012e, 0x00ee, 0x0005, 0x904e, 0x0cd8, + 0x00e6, 0x0126, 0x2091, 0x8000, 0x2071, 0x1800, 0x70bc, 0x90ca, + 0x0040, 0x0268, 0x8001, 0x70be, 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, 0x70bc, 0x8000, 0x70be, 0x080c, 0x816f, + 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, 0x188b, 0x7000, 0x9005, 0x11a0, 0x2001, + 0x0492, 0xa802, 0x2048, 0x2009, 0x2480, 0x8940, 0x2800, 0xa802, + 0xa95e, 0xa863, 0x0001, 0x8420, 0x9886, 0x0800, 0x0120, 0x2848, + 0x9188, 0x0040, 0x0c90, 0x2071, 0x188b, 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, 0x74ba, + 0x74be, 0x0005, 0x00e6, 0x0016, 0x9984, 0xfc00, 0x01e8, 0x908c, + 0xf800, 0x1168, 0x9982, 0x0400, 0x02b8, 0x9982, 0x0440, 0x0278, + 0x9982, 0x0492, 0x0288, 0x9982, 0x0800, 0x1270, 0x0040, 0x9982, + 0x0800, 0x0250, 0x2071, 0x188b, 0x7010, 0x9902, 0x1228, 0x9085, + 0x0001, 0x001e, 0x00ee, 0x0005, 0x9006, 0x0cd8, 0x00e6, 0x2071, + 0x19f5, 0x7007, 0x0000, 0x9006, 0x701e, 0x7022, 0x7002, 0x2071, + 0x0000, 0x7010, 0x9085, 0x8044, 0x7012, 0x2071, 0x0080, 0x9006, + 0x0006, 0x2001, 0x0100, 0x2004, 0x9086, 0x000a, 0x000e, 0x1158, + 0x702b, 0x0060, 0x20a9, 0x0040, 0x7022, 0x1f04, 0x1124, 0x702b, + 0x0060, 0x702b, 0x0020, 0x20a9, 0x0040, 0x7022, 0x1f04, 0x112d, + 0x702b, 0x0020, 0x00ee, 0x0005, 0x0126, 0x2091, 0x8000, 0x00e6, + 0xa06f, 0x0000, 0x2071, 0x19f5, 0x701c, 0x9088, 0x19ff, 0x280a, + 0x8000, 0x9084, 0x003f, 0x701e, 0x7120, 0x9106, 0x090c, 0x0df6, + 0x7004, 0x9005, 0x1128, 0x00f6, 0x2079, 0x0080, 0x00a9, 0x00fe, + 0x00ee, 0x012e, 0x0005, 0x0126, 0x2091, 0x8000, 0x00e6, 0x2071, + 0x19f5, 0x7004, 0x9005, 0x1128, 0x00f6, 0x2079, 0x0080, 0x0021, + 0x00fe, 0x00ee, 0x012e, 0x0005, 0x7004, 0x9086, 0x0000, 0x1110, + 0x7007, 0x0006, 0x7000, 0x0002, 0x1176, 0x1174, 0x1174, 0x1174, + 0x12ed, 0x12ed, 0x12ed, 0x12ed, 0x080c, 0x0df6, 0x701c, 0x7120, + 0x9106, 0x1148, 0x792c, 0x9184, 0x0001, 0x1120, 0xd1fc, 0x1110, + 0x7007, 0x0000, 0x0005, 0x0096, 0x9180, 0x19ff, 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, 0x19f5, + 0x2104, 0xc095, 0x200a, 0x080c, 0x1153, 0x0005, 0x0016, 0x00e6, + 0x2071, 0x19f5, 0x00f6, 0x2079, 0x0080, 0x792c, 0xd1bc, 0x190c, + 0x0def, 0x782b, 0x0002, 0xd1fc, 0x0120, 0x918c, 0x0700, 0x7004, + 0x0023, 0x00fe, 0x00ee, 0x001e, 0x0005, 0x1164, 0x120c, 0x1240, + 0x0df6, 0x0df6, 0x12f9, 0x0df6, 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, 0x11a9, 0x0005, 0x7008, 0x0096, + 0x2048, 0xa86f, 0x0100, 0x009e, 0x7007, 0x0000, 0x080c, 0x1164, + 0x0005, 0x7008, 0x0096, 0x2048, 0xa86f, 0x0200, 0x009e, 0x0ca0, + 0x918c, 0x0700, 0x1150, 0x700c, 0x9005, 0x0180, 0x7800, 0x7802, + 0x7804, 0x7806, 0x080c, 0x11be, 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, 0x18b7, 0x2004, 0x9906, 0x1128, 0xa89c, + 0x080f, 0x00de, 0x009e, 0x00a0, 0x00de, 0x009e, 0x0096, 0x00d6, + 0x7008, 0x2048, 0x0081, 0x0150, 0xa89c, 0x0086, 0x2940, 0x080f, + 0x008e, 0x00de, 0x009e, 0x080c, 0x1153, 0x0005, 0x00de, 0x009e, + 0x080c, 0x1153, 0x0005, 0xa8a8, 0xd08c, 0x0005, 0x0096, 0xa0a0, + 0x904d, 0x090c, 0x0df6, 0xa06c, 0x908e, 0x0100, 0x0130, 0xa87b, + 0x0030, 0xa883, 0x0000, 0xa897, 0x4002, 0x080c, 0x6a15, 0xa09f, + 0x0000, 0xa0a3, 0x0000, 0x2848, 0x080c, 0x1069, 0x009e, 0x0005, + 0x00a6, 0xa0a0, 0x904d, 0x090c, 0x0df6, 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, 0x1134, 0x00e8, 0xa97c, 0xa894, + 0x0016, 0x0006, 0x080c, 0x6a15, 0x000e, 0x001e, 0xd1fc, 0x1138, + 0xd1f4, 0x0128, 0x00c6, 0x2060, 0x080c, 0x9fea, 0x00ce, 0x7008, + 0x2048, 0xa89f, 0x0000, 0xa8a3, 0x0000, 0x080c, 0x1069, 0x7007, + 0x0000, 0x080c, 0x1153, 0x00ae, 0x0005, 0x0126, 0x2091, 0x8000, + 0x782b, 0x1001, 0x7007, 0x0005, 0x7000, 0xc094, 0x7002, 0x012e, + 0x0005, 0x7007, 0x0000, 0x080c, 0x1164, 0x0005, 0x0126, 0x2091, + 0x2200, 0x2079, 0x0300, 0x2071, 0x1a3f, 0x7003, 0x0000, 0x78bf, + 0x00f6, 0x0419, 0x7803, 0x0003, 0x780f, 0x0000, 0x2001, 0x0100, + 0x2004, 0x9086, 0x000a, 0x0128, 0x20a9, 0x01e8, 0x2061, 0xdc0a, + 0x0020, 0x20a9, 0x01e8, 0x2061, 0xdfd8, 0x2c0d, 0x7912, 0xe104, + 0x9ce0, 0x0002, 0x7916, 0x1f04, 0x131d, 0x7807, 0x0007, 0x7803, + 0x0000, 0x7803, 0x0001, 0x012e, 0x0005, 0x00c6, 0x7803, 0x0000, + 0x7808, 0xd09c, 0x0110, 0x7820, 0x0cd8, 0x2001, 0x1a40, 0x2003, + 0x0000, 0x78ab, 0x0004, 0x78ac, 0xd0ac, 0x1de8, 0x78ab, 0x0002, + 0x7807, 0x0007, 0x7827, 0x0030, 0x782b, 0x0400, 0x7827, 0x0031, + 0x782b, 0x1a5a, 0x781f, 0xff00, 0x781b, 0xff00, 0x2001, 0x0200, + 0x2004, 0xd0dc, 0x0110, 0x781f, 0x0303, 0x2061, 0x1a5a, 0x602f, + 0x1cd0, 0x2001, 0x1819, 0x2004, 0x9082, 0x1cd0, 0x6032, 0x603b, + 0x1ebe, 0x783f, 0x31f3, 0x00ce, 0x0005, 0x0126, 0x2091, 0x2200, + 0x7908, 0x9184, 0x0070, 0x190c, 0x0def, 0xd19c, 0x0158, 0x7820, + 0x908c, 0xf000, 0x15e8, 0x908a, 0x0024, 0x1a0c, 0x0df6, 0x0023, + 0x012e, 0x0005, 0x012e, 0x0005, 0x13a0, 0x13a0, 0x13b7, 0x13bc, + 0x13c0, 0x13c5, 0x13ed, 0x13f1, 0x13ff, 0x1403, 0x13a0, 0x148f, + 0x1493, 0x1503, 0x13a0, 0x13a0, 0x13a0, 0x13a0, 0x13a0, 0x13a0, + 0x13a0, 0x13a0, 0x13a0, 0x13a0, 0x13a0, 0x13a0, 0x13a0, 0x13c7, + 0x13a0, 0x13a0, 0x13a0, 0x13a0, 0x13a0, 0x13a0, 0x13a4, 0x13a2, + 0x080c, 0x0df6, 0x080c, 0x0def, 0x080c, 0x150a, 0x2009, 0x1a56, + 0x2104, 0x8000, 0x200a, 0x080c, 0x7bec, 0x080c, 0x1977, 0x0005, + 0x2009, 0x0048, 0x2060, 0x080c, 0xa068, 0x012e, 0x0005, 0x7004, + 0xc085, 0xc0b5, 0x7006, 0x0005, 0x7004, 0xc085, 0x7006, 0x0005, + 0x080c, 0x150a, 0x080c, 0x15e4, 0x0005, 0x080c, 0x0df6, 0x080c, + 0x150a, 0x2060, 0x6014, 0x0096, 0x2048, 0xa83b, 0xffff, 0x009e, + 0x2009, 0x0048, 0x080c, 0xa068, 0x2001, 0x015d, 0x2003, 0x0000, + 0x2009, 0x03e8, 0x8109, 0x0160, 0x2001, 0x0201, 0x2004, 0x9005, + 0x0dc8, 0x2001, 0x0218, 0x2004, 0xd0ec, 0x1110, 0x080c, 0x150f, + 0x2001, 0x0307, 0x2003, 0x8000, 0x0005, 0x7004, 0xc095, 0x7006, + 0x0005, 0x080c, 0x150a, 0x2060, 0x6014, 0x0096, 0x2048, 0xa83b, + 0xffff, 0x009e, 0x2009, 0x0048, 0x080c, 0xa068, 0x0005, 0x080c, + 0x150a, 0x080c, 0x0df6, 0x080c, 0x150a, 0x080c, 0x147a, 0x7827, + 0x0018, 0x79ac, 0xd1dc, 0x0540, 0x7827, 0x0015, 0x7828, 0x782b, + 0x0000, 0x9065, 0x0138, 0x2001, 0x020d, 0x2003, 0x0050, 0x2003, + 0x0020, 0x0400, 0x7004, 0x9005, 0x1180, 0x78ab, 0x0004, 0x7827, + 0x0018, 0x782b, 0x0000, 0xd1bc, 0x090c, 0x0df6, 0x2001, 0x020d, + 0x2003, 0x0050, 0x2003, 0x0020, 0x0490, 0x78ab, 0x0004, 0x7803, + 0x0001, 0x080c, 0x1493, 0x0005, 0x7828, 0x782b, 0x0000, 0x9065, + 0x090c, 0x0df6, 0x6014, 0x2048, 0x78ab, 0x0004, 0x918c, 0x0700, + 0x01a8, 0x080c, 0x7bec, 0x080c, 0x1977, 0x080c, 0xbd4e, 0x0158, + 0xa9ac, 0xa936, 0xa9b0, 0xa93a, 0xa83f, 0xffff, 0xa843, 0xffff, + 0xa880, 0xc0bd, 0xa882, 0x080c, 0xb983, 0x0005, 0x6010, 0x00b6, + 0x2058, 0xb800, 0x00be, 0xd0bc, 0x6024, 0x190c, 0xc13a, 0x2029, + 0x00c8, 0x8529, 0x0128, 0x2001, 0x0201, 0x2004, 0x9005, 0x0dc8, + 0x7dbc, 0x080c, 0xdbb3, 0xd5a4, 0x1118, 0x080c, 0x150f, 0x0005, + 0x080c, 0x7bec, 0x080c, 0x1977, 0x0005, 0x781f, 0x0300, 0x7803, + 0x0001, 0x0005, 0x0016, 0x0066, 0x0076, 0x00f6, 0x2079, 0x0300, + 0x7908, 0x918c, 0x0007, 0x9186, 0x0003, 0x0120, 0x2001, 0x0016, + 0x080c, 0x1580, 0x00fe, 0x007e, 0x006e, 0x001e, 0x0005, 0x7004, + 0xc09d, 0x7006, 0x0005, 0x7104, 0x9184, 0x0004, 0x190c, 0x0df6, + 0xd184, 0x11b1, 0xd19c, 0x0180, 0xc19c, 0x7106, 0x0016, 0x080c, + 0x15c7, 0x001e, 0x0148, 0x2001, 0x020d, 0x2003, 0x0050, 0x2003, + 0x0020, 0x080c, 0x150f, 0x0005, 0x81ff, 0x190c, 0x0df6, 0x0005, + 0x2100, 0xc184, 0xc1b4, 0x7106, 0xd0b4, 0x0016, 0x00e6, 0x1904, + 0x14f8, 0x2071, 0x0200, 0x080c, 0x15bb, 0x080c, 0x15c7, 0x05a8, + 0x6014, 0x9005, 0x05a8, 0x0096, 0x2048, 0xa864, 0x009e, 0x9084, + 0x00ff, 0x908e, 0x0029, 0x0160, 0x908e, 0x0048, 0x1548, 0x601c, + 0xd084, 0x11d8, 0x00f6, 0x2c78, 0x080c, 0x1651, 0x00fe, 0x00a8, + 0x00f6, 0x2c78, 0x080c, 0x179b, 0x00fe, 0x2009, 0x01f4, 0x8109, + 0x0160, 0x2001, 0x0201, 0x2004, 0x9005, 0x0dc8, 0x2001, 0x0218, + 0x2004, 0xd0ec, 0x1110, 0x0419, 0x0040, 0x2001, 0x020d, 0x2003, + 0x0020, 0x080c, 0x132d, 0x7803, 0x0001, 0x00ee, 0x001e, 0x0005, + 0x080c, 0x15c7, 0x0dd0, 0x2001, 0x020d, 0x2003, 0x0050, 0x2003, + 0x0020, 0x0069, 0x0c90, 0x0031, 0x2060, 0x2009, 0x0053, 0x080c, + 0xa068, 0x0005, 0x7808, 0xd09c, 0x0de8, 0x7820, 0x0005, 0x080c, + 0x147a, 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, 0x1572, 0x6827, 0x0001, 0x8109, 0x1dd0, 0x04d9, 0x6827, + 0x0002, 0x04c1, 0x6804, 0x9005, 0x1130, 0x682c, 0xd0e4, 0x1500, + 0x6804, 0x9005, 0x0de8, 0x79b8, 0xd1ec, 0x1130, 0x08c0, 0x080c, + 0x7bec, 0x080c, 0x1977, 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, 0x1365, 0x00ce, 0x002e, 0x001e, 0x000e, + 0x0006, 0x7832, 0x7936, 0x7a3a, 0x781b, 0x8080, 0x0059, 0x1118, + 0x000e, 0x00fe, 0x0005, 0x000e, 0x792c, 0x3900, 0x8000, 0x2004, + 0x080c, 0x0df6, 0x2009, 0xff00, 0x8109, 0x0120, 0x7818, 0xd0bc, + 0x1dd8, 0x0005, 0x9085, 0x0001, 0x0005, 0x7832, 0x7936, 0x7a3a, + 0x781b, 0x8080, 0x0c79, 0x1108, 0x0005, 0x792c, 0x3900, 0x8000, + 0x2004, 0x080c, 0x0df6, 0x7037, 0x0001, 0x7150, 0x7037, 0x0002, + 0x7050, 0x2060, 0xd1bc, 0x1110, 0x7054, 0x2060, 0x0005, 0x0006, + 0x0046, 0x00e6, 0x2071, 0x0200, 0x7037, 0x0002, 0x7058, 0x9084, + 0xff00, 0x8007, 0x9086, 0x00bc, 0x1158, 0x2021, 0x1a57, 0x2404, + 0x8000, 0x0208, 0x2022, 0x080c, 0x7bec, 0x080c, 0x1977, 0x9006, + 0x00ee, 0x004e, 0x000e, 0x0005, 0x0c11, 0x1108, 0x0005, 0x00e6, + 0x0016, 0x2071, 0x0200, 0x0879, 0x6124, 0xd1dc, 0x01f8, 0x701c, + 0xd08c, 0x0904, 0x1646, 0x7017, 0x0000, 0x2001, 0x0264, 0x2004, + 0xd0bc, 0x0904, 0x1646, 0x2001, 0x0268, 0x00c6, 0x2064, 0x6104, + 0x6038, 0x00ce, 0x918e, 0x0039, 0x1904, 0x1646, 0x9c06, 0x15f0, + 0x0126, 0x2091, 0x2600, 0x080c, 0x7b33, 0x012e, 0x7358, 0x745c, + 0x6014, 0x905d, 0x0598, 0x2b48, 0x6010, 0x00b6, 0x2058, 0xb800, + 0x00be, 0xd0bc, 0x190c, 0xc115, 0xab42, 0xac3e, 0x2001, 0x187d, + 0x2004, 0xd0b4, 0x1170, 0x601c, 0xd0e4, 0x1158, 0x6010, 0x00b6, + 0x2058, 0xb800, 0x00be, 0xd0bc, 0x1120, 0xa83b, 0x7fff, 0xa837, + 0xffff, 0x080c, 0x1ede, 0x1190, 0x080c, 0x17f8, 0x2a00, 0xa816, + 0x0130, 0x2800, 0xa80e, 0x2c05, 0xa80a, 0x2c00, 0xa812, 0x7037, + 0x0020, 0x781f, 0x0300, 0x001e, 0x00ee, 0x0005, 0x7037, 0x0050, + 0x7037, 0x0020, 0x001e, 0x00ee, 0x080c, 0x150f, 0x0005, 0x080c, + 0x0df6, 0x0016, 0x2009, 0x00a0, 0x8109, 0xa001, 0xa001, 0xa001, + 0x1dd8, 0x001e, 0x2ff0, 0x0126, 0x2091, 0x2200, 0x0016, 0x00c6, + 0x3e60, 0x6014, 0x2048, 0x2940, 0x903e, 0x2730, 0xa864, 0x2068, + 0xa81a, 0x9d84, 0x000f, 0x9088, 0x1ebe, 0x2165, 0x0002, 0x1686, + 0x16d3, 0x1686, 0x1686, 0x1686, 0x16b5, 0x1686, 0x168a, 0x167f, + 0x16ca, 0x1686, 0x1686, 0x1686, 0x1790, 0x169e, 0x1694, 0xa964, + 0x918c, 0x00ff, 0x918e, 0x0048, 0x0904, 0x16ca, 0x9085, 0x0001, + 0x0804, 0x1786, 0xa87c, 0xd0bc, 0x0dc8, 0xa890, 0xa842, 0xa88c, + 0xa83e, 0xa888, 0x0804, 0x16da, 0xa87c, 0xd0bc, 0x0d78, 0xa890, + 0xa842, 0xa88c, 0xa83e, 0xa888, 0x0804, 0x1729, 0xa87c, 0xd0bc, + 0x0d28, 0xa890, 0xa842, 0xa88c, 0xa83e, 0xa804, 0x9045, 0x090c, + 0x0df6, 0xa164, 0xa91a, 0x91ec, 0x000f, 0x9d80, 0x1ebe, 0x2065, + 0xa888, 0xd19c, 0x1904, 0x1729, 0x0428, 0xa87c, 0xd0ac, 0x0970, + 0xa804, 0x9045, 0x090c, 0x0df6, 0xa164, 0xa91a, 0x91ec, 0x000f, + 0x9d80, 0x1ebe, 0x2065, 0x9006, 0xa842, 0xa83e, 0xd19c, 0x1904, + 0x1729, 0x0080, 0xa87c, 0xd0ac, 0x0904, 0x1686, 0x9006, 0xa842, + 0xa83e, 0x0804, 0x1729, 0xa87c, 0xd0ac, 0x0904, 0x1686, 0x9006, + 0xa842, 0xa83e, 0x2c05, 0x908a, 0x0036, 0x1a0c, 0x0df6, 0x9082, + 0x001b, 0x0002, 0x16fd, 0x16fd, 0x16ff, 0x16fd, 0x16fd, 0x16fd, + 0x1705, 0x16fd, 0x16fd, 0x16fd, 0x170b, 0x16fd, 0x16fd, 0x16fd, + 0x1711, 0x16fd, 0x16fd, 0x16fd, 0x1717, 0x16fd, 0x16fd, 0x16fd, + 0x171d, 0x16fd, 0x16fd, 0x16fd, 0x1723, 0x080c, 0x0df6, 0xa574, + 0xa478, 0xa37c, 0xa280, 0x0804, 0x176e, 0xa584, 0xa488, 0xa38c, + 0xa290, 0x0804, 0x176e, 0xa594, 0xa498, 0xa39c, 0xa2a0, 0x0804, + 0x176e, 0xa5a4, 0xa4a8, 0xa3ac, 0xa2b0, 0x0804, 0x176e, 0xa5b4, + 0xa4b8, 0xa3bc, 0xa2c0, 0x0804, 0x176e, 0xa5c4, 0xa4c8, 0xa3cc, + 0xa2d0, 0x0804, 0x176e, 0xa5d4, 0xa4d8, 0xa3dc, 0xa2e0, 0x0804, + 0x176e, 0x2c05, 0x908a, 0x0034, 0x1a0c, 0x0df6, 0x9082, 0x001b, + 0x0002, 0x174c, 0x174a, 0x174a, 0x174a, 0x174a, 0x174a, 0x1753, + 0x174a, 0x174a, 0x174a, 0x174a, 0x174a, 0x175a, 0x174a, 0x174a, + 0x174a, 0x174a, 0x174a, 0x1761, 0x174a, 0x174a, 0x174a, 0x174a, + 0x174a, 0x1768, 0x080c, 0x0df6, 0xa56c, 0xa470, 0xa774, 0xa678, + 0xa37c, 0xa280, 0x00d8, 0xa584, 0xa488, 0xa78c, 0xa690, 0xa394, + 0xa298, 0x00a0, 0xa59c, 0xa4a0, 0xa7a4, 0xa6a8, 0xa3ac, 0xa2b0, + 0x0068, 0xa5b4, 0xa4b8, 0xa7bc, 0xa6c0, 0xa3c4, 0xa2c8, 0x0030, + 0xa5cc, 0xa4d0, 0xa7d4, 0xa6d8, 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, 0x1686, 0x0016, 0x2009, 0x00a0, 0x8109, 0xa001, 0xa001, + 0xa001, 0x1dd8, 0x001e, 0x2ff0, 0x0126, 0x2091, 0x2200, 0x0016, + 0x00c6, 0x3e60, 0x6014, 0x2048, 0x2940, 0xa80e, 0x2061, 0x1eb9, + 0xa813, 0x1eb9, 0x2c05, 0xa80a, 0xa964, 0xa91a, 0xa87c, 0xd0ac, + 0x090c, 0x0df6, 0x9006, 0xa842, 0xa83e, 0x2c05, 0x908a, 0x0034, + 0x1a0c, 0x0df6, 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, + 0x0df6, 0xa80e, 0xa064, 0xa81a, 0x9084, 0x000f, 0x9080, 0x1ebe, + 0x2015, 0x82ff, 0x090c, 0x0df6, 0xaa12, 0x2205, 0xa80a, 0x0c08, + 0x903e, 0x2730, 0xa880, 0xd0fc, 0x1190, 0x2d00, 0x0002, 0x18ed, + 0x184f, 0x184f, 0x18ed, 0x18ed, 0x18e7, 0x18ed, 0x184f, 0x189e, + 0x189e, 0x189e, 0x18ed, 0x18ed, 0x18ed, 0x18e4, 0x189e, 0xc0fc, + 0xa882, 0xab2c, 0xaa30, 0xad1c, 0xac20, 0xdd9c, 0x0904, 0x18ef, + 0x2c05, 0x908a, 0x0034, 0x1a0c, 0x0df6, 0x9082, 0x001b, 0x0002, + 0x183b, 0x1839, 0x1839, 0x1839, 0x1839, 0x1839, 0x183f, 0x1839, + 0x1839, 0x1839, 0x1839, 0x1839, 0x1843, 0x1839, 0x1839, 0x1839, + 0x1839, 0x1839, 0x1847, 0x1839, 0x1839, 0x1839, 0x1839, 0x1839, + 0x184b, 0x080c, 0x0df6, 0xa774, 0xa678, 0x0804, 0x18ef, 0xa78c, + 0xa690, 0x0804, 0x18ef, 0xa7a4, 0xa6a8, 0x0804, 0x18ef, 0xa7bc, + 0xa6c0, 0x0804, 0x18ef, 0xa7d4, 0xa6d8, 0x0804, 0x18ef, 0x2c05, + 0x908a, 0x0036, 0x1a0c, 0x0df6, 0x9082, 0x001b, 0x0002, 0x1872, + 0x1872, 0x1874, 0x1872, 0x1872, 0x1872, 0x187a, 0x1872, 0x1872, + 0x1872, 0x1880, 0x1872, 0x1872, 0x1872, 0x1886, 0x1872, 0x1872, + 0x1872, 0x188c, 0x1872, 0x1872, 0x1872, 0x1892, 0x1872, 0x1872, + 0x1872, 0x1898, 0x080c, 0x0df6, 0xa574, 0xa478, 0xa37c, 0xa280, + 0x0804, 0x18ef, 0xa584, 0xa488, 0xa38c, 0xa290, 0x0804, 0x18ef, + 0xa594, 0xa498, 0xa39c, 0xa2a0, 0x0804, 0x18ef, 0xa5a4, 0xa4a8, + 0xa3ac, 0xa2b0, 0x0804, 0x18ef, 0xa5b4, 0xa4b8, 0xa3bc, 0xa2c0, + 0x0804, 0x18ef, 0xa5c4, 0xa4c8, 0xa3cc, 0xa2d0, 0x0804, 0x18ef, + 0xa5d4, 0xa4d8, 0xa3dc, 0xa2e0, 0x0804, 0x18ef, 0x2c05, 0x908a, + 0x0034, 0x1a0c, 0x0df6, 0x9082, 0x001b, 0x0002, 0x18c1, 0x18bf, + 0x18bf, 0x18bf, 0x18bf, 0x18bf, 0x18c8, 0x18bf, 0x18bf, 0x18bf, + 0x18bf, 0x18bf, 0x18cf, 0x18bf, 0x18bf, 0x18bf, 0x18bf, 0x18bf, + 0x18d6, 0x18bf, 0x18bf, 0x18bf, 0x18bf, 0x18bf, 0x18dd, 0x080c, + 0x0df6, 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, + 0x1e7c, 0x1904, 0x17f8, 0x900e, 0x0050, 0x080c, 0x0df6, 0xab2e, + 0xaa32, 0xad1e, 0xac22, 0xaf26, 0xae2a, 0x080c, 0x1e7c, 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, 0xa15d, 0x0005, + 0x9086, 0x0004, 0x1120, 0x2009, 0x0048, 0x080c, 0xa068, 0x0005, 0xa974, 0xd1dc, 0x1108, 0x0005, 0xa934, 0xa88c, 0x9106, 0x1158, 0xa938, 0xa890, 0x9106, 0x1138, 0x601c, 0xc084, 0x601e, 0x2009, - 0x0048, 0x0804, 0xa15d, 0x0005, 0x0126, 0x00c6, 0x2091, 0x2200, + 0x0048, 0x0804, 0xa068, 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, 0x1370, + 0x00c6, 0x781f, 0x0808, 0x7808, 0xd09c, 0x0120, 0x080c, 0x1365, 0x8631, 0x1db8, 0x00ce, 0x781f, 0x0800, 0x2031, 0x0168, 0x00c6, - 0x7808, 0xd09c, 0x190c, 0x1370, 0x00ce, 0x2001, 0x0038, 0x080c, - 0x1a87, 0x7930, 0x9186, 0x0040, 0x0160, 0x9186, 0x0042, 0x190c, - 0x0dfa, 0x2001, 0x001e, 0x8001, 0x1df0, 0x8631, 0x1d40, 0x080c, - 0x1a96, 0x000e, 0x6022, 0x012e, 0x0005, 0x080c, 0x1a83, 0x7827, + 0x7808, 0xd09c, 0x190c, 0x1365, 0x00ce, 0x2001, 0x0038, 0x080c, + 0x1a07, 0x7930, 0x9186, 0x0040, 0x0160, 0x9186, 0x0042, 0x190c, + 0x0df6, 0x2001, 0x001e, 0x8001, 0x1df0, 0x8631, 0x1d40, 0x080c, + 0x1a16, 0x000e, 0x6022, 0x012e, 0x0005, 0x080c, 0x1a03, 0x7827, 0x0015, 0x7828, 0x9c06, 0x1db8, 0x782b, 0x0000, 0x0ca0, 0x00f6, - 0x2079, 0x0300, 0x7803, 0x0000, 0x78ab, 0x0004, 0x00fe, 0x080c, - 0x7207, 0x1188, 0x2001, 0x0138, 0x2003, 0x0000, 0x2001, 0x0160, + 0x2079, 0x0300, 0x7803, 0x0000, 0x78ab, 0x0004, 0x2001, 0xf000, + 0x8001, 0x090c, 0x0df6, 0x7aac, 0xd2ac, 0x1dd0, 0x00fe, 0x080c, + 0x717e, 0x1188, 0x2001, 0x0138, 0x2003, 0x0000, 0x2001, 0x0160, 0x2003, 0x0000, 0x2011, 0x012c, 0xa001, 0xa001, 0x8211, 0x1de0, - 0x0059, 0x0804, 0x72d2, 0x0479, 0x0039, 0x2001, 0x0160, 0x2502, + 0x0059, 0x0804, 0x7246, 0x0479, 0x0039, 0x2001, 0x0160, 0x2502, 0x2001, 0x0138, 0x2202, 0x0005, 0x00e6, 0x2071, 0x0200, 0x080c, - 0x2bbc, 0x2009, 0x003c, 0x080c, 0x230a, 0x2001, 0x015d, 0x2003, - 0x0000, 0x7000, 0x9084, 0x003c, 0x1de0, 0x080c, 0x81f0, 0x70a0, + 0x2aa3, 0x2009, 0x003c, 0x080c, 0x2200, 0x2001, 0x015d, 0x2003, + 0x0000, 0x7000, 0x9084, 0x003c, 0x1de0, 0x080c, 0x816f, 0x70a0, 0x70a2, 0x7098, 0x709a, 0x709c, 0x709e, 0x2001, 0x020d, 0x2003, - 0x0020, 0x00f6, 0x2079, 0x0300, 0x080c, 0x1329, 0x7803, 0x0001, + 0x0020, 0x00f6, 0x2079, 0x0300, 0x080c, 0x132d, 0x7803, 0x0001, 0x00fe, 0x00ee, 0x0005, 0x2001, 0x0138, 0x2014, 0x2003, 0x0000, - 0x2001, 0x0160, 0x202c, 0x2003, 0x0000, 0x080c, 0x7207, 0x1108, + 0x2001, 0x0160, 0x202c, 0x2003, 0x0000, 0x080c, 0x717e, 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, 0x158b, 0x7930, 0x0005, 0x2c08, 0x621c, 0x080c, - 0x1636, 0x7930, 0x0005, 0x8001, 0x1df0, 0x0005, 0x2031, 0x0064, + 0x621c, 0x080c, 0x1580, 0x7930, 0x0005, 0x2c08, 0x621c, 0x080c, + 0x15ad, 0x7930, 0x0005, 0x8001, 0x1df0, 0x0005, 0x2031, 0x0064, 0x781c, 0x9084, 0x0007, 0x0170, 0x2001, 0x0038, 0x0c41, 0x9186, - 0x0040, 0x0904, 0x1af4, 0x2001, 0x001e, 0x0c69, 0x8631, 0x1d80, - 0x080c, 0x0dfa, 0x781f, 0x0202, 0x2001, 0x015d, 0x2003, 0x0000, + 0x0040, 0x0904, 0x1a74, 0x2001, 0x001e, 0x0c69, 0x8631, 0x1d80, + 0x080c, 0x0df6, 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, 0x1a8d, - 0x9186, 0x0040, 0x190c, 0x0dfa, 0x00d6, 0x2069, 0x0200, 0x692c, + 0x0821, 0x9186, 0x0040, 0x0140, 0x2001, 0x0030, 0x080c, 0x1a0d, + 0x9186, 0x0040, 0x190c, 0x0df6, 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, 0x0dfa, + 0x00de, 0x781f, 0x0100, 0x791c, 0x9184, 0x0007, 0x090c, 0x0df6, 0xa001, 0xa001, 0x781f, 0x0200, 0x0005, 0x0126, 0x2091, 0x2400, - 0x2071, 0x1a3d, 0x2079, 0x0090, 0x012e, 0x0005, 0x9280, 0x0005, - 0x2004, 0x2048, 0xa97c, 0xd1dc, 0x1904, 0x1b89, 0xa964, 0x9184, - 0x0007, 0x0002, 0x1b12, 0x1b74, 0x1b29, 0x1b29, 0x1b29, 0x1b5c, - 0x1b3c, 0x1b2b, 0x918c, 0x00ff, 0x9186, 0x0008, 0x1170, 0xa87c, - 0xd0b4, 0x0904, 0x1da7, 0x9006, 0xa842, 0xa83e, 0xa988, 0x2900, - 0xa85a, 0xa813, 0x1fc3, 0x0804, 0x1b85, 0x9186, 0x0048, 0x0904, - 0x1b74, 0x080c, 0x0dfa, 0xa87c, 0xd0b4, 0x0904, 0x1da7, 0xa890, + 0x2071, 0x1a42, 0x2079, 0x0090, 0x012e, 0x0005, 0x9280, 0x0005, + 0x2004, 0x2048, 0xa97c, 0xd1dc, 0x1904, 0x1b09, 0xa964, 0x9184, + 0x0007, 0x0002, 0x1a92, 0x1af4, 0x1aa9, 0x1aa9, 0x1aa9, 0x1adc, + 0x1abc, 0x1aab, 0x918c, 0x00ff, 0x9186, 0x0008, 0x1170, 0xa87c, + 0xd0b4, 0x0904, 0x1cbf, 0x9006, 0xa842, 0xa83e, 0xa988, 0x2900, + 0xa85a, 0xa813, 0x1eb9, 0x0804, 0x1b05, 0x9186, 0x0048, 0x0904, + 0x1af4, 0x080c, 0x0df6, 0xa87c, 0xd0b4, 0x0904, 0x1cbf, 0xa890, 0xa842, 0xa83a, 0xa88c, 0xa83e, 0xa836, 0xa8ac, 0xa846, 0xa8b0, - 0xa84a, 0xa988, 0x0804, 0x1b7c, 0xa864, 0x9084, 0x00ff, 0x9086, - 0x001e, 0x1d38, 0xa87c, 0xd0b4, 0x0904, 0x1da7, 0xa890, 0xa842, + 0xa84a, 0xa988, 0x0804, 0x1afc, 0xa864, 0x9084, 0x00ff, 0x9086, + 0x001e, 0x1d38, 0xa87c, 0xd0b4, 0x0904, 0x1cbf, 0xa890, 0xa842, 0xa83a, 0xa88c, 0xa83e, 0xa836, 0xa8ac, 0xa846, 0xa8b0, 0xa84a, - 0xa804, 0xa85a, 0x2040, 0xa064, 0x9084, 0x000f, 0x9080, 0x1fc8, + 0xa804, 0xa85a, 0x2040, 0xa064, 0x9084, 0x000f, 0x9080, 0x1ebe, 0x2005, 0xa812, 0xa988, 0x0448, 0x918c, 0x00ff, 0x9186, 0x0015, - 0x1540, 0xa87c, 0xd0b4, 0x0904, 0x1da7, 0xa804, 0xa85a, 0x2040, - 0xa064, 0x9084, 0x000f, 0x9080, 0x1fc8, 0x2005, 0xa812, 0xa988, - 0x9006, 0xa842, 0xa83e, 0x0088, 0xa87c, 0xd0b4, 0x0904, 0x1da7, + 0x1540, 0xa87c, 0xd0b4, 0x0904, 0x1cbf, 0xa804, 0xa85a, 0x2040, + 0xa064, 0x9084, 0x000f, 0x9080, 0x1ebe, 0x2005, 0xa812, 0xa988, + 0x9006, 0xa842, 0xa83e, 0x0088, 0xa87c, 0xd0b4, 0x0904, 0x1cbf, 0xa988, 0x9006, 0xa842, 0xa83e, 0x2900, 0xa85a, 0xa864, 0x9084, - 0x000f, 0x9080, 0x1fc8, 0x2005, 0xa812, 0xa916, 0xa87c, 0xc0dd, + 0x000f, 0x9080, 0x1ebe, 0x2005, 0xa812, 0xa916, 0xa87c, 0xc0dd, 0xa87e, 0x0005, 0x00f6, 0x2079, 0x0090, 0x782c, 0xd0fc, 0x190c, - 0x1dec, 0x00e6, 0x2071, 0x1a3d, 0x7000, 0x9005, 0x1904, 0x1bf2, + 0x1d00, 0x00e6, 0x2071, 0x1a42, 0x7000, 0x9005, 0x1904, 0x1b61, 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, 0x2079, 0x0100, 0x8004, 0x78d6, 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, 0x1fe8, 0x004e, 0x003e, 0x0d30, 0x0c98, 0x9085, - 0x0001, 0x0c80, 0x2009, 0x0306, 0x200b, 0x4800, 0x7027, 0x0000, - 0x0005, 0x0076, 0x0066, 0x0056, 0x0046, 0x0036, 0x0026, 0x8aff, - 0x0904, 0x1da0, 0x700c, 0x7214, 0x923a, 0x7010, 0x7218, 0x9203, - 0x0a04, 0x1d9f, 0x9705, 0x0904, 0x1d9f, 0x903e, 0x2730, 0xa880, - 0xd0fc, 0x1190, 0x2d00, 0x0002, 0x1d34, 0x1c74, 0x1c74, 0x1d34, - 0x1d34, 0x1d11, 0x1d34, 0x1c74, 0x1d18, 0x1cc3, 0x1cc3, 0x1d34, - 0x1d34, 0x1d34, 0x1d0b, 0x1cc3, 0xc0fc, 0xa882, 0xab2c, 0xaa30, - 0xad1c, 0xac20, 0xdd9c, 0x0904, 0x1d36, 0x2c05, 0x908a, 0x0034, - 0x1a0c, 0x0dfa, 0x9082, 0x001b, 0x0002, 0x1c60, 0x1c5e, 0x1c5e, - 0x1c5e, 0x1c5e, 0x1c5e, 0x1c64, 0x1c5e, 0x1c5e, 0x1c5e, 0x1c5e, - 0x1c5e, 0x1c68, 0x1c5e, 0x1c5e, 0x1c5e, 0x1c5e, 0x1c5e, 0x1c6c, - 0x1c5e, 0x1c5e, 0x1c5e, 0x1c5e, 0x1c5e, 0x1c70, 0x080c, 0x0dfa, - 0xa774, 0xa678, 0x0804, 0x1d36, 0xa78c, 0xa690, 0x0804, 0x1d36, - 0xa7a4, 0xa6a8, 0x0804, 0x1d36, 0xa7bc, 0xa6c0, 0x0804, 0x1d36, - 0xa7d4, 0xa6d8, 0x0804, 0x1d36, 0x2c05, 0x908a, 0x0036, 0x1a0c, - 0x0dfa, 0x9082, 0x001b, 0x0002, 0x1c97, 0x1c97, 0x1c99, 0x1c97, - 0x1c97, 0x1c97, 0x1c9f, 0x1c97, 0x1c97, 0x1c97, 0x1ca5, 0x1c97, - 0x1c97, 0x1c97, 0x1cab, 0x1c97, 0x1c97, 0x1c97, 0x1cb1, 0x1c97, - 0x1c97, 0x1c97, 0x1cb7, 0x1c97, 0x1c97, 0x1c97, 0x1cbd, 0x080c, - 0x0dfa, 0xa574, 0xa478, 0xa37c, 0xa280, 0x0804, 0x1d36, 0xa584, - 0xa488, 0xa38c, 0xa290, 0x0804, 0x1d36, 0xa594, 0xa498, 0xa39c, - 0xa2a0, 0x0804, 0x1d36, 0xa5a4, 0xa4a8, 0xa3ac, 0xa2b0, 0x0804, - 0x1d36, 0xa5b4, 0xa4b8, 0xa3bc, 0xa2c0, 0x0804, 0x1d36, 0xa5c4, - 0xa4c8, 0xa3cc, 0xa2d0, 0x0804, 0x1d36, 0xa5d4, 0xa4d8, 0xa3dc, - 0xa2e0, 0x0804, 0x1d36, 0x2c05, 0x908a, 0x0034, 0x1a0c, 0x0dfa, - 0x9082, 0x001b, 0x0002, 0x1ce6, 0x1ce4, 0x1ce4, 0x1ce4, 0x1ce4, - 0x1ce4, 0x1cee, 0x1ce4, 0x1ce4, 0x1ce4, 0x1ce4, 0x1ce4, 0x1cf6, - 0x1ce4, 0x1ce4, 0x1ce4, 0x1ce4, 0x1ce4, 0x1cfd, 0x1ce4, 0x1ce4, - 0x1ce4, 0x1ce4, 0x1ce4, 0x1d04, 0x080c, 0x0dfa, 0xa56c, 0xa470, - 0xa774, 0xa678, 0xa37c, 0xa280, 0x0804, 0x1d36, 0xa584, 0xa488, - 0xa78c, 0xa690, 0xa394, 0xa298, 0x0804, 0x1d36, 0xa59c, 0xa4a0, - 0xa7a4, 0xa6a8, 0xa3ac, 0xa2b0, 0x04c8, 0xa5b4, 0xa4b8, 0xa7bc, - 0xa6c0, 0xa3c4, 0xa2c8, 0x0490, 0xa5cc, 0xa4d0, 0xa7d4, 0xa6d8, - 0xa3dc, 0xa2e0, 0x0458, 0xa864, 0x9084, 0x00ff, 0x9086, 0x001e, - 0x1518, 0x080c, 0x1f80, 0x1904, 0x1c0f, 0x900e, 0x0804, 0x1da0, - 0xab64, 0x939c, 0x00ff, 0x9386, 0x0048, 0x1180, 0x00c6, 0x7004, - 0x2060, 0x6004, 0x9086, 0x0043, 0x00ce, 0x0904, 0x1cc3, 0xab9c, - 0x9016, 0xad8c, 0xac90, 0xaf94, 0xae98, 0x0040, 0x9386, 0x0008, - 0x0904, 0x1cc3, 0x080c, 0x0dfa, 0x080c, 0x0dfa, 0x2009, 0x030f, - 0x2104, 0xd0fc, 0x0530, 0x0066, 0x2009, 0x0306, 0x2104, 0x9084, - 0x0030, 0x15c8, 0x2031, 0x1000, 0x200b, 0x4000, 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, 0x1f80, 0x0428, 0x2031, 0x0080, 0x9584, 0x007f, 0x0108, - 0x9632, 0x7124, 0x7000, 0x9086, 0x0000, 0x1198, 0xc185, 0x7126, - 0x2009, 0x0306, 0x2104, 0xd0b4, 0x1904, 0x1d46, 0x200b, 0x4040, - 0x2009, 0x1a57, 0x2104, 0x8000, 0x0a04, 0x1d46, 0x200a, 0x0804, - 0x1d46, 0xc18d, 0x7126, 0xd184, 0x1d58, 0x0804, 0x1d46, 0x9006, + 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, 0x1188, 0xa93c, 0xa834, 0x9106, 0x1168, 0x8aff, + 0x01a8, 0x0126, 0x2091, 0x8000, 0x00a1, 0x0108, 0x0091, 0x012e, + 0x9006, 0x00ee, 0x00fe, 0x0005, 0x0036, 0x0046, 0xab38, 0xac34, + 0x080c, 0x1ede, 0x004e, 0x003e, 0x0d50, 0x0c98, 0x9085, 0x0001, + 0x0c80, 0x0076, 0x0066, 0x0056, 0x0046, 0x0036, 0x0026, 0x8aff, + 0x0904, 0x1cb8, 0x700c, 0x7214, 0x923a, 0x7010, 0x7218, 0x9203, + 0x0a04, 0x1cb7, 0x9705, 0x0904, 0x1cb7, 0x903e, 0x2730, 0xa880, + 0xd0fc, 0x1190, 0x2d00, 0x0002, 0x1c9b, 0x1bdc, 0x1bdc, 0x1c9b, + 0x1c9b, 0x1c79, 0x1c9b, 0x1bdc, 0x1c7f, 0x1c2b, 0x1c2b, 0x1c9b, + 0x1c9b, 0x1c9b, 0x1c73, 0x1c2b, 0xc0fc, 0xa882, 0xab2c, 0xaa30, + 0xad1c, 0xac20, 0xdd9c, 0x0904, 0x1c9d, 0x2c05, 0x908a, 0x0034, + 0x1a0c, 0x0df6, 0x9082, 0x001b, 0x0002, 0x1bc8, 0x1bc6, 0x1bc6, + 0x1bc6, 0x1bc6, 0x1bc6, 0x1bcc, 0x1bc6, 0x1bc6, 0x1bc6, 0x1bc6, + 0x1bc6, 0x1bd0, 0x1bc6, 0x1bc6, 0x1bc6, 0x1bc6, 0x1bc6, 0x1bd4, + 0x1bc6, 0x1bc6, 0x1bc6, 0x1bc6, 0x1bc6, 0x1bd8, 0x080c, 0x0df6, + 0xa774, 0xa678, 0x0804, 0x1c9d, 0xa78c, 0xa690, 0x0804, 0x1c9d, + 0xa7a4, 0xa6a8, 0x0804, 0x1c9d, 0xa7bc, 0xa6c0, 0x0804, 0x1c9d, + 0xa7d4, 0xa6d8, 0x0804, 0x1c9d, 0x2c05, 0x908a, 0x0036, 0x1a0c, + 0x0df6, 0x9082, 0x001b, 0x0002, 0x1bff, 0x1bff, 0x1c01, 0x1bff, + 0x1bff, 0x1bff, 0x1c07, 0x1bff, 0x1bff, 0x1bff, 0x1c0d, 0x1bff, + 0x1bff, 0x1bff, 0x1c13, 0x1bff, 0x1bff, 0x1bff, 0x1c19, 0x1bff, + 0x1bff, 0x1bff, 0x1c1f, 0x1bff, 0x1bff, 0x1bff, 0x1c25, 0x080c, + 0x0df6, 0xa574, 0xa478, 0xa37c, 0xa280, 0x0804, 0x1c9d, 0xa584, + 0xa488, 0xa38c, 0xa290, 0x0804, 0x1c9d, 0xa594, 0xa498, 0xa39c, + 0xa2a0, 0x0804, 0x1c9d, 0xa5a4, 0xa4a8, 0xa3ac, 0xa2b0, 0x0804, + 0x1c9d, 0xa5b4, 0xa4b8, 0xa3bc, 0xa2c0, 0x0804, 0x1c9d, 0xa5c4, + 0xa4c8, 0xa3cc, 0xa2d0, 0x0804, 0x1c9d, 0xa5d4, 0xa4d8, 0xa3dc, + 0xa2e0, 0x0804, 0x1c9d, 0x2c05, 0x908a, 0x0034, 0x1a0c, 0x0df6, + 0x9082, 0x001b, 0x0002, 0x1c4e, 0x1c4c, 0x1c4c, 0x1c4c, 0x1c4c, + 0x1c4c, 0x1c56, 0x1c4c, 0x1c4c, 0x1c4c, 0x1c4c, 0x1c4c, 0x1c5e, + 0x1c4c, 0x1c4c, 0x1c4c, 0x1c4c, 0x1c4c, 0x1c65, 0x1c4c, 0x1c4c, + 0x1c4c, 0x1c4c, 0x1c4c, 0x1c6c, 0x080c, 0x0df6, 0xa56c, 0xa470, + 0xa774, 0xa678, 0xa37c, 0xa280, 0x0804, 0x1c9d, 0xa584, 0xa488, + 0xa78c, 0xa690, 0xa394, 0xa298, 0x0804, 0x1c9d, 0xa59c, 0xa4a0, + 0xa7a4, 0xa6a8, 0xa3ac, 0xa2b0, 0x04c0, 0xa5b4, 0xa4b8, 0xa7bc, + 0xa6c0, 0xa3c4, 0xa2c8, 0x0488, 0xa5cc, 0xa4d0, 0xa7d4, 0xa6d8, + 0xa3dc, 0xa2e0, 0x0450, 0xa864, 0x9084, 0x00ff, 0x9086, 0x001e, + 0x1510, 0x080c, 0x1e7c, 0x1904, 0x1b77, 0x900e, 0x04c8, 0xab64, + 0x939c, 0x00ff, 0x9386, 0x0048, 0x1180, 0x00c6, 0x7004, 0x2060, + 0x6004, 0x9086, 0x0043, 0x00ce, 0x0904, 0x1c2b, 0xab9c, 0x9016, + 0xad8c, 0xac90, 0xaf94, 0xae98, 0x0040, 0x9386, 0x0008, 0x0904, + 0x1c2b, 0x080c, 0x0df6, 0x080c, 0x0df6, 0x7b12, 0x7a16, 0x7d02, + 0x7c06, 0x7f0a, 0x7e0e, 0x782b, 0x0001, 0x7000, 0x8000, 0x7002, + 0xa83c, 0x9300, 0xa83e, 0xa840, 0x9201, 0xa842, 0x700c, 0x9300, + 0x700e, 0x7010, 0x9201, 0x7012, 0x080c, 0x1e7c, 0x0008, 0x9006, 0x002e, 0x003e, 0x004e, 0x005e, 0x006e, 0x007e, 0x0005, 0x080c, - 0x0dfa, 0x0026, 0x2001, 0x0105, 0x2003, 0x0010, 0x782b, 0x0004, - 0x7003, 0x0000, 0x7004, 0x0016, 0x080c, 0x1c02, 0x001e, 0x2060, - 0x6014, 0x2048, 0x080c, 0xbe37, 0x0118, 0xa880, 0xc0bd, 0xa882, - 0x6020, 0x9086, 0x0006, 0x1180, 0x2061, 0x0100, 0x62c8, 0x2001, - 0x00fa, 0x8001, 0x1df0, 0x60c8, 0x9206, 0x1dc0, 0x60c4, 0xa89a, - 0x60c8, 0xa896, 0x7004, 0x2060, 0x00c6, 0x080c, 0xba56, 0x00ce, - 0x2001, 0x19ce, 0x2004, 0x9c06, 0x1160, 0x2009, 0x0040, 0x080c, - 0x230a, 0x080c, 0x9b88, 0x2011, 0x0000, 0x080c, 0x9a19, 0x080c, - 0x8ced, 0x002e, 0x0804, 0x1f30, 0x0126, 0x2091, 0x2400, 0xa858, - 0x2040, 0x792c, 0x782b, 0x0002, 0x9184, 0x0700, 0x1904, 0x1da9, - 0x7000, 0x0002, 0x1f30, 0x1dfe, 0x1e7e, 0x1f2e, 0x8001, 0x7002, - 0x7027, 0x0000, 0xd19c, 0x1158, 0x8aff, 0x0904, 0x1e4b, 0x080c, - 0x1c09, 0x0904, 0x1f30, 0x080c, 0x1c09, 0x0804, 0x1f30, 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, 0x1f9b, - 0xa880, 0xc0fd, 0xa882, 0x2a00, 0xa816, 0x2800, 0xa85a, 0x2c00, - 0xa812, 0x7003, 0x0000, 0x2009, 0x0306, 0x200b, 0x4800, 0x7027, - 0x0000, 0x0804, 0x1f30, 0x00f6, 0x0026, 0x781c, 0x0006, 0x7818, - 0x0006, 0x2079, 0x0100, 0x7a14, 0x9284, 0x1984, 0x9085, 0x0012, - 0x7816, 0x0036, 0x2019, 0x1000, 0x8319, 0x090c, 0x0dfa, 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, 0x1c02, 0x0804, 0x1f30, 0x8001, 0x7002, - 0x7024, 0x8004, 0x7026, 0xd194, 0x0170, 0x782c, 0xd0fc, 0x1904, - 0x1df1, 0xd19c, 0x1904, 0x1f2c, 0x8aff, 0x0904, 0x1f30, 0x080c, - 0x1c09, 0x0804, 0x1f30, 0x0026, 0x0036, 0xab3c, 0xaa40, 0x080c, - 0x1f9b, 0xdd9c, 0x1904, 0x1eeb, 0x2c05, 0x908a, 0x0036, 0x1a0c, - 0x0dfa, 0x9082, 0x001b, 0x0002, 0x1ebf, 0x1ebf, 0x1ec1, 0x1ebf, - 0x1ebf, 0x1ebf, 0x1ec7, 0x1ebf, 0x1ebf, 0x1ebf, 0x1ecd, 0x1ebf, - 0x1ebf, 0x1ebf, 0x1ed3, 0x1ebf, 0x1ebf, 0x1ebf, 0x1ed9, 0x1ebf, - 0x1ebf, 0x1ebf, 0x1edf, 0x1ebf, 0x1ebf, 0x1ebf, 0x1ee5, 0x080c, - 0x0dfa, 0xa07c, 0x931a, 0xa080, 0x9213, 0x0804, 0x1e20, 0xa08c, - 0x931a, 0xa090, 0x9213, 0x0804, 0x1e20, 0xa09c, 0x931a, 0xa0a0, - 0x9213, 0x0804, 0x1e20, 0xa0ac, 0x931a, 0xa0b0, 0x9213, 0x0804, - 0x1e20, 0xa0bc, 0x931a, 0xa0c0, 0x9213, 0x0804, 0x1e20, 0xa0cc, - 0x931a, 0xa0d0, 0x9213, 0x0804, 0x1e20, 0xa0dc, 0x931a, 0xa0e0, - 0x9213, 0x0804, 0x1e20, 0x2c05, 0x908a, 0x0034, 0x1a0c, 0x0dfa, - 0x9082, 0x001b, 0x0002, 0x1f0e, 0x1f0c, 0x1f0c, 0x1f0c, 0x1f0c, - 0x1f0c, 0x1f14, 0x1f0c, 0x1f0c, 0x1f0c, 0x1f0c, 0x1f0c, 0x1f1a, - 0x1f0c, 0x1f0c, 0x1f0c, 0x1f0c, 0x1f0c, 0x1f20, 0x1f0c, 0x1f0c, - 0x1f0c, 0x1f0c, 0x1f0c, 0x1f26, 0x080c, 0x0dfa, 0xa07c, 0x931a, - 0xa080, 0x9213, 0x0804, 0x1e20, 0xa094, 0x931a, 0xa098, 0x9213, - 0x0804, 0x1e20, 0xa0ac, 0x931a, 0xa0b0, 0x9213, 0x0804, 0x1e20, - 0xa0c4, 0x931a, 0xa0c8, 0x9213, 0x0804, 0x1e20, 0xa0dc, 0x931a, - 0xa0e0, 0x9213, 0x0804, 0x1e20, 0x0804, 0x1e1c, 0x080c, 0x0dfa, - 0x012e, 0x0005, 0x00f6, 0x00e6, 0x2071, 0x1a3d, 0x7000, 0x9086, - 0x0000, 0x0904, 0x1f7b, 0x2079, 0x0090, 0x2009, 0x0207, 0x210c, - 0xd194, 0x01b8, 0x2009, 0x020c, 0x210c, 0x9184, 0x0003, 0x0188, - 0x080c, 0xdc34, 0x2001, 0x0133, 0x2004, 0x9005, 0x090c, 0x0dfa, - 0x0016, 0x2009, 0x0040, 0x080c, 0x230a, 0x001e, 0x2001, 0x020c, - 0x2102, 0x2009, 0x0206, 0x2104, 0x2009, 0x0203, 0x210c, 0x9106, - 0x1120, 0x2009, 0x0040, 0x080c, 0x230a, 0x782c, 0xd0fc, 0x09a8, - 0x080c, 0x1dec, 0x7000, 0x9086, 0x0000, 0x1978, 0x782b, 0x0004, - 0x782c, 0xd0ac, 0x1de8, 0x2009, 0x0040, 0x080c, 0x230a, 0x782b, - 0x0002, 0x7003, 0x0000, 0x080c, 0x1c02, 0x00ee, 0x00fe, 0x0005, - 0xa880, 0xd0fc, 0x11a8, 0x8c60, 0x2c05, 0x9005, 0x0110, 0x8a51, - 0x0005, 0xa004, 0x9005, 0x0168, 0xa85a, 0x2040, 0xa064, 0x9084, - 0x000f, 0x9080, 0x1fc8, 0x2065, 0x8cff, 0x090c, 0x0dfa, 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, - 0x1fd8, 0x2065, 0x8cff, 0x090c, 0x0dfa, 0x0005, 0x0000, 0x001d, - 0x0021, 0x0025, 0x0029, 0x002d, 0x0031, 0x0035, 0x0000, 0x001b, - 0x0021, 0x0027, 0x002d, 0x0033, 0x0000, 0x0000, 0x0023, 0x0000, - 0x0000, 0x1fbb, 0x1fb7, 0x0000, 0x0000, 0x1fc5, 0x0000, 0x1fbb, - 0x1fc2, 0x1fc2, 0x1fbf, 0x0000, 0x0000, 0x0000, 0x1fc5, 0x1fc2, - 0x0000, 0x1fbd, 0x1fbd, 0x0000, 0x0000, 0x1fc5, 0x0000, 0x1fbd, - 0x1fc3, 0x1fc3, 0x1fc3, 0x0000, 0x0000, 0x0000, 0x1fc5, 0x1fc3, - 0x00c6, 0x00d6, 0x0086, 0xab42, 0xac3e, 0xa888, 0x9055, 0x0904, - 0x21c7, 0x2940, 0xa064, 0x90ec, 0x000f, 0x9084, 0x00ff, 0x9086, - 0x0008, 0x1118, 0x2061, 0x1fc3, 0x00d0, 0x9de0, 0x1fc8, 0x9d86, - 0x0007, 0x0130, 0x9d86, 0x000e, 0x0118, 0x9d86, 0x000f, 0x1120, - 0xa08c, 0x9422, 0xa090, 0x931b, 0x2c05, 0x9065, 0x1140, 0x0310, - 0x0804, 0x21c7, 0xa004, 0x9045, 0x0904, 0x21c7, 0x08d8, 0x2c05, - 0x9005, 0x0904, 0x20af, 0xdd9c, 0x1904, 0x206b, 0x908a, 0x0036, - 0x1a0c, 0x0dfa, 0x9082, 0x001b, 0x0002, 0x2040, 0x2040, 0x2042, - 0x2040, 0x2040, 0x2040, 0x2048, 0x2040, 0x2040, 0x2040, 0x204e, - 0x2040, 0x2040, 0x2040, 0x2054, 0x2040, 0x2040, 0x2040, 0x205a, - 0x2040, 0x2040, 0x2040, 0x2060, 0x2040, 0x2040, 0x2040, 0x2066, - 0x080c, 0x0dfa, 0xa07c, 0x9422, 0xa080, 0x931b, 0x0804, 0x20a5, - 0xa08c, 0x9422, 0xa090, 0x931b, 0x0804, 0x20a5, 0xa09c, 0x9422, - 0xa0a0, 0x931b, 0x0804, 0x20a5, 0xa0ac, 0x9422, 0xa0b0, 0x931b, - 0x0804, 0x20a5, 0xa0bc, 0x9422, 0xa0c0, 0x931b, 0x0804, 0x20a5, - 0xa0cc, 0x9422, 0xa0d0, 0x931b, 0x0804, 0x20a5, 0xa0dc, 0x9422, - 0xa0e0, 0x931b, 0x04d0, 0x908a, 0x0034, 0x1a0c, 0x0dfa, 0x9082, - 0x001b, 0x0002, 0x208d, 0x208b, 0x208b, 0x208b, 0x208b, 0x208b, - 0x2092, 0x208b, 0x208b, 0x208b, 0x208b, 0x208b, 0x2097, 0x208b, - 0x208b, 0x208b, 0x208b, 0x208b, 0x209c, 0x208b, 0x208b, 0x208b, - 0x208b, 0x208b, 0x20a1, 0x080c, 0x0dfa, 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, 0x21c7, 0x8c60, 0x0804, 0x2017, 0xa004, - 0x9045, 0x0904, 0x21c7, 0x0804, 0x1ff2, 0x8a51, 0x0904, 0x21c7, - 0x8c60, 0x2c05, 0x9005, 0x1158, 0xa004, 0x9045, 0x0904, 0x21c7, - 0xa064, 0x90ec, 0x000f, 0x9de0, 0x1fc8, 0x2c05, 0x2060, 0xa880, - 0xc0fc, 0xa882, 0x0804, 0x21bc, 0x2c05, 0x8422, 0x8420, 0x831a, - 0x9399, 0x0000, 0xac2e, 0xab32, 0xdd9c, 0x1904, 0x2159, 0x9082, - 0x001b, 0x0002, 0x20f5, 0x20f5, 0x20f7, 0x20f5, 0x20f5, 0x20f5, - 0x2105, 0x20f5, 0x20f5, 0x20f5, 0x2113, 0x20f5, 0x20f5, 0x20f5, - 0x2121, 0x20f5, 0x20f5, 0x20f5, 0x212f, 0x20f5, 0x20f5, 0x20f5, - 0x213d, 0x20f5, 0x20f5, 0x20f5, 0x214b, 0x080c, 0x0dfa, 0xa17c, - 0x2400, 0x9122, 0xa180, 0x2300, 0x911b, 0x0a0c, 0x0dfa, 0xa074, - 0x9420, 0xa078, 0x9319, 0x0804, 0x21b7, 0xa18c, 0x2400, 0x9122, - 0xa190, 0x2300, 0x911b, 0x0a0c, 0x0dfa, 0xa084, 0x9420, 0xa088, - 0x9319, 0x0804, 0x21b7, 0xa19c, 0x2400, 0x9122, 0xa1a0, 0x2300, - 0x911b, 0x0a0c, 0x0dfa, 0xa094, 0x9420, 0xa098, 0x9319, 0x0804, - 0x21b7, 0xa1ac, 0x2400, 0x9122, 0xa1b0, 0x2300, 0x911b, 0x0a0c, - 0x0dfa, 0xa0a4, 0x9420, 0xa0a8, 0x9319, 0x0804, 0x21b7, 0xa1bc, - 0x2400, 0x9122, 0xa1c0, 0x2300, 0x911b, 0x0a0c, 0x0dfa, 0xa0b4, - 0x9420, 0xa0b8, 0x9319, 0x0804, 0x21b7, 0xa1cc, 0x2400, 0x9122, - 0xa1d0, 0x2300, 0x911b, 0x0a0c, 0x0dfa, 0xa0c4, 0x9420, 0xa0c8, - 0x9319, 0x0804, 0x21b7, 0xa1dc, 0x2400, 0x9122, 0xa1e0, 0x2300, - 0x911b, 0x0a0c, 0x0dfa, 0xa0d4, 0x9420, 0xa0d8, 0x9319, 0x0804, - 0x21b7, 0x9082, 0x001b, 0x0002, 0x2177, 0x2175, 0x2175, 0x2175, - 0x2175, 0x2175, 0x2184, 0x2175, 0x2175, 0x2175, 0x2175, 0x2175, - 0x2191, 0x2175, 0x2175, 0x2175, 0x2175, 0x2175, 0x219e, 0x2175, - 0x2175, 0x2175, 0x2175, 0x2175, 0x21ab, 0x080c, 0x0dfa, 0xa17c, - 0x2400, 0x9122, 0xa180, 0x2300, 0x911b, 0x0a0c, 0x0dfa, 0xa06c, - 0x9420, 0xa070, 0x9319, 0x0498, 0xa194, 0x2400, 0x9122, 0xa198, - 0x2300, 0x911b, 0x0a0c, 0x0dfa, 0xa084, 0x9420, 0xa088, 0x9319, - 0x0430, 0xa1ac, 0x2400, 0x9122, 0xa1b0, 0x2300, 0x911b, 0x0a0c, - 0x0dfa, 0xa09c, 0x9420, 0xa0a0, 0x9319, 0x00c8, 0xa1c4, 0x2400, - 0x9122, 0xa1c8, 0x2300, 0x911b, 0x0a0c, 0x0dfa, 0xa0b4, 0x9420, - 0xa0b8, 0x9319, 0x0060, 0xa1dc, 0x2400, 0x9122, 0xa1e0, 0x2300, - 0x911b, 0x0a0c, 0x0dfa, 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, 0x0df3, 0x9084, 0x0007, 0x0002, 0x21e8, 0x1dec, - 0x21e8, 0x21de, 0x21e1, 0x21e4, 0x21e1, 0x21e4, 0x080c, 0x1dec, - 0x0005, 0x080c, 0x11e8, 0x0005, 0x080c, 0x1dec, 0x080c, 0x11e8, - 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, 0x2307, 0x7900, 0xd1dc, - 0x1118, 0x9084, 0x0006, 0x001a, 0x9084, 0x000e, 0x0002, 0x222f, - 0x2227, 0x7bb4, 0x2227, 0x2229, 0x2229, 0x2229, 0x2229, 0x7b9a, - 0x2227, 0x222b, 0x2227, 0x2229, 0x2227, 0x2229, 0x2227, 0x080c, - 0x0dfa, 0x0031, 0x0020, 0x080c, 0x7b9a, 0x080c, 0x7bb4, 0x0005, - 0x0006, 0x0016, 0x0026, 0x080c, 0xdc34, 0x7930, 0x9184, 0x0003, - 0x01c0, 0x2001, 0x19ce, 0x2004, 0x9005, 0x0170, 0x2001, 0x0133, - 0x2004, 0x9005, 0x090c, 0x0dfa, 0x00c6, 0x2001, 0x19ce, 0x2064, - 0x080c, 0xba56, 0x00ce, 0x00f8, 0x2009, 0x0040, 0x080c, 0x230a, - 0x00d0, 0x9184, 0x0014, 0x01a0, 0x6a00, 0x9286, 0x0003, 0x0160, - 0x080c, 0x7207, 0x1138, 0x080c, 0x7504, 0x080c, 0x5f2b, 0x080c, - 0x7127, 0x0010, 0x080c, 0x5dea, 0x080c, 0x7c63, 0x0041, 0x0018, - 0x9184, 0x9540, 0x1dc8, 0x002e, 0x001e, 0x000e, 0x0005, 0x00e6, - 0x0036, 0x0046, 0x0056, 0x2071, 0x1a3a, 0x080c, 0x19ff, 0x005e, - 0x004e, 0x003e, 0x00ee, 0x0005, 0x0126, 0x2091, 0x2e00, 0x2071, - 0x1800, 0x7128, 0x2001, 0x1947, 0x2102, 0x2001, 0x194f, 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, 0x0df3, 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, 0x2bb6, - 0x080c, 0x2a89, 0x2001, 0x0100, 0x2004, 0x9086, 0x000a, 0x0558, - 0x6054, 0x8004, 0x8004, 0x8004, 0x8004, 0x9084, 0x000c, 0x6150, - 0x918c, 0xfff3, 0x9105, 0x6052, 0x6050, 0x9084, 0xb17f, 0x9085, - 0x2000, 0x6052, 0x2009, 0x1975, 0x2011, 0x1976, 0x6358, 0x939c, - 0x38f0, 0x2320, 0x080c, 0x2af6, 0x1238, 0x939d, 0x4003, 0x94a5, - 0x8603, 0x230a, 0x2412, 0x0030, 0x939d, 0x0203, 0x94a5, 0x8603, - 0x230a, 0x2412, 0x0050, 0x2001, 0x1975, 0x2003, 0x0700, 0x2001, - 0x1976, 0x2003, 0x0700, 0x080c, 0x2cc2, 0x9006, 0x080c, 0x2ab8, - 0x9006, 0x080c, 0x2a9b, 0x20a9, 0x0012, 0x1d04, 0x236d, 0x2091, - 0x6000, 0x1f04, 0x236d, 0x602f, 0x0100, 0x602f, 0x0000, 0x6050, - 0x9085, 0x0400, 0x9084, 0xdfff, 0x6052, 0x6024, 0x6026, 0x080c, - 0x27a7, 0x2009, 0x00ef, 0x6132, 0x6136, 0x080c, 0x27b7, 0x60e7, - 0x0000, 0x61ea, 0x60e3, 0x0002, 0x604b, 0xf7f7, 0x6043, 0x0000, - 0x602f, 0x0080, 0x602f, 0x0000, 0x6007, 0x149f, 0x60bb, 0x0000, - 0x20a9, 0x0018, 0x60bf, 0x0000, 0x1f04, 0x239a, 0x60bb, 0x0000, - 0x60bf, 0x0108, 0x60bf, 0x0012, 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, 0x1834, 0x2003, - 0x0000, 0x2001, 0x1833, 0x2003, 0x0001, 0x0005, 0x0126, 0x2091, - 0x2800, 0x0006, 0x0016, 0x0026, 0x6124, 0x9184, 0x5e2c, 0x1118, - 0x9184, 0x0007, 0x002a, 0x9195, 0x0004, 0x9284, 0x0007, 0x0002, - 0x23fa, 0x23e0, 0x23e3, 0x23e6, 0x23eb, 0x23ed, 0x23f1, 0x23f5, - 0x080c, 0x8563, 0x00b8, 0x080c, 0x8632, 0x00a0, 0x080c, 0x8632, - 0x080c, 0x8563, 0x0078, 0x0099, 0x0068, 0x080c, 0x8563, 0x0079, - 0x0048, 0x080c, 0x8632, 0x0059, 0x0028, 0x080c, 0x8632, 0x080c, - 0x8563, 0x0029, 0x002e, 0x001e, 0x000e, 0x012e, 0x0005, 0x00a6, - 0x6124, 0x6028, 0xd09c, 0x0118, 0xd19c, 0x1904, 0x2648, 0xd1f4, - 0x190c, 0x0df3, 0x080c, 0x7207, 0x0904, 0x2455, 0x080c, 0xc539, - 0x1120, 0x7000, 0x9086, 0x0003, 0x0570, 0x6024, 0x9084, 0x1800, - 0x0550, 0x080c, 0x722a, 0x0118, 0x080c, 0x7218, 0x1520, 0x6027, - 0x0020, 0x6043, 0x0000, 0x080c, 0xc539, 0x0168, 0x080c, 0x722a, - 0x1150, 0x2001, 0x197f, 0x2003, 0x0001, 0x6027, 0x1800, 0x080c, - 0x7076, 0x0804, 0x264b, 0x70a0, 0x9005, 0x1150, 0x70a3, 0x0001, - 0x00d6, 0x2069, 0x0140, 0x080c, 0x725e, 0x00de, 0x1904, 0x264b, - 0x080c, 0x750e, 0x0428, 0x080c, 0x722a, 0x1590, 0x6024, 0x9084, - 0x1800, 0x1108, 0x0468, 0x080c, 0x750e, 0x080c, 0x7504, 0x080c, - 0x5f2b, 0x080c, 0x7127, 0x0804, 0x2648, 0xd1ac, 0x1508, 0x6024, - 0xd0dc, 0x1170, 0xd0e4, 0x1178, 0xd0d4, 0x1190, 0xd0cc, 0x0130, - 0x7094, 0x9086, 0x0028, 0x1110, 0x080c, 0x73f3, 0x0804, 0x2648, - 0x080c, 0x7509, 0x0048, 0x2001, 0x1955, 0x2003, 0x0002, 0x0020, - 0x080c, 0x7359, 0x0804, 0x2648, 0x080c, 0x748d, 0x0804, 0x2648, - 0xd1ac, 0x0904, 0x2569, 0x080c, 0x7207, 0x11c0, 0x6027, 0x0020, - 0x0006, 0x0026, 0x0036, 0x080c, 0x7221, 0x1158, 0x080c, 0x7504, - 0x080c, 0x5f2b, 0x080c, 0x7127, 0x003e, 0x002e, 0x000e, 0x00ae, - 0x0005, 0x003e, 0x002e, 0x000e, 0x080c, 0x71df, 0x0016, 0x0046, - 0x00c6, 0x644c, 0x9486, 0xf0f0, 0x1138, 0x2061, 0x0100, 0x644a, - 0x6043, 0x0090, 0x6043, 0x0010, 0x74d6, 0x948c, 0xff00, 0x7038, - 0xd084, 0x0178, 0x9186, 0xf800, 0x1160, 0x7044, 0xd084, 0x1148, - 0xc085, 0x7046, 0x0036, 0x2418, 0x2011, 0x8016, 0x080c, 0x4b1f, - 0x003e, 0x080c, 0xc532, 0x1904, 0x2546, 0x9196, 0xff00, 0x05a8, - 0x705c, 0x9084, 0x00ff, 0x810f, 0x81ff, 0x0110, 0x9116, 0x0568, - 0x7130, 0xd184, 0x1550, 0x080c, 0x32e4, 0x0128, 0xc18d, 0x7132, - 0x080c, 0x67bb, 0x1510, 0x6240, 0x9294, 0x0010, 0x0130, 0x6248, - 0x9294, 0xff00, 0x9296, 0xff00, 0x01c0, 0x7030, 0xd08c, 0x0904, - 0x2546, 0x7038, 0xd08c, 0x1140, 0x2001, 0x180c, 0x200c, 0xd1ac, - 0x1904, 0x2546, 0xc1ad, 0x2102, 0x0036, 0x73d4, 0x2011, 0x8013, - 0x080c, 0x4b1f, 0x003e, 0x0804, 0x2546, 0x7038, 0xd08c, 0x1140, - 0x2001, 0x180c, 0x200c, 0xd1ac, 0x1904, 0x2546, 0xc1ad, 0x2102, - 0x0036, 0x73d4, 0x2011, 0x8013, 0x080c, 0x4b1f, 0x003e, 0x7130, - 0xc185, 0x7132, 0x2011, 0x185c, 0x220c, 0x00f0, 0x0016, 0x2009, - 0x0001, 0x2011, 0x0100, 0x080c, 0x84d1, 0x2019, 0x000e, 0x00c6, - 0x2061, 0x0000, 0x080c, 0xd801, 0x00ce, 0x9484, 0x00ff, 0x9080, - 0x32e9, 0x200d, 0x918c, 0xff00, 0x810f, 0x2120, 0x9006, 0x2009, - 0x000e, 0x080c, 0xd885, 0x001e, 0xd1ac, 0x1148, 0x0016, 0x2009, - 0x0002, 0x2019, 0x0004, 0x080c, 0x3156, 0x001e, 0x0078, 0x0156, - 0x00b6, 0x20a9, 0x007f, 0x900e, 0x080c, 0x649f, 0x1110, 0x080c, - 0x5f45, 0x8108, 0x1f04, 0x253c, 0x00be, 0x015e, 0x00ce, 0x004e, - 0x080c, 0xa069, 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, 0x1825, 0x2003, 0x0000, 0x6027, - 0x0020, 0xd194, 0x0904, 0x2648, 0x0016, 0x6220, 0xd2b4, 0x0904, - 0x25f1, 0x080c, 0x835a, 0x080c, 0x9656, 0x6027, 0x0004, 0x00f6, - 0x2019, 0x19c8, 0x2304, 0x907d, 0x0904, 0x25c0, 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, 0x2c98, 0x2001, 0x001e, 0x8001, 0x0240, 0x20a9, 0x0009, - 0x080c, 0x2b91, 0x6904, 0xd1dc, 0x1140, 0x0cb0, 0x2001, 0x0100, - 0x080c, 0x2c88, 0x9006, 0x080c, 0x2c88, 0x080c, 0x8b04, 0x080c, - 0x8c10, 0x7814, 0x2048, 0xa867, 0x0103, 0x2f60, 0x080c, 0xa0e3, - 0x009e, 0x00ee, 0x00ce, 0x00de, 0x00fe, 0x001e, 0x00ae, 0x0005, - 0x00fe, 0x00d6, 0x2069, 0x0140, 0x6804, 0x9084, 0x4000, 0x0110, - 0x080c, 0x2c98, 0x00de, 0x00c6, 0x2061, 0x19bf, 0x6028, 0x080c, - 0xc539, 0x0120, 0x909a, 0x0003, 0x1258, 0x0018, 0x909a, 0x00c8, - 0x1238, 0x8000, 0x602a, 0x00ce, 0x080c, 0x9632, 0x0804, 0x2647, - 0x2061, 0x0100, 0x62c0, 0x080c, 0x9eef, 0x2019, 0x19c8, 0x2304, - 0x9065, 0x0120, 0x2009, 0x0027, 0x080c, 0xa15d, 0x00ce, 0x0804, - 0x2647, 0xd2bc, 0x0904, 0x2634, 0x080c, 0x8367, 0x6014, 0x9084, - 0x1984, 0x9085, 0x0010, 0x6016, 0x6027, 0x0004, 0x00d6, 0x2069, - 0x0140, 0x6804, 0x9084, 0x4000, 0x0110, 0x080c, 0x2c98, 0x00de, - 0x00c6, 0x2061, 0x19bf, 0x6044, 0x080c, 0xc539, 0x0120, 0x909a, - 0x0003, 0x1628, 0x0018, 0x909a, 0x00c8, 0x1608, 0x8000, 0x6046, - 0x603c, 0x00ce, 0x9005, 0x0558, 0x2009, 0x07d0, 0x080c, 0x835f, - 0x9080, 0x0008, 0x2004, 0x9086, 0x0006, 0x1138, 0x6114, 0x918c, - 0x1984, 0x918d, 0x0012, 0x6116, 0x00d0, 0x6114, 0x918c, 0x1984, - 0x918d, 0x0016, 0x6116, 0x0098, 0x6027, 0x0004, 0x0080, 0x0036, - 0x2019, 0x0001, 0x080c, 0x999d, 0x003e, 0x2019, 0x19ce, 0x2304, - 0x9065, 0x0120, 0x2009, 0x004f, 0x080c, 0xa15d, 0x00ce, 0x001e, - 0xd19c, 0x0904, 0x2712, 0x7038, 0xd0ac, 0x1904, 0x26e7, 0x0016, - 0x0156, 0x6027, 0x0008, 0x2001, 0x0100, 0x2004, 0x9086, 0x000a, - 0x0904, 0x26c4, 0x6050, 0x9085, 0x0040, 0x6052, 0x6050, 0x9084, - 0xfbcf, 0x6052, 0x080c, 0x2bb0, 0x9085, 0x2000, 0x6052, 0x20a9, - 0x0012, 0x1d04, 0x2669, 0x080c, 0x838e, 0x1f04, 0x2669, 0x6050, - 0x9085, 0x0400, 0x9084, 0xdfbf, 0x6052, 0x20a9, 0x0028, 0xa001, - 0x1f04, 0x2677, 0x6150, 0x9185, 0x1400, 0x6052, 0x20a9, 0x0366, - 0x1d04, 0x2680, 0x080c, 0x838e, 0x6020, 0xd09c, 0x1138, 0x015e, - 0x6152, 0x001e, 0x6027, 0x0008, 0x0804, 0x2712, 0x080c, 0x2b78, - 0x1f04, 0x2680, 0x015e, 0x6152, 0x001e, 0x6027, 0x0008, 0x0016, - 0x6028, 0xc09c, 0x602a, 0x080c, 0xa069, 0x60e3, 0x0000, 0x080c, - 0xdc13, 0x080c, 0xdc2e, 0x080c, 0x55df, 0xd0fc, 0x1138, 0x080c, - 0xc532, 0x1120, 0x9085, 0x0001, 0x080c, 0x724e, 0x9006, 0x080c, - 0x2c88, 0x2009, 0x0002, 0x080c, 0x2bb6, 0x00e6, 0x2071, 0x1800, - 0x7003, 0x0004, 0x080c, 0x0ec6, 0x00ee, 0x6027, 0x0008, 0x080c, - 0x0b8f, 0x001e, 0x0804, 0x2712, 0x080c, 0x2cc2, 0x080c, 0x2cf5, - 0x6050, 0xc0e5, 0x6052, 0x20a9, 0x0367, 0x1f04, 0x26e5, 0x1d04, - 0x26cf, 0x080c, 0x838e, 0x6020, 0xd09c, 0x1db8, 0x00f6, 0x2079, - 0x0100, 0x080c, 0x2b06, 0x00fe, 0x1d80, 0x6050, 0xc0e4, 0x6052, - 0x6027, 0x0008, 0x015e, 0x001e, 0x0468, 0x015e, 0x001e, 0x0016, - 0x6028, 0xc09c, 0x602a, 0x080c, 0xa069, 0x60e3, 0x0000, 0x080c, - 0xdc13, 0x080c, 0xdc2e, 0x080c, 0x55df, 0xd0fc, 0x1138, 0x080c, - 0xc532, 0x1120, 0x9085, 0x0001, 0x080c, 0x724e, 0x9006, 0x080c, - 0x2c88, 0x2009, 0x0002, 0x080c, 0x2bb6, 0x00e6, 0x2071, 0x1800, - 0x7003, 0x0004, 0x080c, 0x0ec6, 0x00ee, 0x6027, 0x0008, 0x080c, - 0x0b8f, 0x001e, 0x918c, 0xffd0, 0x6126, 0x00ae, 0x0005, 0x0006, - 0x0016, 0x0026, 0x0036, 0x00e6, 0x00f6, 0x0126, 0x2091, 0x8000, - 0x2071, 0x1800, 0x71cc, 0x70ce, 0x9116, 0x0904, 0x2766, 0x81ff, - 0x01a0, 0x2009, 0x0000, 0x080c, 0x2bb6, 0x2011, 0x8011, 0x2019, - 0x010e, 0x231c, 0x939e, 0x0007, 0x1118, 0x2019, 0x0001, 0x0010, - 0x2019, 0x0000, 0x080c, 0x4b1f, 0x0448, 0x2001, 0x1980, 0x200c, - 0x81ff, 0x1140, 0x2001, 0x0109, 0x2004, 0xd0b4, 0x0118, 0x2019, - 0x0003, 0x0008, 0x2118, 0x2011, 0x8012, 0x080c, 0x4b1f, 0x080c, - 0x0ec6, 0x080c, 0x55df, 0xd0fc, 0x1188, 0x080c, 0xc532, 0x1170, - 0x00c6, 0x080c, 0x2802, 0x080c, 0x9904, 0x2061, 0x0100, 0x2019, - 0x0028, 0x2009, 0x0002, 0x080c, 0x3156, 0x00ce, 0x012e, 0x00fe, - 0x00ee, 0x003e, 0x002e, 0x001e, 0x000e, 0x0005, 0x2028, 0x918c, - 0x00ff, 0x2130, 0x9094, 0xff00, 0x11f0, 0x2011, 0x1836, 0x2214, - 0xd2ac, 0x11c8, 0x81ff, 0x01e8, 0x2011, 0x181e, 0x2204, 0x9106, - 0x1190, 0x2011, 0x181f, 0x2214, 0x9294, 0xff00, 0x9584, 0xff00, - 0x9206, 0x1148, 0x2011, 0x181f, 0x2214, 0x9294, 0x00ff, 0x9584, - 0x00ff, 0x9206, 0x1120, 0x2500, 0x080c, 0x7ec0, 0x0048, 0x9584, - 0x00ff, 0x9080, 0x32e9, 0x200d, 0x918c, 0xff00, 0x810f, 0x9006, - 0x0005, 0x9080, 0x32e9, 0x200d, 0x918c, 0x00ff, 0x0005, 0x00d6, - 0x2069, 0x0140, 0x2001, 0x1817, 0x2003, 0x00ef, 0x20a9, 0x0010, - 0x9006, 0x6852, 0x6856, 0x1f04, 0x27b2, 0x00de, 0x0005, 0x0006, - 0x00d6, 0x0026, 0x2069, 0x0140, 0x2001, 0x1817, 0x2102, 0x8114, - 0x8214, 0x8214, 0x8214, 0x20a9, 0x0010, 0x6853, 0x0000, 0x9006, - 0x82ff, 0x1128, 0x9184, 0x000f, 0x9080, 0xe568, 0x2005, 0x6856, - 0x8211, 0x1f04, 0x27c7, 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, 0x27f7, 0x680f, 0x0000, 0x000e, 0x001e, 0x002e, 0x00de, - 0x015e, 0x0005, 0x080c, 0x55db, 0xd0c4, 0x0150, 0xd0a4, 0x0140, - 0x9006, 0x0046, 0x2020, 0x2009, 0x002e, 0x080c, 0xd885, 0x004e, - 0x0005, 0x00f6, 0x0016, 0x0026, 0x2079, 0x0140, 0x78c4, 0xd0dc, - 0x0904, 0x286e, 0x080c, 0x2af6, 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, 0x84ff, 0x928c, - 0xff00, 0x0110, 0x2011, 0x00ff, 0x2200, 0x8007, 0x9085, 0x004c, - 0x78c2, 0x2009, 0x0138, 0x220a, 0x080c, 0x7207, 0x1118, 0x2009, - 0x1945, 0x220a, 0x002e, 0x001e, 0x00fe, 0x0005, 0x78c3, 0x0000, - 0x0cc8, 0x0126, 0x2091, 0x2800, 0x0006, 0x0016, 0x0026, 0x2001, - 0x0170, 0x200c, 0x8000, 0x2014, 0x9184, 0x0003, 0x0110, 0x080c, - 0x0df3, 0x002e, 0x001e, 0x000e, 0x012e, 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, - 0x1968, 0x2004, 0x908a, 0x0007, 0x1a0c, 0x0dfa, 0x0033, 0x00ee, - 0x002e, 0x001e, 0x000e, 0x015e, 0x0005, 0x28cc, 0x28ea, 0x290e, - 0x2910, 0x2939, 0x293b, 0x293d, 0x2001, 0x0001, 0x080c, 0x2717, - 0x080c, 0x2b6a, 0x2001, 0x196a, 0x2003, 0x0000, 0x7828, 0x9084, - 0xe1d7, 0x782a, 0x9006, 0x20a9, 0x0009, 0x080c, 0x2b12, 0x2001, - 0x1968, 0x2003, 0x0006, 0x2009, 0x001e, 0x2011, 0x293e, 0x080c, - 0x836c, 0x0005, 0x2009, 0x196d, 0x200b, 0x0000, 0x2001, 0x1972, - 0x2003, 0x0036, 0x2001, 0x1971, 0x2003, 0x002a, 0x2001, 0x196a, - 0x2003, 0x0001, 0x9006, 0x080c, 0x2a9b, 0x2001, 0xffff, 0x20a9, - 0x0009, 0x080c, 0x2b12, 0x2001, 0x1968, 0x2003, 0x0006, 0x2009, - 0x001e, 0x2011, 0x293e, 0x080c, 0x836c, 0x0005, 0x080c, 0x0dfa, - 0x2001, 0x1972, 0x2003, 0x0036, 0x2001, 0x196a, 0x2003, 0x0003, - 0x7a38, 0x9294, 0x0005, 0x9296, 0x0004, 0x0110, 0x9006, 0x0010, - 0x2001, 0x0001, 0x080c, 0x2a9b, 0x2001, 0x196e, 0x2003, 0x0000, - 0x2001, 0xffff, 0x20a9, 0x0009, 0x080c, 0x2b12, 0x2001, 0x1968, - 0x2003, 0x0006, 0x2009, 0x001e, 0x2011, 0x293e, 0x080c, 0x836c, - 0x0005, 0x080c, 0x0dfa, 0x080c, 0x0dfa, 0x0005, 0x0006, 0x0016, - 0x0026, 0x00e6, 0x00f6, 0x0156, 0x0126, 0x2091, 0x8000, 0x2079, - 0x0100, 0x2001, 0x196a, 0x2004, 0x908a, 0x0007, 0x1a0c, 0x0dfa, - 0x0043, 0x012e, 0x015e, 0x00fe, 0x00ee, 0x002e, 0x001e, 0x000e, - 0x0005, 0x2960, 0x2980, 0x29c0, 0x29f0, 0x2a14, 0x2a24, 0x2a26, - 0x080c, 0x2b06, 0x11b0, 0x7850, 0x9084, 0xefff, 0x7852, 0x2009, - 0x1970, 0x2104, 0x7a38, 0x9294, 0x0005, 0x9296, 0x0004, 0x0110, - 0xc08d, 0x0008, 0xc085, 0x200a, 0x2001, 0x1968, 0x2003, 0x0001, - 0x0030, 0x080c, 0x2a4a, 0x2001, 0xffff, 0x080c, 0x28db, 0x0005, - 0x080c, 0x2a28, 0x05e0, 0x2009, 0x1971, 0x2104, 0x8001, 0x200a, - 0x080c, 0x2b06, 0x1178, 0x7850, 0x9084, 0xefff, 0x7852, 0x7a38, - 0x9294, 0x0005, 0x9296, 0x0005, 0x0518, 0x2009, 0x1970, 0x2104, - 0xc085, 0x200a, 0x2009, 0x196d, 0x2104, 0x8000, 0x200a, 0x9086, - 0x0005, 0x0118, 0x080c, 0x2a30, 0x00c0, 0x200b, 0x0000, 0x7a38, - 0x9294, 0x0006, 0x9296, 0x0004, 0x0110, 0x9006, 0x0010, 0x2001, - 0x0001, 0x080c, 0x2ab8, 0x2001, 0x196a, 0x2003, 0x0002, 0x0028, - 0x2001, 0x1968, 0x2003, 0x0003, 0x0010, 0x080c, 0x28fd, 0x0005, - 0x080c, 0x2a28, 0x0560, 0x2009, 0x1971, 0x2104, 0x8001, 0x200a, - 0x080c, 0x2b06, 0x1168, 0x7850, 0x9084, 0xefff, 0x7852, 0x2001, - 0x1968, 0x2003, 0x0003, 0x2001, 0x1969, 0x2003, 0x0000, 0x00b8, - 0x2009, 0x1971, 0x2104, 0x9005, 0x1118, 0x080c, 0x2a6d, 0x0010, - 0x080c, 0x2a3d, 0x080c, 0x2a30, 0x2009, 0x196d, 0x200b, 0x0000, - 0x2001, 0x196a, 0x2003, 0x0001, 0x080c, 0x28fd, 0x0000, 0x0005, - 0x04b9, 0x0508, 0x080c, 0x2b06, 0x11b8, 0x7850, 0x9084, 0xefff, - 0x7852, 0x2009, 0x196e, 0x2104, 0x8000, 0x200a, 0x9086, 0x0007, - 0x0108, 0x0078, 0x2001, 0x1973, 0x2003, 0x000a, 0x2009, 0x1970, - 0x2104, 0xc0fd, 0x200a, 0x0038, 0x0419, 0x2001, 0x196a, 0x2003, - 0x0004, 0x080c, 0x2928, 0x0005, 0x0099, 0x0168, 0x080c, 0x2b06, - 0x1138, 0x7850, 0x9084, 0xefff, 0x7852, 0x080c, 0x2914, 0x0018, - 0x0079, 0x080c, 0x2928, 0x0005, 0x080c, 0x0dfa, 0x080c, 0x0dfa, - 0x2009, 0x1972, 0x2104, 0x8001, 0x200a, 0x090c, 0x2a89, 0x0005, - 0x7a38, 0x9294, 0x0005, 0x9296, 0x0005, 0x0110, 0x9006, 0x0010, - 0x2001, 0x0001, 0x080c, 0x2ab8, 0x0005, 0x7a38, 0x9294, 0x0006, - 0x9296, 0x0006, 0x0110, 0x9006, 0x0010, 0x2001, 0x0001, 0x080c, - 0x2a9b, 0x0005, 0x2009, 0x196d, 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, 0x2ab8, 0x0005, 0x0086, 0x2001, 0x1970, - 0x2004, 0x9084, 0x7fff, 0x090c, 0x0dfa, 0x2009, 0x196f, 0x2144, - 0x8846, 0x280a, 0x9844, 0x0dd8, 0xd08c, 0x1120, 0xd084, 0x1120, - 0x080c, 0x0dfa, 0x9006, 0x0010, 0x2001, 0x0001, 0x00a1, 0x008e, - 0x0005, 0x0006, 0x0156, 0x2001, 0x1968, 0x20a9, 0x0009, 0x2003, - 0x0000, 0x8000, 0x1f04, 0x2a8f, 0x2001, 0x196f, 0x2003, 0x8000, - 0x015e, 0x000e, 0x0005, 0x00f6, 0x2079, 0x0100, 0x9085, 0x0000, - 0x0158, 0x7838, 0x9084, 0xfff9, 0x9085, 0x0004, 0x783a, 0x2009, - 0x1975, 0x210c, 0x795a, 0x0050, 0x7838, 0x9084, 0xfffb, 0x9085, - 0x0006, 0x783a, 0x2009, 0x1976, 0x210c, 0x795a, 0x00fe, 0x0005, - 0x00f6, 0x2079, 0x0100, 0x9085, 0x0000, 0x0188, 0x7838, 0x9084, - 0xfffa, 0x9085, 0x0004, 0x783a, 0x2001, 0x0100, 0x2004, 0x9086, - 0x000a, 0x1120, 0x7850, 0x9084, 0xfff0, 0x7852, 0x0428, 0x7838, - 0x9084, 0xfffb, 0x9085, 0x0005, 0x783a, 0x2001, 0x0100, 0x2004, - 0x9086, 0x000a, 0x11c8, 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, 0x2bb0, 0xd09c, 0x1110, 0x1f04, 0x2b09, - 0x015e, 0x0005, 0x0126, 0x0016, 0x0006, 0x2091, 0x8000, 0x2001, - 0x0100, 0x2004, 0x9086, 0x000a, 0x0170, 0x7850, 0x9085, 0x0040, - 0x7852, 0x7850, 0x9084, 0xfbcf, 0x7852, 0x080c, 0x2bb0, 0x9085, - 0x2000, 0x7852, 0x0020, 0x080c, 0x2cc2, 0x080c, 0x2cf5, 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, 0x2b4a, 0x080c, 0x838e, 0x1f04, 0x2b4a, - 0x2001, 0x0100, 0x2004, 0x9086, 0x000a, 0x0160, 0x7850, 0x9085, - 0x0400, 0x9084, 0xdfbf, 0x7852, 0x080c, 0x2bb0, 0x9085, 0x1000, - 0x7852, 0x0020, 0x7850, 0x9085, 0x1000, 0x7852, 0x000e, 0x001e, - 0x012e, 0x0005, 0x2001, 0x0100, 0x2004, 0x9086, 0x000a, 0x0128, - 0x7850, 0x9084, 0xffcf, 0x7852, 0x0010, 0x080c, 0x2cf5, 0x0005, - 0x0006, 0x0156, 0x00f6, 0x2079, 0x0100, 0x20a9, 0x000a, 0x7854, - 0xd0ac, 0x1130, 0x7820, 0xd0e4, 0x1140, 0x1f04, 0x2b82, 0x0028, - 0x7854, 0xd08c, 0x1110, 0x1f04, 0x2b88, 0x00fe, 0x015e, 0x000e, - 0x0005, 0x1d04, 0x2b91, 0x080c, 0x838e, 0x1f04, 0x2b91, 0x0005, - 0x0006, 0x2001, 0x1974, 0x2004, 0x9086, 0x0000, 0x000e, 0x0005, - 0x0006, 0x2001, 0x1974, 0x2004, 0x9086, 0x0001, 0x000e, 0x0005, - 0x0006, 0x2001, 0x1974, 0x2004, 0x9086, 0x0002, 0x000e, 0x0005, - 0xa001, 0xa001, 0xa001, 0xa001, 0xa001, 0x0005, 0x0006, 0x2001, - 0x1980, 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, 0x2c29, 0x0048, 0x0016, 0x2009, 0x1a5a, 0x2104, - 0x8000, 0x0208, 0x200a, 0x001e, 0x04f0, 0x2009, 0x00a2, 0x080c, - 0x0e75, 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, 0x1a5b, 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, 0x1959, 0x200c, 0x080c, - 0x0e75, 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, 0x7221, 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, 0x7221, 0x0110, 0xc0bc, 0x0008, 0xc0bd, 0x200a, 0x001e, - 0x000e, 0x0005, 0x0016, 0x0026, 0x0036, 0x00c6, 0x2061, 0x0100, - 0x6050, 0x9084, 0xfbff, 0x9085, 0x0040, 0x6052, 0x20a9, 0x0002, - 0x080c, 0x2b91, 0x6050, 0x9085, 0x0400, 0x9084, 0xff9f, 0x6052, - 0x20a9, 0x0005, 0x080c, 0x2b91, 0x6054, 0xd0bc, 0x090c, 0x0dfa, - 0x20a9, 0x0005, 0x080c, 0x2b91, 0x6054, 0xd0ac, 0x090c, 0x0dfa, - 0x2009, 0x1987, 0x9084, 0x7e00, 0x8007, 0x8004, 0x8004, 0x200a, - 0x00ce, 0x003e, 0x002e, 0x001e, 0x0005, 0x0006, 0x00c6, 0x2061, - 0x0100, 0x6050, 0xc0cd, 0x6052, 0x00ce, 0x000e, 0x0005, 0x2f6b, - 0x2f6b, 0x2d8f, 0x2d8f, 0x2d9b, 0x2d9b, 0x2da7, 0x2da7, 0x2db5, - 0x2db5, 0x2dc1, 0x2dc1, 0x2dcf, 0x2dcf, 0x2ddd, 0x2ddd, 0x2def, - 0x2def, 0x2dfb, 0x2dfb, 0x2e09, 0x2e09, 0x2e27, 0x2e27, 0x2e47, - 0x2e47, 0x2e17, 0x2e17, 0x2e37, 0x2e37, 0x2e55, 0x2e55, 0x2ded, - 0x2ded, 0x2ded, 0x2ded, 0x2ded, 0x2ded, 0x2ded, 0x2ded, 0x2ded, - 0x2ded, 0x2ded, 0x2ded, 0x2ded, 0x2ded, 0x2ded, 0x2ded, 0x2ded, - 0x2ded, 0x2ded, 0x2ded, 0x2ded, 0x2ded, 0x2ded, 0x2ded, 0x2ded, - 0x2ded, 0x2ded, 0x2ded, 0x2ded, 0x2ded, 0x2ded, 0x2ded, 0x2e67, - 0x2e67, 0x2e73, 0x2e73, 0x2e81, 0x2e81, 0x2e8f, 0x2e8f, 0x2e9f, - 0x2e9f, 0x2ead, 0x2ead, 0x2ebd, 0x2ebd, 0x2ecd, 0x2ecd, 0x2edf, - 0x2edf, 0x2eed, 0x2eed, 0x2efd, 0x2efd, 0x2f1f, 0x2f1f, 0x2f41, - 0x2f41, 0x2f0d, 0x2f0d, 0x2f30, 0x2f30, 0x2f50, 0x2f50, 0x2ded, - 0x2ded, 0x2ded, 0x2ded, 0x2ded, 0x2ded, 0x2ded, 0x2ded, 0x2ded, - 0x2ded, 0x2ded, 0x2ded, 0x2ded, 0x2ded, 0x2ded, 0x2ded, 0x2ded, - 0x2ded, 0x2ded, 0x2ded, 0x2ded, 0x2ded, 0x2ded, 0x2ded, 0x2ded, - 0x2ded, 0x2ded, 0x2ded, 0x2ded, 0x2ded, 0x2ded, 0x2ded, 0x2ded, - 0x2ded, 0x2ded, 0x2ded, 0x2ded, 0x2ded, 0x2ded, 0x2ded, 0x2ded, - 0x2ded, 0x2ded, 0x2ded, 0x2ded, 0x2ded, 0x2ded, 0x2ded, 0x0106, - 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, - 0x23c6, 0x0804, 0x2f63, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, - 0x0136, 0x0146, 0x0156, 0x080c, 0x21cd, 0x0804, 0x2f63, 0x0106, - 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, - 0x21cd, 0x080c, 0x23c6, 0x0804, 0x2f63, 0x0106, 0x0006, 0x0126, - 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2208, 0x0804, - 0x2f63, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, - 0x0156, 0x080c, 0x23c6, 0x080c, 0x2208, 0x0804, 0x2f63, 0x0106, - 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, - 0x21cd, 0x080c, 0x2208, 0x0804, 0x2f63, 0x0106, 0x0006, 0x0126, - 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x21cd, 0x080c, - 0x23c6, 0x080c, 0x2208, 0x0804, 0x2f63, 0xa001, 0x0cf0, 0x0106, - 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, - 0x1370, 0x0804, 0x2f63, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, - 0x0136, 0x0146, 0x0156, 0x080c, 0x23c6, 0x080c, 0x1370, 0x0804, - 0x2f63, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, - 0x0156, 0x080c, 0x21cd, 0x080c, 0x1370, 0x0804, 0x2f63, 0x0106, - 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, - 0x23c6, 0x080c, 0x1370, 0x080c, 0x2208, 0x0804, 0x2f63, 0x0106, - 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, - 0x21cd, 0x080c, 0x23c6, 0x080c, 0x1370, 0x0804, 0x2f63, 0x0106, - 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, - 0x21cd, 0x080c, 0x1370, 0x080c, 0x2208, 0x0804, 0x2f63, 0x0106, - 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, - 0x1370, 0x080c, 0x2208, 0x0804, 0x2f63, 0x0106, 0x0006, 0x0126, - 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x21cd, 0x080c, - 0x23c6, 0x080c, 0x1370, 0x080c, 0x2208, 0x0804, 0x2f63, 0x0106, - 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, - 0x2871, 0x0804, 0x2f63, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, - 0x0136, 0x0146, 0x0156, 0x080c, 0x2871, 0x080c, 0x23c6, 0x0804, - 0x2f63, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, - 0x0156, 0x080c, 0x2871, 0x080c, 0x21cd, 0x0804, 0x2f63, 0x0106, - 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, - 0x2871, 0x080c, 0x21cd, 0x080c, 0x23c6, 0x0804, 0x2f63, 0x0106, - 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, - 0x2871, 0x080c, 0x2208, 0x0804, 0x2f63, 0x0106, 0x0006, 0x0126, - 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2871, 0x080c, - 0x23c6, 0x080c, 0x2208, 0x0804, 0x2f63, 0x0106, 0x0006, 0x0126, - 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2871, 0x080c, - 0x21cd, 0x080c, 0x2208, 0x0804, 0x2f63, 0x0106, 0x0006, 0x0126, - 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2871, 0x080c, - 0x21cd, 0x080c, 0x23c6, 0x080c, 0x2208, 0x0804, 0x2f63, 0x0106, - 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, - 0x2871, 0x080c, 0x1370, 0x0804, 0x2f63, 0x0106, 0x0006, 0x0126, - 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2871, 0x080c, - 0x23c6, 0x080c, 0x1370, 0x0804, 0x2f63, 0x0106, 0x0006, 0x0126, - 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2871, 0x080c, - 0x21cd, 0x080c, 0x1370, 0x0804, 0x2f63, 0x0106, 0x0006, 0x0126, - 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2871, 0x080c, - 0x23c6, 0x080c, 0x1370, 0x080c, 0x2208, 0x0804, 0x2f63, 0x0106, - 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, - 0x2871, 0x080c, 0x21cd, 0x080c, 0x23c6, 0x080c, 0x1370, 0x0498, + 0x0df6, 0x0026, 0x2001, 0x0105, 0x2003, 0x0010, 0x782b, 0x0004, + 0x7003, 0x0000, 0x7004, 0x2060, 0x6014, 0x2048, 0x080c, 0xbd4e, + 0x0118, 0xa880, 0xc0bd, 0xa882, 0x6020, 0x9086, 0x0006, 0x1180, + 0x2061, 0x0100, 0x62c8, 0x2001, 0x00fa, 0x8001, 0x1df0, 0x60c8, + 0x9206, 0x1dc0, 0x60c4, 0xa89a, 0x60c8, 0xa896, 0x7004, 0x2060, + 0x00c6, 0x080c, 0xb983, 0x00ce, 0x2001, 0x19d1, 0x2004, 0x9c06, + 0x1160, 0x2009, 0x0040, 0x080c, 0x2200, 0x080c, 0x9a8f, 0x2011, + 0x0000, 0x080c, 0x992d, 0x080c, 0x8c6c, 0x002e, 0x0804, 0x1e2e, + 0x0126, 0x2091, 0x2400, 0xa858, 0x2040, 0x792c, 0x782b, 0x0002, + 0x9184, 0x0700, 0x1904, 0x1cc1, 0x7000, 0x0002, 0x1e2e, 0x1d12, + 0x1d7f, 0x1e2c, 0x8001, 0x7002, 0xd19c, 0x1150, 0x8aff, 0x05b0, + 0x080c, 0x1b71, 0x0904, 0x1e2e, 0x080c, 0x1b71, 0x0804, 0x1e2e, + 0x782b, 0x0004, 0xd194, 0x0148, 0xa880, 0xc0fc, 0xa882, 0x8aff, + 0x11d8, 0xa87c, 0xc0f5, 0xa87e, 0x00b8, 0x0026, 0x0036, 0xab3c, + 0xaa40, 0x7810, 0xa82e, 0x931a, 0x7814, 0xa832, 0x9213, 0x7800, + 0xa81e, 0x7804, 0xa822, 0xab3e, 0xaa42, 0x003e, 0x002e, 0x080c, + 0x1e94, 0xa880, 0xc0fd, 0xa882, 0x2a00, 0xa816, 0x2800, 0xa85a, + 0x2c00, 0xa812, 0x7003, 0x0000, 0x0804, 0x1e2e, 0x00f6, 0x0026, + 0x781c, 0x0006, 0x7818, 0x0006, 0x2079, 0x0100, 0x7a14, 0x9284, + 0x1984, 0x9085, 0x0012, 0x7816, 0x0036, 0x2019, 0x1000, 0x8319, + 0x090c, 0x0df6, 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, 0x0804, 0x1e2e, 0x8001, + 0x7002, 0xd194, 0x0170, 0x782c, 0xd0fc, 0x1904, 0x1d05, 0xd19c, + 0x1904, 0x1e2a, 0x8aff, 0x0904, 0x1e2e, 0x080c, 0x1b71, 0x0804, + 0x1e2e, 0x0026, 0x0036, 0xab3c, 0xaa40, 0x080c, 0x1e94, 0xdd9c, + 0x1904, 0x1de9, 0x2c05, 0x908a, 0x0036, 0x1a0c, 0x0df6, 0x9082, + 0x001b, 0x0002, 0x1dbd, 0x1dbd, 0x1dbf, 0x1dbd, 0x1dbd, 0x1dbd, + 0x1dc5, 0x1dbd, 0x1dbd, 0x1dbd, 0x1dcb, 0x1dbd, 0x1dbd, 0x1dbd, + 0x1dd1, 0x1dbd, 0x1dbd, 0x1dbd, 0x1dd7, 0x1dbd, 0x1dbd, 0x1dbd, + 0x1ddd, 0x1dbd, 0x1dbd, 0x1dbd, 0x1de3, 0x080c, 0x0df6, 0xa07c, + 0x931a, 0xa080, 0x9213, 0x0804, 0x1d31, 0xa08c, 0x931a, 0xa090, + 0x9213, 0x0804, 0x1d31, 0xa09c, 0x931a, 0xa0a0, 0x9213, 0x0804, + 0x1d31, 0xa0ac, 0x931a, 0xa0b0, 0x9213, 0x0804, 0x1d31, 0xa0bc, + 0x931a, 0xa0c0, 0x9213, 0x0804, 0x1d31, 0xa0cc, 0x931a, 0xa0d0, + 0x9213, 0x0804, 0x1d31, 0xa0dc, 0x931a, 0xa0e0, 0x9213, 0x0804, + 0x1d31, 0x2c05, 0x908a, 0x0034, 0x1a0c, 0x0df6, 0x9082, 0x001b, + 0x0002, 0x1e0c, 0x1e0a, 0x1e0a, 0x1e0a, 0x1e0a, 0x1e0a, 0x1e12, + 0x1e0a, 0x1e0a, 0x1e0a, 0x1e0a, 0x1e0a, 0x1e18, 0x1e0a, 0x1e0a, + 0x1e0a, 0x1e0a, 0x1e0a, 0x1e1e, 0x1e0a, 0x1e0a, 0x1e0a, 0x1e0a, + 0x1e0a, 0x1e24, 0x080c, 0x0df6, 0xa07c, 0x931a, 0xa080, 0x9213, + 0x0804, 0x1d31, 0xa094, 0x931a, 0xa098, 0x9213, 0x0804, 0x1d31, + 0xa0ac, 0x931a, 0xa0b0, 0x9213, 0x0804, 0x1d31, 0xa0c4, 0x931a, + 0xa0c8, 0x9213, 0x0804, 0x1d31, 0xa0dc, 0x931a, 0xa0e0, 0x9213, + 0x0804, 0x1d31, 0x0804, 0x1d2d, 0x080c, 0x0df6, 0x012e, 0x0005, + 0x00f6, 0x00e6, 0x2071, 0x1a42, 0x7000, 0x9086, 0x0000, 0x0904, + 0x1e79, 0x2079, 0x0090, 0x2009, 0x0207, 0x210c, 0xd194, 0x01b8, + 0x2009, 0x020c, 0x210c, 0x9184, 0x0003, 0x0188, 0x080c, 0xdbfc, + 0x2001, 0x0133, 0x2004, 0x9005, 0x090c, 0x0df6, 0x0016, 0x2009, + 0x0040, 0x080c, 0x2200, 0x001e, 0x2001, 0x020c, 0x2102, 0x2009, + 0x0206, 0x2104, 0x2009, 0x0203, 0x210c, 0x9106, 0x1120, 0x2009, + 0x0040, 0x080c, 0x2200, 0x782c, 0xd0fc, 0x09a8, 0x080c, 0x1d00, + 0x7000, 0x9086, 0x0000, 0x1978, 0x782b, 0x0004, 0x782c, 0xd0ac, + 0x1de8, 0x2009, 0x0040, 0x080c, 0x2200, 0x782b, 0x0002, 0x7003, + 0x0000, 0x00ee, 0x00fe, 0x0005, 0x8c60, 0x2c05, 0x9005, 0x0110, + 0x8a51, 0x0005, 0xa004, 0x9005, 0x0168, 0xa85a, 0x2040, 0xa064, + 0x9084, 0x000f, 0x9080, 0x1ebe, 0x2065, 0x8cff, 0x090c, 0x0df6, + 0x8a51, 0x0005, 0x2050, 0x0005, 0x8a50, 0x8c61, 0x2c05, 0x9005, + 0x1190, 0x2800, 0x9906, 0x0120, 0xa000, 0x9005, 0x1108, 0x2900, + 0x2040, 0xa85a, 0xa064, 0x9084, 0x000f, 0x9080, 0x1ece, 0x2065, + 0x8cff, 0x090c, 0x0df6, 0x0005, 0x0000, 0x001d, 0x0021, 0x0025, + 0x0029, 0x002d, 0x0031, 0x0035, 0x0000, 0x001b, 0x0021, 0x0027, + 0x002d, 0x0033, 0x0000, 0x0000, 0x0023, 0x0000, 0x0000, 0x1eb1, + 0x1ead, 0x0000, 0x0000, 0x1ebb, 0x0000, 0x1eb1, 0x1eb8, 0x1eb8, + 0x1eb5, 0x0000, 0x0000, 0x0000, 0x1ebb, 0x1eb8, 0x0000, 0x1eb3, + 0x1eb3, 0x0000, 0x0000, 0x1ebb, 0x0000, 0x1eb3, 0x1eb9, 0x1eb9, + 0x1eb9, 0x0000, 0x0000, 0x0000, 0x1ebb, 0x1eb9, 0x00c6, 0x00d6, + 0x0086, 0xab42, 0xac3e, 0xa888, 0x9055, 0x0904, 0x20bd, 0x2940, + 0xa064, 0x90ec, 0x000f, 0x9084, 0x00ff, 0x9086, 0x0008, 0x1118, + 0x2061, 0x1eb9, 0x00d0, 0x9de0, 0x1ebe, 0x9d86, 0x0007, 0x0130, + 0x9d86, 0x000e, 0x0118, 0x9d86, 0x000f, 0x1120, 0xa08c, 0x9422, + 0xa090, 0x931b, 0x2c05, 0x9065, 0x1140, 0x0310, 0x0804, 0x20bd, + 0xa004, 0x9045, 0x0904, 0x20bd, 0x08d8, 0x2c05, 0x9005, 0x0904, + 0x1fa5, 0xdd9c, 0x1904, 0x1f61, 0x908a, 0x0036, 0x1a0c, 0x0df6, + 0x9082, 0x001b, 0x0002, 0x1f36, 0x1f36, 0x1f38, 0x1f36, 0x1f36, + 0x1f36, 0x1f3e, 0x1f36, 0x1f36, 0x1f36, 0x1f44, 0x1f36, 0x1f36, + 0x1f36, 0x1f4a, 0x1f36, 0x1f36, 0x1f36, 0x1f50, 0x1f36, 0x1f36, + 0x1f36, 0x1f56, 0x1f36, 0x1f36, 0x1f36, 0x1f5c, 0x080c, 0x0df6, + 0xa07c, 0x9422, 0xa080, 0x931b, 0x0804, 0x1f9b, 0xa08c, 0x9422, + 0xa090, 0x931b, 0x0804, 0x1f9b, 0xa09c, 0x9422, 0xa0a0, 0x931b, + 0x0804, 0x1f9b, 0xa0ac, 0x9422, 0xa0b0, 0x931b, 0x0804, 0x1f9b, + 0xa0bc, 0x9422, 0xa0c0, 0x931b, 0x0804, 0x1f9b, 0xa0cc, 0x9422, + 0xa0d0, 0x931b, 0x0804, 0x1f9b, 0xa0dc, 0x9422, 0xa0e0, 0x931b, + 0x04d0, 0x908a, 0x0034, 0x1a0c, 0x0df6, 0x9082, 0x001b, 0x0002, + 0x1f83, 0x1f81, 0x1f81, 0x1f81, 0x1f81, 0x1f81, 0x1f88, 0x1f81, + 0x1f81, 0x1f81, 0x1f81, 0x1f81, 0x1f8d, 0x1f81, 0x1f81, 0x1f81, + 0x1f81, 0x1f81, 0x1f92, 0x1f81, 0x1f81, 0x1f81, 0x1f81, 0x1f81, + 0x1f97, 0x080c, 0x0df6, 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, 0x20bd, 0x8c60, 0x0804, 0x1f0d, 0xa004, 0x9045, 0x0904, + 0x20bd, 0x0804, 0x1ee8, 0x8a51, 0x0904, 0x20bd, 0x8c60, 0x2c05, + 0x9005, 0x1158, 0xa004, 0x9045, 0x0904, 0x20bd, 0xa064, 0x90ec, + 0x000f, 0x9de0, 0x1ebe, 0x2c05, 0x2060, 0xa880, 0xc0fc, 0xa882, + 0x0804, 0x20b2, 0x2c05, 0x8422, 0x8420, 0x831a, 0x9399, 0x0000, + 0xac2e, 0xab32, 0xdd9c, 0x1904, 0x204f, 0x9082, 0x001b, 0x0002, + 0x1feb, 0x1feb, 0x1fed, 0x1feb, 0x1feb, 0x1feb, 0x1ffb, 0x1feb, + 0x1feb, 0x1feb, 0x2009, 0x1feb, 0x1feb, 0x1feb, 0x2017, 0x1feb, + 0x1feb, 0x1feb, 0x2025, 0x1feb, 0x1feb, 0x1feb, 0x2033, 0x1feb, + 0x1feb, 0x1feb, 0x2041, 0x080c, 0x0df6, 0xa17c, 0x2400, 0x9122, + 0xa180, 0x2300, 0x911b, 0x0a0c, 0x0df6, 0xa074, 0x9420, 0xa078, + 0x9319, 0x0804, 0x20ad, 0xa18c, 0x2400, 0x9122, 0xa190, 0x2300, + 0x911b, 0x0a0c, 0x0df6, 0xa084, 0x9420, 0xa088, 0x9319, 0x0804, + 0x20ad, 0xa19c, 0x2400, 0x9122, 0xa1a0, 0x2300, 0x911b, 0x0a0c, + 0x0df6, 0xa094, 0x9420, 0xa098, 0x9319, 0x0804, 0x20ad, 0xa1ac, + 0x2400, 0x9122, 0xa1b0, 0x2300, 0x911b, 0x0a0c, 0x0df6, 0xa0a4, + 0x9420, 0xa0a8, 0x9319, 0x0804, 0x20ad, 0xa1bc, 0x2400, 0x9122, + 0xa1c0, 0x2300, 0x911b, 0x0a0c, 0x0df6, 0xa0b4, 0x9420, 0xa0b8, + 0x9319, 0x0804, 0x20ad, 0xa1cc, 0x2400, 0x9122, 0xa1d0, 0x2300, + 0x911b, 0x0a0c, 0x0df6, 0xa0c4, 0x9420, 0xa0c8, 0x9319, 0x0804, + 0x20ad, 0xa1dc, 0x2400, 0x9122, 0xa1e0, 0x2300, 0x911b, 0x0a0c, + 0x0df6, 0xa0d4, 0x9420, 0xa0d8, 0x9319, 0x0804, 0x20ad, 0x9082, + 0x001b, 0x0002, 0x206d, 0x206b, 0x206b, 0x206b, 0x206b, 0x206b, + 0x207a, 0x206b, 0x206b, 0x206b, 0x206b, 0x206b, 0x2087, 0x206b, + 0x206b, 0x206b, 0x206b, 0x206b, 0x2094, 0x206b, 0x206b, 0x206b, + 0x206b, 0x206b, 0x20a1, 0x080c, 0x0df6, 0xa17c, 0x2400, 0x9122, + 0xa180, 0x2300, 0x911b, 0x0a0c, 0x0df6, 0xa06c, 0x9420, 0xa070, + 0x9319, 0x0498, 0xa194, 0x2400, 0x9122, 0xa198, 0x2300, 0x911b, + 0x0a0c, 0x0df6, 0xa084, 0x9420, 0xa088, 0x9319, 0x0430, 0xa1ac, + 0x2400, 0x9122, 0xa1b0, 0x2300, 0x911b, 0x0a0c, 0x0df6, 0xa09c, + 0x9420, 0xa0a0, 0x9319, 0x00c8, 0xa1c4, 0x2400, 0x9122, 0xa1c8, + 0x2300, 0x911b, 0x0a0c, 0x0df6, 0xa0b4, 0x9420, 0xa0b8, 0x9319, + 0x0060, 0xa1dc, 0x2400, 0x9122, 0xa1e0, 0x2300, 0x911b, 0x0a0c, + 0x0df6, 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, + 0x0def, 0x9084, 0x0007, 0x0002, 0x20de, 0x1d00, 0x20de, 0x20d4, + 0x20d7, 0x20da, 0x20d7, 0x20da, 0x080c, 0x1d00, 0x0005, 0x080c, + 0x11ee, 0x0005, 0x080c, 0x1d00, 0x080c, 0x11ee, 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, 0x21fd, 0x7900, 0xd1dc, 0x1118, 0x9084, + 0x0006, 0x001a, 0x9084, 0x000e, 0x0002, 0x2125, 0x211d, 0x7b33, + 0x211d, 0x211f, 0x211f, 0x211f, 0x211f, 0x7b19, 0x211d, 0x2121, + 0x211d, 0x211f, 0x211d, 0x211f, 0x211d, 0x080c, 0x0df6, 0x0031, + 0x0020, 0x080c, 0x7b19, 0x080c, 0x7b33, 0x0005, 0x0006, 0x0016, + 0x0026, 0x080c, 0xdbfc, 0x7930, 0x9184, 0x0003, 0x01c0, 0x2001, + 0x19d1, 0x2004, 0x9005, 0x0170, 0x2001, 0x0133, 0x2004, 0x9005, + 0x090c, 0x0df6, 0x00c6, 0x2001, 0x19d1, 0x2064, 0x080c, 0xb983, + 0x00ce, 0x00f8, 0x2009, 0x0040, 0x080c, 0x2200, 0x00d0, 0x9184, + 0x0014, 0x01a0, 0x6a00, 0x9286, 0x0003, 0x0160, 0x080c, 0x717e, + 0x1138, 0x080c, 0x747a, 0x080c, 0x5e2f, 0x080c, 0x709e, 0x0010, + 0x080c, 0x5cee, 0x080c, 0x7be2, 0x0041, 0x0018, 0x9184, 0x9540, + 0x1dc8, 0x002e, 0x001e, 0x000e, 0x0005, 0x00e6, 0x0036, 0x0046, + 0x0056, 0x2071, 0x1a3f, 0x080c, 0x1977, 0x005e, 0x004e, 0x003e, + 0x00ee, 0x0005, 0x0126, 0x2091, 0x2e00, 0x2071, 0x1800, 0x7128, + 0x2001, 0x1949, 0x2102, 0x2001, 0x1951, 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, 0x0def, + 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, 0x2a9d, 0x080c, 0x2974, + 0x2001, 0x0100, 0x2004, 0x9086, 0x000a, 0x0558, 0x6054, 0x8004, + 0x8004, 0x8004, 0x8004, 0x9084, 0x000c, 0x6150, 0x918c, 0xfff3, + 0x9105, 0x6052, 0x6050, 0x9084, 0xb17f, 0x9085, 0x2000, 0x6052, + 0x2009, 0x1977, 0x2011, 0x1978, 0x6358, 0x939c, 0x38f0, 0x2320, + 0x080c, 0x29e1, 0x1238, 0x939d, 0x4003, 0x94a5, 0x8603, 0x230a, + 0x2412, 0x0030, 0x939d, 0x0203, 0x94a5, 0x8603, 0x230a, 0x2412, + 0x0050, 0x2001, 0x1977, 0x2003, 0x0700, 0x2001, 0x1978, 0x2003, + 0x0700, 0x080c, 0x2ba9, 0x9006, 0x080c, 0x29a3, 0x9006, 0x080c, + 0x2986, 0x20a9, 0x0012, 0x1d04, 0x2263, 0x2091, 0x6000, 0x1f04, + 0x2263, 0x602f, 0x0100, 0x602f, 0x0000, 0x6050, 0x9085, 0x0400, + 0x9084, 0xdfff, 0x6052, 0x6024, 0x6026, 0x080c, 0x26a6, 0x2009, + 0x00ef, 0x6132, 0x6136, 0x080c, 0x26b6, 0x60e7, 0x0000, 0x61ea, + 0x60e3, 0x0002, 0x604b, 0xf7f7, 0x6043, 0x0000, 0x602f, 0x0080, + 0x602f, 0x0000, 0x6007, 0x149f, 0x60bb, 0x0000, 0x20a9, 0x0018, + 0x60bf, 0x0000, 0x1f04, 0x2290, 0x60bb, 0x0000, 0x60bf, 0x0108, + 0x60bf, 0x0012, 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, 0x1834, 0x2003, 0x0000, 0x2001, + 0x1833, 0x2003, 0x0001, 0x0005, 0x0126, 0x2091, 0x2800, 0x0006, + 0x0016, 0x0026, 0x6124, 0x9184, 0x5e2c, 0x1118, 0x9184, 0x0007, + 0x002a, 0x9195, 0x0004, 0x9284, 0x0007, 0x0002, 0x22f0, 0x22d6, + 0x22d9, 0x22dc, 0x22e1, 0x22e3, 0x22e7, 0x22eb, 0x080c, 0x84e2, + 0x00b8, 0x080c, 0x85b1, 0x00a0, 0x080c, 0x85b1, 0x080c, 0x84e2, + 0x0078, 0x0099, 0x0068, 0x080c, 0x84e2, 0x0079, 0x0048, 0x080c, + 0x85b1, 0x0059, 0x0028, 0x080c, 0x85b1, 0x080c, 0x84e2, 0x0029, + 0x002e, 0x001e, 0x000e, 0x012e, 0x0005, 0x00a6, 0x6124, 0x6028, + 0xd09c, 0x0118, 0xd19c, 0x1904, 0x2547, 0xd1f4, 0x190c, 0x0def, + 0x080c, 0x717e, 0x0904, 0x234b, 0x080c, 0xc459, 0x1120, 0x7000, + 0x9086, 0x0003, 0x0570, 0x6024, 0x9084, 0x1800, 0x0550, 0x080c, + 0x71a1, 0x0118, 0x080c, 0x718f, 0x1520, 0x6027, 0x0020, 0x6043, + 0x0000, 0x080c, 0xc459, 0x0168, 0x080c, 0x71a1, 0x1150, 0x2001, + 0x1982, 0x2003, 0x0001, 0x6027, 0x1800, 0x080c, 0x6fed, 0x0804, + 0x254a, 0x70a0, 0x9005, 0x1150, 0x70a3, 0x0001, 0x00d6, 0x2069, + 0x0140, 0x080c, 0x71d2, 0x00de, 0x1904, 0x254a, 0x080c, 0x7484, + 0x0428, 0x080c, 0x71a1, 0x1590, 0x6024, 0x9084, 0x1800, 0x1108, + 0x0468, 0x080c, 0x7484, 0x080c, 0x747a, 0x080c, 0x5e2f, 0x080c, + 0x709e, 0x0804, 0x2547, 0xd1ac, 0x1508, 0x6024, 0xd0dc, 0x1170, + 0xd0e4, 0x1178, 0xd0d4, 0x1190, 0xd0cc, 0x0130, 0x7094, 0x9086, + 0x0029, 0x1110, 0x080c, 0x7369, 0x0804, 0x2547, 0x080c, 0x747f, + 0x0048, 0x2001, 0x1957, 0x2003, 0x0002, 0x0020, 0x080c, 0x72cd, + 0x0804, 0x2547, 0x080c, 0x7403, 0x0804, 0x2547, 0xd1ac, 0x0904, + 0x2468, 0x080c, 0x717e, 0x11c0, 0x6027, 0x0020, 0x0006, 0x0026, + 0x0036, 0x080c, 0x7198, 0x1158, 0x080c, 0x747a, 0x080c, 0x5e2f, + 0x080c, 0x709e, 0x003e, 0x002e, 0x000e, 0x00ae, 0x0005, 0x003e, + 0x002e, 0x000e, 0x080c, 0x7156, 0x0016, 0x0046, 0x00c6, 0x644c, + 0x9486, 0xf0f0, 0x1138, 0x2061, 0x0100, 0x644a, 0x6043, 0x0090, + 0x6043, 0x0010, 0x74d6, 0x948c, 0xff00, 0x7038, 0xd084, 0x0190, + 0x080c, 0xc459, 0x1118, 0x9186, 0xf800, 0x1160, 0x7044, 0xd084, + 0x1148, 0xc085, 0x7046, 0x0036, 0x2418, 0x2011, 0x8016, 0x080c, + 0x4a17, 0x003e, 0x080c, 0xc452, 0x1904, 0x2445, 0x9196, 0xff00, + 0x05a8, 0x705c, 0x9084, 0x00ff, 0x810f, 0x81ff, 0x0110, 0x9116, + 0x0568, 0x7130, 0xd184, 0x1550, 0x080c, 0x31ee, 0x0128, 0xc18d, + 0x7132, 0x080c, 0x66c1, 0x1510, 0x6240, 0x9294, 0x0010, 0x0130, + 0x6248, 0x9294, 0xff00, 0x9296, 0xff00, 0x01c0, 0x7030, 0xd08c, + 0x0904, 0x2445, 0x7038, 0xd08c, 0x1140, 0x2001, 0x180c, 0x200c, + 0xd1ac, 0x1904, 0x2445, 0xc1ad, 0x2102, 0x0036, 0x73d4, 0x2011, + 0x8013, 0x080c, 0x4a17, 0x003e, 0x0804, 0x2445, 0x7038, 0xd08c, + 0x1140, 0x2001, 0x180c, 0x200c, 0xd1ac, 0x1904, 0x2445, 0xc1ad, + 0x2102, 0x0036, 0x73d4, 0x2011, 0x8013, 0x080c, 0x4a17, 0x003e, + 0x7130, 0xc185, 0x7132, 0x2011, 0x185c, 0x220c, 0x00f0, 0x0016, + 0x2009, 0x0001, 0x2011, 0x0100, 0x080c, 0x8450, 0x2019, 0x000e, + 0x00c6, 0x2061, 0x0000, 0x080c, 0xd7af, 0x00ce, 0x9484, 0x00ff, + 0x9080, 0x31f3, 0x200d, 0x918c, 0xff00, 0x810f, 0x2120, 0x9006, + 0x2009, 0x000e, 0x080c, 0xd837, 0x001e, 0xd1ac, 0x1148, 0x0016, + 0x2009, 0x0002, 0x2019, 0x0004, 0x080c, 0x3060, 0x001e, 0x00a8, + 0x0156, 0x00b6, 0x20a9, 0x007f, 0x900e, 0x080c, 0x63a3, 0x1140, + 0x7030, 0xd084, 0x1118, 0xb800, 0xd0bc, 0x1110, 0x080c, 0x5e49, + 0x8108, 0x1f04, 0x2435, 0x00be, 0x015e, 0x00ce, 0x004e, 0x080c, + 0x9f70, 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, 0x1825, 0x2003, 0x0000, 0x6027, 0x0020, + 0xd194, 0x0904, 0x2547, 0x0016, 0x6220, 0xd2b4, 0x0904, 0x24f0, + 0x080c, 0x82d9, 0x080c, 0x961a, 0x6027, 0x0004, 0x00f6, 0x2019, + 0x19cb, 0x2304, 0x907d, 0x0904, 0x24bf, 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, + 0x2b7f, 0x2001, 0x001e, 0x8001, 0x0240, 0x20a9, 0x0009, 0x080c, + 0x2a78, 0x6904, 0xd1dc, 0x1140, 0x0cb0, 0x2001, 0x0100, 0x080c, + 0x2b6f, 0x9006, 0x080c, 0x2b6f, 0x080c, 0x8a83, 0x080c, 0x8b8f, + 0x7814, 0x2048, 0xa867, 0x0103, 0x2f60, 0x080c, 0x9fea, 0x009e, + 0x00ee, 0x00ce, 0x00de, 0x00fe, 0x001e, 0x00ae, 0x0005, 0x00fe, + 0x00d6, 0x2069, 0x0140, 0x6804, 0x9084, 0x4000, 0x0110, 0x080c, + 0x2b7f, 0x00de, 0x00c6, 0x2061, 0x19c2, 0x6028, 0x080c, 0xc459, + 0x0120, 0x909a, 0x0003, 0x1258, 0x0018, 0x909a, 0x00c8, 0x1238, + 0x8000, 0x602a, 0x00ce, 0x080c, 0x95f6, 0x0804, 0x2546, 0x2061, + 0x0100, 0x62c0, 0x080c, 0x9df6, 0x2019, 0x19cb, 0x2304, 0x9065, + 0x0120, 0x2009, 0x0027, 0x080c, 0xa068, 0x00ce, 0x0804, 0x2546, + 0xd2bc, 0x0904, 0x2533, 0x080c, 0x82e6, 0x6014, 0x9084, 0x1984, + 0x9085, 0x0010, 0x6016, 0x6027, 0x0004, 0x00d6, 0x2069, 0x0140, + 0x6804, 0x9084, 0x4000, 0x0110, 0x080c, 0x2b7f, 0x00de, 0x00c6, + 0x2061, 0x19c2, 0x6044, 0x080c, 0xc459, 0x0120, 0x909a, 0x0003, + 0x1628, 0x0018, 0x909a, 0x00c8, 0x1608, 0x8000, 0x6046, 0x603c, + 0x00ce, 0x9005, 0x0558, 0x2009, 0x07d0, 0x080c, 0x82de, 0x9080, + 0x0008, 0x2004, 0x9086, 0x0006, 0x1138, 0x6114, 0x918c, 0x1984, + 0x918d, 0x0012, 0x6116, 0x00d0, 0x6114, 0x918c, 0x1984, 0x918d, + 0x0016, 0x6116, 0x0098, 0x6027, 0x0004, 0x0080, 0x0036, 0x2019, + 0x0001, 0x080c, 0x98b1, 0x003e, 0x2019, 0x19d1, 0x2304, 0x9065, + 0x0120, 0x2009, 0x004f, 0x080c, 0xa068, 0x00ce, 0x001e, 0xd19c, + 0x0904, 0x2611, 0x7038, 0xd0ac, 0x1904, 0x25e6, 0x0016, 0x0156, + 0x6027, 0x0008, 0x2001, 0x0100, 0x2004, 0x9086, 0x000a, 0x0904, + 0x25c3, 0x6050, 0x9085, 0x0040, 0x6052, 0x6050, 0x9084, 0xfbcf, + 0x6052, 0x080c, 0x2a97, 0x9085, 0x2000, 0x6052, 0x20a9, 0x0012, + 0x1d04, 0x2568, 0x080c, 0x830d, 0x1f04, 0x2568, 0x6050, 0x9085, + 0x0400, 0x9084, 0xdfbf, 0x6052, 0x20a9, 0x0028, 0xa001, 0x1f04, + 0x2576, 0x6150, 0x9185, 0x1400, 0x6052, 0x20a9, 0x0366, 0x1d04, + 0x257f, 0x080c, 0x830d, 0x6020, 0xd09c, 0x1138, 0x015e, 0x6152, + 0x001e, 0x6027, 0x0008, 0x0804, 0x2611, 0x080c, 0x2a5f, 0x1f04, + 0x257f, 0x015e, 0x6152, 0x001e, 0x6027, 0x0008, 0x0016, 0x6028, + 0xc09c, 0x602a, 0x080c, 0x9f70, 0x60e3, 0x0000, 0x080c, 0xdbdb, + 0x080c, 0xdbf6, 0x080c, 0x54df, 0xd0fc, 0x1138, 0x080c, 0xc452, + 0x1120, 0x9085, 0x0001, 0x080c, 0x71c2, 0x9006, 0x080c, 0x2b6f, + 0x2009, 0x0002, 0x080c, 0x2a9d, 0x00e6, 0x2071, 0x1800, 0x7003, + 0x0004, 0x080c, 0x0ecc, 0x00ee, 0x6027, 0x0008, 0x080c, 0x0b8f, + 0x001e, 0x0804, 0x2611, 0x080c, 0x2ba9, 0x080c, 0x2bdc, 0x6050, + 0xc0e5, 0x6052, 0x20a9, 0x0367, 0x0f04, 0x25e4, 0x1d04, 0x25ce, + 0x080c, 0x830d, 0x6020, 0xd09c, 0x1db8, 0x00f6, 0x2079, 0x0100, + 0x080c, 0x29f1, 0x00fe, 0x1d80, 0x6050, 0xc0e4, 0x6052, 0x6027, + 0x0008, 0x015e, 0x001e, 0x0468, 0x015e, 0x001e, 0x0016, 0x6028, + 0xc09c, 0x602a, 0x080c, 0x9f70, 0x60e3, 0x0000, 0x080c, 0xdbdb, + 0x080c, 0xdbf6, 0x080c, 0x54df, 0xd0fc, 0x1138, 0x080c, 0xc452, + 0x1120, 0x9085, 0x0001, 0x080c, 0x71c2, 0x9006, 0x080c, 0x2b6f, + 0x2009, 0x0002, 0x080c, 0x2a9d, 0x00e6, 0x2071, 0x1800, 0x7003, + 0x0004, 0x080c, 0x0ecc, 0x00ee, 0x6027, 0x0008, 0x080c, 0x0b8f, + 0x001e, 0x918c, 0xffd0, 0x6126, 0x00ae, 0x0005, 0x0006, 0x0016, + 0x0026, 0x0036, 0x00e6, 0x00f6, 0x0126, 0x2091, 0x8000, 0x2071, + 0x1800, 0x71cc, 0x70ce, 0x9116, 0x0904, 0x2665, 0x81ff, 0x01a0, + 0x2009, 0x0000, 0x080c, 0x2a9d, 0x2011, 0x8011, 0x2019, 0x010e, + 0x231c, 0x939e, 0x0007, 0x1118, 0x2019, 0x0001, 0x0010, 0x2019, + 0x0000, 0x080c, 0x4a17, 0x0448, 0x2001, 0x1983, 0x200c, 0x81ff, + 0x1140, 0x2001, 0x0109, 0x2004, 0xd0b4, 0x0118, 0x2019, 0x0003, + 0x0008, 0x2118, 0x2011, 0x8012, 0x080c, 0x4a17, 0x080c, 0x0ecc, + 0x080c, 0x54df, 0xd0fc, 0x1188, 0x080c, 0xc452, 0x1170, 0x00c6, + 0x080c, 0x2701, 0x080c, 0x9818, 0x2061, 0x0100, 0x2019, 0x0028, + 0x2009, 0x0002, 0x080c, 0x3060, 0x00ce, 0x012e, 0x00fe, 0x00ee, + 0x003e, 0x002e, 0x001e, 0x000e, 0x0005, 0x2028, 0x918c, 0x00ff, + 0x2130, 0x9094, 0xff00, 0x11f0, 0x2011, 0x1836, 0x2214, 0xd2ac, + 0x11c8, 0x81ff, 0x01e8, 0x2011, 0x181e, 0x2204, 0x9106, 0x1190, + 0x2011, 0x181f, 0x2214, 0x9294, 0xff00, 0x9584, 0xff00, 0x9206, + 0x1148, 0x2011, 0x181f, 0x2214, 0x9294, 0x00ff, 0x9584, 0x00ff, + 0x9206, 0x1120, 0x2500, 0x080c, 0x7e3f, 0x0048, 0x9584, 0x00ff, + 0x9080, 0x31f3, 0x200d, 0x918c, 0xff00, 0x810f, 0x9006, 0x0005, + 0x9080, 0x31f3, 0x200d, 0x918c, 0x00ff, 0x0005, 0x00d6, 0x2069, + 0x0140, 0x2001, 0x1817, 0x2003, 0x00ef, 0x20a9, 0x0010, 0x9006, + 0x6852, 0x6856, 0x1f04, 0x26b1, 0x00de, 0x0005, 0x0006, 0x00d6, + 0x0026, 0x2069, 0x0140, 0x2001, 0x1817, 0x2102, 0x8114, 0x8214, + 0x8214, 0x8214, 0x20a9, 0x0010, 0x6853, 0x0000, 0x9006, 0x82ff, + 0x1128, 0x9184, 0x000f, 0x9080, 0xe3a6, 0x2005, 0x6856, 0x8211, + 0x1f04, 0x26c6, 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, + 0x26f6, 0x680f, 0x0000, 0x000e, 0x001e, 0x002e, 0x00de, 0x015e, + 0x0005, 0x080c, 0x54db, 0xd0c4, 0x0150, 0xd0a4, 0x0140, 0x9006, + 0x0046, 0x2020, 0x2009, 0x002e, 0x080c, 0xd837, 0x004e, 0x0005, + 0x00f6, 0x0016, 0x0026, 0x2079, 0x0140, 0x78c4, 0xd0dc, 0x0904, + 0x276d, 0x080c, 0x29e1, 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, 0x847e, 0x928c, 0xff00, + 0x0110, 0x2011, 0x00ff, 0x2200, 0x8007, 0x9085, 0x004c, 0x78c2, + 0x2009, 0x0138, 0x220a, 0x080c, 0x717e, 0x1118, 0x2009, 0x1947, + 0x220a, 0x002e, 0x001e, 0x00fe, 0x0005, 0x78c3, 0x0000, 0x0cc8, + 0x0126, 0x2091, 0x2800, 0x0006, 0x0016, 0x0026, 0x2001, 0x0170, + 0x200c, 0x8000, 0x2014, 0x9184, 0x0003, 0x0110, 0x080c, 0x0def, + 0x002e, 0x001e, 0x000e, 0x012e, 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, 0x196a, + 0x2004, 0x908a, 0x0007, 0x1a0c, 0x0df6, 0x0033, 0x00ee, 0x002e, + 0x001e, 0x000e, 0x015e, 0x0005, 0x27cb, 0x27e9, 0x280d, 0x280f, + 0x2838, 0x283a, 0x283c, 0x2001, 0x0001, 0x080c, 0x2616, 0x080c, + 0x2a51, 0x2001, 0x196c, 0x2003, 0x0000, 0x7828, 0x9084, 0xe1d7, + 0x782a, 0x9006, 0x20a9, 0x0009, 0x080c, 0x29fd, 0x2001, 0x196a, + 0x2003, 0x0006, 0x2009, 0x001e, 0x2011, 0x283d, 0x080c, 0x82eb, + 0x0005, 0x2009, 0x196f, 0x200b, 0x0000, 0x2001, 0x1974, 0x2003, + 0x0036, 0x2001, 0x1973, 0x2003, 0x002a, 0x2001, 0x196c, 0x2003, + 0x0001, 0x9006, 0x080c, 0x2986, 0x2001, 0xffff, 0x20a9, 0x0009, + 0x080c, 0x29fd, 0x2001, 0x196a, 0x2003, 0x0006, 0x2009, 0x001e, + 0x2011, 0x283d, 0x080c, 0x82eb, 0x0005, 0x080c, 0x0df6, 0x2001, + 0x1974, 0x2003, 0x0036, 0x2001, 0x196c, 0x2003, 0x0003, 0x7a38, + 0x9294, 0x0005, 0x9296, 0x0004, 0x0110, 0x9006, 0x0010, 0x2001, + 0x0001, 0x080c, 0x2986, 0x2001, 0x1970, 0x2003, 0x0000, 0x2001, + 0xffff, 0x20a9, 0x0009, 0x080c, 0x29fd, 0x2001, 0x196a, 0x2003, + 0x0006, 0x2009, 0x001e, 0x2011, 0x283d, 0x080c, 0x82eb, 0x0005, + 0x080c, 0x0df6, 0x080c, 0x0df6, 0x0005, 0x0006, 0x0016, 0x0026, + 0x00e6, 0x00f6, 0x0156, 0x0126, 0x2091, 0x8000, 0x2079, 0x0100, + 0x2001, 0x196c, 0x2004, 0x908a, 0x0007, 0x1a0c, 0x0df6, 0x0043, + 0x012e, 0x015e, 0x00fe, 0x00ee, 0x002e, 0x001e, 0x000e, 0x0005, + 0x285f, 0x287b, 0x28b7, 0x28e3, 0x2903, 0x290f, 0x2911, 0x080c, + 0x29f1, 0x1190, 0x2009, 0x1972, 0x2104, 0x7a38, 0x9294, 0x0005, + 0x9296, 0x0004, 0x0110, 0xc08d, 0x0008, 0xc085, 0x200a, 0x2001, + 0x196a, 0x2003, 0x0001, 0x0030, 0x080c, 0x2935, 0x2001, 0xffff, + 0x080c, 0x27da, 0x0005, 0x080c, 0x2913, 0x05c0, 0x2009, 0x1973, + 0x2104, 0x8001, 0x200a, 0x080c, 0x29f1, 0x1158, 0x7a38, 0x9294, + 0x0005, 0x9296, 0x0005, 0x0518, 0x2009, 0x1972, 0x2104, 0xc085, + 0x200a, 0x2009, 0x196f, 0x2104, 0x8000, 0x200a, 0x9086, 0x0005, + 0x0118, 0x080c, 0x291b, 0x00c0, 0x200b, 0x0000, 0x7a38, 0x9294, + 0x0006, 0x9296, 0x0004, 0x0110, 0x9006, 0x0010, 0x2001, 0x0001, + 0x080c, 0x29a3, 0x2001, 0x196c, 0x2003, 0x0002, 0x0028, 0x2001, + 0x196a, 0x2003, 0x0003, 0x0010, 0x080c, 0x27fc, 0x0005, 0x080c, + 0x2913, 0x0540, 0x2009, 0x1973, 0x2104, 0x8001, 0x200a, 0x080c, + 0x29f1, 0x1148, 0x2001, 0x196a, 0x2003, 0x0003, 0x2001, 0x196b, + 0x2003, 0x0000, 0x00b8, 0x2009, 0x1973, 0x2104, 0x9005, 0x1118, + 0x080c, 0x2958, 0x0010, 0x080c, 0x2928, 0x080c, 0x291b, 0x2009, + 0x196f, 0x200b, 0x0000, 0x2001, 0x196c, 0x2003, 0x0001, 0x080c, + 0x27fc, 0x0000, 0x0005, 0x0479, 0x01e8, 0x080c, 0x29f1, 0x1198, + 0x2009, 0x1970, 0x2104, 0x8000, 0x200a, 0x9086, 0x0007, 0x0108, + 0x0078, 0x2001, 0x1975, 0x2003, 0x000a, 0x2009, 0x1972, 0x2104, + 0xc0fd, 0x200a, 0x0038, 0x00f9, 0x2001, 0x196c, 0x2003, 0x0004, + 0x080c, 0x2827, 0x0005, 0x0079, 0x0148, 0x080c, 0x29f1, 0x1118, + 0x080c, 0x2813, 0x0018, 0x0079, 0x080c, 0x2827, 0x0005, 0x080c, + 0x0df6, 0x080c, 0x0df6, 0x2009, 0x1974, 0x2104, 0x8001, 0x200a, + 0x090c, 0x2974, 0x0005, 0x7a38, 0x9294, 0x0005, 0x9296, 0x0005, + 0x0110, 0x9006, 0x0010, 0x2001, 0x0001, 0x080c, 0x29a3, 0x0005, + 0x7a38, 0x9294, 0x0006, 0x9296, 0x0006, 0x0110, 0x9006, 0x0010, + 0x2001, 0x0001, 0x080c, 0x2986, 0x0005, 0x2009, 0x196f, 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, 0x29a3, 0x0005, + 0x0086, 0x2001, 0x1972, 0x2004, 0x9084, 0x7fff, 0x090c, 0x0df6, + 0x2009, 0x1971, 0x2144, 0x8846, 0x280a, 0x9844, 0x0dd8, 0xd08c, + 0x1120, 0xd084, 0x1120, 0x080c, 0x0df6, 0x9006, 0x0010, 0x2001, + 0x0001, 0x00a1, 0x008e, 0x0005, 0x0006, 0x0156, 0x2001, 0x196a, + 0x20a9, 0x0009, 0x2003, 0x0000, 0x8000, 0x1f04, 0x297a, 0x2001, + 0x1971, 0x2003, 0x8000, 0x015e, 0x000e, 0x0005, 0x00f6, 0x2079, + 0x0100, 0x9085, 0x0000, 0x0158, 0x7838, 0x9084, 0xfff9, 0x9085, + 0x0004, 0x783a, 0x2009, 0x1977, 0x210c, 0x795a, 0x0050, 0x7838, + 0x9084, 0xfffb, 0x9085, 0x0006, 0x783a, 0x2009, 0x1978, 0x210c, + 0x795a, 0x00fe, 0x0005, 0x00f6, 0x2079, 0x0100, 0x9085, 0x0000, + 0x0188, 0x7838, 0x9084, 0xfffa, 0x9085, 0x0004, 0x783a, 0x2001, + 0x0100, 0x2004, 0x9086, 0x000a, 0x1120, 0x7850, 0x9084, 0xfff0, + 0x7852, 0x0428, 0x7838, 0x9084, 0xfffb, 0x9085, 0x0005, 0x783a, + 0x2001, 0x0100, 0x2004, 0x9086, 0x000a, 0x11c8, 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, 0x2a97, 0xd09c, + 0x1110, 0x1f04, 0x29f4, 0x015e, 0x0005, 0x0126, 0x0016, 0x0006, + 0x2091, 0x8000, 0x2001, 0x0100, 0x2004, 0x9086, 0x000a, 0x0170, + 0x7850, 0x9085, 0x0040, 0x7852, 0x7850, 0x9084, 0xfbcf, 0x7852, + 0x080c, 0x2a97, 0x9085, 0x2000, 0x7852, 0x0000, 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, 0x2a31, 0x080c, 0x830d, 0x1f04, 0x2a31, 0x2001, + 0x0100, 0x2004, 0x9086, 0x000a, 0x0160, 0x7850, 0x9085, 0x0400, + 0x9084, 0xdfbf, 0x7852, 0x080c, 0x2a97, 0x9085, 0x1000, 0x7852, + 0x0020, 0x7850, 0x9085, 0x1000, 0x7852, 0x000e, 0x001e, 0x012e, + 0x0005, 0x2001, 0x0100, 0x2004, 0x9086, 0x000a, 0x0128, 0x7850, + 0x9084, 0xffcf, 0x7852, 0x0010, 0x080c, 0x2bdc, 0x0005, 0x0006, + 0x0156, 0x00f6, 0x2079, 0x0100, 0x20a9, 0x000a, 0x7854, 0xd0ac, + 0x1130, 0x7820, 0xd0e4, 0x1140, 0x1f04, 0x2a69, 0x0028, 0x7854, + 0xd08c, 0x1110, 0x1f04, 0x2a6f, 0x00fe, 0x015e, 0x000e, 0x0005, + 0x1d04, 0x2a78, 0x080c, 0x830d, 0x1f04, 0x2a78, 0x0005, 0x0006, + 0x2001, 0x1976, 0x2004, 0x9086, 0x0000, 0x000e, 0x0005, 0x0006, + 0x2001, 0x1976, 0x2004, 0x9086, 0x0001, 0x000e, 0x0005, 0x0006, + 0x2001, 0x1976, 0x2004, 0x9086, 0x0002, 0x000e, 0x0005, 0xa001, + 0xa001, 0xa001, 0xa001, 0xa001, 0x0005, 0x0006, 0x2001, 0x1983, + 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, 0x2b10, 0x0048, 0x0016, 0x2009, 0x1a58, 0x2104, 0x8000, + 0x0208, 0x200a, 0x001e, 0x04f0, 0x2009, 0x00a2, 0x080c, 0x0e7b, + 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, 0x1a59, 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, 0x195b, 0x200c, 0x080c, 0x0e7b, + 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, 0x7198, 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, + 0x7198, 0x0110, 0xc0bc, 0x0008, 0xc0bd, 0x200a, 0x001e, 0x000e, + 0x0005, 0x0016, 0x0026, 0x0036, 0x00c6, 0x2061, 0x0100, 0x6050, + 0x9084, 0xfbff, 0x9085, 0x0040, 0x6052, 0x20a9, 0x0002, 0x080c, + 0x2a78, 0x6050, 0x9085, 0x0400, 0x9084, 0xff9f, 0x6052, 0x20a9, + 0x0005, 0x080c, 0x2a78, 0x6054, 0xd0bc, 0x090c, 0x0df6, 0x20a9, + 0x0005, 0x080c, 0x2a78, 0x6054, 0xd0ac, 0x090c, 0x0df6, 0x2009, + 0x198a, 0x9084, 0x7e00, 0x8007, 0x8004, 0x8004, 0x200a, 0x00ce, + 0x003e, 0x002e, 0x001e, 0x0005, 0x0006, 0x00c6, 0x2061, 0x0100, + 0x6050, 0xc0cd, 0x6052, 0x00ce, 0x000e, 0x0005, 0x0006, 0x0156, + 0x6050, 0x9085, 0x0040, 0x6052, 0x6050, 0x9084, 0xfbcf, 0x6052, + 0x080c, 0x2a97, 0x9085, 0x2000, 0x6052, 0x20a9, 0x0012, 0x1d04, + 0x2bf7, 0x080c, 0x830d, 0x1f04, 0x2bf7, 0x6050, 0x9085, 0x0400, + 0x9084, 0xdfbf, 0x6052, 0x015e, 0x000e, 0x0005, 0x2e72, 0x2e72, + 0x2c96, 0x2c96, 0x2ca2, 0x2ca2, 0x2cae, 0x2cae, 0x2cbc, 0x2cbc, + 0x2cc8, 0x2cc8, 0x2cd6, 0x2cd6, 0x2ce4, 0x2ce4, 0x2cf6, 0x2cf6, + 0x2d02, 0x2d02, 0x2d10, 0x2d10, 0x2d2e, 0x2d2e, 0x2d4e, 0x2d4e, + 0x2d1e, 0x2d1e, 0x2d3e, 0x2d3e, 0x2d5c, 0x2d5c, 0x2cf4, 0x2cf4, + 0x2cf4, 0x2cf4, 0x2cf4, 0x2cf4, 0x2cf4, 0x2cf4, 0x2cf4, 0x2cf4, + 0x2cf4, 0x2cf4, 0x2cf4, 0x2cf4, 0x2cf4, 0x2cf4, 0x2cf4, 0x2cf4, + 0x2cf4, 0x2cf4, 0x2cf4, 0x2cf4, 0x2cf4, 0x2cf4, 0x2cf4, 0x2cf4, + 0x2cf4, 0x2cf4, 0x2cf4, 0x2cf4, 0x2cf4, 0x2cf4, 0x2d6e, 0x2d6e, + 0x2d7a, 0x2d7a, 0x2d88, 0x2d88, 0x2d96, 0x2d96, 0x2da6, 0x2da6, + 0x2db4, 0x2db4, 0x2dc4, 0x2dc4, 0x2dd4, 0x2dd4, 0x2de6, 0x2de6, + 0x2df4, 0x2df4, 0x2e04, 0x2e04, 0x2e26, 0x2e26, 0x2e48, 0x2e48, + 0x2e14, 0x2e14, 0x2e37, 0x2e37, 0x2e57, 0x2e57, 0x2cf4, 0x2cf4, + 0x2cf4, 0x2cf4, 0x2cf4, 0x2cf4, 0x2cf4, 0x2cf4, 0x2cf4, 0x2cf4, + 0x2cf4, 0x2cf4, 0x2cf4, 0x2cf4, 0x2cf4, 0x2cf4, 0x2cf4, 0x2cf4, + 0x2cf4, 0x2cf4, 0x2cf4, 0x2cf4, 0x2cf4, 0x2cf4, 0x2cf4, 0x2cf4, + 0x2cf4, 0x2cf4, 0x2cf4, 0x2cf4, 0x2cf4, 0x2cf4, 0x2cf4, 0x2cf4, + 0x2cf4, 0x2cf4, 0x2cf4, 0x2cf4, 0x2cf4, 0x2cf4, 0x2cf4, 0x2cf4, + 0x2cf4, 0x2cf4, 0x2cf4, 0x2cf4, 0x2cf4, 0x2cf4, 0x0106, 0x0006, + 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x22bc, + 0x0804, 0x2e6a, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, + 0x0146, 0x0156, 0x080c, 0x20c3, 0x0804, 0x2e6a, 0x0106, 0x0006, + 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x20c3, + 0x080c, 0x22bc, 0x0804, 0x2e6a, 0x0106, 0x0006, 0x0126, 0x01c6, + 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x20fe, 0x0804, 0x2e6a, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, - 0x080c, 0x2871, 0x080c, 0x21cd, 0x080c, 0x1370, 0x080c, 0x2208, - 0x0410, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, - 0x0156, 0x080c, 0x2871, 0x080c, 0x1370, 0x080c, 0x2208, 0x0098, + 0x080c, 0x22bc, 0x080c, 0x20fe, 0x0804, 0x2e6a, 0x0106, 0x0006, + 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x20c3, + 0x080c, 0x20fe, 0x0804, 0x2e6a, 0x0106, 0x0006, 0x0126, 0x01c6, + 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x20c3, 0x080c, 0x22bc, + 0x080c, 0x20fe, 0x0804, 0x2e6a, 0xa001, 0x0cf0, 0x0106, 0x0006, + 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x1365, + 0x0804, 0x2e6a, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, + 0x0146, 0x0156, 0x080c, 0x22bc, 0x080c, 0x1365, 0x0804, 0x2e6a, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, - 0x080c, 0x2871, 0x080c, 0x21cd, 0x080c, 0x23c6, 0x080c, 0x1370, - 0x080c, 0x2208, 0x0000, 0x015e, 0x014e, 0x013e, 0x01de, 0x01ce, - 0x012e, 0x000e, 0x010e, 0x000d, 0x00b6, 0x00c6, 0x0026, 0x0046, - 0x9026, 0x080c, 0x6781, 0x1904, 0x3072, 0x72d8, 0x2001, 0x1954, - 0x2004, 0x9005, 0x1110, 0xd29c, 0x0148, 0xd284, 0x1138, 0xd2bc, - 0x1904, 0x3072, 0x080c, 0x3077, 0x0804, 0x3072, 0xd2cc, 0x1904, - 0x3072, 0x080c, 0x7207, 0x1120, 0x70ab, 0xffff, 0x0804, 0x3072, - 0xd294, 0x0120, 0x70ab, 0xffff, 0x0804, 0x3072, 0x080c, 0x32df, - 0x0160, 0x080c, 0xc539, 0x0128, 0x2001, 0x1817, 0x203c, 0x0804, - 0x3004, 0x70ab, 0xffff, 0x0804, 0x3072, 0x2001, 0x1817, 0x203c, - 0x7290, 0xd284, 0x0904, 0x3004, 0xd28c, 0x1904, 0x3004, 0x0036, - 0x73a8, 0x938e, 0xffff, 0x1110, 0x2019, 0x0001, 0x8314, 0x92e0, - 0x1c80, 0x2c04, 0x938c, 0x0001, 0x0120, 0x9084, 0xff00, 0x8007, - 0x0010, 0x9084, 0x00ff, 0x970e, 0x05a8, 0x908e, 0x0000, 0x0590, - 0x908e, 0x00ff, 0x1150, 0x7230, 0xd284, 0x1588, 0x7290, 0xc28d, - 0x7292, 0x70ab, 0xffff, 0x003e, 0x0478, 0x0026, 0x2011, 0x0010, - 0x080c, 0x67e7, 0x002e, 0x0118, 0x70ab, 0xffff, 0x0410, 0x900e, - 0x080c, 0x276e, 0x080c, 0x643f, 0x11c0, 0x080c, 0x67c3, 0x1168, - 0x7030, 0xd08c, 0x0130, 0xb800, 0xd0bc, 0x0138, 0x080c, 0x66bf, - 0x0120, 0x080c, 0x3090, 0x0148, 0x0028, 0x080c, 0x31d0, 0x080c, - 0x30bc, 0x0118, 0x8318, 0x0804, 0x2fb6, 0x73aa, 0x0010, 0x70ab, - 0xffff, 0x003e, 0x0804, 0x3072, 0x9780, 0x32e9, 0x203d, 0x97bc, - 0xff00, 0x873f, 0x2041, 0x007e, 0x70a8, 0x9096, 0xffff, 0x1118, - 0x900e, 0x28a8, 0x0050, 0x9812, 0x0220, 0x2008, 0x9802, 0x20a8, - 0x0020, 0x70ab, 0xffff, 0x0804, 0x3072, 0x2700, 0x0156, 0x0016, - 0x9106, 0x0904, 0x3067, 0x0026, 0x2011, 0x0010, 0x080c, 0x67e7, - 0x002e, 0x0120, 0x2009, 0xffff, 0x0804, 0x306f, 0xc484, 0x080c, - 0x649f, 0x0138, 0x080c, 0xc539, 0x1590, 0x080c, 0x643f, 0x15b8, - 0x0008, 0xc485, 0x080c, 0x67c3, 0x1130, 0x7030, 0xd08c, 0x01f8, - 0xb800, 0xd0bc, 0x11e0, 0x7290, 0xd28c, 0x0180, 0x080c, 0x67c3, - 0x9082, 0x0006, 0x02e0, 0xd484, 0x1118, 0x080c, 0x6463, 0x0028, - 0x080c, 0x325b, 0x01a0, 0x080c, 0x3286, 0x0088, 0x080c, 0x31d0, - 0x080c, 0xc539, 0x1160, 0x080c, 0x30bc, 0x0188, 0x0040, 0x080c, - 0xc539, 0x1118, 0x080c, 0x325b, 0x0110, 0x0451, 0x0140, 0x001e, - 0x8108, 0x015e, 0x1f04, 0x301d, 0x70ab, 0xffff, 0x0018, 0x001e, - 0x015e, 0x71aa, 0x004e, 0x002e, 0x00ce, 0x00be, 0x0005, 0x00c6, - 0x0016, 0x70ab, 0x0001, 0x2009, 0x007e, 0x080c, 0x643f, 0x1168, - 0xb813, 0x00ff, 0xb817, 0xfffe, 0x080c, 0x31d0, 0x04a9, 0x0128, - 0x70d8, 0xc0bd, 0x70da, 0x080c, 0xc28a, 0x001e, 0x00ce, 0x0005, - 0x0016, 0x0076, 0x00d6, 0x00c6, 0x2001, 0x1860, 0x2004, 0x9084, - 0x00ff, 0xb842, 0x080c, 0xa130, 0x01d0, 0x2b00, 0x6012, 0x080c, - 0xc2b3, 0x6023, 0x0001, 0x9006, 0x080c, 0x63dc, 0x2001, 0x0000, - 0x080c, 0x63f0, 0x0126, 0x2091, 0x8000, 0x70a4, 0x8000, 0x70a6, - 0x012e, 0x2009, 0x0004, 0x080c, 0xa15d, 0x9085, 0x0001, 0x00ce, - 0x00de, 0x007e, 0x001e, 0x0005, 0x0016, 0x0076, 0x00d6, 0x00c6, - 0x2001, 0x1860, 0x2004, 0x9084, 0x00ff, 0xb842, 0x080c, 0xa130, - 0x0548, 0x2b00, 0x6012, 0xb800, 0xc0c4, 0xb802, 0xb8a0, 0x9086, - 0x007e, 0x0140, 0xb804, 0x9084, 0x00ff, 0x9086, 0x0006, 0x1110, - 0x080c, 0x318b, 0x080c, 0xc2b3, 0x6023, 0x0001, 0x9006, 0x080c, - 0x63dc, 0x2001, 0x0002, 0x080c, 0x63f0, 0x0126, 0x2091, 0x8000, - 0x70a4, 0x8000, 0x70a6, 0x012e, 0x2009, 0x0002, 0x080c, 0xa15d, - 0x9085, 0x0001, 0x00ce, 0x00de, 0x007e, 0x001e, 0x0005, 0x00b6, - 0x00c6, 0x0026, 0x2009, 0x0080, 0x080c, 0x643f, 0x1140, 0xb813, - 0x00ff, 0xb817, 0xfffc, 0x0039, 0x0110, 0x70df, 0xffff, 0x002e, - 0x00ce, 0x00be, 0x0005, 0x0016, 0x0076, 0x00d6, 0x00c6, 0x080c, - 0xa08d, 0x01d0, 0x2b00, 0x6012, 0x080c, 0xc2b3, 0x6023, 0x0001, - 0x9006, 0x080c, 0x63dc, 0x2001, 0x0002, 0x080c, 0x63f0, 0x0126, - 0x2091, 0x8000, 0x70e0, 0x8000, 0x70e2, 0x012e, 0x2009, 0x0002, - 0x080c, 0xa15d, 0x9085, 0x0001, 0x00ce, 0x00de, 0x007e, 0x001e, - 0x0005, 0x00c6, 0x00d6, 0x0126, 0x2091, 0x8000, 0x2009, 0x007f, - 0x080c, 0x643f, 0x11b8, 0xb813, 0x00ff, 0xb817, 0xfffd, 0xb8bf, - 0x0004, 0x080c, 0xa08d, 0x0170, 0x2b00, 0x6012, 0x6316, 0x6023, - 0x0001, 0x620a, 0x080c, 0xc2b3, 0x2009, 0x0022, 0x080c, 0xa15d, - 0x9085, 0x0001, 0x012e, 0x00de, 0x00ce, 0x0005, 0x00e6, 0x00c6, - 0x0066, 0x0036, 0x0026, 0x00b6, 0x21f0, 0x080c, 0x880e, 0x080c, - 0x8798, 0x080c, 0x9f36, 0x080c, 0xb03a, 0x3e08, 0x2130, 0x81ff, - 0x0120, 0x20a9, 0x007e, 0x900e, 0x0018, 0x20a9, 0x007f, 0x900e, - 0x0016, 0x080c, 0x649f, 0x1140, 0x9686, 0x0002, 0x1118, 0xb800, - 0xd0bc, 0x1110, 0x080c, 0x5f45, 0x001e, 0x8108, 0x1f04, 0x3170, - 0x9686, 0x0001, 0x190c, 0x32b3, 0x00be, 0x002e, 0x003e, 0x006e, - 0x00ce, 0x00ee, 0x0005, 0x00e6, 0x00c6, 0x0046, 0x0036, 0x0026, - 0x0016, 0x00b6, 0x6210, 0x2258, 0xbaa0, 0x0026, 0x2019, 0x0029, - 0x080c, 0x8803, 0x0076, 0x2039, 0x0000, 0x080c, 0x86f1, 0x2c08, - 0x080c, 0xd5f6, 0x007e, 0x001e, 0xba10, 0xbb14, 0xbcb0, 0x080c, - 0x5f45, 0xba12, 0xbb16, 0xbcb2, 0x00be, 0x001e, 0x002e, 0x003e, - 0x004e, 0x00ce, 0x00ee, 0x0005, 0x00e6, 0x0006, 0x00b6, 0x6010, - 0x2058, 0xb8a0, 0x00be, 0x9086, 0x0080, 0x0150, 0x2071, 0x1800, - 0x70a4, 0x9005, 0x0110, 0x8001, 0x70a6, 0x000e, 0x00ee, 0x0005, - 0x2071, 0x1800, 0x70e0, 0x9005, 0x0dc0, 0x8001, 0x70e2, 0x0ca8, - 0xb800, 0xc08c, 0xb802, 0x0005, 0x00f6, 0x00e6, 0x00c6, 0x00b6, - 0x0046, 0x0036, 0x0026, 0x0016, 0x0156, 0x2178, 0x81ff, 0x1118, - 0x20a9, 0x0001, 0x0070, 0x080c, 0x55db, 0xd0c4, 0x0138, 0x0030, - 0x9006, 0x2020, 0x2009, 0x002d, 0x080c, 0xd885, 0x20a9, 0x0800, - 0x9016, 0x0026, 0x928e, 0x007e, 0x0904, 0x323a, 0x928e, 0x007f, - 0x0904, 0x323a, 0x928e, 0x0080, 0x05e8, 0x9288, 0x1000, 0x210c, - 0x81ff, 0x05c0, 0x8fff, 0x1148, 0x2001, 0x1966, 0x0006, 0x2003, - 0x0001, 0x04f1, 0x000e, 0x2003, 0x0000, 0x00b6, 0x00c6, 0x2158, - 0x2001, 0x0001, 0x080c, 0x678d, 0x00ce, 0x00be, 0x2019, 0x0029, - 0x080c, 0x8803, 0x0076, 0x2039, 0x0000, 0x080c, 0x86f1, 0x00b6, - 0x00c6, 0x0026, 0x2158, 0xba04, 0x9294, 0x00ff, 0x9286, 0x0006, - 0x1118, 0xb807, 0x0404, 0x0028, 0x2001, 0x0004, 0x8007, 0x9215, - 0xba06, 0x002e, 0x00ce, 0x00be, 0x0016, 0x2c08, 0x080c, 0xd5f6, - 0x001e, 0x007e, 0x002e, 0x8210, 0x1f04, 0x31f1, 0x015e, 0x001e, - 0x002e, 0x003e, 0x004e, 0x00be, 0x00ce, 0x00ee, 0x00fe, 0x0005, - 0x0046, 0x0026, 0x0016, 0x080c, 0x55db, 0xd0c4, 0x0140, 0xd0a4, - 0x0130, 0x9006, 0x2220, 0x2009, 0x0029, 0x080c, 0xd885, 0x001e, - 0x002e, 0x004e, 0x0005, 0x0016, 0x0026, 0x0036, 0x00c6, 0x7290, - 0x82ff, 0x01e8, 0x080c, 0x67bb, 0x11d0, 0x2100, 0x080c, 0x27a1, - 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, - 0x1a8a, 0x001e, 0x6112, 0x080c, 0x318b, 0x001e, 0x080c, 0x6463, - 0x012e, 0x00ce, 0x001e, 0x0005, 0x0016, 0x0026, 0x2110, 0x080c, - 0x9bc9, 0x080c, 0xdb3d, 0x002e, 0x001e, 0x0005, 0x2001, 0x1836, - 0x2004, 0xd0cc, 0x0005, 0x00c6, 0x00b6, 0x080c, 0x7207, 0x1118, - 0x20a9, 0x0800, 0x0010, 0x20a9, 0x0782, 0x080c, 0x7207, 0x1110, - 0x900e, 0x0010, 0x2009, 0x007e, 0x9180, 0x1000, 0x2004, 0x905d, - 0x0130, 0x86ff, 0x0110, 0xb800, 0xd0bc, 0x090c, 0x6463, 0x8108, - 0x1f04, 0x32c4, 0x2061, 0x1800, 0x607b, 0x0000, 0x607c, 0x9084, - 0x00ff, 0x607e, 0x60af, 0x0000, 0x00be, 0x00ce, 0x0005, 0x2001, - 0x187d, 0x2004, 0xd0bc, 0x0005, 0x2011, 0x185c, 0x2214, 0xd2ec, - 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, + 0x080c, 0x20c3, 0x080c, 0x1365, 0x0804, 0x2e6a, 0x0106, 0x0006, + 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x22bc, + 0x080c, 0x1365, 0x080c, 0x20fe, 0x0804, 0x2e6a, 0x0106, 0x0006, + 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x20c3, + 0x080c, 0x22bc, 0x080c, 0x1365, 0x0804, 0x2e6a, 0x0106, 0x0006, + 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x20c3, + 0x080c, 0x1365, 0x080c, 0x20fe, 0x0804, 0x2e6a, 0x0106, 0x0006, + 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x1365, + 0x080c, 0x20fe, 0x0804, 0x2e6a, 0x0106, 0x0006, 0x0126, 0x01c6, + 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x20c3, 0x080c, 0x22bc, + 0x080c, 0x1365, 0x080c, 0x20fe, 0x0804, 0x2e6a, 0x0106, 0x0006, + 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2770, + 0x0804, 0x2e6a, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, + 0x0146, 0x0156, 0x080c, 0x2770, 0x080c, 0x22bc, 0x0804, 0x2e6a, + 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, + 0x080c, 0x2770, 0x080c, 0x20c3, 0x0804, 0x2e6a, 0x0106, 0x0006, + 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2770, + 0x080c, 0x20c3, 0x080c, 0x22bc, 0x0804, 0x2e6a, 0x0106, 0x0006, + 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2770, + 0x080c, 0x20fe, 0x0804, 0x2e6a, 0x0106, 0x0006, 0x0126, 0x01c6, + 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2770, 0x080c, 0x22bc, + 0x080c, 0x20fe, 0x0804, 0x2e6a, 0x0106, 0x0006, 0x0126, 0x01c6, + 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2770, 0x080c, 0x20c3, + 0x080c, 0x20fe, 0x0804, 0x2e6a, 0x0106, 0x0006, 0x0126, 0x01c6, + 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2770, 0x080c, 0x20c3, + 0x080c, 0x22bc, 0x080c, 0x20fe, 0x0804, 0x2e6a, 0x0106, 0x0006, + 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2770, + 0x080c, 0x1365, 0x0804, 0x2e6a, 0x0106, 0x0006, 0x0126, 0x01c6, + 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2770, 0x080c, 0x22bc, + 0x080c, 0x1365, 0x0804, 0x2e6a, 0x0106, 0x0006, 0x0126, 0x01c6, + 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2770, 0x080c, 0x20c3, + 0x080c, 0x1365, 0x0804, 0x2e6a, 0x0106, 0x0006, 0x0126, 0x01c6, + 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2770, 0x080c, 0x22bc, + 0x080c, 0x1365, 0x080c, 0x20fe, 0x0804, 0x2e6a, 0x0106, 0x0006, + 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2770, + 0x080c, 0x20c3, 0x080c, 0x22bc, 0x080c, 0x1365, 0x0498, 0x0106, + 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, + 0x2770, 0x080c, 0x20c3, 0x080c, 0x1365, 0x080c, 0x20fe, 0x0410, + 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, + 0x080c, 0x2770, 0x080c, 0x1365, 0x080c, 0x20fe, 0x0098, 0x0106, + 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, + 0x2770, 0x080c, 0x20c3, 0x080c, 0x22bc, 0x080c, 0x1365, 0x080c, + 0x20fe, 0x0000, 0x015e, 0x014e, 0x013e, 0x01de, 0x01ce, 0x012e, + 0x000e, 0x010e, 0x000d, 0x00b6, 0x00c6, 0x0026, 0x0046, 0x9026, + 0x080c, 0x6687, 0x1904, 0x2f7c, 0x72d8, 0x2001, 0x1956, 0x2004, + 0x9005, 0x1110, 0xd29c, 0x0148, 0xd284, 0x1138, 0xd2bc, 0x1904, + 0x2f7c, 0x080c, 0x2f81, 0x0804, 0x2f7c, 0xd2cc, 0x1904, 0x2f7c, + 0x080c, 0x717e, 0x1120, 0x70ab, 0xffff, 0x0804, 0x2f7c, 0xd294, + 0x0120, 0x70ab, 0xffff, 0x0804, 0x2f7c, 0x080c, 0x31e9, 0x0160, + 0x080c, 0xc459, 0x0128, 0x2001, 0x1817, 0x203c, 0x0804, 0x2f0b, + 0x70ab, 0xffff, 0x0804, 0x2f7c, 0x2001, 0x1817, 0x203c, 0x7290, + 0xd284, 0x0904, 0x2f0b, 0xd28c, 0x1904, 0x2f0b, 0x0036, 0x73a8, + 0x938e, 0xffff, 0x1110, 0x2019, 0x0001, 0x8314, 0x92e0, 0x1c80, + 0x2c04, 0x938c, 0x0001, 0x0120, 0x9084, 0xff00, 0x8007, 0x0010, + 0x9084, 0x00ff, 0x970e, 0x05a8, 0x908e, 0x0000, 0x0590, 0x908e, + 0x00ff, 0x1150, 0x7230, 0xd284, 0x1588, 0x7290, 0xc28d, 0x7292, + 0x70ab, 0xffff, 0x003e, 0x0478, 0x0026, 0x2011, 0x0010, 0x080c, + 0x66ed, 0x002e, 0x0118, 0x70ab, 0xffff, 0x0410, 0x900e, 0x080c, + 0x266d, 0x080c, 0x6343, 0x11c0, 0x080c, 0x66c9, 0x1168, 0x7030, + 0xd08c, 0x0130, 0xb800, 0xd0bc, 0x0138, 0x080c, 0x65c3, 0x0120, + 0x080c, 0x2f9a, 0x0148, 0x0028, 0x080c, 0x30da, 0x080c, 0x2fc6, + 0x0118, 0x8318, 0x0804, 0x2ebd, 0x73aa, 0x0010, 0x70ab, 0xffff, + 0x003e, 0x0804, 0x2f7c, 0x9780, 0x31f3, 0x203d, 0x97bc, 0xff00, + 0x873f, 0x2041, 0x007e, 0x70a8, 0x9096, 0xffff, 0x1118, 0x900e, + 0x28a8, 0x0050, 0x9812, 0x0220, 0x2008, 0x9802, 0x20a8, 0x0020, + 0x70ab, 0xffff, 0x0804, 0x2f7c, 0x2700, 0x0156, 0x0016, 0x9106, + 0x0904, 0x2f71, 0x0026, 0x2011, 0x0010, 0x080c, 0x66ed, 0x002e, + 0x0120, 0x2009, 0xffff, 0x0804, 0x2f79, 0xc484, 0x080c, 0x63a3, + 0x0150, 0x080c, 0xc459, 0x15a8, 0x080c, 0x31e9, 0x1590, 0x080c, + 0x6343, 0x15b8, 0x0008, 0xc485, 0x080c, 0x66c9, 0x1130, 0x7030, + 0xd08c, 0x01f8, 0xb800, 0xd0bc, 0x11e0, 0x7290, 0xd28c, 0x0180, + 0x080c, 0x66c9, 0x9082, 0x0006, 0x02e0, 0xd484, 0x1118, 0x080c, + 0x6367, 0x0028, 0x080c, 0x3165, 0x01a0, 0x080c, 0x3190, 0x0088, + 0x080c, 0x30da, 0x080c, 0xc459, 0x1160, 0x080c, 0x2fc6, 0x0188, + 0x0040, 0x080c, 0xc459, 0x1118, 0x080c, 0x3165, 0x0110, 0x0451, + 0x0140, 0x001e, 0x8108, 0x015e, 0x1f04, 0x2f24, 0x70ab, 0xffff, + 0x0018, 0x001e, 0x015e, 0x71aa, 0x004e, 0x002e, 0x00ce, 0x00be, + 0x0005, 0x00c6, 0x0016, 0x70ab, 0x0001, 0x2009, 0x007e, 0x080c, + 0x6343, 0x1168, 0xb813, 0x00ff, 0xb817, 0xfffe, 0x080c, 0x30da, + 0x04a9, 0x0128, 0x70d8, 0xc0bd, 0x70da, 0x080c, 0xc1a1, 0x001e, + 0x00ce, 0x0005, 0x0016, 0x0076, 0x00d6, 0x00c6, 0x2001, 0x1860, + 0x2004, 0x9084, 0x00ff, 0xb842, 0x080c, 0xa03b, 0x01d0, 0x2b00, + 0x6012, 0x080c, 0xc1ca, 0x6023, 0x0001, 0x9006, 0x080c, 0x62e0, + 0x2001, 0x0000, 0x080c, 0x62f4, 0x0126, 0x2091, 0x8000, 0x70a4, + 0x8000, 0x70a6, 0x012e, 0x2009, 0x0004, 0x080c, 0xa068, 0x9085, + 0x0001, 0x00ce, 0x00de, 0x007e, 0x001e, 0x0005, 0x0016, 0x0076, + 0x00d6, 0x00c6, 0x2001, 0x1860, 0x2004, 0x9084, 0x00ff, 0xb842, + 0x080c, 0xa03b, 0x0548, 0x2b00, 0x6012, 0xb800, 0xc0c4, 0xb802, + 0xb8a0, 0x9086, 0x007e, 0x0140, 0xb804, 0x9084, 0x00ff, 0x9086, + 0x0006, 0x1110, 0x080c, 0x3095, 0x080c, 0xc1ca, 0x6023, 0x0001, + 0x9006, 0x080c, 0x62e0, 0x2001, 0x0002, 0x080c, 0x62f4, 0x0126, + 0x2091, 0x8000, 0x70a4, 0x8000, 0x70a6, 0x012e, 0x2009, 0x0002, + 0x080c, 0xa068, 0x9085, 0x0001, 0x00ce, 0x00de, 0x007e, 0x001e, + 0x0005, 0x00b6, 0x00c6, 0x0026, 0x2009, 0x0080, 0x080c, 0x6343, + 0x1140, 0xb813, 0x00ff, 0xb817, 0xfffc, 0x0039, 0x0110, 0x70df, + 0xffff, 0x002e, 0x00ce, 0x00be, 0x0005, 0x0016, 0x0076, 0x00d6, + 0x00c6, 0x080c, 0x9f94, 0x01d0, 0x2b00, 0x6012, 0x080c, 0xc1ca, + 0x6023, 0x0001, 0x9006, 0x080c, 0x62e0, 0x2001, 0x0002, 0x080c, + 0x62f4, 0x0126, 0x2091, 0x8000, 0x70e0, 0x8000, 0x70e2, 0x012e, + 0x2009, 0x0002, 0x080c, 0xa068, 0x9085, 0x0001, 0x00ce, 0x00de, + 0x007e, 0x001e, 0x0005, 0x00c6, 0x00d6, 0x0126, 0x2091, 0x8000, + 0x2009, 0x007f, 0x080c, 0x6343, 0x11b8, 0xb813, 0x00ff, 0xb817, + 0xfffd, 0xb8bf, 0x0004, 0x080c, 0x9f94, 0x0170, 0x2b00, 0x6012, + 0x6316, 0x6023, 0x0001, 0x620a, 0x080c, 0xc1ca, 0x2009, 0x0022, + 0x080c, 0xa068, 0x9085, 0x0001, 0x012e, 0x00de, 0x00ce, 0x0005, + 0x00e6, 0x00c6, 0x0066, 0x0036, 0x0026, 0x00b6, 0x21f0, 0x080c, + 0x878d, 0x080c, 0x8717, 0x080c, 0x9e3d, 0x080c, 0xaf81, 0x3e08, + 0x2130, 0x81ff, 0x0120, 0x20a9, 0x007e, 0x900e, 0x0018, 0x20a9, + 0x007f, 0x900e, 0x0016, 0x080c, 0x63a3, 0x1140, 0x9686, 0x0002, + 0x1118, 0xb800, 0xd0bc, 0x1110, 0x080c, 0x5e49, 0x001e, 0x8108, + 0x1f04, 0x307a, 0x9686, 0x0001, 0x190c, 0x31bd, 0x00be, 0x002e, + 0x003e, 0x006e, 0x00ce, 0x00ee, 0x0005, 0x00e6, 0x00c6, 0x0046, + 0x0036, 0x0026, 0x0016, 0x00b6, 0x6210, 0x2258, 0xbaa0, 0x0026, + 0x2019, 0x0029, 0x080c, 0x8782, 0x0076, 0x2039, 0x0000, 0x080c, + 0x8670, 0x2c08, 0x080c, 0xd556, 0x007e, 0x001e, 0xba10, 0xbb14, + 0xbcb0, 0x080c, 0x5e49, 0xba12, 0xbb16, 0xbcb2, 0x00be, 0x001e, + 0x002e, 0x003e, 0x004e, 0x00ce, 0x00ee, 0x0005, 0x00e6, 0x0006, + 0x00b6, 0x6010, 0x2058, 0xb8a0, 0x00be, 0x9086, 0x0080, 0x0150, + 0x2071, 0x1800, 0x70a4, 0x9005, 0x0110, 0x8001, 0x70a6, 0x000e, + 0x00ee, 0x0005, 0x2071, 0x1800, 0x70e0, 0x9005, 0x0dc0, 0x8001, + 0x70e2, 0x0ca8, 0xb800, 0xc08c, 0xb802, 0x0005, 0x00f6, 0x00e6, + 0x00c6, 0x00b6, 0x0046, 0x0036, 0x0026, 0x0016, 0x0156, 0x2178, + 0x81ff, 0x1118, 0x20a9, 0x0001, 0x0070, 0x080c, 0x54db, 0xd0c4, + 0x0138, 0x0030, 0x9006, 0x2020, 0x2009, 0x002d, 0x080c, 0xd837, + 0x20a9, 0x0800, 0x9016, 0x0026, 0x928e, 0x007e, 0x0904, 0x3144, + 0x928e, 0x007f, 0x0904, 0x3144, 0x928e, 0x0080, 0x05e8, 0x9288, + 0x1000, 0x210c, 0x81ff, 0x05c0, 0x8fff, 0x1148, 0x2001, 0x1968, + 0x0006, 0x2003, 0x0001, 0x04f1, 0x000e, 0x2003, 0x0000, 0x00b6, + 0x00c6, 0x2158, 0x2001, 0x0001, 0x080c, 0x6693, 0x00ce, 0x00be, + 0x2019, 0x0029, 0x080c, 0x8782, 0x0076, 0x2039, 0x0000, 0x080c, + 0x8670, 0x00b6, 0x00c6, 0x0026, 0x2158, 0xba04, 0x9294, 0x00ff, + 0x9286, 0x0006, 0x1118, 0xb807, 0x0404, 0x0028, 0x2001, 0x0004, + 0x8007, 0x9215, 0xba06, 0x002e, 0x00ce, 0x00be, 0x0016, 0x2c08, + 0x080c, 0xd556, 0x001e, 0x007e, 0x002e, 0x8210, 0x1f04, 0x30fb, + 0x015e, 0x001e, 0x002e, 0x003e, 0x004e, 0x00be, 0x00ce, 0x00ee, + 0x00fe, 0x0005, 0x0046, 0x0026, 0x0016, 0x080c, 0x54db, 0xd0c4, + 0x0140, 0xd0a4, 0x0130, 0x9006, 0x2220, 0x2009, 0x0029, 0x080c, + 0xd837, 0x001e, 0x002e, 0x004e, 0x0005, 0x0016, 0x0026, 0x0036, + 0x00c6, 0x7290, 0x82ff, 0x01e8, 0x080c, 0x66c1, 0x11d0, 0x2100, + 0x080c, 0x26a0, 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, 0x1a88, 0x001e, 0x6112, 0x080c, 0x3095, 0x001e, + 0x080c, 0x6367, 0x012e, 0x00ce, 0x001e, 0x0005, 0x0016, 0x0026, + 0x2110, 0x080c, 0x9ad0, 0x080c, 0xdaf0, 0x002e, 0x001e, 0x0005, + 0x2001, 0x1836, 0x2004, 0xd0cc, 0x0005, 0x00c6, 0x00b6, 0x080c, + 0x717e, 0x1118, 0x20a9, 0x0800, 0x0010, 0x20a9, 0x0782, 0x080c, + 0x717e, 0x1110, 0x900e, 0x0010, 0x2009, 0x007e, 0x9180, 0x1000, + 0x2004, 0x905d, 0x0130, 0x86ff, 0x0110, 0xb800, 0xd0bc, 0x090c, + 0x6367, 0x8108, 0x1f04, 0x31ce, 0x2061, 0x1800, 0x607b, 0x0000, + 0x607c, 0x9084, 0x00ff, 0x607e, 0x60af, 0x0000, 0x00be, 0x00ce, + 0x0005, 0x2001, 0x187d, 0x2004, 0xd0bc, 0x0005, 0x2011, 0x185c, + 0x2214, 0xd2ec, 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, 0x2071, 0x189c, 0x7003, 0x0002, 0x9006, 0x7016, 0x701a, - 0x704a, 0x704e, 0x700e, 0x7042, 0x7046, 0x703b, 0x18b8, 0x703f, - 0x18b8, 0x7007, 0x0001, 0x080c, 0x104a, 0x090c, 0x0dfa, 0x2900, - 0x706a, 0xa867, 0x0002, 0xa8ab, 0xdcb0, 0x080c, 0x104a, 0x090c, - 0x0dfa, 0x2900, 0x706e, 0xa867, 0x0002, 0xa8ab, 0xdcb0, 0x0005, - 0x2071, 0x189c, 0x7004, 0x0002, 0x3418, 0x3419, 0x342c, 0x3440, - 0x0005, 0x1004, 0x3429, 0x0e04, 0x3429, 0x2079, 0x0000, 0x0126, - 0x2091, 0x8000, 0x700c, 0x9005, 0x1128, 0x700f, 0x0001, 0x012e, - 0x0468, 0x0005, 0x012e, 0x0ce8, 0x2079, 0x0000, 0x2061, 0x18b6, - 0x2c4c, 0xa86c, 0x908e, 0x0100, 0x0128, 0x9086, 0x0200, 0x0904, - 0x3514, 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, 0x61cc, 0x0042, 0x2100, 0x908a, - 0x003f, 0x1a04, 0x3511, 0x61cc, 0x0804, 0x34a6, 0x34e8, 0x3520, - 0x3511, 0x352a, 0x3534, 0x353a, 0x353e, 0x354e, 0x3552, 0x3568, - 0x356e, 0x3574, 0x357f, 0x358a, 0x3599, 0x35a8, 0x35b6, 0x35cd, - 0x35e8, 0x3511, 0x3691, 0x36cf, 0x3775, 0x3786, 0x37a9, 0x3511, - 0x3511, 0x3511, 0x37e1, 0x37fd, 0x3806, 0x3835, 0x383b, 0x3511, - 0x3881, 0x3511, 0x3511, 0x3511, 0x3511, 0x3511, 0x388c, 0x3895, - 0x389d, 0x389f, 0x3511, 0x3511, 0x3511, 0x3511, 0x3511, 0x3511, - 0x38cb, 0x3511, 0x3511, 0x3511, 0x3511, 0x3511, 0x38e8, 0x395c, - 0x3511, 0x3511, 0x3511, 0x3511, 0x3511, 0x3511, 0x0002, 0x3986, - 0x3989, 0x39e8, 0x3a01, 0x3a31, 0x3ccf, 0x3511, 0x519f, 0x3511, - 0x3511, 0x3511, 0x3511, 0x3511, 0x3511, 0x3511, 0x3511, 0x3568, - 0x356e, 0x4249, 0x55ff, 0x425f, 0x522e, 0x527f, 0x538a, 0x3511, - 0x53ec, 0x5428, 0x5459, 0x5561, 0x5486, 0x54e1, 0x3511, 0x4263, - 0x4408, 0x441e, 0x4443, 0x44a8, 0x451c, 0x453c, 0x45b3, 0x460f, - 0x466b, 0x466e, 0x4693, 0x4741, 0x47a7, 0x47af, 0x48e1, 0x4a49, - 0x4a7d, 0x4cc7, 0x3511, 0x4ce5, 0x4da2, 0x4e78, 0x3511, 0x3511, - 0x3511, 0x3511, 0x4ede, 0x4ef9, 0x47af, 0x513f, 0x714c, 0x0000, - 0x2021, 0x4000, 0x080c, 0x4afb, 0x0126, 0x2091, 0x8000, 0x0e04, - 0x34f2, 0x0010, 0x012e, 0x0cc0, 0x7c36, 0x9486, 0x4000, 0x0118, - 0x7833, 0x0011, 0x0010, 0x7833, 0x0010, 0x7c82, 0x7986, 0x7a8a, - 0x7b8e, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, - 0x11e0, 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, - 0x0804, 0x4b08, 0x2039, 0x0001, 0x902e, 0x2520, 0x7b88, 0x7a8c, - 0x7884, 0x7990, 0x0804, 0x4b0b, 0x7984, 0x7888, 0x2114, 0x200a, - 0x0804, 0x34e8, 0x7984, 0x2114, 0x0804, 0x34e8, 0x20e1, 0x0000, - 0x2099, 0x0021, 0x20e9, 0x0000, 0x20a1, 0x0021, 0x20a9, 0x001f, - 0x4003, 0x7984, 0x7a88, 0x7b8c, 0x0804, 0x34e8, 0x7884, 0x2060, - 0x0804, 0x359b, 0x2009, 0x0003, 0x2011, 0x0003, 0x2019, 0x0008, - 0x789b, 0x0317, 0x7893, 0xffff, 0x2001, 0x188d, 0x2004, 0x9005, - 0x0118, 0x7896, 0x0804, 0x34e8, 0x7897, 0x0001, 0x0804, 0x34e8, - 0x2039, 0x0001, 0x7d98, 0x7c9c, 0x0804, 0x3524, 0x2039, 0x0001, - 0x7d98, 0x7c9c, 0x0804, 0x352e, 0x79a0, 0x9182, 0x0040, 0x0210, - 0x0804, 0x351d, 0x2138, 0x7d98, 0x7c9c, 0x0804, 0x3524, 0x79a0, - 0x9182, 0x0040, 0x0210, 0x0804, 0x351d, 0x2138, 0x7d98, 0x7c9c, - 0x0804, 0x352e, 0x79a0, 0x9182, 0x0040, 0x0210, 0x0804, 0x351d, - 0x21e8, 0x7984, 0x7888, 0x20a9, 0x0001, 0x21a0, 0x4004, 0x0804, - 0x34e8, 0x2061, 0x0800, 0xe10c, 0x9006, 0x2c15, 0x9200, 0x8c60, - 0x8109, 0x1dd8, 0x2010, 0x9005, 0x0904, 0x34e8, 0x0804, 0x3517, - 0x79a0, 0x9182, 0x0040, 0x0210, 0x0804, 0x351d, 0x21e0, 0x20a9, - 0x0001, 0x7984, 0x2198, 0x4012, 0x0804, 0x34e8, 0x2069, 0x185b, - 0x7884, 0x7990, 0x911a, 0x1a04, 0x351d, 0x8019, 0x0904, 0x351d, - 0x684a, 0x6942, 0x788c, 0x6852, 0x7888, 0x6856, 0x9006, 0x685a, - 0x685e, 0x080c, 0x7535, 0x0804, 0x34e8, 0x2069, 0x185b, 0x7884, - 0x7994, 0x911a, 0x1a04, 0x351d, 0x8019, 0x0904, 0x351d, 0x684e, - 0x6946, 0x788c, 0x6862, 0x7888, 0x6866, 0x9006, 0x686a, 0x686e, - 0x0126, 0x2091, 0x8000, 0x080c, 0x68c1, 0x012e, 0x0804, 0x34e8, - 0x902e, 0x2520, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x351a, - 0x7984, 0x7b88, 0x7a8c, 0x20a9, 0x0005, 0x20e9, 0x0001, 0x20a1, - 0x18a4, 0x4101, 0x080c, 0x4abf, 0x1120, 0x2009, 0x0002, 0x0804, - 0x351a, 0x2009, 0x0020, 0xa85c, 0x9080, 0x0019, 0xaf60, 0x080c, - 0x4b08, 0x701f, 0x360c, 0x0005, 0xa864, 0x2008, 0x9084, 0x00ff, - 0x9096, 0x0011, 0x0168, 0x9096, 0x0019, 0x0150, 0x9096, 0x0015, - 0x0138, 0x9096, 0x0048, 0x0120, 0x9096, 0x0029, 0x1904, 0x351a, - 0x810f, 0x918c, 0x00ff, 0x0904, 0x351a, 0x7112, 0x7010, 0x8001, - 0x0560, 0x7012, 0x080c, 0x4abf, 0x1120, 0x2009, 0x0002, 0x0804, - 0x351a, 0x2009, 0x0020, 0x7068, 0x2040, 0xa28c, 0xa390, 0xa494, - 0xa598, 0x9290, 0x0040, 0x9399, 0x0000, 0x94a1, 0x0000, 0x95a9, - 0x0000, 0xa85c, 0x9080, 0x0019, 0xaf60, 0x080c, 0x4b08, 0x701f, - 0x364a, 0x0005, 0xa864, 0x9084, 0x00ff, 0x9096, 0x0002, 0x0120, - 0x9096, 0x000a, 0x1904, 0x351a, 0x0888, 0x7014, 0x2048, 0xa868, - 0xc0fd, 0xa86a, 0xa864, 0x9084, 0x00ff, 0x9096, 0x0029, 0x1160, - 0xc2fd, 0xaa7a, 0x080c, 0x6037, 0x0150, 0x0126, 0x2091, 0x8000, - 0xa87a, 0xa982, 0x012e, 0x0050, 0x080c, 0x6355, 0x1128, 0x7007, - 0x0003, 0x701f, 0x3676, 0x0005, 0x080c, 0x6d17, 0x0126, 0x2091, - 0x8000, 0x20a9, 0x0005, 0x20e1, 0x0001, 0x2099, 0x18a4, 0x400a, - 0x2100, 0x9210, 0x9399, 0x0000, 0x94a1, 0x0000, 0x95a9, 0x0000, - 0xa85c, 0x9080, 0x0019, 0x2009, 0x0020, 0x012e, 0xaf60, 0x0804, - 0x4b0b, 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, 0x19f1, 0x2004, 0x9005, 0x0128, - 0x2001, 0x008b, 0x2004, 0xd0fc, 0x0dd8, 0x2001, 0x008a, 0x2003, - 0x0002, 0x2003, 0x1001, 0x2071, 0x0080, 0x0804, 0x0427, 0x81ff, - 0x1904, 0x351a, 0x7984, 0x080c, 0x649f, 0x1904, 0x351d, 0x7e98, - 0x9684, 0x3fff, 0x9082, 0x4000, 0x1a04, 0x351d, 0x7c88, 0x7d8c, - 0x080c, 0x6602, 0x080c, 0x65d1, 0x0000, 0x1518, 0x2061, 0x1cd0, - 0x0126, 0x2091, 0x8000, 0x6000, 0x9086, 0x0000, 0x0148, 0x6014, - 0x904d, 0x0130, 0xa86c, 0x9406, 0x1118, 0xa870, 0x9506, 0x0150, - 0x012e, 0x9ce0, 0x0018, 0x2001, 0x1819, 0x2004, 0x9c02, 0x1a04, - 0x351a, 0x0c30, 0x080c, 0xba56, 0x012e, 0x0904, 0x351a, 0x0804, - 0x34e8, 0x900e, 0x2001, 0x0005, 0x080c, 0x6d17, 0x0126, 0x2091, - 0x8000, 0x080c, 0xc133, 0x080c, 0x6ae9, 0x012e, 0x0804, 0x34e8, - 0x00a6, 0x2950, 0xb198, 0x080c, 0x649f, 0x1904, 0x3762, 0xb6a4, - 0x9684, 0x3fff, 0x9082, 0x4000, 0x16e8, 0xb49c, 0xb5a0, 0x080c, - 0x6602, 0x080c, 0x65d1, 0x1520, 0x2061, 0x1cd0, 0x0126, 0x2091, - 0x8000, 0x6000, 0x9086, 0x0000, 0x0148, 0x6014, 0x904d, 0x0130, - 0xa86c, 0x9406, 0x1118, 0xa870, 0x9506, 0x0158, 0x012e, 0x9ce0, - 0x0018, 0x2001, 0x1819, 0x2004, 0x9c02, 0x2009, 0x000d, 0x12b0, - 0x0c28, 0x080c, 0xba56, 0x012e, 0x2009, 0x0003, 0x0178, 0x00e0, - 0x900e, 0x2001, 0x0005, 0x080c, 0x6d17, 0x0126, 0x2091, 0x8000, - 0x080c, 0xc133, 0x080c, 0x6adc, 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, 0x351a, - 0x080c, 0x4ad6, 0x0904, 0x351d, 0x080c, 0x6566, 0x0904, 0x351a, - 0x080c, 0x6608, 0x0904, 0x351a, 0x0804, 0x4533, 0x81ff, 0x1904, - 0x351a, 0x080c, 0x4af2, 0x0904, 0x351d, 0x080c, 0x6696, 0x0904, - 0x351a, 0x2019, 0x0005, 0x79a8, 0x080c, 0x6623, 0x0904, 0x351a, - 0x7888, 0x908a, 0x1000, 0x1a04, 0x351d, 0x8003, 0x800b, 0x810b, - 0x9108, 0x080c, 0x82e8, 0x7984, 0xd184, 0x1904, 0x34e8, 0x0804, - 0x4533, 0x0126, 0x2091, 0x8000, 0x81ff, 0x0118, 0x2009, 0x0001, - 0x0450, 0x2029, 0x07ff, 0x6458, 0x2400, 0x9506, 0x01f8, 0x2508, - 0x080c, 0x649f, 0x11d8, 0x080c, 0x6696, 0x1128, 0x2009, 0x0002, - 0x62bc, 0x2518, 0x00c0, 0x2019, 0x0004, 0x900e, 0x080c, 0x6623, - 0x1118, 0x2009, 0x0006, 0x0078, 0x7884, 0x908a, 0x1000, 0x1270, - 0x8003, 0x800b, 0x810b, 0x9108, 0x080c, 0x82e8, 0x8529, 0x1ae0, - 0x012e, 0x0804, 0x34e8, 0x012e, 0x0804, 0x351a, 0x012e, 0x0804, - 0x351d, 0x080c, 0x4ad6, 0x0904, 0x351d, 0x080c, 0x6566, 0x0904, - 0x351a, 0xbaa0, 0x2019, 0x0005, 0x00c6, 0x9066, 0x080c, 0x8803, - 0x0076, 0x903e, 0x080c, 0x86f1, 0x900e, 0x080c, 0xd5f6, 0x007e, - 0x00ce, 0x080c, 0x6602, 0x0804, 0x34e8, 0x080c, 0x4ad6, 0x0904, - 0x351d, 0x080c, 0x6602, 0x2208, 0x0804, 0x34e8, 0x0156, 0x00d6, - 0x00e6, 0x2069, 0x190e, 0x6810, 0x6914, 0x910a, 0x1208, 0x900e, - 0x6816, 0x9016, 0x901e, 0x20a9, 0x007e, 0x2069, 0x1000, 0x2d04, - 0x905d, 0x0118, 0xb84c, 0x0059, 0x9210, 0x8d68, 0x1f04, 0x3817, - 0x2300, 0x9218, 0x00ee, 0x00de, 0x015e, 0x0804, 0x34e8, 0x00f6, - 0x0016, 0x907d, 0x0138, 0x9006, 0x8000, 0x2f0c, 0x81ff, 0x0110, - 0x2178, 0x0cd0, 0x001e, 0x00fe, 0x0005, 0x2069, 0x190e, 0x6910, - 0x62b8, 0x0804, 0x34e8, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, - 0x351a, 0x0126, 0x2091, 0x8000, 0x080c, 0x55ef, 0x0128, 0x2009, - 0x0007, 0x012e, 0x0804, 0x351a, 0x012e, 0x6158, 0x9190, 0x32e9, - 0x2215, 0x9294, 0x00ff, 0x6378, 0x83ff, 0x0108, 0x627c, 0x67d8, - 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, 0x7207, 0x1118, 0x2031, 0x0004, 0x0038, 0xd79c, 0x0120, - 0x2009, 0x0005, 0x0804, 0x351a, 0x9036, 0x7e9a, 0x7f9e, 0x0804, - 0x34e8, 0x6148, 0x624c, 0x2019, 0x195e, 0x231c, 0x2001, 0x195f, - 0x2004, 0x789a, 0x0804, 0x34e8, 0x0126, 0x2091, 0x8000, 0x6138, - 0x623c, 0x6340, 0x012e, 0x0804, 0x34e8, 0x080c, 0x4af2, 0x0904, - 0x351d, 0xba44, 0xbb38, 0x0804, 0x34e8, 0x080c, 0x0dfa, 0x080c, - 0x4af2, 0x2110, 0x0904, 0x351d, 0xb804, 0x908c, 0x00ff, 0x918e, - 0x0006, 0x0140, 0x9084, 0xff00, 0x9086, 0x0600, 0x2009, 0x0009, - 0x1904, 0x351a, 0x0126, 0x2091, 0x8000, 0x2019, 0x0005, 0x00c6, - 0x9066, 0x080c, 0x9bc9, 0x080c, 0x8803, 0x0076, 0x903e, 0x080c, - 0x86f1, 0x900e, 0x080c, 0xd5f6, 0x007e, 0x00ce, 0xb807, 0x0407, - 0x012e, 0x0804, 0x34e8, 0x6148, 0x624c, 0x7884, 0x604a, 0x7b88, - 0x634e, 0x2069, 0x185b, 0x831f, 0x9305, 0x6816, 0x788c, 0x2069, - 0x195e, 0x2d1c, 0x206a, 0x7e98, 0x9682, 0x0014, 0x1210, 0x2031, - 0x07d0, 0x2069, 0x195f, 0x2d04, 0x266a, 0x789a, 0x0804, 0x34e8, - 0x0126, 0x2091, 0x8000, 0x6138, 0x7884, 0x603a, 0x910e, 0xd1b4, - 0x190c, 0x0ee1, 0xd0c4, 0x01a8, 0x00d6, 0x78a8, 0x2009, 0x1975, - 0x200a, 0x78ac, 0x2011, 0x1976, 0x2012, 0x2069, 0x0100, 0x6838, - 0x9086, 0x0007, 0x1118, 0x2214, 0x6a5a, 0x0010, 0x210c, 0x695a, - 0x00de, 0x2001, 0x0100, 0x2004, 0x9086, 0x000a, 0x0168, 0x2011, - 0x0114, 0x220c, 0x7888, 0xd08c, 0x0118, 0x918d, 0x0080, 0x0010, - 0x918c, 0xff7f, 0x2112, 0x0060, 0x2011, 0x0116, 0x220c, 0x7888, - 0xd08c, 0x0118, 0x918d, 0x0040, 0x0010, 0x918c, 0xff7f, 0x2112, - 0x603c, 0x7988, 0x613e, 0x6140, 0x910d, 0x788c, 0x6042, 0x7a88, - 0x9294, 0x1000, 0x9205, 0x910e, 0xd1e4, 0x190c, 0x0ef7, 0x6040, - 0xd0cc, 0x0120, 0x78b0, 0x2011, 0x0114, 0x2012, 0x012e, 0x0804, - 0x34e8, 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, 0x351d, 0x788c, 0x902d, 0x0904, 0x351d, 0x900e, - 0x080c, 0x649f, 0x1120, 0xba44, 0xbb38, 0xbc46, 0xbd3a, 0x9186, - 0x07ff, 0x0190, 0x8108, 0x0ca0, 0x080c, 0x4af2, 0x0904, 0x351d, - 0x7888, 0x900d, 0x0904, 0x351d, 0x788c, 0x9005, 0x0904, 0x351d, - 0xba44, 0xb946, 0xbb38, 0xb83a, 0x0804, 0x34e8, 0x2011, 0xbc09, - 0x0010, 0x2011, 0xbc05, 0x080c, 0x55ef, 0x1904, 0x351a, 0x00c6, - 0x2061, 0x0100, 0x7984, 0x9186, 0x00ff, 0x1130, 0x2001, 0x1817, - 0x2004, 0x9085, 0xff00, 0x0088, 0x9182, 0x007f, 0x16e0, 0x9188, - 0x32e9, 0x210d, 0x918c, 0x00ff, 0x2001, 0x1817, 0x2004, 0x0026, - 0x9116, 0x002e, 0x0580, 0x810f, 0x9105, 0x0126, 0x2091, 0x8000, - 0x0006, 0x080c, 0xa08d, 0x000e, 0x0510, 0x602e, 0x620a, 0x7984, - 0x00b6, 0x080c, 0x6445, 0x2b08, 0x00be, 0x1500, 0x6112, 0x6023, - 0x0001, 0x080c, 0x4abf, 0x01d0, 0x9006, 0xa866, 0x7007, 0x0003, - 0xa832, 0xa868, 0xc0fd, 0xa86a, 0x701f, 0x39e1, 0x2900, 0x6016, - 0x2009, 0x0032, 0x080c, 0xa15d, 0x012e, 0x00ce, 0x0005, 0x012e, - 0x00ce, 0x0804, 0x351a, 0x00ce, 0x0804, 0x351d, 0x080c, 0xa0e3, - 0x0cb0, 0xa830, 0x9086, 0x0100, 0x0904, 0x351a, 0x0804, 0x34e8, - 0x2061, 0x1a48, 0x0126, 0x2091, 0x8000, 0x6000, 0xd084, 0x0170, - 0x6104, 0x6208, 0x2061, 0x1800, 0x6350, 0x6070, 0x789a, 0x60bc, - 0x789e, 0x60b8, 0x78aa, 0x012e, 0x0804, 0x34e8, 0x900e, 0x2110, - 0x0c88, 0x81ff, 0x1904, 0x351a, 0x080c, 0x7207, 0x0904, 0x351a, - 0x0126, 0x2091, 0x8000, 0x6250, 0x6070, 0x9202, 0x0248, 0x9085, - 0x0001, 0x080c, 0x27d7, 0x080c, 0x580e, 0x012e, 0x0804, 0x34e8, - 0x012e, 0x0804, 0x351d, 0x0006, 0x0016, 0x00c6, 0x00e6, 0x2001, - 0x1981, 0x2070, 0x2061, 0x185b, 0x6008, 0x2072, 0x900e, 0x2011, - 0x1400, 0x080c, 0x84ff, 0x7206, 0x00ee, 0x00ce, 0x001e, 0x000e, - 0x0005, 0x0126, 0x2091, 0x8000, 0x81ff, 0x0128, 0x012e, 0x2021, - 0x400b, 0x0804, 0x34ea, 0x7884, 0xd0fc, 0x0148, 0x2001, 0x002a, - 0x2004, 0x9082, 0x00e1, 0x0288, 0x012e, 0x0804, 0x351d, 0x2001, - 0x002a, 0x2004, 0x2069, 0x185b, 0x6908, 0x9102, 0x1230, 0x012e, - 0x0804, 0x351d, 0x012e, 0x0804, 0x351a, 0x080c, 0xa062, 0x0dd0, - 0x7884, 0xd0fc, 0x0904, 0x3aac, 0x00c6, 0x080c, 0x4abf, 0x00ce, + 0x8000, 0x8000, 0x8000, 0x2071, 0x189c, 0x7003, 0x0002, 0x9006, + 0x7016, 0x701a, 0x704a, 0x704e, 0x700e, 0x7042, 0x7046, 0x703b, + 0x18b8, 0x703f, 0x18b8, 0x7007, 0x0001, 0x080c, 0x1050, 0x090c, + 0x0df6, 0x2900, 0x706a, 0xa867, 0x0002, 0xa8ab, 0xdcb0, 0x080c, + 0x1050, 0x090c, 0x0df6, 0x2900, 0x706e, 0xa867, 0x0002, 0xa8ab, + 0xdcb0, 0x0005, 0x2071, 0x189c, 0x7004, 0x0002, 0x3322, 0x3323, + 0x3336, 0x334a, 0x0005, 0x1004, 0x3333, 0x0e04, 0x3333, 0x2079, + 0x0000, 0x0126, 0x2091, 0x8000, 0x700c, 0x9005, 0x1128, 0x700f, + 0x0001, 0x012e, 0x0468, 0x0005, 0x012e, 0x0ce8, 0x2079, 0x0000, + 0x2061, 0x18b6, 0x2c4c, 0xa86c, 0x908e, 0x0100, 0x0128, 0x9086, + 0x0200, 0x0904, 0x341e, 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, 0x61cc, 0x0042, + 0x2100, 0x908a, 0x003f, 0x1a04, 0x341b, 0x61cc, 0x0804, 0x33b0, + 0x33f2, 0x342a, 0x341b, 0x3436, 0x3440, 0x3446, 0x344a, 0x345a, + 0x345e, 0x3474, 0x347a, 0x3480, 0x348b, 0x3496, 0x34a5, 0x34b4, + 0x34c2, 0x34d9, 0x34f4, 0x341b, 0x359d, 0x35db, 0x3681, 0x3692, + 0x36b5, 0x341b, 0x341b, 0x341b, 0x36ed, 0x3709, 0x3712, 0x3741, + 0x3747, 0x341b, 0x378d, 0x341b, 0x341b, 0x341b, 0x341b, 0x341b, + 0x3798, 0x37a1, 0x37a9, 0x37ab, 0x341b, 0x341b, 0x341b, 0x341b, + 0x341b, 0x341b, 0x37d7, 0x341b, 0x341b, 0x341b, 0x341b, 0x341b, + 0x37f4, 0x3868, 0x341b, 0x341b, 0x341b, 0x341b, 0x341b, 0x341b, + 0x0002, 0x3892, 0x3895, 0x38f4, 0x390d, 0x393d, 0x3bdf, 0x341b, + 0x509e, 0x341b, 0x341b, 0x341b, 0x341b, 0x341b, 0x341b, 0x341b, + 0x341b, 0x3474, 0x347a, 0x416d, 0x54ff, 0x4183, 0x512d, 0x517f, + 0x528a, 0x341b, 0x52ec, 0x5328, 0x5359, 0x5461, 0x5386, 0x53e1, + 0x341b, 0x4187, 0x4336, 0x434c, 0x4371, 0x43d6, 0x444a, 0x446a, + 0x44e1, 0x453d, 0x4599, 0x459c, 0x45c1, 0x4636, 0x469c, 0x46a4, + 0x47d9, 0x4941, 0x4975, 0x4bbf, 0x341b, 0x4bdd, 0x4c9a, 0x4d77, + 0x341b, 0x341b, 0x341b, 0x341b, 0x4ddd, 0x4df8, 0x46a4, 0x503e, + 0x714c, 0x0000, 0x2021, 0x4000, 0x080c, 0x49f3, 0x0126, 0x2091, + 0x8000, 0x0e04, 0x33fc, 0x0010, 0x012e, 0x0cc0, 0x7c36, 0x9486, + 0x4000, 0x0118, 0x7833, 0x0011, 0x0010, 0x7833, 0x0010, 0x7c82, + 0x7986, 0x7a8a, 0x7b8e, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, + 0xd084, 0x190c, 0x11e6, 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, 0x4a00, 0x2039, 0x0001, + 0x902e, 0x2520, 0x7b88, 0x7a8c, 0x7884, 0x7990, 0x0804, 0x4a03, + 0x7984, 0x7888, 0x2114, 0x200a, 0x0804, 0x33f2, 0x7984, 0x2114, + 0x0804, 0x33f2, 0x20e1, 0x0000, 0x2099, 0x0021, 0x20e9, 0x0000, + 0x20a1, 0x0021, 0x20a9, 0x001f, 0x4003, 0x7984, 0x7a88, 0x7b8c, + 0x0804, 0x33f2, 0x7884, 0x2060, 0x0804, 0x34a7, 0x2009, 0x0003, + 0x2011, 0x0003, 0x2019, 0x0012, 0x789b, 0x0317, 0x7893, 0xffff, + 0x2001, 0x188d, 0x2004, 0x9005, 0x0118, 0x7896, 0x0804, 0x33f2, + 0x7897, 0x0001, 0x0804, 0x33f2, 0x2039, 0x0001, 0x7d98, 0x7c9c, + 0x0804, 0x342e, 0x2039, 0x0001, 0x7d98, 0x7c9c, 0x0804, 0x343a, + 0x79a0, 0x9182, 0x0040, 0x0210, 0x0804, 0x3427, 0x2138, 0x7d98, + 0x7c9c, 0x0804, 0x342e, 0x79a0, 0x9182, 0x0040, 0x0210, 0x0804, + 0x3427, 0x2138, 0x7d98, 0x7c9c, 0x0804, 0x343a, 0x79a0, 0x9182, + 0x0040, 0x0210, 0x0804, 0x3427, 0x21e8, 0x7984, 0x7888, 0x20a9, + 0x0001, 0x21a0, 0x4004, 0x0804, 0x33f2, 0x2061, 0x0800, 0xe10c, + 0x9006, 0x2c15, 0x9200, 0x8c60, 0x8109, 0x1dd8, 0x2010, 0x9005, + 0x0904, 0x33f2, 0x0804, 0x3421, 0x79a0, 0x9182, 0x0040, 0x0210, + 0x0804, 0x3427, 0x21e0, 0x20a9, 0x0001, 0x7984, 0x2198, 0x4012, + 0x0804, 0x33f2, 0x2069, 0x185b, 0x7884, 0x7990, 0x911a, 0x1a04, + 0x3427, 0x8019, 0x0904, 0x3427, 0x684a, 0x6942, 0x788c, 0x6852, + 0x7888, 0x6856, 0x9006, 0x685a, 0x685e, 0x080c, 0x74ab, 0x0804, + 0x33f2, 0x2069, 0x185b, 0x7884, 0x7994, 0x911a, 0x1a04, 0x3427, + 0x8019, 0x0904, 0x3427, 0x684e, 0x6946, 0x788c, 0x6862, 0x7888, + 0x6866, 0x9006, 0x686a, 0x686e, 0x0126, 0x2091, 0x8000, 0x080c, + 0x67f9, 0x012e, 0x0804, 0x33f2, 0x902e, 0x2520, 0x81ff, 0x0120, + 0x2009, 0x0001, 0x0804, 0x3424, 0x7984, 0x7b88, 0x7a8c, 0x20a9, + 0x0005, 0x20e9, 0x0001, 0x20a1, 0x18a4, 0x4101, 0x080c, 0x49b7, + 0x1120, 0x2009, 0x0002, 0x0804, 0x3424, 0x2009, 0x0020, 0xa85c, + 0x9080, 0x0019, 0xaf60, 0x080c, 0x4a00, 0x701f, 0x3518, 0x0005, + 0xa864, 0x2008, 0x9084, 0x00ff, 0x9096, 0x0011, 0x0168, 0x9096, + 0x0019, 0x0150, 0x9096, 0x0015, 0x0138, 0x9096, 0x0048, 0x0120, + 0x9096, 0x0029, 0x1904, 0x3424, 0x810f, 0x918c, 0x00ff, 0x0904, + 0x3424, 0x7112, 0x7010, 0x8001, 0x0560, 0x7012, 0x080c, 0x49b7, + 0x1120, 0x2009, 0x0002, 0x0804, 0x3424, 0x2009, 0x0020, 0x7068, + 0x2040, 0xa28c, 0xa390, 0xa494, 0xa598, 0x9290, 0x0040, 0x9399, + 0x0000, 0x94a1, 0x0000, 0x95a9, 0x0000, 0xa85c, 0x9080, 0x0019, + 0xaf60, 0x080c, 0x4a00, 0x701f, 0x3556, 0x0005, 0xa864, 0x9084, + 0x00ff, 0x9096, 0x0002, 0x0120, 0x9096, 0x000a, 0x1904, 0x3424, + 0x0888, 0x7014, 0x2048, 0xa868, 0xc0fd, 0xa86a, 0xa864, 0x9084, + 0x00ff, 0x9096, 0x0029, 0x1160, 0xc2fd, 0xaa7a, 0x080c, 0x5f3b, + 0x0150, 0x0126, 0x2091, 0x8000, 0xa87a, 0xa982, 0x012e, 0x0050, + 0x080c, 0x6259, 0x1128, 0x7007, 0x0003, 0x701f, 0x3582, 0x0005, + 0x080c, 0x6c6b, 0x0126, 0x2091, 0x8000, 0x20a9, 0x0005, 0x20e1, + 0x0001, 0x2099, 0x18a4, 0x400a, 0x2100, 0x9210, 0x9399, 0x0000, + 0x94a1, 0x0000, 0x95a9, 0x0000, 0xa85c, 0x9080, 0x0019, 0x2009, + 0x0020, 0x012e, 0xaf60, 0x0804, 0x4a03, 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, + 0x19f6, 0x2004, 0x9005, 0x0128, 0x2001, 0x008b, 0x2004, 0xd0fc, + 0x0dd8, 0x2001, 0x008a, 0x2003, 0x0002, 0x2003, 0x1001, 0x2071, + 0x0080, 0x0804, 0x0427, 0x81ff, 0x1904, 0x3424, 0x7984, 0x080c, + 0x63a3, 0x1904, 0x3427, 0x7e98, 0x9684, 0x3fff, 0x9082, 0x4000, + 0x1a04, 0x3427, 0x7c88, 0x7d8c, 0x080c, 0x6506, 0x080c, 0x64d5, + 0x0000, 0x1518, 0x2061, 0x1cd0, 0x0126, 0x2091, 0x8000, 0x6000, + 0x9086, 0x0000, 0x0148, 0x6014, 0x904d, 0x0130, 0xa86c, 0x9406, + 0x1118, 0xa870, 0x9506, 0x0150, 0x012e, 0x9ce0, 0x0018, 0x2001, + 0x1819, 0x2004, 0x9c02, 0x1a04, 0x3424, 0x0c30, 0x080c, 0xb983, + 0x012e, 0x0904, 0x3424, 0x0804, 0x33f2, 0x900e, 0x2001, 0x0005, + 0x080c, 0x6c6b, 0x0126, 0x2091, 0x8000, 0x080c, 0xc04a, 0x080c, + 0x6a22, 0x012e, 0x0804, 0x33f2, 0x00a6, 0x2950, 0xb198, 0x080c, + 0x63a3, 0x1904, 0x366e, 0xb6a4, 0x9684, 0x3fff, 0x9082, 0x4000, + 0x16e8, 0xb49c, 0xb5a0, 0x080c, 0x6506, 0x080c, 0x64d5, 0x1520, + 0x2061, 0x1cd0, 0x0126, 0x2091, 0x8000, 0x6000, 0x9086, 0x0000, + 0x0148, 0x6014, 0x904d, 0x0130, 0xa86c, 0x9406, 0x1118, 0xa870, + 0x9506, 0x0158, 0x012e, 0x9ce0, 0x0018, 0x2001, 0x1819, 0x2004, + 0x9c02, 0x2009, 0x000d, 0x12b0, 0x0c28, 0x080c, 0xb983, 0x012e, + 0x2009, 0x0003, 0x0178, 0x00e0, 0x900e, 0x2001, 0x0005, 0x080c, + 0x6c6b, 0x0126, 0x2091, 0x8000, 0x080c, 0xc04a, 0x080c, 0x6a15, + 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, 0x3424, 0x080c, 0x49ce, 0x0904, 0x3427, + 0x080c, 0x646a, 0x0904, 0x3424, 0x080c, 0x650c, 0x0904, 0x3424, + 0x0804, 0x4461, 0x81ff, 0x1904, 0x3424, 0x080c, 0x49ea, 0x0904, + 0x3427, 0x080c, 0x659a, 0x0904, 0x3424, 0x2019, 0x0005, 0x79a8, + 0x080c, 0x6527, 0x0904, 0x3424, 0x7888, 0x908a, 0x1000, 0x1a04, + 0x3427, 0x8003, 0x800b, 0x810b, 0x9108, 0x080c, 0x8267, 0x79a8, + 0xd184, 0x1904, 0x33f2, 0x0804, 0x4461, 0x0126, 0x2091, 0x8000, + 0x81ff, 0x0118, 0x2009, 0x0001, 0x0450, 0x2029, 0x07ff, 0x6458, + 0x2400, 0x9506, 0x01f8, 0x2508, 0x080c, 0x63a3, 0x11d8, 0x080c, + 0x659a, 0x1128, 0x2009, 0x0002, 0x62bc, 0x2518, 0x00c0, 0x2019, + 0x0004, 0x900e, 0x080c, 0x6527, 0x1118, 0x2009, 0x0006, 0x0078, + 0x7884, 0x908a, 0x1000, 0x1270, 0x8003, 0x800b, 0x810b, 0x9108, + 0x080c, 0x8267, 0x8529, 0x1ae0, 0x012e, 0x0804, 0x33f2, 0x012e, + 0x0804, 0x3424, 0x012e, 0x0804, 0x3427, 0x080c, 0x49ce, 0x0904, + 0x3427, 0x080c, 0x646a, 0x0904, 0x3424, 0xbaa0, 0x2019, 0x0005, + 0x00c6, 0x9066, 0x080c, 0x8782, 0x0076, 0x903e, 0x080c, 0x8670, + 0x900e, 0x080c, 0xd556, 0x007e, 0x00ce, 0x080c, 0x6506, 0x0804, + 0x33f2, 0x080c, 0x49ce, 0x0904, 0x3427, 0x080c, 0x6506, 0x2208, + 0x0804, 0x33f2, 0x0156, 0x00d6, 0x00e6, 0x2069, 0x190e, 0x6810, + 0x6914, 0x910a, 0x1208, 0x900e, 0x6816, 0x9016, 0x901e, 0x20a9, + 0x007e, 0x2069, 0x1000, 0x2d04, 0x905d, 0x0118, 0xb84c, 0x0059, + 0x9210, 0x8d68, 0x1f04, 0x3723, 0x2300, 0x9218, 0x00ee, 0x00de, + 0x015e, 0x0804, 0x33f2, 0x00f6, 0x0016, 0x907d, 0x0138, 0x9006, + 0x8000, 0x2f0c, 0x81ff, 0x0110, 0x2178, 0x0cd0, 0x001e, 0x00fe, + 0x0005, 0x2069, 0x190e, 0x6910, 0x62b8, 0x0804, 0x33f2, 0x81ff, + 0x0120, 0x2009, 0x0001, 0x0804, 0x3424, 0x0126, 0x2091, 0x8000, + 0x080c, 0x54ef, 0x0128, 0x2009, 0x0007, 0x012e, 0x0804, 0x3424, + 0x012e, 0x6158, 0x9190, 0x31f3, 0x2215, 0x9294, 0x00ff, 0x6378, + 0x83ff, 0x0108, 0x627c, 0x67d8, 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, 0x717e, 0x1118, 0x2031, + 0x0004, 0x0038, 0xd79c, 0x0120, 0x2009, 0x0005, 0x0804, 0x3424, + 0x9036, 0x7e9a, 0x7f9e, 0x0804, 0x33f2, 0x6148, 0x624c, 0x2019, + 0x1960, 0x231c, 0x2001, 0x1961, 0x2004, 0x789a, 0x0804, 0x33f2, + 0x0126, 0x2091, 0x8000, 0x6138, 0x623c, 0x6340, 0x012e, 0x0804, + 0x33f2, 0x080c, 0x49ea, 0x0904, 0x3427, 0xba44, 0xbb38, 0x0804, + 0x33f2, 0x080c, 0x0df6, 0x080c, 0x49ea, 0x2110, 0x0904, 0x3427, + 0xb804, 0x908c, 0x00ff, 0x918e, 0x0006, 0x0140, 0x9084, 0xff00, + 0x9086, 0x0600, 0x2009, 0x0009, 0x1904, 0x3424, 0x0126, 0x2091, + 0x8000, 0x2019, 0x0005, 0x00c6, 0x9066, 0x080c, 0x9ad0, 0x080c, + 0x8782, 0x0076, 0x903e, 0x080c, 0x8670, 0x900e, 0x080c, 0xd556, + 0x007e, 0x00ce, 0xb807, 0x0407, 0x012e, 0x0804, 0x33f2, 0x6148, + 0x624c, 0x7884, 0x604a, 0x7b88, 0x634e, 0x2069, 0x185b, 0x831f, + 0x9305, 0x6816, 0x788c, 0x2069, 0x1960, 0x2d1c, 0x206a, 0x7e98, + 0x9682, 0x0014, 0x1210, 0x2031, 0x07d0, 0x2069, 0x1961, 0x2d04, + 0x266a, 0x789a, 0x0804, 0x33f2, 0x0126, 0x2091, 0x8000, 0x6138, + 0x7884, 0x603a, 0x910e, 0xd1b4, 0x190c, 0x0ee7, 0xd0c4, 0x01a8, + 0x00d6, 0x78a8, 0x2009, 0x1977, 0x200a, 0x78ac, 0x2011, 0x1978, + 0x2012, 0x2069, 0x0100, 0x6838, 0x9086, 0x0007, 0x1118, 0x2214, + 0x6a5a, 0x0010, 0x210c, 0x695a, 0x00de, 0x2001, 0x0100, 0x2004, + 0x9086, 0x000a, 0x0168, 0x2011, 0x0114, 0x220c, 0x7888, 0xd08c, + 0x0118, 0x918d, 0x0080, 0x0010, 0x918c, 0xff7f, 0x2112, 0x0060, + 0x2011, 0x0116, 0x220c, 0x7888, 0xd08c, 0x0118, 0x918d, 0x0040, + 0x0010, 0x918c, 0xff7f, 0x2112, 0x603c, 0x7988, 0x613e, 0x6140, + 0x910d, 0x788c, 0x6042, 0x7a88, 0x9294, 0x1000, 0x9205, 0x910e, + 0xd1e4, 0x190c, 0x0efd, 0x6040, 0xd0cc, 0x0120, 0x78b0, 0x2011, + 0x0114, 0x2012, 0x012e, 0x0804, 0x33f2, 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, 0x3427, 0x788c, + 0x902d, 0x0904, 0x3427, 0x900e, 0x080c, 0x63a3, 0x1120, 0xba44, + 0xbb38, 0xbc46, 0xbd3a, 0x9186, 0x07ff, 0x0190, 0x8108, 0x0ca0, + 0x080c, 0x49ea, 0x0904, 0x3427, 0x7888, 0x900d, 0x0904, 0x3427, + 0x788c, 0x9005, 0x0904, 0x3427, 0xba44, 0xb946, 0xbb38, 0xb83a, + 0x0804, 0x33f2, 0x2011, 0xbc09, 0x0010, 0x2011, 0xbc05, 0x080c, + 0x54ef, 0x1904, 0x3424, 0x00c6, 0x2061, 0x0100, 0x7984, 0x9186, + 0x00ff, 0x1130, 0x2001, 0x1817, 0x2004, 0x9085, 0xff00, 0x0088, + 0x9182, 0x007f, 0x16e0, 0x9188, 0x31f3, 0x210d, 0x918c, 0x00ff, + 0x2001, 0x1817, 0x2004, 0x0026, 0x9116, 0x002e, 0x0580, 0x810f, + 0x9105, 0x0126, 0x2091, 0x8000, 0x0006, 0x080c, 0x9f94, 0x000e, + 0x0510, 0x602e, 0x620a, 0x7984, 0x00b6, 0x080c, 0x6349, 0x2b08, + 0x00be, 0x1500, 0x6112, 0x6023, 0x0001, 0x080c, 0x49b7, 0x01d0, + 0x9006, 0xa866, 0x7007, 0x0003, 0xa832, 0xa868, 0xc0fd, 0xa86a, + 0x701f, 0x38ed, 0x2900, 0x6016, 0x2009, 0x0032, 0x080c, 0xa068, + 0x012e, 0x00ce, 0x0005, 0x012e, 0x00ce, 0x0804, 0x3424, 0x00ce, + 0x0804, 0x3427, 0x080c, 0x9fea, 0x0cb0, 0xa830, 0x9086, 0x0100, + 0x0904, 0x3424, 0x0804, 0x33f2, 0x2061, 0x1a4c, 0x0126, 0x2091, + 0x8000, 0x6000, 0xd084, 0x0170, 0x6104, 0x6208, 0x2061, 0x1800, + 0x6350, 0x6070, 0x789a, 0x60bc, 0x789e, 0x60b8, 0x78aa, 0x012e, + 0x0804, 0x33f2, 0x900e, 0x2110, 0x0c88, 0x81ff, 0x1904, 0x3424, + 0x080c, 0x717e, 0x0904, 0x3424, 0x0126, 0x2091, 0x8000, 0x6250, + 0x6070, 0x9202, 0x0248, 0x9085, 0x0001, 0x080c, 0x26d6, 0x080c, + 0x5712, 0x012e, 0x0804, 0x33f2, 0x012e, 0x0804, 0x3427, 0x0006, + 0x0016, 0x00c6, 0x00e6, 0x2001, 0x1984, 0x2070, 0x2061, 0x185b, + 0x6008, 0x2072, 0x900e, 0x2011, 0x1400, 0x080c, 0x847e, 0x7206, + 0x00ee, 0x00ce, 0x001e, 0x000e, 0x0005, 0x0126, 0x2091, 0x8000, + 0x81ff, 0x0128, 0x012e, 0x2021, 0x400b, 0x0804, 0x33f4, 0x7884, + 0xd0fc, 0x0158, 0x2001, 0x002a, 0x2004, 0x9005, 0x0180, 0x9082, + 0x00e1, 0x0298, 0x012e, 0x0804, 0x3427, 0x2001, 0x002a, 0x2004, + 0x9005, 0x0128, 0x2069, 0x185b, 0x6908, 0x9102, 0x1230, 0x012e, + 0x0804, 0x3427, 0x012e, 0x0804, 0x3424, 0x080c, 0x9f69, 0x0dd0, + 0x7884, 0xd0fc, 0x0904, 0x39bc, 0x00c6, 0x080c, 0x49b7, 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, 0x3c32, 0x0928, 0x7014, 0x2048, 0xad2c, + 0x8004, 0xa816, 0x080c, 0x3b42, 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, 0x4b08, 0x701f, 0x3b6f, + 0x9084, 0xffc0, 0x9080, 0x001b, 0x080c, 0x4a00, 0x701f, 0x3a7f, 0x7023, 0x0001, 0x012e, 0x0005, 0x0046, 0x0086, 0x0096, 0x00a6, - 0x00b6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x080c, 0x3a1b, 0x2001, - 0x1977, 0x2003, 0x0000, 0x2021, 0x000a, 0x2061, 0x0100, 0x6104, + 0x00b6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x080c, 0x3927, 0x2001, + 0x197a, 0x2003, 0x0000, 0x2021, 0x000a, 0x2061, 0x0100, 0x6104, 0x0016, 0x60bb, 0x0000, 0x60bf, 0x32e1, 0x60bf, 0x0012, 0x080c, - 0x3ca1, 0x080c, 0x3c60, 0x00f6, 0x00e6, 0x0086, 0x2940, 0x2071, - 0x1a3d, 0x2079, 0x0090, 0x00d6, 0x2069, 0x0000, 0x6884, 0xd0b4, + 0x3bb1, 0x080c, 0x3b70, 0x00f6, 0x00e6, 0x0086, 0x2940, 0x2071, + 0x1a42, 0x2079, 0x0090, 0x00d6, 0x2069, 0x0000, 0x6884, 0xd0b4, 0x0140, 0x2001, 0x0035, 0x2004, 0x780e, 0x2001, 0x0034, 0x2004, - 0x780a, 0x00de, 0x2011, 0x0001, 0x080c, 0x408d, 0x008e, 0x00ee, - 0x00fe, 0x080c, 0x3fba, 0x080c, 0x3e7f, 0x05b8, 0x2001, 0x020b, - 0x2004, 0x9084, 0x0140, 0x1db8, 0x080c, 0x4101, 0x00f6, 0x2079, + 0x780a, 0x00de, 0x2011, 0x0001, 0x080c, 0x3fb1, 0x008e, 0x00ee, + 0x00fe, 0x080c, 0x3ed3, 0x080c, 0x3d98, 0x05b8, 0x2001, 0x020b, + 0x2004, 0x9084, 0x0140, 0x1db8, 0x080c, 0x4025, 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, 0x181f, 0x2004, 0x9106, 0x1168, 0x00c6, 0x2061, 0x0100, - 0x6024, 0x9084, 0x1e00, 0x00ce, 0x0138, 0x080c, 0x3e89, 0x080c, - 0x3c5b, 0x0058, 0x080c, 0x3c5b, 0x080c, 0x4025, 0x080c, 0x3fb0, + 0x6024, 0x9084, 0x1e00, 0x00ce, 0x0138, 0x080c, 0x3da2, 0x080c, + 0x3b6b, 0x0058, 0x080c, 0x3b6b, 0x080c, 0x3f49, 0x080c, 0x3ec9, 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, - 0x12f8, 0x2009, 0x0028, 0x080c, 0x230a, 0x2001, 0x0227, 0x200c, + 0x12fe, 0x2009, 0x0028, 0x080c, 0x2200, 0x2001, 0x0227, 0x200c, 0x2102, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, 0x00ae, 0x009e, - 0x008e, 0x004e, 0x2001, 0x1977, 0x2004, 0x9005, 0x1118, 0x012e, - 0x0804, 0x34e8, 0x012e, 0x2021, 0x400c, 0x0804, 0x34ea, 0x0016, + 0x008e, 0x004e, 0x2001, 0x197a, 0x2004, 0x9005, 0x1118, 0x012e, + 0x0804, 0x33f2, 0x012e, 0x2021, 0x400c, 0x0804, 0x33f4, 0x0016, 0x0026, 0x0036, 0x0046, 0x0056, 0x0076, 0x0086, 0x0096, 0x00d6, 0x0156, 0x7014, 0x2048, 0x7020, 0x20a8, 0x8000, 0x7022, 0xa804, - 0x9005, 0x0904, 0x3bcb, 0x2048, 0x1f04, 0x3b7f, 0x7068, 0x2040, + 0x9005, 0x0904, 0x3adb, 0x2048, 0x1f04, 0x3a8f, 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, 0x4b08, 0x701f, - 0x3b6f, 0x00b0, 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, + 0x003f, 0x9084, 0xffc0, 0x9080, 0x001b, 0x080c, 0x4a00, 0x701f, + 0x3a7f, 0x00b0, 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x001b, 0x21a8, 0x27e0, 0x2098, 0x27e8, 0x20a0, - 0x0006, 0x080c, 0x0fae, 0x000e, 0x080c, 0x4b0b, 0x701f, 0x3b6f, + 0x0006, 0x080c, 0x0fb4, 0x000e, 0x080c, 0x4a03, 0x701f, 0x3a7f, 0x015e, 0x00de, 0x009e, 0x008e, 0x007e, 0x005e, 0x004e, 0x003e, 0x002e, 0x001e, 0x0005, 0x7014, 0x2048, 0xa864, 0x9086, 0x0103, - 0x1118, 0x701f, 0x3c30, 0x0450, 0x7014, 0x2048, 0xa868, 0xc0fd, - 0xa86a, 0x2009, 0x007f, 0x080c, 0x643f, 0x0110, 0x9006, 0x0030, - 0xb813, 0x00ff, 0xb817, 0xfffd, 0x080c, 0xc302, 0x015e, 0x00de, + 0x1118, 0x701f, 0x3b40, 0x0450, 0x7014, 0x2048, 0xa868, 0xc0fd, + 0xa86a, 0x2009, 0x007f, 0x080c, 0x6343, 0x0110, 0x9006, 0x0030, + 0xb813, 0x00ff, 0xb817, 0xfffd, 0x080c, 0xc21d, 0x015e, 0x00de, 0x009e, 0x008e, 0x007e, 0x005e, 0x004e, 0x003e, 0x002e, 0x001e, - 0x0904, 0x351a, 0x0016, 0x0026, 0x0036, 0x0046, 0x0056, 0x0076, - 0x0086, 0x0096, 0x00d6, 0x0156, 0x701f, 0x3c02, 0x7007, 0x0003, - 0x0804, 0x3bc0, 0xa830, 0x9086, 0x0100, 0x2021, 0x400c, 0x0904, - 0x34ea, 0x0076, 0xad10, 0xac0c, 0xab24, 0xaa20, 0xa930, 0xa808, + 0x0904, 0x3424, 0x0016, 0x0026, 0x0036, 0x0046, 0x0056, 0x0076, + 0x0086, 0x0096, 0x00d6, 0x0156, 0x701f, 0x3b12, 0x7007, 0x0003, + 0x0804, 0x3ad0, 0xa830, 0x9086, 0x0100, 0x2021, 0x400c, 0x0904, + 0x33f4, 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, 0x0fae, 0x000e, - 0x080c, 0x4b0b, 0x007e, 0x701f, 0x3b6f, 0x7023, 0x0001, 0x0005, - 0x0804, 0x34e8, 0x0156, 0x00c6, 0xa814, 0x908a, 0x001e, 0x0218, + 0x27e0, 0x2098, 0x27e8, 0x20a0, 0x0006, 0x080c, 0x0fb4, 0x000e, + 0x080c, 0x4a03, 0x007e, 0x701f, 0x3a7f, 0x7023, 0x0001, 0x0005, + 0x0804, 0x33f2, 0x0156, 0x00c6, 0xa814, 0x908a, 0x001e, 0x0218, 0xa833, 0x001e, 0x0010, 0xa832, 0x0078, 0x81ff, 0x0168, 0x0016, - 0x080c, 0x4abf, 0x001e, 0x0130, 0xa800, 0x2040, 0xa008, 0xa80a, + 0x080c, 0x49b7, 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, 0x1977, 0x2003, 0x0001, 0x0005, - 0x00f6, 0x00e6, 0x00c6, 0x2061, 0x0200, 0x2001, 0x1982, 0x2004, - 0x601a, 0x2061, 0x0100, 0x2001, 0x1981, 0x2004, 0x60ce, 0x6104, - 0xc1ac, 0x6106, 0x080c, 0x4abf, 0xa813, 0x0019, 0xa817, 0x0001, + 0x00fe, 0x000e, 0x0005, 0x2001, 0x197a, 0x2003, 0x0001, 0x0005, + 0x00f6, 0x00e6, 0x00c6, 0x2061, 0x0200, 0x2001, 0x1985, 0x2004, + 0x601a, 0x2061, 0x0100, 0x2001, 0x1984, 0x2004, 0x60ce, 0x6104, + 0xc1ac, 0x6106, 0x080c, 0x49b7, 0xa813, 0x0019, 0xa817, 0x0001, 0x2900, 0xa85a, 0x2001, 0x002e, 0x2004, 0xa866, 0x2001, 0x002f, - 0x2004, 0xa86a, 0x2061, 0x0090, 0x2079, 0x0100, 0x2001, 0x1981, - 0x2004, 0x6036, 0x2009, 0x0040, 0x080c, 0x230a, 0x2001, 0x002a, + 0x2004, 0xa86a, 0x2061, 0x0090, 0x2079, 0x0100, 0x2001, 0x1984, + 0x2004, 0x6036, 0x2009, 0x0040, 0x080c, 0x2200, 0x2001, 0x002a, 0x2004, 0x9084, 0xfff8, 0xa86e, 0x601a, 0xa873, 0x0000, 0x601f, 0x0000, 0x78ca, 0x9006, 0x600a, 0x600e, 0x00ce, 0x00ee, 0x00fe, - 0x0005, 0x00e6, 0x080c, 0x4abf, 0x2940, 0xa013, 0x0019, 0xa017, + 0x0005, 0x00e6, 0x080c, 0x49b7, 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, 0x2ba8, 0x1130, 0x9006, - 0x080c, 0x2ab8, 0x9006, 0x080c, 0x2a9b, 0x7884, 0x9084, 0x0007, - 0x0002, 0x3cec, 0x3cfb, 0x3d0a, 0x3ce9, 0x3ce9, 0x3ce9, 0x3ce9, - 0x3ce9, 0x012e, 0x0804, 0x351d, 0x2001, 0x0100, 0x2004, 0x9086, - 0x000a, 0x0db8, 0x2009, 0x0114, 0x2104, 0x9085, 0x0800, 0x200a, - 0x080c, 0x3ed3, 0x00f0, 0x2001, 0x0100, 0x2004, 0x9086, 0x000a, - 0x0d40, 0x2009, 0x0114, 0x2104, 0x9085, 0x4000, 0x200a, 0x080c, - 0x3ed3, 0x0078, 0x080c, 0x7207, 0x1128, 0x012e, 0x2009, 0x0016, - 0x0804, 0x351a, 0x81ff, 0x0128, 0x012e, 0x2021, 0x400b, 0x0804, - 0x34ea, 0x0086, 0x0096, 0x00a6, 0x00b6, 0x00c6, 0x00d6, 0x00e6, - 0x00f6, 0x080c, 0x3a1b, 0x2009, 0x0101, 0x210c, 0x0016, 0x7ec8, - 0x7dcc, 0x9006, 0x2068, 0x2060, 0x2058, 0x080c, 0x41dc, 0x080c, - 0x412c, 0x903e, 0x2720, 0x00f6, 0x00e6, 0x0086, 0x2940, 0x2071, - 0x1a3d, 0x2079, 0x0090, 0x00d6, 0x2069, 0x0000, 0x6884, 0xd0b4, - 0x0120, 0x68d4, 0x780e, 0x68d0, 0x780a, 0x00de, 0x2011, 0x0001, - 0x080c, 0x408d, 0x080c, 0x2bb0, 0x080c, 0x2bb0, 0x080c, 0x2bb0, - 0x080c, 0x2bb0, 0x080c, 0x408d, 0x008e, 0x00ee, 0x00fe, 0x080c, - 0x3fba, 0x2009, 0x9c40, 0x8109, 0x11b0, 0x080c, 0x3e89, 0x2001, - 0x0004, 0x200c, 0x918c, 0xfffd, 0x2102, 0x001e, 0x00fe, 0x00ee, - 0x00de, 0x00ce, 0x00be, 0x00ae, 0x009e, 0x008e, 0x2009, 0x0017, - 0x080c, 0x351a, 0x0cf8, 0x2001, 0x020b, 0x2004, 0x9084, 0x0140, - 0x1d10, 0x00f6, 0x2079, 0x0000, 0x7884, 0x00fe, 0xd0bc, 0x0178, - 0x2001, 0x0201, 0x200c, 0x81ff, 0x0150, 0x080c, 0x3f98, 0x2d00, - 0x9c05, 0x9b05, 0x0120, 0x080c, 0x3e89, 0x0804, 0x3e29, 0x080c, - 0x4101, 0x080c, 0x4025, 0x080c, 0x3f7b, 0x080c, 0x3fb0, 0x00f6, - 0x2079, 0x0100, 0x7824, 0xd0ac, 0x0130, 0x8b58, 0x080c, 0x3e89, - 0x00fe, 0x0804, 0x3e29, 0x00fe, 0x080c, 0x3e7f, 0x1150, 0x8d68, - 0x2001, 0x0032, 0x2602, 0x2001, 0x0033, 0x2502, 0x080c, 0x3e89, - 0x0080, 0x87ff, 0x0138, 0x2001, 0x0201, 0x2004, 0x9005, 0x1908, - 0x8739, 0x0038, 0x2001, 0x1a3a, 0x2004, 0x9086, 0x0000, 0x1904, - 0x3d79, 0x2001, 0x032f, 0x2003, 0x00f6, 0x8631, 0x1208, 0x8529, - 0x2500, 0x9605, 0x0904, 0x3e29, 0x7884, 0xd0bc, 0x0128, 0x2d00, - 0x9c05, 0x9b05, 0x1904, 0x3e29, 0xa013, 0x0019, 0x2001, 0x032a, - 0x2003, 0x0004, 0x7884, 0xd0ac, 0x1148, 0x2001, 0x1a3a, 0x2003, - 0x0003, 0x2001, 0x032a, 0x2003, 0x0009, 0x0030, 0xa017, 0x0001, - 0x78b4, 0x9005, 0x0108, 0xa016, 0x2800, 0xa05a, 0x2009, 0x0040, - 0x080c, 0x230a, 0x2900, 0xa85a, 0xa813, 0x0019, 0x7884, 0xd0a4, - 0x1180, 0xa817, 0x0000, 0x00c6, 0x20a9, 0x0004, 0x2061, 0x0090, - 0x602b, 0x0008, 0x2001, 0x0203, 0x2004, 0x1f04, 0x3e00, 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, - 0x3d33, 0x001e, 0x00c6, 0x2001, 0x032a, 0x2003, 0x0004, 0x2061, - 0x0100, 0x6027, 0x0002, 0x6106, 0x2011, 0x020d, 0x2013, 0x0020, - 0x2001, 0x0004, 0x200c, 0x918c, 0xfffd, 0x2102, 0x080c, 0x12f8, - 0x7884, 0x9084, 0x0003, 0x9086, 0x0002, 0x0508, 0x2009, 0x0028, - 0x080c, 0x230a, 0x2001, 0x0227, 0x200c, 0x2102, 0x6050, 0x0006, - 0x2001, 0x0100, 0x2004, 0x9086, 0x000a, 0x000e, 0x0118, 0x9084, - 0xb7ef, 0x0020, 0x9084, 0xb7ff, 0x080c, 0x2cf5, 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, 0x34e8, 0x012e, 0x2021, 0x400c, 0x0804, 0x34ea, 0x9085, - 0x0001, 0x1d04, 0x3e88, 0x2091, 0x6000, 0x8420, 0x9486, 0x0064, - 0x0005, 0x2001, 0x0105, 0x2003, 0x0010, 0x2001, 0x032a, 0x2003, - 0x0004, 0x2001, 0x1a3a, 0x2003, 0x0000, 0x0071, 0x2009, 0x0048, - 0x080c, 0x230a, 0x2001, 0x0227, 0x2024, 0x2402, 0x2001, 0x0109, - 0x2003, 0x4000, 0x9026, 0x0005, 0x00f6, 0x00e6, 0x2071, 0x1a3d, - 0x7000, 0x9086, 0x0000, 0x0520, 0x2079, 0x0090, 0x2009, 0x0206, - 0x2104, 0x2009, 0x0203, 0x210c, 0x9106, 0x1120, 0x2009, 0x0040, - 0x080c, 0x230a, 0x782c, 0xd0fc, 0x0d88, 0x080c, 0x4101, 0x7000, - 0x9086, 0x0000, 0x1d58, 0x782b, 0x0004, 0x782c, 0xd0ac, 0x1de8, - 0x2009, 0x0040, 0x080c, 0x230a, 0x782b, 0x0002, 0x7003, 0x0000, - 0x00ee, 0x00fe, 0x0005, 0x2001, 0x0100, 0x2004, 0x9086, 0x000a, - 0x15d0, 0x00f6, 0x2079, 0x0100, 0x2001, 0x1817, 0x200c, 0x7932, - 0x7936, 0x080c, 0x27b7, 0x080c, 0x2cc2, 0x080c, 0x2cf5, 0x784b, - 0xf7f7, 0x7843, 0x0090, 0x7843, 0x0010, 0x7850, 0xc0e5, 0x7852, - 0x2019, 0x61a8, 0x7820, 0xd09c, 0x0110, 0x8319, 0x1dd8, 0x7850, - 0xc0e4, 0x7852, 0x7827, 0x0048, 0x7843, 0x0040, 0x2019, 0x01f4, - 0xa001, 0xa001, 0x8319, 0x1de0, 0x2001, 0x0100, 0x080c, 0x2c88, - 0x7827, 0x0020, 0x7843, 0x0000, 0x9006, 0x080c, 0x2c88, 0x7827, - 0x0048, 0x00fe, 0x0005, 0x00f6, 0x2079, 0x0100, 0x2001, 0x1817, - 0x200c, 0x7932, 0x7936, 0x080c, 0x27b7, 0x7850, 0x9084, 0xfbff, - 0x9085, 0x0030, 0x7852, 0x2019, 0x01f4, 0x8319, 0x1df0, 0x9084, - 0xffcf, 0x9085, 0x2000, 0x7852, 0x20a9, 0x0046, 0x1d04, 0x3f2e, - 0x2091, 0x6000, 0x1f04, 0x3f2e, 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, - 0x3f4e, 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, 0x2c88, - 0x7827, 0x0020, 0x7843, 0x0000, 0x9006, 0x080c, 0x2c88, 0x7827, - 0x0048, 0x00fe, 0x0005, 0x7884, 0xd0ac, 0x11c8, 0x00f6, 0x00e6, - 0x2071, 0x1a3a, 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, 0x1982, 0x2004, - 0x70e2, 0x080c, 0x3c51, 0x1188, 0x2001, 0x181f, 0x2004, 0x2009, - 0x181e, 0x210c, 0x918c, 0x00ff, 0x706e, 0x716a, 0x7066, 0x918d, - 0x3200, 0x7162, 0x7073, 0xe109, 0x0080, 0x702c, 0x9085, 0x0002, - 0x702e, 0x2009, 0x1817, 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, - 0x4101, 0x00f6, 0x2071, 0x1a3a, 0x2079, 0x0320, 0x00d6, 0x2069, - 0x0000, 0x6884, 0xd0b4, 0x0120, 0x689c, 0x780e, 0x6898, 0x780a, - 0x00de, 0x2009, 0x03e8, 0x8109, 0x1df0, 0x792c, 0xd1fc, 0x0110, - 0x782b, 0x0004, 0x2011, 0x0011, 0x080c, 0x408d, 0x2011, 0x0001, - 0x080c, 0x408d, 0x00fe, 0x00ee, 0x0005, 0x00f6, 0x00e6, 0x2071, - 0x1a3a, 0x2079, 0x0320, 0x792c, 0xd1fc, 0x0904, 0x408a, 0x782b, - 0x0002, 0x9026, 0xd19c, 0x1904, 0x4086, 0x7000, 0x0002, 0x408a, - 0x403b, 0x406b, 0x4086, 0xd1bc, 0x1170, 0xd1dc, 0x1190, 0x8001, - 0x7002, 0x2011, 0x0001, 0x080c, 0x408d, 0x0904, 0x408a, 0x080c, - 0x408d, 0x0804, 0x408a, 0x00f6, 0x2079, 0x0300, 0x78bf, 0x0000, - 0x00fe, 0x7810, 0x7914, 0x782b, 0x0004, 0x7812, 0x7916, 0x2001, - 0x0201, 0x200c, 0x81ff, 0x0de8, 0x080c, 0x3f98, 0x2009, 0x0001, - 0x00f6, 0x2079, 0x0300, 0x78b8, 0x00fe, 0xd0ec, 0x0110, 0x2009, - 0x0011, 0x792a, 0x00f8, 0x8001, 0x7002, 0x9184, 0x0880, 0x1140, - 0x782c, 0xd0fc, 0x1904, 0x402f, 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, 0x0dfa, - 0x9398, 0x40bb, 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, 0x40f8, 0x40ef, 0x40e6, 0x40dd, 0x40d4, - 0x40cb, 0x40c2, 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, 0x1a3d, 0x2079, 0x0090, - 0x792c, 0xd1fc, 0x01e8, 0x782b, 0x0002, 0x2940, 0x9026, 0x7000, - 0x0002, 0x4128, 0x4114, 0x411f, 0x8001, 0x7002, 0xd19c, 0x1180, - 0x2011, 0x0001, 0x080c, 0x408d, 0x190c, 0x408d, 0x0048, 0x8001, - 0x7002, 0x782c, 0xd0fc, 0x1d38, 0x2011, 0x0001, 0x080c, 0x408d, - 0x008e, 0x00ee, 0x00fe, 0x0005, 0x00f6, 0x00e6, 0x00c6, 0x0086, - 0x2061, 0x0200, 0x2001, 0x1982, 0x2004, 0x601a, 0x2061, 0x0100, - 0x2001, 0x1981, 0x2004, 0x60ce, 0x6104, 0xc1ac, 0x6106, 0x2001, - 0x002c, 0x2004, 0x9005, 0x0520, 0x2038, 0x2001, 0x002e, 0x2024, - 0x2001, 0x002f, 0x201c, 0x080c, 0x4abf, 0xa813, 0x0019, 0xaf16, - 0x2900, 0xa85a, 0x978a, 0x0007, 0x0220, 0x2138, 0x2009, 0x0007, - 0x0010, 0x2708, 0x903e, 0x0096, 0xa858, 0x2048, 0xa85c, 0x9080, - 0x0019, 0x009e, 0x080c, 0x41a4, 0x1d68, 0x2900, 0xa85a, 0x00d0, - 0x080c, 0x4abf, 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, 0x1981, - 0x2004, 0x6036, 0x2009, 0x0040, 0x080c, 0x230a, 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, 0x4abf, 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, 0x4abf, 0x2940, 0xa813, 0x0019, 0xaf16, 0x2900, - 0xa85a, 0x978a, 0x0007, 0x0220, 0x2138, 0x2009, 0x0007, 0x0010, - 0x2708, 0x903e, 0x0096, 0xa858, 0x2048, 0xa85c, 0x9080, 0x0019, - 0x009e, 0x080c, 0x41a4, 0x1d68, 0x2900, 0xa85a, 0x00d8, 0x080c, - 0x4abf, 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, 0x1a3a, 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, 0x001b, 0x20a1, 0x1840, - 0x20e9, 0x0001, 0x9006, 0x4004, 0x2009, 0x013c, 0x200a, 0x012e, - 0x7880, 0x9086, 0x0052, 0x0108, 0x0005, 0x0804, 0x34e8, 0x7d98, - 0x7c9c, 0x0804, 0x35ea, 0x080c, 0x7207, 0x190c, 0x5ef0, 0x2069, - 0x185b, 0x2d00, 0x2009, 0x0030, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, - 0x2039, 0x0001, 0x080c, 0x4b08, 0x701f, 0x4277, 0x0005, 0x080c, - 0x55ea, 0x1130, 0x3b00, 0x3a08, 0xc194, 0xc095, 0x20d8, 0x21d0, - 0x2069, 0x185b, 0x6800, 0x9005, 0x0904, 0x351d, 0x6804, 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, 0x351d, 0x9288, 0x32e9, 0x210d, 0x918c, - 0x00ff, 0x6162, 0xd0dc, 0x0130, 0x6828, 0x908a, 0x007f, 0x1a04, - 0x351d, 0x605a, 0x6888, 0x9084, 0x0030, 0x8004, 0x8004, 0x8004, - 0x8004, 0x0006, 0x2009, 0x1989, 0x9080, 0x28aa, 0x2005, 0x200a, - 0x000e, 0x2009, 0x198a, 0x9080, 0x28ae, 0x2005, 0x200a, 0x6808, - 0x908a, 0x0100, 0x0a04, 0x351d, 0x908a, 0x0841, 0x1a04, 0x351d, - 0x9084, 0x0007, 0x1904, 0x351d, 0x680c, 0x9005, 0x0904, 0x351d, - 0x6810, 0x9005, 0x0904, 0x351d, 0x6848, 0x6940, 0x910a, 0x1a04, - 0x351d, 0x8001, 0x0904, 0x351d, 0x684c, 0x6944, 0x910a, 0x1a04, - 0x351d, 0x8001, 0x0904, 0x351d, 0x2009, 0x1959, 0x200b, 0x0000, - 0x2001, 0x187d, 0x2004, 0xd0c4, 0x0140, 0x7884, 0x200a, 0x2009, - 0x017f, 0x200a, 0x3b00, 0xc085, 0x20d8, 0x6814, 0x908c, 0x00ff, - 0x614a, 0x8007, 0x9084, 0x00ff, 0x604e, 0x080c, 0x7535, 0x080c, - 0x688c, 0x080c, 0x68c1, 0x6808, 0x602a, 0x080c, 0x227c, 0x2009, - 0x0170, 0x200b, 0x0080, 0xa001, 0xa001, 0x200b, 0x0000, 0x0036, - 0x6b08, 0x080c, 0x2811, 0x003e, 0x6000, 0x9086, 0x0000, 0x1904, - 0x43f8, 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, 0x198b, 0x20e9, - 0x0001, 0x4001, 0x20a9, 0x0004, 0x20a1, 0x19a5, 0x20e9, 0x0001, - 0x4001, 0x080c, 0x83e3, 0x00c6, 0x900e, 0x20a9, 0x0001, 0x6b70, - 0xd384, 0x01c8, 0x0020, 0x839d, 0x12b0, 0x3508, 0x8109, 0x080c, - 0x7af8, 0x6878, 0x6016, 0x6874, 0x2008, 0x9084, 0xff00, 0x8007, - 0x600a, 0x9184, 0x00ff, 0x6006, 0x8108, 0x1118, 0x6003, 0x0003, - 0x0010, 0x6003, 0x0001, 0x1f04, 0x4363, 0x00ce, 0x00c6, 0x2061, - 0x1974, 0x2063, 0x0001, 0x9006, 0x080c, 0x2ab8, 0x9006, 0x080c, - 0x2a9b, 0x0000, 0x00ce, 0x00e6, 0x2c70, 0x080c, 0x0ec6, 0x00ee, - 0x6888, 0xd0ec, 0x0198, 0x2001, 0x0100, 0x2004, 0x9086, 0x000a, - 0x0138, 0x2011, 0x0114, 0x2204, 0x9085, 0x0100, 0x2012, 0x0030, - 0x2011, 0x0114, 0x2204, 0x9085, 0x0180, 0x2012, 0x6a80, 0x9284, - 0x0030, 0x9086, 0x0030, 0x1128, 0x9294, 0xffcf, 0x9295, 0x0020, - 0x6a82, 0x2001, 0x1954, 0x6a80, 0x9294, 0x0030, 0x928e, 0x0000, - 0x0170, 0x928e, 0x0010, 0x0118, 0x928e, 0x0020, 0x0140, 0x2003, - 0xaaaa, 0x080c, 0x2886, 0x2001, 0x1945, 0x2102, 0x0008, 0x2102, - 0x00c6, 0x2061, 0x0100, 0x602f, 0x0040, 0x602f, 0x0000, 0x00ce, - 0x080c, 0x7207, 0x0128, 0x080c, 0x4ed2, 0x0110, 0x080c, 0x27d7, - 0x60d0, 0x9005, 0x01c0, 0x6003, 0x0001, 0x2009, 0x43e0, 0x00d0, - 0x080c, 0x7207, 0x1168, 0x2011, 0x7076, 0x080c, 0x82da, 0x2011, - 0x7069, 0x080c, 0x83ae, 0x080c, 0x7509, 0x080c, 0x7127, 0x0040, - 0x080c, 0x5dea, 0x0028, 0x6003, 0x0004, 0x2009, 0x43f8, 0x0010, - 0x0804, 0x34e8, 0x2001, 0x0170, 0x2004, 0x9084, 0x00ff, 0x9086, - 0x004c, 0x1118, 0x2091, 0x30bd, 0x0817, 0x2091, 0x303d, 0x0817, - 0x6000, 0x9086, 0x0000, 0x0904, 0x351a, 0x2069, 0x185b, 0x7890, - 0x6842, 0x7894, 0x6846, 0x2d00, 0x2009, 0x0030, 0x7a8c, 0x7b88, - 0x7c9c, 0x7d98, 0x2039, 0x0001, 0x0804, 0x4b0b, 0x9006, 0x080c, - 0x27d7, 0x81ff, 0x1904, 0x351a, 0x080c, 0x7207, 0x11b0, 0x080c, - 0x7504, 0x080c, 0x5f2b, 0x080c, 0x32e4, 0x0118, 0x6130, 0xc18d, - 0x6132, 0x080c, 0xc539, 0x0130, 0x080c, 0x722a, 0x1118, 0x080c, - 0x71df, 0x0038, 0x080c, 0x7127, 0x0020, 0x080c, 0x5ef0, 0x080c, - 0x5dea, 0x0804, 0x34e8, 0x81ff, 0x1904, 0x351a, 0x080c, 0x7207, - 0x1110, 0x0804, 0x351a, 0x6190, 0x81ff, 0x01a8, 0x704f, 0x0000, - 0x2001, 0x1c80, 0x2009, 0x0040, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, - 0x0126, 0x2091, 0x8000, 0x2039, 0x0001, 0x080c, 0x4b0b, 0x701f, - 0x34e6, 0x012e, 0x0005, 0x704f, 0x0001, 0x00d6, 0x2069, 0x1c80, - 0x20a9, 0x0040, 0x20e9, 0x0001, 0x20a1, 0x1c80, 0x2019, 0xffff, - 0x4304, 0x6558, 0x9588, 0x32e9, 0x210d, 0x918c, 0x00ff, 0x216a, - 0x900e, 0x2011, 0x0002, 0x2100, 0x9506, 0x01a8, 0x080c, 0x649f, - 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, 0x5e7b, 0x0804, 0x4450, - 0x080c, 0x4af2, 0x0904, 0x351d, 0x080c, 0x4abf, 0x1120, 0x2009, - 0x0002, 0x0804, 0x351a, 0x080c, 0x55db, 0xd0b4, 0x0558, 0x7884, - 0x908e, 0x007e, 0x0538, 0x908e, 0x007f, 0x0520, 0x908e, 0x0080, - 0x0508, 0x080c, 0x32df, 0x1148, 0xb800, 0xd08c, 0x11d8, 0xb804, - 0x9084, 0x00ff, 0x9086, 0x0006, 0x11a8, 0xa867, 0x0000, 0xa868, - 0xc0fd, 0xa86a, 0x080c, 0xc002, 0x1120, 0x2009, 0x0003, 0x0804, - 0x351a, 0x7007, 0x0003, 0x701f, 0x44de, 0x0005, 0x080c, 0x4af2, - 0x0904, 0x351d, 0x20a9, 0x002b, 0xb8b4, 0x20e0, 0xb8b8, 0x2098, - 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0002, 0x20a0, 0x4003, 0x20a9, - 0x0008, 0x9080, 0x0006, 0x20a0, 0xb8b4, 0x20e0, 0xb8b8, 0x9080, - 0x0006, 0x2098, 0x080c, 0x0fae, 0x0070, 0x20a9, 0x0004, 0xa85c, - 0x9080, 0x000a, 0x20a0, 0xb8b4, 0x20e0, 0xb8b8, 0x9080, 0x000a, - 0x2098, 0x080c, 0x0fae, 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, - 0x9084, 0xffc0, 0x9080, 0x0002, 0x2009, 0x002b, 0x7a8c, 0x7b88, - 0x7c9c, 0x7d98, 0x0804, 0x4b0b, 0x81ff, 0x1904, 0x351a, 0x080c, - 0x4ad6, 0x0904, 0x351d, 0x080c, 0x6611, 0x0904, 0x351a, 0x0058, - 0xa878, 0x9005, 0x0120, 0x2009, 0x0004, 0x0804, 0x351a, 0xa974, - 0xaa94, 0x0804, 0x34e8, 0x080c, 0x55e3, 0x0904, 0x34e8, 0x701f, - 0x4528, 0x7007, 0x0003, 0x0005, 0x81ff, 0x1904, 0x351a, 0x7888, - 0x908a, 0x1000, 0x1a04, 0x351d, 0x080c, 0x4af2, 0x0904, 0x351d, - 0x080c, 0x67c3, 0x0120, 0x080c, 0x67cb, 0x1904, 0x351d, 0x080c, - 0x6696, 0x0904, 0x351a, 0x2019, 0x0004, 0x900e, 0x080c, 0x6623, - 0x0904, 0x351a, 0x7984, 0x7a88, 0x04c9, 0x08a8, 0xa89c, 0x908a, - 0x1000, 0x12f8, 0x080c, 0x4af0, 0x01e0, 0x080c, 0x67c3, 0x0118, - 0x080c, 0x67cb, 0x11b0, 0x080c, 0x6696, 0x2009, 0x0002, 0x0168, - 0x2009, 0x0002, 0x2019, 0x0004, 0x080c, 0x6623, 0x2009, 0x0003, - 0x0120, 0xa998, 0xaa9c, 0x00d1, 0x0060, 0xa897, 0x4005, 0xa99a, - 0x0010, 0xa897, 0x4006, 0x900e, 0x9085, 0x0001, 0x2001, 0x0030, - 0x0005, 0xa897, 0x4000, 0x080c, 0x55e3, 0x0110, 0x9006, 0x0018, - 0x900e, 0x9085, 0x0001, 0x2001, 0x0000, 0x0005, 0x9186, 0x00ff, - 0x0110, 0x0071, 0x0060, 0x2029, 0x007e, 0x2061, 0x1800, 0x6458, - 0x2400, 0x9506, 0x0110, 0x2508, 0x0019, 0x8529, 0x1ec8, 0x0005, - 0x080c, 0x649f, 0x1138, 0x2200, 0x8003, 0x800b, 0x810b, 0x9108, - 0x080c, 0x82e8, 0x0005, 0x81ff, 0x1904, 0x351a, 0x798c, 0x2001, - 0x1958, 0x918c, 0x8000, 0x2102, 0x080c, 0x4ad6, 0x0904, 0x351d, - 0x080c, 0x67c3, 0x0120, 0x080c, 0x67cb, 0x1904, 0x351d, 0x080c, - 0x6566, 0x0904, 0x351a, 0x080c, 0x661a, 0x0904, 0x351a, 0x2001, - 0x1958, 0x2004, 0xd0fc, 0x1904, 0x34e8, 0x0804, 0x4533, 0xa9a0, - 0x2001, 0x1958, 0x918c, 0x8000, 0xc18d, 0x2102, 0x080c, 0x4ae3, - 0x01a0, 0x080c, 0x67c3, 0x0118, 0x080c, 0x67cb, 0x1170, 0x080c, - 0x6566, 0x2009, 0x0002, 0x0128, 0x080c, 0x661a, 0x1170, 0x2009, - 0x0003, 0xa897, 0x4005, 0xa99a, 0x0010, 0xa897, 0x4006, 0x900e, - 0x9085, 0x0001, 0x2001, 0x0030, 0x0005, 0xa897, 0x4000, 0x2001, - 0x1958, 0x2004, 0xd0fc, 0x1128, 0x080c, 0x55e3, 0x0110, 0x9006, - 0x0018, 0x900e, 0x9085, 0x0001, 0x2001, 0x0000, 0x0005, 0x81ff, - 0x1904, 0x351a, 0x798c, 0x2001, 0x1957, 0x918c, 0x8000, 0x2102, - 0x080c, 0x4ad6, 0x0904, 0x351d, 0x080c, 0x67c3, 0x0120, 0x080c, - 0x67cb, 0x1904, 0x351d, 0x080c, 0x6566, 0x0904, 0x351a, 0x080c, - 0x6608, 0x0904, 0x351a, 0x2001, 0x1957, 0x2004, 0xd0fc, 0x1904, - 0x34e8, 0x0804, 0x4533, 0xa9a0, 0x2001, 0x1957, 0x918c, 0x8000, - 0xc18d, 0x2102, 0x080c, 0x4ae3, 0x01a0, 0x080c, 0x67c3, 0x0118, - 0x080c, 0x67cb, 0x1170, 0x080c, 0x6566, 0x2009, 0x0002, 0x0128, - 0x080c, 0x6608, 0x1170, 0x2009, 0x0003, 0xa897, 0x4005, 0xa99a, - 0x0010, 0xa897, 0x4006, 0x900e, 0x9085, 0x0001, 0x2001, 0x0030, - 0x0005, 0xa897, 0x4000, 0x2001, 0x1957, 0x2004, 0xd0fc, 0x1128, - 0x080c, 0x55e3, 0x0110, 0x9006, 0x0018, 0x900e, 0x9085, 0x0001, - 0x2001, 0x0000, 0x0005, 0x6100, 0x0804, 0x34e8, 0x080c, 0x4af2, - 0x0904, 0x351d, 0x080c, 0x55ef, 0x1904, 0x351a, 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, 0x34e8, 0x78a8, 0x909c, 0x0003, 0xd0ac, 0x1158, - 0xd0b4, 0x1148, 0x939a, 0x0003, 0x1a04, 0x351a, 0x6258, 0x7884, - 0x9206, 0x1904, 0x46eb, 0x2031, 0x1848, 0x2009, 0x013c, 0x2136, - 0x2001, 0x1840, 0x2009, 0x000c, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, - 0x2039, 0x0001, 0x0006, 0x78a8, 0x9084, 0x0080, 0x11f8, 0x0006, - 0x0036, 0x2001, 0x1a57, 0x201c, 0x7b9a, 0x2003, 0x0000, 0x2001, - 0x1a58, 0x201c, 0x7b9e, 0x2003, 0x0000, 0x2001, 0x1a59, 0x201c, - 0x7ba2, 0x2003, 0x0000, 0x2001, 0x1a53, 0x201c, 0x7baa, 0x2003, - 0x0000, 0x003e, 0x000e, 0x000e, 0x0804, 0x4b0b, 0x000e, 0x2031, - 0x0000, 0x2061, 0x18b6, 0x2c44, 0xa66a, 0xa17a, 0xa772, 0xa076, - 0xa28e, 0xa392, 0xa496, 0xa59a, 0x080c, 0x112e, 0x7007, 0x0002, - 0x701f, 0x470b, 0x0005, 0x81ff, 0x1904, 0x351a, 0x080c, 0x4af2, - 0x0904, 0x351d, 0x080c, 0x67c3, 0x1904, 0x351a, 0x00c6, 0x080c, - 0x4abf, 0x00ce, 0x0904, 0x351a, 0xa867, 0x0000, 0xa868, 0xc0fd, - 0xa86a, 0x7ea8, 0x080c, 0xbfa8, 0x0904, 0x351a, 0x7007, 0x0003, - 0x701f, 0x472b, 0x0005, 0x080c, 0x4249, 0x0006, 0x0036, 0x2001, - 0x1a57, 0x201c, 0x7b9a, 0x2003, 0x0000, 0x2001, 0x1a58, 0x201c, - 0x7b9e, 0x2003, 0x0000, 0x2001, 0x1a59, 0x201c, 0x7ba2, 0x2003, - 0x0000, 0x2001, 0x1a53, 0x201c, 0x7baa, 0x2003, 0x0000, 0x003e, - 0x000e, 0x0804, 0x34e8, 0xa830, 0x9086, 0x0100, 0x0904, 0x351a, - 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, - 0x001b, 0x2009, 0x000c, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x0804, - 0x4b0b, 0x9006, 0x080c, 0x27d7, 0x78a8, 0x9084, 0x00ff, 0x9086, - 0x00ff, 0x0118, 0x81ff, 0x1904, 0x351a, 0x080c, 0x7207, 0x0110, - 0x080c, 0x5ef0, 0x7888, 0x908a, 0x1000, 0x1a04, 0x351d, 0x7984, - 0x9186, 0x00ff, 0x0138, 0x9182, 0x007f, 0x1a04, 0x351d, 0x2100, - 0x080c, 0x27a1, 0x0026, 0x00c6, 0x0126, 0x2091, 0x8000, 0x2061, - 0x19d2, 0x601b, 0x0000, 0x601f, 0x0000, 0x6073, 0x0000, 0x6077, - 0x0000, 0x080c, 0x7207, 0x1158, 0x080c, 0x7504, 0x080c, 0x5f2b, - 0x9085, 0x0001, 0x080c, 0x724e, 0x080c, 0x7127, 0x00d0, 0x080c, - 0xa069, 0x2061, 0x0100, 0x2001, 0x1817, 0x2004, 0x9084, 0x00ff, - 0x810f, 0x9105, 0x604a, 0x6043, 0x0090, 0x6043, 0x0010, 0x2009, - 0x1971, 0x200b, 0x0000, 0x2009, 0x002d, 0x2011, 0x5e16, 0x080c, - 0x836c, 0x7984, 0x080c, 0x7207, 0x1110, 0x2009, 0x00ff, 0x7a88, - 0x080c, 0x4596, 0x012e, 0x00ce, 0x002e, 0x0804, 0x34e8, 0x7984, - 0x080c, 0x643f, 0x2b08, 0x1904, 0x351d, 0x0804, 0x34e8, 0x81ff, - 0x0120, 0x2009, 0x0001, 0x0804, 0x351a, 0x60d8, 0xd0ac, 0x1130, - 0xd09c, 0x1120, 0x2009, 0x0005, 0x0804, 0x351a, 0x080c, 0x4abf, - 0x1120, 0x2009, 0x0002, 0x0804, 0x351a, 0x7984, 0x9192, 0x0021, - 0x1a04, 0x351d, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0xa85c, 0x9080, - 0x0019, 0x702a, 0xaf60, 0x7736, 0x080c, 0x4b08, 0x701f, 0x47df, - 0x7880, 0x9086, 0x006e, 0x0110, 0x701f, 0x5084, 0x0005, 0x2009, - 0x0080, 0x080c, 0x649f, 0x1118, 0x080c, 0x67c3, 0x0120, 0x2021, - 0x400a, 0x0804, 0x34ea, 0x00d6, 0x0096, 0xa964, 0xaa6c, 0xab70, - 0xac74, 0xad78, 0xae7c, 0xa884, 0x90be, 0x0100, 0x0904, 0x4878, - 0x90be, 0x0112, 0x0904, 0x4878, 0x90be, 0x0113, 0x0904, 0x4878, - 0x90be, 0x0114, 0x0904, 0x4878, 0x90be, 0x0117, 0x0904, 0x4878, - 0x90be, 0x011a, 0x0904, 0x4878, 0x90be, 0x011c, 0x0904, 0x4878, - 0x90be, 0x0121, 0x0904, 0x485f, 0x90be, 0x0131, 0x0904, 0x485f, - 0x90be, 0x0171, 0x0904, 0x4878, 0x90be, 0x0173, 0x0904, 0x4878, - 0x90be, 0x01a1, 0x1128, 0xa894, 0x8007, 0xa896, 0x0804, 0x4883, - 0x90be, 0x0212, 0x0904, 0x486c, 0x90be, 0x0213, 0x05e8, 0x90be, + 0x2091, 0x8000, 0x81ff, 0x0148, 0x080c, 0x2a8f, 0x1130, 0x9006, + 0x080c, 0x29a3, 0x9006, 0x080c, 0x2986, 0x2001, 0x1979, 0x2003, + 0x0000, 0x7884, 0x9084, 0x0007, 0x0002, 0x3c00, 0x3c0f, 0x3c1e, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x012e, 0x0804, 0x3427, + 0x2001, 0x0100, 0x2004, 0x9086, 0x000a, 0x0db8, 0x2009, 0x0114, + 0x2104, 0x9085, 0x0800, 0x200a, 0x080c, 0x3dec, 0x00f0, 0x2001, + 0x0100, 0x2004, 0x9086, 0x000a, 0x0d40, 0x2009, 0x0114, 0x2104, + 0x9085, 0x4000, 0x200a, 0x080c, 0x3dec, 0x0078, 0x080c, 0x717e, + 0x1128, 0x012e, 0x2009, 0x0016, 0x0804, 0x3424, 0x81ff, 0x0128, + 0x012e, 0x2021, 0x400b, 0x0804, 0x33f4, 0x2001, 0x0141, 0x2004, + 0xd0dc, 0x0db0, 0x0086, 0x0096, 0x00a6, 0x00b6, 0x00c6, 0x00d6, + 0x00e6, 0x00f6, 0x080c, 0x3927, 0x2009, 0x0101, 0x210c, 0x0016, + 0x7ec8, 0x7dcc, 0x9006, 0x2068, 0x2060, 0x2058, 0x080c, 0x4100, + 0x080c, 0x4050, 0x903e, 0x2720, 0x00f6, 0x00e6, 0x0086, 0x2940, + 0x2071, 0x1a42, 0x2079, 0x0090, 0x00d6, 0x2069, 0x0000, 0x6884, + 0xd0b4, 0x0120, 0x68d4, 0x780e, 0x68d0, 0x780a, 0x00de, 0x2011, + 0x0001, 0x080c, 0x3fb1, 0x080c, 0x2a97, 0x080c, 0x2a97, 0x080c, + 0x2a97, 0x080c, 0x2a97, 0x080c, 0x3fb1, 0x008e, 0x00ee, 0x00fe, + 0x080c, 0x3ed3, 0x2009, 0x9c40, 0x8109, 0x11b0, 0x080c, 0x3da2, + 0x2001, 0x0004, 0x200c, 0x918c, 0xfffd, 0x2102, 0x001e, 0x00fe, + 0x00ee, 0x00de, 0x00ce, 0x00be, 0x00ae, 0x009e, 0x008e, 0x2009, + 0x0017, 0x080c, 0x3424, 0x0cf8, 0x2001, 0x020b, 0x2004, 0x9084, + 0x0140, 0x1d10, 0x00f6, 0x2079, 0x0000, 0x7884, 0x00fe, 0xd0bc, + 0x0178, 0x2001, 0x0201, 0x200c, 0x81ff, 0x0150, 0x080c, 0x3eb1, + 0x2d00, 0x9c05, 0x9b05, 0x0120, 0x080c, 0x3da2, 0x0804, 0x3d42, + 0x080c, 0x4025, 0x080c, 0x3f49, 0x080c, 0x3e94, 0x080c, 0x3ec9, + 0x00f6, 0x2079, 0x0100, 0x7824, 0xd0ac, 0x0130, 0x8b58, 0x080c, + 0x3da2, 0x00fe, 0x0804, 0x3d42, 0x00fe, 0x080c, 0x3d98, 0x1150, + 0x8d68, 0x2001, 0x0032, 0x2602, 0x2001, 0x0033, 0x2502, 0x080c, + 0x3da2, 0x0080, 0x87ff, 0x0138, 0x2001, 0x0201, 0x2004, 0x9005, + 0x1908, 0x8739, 0x0038, 0x2001, 0x1a3f, 0x2004, 0x9086, 0x0000, + 0x1904, 0x3c92, 0x2001, 0x032f, 0x2003, 0x00f6, 0x8631, 0x1208, + 0x8529, 0x2500, 0x9605, 0x0904, 0x3d42, 0x7884, 0xd0bc, 0x0128, + 0x2d00, 0x9c05, 0x9b05, 0x1904, 0x3d42, 0xa013, 0x0019, 0x2001, + 0x032a, 0x2003, 0x0004, 0x7884, 0xd0ac, 0x1148, 0x2001, 0x1a3f, + 0x2003, 0x0003, 0x2001, 0x032a, 0x2003, 0x0009, 0x0030, 0xa017, + 0x0001, 0x78b4, 0x9005, 0x0108, 0xa016, 0x2800, 0xa05a, 0x2009, + 0x0040, 0x080c, 0x2200, 0x2900, 0xa85a, 0xa813, 0x0019, 0x7884, + 0xd0a4, 0x1180, 0xa817, 0x0000, 0x00c6, 0x20a9, 0x0004, 0x2061, + 0x0090, 0x602b, 0x0008, 0x2001, 0x0203, 0x2004, 0x1f04, 0x3d19, + 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, 0x3c4c, 0x001e, 0x00c6, 0x2001, 0x032a, 0x2003, 0x0004, + 0x2061, 0x0100, 0x6027, 0x0002, 0x6106, 0x2011, 0x020d, 0x2013, + 0x0020, 0x2001, 0x0004, 0x200c, 0x918c, 0xfffd, 0x2102, 0x080c, + 0x12fe, 0x7884, 0x9084, 0x0003, 0x9086, 0x0002, 0x0508, 0x2009, + 0x0028, 0x080c, 0x2200, 0x2001, 0x0227, 0x200c, 0x2102, 0x6050, + 0x0006, 0x2001, 0x0100, 0x2004, 0x9086, 0x000a, 0x000e, 0x0118, + 0x9084, 0xb7ef, 0x0020, 0x9084, 0xb7ff, 0x080c, 0x2bdc, 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, 0x33f2, 0x012e, 0x2021, 0x400c, 0x0804, 0x33f4, + 0x9085, 0x0001, 0x1d04, 0x3da1, 0x2091, 0x6000, 0x8420, 0x9486, + 0x0064, 0x0005, 0x2001, 0x0105, 0x2003, 0x0010, 0x2001, 0x032a, + 0x2003, 0x0004, 0x2001, 0x1a3f, 0x2003, 0x0000, 0x0071, 0x2009, + 0x0048, 0x080c, 0x2200, 0x2001, 0x0227, 0x2024, 0x2402, 0x2001, + 0x0109, 0x2003, 0x4000, 0x9026, 0x0005, 0x00f6, 0x00e6, 0x2071, + 0x1a42, 0x7000, 0x9086, 0x0000, 0x0520, 0x2079, 0x0090, 0x2009, + 0x0206, 0x2104, 0x2009, 0x0203, 0x210c, 0x9106, 0x1120, 0x2009, + 0x0040, 0x080c, 0x2200, 0x782c, 0xd0fc, 0x0d88, 0x080c, 0x4025, + 0x7000, 0x9086, 0x0000, 0x1d58, 0x782b, 0x0004, 0x782c, 0xd0ac, + 0x1de8, 0x2009, 0x0040, 0x080c, 0x2200, 0x782b, 0x0002, 0x7003, + 0x0000, 0x00ee, 0x00fe, 0x0005, 0x2001, 0x0100, 0x2004, 0x9086, + 0x000a, 0x15d0, 0x00f6, 0x2079, 0x0100, 0x2001, 0x1817, 0x200c, + 0x7932, 0x7936, 0x080c, 0x26b6, 0x080c, 0x2ba9, 0x080c, 0x2bdc, + 0x784b, 0xf7f7, 0x7843, 0x0090, 0x7843, 0x0010, 0x7850, 0xc0e5, + 0x7852, 0x2019, 0x61a8, 0x7820, 0xd09c, 0x0110, 0x8319, 0x1dd8, + 0x7850, 0xc0e4, 0x7852, 0x7827, 0x0048, 0x7843, 0x0040, 0x2019, + 0x01f4, 0xa001, 0xa001, 0x8319, 0x1de0, 0x2001, 0x0100, 0x080c, + 0x2b6f, 0x7827, 0x0020, 0x7843, 0x0000, 0x9006, 0x080c, 0x2b6f, + 0x7827, 0x0048, 0x00fe, 0x0005, 0x00f6, 0x2079, 0x0100, 0x2001, + 0x1817, 0x200c, 0x7932, 0x7936, 0x080c, 0x26b6, 0x7850, 0x9084, + 0xfbff, 0x9085, 0x0030, 0x7852, 0x2019, 0x01f4, 0x8319, 0x1df0, + 0x9084, 0xffcf, 0x9085, 0x2000, 0x7852, 0x20a9, 0x0046, 0x1d04, + 0x3e47, 0x2091, 0x6000, 0x1f04, 0x3e47, 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, 0x3e67, 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, + 0x2b6f, 0x7827, 0x0020, 0x7843, 0x0000, 0x9006, 0x080c, 0x2b6f, + 0x7827, 0x0048, 0x00fe, 0x0005, 0x7884, 0xd0ac, 0x11c8, 0x00f6, + 0x00e6, 0x2071, 0x1a3f, 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, 0x1985, + 0x2004, 0x70e2, 0x080c, 0x3b61, 0x1188, 0x2001, 0x181f, 0x2004, + 0x2009, 0x181e, 0x210c, 0x918c, 0x00ff, 0x706e, 0x716a, 0x7066, + 0x918d, 0x3200, 0x7162, 0x7073, 0xe109, 0x0080, 0x702c, 0x9085, + 0x0002, 0x702e, 0x2009, 0x1817, 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, 0x4025, 0x00f6, 0x2071, 0x1a3f, 0x2079, 0x0320, 0x00d6, + 0x2069, 0x0000, 0x6884, 0xd0b4, 0x0120, 0x689c, 0x780e, 0x6898, + 0x780a, 0x00de, 0x080c, 0x3b61, 0x0140, 0x2001, 0x1979, 0x200c, + 0x2003, 0x0001, 0x918e, 0x0001, 0x0120, 0x2009, 0x03e8, 0x8109, + 0x1df0, 0x792c, 0xd1fc, 0x0110, 0x782b, 0x0004, 0x2011, 0x0011, + 0x080c, 0x3fb1, 0x2011, 0x0001, 0x080c, 0x3fb1, 0x00fe, 0x00ee, + 0x0005, 0x00f6, 0x00e6, 0x2071, 0x1a3f, 0x2079, 0x0320, 0x792c, + 0xd1fc, 0x0904, 0x3fae, 0x782b, 0x0002, 0x9026, 0xd19c, 0x1904, + 0x3faa, 0x7000, 0x0002, 0x3fae, 0x3f5f, 0x3f8f, 0x3faa, 0xd1bc, + 0x1170, 0xd1dc, 0x1190, 0x8001, 0x7002, 0x2011, 0x0001, 0x080c, + 0x3fb1, 0x0904, 0x3fae, 0x080c, 0x3fb1, 0x0804, 0x3fae, 0x00f6, + 0x2079, 0x0300, 0x78bf, 0x0000, 0x00fe, 0x7810, 0x7914, 0x782b, + 0x0004, 0x7812, 0x7916, 0x2001, 0x0201, 0x200c, 0x81ff, 0x0de8, + 0x080c, 0x3eb1, 0x2009, 0x0001, 0x00f6, 0x2079, 0x0300, 0x78b8, + 0x00fe, 0xd0ec, 0x0110, 0x2009, 0x0011, 0x792a, 0x00f8, 0x8001, + 0x7002, 0x9184, 0x0880, 0x1140, 0x782c, 0xd0fc, 0x1904, 0x3f53, + 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, 0x0df6, 0x9398, 0x3fdf, 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, 0x401c, + 0x4013, 0x400a, 0x4001, 0x3ff8, 0x3fef, 0x3fe6, 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, 0x1a42, 0x2079, 0x0090, 0x792c, 0xd1fc, 0x01e8, 0x782b, + 0x0002, 0x2940, 0x9026, 0x7000, 0x0002, 0x404c, 0x4038, 0x4043, + 0x8001, 0x7002, 0xd19c, 0x1180, 0x2011, 0x0001, 0x080c, 0x3fb1, + 0x190c, 0x3fb1, 0x0048, 0x8001, 0x7002, 0x782c, 0xd0fc, 0x1d38, + 0x2011, 0x0001, 0x080c, 0x3fb1, 0x008e, 0x00ee, 0x00fe, 0x0005, + 0x00f6, 0x00e6, 0x00c6, 0x0086, 0x2061, 0x0200, 0x2001, 0x1985, + 0x2004, 0x601a, 0x2061, 0x0100, 0x2001, 0x1984, 0x2004, 0x60ce, + 0x6104, 0xc1ac, 0x6106, 0x2001, 0x002c, 0x2004, 0x9005, 0x0520, + 0x2038, 0x2001, 0x002e, 0x2024, 0x2001, 0x002f, 0x201c, 0x080c, + 0x49b7, 0xa813, 0x0019, 0xaf16, 0x2900, 0xa85a, 0x978a, 0x0007, + 0x0220, 0x2138, 0x2009, 0x0007, 0x0010, 0x2708, 0x903e, 0x0096, + 0xa858, 0x2048, 0xa85c, 0x9080, 0x0019, 0x009e, 0x080c, 0x40c8, + 0x1d68, 0x2900, 0xa85a, 0x00d0, 0x080c, 0x49b7, 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, 0x1984, 0x2004, 0x6036, 0x2009, 0x0040, + 0x080c, 0x2200, 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, 0x49b7, 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, 0x49b7, 0x2940, + 0xa813, 0x0019, 0xaf16, 0x2900, 0xa85a, 0x978a, 0x0007, 0x0220, + 0x2138, 0x2009, 0x0007, 0x0010, 0x2708, 0x903e, 0x0096, 0xa858, + 0x2048, 0xa85c, 0x9080, 0x0019, 0x009e, 0x080c, 0x40c8, 0x1d68, + 0x2900, 0xa85a, 0x00d8, 0x080c, 0x49b7, 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, 0x1a3f, 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, 0x001b, 0x20a1, 0x1840, 0x20e9, 0x0001, 0x9006, 0x4004, + 0x2009, 0x013c, 0x200a, 0x012e, 0x7880, 0x9086, 0x0052, 0x0108, + 0x0005, 0x0804, 0x33f2, 0x7d98, 0x7c9c, 0x0804, 0x34f6, 0x080c, + 0x717e, 0x190c, 0x5df4, 0x2069, 0x185b, 0x2d00, 0x2009, 0x0030, + 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x2039, 0x0001, 0x080c, 0x4a00, + 0x701f, 0x419b, 0x0005, 0x080c, 0x54ea, 0x1130, 0x3b00, 0x3a08, + 0xc194, 0xc095, 0x20d8, 0x21d0, 0x2069, 0x185b, 0x6800, 0x9005, + 0x0904, 0x3427, 0x6804, 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, 0x3427, + 0x9288, 0x31f3, 0x210d, 0x918c, 0x00ff, 0x6162, 0xd0dc, 0x0130, + 0x6828, 0x908a, 0x007f, 0x1a04, 0x3427, 0x605a, 0x6888, 0x9084, + 0x0030, 0x8004, 0x8004, 0x8004, 0x8004, 0x0006, 0x2009, 0x198c, + 0x9080, 0x27a9, 0x2005, 0x200a, 0x000e, 0x2009, 0x198d, 0x9080, + 0x27ad, 0x2005, 0x200a, 0x6808, 0x908a, 0x0100, 0x0a04, 0x3427, + 0x908a, 0x0841, 0x1a04, 0x3427, 0x9084, 0x0007, 0x1904, 0x3427, + 0x680c, 0x9005, 0x0904, 0x3427, 0x6810, 0x9005, 0x0904, 0x3427, + 0x6848, 0x6940, 0x910a, 0x1a04, 0x3427, 0x8001, 0x0904, 0x3427, + 0x684c, 0x6944, 0x910a, 0x1a04, 0x3427, 0x8001, 0x0904, 0x3427, + 0x2009, 0x195b, 0x200b, 0x0000, 0x2001, 0x187d, 0x2004, 0xd0c4, + 0x0140, 0x7884, 0x200a, 0x2008, 0x080c, 0x0e7b, 0x3b00, 0xc085, + 0x20d8, 0x6814, 0x908c, 0x00ff, 0x614a, 0x8007, 0x9084, 0x00ff, + 0x604e, 0x080c, 0x74ab, 0x080c, 0x6796, 0x080c, 0x67f9, 0x6808, + 0x602a, 0x080c, 0x2172, 0x2009, 0x0170, 0x200b, 0x0080, 0xa001, + 0xa001, 0x200b, 0x0000, 0x0036, 0x6b08, 0x080c, 0x2710, 0x003e, + 0x6000, 0x9086, 0x0000, 0x1904, 0x4326, 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, 0x198e, 0x20e9, 0x0001, 0x4001, 0x20a9, 0x0004, + 0x20a1, 0x19a8, 0x20e9, 0x0001, 0x4001, 0x080c, 0x8362, 0x00c6, + 0x900e, 0x20a9, 0x0001, 0x6b70, 0xd384, 0x01c8, 0x0020, 0x839d, + 0x12b0, 0x3508, 0x8109, 0x080c, 0x7a77, 0x6878, 0x6016, 0x6874, + 0x2008, 0x9084, 0xff00, 0x8007, 0x600a, 0x9184, 0x00ff, 0x6006, + 0x8108, 0x1118, 0x6003, 0x0003, 0x0010, 0x6003, 0x0001, 0x1f04, + 0x4287, 0x00ce, 0x00c6, 0x2061, 0x1976, 0x2063, 0x0001, 0x9006, + 0x080c, 0x29a3, 0x9006, 0x080c, 0x2986, 0x0000, 0x00ce, 0x00e6, + 0x2c70, 0x080c, 0x0ecc, 0x00ee, 0x2001, 0x0100, 0x2004, 0x9086, + 0x000a, 0x1120, 0x080c, 0x2ba9, 0x080c, 0x2bdc, 0x6888, 0xd0ec, + 0x0198, 0x2001, 0x0100, 0x2004, 0x9086, 0x000a, 0x0138, 0x2011, + 0x0114, 0x2204, 0x9085, 0x0100, 0x2012, 0x0030, 0x2011, 0x0114, + 0x2204, 0x9085, 0x0180, 0x2012, 0x6a80, 0x9284, 0x0030, 0x9086, + 0x0030, 0x1128, 0x9294, 0xffcf, 0x9295, 0x0020, 0x6a82, 0x2001, + 0x1956, 0x6a80, 0x9294, 0x0030, 0x928e, 0x0000, 0x0170, 0x928e, + 0x0010, 0x0118, 0x928e, 0x0020, 0x0140, 0x2003, 0xaaaa, 0x080c, + 0x2785, 0x2001, 0x1947, 0x2102, 0x0008, 0x2102, 0x00c6, 0x2061, + 0x0100, 0x602f, 0x0040, 0x602f, 0x0000, 0x00ce, 0x080c, 0x717e, + 0x0128, 0x080c, 0x4dd1, 0x0110, 0x080c, 0x26d6, 0x60d0, 0x9005, + 0x01c0, 0x6003, 0x0001, 0x2009, 0x430e, 0x00d0, 0x080c, 0x717e, + 0x1168, 0x2011, 0x6fed, 0x080c, 0x8259, 0x2011, 0x6fe0, 0x080c, + 0x832d, 0x080c, 0x747f, 0x080c, 0x709e, 0x0040, 0x080c, 0x5cee, + 0x0028, 0x6003, 0x0004, 0x2009, 0x4326, 0x0010, 0x0804, 0x33f2, + 0x2001, 0x0170, 0x2004, 0x9084, 0x00ff, 0x9086, 0x004c, 0x1118, + 0x2091, 0x30bd, 0x0817, 0x2091, 0x303d, 0x0817, 0x6000, 0x9086, + 0x0000, 0x0904, 0x3424, 0x2069, 0x185b, 0x7890, 0x6842, 0x7894, + 0x6846, 0x2d00, 0x2009, 0x0030, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, + 0x2039, 0x0001, 0x0804, 0x4a03, 0x9006, 0x080c, 0x26d6, 0x81ff, + 0x1904, 0x3424, 0x080c, 0x717e, 0x11b0, 0x080c, 0x747a, 0x080c, + 0x5e2f, 0x080c, 0x31ee, 0x0118, 0x6130, 0xc18d, 0x6132, 0x080c, + 0xc459, 0x0130, 0x080c, 0x71a1, 0x1118, 0x080c, 0x7156, 0x0038, + 0x080c, 0x709e, 0x0020, 0x080c, 0x5df4, 0x080c, 0x5cee, 0x0804, + 0x33f2, 0x81ff, 0x1904, 0x3424, 0x080c, 0x717e, 0x1110, 0x0804, + 0x3424, 0x0126, 0x2091, 0x8000, 0x6190, 0x81ff, 0x0190, 0x704f, + 0x0000, 0x2001, 0x1c80, 0x2009, 0x0040, 0x7a8c, 0x7b88, 0x7c9c, + 0x7d98, 0x2039, 0x0001, 0x080c, 0x4a03, 0x701f, 0x33f0, 0x012e, + 0x0005, 0x704f, 0x0001, 0x00d6, 0x2069, 0x1c80, 0x20a9, 0x0040, + 0x20e9, 0x0001, 0x20a1, 0x1c80, 0x2019, 0xffff, 0x4304, 0x6558, + 0x9588, 0x31f3, 0x210d, 0x918c, 0x00ff, 0x216a, 0x900e, 0x2011, + 0x0002, 0x2100, 0x9506, 0x01a8, 0x080c, 0x63a3, 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, 0x5d7f, 0x0804, 0x4381, 0x080c, 0x49ea, + 0x0904, 0x3427, 0x080c, 0x49b7, 0x1120, 0x2009, 0x0002, 0x0804, + 0x3424, 0x080c, 0x54db, 0xd0b4, 0x0558, 0x7884, 0x908e, 0x007e, + 0x0538, 0x908e, 0x007f, 0x0520, 0x908e, 0x0080, 0x0508, 0x080c, + 0x31e9, 0x1148, 0xb800, 0xd08c, 0x11d8, 0xb804, 0x9084, 0x00ff, + 0x9086, 0x0006, 0x11a8, 0xa867, 0x0000, 0xa868, 0xc0fd, 0xa86a, + 0x080c, 0xbf19, 0x1120, 0x2009, 0x0003, 0x0804, 0x3424, 0x7007, + 0x0003, 0x701f, 0x440c, 0x0005, 0x080c, 0x49ea, 0x0904, 0x3427, + 0x20a9, 0x002b, 0xb8b4, 0x20e0, 0xb8b8, 0x2098, 0xa860, 0x20e8, + 0xa85c, 0x9080, 0x0002, 0x20a0, 0x4003, 0x20a9, 0x0008, 0x9080, + 0x0006, 0x20a0, 0xb8b4, 0x20e0, 0xb8b8, 0x9080, 0x0006, 0x2098, + 0x080c, 0x0fb4, 0x0070, 0x20a9, 0x0004, 0xa85c, 0x9080, 0x000a, + 0x20a0, 0xb8b4, 0x20e0, 0xb8b8, 0x9080, 0x000a, 0x2098, 0x080c, + 0x0fb4, 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, + 0x9080, 0x0002, 0x2009, 0x002b, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, + 0x0804, 0x4a03, 0x81ff, 0x1904, 0x3424, 0x080c, 0x49ce, 0x0904, + 0x3427, 0x080c, 0x6515, 0x0904, 0x3424, 0x0058, 0xa878, 0x9005, + 0x0120, 0x2009, 0x0004, 0x0804, 0x3424, 0xa974, 0xaa94, 0x0804, + 0x33f2, 0x080c, 0x54e3, 0x0904, 0x33f2, 0x701f, 0x4456, 0x7007, + 0x0003, 0x0005, 0x81ff, 0x1904, 0x3424, 0x7888, 0x908a, 0x1000, + 0x1a04, 0x3427, 0x080c, 0x49ea, 0x0904, 0x3427, 0x080c, 0x66c9, + 0x0120, 0x080c, 0x66d1, 0x1904, 0x3427, 0x080c, 0x659a, 0x0904, + 0x3424, 0x2019, 0x0004, 0x900e, 0x080c, 0x6527, 0x0904, 0x3424, + 0x7984, 0x7a88, 0x04c9, 0x08a8, 0xa89c, 0x908a, 0x1000, 0x12f8, + 0x080c, 0x49e8, 0x01e0, 0x080c, 0x66c9, 0x0118, 0x080c, 0x66d1, + 0x11b0, 0x080c, 0x659a, 0x2009, 0x0002, 0x0168, 0x2009, 0x0002, + 0x2019, 0x0004, 0x080c, 0x6527, 0x2009, 0x0003, 0x0120, 0xa998, + 0xaa9c, 0x00d1, 0x0060, 0xa897, 0x4005, 0xa99a, 0x0010, 0xa897, + 0x4006, 0x900e, 0x9085, 0x0001, 0x2001, 0x0030, 0x0005, 0xa897, + 0x4000, 0x080c, 0x54e3, 0x0110, 0x9006, 0x0018, 0x900e, 0x9085, + 0x0001, 0x2001, 0x0000, 0x0005, 0x9186, 0x00ff, 0x0110, 0x0071, + 0x0060, 0x2029, 0x007e, 0x2061, 0x1800, 0x6458, 0x2400, 0x9506, + 0x0110, 0x2508, 0x0019, 0x8529, 0x1ec8, 0x0005, 0x080c, 0x63a3, + 0x1138, 0x2200, 0x8003, 0x800b, 0x810b, 0x9108, 0x080c, 0x8267, + 0x0005, 0x81ff, 0x1904, 0x3424, 0x798c, 0x2001, 0x195a, 0x918c, + 0x8000, 0x2102, 0x080c, 0x49ce, 0x0904, 0x3427, 0x080c, 0x66c9, + 0x0120, 0x080c, 0x66d1, 0x1904, 0x3427, 0x080c, 0x646a, 0x0904, + 0x3424, 0x080c, 0x651e, 0x0904, 0x3424, 0x2001, 0x195a, 0x2004, + 0xd0fc, 0x1904, 0x33f2, 0x0804, 0x4461, 0xa9a0, 0x2001, 0x195a, + 0x918c, 0x8000, 0xc18d, 0x2102, 0x080c, 0x49db, 0x01a0, 0x080c, + 0x66c9, 0x0118, 0x080c, 0x66d1, 0x1170, 0x080c, 0x646a, 0x2009, + 0x0002, 0x0128, 0x080c, 0x651e, 0x1170, 0x2009, 0x0003, 0xa897, + 0x4005, 0xa99a, 0x0010, 0xa897, 0x4006, 0x900e, 0x9085, 0x0001, + 0x2001, 0x0030, 0x0005, 0xa897, 0x4000, 0x2001, 0x195a, 0x2004, + 0xd0fc, 0x1128, 0x080c, 0x54e3, 0x0110, 0x9006, 0x0018, 0x900e, + 0x9085, 0x0001, 0x2001, 0x0000, 0x0005, 0x81ff, 0x1904, 0x3424, + 0x798c, 0x2001, 0x1959, 0x918c, 0x8000, 0x2102, 0x080c, 0x49ce, + 0x0904, 0x3427, 0x080c, 0x66c9, 0x0120, 0x080c, 0x66d1, 0x1904, + 0x3427, 0x080c, 0x646a, 0x0904, 0x3424, 0x080c, 0x650c, 0x0904, + 0x3424, 0x2001, 0x1959, 0x2004, 0xd0fc, 0x1904, 0x33f2, 0x0804, + 0x4461, 0xa9a0, 0x2001, 0x1959, 0x918c, 0x8000, 0xc18d, 0x2102, + 0x080c, 0x49db, 0x01a0, 0x080c, 0x66c9, 0x0118, 0x080c, 0x66d1, + 0x1170, 0x080c, 0x646a, 0x2009, 0x0002, 0x0128, 0x080c, 0x650c, + 0x1170, 0x2009, 0x0003, 0xa897, 0x4005, 0xa99a, 0x0010, 0xa897, + 0x4006, 0x900e, 0x9085, 0x0001, 0x2001, 0x0030, 0x0005, 0xa897, + 0x4000, 0x2001, 0x1959, 0x2004, 0xd0fc, 0x1128, 0x080c, 0x54e3, + 0x0110, 0x9006, 0x0018, 0x900e, 0x9085, 0x0001, 0x2001, 0x0000, + 0x0005, 0x6100, 0x0804, 0x33f2, 0x080c, 0x49ea, 0x0904, 0x3427, + 0x080c, 0x54ef, 0x1904, 0x3424, 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, + 0x33f2, 0x78a8, 0x909c, 0x0003, 0xd0ac, 0x1150, 0xd0b4, 0x1140, + 0x939a, 0x0003, 0x1a04, 0x3424, 0x6258, 0x7884, 0x9206, 0x1560, + 0x2031, 0x1848, 0x2009, 0x013c, 0x2136, 0x2001, 0x1840, 0x2009, + 0x000c, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x2039, 0x0001, 0x0006, + 0x78a8, 0x9084, 0x0080, 0x1118, 0x000e, 0x0804, 0x4a03, 0x000e, + 0x2031, 0x0000, 0x2061, 0x18b6, 0x2c44, 0xa66a, 0xa17a, 0xa772, + 0xa076, 0xa28e, 0xa392, 0xa496, 0xa59a, 0x080c, 0x1134, 0x7007, + 0x0002, 0x701f, 0x461c, 0x0005, 0x81ff, 0x1904, 0x3424, 0x080c, + 0x49ea, 0x0904, 0x3427, 0x080c, 0x66c9, 0x1904, 0x3424, 0x00c6, + 0x080c, 0x49b7, 0x00ce, 0x0904, 0x3424, 0xa867, 0x0000, 0xa868, + 0xc0fd, 0xa86a, 0x7ea8, 0x080c, 0xbebf, 0x0904, 0x3424, 0x7007, + 0x0003, 0x701f, 0x4620, 0x0005, 0x080c, 0x416d, 0x0804, 0x33f2, + 0xa830, 0x9086, 0x0100, 0x0904, 0x3424, 0x8906, 0x8006, 0x8007, + 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x001b, 0x2009, 0x000c, + 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x0804, 0x4a03, 0x9006, 0x080c, + 0x26d6, 0x78a8, 0x9084, 0x00ff, 0x9086, 0x00ff, 0x0118, 0x81ff, + 0x1904, 0x3424, 0x080c, 0x717e, 0x0110, 0x080c, 0x5df4, 0x7888, + 0x908a, 0x1000, 0x1a04, 0x3427, 0x7984, 0x9186, 0x00ff, 0x0138, + 0x9182, 0x007f, 0x1a04, 0x3427, 0x2100, 0x080c, 0x26a0, 0x0026, + 0x00c6, 0x0126, 0x2091, 0x8000, 0x2061, 0x19d5, 0x601b, 0x0000, + 0x601f, 0x0000, 0x607b, 0x0000, 0x607f, 0x0000, 0x080c, 0x717e, + 0x1158, 0x080c, 0x747a, 0x080c, 0x5e2f, 0x9085, 0x0001, 0x080c, + 0x71c2, 0x080c, 0x709e, 0x00d0, 0x080c, 0x9f70, 0x2061, 0x0100, + 0x2001, 0x1817, 0x2004, 0x9084, 0x00ff, 0x810f, 0x9105, 0x604a, + 0x6043, 0x0090, 0x6043, 0x0010, 0x2009, 0x1973, 0x200b, 0x0000, + 0x2009, 0x002d, 0x2011, 0x5d1a, 0x080c, 0x82eb, 0x7984, 0x080c, + 0x717e, 0x1110, 0x2009, 0x00ff, 0x7a88, 0x080c, 0x44c4, 0x012e, + 0x00ce, 0x002e, 0x0804, 0x33f2, 0x7984, 0x080c, 0x6343, 0x2b08, + 0x1904, 0x3427, 0x0804, 0x33f2, 0x81ff, 0x0120, 0x2009, 0x0001, + 0x0804, 0x3424, 0x60d8, 0xd0ac, 0x1130, 0xd09c, 0x1120, 0x2009, + 0x0005, 0x0804, 0x3424, 0x080c, 0x49b7, 0x1120, 0x2009, 0x0002, + 0x0804, 0x3424, 0x7984, 0x81ff, 0x0904, 0x3427, 0x9192, 0x0021, + 0x1a04, 0x3427, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0xa85c, 0x9080, + 0x0019, 0x702a, 0xaf60, 0x7736, 0x080c, 0x4a00, 0x701f, 0x46d7, + 0x7880, 0x9086, 0x006e, 0x0110, 0x701f, 0x4f83, 0x0005, 0x2009, + 0x0080, 0x080c, 0x63a3, 0x1118, 0x080c, 0x66c9, 0x0120, 0x2021, + 0x400a, 0x0804, 0x33f4, 0x00d6, 0x0096, 0xa964, 0xaa6c, 0xab70, + 0xac74, 0xad78, 0xae7c, 0xa884, 0x90be, 0x0100, 0x0904, 0x4770, + 0x90be, 0x0112, 0x0904, 0x4770, 0x90be, 0x0113, 0x0904, 0x4770, + 0x90be, 0x0114, 0x0904, 0x4770, 0x90be, 0x0117, 0x0904, 0x4770, + 0x90be, 0x011a, 0x0904, 0x4770, 0x90be, 0x011c, 0x0904, 0x4770, + 0x90be, 0x0121, 0x0904, 0x4757, 0x90be, 0x0131, 0x0904, 0x4757, + 0x90be, 0x0171, 0x0904, 0x4770, 0x90be, 0x0173, 0x0904, 0x4770, + 0x90be, 0x01a1, 0x1128, 0xa894, 0x8007, 0xa896, 0x0804, 0x477b, + 0x90be, 0x0212, 0x0904, 0x4764, 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, 0x351d, 0x7028, 0x9080, + 0x0300, 0x05b0, 0x009e, 0x00de, 0x0804, 0x3427, 0x7028, 0x9080, 0x0010, 0x2098, 0x20a0, 0x7034, 0x20e0, 0x20e8, 0x20a9, 0x0007, - 0x080c, 0x48c1, 0x7028, 0x9080, 0x000e, 0x2098, 0x20a0, 0x7034, - 0x20e0, 0x20e8, 0x20a9, 0x0001, 0x080c, 0x48c1, 0x00c8, 0x7028, + 0x080c, 0x47b9, 0x7028, 0x9080, 0x000e, 0x2098, 0x20a0, 0x7034, + 0x20e0, 0x20e8, 0x20a9, 0x0001, 0x080c, 0x47b9, 0x00c8, 0x7028, 0x9080, 0x000c, 0x2098, 0x20a0, 0x7034, 0x20e0, 0x20e8, 0x20a9, - 0x0001, 0x080c, 0x48ce, 0x00b8, 0x7028, 0x9080, 0x000e, 0x2098, - 0x20a0, 0x7034, 0x20e0, 0x20e8, 0x20a9, 0x0001, 0x080c, 0x48ce, + 0x0001, 0x080c, 0x47c6, 0x00b8, 0x7028, 0x9080, 0x000e, 0x2098, + 0x20a0, 0x7034, 0x20e0, 0x20e8, 0x20a9, 0x0001, 0x080c, 0x47c6, 0x7028, 0x9080, 0x000c, 0x2098, 0x20a0, 0x7034, 0x20e0, 0x20e8, - 0x20a9, 0x0001, 0x04f1, 0x00c6, 0x080c, 0x4abf, 0x0550, 0xa868, + 0x20a9, 0x0001, 0x04f1, 0x00c6, 0x080c, 0x49b7, 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, 0xbfc3, 0x1120, - 0x2009, 0x0003, 0x0804, 0x351a, 0x7007, 0x0003, 0x701f, 0x48b8, - 0x0005, 0x00ce, 0x009e, 0x00de, 0x2009, 0x0002, 0x0804, 0x351a, - 0xa820, 0x9086, 0x8001, 0x1904, 0x34e8, 0x2009, 0x0004, 0x0804, - 0x351a, 0x0016, 0x0026, 0x3510, 0x20a9, 0x0002, 0x4002, 0x4104, + 0xa868, 0xc0fd, 0xa86a, 0xa804, 0x2048, 0x080c, 0xbeda, 0x1120, + 0x2009, 0x0003, 0x0804, 0x3424, 0x7007, 0x0003, 0x701f, 0x47b0, + 0x0005, 0x00ce, 0x009e, 0x00de, 0x2009, 0x0002, 0x0804, 0x3424, + 0xa820, 0x9086, 0x8001, 0x1904, 0x33f2, 0x2009, 0x0004, 0x0804, + 0x3424, 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, 0x351a, 0x60d8, - 0xd0ac, 0x1160, 0xd09c, 0x0120, 0x2009, 0x0016, 0x0804, 0x351a, - 0xd09c, 0x1120, 0x2009, 0x0005, 0x0804, 0x351a, 0x7984, 0x78a8, - 0x2040, 0x080c, 0xa062, 0x1120, 0x9182, 0x007f, 0x0a04, 0x351d, - 0x9186, 0x00ff, 0x0904, 0x351d, 0x9182, 0x0800, 0x1a04, 0x351d, + 0x0005, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x3424, 0x60d8, + 0xd0ac, 0x1160, 0xd09c, 0x0120, 0x2009, 0x0016, 0x0804, 0x3424, + 0xd09c, 0x1120, 0x2009, 0x0005, 0x0804, 0x3424, 0x7984, 0x78a8, + 0x2040, 0x080c, 0x9f69, 0x1120, 0x9182, 0x007f, 0x0a04, 0x3427, + 0x9186, 0x00ff, 0x0904, 0x3427, 0x9182, 0x0800, 0x1a04, 0x3427, 0x7a8c, 0x7b88, 0x6078, 0x9306, 0x1158, 0x607c, 0x924e, 0x0904, - 0x351d, 0x080c, 0xa062, 0x1120, 0x99cc, 0xff00, 0x0904, 0x351d, - 0x0126, 0x2091, 0x8000, 0x9386, 0xffff, 0x0178, 0x0026, 0x2011, - 0x8008, 0x080c, 0x67e7, 0x002e, 0x0140, 0x918d, 0x8000, 0x080c, - 0x6831, 0x1118, 0x2001, 0x4009, 0x0458, 0x080c, 0x49d9, 0x0560, - 0x90c6, 0x4000, 0x1170, 0x00c6, 0x0006, 0x900e, 0x080c, 0x66bf, + 0x3427, 0x080c, 0x9f69, 0x1120, 0x99cc, 0xff00, 0x0904, 0x3427, + 0x0126, 0x2091, 0x8000, 0x9386, 0x00ff, 0x0178, 0x0026, 0x2011, + 0x8008, 0x080c, 0x66ed, 0x002e, 0x0140, 0x918d, 0x8000, 0x080c, + 0x6737, 0x1118, 0x2001, 0x4009, 0x0458, 0x080c, 0x48d1, 0x0560, + 0x90c6, 0x4000, 0x1170, 0x00c6, 0x0006, 0x900e, 0x080c, 0x65c3, 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, 0x34ea, 0x2b00, 0x7026, 0x0016, 0x00b6, - 0x00c6, 0x00e6, 0x2c70, 0x080c, 0xa130, 0x0904, 0x49a6, 0x2b00, - 0x6012, 0x080c, 0xc2b3, 0x2e58, 0x00ee, 0x00e6, 0x00c6, 0x080c, - 0x4abf, 0x00ce, 0x2b70, 0x1158, 0x080c, 0xa0e3, 0x00ee, 0x00ce, - 0x00be, 0x001e, 0x012e, 0x2009, 0x0002, 0x0804, 0x351a, 0x900e, + 0x2020, 0x012e, 0x0804, 0x33f4, 0x2b00, 0x7026, 0x0016, 0x00b6, + 0x00c6, 0x00e6, 0x2c70, 0x080c, 0xa03b, 0x0904, 0x489e, 0x2b00, + 0x6012, 0x080c, 0xc1ca, 0x2e58, 0x00ee, 0x00e6, 0x00c6, 0x080c, + 0x49b7, 0x00ce, 0x2b70, 0x1158, 0x080c, 0x9fea, 0x00ee, 0x00ce, + 0x00be, 0x001e, 0x012e, 0x2009, 0x0002, 0x0804, 0x3424, 0x900e, 0xa966, 0xa96a, 0x2900, 0x6016, 0xa932, 0xa868, 0xc0fd, 0xd88c, - 0x0108, 0xc0f5, 0xa86a, 0x080c, 0x318b, 0x6023, 0x0001, 0x9006, - 0x080c, 0x63dc, 0x2001, 0x0002, 0x080c, 0x63f0, 0x2009, 0x0002, - 0x080c, 0xa15d, 0x78a8, 0xd094, 0x0138, 0x00ee, 0x7024, 0x00e6, + 0x0108, 0xc0f5, 0xa86a, 0x080c, 0x3095, 0x6023, 0x0001, 0x9006, + 0x080c, 0x62e0, 0x2001, 0x0002, 0x080c, 0x62f4, 0x2009, 0x0002, + 0x080c, 0xa068, 0x78a8, 0xd094, 0x0138, 0x00ee, 0x7024, 0x00e6, 0x2058, 0xb8bc, 0xc08d, 0xb8be, 0x9085, 0x0001, 0x00ee, 0x00ce, - 0x00be, 0x001e, 0x012e, 0x1120, 0x2009, 0x0003, 0x0804, 0x351a, - 0x7007, 0x0003, 0x701f, 0x49b5, 0x0005, 0xa830, 0x2008, 0x918e, - 0xdead, 0x1120, 0x2021, 0x4009, 0x0804, 0x34ea, 0x9086, 0x0100, + 0x00be, 0x001e, 0x012e, 0x1120, 0x2009, 0x0003, 0x0804, 0x3424, + 0x7007, 0x0003, 0x701f, 0x48ad, 0x0005, 0xa830, 0x2008, 0x918e, + 0xdead, 0x1120, 0x2021, 0x4009, 0x0804, 0x33f4, 0x9086, 0x0100, 0x7024, 0x2058, 0x1138, 0x2009, 0x0004, 0xba04, 0x9294, 0x00ff, - 0x0804, 0x552f, 0x900e, 0xa868, 0xd0f4, 0x1904, 0x34e8, 0x080c, - 0x66bf, 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d, 0x0804, - 0x34e8, 0x00e6, 0x00d6, 0x0096, 0x83ff, 0x0904, 0x4a21, 0x902e, - 0x080c, 0xa062, 0x0130, 0x9026, 0x20a9, 0x0800, 0x2071, 0x1000, + 0x0804, 0x542f, 0x900e, 0xa868, 0xd0f4, 0x1904, 0x33f2, 0x080c, + 0x65c3, 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d, 0x0804, + 0x33f2, 0x00e6, 0x00d6, 0x0096, 0x83ff, 0x0904, 0x4919, 0x902e, + 0x080c, 0x9f69, 0x0130, 0x9026, 0x20a9, 0x0800, 0x2071, 0x1000, 0x0030, 0x2021, 0x007f, 0x20a9, 0x0781, 0x2071, 0x107f, 0x2e04, 0x9005, 0x11b0, 0x2100, 0x9406, 0x15e8, 0x2428, 0x94ce, 0x007f, 0x1120, 0x92ce, 0xfffd, 0x1528, 0x0030, 0x94ce, 0x0080, 0x1130, 0x92ce, 0xfffc, 0x11f0, 0x93ce, 0x00ff, 0x11d8, 0xc5fd, 0x0450, 0x2058, 0xbf10, 0x2700, 0x9306, 0x11b8, 0xbe14, 0x2600, 0x9206, 0x1198, 0x2400, 0x9106, 0x1150, 0xd884, 0x0568, 0xd894, 0x1558, - 0x080c, 0x67c3, 0x1540, 0x2001, 0x4000, 0x0430, 0x2001, 0x4007, + 0x080c, 0x66c9, 0x1540, 0x2001, 0x4000, 0x0430, 0x2001, 0x4007, 0x0418, 0x2001, 0x4006, 0x0400, 0x2400, 0x9106, 0x1158, 0xbe14, - 0x87ff, 0x1128, 0x86ff, 0x0948, 0x080c, 0xa062, 0x1930, 0x2001, - 0x4008, 0x0090, 0x8420, 0x8e70, 0x1f04, 0x49ef, 0x85ff, 0x1130, - 0x2001, 0x4009, 0x0048, 0x2001, 0x0001, 0x0030, 0x080c, 0x643f, + 0x87ff, 0x1128, 0x86ff, 0x0948, 0x080c, 0x9f69, 0x1930, 0x2001, + 0x4008, 0x0090, 0x8420, 0x8e70, 0x1f04, 0x48e7, 0x85ff, 0x1130, + 0x2001, 0x4009, 0x0048, 0x2001, 0x0001, 0x0030, 0x080c, 0x6343, 0x1dd0, 0xbb12, 0xba16, 0x9006, 0x9005, 0x009e, 0x00de, 0x00ee, - 0x0005, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x351a, 0x080c, - 0x4abf, 0x1120, 0x2009, 0x0002, 0x0804, 0x351a, 0xa867, 0x0000, - 0xa868, 0xc0fd, 0xa86a, 0x7884, 0x9005, 0x0904, 0x351d, 0x9096, - 0x00ff, 0x0120, 0x9092, 0x0004, 0x1a04, 0x351d, 0x2010, 0x2918, - 0x080c, 0x3131, 0x1120, 0x2009, 0x0003, 0x0804, 0x351a, 0x7007, - 0x0003, 0x701f, 0x4a74, 0x0005, 0xa830, 0x9086, 0x0100, 0x1904, - 0x34e8, 0x2009, 0x0004, 0x0804, 0x351a, 0x7984, 0x080c, 0xa062, - 0x1120, 0x9182, 0x007f, 0x0a04, 0x351d, 0x9186, 0x00ff, 0x0904, - 0x351d, 0x9182, 0x0800, 0x1a04, 0x351d, 0x2001, 0x9400, 0x080c, - 0x558a, 0x1904, 0x351a, 0x0804, 0x34e8, 0xa998, 0x080c, 0xa062, + 0x0005, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x3424, 0x080c, + 0x49b7, 0x1120, 0x2009, 0x0002, 0x0804, 0x3424, 0xa867, 0x0000, + 0xa868, 0xc0fd, 0xa86a, 0x7884, 0x9005, 0x0904, 0x3427, 0x9096, + 0x00ff, 0x0120, 0x9092, 0x0004, 0x1a04, 0x3427, 0x2010, 0x2918, + 0x080c, 0x303b, 0x1120, 0x2009, 0x0003, 0x0804, 0x3424, 0x7007, + 0x0003, 0x701f, 0x496c, 0x0005, 0xa830, 0x9086, 0x0100, 0x1904, + 0x33f2, 0x2009, 0x0004, 0x0804, 0x3424, 0x7984, 0x080c, 0x9f69, + 0x1120, 0x9182, 0x007f, 0x0a04, 0x3427, 0x9186, 0x00ff, 0x0904, + 0x3427, 0x9182, 0x0800, 0x1a04, 0x3427, 0x2001, 0x9400, 0x080c, + 0x548a, 0x1904, 0x3424, 0x0804, 0x33f2, 0xa998, 0x080c, 0x9f69, 0x1118, 0x9182, 0x007f, 0x0280, 0x9186, 0x00ff, 0x0168, 0x9182, - 0x0800, 0x1250, 0x2001, 0x9400, 0x080c, 0x558a, 0x11a8, 0x0060, + 0x0800, 0x1250, 0x2001, 0x9400, 0x080c, 0x548a, 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, - 0x1031, 0x0198, 0x9006, 0xa802, 0x7014, 0x9005, 0x1120, 0x2900, + 0x1037, 0x0198, 0x9006, 0xa802, 0x7014, 0x9005, 0x1120, 0x2900, 0x7016, 0x701a, 0x0040, 0x7018, 0xa802, 0x0086, 0x2040, 0x2900, 0xa006, 0x701a, 0x008e, 0x9085, 0x0001, 0x0005, 0x7984, 0x080c, - 0x649f, 0x1130, 0x7e88, 0x9684, 0x3fff, 0x9082, 0x4000, 0x0208, - 0x905e, 0x8bff, 0x0005, 0xa998, 0x080c, 0x649f, 0x1130, 0xae9c, + 0x63a3, 0x1130, 0x7e88, 0x9684, 0x3fff, 0x9082, 0x4000, 0x0208, + 0x905e, 0x8bff, 0x0005, 0xa998, 0x080c, 0x63a3, 0x1130, 0xae9c, 0x9684, 0x3fff, 0x9082, 0x4000, 0x0208, 0x905e, 0x8bff, 0x0005, - 0xae98, 0x0008, 0x7e84, 0x2608, 0x080c, 0x649f, 0x1108, 0x0008, + 0xae98, 0x0008, 0x7e84, 0x2608, 0x080c, 0x63a3, 0x1108, 0x0008, 0x905e, 0x8bff, 0x0005, 0x0016, 0x7114, 0x81ff, 0x0128, 0x2148, - 0xa904, 0x080c, 0x1063, 0x0cc8, 0x7116, 0x711a, 0x001e, 0x0005, + 0xa904, 0x080c, 0x1069, 0x0cc8, 0x7116, 0x711a, 0x001e, 0x0005, 0x2031, 0x0001, 0x0010, 0x2031, 0x0000, 0x2061, 0x18b6, 0x2c44, 0xa66a, 0xa17a, 0xa772, 0xa076, 0xa28e, 0xa392, 0xa496, 0xa59a, - 0x080c, 0x112e, 0x7007, 0x0002, 0x701f, 0x34e8, 0x0005, 0x00f6, + 0x080c, 0x1134, 0x7007, 0x0002, 0x701f, 0x33f2, 0x0005, 0x00f6, 0x0126, 0x2091, 0x8000, 0x2079, 0x0000, 0x2001, 0x18ae, 0x2004, - 0x9005, 0x1190, 0x0e04, 0x4b3c, 0x7a36, 0x7833, 0x0012, 0x7a82, + 0x9005, 0x1190, 0x0e04, 0x4a34, 0x7a36, 0x7833, 0x0012, 0x7a82, 0x7b86, 0x7c8a, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, - 0x190c, 0x11e0, 0x0804, 0x4ba2, 0x0016, 0x0086, 0x0096, 0x00c6, + 0x190c, 0x11e6, 0x0804, 0x4a9a, 0x0016, 0x0086, 0x0096, 0x00c6, 0x00e6, 0x2071, 0x189c, 0x7044, 0x9005, 0x1540, 0x7148, 0x9182, - 0x0010, 0x0288, 0x7038, 0x2060, 0x080c, 0x1031, 0x0904, 0x4b9a, - 0xa84b, 0x0000, 0x2900, 0x7046, 0x2001, 0x0002, 0x9080, 0x1fc8, + 0x0010, 0x0288, 0x7038, 0x2060, 0x080c, 0x1037, 0x0904, 0x4a92, + 0xa84b, 0x0000, 0x2900, 0x7046, 0x2001, 0x0002, 0x9080, 0x1ebe, 0x2005, 0xa846, 0x0098, 0x7038, 0x90e0, 0x0004, 0x2001, 0x18b8, 0x9c82, 0x18f8, 0x0210, 0x2061, 0x18b8, 0x2c00, 0x703a, 0x7148, 0x81ff, 0x1108, 0x703e, 0x8108, 0x714a, 0x0460, 0x7148, 0x8108, 0x714a, 0x7044, 0x2040, 0xa144, 0x2105, 0x0016, 0x908a, 0x0036, - 0x1a0c, 0x0dfa, 0x2060, 0x001e, 0x8108, 0x2105, 0x9005, 0xa146, - 0x1520, 0x080c, 0x1031, 0x1130, 0x8109, 0xa946, 0x7148, 0x8109, + 0x1a0c, 0x0df6, 0x2060, 0x001e, 0x8108, 0x2105, 0x9005, 0xa146, + 0x1520, 0x080c, 0x1037, 0x1130, 0x8109, 0xa946, 0x7148, 0x8109, 0x714a, 0x00d8, 0x9006, 0xa806, 0xa84a, 0xa046, 0x2800, 0xa802, - 0x2900, 0xa006, 0x7046, 0x2001, 0x0002, 0x9080, 0x1fc8, 0x2005, + 0x2900, 0xa006, 0x7046, 0x2001, 0x0002, 0x9080, 0x1ebe, 0x2005, 0xa846, 0x0058, 0x2262, 0x6306, 0x640a, 0x00ee, 0x00ce, 0x009e, 0x008e, 0x001e, 0x012e, 0x00fe, 0x0005, 0x2c00, 0x9082, 0x001b, - 0x0002, 0x4bc4, 0x4bc4, 0x4bc6, 0x4bc4, 0x4bc4, 0x4bc4, 0x4bca, - 0x4bc4, 0x4bc4, 0x4bc4, 0x4bce, 0x4bc4, 0x4bc4, 0x4bc4, 0x4bd2, - 0x4bc4, 0x4bc4, 0x4bc4, 0x4bd6, 0x4bc4, 0x4bc4, 0x4bc4, 0x4bda, - 0x4bc4, 0x4bc4, 0x4bc4, 0x4bdf, 0x080c, 0x0dfa, 0xa276, 0xa37a, + 0x0002, 0x4abc, 0x4abc, 0x4abe, 0x4abc, 0x4abc, 0x4abc, 0x4ac2, + 0x4abc, 0x4abc, 0x4abc, 0x4ac6, 0x4abc, 0x4abc, 0x4abc, 0x4aca, + 0x4abc, 0x4abc, 0x4abc, 0x4ace, 0x4abc, 0x4abc, 0x4abc, 0x4ad2, + 0x4abc, 0x4abc, 0x4abc, 0x4ad7, 0x080c, 0x0df6, 0xa276, 0xa37a, 0xa47e, 0x0898, 0xa286, 0xa38a, 0xa48e, 0x0878, 0xa296, 0xa39a, 0xa49e, 0x0858, 0xa2a6, 0xa3aa, 0xa4ae, 0x0838, 0xa2b6, 0xa3ba, - 0xa4be, 0x0818, 0xa2c6, 0xa3ca, 0xa4ce, 0x0804, 0x4b9d, 0xa2d6, - 0xa3da, 0xa4de, 0x0804, 0x4b9d, 0x00e6, 0x2071, 0x189c, 0x7048, - 0x9005, 0x0904, 0x4c76, 0x0126, 0x2091, 0x8000, 0x0e04, 0x4c75, + 0xa4be, 0x0818, 0xa2c6, 0xa3ca, 0xa4ce, 0x0804, 0x4a95, 0xa2d6, + 0xa3da, 0xa4de, 0x0804, 0x4a95, 0x00e6, 0x2071, 0x189c, 0x7048, + 0x9005, 0x0904, 0x4b6e, 0x0126, 0x2091, 0x8000, 0x0e04, 0x4b6d, 0x00f6, 0x2079, 0x0000, 0x00c6, 0x0096, 0x0086, 0x0076, 0x9006, 0x2038, 0x7040, 0x2048, 0x9005, 0x0500, 0xa948, 0x2105, 0x0016, - 0x908a, 0x0036, 0x1a0c, 0x0dfa, 0x2060, 0x001e, 0x8108, 0x2105, - 0x9005, 0xa94a, 0x1904, 0x4c78, 0xa804, 0x9005, 0x090c, 0x0dfa, + 0x908a, 0x0036, 0x1a0c, 0x0df6, 0x2060, 0x001e, 0x8108, 0x2105, + 0x9005, 0xa94a, 0x1904, 0x4b70, 0xa804, 0x9005, 0x090c, 0x0df6, 0x7042, 0x2938, 0x2040, 0xa003, 0x0000, 0x2001, 0x0002, 0x9080, - 0x1fc8, 0x2005, 0xa04a, 0x0804, 0x4c78, 0x703c, 0x2060, 0x2c14, + 0x1ebe, 0x2005, 0xa04a, 0x0804, 0x4b70, 0x703c, 0x2060, 0x2c14, 0x6304, 0x6408, 0x650c, 0x2200, 0x7836, 0x7833, 0x0012, 0x7882, 0x2300, 0x7886, 0x2400, 0x788a, 0x2091, 0x4080, 0x2001, 0x0089, - 0x2004, 0xd084, 0x190c, 0x11e0, 0x87ff, 0x0118, 0x2748, 0x080c, - 0x1063, 0x7048, 0x8001, 0x704a, 0x9005, 0x1170, 0x7040, 0x2048, - 0x9005, 0x0128, 0x080c, 0x1063, 0x9006, 0x7042, 0x7046, 0x703b, + 0x2004, 0xd084, 0x190c, 0x11e6, 0x87ff, 0x0118, 0x2748, 0x080c, + 0x1069, 0x7048, 0x8001, 0x704a, 0x9005, 0x1170, 0x7040, 0x2048, + 0x9005, 0x0128, 0x080c, 0x1069, 0x9006, 0x7042, 0x7046, 0x703b, 0x18b8, 0x703f, 0x18b8, 0x0420, 0x7040, 0x9005, 0x1508, 0x7238, 0x2c00, 0x9206, 0x0148, 0x9c80, 0x0004, 0x90fa, 0x18f8, 0x0210, 0x2001, 0x18b8, 0x703e, 0x00a0, 0x9006, 0x703e, 0x703a, 0x7044, - 0x9005, 0x090c, 0x0dfa, 0x2048, 0xa800, 0x9005, 0x1de0, 0x2900, - 0x7042, 0x2001, 0x0002, 0x9080, 0x1fc8, 0x2005, 0xa84a, 0x0000, + 0x9005, 0x090c, 0x0df6, 0x2048, 0xa800, 0x9005, 0x1de0, 0x2900, + 0x7042, 0x2001, 0x0002, 0x9080, 0x1ebe, 0x2005, 0xa84a, 0x0000, 0x007e, 0x008e, 0x009e, 0x00ce, 0x00fe, 0x012e, 0x00ee, 0x0005, - 0x2c00, 0x9082, 0x001b, 0x0002, 0x4c97, 0x4c97, 0x4c99, 0x4c97, - 0x4c97, 0x4c97, 0x4c9e, 0x4c97, 0x4c97, 0x4c97, 0x4ca3, 0x4c97, - 0x4c97, 0x4c97, 0x4ca8, 0x4c97, 0x4c97, 0x4c97, 0x4cad, 0x4c97, - 0x4c97, 0x4c97, 0x4cb2, 0x4c97, 0x4c97, 0x4c97, 0x4cb7, 0x080c, - 0x0dfa, 0xaa74, 0xab78, 0xac7c, 0x0804, 0x4c23, 0xaa84, 0xab88, - 0xac8c, 0x0804, 0x4c23, 0xaa94, 0xab98, 0xac9c, 0x0804, 0x4c23, - 0xaaa4, 0xaba8, 0xacac, 0x0804, 0x4c23, 0xaab4, 0xabb8, 0xacbc, - 0x0804, 0x4c23, 0xaac4, 0xabc8, 0xaccc, 0x0804, 0x4c23, 0xaad4, - 0xabd8, 0xacdc, 0x0804, 0x4c23, 0x0026, 0x080c, 0x55db, 0xd0c4, - 0x0120, 0x2011, 0x8014, 0x080c, 0x4b1f, 0x002e, 0x0005, 0x81ff, - 0x1904, 0x351a, 0x0126, 0x2091, 0x8000, 0x6030, 0xc08d, 0xc085, - 0xc0ac, 0x6032, 0x080c, 0x7207, 0x1158, 0x080c, 0x7504, 0x080c, - 0x5f2b, 0x9085, 0x0001, 0x080c, 0x724e, 0x080c, 0x7127, 0x0010, - 0x080c, 0x5dea, 0x012e, 0x0804, 0x34e8, 0x81ff, 0x0120, 0x2009, - 0x0001, 0x0804, 0x351a, 0x080c, 0x55ef, 0x0120, 0x2009, 0x0007, - 0x0804, 0x351a, 0x080c, 0x67bb, 0x0120, 0x2009, 0x0008, 0x0804, - 0x351a, 0x0026, 0x2011, 0x0010, 0x080c, 0x67e7, 0x002e, 0x0140, - 0x7984, 0x080c, 0x6831, 0x1120, 0x2009, 0x4009, 0x0804, 0x351a, - 0x7984, 0x080c, 0x643f, 0x1904, 0x351d, 0x080c, 0x4af2, 0x0904, - 0x351d, 0x2b00, 0x7026, 0x080c, 0x67c3, 0x7888, 0x1170, 0x9084, - 0x0005, 0x1158, 0x900e, 0x080c, 0x66bf, 0x1108, 0xc185, 0xb800, - 0xd0bc, 0x0108, 0xc18d, 0x0804, 0x34e8, 0x080c, 0x4abf, 0x0904, - 0x351a, 0x9006, 0xa866, 0xa832, 0xa868, 0xc0fd, 0xa86a, 0x080c, - 0xc061, 0x0904, 0x351a, 0x7888, 0xd094, 0x0118, 0xb8bc, 0xc08d, - 0xb8be, 0x7007, 0x0003, 0x701f, 0x4d87, 0x0005, 0x2061, 0x1800, - 0x080c, 0x55ef, 0x2009, 0x0007, 0x1560, 0x080c, 0x67bb, 0x0118, - 0x2009, 0x0008, 0x0430, 0xa998, 0x080c, 0x643f, 0x1530, 0x080c, - 0x4af0, 0x0518, 0x080c, 0x67c3, 0xa89c, 0x1168, 0x9084, 0x0005, - 0x1150, 0x900e, 0x080c, 0x66bf, 0x1108, 0xc185, 0xb800, 0xd0bc, - 0x0108, 0xc18d, 0x00d0, 0xa868, 0xc0fc, 0xa86a, 0x080c, 0xc061, + 0x2c00, 0x9082, 0x001b, 0x0002, 0x4b8f, 0x4b8f, 0x4b91, 0x4b8f, + 0x4b8f, 0x4b8f, 0x4b96, 0x4b8f, 0x4b8f, 0x4b8f, 0x4b9b, 0x4b8f, + 0x4b8f, 0x4b8f, 0x4ba0, 0x4b8f, 0x4b8f, 0x4b8f, 0x4ba5, 0x4b8f, + 0x4b8f, 0x4b8f, 0x4baa, 0x4b8f, 0x4b8f, 0x4b8f, 0x4baf, 0x080c, + 0x0df6, 0xaa74, 0xab78, 0xac7c, 0x0804, 0x4b1b, 0xaa84, 0xab88, + 0xac8c, 0x0804, 0x4b1b, 0xaa94, 0xab98, 0xac9c, 0x0804, 0x4b1b, + 0xaaa4, 0xaba8, 0xacac, 0x0804, 0x4b1b, 0xaab4, 0xabb8, 0xacbc, + 0x0804, 0x4b1b, 0xaac4, 0xabc8, 0xaccc, 0x0804, 0x4b1b, 0xaad4, + 0xabd8, 0xacdc, 0x0804, 0x4b1b, 0x0026, 0x080c, 0x54db, 0xd0c4, + 0x0120, 0x2011, 0x8014, 0x080c, 0x4a17, 0x002e, 0x0005, 0x81ff, + 0x1904, 0x3424, 0x0126, 0x2091, 0x8000, 0x6030, 0xc08d, 0xc085, + 0xc0ac, 0x6032, 0x080c, 0x717e, 0x1158, 0x080c, 0x747a, 0x080c, + 0x5e2f, 0x9085, 0x0001, 0x080c, 0x71c2, 0x080c, 0x709e, 0x0010, + 0x080c, 0x5cee, 0x012e, 0x0804, 0x33f2, 0x81ff, 0x0120, 0x2009, + 0x0001, 0x0804, 0x3424, 0x080c, 0x54ef, 0x0120, 0x2009, 0x0007, + 0x0804, 0x3424, 0x080c, 0x66c1, 0x0120, 0x2009, 0x0008, 0x0804, + 0x3424, 0x0026, 0x2011, 0x0010, 0x080c, 0x66ed, 0x002e, 0x0140, + 0x7984, 0x080c, 0x6737, 0x1120, 0x2009, 0x4009, 0x0804, 0x3424, + 0x7984, 0x080c, 0x6343, 0x1904, 0x3427, 0x080c, 0x49ea, 0x0904, + 0x3427, 0x2b00, 0x7026, 0x080c, 0x66c9, 0x7888, 0x1170, 0x9084, + 0x0005, 0x1158, 0x900e, 0x080c, 0x65c3, 0x1108, 0xc185, 0xb800, + 0xd0bc, 0x0108, 0xc18d, 0x0804, 0x33f2, 0x080c, 0x49b7, 0x0904, + 0x3424, 0x9006, 0xa866, 0xa832, 0xa868, 0xc0fd, 0xa86a, 0x080c, + 0xbf78, 0x0904, 0x3424, 0x7888, 0xd094, 0x0118, 0xb8bc, 0xc08d, + 0xb8be, 0x7007, 0x0003, 0x701f, 0x4c7f, 0x0005, 0x2061, 0x1800, + 0x080c, 0x54ef, 0x2009, 0x0007, 0x1560, 0x080c, 0x66c1, 0x0118, + 0x2009, 0x0008, 0x0430, 0xa998, 0x080c, 0x6343, 0x1530, 0x080c, + 0x49e8, 0x0518, 0x080c, 0x66c9, 0xa89c, 0x1168, 0x9084, 0x0005, + 0x1150, 0x900e, 0x080c, 0x65c3, 0x1108, 0xc185, 0xb800, 0xd0bc, + 0x0108, 0xc18d, 0x00d0, 0xa868, 0xc0fc, 0xa86a, 0x080c, 0xbf78, 0x11e0, 0xa89c, 0xd094, 0x0118, 0xb8bc, 0xc08d, 0xb8be, 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, - 0x2008, 0x918e, 0xdead, 0x1120, 0x2021, 0x4009, 0x0804, 0x34ea, - 0x9086, 0x0100, 0x7024, 0x2058, 0x1110, 0x0804, 0x552f, 0x900e, - 0x080c, 0x66bf, 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d, - 0x0804, 0x34e8, 0x080c, 0x55ef, 0x0120, 0x2009, 0x0007, 0x0804, - 0x351a, 0x7f84, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x080c, 0x4abf, - 0x1120, 0x2009, 0x0002, 0x0804, 0x351a, 0x900e, 0x2130, 0x7126, + 0x2008, 0x918e, 0xdead, 0x1120, 0x2021, 0x4009, 0x0804, 0x33f4, + 0x9086, 0x0100, 0x7024, 0x2058, 0x1110, 0x0804, 0x542f, 0x900e, + 0x080c, 0x65c3, 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d, + 0x0804, 0x33f2, 0x080c, 0x54ef, 0x0120, 0x2009, 0x0007, 0x0804, + 0x3424, 0x7f84, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x080c, 0x49b7, + 0x1120, 0x2009, 0x0002, 0x0804, 0x3424, 0x900e, 0x2130, 0x7126, 0x7132, 0xa860, 0x20e8, 0x7036, 0xa85c, 0x9080, 0x0005, 0x702a, - 0x20a0, 0x080c, 0x649f, 0x1904, 0x4e25, 0x080c, 0x67c3, 0x0120, - 0x080c, 0x67cb, 0x1904, 0x4e25, 0x080c, 0x67bb, 0x1130, 0x080c, - 0x66bf, 0x1118, 0xd79c, 0x0904, 0x4e25, 0xd794, 0x1110, 0xd784, + 0x20a0, 0x080c, 0x63a3, 0x1904, 0x4d24, 0x080c, 0x66c9, 0x0120, + 0x080c, 0x66d1, 0x1904, 0x4d24, 0x080c, 0x66c1, 0x1130, 0x080c, + 0x65c3, 0x1118, 0xd79c, 0x0904, 0x4d24, 0xd794, 0x1110, 0xd784, 0x01a8, 0xb8b4, 0x20e0, 0xb8b8, 0x9080, 0x0006, 0x2098, 0x3400, - 0xd794, 0x0160, 0x20a9, 0x0008, 0x4003, 0x2098, 0x20a0, 0x3d00, - 0x20e0, 0x20a9, 0x0002, 0x080c, 0x48ce, 0x0048, 0x20a9, 0x0004, - 0x4003, 0x2098, 0x20a0, 0x3d00, 0x20e0, 0x080c, 0x48ce, 0x4104, - 0xd794, 0x0528, 0xb8b4, 0x20e0, 0xb8b8, 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, 0x48c1, 0x9c80, - 0x0026, 0x2098, 0xb8b4, 0x20e0, 0x20a9, 0x0002, 0x4003, 0xd794, - 0x0110, 0x96b0, 0x000b, 0x96b0, 0x0005, 0x8108, 0x080c, 0xa062, - 0x0118, 0x9186, 0x0800, 0x0040, 0xd78c, 0x0120, 0x9186, 0x0800, - 0x0170, 0x0018, 0x9186, 0x007e, 0x0150, 0xd794, 0x0118, 0x9686, - 0x0020, 0x0010, 0x9686, 0x0028, 0x0150, 0x0804, 0x4dc1, 0x86ff, - 0x1120, 0x7124, 0x810b, 0x0804, 0x34e8, 0x7033, 0x0001, 0x7122, - 0x7024, 0x9600, 0x7026, 0x772e, 0x2061, 0x18b6, 0x2c44, 0xa06b, - 0x0000, 0xa67a, 0x7034, 0xa072, 0x7028, 0xa076, 0xa28e, 0xa392, - 0xa496, 0xa59a, 0x080c, 0x112e, 0x7007, 0x0002, 0x701f, 0x4e61, - 0x0005, 0x7030, 0x9005, 0x1180, 0x7120, 0x7028, 0x20a0, 0x772c, - 0x9036, 0x7034, 0x20e8, 0x2061, 0x18b6, 0x2c44, 0xa28c, 0xa390, - 0xa494, 0xa598, 0x0804, 0x4dc1, 0x7124, 0x810b, 0x0804, 0x34e8, - 0x2029, 0x007e, 0x7984, 0x7a88, 0x7b8c, 0x7c98, 0x9184, 0xff00, - 0x8007, 0x90e2, 0x0020, 0x0a04, 0x351d, 0x9502, 0x0a04, 0x351d, - 0x9184, 0x00ff, 0x90e2, 0x0020, 0x0a04, 0x351d, 0x9502, 0x0a04, - 0x351d, 0x9284, 0xff00, 0x8007, 0x90e2, 0x0020, 0x0a04, 0x351d, - 0x9502, 0x0a04, 0x351d, 0x9284, 0x00ff, 0x90e2, 0x0020, 0x0a04, - 0x351d, 0x9502, 0x0a04, 0x351d, 0x9384, 0xff00, 0x8007, 0x90e2, - 0x0020, 0x0a04, 0x351d, 0x9502, 0x0a04, 0x351d, 0x9384, 0x00ff, - 0x90e2, 0x0020, 0x0a04, 0x351d, 0x9502, 0x0a04, 0x351d, 0x9484, - 0xff00, 0x8007, 0x90e2, 0x0020, 0x0a04, 0x351d, 0x9502, 0x0a04, - 0x351d, 0x9484, 0x00ff, 0x90e2, 0x0020, 0x0a04, 0x351d, 0x9502, - 0x0a04, 0x351d, 0x2061, 0x1961, 0x6102, 0x6206, 0x630a, 0x640e, - 0x0804, 0x34e8, 0x0006, 0x080c, 0x55db, 0xd0cc, 0x000e, 0x0005, - 0x0006, 0x080c, 0x55df, 0xd0bc, 0x000e, 0x0005, 0x6170, 0x7a84, - 0x6300, 0x82ff, 0x1118, 0x7986, 0x0804, 0x34e8, 0x83ff, 0x1904, - 0x351d, 0x2001, 0xfff0, 0x9200, 0x1a04, 0x351d, 0x2019, 0xffff, - 0x6074, 0x9302, 0x9200, 0x0a04, 0x351d, 0x7986, 0x6272, 0x0804, - 0x34e8, 0x080c, 0x55ef, 0x1904, 0x351a, 0x7c88, 0x7d84, 0x7e98, - 0x7f8c, 0x080c, 0x4abf, 0x0904, 0x351a, 0x900e, 0x901e, 0x7326, - 0x7332, 0xa860, 0x20e8, 0x7036, 0xa85c, 0x9080, 0x0003, 0x702a, - 0x20a0, 0x91d8, 0x1000, 0x2b5c, 0x8bff, 0x0178, 0x080c, 0x67c3, - 0x0118, 0x080c, 0x67cb, 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, 0x84ff, 0x2208, 0x0804, 0x34e8, - 0x7033, 0x0001, 0x7122, 0x7024, 0x9300, 0x7026, 0x2061, 0x18b6, - 0x2c44, 0xa06b, 0x0000, 0xa37a, 0x7028, 0xa076, 0x7034, 0xa072, - 0xa48e, 0xa592, 0xa696, 0xa79a, 0x080c, 0x112e, 0x7007, 0x0002, - 0x701f, 0x4f53, 0x0005, 0x7030, 0x9005, 0x1178, 0x7120, 0x7028, - 0x20a0, 0x901e, 0x7034, 0x20e8, 0x2061, 0x18b6, 0x2c44, 0xa48c, - 0xa590, 0xa694, 0xa798, 0x0804, 0x4f11, 0x7224, 0x900e, 0x2001, - 0x0003, 0x080c, 0x84ff, 0x2208, 0x0804, 0x34e8, 0x00f6, 0x00e6, - 0x080c, 0x55ef, 0x2009, 0x0007, 0x1904, 0x4fe6, 0x2071, 0x189c, - 0x745c, 0x84ff, 0x2009, 0x000e, 0x1904, 0x4fe6, 0xac9c, 0xad98, - 0xaea4, 0xafa0, 0x0096, 0x080c, 0x104a, 0x2009, 0x0002, 0x0904, - 0x4fe6, 0x2900, 0x705e, 0x900e, 0x901e, 0x7356, 0x7362, 0xa860, - 0x7066, 0xa85c, 0x9080, 0x0003, 0x705a, 0x20a0, 0x91d8, 0x1000, - 0x2b5c, 0x8bff, 0x0178, 0x080c, 0x67c3, 0x0118, 0x080c, 0x67cb, - 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, 0x84ff, 0x2208, 0x009e, 0xa897, 0x4000, 0xa99a, 0x715c, - 0x81ff, 0x090c, 0x0dfa, 0x2148, 0x080c, 0x1063, 0x9006, 0x705e, - 0x918d, 0x0001, 0x2008, 0x0418, 0x7063, 0x0001, 0x7152, 0x7054, - 0x9300, 0x7056, 0x2061, 0x18b7, 0x2c44, 0xa37a, 0x7058, 0xa076, - 0x7064, 0xa072, 0xa48e, 0xa592, 0xa696, 0xa79a, 0xa09f, 0x4ff2, - 0x000e, 0xa0a2, 0x080c, 0x112e, 0x9006, 0x0048, 0x009e, 0xa897, - 0x4005, 0xa99a, 0x900e, 0x9085, 0x0001, 0x2001, 0x0030, 0x00ee, - 0x00fe, 0x0005, 0x00f6, 0xa0a0, 0x904d, 0x090c, 0x0dfa, 0x00e6, - 0x2071, 0x189c, 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, 0x84ff, 0xaa9a, - 0x715c, 0x81ff, 0x090c, 0x0dfa, 0x2148, 0x080c, 0x1063, 0x705f, - 0x0000, 0xa0a0, 0x2048, 0x0126, 0x2091, 0x8000, 0x080c, 0x6ae9, - 0x012e, 0xa09f, 0x0000, 0xa0a3, 0x0000, 0x00ee, 0x00fe, 0x0005, - 0x91d8, 0x1000, 0x2b5c, 0x8bff, 0x0178, 0x080c, 0x67c3, 0x0118, - 0x080c, 0x67cb, 0x1148, 0xb814, 0x20a9, 0x0001, 0x4004, 0xb810, + 0xd794, 0x0198, 0x20a9, 0x0008, 0x4003, 0x2098, 0x20a0, 0x3d00, + 0x20e0, 0x20a9, 0x0002, 0x080c, 0x47c6, 0x0080, 0xb8b4, 0x20e0, + 0xb8b8, 0x9080, 0x000a, 0x2098, 0x3400, 0x20a9, 0x0004, 0x4003, + 0x2098, 0x20a0, 0x3d00, 0x20e0, 0x080c, 0x47c6, 0x4104, 0xd794, + 0x0528, 0xb8b4, 0x20e0, 0xb8b8, 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, 0x47b9, 0x9c80, 0x0026, + 0x2098, 0xb8b4, 0x20e0, 0x20a9, 0x0002, 0x4003, 0xd794, 0x0110, + 0x96b0, 0x000b, 0x96b0, 0x0005, 0x8108, 0x080c, 0x9f69, 0x0118, + 0x9186, 0x0800, 0x0040, 0xd78c, 0x0120, 0x9186, 0x0800, 0x0170, + 0x0018, 0x9186, 0x007e, 0x0150, 0xd794, 0x0118, 0x9686, 0x0020, + 0x0010, 0x9686, 0x0028, 0x0150, 0x0804, 0x4cb9, 0x86ff, 0x1120, + 0x7124, 0x810b, 0x0804, 0x33f2, 0x7033, 0x0001, 0x7122, 0x7024, + 0x9600, 0x7026, 0x772e, 0x2061, 0x18b6, 0x2c44, 0xa06b, 0x0000, + 0xa67a, 0x7034, 0xa072, 0x7028, 0xa076, 0xa28e, 0xa392, 0xa496, + 0xa59a, 0x080c, 0x1134, 0x7007, 0x0002, 0x701f, 0x4d60, 0x0005, + 0x7030, 0x9005, 0x1180, 0x7120, 0x7028, 0x20a0, 0x772c, 0x9036, + 0x7034, 0x20e8, 0x2061, 0x18b6, 0x2c44, 0xa28c, 0xa390, 0xa494, + 0xa598, 0x0804, 0x4cb9, 0x7124, 0x810b, 0x0804, 0x33f2, 0x2029, + 0x007e, 0x7984, 0x7a88, 0x7b8c, 0x7c98, 0x9184, 0xff00, 0x8007, + 0x90e2, 0x0020, 0x0a04, 0x3427, 0x9502, 0x0a04, 0x3427, 0x9184, + 0x00ff, 0x90e2, 0x0020, 0x0a04, 0x3427, 0x9502, 0x0a04, 0x3427, + 0x9284, 0xff00, 0x8007, 0x90e2, 0x0020, 0x0a04, 0x3427, 0x9502, + 0x0a04, 0x3427, 0x9284, 0x00ff, 0x90e2, 0x0020, 0x0a04, 0x3427, + 0x9502, 0x0a04, 0x3427, 0x9384, 0xff00, 0x8007, 0x90e2, 0x0020, + 0x0a04, 0x3427, 0x9502, 0x0a04, 0x3427, 0x9384, 0x00ff, 0x90e2, + 0x0020, 0x0a04, 0x3427, 0x9502, 0x0a04, 0x3427, 0x9484, 0xff00, + 0x8007, 0x90e2, 0x0020, 0x0a04, 0x3427, 0x9502, 0x0a04, 0x3427, + 0x9484, 0x00ff, 0x90e2, 0x0020, 0x0a04, 0x3427, 0x9502, 0x0a04, + 0x3427, 0x2061, 0x1963, 0x6102, 0x6206, 0x630a, 0x640e, 0x0804, + 0x33f2, 0x0006, 0x080c, 0x54db, 0xd0cc, 0x000e, 0x0005, 0x0006, + 0x080c, 0x54df, 0xd0bc, 0x000e, 0x0005, 0x6170, 0x7a84, 0x6300, + 0x82ff, 0x1118, 0x7986, 0x0804, 0x33f2, 0x83ff, 0x1904, 0x3427, + 0x2001, 0xfff0, 0x9200, 0x1a04, 0x3427, 0x2019, 0xffff, 0x6074, + 0x9302, 0x9200, 0x0a04, 0x3427, 0x7986, 0x6272, 0x0804, 0x33f2, + 0x080c, 0x54ef, 0x1904, 0x3424, 0x7c88, 0x7d84, 0x7e98, 0x7f8c, + 0x080c, 0x49b7, 0x0904, 0x3424, 0x900e, 0x901e, 0x7326, 0x7332, + 0xa860, 0x20e8, 0x7036, 0xa85c, 0x9080, 0x0003, 0x702a, 0x20a0, + 0x91d8, 0x1000, 0x2b5c, 0x8bff, 0x0178, 0x080c, 0x66c9, 0x0118, + 0x080c, 0x66d1, 0x1148, 0x20a9, 0x0001, 0xb814, 0x4004, 0xb810, 0x4004, 0x4104, 0x9398, 0x0003, 0x8108, 0x9182, 0x0800, 0x0120, - 0x9386, 0x003c, 0x0518, 0x0c20, 0x83ff, 0x11f0, 0x7154, 0x810c, - 0xa99a, 0xa897, 0x4000, 0x715c, 0x81ff, 0x090c, 0x0dfa, 0x2148, - 0x080c, 0x1063, 0x9006, 0x705e, 0x918d, 0x0001, 0x2008, 0xa0a0, - 0x2048, 0x0126, 0x2091, 0x8000, 0x080c, 0x6ae9, 0x012e, 0xa09f, - 0x0000, 0xa0a3, 0x0000, 0x0070, 0x7063, 0x0001, 0x7152, 0x7054, - 0x9300, 0x7056, 0xa37a, 0xa48e, 0xa592, 0xa696, 0xa79a, 0x080c, - 0x112e, 0x9006, 0x00ee, 0x0005, 0x0096, 0xa88c, 0x90be, 0x7000, - 0x0148, 0x90be, 0x7100, 0x0130, 0x90be, 0x7200, 0x0118, 0x009e, - 0x0804, 0x351d, 0xa884, 0xa988, 0x080c, 0x276e, 0x1518, 0x080c, - 0x643f, 0x1500, 0x7126, 0xbe12, 0xbd16, 0xae7c, 0x080c, 0x4abf, - 0x01c8, 0x080c, 0x4abf, 0x01b0, 0x009e, 0xa867, 0x0000, 0xa868, - 0xc0fd, 0xa86a, 0xa823, 0x0000, 0xa804, 0x2048, 0x080c, 0xbfe3, - 0x1120, 0x2009, 0x0003, 0x0804, 0x351a, 0x7007, 0x0003, 0x701f, - 0x50bf, 0x0005, 0x009e, 0x2009, 0x0002, 0x0804, 0x351a, 0x7124, - 0x080c, 0x3286, 0xa820, 0x9086, 0x8001, 0x1120, 0x2009, 0x0004, - 0x0804, 0x351a, 0x2900, 0x7022, 0xa804, 0x0096, 0x2048, 0x8906, - 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x009e, 0x9080, - 0x0002, 0x0076, 0x0006, 0x2098, 0x20a0, 0x27e0, 0x27e8, 0x20a9, - 0x002a, 0x080c, 0x0fae, 0xaa6c, 0xab70, 0xac74, 0xad78, 0x2061, - 0x18b6, 0x2c44, 0xa06b, 0x0000, 0xae64, 0xaf8c, 0x97c6, 0x7000, - 0x0118, 0x97c6, 0x7100, 0x1148, 0x96c2, 0x0004, 0x0600, 0x2009, - 0x0004, 0x000e, 0x007e, 0x0804, 0x4b0b, 0x97c6, 0x7200, 0x11b8, - 0x96c2, 0x0054, 0x02a0, 0x000e, 0x007e, 0x2061, 0x18b6, 0x2c44, - 0xa076, 0xa772, 0xa07b, 0x002a, 0xa28e, 0xa392, 0xa496, 0xa59a, - 0x080c, 0x112e, 0x7007, 0x0002, 0x701f, 0x511b, 0x0005, 0x000e, - 0x007e, 0x0804, 0x351d, 0x7020, 0x2048, 0xa804, 0x2048, 0xa804, - 0x2048, 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, - 0x9080, 0x0002, 0x2098, 0x20a0, 0x27e0, 0x27e8, 0x20a9, 0x002a, - 0x080c, 0x0fae, 0x2100, 0x2238, 0x2061, 0x18b6, 0x2c44, 0xa28c, - 0xa390, 0xa494, 0xa598, 0x2009, 0x002a, 0x0804, 0x4b0b, 0x81ff, - 0x1904, 0x351a, 0x798c, 0x2001, 0x1956, 0x918c, 0x8000, 0x2102, - 0x080c, 0x4ad6, 0x0904, 0x351d, 0x080c, 0x67c3, 0x0120, 0x080c, - 0x67cb, 0x1904, 0x351d, 0x080c, 0x6566, 0x0904, 0x351a, 0x0126, - 0x2091, 0x8000, 0x080c, 0x662c, 0x012e, 0x0904, 0x351a, 0x2001, - 0x1956, 0x2004, 0xd0fc, 0x1904, 0x34e8, 0x0804, 0x4533, 0xa9a0, - 0x2001, 0x1956, 0x918c, 0x8000, 0xc18d, 0x2102, 0x080c, 0x4ae3, - 0x01a0, 0x080c, 0x67c3, 0x0118, 0x080c, 0x67cb, 0x1170, 0x080c, - 0x6566, 0x2009, 0x0002, 0x0128, 0x080c, 0x662c, 0x1170, 0x2009, - 0x0003, 0xa897, 0x4005, 0xa99a, 0x0010, 0xa897, 0x4006, 0x900e, - 0x9085, 0x0001, 0x2001, 0x0030, 0x0005, 0xa897, 0x4000, 0x2001, - 0x1956, 0x2004, 0xd0fc, 0x1128, 0x080c, 0x55e3, 0x0110, 0x9006, - 0x0018, 0x900e, 0x9085, 0x0001, 0x2001, 0x0000, 0x0005, 0x78a8, - 0xd08c, 0x1118, 0xd084, 0x0904, 0x44a8, 0x080c, 0x4af2, 0x0904, - 0x351d, 0x080c, 0x4abf, 0x1120, 0x2009, 0x0002, 0x0804, 0x351a, - 0x080c, 0x67c3, 0x0130, 0x908e, 0x0004, 0x0118, 0x908e, 0x0005, - 0x15a0, 0x78a8, 0xd08c, 0x0120, 0xb800, 0xc08c, 0xb802, 0x0028, - 0x080c, 0x55db, 0xd0b4, 0x0904, 0x44e2, 0x7884, 0x908e, 0x007e, - 0x0904, 0x44e2, 0x908e, 0x007f, 0x0904, 0x44e2, 0x908e, 0x0080, - 0x0904, 0x44e2, 0xb800, 0xd08c, 0x1904, 0x44e2, 0xa867, 0x0000, - 0xa868, 0xc0fd, 0xa86a, 0x080c, 0xc002, 0x1120, 0x2009, 0x0003, - 0x0804, 0x351a, 0x7007, 0x0003, 0x701f, 0x51e7, 0x0005, 0x080c, - 0x4af2, 0x0904, 0x351d, 0x0804, 0x44e2, 0x080c, 0x32df, 0x0108, - 0x0005, 0x2009, 0x1833, 0x210c, 0x81ff, 0x0120, 0x2009, 0x0001, - 0x0804, 0x351a, 0x080c, 0x55ef, 0x0120, 0x2009, 0x0007, 0x0804, - 0x351a, 0x080c, 0x67bb, 0x0120, 0x2009, 0x0008, 0x0804, 0x351a, - 0xb89c, 0xd0a4, 0x1118, 0xd0ac, 0x1904, 0x44e2, 0x9006, 0xa866, - 0xa832, 0xa868, 0xc0fd, 0xa86a, 0x080c, 0xc061, 0x1120, 0x2009, - 0x0003, 0x0804, 0x351a, 0x7007, 0x0003, 0x701f, 0x5220, 0x0005, - 0xa830, 0x9086, 0x0100, 0x1120, 0x2009, 0x0004, 0x0804, 0x552f, - 0x080c, 0x4af2, 0x0904, 0x351d, 0x0804, 0x51b9, 0x81ff, 0x2009, - 0x0001, 0x1904, 0x351a, 0x080c, 0x55ef, 0x2009, 0x0007, 0x1904, - 0x351a, 0x080c, 0x67bb, 0x0120, 0x2009, 0x0008, 0x0804, 0x351a, - 0x080c, 0x4af2, 0x0904, 0x351d, 0x080c, 0x67c3, 0x2009, 0x0009, - 0x1904, 0x351a, 0x080c, 0x4abf, 0x2009, 0x0002, 0x0904, 0x351a, - 0x9006, 0xa866, 0xa832, 0xa868, 0xc0fd, 0xa86a, 0x7988, 0x9194, - 0xff00, 0x918c, 0x00ff, 0x9006, 0x82ff, 0x1128, 0xc0ed, 0xa952, - 0x798c, 0xa956, 0x0038, 0x928e, 0x0100, 0x1904, 0x351d, 0xc0e5, - 0xa952, 0xa956, 0xa83e, 0x080c, 0xc2b4, 0x2009, 0x0003, 0x0904, - 0x351a, 0x7007, 0x0003, 0x701f, 0x5276, 0x0005, 0xa830, 0x9086, - 0x0100, 0x2009, 0x0004, 0x0904, 0x351a, 0x0804, 0x34e8, 0x7aa8, - 0x9284, 0xc000, 0x0148, 0xd2ec, 0x01a0, 0x080c, 0x55ef, 0x1188, - 0x2009, 0x0014, 0x0804, 0x351a, 0xd2dc, 0x1578, 0x81ff, 0x2009, - 0x0001, 0x1904, 0x351a, 0x080c, 0x55ef, 0x2009, 0x0007, 0x1904, - 0x351a, 0xd2f4, 0x0138, 0x9284, 0x5000, 0xc0d5, 0x080c, 0x55b5, - 0x0804, 0x34e8, 0xd2fc, 0x0160, 0x080c, 0x4af2, 0x0904, 0x351d, - 0x7984, 0x9284, 0x9000, 0xc0d5, 0x080c, 0x558a, 0x0804, 0x34e8, - 0x080c, 0x4af2, 0x0904, 0x351d, 0xb804, 0x9084, 0x00ff, 0x9086, - 0x0006, 0x2009, 0x0009, 0x1904, 0x5365, 0x080c, 0x4abf, 0x2009, - 0x0002, 0x0904, 0x5365, 0xa85c, 0x9080, 0x001b, 0xaf60, 0x2009, - 0x0008, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x080c, 0x4b08, 0x701f, - 0x52d2, 0x0005, 0xa86c, 0x9086, 0x0500, 0x1138, 0xa870, 0x9005, - 0x1120, 0xa874, 0x9084, 0xff00, 0x0110, 0x1904, 0x351d, 0xa866, - 0xa832, 0xa868, 0xc0fd, 0xa86a, 0x080c, 0x4af2, 0x1110, 0x0804, - 0x351d, 0x2009, 0x0043, 0x080c, 0xc31c, 0x2009, 0x0003, 0x0904, - 0x5365, 0x7007, 0x0003, 0x701f, 0x52f6, 0x0005, 0xa830, 0x9086, - 0x0100, 0x2009, 0x0004, 0x0904, 0x5365, 0x7984, 0x7aa8, 0x9284, - 0x1000, 0xe085, 0x080c, 0x558a, 0x0804, 0x34e8, 0x00c6, 0xaab0, - 0x9284, 0xc000, 0x0148, 0xd2ec, 0x0170, 0x080c, 0x55ef, 0x1158, - 0x2009, 0x0014, 0x0804, 0x5354, 0x2061, 0x1800, 0x080c, 0x55ef, + 0x9386, 0x003c, 0x0170, 0x0c20, 0x83ff, 0x1148, 0x7224, 0x900e, + 0x2001, 0x0003, 0x080c, 0x847e, 0x2208, 0x0804, 0x33f2, 0x7033, + 0x0001, 0x7122, 0x7024, 0x9300, 0x7026, 0x2061, 0x18b6, 0x2c44, + 0xa06b, 0x0000, 0xa37a, 0x7028, 0xa076, 0x7034, 0xa072, 0xa48e, + 0xa592, 0xa696, 0xa79a, 0x080c, 0x1134, 0x7007, 0x0002, 0x701f, + 0x4e52, 0x0005, 0x7030, 0x9005, 0x1178, 0x7120, 0x7028, 0x20a0, + 0x901e, 0x7034, 0x20e8, 0x2061, 0x18b6, 0x2c44, 0xa48c, 0xa590, + 0xa694, 0xa798, 0x0804, 0x4e10, 0x7224, 0x900e, 0x2001, 0x0003, + 0x080c, 0x847e, 0x2208, 0x0804, 0x33f2, 0x00f6, 0x00e6, 0x080c, + 0x54ef, 0x2009, 0x0007, 0x1904, 0x4ee5, 0x2071, 0x189c, 0x745c, + 0x84ff, 0x2009, 0x000e, 0x1904, 0x4ee5, 0xac9c, 0xad98, 0xaea4, + 0xafa0, 0x0096, 0x080c, 0x1050, 0x2009, 0x0002, 0x0904, 0x4ee5, + 0x2900, 0x705e, 0x900e, 0x901e, 0x7356, 0x7362, 0xa860, 0x7066, + 0xa85c, 0x9080, 0x0003, 0x705a, 0x20a0, 0x91d8, 0x1000, 0x2b5c, + 0x8bff, 0x0178, 0x080c, 0x66c9, 0x0118, 0x080c, 0x66d1, 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, + 0x847e, 0x2208, 0x009e, 0xa897, 0x4000, 0xa99a, 0x715c, 0x81ff, + 0x090c, 0x0df6, 0x2148, 0x080c, 0x1069, 0x9006, 0x705e, 0x918d, + 0x0001, 0x2008, 0x0418, 0x7063, 0x0001, 0x7152, 0x7054, 0x9300, + 0x7056, 0x2061, 0x18b7, 0x2c44, 0xa37a, 0x7058, 0xa076, 0x7064, + 0xa072, 0xa48e, 0xa592, 0xa696, 0xa79a, 0xa09f, 0x4ef1, 0x000e, + 0xa0a2, 0x080c, 0x1134, 0x9006, 0x0048, 0x009e, 0xa897, 0x4005, + 0xa99a, 0x900e, 0x9085, 0x0001, 0x2001, 0x0030, 0x00ee, 0x00fe, + 0x0005, 0x00f6, 0xa0a0, 0x904d, 0x090c, 0x0df6, 0x00e6, 0x2071, + 0x189c, 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, 0x847e, 0xaa9a, 0x715c, + 0x81ff, 0x090c, 0x0df6, 0x2148, 0x080c, 0x1069, 0x705f, 0x0000, + 0xa0a0, 0x2048, 0x0126, 0x2091, 0x8000, 0x080c, 0x6a22, 0x012e, + 0xa09f, 0x0000, 0xa0a3, 0x0000, 0x00ee, 0x00fe, 0x0005, 0x91d8, + 0x1000, 0x2b5c, 0x8bff, 0x0178, 0x080c, 0x66c9, 0x0118, 0x080c, + 0x66d1, 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, 0x0df6, 0x2148, 0x080c, + 0x1069, 0x9006, 0x705e, 0x918d, 0x0001, 0x2008, 0xa0a0, 0x2048, + 0x0126, 0x2091, 0x8000, 0x080c, 0x6a22, 0x012e, 0xa09f, 0x0000, + 0xa0a3, 0x0000, 0x0070, 0x7063, 0x0001, 0x7152, 0x7054, 0x9300, + 0x7056, 0xa37a, 0xa48e, 0xa592, 0xa696, 0xa79a, 0x080c, 0x1134, + 0x9006, 0x00ee, 0x0005, 0x0096, 0xa88c, 0x90be, 0x7000, 0x0148, + 0x90be, 0x7100, 0x0130, 0x90be, 0x7200, 0x0118, 0x009e, 0x0804, + 0x3427, 0xa884, 0xa988, 0x080c, 0x266d, 0x1518, 0x080c, 0x6343, + 0x1500, 0x7126, 0xbe12, 0xbd16, 0xae7c, 0x080c, 0x49b7, 0x01c8, + 0x080c, 0x49b7, 0x01b0, 0x009e, 0xa867, 0x0000, 0xa868, 0xc0fd, + 0xa86a, 0xa823, 0x0000, 0xa804, 0x2048, 0x080c, 0xbefa, 0x1120, + 0x2009, 0x0003, 0x0804, 0x3424, 0x7007, 0x0003, 0x701f, 0x4fbe, + 0x0005, 0x009e, 0x2009, 0x0002, 0x0804, 0x3424, 0x7124, 0x080c, + 0x3190, 0xa820, 0x9086, 0x8001, 0x1120, 0x2009, 0x0004, 0x0804, + 0x3424, 0x2900, 0x7022, 0xa804, 0x0096, 0x2048, 0x8906, 0x8006, + 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x009e, 0x9080, 0x0002, + 0x0076, 0x0006, 0x2098, 0x20a0, 0x27e0, 0x27e8, 0x20a9, 0x002a, + 0x080c, 0x0fb4, 0xaa6c, 0xab70, 0xac74, 0xad78, 0x2061, 0x18b6, + 0x2c44, 0xa06b, 0x0000, 0xae64, 0xaf8c, 0x97c6, 0x7000, 0x0118, + 0x97c6, 0x7100, 0x1148, 0x96c2, 0x0004, 0x0600, 0x2009, 0x0004, + 0x000e, 0x007e, 0x0804, 0x4a03, 0x97c6, 0x7200, 0x11b8, 0x96c2, + 0x0054, 0x02a0, 0x000e, 0x007e, 0x2061, 0x18b6, 0x2c44, 0xa076, + 0xa772, 0xa07b, 0x002a, 0xa28e, 0xa392, 0xa496, 0xa59a, 0x080c, + 0x1134, 0x7007, 0x0002, 0x701f, 0x501a, 0x0005, 0x000e, 0x007e, + 0x0804, 0x3427, 0x7020, 0x2048, 0xa804, 0x2048, 0xa804, 0x2048, + 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, + 0x0002, 0x2098, 0x20a0, 0x27e0, 0x27e8, 0x20a9, 0x002a, 0x080c, + 0x0fb4, 0x2100, 0x2238, 0x2061, 0x18b6, 0x2c44, 0xa28c, 0xa390, + 0xa494, 0xa598, 0x2009, 0x002a, 0x0804, 0x4a03, 0x81ff, 0x1904, + 0x3424, 0x798c, 0x2001, 0x1958, 0x918c, 0x8000, 0x2102, 0x080c, + 0x49ce, 0x0904, 0x3427, 0x080c, 0x66c9, 0x0120, 0x080c, 0x66d1, + 0x1904, 0x3427, 0x080c, 0x646a, 0x0904, 0x3424, 0x0126, 0x2091, + 0x8000, 0x080c, 0x6530, 0x012e, 0x0904, 0x3424, 0x2001, 0x1958, + 0x2004, 0xd0fc, 0x1904, 0x33f2, 0x0804, 0x4461, 0xa9a0, 0x2001, + 0x1958, 0x918c, 0x8000, 0xc18d, 0x2102, 0x080c, 0x49db, 0x01a0, + 0x080c, 0x66c9, 0x0118, 0x080c, 0x66d1, 0x1170, 0x080c, 0x646a, + 0x2009, 0x0002, 0x0128, 0x080c, 0x6530, 0x1170, 0x2009, 0x0003, + 0xa897, 0x4005, 0xa99a, 0x0010, 0xa897, 0x4006, 0x900e, 0x9085, + 0x0001, 0x2001, 0x0030, 0x0005, 0xa897, 0x4000, 0x2001, 0x1958, + 0x2004, 0xd0fc, 0x1128, 0x080c, 0x54e3, 0x0110, 0x9006, 0x0018, + 0x900e, 0x9085, 0x0001, 0x2001, 0x0000, 0x0005, 0x78a8, 0xd08c, + 0x1118, 0xd084, 0x0904, 0x43d6, 0x080c, 0x49ea, 0x0904, 0x3427, + 0x080c, 0x49b7, 0x1120, 0x2009, 0x0002, 0x0804, 0x3424, 0x080c, + 0x66c9, 0x0130, 0x908e, 0x0004, 0x0118, 0x908e, 0x0005, 0x15a0, + 0x78a8, 0xd08c, 0x0120, 0xb800, 0xc08c, 0xb802, 0x0028, 0x080c, + 0x54db, 0xd0b4, 0x0904, 0x4410, 0x7884, 0x908e, 0x007e, 0x0904, + 0x4410, 0x908e, 0x007f, 0x0904, 0x4410, 0x908e, 0x0080, 0x0904, + 0x4410, 0xb800, 0xd08c, 0x1904, 0x4410, 0xa867, 0x0000, 0xa868, + 0xc0fd, 0xa86a, 0x080c, 0xbf19, 0x1120, 0x2009, 0x0003, 0x0804, + 0x3424, 0x7007, 0x0003, 0x701f, 0x50e6, 0x0005, 0x080c, 0x49ea, + 0x0904, 0x3427, 0x0804, 0x4410, 0x080c, 0x31e9, 0x0108, 0x0005, + 0x2009, 0x1833, 0x210c, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, + 0x3424, 0x080c, 0x54ef, 0x0120, 0x2009, 0x0007, 0x0804, 0x3424, + 0x080c, 0x66c1, 0x0120, 0x2009, 0x0008, 0x0804, 0x3424, 0xb89c, + 0xd0a4, 0x1118, 0xd0ac, 0x1904, 0x4410, 0x9006, 0xa866, 0xa832, + 0xa868, 0xc0fd, 0xa86a, 0x080c, 0xbf78, 0x1120, 0x2009, 0x0003, + 0x0804, 0x3424, 0x7007, 0x0003, 0x701f, 0x511f, 0x0005, 0xa830, + 0x9086, 0x0100, 0x1120, 0x2009, 0x0004, 0x0804, 0x542f, 0x080c, + 0x49ea, 0x0904, 0x3427, 0x0804, 0x50b8, 0x81ff, 0x2009, 0x0001, + 0x1904, 0x3424, 0x080c, 0x54ef, 0x2009, 0x0007, 0x1904, 0x3424, + 0x080c, 0x66c1, 0x0120, 0x2009, 0x0008, 0x0804, 0x3424, 0x080c, + 0x49ea, 0x0904, 0x3427, 0x080c, 0x66c9, 0x2009, 0x0009, 0x1904, + 0x3424, 0x080c, 0x49b7, 0x2009, 0x0002, 0x0904, 0x3424, 0x9006, + 0xa866, 0xa832, 0xa868, 0xc0fd, 0xa86a, 0x7988, 0xa95a, 0x9194, + 0xfd00, 0x918c, 0x00ff, 0x9006, 0x82ff, 0x1128, 0xc0ed, 0xa952, + 0x798c, 0xa956, 0x0038, 0x928e, 0x0100, 0x1904, 0x3427, 0xc0e5, + 0xa952, 0xa956, 0xa83e, 0x080c, 0xc1cb, 0x2009, 0x0003, 0x0904, + 0x3424, 0x7007, 0x0003, 0x701f, 0x5176, 0x0005, 0xa830, 0x9086, + 0x0100, 0x2009, 0x0004, 0x0904, 0x3424, 0x0804, 0x33f2, 0x7aa8, + 0x9284, 0xc000, 0x0148, 0xd2ec, 0x01a0, 0x080c, 0x54ef, 0x1188, + 0x2009, 0x0014, 0x0804, 0x3424, 0xd2dc, 0x1578, 0x81ff, 0x2009, + 0x0001, 0x1904, 0x3424, 0x080c, 0x54ef, 0x2009, 0x0007, 0x1904, + 0x3424, 0xd2f4, 0x0138, 0x9284, 0x5000, 0xc0d5, 0x080c, 0x54b5, + 0x0804, 0x33f2, 0xd2fc, 0x0160, 0x080c, 0x49ea, 0x0904, 0x3427, + 0x7984, 0x9284, 0x9000, 0xc0d5, 0x080c, 0x548a, 0x0804, 0x33f2, + 0x080c, 0x49ea, 0x0904, 0x3427, 0xb804, 0x9084, 0x00ff, 0x9086, + 0x0006, 0x2009, 0x0009, 0x1904, 0x5265, 0x080c, 0x49b7, 0x2009, + 0x0002, 0x0904, 0x5265, 0xa85c, 0x9080, 0x001b, 0xaf60, 0x2009, + 0x0008, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x080c, 0x4a00, 0x701f, + 0x51d2, 0x0005, 0xa86c, 0x9086, 0x0500, 0x1138, 0xa870, 0x9005, + 0x1120, 0xa874, 0x9084, 0xff00, 0x0110, 0x1904, 0x3427, 0xa866, + 0xa832, 0xa868, 0xc0fd, 0xa86a, 0x080c, 0x49ea, 0x1110, 0x0804, + 0x3427, 0x2009, 0x0043, 0x080c, 0xc237, 0x2009, 0x0003, 0x0904, + 0x5265, 0x7007, 0x0003, 0x701f, 0x51f6, 0x0005, 0xa830, 0x9086, + 0x0100, 0x2009, 0x0004, 0x0904, 0x5265, 0x7984, 0x7aa8, 0x9284, + 0x1000, 0xc0d5, 0x080c, 0x548a, 0x0804, 0x33f2, 0x00c6, 0xaab0, + 0x9284, 0xc000, 0x0148, 0xd2ec, 0x0170, 0x080c, 0x54ef, 0x1158, + 0x2009, 0x0014, 0x0804, 0x5254, 0x2061, 0x1800, 0x080c, 0x54ef, 0x2009, 0x0007, 0x15c8, 0xd2f4, 0x0130, 0x9284, 0x5000, 0xc0d5, - 0x080c, 0x55b5, 0x0058, 0xd2fc, 0x0180, 0x080c, 0x4af0, 0x0590, - 0xa998, 0x9284, 0x9000, 0xc0d5, 0x080c, 0x558a, 0xa87b, 0x0000, - 0xa883, 0x0000, 0xa897, 0x4000, 0x0438, 0x080c, 0x4af0, 0x0510, - 0x080c, 0x67c3, 0x2009, 0x0009, 0x11b8, 0xa8c4, 0x9086, 0x0500, + 0x080c, 0x54b5, 0x0058, 0xd2fc, 0x0180, 0x080c, 0x49e8, 0x0590, + 0xa998, 0x9284, 0x9000, 0xc0d5, 0x080c, 0x548a, 0xa87b, 0x0000, + 0xa883, 0x0000, 0xa897, 0x4000, 0x0438, 0x080c, 0x49e8, 0x0510, + 0x080c, 0x66c9, 0x2009, 0x0009, 0x11b8, 0xa8c4, 0x9086, 0x0500, 0x11c8, 0xa8c8, 0x9005, 0x11b0, 0xa8cc, 0x9084, 0xff00, 0x1190, - 0x080c, 0x4af0, 0x1108, 0x0070, 0x2009, 0x004b, 0x080c, 0xc31c, + 0x080c, 0x49e8, 0x1108, 0x0070, 0x2009, 0x004b, 0x080c, 0xc237, 0x2009, 0x0003, 0x0108, 0x0078, 0x0431, 0x19c0, 0xa897, 0x4005, 0xa99a, 0x0010, 0xa897, 0x4006, 0x900e, 0x9085, 0x0001, 0x2001, 0x0030, 0x00ce, 0x0005, 0x9006, 0x0ce0, 0x7aa8, 0xd2dc, 0x0904, - 0x351a, 0x0016, 0x7984, 0x9284, 0x1000, 0xc0fd, 0x080c, 0x558a, - 0x001e, 0x1904, 0x351a, 0x0804, 0x34e8, 0x00f6, 0x2d78, 0xaab0, + 0x3424, 0x0016, 0x7984, 0x9284, 0x1000, 0xc0fd, 0x080c, 0x548a, + 0x001e, 0x1904, 0x3424, 0x0804, 0x33f2, 0x00f6, 0x2d78, 0xaab0, 0x0021, 0x00fe, 0x0005, 0xaab0, 0xc2d5, 0xd2dc, 0x0150, 0x0016, - 0xa998, 0x9284, 0x1400, 0xc0fd, 0x080c, 0x558a, 0x001e, 0x9085, - 0x0001, 0x0005, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x351a, - 0x080c, 0x55ef, 0x0120, 0x2009, 0x0007, 0x0804, 0x351a, 0x7984, - 0x7ea8, 0x96b4, 0x00ff, 0x080c, 0x649f, 0x1904, 0x351d, 0x9186, - 0x007f, 0x0138, 0x080c, 0x67c3, 0x0120, 0x2009, 0x0009, 0x0804, - 0x351a, 0x080c, 0x4abf, 0x1120, 0x2009, 0x0002, 0x0804, 0x351a, + 0xa998, 0x9284, 0x1400, 0xc0fd, 0x080c, 0x548a, 0x001e, 0x9085, + 0x0001, 0x0005, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x3424, + 0x080c, 0x54ef, 0x0120, 0x2009, 0x0007, 0x0804, 0x3424, 0x7984, + 0x7ea8, 0x96b4, 0x00ff, 0x080c, 0x63a3, 0x1904, 0x3427, 0x9186, + 0x007f, 0x0138, 0x080c, 0x66c9, 0x0120, 0x2009, 0x0009, 0x0804, + 0x3424, 0x080c, 0x49b7, 0x1120, 0x2009, 0x0002, 0x0804, 0x3424, 0xa867, 0x0000, 0xa868, 0xc0fd, 0xa86a, 0x2001, 0x0100, 0x8007, - 0xa80a, 0x080c, 0xc01c, 0x1120, 0x2009, 0x0003, 0x0804, 0x351a, - 0x7007, 0x0003, 0x701f, 0x53c5, 0x0005, 0xa808, 0x8007, 0x9086, - 0x0100, 0x1120, 0x2009, 0x0004, 0x0804, 0x351a, 0xa8e0, 0xa866, + 0xa80a, 0x080c, 0xbf33, 0x1120, 0x2009, 0x0003, 0x0804, 0x3424, + 0x7007, 0x0003, 0x701f, 0x52c5, 0x0005, 0xa808, 0x8007, 0x9086, + 0x0100, 0x1120, 0x2009, 0x0004, 0x0804, 0x3424, 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, 0x4b0b, 0x080c, 0x4abf, 0x1120, 0x2009, - 0x0002, 0x0804, 0x351a, 0x7984, 0x9194, 0xff00, 0x918c, 0x00ff, - 0x8217, 0x82ff, 0x1118, 0x7023, 0x198b, 0x0040, 0x92c6, 0x0001, - 0x1118, 0x7023, 0x19a5, 0x0010, 0x0804, 0x351d, 0x2009, 0x001a, + 0x7c9c, 0x7d98, 0x0804, 0x4a03, 0x080c, 0x49b7, 0x1120, 0x2009, + 0x0002, 0x0804, 0x3424, 0x7984, 0x9194, 0xff00, 0x918c, 0x00ff, + 0x8217, 0x82ff, 0x1118, 0x7023, 0x198e, 0x0040, 0x92c6, 0x0001, + 0x1118, 0x7023, 0x19a8, 0x0010, 0x0804, 0x3427, 0x2009, 0x001a, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0xa85c, 0x9080, 0x0019, 0xaf60, - 0x080c, 0x4b08, 0x701f, 0x5415, 0x0005, 0x2001, 0x182d, 0x2003, + 0x080c, 0x4a00, 0x701f, 0x5315, 0x0005, 0x2001, 0x182d, 0x2003, 0x0001, 0xa85c, 0x9080, 0x0019, 0x2098, 0xa860, 0x20e0, 0x20a9, - 0x001a, 0x7020, 0x20a0, 0x20e9, 0x0001, 0x4003, 0x0804, 0x34e8, - 0x080c, 0x4abf, 0x1120, 0x2009, 0x0002, 0x0804, 0x351a, 0x7984, + 0x001a, 0x7020, 0x20a0, 0x20e9, 0x0001, 0x4003, 0x0804, 0x33f2, + 0x080c, 0x49b7, 0x1120, 0x2009, 0x0002, 0x0804, 0x3424, 0x7984, 0x9194, 0xff00, 0x918c, 0x00ff, 0x8217, 0x82ff, 0x1118, 0x2099, - 0x198b, 0x0040, 0x92c6, 0x0001, 0x1118, 0x2099, 0x19a5, 0x0010, - 0x0804, 0x351d, 0xa85c, 0x9080, 0x0019, 0x20a0, 0xa860, 0x20e8, + 0x198e, 0x0040, 0x92c6, 0x0001, 0x1118, 0x2099, 0x19a8, 0x0010, + 0x0804, 0x3427, 0xa85c, 0x9080, 0x0019, 0x20a0, 0xa860, 0x20e8, 0x20a9, 0x001a, 0x20e1, 0x0001, 0x4003, 0x2009, 0x001a, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0xa85c, 0x9080, 0x0019, 0xaf60, 0x0804, - 0x4b0b, 0x7884, 0x908a, 0x1000, 0x1a04, 0x351d, 0x0126, 0x2091, - 0x8000, 0x8003, 0x800b, 0x810b, 0x9108, 0x00c6, 0x2061, 0x19d2, - 0x6142, 0x00ce, 0x012e, 0x0804, 0x34e8, 0x00c6, 0x080c, 0x7207, - 0x1160, 0x080c, 0x7504, 0x080c, 0x5f2b, 0x9085, 0x0001, 0x080c, - 0x724e, 0x080c, 0x7127, 0x080c, 0x0dfa, 0x2061, 0x1800, 0x6030, - 0xc09d, 0x6032, 0x080c, 0x5dea, 0x00ce, 0x0005, 0x00c6, 0x2001, - 0x1800, 0x2004, 0x908e, 0x0000, 0x0904, 0x351a, 0x7884, 0x9005, - 0x0188, 0x7888, 0x2061, 0x1974, 0x2c0c, 0x2062, 0x080c, 0x2b98, - 0x01a0, 0x080c, 0x2ba0, 0x0188, 0x080c, 0x2ba8, 0x0170, 0x2162, - 0x0804, 0x351d, 0x2061, 0x0100, 0x6038, 0x9086, 0x0007, 0x1118, + 0x4a03, 0x7884, 0x908a, 0x1000, 0x1a04, 0x3427, 0x0126, 0x2091, + 0x8000, 0x8003, 0x800b, 0x810b, 0x9108, 0x00c6, 0x2061, 0x19d5, + 0x614a, 0x00ce, 0x012e, 0x0804, 0x33f2, 0x00c6, 0x080c, 0x717e, + 0x1160, 0x080c, 0x747a, 0x080c, 0x5e2f, 0x9085, 0x0001, 0x080c, + 0x71c2, 0x080c, 0x709e, 0x080c, 0x0df6, 0x2061, 0x1800, 0x6030, + 0xc09d, 0x6032, 0x080c, 0x5cee, 0x00ce, 0x0005, 0x00c6, 0x2001, + 0x1800, 0x2004, 0x908e, 0x0000, 0x0904, 0x3424, 0x7884, 0x9005, + 0x0188, 0x7888, 0x2061, 0x1976, 0x2c0c, 0x2062, 0x080c, 0x2a7f, + 0x01a0, 0x080c, 0x2a87, 0x0188, 0x080c, 0x2a8f, 0x0170, 0x2162, + 0x0804, 0x3427, 0x2061, 0x0100, 0x6038, 0x9086, 0x0007, 0x1118, 0x2009, 0x0001, 0x0010, 0x2009, 0x0000, 0x7884, 0x9086, 0x0002, 0x1568, 0x2061, 0x0100, 0x6028, 0xc09c, 0x602a, 0x0026, 0x2011, - 0x0003, 0x080c, 0x9a0f, 0x2011, 0x0002, 0x080c, 0x9a19, 0x002e, - 0x080c, 0x9927, 0x0036, 0x901e, 0x080c, 0x999d, 0x003e, 0x60e3, - 0x0000, 0x080c, 0xdc13, 0x080c, 0xdc2e, 0x9085, 0x0001, 0x080c, - 0x724e, 0x9006, 0x080c, 0x2c88, 0x2001, 0x1800, 0x2003, 0x0004, - 0x2001, 0x197f, 0x2003, 0x0000, 0x6027, 0x0008, 0x00ce, 0x0804, - 0x34e8, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x351a, 0x080c, - 0x55ef, 0x0120, 0x2009, 0x0007, 0x0804, 0x351a, 0x7984, 0x7ea8, - 0x96b4, 0x00ff, 0x080c, 0x649f, 0x1904, 0x351d, 0x9186, 0x007f, - 0x0138, 0x080c, 0x67c3, 0x0120, 0x2009, 0x0009, 0x0804, 0x351a, - 0x080c, 0x4abf, 0x1120, 0x2009, 0x0002, 0x0804, 0x351a, 0xa867, - 0x0000, 0xa868, 0xc0fd, 0xa86a, 0x080c, 0xc01f, 0x1120, 0x2009, - 0x0003, 0x0804, 0x351a, 0x7007, 0x0003, 0x701f, 0x5518, 0x0005, - 0xa830, 0x9086, 0x0100, 0x1120, 0x2009, 0x0004, 0x0804, 0x351a, + 0x0003, 0x080c, 0x9923, 0x2011, 0x0002, 0x080c, 0x992d, 0x002e, + 0x080c, 0x983b, 0x0036, 0x901e, 0x080c, 0x98b1, 0x003e, 0x60e3, + 0x0000, 0x080c, 0xdbdb, 0x080c, 0xdbf6, 0x9085, 0x0001, 0x080c, + 0x71c2, 0x9006, 0x080c, 0x2b6f, 0x2001, 0x1800, 0x2003, 0x0004, + 0x2001, 0x1982, 0x2003, 0x0000, 0x6027, 0x0008, 0x00ce, 0x0804, + 0x33f2, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x3424, 0x080c, + 0x54ef, 0x0120, 0x2009, 0x0007, 0x0804, 0x3424, 0x7984, 0x7ea8, + 0x96b4, 0x00ff, 0x080c, 0x63a3, 0x1904, 0x3427, 0x9186, 0x007f, + 0x0138, 0x080c, 0x66c9, 0x0120, 0x2009, 0x0009, 0x0804, 0x3424, + 0x080c, 0x49b7, 0x1120, 0x2009, 0x0002, 0x0804, 0x3424, 0xa867, + 0x0000, 0xa868, 0xc0fd, 0xa86a, 0x080c, 0xbf36, 0x1120, 0x2009, + 0x0003, 0x0804, 0x3424, 0x7007, 0x0003, 0x701f, 0x5418, 0x0005, + 0xa830, 0x9086, 0x0100, 0x1120, 0x2009, 0x0004, 0x0804, 0x3424, 0xa8e0, 0xa866, 0xa834, 0x8007, 0x800c, 0xa85c, 0x9080, 0x000c, - 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0xaf60, 0x0804, 0x4b0b, 0xa898, - 0x9086, 0x000d, 0x1904, 0x351a, 0x2021, 0x4005, 0x0126, 0x2091, - 0x8000, 0x0e04, 0x553c, 0x0010, 0x012e, 0x0cc0, 0x7c36, 0x9486, + 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0xaf60, 0x0804, 0x4a03, 0xa898, + 0x9086, 0x000d, 0x1904, 0x3424, 0x2021, 0x4005, 0x0126, 0x2091, + 0x8000, 0x0e04, 0x543c, 0x0010, 0x012e, 0x0cc0, 0x7c36, 0x9486, 0x4000, 0x0118, 0x7833, 0x0011, 0x0010, 0x7833, 0x0010, 0x7883, 0x4005, 0xa998, 0x7986, 0xa9a4, 0x799a, 0xa9a8, 0x799e, 0x080c, - 0x4afb, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, - 0x11e0, 0x7007, 0x0001, 0x2091, 0x5000, 0x700f, 0x0000, 0x012e, - 0x0005, 0x0126, 0x2091, 0x8000, 0x00c6, 0x2061, 0x19d2, 0x7984, - 0x6152, 0x614e, 0x6057, 0x0000, 0x604b, 0x0009, 0x7898, 0x606a, - 0x789c, 0x6066, 0x7888, 0x6062, 0x788c, 0x605e, 0x2001, 0x19e0, - 0x2044, 0x2001, 0x19e7, 0xa076, 0xa060, 0xa072, 0xa07b, 0x0001, + 0x49f3, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, + 0x11e6, 0x7007, 0x0001, 0x2091, 0x5000, 0x700f, 0x0000, 0x012e, + 0x0005, 0x0126, 0x2091, 0x8000, 0x00c6, 0x2061, 0x19d5, 0x7984, + 0x615a, 0x6156, 0x605f, 0x0000, 0x6053, 0x0009, 0x7898, 0x6072, + 0x789c, 0x606e, 0x7888, 0x606a, 0x788c, 0x6066, 0x2001, 0x19e5, + 0x2044, 0x2001, 0x19ec, 0xa076, 0xa060, 0xa072, 0xa07b, 0x0001, 0xa07f, 0x0002, 0xa06b, 0x0000, 0xa09f, 0x0000, 0x00ce, 0x012e, - 0x0804, 0x34e8, 0x0126, 0x2091, 0x8000, 0x00b6, 0x00c6, 0x90e4, + 0x0804, 0x33f2, 0x0126, 0x2091, 0x8000, 0x00b6, 0x00c6, 0x90e4, 0xc000, 0x0168, 0x0006, 0xd0d4, 0x0130, 0x0036, 0x2019, 0x0029, - 0x080c, 0x32a4, 0x003e, 0x080c, 0xbe84, 0x000e, 0x1198, 0xd0e4, - 0x0160, 0x9180, 0x1000, 0x2004, 0x905d, 0x0160, 0x080c, 0x5f45, - 0x080c, 0xa062, 0x0110, 0xb817, 0x0000, 0x9006, 0x00ce, 0x00be, + 0x080c, 0x31ae, 0x003e, 0x080c, 0xbd9b, 0x000e, 0x1198, 0xd0e4, + 0x0160, 0x9180, 0x1000, 0x2004, 0x905d, 0x0160, 0x080c, 0x5e49, + 0x080c, 0x9f69, 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, 0x558a, 0x002e, 0x001e, 0x8108, 0x1f04, 0x55bd, + 0x2200, 0x080c, 0x548a, 0x002e, 0x001e, 0x8108, 0x1f04, 0x54bd, 0x015e, 0x012e, 0x0005, 0x2001, 0x185c, 0x2004, 0x0005, 0x2001, 0x187b, 0x2004, 0x0005, 0x0006, 0x2001, 0x1810, 0x2004, 0xd0d4, 0x000e, 0x0005, 0x2001, 0x180e, 0x2004, 0xd0b4, 0x0005, 0x2001, 0x1800, 0x2004, 0x9086, 0x0003, 0x0005, 0x0016, 0x00e6, 0x2071, 0x189c, 0x7108, 0x910d, 0x710a, 0x00ee, 0x001e, 0x0005, 0x79a4, - 0x9182, 0x0081, 0x1a04, 0x351d, 0x810c, 0x0016, 0x080c, 0x4abf, - 0x0170, 0x080c, 0x0f39, 0x2100, 0x2238, 0x7d84, 0x7c88, 0x7b8c, - 0x7a90, 0x001e, 0x080c, 0x4b08, 0x701f, 0x561b, 0x0005, 0x2009, - 0x0002, 0x0804, 0x351a, 0x2079, 0x0000, 0x7d94, 0x7c98, 0x7ba8, - 0x7aac, 0x79a4, 0x810c, 0x2061, 0x18b6, 0x2c44, 0xa770, 0xa074, - 0x2071, 0x189c, 0x080c, 0x4b0b, 0x701f, 0x562f, 0x0005, 0x2061, - 0x18b6, 0x2c44, 0x0016, 0x0026, 0xa270, 0xa174, 0x080c, 0x0f41, - 0x002e, 0x001e, 0x080c, 0x0fee, 0x9006, 0xa802, 0xa806, 0x0804, - 0x34e8, 0x0126, 0x0156, 0x0136, 0x0146, 0x01c6, 0x01d6, 0x00c6, - 0x00d6, 0x00e6, 0x00f6, 0x2061, 0x0100, 0x2069, 0x0200, 0x2071, - 0x1800, 0x6044, 0xd0a4, 0x11e8, 0xd084, 0x0118, 0x080c, 0x57ea, - 0x0068, 0xd08c, 0x0118, 0x080c, 0x56f3, 0x0040, 0xd094, 0x0118, - 0x080c, 0x56c3, 0x0018, 0xd09c, 0x0108, 0x0099, 0x00fe, 0x00ee, - 0x00de, 0x00ce, 0x01de, 0x01ce, 0x014e, 0x013e, 0x015e, 0x012e, - 0x0005, 0x0016, 0x6128, 0xd19c, 0x1110, 0xc19d, 0x612a, 0x001e, - 0x0c68, 0x0006, 0x7094, 0x9005, 0x000e, 0x0120, 0x7097, 0x0000, - 0x708f, 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, 0x5ea7, 0x00f0, 0x6040, 0x9084, 0x0010, 0x9085, - 0x0140, 0x6042, 0x6043, 0x0000, 0x7083, 0x0000, 0x709f, 0x0001, - 0x70c3, 0x0000, 0x70db, 0x0000, 0x2009, 0x1c80, 0x200b, 0x0000, - 0x7093, 0x0000, 0x7087, 0x000f, 0x2009, 0x000f, 0x2011, 0x5d8d, - 0x080c, 0x836c, 0x0005, 0x2001, 0x187d, 0x2004, 0xd08c, 0x0110, - 0x705b, 0xffff, 0x7084, 0x9005, 0x1528, 0x2011, 0x5d8d, 0x080c, - 0x82da, 0x6040, 0x9094, 0x0010, 0x9285, 0x0020, 0x6042, 0x20a9, - 0x00c8, 0x6044, 0xd08c, 0x1168, 0x1f04, 0x56d9, 0x6242, 0x7097, - 0x0000, 0x6040, 0x9094, 0x0010, 0x9285, 0x0080, 0x6042, 0x6242, - 0x0048, 0x6242, 0x7097, 0x0000, 0x708b, 0x0000, 0x9006, 0x080c, - 0x5f30, 0x0000, 0x0005, 0x7088, 0x908a, 0x0003, 0x1a0c, 0x0dfa, - 0x000b, 0x0005, 0x56fd, 0x574e, 0x57e9, 0x00f6, 0x0016, 0x6900, - 0x918c, 0x0800, 0x708b, 0x0001, 0x2001, 0x015d, 0x2003, 0x0000, - 0x6803, 0x00fc, 0x20a9, 0x0004, 0x6800, 0x9084, 0x00fc, 0x0120, - 0x1f04, 0x570c, 0x080c, 0x0dfa, 0x68a0, 0x68a2, 0x689c, 0x689e, - 0x6898, 0x689a, 0xa001, 0x918d, 0x1600, 0x6902, 0x001e, 0x6837, - 0x0020, 0x080c, 0x5f0c, 0x2079, 0x1c00, 0x7833, 0x1101, 0x7837, - 0x0000, 0x20e1, 0x0001, 0x2099, 0x1805, 0x20e9, 0x0001, 0x20a1, - 0x1c0e, 0x20a9, 0x0004, 0x4003, 0x080c, 0x9eeb, 0x20e1, 0x0001, - 0x2099, 0x1c00, 0x20e9, 0x0000, 0x20a1, 0x0240, 0x20a9, 0x0014, - 0x4003, 0x60c3, 0x000c, 0x600f, 0x0000, 0x080c, 0x5dbe, 0x00fe, - 0x9006, 0x708e, 0x6043, 0x0008, 0x6042, 0x0005, 0x00f6, 0x708c, - 0x708f, 0x0000, 0x9025, 0x0904, 0x57c6, 0x6020, 0xd0b4, 0x1904, - 0x57c4, 0x719c, 0x81ff, 0x0904, 0x57b2, 0x9486, 0x000c, 0x1904, - 0x57bf, 0x9480, 0x0018, 0x8004, 0x20a8, 0x080c, 0x5f05, 0x2011, - 0x0260, 0x2019, 0x1c00, 0x220c, 0x2304, 0x9106, 0x11e8, 0x8210, - 0x8318, 0x1f04, 0x576b, 0x6043, 0x0004, 0x2061, 0x0140, 0x605b, - 0xbc94, 0x605f, 0xf0f0, 0x2061, 0x0100, 0x6043, 0x0006, 0x708b, - 0x0002, 0x7097, 0x0002, 0x2009, 0x07d0, 0x2011, 0x5d94, 0x080c, - 0x836c, 0x080c, 0x5f0c, 0x04c0, 0x080c, 0x5f05, 0x2079, 0x0260, - 0x7930, 0x918e, 0x1101, 0x1558, 0x7834, 0x9005, 0x1540, 0x7900, - 0x918c, 0x00ff, 0x1118, 0x7804, 0x9005, 0x0190, 0x080c, 0x5f05, - 0x2011, 0x026e, 0x2019, 0x1805, 0x20a9, 0x0004, 0x220c, 0x2304, - 0x9102, 0x0230, 0x11a0, 0x8210, 0x8318, 0x1f04, 0x57a6, 0x0078, - 0x709f, 0x0000, 0x080c, 0x5f05, 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, 0x9eeb, 0x20e1, - 0x0001, 0x2099, 0x1c00, 0x20e9, 0x0000, 0x20a1, 0x0240, 0x20a9, - 0x0014, 0x4003, 0x60c3, 0x000c, 0x2011, 0x19c9, 0x2013, 0x0000, - 0x708f, 0x0000, 0x60a3, 0x0056, 0x60a7, 0x9575, 0x080c, 0x964d, - 0x08d8, 0x0005, 0x7094, 0x908a, 0x001d, 0x1a0c, 0x0dfa, 0x000b, - 0x0005, 0x581b, 0x582e, 0x5857, 0x5877, 0x589d, 0x58cc, 0x58f2, - 0x592a, 0x5950, 0x597e, 0x59b9, 0x59f1, 0x5a0f, 0x5a3a, 0x5a5c, - 0x5a77, 0x5a81, 0x5ab5, 0x5adb, 0x5b0a, 0x5b30, 0x5b68, 0x5bac, - 0x5be9, 0x5c0a, 0x5c63, 0x5c85, 0x5cb3, 0x5cb3, 0x00c6, 0x2061, - 0x1800, 0x6003, 0x0007, 0x2061, 0x0100, 0x6004, 0x9084, 0xfff9, - 0x6006, 0x00ce, 0x0005, 0x2061, 0x0140, 0x605b, 0xbc94, 0x605f, - 0xf0f0, 0x2061, 0x0100, 0x6043, 0x0002, 0x7097, 0x0001, 0x2009, - 0x07d0, 0x2011, 0x5d94, 0x080c, 0x836c, 0x0005, 0x00f6, 0x708c, - 0x9086, 0x0014, 0x1510, 0x6042, 0x6020, 0xd0b4, 0x11f0, 0x080c, - 0x5f05, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1102, 0x11a0, 0x7834, - 0x9005, 0x1188, 0x7a38, 0xd2fc, 0x0128, 0x70c0, 0x9005, 0x1110, - 0x70c3, 0x0001, 0x2011, 0x5d94, 0x080c, 0x82da, 0x7097, 0x0010, - 0x080c, 0x5a81, 0x0010, 0x708f, 0x0000, 0x00fe, 0x0005, 0x00f6, - 0x7097, 0x0003, 0x6043, 0x0004, 0x2011, 0x5d94, 0x080c, 0x82da, - 0x080c, 0x5e89, 0x2079, 0x0240, 0x7833, 0x1102, 0x7837, 0x0000, - 0x20a9, 0x0008, 0x9f88, 0x000e, 0x200b, 0x0000, 0x8108, 0x1f04, - 0x586c, 0x60c3, 0x0014, 0x080c, 0x5dbe, 0x00fe, 0x0005, 0x00f6, - 0x708c, 0x9005, 0x0500, 0x2011, 0x5d94, 0x080c, 0x82da, 0x9086, - 0x0014, 0x11b8, 0x080c, 0x5f05, 0x2079, 0x0260, 0x7a30, 0x9296, - 0x1102, 0x1178, 0x7834, 0x9005, 0x1160, 0x7a38, 0xd2fc, 0x0128, - 0x70c0, 0x9005, 0x1110, 0x70c3, 0x0001, 0x7097, 0x0004, 0x0029, - 0x0010, 0x080c, 0x5ee1, 0x00fe, 0x0005, 0x00f6, 0x7097, 0x0005, - 0x080c, 0x5e89, 0x2079, 0x0240, 0x7833, 0x1103, 0x7837, 0x0000, - 0x080c, 0x5f05, 0x080c, 0x5ee8, 0x1170, 0x7080, 0x9005, 0x1158, - 0x7158, 0x9186, 0xffff, 0x0138, 0x2011, 0x0008, 0x080c, 0x5d41, - 0x0168, 0x080c, 0x5ebe, 0x20a9, 0x0008, 0x20e1, 0x0000, 0x2099, + 0x81ff, 0x0904, 0x3427, 0x9182, 0x0081, 0x1a04, 0x3427, 0x810c, + 0x0016, 0x080c, 0x49b7, 0x0170, 0x080c, 0x0f3f, 0x2100, 0x2238, + 0x7d84, 0x7c88, 0x7b8c, 0x7a90, 0x001e, 0x080c, 0x4a00, 0x701f, + 0x551f, 0x0005, 0x001e, 0x2009, 0x0002, 0x0804, 0x3424, 0x2079, + 0x0000, 0x7d94, 0x7c98, 0x7ba8, 0x7aac, 0x79a4, 0x810c, 0x2061, + 0x18b6, 0x2c44, 0xa770, 0xa074, 0x2071, 0x189c, 0x080c, 0x4a03, + 0x701f, 0x5533, 0x0005, 0x2061, 0x18b6, 0x2c44, 0x0016, 0x0026, + 0xa270, 0xa174, 0x080c, 0x0f47, 0x002e, 0x001e, 0x080c, 0x0ff4, + 0x9006, 0xa802, 0xa806, 0x0804, 0x33f2, 0x0126, 0x0156, 0x0136, + 0x0146, 0x01c6, 0x01d6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x2061, + 0x0100, 0x2069, 0x0200, 0x2071, 0x1800, 0x6044, 0xd0a4, 0x11e8, + 0xd084, 0x0118, 0x080c, 0x56ee, 0x0068, 0xd08c, 0x0118, 0x080c, + 0x55f7, 0x0040, 0xd094, 0x0118, 0x080c, 0x55c7, 0x0018, 0xd09c, + 0x0108, 0x0099, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x01de, 0x01ce, + 0x014e, 0x013e, 0x015e, 0x012e, 0x0005, 0x0016, 0x6128, 0xd19c, + 0x1110, 0xc19d, 0x612a, 0x001e, 0x0c68, 0x0006, 0x7094, 0x9005, + 0x000e, 0x0120, 0x7097, 0x0000, 0x708f, 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, 0x5dab, 0x00f0, + 0x6040, 0x9084, 0x0010, 0x9085, 0x0140, 0x6042, 0x6043, 0x0000, + 0x7083, 0x0000, 0x709f, 0x0001, 0x70c3, 0x0000, 0x70db, 0x0000, + 0x2009, 0x1c80, 0x200b, 0x0000, 0x7093, 0x0000, 0x7087, 0x000f, + 0x2009, 0x000f, 0x2011, 0x5c91, 0x080c, 0x82eb, 0x0005, 0x2001, + 0x187d, 0x2004, 0xd08c, 0x0110, 0x705b, 0xffff, 0x7084, 0x9005, + 0x1528, 0x2011, 0x5c91, 0x080c, 0x8259, 0x6040, 0x9094, 0x0010, + 0x9285, 0x0020, 0x6042, 0x20a9, 0x00c8, 0x6044, 0xd08c, 0x1168, + 0x1f04, 0x55dd, 0x6242, 0x7097, 0x0000, 0x6040, 0x9094, 0x0010, + 0x9285, 0x0080, 0x6042, 0x6242, 0x0048, 0x6242, 0x7097, 0x0000, + 0x708b, 0x0000, 0x9006, 0x080c, 0x5e34, 0x0000, 0x0005, 0x7088, + 0x908a, 0x0003, 0x1a0c, 0x0df6, 0x000b, 0x0005, 0x5601, 0x5652, + 0x56ed, 0x00f6, 0x0016, 0x6900, 0x918c, 0x0800, 0x708b, 0x0001, + 0x2001, 0x015d, 0x2003, 0x0000, 0x6803, 0x00fc, 0x20a9, 0x0004, + 0x6800, 0x9084, 0x00fc, 0x0120, 0x1f04, 0x5610, 0x080c, 0x0df6, + 0x68a0, 0x68a2, 0x689c, 0x689e, 0x6898, 0x689a, 0xa001, 0x918d, + 0x1600, 0x6902, 0x001e, 0x6837, 0x0020, 0x080c, 0x5e10, 0x2079, + 0x1c00, 0x7833, 0x1101, 0x7837, 0x0000, 0x20e1, 0x0001, 0x2099, + 0x1805, 0x20e9, 0x0001, 0x20a1, 0x1c0e, 0x20a9, 0x0004, 0x4003, + 0x080c, 0x9df2, 0x20e1, 0x0001, 0x2099, 0x1c00, 0x20e9, 0x0000, + 0x20a1, 0x0240, 0x20a9, 0x0014, 0x4003, 0x60c3, 0x000c, 0x600f, + 0x0000, 0x080c, 0x5cc2, 0x00fe, 0x9006, 0x708e, 0x6043, 0x0008, + 0x6042, 0x0005, 0x00f6, 0x708c, 0x708f, 0x0000, 0x9025, 0x0904, + 0x56ca, 0x6020, 0xd0b4, 0x1904, 0x56c8, 0x719c, 0x81ff, 0x0904, + 0x56b6, 0x9486, 0x000c, 0x1904, 0x56c3, 0x9480, 0x0018, 0x8004, + 0x20a8, 0x080c, 0x5e09, 0x2011, 0x0260, 0x2019, 0x1c00, 0x220c, + 0x2304, 0x9106, 0x11e8, 0x8210, 0x8318, 0x1f04, 0x566f, 0x6043, + 0x0004, 0x2061, 0x0140, 0x605b, 0xbc94, 0x605f, 0xf0f0, 0x2061, + 0x0100, 0x6043, 0x0006, 0x708b, 0x0002, 0x7097, 0x0002, 0x2009, + 0x07d0, 0x2011, 0x5c98, 0x080c, 0x82eb, 0x080c, 0x5e10, 0x04c0, + 0x080c, 0x5e09, 0x2079, 0x0260, 0x7930, 0x918e, 0x1101, 0x1558, + 0x7834, 0x9005, 0x1540, 0x7900, 0x918c, 0x00ff, 0x1118, 0x7804, + 0x9005, 0x0190, 0x080c, 0x5e09, 0x2011, 0x026e, 0x2019, 0x1805, + 0x20a9, 0x0004, 0x220c, 0x2304, 0x9102, 0x0230, 0x11a0, 0x8210, + 0x8318, 0x1f04, 0x56aa, 0x0078, 0x709f, 0x0000, 0x080c, 0x5e09, + 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, 0x9df2, 0x20e1, 0x0001, 0x2099, 0x1c00, 0x20e9, + 0x0000, 0x20a1, 0x0240, 0x20a9, 0x0014, 0x4003, 0x60c3, 0x000c, + 0x2011, 0x19cc, 0x2013, 0x0000, 0x708f, 0x0000, 0x60a3, 0x0056, + 0x60a7, 0x9575, 0x080c, 0x9611, 0x08d8, 0x0005, 0x7094, 0x908a, + 0x001d, 0x1a0c, 0x0df6, 0x000b, 0x0005, 0x571f, 0x5732, 0x575b, + 0x577b, 0x57a1, 0x57d0, 0x57f6, 0x582e, 0x5854, 0x5882, 0x58bd, + 0x58f5, 0x5913, 0x593e, 0x5960, 0x597b, 0x5985, 0x59b9, 0x59df, + 0x5a0e, 0x5a34, 0x5a6c, 0x5ab0, 0x5aed, 0x5b0e, 0x5b67, 0x5b89, + 0x5bb7, 0x5bb7, 0x00c6, 0x2061, 0x1800, 0x6003, 0x0007, 0x2061, + 0x0100, 0x6004, 0x9084, 0xfff9, 0x6006, 0x00ce, 0x0005, 0x2061, + 0x0140, 0x605b, 0xbc94, 0x605f, 0xf0f0, 0x2061, 0x0100, 0x6043, + 0x0002, 0x7097, 0x0001, 0x2009, 0x07d0, 0x2011, 0x5c98, 0x080c, + 0x82eb, 0x0005, 0x00f6, 0x708c, 0x9086, 0x0014, 0x1510, 0x6042, + 0x6020, 0xd0b4, 0x11f0, 0x080c, 0x5e09, 0x2079, 0x0260, 0x7a30, + 0x9296, 0x1102, 0x11a0, 0x7834, 0x9005, 0x1188, 0x7a38, 0xd2fc, + 0x0128, 0x70c0, 0x9005, 0x1110, 0x70c3, 0x0001, 0x2011, 0x5c98, + 0x080c, 0x8259, 0x7097, 0x0010, 0x080c, 0x5985, 0x0010, 0x708f, + 0x0000, 0x00fe, 0x0005, 0x00f6, 0x7097, 0x0003, 0x6043, 0x0004, + 0x2011, 0x5c98, 0x080c, 0x8259, 0x080c, 0x5d8d, 0x2079, 0x0240, + 0x7833, 0x1102, 0x7837, 0x0000, 0x20a9, 0x0008, 0x9f88, 0x000e, + 0x200b, 0x0000, 0x8108, 0x1f04, 0x5770, 0x60c3, 0x0014, 0x080c, + 0x5cc2, 0x00fe, 0x0005, 0x00f6, 0x708c, 0x9005, 0x0500, 0x2011, + 0x5c98, 0x080c, 0x8259, 0x9086, 0x0014, 0x11b8, 0x080c, 0x5e09, + 0x2079, 0x0260, 0x7a30, 0x9296, 0x1102, 0x1178, 0x7834, 0x9005, + 0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70c0, 0x9005, 0x1110, 0x70c3, + 0x0001, 0x7097, 0x0004, 0x0029, 0x0010, 0x080c, 0x5de5, 0x00fe, + 0x0005, 0x00f6, 0x7097, 0x0005, 0x080c, 0x5d8d, 0x2079, 0x0240, + 0x7833, 0x1103, 0x7837, 0x0000, 0x080c, 0x5e09, 0x080c, 0x5dec, + 0x1170, 0x7080, 0x9005, 0x1158, 0x7158, 0x9186, 0xffff, 0x0138, + 0x2011, 0x0008, 0x080c, 0x5c45, 0x0168, 0x080c, 0x5dc2, 0x20a9, + 0x0008, 0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9, 0x0000, 0x20a1, + 0x024e, 0x4003, 0x60c3, 0x0014, 0x080c, 0x5cc2, 0x00fe, 0x0005, + 0x00f6, 0x708c, 0x9005, 0x0500, 0x2011, 0x5c98, 0x080c, 0x8259, + 0x9086, 0x0014, 0x11b8, 0x080c, 0x5e09, 0x2079, 0x0260, 0x7a30, + 0x9296, 0x1103, 0x1178, 0x7834, 0x9005, 0x1160, 0x7a38, 0xd2fc, + 0x0128, 0x70c0, 0x9005, 0x1110, 0x70c3, 0x0001, 0x7097, 0x0006, + 0x0029, 0x0010, 0x080c, 0x5de5, 0x00fe, 0x0005, 0x00f6, 0x7097, + 0x0007, 0x080c, 0x5d8d, 0x2079, 0x0240, 0x7833, 0x1104, 0x7837, + 0x0000, 0x080c, 0x5e09, 0x080c, 0x5dec, 0x11b8, 0x7080, 0x9005, + 0x11a0, 0x7160, 0x9186, 0xffff, 0x0180, 0x9180, 0x31f3, 0x200d, + 0x918c, 0xff00, 0x810f, 0x2011, 0x0008, 0x080c, 0x5c45, 0x0180, + 0x080c, 0x4dd7, 0x0110, 0x080c, 0x26d6, 0x20a9, 0x0008, 0x20e1, + 0x0000, 0x2099, 0x026e, 0x20e9, 0x0000, 0x20a1, 0x024e, 0x4003, + 0x60c3, 0x0014, 0x080c, 0x5cc2, 0x00fe, 0x0005, 0x00f6, 0x708c, + 0x9005, 0x0500, 0x2011, 0x5c98, 0x080c, 0x8259, 0x9086, 0x0014, + 0x11b8, 0x080c, 0x5e09, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1104, + 0x1178, 0x7834, 0x9005, 0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70c0, + 0x9005, 0x1110, 0x70c3, 0x0001, 0x7097, 0x0008, 0x0029, 0x0010, + 0x080c, 0x5de5, 0x00fe, 0x0005, 0x00f6, 0x7097, 0x0009, 0x080c, + 0x5d8d, 0x2079, 0x0240, 0x7833, 0x1105, 0x7837, 0x0100, 0x080c, + 0x5dec, 0x1150, 0x7080, 0x9005, 0x1138, 0x080c, 0x5bb8, 0x1188, + 0x9085, 0x0001, 0x080c, 0x26d6, 0x20a9, 0x0008, 0x080c, 0x5e09, + 0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9, 0x0000, 0x20a1, 0x024e, + 0x4003, 0x60c3, 0x0014, 0x080c, 0x5cc2, 0x0010, 0x080c, 0x5712, + 0x00fe, 0x0005, 0x00f6, 0x708c, 0x9005, 0x05a8, 0x2011, 0x5c98, + 0x080c, 0x8259, 0x9086, 0x0014, 0x1560, 0x080c, 0x5e09, 0x2079, + 0x0260, 0x7a30, 0x9296, 0x1105, 0x1520, 0x7834, 0x9084, 0x0100, + 0x2011, 0x0100, 0x921e, 0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70c0, + 0x9005, 0x1110, 0x70c3, 0x0001, 0x7097, 0x000a, 0x00b1, 0x0098, + 0x9005, 0x1178, 0x7a38, 0xd2fc, 0x0128, 0x70c0, 0x9005, 0x1110, + 0x70c3, 0x0001, 0x7093, 0x0000, 0x7097, 0x000e, 0x080c, 0x5960, + 0x0010, 0x080c, 0x5de5, 0x00fe, 0x0005, 0x00f6, 0x7097, 0x000b, + 0x2011, 0x1c0e, 0x20e9, 0x0001, 0x22a0, 0x20a9, 0x0040, 0x2019, + 0xffff, 0x4304, 0x080c, 0x5d8d, 0x2079, 0x0240, 0x7833, 0x1106, + 0x7837, 0x0000, 0x080c, 0x5dec, 0x0118, 0x2013, 0x0000, 0x0020, + 0x705c, 0x9085, 0x0100, 0x2012, 0x20a9, 0x0040, 0x2009, 0x024e, + 0x2011, 0x1c0e, 0x220e, 0x8210, 0x8108, 0x9186, 0x0260, 0x1128, + 0x6810, 0x8000, 0x6812, 0x2009, 0x0240, 0x1f04, 0x58e2, 0x60c3, + 0x0084, 0x080c, 0x5cc2, 0x00fe, 0x0005, 0x00f6, 0x708c, 0x9005, + 0x01c0, 0x2011, 0x5c98, 0x080c, 0x8259, 0x9086, 0x0084, 0x1178, + 0x080c, 0x5e09, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1106, 0x1138, + 0x7834, 0x9005, 0x1120, 0x7097, 0x000c, 0x0029, 0x0010, 0x080c, + 0x5de5, 0x00fe, 0x0005, 0x00f6, 0x7097, 0x000d, 0x080c, 0x5d8d, + 0x2079, 0x0240, 0x7833, 0x1107, 0x7837, 0x0000, 0x080c, 0x5e09, + 0x20a9, 0x0040, 0x2011, 0x026e, 0x2009, 0x024e, 0x220e, 0x8210, + 0x8108, 0x9186, 0x0260, 0x1150, 0x6810, 0x8000, 0x6812, 0x2009, + 0x0240, 0x6814, 0x8000, 0x6816, 0x2011, 0x0260, 0x1f04, 0x5926, + 0x60c3, 0x0084, 0x080c, 0x5cc2, 0x00fe, 0x0005, 0x00f6, 0x708c, + 0x9005, 0x01e0, 0x2011, 0x5c98, 0x080c, 0x8259, 0x9086, 0x0084, + 0x1198, 0x080c, 0x5e09, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1107, + 0x1158, 0x7834, 0x9005, 0x1140, 0x7093, 0x0001, 0x080c, 0x5d5f, + 0x7097, 0x000e, 0x0029, 0x0010, 0x080c, 0x5de5, 0x00fe, 0x0005, + 0x918d, 0x0001, 0x080c, 0x5e34, 0x7097, 0x000f, 0x708f, 0x0000, + 0x2061, 0x0140, 0x605b, 0xbc85, 0x605f, 0xb5b5, 0x2061, 0x0100, + 0x6043, 0x0005, 0x6043, 0x0004, 0x2009, 0x07d0, 0x2011, 0x5c98, + 0x080c, 0x824d, 0x0005, 0x708c, 0x9005, 0x0130, 0x2011, 0x5c98, + 0x080c, 0x8259, 0x7097, 0x0000, 0x0005, 0x7097, 0x0011, 0x080c, + 0x9df2, 0x080c, 0x5e09, 0x20e1, 0x0000, 0x2099, 0x0260, 0x20e9, + 0x0000, 0x20a1, 0x0240, 0x748c, 0x9480, 0x0018, 0x9080, 0x0007, + 0x9084, 0x03f8, 0x8004, 0x20a8, 0x4003, 0x080c, 0x5dec, 0x11a0, + 0x7178, 0x81ff, 0x0188, 0x900e, 0x707c, 0x9084, 0x00ff, 0x0160, + 0x080c, 0x266d, 0x9186, 0x007e, 0x0138, 0x9186, 0x0080, 0x0120, + 0x2011, 0x0008, 0x080c, 0x5c45, 0x60c3, 0x0014, 0x080c, 0x5cc2, + 0x0005, 0x00f6, 0x708c, 0x9005, 0x0500, 0x2011, 0x5c98, 0x080c, + 0x8259, 0x9086, 0x0014, 0x11b8, 0x080c, 0x5e09, 0x2079, 0x0260, + 0x7a30, 0x9296, 0x1103, 0x1178, 0x7834, 0x9005, 0x1160, 0x7a38, + 0xd2fc, 0x0128, 0x70c0, 0x9005, 0x1110, 0x70c3, 0x0001, 0x7097, + 0x0012, 0x0029, 0x0010, 0x708f, 0x0000, 0x00fe, 0x0005, 0x00f6, + 0x7097, 0x0013, 0x080c, 0x5d9b, 0x2079, 0x0240, 0x7833, 0x1103, + 0x7837, 0x0000, 0x080c, 0x5e09, 0x080c, 0x5dec, 0x1170, 0x7080, + 0x9005, 0x1158, 0x7158, 0x9186, 0xffff, 0x0138, 0x2011, 0x0008, + 0x080c, 0x5c45, 0x0168, 0x080c, 0x5dc2, 0x20a9, 0x0008, 0x20e1, + 0x0000, 0x2099, 0x026e, 0x20e9, 0x0000, 0x20a1, 0x024e, 0x4003, + 0x60c3, 0x0014, 0x080c, 0x5cc2, 0x00fe, 0x0005, 0x00f6, 0x708c, + 0x9005, 0x0500, 0x2011, 0x5c98, 0x080c, 0x8259, 0x9086, 0x0014, + 0x11b8, 0x080c, 0x5e09, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1104, + 0x1178, 0x7834, 0x9005, 0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70c0, + 0x9005, 0x1110, 0x70c3, 0x0001, 0x7097, 0x0014, 0x0029, 0x0010, + 0x708f, 0x0000, 0x00fe, 0x0005, 0x00f6, 0x7097, 0x0015, 0x080c, + 0x5d9b, 0x2079, 0x0240, 0x7833, 0x1104, 0x7837, 0x0000, 0x080c, + 0x5e09, 0x080c, 0x5dec, 0x11b8, 0x7080, 0x9005, 0x11a0, 0x7160, + 0x9186, 0xffff, 0x0180, 0x9180, 0x31f3, 0x200d, 0x918c, 0xff00, + 0x810f, 0x2011, 0x0008, 0x080c, 0x5c45, 0x0180, 0x080c, 0x4dd7, + 0x0110, 0x080c, 0x26d6, 0x20a9, 0x0008, 0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9, 0x0000, 0x20a1, 0x024e, 0x4003, 0x60c3, 0x0014, - 0x080c, 0x5dbe, 0x00fe, 0x0005, 0x00f6, 0x708c, 0x9005, 0x0500, - 0x2011, 0x5d94, 0x080c, 0x82da, 0x9086, 0x0014, 0x11b8, 0x080c, - 0x5f05, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1103, 0x1178, 0x7834, - 0x9005, 0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70c0, 0x9005, 0x1110, - 0x70c3, 0x0001, 0x7097, 0x0006, 0x0029, 0x0010, 0x080c, 0x5ee1, - 0x00fe, 0x0005, 0x00f6, 0x7097, 0x0007, 0x080c, 0x5e89, 0x2079, - 0x0240, 0x7833, 0x1104, 0x7837, 0x0000, 0x080c, 0x5f05, 0x080c, - 0x5ee8, 0x11b8, 0x7080, 0x9005, 0x11a0, 0x7160, 0x9186, 0xffff, - 0x0180, 0x9180, 0x32e9, 0x200d, 0x918c, 0xff00, 0x810f, 0x2011, - 0x0008, 0x080c, 0x5d41, 0x0180, 0x080c, 0x4ed8, 0x0110, 0x080c, - 0x27d7, 0x20a9, 0x0008, 0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9, - 0x0000, 0x20a1, 0x024e, 0x4003, 0x60c3, 0x0014, 0x080c, 0x5dbe, - 0x00fe, 0x0005, 0x00f6, 0x708c, 0x9005, 0x0500, 0x2011, 0x5d94, - 0x080c, 0x82da, 0x9086, 0x0014, 0x11b8, 0x080c, 0x5f05, 0x2079, - 0x0260, 0x7a30, 0x9296, 0x1104, 0x1178, 0x7834, 0x9005, 0x1160, - 0x7a38, 0xd2fc, 0x0128, 0x70c0, 0x9005, 0x1110, 0x70c3, 0x0001, - 0x7097, 0x0008, 0x0029, 0x0010, 0x080c, 0x5ee1, 0x00fe, 0x0005, - 0x00f6, 0x7097, 0x0009, 0x080c, 0x5e89, 0x2079, 0x0240, 0x7833, - 0x1105, 0x7837, 0x0100, 0x080c, 0x5ee8, 0x1150, 0x7080, 0x9005, - 0x1138, 0x080c, 0x5cb4, 0x1188, 0x9085, 0x0001, 0x080c, 0x27d7, - 0x20a9, 0x0008, 0x080c, 0x5f05, 0x20e1, 0x0000, 0x2099, 0x026e, + 0x080c, 0x5cc2, 0x00fe, 0x0005, 0x00f6, 0x708c, 0x9005, 0x05f0, + 0x2011, 0x5c98, 0x080c, 0x8259, 0x9086, 0x0014, 0x15a8, 0x080c, + 0x5e09, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1105, 0x1568, 0x7834, + 0x9084, 0x0100, 0x2011, 0x0100, 0x921e, 0x1168, 0x9085, 0x0001, + 0x080c, 0x5e34, 0x7a38, 0xd2fc, 0x0128, 0x70c0, 0x9005, 0x1110, + 0x70c3, 0x0001, 0x0080, 0x9005, 0x11b8, 0x7a38, 0xd2fc, 0x0128, + 0x70c0, 0x9005, 0x1110, 0x70c3, 0x0001, 0x9085, 0x0001, 0x080c, + 0x5e34, 0x7093, 0x0000, 0x7a38, 0xd2f4, 0x0110, 0x70db, 0x0008, + 0x7097, 0x0016, 0x0029, 0x0010, 0x708f, 0x0000, 0x00fe, 0x0005, + 0x080c, 0x9df2, 0x080c, 0x5e09, 0x20e1, 0x0000, 0x2099, 0x0260, + 0x20e9, 0x0000, 0x20a1, 0x0240, 0x20a9, 0x000e, 0x4003, 0x2011, + 0x026d, 0x2204, 0x9084, 0x0100, 0x2011, 0x024d, 0x2012, 0x2011, + 0x026e, 0x7097, 0x0017, 0x080c, 0x5dec, 0x1150, 0x7080, 0x9005, + 0x1138, 0x080c, 0x5bb8, 0x1188, 0x9085, 0x0001, 0x080c, 0x26d6, + 0x20a9, 0x0008, 0x080c, 0x5e09, 0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9, 0x0000, 0x20a1, 0x024e, 0x4003, 0x60c3, 0x0014, 0x080c, - 0x5dbe, 0x0010, 0x080c, 0x580e, 0x00fe, 0x0005, 0x00f6, 0x708c, - 0x9005, 0x05a8, 0x2011, 0x5d94, 0x080c, 0x82da, 0x9086, 0x0014, - 0x1560, 0x080c, 0x5f05, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1105, - 0x1520, 0x7834, 0x9084, 0x0100, 0x2011, 0x0100, 0x921e, 0x1160, - 0x7a38, 0xd2fc, 0x0128, 0x70c0, 0x9005, 0x1110, 0x70c3, 0x0001, - 0x7097, 0x000a, 0x00b1, 0x0098, 0x9005, 0x1178, 0x7a38, 0xd2fc, - 0x0128, 0x70c0, 0x9005, 0x1110, 0x70c3, 0x0001, 0x7093, 0x0000, - 0x7097, 0x000e, 0x080c, 0x5a5c, 0x0010, 0x080c, 0x5ee1, 0x00fe, - 0x0005, 0x00f6, 0x7097, 0x000b, 0x2011, 0x1c0e, 0x20e9, 0x0001, - 0x22a0, 0x20a9, 0x0040, 0x2019, 0xffff, 0x4304, 0x080c, 0x5e89, - 0x2079, 0x0240, 0x7833, 0x1106, 0x7837, 0x0000, 0x080c, 0x5ee8, - 0x0118, 0x2013, 0x0000, 0x0020, 0x705c, 0x9085, 0x0100, 0x2012, - 0x20a9, 0x0040, 0x2009, 0x024e, 0x2011, 0x1c0e, 0x220e, 0x8210, - 0x8108, 0x9186, 0x0260, 0x1128, 0x6810, 0x8000, 0x6812, 0x2009, - 0x0240, 0x1f04, 0x59de, 0x60c3, 0x0084, 0x080c, 0x5dbe, 0x00fe, - 0x0005, 0x00f6, 0x708c, 0x9005, 0x01c0, 0x2011, 0x5d94, 0x080c, - 0x82da, 0x9086, 0x0084, 0x1178, 0x080c, 0x5f05, 0x2079, 0x0260, - 0x7a30, 0x9296, 0x1106, 0x1138, 0x7834, 0x9005, 0x1120, 0x7097, - 0x000c, 0x0029, 0x0010, 0x080c, 0x5ee1, 0x00fe, 0x0005, 0x00f6, - 0x7097, 0x000d, 0x080c, 0x5e89, 0x2079, 0x0240, 0x7833, 0x1107, - 0x7837, 0x0000, 0x080c, 0x5f05, 0x20a9, 0x0040, 0x2011, 0x026e, - 0x2009, 0x024e, 0x220e, 0x8210, 0x8108, 0x9186, 0x0260, 0x1150, - 0x6810, 0x8000, 0x6812, 0x2009, 0x0240, 0x6814, 0x8000, 0x6816, - 0x2011, 0x0260, 0x1f04, 0x5a22, 0x60c3, 0x0084, 0x080c, 0x5dbe, - 0x00fe, 0x0005, 0x00f6, 0x708c, 0x9005, 0x01e0, 0x2011, 0x5d94, - 0x080c, 0x82da, 0x9086, 0x0084, 0x1198, 0x080c, 0x5f05, 0x2079, - 0x0260, 0x7a30, 0x9296, 0x1107, 0x1158, 0x7834, 0x9005, 0x1140, - 0x7093, 0x0001, 0x080c, 0x5e5b, 0x7097, 0x000e, 0x0029, 0x0010, - 0x080c, 0x5ee1, 0x00fe, 0x0005, 0x918d, 0x0001, 0x080c, 0x5f30, - 0x7097, 0x000f, 0x708f, 0x0000, 0x2061, 0x0140, 0x605b, 0xbc85, - 0x605f, 0xb5b5, 0x2061, 0x0100, 0x6043, 0x0005, 0x6043, 0x0004, - 0x2009, 0x07d0, 0x2011, 0x5d94, 0x080c, 0x82ce, 0x0005, 0x708c, - 0x9005, 0x0130, 0x2011, 0x5d94, 0x080c, 0x82da, 0x7097, 0x0000, - 0x0005, 0x7097, 0x0011, 0x080c, 0x9eeb, 0x080c, 0x5f05, 0x20e1, - 0x0000, 0x2099, 0x0260, 0x20e9, 0x0000, 0x20a1, 0x0240, 0x748c, + 0x5cc2, 0x0010, 0x080c, 0x5712, 0x0005, 0x00f6, 0x708c, 0x9005, + 0x01d8, 0x2011, 0x5c98, 0x080c, 0x8259, 0x9086, 0x0084, 0x1190, + 0x080c, 0x5e09, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1106, 0x1150, + 0x7834, 0x9005, 0x1138, 0x9006, 0x080c, 0x5e34, 0x7097, 0x0018, + 0x0029, 0x0010, 0x708f, 0x0000, 0x00fe, 0x0005, 0x00f6, 0x7097, + 0x0019, 0x080c, 0x5d9b, 0x2079, 0x0240, 0x7833, 0x1106, 0x7837, + 0x0000, 0x080c, 0x5e09, 0x2009, 0x026e, 0x2039, 0x1c0e, 0x20a9, + 0x0040, 0x213e, 0x8738, 0x8108, 0x9186, 0x0280, 0x1128, 0x6814, + 0x8000, 0x6816, 0x2009, 0x0260, 0x1f04, 0x5b21, 0x2039, 0x1c0e, + 0x080c, 0x5dec, 0x11e8, 0x2728, 0x2514, 0x8207, 0x9084, 0x00ff, + 0x8000, 0x2018, 0x9294, 0x00ff, 0x8007, 0x9205, 0x202a, 0x705c, + 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, + 0x5b54, 0x60c3, 0x0084, 0x080c, 0x5cc2, 0x00fe, 0x0005, 0x00f6, + 0x708c, 0x9005, 0x01e0, 0x2011, 0x5c98, 0x080c, 0x8259, 0x9086, + 0x0084, 0x1198, 0x080c, 0x5e09, 0x2079, 0x0260, 0x7a30, 0x9296, + 0x1107, 0x1158, 0x7834, 0x9005, 0x1140, 0x7093, 0x0001, 0x080c, + 0x5d5f, 0x7097, 0x001a, 0x0029, 0x0010, 0x708f, 0x0000, 0x00fe, + 0x0005, 0x9085, 0x0001, 0x080c, 0x5e34, 0x7097, 0x001b, 0x080c, + 0x9df2, 0x080c, 0x5e09, 0x2011, 0x0260, 0x2009, 0x0240, 0x748c, 0x9480, 0x0018, 0x9080, 0x0007, 0x9084, 0x03f8, 0x8004, 0x20a8, - 0x4003, 0x080c, 0x5ee8, 0x11a0, 0x7178, 0x81ff, 0x0188, 0x900e, - 0x707c, 0x9084, 0x00ff, 0x0160, 0x080c, 0x276e, 0x9186, 0x007e, - 0x0138, 0x9186, 0x0080, 0x0120, 0x2011, 0x0008, 0x080c, 0x5d41, - 0x60c3, 0x0014, 0x080c, 0x5dbe, 0x0005, 0x00f6, 0x708c, 0x9005, - 0x0500, 0x2011, 0x5d94, 0x080c, 0x82da, 0x9086, 0x0014, 0x11b8, - 0x080c, 0x5f05, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1103, 0x1178, - 0x7834, 0x9005, 0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70c0, 0x9005, - 0x1110, 0x70c3, 0x0001, 0x7097, 0x0012, 0x0029, 0x0010, 0x708f, - 0x0000, 0x00fe, 0x0005, 0x00f6, 0x7097, 0x0013, 0x080c, 0x5e97, - 0x2079, 0x0240, 0x7833, 0x1103, 0x7837, 0x0000, 0x080c, 0x5f05, - 0x080c, 0x5ee8, 0x1170, 0x7080, 0x9005, 0x1158, 0x7158, 0x9186, - 0xffff, 0x0138, 0x2011, 0x0008, 0x080c, 0x5d41, 0x0168, 0x080c, - 0x5ebe, 0x20a9, 0x0008, 0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9, - 0x0000, 0x20a1, 0x024e, 0x4003, 0x60c3, 0x0014, 0x080c, 0x5dbe, - 0x00fe, 0x0005, 0x00f6, 0x708c, 0x9005, 0x0500, 0x2011, 0x5d94, - 0x080c, 0x82da, 0x9086, 0x0014, 0x11b8, 0x080c, 0x5f05, 0x2079, - 0x0260, 0x7a30, 0x9296, 0x1104, 0x1178, 0x7834, 0x9005, 0x1160, - 0x7a38, 0xd2fc, 0x0128, 0x70c0, 0x9005, 0x1110, 0x70c3, 0x0001, - 0x7097, 0x0014, 0x0029, 0x0010, 0x708f, 0x0000, 0x00fe, 0x0005, - 0x00f6, 0x7097, 0x0015, 0x080c, 0x5e97, 0x2079, 0x0240, 0x7833, - 0x1104, 0x7837, 0x0000, 0x080c, 0x5f05, 0x080c, 0x5ee8, 0x11b8, - 0x7080, 0x9005, 0x11a0, 0x7160, 0x9186, 0xffff, 0x0180, 0x9180, - 0x32e9, 0x200d, 0x918c, 0xff00, 0x810f, 0x2011, 0x0008, 0x080c, - 0x5d41, 0x0180, 0x080c, 0x4ed8, 0x0110, 0x080c, 0x27d7, 0x20a9, - 0x0008, 0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9, 0x0000, 0x20a1, - 0x024e, 0x4003, 0x60c3, 0x0014, 0x080c, 0x5dbe, 0x00fe, 0x0005, - 0x00f6, 0x708c, 0x9005, 0x05f0, 0x2011, 0x5d94, 0x080c, 0x82da, - 0x9086, 0x0014, 0x15a8, 0x080c, 0x5f05, 0x2079, 0x0260, 0x7a30, - 0x9296, 0x1105, 0x1568, 0x7834, 0x9084, 0x0100, 0x2011, 0x0100, - 0x921e, 0x1168, 0x9085, 0x0001, 0x080c, 0x5f30, 0x7a38, 0xd2fc, - 0x0128, 0x70c0, 0x9005, 0x1110, 0x70c3, 0x0001, 0x0080, 0x9005, - 0x11b8, 0x7a38, 0xd2fc, 0x0128, 0x70c0, 0x9005, 0x1110, 0x70c3, - 0x0001, 0x9085, 0x0001, 0x080c, 0x5f30, 0x7093, 0x0000, 0x7a38, - 0xd2f4, 0x0110, 0x70db, 0x0008, 0x7097, 0x0016, 0x0029, 0x0010, - 0x708f, 0x0000, 0x00fe, 0x0005, 0x080c, 0x9eeb, 0x080c, 0x5f05, - 0x20e1, 0x0000, 0x2099, 0x0260, 0x20e9, 0x0000, 0x20a1, 0x0240, - 0x20a9, 0x000e, 0x4003, 0x2011, 0x026d, 0x2204, 0x9084, 0x0100, - 0x2011, 0x024d, 0x2012, 0x2011, 0x026e, 0x7097, 0x0017, 0x080c, - 0x5ee8, 0x1150, 0x7080, 0x9005, 0x1138, 0x080c, 0x5cb4, 0x1188, - 0x9085, 0x0001, 0x080c, 0x27d7, 0x20a9, 0x0008, 0x080c, 0x5f05, - 0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9, 0x0000, 0x20a1, 0x024e, - 0x4003, 0x60c3, 0x0014, 0x080c, 0x5dbe, 0x0010, 0x080c, 0x580e, - 0x0005, 0x00f6, 0x708c, 0x9005, 0x01d8, 0x2011, 0x5d94, 0x080c, - 0x82da, 0x9086, 0x0084, 0x1190, 0x080c, 0x5f05, 0x2079, 0x0260, - 0x7a30, 0x9296, 0x1106, 0x1150, 0x7834, 0x9005, 0x1138, 0x9006, - 0x080c, 0x5f30, 0x7097, 0x0018, 0x0029, 0x0010, 0x708f, 0x0000, - 0x00fe, 0x0005, 0x00f6, 0x7097, 0x0019, 0x080c, 0x5e97, 0x2079, - 0x0240, 0x7833, 0x1106, 0x7837, 0x0000, 0x080c, 0x5f05, 0x2009, - 0x026e, 0x2039, 0x1c0e, 0x20a9, 0x0040, 0x213e, 0x8738, 0x8108, - 0x9186, 0x0280, 0x1128, 0x6814, 0x8000, 0x6816, 0x2009, 0x0260, - 0x1f04, 0x5c1d, 0x2039, 0x1c0e, 0x080c, 0x5ee8, 0x11e8, 0x2728, - 0x2514, 0x8207, 0x9084, 0x00ff, 0x8000, 0x2018, 0x9294, 0x00ff, - 0x8007, 0x9205, 0x202a, 0x705c, 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, 0x5c50, 0x60c3, 0x0084, 0x080c, - 0x5dbe, 0x00fe, 0x0005, 0x00f6, 0x708c, 0x9005, 0x01e0, 0x2011, - 0x5d94, 0x080c, 0x82da, 0x9086, 0x0084, 0x1198, 0x080c, 0x5f05, - 0x2079, 0x0260, 0x7a30, 0x9296, 0x1107, 0x1158, 0x7834, 0x9005, - 0x1140, 0x7093, 0x0001, 0x080c, 0x5e5b, 0x7097, 0x001a, 0x0029, - 0x0010, 0x708f, 0x0000, 0x00fe, 0x0005, 0x9085, 0x0001, 0x080c, - 0x5f30, 0x7097, 0x001b, 0x080c, 0x9eeb, 0x080c, 0x5f05, 0x2011, - 0x0260, 0x2009, 0x0240, 0x748c, 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, 0x5c9c, 0x60c3, 0x0084, - 0x080c, 0x5dbe, 0x0005, 0x0005, 0x0086, 0x0096, 0x2029, 0x185c, - 0x252c, 0x20a9, 0x0008, 0x2041, 0x1c0e, 0x20e9, 0x0001, 0x28a0, - 0x080c, 0x5f05, 0x20e1, 0x0000, 0x2099, 0x026e, 0x4003, 0x20a9, - 0x0008, 0x2011, 0x0007, 0xd5d4, 0x0108, 0x9016, 0x2800, 0x9200, - 0x200c, 0x91a6, 0xffff, 0x1148, 0xd5d4, 0x0110, 0x8210, 0x0008, - 0x8211, 0x1f04, 0x5cce, 0x0804, 0x5d3d, 0x82ff, 0x1160, 0xd5d4, - 0x0120, 0x91a6, 0x3fff, 0x0d90, 0x0020, 0x91a6, 0x3fff, 0x0904, - 0x5d3d, 0x918d, 0xc000, 0x20a9, 0x0010, 0x2019, 0x0001, 0xd5d4, - 0x0110, 0x2019, 0x0010, 0x2120, 0xd5d4, 0x0110, 0x8423, 0x0008, - 0x8424, 0x1240, 0xd5d4, 0x0110, 0x8319, 0x0008, 0x8318, 0x1f04, - 0x5cf4, 0x04d8, 0x23a8, 0x2021, 0x0001, 0x8426, 0x8425, 0x1f04, - 0x5d06, 0x2328, 0x8529, 0x92be, 0x0007, 0x0158, 0x0006, 0x2039, - 0x0007, 0x2200, 0x973a, 0x000e, 0x27a8, 0x95a8, 0x0010, 0x1f04, - 0x5d15, 0x755a, 0x95c8, 0x32e9, 0x292d, 0x95ac, 0x00ff, 0x757e, - 0x6532, 0x6536, 0x0016, 0x2508, 0x080c, 0x27b7, 0x001e, 0x60e7, - 0x0000, 0x65ea, 0x2018, 0x2304, 0x9405, 0x201a, 0x7083, 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, 0x715a, - 0x91a0, 0x32e9, 0x242d, 0x95ac, 0x00ff, 0x757e, 0x6532, 0x6536, - 0x0016, 0x2508, 0x080c, 0x27b7, 0x001e, 0x60e7, 0x0000, 0x65ea, - 0x7083, 0x0001, 0x9084, 0x0000, 0x0005, 0x00e6, 0x2071, 0x1800, - 0x7087, 0x0000, 0x00ee, 0x0005, 0x00e6, 0x00f6, 0x2079, 0x0100, - 0x2071, 0x0140, 0x080c, 0x5e4a, 0x080c, 0x9656, 0x7004, 0x9084, - 0x4000, 0x0110, 0x080c, 0x2c98, 0x0126, 0x2091, 0x8000, 0x2071, - 0x1825, 0x2073, 0x0000, 0x7840, 0x0026, 0x0016, 0x2009, 0x00f7, - 0x080c, 0x5ea7, 0x001e, 0x9094, 0x0010, 0x9285, 0x0080, 0x7842, - 0x7a42, 0x002e, 0x012e, 0x00fe, 0x00ee, 0x0005, 0x0126, 0x2091, - 0x8000, 0x080c, 0x2afe, 0x0228, 0x2011, 0x0101, 0x2204, 0xc0c5, - 0x2012, 0x2011, 0x19c9, 0x2013, 0x0000, 0x708f, 0x0000, 0x012e, - 0x60a3, 0x0056, 0x60a7, 0x9575, 0x080c, 0x964d, 0x6144, 0xd184, - 0x0120, 0x7194, 0x918d, 0x2000, 0x0018, 0x7188, 0x918d, 0x1000, - 0x2011, 0x1971, 0x2112, 0x2009, 0x07d0, 0x2011, 0x5d94, 0x080c, - 0x836c, 0x0005, 0x0016, 0x0026, 0x00c6, 0x0126, 0x2091, 0x8000, - 0x080c, 0xa069, 0x2009, 0x00f7, 0x080c, 0x5ea7, 0x2061, 0x19d2, - 0x900e, 0x611a, 0x611e, 0x6172, 0x6176, 0x2061, 0x1800, 0x6003, - 0x0001, 0x2061, 0x0100, 0x6043, 0x0090, 0x6043, 0x0010, 0x2009, - 0x1971, 0x200b, 0x0000, 0x2009, 0x002d, 0x2011, 0x5e16, 0x080c, - 0x82ce, 0x012e, 0x00ce, 0x002e, 0x001e, 0x0005, 0x00e6, 0x0006, - 0x0126, 0x2091, 0x8000, 0x0471, 0x2071, 0x0100, 0x080c, 0x9656, - 0x2071, 0x0140, 0x7004, 0x9084, 0x4000, 0x0110, 0x080c, 0x2c98, - 0x080c, 0x720f, 0x0188, 0x080c, 0x722a, 0x1170, 0x080c, 0x750e, - 0x0016, 0x080c, 0x2886, 0x2001, 0x1945, 0x2102, 0x001e, 0x080c, - 0x7509, 0x080c, 0x7127, 0x0050, 0x2009, 0x0001, 0x080c, 0x2bb6, - 0x2001, 0x0001, 0x080c, 0x2717, 0x080c, 0x5dea, 0x012e, 0x000e, - 0x00ee, 0x0005, 0x2001, 0x180e, 0x2004, 0xd0bc, 0x0158, 0x0026, - 0x0036, 0x2011, 0x8017, 0x2001, 0x1971, 0x201c, 0x080c, 0x4b1f, - 0x003e, 0x002e, 0x0005, 0x20a9, 0x0012, 0x20e9, 0x0001, 0x20a1, - 0x1c80, 0x080c, 0x5f05, 0x20e9, 0x0000, 0x2099, 0x026e, 0x0099, - 0x20a9, 0x0020, 0x080c, 0x5eff, 0x2099, 0x0260, 0x20a1, 0x1c92, - 0x0051, 0x20a9, 0x000e, 0x080c, 0x5f02, 0x2099, 0x0260, 0x20a1, - 0x1cb2, 0x0009, 0x0005, 0x0016, 0x0026, 0x3410, 0x3308, 0x2104, - 0x8007, 0x2012, 0x8108, 0x8210, 0x1f04, 0x5e7f, 0x002e, 0x001e, - 0x0005, 0x080c, 0x9eeb, 0x20e1, 0x0001, 0x2099, 0x1c00, 0x20e9, - 0x0000, 0x20a1, 0x0240, 0x20a9, 0x000c, 0x4003, 0x0005, 0x080c, - 0x9eeb, 0x080c, 0x5f05, 0x20e1, 0x0000, 0x2099, 0x0260, 0x20e9, - 0x0000, 0x20a1, 0x0240, 0x20a9, 0x000c, 0x4003, 0x0005, 0x00c6, - 0x0006, 0x2061, 0x0100, 0x810f, 0x2001, 0x1833, 0x2004, 0x9005, - 0x1138, 0x2001, 0x1817, 0x2004, 0x9084, 0x00ff, 0x9105, 0x0010, - 0x9185, 0x00f7, 0x604a, 0x000e, 0x00ce, 0x0005, 0x0016, 0x0046, - 0x080c, 0x67bf, 0x0158, 0x9006, 0x2020, 0x2009, 0x002a, 0x080c, - 0xd885, 0x2001, 0x180c, 0x200c, 0xc195, 0x2102, 0x2019, 0x002a, - 0x900e, 0x080c, 0x3156, 0x080c, 0xc539, 0x0140, 0x0036, 0x2019, - 0xffff, 0x2021, 0x0007, 0x080c, 0x4cbc, 0x003e, 0x004e, 0x001e, - 0x0005, 0x080c, 0x5dea, 0x7097, 0x0000, 0x708f, 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, 0x197e, 0x0118, 0x2003, 0x0001, 0x0010, 0x2003, 0x0000, - 0x0005, 0x0156, 0x20a9, 0x0800, 0x2009, 0x1000, 0x9006, 0x200a, - 0x8108, 0x1f04, 0x5f3f, 0x015e, 0x0005, 0x00d6, 0x0036, 0x0156, - 0x0136, 0x0146, 0x2069, 0x185b, 0x9006, 0xb802, 0xb8be, 0xb807, - 0x0707, 0xb80a, 0xb80e, 0xb812, 0x9198, 0x32e9, 0x231d, 0x939c, - 0x00ff, 0xbb16, 0x0016, 0x0026, 0xb8b2, 0x080c, 0xa062, 0x1120, - 0x9192, 0x007e, 0x1208, 0xbbb2, 0x20a9, 0x0004, 0xb8b4, 0x20e8, - 0xb9b8, 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, 0xb8ae, 0xb9a2, 0x0096, 0xb8a4, - 0x904d, 0x0110, 0x080c, 0x1063, 0xb8a7, 0x0000, 0x009e, 0x9006, - 0xb84a, 0x6810, 0xb83a, 0x680c, 0xb846, 0x6814, 0x9084, 0x00ff, - 0xb842, 0x014e, 0x013e, 0x015e, 0x003e, 0x00de, 0x0005, 0x0126, - 0x2091, 0x8000, 0xa974, 0xae78, 0x9684, 0x3fff, 0x9082, 0x4000, - 0x1a04, 0x6015, 0x9182, 0x0800, 0x1a04, 0x6019, 0x2001, 0x180c, - 0x2004, 0x9084, 0x0003, 0x1904, 0x601f, 0x9188, 0x1000, 0x2104, - 0x905d, 0x0518, 0xb804, 0x9084, 0x00ff, 0x908e, 0x0006, 0x1508, - 0xb8a4, 0x900d, 0x1904, 0x6031, 0xb850, 0x900d, 0x1148, 0xa802, - 0x2900, 0xb852, 0xb84e, 0x080c, 0x8696, 0x9006, 0x012e, 0x0005, - 0x00a6, 0x2150, 0x2900, 0xb002, 0xa803, 0x0000, 0x00ae, 0xb852, - 0x0c90, 0x2001, 0x0005, 0x900e, 0x04b8, 0x2001, 0x0028, 0x900e, - 0x0498, 0x9082, 0x0006, 0x1290, 0x080c, 0xa062, 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, 0x67c3, 0x1990, 0xb800, 0xd0bc, 0x0978, 0x0804, - 0x5fc8, 0x080c, 0x663b, 0x0904, 0x5fe1, 0x0804, 0x5fcc, 0x00b6, - 0x00e6, 0x0126, 0x2091, 0x8000, 0xa974, 0x9182, 0x0800, 0x1a04, - 0x60b5, 0x9188, 0x1000, 0x2104, 0x905d, 0x0904, 0x608d, 0xb8a0, - 0x9086, 0x007f, 0x0190, 0xa87c, 0xd0fc, 0x1178, 0x080c, 0x67cb, - 0x0160, 0xa994, 0x81ff, 0x0130, 0x908e, 0x0004, 0x0130, 0x908e, - 0x0005, 0x0118, 0x080c, 0x67c3, 0x1598, 0xa87c, 0xd0fc, 0x01e0, - 0xa894, 0x9005, 0x01c8, 0x2060, 0x0026, 0x2010, 0x080c, 0xbe25, - 0x002e, 0x1120, 0x2001, 0x0008, 0x0804, 0x60b7, 0x6020, 0x9086, - 0x000a, 0x0120, 0x2001, 0x0008, 0x0804, 0x60b7, 0x601a, 0x6003, - 0x0008, 0x2900, 0x6016, 0x0058, 0x080c, 0xa08d, 0x05e8, 0x2b00, - 0x6012, 0x2900, 0x6016, 0x600b, 0xffff, 0x6023, 0x000a, 0x2009, - 0x0003, 0x080c, 0xa15d, 0x9006, 0x0458, 0x2001, 0x0028, 0x0438, - 0x9082, 0x0006, 0x1290, 0x080c, 0xa062, 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, 0x614c, - 0x6107, 0x611e, 0x614c, 0x614c, 0x614c, 0x614c, 0x614c, 0x2100, - 0x9082, 0x007e, 0x1278, 0x080c, 0x643f, 0x0148, 0x9046, 0xb810, - 0x9306, 0x1904, 0x6154, 0xb814, 0x9206, 0x15f0, 0x0028, 0xbb12, - 0xba16, 0x0010, 0x080c, 0x49d9, 0x0150, 0x04b0, 0x080c, 0x649f, - 0x1598, 0xb810, 0x9306, 0x1580, 0xb814, 0x9206, 0x1568, 0x080c, - 0xa08d, 0x0530, 0x2b00, 0x6012, 0x080c, 0xc2b3, 0x2900, 0x6016, - 0x600b, 0xffff, 0x6023, 0x000a, 0xa878, 0x9086, 0x0001, 0x1170, - 0x080c, 0x318b, 0x9006, 0x080c, 0x63dc, 0x2001, 0x0002, 0x080c, - 0x63f0, 0x2001, 0x0200, 0xb86e, 0xb893, 0x0002, 0x2009, 0x0003, - 0x080c, 0xa15d, 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, 0x632d, - 0x90c6, 0x0056, 0x0904, 0x6331, 0x90c6, 0x0066, 0x0904, 0x6335, - 0x90c6, 0x0067, 0x0904, 0x6339, 0x90c6, 0x0068, 0x0904, 0x633d, - 0x90c6, 0x0071, 0x0904, 0x6341, 0x90c6, 0x0074, 0x0904, 0x6345, - 0x90c6, 0x007c, 0x0904, 0x6349, 0x90c6, 0x007e, 0x0904, 0x634d, - 0x90c6, 0x0037, 0x0904, 0x6351, 0x9016, 0x2079, 0x1800, 0xa974, - 0x9186, 0x00ff, 0x0904, 0x6328, 0x9182, 0x0800, 0x1a04, 0x6328, - 0x080c, 0x649f, 0x1198, 0xb804, 0x9084, 0x00ff, 0x9082, 0x0006, - 0x1268, 0xa894, 0x90c6, 0x006f, 0x0148, 0x080c, 0xa062, 0x1904, - 0x6311, 0xb8a0, 0x9084, 0xff80, 0x1904, 0x6311, 0xa894, 0x90c6, - 0x006f, 0x0158, 0x90c6, 0x005e, 0x0904, 0x6271, 0x90c6, 0x0064, - 0x0904, 0x629a, 0x2008, 0x0804, 0x6234, 0xa998, 0xa8b0, 0x2040, - 0x080c, 0xa062, 0x1120, 0x9182, 0x007f, 0x0a04, 0x6234, 0x9186, - 0x00ff, 0x0904, 0x6234, 0x9182, 0x0800, 0x1a04, 0x6234, 0xaaa0, - 0xab9c, 0x7878, 0x9306, 0x11a8, 0x787c, 0x0096, 0x924e, 0x1128, - 0x2208, 0x2310, 0x009e, 0x0804, 0x6234, 0x080c, 0xa062, 0x1140, - 0x99cc, 0xff00, 0x009e, 0x1128, 0x2208, 0x2310, 0x0804, 0x6234, - 0x009e, 0x080c, 0x49d9, 0x0904, 0x623d, 0x900e, 0x9016, 0x90c6, - 0x4000, 0x1558, 0x0006, 0x080c, 0x66bf, 0x1108, 0xc185, 0xb800, - 0xd0bc, 0x0108, 0xc18d, 0x20a9, 0x0004, 0xa860, 0x20e8, 0xa85c, - 0x9080, 0x0031, 0x20a0, 0xb8b4, 0x20e0, 0xb8b8, 0x9080, 0x0006, - 0x2098, 0x080c, 0x0fae, 0x20a9, 0x0004, 0xa860, 0x20e8, 0xa85c, - 0x9080, 0x0035, 0x20a0, 0xb8b4, 0x20e0, 0xb8b8, 0x9080, 0x000a, - 0x2098, 0x080c, 0x0fae, 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, 0x0470, 0x080c, 0xa08d, 0x1130, - 0x2001, 0x4005, 0x2009, 0x0003, 0x9016, 0x0c80, 0x2b00, 0x6012, - 0x080c, 0xc2b3, 0x2900, 0x6016, 0x6023, 0x0001, 0xa868, 0xd88c, - 0x0108, 0xc0f5, 0xa86a, 0x0126, 0x2091, 0x8000, 0x080c, 0x318b, - 0x012e, 0x9006, 0x080c, 0x63dc, 0x2001, 0x0002, 0x080c, 0x63f0, - 0x2009, 0x0002, 0x080c, 0xa15d, 0xa8b0, 0xd094, 0x0118, 0xb8bc, - 0xc08d, 0xb8be, 0x9006, 0x9005, 0x012e, 0x00ee, 0x00fe, 0x00be, - 0x0005, 0x080c, 0x55ef, 0x0118, 0x2009, 0x0007, 0x00f8, 0xa998, - 0xaeb0, 0x080c, 0x649f, 0x1904, 0x622f, 0x9186, 0x007f, 0x0130, - 0x080c, 0x67c3, 0x0118, 0x2009, 0x0009, 0x0080, 0x0096, 0x080c, - 0x1031, 0x1120, 0x009e, 0x2009, 0x0002, 0x0040, 0x2900, 0x009e, - 0xa806, 0x080c, 0xc01f, 0x19b0, 0x2009, 0x0003, 0x2001, 0x4005, - 0x0804, 0x6236, 0xa998, 0xaeb0, 0x080c, 0x649f, 0x1904, 0x622f, - 0x0096, 0x080c, 0x1031, 0x1128, 0x009e, 0x2009, 0x0002, 0x0804, - 0x62ee, 0x2900, 0x009e, 0xa806, 0x0096, 0x2048, 0x20a9, 0x002b, - 0xb8b4, 0x20e0, 0xb8b8, 0x2098, 0xa860, 0x20e8, 0xa85c, 0x9080, - 0x0002, 0x20a0, 0x4003, 0x20a9, 0x0008, 0x9080, 0x0006, 0x20a0, - 0xbbb8, 0x9398, 0x0006, 0x2398, 0x080c, 0x0fae, 0x009e, 0xa87b, - 0x0000, 0xa883, 0x0000, 0xa897, 0x4000, 0xd684, 0x1168, 0x080c, - 0x55db, 0xd0b4, 0x1118, 0xa89b, 0x000b, 0x00e0, 0xb800, 0xd08c, - 0x0118, 0xa89b, 0x000c, 0x00b0, 0x080c, 0x67c3, 0x0118, 0xa89b, - 0x0009, 0x0080, 0x080c, 0x55ef, 0x0118, 0xa89b, 0x0007, 0x0050, - 0x080c, 0xc002, 0x1904, 0x626a, 0x2009, 0x0003, 0x2001, 0x4005, - 0x0804, 0x6236, 0xa87b, 0x0030, 0xa897, 0x4005, 0xa804, 0x8006, - 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x0002, - 0x2009, 0x002b, 0xaaa0, 0xab9c, 0xaca8, 0xada4, 0x2031, 0x0000, - 0x2041, 0x1288, 0x080c, 0xa5e6, 0x1904, 0x626a, 0x2009, 0x0002, - 0x08e8, 0x2001, 0x0028, 0x900e, 0x0804, 0x626b, 0x2009, 0x180c, - 0x210c, 0xd18c, 0x0118, 0x2001, 0x0004, 0x0038, 0xd184, 0x0118, - 0x2001, 0x0004, 0x0010, 0x2001, 0x0029, 0x900e, 0x0804, 0x626b, - 0x2001, 0x0029, 0x900e, 0x0804, 0x626b, 0x080c, 0x3718, 0x0804, - 0x626c, 0x080c, 0x5306, 0x0804, 0x626c, 0x080c, 0x455e, 0x0804, - 0x626c, 0x080c, 0x45d7, 0x0804, 0x626c, 0x080c, 0x4633, 0x0804, - 0x626c, 0x080c, 0x4a95, 0x0804, 0x626c, 0x080c, 0x4d3e, 0x0804, - 0x626c, 0x080c, 0x4f6e, 0x0804, 0x626c, 0x080c, 0x5167, 0x0804, - 0x626c, 0x080c, 0x3941, 0x0804, 0x626c, 0x00b6, 0xa974, 0xae78, - 0x9684, 0x3fff, 0x9082, 0x4000, 0x1618, 0x9182, 0x0800, 0x1268, - 0x9188, 0x1000, 0x2104, 0x905d, 0x0140, 0x080c, 0x67c3, 0x1148, - 0x00e9, 0x080c, 0x65ca, 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, 0x19bf, 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, - 0x67bf, 0x0140, 0x9284, 0xff00, 0x8007, 0x9086, 0x0007, 0x1110, - 0x2011, 0x0600, 0x000e, 0x9294, 0xff00, 0x9215, 0xba06, 0x0006, - 0x9086, 0x0006, 0x1120, 0xba90, 0x82ff, 0x090c, 0x0dfa, 0x000e, + 0x220e, 0x8210, 0x8108, 0x9186, 0x0260, 0x1150, 0x6810, 0x8000, + 0x6812, 0x2009, 0x0240, 0x6814, 0x8000, 0x6816, 0x2011, 0x0260, + 0x1f04, 0x5ba0, 0x60c3, 0x0084, 0x080c, 0x5cc2, 0x0005, 0x0005, + 0x0086, 0x0096, 0x2029, 0x185c, 0x252c, 0x20a9, 0x0008, 0x2041, + 0x1c0e, 0x20e9, 0x0001, 0x28a0, 0x080c, 0x5e09, 0x20e1, 0x0000, + 0x2099, 0x026e, 0x4003, 0x20a9, 0x0008, 0x2011, 0x0007, 0xd5d4, + 0x0108, 0x9016, 0x2800, 0x9200, 0x200c, 0x91a6, 0xffff, 0x1148, + 0xd5d4, 0x0110, 0x8210, 0x0008, 0x8211, 0x1f04, 0x5bd2, 0x0804, + 0x5c41, 0x82ff, 0x1160, 0xd5d4, 0x0120, 0x91a6, 0x3fff, 0x0d90, + 0x0020, 0x91a6, 0x3fff, 0x0904, 0x5c41, 0x918d, 0xc000, 0x20a9, + 0x0010, 0x2019, 0x0001, 0xd5d4, 0x0110, 0x2019, 0x0010, 0x2120, + 0xd5d4, 0x0110, 0x8423, 0x0008, 0x8424, 0x1240, 0xd5d4, 0x0110, + 0x8319, 0x0008, 0x8318, 0x1f04, 0x5bf8, 0x04d8, 0x23a8, 0x2021, + 0x0001, 0x8426, 0x8425, 0x1f04, 0x5c0a, 0x2328, 0x8529, 0x92be, + 0x0007, 0x0158, 0x0006, 0x2039, 0x0007, 0x2200, 0x973a, 0x000e, + 0x27a8, 0x95a8, 0x0010, 0x1f04, 0x5c19, 0x755a, 0x95c8, 0x31f3, + 0x292d, 0x95ac, 0x00ff, 0x757e, 0x6532, 0x6536, 0x0016, 0x2508, + 0x080c, 0x26b6, 0x001e, 0x60e7, 0x0000, 0x65ea, 0x2018, 0x2304, + 0x9405, 0x201a, 0x7083, 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, 0x715a, 0x91a0, 0x31f3, 0x242d, 0x95ac, + 0x00ff, 0x757e, 0x6532, 0x6536, 0x0016, 0x2508, 0x080c, 0x26b6, + 0x001e, 0x60e7, 0x0000, 0x65ea, 0x7083, 0x0001, 0x9084, 0x0000, + 0x0005, 0x00e6, 0x2071, 0x1800, 0x7087, 0x0000, 0x00ee, 0x0005, + 0x00e6, 0x00f6, 0x2079, 0x0100, 0x2071, 0x0140, 0x080c, 0x5d4e, + 0x080c, 0x961a, 0x7004, 0x9084, 0x4000, 0x0110, 0x080c, 0x2b7f, + 0x0126, 0x2091, 0x8000, 0x2071, 0x1825, 0x2073, 0x0000, 0x7840, + 0x0026, 0x0016, 0x2009, 0x00f7, 0x080c, 0x5dab, 0x001e, 0x9094, + 0x0010, 0x9285, 0x0080, 0x7842, 0x7a42, 0x002e, 0x012e, 0x00fe, + 0x00ee, 0x0005, 0x0126, 0x2091, 0x8000, 0x080c, 0x29e9, 0x0228, + 0x2011, 0x0101, 0x2204, 0xc0c5, 0x2012, 0x2011, 0x19cc, 0x2013, + 0x0000, 0x708f, 0x0000, 0x012e, 0x60a3, 0x0056, 0x60a7, 0x9575, + 0x080c, 0x9611, 0x6144, 0xd184, 0x0120, 0x7194, 0x918d, 0x2000, + 0x0018, 0x7188, 0x918d, 0x1000, 0x2011, 0x1973, 0x2112, 0x2009, + 0x07d0, 0x2011, 0x5c98, 0x080c, 0x82eb, 0x0005, 0x0016, 0x0026, + 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, 0x9f70, 0x2009, 0x00f7, + 0x080c, 0x5dab, 0x2061, 0x19d5, 0x900e, 0x611a, 0x611e, 0x617a, + 0x617e, 0x2061, 0x1800, 0x6003, 0x0001, 0x2061, 0x0100, 0x6043, + 0x0090, 0x6043, 0x0010, 0x2009, 0x1973, 0x200b, 0x0000, 0x2009, + 0x002d, 0x2011, 0x5d1a, 0x080c, 0x824d, 0x012e, 0x00ce, 0x002e, + 0x001e, 0x0005, 0x00e6, 0x0006, 0x0126, 0x2091, 0x8000, 0x0471, + 0x2071, 0x0100, 0x080c, 0x961a, 0x2071, 0x0140, 0x7004, 0x9084, + 0x4000, 0x0110, 0x080c, 0x2b7f, 0x080c, 0x7186, 0x0188, 0x080c, + 0x71a1, 0x1170, 0x080c, 0x7484, 0x0016, 0x080c, 0x2785, 0x2001, + 0x1947, 0x2102, 0x001e, 0x080c, 0x747f, 0x080c, 0x709e, 0x0050, + 0x2009, 0x0001, 0x080c, 0x2a9d, 0x2001, 0x0001, 0x080c, 0x2616, + 0x080c, 0x5cee, 0x012e, 0x000e, 0x00ee, 0x0005, 0x2001, 0x180e, + 0x2004, 0xd0bc, 0x0158, 0x0026, 0x0036, 0x2011, 0x8017, 0x2001, + 0x1973, 0x201c, 0x080c, 0x4a17, 0x003e, 0x002e, 0x0005, 0x20a9, + 0x0012, 0x20e9, 0x0001, 0x20a1, 0x1c80, 0x080c, 0x5e09, 0x20e9, + 0x0000, 0x2099, 0x026e, 0x0099, 0x20a9, 0x0020, 0x080c, 0x5e03, + 0x2099, 0x0260, 0x20a1, 0x1c92, 0x0051, 0x20a9, 0x000e, 0x080c, + 0x5e06, 0x2099, 0x0260, 0x20a1, 0x1cb2, 0x0009, 0x0005, 0x0016, + 0x0026, 0x3410, 0x3308, 0x2104, 0x8007, 0x2012, 0x8108, 0x8210, + 0x1f04, 0x5d83, 0x002e, 0x001e, 0x0005, 0x080c, 0x9df2, 0x20e1, + 0x0001, 0x2099, 0x1c00, 0x20e9, 0x0000, 0x20a1, 0x0240, 0x20a9, + 0x000c, 0x4003, 0x0005, 0x080c, 0x9df2, 0x080c, 0x5e09, 0x20e1, + 0x0000, 0x2099, 0x0260, 0x20e9, 0x0000, 0x20a1, 0x0240, 0x20a9, + 0x000c, 0x4003, 0x0005, 0x00c6, 0x0006, 0x2061, 0x0100, 0x810f, + 0x2001, 0x1833, 0x2004, 0x9005, 0x1138, 0x2001, 0x1817, 0x2004, + 0x9084, 0x00ff, 0x9105, 0x0010, 0x9185, 0x00f7, 0x604a, 0x000e, + 0x00ce, 0x0005, 0x0016, 0x0046, 0x080c, 0x66c5, 0x0158, 0x9006, + 0x2020, 0x2009, 0x002a, 0x080c, 0xd837, 0x2001, 0x180c, 0x200c, + 0xc195, 0x2102, 0x2019, 0x002a, 0x900e, 0x080c, 0x3060, 0x080c, + 0xc459, 0x0140, 0x0036, 0x2019, 0xffff, 0x2021, 0x0007, 0x080c, + 0x4bb4, 0x003e, 0x004e, 0x001e, 0x0005, 0x080c, 0x5cee, 0x7097, + 0x0000, 0x708f, 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, 0x1981, 0x0118, 0x2003, + 0x0001, 0x0010, 0x2003, 0x0000, 0x0005, 0x0156, 0x20a9, 0x0800, + 0x2009, 0x1000, 0x9006, 0x200a, 0x8108, 0x1f04, 0x5e43, 0x015e, + 0x0005, 0x00d6, 0x0036, 0x0156, 0x0136, 0x0146, 0x2069, 0x185b, + 0x9006, 0xb802, 0xb8be, 0xb807, 0x0707, 0xb80a, 0xb80e, 0xb812, + 0x9198, 0x31f3, 0x231d, 0x939c, 0x00ff, 0xbb16, 0x0016, 0x0026, + 0xb8b2, 0x080c, 0x9f69, 0x1120, 0x9192, 0x007e, 0x1208, 0xbbb2, + 0x20a9, 0x0004, 0xb8b4, 0x20e8, 0xb9b8, 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, + 0xb8ae, 0xb9a2, 0x0096, 0xb8a4, 0x904d, 0x0110, 0x080c, 0x1069, + 0xb8a7, 0x0000, 0x009e, 0x9006, 0xb84a, 0x6810, 0xb83a, 0x680c, + 0xb846, 0x6814, 0x9084, 0x00ff, 0xb842, 0x014e, 0x013e, 0x015e, + 0x003e, 0x00de, 0x0005, 0x0126, 0x2091, 0x8000, 0xa974, 0xae78, + 0x9684, 0x3fff, 0x9082, 0x4000, 0x1a04, 0x5f19, 0x9182, 0x0800, + 0x1a04, 0x5f1d, 0x2001, 0x180c, 0x2004, 0x9084, 0x0003, 0x1904, + 0x5f23, 0x9188, 0x1000, 0x2104, 0x905d, 0x0518, 0xb804, 0x9084, + 0x00ff, 0x908e, 0x0006, 0x1508, 0xb8a4, 0x900d, 0x1904, 0x5f35, + 0xb850, 0x900d, 0x1148, 0xa802, 0x2900, 0xb852, 0xb84e, 0x080c, + 0x8615, 0x9006, 0x012e, 0x0005, 0x00a6, 0x2150, 0x2900, 0xb002, + 0xa803, 0x0000, 0x00ae, 0xb852, 0x0c90, 0x2001, 0x0005, 0x900e, + 0x04b8, 0x2001, 0x0028, 0x900e, 0x0498, 0x9082, 0x0006, 0x1290, + 0x080c, 0x9f69, 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, 0x66c9, 0x1990, + 0xb800, 0xd0bc, 0x0978, 0x0804, 0x5ecc, 0x080c, 0x653f, 0x0904, + 0x5ee5, 0x0804, 0x5ed0, 0x00b6, 0x00e6, 0x0126, 0x2091, 0x8000, + 0xa974, 0x9182, 0x0800, 0x1a04, 0x5fb9, 0x9188, 0x1000, 0x2104, + 0x905d, 0x0904, 0x5f91, 0xb8a0, 0x9086, 0x007f, 0x0190, 0xa87c, + 0xd0fc, 0x1178, 0x080c, 0x66d1, 0x0160, 0xa994, 0x81ff, 0x0130, + 0x908e, 0x0004, 0x0130, 0x908e, 0x0005, 0x0118, 0x080c, 0x66c9, + 0x1598, 0xa87c, 0xd0fc, 0x01e0, 0xa894, 0x9005, 0x01c8, 0x2060, + 0x0026, 0x2010, 0x080c, 0xbd3c, 0x002e, 0x1120, 0x2001, 0x0008, + 0x0804, 0x5fbb, 0x6020, 0x9086, 0x000a, 0x0120, 0x2001, 0x0008, + 0x0804, 0x5fbb, 0x601a, 0x6003, 0x0008, 0x2900, 0x6016, 0x0058, + 0x080c, 0x9f94, 0x05e8, 0x2b00, 0x6012, 0x2900, 0x6016, 0x600b, + 0xffff, 0x6023, 0x000a, 0x2009, 0x0003, 0x080c, 0xa068, 0x9006, + 0x0458, 0x2001, 0x0028, 0x0438, 0x9082, 0x0006, 0x1290, 0x080c, + 0x9f69, 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, 0x6050, 0x600b, 0x6022, 0x6050, 0x6050, + 0x6050, 0x6050, 0x6050, 0x2100, 0x9082, 0x007e, 0x1278, 0x080c, + 0x6343, 0x0148, 0x9046, 0xb810, 0x9306, 0x1904, 0x6058, 0xb814, + 0x9206, 0x15f0, 0x0028, 0xbb12, 0xba16, 0x0010, 0x080c, 0x48d1, + 0x0150, 0x04b0, 0x080c, 0x63a3, 0x1598, 0xb810, 0x9306, 0x1580, + 0xb814, 0x9206, 0x1568, 0x080c, 0x9f94, 0x0530, 0x2b00, 0x6012, + 0x080c, 0xc1ca, 0x2900, 0x6016, 0x600b, 0xffff, 0x6023, 0x000a, + 0xa878, 0x9086, 0x0001, 0x1170, 0x080c, 0x3095, 0x9006, 0x080c, + 0x62e0, 0x2001, 0x0002, 0x080c, 0x62f4, 0x2001, 0x0200, 0xb86e, + 0xb893, 0x0002, 0x2009, 0x0003, 0x080c, 0xa068, 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, 0x6231, 0x90c6, 0x0056, 0x0904, 0x6235, + 0x90c6, 0x0066, 0x0904, 0x6239, 0x90c6, 0x0067, 0x0904, 0x623d, + 0x90c6, 0x0068, 0x0904, 0x6241, 0x90c6, 0x0071, 0x0904, 0x6245, + 0x90c6, 0x0074, 0x0904, 0x6249, 0x90c6, 0x007c, 0x0904, 0x624d, + 0x90c6, 0x007e, 0x0904, 0x6251, 0x90c6, 0x0037, 0x0904, 0x6255, + 0x9016, 0x2079, 0x1800, 0xa974, 0x9186, 0x00ff, 0x0904, 0x622c, + 0x9182, 0x0800, 0x1a04, 0x622c, 0x080c, 0x63a3, 0x1198, 0xb804, + 0x9084, 0x00ff, 0x9082, 0x0006, 0x1268, 0xa894, 0x90c6, 0x006f, + 0x0148, 0x080c, 0x9f69, 0x1904, 0x6215, 0xb8a0, 0x9084, 0xff80, + 0x1904, 0x6215, 0xa894, 0x90c6, 0x006f, 0x0158, 0x90c6, 0x005e, + 0x0904, 0x6175, 0x90c6, 0x0064, 0x0904, 0x619e, 0x2008, 0x0804, + 0x6138, 0xa998, 0xa8b0, 0x2040, 0x080c, 0x9f69, 0x1120, 0x9182, + 0x007f, 0x0a04, 0x6138, 0x9186, 0x00ff, 0x0904, 0x6138, 0x9182, + 0x0800, 0x1a04, 0x6138, 0xaaa0, 0xab9c, 0x7878, 0x9306, 0x11a8, + 0x787c, 0x0096, 0x924e, 0x1128, 0x2208, 0x2310, 0x009e, 0x0804, + 0x6138, 0x080c, 0x9f69, 0x1140, 0x99cc, 0xff00, 0x009e, 0x1128, + 0x2208, 0x2310, 0x0804, 0x6138, 0x009e, 0x080c, 0x48d1, 0x0904, + 0x6141, 0x900e, 0x9016, 0x90c6, 0x4000, 0x1558, 0x0006, 0x080c, + 0x65c3, 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d, 0x20a9, + 0x0004, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0031, 0x20a0, 0xb8b4, + 0x20e0, 0xb8b8, 0x9080, 0x0006, 0x2098, 0x080c, 0x0fb4, 0x20a9, + 0x0004, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0035, 0x20a0, 0xb8b4, + 0x20e0, 0xb8b8, 0x9080, 0x000a, 0x2098, 0x080c, 0x0fb4, 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, + 0x0470, 0x080c, 0x9f94, 0x1130, 0x2001, 0x4005, 0x2009, 0x0003, + 0x9016, 0x0c80, 0x2b00, 0x6012, 0x080c, 0xc1ca, 0x2900, 0x6016, + 0x6023, 0x0001, 0xa868, 0xd88c, 0x0108, 0xc0f5, 0xa86a, 0x0126, + 0x2091, 0x8000, 0x080c, 0x3095, 0x012e, 0x9006, 0x080c, 0x62e0, + 0x2001, 0x0002, 0x080c, 0x62f4, 0x2009, 0x0002, 0x080c, 0xa068, + 0xa8b0, 0xd094, 0x0118, 0xb8bc, 0xc08d, 0xb8be, 0x9006, 0x9005, + 0x012e, 0x00ee, 0x00fe, 0x00be, 0x0005, 0x080c, 0x54ef, 0x0118, + 0x2009, 0x0007, 0x00f8, 0xa998, 0xaeb0, 0x080c, 0x63a3, 0x1904, + 0x6133, 0x9186, 0x007f, 0x0130, 0x080c, 0x66c9, 0x0118, 0x2009, + 0x0009, 0x0080, 0x0096, 0x080c, 0x1037, 0x1120, 0x009e, 0x2009, + 0x0002, 0x0040, 0x2900, 0x009e, 0xa806, 0x080c, 0xbf36, 0x19b0, + 0x2009, 0x0003, 0x2001, 0x4005, 0x0804, 0x613a, 0xa998, 0xaeb0, + 0x080c, 0x63a3, 0x1904, 0x6133, 0x0096, 0x080c, 0x1037, 0x1128, + 0x009e, 0x2009, 0x0002, 0x0804, 0x61f2, 0x2900, 0x009e, 0xa806, + 0x0096, 0x2048, 0x20a9, 0x002b, 0xb8b4, 0x20e0, 0xb8b8, 0x2098, + 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0002, 0x20a0, 0x4003, 0x20a9, + 0x0008, 0x9080, 0x0006, 0x20a0, 0xbbb8, 0x9398, 0x0006, 0x2398, + 0x080c, 0x0fb4, 0x009e, 0xa87b, 0x0000, 0xa883, 0x0000, 0xa897, + 0x4000, 0xd684, 0x1168, 0x080c, 0x54db, 0xd0b4, 0x1118, 0xa89b, + 0x000b, 0x00e0, 0xb800, 0xd08c, 0x0118, 0xa89b, 0x000c, 0x00b0, + 0x080c, 0x66c9, 0x0118, 0xa89b, 0x0009, 0x0080, 0x080c, 0x54ef, + 0x0118, 0xa89b, 0x0007, 0x0050, 0x080c, 0xbf19, 0x1904, 0x616e, + 0x2009, 0x0003, 0x2001, 0x4005, 0x0804, 0x613a, 0xa87b, 0x0030, + 0xa897, 0x4005, 0xa804, 0x8006, 0x8006, 0x8007, 0x90bc, 0x003f, + 0x9084, 0xffc0, 0x9080, 0x0002, 0x2009, 0x002b, 0xaaa0, 0xab9c, + 0xaca8, 0xada4, 0x2031, 0x0000, 0x2041, 0x128e, 0x080c, 0xa4f1, + 0x1904, 0x616e, 0x2009, 0x0002, 0x08e8, 0x2001, 0x0028, 0x900e, + 0x0804, 0x616f, 0x2009, 0x180c, 0x210c, 0xd18c, 0x0118, 0x2001, + 0x0004, 0x0038, 0xd184, 0x0118, 0x2001, 0x0004, 0x0010, 0x2001, + 0x0029, 0x900e, 0x0804, 0x616f, 0x2001, 0x0029, 0x900e, 0x0804, + 0x616f, 0x080c, 0x3624, 0x0804, 0x6170, 0x080c, 0x5206, 0x0804, + 0x6170, 0x080c, 0x448c, 0x0804, 0x6170, 0x080c, 0x4505, 0x0804, + 0x6170, 0x080c, 0x4561, 0x0804, 0x6170, 0x080c, 0x498d, 0x0804, + 0x6170, 0x080c, 0x4c36, 0x0804, 0x6170, 0x080c, 0x4e6d, 0x0804, + 0x6170, 0x080c, 0x5066, 0x0804, 0x6170, 0x080c, 0x384d, 0x0804, + 0x6170, 0x00b6, 0xa974, 0xae78, 0x9684, 0x3fff, 0x9082, 0x4000, + 0x1618, 0x9182, 0x0800, 0x1268, 0x9188, 0x1000, 0x2104, 0x905d, + 0x0140, 0x080c, 0x66c9, 0x1148, 0x00e9, 0x080c, 0x64ce, 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, + 0x19c2, 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, 0x1168, - 0xb89c, 0xd0a4, 0x0150, 0x080c, 0x67bb, 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, 0x1180, 0x0096, 0x080c, 0x1031, 0x2958, - 0x009e, 0x0160, 0x2b00, 0x2012, 0xb85c, 0xb8ba, 0xb860, 0xb8b6, - 0x9006, 0xb8a6, 0x080c, 0x5f45, 0x9006, 0x0010, 0x9085, 0x0001, - 0x002e, 0x00de, 0x0005, 0x00b6, 0x0096, 0x0126, 0x2091, 0x8000, - 0x0026, 0x9182, 0x0800, 0x0218, 0x9085, 0x0001, 0x0458, 0x00d6, - 0x9190, 0x1000, 0x2204, 0x905d, 0x0518, 0x2013, 0x0000, 0xb8a4, - 0x904d, 0x0110, 0x080c, 0x1063, 0x00d6, 0x00c6, 0xb8ac, 0x2060, - 0x8cff, 0x0168, 0x600c, 0x0006, 0x6014, 0x2048, 0x080c, 0xbe37, - 0x0110, 0x080c, 0x0fe3, 0x080c, 0xa0e3, 0x00ce, 0x0c88, 0x00ce, - 0x00de, 0x2b48, 0xb8b8, 0xb85e, 0xb8b4, 0xb862, 0x080c, 0x1073, - 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, 0x7207, 0x1510, 0xb8a0, 0x9086, 0x007e, 0x0120, 0x080c, - 0xa062, 0x11d8, 0x0078, 0x7040, 0xd0e4, 0x01b8, 0x00c6, 0x2061, - 0x195a, 0x7048, 0x2062, 0x704c, 0x6006, 0x7050, 0x600a, 0x7054, - 0x600e, 0x00ce, 0x703c, 0x2069, 0x0140, 0x9005, 0x1110, 0x2001, - 0x0001, 0x6886, 0x2069, 0x1800, 0x68b2, 0x7040, 0xb85e, 0x7048, - 0xb862, 0x704c, 0xb866, 0x20e1, 0x0000, 0x2099, 0x0276, 0xb8b4, - 0x20e8, 0xb8b8, 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, 0xbbbc, 0xc384, - 0xba00, 0x2009, 0x187b, 0x210c, 0xd0bc, 0x0120, 0xd1ec, 0x0110, - 0xc2ad, 0x0008, 0xc2ac, 0xd0c4, 0x0148, 0xd1e4, 0x0138, 0xc2bd, - 0xd0cc, 0x0128, 0xd38c, 0x1108, 0xc385, 0x0008, 0xc2bc, 0xba02, - 0xbbbe, 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, 0x0dfa, 0x3c00, - 0x20e8, 0x3300, 0x8001, 0x20a0, 0x4604, 0x8210, 0xaa06, 0x01de, - 0x01ce, 0x014e, 0x013e, 0x0060, 0x080c, 0x1031, 0x0170, 0x2900, - 0xb8a6, 0xa803, 0x0000, 0x080c, 0x665b, 0xa807, 0x0001, 0xae12, - 0x9085, 0x0001, 0x012e, 0x009e, 0x0005, 0x9006, 0x0cd8, 0x0126, - 0x2091, 0x8000, 0x0096, 0xb8a4, 0x904d, 0x0188, 0xa800, 0x9005, - 0x1150, 0x080c, 0x666a, 0x1158, 0xa804, 0x908a, 0x0002, 0x0218, - 0x8001, 0xa806, 0x0020, 0x080c, 0x1063, 0xb8a7, 0x0000, 0x009e, - 0x012e, 0x0005, 0x0126, 0x2091, 0x8000, 0x080c, 0x8696, 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, 0x9a4e, 0xaa00, 0xb84c, 0x9906, 0x1110, 0xba4e, 0x0020, - 0x00a6, 0x2150, 0xb202, 0x00ae, 0x82ff, 0x1110, 0xb952, 0x89ff, - 0x012e, 0x0005, 0x9016, 0x0489, 0x1110, 0x2011, 0x0001, 0x0005, - 0x080c, 0x66bf, 0x0128, 0x080c, 0xbef4, 0x0010, 0x9085, 0x0001, - 0x0005, 0x080c, 0x66bf, 0x0128, 0x080c, 0xbe99, 0x0010, 0x9085, - 0x0001, 0x0005, 0x080c, 0x66bf, 0x0128, 0x080c, 0xbef1, 0x0010, - 0x9085, 0x0001, 0x0005, 0x080c, 0x66bf, 0x0128, 0x080c, 0xbeb8, - 0x0010, 0x9085, 0x0001, 0x0005, 0x080c, 0x66bf, 0x0128, 0x080c, - 0xbf37, 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, 0x1031, 0x0168, - 0x2900, 0xb8a6, 0x080c, 0x665b, 0xa803, 0x0001, 0xa807, 0x0000, - 0x9085, 0x0001, 0x012e, 0x009e, 0x0005, 0x9006, 0x0cd8, 0x0096, - 0x0126, 0x2091, 0x8000, 0xb8a4, 0x904d, 0x0130, 0xb8a7, 0x0000, - 0x080c, 0x1063, 0x9085, 0x0001, 0x012e, 0x009e, 0x0005, 0xb89c, - 0xd0a4, 0x0005, 0x00b6, 0x00f6, 0x080c, 0x7207, 0x01b0, 0x71c0, - 0x81ff, 0x1198, 0x71d8, 0xd19c, 0x0180, 0x2001, 0x007e, 0x9080, - 0x1000, 0x2004, 0x905d, 0x0148, 0xb804, 0x9084, 0x00ff, 0x9086, - 0x0006, 0x1118, 0xb800, 0xc0ed, 0xb802, 0x2079, 0x185b, 0x7804, - 0x00d0, 0x0156, 0x20a9, 0x007f, 0x900e, 0x0016, 0x080c, 0x649f, - 0x1168, 0xb804, 0x9084, 0xff00, 0x8007, 0x9096, 0x0004, 0x0118, - 0x9086, 0x0006, 0x1118, 0xb800, 0xc0ed, 0xb802, 0x001e, 0x8108, - 0x1f04, 0x66e5, 0x015e, 0x080c, 0x6781, 0x0120, 0x2001, 0x195d, - 0x200c, 0x0030, 0x2079, 0x185b, 0x7804, 0x0030, 0x2009, 0x07d0, - 0x2011, 0x670f, 0x080c, 0x836c, 0x00fe, 0x00be, 0x0005, 0x00b6, - 0x2011, 0x670f, 0x080c, 0x82da, 0x080c, 0x6781, 0x01d8, 0x2001, - 0x107e, 0x2004, 0x2058, 0xb900, 0xc1ec, 0xb902, 0x080c, 0x67bf, - 0x0130, 0x2009, 0x07d0, 0x2011, 0x670f, 0x080c, 0x836c, 0x00e6, - 0x2071, 0x1800, 0x9006, 0x707a, 0x705c, 0x707e, 0x080c, 0x2f6c, - 0x00ee, 0x04b0, 0x0156, 0x00c6, 0x20a9, 0x007f, 0x900e, 0x0016, - 0x080c, 0x649f, 0x1538, 0xb800, 0xd0ec, 0x0520, 0x0046, 0xbaa0, - 0x2220, 0x9006, 0x2009, 0x0029, 0x080c, 0xd885, 0xb800, 0xc0e5, - 0xc0ec, 0xb802, 0x080c, 0x67bb, 0x2001, 0x0707, 0x1128, 0xb804, - 0x9084, 0x00ff, 0x9085, 0x0700, 0xb806, 0x2019, 0x0029, 0x080c, - 0x8803, 0x0076, 0x903e, 0x080c, 0x86f1, 0x900e, 0x080c, 0xd5f6, - 0x007e, 0x004e, 0x001e, 0x8108, 0x1f04, 0x6737, 0x00ce, 0x015e, - 0x00be, 0x0005, 0x00b6, 0x6010, 0x2058, 0xb800, 0xc0ec, 0xb802, - 0x00be, 0x0005, 0x7810, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0ac, - 0x0005, 0x6010, 0x00b6, 0x905d, 0x0108, 0xb800, 0x00be, 0xd0bc, - 0x0005, 0x00b6, 0x00f6, 0x2001, 0x107e, 0x2004, 0x905d, 0x0110, - 0xb800, 0xd0ec, 0x00fe, 0x00be, 0x0005, 0x0126, 0x0026, 0x2091, - 0x8000, 0x0006, 0xbaa0, 0x9290, 0x1000, 0x2204, 0x9b06, 0x190c, - 0x0dfa, 0x000e, 0xba00, 0x9005, 0x0110, 0xc2fd, 0x0008, 0xc2fc, - 0xba02, 0x002e, 0x012e, 0x0005, 0x2011, 0x1836, 0x2204, 0xd0cc, - 0x0138, 0x2001, 0x195b, 0x200c, 0x2011, 0x67b1, 0x080c, 0x836c, - 0x0005, 0x2011, 0x67b1, 0x080c, 0x82da, 0x2011, 0x1836, 0x2204, - 0xc0cc, 0x2012, 0x0005, 0x080c, 0x55db, 0xd0ac, 0x0005, 0x080c, - 0x55db, 0xd0a4, 0x0005, 0x0016, 0xb904, 0x9184, 0x00ff, 0x908e, - 0x0006, 0x001e, 0x0005, 0x0016, 0xb904, 0x9184, 0xff00, 0x8007, - 0x908e, 0x0006, 0x001e, 0x0005, 0x00b6, 0x00f6, 0x080c, 0xc539, - 0x0158, 0x70d8, 0x9084, 0x0028, 0x0138, 0x2001, 0x107f, 0x2004, - 0x905d, 0x0110, 0xb8bc, 0xd094, 0x00fe, 0x00be, 0x0005, 0x0006, - 0x0016, 0x0036, 0x0046, 0x0076, 0x00b6, 0x2001, 0x1817, 0x203c, - 0x9780, 0x32e9, 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, 0x1817, - 0x203c, 0x9780, 0x32e9, 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, 0x2071, 0x190e, - 0x7003, 0x0001, 0x7007, 0x0000, 0x9006, 0x7012, 0x7016, 0x701a, - 0x701e, 0x700a, 0x7046, 0x0005, 0x0016, 0x00e6, 0x2071, 0x1921, - 0x900e, 0x710a, 0x080c, 0x55db, 0xd0fc, 0x1140, 0x080c, 0x55db, - 0x900e, 0xd09c, 0x0108, 0x8108, 0x7102, 0x0400, 0x2001, 0x187b, - 0x200c, 0x9184, 0x0007, 0x9006, 0x0002, 0x6896, 0x6896, 0x6896, - 0x6896, 0x6896, 0x68ad, 0x68bb, 0x6896, 0x7003, 0x0003, 0x2009, - 0x187c, 0x210c, 0x9184, 0xff00, 0x8007, 0x9005, 0x1110, 0x2001, - 0x0002, 0x7006, 0x0018, 0x7003, 0x0005, 0x0c88, 0x00ee, 0x001e, - 0x0005, 0x00e6, 0x2071, 0x0050, 0x684c, 0x9005, 0x1150, 0x00e6, + 0x8000, 0x6210, 0x2258, 0xba04, 0x0006, 0x9086, 0x0006, 0x1170, + 0xb89c, 0xd0ac, 0x0158, 0x080c, 0x66c5, 0x0140, 0x9284, 0xff00, + 0x8007, 0x9086, 0x0007, 0x1110, 0x2011, 0x0600, 0x000e, 0x9294, + 0xff00, 0x9215, 0xba06, 0x0006, 0x9086, 0x0006, 0x1120, 0xba90, + 0x82ff, 0x090c, 0x0df6, 0x000e, 0x00ce, 0x012e, 0x00be, 0x0005, + 0x00b6, 0x0126, 0x00c6, 0x2091, 0x8000, 0x6210, 0x2258, 0xba04, + 0x0006, 0x9086, 0x0006, 0x1168, 0xb89c, 0xd0a4, 0x0150, 0x080c, + 0x66c1, 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, 0x1180, + 0x0096, 0x080c, 0x1037, 0x2958, 0x009e, 0x0160, 0x2b00, 0x2012, + 0xb85c, 0xb8ba, 0xb860, 0xb8b6, 0x9006, 0xb8a6, 0x080c, 0x5e49, + 0x9006, 0x0010, 0x9085, 0x0001, 0x002e, 0x00de, 0x0005, 0x00b6, + 0x0096, 0x0126, 0x2091, 0x8000, 0x0026, 0x9182, 0x0800, 0x0218, + 0x9085, 0x0001, 0x0458, 0x00d6, 0x9190, 0x1000, 0x2204, 0x905d, + 0x0518, 0x2013, 0x0000, 0xb8a4, 0x904d, 0x0110, 0x080c, 0x1069, + 0x00d6, 0x00c6, 0xb8ac, 0x2060, 0x8cff, 0x0168, 0x600c, 0x0006, + 0x6014, 0x2048, 0x080c, 0xbd4e, 0x0110, 0x080c, 0x0fe9, 0x080c, + 0x9fea, 0x00ce, 0x0c88, 0x00ce, 0x00de, 0x2b48, 0xb8b8, 0xb85e, + 0xb8b4, 0xb862, 0x080c, 0x1079, 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, 0x717e, 0x1510, 0xb8a0, + 0x9086, 0x007e, 0x0120, 0x080c, 0x9f69, 0x11d8, 0x0078, 0x7040, + 0xd0e4, 0x01b8, 0x00c6, 0x2061, 0x195c, 0x7048, 0x2062, 0x704c, + 0x6006, 0x7050, 0x600a, 0x7054, 0x600e, 0x00ce, 0x703c, 0x2069, + 0x0140, 0x9005, 0x1110, 0x2001, 0x0001, 0x6886, 0x2069, 0x1800, + 0x68b2, 0x7040, 0xb85e, 0x7048, 0xb862, 0x704c, 0xb866, 0x20e1, + 0x0000, 0x2099, 0x0276, 0xb8b4, 0x20e8, 0xb8b8, 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, 0xbbbc, 0xc384, 0xba00, 0x2009, 0x187b, 0x210c, + 0xd0bc, 0x0120, 0xd1ec, 0x0110, 0xc2ad, 0x0008, 0xc2ac, 0xd0c4, + 0x0148, 0xd1e4, 0x0138, 0xc2bd, 0xd0cc, 0x0128, 0xd38c, 0x1108, + 0xc385, 0x0008, 0xc2bc, 0xba02, 0xbbbe, 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, 0x0df6, 0x3c00, 0x20e8, 0x3300, 0x8001, 0x20a0, + 0x4604, 0x8210, 0xaa06, 0x01de, 0x01ce, 0x014e, 0x013e, 0x0060, + 0x080c, 0x1037, 0x0170, 0x2900, 0xb8a6, 0xa803, 0x0000, 0x080c, + 0x655f, 0xa807, 0x0001, 0xae12, 0x9085, 0x0001, 0x012e, 0x009e, + 0x0005, 0x9006, 0x0cd8, 0x0126, 0x2091, 0x8000, 0x0096, 0xb8a4, + 0x904d, 0x0188, 0xa800, 0x9005, 0x1150, 0x080c, 0x656e, 0x1158, + 0xa804, 0x908a, 0x0002, 0x0218, 0x8001, 0xa806, 0x0020, 0x080c, + 0x1069, 0xb8a7, 0x0000, 0x009e, 0x012e, 0x0005, 0x0126, 0x2091, + 0x8000, 0x080c, 0x8615, 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, 0x9955, 0xaa00, 0xb84c, + 0x9906, 0x1110, 0xba4e, 0x0020, 0x00a6, 0x2150, 0xb202, 0x00ae, + 0x82ff, 0x1110, 0xb952, 0x89ff, 0x012e, 0x0005, 0x9016, 0x0489, + 0x1110, 0x2011, 0x0001, 0x0005, 0x080c, 0x65c3, 0x0128, 0x080c, + 0xbe0b, 0x0010, 0x9085, 0x0001, 0x0005, 0x080c, 0x65c3, 0x0128, + 0x080c, 0xbdb0, 0x0010, 0x9085, 0x0001, 0x0005, 0x080c, 0x65c3, + 0x0128, 0x080c, 0xbe08, 0x0010, 0x9085, 0x0001, 0x0005, 0x080c, + 0x65c3, 0x0128, 0x080c, 0xbdcf, 0x0010, 0x9085, 0x0001, 0x0005, + 0x080c, 0x65c3, 0x0128, 0x080c, 0xbe4e, 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, 0x1037, 0x0168, 0x2900, 0xb8a6, 0x080c, 0x655f, + 0xa803, 0x0001, 0xa807, 0x0000, 0x9085, 0x0001, 0x012e, 0x009e, + 0x0005, 0x9006, 0x0cd8, 0x0096, 0x0126, 0x2091, 0x8000, 0xb8a4, + 0x904d, 0x0130, 0xb8a7, 0x0000, 0x080c, 0x1069, 0x9085, 0x0001, + 0x012e, 0x009e, 0x0005, 0xb89c, 0xd0a4, 0x0005, 0x00b6, 0x00f6, + 0x080c, 0x717e, 0x01b0, 0x71c0, 0x81ff, 0x1198, 0x71d8, 0xd19c, + 0x0180, 0x2001, 0x007e, 0x9080, 0x1000, 0x2004, 0x905d, 0x0148, + 0xb804, 0x9084, 0x00ff, 0x9086, 0x0006, 0x1118, 0xb800, 0xc0ed, + 0xb802, 0x2079, 0x185b, 0x7804, 0x00d0, 0x0156, 0x20a9, 0x007f, + 0x900e, 0x0016, 0x080c, 0x63a3, 0x1168, 0xb804, 0x9084, 0xff00, + 0x8007, 0x9096, 0x0004, 0x0118, 0x9086, 0x0006, 0x1118, 0xb800, + 0xc0ed, 0xb802, 0x001e, 0x8108, 0x1f04, 0x65e9, 0x015e, 0x080c, + 0x6687, 0x0120, 0x2001, 0x195f, 0x200c, 0x0030, 0x2079, 0x185b, + 0x7804, 0x0030, 0x2009, 0x07d0, 0x2011, 0x6613, 0x080c, 0x82eb, + 0x00fe, 0x00be, 0x0005, 0x00b6, 0x2011, 0x6613, 0x080c, 0x8259, + 0x080c, 0x6687, 0x01d8, 0x2001, 0x107e, 0x2004, 0x2058, 0xb900, + 0xc1ec, 0xb902, 0x080c, 0x66c5, 0x0130, 0x2009, 0x07d0, 0x2011, + 0x6613, 0x080c, 0x82eb, 0x00e6, 0x2071, 0x1800, 0x9006, 0x707a, + 0x705c, 0x707e, 0x080c, 0x2e73, 0x00ee, 0x04c0, 0x0156, 0x00c6, + 0x20a9, 0x007f, 0x900e, 0x0016, 0x080c, 0x63a3, 0x1548, 0xb800, + 0xd0ec, 0x0530, 0xd0bc, 0x1520, 0x0046, 0xbaa0, 0x2220, 0x9006, + 0x2009, 0x0029, 0x080c, 0xd837, 0xb800, 0xc0e5, 0xc0ec, 0xb802, + 0x080c, 0x66c1, 0x2001, 0x0707, 0x1128, 0xb804, 0x9084, 0x00ff, + 0x9085, 0x0700, 0xb806, 0x2019, 0x0029, 0x080c, 0x8782, 0x0076, + 0x903e, 0x080c, 0x8670, 0x900e, 0x080c, 0xd556, 0x007e, 0x004e, + 0x001e, 0x8108, 0x1f04, 0x663b, 0x00ce, 0x015e, 0x00be, 0x0005, + 0x00b6, 0x6010, 0x2058, 0xb800, 0xc0ec, 0xb802, 0x00be, 0x0005, + 0x7810, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0ac, 0x0005, 0x6010, + 0x00b6, 0x905d, 0x0108, 0xb800, 0x00be, 0xd0bc, 0x0005, 0x00b6, + 0x00f6, 0x2001, 0x107e, 0x2004, 0x905d, 0x0110, 0xb800, 0xd0ec, + 0x00fe, 0x00be, 0x0005, 0x0126, 0x0026, 0x2091, 0x8000, 0x0006, + 0xbaa0, 0x9290, 0x1000, 0x2204, 0x9b06, 0x190c, 0x0df6, 0x000e, + 0xba00, 0x9005, 0x0110, 0xc2fd, 0x0008, 0xc2fc, 0xba02, 0x002e, + 0x012e, 0x0005, 0x2011, 0x1836, 0x2204, 0xd0cc, 0x0138, 0x2001, + 0x195d, 0x200c, 0x2011, 0x66b7, 0x080c, 0x82eb, 0x0005, 0x2011, + 0x66b7, 0x080c, 0x8259, 0x2011, 0x1836, 0x2204, 0xc0cc, 0x2012, + 0x0005, 0x080c, 0x54db, 0xd0ac, 0x0005, 0x080c, 0x54db, 0xd0a4, + 0x0005, 0x0016, 0xb904, 0x9184, 0x00ff, 0x908e, 0x0006, 0x001e, + 0x0005, 0x0016, 0xb904, 0x9184, 0xff00, 0x8007, 0x908e, 0x0006, + 0x001e, 0x0005, 0x00b6, 0x00f6, 0x080c, 0xc459, 0x0158, 0x70d8, + 0x9084, 0x0028, 0x0138, 0x2001, 0x107f, 0x2004, 0x905d, 0x0110, + 0xb8bc, 0xd094, 0x00fe, 0x00be, 0x0005, 0x0006, 0x0016, 0x0036, + 0x0046, 0x0076, 0x00b6, 0x2001, 0x1817, 0x203c, 0x9780, 0x31f3, + 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, 0x1817, 0x203c, 0x9780, + 0x31f3, 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, 0x2071, 0x190e, 0x7003, 0x0001, + 0x7007, 0x0000, 0x9006, 0x7012, 0x7016, 0x701a, 0x701e, 0x700a, + 0x7046, 0x2001, 0x1920, 0x2003, 0x0000, 0x0005, 0x0016, 0x00e6, + 0x2071, 0x1923, 0x900e, 0x710a, 0x080c, 0x54db, 0xd0fc, 0x1140, + 0x080c, 0x54db, 0x900e, 0xd09c, 0x0108, 0x8108, 0x7102, 0x0438, + 0x2001, 0x187b, 0x200c, 0x9184, 0x0007, 0x9006, 0x0002, 0x67a0, + 0x67a0, 0x67a0, 0x67a0, 0x67a0, 0x67b7, 0x67cc, 0x67da, 0x7003, + 0x0003, 0x2009, 0x187c, 0x210c, 0x9184, 0xff00, 0x908e, 0xff00, + 0x0140, 0x8007, 0x9005, 0x1110, 0x2001, 0x0002, 0x8003, 0x7006, + 0x0030, 0x7007, 0x0001, 0x0018, 0x7003, 0x0005, 0x0c50, 0x2071, + 0x190e, 0x704f, 0x0000, 0x2071, 0x1800, 0x70ef, 0x0001, 0x00ee, + 0x001e, 0x0005, 0x7003, 0x0000, 0x2071, 0x190e, 0x2009, 0x187c, + 0x210c, 0x9184, 0x7f00, 0x8007, 0x908c, 0x000f, 0x0160, 0x714e, + 0x8004, 0x8004, 0x8004, 0x8004, 0x2071, 0x1800, 0x908c, 0x0007, + 0x0128, 0x70ee, 0x0c20, 0x704f, 0x000f, 0x0c90, 0x70ef, 0x0005, + 0x08f0, 0x00e6, 0x2071, 0x0050, 0x684c, 0x9005, 0x1150, 0x00e6, 0x2071, 0x190e, 0x7028, 0xc085, 0x702a, 0x00ee, 0x9085, 0x0001, - 0x0488, 0x6844, 0x9005, 0x0158, 0x080c, 0x7576, 0x6a60, 0x9200, + 0x0488, 0x6844, 0x9005, 0x0158, 0x080c, 0x74ec, 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, 0x190e, 0x7028, 0xc084, 0x702a, 0x7007, 0x0001, 0x700b, 0x0000, - 0x00ee, 0x9006, 0x00ee, 0x0005, 0xa868, 0xd0fc, 0x11d8, 0x00e6, - 0x0026, 0x2001, 0x1921, 0x2004, 0x9005, 0x0904, 0x6aee, 0xa87c, - 0xd0bc, 0x1904, 0x6aee, 0xa978, 0xa874, 0x9105, 0x1904, 0x6aee, - 0x2001, 0x1921, 0x2004, 0x0002, 0x6aee, 0x6947, 0x6983, 0x6983, - 0x6aee, 0x6983, 0x0005, 0xa868, 0xd0fc, 0x1500, 0x00e6, 0x0026, - 0x2009, 0x1921, 0x210c, 0x81ff, 0x0904, 0x6aee, 0xa87c, 0xd0cc, - 0x0904, 0x6aee, 0xa880, 0x9084, 0x00ff, 0x9086, 0x0001, 0x1904, - 0x6aee, 0x9186, 0x0003, 0x0904, 0x6983, 0x9186, 0x0005, 0x0904, - 0x6983, 0xa84f, 0x8021, 0xa853, 0x0017, 0x0028, 0x0005, 0xa84f, - 0x8020, 0xa853, 0x0016, 0x2071, 0x190e, 0x701c, 0x9005, 0x1904, - 0x6ca2, 0x0e04, 0x6ced, 0x2071, 0x0000, 0xa84c, 0x7082, 0xa850, - 0x7032, 0xa86c, 0x7086, 0x7036, 0xa870, 0x708a, 0x2091, 0x4080, - 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x11e0, 0x2071, 0x1800, - 0x2011, 0x0001, 0xa804, 0x900d, 0x702c, 0x1158, 0xa802, 0x2900, - 0x702e, 0x70bc, 0x9200, 0x70be, 0x080c, 0x81f0, 0x002e, 0x00ee, - 0x0005, 0x0096, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, - 0x1dc8, 0x009e, 0x0c58, 0xa84f, 0x0000, 0x00f6, 0x2079, 0x0050, - 0x2071, 0x190e, 0xa803, 0x0000, 0x7010, 0x9005, 0x1904, 0x6a72, - 0x782c, 0x908c, 0x0780, 0x190c, 0x6e16, 0x8004, 0x8004, 0x8004, - 0x9084, 0x0003, 0x0002, 0x69a1, 0x6a72, 0x69c6, 0x6a0d, 0x080c, - 0x0dfa, 0x2071, 0x1800, 0x2900, 0x7822, 0xa804, 0x900d, 0x1170, - 0x2071, 0x19d2, 0x703c, 0x9005, 0x1328, 0x2001, 0x1922, 0x2004, - 0x8005, 0x703e, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x9016, 0x702c, - 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e, - 0x70bc, 0x9200, 0x70be, 0x080c, 0x81f0, 0x0c10, 0x2071, 0x1800, - 0x2900, 0x7822, 0xa804, 0x900d, 0x1580, 0x7824, 0x00e6, 0x2071, + 0x00ee, 0x9006, 0x00ee, 0x0005, 0xa868, 0xd0fc, 0x1508, 0x00e6, + 0x0026, 0x2001, 0x1923, 0x2004, 0x9015, 0x0904, 0x6a28, 0xa978, + 0xa874, 0x9105, 0x1904, 0x6a28, 0x9286, 0x0003, 0x0904, 0x68c1, + 0x9286, 0x0005, 0x0904, 0x68c1, 0xa87c, 0xd0bc, 0x1904, 0x6a28, + 0x2200, 0x0002, 0x6a28, 0x6885, 0x68c1, 0x68c1, 0x6a28, 0x68c1, + 0x0005, 0xa868, 0xd0fc, 0x1500, 0x00e6, 0x0026, 0x2009, 0x1923, + 0x210c, 0x81ff, 0x0904, 0x6a28, 0xa880, 0x9084, 0x00ff, 0x9086, + 0x0001, 0x1904, 0x6a28, 0x9186, 0x0003, 0x0904, 0x68c1, 0x9186, + 0x0005, 0x0904, 0x68c1, 0xa87c, 0xd0cc, 0x0904, 0x6a28, 0xa84f, + 0x8021, 0xa853, 0x0017, 0x0028, 0x0005, 0xa84f, 0x8020, 0xa853, + 0x0016, 0x2071, 0x190e, 0x701c, 0x9005, 0x1904, 0x6bf6, 0x0e04, + 0x6c41, 0x2071, 0x0000, 0xa84c, 0x7082, 0xa850, 0x7032, 0xa86c, + 0x7086, 0x7036, 0xa870, 0x708a, 0x2091, 0x4080, 0x2001, 0x0089, + 0x2004, 0xd084, 0x190c, 0x11e6, 0x2071, 0x1800, 0x2011, 0x0001, + 0xa804, 0x900d, 0x702c, 0x1158, 0xa802, 0x2900, 0x702e, 0x70bc, + 0x9200, 0x70be, 0x080c, 0x816f, 0x002e, 0x00ee, 0x0005, 0x0096, + 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x009e, + 0x0c58, 0xa84f, 0x0000, 0x00f6, 0x2079, 0x0050, 0x2071, 0x190e, + 0xa803, 0x0000, 0x7010, 0x9005, 0x1904, 0x69ac, 0x782c, 0x908c, + 0x0780, 0x190c, 0x6d6a, 0x8004, 0x8004, 0x8004, 0x9084, 0x0003, + 0x0002, 0x68df, 0x69ac, 0x6903, 0x6949, 0x080c, 0x0df6, 0x2071, + 0x1800, 0x2900, 0x7822, 0xa804, 0x900d, 0x1168, 0x2071, 0x19d5, + 0x7044, 0x9005, 0x1320, 0x2001, 0x1924, 0x2004, 0x7046, 0x00fe, + 0x002e, 0x00ee, 0x0005, 0x9016, 0x702c, 0x2148, 0xa904, 0xa802, + 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70bc, 0x9200, 0x70be, + 0x080c, 0x816f, 0x0c18, 0x2071, 0x1800, 0x2900, 0x7822, 0xa804, + 0x900d, 0x1578, 0x7824, 0x00e6, 0x2071, 0x0040, 0x712c, 0xd19c, + 0x1148, 0x2009, 0x182f, 0x210c, 0x918a, 0x0040, 0x0218, 0x7022, + 0x00ee, 0x0058, 0x00ee, 0x2048, 0x702c, 0xa802, 0x2900, 0x702e, + 0x70bc, 0x8000, 0x70be, 0x080c, 0x816f, 0x782c, 0x9094, 0x0780, + 0x190c, 0x6d6a, 0xd0a4, 0x19f0, 0x2071, 0x19d5, 0x7044, 0x9005, + 0x1320, 0x2001, 0x1924, 0x2004, 0x7046, 0x00fe, 0x002e, 0x00ee, + 0x0005, 0x9016, 0x702c, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, + 0x81ff, 0x1dc8, 0x702e, 0x70bc, 0x9200, 0x70be, 0x080c, 0x816f, + 0x0808, 0x0096, 0x00e6, 0x7824, 0x2048, 0x2071, 0x1800, 0x702c, + 0xa802, 0x2900, 0x702e, 0x70bc, 0x8000, 0x70be, 0x080c, 0x816f, + 0x782c, 0x9094, 0x0780, 0x190c, 0x6d6a, 0xd0a4, 0x1d60, 0x00ee, + 0x782c, 0x9094, 0x0780, 0x190c, 0x6d6a, 0xd09c, 0x1198, 0x009e, + 0x2900, 0x7822, 0xa804, 0x900d, 0x1550, 0x2071, 0x19d5, 0x7044, + 0x9005, 0x1320, 0x2001, 0x1924, 0x2004, 0x7046, 0x00fe, 0x002e, + 0x00ee, 0x0005, 0x009e, 0x2908, 0x7010, 0x8000, 0x7012, 0x7018, + 0x904d, 0x711a, 0x0110, 0xa902, 0x0008, 0x711e, 0x2148, 0xa804, + 0x900d, 0x1168, 0x2071, 0x19d5, 0x7044, 0x9005, 0x1320, 0x2001, + 0x1924, 0x2004, 0x7046, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x2071, + 0x1800, 0x9016, 0x702c, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, + 0x81ff, 0x1dc8, 0x702e, 0x70bc, 0x9200, 0x70be, 0x080c, 0x816f, + 0x00fe, 0x002e, 0x00ee, 0x0005, 0x2908, 0x7010, 0x8000, 0x7012, + 0x7018, 0x904d, 0x711a, 0x0110, 0xa902, 0x0008, 0x711e, 0x2148, + 0xa804, 0x900d, 0x1904, 0x6a00, 0x782c, 0x9094, 0x0780, 0x190c, + 0x6d6a, 0xd09c, 0x1198, 0x701c, 0x904d, 0x0180, 0x7010, 0x8001, + 0x7012, 0x1108, 0x701a, 0xa800, 0x701e, 0x2900, 0x7822, 0x782c, + 0x9094, 0x0780, 0x190c, 0x6d6a, 0xd09c, 0x0d68, 0x782c, 0x9094, + 0x0780, 0x190c, 0x6d6a, 0xd0a4, 0x01b0, 0x00e6, 0x7824, 0x2048, + 0x2071, 0x1800, 0x702c, 0xa802, 0x2900, 0x702e, 0x70bc, 0x8000, + 0x70be, 0x080c, 0x816f, 0x782c, 0x9094, 0x0780, 0x190c, 0x6d6a, + 0xd0a4, 0x1d60, 0x00ee, 0x2071, 0x19d5, 0x7044, 0x9005, 0x1320, + 0x2001, 0x1924, 0x2004, 0x7046, 0x00fe, 0x002e, 0x00ee, 0x0005, + 0x00e6, 0x2071, 0x1800, 0x9016, 0x702c, 0x2148, 0xa904, 0xa802, + 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70bc, 0x9200, 0x70be, + 0x080c, 0x816f, 0x00ee, 0x0804, 0x69bc, 0xa868, 0xd0fc, 0x1904, + 0x6a76, 0x0096, 0xa804, 0xa807, 0x0000, 0x904d, 0x190c, 0x0fe9, + 0x009e, 0x0020, 0xa868, 0xd0fc, 0x1904, 0x6a76, 0x00e6, 0x0026, + 0xa84f, 0x0000, 0x00f6, 0x2079, 0x0050, 0x2071, 0x1800, 0x70e8, + 0x8001, 0x0558, 0x1a04, 0x6a73, 0x2071, 0x190e, 0xa803, 0x0000, + 0xa864, 0x9084, 0x00ff, 0x908e, 0x0016, 0x01a8, 0x7010, 0x9005, + 0x1904, 0x6b72, 0x782c, 0x908c, 0x0780, 0x190c, 0x6d6a, 0x8004, + 0x8004, 0x8004, 0x9084, 0x0003, 0x0002, 0x6a77, 0x6b72, 0x6a92, + 0x6b03, 0x080c, 0x0df6, 0x2009, 0x1923, 0x2104, 0x0002, 0x6a3e, + 0x6a3e, 0x6a3e, 0x68ca, 0x6a3e, 0x68ca, 0x70eb, 0x0fa0, 0x71e4, + 0x8107, 0x9106, 0x9094, 0x00c0, 0x9184, 0xff3f, 0x9205, 0x70e6, + 0x3b08, 0x3a00, 0x9104, 0x918d, 0x00c0, 0x21d8, 0x9084, 0xff3f, + 0x9205, 0x20d0, 0x0808, 0x70ea, 0x0804, 0x6a34, 0x0005, 0x2071, + 0x1800, 0x2900, 0x7822, 0xa804, 0x900d, 0x1120, 0x00fe, 0x002e, + 0x00ee, 0x0005, 0x9016, 0x702c, 0x2148, 0xa904, 0xa802, 0x8210, + 0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70bc, 0x9200, 0x70be, 0x080c, + 0x816f, 0x0c60, 0x2071, 0x1800, 0x2900, 0x7822, 0xa804, 0x900d, + 0x1904, 0x6af2, 0x7830, 0x8007, 0x908c, 0x001f, 0x70ec, 0x9102, + 0x1220, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x7824, 0x00e6, 0x2071, 0x0040, 0x712c, 0xd19c, 0x1148, 0x2009, 0x182f, 0x210c, 0x918a, 0x0040, 0x0218, 0x7022, 0x00ee, 0x0058, 0x00ee, 0x2048, 0x702c, - 0xa802, 0x2900, 0x702e, 0x70bc, 0x8000, 0x70be, 0x080c, 0x81f0, - 0x782c, 0x9094, 0x0780, 0x190c, 0x6e16, 0xd0a4, 0x19f0, 0x2071, - 0x19d2, 0x703c, 0x9005, 0x1328, 0x2001, 0x1922, 0x2004, 0x8005, - 0x703e, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x9016, 0x702c, 0x2148, - 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70bc, - 0x9200, 0x70be, 0x080c, 0x81f0, 0x0800, 0x0096, 0x00e6, 0x7824, - 0x2048, 0x2071, 0x1800, 0x702c, 0xa802, 0x2900, 0x702e, 0x70bc, - 0x8000, 0x70be, 0x080c, 0x81f0, 0x782c, 0x9094, 0x0780, 0x190c, - 0x6e16, 0xd0a4, 0x1d60, 0x00ee, 0x782c, 0x9094, 0x0780, 0x190c, - 0x6e16, 0xd09c, 0x11a0, 0x009e, 0x2900, 0x7822, 0xa804, 0x900d, - 0x1560, 0x2071, 0x19d2, 0x703c, 0x9005, 0x1328, 0x2001, 0x1922, - 0x2004, 0x8005, 0x703e, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x009e, - 0x2908, 0x7010, 0x8000, 0x7012, 0x7018, 0x904d, 0x711a, 0x0110, - 0xa902, 0x0008, 0x711e, 0x2148, 0xa804, 0x900d, 0x1170, 0x2071, - 0x19d2, 0x703c, 0x9005, 0x1328, 0x2001, 0x1922, 0x2004, 0x8005, - 0x703e, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x2071, 0x1800, 0x9016, - 0x702c, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, - 0x702e, 0x70bc, 0x9200, 0x70be, 0x080c, 0x81f0, 0x00fe, 0x002e, - 0x00ee, 0x0005, 0x2908, 0x7010, 0x8000, 0x7012, 0x7018, 0x904d, - 0x711a, 0x0110, 0xa902, 0x0008, 0x711e, 0x2148, 0xa804, 0x900d, - 0x1904, 0x6ac7, 0x782c, 0x9094, 0x0780, 0x190c, 0x6e16, 0xd09c, - 0x1198, 0x701c, 0x904d, 0x0180, 0x7010, 0x8001, 0x7012, 0x1108, - 0x701a, 0xa800, 0x701e, 0x2900, 0x7822, 0x782c, 0x9094, 0x0780, - 0x190c, 0x6e16, 0xd09c, 0x0d68, 0x782c, 0x9094, 0x0780, 0x190c, - 0x6e16, 0xd0a4, 0x01b0, 0x00e6, 0x7824, 0x2048, 0x2071, 0x1800, - 0x702c, 0xa802, 0x2900, 0x702e, 0x70bc, 0x8000, 0x70be, 0x080c, - 0x81f0, 0x782c, 0x9094, 0x0780, 0x190c, 0x6e16, 0xd0a4, 0x1d60, - 0x00ee, 0x2071, 0x19d2, 0x703c, 0x9005, 0x1328, 0x2001, 0x1922, - 0x2004, 0x8005, 0x703e, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x00e6, - 0x2071, 0x1800, 0x9016, 0x702c, 0x2148, 0xa904, 0xa802, 0x8210, - 0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70bc, 0x9200, 0x70be, 0x080c, - 0x81f0, 0x00ee, 0x0804, 0x6a82, 0xa868, 0xd0fc, 0x1904, 0x6b2a, - 0x0096, 0xa804, 0xa807, 0x0000, 0x904d, 0x190c, 0x0fe3, 0x009e, - 0x0018, 0xa868, 0xd0fc, 0x15f0, 0x00e6, 0x0026, 0xa84f, 0x0000, - 0x00f6, 0x2079, 0x0050, 0x2071, 0x1800, 0x70e8, 0x8001, 0x01d0, - 0x1678, 0x2071, 0x190e, 0xa803, 0x0000, 0x7010, 0x9005, 0x1904, - 0x6c20, 0x782c, 0x908c, 0x0780, 0x190c, 0x6e16, 0x8004, 0x8004, - 0x8004, 0x9084, 0x0003, 0x0002, 0x6b2b, 0x6c20, 0x6b46, 0x6bb3, - 0x080c, 0x0dfa, 0x70eb, 0x0fa0, 0x71e4, 0x8107, 0x9106, 0x9094, - 0x00c0, 0x9184, 0xff3f, 0x9205, 0x70e6, 0x3b08, 0x3a00, 0x9104, - 0x918d, 0x00c0, 0x21d8, 0x9084, 0xff3f, 0x9205, 0x20d0, 0x0888, - 0x70ea, 0x0878, 0x0005, 0x2071, 0x1800, 0x2900, 0x7822, 0xa804, - 0x900d, 0x1120, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x9016, 0x702c, - 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e, - 0x70bc, 0x9200, 0x70be, 0x080c, 0x81f0, 0x0c60, 0x2071, 0x1800, - 0x2900, 0x7822, 0xa804, 0x900d, 0x1904, 0x6ba2, 0x7830, 0x8007, - 0x9084, 0x001f, 0x9082, 0x0001, 0x1220, 0x00fe, 0x002e, 0x00ee, - 0x0005, 0x7824, 0x00e6, 0x2071, 0x0040, 0x712c, 0xd19c, 0x1148, - 0x2009, 0x182f, 0x210c, 0x918a, 0x0040, 0x0218, 0x7022, 0x00ee, - 0x0058, 0x00ee, 0x2048, 0x702c, 0xa802, 0x2900, 0x702e, 0x70bc, - 0x8000, 0x70be, 0x080c, 0x81f0, 0x782c, 0x9094, 0x0780, 0x190c, - 0x6e16, 0xd0a4, 0x19f0, 0x0e04, 0x6b99, 0x7838, 0x7938, 0x910e, - 0x1de0, 0x00d6, 0x2069, 0x0000, 0x6836, 0x6833, 0x0013, 0x00de, - 0x2001, 0x191f, 0x200c, 0xc184, 0x2102, 0x2091, 0x4080, 0x2001, - 0x0089, 0x2004, 0xd084, 0x190c, 0x11e0, 0x00fe, 0x002e, 0x00ee, + 0xa802, 0x2900, 0x702e, 0x70bc, 0x8000, 0x70be, 0x080c, 0x816f, + 0x782c, 0x9094, 0x0780, 0x190c, 0x6d6a, 0xd0a4, 0x19f0, 0x0e04, + 0x6ae9, 0x7838, 0x7938, 0x910e, 0x1de0, 0x00d6, 0x2069, 0x0000, + 0x6836, 0x6833, 0x0013, 0x00de, 0x2001, 0x191f, 0x200c, 0xc184, + 0x2102, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, + 0x11e6, 0x2001, 0x1920, 0x2003, 0x0000, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x2001, 0x191f, 0x200c, 0xc185, 0x2102, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x9016, 0x702c, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70bc, 0x9200, 0x70be, 0x080c, - 0x81f0, 0x0804, 0x6b59, 0x0096, 0x00e6, 0x7824, 0x2048, 0x2071, - 0x1800, 0x702c, 0xa802, 0x2900, 0x702e, 0x70bc, 0x8000, 0x70be, - 0x080c, 0x81f0, 0x782c, 0x9094, 0x0780, 0x190c, 0x6e16, 0xd0a4, - 0x1d60, 0x00ee, 0x0e04, 0x6bf3, 0x7838, 0x7938, 0x910e, 0x1de0, - 0x00d6, 0x2069, 0x0000, 0x6836, 0x6833, 0x0013, 0x00de, 0x7044, - 0xc084, 0x7046, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, - 0x190c, 0x11e0, 0x782c, 0x9094, 0x0780, 0x190c, 0x6e16, 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, 0x70bc, - 0x9200, 0x70be, 0x080c, 0x81f0, 0x00fe, 0x002e, 0x00ee, 0x0005, - 0x2908, 0x7010, 0x8000, 0x7012, 0x7018, 0x904d, 0x711a, 0x0110, - 0xa902, 0x0008, 0x711e, 0x2148, 0xa804, 0x900d, 0x1904, 0x6c8d, - 0x782c, 0x9094, 0x0780, 0x190c, 0x6e16, 0xd09c, 0x11b0, 0x701c, - 0x904d, 0x0198, 0xa84c, 0x9005, 0x1180, 0x7010, 0x8001, 0x7012, - 0x1108, 0x701a, 0xa800, 0x701e, 0x2900, 0x7822, 0x782c, 0x9094, - 0x0780, 0x190c, 0x6e16, 0xd09c, 0x0d50, 0x782c, 0x9094, 0x0780, - 0x190c, 0x6e16, 0xd0a4, 0x05a8, 0x00e6, 0x7824, 0x2048, 0x2071, + 0x816f, 0x0804, 0x6aa5, 0x0096, 0x00e6, 0x7824, 0x2048, 0x2071, 0x1800, 0x702c, 0xa802, 0x2900, 0x702e, 0x70bc, 0x8000, 0x70be, - 0x080c, 0x81f0, 0x782c, 0x9094, 0x0780, 0x190c, 0x6e16, 0xd0a4, - 0x1d60, 0x00ee, 0x0e04, 0x6c86, 0x7838, 0x7938, 0x910e, 0x1de0, + 0x080c, 0x816f, 0x782c, 0x9094, 0x0780, 0x190c, 0x6d6a, 0xd0a4, + 0x1d60, 0x00ee, 0x0e04, 0x6b45, 0x7838, 0x7938, 0x910e, 0x1de0, 0x00d6, 0x2069, 0x0000, 0x6836, 0x6833, 0x0013, 0x00de, 0x7044, 0xc084, 0x7046, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, - 0x190c, 0x11e0, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x7044, 0xc085, - 0x7046, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x00e6, 0x2071, 0x1800, - 0x9016, 0x702c, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, - 0x1dc8, 0x702e, 0x70bc, 0x9200, 0x70be, 0x080c, 0x81f0, 0x00ee, - 0x0804, 0x6c30, 0x2071, 0x190e, 0xa803, 0x0000, 0x2908, 0x7010, - 0x8000, 0x7012, 0x7018, 0x904d, 0x711a, 0x0110, 0xa902, 0x0008, - 0x711e, 0x2148, 0xa804, 0x900d, 0x1128, 0x1e04, 0x6ccd, 0x002e, - 0x00ee, 0x0005, 0x2071, 0x1800, 0x9016, 0x702c, 0x2148, 0xa904, + 0x190c, 0x11e6, 0x704b, 0x0000, 0x782c, 0x9094, 0x0780, 0x190c, + 0x6d6a, 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, 0x70bc, 0x9200, 0x70be, 0x080c, 0x816f, 0x00fe, 0x002e, + 0x00ee, 0x0005, 0x2908, 0x7010, 0x8000, 0x7012, 0x7018, 0x904d, + 0x711a, 0x0110, 0xa902, 0x0008, 0x711e, 0x2148, 0xa804, 0x900d, + 0x1904, 0x6be1, 0x782c, 0x9094, 0x0780, 0x190c, 0x6d6a, 0xd09c, + 0x11b0, 0x701c, 0x904d, 0x0198, 0xa84c, 0x9005, 0x1180, 0x7010, + 0x8001, 0x7012, 0x1108, 0x701a, 0xa800, 0x701e, 0x2900, 0x7822, + 0x782c, 0x9094, 0x0780, 0x190c, 0x6d6a, 0xd09c, 0x0d50, 0x782c, + 0x9094, 0x0780, 0x190c, 0x6d6a, 0xd0a4, 0x05b8, 0x00e6, 0x7824, + 0x2048, 0x2071, 0x1800, 0x702c, 0xa802, 0x2900, 0x702e, 0x70bc, + 0x8000, 0x70be, 0x080c, 0x816f, 0x782c, 0x9094, 0x0780, 0x190c, + 0x6d6a, 0xd0a4, 0x1d60, 0x00ee, 0x0e04, 0x6bda, 0x7838, 0x7938, + 0x910e, 0x1de0, 0x00d6, 0x2069, 0x0000, 0x6836, 0x6833, 0x0013, + 0x00de, 0x7044, 0xc084, 0x7046, 0x2091, 0x4080, 0x2001, 0x0089, + 0x2004, 0xd084, 0x190c, 0x11e6, 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, 0x70bc, 0x9200, - 0x70be, 0x080c, 0x81f0, 0x0e04, 0x6cb7, 0x2071, 0x190e, 0x701c, - 0x2048, 0xa84c, 0x900d, 0x0d18, 0x2071, 0x0000, 0x7182, 0xa850, - 0x7032, 0xa86c, 0x7086, 0x7036, 0xa870, 0x708a, 0x2091, 0x4080, - 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x11e0, 0x2071, 0x190e, - 0x080c, 0x6e02, 0x002e, 0x00ee, 0x0005, 0x2071, 0x190e, 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, 0x70bc, - 0x9200, 0x70be, 0x080c, 0x81f0, 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, 0x190e, - 0x7004, 0x0002, 0x6d3a, 0x6d3b, 0x6e01, 0x6d3b, 0x6d38, 0x6e01, - 0x080c, 0x0dfa, 0x0005, 0x2001, 0x1921, 0x2004, 0x0002, 0x6d45, - 0x6d45, 0x6d9a, 0x6d9b, 0x6d45, 0x6d9b, 0x0126, 0x2091, 0x8000, - 0x1e0c, 0x6e21, 0x701c, 0x904d, 0x01e0, 0xa84c, 0x9005, 0x01d8, - 0x0e04, 0x6d69, 0xa94c, 0x2071, 0x0000, 0x7182, 0xa850, 0x7032, - 0xa86c, 0x7086, 0x7036, 0xa870, 0x708a, 0x2091, 0x4080, 0x2001, - 0x0089, 0x2004, 0xd084, 0x190c, 0x11e0, 0x2071, 0x190e, 0x080c, - 0x6e02, 0x012e, 0x0470, 0x2001, 0x005b, 0x2004, 0x9094, 0x0780, - 0x190c, 0x6e16, 0xd09c, 0x2071, 0x190e, 0x1510, 0x2071, 0x190e, - 0x700f, 0x0001, 0xa964, 0x9184, 0x00ff, 0x9086, 0x0003, 0x1130, - 0x810f, 0x918c, 0x00ff, 0x8101, 0x0108, 0x710e, 0x2900, 0x00d6, - 0x2069, 0x0050, 0x6822, 0x00de, 0x2071, 0x190e, 0x701c, 0x2048, - 0x7010, 0x8001, 0x7012, 0xa800, 0x701e, 0x9005, 0x1108, 0x701a, - 0x012e, 0x0005, 0x0005, 0x00d6, 0x2008, 0x2069, 0x19d2, 0x683c, - 0x9005, 0x0760, 0x0158, 0x9186, 0x0003, 0x0540, 0x2001, 0x1814, - 0x2004, 0x2009, 0x1aa2, 0x210c, 0x9102, 0x1500, 0x0126, 0x2091, - 0x8000, 0x2069, 0x0050, 0x693c, 0x6838, 0x9106, 0x0190, 0x0e04, - 0x6dcd, 0x2069, 0x0000, 0x6837, 0x8040, 0x6833, 0x0012, 0x6883, - 0x8040, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, - 0x11e0, 0x2069, 0x19d2, 0x683f, 0xffff, 0x012e, 0x00de, 0x0126, - 0x2091, 0x8000, 0x1e0c, 0x6e82, 0x701c, 0x904d, 0x0540, 0x2001, - 0x005b, 0x2004, 0x9094, 0x0780, 0x15c9, 0xd09c, 0x1500, 0x2071, - 0x190e, 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, 0x1063, 0x0005, 0x012e, 0x0005, 0x2091, 0x8000, - 0x0e04, 0x6e18, 0x0006, 0x0016, 0x2001, 0x8004, 0x0006, 0x0804, - 0x0e03, 0x0096, 0x00f6, 0x2079, 0x0050, 0x7044, 0xd084, 0x01c0, - 0xc084, 0x7046, 0x7838, 0x7938, 0x910e, 0x1de0, 0x00d6, 0x2069, - 0x0000, 0x6836, 0x6833, 0x0013, 0x00de, 0x2091, 0x4080, 0x2001, - 0x0089, 0x2004, 0xd084, 0x190c, 0x11e0, 0x00fe, 0x009e, 0x0005, - 0x782c, 0x9094, 0x0780, 0x1991, 0xd0a4, 0x0db8, 0x00e6, 0x2071, - 0x1800, 0x7824, 0x00e6, 0x2071, 0x0040, 0x712c, 0xd19c, 0x1148, - 0x2009, 0x182f, 0x210c, 0x918a, 0x0040, 0x0218, 0x7022, 0x00ee, - 0x0058, 0x00ee, 0x2048, 0x702c, 0xa802, 0x2900, 0x702e, 0x70bc, - 0x8000, 0x70be, 0x080c, 0x81f0, 0x782c, 0x9094, 0x0780, 0x190c, - 0x6e16, 0xd0a4, 0x19f0, 0x7838, 0x7938, 0x910e, 0x1de0, 0x00d6, - 0x2069, 0x0000, 0x6836, 0x6833, 0x0013, 0x00de, 0x2091, 0x4080, - 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x11e0, 0x00ee, 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, 0x11e0, 0x00fe, 0x0005, 0x782c, - 0x9094, 0x0780, 0x190c, 0x6e16, 0xd0a4, 0x0db8, 0x00e6, 0x2071, - 0x1800, 0x7824, 0x2048, 0x702c, 0xa802, 0x2900, 0x702e, 0x70bc, - 0x8000, 0x70be, 0x080c, 0x81f0, 0x782c, 0x9094, 0x0780, 0x190c, - 0x6e16, 0xd0a4, 0x1d70, 0x00d6, 0x2069, 0x0050, 0x693c, 0x2069, - 0x1921, 0x6808, 0x690a, 0x2069, 0x19d2, 0x9102, 0x1118, 0x683c, - 0x9005, 0x1328, 0x2001, 0x1922, 0x200c, 0x810d, 0x693e, 0x00de, - 0x00ee, 0x00fe, 0x0005, 0x7094, 0x908a, 0x0029, 0x1a0c, 0x0dfa, - 0x9082, 0x001d, 0x001b, 0x6027, 0x1e00, 0x0005, 0x6faa, 0x6f30, - 0x6f4c, 0x6f76, 0x6f99, 0x6fd9, 0x6feb, 0x6f4c, 0x6fc1, 0x6eeb, - 0x6f19, 0x6eea, 0x0005, 0x00d6, 0x2069, 0x0200, 0x6804, 0x9005, - 0x1180, 0x6808, 0x9005, 0x1518, 0x7097, 0x0028, 0x2069, 0x1967, - 0x2d04, 0x7002, 0x080c, 0x7359, 0x6028, 0x9085, 0x0600, 0x602a, - 0x00b0, 0x7097, 0x0028, 0x2069, 0x1967, 0x2d04, 0x7002, 0x6028, - 0x9085, 0x0600, 0x602a, 0x00e6, 0x0036, 0x0046, 0x0056, 0x2071, - 0x1a3a, 0x080c, 0x19ff, 0x005e, 0x004e, 0x003e, 0x00ee, 0x00de, - 0x0005, 0x00d6, 0x2069, 0x0200, 0x6804, 0x9005, 0x1178, 0x6808, - 0x9005, 0x1160, 0x7097, 0x0028, 0x2069, 0x1967, 0x2d04, 0x7002, - 0x080c, 0x73f3, 0x6028, 0x9085, 0x0600, 0x602a, 0x00de, 0x0005, - 0x0006, 0x2001, 0x0090, 0x080c, 0x2c88, 0x000e, 0x6124, 0xd1e4, - 0x1190, 0x080c, 0x7058, 0xd1d4, 0x1160, 0xd1dc, 0x1138, 0xd1cc, - 0x0150, 0x7097, 0x0020, 0x080c, 0x7058, 0x0028, 0x7097, 0x001d, - 0x0010, 0x7097, 0x001f, 0x0005, 0x2001, 0x0088, 0x080c, 0x2c88, - 0x6124, 0xd1cc, 0x11e8, 0xd1dc, 0x11c0, 0xd1e4, 0x1198, 0x9184, - 0x1e00, 0x11d8, 0x080c, 0x1a24, 0x60e3, 0x0001, 0x600c, 0xc0b4, - 0x600e, 0x080c, 0x7233, 0x2001, 0x0080, 0x080c, 0x2c88, 0x7097, - 0x0028, 0x0058, 0x7097, 0x001e, 0x0040, 0x7097, 0x001d, 0x0028, - 0x7097, 0x0020, 0x0010, 0x7097, 0x001f, 0x0005, 0x080c, 0x1a24, - 0x60e3, 0x0001, 0x600c, 0xc0b4, 0x600e, 0x080c, 0x7233, 0x2001, - 0x0080, 0x080c, 0x2c88, 0x6124, 0xd1d4, 0x1180, 0xd1dc, 0x1158, - 0xd1e4, 0x1130, 0x9184, 0x1e00, 0x1158, 0x7097, 0x0028, 0x0040, - 0x7097, 0x001e, 0x0028, 0x7097, 0x001d, 0x0010, 0x7097, 0x001f, - 0x0005, 0x2001, 0x00a0, 0x080c, 0x2c88, 0x6124, 0xd1dc, 0x1138, - 0xd1e4, 0x0138, 0x080c, 0x1a24, 0x7097, 0x001e, 0x0010, 0x7097, - 0x001d, 0x0005, 0x080c, 0x70db, 0x6124, 0xd1dc, 0x1188, 0x080c, - 0x7058, 0x0016, 0x080c, 0x1a24, 0x001e, 0xd1d4, 0x1128, 0xd1e4, - 0x0138, 0x7097, 0x001e, 0x0020, 0x7097, 0x001f, 0x080c, 0x7058, - 0x0005, 0x0006, 0x2001, 0x00a0, 0x080c, 0x2c88, 0x000e, 0x6124, - 0xd1d4, 0x1160, 0xd1cc, 0x1150, 0xd1dc, 0x1128, 0xd1e4, 0x0140, - 0x7097, 0x001e, 0x0028, 0x7097, 0x001d, 0x0010, 0x7097, 0x0021, - 0x0005, 0x080c, 0x70db, 0x6124, 0xd1d4, 0x1150, 0xd1dc, 0x1128, - 0xd1e4, 0x0140, 0x7097, 0x001e, 0x0028, 0x7097, 0x001d, 0x0010, - 0x7097, 0x001f, 0x0005, 0x0006, 0x2001, 0x0090, 0x080c, 0x2c88, - 0x000e, 0x6124, 0xd1d4, 0x1178, 0xd1cc, 0x1150, 0xd1dc, 0x1128, - 0xd1e4, 0x0158, 0x7097, 0x001e, 0x0040, 0x7097, 0x001d, 0x0028, - 0x7097, 0x0020, 0x0010, 0x7097, 0x001f, 0x0005, 0x0016, 0x00c6, - 0x00d6, 0x00e6, 0x0126, 0x2061, 0x0100, 0x2069, 0x0140, 0x2071, - 0x1800, 0x2091, 0x8000, 0x080c, 0x7207, 0x11d8, 0x2001, 0x180c, - 0x200c, 0xd1b4, 0x01b0, 0xc1b4, 0x2102, 0x6027, 0x0200, 0x080c, - 0x2bb0, 0x6024, 0xd0cc, 0x0148, 0x2001, 0x00a0, 0x080c, 0x2c88, - 0x080c, 0x7504, 0x080c, 0x5f2b, 0x0428, 0x6028, 0xc0cd, 0x602a, - 0x0408, 0x080c, 0x7221, 0x0150, 0x080c, 0x7218, 0x1138, 0x2001, - 0x0001, 0x080c, 0x2717, 0x080c, 0x71df, 0x00a0, 0x080c, 0x70d8, - 0x0178, 0x2001, 0x0001, 0x080c, 0x2717, 0x7094, 0x9086, 0x001e, - 0x0120, 0x7094, 0x9086, 0x0022, 0x1118, 0x7097, 0x0025, 0x0010, - 0x7097, 0x0021, 0x012e, 0x00ee, 0x00de, 0x00ce, 0x001e, 0x0005, - 0x0026, 0x2011, 0x7069, 0x080c, 0x83ae, 0x002e, 0x0016, 0x0026, - 0x2009, 0x0064, 0x2011, 0x7069, 0x080c, 0x83a5, 0x002e, 0x001e, - 0x0005, 0x00e6, 0x00f6, 0x0016, 0x080c, 0x9656, 0x2071, 0x1800, - 0x080c, 0x7006, 0x001e, 0x00fe, 0x00ee, 0x0005, 0x0016, 0x0026, - 0x0036, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x0126, 0x080c, 0x9656, - 0x2061, 0x0100, 0x2069, 0x0140, 0x2071, 0x1800, 0x2091, 0x8000, - 0x6028, 0xc09c, 0x602a, 0x2011, 0x0003, 0x080c, 0x9a0f, 0x2011, - 0x0002, 0x080c, 0x9a19, 0x080c, 0x9927, 0x080c, 0x835a, 0x0036, - 0x901e, 0x080c, 0x999d, 0x003e, 0x60e3, 0x0000, 0x080c, 0xdc13, - 0x080c, 0xdc2e, 0x2009, 0x0004, 0x080c, 0x2bb6, 0x080c, 0x2a89, - 0x2001, 0x1800, 0x2003, 0x0004, 0x6027, 0x0008, 0x2011, 0x7069, - 0x080c, 0x83ae, 0x080c, 0x7221, 0x0118, 0x9006, 0x080c, 0x2c88, - 0x080c, 0x0b8f, 0x2001, 0x0001, 0x080c, 0x2717, 0x012e, 0x00fe, - 0x00ee, 0x00de, 0x00ce, 0x003e, 0x002e, 0x001e, 0x0005, 0x0026, - 0x00e6, 0x2011, 0x7076, 0x2071, 0x19d2, 0x701c, 0x9206, 0x1118, - 0x7018, 0x9005, 0x0110, 0x9085, 0x0001, 0x00ee, 0x002e, 0x0005, - 0x6020, 0xd09c, 0x0005, 0x6800, 0x9084, 0xfffe, 0x9086, 0x00c0, - 0x01b8, 0x2001, 0x00c0, 0x080c, 0x2c88, 0x0156, 0x20a9, 0x002d, - 0x1d04, 0x70e8, 0x2091, 0x6000, 0x1f04, 0x70e8, 0x015e, 0x00d6, - 0x2069, 0x1800, 0x6898, 0x8001, 0x0220, 0x0118, 0x689a, 0x00de, - 0x0005, 0x689b, 0x0014, 0x68e4, 0xd0dc, 0x0dc8, 0x6800, 0x9086, - 0x0001, 0x1da8, 0x080c, 0x83ba, 0x0c90, 0x00c6, 0x00d6, 0x00e6, - 0x2061, 0x0100, 0x2069, 0x0140, 0x2071, 0x1800, 0x080c, 0x7513, - 0x2001, 0x1945, 0x2003, 0x0000, 0x9006, 0x7096, 0x60e2, 0x6886, - 0x080c, 0x27e2, 0x9006, 0x080c, 0x2c88, 0x080c, 0x5dea, 0x6027, - 0xffff, 0x602b, 0x182f, 0x00ee, 0x00de, 0x00ce, 0x0005, 0x00c6, - 0x00d6, 0x00e6, 0x2061, 0x0100, 0x2069, 0x0140, 0x2071, 0x1800, - 0x2001, 0x1955, 0x200c, 0x9186, 0x0000, 0x0158, 0x9186, 0x0001, - 0x0158, 0x9186, 0x0002, 0x0158, 0x9186, 0x0003, 0x0158, 0x0804, - 0x71cf, 0x7097, 0x0022, 0x0040, 0x7097, 0x0021, 0x0028, 0x7097, - 0x0023, 0x0010, 0x7097, 0x0024, 0x60e3, 0x0000, 0x6887, 0x0001, - 0x2001, 0x0001, 0x080c, 0x27e2, 0x0026, 0x080c, 0xa069, 0x002e, - 0x7000, 0x908e, 0x0004, 0x0118, 0x602b, 0x0028, 0x0010, 0x602b, - 0x0020, 0x0156, 0x0126, 0x2091, 0x8000, 0x20a9, 0x0005, 0x6024, - 0xd0ac, 0x0150, 0x012e, 0x015e, 0x080c, 0xc539, 0x0118, 0x9006, - 0x080c, 0x2cb2, 0x0804, 0x71db, 0x6800, 0x9084, 0x00a1, 0xc0bd, - 0x6802, 0x080c, 0x2bb0, 0x6904, 0xd1d4, 0x1140, 0x2001, 0x0100, - 0x080c, 0x2c88, 0x1f04, 0x7167, 0x080c, 0x725e, 0x012e, 0x015e, - 0x080c, 0x7218, 0x0538, 0x6044, 0x9005, 0x01f8, 0x2001, 0x0100, - 0x2004, 0x9086, 0x000a, 0x0158, 0x2011, 0x0114, 0x2204, 0x9085, - 0x0100, 0x2012, 0x6050, 0x0006, 0x9085, 0x0020, 0x6052, 0x080c, - 0x725e, 0x9006, 0x8001, 0x1df0, 0x2001, 0x0100, 0x2004, 0x9086, - 0x000a, 0x0140, 0x000e, 0x6052, 0x0028, 0x6804, 0xd0d4, 0x1110, - 0x080c, 0x725e, 0x080c, 0xc539, 0x0118, 0x9006, 0x080c, 0x2cb2, - 0x0016, 0x0026, 0x7000, 0x908e, 0x0004, 0x0130, 0x2009, 0x00c8, - 0x2011, 0x7076, 0x080c, 0x836c, 0x002e, 0x001e, 0x080c, 0x81e7, - 0x7034, 0xc085, 0x7036, 0x2001, 0x1955, 0x2003, 0x0004, 0x080c, - 0x6ed3, 0x080c, 0x7218, 0x0138, 0x6804, 0xd0d4, 0x1120, 0xd0dc, - 0x1100, 0x080c, 0x7509, 0x00ee, 0x00de, 0x00ce, 0x0005, 0x00c6, - 0x00d6, 0x00e6, 0x2061, 0x0100, 0x2069, 0x0140, 0x2071, 0x1800, - 0x080c, 0x81fe, 0x080c, 0x81f0, 0x080c, 0x7513, 0x2001, 0x1945, - 0x2003, 0x0000, 0x9006, 0x7096, 0x60e2, 0x6886, 0x080c, 0x27e2, - 0x9006, 0x080c, 0x2c88, 0x6043, 0x0090, 0x6043, 0x0010, 0x6027, - 0xffff, 0x602b, 0x182f, 0x00ee, 0x00de, 0x00ce, 0x0005, 0x0006, - 0x2001, 0x1954, 0x2004, 0x9086, 0xaaaa, 0x000e, 0x0005, 0x0006, - 0x080c, 0x55df, 0x9084, 0x0030, 0x9086, 0x0000, 0x000e, 0x0005, - 0x0006, 0x080c, 0x55df, 0x9084, 0x0030, 0x9086, 0x0030, 0x000e, - 0x0005, 0x0006, 0x080c, 0x55df, 0x9084, 0x0030, 0x9086, 0x0010, - 0x000e, 0x0005, 0x0006, 0x080c, 0x55df, 0x9084, 0x0030, 0x9086, - 0x0020, 0x000e, 0x0005, 0x0036, 0x0016, 0x2001, 0x180c, 0x2004, - 0x908c, 0x0013, 0x0180, 0x0020, 0x080c, 0x2802, 0x900e, 0x0028, - 0x080c, 0x67bb, 0x1dc8, 0x2009, 0x0002, 0x2019, 0x0028, 0x080c, - 0x3156, 0x9006, 0x0019, 0x001e, 0x003e, 0x0005, 0x00e6, 0x2071, - 0x180c, 0x2e04, 0x0130, 0x080c, 0xc532, 0x1128, 0x9085, 0x0010, - 0x0010, 0x9084, 0xffef, 0x2072, 0x00ee, 0x0005, 0x6050, 0x0006, - 0x60ec, 0x0006, 0x600c, 0x0006, 0x6004, 0x0006, 0x6028, 0x0006, - 0x2001, 0x0100, 0x2004, 0x9086, 0x000a, 0x0510, 0x0016, 0x6138, - 0x6050, 0x9084, 0xfbff, 0x9085, 0x2000, 0x6052, 0x613a, 0x20a9, - 0x0012, 0x1d04, 0x7279, 0x2091, 0x6000, 0x1f04, 0x7279, 0x602f, - 0x0100, 0x602f, 0x0000, 0x6050, 0x9085, 0x0400, 0x9084, 0xdfff, - 0x6052, 0x613a, 0x001e, 0x602f, 0x0040, 0x602f, 0x0000, 0x00a0, - 0x080c, 0x2cc2, 0x080c, 0x2cf5, 0x602f, 0x0100, 0x602f, 0x0000, - 0x602f, 0x0040, 0x602f, 0x0000, 0x20a9, 0x0002, 0x080c, 0x2b91, - 0x0026, 0x6027, 0x0040, 0x002e, 0x000e, 0x602a, 0x000e, 0x6006, - 0x000e, 0x600e, 0x000e, 0x60ee, 0x60e3, 0x0000, 0x6887, 0x0001, - 0x2001, 0x0001, 0x080c, 0x27e2, 0x2001, 0x00a0, 0x0006, 0x080c, - 0xc539, 0x000e, 0x0130, 0x080c, 0x2ca6, 0x9006, 0x080c, 0x2cb2, - 0x0010, 0x080c, 0x2c88, 0x000e, 0x6052, 0x6050, 0x0006, 0xc0e5, - 0x6052, 0x00f6, 0x2079, 0x0100, 0x080c, 0x2b06, 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, 0x734b, 0x2001, 0x180c, 0x200c, 0xc1c4, 0x2102, 0x6028, - 0x9084, 0xe1ff, 0x602a, 0x6027, 0x0200, 0x2001, 0x0090, 0x080c, - 0x2c88, 0x20a9, 0x0366, 0x6024, 0xd0cc, 0x1518, 0x1d04, 0x72fb, - 0x2091, 0x6000, 0x1f04, 0x72fb, 0x2011, 0x0003, 0x080c, 0x9a0f, - 0x2011, 0x0002, 0x080c, 0x9a19, 0x080c, 0x9927, 0x901e, 0x080c, - 0x999d, 0x2001, 0x00a0, 0x080c, 0x2c88, 0x080c, 0x7504, 0x080c, - 0x5f2b, 0x080c, 0xc539, 0x0110, 0x080c, 0x0d68, 0x9085, 0x0001, - 0x0480, 0x080c, 0x1a24, 0x60e3, 0x0000, 0x2001, 0x0002, 0x080c, - 0x27e2, 0x60e2, 0x2001, 0x0080, 0x080c, 0x2c88, 0x20a9, 0x0366, - 0x6027, 0x1e00, 0x2009, 0x1e00, 0x080c, 0x2bb0, 0x6024, 0x910c, - 0x0138, 0x1d04, 0x7330, 0x2091, 0x6000, 0x1f04, 0x7330, 0x0820, - 0x6028, 0x9085, 0x1e00, 0x602a, 0x70b0, 0x9005, 0x1118, 0x6887, - 0x0001, 0x0008, 0x6886, 0x080c, 0xc539, 0x0110, 0x080c, 0x0d68, + 0x70be, 0x080c, 0x816f, 0x00ee, 0x0804, 0x6b82, 0x2071, 0x190e, + 0xa803, 0x0000, 0x2908, 0x7010, 0x8000, 0x7012, 0x7018, 0x904d, + 0x711a, 0x0110, 0xa902, 0x0008, 0x711e, 0x2148, 0xa804, 0x900d, + 0x1128, 0x1e04, 0x6c21, 0x002e, 0x00ee, 0x0005, 0x2071, 0x1800, + 0x9016, 0x702c, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, + 0x1dc8, 0x702e, 0x70bc, 0x9200, 0x70be, 0x080c, 0x816f, 0x0e04, + 0x6c0b, 0x2071, 0x190e, 0x701c, 0x2048, 0xa84c, 0x900d, 0x0d18, + 0x2071, 0x0000, 0x7182, 0xa850, 0x7032, 0xa86c, 0x7086, 0x7036, + 0xa870, 0x708a, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, + 0x190c, 0x11e6, 0x2071, 0x190e, 0x080c, 0x6d56, 0x002e, 0x00ee, + 0x0005, 0x2071, 0x190e, 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, 0x70bc, 0x9200, 0x70be, 0x080c, 0x816f, + 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, 0x190e, 0x7004, 0x0002, 0x6c8e, 0x6c8f, + 0x6d55, 0x6c8f, 0x6c8c, 0x6d55, 0x080c, 0x0df6, 0x0005, 0x2001, + 0x1923, 0x2004, 0x0002, 0x6c99, 0x6c99, 0x6cee, 0x6cef, 0x6c99, + 0x6cef, 0x0126, 0x2091, 0x8000, 0x1e0c, 0x6d75, 0x701c, 0x904d, + 0x01e0, 0xa84c, 0x9005, 0x01d8, 0x0e04, 0x6cbd, 0xa94c, 0x2071, + 0x0000, 0x7182, 0xa850, 0x7032, 0xa86c, 0x7086, 0x7036, 0xa870, + 0x708a, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, + 0x11e6, 0x2071, 0x190e, 0x080c, 0x6d56, 0x012e, 0x0470, 0x2001, + 0x005b, 0x2004, 0x9094, 0x0780, 0x190c, 0x6d6a, 0xd09c, 0x2071, + 0x190e, 0x1510, 0x2071, 0x190e, 0x700f, 0x0001, 0xa964, 0x9184, + 0x00ff, 0x9086, 0x0003, 0x1130, 0x810f, 0x918c, 0x00ff, 0x8101, + 0x0108, 0x710e, 0x2900, 0x00d6, 0x2069, 0x0050, 0x6822, 0x00de, + 0x2071, 0x190e, 0x701c, 0x2048, 0x7010, 0x8001, 0x7012, 0xa800, + 0x701e, 0x9005, 0x1108, 0x701a, 0x012e, 0x0005, 0x0005, 0x00d6, + 0x2008, 0x2069, 0x19d5, 0x6844, 0x9005, 0x0760, 0x0158, 0x9186, + 0x0003, 0x0540, 0x2001, 0x1814, 0x2004, 0x2009, 0x1aa2, 0x210c, + 0x9102, 0x1500, 0x0126, 0x2091, 0x8000, 0x2069, 0x0050, 0x693c, + 0x6838, 0x9106, 0x0190, 0x0e04, 0x6d21, 0x2069, 0x0000, 0x6837, + 0x8040, 0x6833, 0x0012, 0x6883, 0x8040, 0x2091, 0x4080, 0x2001, + 0x0089, 0x2004, 0xd084, 0x190c, 0x11e6, 0x2069, 0x19d5, 0x6847, + 0xffff, 0x012e, 0x00de, 0x0126, 0x2091, 0x8000, 0x1e0c, 0x6de0, + 0x701c, 0x904d, 0x0540, 0x2001, 0x005b, 0x2004, 0x9094, 0x0780, + 0x15c9, 0xd09c, 0x1500, 0x2071, 0x190e, 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, 0x1069, 0x0005, + 0x012e, 0x0005, 0x2091, 0x8000, 0x0e04, 0x6d6c, 0x0006, 0x0016, + 0x2001, 0x8004, 0x0006, 0x0804, 0x0dff, 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, + 0x11e6, 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, 0x182f, 0x210c, 0x918a, + 0x0040, 0x0218, 0x7022, 0x00ee, 0x0058, 0x00ee, 0x2048, 0x702c, + 0xa802, 0x2900, 0x702e, 0x70bc, 0x8000, 0x70be, 0x080c, 0x816f, + 0x782c, 0x9094, 0x0780, 0x190c, 0x6d6a, 0xd0a4, 0x19f0, 0x7838, + 0x7938, 0x910e, 0x1de0, 0x00d6, 0x2069, 0x0000, 0x6836, 0x6833, + 0x0013, 0x00de, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, + 0x190c, 0x11e6, 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, 0x11e6, 0x00fe, 0x0005, 0x782c, 0x9094, 0x0780, + 0x190c, 0x6d6a, 0xd0a4, 0x0db8, 0x00e6, 0x2071, 0x1800, 0x7824, + 0x2048, 0x702c, 0xa802, 0x2900, 0x702e, 0x70bc, 0x8000, 0x70be, + 0x080c, 0x816f, 0x782c, 0x9094, 0x0780, 0x190c, 0x6d6a, 0xd0a4, + 0x1d70, 0x00d6, 0x2069, 0x0050, 0x693c, 0x2069, 0x1923, 0x6808, + 0x690a, 0x2069, 0x19d5, 0x9102, 0x1118, 0x6844, 0x9005, 0x1320, + 0x2001, 0x1924, 0x200c, 0x6946, 0x00de, 0x00ee, 0x00fe, 0x0005, + 0x7094, 0x908a, 0x002a, 0x1a0c, 0x0df6, 0x9082, 0x001d, 0x001b, + 0x6027, 0x1e00, 0x0005, 0x6f21, 0x6e8e, 0x6eaa, 0x6ed4, 0x6f10, + 0x6f50, 0x6f62, 0x6eaa, 0x6f38, 0x6e49, 0x6e77, 0x6efa, 0x6e48, + 0x0005, 0x00d6, 0x2069, 0x0200, 0x6804, 0x9005, 0x1180, 0x6808, + 0x9005, 0x1518, 0x7097, 0x0029, 0x2069, 0x1969, 0x2d04, 0x7002, + 0x080c, 0x72cd, 0x6028, 0x9085, 0x0600, 0x602a, 0x00b0, 0x7097, + 0x0029, 0x2069, 0x1969, 0x2d04, 0x7002, 0x6028, 0x9085, 0x0600, + 0x602a, 0x00e6, 0x0036, 0x0046, 0x0056, 0x2071, 0x1a3f, 0x080c, + 0x1977, 0x005e, 0x004e, 0x003e, 0x00ee, 0x00de, 0x0005, 0x00d6, + 0x2069, 0x0200, 0x6804, 0x9005, 0x1178, 0x6808, 0x9005, 0x1160, + 0x7097, 0x0029, 0x2069, 0x1969, 0x2d04, 0x7002, 0x080c, 0x7369, + 0x6028, 0x9085, 0x0600, 0x602a, 0x00de, 0x0005, 0x0006, 0x2001, + 0x0090, 0x080c, 0x2b6f, 0x000e, 0x6124, 0xd1e4, 0x1190, 0x080c, + 0x6fcf, 0xd1d4, 0x1160, 0xd1dc, 0x1138, 0xd1cc, 0x0150, 0x7097, + 0x0020, 0x080c, 0x6fcf, 0x0028, 0x7097, 0x001d, 0x0010, 0x7097, + 0x001f, 0x0005, 0x2001, 0x0088, 0x080c, 0x2b6f, 0x6124, 0xd1cc, + 0x11e8, 0xd1dc, 0x11c0, 0xd1e4, 0x1198, 0x9184, 0x1e00, 0x11d8, + 0x080c, 0x19a4, 0x60e3, 0x0001, 0x600c, 0xc0b4, 0x600e, 0x080c, + 0x71aa, 0x2001, 0x0080, 0x080c, 0x2b6f, 0x7097, 0x0029, 0x0058, + 0x7097, 0x001e, 0x0040, 0x7097, 0x001d, 0x0028, 0x7097, 0x0020, + 0x0010, 0x7097, 0x001f, 0x0005, 0x080c, 0x19a4, 0x60e3, 0x0001, + 0x600c, 0xc0b4, 0x600e, 0x080c, 0x71aa, 0x2001, 0x0080, 0x080c, + 0x2b6f, 0x6124, 0xd1d4, 0x1198, 0xd1dc, 0x1170, 0xd1e4, 0x1148, + 0x9184, 0x1e00, 0x1118, 0x7097, 0x0029, 0x0058, 0x7097, 0x0028, + 0x0040, 0x7097, 0x001e, 0x0028, 0x7097, 0x001d, 0x0010, 0x7097, + 0x001f, 0x0005, 0x6124, 0xd1d4, 0x1180, 0xd1dc, 0x1158, 0xd1e4, + 0x1130, 0x9184, 0x1e00, 0x1158, 0x7097, 0x0029, 0x0040, 0x7097, + 0x001e, 0x0028, 0x7097, 0x001d, 0x0010, 0x7097, 0x001f, 0x0005, + 0x2001, 0x00a0, 0x080c, 0x2b6f, 0x6124, 0xd1dc, 0x1138, 0xd1e4, + 0x0138, 0x080c, 0x19a4, 0x7097, 0x001e, 0x0010, 0x7097, 0x001d, + 0x0005, 0x080c, 0x7052, 0x6124, 0xd1dc, 0x1188, 0x080c, 0x6fcf, + 0x0016, 0x080c, 0x19a4, 0x001e, 0xd1d4, 0x1128, 0xd1e4, 0x0138, + 0x7097, 0x001e, 0x0020, 0x7097, 0x001f, 0x080c, 0x6fcf, 0x0005, + 0x0006, 0x2001, 0x00a0, 0x080c, 0x2b6f, 0x000e, 0x6124, 0xd1d4, + 0x1160, 0xd1cc, 0x1150, 0xd1dc, 0x1128, 0xd1e4, 0x0140, 0x7097, + 0x001e, 0x0028, 0x7097, 0x001d, 0x0010, 0x7097, 0x0021, 0x0005, + 0x080c, 0x7052, 0x6124, 0xd1d4, 0x1150, 0xd1dc, 0x1128, 0xd1e4, + 0x0140, 0x7097, 0x001e, 0x0028, 0x7097, 0x001d, 0x0010, 0x7097, + 0x001f, 0x0005, 0x0006, 0x2001, 0x0090, 0x080c, 0x2b6f, 0x000e, + 0x6124, 0xd1d4, 0x1178, 0xd1cc, 0x1150, 0xd1dc, 0x1128, 0xd1e4, + 0x0158, 0x7097, 0x001e, 0x0040, 0x7097, 0x001d, 0x0028, 0x7097, + 0x0020, 0x0010, 0x7097, 0x001f, 0x0005, 0x0016, 0x00c6, 0x00d6, + 0x00e6, 0x0126, 0x2061, 0x0100, 0x2069, 0x0140, 0x2071, 0x1800, + 0x2091, 0x8000, 0x080c, 0x717e, 0x11d8, 0x2001, 0x180c, 0x200c, + 0xd1b4, 0x01b0, 0xc1b4, 0x2102, 0x6027, 0x0200, 0x080c, 0x2a97, + 0x6024, 0xd0cc, 0x0148, 0x2001, 0x00a0, 0x080c, 0x2b6f, 0x080c, + 0x747a, 0x080c, 0x5e2f, 0x0428, 0x6028, 0xc0cd, 0x602a, 0x0408, + 0x080c, 0x7198, 0x0150, 0x080c, 0x718f, 0x1138, 0x2001, 0x0001, + 0x080c, 0x2616, 0x080c, 0x7156, 0x00a0, 0x080c, 0x704f, 0x0178, + 0x2001, 0x0001, 0x080c, 0x2616, 0x7094, 0x9086, 0x001e, 0x0120, + 0x7094, 0x9086, 0x0022, 0x1118, 0x7097, 0x0025, 0x0010, 0x7097, + 0x0021, 0x012e, 0x00ee, 0x00de, 0x00ce, 0x001e, 0x0005, 0x0026, + 0x2011, 0x6fe0, 0x080c, 0x832d, 0x002e, 0x0016, 0x0026, 0x2009, + 0x0064, 0x2011, 0x6fe0, 0x080c, 0x8324, 0x002e, 0x001e, 0x0005, + 0x00e6, 0x00f6, 0x0016, 0x080c, 0x961a, 0x2071, 0x1800, 0x080c, + 0x6f7d, 0x001e, 0x00fe, 0x00ee, 0x0005, 0x0016, 0x0026, 0x0036, + 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x0126, 0x2071, 0x1800, 0x080c, + 0x961a, 0x2061, 0x0100, 0x2069, 0x0140, 0x2091, 0x8000, 0x6028, + 0xc09c, 0x602a, 0x2011, 0x0003, 0x080c, 0x9923, 0x2011, 0x0002, + 0x080c, 0x992d, 0x080c, 0x983b, 0x080c, 0x82d9, 0x0036, 0x901e, + 0x080c, 0x98b1, 0x003e, 0x60e3, 0x0000, 0x080c, 0xdbdb, 0x080c, + 0xdbf6, 0x2009, 0x0004, 0x080c, 0x2a9d, 0x080c, 0x2974, 0x2001, + 0x1800, 0x2003, 0x0004, 0x6027, 0x0008, 0x2011, 0x6fe0, 0x080c, + 0x832d, 0x080c, 0x7198, 0x0118, 0x9006, 0x080c, 0x2b6f, 0x080c, + 0x0b8f, 0x2001, 0x0001, 0x080c, 0x2616, 0x012e, 0x00fe, 0x00ee, + 0x00de, 0x00ce, 0x003e, 0x002e, 0x001e, 0x0005, 0x0026, 0x00e6, + 0x2011, 0x6fed, 0x2071, 0x19d5, 0x701c, 0x9206, 0x1118, 0x7018, + 0x9005, 0x0110, 0x9085, 0x0001, 0x00ee, 0x002e, 0x0005, 0x6020, + 0xd09c, 0x0005, 0x6800, 0x9084, 0xfffe, 0x9086, 0x00c0, 0x01b8, + 0x2001, 0x00c0, 0x080c, 0x2b6f, 0x0156, 0x20a9, 0x002d, 0x1d04, + 0x705f, 0x2091, 0x6000, 0x1f04, 0x705f, 0x015e, 0x00d6, 0x2069, + 0x1800, 0x6898, 0x8001, 0x0220, 0x0118, 0x689a, 0x00de, 0x0005, + 0x689b, 0x0014, 0x68e4, 0xd0dc, 0x0dc8, 0x6800, 0x9086, 0x0001, + 0x1da8, 0x080c, 0x8339, 0x0c90, 0x00c6, 0x00d6, 0x00e6, 0x2061, + 0x0100, 0x2069, 0x0140, 0x2071, 0x1800, 0x080c, 0x7489, 0x2001, + 0x1947, 0x2003, 0x0000, 0x9006, 0x7096, 0x60e2, 0x6886, 0x080c, + 0x26e1, 0x9006, 0x080c, 0x2b6f, 0x080c, 0x5cee, 0x6027, 0xffff, + 0x602b, 0x182f, 0x00ee, 0x00de, 0x00ce, 0x0005, 0x00c6, 0x00d6, + 0x00e6, 0x2061, 0x0100, 0x2069, 0x0140, 0x2071, 0x1800, 0x2001, + 0x1957, 0x200c, 0x9186, 0x0000, 0x0158, 0x9186, 0x0001, 0x0158, + 0x9186, 0x0002, 0x0158, 0x9186, 0x0003, 0x0158, 0x0804, 0x7146, + 0x7097, 0x0022, 0x0040, 0x7097, 0x0021, 0x0028, 0x7097, 0x0023, + 0x0010, 0x7097, 0x0024, 0x60e3, 0x0000, 0x6887, 0x0001, 0x2001, + 0x0001, 0x080c, 0x26e1, 0x0026, 0x080c, 0x9f70, 0x002e, 0x7000, + 0x908e, 0x0004, 0x0118, 0x602b, 0x0028, 0x0010, 0x602b, 0x0020, + 0x0156, 0x0126, 0x2091, 0x8000, 0x20a9, 0x0005, 0x6024, 0xd0ac, + 0x0150, 0x012e, 0x015e, 0x080c, 0xc459, 0x0118, 0x9006, 0x080c, + 0x2b99, 0x0804, 0x7152, 0x6800, 0x9084, 0x00a1, 0xc0bd, 0x6802, + 0x080c, 0x2a97, 0x6904, 0xd1d4, 0x1140, 0x2001, 0x0100, 0x080c, + 0x2b6f, 0x1f04, 0x70de, 0x080c, 0x71d2, 0x012e, 0x015e, 0x080c, + 0x718f, 0x0538, 0x6044, 0x9005, 0x01f8, 0x2001, 0x0100, 0x2004, + 0x9086, 0x000a, 0x0158, 0x2011, 0x0114, 0x2204, 0x9085, 0x0100, + 0x2012, 0x6050, 0x0006, 0x9085, 0x0020, 0x6052, 0x080c, 0x71d2, + 0x9006, 0x8001, 0x1df0, 0x2001, 0x0100, 0x2004, 0x9086, 0x000a, + 0x0140, 0x000e, 0x6052, 0x0028, 0x6804, 0xd0d4, 0x1110, 0x080c, + 0x71d2, 0x080c, 0xc459, 0x0118, 0x9006, 0x080c, 0x2b99, 0x0016, + 0x0026, 0x7000, 0x908e, 0x0004, 0x0130, 0x2009, 0x00c8, 0x2011, + 0x6fed, 0x080c, 0x82eb, 0x002e, 0x001e, 0x080c, 0x8166, 0x7034, + 0xc085, 0x7036, 0x2001, 0x1957, 0x2003, 0x0004, 0x080c, 0x6e30, + 0x080c, 0x718f, 0x0138, 0x6804, 0xd0d4, 0x1120, 0xd0dc, 0x1100, + 0x080c, 0x747f, 0x00ee, 0x00de, 0x00ce, 0x0005, 0x00c6, 0x00d6, + 0x00e6, 0x2061, 0x0100, 0x2069, 0x0140, 0x2071, 0x1800, 0x080c, + 0x817d, 0x080c, 0x816f, 0x080c, 0x7489, 0x2001, 0x1947, 0x2003, + 0x0000, 0x9006, 0x7096, 0x60e2, 0x6886, 0x080c, 0x26e1, 0x9006, + 0x080c, 0x2b6f, 0x6043, 0x0090, 0x6043, 0x0010, 0x6027, 0xffff, + 0x602b, 0x182f, 0x00ee, 0x00de, 0x00ce, 0x0005, 0x0006, 0x2001, + 0x1956, 0x2004, 0x9086, 0xaaaa, 0x000e, 0x0005, 0x0006, 0x080c, + 0x54df, 0x9084, 0x0030, 0x9086, 0x0000, 0x000e, 0x0005, 0x0006, + 0x080c, 0x54df, 0x9084, 0x0030, 0x9086, 0x0030, 0x000e, 0x0005, + 0x0006, 0x080c, 0x54df, 0x9084, 0x0030, 0x9086, 0x0010, 0x000e, + 0x0005, 0x0006, 0x080c, 0x54df, 0x9084, 0x0030, 0x9086, 0x0020, + 0x000e, 0x0005, 0x0036, 0x0016, 0x2001, 0x180c, 0x2004, 0x908c, + 0x0013, 0x0168, 0x0020, 0x080c, 0x2701, 0x900e, 0x0010, 0x2009, + 0x0002, 0x2019, 0x0028, 0x080c, 0x3060, 0x9006, 0x0019, 0x001e, + 0x003e, 0x0005, 0x00e6, 0x2071, 0x180c, 0x2e04, 0x0130, 0x080c, + 0xc452, 0x1128, 0x9085, 0x0010, 0x0010, 0x9084, 0xffef, 0x2072, + 0x00ee, 0x0005, 0x6050, 0x0006, 0x60ec, 0x0006, 0x600c, 0x0006, + 0x6004, 0x0006, 0x6028, 0x0006, 0x2001, 0x0100, 0x2004, 0x9086, + 0x000a, 0x0510, 0x0016, 0x6138, 0x6050, 0x9084, 0xfbff, 0x9085, + 0x2000, 0x6052, 0x613a, 0x20a9, 0x0012, 0x1d04, 0x71ed, 0x2091, + 0x6000, 0x1f04, 0x71ed, 0x602f, 0x0100, 0x602f, 0x0000, 0x6050, + 0x9085, 0x0400, 0x9084, 0xdfff, 0x6052, 0x613a, 0x001e, 0x602f, + 0x0040, 0x602f, 0x0000, 0x00a0, 0x080c, 0x2ba9, 0x080c, 0x2bdc, + 0x602f, 0x0100, 0x602f, 0x0000, 0x602f, 0x0040, 0x602f, 0x0000, + 0x20a9, 0x0002, 0x080c, 0x2a78, 0x0026, 0x6027, 0x0040, 0x002e, + 0x000e, 0x602a, 0x000e, 0x6006, 0x000e, 0x600e, 0x000e, 0x60ee, + 0x60e3, 0x0000, 0x6887, 0x0001, 0x2001, 0x0001, 0x080c, 0x26e1, + 0x2001, 0x00a0, 0x0006, 0x080c, 0xc459, 0x000e, 0x0130, 0x080c, + 0x2b8d, 0x9006, 0x080c, 0x2b99, 0x0010, 0x080c, 0x2b6f, 0x000e, + 0x6052, 0x6050, 0x0006, 0xc0e5, 0x6052, 0x00f6, 0x2079, 0x0100, + 0x080c, 0x29f1, 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, 0x72bf, 0x2001, 0x180c, + 0x200c, 0xc1c4, 0x2102, 0x6028, 0x9084, 0xe1ff, 0x602a, 0x6027, + 0x0200, 0x2001, 0x0090, 0x080c, 0x2b6f, 0x20a9, 0x0366, 0x6024, + 0xd0cc, 0x1518, 0x1d04, 0x726f, 0x2091, 0x6000, 0x1f04, 0x726f, + 0x2011, 0x0003, 0x080c, 0x9923, 0x2011, 0x0002, 0x080c, 0x992d, + 0x080c, 0x983b, 0x901e, 0x080c, 0x98b1, 0x2001, 0x00a0, 0x080c, + 0x2b6f, 0x080c, 0x747a, 0x080c, 0x5e2f, 0x080c, 0xc459, 0x0110, + 0x080c, 0x0d64, 0x9085, 0x0001, 0x0480, 0x080c, 0x19a4, 0x60e3, + 0x0000, 0x2001, 0x0002, 0x080c, 0x26e1, 0x60e2, 0x2001, 0x0080, + 0x080c, 0x2b6f, 0x20a9, 0x0366, 0x6027, 0x1e00, 0x2009, 0x1e00, + 0x080c, 0x2a97, 0x6024, 0x910c, 0x0138, 0x1d04, 0x72a4, 0x2091, + 0x6000, 0x1f04, 0x72a4, 0x0820, 0x6028, 0x9085, 0x1e00, 0x602a, + 0x70b0, 0x9005, 0x1118, 0x6887, 0x0001, 0x0008, 0x6886, 0x080c, + 0xc459, 0x0110, 0x080c, 0x0d64, 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, 0x1a54, 0x2d04, 0x8000, + 0x206a, 0x2069, 0x0140, 0x6020, 0x9084, 0x00c0, 0x0120, 0x6884, + 0x9005, 0x1904, 0x7332, 0x2001, 0x0088, 0x080c, 0x2b6f, 0x9006, + 0x60e2, 0x6886, 0x080c, 0x26e1, 0x2069, 0x0200, 0x6804, 0x9005, + 0x1118, 0x6808, 0x9005, 0x01c0, 0x6028, 0x9084, 0xfbff, 0x602a, + 0x6027, 0x0400, 0x2069, 0x1969, 0x7000, 0x206a, 0x7097, 0x0026, + 0x7003, 0x0001, 0x20a9, 0x0002, 0x1d04, 0x7314, 0x2091, 0x6000, + 0x1f04, 0x7314, 0x0804, 0x7361, 0x2069, 0x0140, 0x20a9, 0x0384, + 0x6027, 0x1e00, 0x2009, 0x1e00, 0x080c, 0x2a97, 0x6024, 0x910c, + 0x0508, 0x9084, 0x1a00, 0x11f0, 0x1d04, 0x7320, 0x2091, 0x6000, + 0x1f04, 0x7320, 0x2011, 0x0003, 0x080c, 0x9923, 0x2011, 0x0002, + 0x080c, 0x992d, 0x080c, 0x983b, 0x901e, 0x080c, 0x98b1, 0x2001, + 0x00a0, 0x080c, 0x2b6f, 0x080c, 0x747a, 0x080c, 0x5e2f, 0x9085, + 0x0001, 0x00b8, 0x080c, 0x19a4, 0x2001, 0x0080, 0x080c, 0x2b6f, + 0x2069, 0x0140, 0x60e3, 0x0000, 0x70b0, 0x9005, 0x1118, 0x6887, + 0x0001, 0x0008, 0x6886, 0x2001, 0x0002, 0x080c, 0x26e1, 0x60e2, 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, 0x1a50, 0x2d04, 0x8000, 0x206a, 0x2069, 0x0140, 0x6020, - 0x9084, 0x00c0, 0x0120, 0x6884, 0x9005, 0x1904, 0x73be, 0x2001, - 0x0088, 0x080c, 0x2c88, 0x9006, 0x60e2, 0x6886, 0x080c, 0x27e2, - 0x2069, 0x0200, 0x6804, 0x9005, 0x1118, 0x6808, 0x9005, 0x01c0, - 0x6028, 0x9084, 0xfbff, 0x602a, 0x6027, 0x0400, 0x2069, 0x1967, - 0x7000, 0x206a, 0x7097, 0x0026, 0x7003, 0x0001, 0x20a9, 0x0002, - 0x1d04, 0x73a0, 0x2091, 0x6000, 0x1f04, 0x73a0, 0x0804, 0x73eb, - 0x2069, 0x0140, 0x20a9, 0x0384, 0x6027, 0x1e00, 0x2009, 0x1e00, - 0x080c, 0x2bb0, 0x6024, 0x910c, 0x0508, 0x9084, 0x1a00, 0x11f0, - 0x1d04, 0x73ac, 0x2091, 0x6000, 0x1f04, 0x73ac, 0x2011, 0x0003, - 0x080c, 0x9a0f, 0x2011, 0x0002, 0x080c, 0x9a19, 0x080c, 0x9927, - 0x901e, 0x080c, 0x999d, 0x2001, 0x00a0, 0x080c, 0x2c88, 0x080c, - 0x7504, 0x080c, 0x5f2b, 0x9085, 0x0001, 0x00a8, 0x2001, 0x0080, - 0x080c, 0x2c88, 0x2069, 0x0140, 0x60e3, 0x0000, 0x70b0, 0x9005, - 0x1118, 0x6887, 0x0001, 0x0008, 0x6886, 0x2001, 0x0002, 0x080c, - 0x27e2, 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, 0x9a0f, 0x2011, 0x0002, - 0x080c, 0x9a19, 0x080c, 0x9927, 0x901e, 0x080c, 0x999d, 0x2069, - 0x0140, 0x2001, 0x00a0, 0x080c, 0x2c88, 0x080c, 0x7504, 0x080c, - 0x5f2b, 0x0804, 0x7485, 0x2001, 0x180c, 0x200c, 0xd1b4, 0x1160, - 0xc1b5, 0x2102, 0x080c, 0x705e, 0x2069, 0x0140, 0x2001, 0x0080, - 0x080c, 0x2c88, 0x60e3, 0x0000, 0x2069, 0x0200, 0x6804, 0x9005, - 0x1118, 0x6808, 0x9005, 0x0180, 0x6028, 0x9084, 0xfdff, 0x602a, - 0x6027, 0x0200, 0x2069, 0x1967, 0x7000, 0x206a, 0x7097, 0x0027, - 0x7003, 0x0001, 0x0804, 0x7485, 0x6027, 0x1e00, 0x2009, 0x1e00, - 0x080c, 0x2bb0, 0x6024, 0x910c, 0x01c8, 0x9084, 0x1c00, 0x11b0, - 0x1d04, 0x7444, 0x0006, 0x0016, 0x00c6, 0x00d6, 0x00e6, 0x080c, - 0x823e, 0x00ee, 0x00de, 0x00ce, 0x001e, 0x000e, 0x00e6, 0x2071, - 0x19d2, 0x7070, 0x00ee, 0x9005, 0x19f8, 0x00f8, 0x0026, 0x2011, - 0x7076, 0x080c, 0x82da, 0x2011, 0x7069, 0x080c, 0x83ae, 0x002e, - 0x2069, 0x0140, 0x60e3, 0x0000, 0x70b0, 0x9005, 0x1118, 0x6887, - 0x0001, 0x0008, 0x6886, 0x2001, 0x0002, 0x080c, 0x27e2, 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, 0xc532, 0x1904, 0x74f2, 0x7130, 0xd184, 0x1170, 0x080c, - 0x32e4, 0x0138, 0xc18d, 0x7132, 0x2011, 0x185c, 0x2214, 0xd2ac, - 0x1120, 0x7030, 0xd08c, 0x0904, 0x74f2, 0x2011, 0x185c, 0x220c, - 0x0438, 0x0016, 0x2019, 0x000e, 0x080c, 0xd801, 0x0156, 0x00b6, - 0x20a9, 0x007f, 0x900e, 0x9186, 0x007e, 0x01a0, 0x9186, 0x0080, - 0x0188, 0x080c, 0x649f, 0x1170, 0x2120, 0x9006, 0x0016, 0x2009, - 0x000e, 0x080c, 0xd885, 0x2009, 0x0001, 0x2011, 0x0100, 0x080c, - 0x84d1, 0x001e, 0x8108, 0x1f04, 0x74bb, 0x00be, 0x015e, 0x001e, - 0xd1ac, 0x1148, 0x0016, 0x2009, 0x0002, 0x2019, 0x0004, 0x080c, - 0x3156, 0x001e, 0x0078, 0x0156, 0x00b6, 0x20a9, 0x007f, 0x900e, - 0x080c, 0x649f, 0x1110, 0x080c, 0x5f45, 0x8108, 0x1f04, 0x74e8, - 0x00be, 0x015e, 0x080c, 0x1a24, 0x080c, 0xa069, 0x60e3, 0x0000, - 0x080c, 0x5f2b, 0x080c, 0x7127, 0x00ee, 0x00ce, 0x004e, 0x003e, - 0x002e, 0x001e, 0x015e, 0x0005, 0x2001, 0x1955, 0x2003, 0x0001, - 0x0005, 0x2001, 0x1955, 0x2003, 0x0000, 0x0005, 0x2001, 0x1954, - 0x2003, 0xaaaa, 0x0005, 0x2001, 0x1954, 0x2003, 0x0000, 0x0005, - 0x2071, 0x18f8, 0x7003, 0x0000, 0x7007, 0x0000, 0x080c, 0x104a, - 0x090c, 0x0dfa, 0xa8ab, 0xdcb0, 0x2900, 0x704e, 0x080c, 0x104a, - 0x090c, 0x0dfa, 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, 0x18f8, 0x6807, 0x0001, - 0x00de, 0x080c, 0x7afd, 0x9006, 0x00ee, 0x0005, 0x900e, 0x0156, - 0x20a9, 0x0006, 0x8003, 0x818d, 0x1f04, 0x757a, 0x015e, 0x0005, - 0x2079, 0x0040, 0x2071, 0x18f8, 0x7004, 0x0002, 0x7590, 0x7591, - 0x75c9, 0x7624, 0x7765, 0x758e, 0x758e, 0x778f, 0x080c, 0x0dfa, - 0x0005, 0x2079, 0x0040, 0x782c, 0x908c, 0x0780, 0x190c, 0x7b89, - 0xd0a4, 0x01f8, 0x7824, 0x2048, 0x9006, 0xa802, 0xa806, 0xa864, - 0x9084, 0x00ff, 0x908a, 0x0040, 0x0610, 0x00c0, 0x2001, 0x1800, - 0x200c, 0x9186, 0x0003, 0x1168, 0x7004, 0x0002, 0x75b9, 0x7593, - 0x75b9, 0x75b7, 0x75b9, 0x75b9, 0x75b9, 0x75b9, 0x75b9, 0x080c, - 0x7624, 0x782c, 0xd09c, 0x090c, 0x7afd, 0x0005, 0x9082, 0x005a, - 0x1218, 0x2100, 0x003b, 0x0c10, 0x080c, 0x765a, 0x0c90, 0x00e3, - 0x08e8, 0x0005, 0x765a, 0x765a, 0x765a, 0x765a, 0x765a, 0x765a, - 0x765a, 0x765a, 0x767c, 0x765a, 0x765a, 0x765a, 0x765a, 0x765a, - 0x765a, 0x765a, 0x765a, 0x765a, 0x765a, 0x765a, 0x765a, 0x765a, - 0x765a, 0x765a, 0x765a, 0x765a, 0x765a, 0x765a, 0x7666, 0x765a, - 0x7864, 0x765a, 0x765a, 0x765a, 0x767c, 0x765a, 0x7666, 0x78a5, - 0x78e6, 0x792d, 0x7941, 0x765a, 0x765a, 0x767c, 0x7666, 0x765a, - 0x765a, 0x7739, 0x79ec, 0x7a07, 0x765a, 0x767c, 0x765a, 0x765a, - 0x765a, 0x765a, 0x772f, 0x7a07, 0x765a, 0x765a, 0x765a, 0x765a, - 0x765a, 0x765a, 0x765a, 0x765a, 0x765a, 0x7690, 0x765a, 0x765a, - 0x765a, 0x765a, 0x765a, 0x765a, 0x765a, 0x765a, 0x765a, 0x7b2d, - 0x765a, 0x765a, 0x765a, 0x765a, 0x765a, 0x76a4, 0x765a, 0x765a, - 0x765a, 0x765a, 0x765a, 0x765a, 0x2079, 0x0040, 0x7004, 0x9086, - 0x0003, 0x1198, 0x782c, 0x080c, 0x7b26, 0xd0a4, 0x0170, 0x7824, - 0x2048, 0x9006, 0xa802, 0xa806, 0xa864, 0x9084, 0x00ff, 0x908a, - 0x001a, 0x1210, 0x002b, 0x0c50, 0x00e9, 0x080c, 0x7afd, 0x0005, - 0x765a, 0x7666, 0x7850, 0x765a, 0x7666, 0x765a, 0x7666, 0x7666, - 0x765a, 0x7666, 0x7850, 0x7666, 0x7666, 0x7666, 0x7666, 0x7666, - 0x765a, 0x7666, 0x7850, 0x765a, 0x765a, 0x7666, 0x765a, 0x765a, - 0x765a, 0x7666, 0x00e6, 0x2071, 0x18f8, 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, 0x6ae9, 0x012e, 0x0005, 0xa864, 0x8007, 0x9084, 0x00ff, - 0x0d08, 0x8001, 0x1120, 0x7007, 0x0001, 0x0804, 0x780e, 0x7007, - 0x0003, 0x7012, 0x2900, 0x7016, 0x701a, 0x704b, 0x780e, 0x0005, - 0xa864, 0x8007, 0x9084, 0x00ff, 0x0968, 0x8001, 0x1120, 0x7007, - 0x0001, 0x0804, 0x7829, 0x7007, 0x0003, 0x7012, 0x2900, 0x7016, - 0x701a, 0x704b, 0x7829, 0x0005, 0xa864, 0x8007, 0x9084, 0x00ff, - 0x9086, 0x0001, 0x1904, 0x7662, 0x7007, 0x0001, 0x2009, 0x1833, - 0x210c, 0x81ff, 0x1904, 0x7706, 0xa994, 0x9186, 0x006f, 0x0188, - 0x9186, 0x0074, 0x15b0, 0x0026, 0x2011, 0x0010, 0x080c, 0x67e7, - 0x002e, 0x0578, 0x0016, 0xa998, 0x080c, 0x6831, 0x001e, 0x1548, - 0x0400, 0x080c, 0x7207, 0x0140, 0xa897, 0x4005, 0xa89b, 0x0016, - 0x2001, 0x0030, 0x900e, 0x0438, 0x0026, 0x2011, 0x8008, 0x080c, - 0x67e7, 0x002e, 0x01b0, 0x0016, 0x0026, 0x0036, 0xa998, 0xaaa0, - 0xab9c, 0x918d, 0x8000, 0x080c, 0x6831, 0x003e, 0x002e, 0x001e, - 0x1140, 0xa897, 0x4005, 0xa89b, 0x4009, 0x2001, 0x0030, 0x900e, - 0x0050, 0xa868, 0x9084, 0x00ff, 0xa86a, 0xa883, 0x0000, 0x080c, - 0x615d, 0x1108, 0x0005, 0x0126, 0x2091, 0x8000, 0xa867, 0x0139, - 0xa87a, 0xa982, 0x080c, 0x6ae9, 0x012e, 0x0ca0, 0xa994, 0x9186, - 0x0071, 0x0904, 0x76b4, 0x9186, 0x0064, 0x0904, 0x76b4, 0x9186, - 0x007c, 0x0904, 0x76b4, 0x9186, 0x0028, 0x0904, 0x76b4, 0x9186, - 0x0038, 0x0904, 0x76b4, 0x9186, 0x0078, 0x0904, 0x76b4, 0x9186, - 0x005f, 0x0904, 0x76b4, 0x9186, 0x0056, 0x0904, 0x76b4, 0xa897, - 0x4005, 0xa89b, 0x0001, 0x2001, 0x0030, 0x900e, 0x0860, 0xa87c, - 0x9084, 0x00c0, 0x9086, 0x00c0, 0x1120, 0x7007, 0x0001, 0x0804, - 0x7a1e, 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, 0x766a, 0xaab4, 0x928a, 0x0002, 0x1a04, 0x766a, - 0x82ff, 0x1138, 0xa8b8, 0xa9bc, 0x9105, 0x0118, 0x2001, 0x77cc, - 0x0018, 0x9280, 0x77c2, 0x2005, 0x7056, 0x7010, 0x9015, 0x0904, - 0x77ad, 0x080c, 0x104a, 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, 0x112e, 0xa06c, - 0x908e, 0x0100, 0x0170, 0x9086, 0x0200, 0x0118, 0x7007, 0x0007, - 0x0005, 0x7020, 0x2048, 0x080c, 0x1063, 0x7014, 0x2048, 0x0804, - 0x766a, 0x7020, 0x2048, 0x7018, 0xa802, 0xa807, 0x0000, 0x2908, - 0x2048, 0xa906, 0x711a, 0x0804, 0x7765, 0x7014, 0x2048, 0x7007, - 0x0001, 0xa8b4, 0x9005, 0x1128, 0xa8b8, 0xa9bc, 0x9105, 0x0108, - 0x00b9, 0xa864, 0x9084, 0x00ff, 0x9086, 0x001e, 0x0904, 0x7a1e, - 0x0804, 0x780e, 0x77c4, 0x77c8, 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, 0x1833, - 0x210c, 0x81ff, 0x1178, 0x080c, 0x5fa7, 0x1108, 0x0005, 0x080c, - 0x6d17, 0x0126, 0x2091, 0x8000, 0x080c, 0xc12d, 0x080c, 0x6ae9, - 0x012e, 0x0ca0, 0x080c, 0xc532, 0x1d70, 0x2001, 0x0028, 0x900e, - 0x0c70, 0x2009, 0x1833, 0x210c, 0x81ff, 0x11d8, 0xa888, 0x9005, - 0x01e0, 0xa883, 0x0000, 0xa87c, 0xd0f4, 0x0120, 0x080c, 0x60bf, - 0x1138, 0x0005, 0x9006, 0xa87a, 0x080c, 0x6037, 0x1108, 0x0005, - 0x0126, 0x2091, 0x8000, 0xa87a, 0xa982, 0x080c, 0x6ae9, 0x012e, - 0x0cb0, 0x2001, 0x0028, 0x900e, 0x0c98, 0x2001, 0x0000, 0x0c80, - 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, 0x649f, 0x11b8, 0x0066, - 0xae80, 0x080c, 0x65af, 0x006e, 0x0088, 0x0046, 0x2011, 0x180c, - 0x2224, 0xc484, 0x2412, 0x004e, 0x00c6, 0x080c, 0x649f, 0x1110, - 0x080c, 0x66af, 0x8108, 0x1f04, 0x788d, 0x00ce, 0xa87c, 0xd084, - 0x1120, 0x080c, 0x1063, 0x00be, 0x0005, 0x0126, 0x2091, 0x8000, - 0x080c, 0x6ae9, 0x012e, 0x00be, 0x0005, 0x0126, 0x2091, 0x8000, - 0x7007, 0x0001, 0x080c, 0x67bf, 0x0580, 0x2061, 0x1a48, 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, 0x7ae7, 0x012e, 0x0804, 0x7ae1, - 0x012e, 0x0804, 0x7adb, 0x012e, 0x0804, 0x7ade, 0x0126, 0x2091, - 0x8000, 0x7007, 0x0001, 0x080c, 0x67bf, 0x05e0, 0x2061, 0x1a48, - 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, 0x7ae7, 0x012e, - 0x0804, 0x7ae4, 0x012e, 0x0804, 0x7ae1, 0x0126, 0x2091, 0x8000, - 0x7007, 0x0001, 0x2061, 0x1a48, 0x6300, 0xd38c, 0x1120, 0x6308, - 0x8318, 0x0220, 0x630a, 0x012e, 0x0804, 0x7af5, 0x012e, 0x0804, - 0x7ae4, 0x00b6, 0x0126, 0x00c6, 0x2091, 0x8000, 0x7007, 0x0001, - 0xa87c, 0xd0ac, 0x0148, 0x00c6, 0x2061, 0x1a48, 0x6000, 0x9084, - 0xfcff, 0x6002, 0x00ce, 0x0440, 0xa888, 0x9005, 0x05d8, 0xa88c, - 0x9065, 0x0598, 0x2001, 0x1833, 0x2004, 0x9005, 0x0118, 0x080c, - 0xa113, 0x0068, 0x6017, 0xf400, 0x605b, 0x0000, 0xa97c, 0xd1a4, - 0x0110, 0xa980, 0x615a, 0x2009, 0x0041, 0x080c, 0xa15d, 0xa988, - 0x918c, 0xff00, 0x9186, 0x2000, 0x1138, 0x0026, 0x900e, 0x2011, - 0xfdff, 0x080c, 0x84d1, 0x002e, 0xa87c, 0xd0c4, 0x0148, 0x2061, - 0x1a48, 0x6000, 0xd08c, 0x1120, 0x6008, 0x8000, 0x0208, 0x600a, - 0x00ce, 0x012e, 0x00be, 0x0804, 0x7ae7, 0x00ce, 0x012e, 0x00be, - 0x0804, 0x7ae1, 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, 0x649f, 0x1968, 0xb800, - 0xc0e4, 0xb802, 0x0848, 0xa88c, 0x9065, 0x09b8, 0x6007, 0x0024, - 0x2001, 0x195e, 0x2004, 0x601a, 0x0804, 0x797c, 0xa88c, 0x9065, - 0x0960, 0x00e6, 0xa890, 0x9075, 0x2001, 0x1833, 0x2004, 0x9005, - 0x0150, 0x080c, 0xa113, 0x8eff, 0x0118, 0x2e60, 0x080c, 0xa113, - 0x00ee, 0x0804, 0x797c, 0x6024, 0xc0dc, 0xc0d5, 0x6026, 0x2e60, - 0x6007, 0x003a, 0xa8a0, 0x9005, 0x0130, 0x6007, 0x003b, 0xa8a4, - 0x602e, 0xa8a8, 0x6016, 0x6003, 0x0001, 0x080c, 0x8679, 0x080c, - 0x8c10, 0x00ee, 0x0804, 0x797c, 0x2061, 0x1a48, 0x6000, 0xd084, - 0x0190, 0xd08c, 0x1904, 0x7af5, 0x0126, 0x2091, 0x8000, 0x6204, - 0x8210, 0x0220, 0x6206, 0x012e, 0x0804, 0x7af5, 0x012e, 0xa883, - 0x0016, 0x0804, 0x7aee, 0xa883, 0x0007, 0x0804, 0x7aee, 0xa864, - 0x8007, 0x9084, 0x00ff, 0x0130, 0x8001, 0x1138, 0x7007, 0x0001, - 0x0069, 0x0005, 0x080c, 0x7662, 0x0040, 0x7007, 0x0003, 0x7012, - 0x2900, 0x7016, 0x701a, 0x704b, 0x7a1e, 0x0005, 0x00b6, 0x00e6, - 0x0126, 0x2091, 0x8000, 0x903e, 0x2061, 0x1800, 0x61cc, 0x81ff, - 0x1904, 0x7aa0, 0x6130, 0xd194, 0x1904, 0x7aca, 0xa878, 0x2070, - 0x9e82, 0x1cd0, 0x0a04, 0x7a94, 0x6064, 0x9e02, 0x1a04, 0x7a94, - 0x7120, 0x9186, 0x0006, 0x1904, 0x7a86, 0x7010, 0x905d, 0x0904, - 0x7aa0, 0xb800, 0xd0e4, 0x1904, 0x7ac4, 0x2061, 0x1a48, 0x6100, - 0x9184, 0x0301, 0x9086, 0x0001, 0x15a0, 0x7024, 0xd0dc, 0x1904, - 0x7acd, 0xa883, 0x0000, 0xa803, 0x0000, 0x2908, 0x7014, 0x9005, - 0x1198, 0x7116, 0xa87c, 0xd0f4, 0x1904, 0x7ad0, 0x080c, 0x55db, - 0xd09c, 0x1118, 0xa87c, 0xc0cc, 0xa87e, 0x2e60, 0x080c, 0x83f1, - 0x012e, 0x00ee, 0x00be, 0x0005, 0x2048, 0xa800, 0x9005, 0x1de0, - 0xa902, 0x2148, 0xa87c, 0xd0f4, 0x1904, 0x7ad0, 0x012e, 0x00ee, - 0x00be, 0x0005, 0x012e, 0x00ee, 0xa883, 0x0006, 0x00be, 0x0804, - 0x7aee, 0xd184, 0x0db8, 0xd1c4, 0x1190, 0x00a0, 0xa974, 0x080c, - 0x649f, 0x15d0, 0xb800, 0xd0e4, 0x15b8, 0x7120, 0x9186, 0x0007, - 0x1118, 0xa883, 0x0002, 0x0490, 0xa883, 0x0008, 0x0478, 0xa883, - 0x000e, 0x0460, 0xa883, 0x0017, 0x0448, 0xa883, 0x0035, 0x0430, - 0x080c, 0x55df, 0xd0fc, 0x01e8, 0xa878, 0x2070, 0x9e82, 0x1cd0, - 0x02c0, 0x6064, 0x9e02, 0x12a8, 0x7120, 0x9186, 0x0006, 0x1188, - 0x7010, 0x905d, 0x0170, 0xb800, 0xd0bc, 0x0158, 0x2039, 0x0001, - 0x7000, 0x9086, 0x0007, 0x1904, 0x7a2a, 0x7003, 0x0002, 0x0804, - 0x7a2a, 0xa883, 0x0028, 0x0010, 0xa883, 0x0029, 0x012e, 0x00ee, - 0x00be, 0x0420, 0xa883, 0x002a, 0x0cc8, 0xa883, 0x0045, 0x0cb0, - 0x2e60, 0x2019, 0x0002, 0x601b, 0x0014, 0x080c, 0xd440, 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, 0x6ae9, 0x012e, 0x0005, 0x080c, 0x1063, 0x0005, - 0x00d6, 0x080c, 0x83e8, 0x00de, 0x0005, 0x00d6, 0x00e6, 0x0126, - 0x2091, 0x8000, 0x2071, 0x0040, 0x702c, 0xd084, 0x01d8, 0x908c, - 0x0780, 0x190c, 0x7b89, 0xd09c, 0x11a8, 0x2071, 0x1800, 0x70bc, - 0x90ea, 0x0040, 0x0278, 0x8001, 0x70be, 0x702c, 0x2048, 0xa800, - 0x702e, 0x9006, 0xa802, 0xa806, 0x2071, 0x0040, 0x2900, 0x7022, - 0x702c, 0x0c28, 0x012e, 0x00ee, 0x00de, 0x0005, 0x0006, 0x9084, - 0x0780, 0x190c, 0x7b89, 0x000e, 0x0005, 0x00d6, 0x00c6, 0x0036, - 0x0026, 0x0016, 0x00b6, 0x7007, 0x0001, 0xaa74, 0x9282, 0x0004, - 0x1a04, 0x7b7a, 0xa97c, 0x9188, 0x1000, 0x2104, 0x905d, 0xb804, - 0xd284, 0x0140, 0x05e8, 0x8007, 0x9084, 0x00ff, 0x9084, 0x0006, - 0x1108, 0x04b0, 0x2b10, 0x080c, 0xa08d, 0x1118, 0x080c, 0xa130, - 0x05a8, 0x6212, 0xa874, 0x0002, 0x7b58, 0x7b5d, 0x7b60, 0x7b66, - 0x2019, 0x0002, 0x080c, 0xd801, 0x0060, 0x080c, 0xd79d, 0x0048, - 0x2019, 0x0002, 0xa980, 0x080c, 0xd7b8, 0x0018, 0xa980, 0x080c, - 0xd79d, 0x080c, 0xa0e3, 0xa887, 0x0000, 0x0126, 0x2091, 0x8000, - 0x080c, 0x6ae9, 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, 0x7b8b, 0x0006, 0x0016, 0x2001, - 0x8003, 0x0006, 0x0804, 0x0e03, 0x2001, 0x1833, 0x2004, 0x9005, - 0x0005, 0x0005, 0x00f6, 0x2079, 0x0300, 0x2001, 0x0200, 0x200c, - 0xc1e5, 0xc1dc, 0x2102, 0x2009, 0x0218, 0x210c, 0xd1ec, 0x1120, - 0x080c, 0x151a, 0x00fe, 0x0005, 0x2001, 0x020d, 0x2003, 0x0020, - 0x781f, 0x0300, 0x00fe, 0x0005, 0x781c, 0xd08c, 0x0904, 0x7c0b, - 0x68bc, 0x90aa, 0x0005, 0x0a04, 0x81e7, 0x7d44, 0x7c40, 0x9584, - 0x00f6, 0x1510, 0x9484, 0x7000, 0x0140, 0x908a, 0x2000, 0x1260, - 0x9584, 0x0700, 0x8007, 0x0804, 0x7c12, 0x7000, 0x9084, 0xff00, - 0x9086, 0x8100, 0x0da8, 0x00b0, 0x9484, 0x0fff, 0x1130, 0x7000, - 0x9084, 0xff00, 0x9086, 0x8100, 0x11c0, 0x080c, 0xdbeb, 0x080c, - 0x811c, 0x7817, 0x0140, 0x00a8, 0x9584, 0x0076, 0x1118, 0x080c, - 0x817a, 0x19c0, 0xd5a4, 0x0148, 0x0046, 0x0056, 0x080c, 0x7c6d, - 0x080c, 0x226f, 0x005e, 0x004e, 0x0020, 0x080c, 0xdbeb, 0x7817, - 0x0140, 0x080c, 0x7207, 0x0168, 0x2001, 0x0111, 0x2004, 0xd08c, - 0x0140, 0x688f, 0x0000, 0x2001, 0x0110, 0x2003, 0x0008, 0x2003, - 0x0000, 0x080c, 0x7c4e, 0x2001, 0x19c8, 0x2004, 0x9005, 0x090c, - 0x8c10, 0x0005, 0x0002, 0x7c24, 0x7f24, 0x7c1b, 0x7c1b, 0x7c1b, - 0x7c1b, 0x7c1b, 0x7c1b, 0x7817, 0x0140, 0x2001, 0x19c8, 0x2004, - 0x9005, 0x090c, 0x8c10, 0x0005, 0x7000, 0x908c, 0xff00, 0x9194, - 0xf000, 0x810f, 0x9484, 0x0fff, 0x688e, 0x9286, 0x2000, 0x1150, - 0x6800, 0x9086, 0x0001, 0x1118, 0x080c, 0x5641, 0x0070, 0x080c, - 0x7c8d, 0x0058, 0x9286, 0x3000, 0x1118, 0x080c, 0x7e5c, 0x0028, - 0x9286, 0x8000, 0x1110, 0x080c, 0x8043, 0x7817, 0x0140, 0x2001, - 0x19c8, 0x2004, 0x9005, 0x090c, 0x8c10, 0x0005, 0x2001, 0x1810, - 0x2004, 0xd08c, 0x0178, 0x2001, 0x1800, 0x2004, 0x9086, 0x0003, - 0x1148, 0x0026, 0x0036, 0x2011, 0x8048, 0x2518, 0x080c, 0x4b1f, - 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, 0x4b1f, 0x002e, - 0x00fe, 0x005e, 0x004e, 0x003e, 0x0005, 0x00b6, 0x00c6, 0x7010, - 0x9084, 0xff00, 0x8007, 0x9096, 0x0001, 0x0120, 0x9096, 0x0023, - 0x1904, 0x7e2d, 0x9186, 0x0023, 0x15c0, 0x080c, 0x80e1, 0x0904, - 0x7e2d, 0x6120, 0x9186, 0x0001, 0x0150, 0x9186, 0x0004, 0x0138, - 0x9186, 0x0008, 0x0120, 0x9186, 0x000a, 0x1904, 0x7e2d, 0x7124, - 0x610a, 0x7030, 0x908e, 0x0200, 0x1130, 0x2009, 0x0015, 0x080c, - 0xa15d, 0x0804, 0x7e2d, 0x908e, 0x0214, 0x0118, 0x908e, 0x0210, - 0x1130, 0x2009, 0x0015, 0x080c, 0xa15d, 0x0804, 0x7e2d, 0x908e, - 0x0100, 0x1904, 0x7e2d, 0x7034, 0x9005, 0x1904, 0x7e2d, 0x2009, - 0x0016, 0x080c, 0xa15d, 0x0804, 0x7e2d, 0x9186, 0x0022, 0x1904, - 0x7e2d, 0x7030, 0x908e, 0x0300, 0x1580, 0x68d8, 0xd0a4, 0x0528, - 0xc0b5, 0x68da, 0x7100, 0x918c, 0x00ff, 0x697a, 0x7004, 0x687e, - 0x00f6, 0x2079, 0x0100, 0x79e6, 0x78ea, 0x0006, 0x9084, 0x00ff, - 0x0016, 0x2008, 0x080c, 0x27b7, 0x7932, 0x7936, 0x001e, 0x000e, - 0x00fe, 0x080c, 0x276e, 0x695a, 0x703c, 0x00e6, 0x2071, 0x0140, - 0x7086, 0x2071, 0x1800, 0x70b2, 0x00ee, 0x7034, 0x9005, 0x1904, - 0x7e2d, 0x2009, 0x0017, 0x0804, 0x7ddd, 0x908e, 0x0400, 0x1190, - 0x7034, 0x9005, 0x1904, 0x7e2d, 0x080c, 0x7207, 0x0120, 0x2009, - 0x001d, 0x0804, 0x7ddd, 0x68d8, 0xc0a5, 0x68da, 0x2009, 0x0030, - 0x0804, 0x7ddd, 0x908e, 0x0500, 0x1140, 0x7034, 0x9005, 0x1904, - 0x7e2d, 0x2009, 0x0018, 0x0804, 0x7ddd, 0x908e, 0x2010, 0x1120, - 0x2009, 0x0019, 0x0804, 0x7ddd, 0x908e, 0x2110, 0x1120, 0x2009, - 0x001a, 0x0804, 0x7ddd, 0x908e, 0x5200, 0x1140, 0x7034, 0x9005, - 0x1904, 0x7e2d, 0x2009, 0x001b, 0x0804, 0x7ddd, 0x908e, 0x5000, - 0x1140, 0x7034, 0x9005, 0x1904, 0x7e2d, 0x2009, 0x001c, 0x0804, - 0x7ddd, 0x908e, 0x1300, 0x1120, 0x2009, 0x0034, 0x0804, 0x7ddd, - 0x908e, 0x1200, 0x1140, 0x7034, 0x9005, 0x1904, 0x7e2d, 0x2009, - 0x0024, 0x0804, 0x7ddd, 0x908c, 0xff00, 0x918e, 0x2400, 0x1170, - 0x2009, 0x002d, 0x2001, 0x1810, 0x2004, 0xd09c, 0x0904, 0x7ddd, - 0x080c, 0xcc07, 0x1904, 0x7e2d, 0x0804, 0x7ddb, 0x908c, 0xff00, - 0x918e, 0x5300, 0x1120, 0x2009, 0x002a, 0x0804, 0x7ddd, 0x908e, - 0x0f00, 0x1120, 0x2009, 0x0020, 0x0804, 0x7ddd, 0x908e, 0x6104, - 0x1528, 0x2029, 0x0205, 0x2011, 0x026d, 0x8208, 0x2204, 0x9082, - 0x0004, 0x8004, 0x8004, 0x20a8, 0x2011, 0x8015, 0x211c, 0x8108, - 0x0046, 0x2124, 0x080c, 0x4b1f, 0x004e, 0x8108, 0x0f04, 0x7da9, - 0x9186, 0x0280, 0x1d88, 0x2504, 0x8000, 0x202a, 0x2009, 0x0260, - 0x0c58, 0x202b, 0x0000, 0x2009, 0x0023, 0x0478, 0x908e, 0x6000, - 0x1118, 0x2009, 0x003f, 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, 0x276e, 0x1904, 0x7e30, 0x080c, - 0x643f, 0x1904, 0x7e30, 0xbe12, 0xbd16, 0x001e, 0x0016, 0x080c, - 0x7207, 0x01c0, 0x68d8, 0xd08c, 0x1148, 0x7000, 0x9084, 0x00ff, - 0x1188, 0x7004, 0x9084, 0xff00, 0x1168, 0x0040, 0x6878, 0x9606, - 0x1148, 0x687c, 0x9506, 0x9084, 0xff00, 0x1120, 0x9584, 0x00ff, - 0xb8b2, 0x0080, 0xb8b0, 0x9005, 0x1168, 0x9186, 0x0046, 0x1150, - 0x6878, 0x9606, 0x1138, 0x687c, 0x9506, 0x9084, 0xff00, 0x1110, - 0x001e, 0x0098, 0x080c, 0xa08d, 0x01a8, 0x2b08, 0x6112, 0x6023, - 0x0004, 0x7120, 0x610a, 0x001e, 0x9186, 0x004c, 0x1110, 0x6023, - 0x000a, 0x0016, 0x001e, 0x080c, 0xa15d, 0x00ce, 0x00be, 0x0005, - 0x001e, 0x0cd8, 0x2001, 0x180e, 0x2004, 0xd0ec, 0x0120, 0x2011, - 0x8049, 0x080c, 0x4b1f, 0x080c, 0xa130, 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, 0x86c1, 0x08a0, 0x080c, 0x8206, 0x1158, 0x080c, - 0x32ae, 0x1140, 0x7010, 0x9084, 0xff00, 0x8007, 0x908e, 0x0008, - 0x1108, 0x0009, 0x0005, 0x00b6, 0x00c6, 0x0046, 0x7000, 0x908c, - 0xff00, 0x810f, 0x9186, 0x0033, 0x11e8, 0x080c, 0x80e1, 0x0904, - 0x7ebc, 0x7124, 0x610a, 0x7030, 0x908e, 0x0200, 0x1140, 0x7034, - 0x9005, 0x15d0, 0x2009, 0x0015, 0x080c, 0xa15d, 0x04a8, 0x908e, - 0x0100, 0x1590, 0x7034, 0x9005, 0x1578, 0x2009, 0x0016, 0x080c, - 0xa15d, 0x0450, 0x9186, 0x0032, 0x1538, 0x7030, 0x908e, 0x1400, - 0x1518, 0x2009, 0x0038, 0x0016, 0x2011, 0x0263, 0x2204, 0x8211, - 0x220c, 0x080c, 0x276e, 0x11b8, 0x080c, 0x643f, 0x11a0, 0xbe12, - 0xbd16, 0x080c, 0xa08d, 0x0178, 0x2b08, 0x6112, 0x080c, 0xc2b3, - 0x6023, 0x0004, 0x7120, 0x610a, 0x001e, 0x080c, 0xa15d, 0x080c, - 0x8c10, 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, 0x7f1e, 0x9596, 0xfffe, 0x1120, 0x2009, 0x007e, - 0x0804, 0x7f1e, 0x9596, 0xfffc, 0x1118, 0x2009, 0x0080, 0x04f0, - 0x2011, 0x0000, 0x2019, 0x1836, 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, 0x7ef3, 0x82ff, - 0x1118, 0x9085, 0x0001, 0x0018, 0xc2fc, 0x2208, 0x9006, 0x00de, - 0x00ee, 0x004e, 0x00be, 0x0005, 0x2001, 0x1836, 0x200c, 0x9184, - 0x0080, 0x0110, 0xd18c, 0x0138, 0x7000, 0x908c, 0xff00, 0x810f, - 0x9184, 0x000f, 0x004a, 0x7817, 0x0140, 0x2001, 0x19c8, 0x2004, - 0x9005, 0x090c, 0x8c10, 0x0005, 0x7f4c, 0x7f4c, 0x7f4c, 0x80f3, - 0x7f4c, 0x7f55, 0x7f80, 0x800e, 0x7f4c, 0x7f4c, 0x7f4c, 0x7f4c, - 0x7f4c, 0x7f4c, 0x7f4c, 0x7f4c, 0x7817, 0x0140, 0x2001, 0x19c8, - 0x2004, 0x9005, 0x090c, 0x8c10, 0x0005, 0x00b6, 0x7110, 0xd1bc, - 0x01e8, 0x7120, 0x2160, 0x9c8c, 0x0007, 0x11c0, 0x9c8a, 0x1cd0, + 0x2061, 0x0100, 0x2071, 0x1800, 0x6020, 0x9084, 0x00c0, 0x01c8, + 0x2011, 0x0003, 0x080c, 0x9923, 0x2011, 0x0002, 0x080c, 0x992d, + 0x080c, 0x983b, 0x901e, 0x080c, 0x98b1, 0x2069, 0x0140, 0x2001, + 0x00a0, 0x080c, 0x2b6f, 0x080c, 0x747a, 0x080c, 0x5e2f, 0x0804, + 0x73fb, 0x2001, 0x180c, 0x200c, 0xd1b4, 0x1160, 0xc1b5, 0x2102, + 0x080c, 0x6fd5, 0x2069, 0x0140, 0x2001, 0x0080, 0x080c, 0x2b6f, + 0x60e3, 0x0000, 0x2069, 0x0200, 0x6804, 0x9005, 0x1118, 0x6808, + 0x9005, 0x0180, 0x6028, 0x9084, 0xfdff, 0x602a, 0x6027, 0x0200, + 0x2069, 0x1969, 0x7000, 0x206a, 0x7097, 0x0027, 0x7003, 0x0001, + 0x0804, 0x73fb, 0x6027, 0x1e00, 0x2009, 0x1e00, 0x080c, 0x2a97, + 0x6024, 0x910c, 0x01c8, 0x9084, 0x1c00, 0x11b0, 0x1d04, 0x73ba, + 0x0006, 0x0016, 0x00c6, 0x00d6, 0x00e6, 0x080c, 0x81bd, 0x00ee, + 0x00de, 0x00ce, 0x001e, 0x000e, 0x00e6, 0x2071, 0x19d5, 0x7078, + 0x00ee, 0x9005, 0x19f8, 0x00f8, 0x0026, 0x2011, 0x6fed, 0x080c, + 0x8259, 0x2011, 0x6fe0, 0x080c, 0x832d, 0x002e, 0x2069, 0x0140, + 0x60e3, 0x0000, 0x70b0, 0x9005, 0x1118, 0x6887, 0x0001, 0x0008, + 0x6886, 0x2001, 0x0002, 0x080c, 0x26e1, 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, 0xc452, + 0x1904, 0x7468, 0x7130, 0xd184, 0x1170, 0x080c, 0x31ee, 0x0138, + 0xc18d, 0x7132, 0x2011, 0x185c, 0x2214, 0xd2ac, 0x1120, 0x7030, + 0xd08c, 0x0904, 0x7468, 0x2011, 0x185c, 0x220c, 0x0438, 0x0016, + 0x2019, 0x000e, 0x080c, 0xd7af, 0x0156, 0x00b6, 0x20a9, 0x007f, + 0x900e, 0x9186, 0x007e, 0x01a0, 0x9186, 0x0080, 0x0188, 0x080c, + 0x63a3, 0x1170, 0x2120, 0x9006, 0x0016, 0x2009, 0x000e, 0x080c, + 0xd837, 0x2009, 0x0001, 0x2011, 0x0100, 0x080c, 0x8450, 0x001e, + 0x8108, 0x1f04, 0x7431, 0x00be, 0x015e, 0x001e, 0xd1ac, 0x1148, + 0x0016, 0x2009, 0x0002, 0x2019, 0x0004, 0x080c, 0x3060, 0x001e, + 0x0078, 0x0156, 0x00b6, 0x20a9, 0x007f, 0x900e, 0x080c, 0x63a3, + 0x1110, 0x080c, 0x5e49, 0x8108, 0x1f04, 0x745e, 0x00be, 0x015e, + 0x080c, 0x19a4, 0x080c, 0x9f70, 0x60e3, 0x0000, 0x080c, 0x5e2f, + 0x080c, 0x709e, 0x00ee, 0x00ce, 0x004e, 0x003e, 0x002e, 0x001e, + 0x015e, 0x0005, 0x2001, 0x1957, 0x2003, 0x0001, 0x0005, 0x2001, + 0x1957, 0x2003, 0x0000, 0x0005, 0x2001, 0x1956, 0x2003, 0xaaaa, + 0x0005, 0x2001, 0x1956, 0x2003, 0x0000, 0x0005, 0x2071, 0x18f8, + 0x7003, 0x0000, 0x7007, 0x0000, 0x080c, 0x1050, 0x090c, 0x0df6, + 0xa8ab, 0xdcb0, 0x2900, 0x704e, 0x080c, 0x1050, 0x090c, 0x0df6, + 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, 0x18f8, 0x6807, 0x0001, 0x00de, 0x080c, + 0x7a7c, 0x9006, 0x00ee, 0x0005, 0x900e, 0x0156, 0x20a9, 0x0006, + 0x8003, 0x818d, 0x1f04, 0x74f0, 0x015e, 0x0005, 0x2079, 0x0040, + 0x2071, 0x18f8, 0x7004, 0x0002, 0x7506, 0x7507, 0x753f, 0x759a, + 0x76df, 0x7504, 0x7504, 0x7709, 0x080c, 0x0df6, 0x0005, 0x2079, + 0x0040, 0x782c, 0x908c, 0x0780, 0x190c, 0x7b08, 0xd0a4, 0x01f8, + 0x7824, 0x2048, 0x9006, 0xa802, 0xa806, 0xa864, 0x9084, 0x00ff, + 0x908a, 0x0040, 0x0610, 0x00c0, 0x2001, 0x1800, 0x200c, 0x9186, + 0x0003, 0x1168, 0x7004, 0x0002, 0x752f, 0x7509, 0x752f, 0x752d, + 0x752f, 0x752f, 0x752f, 0x752f, 0x752f, 0x080c, 0x759a, 0x782c, + 0xd09c, 0x090c, 0x7a7c, 0x0005, 0x9082, 0x005a, 0x1218, 0x2100, + 0x003b, 0x0c10, 0x080c, 0x75d0, 0x0c90, 0x00e3, 0x08e8, 0x0005, + 0x75d0, 0x75d0, 0x75d0, 0x75d0, 0x75d0, 0x75d0, 0x75d0, 0x75d0, + 0x75f2, 0x75d0, 0x75d0, 0x75d0, 0x75d0, 0x75d0, 0x75d0, 0x75d0, + 0x75d0, 0x75d0, 0x75d0, 0x75d0, 0x75d0, 0x75d0, 0x75d0, 0x75d0, + 0x75d0, 0x75d0, 0x75d0, 0x75d0, 0x75dc, 0x75d0, 0x77e3, 0x75d0, + 0x75d0, 0x75d0, 0x75f2, 0x75d0, 0x75dc, 0x7824, 0x7865, 0x78ac, + 0x78c0, 0x75d0, 0x75d0, 0x75f2, 0x75dc, 0x75d0, 0x75d0, 0x76b3, + 0x796b, 0x7986, 0x75d0, 0x75f2, 0x75d0, 0x75d0, 0x75d0, 0x75d0, + 0x76a9, 0x7986, 0x75d0, 0x75d0, 0x75d0, 0x75d0, 0x75d0, 0x75d0, + 0x75d0, 0x75d0, 0x75d0, 0x7606, 0x75d0, 0x75d0, 0x75d0, 0x75d0, + 0x75d0, 0x75d0, 0x75d0, 0x75d0, 0x75d0, 0x7aac, 0x75d0, 0x75d0, + 0x75d0, 0x75d0, 0x75d0, 0x761a, 0x75d0, 0x75d0, 0x75d0, 0x75d0, + 0x75d0, 0x75d0, 0x2079, 0x0040, 0x7004, 0x9086, 0x0003, 0x1198, + 0x782c, 0x080c, 0x7aa5, 0xd0a4, 0x0170, 0x7824, 0x2048, 0x9006, + 0xa802, 0xa806, 0xa864, 0x9084, 0x00ff, 0x908a, 0x001a, 0x1210, + 0x002b, 0x0c50, 0x00e9, 0x080c, 0x7a7c, 0x0005, 0x75d0, 0x75dc, + 0x77cf, 0x75d0, 0x75dc, 0x75d0, 0x75dc, 0x75dc, 0x75d0, 0x75dc, + 0x77cf, 0x75dc, 0x75dc, 0x75dc, 0x75dc, 0x75dc, 0x75d0, 0x75dc, + 0x77cf, 0x75d0, 0x75d0, 0x75dc, 0x75d0, 0x75d0, 0x75d0, 0x75dc, + 0x00e6, 0x2071, 0x18f8, 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, 0x6a22, + 0x012e, 0x0005, 0xa864, 0x8007, 0x9084, 0x00ff, 0x0d08, 0x8001, + 0x1120, 0x7007, 0x0001, 0x0804, 0x7788, 0x7007, 0x0003, 0x7012, + 0x2900, 0x7016, 0x701a, 0x704b, 0x7788, 0x0005, 0xa864, 0x8007, + 0x9084, 0x00ff, 0x0968, 0x8001, 0x1120, 0x7007, 0x0001, 0x0804, + 0x77a3, 0x7007, 0x0003, 0x7012, 0x2900, 0x7016, 0x701a, 0x704b, + 0x77a3, 0x0005, 0xa864, 0x8007, 0x9084, 0x00ff, 0x9086, 0x0001, + 0x1904, 0x75d8, 0x7007, 0x0001, 0x2009, 0x1833, 0x210c, 0x81ff, + 0x1904, 0x7680, 0xa99c, 0x9186, 0x00ff, 0x05e8, 0xa994, 0x9186, + 0x006f, 0x0188, 0x9186, 0x0074, 0x15b0, 0x0026, 0x2011, 0x0010, + 0x080c, 0x66ed, 0x002e, 0x0578, 0x0016, 0xa998, 0x080c, 0x6737, + 0x001e, 0x1548, 0x0400, 0x080c, 0x717e, 0x0140, 0xa897, 0x4005, + 0xa89b, 0x0016, 0x2001, 0x0030, 0x900e, 0x0438, 0x0026, 0x2011, + 0x8008, 0x080c, 0x66ed, 0x002e, 0x01b0, 0x0016, 0x0026, 0x0036, + 0xa998, 0xaaa0, 0xab9c, 0x918d, 0x8000, 0x080c, 0x6737, 0x003e, + 0x002e, 0x001e, 0x1140, 0xa897, 0x4005, 0xa89b, 0x4009, 0x2001, + 0x0030, 0x900e, 0x0050, 0xa868, 0x9084, 0x00ff, 0xa86a, 0xa883, + 0x0000, 0x080c, 0x6061, 0x1108, 0x0005, 0x0126, 0x2091, 0x8000, + 0xa867, 0x0139, 0xa87a, 0xa982, 0x080c, 0x6a22, 0x012e, 0x0ca0, + 0xa994, 0x9186, 0x0071, 0x0904, 0x762a, 0x9186, 0x0064, 0x0904, + 0x762a, 0x9186, 0x007c, 0x0904, 0x762a, 0x9186, 0x0028, 0x0904, + 0x762a, 0x9186, 0x0038, 0x0904, 0x762a, 0x9186, 0x0078, 0x0904, + 0x762a, 0x9186, 0x005f, 0x0904, 0x762a, 0x9186, 0x0056, 0x0904, + 0x762a, 0xa897, 0x4005, 0xa89b, 0x0001, 0x2001, 0x0030, 0x900e, + 0x0860, 0xa87c, 0x9084, 0x00c0, 0x9086, 0x00c0, 0x1120, 0x7007, + 0x0001, 0x0804, 0x799d, 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, 0x75e0, 0xaab4, 0x928a, 0x0002, + 0x1a04, 0x75e0, 0x82ff, 0x1138, 0xa8b8, 0xa9bc, 0x9105, 0x0118, + 0x2001, 0x7746, 0x0018, 0x9280, 0x773c, 0x2005, 0x7056, 0x7010, + 0x9015, 0x0904, 0x7727, 0x080c, 0x1050, 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, + 0x1134, 0xa06c, 0x908e, 0x0100, 0x0170, 0x9086, 0x0200, 0x0118, + 0x7007, 0x0007, 0x0005, 0x7020, 0x2048, 0x080c, 0x1069, 0x7014, + 0x2048, 0x0804, 0x75e0, 0x7020, 0x2048, 0x7018, 0xa802, 0xa807, + 0x0000, 0x2908, 0x2048, 0xa906, 0x711a, 0x0804, 0x76df, 0x7014, + 0x2048, 0x7007, 0x0001, 0xa8b4, 0x9005, 0x1128, 0xa8b8, 0xa9bc, + 0x9105, 0x0108, 0x00b9, 0xa864, 0x9084, 0x00ff, 0x9086, 0x001e, + 0x0904, 0x799d, 0x0804, 0x7788, 0x773e, 0x7742, 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, 0x1833, 0x210c, 0x81ff, 0x1178, 0x080c, 0x5eab, 0x1108, + 0x0005, 0x080c, 0x6c6b, 0x0126, 0x2091, 0x8000, 0x080c, 0xc044, + 0x080c, 0x6a22, 0x012e, 0x0ca0, 0x080c, 0xc452, 0x1d70, 0x2001, + 0x0028, 0x900e, 0x0c70, 0x0419, 0x11d8, 0xa888, 0x9005, 0x01e0, + 0xa883, 0x0000, 0xa87c, 0xd0f4, 0x0120, 0x080c, 0x5fc3, 0x1138, + 0x0005, 0x9006, 0xa87a, 0x080c, 0x5f3b, 0x1108, 0x0005, 0x0126, + 0x2091, 0x8000, 0xa87a, 0xa982, 0x080c, 0x6a22, 0x012e, 0x0cb0, + 0x2001, 0x0028, 0x900e, 0x0c98, 0x2001, 0x0000, 0x0c80, 0x00c6, + 0x2061, 0x1800, 0x60cc, 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, 0x63a3, 0x11b8, 0x0066, 0xae80, + 0x080c, 0x64b3, 0x006e, 0x0088, 0x0046, 0x2011, 0x180c, 0x2224, + 0xc484, 0x2412, 0x004e, 0x00c6, 0x080c, 0x63a3, 0x1110, 0x080c, + 0x65b3, 0x8108, 0x1f04, 0x780c, 0x00ce, 0xa87c, 0xd084, 0x1120, + 0x080c, 0x1069, 0x00be, 0x0005, 0x0126, 0x2091, 0x8000, 0x080c, + 0x6a22, 0x012e, 0x00be, 0x0005, 0x0126, 0x2091, 0x8000, 0x7007, + 0x0001, 0x080c, 0x66c5, 0x0580, 0x2061, 0x1a4c, 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, 0x7a66, 0x012e, 0x0804, 0x7a60, 0x012e, + 0x0804, 0x7a5a, 0x012e, 0x0804, 0x7a5d, 0x0126, 0x2091, 0x8000, + 0x7007, 0x0001, 0x080c, 0x66c5, 0x05e0, 0x2061, 0x1a4c, 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, 0x7a66, 0x012e, 0x0804, + 0x7a63, 0x012e, 0x0804, 0x7a60, 0x0126, 0x2091, 0x8000, 0x7007, + 0x0001, 0x2061, 0x1a4c, 0x6300, 0xd38c, 0x1120, 0x6308, 0x8318, + 0x0220, 0x630a, 0x012e, 0x0804, 0x7a74, 0x012e, 0x0804, 0x7a63, + 0x00b6, 0x0126, 0x00c6, 0x2091, 0x8000, 0x7007, 0x0001, 0xa87c, + 0xd0ac, 0x0148, 0x00c6, 0x2061, 0x1a4c, 0x6000, 0x9084, 0xfcff, + 0x6002, 0x00ce, 0x0440, 0xa888, 0x9005, 0x05d8, 0xa88c, 0x9065, + 0x0598, 0x2001, 0x1833, 0x2004, 0x9005, 0x0118, 0x080c, 0xa01c, + 0x0068, 0x6017, 0xf400, 0x605b, 0x0000, 0xa97c, 0xd1a4, 0x0110, + 0xa980, 0x615a, 0x2009, 0x0041, 0x080c, 0xa068, 0xa988, 0x918c, + 0xff00, 0x9186, 0x2000, 0x1138, 0x0026, 0x900e, 0x2011, 0xfdff, + 0x080c, 0x8450, 0x002e, 0xa87c, 0xd0c4, 0x0148, 0x2061, 0x1a4c, + 0x6000, 0xd08c, 0x1120, 0x6008, 0x8000, 0x0208, 0x600a, 0x00ce, + 0x012e, 0x00be, 0x0804, 0x7a66, 0x00ce, 0x012e, 0x00be, 0x0804, + 0x7a60, 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, 0x63a3, 0x1968, 0xb800, 0xc0e4, + 0xb802, 0x0848, 0xa88c, 0x9065, 0x09b8, 0x6007, 0x0024, 0x2001, + 0x1960, 0x2004, 0x601a, 0x0804, 0x78fb, 0xa88c, 0x9065, 0x0960, + 0x00e6, 0xa890, 0x9075, 0x2001, 0x1833, 0x2004, 0x9005, 0x0150, + 0x080c, 0xa01c, 0x8eff, 0x0118, 0x2e60, 0x080c, 0xa01c, 0x00ee, + 0x0804, 0x78fb, 0x6024, 0xc0dc, 0xc0d5, 0x6026, 0x2e60, 0x6007, + 0x003a, 0xa8a0, 0x9005, 0x0130, 0x6007, 0x003b, 0xa8a4, 0x602e, + 0xa8a8, 0x6016, 0x6003, 0x0001, 0x080c, 0x85f8, 0x080c, 0x8b8f, + 0x00ee, 0x0804, 0x78fb, 0x2061, 0x1a4c, 0x6000, 0xd084, 0x0190, + 0xd08c, 0x1904, 0x7a74, 0x0126, 0x2091, 0x8000, 0x6204, 0x8210, + 0x0220, 0x6206, 0x012e, 0x0804, 0x7a74, 0x012e, 0xa883, 0x0016, + 0x0804, 0x7a6d, 0xa883, 0x0007, 0x0804, 0x7a6d, 0xa864, 0x8007, + 0x9084, 0x00ff, 0x0130, 0x8001, 0x1138, 0x7007, 0x0001, 0x0069, + 0x0005, 0x080c, 0x75d8, 0x0040, 0x7007, 0x0003, 0x7012, 0x2900, + 0x7016, 0x701a, 0x704b, 0x799d, 0x0005, 0x00b6, 0x00e6, 0x0126, + 0x2091, 0x8000, 0x903e, 0x2061, 0x1800, 0x61cc, 0x81ff, 0x1904, + 0x7a1f, 0x6130, 0xd194, 0x1904, 0x7a49, 0xa878, 0x2070, 0x9e82, + 0x1cd0, 0x0a04, 0x7a13, 0x6064, 0x9e02, 0x1a04, 0x7a13, 0x7120, + 0x9186, 0x0006, 0x1904, 0x7a05, 0x7010, 0x905d, 0x0904, 0x7a1f, + 0xb800, 0xd0e4, 0x1904, 0x7a43, 0x2061, 0x1a4c, 0x6100, 0x9184, + 0x0301, 0x9086, 0x0001, 0x15a0, 0x7024, 0xd0dc, 0x1904, 0x7a4c, + 0xa883, 0x0000, 0xa803, 0x0000, 0x2908, 0x7014, 0x9005, 0x1198, + 0x7116, 0xa87c, 0xd0f4, 0x1904, 0x7a4f, 0x080c, 0x54db, 0xd09c, + 0x1118, 0xa87c, 0xc0cc, 0xa87e, 0x2e60, 0x080c, 0x8370, 0x012e, + 0x00ee, 0x00be, 0x0005, 0x2048, 0xa800, 0x9005, 0x1de0, 0xa902, + 0x2148, 0xa87c, 0xd0f4, 0x1904, 0x7a4f, 0x012e, 0x00ee, 0x00be, + 0x0005, 0x012e, 0x00ee, 0xa883, 0x0006, 0x00be, 0x0804, 0x7a6d, + 0xd184, 0x0db8, 0xd1c4, 0x1190, 0x00a0, 0xa974, 0x080c, 0x63a3, + 0x15d0, 0xb800, 0xd0e4, 0x15b8, 0x7120, 0x9186, 0x0007, 0x1118, + 0xa883, 0x0002, 0x0490, 0xa883, 0x0008, 0x0478, 0xa883, 0x000e, + 0x0460, 0xa883, 0x0017, 0x0448, 0xa883, 0x0035, 0x0430, 0x080c, + 0x54df, 0xd0fc, 0x01e8, 0xa878, 0x2070, 0x9e82, 0x1cd0, 0x02c0, + 0x6064, 0x9e02, 0x12a8, 0x7120, 0x9186, 0x0006, 0x1188, 0x7010, + 0x905d, 0x0170, 0xb800, 0xd0bc, 0x0158, 0x2039, 0x0001, 0x7000, + 0x9086, 0x0007, 0x1904, 0x79a9, 0x7003, 0x0002, 0x0804, 0x79a9, + 0xa883, 0x0028, 0x0010, 0xa883, 0x0029, 0x012e, 0x00ee, 0x00be, + 0x0420, 0xa883, 0x002a, 0x0cc8, 0xa883, 0x0045, 0x0cb0, 0x2e60, + 0x2019, 0x0002, 0x601b, 0x0014, 0x080c, 0xd38f, 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, 0x6a22, 0x012e, 0x0005, 0x080c, 0x1069, 0x0005, 0x00d6, + 0x080c, 0x8367, 0x00de, 0x0005, 0x00d6, 0x00e6, 0x0126, 0x2091, + 0x8000, 0x2071, 0x0040, 0x702c, 0xd084, 0x01d8, 0x908c, 0x0780, + 0x190c, 0x7b08, 0xd09c, 0x11a8, 0x2071, 0x1800, 0x70bc, 0x90ea, + 0x0040, 0x0278, 0x8001, 0x70be, 0x702c, 0x2048, 0xa800, 0x702e, + 0x9006, 0xa802, 0xa806, 0x2071, 0x0040, 0x2900, 0x7022, 0x702c, + 0x0c28, 0x012e, 0x00ee, 0x00de, 0x0005, 0x0006, 0x9084, 0x0780, + 0x190c, 0x7b08, 0x000e, 0x0005, 0x00d6, 0x00c6, 0x0036, 0x0026, + 0x0016, 0x00b6, 0x7007, 0x0001, 0xaa74, 0x9282, 0x0004, 0x1a04, + 0x7af9, 0xa97c, 0x9188, 0x1000, 0x2104, 0x905d, 0xb804, 0xd284, + 0x0140, 0x05e8, 0x8007, 0x9084, 0x00ff, 0x9084, 0x0006, 0x1108, + 0x04b0, 0x2b10, 0x080c, 0x9f94, 0x1118, 0x080c, 0xa03b, 0x05a8, + 0x6212, 0xa874, 0x0002, 0x7ad7, 0x7adc, 0x7adf, 0x7ae5, 0x2019, + 0x0002, 0x080c, 0xd7af, 0x0060, 0x080c, 0xd746, 0x0048, 0x2019, + 0x0002, 0xa980, 0x080c, 0xd761, 0x0018, 0xa980, 0x080c, 0xd746, + 0x080c, 0x9fea, 0xa887, 0x0000, 0x0126, 0x2091, 0x8000, 0x080c, + 0x6a22, 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, 0x7b0a, 0x0006, 0x0016, 0x2001, 0x8003, + 0x0006, 0x0804, 0x0dff, 0x2001, 0x1833, 0x2004, 0x9005, 0x0005, + 0x0005, 0x00f6, 0x2079, 0x0300, 0x2001, 0x0200, 0x200c, 0xc1e5, + 0xc1dc, 0x2102, 0x2009, 0x0218, 0x210c, 0xd1ec, 0x1120, 0x080c, + 0x150f, 0x00fe, 0x0005, 0x2001, 0x020d, 0x2003, 0x0020, 0x781f, + 0x0300, 0x00fe, 0x0005, 0x781c, 0xd08c, 0x0904, 0x7b8a, 0x68bc, + 0x90aa, 0x0005, 0x0a04, 0x8166, 0x7d44, 0x7c40, 0x9584, 0x00f6, + 0x1510, 0x9484, 0x7000, 0x0140, 0x908a, 0x2000, 0x1260, 0x9584, + 0x0700, 0x8007, 0x0804, 0x7b91, 0x7000, 0x9084, 0xff00, 0x9086, + 0x8100, 0x0da8, 0x00b0, 0x9484, 0x0fff, 0x1130, 0x7000, 0x9084, + 0xff00, 0x9086, 0x8100, 0x11c0, 0x080c, 0xdbb3, 0x080c, 0x809b, + 0x7817, 0x0140, 0x00a8, 0x9584, 0x0076, 0x1118, 0x080c, 0x80f9, + 0x19c0, 0xd5a4, 0x0148, 0x0046, 0x0056, 0x080c, 0x7bec, 0x080c, + 0x2165, 0x005e, 0x004e, 0x0020, 0x080c, 0xdbb3, 0x7817, 0x0140, + 0x080c, 0x717e, 0x0168, 0x2001, 0x0111, 0x2004, 0xd08c, 0x0140, + 0x688f, 0x0000, 0x2001, 0x0110, 0x2003, 0x0008, 0x2003, 0x0000, + 0x080c, 0x7bcd, 0x2001, 0x19cb, 0x2004, 0x9005, 0x090c, 0x8b8f, + 0x0005, 0x0002, 0x7ba3, 0x7ea3, 0x7b9a, 0x7b9a, 0x7b9a, 0x7b9a, + 0x7b9a, 0x7b9a, 0x7817, 0x0140, 0x2001, 0x19cb, 0x2004, 0x9005, + 0x090c, 0x8b8f, 0x0005, 0x7000, 0x908c, 0xff00, 0x9194, 0xf000, + 0x810f, 0x9484, 0x0fff, 0x688e, 0x9286, 0x2000, 0x1150, 0x6800, + 0x9086, 0x0001, 0x1118, 0x080c, 0x5545, 0x0070, 0x080c, 0x7c0c, + 0x0058, 0x9286, 0x3000, 0x1118, 0x080c, 0x7ddb, 0x0028, 0x9286, + 0x8000, 0x1110, 0x080c, 0x7fc2, 0x7817, 0x0140, 0x2001, 0x19cb, + 0x2004, 0x9005, 0x090c, 0x8b8f, 0x0005, 0x2001, 0x1810, 0x2004, + 0xd08c, 0x0178, 0x2001, 0x1800, 0x2004, 0x9086, 0x0003, 0x1148, + 0x0026, 0x0036, 0x2011, 0x8048, 0x2518, 0x080c, 0x4a17, 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, 0x4a17, 0x002e, 0x00fe, + 0x005e, 0x004e, 0x003e, 0x0005, 0x00b6, 0x00c6, 0x7010, 0x9084, + 0xff00, 0x8007, 0x9096, 0x0001, 0x0120, 0x9096, 0x0023, 0x1904, + 0x7dac, 0x9186, 0x0023, 0x15c0, 0x080c, 0x8060, 0x0904, 0x7dac, + 0x6120, 0x9186, 0x0001, 0x0150, 0x9186, 0x0004, 0x0138, 0x9186, + 0x0008, 0x0120, 0x9186, 0x000a, 0x1904, 0x7dac, 0x7124, 0x610a, + 0x7030, 0x908e, 0x0200, 0x1130, 0x2009, 0x0015, 0x080c, 0xa068, + 0x0804, 0x7dac, 0x908e, 0x0214, 0x0118, 0x908e, 0x0210, 0x1130, + 0x2009, 0x0015, 0x080c, 0xa068, 0x0804, 0x7dac, 0x908e, 0x0100, + 0x1904, 0x7dac, 0x7034, 0x9005, 0x1904, 0x7dac, 0x2009, 0x0016, + 0x080c, 0xa068, 0x0804, 0x7dac, 0x9186, 0x0022, 0x1904, 0x7dac, + 0x7030, 0x908e, 0x0300, 0x1580, 0x68d8, 0xd0a4, 0x0528, 0xc0b5, + 0x68da, 0x7100, 0x918c, 0x00ff, 0x697a, 0x7004, 0x687e, 0x00f6, + 0x2079, 0x0100, 0x79e6, 0x78ea, 0x0006, 0x9084, 0x00ff, 0x0016, + 0x2008, 0x080c, 0x26b6, 0x7932, 0x7936, 0x001e, 0x000e, 0x00fe, + 0x080c, 0x266d, 0x695a, 0x703c, 0x00e6, 0x2071, 0x0140, 0x7086, + 0x2071, 0x1800, 0x70b2, 0x00ee, 0x7034, 0x9005, 0x1904, 0x7dac, + 0x2009, 0x0017, 0x0804, 0x7d5c, 0x908e, 0x0400, 0x1190, 0x7034, + 0x9005, 0x1904, 0x7dac, 0x080c, 0x717e, 0x0120, 0x2009, 0x001d, + 0x0804, 0x7d5c, 0x68d8, 0xc0a5, 0x68da, 0x2009, 0x0030, 0x0804, + 0x7d5c, 0x908e, 0x0500, 0x1140, 0x7034, 0x9005, 0x1904, 0x7dac, + 0x2009, 0x0018, 0x0804, 0x7d5c, 0x908e, 0x2010, 0x1120, 0x2009, + 0x0019, 0x0804, 0x7d5c, 0x908e, 0x2110, 0x1120, 0x2009, 0x001a, + 0x0804, 0x7d5c, 0x908e, 0x5200, 0x1140, 0x7034, 0x9005, 0x1904, + 0x7dac, 0x2009, 0x001b, 0x0804, 0x7d5c, 0x908e, 0x5000, 0x1140, + 0x7034, 0x9005, 0x1904, 0x7dac, 0x2009, 0x001c, 0x0804, 0x7d5c, + 0x908e, 0x1300, 0x1120, 0x2009, 0x0034, 0x0804, 0x7d5c, 0x908e, + 0x1200, 0x1140, 0x7034, 0x9005, 0x1904, 0x7dac, 0x2009, 0x0024, + 0x0804, 0x7d5c, 0x908c, 0xff00, 0x918e, 0x2400, 0x1170, 0x2009, + 0x002d, 0x2001, 0x1810, 0x2004, 0xd09c, 0x0904, 0x7d5c, 0x080c, + 0xcb61, 0x1904, 0x7dac, 0x0804, 0x7d5a, 0x908c, 0xff00, 0x918e, + 0x5300, 0x1120, 0x2009, 0x002a, 0x0804, 0x7d5c, 0x908e, 0x0f00, + 0x1120, 0x2009, 0x0020, 0x0804, 0x7d5c, 0x908e, 0x6104, 0x1528, + 0x2029, 0x0205, 0x2011, 0x026d, 0x8208, 0x2204, 0x9082, 0x0004, + 0x8004, 0x8004, 0x20a8, 0x2011, 0x8015, 0x211c, 0x8108, 0x0046, + 0x2124, 0x080c, 0x4a17, 0x004e, 0x8108, 0x0f04, 0x7d28, 0x9186, + 0x0280, 0x1d88, 0x2504, 0x8000, 0x202a, 0x2009, 0x0260, 0x0c58, + 0x202b, 0x0000, 0x2009, 0x0023, 0x0478, 0x908e, 0x6000, 0x1118, + 0x2009, 0x003f, 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, 0x266d, 0x1904, 0x7daf, 0x080c, 0x6343, + 0x1904, 0x7daf, 0xbe12, 0xbd16, 0x001e, 0x0016, 0x080c, 0x717e, + 0x01c0, 0x68d8, 0xd08c, 0x1148, 0x7000, 0x9084, 0x00ff, 0x1188, + 0x7004, 0x9084, 0xff00, 0x1168, 0x0040, 0x6878, 0x9606, 0x1148, + 0x687c, 0x9506, 0x9084, 0xff00, 0x1120, 0x9584, 0x00ff, 0xb8b2, + 0x0080, 0xb8b0, 0x9005, 0x1168, 0x9186, 0x0046, 0x1150, 0x6878, + 0x9606, 0x1138, 0x687c, 0x9506, 0x9084, 0xff00, 0x1110, 0x001e, + 0x0098, 0x080c, 0x9f94, 0x01a8, 0x2b08, 0x6112, 0x6023, 0x0004, + 0x7120, 0x610a, 0x001e, 0x9186, 0x004c, 0x1110, 0x6023, 0x000a, + 0x0016, 0x001e, 0x080c, 0xa068, 0x00ce, 0x00be, 0x0005, 0x001e, + 0x0cd8, 0x2001, 0x180e, 0x2004, 0xd0ec, 0x0120, 0x2011, 0x8049, + 0x080c, 0x4a17, 0x080c, 0xa03b, 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, 0x8640, 0x08a0, 0x080c, 0x8185, 0x1158, 0x080c, 0x31b8, + 0x1140, 0x7010, 0x9084, 0xff00, 0x8007, 0x908e, 0x0008, 0x1108, + 0x0009, 0x0005, 0x00b6, 0x00c6, 0x0046, 0x7000, 0x908c, 0xff00, + 0x810f, 0x9186, 0x0033, 0x11e8, 0x080c, 0x8060, 0x0904, 0x7e3b, + 0x7124, 0x610a, 0x7030, 0x908e, 0x0200, 0x1140, 0x7034, 0x9005, + 0x15d0, 0x2009, 0x0015, 0x080c, 0xa068, 0x04a8, 0x908e, 0x0100, + 0x1590, 0x7034, 0x9005, 0x1578, 0x2009, 0x0016, 0x080c, 0xa068, + 0x0450, 0x9186, 0x0032, 0x1538, 0x7030, 0x908e, 0x1400, 0x1518, + 0x2009, 0x0038, 0x0016, 0x2011, 0x0263, 0x2204, 0x8211, 0x220c, + 0x080c, 0x266d, 0x11b8, 0x080c, 0x6343, 0x11a0, 0xbe12, 0xbd16, + 0x080c, 0x9f94, 0x0178, 0x2b08, 0x6112, 0x080c, 0xc1ca, 0x6023, + 0x0004, 0x7120, 0x610a, 0x001e, 0x080c, 0xa068, 0x080c, 0x8b8f, + 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, 0x7e9d, 0x9596, 0xfffe, 0x1120, 0x2009, 0x007e, 0x0804, + 0x7e9d, 0x9596, 0xfffc, 0x1118, 0x2009, 0x0080, 0x04f0, 0x2011, + 0x0000, 0x2019, 0x1836, 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, 0x7e72, 0x82ff, 0x1118, + 0x9085, 0x0001, 0x0018, 0xc2fc, 0x2208, 0x9006, 0x00de, 0x00ee, + 0x004e, 0x00be, 0x0005, 0x2001, 0x1836, 0x200c, 0x9184, 0x0080, + 0x0110, 0xd18c, 0x0138, 0x7000, 0x908c, 0xff00, 0x810f, 0x9184, + 0x000f, 0x004a, 0x7817, 0x0140, 0x2001, 0x19cb, 0x2004, 0x9005, + 0x090c, 0x8b8f, 0x0005, 0x7ecb, 0x7ecb, 0x7ecb, 0x8072, 0x7ecb, + 0x7ed4, 0x7eff, 0x7f8d, 0x7ecb, 0x7ecb, 0x7ecb, 0x7ecb, 0x7ecb, + 0x7ecb, 0x7ecb, 0x7ecb, 0x7817, 0x0140, 0x2001, 0x19cb, 0x2004, + 0x9005, 0x090c, 0x8b8f, 0x0005, 0x00b6, 0x7110, 0xd1bc, 0x01e8, + 0x7120, 0x2160, 0x9c8c, 0x0007, 0x11c0, 0x9c8a, 0x1cd0, 0x02a8, + 0x6864, 0x9c02, 0x1290, 0x7008, 0x9084, 0x00ff, 0x6110, 0x2158, + 0xb910, 0x9106, 0x1150, 0x700c, 0xb914, 0x9106, 0x1130, 0x7124, + 0x610a, 0x2009, 0x0046, 0x080c, 0xa068, 0x7817, 0x0140, 0x2001, + 0x19cb, 0x2004, 0x9005, 0x090c, 0x8b8f, 0x00be, 0x0005, 0x00b6, + 0x00c6, 0x9484, 0x0fff, 0x0904, 0x7f63, 0x7110, 0xd1bc, 0x1904, + 0x7f63, 0x7108, 0x700c, 0x2028, 0x918c, 0x00ff, 0x2130, 0x9094, + 0xff00, 0x15b0, 0x81ff, 0x15a0, 0x9080, 0x31f3, 0x200d, 0x918c, + 0xff00, 0x810f, 0x2001, 0x0080, 0x9106, 0x0904, 0x7f63, 0x080c, + 0x6343, 0x1904, 0x7f63, 0xbe12, 0xbd16, 0xb800, 0xd0ec, 0x15d8, + 0xba04, 0x9294, 0xff00, 0x9286, 0x0600, 0x11a0, 0x080c, 0x9f94, + 0x05e8, 0x2b08, 0x7028, 0x6046, 0x702c, 0x604a, 0x6112, 0x6023, + 0x0006, 0x7120, 0x610a, 0x7130, 0x6156, 0x2009, 0x0044, 0x080c, + 0xcdd7, 0x0408, 0x080c, 0x66c9, 0x1138, 0xb807, 0x0606, 0x0c30, + 0x190c, 0x7e3f, 0x11c0, 0x0898, 0x080c, 0x9f94, 0x2b08, 0x0198, + 0x6112, 0x6023, 0x0004, 0x7120, 0x610a, 0x9286, 0x0400, 0x1118, + 0x6007, 0x0005, 0x0010, 0x6007, 0x0001, 0x6003, 0x0001, 0x080c, + 0x8640, 0x080c, 0x8b8f, 0x7817, 0x0140, 0x2001, 0x19cb, 0x2004, + 0x9005, 0x090c, 0x8b8f, 0x00ce, 0x00be, 0x0005, 0x2001, 0x180e, + 0x2004, 0xd0ec, 0x0120, 0x2011, 0x8049, 0x080c, 0x4a17, 0x080c, + 0xa03b, 0x0d48, 0x2b08, 0x6112, 0x6023, 0x0006, 0x7120, 0x610a, + 0x7130, 0x6156, 0x6017, 0xf300, 0x6003, 0x0001, 0x6007, 0x0041, + 0x080c, 0x85f8, 0x080c, 0x8b8f, 0x08b0, 0x00b6, 0x7110, 0xd1bc, + 0x01e8, 0x7020, 0x2060, 0x9c84, 0x0007, 0x11c0, 0x9c82, 0x1cd0, 0x02a8, 0x6864, 0x9c02, 0x1290, 0x7008, 0x9084, 0x00ff, 0x6110, 0x2158, 0xb910, 0x9106, 0x1150, 0x700c, 0xb914, 0x9106, 0x1130, - 0x7124, 0x610a, 0x2009, 0x0046, 0x080c, 0xa15d, 0x7817, 0x0140, - 0x2001, 0x19c8, 0x2004, 0x9005, 0x090c, 0x8c10, 0x00be, 0x0005, - 0x00b6, 0x00c6, 0x9484, 0x0fff, 0x0904, 0x7fe4, 0x7110, 0xd1bc, - 0x1904, 0x7fe4, 0x7108, 0x700c, 0x2028, 0x918c, 0x00ff, 0x2130, - 0x9094, 0xff00, 0x15b0, 0x81ff, 0x15a0, 0x9080, 0x32e9, 0x200d, - 0x918c, 0xff00, 0x810f, 0x2001, 0x0080, 0x9106, 0x0904, 0x7fe4, - 0x080c, 0x643f, 0x1904, 0x7fe4, 0xbe12, 0xbd16, 0xb800, 0xd0ec, - 0x15d8, 0xba04, 0x9294, 0xff00, 0x9286, 0x0600, 0x11a0, 0x080c, - 0xa08d, 0x05e8, 0x2b08, 0x7028, 0x6046, 0x702c, 0x604a, 0x6112, - 0x6023, 0x0006, 0x7120, 0x610a, 0x7130, 0x6156, 0x2009, 0x0044, - 0x080c, 0xce65, 0x0408, 0x080c, 0x67c3, 0x1138, 0xb807, 0x0606, - 0x0c30, 0x190c, 0x7ec0, 0x11c0, 0x0898, 0x080c, 0xa08d, 0x2b08, - 0x0198, 0x6112, 0x6023, 0x0004, 0x7120, 0x610a, 0x9286, 0x0400, - 0x1118, 0x6007, 0x0005, 0x0010, 0x6007, 0x0001, 0x6003, 0x0001, - 0x080c, 0x86c1, 0x080c, 0x8c10, 0x7817, 0x0140, 0x2001, 0x19c8, - 0x2004, 0x9005, 0x090c, 0x8c10, 0x00ce, 0x00be, 0x0005, 0x2001, - 0x180e, 0x2004, 0xd0ec, 0x0120, 0x2011, 0x8049, 0x080c, 0x4b1f, - 0x080c, 0xa130, 0x0d48, 0x2b08, 0x6112, 0x6023, 0x0006, 0x7120, - 0x610a, 0x7130, 0x6156, 0x6017, 0xf300, 0x6003, 0x0001, 0x6007, - 0x0041, 0x080c, 0x8679, 0x080c, 0x8c10, 0x08b0, 0x00b6, 0x7110, - 0xd1bc, 0x01e8, 0x7020, 0x2060, 0x9c84, 0x0007, 0x11c0, 0x9c82, - 0x1cd0, 0x02a8, 0x6864, 0x9c02, 0x1290, 0x7008, 0x9084, 0x00ff, - 0x6110, 0x2158, 0xb910, 0x9106, 0x1150, 0x700c, 0xb914, 0x9106, - 0x1130, 0x7124, 0x610a, 0x2009, 0x0045, 0x080c, 0xa15d, 0x7817, - 0x0140, 0x2001, 0x19c8, 0x2004, 0x9005, 0x090c, 0x8c10, 0x00be, - 0x0005, 0x6120, 0x9186, 0x0002, 0x0128, 0x9186, 0x0005, 0x0110, - 0x9085, 0x0001, 0x0005, 0x080c, 0x8206, 0x1180, 0x080c, 0x32ae, - 0x1168, 0x7010, 0x9084, 0xff00, 0x8007, 0x9086, 0x0000, 0x1130, - 0x9184, 0x000f, 0x908a, 0x0006, 0x1208, 0x000b, 0x0005, 0x805d, - 0x805e, 0x805d, 0x805d, 0x80c3, 0x80d2, 0x0005, 0x00b6, 0x700c, - 0x7108, 0x080c, 0x276e, 0x1904, 0x80c1, 0x080c, 0x643f, 0x1904, - 0x80c1, 0xbe12, 0xbd16, 0x7110, 0xd1bc, 0x0540, 0x702c, 0xd084, - 0x1120, 0xb800, 0xd0bc, 0x1904, 0x80c1, 0x080c, 0x67c3, 0x0148, - 0x9086, 0x0004, 0x0130, 0x080c, 0x67cb, 0x0118, 0x9086, 0x0004, - 0x1588, 0x00c6, 0x080c, 0x80e1, 0x00ce, 0x05d8, 0x080c, 0xa08d, - 0x2b08, 0x05b8, 0x6112, 0x080c, 0xc2b3, 0x6023, 0x0002, 0x7120, - 0x610a, 0x2009, 0x0088, 0x080c, 0xa15d, 0x0458, 0x080c, 0x67c3, - 0x0148, 0x9086, 0x0004, 0x0130, 0x080c, 0x67cb, 0x0118, 0x9086, - 0x0004, 0x1180, 0x080c, 0xa08d, 0x2b08, 0x01d8, 0x6112, 0x080c, - 0xc2b3, 0x6023, 0x0005, 0x7120, 0x610a, 0x2009, 0x0088, 0x080c, - 0xa15d, 0x0078, 0x080c, 0xa08d, 0x2b08, 0x0158, 0x6112, 0x080c, - 0xc2b3, 0x6023, 0x0004, 0x7120, 0x610a, 0x2009, 0x0001, 0x080c, - 0xa15d, 0x00be, 0x0005, 0x7110, 0xd1bc, 0x0158, 0x00d1, 0x0148, - 0x080c, 0x8039, 0x1130, 0x7124, 0x610a, 0x2009, 0x0089, 0x080c, - 0xa15d, 0x0005, 0x7110, 0xd1bc, 0x0158, 0x0059, 0x0148, 0x080c, - 0x8039, 0x1130, 0x7124, 0x610a, 0x2009, 0x008a, 0x080c, 0xa15d, - 0x0005, 0x7020, 0x2060, 0x9c84, 0x0007, 0x1158, 0x9c82, 0x1cd0, - 0x0240, 0x2001, 0x1819, 0x2004, 0x9c02, 0x1218, 0x9085, 0x0001, - 0x0005, 0x9006, 0x0ce8, 0x00b6, 0x7110, 0xd1bc, 0x11d8, 0x7024, - 0x2060, 0x9c84, 0x0007, 0x11b0, 0x9c82, 0x1cd0, 0x0298, 0x6864, - 0x9c02, 0x1280, 0x7008, 0x9084, 0x00ff, 0x6110, 0x2158, 0xb910, - 0x9106, 0x1140, 0x700c, 0xb914, 0x9106, 0x1120, 0x2009, 0x0051, - 0x080c, 0xa15d, 0x7817, 0x0140, 0x2001, 0x19c8, 0x2004, 0x9005, - 0x090c, 0x8c10, 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, 0xa08d, 0x05b8, - 0x0066, 0x00c6, 0x0046, 0x2011, 0x0263, 0x2204, 0x8211, 0x220c, - 0x080c, 0x276e, 0x15a0, 0x080c, 0x643f, 0x1588, 0xbe12, 0xbd16, - 0x2b00, 0x004e, 0x00ce, 0x6012, 0x080c, 0xc2b3, 0x080c, 0x1031, - 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, 0x86c1, 0x080c, 0x8c10, 0x00fe, - 0x009e, 0x00ce, 0x0005, 0x080c, 0xa0e3, 0x006e, 0x0cc0, 0x004e, - 0x00ce, 0x0cc8, 0x00c6, 0x7000, 0x908c, 0xff00, 0x9184, 0xf000, - 0x810f, 0x9086, 0x2000, 0x1904, 0x81d1, 0x9186, 0x0022, 0x15f0, - 0x2001, 0x0111, 0x2004, 0x9005, 0x1904, 0x81d3, 0x7030, 0x908e, - 0x0400, 0x0904, 0x81d3, 0x908e, 0x6000, 0x05e8, 0x908e, 0x5400, - 0x05d0, 0x908e, 0x0300, 0x11d8, 0x2009, 0x1836, 0x210c, 0xd18c, - 0x1590, 0xd1a4, 0x1580, 0x080c, 0x6781, 0x0588, 0x68ac, 0x9084, - 0x00ff, 0x7100, 0x918c, 0x00ff, 0x9106, 0x1518, 0x687c, 0x69ac, - 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, 0x80e1, 0x0128, 0x6004, 0x9086, 0x0002, 0x0118, - 0x0000, 0x9006, 0x0010, 0x9085, 0x0001, 0x00ce, 0x0005, 0x7030, - 0x908e, 0x0300, 0x0118, 0x908e, 0x5200, 0x1d98, 0x2001, 0x1836, - 0x2004, 0x9084, 0x0009, 0x9086, 0x0008, 0x0d68, 0x0c50, 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, - 0x1836, 0x200c, 0x9184, 0x0080, 0x0118, 0xd18c, 0x0118, 0x9006, - 0x001e, 0x0005, 0x9085, 0x0001, 0x0cd8, 0x2071, 0x19d2, 0x7003, - 0x0003, 0x700f, 0x0361, 0x9006, 0x701a, 0x7072, 0x7012, 0x7017, - 0x1cd0, 0x7007, 0x0000, 0x7026, 0x702b, 0x966c, 0x7032, 0x7037, - 0x96d4, 0x703f, 0xffff, 0x7042, 0x7047, 0x546d, 0x704a, 0x705b, - 0x8375, 0x080c, 0x104a, 0x090c, 0x0dfa, 0x2900, 0x703a, 0xa867, - 0x0003, 0xa86f, 0x0100, 0xa8ab, 0xdcb0, 0x0005, 0x2071, 0x19d2, - 0x1d04, 0x82c9, 0x2091, 0x6000, 0x700c, 0x8001, 0x700e, 0x1510, - 0x2001, 0x187d, 0x2004, 0xd0c4, 0x0158, 0x3a00, 0xd08c, 0x1140, - 0x20d1, 0x0000, 0x20d1, 0x0001, 0x20d1, 0x0000, 0x080c, 0x0dfa, - 0x700f, 0x0361, 0x7007, 0x0001, 0x0126, 0x2091, 0x8000, 0x080c, - 0x83ba, 0x7040, 0x900d, 0x0148, 0x8109, 0x7142, 0x1130, 0x7044, - 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, - 0x9802, 0x0010, 0x7034, 0x080f, 0x703c, 0x9005, 0x0118, 0x0310, - 0x8001, 0x703e, 0x704c, 0x900d, 0x0168, 0x7048, 0x8001, 0x704a, - 0x1148, 0x704b, 0x0009, 0x8109, 0x714e, 0x1120, 0x7150, 0x714e, - 0x7058, 0x080f, 0x7018, 0x900d, 0x01d8, 0x0016, 0x7070, 0x900d, - 0x0158, 0x706c, 0x8001, 0x706e, 0x1138, 0x706f, 0x0009, 0x8109, - 0x7172, 0x1110, 0x7074, 0x080f, 0x001e, 0x7008, 0x8001, 0x700a, - 0x1138, 0x700b, 0x0009, 0x8109, 0x711a, 0x1110, 0x701c, 0x080f, - 0x012e, 0x7004, 0x0002, 0x82f1, 0x82f2, 0x830e, 0x00e6, 0x2071, - 0x19d2, 0x7018, 0x9005, 0x1120, 0x711a, 0x721e, 0x700b, 0x0009, - 0x00ee, 0x0005, 0x00e6, 0x0006, 0x2071, 0x19d2, 0x701c, 0x9206, - 0x1120, 0x701a, 0x701e, 0x7072, 0x7076, 0x000e, 0x00ee, 0x0005, - 0x00e6, 0x2071, 0x19d2, 0xb888, 0x9102, 0x0208, 0xb98a, 0x00ee, - 0x0005, 0x0005, 0x00b6, 0x7110, 0x080c, 0x649f, 0x1168, 0xb888, - 0x8001, 0x0250, 0xb88a, 0x1140, 0x0126, 0x2091, 0x8000, 0x0016, - 0x080c, 0x8c10, 0x001e, 0x012e, 0x8108, 0x9182, 0x0800, 0x0218, - 0x900e, 0x7007, 0x0002, 0x7112, 0x00be, 0x0005, 0x7014, 0x2060, - 0x0126, 0x2091, 0x8000, 0x6040, 0x9005, 0x0128, 0x8001, 0x6042, - 0x1110, 0x080c, 0xc144, 0x6018, 0x9005, 0x0528, 0x8001, 0x601a, - 0x1510, 0x6120, 0x9186, 0x0003, 0x0118, 0x9186, 0x0006, 0x11c8, - 0x080c, 0xbe37, 0x01b0, 0x6014, 0x2048, 0xa884, 0x908a, 0x199a, - 0x0280, 0x9082, 0x1999, 0xa886, 0x908a, 0x199a, 0x0210, 0x2001, - 0x1999, 0x8003, 0x800b, 0x810b, 0x9108, 0x611a, 0xa87c, 0xd0e4, - 0x0110, 0x080c, 0xbb23, 0x012e, 0x9c88, 0x0018, 0x7116, 0x2001, - 0x1819, 0x2004, 0x9102, 0x0220, 0x7017, 0x1cd0, 0x7007, 0x0000, - 0x0005, 0x00e6, 0x2071, 0x19d2, 0x7027, 0x07d0, 0x7023, 0x0009, - 0x00ee, 0x0005, 0x2001, 0x19db, 0x2003, 0x0000, 0x0005, 0x00e6, - 0x2071, 0x19d2, 0x7132, 0x702f, 0x0009, 0x00ee, 0x0005, 0x2011, - 0x19de, 0x2013, 0x0000, 0x0005, 0x00e6, 0x2071, 0x19d2, 0x711a, - 0x721e, 0x700b, 0x0009, 0x00ee, 0x0005, 0x0086, 0x0026, 0x7054, - 0x8000, 0x7056, 0x2001, 0x19e0, 0x2044, 0xa06c, 0x9086, 0x0000, - 0x0150, 0x7068, 0xa09a, 0x7064, 0xa096, 0x7060, 0xa092, 0x705c, - 0xa08e, 0x080c, 0x112e, 0x002e, 0x008e, 0x0005, 0x0006, 0x0016, - 0x0096, 0x00a6, 0x00b6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x0156, - 0x080c, 0x823e, 0x015e, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, - 0x00ae, 0x009e, 0x001e, 0x000e, 0x0005, 0x00e6, 0x2071, 0x19d2, - 0x7172, 0x7276, 0x706f, 0x0009, 0x00ee, 0x0005, 0x00e6, 0x0006, - 0x2071, 0x19d2, 0x7074, 0x9206, 0x1110, 0x7072, 0x7076, 0x000e, - 0x00ee, 0x0005, 0x2069, 0x1800, 0x69e4, 0xd1e4, 0x1518, 0x0026, - 0xd1ec, 0x0140, 0x6a50, 0x6870, 0x9202, 0x0288, 0x8117, 0x9294, - 0x00c0, 0x0088, 0x9184, 0x0007, 0x01a0, 0x8109, 0x9184, 0x0007, - 0x0110, 0x69e6, 0x0070, 0x8107, 0x9084, 0x0007, 0x910d, 0x8107, - 0x9106, 0x9094, 0x00c0, 0x9184, 0xff3f, 0x9205, 0x68e6, 0x080c, - 0x0f11, 0x002e, 0x0005, 0x00c6, 0x2061, 0x1a48, 0x00ce, 0x0005, - 0x9184, 0x000f, 0x8003, 0x8003, 0x8003, 0x9080, 0x1a48, 0x2060, - 0x0005, 0xa884, 0x908a, 0x199a, 0x1638, 0x9005, 0x1150, 0x00c6, - 0x2061, 0x1a48, 0x6014, 0x00ce, 0x9005, 0x1130, 0x2001, 0x001e, - 0x0018, 0x908e, 0xffff, 0x01b0, 0x8003, 0x800b, 0x810b, 0x9108, - 0x611a, 0xa87c, 0x908c, 0x00c0, 0x918e, 0x00c0, 0x0904, 0x847b, - 0xd0b4, 0x1168, 0xd0bc, 0x1904, 0x8454, 0x2009, 0x0006, 0x080c, - 0x84a8, 0x0005, 0x900e, 0x0c60, 0x2001, 0x1999, 0x08b0, 0xd0fc, - 0x0160, 0x908c, 0x0003, 0x0120, 0x918e, 0x0003, 0x1904, 0x84a2, - 0x908c, 0x2020, 0x918e, 0x2020, 0x01a8, 0x6024, 0xd0d4, 0x11e8, - 0x2009, 0x187d, 0x2104, 0xd084, 0x1138, 0x87ff, 0x1120, 0x2009, - 0x0043, 0x0804, 0xa15d, 0x0005, 0x87ff, 0x1de8, 0x2009, 0x0042, - 0x0804, 0xa15d, 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, 0x84a2, 0x908c, 0x2020, 0x918e, - 0x2020, 0x0170, 0x0076, 0x00f6, 0x2c78, 0x080c, 0x16db, 0x00fe, - 0x007e, 0x87ff, 0x1120, 0x2009, 0x0042, 0x080c, 0xa15d, 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, 0xa15d, 0x0005, 0x00b9, 0x0ce8, - 0x87ff, 0x1dd8, 0x2009, 0x0043, 0x080c, 0xa15d, 0x0cb0, 0x6110, - 0x00b6, 0x2158, 0xb900, 0x00be, 0xd1ac, 0x0d20, 0x6124, 0xc1cd, - 0x6126, 0x0c00, 0x2009, 0x0004, 0x0019, 0x0005, 0x2009, 0x0001, - 0x0096, 0x080c, 0xbe37, 0x0518, 0x6014, 0x2048, 0xa982, 0xa800, - 0x6016, 0x9186, 0x0001, 0x1188, 0xa97c, 0x918c, 0x8100, 0x918e, - 0x8100, 0x1158, 0x00c6, 0x2061, 0x1a48, 0x6200, 0xd28c, 0x1120, - 0x6204, 0x8210, 0x0208, 0x6206, 0x00ce, 0x080c, 0x6923, 0x6014, - 0x904d, 0x0076, 0x2039, 0x0000, 0x190c, 0x83f1, 0x007e, 0x009e, - 0x0005, 0x0156, 0x00c6, 0x2061, 0x1a48, 0x6000, 0x81ff, 0x0110, - 0x9205, 0x0008, 0x9204, 0x6002, 0x00ce, 0x015e, 0x0005, 0x6800, - 0xd08c, 0x1138, 0x6808, 0x9005, 0x0120, 0x8001, 0x680a, 0x9085, - 0x0001, 0x0005, 0x0126, 0x2091, 0x8000, 0x0036, 0x0046, 0x20a9, - 0x0010, 0x9006, 0x8004, 0x8086, 0x818e, 0x1208, 0x9200, 0x1f04, - 0x84f3, 0x8086, 0x818e, 0x004e, 0x003e, 0x012e, 0x0005, 0x0126, - 0x2091, 0x8000, 0x0076, 0x0156, 0x20a9, 0x0010, 0x9005, 0x01c8, - 0x911a, 0x12b8, 0x8213, 0x818d, 0x0228, 0x911a, 0x1220, 0x1f04, - 0x850a, 0x0028, 0x911a, 0x2308, 0x8210, 0x1f04, 0x850a, 0x0006, - 0x3200, 0x9084, 0xefff, 0x2080, 0x000e, 0x015e, 0x007e, 0x012e, - 0x0005, 0x0006, 0x3200, 0x9085, 0x1000, 0x0ca8, 0x0126, 0x2091, - 0x2800, 0x2079, 0x19bf, 0x012e, 0x00d6, 0x2069, 0x19bf, 0x6803, - 0x0005, 0x0156, 0x0146, 0x01d6, 0x20e9, 0x0000, 0x2069, 0x0200, - 0x080c, 0x9eeb, 0x0401, 0x080c, 0x9ed6, 0x00e9, 0x080c, 0x9ed9, - 0x00d1, 0x080c, 0x9edc, 0x00b9, 0x080c, 0x9edf, 0x00a1, 0x080c, - 0x9ee2, 0x0089, 0x080c, 0x9ee5, 0x0071, 0x080c, 0x9ee8, 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, 0x8574, 0x8598, 0x85d9, 0x857a, 0x8598, 0x8574, - 0x8572, 0x8572, 0x080c, 0x0dfa, 0x080c, 0x835a, 0x080c, 0x8c10, - 0x00ce, 0x0005, 0x62c0, 0x82ff, 0x1110, 0x00ce, 0x0005, 0x2011, - 0x5d94, 0x080c, 0x82da, 0x7828, 0x9092, 0x00c8, 0x1228, 0x8000, - 0x782a, 0x080c, 0x5dd4, 0x0c88, 0x62c0, 0x080c, 0x9eef, 0x080c, - 0x5d94, 0x7807, 0x0003, 0x7827, 0x0000, 0x782b, 0x0000, 0x0c28, - 0x080c, 0x835a, 0x6220, 0xd2a4, 0x0170, 0xd2cc, 0x0160, 0x782b, - 0x0000, 0x7824, 0x9065, 0x090c, 0x0dfa, 0x2009, 0x0013, 0x080c, - 0xa15d, 0x00ce, 0x0005, 0x00c6, 0x7824, 0x9065, 0x090c, 0x0dfa, - 0x7828, 0x9092, 0xc350, 0x12c0, 0x8000, 0x782a, 0x00ce, 0x080c, - 0x2afe, 0x0278, 0x00c6, 0x7924, 0x2160, 0x6010, 0x906d, 0x090c, - 0x0dfa, 0x7807, 0x0000, 0x7827, 0x0000, 0x00ce, 0x080c, 0x8c10, - 0x0c00, 0x080c, 0x9632, 0x08e8, 0x2011, 0x0130, 0x2214, 0x080c, - 0x9eef, 0x080c, 0xdc28, 0x2009, 0x0014, 0x080c, 0xa15d, 0x00ce, - 0x0880, 0x2001, 0x19db, 0x2003, 0x0000, 0x62c0, 0x82ff, 0x1160, - 0x782b, 0x0000, 0x7824, 0x9065, 0x090c, 0x0dfa, 0x2009, 0x0013, - 0x080c, 0xa1af, 0x00ce, 0x0005, 0x00b6, 0x00c6, 0x00d6, 0x7824, - 0x9005, 0x090c, 0x0dfa, 0x7828, 0x9092, 0xc350, 0x1648, 0x8000, - 0x782a, 0x00de, 0x00ce, 0x00be, 0x080c, 0x2afe, 0x02f0, 0x00b6, - 0x00c6, 0x00d6, 0x781c, 0x905d, 0x090c, 0x0dfa, 0xb800, 0xc0dc, - 0xb802, 0x7924, 0x2160, 0x080c, 0xa0e3, 0xb93c, 0x81ff, 0x090c, - 0x0dfa, 0x8109, 0xb93e, 0x7807, 0x0000, 0x7827, 0x0000, 0x00de, - 0x00ce, 0x00be, 0x080c, 0x8c10, 0x0868, 0x080c, 0x9632, 0x0850, - 0x2011, 0x0130, 0x2214, 0x080c, 0x9eef, 0x080c, 0xdc28, 0x7824, - 0x9065, 0x2009, 0x0014, 0x080c, 0xa15d, 0x00de, 0x00ce, 0x00be, - 0x0804, 0x85ea, 0x00c6, 0x2001, 0x009b, 0x2004, 0xd0fc, 0x190c, - 0x1dec, 0x6024, 0x6027, 0x0002, 0xd0f4, 0x1580, 0x62c8, 0x60c4, - 0x9205, 0x1170, 0x783c, 0x9065, 0x0130, 0x2009, 0x0049, 0x080c, - 0xa15d, 0x00ce, 0x0005, 0x2011, 0x19de, 0x2013, 0x0000, 0x0cc8, - 0x793c, 0x81ff, 0x0dc0, 0x7944, 0x9192, 0x7530, 0x12f0, 0x8108, - 0x7946, 0x793c, 0x9188, 0x0008, 0x210c, 0x918e, 0x0006, 0x1138, - 0x6014, 0x9084, 0x1984, 0x9085, 0x0012, 0x6016, 0x0c10, 0x6014, - 0x9084, 0x1984, 0x9085, 0x0016, 0x6016, 0x08d8, 0x793c, 0x2160, - 0x2009, 0x004a, 0x080c, 0xa15d, 0x08a0, 0x7848, 0xc085, 0x784a, - 0x0880, 0x0006, 0x0016, 0x00c6, 0x0126, 0x2091, 0x8000, 0x600f, - 0x0000, 0x2c08, 0x2061, 0x19bf, 0x6020, 0x8000, 0x6022, 0x6010, - 0x9005, 0x0148, 0x9080, 0x0003, 0x2102, 0x6112, 0x012e, 0x00ce, - 0x001e, 0x000e, 0x0005, 0x6116, 0x6112, 0x0cc0, 0x00d6, 0x2069, - 0x19bf, 0xb800, 0xd0d4, 0x0168, 0x6820, 0x8000, 0x6822, 0x9086, - 0x0001, 0x1110, 0x2b00, 0x681e, 0x00de, 0x0804, 0x8c10, 0x00de, - 0x0005, 0xc0d5, 0xb802, 0x6818, 0x9005, 0x0168, 0xb856, 0xb85b, - 0x0000, 0x0086, 0x0006, 0x2b00, 0x681a, 0x008e, 0xa05a, 0x008e, - 0x2069, 0x19bf, 0x0c08, 0xb856, 0xb85a, 0x2b00, 0x681a, 0x681e, - 0x08d8, 0x0006, 0x0016, 0x00c6, 0x0126, 0x2091, 0x8000, 0x600f, - 0x0000, 0x2c08, 0x2061, 0x19bf, 0x6020, 0x8000, 0x6022, 0x6008, - 0x9005, 0x0148, 0x9080, 0x0003, 0x2102, 0x610a, 0x012e, 0x00ce, - 0x001e, 0x000e, 0x0005, 0x610e, 0x610a, 0x0cc0, 0x00c6, 0x600f, - 0x0000, 0x2c08, 0x2061, 0x19bf, 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, 0x19bf, 0x7638, 0x2660, 0x2678, 0x2091, 0x8000, 0x8cff, - 0x0904, 0x876d, 0x6010, 0x2058, 0xb8a0, 0x9206, 0x1904, 0x8768, - 0x87ff, 0x0120, 0x6054, 0x9106, 0x1904, 0x8768, 0x703c, 0x9c06, - 0x1178, 0x0036, 0x2019, 0x0001, 0x080c, 0x999d, 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, 0xbe37, 0x01f0, 0x6014, 0x2048, 0x6020, - 0x9086, 0x0003, 0x15b8, 0x6004, 0x9086, 0x0040, 0x090c, 0x9b78, - 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x0016, 0x0036, 0x0076, - 0x080c, 0xc12d, 0x080c, 0xdb2e, 0x080c, 0x6ae9, 0x007e, 0x003e, - 0x001e, 0x080c, 0xc022, 0x080c, 0xa113, 0x00ce, 0x0804, 0x8707, - 0x2c78, 0x600c, 0x2060, 0x0804, 0x8707, 0x85ff, 0x0120, 0x0036, - 0x080c, 0x8ced, 0x003e, 0x012e, 0x000e, 0x001e, 0x002e, 0x003e, - 0x005e, 0x006e, 0x007e, 0x009e, 0x00be, 0x00ce, 0x00de, 0x00ee, - 0x00fe, 0x0005, 0x6020, 0x9086, 0x0006, 0x1158, 0x0016, 0x0036, - 0x0076, 0x080c, 0xdb2e, 0x080c, 0xd830, 0x007e, 0x003e, 0x001e, - 0x0890, 0x6020, 0x9086, 0x000a, 0x0904, 0x8752, 0x0804, 0x874b, - 0x0006, 0x0066, 0x0096, 0x00c6, 0x00d6, 0x00f6, 0x9036, 0x0126, - 0x2091, 0x8000, 0x2079, 0x19bf, 0x7838, 0x9065, 0x0904, 0x87ed, - 0x600c, 0x0006, 0x600f, 0x0000, 0x783c, 0x9c06, 0x1168, 0x0036, - 0x2019, 0x0001, 0x080c, 0x999d, 0x7833, 0x0000, 0x901e, 0x7b3e, - 0x7b42, 0x7b46, 0x7b4a, 0x003e, 0x080c, 0xbe37, 0x0548, 0x6014, - 0x2048, 0x6020, 0x9086, 0x0003, 0x1590, 0x3e08, 0x918e, 0x0002, - 0x1188, 0x6010, 0x9005, 0x0170, 0x00b6, 0x2058, 0xb800, 0x00be, - 0xd0bc, 0x0140, 0x6040, 0x9005, 0x11a8, 0x2001, 0x1960, 0x2004, - 0x6042, 0x0080, 0x6004, 0x9086, 0x0040, 0x090c, 0x9b78, 0xa867, - 0x0103, 0xab7a, 0xa877, 0x0000, 0x080c, 0x6adc, 0x080c, 0xc022, - 0x080c, 0xa113, 0x000e, 0x0804, 0x87a5, 0x7e3a, 0x7e36, 0x012e, - 0x00fe, 0x00de, 0x00ce, 0x009e, 0x006e, 0x000e, 0x0005, 0x6020, - 0x9086, 0x0006, 0x1118, 0x080c, 0xd830, 0x0c50, 0x6020, 0x9086, - 0x000a, 0x09f8, 0x08b8, 0x0016, 0x0026, 0x0086, 0x9046, 0x0099, - 0x080c, 0x88ee, 0x008e, 0x002e, 0x001e, 0x0005, 0x00f6, 0x0126, - 0x2079, 0x19bf, 0x2091, 0x8000, 0x080c, 0x8985, 0x080c, 0x8a15, - 0x012e, 0x00fe, 0x0005, 0x00b6, 0x0096, 0x00f6, 0x00e6, 0x00d6, - 0x00c6, 0x0066, 0x0016, 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, - 0x19bf, 0x7614, 0x2660, 0x2678, 0x8cff, 0x0904, 0x88b3, 0x6010, - 0x2058, 0xb8a0, 0x9206, 0x1904, 0x88ae, 0x88ff, 0x0120, 0x6054, - 0x9106, 0x1904, 0x88ae, 0x7024, 0x9c06, 0x1568, 0x2069, 0x0100, - 0x6820, 0xd0a4, 0x0110, 0xd0cc, 0x1508, 0x080c, 0x835a, 0x080c, - 0x9656, 0x68c3, 0x0000, 0x080c, 0x9b78, 0x7027, 0x0000, 0x0036, - 0x2069, 0x0140, 0x6b04, 0x9384, 0x1000, 0x0138, 0x2001, 0x0100, - 0x080c, 0x2c88, 0x9006, 0x080c, 0x2c88, 0x2069, 0x0100, 0x6824, - 0xd084, 0x0110, 0x6827, 0x0001, 0x003e, 0x0028, 0x6003, 0x0009, - 0x630a, 0x0804, 0x88ae, 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, - 0xbe37, 0x01e8, 0x6020, 0x9086, 0x0003, 0x1580, 0x080c, 0xc03f, - 0x1118, 0x080c, 0xaa81, 0x0098, 0xa867, 0x0103, 0xab7a, 0xa877, - 0x0000, 0x0016, 0x0036, 0x0086, 0x080c, 0xc12d, 0x080c, 0xdb2e, - 0x080c, 0x6ae9, 0x008e, 0x003e, 0x001e, 0x080c, 0xc022, 0x080c, - 0xa113, 0x080c, 0x9a4e, 0x00ce, 0x0804, 0x882c, 0x2c78, 0x600c, - 0x2060, 0x0804, 0x882c, 0x012e, 0x000e, 0x001e, 0x006e, 0x00ce, - 0x00de, 0x00ee, 0x00fe, 0x009e, 0x00be, 0x0005, 0x6020, 0x9086, - 0x0006, 0x1158, 0x0016, 0x0036, 0x0086, 0x080c, 0xdb2e, 0x080c, - 0xd830, 0x008e, 0x003e, 0x001e, 0x08d0, 0x080c, 0xaa81, 0x6020, - 0x9086, 0x0002, 0x1160, 0x6004, 0x0006, 0x9086, 0x0085, 0x000e, - 0x0904, 0x8894, 0x9086, 0x008b, 0x0904, 0x8894, 0x0840, 0x6020, - 0x9086, 0x0005, 0x1920, 0x6004, 0x0006, 0x9086, 0x0085, 0x000e, - 0x09c8, 0x9086, 0x008b, 0x09b0, 0x0804, 0x88a7, 0x00b6, 0x00a6, - 0x0096, 0x00c6, 0x0006, 0x0126, 0x2091, 0x8000, 0x9280, 0x1000, - 0x2004, 0x905d, 0x0904, 0x897e, 0x00f6, 0x00e6, 0x00d6, 0x0066, - 0x2071, 0x19bf, 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, 0x63d2, 0x0904, 0x897a, 0x7624, 0x86ff, 0x0904, - 0x8969, 0x9680, 0x0005, 0x2004, 0x9906, 0x15d8, 0x00d6, 0x2069, - 0x0100, 0x68c0, 0x9005, 0x0560, 0x080c, 0x835a, 0x080c, 0x9656, - 0x68c3, 0x0000, 0x080c, 0x9b78, 0x7027, 0x0000, 0x0036, 0x2069, + 0x7124, 0x610a, 0x2009, 0x0045, 0x080c, 0xa068, 0x7817, 0x0140, + 0x2001, 0x19cb, 0x2004, 0x9005, 0x090c, 0x8b8f, 0x00be, 0x0005, + 0x6120, 0x9186, 0x0002, 0x0128, 0x9186, 0x0005, 0x0110, 0x9085, + 0x0001, 0x0005, 0x080c, 0x8185, 0x1180, 0x080c, 0x31b8, 0x1168, + 0x7010, 0x9084, 0xff00, 0x8007, 0x9086, 0x0000, 0x1130, 0x9184, + 0x000f, 0x908a, 0x0006, 0x1208, 0x000b, 0x0005, 0x7fdc, 0x7fdd, + 0x7fdc, 0x7fdc, 0x8042, 0x8051, 0x0005, 0x00b6, 0x700c, 0x7108, + 0x080c, 0x266d, 0x1904, 0x8040, 0x080c, 0x6343, 0x1904, 0x8040, + 0xbe12, 0xbd16, 0x7110, 0xd1bc, 0x0540, 0x702c, 0xd084, 0x1120, + 0xb800, 0xd0bc, 0x1904, 0x8040, 0x080c, 0x66c9, 0x0148, 0x9086, + 0x0004, 0x0130, 0x080c, 0x66d1, 0x0118, 0x9086, 0x0004, 0x1588, + 0x00c6, 0x080c, 0x8060, 0x00ce, 0x05d8, 0x080c, 0x9f94, 0x2b08, + 0x05b8, 0x6112, 0x080c, 0xc1ca, 0x6023, 0x0002, 0x7120, 0x610a, + 0x2009, 0x0088, 0x080c, 0xa068, 0x0458, 0x080c, 0x66c9, 0x0148, + 0x9086, 0x0004, 0x0130, 0x080c, 0x66d1, 0x0118, 0x9086, 0x0004, + 0x1180, 0x080c, 0x9f94, 0x2b08, 0x01d8, 0x6112, 0x080c, 0xc1ca, + 0x6023, 0x0005, 0x7120, 0x610a, 0x2009, 0x0088, 0x080c, 0xa068, + 0x0078, 0x080c, 0x9f94, 0x2b08, 0x0158, 0x6112, 0x080c, 0xc1ca, + 0x6023, 0x0004, 0x7120, 0x610a, 0x2009, 0x0001, 0x080c, 0xa068, + 0x00be, 0x0005, 0x7110, 0xd1bc, 0x0158, 0x00d1, 0x0148, 0x080c, + 0x7fb8, 0x1130, 0x7124, 0x610a, 0x2009, 0x0089, 0x080c, 0xa068, + 0x0005, 0x7110, 0xd1bc, 0x0158, 0x0059, 0x0148, 0x080c, 0x7fb8, + 0x1130, 0x7124, 0x610a, 0x2009, 0x008a, 0x080c, 0xa068, 0x0005, + 0x7020, 0x2060, 0x9c84, 0x0007, 0x1158, 0x9c82, 0x1cd0, 0x0240, + 0x2001, 0x1819, 0x2004, 0x9c02, 0x1218, 0x9085, 0x0001, 0x0005, + 0x9006, 0x0ce8, 0x00b6, 0x7110, 0xd1bc, 0x11d8, 0x7024, 0x2060, + 0x9c84, 0x0007, 0x11b0, 0x9c82, 0x1cd0, 0x0298, 0x6864, 0x9c02, + 0x1280, 0x7008, 0x9084, 0x00ff, 0x6110, 0x2158, 0xb910, 0x9106, + 0x1140, 0x700c, 0xb914, 0x9106, 0x1120, 0x2009, 0x0051, 0x080c, + 0xa068, 0x7817, 0x0140, 0x2001, 0x19cb, 0x2004, 0x9005, 0x090c, + 0x8b8f, 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, 0x9f94, 0x05b8, 0x0066, + 0x00c6, 0x0046, 0x2011, 0x0263, 0x2204, 0x8211, 0x220c, 0x080c, + 0x266d, 0x15a0, 0x080c, 0x6343, 0x1588, 0xbe12, 0xbd16, 0x2b00, + 0x004e, 0x00ce, 0x6012, 0x080c, 0xc1ca, 0x080c, 0x1037, 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, 0x8640, 0x080c, 0x8b8f, 0x00fe, 0x009e, + 0x00ce, 0x0005, 0x080c, 0x9fea, 0x006e, 0x0cc0, 0x004e, 0x00ce, + 0x0cc8, 0x00c6, 0x7000, 0x908c, 0xff00, 0x9184, 0xf000, 0x810f, + 0x9086, 0x2000, 0x1904, 0x8150, 0x9186, 0x0022, 0x15f0, 0x2001, + 0x0111, 0x2004, 0x9005, 0x1904, 0x8152, 0x7030, 0x908e, 0x0400, + 0x0904, 0x8152, 0x908e, 0x6000, 0x05e8, 0x908e, 0x5400, 0x05d0, + 0x908e, 0x0300, 0x11d8, 0x2009, 0x1836, 0x210c, 0xd18c, 0x1590, + 0xd1a4, 0x1580, 0x080c, 0x6687, 0x0588, 0x68ac, 0x9084, 0x00ff, + 0x7100, 0x918c, 0x00ff, 0x9106, 0x1518, 0x687c, 0x69ac, 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, 0x8060, 0x0128, 0x6004, 0x9086, 0x0002, 0x0118, 0x0000, + 0x9006, 0x0010, 0x9085, 0x0001, 0x00ce, 0x0005, 0x7030, 0x908e, + 0x0300, 0x0118, 0x908e, 0x5200, 0x1d98, 0x2001, 0x1836, 0x2004, + 0x9084, 0x0009, 0x9086, 0x0008, 0x0d68, 0x0c50, 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, 0x1836, + 0x200c, 0x9184, 0x0080, 0x0118, 0xd18c, 0x0118, 0x9006, 0x001e, + 0x0005, 0x9085, 0x0001, 0x0cd8, 0x2071, 0x19d5, 0x7003, 0x0003, + 0x700f, 0x0361, 0x9006, 0x701a, 0x707a, 0x7012, 0x7017, 0x1cd0, + 0x7007, 0x0000, 0x7026, 0x702b, 0x9630, 0x7032, 0x7037, 0x9698, + 0x7047, 0xffff, 0x704a, 0x704f, 0x536d, 0x7052, 0x7063, 0x82f4, + 0x080c, 0x1050, 0x090c, 0x0df6, 0x2900, 0x7042, 0xa867, 0x0003, + 0xa86f, 0x0100, 0xa8ab, 0xdcb0, 0x0005, 0x2071, 0x19d5, 0x1d04, + 0x8248, 0x2091, 0x6000, 0x700c, 0x8001, 0x700e, 0x1510, 0x2001, + 0x187d, 0x2004, 0xd0c4, 0x0158, 0x3a00, 0xd08c, 0x1140, 0x20d1, + 0x0000, 0x20d1, 0x0001, 0x20d1, 0x0000, 0x080c, 0x0df6, 0x700f, + 0x0361, 0x7007, 0x0001, 0x0126, 0x2091, 0x8000, 0x080c, 0x8339, + 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, 0x9716, + 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, 0x8270, 0x8271, 0x828d, 0x00e6, 0x2071, 0x19d5, + 0x7018, 0x9005, 0x1120, 0x711a, 0x721e, 0x700b, 0x0009, 0x00ee, + 0x0005, 0x00e6, 0x0006, 0x2071, 0x19d5, 0x701c, 0x9206, 0x1120, + 0x701a, 0x701e, 0x707a, 0x707e, 0x000e, 0x00ee, 0x0005, 0x00e6, + 0x2071, 0x19d5, 0xb888, 0x9102, 0x0208, 0xb98a, 0x00ee, 0x0005, + 0x0005, 0x00b6, 0x7110, 0x080c, 0x63a3, 0x1168, 0xb888, 0x8001, + 0x0250, 0xb88a, 0x1140, 0x0126, 0x2091, 0x8000, 0x0016, 0x080c, + 0x8b8f, 0x001e, 0x012e, 0x8108, 0x9182, 0x0800, 0x0218, 0x900e, + 0x7007, 0x0002, 0x7112, 0x00be, 0x0005, 0x7014, 0x2060, 0x0126, + 0x2091, 0x8000, 0x6040, 0x9005, 0x0128, 0x8001, 0x6042, 0x1110, + 0x080c, 0xc05b, 0x6018, 0x9005, 0x0528, 0x8001, 0x601a, 0x1510, + 0x6120, 0x9186, 0x0003, 0x0118, 0x9186, 0x0006, 0x11c8, 0x080c, + 0xbd4e, 0x01b0, 0x6014, 0x2048, 0xa884, 0x908a, 0x199a, 0x0280, + 0x9082, 0x1999, 0xa886, 0x908a, 0x199a, 0x0210, 0x2001, 0x1999, + 0x8003, 0x800b, 0x810b, 0x9108, 0x611a, 0xa87c, 0xd0e4, 0x0110, + 0x080c, 0xba50, 0x012e, 0x9c88, 0x0018, 0x7116, 0x2001, 0x1819, + 0x2004, 0x9102, 0x0220, 0x7017, 0x1cd0, 0x7007, 0x0000, 0x0005, + 0x00e6, 0x2071, 0x19d5, 0x7027, 0x07d0, 0x7023, 0x0009, 0x00ee, + 0x0005, 0x2001, 0x19de, 0x2003, 0x0000, 0x0005, 0x00e6, 0x2071, + 0x19d5, 0x7132, 0x702f, 0x0009, 0x00ee, 0x0005, 0x2011, 0x19e1, + 0x2013, 0x0000, 0x0005, 0x00e6, 0x2071, 0x19d5, 0x711a, 0x721e, + 0x700b, 0x0009, 0x00ee, 0x0005, 0x0086, 0x0026, 0x705c, 0x8000, + 0x705e, 0x2001, 0x19e5, 0x2044, 0xa06c, 0x9086, 0x0000, 0x0150, + 0x7070, 0xa09a, 0x706c, 0xa096, 0x7068, 0xa092, 0x7064, 0xa08e, + 0x080c, 0x1134, 0x002e, 0x008e, 0x0005, 0x0006, 0x0016, 0x0096, + 0x00a6, 0x00b6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x0156, 0x080c, + 0x81bd, 0x015e, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, 0x00ae, + 0x009e, 0x001e, 0x000e, 0x0005, 0x00e6, 0x2071, 0x19d5, 0x717a, + 0x727e, 0x7077, 0x0009, 0x00ee, 0x0005, 0x00e6, 0x0006, 0x2071, + 0x19d5, 0x707c, 0x9206, 0x1110, 0x707a, 0x707e, 0x000e, 0x00ee, + 0x0005, 0x2069, 0x1800, 0x69e4, 0xd1e4, 0x1518, 0x0026, 0xd1ec, + 0x0140, 0x6a50, 0x6870, 0x9202, 0x0288, 0x8117, 0x9294, 0x00c0, + 0x0088, 0x9184, 0x0007, 0x01a0, 0x8109, 0x9184, 0x0007, 0x0110, + 0x69e6, 0x0070, 0x8107, 0x9084, 0x0007, 0x910d, 0x8107, 0x9106, + 0x9094, 0x00c0, 0x9184, 0xff3f, 0x9205, 0x68e6, 0x080c, 0x0f17, + 0x002e, 0x0005, 0x00c6, 0x2061, 0x1a4c, 0x00ce, 0x0005, 0x9184, + 0x000f, 0x8003, 0x8003, 0x8003, 0x9080, 0x1a4c, 0x2060, 0x0005, + 0xa884, 0x908a, 0x199a, 0x1638, 0x9005, 0x1150, 0x00c6, 0x2061, + 0x1a4c, 0x6014, 0x00ce, 0x9005, 0x1130, 0x2001, 0x001e, 0x0018, + 0x908e, 0xffff, 0x01b0, 0x8003, 0x800b, 0x810b, 0x9108, 0x611a, + 0xa87c, 0x908c, 0x00c0, 0x918e, 0x00c0, 0x0904, 0x83fa, 0xd0b4, + 0x1168, 0xd0bc, 0x1904, 0x83d3, 0x2009, 0x0006, 0x080c, 0x8427, + 0x0005, 0x900e, 0x0c60, 0x2001, 0x1999, 0x08b0, 0xd0fc, 0x0160, + 0x908c, 0x0003, 0x0120, 0x918e, 0x0003, 0x1904, 0x8421, 0x908c, + 0x2020, 0x918e, 0x2020, 0x01a8, 0x6024, 0xd0d4, 0x11e8, 0x2009, + 0x187d, 0x2104, 0xd084, 0x1138, 0x87ff, 0x1120, 0x2009, 0x0043, + 0x0804, 0xa068, 0x0005, 0x87ff, 0x1de8, 0x2009, 0x0042, 0x0804, + 0xa068, 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, 0x8421, 0x908c, 0x2020, 0x918e, 0x2020, + 0x0170, 0x0076, 0x00f6, 0x2c78, 0x080c, 0x1651, 0x00fe, 0x007e, + 0x87ff, 0x1120, 0x2009, 0x0042, 0x080c, 0xa068, 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, 0xa068, 0x0005, 0x00b9, 0x0ce8, 0x87ff, + 0x1dd8, 0x2009, 0x0043, 0x080c, 0xa068, 0x0cb0, 0x6110, 0x00b6, + 0x2158, 0xb900, 0x00be, 0xd1ac, 0x0d20, 0x6124, 0xc1cd, 0x6126, + 0x0c00, 0x2009, 0x0004, 0x0019, 0x0005, 0x2009, 0x0001, 0x0096, + 0x080c, 0xbd4e, 0x0518, 0x6014, 0x2048, 0xa982, 0xa800, 0x6016, + 0x9186, 0x0001, 0x1188, 0xa97c, 0x918c, 0x8100, 0x918e, 0x8100, + 0x1158, 0x00c6, 0x2061, 0x1a4c, 0x6200, 0xd28c, 0x1120, 0x6204, + 0x8210, 0x0208, 0x6206, 0x00ce, 0x080c, 0x6861, 0x6014, 0x904d, + 0x0076, 0x2039, 0x0000, 0x190c, 0x8370, 0x007e, 0x009e, 0x0005, + 0x0156, 0x00c6, 0x2061, 0x1a4c, 0x6000, 0x81ff, 0x0110, 0x9205, + 0x0008, 0x9204, 0x6002, 0x00ce, 0x015e, 0x0005, 0x6800, 0xd08c, + 0x1138, 0x6808, 0x9005, 0x0120, 0x8001, 0x680a, 0x9085, 0x0001, + 0x0005, 0x0126, 0x2091, 0x8000, 0x0036, 0x0046, 0x20a9, 0x0010, + 0x9006, 0x8004, 0x8086, 0x818e, 0x1208, 0x9200, 0x1f04, 0x8472, + 0x8086, 0x818e, 0x004e, 0x003e, 0x012e, 0x0005, 0x0126, 0x2091, + 0x8000, 0x0076, 0x0156, 0x20a9, 0x0010, 0x9005, 0x01c8, 0x911a, + 0x12b8, 0x8213, 0x818d, 0x0228, 0x911a, 0x1220, 0x1f04, 0x8489, + 0x0028, 0x911a, 0x2308, 0x8210, 0x1f04, 0x8489, 0x0006, 0x3200, + 0x9084, 0xefff, 0x2080, 0x000e, 0x015e, 0x007e, 0x012e, 0x0005, + 0x0006, 0x3200, 0x9085, 0x1000, 0x0ca8, 0x0126, 0x2091, 0x2800, + 0x2079, 0x19c2, 0x012e, 0x00d6, 0x2069, 0x19c2, 0x6803, 0x0005, + 0x0156, 0x0146, 0x01d6, 0x20e9, 0x0000, 0x2069, 0x0200, 0x080c, + 0x9df2, 0x0401, 0x080c, 0x9ddd, 0x00e9, 0x080c, 0x9de0, 0x00d1, + 0x080c, 0x9de3, 0x00b9, 0x080c, 0x9de6, 0x00a1, 0x080c, 0x9de9, + 0x0089, 0x080c, 0x9dec, 0x0071, 0x080c, 0x9def, 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, 0x84f3, 0x8517, 0x8558, 0x84f9, 0x8517, 0x84f3, 0x84f1, + 0x84f1, 0x080c, 0x0df6, 0x080c, 0x82d9, 0x080c, 0x8b8f, 0x00ce, + 0x0005, 0x62c0, 0x82ff, 0x1110, 0x00ce, 0x0005, 0x2011, 0x5c98, + 0x080c, 0x8259, 0x7828, 0x9092, 0x00c8, 0x1228, 0x8000, 0x782a, + 0x080c, 0x5cd8, 0x0c88, 0x62c0, 0x080c, 0x9df6, 0x080c, 0x5c98, + 0x7807, 0x0003, 0x7827, 0x0000, 0x782b, 0x0000, 0x0c28, 0x080c, + 0x82d9, 0x6220, 0xd2a4, 0x0170, 0xd2cc, 0x0160, 0x782b, 0x0000, + 0x7824, 0x9065, 0x090c, 0x0df6, 0x2009, 0x0013, 0x080c, 0xa068, + 0x00ce, 0x0005, 0x00c6, 0x7824, 0x9065, 0x090c, 0x0df6, 0x7828, + 0x9092, 0xc350, 0x12c0, 0x8000, 0x782a, 0x00ce, 0x080c, 0x29e9, + 0x0278, 0x00c6, 0x7924, 0x2160, 0x6010, 0x906d, 0x090c, 0x0df6, + 0x7807, 0x0000, 0x7827, 0x0000, 0x00ce, 0x080c, 0x8b8f, 0x0c00, + 0x080c, 0x95f6, 0x08e8, 0x2011, 0x0130, 0x2214, 0x080c, 0x9df6, + 0x080c, 0xdbf0, 0x2009, 0x0014, 0x080c, 0xa068, 0x00ce, 0x0880, + 0x2001, 0x19de, 0x2003, 0x0000, 0x62c0, 0x82ff, 0x1160, 0x782b, + 0x0000, 0x7824, 0x9065, 0x090c, 0x0df6, 0x2009, 0x0013, 0x080c, + 0xa0ba, 0x00ce, 0x0005, 0x00b6, 0x00c6, 0x00d6, 0x7824, 0x9005, + 0x090c, 0x0df6, 0x7828, 0x9092, 0xc350, 0x1648, 0x8000, 0x782a, + 0x00de, 0x00ce, 0x00be, 0x080c, 0x29e9, 0x02f0, 0x00b6, 0x00c6, + 0x00d6, 0x781c, 0x905d, 0x090c, 0x0df6, 0xb800, 0xc0dc, 0xb802, + 0x7924, 0x2160, 0x080c, 0x9fea, 0xb93c, 0x81ff, 0x090c, 0x0df6, + 0x8109, 0xb93e, 0x7807, 0x0000, 0x7827, 0x0000, 0x00de, 0x00ce, + 0x00be, 0x080c, 0x8b8f, 0x0868, 0x080c, 0x95f6, 0x0850, 0x2011, + 0x0130, 0x2214, 0x080c, 0x9df6, 0x080c, 0xdbf0, 0x7824, 0x9065, + 0x2009, 0x0014, 0x080c, 0xa068, 0x00de, 0x00ce, 0x00be, 0x0804, + 0x8569, 0x00c6, 0x2001, 0x009b, 0x2004, 0xd0fc, 0x190c, 0x1d00, + 0x6024, 0x6027, 0x0002, 0xd0f4, 0x1580, 0x62c8, 0x60c4, 0x9205, + 0x1170, 0x783c, 0x9065, 0x0130, 0x2009, 0x0049, 0x080c, 0xa068, + 0x00ce, 0x0005, 0x2011, 0x19e1, 0x2013, 0x0000, 0x0cc8, 0x793c, + 0x81ff, 0x0dc0, 0x7944, 0x9192, 0x7530, 0x12f0, 0x8108, 0x7946, + 0x793c, 0x9188, 0x0008, 0x210c, 0x918e, 0x0006, 0x1138, 0x6014, + 0x9084, 0x1984, 0x9085, 0x0012, 0x6016, 0x0c10, 0x6014, 0x9084, + 0x1984, 0x9085, 0x0016, 0x6016, 0x08d8, 0x793c, 0x2160, 0x2009, + 0x004a, 0x080c, 0xa068, 0x08a0, 0x7848, 0xc085, 0x784a, 0x0880, + 0x0006, 0x0016, 0x00c6, 0x0126, 0x2091, 0x8000, 0x600f, 0x0000, + 0x2c08, 0x2061, 0x19c2, 0x6020, 0x8000, 0x6022, 0x6010, 0x9005, + 0x0148, 0x9080, 0x0003, 0x2102, 0x6112, 0x012e, 0x00ce, 0x001e, + 0x000e, 0x0005, 0x6116, 0x6112, 0x0cc0, 0x00d6, 0x2069, 0x19c2, + 0xb800, 0xd0d4, 0x0168, 0x6820, 0x8000, 0x6822, 0x9086, 0x0001, + 0x1110, 0x2b00, 0x681e, 0x00de, 0x0804, 0x8b8f, 0x00de, 0x0005, + 0xc0d5, 0xb802, 0x6818, 0x9005, 0x0168, 0xb856, 0xb85b, 0x0000, + 0x0086, 0x0006, 0x2b00, 0x681a, 0x008e, 0xa05a, 0x008e, 0x2069, + 0x19c2, 0x0c08, 0xb856, 0xb85a, 0x2b00, 0x681a, 0x681e, 0x08d8, + 0x0006, 0x0016, 0x00c6, 0x0126, 0x2091, 0x8000, 0x600f, 0x0000, + 0x2c08, 0x2061, 0x19c2, 0x6020, 0x8000, 0x6022, 0x6008, 0x9005, + 0x0148, 0x9080, 0x0003, 0x2102, 0x610a, 0x012e, 0x00ce, 0x001e, + 0x000e, 0x0005, 0x610e, 0x610a, 0x0cc0, 0x00c6, 0x600f, 0x0000, + 0x2c08, 0x2061, 0x19c2, 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, + 0x19c2, 0x7638, 0x2660, 0x2678, 0x2091, 0x8000, 0x8cff, 0x0904, + 0x86ec, 0x6010, 0x2058, 0xb8a0, 0x9206, 0x1904, 0x86e7, 0x87ff, + 0x0120, 0x6054, 0x9106, 0x1904, 0x86e7, 0x703c, 0x9c06, 0x1178, + 0x0036, 0x2019, 0x0001, 0x080c, 0x98b1, 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, 0xbd4e, 0x01f0, 0x6014, 0x2048, 0x6020, 0x9086, + 0x0003, 0x15b8, 0x6004, 0x9086, 0x0040, 0x090c, 0x9a7f, 0xa867, + 0x0103, 0xab7a, 0xa877, 0x0000, 0x0016, 0x0036, 0x0076, 0x080c, + 0xc044, 0x080c, 0xdae1, 0x080c, 0x6a22, 0x007e, 0x003e, 0x001e, + 0x080c, 0xbf39, 0x080c, 0xa01c, 0x00ce, 0x0804, 0x8686, 0x2c78, + 0x600c, 0x2060, 0x0804, 0x8686, 0x85ff, 0x0120, 0x0036, 0x080c, + 0x8c6c, 0x003e, 0x012e, 0x000e, 0x001e, 0x002e, 0x003e, 0x005e, + 0x006e, 0x007e, 0x009e, 0x00be, 0x00ce, 0x00de, 0x00ee, 0x00fe, + 0x0005, 0x6020, 0x9086, 0x0006, 0x1158, 0x0016, 0x0036, 0x0076, + 0x080c, 0xdae1, 0x080c, 0xd7e2, 0x007e, 0x003e, 0x001e, 0x0890, + 0x6020, 0x9086, 0x000a, 0x0904, 0x86d1, 0x0804, 0x86ca, 0x0006, + 0x0066, 0x0096, 0x00c6, 0x00d6, 0x00f6, 0x9036, 0x0126, 0x2091, + 0x8000, 0x2079, 0x19c2, 0x7838, 0x9065, 0x0904, 0x876c, 0x600c, + 0x0006, 0x600f, 0x0000, 0x783c, 0x9c06, 0x1168, 0x0036, 0x2019, + 0x0001, 0x080c, 0x98b1, 0x7833, 0x0000, 0x901e, 0x7b3e, 0x7b42, + 0x7b46, 0x7b4a, 0x003e, 0x080c, 0xbd4e, 0x0548, 0x6014, 0x2048, + 0x6020, 0x9086, 0x0003, 0x1590, 0x3e08, 0x918e, 0x0002, 0x1188, + 0x6010, 0x9005, 0x0170, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, + 0x0140, 0x6040, 0x9005, 0x11a8, 0x2001, 0x1962, 0x2004, 0x6042, + 0x0080, 0x6004, 0x9086, 0x0040, 0x090c, 0x9a7f, 0xa867, 0x0103, + 0xab7a, 0xa877, 0x0000, 0x080c, 0x6a15, 0x080c, 0xbf39, 0x080c, + 0xa01c, 0x000e, 0x0804, 0x8724, 0x7e3a, 0x7e36, 0x012e, 0x00fe, + 0x00de, 0x00ce, 0x009e, 0x006e, 0x000e, 0x0005, 0x6020, 0x9086, + 0x0006, 0x1118, 0x080c, 0xd7e2, 0x0c50, 0x6020, 0x9086, 0x000a, + 0x09f8, 0x08b8, 0x0016, 0x0026, 0x0086, 0x9046, 0x0099, 0x080c, + 0x886d, 0x008e, 0x002e, 0x001e, 0x0005, 0x00f6, 0x0126, 0x2079, + 0x19c2, 0x2091, 0x8000, 0x080c, 0x8904, 0x080c, 0x8994, 0x012e, + 0x00fe, 0x0005, 0x00b6, 0x0096, 0x00f6, 0x00e6, 0x00d6, 0x00c6, + 0x0066, 0x0016, 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, 0x19c2, + 0x7614, 0x2660, 0x2678, 0x8cff, 0x0904, 0x8832, 0x6010, 0x2058, + 0xb8a0, 0x9206, 0x1904, 0x882d, 0x88ff, 0x0120, 0x6054, 0x9106, + 0x1904, 0x882d, 0x7024, 0x9c06, 0x1568, 0x2069, 0x0100, 0x6820, + 0xd0a4, 0x0110, 0xd0cc, 0x1508, 0x080c, 0x82d9, 0x080c, 0x961a, + 0x68c3, 0x0000, 0x080c, 0x9a7f, 0x7027, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, 0x9384, 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, - 0x2c88, 0x9006, 0x080c, 0x2c88, 0x2069, 0x0100, 0x6824, 0xd084, - 0x0110, 0x6827, 0x0001, 0x003e, 0x00de, 0x00c6, 0xb83c, 0x9005, - 0x0110, 0x8001, 0xb83e, 0x2660, 0x080c, 0xa113, 0x00ce, 0x0048, - 0x00de, 0x00c6, 0x2660, 0x6003, 0x0009, 0x630a, 0x00ce, 0x0804, - 0x8921, 0x89ff, 0x0158, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, - 0x080c, 0xc12d, 0x080c, 0xdb2e, 0x080c, 0x6ae9, 0x080c, 0x9a4e, - 0x0804, 0x8921, 0x006e, 0x00de, 0x00ee, 0x00fe, 0x012e, 0x000e, - 0x00ce, 0x009e, 0x00ae, 0x00be, 0x0005, 0x0096, 0x0006, 0x0066, - 0x00c6, 0x00d6, 0x9036, 0x7814, 0x9065, 0x0904, 0x89e8, 0x600c, - 0x0006, 0x600f, 0x0000, 0x7824, 0x9c06, 0x1580, 0x2069, 0x0100, - 0x6820, 0xd0a4, 0x0110, 0xd0cc, 0x1508, 0x080c, 0x835a, 0x080c, - 0x9656, 0x68c3, 0x0000, 0x080c, 0x9b78, 0x7827, 0x0000, 0x0036, - 0x2069, 0x0140, 0x6b04, 0x9384, 0x1000, 0x0138, 0x2001, 0x0100, - 0x080c, 0x2c88, 0x9006, 0x080c, 0x2c88, 0x2069, 0x0100, 0x6824, - 0xd084, 0x0110, 0x6827, 0x0001, 0x003e, 0x0040, 0x080c, 0x6779, - 0x1520, 0x6003, 0x0009, 0x630a, 0x2c30, 0x00f8, 0x6014, 0x2048, - 0x080c, 0xbe35, 0x01b0, 0x6020, 0x9086, 0x0003, 0x1508, 0x080c, - 0xc03f, 0x1118, 0x080c, 0xaa81, 0x0060, 0x080c, 0x6779, 0x1168, - 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x080c, 0x6ae9, 0x080c, - 0xc022, 0x080c, 0xa113, 0x080c, 0x9a4e, 0x000e, 0x0804, 0x898c, - 0x7e16, 0x7e12, 0x00de, 0x00ce, 0x006e, 0x000e, 0x009e, 0x0005, - 0x6020, 0x9086, 0x0006, 0x1118, 0x080c, 0xd830, 0x0c50, 0x080c, - 0xaa81, 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, 0x8a95, 0xb854, - 0x0006, 0x9006, 0xb856, 0xb85a, 0xb800, 0xc0d4, 0xc0dc, 0xb802, - 0x080c, 0x63d2, 0x0904, 0x8a92, 0x7e24, 0x86ff, 0x0904, 0x8a85, - 0x9680, 0x0005, 0x2004, 0x9906, 0x1904, 0x8a85, 0x00d6, 0x2069, - 0x0100, 0x68c0, 0x9005, 0x0904, 0x8a7c, 0x080c, 0x835a, 0x080c, - 0x9656, 0x68c3, 0x0000, 0x080c, 0x9b78, 0x7827, 0x0000, 0x0036, - 0x2069, 0x0140, 0x6b04, 0x9384, 0x1000, 0x0138, 0x2001, 0x0100, - 0x080c, 0x2c88, 0x9006, 0x080c, 0x2c88, 0x2069, 0x0100, 0x6824, - 0xd084, 0x0110, 0x6827, 0x0001, 0x003e, 0x00de, 0x00c6, 0x3e08, - 0x918e, 0x0002, 0x1168, 0xb800, 0xd0bc, 0x0150, 0x9680, 0x0010, - 0x200c, 0x81ff, 0x1518, 0x2009, 0x1960, 0x210c, 0x2102, 0x00f0, - 0xb83c, 0x9005, 0x0110, 0x8001, 0xb83e, 0x2660, 0x600f, 0x0000, - 0x080c, 0xa113, 0x00ce, 0x0048, 0x00de, 0x00c6, 0x2660, 0x6003, - 0x0009, 0x630a, 0x00ce, 0x0804, 0x8a28, 0x89ff, 0x0138, 0xa867, - 0x0103, 0xab7a, 0xa877, 0x0000, 0x080c, 0x6ae9, 0x080c, 0x9a4e, - 0x0804, 0x8a28, 0x000e, 0x0804, 0x8a1c, 0x781e, 0x781a, 0x00de, - 0x00ce, 0x00be, 0x009e, 0x006e, 0x000e, 0x0005, 0x00e6, 0x00d6, - 0x0096, 0x0066, 0xb800, 0xd0dc, 0x01a0, 0xb84c, 0x904d, 0x0188, - 0xa878, 0x9606, 0x1170, 0x2071, 0x19bf, 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, 0x9656, 0x78c3, 0x0000, 0x080c, - 0x9b78, 0x7027, 0x0000, 0x0036, 0x2079, 0x0140, 0x7b04, 0x9384, - 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x2c88, 0x9006, 0x080c, - 0x2c88, 0x2079, 0x0100, 0x7824, 0xd084, 0x0110, 0x7827, 0x0001, - 0x080c, 0x9b78, 0x003e, 0x080c, 0x63d2, 0x00c6, 0xb83c, 0x9005, - 0x0110, 0x8001, 0xb83e, 0x2660, 0x080c, 0xa0e3, 0x00ce, 0xa867, - 0x0103, 0xab7a, 0xa877, 0x0000, 0x080c, 0xc12d, 0x080c, 0x6ae9, - 0x080c, 0x9a4e, 0x00fe, 0x0005, 0x00b6, 0x00e6, 0x00c6, 0x2011, - 0x0101, 0x2204, 0xc0c4, 0x2012, 0x2001, 0x180c, 0x2014, 0xc2e4, - 0x2202, 0x2071, 0x19bf, 0x7004, 0x9084, 0x0007, 0x0002, 0x8b21, - 0x8b25, 0x8b43, 0x8b6c, 0x8baa, 0x8b21, 0x8b3c, 0x8b1f, 0x080c, - 0x0dfa, 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, 0x63d2, 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, - 0x8c10, 0x0ca8, 0x7218, 0x721e, 0x080c, 0x8c10, 0x0c80, 0xc2ec, - 0x2202, 0x080c, 0x8ced, 0x0c58, 0x7024, 0x9065, 0x05b8, 0x700c, - 0x9c06, 0x1160, 0x080c, 0x9a4e, 0x600c, 0x9015, 0x0120, 0x720e, - 0x600f, 0x0000, 0x0448, 0x720e, 0x720a, 0x0430, 0x7014, 0x9c06, - 0x1160, 0x080c, 0x9a4e, 0x600c, 0x9015, 0x0120, 0x7216, 0x600f, - 0x0000, 0x00d0, 0x7216, 0x7212, 0x00b8, 0x6020, 0x9086, 0x0003, - 0x1198, 0x6010, 0x2058, 0x080c, 0x63d2, 0xb800, 0xc0dc, 0xb802, - 0x080c, 0x9a4e, 0x701c, 0x9065, 0x0138, 0xb854, 0x9015, 0x0110, - 0x721e, 0x0010, 0x7218, 0x721e, 0x7027, 0x0000, 0x00ce, 0x00ee, - 0x00be, 0x0005, 0x7024, 0x9065, 0x0140, 0x080c, 0x9a4e, 0x600c, - 0x9015, 0x0158, 0x720e, 0x600f, 0x0000, 0x080c, 0x9b78, 0x7027, - 0x0000, 0x00ce, 0x00ee, 0x00be, 0x0005, 0x720e, 0x720a, 0x0ca8, - 0x00d6, 0x2069, 0x19bf, 0x6830, 0x9084, 0x0003, 0x0002, 0x8bcd, - 0x8bcf, 0x8bf3, 0x8bcb, 0x080c, 0x0dfa, 0x00de, 0x0005, 0x00c6, - 0x6840, 0x9086, 0x0001, 0x01b8, 0x683c, 0x9065, 0x0130, 0x600c, - 0x9015, 0x0170, 0x6a3a, 0x600f, 0x0000, 0x6833, 0x0000, 0x683f, - 0x0000, 0x2011, 0x19de, 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, - 0x8ced, 0x2001, 0x19cb, 0x2004, 0x9086, 0x0001, 0x0d58, 0x00d6, - 0x2069, 0x19bf, 0x6804, 0x9084, 0x0007, 0x0002, 0x8c30, 0x8cd5, - 0x8cd5, 0x8cd5, 0x8cd5, 0x8cd7, 0x8cd5, 0x8c2e, 0x080c, 0x0dfa, - 0x6820, 0x9005, 0x1110, 0x00de, 0x0005, 0x00c6, 0x680c, 0x9065, - 0x0150, 0x6807, 0x0004, 0x6826, 0x682b, 0x0000, 0x080c, 0x8d44, - 0x00ce, 0x00de, 0x0005, 0x6814, 0x9065, 0x0150, 0x6807, 0x0001, - 0x6826, 0x682b, 0x0000, 0x080c, 0x8d44, 0x00ce, 0x00de, 0x0005, - 0x00b6, 0x00e6, 0x6a1c, 0x92dd, 0x0000, 0x0904, 0x8cbf, 0xb84c, - 0x900d, 0x0118, 0xb888, 0x9005, 0x01a0, 0xb854, 0x905d, 0x0120, - 0x920e, 0x0904, 0x8cbf, 0x0028, 0x6818, 0x920e, 0x0904, 0x8cbf, - 0x2058, 0xb84c, 0x900d, 0x0d88, 0xb888, 0x9005, 0x1d70, 0x2b00, - 0x681e, 0xbb3c, 0xb838, 0x9302, 0x1e40, 0x080c, 0xa0ba, 0x0904, - 0x8cbf, 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, - 0xbab0, 0x629a, 0x2069, 0x0200, 0x2071, 0x0240, 0x080c, 0x9286, - 0x2069, 0x19bf, 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, 0x63d2, 0x080c, 0x9f0f, - 0x00ee, 0x00be, 0x00ce, 0x00de, 0x0005, 0x00de, 0x0005, 0x00c6, - 0x680c, 0x9065, 0x0138, 0x6807, 0x0004, 0x6826, 0x682b, 0x0000, - 0x080c, 0x8d44, 0x00ce, 0x00de, 0x0005, 0x2001, 0x180c, 0x2014, - 0xc2ed, 0x2202, 0x00de, 0x00fe, 0x0005, 0x00f6, 0x00d6, 0x2069, - 0x19bf, 0x6830, 0x9086, 0x0000, 0x1548, 0x2001, 0x180c, 0x2014, - 0xd2e4, 0x0130, 0xc2e4, 0x2202, 0x080c, 0x8c1f, 0x2069, 0x19bf, - 0x2001, 0x180c, 0x200c, 0xd1c4, 0x11e0, 0x6838, 0x907d, 0x01b0, - 0x6a04, 0x9296, 0x0000, 0x1568, 0x6833, 0x0001, 0x683e, 0x6847, - 0x0000, 0x684b, 0x0000, 0x0126, 0x00f6, 0x2091, 0x2400, 0x002e, - 0x080c, 0x1b8a, 0x1158, 0x012e, 0x080c, 0x94b3, 0x00de, 0x00fe, - 0x0005, 0xc1c4, 0x2102, 0x080c, 0x72d2, 0x08f8, 0x012e, 0x6843, - 0x0000, 0x7803, 0x0002, 0x780c, 0x9015, 0x0140, 0x6a3a, 0x780f, - 0x0000, 0x6833, 0x0000, 0x683f, 0x0000, 0x0c40, 0x683a, 0x6836, - 0x0cc0, 0x6a04, 0x9296, 0x0006, 0x1904, 0x8ce5, 0x6a30, 0x9296, - 0x0000, 0x0950, 0x0804, 0x8ce5, 0x6020, 0x9084, 0x000f, 0x000b, - 0x0005, 0x8d58, 0x8d5d, 0x91b6, 0x924f, 0x8d5d, 0x91b6, 0x924f, - 0x8d58, 0x8d5d, 0x8d58, 0x8d58, 0x8d58, 0x8d58, 0x8d58, 0x8d58, - 0x080c, 0x8b04, 0x080c, 0x8c10, 0x0005, 0x00b6, 0x0156, 0x0136, - 0x0146, 0x01c6, 0x01d6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x2069, - 0x0200, 0x2071, 0x0240, 0x6004, 0x908a, 0x0053, 0x1a0c, 0x0dfa, - 0x6110, 0x2158, 0xb9b0, 0x2c78, 0x2061, 0x0100, 0x619a, 0x908a, - 0x0040, 0x1a04, 0x8dc9, 0x005b, 0x00fe, 0x00ee, 0x00de, 0x00ce, - 0x01de, 0x01ce, 0x014e, 0x013e, 0x015e, 0x00be, 0x0005, 0x8f40, - 0x8f7b, 0x8fa4, 0x9047, 0x9068, 0x906e, 0x907b, 0x9083, 0x908f, - 0x9095, 0x90a6, 0x9095, 0x90fd, 0x9083, 0x9109, 0x910f, 0x908f, - 0x910f, 0x911b, 0x8dc7, 0x8dc7, 0x8dc7, 0x8dc7, 0x8dc7, 0x8dc7, - 0x8dc7, 0x8dc7, 0x8dc7, 0x8dc7, 0x8dc7, 0x9854, 0x9877, 0x9888, - 0x98a8, 0x98da, 0x907b, 0x8dc7, 0x907b, 0x9095, 0x8dc7, 0x8fa4, - 0x9047, 0x8dc7, 0x9c6f, 0x9095, 0x8dc7, 0x9c8b, 0x9095, 0x8dc7, - 0x908f, 0x8f3a, 0x8dea, 0x8dc7, 0x9ca7, 0x9d14, 0x9def, 0x8dc7, - 0x9dfc, 0x9078, 0x9e27, 0x8dc7, 0x98e4, 0x9e54, 0x8dc7, 0x080c, - 0x0dfa, 0x2100, 0x005b, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x01de, - 0x01ce, 0x014e, 0x013e, 0x015e, 0x00be, 0x0005, 0x8de8, 0x8de8, - 0x8de8, 0x8e11, 0x8ebd, 0x8ec8, 0x8de8, 0x8de8, 0x8de8, 0x8f0f, - 0x8f1b, 0x8e2c, 0x8de8, 0x8e47, 0x8e7b, 0x9fd6, 0xa01b, 0x9095, - 0x080c, 0x0dfa, 0x00d6, 0x0096, 0x080c, 0x912e, 0x7003, 0x2414, - 0x7007, 0x0018, 0x700b, 0x0800, 0x7814, 0x2048, 0xa83c, 0x700e, - 0xa850, 0x7022, 0xa854, 0x7026, 0x60c3, 0x0018, 0x080c, 0x962a, + 0x2b6f, 0x9006, 0x080c, 0x2b6f, 0x2069, 0x0100, 0x6824, 0xd084, + 0x0110, 0x6827, 0x0001, 0x003e, 0x0028, 0x6003, 0x0009, 0x630a, + 0x0804, 0x882d, 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, 0xbd4e, + 0x01e8, 0x6020, 0x9086, 0x0003, 0x1580, 0x080c, 0xbf56, 0x1118, + 0x080c, 0xa9a7, 0x0098, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, + 0x0016, 0x0036, 0x0086, 0x080c, 0xc044, 0x080c, 0xdae1, 0x080c, + 0x6a22, 0x008e, 0x003e, 0x001e, 0x080c, 0xbf39, 0x080c, 0xa01c, + 0x080c, 0x9955, 0x00ce, 0x0804, 0x87ab, 0x2c78, 0x600c, 0x2060, + 0x0804, 0x87ab, 0x012e, 0x000e, 0x001e, 0x006e, 0x00ce, 0x00de, + 0x00ee, 0x00fe, 0x009e, 0x00be, 0x0005, 0x6020, 0x9086, 0x0006, + 0x1158, 0x0016, 0x0036, 0x0086, 0x080c, 0xdae1, 0x080c, 0xd7e2, + 0x008e, 0x003e, 0x001e, 0x08d0, 0x080c, 0xa9a7, 0x6020, 0x9086, + 0x0002, 0x1160, 0x6004, 0x0006, 0x9086, 0x0085, 0x000e, 0x0904, + 0x8813, 0x9086, 0x008b, 0x0904, 0x8813, 0x0840, 0x6020, 0x9086, + 0x0005, 0x1920, 0x6004, 0x0006, 0x9086, 0x0085, 0x000e, 0x09c8, + 0x9086, 0x008b, 0x09b0, 0x0804, 0x8826, 0x00b6, 0x00a6, 0x0096, + 0x00c6, 0x0006, 0x0126, 0x2091, 0x8000, 0x9280, 0x1000, 0x2004, + 0x905d, 0x0904, 0x88fd, 0x00f6, 0x00e6, 0x00d6, 0x0066, 0x2071, + 0x19c2, 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, 0x62d6, 0x0904, 0x88f9, 0x7624, 0x86ff, 0x0904, 0x88e8, + 0x9680, 0x0005, 0x2004, 0x9906, 0x15d8, 0x00d6, 0x2069, 0x0100, + 0x68c0, 0x9005, 0x0560, 0x080c, 0x82d9, 0x080c, 0x961a, 0x68c3, + 0x0000, 0x080c, 0x9a7f, 0x7027, 0x0000, 0x0036, 0x2069, 0x0140, + 0x6b04, 0x9384, 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x2b6f, + 0x9006, 0x080c, 0x2b6f, 0x2069, 0x0100, 0x6824, 0xd084, 0x0110, + 0x6827, 0x0001, 0x003e, 0x00de, 0x00c6, 0xb83c, 0x9005, 0x0110, + 0x8001, 0xb83e, 0x2660, 0x080c, 0xa01c, 0x00ce, 0x0048, 0x00de, + 0x00c6, 0x2660, 0x6003, 0x0009, 0x630a, 0x00ce, 0x0804, 0x88a0, + 0x89ff, 0x0158, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x080c, + 0xc044, 0x080c, 0xdae1, 0x080c, 0x6a22, 0x080c, 0x9955, 0x0804, + 0x88a0, 0x006e, 0x00de, 0x00ee, 0x00fe, 0x012e, 0x000e, 0x00ce, + 0x009e, 0x00ae, 0x00be, 0x0005, 0x0096, 0x0006, 0x0066, 0x00c6, + 0x00d6, 0x9036, 0x7814, 0x9065, 0x0904, 0x8967, 0x600c, 0x0006, + 0x600f, 0x0000, 0x7824, 0x9c06, 0x1580, 0x2069, 0x0100, 0x6820, + 0xd0a4, 0x0110, 0xd0cc, 0x1508, 0x080c, 0x82d9, 0x080c, 0x961a, + 0x68c3, 0x0000, 0x080c, 0x9a7f, 0x7827, 0x0000, 0x0036, 0x2069, + 0x0140, 0x6b04, 0x9384, 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, + 0x2b6f, 0x9006, 0x080c, 0x2b6f, 0x2069, 0x0100, 0x6824, 0xd084, + 0x0110, 0x6827, 0x0001, 0x003e, 0x0040, 0x080c, 0x667f, 0x1520, + 0x6003, 0x0009, 0x630a, 0x2c30, 0x00f8, 0x6014, 0x2048, 0x080c, + 0xbd4c, 0x01b0, 0x6020, 0x9086, 0x0003, 0x1508, 0x080c, 0xbf56, + 0x1118, 0x080c, 0xa9a7, 0x0060, 0x080c, 0x667f, 0x1168, 0xa867, + 0x0103, 0xab7a, 0xa877, 0x0000, 0x080c, 0x6a22, 0x080c, 0xbf39, + 0x080c, 0xa01c, 0x080c, 0x9955, 0x000e, 0x0804, 0x890b, 0x7e16, + 0x7e12, 0x00de, 0x00ce, 0x006e, 0x000e, 0x009e, 0x0005, 0x6020, + 0x9086, 0x0006, 0x1118, 0x080c, 0xd7e2, 0x0c50, 0x080c, 0xa9a7, + 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, 0x8a14, 0xb854, 0x0006, + 0x9006, 0xb856, 0xb85a, 0xb800, 0xc0d4, 0xc0dc, 0xb802, 0x080c, + 0x62d6, 0x0904, 0x8a11, 0x7e24, 0x86ff, 0x0904, 0x8a04, 0x9680, + 0x0005, 0x2004, 0x9906, 0x1904, 0x8a04, 0x00d6, 0x2069, 0x0100, + 0x68c0, 0x9005, 0x0904, 0x89fb, 0x080c, 0x82d9, 0x080c, 0x961a, + 0x68c3, 0x0000, 0x080c, 0x9a7f, 0x7827, 0x0000, 0x0036, 0x2069, + 0x0140, 0x6b04, 0x9384, 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, + 0x2b6f, 0x9006, 0x080c, 0x2b6f, 0x2069, 0x0100, 0x6824, 0xd084, + 0x0110, 0x6827, 0x0001, 0x003e, 0x00de, 0x00c6, 0x3e08, 0x918e, + 0x0002, 0x1168, 0xb800, 0xd0bc, 0x0150, 0x9680, 0x0010, 0x200c, + 0x81ff, 0x1518, 0x2009, 0x1962, 0x210c, 0x2102, 0x00f0, 0xb83c, + 0x9005, 0x0110, 0x8001, 0xb83e, 0x2660, 0x600f, 0x0000, 0x080c, + 0xa01c, 0x00ce, 0x0048, 0x00de, 0x00c6, 0x2660, 0x6003, 0x0009, + 0x630a, 0x00ce, 0x0804, 0x89a7, 0x89ff, 0x0138, 0xa867, 0x0103, + 0xab7a, 0xa877, 0x0000, 0x080c, 0x6a22, 0x080c, 0x9955, 0x0804, + 0x89a7, 0x000e, 0x0804, 0x899b, 0x781e, 0x781a, 0x00de, 0x00ce, + 0x00be, 0x009e, 0x006e, 0x000e, 0x0005, 0x00e6, 0x00d6, 0x0096, + 0x0066, 0xb800, 0xd0dc, 0x01a0, 0xb84c, 0x904d, 0x0188, 0xa878, + 0x9606, 0x1170, 0x2071, 0x19c2, 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, 0x961a, 0x78c3, 0x0000, 0x080c, 0x9a7f, + 0x7027, 0x0000, 0x0036, 0x2079, 0x0140, 0x7b04, 0x9384, 0x1000, + 0x0138, 0x2001, 0x0100, 0x080c, 0x2b6f, 0x9006, 0x080c, 0x2b6f, + 0x2079, 0x0100, 0x7824, 0xd084, 0x0110, 0x7827, 0x0001, 0x080c, + 0x9a7f, 0x003e, 0x080c, 0x62d6, 0x00c6, 0xb83c, 0x9005, 0x0110, + 0x8001, 0xb83e, 0x2660, 0x080c, 0x9fea, 0x00ce, 0xa867, 0x0103, + 0xab7a, 0xa877, 0x0000, 0x080c, 0xc044, 0x080c, 0x6a22, 0x080c, + 0x9955, 0x00fe, 0x0005, 0x00b6, 0x00e6, 0x00c6, 0x2011, 0x0101, + 0x2204, 0xc0c4, 0x2012, 0x2001, 0x180c, 0x2014, 0xc2e4, 0x2202, + 0x2071, 0x19c2, 0x7004, 0x9084, 0x0007, 0x0002, 0x8aa0, 0x8aa4, + 0x8ac2, 0x8aeb, 0x8b29, 0x8aa0, 0x8abb, 0x8a9e, 0x080c, 0x0df6, + 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, 0x62d6, 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, 0x8b8f, + 0x0ca8, 0x7218, 0x721e, 0x080c, 0x8b8f, 0x0c80, 0xc2ec, 0x2202, + 0x080c, 0x8c6c, 0x0c58, 0x7024, 0x9065, 0x05b8, 0x700c, 0x9c06, + 0x1160, 0x080c, 0x9955, 0x600c, 0x9015, 0x0120, 0x720e, 0x600f, + 0x0000, 0x0448, 0x720e, 0x720a, 0x0430, 0x7014, 0x9c06, 0x1160, + 0x080c, 0x9955, 0x600c, 0x9015, 0x0120, 0x7216, 0x600f, 0x0000, + 0x00d0, 0x7216, 0x7212, 0x00b8, 0x6020, 0x9086, 0x0003, 0x1198, + 0x6010, 0x2058, 0x080c, 0x62d6, 0xb800, 0xc0dc, 0xb802, 0x080c, + 0x9955, 0x701c, 0x9065, 0x0138, 0xb854, 0x9015, 0x0110, 0x721e, + 0x0010, 0x7218, 0x721e, 0x7027, 0x0000, 0x00ce, 0x00ee, 0x00be, + 0x0005, 0x7024, 0x9065, 0x0140, 0x080c, 0x9955, 0x600c, 0x9015, + 0x0158, 0x720e, 0x600f, 0x0000, 0x080c, 0x9a7f, 0x7027, 0x0000, + 0x00ce, 0x00ee, 0x00be, 0x0005, 0x720e, 0x720a, 0x0ca8, 0x00d6, + 0x2069, 0x19c2, 0x6830, 0x9084, 0x0003, 0x0002, 0x8b4c, 0x8b4e, + 0x8b72, 0x8b4a, 0x080c, 0x0df6, 0x00de, 0x0005, 0x00c6, 0x6840, + 0x9086, 0x0001, 0x01b8, 0x683c, 0x9065, 0x0130, 0x600c, 0x9015, + 0x0170, 0x6a3a, 0x600f, 0x0000, 0x6833, 0x0000, 0x683f, 0x0000, + 0x2011, 0x19e1, 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, 0x8c6c, + 0x2001, 0x19ce, 0x2004, 0x9086, 0x0001, 0x0d58, 0x00d6, 0x2069, + 0x19c2, 0x6804, 0x9084, 0x0007, 0x0002, 0x8baf, 0x8c54, 0x8c54, + 0x8c54, 0x8c54, 0x8c56, 0x8c54, 0x8bad, 0x080c, 0x0df6, 0x6820, + 0x9005, 0x1110, 0x00de, 0x0005, 0x00c6, 0x680c, 0x9065, 0x0150, + 0x6807, 0x0004, 0x6826, 0x682b, 0x0000, 0x080c, 0x8cc3, 0x00ce, + 0x00de, 0x0005, 0x6814, 0x9065, 0x0150, 0x6807, 0x0001, 0x6826, + 0x682b, 0x0000, 0x080c, 0x8cc3, 0x00ce, 0x00de, 0x0005, 0x00b6, + 0x00e6, 0x6a1c, 0x92dd, 0x0000, 0x0904, 0x8c3e, 0xb84c, 0x900d, + 0x0118, 0xb888, 0x9005, 0x01a0, 0xb854, 0x905d, 0x0120, 0x920e, + 0x0904, 0x8c3e, 0x0028, 0x6818, 0x920e, 0x0904, 0x8c3e, 0x2058, + 0xb84c, 0x900d, 0x0d88, 0xb888, 0x9005, 0x1d70, 0x2b00, 0x681e, + 0xbb3c, 0xb838, 0x9302, 0x1e40, 0x080c, 0x9fc1, 0x0904, 0x8c3e, + 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, 0xbab0, + 0x629a, 0x2069, 0x0200, 0x2071, 0x0240, 0x080c, 0x923f, 0x2069, + 0x19c2, 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, 0x62d6, 0x080c, 0x9e16, 0x00ee, + 0x00be, 0x00ce, 0x00de, 0x0005, 0x00de, 0x0005, 0x00c6, 0x680c, + 0x9065, 0x0138, 0x6807, 0x0004, 0x6826, 0x682b, 0x0000, 0x080c, + 0x8cc3, 0x00ce, 0x00de, 0x0005, 0x2001, 0x180c, 0x2014, 0xc2ed, + 0x2202, 0x00de, 0x00fe, 0x0005, 0x00f6, 0x00d6, 0x2069, 0x19c2, + 0x6830, 0x9086, 0x0000, 0x1548, 0x2001, 0x180c, 0x2014, 0xd2e4, + 0x0130, 0xc2e4, 0x2202, 0x080c, 0x8b9e, 0x2069, 0x19c2, 0x2001, + 0x180c, 0x200c, 0xd1c4, 0x11e0, 0x6838, 0x907d, 0x01b0, 0x6a04, + 0x9296, 0x0000, 0x1568, 0x6833, 0x0001, 0x683e, 0x6847, 0x0000, + 0x684b, 0x0000, 0x0126, 0x00f6, 0x2091, 0x2400, 0x002e, 0x080c, + 0x1b0a, 0x1158, 0x012e, 0x080c, 0x9477, 0x00de, 0x00fe, 0x0005, + 0xc1c4, 0x2102, 0x080c, 0x7246, 0x08f8, 0x012e, 0x6843, 0x0000, + 0x7803, 0x0002, 0x780c, 0x9015, 0x0140, 0x6a3a, 0x780f, 0x0000, + 0x6833, 0x0000, 0x683f, 0x0000, 0x0c40, 0x683a, 0x6836, 0x0cc0, + 0x6a04, 0x9296, 0x0006, 0x1904, 0x8c64, 0x6a30, 0x9296, 0x0000, + 0x0950, 0x0804, 0x8c64, 0x6020, 0x9084, 0x000f, 0x000b, 0x0005, + 0x8cd7, 0x8cdc, 0x916f, 0x9208, 0x8cdc, 0x916f, 0x9208, 0x8cd7, + 0x8cdc, 0x8cd7, 0x8cd7, 0x8cd7, 0x8cd7, 0x8cd7, 0x8cd7, 0x080c, + 0x8a83, 0x080c, 0x8b8f, 0x0005, 0x00b6, 0x0156, 0x0136, 0x0146, + 0x01c6, 0x01d6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x2069, 0x0200, + 0x2071, 0x0240, 0x6004, 0x908a, 0x0053, 0x1a0c, 0x0df6, 0x6110, + 0x2158, 0xb9b0, 0x2c78, 0x2061, 0x0100, 0x619a, 0x908a, 0x0040, + 0x1a04, 0x8d48, 0x005b, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x01de, + 0x01ce, 0x014e, 0x013e, 0x015e, 0x00be, 0x0005, 0x8ee3, 0x8f1e, + 0x8f47, 0x9000, 0x9021, 0x9027, 0x9034, 0x903c, 0x9048, 0x904e, + 0x905f, 0x904e, 0x90b6, 0x903c, 0x90c2, 0x90c8, 0x9048, 0x90c8, + 0x90d4, 0x8d46, 0x8d46, 0x8d46, 0x8d46, 0x8d46, 0x8d46, 0x8d46, + 0x8d46, 0x8d46, 0x8d46, 0x8d46, 0x9768, 0x978b, 0x979c, 0x97bc, + 0x97ee, 0x9034, 0x8d46, 0x9034, 0x904e, 0x8d46, 0x8f47, 0x9000, + 0x8d46, 0x9b76, 0x904e, 0x8d46, 0x9b92, 0x904e, 0x8d46, 0x9048, + 0x8edd, 0x8d69, 0x8d46, 0x9bae, 0x9c1b, 0x9cf6, 0x8d46, 0x9d03, + 0x9031, 0x9d2e, 0x8d46, 0x97f8, 0x9d5b, 0x8d46, 0x080c, 0x0df6, + 0x2100, 0x005b, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x01de, 0x01ce, + 0x014e, 0x013e, 0x015e, 0x00be, 0x0005, 0x8d67, 0x8d67, 0x8d67, + 0x8da1, 0x8e4d, 0x8e58, 0x8d67, 0x8d67, 0x8d67, 0x8eb2, 0x8ebe, + 0x8dbc, 0x8d67, 0x8dd7, 0x8e0b, 0x9edd, 0x9f22, 0x904e, 0x080c, + 0x0df6, 0x00d6, 0x0096, 0x080c, 0x90e7, 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, 0x95ee, 0x003e, 0x002e, 0x009e, 0x00de, 0x0005, 0x7810, 0x00b6, 0x2058, 0xb8a0, 0x00be, - 0x080c, 0xa062, 0x1118, 0x9084, 0xff80, 0x0110, 0x9085, 0x0001, - 0x0005, 0x00d6, 0x0096, 0x080c, 0x912e, 0x7003, 0x0500, 0x7814, + 0x080c, 0x9f69, 0x1118, 0x9084, 0xff80, 0x0110, 0x9085, 0x0001, + 0x0005, 0x00d6, 0x0096, 0x080c, 0x90e7, 0x7003, 0x0500, 0x7814, 0x2048, 0xa874, 0x700a, 0xa878, 0x700e, 0xa87c, 0x7012, 0xa880, 0x7016, 0xa884, 0x701a, 0xa888, 0x701e, 0x60c3, 0x0010, 0x080c, - 0x962a, 0x009e, 0x00de, 0x0005, 0x00d6, 0x0096, 0x080c, 0x912e, + 0x95ee, 0x009e, 0x00de, 0x0005, 0x00d6, 0x0096, 0x080c, 0x90e7, 0x7003, 0x0500, 0x7814, 0x2048, 0xa8cc, 0x700a, 0xa8d0, 0x700e, 0xa8d4, 0x7012, 0xa8d8, 0x7016, 0xa8dc, 0x701a, 0xa8e0, 0x701e, - 0x60c3, 0x0010, 0x080c, 0x962a, 0x009e, 0x00de, 0x0005, 0x00d6, - 0x0096, 0x0126, 0x2091, 0x8000, 0x080c, 0x912e, 0x20e9, 0x0000, - 0x2001, 0x197b, 0x2003, 0x0000, 0x7814, 0x2048, 0xa814, 0x8003, + 0x60c3, 0x0010, 0x080c, 0x95ee, 0x009e, 0x00de, 0x0005, 0x00d6, + 0x0096, 0x0126, 0x2091, 0x8000, 0x080c, 0x90e7, 0x20e9, 0x0000, + 0x2001, 0x197e, 0x2003, 0x0000, 0x7814, 0x2048, 0xa814, 0x8003, 0x60c2, 0xa830, 0x20a8, 0xa860, 0x20e0, 0xa85c, 0x9080, 0x001b, - 0x2098, 0x2001, 0x197b, 0x0016, 0x200c, 0x2001, 0x0001, 0x080c, - 0x22ef, 0x080c, 0xcb69, 0x9006, 0x080c, 0x22ef, 0x001e, 0xa804, - 0x9005, 0x0110, 0x2048, 0x0c28, 0x04d9, 0x080c, 0x962a, 0x012e, + 0x2098, 0x2001, 0x197e, 0x0016, 0x200c, 0x2001, 0x0001, 0x080c, + 0x21e5, 0x080c, 0xcac3, 0x9006, 0x080c, 0x21e5, 0x001e, 0xa804, + 0x9005, 0x0110, 0x2048, 0x0c28, 0x04d9, 0x080c, 0x95ee, 0x012e, 0x009e, 0x00de, 0x0005, 0x00d6, 0x0096, 0x0126, 0x2091, 0x8000, - 0x080c, 0x9179, 0x20e9, 0x0000, 0x2001, 0x197b, 0x2003, 0x0000, + 0x080c, 0x9132, 0x20e9, 0x0000, 0x2001, 0x197e, 0x2003, 0x0000, 0x7814, 0x2048, 0xa86f, 0x0200, 0xa873, 0x0000, 0xa814, 0x8003, 0x60c2, 0xa830, 0x20a8, 0xa860, 0x20e0, 0xa85c, 0x9080, 0x001b, - 0x2098, 0x2001, 0x197b, 0x0016, 0x200c, 0x080c, 0xcb69, 0x001e, + 0x2098, 0x2001, 0x197e, 0x0016, 0x200c, 0x080c, 0xcac3, 0x001e, 0xa804, 0x9005, 0x0110, 0x2048, 0x0c60, 0x0051, 0x7814, 0x2048, - 0x080c, 0x0fe3, 0x080c, 0x962a, 0x012e, 0x009e, 0x00de, 0x0005, + 0x080c, 0x0fe9, 0x080c, 0x95ee, 0x012e, 0x009e, 0x00de, 0x0005, 0x60c0, 0x8004, 0x9084, 0x0003, 0x9005, 0x0130, 0x9082, 0x0004, - 0x20a3, 0x0000, 0x8000, 0x1de0, 0x0005, 0x080c, 0x912e, 0x7003, - 0x7800, 0x7808, 0x8007, 0x700a, 0x60c3, 0x0008, 0x0804, 0x962a, - 0x00d6, 0x00e6, 0x080c, 0x9179, 0x7814, 0x9084, 0xff00, 0x2073, - 0x0200, 0x8e70, 0x8e70, 0x9095, 0x0010, 0x2272, 0x8e70, 0x2073, - 0x0034, 0x8e70, 0x2069, 0x1805, 0x20a9, 0x0004, 0x2d76, 0x8d68, - 0x8e70, 0x1f04, 0x8ede, 0x2069, 0x1801, 0x20a9, 0x0004, 0x2d76, - 0x8d68, 0x8e70, 0x1f04, 0x8ee7, 0x2069, 0x198b, 0x9086, 0xdf00, - 0x0110, 0x2069, 0x19a5, 0x20a9, 0x001a, 0x9e86, 0x0260, 0x1148, - 0x00c6, 0x2061, 0x0200, 0x6010, 0x8000, 0x6012, 0x00ce, 0x2071, - 0x0240, 0x2d04, 0x8007, 0x2072, 0x8d68, 0x8e70, 0x1f04, 0x8ef5, - 0x60c3, 0x004c, 0x080c, 0x962a, 0x00ee, 0x00de, 0x0005, 0x080c, - 0x912e, 0x7003, 0x6300, 0x7007, 0x0028, 0x7808, 0x700e, 0x60c3, - 0x0008, 0x0804, 0x962a, 0x00d6, 0x0026, 0x0016, 0x080c, 0x9179, - 0x7003, 0x0200, 0x7814, 0x700e, 0x00e6, 0x9ef0, 0x0004, 0x2009, - 0x0001, 0x2011, 0x000c, 0x2073, 0x0800, 0x8e70, 0x2073, 0x0000, - 0x00ee, 0x7206, 0x710a, 0x62c2, 0x080c, 0x962a, 0x001e, 0x002e, - 0x00de, 0x0005, 0x2001, 0x1817, 0x2004, 0x609a, 0x0804, 0x962a, - 0x080c, 0x912e, 0x7003, 0x5200, 0x2069, 0x185b, 0x6804, 0xd084, - 0x0130, 0x6828, 0x0016, 0x080c, 0x27a1, 0x710e, 0x001e, 0x20a9, - 0x0004, 0x20e1, 0x0001, 0x2099, 0x1805, 0x20e9, 0x0000, 0x20a1, - 0x0250, 0x4003, 0x20a9, 0x0004, 0x2099, 0x1801, 0x20a1, 0x0254, - 0x4003, 0x080c, 0xa062, 0x1120, 0xb8a0, 0x9082, 0x007f, 0x0248, - 0x2001, 0x181e, 0x2004, 0x7032, 0x2001, 0x181f, 0x2004, 0x7036, - 0x0030, 0x2001, 0x1817, 0x2004, 0x9084, 0x00ff, 0x7036, 0x60c3, - 0x001c, 0x0804, 0x962a, 0x080c, 0x912e, 0x7003, 0x0500, 0x080c, - 0xa062, 0x1120, 0xb8a0, 0x9082, 0x007f, 0x0248, 0x2001, 0x181e, - 0x2004, 0x700a, 0x2001, 0x181f, 0x2004, 0x700e, 0x0030, 0x2001, - 0x1817, 0x2004, 0x9084, 0x00ff, 0x700e, 0x20a9, 0x0004, 0x20e1, - 0x0001, 0x2099, 0x1805, 0x20e9, 0x0000, 0x20a1, 0x0250, 0x4003, - 0x60c3, 0x0010, 0x0804, 0x962a, 0x080c, 0x912e, 0x9006, 0x080c, - 0x678d, 0xb8a0, 0x9086, 0x007e, 0x1130, 0x7003, 0x0400, 0x620c, - 0xc2b4, 0x620e, 0x0058, 0x7814, 0x0096, 0x904d, 0x0120, 0x9006, - 0xa89a, 0xa8a6, 0xa8aa, 0x009e, 0x7003, 0x0300, 0xb8a0, 0x9086, - 0x007e, 0x1904, 0x900f, 0x00d6, 0x2069, 0x1944, 0x2001, 0x1836, - 0x2004, 0xd0a4, 0x0178, 0x6800, 0x700a, 0x6808, 0x9084, 0x2000, - 0x7012, 0x680c, 0x7016, 0x701f, 0x2710, 0x6818, 0x7022, 0x681c, - 0x7026, 0x0080, 0x6800, 0x700a, 0x6804, 0x700e, 0x6808, 0x080c, - 0x7207, 0x1118, 0x9084, 0x37ff, 0x0010, 0x9084, 0x3fff, 0x7012, - 0x680c, 0x7016, 0x00de, 0x20a9, 0x0004, 0x20e1, 0x0001, 0x2099, - 0x1805, 0x20e9, 0x0000, 0x20a1, 0x0256, 0x4003, 0x20a9, 0x0004, - 0x2099, 0x1801, 0x20a1, 0x025a, 0x4003, 0x00d6, 0x080c, 0x9ed6, - 0x2069, 0x194c, 0x2071, 0x024e, 0x6800, 0xc0dd, 0x7002, 0x080c, - 0x55df, 0xd0e4, 0x0110, 0x680c, 0x700e, 0x00de, 0x04a0, 0x2001, - 0x1836, 0x2004, 0xd0a4, 0x0168, 0x0016, 0x2009, 0x0002, 0x60e0, - 0x9106, 0x0130, 0x2100, 0x60e3, 0x0000, 0x080c, 0x27e2, 0x61e2, - 0x001e, 0x20e1, 0x0001, 0x2099, 0x1944, 0x20e9, 0x0000, 0x20a1, - 0x024e, 0x20a9, 0x0008, 0x4003, 0x20a9, 0x0004, 0x2099, 0x1805, - 0x20a1, 0x0256, 0x4003, 0x20a9, 0x0004, 0x2099, 0x1801, 0x20a1, - 0x025a, 0x4003, 0x080c, 0x9ed6, 0x20a1, 0x024e, 0x20a9, 0x0008, - 0x2099, 0x194c, 0x4003, 0x60c3, 0x0074, 0x0804, 0x962a, 0x080c, - 0x912e, 0x7003, 0x2010, 0x7007, 0x0014, 0x700b, 0x0800, 0x700f, - 0x2000, 0x9006, 0x00f6, 0x2079, 0x185b, 0x7904, 0x00fe, 0xd1ac, - 0x1110, 0x9085, 0x0020, 0x0010, 0x9085, 0x0010, 0x9085, 0x0002, - 0x00d6, 0x0804, 0x90de, 0x7026, 0x60c3, 0x0014, 0x0804, 0x962a, - 0x080c, 0x912e, 0x7003, 0x5000, 0x0804, 0x8fbe, 0x080c, 0x912e, - 0x7003, 0x2110, 0x7007, 0x0014, 0x60c3, 0x0014, 0x0804, 0x962a, - 0x080c, 0x9170, 0x0010, 0x080c, 0x9179, 0x7003, 0x0200, 0x60c3, - 0x0004, 0x0804, 0x962a, 0x080c, 0x9179, 0x7003, 0x0100, 0x700b, - 0x0003, 0x700f, 0x2a00, 0x60c3, 0x0008, 0x0804, 0x962a, 0x080c, - 0x9179, 0x7003, 0x0200, 0x0804, 0x8fbe, 0x080c, 0x9179, 0x7003, - 0x0100, 0x782c, 0x9005, 0x0110, 0x700a, 0x0010, 0x700b, 0x0003, - 0x7814, 0x700e, 0x60c3, 0x0008, 0x0804, 0x962a, 0x00d6, 0x080c, - 0x9179, 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, 0x185b, 0x7904, 0x00fe, - 0xd1ac, 0x1110, 0x9085, 0x0020, 0x0010, 0x9085, 0x0010, 0x2009, - 0x187d, 0x210c, 0xd184, 0x1110, 0x9085, 0x0002, 0x0026, 0x2009, - 0x187b, 0x210c, 0xd1e4, 0x0150, 0xc0c5, 0xbabc, 0xd28c, 0x1108, - 0xc0cd, 0x9094, 0x0030, 0x9296, 0x0010, 0x0140, 0xd1ec, 0x0130, - 0x9094, 0x0030, 0x9296, 0x0010, 0x0108, 0xc0bd, 0x002e, 0x7026, - 0x60c3, 0x0014, 0x00de, 0x0804, 0x962a, 0x080c, 0x9179, 0x7003, - 0x0210, 0x7007, 0x0014, 0x700f, 0x0100, 0x60c3, 0x0014, 0x0804, - 0x962a, 0x080c, 0x9179, 0x7003, 0x0200, 0x0804, 0x8f44, 0x080c, - 0x9179, 0x7003, 0x0100, 0x700b, 0x0003, 0x700f, 0x2a00, 0x60c3, - 0x0008, 0x0804, 0x962a, 0x080c, 0x9179, 0x7003, 0x0100, 0x700b, - 0x000b, 0x60c3, 0x0008, 0x0804, 0x962a, 0x0026, 0x00d6, 0x0036, - 0x0046, 0x2019, 0x3200, 0x2021, 0x0800, 0x0040, 0x0026, 0x00d6, - 0x0036, 0x0046, 0x2019, 0x2200, 0x2021, 0x0100, 0x080c, 0x9eeb, - 0xb810, 0x9305, 0x7002, 0xb814, 0x7006, 0x2069, 0x1800, 0x6878, - 0x700a, 0x687c, 0x700e, 0x9485, 0x0029, 0x7012, 0x004e, 0x003e, - 0x00de, 0x080c, 0x9618, 0x721a, 0x9f95, 0x0000, 0x7222, 0x7027, - 0xffff, 0x2071, 0x024c, 0x002e, 0x0005, 0x0026, 0x080c, 0x9eeb, - 0x7003, 0x02ff, 0x7007, 0xfffc, 0x00d6, 0x2069, 0x1800, 0x6878, - 0x700a, 0x687c, 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, 0x9eeb, 0xb810, 0x9305, 0x7002, 0xb814, 0x7006, - 0x2069, 0x1800, 0xb810, 0x9005, 0x1140, 0xb814, 0x9005, 0x1128, - 0x700b, 0x00ff, 0x700f, 0xfffe, 0x0020, 0x6878, 0x700a, 0x687c, - 0x700e, 0x0000, 0x9485, 0x0098, 0x7012, 0x004e, 0x003e, 0x00de, - 0x080c, 0x9618, 0x721a, 0x7a08, 0x7222, 0x2f10, 0x7226, 0x2071, - 0x024c, 0x002e, 0x0005, 0x080c, 0x9618, 0x721a, 0x7a08, 0x7222, - 0x7814, 0x7026, 0x2071, 0x024c, 0x002e, 0x0005, 0x00b6, 0x00c6, - 0x00d6, 0x00e6, 0x00f6, 0x2069, 0x0200, 0x2071, 0x0240, 0x6004, - 0x908a, 0x0085, 0x0a0c, 0x0dfa, 0x908a, 0x0092, 0x1a0c, 0x0dfa, - 0x6110, 0x2158, 0xb9b0, 0x2c78, 0x2061, 0x0100, 0x619a, 0x9082, - 0x0085, 0x0033, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, 0x0005, - 0x91e7, 0x91f6, 0x9201, 0x91e5, 0x91e5, 0x91e5, 0x91e7, 0x91e5, - 0x91e5, 0x91e5, 0x91e5, 0x91e5, 0x91e5, 0x080c, 0x0dfa, 0x0411, - 0x60c3, 0x0000, 0x0026, 0x080c, 0x2afe, 0x0228, 0x2011, 0x0101, - 0x2204, 0xc0c5, 0x2012, 0x002e, 0x0804, 0x962a, 0x0431, 0x7808, - 0x700a, 0x7814, 0x700e, 0x7017, 0xffff, 0x60c3, 0x000c, 0x0804, - 0x962a, 0x04a1, 0x7003, 0x0003, 0x7007, 0x0300, 0x60c3, 0x0004, - 0x0804, 0x962a, 0x0026, 0x080c, 0x9eeb, 0xb810, 0x9085, 0x8100, - 0x7002, 0xb814, 0x7006, 0x2069, 0x1800, 0x6878, 0x700a, 0x687c, - 0x700e, 0x7013, 0x0009, 0x0804, 0x9149, 0x0026, 0x080c, 0x9eeb, - 0xb810, 0x9085, 0x8400, 0x7002, 0xb814, 0x7006, 0x2069, 0x1800, - 0x6878, 0x700a, 0x687c, 0x700e, 0x2001, 0x0099, 0x7a20, 0x9296, - 0x0005, 0x0108, 0xc0bc, 0x7012, 0x0804, 0x91ab, 0x0026, 0x080c, - 0x9eeb, 0xb810, 0x9085, 0x8500, 0x7002, 0xb814, 0x7006, 0x2069, + 0x20a3, 0x0000, 0x8000, 0x1de0, 0x0005, 0x080c, 0x90e7, 0x7003, + 0x7800, 0x7808, 0x8007, 0x700a, 0x60c3, 0x0008, 0x0804, 0x95ee, + 0x00d6, 0x00e6, 0x080c, 0x9132, 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, 0x8e78, 0x2069, 0x1801, 0x20a9, + 0x0004, 0x2d76, 0x8d68, 0x8e70, 0x1f04, 0x8e81, 0x9096, 0xdf00, + 0x0130, 0x9096, 0xe000, 0x0118, 0x60c3, 0x0018, 0x00f0, 0x2069, + 0x198e, 0x9086, 0xdf00, 0x0110, 0x2069, 0x19a8, 0x20a9, 0x001a, + 0x9e86, 0x0260, 0x1148, 0x00c6, 0x2061, 0x0200, 0x6010, 0x8000, + 0x6012, 0x00ce, 0x2071, 0x0240, 0x2d04, 0x8007, 0x2072, 0x8d68, + 0x8e70, 0x1f04, 0x8e98, 0x60c3, 0x004c, 0x080c, 0x95ee, 0x00ee, + 0x00de, 0x0005, 0x080c, 0x90e7, 0x7003, 0x6300, 0x7007, 0x0028, + 0x7808, 0x700e, 0x60c3, 0x0008, 0x0804, 0x95ee, 0x00d6, 0x0026, + 0x0016, 0x080c, 0x9132, 0x7003, 0x0200, 0x7814, 0x700e, 0x00e6, + 0x9ef0, 0x0004, 0x2009, 0x0001, 0x2011, 0x000c, 0x2073, 0x0800, + 0x8e70, 0x2073, 0x0000, 0x00ee, 0x7206, 0x710a, 0x62c2, 0x080c, + 0x95ee, 0x001e, 0x002e, 0x00de, 0x0005, 0x2001, 0x1817, 0x2004, + 0x609a, 0x0804, 0x95ee, 0x080c, 0x90e7, 0x7003, 0x5200, 0x2069, + 0x185b, 0x6804, 0xd084, 0x0130, 0x6828, 0x0016, 0x080c, 0x26a0, + 0x710e, 0x001e, 0x20a9, 0x0004, 0x20e1, 0x0001, 0x2099, 0x1805, + 0x20e9, 0x0000, 0x20a1, 0x0250, 0x4003, 0x20a9, 0x0004, 0x2099, + 0x1801, 0x20a1, 0x0254, 0x4003, 0x080c, 0x9f69, 0x1120, 0xb8a0, + 0x9082, 0x007f, 0x0248, 0x2001, 0x181e, 0x2004, 0x7032, 0x2001, + 0x181f, 0x2004, 0x7036, 0x0030, 0x2001, 0x1817, 0x2004, 0x9084, + 0x00ff, 0x7036, 0x60c3, 0x001c, 0x0804, 0x95ee, 0x080c, 0x90e7, + 0x7003, 0x0500, 0x080c, 0x9f69, 0x1120, 0xb8a0, 0x9082, 0x007f, + 0x0248, 0x2001, 0x181e, 0x2004, 0x700a, 0x2001, 0x181f, 0x2004, + 0x700e, 0x0030, 0x2001, 0x1817, 0x2004, 0x9084, 0x00ff, 0x700e, + 0x20a9, 0x0004, 0x20e1, 0x0001, 0x2099, 0x1805, 0x20e9, 0x0000, + 0x20a1, 0x0250, 0x4003, 0x60c3, 0x0010, 0x0804, 0x95ee, 0x080c, + 0x90e7, 0x9006, 0x080c, 0x6693, 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, 0x8fc8, 0x00d6, 0x2069, + 0x1946, 0x2001, 0x1836, 0x2004, 0xd0a4, 0x0178, 0x6800, 0x700a, + 0x6808, 0x9084, 0x2000, 0x7012, 0x680c, 0x7016, 0x701f, 0x2710, + 0x6818, 0x7022, 0x681c, 0x7026, 0x00f0, 0x6800, 0x700a, 0x6804, + 0x700e, 0x2001, 0x0002, 0x00f6, 0x2079, 0x0100, 0x080c, 0x717e, + 0x1128, 0x78e3, 0x0000, 0x080c, 0x26e1, 0x78e2, 0x00fe, 0x6808, + 0x080c, 0x717e, 0x1118, 0x9084, 0x37ff, 0x0010, 0x9084, 0x3fff, + 0x7012, 0x680c, 0x7016, 0x00de, 0x20a9, 0x0004, 0x20e1, 0x0001, + 0x2099, 0x1805, 0x20e9, 0x0000, 0x20a1, 0x0256, 0x4003, 0x20a9, + 0x0004, 0x2099, 0x1801, 0x20a1, 0x025a, 0x4003, 0x00d6, 0x080c, + 0x9ddd, 0x2069, 0x194e, 0x2071, 0x024e, 0x6800, 0xc0dd, 0x7002, + 0x080c, 0x54df, 0xd0e4, 0x0110, 0x680c, 0x700e, 0x00de, 0x04a0, + 0x2001, 0x1836, 0x2004, 0xd0a4, 0x0168, 0x0016, 0x2009, 0x0002, + 0x60e0, 0x9106, 0x0130, 0x2100, 0x60e3, 0x0000, 0x080c, 0x26e1, + 0x61e2, 0x001e, 0x20e1, 0x0001, 0x2099, 0x1946, 0x20e9, 0x0000, + 0x20a1, 0x024e, 0x20a9, 0x0008, 0x4003, 0x20a9, 0x0004, 0x2099, + 0x1805, 0x20a1, 0x0256, 0x4003, 0x20a9, 0x0004, 0x2099, 0x1801, + 0x20a1, 0x025a, 0x4003, 0x080c, 0x9ddd, 0x20a1, 0x024e, 0x20a9, + 0x0008, 0x2099, 0x194e, 0x4003, 0x60c3, 0x0074, 0x0804, 0x95ee, + 0x080c, 0x90e7, 0x7003, 0x2010, 0x7007, 0x0014, 0x700b, 0x0800, + 0x700f, 0x2000, 0x9006, 0x00f6, 0x2079, 0x185b, 0x7904, 0x00fe, + 0xd1ac, 0x1110, 0x9085, 0x0020, 0x0010, 0x9085, 0x0010, 0x9085, + 0x0002, 0x00d6, 0x0804, 0x9097, 0x7026, 0x60c3, 0x0014, 0x0804, + 0x95ee, 0x080c, 0x90e7, 0x7003, 0x5000, 0x0804, 0x8f69, 0x080c, + 0x90e7, 0x7003, 0x2110, 0x7007, 0x0014, 0x60c3, 0x0014, 0x0804, + 0x95ee, 0x080c, 0x9129, 0x0010, 0x080c, 0x9132, 0x7003, 0x0200, + 0x60c3, 0x0004, 0x0804, 0x95ee, 0x080c, 0x9132, 0x7003, 0x0100, + 0x700b, 0x0003, 0x700f, 0x2a00, 0x60c3, 0x0008, 0x0804, 0x95ee, + 0x080c, 0x9132, 0x7003, 0x0200, 0x0804, 0x8f69, 0x080c, 0x9132, + 0x7003, 0x0100, 0x782c, 0x9005, 0x0110, 0x700a, 0x0010, 0x700b, + 0x0003, 0x7814, 0x700e, 0x60c3, 0x0008, 0x0804, 0x95ee, 0x00d6, + 0x080c, 0x9132, 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, 0x185b, 0x7904, + 0x00fe, 0xd1ac, 0x1110, 0x9085, 0x0020, 0x0010, 0x9085, 0x0010, + 0x2009, 0x187d, 0x210c, 0xd184, 0x1110, 0x9085, 0x0002, 0x0026, + 0x2009, 0x187b, 0x210c, 0xd1e4, 0x0150, 0xc0c5, 0xbabc, 0xd28c, + 0x1108, 0xc0cd, 0x9094, 0x0030, 0x9296, 0x0010, 0x0140, 0xd1ec, + 0x0130, 0x9094, 0x0030, 0x9296, 0x0010, 0x0108, 0xc0bd, 0x002e, + 0x7026, 0x60c3, 0x0014, 0x00de, 0x0804, 0x95ee, 0x080c, 0x9132, + 0x7003, 0x0210, 0x7007, 0x0014, 0x700f, 0x0100, 0x60c3, 0x0014, + 0x0804, 0x95ee, 0x080c, 0x9132, 0x7003, 0x0200, 0x0804, 0x8ee7, + 0x080c, 0x9132, 0x7003, 0x0100, 0x700b, 0x0003, 0x700f, 0x2a00, + 0x60c3, 0x0008, 0x0804, 0x95ee, 0x080c, 0x9132, 0x7003, 0x0100, + 0x700b, 0x000b, 0x60c3, 0x0008, 0x0804, 0x95ee, 0x0026, 0x00d6, + 0x0036, 0x0046, 0x2019, 0x3200, 0x2021, 0x0800, 0x0040, 0x0026, + 0x00d6, 0x0036, 0x0046, 0x2019, 0x2200, 0x2021, 0x0100, 0x080c, + 0x9df2, 0xb810, 0x9305, 0x7002, 0xb814, 0x7006, 0x2069, 0x1800, + 0x6878, 0x700a, 0x687c, 0x700e, 0x9485, 0x0029, 0x7012, 0x004e, + 0x003e, 0x00de, 0x080c, 0x95dc, 0x721a, 0x9f95, 0x0000, 0x7222, + 0x7027, 0xffff, 0x2071, 0x024c, 0x002e, 0x0005, 0x0026, 0x080c, + 0x9df2, 0x7003, 0x02ff, 0x7007, 0xfffc, 0x00d6, 0x2069, 0x1800, + 0x6878, 0x700a, 0x687c, 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, 0x9df2, 0xb810, 0x9305, 0x7002, 0xb814, + 0x7006, 0x2069, 0x1800, 0xb810, 0x9005, 0x1140, 0xb814, 0x9005, + 0x1128, 0x700b, 0x00ff, 0x700f, 0xfffe, 0x0020, 0x6878, 0x700a, + 0x687c, 0x700e, 0x0000, 0x9485, 0x0098, 0x7012, 0x004e, 0x003e, + 0x00de, 0x080c, 0x95dc, 0x721a, 0x7a08, 0x7222, 0x2f10, 0x7226, + 0x2071, 0x024c, 0x002e, 0x0005, 0x080c, 0x95dc, 0x721a, 0x7a08, + 0x7222, 0x7814, 0x7026, 0x2071, 0x024c, 0x002e, 0x0005, 0x00b6, + 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x2069, 0x0200, 0x2071, 0x0240, + 0x6004, 0x908a, 0x0085, 0x0a0c, 0x0df6, 0x908a, 0x0092, 0x1a0c, + 0x0df6, 0x6110, 0x2158, 0xb9b0, 0x2c78, 0x2061, 0x0100, 0x619a, + 0x9082, 0x0085, 0x0033, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, + 0x0005, 0x91a0, 0x91af, 0x91ba, 0x919e, 0x919e, 0x919e, 0x91a0, + 0x919e, 0x919e, 0x919e, 0x919e, 0x919e, 0x919e, 0x080c, 0x0df6, + 0x0411, 0x60c3, 0x0000, 0x0026, 0x080c, 0x29e9, 0x0228, 0x2011, + 0x0101, 0x2204, 0xc0c5, 0x2012, 0x002e, 0x0804, 0x95ee, 0x0431, + 0x7808, 0x700a, 0x7814, 0x700e, 0x7017, 0xffff, 0x60c3, 0x000c, + 0x0804, 0x95ee, 0x04a1, 0x7003, 0x0003, 0x7007, 0x0300, 0x60c3, + 0x0004, 0x0804, 0x95ee, 0x0026, 0x080c, 0x9df2, 0xb810, 0x9085, + 0x8100, 0x7002, 0xb814, 0x7006, 0x2069, 0x1800, 0x6878, 0x700a, + 0x687c, 0x700e, 0x7013, 0x0009, 0x0804, 0x9102, 0x0026, 0x080c, + 0x9df2, 0xb810, 0x9085, 0x8400, 0x7002, 0xb814, 0x7006, 0x2069, 0x1800, 0x6878, 0x700a, 0x687c, 0x700e, 0x2001, 0x0099, 0x7a20, - 0x9296, 0x0005, 0x0108, 0xc0bc, 0x7012, 0x0804, 0x91ab, 0x00b6, - 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x2c78, 0x2069, 0x0200, 0x2071, - 0x0240, 0x7804, 0x908a, 0x0040, 0x0a0c, 0x0dfa, 0x908a, 0x0054, - 0x1a0c, 0x0dfa, 0x7910, 0x2158, 0xb9b0, 0x2061, 0x0100, 0x619a, - 0x9082, 0x0040, 0x0033, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, - 0x0005, 0x9286, 0x9342, 0x9315, 0x9464, 0x9284, 0x9284, 0x9284, - 0x9284, 0x9284, 0x9284, 0x9284, 0x9a2b, 0x9a33, 0x9a3b, 0x9a43, - 0x9284, 0x9e33, 0x9284, 0x9a23, 0x080c, 0x0dfa, 0x0096, 0x780b, - 0xffff, 0x080c, 0x92f1, 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, 0x181c, 0x0010, 0x080c, - 0x16db, 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, - 0x19db, 0x2003, 0x07d0, 0x2001, 0x19da, 0x2003, 0x0009, 0x009e, - 0x0005, 0x6813, 0x0008, 0xba8c, 0x8210, 0xb8bc, 0xd084, 0x0128, - 0x7a4a, 0x7b14, 0x7b46, 0x722e, 0x732a, 0x9294, 0x00ff, 0xba8e, - 0x8217, 0x721a, 0xba10, 0x9295, 0x0600, 0x7202, 0xba14, 0x7206, - 0x2069, 0x1800, 0x6a78, 0x720a, 0x6a7c, 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, 0x962a, - 0x6813, 0x0008, 0xb810, 0x9085, 0x0500, 0x7002, 0xb814, 0x7006, - 0x2069, 0x1800, 0x6878, 0x700a, 0x687c, 0x700e, 0x7013, 0x0889, - 0x080c, 0x9618, 0x721a, 0x7a08, 0x7222, 0x2f10, 0x7226, 0x2071, - 0x024c, 0x0005, 0x00d6, 0x0096, 0x080c, 0x9442, 0x7814, 0x2048, - 0x080c, 0xbe35, 0x1130, 0x7814, 0x9084, 0x0700, 0x8007, 0x0033, - 0x0010, 0x9006, 0x001b, 0x009e, 0x00de, 0x0005, 0x9360, 0x93c9, - 0x93d9, 0x93ff, 0x940b, 0x941c, 0x9424, 0x935e, 0x080c, 0x0dfa, - 0x0016, 0x0036, 0xa97c, 0x918c, 0x0003, 0x0118, 0x9186, 0x0003, - 0x1198, 0xaba8, 0x7824, 0xd0cc, 0x1168, 0x7316, 0xa898, 0x701a, - 0xa894, 0x701e, 0x003e, 0x001e, 0x2001, 0x1989, 0x2004, 0x60c2, - 0x0804, 0x962a, 0xc3e5, 0x0c88, 0x9186, 0x0001, 0x190c, 0x0dfa, - 0xaba8, 0x7824, 0xd0cc, 0x1904, 0x93c6, 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, - 0xc084, 0x6812, 0x015e, 0x9184, 0x0003, 0x0118, 0x2019, 0x0245, - 0x201a, 0x61c2, 0x003e, 0x001e, 0x0804, 0x962a, 0xc3e5, 0x0804, - 0x9385, 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, 0x962a, 0x2011, - 0x0028, 0x7824, 0xd0cc, 0x1128, 0x7216, 0x60c3, 0x0018, 0x0804, - 0x962a, 0x0cd0, 0xc2e5, 0x2011, 0x0100, 0x7824, 0xd0cc, 0x0108, - 0xc2e5, 0x7216, 0x702f, 0x0008, 0x7858, 0x9084, 0x00ff, 0x7036, - 0x60c3, 0x0020, 0x0804, 0x962a, 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, 0x6878, 0x700a, 0x687c, - 0x700e, 0x7824, 0xd0cc, 0x1168, 0x7013, 0x0898, 0x080c, 0x9618, - 0x721a, 0x7a08, 0x7222, 0x2f10, 0x7226, 0x2071, 0x024c, 0x00de, - 0x0005, 0x7013, 0x0889, 0x0c90, 0x0016, 0x7814, 0x9084, 0x0700, - 0x8007, 0x0013, 0x001e, 0x0005, 0x9474, 0x9474, 0x9476, 0x9474, - 0x9474, 0x9474, 0x9490, 0x9474, 0x080c, 0x0dfa, 0x7914, 0x918c, - 0x08ff, 0x918d, 0xf600, 0x7916, 0x2009, 0x0003, 0x00b9, 0x2069, - 0x185b, 0x6804, 0xd0bc, 0x0130, 0x682c, 0x9084, 0x00ff, 0x8007, - 0x7032, 0x0010, 0x7033, 0x3f00, 0x60c3, 0x0001, 0x0804, 0x962a, - 0x2009, 0x0003, 0x0019, 0x7033, 0x7f00, 0x0cb0, 0x0016, 0x080c, - 0x9eeb, 0x001e, 0xb810, 0x9085, 0x0100, 0x7002, 0xb814, 0x7006, - 0x2069, 0x1800, 0x6a78, 0x720a, 0x6a7c, 0x720e, 0x7013, 0x0888, - 0x918d, 0x0008, 0x7116, 0x080c, 0x9618, 0x721a, 0x7a08, 0x7222, - 0x2f10, 0x7226, 0x0005, 0x00b6, 0x0096, 0x00e6, 0x00d6, 0x00c6, - 0x0056, 0x0046, 0x0036, 0x2061, 0x0100, 0x2071, 0x1800, 0x7810, - 0x2058, 0xb8a0, 0x2028, 0xb910, 0xba14, 0x7378, 0x747c, 0x7820, - 0x90be, 0x0006, 0x0904, 0x9587, 0x90be, 0x000a, 0x1904, 0x9543, - 0xb8b0, 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, 0xb8b0, 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, 0x9ed0, 0x2009, + 0x9296, 0x0005, 0x0108, 0xc0bc, 0x7012, 0x0804, 0x9164, 0x0026, + 0x080c, 0x9df2, 0xb810, 0x9085, 0x8500, 0x7002, 0xb814, 0x7006, + 0x2069, 0x1800, 0x6878, 0x700a, 0x687c, 0x700e, 0x2001, 0x0099, + 0x7a20, 0x9296, 0x0005, 0x0108, 0xc0bc, 0x7012, 0x0804, 0x9164, + 0x00b6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x2c78, 0x2069, 0x0200, + 0x2071, 0x0240, 0x7804, 0x908a, 0x0040, 0x0a0c, 0x0df6, 0x908a, + 0x0054, 0x1a0c, 0x0df6, 0x7910, 0x2158, 0xb9b0, 0x2061, 0x0100, + 0x619a, 0x9082, 0x0040, 0x0033, 0x00fe, 0x00ee, 0x00de, 0x00ce, + 0x00be, 0x0005, 0x923f, 0x9306, 0x92d9, 0x9428, 0x923d, 0x923d, + 0x923d, 0x923d, 0x923d, 0x923d, 0x923d, 0x993c, 0x9941, 0x9946, + 0x994b, 0x923d, 0x9d3a, 0x923d, 0x9937, 0x080c, 0x0df6, 0x0096, + 0x780b, 0xffff, 0x080c, 0x92aa, 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, 0x1792, 0x0010, + 0x080c, 0x1651, 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, 0x19de, 0x2003, 0x07d0, 0x2001, 0x19dd, 0x2003, 0x0009, + 0x009e, 0x0005, 0x6813, 0x0008, 0xba8c, 0x8210, 0xb8bc, 0xd084, + 0x0180, 0x2001, 0x1aa1, 0x200c, 0x8108, 0x2102, 0x2001, 0x1aa0, + 0x201c, 0x1218, 0x8318, 0x2302, 0x0ea0, 0x794a, 0x712e, 0x7b46, + 0x732a, 0x9294, 0x00ff, 0xba8e, 0x8217, 0x721a, 0xba10, 0x9295, + 0x0600, 0x7202, 0xba14, 0x7206, 0x2069, 0x1800, 0x6a78, 0x720a, + 0x6a7c, 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, 0x95ee, 0x6813, 0x0008, 0xb810, 0x9085, + 0x0500, 0x7002, 0xb814, 0x7006, 0x2069, 0x1800, 0x6878, 0x700a, + 0x687c, 0x700e, 0x7013, 0x0889, 0x080c, 0x95dc, 0x721a, 0x7a08, + 0x7222, 0x2f10, 0x7226, 0x2071, 0x024c, 0x0005, 0x00d6, 0x0096, + 0x080c, 0x9406, 0x7814, 0x2048, 0x080c, 0xbd4c, 0x1130, 0x7814, + 0x9084, 0x0700, 0x8007, 0x0033, 0x0010, 0x9006, 0x001b, 0x009e, + 0x00de, 0x0005, 0x9324, 0x938d, 0x939d, 0x93c3, 0x93cf, 0x93e0, + 0x93e8, 0x9322, 0x080c, 0x0df6, 0x0016, 0x0036, 0xa97c, 0x918c, + 0x0003, 0x0118, 0x9186, 0x0003, 0x1198, 0xaba8, 0x7824, 0xd0cc, + 0x1168, 0x7316, 0xa898, 0x701a, 0xa894, 0x701e, 0x003e, 0x001e, + 0x2001, 0x198c, 0x2004, 0x60c2, 0x0804, 0x95ee, 0xc3e5, 0x0c88, + 0x9186, 0x0001, 0x190c, 0x0df6, 0xaba8, 0x7824, 0xd0cc, 0x1904, + 0x938a, 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, 0x95ee, 0xc3e5, 0x0804, 0x9349, 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, 0x95ee, 0x2011, 0x0028, 0x7824, 0xd0cc, 0x1128, + 0x7216, 0x60c3, 0x0018, 0x0804, 0x95ee, 0x0cd0, 0xc2e5, 0x2011, + 0x0100, 0x7824, 0xd0cc, 0x0108, 0xc2e5, 0x7216, 0x702f, 0x0008, + 0x7858, 0x9084, 0x00ff, 0x7036, 0x60c3, 0x0020, 0x0804, 0x95ee, + 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, 0x6878, 0x700a, 0x687c, 0x700e, 0x7824, 0xd0cc, 0x1168, + 0x7013, 0x0898, 0x080c, 0x95dc, 0x721a, 0x7a08, 0x7222, 0x2f10, + 0x7226, 0x2071, 0x024c, 0x00de, 0x0005, 0x7013, 0x0889, 0x0c90, + 0x0016, 0x7814, 0x9084, 0x0700, 0x8007, 0x0013, 0x001e, 0x0005, + 0x9438, 0x9438, 0x943a, 0x9438, 0x9438, 0x9438, 0x9454, 0x9438, + 0x080c, 0x0df6, 0x7914, 0x918c, 0x08ff, 0x918d, 0xf600, 0x7916, + 0x2009, 0x0003, 0x00b9, 0x2069, 0x185b, 0x6804, 0xd0bc, 0x0130, + 0x682c, 0x9084, 0x00ff, 0x8007, 0x7032, 0x0010, 0x7033, 0x3f00, + 0x60c3, 0x0001, 0x0804, 0x95ee, 0x2009, 0x0003, 0x0019, 0x7033, + 0x7f00, 0x0cb0, 0x0016, 0x080c, 0x9df2, 0x001e, 0xb810, 0x9085, + 0x0100, 0x7002, 0xb814, 0x7006, 0x2069, 0x1800, 0x6a78, 0x720a, + 0x6a7c, 0x720e, 0x7013, 0x0888, 0x918d, 0x0008, 0x7116, 0x080c, + 0x95dc, 0x721a, 0x7a08, 0x7222, 0x2f10, 0x7226, 0x0005, 0x00b6, + 0x0096, 0x00e6, 0x00d6, 0x00c6, 0x0056, 0x0046, 0x0036, 0x2061, + 0x0100, 0x2071, 0x1800, 0x7810, 0x2058, 0xb8a0, 0x2028, 0xb910, + 0xba14, 0x7378, 0x747c, 0x7820, 0x90be, 0x0006, 0x0904, 0x954b, + 0x90be, 0x000a, 0x1904, 0x9507, 0xb8b0, 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, 0xb8b0, 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, 0x9dd7, 0x2009, 0x07d0, 0x60c4, 0x9084, 0xfff0, + 0x9005, 0x0110, 0x2009, 0x1b58, 0x080c, 0x82de, 0x003e, 0x004e, + 0x005e, 0x00ce, 0x00de, 0x00ee, 0x009e, 0x00be, 0x0005, 0x7804, + 0x9086, 0x0040, 0x0904, 0x9587, 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, 0xbab0, 0x629e, 0x080c, 0x9dd7, 0x2009, 0x07d0, 0x60c4, 0x9084, 0xfff0, 0x9005, 0x0110, 0x2009, 0x1b58, - 0x080c, 0x835f, 0x003e, 0x004e, 0x005e, 0x00ce, 0x00de, 0x00ee, - 0x009e, 0x00be, 0x0005, 0x7804, 0x9086, 0x0040, 0x0904, 0x95c3, - 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, 0xbab0, - 0x629e, 0x080c, 0x9ed0, 0x2009, 0x07d0, 0x60c4, 0x9084, 0xfff0, - 0x9005, 0x0110, 0x2009, 0x1b58, 0x080c, 0x835f, 0x003e, 0x004e, - 0x005e, 0x00ce, 0x00de, 0x00ee, 0x009e, 0x00be, 0x0005, 0x7814, - 0x2048, 0xa87c, 0x9084, 0x0003, 0x9086, 0x0002, 0x0904, 0x95df, - 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, 0xbab0, 0x629e, 0x080c, - 0x9ead, 0x0804, 0x9573, 0xb8bc, 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, 0x9556, 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, 0xbab0, 0x629e, 0x7824, 0xd0cc, 0x0120, - 0x080c, 0x9ed0, 0x0804, 0x9573, 0x080c, 0x9ead, 0x0804, 0x9573, - 0x7a10, 0x00b6, 0x2258, 0xba8c, 0x8210, 0x9294, 0x00ff, 0xba8e, - 0x00be, 0x8217, 0x0005, 0x00d6, 0x2069, 0x19bf, 0x6843, 0x0001, - 0x00de, 0x0005, 0x60a3, 0x0056, 0x60a7, 0x9575, 0x00f1, 0x080c, - 0x8351, 0x0005, 0x0016, 0x2001, 0x180c, 0x200c, 0x9184, 0x0600, - 0x9086, 0x0600, 0x0128, 0x0089, 0x080c, 0x8351, 0x001e, 0x0005, - 0xc1e5, 0x2001, 0x180c, 0x2102, 0x2001, 0x19c0, 0x2003, 0x0000, - 0x2001, 0x19c8, 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, 0x7207, 0x11c0, 0x2001, - 0x19db, 0x2004, 0x9005, 0x15d0, 0x080c, 0x72d2, 0x1160, 0x2061, - 0x0100, 0x6020, 0xd0b4, 0x1120, 0x6024, 0xd084, 0x090c, 0x0dfa, - 0x080c, 0x8351, 0x0458, 0x00c6, 0x2061, 0x19bf, 0x00c8, 0x6904, - 0x9194, 0x4000, 0x0540, 0x0811, 0x080c, 0x2c98, 0x00c6, 0x2061, - 0x19bf, 0x6128, 0x9192, 0x0008, 0x1258, 0x8108, 0x612a, 0x6124, - 0x00ce, 0x81ff, 0x0198, 0x080c, 0x8351, 0x080c, 0x964d, 0x0070, - 0x6124, 0x91e5, 0x0000, 0x0140, 0x080c, 0xdc28, 0x080c, 0x835a, - 0x2009, 0x0014, 0x080c, 0xa15d, 0x00ce, 0x0000, 0x002e, 0x001e, - 0x00de, 0x00ce, 0x0005, 0x2001, 0x19db, 0x2004, 0x9005, 0x1db0, - 0x00c6, 0x2061, 0x19bf, 0x6128, 0x9192, 0x0003, 0x1e08, 0x8108, - 0x612a, 0x00ce, 0x080c, 0x8351, 0x080c, 0x5dea, 0x2009, 0x185a, - 0x2114, 0x8210, 0x220a, 0x0c10, 0x0096, 0x00c6, 0x00d6, 0x00e6, - 0x0016, 0x0026, 0x080c, 0x8367, 0x2071, 0x19bf, 0x713c, 0x81ff, - 0x0904, 0x974a, 0x2061, 0x0100, 0x2069, 0x0140, 0x080c, 0x7207, - 0x1190, 0x0036, 0x2019, 0x0002, 0x080c, 0x999d, 0x003e, 0x713c, - 0x2160, 0x080c, 0xdc28, 0x2009, 0x004a, 0x080c, 0xa15d, 0x080c, - 0x72d2, 0x0804, 0x974a, 0x080c, 0x9756, 0x0904, 0x974a, 0x6904, - 0xd1f4, 0x0904, 0x9751, 0x080c, 0x2c98, 0x00c6, 0x703c, 0x9065, - 0x090c, 0x0dfa, 0x6020, 0x00ce, 0x9086, 0x0006, 0x1568, 0x61c8, + 0x080c, 0x82de, 0x003e, 0x004e, 0x005e, 0x00ce, 0x00de, 0x00ee, + 0x009e, 0x00be, 0x0005, 0x7814, 0x2048, 0xa87c, 0x9084, 0x0003, + 0x9086, 0x0002, 0x0904, 0x95a3, 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, 0xbab0, 0x629e, 0x080c, 0x9db4, 0x0804, 0x9537, 0xb8bc, + 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, 0x951a, 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, 0xbab0, + 0x629e, 0x7824, 0xd0cc, 0x0120, 0x080c, 0x9dd7, 0x0804, 0x9537, + 0x080c, 0x9db4, 0x0804, 0x9537, 0x7a10, 0x00b6, 0x2258, 0xba8c, + 0x8210, 0x9294, 0x00ff, 0xba8e, 0x00be, 0x8217, 0x0005, 0x00d6, + 0x2069, 0x19c2, 0x6843, 0x0001, 0x00de, 0x0005, 0x60a3, 0x0056, + 0x60a7, 0x9575, 0x00f1, 0x080c, 0x82d0, 0x0005, 0x0016, 0x2001, + 0x180c, 0x200c, 0x9184, 0x0600, 0x9086, 0x0600, 0x0128, 0x0089, + 0x080c, 0x82d0, 0x001e, 0x0005, 0xc1e5, 0x2001, 0x180c, 0x2102, + 0x2001, 0x19c3, 0x2003, 0x0000, 0x2001, 0x19cb, 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, 0x717e, 0x11c0, 0x2001, 0x19de, 0x2004, 0x9005, 0x15d0, + 0x080c, 0x7246, 0x1160, 0x2061, 0x0100, 0x6020, 0xd0b4, 0x1120, + 0x6024, 0xd084, 0x090c, 0x0df6, 0x080c, 0x82d0, 0x0458, 0x00c6, + 0x2061, 0x19c2, 0x00c8, 0x6904, 0x9194, 0x4000, 0x0540, 0x0811, + 0x080c, 0x2b7f, 0x00c6, 0x2061, 0x19c2, 0x6128, 0x9192, 0x0008, + 0x1258, 0x8108, 0x612a, 0x6124, 0x00ce, 0x81ff, 0x0198, 0x080c, + 0x82d0, 0x080c, 0x9611, 0x0070, 0x6124, 0x91e5, 0x0000, 0x0140, + 0x080c, 0xdbf0, 0x080c, 0x82d9, 0x2009, 0x0014, 0x080c, 0xa068, + 0x00ce, 0x0000, 0x002e, 0x001e, 0x00de, 0x00ce, 0x0005, 0x2001, + 0x19de, 0x2004, 0x9005, 0x1db0, 0x00c6, 0x2061, 0x19c2, 0x6128, + 0x9192, 0x0003, 0x1e08, 0x8108, 0x612a, 0x00ce, 0x080c, 0x82d0, + 0x080c, 0x5cee, 0x2009, 0x185a, 0x2114, 0x8210, 0x220a, 0x0c10, + 0x0096, 0x00c6, 0x00d6, 0x00e6, 0x0016, 0x0026, 0x080c, 0x82e6, + 0x2071, 0x19c2, 0x713c, 0x81ff, 0x0904, 0x970a, 0x2061, 0x0100, + 0x2069, 0x0140, 0x080c, 0x717e, 0x1190, 0x0036, 0x2019, 0x0002, + 0x080c, 0x98b1, 0x003e, 0x713c, 0x2160, 0x080c, 0xdbf0, 0x2009, + 0x004a, 0x080c, 0xa068, 0x080c, 0x7246, 0x0804, 0x970a, 0x6904, + 0xd1f4, 0x0904, 0x9711, 0x080c, 0x2b7f, 0x00c6, 0x703c, 0x9065, + 0x090c, 0x0df6, 0x6020, 0x00ce, 0x9086, 0x0006, 0x1568, 0x61c8, 0x60c4, 0x9105, 0x1548, 0x2009, 0x180c, 0x2104, 0xd0d4, 0x0520, 0x6214, 0x9294, 0x1800, 0x1128, 0x6224, 0x9294, 0x0002, 0x1550, 0x0070, 0xc0d4, 0x200a, 0x0006, 0x2001, 0x0100, 0x2004, 0x9086, - 0x000a, 0x000e, 0x0120, 0xd0cc, 0x0110, 0x080c, 0x2bca, 0x6014, + 0x000a, 0x000e, 0x0120, 0xd0cc, 0x0110, 0x080c, 0x2ab1, 0x6014, 0x9084, 0xe7fd, 0x9085, 0x0010, 0x6016, 0x703c, 0x2060, 0x2009, - 0x0049, 0x080c, 0xa15d, 0x0070, 0x0036, 0x2019, 0x0001, 0x080c, - 0x999d, 0x003e, 0x713c, 0x2160, 0x080c, 0xdc28, 0x2009, 0x004a, - 0x080c, 0xa15d, 0x002e, 0x001e, 0x00ee, 0x00de, 0x00ce, 0x009e, - 0x0005, 0xd1ec, 0x1904, 0x9703, 0x0804, 0x9705, 0x00d6, 0x00c6, - 0x0096, 0x703c, 0x9065, 0x090c, 0x0dfa, 0x2001, 0x0306, 0x200c, - 0x9184, 0x0030, 0x0904, 0x97ff, 0x9184, 0x0048, 0x9086, 0x0008, - 0x1904, 0x97ff, 0x2009, 0x0206, 0x2104, 0x2009, 0x0203, 0x210c, - 0x9106, 0x1904, 0x97ff, 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, 0x97ff, 0x2009, 0x1a58, - 0x2104, 0x8000, 0x0208, 0x200a, 0x2069, 0x0100, 0x6914, 0x918c, - 0x0184, 0x918d, 0x0010, 0x6916, 0x69c8, 0x2011, 0x0020, 0x68c8, - 0x9106, 0x1570, 0x8211, 0x1dd8, 0x2001, 0x0306, 0x2003, 0x4800, - 0x2001, 0x009a, 0x2003, 0x0004, 0x2001, 0x1a3d, 0x2003, 0x0000, - 0x2001, 0x1a46, 0x2003, 0x0000, 0x6a88, 0x698c, 0x2200, 0x9105, - 0x1120, 0x2c10, 0x080c, 0x1afe, 0x0040, 0x6014, 0x2048, 0xaa3a, - 0xa936, 0x6ac4, 0x69c8, 0xa946, 0xaa4a, 0x0126, 0x00c6, 0x2091, - 0x2400, 0x002e, 0x080c, 0x1b8a, 0x190c, 0x0dfa, 0x012e, 0x0090, - 0x2009, 0x1a59, 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, 0x835f, 0x9006, 0x009e, 0x00ce, 0x00de, 0x0005, 0x9085, - 0x0001, 0x0cc8, 0x0026, 0x00e6, 0x2071, 0x19bf, 0x7048, 0xd084, - 0x01c0, 0x713c, 0x81ff, 0x01a8, 0x2071, 0x0100, 0x9188, 0x0008, - 0x2114, 0x928e, 0x0006, 0x1138, 0x7014, 0x9084, 0x1984, 0x9085, - 0x0012, 0x7016, 0x0030, 0x7014, 0x9084, 0x1984, 0x9085, 0x0016, - 0x7016, 0x00ee, 0x002e, 0x0005, 0x00b6, 0x00e6, 0x00d6, 0x00c6, - 0x0066, 0x0056, 0x0046, 0x0006, 0x0126, 0x2091, 0x8000, 0x6010, - 0x2058, 0xbca0, 0x2071, 0x19bf, 0x7018, 0x2058, 0x8bff, 0x0190, - 0xb8a0, 0x9406, 0x0118, 0xb854, 0x2058, 0x0cc0, 0x6014, 0x0096, - 0x2048, 0xac6c, 0xad70, 0xae78, 0x009e, 0x080c, 0x65d1, 0x0110, - 0x9085, 0x0001, 0x012e, 0x000e, 0x004e, 0x005e, 0x006e, 0x00ce, - 0x00de, 0x00ee, 0x00be, 0x0005, 0x080c, 0x912e, 0x7003, 0x1200, - 0x7838, 0x7012, 0x783c, 0x7016, 0x00c6, 0x7820, 0x9086, 0x0004, - 0x1148, 0x7810, 0x9005, 0x0130, 0x00b6, 0x2058, 0xb810, 0xb914, - 0x00be, 0x0020, 0x2061, 0x1800, 0x6078, 0x617c, 0x9084, 0x00ff, - 0x700a, 0x710e, 0x00ce, 0x60c3, 0x002c, 0x0804, 0x962a, 0x080c, - 0x912e, 0x7003, 0x0f00, 0x7808, 0xd09c, 0x0128, 0xb810, 0x9084, - 0x00ff, 0x700a, 0xb814, 0x700e, 0x60c3, 0x0008, 0x0804, 0x962a, - 0x0156, 0x080c, 0x9179, 0x7003, 0x0200, 0x2011, 0x1848, 0x63f0, - 0x2312, 0x20a9, 0x0006, 0x2011, 0x1840, 0x2019, 0x1841, 0x9ef0, - 0x0002, 0x2376, 0x8e70, 0x2276, 0x8e70, 0x9398, 0x0002, 0x9290, - 0x0002, 0x1f04, 0x9899, 0x60c3, 0x001c, 0x015e, 0x0804, 0x962a, - 0x0016, 0x0026, 0x080c, 0x9155, 0x080c, 0x9167, 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, 0x962a, 0x002e, 0x001e, 0x0005, - 0x20a9, 0x0010, 0x4003, 0x080c, 0x9ed6, 0x20a1, 0x0240, 0x22a8, - 0x4003, 0x0c68, 0x080c, 0x912e, 0x7003, 0x6200, 0x7808, 0x700e, - 0x60c3, 0x0008, 0x0804, 0x962a, 0x0016, 0x0026, 0x080c, 0x912e, - 0x20e9, 0x0000, 0x20a1, 0x024c, 0x7814, 0x0096, 0x2048, 0xa800, - 0x2048, 0xa860, 0x20e0, 0xa85c, 0x9080, 0x0023, 0x2098, 0x009e, - 0x7808, 0x9088, 0x0002, 0x21a8, 0x4003, 0x8003, 0x60c2, 0x080c, - 0x962a, 0x002e, 0x001e, 0x0005, 0x00e6, 0x00c6, 0x0006, 0x0126, - 0x2091, 0x8000, 0x2071, 0x19bf, 0x700c, 0x2060, 0x8cff, 0x0178, - 0x080c, 0xc03f, 0x1110, 0x080c, 0xaa81, 0x600c, 0x0006, 0x080c, - 0xc2ab, 0x080c, 0xa0e3, 0x080c, 0x9a4e, 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, 0x19bf, 0x7024, - 0x2060, 0x8cff, 0x01f8, 0x080c, 0x9656, 0x6ac0, 0x68c3, 0x0000, - 0x080c, 0x835a, 0x00c6, 0x2061, 0x0100, 0x080c, 0x9eef, 0x00ce, - 0x20a9, 0x01f4, 0x0461, 0x2009, 0x0013, 0x080c, 0xa15d, 0x000e, - 0x001e, 0x002e, 0x006e, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x015e, - 0x012e, 0x0005, 0x2001, 0x1800, 0x2004, 0x9096, 0x0001, 0x0d78, - 0x9096, 0x0004, 0x0d60, 0x080c, 0x835a, 0x6814, 0x9084, 0x0001, - 0x0110, 0x68a7, 0x95f5, 0x6817, 0x0008, 0x68c3, 0x0000, 0x2011, - 0x5d94, 0x080c, 0x82da, 0x20a9, 0x01f4, 0x0009, 0x08c0, 0x6824, - 0xd094, 0x0140, 0x6827, 0x0004, 0x7804, 0x9084, 0x4000, 0x190c, - 0x2c98, 0x0090, 0xd084, 0x0118, 0x6827, 0x0001, 0x0010, 0x1f04, - 0x997f, 0x7804, 0x9084, 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, - 0x2c88, 0x9006, 0x080c, 0x2c88, 0x0005, 0x0126, 0x0156, 0x00f6, - 0x00e6, 0x00d6, 0x00c6, 0x0066, 0x0026, 0x0016, 0x0006, 0x2091, - 0x8000, 0x2001, 0x180c, 0x200c, 0x918c, 0xdbff, 0x2102, 0x2069, - 0x0100, 0x2079, 0x0140, 0x2071, 0x19bf, 0x703c, 0x2060, 0x8cff, - 0x0904, 0x9a04, 0x9386, 0x0002, 0x1128, 0x6814, 0x9084, 0x0002, - 0x0904, 0x9a04, 0x68af, 0x95f5, 0x6817, 0x0010, 0x2009, 0x00fa, - 0x8109, 0x1df0, 0x69c6, 0x68cb, 0x0008, 0x080c, 0x8367, 0x080c, - 0x1f32, 0x2001, 0x0032, 0x6920, 0xd1bc, 0x0130, 0x8001, 0x1dd8, - 0x692c, 0x918d, 0x0008, 0x692e, 0x20a9, 0x03e8, 0x6824, 0xd094, - 0x0140, 0x6827, 0x0004, 0x7804, 0x9084, 0x4000, 0x190c, 0x2c98, - 0x0090, 0xd08c, 0x0118, 0x6827, 0x0002, 0x0010, 0x1f04, 0x99de, - 0x7804, 0x9084, 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x2c88, - 0x9006, 0x080c, 0x2c88, 0x6827, 0x4000, 0x6824, 0x83ff, 0x1120, - 0x2009, 0x0049, 0x080c, 0xa15d, 0x000e, 0x001e, 0x002e, 0x006e, - 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x015e, 0x012e, 0x0005, 0x00d6, - 0x0126, 0x2091, 0x8000, 0x2069, 0x19bf, 0x6a06, 0x012e, 0x00de, - 0x0005, 0x00d6, 0x0126, 0x2091, 0x8000, 0x2069, 0x19bf, 0x6a32, - 0x012e, 0x00de, 0x0005, 0x080c, 0x92f1, 0x7854, 0x7032, 0x7042, - 0x7047, 0x1000, 0x00f8, 0x080c, 0x92f1, 0x7854, 0x7032, 0x7042, - 0x7047, 0x4000, 0x00b8, 0x080c, 0x92f1, 0x7854, 0x7032, 0x7042, - 0x7047, 0x2000, 0x0078, 0x080c, 0x92f1, 0x7854, 0x7032, 0x7042, - 0x7047, 0x0400, 0x0038, 0x080c, 0x92f1, 0x7854, 0x7032, 0x7042, - 0x7047, 0x0200, 0x60c3, 0x0020, 0x0804, 0x962a, 0x00e6, 0x2071, - 0x19bf, 0x7020, 0x9005, 0x0110, 0x8001, 0x7022, 0x00ee, 0x0005, - 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0076, 0x0066, 0x0006, 0x0126, - 0x2091, 0x8000, 0x2071, 0x19bf, 0x7614, 0x2660, 0x2678, 0x2039, - 0x0001, 0x87ff, 0x0904, 0x9af3, 0x8cff, 0x0904, 0x9af3, 0x6020, - 0x9086, 0x0006, 0x1904, 0x9aee, 0x88ff, 0x0138, 0x2800, 0x9c06, - 0x1904, 0x9aee, 0x2039, 0x0000, 0x0050, 0x6010, 0x9b06, 0x1904, - 0x9aee, 0x85ff, 0x0120, 0x6054, 0x9106, 0x1904, 0x9aee, 0x7024, - 0x9c06, 0x15b0, 0x2069, 0x0100, 0x68c0, 0x9005, 0x1160, 0x6824, - 0xd084, 0x0148, 0x6827, 0x0001, 0x080c, 0x835a, 0x080c, 0x9b78, - 0x7027, 0x0000, 0x0428, 0x080c, 0x835a, 0x6820, 0xd0b4, 0x0110, - 0x68a7, 0x95f5, 0x6817, 0x0008, 0x68c3, 0x0000, 0x080c, 0x9b78, - 0x7027, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, 0x9384, 0x1000, - 0x0138, 0x2001, 0x0100, 0x080c, 0x2c88, 0x9006, 0x080c, 0x2c88, - 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, - 0xbe35, 0x0110, 0x080c, 0xd830, 0x009e, 0x080c, 0xa113, 0x080c, - 0x9a4e, 0x88ff, 0x1190, 0x00ce, 0x0804, 0x9a69, 0x2c78, 0x600c, - 0x2060, 0x0804, 0x9a69, 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, 0x19bf, - 0x7638, 0x2660, 0x2678, 0x8cff, 0x0904, 0x9b67, 0x6020, 0x9086, - 0x0006, 0x1904, 0x9b62, 0x87ff, 0x0128, 0x2700, 0x9c06, 0x1904, - 0x9b62, 0x0040, 0x6010, 0x9b06, 0x15e8, 0x85ff, 0x0118, 0x6054, - 0x9106, 0x15c0, 0x703c, 0x9c06, 0x1168, 0x0036, 0x2019, 0x0001, - 0x080c, 0x999d, 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, 0xbe35, - 0x0110, 0x080c, 0xd830, 0x080c, 0xa113, 0x87ff, 0x1198, 0x00ce, - 0x0804, 0x9b13, 0x2c78, 0x600c, 0x2060, 0x0804, 0x9b13, 0x9006, - 0x012e, 0x000e, 0x002e, 0x006e, 0x00ce, 0x009e, 0x00de, 0x00ee, - 0x00fe, 0x0005, 0x601b, 0x0000, 0x00ce, 0x97bd, 0x0001, 0x0c80, - 0x00e6, 0x2071, 0x19bf, 0x2001, 0x1800, 0x2004, 0x9086, 0x0002, - 0x1118, 0x7007, 0x0005, 0x0010, 0x7007, 0x0000, 0x00ee, 0x0005, - 0x00f6, 0x00e6, 0x00c6, 0x0066, 0x0026, 0x0006, 0x0126, 0x2091, - 0x8000, 0x2071, 0x19bf, 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, 0x8b04, 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, 0x19bf, 0x760c, 0x2660, - 0x2678, 0x8cff, 0x0904, 0x9c5e, 0x6010, 0x00b6, 0x2058, 0xb8a0, - 0x00be, 0x9206, 0x1904, 0x9c59, 0x7024, 0x9c06, 0x1520, 0x2069, - 0x0100, 0x68c0, 0x9005, 0x0904, 0x9c30, 0x080c, 0x9656, 0x68c3, - 0x0000, 0x080c, 0x9b78, 0x7027, 0x0000, 0x0036, 0x2069, 0x0140, - 0x6b04, 0x9384, 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x2c88, - 0x9006, 0x080c, 0x2c88, 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, 0xc02e, 0x1180, - 0x080c, 0x31b4, 0x080c, 0xc03f, 0x1518, 0x080c, 0xaa81, 0x0400, - 0x080c, 0x9b78, 0x6824, 0xd084, 0x09b0, 0x6827, 0x0001, 0x0898, - 0x080c, 0xc03f, 0x1118, 0x080c, 0xaa81, 0x0090, 0x6014, 0x2048, - 0x080c, 0xbe35, 0x0168, 0x6020, 0x9086, 0x0003, 0x1508, 0xa867, - 0x0103, 0xab7a, 0xa877, 0x0000, 0x080c, 0x6adc, 0x080c, 0xc022, - 0x080c, 0xc2ab, 0x080c, 0xa113, 0x080c, 0x9a4e, 0x00ce, 0x0804, - 0x9bd9, 0x2c78, 0x600c, 0x2060, 0x0804, 0x9bd9, 0x012e, 0x000e, - 0x002e, 0x006e, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x009e, 0x0005, - 0x6020, 0x9086, 0x0006, 0x1d20, 0x080c, 0xd830, 0x0c08, 0x00d6, - 0x080c, 0x9179, 0x7003, 0x0200, 0x7007, 0x0014, 0x60c3, 0x0014, - 0x20e1, 0x0001, 0x2099, 0x1961, 0x20e9, 0x0000, 0x20a1, 0x0250, - 0x20a9, 0x0004, 0x4003, 0x7023, 0x0004, 0x7027, 0x7878, 0x080c, - 0x962a, 0x00de, 0x0005, 0x080c, 0x9179, 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, 0x962a, 0x00b6, - 0x00d6, 0x0016, 0x00d6, 0x2f68, 0x2009, 0x0035, 0x080c, 0xc4b1, - 0x00de, 0x1904, 0x9d0c, 0x080c, 0x912e, 0x7003, 0x1300, 0x782c, - 0x080c, 0x9e12, 0x2068, 0x6820, 0x9086, 0x0003, 0x0560, 0x7810, - 0x2058, 0xbaa0, 0x080c, 0xa062, 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, 0xa062, 0x1130, 0x7810, 0x2058, - 0xb8a0, 0x9082, 0x007e, 0x0250, 0x00d6, 0x2069, 0x181e, 0x2d04, - 0x700a, 0x8d68, 0x2d04, 0x700e, 0x00de, 0x0010, 0x6034, 0x700e, - 0x7838, 0x7012, 0x783c, 0x7016, 0x60c3, 0x000c, 0x001e, 0x00de, - 0x080c, 0x962a, 0x00be, 0x0005, 0x781b, 0x0001, 0x7803, 0x0006, - 0x001e, 0x00de, 0x00be, 0x0005, 0x792c, 0x9180, 0x0008, 0x200c, - 0x9186, 0x0006, 0x01c0, 0x9186, 0x0003, 0x0904, 0x9d87, 0x9186, - 0x0005, 0x0904, 0x9d6f, 0x9186, 0x0004, 0x05d8, 0x9186, 0x0008, - 0x0904, 0x9d78, 0x7807, 0x0037, 0x782f, 0x0003, 0x7817, 0x1700, - 0x080c, 0x9def, 0x0005, 0x080c, 0x9db0, 0x00d6, 0x0026, 0x792c, - 0x2168, 0x2009, 0x4000, 0x6800, 0x0002, 0x9d50, 0x9d5b, 0x9d52, - 0x9d5b, 0x9d57, 0x9d50, 0x9d50, 0x9d5b, 0x9d5b, 0x9d5b, 0x9d5b, - 0x9d50, 0x9d50, 0x9d50, 0x9d50, 0x9d50, 0x9d5b, 0x9d50, 0x9d5b, - 0x080c, 0x0dfa, 0x6824, 0xd0e4, 0x0110, 0xd0cc, 0x0110, 0x900e, - 0x0010, 0x2009, 0x2000, 0x682c, 0x7022, 0x6830, 0x7026, 0x0804, - 0x9da9, 0x080c, 0x9db0, 0x00d6, 0x0026, 0x792c, 0x2168, 0x2009, - 0x4000, 0x6a00, 0x9286, 0x0002, 0x1108, 0x900e, 0x04d0, 0x080c, - 0x9db0, 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, 0x962a, - 0x00b6, 0x0036, 0x0046, 0x0056, 0x0066, 0x080c, 0x9179, 0x9006, - 0x7003, 0x0200, 0x7938, 0x710a, 0x793c, 0x710e, 0x7810, 0x2058, - 0xb8a0, 0x080c, 0xa062, 0x1118, 0x9092, 0x007e, 0x0268, 0x00d6, - 0x2069, 0x181e, 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, - 0x9179, 0x7003, 0x0100, 0x782c, 0x700a, 0x7814, 0x700e, 0x700e, - 0x60c3, 0x0008, 0x0804, 0x962a, 0x080c, 0x9125, 0x7003, 0x1400, - 0x7838, 0x700a, 0x0079, 0x783c, 0x700e, 0x782c, 0x7012, 0x7830, - 0x7016, 0x7834, 0x9084, 0x00ff, 0x8007, 0x701a, 0x60c3, 0x0010, - 0x0804, 0x962a, 0x00e6, 0x2071, 0x0240, 0x0006, 0x00f6, 0x2078, - 0x7810, 0x00b6, 0x2058, 0xb8bc, 0xd084, 0x0120, 0x7844, 0x702a, - 0x7848, 0x702e, 0x00be, 0x00fe, 0x000e, 0x00ee, 0x0005, 0x080c, - 0x9170, 0x7003, 0x0100, 0x782c, 0x700a, 0x7814, 0x700e, 0x60c3, - 0x0008, 0x0804, 0x962a, 0x0021, 0x60c3, 0x0000, 0x0804, 0x962a, - 0x00d6, 0x080c, 0x9eeb, 0xb810, 0x9085, 0x0300, 0x7002, 0xb814, - 0x7006, 0x2069, 0x1800, 0x6878, 0x700a, 0x687c, 0x700e, 0x7013, - 0x0819, 0x080c, 0x9618, 0x721a, 0x2f10, 0x7222, 0x7a08, 0x7226, - 0x2071, 0x024c, 0x00de, 0x0005, 0x00a9, 0x7914, 0x712a, 0x60c3, - 0x0000, 0x60a7, 0x9575, 0x0026, 0x080c, 0x2afe, 0x0228, 0x2011, - 0x0101, 0x2204, 0xc0c5, 0x2012, 0x002e, 0x080c, 0x964d, 0x080c, - 0x8351, 0x0005, 0x0036, 0x0096, 0x00d6, 0x00e6, 0x7858, 0x2048, - 0xaa7c, 0x9296, 0x00c0, 0x9294, 0xfffd, 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, 0x9eeb, - 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, 0x198a, 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, 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, 0x1fc6, 0x080c, 0x86de, 0x0126, 0x2091, 0x8000, - 0x080c, 0x8ced, 0x012e, 0x009e, 0x00de, 0x0005, 0x00f6, 0x00e6, - 0x00d6, 0x00c6, 0x00a6, 0x0096, 0x0066, 0x0126, 0x2091, 0x8000, - 0x2071, 0x19bf, 0x760c, 0x2660, 0x2678, 0x8cff, 0x0904, 0x9fc2, - 0x7024, 0x9c06, 0x1520, 0x2069, 0x0100, 0x68c0, 0x9005, 0x0904, - 0x9f94, 0x080c, 0x9656, 0x68c3, 0x0000, 0x080c, 0x9b78, 0x7027, + 0x0049, 0x080c, 0xa068, 0x0070, 0x0036, 0x2019, 0x0001, 0x080c, + 0x98b1, 0x003e, 0x713c, 0x2160, 0x080c, 0xdbf0, 0x2009, 0x004a, + 0x080c, 0xa068, 0x002e, 0x001e, 0x00ee, 0x00de, 0x00ce, 0x009e, + 0x0005, 0xd1ec, 0x1904, 0x96c3, 0x0804, 0x96c5, 0x0026, 0x00e6, + 0x2071, 0x19c2, 0x7048, 0xd084, 0x01c0, 0x713c, 0x81ff, 0x01a8, + 0x2071, 0x0100, 0x9188, 0x0008, 0x2114, 0x928e, 0x0006, 0x1138, + 0x7014, 0x9084, 0x1984, 0x9085, 0x0012, 0x7016, 0x0030, 0x7014, + 0x9084, 0x1984, 0x9085, 0x0016, 0x7016, 0x00ee, 0x002e, 0x0005, + 0x00b6, 0x00e6, 0x00d6, 0x00c6, 0x0066, 0x0056, 0x0046, 0x0006, + 0x0126, 0x2091, 0x8000, 0x6010, 0x2058, 0xbca0, 0x2071, 0x19c2, + 0x7018, 0x2058, 0x8bff, 0x0190, 0xb8a0, 0x9406, 0x0118, 0xb854, + 0x2058, 0x0cc0, 0x6014, 0x0096, 0x2048, 0xac6c, 0xad70, 0xae78, + 0x009e, 0x080c, 0x64d5, 0x0110, 0x9085, 0x0001, 0x012e, 0x000e, + 0x004e, 0x005e, 0x006e, 0x00ce, 0x00de, 0x00ee, 0x00be, 0x0005, + 0x080c, 0x90e7, 0x7003, 0x1200, 0x7838, 0x7012, 0x783c, 0x7016, + 0x00c6, 0x7820, 0x9086, 0x0004, 0x1148, 0x7810, 0x9005, 0x0130, + 0x00b6, 0x2058, 0xb810, 0xb914, 0x00be, 0x0020, 0x2061, 0x1800, + 0x6078, 0x617c, 0x9084, 0x00ff, 0x700a, 0x710e, 0x00ce, 0x60c3, + 0x002c, 0x0804, 0x95ee, 0x080c, 0x90e7, 0x7003, 0x0f00, 0x7808, + 0xd09c, 0x0128, 0xb810, 0x9084, 0x00ff, 0x700a, 0xb814, 0x700e, + 0x60c3, 0x0008, 0x0804, 0x95ee, 0x0156, 0x080c, 0x9132, 0x7003, + 0x0200, 0x2011, 0x1848, 0x63f0, 0x2312, 0x20a9, 0x0006, 0x2011, + 0x1840, 0x2019, 0x1841, 0x9ef0, 0x0002, 0x2376, 0x8e70, 0x2276, + 0x8e70, 0x9398, 0x0002, 0x9290, 0x0002, 0x1f04, 0x97ad, 0x60c3, + 0x001c, 0x015e, 0x0804, 0x95ee, 0x0016, 0x0026, 0x080c, 0x910e, + 0x080c, 0x9120, 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, + 0x95ee, 0x002e, 0x001e, 0x0005, 0x20a9, 0x0010, 0x4003, 0x080c, + 0x9ddd, 0x20a1, 0x0240, 0x22a8, 0x4003, 0x0c68, 0x080c, 0x90e7, + 0x7003, 0x6200, 0x7808, 0x700e, 0x60c3, 0x0008, 0x0804, 0x95ee, + 0x0016, 0x0026, 0x080c, 0x90e7, 0x20e9, 0x0000, 0x20a1, 0x024c, + 0x7814, 0x0096, 0x2048, 0xa800, 0x2048, 0xa860, 0x20e0, 0xa85c, + 0x9080, 0x0023, 0x2098, 0x009e, 0x7808, 0x9088, 0x0002, 0x21a8, + 0x4003, 0x8003, 0x60c2, 0x080c, 0x95ee, 0x002e, 0x001e, 0x0005, + 0x00e6, 0x00c6, 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, 0x19c2, + 0x700c, 0x2060, 0x8cff, 0x0178, 0x080c, 0xbf56, 0x1110, 0x080c, + 0xa9a7, 0x600c, 0x0006, 0x080c, 0xc1c2, 0x080c, 0x9fea, 0x080c, + 0x9955, 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, 0x19c2, 0x7024, 0x2060, 0x8cff, 0x01f8, 0x080c, + 0x961a, 0x6ac0, 0x68c3, 0x0000, 0x080c, 0x82d9, 0x00c6, 0x2061, + 0x0100, 0x080c, 0x9df6, 0x00ce, 0x20a9, 0x01f4, 0x0461, 0x2009, + 0x0013, 0x080c, 0xa068, 0x000e, 0x001e, 0x002e, 0x006e, 0x00ce, + 0x00de, 0x00ee, 0x00fe, 0x015e, 0x012e, 0x0005, 0x2001, 0x1800, + 0x2004, 0x9096, 0x0001, 0x0d78, 0x9096, 0x0004, 0x0d60, 0x080c, + 0x82d9, 0x6814, 0x9084, 0x0001, 0x0110, 0x68a7, 0x95f5, 0x6817, + 0x0008, 0x68c3, 0x0000, 0x2011, 0x5c98, 0x080c, 0x8259, 0x20a9, + 0x01f4, 0x0009, 0x08c0, 0x6824, 0xd094, 0x0140, 0x6827, 0x0004, + 0x7804, 0x9084, 0x4000, 0x190c, 0x2b7f, 0x0090, 0xd084, 0x0118, + 0x6827, 0x0001, 0x0010, 0x1f04, 0x9893, 0x7804, 0x9084, 0x1000, + 0x0138, 0x2001, 0x0100, 0x080c, 0x2b6f, 0x9006, 0x080c, 0x2b6f, + 0x0005, 0x0126, 0x0156, 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0066, + 0x0026, 0x0016, 0x0006, 0x2091, 0x8000, 0x2001, 0x180c, 0x200c, + 0x918c, 0xdbff, 0x2102, 0x2069, 0x0100, 0x2079, 0x0140, 0x2071, + 0x19c2, 0x703c, 0x2060, 0x8cff, 0x0904, 0x9918, 0x9386, 0x0002, + 0x1128, 0x6814, 0x9084, 0x0002, 0x0904, 0x9918, 0x68af, 0x95f5, + 0x6817, 0x0010, 0x2009, 0x00fa, 0x8109, 0x1df0, 0x69c6, 0x68cb, + 0x0008, 0x080c, 0x82e6, 0x080c, 0x1e30, 0x2001, 0x0032, 0x6920, + 0xd1bc, 0x0130, 0x8001, 0x1dd8, 0x692c, 0x918d, 0x0008, 0x692e, + 0x20a9, 0x03e8, 0x6824, 0xd094, 0x0140, 0x6827, 0x0004, 0x7804, + 0x9084, 0x4000, 0x190c, 0x2b7f, 0x0090, 0xd08c, 0x0118, 0x6827, + 0x0002, 0x0010, 0x1f04, 0x98f2, 0x7804, 0x9084, 0x1000, 0x0138, + 0x2001, 0x0100, 0x080c, 0x2b6f, 0x9006, 0x080c, 0x2b6f, 0x6827, + 0x4000, 0x6824, 0x83ff, 0x1120, 0x2009, 0x0049, 0x080c, 0xa068, + 0x000e, 0x001e, 0x002e, 0x006e, 0x00ce, 0x00de, 0x00ee, 0x00fe, + 0x015e, 0x012e, 0x0005, 0x00d6, 0x0126, 0x2091, 0x8000, 0x2069, + 0x19c2, 0x6a06, 0x012e, 0x00de, 0x0005, 0x00d6, 0x0126, 0x2091, + 0x8000, 0x2069, 0x19c2, 0x6a32, 0x012e, 0x00de, 0x0005, 0x080c, + 0x92aa, 0x7047, 0x1000, 0x0098, 0x080c, 0x92aa, 0x7047, 0x4000, + 0x0070, 0x080c, 0x92aa, 0x7047, 0x2000, 0x0048, 0x080c, 0x92aa, + 0x7047, 0x0400, 0x0020, 0x080c, 0x92aa, 0x7047, 0x0200, 0x7854, + 0x7032, 0x60c3, 0x0020, 0x0804, 0x95ee, 0x00e6, 0x2071, 0x19c2, + 0x7020, 0x9005, 0x0110, 0x8001, 0x7022, 0x00ee, 0x0005, 0x00f6, + 0x00e6, 0x00d6, 0x00c6, 0x0076, 0x0066, 0x0006, 0x0126, 0x2091, + 0x8000, 0x2071, 0x19c2, 0x7614, 0x2660, 0x2678, 0x2039, 0x0001, + 0x87ff, 0x0904, 0x99fa, 0x8cff, 0x0904, 0x99fa, 0x6020, 0x9086, + 0x0006, 0x1904, 0x99f5, 0x88ff, 0x0138, 0x2800, 0x9c06, 0x1904, + 0x99f5, 0x2039, 0x0000, 0x0050, 0x6010, 0x9b06, 0x1904, 0x99f5, + 0x85ff, 0x0120, 0x6054, 0x9106, 0x1904, 0x99f5, 0x7024, 0x9c06, + 0x15b0, 0x2069, 0x0100, 0x68c0, 0x9005, 0x1160, 0x6824, 0xd084, + 0x0148, 0x6827, 0x0001, 0x080c, 0x82d9, 0x080c, 0x9a7f, 0x7027, + 0x0000, 0x0428, 0x080c, 0x82d9, 0x6820, 0xd0b4, 0x0110, 0x68a7, + 0x95f5, 0x6817, 0x0008, 0x68c3, 0x0000, 0x080c, 0x9a7f, 0x7027, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, 0x9384, 0x1000, 0x0138, - 0x2001, 0x0100, 0x080c, 0x2c88, 0x9006, 0x080c, 0x2c88, 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, 0xc02e, 0x1180, 0x080c, 0x31b4, 0x080c, 0xc03f, - 0x1518, 0x080c, 0xaa81, 0x0400, 0x080c, 0x9b78, 0x6824, 0xd084, - 0x09b0, 0x6827, 0x0001, 0x0898, 0x080c, 0xc03f, 0x1118, 0x080c, - 0xaa81, 0x0090, 0x6014, 0x2048, 0x080c, 0xbe35, 0x0168, 0x6020, - 0x9086, 0x0003, 0x1520, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, - 0x080c, 0x6ae9, 0x080c, 0xc022, 0x080c, 0xc2ab, 0x080c, 0xa113, - 0x080c, 0x9a4e, 0x00ce, 0x0804, 0x9f45, 0x2c78, 0x600c, 0x2060, - 0x0804, 0x9f45, 0x700f, 0x0000, 0x700b, 0x0000, 0x012e, 0x006e, - 0x009e, 0x00ae, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x0005, 0x6020, - 0x9086, 0x0006, 0x1d08, 0x080c, 0xd830, 0x08f0, 0x00d6, 0x0156, - 0x080c, 0x9179, 0x7a14, 0x82ff, 0x0138, 0x7003, 0x0100, 0x700b, - 0x0003, 0x60c3, 0x0008, 0x0490, 0x7003, 0x0200, 0x7007, 0x0000, - 0x2069, 0x1800, 0x901e, 0x6800, 0x9086, 0x0004, 0x1110, 0xc38d, - 0x0060, 0x080c, 0x7207, 0x1110, 0xc3ad, 0x0008, 0xc3a5, 0x6ad8, - 0xd29c, 0x1110, 0xd2ac, 0x0108, 0xc39d, 0x730e, 0x2011, 0x1848, - 0x63f0, 0x2312, 0x20a9, 0x0006, 0x2011, 0x1840, 0x2019, 0x1841, - 0x2071, 0x0250, 0x2376, 0x8e70, 0x2276, 0x8e70, 0x9398, 0x0002, - 0x9290, 0x0002, 0x1f04, 0xa00a, 0x60c3, 0x0020, 0x080c, 0x962a, - 0x015e, 0x00de, 0x0005, 0x0156, 0x080c, 0x9179, 0x7a14, 0x82ff, - 0x0168, 0x9286, 0xffff, 0x0118, 0x9282, 0x000e, 0x1238, 0x7003, - 0x0100, 0x700b, 0x0003, 0x60c3, 0x0008, 0x0488, 0x7003, 0x0200, - 0x7007, 0x001c, 0x700f, 0x0001, 0x2011, 0x1995, 0x2204, 0x8007, - 0x701a, 0x8210, 0x2204, 0x8007, 0x701e, 0x0421, 0x1120, 0xb8a0, - 0x9082, 0x007f, 0x0248, 0x2001, 0x181e, 0x2004, 0x7022, 0x2001, - 0x181f, 0x2004, 0x7026, 0x0030, 0x2001, 0x1817, 0x2004, 0x9084, - 0x00ff, 0x7026, 0x20a9, 0x0004, 0x20e1, 0x0001, 0x2099, 0x1805, - 0x20e9, 0x0000, 0x20a1, 0x0256, 0x4003, 0x60c3, 0x001c, 0x015e, - 0x0804, 0x962a, 0x0006, 0x2001, 0x1836, 0x2004, 0xd0ac, 0x000e, - 0x0005, 0x2011, 0x0003, 0x080c, 0x9a0f, 0x2011, 0x0002, 0x080c, - 0x9a19, 0x080c, 0x9927, 0x0036, 0x901e, 0x080c, 0x999d, 0x003e, - 0x0005, 0x2071, 0x188b, 0x7000, 0x9005, 0x0140, 0x2001, 0x0976, - 0x2071, 0x1800, 0x7072, 0x7076, 0x7067, 0xffe0, 0x2071, 0x1800, - 0x7070, 0x7052, 0x7057, 0x1cd0, 0x0005, 0x00e6, 0x0126, 0x2071, - 0x1800, 0x2091, 0x8000, 0x7550, 0x9582, 0x0010, 0x0608, 0x7054, - 0x2060, 0x6000, 0x9086, 0x0000, 0x0148, 0x9ce0, 0x0018, 0x7064, - 0x9c02, 0x1208, 0x0cb0, 0x2061, 0x1cd0, 0x0c98, 0x6003, 0x0008, - 0x8529, 0x7552, 0x9ca8, 0x0018, 0x7064, 0x9502, 0x1230, 0x7556, - 0x9085, 0x0001, 0x012e, 0x00ee, 0x0005, 0x7057, 0x1cd0, 0x0cc0, - 0x9006, 0x0cc0, 0x00e6, 0x2071, 0x1800, 0x7550, 0x9582, 0x0010, - 0x0600, 0x7054, 0x2060, 0x6000, 0x9086, 0x0000, 0x0148, 0x9ce0, - 0x0018, 0x7064, 0x9c02, 0x1208, 0x0cb0, 0x2061, 0x1cd0, 0x0c98, - 0x6003, 0x0008, 0x8529, 0x7552, 0x9ca8, 0x0018, 0x7064, 0x9502, - 0x1228, 0x7556, 0x9085, 0x0001, 0x00ee, 0x0005, 0x7057, 0x1cd0, - 0x0cc8, 0x9006, 0x0cc8, 0x9c82, 0x1cd0, 0x0a0c, 0x0dfa, 0x2001, - 0x1819, 0x2004, 0x9c02, 0x1a0c, 0x0dfa, 0x9006, 0x6006, 0x600a, - 0x600e, 0x6016, 0x601a, 0x6012, 0x6023, 0x0000, 0x6003, 0x0000, - 0x601e, 0x6056, 0x605a, 0x6026, 0x602a, 0x602e, 0x6032, 0x6036, - 0x603a, 0x603e, 0x6042, 0x2061, 0x1800, 0x6050, 0x8000, 0x6052, - 0x9086, 0x0001, 0x0108, 0x0005, 0x0126, 0x2091, 0x8000, 0x080c, - 0x8c10, 0x012e, 0x0cc0, 0x0006, 0x6000, 0x9086, 0x0000, 0x01b0, - 0x601c, 0xd084, 0x190c, 0x19b4, 0x6017, 0x0000, 0x6023, 0x0007, - 0x2001, 0x195e, 0x2004, 0x0006, 0x9082, 0x0051, 0x000e, 0x0208, - 0x8004, 0x601a, 0x080c, 0xdae2, 0x6043, 0x0000, 0x000e, 0x0005, - 0x00e6, 0x0126, 0x2071, 0x1800, 0x2091, 0x8000, 0x7550, 0x9582, - 0x0001, 0x0608, 0x7054, 0x2060, 0x6000, 0x9086, 0x0000, 0x0148, - 0x9ce0, 0x0018, 0x7064, 0x9c02, 0x1208, 0x0cb0, 0x2061, 0x1cd0, - 0x0c98, 0x6003, 0x0008, 0x8529, 0x7552, 0x9ca8, 0x0018, 0x7064, - 0x9502, 0x1230, 0x7556, 0x9085, 0x0001, 0x012e, 0x00ee, 0x0005, - 0x7057, 0x1cd0, 0x0cc0, 0x9006, 0x0cc0, 0x6020, 0x9084, 0x000f, - 0x0002, 0xa170, 0xa179, 0xa194, 0xa1af, 0xc55f, 0xc57c, 0xc597, - 0xa170, 0xa179, 0xa170, 0xa1cb, 0xa170, 0xa170, 0xa170, 0xa170, - 0x9186, 0x0013, 0x1128, 0x080c, 0x8b04, 0x080c, 0x8c10, 0x0005, - 0x0005, 0x0066, 0x6000, 0x90b2, 0x0016, 0x1a0c, 0x0dfa, 0x0013, - 0x006e, 0x0005, 0xa192, 0xa8f8, 0xaac8, 0xa192, 0xab56, 0xa4ae, - 0xa192, 0xa192, 0xa87a, 0xb0fa, 0xa192, 0xa192, 0xa192, 0xa192, - 0xa192, 0xa192, 0x080c, 0x0dfa, 0x0066, 0x6000, 0x90b2, 0x0016, - 0x1a0c, 0x0dfa, 0x0013, 0x006e, 0x0005, 0xa1ad, 0xb7e1, 0xa1ad, - 0xa1ad, 0xa1ad, 0xa1ad, 0xa1ad, 0xa1ad, 0xb778, 0xb963, 0xa1ad, - 0xb822, 0xb8a1, 0xb822, 0xb8a1, 0xa1ad, 0x080c, 0x0dfa, 0x6000, - 0x9082, 0x0016, 0x1a0c, 0x0dfa, 0x6000, 0x0002, 0xa1c9, 0xb141, - 0xb226, 0xb356, 0xb505, 0xa1c9, 0xa1c9, 0xa1c9, 0xb115, 0xb704, - 0xb707, 0xa1c9, 0xa1c9, 0xa1c9, 0xa1c9, 0xb736, 0xa1c9, 0xa1c9, - 0xa1c9, 0x080c, 0x0dfa, 0x0066, 0x6000, 0x90b2, 0x0016, 0x1a0c, - 0x0dfa, 0x0013, 0x006e, 0x0005, 0xa1e4, 0xa1e4, 0xa227, 0xa2c6, - 0xa35b, 0xa1e4, 0xa1e4, 0xa1e4, 0xa1e6, 0xa1e4, 0xa1e4, 0xa1e4, - 0xa1e4, 0xa1e4, 0xa1e4, 0xa1e4, 0x080c, 0x0dfa, 0x9186, 0x004c, - 0x0588, 0x9186, 0x0003, 0x190c, 0x0dfa, 0x0096, 0x601c, 0xc0ed, + 0x2001, 0x0100, 0x080c, 0x2b6f, 0x9006, 0x080c, 0x2b6f, 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, 0xbd4c, + 0x0110, 0x080c, 0xd7e2, 0x009e, 0x080c, 0xa01c, 0x080c, 0x9955, + 0x88ff, 0x1190, 0x00ce, 0x0804, 0x9970, 0x2c78, 0x600c, 0x2060, + 0x0804, 0x9970, 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, 0x19c2, 0x7638, + 0x2660, 0x2678, 0x8cff, 0x0904, 0x9a6e, 0x6020, 0x9086, 0x0006, + 0x1904, 0x9a69, 0x87ff, 0x0128, 0x2700, 0x9c06, 0x1904, 0x9a69, + 0x0040, 0x6010, 0x9b06, 0x15e8, 0x85ff, 0x0118, 0x6054, 0x9106, + 0x15c0, 0x703c, 0x9c06, 0x1168, 0x0036, 0x2019, 0x0001, 0x080c, + 0x98b1, 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, 0xbd4c, 0x0110, + 0x080c, 0xd7e2, 0x080c, 0xa01c, 0x87ff, 0x1198, 0x00ce, 0x0804, + 0x9a1a, 0x2c78, 0x600c, 0x2060, 0x0804, 0x9a1a, 0x9006, 0x012e, + 0x000e, 0x002e, 0x006e, 0x00ce, 0x009e, 0x00de, 0x00ee, 0x00fe, + 0x0005, 0x601b, 0x0000, 0x00ce, 0x97bd, 0x0001, 0x0c80, 0x00e6, + 0x2071, 0x19c2, 0x2001, 0x1800, 0x2004, 0x9086, 0x0002, 0x1118, + 0x7007, 0x0005, 0x0010, 0x7007, 0x0000, 0x00ee, 0x0005, 0x00f6, + 0x00e6, 0x00c6, 0x0066, 0x0026, 0x0006, 0x0126, 0x2091, 0x8000, + 0x2071, 0x19c2, 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, + 0x8a83, 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, 0x19c2, 0x760c, 0x2660, 0x2678, + 0x8cff, 0x0904, 0x9b65, 0x6010, 0x00b6, 0x2058, 0xb8a0, 0x00be, + 0x9206, 0x1904, 0x9b60, 0x7024, 0x9c06, 0x1520, 0x2069, 0x0100, + 0x68c0, 0x9005, 0x0904, 0x9b37, 0x080c, 0x961a, 0x68c3, 0x0000, + 0x080c, 0x9a7f, 0x7027, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, + 0x9384, 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x2b6f, 0x9006, + 0x080c, 0x2b6f, 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, 0xbf45, 0x1180, 0x080c, + 0x30be, 0x080c, 0xbf56, 0x1518, 0x080c, 0xa9a7, 0x0400, 0x080c, + 0x9a7f, 0x6824, 0xd084, 0x09b0, 0x6827, 0x0001, 0x0898, 0x080c, + 0xbf56, 0x1118, 0x080c, 0xa9a7, 0x0090, 0x6014, 0x2048, 0x080c, + 0xbd4c, 0x0168, 0x6020, 0x9086, 0x0003, 0x1508, 0xa867, 0x0103, + 0xab7a, 0xa877, 0x0000, 0x080c, 0x6a15, 0x080c, 0xbf39, 0x080c, + 0xc1c2, 0x080c, 0xa01c, 0x080c, 0x9955, 0x00ce, 0x0804, 0x9ae0, + 0x2c78, 0x600c, 0x2060, 0x0804, 0x9ae0, 0x012e, 0x000e, 0x002e, + 0x006e, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x009e, 0x0005, 0x6020, + 0x9086, 0x0006, 0x1d20, 0x080c, 0xd7e2, 0x0c08, 0x00d6, 0x080c, + 0x9132, 0x7003, 0x0200, 0x7007, 0x0014, 0x60c3, 0x0014, 0x20e1, + 0x0001, 0x2099, 0x1963, 0x20e9, 0x0000, 0x20a1, 0x0250, 0x20a9, + 0x0004, 0x4003, 0x7023, 0x0004, 0x7027, 0x7878, 0x080c, 0x95ee, + 0x00de, 0x0005, 0x080c, 0x9132, 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, 0x95ee, 0x00b6, 0x00d6, + 0x0016, 0x00d6, 0x2f68, 0x2009, 0x0035, 0x080c, 0xc3cf, 0x00de, + 0x1904, 0x9c13, 0x080c, 0x90e7, 0x7003, 0x1300, 0x782c, 0x080c, + 0x9d19, 0x2068, 0x6820, 0x9086, 0x0003, 0x0560, 0x7810, 0x2058, + 0xbaa0, 0x080c, 0x9f69, 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, 0x9f69, 0x1130, 0x7810, 0x2058, 0xb8a0, + 0x9082, 0x007e, 0x0250, 0x00d6, 0x2069, 0x181e, 0x2d04, 0x700a, + 0x8d68, 0x2d04, 0x700e, 0x00de, 0x0010, 0x6034, 0x700e, 0x7838, + 0x7012, 0x783c, 0x7016, 0x60c3, 0x000c, 0x001e, 0x00de, 0x080c, + 0x95ee, 0x00be, 0x0005, 0x781b, 0x0001, 0x7803, 0x0006, 0x001e, + 0x00de, 0x00be, 0x0005, 0x792c, 0x9180, 0x0008, 0x200c, 0x9186, + 0x0006, 0x01c0, 0x9186, 0x0003, 0x0904, 0x9c8e, 0x9186, 0x0005, + 0x0904, 0x9c76, 0x9186, 0x0004, 0x05d8, 0x9186, 0x0008, 0x0904, + 0x9c7f, 0x7807, 0x0037, 0x782f, 0x0003, 0x7817, 0x1700, 0x080c, + 0x9cf6, 0x0005, 0x080c, 0x9cb7, 0x00d6, 0x0026, 0x792c, 0x2168, + 0x2009, 0x4000, 0x6800, 0x0002, 0x9c57, 0x9c62, 0x9c59, 0x9c62, + 0x9c5e, 0x9c57, 0x9c57, 0x9c62, 0x9c62, 0x9c62, 0x9c62, 0x9c57, + 0x9c57, 0x9c57, 0x9c57, 0x9c57, 0x9c62, 0x9c57, 0x9c62, 0x080c, + 0x0df6, 0x6824, 0xd0e4, 0x0110, 0xd0cc, 0x0110, 0x900e, 0x0010, + 0x2009, 0x2000, 0x682c, 0x7022, 0x6830, 0x7026, 0x0804, 0x9cb0, + 0x080c, 0x9cb7, 0x00d6, 0x0026, 0x792c, 0x2168, 0x2009, 0x4000, + 0x6a00, 0x9286, 0x0002, 0x1108, 0x900e, 0x04d0, 0x080c, 0x9cb7, + 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, 0x95ee, 0x00b6, + 0x0036, 0x0046, 0x0056, 0x0066, 0x080c, 0x9132, 0x9006, 0x7003, + 0x0200, 0x7938, 0x710a, 0x793c, 0x710e, 0x7810, 0x2058, 0xb8a0, + 0x080c, 0x9f69, 0x1118, 0x9092, 0x007e, 0x0268, 0x00d6, 0x2069, + 0x181e, 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, 0x9132, + 0x7003, 0x0100, 0x782c, 0x700a, 0x7814, 0x700e, 0x700e, 0x60c3, + 0x0008, 0x0804, 0x95ee, 0x080c, 0x90de, 0x7003, 0x1400, 0x7838, + 0x700a, 0x0079, 0x783c, 0x700e, 0x782c, 0x7012, 0x7830, 0x7016, + 0x7834, 0x9084, 0x00ff, 0x8007, 0x701a, 0x60c3, 0x0010, 0x0804, + 0x95ee, 0x00e6, 0x2071, 0x0240, 0x0006, 0x00f6, 0x2078, 0x7810, + 0x00b6, 0x2058, 0xb8bc, 0xd084, 0x0120, 0x7844, 0x702a, 0x7848, + 0x702e, 0x00be, 0x00fe, 0x000e, 0x00ee, 0x0005, 0x080c, 0x9129, + 0x7003, 0x0100, 0x782c, 0x700a, 0x7814, 0x700e, 0x60c3, 0x0008, + 0x0804, 0x95ee, 0x0021, 0x60c3, 0x0000, 0x0804, 0x95ee, 0x00d6, + 0x080c, 0x9df2, 0xb810, 0x9085, 0x0300, 0x7002, 0xb814, 0x7006, + 0x2069, 0x1800, 0x6878, 0x700a, 0x687c, 0x700e, 0x7013, 0x0819, + 0x080c, 0x95dc, 0x721a, 0x2f10, 0x7222, 0x7a08, 0x7226, 0x2071, + 0x024c, 0x00de, 0x0005, 0x00a9, 0x7914, 0x712a, 0x60c3, 0x0000, + 0x60a7, 0x9575, 0x0026, 0x080c, 0x29e9, 0x0228, 0x2011, 0x0101, + 0x2204, 0xc0c5, 0x2012, 0x002e, 0x080c, 0x9611, 0x080c, 0x82d0, + 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, 0x9df2, 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, 0x198d, 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, 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, 0x1ebc, 0x080c, 0x865d, 0x0126, 0x2091, 0x8000, 0x080c, + 0x8c6c, 0x012e, 0x009e, 0x00de, 0x0005, 0x00f6, 0x00e6, 0x00d6, + 0x00c6, 0x00a6, 0x0096, 0x0066, 0x0126, 0x2091, 0x8000, 0x2071, + 0x19c2, 0x760c, 0x2660, 0x2678, 0x8cff, 0x0904, 0x9ec9, 0x7024, + 0x9c06, 0x1520, 0x2069, 0x0100, 0x68c0, 0x9005, 0x0904, 0x9e9b, + 0x080c, 0x961a, 0x68c3, 0x0000, 0x080c, 0x9a7f, 0x7027, 0x0000, + 0x0036, 0x2069, 0x0140, 0x6b04, 0x9384, 0x1000, 0x0138, 0x2001, + 0x0100, 0x080c, 0x2b6f, 0x9006, 0x080c, 0x2b6f, 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, 0xbf45, 0x1180, 0x080c, 0x30be, 0x080c, 0xbf56, 0x1518, + 0x080c, 0xa9a7, 0x0400, 0x080c, 0x9a7f, 0x6824, 0xd084, 0x09b0, + 0x6827, 0x0001, 0x0898, 0x080c, 0xbf56, 0x1118, 0x080c, 0xa9a7, + 0x0090, 0x6014, 0x2048, 0x080c, 0xbd4c, 0x0168, 0x6020, 0x9086, + 0x0003, 0x1520, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x080c, + 0x6a22, 0x080c, 0xbf39, 0x080c, 0xc1c2, 0x080c, 0xa01c, 0x080c, + 0x9955, 0x00ce, 0x0804, 0x9e4c, 0x2c78, 0x600c, 0x2060, 0x0804, + 0x9e4c, 0x700f, 0x0000, 0x700b, 0x0000, 0x012e, 0x006e, 0x009e, + 0x00ae, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x0005, 0x6020, 0x9086, + 0x0006, 0x1d08, 0x080c, 0xd7e2, 0x08f0, 0x00d6, 0x0156, 0x080c, + 0x9132, 0x7a14, 0x82ff, 0x0138, 0x7003, 0x0100, 0x700b, 0x0003, + 0x60c3, 0x0008, 0x0490, 0x7003, 0x0200, 0x7007, 0x0000, 0x2069, + 0x1800, 0x901e, 0x6800, 0x9086, 0x0004, 0x1110, 0xc38d, 0x0060, + 0x080c, 0x717e, 0x1110, 0xc3ad, 0x0008, 0xc3a5, 0x6ad8, 0xd29c, + 0x1110, 0xd2ac, 0x0108, 0xc39d, 0x730e, 0x2011, 0x1848, 0x63f0, + 0x2312, 0x20a9, 0x0006, 0x2011, 0x1840, 0x2019, 0x1841, 0x2071, + 0x0250, 0x2376, 0x8e70, 0x2276, 0x8e70, 0x9398, 0x0002, 0x9290, + 0x0002, 0x1f04, 0x9f11, 0x60c3, 0x0020, 0x080c, 0x95ee, 0x015e, + 0x00de, 0x0005, 0x0156, 0x080c, 0x9132, 0x7a14, 0x82ff, 0x0168, + 0x9286, 0xffff, 0x0118, 0x9282, 0x000e, 0x1238, 0x7003, 0x0100, + 0x700b, 0x0003, 0x60c3, 0x0008, 0x0488, 0x7003, 0x0200, 0x7007, + 0x001c, 0x700f, 0x0001, 0x2011, 0x1998, 0x2204, 0x8007, 0x701a, + 0x8210, 0x2204, 0x8007, 0x701e, 0x0421, 0x1120, 0xb8a0, 0x9082, + 0x007f, 0x0248, 0x2001, 0x181e, 0x2004, 0x7022, 0x2001, 0x181f, + 0x2004, 0x7026, 0x0030, 0x2001, 0x1817, 0x2004, 0x9084, 0x00ff, + 0x7026, 0x20a9, 0x0004, 0x20e1, 0x0001, 0x2099, 0x1805, 0x20e9, + 0x0000, 0x20a1, 0x0256, 0x4003, 0x60c3, 0x001c, 0x015e, 0x0804, + 0x95ee, 0x0006, 0x2001, 0x1836, 0x2004, 0xd0ac, 0x000e, 0x0005, + 0x2011, 0x0003, 0x080c, 0x9923, 0x2011, 0x0002, 0x080c, 0x992d, + 0x080c, 0x983b, 0x0036, 0x901e, 0x080c, 0x98b1, 0x003e, 0x0005, + 0x2071, 0x188b, 0x7000, 0x9005, 0x0140, 0x2001, 0x0976, 0x2071, + 0x1800, 0x7072, 0x7076, 0x7067, 0xffe0, 0x2071, 0x1800, 0x7070, + 0x7052, 0x7057, 0x1cd0, 0x0005, 0x00e6, 0x0126, 0x2071, 0x1800, + 0x2091, 0x8000, 0x7550, 0x9582, 0x0010, 0x0608, 0x7054, 0x2060, + 0x6000, 0x9086, 0x0000, 0x0148, 0x9ce0, 0x0018, 0x7064, 0x9c02, + 0x1208, 0x0cb0, 0x2061, 0x1cd0, 0x0c98, 0x6003, 0x0008, 0x8529, + 0x7552, 0x9ca8, 0x0018, 0x7064, 0x9502, 0x1230, 0x7556, 0x9085, + 0x0001, 0x012e, 0x00ee, 0x0005, 0x7057, 0x1cd0, 0x0cc0, 0x9006, + 0x0cc0, 0x00e6, 0x2071, 0x1800, 0x7550, 0x9582, 0x0010, 0x0600, + 0x7054, 0x2060, 0x6000, 0x9086, 0x0000, 0x0148, 0x9ce0, 0x0018, + 0x7064, 0x9c02, 0x1208, 0x0cb0, 0x2061, 0x1cd0, 0x0c98, 0x6003, + 0x0008, 0x8529, 0x7552, 0x9ca8, 0x0018, 0x7064, 0x9502, 0x1228, + 0x7556, 0x9085, 0x0001, 0x00ee, 0x0005, 0x7057, 0x1cd0, 0x0cc8, + 0x9006, 0x0cc8, 0x9c82, 0x1cd0, 0x0a0c, 0x0df6, 0x2001, 0x1819, + 0x2004, 0x9c02, 0x1a0c, 0x0df6, 0x9006, 0x6006, 0x600a, 0x600e, + 0x6016, 0x601a, 0x6012, 0x6023, 0x0000, 0x6003, 0x0000, 0x601e, + 0x6056, 0x605a, 0x6026, 0x602a, 0x602e, 0x6032, 0x6036, 0x603a, + 0x603e, 0x6042, 0x2061, 0x1800, 0x6050, 0x8000, 0x6052, 0x9086, + 0x0001, 0x0108, 0x0005, 0x0126, 0x2091, 0x8000, 0x0016, 0x080c, + 0x8b8f, 0x001e, 0x012e, 0x0cb0, 0x0006, 0x6000, 0x9086, 0x0000, + 0x01c0, 0x601c, 0xd084, 0x190c, 0x192c, 0x6017, 0x0000, 0x6023, + 0x0007, 0x2001, 0x1960, 0x2004, 0x0006, 0x9082, 0x0051, 0x000e, + 0x0208, 0x8004, 0x601a, 0x080c, 0xda94, 0x6043, 0x0000, 0x6013, + 0x0000, 0x000e, 0x0005, 0x00e6, 0x0126, 0x2071, 0x1800, 0x2091, + 0x8000, 0x7550, 0x9582, 0x0001, 0x0608, 0x7054, 0x2060, 0x6000, + 0x9086, 0x0000, 0x0148, 0x9ce0, 0x0018, 0x7064, 0x9c02, 0x1208, + 0x0cb0, 0x2061, 0x1cd0, 0x0c98, 0x6003, 0x0008, 0x8529, 0x7552, + 0x9ca8, 0x0018, 0x7064, 0x9502, 0x1230, 0x7556, 0x9085, 0x0001, + 0x012e, 0x00ee, 0x0005, 0x7057, 0x1cd0, 0x0cc0, 0x9006, 0x0cc0, + 0x6020, 0x9084, 0x000f, 0x0002, 0xa07b, 0xa084, 0xa09f, 0xa0ba, + 0xc4a1, 0xc4be, 0xc4d9, 0xa07b, 0xa084, 0xa07b, 0xa0d3, 0xa07b, + 0xa07b, 0xa07b, 0xa07b, 0x9186, 0x0013, 0x1128, 0x080c, 0x8a83, + 0x080c, 0x8b8f, 0x0005, 0x0005, 0x0066, 0x6000, 0x90b2, 0x0010, + 0x1a0c, 0x0df6, 0x0013, 0x006e, 0x0005, 0xa09d, 0xa803, 0xa9ee, + 0xa09d, 0xaa7c, 0xa3b6, 0xa09d, 0xa09d, 0xa785, 0xb041, 0xa09d, + 0xa09d, 0xa09d, 0xa09d, 0xa09d, 0xa09d, 0x080c, 0x0df6, 0x0066, + 0x6000, 0x90b2, 0x0010, 0x1a0c, 0x0df6, 0x0013, 0x006e, 0x0005, + 0xa0b8, 0xb70e, 0xa0b8, 0xa0b8, 0xa0b8, 0xa0b8, 0xa0b8, 0xa0b8, + 0xb6a5, 0xb890, 0xa0b8, 0xb74f, 0xb7ce, 0xb74f, 0xb7ce, 0xa0b8, + 0x080c, 0x0df6, 0x6000, 0x9082, 0x0010, 0x1a0c, 0x0df6, 0x6000, + 0x0002, 0xa0d1, 0xb088, 0xb150, 0xb283, 0xb432, 0xa0d1, 0xa0d1, + 0xa0d1, 0xb05c, 0xb631, 0xb634, 0xa0d1, 0xa0d1, 0xa0d1, 0xa0d1, + 0xb663, 0x080c, 0x0df6, 0x0066, 0x6000, 0x90b2, 0x0010, 0x1a0c, + 0x0df6, 0x0013, 0x006e, 0x0005, 0xa0ec, 0xa0ec, 0xa12f, 0xa1ce, + 0xa263, 0xa0ec, 0xa0ec, 0xa0ec, 0xa0ee, 0xa0ec, 0xa0ec, 0xa0ec, + 0xa0ec, 0xa0ec, 0xa0ec, 0xa0ec, 0x080c, 0x0df6, 0x9186, 0x004c, + 0x0588, 0x9186, 0x0003, 0x190c, 0x0df6, 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, - 0x1afe, 0x080c, 0x86de, 0x0126, 0x2091, 0x8000, 0x080c, 0x8ced, + 0x1a7e, 0x080c, 0x865d, 0x0126, 0x2091, 0x8000, 0x080c, 0x8c6c, 0x012e, 0x0005, 0x6010, 0x00b6, 0x2058, 0xbca0, 0x00be, 0x2c00, - 0x080c, 0xa37d, 0x080c, 0xc551, 0x6003, 0x0007, 0x0005, 0x00d6, + 0x080c, 0xa285, 0x080c, 0xc471, 0x6003, 0x0007, 0x0005, 0x00d6, 0x0096, 0x00f6, 0x2079, 0x1800, 0x7a8c, 0x6014, 0x2048, 0xa87c, 0xd0ec, 0x1110, 0x9290, 0x0018, 0xac78, 0xc4fc, 0x0046, 0xa8e0, 0x9005, 0x1140, 0xa8dc, 0x921a, 0x0140, 0x0220, 0xa87b, 0x0007, @@ -4991,1623 +4948,1634 @@ unsigned short risc_code01[] = { 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, 0xa28e, 0xa28e, 0xa289, 0xa28c, 0xa28e, 0xa286, 0xa279, - 0xa279, 0xa279, 0xa279, 0xa279, 0xa279, 0xa279, 0xa279, 0xa279, - 0xa279, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x002e, 0x001e, 0x000e, - 0x004e, 0x00fe, 0x009e, 0x00de, 0x080c, 0x0dfa, 0x080c, 0xad39, - 0x0028, 0x080c, 0xae5c, 0x0010, 0x080c, 0xaf4b, 0x00fe, 0x00ee, + 0x0002, 0xa196, 0xa196, 0xa191, 0xa194, 0xa196, 0xa18e, 0xa181, + 0xa181, 0xa181, 0xa181, 0xa181, 0xa181, 0xa181, 0xa181, 0xa181, + 0xa181, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x002e, 0x001e, 0x000e, + 0x004e, 0x00fe, 0x009e, 0x00de, 0x080c, 0x0df6, 0x080c, 0xac6e, + 0x0028, 0x080c, 0xad9f, 0x0010, 0x080c, 0xae8d, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x002e, 0x001e, 0x2c00, 0xa896, 0x000e, 0x080c, - 0xa43b, 0x0530, 0xa804, 0xa80e, 0x00a6, 0x2050, 0xb100, 0x00ae, + 0xa343, 0x0530, 0xa804, 0xa80e, 0x00a6, 0x2050, 0xb100, 0x00ae, 0x8006, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x0002, 0xaacc, 0xabd0, 0xacd4, 0xadd8, 0x2031, 0x0000, 0x2041, - 0x12a2, 0x080c, 0xa5e6, 0x0160, 0x000e, 0x9005, 0x0120, 0x00fe, - 0x009e, 0x00de, 0x0005, 0x00fe, 0x009e, 0x00de, 0x0804, 0xa0e3, - 0x2001, 0x002c, 0x900e, 0x080c, 0xa4a1, 0x0c70, 0x91b6, 0x0015, - 0x0170, 0x91b6, 0x0016, 0x0158, 0x91b2, 0x0047, 0x0a0c, 0x0dfa, - 0x91b2, 0x0050, 0x1a0c, 0x0dfa, 0x9182, 0x0047, 0x00ca, 0x2001, + 0x12a8, 0x080c, 0xa4f1, 0x0160, 0x000e, 0x9005, 0x0120, 0x00fe, + 0x009e, 0x00de, 0x0005, 0x00fe, 0x009e, 0x00de, 0x0804, 0x9fea, + 0x2001, 0x002c, 0x900e, 0x080c, 0xa3a9, 0x0c70, 0x91b6, 0x0015, + 0x0170, 0x91b6, 0x0016, 0x0158, 0x91b2, 0x0047, 0x0a0c, 0x0df6, + 0x91b2, 0x0050, 0x1a0c, 0x0df6, 0x9182, 0x0047, 0x00ca, 0x2001, 0x0109, 0x2004, 0xd08c, 0x0198, 0x0126, 0x2091, 0x2800, 0x0006, - 0x0016, 0x0026, 0x080c, 0x8632, 0x002e, 0x001e, 0x000e, 0x012e, - 0xa001, 0x6000, 0x9086, 0x0002, 0x1110, 0x0804, 0xa227, 0x0005, - 0xa2f9, 0xa2f9, 0xa2fb, 0xa331, 0xa2f9, 0xa2f9, 0xa2f9, 0xa2f9, - 0xa344, 0x080c, 0x0dfa, 0x00d6, 0x0016, 0x0096, 0x080c, 0x8bc0, - 0x080c, 0x8ced, 0x6003, 0x0004, 0x6114, 0x2148, 0xa87c, 0xd0fc, + 0x0016, 0x0026, 0x080c, 0x85b1, 0x002e, 0x001e, 0x000e, 0x012e, + 0xa001, 0x6000, 0x9086, 0x0002, 0x1110, 0x0804, 0xa12f, 0x0005, + 0xa201, 0xa201, 0xa203, 0xa239, 0xa201, 0xa201, 0xa201, 0xa201, + 0xa24c, 0x080c, 0x0df6, 0x00d6, 0x0016, 0x0096, 0x080c, 0x8b3f, + 0x080c, 0x8c6c, 0x6003, 0x0004, 0x6114, 0x2148, 0xa87c, 0xd0fc, 0x01c0, 0xa878, 0xc0fc, 0x9005, 0x1158, 0xa894, 0x9005, 0x0140, - 0x2001, 0x0000, 0x900e, 0x080c, 0xa4a1, 0x080c, 0xa0e3, 0x00a8, + 0x2001, 0x0000, 0x900e, 0x080c, 0xa3a9, 0x080c, 0x9fea, 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, 0x8bc0, 0x00d6, 0x0096, 0x6114, 0x2148, 0x080c, - 0xbe37, 0x0120, 0xa87b, 0x0006, 0x080c, 0x6ae9, 0x009e, 0x00de, - 0x080c, 0xa0e3, 0x0804, 0x8ced, 0x080c, 0x8bc0, 0x080c, 0x318b, - 0x080c, 0xc54e, 0x00d6, 0x0096, 0x6114, 0x2148, 0x080c, 0xbe37, - 0x0120, 0xa87b, 0x0029, 0x080c, 0x6ae9, 0x009e, 0x00de, 0x080c, - 0xa0e3, 0x0804, 0x8ced, 0x9182, 0x0047, 0x0002, 0xa36b, 0xa36d, - 0xa36b, 0xa36b, 0xa36b, 0xa36b, 0xa36b, 0xa36b, 0xa36b, 0xa36b, - 0xa36b, 0xa36b, 0xa36d, 0x080c, 0x0dfa, 0x00d6, 0x0096, 0x080c, - 0x1582, 0x6114, 0x2148, 0xa87b, 0x0000, 0xa883, 0x0000, 0x080c, - 0x6ae9, 0x009e, 0x00de, 0x0804, 0xa0e3, 0x0026, 0x0036, 0x0056, - 0x0066, 0x0096, 0x00a6, 0x00f6, 0x0006, 0x080c, 0x1031, 0x000e, - 0x090c, 0x0dfa, 0xa960, 0x21e8, 0xa95c, 0x9188, 0x0019, 0x21a0, + 0x0005, 0x080c, 0x8b3f, 0x00d6, 0x0096, 0x6114, 0x2148, 0x080c, + 0xbd4e, 0x0120, 0xa87b, 0x0006, 0x080c, 0x6a22, 0x009e, 0x00de, + 0x080c, 0x9fea, 0x0804, 0x8c6c, 0x080c, 0x8b3f, 0x080c, 0x3095, + 0x080c, 0xc46e, 0x00d6, 0x0096, 0x6114, 0x2148, 0x080c, 0xbd4e, + 0x0120, 0xa87b, 0x0029, 0x080c, 0x6a22, 0x009e, 0x00de, 0x080c, + 0x9fea, 0x0804, 0x8c6c, 0x9182, 0x0047, 0x0002, 0xa273, 0xa275, + 0xa273, 0xa273, 0xa273, 0xa273, 0xa273, 0xa273, 0xa273, 0xa273, + 0xa273, 0xa273, 0xa275, 0x080c, 0x0df6, 0x00d6, 0x0096, 0x080c, + 0x1577, 0x6114, 0x2148, 0xa87b, 0x0000, 0xa883, 0x0000, 0x080c, + 0x6a22, 0x009e, 0x00de, 0x0804, 0x9fea, 0x0026, 0x0036, 0x0056, + 0x0066, 0x0096, 0x00a6, 0x00f6, 0x0006, 0x080c, 0x1037, 0x000e, + 0x090c, 0x0df6, 0xa960, 0x21e8, 0xa95c, 0x9188, 0x0019, 0x21a0, 0x900e, 0x20a9, 0x0020, 0x4104, 0xa87a, 0x2079, 0x1800, 0x798c, 0x9188, 0x0018, 0x918c, 0x0fff, 0xa972, 0xac76, 0x2950, 0x00a6, 0x2001, 0x0205, 0x2003, 0x0000, 0x901e, 0x2029, 0x0001, 0x9182, - 0x0034, 0x1228, 0x2011, 0x001f, 0x080c, 0xb9e8, 0x04c0, 0x2130, - 0x2009, 0x0034, 0x2011, 0x001f, 0x080c, 0xb9e8, 0x96b2, 0x0034, - 0xb004, 0x904d, 0x0110, 0x080c, 0x0fe3, 0x080c, 0x1031, 0x01d0, + 0x0035, 0x1228, 0x2011, 0x001f, 0x080c, 0xb915, 0x04c0, 0x2130, + 0x2009, 0x0034, 0x2011, 0x001f, 0x080c, 0xb915, 0x96b2, 0x0034, + 0xb004, 0x904d, 0x0110, 0x080c, 0x0fe9, 0x080c, 0x1037, 0x01d0, 0x8528, 0xa867, 0x0110, 0xa86b, 0x0000, 0x2920, 0xb406, 0x968a, - 0x003d, 0x1230, 0x2608, 0x2011, 0x001b, 0x080c, 0xb9e8, 0x00b8, + 0x003d, 0x1230, 0x2608, 0x2011, 0x001b, 0x080c, 0xb915, 0x00b8, 0x96b2, 0x003c, 0x2009, 0x003c, 0x2950, 0x2011, 0x001b, 0x080c, - 0xb9e8, 0x0c18, 0x2001, 0x0205, 0x2003, 0x0000, 0x00ae, 0x852f, + 0xb915, 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, 0x6ae9, 0x000e, + 0x2a48, 0xa804, 0xa807, 0x0000, 0x0006, 0x080c, 0x6a22, 0x000e, 0x2048, 0x9005, 0x1db0, 0x00fe, 0x00ae, 0x009e, 0x006e, 0x005e, 0x003e, 0x002e, 0x0005, 0x00d6, 0x00f6, 0x0096, 0x0006, 0x080c, - 0x1031, 0x000e, 0x090c, 0x0dfa, 0xa960, 0x21e8, 0xa95c, 0x9188, + 0x1037, 0x000e, 0x090c, 0x0df6, 0xa960, 0x21e8, 0xa95c, 0x9188, 0x0019, 0x21a0, 0x900e, 0x20a9, 0x0020, 0x4104, 0xaa66, 0xa87a, 0x2079, 0x1800, 0x798c, 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, 0x6ae9, 0x009e, + 0x0080, 0x2102, 0x4003, 0x2003, 0x0000, 0x080c, 0x6a22, 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, 0x1031, 0x2900, + 0x2018, 0x9486, 0x003e, 0x1170, 0x0096, 0x080c, 0x1037, 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, 0xa450, 0x0804, 0xa452, + 0x7816, 0x2e98, 0x2310, 0x84ff, 0x0904, 0xa358, 0x0804, 0xa35a, 0x9085, 0x0001, 0x7817, 0x0000, 0x009e, 0x00fe, 0x00de, 0x001e, 0x0005, 0x00d6, 0x0036, 0x0096, 0x6314, 0x2348, 0xa87a, 0xa982, - 0x080c, 0x6adc, 0x009e, 0x003e, 0x00de, 0x0005, 0x91b6, 0x0015, - 0x1118, 0x080c, 0xa0e3, 0x0030, 0x91b6, 0x0016, 0x190c, 0x0dfa, - 0x080c, 0xa0e3, 0x0005, 0x20a9, 0x000e, 0x20e1, 0x0000, 0x2e98, + 0x080c, 0x6a15, 0x009e, 0x003e, 0x00de, 0x0005, 0x91b6, 0x0015, + 0x1118, 0x080c, 0x9fea, 0x0030, 0x91b6, 0x0016, 0x190c, 0x0df6, + 0x080c, 0x9fea, 0x0005, 0x20a9, 0x000e, 0x20e1, 0x0000, 0x2e98, 0x6014, 0x0096, 0x2048, 0xa860, 0x20e8, 0xa85c, 0x20a0, 0x009e, - 0x4003, 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, 0xbe37, 0x0130, 0x6014, 0x2048, 0xa807, 0x0000, 0xa867, - 0x0103, 0x009e, 0x0804, 0xa0e3, 0x0096, 0x00d6, 0x0036, 0x7330, - 0x9386, 0x0200, 0x11a8, 0x6010, 0x00b6, 0x2058, 0xb8bf, 0x0000, - 0x00be, 0x6014, 0x9005, 0x0130, 0x2048, 0xa807, 0x0000, 0xa867, - 0x0103, 0xab32, 0x080c, 0xa0e3, 0x003e, 0x00de, 0x009e, 0x0005, - 0x0011, 0x1d48, 0x0cc8, 0x0006, 0x0016, 0x080c, 0xc539, 0x0188, - 0x6014, 0x9005, 0x1170, 0x600b, 0x0003, 0x601b, 0x0000, 0x6043, - 0x0000, 0x2009, 0x0022, 0x080c, 0xa8d0, 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, 0xa0e3, 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, 0xb9e8, 0x080c, 0xbe37, 0x0140, 0x6014, 0x2048, - 0xa807, 0x0000, 0xa864, 0xa8e2, 0xa867, 0x0103, 0x080c, 0xa0e3, - 0x001e, 0x009e, 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, 0xb9e8, 0x009e, 0x080c, 0xbe37, 0x0148, - 0xa804, 0x9005, 0x1158, 0xa807, 0x0000, 0xa864, 0xa8e2, 0xa867, - 0x0103, 0x080c, 0xa0e3, 0x009e, 0x001e, 0x0005, 0x0086, 0x2040, - 0xa030, 0x8007, 0x9086, 0x0100, 0x1118, 0x080c, 0xaa81, 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, 0x1288, 0x0019, 0x0d08, 0x008e, 0x0898, 0x0096, 0x0006, - 0x080c, 0x1031, 0x000e, 0x01b0, 0xa8ab, 0x0dcb, 0xa876, 0x000e, - 0xa8a2, 0x0006, 0xae6a, 0x2800, 0xa89e, 0xa97a, 0xaf72, 0xaa8e, - 0xab92, 0xac96, 0xad9a, 0x0086, 0x2940, 0x080c, 0x112e, 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, - 0xc4b1, 0x001e, 0x1158, 0x622c, 0x2268, 0x2071, 0x026c, 0x6b20, - 0x9386, 0x0003, 0x0130, 0x9386, 0x0006, 0x0128, 0x080c, 0xa0e3, - 0x0020, 0x0039, 0x0010, 0x080c, 0xa705, 0x002e, 0x00de, 0x00ee, - 0x0005, 0x0096, 0x6814, 0x2048, 0x9186, 0x0015, 0x0904, 0xa6ed, - 0x918e, 0x0016, 0x1904, 0xa703, 0x700c, 0x908c, 0xff00, 0x9186, - 0x1700, 0x0120, 0x9186, 0x0300, 0x1904, 0xa6c7, 0x89ff, 0x1138, - 0x6800, 0x9086, 0x000f, 0x0904, 0xa6aa, 0x0804, 0xa701, 0x6808, - 0x9086, 0xffff, 0x1904, 0xa6ef, 0xa87c, 0x9084, 0x0060, 0x9086, - 0x0020, 0x1128, 0xa83c, 0xa940, 0x9105, 0x1904, 0xa6ef, 0x6824, - 0xd084, 0x1904, 0xa6ef, 0xd0b4, 0x0158, 0x0016, 0x2001, 0x195e, - 0x200c, 0x6018, 0x9102, 0x9082, 0x0005, 0x001e, 0x1a04, 0xa6ef, - 0x080c, 0xc022, 0x685c, 0xa882, 0xa87c, 0xc0dc, 0xc0f4, 0xc0d4, - 0xa87e, 0x0026, 0x900e, 0x6a18, 0x2001, 0x000a, 0x080c, 0x84ff, - 0xa884, 0x920a, 0x0208, 0x8011, 0xaa86, 0x82ff, 0x002e, 0x1138, - 0x00c6, 0x2d60, 0x080c, 0xbb4a, 0x00ce, 0x0804, 0xa701, 0x00c6, - 0xa868, 0xd0fc, 0x1118, 0x080c, 0x5fa7, 0x0010, 0x080c, 0x6355, - 0x00ce, 0x1904, 0xa6ef, 0x00c6, 0x2d60, 0x080c, 0xa0e3, 0x00ce, - 0x0804, 0xa701, 0x00c6, 0x080c, 0xa130, 0x0198, 0x6017, 0x0000, - 0x6810, 0x6012, 0x080c, 0xc2b3, 0x6023, 0x0003, 0x6904, 0x00c6, - 0x2d60, 0x080c, 0xa0e3, 0x00ce, 0x080c, 0xa15d, 0x00ce, 0x0804, - 0xa701, 0x2001, 0x1960, 0x2004, 0x6842, 0x00ce, 0x04d0, 0x7008, - 0x9086, 0x000b, 0x11c8, 0x6010, 0x00b6, 0x2058, 0xb900, 0xc1bc, - 0xb902, 0x00be, 0x00c6, 0x2d60, 0xa87b, 0x0003, 0x080c, 0xc4f3, - 0x6007, 0x0085, 0x6003, 0x000b, 0x6023, 0x0002, 0x080c, 0x8679, - 0x080c, 0x8c10, 0x00ce, 0x00e8, 0x700c, 0x9086, 0x2a00, 0x1138, - 0x2001, 0x1960, 0x2004, 0x6842, 0x00a0, 0x0479, 0x00a0, 0x89ff, - 0x090c, 0x0dfa, 0x00c6, 0x00d6, 0x2d60, 0xa867, 0x0103, 0xa87b, - 0x0003, 0x080c, 0x6904, 0x080c, 0xc022, 0x080c, 0xa113, 0x00de, - 0x00ce, 0x080c, 0xa0e3, 0x009e, 0x0005, 0x9186, 0x0015, 0x1128, - 0x2001, 0x1960, 0x2004, 0x6842, 0x0068, 0x918e, 0x0016, 0x1160, - 0x00c6, 0x2d00, 0x2060, 0x080c, 0xdae2, 0x080c, 0x84a6, 0x080c, - 0xa0e3, 0x00ce, 0x080c, 0xa0e3, 0x0005, 0x0026, 0x0036, 0x0046, - 0x7228, 0xacb0, 0xabac, 0xd2f4, 0x0130, 0x2001, 0x1960, 0x2004, - 0x6842, 0x0804, 0xa77f, 0x00c6, 0x2d60, 0x080c, 0xba49, 0x00ce, - 0x6804, 0x9086, 0x0050, 0x1168, 0x00c6, 0x2d00, 0x2060, 0x6003, - 0x0001, 0x6007, 0x0050, 0x080c, 0x8679, 0x080c, 0x8c10, 0x00ce, - 0x04f0, 0x6800, 0x9086, 0x000f, 0x01a8, 0x89ff, 0x090c, 0x0dfa, - 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, 0xc1aa, 0x080c, 0x8c10, 0x0010, 0x080c, - 0xa0e3, 0x004e, 0x003e, 0x002e, 0x0005, 0x00e6, 0x00d6, 0x0026, - 0x7008, 0x9084, 0x00ff, 0x6210, 0x00b6, 0x2258, 0xba10, 0x00be, - 0x9206, 0x1904, 0xa7ea, 0x700c, 0x6210, 0x00b6, 0x2258, 0xba14, - 0x00be, 0x9206, 0x1904, 0xa7ea, 0x6038, 0x2068, 0x6824, 0xc0dc, - 0x6826, 0x6a20, 0x9286, 0x0007, 0x0904, 0xa7ea, 0x9286, 0x0002, - 0x0904, 0xa7ea, 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, - 0xbe37, 0x090c, 0x0dfa, 0xa87b, 0x0003, 0x009e, 0x080c, 0xc4f3, - 0x6007, 0x0085, 0x6003, 0x000b, 0x6023, 0x0002, 0x080c, 0x8679, - 0x080c, 0x8c10, 0x00ce, 0x0030, 0x6038, 0x2070, 0x2001, 0x1960, - 0x2004, 0x7042, 0x080c, 0xa0e3, 0x002e, 0x00de, 0x00ee, 0x0005, - 0x00b6, 0x0096, 0x00f6, 0x6014, 0x2048, 0x6010, 0x2058, 0x91b6, - 0x0015, 0x0130, 0xba08, 0xbb0c, 0xbc00, 0xc48c, 0xbc02, 0x0460, - 0x0096, 0x0156, 0x0036, 0x0026, 0x2b48, 0x9e90, 0x0010, 0x2019, - 0x000a, 0x20a9, 0x0004, 0x080c, 0xb0d0, 0x002e, 0x003e, 0x015e, - 0x009e, 0x1904, 0xa859, 0x0096, 0x0156, 0x0036, 0x0026, 0x2b48, - 0x9e90, 0x0014, 0x2019, 0x0006, 0x20a9, 0x0004, 0x080c, 0xb0d0, - 0x002e, 0x003e, 0x015e, 0x009e, 0x15a0, 0x7238, 0xba0a, 0x733c, - 0xbb0e, 0xbc00, 0xc48d, 0xbc02, 0xa804, 0x9005, 0x1128, 0x00fe, - 0x009e, 0x00be, 0x0804, 0xa4e7, 0x0096, 0x2048, 0xaa12, 0xab16, - 0xac0a, 0x009e, 0x8006, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, - 0xffc0, 0x9080, 0x0002, 0x2009, 0x002b, 0xaaa0, 0xab9c, 0xaca8, - 0xada4, 0x2031, 0x0000, 0x2041, 0x1288, 0x080c, 0xa5e6, 0x0130, - 0x00fe, 0x009e, 0x080c, 0xa0e3, 0x00be, 0x0005, 0x080c, 0xaa81, - 0x0cb8, 0x2b78, 0x00f6, 0x080c, 0x318b, 0x080c, 0xc54e, 0x00fe, - 0x00c6, 0x080c, 0xa08d, 0x2f00, 0x6012, 0x6017, 0x0000, 0x6023, - 0x0001, 0x6007, 0x0001, 0x6003, 0x0001, 0x2001, 0x0007, 0x080c, - 0x63f0, 0x080c, 0x641c, 0x080c, 0x86c1, 0x080c, 0x8c10, 0x00ce, - 0x0804, 0xa82c, 0x2100, 0x91b2, 0x0053, 0x1a0c, 0x0dfa, 0x91b2, - 0x0040, 0x1a04, 0xa8e2, 0x0002, 0xa8d0, 0xa8d0, 0xa8c6, 0xa8d0, - 0xa8d0, 0xa8d0, 0xa8c4, 0xa8c4, 0xa8c4, 0xa8c4, 0xa8c4, 0xa8c4, - 0xa8c4, 0xa8c4, 0xa8c4, 0xa8c4, 0xa8c4, 0xa8c4, 0xa8c4, 0xa8c4, - 0xa8c4, 0xa8c4, 0xa8c4, 0xa8c4, 0xa8c4, 0xa8c4, 0xa8c4, 0xa8c4, - 0xa8c4, 0xa8c4, 0xa8c4, 0xa8d0, 0xa8c4, 0xa8d0, 0xa8d0, 0xa8c4, - 0xa8c4, 0xa8c4, 0xa8c4, 0xa8c4, 0xa8c6, 0xa8c4, 0xa8c4, 0xa8c4, - 0xa8c4, 0xa8c4, 0xa8c4, 0xa8c4, 0xa8c4, 0xa8c4, 0xa8d0, 0xa8d0, - 0xa8c4, 0xa8c4, 0xa8c4, 0xa8c4, 0xa8c4, 0xa8c4, 0xa8c4, 0xa8c4, - 0xa8c4, 0xa8d0, 0xa8c4, 0xa8c4, 0x080c, 0x0dfa, 0x0066, 0x00b6, - 0x6610, 0x2658, 0xb8bc, 0xc08c, 0xb8be, 0x00be, 0x006e, 0x0000, - 0x6003, 0x0001, 0x6106, 0x9186, 0x0032, 0x0118, 0x080c, 0x86c1, - 0x0010, 0x080c, 0x8679, 0x0126, 0x2091, 0x8000, 0x080c, 0x8c10, - 0x012e, 0x0005, 0x2600, 0x0002, 0xa8f6, 0xa8f6, 0xa8f6, 0xa8d0, - 0xa8d0, 0xa8f6, 0xa8f6, 0xa8f6, 0xa8f6, 0xa8d0, 0xa8f6, 0xa8d0, - 0xa8f6, 0xa8d0, 0xa8f6, 0xa8f6, 0xa8f6, 0xa8f6, 0x080c, 0x0dfa, - 0x6004, 0x90b2, 0x0053, 0x1a0c, 0x0dfa, 0x91b6, 0x0013, 0x0904, - 0xa9ba, 0x91b6, 0x0027, 0x1904, 0xa975, 0x080c, 0x8b04, 0x6004, - 0x080c, 0xc02e, 0x01b0, 0x080c, 0xc03f, 0x01a8, 0x908e, 0x0021, - 0x0904, 0xa972, 0x908e, 0x0022, 0x1130, 0x080c, 0xa513, 0x0904, - 0xa96e, 0x0804, 0xa96f, 0x908e, 0x003d, 0x0904, 0xa972, 0x0804, - 0xa968, 0x080c, 0x31b4, 0x2001, 0x0007, 0x080c, 0x63f0, 0x6010, - 0x00b6, 0x2058, 0xb9a0, 0x00be, 0x080c, 0xaa81, 0x9186, 0x007e, - 0x1148, 0x2001, 0x1836, 0x2014, 0xc285, 0x080c, 0x7207, 0x1108, - 0xc2ad, 0x2202, 0x0036, 0x0026, 0x2019, 0x0028, 0x2110, 0x080c, - 0xdb3d, 0x002e, 0x003e, 0x0016, 0x0026, 0x0036, 0x2110, 0x2019, - 0x0028, 0x080c, 0x8803, 0x0076, 0x903e, 0x080c, 0x86f1, 0x6010, - 0x00b6, 0x905d, 0x0100, 0x00be, 0x2c08, 0x080c, 0xd5f6, 0x007e, - 0x003e, 0x002e, 0x001e, 0x080c, 0xc54e, 0x0016, 0x080c, 0xc2ab, - 0x080c, 0xa0e3, 0x001e, 0x080c, 0x3286, 0x080c, 0x8c10, 0x0030, - 0x080c, 0xc2ab, 0x080c, 0xa0e3, 0x080c, 0x8c10, 0x0005, 0x080c, - 0xaa81, 0x0cb0, 0x080c, 0xaabd, 0x0c98, 0x9186, 0x0014, 0x1db0, - 0x080c, 0x8b04, 0x6004, 0x908e, 0x0022, 0x1118, 0x080c, 0xa513, - 0x0d68, 0x080c, 0x318b, 0x080c, 0xc54e, 0x080c, 0xc02e, 0x1190, - 0x080c, 0x31b4, 0x6010, 0x00b6, 0x2058, 0xb9a0, 0x00be, 0x080c, - 0xaa81, 0x9186, 0x007e, 0x1128, 0x2001, 0x1836, 0x200c, 0xc185, - 0x2102, 0x0870, 0x080c, 0xc03f, 0x1118, 0x080c, 0xaa81, 0x0840, - 0x6004, 0x908e, 0x0032, 0x1160, 0x00e6, 0x00f6, 0x2071, 0x189c, - 0x2079, 0x0000, 0x080c, 0x351a, 0x00fe, 0x00ee, 0x0804, 0xa968, - 0x6004, 0x908e, 0x0021, 0x0d48, 0x908e, 0x0022, 0x090c, 0xaa81, - 0x0804, 0xa968, 0x90b2, 0x0040, 0x1a04, 0xaa6a, 0x2008, 0x0002, - 0xaa02, 0xaa03, 0xaa06, 0xaa09, 0xaa0c, 0xaa0f, 0xaa00, 0xaa00, - 0xaa00, 0xaa00, 0xaa00, 0xaa00, 0xaa00, 0xaa00, 0xaa00, 0xaa00, - 0xaa00, 0xaa00, 0xaa00, 0xaa00, 0xaa00, 0xaa00, 0xaa00, 0xaa00, - 0xaa00, 0xaa00, 0xaa00, 0xaa00, 0xaa00, 0xaa00, 0xaa12, 0xaa1f, - 0xaa00, 0xaa21, 0xaa1f, 0xaa00, 0xaa00, 0xaa00, 0xaa00, 0xaa00, - 0xaa1f, 0xaa1f, 0xaa00, 0xaa00, 0xaa00, 0xaa00, 0xaa00, 0xaa00, - 0xaa00, 0xaa00, 0xaa51, 0xaa1f, 0xaa00, 0xaa1b, 0xaa00, 0xaa00, - 0xaa00, 0xaa1c, 0xaa00, 0xaa00, 0xaa00, 0xaa1f, 0xaa48, 0xaa00, - 0x080c, 0x0dfa, 0x00e0, 0x2001, 0x000b, 0x0420, 0x2001, 0x0003, - 0x0408, 0x2001, 0x0005, 0x00f0, 0x2001, 0x0001, 0x00d8, 0x2001, - 0x0009, 0x00c0, 0x080c, 0x8b04, 0x6003, 0x0005, 0x080c, 0xc551, - 0x080c, 0x8c10, 0x0070, 0x0018, 0x0010, 0x080c, 0x63f0, 0x0804, - 0xaa62, 0x080c, 0x8b04, 0x080c, 0xc551, 0x6003, 0x0004, 0x080c, - 0x8c10, 0x0005, 0x080c, 0x63f0, 0x080c, 0x8b04, 0x6003, 0x0002, - 0x0036, 0x2019, 0x1866, 0x2304, 0x9084, 0xff00, 0x1120, 0x2001, - 0x195e, 0x201c, 0x0040, 0x8007, 0x909a, 0x0004, 0x0ec0, 0x8003, - 0x801b, 0x831b, 0x9318, 0x631a, 0x003e, 0x080c, 0x8c10, 0x0c08, - 0x080c, 0x8b04, 0x080c, 0xc2ab, 0x080c, 0xa0e3, 0x080c, 0x8c10, - 0x08c0, 0x00e6, 0x00f6, 0x2071, 0x189c, 0x2079, 0x0000, 0x080c, - 0x351a, 0x00fe, 0x00ee, 0x080c, 0x8b04, 0x080c, 0xa0e3, 0x080c, - 0x8c10, 0x0838, 0x080c, 0x8b04, 0x6003, 0x0002, 0x080c, 0xc551, - 0x0804, 0x8c10, 0x2600, 0x2008, 0x0002, 0xaa7f, 0xaa7f, 0xaa7f, - 0xaa62, 0xaa62, 0xaa7f, 0xaa7f, 0xaa7f, 0xaa7f, 0xaa62, 0xaa7f, - 0xaa62, 0xaa7f, 0xaa62, 0xaa7f, 0xaa7f, 0xaa7f, 0xaa7f, 0x080c, - 0x0dfa, 0x00e6, 0x0096, 0x0026, 0x0016, 0x080c, 0xbe37, 0x0568, - 0x6014, 0x2048, 0xa864, 0x9086, 0x0139, 0x11a8, 0xa894, 0x9086, - 0x0056, 0x1148, 0x080c, 0x5375, 0x0130, 0x2001, 0x0000, 0x900e, - 0x2011, 0x4000, 0x0028, 0x2001, 0x0030, 0x900e, 0x2011, 0x4005, - 0x080c, 0xc418, 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, 0x0dfa, 0x6604, 0x96b6, 0x004d, 0x1120, 0x080c, 0xc337, - 0x0804, 0xab45, 0x6604, 0x96b6, 0x0043, 0x1120, 0x080c, 0xc380, - 0x0804, 0xab45, 0x6604, 0x96b6, 0x004b, 0x1120, 0x080c, 0xc3ac, - 0x0804, 0xab45, 0x6604, 0x96b6, 0x0033, 0x1120, 0x080c, 0xc2cd, - 0x0804, 0xab45, 0x6604, 0x96b6, 0x0028, 0x1120, 0x080c, 0xc07d, - 0x0804, 0xab45, 0x6604, 0x96b6, 0x0029, 0x1120, 0x080c, 0xc0be, - 0x0804, 0xab45, 0x6604, 0x96b6, 0x001f, 0x1118, 0x080c, 0xa4bb, - 0x04e0, 0x6604, 0x96b6, 0x0000, 0x1118, 0x080c, 0xa7f0, 0x04a8, - 0x6604, 0x96b6, 0x0022, 0x1118, 0x080c, 0xa4f4, 0x0470, 0x6604, - 0x96b6, 0x0035, 0x1118, 0x080c, 0xa604, 0x0438, 0x6604, 0x96b6, - 0x0039, 0x1118, 0x080c, 0xa785, 0x0400, 0x6604, 0x96b6, 0x003d, - 0x1118, 0x080c, 0xa52c, 0x00c8, 0x6604, 0x96b6, 0x0044, 0x1118, - 0x080c, 0xa568, 0x0090, 0x6604, 0x96b6, 0x0049, 0x1118, 0x080c, - 0xa593, 0x0058, 0x91b6, 0x0015, 0x1110, 0x0063, 0x0030, 0x91b6, - 0x0016, 0x1128, 0x00be, 0x0804, 0xae05, 0x00be, 0x0005, 0x080c, - 0xa178, 0x0cd8, 0xab62, 0xab65, 0xab62, 0xaba9, 0xab62, 0xad39, - 0xae12, 0xab62, 0xab62, 0xaddf, 0xab62, 0xadf3, 0x0096, 0x080c, - 0x1582, 0x6014, 0x2048, 0xa800, 0x2048, 0xa867, 0x0103, 0x009e, - 0x0804, 0xa0e3, 0xa001, 0xa001, 0x0005, 0x00e6, 0x2071, 0x1800, - 0x708c, 0x9086, 0x0074, 0x1540, 0x080c, 0xd5c7, 0x11b0, 0x6010, - 0x00b6, 0x2058, 0x7030, 0xd08c, 0x0128, 0xb800, 0xd0bc, 0x0110, - 0xc0c5, 0xb802, 0x00e9, 0x00be, 0x2001, 0x0006, 0x080c, 0x63f0, - 0x080c, 0x31b4, 0x080c, 0xa0e3, 0x0088, 0x2001, 0x000a, 0x080c, - 0x63f0, 0x080c, 0x31b4, 0x6003, 0x0001, 0x6007, 0x0001, 0x080c, - 0x86c1, 0x080c, 0x8c10, 0x0010, 0x080c, 0xad24, 0x00ee, 0x0005, - 0x00d6, 0xb800, 0xd084, 0x0158, 0x9006, 0x080c, 0x63dc, 0x2069, - 0x185b, 0x6804, 0x0020, 0x2001, 0x0006, 0x080c, 0x641c, 0x00de, - 0x0005, 0x00b6, 0x0096, 0x00d6, 0x2011, 0x1823, 0x2204, 0x9086, - 0x0074, 0x1904, 0xacfb, 0x6010, 0x2058, 0xbaa0, 0x9286, 0x007e, - 0x1120, 0x080c, 0xaf56, 0x0804, 0xac60, 0x00d6, 0x080c, 0x7207, - 0x0198, 0x0026, 0x2011, 0x0010, 0x080c, 0x67e7, 0x002e, 0x05c8, - 0x080c, 0x55ef, 0x1540, 0x6014, 0x2048, 0xa807, 0x0000, 0xa867, - 0x0103, 0xa833, 0xdead, 0x00f8, 0x0026, 0x2011, 0x8008, 0x080c, - 0x67e7, 0x002e, 0x0530, 0x6014, 0x2048, 0xa864, 0x9084, 0x00ff, + 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, 0xbd4e, 0x0130, 0x6014, 0x2048, + 0xa807, 0x0000, 0xa867, 0x0103, 0x009e, 0x0804, 0x9fea, 0x0096, + 0x00d6, 0x0036, 0x7330, 0x9386, 0x0200, 0x11a8, 0x6010, 0x00b6, + 0x2058, 0xb8bf, 0x0000, 0x00be, 0x6014, 0x9005, 0x0130, 0x2048, + 0xa807, 0x0000, 0xa867, 0x0103, 0xab32, 0x080c, 0x9fea, 0x003e, + 0x00de, 0x009e, 0x0005, 0x0011, 0x1d48, 0x0cc8, 0x0006, 0x0016, + 0x080c, 0xc459, 0x0188, 0x6014, 0x9005, 0x1170, 0x600b, 0x0003, + 0x601b, 0x0000, 0x6043, 0x0000, 0x2009, 0x0022, 0x080c, 0xa7db, + 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, 0x9fea, + 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, 0xb915, 0x080c, 0xbd4e, + 0x0140, 0x6014, 0x2048, 0xa807, 0x0000, 0xa864, 0xa8e2, 0xa867, + 0x0103, 0x080c, 0x9fea, 0x001e, 0x009e, 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, 0xb915, 0x009e, + 0x080c, 0xbd4e, 0x0148, 0xa804, 0x9005, 0x1158, 0xa807, 0x0000, + 0xa864, 0xa8e2, 0xa867, 0x0103, 0x080c, 0x9fea, 0x009e, 0x001e, + 0x0005, 0x0086, 0x2040, 0xa030, 0x8007, 0x9086, 0x0100, 0x1118, + 0x080c, 0xa9a7, 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, 0x128e, 0x0019, 0x0d08, 0x008e, + 0x0898, 0x0096, 0x0006, 0x080c, 0x1037, 0x000e, 0x01b0, 0xa8ab, + 0x0dcb, 0xa876, 0x000e, 0xa8a2, 0x0006, 0xae6a, 0x2800, 0xa89e, + 0xa97a, 0xaf72, 0xaa8e, 0xab92, 0xac96, 0xad9a, 0x0086, 0x2940, + 0x080c, 0x1134, 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, 0xc3cf, 0x001e, 0x1158, 0x622c, 0x2268, + 0x2071, 0x026c, 0x6b20, 0x9386, 0x0003, 0x0130, 0x9386, 0x0006, + 0x0128, 0x080c, 0x9fea, 0x0020, 0x0039, 0x0010, 0x080c, 0xa610, + 0x002e, 0x00de, 0x00ee, 0x0005, 0x0096, 0x6814, 0x2048, 0x9186, + 0x0015, 0x0904, 0xa5f8, 0x918e, 0x0016, 0x1904, 0xa60e, 0x700c, + 0x908c, 0xff00, 0x9186, 0x1700, 0x0120, 0x9186, 0x0300, 0x1904, + 0xa5d2, 0x89ff, 0x1138, 0x6800, 0x9086, 0x000f, 0x0904, 0xa5b5, + 0x0804, 0xa60c, 0x6808, 0x9086, 0xffff, 0x1904, 0xa5fa, 0xa87c, + 0x9084, 0x0060, 0x9086, 0x0020, 0x1128, 0xa83c, 0xa940, 0x9105, + 0x1904, 0xa5fa, 0x6824, 0xd084, 0x1904, 0xa5fa, 0xd0b4, 0x0158, + 0x0016, 0x2001, 0x1960, 0x200c, 0x6018, 0x9102, 0x9082, 0x0005, + 0x001e, 0x1a04, 0xa5fa, 0x080c, 0xbf39, 0x685c, 0xa882, 0xa87c, + 0xc0dc, 0xc0f4, 0xc0d4, 0xa87e, 0x0026, 0x900e, 0x6a18, 0x2001, + 0x000a, 0x080c, 0x847e, 0xa884, 0x920a, 0x0208, 0x8011, 0xaa86, + 0x82ff, 0x002e, 0x1138, 0x00c6, 0x2d60, 0x080c, 0xba77, 0x00ce, + 0x0804, 0xa60c, 0x00c6, 0xa868, 0xd0fc, 0x1118, 0x080c, 0x5eab, + 0x0010, 0x080c, 0x6259, 0x00ce, 0x1904, 0xa5fa, 0x00c6, 0x2d60, + 0x080c, 0x9fea, 0x00ce, 0x0804, 0xa60c, 0x00c6, 0x080c, 0xa03b, + 0x0198, 0x6017, 0x0000, 0x6810, 0x6012, 0x080c, 0xc1ca, 0x6023, + 0x0003, 0x6904, 0x00c6, 0x2d60, 0x080c, 0x9fea, 0x00ce, 0x080c, + 0xa068, 0x00ce, 0x0804, 0xa60c, 0x2001, 0x1962, 0x2004, 0x6842, + 0x00ce, 0x04d0, 0x7008, 0x9086, 0x000b, 0x11c8, 0x6010, 0x00b6, + 0x2058, 0xb900, 0xc1bc, 0xb902, 0x00be, 0x00c6, 0x2d60, 0xa87b, + 0x0003, 0x080c, 0xc413, 0x6007, 0x0085, 0x6003, 0x000b, 0x6023, + 0x0002, 0x080c, 0x85f8, 0x080c, 0x8b8f, 0x00ce, 0x00e8, 0x700c, + 0x9086, 0x2a00, 0x1138, 0x2001, 0x1962, 0x2004, 0x6842, 0x00a0, + 0x0479, 0x00a0, 0x89ff, 0x090c, 0x0df6, 0x00c6, 0x00d6, 0x2d60, + 0xa867, 0x0103, 0xa87b, 0x0003, 0x080c, 0x683c, 0x080c, 0xbf39, + 0x080c, 0xa01c, 0x00de, 0x00ce, 0x080c, 0x9fea, 0x009e, 0x0005, + 0x9186, 0x0015, 0x1128, 0x2001, 0x1962, 0x2004, 0x6842, 0x0068, + 0x918e, 0x0016, 0x1160, 0x00c6, 0x2d00, 0x2060, 0x080c, 0xda94, + 0x080c, 0x8425, 0x080c, 0x9fea, 0x00ce, 0x080c, 0x9fea, 0x0005, + 0x0026, 0x0036, 0x0046, 0x7228, 0xacb0, 0xabac, 0xd2f4, 0x0130, + 0x2001, 0x1962, 0x2004, 0x6842, 0x0804, 0xa68a, 0x00c6, 0x2d60, + 0x080c, 0xb976, 0x00ce, 0x6804, 0x9086, 0x0050, 0x1168, 0x00c6, + 0x2d00, 0x2060, 0x6003, 0x0001, 0x6007, 0x0050, 0x080c, 0x85f8, + 0x080c, 0x8b8f, 0x00ce, 0x04f0, 0x6800, 0x9086, 0x000f, 0x01a8, + 0x89ff, 0x090c, 0x0df6, 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, 0xc0c1, 0x080c, + 0x8b8f, 0x0010, 0x080c, 0x9fea, 0x004e, 0x003e, 0x002e, 0x0005, + 0x00e6, 0x00d6, 0x0026, 0x7008, 0x9084, 0x00ff, 0x6210, 0x00b6, + 0x2258, 0xba10, 0x00be, 0x9206, 0x1904, 0xa6f5, 0x700c, 0x6210, + 0x00b6, 0x2258, 0xba14, 0x00be, 0x9206, 0x1904, 0xa6f5, 0x6038, + 0x2068, 0x6824, 0xc0dc, 0x6826, 0x6a20, 0x9286, 0x0007, 0x0904, + 0xa6f5, 0x9286, 0x0002, 0x0904, 0xa6f5, 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, 0xbd4e, 0x090c, 0x0df6, 0xa87b, 0x0003, + 0x009e, 0x080c, 0xc413, 0x6007, 0x0085, 0x6003, 0x000b, 0x6023, + 0x0002, 0x080c, 0x85f8, 0x080c, 0x8b8f, 0x00ce, 0x0030, 0x6038, + 0x2070, 0x2001, 0x1962, 0x2004, 0x7042, 0x080c, 0x9fea, 0x002e, + 0x00de, 0x00ee, 0x0005, 0x00b6, 0x0096, 0x00f6, 0x6014, 0x2048, + 0x6010, 0x2058, 0x91b6, 0x0015, 0x0130, 0xba08, 0xbb0c, 0xbc00, + 0xc48c, 0xbc02, 0x0460, 0x0096, 0x0156, 0x0036, 0x0026, 0x2b48, + 0x9e90, 0x0010, 0x2019, 0x000a, 0x20a9, 0x0004, 0x080c, 0xb017, + 0x002e, 0x003e, 0x015e, 0x009e, 0x1904, 0xa764, 0x0096, 0x0156, + 0x0036, 0x0026, 0x2b48, 0x9e90, 0x0014, 0x2019, 0x0006, 0x20a9, + 0x0004, 0x080c, 0xb017, 0x002e, 0x003e, 0x015e, 0x009e, 0x15a0, + 0x7238, 0xba0a, 0x733c, 0xbb0e, 0xbc00, 0xc48d, 0xbc02, 0xa804, + 0x9005, 0x1128, 0x00fe, 0x009e, 0x00be, 0x0804, 0xa3f2, 0x0096, + 0x2048, 0xaa12, 0xab16, 0xac0a, 0x009e, 0x8006, 0x8006, 0x8007, + 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x0002, 0x2009, 0x002b, + 0xaaa0, 0xab9c, 0xaca8, 0xada4, 0x2031, 0x0000, 0x2041, 0x128e, + 0x080c, 0xa4f1, 0x0130, 0x00fe, 0x009e, 0x080c, 0x9fea, 0x00be, + 0x0005, 0x080c, 0xa9a7, 0x0cb8, 0x2b78, 0x00f6, 0x080c, 0x3095, + 0x080c, 0xc46e, 0x00fe, 0x00c6, 0x080c, 0x9f94, 0x2f00, 0x6012, + 0x6017, 0x0000, 0x6023, 0x0001, 0x6007, 0x0001, 0x6003, 0x0001, + 0x2001, 0x0007, 0x080c, 0x62f4, 0x080c, 0x6320, 0x080c, 0x8640, + 0x080c, 0x8b8f, 0x00ce, 0x0804, 0xa737, 0x2100, 0x91b2, 0x0053, + 0x1a0c, 0x0df6, 0x91b2, 0x0040, 0x1a04, 0xa7ed, 0x0002, 0xa7db, + 0xa7db, 0xa7d1, 0xa7db, 0xa7db, 0xa7db, 0xa7cf, 0xa7cf, 0xa7cf, + 0xa7cf, 0xa7cf, 0xa7cf, 0xa7cf, 0xa7cf, 0xa7cf, 0xa7cf, 0xa7cf, + 0xa7cf, 0xa7cf, 0xa7cf, 0xa7cf, 0xa7cf, 0xa7cf, 0xa7cf, 0xa7cf, + 0xa7cf, 0xa7cf, 0xa7cf, 0xa7cf, 0xa7cf, 0xa7cf, 0xa7db, 0xa7cf, + 0xa7db, 0xa7db, 0xa7cf, 0xa7cf, 0xa7cf, 0xa7cf, 0xa7cf, 0xa7d1, + 0xa7cf, 0xa7cf, 0xa7cf, 0xa7cf, 0xa7cf, 0xa7cf, 0xa7cf, 0xa7cf, + 0xa7cf, 0xa7db, 0xa7db, 0xa7cf, 0xa7cf, 0xa7cf, 0xa7cf, 0xa7cf, + 0xa7cf, 0xa7cf, 0xa7cf, 0xa7cf, 0xa7db, 0xa7cf, 0xa7cf, 0x080c, + 0x0df6, 0x0066, 0x00b6, 0x6610, 0x2658, 0xb8bc, 0xc08c, 0xb8be, + 0x00be, 0x006e, 0x0000, 0x6003, 0x0001, 0x6106, 0x9186, 0x0032, + 0x0118, 0x080c, 0x8640, 0x0010, 0x080c, 0x85f8, 0x0126, 0x2091, + 0x8000, 0x080c, 0x8b8f, 0x012e, 0x0005, 0x2600, 0x0002, 0xa801, + 0xa801, 0xa801, 0xa7db, 0xa7db, 0xa801, 0xa801, 0xa801, 0xa801, + 0xa7db, 0xa801, 0xa7db, 0xa801, 0xa7db, 0xa801, 0xa801, 0xa801, + 0xa801, 0x080c, 0x0df6, 0x6004, 0x90b2, 0x0053, 0x1a0c, 0x0df6, + 0x91b6, 0x0013, 0x0904, 0xa8d6, 0x91b6, 0x0027, 0x1904, 0xa880, + 0x080c, 0x8a83, 0x6004, 0x080c, 0xbf45, 0x01b0, 0x080c, 0xbf56, + 0x01a8, 0x908e, 0x0021, 0x0904, 0xa87d, 0x908e, 0x0022, 0x1130, + 0x080c, 0xa41e, 0x0904, 0xa879, 0x0804, 0xa87a, 0x908e, 0x003d, + 0x0904, 0xa87d, 0x0804, 0xa873, 0x080c, 0x30be, 0x2001, 0x0007, + 0x080c, 0x62f4, 0x6010, 0x00b6, 0x2058, 0xb9a0, 0x00be, 0x080c, + 0xa9a7, 0x9186, 0x007e, 0x1148, 0x2001, 0x1836, 0x2014, 0xc285, + 0x080c, 0x717e, 0x1108, 0xc2ad, 0x2202, 0x0036, 0x0026, 0x2019, + 0x0028, 0x2110, 0x080c, 0xdaf0, 0x002e, 0x003e, 0x0016, 0x0026, + 0x0036, 0x2110, 0x2019, 0x0028, 0x080c, 0x8782, 0x0076, 0x903e, + 0x080c, 0x8670, 0x6010, 0x00b6, 0x905d, 0x0100, 0x00be, 0x2c08, + 0x080c, 0xd556, 0x007e, 0x003e, 0x002e, 0x001e, 0x080c, 0xc46e, + 0x0016, 0x080c, 0xc1c2, 0x080c, 0x9fea, 0x001e, 0x080c, 0x3190, + 0x080c, 0x8b8f, 0x0030, 0x080c, 0xc1c2, 0x080c, 0x9fea, 0x080c, + 0x8b8f, 0x0005, 0x080c, 0xa9a7, 0x0cb0, 0x080c, 0xa9e3, 0x0c98, + 0x9186, 0x0015, 0x0118, 0x9186, 0x0016, 0x1148, 0x080c, 0xc47f, + 0x0d80, 0x6000, 0x9086, 0x0002, 0x0904, 0xa9ee, 0x0c50, 0x9186, + 0x0014, 0x1d38, 0x080c, 0x8a83, 0x6004, 0x908e, 0x0022, 0x1118, + 0x080c, 0xa41e, 0x09f0, 0x080c, 0x3095, 0x080c, 0xc46e, 0x080c, + 0xbf45, 0x1198, 0x080c, 0x30be, 0x6010, 0x00b6, 0x2058, 0xb9a0, + 0x00be, 0x080c, 0xa9a7, 0x9186, 0x007e, 0x1128, 0x2001, 0x1836, + 0x200c, 0xc185, 0x2102, 0x0804, 0xa873, 0x080c, 0xbf56, 0x1120, + 0x080c, 0xa9a7, 0x0804, 0xa873, 0x6004, 0x908e, 0x0032, 0x1160, + 0x00e6, 0x00f6, 0x2071, 0x189c, 0x2079, 0x0000, 0x080c, 0x3424, + 0x00fe, 0x00ee, 0x0804, 0xa873, 0x6004, 0x908e, 0x0021, 0x0d40, + 0x908e, 0x0022, 0x090c, 0xa9a7, 0x0804, 0xa873, 0x90b2, 0x0040, + 0x1a04, 0xa990, 0x2008, 0x0002, 0xa91e, 0xa91f, 0xa922, 0xa925, + 0xa928, 0xa935, 0xa91c, 0xa91c, 0xa91c, 0xa91c, 0xa91c, 0xa91c, + 0xa91c, 0xa91c, 0xa91c, 0xa91c, 0xa91c, 0xa91c, 0xa91c, 0xa91c, + 0xa91c, 0xa91c, 0xa91c, 0xa91c, 0xa91c, 0xa91c, 0xa91c, 0xa91c, + 0xa91c, 0xa91c, 0xa938, 0xa945, 0xa91c, 0xa947, 0xa945, 0xa91c, + 0xa91c, 0xa91c, 0xa91c, 0xa91c, 0xa945, 0xa945, 0xa91c, 0xa91c, + 0xa91c, 0xa91c, 0xa91c, 0xa91c, 0xa91c, 0xa91c, 0xa977, 0xa945, + 0xa91c, 0xa941, 0xa91c, 0xa91c, 0xa91c, 0xa942, 0xa91c, 0xa91c, + 0xa91c, 0xa945, 0xa96e, 0xa91c, 0x080c, 0x0df6, 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, 0x8a83, 0x6003, 0x0005, 0x080c, 0xc471, 0x080c, 0x8b8f, + 0x0070, 0x0018, 0x0010, 0x080c, 0x62f4, 0x0804, 0xa988, 0x080c, + 0x8a83, 0x080c, 0xc471, 0x6003, 0x0004, 0x080c, 0x8b8f, 0x0005, + 0x080c, 0x62f4, 0x080c, 0x8a83, 0x6003, 0x0002, 0x0036, 0x2019, + 0x1866, 0x2304, 0x9084, 0xff00, 0x1120, 0x2001, 0x1960, 0x201c, + 0x0040, 0x8007, 0x909a, 0x0004, 0x0ec0, 0x8003, 0x801b, 0x831b, + 0x9318, 0x631a, 0x003e, 0x080c, 0x8b8f, 0x0c08, 0x080c, 0x8a83, + 0x080c, 0xc1c2, 0x080c, 0x9fea, 0x080c, 0x8b8f, 0x08c0, 0x00e6, + 0x00f6, 0x2071, 0x189c, 0x2079, 0x0000, 0x080c, 0x3424, 0x00fe, + 0x00ee, 0x080c, 0x8a83, 0x080c, 0x9fea, 0x080c, 0x8b8f, 0x0838, + 0x080c, 0x8a83, 0x6003, 0x0002, 0x080c, 0xc471, 0x0804, 0x8b8f, + 0x2600, 0x2008, 0x0002, 0xa9a5, 0xa9a5, 0xa9a5, 0xa988, 0xa988, + 0xa9a5, 0xa9a5, 0xa9a5, 0xa9a5, 0xa988, 0xa9a5, 0xa988, 0xa9a5, + 0xa988, 0xa9a5, 0xa9a5, 0xa9a5, 0xa9a5, 0x080c, 0x0df6, 0x00e6, + 0x0096, 0x0026, 0x0016, 0x080c, 0xbd4e, 0x0568, 0x6014, 0x2048, + 0xa864, 0x9086, 0x0139, 0x11a8, 0xa894, 0x9086, 0x0056, 0x1148, + 0x080c, 0x5275, 0x0130, 0x2001, 0x0000, 0x900e, 0x2011, 0x4000, + 0x0028, 0x2001, 0x0030, 0x900e, 0x2011, 0x4005, 0x080c, 0xc333, + 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, 0x0df6, + 0x6604, 0x96b6, 0x004d, 0x1120, 0x080c, 0xc252, 0x0804, 0xaa6b, + 0x6604, 0x96b6, 0x0043, 0x1120, 0x080c, 0xc29b, 0x0804, 0xaa6b, + 0x6604, 0x96b6, 0x004b, 0x1120, 0x080c, 0xc2c7, 0x0804, 0xaa6b, + 0x6604, 0x96b6, 0x0033, 0x1120, 0x080c, 0xc1e4, 0x0804, 0xaa6b, + 0x6604, 0x96b6, 0x0028, 0x1120, 0x080c, 0xbf94, 0x0804, 0xaa6b, + 0x6604, 0x96b6, 0x0029, 0x1120, 0x080c, 0xbfd5, 0x0804, 0xaa6b, + 0x6604, 0x96b6, 0x001f, 0x1118, 0x080c, 0xa3c3, 0x04e0, 0x6604, + 0x96b6, 0x0000, 0x1118, 0x080c, 0xa6fb, 0x04a8, 0x6604, 0x96b6, + 0x0022, 0x1118, 0x080c, 0xa3ff, 0x0470, 0x6604, 0x96b6, 0x0035, + 0x1118, 0x080c, 0xa50f, 0x0438, 0x6604, 0x96b6, 0x0039, 0x1118, + 0x080c, 0xa690, 0x0400, 0x6604, 0x96b6, 0x003d, 0x1118, 0x080c, + 0xa437, 0x00c8, 0x6604, 0x96b6, 0x0044, 0x1118, 0x080c, 0xa473, + 0x0090, 0x6604, 0x96b6, 0x0049, 0x1118, 0x080c, 0xa49e, 0x0058, + 0x91b6, 0x0015, 0x1110, 0x0063, 0x0030, 0x91b6, 0x0016, 0x1128, + 0x00be, 0x0804, 0xad46, 0x00be, 0x0005, 0x080c, 0xa083, 0x0cd8, + 0xaa88, 0xaa96, 0xaa88, 0xaada, 0xaa88, 0xac6e, 0xad53, 0xaa88, + 0xaa88, 0xad20, 0xaa88, 0xad34, 0x0096, 0x080c, 0x1577, 0x6014, + 0x2048, 0xa800, 0x2048, 0xa867, 0x0103, 0x009e, 0x0804, 0x9fea, + 0xa001, 0xa001, 0x0005, 0x6604, 0x96b6, 0x0004, 0x1130, 0x2001, + 0x0001, 0x080c, 0x62e0, 0x0804, 0x9fea, 0x0005, 0x00e6, 0x2071, + 0x1800, 0x708c, 0x9086, 0x0074, 0x1540, 0x080c, 0xd527, 0x11b0, + 0x6010, 0x00b6, 0x2058, 0x7030, 0xd08c, 0x0128, 0xb800, 0xd0bc, + 0x0110, 0xc0c5, 0xb802, 0x00e9, 0x00be, 0x2001, 0x0006, 0x080c, + 0x62f4, 0x080c, 0x30be, 0x080c, 0x9fea, 0x0088, 0x2001, 0x000a, + 0x080c, 0x62f4, 0x080c, 0x30be, 0x6003, 0x0001, 0x6007, 0x0001, + 0x080c, 0x8640, 0x080c, 0x8b8f, 0x0010, 0x080c, 0xac59, 0x00ee, + 0x0005, 0x00d6, 0xb800, 0xd084, 0x0158, 0x9006, 0x080c, 0x62e0, + 0x2069, 0x185b, 0x6804, 0x0020, 0x2001, 0x0006, 0x080c, 0x6320, + 0x00de, 0x0005, 0x00b6, 0x0096, 0x00d6, 0x2011, 0x1823, 0x2204, + 0x9086, 0x0074, 0x1904, 0xac30, 0x6010, 0x2058, 0xbaa0, 0x9286, + 0x007e, 0x1120, 0x080c, 0xae98, 0x0804, 0xab9d, 0x00d6, 0x080c, + 0x717e, 0x01a0, 0x0026, 0x2011, 0x0010, 0x080c, 0x66ed, 0x002e, + 0x0904, 0xab3e, 0x080c, 0x54ef, 0x1598, 0x6014, 0x2048, 0xa807, + 0x0000, 0xa867, 0x0103, 0xa833, 0xdead, 0x0450, 0x6010, 0x00b6, + 0x2058, 0xb910, 0x00be, 0x9186, 0x00ff, 0x0580, 0x0026, 0x2011, + 0x8008, 0x080c, 0x66ed, 0x002e, 0x0548, 0x6014, 0x9005, 0x090c, + 0x0df6, 0x2048, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0039, 0x1140, + 0x2001, 0x0030, 0x900e, 0x2011, 0x4009, 0x080c, 0xc333, 0x0040, + 0x6014, 0x2048, 0xa807, 0x0000, 0xa867, 0x0103, 0xa833, 0xdead, + 0x6010, 0x2058, 0xb9a0, 0x0016, 0x080c, 0x30be, 0x080c, 0x9fea, + 0x001e, 0x080c, 0x3190, 0x00de, 0x0804, 0xac33, 0x00de, 0x080c, + 0xae8d, 0x6010, 0x2058, 0xbaa0, 0x9286, 0x0080, 0x1510, 0x6014, + 0x9005, 0x01a8, 0x2048, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0039, + 0x1140, 0x2001, 0x0000, 0x900e, 0x2011, 0x4000, 0x080c, 0xc333, + 0x0030, 0xa807, 0x0000, 0xa867, 0x0103, 0xa833, 0x0200, 0x2001, + 0x0006, 0x080c, 0x62f4, 0x080c, 0x30be, 0x080c, 0x9fea, 0x0804, + 0xac33, 0x080c, 0xac41, 0x6014, 0x9005, 0x0190, 0x2048, 0xa868, + 0xd0f4, 0x01e8, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0039, 0x1d08, + 0x2001, 0x0000, 0x900e, 0x2011, 0x4000, 0x080c, 0xc333, 0x08f8, + 0x080c, 0xac37, 0x0160, 0x9006, 0x080c, 0x62e0, 0x2001, 0x0004, + 0x080c, 0x6320, 0x2001, 0x0007, 0x080c, 0x62f4, 0x08a0, 0x2001, + 0x0004, 0x080c, 0x62f4, 0x6003, 0x0001, 0x6007, 0x0003, 0x080c, + 0x8640, 0x080c, 0x8b8f, 0x0804, 0xac33, 0xb85c, 0xd0e4, 0x0178, + 0x080c, 0xc164, 0x080c, 0x717e, 0x0118, 0xd0dc, 0x1904, 0xab5f, + 0x2011, 0x1836, 0x2204, 0xc0ad, 0x2012, 0x0804, 0xab5f, 0x080c, + 0xc1a1, 0x2011, 0x1836, 0x2204, 0xc0a5, 0x2012, 0x0006, 0x080c, + 0xd6c7, 0x000e, 0x1904, 0xab5f, 0xc0b5, 0x2012, 0x2001, 0x0006, + 0x080c, 0x62f4, 0x9006, 0x080c, 0x62e0, 0x00c6, 0x2001, 0x180f, + 0x2004, 0xd09c, 0x0520, 0x00f6, 0x2079, 0x0100, 0x00e6, 0x2071, + 0x1800, 0x700c, 0x9084, 0x00ff, 0x78e6, 0x707a, 0x7010, 0x78ea, + 0x707e, 0x908c, 0x00ff, 0x00ee, 0x780c, 0xc0b5, 0x780e, 0x00fe, + 0x080c, 0x26b6, 0x00f6, 0x2100, 0x900e, 0x080c, 0x266d, 0x795a, + 0x00fe, 0x9186, 0x0081, 0x01f0, 0x2009, 0x0081, 0x00e0, 0x2009, + 0x00ef, 0x00f6, 0x2079, 0x0100, 0x79ea, 0x78e7, 0x0000, 0x7932, + 0x7936, 0x780c, 0xc0b5, 0x780e, 0x00fe, 0x080c, 0x26b6, 0x00f6, + 0x2079, 0x1800, 0x797e, 0x2100, 0x900e, 0x797a, 0x080c, 0x266d, + 0x795a, 0x00fe, 0x8108, 0x080c, 0x6343, 0x2b00, 0x00ce, 0x1904, + 0xab5f, 0x6012, 0x2009, 0x180f, 0x210c, 0xd19c, 0x0150, 0x2009, + 0x027c, 0x210c, 0x918c, 0x00ff, 0xb912, 0x2009, 0x027d, 0x210c, + 0xb916, 0x2001, 0x0002, 0x080c, 0x62f4, 0x6023, 0x0001, 0x6003, + 0x0001, 0x6007, 0x0002, 0x080c, 0x8640, 0x080c, 0x8b8f, 0x0018, + 0x080c, 0xa9a7, 0x0431, 0x00de, 0x009e, 0x00be, 0x0005, 0x2001, + 0x1810, 0x2004, 0xd0a4, 0x0120, 0x2001, 0x185c, 0x2004, 0xd0ac, + 0x0005, 0x00e6, 0x080c, 0xdb49, 0x0190, 0x2071, 0x0260, 0x7108, + 0x720c, 0x918c, 0x00ff, 0x1118, 0x9284, 0xff00, 0x0140, 0x6010, + 0x2058, 0xb8a0, 0x9084, 0xff80, 0x1110, 0xb912, 0xba16, 0x00ee, + 0x0005, 0x2030, 0x2001, 0x0007, 0x080c, 0x62f4, 0x080c, 0x54ef, + 0x1120, 0x2001, 0x0007, 0x080c, 0x6320, 0x080c, 0x30be, 0x6020, + 0x9086, 0x000a, 0x1108, 0x0005, 0x0804, 0x9fea, 0x00b6, 0x00e6, + 0x0026, 0x0016, 0x2071, 0x1800, 0x708c, 0x9086, 0x0014, 0x1904, + 0xad17, 0x00d6, 0x080c, 0x717e, 0x01a0, 0x0026, 0x2011, 0x0010, + 0x080c, 0x66ed, 0x002e, 0x0904, 0xacc9, 0x080c, 0x54ef, 0x1598, + 0x6014, 0x2048, 0xa807, 0x0000, 0xa867, 0x0103, 0xa833, 0xdead, + 0x0450, 0x6010, 0x00b6, 0x2058, 0xb910, 0x00be, 0x9186, 0x00ff, + 0x0580, 0x0026, 0x2011, 0x8008, 0x080c, 0x66ed, 0x002e, 0x0548, + 0x6014, 0x9005, 0x090c, 0x0df6, 0x2048, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0039, 0x1140, 0x2001, 0x0030, 0x900e, 0x2011, 0x4009, - 0x080c, 0xc418, 0x0040, 0x6014, 0x2048, 0xa807, 0x0000, 0xa867, + 0x080c, 0xc333, 0x0040, 0x6014, 0x2048, 0xa807, 0x0000, 0xa867, 0x0103, 0xa833, 0xdead, 0x6010, 0x2058, 0xb9a0, 0x0016, 0x080c, - 0x31b4, 0x080c, 0xa0e3, 0x001e, 0x080c, 0x3286, 0x00de, 0x0804, - 0xacfe, 0x00de, 0x080c, 0xaf4b, 0x6010, 0x2058, 0xbaa0, 0x9286, - 0x0080, 0x1510, 0x6014, 0x9005, 0x01a8, 0x2048, 0xa864, 0x9084, - 0x00ff, 0x9086, 0x0039, 0x1140, 0x2001, 0x0000, 0x900e, 0x2011, - 0x4000, 0x080c, 0xc418, 0x0030, 0xa807, 0x0000, 0xa867, 0x0103, - 0xa833, 0x0200, 0x2001, 0x0006, 0x080c, 0x63f0, 0x080c, 0x31b4, - 0x080c, 0xa0e3, 0x0804, 0xacfe, 0x080c, 0xad0c, 0x6014, 0x9005, - 0x0190, 0x2048, 0xa868, 0xd0f4, 0x01e8, 0xa864, 0x9084, 0x00ff, - 0x9086, 0x0039, 0x1d08, 0x2001, 0x0000, 0x900e, 0x2011, 0x4000, - 0x080c, 0xc418, 0x08f8, 0x080c, 0xad02, 0x0160, 0x9006, 0x080c, - 0x63dc, 0x2001, 0x0004, 0x080c, 0x641c, 0x2001, 0x0007, 0x080c, - 0x63f0, 0x08a0, 0x2001, 0x0004, 0x080c, 0x63f0, 0x6003, 0x0001, - 0x6007, 0x0003, 0x080c, 0x86c1, 0x080c, 0x8c10, 0x0804, 0xacfe, - 0xb85c, 0xd0e4, 0x01d0, 0x080c, 0xc24d, 0x080c, 0x7207, 0x0118, - 0xd0dc, 0x1904, 0xac22, 0x2011, 0x1836, 0x2204, 0xc0ad, 0x2012, - 0x2001, 0x0002, 0x00f6, 0x2079, 0x0100, 0x78e3, 0x0000, 0x080c, - 0x27e2, 0x78e2, 0x00fe, 0x0804, 0xac22, 0x080c, 0xc28a, 0x2011, - 0x1836, 0x2204, 0xc0a5, 0x2012, 0x0006, 0x080c, 0xd720, 0x000e, - 0x1904, 0xac22, 0xc0b5, 0x2012, 0x2001, 0x0006, 0x080c, 0x63f0, - 0x9006, 0x080c, 0x63dc, 0x00c6, 0x2001, 0x180f, 0x2004, 0xd09c, - 0x0520, 0x00f6, 0x2079, 0x0100, 0x00e6, 0x2071, 0x1800, 0x700c, - 0x9084, 0x00ff, 0x78e6, 0x707a, 0x7010, 0x78ea, 0x707e, 0x908c, - 0x00ff, 0x00ee, 0x780c, 0xc0b5, 0x780e, 0x00fe, 0x080c, 0x27b7, - 0x00f6, 0x2100, 0x900e, 0x080c, 0x276e, 0x795a, 0x00fe, 0x9186, - 0x0081, 0x01d8, 0x2009, 0x0081, 0x00c8, 0x2009, 0x00ef, 0x00f6, - 0x2079, 0x0100, 0x79ea, 0x7932, 0x7936, 0x780c, 0xc0b5, 0x780e, - 0x00fe, 0x080c, 0x27b7, 0x00f6, 0x2079, 0x1800, 0x797e, 0x2100, - 0x900e, 0x080c, 0x276e, 0x795a, 0x00fe, 0x8108, 0x080c, 0x643f, - 0x2b00, 0x00ce, 0x1904, 0xac22, 0x6012, 0x2009, 0x180f, 0x210c, - 0xd19c, 0x0150, 0x2009, 0x027c, 0x210c, 0x918c, 0x00ff, 0xb912, - 0x2009, 0x027d, 0x210c, 0xb916, 0x2001, 0x0002, 0x080c, 0x63f0, - 0x6023, 0x0001, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x86c1, - 0x080c, 0x8c10, 0x0018, 0x080c, 0xaa81, 0x0431, 0x00de, 0x009e, - 0x00be, 0x0005, 0x2001, 0x1810, 0x2004, 0xd0a4, 0x0120, 0x2001, - 0x185c, 0x2004, 0xd0ac, 0x0005, 0x00e6, 0x080c, 0xdb96, 0x0190, - 0x2071, 0x0260, 0x7108, 0x720c, 0x918c, 0x00ff, 0x1118, 0x9284, - 0xff00, 0x0140, 0x6010, 0x2058, 0xb8a0, 0x9084, 0xff80, 0x1110, - 0xb912, 0xba16, 0x00ee, 0x0005, 0x2030, 0x2001, 0x0007, 0x080c, - 0x63f0, 0x080c, 0x55ef, 0x1120, 0x2001, 0x0007, 0x080c, 0x641c, - 0x080c, 0x31b4, 0x6020, 0x9086, 0x000a, 0x1108, 0x0005, 0x0804, - 0xa0e3, 0x00b6, 0x00e6, 0x0026, 0x0016, 0x2071, 0x1800, 0x708c, - 0x9086, 0x0014, 0x1904, 0xadd6, 0x00d6, 0x080c, 0x7207, 0x0198, - 0x0026, 0x2011, 0x0010, 0x080c, 0x67e7, 0x002e, 0x05c8, 0x080c, - 0x55ef, 0x1540, 0x6014, 0x2048, 0xa807, 0x0000, 0xa867, 0x0103, - 0xa833, 0xdead, 0x00f8, 0x0026, 0x2011, 0x8008, 0x080c, 0x67e7, - 0x002e, 0x0530, 0x6014, 0x2048, 0xa864, 0x9084, 0x00ff, 0x9086, - 0x0039, 0x1140, 0x2001, 0x0030, 0x900e, 0x2011, 0x4009, 0x080c, - 0xc418, 0x0040, 0x6014, 0x2048, 0xa807, 0x0000, 0xa867, 0x0103, - 0xa833, 0xdead, 0x6010, 0x2058, 0xb9a0, 0x0016, 0x080c, 0x31b4, - 0x080c, 0xa0e3, 0x001e, 0x080c, 0x3286, 0x00de, 0x0804, 0xadda, - 0x00de, 0x080c, 0x55ef, 0x1170, 0x6014, 0x9005, 0x1158, 0x0036, - 0x0046, 0x6010, 0x2058, 0xbba0, 0x2021, 0x0006, 0x080c, 0x4cbc, - 0x004e, 0x003e, 0x00d6, 0x6010, 0x2058, 0x080c, 0x653a, 0x080c, - 0xab98, 0x00de, 0x080c, 0xb01c, 0x1588, 0x6010, 0x2058, 0xb890, - 0x9005, 0x0560, 0x2001, 0x0006, 0x080c, 0x63f0, 0x0096, 0x6014, - 0x904d, 0x01d0, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0039, 0x1140, - 0x2001, 0x0000, 0x900e, 0x2011, 0x4000, 0x080c, 0xc418, 0x0060, - 0xa864, 0x9084, 0x00ff, 0x9086, 0x0029, 0x0130, 0xa807, 0x0000, - 0xa867, 0x0103, 0xa833, 0x0200, 0x009e, 0x080c, 0x31b4, 0x6020, - 0x9086, 0x000a, 0x0138, 0x080c, 0xa0e3, 0x0020, 0x080c, 0xaa81, - 0x080c, 0xad24, 0x001e, 0x002e, 0x00ee, 0x00be, 0x0005, 0x2011, - 0x1823, 0x2204, 0x9086, 0x0014, 0x1160, 0x2001, 0x0002, 0x080c, - 0x63f0, 0x6003, 0x0001, 0x6007, 0x0001, 0x080c, 0x86c1, 0x0804, - 0x8c10, 0x0804, 0xad24, 0x2030, 0x2011, 0x1823, 0x2204, 0x9086, - 0x0004, 0x1148, 0x96b6, 0x000b, 0x1120, 0x2001, 0x0007, 0x080c, - 0x63f0, 0x0804, 0xa0e3, 0x0804, 0xad24, 0x0002, 0xab62, 0xae1d, - 0xab62, 0xae5c, 0xab62, 0xaf07, 0xae12, 0xab62, 0xab62, 0xaf1a, - 0xab62, 0xaf2a, 0x6604, 0x9686, 0x0003, 0x0904, 0xad39, 0x96b6, - 0x001e, 0x1110, 0x080c, 0xa0e3, 0x0005, 0x00b6, 0x00d6, 0x00c6, - 0x080c, 0xaf3a, 0x11a0, 0x9006, 0x080c, 0x63dc, 0x080c, 0x318b, - 0x080c, 0xc54e, 0x2001, 0x0002, 0x080c, 0x63f0, 0x6003, 0x0001, - 0x6007, 0x0002, 0x080c, 0x86c1, 0x080c, 0x8c10, 0x0408, 0x2009, - 0x026e, 0x2104, 0x9086, 0x0009, 0x1160, 0x6010, 0x2058, 0xb840, - 0x9084, 0x00ff, 0x9005, 0x0170, 0x8001, 0xb842, 0x601b, 0x000a, - 0x0078, 0x2009, 0x026f, 0x2104, 0x9084, 0xff00, 0x9086, 0x1900, - 0x1108, 0x08a0, 0x080c, 0x318b, 0x080c, 0xc54e, 0x080c, 0xad24, - 0x00ce, 0x00de, 0x00be, 0x0005, 0x0096, 0x00b6, 0x0026, 0x9016, - 0x080c, 0xaf48, 0x00d6, 0x2069, 0x1954, 0x2d04, 0x9005, 0x0168, - 0x6010, 0x2058, 0xb8a0, 0x9086, 0x007e, 0x1138, 0x2069, 0x181f, - 0x2d04, 0x8000, 0x206a, 0x00de, 0x0010, 0x00de, 0x0088, 0x9006, - 0x080c, 0x63dc, 0x2001, 0x0002, 0x080c, 0x63f0, 0x6003, 0x0001, - 0x6007, 0x0002, 0x080c, 0x86c1, 0x080c, 0x8c10, 0x0804, 0xaed7, - 0x080c, 0xbe37, 0x01b0, 0x6014, 0x2048, 0xa864, 0x2010, 0x9086, - 0x0139, 0x1138, 0x6007, 0x0016, 0x2001, 0x0002, 0x080c, 0xc472, - 0x00b0, 0x6014, 0x2048, 0xa864, 0xd0fc, 0x0118, 0x2001, 0x0001, - 0x0ca8, 0x2001, 0x180e, 0x2004, 0xd0dc, 0x0148, 0x6010, 0x2058, - 0xb840, 0x9084, 0x00ff, 0x9005, 0x1110, 0x9006, 0x0c38, 0x080c, - 0xaa81, 0x2009, 0x026e, 0x2134, 0x96b4, 0x00ff, 0x9686, 0x0005, - 0x0510, 0x9686, 0x000b, 0x01c8, 0x2009, 0x026f, 0x2104, 0x9084, - 0xff00, 0x1118, 0x9686, 0x0009, 0x01b0, 0x9086, 0x1900, 0x1168, - 0x9686, 0x0009, 0x0180, 0x2001, 0x0004, 0x080c, 0x63f0, 0x2001, - 0x0028, 0x601a, 0x6007, 0x0052, 0x0010, 0x080c, 0xad24, 0x002e, - 0x00be, 0x009e, 0x0005, 0x9286, 0x0139, 0x0160, 0x6014, 0x2048, - 0x080c, 0xbe37, 0x0140, 0xa864, 0x9086, 0x0139, 0x0118, 0xa868, - 0xd0fc, 0x0108, 0x0c50, 0x6010, 0x2058, 0xb840, 0x9084, 0x00ff, - 0x9005, 0x0138, 0x8001, 0xb842, 0x601b, 0x000a, 0x6007, 0x0016, - 0x08f0, 0xb8a0, 0x9086, 0x007e, 0x1138, 0x00e6, 0x2071, 0x1800, - 0x080c, 0x5ebe, 0x00ee, 0x0010, 0x080c, 0x318b, 0x0870, 0x080c, - 0xaf48, 0x1160, 0x2001, 0x0004, 0x080c, 0x63f0, 0x6003, 0x0001, - 0x6007, 0x0003, 0x080c, 0x86c1, 0x0804, 0x8c10, 0x080c, 0xaa81, - 0x0804, 0xad24, 0x0469, 0x1160, 0x2001, 0x0008, 0x080c, 0x63f0, - 0x6003, 0x0001, 0x6007, 0x0005, 0x080c, 0x86c1, 0x0804, 0x8c10, - 0x0804, 0xad24, 0x00e9, 0x1160, 0x2001, 0x000a, 0x080c, 0x63f0, - 0x6003, 0x0001, 0x6007, 0x0001, 0x080c, 0x86c1, 0x0804, 0x8c10, - 0x0804, 0xad24, 0x2009, 0x026e, 0x2104, 0x9086, 0x0003, 0x1138, - 0x2009, 0x026f, 0x2104, 0x9084, 0xff00, 0x9086, 0x2a00, 0x0005, - 0x9085, 0x0001, 0x0005, 0x00b6, 0x00c6, 0x0016, 0x6110, 0x2158, - 0x080c, 0x64ae, 0x001e, 0x00ce, 0x00be, 0x0005, 0x00b6, 0x00f6, - 0x00e6, 0x00d6, 0x0036, 0x0016, 0x6010, 0x2058, 0x2009, 0x1836, - 0x2104, 0x9085, 0x0003, 0x200a, 0x080c, 0xafee, 0x0560, 0x2009, - 0x1836, 0x2104, 0xc0cd, 0x200a, 0x080c, 0x67bf, 0x0158, 0x9006, - 0x2020, 0x2009, 0x002a, 0x080c, 0xd885, 0x2001, 0x180c, 0x200c, - 0xc195, 0x2102, 0x2019, 0x002a, 0x2009, 0x0001, 0x080c, 0x3156, - 0x00e6, 0x2071, 0x1800, 0x080c, 0x2f6c, 0x00ee, 0x00c6, 0x0156, - 0x20a9, 0x0781, 0x2009, 0x007f, 0x080c, 0x3286, 0x8108, 0x1f04, - 0xaf8c, 0x015e, 0x00ce, 0x080c, 0xaf4b, 0x2071, 0x0260, 0x2079, - 0x0200, 0x7817, 0x0001, 0x2001, 0x1836, 0x200c, 0xc1c5, 0x7018, - 0xd0fc, 0x0110, 0xd0dc, 0x0118, 0x7038, 0xd0dc, 0x1108, 0xc1c4, - 0x7817, 0x0000, 0x2001, 0x1836, 0x2102, 0x2079, 0x0100, 0x2e04, - 0x9084, 0x00ff, 0x2069, 0x181e, 0x206a, 0x78e6, 0x0006, 0x8e70, - 0x2e04, 0x2069, 0x181f, 0x206a, 0x78ea, 0x7832, 0x7836, 0x2010, - 0x9084, 0xff00, 0x001e, 0x9105, 0x2009, 0x182b, 0x200a, 0x2200, - 0x9084, 0x00ff, 0x2008, 0x080c, 0x27b7, 0x080c, 0x7207, 0x0170, - 0x2071, 0x0260, 0x2069, 0x195a, 0x7048, 0x206a, 0x704c, 0x6806, - 0x7050, 0x680a, 0x7054, 0x680e, 0x080c, 0xc24d, 0x0040, 0x2001, - 0x0006, 0x080c, 0x63f0, 0x080c, 0x31b4, 0x080c, 0xa0e3, 0x001e, - 0x003e, 0x00de, 0x00ee, 0x00fe, 0x00be, 0x0005, 0x0096, 0x0026, - 0x0036, 0x00e6, 0x0156, 0x2019, 0x182b, 0x231c, 0x83ff, 0x01f0, - 0x2071, 0x0260, 0x7200, 0x9294, 0x00ff, 0x7004, 0x9084, 0xff00, - 0x9205, 0x9306, 0x1198, 0x2011, 0x0276, 0x20a9, 0x0004, 0x2b48, - 0x2019, 0x000a, 0x080c, 0xb0d0, 0x1148, 0x2011, 0x027a, 0x20a9, - 0x0004, 0x2019, 0x0006, 0x080c, 0xb0d0, 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, 0x19c8, 0x252c, - 0x2021, 0x19ce, 0x2424, 0x2061, 0x1cd0, 0x2071, 0x1800, 0x7250, - 0x7070, 0x9202, 0x1a04, 0xb0a8, 0x080c, 0xd8b6, 0x0904, 0xb0a1, - 0x6720, 0x9786, 0x0007, 0x0904, 0xb0a1, 0x2500, 0x9c06, 0x0904, - 0xb0a1, 0x2400, 0x9c06, 0x05e8, 0x3e08, 0x9186, 0x0002, 0x1148, - 0x6010, 0x9005, 0x0130, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, - 0x1580, 0x00c6, 0x6000, 0x9086, 0x0004, 0x1110, 0x080c, 0x19b4, - 0x9786, 0x000a, 0x0148, 0x080c, 0xc03f, 0x1130, 0x00ce, 0x080c, - 0xaa81, 0x080c, 0xa113, 0x00e8, 0x6014, 0x2048, 0x080c, 0xbe37, - 0x01a8, 0x9786, 0x0003, 0x1530, 0xa867, 0x0103, 0xa87c, 0xd0cc, - 0x0130, 0x0096, 0xa878, 0x2048, 0x080c, 0x0fe3, 0x009e, 0xab7a, - 0xa877, 0x0000, 0x080c, 0x6adc, 0x080c, 0xc022, 0x080c, 0xa113, - 0x00ce, 0x9ce0, 0x0018, 0x7064, 0x9c02, 0x1210, 0x0804, 0xb04f, - 0x012e, 0x000e, 0x002e, 0x004e, 0x005e, 0x007e, 0x00ce, 0x009e, - 0x00ee, 0x0005, 0x9786, 0x0006, 0x1118, 0x080c, 0xd830, 0x0c30, - 0x9786, 0x000a, 0x09e0, 0x0880, 0x220c, 0x2304, 0x9106, 0x1130, - 0x8210, 0x8318, 0x1f04, 0xb0bc, 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, 0x6004, 0x908a, 0x0053, 0x1a0c, 0x0dfa, 0x080c, - 0xc02e, 0x0120, 0x080c, 0xc03f, 0x0168, 0x0028, 0x080c, 0x31b4, - 0x080c, 0xc03f, 0x0138, 0x080c, 0x8b04, 0x080c, 0xa0e3, 0x080c, - 0x8c10, 0x0005, 0x080c, 0xaa81, 0x0cb0, 0x9182, 0x0054, 0x1220, - 0x9182, 0x0040, 0x0208, 0x000a, 0x0005, 0xb131, 0xb131, 0xb131, - 0xb131, 0xb131, 0xb131, 0xb131, 0xb131, 0xb131, 0xb131, 0xb131, - 0xb133, 0xb133, 0xb133, 0xb133, 0xb131, 0xb131, 0xb131, 0xb133, - 0xb131, 0x080c, 0x0dfa, 0x600b, 0xffff, 0x6003, 0x0001, 0x6106, - 0x080c, 0x8679, 0x0126, 0x2091, 0x8000, 0x080c, 0x8c10, 0x012e, - 0x0005, 0x9186, 0x0013, 0x1128, 0x6004, 0x9082, 0x0040, 0x0804, - 0xb1e8, 0x9186, 0x0027, 0x1520, 0x080c, 0x8b04, 0x080c, 0x318b, - 0x080c, 0xc54e, 0x0096, 0x6114, 0x2148, 0x080c, 0xbe37, 0x0198, - 0x080c, 0xc03f, 0x1118, 0x080c, 0xaa81, 0x0068, 0xa867, 0x0103, - 0xa87b, 0x0029, 0xa877, 0x0000, 0xa97c, 0xc1c5, 0xa97e, 0x080c, - 0x6ae9, 0x080c, 0xc022, 0x009e, 0x080c, 0xa0e3, 0x0804, 0x8c10, - 0x9186, 0x0014, 0x1120, 0x6004, 0x9082, 0x0040, 0x04a0, 0x9186, - 0x0046, 0x0150, 0x9186, 0x0045, 0x0138, 0x9186, 0x0053, 0x0120, - 0x9186, 0x0048, 0x190c, 0x0dfa, 0x2001, 0x0109, 0x2004, 0xd084, - 0x0508, 0x0126, 0x2091, 0x2800, 0x0006, 0x0016, 0x0026, 0x0036, - 0x00f6, 0x00e6, 0x00c6, 0x2079, 0x19bf, 0x2071, 0x1800, 0x2061, - 0x0100, 0x080c, 0x8563, 0x00ce, 0x00ee, 0x00fe, 0x003e, 0x002e, - 0x001e, 0x000e, 0x012e, 0xa001, 0x6000, 0x9086, 0x0002, 0x1110, - 0x0804, 0xb226, 0x0005, 0x0002, 0xb1c2, 0xb1c0, 0xb1c0, 0xb1c0, - 0xb1c0, 0xb1c0, 0xb1c0, 0xb1c0, 0xb1c0, 0xb1c0, 0xb1c0, 0xb1dd, - 0xb1dd, 0xb1dd, 0xb1dd, 0xb1c0, 0xb1dd, 0xb1c0, 0xb1dd, 0xb1c0, - 0x080c, 0x0dfa, 0x080c, 0x8b04, 0x0096, 0x6114, 0x2148, 0x080c, - 0xbe37, 0x0168, 0xa867, 0x0103, 0xa87b, 0x0006, 0xa877, 0x0000, - 0xa880, 0xc0ec, 0xa882, 0x080c, 0x6ae9, 0x080c, 0xc022, 0x009e, - 0x080c, 0xa0e3, 0x080c, 0x8c10, 0x0005, 0x080c, 0x8b04, 0x080c, - 0xc03f, 0x090c, 0xaa81, 0x080c, 0xa0e3, 0x080c, 0x8c10, 0x0005, - 0x0002, 0xb1ff, 0xb1fd, 0xb1fd, 0xb1fd, 0xb1fd, 0xb1fd, 0xb1fd, - 0xb1fd, 0xb1fd, 0xb1fd, 0xb1fd, 0xb216, 0xb216, 0xb216, 0xb216, - 0xb1fd, 0xb220, 0xb1fd, 0xb216, 0xb1fd, 0x080c, 0x0dfa, 0x0096, - 0x080c, 0x8b04, 0x6014, 0x2048, 0x2001, 0x1960, 0x2004, 0x6042, - 0xa97c, 0xd1ac, 0x0140, 0x6003, 0x0004, 0xa87c, 0x9085, 0x0400, - 0xa87e, 0x009e, 0x0005, 0x6003, 0x0002, 0x0cb8, 0x080c, 0x8b04, - 0x080c, 0xc551, 0x080c, 0xc556, 0x6003, 0x000f, 0x0804, 0x8c10, - 0x080c, 0x8b04, 0x080c, 0xa0e3, 0x0804, 0x8c10, 0x9182, 0x0054, - 0x1220, 0x9182, 0x0040, 0x0208, 0x000a, 0x0005, 0xb242, 0xb242, - 0xb242, 0xb242, 0xb242, 0xb244, 0xb321, 0xb242, 0xb355, 0xb242, - 0xb242, 0xb242, 0xb242, 0xb242, 0xb242, 0xb242, 0xb242, 0xb242, - 0xb242, 0xb355, 0x080c, 0x0dfa, 0x00b6, 0x0096, 0x6114, 0x2148, - 0x7644, 0x96b4, 0x0fff, 0x86ff, 0x1528, 0x6010, 0x2058, 0xb800, - 0xd0bc, 0x1904, 0xb310, 0xa87b, 0x0000, 0xa867, 0x0103, 0xae76, - 0xa87c, 0xd0ac, 0x0128, 0xa834, 0xa938, 0x9115, 0x190c, 0xb4ee, - 0x080c, 0x6904, 0x6210, 0x2258, 0xba3c, 0x82ff, 0x0110, 0x8211, - 0xba3e, 0x7044, 0xd0e4, 0x1904, 0xb2f4, 0x080c, 0xa0e3, 0x009e, - 0x00be, 0x0005, 0x968c, 0x0c00, 0x0150, 0x6010, 0x2058, 0xb800, - 0xd0bc, 0x1904, 0xb2f8, 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, 0xb24b, 0x735c, 0xab86, - 0x83ff, 0x0170, 0x938a, 0x0009, 0x0210, 0x2019, 0x0008, 0x0036, - 0x2308, 0x2019, 0x0018, 0x2011, 0x0025, 0x080c, 0xb9e8, 0x003e, - 0xd6cc, 0x0904, 0xb260, 0x7154, 0xa98a, 0x81ff, 0x0904, 0xb260, - 0x9192, 0x0021, 0x1278, 0x8304, 0x9098, 0x0018, 0x2011, 0x0029, - 0x080c, 0xb9e8, 0x2011, 0x0205, 0x2013, 0x0000, 0x080c, 0xc4de, - 0x0804, 0xb260, 0xa868, 0xd0fc, 0x0120, 0x2009, 0x0020, 0xa98a, - 0x0c50, 0x00a6, 0x2950, 0x080c, 0xb987, 0x00ae, 0x080c, 0xc4de, - 0x080c, 0xb9d8, 0x0804, 0xb262, 0x080c, 0xc137, 0x0804, 0xb26f, - 0xa87c, 0xd0ac, 0x0904, 0xb27b, 0xa880, 0xd0bc, 0x1904, 0xb27b, - 0x7348, 0xa838, 0x9306, 0x11c8, 0x734c, 0xa834, 0x931e, 0x0904, - 0xb27b, 0xd6d4, 0x0190, 0xab38, 0x9305, 0x0904, 0xb27b, 0x0068, - 0xa87c, 0xd0ac, 0x0904, 0xb253, 0xa838, 0xa934, 0x9105, 0x0904, - 0xb253, 0xa880, 0xd0bc, 0x1904, 0xb253, 0x080c, 0xc171, 0x0804, - 0xb26f, 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, 0x1afe, 0x080c, - 0x86de, 0x080c, 0x8ced, 0x009e, 0x0005, 0x0005, 0x9182, 0x0054, - 0x1220, 0x9182, 0x0040, 0x0208, 0x000a, 0x0005, 0xb372, 0xb372, - 0xb372, 0xb372, 0xb372, 0xb374, 0xb40a, 0xb372, 0xb372, 0xb421, - 0xb4b1, 0xb372, 0xb372, 0xb372, 0xb372, 0xb4c6, 0xb372, 0xb372, - 0xb372, 0xb372, 0x080c, 0x0dfa, 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, 0xb405, 0x9694, - 0xff00, 0x9284, 0x0c00, 0x0120, 0x7048, 0xb092, 0x704c, 0xb08e, - 0x9284, 0x0300, 0x0904, 0xb405, 0x080c, 0x1031, 0x090c, 0x0dfa, - 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, 0xb9e8, 0x003e, 0xd6cc, 0x01e8, - 0x7154, 0xa98a, 0x81ff, 0x01c8, 0x9192, 0x0021, 0x1260, 0x8304, - 0x9098, 0x0018, 0x2011, 0x0029, 0x080c, 0xb9e8, 0x2011, 0x0205, - 0x2013, 0x0000, 0x0050, 0xb068, 0xd0fc, 0x0120, 0x2009, 0x0020, - 0xa98a, 0x0c68, 0x2950, 0x080c, 0xb987, 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, 0x1afe, 0x0804, - 0x9623, 0x6003, 0x0002, 0x6004, 0x9086, 0x0040, 0x11c8, 0x0096, - 0x6014, 0x2048, 0xa87c, 0xd0ac, 0x0160, 0x601c, 0xd084, 0x1130, - 0x00f6, 0x2c00, 0x2078, 0x080c, 0x16db, 0x00fe, 0x6003, 0x0004, - 0x0010, 0x6003, 0x0002, 0x009e, 0x080c, 0x8b04, 0x080c, 0x8c10, - 0x0096, 0x2001, 0x1960, 0x2004, 0x6042, 0x080c, 0x8bc0, 0x080c, - 0x8ced, 0x6114, 0x2148, 0xa97c, 0xd1e4, 0x0904, 0xb4ac, 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, 0x0fe3, 0x001e, 0x0458, 0x0016, 0x080c, 0x0fe3, - 0x009e, 0xa87c, 0xc0cc, 0xa87e, 0xa974, 0x0016, 0x080c, 0xb9d8, - 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, 0x6904, 0x001e, - 0xd1e4, 0x1120, 0x080c, 0xa0e3, 0x009e, 0x0005, 0x080c, 0xc137, - 0x0cd8, 0x6004, 0x9086, 0x0040, 0x1120, 0x080c, 0x8b04, 0x080c, - 0x8c10, 0x2019, 0x0001, 0x080c, 0x999d, 0x6003, 0x0002, 0x080c, - 0xc556, 0x080c, 0x8bc0, 0x080c, 0x8ced, 0x0005, 0x6004, 0x9086, - 0x0040, 0x1120, 0x080c, 0x8b04, 0x080c, 0x8c10, 0x2019, 0x0001, - 0x080c, 0x999d, 0x080c, 0x8bc0, 0x080c, 0x318b, 0x080c, 0xc54e, - 0x0096, 0x6114, 0x2148, 0x080c, 0xbe37, 0x0150, 0xa867, 0x0103, - 0xa87b, 0x0029, 0xa877, 0x0000, 0x080c, 0x6ae9, 0x080c, 0xc022, - 0x009e, 0x080c, 0xa0e3, 0x080c, 0x8ced, 0x0005, 0xa87b, 0x0015, - 0xd1fc, 0x0180, 0xa87b, 0x0007, 0x8002, 0x8000, 0x810a, 0x9189, - 0x0000, 0x0006, 0x0016, 0x2009, 0x1a51, 0x2104, 0x8000, 0x200a, - 0x001e, 0x000e, 0xa992, 0xa88e, 0x0005, 0x9182, 0x0054, 0x1220, - 0x9182, 0x0040, 0x0208, 0x000a, 0x0005, 0xb521, 0xb521, 0xb521, - 0xb521, 0xb521, 0xb523, 0xb521, 0xb521, 0xb5c9, 0xb521, 0xb521, - 0xb521, 0xb521, 0xb521, 0xb521, 0xb521, 0xb521, 0xb521, 0xb521, - 0xb6fb, 0x080c, 0x0dfa, 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, 0xb5c2, 0x9694, 0xff00, - 0x9284, 0x0c00, 0x0120, 0x7048, 0xb092, 0x704c, 0xb08e, 0x9284, - 0x0300, 0x0904, 0xb5c2, 0x9686, 0x0100, 0x1130, 0x7064, 0x9005, - 0x1118, 0xc6c4, 0xb676, 0x0c38, 0x080c, 0x1031, 0x090c, 0x0dfa, - 0x2900, 0xb07a, 0xb77c, 0x97bd, 0x0200, 0xb77e, 0xa867, 0x0103, - 0xb068, 0xa86a, 0xb06c, 0xa86e, 0xb070, 0xa872, 0x7044, 0x9084, - 0xf000, 0x9635, 0xae76, 0x968c, 0x0c00, 0x0120, 0x7348, 0xab92, + 0x30be, 0x080c, 0x9fea, 0x001e, 0x080c, 0x3190, 0x00de, 0x0804, + 0xad1b, 0x00de, 0x080c, 0x54ef, 0x1170, 0x6014, 0x9005, 0x1158, + 0x0036, 0x0046, 0x6010, 0x2058, 0xbba0, 0x2021, 0x0006, 0x080c, + 0x4bb4, 0x004e, 0x003e, 0x00d6, 0x6010, 0x2058, 0x080c, 0x643e, + 0x080c, 0xaac9, 0x00de, 0x080c, 0xaf63, 0x1588, 0x6010, 0x2058, + 0xb890, 0x9005, 0x0560, 0x2001, 0x0006, 0x080c, 0x62f4, 0x0096, + 0x6014, 0x904d, 0x01d0, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0039, + 0x1140, 0x2001, 0x0000, 0x900e, 0x2011, 0x4000, 0x080c, 0xc333, + 0x0060, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0029, 0x0130, 0xa807, + 0x0000, 0xa867, 0x0103, 0xa833, 0x0200, 0x009e, 0x080c, 0x30be, + 0x6020, 0x9086, 0x000a, 0x0138, 0x080c, 0x9fea, 0x0020, 0x080c, + 0xa9a7, 0x080c, 0xac59, 0x001e, 0x002e, 0x00ee, 0x00be, 0x0005, + 0x2011, 0x1823, 0x2204, 0x9086, 0x0014, 0x1160, 0x2001, 0x0002, + 0x080c, 0x62f4, 0x6003, 0x0001, 0x6007, 0x0001, 0x080c, 0x8640, + 0x0804, 0x8b8f, 0x0804, 0xac59, 0x2030, 0x2011, 0x1823, 0x2204, + 0x9086, 0x0004, 0x1148, 0x96b6, 0x000b, 0x1120, 0x2001, 0x0007, + 0x080c, 0x62f4, 0x0804, 0x9fea, 0x0804, 0xac59, 0x0002, 0xaa88, + 0xad5e, 0xaa88, 0xad9f, 0xaa88, 0xae4a, 0xad53, 0xaa8b, 0xaa88, + 0xae5c, 0xaa88, 0xae6c, 0x6604, 0x9686, 0x0003, 0x0904, 0xac6e, + 0x96b6, 0x001e, 0x1110, 0x080c, 0x9fea, 0x0005, 0x00b6, 0x00d6, + 0x00c6, 0x080c, 0xae7c, 0x11a0, 0x9006, 0x080c, 0x62e0, 0x080c, + 0x3095, 0x080c, 0xc46e, 0x2001, 0x0002, 0x080c, 0x62f4, 0x6003, + 0x0001, 0x6007, 0x0002, 0x080c, 0x8640, 0x080c, 0x8b8f, 0x0418, + 0x2009, 0x026e, 0x2104, 0x9086, 0x0009, 0x1160, 0x6010, 0x2058, + 0xb840, 0x9084, 0x00ff, 0x9005, 0x0180, 0x8001, 0xb842, 0x601b, + 0x000a, 0x0088, 0x2009, 0x026f, 0x2104, 0x9084, 0xff00, 0x908e, + 0x1900, 0x0148, 0x908e, 0x1e00, 0x0990, 0x080c, 0x3095, 0x080c, + 0xc46e, 0x080c, 0xac59, 0x00ce, 0x00de, 0x00be, 0x0005, 0x0096, + 0x00b6, 0x0026, 0x9016, 0x080c, 0xae8a, 0x00d6, 0x2069, 0x1956, + 0x2d04, 0x9005, 0x0168, 0x6010, 0x2058, 0xb8a0, 0x9086, 0x007e, + 0x1138, 0x2069, 0x181f, 0x2d04, 0x8000, 0x206a, 0x00de, 0x0010, + 0x00de, 0x0088, 0x9006, 0x080c, 0x62e0, 0x2001, 0x0002, 0x080c, + 0x62f4, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x8640, 0x080c, + 0x8b8f, 0x0804, 0xae1a, 0x080c, 0xbd4e, 0x01b0, 0x6014, 0x2048, + 0xa864, 0x2010, 0x9086, 0x0139, 0x1138, 0x6007, 0x0016, 0x2001, + 0x0002, 0x080c, 0xc390, 0x00b0, 0x6014, 0x2048, 0xa864, 0xd0fc, + 0x0118, 0x2001, 0x0001, 0x0ca8, 0x2001, 0x180e, 0x2004, 0xd0dc, + 0x0148, 0x6010, 0x2058, 0xb840, 0x9084, 0x00ff, 0x9005, 0x1110, + 0x9006, 0x0c38, 0x080c, 0xa9a7, 0x2009, 0x026e, 0x2134, 0x96b4, + 0x00ff, 0x9686, 0x0005, 0x0510, 0x9686, 0x000b, 0x01c8, 0x2009, + 0x026f, 0x2104, 0x9084, 0xff00, 0x1118, 0x9686, 0x0009, 0x01b0, + 0x9086, 0x1900, 0x1168, 0x9686, 0x0009, 0x0180, 0x2001, 0x0004, + 0x080c, 0x62f4, 0x2001, 0x0028, 0x601a, 0x6007, 0x0052, 0x0010, + 0x080c, 0xac59, 0x002e, 0x00be, 0x009e, 0x0005, 0x9286, 0x0139, + 0x0160, 0x6014, 0x2048, 0x080c, 0xbd4e, 0x0140, 0xa864, 0x9086, + 0x0139, 0x0118, 0xa868, 0xd0fc, 0x0108, 0x0c50, 0x6010, 0x2058, + 0xb840, 0x9084, 0x00ff, 0x9005, 0x0138, 0x8001, 0xb842, 0x601b, + 0x000a, 0x6007, 0x0016, 0x08f0, 0xb8a0, 0x9086, 0x007e, 0x1138, + 0x00e6, 0x2071, 0x1800, 0x080c, 0x5dc2, 0x00ee, 0x0010, 0x080c, + 0x3095, 0x0870, 0x2001, 0x0004, 0x080c, 0x62f4, 0x04d9, 0x1140, + 0x6003, 0x0001, 0x6007, 0x0003, 0x080c, 0x8640, 0x0804, 0x8b8f, + 0x080c, 0xa9a7, 0x0804, 0xac59, 0x0469, 0x1160, 0x2001, 0x0008, + 0x080c, 0x62f4, 0x6003, 0x0001, 0x6007, 0x0005, 0x080c, 0x8640, + 0x0804, 0x8b8f, 0x0804, 0xac59, 0x00e9, 0x1160, 0x2001, 0x000a, + 0x080c, 0x62f4, 0x6003, 0x0001, 0x6007, 0x0001, 0x080c, 0x8640, + 0x0804, 0x8b8f, 0x0804, 0xac59, 0x2009, 0x026e, 0x2104, 0x9086, + 0x0003, 0x1138, 0x2009, 0x026f, 0x2104, 0x9084, 0xff00, 0x9086, + 0x2a00, 0x0005, 0x9085, 0x0001, 0x0005, 0x00b6, 0x00c6, 0x0016, + 0x6110, 0x2158, 0x080c, 0x63b2, 0x001e, 0x00ce, 0x00be, 0x0005, + 0x00b6, 0x00f6, 0x00e6, 0x00d6, 0x0036, 0x0016, 0x6010, 0x2058, + 0x2009, 0x1836, 0x2104, 0x9085, 0x0003, 0x200a, 0x080c, 0xaf35, + 0x0560, 0x2009, 0x1836, 0x2104, 0xc0cd, 0x200a, 0x080c, 0x66c5, + 0x0158, 0x9006, 0x2020, 0x2009, 0x002a, 0x080c, 0xd837, 0x2001, + 0x180c, 0x200c, 0xc195, 0x2102, 0x2019, 0x002a, 0x2009, 0x0001, + 0x080c, 0x3060, 0x00e6, 0x2071, 0x1800, 0x080c, 0x2e73, 0x00ee, + 0x00c6, 0x0156, 0x20a9, 0x0781, 0x2009, 0x007f, 0x080c, 0x3190, + 0x8108, 0x1f04, 0xaece, 0x015e, 0x00ce, 0x080c, 0xae8d, 0x2071, + 0x0260, 0x2079, 0x0200, 0x7817, 0x0001, 0x2001, 0x1836, 0x200c, + 0xc1c5, 0x7018, 0xd0fc, 0x0110, 0xd0dc, 0x0118, 0x7038, 0xd0dc, + 0x1108, 0xc1c4, 0x7817, 0x0000, 0x2001, 0x1836, 0x2102, 0x9184, + 0x0050, 0x9086, 0x0050, 0x05d0, 0x2079, 0x0100, 0x2e04, 0x9084, + 0x00ff, 0x2069, 0x181e, 0x206a, 0x78e6, 0x0006, 0x8e70, 0x2e04, + 0x2069, 0x181f, 0x206a, 0x78ea, 0x7832, 0x7836, 0x2010, 0x9084, + 0xff00, 0x001e, 0x9105, 0x2009, 0x182b, 0x200a, 0x2200, 0x9084, + 0x00ff, 0x2008, 0x080c, 0x26b6, 0x080c, 0x717e, 0x0170, 0x2071, + 0x0260, 0x2069, 0x195c, 0x7048, 0x206a, 0x704c, 0x6806, 0x7050, + 0x680a, 0x7054, 0x680e, 0x080c, 0xc164, 0x0040, 0x2001, 0x0006, + 0x080c, 0x62f4, 0x080c, 0x30be, 0x080c, 0x9fea, 0x001e, 0x003e, + 0x00de, 0x00ee, 0x00fe, 0x00be, 0x0005, 0x0096, 0x0026, 0x0036, + 0x00e6, 0x0156, 0x2019, 0x182b, 0x231c, 0x83ff, 0x01f0, 0x2071, + 0x0260, 0x7200, 0x9294, 0x00ff, 0x7004, 0x9084, 0xff00, 0x9205, + 0x9306, 0x1198, 0x2011, 0x0276, 0x20a9, 0x0004, 0x2b48, 0x2019, + 0x000a, 0x080c, 0xb017, 0x1148, 0x2011, 0x027a, 0x20a9, 0x0004, + 0x2019, 0x0006, 0x080c, 0xb017, 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, 0x19cb, 0x252c, 0x2021, + 0x19d1, 0x2424, 0x2061, 0x1cd0, 0x2071, 0x1800, 0x7250, 0x7070, + 0x9202, 0x1a04, 0xafef, 0x080c, 0xd868, 0x0904, 0xafe8, 0x6720, + 0x9786, 0x0007, 0x0904, 0xafe8, 0x2500, 0x9c06, 0x0904, 0xafe8, + 0x2400, 0x9c06, 0x05e8, 0x3e08, 0x9186, 0x0002, 0x1148, 0x6010, + 0x9005, 0x0130, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x1580, + 0x00c6, 0x6000, 0x9086, 0x0004, 0x1110, 0x080c, 0x192c, 0x9786, + 0x000a, 0x0148, 0x080c, 0xbf56, 0x1130, 0x00ce, 0x080c, 0xa9a7, + 0x080c, 0xa01c, 0x00e8, 0x6014, 0x2048, 0x080c, 0xbd4e, 0x01a8, + 0x9786, 0x0003, 0x1530, 0xa867, 0x0103, 0xa87c, 0xd0cc, 0x0130, + 0x0096, 0xa878, 0x2048, 0x080c, 0x0fe9, 0x009e, 0xab7a, 0xa877, + 0x0000, 0x080c, 0x6a15, 0x080c, 0xbf39, 0x080c, 0xa01c, 0x00ce, + 0x9ce0, 0x0018, 0x7064, 0x9c02, 0x1210, 0x0804, 0xaf96, 0x012e, + 0x000e, 0x002e, 0x004e, 0x005e, 0x007e, 0x00ce, 0x009e, 0x00ee, + 0x0005, 0x9786, 0x0006, 0x1118, 0x080c, 0xd7e2, 0x0c30, 0x9786, + 0x000a, 0x09e0, 0x0880, 0x220c, 0x2304, 0x9106, 0x1130, 0x8210, + 0x8318, 0x1f04, 0xb003, 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, 0x6004, 0x908a, 0x0053, 0x1a0c, 0x0df6, 0x080c, 0xbf45, + 0x0120, 0x080c, 0xbf56, 0x0168, 0x0028, 0x080c, 0x30be, 0x080c, + 0xbf56, 0x0138, 0x080c, 0x8a83, 0x080c, 0x9fea, 0x080c, 0x8b8f, + 0x0005, 0x080c, 0xa9a7, 0x0cb0, 0x9182, 0x0054, 0x1220, 0x9182, + 0x0040, 0x0208, 0x000a, 0x0005, 0xb078, 0xb078, 0xb078, 0xb078, + 0xb078, 0xb078, 0xb078, 0xb078, 0xb078, 0xb078, 0xb078, 0xb07a, + 0xb07a, 0xb07a, 0xb07a, 0xb078, 0xb078, 0xb078, 0xb07a, 0xb078, + 0x080c, 0x0df6, 0x600b, 0xffff, 0x6003, 0x0001, 0x6106, 0x080c, + 0x85f8, 0x0126, 0x2091, 0x8000, 0x080c, 0x8b8f, 0x012e, 0x0005, + 0x9186, 0x0013, 0x1128, 0x6004, 0x9082, 0x0040, 0x0804, 0xb112, + 0x9186, 0x0027, 0x1520, 0x080c, 0x8a83, 0x080c, 0x3095, 0x080c, + 0xc46e, 0x0096, 0x6114, 0x2148, 0x080c, 0xbd4e, 0x0198, 0x080c, + 0xbf56, 0x1118, 0x080c, 0xa9a7, 0x0068, 0xa867, 0x0103, 0xa87b, + 0x0029, 0xa877, 0x0000, 0xa97c, 0xc1c5, 0xa97e, 0x080c, 0x6a22, + 0x080c, 0xbf39, 0x009e, 0x080c, 0x9fea, 0x0804, 0x8b8f, 0x9186, + 0x0014, 0x1120, 0x6004, 0x9082, 0x0040, 0x00b8, 0x9186, 0x0046, + 0x0150, 0x9186, 0x0045, 0x0138, 0x9186, 0x0053, 0x0120, 0x9186, + 0x0048, 0x190c, 0x0df6, 0x080c, 0xc47f, 0x0130, 0x6000, 0x9086, + 0x0002, 0x1110, 0x0804, 0xb150, 0x0005, 0x0002, 0xb0ec, 0xb0ea, + 0xb0ea, 0xb0ea, 0xb0ea, 0xb0ea, 0xb0ea, 0xb0ea, 0xb0ea, 0xb0ea, + 0xb0ea, 0xb107, 0xb107, 0xb107, 0xb107, 0xb0ea, 0xb107, 0xb0ea, + 0xb107, 0xb0ea, 0x080c, 0x0df6, 0x080c, 0x8a83, 0x0096, 0x6114, + 0x2148, 0x080c, 0xbd4e, 0x0168, 0xa867, 0x0103, 0xa87b, 0x0006, + 0xa877, 0x0000, 0xa880, 0xc0ec, 0xa882, 0x080c, 0x6a22, 0x080c, + 0xbf39, 0x009e, 0x080c, 0x9fea, 0x080c, 0x8b8f, 0x0005, 0x080c, + 0x8a83, 0x080c, 0xbf56, 0x090c, 0xa9a7, 0x080c, 0x9fea, 0x080c, + 0x8b8f, 0x0005, 0x0002, 0xb129, 0xb127, 0xb127, 0xb127, 0xb127, + 0xb127, 0xb127, 0xb127, 0xb127, 0xb127, 0xb127, 0xb140, 0xb140, + 0xb140, 0xb140, 0xb127, 0xb14a, 0xb127, 0xb140, 0xb127, 0x080c, + 0x0df6, 0x0096, 0x080c, 0x8a83, 0x6014, 0x2048, 0x2001, 0x1962, + 0x2004, 0x6042, 0xa97c, 0xd1ac, 0x0140, 0x6003, 0x0004, 0xa87c, + 0x9085, 0x0400, 0xa87e, 0x009e, 0x0005, 0x6003, 0x0002, 0x0cb8, + 0x080c, 0x8a83, 0x080c, 0xc471, 0x080c, 0xc476, 0x6003, 0x000f, + 0x0804, 0x8b8f, 0x080c, 0x8a83, 0x080c, 0x9fea, 0x0804, 0x8b8f, + 0x9182, 0x0054, 0x1220, 0x9182, 0x0040, 0x0208, 0x000a, 0x0005, + 0xb16c, 0xb16c, 0xb16c, 0xb16c, 0xb16c, 0xb16e, 0xb24e, 0xb16c, + 0xb282, 0xb16c, 0xb16c, 0xb16c, 0xb16c, 0xb16c, 0xb16c, 0xb16c, + 0xb16c, 0xb16c, 0xb16c, 0xb282, 0x080c, 0x0df6, 0x00b6, 0x0096, + 0x6114, 0x2148, 0x7644, 0x96b4, 0x0fff, 0x86ff, 0x1528, 0x6010, + 0x2058, 0xb800, 0xd0bc, 0x1904, 0xb23d, 0xa87b, 0x0000, 0xa867, + 0x0103, 0xae76, 0xa87c, 0xd0ac, 0x0128, 0xa834, 0xa938, 0x9115, + 0x190c, 0xb41b, 0x080c, 0x683c, 0x6210, 0x2258, 0xba3c, 0x82ff, + 0x0110, 0x8211, 0xba3e, 0x7044, 0xd0e4, 0x1904, 0xb21e, 0x080c, + 0x9fea, 0x009e, 0x00be, 0x0005, 0x968c, 0x0c00, 0x0150, 0x6010, + 0x2058, 0xb800, 0xd0bc, 0x1904, 0xb222, 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, 0xb175, + 0x735c, 0xab86, 0x83ff, 0x0170, 0x938a, 0x0009, 0x0210, 0x2019, + 0x0008, 0x0036, 0x2308, 0x2019, 0x0018, 0x2011, 0x0025, 0x080c, + 0xb915, 0x003e, 0xd6cc, 0x0904, 0xb18a, 0x7154, 0xa98a, 0x81ff, + 0x0904, 0xb18a, 0x9192, 0x0021, 0x1278, 0x8304, 0x9098, 0x0018, + 0x2011, 0x0029, 0x080c, 0xb915, 0x2011, 0x0205, 0x2013, 0x0000, + 0x080c, 0xc3fc, 0x0804, 0xb18a, 0xa868, 0xd0fc, 0x0120, 0x2009, + 0x0020, 0xa98a, 0x0c50, 0x00a6, 0x2950, 0x080c, 0xb8b4, 0x00ae, + 0x080c, 0xc3fc, 0x080c, 0xb905, 0x0804, 0xb18c, 0x080c, 0xc04e, + 0x0804, 0xb199, 0xa87c, 0xd0ac, 0x0904, 0xb1a5, 0xa880, 0xd0bc, + 0x1904, 0xb1a5, 0x9684, 0x0400, 0x0130, 0xa838, 0xab34, 0x9305, + 0x0904, 0xb1a5, 0x00b8, 0x7348, 0xa838, 0x9306, 0x1198, 0x734c, + 0xa834, 0x931e, 0x0904, 0xb1a5, 0x0068, 0xa87c, 0xd0ac, 0x0904, + 0xb17d, 0xa838, 0xa934, 0x9105, 0x0904, 0xb17d, 0xa880, 0xd0bc, + 0x1904, 0xb17d, 0x080c, 0xc088, 0x0804, 0xb199, 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, 0x1a7e, 0x080c, 0x865d, 0x080c, 0x8c6c, + 0x009e, 0x0005, 0x0005, 0x9182, 0x0054, 0x1220, 0x9182, 0x0040, + 0x0208, 0x000a, 0x0005, 0xb29f, 0xb29f, 0xb29f, 0xb29f, 0xb29f, + 0xb2a1, 0xb337, 0xb29f, 0xb29f, 0xb34e, 0xb3de, 0xb29f, 0xb29f, + 0xb29f, 0xb29f, 0xb3f3, 0xb29f, 0xb29f, 0xb29f, 0xb29f, 0x080c, + 0x0df6, 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, 0xb332, 0x9694, 0xff00, 0x9284, 0x0c00, + 0x0120, 0x7048, 0xb092, 0x704c, 0xb08e, 0x9284, 0x0300, 0x0904, + 0xb332, 0x080c, 0x1037, 0x090c, 0x0df6, 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, 0xb9e8, 0x003e, 0xd6cc, 0x01e8, 0x7154, 0xa98a, 0x81ff, + 0x080c, 0xb915, 0x003e, 0xd6cc, 0x01e8, 0x7154, 0xa98a, 0x81ff, 0x01c8, 0x9192, 0x0021, 0x1260, 0x8304, 0x9098, 0x0018, 0x2011, - 0x0029, 0x080c, 0xb9e8, 0x2011, 0x0205, 0x2013, 0x0000, 0x0050, + 0x0029, 0x080c, 0xb915, 0x2011, 0x0205, 0x2013, 0x0000, 0x0050, 0xb068, 0xd0fc, 0x0120, 0x2009, 0x0020, 0xa98a, 0x0c68, 0x2950, - 0x080c, 0xb987, 0x080c, 0x1982, 0x009e, 0x00ee, 0x00ae, 0x007e, - 0x0005, 0x2001, 0x1960, 0x2004, 0x6042, 0x0096, 0x6114, 0x2148, - 0xa83c, 0xa940, 0x9105, 0x1118, 0xa87c, 0xc0dc, 0xa87e, 0x6003, - 0x0002, 0xa97c, 0xd1e4, 0x0904, 0xb6f6, 0x6043, 0x0000, 0x6010, - 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x1500, 0xd1cc, 0x0904, - 0xb6c5, 0xa978, 0xa868, 0xd0fc, 0x0904, 0xb686, 0x0016, 0xa87c, - 0x0006, 0xa880, 0x0006, 0x00a6, 0x2150, 0xb174, 0x9184, 0x00ff, - 0x90b6, 0x0002, 0x0904, 0xb653, 0x9086, 0x0028, 0x1904, 0xb63f, - 0xa87b, 0x001c, 0xb07b, 0x001c, 0x0804, 0xb65b, 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, 0x0fe3, 0x009e, 0x080c, 0xc171, 0x0804, 0xb6f6, 0xd1dc, - 0x0158, 0xa87b, 0x0015, 0xb07b, 0x0015, 0x080c, 0xc401, 0x0118, - 0xb174, 0xc1dc, 0xb176, 0x0078, 0xd1d4, 0x0128, 0xa87b, 0x0007, - 0xb07b, 0x0007, 0x0040, 0xa87c, 0xd0ac, 0x0128, 0xa834, 0xa938, - 0x9115, 0x190c, 0xb4ee, 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, 0xc4de, 0x001e, 0xa874, 0x0006, - 0x2148, 0x080c, 0x0fe3, 0x001e, 0x0804, 0xb6f2, 0x0016, 0x00a6, - 0x2150, 0xb174, 0x9184, 0x00ff, 0x90b6, 0x0002, 0x01e0, 0x9086, - 0x0028, 0x1128, 0xa87b, 0x001c, 0xb07b, 0x001c, 0x00e0, 0xd1dc, - 0x0158, 0xa87b, 0x0015, 0xb07b, 0x0015, 0x080c, 0xc401, 0x0118, - 0xb174, 0xc1dc, 0xb176, 0x0078, 0xd1d4, 0x0128, 0xa87b, 0x0007, - 0xb07b, 0x0007, 0x0040, 0xa87c, 0xd0ac, 0x0128, 0xa834, 0xa938, - 0x9115, 0x190c, 0xb4ee, 0xa890, 0xb092, 0xa88c, 0xb08e, 0xa87c, - 0xb07e, 0x00ae, 0x080c, 0x0fe3, 0x009e, 0x080c, 0xc4de, 0xa974, - 0x0016, 0x080c, 0xb9d8, 0x001e, 0x0468, 0xa867, 0x0103, 0xa974, - 0x9184, 0x00ff, 0x90b6, 0x0002, 0x01b0, 0x9086, 0x0028, 0x1118, - 0xa87b, 0x001c, 0x00d0, 0xd1dc, 0x0148, 0xa87b, 0x0015, 0x080c, - 0xc401, 0x0118, 0xa974, 0xc1dc, 0xa976, 0x0078, 0xd1d4, 0x0118, - 0xa87b, 0x0007, 0x0050, 0xa87b, 0x0000, 0xa87c, 0xd0ac, 0x0128, - 0xa834, 0xa938, 0x9115, 0x190c, 0xb4ee, 0xa974, 0x0016, 0x080c, - 0x6904, 0x001e, 0xd1e4, 0x1120, 0x080c, 0xa0e3, 0x009e, 0x0005, - 0x080c, 0xc137, 0x0cd8, 0x6114, 0x0096, 0x2148, 0xa97c, 0xd1e4, - 0x190c, 0x19a0, 0x009e, 0x0005, 0x080c, 0x8b04, 0x0010, 0x080c, - 0x8bc0, 0x080c, 0xbe37, 0x01f0, 0x0096, 0x6114, 0x2148, 0x080c, - 0xc03f, 0x1118, 0x080c, 0xaa81, 0x00a0, 0xa867, 0x0103, 0x2009, - 0x180c, 0x210c, 0xd18c, 0x11b8, 0xd184, 0x1190, 0x6108, 0xa97a, - 0x918e, 0x0029, 0x1110, 0x080c, 0xdb2e, 0xa877, 0x0000, 0x080c, - 0x6ae9, 0x009e, 0x080c, 0xa0e3, 0x080c, 0x8c10, 0x0804, 0x8ced, - 0xa87b, 0x0004, 0x0c90, 0xa87b, 0x0004, 0x0c78, 0x9182, 0x0054, - 0x1220, 0x9182, 0x0040, 0x0208, 0x000a, 0x0005, 0xb752, 0xb752, - 0xb752, 0xb752, 0xb752, 0xb754, 0xb752, 0xb752, 0xb752, 0xb752, - 0xb752, 0xb752, 0xb752, 0xb752, 0xb752, 0xb752, 0xb752, 0xb752, - 0xb752, 0xb752, 0x080c, 0x0dfa, 0x080c, 0x55e3, 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, 0x6ae9, 0x009e, 0x0804, 0xa0e3, - 0x9182, 0x0085, 0x0002, 0xb78a, 0xb788, 0xb788, 0xb796, 0xb788, - 0xb788, 0xb788, 0xb788, 0xb788, 0xb788, 0xb788, 0xb788, 0xb788, - 0x080c, 0x0dfa, 0x6003, 0x0001, 0x6106, 0x080c, 0x8679, 0x0126, - 0x2091, 0x8000, 0x080c, 0x8c10, 0x012e, 0x0005, 0x0026, 0x0056, - 0x00d6, 0x00e6, 0x2071, 0x0260, 0x7224, 0x6216, 0x7220, 0x080c, - 0xbe25, 0x01f8, 0x2268, 0x6800, 0x9086, 0x0000, 0x01d0, 0x6010, - 0x6d10, 0x952e, 0x11b0, 0x00c6, 0x2d60, 0x00d6, 0x080c, 0xba49, - 0x00de, 0x00ce, 0x0158, 0x702c, 0xd084, 0x1118, 0x080c, 0xba13, - 0x0010, 0x6803, 0x0002, 0x6007, 0x0086, 0x0028, 0x080c, 0xba35, - 0x0d90, 0x6007, 0x0087, 0x6003, 0x0001, 0x080c, 0x8679, 0x080c, - 0x8c10, 0x7220, 0x080c, 0xbe25, 0x0178, 0x6810, 0x00b6, 0x2058, - 0xb800, 0x00be, 0xd0bc, 0x0140, 0x6824, 0xd0ec, 0x0128, 0x00c6, - 0x2d60, 0x080c, 0xc171, 0x00ce, 0x00ee, 0x00de, 0x005e, 0x002e, - 0x0005, 0x9186, 0x0013, 0x1160, 0x6004, 0x908a, 0x0085, 0x0a0c, - 0x0dfa, 0x908a, 0x0092, 0x1a0c, 0x0dfa, 0x9082, 0x0085, 0x00e2, - 0x9186, 0x0027, 0x0120, 0x9186, 0x0014, 0x190c, 0x0dfa, 0x080c, - 0x8b04, 0x0096, 0x6014, 0x2048, 0x080c, 0xbe37, 0x0140, 0xa867, - 0x0103, 0xa877, 0x0000, 0xa87b, 0x0029, 0x080c, 0x6ae9, 0x009e, - 0x080c, 0xa113, 0x0804, 0x8c10, 0xb819, 0xb81b, 0xb81b, 0xb819, - 0xb819, 0xb819, 0xb819, 0xb819, 0xb819, 0xb819, 0xb819, 0xb819, - 0xb819, 0x080c, 0x0dfa, 0x080c, 0x8b04, 0x080c, 0xa113, 0x080c, - 0x8c10, 0x0005, 0x9186, 0x0013, 0x1128, 0x6004, 0x9082, 0x0085, - 0x2008, 0x04b8, 0x9186, 0x0027, 0x11f8, 0x080c, 0x8b04, 0x080c, - 0x318b, 0x080c, 0xc54e, 0x0096, 0x6014, 0x2048, 0x080c, 0xbe37, - 0x0150, 0xa867, 0x0103, 0xa877, 0x0000, 0xa87b, 0x0029, 0x080c, - 0x6ae9, 0x080c, 0xc022, 0x009e, 0x080c, 0xa0e3, 0x080c, 0x8c10, - 0x0005, 0x080c, 0xa178, 0x0ce0, 0x9186, 0x0014, 0x1dd0, 0x080c, - 0x8b04, 0x0096, 0x6014, 0x2048, 0x080c, 0xbe37, 0x0d60, 0xa867, - 0x0103, 0xa877, 0x0000, 0xa87b, 0x0006, 0xa880, 0xc0ec, 0xa882, - 0x08f0, 0x0002, 0xb871, 0xb86f, 0xb86f, 0xb86f, 0xb86f, 0xb86f, - 0xb889, 0xb86f, 0xb86f, 0xb86f, 0xb86f, 0xb86f, 0xb86f, 0x080c, - 0x0dfa, 0x080c, 0x8b04, 0x6034, 0x908c, 0xff00, 0x810f, 0x9186, - 0x0039, 0x0118, 0x9186, 0x0035, 0x1118, 0x2001, 0x195e, 0x0010, - 0x2001, 0x195f, 0x2004, 0x601a, 0x6003, 0x000c, 0x080c, 0x8c10, - 0x0005, 0x080c, 0x8b04, 0x6034, 0x908c, 0xff00, 0x810f, 0x9186, - 0x0039, 0x0118, 0x9186, 0x0035, 0x1118, 0x2001, 0x195e, 0x0010, - 0x2001, 0x195f, 0x2004, 0x601a, 0x6003, 0x000e, 0x080c, 0x8c10, - 0x0005, 0x9182, 0x0092, 0x1220, 0x9182, 0x0085, 0x0208, 0x0012, - 0x0804, 0xa178, 0xb8b7, 0xb8b7, 0xb8b7, 0xb8b7, 0xb8b9, 0xb906, - 0xb8b7, 0xb8b7, 0xb8b7, 0xb8b7, 0xb8b7, 0xb8b7, 0xb8b7, 0x080c, - 0x0dfa, 0x0096, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, - 0x0168, 0x6034, 0x908c, 0xff00, 0x810f, 0x9186, 0x0039, 0x0118, - 0x9186, 0x0035, 0x1118, 0x009e, 0x0804, 0xb91a, 0x080c, 0xbe37, - 0x1118, 0x080c, 0xc022, 0x0068, 0x6014, 0x2048, 0xa87c, 0xd0e4, - 0x1110, 0x080c, 0xc022, 0xa867, 0x0103, 0x080c, 0xc519, 0x080c, - 0x6ae9, 0x00d6, 0x2c68, 0x080c, 0xa08d, 0x01d0, 0x6003, 0x0001, - 0x6007, 0x001e, 0x600b, 0xffff, 0x2009, 0x026e, 0x210c, 0x613a, - 0x2009, 0x026f, 0x210c, 0x613e, 0x6910, 0x6112, 0x080c, 0xc2b3, - 0x6954, 0x6156, 0x6023, 0x0001, 0x080c, 0x8679, 0x080c, 0x8c10, - 0x2d60, 0x00de, 0x080c, 0xa0e3, 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, 0xc4b1, 0x11f0, 0x080c, - 0xa08d, 0x01d8, 0x6106, 0x6003, 0x0001, 0x6023, 0x0001, 0x6910, - 0x6112, 0x692c, 0x612e, 0x6930, 0x6132, 0x6934, 0x918c, 0x00ff, - 0x6136, 0x6938, 0x613a, 0x693c, 0x613e, 0x6954, 0x6156, 0x080c, - 0xc2b3, 0x080c, 0x8679, 0x080c, 0x8c10, 0x2d60, 0x00de, 0x0804, - 0xa0e3, 0x0096, 0x6014, 0x2048, 0x080c, 0xbe37, 0x01c8, 0xa867, - 0x0103, 0xa880, 0xd0b4, 0x0128, 0xc0ec, 0xa882, 0xa87b, 0x0006, - 0x0048, 0xd0bc, 0x0118, 0xa87b, 0x0002, 0x0020, 0xa87b, 0x0005, - 0x080c, 0xc133, 0xa877, 0x0000, 0x080c, 0x6ae9, 0x080c, 0xc022, - 0x009e, 0x0804, 0xa0e3, 0x0016, 0x0096, 0x6014, 0x2048, 0x080c, - 0xbe37, 0x0140, 0xa867, 0x0103, 0xa87b, 0x0028, 0xa877, 0x0000, - 0x080c, 0x6ae9, 0x009e, 0x001e, 0x9186, 0x0013, 0x0148, 0x9186, - 0x0014, 0x0130, 0x9186, 0x0027, 0x0118, 0x080c, 0xa178, 0x0030, - 0x080c, 0x8b04, 0x080c, 0xa113, 0x080c, 0x8c10, 0x0005, 0x0056, - 0x0066, 0x0096, 0x00a6, 0x2029, 0x0001, 0x9182, 0x0101, 0x1208, - 0x0010, 0x2009, 0x0100, 0x2130, 0x8304, 0x9098, 0x0018, 0x2009, - 0x0020, 0x2011, 0x0029, 0x080c, 0xb9e8, 0x96b2, 0x0020, 0xb004, - 0x904d, 0x0110, 0x080c, 0x0fe3, 0x080c, 0x1031, 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, 0x6ae9, 0x2a48, 0x0cb8, 0x080c, 0x6ae9, 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, 0xbe37, 0x0150, 0x2001, 0x0006, 0xa980, 0xc1d5, - 0x080c, 0x6d17, 0x080c, 0x6adc, 0x080c, 0xc022, 0x009e, 0x080c, - 0xa113, 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, 0xba84, 0xba84, 0xba7f, 0xbaa6, 0xba72, - 0xba7f, 0xbaa6, 0xba7f, 0xba72, 0xba72, 0xba7f, 0xba7f, 0xba7f, - 0xba72, 0xba72, 0x080c, 0x0dfa, 0x0036, 0x2019, 0x0010, 0x080c, - 0xd440, 0x6023, 0x0006, 0x6003, 0x0007, 0x003e, 0x0005, 0x9006, - 0x0005, 0x9085, 0x0001, 0x0005, 0x0096, 0x86ff, 0x11d8, 0x6014, - 0x2048, 0x080c, 0xbe37, 0x01c0, 0xa864, 0x9086, 0x0139, 0x1128, - 0xa87b, 0x0005, 0xa883, 0x0000, 0x0028, 0x900e, 0x2001, 0x0005, - 0x080c, 0x6d17, 0x080c, 0xc133, 0x080c, 0x6adc, 0x080c, 0xa113, - 0x9085, 0x0001, 0x009e, 0x0005, 0x9006, 0x0ce0, 0x6000, 0x908a, - 0x0016, 0x1a0c, 0x0dfa, 0x0002, 0xbabc, 0xbaec, 0xbabe, 0xbb0d, - 0xbae7, 0xbabc, 0xba7f, 0xba84, 0xba84, 0xba7f, 0xba7f, 0xba7f, - 0xba7f, 0xba7f, 0xba7f, 0xba7f, 0x080c, 0x0dfa, 0x86ff, 0x1520, - 0x6020, 0x9086, 0x0006, 0x0500, 0x0096, 0x6014, 0x2048, 0x080c, - 0xbe37, 0x0168, 0xa87c, 0xd0cc, 0x0140, 0x0096, 0xc0cc, 0xa87e, - 0xa878, 0x2048, 0x080c, 0x0fe3, 0x009e, 0x080c, 0xc133, 0x009e, - 0x080c, 0xc4f3, 0x6007, 0x0085, 0x6003, 0x000b, 0x6023, 0x0002, - 0x080c, 0x8679, 0x080c, 0x8c10, 0x9085, 0x0001, 0x0005, 0x0066, - 0x080c, 0x19b4, 0x006e, 0x0890, 0x00e6, 0x2071, 0x19bf, 0x7024, - 0x9c06, 0x1120, 0x080c, 0x9927, 0x00ee, 0x0840, 0x6020, 0x9084, - 0x000f, 0x9086, 0x0006, 0x1150, 0x0086, 0x0096, 0x2049, 0x0001, - 0x2c40, 0x080c, 0x9a58, 0x009e, 0x008e, 0x0010, 0x080c, 0x9824, - 0x00ee, 0x1904, 0xbabe, 0x0804, 0xba7f, 0x0036, 0x00e6, 0x2071, - 0x19bf, 0x703c, 0x9c06, 0x1138, 0x901e, 0x080c, 0x999d, 0x00ee, - 0x003e, 0x0804, 0xbabe, 0x080c, 0x9b88, 0x00ee, 0x003e, 0x1904, - 0xbabe, 0x0804, 0xba7f, 0x00c6, 0x6020, 0x9084, 0x000f, 0x0013, - 0x00ce, 0x0005, 0xbb40, 0xbc0b, 0xbd75, 0xbb4a, 0xa113, 0xbb40, - 0xd432, 0xc55b, 0xbc0b, 0xbb39, 0xbe01, 0xbb39, 0xbb39, 0xbb39, - 0xbb39, 0x080c, 0x0dfa, 0x080c, 0xc03f, 0x1110, 0x080c, 0xaa81, - 0x0005, 0x080c, 0x8b04, 0x080c, 0x8c10, 0x0804, 0xa0e3, 0x601b, - 0x0001, 0x0005, 0x080c, 0xbe37, 0x0130, 0x6014, 0x0096, 0x2048, - 0x2c00, 0xa896, 0x009e, 0x6000, 0x908a, 0x0016, 0x1a0c, 0x0dfa, - 0x0002, 0xbb69, 0xbb6b, 0xbb8f, 0xbba3, 0xbbc9, 0xbb69, 0xbb40, - 0xbb40, 0xbb40, 0xbba3, 0xbba3, 0xbb69, 0xbb69, 0xbb69, 0xbb69, - 0xbbad, 0x080c, 0x0dfa, 0x00e6, 0x6014, 0x0096, 0x2048, 0xa880, - 0xc0b5, 0xa882, 0x009e, 0x2071, 0x19bf, 0x7024, 0x9c06, 0x01a0, - 0x080c, 0x9824, 0x080c, 0xc4f3, 0x6007, 0x0085, 0x6003, 0x000b, - 0x6023, 0x0002, 0x2001, 0x195f, 0x2004, 0x601a, 0x080c, 0x8679, - 0x080c, 0x8c10, 0x00ee, 0x0005, 0x601b, 0x0001, 0x0cd8, 0x0096, - 0x6014, 0x2048, 0xa880, 0xc0b5, 0xa882, 0x009e, 0x080c, 0xc4f3, - 0x6007, 0x0085, 0x6003, 0x000b, 0x6023, 0x0002, 0x080c, 0x8679, - 0x080c, 0x8c10, 0x0005, 0x0096, 0x601b, 0x0001, 0x6014, 0x2048, - 0xa880, 0xc0b5, 0xa882, 0x009e, 0x0005, 0x080c, 0x55e3, 0x01b8, - 0x6014, 0x0096, 0x904d, 0x0190, 0xa864, 0xa867, 0x0103, 0xa87b, - 0x0006, 0x9086, 0x0139, 0x1150, 0xa867, 0x0139, 0xa87b, 0x0030, - 0xa897, 0x4005, 0xa89b, 0x0004, 0x080c, 0x6ae9, 0x009e, 0x0804, - 0xa0e3, 0x6014, 0x0096, 0x904d, 0x05c8, 0xa97c, 0xd1e4, 0x05b0, - 0x2001, 0x180f, 0x2004, 0xd0c4, 0x0110, 0x009e, 0x0005, 0xa884, - 0x009e, 0x8003, 0x800b, 0x810b, 0x9108, 0x611a, 0x2001, 0x0030, - 0x2c08, 0x080c, 0x158b, 0x2001, 0x030c, 0x2004, 0x9086, 0x0041, - 0x11a0, 0x6014, 0x0096, 0x904d, 0x090c, 0x0dfa, 0xa880, 0xd0f4, - 0x1130, 0xc0f5, 0xa882, 0x009e, 0x601b, 0x0002, 0x0070, 0x009e, - 0x2001, 0x0037, 0x2c08, 0x080c, 0x158b, 0x6000, 0x9086, 0x0004, - 0x1120, 0x2009, 0x0048, 0x080c, 0xa15d, 0x0005, 0x009e, 0x080c, - 0x19b4, 0x0804, 0xbb8f, 0x6000, 0x908a, 0x0016, 0x1a0c, 0x0dfa, - 0x000b, 0x0005, 0xbc22, 0xbb47, 0xbc24, 0xbc22, 0xbc24, 0xbc24, - 0xbb41, 0xbc22, 0xbb3b, 0xbb3b, 0xbc22, 0xbc22, 0xbc22, 0xbc22, - 0xbc22, 0xbc22, 0x080c, 0x0dfa, 0x6010, 0x00b6, 0x2058, 0xb804, - 0x9084, 0x00ff, 0x00be, 0x908a, 0x000c, 0x1a0c, 0x0dfa, 0x00b6, - 0x0013, 0x00be, 0x0005, 0xbc3f, 0xbd0c, 0xbc41, 0xbc81, 0xbc41, - 0xbc81, 0xbc41, 0xbc4f, 0xbc3f, 0xbc81, 0xbc3f, 0xbc70, 0x080c, - 0x0dfa, 0x6004, 0x908e, 0x0016, 0x05c0, 0x908e, 0x0004, 0x05a8, - 0x908e, 0x0002, 0x0590, 0x908e, 0x0052, 0x0904, 0xbd08, 0x6004, - 0x080c, 0xc03f, 0x0904, 0xbd25, 0x908e, 0x0004, 0x1110, 0x080c, - 0x31b4, 0x908e, 0x0021, 0x0904, 0xbd29, 0x908e, 0x0022, 0x0904, - 0xbd70, 0x908e, 0x003d, 0x0904, 0xbd29, 0x908e, 0x0039, 0x0904, - 0xbd2d, 0x908e, 0x0035, 0x0904, 0xbd2d, 0x908e, 0x001e, 0x0178, - 0x908e, 0x0001, 0x1140, 0x6010, 0x2058, 0xb804, 0x9084, 0x00ff, - 0x9086, 0x0006, 0x0110, 0x080c, 0x318b, 0x080c, 0xaa81, 0x0804, - 0xa113, 0x00c6, 0x00d6, 0x6104, 0x9186, 0x0016, 0x0904, 0xbcf9, - 0x9186, 0x0002, 0x1904, 0xbcce, 0x2001, 0x1836, 0x2004, 0xd08c, - 0x11c8, 0x080c, 0x7207, 0x11b0, 0x080c, 0xc539, 0x0138, 0x080c, - 0x722a, 0x1120, 0x080c, 0x7105, 0x0804, 0xbd59, 0x2001, 0x1955, - 0x2003, 0x0001, 0x2001, 0x1800, 0x2003, 0x0001, 0x080c, 0x7127, - 0x0804, 0xbd59, 0x6010, 0x2058, 0x2001, 0x1836, 0x2004, 0xd0ac, - 0x1904, 0xbd59, 0xb8a0, 0x9084, 0xff80, 0x1904, 0xbd59, 0xb840, - 0x9084, 0x00ff, 0x9005, 0x0190, 0x8001, 0xb842, 0x6017, 0x0000, - 0x6023, 0x0007, 0x601b, 0x0398, 0x6043, 0x0000, 0x080c, 0xa08d, - 0x0128, 0x2b00, 0x6012, 0x6023, 0x0001, 0x0458, 0x00de, 0x00ce, - 0x6004, 0x908e, 0x0002, 0x11a0, 0x6010, 0x2058, 0xb8a0, 0x9086, - 0x007e, 0x1170, 0x2009, 0x1836, 0x2104, 0xc085, 0x200a, 0x00e6, - 0x2071, 0x1800, 0x080c, 0x5ebe, 0x00ee, 0x080c, 0xaa81, 0x0030, - 0x080c, 0xaa81, 0x080c, 0x318b, 0x080c, 0xc54e, 0x00e6, 0x0126, - 0x2091, 0x8000, 0x080c, 0x31b4, 0x012e, 0x00ee, 0x080c, 0xa113, - 0x0005, 0x2001, 0x0002, 0x080c, 0x63f0, 0x6003, 0x0001, 0x6007, - 0x0002, 0x080c, 0x86c1, 0x080c, 0x8c10, 0x00de, 0x00ce, 0x0c80, - 0x080c, 0x31b4, 0x0804, 0xbc7d, 0x00c6, 0x00d6, 0x6104, 0x9186, - 0x0016, 0x0d38, 0x6010, 0x2058, 0xb840, 0x9084, 0x00ff, 0x9005, - 0x0904, 0xbcce, 0x8001, 0xb842, 0x6003, 0x0001, 0x080c, 0x86c1, - 0x080c, 0x8c10, 0x00de, 0x00ce, 0x0898, 0x080c, 0xaa81, 0x0804, - 0xbc7f, 0x080c, 0xaabd, 0x0804, 0xbc7f, 0x00d6, 0x2c68, 0x6104, - 0x080c, 0xc4b1, 0x00de, 0x0118, 0x080c, 0xa0e3, 0x0408, 0x6004, - 0x8007, 0x6134, 0x918c, 0x00ff, 0x9105, 0x6036, 0x6007, 0x0085, - 0x6003, 0x000b, 0x6023, 0x0002, 0x603c, 0x600a, 0x2001, 0x195f, - 0x2004, 0x601a, 0x602c, 0x2c08, 0x2060, 0x6024, 0xd0b4, 0x0108, - 0xc085, 0xc0b5, 0x6026, 0x2160, 0x080c, 0x8679, 0x080c, 0x8c10, - 0x0005, 0x00de, 0x00ce, 0x080c, 0xaa81, 0x080c, 0x318b, 0x00e6, - 0x0126, 0x2091, 0x8000, 0x080c, 0x31b4, 0x6017, 0x0000, 0x6023, - 0x0007, 0x601b, 0x0398, 0x6043, 0x0000, 0x012e, 0x00ee, 0x0005, - 0x080c, 0xa513, 0x1904, 0xbd25, 0x0005, 0x6000, 0x908a, 0x0016, - 0x1a0c, 0x0dfa, 0x0096, 0x00d6, 0x001b, 0x00de, 0x009e, 0x0005, - 0xbd90, 0xbd90, 0xbd90, 0xbd90, 0xbd90, 0xbd90, 0xbd90, 0xbd90, - 0xbd90, 0xbb40, 0xbd90, 0xbb47, 0xbd92, 0xbb47, 0xbdac, 0xbd90, - 0x080c, 0x0dfa, 0x6004, 0x9086, 0x008b, 0x01b0, 0x6034, 0x908c, - 0xff00, 0x810f, 0x9186, 0x0035, 0x1130, 0x602c, 0x9080, 0x0009, - 0x200c, 0xc185, 0x2102, 0x6007, 0x008b, 0x6003, 0x000d, 0x080c, - 0x8679, 0x080c, 0x8c10, 0x0005, 0x080c, 0xc52d, 0x0118, 0x080c, - 0xc540, 0x0010, 0x080c, 0xc54e, 0x080c, 0xc022, 0x080c, 0xbe37, - 0x0570, 0x080c, 0x318b, 0x080c, 0xbe37, 0x0168, 0x6014, 0x2048, - 0xa867, 0x0103, 0xa87b, 0x0006, 0xa877, 0x0000, 0xa880, 0xc0ed, - 0xa882, 0x080c, 0x6ae9, 0x2c68, 0x080c, 0xa08d, 0x0150, 0x6810, - 0x6012, 0x080c, 0xc2b3, 0x00c6, 0x2d60, 0x080c, 0xa113, 0x00ce, - 0x0008, 0x2d60, 0x6017, 0x0000, 0x6023, 0x0001, 0x6007, 0x0001, - 0x6003, 0x0001, 0x080c, 0x86c1, 0x080c, 0x8c10, 0x00c8, 0x080c, - 0xc52d, 0x0138, 0x6034, 0x9086, 0x4000, 0x1118, 0x080c, 0x318b, - 0x08d0, 0x6034, 0x908c, 0xff00, 0x810f, 0x9186, 0x0039, 0x0118, - 0x9186, 0x0035, 0x1118, 0x080c, 0x318b, 0x0868, 0x080c, 0xa113, - 0x0005, 0x6000, 0x908a, 0x0016, 0x1a0c, 0x0dfa, 0x0002, 0xbe17, - 0xbe17, 0xbe19, 0xbe19, 0xbe19, 0xbe17, 0xbe17, 0xa113, 0xbe17, - 0xbe17, 0xbe17, 0xbe17, 0xbe17, 0xbe17, 0xbe17, 0xbe17, 0x080c, - 0x0dfa, 0x080c, 0x9b88, 0x6114, 0x0096, 0x2148, 0xa87b, 0x0006, - 0x080c, 0x6ae9, 0x009e, 0x0804, 0xa0e3, 0x9284, 0x0007, 0x1158, - 0x9282, 0x1cd0, 0x0240, 0x2001, 0x1819, 0x2004, 0x9202, 0x1218, - 0x9085, 0x0001, 0x0005, 0x9006, 0x0ce8, 0x0096, 0x0028, 0x0096, - 0x0006, 0x6014, 0x2048, 0x000e, 0x0006, 0x9984, 0xf000, 0x9086, - 0xf000, 0x0110, 0x080c, 0x10dc, 0x000e, 0x009e, 0x0005, 0x00e6, - 0x00c6, 0x0036, 0x0006, 0x0126, 0x2091, 0x8000, 0x2061, 0x1cd0, - 0x2071, 0x1800, 0x7350, 0x7070, 0x9302, 0x1640, 0x6020, 0x9206, - 0x11f8, 0x080c, 0xc539, 0x0180, 0x9286, 0x0001, 0x1168, 0x6004, - 0x9086, 0x0004, 0x1148, 0x080c, 0x318b, 0x080c, 0xc54e, 0x00c6, - 0x080c, 0xa113, 0x00ce, 0x0060, 0x080c, 0xc22d, 0x0148, 0x080c, - 0xc03f, 0x1110, 0x080c, 0xaa81, 0x00c6, 0x080c, 0xa0e3, 0x00ce, - 0x9ce0, 0x0018, 0x7064, 0x9c02, 0x1208, 0x08a0, 0x012e, 0x000e, - 0x003e, 0x00ce, 0x00ee, 0x0005, 0x00e6, 0x00c6, 0x0016, 0x9188, - 0x1000, 0x210c, 0x81ff, 0x0128, 0x2061, 0x1a8a, 0x6112, 0x080c, - 0x318b, 0x9006, 0x0010, 0x9085, 0x0001, 0x001e, 0x00ce, 0x00ee, - 0x0005, 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, 0xa08d, 0x01b0, - 0x6656, 0x2b00, 0x6012, 0x080c, 0x55e3, 0x0118, 0x080c, 0xbf66, - 0x0168, 0x080c, 0xc2b3, 0x6023, 0x0003, 0x2009, 0x004b, 0x080c, - 0xa15d, 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, - 0x00c6, 0x0126, 0x2091, 0x8000, 0xbaa0, 0x080c, 0xa130, 0x0560, - 0x6057, 0x0000, 0x2b00, 0x6012, 0x080c, 0xc2b3, 0x6023, 0x0003, - 0x0016, 0x080c, 0x8803, 0x0076, 0x903e, 0x080c, 0x86f1, 0x2c08, - 0x080c, 0xd5f6, 0x007e, 0x001e, 0xd184, 0x0128, 0x080c, 0xa0e3, - 0x9085, 0x0001, 0x0070, 0x080c, 0x55e3, 0x0128, 0xd18c, 0x1170, - 0x080c, 0xbf66, 0x0148, 0x2009, 0x004c, 0x080c, 0xa15d, 0x9085, - 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x2900, 0x6016, - 0x0c90, 0x2009, 0x004d, 0x0010, 0x2009, 0x004e, 0x00f6, 0x00c6, - 0x0046, 0x0016, 0x080c, 0xa08d, 0x2c78, 0x05a0, 0x7e56, 0x2b00, - 0x7812, 0x7823, 0x0003, 0x0016, 0x2021, 0x0005, 0x080c, 0xbf78, - 0x001e, 0x9186, 0x004d, 0x0118, 0x9186, 0x004e, 0x0148, 0x2001, - 0x1958, 0x200c, 0xd1fc, 0x0168, 0x2f60, 0x080c, 0xa0e3, 0x00d0, - 0x2001, 0x1957, 0x200c, 0xd1fc, 0x0120, 0x2f60, 0x080c, 0xa0e3, - 0x0088, 0x2f60, 0x080c, 0x55e3, 0x0138, 0xd18c, 0x1118, 0x04f1, - 0x0148, 0x0010, 0x2900, 0x7816, 0x001e, 0x0016, 0x080c, 0xa15d, - 0x9085, 0x0001, 0x001e, 0x004e, 0x00ce, 0x00fe, 0x0005, 0x00f6, - 0x00c6, 0x0046, 0x080c, 0xa08d, 0x2c78, 0x0508, 0x7e56, 0x2b00, - 0x7812, 0x7823, 0x0003, 0x0096, 0x2021, 0x0004, 0x0489, 0x009e, - 0x2001, 0x1956, 0x200c, 0xd1fc, 0x0120, 0x2f60, 0x080c, 0xa0e3, - 0x0060, 0x2f60, 0x080c, 0x55e3, 0x0120, 0xd18c, 0x1160, 0x0071, - 0x0130, 0x2009, 0x0052, 0x080c, 0xa15d, 0x9085, 0x0001, 0x004e, - 0x00ce, 0x00fe, 0x0005, 0x2900, 0x7816, 0x0c98, 0x00c6, 0x080c, - 0x4abf, 0x00ce, 0x1120, 0x080c, 0xa0e3, 0x9006, 0x0005, 0xa867, - 0x0000, 0xa86b, 0x8000, 0x2900, 0x6016, 0x9085, 0x0001, 0x0005, - 0x0096, 0x0076, 0x0126, 0x2091, 0x8000, 0x080c, 0x65d3, 0x0158, - 0x2001, 0xbf7d, 0x0006, 0x900e, 0x2400, 0x080c, 0x6d17, 0x080c, - 0x6ae9, 0x000e, 0x0807, 0x2418, 0x080c, 0x8a9e, 0xbaa0, 0x0086, - 0x2041, 0x0001, 0x2039, 0x0001, 0x2608, 0x080c, 0x881b, 0x008e, - 0x080c, 0x86f1, 0x2f08, 0x2648, 0x080c, 0xd5f6, 0xb93c, 0x81ff, - 0x090c, 0x88ee, 0x080c, 0x8c10, 0x012e, 0x007e, 0x009e, 0x0005, - 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, 0xa08d, 0x0190, 0x660a, - 0x2b08, 0x6112, 0x080c, 0xc2b3, 0x6023, 0x0001, 0x2900, 0x6016, - 0x2009, 0x001f, 0x080c, 0xa15d, 0x9085, 0x0001, 0x012e, 0x00ce, - 0x0005, 0x9006, 0x0cd8, 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, - 0xa130, 0x01b8, 0x660a, 0x2b08, 0x6112, 0x080c, 0xc2b3, 0x6023, - 0x0008, 0x2900, 0x6016, 0x00f6, 0x2c78, 0x080c, 0x16db, 0x00fe, - 0x2009, 0x0021, 0x080c, 0xa15d, 0x9085, 0x0001, 0x012e, 0x00ce, - 0x0005, 0x9006, 0x0cd8, 0x2009, 0x003d, 0x00c6, 0x0126, 0x0016, - 0x2091, 0x8000, 0x080c, 0xa08d, 0x0198, 0x660a, 0x2b08, 0x6112, - 0x080c, 0xc2b3, 0x6023, 0x0001, 0x2900, 0x6016, 0x001e, 0x0016, - 0x080c, 0xa15d, 0x9085, 0x0001, 0x001e, 0x012e, 0x00ce, 0x0005, - 0x9006, 0x0cd0, 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, 0xa130, - 0x0188, 0x2b08, 0x6112, 0x080c, 0xc2b3, 0x6023, 0x0001, 0x2900, - 0x6016, 0x2009, 0x0000, 0x080c, 0xa15d, 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, 0xbe37, 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, 0xa130, 0x0198, - 0x2b08, 0x6112, 0x080c, 0xc2b3, 0x6023, 0x0001, 0x2900, 0x6016, - 0x080c, 0x318b, 0x2009, 0x0028, 0x080c, 0xa15d, 0x9085, 0x0001, - 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x9186, 0x0015, 0x11a8, - 0x2011, 0x1823, 0x2204, 0x9086, 0x0074, 0x1178, 0x00b6, 0x080c, - 0xad0c, 0x00be, 0x080c, 0xaf4b, 0x6003, 0x0001, 0x6007, 0x0029, - 0x080c, 0x86c1, 0x080c, 0x8c10, 0x0078, 0x6014, 0x0096, 0x2048, - 0xa868, 0x009e, 0xd0fc, 0x0148, 0x2001, 0x0001, 0x080c, 0xc472, - 0x080c, 0xaa81, 0x080c, 0xa0e3, 0x0005, 0x0096, 0x6014, 0x904d, - 0x090c, 0x0dfa, 0xa87b, 0x0030, 0xa883, 0x0000, 0xa897, 0x4005, - 0xa89b, 0x0004, 0xa867, 0x0139, 0x0126, 0x2091, 0x8000, 0x080c, - 0x6ae9, 0x012e, 0x009e, 0x080c, 0xa0e3, 0x0c30, 0x0096, 0x9186, - 0x0016, 0x1128, 0x2001, 0x0004, 0x080c, 0x63f0, 0x00e8, 0x9186, - 0x0015, 0x1510, 0x2011, 0x1823, 0x2204, 0x9086, 0x0014, 0x11e0, - 0x6010, 0x00b6, 0x2058, 0x080c, 0x653a, 0x00be, 0x080c, 0xb01c, - 0x1198, 0x6010, 0x00b6, 0x2058, 0xb890, 0x00be, 0x9005, 0x0160, - 0x2001, 0x0006, 0x080c, 0x63f0, 0x6014, 0x2048, 0xa868, 0xd0fc, - 0x0170, 0x080c, 0xa4e7, 0x0048, 0x6014, 0x2048, 0xa868, 0xd0fc, - 0x0528, 0x080c, 0xaa81, 0x080c, 0xa0e3, 0x009e, 0x0005, 0x6014, - 0x6310, 0x2358, 0x904d, 0x090c, 0x0dfa, 0xa87b, 0x0000, 0xa883, - 0x0000, 0xa897, 0x4000, 0x900e, 0x080c, 0x66bf, 0x1108, 0xc185, - 0xb800, 0xd0bc, 0x0108, 0xc18d, 0xa99a, 0x0126, 0x2091, 0x8000, - 0x080c, 0x6ae9, 0x012e, 0x080c, 0xa0e3, 0x08f8, 0x6014, 0x904d, - 0x090c, 0x0dfa, 0xa87b, 0x0030, 0xa883, 0x0000, 0xa897, 0x4005, - 0xa89b, 0x0004, 0xa867, 0x0139, 0x0126, 0x2091, 0x8000, 0x080c, - 0x6ae9, 0x012e, 0x080c, 0xa0e3, 0x0840, 0xa878, 0x9086, 0x0005, - 0x1108, 0x0009, 0x0005, 0xa880, 0xc0ad, 0xa882, 0x0005, 0x6043, - 0x0000, 0x6017, 0x0000, 0x6003, 0x0001, 0x6007, 0x0050, 0x080c, - 0x8679, 0x080c, 0x8c10, 0x0005, 0x00c6, 0x6010, 0x00b6, 0x2058, - 0xb800, 0x00be, 0xd0bc, 0x0120, 0x6020, 0x9084, 0x000f, 0x0013, - 0x00ce, 0x0005, 0xbb40, 0xc163, 0xc163, 0xc166, 0xd8d4, 0xd8ef, - 0xd8f2, 0xbb40, 0xbb40, 0xbb40, 0xbb40, 0xbb40, 0xbb40, 0xbb40, - 0xbb40, 0x080c, 0x0dfa, 0xa001, 0xa001, 0x0005, 0x0096, 0x6014, - 0x904d, 0x0118, 0xa87c, 0xd0e4, 0x1110, 0x009e, 0x0010, 0x009e, - 0x0005, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x0550, - 0x2001, 0x1833, 0x2004, 0x9005, 0x1540, 0x00f6, 0x2c78, 0x080c, - 0xa08d, 0x0508, 0x7810, 0x6012, 0x080c, 0xc2b3, 0x7820, 0x9086, - 0x0003, 0x0128, 0x7808, 0x603a, 0x2f00, 0x603e, 0x0020, 0x7808, - 0x603e, 0x2f00, 0x603a, 0x602e, 0x6023, 0x0001, 0x6007, 0x0035, - 0x6003, 0x0001, 0x7954, 0x6156, 0x080c, 0x8679, 0x080c, 0x8c10, - 0x2f60, 0x00fe, 0x0005, 0x2f60, 0x00fe, 0x2001, 0x1960, 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, - 0x0fe3, 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, - 0x8679, 0x080c, 0x8c10, 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, 0x195a, 0x200c, 0x8000, 0x2014, 0x2001, - 0x0032, 0x080c, 0x84ff, 0x2001, 0x195e, 0x82ff, 0x1110, 0x2011, - 0x0014, 0x2202, 0x2001, 0x195c, 0x200c, 0x8000, 0x2014, 0x2071, - 0x1944, 0x711a, 0x721e, 0x2001, 0x0064, 0x080c, 0x84ff, 0x2001, - 0x195f, 0x82ff, 0x1110, 0x2011, 0x0014, 0x2202, 0x2001, 0x1960, - 0x9288, 0x000a, 0x2102, 0x2001, 0x1a6b, 0x2102, 0x2001, 0x0032, - 0x080c, 0x158b, 0x080c, 0x67a4, 0x00ee, 0x003e, 0x002e, 0x001e, - 0x000e, 0x0005, 0x0006, 0x0016, 0x00e6, 0x2001, 0x195e, 0x2003, - 0x0028, 0x2001, 0x195f, 0x2003, 0x0014, 0x2071, 0x1944, 0x701b, - 0x0000, 0x701f, 0x07d0, 0x2001, 0x1960, 0x2009, 0x001e, 0x2102, - 0x2001, 0x1a6b, 0x2102, 0x2001, 0x0032, 0x080c, 0x158b, 0x00ee, - 0x001e, 0x000e, 0x0005, 0x0096, 0x6058, 0x904d, 0x0110, 0x080c, - 0x1063, 0x009e, 0x0005, 0x0005, 0x00c6, 0x0126, 0x2091, 0x8000, - 0x080c, 0xa08d, 0x0180, 0x2b08, 0x6112, 0x0ca9, 0x6023, 0x0001, - 0x2900, 0x6016, 0x2009, 0x0033, 0x080c, 0xa15d, 0x9085, 0x0001, - 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x0096, 0x00e6, 0x00f6, - 0x2071, 0x1800, 0x9186, 0x0015, 0x1500, 0x708c, 0x9086, 0x0018, - 0x11e0, 0x6014, 0x2048, 0xaa3c, 0xd2e4, 0x1160, 0x2c78, 0x080c, - 0x8e03, 0x01d8, 0x7078, 0xaa50, 0x9206, 0x1160, 0x707c, 0xaa54, - 0x9206, 0x1140, 0x6210, 0x00b6, 0x2258, 0xbaa0, 0x00be, 0x900e, - 0x080c, 0x31d4, 0x080c, 0xa4e7, 0x0020, 0x080c, 0xaa81, 0x080c, - 0xa0e3, 0x00fe, 0x00ee, 0x009e, 0x0005, 0x705c, 0xaa54, 0x9206, - 0x0d48, 0x0c80, 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, 0xa08d, - 0x0188, 0x2b08, 0x6112, 0x080c, 0xc2b3, 0x6023, 0x0001, 0x2900, - 0x6016, 0x2009, 0x004d, 0x080c, 0xa15d, 0x9085, 0x0001, 0x012e, - 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x00c6, 0x0126, 0x2091, 0x8000, - 0x0016, 0x080c, 0xa08d, 0x0180, 0x2b08, 0x6112, 0x080c, 0xc2b3, - 0x6023, 0x0001, 0x2900, 0x6016, 0x001e, 0x080c, 0xa15d, 0x9085, - 0x0001, 0x012e, 0x00ce, 0x0005, 0x001e, 0x9006, 0x0cd0, 0x0016, - 0x0026, 0x0036, 0x0046, 0x0056, 0x0066, 0x0096, 0x00e6, 0x00f6, - 0x2071, 0x1800, 0x9186, 0x0015, 0x1568, 0x718c, 0x6014, 0x2048, - 0xa814, 0x8003, 0x9106, 0x1530, 0x20e1, 0x0000, 0x2001, 0x1978, - 0x2003, 0x0000, 0x6014, 0x2048, 0xa830, 0x20a8, 0x8906, 0x8006, - 0x8007, 0x9094, 0x003f, 0x22e8, 0x9084, 0xffc0, 0x9080, 0x001b, - 0x20a0, 0x2001, 0x1978, 0x0016, 0x200c, 0x080c, 0xcb1d, 0x001e, - 0xa804, 0x9005, 0x0110, 0x2048, 0x0c38, 0x6014, 0x2048, 0xa867, - 0x0103, 0x0010, 0x080c, 0xaa81, 0x080c, 0xa0e3, 0x00fe, 0x00ee, - 0x009e, 0x006e, 0x005e, 0x004e, 0x003e, 0x002e, 0x001e, 0x0005, - 0x0096, 0x00e6, 0x00f6, 0x2071, 0x1800, 0x9186, 0x0015, 0x11b8, - 0x708c, 0x9086, 0x0004, 0x1198, 0x6014, 0x2048, 0x2c78, 0x080c, - 0x8e03, 0x01a8, 0x7078, 0xaa74, 0x9206, 0x1130, 0x707c, 0xaa78, - 0x9206, 0x1110, 0x080c, 0x318b, 0x080c, 0xa4e7, 0x0020, 0x080c, - 0xaa81, 0x080c, 0xa0e3, 0x00fe, 0x00ee, 0x009e, 0x0005, 0x705c, - 0xaa78, 0x9206, 0x0d78, 0x0c80, 0x0096, 0x00e6, 0x00f6, 0x2071, - 0x1800, 0x9186, 0x0015, 0x1550, 0x708c, 0x9086, 0x0004, 0x1530, - 0x6014, 0x2048, 0x2c78, 0x080c, 0x8e03, 0x05f0, 0x7078, 0xaacc, - 0x9206, 0x1180, 0x707c, 0xaad0, 0x9206, 0x1160, 0x080c, 0x318b, - 0x0016, 0xa998, 0xaab0, 0x9284, 0x1000, 0xc0fd, 0x080c, 0x558a, - 0x001e, 0x0010, 0x080c, 0x5375, 0x080c, 0xbe37, 0x0508, 0xa87b, - 0x0000, 0xa883, 0x0000, 0xa897, 0x4000, 0x0080, 0x080c, 0xbe37, - 0x01b8, 0x6014, 0x2048, 0x080c, 0x5375, 0x1d70, 0xa87b, 0x0030, - 0xa883, 0x0000, 0xa897, 0x4005, 0xa89b, 0x0004, 0x0126, 0x2091, - 0x8000, 0xa867, 0x0139, 0x080c, 0x6ae9, 0x012e, 0x080c, 0xa0e3, - 0x00fe, 0x00ee, 0x009e, 0x0005, 0x705c, 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, 0xbe37, 0x0904, 0xc46e, 0x0096, - 0x6314, 0x2348, 0xa87a, 0xa982, 0x929e, 0x4000, 0x1580, 0x6310, - 0x00c6, 0x2358, 0x2009, 0x0000, 0xa868, 0xd0f4, 0x1140, 0x080c, - 0x66bf, 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d, 0xaa96, - 0xa99a, 0x20a9, 0x0004, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0031, - 0x20a0, 0xb8b4, 0x20e0, 0xb8b8, 0x9080, 0x0006, 0x2098, 0x080c, - 0x0fae, 0x20a9, 0x0004, 0xa85c, 0x9080, 0x0035, 0x20a0, 0xb8b8, - 0x9080, 0x000a, 0x2098, 0x080c, 0x0fae, 0x00ce, 0x0090, 0xaa96, - 0x3918, 0x9398, 0x0007, 0x231c, 0x6004, 0x9086, 0x0016, 0x0110, - 0xa89b, 0x0004, 0xaba2, 0x6310, 0x2358, 0xb804, 0x9084, 0x00ff, - 0xa89e, 0x080c, 0x6adc, 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, 0x276e, 0x2118, - 0x831f, 0x939c, 0xff00, 0x7838, 0x9084, 0x00ff, 0x931d, 0x7c3c, - 0x2011, 0x8018, 0x080c, 0x4b1f, 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, 0xbe25, 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, - 0x0188, 0x918c, 0x00ff, 0x918e, 0x0002, 0x1160, 0xa9a8, 0x918c, - 0x0f00, 0x810f, 0x918e, 0x0001, 0x1128, 0xa834, 0xa938, 0x9115, - 0x190c, 0xb4ee, 0x0005, 0x0036, 0x2019, 0x0001, 0x0010, 0x0036, - 0x901e, 0x0499, 0x01e0, 0x080c, 0xbe37, 0x01c8, 0x080c, 0xc022, + 0x080c, 0xb8b4, 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, 0x1a7e, 0x0804, 0x95e7, 0x6003, 0x0002, + 0x6004, 0x9086, 0x0040, 0x11c8, 0x0096, 0x6014, 0x2048, 0xa87c, + 0xd0ac, 0x0160, 0x601c, 0xd084, 0x1130, 0x00f6, 0x2c00, 0x2078, + 0x080c, 0x1651, 0x00fe, 0x6003, 0x0004, 0x0010, 0x6003, 0x0002, + 0x009e, 0x080c, 0x8a83, 0x080c, 0x8b8f, 0x0096, 0x2001, 0x1962, + 0x2004, 0x6042, 0x080c, 0x8b3f, 0x080c, 0x8c6c, 0x6114, 0x2148, + 0xa97c, 0xd1e4, 0x0904, 0xb3d9, 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, 0x0fe9, + 0x001e, 0x0458, 0x0016, 0x080c, 0x0fe9, 0x009e, 0xa87c, 0xc0cc, + 0xa87e, 0xa974, 0x0016, 0x080c, 0xb905, 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, 0x683c, 0x001e, 0xd1e4, 0x1120, 0x080c, + 0x9fea, 0x009e, 0x0005, 0x080c, 0xc04e, 0x0cd8, 0x6004, 0x9086, + 0x0040, 0x1120, 0x080c, 0x8a83, 0x080c, 0x8b8f, 0x2019, 0x0001, + 0x080c, 0x98b1, 0x6003, 0x0002, 0x080c, 0xc476, 0x080c, 0x8b3f, + 0x080c, 0x8c6c, 0x0005, 0x6004, 0x9086, 0x0040, 0x1120, 0x080c, + 0x8a83, 0x080c, 0x8b8f, 0x2019, 0x0001, 0x080c, 0x98b1, 0x080c, + 0x8b3f, 0x080c, 0x3095, 0x080c, 0xc46e, 0x0096, 0x6114, 0x2148, + 0x080c, 0xbd4e, 0x0150, 0xa867, 0x0103, 0xa87b, 0x0029, 0xa877, + 0x0000, 0x080c, 0x6a22, 0x080c, 0xbf39, 0x009e, 0x080c, 0x9fea, + 0x080c, 0x8c6c, 0x0005, 0xa87b, 0x0015, 0xd1fc, 0x0180, 0xa87b, + 0x0007, 0x8002, 0x8000, 0x810a, 0x9189, 0x0000, 0x0006, 0x0016, + 0x2009, 0x1a55, 0x2104, 0x8000, 0x200a, 0x001e, 0x000e, 0xa992, + 0xa88e, 0x0005, 0x9182, 0x0054, 0x1220, 0x9182, 0x0040, 0x0208, + 0x000a, 0x0005, 0xb44e, 0xb44e, 0xb44e, 0xb44e, 0xb44e, 0xb450, + 0xb44e, 0xb44e, 0xb4f6, 0xb44e, 0xb44e, 0xb44e, 0xb44e, 0xb44e, + 0xb44e, 0xb44e, 0xb44e, 0xb44e, 0xb44e, 0xb628, 0x080c, 0x0df6, + 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, 0xb4ef, 0x9694, 0xff00, 0x9284, 0x0c00, 0x0120, + 0x7048, 0xb092, 0x704c, 0xb08e, 0x9284, 0x0300, 0x0904, 0xb4ef, + 0x9686, 0x0100, 0x1130, 0x7064, 0x9005, 0x1118, 0xc6c4, 0xb676, + 0x0c38, 0x080c, 0x1037, 0x090c, 0x0df6, 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, 0xb915, 0x003e, + 0xd6cc, 0x01e8, 0x7154, 0xa98a, 0x81ff, 0x01c8, 0x9192, 0x0021, + 0x1260, 0x8304, 0x9098, 0x0018, 0x2011, 0x0029, 0x080c, 0xb915, + 0x2011, 0x0205, 0x2013, 0x0000, 0x0050, 0xb068, 0xd0fc, 0x0120, + 0x2009, 0x0020, 0xa98a, 0x0c68, 0x2950, 0x080c, 0xb8b4, 0x080c, + 0x18f8, 0x009e, 0x00ee, 0x00ae, 0x007e, 0x0005, 0x2001, 0x1962, + 0x2004, 0x6042, 0x0096, 0x6114, 0x2148, 0xa83c, 0xa940, 0x9105, + 0x1118, 0xa87c, 0xc0dc, 0xa87e, 0x6003, 0x0002, 0xa97c, 0xd1e4, + 0x0904, 0xb623, 0x6043, 0x0000, 0x6010, 0x00b6, 0x2058, 0xb800, + 0x00be, 0xd0bc, 0x1500, 0xd1cc, 0x0904, 0xb5f2, 0xa978, 0xa868, + 0xd0fc, 0x0904, 0xb5b3, 0x0016, 0xa87c, 0x0006, 0xa880, 0x0006, + 0x00a6, 0x2150, 0xb174, 0x9184, 0x00ff, 0x90b6, 0x0002, 0x0904, + 0xb580, 0x9086, 0x0028, 0x1904, 0xb56c, 0xa87b, 0x001c, 0xb07b, + 0x001c, 0x0804, 0xb588, 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, 0x0fe9, 0x009e, + 0x080c, 0xc088, 0x0804, 0xb623, 0xd1dc, 0x0158, 0xa87b, 0x0015, + 0xb07b, 0x0015, 0x080c, 0xc31c, 0x0118, 0xb174, 0xc1dc, 0xb176, + 0x0078, 0xd1d4, 0x0128, 0xa87b, 0x0007, 0xb07b, 0x0007, 0x0040, + 0xa87c, 0xd0ac, 0x0128, 0xa834, 0xa938, 0x9115, 0x190c, 0xb41b, + 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, 0xc3fc, 0x001e, 0xa874, 0x0006, 0x2148, 0x080c, 0x0fe9, + 0x001e, 0x0804, 0xb61f, 0x0016, 0x00a6, 0x2150, 0xb174, 0x9184, + 0x00ff, 0x90b6, 0x0002, 0x01e0, 0x9086, 0x0028, 0x1128, 0xa87b, + 0x001c, 0xb07b, 0x001c, 0x00e0, 0xd1dc, 0x0158, 0xa87b, 0x0015, + 0xb07b, 0x0015, 0x080c, 0xc31c, 0x0118, 0xb174, 0xc1dc, 0xb176, + 0x0078, 0xd1d4, 0x0128, 0xa87b, 0x0007, 0xb07b, 0x0007, 0x0040, + 0xa87c, 0xd0ac, 0x0128, 0xa834, 0xa938, 0x9115, 0x190c, 0xb41b, + 0xa890, 0xb092, 0xa88c, 0xb08e, 0xa87c, 0xb07e, 0x00ae, 0x080c, + 0x0fe9, 0x009e, 0x080c, 0xc3fc, 0xa974, 0x0016, 0x080c, 0xb905, + 0x001e, 0x0468, 0xa867, 0x0103, 0xa974, 0x9184, 0x00ff, 0x90b6, + 0x0002, 0x01b0, 0x9086, 0x0028, 0x1118, 0xa87b, 0x001c, 0x00d0, + 0xd1dc, 0x0148, 0xa87b, 0x0015, 0x080c, 0xc31c, 0x0118, 0xa974, + 0xc1dc, 0xa976, 0x0078, 0xd1d4, 0x0118, 0xa87b, 0x0007, 0x0050, + 0xa87b, 0x0000, 0xa87c, 0xd0ac, 0x0128, 0xa834, 0xa938, 0x9115, + 0x190c, 0xb41b, 0xa974, 0x0016, 0x080c, 0x683c, 0x001e, 0xd1e4, + 0x1120, 0x080c, 0x9fea, 0x009e, 0x0005, 0x080c, 0xc04e, 0x0cd8, + 0x6114, 0x0096, 0x2148, 0xa97c, 0xd1e4, 0x190c, 0x1918, 0x009e, + 0x0005, 0x080c, 0x8a83, 0x0010, 0x080c, 0x8b3f, 0x080c, 0xbd4e, + 0x01f0, 0x0096, 0x6114, 0x2148, 0x080c, 0xbf56, 0x1118, 0x080c, + 0xa9a7, 0x00a0, 0xa867, 0x0103, 0x2009, 0x180c, 0x210c, 0xd18c, + 0x11b8, 0xd184, 0x1190, 0x6108, 0xa97a, 0x918e, 0x0029, 0x1110, + 0x080c, 0xdae1, 0xa877, 0x0000, 0x080c, 0x6a22, 0x009e, 0x080c, + 0x9fea, 0x080c, 0x8b8f, 0x0804, 0x8c6c, 0xa87b, 0x0004, 0x0c90, + 0xa87b, 0x0004, 0x0c78, 0x9182, 0x0054, 0x1220, 0x9182, 0x0040, + 0x0208, 0x000a, 0x0005, 0xb67f, 0xb67f, 0xb67f, 0xb67f, 0xb67f, + 0xb681, 0xb67f, 0xb67f, 0xb67f, 0xb67f, 0xb67f, 0xb67f, 0xb67f, + 0xb67f, 0xb67f, 0xb67f, 0xb67f, 0xb67f, 0xb67f, 0xb67f, 0x080c, + 0x0df6, 0x080c, 0x54e3, 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, 0x6a22, 0x009e, 0x0804, 0x9fea, 0x9182, 0x0085, 0x0002, + 0xb6b7, 0xb6b5, 0xb6b5, 0xb6c3, 0xb6b5, 0xb6b5, 0xb6b5, 0xb6b5, + 0xb6b5, 0xb6b5, 0xb6b5, 0xb6b5, 0xb6b5, 0x080c, 0x0df6, 0x6003, + 0x0001, 0x6106, 0x080c, 0x85f8, 0x0126, 0x2091, 0x8000, 0x080c, + 0x8b8f, 0x012e, 0x0005, 0x0026, 0x0056, 0x00d6, 0x00e6, 0x2071, + 0x0260, 0x7224, 0x6216, 0x7220, 0x080c, 0xbd3c, 0x01f8, 0x2268, + 0x6800, 0x9086, 0x0000, 0x01d0, 0x6010, 0x6d10, 0x952e, 0x11b0, + 0x00c6, 0x2d60, 0x00d6, 0x080c, 0xb976, 0x00de, 0x00ce, 0x0158, + 0x702c, 0xd084, 0x1118, 0x080c, 0xb940, 0x0010, 0x6803, 0x0002, + 0x6007, 0x0086, 0x0028, 0x080c, 0xb962, 0x0d90, 0x6007, 0x0087, + 0x6003, 0x0001, 0x080c, 0x85f8, 0x080c, 0x8b8f, 0x7220, 0x080c, + 0xbd3c, 0x0178, 0x6810, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, + 0x0140, 0x6824, 0xd0ec, 0x0128, 0x00c6, 0x2d60, 0x080c, 0xc088, + 0x00ce, 0x00ee, 0x00de, 0x005e, 0x002e, 0x0005, 0x9186, 0x0013, + 0x1160, 0x6004, 0x908a, 0x0085, 0x0a0c, 0x0df6, 0x908a, 0x0092, + 0x1a0c, 0x0df6, 0x9082, 0x0085, 0x00e2, 0x9186, 0x0027, 0x0120, + 0x9186, 0x0014, 0x190c, 0x0df6, 0x080c, 0x8a83, 0x0096, 0x6014, + 0x2048, 0x080c, 0xbd4e, 0x0140, 0xa867, 0x0103, 0xa877, 0x0000, + 0xa87b, 0x0029, 0x080c, 0x6a22, 0x009e, 0x080c, 0xa01c, 0x0804, + 0x8b8f, 0xb746, 0xb748, 0xb748, 0xb746, 0xb746, 0xb746, 0xb746, + 0xb746, 0xb746, 0xb746, 0xb746, 0xb746, 0xb746, 0x080c, 0x0df6, + 0x080c, 0x8a83, 0x080c, 0xa01c, 0x080c, 0x8b8f, 0x0005, 0x9186, + 0x0013, 0x1128, 0x6004, 0x9082, 0x0085, 0x2008, 0x04b8, 0x9186, + 0x0027, 0x11f8, 0x080c, 0x8a83, 0x080c, 0x3095, 0x080c, 0xc46e, + 0x0096, 0x6014, 0x2048, 0x080c, 0xbd4e, 0x0150, 0xa867, 0x0103, + 0xa877, 0x0000, 0xa87b, 0x0029, 0x080c, 0x6a22, 0x080c, 0xbf39, + 0x009e, 0x080c, 0x9fea, 0x080c, 0x8b8f, 0x0005, 0x080c, 0xa083, + 0x0ce0, 0x9186, 0x0014, 0x1dd0, 0x080c, 0x8a83, 0x0096, 0x6014, + 0x2048, 0x080c, 0xbd4e, 0x0d60, 0xa867, 0x0103, 0xa877, 0x0000, + 0xa87b, 0x0006, 0xa880, 0xc0ec, 0xa882, 0x08f0, 0x0002, 0xb79e, + 0xb79c, 0xb79c, 0xb79c, 0xb79c, 0xb79c, 0xb7b6, 0xb79c, 0xb79c, + 0xb79c, 0xb79c, 0xb79c, 0xb79c, 0x080c, 0x0df6, 0x080c, 0x8a83, + 0x6034, 0x908c, 0xff00, 0x810f, 0x9186, 0x0039, 0x0118, 0x9186, + 0x0035, 0x1118, 0x2001, 0x1960, 0x0010, 0x2001, 0x1961, 0x2004, + 0x601a, 0x6003, 0x000c, 0x080c, 0x8b8f, 0x0005, 0x080c, 0x8a83, + 0x6034, 0x908c, 0xff00, 0x810f, 0x9186, 0x0039, 0x0118, 0x9186, + 0x0035, 0x1118, 0x2001, 0x1960, 0x0010, 0x2001, 0x1961, 0x2004, + 0x601a, 0x6003, 0x000e, 0x080c, 0x8b8f, 0x0005, 0x9182, 0x0092, + 0x1220, 0x9182, 0x0085, 0x0208, 0x0012, 0x0804, 0xa083, 0xb7e4, + 0xb7e4, 0xb7e4, 0xb7e4, 0xb7e6, 0xb833, 0xb7e4, 0xb7e4, 0xb7e4, + 0xb7e4, 0xb7e4, 0xb7e4, 0xb7e4, 0x080c, 0x0df6, 0x0096, 0x6010, + 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x0168, 0x6034, 0x908c, + 0xff00, 0x810f, 0x9186, 0x0039, 0x0118, 0x9186, 0x0035, 0x1118, + 0x009e, 0x0804, 0xb847, 0x080c, 0xbd4e, 0x1118, 0x080c, 0xbf39, + 0x0068, 0x6014, 0x2048, 0xa87c, 0xd0e4, 0x1110, 0x080c, 0xbf39, + 0xa867, 0x0103, 0x080c, 0xc439, 0x080c, 0x6a22, 0x00d6, 0x2c68, + 0x080c, 0x9f94, 0x01d0, 0x6003, 0x0001, 0x6007, 0x001e, 0x600b, + 0xffff, 0x2009, 0x026e, 0x210c, 0x613a, 0x2009, 0x026f, 0x210c, + 0x613e, 0x6910, 0x6112, 0x080c, 0xc1ca, 0x6954, 0x6156, 0x6023, + 0x0001, 0x080c, 0x85f8, 0x080c, 0x8b8f, 0x2d60, 0x00de, 0x080c, + 0x9fea, 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, 0xc3cf, 0x11f0, 0x080c, 0x9f94, 0x01d8, 0x6106, + 0x6003, 0x0001, 0x6023, 0x0001, 0x6910, 0x6112, 0x692c, 0x612e, + 0x6930, 0x6132, 0x6934, 0x918c, 0x00ff, 0x6136, 0x6938, 0x613a, + 0x693c, 0x613e, 0x6954, 0x6156, 0x080c, 0xc1ca, 0x080c, 0x85f8, + 0x080c, 0x8b8f, 0x2d60, 0x00de, 0x0804, 0x9fea, 0x0096, 0x6014, + 0x2048, 0x080c, 0xbd4e, 0x01c8, 0xa867, 0x0103, 0xa880, 0xd0b4, + 0x0128, 0xc0ec, 0xa882, 0xa87b, 0x0006, 0x0048, 0xd0bc, 0x0118, + 0xa87b, 0x0002, 0x0020, 0xa87b, 0x0005, 0x080c, 0xc04a, 0xa877, + 0x0000, 0x080c, 0x6a22, 0x080c, 0xbf39, 0x009e, 0x0804, 0x9fea, + 0x0016, 0x0096, 0x6014, 0x2048, 0x080c, 0xbd4e, 0x0140, 0xa867, + 0x0103, 0xa87b, 0x0028, 0xa877, 0x0000, 0x080c, 0x6a22, 0x009e, + 0x001e, 0x9186, 0x0013, 0x0148, 0x9186, 0x0014, 0x0130, 0x9186, + 0x0027, 0x0118, 0x080c, 0xa083, 0x0030, 0x080c, 0x8a83, 0x080c, + 0xa01c, 0x080c, 0x8b8f, 0x0005, 0x0056, 0x0066, 0x0096, 0x00a6, + 0x2029, 0x0001, 0x9182, 0x0101, 0x1208, 0x0010, 0x2009, 0x0100, + 0x2130, 0x8304, 0x9098, 0x0018, 0x2009, 0x0020, 0x2011, 0x0029, + 0x080c, 0xb915, 0x96b2, 0x0020, 0xb004, 0x904d, 0x0110, 0x080c, + 0x0fe9, 0x080c, 0x1037, 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, 0x6a22, 0x2a48, + 0x0cb8, 0x080c, 0x6a22, 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, 0xbd4e, + 0x0150, 0x2001, 0x0006, 0xa980, 0xc1d5, 0x080c, 0x6c6b, 0x080c, + 0x6a15, 0x080c, 0xbf39, 0x009e, 0x080c, 0xa01c, 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, + 0xb9b1, 0xb9b1, 0xb9ac, 0xb9d3, 0xb99f, 0xb9ac, 0xb9d3, 0xb9ac, + 0xb9ac, 0xb99f, 0xb9ac, 0xb9ac, 0xb9ac, 0xb99f, 0xb99f, 0x080c, + 0x0df6, 0x0036, 0x2019, 0x0010, 0x080c, 0xd38f, 0x6023, 0x0006, + 0x6003, 0x0007, 0x003e, 0x0005, 0x9006, 0x0005, 0x9085, 0x0001, + 0x0005, 0x0096, 0x86ff, 0x11d8, 0x6014, 0x2048, 0x080c, 0xbd4e, + 0x01c0, 0xa864, 0x9086, 0x0139, 0x1128, 0xa87b, 0x0005, 0xa883, + 0x0000, 0x0028, 0x900e, 0x2001, 0x0005, 0x080c, 0x6c6b, 0x080c, + 0xc04a, 0x080c, 0x6a15, 0x080c, 0xa01c, 0x9085, 0x0001, 0x009e, + 0x0005, 0x9006, 0x0ce0, 0x6000, 0x908a, 0x0010, 0x1a0c, 0x0df6, + 0x0002, 0xb9e9, 0xba19, 0xb9eb, 0xba3a, 0xba14, 0xb9e9, 0xb9ac, + 0xb9b1, 0xb9b1, 0xb9ac, 0xb9ac, 0xb9ac, 0xb9ac, 0xb9ac, 0xb9ac, + 0xb9ac, 0x080c, 0x0df6, 0x86ff, 0x1520, 0x6020, 0x9086, 0x0006, + 0x0500, 0x0096, 0x6014, 0x2048, 0x080c, 0xbd4e, 0x0168, 0xa87c, + 0xd0cc, 0x0140, 0x0096, 0xc0cc, 0xa87e, 0xa878, 0x2048, 0x080c, + 0x0fe9, 0x009e, 0x080c, 0xc04a, 0x009e, 0x080c, 0xc413, 0x6007, + 0x0085, 0x6003, 0x000b, 0x6023, 0x0002, 0x080c, 0x85f8, 0x080c, + 0x8b8f, 0x9085, 0x0001, 0x0005, 0x0066, 0x080c, 0x192c, 0x006e, + 0x0890, 0x00e6, 0x2071, 0x19c2, 0x7024, 0x9c06, 0x1120, 0x080c, + 0x983b, 0x00ee, 0x0840, 0x6020, 0x9084, 0x000f, 0x9086, 0x0006, + 0x1150, 0x0086, 0x0096, 0x2049, 0x0001, 0x2c40, 0x080c, 0x995f, + 0x009e, 0x008e, 0x0010, 0x080c, 0x9738, 0x00ee, 0x1904, 0xb9eb, + 0x0804, 0xb9ac, 0x0036, 0x00e6, 0x2071, 0x19c2, 0x703c, 0x9c06, + 0x1138, 0x901e, 0x080c, 0x98b1, 0x00ee, 0x003e, 0x0804, 0xb9eb, + 0x080c, 0x9a8f, 0x00ee, 0x003e, 0x1904, 0xb9eb, 0x0804, 0xb9ac, + 0x00c6, 0x6020, 0x9084, 0x000f, 0x0013, 0x00ce, 0x0005, 0xba6d, + 0xbb1d, 0xbc87, 0xba77, 0xa01c, 0xba6d, 0xd381, 0xc47b, 0xbb1d, + 0xba66, 0xbd13, 0xba66, 0xba66, 0xba66, 0xba66, 0x080c, 0x0df6, + 0x080c, 0xbf56, 0x1110, 0x080c, 0xa9a7, 0x0005, 0x080c, 0x8a83, + 0x080c, 0x8b8f, 0x0804, 0x9fea, 0x601b, 0x0001, 0x0005, 0x080c, + 0xbd4e, 0x0130, 0x6014, 0x0096, 0x2048, 0x2c00, 0xa896, 0x009e, + 0x6000, 0x908a, 0x0010, 0x1a0c, 0x0df6, 0x0002, 0xba96, 0xba98, + 0xbabc, 0xbad0, 0xbaf6, 0xba96, 0xba6d, 0xba6d, 0xba6d, 0xbad0, + 0xbad0, 0xba96, 0xba96, 0xba96, 0xba96, 0xbada, 0x080c, 0x0df6, + 0x00e6, 0x6014, 0x0096, 0x2048, 0xa880, 0xc0b5, 0xa882, 0x009e, + 0x2071, 0x19c2, 0x7024, 0x9c06, 0x01a0, 0x080c, 0x9738, 0x080c, + 0xc413, 0x6007, 0x0085, 0x6003, 0x000b, 0x6023, 0x0002, 0x2001, + 0x1961, 0x2004, 0x601a, 0x080c, 0x85f8, 0x080c, 0x8b8f, 0x00ee, + 0x0005, 0x601b, 0x0001, 0x0cd8, 0x0096, 0x6014, 0x2048, 0xa880, + 0xc0b5, 0xa882, 0x009e, 0x080c, 0xc413, 0x6007, 0x0085, 0x6003, + 0x000b, 0x6023, 0x0002, 0x080c, 0x85f8, 0x080c, 0x8b8f, 0x0005, + 0x0096, 0x601b, 0x0001, 0x6014, 0x2048, 0xa880, 0xc0b5, 0xa882, + 0x009e, 0x0005, 0x080c, 0x54e3, 0x01b8, 0x6014, 0x0096, 0x904d, + 0x0190, 0xa864, 0xa867, 0x0103, 0xa87b, 0x0006, 0x9086, 0x0139, + 0x1150, 0xa867, 0x0139, 0xa87b, 0x0030, 0xa897, 0x4005, 0xa89b, + 0x0004, 0x080c, 0x6a22, 0x009e, 0x0804, 0x9fea, 0x6014, 0x0096, + 0x904d, 0x01f0, 0xa97c, 0xd1e4, 0x01d8, 0x2001, 0x180f, 0x2004, + 0xd0c4, 0x0110, 0x009e, 0x0005, 0xa884, 0x009e, 0x8003, 0x800b, + 0x810b, 0x9108, 0x611a, 0x00c6, 0x080c, 0x2165, 0x00ce, 0x6000, + 0x9086, 0x0004, 0x1120, 0x2009, 0x0048, 0x080c, 0xa068, 0x0005, + 0x009e, 0x080c, 0x192c, 0x0804, 0xbabc, 0x6000, 0x908a, 0x0010, + 0x1a0c, 0x0df6, 0x000b, 0x0005, 0xbb34, 0xba74, 0xbb36, 0xbb34, + 0xbb36, 0xbb36, 0xba6e, 0xbb34, 0xba68, 0xba68, 0xbb34, 0xbb34, + 0xbb34, 0xbb34, 0xbb34, 0xbb34, 0x080c, 0x0df6, 0x6010, 0x00b6, + 0x2058, 0xb804, 0x9084, 0x00ff, 0x00be, 0x908a, 0x000c, 0x1a0c, + 0x0df6, 0x00b6, 0x0013, 0x00be, 0x0005, 0xbb51, 0xbc1e, 0xbb53, + 0xbb93, 0xbb53, 0xbb93, 0xbb53, 0xbb61, 0xbb51, 0xbb93, 0xbb51, + 0xbb82, 0x080c, 0x0df6, 0x6004, 0x908e, 0x0016, 0x05c0, 0x908e, + 0x0004, 0x05a8, 0x908e, 0x0002, 0x0590, 0x908e, 0x0052, 0x0904, + 0xbc1a, 0x6004, 0x080c, 0xbf56, 0x0904, 0xbc37, 0x908e, 0x0004, + 0x1110, 0x080c, 0x30be, 0x908e, 0x0021, 0x0904, 0xbc3b, 0x908e, + 0x0022, 0x0904, 0xbc82, 0x908e, 0x003d, 0x0904, 0xbc3b, 0x908e, + 0x0039, 0x0904, 0xbc3f, 0x908e, 0x0035, 0x0904, 0xbc3f, 0x908e, + 0x001e, 0x0178, 0x908e, 0x0001, 0x1140, 0x6010, 0x2058, 0xb804, + 0x9084, 0x00ff, 0x9086, 0x0006, 0x0110, 0x080c, 0x3095, 0x080c, + 0xa9a7, 0x0804, 0xa01c, 0x00c6, 0x00d6, 0x6104, 0x9186, 0x0016, + 0x0904, 0xbc0b, 0x9186, 0x0002, 0x1904, 0xbbe0, 0x2001, 0x1836, + 0x2004, 0xd08c, 0x11c8, 0x080c, 0x717e, 0x11b0, 0x080c, 0xc459, + 0x0138, 0x080c, 0x71a1, 0x1120, 0x080c, 0x707c, 0x0804, 0xbc6b, + 0x2001, 0x1957, 0x2003, 0x0001, 0x2001, 0x1800, 0x2003, 0x0001, + 0x080c, 0x709e, 0x0804, 0xbc6b, 0x6010, 0x2058, 0x2001, 0x1836, + 0x2004, 0xd0ac, 0x1904, 0xbc6b, 0xb8a0, 0x9084, 0xff80, 0x1904, + 0xbc6b, 0xb840, 0x9084, 0x00ff, 0x9005, 0x0190, 0x8001, 0xb842, + 0x6017, 0x0000, 0x6023, 0x0007, 0x601b, 0x0398, 0x6043, 0x0000, + 0x080c, 0x9f94, 0x0128, 0x2b00, 0x6012, 0x6023, 0x0001, 0x0458, + 0x00de, 0x00ce, 0x6004, 0x908e, 0x0002, 0x11a0, 0x6010, 0x2058, + 0xb8a0, 0x9086, 0x007e, 0x1170, 0x2009, 0x1836, 0x2104, 0xc085, + 0x200a, 0x00e6, 0x2071, 0x1800, 0x080c, 0x5dc2, 0x00ee, 0x080c, + 0xa9a7, 0x0030, 0x080c, 0xa9a7, 0x080c, 0x3095, 0x080c, 0xc46e, + 0x00e6, 0x0126, 0x2091, 0x8000, 0x080c, 0x30be, 0x012e, 0x00ee, + 0x080c, 0xa01c, 0x0005, 0x2001, 0x0002, 0x080c, 0x62f4, 0x6003, + 0x0001, 0x6007, 0x0002, 0x080c, 0x8640, 0x080c, 0x8b8f, 0x00de, + 0x00ce, 0x0c80, 0x080c, 0x30be, 0x0804, 0xbb8f, 0x00c6, 0x00d6, + 0x6104, 0x9186, 0x0016, 0x0d38, 0x6010, 0x2058, 0xb840, 0x9084, + 0x00ff, 0x9005, 0x0904, 0xbbe0, 0x8001, 0xb842, 0x6003, 0x0001, + 0x080c, 0x8640, 0x080c, 0x8b8f, 0x00de, 0x00ce, 0x0898, 0x080c, + 0xa9a7, 0x0804, 0xbb91, 0x080c, 0xa9e3, 0x0804, 0xbb91, 0x00d6, + 0x2c68, 0x6104, 0x080c, 0xc3cf, 0x00de, 0x0118, 0x080c, 0x9fea, + 0x0408, 0x6004, 0x8007, 0x6134, 0x918c, 0x00ff, 0x9105, 0x6036, + 0x6007, 0x0085, 0x6003, 0x000b, 0x6023, 0x0002, 0x603c, 0x600a, + 0x2001, 0x1961, 0x2004, 0x601a, 0x602c, 0x2c08, 0x2060, 0x6024, + 0xd0b4, 0x0108, 0xc085, 0xc0b5, 0x6026, 0x2160, 0x080c, 0x85f8, + 0x080c, 0x8b8f, 0x0005, 0x00de, 0x00ce, 0x080c, 0xa9a7, 0x080c, + 0x3095, 0x00e6, 0x0126, 0x2091, 0x8000, 0x080c, 0x30be, 0x6017, + 0x0000, 0x6023, 0x0007, 0x601b, 0x0398, 0x6043, 0x0000, 0x012e, + 0x00ee, 0x0005, 0x080c, 0xa41e, 0x1904, 0xbc37, 0x0005, 0x6000, + 0x908a, 0x0010, 0x1a0c, 0x0df6, 0x0096, 0x00d6, 0x001b, 0x00de, + 0x009e, 0x0005, 0xbca2, 0xbca2, 0xbca2, 0xbca2, 0xbca2, 0xbca2, + 0xbca2, 0xbca2, 0xbca2, 0xba6d, 0xbca2, 0xba74, 0xbca4, 0xba74, + 0xbcbe, 0xbca2, 0x080c, 0x0df6, 0x6004, 0x9086, 0x008b, 0x01b0, + 0x6034, 0x908c, 0xff00, 0x810f, 0x9186, 0x0035, 0x1130, 0x602c, + 0x9080, 0x0009, 0x200c, 0xc185, 0x2102, 0x6007, 0x008b, 0x6003, + 0x000d, 0x080c, 0x85f8, 0x080c, 0x8b8f, 0x0005, 0x080c, 0xc44d, + 0x0118, 0x080c, 0xc460, 0x0010, 0x080c, 0xc46e, 0x080c, 0xbf39, + 0x080c, 0xbd4e, 0x0570, 0x080c, 0x3095, 0x080c, 0xbd4e, 0x0168, + 0x6014, 0x2048, 0xa867, 0x0103, 0xa87b, 0x0006, 0xa877, 0x0000, + 0xa880, 0xc0ed, 0xa882, 0x080c, 0x6a22, 0x2c68, 0x080c, 0x9f94, + 0x0150, 0x6810, 0x6012, 0x080c, 0xc1ca, 0x00c6, 0x2d60, 0x080c, + 0xa01c, 0x00ce, 0x0008, 0x2d60, 0x6017, 0x0000, 0x6023, 0x0001, + 0x6007, 0x0001, 0x6003, 0x0001, 0x080c, 0x8640, 0x080c, 0x8b8f, + 0x00c8, 0x080c, 0xc44d, 0x0138, 0x6034, 0x9086, 0x4000, 0x1118, + 0x080c, 0x3095, 0x08d0, 0x6034, 0x908c, 0xff00, 0x810f, 0x9186, + 0x0039, 0x0118, 0x9186, 0x0035, 0x1118, 0x080c, 0x3095, 0x0868, + 0x080c, 0xa01c, 0x0005, 0x6000, 0x908a, 0x0010, 0x1a0c, 0x0df6, + 0x0002, 0xbd29, 0xbd29, 0xbd2d, 0xbd2b, 0xbd37, 0xbd29, 0xbd29, + 0xa01c, 0xbd29, 0xbd29, 0xbd29, 0xbd29, 0xbd29, 0xbd29, 0xbd29, + 0xbd29, 0x080c, 0x0df6, 0x080c, 0x9a8f, 0x6114, 0x0096, 0x2148, + 0xa87b, 0x0006, 0x080c, 0x6a22, 0x009e, 0x0804, 0x9fea, 0x601c, + 0xd084, 0x190c, 0x192c, 0x0c88, 0x9284, 0x0007, 0x1158, 0x9282, + 0x1cd0, 0x0240, 0x2001, 0x1819, 0x2004, 0x9202, 0x1218, 0x9085, + 0x0001, 0x0005, 0x9006, 0x0ce8, 0x0096, 0x0028, 0x0096, 0x0006, + 0x6014, 0x2048, 0x000e, 0x0006, 0x9984, 0xf000, 0x9086, 0xf000, + 0x0110, 0x080c, 0x10e2, 0x000e, 0x009e, 0x0005, 0x00e6, 0x00c6, + 0x0036, 0x0006, 0x0126, 0x2091, 0x8000, 0x2061, 0x1cd0, 0x2071, + 0x1800, 0x7350, 0x7070, 0x9302, 0x1640, 0x6020, 0x9206, 0x11f8, + 0x080c, 0xc459, 0x0180, 0x9286, 0x0001, 0x1168, 0x6004, 0x9086, + 0x0004, 0x1148, 0x080c, 0x3095, 0x080c, 0xc46e, 0x00c6, 0x080c, + 0xa01c, 0x00ce, 0x0060, 0x080c, 0xc144, 0x0148, 0x080c, 0xbf56, + 0x1110, 0x080c, 0xa9a7, 0x00c6, 0x080c, 0x9fea, 0x00ce, 0x9ce0, + 0x0018, 0x7064, 0x9c02, 0x1208, 0x08a0, 0x012e, 0x000e, 0x003e, + 0x00ce, 0x00ee, 0x0005, 0x00e6, 0x00c6, 0x0016, 0x9188, 0x1000, + 0x210c, 0x81ff, 0x0128, 0x2061, 0x1a88, 0x6112, 0x080c, 0x3095, + 0x9006, 0x0010, 0x9085, 0x0001, 0x001e, 0x00ce, 0x00ee, 0x0005, + 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, 0x9f94, 0x01b0, 0x6656, + 0x2b00, 0x6012, 0x080c, 0x54e3, 0x0118, 0x080c, 0xbe7d, 0x0168, + 0x080c, 0xc1ca, 0x6023, 0x0003, 0x2009, 0x004b, 0x080c, 0xa068, + 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x00c6, + 0x0126, 0x2091, 0x8000, 0xbaa0, 0x080c, 0xa03b, 0x0560, 0x6057, + 0x0000, 0x2b00, 0x6012, 0x080c, 0xc1ca, 0x6023, 0x0003, 0x0016, + 0x080c, 0x8782, 0x0076, 0x903e, 0x080c, 0x8670, 0x2c08, 0x080c, + 0xd556, 0x007e, 0x001e, 0xd184, 0x0128, 0x080c, 0x9fea, 0x9085, + 0x0001, 0x0070, 0x080c, 0x54e3, 0x0128, 0xd18c, 0x1170, 0x080c, + 0xbe7d, 0x0148, 0x2009, 0x004c, 0x080c, 0xa068, 0x9085, 0x0001, + 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x2900, 0x6016, 0x0c90, + 0x2009, 0x004d, 0x0010, 0x2009, 0x004e, 0x00f6, 0x00c6, 0x0046, + 0x0016, 0x080c, 0x9f94, 0x2c78, 0x05a0, 0x7e56, 0x2b00, 0x7812, + 0x7823, 0x0003, 0x0016, 0x2021, 0x0005, 0x080c, 0xbe8f, 0x001e, + 0x9186, 0x004d, 0x0118, 0x9186, 0x004e, 0x0148, 0x2001, 0x195a, + 0x200c, 0xd1fc, 0x0168, 0x2f60, 0x080c, 0x9fea, 0x00d0, 0x2001, + 0x1959, 0x200c, 0xd1fc, 0x0120, 0x2f60, 0x080c, 0x9fea, 0x0088, + 0x2f60, 0x080c, 0x54e3, 0x0138, 0xd18c, 0x1118, 0x04f1, 0x0148, + 0x0010, 0x2900, 0x7816, 0x001e, 0x0016, 0x080c, 0xa068, 0x9085, + 0x0001, 0x001e, 0x004e, 0x00ce, 0x00fe, 0x0005, 0x00f6, 0x00c6, + 0x0046, 0x080c, 0x9f94, 0x2c78, 0x0508, 0x7e56, 0x2b00, 0x7812, + 0x7823, 0x0003, 0x0096, 0x2021, 0x0004, 0x0489, 0x009e, 0x2001, + 0x1958, 0x200c, 0xd1fc, 0x0120, 0x2f60, 0x080c, 0x9fea, 0x0060, + 0x2f60, 0x080c, 0x54e3, 0x0120, 0xd18c, 0x1160, 0x0071, 0x0130, + 0x2009, 0x0052, 0x080c, 0xa068, 0x9085, 0x0001, 0x004e, 0x00ce, + 0x00fe, 0x0005, 0x2900, 0x7816, 0x0c98, 0x00c6, 0x080c, 0x49b7, + 0x00ce, 0x1120, 0x080c, 0x9fea, 0x9006, 0x0005, 0xa867, 0x0000, + 0xa86b, 0x8000, 0x2900, 0x6016, 0x9085, 0x0001, 0x0005, 0x0096, + 0x0076, 0x0126, 0x2091, 0x8000, 0x080c, 0x64d7, 0x0158, 0x2001, + 0xbe94, 0x0006, 0x900e, 0x2400, 0x080c, 0x6c6b, 0x080c, 0x6a22, + 0x000e, 0x0807, 0x2418, 0x080c, 0x8a1d, 0xbaa0, 0x0086, 0x2041, + 0x0001, 0x2039, 0x0001, 0x2608, 0x080c, 0x879a, 0x008e, 0x080c, + 0x8670, 0x2f08, 0x2648, 0x080c, 0xd556, 0xb93c, 0x81ff, 0x090c, + 0x886d, 0x080c, 0x8b8f, 0x012e, 0x007e, 0x009e, 0x0005, 0x00c6, + 0x0126, 0x2091, 0x8000, 0x080c, 0x9f94, 0x0190, 0x660a, 0x2b08, + 0x6112, 0x080c, 0xc1ca, 0x6023, 0x0001, 0x2900, 0x6016, 0x2009, + 0x001f, 0x080c, 0xa068, 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005, + 0x9006, 0x0cd8, 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, 0xa03b, + 0x01b8, 0x660a, 0x2b08, 0x6112, 0x080c, 0xc1ca, 0x6023, 0x0008, + 0x2900, 0x6016, 0x00f6, 0x2c78, 0x080c, 0x1651, 0x00fe, 0x2009, + 0x0021, 0x080c, 0xa068, 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005, + 0x9006, 0x0cd8, 0x2009, 0x003d, 0x00c6, 0x0126, 0x0016, 0x2091, + 0x8000, 0x080c, 0x9f94, 0x0198, 0x660a, 0x2b08, 0x6112, 0x080c, + 0xc1ca, 0x6023, 0x0001, 0x2900, 0x6016, 0x001e, 0x0016, 0x080c, + 0xa068, 0x9085, 0x0001, 0x001e, 0x012e, 0x00ce, 0x0005, 0x9006, + 0x0cd0, 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, 0xa03b, 0x0188, + 0x2b08, 0x6112, 0x080c, 0xc1ca, 0x6023, 0x0001, 0x2900, 0x6016, + 0x2009, 0x0000, 0x080c, 0xa068, 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, + 0xbd4e, 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, 0xa03b, 0x0198, 0x2b08, + 0x6112, 0x080c, 0xc1ca, 0x6023, 0x0001, 0x2900, 0x6016, 0x080c, + 0x3095, 0x2009, 0x0028, 0x080c, 0xa068, 0x9085, 0x0001, 0x012e, + 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x9186, 0x0015, 0x11a8, 0x2011, + 0x1823, 0x2204, 0x9086, 0x0074, 0x1178, 0x00b6, 0x080c, 0xac41, + 0x00be, 0x080c, 0xae8d, 0x6003, 0x0001, 0x6007, 0x0029, 0x080c, + 0x8640, 0x080c, 0x8b8f, 0x0078, 0x6014, 0x0096, 0x2048, 0xa868, + 0x009e, 0xd0fc, 0x0148, 0x2001, 0x0001, 0x080c, 0xc390, 0x080c, + 0xa9a7, 0x080c, 0x9fea, 0x0005, 0x0096, 0x6014, 0x904d, 0x090c, + 0x0df6, 0xa87b, 0x0030, 0xa883, 0x0000, 0xa897, 0x4005, 0xa89b, + 0x0004, 0xa867, 0x0139, 0x0126, 0x2091, 0x8000, 0x080c, 0x6a22, + 0x012e, 0x009e, 0x080c, 0x9fea, 0x0c30, 0x0096, 0x9186, 0x0016, + 0x1128, 0x2001, 0x0004, 0x080c, 0x62f4, 0x00e8, 0x9186, 0x0015, + 0x1510, 0x2011, 0x1823, 0x2204, 0x9086, 0x0014, 0x11e0, 0x6010, + 0x00b6, 0x2058, 0x080c, 0x643e, 0x00be, 0x080c, 0xaf63, 0x1198, + 0x6010, 0x00b6, 0x2058, 0xb890, 0x00be, 0x9005, 0x0160, 0x2001, + 0x0006, 0x080c, 0x62f4, 0x6014, 0x2048, 0xa868, 0xd0fc, 0x0170, + 0x080c, 0xa3f2, 0x0048, 0x6014, 0x2048, 0xa868, 0xd0fc, 0x0528, + 0x080c, 0xa9a7, 0x080c, 0x9fea, 0x009e, 0x0005, 0x6014, 0x6310, + 0x2358, 0x904d, 0x090c, 0x0df6, 0xa87b, 0x0000, 0xa883, 0x0000, + 0xa897, 0x4000, 0x900e, 0x080c, 0x65c3, 0x1108, 0xc185, 0xb800, + 0xd0bc, 0x0108, 0xc18d, 0xa99a, 0x0126, 0x2091, 0x8000, 0x080c, + 0x6a22, 0x012e, 0x080c, 0x9fea, 0x08f8, 0x6014, 0x904d, 0x090c, + 0x0df6, 0xa87b, 0x0030, 0xa883, 0x0000, 0xa897, 0x4005, 0xa89b, + 0x0004, 0xa867, 0x0139, 0x0126, 0x2091, 0x8000, 0x080c, 0x6a22, + 0x012e, 0x080c, 0x9fea, 0x0840, 0xa878, 0x9086, 0x0005, 0x1108, + 0x0009, 0x0005, 0xa880, 0xc0ad, 0xa882, 0x0005, 0x6043, 0x0000, + 0x6017, 0x0000, 0x6003, 0x0001, 0x6007, 0x0050, 0x080c, 0x85f8, + 0x080c, 0x8b8f, 0x0005, 0x00c6, 0x6010, 0x00b6, 0x2058, 0xb800, + 0x00be, 0xd0bc, 0x0120, 0x6020, 0x9084, 0x000f, 0x0013, 0x00ce, + 0x0005, 0xba6d, 0xc07a, 0xc07a, 0xc07d, 0xd886, 0xd8a1, 0xd8a4, + 0xba6d, 0xba6d, 0xba6d, 0xba6d, 0xba6d, 0xba6d, 0xba6d, 0xba6d, + 0x080c, 0x0df6, 0xa001, 0xa001, 0x0005, 0x0096, 0x6014, 0x904d, + 0x0118, 0xa87c, 0xd0e4, 0x1110, 0x009e, 0x0010, 0x009e, 0x0005, + 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x0550, 0x2001, + 0x1833, 0x2004, 0x9005, 0x1540, 0x00f6, 0x2c78, 0x080c, 0x9f94, + 0x0508, 0x7810, 0x6012, 0x080c, 0xc1ca, 0x7820, 0x9086, 0x0003, + 0x0128, 0x7808, 0x603a, 0x2f00, 0x603e, 0x0020, 0x7808, 0x603e, + 0x2f00, 0x603a, 0x602e, 0x6023, 0x0001, 0x6007, 0x0035, 0x6003, + 0x0001, 0x7954, 0x6156, 0x080c, 0x85f8, 0x080c, 0x8b8f, 0x2f60, + 0x00fe, 0x0005, 0x2f60, 0x00fe, 0x2001, 0x1962, 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, 0x0fe9, + 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, 0x85f8, + 0x080c, 0x8b8f, 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, 0x195c, 0x200c, 0x8000, 0x2014, 0x2001, 0x0032, + 0x080c, 0x847e, 0x2001, 0x1960, 0x82ff, 0x1110, 0x2011, 0x0014, + 0x2202, 0x2001, 0x195e, 0x200c, 0x8000, 0x2014, 0x2071, 0x1946, + 0x711a, 0x721e, 0x2001, 0x0064, 0x080c, 0x847e, 0x2001, 0x1961, + 0x82ff, 0x1110, 0x2011, 0x0014, 0x2202, 0x2001, 0x1962, 0x9288, + 0x000a, 0x2102, 0x2001, 0x1a69, 0x2102, 0x2001, 0x0032, 0x080c, + 0x1580, 0x080c, 0x66aa, 0x00ee, 0x003e, 0x002e, 0x001e, 0x000e, + 0x0005, 0x0006, 0x0016, 0x00e6, 0x2001, 0x1960, 0x2003, 0x0028, + 0x2001, 0x1961, 0x2003, 0x0014, 0x2071, 0x1946, 0x701b, 0x0000, + 0x701f, 0x07d0, 0x2001, 0x1962, 0x2009, 0x001e, 0x2102, 0x2001, + 0x1a69, 0x2102, 0x2001, 0x0032, 0x080c, 0x1580, 0x00ee, 0x001e, + 0x000e, 0x0005, 0x0096, 0x6058, 0x904d, 0x0110, 0x080c, 0x1069, + 0x009e, 0x0005, 0x0005, 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, + 0x9f94, 0x0180, 0x2b08, 0x6112, 0x0ca9, 0x6023, 0x0001, 0x2900, + 0x6016, 0x2009, 0x0033, 0x080c, 0xa068, 0x9085, 0x0001, 0x012e, + 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x0096, 0x00e6, 0x00f6, 0x2071, + 0x1800, 0x9186, 0x0015, 0x1520, 0x708c, 0x9086, 0x0018, 0x0120, + 0x708c, 0x9086, 0x0014, 0x11e0, 0x6014, 0x2048, 0xaa3c, 0xd2e4, + 0x1160, 0x2c78, 0x080c, 0x8d93, 0x01d8, 0x7078, 0xaa50, 0x9206, + 0x1160, 0x707c, 0xaa54, 0x9206, 0x1140, 0x6210, 0x00b6, 0x2258, + 0xbaa0, 0x00be, 0x900e, 0x080c, 0x30de, 0x080c, 0xa3f2, 0x0020, + 0x080c, 0xa9a7, 0x080c, 0x9fea, 0x00fe, 0x00ee, 0x009e, 0x0005, + 0x705c, 0xaa54, 0x9206, 0x0d48, 0x0c80, 0x00c6, 0x0126, 0x2091, + 0x8000, 0x080c, 0x9f94, 0x0188, 0x2b08, 0x6112, 0x080c, 0xc1ca, + 0x6023, 0x0001, 0x2900, 0x6016, 0x2009, 0x004d, 0x080c, 0xa068, + 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x00c6, + 0x0126, 0x2091, 0x8000, 0x0016, 0x080c, 0x9f94, 0x0180, 0x2b08, + 0x6112, 0x080c, 0xc1ca, 0x6023, 0x0001, 0x2900, 0x6016, 0x001e, + 0x080c, 0xa068, 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005, 0x001e, + 0x9006, 0x0cd0, 0x0016, 0x0026, 0x0036, 0x0046, 0x0056, 0x0066, + 0x0096, 0x00e6, 0x00f6, 0x2071, 0x1800, 0x9186, 0x0015, 0x1568, + 0x718c, 0x6014, 0x2048, 0xa814, 0x8003, 0x9106, 0x1530, 0x20e1, + 0x0000, 0x2001, 0x197b, 0x2003, 0x0000, 0x6014, 0x2048, 0xa830, + 0x20a8, 0x8906, 0x8006, 0x8007, 0x9094, 0x003f, 0x22e8, 0x9084, + 0xffc0, 0x9080, 0x001b, 0x20a0, 0x2001, 0x197b, 0x0016, 0x200c, + 0x080c, 0xca75, 0x001e, 0xa804, 0x9005, 0x0110, 0x2048, 0x0c38, + 0x6014, 0x2048, 0xa867, 0x0103, 0x0010, 0x080c, 0xa9a7, 0x080c, + 0x9fea, 0x00fe, 0x00ee, 0x009e, 0x006e, 0x005e, 0x004e, 0x003e, + 0x002e, 0x001e, 0x0005, 0x0096, 0x00e6, 0x00f6, 0x2071, 0x1800, + 0x9186, 0x0015, 0x11b8, 0x708c, 0x9086, 0x0004, 0x1198, 0x6014, + 0x2048, 0x2c78, 0x080c, 0x8d93, 0x01a8, 0x7078, 0xaa74, 0x9206, + 0x1130, 0x707c, 0xaa78, 0x9206, 0x1110, 0x080c, 0x3095, 0x080c, + 0xa3f2, 0x0020, 0x080c, 0xa9a7, 0x080c, 0x9fea, 0x00fe, 0x00ee, + 0x009e, 0x0005, 0x705c, 0xaa78, 0x9206, 0x0d78, 0x0c80, 0x0096, + 0x00e6, 0x00f6, 0x2071, 0x1800, 0x9186, 0x0015, 0x1550, 0x708c, + 0x9086, 0x0004, 0x1530, 0x6014, 0x2048, 0x2c78, 0x080c, 0x8d93, + 0x05f0, 0x7078, 0xaacc, 0x9206, 0x1180, 0x707c, 0xaad0, 0x9206, + 0x1160, 0x080c, 0x3095, 0x0016, 0xa998, 0xaab0, 0x9284, 0x1000, + 0xc0fd, 0x080c, 0x548a, 0x001e, 0x0010, 0x080c, 0x5275, 0x080c, + 0xbd4e, 0x0508, 0xa87b, 0x0000, 0xa883, 0x0000, 0xa897, 0x4000, + 0x0080, 0x080c, 0xbd4e, 0x01b8, 0x6014, 0x2048, 0x080c, 0x5275, + 0x1d70, 0xa87b, 0x0030, 0xa883, 0x0000, 0xa897, 0x4005, 0xa89b, + 0x0004, 0x0126, 0x2091, 0x8000, 0xa867, 0x0139, 0x080c, 0x6a22, + 0x012e, 0x080c, 0x9fea, 0x00fe, 0x00ee, 0x009e, 0x0005, 0x705c, + 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, 0xbd4e, + 0x0904, 0xc38c, 0x0096, 0x6314, 0x2348, 0xa87a, 0xa982, 0x929e, + 0x4000, 0x1580, 0x6310, 0x00c6, 0x2358, 0x2009, 0x0000, 0xa868, + 0xd0f4, 0x1140, 0x080c, 0x65c3, 0x1108, 0xc185, 0xb800, 0xd0bc, + 0x0108, 0xc18d, 0xaa96, 0xa99a, 0x20a9, 0x0004, 0xa860, 0x20e8, + 0xa85c, 0x9080, 0x0031, 0x20a0, 0xb8b4, 0x20e0, 0xb8b8, 0x9080, + 0x0006, 0x2098, 0x080c, 0x0fb4, 0x20a9, 0x0004, 0xa85c, 0x9080, + 0x0035, 0x20a0, 0xb8b8, 0x9080, 0x000a, 0x2098, 0x080c, 0x0fb4, + 0x00ce, 0x0090, 0xaa96, 0x3918, 0x9398, 0x0007, 0x231c, 0x6004, + 0x9086, 0x0016, 0x0110, 0xa89b, 0x0004, 0xaba2, 0x6310, 0x2358, + 0xb804, 0x9084, 0x00ff, 0xa89e, 0xa868, 0xc0f4, 0xa86a, 0x080c, + 0x6a15, 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, 0x266d, 0x2118, 0x831f, 0x939c, + 0xff00, 0x7838, 0x9084, 0x00ff, 0x931d, 0x7c3c, 0x2011, 0x8018, + 0x080c, 0x4a17, 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, 0xbd3c, 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, 0xb41b, 0x0005, 0x0036, 0x2019, 0x0001, 0x0010, 0x0036, + 0x901e, 0x0499, 0x01e0, 0x080c, 0xbd4e, 0x01c8, 0x080c, 0xbf39, 0x6037, 0x4000, 0x6014, 0x6017, 0x0000, 0x0096, 0x2048, 0xa87c, - 0x080c, 0xc03f, 0x1118, 0x080c, 0xaa81, 0x0040, 0xa867, 0x0103, - 0xa877, 0x0000, 0x83ff, 0x1129, 0x080c, 0x6ae9, 0x009e, 0x003e, + 0x080c, 0xbf56, 0x1118, 0x080c, 0xa9a7, 0x0040, 0xa867, 0x0103, + 0xa877, 0x0000, 0x83ff, 0x1129, 0x080c, 0x6a22, 0x009e, 0x003e, 0x0005, 0xa880, 0xd0b4, 0x0128, 0xa87b, 0x0006, 0xc0ec, 0xa882, 0x0048, 0xd0bc, 0x0118, 0xa87b, 0x0002, 0x0020, 0xa87b, 0x0005, - 0x080c, 0xc133, 0xa877, 0x0000, 0x0005, 0x2001, 0x1810, 0x2004, + 0x080c, 0xc04a, 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, 0x4cbc, 0x004e, 0x003e, 0x0005, 0x0c51, 0x1d81, - 0x0005, 0x2001, 0x195e, 0x2004, 0x601a, 0x0005, 0x2001, 0x1960, - 0x2004, 0x6042, 0x0005, 0x080c, 0xa0e3, 0x0804, 0x8c10, 0x00b6, - 0x0066, 0x6000, 0x90b2, 0x0016, 0x1a0c, 0x0dfa, 0x001b, 0x006e, - 0x00be, 0x0005, 0xc57a, 0xcc7a, 0xcdd5, 0xc57a, 0xc57a, 0xc57a, - 0xc57a, 0xc57a, 0xc5b1, 0xce59, 0xc57a, 0xc57a, 0xc57a, 0xc57a, - 0xc57a, 0xc57a, 0x080c, 0x0dfa, 0x0066, 0x6000, 0x90b2, 0x0016, - 0x1a0c, 0x0dfa, 0x0013, 0x006e, 0x0005, 0xc595, 0xd3cb, 0xc595, - 0xc595, 0xc595, 0xc595, 0xc595, 0xc595, 0xd378, 0xd41f, 0xc595, - 0xda0f, 0xda45, 0xda0f, 0xda45, 0xc595, 0x080c, 0x0dfa, 0x6000, - 0x9082, 0x0016, 0x1a0c, 0x0dfa, 0x6000, 0x000a, 0x0005, 0xc5af, - 0xd037, 0xd129, 0xd14c, 0xd20c, 0xc5af, 0xd2eb, 0xd294, 0xce65, - 0xd34e, 0xd363, 0xc5af, 0xc5af, 0xc5af, 0xc5af, 0xc5af, 0x080c, - 0x0dfa, 0x91b2, 0x0053, 0x1a0c, 0x0dfa, 0x2100, 0x91b2, 0x0040, - 0x1a04, 0xca1b, 0x0002, 0xc5fb, 0xc7e9, 0xc5fb, 0xc5fb, 0xc5fb, - 0xc7f2, 0xc5fb, 0xc5fb, 0xc5fb, 0xc5fb, 0xc5fb, 0xc5fb, 0xc5fb, - 0xc5fb, 0xc5fb, 0xc5fb, 0xc5fb, 0xc5fb, 0xc5fb, 0xc5fb, 0xc5fb, - 0xc5fb, 0xc5fb, 0xc5fd, 0xc660, 0xc66f, 0xc6d3, 0xc6fe, 0xc776, - 0xc7d4, 0xc5fb, 0xc5fb, 0xc7f5, 0xc5fb, 0xc5fb, 0xc80a, 0xc817, - 0xc5fb, 0xc5fb, 0xc5fb, 0xc5fb, 0xc5fb, 0xc8bd, 0xc5fb, 0xc5fb, - 0xc8d1, 0xc5fb, 0xc5fb, 0xc88c, 0xc5fb, 0xc5fb, 0xc5fb, 0xc8e9, - 0xc5fb, 0xc5fb, 0xc5fb, 0xc966, 0xc5fb, 0xc5fb, 0xc5fb, 0xc5fb, - 0xc5fb, 0xc5fb, 0xc9e3, 0x080c, 0x0dfa, 0x080c, 0x6781, 0x1150, - 0x2001, 0x1836, 0x2004, 0xd0cc, 0x1128, 0x9084, 0x0009, 0x9086, - 0x0008, 0x1140, 0x6007, 0x0009, 0x602f, 0x0009, 0x6017, 0x0000, - 0x0804, 0xc7e2, 0x080c, 0x676a, 0x00e6, 0x00c6, 0x0036, 0x0026, - 0x0016, 0x6210, 0x2258, 0xbaa0, 0x0026, 0x2019, 0x0029, 0x080c, - 0x8803, 0x0076, 0x903e, 0x080c, 0x86f1, 0x2c08, 0x080c, 0xd5f6, - 0x007e, 0x001e, 0x001e, 0x002e, 0x003e, 0x00ce, 0x00ee, 0x6610, - 0x2658, 0x080c, 0x64ae, 0xbe04, 0x9684, 0x00ff, 0x9082, 0x0006, - 0x1268, 0x0016, 0x0026, 0x6210, 0x00b6, 0x2258, 0xbaa0, 0x00be, - 0x2c08, 0x080c, 0xdbbd, 0x002e, 0x001e, 0x1178, 0x080c, 0xd529, - 0x1904, 0xc6cb, 0x080c, 0xd4c5, 0x1120, 0x6007, 0x0008, 0x0804, - 0xc7e2, 0x6007, 0x0009, 0x0804, 0xc7e2, 0x080c, 0xd720, 0x0128, - 0x080c, 0xd529, 0x0d78, 0x0804, 0xc6cb, 0x6017, 0x1900, 0x0c88, - 0x080c, 0x32ae, 0x1904, 0xca18, 0x6106, 0x080c, 0xd47a, 0x6007, - 0x0006, 0x0804, 0xc7e2, 0x6007, 0x0007, 0x0804, 0xc7e2, 0x080c, - 0xda81, 0x1904, 0xca18, 0x080c, 0x32ae, 0x1904, 0xca18, 0x00d6, - 0x6610, 0x2658, 0xbe04, 0x9684, 0x00ff, 0x9082, 0x0006, 0x1220, - 0x2001, 0x0001, 0x080c, 0x63dc, 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, 0xd58c, 0x1190, 0x9686, 0x0006, 0x1140, 0x0026, - 0x6210, 0x2258, 0xbaa0, 0x900e, 0x080c, 0x31d4, 0x002e, 0x080c, - 0x653a, 0x6007, 0x000a, 0x00de, 0x0804, 0xc7e2, 0x6007, 0x000b, - 0x00de, 0x0804, 0xc7e2, 0x080c, 0x318b, 0x080c, 0xc54e, 0x6007, - 0x0001, 0x0804, 0xc7e2, 0x080c, 0xda81, 0x1904, 0xca18, 0x080c, - 0x32ae, 0x1904, 0xca18, 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, 0x31d4, 0x002e, 0x6007, 0x000c, - 0x2001, 0x0001, 0x080c, 0xdb9d, 0x0804, 0xc7e2, 0x080c, 0x6781, - 0x1140, 0x2001, 0x1836, 0x2004, 0x9084, 0x0009, 0x9086, 0x0008, - 0x1110, 0x0804, 0xc60a, 0x080c, 0x676a, 0x6610, 0x2658, 0xbe04, - 0x9684, 0x00ff, 0x9082, 0x0006, 0x06c0, 0x1138, 0x0026, 0x2001, - 0x0006, 0x080c, 0x641c, 0x002e, 0x0050, 0x96b4, 0xff00, 0x8637, - 0x9686, 0x0004, 0x0120, 0x9686, 0x0006, 0x1904, 0xc6cb, 0x080c, - 0xd599, 0x1120, 0x6007, 0x000e, 0x0804, 0xc7e2, 0x0046, 0x6410, - 0x2458, 0xbca0, 0x0046, 0x080c, 0x318b, 0x080c, 0xc54e, 0x004e, - 0x0016, 0x9006, 0x2009, 0x185c, 0x210c, 0x0048, 0x2009, 0x0029, - 0x080c, 0xd885, 0x6010, 0x2058, 0xb800, 0xc0e5, 0xb802, 0x001e, - 0x004e, 0x6007, 0x0001, 0x0804, 0xc7e2, 0x2001, 0x0001, 0x080c, - 0x63dc, 0x0156, 0x0016, 0x0026, 0x0036, 0x20a9, 0x0004, 0x2019, - 0x1805, 0x2011, 0x0270, 0x080c, 0xb0bc, 0x003e, 0x002e, 0x001e, - 0x015e, 0x9005, 0x0168, 0x96b4, 0xff00, 0x8637, 0x9682, 0x0004, - 0x0a04, 0xc6cb, 0x9682, 0x0007, 0x0a04, 0xc727, 0x0804, 0xc6cb, - 0x6017, 0x1900, 0x6007, 0x0009, 0x0804, 0xc7e2, 0x080c, 0x6781, - 0x1140, 0x2001, 0x1836, 0x2004, 0x9084, 0x0009, 0x9086, 0x0008, - 0x1110, 0x0804, 0xc60a, 0x080c, 0x676a, 0x6610, 0x2658, 0xbe04, - 0x9684, 0x00ff, 0x0006, 0x9086, 0x0001, 0x000e, 0x0170, 0x9082, - 0x0006, 0x0690, 0x0150, 0x96b4, 0xff00, 0x8637, 0x9686, 0x0004, - 0x0120, 0x9686, 0x0006, 0x1904, 0xc6cb, 0x080c, 0xd5c7, 0x1130, - 0x080c, 0xd4c5, 0x1118, 0x6007, 0x0010, 0x04e0, 0x0046, 0x6410, - 0x2458, 0xbca0, 0x0046, 0x080c, 0x318b, 0x080c, 0xc54e, 0x004e, - 0x0016, 0x9006, 0x2009, 0x185c, 0x210c, 0x0048, 0x2009, 0x0029, - 0x080c, 0xd885, 0x6010, 0x2058, 0xb800, 0xc0e5, 0xb802, 0x001e, - 0x004e, 0x6007, 0x0001, 0x00f0, 0x080c, 0xd720, 0x0140, 0x96b4, - 0xff00, 0x8637, 0x9686, 0x0006, 0x0980, 0x0804, 0xc6cb, 0x6017, - 0x1900, 0x6007, 0x0009, 0x0070, 0x080c, 0x32ae, 0x1904, 0xca18, - 0x080c, 0xda81, 0x1904, 0xca18, 0x080c, 0xcbb8, 0x1904, 0xc6cb, - 0x6007, 0x0012, 0x6003, 0x0001, 0x080c, 0x86c1, 0x080c, 0x8c10, - 0x0005, 0x6007, 0x0001, 0x6003, 0x0001, 0x080c, 0x86c1, 0x080c, - 0x8c10, 0x0cb0, 0x6007, 0x0005, 0x0c68, 0x080c, 0xda81, 0x1904, - 0xca18, 0x080c, 0x32ae, 0x1904, 0xca18, 0x080c, 0xcbb8, 0x1904, - 0xc6cb, 0x6007, 0x0020, 0x6003, 0x0001, 0x080c, 0x86c1, 0x080c, - 0x8c10, 0x0005, 0x080c, 0x32ae, 0x1904, 0xca18, 0x6007, 0x0023, - 0x6003, 0x0001, 0x080c, 0x86c1, 0x080c, 0x8c10, 0x0005, 0x080c, - 0xda81, 0x1904, 0xca18, 0x080c, 0x32ae, 0x1904, 0xca18, 0x080c, - 0xcbb8, 0x1904, 0xc6cb, 0x0016, 0x0026, 0x00e6, 0x2071, 0x0260, - 0x2c08, 0x2011, 0x181f, 0x2214, 0x703c, 0x9206, 0x11e0, 0x2011, - 0x181e, 0x2214, 0x7038, 0x9084, 0x00ff, 0x9206, 0x11a0, 0x7240, - 0x080c, 0xbe25, 0x0570, 0x2260, 0x6008, 0x9086, 0xffff, 0x0120, - 0x7244, 0x6008, 0x9206, 0x1528, 0x6020, 0x9086, 0x0007, 0x1508, - 0x080c, 0xa0e3, 0x04a0, 0x7244, 0x9286, 0xffff, 0x0180, 0x2c08, - 0x080c, 0xbe25, 0x01b0, 0x2260, 0x7240, 0x6008, 0x9206, 0x1188, - 0x6010, 0x9190, 0x0004, 0x2214, 0x9206, 0x01b8, 0x0050, 0x7240, - 0x2c08, 0x9006, 0x080c, 0xd857, 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, 0xa0e3, 0x2160, - 0x6007, 0x0025, 0x6003, 0x0001, 0x080c, 0x86c1, 0x080c, 0x8c10, - 0x00ee, 0x002e, 0x001e, 0x0005, 0x2001, 0x0001, 0x080c, 0x63dc, - 0x0156, 0x0016, 0x0026, 0x0036, 0x20a9, 0x0004, 0x2019, 0x1805, - 0x2011, 0x0276, 0x080c, 0xb0bc, 0x003e, 0x002e, 0x001e, 0x015e, - 0x0120, 0x6007, 0x0031, 0x0804, 0xc7e2, 0x080c, 0xad24, 0x080c, - 0x7207, 0x1190, 0x0006, 0x0026, 0x0036, 0x080c, 0x7221, 0x1138, - 0x080c, 0x7504, 0x080c, 0x5f2b, 0x080c, 0x7127, 0x0010, 0x080c, - 0x71df, 0x003e, 0x002e, 0x000e, 0x0005, 0x080c, 0x32ae, 0x1904, - 0xca18, 0x080c, 0xcbb8, 0x1904, 0xc6cb, 0x6106, 0x080c, 0xcbd4, - 0x1120, 0x6007, 0x002b, 0x0804, 0xc7e2, 0x6007, 0x002c, 0x0804, - 0xc7e2, 0x080c, 0xda81, 0x1904, 0xca18, 0x080c, 0x32ae, 0x1904, - 0xca18, 0x080c, 0xcbb8, 0x1904, 0xc6cb, 0x6106, 0x080c, 0xcbd9, - 0x1120, 0x6007, 0x002e, 0x0804, 0xc7e2, 0x6007, 0x002f, 0x0804, - 0xc7e2, 0x080c, 0x32ae, 0x1904, 0xca18, 0x00e6, 0x00d6, 0x00c6, - 0x6010, 0x2058, 0xb904, 0x9184, 0x00ff, 0x9086, 0x0006, 0x0158, - 0x9184, 0xff00, 0x8007, 0x9086, 0x0006, 0x0128, 0x00ce, 0x00de, - 0x00ee, 0x0804, 0xc7e9, 0x080c, 0x55df, 0xd0e4, 0x0904, 0xc963, - 0x2071, 0x026c, 0x7010, 0x603a, 0x7014, 0x603e, 0x7108, 0x720c, - 0x080c, 0x67bf, 0x0140, 0x6010, 0x2058, 0xb810, 0x9106, 0x1118, - 0xb814, 0x9206, 0x0510, 0x080c, 0x67bb, 0x15b8, 0x2069, 0x1800, - 0x687c, 0x9206, 0x1590, 0x6878, 0x9106, 0x1578, 0x7210, 0x080c, - 0xbe25, 0x0590, 0x080c, 0xcaa3, 0x0578, 0x080c, 0xd901, 0x0560, - 0x622e, 0x6007, 0x0036, 0x6003, 0x0001, 0x080c, 0x8679, 0x080c, - 0x8c10, 0x00ce, 0x00de, 0x00ee, 0x0005, 0x7214, 0x9286, 0xffff, - 0x0150, 0x080c, 0xbe25, 0x01c0, 0x9280, 0x0002, 0x2004, 0x7110, - 0x9106, 0x1190, 0x08e0, 0x7210, 0x2c08, 0x9085, 0x0001, 0x080c, - 0xd857, 0x2c10, 0x2160, 0x0140, 0x0890, 0x6007, 0x0037, 0x602f, - 0x0009, 0x6017, 0x1500, 0x08b8, 0x6007, 0x0037, 0x602f, 0x0003, - 0x6017, 0x1700, 0x0880, 0x6007, 0x0012, 0x0868, 0x080c, 0x32ae, - 0x1904, 0xca18, 0x6010, 0x2058, 0xb804, 0x9084, 0xff00, 0x8007, - 0x9086, 0x0006, 0x1904, 0xc7e9, 0x00e6, 0x00d6, 0x00c6, 0x080c, - 0x55df, 0xd0e4, 0x0904, 0xc9db, 0x2069, 0x1800, 0x2071, 0x026c, - 0x7008, 0x603a, 0x720c, 0x623e, 0x9286, 0xffff, 0x1150, 0x7208, - 0x00c6, 0x2c08, 0x9085, 0x0001, 0x080c, 0xd857, 0x2c10, 0x00ce, - 0x05e8, 0x080c, 0xbe25, 0x05d0, 0x7108, 0x9280, 0x0002, 0x2004, - 0x9106, 0x15a0, 0x00c6, 0x0026, 0x2260, 0x080c, 0xba49, 0x002e, - 0x00ce, 0x7118, 0x918c, 0xff00, 0x810f, 0x9186, 0x0001, 0x0178, - 0x9186, 0x0005, 0x0118, 0x9186, 0x0007, 0x1198, 0x9280, 0x0005, - 0x2004, 0x9005, 0x0170, 0x080c, 0xcaa3, 0x0904, 0xc95c, 0x0056, - 0x7510, 0x7614, 0x080c, 0xd91a, 0x005e, 0x00ce, 0x00de, 0x00ee, - 0x0005, 0x6007, 0x003b, 0x602f, 0x0009, 0x6017, 0x2a00, 0x6003, - 0x0001, 0x080c, 0x8679, 0x080c, 0x8c10, 0x0c78, 0x6007, 0x003b, - 0x602f, 0x0003, 0x6017, 0x0300, 0x6003, 0x0001, 0x080c, 0x8679, - 0x080c, 0x8c10, 0x0c10, 0x6007, 0x003b, 0x602f, 0x000b, 0x6017, - 0x0000, 0x0804, 0xc933, 0x00e6, 0x0026, 0x080c, 0x6781, 0x0550, - 0x080c, 0x676a, 0x080c, 0xdaf3, 0x1518, 0x2071, 0x1800, 0x70d8, - 0x9085, 0x0003, 0x70da, 0x00f6, 0x2079, 0x0100, 0x72ac, 0x9284, - 0x00ff, 0x707a, 0x78e6, 0x9284, 0xff00, 0x727c, 0x9205, 0x707e, - 0x78ea, 0x00fe, 0x70e3, 0x0000, 0x080c, 0x67bf, 0x0120, 0x2011, - 0x19d8, 0x2013, 0x07d0, 0xd0ac, 0x1128, 0x080c, 0x2f6c, 0x0010, - 0x080c, 0xdb25, 0x002e, 0x00ee, 0x080c, 0xa0e3, 0x0804, 0xc7e8, - 0x080c, 0xa0e3, 0x0005, 0x2600, 0x0002, 0xca2f, 0xca2f, 0xca2f, - 0xca2f, 0xca2f, 0xca31, 0xca2f, 0xca2f, 0xca2f, 0xca2f, 0xca4e, - 0xca2f, 0xca2f, 0xca2f, 0xca60, 0xca6d, 0xca9e, 0xca2f, 0x080c, - 0x0dfa, 0x080c, 0xda81, 0x1d20, 0x080c, 0x32ae, 0x1d08, 0x080c, - 0xcbb8, 0x1148, 0x7038, 0x6016, 0x6007, 0x0045, 0x6003, 0x0001, - 0x080c, 0x86c1, 0x0005, 0x080c, 0x318b, 0x080c, 0xc54e, 0x6007, - 0x0001, 0x6003, 0x0001, 0x080c, 0x86c1, 0x0005, 0x080c, 0xda81, - 0x1938, 0x080c, 0x32ae, 0x1920, 0x080c, 0xcbb8, 0x1d60, 0x703c, - 0x6016, 0x6007, 0x004a, 0x6003, 0x0001, 0x080c, 0x86c1, 0x0005, - 0x080c, 0xcac0, 0x0904, 0xca18, 0x6007, 0x004e, 0x6003, 0x0001, - 0x080c, 0x86c1, 0x080c, 0x8c10, 0x0005, 0x6007, 0x004f, 0x6017, - 0x0000, 0x7134, 0x918c, 0x00ff, 0x81ff, 0x0508, 0x9186, 0x0001, - 0x1160, 0x7140, 0x2001, 0x1995, 0x2004, 0x9106, 0x11b0, 0x7144, - 0x2001, 0x1996, 0x2004, 0x9106, 0x0190, 0x9186, 0x0002, 0x1168, - 0x2011, 0x0276, 0x20a9, 0x0004, 0x6010, 0x0096, 0x2048, 0x2019, - 0x000a, 0x080c, 0xb0d0, 0x009e, 0x0110, 0x6017, 0x0001, 0x6003, - 0x0001, 0x080c, 0x86c1, 0x080c, 0x8c10, 0x0005, 0x6007, 0x0050, - 0x703c, 0x6016, 0x0ca0, 0x0016, 0x00e6, 0x2071, 0x0260, 0x00b6, - 0x00c6, 0x2260, 0x6010, 0x2058, 0xb8bc, 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, 0x708c, 0x908a, 0x00f9, 0x16e8, 0x20e1, - 0x0000, 0x2001, 0x1978, 0x2003, 0x0000, 0x080c, 0x104a, 0x05a0, + 0x0007, 0x080c, 0x4bb4, 0x004e, 0x003e, 0x0005, 0x0c51, 0x1d81, + 0x0005, 0x2001, 0x1960, 0x2004, 0x601a, 0x0005, 0x2001, 0x1962, + 0x2004, 0x6042, 0x0005, 0x080c, 0x9fea, 0x0804, 0x8b8f, 0x2001, + 0x0109, 0x2004, 0xd084, 0x01e0, 0x0126, 0x2091, 0x2800, 0x0006, + 0x0016, 0x0026, 0x0036, 0x00f6, 0x00e6, 0x00c6, 0x2079, 0x19c2, + 0x2071, 0x1800, 0x2061, 0x0100, 0x080c, 0x84e2, 0x00ce, 0x00ee, + 0x00fe, 0x003e, 0x002e, 0x001e, 0x000e, 0x012e, 0x9085, 0x0001, + 0x0005, 0x00b6, 0x0066, 0x6000, 0x90b2, 0x0010, 0x1a0c, 0x0df6, + 0x001b, 0x006e, 0x00be, 0x0005, 0xc4bc, 0xcbd4, 0xcd47, 0xc4bc, + 0xc4bc, 0xc4bc, 0xc4bc, 0xc4bc, 0xc4f3, 0xcdcb, 0xc4bc, 0xc4bc, + 0xc4bc, 0xc4bc, 0xc4bc, 0xc4bc, 0x080c, 0x0df6, 0x0066, 0x6000, + 0x90b2, 0x0010, 0x1a0c, 0x0df6, 0x0013, 0x006e, 0x0005, 0xc4d7, + 0xd31a, 0xc4d7, 0xc4d7, 0xc4d7, 0xc4d7, 0xc4d7, 0xc4d7, 0xd2c7, + 0xd36e, 0xc4d7, 0xd9c1, 0xd9f7, 0xd9c1, 0xd9f7, 0xc4d7, 0x080c, + 0x0df6, 0x6000, 0x9082, 0x0010, 0x1a0c, 0x0df6, 0x6000, 0x000a, + 0x0005, 0xc4f1, 0xcfa9, 0xd078, 0xd09b, 0xd15b, 0xc4f1, 0xd23a, + 0xd1e3, 0xcdd7, 0xd29d, 0xd2b2, 0xc4f1, 0xc4f1, 0xc4f1, 0xc4f1, + 0xc4f1, 0x080c, 0x0df6, 0x91b2, 0x0053, 0x1a0c, 0x0df6, 0x2100, + 0x91b2, 0x0040, 0x1a04, 0xc971, 0x0002, 0xc53d, 0xc73f, 0xc53d, + 0xc53d, 0xc53d, 0xc748, 0xc53d, 0xc53d, 0xc53d, 0xc53d, 0xc53d, + 0xc53d, 0xc53d, 0xc53d, 0xc53d, 0xc53d, 0xc53d, 0xc53d, 0xc53d, + 0xc53d, 0xc53d, 0xc53d, 0xc53d, 0xc53f, 0xc5a2, 0xc5b1, 0xc615, + 0xc640, 0xc6b8, 0xc72a, 0xc53d, 0xc53d, 0xc74b, 0xc53d, 0xc53d, + 0xc760, 0xc76d, 0xc53d, 0xc53d, 0xc53d, 0xc53d, 0xc53d, 0xc813, + 0xc53d, 0xc53d, 0xc827, 0xc53d, 0xc53d, 0xc7e2, 0xc53d, 0xc53d, + 0xc53d, 0xc83f, 0xc53d, 0xc53d, 0xc53d, 0xc8bc, 0xc53d, 0xc53d, + 0xc53d, 0xc53d, 0xc53d, 0xc53d, 0xc939, 0x080c, 0x0df6, 0x080c, + 0x6687, 0x1150, 0x2001, 0x1836, 0x2004, 0xd0cc, 0x1128, 0x9084, + 0x0009, 0x9086, 0x0008, 0x1140, 0x6007, 0x0009, 0x602f, 0x0009, + 0x6017, 0x0000, 0x0804, 0xc738, 0x080c, 0x6670, 0x00e6, 0x00c6, + 0x0036, 0x0026, 0x0016, 0x6210, 0x2258, 0xbaa0, 0x0026, 0x2019, + 0x0029, 0x080c, 0x8782, 0x0076, 0x903e, 0x080c, 0x8670, 0x2c08, + 0x080c, 0xd556, 0x007e, 0x001e, 0x001e, 0x002e, 0x003e, 0x00ce, + 0x00ee, 0x6610, 0x2658, 0x080c, 0x63b2, 0xbe04, 0x9684, 0x00ff, + 0x9082, 0x0006, 0x1268, 0x0016, 0x0026, 0x6210, 0x00b6, 0x2258, + 0xbaa0, 0x00be, 0x2c08, 0x080c, 0xdb71, 0x002e, 0x001e, 0x1178, + 0x080c, 0xd489, 0x1904, 0xc60d, 0x080c, 0xd425, 0x1120, 0x6007, + 0x0008, 0x0804, 0xc738, 0x6007, 0x0009, 0x0804, 0xc738, 0x080c, + 0xd6c7, 0x0128, 0x080c, 0xd489, 0x0d78, 0x0804, 0xc60d, 0x6017, + 0x1900, 0x0c88, 0x080c, 0x31b8, 0x1904, 0xc96e, 0x6106, 0x080c, + 0xd3c9, 0x6007, 0x0006, 0x0804, 0xc738, 0x6007, 0x0007, 0x0804, + 0xc738, 0x080c, 0xda33, 0x1904, 0xc96e, 0x080c, 0x31b8, 0x1904, + 0xc96e, 0x00d6, 0x6610, 0x2658, 0xbe04, 0x9684, 0x00ff, 0x9082, + 0x0006, 0x1220, 0x2001, 0x0001, 0x080c, 0x62e0, 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, 0xd4ec, 0x1190, 0x9686, 0x0006, + 0x1140, 0x0026, 0x6210, 0x2258, 0xbaa0, 0x900e, 0x080c, 0x30de, + 0x002e, 0x080c, 0x643e, 0x6007, 0x000a, 0x00de, 0x0804, 0xc738, + 0x6007, 0x000b, 0x00de, 0x0804, 0xc738, 0x080c, 0x3095, 0x080c, + 0xc46e, 0x6007, 0x0001, 0x0804, 0xc738, 0x080c, 0xda33, 0x1904, + 0xc96e, 0x080c, 0x31b8, 0x1904, 0xc96e, 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, 0x30de, 0x002e, + 0x6007, 0x000c, 0x2001, 0x0001, 0x080c, 0xdb50, 0x0804, 0xc738, + 0x080c, 0x6687, 0x1140, 0x2001, 0x1836, 0x2004, 0x9084, 0x0009, + 0x9086, 0x0008, 0x1110, 0x0804, 0xc54c, 0x080c, 0x6670, 0x6610, + 0x2658, 0xbe04, 0x9684, 0x00ff, 0x9082, 0x0006, 0x06c0, 0x1138, + 0x0026, 0x2001, 0x0006, 0x080c, 0x6320, 0x002e, 0x0050, 0x96b4, + 0xff00, 0x8637, 0x9686, 0x0004, 0x0120, 0x9686, 0x0006, 0x1904, + 0xc60d, 0x080c, 0xd4f9, 0x1120, 0x6007, 0x000e, 0x0804, 0xc738, + 0x0046, 0x6410, 0x2458, 0xbca0, 0x0046, 0x080c, 0x3095, 0x080c, + 0xc46e, 0x004e, 0x0016, 0x9006, 0x2009, 0x185c, 0x210c, 0x0048, + 0x2009, 0x0029, 0x080c, 0xd837, 0x6010, 0x2058, 0xb800, 0xc0e5, + 0xb802, 0x001e, 0x004e, 0x6007, 0x0001, 0x0804, 0xc738, 0x2001, + 0x0001, 0x080c, 0x62e0, 0x0156, 0x0016, 0x0026, 0x0036, 0x20a9, + 0x0004, 0x2019, 0x1805, 0x2011, 0x0270, 0x080c, 0xb003, 0x003e, + 0x002e, 0x001e, 0x015e, 0x9005, 0x0168, 0x96b4, 0xff00, 0x8637, + 0x9682, 0x0004, 0x0a04, 0xc60d, 0x9682, 0x0007, 0x0a04, 0xc669, + 0x0804, 0xc60d, 0x6017, 0x1900, 0x6007, 0x0009, 0x0804, 0xc738, + 0x080c, 0x6687, 0x1140, 0x2001, 0x1836, 0x2004, 0x9084, 0x0009, + 0x9086, 0x0008, 0x1110, 0x0804, 0xc54c, 0x080c, 0x6670, 0x6610, + 0x2658, 0xbe04, 0x9684, 0x00ff, 0x0006, 0x0016, 0x908e, 0x0001, + 0x0118, 0x908e, 0x0000, 0x1118, 0x001e, 0x000e, 0x0080, 0x001e, + 0x000e, 0x9082, 0x0006, 0x0698, 0x0150, 0x96b4, 0xff00, 0x8637, + 0x9686, 0x0004, 0x0120, 0x9686, 0x0006, 0x1904, 0xc60d, 0x080c, + 0xd527, 0x1138, 0x080c, 0xd425, 0x1120, 0x6007, 0x0010, 0x0804, + 0xc738, 0x0046, 0x6410, 0x2458, 0xbca0, 0x0046, 0x080c, 0x3095, + 0x080c, 0xc46e, 0x004e, 0x0016, 0x9006, 0x2009, 0x185c, 0x210c, + 0x0048, 0x2009, 0x0029, 0x080c, 0xd837, 0x6010, 0x2058, 0xb800, + 0xc0e5, 0xb802, 0x001e, 0x004e, 0x6007, 0x0001, 0x0448, 0x080c, + 0xd6c7, 0x0198, 0x0016, 0x968c, 0x00ff, 0x9186, 0x0002, 0x0160, + 0x9186, 0x0003, 0x0148, 0x001e, 0x96b4, 0xff00, 0x8637, 0x9686, + 0x0006, 0x0928, 0x0804, 0xc60d, 0x001e, 0x6017, 0x1900, 0x6007, + 0x0009, 0x0070, 0x080c, 0x31b8, 0x1904, 0xc96e, 0x080c, 0xda33, + 0x1904, 0xc96e, 0x080c, 0xcb12, 0x1904, 0xc60d, 0x6007, 0x0012, + 0x6003, 0x0001, 0x080c, 0x8640, 0x080c, 0x8b8f, 0x0005, 0x6007, + 0x0001, 0x6003, 0x0001, 0x080c, 0x8640, 0x080c, 0x8b8f, 0x0cb0, + 0x6007, 0x0005, 0x0c68, 0x080c, 0xda33, 0x1904, 0xc96e, 0x080c, + 0x31b8, 0x1904, 0xc96e, 0x080c, 0xcb12, 0x1904, 0xc60d, 0x6007, + 0x0020, 0x6003, 0x0001, 0x080c, 0x8640, 0x080c, 0x8b8f, 0x0005, + 0x080c, 0x31b8, 0x1904, 0xc96e, 0x6007, 0x0023, 0x6003, 0x0001, + 0x080c, 0x8640, 0x080c, 0x8b8f, 0x0005, 0x080c, 0xda33, 0x1904, + 0xc96e, 0x080c, 0x31b8, 0x1904, 0xc96e, 0x080c, 0xcb12, 0x1904, + 0xc60d, 0x0016, 0x0026, 0x00e6, 0x2071, 0x0260, 0x2c08, 0x2011, + 0x181f, 0x2214, 0x703c, 0x9206, 0x11e0, 0x2011, 0x181e, 0x2214, + 0x7038, 0x9084, 0x00ff, 0x9206, 0x11a0, 0x7240, 0x080c, 0xbd3c, + 0x0570, 0x2260, 0x6008, 0x9086, 0xffff, 0x0120, 0x7244, 0x6008, + 0x9206, 0x1528, 0x6020, 0x9086, 0x0007, 0x1508, 0x080c, 0x9fea, + 0x04a0, 0x7244, 0x9286, 0xffff, 0x0180, 0x2c08, 0x080c, 0xbd3c, + 0x01b0, 0x2260, 0x7240, 0x6008, 0x9206, 0x1188, 0x6010, 0x9190, + 0x0004, 0x2214, 0x9206, 0x01b8, 0x0050, 0x7240, 0x2c08, 0x9006, + 0x080c, 0xd809, 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, 0x9fea, 0x2160, 0x6007, 0x0025, + 0x6003, 0x0001, 0x080c, 0x8640, 0x080c, 0x8b8f, 0x00ee, 0x002e, + 0x001e, 0x0005, 0x2001, 0x0001, 0x080c, 0x62e0, 0x0156, 0x0016, + 0x0026, 0x0036, 0x20a9, 0x0004, 0x2019, 0x1805, 0x2011, 0x0276, + 0x080c, 0xb003, 0x003e, 0x002e, 0x001e, 0x015e, 0x0120, 0x6007, + 0x0031, 0x0804, 0xc738, 0x080c, 0xac59, 0x080c, 0x717e, 0x1190, + 0x0006, 0x0026, 0x0036, 0x080c, 0x7198, 0x1138, 0x080c, 0x747a, + 0x080c, 0x5e2f, 0x080c, 0x709e, 0x0010, 0x080c, 0x7156, 0x003e, + 0x002e, 0x000e, 0x0005, 0x080c, 0x31b8, 0x1904, 0xc96e, 0x080c, + 0xcb12, 0x1904, 0xc60d, 0x6106, 0x080c, 0xcb2e, 0x1120, 0x6007, + 0x002b, 0x0804, 0xc738, 0x6007, 0x002c, 0x0804, 0xc738, 0x080c, + 0xda33, 0x1904, 0xc96e, 0x080c, 0x31b8, 0x1904, 0xc96e, 0x080c, + 0xcb12, 0x1904, 0xc60d, 0x6106, 0x080c, 0xcb33, 0x1120, 0x6007, + 0x002e, 0x0804, 0xc738, 0x6007, 0x002f, 0x0804, 0xc738, 0x080c, + 0x31b8, 0x1904, 0xc96e, 0x00e6, 0x00d6, 0x00c6, 0x6010, 0x2058, + 0xb904, 0x9184, 0x00ff, 0x9086, 0x0006, 0x0158, 0x9184, 0xff00, + 0x8007, 0x9086, 0x0006, 0x0128, 0x00ce, 0x00de, 0x00ee, 0x0804, + 0xc73f, 0x080c, 0x54df, 0xd0e4, 0x0904, 0xc8b9, 0x2071, 0x026c, + 0x7010, 0x603a, 0x7014, 0x603e, 0x7108, 0x720c, 0x080c, 0x66c5, + 0x0140, 0x6010, 0x2058, 0xb810, 0x9106, 0x1118, 0xb814, 0x9206, + 0x0510, 0x080c, 0x66c1, 0x15b8, 0x2069, 0x1800, 0x687c, 0x9206, + 0x1590, 0x6878, 0x9106, 0x1578, 0x7210, 0x080c, 0xbd3c, 0x0590, + 0x080c, 0xc9ff, 0x0578, 0x080c, 0xd8b3, 0x0560, 0x622e, 0x6007, + 0x0036, 0x6003, 0x0001, 0x080c, 0x85f8, 0x080c, 0x8b8f, 0x00ce, + 0x00de, 0x00ee, 0x0005, 0x7214, 0x9286, 0xffff, 0x0150, 0x080c, + 0xbd3c, 0x01c0, 0x9280, 0x0002, 0x2004, 0x7110, 0x9106, 0x1190, + 0x08e0, 0x7210, 0x2c08, 0x9085, 0x0001, 0x080c, 0xd809, 0x2c10, + 0x2160, 0x0140, 0x0890, 0x6007, 0x0037, 0x602f, 0x0009, 0x6017, + 0x1500, 0x08b8, 0x6007, 0x0037, 0x602f, 0x0003, 0x6017, 0x1700, + 0x0880, 0x6007, 0x0012, 0x0868, 0x080c, 0x31b8, 0x1904, 0xc96e, + 0x6010, 0x2058, 0xb804, 0x9084, 0xff00, 0x8007, 0x9086, 0x0006, + 0x1904, 0xc73f, 0x00e6, 0x00d6, 0x00c6, 0x080c, 0x54df, 0xd0e4, + 0x0904, 0xc931, 0x2069, 0x1800, 0x2071, 0x026c, 0x7008, 0x603a, + 0x720c, 0x623e, 0x9286, 0xffff, 0x1150, 0x7208, 0x00c6, 0x2c08, + 0x9085, 0x0001, 0x080c, 0xd809, 0x2c10, 0x00ce, 0x05e8, 0x080c, + 0xbd3c, 0x05d0, 0x7108, 0x9280, 0x0002, 0x2004, 0x9106, 0x15a0, + 0x00c6, 0x0026, 0x2260, 0x080c, 0xb976, 0x002e, 0x00ce, 0x7118, + 0x918c, 0xff00, 0x810f, 0x9186, 0x0001, 0x0178, 0x9186, 0x0005, + 0x0118, 0x9186, 0x0007, 0x1198, 0x9280, 0x0005, 0x2004, 0x9005, + 0x0170, 0x080c, 0xc9ff, 0x0904, 0xc8b2, 0x0056, 0x7510, 0x7614, + 0x080c, 0xd8cc, 0x005e, 0x00ce, 0x00de, 0x00ee, 0x0005, 0x6007, + 0x003b, 0x602f, 0x0009, 0x6017, 0x2a00, 0x6003, 0x0001, 0x080c, + 0x85f8, 0x080c, 0x8b8f, 0x0c78, 0x6007, 0x003b, 0x602f, 0x0003, + 0x6017, 0x0300, 0x6003, 0x0001, 0x080c, 0x85f8, 0x080c, 0x8b8f, + 0x0c10, 0x6007, 0x003b, 0x602f, 0x000b, 0x6017, 0x0000, 0x0804, + 0xc889, 0x00e6, 0x0026, 0x080c, 0x6687, 0x0550, 0x080c, 0x6670, + 0x080c, 0xdaa4, 0x1518, 0x2071, 0x1800, 0x70d8, 0x9085, 0x0003, + 0x70da, 0x00f6, 0x2079, 0x0100, 0x72ac, 0x9284, 0x00ff, 0x707a, + 0x78e6, 0x9284, 0xff00, 0x727c, 0x9205, 0x707e, 0x78ea, 0x00fe, + 0x70e3, 0x0000, 0x080c, 0x66c5, 0x0120, 0x2011, 0x19db, 0x2013, + 0x07d0, 0xd0ac, 0x1128, 0x080c, 0x2e73, 0x0010, 0x080c, 0xdad8, + 0x002e, 0x00ee, 0x080c, 0x9fea, 0x0804, 0xc73e, 0x080c, 0x9fea, + 0x0005, 0x2600, 0x0002, 0xc985, 0xc985, 0xc985, 0xc985, 0xc985, + 0xc987, 0xc985, 0xc985, 0xc985, 0xc985, 0xc9a1, 0xc985, 0xc985, + 0xc985, 0xc9b3, 0xc9c9, 0xc9fa, 0xc985, 0x080c, 0x0df6, 0x080c, + 0xda33, 0x1d20, 0x080c, 0x31b8, 0x1d08, 0x7038, 0x6016, 0x6007, + 0x0045, 0x6003, 0x0001, 0x080c, 0x8640, 0x0005, 0x080c, 0x3095, + 0x080c, 0xc46e, 0x6007, 0x0001, 0x6003, 0x0001, 0x080c, 0x8640, + 0x0005, 0x080c, 0xda33, 0x1950, 0x080c, 0x31b8, 0x1938, 0x080c, + 0xcb12, 0x1d60, 0x703c, 0x6016, 0x6007, 0x004a, 0x6003, 0x0001, + 0x080c, 0x8640, 0x0005, 0x2001, 0x1823, 0x2004, 0x9082, 0x00e1, + 0x1268, 0x080c, 0xca1c, 0x0904, 0xc96e, 0x6007, 0x004e, 0x6003, + 0x0001, 0x080c, 0x8640, 0x080c, 0x8b8f, 0x0005, 0x6007, 0x0012, + 0x0cb0, 0x6007, 0x004f, 0x6017, 0x0000, 0x7134, 0x918c, 0x00ff, + 0x81ff, 0x0508, 0x9186, 0x0001, 0x1160, 0x7140, 0x2001, 0x1998, + 0x2004, 0x9106, 0x11b0, 0x7144, 0x2001, 0x1999, 0x2004, 0x9106, + 0x0190, 0x9186, 0x0002, 0x1168, 0x2011, 0x0276, 0x20a9, 0x0004, + 0x6010, 0x0096, 0x2048, 0x2019, 0x000a, 0x080c, 0xb017, 0x009e, + 0x0110, 0x6017, 0x0001, 0x6003, 0x0001, 0x080c, 0x8640, 0x080c, + 0x8b8f, 0x0005, 0x6007, 0x0050, 0x703c, 0x6016, 0x0ca0, 0x0016, + 0x00e6, 0x2071, 0x0260, 0x00b6, 0x00c6, 0x2260, 0x6010, 0x2058, + 0xb8bc, 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, 0x197b, 0x2003, 0x0000, 0x080c, 0x1050, 0x05a0, 0x2900, 0x6016, 0x708c, 0x8004, 0xa816, 0x908a, 0x001e, 0x02d0, 0xa833, 0x001e, 0x20a9, 0x001e, 0xa860, 0x20e8, 0xa85c, 0x9080, - 0x001b, 0x20a0, 0x2001, 0x1978, 0x0016, 0x200c, 0x0471, 0x001e, - 0x2940, 0x080c, 0x104a, 0x01c0, 0x2900, 0xa006, 0x2100, 0x81ff, - 0x0180, 0x0c18, 0xa832, 0x20a8, 0xa860, 0x20e8, 0xa85c, 0x9080, - 0x001b, 0x20a0, 0x2001, 0x1978, 0x0016, 0x200c, 0x00b1, 0x001e, + 0x001b, 0x20a0, 0x2001, 0x197b, 0x0016, 0x200c, 0x0471, 0x001e, + 0x81ff, 0x01b8, 0x2940, 0x080c, 0x1050, 0x01b0, 0x2900, 0xa006, + 0x2100, 0x0c18, 0xa832, 0x20a8, 0xa860, 0x20e8, 0xa85c, 0x9080, + 0x001b, 0x20a0, 0x2001, 0x197b, 0x0016, 0x200c, 0x00b1, 0x001e, 0x0000, 0x9085, 0x0001, 0x0048, 0x2071, 0x1800, 0x708f, 0x0000, - 0x6014, 0x2048, 0x080c, 0x0fe3, 0x9006, 0x012e, 0x01de, 0x01ce, + 0x6014, 0x2048, 0x080c, 0x0fe9, 0x9006, 0x012e, 0x01de, 0x01ce, 0x00ee, 0x008e, 0x009e, 0x001e, 0x0005, 0x0006, 0x0016, 0x0026, - 0x0036, 0x00c6, 0x918c, 0xffff, 0x11a8, 0x080c, 0x22e3, 0x2099, - 0x026c, 0x2001, 0x0014, 0x3518, 0x9312, 0x1218, 0x23a8, 0x4003, - 0x00f8, 0x20a8, 0x4003, 0x22a8, 0x8108, 0x080c, 0x22e3, 0x2099, - 0x0260, 0x0ca8, 0x080c, 0x22e3, 0x2061, 0x1978, 0x6004, 0x2098, - 0x6008, 0x3518, 0x9312, 0x1218, 0x23a8, 0x4003, 0x0048, 0x20a8, - 0x4003, 0x22a8, 0x8108, 0x080c, 0x22e3, 0x2099, 0x0260, 0x0ca8, - 0x2061, 0x1978, 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, 0x22fb, 0x20a1, 0x024c, 0x2001, 0x0014, 0x3518, 0x9312, - 0x1218, 0x23a8, 0x4003, 0x0418, 0x20a8, 0x4003, 0x82ff, 0x01f8, - 0x22a8, 0x8108, 0x080c, 0x22fb, 0x20a1, 0x0240, 0x0c98, 0x080c, - 0x22fb, 0x2061, 0x197b, 0x6004, 0x20a0, 0x6008, 0x3518, 0x9312, - 0x1218, 0x23a8, 0x4003, 0x0058, 0x20a8, 0x4003, 0x82ff, 0x0138, - 0x22a8, 0x8108, 0x080c, 0x22fb, 0x20a1, 0x0240, 0x0c98, 0x2061, - 0x197b, 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, 0xcc50, 0x00de, - 0x0005, 0x00d6, 0x080c, 0xcc5d, 0x1520, 0x680c, 0x908c, 0xff00, - 0x6820, 0x9084, 0x00ff, 0x9115, 0x6216, 0x6824, 0x602e, 0xd1e4, - 0x0130, 0x9006, 0x080c, 0xdb9d, 0x2009, 0x0001, 0x0078, 0xd1ec, - 0x0180, 0x6920, 0x918c, 0x00ff, 0x6824, 0x080c, 0x276e, 0x1148, - 0x2001, 0x0001, 0x080c, 0xdb9d, 0x2110, 0x900e, 0x080c, 0x31d4, - 0x0018, 0x9085, 0x0001, 0x0008, 0x9006, 0x00de, 0x0005, 0x00b6, - 0x00c6, 0x080c, 0xa130, 0x05a8, 0x0016, 0x0026, 0x00c6, 0x2011, - 0x0263, 0x2204, 0x8211, 0x220c, 0x080c, 0x276e, 0x1578, 0x080c, - 0x643f, 0x1560, 0xbe12, 0xbd16, 0x00ce, 0x002e, 0x001e, 0x2b00, - 0x6012, 0x080c, 0xda81, 0x11d8, 0x080c, 0x32ae, 0x11c0, 0x080c, - 0xcbb8, 0x0510, 0x2001, 0x0007, 0x080c, 0x63f0, 0x2001, 0x0007, - 0x080c, 0x641c, 0x6017, 0x0000, 0x6023, 0x0001, 0x6007, 0x0001, - 0x6003, 0x0001, 0x080c, 0x86c1, 0x080c, 0x8c10, 0x0010, 0x080c, - 0xa0e3, 0x9085, 0x0001, 0x00ce, 0x00be, 0x0005, 0x080c, 0xa0e3, - 0x00ce, 0x002e, 0x001e, 0x0ca8, 0x080c, 0xa0e3, 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, 0x0dfa, 0x91b6, - 0x0013, 0x1130, 0x2008, 0x91b2, 0x0040, 0x1a04, 0xcda5, 0x0092, - 0x91b6, 0x0027, 0x0120, 0x91b6, 0x0014, 0x190c, 0x0dfa, 0x2001, - 0x0007, 0x080c, 0x641c, 0x080c, 0x8b04, 0x080c, 0xa113, 0x080c, - 0x8c10, 0x0005, 0xccda, 0xccdc, 0xccda, 0xccda, 0xccda, 0xccdc, - 0xcceb, 0xcd9e, 0xcd3d, 0xcd9e, 0xcd4f, 0xcd9e, 0xcceb, 0xcd9e, - 0xcd96, 0xcd9e, 0xcd96, 0xcd9e, 0xcd9e, 0xccda, 0xccda, 0xccda, - 0xccda, 0xccda, 0xccda, 0xccda, 0xccda, 0xccda, 0xccda, 0xccda, - 0xccdc, 0xccda, 0xcd9e, 0xccda, 0xccda, 0xcd9e, 0xccda, 0xcd9b, - 0xcd9e, 0xccda, 0xccda, 0xccda, 0xccda, 0xcd9e, 0xcd9e, 0xccda, - 0xcd9e, 0xcd9e, 0xccda, 0xcce6, 0xccda, 0xccda, 0xccda, 0xccda, - 0xcd9a, 0xcd9e, 0xccda, 0xccda, 0xcd9e, 0xcd9e, 0xccda, 0xccda, - 0xccda, 0xccda, 0x080c, 0x0dfa, 0x080c, 0x8b04, 0x080c, 0xc551, - 0x6003, 0x0002, 0x080c, 0x8c10, 0x0804, 0xcda4, 0x9006, 0x080c, - 0x63dc, 0x0804, 0xcd9e, 0x080c, 0x67bb, 0x1904, 0xcd9e, 0x9006, - 0x080c, 0x63dc, 0x6010, 0x2058, 0xb810, 0x9086, 0x00ff, 0x1140, - 0x00f6, 0x2079, 0x1800, 0x78a4, 0x8000, 0x78a6, 0x00fe, 0x0428, - 0x6010, 0x2058, 0xb8b0, 0x9005, 0x1178, 0x080c, 0xc539, 0x1904, - 0xcd9e, 0x0036, 0x0046, 0xbba0, 0x2021, 0x0007, 0x080c, 0x4cbc, - 0x004e, 0x003e, 0x0804, 0xcd9e, 0x080c, 0x32df, 0x1904, 0xcd9e, - 0x2001, 0x1800, 0x2004, 0x9086, 0x0002, 0x1138, 0x00f6, 0x2079, - 0x1800, 0x78a4, 0x8000, 0x78a6, 0x00fe, 0x2001, 0x0002, 0x080c, - 0x63f0, 0x080c, 0x8b04, 0x6023, 0x0001, 0x6003, 0x0001, 0x6007, - 0x0002, 0x080c, 0x86c1, 0x080c, 0x8c10, 0x6110, 0x2158, 0x2009, - 0x0001, 0x080c, 0x82e8, 0x0804, 0xcda4, 0x6610, 0x2658, 0xbe04, - 0x96b4, 0xff00, 0x8637, 0x9686, 0x0006, 0x0904, 0xcd9e, 0x9686, - 0x0004, 0x0904, 0xcd9e, 0x2001, 0x0004, 0x0804, 0xcd9c, 0x2001, - 0x1800, 0x2004, 0x9086, 0x0003, 0x1158, 0x0036, 0x0046, 0x6010, - 0x2058, 0xbba0, 0x2021, 0x0006, 0x080c, 0x4cbc, 0x004e, 0x003e, - 0x2001, 0x0006, 0x080c, 0xcdc2, 0x6610, 0x2658, 0xbe04, 0x0066, - 0x96b4, 0xff00, 0x8637, 0x9686, 0x0006, 0x006e, 0x0168, 0x2001, - 0x0006, 0x080c, 0x641c, 0x9284, 0x00ff, 0x908e, 0x0007, 0x1120, - 0x2001, 0x0006, 0x080c, 0x63f0, 0x080c, 0x67bb, 0x11f8, 0x2001, - 0x1836, 0x2004, 0xd0a4, 0x01d0, 0xbe04, 0x96b4, 0x00ff, 0x9686, - 0x0006, 0x01a0, 0x00f6, 0x2079, 0x1800, 0x78a4, 0x8000, 0x78a6, - 0x00fe, 0x0804, 0xcd25, 0x2001, 0x0004, 0x0030, 0x2001, 0x0006, - 0x0449, 0x0020, 0x0018, 0x0010, 0x080c, 0x641c, 0x080c, 0x8b04, - 0x080c, 0xa0e3, 0x080c, 0x8c10, 0x0005, 0x2600, 0x0002, 0xcdb9, - 0xcdb9, 0xcdb9, 0xcdb9, 0xcdb9, 0xcdbb, 0xcdb9, 0xcdb9, 0xcdb9, - 0xcdb9, 0xcdbb, 0xcdb9, 0xcdb9, 0xcdb9, 0xcdbb, 0xcdbb, 0xcdbb, - 0xcdbb, 0x080c, 0x0dfa, 0x080c, 0x8b04, 0x080c, 0xa0e3, 0x080c, - 0x8c10, 0x0005, 0x0016, 0x00b6, 0x00d6, 0x6110, 0x2158, 0xb900, - 0xd184, 0x0138, 0x080c, 0x63f0, 0x9006, 0x080c, 0x63dc, 0x080c, - 0x31b4, 0x00de, 0x00be, 0x001e, 0x0005, 0x6610, 0x2658, 0xb804, - 0x9084, 0xff00, 0x8007, 0x90b2, 0x000c, 0x1a0c, 0x0dfa, 0x91b6, - 0x0015, 0x1110, 0x003b, 0x0028, 0x91b6, 0x0016, 0x190c, 0x0dfa, - 0x006b, 0x0005, 0xab62, 0xab62, 0xab62, 0xab62, 0xce57, 0xab62, - 0xce41, 0xce02, 0xab62, 0xab62, 0xab62, 0xab62, 0xab62, 0xab62, - 0xab62, 0xab62, 0xce57, 0xab62, 0xce41, 0xce48, 0xab62, 0xab62, - 0xab62, 0xab62, 0x00f6, 0x080c, 0x67bb, 0x11d8, 0x080c, 0xc539, - 0x11c0, 0x6010, 0x905d, 0x01a8, 0xb8b0, 0x9005, 0x0190, 0x9006, - 0x080c, 0x63dc, 0x2001, 0x0002, 0x080c, 0x63f0, 0x6023, 0x0001, - 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x86c1, 0x080c, 0x8c10, - 0x00f0, 0x2011, 0x0263, 0x2204, 0x8211, 0x220c, 0x080c, 0x276e, - 0x11b0, 0x080c, 0x649f, 0x0118, 0x080c, 0xa0e3, 0x0080, 0xb810, - 0x0006, 0xb814, 0x0006, 0xb8b0, 0x0006, 0x080c, 0x5f45, 0x000e, - 0xb8b2, 0x000e, 0xb816, 0x000e, 0xb812, 0x080c, 0xa0e3, 0x00fe, - 0x0005, 0x6604, 0x96b6, 0x001e, 0x1110, 0x080c, 0xa0e3, 0x0005, - 0x080c, 0xaf48, 0x1148, 0x6003, 0x0001, 0x6007, 0x0001, 0x080c, - 0x86c1, 0x080c, 0x8c10, 0x0010, 0x080c, 0xa0e3, 0x0005, 0x0804, - 0xa0e3, 0x6004, 0x908a, 0x0053, 0x1a0c, 0x0dfa, 0x080c, 0x8b04, - 0x080c, 0xa113, 0x080c, 0x8c10, 0x0005, 0x9182, 0x0040, 0x0002, - 0xce7c, 0xce7c, 0xce7c, 0xce7c, 0xce7e, 0xce7c, 0xce7c, 0xce7c, - 0xce7c, 0xce7c, 0xce7c, 0xce7c, 0xce7c, 0xce7c, 0xce7c, 0xce7c, - 0xce7c, 0xce7c, 0xce7c, 0xce7c, 0x080c, 0x0dfa, 0x0096, 0x00b6, - 0x00d6, 0x00e6, 0x00f6, 0x0046, 0x0026, 0x6210, 0x2258, 0xb8ac, - 0x9005, 0x11a8, 0x6106, 0x2071, 0x0260, 0x7444, 0x94a4, 0xff00, - 0x0904, 0xcee4, 0x080c, 0xdb91, 0x1170, 0x9486, 0x2000, 0x1158, - 0x2009, 0x0001, 0x2011, 0x0200, 0x080c, 0x84d1, 0x0020, 0x9026, - 0x080c, 0xdac6, 0x0c38, 0x080c, 0x1031, 0x090c, 0x0dfa, 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, 0x6ae9, 0x001e, 0x080c, 0xdb91, 0x1904, 0xcf44, 0x9486, - 0x2000, 0x1130, 0x2019, 0x0017, 0x080c, 0xd801, 0x0804, 0xcf44, - 0x9486, 0x0200, 0x1120, 0x080c, 0xd79d, 0x0804, 0xcf44, 0x9486, - 0x0400, 0x0120, 0x9486, 0x1000, 0x1904, 0xcf44, 0x2019, 0x0002, - 0x080c, 0xd7b8, 0x0804, 0xcf44, 0x2069, 0x1a48, 0x6a00, 0xd284, - 0x0904, 0xcfae, 0x9284, 0x0300, 0x1904, 0xcfa7, 0x6804, 0x9005, - 0x0904, 0xcf8f, 0x2d78, 0x6003, 0x0007, 0x080c, 0x104a, 0x0904, - 0xcf50, 0x7800, 0xd08c, 0x1118, 0x7804, 0x8001, 0x7806, 0x6017, - 0x0000, 0x2001, 0x180f, 0x2004, 0xd084, 0x1904, 0xcfb2, 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, 0xcf4c, 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, 0x6ae9, 0x002e, 0x004e, 0x00fe, 0x00ee, - 0x00de, 0x00be, 0x009e, 0x0005, 0x0000, 0x0080, 0x0040, 0x0000, - 0x2001, 0x1810, 0x2004, 0xd084, 0x0120, 0x080c, 0x1031, 0x1904, - 0xcef9, 0x6017, 0xf100, 0x6003, 0x0001, 0x6007, 0x0041, 0x080c, - 0x8679, 0x080c, 0x8c10, 0x0c00, 0x2069, 0x0260, 0x6848, 0x9084, - 0xff00, 0x9086, 0x1200, 0x1198, 0x686c, 0x9084, 0x00ff, 0x0016, - 0x6114, 0x918c, 0xf700, 0x910d, 0x6116, 0x001e, 0x6003, 0x0001, - 0x6007, 0x0043, 0x080c, 0x8679, 0x080c, 0x8c10, 0x0828, 0x6868, - 0x602e, 0x686c, 0x6032, 0x6017, 0xf200, 0x6003, 0x0001, 0x6007, - 0x0041, 0x080c, 0x8679, 0x080c, 0x8c10, 0x0804, 0xcf44, 0x2001, - 0x180e, 0x2004, 0xd0ec, 0x0120, 0x2011, 0x8049, 0x080c, 0x4b1f, - 0x6017, 0xf300, 0x0010, 0x6017, 0xf100, 0x6003, 0x0001, 0x6007, - 0x0041, 0x080c, 0x8679, 0x080c, 0x8c10, 0x0804, 0xcf44, 0x6017, - 0xf500, 0x0c98, 0x6017, 0xf600, 0x0804, 0xcf64, 0x6017, 0xf200, - 0x0804, 0xcf64, 0xa867, 0x0146, 0xa86b, 0x0000, 0x6008, 0xa886, - 0x2c00, 0xa87a, 0x7044, 0x9084, 0x0003, 0x9080, 0xcf4c, 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, 0x0dfa, 0x8210, 0x821c, 0x2001, 0x026c, 0x2098, 0xa860, - 0x20e8, 0xa85c, 0x9080, 0x0029, 0x20a0, 0x2011, 0xd02e, 0x2041, - 0x0001, 0x223d, 0x9784, 0x00ff, 0x9322, 0x1208, 0x2300, 0x20a8, - 0x4003, 0x931a, 0x0530, 0x8210, 0xd7fc, 0x1130, 0x8d68, 0x2d0a, - 0x2001, 0x0260, 0x2098, 0x0c68, 0x2950, 0x080c, 0x104a, 0x0170, - 0x2900, 0xb002, 0xa867, 0x0147, 0xa86b, 0x0000, 0xa860, 0x20e8, - 0xa85c, 0x9080, 0x001b, 0x20a0, 0x8840, 0x08d8, 0x2548, 0xa800, - 0x902d, 0x0118, 0x080c, 0x1063, 0x0cc8, 0x080c, 0x1063, 0x0804, - 0xcf50, 0x2548, 0x8847, 0x9885, 0x0046, 0xa866, 0x2009, 0x0205, - 0x200b, 0x0000, 0x080c, 0xd830, 0x0804, 0xcf44, 0x8010, 0x0004, - 0x801a, 0x0006, 0x8018, 0x0008, 0x8016, 0x000a, 0x8014, 0x9186, - 0x0013, 0x1160, 0x6004, 0x908a, 0x0054, 0x1a0c, 0x0dfa, 0x9082, - 0x0040, 0x0a0c, 0x0dfa, 0x2008, 0x0804, 0xd0e0, 0x9186, 0x0051, - 0x0108, 0x00c0, 0x2001, 0x0109, 0x2004, 0xd084, 0x0904, 0xd090, - 0x0126, 0x2091, 0x2800, 0x0006, 0x0016, 0x0026, 0x080c, 0x8563, - 0x002e, 0x001e, 0x000e, 0x012e, 0x6000, 0x9086, 0x0002, 0x1580, - 0x0804, 0xd129, 0x9186, 0x0027, 0x0530, 0x9186, 0x0048, 0x0128, - 0x9186, 0x0014, 0x0500, 0x190c, 0x0dfa, 0x2001, 0x0109, 0x2004, - 0xd084, 0x01f0, 0x00c6, 0x0126, 0x2091, 0x2800, 0x00c6, 0x2061, - 0x0100, 0x0006, 0x0016, 0x0026, 0x080c, 0x8563, 0x002e, 0x001e, - 0x000e, 0x00ce, 0x012e, 0x00ce, 0x6000, 0x9086, 0x0004, 0x190c, - 0x0dfa, 0x0804, 0xd20c, 0x6004, 0x9082, 0x0040, 0x2008, 0x001a, - 0x080c, 0xa178, 0x0005, 0xd0a7, 0xd0a9, 0xd0a9, 0xd0d0, 0xd0a7, - 0xd0a7, 0xd0a7, 0xd0a7, 0xd0a7, 0xd0a7, 0xd0a7, 0xd0a7, 0xd0a7, - 0xd0a7, 0xd0a7, 0xd0a7, 0xd0a7, 0xd0a7, 0xd0a7, 0xd0a7, 0x080c, - 0x0dfa, 0x080c, 0x8b04, 0x080c, 0x8c10, 0x0036, 0x0096, 0x6014, - 0x904d, 0x01d8, 0x080c, 0xbe37, 0x01c0, 0x6003, 0x0002, 0x6010, - 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x1178, 0x2019, 0x0004, - 0x080c, 0xd830, 0x6017, 0x0000, 0x6018, 0x9005, 0x1120, 0x2001, - 0x195f, 0x2004, 0x601a, 0x6003, 0x0007, 0x009e, 0x003e, 0x0005, - 0x0096, 0x080c, 0x8b04, 0x080c, 0x8c10, 0x080c, 0xbe37, 0x0120, - 0x6014, 0x2048, 0x080c, 0x1063, 0x080c, 0xa113, 0x009e, 0x0005, - 0x0002, 0xd0f5, 0xd10c, 0xd0f7, 0xd123, 0xd0f5, 0xd0f5, 0xd0f5, - 0xd0f5, 0xd0f5, 0xd0f5, 0xd0f5, 0xd0f5, 0xd0f5, 0xd0f5, 0xd0f5, - 0xd0f5, 0xd0f5, 0xd0f5, 0xd0f5, 0xd0f5, 0x080c, 0x0dfa, 0x0096, - 0x080c, 0x8b04, 0x6014, 0x2048, 0xa87c, 0xd0b4, 0x0138, 0x6003, - 0x0007, 0x2009, 0x0043, 0x080c, 0xa15d, 0x0010, 0x6003, 0x0004, - 0x080c, 0x8c10, 0x009e, 0x0005, 0x080c, 0x8b04, 0x080c, 0xbe37, - 0x0138, 0x6114, 0x0096, 0x2148, 0xa97c, 0x009e, 0xd1ec, 0x1138, - 0x080c, 0x84a6, 0x080c, 0xa0e3, 0x080c, 0x8c10, 0x0005, 0x080c, - 0xda8a, 0x0db0, 0x0cc8, 0x080c, 0x8b04, 0x2009, 0x0041, 0x0804, - 0xd294, 0x9182, 0x0040, 0x0002, 0xd140, 0xd142, 0xd140, 0xd140, - 0xd140, 0xd140, 0xd140, 0xd140, 0xd140, 0xd140, 0xd140, 0xd140, - 0xd140, 0xd140, 0xd140, 0xd140, 0xd140, 0xd143, 0xd140, 0xd140, - 0x080c, 0x0dfa, 0x0005, 0x00d6, 0x080c, 0x84a6, 0x00de, 0x080c, - 0xdae2, 0x080c, 0xa0e3, 0x0005, 0x9182, 0x0040, 0x0002, 0xd163, - 0xd163, 0xd163, 0xd163, 0xd163, 0xd163, 0xd163, 0xd163, 0xd163, - 0xd165, 0xd1d4, 0xd163, 0xd163, 0xd163, 0xd163, 0xd1d4, 0xd163, - 0xd163, 0xd163, 0xd163, 0x080c, 0x0dfa, 0x2001, 0x0105, 0x2004, - 0x9084, 0x1800, 0x01c8, 0x2001, 0x0132, 0x200c, 0x2001, 0x0131, - 0x2004, 0x9105, 0x1904, 0xd1d4, 0x2009, 0x180c, 0x2104, 0xd0d4, - 0x0904, 0xd1d4, 0xc0d4, 0x200a, 0x2009, 0x0105, 0x2104, 0x9084, - 0xe7fd, 0x9085, 0x0010, 0x200a, 0x2001, 0x187b, 0x2004, 0xd0e4, - 0x1528, 0x603b, 0x0000, 0x080c, 0x8bc0, 0x6014, 0x0096, 0x2048, - 0xa87c, 0xd0fc, 0x0188, 0x908c, 0x0003, 0x918e, 0x0002, 0x0508, - 0x2001, 0x180c, 0x2004, 0xd0d4, 0x11e0, 0x080c, 0x8ced, 0x2009, - 0x0041, 0x009e, 0x0804, 0xd294, 0x080c, 0x8ced, 0x6003, 0x0007, - 0x601b, 0x0000, 0x080c, 0x84a6, 0x009e, 0x0005, 0x2001, 0x0100, - 0x2004, 0x9082, 0x0005, 0x0aa8, 0x2001, 0x011f, 0x2004, 0x603a, - 0x0890, 0x2001, 0x180c, 0x200c, 0xc1d4, 0x2102, 0xd1cc, 0x0110, - 0x080c, 0x2bca, 0x080c, 0x8ced, 0x6014, 0x2048, 0xa97c, 0xd1ec, - 0x1130, 0x080c, 0x84a6, 0x080c, 0xa0e3, 0x009e, 0x0005, 0x080c, - 0xda8a, 0x0db8, 0x009e, 0x0005, 0x2001, 0x180c, 0x200c, 0xc1d4, - 0x2102, 0x0036, 0x080c, 0x8bc0, 0x080c, 0x8ced, 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, 0xd830, 0x6018, 0x9005, 0x1128, - 0x2001, 0x195f, 0x2004, 0x8003, 0x601a, 0x6017, 0x0000, 0x6003, - 0x0007, 0x009e, 0x003e, 0x0005, 0x9182, 0x0040, 0x0002, 0xd223, - 0xd223, 0xd223, 0xd223, 0xd223, 0xd223, 0xd223, 0xd223, 0xd225, - 0xd223, 0xd223, 0xd223, 0xd223, 0xd223, 0xd223, 0xd223, 0xd223, - 0xd223, 0xd223, 0xd270, 0x080c, 0x0dfa, 0x6014, 0x0096, 0x2048, - 0xa834, 0xaa38, 0x6110, 0x00b6, 0x2158, 0xb900, 0x00be, 0xd1bc, - 0x1190, 0x920d, 0x1518, 0xa87c, 0xd0fc, 0x0128, 0x2009, 0x0041, - 0x009e, 0x0804, 0xd294, 0x6003, 0x0007, 0x601b, 0x0000, 0x080c, - 0x84a6, 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, 0x84a8, 0x009e, 0x0005, 0x6003, 0x0002, 0x009e, 0x0005, - 0x6024, 0xd0f4, 0x0128, 0x080c, 0x1582, 0x1904, 0xd225, 0x0005, - 0x6014, 0x0096, 0x2048, 0xa834, 0xa938, 0x009e, 0x9105, 0x1120, - 0x080c, 0x1582, 0x1904, 0xd225, 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, 0x0dfa, 0x6024, - 0xd0dc, 0x090c, 0x0dfa, 0x0005, 0xd2b8, 0xd2c4, 0xd2d0, 0xd2dc, - 0xd2b8, 0xd2b8, 0xd2b8, 0xd2b8, 0xd2bf, 0xd2ba, 0xd2ba, 0xd2b8, - 0xd2b8, 0xd2b8, 0xd2b8, 0xd2ba, 0xd2b8, 0xd2ba, 0xd2b8, 0xd2bf, - 0x080c, 0x0dfa, 0x6024, 0xd0dc, 0x090c, 0x0dfa, 0x0005, 0x6014, - 0x9005, 0x190c, 0x0dfa, 0x0005, 0x6003, 0x0001, 0x6106, 0x080c, - 0x8679, 0x0126, 0x2091, 0x8000, 0x080c, 0x8c10, 0x012e, 0x0005, - 0x6003, 0x0001, 0x6106, 0x080c, 0x8679, 0x0126, 0x2091, 0x8000, - 0x080c, 0x8c10, 0x012e, 0x0005, 0x6003, 0x0003, 0x6106, 0x2c10, - 0x080c, 0x1afe, 0x0126, 0x2091, 0x8000, 0x080c, 0x86de, 0x080c, - 0x8ced, 0x012e, 0x0005, 0x0126, 0x2091, 0x8000, 0x0036, 0x0096, - 0x9182, 0x0040, 0x0023, 0x009e, 0x003e, 0x012e, 0x0005, 0xd30b, - 0xd30d, 0xd31f, 0xd339, 0xd30b, 0xd30b, 0xd30b, 0xd30b, 0xd30b, - 0xd30b, 0xd30b, 0xd30b, 0xd30b, 0xd30b, 0xd30b, 0xd30b, 0xd30b, - 0xd30b, 0xd30b, 0xd30b, 0x080c, 0x0dfa, 0x6014, 0x2048, 0xa87c, - 0xd0fc, 0x01f8, 0x909c, 0x0003, 0x939e, 0x0003, 0x01d0, 0x6003, - 0x0001, 0x6106, 0x080c, 0x8679, 0x080c, 0x8c10, 0x0470, 0x6014, - 0x2048, 0xa87c, 0xd0fc, 0x0168, 0x909c, 0x0003, 0x939e, 0x0003, - 0x0140, 0x6003, 0x0001, 0x6106, 0x080c, 0x8679, 0x080c, 0x8c10, - 0x00e0, 0x901e, 0x6316, 0x631a, 0x2019, 0x0004, 0x080c, 0xd830, - 0x00a0, 0x6014, 0x2048, 0xa87c, 0xd0fc, 0x0d98, 0x909c, 0x0003, - 0x939e, 0x0003, 0x0d70, 0x6003, 0x0003, 0x6106, 0x2c10, 0x080c, - 0x1afe, 0x080c, 0x86de, 0x080c, 0x8ced, 0x0005, 0x080c, 0x8b04, - 0x6114, 0x81ff, 0x0158, 0x0096, 0x2148, 0x080c, 0xdb2e, 0x0036, - 0x2019, 0x0029, 0x080c, 0xd830, 0x003e, 0x009e, 0x080c, 0xa113, - 0x080c, 0x8c10, 0x0005, 0x080c, 0x8bc0, 0x6114, 0x81ff, 0x0158, - 0x0096, 0x2148, 0x080c, 0xdb2e, 0x0036, 0x2019, 0x0029, 0x080c, - 0xd830, 0x003e, 0x009e, 0x080c, 0xa113, 0x080c, 0x8ced, 0x0005, - 0x9182, 0x0085, 0x0002, 0xd38a, 0xd388, 0xd388, 0xd396, 0xd388, - 0xd388, 0xd388, 0xd388, 0xd388, 0xd388, 0xd388, 0xd388, 0xd388, - 0x080c, 0x0dfa, 0x6003, 0x000b, 0x6106, 0x080c, 0x8679, 0x0126, - 0x2091, 0x8000, 0x080c, 0x8c10, 0x012e, 0x0005, 0x0026, 0x00e6, - 0x080c, 0xda81, 0x0118, 0x080c, 0xa0e3, 0x0450, 0x2071, 0x0260, - 0x7224, 0x6216, 0x2001, 0x180e, 0x2004, 0xd0e4, 0x0150, 0x6010, - 0x00b6, 0x2058, 0xbca0, 0x00be, 0x2c00, 0x2011, 0x014e, 0x080c, - 0xa403, 0x7220, 0x080c, 0xd6d6, 0x0118, 0x6007, 0x0086, 0x0040, - 0x6007, 0x0087, 0x7224, 0x9296, 0xffff, 0x1110, 0x6007, 0x0086, - 0x6003, 0x0001, 0x080c, 0x8679, 0x080c, 0x8c10, 0x080c, 0x8ced, - 0x00ee, 0x002e, 0x0005, 0x9186, 0x0013, 0x1160, 0x6004, 0x908a, - 0x0085, 0x0a0c, 0x0dfa, 0x908a, 0x0092, 0x1a0c, 0x0dfa, 0x9082, - 0x0085, 0x00a2, 0x9186, 0x0027, 0x0130, 0x9186, 0x0014, 0x0118, - 0x080c, 0xa178, 0x0050, 0x2001, 0x0007, 0x080c, 0x641c, 0x080c, - 0x8b04, 0x080c, 0xa113, 0x080c, 0x8c10, 0x0005, 0xd3fb, 0xd3fd, - 0xd3fd, 0xd3fb, 0xd3fb, 0xd3fb, 0xd3fb, 0xd3fb, 0xd3fb, 0xd3fb, - 0xd3fb, 0xd3fb, 0xd3fb, 0x080c, 0x0dfa, 0x080c, 0x8b04, 0x080c, - 0xa113, 0x080c, 0x8c10, 0x0005, 0x9182, 0x0085, 0x0a0c, 0x0dfa, - 0x9182, 0x0092, 0x1a0c, 0x0dfa, 0x9182, 0x0085, 0x0002, 0xd41c, - 0xd41c, 0xd41c, 0xd41e, 0xd41c, 0xd41c, 0xd41c, 0xd41c, 0xd41c, - 0xd41c, 0xd41c, 0xd41c, 0xd41c, 0x080c, 0x0dfa, 0x0005, 0x9186, - 0x0013, 0x0148, 0x9186, 0x0014, 0x0130, 0x9186, 0x0027, 0x0118, - 0x080c, 0xa178, 0x0030, 0x080c, 0x8b04, 0x080c, 0xa113, 0x080c, - 0x8c10, 0x0005, 0x0036, 0x080c, 0xdae2, 0x6043, 0x0000, 0x2019, - 0x000b, 0x0031, 0x6023, 0x0006, 0x6003, 0x0007, 0x003e, 0x0005, - 0x0126, 0x0036, 0x2091, 0x8000, 0x0086, 0x2c40, 0x0096, 0x904e, - 0x080c, 0x9a58, 0x009e, 0x008e, 0x1550, 0x0076, 0x2c38, 0x080c, - 0x9b03, 0x007e, 0x1520, 0x6000, 0x9086, 0x0000, 0x0500, 0x6020, - 0x9086, 0x0007, 0x01e0, 0x0096, 0x601c, 0xd084, 0x0140, 0x080c, - 0xdae2, 0x080c, 0xc551, 0x080c, 0x19b4, 0x6023, 0x0007, 0x6014, - 0x2048, 0x080c, 0xbe37, 0x0110, 0x080c, 0xd830, 0x009e, 0x6017, - 0x0000, 0x080c, 0xdae2, 0x6023, 0x0007, 0x080c, 0xc551, 0x003e, - 0x012e, 0x0005, 0x00f6, 0x00c6, 0x00b6, 0x0036, 0x0156, 0x2079, - 0x0260, 0x7938, 0x783c, 0x080c, 0x276e, 0x15c8, 0x0016, 0x00c6, - 0x080c, 0x649f, 0x1590, 0x001e, 0x00c6, 0x2160, 0x080c, 0xc54e, - 0x00ce, 0x002e, 0x0026, 0x0016, 0x2019, 0x0029, 0x080c, 0x9bc9, - 0x080c, 0x8803, 0x0076, 0x903e, 0x080c, 0x86f1, 0x007e, 0x001e, - 0x0076, 0x903e, 0x080c, 0xd5f6, 0x007e, 0x0026, 0xba04, 0x9294, + 0x0036, 0x00c6, 0x918c, 0xffff, 0x11b0, 0x080c, 0x21d9, 0x2099, + 0x026c, 0x2001, 0x0014, 0x3518, 0x9312, 0x0108, 0x1218, 0x23a8, + 0x4003, 0x0400, 0x20a8, 0x4003, 0x22a8, 0x8108, 0x080c, 0x21d9, + 0x2099, 0x0260, 0x0ca8, 0x080c, 0x21d9, 0x2061, 0x197b, 0x6004, + 0x2098, 0x6008, 0x3518, 0x9312, 0x0108, 0x1218, 0x23a8, 0x4003, + 0x0048, 0x20a8, 0x4003, 0x22a8, 0x8108, 0x080c, 0x21d9, 0x2099, + 0x0260, 0x0ca8, 0x2061, 0x197b, 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, 0x21f1, 0x20a1, 0x024c, 0x2001, 0x0014, + 0x3518, 0x9312, 0x1218, 0x23a8, 0x4003, 0x0418, 0x20a8, 0x4003, + 0x82ff, 0x01f8, 0x22a8, 0x8108, 0x080c, 0x21f1, 0x20a1, 0x0240, + 0x0c98, 0x080c, 0x21f1, 0x2061, 0x197e, 0x6004, 0x20a0, 0x6008, + 0x3518, 0x9312, 0x1218, 0x23a8, 0x4003, 0x0058, 0x20a8, 0x4003, + 0x82ff, 0x0138, 0x22a8, 0x8108, 0x080c, 0x21f1, 0x20a1, 0x0240, + 0x0c98, 0x2061, 0x197e, 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, + 0xcbaa, 0x00de, 0x0005, 0x00d6, 0x080c, 0xcbb7, 0x1520, 0x680c, + 0x908c, 0xff00, 0x6820, 0x9084, 0x00ff, 0x9115, 0x6216, 0x6824, + 0x602e, 0xd1e4, 0x0130, 0x9006, 0x080c, 0xdb50, 0x2009, 0x0001, + 0x0078, 0xd1ec, 0x0180, 0x6920, 0x918c, 0x00ff, 0x6824, 0x080c, + 0x266d, 0x1148, 0x2001, 0x0001, 0x080c, 0xdb50, 0x2110, 0x900e, + 0x080c, 0x30de, 0x0018, 0x9085, 0x0001, 0x0008, 0x9006, 0x00de, + 0x0005, 0x00b6, 0x00c6, 0x080c, 0xa03b, 0x05a8, 0x0016, 0x0026, + 0x00c6, 0x2011, 0x0263, 0x2204, 0x8211, 0x220c, 0x080c, 0x266d, + 0x1578, 0x080c, 0x6343, 0x1560, 0xbe12, 0xbd16, 0x00ce, 0x002e, + 0x001e, 0x2b00, 0x6012, 0x080c, 0xda33, 0x11d8, 0x080c, 0x31b8, + 0x11c0, 0x080c, 0xcb12, 0x0510, 0x2001, 0x0007, 0x080c, 0x62f4, + 0x2001, 0x0007, 0x080c, 0x6320, 0x6017, 0x0000, 0x6023, 0x0001, + 0x6007, 0x0001, 0x6003, 0x0001, 0x080c, 0x8640, 0x080c, 0x8b8f, + 0x0010, 0x080c, 0x9fea, 0x9085, 0x0001, 0x00ce, 0x00be, 0x0005, + 0x080c, 0x9fea, 0x00ce, 0x002e, 0x001e, 0x0ca8, 0x080c, 0x9fea, + 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, + 0x0df6, 0x91b6, 0x0013, 0x1130, 0x2008, 0x91b2, 0x0040, 0x1a04, + 0xcd17, 0x040a, 0x91b6, 0x0027, 0x0198, 0x9186, 0x0015, 0x0118, + 0x9186, 0x0016, 0x1148, 0x080c, 0xc47f, 0x0128, 0x6000, 0x9086, + 0x0002, 0x0904, 0xa9ee, 0x0005, 0x91b6, 0x0014, 0x190c, 0x0df6, + 0x2001, 0x0007, 0x080c, 0x6320, 0x080c, 0x8a83, 0x080c, 0xa01c, + 0x080c, 0x8b8f, 0x0005, 0xcc43, 0xcc45, 0xcc43, 0xcc43, 0xcc43, + 0xcc45, 0xcc54, 0xcd10, 0xcc98, 0xcd10, 0xccbe, 0xcd10, 0xcc54, + 0xcd10, 0xcd08, 0xcd10, 0xcd08, 0xcd10, 0xcd10, 0xcc43, 0xcc43, + 0xcc43, 0xcc43, 0xcc43, 0xcc43, 0xcc43, 0xcc43, 0xcc43, 0xcc43, + 0xcc43, 0xcc45, 0xcc43, 0xcd10, 0xcc43, 0xcc43, 0xcd10, 0xcc43, + 0xcd0d, 0xcd10, 0xcc43, 0xcc43, 0xcc43, 0xcc43, 0xcd10, 0xcd10, + 0xcc43, 0xcd10, 0xcd10, 0xcc43, 0xcc4f, 0xcc43, 0xcc43, 0xcc43, + 0xcc43, 0xcd0c, 0xcd10, 0xcc43, 0xcc43, 0xcd10, 0xcd10, 0xcc43, + 0xcc43, 0xcc43, 0xcc43, 0x080c, 0x0df6, 0x080c, 0x8a83, 0x080c, + 0xc471, 0x6003, 0x0002, 0x080c, 0x8b8f, 0x0804, 0xcd16, 0x9006, + 0x080c, 0x62e0, 0x0804, 0xcd10, 0x080c, 0x66c1, 0x1904, 0xcd10, + 0x9006, 0x080c, 0x62e0, 0x6010, 0x2058, 0xb810, 0x9086, 0x00ff, + 0x1140, 0x00f6, 0x2079, 0x1800, 0x78a4, 0x8000, 0x78a6, 0x00fe, + 0x00b8, 0x6010, 0x2058, 0xb8b0, 0x9005, 0x0904, 0xcd10, 0x080c, + 0x31e9, 0x1904, 0xcd10, 0x2001, 0x1800, 0x2004, 0x9086, 0x0002, + 0x1138, 0x00f6, 0x2079, 0x1800, 0x78a4, 0x8000, 0x78a6, 0x00fe, + 0x2001, 0x0002, 0x080c, 0x62f4, 0x080c, 0x8a83, 0x6023, 0x0001, + 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x8640, 0x080c, 0x8b8f, + 0x6110, 0x2158, 0x2009, 0x0001, 0x080c, 0x8267, 0x0804, 0xcd16, + 0x6610, 0x2658, 0xbe04, 0x96b4, 0xff00, 0x8637, 0x9686, 0x0006, + 0x0138, 0x9686, 0x0004, 0x0120, 0x2001, 0x0004, 0x080c, 0x6320, + 0x080c, 0xdb9f, 0x0904, 0xcd10, 0x080c, 0x8a83, 0x2001, 0x0004, + 0x080c, 0x62f4, 0x6023, 0x0001, 0x6003, 0x0001, 0x6007, 0x0003, + 0x080c, 0x8640, 0x080c, 0x8b8f, 0x0804, 0xcd16, 0x2001, 0x1800, + 0x2004, 0x9086, 0x0003, 0x1158, 0x0036, 0x0046, 0x6010, 0x2058, + 0xbba0, 0x2021, 0x0006, 0x080c, 0x4bb4, 0x004e, 0x003e, 0x2001, + 0x0006, 0x080c, 0xcd34, 0x6610, 0x2658, 0xbe04, 0x0066, 0x96b4, + 0xff00, 0x8637, 0x9686, 0x0006, 0x006e, 0x0180, 0x2001, 0x0006, + 0x080c, 0x6320, 0x9284, 0x00ff, 0x908e, 0x0007, 0x0118, 0x908e, + 0x0004, 0x1120, 0x2001, 0x0006, 0x080c, 0x62f4, 0x080c, 0x66c1, + 0x11f8, 0x2001, 0x1836, 0x2004, 0xd0a4, 0x01d0, 0xbe04, 0x96b4, + 0x00ff, 0x9686, 0x0006, 0x01a0, 0x00f6, 0x2079, 0x1800, 0x78a4, + 0x8000, 0x78a6, 0x00fe, 0x0804, 0xcc80, 0x2001, 0x0004, 0x0030, + 0x2001, 0x0006, 0x0449, 0x0020, 0x0018, 0x0010, 0x080c, 0x6320, + 0x080c, 0x8a83, 0x080c, 0x9fea, 0x080c, 0x8b8f, 0x0005, 0x2600, + 0x0002, 0xcd2b, 0xcd2b, 0xcd2b, 0xcd2b, 0xcd2b, 0xcd2d, 0xcd2b, + 0xcd2b, 0xcd2b, 0xcd2b, 0xcd2d, 0xcd2b, 0xcd2b, 0xcd2b, 0xcd2d, + 0xcd2d, 0xcd2d, 0xcd2d, 0x080c, 0x0df6, 0x080c, 0x8a83, 0x080c, + 0x9fea, 0x080c, 0x8b8f, 0x0005, 0x0016, 0x00b6, 0x00d6, 0x6110, + 0x2158, 0xb900, 0xd184, 0x0138, 0x080c, 0x62f4, 0x9006, 0x080c, + 0x62e0, 0x080c, 0x30be, 0x00de, 0x00be, 0x001e, 0x0005, 0x6610, + 0x2658, 0xb804, 0x9084, 0xff00, 0x8007, 0x90b2, 0x000c, 0x1a0c, + 0x0df6, 0x91b6, 0x0015, 0x1110, 0x003b, 0x0028, 0x91b6, 0x0016, + 0x190c, 0x0df6, 0x006b, 0x0005, 0xaa88, 0xaa88, 0xaa88, 0xaa88, + 0xcdc9, 0xaa88, 0xcdb3, 0xcd74, 0xaa88, 0xaa88, 0xaa88, 0xaa88, + 0xaa88, 0xaa88, 0xaa88, 0xaa88, 0xcdc9, 0xaa88, 0xcdb3, 0xcdba, + 0xaa88, 0xaa88, 0xaa88, 0xaa88, 0x00f6, 0x080c, 0x66c1, 0x11d8, + 0x080c, 0xc459, 0x11c0, 0x6010, 0x905d, 0x01a8, 0xb8b0, 0x9005, + 0x0190, 0x9006, 0x080c, 0x62e0, 0x2001, 0x0002, 0x080c, 0x62f4, + 0x6023, 0x0001, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x8640, + 0x080c, 0x8b8f, 0x00f0, 0x2011, 0x0263, 0x2204, 0x8211, 0x220c, + 0x080c, 0x266d, 0x11b0, 0x080c, 0x63a3, 0x0118, 0x080c, 0x9fea, + 0x0080, 0xb810, 0x0006, 0xb814, 0x0006, 0xb8b0, 0x0006, 0x080c, + 0x5e49, 0x000e, 0xb8b2, 0x000e, 0xb816, 0x000e, 0xb812, 0x080c, + 0x9fea, 0x00fe, 0x0005, 0x6604, 0x96b6, 0x001e, 0x1110, 0x080c, + 0x9fea, 0x0005, 0x080c, 0xae8a, 0x1148, 0x6003, 0x0001, 0x6007, + 0x0001, 0x080c, 0x8640, 0x080c, 0x8b8f, 0x0010, 0x080c, 0x9fea, + 0x0005, 0x0804, 0x9fea, 0x6004, 0x908a, 0x0053, 0x1a0c, 0x0df6, + 0x080c, 0x8a83, 0x080c, 0xa01c, 0x080c, 0x8b8f, 0x0005, 0x9182, + 0x0040, 0x0002, 0xcdee, 0xcdee, 0xcdee, 0xcdee, 0xcdf0, 0xcdee, + 0xcdee, 0xcdee, 0xcdee, 0xcdee, 0xcdee, 0xcdee, 0xcdee, 0xcdee, + 0xcdee, 0xcdee, 0xcdee, 0xcdee, 0xcdee, 0xcdee, 0x080c, 0x0df6, + 0x0096, 0x00b6, 0x00d6, 0x00e6, 0x00f6, 0x0046, 0x0026, 0x6210, + 0x2258, 0xb8ac, 0x9005, 0x11a8, 0x6106, 0x2071, 0x0260, 0x7444, + 0x94a4, 0xff00, 0x0904, 0xce56, 0x080c, 0xdb44, 0x1170, 0x9486, + 0x2000, 0x1158, 0x2009, 0x0001, 0x2011, 0x0200, 0x080c, 0x8450, + 0x0020, 0x9026, 0x080c, 0xda78, 0x0c38, 0x080c, 0x1037, 0x090c, + 0x0df6, 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, 0x6a22, 0x001e, 0x080c, 0xdb44, 0x1904, + 0xceb6, 0x9486, 0x2000, 0x1130, 0x2019, 0x0017, 0x080c, 0xd7af, + 0x0804, 0xceb6, 0x9486, 0x0200, 0x1120, 0x080c, 0xd746, 0x0804, + 0xceb6, 0x9486, 0x0400, 0x0120, 0x9486, 0x1000, 0x1904, 0xceb6, + 0x2019, 0x0002, 0x080c, 0xd761, 0x0804, 0xceb6, 0x2069, 0x1a4c, + 0x6a00, 0xd284, 0x0904, 0xcf20, 0x9284, 0x0300, 0x1904, 0xcf19, + 0x6804, 0x9005, 0x0904, 0xcf01, 0x2d78, 0x6003, 0x0007, 0x080c, + 0x1050, 0x0904, 0xcec2, 0x7800, 0xd08c, 0x1118, 0x7804, 0x8001, + 0x7806, 0x6017, 0x0000, 0x2001, 0x180f, 0x2004, 0xd084, 0x1904, + 0xcf24, 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, 0xcebe, 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, 0x6a22, 0x002e, 0x004e, + 0x00fe, 0x00ee, 0x00de, 0x00be, 0x009e, 0x0005, 0x0000, 0x0080, + 0x0040, 0x0000, 0x2001, 0x1810, 0x2004, 0xd084, 0x0120, 0x080c, + 0x1037, 0x1904, 0xce6b, 0x6017, 0xf100, 0x6003, 0x0001, 0x6007, + 0x0041, 0x080c, 0x85f8, 0x080c, 0x8b8f, 0x0c00, 0x2069, 0x0260, + 0x6848, 0x9084, 0xff00, 0x9086, 0x1200, 0x1198, 0x686c, 0x9084, + 0x00ff, 0x0016, 0x6114, 0x918c, 0xf700, 0x910d, 0x6116, 0x001e, + 0x6003, 0x0001, 0x6007, 0x0043, 0x080c, 0x85f8, 0x080c, 0x8b8f, + 0x0828, 0x6868, 0x602e, 0x686c, 0x6032, 0x6017, 0xf200, 0x6003, + 0x0001, 0x6007, 0x0041, 0x080c, 0x85f8, 0x080c, 0x8b8f, 0x0804, + 0xceb6, 0x2001, 0x180e, 0x2004, 0xd0ec, 0x0120, 0x2011, 0x8049, + 0x080c, 0x4a17, 0x6017, 0xf300, 0x0010, 0x6017, 0xf100, 0x6003, + 0x0001, 0x6007, 0x0041, 0x080c, 0x85f8, 0x080c, 0x8b8f, 0x0804, + 0xceb6, 0x6017, 0xf500, 0x0c98, 0x6017, 0xf600, 0x0804, 0xced6, + 0x6017, 0xf200, 0x0804, 0xced6, 0xa867, 0x0146, 0xa86b, 0x0000, + 0x6008, 0xa886, 0x2c00, 0xa87a, 0x7044, 0x9084, 0x0003, 0x9080, + 0xcebe, 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, 0x0df6, 0x8210, 0x821c, 0x2001, 0x026c, + 0x2098, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0029, 0x20a0, 0x2011, + 0xcfa0, 0x2041, 0x0001, 0x223d, 0x9784, 0x00ff, 0x9322, 0x1208, + 0x2300, 0x20a8, 0x4003, 0x931a, 0x0530, 0x8210, 0xd7fc, 0x1130, + 0x8d68, 0x2d0a, 0x2001, 0x0260, 0x2098, 0x0c68, 0x2950, 0x080c, + 0x1050, 0x0170, 0x2900, 0xb002, 0xa867, 0x0147, 0xa86b, 0x0000, + 0xa860, 0x20e8, 0xa85c, 0x9080, 0x001b, 0x20a0, 0x8840, 0x08d8, + 0x2548, 0xa800, 0x902d, 0x0118, 0x080c, 0x1069, 0x0cc8, 0x080c, + 0x1069, 0x0804, 0xcec2, 0x2548, 0x8847, 0x9885, 0x0046, 0xa866, + 0x2009, 0x0205, 0x200b, 0x0000, 0x080c, 0xd7e2, 0x0804, 0xceb6, + 0x8010, 0x0004, 0x801a, 0x0006, 0x8018, 0x0008, 0x8016, 0x000a, + 0x8014, 0x9186, 0x0013, 0x1160, 0x6004, 0x908a, 0x0054, 0x1a0c, + 0x0df6, 0x9082, 0x0040, 0x0a0c, 0x0df6, 0x2008, 0x0804, 0xd02f, + 0x9186, 0x0051, 0x0108, 0x0048, 0x080c, 0xc47f, 0x0500, 0x6000, + 0x9086, 0x0002, 0x11e0, 0x0804, 0xd078, 0x9186, 0x0027, 0x0190, + 0x9186, 0x0048, 0x0128, 0x9186, 0x0014, 0x0160, 0x190c, 0x0df6, + 0x080c, 0xc47f, 0x0160, 0x6000, 0x9086, 0x0004, 0x190c, 0x0df6, + 0x0804, 0xd15b, 0x6004, 0x9082, 0x0040, 0x2008, 0x001a, 0x080c, + 0xa083, 0x0005, 0xcff6, 0xcff8, 0xcff8, 0xd01f, 0xcff6, 0xcff6, + 0xcff6, 0xcff6, 0xcff6, 0xcff6, 0xcff6, 0xcff6, 0xcff6, 0xcff6, + 0xcff6, 0xcff6, 0xcff6, 0xcff6, 0xcff6, 0xcff6, 0x080c, 0x0df6, + 0x080c, 0x8a83, 0x080c, 0x8b8f, 0x0036, 0x0096, 0x6014, 0x904d, + 0x01d8, 0x080c, 0xbd4e, 0x01c0, 0x6003, 0x0002, 0x6010, 0x00b6, + 0x2058, 0xb800, 0x00be, 0xd0bc, 0x1178, 0x2019, 0x0004, 0x080c, + 0xd7e2, 0x6017, 0x0000, 0x6018, 0x9005, 0x1120, 0x2001, 0x1961, + 0x2004, 0x601a, 0x6003, 0x0007, 0x009e, 0x003e, 0x0005, 0x0096, + 0x080c, 0x8a83, 0x080c, 0x8b8f, 0x080c, 0xbd4e, 0x0120, 0x6014, + 0x2048, 0x080c, 0x1069, 0x080c, 0xa01c, 0x009e, 0x0005, 0x0002, + 0xd044, 0xd05b, 0xd046, 0xd072, 0xd044, 0xd044, 0xd044, 0xd044, + 0xd044, 0xd044, 0xd044, 0xd044, 0xd044, 0xd044, 0xd044, 0xd044, + 0xd044, 0xd044, 0xd044, 0xd044, 0x080c, 0x0df6, 0x0096, 0x080c, + 0x8a83, 0x6014, 0x2048, 0xa87c, 0xd0b4, 0x0138, 0x6003, 0x0007, + 0x2009, 0x0043, 0x080c, 0xa068, 0x0010, 0x6003, 0x0004, 0x080c, + 0x8b8f, 0x009e, 0x0005, 0x080c, 0x8a83, 0x080c, 0xbd4e, 0x0138, + 0x6114, 0x0096, 0x2148, 0xa97c, 0x009e, 0xd1ec, 0x1138, 0x080c, + 0x8425, 0x080c, 0x9fea, 0x080c, 0x8b8f, 0x0005, 0x080c, 0xda3c, + 0x0db0, 0x0cc8, 0x080c, 0x8a83, 0x2009, 0x0041, 0x0804, 0xd1e3, + 0x9182, 0x0040, 0x0002, 0xd08f, 0xd091, 0xd08f, 0xd08f, 0xd08f, + 0xd08f, 0xd08f, 0xd08f, 0xd08f, 0xd08f, 0xd08f, 0xd08f, 0xd08f, + 0xd08f, 0xd08f, 0xd08f, 0xd08f, 0xd092, 0xd08f, 0xd08f, 0x080c, + 0x0df6, 0x0005, 0x00d6, 0x080c, 0x8425, 0x00de, 0x080c, 0xda94, + 0x080c, 0x9fea, 0x0005, 0x9182, 0x0040, 0x0002, 0xd0b2, 0xd0b2, + 0xd0b2, 0xd0b2, 0xd0b2, 0xd0b2, 0xd0b2, 0xd0b2, 0xd0b2, 0xd0b4, + 0xd123, 0xd0b2, 0xd0b2, 0xd0b2, 0xd0b2, 0xd123, 0xd0b2, 0xd0b2, + 0xd0b2, 0xd0b2, 0x080c, 0x0df6, 0x2001, 0x0105, 0x2004, 0x9084, + 0x1800, 0x01c8, 0x2001, 0x0132, 0x200c, 0x2001, 0x0131, 0x2004, + 0x9105, 0x1904, 0xd123, 0x2009, 0x180c, 0x2104, 0xd0d4, 0x0904, + 0xd123, 0xc0d4, 0x200a, 0x2009, 0x0105, 0x2104, 0x9084, 0xe7fd, + 0x9085, 0x0010, 0x200a, 0x2001, 0x187b, 0x2004, 0xd0e4, 0x1528, + 0x603b, 0x0000, 0x080c, 0x8b3f, 0x6014, 0x0096, 0x2048, 0xa87c, + 0xd0fc, 0x0188, 0x908c, 0x0003, 0x918e, 0x0002, 0x0508, 0x2001, + 0x180c, 0x2004, 0xd0d4, 0x11e0, 0x080c, 0x8c6c, 0x2009, 0x0041, + 0x009e, 0x0804, 0xd1e3, 0x080c, 0x8c6c, 0x6003, 0x0007, 0x601b, + 0x0000, 0x080c, 0x8425, 0x009e, 0x0005, 0x2001, 0x0100, 0x2004, + 0x9082, 0x0005, 0x0aa8, 0x2001, 0x011f, 0x2004, 0x603a, 0x0890, + 0x2001, 0x180c, 0x200c, 0xc1d4, 0x2102, 0xd1cc, 0x0110, 0x080c, + 0x2ab1, 0x080c, 0x8c6c, 0x6014, 0x2048, 0xa97c, 0xd1ec, 0x1130, + 0x080c, 0x8425, 0x080c, 0x9fea, 0x009e, 0x0005, 0x080c, 0xda3c, + 0x0db8, 0x009e, 0x0005, 0x2001, 0x180c, 0x200c, 0xc1d4, 0x2102, + 0x0036, 0x080c, 0x8b3f, 0x080c, 0x8c6c, 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, 0xd7e2, 0x6018, 0x9005, 0x1128, 0x2001, + 0x1961, 0x2004, 0x8003, 0x601a, 0x6017, 0x0000, 0x6003, 0x0007, + 0x009e, 0x003e, 0x0005, 0x9182, 0x0040, 0x0002, 0xd172, 0xd172, + 0xd172, 0xd172, 0xd172, 0xd172, 0xd172, 0xd172, 0xd174, 0xd172, + 0xd172, 0xd172, 0xd172, 0xd172, 0xd172, 0xd172, 0xd172, 0xd172, + 0xd172, 0xd1bf, 0x080c, 0x0df6, 0x6014, 0x0096, 0x2048, 0xa834, + 0xaa38, 0x6110, 0x00b6, 0x2158, 0xb900, 0x00be, 0xd1bc, 0x1190, + 0x920d, 0x1518, 0xa87c, 0xd0fc, 0x0128, 0x2009, 0x0041, 0x009e, + 0x0804, 0xd1e3, 0x6003, 0x0007, 0x601b, 0x0000, 0x080c, 0x8425, + 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, + 0x8427, 0x009e, 0x0005, 0x6003, 0x0002, 0x009e, 0x0005, 0x6024, + 0xd0f4, 0x0128, 0x080c, 0x1577, 0x1904, 0xd174, 0x0005, 0x6014, + 0x0096, 0x2048, 0xa834, 0xa938, 0x009e, 0x9105, 0x1120, 0x080c, + 0x1577, 0x1904, 0xd174, 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, 0x0df6, 0x6024, 0xd0dc, + 0x090c, 0x0df6, 0x0005, 0xd207, 0xd213, 0xd21f, 0xd22b, 0xd207, + 0xd207, 0xd207, 0xd207, 0xd20e, 0xd209, 0xd209, 0xd207, 0xd207, + 0xd207, 0xd207, 0xd209, 0xd207, 0xd209, 0xd207, 0xd20e, 0x080c, + 0x0df6, 0x6024, 0xd0dc, 0x090c, 0x0df6, 0x0005, 0x6014, 0x9005, + 0x190c, 0x0df6, 0x0005, 0x6003, 0x0001, 0x6106, 0x080c, 0x85f8, + 0x0126, 0x2091, 0x8000, 0x080c, 0x8b8f, 0x012e, 0x0005, 0x6003, + 0x0001, 0x6106, 0x080c, 0x85f8, 0x0126, 0x2091, 0x8000, 0x080c, + 0x8b8f, 0x012e, 0x0005, 0x6003, 0x0003, 0x6106, 0x2c10, 0x080c, + 0x1a7e, 0x0126, 0x2091, 0x8000, 0x080c, 0x865d, 0x080c, 0x8c6c, + 0x012e, 0x0005, 0x0126, 0x2091, 0x8000, 0x0036, 0x0096, 0x9182, + 0x0040, 0x0023, 0x009e, 0x003e, 0x012e, 0x0005, 0xd25a, 0xd25c, + 0xd26e, 0xd288, 0xd25a, 0xd25a, 0xd25a, 0xd25a, 0xd25a, 0xd25a, + 0xd25a, 0xd25a, 0xd25a, 0xd25a, 0xd25a, 0xd25a, 0xd25a, 0xd25a, + 0xd25a, 0xd25a, 0x080c, 0x0df6, 0x6014, 0x2048, 0xa87c, 0xd0fc, + 0x01f8, 0x909c, 0x0003, 0x939e, 0x0003, 0x01d0, 0x6003, 0x0001, + 0x6106, 0x080c, 0x85f8, 0x080c, 0x8b8f, 0x0470, 0x6014, 0x2048, + 0xa87c, 0xd0fc, 0x0168, 0x909c, 0x0003, 0x939e, 0x0003, 0x0140, + 0x6003, 0x0001, 0x6106, 0x080c, 0x85f8, 0x080c, 0x8b8f, 0x00e0, + 0x901e, 0x6316, 0x631a, 0x2019, 0x0004, 0x080c, 0xd7e2, 0x00a0, + 0x6014, 0x2048, 0xa87c, 0xd0fc, 0x0d98, 0x909c, 0x0003, 0x939e, + 0x0003, 0x0d70, 0x6003, 0x0003, 0x6106, 0x2c10, 0x080c, 0x1a7e, + 0x080c, 0x865d, 0x080c, 0x8c6c, 0x0005, 0x080c, 0x8a83, 0x6114, + 0x81ff, 0x0158, 0x0096, 0x2148, 0x080c, 0xdae1, 0x0036, 0x2019, + 0x0029, 0x080c, 0xd7e2, 0x003e, 0x009e, 0x080c, 0xa01c, 0x080c, + 0x8b8f, 0x0005, 0x080c, 0x8b3f, 0x6114, 0x81ff, 0x0158, 0x0096, + 0x2148, 0x080c, 0xdae1, 0x0036, 0x2019, 0x0029, 0x080c, 0xd7e2, + 0x003e, 0x009e, 0x080c, 0xa01c, 0x080c, 0x8c6c, 0x0005, 0x9182, + 0x0085, 0x0002, 0xd2d9, 0xd2d7, 0xd2d7, 0xd2e5, 0xd2d7, 0xd2d7, + 0xd2d7, 0xd2d7, 0xd2d7, 0xd2d7, 0xd2d7, 0xd2d7, 0xd2d7, 0x080c, + 0x0df6, 0x6003, 0x000b, 0x6106, 0x080c, 0x85f8, 0x0126, 0x2091, + 0x8000, 0x080c, 0x8b8f, 0x012e, 0x0005, 0x0026, 0x00e6, 0x080c, + 0xda33, 0x0118, 0x080c, 0x9fea, 0x0450, 0x2071, 0x0260, 0x7224, + 0x6216, 0x2001, 0x180e, 0x2004, 0xd0e4, 0x0150, 0x6010, 0x00b6, + 0x2058, 0xbca0, 0x00be, 0x2c00, 0x2011, 0x014e, 0x080c, 0xa30b, + 0x7220, 0x080c, 0xd637, 0x0118, 0x6007, 0x0086, 0x0040, 0x6007, + 0x0087, 0x7224, 0x9296, 0xffff, 0x1110, 0x6007, 0x0086, 0x6003, + 0x0001, 0x080c, 0x85f8, 0x080c, 0x8b8f, 0x080c, 0x8c6c, 0x00ee, + 0x002e, 0x0005, 0x9186, 0x0013, 0x1160, 0x6004, 0x908a, 0x0085, + 0x0a0c, 0x0df6, 0x908a, 0x0092, 0x1a0c, 0x0df6, 0x9082, 0x0085, + 0x00a2, 0x9186, 0x0027, 0x0130, 0x9186, 0x0014, 0x0118, 0x080c, + 0xa083, 0x0050, 0x2001, 0x0007, 0x080c, 0x6320, 0x080c, 0x8a83, + 0x080c, 0xa01c, 0x080c, 0x8b8f, 0x0005, 0xd34a, 0xd34c, 0xd34c, + 0xd34a, 0xd34a, 0xd34a, 0xd34a, 0xd34a, 0xd34a, 0xd34a, 0xd34a, + 0xd34a, 0xd34a, 0x080c, 0x0df6, 0x080c, 0x8a83, 0x080c, 0xa01c, + 0x080c, 0x8b8f, 0x0005, 0x9182, 0x0085, 0x0a0c, 0x0df6, 0x9182, + 0x0092, 0x1a0c, 0x0df6, 0x9182, 0x0085, 0x0002, 0xd36b, 0xd36b, + 0xd36b, 0xd36d, 0xd36b, 0xd36b, 0xd36b, 0xd36b, 0xd36b, 0xd36b, + 0xd36b, 0xd36b, 0xd36b, 0x080c, 0x0df6, 0x0005, 0x9186, 0x0013, + 0x0148, 0x9186, 0x0014, 0x0130, 0x9186, 0x0027, 0x0118, 0x080c, + 0xa083, 0x0030, 0x080c, 0x8a83, 0x080c, 0xa01c, 0x080c, 0x8b8f, + 0x0005, 0x0036, 0x080c, 0xda94, 0x6043, 0x0000, 0x2019, 0x000b, + 0x0031, 0x6023, 0x0006, 0x6003, 0x0007, 0x003e, 0x0005, 0x0126, + 0x0036, 0x2091, 0x8000, 0x0086, 0x2c40, 0x0096, 0x904e, 0x080c, + 0x995f, 0x009e, 0x008e, 0x1550, 0x0076, 0x2c38, 0x080c, 0x9a0a, + 0x007e, 0x1520, 0x6000, 0x9086, 0x0000, 0x0500, 0x6020, 0x9086, + 0x0007, 0x01e0, 0x0096, 0x601c, 0xd084, 0x0140, 0x080c, 0xda94, + 0x080c, 0xc471, 0x080c, 0x192c, 0x6023, 0x0007, 0x6014, 0x2048, + 0x080c, 0xbd4e, 0x0110, 0x080c, 0xd7e2, 0x009e, 0x6017, 0x0000, + 0x080c, 0xda94, 0x6023, 0x0007, 0x080c, 0xc471, 0x003e, 0x012e, + 0x0005, 0x00f6, 0x00c6, 0x00b6, 0x0036, 0x0156, 0x2079, 0x0260, + 0x7938, 0x783c, 0x080c, 0x266d, 0x1904, 0xd41f, 0x0016, 0x00c6, + 0x080c, 0x63a3, 0x1904, 0xd41d, 0x001e, 0x00c6, 0x080c, 0xc459, + 0x1130, 0xb8b0, 0x9005, 0x0118, 0x080c, 0x31e9, 0x0148, 0x2b10, + 0x2160, 0x6010, 0x0006, 0x6212, 0x080c, 0xc460, 0x000e, 0x6012, + 0x00ce, 0x002e, 0x0026, 0x0016, 0x2019, 0x0029, 0x080c, 0x9ad0, + 0x080c, 0x8782, 0x0076, 0x903e, 0x080c, 0x8670, 0x007e, 0x001e, + 0x0076, 0x903e, 0x080c, 0xd556, 0x007e, 0x0026, 0xba04, 0x9294, 0xff00, 0x8217, 0x9286, 0x0006, 0x0118, 0x9286, 0x0004, 0x1118, - 0xbaa0, 0x080c, 0x3248, 0x002e, 0xbcb0, 0x001e, 0x080c, 0x5f45, + 0xbaa0, 0x080c, 0x3152, 0x002e, 0xbcb0, 0x001e, 0x080c, 0x5e49, 0xbe12, 0xbd16, 0xbcb2, 0x9006, 0x0010, 0x00ce, 0x001e, 0x015e, 0x003e, 0x00be, 0x00ce, 0x00fe, 0x0005, 0x00c6, 0x00d6, 0x00b6, - 0x0016, 0x2009, 0x1823, 0x2104, 0x9086, 0x0074, 0x1904, 0xd51e, + 0x0016, 0x2009, 0x1823, 0x2104, 0x9086, 0x0074, 0x1904, 0xd47e, 0x2069, 0x0260, 0x6944, 0x9182, 0x0100, 0x06e0, 0x6940, 0x9184, - 0x8000, 0x0904, 0xd51b, 0x2001, 0x1954, 0x2004, 0x9005, 0x1140, + 0x8000, 0x0904, 0xd47b, 0x2001, 0x1956, 0x2004, 0x9005, 0x1140, 0x6010, 0x2058, 0xb8b0, 0x9005, 0x0118, 0x9184, 0x0800, 0x0598, - 0x6948, 0x918a, 0x0001, 0x0648, 0x080c, 0xdb96, 0x0118, 0x6978, + 0x6948, 0x918a, 0x0001, 0x0648, 0x080c, 0xdb49, 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, @@ -6618,220 +6586,233 @@ unsigned short risc_code01[] = { 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, 0x64ae, 0x0804, 0xd585, 0x2011, 0x0276, - 0x20a9, 0x0004, 0x0096, 0x2b48, 0x2019, 0x000a, 0x080c, 0xb0d0, + 0x0004, 0x0120, 0x080c, 0x63b2, 0x0804, 0xd4e5, 0x2011, 0x0276, + 0x20a9, 0x0004, 0x0096, 0x2b48, 0x2019, 0x000a, 0x080c, 0xb017, 0x009e, 0x15a0, 0x2011, 0x027a, 0x20a9, 0x0004, 0x0096, 0x2b48, - 0x2019, 0x0006, 0x080c, 0xb0d0, 0x009e, 0x1540, 0x0046, 0x0016, + 0x2019, 0x0006, 0x080c, 0xb017, 0x009e, 0x1540, 0x0046, 0x0016, 0xbaa0, 0x2220, 0x9006, 0x2009, 0x185c, 0x210c, 0x0038, 0x2009, - 0x0029, 0x080c, 0xd885, 0xb800, 0xc0e5, 0xb802, 0x2019, 0x0029, - 0x080c, 0x8803, 0x0076, 0x2039, 0x0000, 0x080c, 0x86f1, 0x2c08, - 0x080c, 0xd5f6, 0x007e, 0x2001, 0x0007, 0x080c, 0x641c, 0x2001, - 0x0007, 0x080c, 0x63f0, 0x001e, 0x004e, 0x9006, 0x015e, 0x003e, + 0x0029, 0x080c, 0xd837, 0xb800, 0xc0e5, 0xb802, 0x2019, 0x0029, + 0x080c, 0x8782, 0x0076, 0x2039, 0x0000, 0x080c, 0x8670, 0x2c08, + 0x080c, 0xd556, 0x007e, 0x2001, 0x0007, 0x080c, 0x6320, 0x2001, + 0x0007, 0x080c, 0x62f4, 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, 0x276e, 0x11d0, 0x080c, 0x649f, + 0x026c, 0x7930, 0x7834, 0x080c, 0x266d, 0x11d0, 0x080c, 0x63a3, 0x11b8, 0x2011, 0x0270, 0x20a9, 0x0004, 0x0096, 0x2b48, 0x2019, - 0x000a, 0x080c, 0xb0d0, 0x009e, 0x1158, 0x2011, 0x0274, 0x20a9, - 0x0004, 0x0096, 0x2b48, 0x2019, 0x0006, 0x080c, 0xb0d0, 0x009e, + 0x000a, 0x080c, 0xb017, 0x009e, 0x1158, 0x2011, 0x0274, 0x20a9, + 0x0004, 0x0096, 0x2b48, 0x2019, 0x0006, 0x080c, 0xb017, 0x009e, 0x015e, 0x003e, 0x002e, 0x001e, 0x00fe, 0x00be, 0x0005, 0x00b6, 0x0006, 0x0016, 0x0026, 0x0036, 0x0156, 0x2011, 0x0263, 0x2204, - 0x8211, 0x220c, 0x080c, 0x276e, 0x11d0, 0x080c, 0x649f, 0x11b8, + 0x8211, 0x220c, 0x080c, 0x266d, 0x11d0, 0x080c, 0x63a3, 0x11b8, 0x2011, 0x0276, 0x20a9, 0x0004, 0x0096, 0x2b48, 0x2019, 0x000a, - 0x080c, 0xb0d0, 0x009e, 0x1158, 0x2011, 0x027a, 0x20a9, 0x0004, - 0x0096, 0x2b48, 0x2019, 0x0006, 0x080c, 0xb0d0, 0x009e, 0x015e, + 0x080c, 0xb017, 0x009e, 0x1158, 0x2011, 0x027a, 0x20a9, 0x0004, + 0x0096, 0x2b48, 0x2019, 0x0006, 0x080c, 0xb017, 0x009e, 0x015e, 0x003e, 0x002e, 0x001e, 0x000e, 0x00be, 0x0005, 0x00e6, 0x00c6, 0x0086, 0x0076, 0x0066, 0x0056, 0x0046, 0x0026, 0x0126, 0x2091, - 0x8000, 0x2740, 0x2029, 0x19c8, 0x252c, 0x2021, 0x19ce, 0x2424, + 0x8000, 0x2740, 0x2029, 0x19cb, 0x252c, 0x2021, 0x19d1, 0x2424, 0x2061, 0x1cd0, 0x2071, 0x1800, 0x7650, 0x7070, 0x81ff, 0x0150, - 0x0006, 0x9186, 0x1a8a, 0x000e, 0x0128, 0x8001, 0x9602, 0x1a04, - 0xd68f, 0x0018, 0x9606, 0x0904, 0xd68f, 0x2100, 0x9c06, 0x0904, - 0xd686, 0x080c, 0xd8c6, 0x1904, 0xd686, 0x080c, 0xdbb3, 0x0904, - 0xd686, 0x080c, 0xd8b6, 0x0904, 0xd686, 0x6720, 0x9786, 0x0001, - 0x1148, 0x080c, 0x32df, 0x0904, 0xd6aa, 0x6004, 0x9086, 0x0000, - 0x1904, 0xd6aa, 0x9786, 0x0004, 0x0904, 0xd6aa, 0x9786, 0x0007, - 0x0904, 0xd686, 0x2500, 0x9c06, 0x0904, 0xd686, 0x2400, 0x9c06, - 0x05e8, 0x88ff, 0x0118, 0x6054, 0x9906, 0x15c0, 0x0096, 0x6000, - 0x9086, 0x0004, 0x1120, 0x0016, 0x080c, 0x19b4, 0x001e, 0x9786, - 0x000a, 0x0148, 0x080c, 0xc03f, 0x1130, 0x080c, 0xaa81, 0x009e, - 0x080c, 0xa113, 0x0418, 0x6014, 0x2048, 0x080c, 0xbe37, 0x01d8, - 0x9786, 0x0003, 0x1570, 0xa867, 0x0103, 0xa87c, 0xd0cc, 0x0130, - 0x0096, 0xa878, 0x2048, 0x080c, 0x0fe3, 0x009e, 0xab7a, 0xa877, - 0x0000, 0x080c, 0xdb2e, 0x0016, 0x080c, 0xc12d, 0x080c, 0x6adc, - 0x001e, 0x080c, 0xc022, 0x009e, 0x080c, 0xa113, 0x9ce0, 0x0018, - 0x2001, 0x1819, 0x2004, 0x9c02, 0x1210, 0x0804, 0xd60a, 0x012e, - 0x002e, 0x004e, 0x005e, 0x006e, 0x007e, 0x008e, 0x00ce, 0x00ee, - 0x0005, 0x9786, 0x0006, 0x1150, 0x9386, 0x0005, 0x0128, 0x080c, - 0xdb2e, 0x080c, 0xd830, 0x08f8, 0x009e, 0x0c00, 0x9786, 0x000a, - 0x0968, 0x0808, 0x81ff, 0x09d0, 0x9180, 0x0001, 0x2004, 0x9086, - 0x0018, 0x0130, 0x9180, 0x0001, 0x2004, 0x9086, 0x002d, 0x1970, - 0x6000, 0x9086, 0x0002, 0x1950, 0x080c, 0xc02e, 0x0130, 0x080c, - 0xc03f, 0x1920, 0x080c, 0xaa81, 0x0038, 0x080c, 0x31b4, 0x080c, - 0xc03f, 0x1110, 0x080c, 0xaa81, 0x080c, 0xa113, 0x0804, 0xd686, - 0xa864, 0x9084, 0x00ff, 0x9086, 0x0039, 0x0005, 0x00c6, 0x00e6, - 0x0016, 0x2c08, 0x2170, 0x9006, 0x080c, 0xd857, 0x001e, 0x0120, - 0x6020, 0x9084, 0x000f, 0x001b, 0x00ee, 0x00ce, 0x0005, 0xd6f5, - 0xd6f5, 0xd6f5, 0xd6f5, 0xd6f5, 0xd6f5, 0xd6f7, 0xd6f5, 0xd6f5, - 0xd6f5, 0xd6f5, 0xa113, 0xa113, 0xd6f5, 0x9006, 0x0005, 0x0036, - 0x0046, 0x0016, 0x7010, 0x00b6, 0x2058, 0xbca0, 0x00be, 0x2c00, - 0x2009, 0x0020, 0x080c, 0xd885, 0x001e, 0x004e, 0x2019, 0x0002, - 0x080c, 0xd440, 0x003e, 0x9085, 0x0001, 0x0005, 0x0096, 0x080c, - 0xbe37, 0x0140, 0x6014, 0x904d, 0x080c, 0xba56, 0x687b, 0x0005, - 0x080c, 0x6ae9, 0x009e, 0x080c, 0xa113, 0x9085, 0x0001, 0x0005, - 0x2001, 0x0001, 0x080c, 0x63dc, 0x0156, 0x0016, 0x0026, 0x0036, - 0x20a9, 0x0004, 0x2019, 0x1805, 0x2011, 0x0276, 0x080c, 0xb0bc, - 0x003e, 0x002e, 0x001e, 0x015e, 0x9005, 0x0005, 0x00f6, 0x00e6, - 0x00c6, 0x0086, 0x0076, 0x0066, 0x00b6, 0x0126, 0x2091, 0x8000, - 0x2740, 0x2061, 0x1cd0, 0x2079, 0x0001, 0x8fff, 0x0904, 0xd790, - 0x2071, 0x1800, 0x7650, 0x7070, 0x8001, 0x9602, 0x1a04, 0xd790, - 0x88ff, 0x0120, 0x2800, 0x9c06, 0x1590, 0x2078, 0x080c, 0xd8b6, - 0x0570, 0x2400, 0x9c06, 0x0558, 0x6720, 0x9786, 0x0006, 0x1538, - 0x9786, 0x0007, 0x0520, 0x88ff, 0x1140, 0x6010, 0x9b06, 0x11f8, - 0x85ff, 0x0118, 0x6054, 0x9106, 0x11d0, 0x0096, 0x601c, 0xd084, - 0x0140, 0x080c, 0xdae2, 0x080c, 0xc551, 0x080c, 0x19b4, 0x6023, - 0x0007, 0x6014, 0x2048, 0x080c, 0xbe37, 0x0120, 0x0046, 0x080c, - 0xd830, 0x004e, 0x009e, 0x080c, 0xa113, 0x88ff, 0x1198, 0x9ce0, - 0x0018, 0x2001, 0x1819, 0x2004, 0x9c02, 0x1210, 0x0804, 0xd745, - 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, 0x9a58, 0x009e, 0x008e, 0x903e, - 0x080c, 0x9b03, 0x080c, 0xd736, 0x005e, 0x007e, 0x00be, 0x0005, - 0x00b6, 0x0046, 0x0056, 0x0076, 0x00c6, 0x0156, 0x2c20, 0x2128, - 0x20a9, 0x007f, 0x900e, 0x0016, 0x0036, 0x080c, 0x649f, 0x1190, - 0x0056, 0x0086, 0x9046, 0x2508, 0x2029, 0x0001, 0x0096, 0x904e, - 0x080c, 0x9a58, 0x009e, 0x008e, 0x903e, 0x080c, 0x9b03, 0x080c, - 0xd736, 0x005e, 0x003e, 0x001e, 0x8108, 0x1f04, 0xd7c3, 0x015e, - 0x00ce, 0x007e, 0x005e, 0x004e, 0x00be, 0x0005, 0x00b6, 0x0076, - 0x0056, 0x6210, 0x2258, 0x0086, 0x9046, 0x2029, 0x0001, 0x2019, - 0x0048, 0x0096, 0x904e, 0x080c, 0x9a58, 0x009e, 0x008e, 0x903e, - 0x080c, 0x9b03, 0x2c20, 0x080c, 0xd736, 0x005e, 0x007e, 0x00be, + 0x0006, 0x9186, 0x1a88, 0x000e, 0x0128, 0x8001, 0x9602, 0x1a04, + 0xd5f0, 0x0018, 0x9606, 0x0904, 0xd5f0, 0x2100, 0x9c06, 0x0904, + 0xd5e7, 0x6720, 0x9786, 0x0007, 0x0904, 0xd5e7, 0x080c, 0xd878, + 0x1904, 0xd5e7, 0x080c, 0xdb67, 0x0904, 0xd5e7, 0x080c, 0xd868, + 0x0904, 0xd5e7, 0x6720, 0x9786, 0x0001, 0x1148, 0x080c, 0x31e9, + 0x0904, 0xd60b, 0x6004, 0x9086, 0x0000, 0x1904, 0xd60b, 0x9786, + 0x0004, 0x0904, 0xd60b, 0x2500, 0x9c06, 0x0904, 0xd5e7, 0x2400, + 0x9c06, 0x05e8, 0x88ff, 0x0118, 0x6054, 0x9906, 0x15c0, 0x0096, + 0x6000, 0x9086, 0x0004, 0x1120, 0x0016, 0x080c, 0x192c, 0x001e, + 0x9786, 0x000a, 0x0148, 0x080c, 0xbf56, 0x1130, 0x080c, 0xa9a7, + 0x009e, 0x080c, 0xa01c, 0x0418, 0x6014, 0x2048, 0x080c, 0xbd4e, + 0x01d8, 0x9786, 0x0003, 0x1570, 0xa867, 0x0103, 0xa87c, 0xd0cc, + 0x0130, 0x0096, 0xa878, 0x2048, 0x080c, 0x0fe9, 0x009e, 0xab7a, + 0xa877, 0x0000, 0x080c, 0xdae1, 0x0016, 0x080c, 0xc044, 0x080c, + 0x6a15, 0x001e, 0x080c, 0xbf39, 0x009e, 0x080c, 0xa01c, 0x9ce0, + 0x0018, 0x2001, 0x1819, 0x2004, 0x9c02, 0x1210, 0x0804, 0xd56a, + 0x012e, 0x002e, 0x004e, 0x005e, 0x006e, 0x007e, 0x008e, 0x00ce, + 0x00ee, 0x0005, 0x9786, 0x0006, 0x1150, 0x9386, 0x0005, 0x0128, + 0x080c, 0xdae1, 0x080c, 0xd7e2, 0x08f8, 0x009e, 0x0c00, 0x9786, + 0x000a, 0x0968, 0x0808, 0x81ff, 0x09d0, 0x9180, 0x0001, 0x2004, + 0x9086, 0x0018, 0x0130, 0x9180, 0x0001, 0x2004, 0x9086, 0x002d, + 0x1970, 0x6000, 0x9086, 0x0002, 0x1950, 0x080c, 0xbf45, 0x0130, + 0x080c, 0xbf56, 0x1920, 0x080c, 0xa9a7, 0x0038, 0x080c, 0x30be, + 0x080c, 0xbf56, 0x1110, 0x080c, 0xa9a7, 0x080c, 0xa01c, 0x0804, + 0xd5e7, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0039, 0x0005, 0x00c6, + 0x00e6, 0x0016, 0x2c08, 0x2170, 0x9006, 0x080c, 0xd809, 0x001e, + 0x0120, 0x6020, 0x9084, 0x000f, 0x001b, 0x00ee, 0x00ce, 0x0005, + 0xd656, 0xd656, 0xd656, 0xd656, 0xd656, 0xd656, 0xd658, 0xd656, + 0xd656, 0xd656, 0xd681, 0xa01c, 0xa01c, 0xd656, 0x9006, 0x0005, + 0x0036, 0x0046, 0x0016, 0x7010, 0x00b6, 0x2058, 0xbca0, 0x00be, + 0x2c00, 0x2009, 0x0020, 0x080c, 0xd837, 0x001e, 0x004e, 0x2019, + 0x0002, 0x080c, 0xd38f, 0x003e, 0x9085, 0x0001, 0x0005, 0x0096, + 0x080c, 0xbd4e, 0x0140, 0x6014, 0x904d, 0x080c, 0xb983, 0x687b, + 0x0005, 0x080c, 0x6a22, 0x009e, 0x080c, 0xa01c, 0x9085, 0x0001, + 0x0005, 0x0019, 0x9085, 0x0001, 0x0005, 0x6000, 0x908a, 0x0010, + 0x1a0c, 0x0df6, 0x000b, 0x0005, 0xd69c, 0xd69c, 0xd6b3, 0xd6a3, + 0xd6c2, 0xd69c, 0xd69c, 0xd69e, 0xd69c, 0xd69c, 0xd69c, 0xd69c, + 0xd69c, 0xd69c, 0xd69c, 0xd69c, 0x080c, 0x0df6, 0x080c, 0xa01c, + 0x9085, 0x0001, 0x0005, 0x0036, 0x00e6, 0x2071, 0x19c2, 0x703c, + 0x9c06, 0x1128, 0x2019, 0x0001, 0x080c, 0x98b1, 0x0010, 0x080c, + 0x9a8f, 0x00ee, 0x003e, 0x0096, 0x00d6, 0x6014, 0x2048, 0xa87b, + 0x0005, 0x080c, 0x6a22, 0x080c, 0xa01c, 0x00de, 0x009e, 0x9085, + 0x0001, 0x0005, 0x601c, 0xd084, 0x190c, 0x192c, 0x0c60, 0x2001, + 0x0001, 0x080c, 0x62e0, 0x0156, 0x0016, 0x0026, 0x0036, 0x20a9, + 0x0004, 0x2019, 0x1805, 0x2011, 0x0276, 0x080c, 0xb003, 0x003e, + 0x002e, 0x001e, 0x015e, 0x9005, 0x0005, 0x00f6, 0x00e6, 0x00c6, + 0x0086, 0x0076, 0x0066, 0x00b6, 0x0126, 0x2091, 0x8000, 0x2740, + 0x2061, 0x1cd0, 0x2079, 0x0001, 0x8fff, 0x0904, 0xd739, 0x2071, + 0x1800, 0x7650, 0x7070, 0x8001, 0x9602, 0x1a04, 0xd739, 0x88ff, + 0x0120, 0x2800, 0x9c06, 0x15a0, 0x2078, 0x080c, 0xd868, 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, 0xda94, 0x080c, 0xc471, 0x080c, 0x192c, + 0x6023, 0x0007, 0x6014, 0x2048, 0x080c, 0xbd4e, 0x0120, 0x0046, + 0x080c, 0xd7e2, 0x004e, 0x009e, 0x080c, 0xa01c, 0x88ff, 0x1198, + 0x9ce0, 0x0018, 0x2001, 0x1819, 0x2004, 0x9c02, 0x1210, 0x0804, + 0xd6ec, 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, 0x995f, 0x009e, 0x008e, + 0x903e, 0x080c, 0x9a0a, 0x080c, 0xd6dd, 0x005e, 0x007e, 0x00be, 0x0005, 0x00b6, 0x0046, 0x0056, 0x0076, 0x00c6, 0x0156, 0x2c20, - 0x20a9, 0x0800, 0x900e, 0x0016, 0x0036, 0x080c, 0x649f, 0x11a0, - 0x0086, 0x9046, 0x2828, 0x0046, 0x2021, 0x0001, 0x080c, 0xdac6, - 0x004e, 0x0096, 0x904e, 0x080c, 0x9a58, 0x009e, 0x008e, 0x903e, - 0x080c, 0x9b03, 0x080c, 0xd736, 0x003e, 0x001e, 0x8108, 0x1f04, - 0xd80b, 0x015e, 0x00ce, 0x007e, 0x005e, 0x004e, 0x00be, 0x0005, - 0x0016, 0x00f6, 0x080c, 0xbe35, 0x0198, 0xa864, 0x9084, 0x00ff, - 0x9086, 0x0046, 0x0180, 0xa800, 0x907d, 0x0138, 0xa803, 0x0000, - 0xab82, 0x080c, 0x6ae9, 0x2f48, 0x0cb0, 0xab82, 0x080c, 0x6ae9, - 0x00fe, 0x001e, 0x0005, 0xa800, 0x907d, 0x0130, 0xa803, 0x0000, - 0x080c, 0x6ae9, 0x2f48, 0x0cb8, 0x080c, 0x6ae9, 0x0c88, 0x00e6, - 0x0046, 0x0036, 0x2061, 0x1cd0, 0x9005, 0x1138, 0x2071, 0x1800, - 0x7450, 0x7070, 0x8001, 0x9402, 0x12d8, 0x2100, 0x9c06, 0x0168, - 0x6000, 0x9086, 0x0000, 0x0148, 0x6008, 0x9206, 0x1130, 0x6010, - 0x91a0, 0x0004, 0x2424, 0x9406, 0x0140, 0x9ce0, 0x0018, 0x2001, - 0x1819, 0x2004, 0x9c02, 0x1220, 0x0c40, 0x9085, 0x0001, 0x0008, - 0x9006, 0x003e, 0x004e, 0x00ee, 0x0005, 0x0096, 0x0006, 0x080c, - 0x1031, 0x000e, 0x090c, 0x0dfa, 0xaae2, 0xa867, 0x010d, 0xa88e, - 0x0026, 0x2010, 0x080c, 0xbe25, 0x2001, 0x0000, 0x0120, 0x2200, - 0x9080, 0x0015, 0x2004, 0x002e, 0xa87a, 0x9186, 0x0020, 0x0110, - 0xa8e3, 0xffff, 0xa986, 0xac76, 0xa87f, 0x0000, 0x2001, 0x1966, - 0x2004, 0xa882, 0x9006, 0xa802, 0xa86a, 0xa88a, 0x0126, 0x2091, - 0x8000, 0x080c, 0x6ae9, 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, 0x195f, 0x2004, - 0x601a, 0x080c, 0x8679, 0x080c, 0x8c10, 0x001e, 0x0005, 0xa001, - 0xa001, 0x0005, 0x6024, 0xd0e4, 0x0158, 0xd0cc, 0x0118, 0x080c, - 0xc171, 0x0030, 0x080c, 0xdae2, 0x080c, 0x84a6, 0x080c, 0xa0e3, - 0x0005, 0x9280, 0x0008, 0x2004, 0x9084, 0x000f, 0x0002, 0xd915, - 0xd915, 0xd915, 0xd917, 0xd915, 0xd917, 0xd917, 0xd915, 0xd917, - 0xd915, 0xd915, 0xd915, 0xd915, 0xd915, 0x9006, 0x0005, 0x9085, - 0x0001, 0x0005, 0x9280, 0x0008, 0x2004, 0x9084, 0x000f, 0x0002, - 0xd92e, 0xd92e, 0xd92e, 0xd92e, 0xd92e, 0xd92e, 0xd93b, 0xd92e, - 0xd92e, 0xd92e, 0xd92e, 0xd92e, 0xd92e, 0xd92e, 0x6007, 0x003b, - 0x602f, 0x0009, 0x6017, 0x2a00, 0x6003, 0x0001, 0x080c, 0x8679, - 0x080c, 0x8c10, 0x0005, 0x0096, 0x00c6, 0x2260, 0x080c, 0xdae2, - 0x6043, 0x0000, 0x6024, 0xc0f4, 0xc0e4, 0x6026, 0x603b, 0x0000, - 0x00ce, 0x00d6, 0x2268, 0x9186, 0x0007, 0x1904, 0xd994, 0x6814, - 0x9005, 0x0138, 0x2048, 0xa87c, 0xd0fc, 0x1118, 0x00de, 0x009e, - 0x08a8, 0x6007, 0x003a, 0x6003, 0x0001, 0x080c, 0x8679, 0x080c, - 0x8c10, 0x00c6, 0x2d60, 0x6100, 0x9186, 0x0002, 0x1904, 0xda0b, - 0x6014, 0x9005, 0x1138, 0x6000, 0x9086, 0x0007, 0x190c, 0x0dfa, - 0x0804, 0xda0b, 0x2048, 0x080c, 0xbe37, 0x1130, 0x0028, 0x2048, - 0xa800, 0x9005, 0x1de0, 0x2900, 0x2048, 0xa87c, 0x9084, 0x0003, - 0x9086, 0x0002, 0x1168, 0xa87c, 0xc0dc, 0xc0f4, 0xa87e, 0xa880, - 0xc0fc, 0xa882, 0x2009, 0x0043, 0x080c, 0xd294, 0x0804, 0xda0b, - 0x2009, 0x0041, 0x0804, 0xda05, 0x9186, 0x0005, 0x15a0, 0x6814, - 0x2048, 0xa87c, 0xd0bc, 0x1120, 0x00de, 0x009e, 0x0804, 0xd92e, - 0xd0b4, 0x0128, 0xd0fc, 0x090c, 0x0dfa, 0x0804, 0xd94f, 0x6007, - 0x003a, 0x6003, 0x0001, 0x080c, 0x8679, 0x080c, 0x8c10, 0x00c6, - 0x2d60, 0x6100, 0x9186, 0x0002, 0x0120, 0x9186, 0x0004, 0x1904, - 0xda0b, 0x6814, 0x2048, 0xa97c, 0xc1f4, 0xc1dc, 0xa97e, 0xa980, - 0xc1fc, 0xc1bc, 0xa982, 0x00f6, 0x2c78, 0x080c, 0x16db, 0x00fe, - 0x2009, 0x0042, 0x04d0, 0x0036, 0x080c, 0x1031, 0x090c, 0x0dfa, - 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, 0x6ae9, 0x2019, 0x0045, 0x6008, 0x2068, - 0x080c, 0xd440, 0x2d00, 0x600a, 0x6023, 0x0006, 0x6003, 0x0007, - 0x901e, 0x631a, 0x6342, 0x003e, 0x0038, 0x6043, 0x0000, 0x6003, - 0x0007, 0x080c, 0xd294, 0x00ce, 0x00de, 0x009e, 0x0005, 0x9186, - 0x0013, 0x1128, 0x6004, 0x9082, 0x0085, 0x2008, 0x00c2, 0x9186, - 0x0027, 0x1178, 0x080c, 0x8b04, 0x0036, 0x0096, 0x6014, 0x2048, - 0x2019, 0x0004, 0x080c, 0xd830, 0x009e, 0x003e, 0x080c, 0x8c10, - 0x0005, 0x9186, 0x0014, 0x0d70, 0x080c, 0xa178, 0x0005, 0xda3e, - 0xda3c, 0xda3c, 0xda3c, 0xda3c, 0xda3c, 0xda3e, 0xda3c, 0xda3c, - 0xda3c, 0xda3c, 0xda3c, 0xda3c, 0x080c, 0x0dfa, 0x080c, 0x8b04, - 0x6003, 0x000c, 0x080c, 0x8c10, 0x0005, 0x9182, 0x0092, 0x1220, - 0x9182, 0x0085, 0x0208, 0x001a, 0x080c, 0xa178, 0x0005, 0xda5c, - 0xda5c, 0xda5c, 0xda5c, 0xda5e, 0xda7e, 0xda5c, 0xda5c, 0xda5c, - 0xda5c, 0xda5c, 0xda5c, 0xda5c, 0x080c, 0x0dfa, 0x00d6, 0x2c68, - 0x080c, 0xa08d, 0x01b0, 0x6003, 0x0001, 0x6007, 0x001e, 0x2009, - 0x026e, 0x210c, 0x613a, 0x2009, 0x026f, 0x210c, 0x613e, 0x600b, - 0xffff, 0x6910, 0x6112, 0x6023, 0x0004, 0x080c, 0x8679, 0x080c, - 0x8c10, 0x2d60, 0x080c, 0xa0e3, 0x00de, 0x0005, 0x080c, 0xa0e3, - 0x0005, 0x00e6, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0ec, - 0x00ee, 0x0005, 0x2009, 0x187b, 0x210c, 0xd1ec, 0x05b0, 0x6003, - 0x0002, 0x6024, 0xc0e5, 0x6026, 0xd0cc, 0x0150, 0x2001, 0x1960, - 0x2004, 0x6042, 0x2009, 0x187b, 0x210c, 0xd1f4, 0x1520, 0x00a0, - 0x2009, 0x187b, 0x210c, 0xd1f4, 0x0128, 0x6024, 0xc0e4, 0x6026, - 0x9006, 0x00d8, 0x2001, 0x1960, 0x200c, 0x2001, 0x195e, 0x2004, - 0x9100, 0x9080, 0x000a, 0x6042, 0x6010, 0x00b6, 0x2058, 0xb8ac, - 0x00be, 0x0008, 0x2104, 0x9005, 0x0118, 0x9088, 0x0003, 0x0cd0, - 0x2c0a, 0x600f, 0x0000, 0x9085, 0x0001, 0x0005, 0x0016, 0x00c6, - 0x00e6, 0x6154, 0xb8ac, 0x2060, 0x8cff, 0x0180, 0x84ff, 0x1118, - 0x6054, 0x9106, 0x1138, 0x600c, 0x2072, 0x080c, 0x84a6, 0x080c, - 0xa0e3, 0x0010, 0x9cf0, 0x0003, 0x2e64, 0x0c70, 0x00ee, 0x00ce, - 0x001e, 0x0005, 0x00d6, 0x00b6, 0x6010, 0x2058, 0xb8ac, 0x2068, - 0x9005, 0x0130, 0x9c06, 0x0110, 0x680c, 0x0cd0, 0x600c, 0x680e, - 0x00be, 0x00de, 0x0005, 0x0026, 0x0036, 0x0156, 0x2011, 0x182b, - 0x2204, 0x9084, 0x00ff, 0x2019, 0x026e, 0x2334, 0x9636, 0x1508, - 0x8318, 0x2334, 0x2204, 0x9084, 0xff00, 0x9636, 0x11d0, 0x2011, - 0x0270, 0x20a9, 0x0004, 0x6010, 0x0096, 0x2048, 0x2019, 0x000a, - 0x080c, 0xb0d0, 0x009e, 0x1168, 0x2011, 0x0274, 0x20a9, 0x0004, - 0x6010, 0x0096, 0x2048, 0x2019, 0x0006, 0x080c, 0xb0d0, 0x009e, - 0x1100, 0x015e, 0x003e, 0x002e, 0x0005, 0x00e6, 0x2071, 0x1800, - 0x080c, 0x5ebe, 0x080c, 0x2f6c, 0x00ee, 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, 0x19c8, 0x252c, 0x2021, 0x19ce, 0x2424, 0x2061, - 0x1cd0, 0x2071, 0x1800, 0x7650, 0x7070, 0x9606, 0x0578, 0x6720, - 0x9786, 0x0001, 0x0118, 0x9786, 0x0008, 0x1500, 0x2500, 0x9c06, - 0x01e8, 0x2400, 0x9c06, 0x01d0, 0x080c, 0xd8b6, 0x01b8, 0x080c, - 0xd8c6, 0x11a0, 0x6000, 0x9086, 0x0004, 0x1120, 0x0016, 0x080c, - 0x19b4, 0x001e, 0x080c, 0xc02e, 0x1110, 0x080c, 0x31b4, 0x080c, - 0xc03f, 0x1110, 0x080c, 0xaa81, 0x080c, 0xa113, 0x9ce0, 0x0018, - 0x2001, 0x1819, 0x2004, 0x9c02, 0x1208, 0x0858, 0x012e, 0x001e, - 0x002e, 0x004e, 0x005e, 0x006e, 0x007e, 0x00ce, 0x00de, 0x00ee, - 0x0005, 0x2001, 0x1810, 0x2004, 0xd0dc, 0x0005, 0x0006, 0x2001, - 0x1836, 0x2004, 0xd09c, 0x000e, 0x0005, 0x0006, 0x0036, 0x0046, - 0x080c, 0xc539, 0x0168, 0x2019, 0xffff, 0x9005, 0x0128, 0x6010, - 0x00b6, 0x2058, 0xbba0, 0x00be, 0x2021, 0x0004, 0x080c, 0x4cbc, - 0x004e, 0x003e, 0x000e, 0x6004, 0x9086, 0x0001, 0x1128, 0x080c, - 0x9bc9, 0x080c, 0xa113, 0x9006, 0x0005, 0x00e6, 0x00c6, 0x00b6, - 0x0046, 0x2061, 0x1cd0, 0x2071, 0x1800, 0x7450, 0x7070, 0x8001, - 0x9402, 0x12d8, 0x2100, 0x9c06, 0x0168, 0x6000, 0x9086, 0x0000, - 0x0148, 0x6010, 0x2058, 0xb8a0, 0x9206, 0x1120, 0x6004, 0x9086, - 0x0002, 0x0140, 0x9ce0, 0x0018, 0x2001, 0x1819, 0x2004, 0x9c02, - 0x1220, 0x0c40, 0x9085, 0x0001, 0x0008, 0x9006, 0x004e, 0x00be, - 0x00ce, 0x00ee, 0x0005, 0x0126, 0x0006, 0x00e6, 0x0016, 0x2091, + 0x2128, 0x20a9, 0x007f, 0x900e, 0x0016, 0x0036, 0x080c, 0x63a3, + 0x1180, 0x0056, 0x0086, 0x9046, 0x2508, 0x2029, 0x0001, 0x0096, + 0x904e, 0x080c, 0x995f, 0x009e, 0x008e, 0x903e, 0x080c, 0x9a0a, + 0x005e, 0x003e, 0x001e, 0x8108, 0x1f04, 0xd76c, 0x0036, 0x2508, + 0x2029, 0x0003, 0x080c, 0xd6dd, 0x003e, 0x015e, 0x00ce, 0x007e, + 0x005e, 0x004e, 0x00be, 0x0005, 0x00b6, 0x0076, 0x0056, 0x6210, + 0x2258, 0x0086, 0x9046, 0x2029, 0x0001, 0x2019, 0x0048, 0x0096, + 0x904e, 0x080c, 0x995f, 0x009e, 0x008e, 0x903e, 0x080c, 0x9a0a, + 0x2c20, 0x080c, 0xd6dd, 0x005e, 0x007e, 0x00be, 0x0005, 0x00b6, + 0x0046, 0x0056, 0x0076, 0x00c6, 0x0156, 0x2c20, 0x20a9, 0x0800, + 0x900e, 0x0016, 0x0036, 0x080c, 0x63a3, 0x1190, 0x0086, 0x9046, + 0x2828, 0x0046, 0x2021, 0x0001, 0x080c, 0xda78, 0x004e, 0x0096, + 0x904e, 0x080c, 0x995f, 0x009e, 0x008e, 0x903e, 0x080c, 0x9a0a, + 0x003e, 0x001e, 0x8108, 0x1f04, 0xd7b9, 0x0036, 0x2029, 0x0002, + 0x080c, 0xd6dd, 0x003e, 0x015e, 0x00ce, 0x007e, 0x005e, 0x004e, + 0x00be, 0x0005, 0x0016, 0x00f6, 0x080c, 0xbd4c, 0x0198, 0xa864, + 0x9084, 0x00ff, 0x9086, 0x0046, 0x0180, 0xa800, 0x907d, 0x0138, + 0xa803, 0x0000, 0xab82, 0x080c, 0x6a22, 0x2f48, 0x0cb0, 0xab82, + 0x080c, 0x6a22, 0x00fe, 0x001e, 0x0005, 0xa800, 0x907d, 0x0130, + 0xa803, 0x0000, 0x080c, 0x6a22, 0x2f48, 0x0cb8, 0x080c, 0x6a22, + 0x0c88, 0x00e6, 0x0046, 0x0036, 0x2061, 0x1cd0, 0x9005, 0x1138, + 0x2071, 0x1800, 0x7450, 0x7070, 0x8001, 0x9402, 0x12d8, 0x2100, + 0x9c06, 0x0168, 0x6000, 0x9086, 0x0000, 0x0148, 0x6008, 0x9206, + 0x1130, 0x6010, 0x91a0, 0x0004, 0x2424, 0x9406, 0x0140, 0x9ce0, + 0x0018, 0x2001, 0x1819, 0x2004, 0x9c02, 0x1220, 0x0c40, 0x9085, + 0x0001, 0x0008, 0x9006, 0x003e, 0x004e, 0x00ee, 0x0005, 0x0096, + 0x0006, 0x080c, 0x1037, 0x000e, 0x090c, 0x0df6, 0xaae2, 0xa867, + 0x010d, 0xa88e, 0x0026, 0x2010, 0x080c, 0xbd3c, 0x2001, 0x0000, + 0x0120, 0x2200, 0x9080, 0x0015, 0x2004, 0x002e, 0xa87a, 0x9186, + 0x0020, 0x0110, 0xa8e3, 0xffff, 0xa986, 0xac76, 0xa87f, 0x0000, + 0x2001, 0x1968, 0x2004, 0xa882, 0x9006, 0xa802, 0xa86a, 0xa88a, + 0x0126, 0x2091, 0x8000, 0x080c, 0x6a22, 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, + 0x1961, 0x2004, 0x601a, 0x080c, 0x85f8, 0x080c, 0x8b8f, 0x001e, + 0x0005, 0xa001, 0xa001, 0x0005, 0x6024, 0xd0e4, 0x0158, 0xd0cc, + 0x0118, 0x080c, 0xc088, 0x0030, 0x080c, 0xda94, 0x080c, 0x8425, + 0x080c, 0x9fea, 0x0005, 0x9280, 0x0008, 0x2004, 0x9084, 0x000f, + 0x0002, 0xd8c7, 0xd8c7, 0xd8c7, 0xd8c9, 0xd8c7, 0xd8c9, 0xd8c9, + 0xd8c7, 0xd8c9, 0xd8c7, 0xd8c7, 0xd8c7, 0xd8c7, 0xd8c7, 0x9006, + 0x0005, 0x9085, 0x0001, 0x0005, 0x9280, 0x0008, 0x2004, 0x9084, + 0x000f, 0x0002, 0xd8e0, 0xd8e0, 0xd8e0, 0xd8e0, 0xd8e0, 0xd8e0, + 0xd8ed, 0xd8e0, 0xd8e0, 0xd8e0, 0xd8e0, 0xd8e0, 0xd8e0, 0xd8e0, + 0x6007, 0x003b, 0x602f, 0x0009, 0x6017, 0x2a00, 0x6003, 0x0001, + 0x080c, 0x85f8, 0x080c, 0x8b8f, 0x0005, 0x0096, 0x00c6, 0x2260, + 0x080c, 0xda94, 0x6043, 0x0000, 0x6024, 0xc0f4, 0xc0e4, 0x6026, + 0x603b, 0x0000, 0x00ce, 0x00d6, 0x2268, 0x9186, 0x0007, 0x1904, + 0xd946, 0x6814, 0x9005, 0x0138, 0x2048, 0xa87c, 0xd0fc, 0x1118, + 0x00de, 0x009e, 0x08a8, 0x6007, 0x003a, 0x6003, 0x0001, 0x080c, + 0x85f8, 0x080c, 0x8b8f, 0x00c6, 0x2d60, 0x6100, 0x9186, 0x0002, + 0x1904, 0xd9bd, 0x6014, 0x9005, 0x1138, 0x6000, 0x9086, 0x0007, + 0x190c, 0x0df6, 0x0804, 0xd9bd, 0x2048, 0x080c, 0xbd4e, 0x1130, + 0x0028, 0x2048, 0xa800, 0x9005, 0x1de0, 0x2900, 0x2048, 0xa87c, + 0x9084, 0x0003, 0x9086, 0x0002, 0x1168, 0xa87c, 0xc0dc, 0xc0f4, + 0xa87e, 0xa880, 0xc0fc, 0xa882, 0x2009, 0x0043, 0x080c, 0xd1e3, + 0x0804, 0xd9bd, 0x2009, 0x0041, 0x0804, 0xd9b7, 0x9186, 0x0005, + 0x15a0, 0x6814, 0x2048, 0xa87c, 0xd0bc, 0x1120, 0x00de, 0x009e, + 0x0804, 0xd8e0, 0xd0b4, 0x0128, 0xd0fc, 0x090c, 0x0df6, 0x0804, + 0xd901, 0x6007, 0x003a, 0x6003, 0x0001, 0x080c, 0x85f8, 0x080c, + 0x8b8f, 0x00c6, 0x2d60, 0x6100, 0x9186, 0x0002, 0x0120, 0x9186, + 0x0004, 0x1904, 0xd9bd, 0x6814, 0x2048, 0xa97c, 0xc1f4, 0xc1dc, + 0xa97e, 0xa980, 0xc1fc, 0xc1bc, 0xa982, 0x00f6, 0x2c78, 0x080c, + 0x1651, 0x00fe, 0x2009, 0x0042, 0x04d0, 0x0036, 0x080c, 0x1037, + 0x090c, 0x0df6, 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, 0x6a22, 0x2019, 0x0045, + 0x6008, 0x2068, 0x080c, 0xd38f, 0x2d00, 0x600a, 0x6023, 0x0006, + 0x6003, 0x0007, 0x901e, 0x631a, 0x6342, 0x003e, 0x0038, 0x6043, + 0x0000, 0x6003, 0x0007, 0x080c, 0xd1e3, 0x00ce, 0x00de, 0x009e, + 0x0005, 0x9186, 0x0013, 0x1128, 0x6004, 0x9082, 0x0085, 0x2008, + 0x00c2, 0x9186, 0x0027, 0x1178, 0x080c, 0x8a83, 0x0036, 0x0096, + 0x6014, 0x2048, 0x2019, 0x0004, 0x080c, 0xd7e2, 0x009e, 0x003e, + 0x080c, 0x8b8f, 0x0005, 0x9186, 0x0014, 0x0d70, 0x080c, 0xa083, + 0x0005, 0xd9f0, 0xd9ee, 0xd9ee, 0xd9ee, 0xd9ee, 0xd9ee, 0xd9f0, + 0xd9ee, 0xd9ee, 0xd9ee, 0xd9ee, 0xd9ee, 0xd9ee, 0x080c, 0x0df6, + 0x080c, 0x8a83, 0x6003, 0x000c, 0x080c, 0x8b8f, 0x0005, 0x9182, + 0x0092, 0x1220, 0x9182, 0x0085, 0x0208, 0x001a, 0x080c, 0xa083, + 0x0005, 0xda0e, 0xda0e, 0xda0e, 0xda0e, 0xda10, 0xda30, 0xda0e, + 0xda0e, 0xda0e, 0xda0e, 0xda0e, 0xda0e, 0xda0e, 0x080c, 0x0df6, + 0x00d6, 0x2c68, 0x080c, 0x9f94, 0x01b0, 0x6003, 0x0001, 0x6007, + 0x001e, 0x2009, 0x026e, 0x210c, 0x613a, 0x2009, 0x026f, 0x210c, + 0x613e, 0x600b, 0xffff, 0x6910, 0x6112, 0x6023, 0x0004, 0x080c, + 0x85f8, 0x080c, 0x8b8f, 0x2d60, 0x080c, 0x9fea, 0x00de, 0x0005, + 0x080c, 0x9fea, 0x0005, 0x00e6, 0x6010, 0x00b6, 0x2058, 0xb800, + 0x00be, 0xd0ec, 0x00ee, 0x0005, 0x2009, 0x187b, 0x210c, 0xd1ec, + 0x05b0, 0x6003, 0x0002, 0x6024, 0xc0e5, 0x6026, 0xd0cc, 0x0150, + 0x2001, 0x1962, 0x2004, 0x6042, 0x2009, 0x187b, 0x210c, 0xd1f4, + 0x1520, 0x00a0, 0x2009, 0x187b, 0x210c, 0xd1f4, 0x0128, 0x6024, + 0xc0e4, 0x6026, 0x9006, 0x00d8, 0x2001, 0x1962, 0x200c, 0x2001, + 0x1960, 0x2004, 0x9100, 0x9080, 0x000a, 0x6042, 0x6010, 0x00b6, + 0x2058, 0xb8ac, 0x00be, 0x0008, 0x2104, 0x9005, 0x0118, 0x9088, + 0x0003, 0x0cd0, 0x2c0a, 0x600f, 0x0000, 0x9085, 0x0001, 0x0005, + 0x0016, 0x00c6, 0x00e6, 0x6154, 0xb8ac, 0x2060, 0x8cff, 0x0180, + 0x84ff, 0x1118, 0x6054, 0x9106, 0x1138, 0x600c, 0x2072, 0x080c, + 0x8425, 0x080c, 0x9fea, 0x0010, 0x9cf0, 0x0003, 0x2e64, 0x0c70, + 0x00ee, 0x00ce, 0x001e, 0x0005, 0x00d6, 0x00b6, 0x6010, 0x2058, + 0xb8ac, 0x906d, 0x0130, 0x9c06, 0x0110, 0x680c, 0x0cd0, 0x600c, + 0x680e, 0x00be, 0x00de, 0x0005, 0x0026, 0x0036, 0x0156, 0x2011, + 0x182b, 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, 0xb017, 0x009e, 0x1168, 0x2011, + 0x0274, 0x20a9, 0x0004, 0x6010, 0x0096, 0x2048, 0x2019, 0x0006, + 0x080c, 0xb017, 0x009e, 0x1100, 0x015e, 0x003e, 0x002e, 0x0005, + 0x00e6, 0x2071, 0x1800, 0x080c, 0x5dc2, 0x080c, 0x2e73, 0x00ee, + 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, 0x19cb, 0x252c, 0x2021, + 0x19d1, 0x2424, 0x2061, 0x1cd0, 0x2071, 0x1800, 0x7650, 0x7070, + 0x9606, 0x0578, 0x6720, 0x9786, 0x0001, 0x0118, 0x9786, 0x0008, + 0x1500, 0x2500, 0x9c06, 0x01e8, 0x2400, 0x9c06, 0x01d0, 0x080c, + 0xd868, 0x01b8, 0x080c, 0xd878, 0x11a0, 0x6000, 0x9086, 0x0004, + 0x1120, 0x0016, 0x080c, 0x192c, 0x001e, 0x080c, 0xbf45, 0x1110, + 0x080c, 0x30be, 0x080c, 0xbf56, 0x1110, 0x080c, 0xa9a7, 0x080c, + 0xa01c, 0x9ce0, 0x0018, 0x2001, 0x1819, 0x2004, 0x9c02, 0x1208, + 0x0858, 0x012e, 0x001e, 0x002e, 0x004e, 0x005e, 0x006e, 0x007e, + 0x00ce, 0x00de, 0x00ee, 0x0005, 0x2001, 0x1810, 0x2004, 0xd0dc, + 0x0005, 0x0006, 0x2001, 0x1836, 0x2004, 0xd09c, 0x000e, 0x0005, + 0x0006, 0x0036, 0x0046, 0x080c, 0xc459, 0x0168, 0x2019, 0xffff, + 0x9005, 0x0128, 0x6010, 0x00b6, 0x2058, 0xbba0, 0x00be, 0x2021, + 0x0004, 0x080c, 0x4bb4, 0x004e, 0x003e, 0x000e, 0x0005, 0x6004, + 0x9086, 0x0001, 0x1128, 0x080c, 0x9ad0, 0x080c, 0xa01c, 0x9006, + 0x0005, 0x00e6, 0x00c6, 0x00b6, 0x0046, 0x2061, 0x1cd0, 0x2071, + 0x1800, 0x7450, 0x7070, 0x8001, 0x9402, 0x12d8, 0x2100, 0x9c06, + 0x0168, 0x6000, 0x9086, 0x0000, 0x0148, 0x6010, 0x2058, 0xb8a0, + 0x9206, 0x1120, 0x6004, 0x9086, 0x0002, 0x0140, 0x9ce0, 0x0018, + 0x2001, 0x1819, 0x2004, 0x9c02, 0x1220, 0x0c40, 0x9085, 0x0001, + 0x0008, 0x9006, 0x004e, 0x00be, 0x00ce, 0x00ee, 0x0005, 0x2001, + 0x1810, 0x2004, 0xd0a4, 0x0160, 0x2001, 0x1836, 0x2004, 0xd0a4, + 0x0138, 0x2001, 0x185c, 0x2004, 0xd0a4, 0x1118, 0x9085, 0x0001, + 0x0005, 0x9006, 0x0ce8, 0x0126, 0x0006, 0x00e6, 0x0016, 0x2091, 0x8000, 0x2071, 0x1840, 0xd5a4, 0x0118, 0x7054, 0x8000, 0x7056, 0xd5b4, 0x0118, 0x7050, 0x8000, 0x7052, 0xd5ac, 0x0178, 0x2500, 0x9084, 0x0007, 0x908e, 0x0003, 0x0148, 0x908e, 0x0004, 0x0130, @@ -6842,306 +6823,256 @@ unsigned short risc_code01[] = { 0x00e6, 0x2071, 0x1840, 0x0c99, 0x00ee, 0x0005, 0x00e6, 0x2071, 0x1844, 0x0c69, 0x00ee, 0x0005, 0x0126, 0x0006, 0x00e6, 0x2091, 0x8000, 0x2071, 0x1840, 0x7064, 0x8000, 0x7066, 0x00ee, 0x000e, - 0x012e, 0x0005, 0x0003, 0x000b, 0x04a6, 0x0000, 0xc000, 0x0001, + 0x012e, 0x0005, 0x0003, 0x000b, 0x03ce, 0x0000, 0xc000, 0x0001, 0x8064, 0x0008, 0x0010, 0x0000, 0x8066, 0x0000, 0x0101, 0x0008, 0x4407, 0x0003, 0x8060, 0x0000, 0x0400, 0x0000, 0x580d, 0x000b, - 0x798e, 0x0003, 0x50db, 0x000b, 0x4c0a, 0x0003, 0xbac0, 0x0009, + 0x7924, 0x0003, 0x5096, 0x000b, 0x4c0a, 0x0003, 0xbac0, 0x0009, 0x008a, 0x0000, 0x0c0a, 0x000b, 0x15fe, 0x0008, 0x340a, 0x0003, 0xc4c0, 0x0009, 0x7000, 0x0000, 0xffa0, 0x0001, 0x2000, 0x0000, - 0x1627, 0x0003, 0x808c, 0x0008, 0x0001, 0x0000, 0x0000, 0x0007, + 0x15bf, 0x000b, 0x808c, 0x0008, 0x0001, 0x0000, 0x0000, 0x0007, 0x4047, 0x000a, 0x808c, 0x0008, 0x0002, 0x0000, 0x0821, 0x0003, 0x4022, 0x0000, 0x0022, 0x000b, 0x4122, 0x0008, 0x4447, 0x0002, - 0x0e4f, 0x000b, 0x0bfe, 0x0008, 0x11a0, 0x0001, 0x122d, 0x000b, - 0x0ca0, 0x0001, 0x122d, 0x000b, 0x9180, 0x0001, 0x0004, 0x0000, + 0x0de3, 0x000b, 0x0bfe, 0x0008, 0x11a0, 0x0001, 0x11c5, 0x000b, + 0x0ca0, 0x0001, 0x11c5, 0x000b, 0x9180, 0x0001, 0x0004, 0x0000, 0x8060, 0x0000, 0x0400, 0x0000, 0x7f62, 0x0008, 0x8066, 0x0000, 0x0009, 0x0008, 0x4430, 0x000b, 0x808c, 0x0008, 0x0000, 0x0008, 0x0060, 0x0008, 0x8062, 0x0008, 0x0004, 0x0000, 0x8066, 0x0000, 0x0411, 0x0000, 0x4438, 0x0003, 0x03fe, 0x0000, 0x43e0, 0x0001, - 0x0e2a, 0x000b, 0xc2c0, 0x0009, 0x00ff, 0x0008, 0x02e0, 0x0001, - 0x0e2a, 0x000b, 0x9180, 0x0001, 0x0005, 0x0008, 0x8060, 0x0000, + 0x0dc2, 0x000b, 0xc2c0, 0x0009, 0x00ff, 0x0008, 0x02e0, 0x0001, + 0x0dc2, 0x000b, 0x9180, 0x0001, 0x0005, 0x0008, 0x8060, 0x0000, 0x0400, 0x0000, 0x7f62, 0x0008, 0x8066, 0x0000, 0x0019, 0x0000, - 0x4447, 0x000b, 0x0240, 0x0002, 0x0a27, 0x000b, 0x00fe, 0x0000, - 0x322a, 0x000b, 0x112a, 0x0000, 0x002e, 0x0008, 0x022c, 0x0008, + 0x4447, 0x000b, 0x0240, 0x0002, 0x09bf, 0x0003, 0x00fe, 0x0000, + 0x31c2, 0x000b, 0x112a, 0x0000, 0x002e, 0x0008, 0x022c, 0x0008, 0x3a44, 0x0002, 0x0c0a, 0x000b, 0x808c, 0x0008, 0x0002, 0x0000, 0x1760, 0x0008, 0x8062, 0x0008, 0x000f, 0x0008, 0x8066, 0x0000, 0x0011, 0x0008, 0x4458, 0x0003, 0x01fe, 0x0008, 0x42e0, 0x0009, - 0x0e1d, 0x0003, 0x00fe, 0x0000, 0x43e0, 0x0001, 0x0e1d, 0x0003, + 0x0db5, 0x000b, 0x00fe, 0x0000, 0x43e0, 0x0001, 0x0db5, 0x000b, 0x1734, 0x0000, 0x1530, 0x0000, 0x1632, 0x0008, 0x0d2a, 0x0008, 0x9880, 0x0001, 0x0010, 0x0000, 0x8060, 0x0000, 0x0400, 0x0000, 0x7f62, 0x0008, 0x8066, 0x0000, 0x1e0a, 0x0008, 0x446a, 0x000b, 0x808a, 0x0008, 0x0003, 0x0008, 0x1a60, 0x0000, 0x8062, 0x0008, 0x0002, 0x0000, 0x5870, 0x000b, 0x8066, 0x0000, 0x3679, 0x0000, - 0x4473, 0x0003, 0x5874, 0x0003, 0x3efe, 0x0008, 0x7f4f, 0x0002, - 0x087a, 0x000b, 0x0d00, 0x0000, 0x0082, 0x0004, 0x8054, 0x0008, - 0x0011, 0x0008, 0x8074, 0x0000, 0x1010, 0x0008, 0x1efe, 0x0000, - 0x300a, 0x000b, 0x00b8, 0x0004, 0x000a, 0x000b, 0x00fe, 0x0000, - 0x348a, 0x000b, 0x1a60, 0x0000, 0x8062, 0x0008, 0x0007, 0x0000, - 0x8066, 0x0000, 0x0231, 0x0008, 0x4489, 0x0003, 0x03fe, 0x0000, - 0x04d0, 0x0001, 0x0cb0, 0x0003, 0x82c0, 0x0001, 0x1f00, 0x0000, - 0xffa0, 0x0001, 0x0400, 0x0000, 0x089f, 0x0003, 0x14b0, 0x0003, - 0x01fe, 0x0008, 0x0580, 0x0009, 0x7f06, 0x0000, 0x02fe, 0x0008, - 0xffc0, 0x0001, 0x00ff, 0x0008, 0x0690, 0x0001, 0x109f, 0x0003, - 0x7f08, 0x0008, 0x84c0, 0x0001, 0xff00, 0x0008, 0x08b0, 0x000b, - 0x00fe, 0x0000, 0x34a6, 0x0003, 0x8072, 0x0000, 0x1010, 0x0008, - 0x3944, 0x0002, 0x08a1, 0x000b, 0x00aa, 0x000b, 0x8072, 0x0000, - 0x2020, 0x0008, 0x3945, 0x000a, 0x08a6, 0x0003, 0x3946, 0x000a, - 0x0cb7, 0x000b, 0x0000, 0x0007, 0x3943, 0x000a, 0x08b7, 0x0003, - 0x00aa, 0x000b, 0x00fe, 0x0000, 0x34b5, 0x000b, 0x8072, 0x0000, - 0x1000, 0x0000, 0x00b7, 0x000b, 0x8072, 0x0000, 0x2000, 0x0000, - 0x4000, 0x000f, 0x1c60, 0x0000, 0x1b62, 0x0000, 0x8066, 0x0000, - 0x0231, 0x0008, 0x44bc, 0x0003, 0x58bd, 0x0003, 0x0140, 0x0008, - 0x0242, 0x0000, 0x1f43, 0x0002, 0x0ccb, 0x0003, 0x0d44, 0x0000, - 0x0d46, 0x0008, 0x0348, 0x0008, 0x044a, 0x0008, 0x030a, 0x0008, - 0x040c, 0x0000, 0x0d06, 0x0000, 0x0d08, 0x0008, 0x00cf, 0x000b, - 0x0344, 0x0008, 0x0446, 0x0008, 0x0548, 0x0008, 0x064a, 0x0000, - 0x58cf, 0x0003, 0x3efe, 0x0008, 0x7f4f, 0x0002, 0x08d6, 0x000b, - 0x8000, 0x0000, 0x0001, 0x0000, 0x0082, 0x0004, 0x8054, 0x0008, - 0x0001, 0x0000, 0x8074, 0x0000, 0x2020, 0x0008, 0x4000, 0x000f, - 0x3a40, 0x000a, 0x0c0d, 0x0003, 0x2b24, 0x0008, 0x2b24, 0x0008, - 0x58df, 0x000b, 0x8054, 0x0008, 0x0002, 0x0000, 0x1242, 0x0002, - 0x092d, 0x000b, 0x3a45, 0x000a, 0x091c, 0x0003, 0x8072, 0x0000, - 0x1000, 0x0000, 0x3945, 0x000a, 0x08ec, 0x000b, 0x8072, 0x0000, - 0x3010, 0x0000, 0x1e10, 0x000a, 0x7f3c, 0x0000, 0x0917, 0x000b, - 0x1d00, 0x0002, 0x7f3a, 0x0000, 0x0d60, 0x0000, 0x7f62, 0x0008, - 0x8066, 0x0000, 0x0009, 0x0008, 0x44f5, 0x000b, 0x00fe, 0x0000, - 0x3514, 0x000b, 0x1c60, 0x0000, 0x8062, 0x0008, 0x0001, 0x0000, - 0x8066, 0x0000, 0x0009, 0x0008, 0x44fd, 0x0003, 0x00fe, 0x0000, - 0x3204, 0x000b, 0x0038, 0x0000, 0x0060, 0x0008, 0x8062, 0x0008, - 0x0019, 0x0000, 0x8066, 0x0000, 0x0009, 0x0008, 0x4506, 0x0003, - 0x80c0, 0x0009, 0x00ff, 0x0008, 0x7f3e, 0x0008, 0x0d60, 0x0000, - 0x0efe, 0x0008, 0x1f80, 0x0001, 0x7f62, 0x0008, 0x8066, 0x0000, - 0x0009, 0x0008, 0x4510, 0x000b, 0x003a, 0x0008, 0x1dfe, 0x0000, - 0x00f1, 0x0003, 0x0036, 0x0008, 0x00b8, 0x0004, 0x012d, 0x0003, - 0x8074, 0x0000, 0x2000, 0x0000, 0x8072, 0x0000, 0x2000, 0x0000, - 0x012d, 0x0003, 0x3a44, 0x0002, 0x0a30, 0x000b, 0x8074, 0x0000, - 0x1000, 0x0000, 0x8072, 0x0000, 0x1000, 0x0000, 0x2d0e, 0x0000, - 0x2d0e, 0x0000, 0x3601, 0x0003, 0x26fe, 0x0008, 0x26fe, 0x0008, - 0x2700, 0x0008, 0x2700, 0x0008, 0x00d0, 0x0009, 0x0d3f, 0x0003, - 0x8074, 0x0000, 0x4040, 0x0008, 0x592d, 0x000b, 0x50db, 0x000b, - 0x3a46, 0x000a, 0x0d3f, 0x0003, 0x3a47, 0x0002, 0x093a, 0x000b, + 0x4473, 0x0003, 0x5874, 0x0003, 0x8054, 0x0008, 0x0011, 0x0008, + 0x8074, 0x0000, 0x1010, 0x0008, 0x1efe, 0x0000, 0x300a, 0x000b, + 0x007d, 0x0004, 0x000a, 0x000b, 0x1c60, 0x0000, 0x1b62, 0x0000, + 0x8066, 0x0000, 0x0231, 0x0008, 0x4481, 0x000b, 0x5882, 0x0003, + 0x0140, 0x0008, 0x0242, 0x0000, 0x1f43, 0x0002, 0x0c8c, 0x0003, + 0x0d44, 0x0000, 0x0d46, 0x0008, 0x0348, 0x0008, 0x044a, 0x0008, + 0x0090, 0x000b, 0x0344, 0x0008, 0x0446, 0x0008, 0x0548, 0x0008, + 0x064a, 0x0000, 0x5890, 0x0003, 0x8054, 0x0008, 0x0001, 0x0000, + 0x8074, 0x0000, 0x2020, 0x0008, 0x4000, 0x000f, 0x3a40, 0x000a, + 0x0c0d, 0x0003, 0xabd0, 0x0001, 0x0000, 0x0008, 0x7f24, 0x0000, + 0x589b, 0x000b, 0x8054, 0x0008, 0x0002, 0x0000, 0x1242, 0x0002, + 0x08e1, 0x0003, 0x3a45, 0x000a, 0x08d0, 0x000b, 0x1e10, 0x000a, + 0x7f3c, 0x0000, 0x08cd, 0x000b, 0x1d00, 0x0002, 0x7f3a, 0x0000, + 0x0d60, 0x0000, 0x7f62, 0x0008, 0x8066, 0x0000, 0x0009, 0x0008, + 0x44ab, 0x0003, 0x00fe, 0x0000, 0x34ca, 0x0003, 0x1c60, 0x0000, + 0x8062, 0x0008, 0x0001, 0x0000, 0x8066, 0x0000, 0x0009, 0x0008, + 0x44b3, 0x0003, 0x00fe, 0x0000, 0x319e, 0x000b, 0x0038, 0x0000, + 0x0060, 0x0008, 0x8062, 0x0008, 0x0019, 0x0000, 0x8066, 0x0000, + 0x0009, 0x0008, 0x44bc, 0x0003, 0x80c0, 0x0009, 0x00ff, 0x0008, + 0x7f3e, 0x0008, 0x0d60, 0x0000, 0x0efe, 0x0008, 0x1f80, 0x0001, + 0x7f62, 0x0008, 0x8066, 0x0000, 0x0009, 0x0008, 0x44c6, 0x000b, + 0x003a, 0x0008, 0x1dfe, 0x0000, 0x00a7, 0x0003, 0x0036, 0x0008, + 0x007d, 0x0004, 0x00e1, 0x000b, 0x8074, 0x0000, 0x2000, 0x0000, + 0x00e1, 0x000b, 0x3a44, 0x0002, 0x09c8, 0x0003, 0x8074, 0x0000, + 0x1000, 0x0000, 0xadd0, 0x0001, 0x0000, 0x0008, 0x7f0e, 0x0008, + 0x359b, 0x0003, 0xa7d0, 0x0001, 0x0000, 0x0008, 0x7f00, 0x0000, + 0xa6d0, 0x0009, 0x0000, 0x0008, 0x00d0, 0x0009, 0x0cf1, 0x0003, + 0x8074, 0x0000, 0x4040, 0x0008, 0x58e1, 0x0003, 0x5096, 0x000b, + 0x3a46, 0x000a, 0x0cf1, 0x0003, 0x3a47, 0x0002, 0x08ec, 0x000b, 0x8054, 0x0008, 0x0004, 0x0000, 0x8074, 0x0000, 0x8000, 0x0000, - 0x8072, 0x0000, 0x3000, 0x0008, 0x0182, 0x0003, 0x92c0, 0x0009, - 0x0fc8, 0x0000, 0x080a, 0x0003, 0x1246, 0x000a, 0x0dfb, 0x000b, - 0x1a60, 0x0000, 0x8062, 0x0008, 0x0002, 0x0000, 0x8066, 0x0000, - 0x362a, 0x0000, 0x4544, 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, 0x455e, 0x000b, - 0x92c0, 0x0009, 0x0780, 0x0008, 0x0e17, 0x0003, 0x124b, 0x0002, - 0x0967, 0x0003, 0x2e4d, 0x0002, 0x2e4d, 0x0002, 0x0a01, 0x0003, - 0x3a46, 0x000a, 0x0d74, 0x0003, 0x5969, 0x000b, 0x8054, 0x0008, - 0x0004, 0x0000, 0x1243, 0x000a, 0x097e, 0x000b, 0x8010, 0x0008, - 0x000d, 0x0000, 0x01ef, 0x0004, 0x1810, 0x0000, 0x01ef, 0x0004, - 0x017e, 0x0003, 0x194d, 0x000a, 0x0978, 0x000b, 0x1243, 0x000a, - 0x0a0b, 0x0003, 0x5978, 0x000b, 0x8054, 0x0008, 0x0004, 0x0000, - 0x01e4, 0x000c, 0x1810, 0x0000, 0x01ef, 0x0004, 0x8074, 0x0000, - 0xf000, 0x0008, 0x8072, 0x0000, 0x3000, 0x0008, 0x0d30, 0x0000, - 0x3a42, 0x0002, 0x0d88, 0x0003, 0x15fe, 0x0008, 0x3451, 0x000b, - 0x000a, 0x000b, 0x8074, 0x0000, 0x0501, 0x0000, 0x8010, 0x0008, - 0x000c, 0x0008, 0x01ef, 0x0004, 0x000a, 0x000b, 0xbbe0, 0x0009, - 0x0030, 0x0008, 0x0d9e, 0x000b, 0x18fe, 0x0000, 0x3ce0, 0x0009, - 0x099b, 0x0003, 0x15fe, 0x0008, 0x3ce0, 0x0009, 0x099b, 0x0003, - 0x01df, 0x0004, 0x8076, 0x0008, 0x0040, 0x0000, 0x01dc, 0x000b, - 0x8076, 0x0008, 0x0041, 0x0008, 0x01dc, 0x000b, 0xbbe0, 0x0009, - 0x0032, 0x0000, 0x0da3, 0x0003, 0x3c1e, 0x0008, 0x01dc, 0x000b, - 0xbbe0, 0x0009, 0x0037, 0x0000, 0x0dc1, 0x000b, 0x18fe, 0x0000, - 0x3ce0, 0x0009, 0x0d9b, 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, 0x45b8, 0x0003, 0x01e4, 0x000c, 0x8054, 0x0008, - 0x0004, 0x0000, 0x8074, 0x0000, 0xf000, 0x0008, 0x8072, 0x0000, - 0xb000, 0x0000, 0x0182, 0x0003, 0xbbe0, 0x0009, 0x0038, 0x0000, - 0x0dd3, 0x000b, 0x18fe, 0x0000, 0x3ce0, 0x0009, 0x09d0, 0x0003, - 0x15fe, 0x0008, 0x3ce0, 0x0009, 0x0d97, 0x000b, 0x01df, 0x0004, - 0x8076, 0x0008, 0x0040, 0x0000, 0x8072, 0x0000, 0x8000, 0x0000, - 0x0227, 0x0003, 0x8076, 0x0008, 0x0042, 0x0008, 0x01dc, 0x000b, - 0xbbe0, 0x0009, 0x0016, 0x0000, 0x0ddc, 0x000b, 0x3a44, 0x0002, - 0x0c0c, 0x000b, 0x8072, 0x0000, 0x8000, 0x0000, 0x8000, 0x000f, - 0x000a, 0x000b, 0x8072, 0x0000, 0x8000, 0x0000, 0x000a, 0x000b, - 0x3d30, 0x000a, 0x7f00, 0x0000, 0xbc80, 0x0001, 0x0007, 0x0000, - 0x01e8, 0x0003, 0x1930, 0x000a, 0x7f00, 0x0000, 0x9880, 0x0001, - 0x0007, 0x0000, 0x8060, 0x0000, 0x0400, 0x0000, 0x7f62, 0x0008, - 0x8066, 0x0000, 0x000a, 0x0008, 0x45ed, 0x0003, 0x4000, 0x000f, - 0x21ef, 0x0003, 0x0870, 0x0008, 0x4000, 0x000f, 0xbac0, 0x0009, - 0x0090, 0x0008, 0x09f8, 0x0003, 0x8074, 0x0000, 0x0706, 0x0000, - 0x01fa, 0x0003, 0x8074, 0x0000, 0x0703, 0x0000, 0x4000, 0x000f, - 0x8010, 0x0008, 0x0023, 0x0000, 0x0235, 0x0003, 0x8010, 0x0008, - 0x0008, 0x0000, 0x0235, 0x0003, 0x8010, 0x0008, 0x0022, 0x0008, - 0x0235, 0x0003, 0x01e4, 0x000c, 0x8010, 0x0008, 0x0007, 0x0000, - 0x01ef, 0x0004, 0x1810, 0x0000, 0x01ef, 0x0004, 0x0241, 0x0003, - 0x01e4, 0x000c, 0x8010, 0x0008, 0x001b, 0x0008, 0x01ef, 0x0004, - 0x1810, 0x0000, 0x01ef, 0x0004, 0x8074, 0x0000, 0xf080, 0x0000, - 0x8072, 0x0000, 0x3000, 0x0008, 0x0d30, 0x0000, 0x000a, 0x000b, - 0x8010, 0x0008, 0x0009, 0x0008, 0x0235, 0x0003, 0x8010, 0x0008, - 0x0005, 0x0008, 0x0235, 0x0003, 0x808c, 0x0008, 0x0001, 0x0000, + 0x0118, 0x0003, 0x92c0, 0x0009, 0x0fc8, 0x0000, 0x080a, 0x0003, + 0x1246, 0x000a, 0x0d95, 0x0003, 0x1a60, 0x0000, 0x8062, 0x0008, + 0x0002, 0x0000, 0x8066, 0x0000, 0x367a, 0x0000, 0x44f6, 0x000b, + 0x92c0, 0x0009, 0x0780, 0x0008, 0x0daf, 0x0003, 0x124b, 0x0002, + 0x08ff, 0x0003, 0x2e4d, 0x0002, 0x2e4d, 0x0002, 0x099b, 0x0003, + 0x3a46, 0x000a, 0x0d0c, 0x0003, 0x5901, 0x0003, 0x8054, 0x0008, + 0x0004, 0x0000, 0x1243, 0x000a, 0x0916, 0x0003, 0x8010, 0x0008, + 0x000d, 0x0000, 0x0189, 0x0004, 0x1810, 0x0000, 0x0189, 0x0004, + 0x0116, 0x000b, 0x194d, 0x000a, 0x0910, 0x0003, 0x1243, 0x000a, + 0x09a5, 0x000b, 0x5910, 0x0003, 0x8054, 0x0008, 0x0004, 0x0000, + 0x017e, 0x000c, 0x1810, 0x0000, 0x0189, 0x0004, 0x8074, 0x0000, + 0xf000, 0x0008, 0x0d30, 0x0000, 0x3a42, 0x0002, 0x0d1e, 0x0003, + 0x15fe, 0x0008, 0x3451, 0x000b, 0x000a, 0x000b, 0x8074, 0x0000, + 0x0501, 0x0000, 0x8010, 0x0008, 0x000c, 0x0008, 0x0189, 0x0004, + 0x000a, 0x000b, 0xbbe0, 0x0009, 0x0030, 0x0008, 0x0d34, 0x000b, + 0x18fe, 0x0000, 0x3ce0, 0x0009, 0x0931, 0x0003, 0x15fe, 0x0008, + 0x3ce0, 0x0009, 0x0931, 0x0003, 0x0179, 0x0004, 0x8076, 0x0008, + 0x0040, 0x0000, 0x0176, 0x000b, 0x8076, 0x0008, 0x0041, 0x0008, + 0x0176, 0x000b, 0xbbe0, 0x0009, 0x0032, 0x0000, 0x0d39, 0x0003, + 0x3c1e, 0x0008, 0x0176, 0x000b, 0xbbe0, 0x0009, 0x0037, 0x0000, + 0x0d5b, 0x000b, 0x18fe, 0x0000, 0x3ce0, 0x0009, 0x0d31, 0x000b, + 0x8076, 0x0008, 0x0040, 0x0000, 0x1a60, 0x0000, 0x8062, 0x0008, + 0x000d, 0x0000, 0xa6d0, 0x0009, 0x0000, 0x0008, 0x7f04, 0x0008, + 0xa7d0, 0x0001, 0x0000, 0x0008, 0x7f06, 0x0000, 0xa8d0, 0x0001, + 0x0000, 0x0008, 0x7f08, 0x0008, 0xa9d0, 0x0009, 0x0000, 0x0008, + 0x7f0a, 0x0000, 0x8066, 0x0000, 0x0422, 0x0000, 0x4552, 0x000b, + 0x017e, 0x000c, 0x8054, 0x0008, 0x0004, 0x0000, 0x8074, 0x0000, + 0xf000, 0x0008, 0x8072, 0x0000, 0x8000, 0x0000, 0x0118, 0x0003, + 0xbbe0, 0x0009, 0x0038, 0x0000, 0x0d6d, 0x000b, 0x18fe, 0x0000, + 0x3ce0, 0x0009, 0x096a, 0x000b, 0x15fe, 0x0008, 0x3ce0, 0x0009, + 0x0d2d, 0x0003, 0x0179, 0x0004, 0x8076, 0x0008, 0x0040, 0x0000, + 0x8072, 0x0000, 0x8000, 0x0000, 0x01bf, 0x000b, 0x8076, 0x0008, + 0x0042, 0x0008, 0x0176, 0x000b, 0xbbe0, 0x0009, 0x0016, 0x0000, + 0x0d76, 0x000b, 0x3a44, 0x0002, 0x0c0c, 0x000b, 0x8072, 0x0000, + 0x8000, 0x0000, 0x8000, 0x000f, 0x000a, 0x000b, 0x8072, 0x0000, + 0x8000, 0x0000, 0x000a, 0x000b, 0x3d30, 0x000a, 0x7f00, 0x0000, + 0xbc80, 0x0001, 0x0007, 0x0000, 0x0182, 0x0003, 0x1930, 0x000a, + 0x7f00, 0x0000, 0x9880, 0x0001, 0x0007, 0x0000, 0x8060, 0x0000, + 0x0400, 0x0000, 0x7f62, 0x0008, 0x8066, 0x0000, 0x000a, 0x0008, + 0x4587, 0x0003, 0x4000, 0x000f, 0x2189, 0x0003, 0x0870, 0x0008, + 0x4000, 0x000f, 0xbac0, 0x0009, 0x0090, 0x0008, 0x0992, 0x0003, + 0x8074, 0x0000, 0x0706, 0x0000, 0x0194, 0x000b, 0x8074, 0x0000, + 0x0703, 0x0000, 0x4000, 0x000f, 0x8010, 0x0008, 0x0023, 0x0000, + 0x01cd, 0x000b, 0x8010, 0x0008, 0x0008, 0x0000, 0x01cd, 0x000b, + 0x8010, 0x0008, 0x0022, 0x0008, 0x01cd, 0x000b, 0x017e, 0x000c, + 0x8010, 0x0008, 0x0007, 0x0000, 0x0189, 0x0004, 0x1810, 0x0000, + 0x0189, 0x0004, 0x01d7, 0x0003, 0x017e, 0x000c, 0x8010, 0x0008, + 0x001b, 0x0008, 0x0189, 0x0004, 0x1810, 0x0000, 0x0189, 0x0004, + 0x8074, 0x0000, 0xf080, 0x0000, 0x0d30, 0x0000, 0x000a, 0x000b, + 0x8010, 0x0008, 0x0009, 0x0008, 0x01cd, 0x000b, 0x8010, 0x0008, + 0x0005, 0x0008, 0x01cd, 0x000b, 0x808c, 0x0008, 0x0001, 0x0000, 0x8010, 0x0008, 0x0004, 0x0000, 0x4143, 0x000a, 0x085f, 0x0003, - 0x3a44, 0x0002, 0x0c0a, 0x000b, 0x0d2a, 0x0008, 0x0235, 0x0003, - 0x8010, 0x0008, 0x0003, 0x0008, 0x0239, 0x0003, 0x8010, 0x0008, - 0x000b, 0x0000, 0x0239, 0x0003, 0x8010, 0x0008, 0x0002, 0x0000, - 0x0239, 0x0003, 0x3a47, 0x0002, 0x0d2d, 0x0003, 0x8010, 0x0008, - 0x0006, 0x0008, 0x0239, 0x0003, 0x8074, 0x0000, 0xf000, 0x0008, - 0x8072, 0x0000, 0x3000, 0x0008, 0x01ef, 0x0004, 0x01f2, 0x0004, - 0x3a40, 0x000a, 0x080a, 0x0003, 0x8010, 0x0008, 0x000c, 0x0008, - 0x01ef, 0x0004, 0x000a, 0x000b, 0x8074, 0x0000, 0xf080, 0x0000, - 0x8072, 0x0000, 0x3000, 0x0008, 0x0d30, 0x0000, 0x2e4d, 0x0002, - 0x2e4d, 0x0002, 0x0a4c, 0x0003, 0x8054, 0x0008, 0x0019, 0x0000, + 0x3a44, 0x0002, 0x0c0a, 0x000b, 0x0d2a, 0x0008, 0x01cd, 0x000b, + 0x8010, 0x0008, 0x0003, 0x0008, 0x01cf, 0x0003, 0x8010, 0x0008, + 0x000b, 0x0000, 0x01cf, 0x0003, 0x8010, 0x0008, 0x0002, 0x0000, + 0x01cf, 0x0003, 0x3a47, 0x0002, 0x0ce1, 0x000b, 0x8010, 0x0008, + 0x0006, 0x0008, 0x01cf, 0x0003, 0x8074, 0x0000, 0xf000, 0x0008, + 0x0189, 0x0004, 0x018c, 0x0004, 0x3a40, 0x000a, 0x080a, 0x0003, + 0x8010, 0x0008, 0x000c, 0x0008, 0x0189, 0x0004, 0x000a, 0x000b, + 0x8074, 0x0000, 0xf080, 0x0000, 0x0d30, 0x0000, 0x2e4d, 0x0002, + 0x2e4d, 0x0002, 0x09e0, 0x0003, 0x8054, 0x0008, 0x0019, 0x0000, 0x000a, 0x000b, 0x8054, 0x0008, 0x0009, 0x0008, 0x000a, 0x000b, - 0x3a44, 0x0002, 0x0c0a, 0x000b, 0x022a, 0x000b, 0x15b6, 0xf4ac, - 0x0003, 0x000b, 0x0480, 0x0000, 0xc000, 0x0001, 0x8064, 0x0008, + 0x3a44, 0x0002, 0x0c0a, 0x000b, 0x01c2, 0x000b, 0x0a0b, 0xf5dd, + 0x0003, 0x000b, 0x03ce, 0x0000, 0xc000, 0x0001, 0x8064, 0x0008, 0x0010, 0x0000, 0x8066, 0x0000, 0x0101, 0x0008, 0xc007, 0x0003, - 0x8060, 0x0000, 0x0400, 0x0000, 0x580d, 0x000b, 0x7977, 0x0003, - 0x50db, 0x000b, 0xc80a, 0x0003, 0xbac0, 0x0009, 0x008a, 0x0000, + 0x8060, 0x0000, 0x0400, 0x0000, 0x580d, 0x000b, 0x7924, 0x0003, + 0x5096, 0x000b, 0xc80a, 0x0003, 0xbac0, 0x0009, 0x008a, 0x0000, 0x880a, 0x000b, 0x15fe, 0x0008, 0xb00a, 0x0003, 0xc4c0, 0x0009, - 0x7000, 0x0000, 0xffa0, 0x0001, 0x2000, 0x0000, 0x9214, 0x0003, + 0x7000, 0x0000, 0xffa0, 0x0001, 0x2000, 0x0000, 0x91bf, 0x000b, 0x808c, 0x0008, 0x0001, 0x0000, 0x0000, 0x0007, 0x4047, 0x000a, 0x808c, 0x0008, 0x0002, 0x0000, 0x0821, 0x0003, 0x4022, 0x0000, - 0x0022, 0x000b, 0x4122, 0x0008, 0x4447, 0x0002, 0x8a3c, 0x0003, - 0x0bfe, 0x0008, 0x11a0, 0x0001, 0x121a, 0x0003, 0x0ca0, 0x0001, - 0x121a, 0x0003, 0x9180, 0x0001, 0x0004, 0x0000, 0x8060, 0x0000, + 0x0022, 0x000b, 0x4122, 0x0008, 0x4447, 0x0002, 0x89e3, 0x000b, + 0x0bfe, 0x0008, 0x11a0, 0x0001, 0x11c5, 0x000b, 0x0ca0, 0x0001, + 0x11c5, 0x000b, 0x9180, 0x0001, 0x0004, 0x0000, 0x8060, 0x0000, 0x0400, 0x0000, 0x7f62, 0x0008, 0x8066, 0x0000, 0x0009, 0x0008, 0xc030, 0x000b, 0x808c, 0x0008, 0x0000, 0x0008, 0x0060, 0x0008, 0x8062, 0x0008, 0x0004, 0x0000, 0x8066, 0x0000, 0x0411, 0x0000, - 0xc038, 0x0003, 0x03fe, 0x0000, 0x43e0, 0x0001, 0x8a17, 0x0003, - 0xc2c0, 0x0009, 0x00ff, 0x0008, 0x02e0, 0x0001, 0x8a17, 0x0003, + 0xc038, 0x0003, 0x03fe, 0x0000, 0x43e0, 0x0001, 0x89c2, 0x000b, + 0xc2c0, 0x0009, 0x00ff, 0x0008, 0x02e0, 0x0001, 0x89c2, 0x000b, 0x9180, 0x0001, 0x0005, 0x0008, 0x8060, 0x0000, 0x0400, 0x0000, 0x7f62, 0x0008, 0x8066, 0x0000, 0x0019, 0x0000, 0xc047, 0x000b, - 0x0240, 0x0002, 0x0a14, 0x000b, 0x00fe, 0x0000, 0x3217, 0x0003, + 0x0240, 0x0002, 0x09bf, 0x0003, 0x00fe, 0x0000, 0x31c2, 0x000b, 0x112a, 0x0000, 0x002e, 0x0008, 0x022c, 0x0008, 0x3a44, 0x0002, 0x880a, 0x000b, 0x808c, 0x0008, 0x0002, 0x0000, 0x1760, 0x0008, 0x8062, 0x0008, 0x000f, 0x0008, 0x8066, 0x0000, 0x0011, 0x0008, - 0xc058, 0x0003, 0x01fe, 0x0008, 0x42e0, 0x0009, 0x8a0a, 0x0003, - 0x00fe, 0x0000, 0x43e0, 0x0001, 0x8a0a, 0x0003, 0x1734, 0x0000, + 0xc058, 0x0003, 0x01fe, 0x0008, 0x42e0, 0x0009, 0x89b5, 0x000b, + 0x00fe, 0x0000, 0x43e0, 0x0001, 0x89b5, 0x000b, 0x1734, 0x0000, 0x1530, 0x0000, 0x1632, 0x0008, 0x0d2a, 0x0008, 0x9880, 0x0001, 0x0010, 0x0000, 0x8060, 0x0000, 0x0400, 0x0000, 0x7f62, 0x0008, 0x8066, 0x0000, 0x1e0a, 0x0008, 0xc06a, 0x000b, 0x808a, 0x0008, 0x0003, 0x0008, 0x1a60, 0x0000, 0x8062, 0x0008, 0x0002, 0x0000, 0x5870, 0x000b, 0x8066, 0x0000, 0x3679, 0x0000, 0xc073, 0x0003, - 0x5874, 0x0003, 0x3efe, 0x0008, 0x7f4f, 0x0002, 0x087a, 0x000b, - 0x0d00, 0x0000, 0x0082, 0x0004, 0x8054, 0x0008, 0x0011, 0x0008, - 0x8074, 0x0000, 0x1010, 0x0008, 0x1efe, 0x0000, 0x300a, 0x000b, - 0x00b8, 0x0004, 0x000a, 0x000b, 0x00fe, 0x0000, 0xb08a, 0x000b, - 0x1a60, 0x0000, 0x8062, 0x0008, 0x0007, 0x0000, 0x8066, 0x0000, - 0x0231, 0x0008, 0xc089, 0x0003, 0x03fe, 0x0000, 0x04d0, 0x0001, - 0x88b0, 0x0003, 0x82c0, 0x0001, 0x1f00, 0x0000, 0xffa0, 0x0001, - 0x0400, 0x0000, 0x089f, 0x0003, 0x90b0, 0x0003, 0x01fe, 0x0008, - 0x0580, 0x0009, 0x7f06, 0x0000, 0x02fe, 0x0008, 0xffc0, 0x0001, - 0x00ff, 0x0008, 0x0690, 0x0001, 0x109f, 0x0003, 0x7f08, 0x0008, - 0x84c0, 0x0001, 0xff00, 0x0008, 0x08b0, 0x000b, 0x00fe, 0x0000, - 0xb0a6, 0x0003, 0x8072, 0x0000, 0x1010, 0x0008, 0x3944, 0x0002, - 0x08a1, 0x000b, 0x00aa, 0x000b, 0x8072, 0x0000, 0x2020, 0x0008, - 0x3945, 0x000a, 0x08a6, 0x0003, 0x3946, 0x000a, 0x88b7, 0x000b, - 0x0000, 0x0007, 0x3943, 0x000a, 0x08b7, 0x0003, 0x00aa, 0x000b, - 0x00fe, 0x0000, 0xb0b5, 0x000b, 0x8072, 0x0000, 0x1000, 0x0000, - 0x00b7, 0x000b, 0x8072, 0x0000, 0x2000, 0x0000, 0x4000, 0x000f, - 0x1c60, 0x0000, 0x1b62, 0x0000, 0x8066, 0x0000, 0x0231, 0x0008, - 0xc0bc, 0x0003, 0x58bd, 0x0003, 0x0140, 0x0008, 0x0242, 0x0000, - 0x1f43, 0x0002, 0x88cb, 0x0003, 0x0d44, 0x0000, 0x0d46, 0x0008, - 0x0348, 0x0008, 0x044a, 0x0008, 0x030a, 0x0008, 0x040c, 0x0000, - 0x0d06, 0x0000, 0x0d08, 0x0008, 0x00cf, 0x000b, 0x0344, 0x0008, - 0x0446, 0x0008, 0x0548, 0x0008, 0x064a, 0x0000, 0x58cf, 0x0003, - 0x3efe, 0x0008, 0x7f4f, 0x0002, 0x08d6, 0x000b, 0x8000, 0x0000, - 0x0001, 0x0000, 0x0082, 0x0004, 0x8054, 0x0008, 0x0001, 0x0000, - 0x8074, 0x0000, 0x2020, 0x0008, 0x4000, 0x000f, 0x3a40, 0x000a, - 0x880d, 0x0003, 0xabd0, 0x0001, 0x0000, 0x0008, 0x7f24, 0x0000, - 0x58e0, 0x000b, 0x8054, 0x0008, 0x0002, 0x0000, 0x1242, 0x0002, - 0x0930, 0x000b, 0x3a45, 0x000a, 0x091d, 0x000b, 0x8072, 0x0000, - 0x1000, 0x0000, 0x3945, 0x000a, 0x08ed, 0x0003, 0x8072, 0x0000, - 0x3010, 0x0000, 0x1e10, 0x000a, 0x7f3c, 0x0000, 0x0918, 0x000b, - 0x1d00, 0x0002, 0x7f3a, 0x0000, 0x0d60, 0x0000, 0x7f62, 0x0008, - 0x8066, 0x0000, 0x0009, 0x0008, 0xc0f6, 0x000b, 0x00fe, 0x0000, - 0xb115, 0x0003, 0x1c60, 0x0000, 0x8062, 0x0008, 0x0001, 0x0000, - 0x8066, 0x0000, 0x0009, 0x0008, 0xc0fe, 0x0003, 0x00fe, 0x0000, - 0x31f1, 0x000b, 0x0038, 0x0000, 0x0060, 0x0008, 0x8062, 0x0008, - 0x0019, 0x0000, 0x8066, 0x0000, 0x0009, 0x0008, 0xc107, 0x000b, - 0x80c0, 0x0009, 0x00ff, 0x0008, 0x7f3e, 0x0008, 0x0d60, 0x0000, - 0x0efe, 0x0008, 0x1f80, 0x0001, 0x7f62, 0x0008, 0x8066, 0x0000, - 0x0009, 0x0008, 0xc111, 0x0003, 0x003a, 0x0008, 0x1dfe, 0x0000, - 0x00f2, 0x0003, 0x0036, 0x0008, 0x00b8, 0x0004, 0x0130, 0x0003, - 0x8074, 0x0000, 0x2000, 0x0000, 0x8072, 0x0000, 0x2000, 0x0000, - 0x0130, 0x0003, 0x3a44, 0x0002, 0x0a1d, 0x000b, 0x8074, 0x0000, - 0x1000, 0x0000, 0x8072, 0x0000, 0x1000, 0x0000, 0xadd0, 0x0001, - 0x0000, 0x0008, 0x7f0e, 0x0008, 0xb1ee, 0x000b, 0xa7d0, 0x0001, - 0x0000, 0x0008, 0x7f00, 0x0000, 0xa6d0, 0x0009, 0x0000, 0x0008, - 0x00d0, 0x0009, 0x8942, 0x0003, 0x8074, 0x0000, 0x4040, 0x0008, - 0x5930, 0x000b, 0x50db, 0x000b, 0x3a46, 0x000a, 0x8942, 0x0003, - 0x3a47, 0x0002, 0x093d, 0x0003, 0x8054, 0x0008, 0x0004, 0x0000, - 0x8074, 0x0000, 0x8000, 0x0000, 0x8072, 0x0000, 0x3000, 0x0008, - 0x016b, 0x000b, 0x92c0, 0x0009, 0x0fc8, 0x0000, 0x080a, 0x0003, - 0x1246, 0x000a, 0x89e8, 0x0003, 0x1a60, 0x0000, 0x8062, 0x0008, - 0x0002, 0x0000, 0x8066, 0x0000, 0x367a, 0x0000, 0xc147, 0x0003, - 0x92c0, 0x0009, 0x0780, 0x0008, 0x8a04, 0x000b, 0x124b, 0x0002, - 0x0950, 0x000b, 0x2e4d, 0x0002, 0x2e4d, 0x0002, 0x09ee, 0x000b, - 0x3a46, 0x000a, 0x895d, 0x000b, 0x5952, 0x0003, 0x8054, 0x0008, - 0x0004, 0x0000, 0x1243, 0x000a, 0x0967, 0x0003, 0x8010, 0x0008, - 0x000d, 0x0000, 0x01dc, 0x0004, 0x1810, 0x0000, 0x01dc, 0x0004, - 0x0167, 0x000b, 0x194d, 0x000a, 0x0961, 0x0003, 0x1243, 0x000a, - 0x09f8, 0x0003, 0x5961, 0x0003, 0x8054, 0x0008, 0x0004, 0x0000, - 0x01d1, 0x000c, 0x1810, 0x0000, 0x01dc, 0x0004, 0x8074, 0x0000, - 0xf000, 0x0008, 0x8072, 0x0000, 0x3000, 0x0008, 0x0d30, 0x0000, - 0x3a42, 0x0002, 0x8971, 0x0003, 0x15fe, 0x0008, 0xb051, 0x000b, - 0x000a, 0x000b, 0x8074, 0x0000, 0x0501, 0x0000, 0x8010, 0x0008, - 0x000c, 0x0008, 0x01dc, 0x0004, 0x000a, 0x000b, 0xbbe0, 0x0009, - 0x0030, 0x0008, 0x8987, 0x0003, 0x18fe, 0x0000, 0x3ce0, 0x0009, - 0x0984, 0x000b, 0x15fe, 0x0008, 0x3ce0, 0x0009, 0x0984, 0x000b, - 0x01cc, 0x000c, 0x8076, 0x0008, 0x0040, 0x0000, 0x01c9, 0x0003, - 0x8076, 0x0008, 0x0041, 0x0008, 0x01c9, 0x0003, 0xbbe0, 0x0009, - 0x0032, 0x0000, 0x898c, 0x000b, 0x3c1e, 0x0008, 0x01c9, 0x0003, - 0xbbe0, 0x0009, 0x0037, 0x0000, 0x89ae, 0x000b, 0x18fe, 0x0000, - 0x3ce0, 0x0009, 0x8984, 0x0003, 0x8076, 0x0008, 0x0040, 0x0000, - 0x1a60, 0x0000, 0x8062, 0x0008, 0x000d, 0x0000, 0xa6d0, 0x0009, - 0x0000, 0x0008, 0x7f04, 0x0008, 0xa7d0, 0x0001, 0x0000, 0x0008, - 0x7f06, 0x0000, 0xa8d0, 0x0001, 0x0000, 0x0008, 0x7f08, 0x0008, - 0xa9d0, 0x0009, 0x0000, 0x0008, 0x7f0a, 0x0000, 0x8066, 0x0000, - 0x0422, 0x0000, 0xc1a5, 0x0003, 0x01d1, 0x000c, 0x8054, 0x0008, - 0x0004, 0x0000, 0x8074, 0x0000, 0xf000, 0x0008, 0x8072, 0x0000, - 0xb000, 0x0000, 0x016b, 0x000b, 0xbbe0, 0x0009, 0x0038, 0x0000, - 0x89c0, 0x0003, 0x18fe, 0x0000, 0x3ce0, 0x0009, 0x09bd, 0x000b, - 0x15fe, 0x0008, 0x3ce0, 0x0009, 0x8980, 0x000b, 0x01cc, 0x000c, - 0x8076, 0x0008, 0x0040, 0x0000, 0x8072, 0x0000, 0x8000, 0x0000, - 0x0214, 0x0003, 0x8076, 0x0008, 0x0042, 0x0008, 0x01c9, 0x0003, - 0xbbe0, 0x0009, 0x0016, 0x0000, 0x89c9, 0x0003, 0x3a44, 0x0002, - 0x880c, 0x000b, 0x8072, 0x0000, 0x8000, 0x0000, 0x8000, 0x000f, - 0x000a, 0x000b, 0x8072, 0x0000, 0x8000, 0x0000, 0x000a, 0x000b, - 0x3d30, 0x000a, 0x7f00, 0x0000, 0xbc80, 0x0001, 0x0007, 0x0000, - 0x01d5, 0x000b, 0x1930, 0x000a, 0x7f00, 0x0000, 0x9880, 0x0001, - 0x0007, 0x0000, 0x8060, 0x0000, 0x0400, 0x0000, 0x7f62, 0x0008, - 0x8066, 0x0000, 0x000a, 0x0008, 0xc1da, 0x000b, 0x4000, 0x000f, - 0x21dc, 0x0003, 0x0870, 0x0008, 0x4000, 0x000f, 0xbac0, 0x0009, - 0x0090, 0x0008, 0x09e5, 0x0003, 0x8074, 0x0000, 0x0706, 0x0000, - 0x01e7, 0x0003, 0x8074, 0x0000, 0x0703, 0x0000, 0x4000, 0x000f, - 0x8010, 0x0008, 0x0023, 0x0000, 0x0222, 0x0003, 0x8010, 0x0008, - 0x0008, 0x0000, 0x0222, 0x0003, 0x8010, 0x0008, 0x0022, 0x0008, - 0x0222, 0x0003, 0x01d1, 0x000c, 0x8010, 0x0008, 0x0007, 0x0000, - 0x01dc, 0x0004, 0x1810, 0x0000, 0x01dc, 0x0004, 0x022e, 0x0003, - 0x01d1, 0x000c, 0x8010, 0x0008, 0x001b, 0x0008, 0x01dc, 0x0004, - 0x1810, 0x0000, 0x01dc, 0x0004, 0x8074, 0x0000, 0xf080, 0x0000, - 0x8072, 0x0000, 0x3000, 0x0008, 0x0d30, 0x0000, 0x000a, 0x000b, - 0x8010, 0x0008, 0x0009, 0x0008, 0x0222, 0x0003, 0x8010, 0x0008, - 0x0005, 0x0008, 0x0222, 0x0003, 0x808c, 0x0008, 0x0001, 0x0000, - 0x8010, 0x0008, 0x0004, 0x0000, 0x4143, 0x000a, 0x085f, 0x0003, - 0x3a44, 0x0002, 0x880a, 0x000b, 0x0d2a, 0x0008, 0x0222, 0x0003, - 0x8010, 0x0008, 0x0003, 0x0008, 0x0226, 0x000b, 0x8010, 0x0008, - 0x000b, 0x0000, 0x0226, 0x000b, 0x8010, 0x0008, 0x0002, 0x0000, - 0x0226, 0x000b, 0x3a47, 0x0002, 0x8930, 0x0003, 0x8010, 0x0008, - 0x0006, 0x0008, 0x0226, 0x000b, 0x8074, 0x0000, 0xf000, 0x0008, - 0x8072, 0x0000, 0x3000, 0x0008, 0x01dc, 0x0004, 0x01df, 0x0004, - 0x3a40, 0x000a, 0x080a, 0x0003, 0x8010, 0x0008, 0x000c, 0x0008, - 0x01dc, 0x0004, 0x000a, 0x000b, 0x8074, 0x0000, 0xf080, 0x0000, - 0x8072, 0x0000, 0x3000, 0x0008, 0x0d30, 0x0000, 0x2e4d, 0x0002, - 0x2e4d, 0x0002, 0x0a39, 0x000b, 0x8054, 0x0008, 0x0019, 0x0000, - 0x000a, 0x000b, 0x8054, 0x0008, 0x0009, 0x0008, 0x000a, 0x000b, - 0x3a44, 0x0002, 0x880a, 0x000b, 0x0217, 0x0003, 0xf4e5, 0xf482, - 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080, - 0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000, 0x8000, - 0x6870 + 0x5874, 0x0003, 0x8054, 0x0008, 0x0011, 0x0008, 0x8074, 0x0000, + 0x1010, 0x0008, 0x1efe, 0x0000, 0x300a, 0x000b, 0x007d, 0x0004, + 0x000a, 0x000b, 0x1c60, 0x0000, 0x1b62, 0x0000, 0x8066, 0x0000, + 0x0231, 0x0008, 0xc081, 0x000b, 0x5882, 0x0003, 0x0140, 0x0008, + 0x0242, 0x0000, 0x1f43, 0x0002, 0x888c, 0x0003, 0x0d44, 0x0000, + 0x0d46, 0x0008, 0x0348, 0x0008, 0x044a, 0x0008, 0x0090, 0x000b, + 0x0344, 0x0008, 0x0446, 0x0008, 0x0548, 0x0008, 0x064a, 0x0000, + 0x5890, 0x0003, 0x8054, 0x0008, 0x0001, 0x0000, 0x8074, 0x0000, + 0x2020, 0x0008, 0x4000, 0x000f, 0x3a40, 0x000a, 0x880d, 0x0003, + 0xabd0, 0x0001, 0x0000, 0x0008, 0x7f24, 0x0000, 0x589b, 0x000b, + 0x8054, 0x0008, 0x0002, 0x0000, 0x1242, 0x0002, 0x08e1, 0x0003, + 0x3a45, 0x000a, 0x08d0, 0x000b, 0x1e10, 0x000a, 0x7f3c, 0x0000, + 0x08cd, 0x000b, 0x1d00, 0x0002, 0x7f3a, 0x0000, 0x0d60, 0x0000, + 0x7f62, 0x0008, 0x8066, 0x0000, 0x0009, 0x0008, 0xc0ab, 0x0003, + 0x00fe, 0x0000, 0xb0ca, 0x0003, 0x1c60, 0x0000, 0x8062, 0x0008, + 0x0001, 0x0000, 0x8066, 0x0000, 0x0009, 0x0008, 0xc0b3, 0x0003, + 0x00fe, 0x0000, 0x319e, 0x000b, 0x0038, 0x0000, 0x0060, 0x0008, + 0x8062, 0x0008, 0x0019, 0x0000, 0x8066, 0x0000, 0x0009, 0x0008, + 0xc0bc, 0x0003, 0x80c0, 0x0009, 0x00ff, 0x0008, 0x7f3e, 0x0008, + 0x0d60, 0x0000, 0x0efe, 0x0008, 0x1f80, 0x0001, 0x7f62, 0x0008, + 0x8066, 0x0000, 0x0009, 0x0008, 0xc0c6, 0x000b, 0x003a, 0x0008, + 0x1dfe, 0x0000, 0x00a7, 0x0003, 0x0036, 0x0008, 0x007d, 0x0004, + 0x00e1, 0x000b, 0x8074, 0x0000, 0x2000, 0x0000, 0x00e1, 0x000b, + 0x3a44, 0x0002, 0x09c8, 0x0003, 0x8074, 0x0000, 0x1000, 0x0000, + 0xadd0, 0x0001, 0x0000, 0x0008, 0x7f0e, 0x0008, 0xb19b, 0x0003, + 0xa7d0, 0x0001, 0x0000, 0x0008, 0x7f00, 0x0000, 0xa6d0, 0x0009, + 0x0000, 0x0008, 0x00d0, 0x0009, 0x88f1, 0x0003, 0x8074, 0x0000, + 0x4040, 0x0008, 0x58e1, 0x0003, 0x5096, 0x000b, 0x3a46, 0x000a, + 0x88f1, 0x0003, 0x3a47, 0x0002, 0x08ec, 0x000b, 0x8054, 0x0008, + 0x0004, 0x0000, 0x8074, 0x0000, 0x8000, 0x0000, 0x0118, 0x0003, + 0x92c0, 0x0009, 0x0fc8, 0x0000, 0x080a, 0x0003, 0x1246, 0x000a, + 0x8995, 0x0003, 0x1a60, 0x0000, 0x8062, 0x0008, 0x0002, 0x0000, + 0x8066, 0x0000, 0x367a, 0x0000, 0xc0f6, 0x000b, 0x92c0, 0x0009, + 0x0780, 0x0008, 0x89af, 0x0003, 0x124b, 0x0002, 0x08ff, 0x0003, + 0x2e4d, 0x0002, 0x2e4d, 0x0002, 0x099b, 0x0003, 0x3a46, 0x000a, + 0x890c, 0x0003, 0x5901, 0x0003, 0x8054, 0x0008, 0x0004, 0x0000, + 0x1243, 0x000a, 0x0916, 0x0003, 0x8010, 0x0008, 0x000d, 0x0000, + 0x0189, 0x0004, 0x1810, 0x0000, 0x0189, 0x0004, 0x0116, 0x000b, + 0x194d, 0x000a, 0x0910, 0x0003, 0x1243, 0x000a, 0x09a5, 0x000b, + 0x5910, 0x0003, 0x8054, 0x0008, 0x0004, 0x0000, 0x017e, 0x000c, + 0x1810, 0x0000, 0x0189, 0x0004, 0x8074, 0x0000, 0xf000, 0x0008, + 0x0d30, 0x0000, 0x3a42, 0x0002, 0x891e, 0x0003, 0x15fe, 0x0008, + 0xb051, 0x000b, 0x000a, 0x000b, 0x8074, 0x0000, 0x0501, 0x0000, + 0x8010, 0x0008, 0x000c, 0x0008, 0x0189, 0x0004, 0x000a, 0x000b, + 0xbbe0, 0x0009, 0x0030, 0x0008, 0x8934, 0x000b, 0x18fe, 0x0000, + 0x3ce0, 0x0009, 0x0931, 0x0003, 0x15fe, 0x0008, 0x3ce0, 0x0009, + 0x0931, 0x0003, 0x0179, 0x0004, 0x8076, 0x0008, 0x0040, 0x0000, + 0x0176, 0x000b, 0x8076, 0x0008, 0x0041, 0x0008, 0x0176, 0x000b, + 0xbbe0, 0x0009, 0x0032, 0x0000, 0x8939, 0x0003, 0x3c1e, 0x0008, + 0x0176, 0x000b, 0xbbe0, 0x0009, 0x0037, 0x0000, 0x895b, 0x000b, + 0x18fe, 0x0000, 0x3ce0, 0x0009, 0x8931, 0x000b, 0x8076, 0x0008, + 0x0040, 0x0000, 0x1a60, 0x0000, 0x8062, 0x0008, 0x000d, 0x0000, + 0xa6d0, 0x0009, 0x0000, 0x0008, 0x7f04, 0x0008, 0xa7d0, 0x0001, + 0x0000, 0x0008, 0x7f06, 0x0000, 0xa8d0, 0x0001, 0x0000, 0x0008, + 0x7f08, 0x0008, 0xa9d0, 0x0009, 0x0000, 0x0008, 0x7f0a, 0x0000, + 0x8066, 0x0000, 0x0422, 0x0000, 0xc152, 0x000b, 0x017e, 0x000c, + 0x8054, 0x0008, 0x0004, 0x0000, 0x8074, 0x0000, 0xf000, 0x0008, + 0x8072, 0x0000, 0x8000, 0x0000, 0x0118, 0x0003, 0xbbe0, 0x0009, + 0x0038, 0x0000, 0x896d, 0x000b, 0x18fe, 0x0000, 0x3ce0, 0x0009, + 0x096a, 0x000b, 0x15fe, 0x0008, 0x3ce0, 0x0009, 0x892d, 0x0003, + 0x0179, 0x0004, 0x8076, 0x0008, 0x0040, 0x0000, 0x8072, 0x0000, + 0x8000, 0x0000, 0x01bf, 0x000b, 0x8076, 0x0008, 0x0042, 0x0008, + 0x0176, 0x000b, 0xbbe0, 0x0009, 0x0016, 0x0000, 0x8976, 0x000b, + 0x3a44, 0x0002, 0x880c, 0x000b, 0x8072, 0x0000, 0x8000, 0x0000, + 0x8000, 0x000f, 0x000a, 0x000b, 0x8072, 0x0000, 0x8000, 0x0000, + 0x000a, 0x000b, 0x3d30, 0x000a, 0x7f00, 0x0000, 0xbc80, 0x0001, + 0x0007, 0x0000, 0x0182, 0x0003, 0x1930, 0x000a, 0x7f00, 0x0000, + 0x9880, 0x0001, 0x0007, 0x0000, 0x8060, 0x0000, 0x0400, 0x0000, + 0x7f62, 0x0008, 0x8066, 0x0000, 0x000a, 0x0008, 0xc187, 0x0003, + 0x4000, 0x000f, 0x2189, 0x0003, 0x0870, 0x0008, 0x4000, 0x000f, + 0xbac0, 0x0009, 0x0090, 0x0008, 0x0992, 0x0003, 0x8074, 0x0000, + 0x0706, 0x0000, 0x0194, 0x000b, 0x8074, 0x0000, 0x0703, 0x0000, + 0x4000, 0x000f, 0x8010, 0x0008, 0x0023, 0x0000, 0x01cd, 0x000b, + 0x8010, 0x0008, 0x0008, 0x0000, 0x01cd, 0x000b, 0x8010, 0x0008, + 0x0022, 0x0008, 0x01cd, 0x000b, 0x017e, 0x000c, 0x8010, 0x0008, + 0x0007, 0x0000, 0x0189, 0x0004, 0x1810, 0x0000, 0x0189, 0x0004, + 0x01d7, 0x0003, 0x017e, 0x000c, 0x8010, 0x0008, 0x001b, 0x0008, + 0x0189, 0x0004, 0x1810, 0x0000, 0x0189, 0x0004, 0x8074, 0x0000, + 0xf080, 0x0000, 0x0d30, 0x0000, 0x000a, 0x000b, 0x8010, 0x0008, + 0x0009, 0x0008, 0x01cd, 0x000b, 0x8010, 0x0008, 0x0005, 0x0008, + 0x01cd, 0x000b, 0x808c, 0x0008, 0x0001, 0x0000, 0x8010, 0x0008, + 0x0004, 0x0000, 0x4143, 0x000a, 0x085f, 0x0003, 0x3a44, 0x0002, + 0x880a, 0x000b, 0x0d2a, 0x0008, 0x01cd, 0x000b, 0x8010, 0x0008, + 0x0003, 0x0008, 0x01cf, 0x0003, 0x8010, 0x0008, 0x000b, 0x0000, + 0x01cf, 0x0003, 0x8010, 0x0008, 0x0002, 0x0000, 0x01cf, 0x0003, + 0x3a47, 0x0002, 0x88e1, 0x000b, 0x8010, 0x0008, 0x0006, 0x0008, + 0x01cf, 0x0003, 0x8074, 0x0000, 0xf000, 0x0008, 0x0189, 0x0004, + 0x018c, 0x0004, 0x3a40, 0x000a, 0x080a, 0x0003, 0x8010, 0x0008, + 0x000c, 0x0008, 0x0189, 0x0004, 0x000a, 0x000b, 0x8074, 0x0000, + 0xf080, 0x0000, 0x0d30, 0x0000, 0x2e4d, 0x0002, 0x2e4d, 0x0002, + 0x09e0, 0x0003, 0x8054, 0x0008, 0x0019, 0x0000, 0x000a, 0x000b, + 0x8054, 0x0008, 0x0009, 0x0008, 0x000a, 0x000b, 0x3a44, 0x0002, + 0x880a, 0x000b, 0x01c2, 0x000b, 0x460b, 0xf5c6, 0x0001, 0x0002, + 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080, 0x0100, 0x0200, + 0x0400, 0x0800, 0x1000, 0x2000, 0x4000, 0x8000, 0x92c4 }; #ifdef UNIQUE_FW_NAME -unsigned short fw2300flx_length01 = 0xdd79; +unsigned short fw2300flx_length01 = 0xdbb7; #else -unsigned short risc_code_length01 = 0xdd79; +unsigned short risc_code_length01 = 0xdbb7; #endif diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c index 87f90c4f0..92b3e13e9 100644 --- a/drivers/scsi/qla2xxx/qla_attr.c +++ b/drivers/scsi/qla2xxx/qla_attr.c @@ -16,16 +16,15 @@ 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_len) - return 0; - if (off + count > ha->fw_dump_len) - count = ha->fw_dump_len - off; + if (off > ha->fw_dump_buffer_len) + return 0; + if (off + count > ha->fw_dump_buffer_len) + count = ha->fw_dump_buffer_len - off; - memcpy(buf, &rbuf[off], count); + memcpy(buf, &ha->fw_dump_buffer[off], count); return (count); } @@ -37,6 +36,7 @@ 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); @@ -44,27 +44,52 @@ 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) - break; + if (ha->fw_dump_reading == 1) { + qla_printk(KERN_INFO, ha, + "Firmware dump cleared on (%ld).\n", + ha->host_no); - qla_printk(KERN_INFO, ha, - "Firmware dump cleared on (%ld).\n", ha->host_no); + vfree(ha->fw_dump_buffer); + if (!IS_QLA24XX(ha) && !IS_QLA25XX(ha)) + free_pages((unsigned long)ha->fw_dump, + ha->fw_dump_order); - ha->fw_dump_reading = 0; - ha->fw_dumped = 0; + ha->fw_dump_reading = 0; + ha->fw_dump_buffer = NULL; + ha->fw_dump = NULL; + ha->fw_dumped = 0; + } break; case 1: - if (ha->fw_dumped && !ha->fw_dump_reading) { + if ((ha->fw_dump || ha->fw_dumped) && !ha->fw_dump_reading) { ha->fw_dump_reading = 1; + if (IS_QLA24XX(ha) || IS_QLA25XX(ha)) + dump_size = FW_DUMP_SIZE_24XX; + else { + 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, - "Raw firmware dump ready for read on (%ld).\n", + "Firmware dump ready for read on (%ld).\n", ha->host_no); + memset(ha->fw_dump_buffer, 0, dump_size); + ha->isp_ops.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); } @@ -113,7 +138,7 @@ qla2x00_sysfs_write_nvram(struct kobject *kobj, char *buf, loff_t off, return 0; /* Checksum NVRAM. */ - if (IS_QLA24XX(ha) || IS_QLA54XX(ha)) { + if (IS_QLA24XX(ha) || IS_QLA25XX(ha)) { uint32_t *iter; uint32_t chksum; @@ -283,102 +308,6 @@ static struct bin_attribute sysfs_optrom_ctl_attr = { .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) { @@ -389,12 +318,6 @@ qla2x00_alloc_sysfs_attr(scsi_qla_host_t *ha) 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 @@ -407,12 +330,6 @@ qla2x00_free_sysfs_attr(scsi_qla_host_t *ha) 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); @@ -533,6 +450,9 @@ qla2x00_zio_show(struct class_device *cdev, char *buf) int len = 0; switch (ha->zio_mode) { + case QLA_ZIO_MODE_5: + len += snprintf(buf + len, PAGE_SIZE-len, "Mode 5\n"); + break; case QLA_ZIO_MODE_6: len += snprintf(buf + len, PAGE_SIZE-len, "Mode 6\n"); break; @@ -550,16 +470,20 @@ qla2x00_zio_store(struct class_device *cdev, const char *buf, size_t count) int val = 0; uint16_t zio_mode; - if (!IS_ZIO_SUPPORTED(ha)) - return -ENOTSUPP; - if (sscanf(buf, "%d", &val) != 1) return -EINVAL; - if (val) + switch (val) { + case 1: + zio_mode = QLA_ZIO_MODE_5; + break; + case 2: zio_mode = QLA_ZIO_MODE_6; - else + break; + default: zio_mode = QLA_ZIO_DISABLED; + break; + } /* Update per-hba values and queue a reset. */ if (zio_mode != QLA_ZIO_DISABLED || ha->zio_mode != QLA_ZIO_DISABLED) { @@ -826,7 +750,7 @@ qla2x00_get_fc_host_stats(struct Scsi_Host *shost) pfc_host_stat = &ha->fc_host_stat; memset(pfc_host_stat, -1, sizeof(struct fc_host_statistics)); - if (IS_QLA24XX(ha) || IS_QLA54XX(ha)) { + if (IS_QLA24XX(ha) || IS_QLA25XX(ha)) { rval = qla24xx_get_isp_stats(ha, (uint32_t *)&stat_buf, sizeof(stat_buf) / 4, mb_stat); } else { diff --git a/drivers/scsi/qla2xxx/qla_dbg.c b/drivers/scsi/qla2xxx/qla_dbg.c index f6ed6962b..2d9b12ffe 100644 --- a/drivers/scsi/qla2xxx/qla_dbg.c +++ b/drivers/scsi/qla2xxx/qla_dbg.c @@ -8,34 +8,7 @@ #include -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)); -} +static int qla_uprintf(char **, char *, ...); /** * qla2300_fw_dump() - Dumps binary data from the 2300 firmware. @@ -55,7 +28,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 data_ram_cnt; + uint32_t dump_size, data_ram_cnt; risc_address = data_ram_cnt = 0; mb0 = mb2 = 0; @@ -64,23 +37,29 @@ 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) { + if (ha->fw_dump != NULL) { qla_printk(KERN_WARNING, ha, - "No buffer available for dump!!!\n"); + "Firmware has been previously dumped (%p) -- ignoring " + "request...\n", ha->fw_dump); goto qla2300_fw_dump_failed; } - if (ha->fw_dumped) { + /* 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) { qla_printk(KERN_WARNING, ha, - "Firmware has been previously dumped (%p) -- ignoring " - "request...\n", ha->fw_dump); + "Unable to allocated memory for firmware dump (%d/%d).\n", + ha->fw_dump_order, dump_size); goto qla2300_fw_dump_failed; } - fw = &ha->fw_dump->isp.isp23; - qla2xxx_prep_dump(ha, ha->fw_dump); + fw = ha->fw_dump; rval = QLA_SUCCESS; - fw->hccr = htons(RD_REG_WORD(®->hccr)); + fw->hccr = RD_REG_WORD(®->hccr); /* Pause RISC. */ WRT_REG_WORD(®->hccr, HCCR_PAUSE_RISC); @@ -101,86 +80,85 @@ 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] = htons(RD_REG_WORD(dmp_reg++)); + fw->pbiu_reg[cnt] = 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] = htons(RD_REG_WORD(dmp_reg++)); + fw->risc_host_reg[cnt] = 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] = htons(RD_REG_WORD(dmp_reg++)); + fw->mailbox_reg[cnt] = 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] = htons(RD_REG_WORD(dmp_reg++)); + fw->resp_dma_reg[cnt] = 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] = htons(RD_REG_WORD(dmp_reg++)); + fw->dma_reg[cnt] = 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] = htons(RD_REG_WORD(dmp_reg++)); + fw->risc_hdw_reg[cnt] = 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] = htons(RD_REG_WORD(dmp_reg++)); + fw->risc_gp0_reg[cnt] = 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] = htons(RD_REG_WORD(dmp_reg++)); + fw->risc_gp1_reg[cnt] = 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] = htons(RD_REG_WORD(dmp_reg++)); + fw->risc_gp2_reg[cnt] = 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] = htons(RD_REG_WORD(dmp_reg++)); + fw->risc_gp3_reg[cnt] = 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] = htons(RD_REG_WORD(dmp_reg++)); + fw->risc_gp4_reg[cnt] = 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] = htons(RD_REG_WORD(dmp_reg++)); + fw->risc_gp5_reg[cnt] = 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] = htons(RD_REG_WORD(dmp_reg++)); + fw->risc_gp6_reg[cnt] = 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] = htons(RD_REG_WORD(dmp_reg++)); + fw->risc_gp7_reg[cnt] = 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] = - htons(RD_REG_WORD(dmp_reg++)); + fw->frame_buf_hdw_reg[cnt] = 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] = htons(RD_REG_WORD(dmp_reg++)); + fw->fpm_b0_reg[cnt] = 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] = htons(RD_REG_WORD(dmp_reg++)); + fw->fpm_b1_reg[cnt] = RD_REG_WORD(dmp_reg++); /* Reset RISC. */ WRT_REG_WORD(®->ctrl_status, CSR_ISP_SOFT_RESET); @@ -255,7 +233,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] = htons(mb2); + fw->risc_ram[cnt] = mb2; } else { rval = QLA_FUNCTION_FAILED; } @@ -314,7 +292,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] = htons(mb2); + fw->stack_ram[cnt] = mb2; } else { rval = QLA_FUNCTION_FAILED; } @@ -374,25 +352,23 @@ 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] = htons(mb2); + fw->data_ram[cnt] = 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: @@ -400,6 +376,193 @@ 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 @@ -424,23 +587,27 @@ 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) { + if (ha->fw_dump != NULL) { qla_printk(KERN_WARNING, ha, - "No buffer available for dump!!!\n"); + "Firmware has been previously dumped (%p) -- ignoring " + "request...\n", ha->fw_dump); goto qla2100_fw_dump_failed; } - if (ha->fw_dumped) { + /* 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) { qla_printk(KERN_WARNING, ha, - "Firmware has been previously dumped (%p) -- ignoring " - "request...\n", ha->fw_dump); + "Unable to allocated memory for firmware dump (%d/%Zd).\n", + ha->fw_dump_order, sizeof(struct qla2100_fw_dump)); goto qla2100_fw_dump_failed; } - fw = &ha->fw_dump->isp.isp21; - qla2xxx_prep_dump(ha, ha->fw_dump); + fw = ha->fw_dump; rval = QLA_SUCCESS; - fw->hccr = htons(RD_REG_WORD(®->hccr)); + fw->hccr = RD_REG_WORD(®->hccr); /* Pause RISC. */ WRT_REG_WORD(®->hccr, HCCR_PAUSE_RISC); @@ -454,81 +621,79 @@ 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] = htons(RD_REG_WORD(dmp_reg++)); + fw->pbiu_reg[cnt] = 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] = htons(RD_REG_WORD(dmp_reg++)); + fw->mailbox_reg[cnt] = 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] = htons(RD_REG_WORD(dmp_reg++)); + fw->dma_reg[cnt] = 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] = htons(RD_REG_WORD(dmp_reg++)); + fw->risc_hdw_reg[cnt] = 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] = htons(RD_REG_WORD(dmp_reg++)); + fw->risc_gp0_reg[cnt] = 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] = htons(RD_REG_WORD(dmp_reg++)); + fw->risc_gp1_reg[cnt] = 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] = htons(RD_REG_WORD(dmp_reg++)); + fw->risc_gp2_reg[cnt] = 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] = htons(RD_REG_WORD(dmp_reg++)); + fw->risc_gp3_reg[cnt] = 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] = htons(RD_REG_WORD(dmp_reg++)); + fw->risc_gp4_reg[cnt] = 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] = htons(RD_REG_WORD(dmp_reg++)); + fw->risc_gp5_reg[cnt] = 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] = htons(RD_REG_WORD(dmp_reg++)); + fw->risc_gp6_reg[cnt] = 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] = htons(RD_REG_WORD(dmp_reg++)); + fw->risc_gp7_reg[cnt] = 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] = - htons(RD_REG_WORD(dmp_reg++)); + fw->frame_buf_hdw_reg[cnt] = 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] = htons(RD_REG_WORD(dmp_reg++)); + fw->fpm_b0_reg[cnt] = 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] = htons(RD_REG_WORD(dmp_reg++)); + fw->fpm_b1_reg[cnt] = RD_REG_WORD(dmp_reg++); /* Reset the ISP. */ WRT_REG_WORD(®->ctrl_status, CSR_ISP_SOFT_RESET); @@ -603,25 +768,22 @@ 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] = htons(mb2); + fw->risc_ram[cnt] = 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: @@ -629,6 +791,179 @@ 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) { @@ -645,7 +980,6 @@ 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)); @@ -654,7 +988,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_dump) { + if (!ha->fw_dump24) { qla_printk(KERN_WARNING, ha, "No buffer available for dump!!!\n"); goto qla24xx_fw_dump_failed; @@ -663,14 +997,13 @@ 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_dump); + "request...\n", ha->fw_dump24); goto qla24xx_fw_dump_failed; } - fw = &ha->fw_dump->isp.isp24; - qla2xxx_prep_dump(ha, ha->fw_dump); + fw = (struct qla24xx_fw_dump *) ha->fw_dump24; rval = QLA_SUCCESS; - fw->host_status = htonl(RD_REG_DWORD(®->host_status)); + fw->host_status = RD_REG_DWORD(®->host_status); /* Pause RISC. */ if ((RD_REG_DWORD(®->hccr) & HCCRX_RISC_PAUSE) == 0) { @@ -692,7 +1025,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] = htonl(RD_REG_DWORD(dmp_reg++)); + fw->host_reg[cnt] = RD_REG_DWORD(dmp_reg++); /* Disable interrupts. */ WRT_REG_DWORD(®->ictrl, 0); @@ -704,471 +1037,470 @@ 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] = htonl(RD_REG_DWORD(dmp_reg)); + fw->shadow_reg[0] = 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] = htonl(RD_REG_DWORD(dmp_reg)); + fw->shadow_reg[1] = 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] = htonl(RD_REG_DWORD(dmp_reg)); + fw->shadow_reg[2] = 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] = htonl(RD_REG_DWORD(dmp_reg)); + fw->shadow_reg[3] = 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] = htonl(RD_REG_DWORD(dmp_reg)); + fw->shadow_reg[4] = 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] = htonl(RD_REG_DWORD(dmp_reg)); + fw->shadow_reg[5] = 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] = htonl(RD_REG_DWORD(dmp_reg)); + fw->shadow_reg[6] = 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] = htons(RD_REG_WORD(mbx_reg++)); + fw->mailbox_reg[cnt] = 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++ = htonl(RD_REG_DWORD(dmp_reg++)); + *iter_reg++ = 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++ = htonl(RD_REG_DWORD(dmp_reg++)); + *iter_reg++ = 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++ = htonl(RD_REG_DWORD(dmp_reg++)); + *iter_reg++ = 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++ = htonl(RD_REG_DWORD(dmp_reg++)); + *iter_reg++ = 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++ = htonl(RD_REG_DWORD(dmp_reg++)); + *iter_reg++ = 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++ = htonl(RD_REG_DWORD(dmp_reg++)); + *iter_reg++ = 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++ = htonl(RD_REG_DWORD(dmp_reg++)); + *iter_reg++ = 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++ = htonl(RD_REG_DWORD(dmp_reg++)); + *iter_reg++ = 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] = htonl(RD_REG_DWORD(dmp_reg++)); + fw->xseq_0_reg[cnt] = 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] = htonl(RD_REG_DWORD(dmp_reg++)); + fw->xseq_1_reg[cnt] = 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++ = htonl(RD_REG_DWORD(dmp_reg++)); + *iter_reg++ = 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++ = htonl(RD_REG_DWORD(dmp_reg++)); + *iter_reg++ = 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++ = htonl(RD_REG_DWORD(dmp_reg++)); + *iter_reg++ = 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++ = htonl(RD_REG_DWORD(dmp_reg++)); + *iter_reg++ = 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++ = htonl(RD_REG_DWORD(dmp_reg++)); + *iter_reg++ = 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++ = htonl(RD_REG_DWORD(dmp_reg++)); + *iter_reg++ = 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++ = htonl(RD_REG_DWORD(dmp_reg++)); + *iter_reg++ = 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++ = htonl(RD_REG_DWORD(dmp_reg++)); + *iter_reg++ = 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] = htonl(RD_REG_DWORD(dmp_reg++)); + fw->rseq_0_reg[cnt] = 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] = htonl(RD_REG_DWORD(dmp_reg++)); + fw->rseq_1_reg[cnt] = 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] = htonl(RD_REG_DWORD(dmp_reg++)); + fw->rseq_2_reg[cnt] = 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] = htonl(RD_REG_DWORD(dmp_reg++)); + fw->cmd_dma_reg[cnt] = 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++ = htonl(RD_REG_DWORD(dmp_reg++)); + *iter_reg++ = RD_REG_DWORD(dmp_reg++); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xE4); for (cnt = 0; cnt < 7; cnt++) - *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); + *iter_reg++ = 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++ = htonl(RD_REG_DWORD(dmp_reg++)); + *iter_reg++ = RD_REG_DWORD(dmp_reg++); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xE4); for (cnt = 0; cnt < 7; cnt++) - *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); + *iter_reg++ = 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++ = htonl(RD_REG_DWORD(dmp_reg++)); + *iter_reg++ = RD_REG_DWORD(dmp_reg++); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xE4); for (cnt = 0; cnt < 7; cnt++) - *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); + *iter_reg++ = 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++ = htonl(RD_REG_DWORD(dmp_reg++)); + *iter_reg++ = 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++ = htonl(RD_REG_DWORD(dmp_reg++)); + *iter_reg++ = 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++ = htonl(RD_REG_DWORD(dmp_reg++)); + *iter_reg++ = 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++ = htonl(RD_REG_DWORD(dmp_reg++)); + *iter_reg++ = 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++ = htonl(RD_REG_DWORD(dmp_reg++)); + *iter_reg++ = 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++ = htonl(RD_REG_DWORD(dmp_reg++)); + *iter_reg++ = 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++ = htonl(RD_REG_DWORD(dmp_reg++)); + *iter_reg++ = 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++ = htonl(RD_REG_DWORD(dmp_reg++)); + *iter_reg++ = 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++ = htonl(RD_REG_DWORD(dmp_reg++)); + *iter_reg++ = 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++ = htonl(RD_REG_DWORD(dmp_reg++)); + *iter_reg++ = 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] = - htonl(RD_REG_DWORD(dmp_reg++)); + fw->xmt_data_dma_reg[cnt] = 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++ = htonl(RD_REG_DWORD(dmp_reg++)); + *iter_reg++ = 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++ = htonl(RD_REG_DWORD(dmp_reg++)); + *iter_reg++ = 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++ = htonl(RD_REG_DWORD(dmp_reg++)); + *iter_reg++ = 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++ = htonl(RD_REG_DWORD(dmp_reg++)); + *iter_reg++ = 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++ = htonl(RD_REG_DWORD(dmp_reg++)); + *iter_reg++ = 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++ = htonl(RD_REG_DWORD(dmp_reg++)); + *iter_reg++ = 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++ = htonl(RD_REG_DWORD(dmp_reg++)); + *iter_reg++ = 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++ = htonl(RD_REG_DWORD(dmp_reg++)); + *iter_reg++ = 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++ = htonl(RD_REG_DWORD(dmp_reg++)); + *iter_reg++ = 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++ = htonl(RD_REG_DWORD(dmp_reg++)); + *iter_reg++ = 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++ = htonl(RD_REG_DWORD(dmp_reg++)); + *iter_reg++ = 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++ = htonl(RD_REG_DWORD(dmp_reg++)); + *iter_reg++ = 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++ = htonl(RD_REG_DWORD(dmp_reg++)); + *iter_reg++ = 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++ = htonl(RD_REG_DWORD(dmp_reg++)); + *iter_reg++ = 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++ = htonl(RD_REG_DWORD(dmp_reg++)); + *iter_reg++ = 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++ = htonl(RD_REG_DWORD(dmp_reg++)); + *iter_reg++ = 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++ = htonl(RD_REG_DWORD(dmp_reg++)); + *iter_reg++ = 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++ = htonl(RD_REG_DWORD(dmp_reg++)); + *iter_reg++ = 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++ = htonl(RD_REG_DWORD(dmp_reg++)); + *iter_reg++ = 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++ = htonl(RD_REG_DWORD(dmp_reg++)); + *iter_reg++ = 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++ = htonl(RD_REG_DWORD(dmp_reg++)); + *iter_reg++ = 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++ = htonl(RD_REG_DWORD(dmp_reg++)); + *iter_reg++ = 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++ = htonl(RD_REG_DWORD(dmp_reg++)); + *iter_reg++ = 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++ = htonl(RD_REG_DWORD(dmp_reg++)); + *iter_reg++ = 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++ = htonl(RD_REG_DWORD(dmp_reg++)); + *iter_reg++ = 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++ = htonl(RD_REG_DWORD(dmp_reg++)); + *iter_reg++ = 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++ = htonl(RD_REG_DWORD(dmp_reg++)); + *iter_reg++ = 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++ = htonl(RD_REG_DWORD(dmp_reg++)); + *iter_reg++ = 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++ = htonl(RD_REG_DWORD(dmp_reg++)); + *iter_reg++ = 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++ = htonl(RD_REG_DWORD(dmp_reg++)); + *iter_reg++ = 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++ = htonl(RD_REG_DWORD(dmp_reg++)); + *iter_reg++ = 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++ = htonl(RD_REG_DWORD(dmp_reg++)); + *iter_reg++ = 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++ = htonl(RD_REG_DWORD(dmp_reg++)); + *iter_reg++ = 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++ = htonl(RD_REG_DWORD(dmp_reg++)); + *iter_reg++ = 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++ = htonl(RD_REG_DWORD(dmp_reg++)); + *iter_reg++ = 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++ = htonl(RD_REG_DWORD(dmp_reg++)); + *iter_reg++ = 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++ = htonl(RD_REG_DWORD(dmp_reg++)); + *iter_reg++ = 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++ = htonl(RD_REG_DWORD(dmp_reg++)); + *iter_reg++ = 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++ = htonl(RD_REG_DWORD(dmp_reg++)); + *iter_reg++ = 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++ = htonl(RD_REG_DWORD(dmp_reg++)); + *iter_reg++ = 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++ = htonl(RD_REG_DWORD(dmp_reg++)); + *iter_reg++ = 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++ = htonl(RD_REG_DWORD(dmp_reg++)); + *iter_reg++ = RD_REG_DWORD(dmp_reg++); /* Reset RISC. */ WRT_REG_DWORD(®->ctrl_status, @@ -1258,7 +1590,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] = htonl((mb[3] << 16) | mb[2]); + fw->code_ram[cnt] = (mb[3] << 16) | mb[2]; } else { rval = QLA_FUNCTION_FAILED; } @@ -1308,18 +1640,12 @@ 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] = htonl((mb[3] << 16) | mb[2]); + fw->ext_mem[cnt] = (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); @@ -1328,7 +1654,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_dump); + ha->host_no, ha->fw_dump24); ha->fw_dumped = 1; } @@ -1337,6 +1663,252 @@ 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. */ /****************************************************************************/ @@ -1423,6 +1995,7 @@ 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 533425338..ab6afeaa2 100644 --- a/drivers/scsi/qla2xxx/qla_dbg.h +++ b/drivers/scsi/qla2xxx/qla_dbg.h @@ -37,86 +37,134 @@ /* * 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 -#define DEBUG(x) do { if (extended_error_logging) { x; } } while (0) +#if DEBUG_QLA2100 +#define DEBUG(x) do {x;} while (0); +#else +#define DEBUG(x) do {} while (0); +#endif #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 -#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_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 #if defined(QL_DEBUG_LEVEL_3) -#define DEBUG3(x) do {x;} while (0) -#define DEBUG3_11(x) do {x;} while (0) +#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); #else -#define DEBUG3(x) do {} while (0) +#define DEBUG3(x) do {} while (0); + #if !defined(QL_DEBUG_LEVEL_2) + #define DEBUG2_3(x) do {} while (0); + #endif #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 DEBUG9(x) do {x;} while (0); +#define DEBUG9_10(x) do {x;} while (0); +#define DEBUG2_9_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 DEBUG9_10(x) do {x;} while (0) +#define DEBUG10(x) do {x;} while (0); +#define DEBUG2_9_10(x) do {x;} while (0); +#define DEBUG9_10(x) do {x;} while (0); #else -#define DEBUG10(x) do {} while (0) +#define DEBUG10(x) do {} while (0); + #if !defined(DEBUG2_9_10) + #define DEBUG2_9_10(x) do {} while (0); + #endif #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) +#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 #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) +#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 #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) @@ -128,6 +176,9 @@ /* * 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; @@ -173,6 +224,8 @@ 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]; @@ -204,39 +257,3 @@ 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 0930260ae..b31a03bbd 100644 --- a/drivers/scsi/qla2xxx/qla_def.h +++ b/drivers/scsi/qla2xxx/qla_def.h @@ -31,7 +31,81 @@ #include #include -#define QLA2XXX_DRIVER_NAME "qla2xxx" +#if defined(CONFIG_SCSI_QLA2XXX_EMBEDDED_FIRMWARE) +#if defined(CONFIG_SCSI_QLA21XX) || defined(CONFIG_SCSI_QLA21XX_MODULE) +#define IS_QLA2100(ha) ((ha)->pdev->device == PCI_DEVICE_ID_QLOGIC_ISP2100) +#else +#define IS_QLA2100(ha) 0 +#endif + +#if defined(CONFIG_SCSI_QLA22XX) || defined(CONFIG_SCSI_QLA22XX_MODULE) +#define IS_QLA2200(ha) ((ha)->pdev->device == PCI_DEVICE_ID_QLOGIC_ISP2200) +#else +#define IS_QLA2200(ha) 0 +#endif + +#if defined(CONFIG_SCSI_QLA2300) || defined(CONFIG_SCSI_QLA2300_MODULE) +#define IS_QLA2300(ha) ((ha)->pdev->device == PCI_DEVICE_ID_QLOGIC_ISP2300) +#define IS_QLA2312(ha) ((ha)->pdev->device == PCI_DEVICE_ID_QLOGIC_ISP2312) +#else +#define IS_QLA2300(ha) 0 +#define IS_QLA2312(ha) 0 +#endif + +#if defined(CONFIG_SCSI_QLA2322) || defined(CONFIG_SCSI_QLA2322_MODULE) +#define IS_QLA2322(ha) ((ha)->pdev->device == PCI_DEVICE_ID_QLOGIC_ISP2322) +#else +#define IS_QLA2322(ha) 0 +#endif + +#if defined(CONFIG_SCSI_QLA6312) || defined(CONFIG_SCSI_QLA6312_MODULE) +#define IS_QLA6312(ha) ((ha)->pdev->device == PCI_DEVICE_ID_QLOGIC_ISP6312) +#define IS_QLA6322(ha) ((ha)->pdev->device == PCI_DEVICE_ID_QLOGIC_ISP6322) +#else +#define IS_QLA6312(ha) 0 +#define IS_QLA6322(ha) 0 +#endif + +#if defined(CONFIG_SCSI_QLA24XX) || defined(CONFIG_SCSI_QLA24XX_MODULE) +#define IS_QLA2422(ha) ((ha)->pdev->device == PCI_DEVICE_ID_QLOGIC_ISP2422) +#define IS_QLA2432(ha) ((ha)->pdev->device == PCI_DEVICE_ID_QLOGIC_ISP2432) +#else +#define IS_QLA2422(ha) 0 +#define IS_QLA2432(ha) 0 +#endif + +#if defined(CONFIG_SCSI_QLA25XX) || defined(CONFIG_SCSI_QLA25XX_MODULE) +#define IS_QLA2512(ha) ((ha)->pdev->device == PCI_DEVICE_ID_QLOGIC_ISP2512) +#define IS_QLA2522(ha) ((ha)->pdev->device == PCI_DEVICE_ID_QLOGIC_ISP2522) +#else +#define IS_QLA2512(ha) 0 +#define IS_QLA2522(ha) 0 +#endif + +#else /* !defined(CONFIG_SCSI_QLA2XXX_EMBEDDED_FIRMWARE) */ + +#define IS_QLA2100(ha) ((ha)->pdev->device == PCI_DEVICE_ID_QLOGIC_ISP2100) +#define IS_QLA2200(ha) ((ha)->pdev->device == PCI_DEVICE_ID_QLOGIC_ISP2200) +#define IS_QLA2300(ha) ((ha)->pdev->device == PCI_DEVICE_ID_QLOGIC_ISP2300) +#define IS_QLA2312(ha) ((ha)->pdev->device == PCI_DEVICE_ID_QLOGIC_ISP2312) +#define IS_QLA2322(ha) ((ha)->pdev->device == PCI_DEVICE_ID_QLOGIC_ISP2322) +#define IS_QLA6312(ha) ((ha)->pdev->device == PCI_DEVICE_ID_QLOGIC_ISP6312) +#define IS_QLA6322(ha) ((ha)->pdev->device == PCI_DEVICE_ID_QLOGIC_ISP6322) +#define IS_QLA2422(ha) ((ha)->pdev->device == PCI_DEVICE_ID_QLOGIC_ISP2422) +#define IS_QLA2432(ha) ((ha)->pdev->device == PCI_DEVICE_ID_QLOGIC_ISP2432) +#define IS_QLA2512(ha) ((ha)->pdev->device == PCI_DEVICE_ID_QLOGIC_ISP2512) +#define IS_QLA2522(ha) ((ha)->pdev->device == PCI_DEVICE_ID_QLOGIC_ISP2522) +#endif + +#define IS_QLA23XX(ha) (IS_QLA2300(ha) || IS_QLA2312(ha) || IS_QLA2322(ha) || \ + IS_QLA6312(ha) || IS_QLA6322(ha)) +#define IS_QLA24XX(ha) (IS_QLA2422(ha) || IS_QLA2432(ha)) +#define IS_QLA25XX(ha) (IS_QLA2512(ha) || IS_QLA2522(ha)) + +/* + * Only non-ISP2[12]00 have extended addressing support in the firmware. + */ +#define HAS_EXTENDED_IDS(ha) (!IS_QLA2100(ha) && !IS_QLA2200(ha)) /* * We have MAILBOX_REGISTER_COUNT sized arrays in a few places, @@ -191,13 +265,22 @@ 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; /* @@ -218,6 +301,21 @@ 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. */ @@ -248,8 +346,6 @@ struct device_reg_2xxx { #define NVR_SELECT BIT_1 #define NVR_CLOCK BIT_0 -#define NVR_WAIT_CNT 20000 - union { struct { uint16_t mailbox0; @@ -487,7 +583,6 @@ 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. */ @@ -609,9 +704,7 @@ 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. */ @@ -621,9 +714,6 @@ 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 @@ -748,6 +838,7 @@ typedef struct { #define PD_STATE_WAIT_PORT_LOGOUT_ACK 11 +#define QLA_ZIO_MODE_5 (BIT_2 | BIT_0) #define QLA_ZIO_MODE_6 (BIT_2 | BIT_1) #define QLA_ZIO_DISABLED 0 #define QLA_ZIO_DEFAULT_TIMER 2 @@ -1499,6 +1590,62 @@ 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. */ @@ -1517,6 +1664,7 @@ 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]; @@ -1531,13 +1679,23 @@ 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; /* @@ -1946,6 +2104,54 @@ 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]; @@ -2003,6 +2209,7 @@ 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 *); @@ -2046,7 +2253,6 @@ 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; @@ -2094,53 +2300,12 @@ typedef struct scsi_qla_host { #define SWITCH_FOUND BIT_3 #define DFLG_NO_CABLE BIT_4 - uint32_t device_type; -#define DT_ISP2100 BIT_0 -#define DT_ISP2200 BIT_1 -#define DT_ISP2300 BIT_2 -#define DT_ISP2312 BIT_3 -#define DT_ISP2322 BIT_4 -#define DT_ISP6312 BIT_5 -#define DT_ISP6322 BIT_6 -#define DT_ISP2422 BIT_7 -#define DT_ISP2432 BIT_8 -#define DT_ISP5422 BIT_9 -#define DT_ISP5432 BIT_10 -#define DT_ISP_LAST (DT_ISP5432 << 1) - -#define DT_ZIO_SUPPORTED BIT_28 -#define DT_OEM_001 BIT_29 -#define DT_ISP2200A BIT_30 -#define DT_EXTENDED_IDS BIT_31 - -#define DT_MASK(ha) ((ha)->device_type & (DT_ISP_LAST - 1)) -#define IS_QLA2100(ha) (DT_MASK(ha) & DT_ISP2100) -#define IS_QLA2200(ha) (DT_MASK(ha) & DT_ISP2200) -#define IS_QLA2300(ha) (DT_MASK(ha) & DT_ISP2300) -#define IS_QLA2312(ha) (DT_MASK(ha) & DT_ISP2312) -#define IS_QLA2322(ha) (DT_MASK(ha) & DT_ISP2322) -#define IS_QLA6312(ha) (DT_MASK(ha) & DT_ISP6312) -#define IS_QLA6322(ha) (DT_MASK(ha) & DT_ISP6322) -#define IS_QLA2422(ha) (DT_MASK(ha) & DT_ISP2422) -#define IS_QLA2432(ha) (DT_MASK(ha) & DT_ISP2432) -#define IS_QLA5422(ha) (DT_MASK(ha) & DT_ISP5422) -#define IS_QLA5432(ha) (DT_MASK(ha) & DT_ISP5432) - -#define IS_QLA23XX(ha) (IS_QLA2300(ha) || IS_QLA2312(ha) || IS_QLA2322(ha) || \ - IS_QLA6312(ha) || IS_QLA6322(ha)) -#define IS_QLA24XX(ha) (IS_QLA2422(ha) || IS_QLA2432(ha)) -#define IS_QLA54XX(ha) (IS_QLA5422(ha) || IS_QLA5432(ha)) - -#define IS_ZIO_SUPPORTED(ha) ((ha)->device_type & DT_ZIO_SUPPORTED) -#define IS_OEM_001(ha) ((ha)->device_type & DT_OEM_001) -#define HAS_EXTENDED_IDS(ha) ((ha)->device_type & DT_EXTENDED_IDS) - /* SRB cache. */ #define SRB_MIN_REQ 128 mempool_t *srb_mempool; /* This spinlock is used to protect "io transactions", you must - * acquire it before doing any IO to the card, eg with RD_REG*() and + * aquire 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. @@ -2174,6 +2339,9 @@ 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; @@ -2213,8 +2381,6 @@ typedef struct scsi_qla_host { /* NVRAM configuration data */ uint16_t nvram_size; uint16_t nvram_base; - uint16_t vpd_size; - uint16_t vpd_base; uint16_t loop_reset_delay; uint8_t retry_count; @@ -2229,6 +2395,10 @@ 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]; @@ -2244,12 +2414,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; + pid_t dpc_pid; + int dpc_should_die; + struct completion dpc_inited; + struct completion dpc_exited; + struct semaphore *dpc_wait; uint8_t dpc_active; /* DPC routine is active */ /* Timeout timers. */ @@ -2264,6 +2433,9 @@ 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; @@ -2272,6 +2444,9 @@ 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]; @@ -2298,28 +2473,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. */ - struct qla2xxx_fw_dump *fw_dump; - uint32_t fw_dump_len; - int fw_dumped; + void *fw_dump; + int fw_dump_order; int fw_dump_reading; - dma_addr_t eft_dma; - void *eft; + char *fw_dump_buffer; + int fw_dump_buffer_len; + + int fw_dumped; + void *fw_dump24; + int fw_dump24_len; uint8_t host_str[16]; uint32_t pci_attr; @@ -2366,6 +2541,8 @@ 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...) \ @@ -2398,6 +2575,19 @@ 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) @@ -2413,6 +2603,12 @@ typedef struct scsi_qla_host { #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 dd435410d..5109735dd 100644 --- a/drivers/scsi/qla2xxx/qla_devtbl.h +++ b/drivers/scsi/qla2xxx/qla_devtbl.h @@ -1,94 +1,146 @@ -#define QLA_MODEL_NAMES 0x57 +#define QLA_MODEL_NAMES 0x44 /* - * Adapter model names and descriptions. + * Adapter model names. */ -static char *qla2x00_model_name[QLA_MODEL_NAMES*2] = { - "QLA2340", "133MHz PCI-X to 2Gb FC, Single Channel", /* 0x100 */ - "QLA2342", "133MHz PCI-X to 2Gb FC, Dual Channel", /* 0x101 */ - "QLA2344", "133MHz PCI-X to 2Gb FC, Quad Channel", /* 0x102 */ - "QCP2342", "cPCI to 2Gb FC, Dual Channel", /* 0x103 */ - "QSB2340", "SBUS to 2Gb FC, Single Channel", /* 0x104 */ - "QSB2342", "SBUS to 2Gb FC, Dual Channel", /* 0x105 */ - "QLA2310", "Sun 66MHz PCI-X to 2Gb FC, Single Channel", /* 0x106 */ - "QLA2332", "Sun 66MHz PCI-X to 2Gb FC, Single Channel", /* 0x107 */ - "QCP2332", "Sun cPCI to 2Gb FC, Dual Channel", /* 0x108 */ - "QCP2340", "cPCI to 2Gb FC, Single Channel", /* 0x109 */ - "QLA2342", "Sun 133MHz PCI-X to 2Gb FC, Dual Channel", /* 0x10a */ - "QCP2342", "Sun - cPCI to 2Gb FC, Dual Channel", /* 0x10b */ - "QLA2350", "133MHz PCI-X to 2Gb FC, Single Channel", /* 0x10c */ - "QLA2352", "133MHz PCI-X to 2Gb FC, Dual Channel", /* 0x10d */ - "QLA2352", "Sun 133MHz PCI-X to 2Gb FC, Dual Channel", /* 0x10e */ - " ", " ", /* 0x10f */ - " ", " ", /* 0x110 */ - " ", " ", /* 0x111 */ - " ", " ", /* 0x112 */ - " ", " ", /* 0x113 */ - " ", " ", /* 0x114 */ - "QLA2360", "133MHz PCI-X to 2Gb FC, Single Channel", /* 0x115 */ - "QLA2362", "133MHz PCI-X to 2Gb FC, Dual Channel", /* 0x116 */ - "QLE2360", "PCI-Express to 2Gb FC, Single Channel", /* 0x117 */ - "QLE2362", "PCI-Express to 2Gb FC, Dual Channel", /* 0x118 */ - "QLA200", "133MHz PCI-X to 2Gb FC Optical", /* 0x119 */ - " ", " ", /* 0x11a */ - " ", " ", /* 0x11b */ - "QLA200P", "133MHz PCI-X to 2Gb FC SFP", /* 0x11c */ - " ", " ", /* 0x11d */ - " ", " ", /* 0x11e */ - " ", " ", /* 0x11f */ - " ", " ", /* 0x120 */ - " ", " ", /* 0x121 */ - " ", " ", /* 0x122 */ - " ", " ", /* 0x123 */ - " ", " ", /* 0x124 */ - " ", " ", /* 0x125 */ - " ", " ", /* 0x126 */ - " ", " ", /* 0x127 */ - " ", " ", /* 0x128 */ - " ", " ", /* 0x129 */ - " ", " ", /* 0x12a */ - " ", " ", /* 0x12b */ - " ", " ", /* 0x12c */ - " ", " ", /* 0x12d */ - " ", " ", /* 0x12e */ - "QLA210", "133MHz PCI-X to 2Gb FC, Single Channel", /* 0x12f */ - "EMC 250", "133MHz PCI-X to 2Gb FC, Single Channel", /* 0x130 */ - "HP A7538A", "HP 1p2g PCI-X to 2Gb FC, Single Channel", /* 0x131 */ - "QLA210", "Sun 133MHz PCI-X to 2Gb FC, Single Channel", /* 0x132 */ - "QLA2460", "PCI-X 2.0 to 4Gb FC, Single Channel", /* 0x133 */ - "QLA2462", "PCI-X 2.0 to 4Gb FC, Dual Channel", /* 0x134 */ - "QMC2462", "IBM eServer BC 4Gb FC Expansion Card", /* 0x135 */ - "QMC2462S", "IBM eServer BC 4Gb FC Expansion Card SFF", /* 0x136 */ - "QLE2460", "PCI-Express to 4Gb FC, Single Channel", /* 0x137 */ - "QLE2462", "PCI-Express to 4Gb FC, Dual Channel", /* 0x138 */ - "QME2462", "Dell BS PCI-Express to 4Gb FC, Dual Channel", /* 0x139 */ - " ", " ", /* 0x13a */ - " ", " ", /* 0x13b */ - " ", " ", /* 0x13c */ - "QEM2462", "Sun Server I/O Module 4Gb FC, Dual Channel", /* 0x13d */ - "QLE210", "PCI-Express to 2Gb FC, Single Channel", /* 0x13e */ - "QLE220", "PCI-Express to 4Gb FC, Single Channel", /* 0x13f */ - "QLA2460", "Sun PCI-X 2.0 to 4Gb FC, Single Channel", /* 0x140 */ - "QLA2462", "Sun PCI-X 2.0 to 4Gb FC, Dual Channel", /* 0x141 */ - "QLE2460", "Sun PCI-Express to 2Gb FC, Single Channel", /* 0x142 */ - "QLE2462", "Sun PCI-Express to 4Gb FC, Single Channel", /* 0x143 */ - "QEM2462" "Server I/O Module 4Gb FC, Dual Channel", /* 0x144 */ - "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 */ - "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 */ +static char *qla2x00_model_name[QLA_MODEL_NAMES] = { + "QLA2340", /* 0x100 */ + "QLA2342", /* 0x101 */ + "QLA2344", /* 0x102 */ + "QCP2342", /* 0x103 */ + "QSB2340", /* 0x104 */ + "QSB2342", /* 0x105 */ + "QLA2310", /* 0x106 */ + "QLA2332", /* 0x107 */ + "QCP2332", /* 0x108 */ + "QCP2340", /* 0x109 */ + "QLA2342", /* 0x10a */ + "QCP2342", /* 0x10b */ + "QLA2350", /* 0x10c */ + "QLA2352", /* 0x10d */ + "QLA2352", /* 0x10e */ + "HPQ SVS", /* 0x10f */ + "HPQ SVS", /* 0x110 */ + " ", /* 0x111 */ + " ", /* 0x112 */ + " ", /* 0x113 */ + " ", /* 0x114 */ + "QLA2360", /* 0x115 */ + "QLA2362", /* 0x116 */ + "QLE2360", /* 0x117 */ + "QLE2362", /* 0x118 */ + "QLA200", /* 0x119 */ + "QLA200C", /* 0x11a */ + "QLA200P", /* 0x11b */ + "QLA200P", /* 0x11c */ + " ", /* 0x11d */ + " ", /* 0x11e */ + " ", /* 0x11f */ + " ", /* 0x120 */ + " ", /* 0x121 */ + " ", /* 0x122 */ + " ", /* 0x123 */ + " ", /* 0x124 */ + " ", /* 0x125 */ + " ", /* 0x126 */ + " ", /* 0x127 */ + " ", /* 0x128 */ + " ", /* 0x129 */ + " ", /* 0x12a */ + " ", /* 0x12b */ + " ", /* 0x12c */ + " ", /* 0x12d */ + " ", /* 0x12e */ + "QLA210", /* 0x12f */ + "EMC 250", /* 0x130 */ + "HP A7538A", /* 0x131 */ + "QLA210", /* 0x132 */ + "QLA2460", /* 0x133 */ + "QLA2462", /* 0x134 */ + "QMC2462", /* 0x135 */ + "QMC2462S", /* 0x136 */ + "QLE2460", /* 0x137 */ + "QLE2462", /* 0x138 */ + "QME2462", /* 0x139 */ + "QLA2440", /* 0x13a */ + "QLA2442", /* 0x13b */ + "QSM2442", /* 0x13c */ + "QSM2462", /* 0x13d */ + "QLE210", /* 0x13e */ + "QLE220", /* 0x13f */ + "QLA2460", /* 0x140 */ + "QLA2462", /* 0x141 */ + "QLE2460", /* 0x142 */ + "QLE2462" /* 0x143 */ +}; + +static char *qla2x00_model_desc[QLA_MODEL_NAMES] = { + "133MHz PCI-X to 2Gb FC, Single Channel", /* 0x100 */ + "133MHz PCI-X to 2Gb FC, Dual Channel", /* 0x101 */ + "133MHz PCI-X to 2Gb FC, Quad Channel", /* 0x102 */ + " ", /* 0x103 */ + " ", /* 0x104 */ + " ", /* 0x105 */ + " ", /* 0x106 */ + " ", /* 0x107 */ + " ", /* 0x108 */ + " ", /* 0x109 */ + " ", /* 0x10a */ + " ", /* 0x10b */ + "133MHz PCI-X to 2Gb FC, Single Channel", /* 0x10c */ + "133MHz PCI-X to 2Gb FC, Dual Channel", /* 0x10d */ + " ", /* 0x10e */ + "HPQ SVS HBA- Initiator device", /* 0x10f */ + "HPQ SVS HBA- Target device", /* 0x110 */ + " ", /* 0x111 */ + " ", /* 0x112 */ + " ", /* 0x113 */ + " ", /* 0x114 */ + "133MHz PCI-X to 2Gb FC, Single Channel", /* 0x115 */ + "133MHz PCI-X to 2Gb FC, Dual Channel", /* 0x116 */ + "PCI-Express to 2Gb FC, Single Channel", /* 0x117 */ + "PCI-Express to 2Gb FC, Dual Channel", /* 0x118 */ + "133MHz PCI-X to 2Gb FC Optical", /* 0x119 */ + "133MHz PCI-X to 2Gb FC Copper", /* 0x11a */ + "133MHz PCI-X to 2Gb FC SFP", /* 0x11b */ + "133MHz PCI-X to 2Gb FC SFP", /* 0x11c */ + " ", /* 0x11d */ + " ", /* 0x11e */ + " ", /* 0x11f */ + " ", /* 0x120 */ + " ", /* 0x121 */ + " ", /* 0x122 */ + " ", /* 0x123 */ + " ", /* 0x124 */ + " ", /* 0x125 */ + " ", /* 0x126 */ + " ", /* 0x127 */ + " ", /* 0x128 */ + " ", /* 0x129 */ + " ", /* 0x12a */ + " ", /* 0x12b */ + " ", /* 0x12c */ + " ", /* 0x12d */ + " ", /* 0x12e */ + "133MHz PCI-X to 2Gb FC SFF", /* 0x12f */ + "133MHz PCI-X to 2Gb FC SFF", /* 0x130 */ + "HP 1p2g QLA2340", /* 0x131 */ + "133MHz PCI-X to 2Gb FC, Single Channel", /* 0x132 */ + "PCI-X 2.0 to 4Gb FC, Single Channel", /* 0x133 */ + "PCI-X 2.0 to 4Gb FC, Dual Channel", /* 0x134 */ + "IBM eServer BC 4Gb FC Expansion Card", /* 0x135 */ + "IBM eServer BC 4Gb FC Expansion Card SFF", /* 0x136 */ + "PCI-Express to 4Gb FC, Single Channel", /* 0x137 */ + "PCI-Express to 4Gb FC, Dual Channel", /* 0x138 */ + "Dell PCI-Express to 4Gb FC, Dual Channel", /* 0x139 */ + "PCI-X 1.0 to 4Gb FC, Single Channel", /* 0x13a */ + "PCI-X 1.0 to 4Gb FC, Dual Channel", /* 0x13b */ + "Server I/O Module 4Gb FC, Single Channel", /* 0x13c */ + "Server I/O Module 4Gb FC, Single Channel", /* 0x13d */ + "PCI-Express to 2Gb FC, Single Channel", /* 0x13e */ + "PCI-Express to 4Gb FC, Single Channel", /* 0x13f */ + "Sun PCI-X 2.0 to 4Gb FC, Single Channel", /* 0x140 */ + "Sun PCI-X 2.0 to 4Gb FC, Dual Channel", /* 0x141 */ + "Sun PCI-Express to 2Gb FC, Single Channel", /* 0x142 */ + "Sun PCI-Express to 4Gb FC, Single Channel" /* 0x143 */ }; diff --git a/drivers/scsi/qla2xxx/qla_fw.h b/drivers/scsi/qla2xxx/qla_fw.h index a0a722cf4..9fb562aa4 100644 --- a/drivers/scsi/qla2xxx/qla_fw.h +++ b/drivers/scsi/qla2xxx/qla_fw.h @@ -7,6 +7,7 @@ #ifndef __QLA_FW_H #define __QLA_FW_H +#define RISC_SADDRESS 0x100000 #define MBS_CHECKSUM_ERROR 0x4010 /* @@ -141,7 +142,7 @@ struct nvram_24xx { * BIT 2 = Enable Memory Map BIOS * BIT 3 = Enable Selectable Boot * BIT 4 = Disable RISC code load - * BIT 5 = Disable Serdes + * BIT 5 = * BIT 6 = * BIT 7 = * @@ -278,7 +279,7 @@ struct init_cb_24xx { uint16_t response_q_length; uint16_t request_q_length; - uint16_t link_down_on_nos; /* Milliseconds. */ + uint16_t link_down_timeout; /* Milliseconds. */ uint16_t prio_request_q_length; @@ -462,7 +463,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; /* FW calc residual transfer length. */ + uint32_t residual_len; /* Residual transfer length. */ uint16_t reserved_1; uint16_t state_flags; /* State flags. */ @@ -758,7 +759,7 @@ struct device_reg_24xx { #define FA_NVRAM_FUNC0_ADDR 0x80 #define FA_NVRAM_FUNC1_ADDR 0x180 -#define FA_NVRAM_VPD_SIZE 0x200 +#define FA_NVRAM_VPD_SIZE 0x80 #define FA_NVRAM_VPD0_ADDR 0x00 #define FA_NVRAM_VPD1_ADDR 0x100 /* diff --git a/drivers/scsi/qla2xxx/qla_gbl.h b/drivers/scsi/qla2xxx/qla_gbl.h index 8311ac2b9..ffdc2680f 100644 --- a/drivers/scsi/qla2xxx/qla_gbl.h +++ b/drivers/scsi/qla2xxx/qla_gbl.h @@ -9,6 +9,9 @@ #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. */ @@ -31,11 +34,15 @@ 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 *); +extern int qla2x00_local_device_login(scsi_qla_host_t *, uint16_t); extern void qla2x00_restart_queues(scsi_qla_host_t *, uint8_t); @@ -47,8 +54,6 @@ 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. */ @@ -59,13 +64,14 @@ extern int qlport_down_retry; extern int ql2xplogiabsentdevice; extern int ql2xloginretrycount; extern int ql2xfdmienable; -extern int ql2xallocfwdump; -extern int extended_error_logging; +extern int ql2xprocessrscn; 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); @@ -75,11 +81,11 @@ extern struct fw_blob *qla2x00_request_firmware(scsi_qla_host_t *); extern int qla2x00_wait_for_hba_online(scsi_qla_host_t *); -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); @@ -158,8 +164,7 @@ qla24xx_login_fabric(scsi_qla_host_t *, uint16_t, uint8_t, uint8_t, uint8_t, uint16_t *, uint8_t); extern int -qla2x00_login_local_device(scsi_qla_host_t *, fc_port_t *, uint16_t *, - uint8_t); +qla2x00_login_local_device(scsi_qla_host_t *, uint16_t, uint16_t *, uint8_t); extern int qla2x00_fabric_logout(scsi_qla_host_t *, uint16_t, uint8_t, uint8_t, uint8_t); @@ -202,12 +207,6 @@ 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. */ @@ -258,6 +257,9 @@ 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 *); @@ -280,6 +282,22 @@ 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_gs.c b/drivers/scsi/qla2xxx/qla_gs.c index 2ebf259fc..d620a8e8a 100644 --- a/drivers/scsi/qla2xxx/qla_gs.c +++ b/drivers/scsi/qla2xxx/qla_gs.c @@ -126,7 +126,7 @@ qla2x00_chk_ms_status(scsi_qla_host_t *ha, ms_iocb_entry_t *ms_pkt, DEBUG2_3(printk("scsi(%ld): %s failed, error status (%x).\n", ha->host_no, routine, ms_pkt->entry_status)); } else { - if (IS_QLA24XX(ha) || IS_QLA54XX(ha)) + if (IS_QLA24XX(ha) || IS_QLA25XX(ha)) comp_status = ((struct ct_entry_24xx *)ms_pkt)->comp_status; else @@ -1200,7 +1200,7 @@ qla2x00_update_ms_fdmi_iocb(scsi_qla_host_t *ha, uint32_t req_size) ms_iocb_entry_t *ms_pkt = ha->ms_iocb; struct ct_entry_24xx *ct_pkt = (struct ct_entry_24xx *)ha->ms_iocb; - if (IS_QLA24XX(ha) || IS_QLA54XX(ha)) { + if (IS_QLA24XX(ha) || IS_QLA25XX(ha)) { ct_pkt->cmd_byte_count = cpu_to_le32(req_size); ct_pkt->dseg_0_len = ct_pkt->cmd_byte_count; } else { @@ -1529,7 +1529,9 @@ qla2x00_fdmi_rpa(scsi_qla_host_t *ha) eiter = (struct ct_fdmi_port_attr *) (entries + size); eiter->type = __constant_cpu_to_be16(FDMI_PORT_SUPPORT_SPEED); eiter->len = __constant_cpu_to_be16(4 + 4); - if (IS_QLA24XX(ha) || IS_QLA54XX(ha)) + if (IS_QLA25XX(ha)) + eiter->a.sup_speed = __constant_cpu_to_be32(8); + else if (IS_QLA24XX(ha)) eiter->a.sup_speed = __constant_cpu_to_be32(4); else if (IS_QLA23XX(ha)) eiter->a.sup_speed = __constant_cpu_to_be32(2); @@ -1564,7 +1566,7 @@ qla2x00_fdmi_rpa(scsi_qla_host_t *ha) eiter = (struct ct_fdmi_port_attr *) (entries + size); eiter->type = __constant_cpu_to_be16(FDMI_PORT_MAX_FRAME_SIZE); eiter->len = __constant_cpu_to_be16(4 + 4); - max_frame_size = IS_QLA24XX(ha) || IS_QLA54XX(ha) ? + max_frame_size = IS_QLA24XX(ha) || IS_QLA25XX(ha) ? (uint32_t) icb24->frame_payload_size: (uint32_t) ha->init_cb->frame_payload_size; eiter->a.max_frame_size = cpu_to_be32(max_frame_size); diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c index 859649160..634ee174b 100644 --- a/drivers/scsi/qla2xxx/qla_init.c +++ b/drivers/scsi/qla2xxx/qla_init.c @@ -39,8 +39,6 @@ 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. */ /****************************************************************************/ @@ -91,17 +89,6 @@ 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; @@ -207,6 +194,7 @@ 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); @@ -244,6 +232,7 @@ 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); @@ -331,6 +320,7 @@ 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); @@ -396,7 +386,9 @@ 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, ha->fw_srisc_address); + rval = qla2x00_verify_checksum(ha, + IS_QLA24XX(ha) || IS_QLA25XX(ha) ? RISC_SADDRESS : + *ha->brd_info->fw_info[0].fwstart); } if (rval) { @@ -419,6 +411,7 @@ 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); @@ -526,8 +519,20 @@ 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 (RD_MAILBOX_REG(ha, reg, 0) != MBS_BUSY) + 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); break; + } + + if (!(test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags))) + spin_unlock_irqrestore(&ha->mbx_reg_lock, + mbx_flags); udelay(100); } @@ -722,7 +727,6 @@ qla2x00_chip_diag(scsi_qla_host_t *ha) DEBUG3(printk("scsi(%ld): Found QLA2200A chip.\n", ha->host_no)); - ha->device_type |= DT_ISP2200A; ha->fw_transfer_size = 128; } @@ -783,104 +787,19 @@ qla24xx_chip_diag(scsi_qla_host_t *ha) return rval; } -void +static 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; - 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) { + 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 qla_printk(KERN_WARNING, ha, "Unable to allocate (%d KB) for " - "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)); + "firmware dump!!!\n", ha->fw_dump24_len / 1024); } /** @@ -902,6 +821,9 @@ qla2x00_resize_request_q(scsi_qla_host_t *ha) if (IS_QLA2100(ha) || IS_QLA2200(ha)) return; + if (IS_QLA24XX(ha) || IS_QLA25XX(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) @@ -969,9 +891,6 @@ 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 @@ -1083,10 +1002,6 @@ qla2x00_update_fw_options(scsi_qla_host_t *ha) if (ha->flags.enable_led_scheme) ha->fw_options[2] |= BIT_12; - /* Detect ISP6312. */ - if (IS_QLA6312(ha)) - ha->fw_options[2] |= BIT_13; - /* Update firmware options. */ qla2x00_set_fw_options(ha, ha->fw_options); } @@ -1275,7 +1190,8 @@ qla2x00_fw_ready(scsi_qla_host_t *ha) rval = QLA_FUNCTION_FAILED; if (atomic_read(&ha->loop_down_timer) && - fw_state != FSTATE_READY) { + (fw_state >= FSTATE_LOSS_OF_SYNC || + fw_state == FSTATE_WAIT_AL_PA)) { /* Loop down. Timeout on min_wait for states * other than Wait for Login. */ @@ -1584,9 +1500,9 @@ qla2x00_nvram_config(scsi_qla_host_t *ha) index = (ha->pdev->subsystem_device & 0xff); if (index < QLA_MODEL_NAMES) { strcpy(ha->model_number, - qla2x00_model_name[index * 2]); + qla2x00_model_name[index]); ha->model_desc = - qla2x00_model_name[index * 2 + 1]; + qla2x00_model_desc[index]; } else { strcpy(ha->model_number, "QLA23xx"); } @@ -1624,12 +1540,6 @@ 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) { /* @@ -1643,8 +1553,6 @@ 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)) @@ -1653,7 +1561,6 @@ 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; @@ -1747,8 +1654,6 @@ qla2x00_nvram_config(scsi_qla_host_t *ha) ~(BIT_3 | BIT_2 | BIT_1 | BIT_0); ha->flags.process_response_queue = 0; if (ha->zio_mode != QLA_ZIO_DISABLED) { - ha->zio_mode = QLA_ZIO_MODE_6; - DEBUG2(printk("scsi(%ld): ZIO mode %d enabled; timer " "delay (%d us).\n", ha->host_no, ha->zio_mode, ha->zio_timer * 100)); @@ -1769,6 +1674,14 @@ 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) { @@ -1792,7 +1705,7 @@ qla2x00_rport_del(void *data) * * Returns a pointer to the allocated fcport, or NULL, if none available. */ -static fc_port_t * +fc_port_t * qla2x00_alloc_fcport(scsi_qla_host_t *ha, gfp_t flags) { fc_port_t *fcport; @@ -1806,10 +1719,13 @@ 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); } @@ -1869,9 +1785,6 @@ 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))) { @@ -2135,6 +2048,10 @@ 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) @@ -2205,7 +2122,7 @@ qla2x00_configure_fabric(scsi_qla_host_t *ha) LIST_HEAD(new_fcports); /* If FL port exists, then SNS is present */ - if (IS_QLA24XX(ha) || IS_QLA54XX(ha)) + if (IS_QLA24XX(ha) || IS_QLA25XX(ha)) loop_id = NPH_F_PORT; else loop_id = SNS_FL_PORT; @@ -2231,7 +2148,7 @@ qla2x00_configure_fabric(scsi_qla_host_t *ha) qla2x00_fdmi_register(ha); /* Ensure we are logged into the SNS. */ - if (IS_QLA24XX(ha) || IS_QLA54XX(ha)) + if (IS_QLA24XX(ha) || IS_QLA25XX(ha)) loop_id = NPH_SNS; else loop_id = SIMPLE_NAME_SERVER; @@ -2349,7 +2266,8 @@ qla2x00_configure_fabric(scsi_qla_host_t *ha) } /* Remove device from the new list and add it to DB */ - list_move_tail(&fcport->list, &ha->fcports); + list_del(&fcport->list); + list_add_tail(&fcport->list, &ha->fcports); /* Login and update database */ qla2x00_fabric_dev_login(ha, fcport, &next_loopid); @@ -2588,7 +2506,7 @@ qla2x00_find_all_fabric_devs(scsi_qla_host_t *ha, struct list_head *new_fcports) * Context: * Kernel context. */ -static int +int qla2x00_find_new_loop_id(scsi_qla_host_t *ha, fc_port_t *dev) { int rval; @@ -2662,6 +2580,7 @@ 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; @@ -2717,6 +2636,17 @@ 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_QLA25XX(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: @@ -2734,6 +2664,10 @@ 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 || @@ -2947,13 +2881,13 @@ qla2x00_fabric_login(scsi_qla_host_t *ha, fc_port_t *fcport, * 3 - Fatal error */ int -qla2x00_local_device_login(scsi_qla_host_t *ha, fc_port_t *fcport) +qla2x00_local_device_login(scsi_qla_host_t *ha, uint16_t loop_id) { int rval; uint16_t mb[MAILBOX_REGISTER_COUNT]; memset(mb, 0, sizeof(mb)); - rval = qla2x00_login_local_device(ha, fcport, mb, BIT_0); + rval = qla2x00_login_local_device(ha, loop_id, mb, BIT_0); if (rval == QLA_SUCCESS) { /* Interrogate mailbox registers for any errors */ if (mb[0] == MBS_COMMAND_ERROR) @@ -3063,7 +2997,6 @@ 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; @@ -3120,16 +3053,6 @@ 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)) { @@ -3150,14 +3073,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; } @@ -3171,7 +3094,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); @@ -3206,7 +3129,7 @@ qla2x00_restart_isp(scsi_qla_host_t *ha) spin_lock_irqsave(&ha->hardware_lock, flags); - if (!IS_QLA24XX(ha) && !IS_QLA54XX(ha)) { + if (!IS_QLA24XX(ha) && !IS_QLA25XX(ha)) { /* * Disable SRAM, Instruction RAM and GP RAM * parity. @@ -3222,7 +3145,7 @@ qla2x00_restart_isp(scsi_qla_host_t *ha) spin_lock_irqsave(&ha->hardware_lock, flags); - if (!IS_QLA24XX(ha) && !IS_QLA54XX(ha)) { + if (!IS_QLA24XX(ha) && !IS_QLA25XX(ha)) { /* Enable proper parity */ if (IS_QLA2300(ha)) /* SRAM parity */ @@ -3247,7 +3170,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); @@ -3271,7 +3194,7 @@ qla2x00_restart_isp(scsi_qla_host_t *ha) DEBUG(printk("%s(): Configure loop done, status = 0x%x\n", __func__, - status)); + status);) } return (status); } @@ -3335,12 +3258,8 @@ qla24xx_nvram_config(scsi_qla_host_t *ha) /* Determine NVRAM starting address. */ ha->nvram_size = sizeof(struct nvram_24xx); ha->nvram_base = FA_NVRAM_FUNC0_ADDR; - ha->vpd_size = FA_NVRAM_VPD_SIZE; - ha->vpd_base = FA_NVRAM_VPD0_ADDR; - if (PCI_FUNC(ha->pdev->devfn)) { + if (PCI_FUNC(ha->pdev->devfn)) ha->nvram_base = FA_NVRAM_FUNC1_ADDR; - ha->vpd_base = FA_NVRAM_VPD1_ADDR; - } /* Get NVRAM data and calculate checksum. */ dptr = (uint32_t *)nv; @@ -3391,6 +3310,7 @@ 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 = @@ -3419,7 +3339,7 @@ qla24xx_nvram_config(scsi_qla_host_t *ha) *dptr1++ = *dptr2++; icb->login_retry_count = nv->login_retry_count; - icb->link_down_on_nos = nv->link_down_on_nos; + icb->link_down_timeout = nv->link_down_timeout; /* Copy 2nd segment. */ dptr1 = (uint8_t *)&icb->interrupt_delay_timer; @@ -3448,18 +3368,12 @@ qla24xx_nvram_config(scsi_qla_host_t *ha) index = (ha->pdev->subsystem_device & 0xff); if (index < QLA_MODEL_NAMES) - ha->model_desc = qla2x00_model_name[index * 2 + 1]; + ha->model_desc = qla2x00_model_desc[index]; } 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 & __constant_cpu_to_le32(BIT_14)) == 0) { + if ((icb->firmware_options_1 & BIT_14) == 0) { /* * Firmware will apply the following mask if the nodename was * not provided. @@ -3474,10 +3388,9 @@ 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 = (le32_to_cpu(icb->firmware_options_2) & - (BIT_6 | BIT_5 | BIT_4)) >> 4; + ha->operating_mode = + (icb->firmware_options_2 & (BIT_6 | BIT_5 | BIT_4)) >> 4; memcpy(ha->fw_seriallink_options24, nv->seriallink_options, sizeof(ha->fw_seriallink_options24)); @@ -3552,8 +3465,6 @@ qla24xx_nvram_config(scsi_qla_host_t *ha) ~(BIT_3 | BIT_2 | BIT_1 | BIT_0)); ha->flags.process_response_queue = 0; if (ha->zio_mode != QLA_ZIO_DISABLED) { - ha->zio_mode = QLA_ZIO_MODE_6; - DEBUG2(printk("scsi(%ld): ZIO mode %d enabled; timer delay " "(%d us).\n", ha->host_no, ha->zio_mode, ha->zio_timer * 100)); @@ -3574,7 +3485,134 @@ qla24xx_nvram_config(scsi_qla_host_t *ha) return (rval); } -static int +#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 qla24xx_load_risc_flash(scsi_qla_host_t *ha, uint32_t *srisc_addr) { int rval; @@ -3656,7 +3694,7 @@ qla24xx_load_risc_flash(scsi_qla_host_t *ha, uint32_t *srisc_addr) return rval; } -#define QLA_FW_URL "ftp://ftp.qlogic.com/outgoing/linux/firmware/" +#else /* !defined(CONFIG_SCSI_QLA2XXX_EMBEDDED_FIRMWARE) */ int qla2x00_load_risc(scsi_qla_host_t *ha, uint32_t *srisc_addr) @@ -3671,8 +3709,6 @@ 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; } @@ -3774,13 +3810,7 @@ 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"); - 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); + return QLA_FUNCTION_FAILED; } rval = QLA_SUCCESS; @@ -3866,3 +3896,4 @@ 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_inline.h b/drivers/scsi/qla2xxx/qla_inline.h index 45007ee58..ecc3741a4 100644 --- a/drivers/scsi/qla2xxx/qla_inline.h +++ b/drivers/scsi/qla2xxx/qla_inline.h @@ -163,7 +163,7 @@ static inline int qla2x00_is_reserved_id(scsi_qla_host_t *, uint16_t); static inline int qla2x00_is_reserved_id(scsi_qla_host_t *ha, uint16_t loop_id) { - if (IS_QLA24XX(ha) || IS_QLA54XX(ha)) + if (IS_QLA24XX(ha) || IS_QLA25XX(ha)) return (loop_id > NPH_LAST_HANDLE); return ((loop_id > ha->last_loop_id && loop_id < SNS_FIRST_LOOP_ID) || diff --git a/drivers/scsi/qla2xxx/qla_iocb.c b/drivers/scsi/qla2xxx/qla_iocb.c index c5b3c610a..6544b6d08 100644 --- a/drivers/scsi/qla2xxx/qla_iocb.c +++ b/drivers/scsi/qla2xxx/qla_iocb.c @@ -15,7 +15,6 @@ 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. @@ -409,6 +408,7 @@ 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); @@ -466,12 +466,11 @@ __qla2x00_marker(scsi_qla_host_t *ha, uint16_t loop_id, uint16_t lun, mrk->entry_type = MARKER_TYPE; mrk->modifier = type; if (type != MK_SYNC_ALL) { - if (IS_QLA24XX(ha) || IS_QLA54XX(ha)) { + if (IS_QLA24XX(ha) || IS_QLA25XX(ha)) { mrk24 = (struct mrk_entry_24xx *) mrk; 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); @@ -520,7 +519,7 @@ qla2x00_req_pkt(scsi_qla_host_t *ha) for (timer = HZ; timer; timer--) { if ((req_cnt + 2) >= ha->req_q_cnt) { /* Calculate number of free request entries. */ - if (IS_QLA24XX(ha) || IS_QLA54XX(ha)) + if (IS_QLA24XX(ha) || IS_QLA25XX(ha)) cnt = (uint16_t)RD_REG_DWORD( ®->isp24.req_q_out); else @@ -576,7 +575,7 @@ qla2x00_req_pkt(scsi_qla_host_t *ha) * * Note: The caller must hold the hardware lock before calling this routine. */ -static void +void qla2x00_isp_cmd(scsi_qla_host_t *ha) { device_reg_t __iomem *reg = ha->iobase; @@ -594,7 +593,7 @@ qla2x00_isp_cmd(scsi_qla_host_t *ha) ha->request_ring_ptr++; /* Set chip new ring index. */ - if (IS_QLA24XX(ha) || IS_QLA54XX(ha)) { + if (IS_QLA24XX(ha) || IS_QLA25XX(ha)) { WRT_REG_DWORD(®->isp24.req_q_in, ha->req_ring_index); RD_REG_DWORD_RELAXED(®->isp24.req_q_in); } else { @@ -839,6 +838,7 @@ 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 de0613135..42aa7a7c1 100644 --- a/drivers/scsi/qla2xxx/qla_isr.c +++ b/drivers/scsi/qla2xxx/qla_isr.c @@ -343,7 +343,7 @@ qla2x00_async_event(scsi_qla_host_t *ha, uint16_t *mb) ha->isp_ops.fw_dump(ha, 1); - if (IS_QLA24XX(ha) || IS_QLA54XX(ha)) { + if (IS_QLA24XX(ha) || IS_QLA25XX(ha)) { if (mb[1] == 0 && mb[2] == 0) { qla_printk(KERN_ERR, ha, "Unrecoverable Hardware Error: adapter " @@ -395,6 +395,10 @@ 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 */ @@ -414,6 +418,9 @@ 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 */ @@ -432,6 +439,9 @@ 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 */ @@ -450,6 +460,10 @@ 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 */ @@ -500,6 +514,47 @@ 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_QLA25XX(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 @@ -531,6 +586,9 @@ 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 */ @@ -567,6 +625,9 @@ 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: */ @@ -577,7 +638,7 @@ qla2x00_async_event(scsi_qla_host_t *ha, uint16_t *mb) "scsi(%ld): [R|Z]IO update completion.\n", ha->host_no)); - if (IS_QLA24XX(ha) || IS_QLA54XX(ha)) + if (IS_QLA24XX(ha) || IS_QLA25XX(ha)) qla24xx_process_response_queue(ha); else qla2x00_process_response_queue(ha); @@ -587,11 +648,6 @@ 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; } } @@ -697,6 +753,25 @@ 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 @@ -730,12 +805,12 @@ 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, fw_resid_len; + uint32_t sense_len, rsp_info_len, resid_len; uint8_t *rsp_info, *sense_data; sts = (sts_entry_t *) pkt; sts24 = (struct sts_entry_24xx *) pkt; - if (IS_QLA24XX(ha) || IS_QLA54XX(ha)) { + if (IS_QLA24XX(ha) || IS_QLA25XX(ha)) { comp_status = le16_to_cpu(sts24->comp_status); scsi_status = le16_to_cpu(sts24->scsi_status) & SS_MASK; } else { @@ -763,13 +838,16 @@ qla2x00_status_entry(scsi_qla_host_t *ha, void *pkt) qla_printk(KERN_WARNING, ha, "Status Entry invalid handle.\n"); set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags); - qla2xxx_wake_dpc(ha); + if (ha->dpc_wait && !ha->dpc_active) + up(ha->dpc_wait); + return; } cp = sp->cmd; if (cp == NULL) { DEBUG2(printk("scsi(%ld): Command already returned back to OS " - "pkt->handle=%d sp=%p.\n", ha->host_no, sts->handle, sp)); + "pkt->handle=%d sp=%p sp->state:%d\n", + ha->host_no, sts->handle, sp, sp->state)); qla_printk(KERN_WARNING, ha, "Command is NULL: already returned to OS (sp=%p)\n", sp); @@ -783,12 +861,11 @@ qla2x00_status_entry(scsi_qla_host_t *ha, void *pkt) fcport = sp->fcport; - sense_len = rsp_info_len = resid_len = fw_resid_len = 0; - if (IS_QLA24XX(ha) || IS_QLA54XX(ha)) { + sense_len = rsp_info_len = resid_len = 0; + if (IS_QLA24XX(ha) || IS_QLA25XX(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)); @@ -803,7 +880,7 @@ qla2x00_status_entry(scsi_qla_host_t *ha, void *pkt) /* Check for any FCP transport errors. */ if (scsi_status & SS_RESPONSE_INFO_LEN_VALID) { /* Sense data lies beyond any FCP RESPONSE data. */ - if (IS_QLA24XX(ha) || IS_QLA54XX(ha)) + if (IS_QLA24XX(ha) || IS_QLA25XX(ha)) sense_data += rsp_info_len; if (rsp_info_len > 3 && rsp_info[3]) { DEBUG2(printk("scsi(%ld:%d:%d:%d) FCP I/O protocol " @@ -888,21 +965,14 @@ 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. 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)); + "0x%x-0x%x.\n", ha->host_no, cp->device->id, + cp->device->lun, comp_status, scsi_status)); } @@ -1049,7 +1119,7 @@ qla2x00_status_entry(scsi_qla_host_t *ha, void *pkt) case CS_TIMEOUT: cp->result = DID_BUS_BUSY << 16; - if (IS_QLA24XX(ha) || IS_QLA54XX(ha)) { + if (IS_QLA24XX(ha) || IS_QLA25XX(ha)) { DEBUG2(printk(KERN_INFO "scsi(%ld:%d:%d:%d): TIMEOUT status detected " "0x%x-0x%x\n", ha->host_no, cp->device->channel, @@ -1113,7 +1183,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.\n", __func__, sp)); + "sp=%p sp->state:%d\n", __func__, sp, sp->state)); qla_printk(KERN_INFO, ha, "cmd is NULL: already returned to OS (sp=%p)\n", sp); @@ -1129,7 +1199,7 @@ qla2x00_status_cont_entry(scsi_qla_host_t *ha, sts_cont_entry_t *pkt) } /* Move sense data. */ - if (IS_QLA24XX(ha) || IS_QLA54XX(ha)) + if (IS_QLA24XX(ha) || IS_QLA25XX(ha)) host_to_fcp_swap(pkt->data, sizeof(pkt->data)); memcpy(sp->request_sense_ptr, pkt->data, sense_sz); DEBUG5(qla2x00_dump_buffer(sp->request_sense_ptr, sense_sz)); @@ -1201,7 +1271,8 @@ qla2x00_error_entry(scsi_qla_host_t *ha, sts_entry_t *pkt) "Error entry - invalid handle\n"); set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags); - qla2xxx_wake_dpc(ha); + if (ha->dpc_wait && !ha->dpc_active) + up(ha->dpc_wait); } } @@ -1437,8 +1508,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 879f281e2..363dfdd04 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,12 +86,12 @@ 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); /* Load mailbox registers. */ - if (IS_QLA24XX(ha) || IS_QLA54XX(ha)) + if (IS_QLA24XX(ha) || IS_QLA25XX(ha)) optr = (uint16_t __iomem *)®->isp24.mailbox0; else optr = (uint16_t __iomem *)MAILBOX_REG(ha, ®->isp, 0); @@ -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,15 +147,15 @@ 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); - if (IS_QLA24XX(ha) || IS_QLA54XX(ha)) + if (IS_QLA24XX(ha) || IS_QLA25XX(ha)) WRT_REG_DWORD(®->isp24.hccr, HCCRX_SET_HOST_INT); else WRT_REG_WORD(®->isp.hccr, HCCR_SET_HOST_INT); @@ -170,16 +170,16 @@ 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)) + if (IS_QLA24XX(ha) || IS_QLA25XX(ha)) WRT_REG_DWORD(®->isp24.hccr, HCCRX_SET_HOST_INT); else WRT_REG_WORD(®->isp.hccr, HCCR_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; @@ -237,7 +237,7 @@ qla2x00_mailbox_command(scsi_qla_host_t *ha, mbx_cmd_t *mcp) uint16_t mb0; uint32_t ictrl; - if (IS_QLA24XX(ha) || IS_QLA54XX(ha)) { + if (IS_QLA24XX(ha) || IS_QLA25XX(ha)) { mb0 = RD_REG_WORD(®->isp24.mailbox0); ictrl = RD_REG_DWORD(®->isp24.ictrl); } else { @@ -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,20 +277,22 @@ 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"); set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags); - qla2xxx_wake_dpc(ha); + if (ha->dpc_wait && !ha->dpc_active) + up(ha->dpc_wait); + } 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 +305,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 +318,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; @@ -334,7 +336,7 @@ qla2x00_load_ram(scsi_qla_host_t *ha, dma_addr_t req_dma, uint32_t risc_addr, DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no)); - if (MSW(risc_addr) || IS_QLA24XX(ha) || IS_QLA54XX(ha)) { + if (MSW(risc_addr) || IS_QLA24XX(ha) || IS_QLA25XX(ha)) { mcp->mb[0] = MBC_LOAD_RISC_RAM_EXTENDED; mcp->mb[8] = MSW(risc_addr); mcp->out_mb = MBX_8|MBX_0; @@ -348,7 +350,7 @@ qla2x00_load_ram(scsi_qla_host_t *ha, dma_addr_t req_dma, uint32_t risc_addr, mcp->mb[6] = MSW(MSD(req_dma)); mcp->mb[7] = LSW(MSD(req_dma)); mcp->out_mb |= MBX_7|MBX_6|MBX_3|MBX_2|MBX_1; - if (IS_QLA24XX(ha) || IS_QLA54XX(ha)) { + if (IS_QLA24XX(ha) || IS_QLA25XX(ha)) { mcp->mb[4] = MSW(risc_code_size); mcp->mb[5] = LSW(risc_code_size); mcp->out_mb |= MBX_5|MBX_4; @@ -394,12 +396,12 @@ 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; mcp->in_mb = MBX_0; - if (IS_QLA24XX(ha) || IS_QLA54XX(ha)) { + if (IS_QLA24XX(ha) || IS_QLA25XX(ha)) { mcp->mb[1] = MSW(risc_addr); mcp->mb[2] = LSW(risc_addr); mcp->mb[3] = 0; @@ -422,12 +424,12 @@ qla2x00_execute_fw(scsi_qla_host_t *ha, uint32_t risc_addr) DEBUG2_3_11(printk("%s(%ld): failed=%x mb[0]=%x.\n", __func__, ha->host_no, rval, mcp->mb[0])); } else { - if (IS_QLA24XX(ha) || IS_QLA54XX(ha)) { + if (IS_QLA24XX(ha) || IS_QLA25XX(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);) } } @@ -563,7 +565,7 @@ qla2x00_set_fw_options(scsi_qla_host_t *ha, uint16_t *fwopts) mcp->mb[3] = fwopts[3]; mcp->out_mb = MBX_3|MBX_2|MBX_1|MBX_0; mcp->in_mb = MBX_0; - if (IS_QLA24XX(ha) || IS_QLA54XX(ha)) { + if (IS_QLA24XX(ha) || IS_QLA25XX(ha)) { mcp->in_mb |= MBX_1; } else { mcp->mb[10] = fwopts[10]; @@ -611,7 +613,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 +641,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,12 +673,12 @@ 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; mcp->in_mb = MBX_0; - if (IS_QLA24XX(ha) || IS_QLA54XX(ha)) { + if (IS_QLA24XX(ha) || IS_QLA25XX(ha)) { mcp->mb[1] = MSW(risc_addr); mcp->mb[2] = LSW(risc_addr); mcp->out_mb |= MBX_2|MBX_1; @@ -693,10 +695,10 @@ 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]))); + ha->host_no, rval, (IS_QLA24XX(ha) || IS_QLA25XX(ha) ? + (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,15 +745,15 @@ 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; /* Mask reserved bits. */ sts_entry->entry_status &= - IS_QLA24XX(ha) || IS_QLA54XX(ha) ? RF_MASK_24XX :RF_MASK; + IS_QLA24XX(ha) || IS_QLA25XX(ha) ? RF_MASK_24XX :RF_MASK; } return rval; @@ -781,7 +783,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 +815,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 +850,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 +874,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 +914,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 +935,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 +970,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 +982,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 +994,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 +1025,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 +1045,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 +1081,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); @@ -1091,7 +1093,7 @@ qla2x00_get_port_database(scsi_qla_host_t *ha, fc_port_t *fcport, uint8_t opt) memset(pd, 0, max(PORT_DATABASE_SIZE, PORT_DATABASE_24XX_SIZE)); mcp->mb[0] = MBC_GET_PORT_DATABASE; - if (opt != 0 && !IS_QLA24XX(ha) && !IS_QLA54XX(ha)) + if (opt != 0 && !IS_QLA24XX(ha) && !IS_QLA25XX(ha)) mcp->mb[0] = MBC_ENHANCED_GET_PORT_DATABASE; mcp->mb[2] = MSW(pd_dma); mcp->mb[3] = LSW(pd_dma); @@ -1099,7 +1101,7 @@ qla2x00_get_port_database(scsi_qla_host_t *ha, fc_port_t *fcport, uint8_t opt) mcp->mb[7] = LSW(MSD(pd_dma)); mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_0; mcp->in_mb = MBX_0; - if (IS_QLA24XX(ha) || IS_QLA54XX(ha)) { + if (IS_QLA24XX(ha) || IS_QLA25XX(ha)) { mcp->mb[1] = fcport->loop_id; mcp->mb[10] = opt; mcp->out_mb |= MBX_10|MBX_1; @@ -1112,7 +1114,7 @@ qla2x00_get_port_database(scsi_qla_host_t *ha, fc_port_t *fcport, uint8_t opt) mcp->mb[1] = fcport->loop_id << 8 | opt; mcp->out_mb |= MBX_1; } - mcp->buf_size = (IS_QLA24XX(ha) || IS_QLA54XX(ha) ? + mcp->buf_size = (IS_QLA24XX(ha) || IS_QLA25XX(ha) ? PORT_DATABASE_24XX_SIZE : PORT_DATABASE_SIZE); mcp->flags = MBX_DMA_IN; mcp->tov = (ha->login_timeout * 2) + (ha->login_timeout / 2); @@ -1120,7 +1122,7 @@ qla2x00_get_port_database(scsi_qla_host_t *ha, fc_port_t *fcport, uint8_t opt) if (rval != QLA_SUCCESS) goto gpd_error_out; - if (IS_QLA24XX(ha) || IS_QLA54XX(ha)) { + if (IS_QLA24XX(ha) || IS_QLA25XX(ha)) { pd24 = (struct port_database_24xx *) pd; /* Check for logged in state. */ @@ -1220,7 +1222,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 +1237,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 +1274,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 +1294,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 +1309,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,9 +1337,9 @@ 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)) { + if (IS_QLA24XX(ha) || IS_QLA25XX(ha)) { mcp->mb[0] = MBC_LIP_FULL_LOGIN; mcp->mb[1] = BIT_0; mcp->mb[2] = 0xff; @@ -1364,10 +1366,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 +1402,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 +1423,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 +1444,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,15 +1460,13 @@ 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, @@ -1507,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]); @@ -1561,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; @@ -1606,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; @@ -1633,25 +1633,20 @@ qla2x00_login_fabric(scsi_qla_host_t *ha, uint16_t loop_id, uint8_t domain, * */ int -qla2x00_login_local_device(scsi_qla_host_t *ha, fc_port_t *fcport, +qla2x00_login_local_device(scsi_qla_host_t *ha, uint16_t loop_id, uint16_t *mb_ret, uint8_t opt) { int rval; mbx_cmd_t mc; mbx_cmd_t *mcp = &mc; - if (IS_QLA24XX(ha) || IS_QLA54XX(ha)) - return qla24xx_login_fabric(ha, fcport->loop_id, - 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)) - mcp->mb[1] = fcport->loop_id; + mcp->mb[1] = loop_id; else - mcp->mb[1] = fcport->loop_id << 8; + mcp->mb[1] = loop_id << 8; mcp->mb[2] = opt; mcp->out_mb = MBX_2|MBX_1|MBX_0; mcp->in_mb = MBX_7|MBX_6|MBX_1|MBX_0; @@ -1679,13 +1674,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); @@ -1699,7 +1694,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) { @@ -1720,7 +1715,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, @@ -1731,10 +1726,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); @@ -1767,7 +1762,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; @@ -1787,11 +1782,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; @@ -1820,7 +1815,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; @@ -1835,11 +1830,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; @@ -1866,14 +1861,14 @@ 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; mcp->mb[0] = MBC_GET_ID_LIST; mcp->out_mb = MBX_0; - if (IS_QLA24XX(ha) || IS_QLA54XX(ha)) { + if (IS_QLA24XX(ha) || IS_QLA25XX(ha)) { mcp->mb[2] = MSW(id_list_dma); mcp->mb[3] = LSW(id_list_dma); mcp->mb[6] = MSW(MSD(id_list_dma)); @@ -1895,11 +1890,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; @@ -1938,7 +1933,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, @@ -2047,7 +2042,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) { @@ -2064,7 +2059,7 @@ qla2x00_get_link_status(scsi_qla_host_t *ha, uint16_t loop_id, mcp->mb[7] = LSW(MSD(stat_buf_dma)); mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_0; mcp->in_mb = MBX_0; - if (IS_QLA24XX(ha) || IS_QLA54XX(ha)) { + if (IS_QLA24XX(ha) || IS_QLA25XX(ha)) { mcp->mb[1] = loop_id; mcp->mb[4] = 0; mcp->mb[10] = 0; @@ -2085,7 +2080,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 { @@ -2110,12 +2105,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; } @@ -2134,7 +2129,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 " @@ -2198,7 +2193,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; @@ -2231,7 +2226,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, @@ -2240,10 +2235,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; } @@ -2270,7 +2265,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); @@ -2292,7 +2287,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 " @@ -2304,7 +2299,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; } @@ -2313,9 +2308,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: @@ -2331,7 +2326,7 @@ qla2x00_system_error(scsi_qla_host_t *ha) mbx_cmd_t mc; mbx_cmd_t *mcp = &mc; - if (!IS_QLA24XX(ha) && !IS_QLA54XX(ha)) + if (!IS_QLA24XX(ha) && !IS_QLA25XX(ha)) return QLA_FUNCTION_FAILED; DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no)); @@ -2413,9 +2408,9 @@ qla2x00_set_serdes_params(scsi_qla_host_t *ha, uint16_t sw_em_1g, mcp->mb[0] = MBC_SERDES_PARAMS; mcp->mb[1] = BIT_0; - mcp->mb[2] = sw_em_1g | BIT_15; - mcp->mb[3] = sw_em_2g | BIT_15; - mcp->mb[4] = sw_em_4g | BIT_15; + mcp->mb[2] = sw_em_1g; + mcp->mb[3] = sw_em_2g; + mcp->mb[4] = sw_em_4g; mcp->out_mb = MBX_4|MBX_3|MBX_2|MBX_1|MBX_0; mcp->in_mb = MBX_0; mcp->tov = 30; @@ -2441,7 +2436,7 @@ qla2x00_stop_firmware(scsi_qla_host_t *ha) mbx_cmd_t mc; mbx_cmd_t *mcp = &mc; - if (!IS_QLA24XX(ha) && !IS_QLA54XX(ha)) + if (!IS_QLA24XX(ha) && !IS_QLA25XX(ha)) return QLA_FUNCTION_FAILED; DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no)); @@ -2462,81 +2457,3 @@ 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 ef45f7490..9f91f1a20 100644 --- a/drivers/scsi/qla2xxx/qla_os.c +++ b/drivers/scsi/qla2xxx/qla_os.c @@ -8,8 +8,8 @@ #include #include +#include #include -#include #include #include @@ -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,18 +54,12 @@ module_param(ql2xloginretrycount, int, S_IRUGO|S_IRUSR); MODULE_PARM_DESC(ql2xloginretrycount, "Specify an alternate value for the NVRAM login retry count."); -int 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."); +#if defined(CONFIG_SCSI_QLA2XXX_EMBEDDED_FIRMWARE) +int ql2xfwloadflash; +module_param(ql2xfwloadflash, int, S_IRUGO|S_IRUSR); +MODULE_PARM_DESC(ql2xfwloadflash, + "Load ISP24xx firmware image from FLASH (onboard memory)."); +#endif static void qla2x00_free_device(scsi_qla_host_t *); @@ -77,6 +71,12 @@ 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_DRIVER_NAME, + .name = "qla2xxx", .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_DRIVER_NAME, + .name = "qla2xxx", .queuecommand = qla24xx_queuecommand, .eh_abort_handler = qla2xxx_eh_abort, @@ -340,6 +340,7 @@ 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; @@ -576,10 +577,6 @@ qla2x00_wait_for_loop_ready(scsi_qla_host_t *ha) while ((!atomic_read(&ha->loop_down_timer) && atomic_read(&ha->loop_state) == LOOP_DOWN) || 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; @@ -602,7 +599,6 @@ qla2x00_wait_for_loop_ready(scsi_qla_host_t *ha) * Either SUCCESS or FAILED. * * Note: -* Only return FAILED if command not returned by firmware. **************************************************************************/ int qla2xxx_eh_abort(struct scsi_cmnd *cmd) @@ -613,12 +609,11 @@ qla2xxx_eh_abort(struct scsi_cmnd *cmd) unsigned int id, lun; unsigned long serial; unsigned long flags; - int wait = 0; if (!CMD_SP(cmd)) - return SUCCESS; + return FAILED; - ret = SUCCESS; + ret = FAILED; id = cmd->device->id; lun = cmd->device->lun; @@ -635,9 +630,10 @@ qla2xxx_eh_abort(struct scsi_cmnd *cmd) if (sp->cmd != cmd) continue; - DEBUG2(printk("%s(%ld): aborting sp %p from RISC. pid=%ld.\n", - __func__, ha->host_no, sp, serial)); - DEBUG3(qla2x00_print_scsi_cmd(cmd)); + 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);) spin_unlock_irqrestore(&ha->hardware_lock, flags); if (ha->isp_ops.abort_command(ha, sp)) { @@ -646,7 +642,7 @@ qla2xxx_eh_abort(struct scsi_cmnd *cmd) } else { DEBUG3(printk("%s(%ld): abort_command " "mbx success.\n", __func__, ha->host_no)); - wait = 1; + ret = SUCCESS; } spin_lock_irqsave(&ha->hardware_lock, flags); @@ -655,18 +651,17 @@ qla2xxx_eh_abort(struct scsi_cmnd *cmd) spin_unlock_irqrestore(&ha->hardware_lock, flags); /* Wait for the command to be returned. */ - if (wait) { + if (ret == SUCCESS) { if (qla2x00_eh_wait_on_command(ha, cmd) != QLA_SUCCESS) { qla_printk(KERN_ERR, ha, "scsi(%ld:%d:%d): Abort handler timed out -- %lx " "%x.\n", ha->host_no, id, lun, serial, ret); - ret = FAILED; } } qla_printk(KERN_INFO, ha, - "scsi(%ld:%d:%d): Abort command issued -- %d %lx %x.\n", - ha->host_no, id, lun, wait, serial, ret); + "scsi(%ld:%d:%d): Abort command issued -- %lx %x.\n", ha->host_no, + id, lun, serial, ret); return ret; } @@ -744,6 +739,7 @@ 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; @@ -754,7 +750,8 @@ qla2xxx_eh_device_reset(struct scsi_cmnd *cmd) lun = cmd->device->lun; serial = cmd->serial_number; - if (!fcport) + sp = (srb_t *) CMD_SP(cmd); + if (!sp || !fcport) return ret; qla_printk(KERN_INFO, ha, @@ -777,7 +774,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,6 +870,7 @@ 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; @@ -883,7 +881,8 @@ qla2xxx_eh_bus_reset(struct scsi_cmnd *cmd) lun = cmd->device->lun; serial = cmd->serial_number; - if (!fcport) + sp = (srb_t *) CMD_SP(cmd); + if (!sp || !fcport) return ret; qla_printk(KERN_INFO, ha, @@ -932,6 +931,7 @@ 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; @@ -942,7 +942,8 @@ qla2xxx_eh_host_reset(struct scsi_cmnd *cmd) lun = cmd->device->lun; serial = cmd->serial_number; - if (!fcport) + sp = (srb_t *) CMD_SP(cmd); + if (!sp || !fcport) return ret; qla_printk(KERN_INFO, ha, @@ -1028,12 +1029,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); @@ -1145,68 +1146,6 @@ qla2x00_config_dma_addressing(scsi_qla_host_t *ha) pci_set_consistent_dma_mask(ha->pdev, DMA_32BIT_MASK); } -static inline void -qla2x00_set_isp_flags(scsi_qla_host_t *ha) -{ - ha->device_type = DT_EXTENDED_IDS; - switch (ha->pdev->device) { - 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; - ha->device_type |= DT_ZIO_SUPPORTED; - 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; - } -} - static int qla2x00_iospace_config(scsi_qla_host_t *ha) { @@ -1249,7 +1188,7 @@ qla2x00_iospace_config(scsi_qla_host_t *ha) goto iospace_error_exit; } - if (pci_request_regions(ha->pdev, QLA2XXX_DRIVER_NAME)) { + if (pci_request_regions(ha->pdev, ha->brd_info->drv_name)) { qla_printk(KERN_WARNING, ha, "Failed to reserve PIO/MMIO regions (%s)\n", pci_name(ha->pdev)); @@ -1331,8 +1270,7 @@ qla24xx_disable_intrs(scsi_qla_host_t *ha) /* * PCI driver interface */ -static int __devinit -qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) +int qla2x00_probe_one(struct pci_dev *pdev, struct qla_board_info *brd_info) { int ret = -ENODEV; device_reg_t __iomem *reg; @@ -1366,10 +1304,10 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) ha->pdev = pdev; ha->host = host; ha->host_no = host->host_no; - sprintf(ha->host_str, "%s_%ld", QLA2XXX_DRIVER_NAME, ha->host_no); + ha->brd_info = brd_info; + sprintf(ha->host_str, "%s_%ld", ha->brd_info->drv_name, ha->host_no); - /* Set ISP-type information. */ - qla2x00_set_isp_flags(ha); + ha->dpc_pid = -1; /* Configure PCI I/O space */ ret = qla2x00_iospace_config(ha); @@ -1383,6 +1321,7 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) 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; @@ -1413,6 +1352,7 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) 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)) { @@ -1439,13 +1379,14 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) 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; ha->gid_list_info_size = 6; if (IS_QLA2322(ha) || IS_QLA6322(ha)) ha->optrom_size = OPTROM_SIZE_2322; - } else if (IS_QLA24XX(ha) || IS_QLA54XX(ha)) { + } else if (IS_QLA24XX(ha) || IS_QLA25XX(ha)) { host->max_id = MAX_TARGETS_2200; ha->mbx_count = MAILBOX_REGISTER_COUNT; ha->request_q_length = REQUEST_ENTRY_CNT_24XX; @@ -1461,6 +1402,10 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) 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,6 +1420,7 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) 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; @@ -1493,6 +1439,7 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) 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 @@ -1502,6 +1449,9 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) */ spin_lock_init(&ha->mbx_reg_lock); + init_completion(&ha->dpc_inited); + init_completion(&ha->dpc_exited); + qla2x00_config_dma_addressing(ha); if (qla2x00_mem_alloc(ha)) { qla_printk(KERN_WARNING, ha, @@ -1528,25 +1478,27 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) /* * Startup the kernel thread for this host adapter */ - ha->dpc_thread = kthread_create(qla2x00_do_dpc, ha, - "%s_dpc", ha->host_str); - if (IS_ERR(ha->dpc_thread)) { + ha->dpc_should_die = 0; + ha->dpc_pid = kernel_thread(qla2x00_do_dpc, ha, 0); + if (ha->dpc_pid < 0) { qla_printk(KERN_WARNING, ha, "Unable to start DPC thread!\n"); - ret = PTR_ERR(ha->dpc_thread); + + ret = -ENODEV; goto probe_failed; } + wait_for_completion(&ha->dpc_inited); host->this_id = 255; host->cmd_per_lun = 3; host->unique_id = ha->instance; host->max_cmd_len = MAX_CMDSZ; - host->max_channel = MAX_BUSES - 1; + host->max_channel = ha->ports - 1; host->max_lun = MAX_LUNS; host->transportt = qla2xxx_transport_template; ret = request_irq(pdev->irq, ha->isp_ops.intr_handler, - IRQF_DISABLED|IRQF_SHARED, QLA2XXX_DRIVER_NAME, ha); + SA_INTERRUPT|SA_SHIRQ, ha->brd_info->drv_name, ha); if (ret) { qla_printk(KERN_WARNING, ha, "Failed to reserve interrupt %d already in use.\n", @@ -1565,7 +1517,7 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) spin_lock_irqsave(&ha->hardware_lock, flags); reg = ha->iobase; - if (IS_QLA24XX(ha) || IS_QLA54XX(ha)) { + if (IS_QLA24XX(ha) || IS_QLA25XX(ha)) { WRT_REG_DWORD(®->isp24.hccr, HCCRX_CLR_HOST_INT); WRT_REG_DWORD(®->isp24.hccr, HCCRX_CLR_RISC_INT); } else { @@ -1644,9 +1596,9 @@ probe_disable_device: probe_out: return ret; } +EXPORT_SYMBOL_GPL(qla2x00_probe_one); -static void __devexit -qla2x00_remove_one(struct pci_dev *pdev) +void qla2x00_remove_one(struct pci_dev *pdev) { scsi_qla_host_t *ha; @@ -1664,29 +1616,36 @@ 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) { + int ret; + + /* 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); /* Kill the kernel thread for this host */ - if (ha->dpc_thread) { - struct task_struct *t = ha->dpc_thread; + if (ha->dpc_pid >= 0) { + ha->dpc_should_die = 1; + wmb(); + ret = kill_proc(ha->dpc_pid, SIGHUP, 1); + if (ret) { + qla_printk(KERN_ERR, ha, + "Unable to signal DPC thread -- (%d)\n", ret); - /* - * qla2xxx_wake_dpc checks for ->dpc_thread - * so we need to zero it out. - */ - ha->dpc_thread = NULL; - kthread_stop(t); + /* TODO: SOMETHING MORE??? */ + } else { + wait_for_completion(&ha->dpc_exited); + } } - if (ha->eft) - qla2x00_trace_control(ha, TC_DISABLE, 0, 0); - /* Stop currently executing firmware. */ qla2x00_stop_firmware(ha); @@ -1699,8 +1658,8 @@ qla2x00_free_device(scsi_qla_host_t *ha) ha->flags.online = 0; /* Detach interrupts */ - if (ha->host->irq) - free_irq(ha->host->irq, ha); + if (ha->pdev->irq) + free_irq(ha->pdev->irq, ha); /* release io space registers */ if (ha->iobase) @@ -1816,8 +1775,8 @@ qla2x00_mark_all_devices_lost(scsi_qla_host_t *ha, int defer) atomic_set(&fcport->state, FCS_DEVICE_LOST); } - if (defer) - qla2xxx_wake_dpc(ha); + if (defer && ha->dpc_wait && !ha->dpc_active) + up(ha->dpc_wait); } /* @@ -1880,8 +1839,19 @@ qla2x00_mem_alloc(scsi_qla_host_t *ha) continue; } - snprintf(name, sizeof(name), "%s_%ld", QLA2XXX_DRIVER_NAME, - ha->host_no); + 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); ha->s_dma_pool = dma_pool_create(name, &ha->pdev->dev, DMA_POOL_SIZE, 8, 0); if (ha->s_dma_pool == NULL) { @@ -1908,6 +1878,32 @@ 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 - " @@ -1970,26 +1966,6 @@ 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. */ @@ -2017,6 +1993,7 @@ qla2x00_mem_free(scsi_qla_host_t *ha) { struct list_head *fcpl, *fcptemp; fc_port_t *fcport; + unsigned int wtime;/* max wait time if mbx cmd is busy. */ if (ha == NULL) { /* error */ @@ -2024,16 +2001,17 @@ qla2x00_mem_free(scsi_qla_host_t *ha) return; } + /* Make sure all other threads are stopped. */ + wtime = 60 * 1000; + while (ha->dpc_wait && wtime) + wtime = msleep_interruptible(wtime); + + /* 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); @@ -2042,18 +2020,23 @@ 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); @@ -2068,19 +2051,21 @@ 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; @@ -2098,9 +2083,18 @@ 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); } @@ -2115,6 +2109,8 @@ 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) @@ -2122,7 +2118,8 @@ qla2x00_allocate_sp_pool(scsi_qla_host_t *ha) int rval; rval = QLA_SUCCESS; - ha->srb_mempool = mempool_create_slab_pool(SRB_MIN_REQ, srb_cachep); + ha->srb_mempool = mempool_create(SRB_MIN_REQ, mempool_alloc_slab, + mempool_free_slab, srb_cachep); if (ha->srb_mempool == NULL) { qla_printk(KERN_INFO, ha, "Unable to allocate SRB mempool.\n"); rval = QLA_FUNCTION_FAILED; @@ -2159,6 +2156,7 @@ qla2x00_free_sp_pool( scsi_qla_host_t *ha) static int qla2x00_do_dpc(void *data) { + DECLARE_MUTEX_LOCKED(sem); scsi_qla_host_t *ha; fc_port_t *fcport; uint8_t status; @@ -2166,19 +2164,32 @@ qla2x00_do_dpc(void *data) ha = (scsi_qla_host_t *)data; + lock_kernel(); + + daemonize("%s_dpc", ha->host_str); + allow_signal(SIGHUP); + + ha->dpc_wait = &sem; + set_user_nice(current, -20); - while (!kthread_should_stop()) { + unlock_kernel(); + + complete(&ha->dpc_inited); + + while (1) { DEBUG3(printk("qla2x00: DPC handler sleeping\n")); - set_current_state(TASK_INTERRUPTIBLE); - schedule(); - __set_current_state(TASK_RUNNING); + if (down_interruptible(&sem)) + break; + + if (ha->dpc_should_die) + break; DEBUG3(printk("qla2x00: DPC handler waking up\n")); /* Initialization not yet finished. Don't do anything yet. */ - if (!ha->flags.init_done) + if (!ha->flags.init_done || ha->dpc_active) continue; DEBUG3(printk("scsi(%ld): DPC handler\n", ha->host_no)); @@ -2238,6 +2249,9 @@ 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. @@ -2259,7 +2273,7 @@ qla2x00_do_dpc(void *data) } else status = qla2x00_local_device_login( - ha, fcport); + ha, fcport->loop_id); if (status == QLA_SUCCESS) { fcport->old_loop_id = fcport->loop_id; @@ -2342,16 +2356,10 @@ qla2x00_do_dpc(void *data) /* * Make sure that nobody tries to wake us up again. */ + ha->dpc_wait = NULL; ha->dpc_active = 0; - return 0; -} - -void -qla2xxx_wake_dpc(scsi_qla_host_t *ha) -{ - if (ha->dpc_thread) - wake_up_process(ha->dpc_thread); + complete_and_exit(&ha->dpc_exited, 0); } /* @@ -2532,8 +2540,11 @@ qla2x00_timer(scsi_qla_host_t *ha) test_bit(LOGIN_RETRY_NEEDED, &ha->dpc_flags) || test_bit(RESET_MARKER_NEEDED, &ha->dpc_flags) || test_bit(BEACON_BLINK_NEEDED, &ha->dpc_flags) || - test_bit(RELOGIN_NEEDED, &ha->dpc_flags))) - qla2xxx_wake_dpc(ha); + test_bit(RELOGIN_NEEDED, &ha->dpc_flags)) && + ha->dpc_wait && !ha->dpc_active) { + + up(ha->dpc_wait); + } qla2x00_restart_timer(ha, WATCH_INTERVAL); } @@ -2555,25 +2566,33 @@ 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 +#define FW_BLOBS 6 #define FW_ISP21XX 0 #define FW_ISP22XX 1 #define FW_ISP2300 2 #define FW_ISP2322 3 -#define FW_ISP24XX 4 +#define FW_ISP63XX 4 +#define FW_ISP24XX 5 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 }, .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 }, + { .name = "ql2100_fw.bin", .segs = { 0x1000, 0 }, }, + { .name = "ql2200_fw.bin", .segs = { 0x1000, 0 }, }, + { .name = "ql2300_fw.bin", .segs = { 0x800, 0 }, }, + { .name = "ql2322_fw.bin", .segs = { 0x800, 0x1c000, 0x1e000, 0 }, }, + { .name = "ql6312_fw.bin", .segs = { 0x800, 0 }, }, + { .name = "ql2400_fw.bin", }, }; struct fw_blob * @@ -2586,11 +2605,13 @@ qla2x00_request_firmware(scsi_qla_host_t *ha) blob = &qla_fw_blobs[FW_ISP21XX]; } else if (IS_QLA2200(ha)) { blob = &qla_fw_blobs[FW_ISP22XX]; - } else if (IS_QLA2300(ha) || IS_QLA2312(ha) || IS_QLA6312(ha)) { + } else if (IS_QLA2300(ha) || IS_QLA2312(ha)) { blob = &qla_fw_blobs[FW_ISP2300]; - } else if (IS_QLA2322(ha) || IS_QLA6322(ha)) { + } else if (IS_QLA2322(ha)) { blob = &qla_fw_blobs[FW_ISP2322]; - } else if (IS_QLA24XX(ha) || IS_QLA54XX(ha)) { + } else if (IS_QLA6312(ha) || IS_QLA6322(ha)) { + blob = &qla_fw_blobs[FW_ISP63XX]; + } else if (IS_QLA24XX(ha)) { blob = &qla_fw_blobs[FW_ISP24XX]; } @@ -2623,32 +2644,69 @@ 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_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) }, + { PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP2100, + PCI_ANY_ID, PCI_ANY_ID, }, + { PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP2200, + PCI_ANY_ID, PCI_ANY_ID, }, + { PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP2300, + PCI_ANY_ID, PCI_ANY_ID, }, + { PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP2312, + PCI_ANY_ID, PCI_ANY_ID, }, + { PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP2322, + PCI_ANY_ID, PCI_ANY_ID, }, + { PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP6312, + PCI_ANY_ID, PCI_ANY_ID, }, + { PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP6322, + PCI_ANY_ID, PCI_ANY_ID, }, + { PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP2422, + PCI_ANY_ID, PCI_ANY_ID, }, + { PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP2432, + PCI_ANY_ID, PCI_ANY_ID, }, { 0 }, }; MODULE_DEVICE_TABLE(pci, qla2xxx_pci_tbl); +static int __devinit +qla2xxx_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) +{ + return qla2x00_probe_one(pdev, &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_DRIVER_NAME, + .name = "qla2xxx", .driver = { .owner = THIS_MODULE, }, .id_table = qla2xxx_pci_tbl, - .probe = qla2x00_probe_one, - .remove = __devexit_p(qla2x00_remove_one), + .probe = qla2xxx_probe_one, + .remove = __devexit_p(qla2xxx_remove_one), }; +static inline int +qla2x00_pci_module_init(void) +{ + return pci_module_init(&qla2xxx_pci_driver); +} + +static inline void +qla2x00_pci_module_exit(void) +{ + pci_unregister_driver(&qla2xxx_pci_driver); +} + +#endif + /** * qla2x00_module_init - Module initialization. **/ @@ -2668,16 +2726,19 @@ qla2x00_module_init(void) /* Derive version string. */ strcpy(qla2x00_version_str, QLA2XXX_VERSION); - if (extended_error_logging) - strcat(qla2x00_version_str, "-debug"); - +#if defined(CONFIG_SCSI_QLA2XXX_EMBEDDED_FIRMWARE) + strcat(qla2x00_version_str, "-fw"); +#endif +#if DEBUG_QLA2100 + strcat(qla2x00_version_str, "-debug"); +#endif 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 = pci_register_driver(&qla2xxx_pci_driver); + ret = qla2x00_pci_module_init(); if (ret) { kmem_cache_destroy(srb_cachep); fc_release_transport(qla2xxx_transport_template); @@ -2691,8 +2752,8 @@ qla2x00_module_init(void) static void __exit qla2x00_module_exit(void) { - pci_unregister_driver(&qla2xxx_pci_driver); - /* qla2x00_release_firmware(); */ + qla2x00_pci_module_exit(); + qla2x00_release_firmware(); kmem_cache_destroy(srb_cachep); fc_release_transport(qla2xxx_transport_template); } diff --git a/drivers/scsi/qla2xxx/qla_settings.h b/drivers/scsi/qla2xxx/qla_settings.h index 249e4d90f..363205c0e 100644 --- a/drivers/scsi/qla2xxx/qla_settings.h +++ b/drivers/scsi/qla2xxx/qla_settings.h @@ -16,6 +16,7 @@ /* 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 c71dbd5bd..3866a5760 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, wait_cnt; + uint32_t nv_cmd; struct device_reg_2xxx __iomem *reg = &ha->iobase->isp; qla2x00_nv_write(ha, NVR_DATA_OUT); @@ -127,13 +127,7 @@ 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); @@ -307,17 +301,16 @@ qla2x00_clear_nvram_protection(scsi_qla_host_t *ha) { int ret, stat; struct device_reg_2xxx __iomem *reg = &ha->iobase->isp; - uint32_t word, wait_cnt; + uint32_t word; uint16_t wprot, wprot_old; /* Clear NVRAM write protection. */ ret = QLA_FUNCTION_FAILED; - - wprot_old = cpu_to_le16(qla2x00_get_nvram_word(ha, ha->nvram_base)); - stat = qla2x00_write_nvram_word_tmo(ha, ha->nvram_base, + wprot_old = cpu_to_le16(qla2x00_get_nvram_word(ha, 0)); + stat = qla2x00_write_nvram_word_tmo(ha, 0, __constant_cpu_to_le16(0x1234), 100000); - wprot = cpu_to_le16(qla2x00_get_nvram_word(ha, ha->nvram_base)); - if (stat != QLA_SUCCESS || wprot != 0x1234) { + wprot = cpu_to_le16(qla2x00_get_nvram_word(ha, 0)); + if (stat != QLA_SUCCESS || wprot != __constant_cpu_to_le16(0x1234)) { /* Write enable. */ qla2x00_nv_write(ha, NVR_DATA_OUT); qla2x00_nv_write(ha, 0); @@ -348,22 +341,14 @@ 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); - if (wait_cnt) - ret = QLA_SUCCESS; + ret = QLA_SUCCESS; } else - qla2x00_write_nvram_word(ha, ha->nvram_base, wprot_old); + qla2x00_write_nvram_word(ha, 0, wprot_old); return ret; } @@ -372,7 +357,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, wait_cnt; + uint32_t word; if (stat != QLA_SUCCESS) return; @@ -408,13 +393,7 @@ 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); @@ -521,20 +500,6 @@ 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 @@ -543,8 +508,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, sec_end_mask; - uint32_t fdata, findex ; + uint32_t sec_mask, rest_addr, conf_addr; + uint32_t fdata; uint8_t man_id, flash_id; struct device_reg_24xx __iomem *reg = &ha->iobase->isp24; @@ -554,7 +519,6 @@ 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. */ @@ -567,12 +531,6 @@ 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; @@ -587,30 +545,11 @@ 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 ((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)); + if ((faddr & rest_addr) == 0) { fdata = (faddr & sec_mask) << 2; ret = qla24xx_write_flash_dword(ha, conf_addr, (fdata & 0xff00) |((fdata << 16) & @@ -631,14 +570,6 @@ 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); @@ -1260,6 +1191,11 @@ qla2x00_poll_flash(scsi_qla_host_t *ha, uint32_t addr, uint8_t poll_data, return status; } +#define IS_OEM_001(ha) \ + ((ha)->pdev->device == PCI_DEVICE_ID_QLOGIC_ISP2322 && \ + (ha)->pdev->subsystem_vendor == 0x1028 && \ + (ha)->pdev->subsystem_device == 0x0170) + /** * qla2x00_program_flash_address() - Programs a flash address * @ha: HA context @@ -1418,7 +1354,7 @@ qla2x00_resume_hba(struct scsi_qla_host *ha) /* Resume HBA. */ clear_bit(MBX_UPDATE_FLASH_ACTIVE, &ha->mbx_cmd_flags); set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags); - qla2xxx_wake_dpc(ha); + up(ha->dpc_wait); qla2x00_wait_for_hba_online(ha); scsi_unblock_requests(ha->host); } @@ -1716,7 +1652,7 @@ qla24xx_write_optrom_data(struct scsi_qla_host *ha, uint8_t *buf, /* Resume HBA -- RISC reset needed. */ clear_bit(MBX_UPDATE_FLASH_ACTIVE, &ha->mbx_cmd_flags); set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags); - qla2xxx_wake_dpc(ha); + up(ha->dpc_wait); qla2x00_wait_for_hba_online(ha); scsi_unblock_requests(ha->host); diff --git a/drivers/scsi/qla2xxx/qla_version.h b/drivers/scsi/qla2xxx/qla_version.h index 971259032..d537192a1 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.07-k1" +#define QLA2XXX_VERSION "8.01.04-k" #define QLA_DRIVER_MAJOR_VER 8 #define QLA_DRIVER_MINOR_VER 1 -#define QLA_DRIVER_PATCH_VER 7 +#define QLA_DRIVER_PATCH_VER 4 #define QLA_DRIVER_BETA_VER 0 diff --git a/drivers/scsi/qlogicfc.c b/drivers/scsi/qlogicfc.c index ddf0f4277..94ef3f08d 100644 --- a/drivers/scsi/qlogicfc.c +++ b/drivers/scsi/qlogicfc.c @@ -711,7 +711,7 @@ static inline void isp2x00_disable_irqs(struct Scsi_Host *host) } -static int isp2x00_detect(Scsi_Host_Template * tmpt) +static int isp2x00_detect(struct scsi_host_template * tmpt) { int hosts = 0; unsigned long wait_time; @@ -746,7 +746,6 @@ static int isp2x00_detect(Scsi_Host_Template * tmpt) printk("qlogicfc%d : could not register host.\n", hosts); continue; } - scsi_set_device(host, &pdev->dev); host->max_id = QLOGICFC_MAX_ID + 1; host->max_lun = QLOGICFC_MAX_LUN; hostdata = (struct isp2x00_hostdata *) host->hostdata; @@ -2211,7 +2210,7 @@ void isp2x00_print_scsi_cmd(Scsi_Cmnd * cmd) MODULE_LICENSE("GPL"); -static Scsi_Host_Template driver_template = { +static struct scsi_host_template driver_template = { .detect = isp2x00_detect, .release = isp2x00_release, .info = isp2x00_info, diff --git a/drivers/scsi/qlogicpti.c b/drivers/scsi/qlogicpti.c index 5b2f0741a..1fd5fc6d0 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, 2006 David S. Miller (davem@davemloft.net) + * Copyright (C) 1996 David S. Miller (davem@caipfs.rutgers.edu) * * A lot of this driver was directly stolen from Erik H. Moe's PCI * Qlogic ISP driver. Mucho kudos to him for this code. @@ -24,7 +24,6 @@ #include #include #include -#include #include @@ -43,9 +42,12 @@ #include #include #include +#include #include #include + + #define MAX_TARGETS 16 #define MAX_LUNS 8 /* 32 for 1.31 F/W */ @@ -55,6 +57,7 @@ static struct qlogicpti *qptichain = NULL; static DEFINE_SPINLOCK(qptichain_lock); +static int qptis_running = 0; #define PACKB(a, b) (((a)<<4)|(b)) @@ -128,7 +131,7 @@ static const u_char mbox_param[] = { PACKB(0, 0) /* 0x0042 */ }; -#define MAX_MBOX_COMMAND ARRAY_SIZE(mbox_param) +#define MAX_MBOX_COMMAND (sizeof(mbox_param)/sizeof(u_short)) /* queue length's _must_ be power of two: */ #define QUEUE_DEPTH(in, out, ql) ((in - out) & (ql)) @@ -718,10 +721,10 @@ static int __init qpti_register_irq(struct qlogicpti *qpti) * sanely maintain. */ if (request_irq(qpti->irq, qpti_intr, - IRQF_SHARED, "Qlogic/PTI", qpti)) + SA_SHIRQ, "Qlogic/PTI", qpti)) goto fail; - printk("qpti%d: IRQ %d ", qpti->qpti_id, qpti->irq); + printk("qpti%d: IRQ %s ", qpti->qpti_id, __irq_itoa(qpti->irq)); return 0; @@ -812,13 +815,180 @@ 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 %d regs at %p", - qpti->qhost->irq, qpti->qregs); + sprintf(buf, "PTI Qlogic,ISP SBUS SCSI irq %s regs at %p", + __irq_itoa(qpti->qhost->irq), qpti->qregs); return buf; } @@ -847,7 +1017,7 @@ static inline void cmd_frob(struct Command_Entry *cmd, struct scsi_cmnd *Cmnd, if (Cmnd->device->tagged_supported) { if (qpti->cmd_count[Cmnd->device->id] == 0) qpti->tag_ages[Cmnd->device->id] = jiffies; - if (time_after(jiffies, qpti->tag_ages[Cmnd->device->id] + (5*HZ))) { + if ((jiffies - qpti->tag_ages[Cmnd->device->id]) > (5*HZ)) { cmd->control_flags = CFLAG_ORDERED_TAG; qpti->tag_ages[Cmnd->device->id] = jiffies; } else @@ -874,7 +1044,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->request_buffer; + sg = (struct scatterlist *) Cmnd->buffer; sg_count = sbus_map_sg(qpti->sdev, sg, Cmnd->use_sg, Cmnd->sc_data_direction); ds = cmd->dataseg; @@ -1278,7 +1448,7 @@ static struct scsi_cmnd *qlogicpti_intr_handler(struct qlogicpti *qpti) if (Cmnd->use_sg) { sbus_unmap_sg(qpti->sdev, - (struct scatterlist *)Cmnd->request_buffer, + (struct scatterlist *)Cmnd->buffer, Cmnd->use_sg, Cmnd->sc_data_direction); } else { @@ -1381,9 +1551,9 @@ static int qlogicpti_reset(struct scsi_cmnd *Cmnd) return return_status; } -static struct scsi_host_template qpti_template = { - .module = THIS_MODULE, - .name = "qlogicpti", +static struct scsi_host_template driver_template = { + .detect = qlogicpti_detect, + .release = qlogicpti_release, .info = qlogicpti_info, .queuecommand = qlogicpti_queuecommand_slow, .eh_abort_handler = qlogicpti_abort, @@ -1395,189 +1565,8 @@ static struct scsi_host_template qpti_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), -}; -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); -} +#include "scsi_module.c" -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 327b33a57..50c398aab 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 < ARRAY_SIZE(raid_states); i++) { + for (i = 0; i < sizeof(raid_states)/sizeof(raid_states[0]); 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 < ARRAY_SIZE(raid_levels); i++) { + for (i = 0; i < sizeof(raid_levels)/sizeof(raid_levels[0]); 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 39ace4c6e..b00af0884 100644 --- a/drivers/scsi/sata_mv.c +++ b/drivers/scsi/sata_mv.c @@ -37,7 +37,7 @@ #include #define DRV_NAME "sata_mv" -#define DRV_VERSION "0.7" +#define DRV_VERSION "0.5" enum { /* BAR's are enumerated in terms of pci_resource_start() terms */ @@ -50,12 +50,6 @@ enum { MV_PCI_REG_BASE = 0, MV_IRQ_COAL_REG_BASE = 0x18000, /* 6xxx part only */ - MV_IRQ_COAL_CAUSE = (MV_IRQ_COAL_REG_BASE + 0x08), - MV_IRQ_COAL_CAUSE_LO = (MV_IRQ_COAL_REG_BASE + 0x88), - MV_IRQ_COAL_CAUSE_HI = (MV_IRQ_COAL_REG_BASE + 0x8c), - MV_IRQ_COAL_THRESHOLD = (MV_IRQ_COAL_REG_BASE + 0xcc), - MV_IRQ_COAL_TIME_THRESHOLD = (MV_IRQ_COAL_REG_BASE + 0xd0), - MV_SATAHC0_REG_BASE = 0x20000, MV_FLASH_CTL = 0x1046c, MV_GPIO_PORT_CTL = 0x104f0, @@ -93,7 +87,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_PIO_POLLING), + ATA_FLAG_NO_ATAPI), MV_6XXX_FLAGS = MV_FLAG_IRQ_COALESCE, CRQB_FLAG_READ = (1 << 0), @@ -234,9 +228,7 @@ enum { MV_HP_ERRATA_50XXB2 = (1 << 2), MV_HP_ERRATA_60X1B2 = (1 << 3), MV_HP_ERRATA_60X1C0 = (1 << 4), - MV_HP_ERRATA_XX42A0 = (1 << 5), - MV_HP_50XX = (1 << 6), - MV_HP_GEN_IIE = (1 << 7), + MV_HP_50XX = (1 << 5), /* Port private flags (pp_flags) */ MV_PP_FLAG_EDMA_EN = (1 << 0), @@ -245,9 +237,6 @@ enum { #define IS_50XX(hpriv) ((hpriv)->hp_flags & MV_HP_50XX) #define IS_60XX(hpriv) (((hpriv)->hp_flags & MV_HP_50XX) == 0) -#define IS_GEN_I(hpriv) IS_50XX(hpriv) -#define IS_GEN_II(hpriv) IS_60XX(hpriv) -#define IS_GEN_IIE(hpriv) ((hpriv)->hp_flags & MV_HP_GEN_IIE) enum { /* Our DMA boundary is determined by an ePRD being unable to handle @@ -266,39 +255,29 @@ enum chip_type { chip_5080, chip_604x, chip_608x, - chip_6042, - chip_7042, }; /* Command ReQuest Block: 32B */ struct mv_crqb { - __le32 sg_addr; - __le32 sg_addr_hi; - __le16 ctrl_flags; - __le16 ata_cmd[11]; -}; - -struct mv_crqb_iie { - __le32 addr; - __le32 addr_hi; - __le32 flags; - __le32 len; - __le32 ata_cmd[4]; + u32 sg_addr; + u32 sg_addr_hi; + u16 ctrl_flags; + u16 ata_cmd[11]; }; /* Command ResPonse Block: 8B */ struct mv_crpb { - __le16 id; - __le16 flags; - __le32 tmstmp; + u16 id; + u16 flags; + u32 tmstmp; }; /* EDMA Physical Region Descriptor (ePRD); A.K.A. SG */ struct mv_sg { - __le32 addr; - __le32 flags_size; - __le32 addr_hi; - __le32 reserved; + u32 addr; + u32 flags_size; + u32 addr_hi; + u32 reserved; }; struct mv_port_priv { @@ -308,6 +287,9 @@ struct mv_port_priv { dma_addr_t crpb_dma; struct mv_sg *sg_tbl; dma_addr_t sg_tbl_dma; + + unsigned req_producer; /* cp of req_in_ptr */ + unsigned rsp_consumer; /* cp of rsp_out_ptr */ u32 pp_flags; }; @@ -346,8 +328,7 @@ static void mv_host_stop(struct ata_host_set *host_set); static int mv_port_start(struct ata_port *ap); static void mv_port_stop(struct ata_port *ap); static void mv_qc_prep(struct ata_queued_cmd *qc); -static void mv_qc_prep_iie(struct ata_queued_cmd *qc); -static unsigned int mv_qc_issue(struct ata_queued_cmd *qc); +static int mv_qc_issue(struct ata_queued_cmd *qc); static irqreturn_t mv_interrupt(int irq, void *dev_instance, struct pt_regs *regs); static void mv_eng_timeout(struct ata_port *ap); @@ -381,16 +362,17 @@ static struct scsi_host_template mv_sht = { .name = DRV_NAME, .ioctl = ata_scsi_ioctl, .queuecommand = ata_scsi_queuecmd, + .eh_strategy_handler = ata_scsi_error, .can_queue = MV_USE_Q_DEPTH, .this_id = ATA_SHT_THIS_ID, .sg_tablesize = MV_MAX_SG_CT / 2, + .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 = MV_DMA_BOUNDARY, .slave_configure = ata_scsi_slave_config, - .slave_destroy = ata_scsi_slave_destroy, .bios_param = ata_std_bios_param, }; @@ -407,7 +389,6 @@ 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, @@ -435,35 +416,6 @@ 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, - - .irq_handler = mv_interrupt, - .irq_clear = mv_irq_clear, - - .scr_read = mv_scr_read, - .scr_write = mv_scr_write, - - .port_start = mv_port_start, - .port_stop = mv_port_stop, - .host_stop = mv_host_stop, -}; - -static const struct ata_port_operations mv_iie_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, - - .phy_reset = mv_phy_reset, - - .qc_prep = mv_qc_prep_iie, - .qc_issue = mv_qc_issue, - .data_xfer = ata_mmio_data_xfer, .eng_timeout = mv_eng_timeout, @@ -515,21 +467,6 @@ static const struct ata_port_info mv_port_info[] = { .udma_mask = 0x7f, /* udma0-6 */ .port_ops = &mv6_ops, }, - { /* chip_6042 */ - .sht = &mv_sht, - .host_flags = (MV_COMMON_FLAGS | MV_6XXX_FLAGS), - .pio_mask = 0x1f, /* pio0-4 */ - .udma_mask = 0x7f, /* udma0-6 */ - .port_ops = &mv_iie_ops, - }, - { /* chip_7042 */ - .sht = &mv_sht, - .host_flags = (MV_COMMON_FLAGS | MV_6XXX_FLAGS | - MV_FLAG_DUAL_HC), - .pio_mask = 0x1f, /* pio0-4 */ - .udma_mask = 0x7f, /* udma0-6 */ - .port_ops = &mv_iie_ops, - }, }; static const struct pci_device_id mv_pci_tbl[] = { @@ -540,7 +477,6 @@ static const struct pci_device_id mv_pci_tbl[] = { {PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x6040), 0, 0, chip_604x}, {PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x6041), 0, 0, chip_604x}, - {PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x6042), 0, 0, chip_6042}, {PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x6080), 0, 0, chip_608x}, {PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x6081), 0, 0, chip_608x}, @@ -636,8 +572,8 @@ static void mv_irq_clear(struct ata_port *ap) * @base: port base address * @pp: port private data * - * Verify the local cache of the eDMA state is accurate with a - * WARN_ON. + * Verify the local cache of the eDMA state is accurate with an + * assert. * * LOCKING: * Inherited from caller. @@ -648,15 +584,15 @@ static void mv_start_dma(void __iomem *base, struct mv_port_priv *pp) writelfl(EDMA_EN, base + EDMA_CMD_OFS); pp->pp_flags |= MV_PP_FLAG_EDMA_EN; } - WARN_ON(!(EDMA_EN & readl(base + EDMA_CMD_OFS))); + assert(EDMA_EN & readl(base + EDMA_CMD_OFS)); } /** * mv_stop_dma - Disable eDMA engine * @ap: ATA channel to manipulate * - * Verify the local cache of the eDMA state is accurate with a - * WARN_ON. + * Verify the local cache of the eDMA state is accurate with an + * assert. * * LOCKING: * Inherited from caller. @@ -674,7 +610,7 @@ static void mv_stop_dma(struct ata_port *ap) writelfl(EDMA_DS, port_mmio + EDMA_CMD_OFS); pp->pp_flags &= ~MV_PP_FLAG_EDMA_EN; } else { - WARN_ON(EDMA_EN & readl(port_mmio + EDMA_CMD_OFS)); + assert(!(EDMA_EN & readl(port_mmio + EDMA_CMD_OFS))); } /* now properly wait for the eDMA to stop */ @@ -687,7 +623,7 @@ static void mv_stop_dma(struct ata_port *ap) } if (EDMA_EN & reg) { - ata_port_printk(ap, KERN_ERR, "Unable to stop eDMA\n"); + printk(KERN_ERR "ata%u: Unable to stop eDMA\n", ap->id); /* FIXME: Consider doing a reset here to recover */ } } @@ -754,7 +690,7 @@ static void mv_dump_all_regs(void __iomem *mmio_base, int port, mv_dump_mem(mmio_base+0xf00, 0x4); mv_dump_mem(mmio_base+0x1d00, 0x6c); for (hc = start_hc; hc < start_hc + num_hcs; hc++) { - hc_base = mv_hc_base(mmio_base, hc); + hc_base = mv_hc_base(mmio_base, port >> MV_PORT_HC_SHIFT); DPRINTK("HC regs (HC %i):\n", hc); mv_dump_mem(hc_base, 0x1c); } @@ -837,33 +773,6 @@ static inline void mv_priv_free(struct mv_port_priv *pp, struct device *dev) dma_free_coherent(dev, MV_PORT_PRIV_DMA_SZ, pp->crpb, pp->crpb_dma); } -static void mv_edma_cfg(struct mv_host_priv *hpriv, void __iomem *port_mmio) -{ - u32 cfg = readl(port_mmio + EDMA_CFG_OFS); - - /* set up non-NCQ EDMA configuration */ - cfg &= ~0x1f; /* clear queue depth */ - cfg &= ~EDMA_CFG_NCQ; /* clear NCQ mode */ - cfg &= ~(1 << 9); /* disable equeue */ - - if (IS_GEN_I(hpriv)) - cfg |= (1 << 8); /* enab config burst size mask */ - - else if (IS_GEN_II(hpriv)) - cfg |= EDMA_CFG_RD_BRST_EXT | EDMA_CFG_WR_BUFF_LEN; - - else if (IS_GEN_IIE(hpriv)) { - cfg |= (1 << 23); /* dis RX PM port mask */ - cfg &= ~(1 << 16); /* dis FIS-based switching (for now) */ - cfg &= ~(1 << 19); /* dis 128-entry queue (for now?) */ - cfg |= (1 << 18); /* enab early completion */ - cfg |= (1 << 17); /* enab host q cache */ - cfg |= (1 << 22); /* enab cutthrough */ - } - - writelfl(cfg, port_mmio + EDMA_CFG_OFS); -} - /** * mv_port_start - Port specific init/start routine. * @ap: ATA channel to manipulate @@ -877,7 +786,6 @@ static void mv_edma_cfg(struct mv_host_priv *hpriv, void __iomem *port_mmio) static int mv_port_start(struct ata_port *ap) { struct device *dev = ap->host_set->dev; - struct mv_host_priv *hpriv = ap->host_set->private_data; struct mv_port_priv *pp; void __iomem *port_mmio = mv_ap_base(ap); void *mem; @@ -921,29 +829,22 @@ static int mv_port_start(struct ata_port *ap) pp->sg_tbl = mem; pp->sg_tbl_dma = mem_dma; - mv_edma_cfg(hpriv, port_mmio); + writelfl(EDMA_CFG_Q_DEPTH | EDMA_CFG_RD_BRST_EXT | + EDMA_CFG_WR_BUFF_LEN, port_mmio + EDMA_CFG_OFS); writel((pp->crqb_dma >> 16) >> 16, port_mmio + EDMA_REQ_Q_BASE_HI_OFS); writelfl(pp->crqb_dma & EDMA_REQ_Q_BASE_LO_MASK, port_mmio + EDMA_REQ_Q_IN_PTR_OFS); - if (hpriv->hp_flags & MV_HP_ERRATA_XX42A0) - writelfl(pp->crqb_dma & 0xffffffff, - port_mmio + EDMA_REQ_Q_OUT_PTR_OFS); - else - writelfl(0, port_mmio + EDMA_REQ_Q_OUT_PTR_OFS); + writelfl(0, port_mmio + EDMA_REQ_Q_OUT_PTR_OFS); + writelfl(0, port_mmio + EDMA_RSP_Q_IN_PTR_OFS); writel((pp->crpb_dma >> 16) >> 16, port_mmio + EDMA_RSP_Q_BASE_HI_OFS); - - if (hpriv->hp_flags & MV_HP_ERRATA_XX42A0) - writelfl(pp->crpb_dma & 0xffffffff, - port_mmio + EDMA_RSP_Q_IN_PTR_OFS); - else - writelfl(0, port_mmio + EDMA_RSP_Q_IN_PTR_OFS); - writelfl(pp->crpb_dma & EDMA_RSP_Q_BASE_LO_MASK, port_mmio + EDMA_RSP_Q_OUT_PTR_OFS); + pp->req_producer = pp->rsp_consumer = 0; + /* Don't turn on EDMA here...do it before DMA commands only. Else * we'll be unable to send non-data, PIO, etc due to restricted access * to shadow regs. @@ -1014,7 +915,7 @@ static void mv_fill_sg(struct ata_queued_cmd *qc) pp->sg_tbl[i].addr = cpu_to_le32(addr & 0xffffffff); pp->sg_tbl[i].addr_hi = cpu_to_le32((addr >> 16) >> 16); - pp->sg_tbl[i].flags_size = cpu_to_le32(len & 0xffff); + pp->sg_tbl[i].flags_size = cpu_to_le32(len); sg_len -= len; addr += len; @@ -1027,16 +928,16 @@ static void mv_fill_sg(struct ata_queued_cmd *qc) } } -static inline unsigned mv_inc_q_index(unsigned index) +static inline unsigned mv_inc_q_index(unsigned *index) { - return (index + 1) & MV_MAX_Q_DEPTH_MASK; + *index = (*index + 1) & MV_MAX_Q_DEPTH_MASK; + return *index; } -static inline void mv_crqb_pack_cmd(__le16 *cmdw, u8 data, u8 addr, unsigned last) +static inline void mv_crqb_pack_cmd(u16 *cmdw, u8 data, u8 addr, unsigned last) { - u16 tmp = data | (addr << CRQB_CMD_ADDR_SHIFT) | CRQB_CMD_CS | + *cmdw = data | (addr << CRQB_CMD_ADDR_SHIFT) | CRQB_CMD_CS | (last ? CRQB_CMD_LAST : 0); - *cmdw = cpu_to_le16(tmp); } /** @@ -1055,32 +956,34 @@ static void mv_qc_prep(struct ata_queued_cmd *qc) { struct ata_port *ap = qc->ap; struct mv_port_priv *pp = ap->private_data; - __le16 *cw; + u16 *cw; struct ata_taskfile *tf; u16 flags = 0; - unsigned in_index; - if (ATA_PROT_DMA != qc->tf.protocol) + if (ATA_PROT_DMA != qc->tf.protocol) { return; + } + + /* the req producer index should be the same as we remember it */ + assert(((readl(mv_ap_base(qc->ap) + EDMA_REQ_Q_IN_PTR_OFS) >> + EDMA_REQ_Q_PTR_SHIFT) & MV_MAX_Q_DEPTH_MASK) == + pp->req_producer); /* Fill in command request block */ - if (!(qc->tf.flags & ATA_TFLAG_WRITE)) + if (!(qc->tf.flags & ATA_TFLAG_WRITE)) { flags |= CRQB_FLAG_READ; - WARN_ON(MV_MAX_Q_DEPTH <= qc->tag); + } + assert(MV_MAX_Q_DEPTH > qc->tag); flags |= qc->tag << CRQB_TAG_SHIFT; - /* get current queue index from hardware */ - in_index = (readl(mv_ap_base(ap) + EDMA_REQ_Q_IN_PTR_OFS) - >> EDMA_REQ_Q_PTR_SHIFT) & MV_MAX_Q_DEPTH_MASK; - - pp->crqb[in_index].sg_addr = + pp->crqb[pp->req_producer].sg_addr = cpu_to_le32(pp->sg_tbl_dma & 0xffffffff); - pp->crqb[in_index].sg_addr_hi = + pp->crqb[pp->req_producer].sg_addr_hi = cpu_to_le32((pp->sg_tbl_dma >> 16) >> 16); - pp->crqb[in_index].ctrl_flags = cpu_to_le16(flags); + pp->crqb[pp->req_producer].ctrl_flags = cpu_to_le16(flags); - cw = &pp->crqb[in_index].ata_cmd[0]; + cw = &pp->crqb[pp->req_producer].ata_cmd[0]; tf = &qc->tf; /* Sadly, the CRQB cannot accomodate all registers--there are @@ -1126,76 +1029,9 @@ static void mv_qc_prep(struct ata_queued_cmd *qc) mv_crqb_pack_cmd(cw++, tf->device, ATA_REG_DEVICE, 0); mv_crqb_pack_cmd(cw++, tf->command, ATA_REG_CMD, 1); /* last */ - if (!(qc->flags & ATA_QCFLAG_DMAMAP)) - return; - mv_fill_sg(qc); -} - -/** - * mv_qc_prep_iie - Host specific command preparation. - * @qc: queued command to prepare - * - * This routine simply redirects to the general purpose routine - * if command is not DMA. Else, it handles prep of the CRQB - * (command request block), does some sanity checking, and calls - * the SG load routine. - * - * LOCKING: - * Inherited from caller. - */ -static void mv_qc_prep_iie(struct ata_queued_cmd *qc) -{ - struct ata_port *ap = qc->ap; - struct mv_port_priv *pp = ap->private_data; - struct mv_crqb_iie *crqb; - struct ata_taskfile *tf; - unsigned in_index; - u32 flags = 0; - - if (ATA_PROT_DMA != qc->tf.protocol) - return; - - /* Fill in Gen IIE command request block - */ - if (!(qc->tf.flags & ATA_TFLAG_WRITE)) - flags |= CRQB_FLAG_READ; - - WARN_ON(MV_MAX_Q_DEPTH <= qc->tag); - flags |= qc->tag << CRQB_TAG_SHIFT; - - /* get current queue index from hardware */ - in_index = (readl(mv_ap_base(ap) + EDMA_REQ_Q_IN_PTR_OFS) - >> EDMA_REQ_Q_PTR_SHIFT) & MV_MAX_Q_DEPTH_MASK; - - crqb = (struct mv_crqb_iie *) &pp->crqb[in_index]; - crqb->addr = cpu_to_le32(pp->sg_tbl_dma & 0xffffffff); - crqb->addr_hi = cpu_to_le32((pp->sg_tbl_dma >> 16) >> 16); - crqb->flags = cpu_to_le32(flags); - - tf = &qc->tf; - crqb->ata_cmd[0] = cpu_to_le32( - (tf->command << 16) | - (tf->feature << 24) - ); - crqb->ata_cmd[1] = cpu_to_le32( - (tf->lbal << 0) | - (tf->lbam << 8) | - (tf->lbah << 16) | - (tf->device << 24) - ); - crqb->ata_cmd[2] = cpu_to_le32( - (tf->hob_lbal << 0) | - (tf->hob_lbam << 8) | - (tf->hob_lbah << 16) | - (tf->hob_feature << 24) - ); - crqb->ata_cmd[3] = cpu_to_le32( - (tf->nsect << 0) | - (tf->hob_nsect << 8) - ); - - if (!(qc->flags & ATA_QCFLAG_DMAMAP)) + if (!(qc->flags & ATA_QCFLAG_DMAMAP)) { return; + } mv_fill_sg(qc); } @@ -1211,11 +1047,10 @@ static void mv_qc_prep_iie(struct ata_queued_cmd *qc) * LOCKING: * Inherited from caller. */ -static unsigned int mv_qc_issue(struct ata_queued_cmd *qc) +static int mv_qc_issue(struct ata_queued_cmd *qc) { void __iomem *port_mmio = mv_ap_base(qc->ap); struct mv_port_priv *pp = qc->ap->private_data; - unsigned in_index; u32 in_ptr; if (ATA_PROT_DMA != qc->tf.protocol) { @@ -1227,20 +1062,23 @@ static unsigned int mv_qc_issue(struct ata_queued_cmd *qc) return ata_qc_issue_prot(qc); } - in_ptr = readl(port_mmio + EDMA_REQ_Q_IN_PTR_OFS); - in_index = (in_ptr >> EDMA_REQ_Q_PTR_SHIFT) & MV_MAX_Q_DEPTH_MASK; + in_ptr = readl(port_mmio + EDMA_REQ_Q_IN_PTR_OFS); + /* the req producer index should be the same as we remember it */ + assert(((in_ptr >> EDMA_REQ_Q_PTR_SHIFT) & MV_MAX_Q_DEPTH_MASK) == + pp->req_producer); /* until we do queuing, the queue should be empty at this point */ - WARN_ON(in_index != ((readl(port_mmio + EDMA_REQ_Q_OUT_PTR_OFS) - >> EDMA_REQ_Q_PTR_SHIFT) & MV_MAX_Q_DEPTH_MASK)); + assert(((in_ptr >> EDMA_REQ_Q_PTR_SHIFT) & MV_MAX_Q_DEPTH_MASK) == + ((readl(port_mmio + EDMA_REQ_Q_OUT_PTR_OFS) >> + EDMA_REQ_Q_PTR_SHIFT) & MV_MAX_Q_DEPTH_MASK)); - in_index = mv_inc_q_index(in_index); /* now incr producer index */ + mv_inc_q_index(&pp->req_producer); /* now incr producer index */ mv_start_dma(port_mmio, pp); /* and write the request in pointer to kick the EDMA to life */ in_ptr &= EDMA_REQ_Q_BASE_LO_MASK; - in_ptr |= in_index << EDMA_REQ_Q_PTR_SHIFT; + in_ptr |= pp->req_producer << EDMA_REQ_Q_PTR_SHIFT; writelfl(in_ptr, port_mmio + EDMA_REQ_Q_IN_PTR_OFS); return 0; @@ -1252,7 +1090,7 @@ static unsigned int mv_qc_issue(struct ata_queued_cmd *qc) * * This routine is for use when the port is in DMA mode, when it * will be using the CRPB (command response block) method of - * returning command completion information. We check indices + * returning command completion information. We assert indices * are good, grab status, and bump the response consumer index to * prove that we're up to date. * @@ -1263,26 +1101,28 @@ static u8 mv_get_crpb_status(struct ata_port *ap) { void __iomem *port_mmio = mv_ap_base(ap); struct mv_port_priv *pp = ap->private_data; - unsigned out_index; u32 out_ptr; u8 ata_status; - out_ptr = readl(port_mmio + EDMA_RSP_Q_OUT_PTR_OFS); - out_index = (out_ptr >> EDMA_RSP_Q_PTR_SHIFT) & MV_MAX_Q_DEPTH_MASK; + out_ptr = readl(port_mmio + EDMA_RSP_Q_OUT_PTR_OFS); - ata_status = le16_to_cpu(pp->crpb[out_index].flags) - >> CRPB_FLAG_STATUS_SHIFT; + /* the response consumer index should be the same as we remember it */ + assert(((out_ptr >> EDMA_RSP_Q_PTR_SHIFT) & MV_MAX_Q_DEPTH_MASK) == + pp->rsp_consumer); + + ata_status = pp->crpb[pp->rsp_consumer].flags >> CRPB_FLAG_STATUS_SHIFT; /* increment our consumer index... */ - out_index = mv_inc_q_index(out_index); + pp->rsp_consumer = mv_inc_q_index(&pp->rsp_consumer); /* and, until we do NCQ, there should only be 1 CRPB waiting */ - WARN_ON(out_index != ((readl(port_mmio + EDMA_RSP_Q_IN_PTR_OFS) - >> EDMA_RSP_Q_PTR_SHIFT) & MV_MAX_Q_DEPTH_MASK)); + assert(((readl(port_mmio + EDMA_RSP_Q_IN_PTR_OFS) >> + EDMA_RSP_Q_PTR_SHIFT) & MV_MAX_Q_DEPTH_MASK) == + pp->rsp_consumer); /* write out our inc'd consumer index so EDMA knows we're caught up */ out_ptr &= EDMA_RSP_Q_BASE_LO_MASK; - out_ptr |= out_index << EDMA_RSP_Q_PTR_SHIFT; + out_ptr |= pp->rsp_consumer << EDMA_RSP_Q_PTR_SHIFT; writelfl(out_ptr, port_mmio + EDMA_RSP_Q_OUT_PTR_OFS); /* Return ATA status register for completed CRPB */ @@ -1292,7 +1132,6 @@ static u8 mv_get_crpb_status(struct ata_port *ap) /** * mv_err_intr - Handle error interrupts on the port * @ap: ATA channel to manipulate - * @reset_allowed: bool: 0 == don't trigger from reset here * * In most cases, just clear the interrupt and move on. However, * some cases require an eDMA reset, which is done right before @@ -1303,7 +1142,7 @@ static u8 mv_get_crpb_status(struct ata_port *ap) * LOCKING: * Inherited from caller. */ -static void mv_err_intr(struct ata_port *ap, int reset_allowed) +static void mv_err_intr(struct ata_port *ap) { void __iomem *port_mmio = mv_ap_base(ap); u32 edma_err_cause, serr = 0; @@ -1311,8 +1150,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) { - sata_scr_read(ap, SCR_ERROR, &serr); - sata_scr_write_flush(ap, SCR_ERROR, serr); + serr = scr_read(ap, SCR_ERROR); + scr_write_flush(ap, SCR_ERROR, serr); } if (EDMA_ERR_SELF_DIS & edma_err_cause) { struct mv_port_priv *pp = ap->private_data; @@ -1325,8 +1164,9 @@ static void mv_err_intr(struct ata_port *ap, int reset_allowed) writelfl(0, port_mmio + EDMA_ERR_IRQ_CAUSE_OFS); /* check for fatal here and recover if needed */ - if (reset_allowed && (EDMA_ERR_FATAL & edma_err_cause)) + if (EDMA_ERR_FATAL & edma_err_cause) { mv_stop_and_reset(ap); + } } /** @@ -1350,6 +1190,7 @@ static void mv_host_intr(struct ata_host_set *host_set, u32 relevant, { void __iomem *mmio = host_set->mmio_base; void __iomem *hc_mmio = mv_hc_base(mmio, hc); + struct ata_port *ap; struct ata_queued_cmd *qc; u32 hc_irq_cause; int shift, port, port0, hard_port, handled; @@ -1372,37 +1213,25 @@ static void mv_host_intr(struct ata_host_set *host_set, u32 relevant, for (port = port0; port < port0 + MV_PORTS_PER_HC; port++) { u8 ata_status = 0; - struct ata_port *ap = host_set->ports[port]; - struct mv_port_priv *pp = ap->private_data; - - hard_port = mv_hardport_from_port(port); /* range 0..3 */ + ap = host_set->ports[port]; + hard_port = port & MV_PORT_MASK; /* range 0-3 */ handled = 0; /* ensure ata_status is set if handled++ */ - /* 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) { - ata_status = mv_get_crpb_status(ap); - handled = 1; - } - } else { - /* PIO: check for device (drive) interrupt */ - if ((DEV_IRQ << hard_port) & hc_irq_cause) { - ata_status = readb((void __iomem *) + if ((CRPB_DMA_DONE << hard_port) & hc_irq_cause) { + /* new CRPB on the queue; just one at a time until NCQ + */ + ata_status = mv_get_crpb_status(ap); + handled++; + } else if ((DEV_IRQ << hard_port) & hc_irq_cause) { + /* received ATA IRQ; read the status reg to clear INTRQ + */ + ata_status = readb((void __iomem *) ap->ioaddr.status_addr); - handled = 1; - /* ignore spurious intr if drive still BUSY */ - if (ata_status & ATA_BUSY) { - ata_status = 0; - handled = 0; - } - } + handled++; } - if (ap && (ap->flags & ATA_FLAG_DISABLED)) + if (ap && + (ap->flags & (ATA_FLAG_PORT_DISABLED | ATA_FLAG_NOINTR))) continue; err_mask = ac_err_mask(ata_status); @@ -1412,18 +1241,18 @@ static void mv_host_intr(struct ata_host_set *host_set, u32 relevant, shift++; /* skip bit 8 in the HC Main IRQ reg */ } if ((PORT0_ERR << shift) & relevant) { - mv_err_intr(ap, 1); + mv_err_intr(ap); err_mask |= AC_ERR_OTHER; - handled = 1; + handled++; } - if (handled) { + if (handled && ap) { qc = ata_qc_from_tag(ap, ap->active_tag); - if (qc && (qc->flags & ATA_QCFLAG_ACTIVE)) { + if (NULL != qc) { VPRINTK("port %u IRQ found for qc, " "ata_status 0x%x\n", port,ata_status); /* mark qc status appropriately */ - if (!(qc->tf.flags & ATA_TFLAG_POLLING)) { + if (!(qc->tf.ctl & ATA_NIEN)) { qc->err_mask |= err_mask; ata_qc_complete(qc); } @@ -1454,7 +1283,6 @@ static irqreturn_t mv_interrupt(int irq, void *dev_instance, struct ata_host_set *host_set = dev_instance; unsigned int hc, handled = 0, n_hcs; void __iomem *mmio = host_set->mmio_base; - struct mv_host_priv *hpriv; u32 irq_stat; irq_stat = readl(mmio + HC_MAIN_IRQ_CAUSE_OFS); @@ -1476,17 +1304,6 @@ static irqreturn_t mv_interrupt(int irq, void *dev_instance, handled++; } } - - hpriv = host_set->private_data; - if (IS_60XX(hpriv)) { - /* deal with the interrupt coalescing bits */ - if (irq_stat & (TRAN_LO_DONE | TRAN_HI_DONE | PORTS_0_7_COAL_DONE)) { - writelfl(0, mmio + MV_IRQ_COAL_CAUSE_LO); - writelfl(0, mmio + MV_IRQ_COAL_CAUSE_HI); - writelfl(0, mmio + MV_IRQ_COAL_CAUSE); - } - } - if (PCI_ERR & irq_stat) { printk(KERN_ERR DRV_NAME ": PCI ERROR; PCI IRQ cause=0x%08x\n", readl(mmio + PCI_IRQ_CAUSE_OFS)); @@ -1867,12 +1684,6 @@ static void mv6_phy_errata(struct mv_host_priv *hpriv, void __iomem *mmio, m2 |= hpriv->signal[port].pre; m2 &= ~(1 << 16); - /* according to mvSata 3.6.1, some IIE values are fixed */ - if (IS_GEN_IIE(hpriv)) { - m2 &= ~0xC30FF01F; - m2 |= 0x0000900F; - } - writel(m2, port_mmio + PHY_MODE2); } @@ -1885,8 +1696,7 @@ static void mv_channel_reset(struct mv_host_priv *hpriv, void __iomem *mmio, if (IS_60XX(hpriv)) { u32 ifctl = readl(port_mmio + SATA_INTERFACE_CTL); - ifctl |= (1 << 7); /* enable gen2i speed */ - ifctl = (ifctl & 0xfff) | 0x9b1000; /* from chip spec */ + ifctl |= (1 << 12) | (1 << 7); writelfl(ifctl, port_mmio + SATA_INTERFACE_CTL); } @@ -1953,16 +1763,16 @@ static void __mv_phy_reset(struct ata_port *ap, int can_sleep) /* Issue COMRESET via SControl */ comreset_retry: - sata_scr_write_flush(ap, SCR_CONTROL, 0x301); + scr_write_flush(ap, SCR_CONTROL, 0x301); __msleep(1, can_sleep); - sata_scr_write_flush(ap, SCR_CONTROL, 0x300); + scr_write_flush(ap, SCR_CONTROL, 0x300); __msleep(20, can_sleep); timeout = jiffies + msecs_to_jiffies(200); do { - sata_scr_read(ap, SCR_STATUS, &sstatus); - if (((sstatus & 0x3) == 3) || ((sstatus & 0x3) == 0)) + sstatus = scr_read(ap, SCR_STATUS) & 0x3; + if ((sstatus == 3) || (sstatus == 0)) break; __msleep(1, can_sleep); @@ -1978,12 +1788,11 @@ 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 (ata_port_online(ap)) { + if (sata_dev_present(ap)) { ata_port_probe(ap); } else { - sata_scr_read(ap, SCR_STATUS, &sstatus); - ata_port_printk(ap, KERN_INFO, - "no device found (phy stat %08x)\n", sstatus); + printk(KERN_INFO "ata%u: no device found (phy stat %08x)\n", + ap->id, scr_read(ap, SCR_STATUS)); ata_port_disable(ap); return; } @@ -2010,7 +1819,7 @@ comreset_retry: tf.nsect = readb((void __iomem *) ap->ioaddr.nsect_addr); dev->class = ata_dev_classify(&tf); - if (!ata_dev_enabled(dev)) { + if (!ata_dev_present(dev)) { VPRINTK("Port disabled post-sig: No device present.\n"); ata_port_disable(ap); } @@ -2042,7 +1851,7 @@ static void mv_eng_timeout(struct ata_port *ap) struct ata_queued_cmd *qc; unsigned long flags; - ata_port_printk(ap, KERN_ERR, "Entering mv_eng_timeout\n"); + printk(KERN_ERR "ata%u: Entering mv_eng_timeout\n",ap->id); 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)); @@ -2052,15 +1861,24 @@ static void mv_eng_timeout(struct ata_port *ap) ap->host_set->mmio_base, ap, qc, qc->scsicmd, &qc->scsicmd->cmnd); - spin_lock_irqsave(&ap->host_set->lock, flags); - mv_err_intr(ap, 0); + mv_err_intr(ap); mv_stop_and_reset(ap); - spin_unlock_irqrestore(&ap->host_set->lock, flags); - WARN_ON(!(qc->flags & ATA_QCFLAG_ACTIVE)); - if (qc->flags & ATA_QCFLAG_ACTIVE) { - qc->err_mask |= AC_ERR_TIMEOUT; - ata_eh_qc_complete(qc); + 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. + */ + spin_lock_irqsave(&ap->host_set->lock, flags); + qc->scsidone = scsi_finish_command; + qc->err_mask |= AC_ERR_OTHER; + ata_qc_complete(qc); + spin_unlock_irqrestore(&ap->host_set->lock, flags); } } @@ -2180,27 +1998,6 @@ static int mv_chip_id(struct pci_dev *pdev, struct mv_host_priv *hpriv, } break; - case chip_7042: - case chip_6042: - hpriv->ops = &mv6xxx_ops; - - hp_flags |= MV_HP_GEN_IIE; - - switch (rev_id) { - case 0x0: - hp_flags |= MV_HP_ERRATA_XX42A0; - break; - case 0x1: - hp_flags |= MV_HP_ERRATA_60X1C0; - break; - default: - dev_printk(KERN_WARNING, &pdev->dev, - "Applying 60X1C0 workarounds to unknown rev\n"); - hp_flags |= MV_HP_ERRATA_60X1C0; - break; - } - break; - default: printk(KERN_ERR DRV_NAME ": BUG: invalid board index %u\n", board_idx); return 1; @@ -2255,8 +2052,7 @@ static int mv_init_host(struct pci_dev *pdev, struct ata_probe_ent *probe_ent, void __iomem *port_mmio = mv_port_base(mmio, port); u32 ifctl = readl(port_mmio + SATA_INTERFACE_CTL); - ifctl |= (1 << 7); /* enable gen2i speed */ - ifctl = (ifctl & 0xfff) | 0x9b1000; /* from chip spec */ + ifctl |= (1 << 12); writelfl(ifctl, port_mmio + SATA_INTERFACE_CTL); } @@ -2357,7 +2153,6 @@ static int mv_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) if (rc) { return rc; } - pci_set_master(pdev); rc = pci_request_regions(pdev, DRV_NAME); if (rc) { @@ -2395,7 +2190,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 = IRQF_SHARED; + probe_ent->irq_flags = SA_SHIRQ; 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 56da25581..7a3d63d29 100644 --- a/drivers/scsi/sata_nv.c +++ b/drivers/scsi/sata_nv.c @@ -29,8 +29,37 @@ * NV-specific details such as register offsets, SATA phy location, * hotplug info, etc. * + * 0.10 + * - Fixed spurious interrupts issue seen with the Maxtor 6H500F0 500GB + * drive. Also made the check_hotplug() callbacks return whether there + * was a hotplug interrupt or not. This was not the source of the + * spurious interrupts, but is the right thing to do anyway. + * + * 0.09 + * - Fixed bug introduced by 0.08's MCP51 and MCP55 support. + * + * 0.08 + * - Added support for MCP51 and MCP55. + * + * 0.07 + * - Added support for RAID class code. + * + * 0.06 + * - Added generic SATA support by using a pci_device_id that filters on + * the IDE storage class code. + * + * 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. + * + * 0.02 + * - Added support for CK804 SATA controller. + * + * 0.01 + * - Initial revision. */ +#include #include #include #include @@ -43,65 +72,74 @@ #include #define DRV_NAME "sata_nv" -#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, -}; +#define DRV_VERSION "0.8" + +#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 static int nv_init_one (struct pci_dev *pdev, const struct pci_device_id *ent); -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 irqreturn_t nv_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_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); +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 int 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 int nv_check_hotplug_ck804(struct ata_host_set *host_set); enum nv_host_type { GENERIC, NFORCE2, - NFORCE3 = NFORCE2, /* NF2 == NF3 as far as sata_nv is concerned */ + NFORCE3, CK804 }; @@ -147,6 +185,48 @@ static const struct pci_device_id nv_pci_tbl[] = { { 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); + int (*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, @@ -159,128 +239,62 @@ static struct scsi_host_template nv_sht = { .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, }; -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, - .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 = 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 = ata_pci_host_stop, -}; - -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 = { +static const struct ata_port_operations nv_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, - .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, + .eng_timeout = ata_eng_timeout, + .irq_handler = nv_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, + .host_stop = nv_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, - }, +/* 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, }; MODULE_AUTHOR("NVIDIA"); @@ -289,10 +303,11 @@ MODULE_LICENSE("GPL"); MODULE_DEVICE_TABLE(pci, nv_pci_tbl); MODULE_VERSION(DRV_VERSION); -static irqreturn_t nv_generic_interrupt(int irq, void *dev_instance, - struct pt_regs *regs) +static irqreturn_t nv_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; @@ -304,11 +319,11 @@ static irqreturn_t nv_generic_interrupt(int irq, void *dev_instance, ap = host_set->ports[i]; if (ap && - !(ap->flags & ATA_FLAG_DISABLED)) { + !(ap->flags & (ATA_FLAG_PORT_DISABLED | ATA_FLAG_NOINTR))) { struct ata_queued_cmd *qc; qc = ata_qc_from_tag(ap, ap->active_tag); - if (qc && (!(qc->tf.flags & ATA_TFLAG_POLLING))) + if (qc && (!(qc->tf.ctl & ATA_NIEN))) handled += ata_host_intr(ap, qc); else // No request pending? Clear interrupt status @@ -318,178 +333,66 @@ static irqreturn_t nv_generic_interrupt(int irq, void *dev_instance, } - spin_unlock_irqrestore(&host_set->lock, flags); - - return IRQ_RETVAL(handled); -} - -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; + if (host->host_desc->check_hotplug) + handled += host->host_desc->check_hotplug(host_set); - /* 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; - } + spin_unlock_irqrestore(&host_set->lock, flags); 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 = 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) { + struct ata_host_set *host_set = ap->host_set; + struct nv_host *host = host_set->private_data; + if (sc_reg > SCR_CONTROL) return 0xffffffffU; - return ioread32((void __iomem *)ap->ioaddr.scr_addr + (sc_reg * 4)); + if (host->host_flags & NV_HOST_FLAGS_SCR_MMIO) + return readl((void __iomem *)ap->ioaddr.scr_addr + (sc_reg * 4)); + else + return inl(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; - 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); + if (host->host_flags & NV_HOST_FLAGS_SCR_MMIO) + writel(val, (void __iomem *)ap->ioaddr.scr_addr + (sc_reg * 4)); + else + outl(val, ap->ioaddr.scr_addr + (sc_reg * 4)); } -static void nv_ck804_freeze(struct ata_port *ap) +static void nv_host_stop (struct ata_host_set *host_set) { - 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); -} + struct nv_host *host = host_set->private_data; + struct pci_dev *pdev = to_pci_dev(host_set->dev); -static int nv_hardreset(struct ata_port *ap, unsigned int *class) -{ - unsigned int dummy; + // Disable hotplug event interrupts. + if (host->host_desc->disable_hotplug) + host->host_desc->disable_hotplug(host_set); - /* 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); -} + kfree(host); -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); + if (host_set->mmio_base) + pci_iounmap(pdev, host_set->mmio_base); } 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, @@ -520,29 +423,44 @@ static int nv_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) rc = -ENOMEM; - ppi = &nv_port_info[ent->driver_data]; + ppi = &nv_port_info; probe_ent = ata_pci_init_native_mode(pdev, &ppi, ATA_PORT_PRIMARY | ATA_PORT_SECONDARY); if (!probe_ent) goto err_out_regions; - probe_ent->mmio_base = pci_iomap(pdev, 5, 0); - if (!probe_ent->mmio_base) { - rc = -EIO; + host = kmalloc(sizeof(struct nv_host), GFP_KERNEL); + if (!host) goto err_out_free_ent; - } - base = (unsigned long)probe_ent->mmio_base; + memset(host, 0, sizeof(struct nv_host)); + host->host_desc = &nv_device_tbl[ent->driver_data]; - 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->private_data = host; - /* enable SATA space for CK804 */ - if (ent->driver_data == CK804) { - u8 regval; + if (pci_resource_flags(pdev, 5) & IORESOURCE_MEM) + host->host_flags |= NV_HOST_FLAGS_SCR_MMIO; - 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); + if (host->host_flags & NV_HOST_FLAGS_SCR_MMIO) { + unsigned long base; + + probe_ent->mmio_base = pci_iomap(pdev, 5, 0); + if (probe_ent->mmio_base == NULL) { + rc = -EIO; + goto err_out_free_host; + } + + 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; + } else { + + 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_set_master(pdev); @@ -551,12 +469,19 @@ 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: - pci_iounmap(pdev, probe_ent->mmio_base); + if (host->host_flags & NV_HOST_FLAGS_SCR_MMIO) + pci_iounmap(pdev, probe_ent->mmio_base); +err_out_free_host: + kfree(host); err_out_free_ent: kfree(probe_ent); err_out_regions: @@ -568,17 +493,127 @@ err_out: return rc; } -static void nv_ck804_host_stop(struct ata_host_set *host_set) +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 int 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"); + + return 1; + } + + return 0; +} + +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) { struct pci_dev *pdev = to_pci_dev(host_set->dev); + u8 intr_mask; u8 regval; - /* disable SATA space for CK804 */ + 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); + 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); +} - ata_pci_host_stop(host_set); +static int 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"); + + return 1; + } + + return 0; } static int __init nv_init(void) diff --git a/drivers/scsi/sata_promise.c b/drivers/scsi/sata_promise.c index 25da6260e..07172fc3b 100644 --- a/drivers/scsi/sata_promise.c +++ b/drivers/scsi/sata_promise.c @@ -46,7 +46,7 @@ #include "sata_promise.h" #define DRV_NAME "sata_promise" -#define DRV_VERSION "1.04" +#define DRV_VERSION "1.03" enum { @@ -58,7 +58,6 @@ enum { PDC_GLOBAL_CTL = 0x48, /* Global control/status (per port) */ PDC_CTLSTAT = 0x60, /* IDE control and status (per port) */ PDC_SATA_PLUG_CSR = 0x6C, /* SATA Plug control/status reg */ - PDC2_SATA_PLUG_CSR = 0x60, /* SATAII Plug control/status reg */ PDC_SLEW_CTL = 0x470, /* slew rate control reg */ PDC_ERR_MASK = (1<<19) | (1<<20) | (1<<21) | (1<<22) | @@ -68,16 +67,13 @@ enum { board_20319 = 1, /* FastTrak S150 TX4 */ board_20619 = 2, /* FastTrak TX4000 */ board_20771 = 3, /* FastTrak TX2300 */ - board_2057x = 4, /* SATAII150 Tx2plus */ - board_40518 = 5, /* SATAII150 Tx4 */ - PDC_HAS_PATA = (1 << 1), /* PDC20375/20575 has PATA */ + PDC_HAS_PATA = (1 << 1), /* PDC20375 has PATA */ PDC_RESET = (1 << 11), /* HDMA reset */ PDC_COMMON_FLAGS = ATA_FLAG_NO_LEGACY | ATA_FLAG_SRST | - ATA_FLAG_MMIO | ATA_FLAG_NO_ATAPI | - ATA_FLAG_PIO_POLLING, + ATA_FLAG_MMIO | ATA_FLAG_NO_ATAPI, }; @@ -86,10 +82,6 @@ struct pdc_port_priv { dma_addr_t pkt_dma; }; -struct pdc_host_priv { - int hotplug_offset; -}; - static u32 pdc_sata_scr_read (struct ata_port *ap, unsigned int sc_reg); static void pdc_sata_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val); static int pdc_ata_init_one (struct pci_dev *pdev, const struct pci_device_id *ent); @@ -103,8 +95,7 @@ static void pdc_qc_prep(struct ata_queued_cmd *qc); 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 pdc_irq_clear(struct ata_port *ap); -static unsigned int pdc_qc_issue_prot(struct ata_queued_cmd *qc); -static void pdc_host_stop(struct ata_host_set *host_set); +static int pdc_qc_issue_prot(struct ata_queued_cmd *qc); static struct scsi_host_template pdc_ata_sht = { @@ -112,16 +103,17 @@ static struct scsi_host_template pdc_ata_sht = { .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, }; @@ -138,7 +130,6 @@ 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, @@ -146,7 +137,7 @@ static const struct ata_port_operations pdc_sata_ops = { .scr_write = pdc_sata_scr_write, .port_start = pdc_port_start, .port_stop = pdc_port_stop, - .host_stop = pdc_host_stop, + .host_stop = ata_pci_host_stop, }; static const struct ata_port_operations pdc_pata_ops = { @@ -161,21 +152,20 @@ 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, .port_start = pdc_port_start, .port_stop = pdc_port_stop, - .host_stop = pdc_host_stop, + .host_stop = ata_pci_host_stop, }; static const struct ata_port_info pdc_port_info[] = { /* board_2037x */ { .sht = &pdc_ata_sht, - .host_flags = PDC_COMMON_FLAGS /* | ATA_FLAG_SATA */, /* pata fix */ + .host_flags = PDC_COMMON_FLAGS | ATA_FLAG_SATA, .pio_mask = 0x1f, /* pio0-4 */ .mwdma_mask = 0x07, /* mwdma0-2 */ .udma_mask = 0x7f, /* udma0-6 ; FIXME */ @@ -211,26 +201,6 @@ static const struct ata_port_info pdc_port_info[] = { .udma_mask = 0x7f, /* udma0-6 ; FIXME */ .port_ops = &pdc_sata_ops, }, - - /* board_2057x */ - { - .sht = &pdc_ata_sht, - .host_flags = PDC_COMMON_FLAGS | ATA_FLAG_SATA, - .pio_mask = 0x1f, /* pio0-4 */ - .mwdma_mask = 0x07, /* mwdma0-2 */ - .udma_mask = 0x7f, /* udma0-6 ; FIXME */ - .port_ops = &pdc_sata_ops, - }, - - /* board_40518 */ - { - .sht = &pdc_ata_sht, - .host_flags = PDC_COMMON_FLAGS | ATA_FLAG_SATA, - .pio_mask = 0x1f, /* pio0-4 */ - .mwdma_mask = 0x07, /* mwdma0-2 */ - .udma_mask = 0x7f, /* udma0-6 ; FIXME */ - .port_ops = &pdc_sata_ops, - }, }; static const struct pci_device_id pdc_ata_pci_tbl[] = { @@ -247,9 +217,9 @@ static const struct pci_device_id pdc_ata_pci_tbl[] = { { PCI_VENDOR_ID_PROMISE, 0x3376, PCI_ANY_ID, PCI_ANY_ID, 0, 0, board_2037x }, { PCI_VENDOR_ID_PROMISE, 0x3574, PCI_ANY_ID, PCI_ANY_ID, 0, 0, - board_2057x }, + board_2037x }, { PCI_VENDOR_ID_PROMISE, 0x3d75, PCI_ANY_ID, PCI_ANY_ID, 0, 0, - board_2057x }, + board_2037x }, { PCI_VENDOR_ID_PROMISE, 0x3d73, PCI_ANY_ID, PCI_ANY_ID, 0, 0, board_2037x }, @@ -264,20 +234,13 @@ static const struct pci_device_id pdc_ata_pci_tbl[] = { { PCI_VENDOR_ID_PROMISE, 0x3d17, PCI_ANY_ID, PCI_ANY_ID, 0, 0, board_20319 }, { PCI_VENDOR_ID_PROMISE, 0x3d18, PCI_ANY_ID, PCI_ANY_ID, 0, 0, - board_40518 }, + board_20319 }, { 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 */ }; @@ -300,11 +263,12 @@ static int pdc_port_start(struct ata_port *ap) if (rc) return rc; - pp = kzalloc(sizeof(*pp), GFP_KERNEL); + pp = kmalloc(sizeof(*pp), GFP_KERNEL); if (!pp) { rc = -ENOMEM; goto err_out; } + memset(pp, 0, sizeof(*pp)); pp->pkt = dma_alloc_coherent(dev, 128, &pp->pkt_dma, GFP_KERNEL); if (!pp->pkt) { @@ -336,16 +300,6 @@ static void pdc_port_stop(struct ata_port *ap) } -static void pdc_host_stop(struct ata_host_set *host_set) -{ - struct pdc_host_priv *hp = host_set->private_data; - - ata_pci_host_stop(host_set); - - kfree(hp); -} - - static void pdc_reset_port(struct ata_port *ap) { void __iomem *mmio = (void __iomem *) ap->ioaddr.cmd_addr + PDC_CTLSTAT; @@ -370,41 +324,16 @@ 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 */ -} - -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; + pdc_reset_port(ap); + sata_phy_reset(ap); } static void pdc_pata_phy_reset(struct ata_port *ap) { - 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 */ + /* FIXME: add cable detect. Don't assume 40-pin cable */ + ap->cbl = ATA_CBL_PATA40; + ap->udma_mask &= ATA_UDMA_MASK_40C; - pdc_pata_cbl_detect(ap); pdc_reset_port(ap); ata_port_probe(ap); ata_bus_reset(ap); @@ -412,7 +341,7 @@ static void pdc_pata_phy_reset(struct ata_port *ap) static u32 pdc_sata_scr_read (struct ata_port *ap, unsigned int sc_reg) { - if ((sc_reg > SCR_CONTROL) || (ap->flags & ATA_FLAG_SLAVE_POSS)) + if (sc_reg > SCR_CONTROL) return 0xffffffffU; return readl((void __iomem *) ap->ioaddr.scr_addr + (sc_reg * 4)); } @@ -421,7 +350,7 @@ static u32 pdc_sata_scr_read (struct ata_port *ap, unsigned int sc_reg) static void pdc_sata_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val) { - if ((sc_reg > SCR_CONTROL) || (ap->flags & ATA_FLAG_SLAVE_POSS)) + if (sc_reg > SCR_CONTROL) return; writel(val, (void __iomem *) ap->ioaddr.scr_addr + (sc_reg * 4)); } @@ -467,28 +396,42 @@ static void pdc_eng_timeout(struct ata_port *ap) spin_lock_irqsave(&host_set->lock, flags); 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; + } + + /* 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; switch (qc->tf.protocol) { case ATA_PROT_DMA: case ATA_PROT_NODATA: - ata_port_printk(ap, KERN_ERR, "command timeout\n"); + printk(KERN_ERR "ata%u: command timeout\n", ap->id); drv_stat = ata_wait_idle(ap); qc->err_mask |= __ac_err_mask(drv_stat); + ata_qc_complete(qc); break; default: drv_stat = ata_busy_wait(ap, ATA_BUSY | ATA_DRQ, 1000); - ata_port_printk(ap, KERN_ERR, - "unknown timeout, cmd 0x%x stat 0x%x\n", - qc->tf.command, drv_stat); + printk(KERN_ERR "ata%u: unknown timeout, cmd 0x%x stat 0x%x\n", + ap->id, qc->tf.command, drv_stat); qc->err_mask |= ac_err_mask(drv_stat); + ata_qc_complete(qc); break; } +out: spin_unlock_irqrestore(&host_set->lock, flags); - ata_eh_qc_complete(qc); DPRINTK("EXIT\n"); } @@ -554,15 +497,14 @@ static irqreturn_t pdc_interrupt (int irq, void *dev_instance, struct pt_regs *r VPRINTK("QUICK EXIT 2\n"); return IRQ_NONE; } - - spin_lock(&host_set->lock); - mask &= 0xffff; /* only 16 tags possible */ if (!mask) { VPRINTK("QUICK EXIT 3\n"); - goto done_irq; + return IRQ_NONE; } + spin_lock(&host_set->lock); + writel(mask, mmio_base + PDC_INT_SEQMASK); for (i = 0; i < host_set->n_ports; i++) { @@ -570,19 +512,19 @@ 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_DISABLED)) { + !(ap->flags & (ATA_FLAG_PORT_DISABLED | ATA_FLAG_NOINTR))) { struct ata_queued_cmd *qc; qc = ata_qc_from_tag(ap, ap->active_tag); - if (qc && (!(qc->tf.flags & ATA_TFLAG_POLLING))) + if (qc && (!(qc->tf.ctl & ATA_NIEN))) handled += pdc_host_intr(ap, qc); } } + spin_unlock(&host_set->lock); + VPRINTK("EXIT\n"); -done_irq: - spin_unlock(&host_set->lock); return IRQ_RETVAL(handled); } @@ -604,7 +546,7 @@ static inline void pdc_packet_start(struct ata_queued_cmd *qc) readl((void __iomem *) ap->ioaddr.cmd_addr + PDC_PKT_SUBMIT); /* flush */ } -static unsigned int pdc_qc_issue_prot(struct ata_queued_cmd *qc) +static int pdc_qc_issue_prot(struct ata_queued_cmd *qc) { switch (qc->tf.protocol) { case ATA_PROT_DMA: @@ -660,8 +602,6 @@ static void pdc_ata_setup_port(struct ata_ioports *port, unsigned long base) static void pdc_host_init(unsigned int chip_id, struct ata_probe_ent *pe) { void __iomem *mmio = pe->mmio_base; - struct pdc_host_priv *hp = pe->private_data; - int hotplug_offset = hp->hotplug_offset; u32 tmp; /* @@ -676,12 +616,12 @@ static void pdc_host_init(unsigned int chip_id, struct ata_probe_ent *pe) writel(tmp, mmio + PDC_FLASH_CTL); /* clear plug/unplug flags for all ports */ - tmp = readl(mmio + hotplug_offset); - writel(tmp | 0xff, mmio + hotplug_offset); + tmp = readl(mmio + PDC_SATA_PLUG_CSR); + writel(tmp | 0xff, mmio + PDC_SATA_PLUG_CSR); /* mask plug/unplug ints */ - tmp = readl(mmio + hotplug_offset); - writel(tmp | 0xff0000, mmio + hotplug_offset); + tmp = readl(mmio + PDC_SATA_PLUG_CSR); + writel(tmp | 0xff0000, mmio + PDC_SATA_PLUG_CSR); /* reduce TBG clock to 133 Mhz. */ tmp = readl(mmio + PDC_TBG_MODE); @@ -703,17 +643,19 @@ static int pdc_ata_init_one (struct pci_dev *pdev, const struct pci_device_id *e { static int printed_version; struct ata_probe_ent *probe_ent = NULL; - struct pdc_host_priv *hp; unsigned long base; void __iomem *mmio_base; unsigned int board_idx = (unsigned int) ent->driver_data; int pci_dev_busy = 0; int rc; - u8 tmp; /* pata fix */ 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; @@ -731,12 +673,13 @@ static int pdc_ata_init_one (struct pci_dev *pdev, const struct pci_device_id *e if (rc) goto err_out_regions; - probe_ent = kzalloc(sizeof(*probe_ent), GFP_KERNEL); + probe_ent = kmalloc(sizeof(*probe_ent), GFP_KERNEL); if (probe_ent == NULL) { rc = -ENOMEM; goto err_out_regions; } + memset(probe_ent, 0, sizeof(*probe_ent)); probe_ent->dev = pci_dev_to_dev(pdev); INIT_LIST_HEAD(&probe_ent->node); @@ -747,16 +690,6 @@ static int pdc_ata_init_one (struct pci_dev *pdev, const struct pci_device_id *e } base = (unsigned long) mmio_base; - hp = kzalloc(sizeof(*hp), GFP_KERNEL); - if (hp == NULL) { - rc = -ENOMEM; - goto err_out_free_ent; - } - - /* Set default hotplug offset */ - hp->hotplug_offset = PDC_SATA_PLUG_CSR; - probe_ent->private_data = hp; - probe_ent->sht = pdc_port_info[board_idx].sht; probe_ent->host_flags = pdc_port_info[board_idx].host_flags; probe_ent->pio_mask = pdc_port_info[board_idx].pio_mask; @@ -765,7 +698,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 = IRQF_SHARED; + probe_ent->irq_flags = SA_SHIRQ; probe_ent->mmio_base = mmio_base; pdc_ata_setup_port(&probe_ent->port[0], base + 0x200); @@ -774,15 +707,8 @@ static int pdc_ata_init_one (struct pci_dev *pdev, const struct pci_device_id *e probe_ent->port[0].scr_addr = base + 0x400; probe_ent->port[1].scr_addr = base + 0x500; - probe_ent->port_flags[0] = ATA_FLAG_SATA; /* pata fix */ - probe_ent->port_flags[1] = ATA_FLAG_SATA; /* pata fix */ - /* notice 4-port boards */ switch (board_idx) { - case board_40518: - /* Override hotplug offset for SATAII150 */ - hp->hotplug_offset = PDC2_SATA_PLUG_CSR; - /* Fall through */ case board_20319: probe_ent->n_ports = 4; @@ -791,27 +717,9 @@ static int pdc_ata_init_one (struct pci_dev *pdev, const struct pci_device_id *e probe_ent->port[2].scr_addr = base + 0x600; probe_ent->port[3].scr_addr = base + 0x700; - - probe_ent->port_flags[2] = ATA_FLAG_SATA; /* pata fix */ - probe_ent->port_flags[3] = ATA_FLAG_SATA; /* pata fix */ break; - case board_2057x: - /* Override hotplug offset for SATAII150 */ - hp->hotplug_offset = PDC2_SATA_PLUG_CSR; - /* Fall through */ case board_2037x: -/* probe_ent->n_ports = 2; */ /* pata fix */ - /* Some boards have also PATA port */ /* pata fix */ - tmp = readb(mmio_base + PDC_FLASH_CTL+1); /* pata fix */ - if (!(tmp & 0x80)) /* pata fix */ - { /* pata fix */ - probe_ent->n_ports = 3; /* pata fix */ - pdc_ata_setup_port(&probe_ent->port[2], base + 0x300); /* pata fix */ - probe_ent->port_flags[2] = ATA_FLAG_SLAVE_POSS; /* pata fix */ - printk(KERN_INFO DRV_NAME " PATA port found\n"); /* pata fix */ - } /* pata fix */ - else /* pata fix */ - probe_ent->n_ports = 2; /* pata fix */ + probe_ent->n_ports = 2; break; case board_20771: probe_ent->n_ports = 2; @@ -824,9 +732,6 @@ static int pdc_ata_init_one (struct pci_dev *pdev, const struct pci_device_id *e probe_ent->port[2].scr_addr = base + 0x600; probe_ent->port[3].scr_addr = base + 0x700; - - probe_ent->port_flags[2] = ATA_FLAG_SATA; /* pata fix */ - probe_ent->port_flags[3] = ATA_FLAG_SATA; /* pata fix */ break; default: BUG(); @@ -838,10 +743,8 @@ static int pdc_ata_init_one (struct pci_dev *pdev, const struct pci_device_id *e /* initialize adapter */ pdc_host_init(board_idx, probe_ent); - /* FIXME: Need any other frees than hp? */ - if (!ata_device_add(probe_ent)) - kfree(hp); - + /* FIXME: check ata_device_add return value */ + ata_device_add(probe_ent); kfree(probe_ent); return 0; diff --git a/drivers/scsi/sata_qstor.c b/drivers/scsi/sata_qstor.c index d374c1db0..80480f0fb 100644 --- a/drivers/scsi/sata_qstor.c +++ b/drivers/scsi/sata_qstor.c @@ -41,7 +41,7 @@ #include #define DRV_NAME "sata_qstor" -#define DRV_VERSION "0.06" +#define DRV_VERSION "0.05" enum { QS_PORTS = 4, @@ -120,7 +120,7 @@ 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 unsigned int qs_qc_issue(struct ata_queued_cmd *qc); +static 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_queued_cmd *qc); static u8 qs_bmdma_status(struct ata_port *ap); @@ -132,9 +132,11 @@ static struct scsi_host_template qs_ata_sht = { .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, @@ -142,7 +144,6 @@ static struct 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, }; @@ -157,7 +158,6 @@ static const 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, @@ -177,7 +177,7 @@ static const struct ata_port_info qs_port_info[] = { .host_flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY | ATA_FLAG_SATA_RESET | //FIXME ATA_FLAG_SRST | - ATA_FLAG_MMIO | ATA_FLAG_PIO_POLLING, + ATA_FLAG_MMIO, .pio_mask = 0x10, /* pio4 */ .udma_mask = 0x7f, /* udma0-6 */ .port_ops = &qs_ata_ops, @@ -276,8 +276,8 @@ static unsigned int qs_fill_sg(struct ata_queued_cmd *qc) unsigned int nelem; u8 *prd = pp->pkt + QS_CPB_BYTES; - WARN_ON(qc->__sg == NULL); - WARN_ON(qc->n_elem == 0 && qc->pad_len == 0); + assert(qc->__sg != NULL); + assert(qc->n_elem > 0 || qc->pad_len > 0); nelem = 0; ata_for_each_sg(sg, qc) { @@ -352,7 +352,7 @@ static inline void qs_packet_start(struct ata_queued_cmd *qc) readl(chan + QS_CCT_CFF); /* flush */ } -static unsigned int qs_qc_issue(struct ata_queued_cmd *qc) +static int qs_qc_issue(struct ata_queued_cmd *qc) { struct qs_port_priv *pp = qc->ap->private_data; @@ -396,13 +396,14 @@ 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_DISABLED)) { + if (ap && !(ap->flags & + (ATA_FLAG_PORT_DISABLED|ATA_FLAG_NOINTR))) { 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.flags & ATA_TFLAG_POLLING))) { + if (qc && (!(qc->tf.ctl & ATA_NIEN))) { switch (sHST) { case 0: /* successful CPB */ case 3: /* device error */ @@ -429,13 +430,13 @@ static inline unsigned int qs_intr_mmio(struct ata_host_set *host_set) struct ata_port *ap; ap = host_set->ports[port_no]; if (ap && - !(ap->flags & ATA_FLAG_DISABLED)) { + !(ap->flags & (ATA_FLAG_PORT_DISABLED | ATA_FLAG_NOINTR))) { 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.flags & ATA_TFLAG_POLLING))) { + if (qc && (!(qc->tf.ctl & ATA_NIEN))) { /* check main status, clearing INTRQ */ u8 status = ata_check_status(ap); @@ -680,7 +681,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 = IRQF_SHARED; + probe_ent->irq_flags = SA_SHIRQ; probe_ent->mmio_base = mmio_base; probe_ent->n_ports = QS_PORTS; diff --git a/drivers/scsi/sata_sil.c b/drivers/scsi/sata_sil.c index d0a85073e..9face3c6a 100644 --- a/drivers/scsi/sata_sil.c +++ b/drivers/scsi/sata_sil.c @@ -46,36 +46,27 @@ #include #define DRV_NAME "sata_sil" -#define DRV_VERSION "2.0" +#define DRV_VERSION "0.9" 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_HRST_TO_RESUME, - - /* - * Controller IDs - */ sil_3112 = 0, - sil_3112_no_sata_irq = 1, + sil_3112_m15w = 1, sil_3512 = 2, sil_3114 = 3, - /* - * Register offsets - */ - SIL_SYSCFG = 0x48, + SIL_FIFO_R0 = 0x40, + SIL_FIFO_W0 = 0x41, + SIL_FIFO_R1 = 0x44, + SIL_FIFO_W1 = 0x45, + SIL_FIFO_R2 = 0x240, + SIL_FIFO_W2 = 0x241, + SIL_FIFO_R3 = 0x244, + SIL_FIFO_W3 = 0x245, - /* - * Register bits - */ - /* SYSCFG */ + SIL_SYSCFG = 0x48, SIL_MASK_IDE0_INT = (1 << 22), SIL_MASK_IDE1_INT = (1 << 23), SIL_MASK_IDE2_INT = (1 << 24), @@ -84,50 +75,28 @@ enum { SIL_MASK_4PORT = SIL_MASK_2PORT | SIL_MASK_IDE2_INT | SIL_MASK_IDE3_INT, - /* 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 */ + SIL_IDE2_BMDMA = 0x200, - /* SIEN */ - SIL_SIEN_N = (1 << 16), /* triggered by SError.N */ - - /* - * Others - */ + SIL_INTR_STEERING = (1 << 1), SIL_QUIRK_MOD15WRITE = (1 << 0), SIL_QUIRK_UDMA5MAX = (1 << 1), }; 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[] = { - { 0x1095, 0x3112, PCI_ANY_ID, PCI_ANY_ID, 0, 0, sil_3112 }, - { 0x1095, 0x0240, PCI_ANY_ID, PCI_ANY_ID, 0, 0, sil_3112 }, + { 0x1095, 0x3112, PCI_ANY_ID, PCI_ANY_ID, 0, 0, sil_3112_m15w }, + { 0x1095, 0x0240, PCI_ANY_ID, PCI_ANY_ID, 0, 0, sil_3112_m15w }, { 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_no_sata_irq }, - { 0x1002, 0x437a, PCI_ANY_ID, PCI_ANY_ID, 0, 0, sil_3112_no_sata_irq }, + { 0x1002, 0x436e, PCI_ANY_ID, PCI_ANY_ID, 0, 0, sil_3112_m15w }, + { 0x1002, 0x4379, PCI_ANY_ID, PCI_ANY_ID, 0, 0, sil_3112_m15w }, + { 0x1002, 0x437a, PCI_ANY_ID, PCI_ANY_ID, 0, 0, sil_3112_m15w }, { } /* terminate list */ }; @@ -161,8 +130,6 @@ 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 = { @@ -170,19 +137,18 @@ static struct scsi_host_template sil_sht = { .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, - .suspend = ata_scsi_device_suspend, - .resume = ata_scsi_device_resume, }; static const struct ata_port_operations sil_ops = { @@ -193,6 +159,7 @@ static const struct ata_port_operations sil_ops = { .check_status = ata_check_status, .exec_command = ata_exec_command, .dev_select = ata_std_dev_select, + .phy_reset = sata_phy_reset, .post_set_mode = sil_post_set_mode, .bmdma_setup = ata_bmdma_setup, .bmdma_start = ata_bmdma_start, @@ -200,12 +167,8 @@ static const struct ata_port_operations sil_ops = { .bmdma_status = ata_bmdma_status, .qc_prep = ata_qc_prep, .qc_issue = ata_qc_issue_prot, - .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, + .eng_timeout = ata_eng_timeout, + .irq_handler = ata_interrupt, .irq_clear = ata_bmdma_irq_clear, .scr_read = sil_scr_read, .scr_write = sil_scr_write, @@ -218,17 +181,19 @@ static const struct ata_port_info sil_port_info[] = { /* sil_3112 */ { .sht = &sil_sht, - .host_flags = SIL_DFL_HOST_FLAGS | SIL_FLAG_MOD15WRITE, + .host_flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY | + ATA_FLAG_SRST | ATA_FLAG_MMIO, .pio_mask = 0x1f, /* pio0-4 */ .mwdma_mask = 0x07, /* mwdma0-2 */ .udma_mask = 0x3f, /* udma0-5 */ .port_ops = &sil_ops, }, - /* sil_3112_no_sata_irq */ + /* sil_3112_15w - keep it sync'd w/ sil_3112 */ { .sht = &sil_sht, - .host_flags = SIL_DFL_HOST_FLAGS | SIL_FLAG_MOD15WRITE | - SIL_FLAG_NO_SATA_IRQ, + .host_flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY | + ATA_FLAG_SRST | ATA_FLAG_MMIO | + SIL_FLAG_MOD15WRITE, .pio_mask = 0x1f, /* pio0-4 */ .mwdma_mask = 0x07, /* mwdma0-2 */ .udma_mask = 0x3f, /* udma0-5 */ @@ -237,7 +202,9 @@ static const struct ata_port_info sil_port_info[] = { /* sil_3512 */ { .sht = &sil_sht, - .host_flags = SIL_DFL_HOST_FLAGS | SIL_FLAG_RERR_ON_DMA_ACT, + .host_flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY | + ATA_FLAG_SRST | ATA_FLAG_MMIO | + SIL_FLAG_RERR_ON_DMA_ACT, .pio_mask = 0x1f, /* pio0-4 */ .mwdma_mask = 0x07, /* mwdma0-2 */ .udma_mask = 0x3f, /* udma0-5 */ @@ -246,7 +213,9 @@ static const struct ata_port_info sil_port_info[] = { /* sil_3114 */ { .sht = &sil_sht, - .host_flags = SIL_DFL_HOST_FLAGS | SIL_FLAG_RERR_ON_DMA_ACT, + .host_flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY | + ATA_FLAG_SRST | ATA_FLAG_MMIO | + SIL_FLAG_RERR_ON_DMA_ACT, .pio_mask = 0x1f, /* pio0-4 */ .mwdma_mask = 0x07, /* mwdma0-2 */ .udma_mask = 0x3f, /* udma0-5 */ @@ -260,18 +229,16 @@ 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 */ unsigned long xfer_mode;/* data transfer mode register */ unsigned long sfis_cfg; /* SATA FIS reception config register */ } sil_port[] = { /* port 0 ... */ - { 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 }, + { 0x80, 0x8A, 0x00, 0x100, 0x148, 0xb4, 0x14c }, + { 0xC0, 0xCA, 0x08, 0x180, 0x1c8, 0xf4, 0x1cc }, + { 0x280, 0x28A, 0x200, 0x300, 0x348, 0x2b4, 0x34c }, + { 0x2C0, 0x2CA, 0x208, 0x380, 0x3c8, 0x2f4, 0x3cc }, /* ... port 3 */ }; @@ -304,7 +271,7 @@ static void sil_post_set_mode (struct ata_port *ap) for (i = 0; i < 2; i++) { dev = &ap->device[i]; - if (!ata_dev_enabled(dev)) + if (!ata_dev_present(dev)) dev_mode[i] = 0; /* PIO0/1/2 */ else if (dev->flags & ATA_DFLAG_PIO) dev_mode[i] = 1; /* PIO3/4 */ @@ -355,156 +322,6 @@ 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 @@ -537,12 +354,22 @@ static void sil_thaw(struct ata_port *ap) static void sil_dev_config(struct ata_port *ap, struct ata_device *dev) { unsigned int n, quirks = 0; - unsigned char model_num[41]; + unsigned char model_num[40]; + const char *s; + unsigned int len; - ata_id_c_string(dev->id, model_num, ATA_ID_PROD_OFS, sizeof(model_num)); + ata_dev_id_string(dev->id, model_num, ATA_ID_PROD_OFS, + sizeof(model_num)); + s = &model_num[0]; + len = strnlen(s, sizeof(model_num)); + + /* ATAPI specifies that empty space is blank-filled; remove blanks */ + while ((len > 0) && (s[len - 1] == ' ')) + len--; for (n = 0; sil_blacklist[n].product; n++) - if (!strcmp(sil_blacklist[n].product, model_num)) { + if (!memcmp(sil_blacklist[n].product, s, + strlen(sil_blacklist[n].product))) { quirks = sil_blacklist[n].quirk; break; } @@ -551,67 +378,23 @@ 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))) { - ata_dev_printk(dev, KERN_INFO, "applying Seagate errata fix " - "(mod15write workaround)\n"); - dev->max_sectors = 15; + printk(KERN_INFO "ata%u(%u): applying Seagate errata fix (mod15write workaround)\n", + ap->id, dev->devno); + ap->host->max_sectors = 15; + ap->host->hostt->max_sectors = 15; + dev->flags |= ATA_DFLAG_LOCK_SECTORS; return; } /* limit to udma5 */ if (quirks & SIL_QUIRK_UDMA5MAX) { - ata_dev_printk(dev, KERN_INFO, - "applying Maxtor errata fix %s\n", model_num); - dev->udma_mask &= ATA_UDMA5; + printk(KERN_INFO "ata%u(%u): applying Maxtor errata fix %s\n", + ap->id, dev->devno, s); + ap->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; @@ -621,10 +404,16 @@ 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; @@ -642,12 +431,13 @@ static int sil_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) if (rc) goto err_out_regions; - probe_ent = kzalloc(sizeof(*probe_ent), GFP_KERNEL); + probe_ent = kmalloc(sizeof(*probe_ent), GFP_KERNEL); if (probe_ent == NULL) { rc = -ENOMEM; goto err_out_regions; } + memset(probe_ent, 0, sizeof(*probe_ent)); INIT_LIST_HEAD(&probe_ent->node); probe_ent->dev = pci_dev_to_dev(pdev); probe_ent->port_ops = sil_port_info[ent->driver_data].port_ops; @@ -657,7 +447,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 = IRQF_SHARED; + probe_ent->irq_flags = SA_SHIRQ; probe_ent->host_flags = sil_port_info[ent->driver_data].host_flags; mmio_base = pci_iomap(pdev, 5, 0); @@ -679,8 +469,67 @@ static int sil_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) ata_std_ports(&probe_ent->port[i]); } - sil_init_controller(pdev, probe_ent->n_ports, probe_ent->host_flags, - mmio_base); + /* Initialize FIFO PCI bus arbitration */ + cls = sil_get_device_cache_line(pdev); + if (cls) { + cls >>= 3; + cls++; /* cls = (line_size/8)+1 */ + writeb(cls, mmio_base + SIL_FIFO_R0); + writeb(cls, mmio_base + SIL_FIFO_W0); + writeb(cls, mmio_base + SIL_FIFO_R1); + writeb(cls, mmio_base + SIL_FIFO_W1); + if (ent->driver_data == sil_3114) { + writeb(cls, mmio_base + SIL_FIFO_R2); + writeb(cls, mmio_base + SIL_FIFO_W2); + writeb(cls, mmio_base + SIL_FIFO_R3); + writeb(cls, mmio_base + SIL_FIFO_W3); + } + } else + 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_IDE2_BMDMA); + if ((tmp & SIL_INTR_STEERING) == 0) + writel(tmp | SIL_INTR_STEERING, + mmio_base + SIL_IDE2_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); pci_set_master(pdev); @@ -700,18 +549,6 @@ 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 3f368c7d3..e256bbbf9 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.3" +#define DRV_VERSION "0.23" /* * Port request block (PRB) 32 bytes */ struct sil24_prb { - __le16 ctrl; - __le16 prot; - __le32 rx_cnt; + u16 ctrl; + u16 prot; + u32 rx_cnt; u8 fis[6 * 4]; }; @@ -47,17 +47,17 @@ struct sil24_prb { * Scatter gather entry (SGE) 16 bytes */ struct sil24_sge { - __le64 addr; - __le32 cnt; - __le32 flags; + u64 addr; + u32 cnt; + u32 flags; }; /* * Port multiplier */ struct sil24_port_multiplier { - __le32 diag; - __le32 sactive; + u32 diag; + u32 sactive; }; enum { @@ -86,22 +86,12 @@ 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_LRAM = 0x0000, /* 31 LRAM slots and PM regs */ - PORT_LRAM_SLOT_SZ = 0x0080, /* 32 bytes PRB + 2 SGE, ACT... */ + PORT_PRB = 0x0000, /* (32 bytes PRB + 16 bytes SGEs * 6) * 31 (3968 bytes) */ PORT_PM = 0x0f80, /* 8 bytes PM * 16 (128 bytes) */ /* 32 bit regs */ @@ -152,16 +142,8 @@ 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_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, + PORT_IRQ_UNK_FIS = (1 << 6), /* Unknown FIS received */ + PORT_IRQ_SDB_FIS = (1 << 11), /* SDB FIS received */ /* bits[27:16] are unmasked (raw) */ PORT_IRQ_RAW_SHIFT = 16, @@ -192,7 +174,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_MSTABRT = 34, /* PSD ecode 10 - master abort */ + PORT_CERR_XFR_MSGABRT = 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 */ @@ -220,19 +202,11 @@ 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, }; @@ -252,58 +226,6 @@ 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 * @@ -327,19 +249,16 @@ 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 void sil24_phy_reset(struct ata_port *ap); static void sil24_qc_prep(struct ata_queued_cmd *qc); -static unsigned int sil24_qc_issue(struct ata_queued_cmd *qc); +static 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 }, @@ -355,8 +274,6 @@ 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 = { @@ -364,20 +281,18 @@ static struct scsi_host_template sil24_sht = { .name = DRV_NAME, .ioctl = ata_scsi_ioctl, .queuecommand = ata_scsi_queuecmd, - .change_queue_depth = ata_scsi_change_queue_depth, - .can_queue = SIL24_MAX_CMDS, + .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, - .suspend = ata_scsi_device_suspend, - .resume = ata_scsi_device_resume, }; static const struct ata_port_operations sil24_ops = { @@ -391,20 +306,19 @@ static const struct ata_port_operations sil24_ops = { .tf_read = sil24_tf_read, + .phy_reset = sil24_phy_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, @@ -421,17 +335,20 @@ static struct ata_port_info sil24_port_info[] = { /* sil_3124 */ { .sht = &sil24_sht, - .host_flags = SIL24_COMMON_FLAGS | SIL24_NPORTS2FLAG(4) | - SIL24_FLAG_PCIX_IRQ_WOC, + .host_flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY | + ATA_FLAG_SRST | ATA_FLAG_MMIO | + ATA_FLAG_PIO_DMA | SIL24_NPORTS2FLAG(4), .pio_mask = 0x1f, /* pio0-4 */ .mwdma_mask = 0x07, /* mwdma0-2 */ .udma_mask = 0x3f, /* udma0-5 */ .port_ops = &sil24_ops, }, - /* sil_3132 */ + /* sil_3132 */ { .sht = &sil24_sht, - .host_flags = SIL24_COMMON_FLAGS | SIL24_NPORTS2FLAG(2), + .host_flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY | + ATA_FLAG_SRST | ATA_FLAG_MMIO | + ATA_FLAG_PIO_DMA | SIL24_NPORTS2FLAG(2), .pio_mask = 0x1f, /* pio0-4 */ .mwdma_mask = 0x07, /* mwdma0-2 */ .udma_mask = 0x3f, /* udma0-5 */ @@ -440,7 +357,9 @@ static struct ata_port_info sil24_port_info[] = { /* sil_3131/sil_3531 */ { .sht = &sil24_sht, - .host_flags = SIL24_COMMON_FLAGS | SIL24_NPORTS2FLAG(1), + .host_flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY | + ATA_FLAG_SRST | ATA_FLAG_MMIO | + ATA_FLAG_PIO_DMA | SIL24_NPORTS2FLAG(1), .pio_mask = 0x1f, /* pio0-4 */ .mwdma_mask = 0x07, /* mwdma0-2 */ .udma_mask = 0x3f, /* udma0-5 */ @@ -448,18 +367,11 @@ 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; - if (dev->cdb_len == 16) + if (ap->cdb_len == 16) writel(PORT_CS_CDB16, port + PORT_CTRL_STAT); else writel(PORT_CS_CDB16, port + PORT_CTRL_CLR); @@ -516,127 +428,68 @@ static void sil24_tf_read(struct ata_port *ap, struct ata_taskfile *tf) *tf = pp->tf; } -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) +static int sil24_issue_SRST(struct ata_port *ap) { 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; - u32 mask, irq_stat; - const char *reason; - - DPRINTK("ENTER\n"); + u32 irq_enable, irq_stat; + int cnt; - 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); - /* put the port into known state */ - if (sil24_init_port(ap)) { - reason ="port not ready"; - goto err; - } + /* + * XXX: Not sure whether the following sleep is needed or not. + * The original driver had it. So.... + */ + msleep(10); - /* do SRST */ - prb->ctrl = cpu_to_le16(PRB_CTRL_SRST); + prb->ctrl = 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); - 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); + for (cnt = 0; cnt < 100; cnt++) { + irq_stat = readl(port + PORT_IRQ_STAT); + writel(irq_stat, port + PORT_IRQ_STAT); /* clear irq */ - writel(irq_stat, port + PORT_IRQ_STAT); /* clear IRQs */ - irq_stat >>= PORT_IRQ_RAW_SHIFT; + irq_stat >>= PORT_IRQ_RAW_SHIFT; + if (irq_stat & (PORT_IRQ_COMPLETE | PORT_IRQ_ERROR)) + break; - if (!(irq_stat & PORT_IRQ_COMPLETE)) { - if (irq_stat & PORT_IRQ_ERROR) - reason = "SRST command error"; - else - reason = "timeout"; - goto err; + msleep(1); } - sil24_update_tf(ap); - *class = ata_dev_classify(&pp->tf); + /* restore IRQs */ + writel(irq_enable, port + PORT_IRQ_ENABLE_SET); - if (*class == ATA_DEV_UNKNOWN) - *class = ATA_DEV_NONE; + if (!(irq_stat & PORT_IRQ_COMPLETE)) + return -1; - out: - DPRINTK("EXIT, class=%u\n", *class); + /* update TF */ + sil24_update_tf(ap); return 0; - - err: - ata_port_printk(ap, KERN_ERR, "softreset failed (%s)\n", reason); - return -EIO; } -static int sil24_hardreset(struct ata_port *ap, unsigned int *class) +static void sil24_phy_reset(struct ata_port *ap) { - void __iomem *port = (void __iomem *)ap->ioaddr.cmd_addr; - const char *reason; - int tout_msec, rc; - u32 tmp; - - /* sil24 does the right thing(tm) without any protection */ - sata_set_spd(ap); - - 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); + struct sil24_port_priv *pp = ap->private_data; - /* 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; - } + __sata_phy_reset(ap); + if (ap->flags & ATA_FLAG_PORT_DISABLED) + return; - if (tmp & PORT_CS_DEV_RST) { - if (ata_port_offline(ap)) - return 0; - reason = "link not ready"; - goto err; + if (sil24_issue_SRST(ap) < 0) { + printk(KERN_ERR DRV_NAME + " ata%u: SRST failed, disabling port\n", ap->id); + ap->ops->port_disable(ap); + return; } - /* 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; + ap->device->class = ata_dev_classify(&pp->tf); } static inline void sil24_fill_sg(struct ata_queued_cmd *qc, @@ -662,20 +515,17 @@ 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; + union sil24_cmd_block *cb = pp->cmd_block + qc->tag; 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: @@ -684,14 +534,16 @@ static void sil24_qc_prep(struct ata_queued_cmd *qc) prb = &cb->atapi.prb; sge = cb->atapi.sge; memset(cb->atapi.cdb, 0, 32); - memcpy(cb->atapi.cdb, qc->cdb, qc->dev->cdb_len); + memcpy(cb->atapi.cdb, qc->cdb, ap->cdb_len); if (qc->tf.protocol != ATA_PROT_ATAPI_NODATA) { if (qc->tf.flags & ATA_TFLAG_WRITE) - ctrl = PRB_CTRL_PACKET_WRITE; + prb->ctrl = PRB_CTRL_PACKET_WRITE; else - ctrl = PRB_CTRL_PACKET_READ; - } + prb->ctrl = PRB_CTRL_PACKET_READ; + } else + prb->ctrl = 0; + break; default: @@ -700,28 +552,20 @@ 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) sil24_fill_sg(qc, sge); } -static unsigned int sil24_qc_issue(struct ata_queued_cmd *qc) +static int sil24_qc_issue(struct ata_queued_cmd *qc) { struct ata_port *ap = qc->ap; - struct sil24_port_priv *pp = ap->private_data; 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); + struct sil24_port_priv *pp = ap->private_data; + dma_addr_t paddr = pp->cmd_block_dma + qc->tag * sizeof(*pp->cmd_block); + writel((u32)paddr, port + PORT_CMD_ACTIVATE); return 0; } @@ -730,139 +574,175 @@ static void sil24_irq_clear(struct ata_port *ap) /* unused */ } -static void sil24_freeze(struct ata_port *ap) +static int __sil24_restart_controller(void __iomem *port) { - void __iomem *port = (void __iomem *)ap->ioaddr.cmd_addr; + u32 tmp; + int cnt; - /* Port-wide IRQ mask in HOST_CTRL doesn't really work, clear - * PORT_IRQ_ENABLE instead. - */ - writel(0xffff, port + PORT_IRQ_ENABLE_CLR); -} + writel(PORT_CS_INIT, port + PORT_CTRL_STAT); -static void sil24_thaw(struct ata_port *ap) -{ - void __iomem *port = (void __iomem *)ap->ioaddr.cmd_addr; - u32 tmp; + /* Max ~10ms */ + for (cnt = 0; cnt < 10000; cnt++) { + tmp = readl(port + PORT_CTRL_STAT); + if (tmp & PORT_CS_RDY) + return 0; + udelay(1); + } - /* clear IRQ */ - tmp = readl(port + PORT_IRQ_STAT); - writel(tmp, port + PORT_IRQ_STAT); + return -1; +} - /* turn IRQ back on */ - writel(DEF_PORT_IRQ, port + PORT_IRQ_ENABLE_SET); +static void sil24_restart_controller(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); } -static void sil24_error_intr(struct ata_port *ap) +static int __sil24_reset_controller(void __iomem *port) { - void __iomem *port = (void __iomem *)ap->ioaddr.cmd_addr; - struct ata_eh_info *ehi = &ap->eh_info; - int freeze = 0; - u32 irq_stat; + int cnt; + u32 tmp; - /* on error, we need to clear IRQ explicitly */ - irq_stat = readl(port + PORT_IRQ_STAT); - writel(irq_stat, port + PORT_IRQ_STAT); + /* Reset controller state. Is this correct? */ + writel(PORT_CS_DEV_RST, port + PORT_CTRL_STAT); + readl(port + PORT_CTRL_STAT); /* sync */ - /* first, analyze and record host port events */ - ata_ehi_clear_desc(ehi); + /* Max ~100ms */ + for (cnt = 0; cnt < 1000; cnt++) { + udelay(100); + tmp = readl(port + PORT_CTRL_STAT); + if (!(tmp & PORT_CS_DEV_RST)) + break; + } - ata_ehi_push_desc(ehi, "irq_stat 0x%08x", irq_stat); + if (tmp & PORT_CS_DEV_RST) + return -1; - 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; - } + if (tmp & PORT_CS_RDY) + return 0; - 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; - } + return __sil24_restart_controller(port); +} - /* 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_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); +} - /* 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; +static void sil24_eng_timeout(struct ata_port *ap) +{ + struct ata_queued_cmd *qc; - ehi->action |= action; + qc = ata_qc_from_tag(ap, ap->active_tag); + if (!qc) { + printk(KERN_ERR "ata%u: BUG: timeout without command\n", + ap->id); + return; } - /* freeze or abort */ - if (freeze) - ata_port_freeze(ap); - else - ata_port_abort(ap); -} + /* + * 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. + */ + printk(KERN_ERR "ata%u: command timeout\n", ap->id); + qc->scsidone = scsi_finish_command; + qc->err_mask |= AC_ERR_OTHER; + ata_qc_complete(qc); -static void sil24_finish_qc(struct ata_queued_cmd *qc) -{ - if (qc->flags & ATA_QCFLAG_RESULT_TF) - sil24_update_tf(qc->ap); + sil24_reset_controller(ap); } -static inline void sil24_host_intr(struct ata_port *ap) +static void sil24_error_intr(struct ata_port *ap, u32 slot_stat) { + 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 slot_stat, qc_active; - int rc; + u32 irq_stat, cmd_err, sstatus, serror; + unsigned int err_mask; - slot_stat = readl(port + PORT_SLOT_STAT); + irq_stat = readl(port + PORT_IRQ_STAT); + writel(irq_stat, port + PORT_IRQ_STAT); /* clear irq */ - if (unlikely(slot_stat & HOST_SSTAT_ATTN)) { - sil24_error_intr(ap); + 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); return; } - if (ap->flags & SIL24_FLAG_PCIX_IRQ_WOC) - writel(PORT_IRQ_COMPLETE, port + PORT_IRQ_STAT); + cmd_err = readl(port + PORT_CMD_ERR); + sstatus = readl(port + PORT_SSTATUS); + serror = readl(port + PORT_SERROR); + if (serror) + writel(serror, port + PORT_SERROR); - 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; + /* + * 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); } +} + +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 (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); + if (qc) { + qc->err_mask |= ac_err_mask(pp->tf.command); + ata_qc_complete(qc); + } + } else + sil24_error_intr(ap, slot_stat); } static irqreturn_t sil24_interrupt(int irq, void *dev_instance, struct pt_regs *regs) @@ -889,7 +769,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_DISABLED)) { + if (ap && !(ap->flags & ATA_FLAG_PORT_DISABLED)) { sil24_host_intr(host_set->ports[i]); handled++; } else @@ -902,35 +782,9 @@ 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) * SIL24_MAX_CMDS; + const size_t cb_size = sizeof(*pp->cmd_block); dma_free_coherent(dev, cb_size, pp->cmd_block, pp->cmd_block_dma); } @@ -940,7 +794,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) * SIL24_MAX_CMDS; + size_t cb_size = sizeof(*cb); dma_addr_t cb_dma; int rc = -ENOMEM; @@ -987,71 +841,12 @@ static void sil24_port_stop(struct ata_port *ap) static void sil24_host_stop(struct ata_host_set *host_set) { struct sil24_host_priv *hpriv = host_set->private_data; - struct pci_dev *pdev = to_pci_dev(host_set->dev); - pci_iounmap(pdev, hpriv->host_base); - pci_iounmap(pdev, hpriv->port_base); + iounmap(hpriv->host_base); + iounmap(hpriv->port_base); 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; @@ -1062,7 +857,6 @@ 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"); @@ -1076,92 +870,134 @@ static int sil24_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) goto out_disable; rc = -ENOMEM; - /* map mmio registers */ - host_base = pci_iomap(pdev, 0, 0); + /* ioremap mmio registers */ + host_base = ioremap(pci_resource_start(pdev, 0), + pci_resource_len(pdev, 0)); if (!host_base) goto out_free; - port_base = pci_iomap(pdev, 2, 0); + port_base = ioremap(pci_resource_start(pdev, 2), + pci_resource_len(pdev, 2)); if (!port_base) goto out_free; /* allocate & init probe_ent and hpriv */ - probe_ent = kzalloc(sizeof(*probe_ent), GFP_KERNEL); + probe_ent = kmalloc(sizeof(*probe_ent), GFP_KERNEL); if (!probe_ent) goto out_free; - hpriv = kzalloc(sizeof(*hpriv), GFP_KERNEL); + hpriv = kmalloc(sizeof(*hpriv), GFP_KERNEL); if (!hpriv) goto out_free; + memset(probe_ent, 0, sizeof(*probe_ent)); probe_ent->dev = pci_dev_to_dev(pdev); INIT_LIST_HEAD(&probe_ent->node); probe_ent->sht = pinfo->sht; probe_ent->host_flags = pinfo->host_flags; probe_ent->pio_mask = pinfo->pio_mask; - probe_ent->mwdma_mask = pinfo->mwdma_mask; probe_ent->udma_mask = pinfo->udma_mask; probe_ent->port_ops = pinfo->port_ops; probe_ent->n_ports = SIL24_FLAG2NPORTS(pinfo->host_flags); probe_ent->irq = pdev->irq; - probe_ent->irq_flags = IRQF_SHARED; + probe_ent->irq_flags = SA_SHIRQ; + probe_ent->mmio_base = port_base; probe_ent->private_data = hpriv; + memset(hpriv, 0, sizeof(*hpriv)); hpriv->host_base = host_base; hpriv->port_base = port_base; /* * Configure the device */ - 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; - } + /* + * 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; } - - /* 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; + 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); + for (i = 0; i < probe_ent->n_ports; i++) { - unsigned long portu = - (unsigned long)port_base + i * PORT_REGS_SIZE; + void __iomem *port = port_base + i * PORT_REGS_SIZE; + unsigned long portu = (unsigned long)port; + u32 tmp; + int cnt; - probe_ent->port[i].cmd_addr = portu; + probe_ent->port[i].cmd_addr = portu + PORT_PRB; 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"); } - sil24_init_controller(pdev, probe_ent->n_ports, probe_ent->host_flags, - host_base, port_base); + /* Turn on interrupts */ + writel(IRQ_STAT_4PORTS, host_base + HOST_CTRL); pci_set_master(pdev); @@ -1173,9 +1009,9 @@ static int sil24_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) out_free: if (host_base) - pci_iounmap(pdev, host_base); + iounmap(host_base); if (port_base) - pci_iounmap(pdev, port_base); + iounmap(port_base); kfree(probe_ent); kfree(hpriv); pci_release_regions(pdev); @@ -1184,25 +1020,6 @@ 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 ee6b5df41..2df8c5632 100644 --- a/drivers/scsi/sata_sis.c +++ b/drivers/scsi/sata_sis.c @@ -30,6 +30,7 @@ * */ +#include #include #include #include @@ -42,7 +43,7 @@ #include #define DRV_NAME "sata_sis" -#define DRV_VERSION "0.6" +#define DRV_VERSION "0.5" enum { sis_180 = 0, @@ -86,16 +87,17 @@ static struct scsi_host_template sis_sht = { .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 = ATA_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, }; @@ -106,17 +108,14 @@ 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, - .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, + .eng_timeout = ata_eng_timeout, .irq_handler = ata_interrupt, .irq_clear = ata_bmdma_irq_clear, .scr_read = sis_scr_read, @@ -128,7 +127,8 @@ 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_NO_LEGACY, + .host_flags = ATA_FLAG_SATA | ATA_FLAG_SATA_RESET | + 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 7d0858095..d8472563f 100644 --- a/drivers/scsi/sata_svw.c +++ b/drivers/scsi/sata_svw.c @@ -36,6 +36,7 @@ * */ +#include #include #include #include @@ -53,37 +54,35 @@ #endif /* CONFIG_PPC_OF */ #define DRV_NAME "sata_svw" -#define DRV_VERSION "2.0" - -enum { - /* Taskfile registers offsets */ - K2_SATA_TF_CMD_OFFSET = 0x00, - K2_SATA_TF_DATA_OFFSET = 0x00, - K2_SATA_TF_ERROR_OFFSET = 0x04, - K2_SATA_TF_NSECT_OFFSET = 0x08, - K2_SATA_TF_LBAL_OFFSET = 0x0c, - K2_SATA_TF_LBAM_OFFSET = 0x10, - K2_SATA_TF_LBAH_OFFSET = 0x14, - K2_SATA_TF_DEVICE_OFFSET = 0x18, - K2_SATA_TF_CMDSTAT_OFFSET = 0x1c, - K2_SATA_TF_CTL_OFFSET = 0x20, - - /* DMA base */ - K2_SATA_DMA_CMD_OFFSET = 0x30, - - /* SCRs base */ - K2_SATA_SCR_STATUS_OFFSET = 0x40, - K2_SATA_SCR_ERROR_OFFSET = 0x44, - K2_SATA_SCR_CONTROL_OFFSET = 0x48, - - /* Others */ - K2_SATA_SICR1_OFFSET = 0x80, - K2_SATA_SICR2_OFFSET = 0x84, - K2_SATA_SIM_OFFSET = 0x88, - - /* Port stride */ - K2_SATA_PORT_OFFSET = 0x100, -}; +#define DRV_VERSION "1.07" + +/* Taskfile registers offsets */ +#define K2_SATA_TF_CMD_OFFSET 0x00 +#define K2_SATA_TF_DATA_OFFSET 0x00 +#define K2_SATA_TF_ERROR_OFFSET 0x04 +#define K2_SATA_TF_NSECT_OFFSET 0x08 +#define K2_SATA_TF_LBAL_OFFSET 0x0c +#define K2_SATA_TF_LBAM_OFFSET 0x10 +#define K2_SATA_TF_LBAH_OFFSET 0x14 +#define K2_SATA_TF_DEVICE_OFFSET 0x18 +#define K2_SATA_TF_CMDSTAT_OFFSET 0x1c +#define K2_SATA_TF_CTL_OFFSET 0x20 + +/* DMA base */ +#define K2_SATA_DMA_CMD_OFFSET 0x30 + +/* SCRs base */ +#define K2_SATA_SCR_STATUS_OFFSET 0x40 +#define K2_SATA_SCR_ERROR_OFFSET 0x44 +#define K2_SATA_SCR_CONTROL_OFFSET 0x48 + +/* Others */ +#define K2_SATA_SICR1_OFFSET 0x80 +#define K2_SATA_SICR2_OFFSET 0x84 +#define K2_SATA_SIM_OFFSET 0x88 + +/* Port stride */ +#define K2_SATA_PORT_OFFSET 0x100 static u8 k2_stat_check_status(struct ata_port *ap); @@ -256,7 +255,7 @@ static int k2_sata_proc_info(struct Scsi_Host *shost, char *page, char **start, int len, index; /* Find the ata_port */ - ap = ata_shost_to_port(shost); + ap = (struct ata_port *) &shost->hostdata[0]; if (ap == NULL) return 0; @@ -289,16 +288,17 @@ static struct scsi_host_template k2_sata_sht = { .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, #ifdef CONFIG_PPC_OF .proc_info = k2_sata_proc_info, #endif @@ -313,17 +313,14 @@ 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, - .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, + .eng_timeout = ata_eng_timeout, .irq_handler = ata_interrupt, .irq_clear = ata_bmdma_irq_clear, .scr_read = k2_sata_scr_read, @@ -423,12 +420,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_NO_LEGACY | - ATA_FLAG_MMIO; + probe_ent->host_flags = ATA_FLAG_SATA | ATA_FLAG_SATA_RESET | + 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 = IRQF_SHARED; + probe_ent->irq_flags = SA_SHIRQ; 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 ccc8cad24..bc87c16c8 100644 --- a/drivers/scsi/sata_sx4.c +++ b/drivers/scsi/sata_sx4.c @@ -46,7 +46,7 @@ #include "sata_promise.h" #define DRV_NAME "sata_sx4" -#define DRV_VERSION "0.9" +#define DRV_VERSION "0.8" enum { @@ -174,7 +174,7 @@ static void pdc20621_get_from_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 unsigned int pdc20621_qc_issue_prot(struct ata_queued_cmd *qc); +static int pdc20621_qc_issue_prot(struct ata_queued_cmd *qc); static struct scsi_host_template pdc_sata_sht = { @@ -182,16 +182,17 @@ static struct scsi_host_template pdc_sata_sht = { .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, }; @@ -205,7 +206,6 @@ static const 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, @@ -220,7 +220,7 @@ static const struct ata_port_info pdc_port_info[] = { .sht = &pdc_sata_sht, .host_flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY | ATA_FLAG_SRST | ATA_FLAG_MMIO | - ATA_FLAG_NO_ATAPI | ATA_FLAG_PIO_POLLING, + ATA_FLAG_NO_ATAPI, .pio_mask = 0x1f, /* pio0-4 */ .mwdma_mask = 0x07, /* mwdma0-2 */ .udma_mask = 0x7f, /* udma0-6 ; FIXME */ @@ -460,7 +460,7 @@ static void pdc20621_dma_prep(struct ata_queued_cmd *qc) unsigned int i, idx, total_len = 0, sgt_len; u32 *buf = (u32 *) &pp->dimm_buf[PDC_DIMM_HEADER_SZ]; - WARN_ON(!(qc->flags & ATA_QCFLAG_DMAMAP)); + assert(qc->flags & ATA_QCFLAG_DMAMAP); VPRINTK("ata%u: ENTER\n", ap->id); @@ -678,7 +678,7 @@ static void pdc20621_packet_start(struct ata_queued_cmd *qc) } } -static unsigned int pdc20621_qc_issue_prot(struct ata_queued_cmd *qc) +static int pdc20621_qc_issue_prot(struct ata_queued_cmd *qc) { switch (qc->tf.protocol) { case ATA_PROT_DMA: @@ -835,11 +835,11 @@ static irqreturn_t pdc20621_interrupt (int irq, void *dev_instance, struct pt_re 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_DISABLED)) { + !(ap->flags & (ATA_FLAG_PORT_DISABLED | ATA_FLAG_NOINTR))) { struct ata_queued_cmd *qc; qc = ata_qc_from_tag(ap, ap->active_tag); - if (qc && (!(qc->tf.flags & ATA_TFLAG_POLLING))) + if (qc && (!(qc->tf.ctl & ATA_NIEN))) handled += pdc20621_host_intr(ap, qc, (i > 4), mmio_base); } @@ -866,27 +866,41 @@ static void pdc_eng_timeout(struct ata_port *ap) spin_lock_irqsave(&host_set->lock, flags); 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; + } + + /* 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; switch (qc->tf.protocol) { case ATA_PROT_DMA: case ATA_PROT_NODATA: - ata_port_printk(ap, KERN_ERR, "command timeout\n"); + printk(KERN_ERR "ata%u: command timeout\n", ap->id); qc->err_mask |= __ac_err_mask(ata_wait_idle(ap)); + ata_qc_complete(qc); break; default: drv_stat = ata_busy_wait(ap, ATA_BUSY | ATA_DRQ, 1000); - ata_port_printk(ap, KERN_ERR, - "unknown timeout, cmd 0x%x stat 0x%x\n", - qc->tf.command, drv_stat); + printk(KERN_ERR "ata%u: unknown timeout, cmd 0x%x stat 0x%x\n", + ap->id, qc->tf.command, drv_stat); qc->err_mask |= ac_err_mask(drv_stat); + ata_qc_complete(qc); break; } +out: spin_unlock_irqrestore(&host_set->lock, flags); - ata_eh_qc_complete(qc); DPRINTK("EXIT\n"); } @@ -1378,6 +1392,10 @@ static int pdc_sata_init_one (struct pci_dev *pdev, const struct pci_device_id * 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; @@ -1436,7 +1454,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 = IRQF_SHARED; + probe_ent->irq_flags = SA_SHIRQ; probe_ent->mmio_base = mmio_base; probe_ent->private_data = hpriv; diff --git a/drivers/scsi/sata_uli.c b/drivers/scsi/sata_uli.c index 33cdb4867..9635ca700 100644 --- a/drivers/scsi/sata_uli.c +++ b/drivers/scsi/sata_uli.c @@ -24,6 +24,7 @@ * */ +#include #include #include #include @@ -36,15 +37,13 @@ #include #define DRV_NAME "sata_uli" -#define DRV_VERSION "1.0" +#define DRV_VERSION "0.5" 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 */ @@ -52,10 +51,6 @@ 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); @@ -80,16 +75,17 @@ static struct scsi_host_template uli_sht = { .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, }; @@ -102,18 +98,16 @@ static const 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, - .freeze = ata_bmdma_freeze, - .thaw = ata_bmdma_thaw, - .error_handler = ata_bmdma_error_handler, - .post_internal_cmd = ata_bmdma_post_internal_cmd, + .eng_timeout = ata_eng_timeout, .irq_handler = ata_interrupt, .irq_clear = ata_bmdma_irq_clear, @@ -128,7 +122,8 @@ static const struct ata_port_operations uli_ops = { static struct ata_port_info uli_port_info = { .sht = &uli_sht, - .host_flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY, + .host_flags = ATA_FLAG_SATA | ATA_FLAG_SATA_RESET | + ATA_FLAG_NO_LEGACY, .pio_mask = 0x1f, /* pio0-4 */ .udma_mask = 0x7f, /* udma0-6 */ .port_ops = &uli_ops, @@ -143,8 +138,7 @@ MODULE_VERSION(DRV_VERSION); static unsigned int get_scr_cfg_addr(struct ata_port *ap, unsigned int sc_reg) { - struct uli_priv *hpriv = ap->host_set->private_data; - return hpriv->scr_cfg_addr[ap->port_no] + (4 * sc_reg); + return ap->ioaddr.scr_addr + (4 * sc_reg); } static u32 uli_scr_cfg_read (struct ata_port *ap, unsigned int sc_reg) @@ -189,7 +183,6 @@ static int uli_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) 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"); @@ -218,18 +211,10 @@ static int uli_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) 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: - hpriv->scr_cfg_addr[0] = ULI5287_BASE; - hpriv->scr_cfg_addr[1] = ULI5287_BASE + ULI5287_OFFS; + probe_ent->port[0].scr_addr = ULI5287_BASE; + probe_ent->port[1].scr_addr = ULI5287_BASE + ULI5287_OFFS; probe_ent->n_ports = 4; probe_ent->port[2].cmd_addr = pci_resource_start(pdev, 0) + 8; @@ -237,27 +222,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; - hpriv->scr_cfg_addr[2] = ULI5287_BASE + ULI5287_OFFS*4; + probe_ent->port[2].scr_addr = 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; - hpriv->scr_cfg_addr[3] = ULI5287_BASE + ULI5287_OFFS*5; + probe_ent->port[3].scr_addr = ULI5287_BASE + ULI5287_OFFS*5; ata_std_ports(&probe_ent->port[2]); ata_std_ports(&probe_ent->port[3]); break; case uli_5289: - hpriv->scr_cfg_addr[0] = ULI5287_BASE; - hpriv->scr_cfg_addr[1] = ULI5287_BASE + ULI5287_OFFS; + probe_ent->port[0].scr_addr = ULI5287_BASE; + probe_ent->port[1].scr_addr = ULI5287_BASE + ULI5287_OFFS; break; case uli_5281: - hpriv->scr_cfg_addr[0] = ULI5281_BASE; - hpriv->scr_cfg_addr[1] = ULI5281_BASE + ULI5281_OFFS; + probe_ent->port[0].scr_addr = ULI5281_BASE; + probe_ent->port[1].scr_addr = ULI5281_BASE + ULI5281_OFFS; break; default: @@ -274,10 +259,9 @@ 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 a3727af8b..6d5b0a794 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 "2.0" +#define DRV_VERSION "1.1" enum board_ids_enum { vt6420, @@ -74,10 +74,8 @@ 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 }, @@ -96,20 +94,21 @@ static struct scsi_host_template svia_sht = { .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, }; -static const struct ata_port_operations vt6420_sata_ops = { +static const struct ata_port_operations svia_sata_ops = { .port_disable = ata_port_disable, .tf_load = ata_tf_load, @@ -118,36 +117,7 @@ static const struct ata_port_operations vt6420_sata_ops = { .exec_command = ata_exec_command, .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, - .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, + .phy_reset = sata_phy_reset, .bmdma_setup = ata_bmdma_setup, .bmdma_start = ata_bmdma_start, @@ -156,12 +126,8 @@ static const struct ata_port_operations vt6421_sata_ops = { .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 = ata_bmdma_error_handler, - .post_internal_cmd = ata_bmdma_post_internal_cmd, + .eng_timeout = ata_eng_timeout, .irq_handler = ata_interrupt, .irq_clear = ata_bmdma_irq_clear, @@ -174,13 +140,13 @@ static const struct ata_port_operations vt6421_sata_ops = { .host_stop = ata_host_stop, }; -static struct ata_port_info vt6420_port_info = { +static struct ata_port_info svia_port_info = { .sht = &svia_sht, - .host_flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY, + .host_flags = ATA_FLAG_SATA | ATA_FLAG_SRST | ATA_FLAG_NO_LEGACY, .pio_mask = 0x1f, .mwdma_mask = 0x07, .udma_mask = 0x7f, - .port_ops = &vt6420_sata_ops, + .port_ops = &svia_sata_ops, }; MODULE_AUTHOR("Jeff Garzik"); @@ -203,81 +169,6 @@ 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 }; @@ -318,7 +209,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 = &vt6420_port_info; + struct ata_port_info *ppi = &svia_port_info; probe_ent = ata_pci_init_native_mode(pdev, &ppi, ATA_PORT_PRIMARY | ATA_PORT_SECONDARY); if (!probe_ent) @@ -346,11 +237,12 @@ 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_NO_LEGACY; - probe_ent->port_ops = &vt6421_sata_ops; + probe_ent->host_flags = ATA_FLAG_SATA | ATA_FLAG_SATA_RESET | + ATA_FLAG_NO_LEGACY; + probe_ent->port_ops = &svia_sata_ops; probe_ent->n_ports = N_PORTS; probe_ent->irq = pdev->irq; - probe_ent->irq_flags = IRQF_SHARED; + probe_ent->irq_flags = SA_SHIRQ; probe_ent->pio_mask = 0x1f; probe_ent->mwdma_mask = 0x07; probe_ent->udma_mask = 0x7f; @@ -443,10 +335,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%llx, val 0x%llx)\n", - i, - (unsigned long long)pci_resource_start(pdev, i), - (unsigned long long)pci_resource_len(pdev, i)); + "invalid PCI BAR %u (sz 0x%lx, val 0x%lx)\n", + i, + pci_resource_start(pdev, i), + 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 ad3787159..e484e8db6 100644 --- a/drivers/scsi/sata_vsc.c +++ b/drivers/scsi/sata_vsc.c @@ -47,58 +47,52 @@ #include #define DRV_NAME "sata_vsc" -#define DRV_VERSION "2.0" - -enum { - /* Interrupt register offsets (from chip base address) */ - VSC_SATA_INT_STAT_OFFSET = 0x00, - VSC_SATA_INT_MASK_OFFSET = 0x04, - - /* Taskfile registers offsets */ - VSC_SATA_TF_CMD_OFFSET = 0x00, - VSC_SATA_TF_DATA_OFFSET = 0x00, - VSC_SATA_TF_ERROR_OFFSET = 0x04, - VSC_SATA_TF_FEATURE_OFFSET = 0x06, - VSC_SATA_TF_NSECT_OFFSET = 0x08, - VSC_SATA_TF_LBAL_OFFSET = 0x0c, - VSC_SATA_TF_LBAM_OFFSET = 0x10, - VSC_SATA_TF_LBAH_OFFSET = 0x14, - VSC_SATA_TF_DEVICE_OFFSET = 0x18, - VSC_SATA_TF_STATUS_OFFSET = 0x1c, - VSC_SATA_TF_COMMAND_OFFSET = 0x1d, - VSC_SATA_TF_ALTSTATUS_OFFSET = 0x28, - VSC_SATA_TF_CTL_OFFSET = 0x29, - - /* DMA base */ - VSC_SATA_UP_DESCRIPTOR_OFFSET = 0x64, - VSC_SATA_UP_DATA_BUFFER_OFFSET = 0x6C, - VSC_SATA_DMA_CMD_OFFSET = 0x70, - - /* SCRs base */ - VSC_SATA_SCR_STATUS_OFFSET = 0x100, - VSC_SATA_SCR_ERROR_OFFSET = 0x104, - VSC_SATA_SCR_CONTROL_OFFSET = 0x108, - - /* Port stride */ - VSC_SATA_PORT_OFFSET = 0x200, - - /* Error interrupt status bit offsets */ - VSC_SATA_INT_ERROR_CRC = 0x40, - VSC_SATA_INT_ERROR_T = 0x20, - VSC_SATA_INT_ERROR_P = 0x10, - VSC_SATA_INT_ERROR_R = 0x8, - VSC_SATA_INT_ERROR_E = 0x4, - VSC_SATA_INT_ERROR_M = 0x2, - VSC_SATA_INT_PHY_CHANGE = 0x1, - VSC_SATA_INT_ERROR = (VSC_SATA_INT_ERROR_CRC | VSC_SATA_INT_ERROR_T | \ - VSC_SATA_INT_ERROR_P | VSC_SATA_INT_ERROR_R | \ - VSC_SATA_INT_ERROR_E | VSC_SATA_INT_ERROR_M | \ - VSC_SATA_INT_PHY_CHANGE), -}; - - +#define DRV_VERSION "1.1" + +/* Interrupt register offsets (from chip base address) */ +#define VSC_SATA_INT_STAT_OFFSET 0x00 +#define VSC_SATA_INT_MASK_OFFSET 0x04 + +/* Taskfile registers offsets */ +#define VSC_SATA_TF_CMD_OFFSET 0x00 +#define VSC_SATA_TF_DATA_OFFSET 0x00 +#define VSC_SATA_TF_ERROR_OFFSET 0x04 +#define VSC_SATA_TF_FEATURE_OFFSET 0x06 +#define VSC_SATA_TF_NSECT_OFFSET 0x08 +#define VSC_SATA_TF_LBAL_OFFSET 0x0c +#define VSC_SATA_TF_LBAM_OFFSET 0x10 +#define VSC_SATA_TF_LBAH_OFFSET 0x14 +#define VSC_SATA_TF_DEVICE_OFFSET 0x18 +#define VSC_SATA_TF_STATUS_OFFSET 0x1c +#define VSC_SATA_TF_COMMAND_OFFSET 0x1d +#define VSC_SATA_TF_ALTSTATUS_OFFSET 0x28 +#define VSC_SATA_TF_CTL_OFFSET 0x29 + +/* DMA base */ +#define VSC_SATA_UP_DESCRIPTOR_OFFSET 0x64 +#define VSC_SATA_UP_DATA_BUFFER_OFFSET 0x6C +#define VSC_SATA_DMA_CMD_OFFSET 0x70 + +/* SCRs base */ +#define VSC_SATA_SCR_STATUS_OFFSET 0x100 +#define VSC_SATA_SCR_ERROR_OFFSET 0x104 +#define VSC_SATA_SCR_CONTROL_OFFSET 0x108 + +/* Port stride */ +#define VSC_SATA_PORT_OFFSET 0x200 + +/* Error interrupt status bit offsets */ +#define VSC_SATA_INT_ERROR_E_OFFSET 2 +#define VSC_SATA_INT_ERROR_P_OFFSET 4 +#define VSC_SATA_INT_ERROR_T_OFFSET 5 +#define VSC_SATA_INT_ERROR_M_OFFSET 1 #define is_vsc_sata_int_err(port_idx, int_status) \ - (int_status & (VSC_SATA_INT_ERROR << (8 * port_idx))) + (int_status & ((1 << (VSC_SATA_INT_ERROR_E_OFFSET + (8 * port_idx))) | \ + (1 << (VSC_SATA_INT_ERROR_P_OFFSET + (8 * port_idx))) | \ + (1 << (VSC_SATA_INT_ERROR_T_OFFSET + (8 * port_idx))) | \ + (1 << (VSC_SATA_INT_ERROR_M_OFFSET + (8 * port_idx))) \ + )\ + ) static u32 vsc_sata_scr_read (struct ata_port *ap, unsigned int sc_reg) @@ -229,32 +223,19 @@ static irqreturn_t vsc_sata_interrupt (int irq, void *dev_instance, handled++; } - if (ap && !(ap->flags & ATA_FLAG_DISABLED)) { + if (ap && !(ap->flags & + (ATA_FLAG_PORT_DISABLED|ATA_FLAG_NOINTR))) { struct ata_queued_cmd *qc; qc = ata_qc_from_tag(ap, ap->active_tag); - if (qc && (!(qc->tf.flags & ATA_TFLAG_POLLING))) + if (qc && (!(qc->tf.ctl & ATA_NIEN))) { handled += ata_host_intr(ap, qc); - 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 - * time (phy state changes). Clearing the SCR - * error register is not required, but it prevents - * the phy state change interrupts from recurring - * later. - */ - u32 err_status; - err_status = vsc_sata_scr_read(ap, SCR_ERROR); - printk(KERN_DEBUG "%s: clearing interrupt, " - "status %x; sata err status %x\n", - __FUNCTION__, - int_status, err_status); - vsc_sata_scr_write(ap, SCR_ERROR, err_status); - /* Clear interrupt status */ + } else { + printk(KERN_DEBUG "%s: ignoring interrupt(s)\n", __FUNCTION__); ata_chk_status(ap); handled++; } + } } } @@ -270,16 +251,17 @@ static struct scsi_host_template vsc_sata_sht = { .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, }; @@ -291,17 +273,14 @@ 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, - .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, + .eng_timeout = ata_eng_timeout, .irq_handler = vsc_sata_interrupt, .irq_clear = ata_bmdma_irq_clear, .scr_read = vsc_sata_scr_read, @@ -396,11 +375,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_MMIO | ATA_FLAG_SATA_RESET; probe_ent->port_ops = &vsc_sata_ops; probe_ent->n_ports = 4; probe_ent->irq = pdev->irq; - probe_ent->irq_flags = IRQF_SHARED; + probe_ent->irq_flags = SA_SHIRQ; probe_ent->mmio_base = mmio_base; /* We don't care much about the PIO/UDMA masks, but the core won't like us @@ -443,12 +422,15 @@ 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[] = { - { 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 */ + { 0x1725, 0x7174, PCI_ANY_ID, PCI_ANY_ID, 0x10600, 0xFFFFFF, 0 }, + { 0x8086, 0x3200, PCI_ANY_ID, PCI_ANY_ID, 0x10600, 0xFFFFFF, 0 }, + { } }; diff --git a/drivers/scsi/scsi.c b/drivers/scsi/scsi.c index b332caddd..c551bb84d 100644 --- a/drivers/scsi/scsi.c +++ b/drivers/scsi/scsi.c @@ -48,6 +48,7 @@ #include #include #include +#include #include #include #include @@ -63,6 +64,7 @@ #include #include #include +#include #include "scsi_priv.h" #include "scsi_logging.h" @@ -115,6 +117,80 @@ 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 = kmalloc(size, gfp_mask); + if (likely(sreq != NULL)) { + memset(sreq, 0, size); + 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; @@ -346,7 +422,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->request_buffer, cmd->request_bufflen, + cmd->buffer, cmd->bufflen, cmd->done, sdev->host->hostt->queuecommand); @@ -491,8 +567,7 @@ int scsi_dispatch_cmd(struct scsi_cmnd *cmd) /* * If SCSI-2 or lower, store the LUN value in cmnd. */ - if (cmd->device->scsi_level <= SCSI_2 && - cmd->device->scsi_level != SCSI_UNKNOWN) { + if (cmd->device->scsi_level <= SCSI_2) { cmd->cmnd[1] = (cmd->cmnd[1] & 0x1f) | (cmd->device->lun << 5 & 0xe0); } @@ -572,29 +647,78 @@ int scsi_dispatch_cmd(struct scsi_cmnd *cmd) return rtn; } - /* - * 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 + * 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. * - * 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. + * 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_req_abort_cmd(struct scsi_cmnd *cmd) +void scsi_init_cmd_from_req(struct scsi_cmnd *cmd, struct scsi_request *sreq) { - if (!scsi_delete_timer(cmd)) - return; - scsi_times_out(cmd); + 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")); } -EXPORT_SYMBOL(scsi_req_abort_cmd); + +/* + * Per-CPU I/O completion queue. + */ +static DEFINE_PER_CPU(struct list_head, scsi_done_q); /** * scsi_done - Enqueue the finished SCSI command into the done queue. @@ -661,6 +785,11 @@ 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. @@ -681,6 +810,7 @@ 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); @@ -706,6 +836,25 @@ 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); @@ -1096,9 +1245,10 @@ static int __init init_scsi(void) if (error) goto cleanup_sysctl; - for_each_possible_cpu(i) + for_each_cpu(i) INIT_LIST_HEAD(&per_cpu(scsi_done_q, i)); + devfs_mk_dir("scsi"); printk(KERN_NOTICE "SCSI subsystem initialized\n"); return 0; @@ -1123,6 +1273,7 @@ static void __exit exit_scsi(void) scsi_exit_sysctl(); scsi_exit_hosts(); scsi_exit_devinfo(); + devfs_remove("scsi"); scsi_exit_procfs(); scsi_exit_queue(); } diff --git a/drivers/scsi/scsi.h b/drivers/scsi/scsi.h index d5a55fae6..5ee5d80a9 100644 --- a/drivers/scsi/scsi.h +++ b/drivers/scsi/scsi.h @@ -20,9 +20,12 @@ #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 a80303c6b..0e529f817 100644 --- a/drivers/scsi/scsi_debug.c +++ b/drivers/scsi/scsi_debug.c @@ -24,6 +24,7 @@ * module options to "modprobe scsi_debug num_tgts=2" [20021221] */ +#include #include #include @@ -50,22 +51,18 @@ #include "scsi_logging.h" #include "scsi_debug.h" -#define SCSI_DEBUG_VERSION "1.79" -static const char * scsi_debug_version_date = "20060604"; +#define SCSI_DEBUG_VERSION "1.75" +static const char * scsi_debug_version_date = "20050113"; /* Additional Sense Code (ASC) used */ -#define NO_ADDITIONAL_SENSE 0x0 -#define LOGICAL_UNIT_NOT_READY 0x4 +#define NO_ADDED_SENSE 0x0 #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 THRESHOLD_EXCEEDED 0x5d -#define LOW_POWER_COND_ON 0x5e +#define THRESHHOLD_EXCEEDED 0x5d #define SDEBUG_TAGGED_QUEUING 0 /* 0 | MSG_SIMPLE_TAG | MSG_ORDERED_TAG */ @@ -84,8 +81,6 @@ static const char * scsi_debug_version_date = "20060604"; #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 @@ -112,7 +107,6 @@ static const char * scsi_debug_version_date = "20060604"; /* 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; @@ -125,16 +119,13 @@ 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 int sdebug_store_size; /* in bytes */ -static unsigned int sdebug_store_sectors; +static unsigned long sdebug_store_size; /* in bytes */ static sector_t sdebug_capacity; /* in sectors */ /* old BIOS stuff, kernel may get rid of them but some mode sense pages @@ -159,9 +150,7 @@ 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; }; @@ -205,11 +194,11 @@ static struct scsi_host_template sdebug_driver_template = { .bios_param = scsi_debug_biosparam, .can_queue = SCSI_DEBUG_CANQUEUE, .this_id = 7, - .sg_tablesize = 256, - .cmd_per_lun = 16, - .max_sectors = 0xffff, + .sg_tablesize = 64, + .cmd_per_lun = 3, + .max_sectors = 4096, .unchecked_isa_dma = 0, - .use_clustering = ENABLE_CLUSTERING, + .use_clustering = DISABLE_CLUSTERING, .module = THIS_MODULE, }; @@ -237,32 +226,19 @@ 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_readcap16(struct scsi_cmnd * SCpnt, - struct sdebug_dev_info * devip); -static int resp_mode_sense(struct scsi_cmnd * scp, int target, +static int resp_mode_sense(struct scsi_cmnd * SCpnt, int target, 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_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_report_luns(struct scsi_cmnd * SCpnt, struct sdebug_dev_info * devip); static int fill_from_dev_buffer(struct scsi_cmnd * scp, unsigned char * arr, @@ -273,8 +249,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_readiness(struct scsi_cmnd * SCpnt, int reset_only, - struct sdebug_dev_info * devip); +static int check_reset(struct scsi_cmnd * SCpnt, + 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); @@ -282,11 +258,9 @@ 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 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 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 void do_remove_driverfs_files(void); static int sdebug_add_adapter(void); @@ -301,22 +275,18 @@ static int scsi_debug_queuecommand(struct scsi_cmnd * SCpnt, done_funct_t done) { unsigned char *cmd = (unsigned char *) SCpnt->cmnd; - int len, k, j; - unsigned int num; - unsigned long long lba; + int block, upper_blk, num, k; int errsts = 0; - int target = SCpnt->device->id; + int target = scmd_id(SCpnt); 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, len = SCpnt->cmd_len; k < len; ++k) + for (k = 0, num = SCpnt->cmd_len; k < num; ++k) printk("%02x ", (int)cmd[k]); printk("\n"); } @@ -327,8 +297,7 @@ 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) && - (SCpnt->device->lun != SAM2_WLUN_REPORT_LUNS)) + if (SCpnt->device->lun >= scsi_debug_max_luns) return schedule_resp(SCpnt, NULL, done, DID_NO_CONNECT << 16, 0); devip = devInfoReg(SCpnt->device); @@ -347,150 +316,118 @@ 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 = resp_start_stop(SCpnt, devip); + errsts = check_reset(SCpnt, devip); break; case ALLOW_MEDIUM_REMOVAL: - if ((errsts = check_readiness(SCpnt, 1, devip))) + if ((errsts = check_reset(SCpnt, 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_readiness(SCpnt, 1, devip); + errsts = check_reset(SCpnt, devip); break; case TEST_UNIT_READY: /* mandatory */ - delay_override = 1; - errsts = check_readiness(SCpnt, 0, devip); + errsts = check_reset(SCpnt, devip); break; case RESERVE: - errsts = check_readiness(SCpnt, 1, devip); + errsts = check_reset(SCpnt, devip); break; case RESERVE_10: - errsts = check_readiness(SCpnt, 1, devip); + errsts = check_reset(SCpnt, devip); break; case RELEASE: - errsts = check_readiness(SCpnt, 1, devip); + errsts = check_reset(SCpnt, devip); break; case RELEASE_10: - errsts = check_readiness(SCpnt, 1, devip); + errsts = check_reset(SCpnt, 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_readiness(SCpnt, 0, devip))) + if ((errsts = check_reset(SCpnt, devip))) break; + upper_blk = 0; if ((*cmd) == READ_16) { - for (lba = 0, j = 0; j < 8; ++j) { - if (j > 0) - lba <<= 8; - lba += cmd[2 + j]; - } + 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); num = cmd[13] + (cmd[12] << 8) + (cmd[11] << 16) + (cmd[10] << 24); } else if ((*cmd) == READ_12) { - lba = cmd[5] + (cmd[4] << 8) + + block = 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) { - lba = cmd[5] + (cmd[4] << 8) + + block = cmd[5] + (cmd[4] << 8) + (cmd[3] << 16) + (cmd[2] << 24); num = cmd[8] + (cmd[7] << 8); - } else { /* READ (6) */ - lba = cmd[3] + (cmd[2] << 8) + + } else { + block = cmd[3] + (cmd[2] << 8) + ((cmd[1] & 0x1f) << 16); - num = (0 == cmd[4]) ? 256 : cmd[4]; + num = cmd[4]; } - errsts = resp_read(SCpnt, lba, num, devip); + errsts = resp_read(SCpnt, upper_blk, block, num, devip); if (inj_recovered && (0 == errsts)) { mk_sense_buffer(devip, RECOVERED_ERROR, - THRESHOLD_EXCEEDED, 0); + THRESHHOLD_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_readiness(SCpnt, 0, devip); + errsts = check_reset(SCpnt, devip); break; case WRITE_16: case WRITE_12: case WRITE_10: case WRITE_6: - if ((errsts = check_readiness(SCpnt, 0, devip))) + if ((errsts = check_reset(SCpnt, devip))) break; + upper_blk = 0; if ((*cmd) == WRITE_16) { - for (lba = 0, j = 0; j < 8; ++j) { - if (j > 0) - lba <<= 8; - lba += cmd[2 + j]; - } + 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); num = cmd[13] + (cmd[12] << 8) + (cmd[11] << 16) + (cmd[10] << 24); } else if ((*cmd) == WRITE_12) { - lba = cmd[5] + (cmd[4] << 8) + + block = 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) { - lba = cmd[5] + (cmd[4] << 8) + + block = cmd[5] + (cmd[4] << 8) + (cmd[3] << 16) + (cmd[2] << 24); num = cmd[8] + (cmd[7] << 8); - } else { /* WRITE (6) */ - lba = cmd[3] + (cmd[2] << 8) + + } else { + block = cmd[3] + (cmd[2] << 8) + ((cmd[1] & 0x1f) << 16); - num = (0 == cmd[4]) ? 256 : cmd[4]; + num = cmd[4]; } - errsts = resp_write(SCpnt, lba, num, devip); + errsts = resp_write(SCpnt, upper_blk, block, num, devip); if (inj_recovered && (0 == errsts)) { mk_sense_buffer(devip, RECOVERED_ERROR, - THRESHOLD_EXCEEDED, 0); + THRESHHOLD_EXCEEDED, 0); errsts = check_condition_result; } break; @@ -498,31 +435,20 @@ 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: - delay_override = 1; - errsts = check_readiness(SCpnt, 0, devip); + errsts = check_reset(SCpnt, 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_readiness(SCpnt, 1, devip))) + if ((errsts = check_reset(SCpnt, 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, - (delay_override ? 0 : scsi_debug_delay)); + return schedule_resp(SCpnt, devip, done, errsts, scsi_debug_delay); } static int scsi_debug_ioctl(struct scsi_device *dev, int cmd, void __user *arg) @@ -534,8 +460,7 @@ static int scsi_debug_ioctl(struct scsi_device *dev, int cmd, void __user *arg) /* return -ENOTTY; // correct return but upsets fdisk */ } -static int check_readiness(struct scsi_cmnd * SCpnt, int reset_only, - struct sdebug_dev_info * devip) +static int check_reset(struct scsi_cmnd * SCpnt, struct sdebug_dev_info * devip) { if (devip->reset) { if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts) @@ -545,14 +470,6 @@ static int check_readiness(struct scsi_cmnd * SCpnt, int reset_only, 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; } @@ -576,10 +493,7 @@ 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); - if (scp->resid) - scp->resid -= act_len; - else - scp->resid = req_len - act_len; + scp->resid = req_len - act_len; return 0; } sgpnt = (struct scatterlist *)scp->request_buffer; @@ -602,10 +516,7 @@ static int fill_from_dev_buffer(struct scsi_cmnd * scp, unsigned char * arr, } req_len += sgpnt->length; } - if (scp->resid) - scp->resid -= act_len; - else - scp->resid = req_len - act_len; + scp->resid = req_len - act_len; return 0; } @@ -656,14 +567,12 @@ 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 target_dev_id, - int dev_id_num, const char * dev_id_str, - int dev_id_str_len) +static int inquiry_evpd_83(unsigned char * arr, int dev_id_num, + const char * dev_id_str, int dev_id_str_len) { - int num, port_a; - char b[32]; + int num; - port_a = target_dev_id + 1; + /* Two identification descriptors: */ /* T10 vendor identifier field format (faked) */ arr[0] = 0x2; /* ASCII */ arr[1] = 0x1; @@ -674,246 +583,25 @@ static int inquiry_evpd_83(unsigned char * arr, int target_dev_id, num = 8 + 16 + dev_id_str_len; arr[3] = num; num += 4; - 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); + /* 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; } #define SDEBUG_LONG_INQ_SZ 96 -#define SDEBUG_MAX_INQ_ARR_SZ 584 +#define SDEBUG_MAX_INQ_ARR_SZ 128 static int resp_inquiry(struct scsi_cmnd * scp, int target, struct sdebug_dev_info * devip) @@ -921,113 +609,64 @@ 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, n; + int alloc_len; alloc_len = (cmd[3] << 8) + cmd[4]; memset(arr, 0, SDEBUG_MAX_INQ_ARR_SZ); - 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); + 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 lu_id_num, target_dev_id, len; - char lu_id_str[6]; - int host_no = devip->sdbg_host->shost->host_no; + int dev_id_num, len; + char dev_id_str[6]; - 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); + 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); if (0 == cmd[2]) { /* supported vital product data pages */ - 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 */ + arr[3] = 3; + arr[4] = 0x0; /* this page */ + arr[5] = 0x80; /* unit serial number */ + arr[6] = 0x83; /* device identification */ } else if (0x80 == cmd[2]) { /* unit serial number */ - arr[1] = cmd[2]; /*sanity */ + arr[1] = 0x80; arr[3] = len; - memcpy(&arr[4], lu_id_str, len); + memcpy(&arr[4], dev_id_str, len); } else if (0x83 == cmd[2]) { /* device identification */ - 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]); + arr[1] = 0x83; + arr[3] = inquiry_evpd_83(&arr[4], dev_id_num, + dev_id_str, len); } 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(len, SDEBUG_MAX_INQ_ARR_SZ)); + min(alloc_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] = 0x10; /* claim: MultiP */ + arr[6] = 0x1; /* claim: ADDR16 */ /* arr[6] |= 0x40; ... claim: EncServ (enclosure services) */ - arr[7] = 0xa; /* claim: LINKED + CMDQUE */ + arr[7] = 0x3a; /* claim: WBUS16, SYNC, 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] = 0x77; /* SAM-3 ANSI */ - arr[60] = 0x3; arr[61] = 0x14; /* SPC-3 ANSI */ - n = 62; + arr[58] = 0x0; arr[59] = 0x40; /* SAM-2 */ + arr[60] = 0x3; arr[61] = 0x0; /* SPC-3 */ if (scsi_debug_ptype == 0) { - arr[n++] = 0x3; arr[n++] = 0x3d; /* SBC-2 ANSI */ + arr[62] = 0x1; arr[63] = 0x80; /* SBC */ } else if (scsi_debug_ptype == 1) { - arr[n++] = 0x3; arr[n++] = 0x60; /* SSC-2 no version */ + arr[62] = 0x2; arr[63] = 0x00; /* SSC */ } - 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)); } @@ -1038,141 +677,46 @@ 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, sizeof(arr)); + memset(arr, 0, SDEBUG_SENSE_LEN); if (devip->reset == 1) - mk_sense_buffer(devip, 0, NO_ADDITIONAL_SENSE, 0); - want_dsense = !!(cmd[1] & 1) || scsi_debug_dsense; + mk_sense_buffer(devip, 0, NO_ADDED_SENSE, 0); sbuff = devip->sense_buff; - 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 { + 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 memcpy(arr, sbuff, SDEBUG_SENSE_LEN); - 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); + mk_sense_buffer(devip, 0, NO_ADDED_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 int capac; + unsigned long capac; int errsts; - if ((errsts = check_readiness(scp, 1, devip))) + if ((errsts = check_reset(scp, 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); - 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; - } + capac = (unsigned long)sdebug_capacity - 1; + arr[0] = (capac >> 24); + arr[1] = (capac >> 16) & 0xff; + arr[2] = (capac >> 8) & 0xff; + arr[3] = capac & 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) @@ -1228,98 +772,27 @@ 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 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, + unsigned char 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) - 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)); + memset(p + 2, 0, sizeof(ctrl_m_pg) - 2); 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 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}; - + unsigned char 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) - 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)); + memset(p + 2, 0, sizeof(iec_m_pg) - 2); 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, @@ -1328,12 +801,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, target_dev_id; + int alloc_len, msense_6, offset, len, errsts; unsigned char * ap; unsigned char arr[SDEBUG_MAX_MSENSE_SZ]; unsigned char *cmd = (unsigned char *)scp->cmnd; - if ((errsts = check_readiness(scp, 1, devip))) + if ((errsts = check_reset(scp, devip))) return errsts; dbd = cmd[1] & 0x8; pcontrol = (cmd[2] & 0xc0) >> 6; @@ -1347,8 +820,6 @@ 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; @@ -1359,8 +830,7 @@ static int resp_mode_sense(struct scsi_cmnd * scp, int target, } ap = arr + offset; - if ((subpcode > 0x0) && (subpcode < 0xff) && (0x19 != pcode)) { - /* TODO: Control Extension page */ + if (0 != subpcode) { /* TODO: Control Extension page */ mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB, 0); return check_condition_result; @@ -1386,45 +856,17 @@ 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 */ - 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; - } + 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); offset += len; break; default: @@ -1441,274 +883,71 @@ static int resp_mode_sense(struct scsi_cmnd * scp, int target, return fill_from_dev_buffer(scp, arr, min(alloc_len, offset)); } -#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) +static int resp_read(struct scsi_cmnd * SCpnt, int upper_blk, int block, + int num, struct sdebug_dev_info * devip) { unsigned long iflags; - unsigned int block, from_bottom; - unsigned long long u; int ret; - if (lba + num > sdebug_capacity) { + if (upper_blk || (block + 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) && - (lba <= OPT_MEDIUM_ERR_ADDR) && - ((lba + num) > OPT_MEDIUM_ERR_ADDR)) { - /* claim unrecoverable read error */ + (block <= OPT_MEDIUM_ERR_ADDR) && + ((block + num) > OPT_MEDIUM_ERR_ADDR)) { mk_sense_buffer(devip, MEDIUM_ERROR, UNRECOVERED_READ_ERR, 0); - /* 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; - } + /* claim unrecoverable read error */ return check_condition_result; } read_lock_irqsave(&atomic_rw, iflags); - 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); - } + ret = fill_from_dev_buffer(SCpnt, fake_storep + (block * SECT_SIZE), + num * SECT_SIZE); read_unlock_irqrestore(&atomic_rw, iflags); return ret; } -static int resp_write(struct scsi_cmnd * SCpnt, unsigned long long lba, - unsigned 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) { unsigned long iflags; - unsigned int block, to_bottom; - unsigned long long u; int res; - if (lba + num > sdebug_capacity) { + if (upper_blk || (block + 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); - 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); - } + res = fetch_to_dev_buffer(SCpnt, fake_storep + (block * SECT_SIZE), + num * 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=%u, " + printk(KERN_INFO "scsi_debug: write: cdb indicated=%d, " " IO sent=%d bytes\n", num * SECT_SIZE, res); return 0; } -#define SDEBUG_RLUN_ARR_SZ 256 +#define SDEBUG_RLUN_ARR_SZ 128 static int resp_report_luns(struct scsi_cmnd * scp, struct sdebug_dev_info * devip) { unsigned int alloc_len; - int lun_cnt, i, upper, num, n, wlun, lun; + int lun_cnt, i, upper; 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 < 4) || (select_report > 2)) { + if ((alloc_len < 16) || (select_report > 2)) { mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB, 0); return check_condition_result; @@ -1716,37 +955,18 @@ 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; - 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; - } + 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); one_lun = (struct scsi_lun *) &arr[8]; - 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; + for (i = 0; i < lun_cnt; i++) { + upper = (i >> 8) & 0x3f; if (upper) one_lun[i].scsi_lun[0] = (upper | (SAM2_LUN_ADDRESS_METHOD << 6)); - one_lun[i].scsi_lun[1] = lun & 0xff; + one_lun[i].scsi_lun[1] = i & 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)); } @@ -1782,8 +1002,7 @@ 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) - printk(KERN_INFO "scsi_debug: slave_alloc <%u %u %u %u>\n", - sdp->host->host_no, sdp->channel, sdp->id, sdp->lun); + sdev_printk(KERN_INFO, sdp, "scsi_debug: slave_alloc\n"); return 0; } @@ -1792,8 +1011,7 @@ static int scsi_debug_slave_configure(struct scsi_device * sdp) struct sdebug_dev_info * devip; if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts) - printk(KERN_INFO "scsi_debug: slave_configure <%u %u %u %u>\n", - sdp->host->host_no, sdp->channel, sdp->id, sdp->lun); + sdev_printk(KERN_INFO, sdp, "scsi_debug: slave_configure\n"); if (sdp->host->max_cmd_len != SCSI_DEBUG_MAX_CMD_LEN) sdp->host->max_cmd_len = SCSI_DEBUG_MAX_CMD_LEN; devip = devInfoReg(sdp); @@ -1801,7 +1019,6 @@ 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; } @@ -1811,8 +1028,7 @@ static void scsi_debug_slave_destroy(struct scsi_device * sdp) (struct sdebug_dev_info *)sdp->hostdata; if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts) - printk(KERN_INFO "scsi_debug: slave_destroy <%u %u %u %u>\n", - sdp->host->host_no, sdp->channel, sdp->id, sdp->lun); + sdev_printk(KERN_INFO, sdp, "scsi_debug: slave_destroy\n"); if (devip) { /* make this slot avaliable for re-use */ devip->used = 0; @@ -1845,12 +1061,13 @@ static struct sdebug_dev_info * devInfoReg(struct scsi_device * sdev) } } if (NULL == open_devip) { /* try and make a new one */ - open_devip = kzalloc(sizeof(*open_devip),GFP_KERNEL); + open_devip = kmalloc(sizeof(*open_devip),GFP_KERNEL); if (NULL == open_devip) { printk(KERN_ERR "%s: out of memory at line %d\n", __FUNCTION__, __LINE__); return NULL; } + memset(open_devip, 0, sizeof(*open_devip)); open_devip->sdbg_host = sdbg_host; list_add_tail(&open_devip->dev_list, &sdbg_host->dev_info_list); @@ -1869,8 +1086,6 @@ 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; @@ -2059,7 +1274,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_sectors; + num_sectors = (int)(sdebug_store_size / SECT_SIZE); sectors_per_part = (num_sectors - sdebug_sectors_per) / scsi_debug_num_parts; heads_by_sects = sdebug_heads * sdebug_sectors_per; @@ -2102,9 +1317,9 @@ static int schedule_resp(struct scsi_cmnd * cmnd, if (scsi_result) { struct scsi_device * sdp = cmnd->device; - 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); + sdev_printk(KERN_INFO, sdp, + "non-zero result=0x%x\n", + scsi_result); } } if (cmnd && devip) { @@ -2151,19 +1366,21 @@ static int schedule_resp(struct scsi_cmnd * cmnd, } } -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); +/* 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_AUTHOR("Eric Youngdale + Douglas Gilbert"); MODULE_DESCRIPTION("SCSI debug adapter driver"); @@ -2172,17 +1389,15 @@ 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(def=8)"); -MODULE_PARM_DESC(dsense, "use descriptor sense format(def=0 -> fixed)"); +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(every_nth, "timeout every nth command(def=100)"); -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(max_luns, "number of SCSI LUNs per target to simulate"); MODULE_PARM_DESC(num_parts, "number of partitions(def=0)"); -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(num_tgts, "number of SCSI targets per host to simulate"); +MODULE_PARM_DESC(opts, "1->noise, 2->medium_error, 4->..."); 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]; @@ -2334,24 +1549,6 @@ 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); @@ -2427,29 +1624,6 @@ 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); @@ -2487,22 +1661,19 @@ 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 int do_create_driverfs_files(void) +static void do_create_driverfs_files(void) { - 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; + 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); } static void do_remove_driverfs_files(void) @@ -2522,20 +1693,14 @@ static void do_remove_driverfs_files(void) static int __init scsi_debug_init(void) { - unsigned int sz; + unsigned long 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 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; + sdebug_store_size = (unsigned long)scsi_debug_dev_size_mb * 1048576; + sdebug_capacity = sdebug_store_size / SECT_SIZE; /* play around with geometry, don't waste too much on track 0 */ sdebug_heads = 8; @@ -2564,33 +1729,13 @@ static int __init scsi_debug_init(void) if (scsi_debug_num_parts > 0) sdebug_build_parts(fake_storep); - 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; - } - init_all_queued(); + device_register(&pseudo_primary); + bus_register(&pseudo_lld_bus); + driver_register(&sdebug_driverfs_driver); + do_create_driverfs_files(); + sdebug_driver_template.proc_name = (char *)sdebug_proc_name; host_to_add = scsi_debug_add_host; @@ -2609,18 +1754,6 @@ 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) @@ -2681,7 +1814,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 = kmalloc(sizeof(*sdbg_host),GFP_KERNEL); if (NULL == sdbg_host) { printk(KERN_ERR "%s: out of memory at line %d\n", @@ -2689,17 +1822,19 @@ static int sdebug_add_adapter(void) return -ENOMEM; } + memset(sdbg_host, 0, sizeof(*sdbg_host)); INIT_LIST_HEAD(&sdbg_host->dev_info_list); 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 = kmalloc(sizeof(*sdbg_devinfo),GFP_KERNEL); if (NULL == sdbg_devinfo) { printk(KERN_ERR "%s: out of memory at line %d\n", __FUNCTION__, __LINE__); error = -ENOMEM; goto clean; } + memset(sdbg_devinfo, 0, sizeof(*sdbg_devinfo)); sdbg_devinfo->sdbg_host = sdbg_host; list_add_tail(&sdbg_devinfo->dev_list, &sdbg_host->dev_info_list); @@ -2774,7 +1909,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 = SAM2_WLUN_REPORT_LUNS; /* = scsi_debug_max_luns; */ + hpnt->max_lun = scsi_debug_max_luns; error = scsi_add_host(hpnt, &sdbg_host->dev); if (error) { @@ -2828,7 +1963,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 = SAM2_WLUN_REPORT_LUNS; /* scsi_debug_max_luns; */ + hpnt->max_lun = 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 3d0429bc1..84c3937ae 100644 --- a/drivers/scsi/scsi_devinfo.c +++ b/drivers/scsi/scsi_devinfo.c @@ -56,8 +56,6 @@ static struct { {"DENON", "DRD-25X", "V", BLIST_NOLUN}, /* locks up */ {"HITACHI", "DK312C", "CM81", BLIST_NOLUN}, /* responds to all lun */ {"HITACHI", "DK314C", "CR21", BLIST_NOLUN}, /* responds to all lun */ - {"IBM", "2104-DU3", NULL, BLIST_NOLUN}, /* locks up */ - {"IBM", "2104-TU3", NULL, BLIST_NOLUN}, /* locks up */ {"IMS", "CDD521/10", "2.06", BLIST_NOLUN}, /* locks up */ {"MAXTOR", "XT-3280", "PR02", BLIST_NOLUN}, /* locks up */ {"MAXTOR", "XT-4380S", "B3C", BLIST_NOLUN}, /* locks up */ @@ -134,9 +132,7 @@ static struct { {"CMD", "CRA-7280", NULL, BLIST_SPARSELUN}, /* CMD RAID Controller */ {"CNSI", "G7324", NULL, BLIST_SPARSELUN}, /* Chaparral G7324 RAID */ {"CNSi", "G8324", NULL, BLIST_SPARSELUN}, /* Chaparral G8324 RAID */ - {"COMPAQ", "ARRAY CONTROLLER", NULL, BLIST_SPARSELUN | BLIST_LARGELUN | - BLIST_MAX_512 | BLIST_REPORTLUN2}, /* Compaq RA4x00 */ - {"COMPAQ", "LOGICAL VOLUME", NULL, BLIST_FORCELUN | BLIST_MAX_512}, /* Compaq RA4x00 */ + {"COMPAQ", "LOGICAL VOLUME", NULL, BLIST_FORCELUN}, {"COMPAQ", "CR3500", NULL, BLIST_FORCELUN}, {"COMPAQ", "MSA1000", NULL, BLIST_SPARSELUN | BLIST_NOSTARTONADD}, {"COMPAQ", "MSA1000 VOLUME", NULL, BLIST_SPARSELUN | BLIST_NOSTARTONADD}, @@ -159,15 +155,12 @@ 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_REPORTLUN2}, /* HP XP Arrays */ + {"HP", "OPEN-", "*", BLIST_SPARSELUN | BLIST_LARGELUN}, /* HP XP Arrays */ {"HP", "NetRAID-4M", NULL, BLIST_FORCELUN}, {"HP", "HSV100", NULL, BLIST_REPORTLUN2 | BLIST_NOSTARTONADD}, {"HP", "C1557A", NULL, BLIST_FORCELUN}, {"HP", "C3323-300", "4269", BLIST_NOTQ}, - {"HP", "C5713A", NULL, BLIST_NOREPORTLUN}, {"IBM", "AuSaV1S2", NULL, BLIST_FORCELUN}, {"IBM", "ProFibre 4000R", "*", BLIST_SPARSELUN | BLIST_LARGELUN}, {"IBM", "2105", NULL, BLIST_RETRY_HWERROR}, diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c index 3d355d054..ff82ccfbb 100644 --- a/drivers/scsi/scsi_error.c +++ b/drivers/scsi/scsi_error.c @@ -26,13 +26,12 @@ #include #include -#include #include #include #include -#include #include #include +#include #include "scsi_priv.h" #include "scsi_logging.h" @@ -57,28 +56,6 @@ 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. @@ -186,12 +163,16 @@ void scsi_times_out(struct scsi_cmnd *scmd) { scsi_log_completion(scmd, TIMEOUT_ERROR); - if (scmd->device->host->transportt->eh_timed_out) - switch (scmd->device->host->transportt->eh_timed_out(scmd)) { + if (scmd->device->host->hostt->eh_timed_out) + switch (scmd->device->host->hostt->eh_timed_out(scmd)) { case EH_HANDLED: __scsi_done(scmd); return; case EH_RESET_TIMER: + /* This allows a single retry even of a command + * with allowed == 0 */ + if (scmd->retries++ > scmd->allowed) + break; scsi_add_timer(scmd, scmd->timeout_per_command, scsi_times_out); return; @@ -460,72 +441,21 @@ 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, unsigned char *cmnd, - int cmnd_size, int timeout, int copy_sense) +static int scsi_send_eh_cmnd(struct scsi_cmnd *scmd, int timeout) { struct scsi_device *sdev = scmd->device; struct Scsi_Host *shost = sdev->host; - int old_result = scmd->result; - DECLARE_COMPLETION_ONSTACK(done); + DECLARE_COMPLETION(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); @@ -534,6 +464,7 @@ static int scsi_send_eh_cmnd(struct scsi_cmnd *scmd, unsigned char *cmnd, timeleft = wait_for_completion_timeout(&done, timeout); + scmd->request->rq_status = RQ_SCSI_DONE; shost->eh_action = NULL; scsi_log_completion(scmd, SUCCESS); @@ -574,29 +505,6 @@ static int scsi_send_eh_cmnd(struct scsi_cmnd *scmd, unsigned char *cmnd, 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; } @@ -612,9 +520,56 @@ static int scsi_send_eh_cmnd(struct scsi_cmnd *scmd, unsigned char *cmnd, static int scsi_request_sense(struct scsi_cmnd *scmd) { static unsigned char generic_sense[6] = - {REQUEST_SENSE, 0, 0, 0, 252, 0}; + {REQUEST_SENSE, 0, 0, 0, 252, 0}; + unsigned char *scsi_result; + int saved_result; + int rtn; + + memcpy(scmd->cmnd, generic_sense, sizeof(generic_sense)); - return scsi_send_eh_cmnd(scmd, generic_sense, 6, SENSE_TIMEOUT, 1); + 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; } /** @@ -629,13 +584,19 @@ static int scsi_request_sense(struct scsi_cmnd *scmd) * keep a list of pending commands for final completion, and once we * are ready to leave error handling we handle completion for real. **/ -void scsi_eh_finish_cmd(struct scsi_cmnd *scmd, struct list_head *done_q) +static 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); /** * scsi_eh_get_sense - Get device sense data. @@ -737,23 +698,47 @@ 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: - rtn = scsi_send_eh_cmnd(scmd, tur_command, 6, SENSE_TIMEOUT, 0); + memcpy(scmd->cmnd, tur_command, sizeof(tur_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, 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)); - - switch (rtn) { - case NEEDS_RETRY: + if (rtn == SUCCESS) + return 0; + else if (rtn == NEEDS_RETRY) { if (retry_cnt--) goto retry_tur; - /*FALLTHRU*/ - case SUCCESS: return 0; - default: - return 1; } + return 1; } /** @@ -835,16 +820,44 @@ 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) { - int rtn; + if (!scmd->device->allow_restart) + return 1; - rtn = scsi_send_eh_cmnd(scmd, stu_command, 6, - START_UNIT_TIMEOUT, 0); - if (rtn == SUCCESS) - return 0; - } + 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); + + /* + * 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; return 1; } @@ -1412,7 +1425,7 @@ static void scsi_eh_ready_devs(struct Scsi_Host *shost, * @done_q: list_head of processed commands. * **/ -void scsi_eh_flush_done_q(struct list_head *done_q) +static void scsi_eh_flush_done_q(struct list_head *done_q) { struct scsi_cmnd *scmd, *next; @@ -1441,7 +1454,6 @@ void scsi_eh_flush_done_q(struct list_head *done_q) } } } -EXPORT_SYMBOL(scsi_eh_flush_done_q); /** * scsi_unjam_host - Attempt to fix a host which has a cmd that failed. @@ -1507,7 +1519,7 @@ int scsi_error_handler(void *data) */ set_current_state(TASK_INTERRUPTIBLE); while (!kthread_should_stop()) { - if ((shost->host_failed == 0 && shost->host_eh_scheduled == 0) || + if (shost->host_failed == 0 || shost->host_failed != shost->host_busy) { SCSI_LOG_ERROR_RECOVERY(1, printk("Error handler scsi_eh_%d sleeping\n", @@ -1527,8 +1539,8 @@ int scsi_error_handler(void *data) * what we need to do to get it up and online again (if we can). * If we fail, we end up taking the thing offline. */ - if (shost->transportt->eh_strategy_handler) - shost->transportt->eh_strategy_handler(shost); + if (shost->hostt->eh_strategy_handler) + shost->hostt->eh_strategy_handler(shost); else scsi_unjam_host(shost); @@ -1642,24 +1654,27 @@ 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); @@ -1669,10 +1684,6 @@ 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); @@ -1691,22 +1702,6 @@ 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; } @@ -1776,6 +1771,14 @@ 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 32293f451..0bba7d8ee 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 @@ -110,8 +110,11 @@ static int ioctl_internal_command(struct scsi_device *sdev, char *cmd, sshdr.asc, sshdr.ascq); break; case NOT_READY: /* This happens if there is no disc in drive */ - if (sdev->removable) + if (sdev->removable && (cmd[0] != TEST_UNIT_READY)) { + printk(KERN_INFO "Device not ready. Make sure" + " there is a disc in the drive.\n"); break; + } case UNIT_ATTENTION: if (sdev->removable) { sdev->changed = 1; @@ -154,6 +157,181 @@ int scsi_set_medium_removal(struct scsi_device *sdev, char state) } EXPORT_SYMBOL(scsi_set_medium_removal); +/* + * This interface is deprecated - users should use the scsi generic (sg) + * interface instead, as this is a more flexible approach to performing + * generic SCSI commands on a device. + * + * The structure that we are passed should look like: + * + * struct sdata { + * unsigned int inlen; [i] Length of data to be written to device + * unsigned int outlen; [i] Length of data to be read from device + * unsigned char cmd[x]; [i] SCSI command (6 <= x <= 12). + * [o] Data read from device starts here. + * [o] On error, sense buffer starts here. + * unsigned char wdata[y]; [i] Data written to device starts here. + * }; + * Notes: + * - The SCSI command length is determined by examining the 1st byte + * of the given command. There is no way to override this. + * - Data transfers are limited to PAGE_SIZE (4K on i386, 8K on alpha). + * - The length (x + y) must be at least OMAX_SB_LEN bytes long to + * accommodate the sense buffer when an error occurs. + * The sense buffer is truncated to OMAX_SB_LEN (16) bytes so that + * old code will not be surprised. + * - If a Unix error occurs (e.g. ENOMEM) then the user will receive + * a negative return and the Unix error code in 'errno'. + * If the SCSI command succeeds then 0 is returned. + * Positive numbers returned are the compacted SCSI error codes (4 + * bytes in one int) where the lowest byte is the SCSI status. + * See the drivers/scsi/scsi.h file for more information on this. + * + */ +#define OMAX_SB_LEN 16 /* Old sense buffer length */ + +int scsi_ioctl_send_command(struct scsi_device *sdev, + struct scsi_ioctl_command __user *sic) +{ + char *buf; + unsigned char cmd[MAX_COMMAND_SIZE]; + unsigned char sense[SCSI_SENSE_BUFFERSIZE]; + char __user *cmd_in; + unsigned char opcode; + unsigned int inlen, outlen, cmdlen; + unsigned int needed, buf_needed; + int timeout, retries, result; + int data_direction; + gfp_t gfp_mask = GFP_KERNEL; + + if (!sic) + return -EINVAL; + + if (sdev->host->unchecked_isa_dma) + gfp_mask |= GFP_DMA; + + /* + * Verify that we can read at least this much. + */ + if (!access_ok(VERIFY_READ, sic, sizeof(Scsi_Ioctl_Command))) + return -EFAULT; + + if(__get_user(inlen, &sic->inlen)) + return -EFAULT; + + if(__get_user(outlen, &sic->outlen)) + return -EFAULT; + + /* + * We do not transfer more than MAX_BUF with this interface. + * If the user needs to transfer more data than this, they + * should use scsi_generics (sg) instead. + */ + if (inlen > MAX_BUF) + return -EINVAL; + if (outlen > MAX_BUF) + return -EINVAL; + + cmd_in = sic->data; + if(get_user(opcode, cmd_in)) + return -EFAULT; + + needed = buf_needed = (inlen > outlen ? inlen : outlen); + if (buf_needed) { + buf_needed = (buf_needed + 511) & ~511; + if (buf_needed > MAX_BUF) + buf_needed = MAX_BUF; + buf = kmalloc(buf_needed, gfp_mask); + if (!buf) + return -ENOMEM; + memset(buf, 0, buf_needed); + if (inlen == 0) { + data_direction = DMA_FROM_DEVICE; + } else if (outlen == 0 ) { + data_direction = DMA_TO_DEVICE; + } else { + /* + * Can this ever happen? + */ + data_direction = DMA_BIDIRECTIONAL; + } + + } else { + buf = NULL; + data_direction = DMA_NONE; + } + + /* + * Obtain the command from the user's address space. + */ + cmdlen = COMMAND_SIZE(opcode); + + result = -EFAULT; + + if (!access_ok(VERIFY_READ, cmd_in, cmdlen + inlen)) + goto error; + + if(__copy_from_user(cmd, cmd_in, cmdlen)) + goto error; + + /* + * Obtain the data to be sent to the device (if any). + */ + + if(inlen && copy_from_user(buf, cmd_in + cmdlen, inlen)) + goto error; + + switch (opcode) { + case SEND_DIAGNOSTIC: + case FORMAT_UNIT: + timeout = FORMAT_UNIT_TIMEOUT; + retries = 1; + break; + case START_STOP: + timeout = START_STOP_TIMEOUT; + retries = NORMAL_RETRIES; + break; + case MOVE_MEDIUM: + timeout = MOVE_MEDIUM_TIMEOUT; + retries = NORMAL_RETRIES; + break; + case READ_ELEMENT_STATUS: + timeout = READ_ELEMENT_STATUS_TIMEOUT; + retries = NORMAL_RETRIES; + break; + case READ_DEFECT_DATA: + timeout = READ_DEFECT_DATA_TIMEOUT; + retries = 1; + break; + default: + timeout = IOCTL_NORMAL_TIMEOUT; + retries = NORMAL_RETRIES; + break; + } + + result = scsi_execute(sdev, cmd, data_direction, buf, needed, + sense, timeout, retries, 0); + + /* + * If there was an error condition, pass the info back to the user. + */ + if (result) { + int sb_len = sizeof(*sense); + + sb_len = (sb_len > OMAX_SB_LEN) ? OMAX_SB_LEN : sb_len; + if (copy_to_user(cmd_in, sense, sb_len)) + result = -EFAULT; + } else { + if (outlen && copy_to_user(cmd_in, buf, outlen)) + result = -EFAULT; + } + +error: + kfree(buf); + return result; +} +EXPORT_SYMBOL(scsi_ioctl_send_command); + /* * The scsi_ioctl_get_pci() function places into arg the value * pci_dev::slot_name (8 characters) for the PCI device (if any). @@ -232,7 +410,7 @@ int scsi_ioctl(struct scsi_device *sdev, int cmd, void __user *arg) case SCSI_IOCTL_SEND_COMMAND: if (!capable(CAP_SYS_ADMIN) || !capable(CAP_SYS_RAWIO)) return -EACCES; - return sg_scsi_ioctl(NULL, sdev->request_queue, NULL, arg); + return scsi_ioctl_send_command(sdev, arg); case SCSI_IOCTL_DOORLOCK: return scsi_set_medium_removal(sdev, SCSI_REMOVAL_PREVENT); case SCSI_IOCTL_DOORUNLOCK: diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c index 3031078f5..e29f943a8 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 ARRAY_SIZE(scsi_sg_pools) +#define SG_MEMPOOL_NR (sizeof(scsi_sg_pools)/sizeof(struct scsi_host_sg_pool)) #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 = NULL; + req->special = (req->flags & REQ_SPECIAL) ? cmd->sc_request : NULL; scsi_put_command(cmd); } @@ -161,6 +161,72 @@ 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 @@ -220,12 +286,13 @@ int scsi_execute_req(struct scsi_device *sdev, const unsigned char *cmd, int result; if (sshdr) { - sense = kzalloc(SCSI_SENSE_BUFFERSIZE, GFP_NOIO); + sense = kmalloc(SCSI_SENSE_BUFFERSIZE, GFP_NOIO); if (!sense) return DRIVER_ERROR << 24; + memset(sense, 0, SCSI_SENSE_BUFFERSIZE); } result = scsi_execute(sdev, cmd, data_direction, buffer, bufflen, - sense, timeout, retries, 0); + sense, timeout, retries, 0); if (sshdr) scsi_normalize_sense(sense, SCSI_SENSE_BUFFERSIZE, sshdr); @@ -437,16 +504,60 @@ 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 void scsi_init_cmd_errh(struct scsi_cmnd *cmd) +static int 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) @@ -457,7 +568,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_eh_scheduled))) + shost->host_failed)) scsi_eh_wakeup(shost); spin_unlock(shost->host_lock); spin_lock(sdev->request_queue->queue_lock); @@ -764,13 +875,22 @@ 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; } @@ -803,10 +923,11 @@ 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) +void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes, + unsigned int block_bytes) { int result = cmd->result; - int this_count = cmd->request_bufflen; + int this_count = cmd->bufflen; request_queue_t *q = cmd->device->request_queue; struct request *req = cmd->request; int clear_errors = 1; @@ -814,14 +935,28 @@ void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes) int sense_valid = 0; int sense_deferred = 0; - scsi_release_buffers(cmd); + /* + * 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); + } 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) { @@ -841,116 +976,129 @@ 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. */ - 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 (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)); - if (clear_errors) - req->errors = 0; - - /* 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; + 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. + */ - /* good_bytes = 0, or (inclusive) there were leftovers and - * result = 0, so scsi_end_request couldn't retry. + /* + * 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. */ 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); - return; + result = 0; } else { scsi_end_request(cmd, 0, this_count, 1); return; } break; case NOT_READY: - /* If the device is in the process of becoming - * ready, or has a temporary blockage, retry. + /* + * If the device is in the process of becoming ready, + * retry. */ - if (sshdr.asc == 0x04) { - switch (sshdr.ascq) { - case 0x01: /* becoming ready */ - case 0x04: /* format in progress */ - case 0x05: /* rebuild in progress */ - case 0x06: /* recalculation in progress */ - case 0x07: /* operation in progress */ - case 0x08: /* Long write in progress */ - case 0x09: /* self test in progress */ - scsi_requeue_command(q, cmd); - return; - default: - break; - } + if (sshdr.asc == 0x04 && sshdr.ascq == 0x01) { + scsi_requeue_command(q, cmd); + return; } - if (!(req->flags & REQ_QUIET)) { + if (!(req->flags & REQ_QUIET)) scmd_printk(KERN_INFO, cmd, - "Device not ready: "); - scsi_print_sense_hdr("", &sshdr); - } + "Device not ready.\n"); scsi_end_request(cmd, 0, this_count, 1); return; case VOLUME_OVERFLOW: if (!(req->flags & REQ_QUIET)) { scmd_printk(KERN_INFO, cmd, - "Volume overflow, CDB: "); - __scsi_print_command(cmd->cmnd); + "Volume overflow, CDB: "); + __scsi_print_command(cmd->data_cmnd); scsi_print_sense("", cmd); } - /* See SSC3rXX or current. */ - scsi_end_request(cmd, 0, this_count, 1); + scsi_end_request(cmd, 0, block_bytes, 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; @@ -958,13 +1106,21 @@ 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%08x\n", - result); + "SCSI error: return code = 0x%x\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); @@ -1068,7 +1224,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->request_bufflen); + scsi_io_completion(cmd, cmd->bufflen, 0); } static void scsi_setup_blk_pc_cmnd(struct scsi_cmnd *cmd) @@ -1133,7 +1289,15 @@ 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) { - cmd = 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; } else if (req->flags & (REQ_CMD | REQ_BLOCK_PC)) { if(unlikely(specials_only) && !(req->flags & REQ_SPECIAL)) { @@ -1317,8 +1481,6 @@ static inline int scsi_host_queue_ready(struct request_queue *q, static void scsi_kill_request(struct request *req, request_queue_t *q) { struct scsi_cmnd *cmd = req->special; - struct scsi_device *sdev = cmd->device; - struct Scsi_Host *shost = sdev->host; blkdev_dequeue_request(req); @@ -1331,19 +1493,6 @@ static void scsi_kill_request(struct request *req, request_queue_t *q) scsi_init_cmd_errh(cmd); cmd->result = DID_NO_CONNECT << 16; atomic_inc(&cmd->device->iorequest_cnt); - - /* - * SCSI request completion path will do scsi_device_unbusy(), - * bump busy counts. To bump the counters, we need to dance - * with the locks as normal issue path does. - */ - sdev->device_busy++; - spin_unlock(sdev->request_queue->queue_lock); - spin_lock(shost->host_lock); - shost->host_busy++; - spin_unlock(shost->host_lock); - spin_lock(sdev->request_queue->queue_lock); - __scsi_done(cmd); } @@ -1640,8 +1789,9 @@ int __init scsi_init_queue(void) sgp->name); } - sgp->pool = mempool_create_slab_pool(SG_MEMPOOL_SIZE, - sgp->slab); + sgp->pool = mempool_create(SG_MEMPOOL_SIZE, + mempool_alloc_slab, mempool_free_slab, + sgp->slab); if (!sgp->pool) { printk(KERN_ERR "SCSI: can't init sg mempool %s\n", sgp->name); @@ -1663,84 +1813,6 @@ void scsi_exit_queue(void) kmem_cache_destroy(sgp->slab); } } - -/** - * scsi_mode_select - issue a mode select - * @sdev: SCSI device to be queried - * @pf: Page format bit (1 == standard, 0 == vendor specific) - * @sp: Save page bit (0 == don't save, 1 == save) - * @modepage: mode page being requested - * @buffer: request buffer (may not be smaller than eight bytes) - * @len: length of request buffer. - * @timeout: command timeout - * @retries: number of retries before failing - * @data: returns a structure abstracting the mode header data - * @sense: place to put sense data (or NULL if no sense to be collected). - * must be SCSI_SENSE_BUFFERSIZE big. - * - * Returns zero if successful; negative error number or scsi - * status on error - * - */ -int -scsi_mode_select(struct scsi_device *sdev, int pf, int sp, int modepage, - unsigned char *buffer, int len, int timeout, int retries, - struct scsi_mode_data *data, struct scsi_sense_hdr *sshdr) -{ - unsigned char cmd[10]; - unsigned char *real_buffer; - int ret; - - memset(cmd, 0, sizeof(cmd)); - cmd[1] = (pf ? 0x10 : 0) | (sp ? 0x01 : 0); - - if (sdev->use_10_for_ms) { - if (len > 65535) - return -EINVAL; - real_buffer = kmalloc(8 + len, GFP_KERNEL); - if (!real_buffer) - return -ENOMEM; - memcpy(real_buffer + 8, buffer, len); - len += 8; - real_buffer[0] = 0; - real_buffer[1] = 0; - real_buffer[2] = data->medium_type; - real_buffer[3] = data->device_specific; - real_buffer[4] = data->longlba ? 0x01 : 0; - real_buffer[5] = 0; - real_buffer[6] = data->block_descriptor_length >> 8; - real_buffer[7] = data->block_descriptor_length; - - cmd[0] = MODE_SELECT_10; - cmd[7] = len >> 8; - cmd[8] = len; - } else { - if (len > 255 || data->block_descriptor_length > 255 || - data->longlba) - return -EINVAL; - - real_buffer = kmalloc(4 + len, GFP_KERNEL); - if (!real_buffer) - return -ENOMEM; - memcpy(real_buffer + 4, buffer, len); - len += 4; - real_buffer[0] = 0; - real_buffer[1] = data->medium_type; - real_buffer[2] = data->device_specific; - real_buffer[3] = data->block_descriptor_length; - - - cmd[0] = MODE_SELECT; - cmd[4] = len; - } - - ret = scsi_execute_req(sdev, cmd, DMA_TO_DEVICE, real_buffer, len, - sshdr, timeout, retries); - kfree(real_buffer); - return ret; -} -EXPORT_SYMBOL_GPL(scsi_mode_select); - /** * scsi_mode_sense - issue a mode sense, falling back from 10 to * six bytes if necessary. @@ -1762,8 +1834,7 @@ EXPORT_SYMBOL_GPL(scsi_mode_select); int scsi_mode_sense(struct scsi_device *sdev, int dbd, int modepage, unsigned char *buffer, int len, int timeout, int retries, - struct scsi_mode_data *data, struct scsi_sense_hdr *sshdr) -{ + struct scsi_mode_data *data, struct scsi_sense_hdr *sshdr) { unsigned char cmd[12]; int use_10_for_ms; int header_length; @@ -1823,16 +1894,8 @@ scsi_mode_sense(struct scsi_device *sdev, int dbd, int modepage, } if(scsi_status_is_good(result)) { - if (unlikely(buffer[0] == 0x86 && buffer[1] == 0x0b && - (modepage == 6 || modepage == 8))) { - /* Initio breakage? */ - header_length = 0; - data->length = 13; - data->medium_type = 0; - data->device_specific = 0; - data->longlba = 0; - data->block_descriptor_length = 0; - } else if(use_10_for_ms) { + data->header_length = header_length; + if(use_10_for_ms) { data->length = buffer[0]*256 + buffer[1] + 2; data->medium_type = buffer[2]; data->device_specific = buffer[3]; @@ -1845,7 +1908,6 @@ scsi_mode_sense(struct scsi_device *sdev, int dbd, int modepage, data->device_specific = buffer[2]; data->block_descriptor_length = buffer[3]; } - data->header_length = header_length; } return result; @@ -1949,7 +2011,6 @@ 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; @@ -1960,9 +2021,6 @@ 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: @@ -2193,60 +2251,60 @@ scsi_target_unblock(struct device *dev) } EXPORT_SYMBOL_GPL(scsi_target_unblock); + +struct work_queue_work { + struct work_struct work; + void (*fn)(void *); + void *data; +}; + +static void execute_in_process_context_work(void *data) +{ + void (*fn)(void *data); + struct work_queue_work *wqw = data; + + fn = wqw->fn; + data = wqw->data; + + kfree(wqw); + + fn(data); +} + /** - * 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 + * scsi_execute_in_process_context - reliably execute the routine with user context + * @fn: the function to execute + * @data: data to pass to the function + * + * Executes the function immediately if process context is available, + * otherwise schedules the function for delayed execution. * - * Returns virtual address of the start of the mapped page + * Returns: 0 - function was executed + * 1 - function was scheduled for execution + * <0 - error */ -void *scsi_kmap_atomic_sg(struct scatterlist *sg, int sg_count, - size_t *offset, size_t *len) +int scsi_execute_in_process_context(void (*fn)(void *data), void *data) { - int i; - size_t sg_len = 0, len_complete = 0; - struct page *page; + struct work_queue_work *wqw; - 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 (!in_interrupt()) { + fn(data); + return 0; } - 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); + wqw = kmalloc(sizeof(struct work_queue_work), GFP_ATOMIC); + + if (unlikely(!wqw)) { + printk(KERN_ERR "Failed to allocate memory\n"); WARN_ON(1); - return NULL; + return -ENOMEM; } - /* 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); + INIT_WORK(&wqw->work, execute_in_process_context_work, wqw); + wqw->fn = fn; + wqw->data = data; + schedule_work(&wqw->work); -/** - * 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); + return 1; } -EXPORT_SYMBOL(scsi_kunmap_atomic_sg); +EXPORT_SYMBOL_GPL(scsi_execute_in_process_context); diff --git a/drivers/scsi/scsi_logging.h b/drivers/scsi/scsi_logging.h index 1f65139e1..e1722ba94 100644 --- a/drivers/scsi/scsi_logging.h +++ b/drivers/scsi/scsi_logging.h @@ -1,6 +1,7 @@ #ifndef _SCSI_LOGGING_H #define _SCSI_LOGGING_H +#include /* * This defines the scsi logging feature. It is a means by which the user @@ -44,12 +45,10 @@ 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))) \ - do { \ - CMD; \ - } while (0); \ -} while (0) + (CMD); \ +} #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 ae24c85aa..27c48274e 100644 --- a/drivers/scsi/scsi_priv.h +++ b/drivers/scsi/scsi_priv.h @@ -1,15 +1,23 @@ #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 */ @@ -26,6 +34,9 @@ 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 @@ -57,6 +68,7 @@ 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); @@ -115,7 +127,7 @@ extern struct bus_type scsi_bus_type; * classes. */ -#define SCSI_DEVICE_BLOCK_MAX_TIMEOUT 600 /* units in seconds */ +#define SCSI_DEVICE_BLOCK_MAX_TIMEOUT (HZ*60) 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 55200e4fd..07be62bba 100644 --- a/drivers/scsi/scsi_proc.c +++ b/drivers/scsi/scsi_proc.c @@ -266,6 +266,8 @@ 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 @@ -282,13 +284,6 @@ 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_scan.c b/drivers/scsi/scsi_scan.c index 1bd92b9b4..f9ecc3dea 100644 --- a/drivers/scsi/scsi_scan.c +++ b/drivers/scsi/scsi_scan.c @@ -25,6 +25,7 @@ * or a LUN is seen that cannot have a device attached to it. */ +#include #include #include #include @@ -32,11 +33,11 @@ #include #include -#include #include #include #include #include +#include #include #include @@ -204,11 +205,12 @@ static struct scsi_device *scsi_alloc_sdev(struct scsi_target *starget, int display_failure_msg = 1, ret; struct Scsi_Host *shost = dev_to_shost(starget->dev.parent); - sdev = kzalloc(sizeof(*sdev) + shost->transportt->device_size, + sdev = kmalloc(sizeof(*sdev) + shost->transportt->device_size, GFP_ATOMIC); if (!sdev) goto out; + memset(sdev, 0, sizeof(*sdev)); sdev->vendor = scsi_null_device_strs; sdev->model = scsi_null_device_strs; sdev->rev = scsi_null_device_strs; @@ -250,7 +252,6 @@ static struct scsi_device *scsi_alloc_sdev(struct scsi_target *starget, /* release fn is set up in scsi_sysfs_device_initialise, so * have to free and put manually here */ put_device(&starget->dev); - kfree(sdev); goto out; } @@ -287,7 +288,10 @@ static void scsi_target_dev_release(struct device *dev) { struct device *parent = dev->parent; struct scsi_target *starget = to_scsi_target(dev); + struct Scsi_Host *shost = dev_to_shost(parent); + if (shost->hostt->target_destroy) + shost->hostt->target_destroy(starget); kfree(starget); put_device(parent); } @@ -329,13 +333,13 @@ static struct scsi_target *scsi_alloc_target(struct device *parent, + shost->transportt->target_size; struct scsi_target *starget; struct scsi_target *found_target; - int error; - starget = kzalloc(size, GFP_KERNEL); + starget = kmalloc(size, GFP_KERNEL); if (!starget) { printk(KERN_ERR "%s: allocation failure\n", __FUNCTION__); return NULL; } + memset(starget, 0, size); dev = &starget->dev; device_initialize(dev); starget->reap_ref = 1; @@ -347,8 +351,6 @@ static struct scsi_target *scsi_alloc_target(struct device *parent, starget->channel = channel; INIT_LIST_HEAD(&starget->siblings); INIT_LIST_HEAD(&starget->devices); - starget->state = STARGET_RUNNING; - retry: spin_lock_irqsave(shost->host_lock, flags); found_target = __scsi_find_target(parent, channel, id); @@ -359,20 +361,10 @@ static struct scsi_target *scsi_alloc_target(struct device *parent, spin_unlock_irqrestore(shost->host_lock, flags); /* allocate and add */ transport_setup_device(dev); - error = device_add(dev); - if (error) { - dev_err(dev, "target device_add failed, error %d\n", error); - spin_lock_irqsave(shost->host_lock, flags); - list_del_init(&starget->siblings); - spin_unlock_irqrestore(shost->host_lock, flags); - transport_destroy_device(dev); - put_device(parent); - kfree(starget); - return NULL; - } + device_add(dev); transport_add_device(dev); if (shost->hostt->target_alloc) { - error = shost->hostt->target_alloc(starget); + int error = shost->hostt->target_alloc(starget); if(error) { dev_printk(KERN_ERR, dev, "target allocation failed, error %d\n", error); @@ -391,15 +383,8 @@ static struct scsi_target *scsi_alloc_target(struct device *parent, found_target->reap_ref++; spin_unlock_irqrestore(shost->host_lock, flags); put_device(parent); - if (found_target->state != STARGET_DEL) { - kfree(starget); - return found_target; - } - /* Unfortunately, we found a dying target; need to - * wait until it's dead before we can get a new one */ - put_device(&found_target->dev); - flush_scheduled_work(); - goto retry; + kfree(starget); + return found_target; } static void scsi_target_reap_usercontext(void *data) @@ -408,15 +393,21 @@ static void scsi_target_reap_usercontext(void *data) struct Scsi_Host *shost = dev_to_shost(starget->dev.parent); unsigned long flags; - transport_remove_device(&starget->dev); - device_del(&starget->dev); - transport_destroy_device(&starget->dev); spin_lock_irqsave(shost->host_lock, flags); - if (shost->hostt->target_destroy) - shost->hostt->target_destroy(starget); - list_del_init(&starget->siblings); + + if (--starget->reap_ref == 0 && list_empty(&starget->devices)) { + list_del_init(&starget->siblings); + spin_unlock_irqrestore(shost->host_lock, flags); + transport_remove_device(&starget->dev); + device_del(&starget->dev); + transport_destroy_device(&starget->dev); + put_device(&starget->dev); + return; + + } spin_unlock_irqrestore(shost->host_lock, flags); - put_device(&starget->dev); + + return; } /** @@ -430,23 +421,7 @@ static void scsi_target_reap_usercontext(void *data) */ void scsi_target_reap(struct scsi_target *starget) { - struct Scsi_Host *shost = dev_to_shost(starget->dev.parent); - unsigned long flags; - - spin_lock_irqsave(shost->host_lock, flags); - - if (--starget->reap_ref == 0 && list_empty(&starget->devices)) { - BUG_ON(starget->state == STARGET_DEL); - starget->state = STARGET_DEL; - spin_unlock_irqrestore(shost->host_lock, flags); - execute_in_process_context(scsi_target_reap_usercontext, - starget, &starget->ew); - return; - - } - spin_unlock_irqrestore(shost->host_lock, flags); - - return; + scsi_execute_in_process_context(scsi_target_reap_usercontext, starget); } /** @@ -672,7 +647,6 @@ static int scsi_add_lun(struct scsi_device *sdev, char *inq_result, int *bflags) case TYPE_MEDIUM_CHANGER: case TYPE_ENCLOSURE: case TYPE_COMM: - case TYPE_RAID: case TYPE_RBC: sdev->writeable = 1; break; @@ -715,8 +689,12 @@ static int scsi_add_lun(struct scsi_device *sdev, char *inq_result, int *bflags) if (inq_result[7] & 0x10) sdev->sdtr = 1; + sprintf(sdev->devfs_name, "scsi/host%d/bus%d/target%d/lun%d", + sdev->host->host_no, sdev->channel, + sdev->id, sdev->lun); + /* - * End sysfs code. + * End driverfs/devfs code. */ if ((sdev->scsi_level >= SCSI_2) && (inq_result[7] & 2) && @@ -737,13 +715,6 @@ static int scsi_add_lun(struct scsi_device *sdev, char *inq_result, int *bflags) if (*bflags & BLIST_SELECT_NO_ATN) sdev->select_no_atn = 1; - /* - * Maximum 512 sector transfer length - * broken RA4x00 Compaq Disk Array - */ - if (*bflags & BLIST_MAX_512) - blk_queue_max_sectors(sdev->request_queue, 512); - /* * Some devices may not want to have a start command automatically * issued when a device is added. @@ -809,39 +780,12 @@ 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 @@ -906,12 +850,10 @@ 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) && !(bflags & BLIST_ATTACH_PQ3)) { + if ((result[0] >> 5) == 3) { /* * For a Peripheral qualifier 3 (011b), the SCSI * spec says: The device server is not capable of @@ -922,35 +864,9 @@ 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(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; - } - - /* - * Non-standard SCSI targets may set the PDT to 0x1f (unknown or - * no device type) instead of using the Peripheral Qualifier to - * indicate that no LUN is present. For example, USB UFI does this. - */ - if (starget->pdt_1f_for_no_lun && (result[0] & 0x1f) == 0x1f) { SCSI_LOG_SCAN_BUS(3, printk(KERN_INFO - "scsi scan: peripheral device type" - " of 31, no device added\n")); + "scsi scan: peripheral qualifier of 3," + " no device added\n")); res = SCSI_SCAN_TARGET_PRESENT; goto out_free_result; } @@ -961,6 +877,8 @@ 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: @@ -985,6 +903,7 @@ 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 @@ -994,7 +913,8 @@ 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 scsi_level, int rescan) + int bflags, int lun0_res, int scsi_level, + int rescan) { unsigned int sparse_lun, lun, max_dev_lun; struct Scsi_Host *shost = dev_to_shost(starget->dev.parent); @@ -1014,6 +934,13 @@ 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 @@ -1161,13 +1088,10 @@ static int scsi_report_lun_scan(struct scsi_target *starget, int bflags, * Also allow SCSI-2 if BLIST_REPORTLUN2 is set and host adapter does * support more than 8 LUNs. */ - if (bflags & BLIST_NOREPORTLUN) - return 1; - if (starget->scsi_level < SCSI_2 && - starget->scsi_level != SCSI_UNKNOWN) - return 1; - if (starget->scsi_level < SCSI_3 && - (!(bflags & BLIST_REPORTLUN2) || shost->max_lun <= 8)) + if ((bflags & BLIST_NOREPORTLUN) || + starget->scsi_level < SCSI_2 || + (starget->scsi_level < SCSI_3 && + (!(bflags & BLIST_REPORTLUN2) || shost->max_lun <= 8)) ) return 1; if (bflags & BLIST_NOLUN) return 0; @@ -1337,8 +1261,9 @@ static int scsi_report_lun_scan(struct scsi_target *starget, int bflags, struct scsi_device *__scsi_add_device(struct Scsi_Host *shost, uint channel, uint id, uint lun, void *hostdata) { - struct scsi_device *sdev = ERR_PTR(-ENODEV); + struct scsi_device *sdev; struct device *parent = &shost->shost_gendev; + int res; struct scsi_target *starget; starget = scsi_alloc_target(parent, channel, id); @@ -1347,8 +1272,12 @@ struct scsi_device *__scsi_add_device(struct Scsi_Host *shost, uint channel, get_device(&starget->dev); mutex_lock(&shost->scan_mutex); - if (scsi_host_scan_allowed(shost)) - scsi_probe_and_add_lun(starget, lun, NULL, &sdev, 1, hostdata); + if (scsi_host_scan_allowed(shost)) { + res = scsi_probe_and_add_lun(starget, lun, NULL, &sdev, 1, + hostdata); + if (res != SCSI_SCAN_LUN_PRESENT) + sdev = ERR_PTR(-ENODEV); + } mutex_unlock(&shost->scan_mutex); scsi_target_reap(starget); put_device(&starget->dev); @@ -1425,7 +1354,7 @@ static void __scsi_scan_target(struct device *parent, unsigned int channel, * do a sequential scan. */ scsi_sequential_lun_scan(starget, bflags, - starget->scsi_level, rescan); + res, starget->scsi_level, rescan); } out_reap: @@ -1503,7 +1432,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 e7fe565b9..902a5def8 100644 --- a/drivers/scsi/scsi_sysfs.c +++ b/drivers/scsi/scsi_sysfs.c @@ -6,6 +6,7 @@ * Created to pull SCSI mid layer sysfs routines into one file. */ +#include #include #include #include @@ -38,7 +39,7 @@ const char *scsi_device_state_name(enum scsi_device_state state) int i; char *name = NULL; - for (i = 0; i < ARRAY_SIZE(sdev_states); i++) { + for (i = 0; i < sizeof(sdev_states)/sizeof(sdev_states[0]); i++) { if (sdev_states[i].value == state) { name = sdev_states[i].name; break; @@ -64,7 +65,7 @@ const char *scsi_host_state_name(enum scsi_host_state state) int i; char *name = NULL; - for (i = 0; i < ARRAY_SIZE(shost_states); i++) { + for (i = 0; i < sizeof(shost_states)/sizeof(shost_states[0]); i++) { if (shost_states[i].value == state) { name = shost_states[i].name; break; @@ -159,7 +160,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 < ARRAY_SIZE(shost_states); i++) { + for (i = 0; i < sizeof(shost_states)/sizeof(shost_states[0]); i++) { const int len = strlen(shost_states[i].name); if (strncmp(shost_states[i].name, buf, len) == 0 && buf[len] == '\n') { @@ -255,9 +256,7 @@ static void scsi_device_dev_release_usercontext(void *data) static void scsi_device_dev_release(struct device *dev) { - struct scsi_device *sdp = to_scsi_device(dev); - execute_in_process_context(scsi_device_dev_release_usercontext, dev, - &sdp->ew); + scsi_execute_in_process_context(scsi_device_dev_release_usercontext, dev); } static struct class sdev_class = { @@ -285,7 +284,7 @@ static int scsi_bus_suspend(struct device * dev, pm_message_t state) return err; if (sht->suspend) - err = sht->suspend(sdev, state); + err = sht->suspend(sdev); return err; } @@ -465,7 +464,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 < ARRAY_SIZE(sdev_states); i++) { + for (i = 0; i < sizeof(sdev_states)/sizeof(sdev_states[0]); 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 b03aa8510..13ea64119 100644 --- a/drivers/scsi/scsi_transport_fc.c +++ b/drivers/scsi/scsi_transport_fc.c @@ -31,11 +31,8 @@ #include #include #include -#include #include "scsi_priv.h" -static int fc_queue_work(struct Scsi_Host *, struct work_struct *); - /* * Redefine so that we can have same named attributes in the * sdev/starget/host objects. @@ -50,7 +47,7 @@ static const char *get_fc_##title##_name(enum table_type table_key) \ int i; \ char *name = NULL; \ \ - for (i = 0; i < ARRAY_SIZE(table); i++) { \ + for (i = 0; i < sizeof(table)/sizeof(table[0]); i++) { \ if (table[i].value == table_key) { \ name = table[i].name; \ break; \ @@ -65,7 +62,7 @@ static int get_fc_##title##_match(const char *table_key, \ { \ int i; \ \ - for (i = 0; i < ARRAY_SIZE(table); i++) { \ + for (i = 0; i < sizeof(table)/sizeof(table[0]); i++) { \ if (strncmp(table_key, table[i].name, \ table[i].matchlen) == 0) { \ *value = table[i].value; \ @@ -140,7 +137,7 @@ get_fc_##title##_names(u32 table_key, char *buf) \ ssize_t len = 0; \ int i; \ \ - for (i = 0; i < ARRAY_SIZE(table); i++) { \ + for (i = 0; i < sizeof(table)/sizeof(table[0]); i++) { \ if (table[i].value & table_key) { \ len += sprintf(buf + len, "%s%s", \ prefix, table[i].name); \ @@ -215,8 +212,10 @@ fc_bitfield_name_search(remote_port_roles, fc_remote_port_role_names) #define FC_MGMTSRVR_PORTID 0x00000a +static void fc_shost_remove_rports(void *data); static void fc_timeout_deleted_rport(void *data); static void fc_scsi_scan_rport(void *data); +static void fc_rport_terminate(struct fc_rport *rport); /* * Attribute counts pre object type... @@ -288,58 +287,42 @@ static int fc_host_setup(struct transport_container *tc, struct device *dev, struct class_device *cdev) { struct Scsi_Host *shost = dev_to_shost(dev); - struct fc_host_attrs *fc_host = shost_to_fc_host(shost); /* * Set default values easily detected by the midlayer as * failure cases. The scsi lldd is responsible for initializing * all transport attributes to valid values per host. */ - fc_host->node_name = -1; - fc_host->port_name = -1; - fc_host->permanent_port_name = -1; - fc_host->supported_classes = FC_COS_UNSPECIFIED; - memset(fc_host->supported_fc4s, 0, - sizeof(fc_host->supported_fc4s)); - memset(fc_host->symbolic_name, 0, - sizeof(fc_host->symbolic_name)); - fc_host->supported_speeds = FC_PORTSPEED_UNKNOWN; - fc_host->maxframe_size = -1; - memset(fc_host->serial_number, 0, - sizeof(fc_host->serial_number)); - - fc_host->port_id = -1; - fc_host->port_type = FC_PORTTYPE_UNKNOWN; - fc_host->port_state = FC_PORTSTATE_UNKNOWN; - memset(fc_host->active_fc4s, 0, - sizeof(fc_host->active_fc4s)); - fc_host->speed = FC_PORTSPEED_UNKNOWN; - fc_host->fabric_name = -1; - - fc_host->tgtid_bind_type = FC_TGTID_BIND_BY_WWPN; - - INIT_LIST_HEAD(&fc_host->rports); - INIT_LIST_HEAD(&fc_host->rport_bindings); - fc_host->next_rport_number = 0; - fc_host->next_target_id = 0; - - snprintf(fc_host->work_q_name, KOBJ_NAME_LEN, "fc_wq_%d", - shost->host_no); - fc_host->work_q = create_singlethread_workqueue( - fc_host->work_q_name); - if (!fc_host->work_q) - return -ENOMEM; - - snprintf(fc_host->devloss_work_q_name, KOBJ_NAME_LEN, "fc_dl_%d", - shost->host_no); - fc_host->devloss_work_q = create_singlethread_workqueue( - fc_host->devloss_work_q_name); - if (!fc_host->devloss_work_q) { - destroy_workqueue(fc_host->work_q); - fc_host->work_q = NULL; - return -ENOMEM; - } - + fc_host_node_name(shost) = -1; + fc_host_port_name(shost) = -1; + fc_host_permanent_port_name(shost) = -1; + fc_host_supported_classes(shost) = FC_COS_UNSPECIFIED; + memset(fc_host_supported_fc4s(shost), 0, + sizeof(fc_host_supported_fc4s(shost))); + memset(fc_host_symbolic_name(shost), 0, + sizeof(fc_host_symbolic_name(shost))); + fc_host_supported_speeds(shost) = FC_PORTSPEED_UNKNOWN; + fc_host_maxframe_size(shost) = -1; + memset(fc_host_serial_number(shost), 0, + sizeof(fc_host_serial_number(shost))); + + fc_host_port_id(shost) = -1; + fc_host_port_type(shost) = FC_PORTTYPE_UNKNOWN; + fc_host_port_state(shost) = FC_PORTSTATE_UNKNOWN; + memset(fc_host_active_fc4s(shost), 0, + sizeof(fc_host_active_fc4s(shost))); + fc_host_speed(shost) = FC_PORTSPEED_UNKNOWN; + fc_host_fabric_name(shost) = -1; + + fc_host_tgtid_bind_type(shost) = FC_TGTID_BIND_BY_WWPN; + + INIT_LIST_HEAD(&fc_host_rports(shost)); + INIT_LIST_HEAD(&fc_host_rport_bindings(shost)); + fc_host_next_rport_number(shost) = 0; + fc_host_next_target_id(shost) = 0; + + fc_host_flags(shost) = 0; + INIT_WORK(&fc_host_rport_del_work(shost), fc_shost_remove_rports, shost); return 0; } @@ -368,7 +351,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 = 60; /* seconds */ +static unsigned int fc_dev_loss_tmo = SCSI_DEVICE_BLOCK_MAX_TIMEOUT; module_param_named(dev_loss_tmo, fc_dev_loss_tmo, int, S_IRUGO|S_IWUSR); MODULE_PARM_DESC(dev_loss_tmo, @@ -895,9 +878,9 @@ store_fc_private_host_tgtid_bind_type(struct class_device *cdev, while (!list_empty(&fc_host_rport_bindings(shost))) { get_list_head_entry(rport, &fc_host_rport_bindings(shost), peers); - list_del(&rport->peers); - rport->port_state = FC_PORTSTATE_DELETED; - fc_queue_work(shost, &rport->rport_delete_work); + spin_unlock_irqrestore(shost->host_lock, flags); + fc_rport_terminate(rport); + spin_lock_irqsave(shost->host_lock, flags); } spin_unlock_irqrestore(shost->host_lock, flags); } @@ -1107,40 +1090,6 @@ static int fc_rport_match(struct attribute_container *cont, } -/** - * fc_timed_out - FC Transport I/O timeout intercept handler - * - * @scmd: The SCSI command which timed out - * - * This routine protects against error handlers getting invoked while a - * rport is in a blocked state, typically due to a temporarily loss of - * connectivity. If the error handlers are allowed to proceed, requests - * to abort i/o, reset the target, etc will likely fail as there is no way - * to communicate with the device to perform the requested function. These - * failures may result in the midlayer taking the device offline, requiring - * manual intervention to restore operation. - * - * This routine, called whenever an i/o times out, validates the state of - * the underlying rport. If the rport is blocked, it returns - * EH_RESET_TIMER, which will continue to reschedule the timeout. - * Eventually, either the device will return, or devloss_tmo will fire, - * and when the timeout then fires, it will be handled normally. - * If the rport is not blocked, normal error handling continues. - * - * Notes: - * This routine assumes no locks are held on entry. - **/ -static enum scsi_eh_timer_return -fc_timed_out(struct scsi_cmnd *scmd) -{ - struct fc_rport *rport = starget_to_rport(scsi_target(scmd->device)); - - if (rport->port_state == FC_PORTSTATE_BLOCKED) - return EH_RESET_TIMER; - - return EH_NOT_HANDLED; -} - /* * Must be called with shost->host_lock held */ @@ -1166,13 +1115,15 @@ static int fc_user_scan(struct Scsi_Host *shost, uint channel, struct scsi_transport_template * fc_attach_transport(struct fc_function_template *ft) { - int count; - struct fc_internal *i = kzalloc(sizeof(struct fc_internal), + struct fc_internal *i = kmalloc(sizeof(struct fc_internal), GFP_KERNEL); + int count; if (unlikely(!i)) return NULL; + memset(i, 0, sizeof(struct fc_internal)); + i->t.target_attrs.ac.attrs = &i->starget_attrs[0]; i->t.target_attrs.ac.class = &fc_transport_class.class; i->t.target_attrs.ac.match = fc_target_match; @@ -1197,8 +1148,6 @@ fc_attach_transport(struct fc_function_template *ft) /* Transport uses the shost workq for scsi scanning */ i->t.create_work_queue = 1; - i->t.eh_timed_out = fc_timed_out; - i->t.user_scan = fc_user_scan; /* @@ -1278,92 +1227,6 @@ void fc_release_transport(struct scsi_transport_template *t) } EXPORT_SYMBOL(fc_release_transport); -/** - * fc_queue_work - Queue work to the fc_host workqueue. - * @shost: Pointer to Scsi_Host bound to fc_host. - * @work: Work to queue for execution. - * - * Return value: - * 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) -{ - if (unlikely(!fc_host_work_q(shost))) { - printk(KERN_ERR - "ERROR: FC host '%s' attempted to queue work, " - "when no workqueue created.\n", shost->hostt->name); - dump_stack(); - - return -EINVAL; - } - - return queue_work(fc_host_work_q(shost), work); -} - -/** - * fc_flush_work - Flush a fc_host's workqueue. - * @shost: Pointer to Scsi_Host bound to fc_host. - **/ -static void -fc_flush_work(struct Scsi_Host *shost) -{ - if (!fc_host_work_q(shost)) { - printk(KERN_ERR - "ERROR: FC host '%s' attempted to flush work, " - "when no workqueue created.\n", shost->hostt->name); - dump_stack(); - return; - } - - flush_workqueue(fc_host_work_q(shost)); -} - -/** - * fc_queue_devloss_work - Schedule work for the fc_host devloss workqueue. - * @shost: Pointer to Scsi_Host bound to fc_host. - * @work: Work to queue for execution. - * @delay: jiffies to delay the work queuing - * - * Return value: - * 0 on success / != 0 for error - **/ -static int -fc_queue_devloss_work(struct Scsi_Host *shost, struct work_struct *work, - unsigned long delay) -{ - if (unlikely(!fc_host_devloss_work_q(shost))) { - printk(KERN_ERR - "ERROR: FC host '%s' attempted to queue work, " - "when no workqueue created.\n", shost->hostt->name); - dump_stack(); - - return -EINVAL; - } - - return queue_delayed_work(fc_host_devloss_work_q(shost), work, delay); -} - -/** - * fc_flush_devloss - Flush a fc_host's devloss workqueue. - * @shost: Pointer to Scsi_Host bound to fc_host. - **/ -static void -fc_flush_devloss(struct Scsi_Host *shost) -{ - if (!fc_host_devloss_work_q(shost)) { - printk(KERN_ERR - "ERROR: FC host '%s' attempted to flush work, " - "when no workqueue created.\n", shost->hostt->name); - dump_stack(); - return; - } - - flush_workqueue(fc_host_devloss_work_q(shost)); -} - /** * fc_remove_host - called to terminate any fc_transport-related elements @@ -1385,102 +1248,36 @@ void fc_remove_host(struct Scsi_Host *shost) { struct fc_rport *rport, *next_rport; - struct workqueue_struct *work_q; - struct fc_host_attrs *fc_host = shost_to_fc_host(shost); /* Remove any remote ports */ list_for_each_entry_safe(rport, next_rport, - &fc_host->rports, peers) { - list_del(&rport->peers); - rport->port_state = FC_PORTSTATE_DELETED; - fc_queue_work(shost, &rport->rport_delete_work); - } - + &fc_host_rports(shost), peers) + fc_rport_terminate(rport); list_for_each_entry_safe(rport, next_rport, - &fc_host->rport_bindings, peers) { - list_del(&rport->peers); - rport->port_state = FC_PORTSTATE_DELETED; - fc_queue_work(shost, &rport->rport_delete_work); - } - - /* flush all scan work items */ - scsi_flush_work(shost); - - /* flush all stgt delete, and rport delete work items, then kill it */ - if (fc_host->work_q) { - work_q = fc_host->work_q; - fc_host->work_q = NULL; - destroy_workqueue(work_q); - } - - /* flush all devloss work items, then kill it */ - if (fc_host->devloss_work_q) { - work_q = fc_host->devloss_work_q; - fc_host->devloss_work_q = NULL; - destroy_workqueue(work_q); - } + &fc_host_rport_bindings(shost), peers) + fc_rport_terminate(rport); } EXPORT_SYMBOL(fc_remove_host); - -/** - * fc_starget_delete - called to delete the scsi decendents of an rport - * (target and all sdevs) - * - * @data: remote port to be operated on. - **/ -static void -fc_starget_delete(void *data) -{ - struct fc_rport *rport = (struct fc_rport *)data; - struct Scsi_Host *shost = rport_to_shost(rport); - unsigned long flags; - - spin_lock_irqsave(shost->host_lock, flags); - if (rport->flags & FC_RPORT_DEVLOSS_PENDING) { - spin_unlock_irqrestore(shost->host_lock, flags); - if (!cancel_delayed_work(&rport->dev_loss_work)) - fc_flush_devloss(shost); - spin_lock_irqsave(shost->host_lock, flags); - rport->flags &= ~FC_RPORT_DEVLOSS_PENDING; - } - spin_unlock_irqrestore(shost->host_lock, flags); - - scsi_remove_target(&rport->dev); -} - - -/** - * fc_rport_final_delete - finish rport termination and delete it. - * - * @data: remote port to be deleted. - **/ +/* + * fc_rport_tgt_remove - Removes the scsi target on the remote port + * @rport: The remote port to be operated on + */ static void -fc_rport_final_delete(void *data) +fc_rport_tgt_remove(struct fc_rport *rport) { - struct fc_rport *rport = (struct fc_rport *)data; - struct device *dev = &rport->dev; struct Scsi_Host *shost = rport_to_shost(rport); - /* Delete SCSI target and sdevs */ - if (rport->scsi_target_id != -1) - fc_starget_delete(data); + scsi_target_unblock(&rport->dev); - /* - * if a scan is pending, flush the SCSI Host work_q so that - * that we can reclaim the rport scan work element. - */ - if (rport->flags & FC_RPORT_SCAN_PENDING) - scsi_flush_work(shost); + /* Stop anything on the workq */ + if (!cancel_delayed_work(&rport->dev_loss_work)) + flush_scheduled_work(); + scsi_flush_work(shost); - transport_remove_device(dev); - device_del(dev); - transport_destroy_device(dev); - put_device(&shost->shost_gendev); /* for fc_host->rport list */ - put_device(dev); /* for self-reference */ + scsi_remove_target(&rport->dev); } - /** * fc_rport_create - allocates and creates a remote FC port. * @shost: scsi host the remote port is connected to. @@ -1498,7 +1295,8 @@ struct fc_rport * fc_rport_create(struct Scsi_Host *shost, int channel, struct fc_rport_identifiers *ids) { - struct fc_host_attrs *fc_host = shost_to_fc_host(shost); + struct fc_host_attrs *fc_host = + (struct fc_host_attrs *)shost->shost_data; struct fc_internal *fci = to_fc_internal(shost->transportt); struct fc_rport *rport; struct device *dev; @@ -1507,11 +1305,12 @@ fc_rport_create(struct Scsi_Host *shost, int channel, size_t size; size = (sizeof(struct fc_rport) + fci->f->dd_fcrport_size); - rport = kzalloc(size, GFP_KERNEL); + rport = kmalloc(size, GFP_KERNEL); if (unlikely(!rport)) { printk(KERN_ERR "%s: allocation failure\n", __FUNCTION__); return NULL; } + memset(rport, 0, size); rport->maxframe_size = -1; rport->supported_classes = FC_COS_UNSPECIFIED; @@ -1527,8 +1326,6 @@ fc_rport_create(struct Scsi_Host *shost, int channel, INIT_WORK(&rport->dev_loss_work, fc_timeout_deleted_rport, rport); INIT_WORK(&rport->scan_work, fc_scsi_scan_rport, rport); - INIT_WORK(&rport->stgt_delete_work, fc_starget_delete, rport); - INIT_WORK(&rport->rport_delete_work, fc_rport_final_delete, rport); spin_lock_irqsave(shost->host_lock, flags); @@ -1537,14 +1334,14 @@ fc_rport_create(struct Scsi_Host *shost, int channel, rport->scsi_target_id = fc_host->next_target_id++; else rport->scsi_target_id = -1; - list_add_tail(&rport->peers, &fc_host->rports); - get_device(&shost->shost_gendev); /* for fc_host->rport list */ + list_add_tail(&rport->peers, &fc_host_rports(shost)); + get_device(&shost->shost_gendev); spin_unlock_irqrestore(shost->host_lock, flags); dev = &rport->dev; - device_initialize(dev); /* takes self reference */ - dev->parent = get_device(&shost->shost_gendev); /* parent reference */ + device_initialize(dev); + dev->parent = get_device(&shost->shost_gendev); dev->release = fc_rport_dev_release; sprintf(dev->bus_id, "rport-%d:%d-%d", shost->host_no, channel, rport->number); @@ -1558,19 +1355,18 @@ fc_rport_create(struct Scsi_Host *shost, int channel, transport_add_device(dev); transport_configure_device(dev); - if (rport->roles & FC_RPORT_ROLE_FCP_TARGET) { + if (rport->roles & FC_RPORT_ROLE_FCP_TARGET) /* initiate a scan of the target */ - rport->flags |= FC_RPORT_SCAN_PENDING; scsi_queue_work(shost, &rport->scan_work); - } return rport; 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); /* for fc_host->rport list */ + put_device(&shost->shost_gendev); spin_unlock_irqrestore(shost->host_lock, flags); put_device(dev->parent); kfree(rport); @@ -1621,14 +1417,10 @@ fc_remote_port_add(struct Scsi_Host *shost, int channel, struct fc_rport_identifiers *ids) { struct fc_internal *fci = to_fc_internal(shost->transportt); - struct fc_host_attrs *fc_host = shost_to_fc_host(shost); struct fc_rport *rport; unsigned long flags; int match = 0; - /* ensure any stgt delete functions are done */ - fc_flush_work(shost); - /* * Search the list of "active" rports, for an rport that has been * deleted, but we've held off the real delete while the target @@ -1636,12 +1428,12 @@ fc_remote_port_add(struct Scsi_Host *shost, int channel, */ spin_lock_irqsave(shost->host_lock, flags); - list_for_each_entry(rport, &fc_host->rports, peers) { + list_for_each_entry(rport, &fc_host_rports(shost), peers) { if ((rport->port_state == FC_PORTSTATE_BLOCKED) && (rport->channel == channel)) { - switch (fc_host->tgtid_bind_type) { + switch (fc_host_tgtid_bind_type(shost)) { case FC_TGTID_BIND_BY_WWPN: case FC_TGTID_BIND_NONE: if (rport->port_name == ids->port_name) @@ -1695,36 +1487,27 @@ fc_remote_port_add(struct Scsi_Host *shost, int channel, * transaction. */ if (!cancel_delayed_work(work)) - fc_flush_devloss(shost); - - spin_lock_irqsave(shost->host_lock, flags); - - rport->flags &= ~FC_RPORT_DEVLOSS_PENDING; + flush_scheduled_work(); /* 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); - - scsi_target_unblock(&rport->dev); - return rport; } } } /* Search the bindings array */ - if (fc_host->tgtid_bind_type != FC_TGTID_BIND_NONE) { + if (fc_host_tgtid_bind_type(shost) != FC_TGTID_BIND_NONE) { /* search for a matching consistent binding */ - list_for_each_entry(rport, &fc_host->rport_bindings, + list_for_each_entry(rport, &fc_host_rport_bindings(shost), peers) { if (rport->channel != channel) continue; - switch (fc_host->tgtid_bind_type) { + switch (fc_host_tgtid_bind_type(shost)) { case FC_TGTID_BIND_BY_WWPN: if (rport->port_name == ids->port_name) match = 1; @@ -1742,7 +1525,8 @@ fc_remote_port_add(struct Scsi_Host *shost, int channel, } if (match) { - list_move_tail(&rport->peers, &fc_host->rports); + list_move_tail(&rport->peers, + &fc_host_rports(shost)); break; } } @@ -1756,18 +1540,15 @@ fc_remote_port_add(struct Scsi_Host *shost, int channel, rport->roles = ids->roles; rport->port_state = FC_PORTSTATE_ONLINE; + spin_unlock_irqrestore(shost->host_lock, flags); + if (fci->f->dd_fcrport_size) memset(rport->dd_data, 0, fci->f->dd_fcrport_size); - if (rport->roles & FC_RPORT_ROLE_FCP_TARGET) { + if (rport->roles & FC_RPORT_ROLE_FCP_TARGET) /* 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); - scsi_target_unblock(&rport->dev); - } else - spin_unlock_irqrestore(shost->host_lock, flags); return rport; } @@ -1782,6 +1563,30 @@ fc_remote_port_add(struct Scsi_Host *shost, int channel, } EXPORT_SYMBOL(fc_remote_port_add); +/* + * fc_rport_terminate - this routine tears down and deallocates a remote port. + * @rport: The remote port to be terminated + * + * Notes: + * This routine assumes no locks are held on entry. + */ +static void +fc_rport_terminate(struct fc_rport *rport) +{ + struct Scsi_Host *shost = rport_to_shost(rport); + struct device *dev = &rport->dev; + unsigned long flags; + + fc_rport_tgt_remove(rport); + + transport_remove_device(dev); + device_del(dev); + transport_destroy_device(dev); + spin_lock_irqsave(shost->host_lock, flags); + list_del(&rport->peers); + spin_unlock_irqrestore(shost->host_lock, flags); + put_device(&shost->shost_gendev); +} /** * fc_remote_port_delete - notifies the fc transport that a remote @@ -1836,39 +1641,20 @@ EXPORT_SYMBOL(fc_remote_port_add); void fc_remote_port_delete(struct fc_rport *rport) { - struct Scsi_Host *shost = rport_to_shost(rport); int timeout = rport->dev_loss_tmo; - unsigned long flags; - - /* - * No need to flush the fc_host work_q's, as all adds are synchronous. - * - * We do need to reclaim the rport scan work element, so eventually - * (in fc_rport_final_delete()) we'll flush the scsi host work_q if - * there's still a scan pending. - */ - - spin_lock_irqsave(shost->host_lock, flags); /* If no scsi target id mapping, delete it */ if (rport->scsi_target_id == -1) { - list_del(&rport->peers); - rport->port_state = FC_PORTSTATE_DELETED; - fc_queue_work(shost, &rport->rport_delete_work); - spin_unlock_irqrestore(shost->host_lock, flags); + fc_rport_terminate(rport); return; } - rport->port_state = FC_PORTSTATE_BLOCKED; - - rport->flags |= FC_RPORT_DEVLOSS_PENDING; - - spin_unlock_irqrestore(shost->host_lock, flags); - scsi_target_block(&rport->dev); /* cap the length the devices can be blocked until they are deleted */ - fc_queue_devloss_work(shost, &rport->dev_loss_work, timeout * HZ); + schedule_delayed_work(&rport->dev_loss_work, timeout * HZ); + + rport->port_state = FC_PORTSTATE_BLOCKED; } EXPORT_SYMBOL(fc_remote_port_delete); @@ -1896,7 +1682,8 @@ void fc_remote_port_rolechg(struct fc_rport *rport, u32 roles) { struct Scsi_Host *shost = rport_to_shost(rport); - struct fc_host_attrs *fc_host = shost_to_fc_host(shost); + struct fc_host_attrs *fc_host = + (struct fc_host_attrs *)shost->shost_data; unsigned long flags; int create = 0; @@ -1908,11 +1695,10 @@ fc_remote_port_rolechg(struct fc_rport *rport, u32 roles) } else if (!(rport->roles & FC_RPORT_ROLE_FCP_TARGET)) create = 1; } + spin_unlock_irqrestore(shost->host_lock, flags); rport->roles = roles; - spin_unlock_irqrestore(shost->host_lock, flags); - if (create) { /* * There may have been a delete timer running on the @@ -1927,21 +1713,10 @@ fc_remote_port_rolechg(struct fc_rport *rport, u32 roles) * transaction. */ if (!cancel_delayed_work(&rport->dev_loss_work)) - fc_flush_devloss(shost); - - spin_lock_irqsave(shost->host_lock, flags); - rport->flags &= ~FC_RPORT_DEVLOSS_PENDING; - spin_unlock_irqrestore(shost->host_lock, flags); - - /* ensure any stgt delete functions are done */ - fc_flush_work(shost); + flush_scheduled_work(); /* initiate a scan of the target */ - spin_lock_irqsave(shost->host_lock, flags); - 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); @@ -1958,25 +1733,22 @@ fc_timeout_deleted_rport(void *data) { struct fc_rport *rport = (struct fc_rport *)data; struct Scsi_Host *shost = rport_to_shost(rport); - struct fc_host_attrs *fc_host = shost_to_fc_host(shost); unsigned long flags; spin_lock_irqsave(shost->host_lock, flags); - rport->flags &= ~FC_RPORT_DEVLOSS_PENDING; - /* - * If the port is ONLINE, then it came back. Validate it's still an - * FCP target. If not, tear down the scsi_target on it. + * If the port is ONLINE, then it came back, but was no longer an + * FCP target. Thus we need to tear down the scsi_target on it. */ - if ((rport->port_state == FC_PORTSTATE_ONLINE) && - !(rport->roles & FC_RPORT_ROLE_FCP_TARGET)) { - dev_printk(KERN_ERR, &rport->dev, - "blocked FC remote port time out: no longer" - " a FCP target, removing starget\n"); + if (rport->port_state == FC_PORTSTATE_ONLINE) { spin_unlock_irqrestore(shost->host_lock, flags); - scsi_target_unblock(&rport->dev); - fc_queue_work(shost, &rport->stgt_delete_work); + + dev_printk(KERN_ERR, &rport->dev, + "blocked FC remote port time out: removing target\n"); + + fc_rport_tgt_remove(rport); + return; } @@ -1987,13 +1759,11 @@ fc_timeout_deleted_rport(void *data) return; } - if (fc_host->tgtid_bind_type == FC_TGTID_BIND_NONE) { - list_del(&rport->peers); - rport->port_state = FC_PORTSTATE_DELETED; + if (fc_host_tgtid_bind_type(shost) == FC_TGTID_BIND_NONE) { + spin_unlock_irqrestore(shost->host_lock, flags); dev_printk(KERN_ERR, &rport->dev, "blocked FC remote port time out: removing target\n"); - fc_queue_work(shost, &rport->rport_delete_work); - spin_unlock_irqrestore(shost->host_lock, flags); + fc_rport_terminate(rport); return; } @@ -2001,7 +1771,7 @@ fc_timeout_deleted_rport(void *data) "blocked FC remote port time out: removing target and " "saving binding\n"); - list_move_tail(&rport->peers, &fc_host->rport_bindings); + list_move_tail(&rport->peers, &fc_host_rport_bindings(shost)); /* * Note: We do not remove or clear the hostdata area. This allows @@ -2015,10 +1785,10 @@ fc_timeout_deleted_rport(void *data) rport->maxframe_size = -1; rport->supported_classes = FC_COS_UNSPECIFIED; rport->roles = FC_RPORT_ROLE_UNKNOWN; - rport->port_state = FC_PORTSTATE_NOTPRESENT; + rport->port_state = FC_PORTSTATE_DELETED; /* remove the identifiers that aren't used in the consisting binding */ - switch (fc_host->tgtid_bind_type) { + switch (fc_host_tgtid_bind_type(shost)) { case FC_TGTID_BIND_BY_WWPN: rport->node_name = -1; rport->port_id = -1; @@ -2039,33 +1809,71 @@ fc_timeout_deleted_rport(void *data) * As this only occurs if the remote port (scsi target) * went away and didn't come back - we'll remove * all attached scsi devices. + * + * We'll schedule the shost work item to perform the actual removal + * to avoid recursion in the different flush calls if we perform + * the removal in each target - and there are lots of targets + * whose timeouts fire at the same time. */ - spin_unlock_irqrestore(shost->host_lock, flags); - scsi_target_unblock(&rport->dev); - fc_queue_work(shost, &rport->stgt_delete_work); + if ( !(fc_host_flags(shost) & FC_SHOST_RPORT_DEL_SCHEDULED)) { + fc_host_flags(shost) |= FC_SHOST_RPORT_DEL_SCHEDULED; + scsi_queue_work(shost, &fc_host_rport_del_work(shost)); + } + + spin_unlock_irqrestore(shost->host_lock, flags); } /** * 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 fc_scsi_scan_rport(void *data) { struct fc_rport *rport = (struct fc_rport *)data; - struct Scsi_Host *shost = rport_to_shost(rport); - unsigned long flags; - if ((rport->port_state == FC_PORTSTATE_ONLINE) && - (rport->roles & FC_RPORT_ROLE_FCP_TARGET)) { - scsi_scan_target(&rport->dev, rport->channel, - rport->scsi_target_id, SCAN_WILD_CARD, 1); - } + scsi_target_unblock(&rport->dev); + scsi_scan_target(&rport->dev, rport->channel, rport->scsi_target_id, + SCAN_WILD_CARD, 1); +} + + +/** + * fc_shost_remove_rports - called to remove all rports that are marked + * as in a deleted (not connected) state. + * + * @data: shost whose rports are to be looked at + **/ +static void +fc_shost_remove_rports(void *data) +{ + struct Scsi_Host *shost = (struct Scsi_Host *)data; + struct fc_rport *rport, *next_rport; + unsigned long flags; spin_lock_irqsave(shost->host_lock, flags); - rport->flags &= ~FC_RPORT_SCAN_PENDING; + while (fc_host_flags(shost) & FC_SHOST_RPORT_DEL_SCHEDULED) { + + fc_host_flags(shost) &= ~FC_SHOST_RPORT_DEL_SCHEDULED; + +restart_search: + list_for_each_entry_safe(rport, next_rport, + &fc_host_rport_bindings(shost), peers) { + if (rport->port_state == FC_PORTSTATE_DELETED) { + rport->port_state = FC_PORTSTATE_NOTPRESENT; + spin_unlock_irqrestore(shost->host_lock, flags); + fc_rport_tgt_remove(rport); + spin_lock_irqsave(shost->host_lock, flags); + goto restart_search; + } + } + + } spin_unlock_irqrestore(shost->host_lock, flags); } diff --git a/drivers/scsi/scsi_transport_iscsi.c b/drivers/scsi/scsi_transport_iscsi.c index 2ecd14188..71e54a64a 100644 --- a/drivers/scsi/scsi_transport_iscsi.c +++ b/drivers/scsi/scsi_transport_iscsi.c @@ -31,27 +31,31 @@ #include #include -#define ISCSI_SESSION_ATTRS 11 -#define ISCSI_CONN_ATTRS 11 -#define ISCSI_HOST_ATTRS 0 -#define ISCSI_TRANSPORT_VERSION "1.1-646" +#define ISCSI_SESSION_ATTRS 8 +#define ISCSI_CONN_ATTRS 6 struct iscsi_internal { - int daemon_pid; struct scsi_transport_template t; struct iscsi_transport *iscsi_transport; struct list_head list; - struct class_device cdev; + /* + * 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_attribute *host_attrs[ISCSI_HOST_ATTRS + 1]; + struct class_device cdev; + /* + * We do not have any private or other attrs. + */ 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 @@ -116,24 +120,6 @@ 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, @@ -147,6 +133,7 @@ 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 { @@ -178,23 +165,14 @@ static DEFINE_SPINLOCK(sesslock); static LIST_HEAD(connlist); static DEFINE_SPINLOCK(connlock); -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) +static struct iscsi_cls_session *iscsi_session_lookup(uint64_t handle) { unsigned long flags; struct iscsi_cls_session *sess; spin_lock_irqsave(&sesslock, flags); list_for_each_entry(sess, &sesslist, sess_list) { - if (sess->sid == sid) { + if (sess == iscsi_ptr(handle)) { spin_unlock_irqrestore(&sesslock, flags); return sess; } @@ -203,17 +181,14 @@ static struct iscsi_cls_session *iscsi_session_lookup(uint32_t sid) return NULL; } -/* - * Returns the matching connection to a given sid / cid tuple - */ -static struct iscsi_cls_conn *iscsi_conn_lookup(uint32_t sid, uint32_t cid) +static struct iscsi_cls_conn *iscsi_conn_lookup(uint64_t handle) { unsigned long flags; struct iscsi_cls_conn *conn; spin_lock_irqsave(&connlock, flags); list_for_each_entry(conn, &connlist, conn_list) { - if ((conn->cid == cid) && (iscsi_conn_get_sid(conn) == sid)) { + if (conn == iscsi_ptr(handle)) { spin_unlock_irqrestore(&connlock, flags); return conn; } @@ -229,11 +204,13 @@ static struct iscsi_cls_conn *iscsi_conn_lookup(uint32_t sid, uint32_t cid) 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) @@ -241,163 +218,50 @@ static int iscsi_is_session_dev(const struct device *dev) return dev->release == iscsi_session_release; } -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); - +/** + * 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_alloc_session(struct Scsi_Host *shost, - struct iscsi_transport *transport) +iscsi_create_session(struct Scsi_Host *shost, struct iscsi_transport *transport) { struct iscsi_cls_session *session; + int err; - session = kzalloc(sizeof(*session) + transport->sessiondata_size, - GFP_KERNEL); - if (!session) + if (!try_module_get(transport->owner)) 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; - 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); + err = device_register(&session->dev); if (err) { dev_printk(KERN_ERR, &session->dev, "iscsi: could not " "register session's dev\n"); - goto release_host; + goto free_session; } transport_register_device(&session->dev); - mutex_lock(&ihost->mutex); - list_add(&session->host_list, &ihost->sessions); - mutex_unlock(&ihost->mutex); - return 0; - -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); +free_session: + kfree(session); +module_put: + module_put(transport->owner); + return NULL; } -EXPORT_SYMBOL_GPL(iscsi_free_session); +EXPORT_SYMBOL_GPL(iscsi_create_session); /** * iscsi_destroy_session - destroy iscsi session @@ -408,65 +272,18 @@ EXPORT_SYMBOL_GPL(iscsi_free_session); **/ int iscsi_destroy_session(struct iscsi_cls_session *session) { - iscsi_remove_session(session); - iscsi_free_session(session); + transport_unregister_device(&session->dev); + device_unregister(&session->dev); 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; -} +EXPORT_SYMBOL_GPL(iscsi_destroy_session); 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); } @@ -476,31 +293,6 @@ 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 @@ -509,16 +301,12 @@ static int iscsi_create_event_pools(struct iscsi_cls_conn *conn) * 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; @@ -531,17 +319,12 @@ 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_pools; - + goto free_conn; snprintf(conn->dev.bus_id, BUS_ID_SIZE, "connection%d:%u", - session->sid, cid); + shost->host_no, cid); conn->dev.parent = &session->dev; conn->dev.release = iscsi_conn_release; err = device_register(&conn->dev); @@ -555,8 +338,6 @@ 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; @@ -579,6 +360,105 @@ 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 */ @@ -604,6 +484,20 @@ 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) { @@ -623,6 +517,37 @@ 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) { @@ -635,34 +560,13 @@ mempool_zone_get_skb(struct mempool_zone *zone) } static int -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) +iscsi_unicast_skb(struct mempool_zone *zone, struct sk_buff *skb) { unsigned long flags; int rc; skb_get(skb); - rc = netlink_unicast(nls, skb, pid, MSG_DONTWAIT); + rc = netlink_unicast(nls, skb, daemon_pid, MSG_DONTWAIT); if (rc < 0) { mempool_free(skb, zone->pool); printk(KERN_ERR "iscsi: can not unicast skb (%d)\n", rc); @@ -670,7 +574,6 @@ iscsi_unicast_skb(struct mempool_zone *zone, struct sk_buff *skb, int pid) } 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); @@ -684,14 +587,9 @@ 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); @@ -702,20 +600,19 @@ int iscsi_recv_pdu(struct iscsi_cls_conn *conn, struct iscsi_hdr *hdr, return -ENOMEM; } - nlh = __nlmsg_put(skb, priv->daemon_pid, 0, 0, (len - sizeof(*nlh)), 0); + nlh = __nlmsg_put(skb, 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.cid = conn->cid; - ev->r.recv_req.sid = iscsi_conn_get_sid(conn); + ev->r.recv_req.conn_handle = iscsi_handle(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, priv->daemon_pid); + return iscsi_unicast_skb(conn->z_pdu, skb); } EXPORT_SYMBOL_GPL(iscsi_recv_pdu); @@ -724,13 +621,8 @@ 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); @@ -740,17 +632,16 @@ void iscsi_conn_error(struct iscsi_cls_conn *conn, enum iscsi_err error) return; } - nlh = __nlmsg_put(skb, priv->daemon_pid, 0, 0, (len - sizeof(*nlh)), 0); + nlh = __nlmsg_put(skb, 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.cid = conn->cid; - ev->r.connerror.sid = iscsi_conn_get_sid(conn); + ev->r.connerror.conn_handle = iscsi_handle(conn); - iscsi_broadcast_skb(conn->z_error, skb, GFP_ATOMIC); + iscsi_unicast_skb(conn->z_error, skb); dev_printk(KERN_INFO, &conn->dev, "iscsi: detected conn error (%d)\n", error); @@ -780,7 +671,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, pid); + return iscsi_unicast_skb(z_reply, skb); } static int @@ -792,18 +683,13 @@ 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; - priv = iscsi_if_transport_lookup(transport); - if (!priv) - return -EINVAL; - - conn = iscsi_conn_lookup(ev->u.get_stats.sid, ev->u.get_stats.cid); + conn = iscsi_conn_lookup(ev->u.get_stats.conn_handle); if (!conn) return -EEXIST; @@ -819,7 +705,7 @@ iscsi_if_get_stats(struct iscsi_transport *transport, struct nlmsghdr *nlh) return -ENOMEM; } - nlhstat = __nlmsg_put(skbstat, priv->daemon_pid, 0, 0, + nlhstat = __nlmsg_put(skbstat, daemon_pid, 0, 0, (len - sizeof(*nlhstat)), 0); evstat = NLMSG_DATA(nlhstat); memset(evstat, 0, sizeof(*evstat)); @@ -827,10 +713,8 @@ 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.cid = - ev->u.get_stats.cid; - evstat->u.get_stats.sid = - ev->u.get_stats.sid; + evstat->u.get_stats.conn_handle = + ev->u.get_stats.conn_handle; stats = (struct iscsi_stats *) ((char*)evstat + sizeof(*evstat)); memset(stats, 0, sizeof(*stats)); @@ -845,157 +729,27 @@ 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, priv->daemon_pid); + err = iscsi_unicast_skb(conn->z_pdu, skbstat); } 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; - unsigned long flags; - uint32_t hostno; + uint32_t sid; - session = transport->create_session(transport, &priv->t, + session = transport->create_session(&priv->t, ev->u.c_session.initial_cmdsn, - &hostno); + &sid); if (!session) return -ENOMEM; - 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; + ev->r.c_session_ret.session_handle = iscsi_handle(session); + ev->r.c_session_ret.sid = sid; return 0; } @@ -1006,23 +760,35 @@ 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.sid); - if (!session) { - printk(KERN_ERR "iscsi: invalid session %d\n", - ev->u.c_conn.sid); + session = iscsi_session_lookup(ev->u.c_conn.session_handle); + if (!session) return -EINVAL; - } conn = transport->create_conn(session, ev->u.c_conn.cid); - if (!conn) { - printk(KERN_ERR "iscsi: couldn't create a new " - "connection for session %d\n", - session->sid); + if (!conn) 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.c_conn_ret.sid = session->sid; - ev->r.c_conn_ret.cid = conn->cid; + ev->r.handle = iscsi_handle(conn); spin_lock_irqsave(&connlock, flags); list_add(&conn->conn_list, &connlist); @@ -1030,6 +796,13 @@ 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 @@ -1037,8 +810,9 @@ 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.sid, ev->u.d_conn.cid); + conn = iscsi_conn_lookup(ev->u.d_conn.conn_handle); if (!conn) return -EINVAL; spin_lock_irqsave(&connlock, flags); @@ -1046,85 +820,16 @@ 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; -} - -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; - - 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; + mempool_zone_destroy(z_pdu); + mempool_zone_destroy(z_error); - 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); + return 0; } static int @@ -1136,7 +841,6 @@ 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) @@ -1146,21 +850,15 @@ 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.sid); - if (session) { - spin_lock_irqsave(&sesslock, flags); - list_del(&session->sess_list); - spin_unlock_irqrestore(&sesslock, flags); - + session = iscsi_session_lookup(ev->u.d_session.session_handle); + if (session) transport->destroy_session(session); - } else + else err = -EINVAL; break; case ISCSI_UEVENT_CREATE_CONN: @@ -1170,35 +868,41 @@ 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.sid); - conn = iscsi_conn_lookup(ev->u.b_conn.sid, ev->u.b_conn.cid); + session = iscsi_session_lookup(ev->u.b_conn.session_handle); + conn = iscsi_conn_lookup(ev->u.b_conn.conn_handle); if (session && conn) ev->r.retcode = transport->bind_conn(session, conn, - ev->u.b_conn.transport_eph, + ev->u.b_conn.transport_fd, ev->u.b_conn.is_leading); else err = -EINVAL; break; case ISCSI_UEVENT_SET_PARAM: - err = iscsi_set_param(transport, ev); + 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; break; case ISCSI_UEVENT_START_CONN: - conn = iscsi_conn_lookup(ev->u.start_conn.sid, ev->u.start_conn.cid); + conn = iscsi_conn_lookup(ev->u.start_conn.conn_handle); 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.sid, ev->u.stop_conn.cid); + conn = iscsi_conn_lookup(ev->u.stop_conn.conn_handle); 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.sid, ev->u.send_pdu.cid); + conn = iscsi_conn_lookup(ev->u.send_pdu.conn_handle); if (conn) ev->r.retcode = transport->send_pdu(conn, (struct iscsi_hdr*)((char*)ev + sizeof(*ev)), @@ -1210,14 +914,6 @@ 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; @@ -1227,11 +923,9 @@ 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 lengths or - * invalid creds are discarded silently. - */ +/* 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. */ static void iscsi_if_rx(struct sock *sk, int len) { @@ -1243,6 +937,7 @@ 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; @@ -1293,38 +988,31 @@ 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_attr_show(param) \ +#define iscsi_conn_int_attr_show(param, format) \ static ssize_t \ -show_conn_param_##param(struct class_device *cdev, char *buf) \ +show_conn_int_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; \ - return t->get_conn_param(conn, param, buf); \ + \ + t->get_conn_param(conn, param, &value); \ + return snprintf(buf, 20, format"\n", value); \ } -#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_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_cdev_to_session(_cdev) \ iscsi_dev_to_session(_cdev->dev) @@ -1332,67 +1020,42 @@ iscsi_conn_attr(address, ISCSI_PARAM_CONN_ADDRESS); /* * iSCSI session attrs */ -#define iscsi_session_attr_show(param) \ +#define iscsi_session_int_attr_show(param, format) \ static ssize_t \ -show_session_param_##param(struct class_device *cdev, char *buf) \ +show_session_int_param_##param(struct class_device *cdev, char *buf) \ { \ - struct iscsi_cls_session *session = iscsi_cdev_to_session(cdev); \ + uint32_t value = 0; \ + struct iscsi_cls_session *session = iscsi_cdev_to_session(cdev); \ struct iscsi_transport *t = session->transport; \ - return t->get_session_param(session, param, buf); \ + \ + t->get_session_param(session, param, &value); \ + return snprintf(buf, 20, format"\n", value); \ } -#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; \ +#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;\ count++; \ - } \ -} while (0) + } -#define SETUP_CONN_RD_ATTR(field, param_flag) \ -do { \ - if (tt->param_mask & param_flag) { \ - priv->conn_attrs[count] = &class_device_attr_conn_##field; \ +#define SETUP_CONN_RD_ATTR(field, param) \ + if (priv->param_mask & (1 << param)) { \ + priv->conn_attrs[count] = &class_device_attr_##field; \ count++; \ - } \ -} while (0) + } static int iscsi_session_match(struct attribute_container *cont, struct device *dev) @@ -1441,24 +1104,6 @@ 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) { @@ -1472,13 +1117,12 @@ iscsi_register_transport(struct iscsi_transport *tt) if (priv) return NULL; - priv = kzalloc(sizeof(*priv), GFP_KERNEL); + priv = kmalloc(sizeof(*priv), GFP_KERNEL); if (!priv) return NULL; + memset(priv, 0, sizeof(*priv)); 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); @@ -1490,13 +1134,18 @@ iscsi_register_transport(struct iscsi_transport *tt) if (err) goto unregister_cdev; - /* 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); + /* 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); + } /* connection parameters */ priv->conn_cont.ac.attrs = &priv->conn_attrs[0]; @@ -1504,17 +1153,12 @@ 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_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); + 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); BUG_ON(count > ISCSI_CONN_ATTRS); priv->conn_attrs[count] = NULL; @@ -1526,17 +1170,14 @@ 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_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); + 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); BUG_ON(count > ISCSI_SESSION_ATTRS); priv->session_attrs[count] = NULL; @@ -1574,7 +1215,6 @@ 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); @@ -1614,20 +1254,13 @@ 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_host_class); - if (err) - goto unregister_transport_class; - err = transport_class_register(&iscsi_connection_class); if (err) - goto unregister_host_class; + goto unregister_transport_class; err = transport_class_register(&iscsi_session_class); if (err) @@ -1656,8 +1289,6 @@ 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; @@ -1670,7 +1301,6 @@ 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); } @@ -1682,4 +1312,3 @@ 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 5a625c3fd..210dab587 100644 --- a/drivers/scsi/scsi_transport_sas.c +++ b/drivers/scsi/scsi_transport_sas.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2006 Dell Inc. + * Copyright (C) 2005 Dell Inc. * Released under GPL v2. * * Serial Attached SCSI (SAS) transport class. @@ -35,13 +35,36 @@ #include #include -#include "scsi_sas_internal.h" + +#define SAS_HOST_ATTRS 0 +#define SAS_PORT_ATTRS 17 +#define SAS_RPORT_ATTRS 5 + +struct sas_internal { + struct scsi_transport_template t; + struct sas_function_template *f; + + 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_rphy_attrs[SAS_RPORT_ATTRS]; + + struct transport_container phy_attr_cont; + struct transport_container rphy_attr_cont; + + /* + * The array of null terminated pointers to attributes + * 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 *rphy_attrs[SAS_RPORT_ATTRS + 1]; +}; +#define to_sas_internal(tmpl) container_of(tmpl, struct sas_internal, t) + struct sas_host_attrs { struct list_head rphy_list; 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) @@ -66,7 +89,7 @@ get_sas_##title##_names(u32 table_key, char *buf) \ ssize_t len = 0; \ int i; \ \ - for (i = 0; i < ARRAY_SIZE(table); i++) { \ + for (i = 0; i < sizeof(table)/sizeof(table[0]); i++) { \ if (table[i].value & table_key) { \ len += sprintf(buf + len, "%s%s", \ prefix, table[i].name); \ @@ -84,7 +107,7 @@ get_sas_##title##_names(u32 table_key, char *buf) \ ssize_t len = 0; \ int i; \ \ - for (i = 0; i < ARRAY_SIZE(table); i++) { \ + for (i = 0; i < sizeof(table)/sizeof(table[0]); i++) { \ if (table[i].value == table_key) { \ len += sprintf(buf + len, "%s", \ table[i].name); \ @@ -128,7 +151,6 @@ static struct { { SAS_SATA_SPINUP_HOLD, "Spin-up hold" }, { SAS_LINK_RATE_1_5_GBPS, "1.5 Gbit" }, { SAS_LINK_RATE_3_0_GBPS, "3.0 Gbit" }, - { SAS_LINK_RATE_6_0_GBPS, "6.0 Gbit" }, }; sas_bitfield_name_search(linkspeed, sas_linkspeed_names) @@ -146,8 +168,6 @@ static int sas_host_setup(struct transport_container *tc, struct device *dev, INIT_LIST_HEAD(&sas_host->rphy_list); 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; } @@ -176,28 +196,11 @@ static int sas_host_match(struct attribute_container *cont, static int do_sas_phy_delete(struct device *dev, void *data) { - 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)) + if (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 @@ -207,13 +210,13 @@ EXPORT_SYMBOL(sas_remove_children); */ void sas_remove_host(struct Scsi_Host *shost) { - sas_remove_children(&shost->shost_gendev); + device_for_each_child(&shost->shost_gendev, NULL, do_sas_phy_delete); } EXPORT_SYMBOL(sas_remove_host); /* - * SAS Phy attributes + * SAS Port attributes */ #define sas_phy_show_simple(field, name, format_string, cast) \ @@ -269,7 +272,7 @@ show_sas_phy_##field(struct class_device *cdev, char *buf) \ if (!phy->local_attached) \ return -EINVAL; \ \ - error = i->f->get_linkerrors ? i->f->get_linkerrors(phy) : 0; \ + error = i->f->get_linkerrors(phy); \ if (error) \ return error; \ return snprintf(buf, 20, "%u\n", phy->field); \ @@ -329,7 +332,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", int); +sas_phy_simple_attr(port_identifier, port_identifier, "%d\n", u8); sas_phy_linkspeed_attr(negotiated_linkrate); sas_phy_linkspeed_attr(minimum_linkrate_hw); sas_phy_linkspeed_attr(minimum_linkrate); @@ -388,22 +391,19 @@ struct sas_phy *sas_phy_alloc(struct device *parent, int number) struct Scsi_Host *shost = dev_to_shost(parent); struct sas_phy *phy; - phy = kzalloc(sizeof(*phy), GFP_KERNEL); + phy = kmalloc(sizeof(*phy), GFP_KERNEL); if (!phy) return NULL; + memset(phy, 0, sizeof(*phy)); + + get_device(parent); phy->number = 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, - rphy->scsi_target_id, number); - } else - sprintf(phy->dev.bus_id, "phy-%d:%d", shost->host_no, number); + sprintf(phy->dev.bus_id, "phy-%d:%d", shost->host_no, number); transport_setup_device(&phy->dev); @@ -444,7 +444,10 @@ EXPORT_SYMBOL(sas_phy_add); void sas_phy_free(struct sas_phy *phy) { transport_destroy_device(&phy->dev); - put_device(&phy->dev); + put_device(phy->dev.parent); + put_device(phy->dev.parent); + put_device(phy->dev.parent); + kfree(phy); } EXPORT_SYMBOL(sas_phy_free); @@ -460,13 +463,13 @@ sas_phy_delete(struct sas_phy *phy) { struct device *dev = &phy->dev; - /* this happens if the phy is still part of a port when deleted */ - BUG_ON(!list_empty(&phy->port_siblings)); + if (phy->rphy) + sas_rphy_delete(phy->rphy); transport_remove_device(dev); device_del(dev); transport_destroy_device(dev); - put_device(dev); + put_device(dev->parent); } EXPORT_SYMBOL(sas_phy_delete); @@ -483,310 +486,6 @@ 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. */ @@ -835,53 +534,6 @@ show_sas_rphy_device_type(struct class_device *cdev, char *buf) static SAS_CLASS_DEVICE_ATTR(rphy, device_type, S_IRUGO, show_sas_rphy_device_type, NULL); -static ssize_t -show_sas_rphy_enclosure_identifier(struct class_device *cdev, char *buf) -{ - struct sas_rphy *rphy = transport_class_to_rphy(cdev); - struct sas_phy *phy = dev_to_phy(rphy->dev.parent); - struct Scsi_Host *shost = dev_to_shost(phy->dev.parent); - struct sas_internal *i = to_sas_internal(shost->transportt); - u64 identifier; - int error; - - /* - * Only devices behind an expander are supported, because the - * enclosure identifier is a SMP feature. - */ - if (phy->local_attached) - return -EINVAL; - - error = i->f->get_enclosure_identifier(rphy, &identifier); - if (error) - return error; - return sprintf(buf, "0x%llx\n", (unsigned long long)identifier); -} - -static SAS_CLASS_DEVICE_ATTR(rphy, enclosure_identifier, S_IRUGO, - show_sas_rphy_enclosure_identifier, NULL); - -static ssize_t -show_sas_rphy_bay_identifier(struct class_device *cdev, char *buf) -{ - struct sas_rphy *rphy = transport_class_to_rphy(cdev); - struct sas_phy *phy = dev_to_phy(rphy->dev.parent); - struct Scsi_Host *shost = dev_to_shost(phy->dev.parent); - struct sas_internal *i = to_sas_internal(shost->transportt); - int val; - - if (phy->local_attached) - return -EINVAL; - - val = i->f->get_bay_identifier(rphy); - if (val < 0) - return val; - return sprintf(buf, "%d\n", val); -} - -static SAS_CLASS_DEVICE_ATTR(rphy, bay_identifier, S_IRUGO, - show_sas_rphy_bay_identifier, NULL); - sas_rphy_protocol_attr(identify.initiator_port_protocols, initiator_port_protocols); sas_rphy_protocol_attr(identify.target_port_protocols, target_port_protocols); @@ -889,103 +541,8 @@ sas_rphy_simple_attr(identify.sas_address, sas_address, "0x%016llx\n", unsigned long long); sas_rphy_simple_attr(identify.phy_identifier, phy_identifier, "%d\n", u8); -/* only need 8 bytes of data plus header (4 or 8) */ -#define BUF_SIZE 64 - -int sas_read_port_mode_page(struct scsi_device *sdev) -{ - char *buffer = kzalloc(BUF_SIZE, GFP_KERNEL), *msdata; - struct sas_rphy *rphy = target_to_rphy(sdev->sdev_target); - struct sas_end_device *rdev; - struct scsi_mode_data mode_data; - int res, error; - - BUG_ON(rphy->identify.device_type != SAS_END_DEVICE); - - rdev = rphy_to_end_device(rphy); - - if (!buffer) - return -ENOMEM; - - res = scsi_mode_sense(sdev, 1, 0x19, buffer, BUF_SIZE, 30*HZ, 3, - &mode_data, NULL); - - error = -EINVAL; - if (!scsi_status_is_good(res)) - goto out; - - msdata = buffer + mode_data.header_length + - mode_data.block_descriptor_length; - - if (msdata - buffer > BUF_SIZE - 8) - goto out; - - error = 0; - - rdev->ready_led_meaning = msdata[2] & 0x10 ? 1 : 0; - rdev->I_T_nexus_loss_timeout = (msdata[4] << 8) + msdata[5]; - rdev->initiator_response_timeout = (msdata[6] << 8) + msdata[7]; - - out: - kfree(buffer); - return error; -} -EXPORT_SYMBOL(sas_read_port_mode_page); - -static DECLARE_TRANSPORT_CLASS(sas_end_dev_class, - "sas_end_device", NULL, NULL, NULL); - -#define sas_end_dev_show_simple(field, name, format_string, cast) \ -static ssize_t \ -show_sas_end_dev_##name(struct class_device *cdev, char *buf) \ -{ \ - struct sas_rphy *rphy = transport_class_to_rphy(cdev); \ - struct sas_end_device *rdev = rphy_to_end_device(rphy); \ - \ - return snprintf(buf, 20, format_string, cast rdev->field); \ -} - -#define sas_end_dev_simple_attr(field, name, format_string, type) \ - sas_end_dev_show_simple(field, name, format_string, (type)) \ -static SAS_CLASS_DEVICE_ATTR(end_dev, name, S_IRUGO, \ - show_sas_end_dev_##name, NULL) - -sas_end_dev_simple_attr(ready_led_meaning, ready_led_meaning, "%d\n", int); -sas_end_dev_simple_attr(I_T_nexus_loss_timeout, I_T_nexus_loss_timeout, - "%d\n", int); -sas_end_dev_simple_attr(initiator_response_timeout, initiator_response_timeout, - "%d\n", int); - -static DECLARE_TRANSPORT_CLASS(sas_expander_class, - "sas_expander", NULL, NULL, NULL); - -#define sas_expander_show_simple(field, name, format_string, cast) \ -static ssize_t \ -show_sas_expander_##name(struct class_device *cdev, char *buf) \ -{ \ - struct sas_rphy *rphy = transport_class_to_rphy(cdev); \ - struct sas_expander_device *edev = rphy_to_expander_device(rphy); \ - \ - return snprintf(buf, 20, format_string, cast edev->field); \ -} - -#define sas_expander_simple_attr(field, name, format_string, type) \ - sas_expander_show_simple(field, name, format_string, (type)) \ -static SAS_CLASS_DEVICE_ATTR(expander, name, S_IRUGO, \ - show_sas_expander_##name, NULL) - -sas_expander_simple_attr(vendor_id, vendor_id, "%s\n", char *); -sas_expander_simple_attr(product_id, product_id, "%s\n", char *); -sas_expander_simple_attr(product_rev, product_rev, "%s\n", char *); -sas_expander_simple_attr(component_vendor_id, component_vendor_id, - "%s\n", char *); -sas_expander_simple_attr(component_id, component_id, "%u\n", unsigned int); -sas_expander_simple_attr(component_revision_id, component_revision_id, "%u\n", - unsigned int); -sas_expander_simple_attr(level, level, "%d\n", int); - static DECLARE_TRANSPORT_CLASS(sas_rphy_class, - "sas_device", NULL, NULL, NULL); + "sas_rphy", NULL, NULL, NULL); static int sas_rphy_match(struct attribute_container *cont, struct device *dev) { @@ -1006,157 +563,45 @@ static int sas_rphy_match(struct attribute_container *cont, struct device *dev) return &i->rphy_attr_cont.ac == cont; } -static int sas_end_dev_match(struct attribute_container *cont, - struct device *dev) -{ - struct Scsi_Host *shost; - struct sas_internal *i; - struct sas_rphy *rphy; - - if (!scsi_is_sas_rphy(dev)) - return 0; - shost = dev_to_shost(dev->parent->parent); - rphy = dev_to_rphy(dev); - - 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->end_dev_attr_cont.ac == cont && - rphy->identify.device_type == SAS_END_DEVICE; -} - -static int sas_expander_match(struct attribute_container *cont, - struct device *dev) -{ - struct Scsi_Host *shost; - struct sas_internal *i; - struct sas_rphy *rphy; - - if (!scsi_is_sas_rphy(dev)) - return 0; - shost = dev_to_shost(dev->parent->parent); - rphy = dev_to_rphy(dev); - - 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->expander_attr_cont.ac == cont && - (rphy->identify.device_type == SAS_EDGE_EXPANDER_DEVICE || - rphy->identify.device_type == SAS_FANOUT_EXPANDER_DEVICE); -} - -static void sas_expander_release(struct device *dev) +static void sas_rphy_release(struct device *dev) { struct sas_rphy *rphy = dev_to_rphy(dev); - struct sas_expander_device *edev = rphy_to_expander_device(rphy); put_device(dev->parent); - kfree(edev); -} - -static void sas_end_device_release(struct device *dev) -{ - struct sas_rphy *rphy = dev_to_rphy(dev); - struct sas_end_device *edev = rphy_to_end_device(rphy); - - put_device(dev->parent); - 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 - * - * Allocates an SAS remote PHY structure, connected to @parent. - * - * Returns: - * SAS PHY allocated or %NULL if the allocation failed. - */ -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; - - rdev = kzalloc(sizeof(*rdev), GFP_KERNEL); - if (!rdev) { - return NULL; - } - - device_initialize(&rdev->rphy.dev); - rdev->rphy.dev.parent = get_device(&parent->dev); - rdev->rphy.dev.release = sas_end_device_release; - 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; + kfree(rphy); } -EXPORT_SYMBOL(sas_end_device_alloc); /** - * sas_expander_alloc - allocate an rphy for an end device + * sas_rphy_alloc -- allocates and initialize a SAS remote PHY structure + * @parent: SAS PHY this remote PHY is conneted to * * Allocates an SAS remote PHY structure, connected to @parent. * * Returns: * SAS PHY allocated or %NULL if the allocation failed. */ -struct sas_rphy *sas_expander_alloc(struct sas_port *parent, - enum sas_device_type type) +struct sas_rphy *sas_rphy_alloc(struct sas_phy *parent) { struct Scsi_Host *shost = dev_to_shost(&parent->dev); - struct sas_expander_device *rdev; - struct sas_host_attrs *sas_host = to_sas_host_attrs(shost); - - BUG_ON(type != SAS_EDGE_EXPANDER_DEVICE && - type != SAS_FANOUT_EXPANDER_DEVICE); + struct sas_rphy *rphy; - rdev = kzalloc(sizeof(*rdev), GFP_KERNEL); - if (!rdev) { + rphy = kmalloc(sizeof(*rphy), GFP_KERNEL); + if (!rphy) { + put_device(&parent->dev); return NULL; } + memset(rphy, 0, sizeof(*rphy)); - device_initialize(&rdev->rphy.dev); - rdev->rphy.dev.parent = get_device(&parent->dev); - rdev->rphy.dev.release = sas_expander_release; - mutex_lock(&sas_host->lock); - rdev->rphy.scsi_target_id = sas_host->next_expander_id++; - mutex_unlock(&sas_host->lock); - 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); + device_initialize(&rphy->dev); + rphy->dev.parent = get_device(&parent->dev); + rphy->dev.release = sas_rphy_release; + sprintf(rphy->dev.bus_id, "rphy-%d:%d-%d", + shost->host_no, parent->port_identifier, parent->number); + transport_setup_device(&rphy->dev); - return &rdev->rphy; + return rphy; } -EXPORT_SYMBOL(sas_expander_alloc); +EXPORT_SYMBOL(sas_rphy_alloc); /** * sas_rphy_add -- add a SAS remote PHY to the device hierachy @@ -1166,7 +611,7 @@ EXPORT_SYMBOL(sas_expander_alloc); */ int sas_rphy_add(struct sas_rphy *rphy) { - struct sas_port *parent = dev_to_sas_port(rphy->dev.parent); + struct sas_phy *parent = dev_to_phy(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; @@ -1188,13 +633,12 @@ int sas_rphy_add(struct sas_rphy *rphy) (identify->target_port_protocols & (SAS_PROTOCOL_SSP|SAS_PROTOCOL_STP|SAS_PROTOCOL_SATA))) rphy->scsi_target_id = sas_host->next_target_id++; - else if (identify->device_type == SAS_END_DEVICE) + else rphy->scsi_target_id = -1; mutex_unlock(&sas_host->lock); - if (identify->device_type == SAS_END_DEVICE && - rphy->scsi_target_id != -1) { - scsi_scan_target(&rphy->dev, 0, + if (rphy->scsi_target_id != -1) { + scsi_scan_target(&rphy->dev, parent->port_identifier, rphy->scsi_target_id, ~0, 0); } @@ -1215,7 +659,6 @@ EXPORT_SYMBOL(sas_rphy_add); */ void sas_rphy_free(struct sas_rphy *rphy) { - struct device *dev = &rphy->dev; struct Scsi_Host *shost = dev_to_shost(rphy->dev.parent->parent); struct sas_host_attrs *sas_host = to_sas_host_attrs(shost); @@ -1223,9 +666,11 @@ void sas_rphy_free(struct sas_rphy *rphy) list_del(&rphy->list); mutex_unlock(&sas_host->lock); - transport_destroy_device(dev); - - put_device(dev); + transport_destroy_device(&rphy->dev); + put_device(rphy->dev.parent); + put_device(rphy->dev.parent); + put_device(rphy->dev.parent); + kfree(rphy); } EXPORT_SYMBOL(sas_rphy_free); @@ -1239,7 +684,7 @@ void sas_rphy_delete(struct sas_rphy *rphy) { struct device *dev = &rphy->dev; - struct sas_port *parent = dev_to_sas_port(dev->parent); + struct sas_phy *parent = dev_to_phy(dev->parent); struct Scsi_Host *shost = dev_to_shost(parent->dev.parent); struct sas_host_attrs *sas_host = to_sas_host_attrs(shost); @@ -1249,7 +694,7 @@ sas_rphy_delete(struct sas_rphy *rphy) break; case SAS_EDGE_EXPANDER_DEVICE: case SAS_FANOUT_EXPANDER_DEVICE: - sas_remove_children(dev); + device_for_each_child(dev, NULL, do_sas_phy_delete); break; default: break; @@ -1265,7 +710,7 @@ sas_rphy_delete(struct sas_rphy *rphy) parent->rphy = NULL; - put_device(dev); + put_device(&parent->dev); } EXPORT_SYMBOL(sas_rphy_delete); @@ -1278,8 +723,7 @@ EXPORT_SYMBOL(sas_rphy_delete); */ int scsi_is_sas_rphy(const struct device *dev) { - return dev->release == sas_end_device_release || - dev->release == sas_expander_release; + return dev->release == sas_rphy_release; } EXPORT_SYMBOL(scsi_is_sas_rphy); @@ -1296,13 +740,14 @@ 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) { - if (rphy->identify.device_type != SAS_END_DEVICE || - rphy->scsi_target_id == -1) + struct sas_phy *parent = dev_to_phy(rphy->dev.parent); + + if (rphy->scsi_target_id == -1) continue; - if ((channel == SCAN_WILD_CARD || channel == 0) && + if ((channel == SCAN_WILD_CARD || channel == parent->port_identifier) && (id == SCAN_WILD_CARD || id == rphy->scsi_target_id)) { - scsi_scan_target(&rphy->dev, 0, + scsi_scan_target(&rphy->dev, parent->port_identifier, rphy->scsi_target_id, lun, 1); } } @@ -1316,40 +761,27 @@ static int sas_user_scan(struct Scsi_Host *shost, uint channel, * Setup / Teardown code */ -#define SETUP_TEMPLATE(attrb, field, perm, test) \ - i->private_##attrb[count] = class_device_attr_##field; \ - i->private_##attrb[count].attr.mode = perm; \ - i->attrb[count] = &i->private_##attrb[count]; \ - if (test) \ - count++ - - -#define SETUP_RPORT_ATTRIBUTE(field) \ - SETUP_TEMPLATE(rphy_attrs, field, S_IRUGO, 1) - -#define SETUP_OPTIONAL_RPORT_ATTRIBUTE(field, func) \ - SETUP_TEMPLATE(rphy_attrs, field, S_IRUGO, i->f->func) - -#define SETUP_PHY_ATTRIBUTE(field) \ - SETUP_TEMPLATE(phy_attrs, field, S_IRUGO, 1) +#define SETUP_RPORT_ATTRIBUTE(field) \ + i->private_rphy_attrs[count] = class_device_attr_##field; \ + i->private_rphy_attrs[count].attr.mode = S_IRUGO; \ + i->private_rphy_attrs[count].store = NULL; \ + i->rphy_attrs[count] = &i->private_rphy_attrs[count]; \ + count++ #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_PHY_ATTRIBUTE_WRONLY(field) \ - SETUP_TEMPLATE(phy_attrs, field, S_IWUGO, 1) + i->private_phy_attrs[count] = class_device_attr_##field; \ + i->private_phy_attrs[count].attr.mode = S_IRUGO; \ + i->private_phy_attrs[count].store = NULL; \ + i->phy_attrs[count] = &i->private_phy_attrs[count]; \ + count++ -#define SETUP_OPTIONAL_PHY_ATTRIBUTE_WRONLY(field, func) \ - SETUP_TEMPLATE(phy_attrs, field, S_IWUGO, i->f->func) +#define SETUP_PORT_ATTRIBUTE_WRONLY(field) \ + i->private_phy_attrs[count] = class_device_attr_##field; \ + i->private_phy_attrs[count].attr.mode = S_IWUGO; \ + i->private_phy_attrs[count].show = NULL; \ + i->phy_attrs[count] = &i->private_phy_attrs[count]; \ + count++ -#define SETUP_END_DEV_ATTRIBUTE(field) \ - SETUP_TEMPLATE(end_dev_attrs, field, S_IRUGO, 1) - -#define SETUP_EXPANDER_ATTRIBUTE(field) \ - SETUP_TEMPLATE(expander_attrs, expander_##field, S_IRUGO, 1) /** * sas_attach_transport -- instantiate SAS transport template @@ -1361,9 +793,10 @@ sas_attach_transport(struct sas_function_template *ft) struct sas_internal *i; int count; - i = kzalloc(sizeof(struct sas_internal), GFP_KERNEL); + i = kmalloc(sizeof(struct sas_internal), GFP_KERNEL); if (!i) return NULL; + memset(i, 0, sizeof(struct sas_internal)); i->t.user_scan = sas_user_scan; @@ -1378,85 +811,45 @@ 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; transport_container_register(&i->rphy_attr_cont); - i->end_dev_attr_cont.ac.class = &sas_end_dev_class.class; - i->end_dev_attr_cont.ac.attrs = &i->end_dev_attrs[0]; - i->end_dev_attr_cont.ac.match = sas_end_dev_match; - transport_container_register(&i->end_dev_attr_cont); - - i->expander_attr_cont.ac.class = &sas_expander_class.class; - i->expander_attr_cont.ac.attrs = &i->expander_attrs[0]; - i->expander_attr_cont.ac.match = sas_expander_match; - transport_container_register(&i->expander_attr_cont); - i->f = ft; count = 0; - SETUP_PORT_ATTRIBUTE(num_phys); i->host_attrs[count] = NULL; count = 0; - 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); + 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_PORT_ATTRIBUTE_WRONLY(link_reset); + SETUP_PORT_ATTRIBUTE_WRONLY(hard_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); SETUP_RPORT_ATTRIBUTE(rphy_device_type); SETUP_RPORT_ATTRIBUTE(rphy_sas_address); SETUP_RPORT_ATTRIBUTE(rphy_phy_identifier); - SETUP_OPTIONAL_RPORT_ATTRIBUTE(rphy_enclosure_identifier, - get_enclosure_identifier); - SETUP_OPTIONAL_RPORT_ATTRIBUTE(rphy_bay_identifier, - get_bay_identifier); i->rphy_attrs[count] = NULL; - count = 0; - SETUP_END_DEV_ATTRIBUTE(end_dev_ready_led_meaning); - SETUP_END_DEV_ATTRIBUTE(end_dev_I_T_nexus_loss_timeout); - SETUP_END_DEV_ATTRIBUTE(end_dev_initiator_response_timeout); - i->end_dev_attrs[count] = NULL; - - count = 0; - SETUP_EXPANDER_ATTRIBUTE(vendor_id); - SETUP_EXPANDER_ATTRIBUTE(product_id); - SETUP_EXPANDER_ATTRIBUTE(product_rev); - SETUP_EXPANDER_ATTRIBUTE(component_vendor_id); - SETUP_EXPANDER_ATTRIBUTE(component_id); - SETUP_EXPANDER_ATTRIBUTE(component_revision_id); - SETUP_EXPANDER_ATTRIBUTE(level); - i->expander_attrs[count] = NULL; - return &i->t; } EXPORT_SYMBOL(sas_attach_transport); @@ -1471,10 +864,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); kfree(i); } @@ -1490,27 +880,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_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; - error = transport_class_register(&sas_expander_class); - if (error) - goto out_unregister_end_dev; + goto out_unregister_phy; return 0; - out_unregister_end_dev: - 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: @@ -1524,10 +899,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); } MODULE_AUTHOR("Christoph Hellwig"); diff --git a/drivers/scsi/scsi_transport_spi.c b/drivers/scsi/scsi_transport_spi.c index 29a9a53cd..7ee95eb83 100644 --- a/drivers/scsi/scsi_transport_spi.c +++ b/drivers/scsi/scsi_transport_spi.c @@ -18,6 +18,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +#include #include #include #include @@ -145,7 +146,7 @@ static inline const char *spi_signal_to_string(enum spi_signal_type type) { int i; - for (i = 0; i < ARRAY_SIZE(signal_types); i++) { + for (i = 0; i < sizeof(signal_types)/sizeof(signal_types[0]); i++) { if (type == signal_types[i].value) return signal_types[i].name; } @@ -155,7 +156,7 @@ static inline enum spi_signal_type spi_signal_to_value(const char *name) { int i, len; - for (i = 0; i < ARRAY_SIZE(signal_types); i++) { + for (i = 0; i < sizeof(signal_types)/sizeof(signal_types[0]); i++) { len = strlen(signal_types[i].name); if (strncmp(name, signal_types[i].name, len) == 0 && (name[len] == '\n' || name[len] == '\0')) @@ -400,7 +401,8 @@ static int period_to_str(char *buf, int period) } static ssize_t -show_spi_transport_period_helper(char *buf, int period) +show_spi_transport_period_helper(struct class_device *cdev, char *buf, + int period) { int len = period_to_str(buf, period); buf[len++] = '\n'; @@ -457,7 +459,7 @@ show_spi_transport_period(struct class_device *cdev, char *buf) if (i->f->get_period) i->f->get_period(starget); - return show_spi_transport_period_helper(buf, tp->period); + return show_spi_transport_period_helper(cdev, buf, tp->period); } static ssize_t @@ -492,7 +494,7 @@ show_spi_transport_min_period(struct class_device *cdev, char *buf) struct spi_transport_attrs *tp = (struct spi_transport_attrs *)&starget->starget_data; - return show_spi_transport_period_helper(buf, tp->min_period); + return show_spi_transport_period_helper(cdev, buf, tp->min_period); } static ssize_t @@ -784,7 +786,6 @@ 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,14 +845,6 @@ 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); @@ -907,11 +900,13 @@ spi_dv_device(struct scsi_device *sdev) if (unlikely(scsi_device_get(sdev))) return; - buffer = kzalloc(len, GFP_KERNEL); + buffer = kmalloc(len, GFP_KERNEL); if (unlikely(!buffer)) goto out_put; + memset(buffer, 0, len); + /* We need to verify that the actual device will quiesce; the * later target quiesce is just a nice to have */ if (unlikely(scsi_device_quiesce(sdev))) @@ -1059,63 +1054,25 @@ void spi_display_xfer_agreement(struct scsi_target *starget) } EXPORT_SYMBOL(spi_display_xfer_agreement); -int spi_populate_width_msg(unsigned char *msg, int width) -{ - msg[0] = EXTENDED_MESSAGE; - msg[1] = 2; - msg[2] = EXTENDED_WDTR; - msg[3] = width; - return 4; -} -EXPORT_SYMBOL_GPL(spi_populate_width_msg); - -int spi_populate_sync_msg(unsigned char *msg, int period, int offset) -{ - msg[0] = EXTENDED_MESSAGE; - msg[1] = 3; - msg[2] = EXTENDED_SDTR; - msg[3] = period; - msg[4] = offset; - return 5; -} -EXPORT_SYMBOL_GPL(spi_populate_sync_msg); - -int spi_populate_ppr_msg(unsigned char *msg, int period, int offset, - int width, int options) -{ - msg[0] = EXTENDED_MESSAGE; - msg[1] = 6; - msg[2] = EXTENDED_PPR; - msg[3] = period; - msg[4] = 0; - msg[5] = offset; - msg[6] = width; - msg[7] = options; - return 8; -} -EXPORT_SYMBOL_GPL(spi_populate_ppr_msg); - #ifdef CONFIG_SCSI_CONSTANTS static const char * const one_byte_msgs[] = { -/* 0x00 */ "Task Complete", NULL /* Extended Message */, "Save Pointers", +/* 0x00 */ "Command Complete", NULL, "Save Pointers", /* 0x03 */ "Restore Pointers", "Disconnect", "Initiator Error", -/* 0x06 */ "Abort Task Set", "Message Reject", "Nop", "Message Parity Error", +/* 0x06 */ "Abort", "Message Reject", "Nop", "Message Parity Error", /* 0x0a */ "Linked Command Complete", "Linked Command Complete w/flag", -/* 0x0c */ "Target Reset", "Abort Task", "Clear Task Set", -/* 0x0f */ "Initiate Recovery", "Release Recovery", -/* 0x11 */ "Terminate Process", "Continue Task", "Target Transfer Disable", -/* 0x14 */ NULL, NULL, "Clear ACA", "LUN Reset" +/* 0x0c */ "Bus device reset", "Abort Tag", "Clear Queue", +/* 0x0f */ "Initiate Recovery", "Release Recovery" }; static const char * const two_byte_msgs[] = { /* 0x20 */ "Simple Queue Tag", "Head of Queue Tag", "Ordered Queue Tag", -/* 0x23 */ "Ignore Wide Residue", "ACA" +/* 0x23 */ "Ignore Wide Residue" }; static const char * const extended_msgs[] = { /* 0x00 */ "Modify Data Pointer", "Synchronous Data Transfer Request", /* 0x02 */ "SCSI-I Extended Identify", "Wide Data Transfer Request", -/* 0x04 */ "Parallel Protocol Request", "Modify Bidirectional Data Pointer" +/* 0x04 */ "Parallel Protocol Request" }; static void print_nego(const unsigned char *msg, int per, int off, int width) @@ -1132,20 +1089,11 @@ static void print_nego(const unsigned char *msg, int per, int off, int width) printk("width = %d ", 8 << msg[width]); } -static void print_ptr(const unsigned char *msg, int msb, const char *desc) -{ - int ptr = (msg[msb] << 24) | (msg[msb+1] << 16) | (msg[msb+2] << 8) | - msg[msb+3]; - printk("%s = %d ", desc, ptr); -} - int spi_print_msg(const unsigned char *msg) { - int len = 1, i; + int len = 0, i; if (msg[0] == EXTENDED_MESSAGE) { - len = 2 + msg[1]; - if (len == 2) - len += 256; + len = 3 + msg[1]; if (msg[2] < ARRAY_SIZE(extended_msgs)) printk ("%s ", extended_msgs[msg[2]]); else @@ -1153,7 +1101,8 @@ int spi_print_msg(const unsigned char *msg) (int) msg[2]); switch (msg[2]) { case EXTENDED_MODIFY_DATA_POINTER: - print_ptr(msg, 3, "pointer"); + printk("pointer = %d", (int) (msg[3] << 24) | + (msg[4] << 16) | (msg[5] << 8) | msg[6]); break; case EXTENDED_SDTR: print_nego(msg, 3, 4, 0); @@ -1164,10 +1113,6 @@ int spi_print_msg(const unsigned char *msg) case EXTENDED_PPR: print_nego(msg, 3, 5, 6); break; - case EXTENDED_MODIFY_BIDI_DATA_PTR: - print_ptr(msg, 3, "out"); - print_ptr(msg, 7, "in"); - break; default: for (i = 2; i < len; ++i) printk("%02x ", msg[i]); @@ -1178,14 +1123,14 @@ int spi_print_msg(const unsigned char *msg) (msg[0] & 0x40) ? "" : "not ", (msg[0] & 0x20) ? "target routine" : "lun", msg[0] & 0x7); + len = 1; /* Normal One byte */ } else if (msg[0] < 0x1f) { - if (msg[0] < ARRAY_SIZE(one_byte_msgs) && one_byte_msgs[msg[0]]) - printk("%s ", one_byte_msgs[msg[0]]); + if (msg[0] < ARRAY_SIZE(one_byte_msgs)) + printk(one_byte_msgs[msg[0]]); else printk("reserved (%02x) ", msg[0]); - } else if (msg[0] == 0x55) { - printk("QAS Request "); + len = 1; /* Two byte */ } else if (msg[0] <= 0x2f) { if ((msg[0] - 0x20) < ARRAY_SIZE(two_byte_msgs)) @@ -1196,7 +1141,7 @@ int spi_print_msg(const unsigned char *msg) msg[0], msg[1]); len = 2; } else - printk("reserved "); + printk("reserved"); return len; } EXPORT_SYMBOL(spi_print_msg); @@ -1205,20 +1150,20 @@ EXPORT_SYMBOL(spi_print_msg); int spi_print_msg(const unsigned char *msg) { - int len = 1, i; + int len = 0, i; if (msg[0] == EXTENDED_MESSAGE) { - len = 2 + msg[1]; - if (len == 2) - len += 256; + len = 3 + msg[1]; for (i = 0; i < len; ++i) printk("%02x ", msg[i]); /* Identify */ } else if (msg[0] & 0x80) { printk("%02x ", msg[0]); + len = 1; /* Normal One byte */ - } else if ((msg[0] < 0x1f) || (msg[0] == 0x55)) { + } else if (msg[0] < 0x1f) { printk("%02x ", msg[0]); + len = 1; /* Two byte */ } else if (msg[0] <= 0x2f) { printk("%02x %02x", msg[0], msg[1]); @@ -1320,13 +1265,15 @@ static DECLARE_ANON_TRANSPORT_CLASS(spi_device_class, struct scsi_transport_template * spi_attach_transport(struct spi_function_template *ft) { - int count = 0; - struct spi_internal *i = kzalloc(sizeof(struct spi_internal), + struct spi_internal *i = kmalloc(sizeof(struct spi_internal), GFP_KERNEL); - + int count = 0; if (unlikely(!i)) return NULL; + memset(i, 0, sizeof(struct spi_internal)); + + i->t.target_attrs.ac.class = &spi_transport_class.class; i->t.target_attrs.ac.attrs = &i->attrs[0]; i->t.target_attrs.ac.match = spi_target_match; diff --git a/drivers/scsi/scsi_typedefs.h b/drivers/scsi/scsi_typedefs.h index 2ed4c5cb7..29f038b42 100644 --- a/drivers/scsi/scsi_typedefs.h +++ b/drivers/scsi/scsi_typedefs.h @@ -1,2 +1,3 @@ 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 cd68a66c7..b78354fc4 100644 --- a/drivers/scsi/scsicam.c +++ b/drivers/scsi/scsicam.c @@ -57,7 +57,6 @@ 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); @@ -69,7 +68,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 && capacity64 < (1ULL << 32)) { + if (ret == -1) { /* 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 98bd3aab9..9d9872347 100644 --- a/drivers/scsi/sd.c +++ b/drivers/scsi/sd.c @@ -32,6 +32,7 @@ * than the level indicated above to trigger output. */ +#include #include #include #include @@ -46,6 +47,7 @@ #include #include #include +#include #include #include #include @@ -69,27 +71,6 @@ */ #define SD_MAJORS 16 -MODULE_AUTHOR("Eric Youngdale"); -MODULE_DESCRIPTION("SCSI disk (sd) driver"); -MODULE_LICENSE("GPL"); - -MODULE_ALIAS_BLOCKDEV_MAJOR(SCSI_DISK0_MAJOR); -MODULE_ALIAS_BLOCKDEV_MAJOR(SCSI_DISK1_MAJOR); -MODULE_ALIAS_BLOCKDEV_MAJOR(SCSI_DISK2_MAJOR); -MODULE_ALIAS_BLOCKDEV_MAJOR(SCSI_DISK3_MAJOR); -MODULE_ALIAS_BLOCKDEV_MAJOR(SCSI_DISK4_MAJOR); -MODULE_ALIAS_BLOCKDEV_MAJOR(SCSI_DISK5_MAJOR); -MODULE_ALIAS_BLOCKDEV_MAJOR(SCSI_DISK6_MAJOR); -MODULE_ALIAS_BLOCKDEV_MAJOR(SCSI_DISK7_MAJOR); -MODULE_ALIAS_BLOCKDEV_MAJOR(SCSI_DISK8_MAJOR); -MODULE_ALIAS_BLOCKDEV_MAJOR(SCSI_DISK9_MAJOR); -MODULE_ALIAS_BLOCKDEV_MAJOR(SCSI_DISK10_MAJOR); -MODULE_ALIAS_BLOCKDEV_MAJOR(SCSI_DISK11_MAJOR); -MODULE_ALIAS_BLOCKDEV_MAJOR(SCSI_DISK12_MAJOR); -MODULE_ALIAS_BLOCKDEV_MAJOR(SCSI_DISK13_MAJOR); -MODULE_ALIAS_BLOCKDEV_MAJOR(SCSI_DISK14_MAJOR); -MODULE_ALIAS_BLOCKDEV_MAJOR(SCSI_DISK15_MAJOR); - /* * This is limited by the naming scheme enforced in sd_probe, * add another character to it if you really need more disks. @@ -113,10 +94,12 @@ MODULE_ALIAS_BLOCKDEV_MAJOR(SCSI_DISK15_MAJOR); */ #define SD_BUF_SIZE 512 +static void scsi_disk_release(struct kref *kref); + struct scsi_disk { struct scsi_driver *driver; /* always &sd_template */ struct scsi_device *device; - struct class_device cdev; + struct kref kref; struct gendisk *disk; unsigned int openers; /* protected by BKL for now, yuck */ sector_t capacity; /* size in 512-byte sectors */ @@ -127,7 +110,6 @@ struct scsi_disk { unsigned RCD : 1; /* state of disk RCD bit, unused */ unsigned DPOFUA : 1; /* state of disk DPOFUA bit */ }; -#define to_scsi_disk(obj) container_of(obj,struct scsi_disk,cdev) static DEFINE_IDR(sd_index_idr); static DEFINE_SPINLOCK(sd_index_lock); @@ -149,118 +131,6 @@ static int sd_issue_flush(struct device *, sector_t *); static void sd_prepare_flush(request_queue_t *, struct request *); static void sd_read_capacity(struct scsi_disk *sdkp, char *diskname, unsigned char *buffer); -static void scsi_disk_release(struct class_device *cdev); - -static const char *sd_cache_types[] = { - "write through", "none", "write back", - "write back, no read (daft)" -}; - -static ssize_t sd_store_cache_type(struct class_device *cdev, const char *buf, - size_t count) -{ - int i, ct = -1, rcd, wce, sp; - struct scsi_disk *sdkp = to_scsi_disk(cdev); - struct scsi_device *sdp = sdkp->device; - char buffer[64]; - char *buffer_data; - struct scsi_mode_data data; - struct scsi_sense_hdr sshdr; - int len; - - if (sdp->type != TYPE_DISK) - /* no cache control on RBC devices; theoretically they - * can do it, but there's probably so many exceptions - * it's not worth the risk */ - return -EINVAL; - - 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') { - ct = i; - break; - } - } - if (ct < 0) - return -EINVAL; - rcd = ct & 0x01 ? 1 : 0; - wce = ct & 0x02 ? 1 : 0; - if (scsi_mode_sense(sdp, 0x08, 8, buffer, sizeof(buffer), SD_TIMEOUT, - SD_MAX_RETRIES, &data, NULL)) - return -EINVAL; - len = min_t(size_t, sizeof(buffer), data.length - data.header_length - - data.block_descriptor_length); - buffer_data = buffer + data.header_length + - data.block_descriptor_length; - buffer_data[2] &= ~0x05; - buffer_data[2] |= wce << 2 | rcd; - sp = buffer_data[0] & 0x80 ? 1 : 0; - - if (scsi_mode_select(sdp, 1, sp, 8, buffer_data, len, SD_TIMEOUT, - SD_MAX_RETRIES, &data, &sshdr)) { - if (scsi_sense_valid(&sshdr)) - scsi_print_sense_hdr(sdkp->disk->disk_name, &sshdr); - return -EINVAL; - } - sd_revalidate_disk(sdkp->disk); - 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); - int ct = sdkp->RCD + 2*sdkp->WCE; - - return snprintf(buf, 40, "%s\n", sd_cache_types[ct]); -} - -static ssize_t sd_show_fua(struct class_device *cdev, char *buf) -{ - struct scsi_disk *sdkp = to_scsi_disk(cdev); - - 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, -}; - -static struct class sd_disk_class = { - .name = "scsi_disk", - .owner = THIS_MODULE, - .release = scsi_disk_release, - .class_dev_attrs = sd_disk_attrs, -}; static struct scsi_driver sd_template = { .owner = THIS_MODULE, @@ -304,6 +174,8 @@ static int sd_major(int major_idx) } } +#define to_scsi_disk(obj) container_of(obj,struct scsi_disk,kref) + static inline struct scsi_disk *scsi_disk(struct gendisk *disk) { return container_of(disk->private_data, struct scsi_disk, driver); @@ -316,7 +188,7 @@ static struct scsi_disk *__scsi_disk_get(struct gendisk *disk) if (disk->private_data) { sdkp = scsi_disk(disk); if (scsi_device_get(sdkp->device) == 0) - class_device_get(&sdkp->cdev); + kref_get(&sdkp->kref); else sdkp = NULL; } @@ -350,7 +222,7 @@ static void scsi_disk_put(struct scsi_disk *sdkp) struct scsi_device *sdev = sdkp->device; mutex_lock(&sd_ref_mutex); - class_device_put(&sdkp->cdev); + kref_put(&sdkp->kref, scsi_disk_release); scsi_device_put(sdev); mutex_unlock(&sd_ref_mutex); } @@ -502,7 +374,8 @@ static int sd_init_command(struct scsi_cmnd * SCpnt) SCpnt->cmnd[4] = (unsigned char) this_count; SCpnt->cmnd[5] = 0; } - SCpnt->request_bufflen = this_count * sdp->sector_size; + SCpnt->request_bufflen = SCpnt->bufflen = + this_count * sdp->sector_size; /* * We shouldn't disconnect in the middle of a sector, so with a dumb @@ -915,10 +788,11 @@ static struct block_device_operations sd_fops = { static void sd_rw_intr(struct scsi_cmnd * SCpnt) { int result = SCpnt->result; - unsigned int xfer_size = SCpnt->request_bufflen; - unsigned int good_bytes = result ? 0 : xfer_size; - u64 start_lba = SCpnt->request->sector; - u64 bad_lba; + 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; struct scsi_sense_hdr sshdr; int sense_valid = 0; int sense_deferred = 0; @@ -929,6 +803,7 @@ 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)); @@ -938,72 +813,89 @@ static void sd_rw_intr(struct scsi_cmnd * SCpnt) sshdr.sense_key, sshdr.asc, sshdr.ascq)); } #endif - if (driver_byte(result) != DRIVER_SENSE && - (!sense_valid || sense_deferred)) - goto out; + /* + 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; + } - 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; + error_sector &= ~(block_sectors - 1); + good_bytes = (error_sector - SCpnt->request->sector) << 9; + if (good_bytes < 0 || good_bytes >= this_count) + good_bytes = 0; break; - case 512: - break; - case 1024: - start_lba >>= 1; - break; - case 2048: - start_lba >>= 2; + + 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; break; - case 4096: - start_lba >>= 3; + + 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: - /* 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; } - out: - scsi_io_completion(SCpnt, good_bytes); + /* + * 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); } static int media_not_present(struct scsi_disk *sdkp, @@ -1441,12 +1333,6 @@ sd_read_cache_type(struct scsi_disk *sdkp, char *diskname, if (!scsi_status_is_good(res)) goto bad_sense; - if (!data.header_length) { - modepage = 6; - printk(KERN_ERR "%s: missing header in MODE_SENSE response\n", - diskname); - } - /* that went OK, now ask for the proper length */ len = data.length; @@ -1468,6 +1354,10 @@ sd_read_cache_type(struct scsi_disk *sdkp, char *diskname, res = sd_do_mode_sense(sdp, dbd, modepage, buffer, len, &data, &sshdr); if (scsi_status_is_good(res)) { + const char *types[] = { + "write through", "none", "write back", + "write back, no read (daft)" + }; int ct = 0; int offset = data.header_length + data.block_descriptor_length; @@ -1500,7 +1390,7 @@ sd_read_cache_type(struct scsi_disk *sdkp, char *diskname, ct = sdkp->RCD + 2*sdkp->WCE; printk(KERN_NOTICE "SCSI device %s: drive cache: %s%s\n", - diskname, sd_cache_types[ct], + diskname, types[ct], sdkp->DPOFUA ? " w/ FUA" : ""); return; @@ -1627,10 +1517,13 @@ static int sd_probe(struct device *dev) "sd_attach\n")); error = -ENOMEM; - sdkp = kzalloc(sizeof(*sdkp), GFP_KERNEL); + sdkp = kmalloc(sizeof(*sdkp), GFP_KERNEL); if (!sdkp) goto out; + memset (sdkp, 0, sizeof(*sdkp)); + kref_init(&sdkp->kref); + gd = alloc_disk(16); if (!gd) goto out_free; @@ -1647,16 +1540,7 @@ static int sd_probe(struct device *dev) if (error) goto out_put; - class_device_initialize(&sdkp->cdev); - sdkp->cdev.dev = &sdp->sdev_gendev; - sdkp->cdev.class = &sd_disk_class; - strncpy(sdkp->cdev.class_id, sdp->sdev_gendev.bus_id, BUS_ID_SIZE); - - if (class_device_add(&sdkp->cdev)) - goto out_put; - get_device(&sdp->sdev_gendev); - sdkp->device = sdp; sdkp->driver = &sd_template; sdkp->disk = gd; @@ -1688,6 +1572,8 @@ static int sd_probe(struct device *dev) 'a' + m1, 'a' + m2, 'a' + m3); } + strcpy(gd->devfs_name, sdp->devfs_name); + gd->private_data = &sdkp->driver; gd->queue = sdkp->device->request_queue; @@ -1706,11 +1592,11 @@ static int sd_probe(struct device *dev) return 0; - out_put: +out_put: put_disk(gd); - out_free: +out_free: kfree(sdkp); - out: +out: return error; } @@ -1729,13 +1615,12 @@ static int sd_remove(struct device *dev) { struct scsi_disk *sdkp = dev_get_drvdata(dev); - class_device_del(&sdkp->cdev); del_gendisk(sdkp->disk); sd_shutdown(dev); mutex_lock(&sd_ref_mutex); dev_set_drvdata(dev, NULL); - class_device_put(&sdkp->cdev); + kref_put(&sdkp->kref, scsi_disk_release); mutex_unlock(&sd_ref_mutex); return 0; @@ -1743,16 +1628,16 @@ static int sd_remove(struct device *dev) /** * scsi_disk_release - Called to free the scsi_disk structure - * @cdev: pointer to embedded class device + * @kref: pointer to embedded kref * * sd_ref_mutex must be held entering this routine. Because it is * called on last put, you should always use the scsi_disk_get() * scsi_disk_put() helpers which manipulate the semaphore directly - * and never do a direct class_device_put(). + * and never do a direct kref_put(). **/ -static void scsi_disk_release(struct class_device *cdev) +static void scsi_disk_release(struct kref *kref) { - struct scsi_disk *sdkp = to_scsi_disk(cdev); + struct scsi_disk *sdkp = to_scsi_disk(kref); struct gendisk *disk = sdkp->disk; spin_lock(&sd_index_lock); @@ -1806,8 +1691,6 @@ static int __init init_sd(void) if (!majors) return -ENODEV; - class_register(&sd_disk_class); - return scsi_register_driver(&sd_template.gendrv); } @@ -1825,9 +1708,11 @@ static void __exit exit_sd(void) scsi_unregister_driver(&sd_template.gendrv); for (i = 0; i < SD_MAJORS; i++) unregister_blkdev(sd_major(i), "sd"); - - class_unregister(&sd_disk_class); } +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Eric Youngdale"); +MODULE_DESCRIPTION("SCSI disk (sd) driver"); + module_init(init_sd); module_exit(exit_sd); diff --git a/drivers/scsi/seagate.c b/drivers/scsi/seagate.c index 2679ea8bf..0ff83ddf1 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 ARRAY_SIZE(signatures) +#define NUM_SIGNATURES (sizeof(signatures) / sizeof(Signature)) #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 < ARRAY_SIZE(seagate_bases); ++i) { + for (i = 0; i < (sizeof (seagate_bases) / sizeof (unsigned int)); ++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, IRQF_DISABLED, (controller_type == SEAGATE) ? "seagate" : "tmc-8xx", instance)) { + if (request_irq (irq, do_seagate_reconnect_intr, SA_INTERRUPT, (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->request_buffer; + buffer = (struct scatterlist *) SCint->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 34f9343ed..5a0a19322 100644 --- a/drivers/scsi/sg.c +++ b/drivers/scsi/sg.c @@ -18,8 +18,8 @@ * */ -static int sg_version_num = 30534; /* 2 digits for each component */ -#define SG_VERSION_STR "3.5.34" +static int sg_version_num = 30533; /* 2 digits for each component */ +#define SG_VERSION_STR "3.5.33" /* * D. P. Gilbert (dgilbert@interlog.com, dougg@triode.net.au), notes: @@ -28,6 +28,7 @@ static int sg_version_num = 30534; /* 2 digits for each component */ * (otherwise the macros compile to empty statements). * */ +#include #include #include @@ -43,6 +44,7 @@ static int sg_version_num = 30534; /* 2 digits for each component */ #include #include #include +#include #include #include #include @@ -60,7 +62,7 @@ static int sg_version_num = 30534; /* 2 digits for each component */ #ifdef CONFIG_SCSI_PROC_FS #include -static char *sg_version_date = "20060818"; +static char *sg_version_date = "20050908"; static int sg_proc_init(void); static void sg_proc_cleanup(void); @@ -747,7 +749,6 @@ sg_common_write(Sg_fd * sfp, Sg_request * srp, /* * most likely out of mem, but could also be a bad map */ - sg_finish_rem_req(srp); return -ENOMEM; } else return 0; @@ -1044,7 +1045,7 @@ sg_ioctl(struct inode *inode, struct file *filp, if (!sg_allow_access(opcode, sdp->device->type)) return -EPERM; } - return sg_scsi_ioctl(filp, sdp->device->request_queue, NULL, p); + return scsi_ioctl_send_command(sdp->device, p); case SG_SET_DEBUG: result = get_user(val, ip); if (result) @@ -1139,6 +1140,32 @@ sg_fasync(int fd, struct file *filp, int mode) return (retval < 0) ? retval : 0; } +/* When startFinish==1 increments page counts for pages other than the + first of scatter gather elements obtained from alloc_pages(). + When startFinish==0 decrements ... */ +static void +sg_rb_correct4mmap(Sg_scatter_hold * rsv_schp, int startFinish) +{ + struct scatterlist *sg = rsv_schp->buffer; + struct page *page; + int k, m; + + SCSI_LOG_TIMEOUT(3, printk("sg_rb_correct4mmap: startFinish=%d, scatg=%d\n", + startFinish, rsv_schp->k_use_sg)); + /* N.B. correction _not_ applied to base page of each allocation */ + for (k = 0; k < rsv_schp->k_use_sg; ++k, ++sg) { + for (m = PAGE_SIZE; m < sg->length; m += PAGE_SIZE) { + page = sg->page; + if (startFinish) + get_page(page); + else { + if (page_count(page) > 0) + __put_page(page); + } + } + } +} + static struct page * sg_vma_nopage(struct vm_area_struct *vma, unsigned long addr, int *type) { @@ -1164,7 +1191,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 = virt_to_page(page_address(sg->page) + offset); + page = sg->page; get_page(page); /* increment page count */ break; } @@ -1210,7 +1237,10 @@ sg_mmap(struct file *filp, struct vm_area_struct *vma) sa += len; } - sfp->mmap_called = 1; + if (0 == sfp->mmap_called) { + sg_rb_correct4mmap(rsv_schp, 1); /* do only once per fd lifetime */ + sfp->mmap_called = 1; + } vma->vm_flags |= VM_RESERVED; vma->vm_private_data = sfp; vma->vm_ops = &sg_mmap_vm_ops; @@ -1331,7 +1361,7 @@ static int sg_alloc(struct gendisk *disk, struct scsi_device *scsidp) void *old_sg_dev_arr = NULL; int k, error; - sdp = kzalloc(sizeof(Sg_device), GFP_KERNEL); + sdp = kmalloc(sizeof(Sg_device), GFP_KERNEL); if (!sdp) { printk(KERN_WARNING "kmalloc Sg_device failure\n"); return -ENOMEM; @@ -1343,11 +1373,12 @@ static int sg_alloc(struct gendisk *disk, struct scsi_device *scsidp) int tmp_dev_max = sg_nr_dev + SG_DEV_ARR_LUMP; write_unlock_irqrestore(&sg_dev_arr_lock, iflags); - tmp_da = kzalloc(tmp_dev_max * sizeof(Sg_device *), GFP_KERNEL); + tmp_da = kmalloc(tmp_dev_max * sizeof(Sg_device *), GFP_KERNEL); if (unlikely(!tmp_da)) goto expand_failed; write_lock_irqsave(&sg_dev_arr_lock, iflags); + memset(tmp_da, 0, tmp_dev_max * sizeof(Sg_device *)); memcpy(tmp_da, sg_dev_arr, sg_dev_max * sizeof(Sg_device *)); old_sg_dev_arr = sg_dev_arr; sg_dev_arr = tmp_da; @@ -1360,6 +1391,7 @@ static int sg_alloc(struct gendisk *disk, struct scsi_device *scsidp) if (unlikely(k >= SG_MAX_DEVS)) goto overflow; + memset(sdp, 0, sizeof(*sdp)); SCSI_LOG_TIMEOUT(3, printk("sg_alloc: dev=%d \n", k)); sprintf(disk->disk_name, "sg%d", k); disk->first_minor = k; @@ -1401,7 +1433,6 @@ 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) { @@ -1427,10 +1458,14 @@ sg_add(struct class_device *cl_dev, struct class_interface *cl_intf) k = error; sdp = sg_dev_arr[k]; + devfs_mk_cdev(MKDEV(SCSI_GENERIC_MAJOR, k), + S_IFCHR | S_IRUSR | S_IWUSR | S_IRGRP, + "%s/generic", scsidp->devfs_name); error = cdev_add(cdev, MKDEV(SCSI_GENERIC_MAJOR, k), 1); - if (error) - goto cdev_add_err; - + if (error) { + devfs_remove("%s/generic", scsidp->devfs_name); + goto out; + } sdp->cdev = cdev; if (sg_sysfs_valid) { struct class_device * sg_class_member; @@ -1456,13 +1491,6 @@ 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) @@ -1527,6 +1555,7 @@ sg_remove(struct class_device *cl_dev, struct class_interface *cl_intf) class_device_destroy(sg_sysfs_class, MKDEV(SCSI_GENERIC_MAJOR, k)); cdev_del(sdp->cdev); sdp->cdev = NULL; + devfs_remove("%s/generic", scsidp->devfs_name); put_disk(sdp->disk); sdp->disk = NULL; if (NULL == sdp->headfp) @@ -1548,7 +1577,6 @@ MODULE_AUTHOR("Douglas Gilbert"); MODULE_DESCRIPTION("SCSI generic (sg) driver"); MODULE_LICENSE("GPL"); MODULE_VERSION(SG_VERSION_STR); -MODULE_ALIAS_CHARDEV_MAJOR(SCSI_GENERIC_MAJOR); MODULE_PARM_DESC(def_reserved_size, "size of buffer reserved for each fd"); MODULE_PARM_DESC(allow_dio, "allow direct I/O (default: 0 (disallow))"); @@ -1806,10 +1834,8 @@ sg_build_direct(Sg_request * srp, Sg_fd * sfp, int dxfer_len) res = st_map_user_pages(schp->buffer, mx_sc_elems, (unsigned long)hp->dxferp, dxfer_len, (SG_DXFER_TO_DEV == hp->dxfer_direction) ? 1 : 0); - if (res <= 0) { - sg_remove_scat(schp); + if (res <= 0) return 1; - } schp->k_use_sg = res; schp->dio_in_use = 1; hp->info |= SG_INFO_DIRECT_IO; @@ -2369,6 +2395,8 @@ __sg_remove_sfp(Sg_device * sdp, Sg_fd * sfp) SCSI_LOG_TIMEOUT(6, printk("__sg_remove_sfp: bufflen=%d, k_use_sg=%d\n", (int) sfp->reserve.bufflen, (int) sfp->reserve.k_use_sg)); + if (sfp->mmap_called) + sg_rb_correct4mmap(&sfp->reserve, 0); /* undo correction */ sg_remove_scat(&sfp->reserve); } sfp->parentdp = NULL; @@ -2450,9 +2478,9 @@ sg_page_malloc(int rqSz, int lowDma, int *retSzp) return resp; if (lowDma) - page_mask = GFP_ATOMIC | GFP_DMA | __GFP_COMP | __GFP_NOWARN; + page_mask = GFP_ATOMIC | GFP_DMA | __GFP_NOWARN; else - page_mask = GFP_ATOMIC | __GFP_COMP | __GFP_NOWARN; + page_mask = GFP_ATOMIC | __GFP_NOWARN; for (order = 0, a_size = PAGE_SIZE; a_size < rqSz; order++, a_size <<= 1) ; @@ -2642,7 +2670,8 @@ static int sg_proc_init(void) { int k, mask; - int num_leaves = ARRAY_SIZE(sg_proc_leaf_arr); + int num_leaves = + sizeof (sg_proc_leaf_arr) / sizeof (sg_proc_leaf_arr[0]); struct proc_dir_entry *pdep; struct sg_proc_leaf * leaf; @@ -2667,7 +2696,8 @@ static void sg_proc_cleanup(void) { int k; - int num_leaves = ARRAY_SIZE(sg_proc_leaf_arr); + int num_leaves = + sizeof (sg_proc_leaf_arr) / sizeof (sg_proc_leaf_arr[0]); if (!sg_proc_sgp) return; @@ -2944,3 +2974,4 @@ static int sg_proc_seq_show_debug(struct seq_file *s, void *v) module_init(init_sg); module_exit(exit_sg); +MODULE_ALIAS_CHARDEV_MAJOR(SCSI_GENERIC_MAJOR); diff --git a/drivers/scsi/sgiwd93.c b/drivers/scsi/sgiwd93.c index 7cd366fcc..bf2ceb543 100644 --- a/drivers/scsi/sgiwd93.c +++ b/drivers/scsi/sgiwd93.c @@ -265,7 +265,7 @@ out_unregister: return NULL; } -static int __init sgiwd93_detect(struct scsi_host_template *SGIblows) +int __init sgiwd93_detect(struct scsi_host_template *SGIblows) { int found = 0; @@ -288,7 +288,7 @@ static int __init sgiwd93_detect(struct scsi_host_template *SGIblows) return found; } -static int sgiwd93_release(struct Scsi_Host *instance) +int sgiwd93_release(struct Scsi_Host *instance) { struct ip22_hostdata *hdata = HDATA(instance); int irq = 0; diff --git a/drivers/scsi/sim710.c b/drivers/scsi/sim710.c index b27e85428..917178834 100644 --- a/drivers/scsi/sim710.c +++ b/drivers/scsi/sim710.c @@ -26,6 +26,7 @@ * */ +#include #include #include @@ -74,7 +75,7 @@ param_setup(char *str) else if(!strncmp(pos, "id:", 3)) { if(slot == -1) { printk(KERN_WARNING "sim710: Must specify slot for id parameter\n"); - } else if(slot >= MAX_SLOTS) { + } else if(slot > MAX_SLOTS) { printk(KERN_WARNING "sim710: Illegal slot %d for id %d\n", slot, val); } else { id_array[slot] = val; @@ -133,7 +134,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, IRQF_SHARED, "sim710", host)) { + if (request_irq(irq, NCR_700_intr, SA_SHIRQ, "sim710", host)) { printk(KERN_ERR "sim710: request_irq failed\n"); goto out_put_host; } @@ -145,7 +146,7 @@ sim710_probe_common(struct device *dev, unsigned long base_addr, out_put_host: scsi_host_put(host); out_release: - release_region(base_addr, 64); + release_region(host->base, 64); out_free: kfree(hostdata); out: diff --git a/drivers/scsi/sr.c b/drivers/scsi/sr.c index fae6e95a6..997f8e305 100644 --- a/drivers/scsi/sr.c +++ b/drivers/scsi/sr.c @@ -60,10 +60,6 @@ #include "sr.h" -MODULE_DESCRIPTION("SCSI cdrom (sr) driver"); -MODULE_LICENSE("GPL"); -MODULE_ALIAS_BLOCKDEV_MAJOR(SCSI_CDROM_MAJOR); - #define SR_DISKS 256 #define MAX_RETRIES 3 @@ -71,7 +67,7 @@ MODULE_ALIAS_BLOCKDEV_MAJOR(SCSI_CDROM_MAJOR); #define SR_CAPABILITIES \ (CDC_CLOSE_TRAY|CDC_OPEN_TRAY|CDC_LOCK|CDC_SELECT_SPEED| \ CDC_SELECT_DISC|CDC_MULTI_SESSION|CDC_MCN|CDC_MEDIA_CHANGED| \ - CDC_PLAY_AUDIO|CDC_RESET|CDC_DRIVE_STATUS| \ + CDC_PLAY_AUDIO|CDC_RESET|CDC_IOCTLS|CDC_DRIVE_STATUS| \ CDC_CD_R|CDC_CD_RW|CDC_DVD|CDC_DVD_R|CDC_DVD_RAM|CDC_GENERIC_PACKET| \ CDC_MRW|CDC_MRW_W|CDC_RAM) @@ -118,6 +114,7 @@ static struct cdrom_device_ops sr_dops = { .get_mcn = sr_get_mcn, .reset = sr_reset, .audio_ioctl = sr_audio_ioctl, + .dev_ioctl = sr_dev_ioctl, .capability = SR_CAPABILITIES, .generic_packet = sr_packet, }; @@ -217,7 +214,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->request_bufflen; + int this_count = SCpnt->bufflen; int good_bytes = (result == 0 ? this_count : 0); int block_sectors = 0; long error_sector; @@ -292,7 +289,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); + scsi_io_completion(SCpnt, good_bytes, block_sectors << 9); } static int sr_init_command(struct scsi_cmnd * SCpnt) @@ -360,7 +357,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 = size; + SCpnt->request_bufflen = SCpnt->bufflen = size; } } @@ -387,7 +384,8 @@ static int sr_init_command(struct scsi_cmnd * SCpnt) if (this_count > 0xffff) { this_count = 0xffff; - SCpnt->request_bufflen = this_count * s_size; + SCpnt->request_bufflen = SCpnt->bufflen = + this_count * s_size; } SCpnt->cmnd[2] = (unsigned char) (block >> 24) & 0xff; @@ -454,33 +452,17 @@ static int sr_block_ioctl(struct inode *inode, struct file *file, unsigned cmd, { struct scsi_cd *cd = scsi_cd(inode->i_bdev->bd_disk); struct scsi_device *sdev = cd->device; - void __user *argp = (void __user *)arg; - int ret; - /* - * Send SCSI addressing ioctls directly to mid level, send other - * ioctls to cdrom/block level. - */ - switch (cmd) { - case SCSI_IOCTL_GET_IDLUN: - case SCSI_IOCTL_GET_BUS_NUMBER: - return scsi_ioctl(sdev, cmd, argp); + /* + * Send SCSI addressing ioctls directly to mid level, send other + * ioctls to cdrom/block level. + */ + switch (cmd) { + case SCSI_IOCTL_GET_IDLUN: + case SCSI_IOCTL_GET_BUS_NUMBER: + return scsi_ioctl(sdev, cmd, (void __user *)arg); } - - ret = cdrom_ioctl(file, &cd->cdi, inode, cmd, arg); - if (ret != ENOSYS) - return ret; - - /* - * ENODEV means that we didn't recognise the ioctl, or that we - * cannot execute it in the current device state. In either - * case fall through to scsi_ioctl, which will return ENDOEV again - * if it doesn't recognise the ioctl - */ - ret = scsi_nonblockable_ioctl(sdev, cmd, argp, NULL); - if (ret != -ENODEV) - return ret; - return scsi_ioctl(sdev, cmd, argp); + return cdrom_ioctl(file, &cd->cdi, inode, cmd, arg); } static int sr_block_media_changed(struct gendisk *disk) @@ -543,9 +525,10 @@ static int sr_probe(struct device *dev) goto fail; error = -ENOMEM; - cd = kzalloc(sizeof(*cd), GFP_KERNEL); + cd = kmalloc(sizeof(*cd), GFP_KERNEL); if (!cd) goto fail; + memset(cd, 0, sizeof(*cd)); kref_init(&cd->kref); @@ -591,6 +574,8 @@ static int sr_probe(struct device *dev) get_capabilities(cd); sr_vendor_init(cd); + snprintf(disk->devfs_name, sizeof(disk->devfs_name), + "%s/cd", sdev->devfs_name); disk->driverfs_dev = &sdev->sdev_gendev; set_capacity(disk, cd->capacity); disk->private_data = &cd->driver; diff --git a/drivers/scsi/sr.h b/drivers/scsi/sr.h index d65de9621..d2bcd99c2 100644 --- a/drivers/scsi/sr.h +++ b/drivers/scsi/sr.h @@ -55,6 +55,7 @@ int sr_get_mcn(struct cdrom_device_info *, struct cdrom_mcn *); int sr_reset(struct cdrom_device_info *); int sr_select_speed(struct cdrom_device_info *cdi, int speed); int sr_audio_ioctl(struct cdrom_device_info *, unsigned int, void *); +int sr_dev_ioctl(struct cdrom_device_info *, unsigned int, unsigned long); int sr_is_xa(Scsi_CD *); diff --git a/drivers/scsi/sr_ioctl.c b/drivers/scsi/sr_ioctl.c index d1268cb46..b65462f76 100644 --- a/drivers/scsi/sr_ioctl.c +++ b/drivers/scsi/sr_ioctl.c @@ -562,3 +562,22 @@ int sr_is_xa(Scsi_CD *cd) #endif return is_xa; } + +int sr_dev_ioctl(struct cdrom_device_info *cdi, + unsigned int cmd, unsigned long arg) +{ + Scsi_CD *cd = cdi->handle; + int ret; + + ret = scsi_nonblockable_ioctl(cd->device, cmd, + (void __user *)arg, NULL); + /* + * ENODEV means that we didn't recognise the ioctl, or that we + * cannot execute it in the current device state. In either + * case fall through to scsi_ioctl, which will return ENDOEV again + * if it doesn't recognise the ioctl + */ + if (ret != -ENODEV) + return ret; + return scsi_ioctl(cd->device, cmd, (void __user *)arg); +} diff --git a/drivers/scsi/sr_vendor.c b/drivers/scsi/sr_vendor.c index a3e9d0f2e..9dde8df2f 100644 --- a/drivers/scsi/sr_vendor.c +++ b/drivers/scsi/sr_vendor.c @@ -34,6 +34,7 @@ * HP 6020 writers now supported. */ +#include #include #include #include diff --git a/drivers/scsi/st.c b/drivers/scsi/st.c index 7f669b600..7f96f33c1 100644 --- a/drivers/scsi/st.c +++ b/drivers/scsi/st.c @@ -35,6 +35,7 @@ static const char *verstr = "20050830"; #include #include #include +#include #include #include #include @@ -86,9 +87,8 @@ static int st_nr_dev; static struct class *st_sysfs_class; MODULE_AUTHOR("Kai Makisara"); -MODULE_DESCRIPTION("SCSI tape (st) driver"); +MODULE_DESCRIPTION("SCSI Tape Driver"); MODULE_LICENSE("GPL"); -MODULE_ALIAS_CHARDEV_MAJOR(SCSI_TAPE_MAJOR); /* Set 'perm' (4th argument) to 0 to disable module_param's definition * of sysfs parameters (which module_param doesn't yet support). @@ -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(name, SRpnt->sense, SCSI_SENSE_BUFFERSIZE); + __scsi_print_sense("st", SRpnt->sense, SCSI_SENSE_BUFFERSIZE); } ) /* end DEB */ if (!debugging) { /* Abnormal conditions for tape */ if (!cmdstatp->have_sense) @@ -384,8 +384,9 @@ 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) { - - __scsi_print_sense(name, SRpnt->sense, SCSI_SENSE_BUFFERSIZE); + printk(KERN_WARNING "%s: Error with sense data: ", name); + __scsi_print_sense("st", SRpnt->sense, + SCSI_SENSE_BUFFERSIZE); } } @@ -1192,7 +1193,7 @@ static int st_open(struct inode *inode, struct file *filp) /* Flush the tape buffer before close */ -static int st_flush(struct file *filp, fl_owner_t id) +static int st_flush(struct file *filp) { int result = 0, result2; unsigned char cmd[MAX_COMMAND_SIZE]; @@ -2817,7 +2818,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 successfully at EOM */ + ioctl_result = 0; /* EOF written succesfully at EOM */ if (fileno >= 0) fileno++; STps->drv_file = fileno; @@ -3589,15 +3590,17 @@ static struct st_buffer * i = sizeof(struct st_buffer) + (max_sg - 1) * sizeof(struct scatterlist) + max_sg * sizeof(struct st_buf_fragment); - tb = kzalloc(i, priority); + tb = kmalloc(i, priority); if (!tb) { printk(KERN_NOTICE "st: Can't allocate new tape buffer.\n"); return NULL; } + memset(tb, 0, i); tb->frp_segs = tb->orig_frp_segs = 0; 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; @@ -3837,7 +3840,7 @@ static int __init st_setup(char *str) break; } } - if (i >= ARRAY_SIZE(parms)) + if (i >= sizeof(parms) / sizeof(struct st_dev_parm)) printk(KERN_WARNING "st: invalid parameter in '%s'\n", stp); stp = strchr(stp, ','); @@ -3921,13 +3924,14 @@ static int st_probe(struct device *dev) goto out_put_disk; } - tmp_da = kzalloc(tmp_dev_max * sizeof(struct scsi_tape *), GFP_ATOMIC); + tmp_da = kmalloc(tmp_dev_max * sizeof(struct scsi_tape *), GFP_ATOMIC); if (tmp_da == NULL) { write_unlock(&st_dev_arr_lock); printk(KERN_ERR "st: Can't extend device array.\n"); goto out_put_disk; } + memset(tmp_da, 0, tmp_dev_max * sizeof(struct scsi_tape *)); if (scsi_tapes != NULL) { memcpy(tmp_da, scsi_tapes, st_dev_max * sizeof(struct scsi_tape *)); @@ -3944,12 +3948,13 @@ static int st_probe(struct device *dev) if (i >= st_dev_max) panic("scsi_devices corrupt (st)"); - tpnt = kzalloc(sizeof(struct scsi_tape), GFP_ATOMIC); + tpnt = kmalloc(sizeof(struct scsi_tape), GFP_ATOMIC); if (tpnt == NULL) { write_unlock(&st_dev_arr_lock); printk(KERN_ERR "st: Can't allocate device descriptor.\n"); goto out_put_disk; } + memset(tpnt, 0, sizeof(struct scsi_tape)); kref_init(&tpnt->kref); tpnt->disk = disk; sprintf(disk->disk_name, "st%d", i); @@ -4051,8 +4056,23 @@ static int st_probe(struct device *dev) do_create_class_files(tpnt, dev_num, mode); } + for (mode = 0; mode < ST_NBR_MODES; ++mode) { + /* Make sure that the minor numbers corresponding to the four + first modes always get the same names */ + i = mode << (4 - ST_NBR_MODE_BITS); + /* Rewind entry */ + devfs_mk_cdev(MKDEV(SCSI_TAPE_MAJOR, TAPE_MINOR(dev_num, mode, 0)), + S_IFCHR | S_IRUGO | S_IWUGO, + "%s/mt%s", SDp->devfs_name, st_formats[i]); + /* No-rewind entry */ + devfs_mk_cdev(MKDEV(SCSI_TAPE_MAJOR, TAPE_MINOR(dev_num, mode, 1)), + S_IFCHR | S_IRUGO | S_IWUGO, + "%s/mt%sn", SDp->devfs_name, st_formats[i]); + } + disk->number = devfs_register_tape(SDp->devfs_name); + sdev_printk(KERN_WARNING, SDp, - "Attached scsi tape %s\n", tape_name(tpnt)); + "Attached scsi tape %s", tape_name(tpnt)); printk(KERN_WARNING "%s: try direct i/o: %s (alignment %d B)\n", tape_name(tpnt), tpnt->try_dio ? "yes" : "no", queue_dma_alignment(SDp->request_queue) + 1); @@ -4104,9 +4124,13 @@ static int st_remove(struct device *dev) scsi_tapes[i] = NULL; st_nr_dev--; write_unlock(&st_dev_arr_lock); + devfs_unregister_tape(tpnt->disk->number); sysfs_remove_link(&tpnt->device->sdev_gendev.kobj, "tape"); for (mode = 0; mode < ST_NBR_MODES; ++mode) { + j = mode << (4 - ST_NBR_MODE_BITS); + devfs_remove("%s/mt%s", SDp->devfs_name, st_formats[j]); + devfs_remove("%s/mt%sn", SDp->devfs_name, st_formats[j]); for (j=0; j < 2; j++) { class_device_destroy(st_sysfs_class, MKDEV(SCSI_TAPE_MAJOR, diff --git a/drivers/scsi/st.h b/drivers/scsi/st.h index 05a5cae12..411209048 100644 --- a/drivers/scsi/st.h +++ b/drivers/scsi/st.h @@ -31,6 +31,7 @@ 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 2f8073b73..25cced91c 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->request_buffer; + cmd->SCp.buffer = (struct scatterlist *) cmd->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,6 +535,7 @@ 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 6b60536ac..cc990bed9 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, IRQF_DISABLED, + if (request_irq(esp->irq, esp_intr, SA_INTERRUPT, "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].dma_address = dvma_map((unsigned long)page_address(sg[sz].page) + + sg[sz].dvma_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->dma_address); + sp->SCp.ptr=(char *)((unsigned long)sp->SCp.buffer->dvma_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->request_buffer; + struct scatterlist *sg = (struct scatterlist *)sp->buffer; while(sz >= 0) { - dvma_unmap((char *)sg[sz].dma_address); + dvma_unmap((char *)sg[sz].dvma_address); sz--; } } static void dma_advance_sg (Scsi_Cmnd *sp) { - sp->SCp.ptr = (char *)((unsigned long)sp->SCp.buffer->dma_address); + sp->SCp.ptr = (char *)((unsigned long)sp->SCp.buffer->dvma_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 7519728df..481103769 100644 --- a/drivers/scsi/sym53c8xx_2/sym53c8xx.h +++ b/drivers/scsi/sym53c8xx_2/sym53c8xx.h @@ -40,6 +40,7 @@ #ifndef SYM53C8XX_H #define SYM53C8XX_H +#include /* * DMA addressing mode. diff --git a/drivers/scsi/sym53c8xx_2/sym_defs.h b/drivers/scsi/sym53c8xx_2/sym_defs.h index defccc477..3659dd7b9 100644 --- a/drivers/scsi/sym53c8xx_2/sym_defs.h +++ b/drivers/scsi/sym53c8xx_2/sym_defs.h @@ -40,7 +40,7 @@ #ifndef SYM_DEFS_H #define SYM_DEFS_H -#define SYM_VERSION "2.2.3" +#define SYM_VERSION "2.2.2" #define SYM_DRIVER_NAME "sym-" SYM_VERSION /* diff --git a/drivers/scsi/sym53c8xx_2/sym_glue.c b/drivers/scsi/sym53c8xx_2/sym_glue.c index 739d3ef46..1fffd2b3c 100644 --- a/drivers/scsi/sym53c8xx_2/sym_glue.c +++ b/drivers/scsi/sym53c8xx_2/sym_glue.c @@ -54,8 +54,14 @@ #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; @@ -128,17 +134,66 @@ static void sym2_setup_params(void) } } +/* + * We used to try to deal with 64-bit BARs here, but don't any more. + * There are many parts of this driver which would need to be modified + * to handle a 64-bit base address, including scripts. I'm uncomfortable + * with making those changes when I have no way of testing it, so I'm + * just going to disable it. + * + * Note that some machines (eg HP rx8620 and Superdome) have bus addresses + * below 4GB and physical addresses above 4GB. These will continue to work. + */ +static int __devinit +pci_get_base_address(struct pci_dev *pdev, int index, unsigned long *basep) +{ + u32 tmp; + unsigned long base; +#define PCI_BAR_OFFSET(index) (PCI_BASE_ADDRESS_0 + (index<<2)) + + pci_read_config_dword(pdev, PCI_BAR_OFFSET(index++), &tmp); + base = tmp; + if ((tmp & 0x7) == PCI_BASE_ADDRESS_MEM_TYPE_64) { + pci_read_config_dword(pdev, PCI_BAR_OFFSET(index++), &tmp); + if (tmp > 0) { + dev_err(&pdev->dev, + "BAR %d is 64-bit, disabling\n", index - 1); + base = 0; + } + } + + if ((base & PCI_BASE_ADDRESS_SPACE) == PCI_BASE_ADDRESS_SPACE_IO) { + base &= PCI_BASE_ADDRESS_IO_MASK; + } else { + base &= PCI_BASE_ADDRESS_MEM_MASK; + } + + *basep = base; + return index; +#undef PCI_BAR_OFFSET +} + static struct scsi_transport_template *sym2_transport_template = NULL; +/* + * Used by the eh thread to wait for command completion. + * It is allocated on the eh thread stack. + */ +struct sym_eh_wait { + struct completion done; + struct timer_list timer; + void (*old_done)(struct scsi_cmnd *); + int to_do; + int timed_out; +}; + /* * Driver private area in the SCSI command structure. */ struct sym_ucmd { /* Override the SCSI pointer structure */ - dma_addr_t data_mapping; - unsigned char data_mapped; - unsigned char to_do; /* For error handling */ - void (*old_done)(struct scsi_cmnd *); /* For error handling */ - struct completion *eh_done; /* For error handling */ + dma_addr_t data_mapping; + u_char data_mapped; + struct sym_eh_wait *eh_wait; }; #define SYM_UCMD_PTR(cmd) ((struct sym_ucmd *)(&(cmd)->SCp)) @@ -150,7 +205,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->request_buffer, cmd->use_sg, dma_dir); + pci_unmap_sg(pdev, cmd->buffer, cmd->use_sg, dma_dir); break; case 1: pci_unmap_single(pdev, SYM_UCMD_PTR(cmd)->data_mapping, @@ -180,7 +235,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->request_buffer, cmd->use_sg, dma_dir); + use_sg = pci_map_sg(pdev, cmd->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; @@ -370,7 +425,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->request_buffer; + struct scatterlist *scatter = (struct scatterlist *)cmd->buffer; struct sym_tcb *tp = &np->target[cp->target]; struct sym_tblmove *data; @@ -459,6 +514,8 @@ static inline int sym_setup_cdb(struct sym_hcb *np, struct scsi_cmnd *cmd, struc */ int sym_setup_data_and_start(struct sym_hcb *np, struct scsi_cmnd *cmd, struct sym_ccb *cp) { + struct sym_tcb *tp = &np->target[cp->target]; + struct sym_lcb *lp = sym_lp(tp, cp->lun); u32 lastp, goalp; int dir; @@ -539,7 +596,7 @@ int sym_setup_data_and_start(struct sym_hcb *np, struct scsi_cmnd *cmd, struct s /* * activate this job. */ - sym_put_start_queue(np, cp); + sym_start_next_ccbs(np, lp, 2); return 0; out_abort: @@ -694,22 +751,44 @@ static void sym53c8xx_timer(unsigned long npref) * What we will do regarding the involved SCSI command. */ #define SYM_EH_DO_IGNORE 0 +#define SYM_EH_DO_COMPLETE 1 #define SYM_EH_DO_WAIT 2 /* - * scsi_done() alias when error recovery is in progress. + * Our general completion handler. */ -static void sym_eh_done(struct scsi_cmnd *cmd) +static void __sym_eh_done(struct scsi_cmnd *cmd, int timed_out) { - struct sym_ucmd *ucmd = SYM_UCMD_PTR(cmd); - BUILD_BUG_ON(sizeof(struct scsi_pointer) < sizeof(struct sym_ucmd)); + struct sym_eh_wait *ep = SYM_UCMD_PTR(cmd)->eh_wait; + if (!ep) + return; + + /* Try to avoid a race here (not 100% safe) */ + if (!timed_out) { + ep->timed_out = 0; + if (ep->to_do == SYM_EH_DO_WAIT && !del_timer(&ep->timer)) + return; + } - cmd->scsi_done = ucmd->old_done; + /* Revert everything */ + SYM_UCMD_PTR(cmd)->eh_wait = NULL; + cmd->scsi_done = ep->old_done; - if (ucmd->to_do == SYM_EH_DO_WAIT) - complete(ucmd->eh_done); + /* Wake up the eh thread if it wants to sleep */ + if (ep->to_do == SYM_EH_DO_WAIT) + complete(&ep->done); } +/* + * scsi_done() alias when error recovery is in progress. + */ +static void sym_eh_done(struct scsi_cmnd *cmd) { __sym_eh_done(cmd, 0); } + +/* + * Some timeout handler to avoid waiting too long. + */ +static void sym_eh_timeout(u_long p) { __sym_eh_done((struct scsi_cmnd *)p, 1); } + /* * Generic method for our eh processing. * The 'op' argument tells what we have to do. @@ -717,31 +796,35 @@ static void sym_eh_done(struct scsi_cmnd *cmd) static int sym_eh_handler(int op, char *opname, struct scsi_cmnd *cmd) { struct sym_hcb *np = SYM_SOFTC_PTR(cmd); - struct sym_ucmd *ucmd = SYM_UCMD_PTR(cmd); - struct Scsi_Host *host = cmd->device->host; SYM_QUEHEAD *qp; int to_do = SYM_EH_DO_IGNORE; int sts = -1; - struct completion eh_done; + struct sym_eh_wait eh, *ep = &eh; dev_warn(&cmd->device->sdev_gendev, "%s operation started.\n", opname); - spin_lock_irq(host->host_lock); /* This one is queued in some place -> to wait for completion */ FOR_EACH_QUEUED_ELEMENT(&np->busy_ccbq, qp) { struct sym_ccb *cp = sym_que_entry(qp, struct sym_ccb, link_ccbq); if (cp->cmd == cmd) { to_do = SYM_EH_DO_WAIT; - break; + goto prepare; } } - if (to_do == SYM_EH_DO_WAIT) { - init_completion(&eh_done); - ucmd->old_done = cmd->scsi_done; - ucmd->eh_done = &eh_done; - wmb(); +prepare: + /* Prepare stuff to either ignore, complete or wait for completion */ + switch(to_do) { + default: + case SYM_EH_DO_IGNORE: + break; + case SYM_EH_DO_WAIT: + init_completion(&ep->done); + /* fall through */ + case SYM_EH_DO_COMPLETE: + ep->old_done = cmd->scsi_done; cmd->scsi_done = sym_eh_done; + SYM_UCMD_PTR(cmd)->eh_wait = ep; } /* Try to proceed the operation we have been asked for */ @@ -768,19 +851,29 @@ static int sym_eh_handler(int op, char *opname, struct scsi_cmnd *cmd) /* On error, restore everything and cross fingers :) */ if (sts) { - cmd->scsi_done = ucmd->old_done; + SYM_UCMD_PTR(cmd)->eh_wait = NULL; + cmd->scsi_done = ep->old_done; to_do = SYM_EH_DO_IGNORE; } - ucmd->to_do = to_do; - spin_unlock_irq(host->host_lock); + ep->to_do = to_do; + /* Complete the command with locks held as required by the driver */ + if (to_do == SYM_EH_DO_COMPLETE) + sym_xpt_done2(np, cmd, DID_ABORT); + /* Wait for completion with locks released, as required by kernel */ if (to_do == SYM_EH_DO_WAIT) { - if (!wait_for_completion_timeout(&eh_done, 5*HZ)) { - ucmd->to_do = SYM_EH_DO_IGNORE; - wmb(); + init_timer(&ep->timer); + ep->timer.expires = jiffies + (5*HZ); + ep->timer.function = sym_eh_timeout; + ep->timer.data = (u_long)cmd; + ep->timed_out = 1; /* Be pessimistic for once :) */ + add_timer(&ep->timer); + spin_unlock_irq(np->s.host->host_lock); + wait_for_completion(&ep->done); + spin_lock_irq(np->s.host->host_lock); + if (ep->timed_out) sts = -2; - } } dev_warn(&cmd->device->sdev_gendev, "%s operation %s.\n", opname, sts==0 ? "complete" :sts==-2 ? "timed-out" : "failed"); @@ -793,22 +886,46 @@ static int sym_eh_handler(int op, char *opname, struct scsi_cmnd *cmd) */ static int sym53c8xx_eh_abort_handler(struct scsi_cmnd *cmd) { - return sym_eh_handler(SYM_EH_ABORT, "ABORT", cmd); + int rc; + + spin_lock_irq(cmd->device->host->host_lock); + rc = sym_eh_handler(SYM_EH_ABORT, "ABORT", cmd); + spin_unlock_irq(cmd->device->host->host_lock); + + return rc; } static int sym53c8xx_eh_device_reset_handler(struct scsi_cmnd *cmd) { - return sym_eh_handler(SYM_EH_DEVICE_RESET, "DEVICE RESET", cmd); + int rc; + + spin_lock_irq(cmd->device->host->host_lock); + rc = sym_eh_handler(SYM_EH_DEVICE_RESET, "DEVICE RESET", cmd); + spin_unlock_irq(cmd->device->host->host_lock); + + return rc; } static int sym53c8xx_eh_bus_reset_handler(struct scsi_cmnd *cmd) { - return sym_eh_handler(SYM_EH_BUS_RESET, "BUS RESET", cmd); + int rc; + + spin_lock_irq(cmd->device->host->host_lock); + rc = sym_eh_handler(SYM_EH_BUS_RESET, "BUS RESET", cmd); + spin_unlock_irq(cmd->device->host->host_lock); + + return rc; } static int sym53c8xx_eh_host_reset_handler(struct scsi_cmnd *cmd) { - return sym_eh_handler(SYM_EH_HOST_RESET, "HOST RESET", cmd); + int rc; + + spin_lock_irq(cmd->device->host->host_lock); + rc = sym_eh_handler(SYM_EH_HOST_RESET, "HOST RESET", cmd); + spin_unlock_irq(cmd->device->host->host_lock); + + return rc; } /* @@ -827,12 +944,15 @@ static void sym_tune_dev_queuing(struct sym_tcb *tp, int lun, u_short reqtags) if (reqtags > lp->s.scdev_depth) reqtags = lp->s.scdev_depth; + lp->started_limit = reqtags ? reqtags : 2; + lp->started_max = 1; lp->s.reqtags = reqtags; if (reqtags != oldtags) { dev_info(&tp->starget->dev, "tagged command queuing %s, command queue depth %d.\n", - lp->s.reqtags ? "enabled" : "disabled", reqtags); + lp->s.reqtags ? "enabled" : "disabled", + lp->started_limit); } } @@ -1547,7 +1667,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, IRQF_SHARED, NAME53C8XX, np)) { + if (request_irq(pdev->irq, sym53c8xx_intr, SA_SHIRQ, NAME53C8XX, np)) { printf_err("%s: request irq %d failure\n", sym_name(np), pdev->irq); goto attach_failed; @@ -1746,25 +1866,15 @@ static int __devinit sym_set_workarounds(struct sym_device *device) static void __devinit sym_init_device(struct pci_dev *pdev, struct sym_device *device) { - int i = 2; - struct pci_bus_region bus_addr; + int i; device->host_id = SYM_SETUP_HOST_ID; device->pdev = pdev; - pcibios_resource_to_bus(pdev, &bus_addr, &pdev->resource[1]); - device->mmio_base = bus_addr.start; + i = pci_get_base_address(pdev, 1, &device->mmio_base); + pci_get_base_address(pdev, i, &device->ram_base); - /* - * If the BAR is 64-bit, resource 2 will be occupied by the - * upper 32 bits - */ - if (!pdev->resource[i].flags) - i++; - pcibios_resource_to_bus(pdev, &bus_addr, &pdev->resource[i]); - device->ram_base = bus_addr.start; - -#ifdef CONFIG_SCSI_SYM53C8XX_MMIO +#ifndef CONFIG_SCSI_SYM53C8XX_IOMAPPED if (device->mmio_base) device->s.ioaddr = pci_iomap(pdev, 1, pci_resource_len(pdev, 1)); @@ -1868,8 +1978,7 @@ static struct scsi_host_template sym2_template = { .eh_bus_reset_handler = sym53c8xx_eh_bus_reset_handler, .eh_host_reset_handler = sym53c8xx_eh_host_reset_handler, .this_id = 7, - .use_clustering = ENABLE_CLUSTERING, - .max_sectors = 0xFFFF, + .use_clustering = DISABLE_CLUSTERING, #ifdef SYM_LINUX_PROC_INFO_SUPPORT .proc_info = sym53c8xx_proc_info, .proc_name = NAME53C8XX, @@ -2084,7 +2193,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, PCI_CLASS_STORAGE_SCSI<<8, 0xffff00, 0UL }, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, 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 e022d3c71..cc92d0c70 100644 --- a/drivers/scsi/sym53c8xx_2/sym_glue.h +++ b/drivers/scsi/sym53c8xx_2/sym_glue.h @@ -40,6 +40,7 @@ #ifndef SYM_GLUE_H #define SYM_GLUE_H +#include #include #include #include @@ -67,7 +68,7 @@ */ #define SYM_CONF_TIMER_INTERVAL ((HZ+1)/2) -#undef SYM_OPT_HANDLE_DEVICE_QUEUEING +#define SYM_OPT_HANDLE_DEVICE_QUEUEING #define SYM_OPT_LIMIT_COMMAND_REORDERING /* diff --git a/drivers/scsi/sym53c8xx_2/sym_hipd.c b/drivers/scsi/sym53c8xx_2/sym_hipd.c index 940fa1e6f..2627000ca 100644 --- a/drivers/scsi/sym53c8xx_2/sym_hipd.c +++ b/drivers/scsi/sym53c8xx_2/sym_hipd.c @@ -40,6 +40,7 @@ #include #include /* for timeouts in units of HZ */ +#include #include "sym_glue.h" #include "sym_nvram.h" @@ -72,10 +73,7 @@ static void sym_printl_hex(u_char *p, int n) static void sym_print_msg(struct sym_ccb *cp, char *label, u_char *msg) { - if (label) - sym_print_addr(cp->cmd, "%s: ", label); - else - sym_print_addr(cp->cmd, ""); + sym_print_addr(cp->cmd, "%s: ", label); spi_print_msg(msg); printf("\n"); @@ -475,7 +473,7 @@ static int sym_getpciclock (struct sym_hcb *np) * calculations more simple. */ #define _5M 5000000 -static const u32 div_10M[] = {2*_5M, 3*_5M, 4*_5M, 6*_5M, 8*_5M, 12*_5M, 16*_5M}; +static u32 div_10M[] = {2*_5M, 3*_5M, 4*_5M, 6*_5M, 8*_5M, 12*_5M, 16*_5M}; /* * Get clock factor and sync divisor for a given @@ -647,37 +645,6 @@ static void sym_save_initial_setting (struct sym_hcb *np) np->sv_ctest5 = INB(np, nc_ctest5) & 0x24; } -/* - * Set SCSI BUS mode. - * - LVD capable chips (895/895A/896/1010) report the current BUS mode - * through the STEST4 IO register. - * - For previous generation chips (825/825A/875), the user has to tell us - * how to check against HVD, since a 100% safe algorithm is not possible. - */ -static void sym_set_bus_mode(struct sym_hcb *np, struct sym_nvram *nvram) -{ - if (np->scsi_mode) - return; - - np->scsi_mode = SMODE_SE; - if (np->features & (FE_ULTRA2|FE_ULTRA3)) - np->scsi_mode = (np->sv_stest4 & SMODE); - else if (np->features & FE_DIFF) { - if (SYM_SETUP_SCSI_DIFF == 1) { - if (np->sv_scntl3) { - if (np->sv_stest2 & 0x20) - np->scsi_mode = SMODE_HVD; - } else if (nvram->type == SYM_SYMBIOS_NVRAM) { - if (!(INB(np, nc_gpreg) & 0x08)) - np->scsi_mode = SMODE_HVD; - } - } else if (SYM_SETUP_SCSI_DIFF == 2) - np->scsi_mode = SMODE_HVD; - } - if (np->scsi_mode == SMODE_HVD) - np->rv_stest2 |= 0x20; -} - /* * Prepare io register values used by sym_start_up() * according to selected and supported features. @@ -688,7 +655,10 @@ static int sym_prepare_setting(struct Scsi_Host *shost, struct sym_hcb *np, stru u32 period; int i; - np->maxwide = (np->features & FE_WIDE) ? 1 : 0; + /* + * Wide ? + */ + np->maxwide = (np->features & FE_WIDE)? 1 : 0; /* * Guess the frequency of the chip's clock. @@ -869,7 +839,6 @@ static int sym_prepare_setting(struct Scsi_Host *shost, struct sym_hcb *np, stru * Get parity checking, host ID and verbose mode from NVRAM */ np->myaddr = 255; - np->scsi_mode = 0; sym_nvram_setup_host(shost, np, nvram); /* @@ -886,7 +855,33 @@ static int sym_prepare_setting(struct Scsi_Host *shost, struct sym_hcb *np, stru */ sym_init_burst(np, burst_max); - sym_set_bus_mode(np, nvram); + /* + * Set SCSI BUS mode. + * - LVD capable chips (895/895A/896/1010) report the + * current BUS mode through the STEST4 IO register. + * - For previous generation chips (825/825A/875), + * user has to tell us how to check against HVD, + * since a 100% safe algorithm is not possible. + */ + np->scsi_mode = SMODE_SE; + if (np->features & (FE_ULTRA2|FE_ULTRA3)) + np->scsi_mode = (np->sv_stest4 & SMODE); + else if (np->features & FE_DIFF) { + if (SYM_SETUP_SCSI_DIFF == 1) { + if (np->sv_scntl3) { + if (np->sv_stest2 & 0x20) + np->scsi_mode = SMODE_HVD; + } + else if (nvram->type == SYM_SYMBIOS_NVRAM) { + if (!(INB(np, nc_gpreg) & 0x08)) + np->scsi_mode = SMODE_HVD; + } + } + else if (SYM_SETUP_SCSI_DIFF == 2) + np->scsi_mode = SMODE_HVD; + } + if (np->scsi_mode == SMODE_HVD) + np->rv_stest2 |= 0x20; /* * Set LED support from SCRIPTS. @@ -979,8 +974,8 @@ static int sym_prepare_setting(struct Scsi_Host *shost, struct sym_hcb *np, stru * * Has to be called with interrupts disabled. */ -#ifdef CONFIG_SCSI_SYM53C8XX_MMIO -static int sym_regtest(struct sym_hcb *np) +#ifndef CONFIG_SCSI_SYM53C8XX_IOMAPPED +static int sym_regtest (struct sym_hcb *np) { register volatile u32 data; /* @@ -998,25 +993,20 @@ static int sym_regtest(struct sym_hcb *np) #endif printf ("CACHE TEST FAILED: reg dstat-sstat2 readback %x.\n", (unsigned) data); - return 0x10; + return (0x10); } - return 0; -} -#else -static inline int sym_regtest(struct sym_hcb *np) -{ - return 0; + return (0); } #endif -static int sym_snooptest(struct sym_hcb *np) +static int sym_snooptest (struct sym_hcb *np) { - u32 sym_rd, sym_wr, sym_bk, host_rd, host_wr, pc, dstat; - int i, err; - - err = sym_regtest(np); - if (err) - return err; + u32 sym_rd, sym_wr, sym_bk, host_rd, host_wr, pc, dstat; + int i, err=0; +#ifndef CONFIG_SCSI_SYM53C8XX_IOMAPPED + err |= sym_regtest (np); + if (err) return (err); +#endif restart_test: /* * Enable Master Parity Checking as we intend @@ -1105,7 +1095,7 @@ restart_test: err |= 4; } - return err; + return (err); } /* @@ -1276,7 +1266,8 @@ static struct sym_chip sym_dev_table[] = { FE_RAM|FE_IO256|FE_LEDC} }; -#define sym_num_devs (ARRAY_SIZE(sym_dev_table)) +#define sym_num_devs \ + (sizeof(sym_dev_table) / sizeof(sym_dev_table[0])) /* * Look up the chip table. @@ -1441,18 +1432,29 @@ static int sym_prepare_nego(struct sym_hcb *np, struct sym_ccb *cp, u_char *msgp switch (nego) { case NS_SYNC: - msglen += spi_populate_sync_msg(msgptr + msglen, goal->period, - goal->offset); + msgptr[msglen++] = M_EXTENDED; + msgptr[msglen++] = 3; + msgptr[msglen++] = M_X_SYNC_REQ; + msgptr[msglen++] = goal->period; + msgptr[msglen++] = goal->offset; break; case NS_WIDE: - msglen += spi_populate_width_msg(msgptr + msglen, goal->width); + msgptr[msglen++] = M_EXTENDED; + msgptr[msglen++] = 2; + msgptr[msglen++] = M_X_WIDE_REQ; + msgptr[msglen++] = goal->width; break; case NS_PPR: - msglen += spi_populate_ppr_msg(msgptr + msglen, goal->period, - goal->offset, goal->width, - (goal->iu ? PPR_OPT_IU : 0) | + msgptr[msglen++] = M_EXTENDED; + msgptr[msglen++] = 6; + msgptr[msglen++] = M_X_PPR_REQ; + msgptr[msglen++] = goal->period; + msgptr[msglen++] = 0; + msgptr[msglen++] = goal->offset; + msgptr[msglen++] = goal->width; + msgptr[msglen++] = (goal->iu ? PPR_OPT_IU : 0) | (goal->dt ? PPR_OPT_DT : 0) | - (goal->qas ? PPR_OPT_QAS : 0)); + (goal->qas ? PPR_OPT_QAS : 0); break; } @@ -1474,7 +1476,7 @@ static int sym_prepare_nego(struct sym_hcb *np, struct sym_ccb *cp, u_char *msgp /* * Insert a job into the start queue. */ -void sym_put_start_queue(struct sym_hcb *np, struct sym_ccb *cp) +static void sym_put_start_queue(struct sym_hcb *np, struct sym_ccb *cp) { u_short qidx; @@ -3948,7 +3950,11 @@ sym_sync_nego_check(struct sym_hcb *np, int req, struct sym_ccb *cp) /* * It was a request. Prepare an answer message. */ - spi_populate_sync_msg(np->msgout, per, ofs); + np->msgout[0] = M_EXTENDED; + np->msgout[1] = 3; + np->msgout[2] = M_X_SYNC_REQ; + np->msgout[3] = per; + np->msgout[4] = ofs; if (DEBUG_FLAGS & DEBUG_NEGO) { sym_print_nego_msg(np, target, "sync msgout", np->msgout); @@ -4074,7 +4080,14 @@ sym_ppr_nego_check(struct sym_hcb *np, int req, int target) /* * It was a request. Prepare an answer message. */ - spi_populate_ppr_msg(np->msgout, per, ofs, wide, opts); + np->msgout[0] = M_EXTENDED; + np->msgout[1] = 6; + np->msgout[2] = M_X_PPR_REQ; + np->msgout[3] = per; + np->msgout[4] = 0; + np->msgout[5] = ofs; + np->msgout[6] = wide; + np->msgout[7] = opts; if (DEBUG_FLAGS & DEBUG_NEGO) { sym_print_nego_msg(np, target, "ppr msgout", np->msgout); @@ -4186,7 +4199,10 @@ sym_wide_nego_check(struct sym_hcb *np, int req, struct sym_ccb *cp) /* * It was a request. Prepare an answer message. */ - spi_populate_width_msg(np->msgout, wide); + np->msgout[0] = M_EXTENDED; + np->msgout[1] = 2; + np->msgout[2] = M_X_WIDE_REQ; + np->msgout[3] = wide; np->msgin [0] = M_NOOP; @@ -4231,8 +4247,11 @@ static void sym_wide_nego(struct sym_hcb *np, struct sym_tcb *tp, struct sym_ccb * a single SCSI command (Suggested by Justin Gibbs). */ if (tp->tgoal.offset) { - spi_populate_sync_msg(np->msgout, tp->tgoal.period, - tp->tgoal.offset); + np->msgout[0] = M_EXTENDED; + np->msgout[1] = 3; + np->msgout[2] = M_X_SYNC_REQ; + np->msgout[3] = tp->tgoal.period; + np->msgout[4] = tp->tgoal.offset; if (DEBUG_FLAGS & DEBUG_NEGO) { sym_print_nego_msg(np, cp->target, @@ -4491,7 +4510,7 @@ static void sym_int_sir (struct sym_hcb *np) switch (np->msgin [2]) { case M_X_MODIFY_DP: if (DEBUG_FLAGS & DEBUG_POINTER) - sym_print_msg(cp, NULL, np->msgin); + sym_print_msg(cp,"modify DP",np->msgin); tmp = (np->msgin[3]<<24) + (np->msgin[4]<<16) + (np->msgin[5]<<8) + (np->msgin[6]); sym_modify_dp(np, tp, cp, tmp); @@ -4518,7 +4537,7 @@ static void sym_int_sir (struct sym_hcb *np) */ case M_IGN_RESIDUE: if (DEBUG_FLAGS & DEBUG_POINTER) - sym_print_msg(cp, NULL, np->msgin); + sym_print_msg(cp,"ign wide residue", np->msgin); if (cp->host_flags & HF_SENSE) OUTL_DSP(np, SCRIPTA_BA(np, clrack)); else @@ -4607,8 +4626,7 @@ struct sym_ccb *sym_get_ccb (struct sym_hcb *np, struct scsi_cmnd *cmd, u_char t * Debugging purpose. */ #ifndef SYM_OPT_HANDLE_DEVICE_QUEUEING - if (lp->busy_itl != 0) - goto out_free; + assert(lp->busy_itl == 0); #endif /* * Allocate resources for tags if not yet. @@ -4653,8 +4671,7 @@ struct sym_ccb *sym_get_ccb (struct sym_hcb *np, struct scsi_cmnd *cmd, u_char t * Debugging purpose. */ #ifndef SYM_OPT_HANDLE_DEVICE_QUEUEING - if (lp->busy_itl != 0 || lp->busy_itlq != 0) - goto out_free; + assert(lp->busy_itl == 0 && lp->busy_itlq == 0); #endif /* * Count this nexus for this LUN. diff --git a/drivers/scsi/sym53c8xx_2/sym_hipd.h b/drivers/scsi/sym53c8xx_2/sym_hipd.h index 79ab6a177..2456090bb 100644 --- a/drivers/scsi/sym53c8xx_2/sym_hipd.h +++ b/drivers/scsi/sym53c8xx_2/sym_hipd.h @@ -1049,8 +1049,6 @@ int sym_reset_scsi_bus(struct sym_hcb *np, int enab_int); struct sym_chip *sym_lookup_chip_table(u_short device_id, u_char revision); #ifdef SYM_OPT_HANDLE_DEVICE_QUEUEING void sym_start_next_ccbs(struct sym_hcb *np, struct sym_lcb *lp, int maxn); -#else -void sym_put_start_queue(struct sym_hcb *np, struct sym_ccb *cp); #endif void sym_start_up(struct sym_hcb *np, int reason); void sym_interrupt(struct sym_hcb *np); diff --git a/drivers/scsi/t128.c b/drivers/scsi/t128.c index 2df6747cb..21305fc91 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 ARRAY_SIZE(overrides) +#define NO_OVERRIDES (sizeof(overrides) / sizeof(struct override)) static struct base { unsigned int address; @@ -143,7 +143,7 @@ static struct base { { 0xcc000, 0}, { 0xc8000, 0}, { 0xdc000, 0}, { 0xd8000, 0} }; -#define NO_BASES ARRAY_SIZE(bases) +#define NO_BASES (sizeof (bases) / sizeof (struct base)) static struct signature { const char *string; @@ -152,7 +152,7 @@ static struct signature { {"TSROM: SCSI BIOS, Version 1.12", 0x36}, }; -#define NO_SIGNATURES ARRAY_SIZE(signatures) +#define NO_SIGNATURES (sizeof (signatures) / sizeof (struct signature)) /* * 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, IRQF_DISABLED, "t128", instance)) { + if (request_irq(instance->irq, t128_intr, SA_INTERRUPT, "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 9404ff3d4..91322aff2 100644 --- a/drivers/scsi/tmscsim.c +++ b/drivers/scsi/tmscsim.c @@ -218,6 +218,7 @@ #endif #define DCBDEBUG1(x) C_NOP +#include #include #include #include @@ -2584,7 +2585,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, IRQF_SHARED, + if (request_irq(pdev->irq, do_DC390_Interrupt, SA_SHIRQ, "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 9b66fa8d3..d4495272f 100644 --- a/drivers/scsi/tmscsim.h +++ b/drivers/scsi/tmscsim.h @@ -9,6 +9,7 @@ #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 57449611e..33cd90fc6 100644 --- a/drivers/scsi/u14-34f.c +++ b/drivers/scsi/u14-34f.c @@ -405,6 +405,7 @@ * the driver sets host->wish_block = TRUE for all ISA boards. */ +#include #include #include #include @@ -872,7 +873,7 @@ static int port_detect \ /* Board detected, allocate its IRQ */ if (request_irq(irq, do_interrupt_handler, - IRQF_DISABLED | ((subversion == ESA) ? IRQF_SHARED : 0), + SA_INTERRUPT | ((subversion == ESA) ? SA_SHIRQ : 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 2083454db..fb53eeaee 100644 --- a/drivers/scsi/wd33c93.c +++ b/drivers/scsi/wd33c93.c @@ -71,14 +71,15 @@ * Richard Hirst August 2000 */ +#include #include #include #include #include #include -#include #include +#include #include #include @@ -373,7 +374,7 @@ wd33c93_queuecommand(struct scsi_cmnd *cmd, */ if (cmd->use_sg) { - cmd->SCp.buffer = (struct scatterlist *) cmd->request_buffer; + cmd->SCp.buffer = (struct scatterlist *) cmd->buffer; cmd->SCp.buffers_residual = cmd->use_sg - 1; cmd->SCp.ptr = page_address(cmd->SCp.buffer->page) + cmd->SCp.buffer->offset; @@ -938,7 +939,6 @@ 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,7 +955,6 @@ 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) @@ -1359,7 +1358,6 @@ 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)) { @@ -1376,7 +1374,6 @@ 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", @@ -1704,7 +1701,7 @@ wd33c93_abort(struct scsi_cmnd * cmd) } #define MAX_WD33C93_HOSTS 4 -#define MAX_SETUP_ARGS ARRAY_SIZE(setup_args) +#define MAX_SETUP_ARGS ((int)(sizeof(setup_args) / sizeof(char *))) #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 edcb0365c..193ec517d 100644 --- a/drivers/scsi/wd33c93.h +++ b/drivers/scsi/wd33c93.h @@ -22,6 +22,7 @@ #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 a0b61af48..fb54a87a8 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 ARRAY_SIZE(wd7000_biosaddr) +#define NUM_ADDRS (sizeof(wd7000_biosaddr)/sizeof(long)) 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 ARRAY_SIZE(wd7000_iobase) +#define NUM_IOPORTS (sizeof(wd7000_iobase)/sizeof(unsigned short)) static const short wd7000_irq[] = { 3, 4, 5, 7, 9, 10, 11, 12, 14, 15 }; -#define NUM_IRQS ARRAY_SIZE(wd7000_irq) +#define NUM_IRQS (sizeof(wd7000_irq)/sizeof(short)) static const short wd7000_dma[] = { 5, 6, 7 }; -#define NUM_DMAS ARRAY_SIZE(wd7000_dma) +#define NUM_DMAS (sizeof(wd7000_dma)/sizeof(short)) /* * 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 ARRAY_SIZE(configs) +#define NUM_CONFIGS (sizeof(configs)/sizeof(Config)) /* * 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 ARRAY_SIZE(signatures) +#define NUM_SIGNATURES (sizeof(signatures)/sizeof(Signature)) /* @@ -1250,7 +1250,7 @@ static int wd7000_init(Adapter * host) return 0; - if (request_irq(host->irq, wd7000_intr, IRQF_DISABLED, "wd7000", host)) { + if (request_irq(host->irq, wd7000_intr, SA_INTERRUPT, "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 __init int wd7000_detect(struct scsi_host_template *tpnt) +static 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 4b5f908d3..b131432c6 100644 --- a/drivers/scsi/zalon.c +++ b/drivers/scsi/zalon.c @@ -88,7 +88,7 @@ zalon_probe(struct parisc_device *dev) struct gsc_irq gsc_irq; u32 zalon_vers; int error = -ENODEV; - void __iomem *zalon = ioremap_nocache(dev->hpa.start, 4096); + void __iomem *zalon = ioremap(dev->hpa.start, 4096); void __iomem *io_port = zalon + GSC_SCSI_ZALON_OFFSET; static int unit = 0; struct Scsi_Host *host; @@ -136,7 +136,7 @@ zalon_probe(struct parisc_device *dev) if (!host) goto fail; - if (request_irq(dev->irq, ncr53c8xx_intr, IRQF_SHARED, "zalon", host)) { + if (request_irq(dev->irq, ncr53c8xx_intr, SA_SHIRQ, "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 57438326b..8c5c276c5 100644 --- a/drivers/serial/21285.c +++ b/drivers/serial/21285.c @@ -7,6 +7,7 @@ * * $Id: 21285.c,v 1.37 2002/07/28 10:03:27 rmk Exp $ */ +#include #include #include #include @@ -374,18 +375,23 @@ static void serial21285_setup_ports(void) } #ifdef CONFIG_SERIAL_21285_CONSOLE -static void serial21285_console_putchar(struct uart_port *port, int ch) -{ - while (*CSR_UARTFLG & 0x20) - barrier(); - *CSR_UARTDR = ch; -} static void serial21285_console_write(struct console *co, const char *s, unsigned int count) { - uart_console_write(&serial21285_port, s, count, serial21285_console_putchar); + int i; + + for (i = 0; i < count; i++) { + while (*CSR_UARTFLG & 0x20) + barrier(); + *CSR_UARTDR = s[i]; + if (s[i] == '\n') { + while (*CSR_UARTFLG & 0x20) + barrier(); + *CSR_UARTDR = '\r'; + } + } } static void __init @@ -478,6 +484,7 @@ 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 993a70242..7f0f35a05 100644 --- a/drivers/serial/68328serial.c +++ b/drivers/serial/68328serial.c @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include @@ -100,6 +101,8 @@ struct tty_driver *serial_driver; #define RS_ISR_PASS_LIMIT 256 +#define _INLINE_ inline + static void change_speed(struct m68k_serial *info); /* @@ -130,6 +133,17 @@ 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) { @@ -199,16 +213,16 @@ static void rs_stop(struct tty_struct *tty) if (serial_paranoia_check(info, tty->name, "rs_stop")) return; - local_irq_save(flags); + save_flags(flags); cli(); uart->ustcnt &= ~USTCNT_TXEN; - local_irq_restore(flags); + restore_flags(flags); } static void rs_put_char(char ch) { int flags, loops = 0; - local_irq_save(flags); + save_flags(flags); cli(); while (!(UTX & UTX_TX_AVAIL) && (loops < 1000)) { loops++; @@ -217,7 +231,7 @@ static void rs_put_char(char ch) UTX_TXDATA = ch; udelay(5); - local_irq_restore(flags); + restore_flags(flags); } static void rs_start(struct tty_struct *tty) @@ -229,7 +243,7 @@ static void rs_start(struct tty_struct *tty) if (serial_paranoia_check(info, tty->name, "rs_start")) return; - local_irq_save(flags); + save_flags(flags); cli(); if (info->xmit_cnt && info->xmit_buf && !(uart->ustcnt & USTCNT_TXEN)) { #ifdef USE_INTS uart->ustcnt |= USTCNT_TXEN | USTCNT_TX_INTR_MASK; @@ -237,7 +251,7 @@ static void rs_start(struct tty_struct *tty) uart->ustcnt |= USTCNT_TXEN; #endif } - local_irq_restore(flags); + restore_flags(flags); } /* Drop into either the boot monitor or kadb upon receiving a break @@ -248,7 +262,7 @@ static void batten_down_hatches(void) /* Drop into the debugger */ } -static void status_handle(struct m68k_serial *info, unsigned short status) +static _INLINE_ void status_handle(struct m68k_serial *info, unsigned short status) { #if 0 if(status & DCD) { @@ -275,8 +289,7 @@ static void status_handle(struct m68k_serial *info, unsigned short status) return; } -static void receive_chars(struct m68k_serial *info, struct pt_regs *regs, - unsigned short rx) +static _INLINE_ void receive_chars(struct m68k_serial *info, struct pt_regs *regs, unsigned short rx) { struct tty_struct *tty = info->tty; m68328_uart *uart = &uart_addr[info->line]; @@ -315,6 +328,14 @@ 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) { @@ -338,7 +359,7 @@ clear_and_exit: return; } -static void transmit_chars(struct m68k_serial *info) +static _INLINE_ void transmit_chars(struct m68k_serial *info) { m68328_uart *uart = &uart_addr[info->line]; @@ -453,7 +474,7 @@ static int startup(struct m68k_serial * info) return -ENOMEM; } - local_irq_save(flags); + save_flags(flags); cli(); /* * Clear the FIFO buffers and disable them @@ -486,7 +507,7 @@ static int startup(struct m68k_serial * info) change_speed(info); info->flags |= S_INITIALIZED; - local_irq_restore(flags); + restore_flags(flags); return 0; } @@ -503,7 +524,7 @@ static void shutdown(struct m68k_serial * info) if (!(info->flags & S_INITIALIZED)) return; - local_irq_save(flags); + save_flags(flags); cli(); /* Disable interrupts */ if (info->xmit_buf) { free_page((unsigned long) info->xmit_buf); @@ -514,7 +535,7 @@ static void shutdown(struct m68k_serial * info) set_bit(TTY_IO_ERROR, &info->tty->flags); info->flags &= ~S_INITIALIZED; - local_irq_restore(flags); + restore_flags(flags); } struct { @@ -635,24 +656,24 @@ static void rs_fair_output(void) if (info == 0) return; if (info->xmit_buf == 0) return; - local_irq_save(flags); + save_flags(flags); cli(); 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--; - local_irq_restore(flags); + restore_flags(flags); rs_put_char(c); - local_irq_save(flags); + save_flags(flags); cli(); left = min(info->xmit_cnt, left-1); } /* Last character is being transmitted now (hopefully). */ udelay(5); - local_irq_restore(flags); + restore_flags(flags); return; } @@ -700,11 +721,11 @@ static void rs_flush_chars(struct tty_struct *tty) #endif /* Enable transmitter */ - local_irq_save(flags); + save_flags(flags); cli(); if (info->xmit_cnt <= 0 || tty->stopped || tty->hw_stopped || !info->xmit_buf) { - local_irq_restore(flags); + restore_flags(flags); return; } @@ -729,7 +750,7 @@ static void rs_flush_chars(struct tty_struct *tty) while (!(uart->utx.w & UTX_TX_AVAIL)) udelay(5); } #endif - local_irq_restore(flags); + restore_flags(flags); } extern void console_printn(const char * b, int count); @@ -748,22 +769,18 @@ static int rs_write(struct tty_struct * tty, if (!tty || !info->xmit_buf) return 0; - local_save_flags(flags); + save_flags(flags); while (1) { - local_irq_disable(); + cli(); 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; - local_irq_restore(flags); + restore_flags(flags); buf += c; count -= c; total += c; @@ -771,7 +788,7 @@ static int rs_write(struct tty_struct * tty, if (info->xmit_cnt && !tty->stopped && !tty->hw_stopped) { /* Enable transmitter */ - local_irq_disable(); + cli(); #ifndef USE_INTS while(info->xmit_cnt) { #endif @@ -791,9 +808,9 @@ static int rs_write(struct tty_struct * tty, #ifndef USE_INTS } #endif - local_irq_restore(flags); + restore_flags(flags); } - + restore_flags(flags); return total; } @@ -822,13 +839,12 @@ 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; - local_irq_save(flags); + cli(); info->xmit_cnt = info->xmit_head = info->xmit_tail = 0; - local_irq_restore(flags); + sti(); tty_wakeup(tty); } @@ -958,15 +974,14 @@ 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; - local_irq_save(flags); + cli(); #ifdef CONFIG_SERIAL_68328_RTS_CTS status = (uart->utx.w & UTX_CTS_STAT) ? 1 : 0; #else status = 0; #endif - local_irq_restore(flags); + sti(); put_user(status,value); return 0; } @@ -980,13 +995,14 @@ static void send_break(struct m68k_serial * info, unsigned int duration) unsigned long flags; if (!info->port) return; - local_irq_save(flags); + save_flags(flags); + cli(); #ifdef USE_INTS uart->utx.w |= UTX_SEND_BREAK; msleep_interruptible(duration); uart->utx.w &= ~UTX_SEND_BREAK; #endif - local_irq_restore(flags); + restore_flags(flags); } static int rs_ioctl(struct tty_struct *tty, struct file * file, @@ -1045,7 +1061,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: @@ -1098,10 +1114,10 @@ static void rs_close(struct tty_struct *tty, struct file * filp) if (!info || serial_paranoia_check(info, tty->name, "rs_close")) return; - local_irq_save(flags); + save_flags(flags); cli(); if (tty_hung_up_p(filp)) { - local_irq_restore(flags); + restore_flags(flags); return; } @@ -1123,7 +1139,7 @@ static void rs_close(struct tty_struct *tty, struct file * filp) info->count = 0; } if (info->count) { - local_irq_restore(flags); + restore_flags(flags); return; } info->flags |= S_CLOSING; @@ -1171,7 +1187,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); - local_irq_restore(flags); + restore_flags(flags); } /* @@ -1247,9 +1263,9 @@ static int block_til_ready(struct tty_struct *tty, struct file * filp, info->count--; info->blocked_open++; while (1) { - local_irq_disable(); + cli(); m68k_rtsdtr(info, 1); - local_irq_enable(); + sti(); current->state = TASK_INTERRUPTIBLE; if (tty_hung_up_p(filp) || !(info->flags & S_INITIALIZED)) { @@ -1429,7 +1445,7 @@ rs68328_init(void) return -ENOMEM; } - local_irq_save(flags); + save_flags(flags); cli(); for(i=0;idata = info; #endif } - local_irq_restore(flags); + restore_flags(flags); return 0; } diff --git a/drivers/serial/68328serial.h b/drivers/serial/68328serial.h index 58aa21546..978f8a609 100644 --- a/drivers/serial/68328serial.h +++ b/drivers/serial/68328serial.h @@ -11,6 +11,7 @@ #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 e80e70e9b..9843ae3d4 100644 --- a/drivers/serial/68360serial.c +++ b/drivers/serial/68360serial.c @@ -20,6 +20,7 @@ * int rs_360_init(void); */ +#include #include #include #include diff --git a/drivers/serial/8250.c b/drivers/serial/8250.c index fd8b94e8d..7aca22c99 100644 --- a/drivers/serial/8250.c +++ b/drivers/serial/8250.c @@ -7,9 +7,6 @@ * * Copyright (C) 2001 Russell King. * - * 2005/09/16: Enabled higher baud rates for 16C95x. - * (Mathias Adam ) - * * This 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 @@ -22,6 +19,7 @@ * 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 @@ -51,7 +49,7 @@ /* * Configuration: - * share_irqs - whether we pass IRQF_SHARED to request_irq(). This option + * share_irqs - whether we pass SA_SHIRQ to request_irq(). This option * is unsafe when used on edge-triggered interrupts. */ static unsigned int share_irqs = SERIAL8250_SHARE_IRQS; @@ -302,7 +300,6 @@ 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,13 +318,6 @@ 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); } @@ -357,10 +347,6 @@ 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); @@ -376,40 +362,6 @@ serial_out(struct uart_8250_port *up, int offset, int value) #define serial_inp(up, offset) serial_in(up, offset) #define serial_outp(up, offset, value) serial_out(up, offset, value) -/* Uart divisor latch read */ -static inline int _serial_dl_read(struct uart_8250_port *up) -{ - return serial_inp(up, UART_DLL) | serial_inp(up, UART_DLM) << 8; -} - -/* Uart divisor latch write */ -static inline void _serial_dl_write(struct uart_8250_port *up, int value) -{ - serial_outp(up, UART_DLL, value & 0xff); - serial_outp(up, UART_DLM, value >> 8 & 0xff); -} - -#ifdef CONFIG_SERIAL_8250_AU1X00 -/* Au1x00 haven't got a standard divisor latch */ -static int serial_dl_read(struct uart_8250_port *up) -{ - if (up->port.iotype == UPIO_AU) - return __raw_readl(up->port.membase + 0x28); - else - return _serial_dl_read(up); -} - -static void serial_dl_write(struct uart_8250_port *up, int value) -{ - if (up->port.iotype == UPIO_AU) - __raw_writel(value, up->port.membase + 0x28); - else - _serial_dl_write(up, value); -} -#else -#define serial_dl_read(up) _serial_dl_read(up) -#define serial_dl_write(up, value) _serial_dl_write(up, value) -#endif /* * For the 16C950 @@ -542,8 +494,7 @@ static void disable_rsa(struct uart_8250_port *up) */ static int size_fifo(struct uart_8250_port *up) { - unsigned char old_fcr, old_mcr, old_lcr; - unsigned short old_dl; + unsigned char old_fcr, old_mcr, old_dll, old_dlm, old_lcr; int count; old_lcr = serial_inp(up, UART_LCR); @@ -554,8 +505,10 @@ static int size_fifo(struct uart_8250_port *up) UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT); serial_outp(up, UART_MCR, UART_MCR_LOOP); serial_outp(up, UART_LCR, UART_LCR_DLAB); - old_dl = serial_dl_read(up); - serial_dl_write(up, 0x0001); + old_dll = serial_inp(up, UART_DLL); + old_dlm = serial_inp(up, UART_DLM); + serial_outp(up, UART_DLL, 0x01); + serial_outp(up, UART_DLM, 0x00); serial_outp(up, UART_LCR, 0x03); for (count = 0; count < 256; count++) serial_outp(up, UART_TX, count); @@ -566,7 +519,8 @@ static int size_fifo(struct uart_8250_port *up) serial_outp(up, UART_FCR, old_fcr); serial_outp(up, UART_MCR, old_mcr); serial_outp(up, UART_LCR, UART_LCR_DLAB); - serial_dl_write(up, old_dl); + serial_outp(up, UART_DLL, old_dll); + serial_outp(up, UART_DLM, old_dlm); serial_outp(up, UART_LCR, old_lcr); return count; @@ -796,7 +750,8 @@ static void autoconfig_16550a(struct uart_8250_port *up) serial_outp(up, UART_LCR, 0xE0); - quot = serial_dl_read(up); + quot = serial_inp(up, UART_DLM) << 8; + quot += serial_inp(up, UART_DLL); quot <<= 3; status1 = serial_in(up, 0x04); /* EXCR1 */ @@ -804,7 +759,8 @@ static void autoconfig_16550a(struct uart_8250_port *up) status1 |= 0x10; /* 1.625 divisor for baud_base --> 921600 */ serial_outp(up, 0x04, status1); - serial_dl_write(up, quot); + serial_outp(up, UART_DLL, quot & 0xff); + serial_outp(up, UART_DLM, quot >> 8); serial_outp(up, UART_LCR, 0); @@ -1415,7 +1371,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 ? IRQF_SHARED : 0; + int ret, irq_flags = up->port.flags & UPF_SHARE_IRQ ? SA_SHIRQ : 0; spin_lock_irq(&i->lock); @@ -1572,7 +1528,7 @@ static int serial8250_startup(struct uart_port *port) /* * Clear the FIFO buffers and disable them. - * (they will be reenabled in set_termios()) + * (they will be reeanbled in set_termios()) */ serial8250_clear_fifos(up); @@ -1759,14 +1715,6 @@ static unsigned int serial8250_get_divisor(struct uart_port *port, unsigned int else if ((port->flags & UPF_MAGIC_MULTIPLIER) && baud == (port->uartclk/8)) quot = 0x8002; - /* - * For 16C950s UART_TCR is used in combination with divisor==1 - * to achieve baud rates up to baud_base*4. - */ - else if ((port->type == PORT_16C950) && - baud > (port->uartclk/16)) - quot = 1; - else quot = uart_get_divisor(port, baud); @@ -1780,7 +1728,7 @@ serial8250_set_termios(struct uart_port *port, struct termios *termios, struct uart_8250_port *up = (struct uart_8250_port *)port; unsigned char cval, fcr = 0; unsigned long flags; - unsigned int baud, quot, max_baud; + unsigned int baud, quot; switch (termios->c_cflag & CSIZE) { case CS5: @@ -1812,8 +1760,7 @@ serial8250_set_termios(struct uart_port *port, struct termios *termios, /* * Ask the core to calculate the divisor for us. */ - max_baud = (up->port.type == PORT_16C950 ? port->uartclk/4 : port->uartclk/16); - baud = uart_get_baud_rate(port, termios, old, 0, max_baud); + baud = uart_get_baud_rate(port, termios, old, 0, port->uartclk/16); quot = serial8250_get_divisor(port, baud); /* @@ -1849,19 +1796,6 @@ serial8250_set_termios(struct uart_port *port, struct termios *termios, */ spin_lock_irqsave(&up->port.lock, flags); - /* - * 16C950 supports additional prescaler ratios between 1:16 and 1:4 - * thus increasing max baud rate to uartclk/4. - */ - if (up->port.type == PORT_16C950) { - if (baud == port->uartclk/4) - serial_icr_write(up, UART_TCR, 0x4); - else if (baud == port->uartclk/8) - serial_icr_write(up, UART_TCR, 0x8); - else - serial_icr_write(up, UART_TCR, 0); - } - /* * Update the per-port timeout. */ @@ -1928,7 +1862,8 @@ serial8250_set_termios(struct uart_port *port, struct termios *termios, serial_outp(up, UART_LCR, cval | UART_LCR_DLAB);/* set DLAB */ } - serial_dl_write(up, quot); + serial_outp(up, UART_DLL, quot & 0xff); /* LS of divisor */ + serial_outp(up, UART_DLM, quot >> 8); /* MS of divisor */ /* * LCR DLAB must be set to enable 64-byte FIFO mode. If the FCR @@ -1971,9 +1906,6 @@ static int serial8250_request_std_resource(struct uart_8250_port *up) int ret = 0; switch (up->port.iotype) { - case UPIO_AU: - size = 0x100000; - /* fall thru */ case UPIO_MEM: if (!up->port.mapbase) break; @@ -2006,9 +1938,6 @@ static void serial8250_release_std_resource(struct uart_8250_port *up) unsigned int size = 8 << up->port.regshift; switch (up->port.iotype) { - case UPIO_AU: - size = 0x100000; - /* fall thru */ case UPIO_MEM: if (!up->port.mapbase) break; @@ -2247,22 +2176,12 @@ static inline void wait_for_xmitr(struct uart_8250_port *up, int bits) /* Wait up to 1s for flow control if necessary */ if (up->port.flags & UPF_CONS_FLOW) { tmout = 1000000; - while (!(serial_in(up, UART_MSR) & UART_MSR_CTS) && --tmout) { + while (--tmout && + ((serial_in(up, UART_MSR) & UART_MSR_CTS) == 0)) udelay(1); - if ((tmout % 1000) == 0) - touch_nmi_watchdog(); - } } } -static void serial8250_console_putchar(struct uart_port *port, int ch) -{ - struct uart_8250_port *up = (struct uart_8250_port *)port; - - wait_for_xmitr(up, UART_LSR_THRE); - serial_out(up, UART_TX, ch); -} - /* * Print a string to the serial port trying not to disturb * any possible real use of the port... @@ -2273,21 +2192,11 @@ static void serial8250_console_write(struct console *co, const char *s, unsigned int count) { struct uart_8250_port *up = &serial8250_ports[co->index]; - unsigned long flags; unsigned int ier; - int locked = 1; + int i; touch_nmi_watchdog(); - local_irq_save(flags); - if (up->port.sysrq) { - /* serial8250_handle_port() already took the lock */ - locked = 0; - } else if (oops_in_progress) { - locked = spin_trylock(&up->port.lock); - } else - spin_lock(&up->port.lock); - /* * First save the IER then disable the interrupts */ @@ -2298,18 +2207,30 @@ serial8250_console_write(struct console *co, const char *s, unsigned int count) else serial_out(up, UART_IER, 0); - uart_console_write(&up->port, s, count, serial8250_console_putchar); + /* + * Now, do each character + */ + for (i = 0; i < count; i++, s++) { + wait_for_xmitr(up, UART_LSR_THRE); + + /* + * Send the character out. + * If a LF, also do CR... + */ + serial_out(up, UART_TX, *s); + if (*s == 10) { + wait_for_xmitr(up, UART_LSR_THRE); + serial_out(up, UART_TX, 13); + } + } /* * Finally, wait for transmitter to become empty * and restore the IER */ wait_for_xmitr(up, BOTH_EMPTY); - serial_out(up, UART_IER, ier); - - if (locked) - spin_unlock(&up->port.lock); - local_irq_restore(flags); + up->ier |= UART_IER_THRI; + serial_out(up, UART_IER, ier | UART_IER_THRI); } static int serial8250_console_setup(struct console *co, char *options) @@ -2397,6 +2318,7 @@ 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 91bd28f2b..490606b87 100644 --- a/drivers/serial/8250.h +++ b/drivers/serial/8250.h @@ -15,6 +15,7 @@ * $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_acpi.c b/drivers/serial/8250_acpi.c index 6b9ead288..809f89ab9 100644 --- a/drivers/serial/8250_acpi.c +++ b/drivers/serial/8250_acpi.c @@ -27,7 +27,7 @@ struct serial_private { static acpi_status acpi_serial_mmio(struct uart_port *port, struct acpi_resource_address64 *addr) { - port->mapbase = addr->min_address_range; + port->mapbase = addr->minimum; port->iotype = UPIO_MEM; port->flags |= UPF_IOREMAP; return AE_OK; @@ -36,8 +36,8 @@ static acpi_status acpi_serial_mmio(struct uart_port *port, static acpi_status acpi_serial_port(struct uart_port *port, struct acpi_resource_io *io) { - if (io->range_length) { - port->iobase = io->min_base_address; + if (io->address_length) { + port->iobase = io->minimum; port->iotype = UPIO_PORT; } else printk(KERN_ERR "%s: zero-length IO port range?\n", __FUNCTION__); @@ -45,20 +45,32 @@ static acpi_status acpi_serial_port(struct uart_port *port, } static acpi_status acpi_serial_ext_irq(struct uart_port *port, - struct acpi_resource_ext_irq *ext_irq) + struct acpi_resource_extended_irq *ext_irq) { - if (ext_irq->number_of_interrupts > 0) - port->irq = acpi_register_gsi(ext_irq->interrupts[0], - ext_irq->edge_level, ext_irq->active_high_low); + int rc; + + if (ext_irq->interrupt_count > 0) { + rc = acpi_register_gsi(ext_irq->interrupts[0], + ext_irq->triggering, ext_irq->polarity); + if (rc < 0) + return AE_ERROR; + port->irq = rc; + } return AE_OK; } static acpi_status acpi_serial_irq(struct uart_port *port, struct acpi_resource_irq *irq) { - if (irq->number_of_interrupts > 0) - port->irq = acpi_register_gsi(irq->interrupts[0], - irq->edge_level, irq->active_high_low); + int rc; + + if (irq->interrupt_count > 0) { + rc = acpi_register_gsi(irq->interrupts[0], + irq->triggering, irq->polarity); + if (rc < 0) + return AE_ERROR; + port->irq = rc; + } return AE_OK; } @@ -71,11 +83,11 @@ static acpi_status acpi_serial_resource(struct acpi_resource *res, void *data) status = acpi_resource_to_address64(res, &addr); if (ACPI_SUCCESS(status)) return acpi_serial_mmio(port, &addr); - else if (res->id == ACPI_RSTYPE_IO) + else if (res->type == ACPI_RESOURCE_TYPE_IO) return acpi_serial_port(port, &res->data.io); - else if (res->id == ACPI_RSTYPE_EXT_IRQ) + else if (res->type == ACPI_RESOURCE_TYPE_EXTENDED_IRQ) return acpi_serial_ext_irq(port, &res->data.extended_irq); - else if (res->id == ACPI_RSTYPE_IRQ) + else if (res->type == ACPI_RESOURCE_TYPE_IRQ) return acpi_serial_irq(port, &res->data.irq); return AE_OK; } diff --git a/drivers/serial/8250_au1x00.c b/drivers/serial/8250_au1x00.c index 58015fd14..8d8d7a70d 100644 --- a/drivers/serial/8250_au1x00.c +++ b/drivers/serial/8250_au1x00.c @@ -30,12 +30,13 @@ { \ .iobase = _base, \ .membase = (void __iomem *)_base,\ - .mapbase = CPHYSADDR(_base), \ + .mapbase = _base, \ .irq = _irq, \ .uartclk = 0, /* filled */ \ .regshift = 2, \ .iotype = UPIO_AU, \ - .flags = UPF_SKIP_TEST \ + .flags = UPF_SKIP_TEST | \ + UPF_IOREMAP, \ } static struct plat_serial8250_port au1x00_data[] = { @@ -50,7 +51,7 @@ static struct plat_serial8250_port au1x00_data[] = { #elif defined(CONFIG_SOC_AU1100) PORT(UART0_ADDR, AU1100_UART0_INT), PORT(UART1_ADDR, AU1100_UART1_INT), - /* The internal UART2 does not exist on the AU1100 processor. */ + PORT(UART2_ADDR, AU1100_UART2_INT), PORT(UART3_ADDR, AU1100_UART3_INT), #elif defined(CONFIG_SOC_AU1550) PORT(UART0_ADDR, AU1550_UART0_INT), diff --git a/drivers/serial/8250_early.c b/drivers/serial/8250_early.c index 7e511199b..59ba5d993 100644 --- a/drivers/serial/8250_early.c +++ b/drivers/serial/8250_early.c @@ -74,7 +74,7 @@ static void __init wait_for_xmitr(struct uart_port *port) } } -static void __init putc(struct uart_port *port, int c) +static void __init putc(struct uart_port *port, unsigned char c) { wait_for_xmitr(port); serial_out(port, UART_TX, c); @@ -89,7 +89,12 @@ static void __init early_uart_write(struct console *console, const char *s, unsi ier = serial_in(port, UART_IER); serial_out(port, UART_IER, 0); - uart_console_write(port, s, count, putc); + while (*s && count-- > 0) { + putc(port, *s); + if (*s == '\n') + putc(port, '\r'); + s++; + } /* Wait for transmitter to become empty and restore the IER */ wait_for_xmitr(port); diff --git a/drivers/serial/8250_gsc.c b/drivers/serial/8250_gsc.c index 913c71cc0..8b4947933 100644 --- a/drivers/serial/8250_gsc.c +++ b/drivers/serial/8250_gsc.c @@ -52,14 +52,13 @@ serial_init_chip(struct parisc_device *dev) address += 0x800; } - memset(&port, 0, sizeof(port)); - port.iotype = UPIO_MEM; - port.uartclk = LASI_BASE_BAUD * 16; - port.mapbase = address; - port.membase = ioremap_nocache(address, 16); - port.irq = dev->irq; - port.flags = UPF_BOOT_AUTOCONF; - port.dev = &dev->dev; + memset(&port, 0, sizeof(struct uart_port)); + port.mapbase = address; + port.irq = dev->irq; + port.iotype = UPIO_MEM; + port.flags = UPF_IOREMAP | UPF_BOOT_AUTOCONF; + port.uartclk = LASI_BASE_BAUD * 16; + port.dev = &dev->dev; err = serial8250_register_port(&port); if (err < 0) { diff --git a/drivers/serial/8250_hp300.c b/drivers/serial/8250_hp300.c index 53e81a44c..4315afe9c 100644 --- a/drivers/serial/8250_hp300.c +++ b/drivers/serial/8250_hp300.c @@ -55,8 +55,6 @@ static struct dio_driver hpdca_driver = { #endif -static unsigned int num_ports; - extern int hp300_uart_scode; /* Offset to UART registers from base of DCA */ @@ -201,8 +199,6 @@ static int __devinit hpdca_init_one(struct dio_dev *d, out_8(d->resource.start + DIO_VIRADDRBASE + DCA_ID, 0xff); udelay(100); - num_ports++; - return 0; } #endif @@ -210,6 +206,7 @@ static int __devinit hpdca_init_one(struct dio_dev *d, static int __init hp300_8250_init(void) { static int called = 0; + int num_ports; #ifdef CONFIG_HPAPCI int line; unsigned long base; @@ -224,8 +221,11 @@ static int __init hp300_8250_init(void) if (!MACH_IS_HP300) return -ENODEV; + num_ports = 0; + #ifdef CONFIG_HPDCA - dio_register_driver(&hpdca_driver); + if (dio_module_init(&hpdca_driver) == 0) + num_ports++; #endif #ifdef CONFIG_HPAPCI if (hp300_model < HP_400) { diff --git a/drivers/serial/8250_mca.c b/drivers/serial/8250_mca.c index d10be944a..ac205256d 100644 --- a/drivers/serial/8250_mca.c +++ b/drivers/serial/8250_mca.c @@ -8,6 +8,7 @@ * 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 851e4839d..94886c000 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 pci_hp_diva_init(struct pci_dev *dev) +static int __devinit 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 pci_inteli960ni_init(struct pci_dev *dev) +static int __devinit pci_inteli960ni_init(struct pci_dev *dev) { unsigned long oldval; @@ -216,7 +216,7 @@ static int 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 pci_plx9050_init(struct pci_dev *dev) +static int __devinit 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 sbs_init(struct pci_dev *dev) +static int __devinit 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 const unsigned short timedia_single_port[] = { +static unsigned short timedia_single_port[] = { 0x4025, 0x4027, 0x4028, 0x5025, 0x5027, 0 }; -static const unsigned short timedia_dual_port[] = { +static 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,34 +470,35 @@ static const unsigned short timedia_dual_port[] = { 0xD079, 0 }; -static const unsigned short timedia_quad_port[] = { +static 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 const unsigned short timedia_eight_port[] = { +static 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; - const unsigned short *ids; + unsigned short *ids; } timedia_data[] = { { 1, timedia_single_port }, { 2, timedia_dual_port }, { 4, timedia_quad_port }, - { 8, timedia_eight_port } + { 8, timedia_eight_port }, + { 0, NULL } }; -static int pci_timedia_init(struct pci_dev *dev) +static int __devinit pci_timedia_init(struct pci_dev *dev) { - const unsigned short *ids; + unsigned short *ids; int i, j; - for (i = 0; i < ARRAY_SIZE(timedia_data); i++) { + for (i = 0; timedia_data[i].num; i++) { ids = timedia_data[i].ids; for (j = 0; ids[j]; j++) if (dev->subsystem_device == ids[j]) @@ -565,13 +566,13 @@ titan_400l_800l_setup(struct serial_private *priv, return setup_port(priv, port, bar, offset, board->reg_shift); } -static int pci_xircom_init(struct pci_dev *dev) +static int __devinit pci_xircom_init(struct pci_dev *dev) { msleep(100); return 0; } -static int pci_netmos_init(struct pci_dev *dev) +static int __devinit pci_netmos_init(struct pci_dev *dev) { /* subdevice 0x00PS means if_entry menu_entry choice_entry -%type symbol_option_arg %destructor { fprintf(stderr, "%s:%d: missing end statement for this entry\n", @@ -175,7 +173,6 @@ 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 @@ -218,26 +215,6 @@ 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 @@ -481,9 +458,7 @@ void conf_parse(const char *name) sym_init(); menu_init(); - modules_sym = sym_lookup(NULL, 0); - modules_sym->type = S_BOOLEAN; - modules_sym->flags |= SYMBOL_AUTO; + modules_sym = sym_lookup("MODULES", 0); rootmenu.prompt = menu_add_prompt(P_MENU, "Linux Kernel Configuration", NULL); #if YYDEBUG @@ -493,12 +468,6 @@ 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-doc b/scripts/kernel-doc index c9ca0c23b..99fe4b7fb 100755 --- a/scripts/kernel-doc +++ b/scripts/kernel-doc @@ -253,7 +253,6 @@ my $lineprefix=""; # 3 - scanning prototype. # 4 - documentation block my $state; -my $in_doc_sect; #declaration types: can be # 'function', 'struct', 'union', 'enum', 'typedef' @@ -1056,8 +1055,7 @@ sub output_struct_man(%) { # pointer-to-function print ".BI \" ".$1."\" ".$parameter." \") (".$2.")"."\"\n;\n"; } elsif ($type =~ m/^(.*?)\s*(:.*)/) { - # bitfield - print ".BI \" ".$1."\ \" ".$parameter.$2." \""."\"\n;\n"; + print ".BI \" ".$1."\" ".$parameter.$2." \""."\"\n;\n"; } else { $type =~ s/([^\*])$/$1 /; print ".BI \" ".$type."\" ".$parameter." \""."\"\n;\n"; @@ -1066,7 +1064,7 @@ sub output_struct_man(%) { } print "};\n.br\n"; - print ".SH Members\n"; + print ".SH Arguments\n"; foreach $parameter (@{$args{'parameterlist'}}) { ($parameter =~ /^#/) && next; @@ -1119,10 +1117,7 @@ sub output_function_text(%) { my %args = %{$_[0]}; my ($parameter, $section); - print "Name:\n\n"; - print $args{'function'}." - ".$args{'purpose'}."\n"; - - print "\nSynopsis:\n\n"; + print "Function:\n\n"; my $start=$args{'functiontype'}." ".$args{'function'}." ("; print $start; my $count = 0; @@ -1173,7 +1168,6 @@ 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'}}) { @@ -1202,7 +1196,7 @@ sub output_typedef_text(%) { my $count; print "Typedef:\n\n"; - print "typedef ".$args{'typedef'}." - ".$args{'purpose'}."\n"; + print "typedef ".$args{'typedef'}."\n"; output_section_text(@_); } @@ -1211,7 +1205,7 @@ sub output_struct_text(%) { my %args = %{$_[0]}; my ($parameter); - print $args{'type'}." ".$args{'struct'}." - ".$args{'purpose'}."\n\n"; + print $args{'type'}." ".$args{'struct'}.":\n\n"; print $args{'type'}." ".$args{'struct'}." {\n"; foreach $parameter (@{$args{'parameterlist'}}) { if ($parameter =~ /^#/) { @@ -1518,7 +1512,6 @@ 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,]*\)\)//; @@ -1680,9 +1673,6 @@ 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; @@ -1716,7 +1706,6 @@ 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) { @@ -1767,20 +1756,12 @@ 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; @@ -1795,7 +1776,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 @@ -1812,7 +1793,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/mkmakefile b/scripts/mkmakefile index 7f9d544f9..c4d621b30 100644 --- a/scripts/mkmakefile +++ b/scripts/mkmakefile @@ -10,10 +10,7 @@ # $4 - patchlevel -test ! -r $2/Makefile -o -O $2/Makefile || exit 0 -echo " GEN $2/Makefile" - -cat << EOF > $2/Makefile +cat << EOF # Automatically generated by $0: don't edit VERSION = $3 @@ -24,13 +21,11 @@ KERNELOUTPUT := $2 MAKEFLAGS += --no-print-directory -.PHONY: all \$(MAKECMDGOALS) - all: \$(MAKE) -C \$(KERNELSRC) O=\$(KERNELOUTPUT) -Makefile:; - -\$(filter-out all Makefile,\$(MAKECMDGOALS)) %/: +%:: \$(MAKE) -C \$(KERNELSRC) O=\$(KERNELOUTPUT) \$@ + EOF + diff --git a/scripts/mod/file2alias.c b/scripts/mod/file2alias.c index e2de650d3..c164b230a 100644 --- a/scripts/mod/file2alias.c +++ b/scripts/mod/file2alias.c @@ -34,7 +34,7 @@ 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" @@ -52,23 +52,6 @@ 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, @@ -169,8 +152,10 @@ static void do_usb_table(void *symval, unsigned long size, unsigned int i; const unsigned long id_size = sizeof(struct usb_device_id); - device_id_size_check(mod->name, "usb", size, id_size); - + if (size % id_size || size < id_size) { + fprintf(stderr, "*** Warning: %s ids %lu bad size " + "(each on %lu)\n", mod->name, size, id_size); + } /* Leave last one: it's the terminator. */ size -= id_size; @@ -232,8 +217,9 @@ 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)) { - warn("Can't handle masks in %s:%04X\n", - filename, id->class_mask); + fprintf(stderr, + "*** Warning: Can't handle masks in %s:%04X\n", + filename, id->class_mask); return 0; } @@ -243,7 +229,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) { @@ -389,10 +375,10 @@ 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); + for (i = min; i < max; i++) { + if (arr[i/BITS_PER_LONG] & (1 << (i%BITS_PER_LONG))) + sprintf(alias+strlen(alias), "%X,*", i); + } } /* input:b0v0p0e0-eXkXrXaXmXlXsXfXwX where X is comma-separated %02X. */ @@ -401,37 +387,39 @@ static int do_input_entry(const char *filename, struct input_device_id *id, { 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); + ADD(alias, "b", id->flags&INPUT_DEVICE_ID_MATCH_BUS, id->id.bustype); + ADD(alias, "v", id->flags&INPUT_DEVICE_ID_MATCH_VENDOR, id->id.vendor); + ADD(alias, "p", id->flags&INPUT_DEVICE_ID_MATCH_PRODUCT, + id->id.product); + ADD(alias, "e", id->flags&INPUT_DEVICE_ID_MATCH_VERSION, + id->id.version); sprintf(alias + strlen(alias), "-e*"); - if (id->flags & INPUT_DEVICE_ID_MATCH_EVBIT) + 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) + 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) + 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) + 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) + 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) + 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) + 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) + 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) + if (id->flags&INPUT_DEVICE_ID_MATCH_SWBIT) do_input(alias, id->swbit, 0, SW_MAX); return 1; } @@ -449,7 +437,6 @@ 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) { @@ -457,7 +444,10 @@ static void do_table(void *symval, unsigned long size, char alias[500]; int (*do_entry)(const char *, void *entry, char *alias) = function; - device_id_size_check(mod->name, device_id, size, id_size); + if (size % id_size || size < id_size) { + fprintf(stderr, "*** Warning: %s ids %lu bad size " + "(each on %lu)\n", mod->name, size, id_size); + } /* Leave last one: it's the terminator. */ size -= id_size; @@ -489,51 +479,40 @@ 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), "pci", + do_table(symval, sym->st_size, sizeof(struct pci_device_id), 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), "ieee1394", + do_table(symval, sym->st_size, sizeof(struct ieee1394_device_id), do_ieee1394_entry, mod); else if (sym_is(symname, "__mod_ccw_device_table")) - do_table(symval, sym->st_size, - sizeof(struct ccw_device_id), "ccw", + do_table(symval, sym->st_size, sizeof(struct ccw_device_id), do_ccw_entry, mod); else if (sym_is(symname, "__mod_serio_device_table")) - do_table(symval, sym->st_size, - sizeof(struct serio_device_id), "serio", + do_table(symval, sym->st_size, sizeof(struct serio_device_id), do_serio_entry, mod); else if (sym_is(symname, "__mod_pnp_device_table")) - do_table(symval, sym->st_size, - sizeof(struct pnp_device_id), "pnp", + do_table(symval, sym->st_size, sizeof(struct pnp_device_id), 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), "pnp_card", + do_table(symval, sym->st_size, sizeof(struct pnp_card_device_id), 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_table(symval, sym->st_size, sizeof(struct pcmcia_device_id), 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_table(symval, sym->st_size, sizeof(struct of_device_id), 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_table(symval, sym->st_size, sizeof(struct vio_device_id), 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_table(symval, sym->st_size, sizeof(struct i2c_device_id), 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_table(symval, sym->st_size, sizeof(struct input_device_id), do_input_entry, mod); } diff --git a/scripts/mod/mk_elfconfig.c b/scripts/mod/mk_elfconfig.c index 725d61c0f..de2aabf89 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: - exit(1); + abort(); } switch (ei[EI_DATA]) { case ELFDATA2LSB: @@ -38,7 +38,7 @@ main(int argc, char **argv) printf("#define KERNEL_ELFDATA ELFDATA2MSB\n"); break; default: - exit(1); + abort(); } 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 - exit(1); + abort(); 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 dfde0e87a..b8b2a560b 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,7 +13,6 @@ #include #include "modpost.h" -#include "../../include/linux/license.h" /* Are we using CONFIG_MODVERSIONS? */ int modversions = 0; @@ -21,15 +20,9 @@ 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; @@ -42,7 +35,8 @@ void fatal(const char *fmt, ...) exit(1); } -void warn(const char *fmt, ...) +void +warn(const char *fmt, ...) { va_list arglist; @@ -53,18 +47,6 @@ void 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) { @@ -77,7 +59,8 @@ void *do_nofail(void *ptr, const char *expr) static struct module *modules; -static struct module *find_module(char *modname) +struct module * +find_module(char *modname) { struct module *mod; @@ -87,11 +70,12 @@ static struct module *find_module(char *modname) return mod; } -static struct module *new_module(char *modname) +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)); @@ -103,7 +87,6 @@ static struct module *new_module(char *modname) /* add to list */ mod->name = p; - mod->gpl_compatible = -1; mod->next = modules; modules = mod; @@ -121,11 +104,6 @@ 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]; }; @@ -144,12 +122,11 @@ 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 - **/ -static 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 */ + +struct symbol * +alloc_symbol(const char *name, unsigned int weak, struct symbol *next) { struct symbol *s = NOFAIL(malloc(sizeof(*s) + strlen(name) + 1)); @@ -161,8 +138,9 @@ static struct symbol *alloc_symbol(const char *name, unsigned int weak, } /* For the hash of exported symbols */ -static struct symbol *new_symbol(const char *name, struct module *module, - enum export export) + +void +new_symbol(const char *name, struct module *module, unsigned int *crc) { unsigned int hash; struct symbol *new; @@ -170,11 +148,14 @@ static struct symbol *new_symbol(const char *name, struct module *module, hash = tdb_hash(name) % SYMBOL_HASH_SIZE; new = symbolhash[hash] = alloc_symbol(name, 0, symbolhash[hash]); new->module = module; - new->export = export; - return new; + if (crc) { + new->crc = *crc; + new->crc_valid = 1; + } } -static struct symbol *find_symbol(const char *name) +struct symbol * +find_symbol(const char *name) { struct symbol *s; @@ -189,90 +170,25 @@ static struct symbol *find_symbol(const char *name) return NULL; } -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) +/* 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) { struct symbol *s = find_symbol(name); if (!s) { - 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"); - } + new_symbol(name, module, crc); + return; + } + if (crc) { + s->crc = *crc; + s->crc_valid = 1; } - s->preloaded = 0; - s->vmlinux = is_vmlinux(mod->name); - s->kernel = 0; - s->export = export; - return s; -} - -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) +void * +grab_file(const char *filename, unsigned long *size) { struct stat st; void *map; @@ -291,12 +207,13 @@ void *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; @@ -326,12 +243,14 @@ char* 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); } -static void parse_elf(struct elf_info *info, const char *filename) +void +parse_elf(struct elf_info *info, const char *filename) { unsigned int i; Elf_Ehdr *hdr = info->hdr; @@ -341,7 +260,7 @@ static void parse_elf(struct elf_info *info, const char *filename) hdr = grab_file(filename, &info->size); if (!hdr) { perror(filename); - exit(1); + abort(); } info->hdr = hdr; if (info->size < sizeof(*hdr)) @@ -367,36 +286,25 @@ static void 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; - secname = secstrings + sechdrs[i].sh_name; - if (strcmp(secname, ".modinfo") == 0) { + if (strcmp(secstrings+sechdrs[i].sh_name, ".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) { - fatal("%s has no symtab?\n", filename); + fprintf(stderr, "modpost: %s no symtab?\n", filename); + abort(); } /* Fix endianness in symbols */ for (sym = info->symtab_start; sym < info->symtab_stop; sym++) { @@ -408,33 +316,36 @@ static void parse_elf(struct elf_info *info, const char *filename) return; truncated: - fatal("%s is truncated.\n", filename); + fprintf(stderr, "modpost: %s is truncated.\n", filename); + abort(); } -static void parse_elf_finish(struct elf_info *info) +void +parse_elf_finish(struct elf_info *info) { release_file(info->hdr, info->size); } -#define CRC_PFX MODULE_SYMBOL_PREFIX "__crc_" -#define KSYMTAB_PFX MODULE_SYMBOL_PREFIX "__ksymtab_" +#define CRC_PFX "__crc_" +#define KSYMTAB_PFX "__ksymtab_" -static void handle_modversions(struct module *mod, struct elf_info *info, - Elf_Sym *sym, const char *symname) +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: - warn("\"%s\" [%s] is COMMON symbol\n", symname, mod->name); + fprintf(stderr, "*** Warning: \"%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; - sym_update_crc(symname + strlen(CRC_PFX), mod, crc, - export); + add_exported_symbol(symname + strlen(CRC_PFX), + mod, &crc); } break; case SHN_UNDEF: @@ -459,15 +370,15 @@ static void handle_modversions(struct module *mod, struct elf_info *info, /* Ignore register directives. */ 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; - } + 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 + @@ -478,8 +389,8 @@ static void handle_modversions(struct module *mod, struct elf_info *info, default: /* All exported symbols */ if (memcmp(symname, KSYMTAB_PFX, strlen(KSYMTAB_PFX)) == 0) { - sym_add_exported(symname + strlen(KSYMTAB_PFX), mod, - export); + add_exported_symbol(symname + strlen(KSYMTAB_PFX), + mod, NULL); } if (strcmp(symname, MODULE_SYMBOL_PREFIX "init_module") == 0) mod->has_init = 1; @@ -489,9 +400,20 @@ static void handle_modversions(struct module *mod, struct elf_info *info, } } -/** - * Parse tag=value strings from .modinfo section - **/ +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 */ static char *next_string(char *string, unsigned long *secsize) { /* Skip non-zero chars */ @@ -510,18 +432,13 @@ static char *next_string(char *string, unsigned long *secsize) return string; } -static char *get_next_modinfo(void *modinfo, unsigned long modinfo_len, - const char *tag, char *info) +static char *get_modinfo(void *modinfo, unsigned long modinfo_len, + const char *tag) { 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; @@ -529,494 +446,11 @@ static char *get_next_modinfo(void *modinfo, unsigned long modinfo_len, return NULL; } -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) +void +read_symbols(char *modname) { const char *symname; char *version; - char *license; struct module *mod; struct elf_info info = { }; Elf_Sym *sym; @@ -1028,30 +462,18 @@ static void 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) @@ -1077,20 +499,21 @@ static void 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); 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 + SZ; @@ -1100,71 +523,10 @@ void buf_write(struct buffer *buf, const char *s, int len) buf->pos += len; } -static void check_for_gpl_usage(enum export exp, const char *m, const char *s) -{ - const char *e = is_vmlinux(m) ?"":".ko"; - - 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 */ -/** - * Header for the generated file - **/ -static void add_header(struct buffer *b, struct module *mod) +void +add_header(struct buffer *b, struct module *mod) { buf_printf(b, "#include \n"); buf_printf(b, "#include \n"); @@ -1184,10 +546,10 @@ static void add_header(struct buffer *b, struct module *mod) buf_printf(b, "};\n"); } -/** - * Record CRCs for unresolved symbols - **/ -static void add_versions(struct buffer *b, struct module *mod) +/* Record CRCs for unresolved symbols */ + +void +add_versions(struct buffer *b, struct module *mod) { struct symbol *s, *exp; @@ -1195,8 +557,8 @@ static void add_versions(struct buffer *b, struct module *mod) exp = find_symbol(s->name); if (!exp || exp->module == mod) { if (have_vmlinux && !s->weak) - warn("\"%s\" [%s.ko] undefined!\n", - s->name, mod->name); + fprintf(stderr, "*** Warning: \"%s\" [%s.ko] " + "undefined!\n", s->name, mod->name); continue; } s->module = exp->module; @@ -1217,7 +579,8 @@ static void add_versions(struct buffer *b, struct module *mod) continue; } if (!s->crc_valid) { - warn("\"%s\" [%s.ko] has no CRC!\n", + fprintf(stderr, "*** Warning: \"%s\" [%s.ko] " + "has no CRC!\n", s->name, mod->name); continue; } @@ -1227,8 +590,8 @@ static void add_versions(struct buffer *b, struct module *mod) buf_printf(b, "};\n"); } -static void add_depends(struct buffer *b, struct module *mod, - struct module *modules) +void +add_depends(struct buffer *b, struct module *mod, struct module *modules) { struct symbol *s; struct module *m; @@ -1258,7 +621,8 @@ static void add_depends(struct buffer *b, struct module *mod, buf_printf(b, "\";\n"); } -static void add_srcversion(struct buffer *b, struct module *mod) +void +add_srcversion(struct buffer *b, struct module *mod) { if (mod->srcversion[0]) { buf_printf(b, "\n"); @@ -1267,7 +631,8 @@ static void add_srcversion(struct buffer *b, struct module *mod) } } -static void write_if_changed(struct buffer *b, const char *fname) +void +write_if_changed(struct buffer *b, const char *fname) { char *tmp; FILE *file; @@ -1311,10 +676,8 @@ static void write_if_changed(struct buffer *b, const char *fname) fclose(file); } -/* parse Module.symvers file. line format: - * 0x12345678symbolmodule[[export]something] - **/ -static void read_dump(const char *fname, unsigned int kernel) +void +read_dump(const char *fname) { unsigned long size, pos = 0; void *file = grab_file(fname, &size); @@ -1325,10 +688,9 @@ static void read_dump(const char *fname, unsigned int kernel) return; while ((line = get_next_line(&pos, file, size))) { - char *symname, *modname, *d, *export, *end; + char *symname, *modname, *d; unsigned int crc; struct module *mod; - struct symbol *s; if (!(symname = strchr(line, '\t'))) goto fail; @@ -1336,10 +698,8 @@ static void read_dump(const char *fname, unsigned int kernel) if (!(modname = strchr(symname, '\t'))) goto fail; *modname++ = '\0'; - if ((export = strchr(modname, '\t')) != NULL) - *export++ = '\0'; - if (export && ((end = strchr(export, '\t')) != NULL)) - *end = '\0'; + if (strchr(modname, '\t')) + goto fail; crc = strtoul(line, &d, 16); if (*symname == '\0' || *modname == '\0' || *d != '\0') goto fail; @@ -1351,30 +711,15 @@ static void read_dump(const char *fname, unsigned int kernel) mod = new_module(NOFAIL(strdup(modname))); mod->skip = 1; } - s = sym_add_exported(symname, mod, export_no(export)); - s->kernel = kernel; - s->preloaded = 1; - sym_update_crc(symname, mod, crc, export_no(export)); + add_exported_symbol(symname, mod, &crc); } return; fail: fatal("parse error in symbol dump file\n"); } -/* 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) +void +write_dump(const char *fname) { struct buffer buf = { }; struct symbol *symbol; @@ -1383,34 +728,34 @@ static void write_dump(const char *fname) for (n = 0; n < SYMBOL_HASH_SIZE ; n++) { symbol = symbolhash[n]; while (symbol) { - 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; + } + } + + 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); 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 *kernel_read = NULL, *module_read = NULL; - char *dump_write = NULL; + char *dump_read = NULL, *dump_write = NULL; int opt; - while ((opt = getopt(argc, argv, "i:I:mo:a")) != -1) { + while ((opt = getopt(argc, argv, "i:mo:a")) != -1) { switch(opt) { case 'i': - kernel_read = optarg; - break; - case 'I': - module_read = optarg; - external_module = 1; + dump_read = optarg; break; case 'm': modversions = 1; @@ -1426,21 +771,13 @@ int main(int argc, char **argv) } } - if (kernel_read) - read_dump(kernel_read, 1); - if (module_read) - read_dump(module_read, 0); + if (dump_read) + read_dump(dump_read); 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; @@ -1462,3 +799,4 @@ int main(int argc, char **argv) return 0; } + diff --git a/scripts/mod/modpost.h b/scripts/mod/modpost.h index d398c61e5..7334d8391 100644 --- a/scripts/mod/modpost.h +++ b/scripts/mod/modpost.h @@ -13,53 +13,22 @@ #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) @@ -69,6 +38,8 @@ 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; \ @@ -100,7 +71,6 @@ 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; @@ -116,32 +86,22 @@ 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/mod/sumversion.c b/scripts/mod/sumversion.c index 8a2875689..43271a1ca 100644 --- a/scripts/mod/sumversion.c +++ b/scripts/mod/sumversion.c @@ -316,7 +316,8 @@ static int parse_source_files(const char *objfile, struct md4_ctx *md) file = grab_file(cmd, &flen); if (!file) { - warn("could not find %s for %s\n", cmd, objfile); + fprintf(stderr, "Warning: could not find %s for %s\n", + cmd, objfile); goto out; } @@ -354,8 +355,9 @@ static int parse_source_files(const char *objfile, struct md4_ctx *md) /* Check if this file is in same dir as objfile */ if ((strstr(line, dir)+strlen(dir)-1) == strrchr(line, '/')) { if (!parse_file(line, md)) { - warn("could not open %s: %s\n", - line, strerror(errno)); + fprintf(stderr, + "Warning: could not open %s: %s\n", + line, strerror(errno)); goto out_file; } @@ -381,11 +383,8 @@ void get_src_version(const char *modname, char sum[], unsigned sumlen) struct md4_ctx md; char *sources, *end, *fname; const char *basename; - char filelist[PATH_MAX + 1]; - char *modverdir = getenv("MODVERDIR"); - - if (!modverdir) - modverdir = "."; + char filelist[strlen(getenv("MODVERDIR")) + strlen("/") + + strlen(modname) - strlen(".o") + strlen(".mod") + 1 ]; /* Source files for module are in .tmp_versions/modname.mod, after the first line. */ @@ -393,25 +392,28 @@ void get_src_version(const char *modname, char sum[], unsigned sumlen) basename = strrchr(modname, '/') + 1; else basename = modname; - sprintf(filelist, "%s/%.*s.mod", modverdir, + sprintf(filelist, "%s/%.*s.mod", getenv("MODVERDIR"), (int) strlen(basename) - 2, basename); file = grab_file(filelist, &len); if (!file) { - warn("could not find versions for %s\n", filelist); + fprintf(stderr, "Warning: could not find versions for %s\n", + filelist); return; } sources = strchr(file, '\n'); if (!sources) { - warn("malformed versions file for %s\n", modname); + fprintf(stderr, "Warning: malformed versions file for %s\n", + modname); goto release; } sources++; end = strchr(sources, '\n'); if (!end) { - warn("bad ending versions file for %s\n", modname); + fprintf(stderr, "Warning: bad ending versions file for %s\n", + modname); goto release; } *end = '\0'; @@ -436,19 +438,19 @@ static void write_version(const char *filename, const char *sum, fd = open(filename, O_RDWR); if (fd < 0) { - warn("changing sum in %s failed: %s\n", + fprintf(stderr, "Warning: changing sum in %s failed: %s\n", filename, strerror(errno)); return; } if (lseek(fd, offset, SEEK_SET) == (off_t)-1) { - warn("changing sum in %s:%lu failed: %s\n", + fprintf(stderr, "Warning: changing sum in %s:%lu failed: %s\n", filename, offset, strerror(errno)); goto out; } if (write(fd, sum, strlen(sum)+1) != strlen(sum)+1) { - warn("writing sum in %s failed: %s\n", + fprintf(stderr, "Warning: writing sum in %s failed: %s\n", filename, strerror(errno)); goto out; } diff --git a/scripts/namespace.pl b/scripts/namespace.pl index f34373853..88e30e82f 100644 --- a/scripts/namespace.pl +++ b/scripts/namespace.pl @@ -66,8 +66,8 @@ require 5; # at least perl 5 use strict; use File::Find; -my $nm = ($ENV{'NM'} || "nm") . " -p"; -my $objdump = ($ENV{'OBJDUMP'} || "objdump") . " -s -j .comment"; +my $nm = "/usr/bin/nm -p"; +my $objdump = "/usr/bin/objdump -s -j .comment"; my $srctree = ""; my $objtree = ""; $srctree = "$ENV{'srctree'}/" if (exists($ENV{'srctree'})); diff --git a/scripts/package/Makefile b/scripts/package/Makefile index 7c434e037..c201ef001 100644 --- a/scripts/package/Makefile +++ b/scripts/package/Makefile @@ -32,11 +32,12 @@ MKSPEC := $(srctree)/scripts/package/mkspec PREV := set -e; cd ..; # rpm-pkg -# --------------------------------------------------------------------------- +.PHONY: rpm-pkg rpm + $(objtree)/kernel.spec: $(MKSPEC) $(srctree)/Makefile $(CONFIG_SHELL) $(MKSPEC) > $@ -rpm-pkg rpm: $(objtree)/kernel.spec FORCE +rpm-pkg rpm: $(objtree)/kernel.spec $(MAKE) clean $(PREV) ln -sf $(srctree) $(KERNELPATH) $(PREV) tar -cz $(RCS_TAR_IGNORE) -f $(KERNELPATH).tar.gz $(KERNELPATH)/. @@ -53,11 +54,11 @@ rpm-pkg rpm: $(objtree)/kernel.spec FORCE clean-files := $(objtree)/kernel.spec # binrpm-pkg -# --------------------------------------------------------------------------- +.PHONY: binrpm-pkg $(objtree)/binkernel.spec: $(MKSPEC) $(srctree)/Makefile $(CONFIG_SHELL) $(MKSPEC) prebuilt > $@ - -binrpm-pkg: $(objtree)/binkernel.spec FORCE + +binrpm-pkg: $(objtree)/binkernel.spec $(MAKE) KBUILD_SRC= set -e; \ $(CONFIG_SHELL) $(srctree)/scripts/mkversion > $(objtree)/.tmp_version @@ -70,7 +71,9 @@ clean-files += $(objtree)/binkernel.spec # Deb target # --------------------------------------------------------------------------- -deb-pkg: FORCE +# +.PHONY: deb-pkg +deb-pkg: $(MAKE) KBUILD_SRC= $(CONFIG_SHELL) $(srctree)/scripts/package/builddeb @@ -79,7 +82,8 @@ clean-dirs += $(objtree)/debian/ # tarball targets # --------------------------------------------------------------------------- -tar%pkg: FORCE +.PHONY: tar%pkg +tar%pkg: $(MAKE) KBUILD_SRC= $(CONFIG_SHELL) $(srctree)/scripts/package/buildtar $@ @@ -88,7 +92,7 @@ clean-dirs += $(objtree)/tar-install/ # Help text displayed when executing 'make help' # --------------------------------------------------------------------------- -help: FORCE +help: @echo ' rpm-pkg - Build the kernel as an RPM package' @echo ' binrpm-pkg - Build an rpm package containing the compiled kernel' @echo ' and modules' diff --git a/scripts/package/mkspec b/scripts/package/mkspec index df892841b..0b1038737 100644 --- a/scripts/package/mkspec +++ b/scripts/package/mkspec @@ -73,13 +73,8 @@ 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/reference_discarded.pl b/scripts/reference_discarded.pl index d5cabb81b..4ee6ab213 100644 --- a/scripts/reference_discarded.pl +++ b/scripts/reference_discarded.pl @@ -71,6 +71,11 @@ foreach $object (keys(%object)) { # printf("ignoring %d conglomerate(s)\n", $ignore); # printf("Scanning objects\n"); + +# 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. $errorcount = 0; foreach $object (keys(%object)) { my $from; @@ -88,14 +93,11 @@ foreach $object (keys(%object)) { ($from !~ /\.text\.exit$/ && $from !~ /\.exit\.text$/ && $from !~ /\.data\.exit$/ && + $from !~ /\.opd$/ && $from !~ /\.exit\.data$/ && $from !~ /\.altinstructions$/ && $from !~ /\.pdr$/ && - $from !~ /\.debug_info$/ && - $from !~ /\.debug_aranges$/ && - $from !~ /\.debug_ranges$/ && - $from !~ /\.debug_line$/ && - $from !~ /\.debug_frame$/ && + $from !~ /\.debug_.*$/ && $from !~ /\.exitcall\.exit$/ && $from !~ /\.eh_frame$/ && $from !~ /\.stab$/)) { diff --git a/scripts/reference_init.pl b/scripts/reference_init.pl index 9a2408453..7f6960b17 100644 --- a/scripts/reference_init.pl +++ b/scripts/reference_init.pl @@ -98,6 +98,7 @@ foreach $object (sort(keys(%object))) { $from !~ /\.pdr$/ && $from !~ /\__param$/ && $from !~ /\.altinstructions/ && + $from !~ /\.eh_frame/ && $from !~ /\.debug_/)) { printf("Error: %s %s refers to %s\n", $object, $from, $line); } diff --git a/scripts/setlocalversion b/scripts/setlocalversion index 82e4993f0..9a2382521 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 | grep -E '^HEAD[[:space:]]+(.*~[0-9]*|undefined)$' > /dev/null; then + if [ "`git name-rev --tags HEAD`" = "HEAD undefined" ]; then printf '%s%s' -g `echo "$head" | cut -c1-8` fi # Are there uncommitted changes? - if git diff-index HEAD | read dummy; then + if git diff-files | read dummy; then printf '%s' -dirty fi fi diff --git a/scripts/ver_linux b/scripts/ver_linux index 84999f697..beb43ef7f 100755 --- a/scripts/ver_linux +++ b/scripts/ver_linux @@ -39,10 +39,10 @@ tune2fs 2>&1 | grep "^tune2fs" | sed 's/,//' | awk \ fsck.jfs -V 2>&1 | grep version | sed 's/,//' | awk \ 'NR==1 {print "jfsutils ", $3}' -reiserfsck -V 2>&1 | grep ^reiserfsck | awk \ +reiserfsck -V 2>&1 | grep reiserfsck | awk \ 'NR==1{print "reiserfsprogs ", $2}' -fsck.reiser4 -V 2>&1 | grep ^fsck.reiser4 | awk \ +fsck.reiser4 -V 2>&1 | grep fsck.reiser4 | awk \ 'NR==1{print "reiser4progs ", $2}' xfs_db -V 2>&1 | grep version | awk \ diff --git a/security/Kconfig b/security/Kconfig index 67785df26..34f593410 100644 --- a/security/Kconfig +++ b/security/Kconfig @@ -22,22 +22,16 @@ 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 keys may be viewed" + bool "Enable the /proc/keys file by which all keys may be viewed" depends on KEYS help - 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 turns on support for the /proc/keys file through which + all the keys on the system can be listed. - 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. + 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. config SECURITY bool "Enable different security models" diff --git a/security/capability.c b/security/capability.c index b868e7eda..f9b35cc0b 100644 --- a/security/capability.c +++ b/security/capability.c @@ -8,6 +8,7 @@ * */ +#include #include #include #include diff --git a/security/commoncap.c b/security/commoncap.c index a0b8d8252..9efbc564a 100644 --- a/security/commoncap.c +++ b/security/commoncap.c @@ -8,6 +8,7 @@ */ #include +#include #include #include #include @@ -32,9 +33,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) +int cap_netlink_recv(struct sk_buff *skb) { - if (!cap_raised(NETLINK_CB(skb).eff_cap, cap)) + if (!cap_raised(NETLINK_CB(skb).eff_cap, CAP_NET_ADMIN)) return -EPERM; return 0; } @@ -59,8 +60,8 @@ int cap_settime(struct timespec *ts, struct timezone *tz) int cap_ptrace (struct task_struct *parent, struct task_struct *child) { /* Derived from arch/i386/kernel/ptrace.c:sys_ptrace. */ - if (!cap_issubset(child->cap_permitted, parent->cap_permitted) && - !__capable(parent, CAP_SYS_PTRACE)) + if (!cap_issubset (child->cap_permitted, current->cap_permitted) && + !capable(CAP_SYS_PTRACE)) return -EPERM; return 0; } diff --git a/security/dummy.c b/security/dummy.c index 58c6d399c..f1a5bd98b 100644 --- a/security/dummy.c +++ b/security/dummy.c @@ -15,6 +15,7 @@ #undef DEBUG #include +#include #include #include #include @@ -190,7 +191,7 @@ static int dummy_sb_kern_mount (struct super_block *sb, void *data) return 0; } -static int dummy_sb_statfs (struct dentry *dentry) +static int dummy_sb_statfs (struct super_block *sb) { return 0; } @@ -377,7 +378,7 @@ static int dummy_inode_removexattr (struct dentry *dentry, char *name) return 0; } -static int dummy_inode_getsecurity(const struct inode *inode, const char *name, void *buffer, size_t size, int err) +static int dummy_inode_getsecurity(struct inode *inode, const char *name, void *buffer, size_t size, int err) { return -EOPNOTSUPP; } @@ -392,11 +393,6 @@ static int dummy_inode_listsecurity(struct inode *inode, char *buffer, size_t bu return 0; } -static const char *dummy_inode_xattr_getsuffix(void) -{ - return NULL; -} - static int dummy_file_permission (struct file *file, int mask) { return 0; @@ -505,9 +501,6 @@ 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; @@ -518,16 +511,6 @@ 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; @@ -544,18 +527,13 @@ 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, u32 secid) + int sig) { return 0; } @@ -682,9 +660,9 @@ static int dummy_netlink_send (struct sock *sk, struct sk_buff *skb) return 0; } -static int dummy_netlink_recv (struct sk_buff *skb, int cap) +static int dummy_netlink_recv (struct sk_buff *skb) { - if (!cap_raised (NETLINK_CB (skb).eff_cap, cap)) + if (!cap_raised (NETLINK_CB (skb).eff_cap, CAP_NET_ADMIN)) return -EPERM; return 0; } @@ -785,13 +763,8 @@ static int dummy_socket_sock_rcv_skb (struct sock *sk, struct sk_buff *skb) return 0; } -static int dummy_socket_getpeersec_stream(struct socket *sock, char __user *optval, - int __user *optlen, unsigned len) -{ - return -ENOPROTOOPT; -} - -static int dummy_socket_getpeersec_dgram(struct socket *sock, struct sk_buff *skb, u32 *secid) +static int dummy_socket_getpeersec(struct socket *sock, char __user *optval, + int __user *optlen, unsigned len) { return -ENOPROTOOPT; } @@ -826,11 +799,6 @@ 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; @@ -840,11 +808,6 @@ 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; @@ -875,18 +838,8 @@ 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, struct task_struct *ctx, - unsigned long flags) +static inline int dummy_key_alloc(struct key *key) { return 0; } @@ -972,7 +925,6 @@ void security_fixup_ops (struct security_operations *ops) set_to_dummy_if_null(ops, inode_getxattr); set_to_dummy_if_null(ops, inode_listxattr); set_to_dummy_if_null(ops, inode_removexattr); - set_to_dummy_if_null(ops, inode_xattr_getsuffix); set_to_dummy_if_null(ops, inode_getsecurity); set_to_dummy_if_null(ops, inode_setsecurity); set_to_dummy_if_null(ops, inode_listsecurity); @@ -996,15 +948,11 @@ 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); @@ -1036,8 +984,6 @@ 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); @@ -1056,8 +1002,7 @@ void security_fixup_ops (struct security_operations *ops) set_to_dummy_if_null(ops, socket_getsockopt); set_to_dummy_if_null(ops, socket_shutdown); set_to_dummy_if_null(ops, socket_sock_rcv_skb); - set_to_dummy_if_null(ops, socket_getpeersec_stream); - set_to_dummy_if_null(ops, socket_getpeersec_dgram); + set_to_dummy_if_null(ops, socket_getpeersec); set_to_dummy_if_null(ops, sk_alloc_security); set_to_dummy_if_null(ops, sk_free_security); set_to_dummy_if_null(ops, sk_getsid); @@ -1066,10 +1011,8 @@ 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 49ee51529..0f77b0223 100644 --- a/security/inode.c +++ b/security/inode.c @@ -13,6 +13,7 @@ */ /* #define DEBUG */ +#include #include #include #include @@ -44,8 +45,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->i_private) - file->private_data = inode->i_private; + if (inode->u.generic_ip) + file->private_data = inode->u.generic_ip; return 0; } @@ -64,6 +65,7 @@ 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) { @@ -133,11 +135,11 @@ static int fill_super(struct super_block *sb, void *data, int silent) return simple_fill_super(sb, SECURITYFS_MAGIC, files); } -static int get_sb(struct file_system_type *fs_type, - int flags, const char *dev_name, - void *data, struct vfsmount *mnt) +static struct super_block *get_sb(struct file_system_type *fs_type, + int flags, const char *dev_name, + void *data) { - return get_sb_single(fs_type, flags, data, fill_super, mnt); + return get_sb_single(fs_type, flags, data, fill_super); } static struct file_system_type fs_type = { @@ -193,7 +195,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.i_private pointer will point to this value on + * on. The inode.u.generic_ip 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. @@ -222,7 +224,7 @@ struct dentry *securityfs_create_file(const char *name, mode_t mode, pr_debug("securityfs: creating file '%s'\n",name); - error = simple_pin_fs(&fs_type, &mount, &mount_count); + error = simple_pin_fs("securityfs", &mount, &mount_count); if (error) { dentry = ERR_PTR(error); goto exit; @@ -239,7 +241,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->i_private = data; + dentry->d_inode->u.generic_ip = data; } exit: return dentry; diff --git a/security/keys/internal.h b/security/keys/internal.h index 1bb416f4b..e066e6057 100644 --- a/security/keys/internal.h +++ b/security/keys/internal.h @@ -99,9 +99,7 @@ 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, - void *aux, - struct key *dest_keyring, - unsigned long flags); + struct key *dest_keyring); /* * request_key authorisation diff --git a/security/keys/key.c b/security/keys/key.c index 80de8c3e9..0e2584e11 100644 --- a/security/keys/key.c +++ b/security/keys/key.c @@ -1,6 +1,6 @@ /* key.c: basic authentication token and access key management * - * Copyright (C) 2004-6 Red Hat, Inc. All Rights Reserved. + * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. * Written by David Howells (dhowells@redhat.com) * * This program is free software; you can redistribute it and/or @@ -11,16 +11,15 @@ #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); @@ -170,24 +169,23 @@ static void __init __key_insert_serial(struct key *key) /*****************************************************************************/ /* * assign a key the next unique serial number - * - these are assigned randomly to avoid security issues through covert - * channel problems + * - we work through all the serial numbers between 2 and 2^31-1 in turn and + * then wrap */ static inline void key_alloc_serial(struct key *key) { struct rb_node *parent, **p; struct key *xkey; - /* propose a random serial number and look for a hole for it in the - * serial number tree */ - 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); + /* propose a likely 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; + parent = NULL; p = &key_serial_tree.rb_node; @@ -206,18 +204,19 @@ 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 = key_serial_next; if (key->serial < 2) key->serial = 2; + key_serial_next = key->serial + 1; - if (!rb_parent(parent)) + if (!parent->rb_parent) p = &key_serial_tree.rb_node; - else if (rb_parent(parent)->rb_left == parent) - p = &(rb_parent(parent)->rb_left); + else if (parent->rb_parent->rb_left == parent) + p = &parent->rb_parent->rb_left; else - p = &(rb_parent(parent)->rb_right); + p = &parent->rb_parent->rb_right; parent = rb_next(parent); if (!parent) @@ -229,7 +228,7 @@ serial_exists: } /* 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); @@ -248,8 +247,8 @@ insert_here: * 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, struct task_struct *ctx, - key_perm_t perm, unsigned long flags) + uid_t uid, gid_t gid, key_perm_t perm, + int not_in_quota) { struct key_user *user = NULL; struct key *key; @@ -270,14 +269,12 @@ 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 (!(flags & KEY_ALLOC_NOT_IN_QUOTA)) { + if (!not_in_quota) { spin_lock(&user->lock); - if (!(flags & KEY_ALLOC_QUOTA_OVERRUN)) { - if (user->qnkeys + 1 >= KEYQUOTA_MAX_KEYS || - user->qnbytes + quotalen >= KEYQUOTA_MAX_BYTES - ) - goto no_quota; - } + if (user->qnkeys + 1 >= KEYQUOTA_MAX_KEYS && + user->qnbytes + quotalen >= KEYQUOTA_MAX_BYTES + ) + goto no_quota; user->qnkeys++; user->qnbytes += quotalen; @@ -311,7 +308,7 @@ struct key *key_alloc(struct key_type *type, const char *desc, key->payload.data = NULL; key->security = NULL; - if (!(flags & KEY_ALLOC_NOT_IN_QUOTA)) + if (!not_in_quota) key->flags |= 1 << KEY_FLAG_IN_QUOTA; memset(&key->type_data, 0, sizeof(key->type_data)); @@ -321,7 +318,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, ctx, flags); + ret = security_key_alloc(key); if (ret < 0) goto security_error; @@ -335,7 +332,7 @@ error: security_error: kfree(key->description); kmem_cache_free(key_jar, key); - if (!(flags & KEY_ALLOC_NOT_IN_QUOTA)) { + if (!not_in_quota) { spin_lock(&user->lock); user->qnkeys--; user->qnbytes -= quotalen; @@ -348,7 +345,7 @@ security_error: no_memory_3: kmem_cache_free(key_jar, key); no_memory_2: - if (!(flags & KEY_ALLOC_NOT_IN_QUOTA)) { + if (!not_in_quota) { spin_lock(&user->lock); user->qnkeys--; user->qnbytes -= quotalen; @@ -764,7 +761,7 @@ key_ref_t key_create_or_update(key_ref_t keyring_ref, const char *description, const void *payload, size_t plen, - unsigned long flags) + int not_in_quota) { struct key_type *ktype; struct key *keyring, *key = NULL; @@ -802,16 +799,12 @@ key_ref_t key_create_or_update(key_ref_t keyring_ref, goto error_3; } - /* if it's possible to update this type of key, search for an existing - * key of the same type and description in the destination keyring and - * update that instead if possible + /* search for an existing key of the same type and description in the + * destination keyring */ - if (ktype->update) { - key_ref = __keyring_search_one(keyring_ref, ktype, description, - 0); - if (!IS_ERR(key_ref)) - goto found_matching_key; - } + key_ref = __keyring_search_one(keyring_ref, ktype, description, 0); + if (!IS_ERR(key_ref)) + goto found_matching_key; /* decide on the permissions we want */ perm = KEY_POS_VIEW | KEY_POS_SEARCH | KEY_POS_LINK | KEY_POS_SETATTR; @@ -825,7 +818,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, - current, perm, flags); + perm, not_in_quota); if (IS_ERR(key)) { key_ref = ERR_PTR(PTR_ERR(key)); goto error_3; @@ -910,10 +903,6 @@ 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() */ @@ -989,7 +978,7 @@ void unregister_key_type(struct key_type *ktype) if (key->type == ktype) { if (ktype->destroy) ktype->destroy(key); - memset(&key->payload, KEY_DESTROY, sizeof(key->payload)); + memset(&key->payload, 0xbd, sizeof(key->payload)); } } diff --git a/security/keys/keyctl.c b/security/keys/keyctl.c index d9ca15c10..0c62798ac 100644 --- a/security/keys/keyctl.c +++ b/security/keys/keyctl.c @@ -17,33 +17,10 @@ #include #include #include -#include #include #include #include "internal.h" -static int key_get_type_from_user(char *type, - const char __user *_type, - unsigned len) -{ - int ret; - - ret = strncpy_from_user(type, _type, len); - - if (ret < 0) - return -EFAULT; - - if (ret == 0 || ret >= len) - return -EINVAL; - - if (type[0] == '.') - return -EPERM; - - type[len - 1] = '\0'; - - return 0; -} - /*****************************************************************************/ /* * extract the description of a new key from userspace and either add it as a @@ -61,22 +38,40 @@ asmlinkage long sys_add_key(const char __user *_type, key_ref_t keyring_ref, key_ref; char type[32], *description; void *payload; - long ret; + long dlen, ret; ret = -EINVAL; if (plen > 32767) goto error; /* draw all the data into kernel space */ - ret = key_get_type_from_user(type, _type, sizeof(type)); + ret = strncpy_from_user(type, _type, sizeof(type) - 1); if (ret < 0) goto error; + type[31] = '\0'; - description = strndup_user(_description, PAGE_SIZE); - if (IS_ERR(description)) { - ret = PTR_ERR(description); + ret = -EPERM; + if (type[0] == '.') + goto error; + + ret = -EFAULT; + dlen = strnlen_user(_description, PAGE_SIZE - 1); + if (dlen <= 0) + goto error; + + ret = -EINVAL; + if (dlen > PAGE_SIZE - 1) goto error; - } + + ret = -ENOMEM; + description = kmalloc(dlen + 1, GFP_KERNEL); + if (!description) + goto error; + description[dlen] = '\0'; + + ret = -EFAULT; + if (copy_from_user(description, _description, dlen) != 0) + goto error2; /* pull the payload in if one was supplied */ payload = NULL; @@ -102,7 +97,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, KEY_ALLOC_IN_QUOTA); + payload, plen, 0); if (!IS_ERR(key_ref)) { ret = key_ref_to_ptr(key_ref)->serial; key_ref_put(key_ref); @@ -141,28 +136,59 @@ asmlinkage long sys_request_key(const char __user *_type, struct key *key; key_ref_t dest_ref; char type[32], *description, *callout_info; - long ret; + long dlen, ret; /* pull the type into kernel space */ - ret = key_get_type_from_user(type, _type, sizeof(type)); + ret = strncpy_from_user(type, _type, sizeof(type) - 1); if (ret < 0) goto error; + type[31] = '\0'; + + ret = -EPERM; + if (type[0] == '.') + goto error; /* pull the description into kernel space */ - description = strndup_user(_description, PAGE_SIZE); - if (IS_ERR(description)) { - ret = PTR_ERR(description); + ret = -EFAULT; + dlen = strnlen_user(_description, PAGE_SIZE - 1); + if (dlen <= 0) goto error; - } + + ret = -EINVAL; + if (dlen > PAGE_SIZE - 1) + goto error; + + ret = -ENOMEM; + description = kmalloc(dlen + 1, GFP_KERNEL); + if (!description) + goto error; + description[dlen] = '\0'; + + ret = -EFAULT; + if (copy_from_user(description, _description, dlen) != 0) + goto error2; /* pull the callout info into kernel space */ callout_info = NULL; if (_callout_info) { - callout_info = strndup_user(_callout_info, PAGE_SIZE); - if (IS_ERR(callout_info)) { - ret = PTR_ERR(callout_info); + ret = -EFAULT; + dlen = strnlen_user(_callout_info, PAGE_SIZE - 1); + if (dlen <= 0) goto error2; - } + + ret = -EINVAL; + if (dlen > PAGE_SIZE - 1) + goto error2; + + ret = -ENOMEM; + callout_info = kmalloc(dlen + 1, GFP_KERNEL); + if (!callout_info) + goto error2; + callout_info[dlen] = '\0'; + + ret = -EFAULT; + if (copy_from_user(callout_info, _callout_info, dlen) != 0) + goto error3; } /* get the destination keyring if specified */ @@ -183,9 +209,8 @@ asmlinkage long sys_request_key(const char __user *_type, } /* do the search */ - key = request_key_and_link(ktype, description, callout_info, NULL, - key_ref_to_ptr(dest_ref), - KEY_ALLOC_IN_QUOTA); + key = request_key_and_link(ktype, description, callout_info, + key_ref_to_ptr(dest_ref)); if (IS_ERR(key)) { ret = PTR_ERR(key); goto error5; @@ -239,21 +264,36 @@ long keyctl_get_keyring_ID(key_serial_t id, int create) long keyctl_join_session_keyring(const char __user *_name) { char *name; - long ret; + long nlen, ret; /* fetch the name from userspace */ name = NULL; if (_name) { - name = strndup_user(_name, PAGE_SIZE); - if (IS_ERR(name)) { - ret = PTR_ERR(name); + ret = -EFAULT; + nlen = strnlen_user(_name, PAGE_SIZE - 1); + if (nlen <= 0) goto error; - } + + ret = -EINVAL; + if (nlen > PAGE_SIZE - 1) + goto error; + + ret = -ENOMEM; + name = kmalloc(nlen + 1, GFP_KERNEL); + if (!name) + goto error; + name[nlen] = '\0'; + + ret = -EFAULT; + if (copy_from_user(name, _name, nlen) != 0) + goto error2; } /* join the session */ ret = join_session_keyring(name); + error2: + kfree(name); error: return ret; @@ -526,18 +566,32 @@ long keyctl_keyring_search(key_serial_t ringid, struct key_type *ktype; key_ref_t keyring_ref, key_ref, dest_ref; char type[32], *description; - long ret; + long dlen, ret; /* pull the type and description into kernel space */ - ret = key_get_type_from_user(type, _type, sizeof(type)); + ret = strncpy_from_user(type, _type, sizeof(type) - 1); if (ret < 0) goto error; + type[31] = '\0'; - description = strndup_user(_description, PAGE_SIZE); - if (IS_ERR(description)) { - ret = PTR_ERR(description); + ret = -EFAULT; + dlen = strnlen_user(_description, PAGE_SIZE - 1); + if (dlen <= 0) goto error; - } + + ret = -EINVAL; + if (dlen > PAGE_SIZE - 1) + goto error; + + ret = -ENOMEM; + description = kmalloc(dlen + 1, GFP_KERNEL); + if (!description) + goto error; + description[dlen] = '\0'; + + ret = -EFAULT; + if (copy_from_user(description, _description, dlen) != 0) + goto error2; /* get the keyring at which to begin the search */ keyring_ref = lookup_user_key(NULL, ringid, 0, 0, KEY_SEARCH); @@ -673,7 +727,6 @@ 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; @@ -697,50 +750,19 @@ 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 error_put; + goto no_access; /* 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 error_put; + goto no_access; } - /* change the UID */ + /* change the UID (have to update the quotas) */ if (uid != (uid_t) -1 && uid != key->uid) { - 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; + /* don't support UID changing yet */ + ret = -EOPNOTSUPP; + goto no_access; } /* change the GID */ @@ -749,20 +771,12 @@ long keyctl_chown_key(key_serial_t id, uid_t uid, gid_t gid) ret = 0; -error_put: + no_access: up_write(&key->sem); key_put(key); - if (zapowner) - key_user_put(zapowner); -error: + 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 e8d02acc5..bffa924c1 100644 --- a/security/keys/keyring.c +++ b/security/keys/keyring.c @@ -49,7 +49,6 @@ 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, @@ -60,7 +59,6 @@ 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, @@ -242,16 +240,15 @@ 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, - struct task_struct *ctx, unsigned long flags, - struct key *dest) + int not_in_quota, struct key *dest) { struct key *keyring; int ret; keyring = key_alloc(&key_type_keyring, description, - uid, gid, ctx, + uid, gid, (KEY_POS_ALL & ~KEY_POS_SETATTR) | KEY_USR_ALL, - flags); + not_in_quota); if (!IS_ERR(keyring)) { ret = key_instantiate_and_link(keyring, NULL, 0, dest, NULL); @@ -955,22 +952,3 @@ 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 686a9ee0c..12b750e51 100644 --- a/security/keys/proc.c +++ b/security/keys/proc.c @@ -137,13 +137,6 @@ 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 32150cf7c..74cb79eb9 100644 --- a/security/keys/process_keys.c +++ b/security/keys/process_keys.c @@ -16,12 +16,11 @@ #include #include #include -#include #include #include "internal.h" /* session keyring create vs join semaphore */ -static DEFINE_MUTEX(key_session_mutex); +static DECLARE_MUTEX(key_session_sem); /* the root user's tracking struct */ struct key_user root_key_user = { @@ -67,8 +66,7 @@ struct key root_session_keyring = { /* * allocate the keyrings to be associated with a UID */ -int alloc_uid_keyring(struct user_struct *user, - struct task_struct *ctx) +int alloc_uid_keyring(struct user_struct *user) { struct key *uid_keyring, *session_keyring; char buf[20]; @@ -77,8 +75,7 @@ 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, ctx, - KEY_ALLOC_IN_QUOTA, NULL); + session_keyring = keyring_alloc(buf, user->uid, (gid_t) -1, 0, NULL); if (IS_ERR(session_keyring)) { ret = PTR_ERR(session_keyring); goto error; @@ -88,8 +85,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, ctx, - KEY_ALLOC_IN_QUOTA, session_keyring); + uid_keyring = keyring_alloc(buf, user->uid, (gid_t) -1, 0, + session_keyring); if (IS_ERR(uid_keyring)) { key_put(session_keyring); ret = PTR_ERR(uid_keyring); @@ -145,8 +142,7 @@ int install_thread_keyring(struct task_struct *tsk) sprintf(buf, "_tid.%u", tsk->pid); - keyring = keyring_alloc(buf, tsk->uid, tsk->gid, tsk, - KEY_ALLOC_QUOTA_OVERRUN, NULL); + keyring = keyring_alloc(buf, tsk->uid, tsk->gid, 1, NULL); if (IS_ERR(keyring)) { ret = PTR_ERR(keyring); goto error; @@ -171,29 +167,27 @@ error: */ int install_process_keyring(struct task_struct *tsk) { + unsigned long flags; struct key *keyring; char buf[20]; int ret; - might_sleep(); - if (!tsk->signal->process_keyring) { sprintf(buf, "_pid.%u", tsk->tgid); - keyring = keyring_alloc(buf, tsk->uid, tsk->gid, tsk, - KEY_ALLOC_QUOTA_OVERRUN, NULL); + keyring = keyring_alloc(buf, tsk->uid, tsk->gid, 1, NULL); if (IS_ERR(keyring)) { ret = PTR_ERR(keyring); goto error; } /* attach keyring */ - spin_lock_irq(&tsk->sighand->siglock); + spin_lock_irqsave(&tsk->sighand->siglock, flags); if (!tsk->signal->process_keyring) { tsk->signal->process_keyring = keyring; keyring = NULL; } - spin_unlock_irq(&tsk->sighand->siglock); + spin_unlock_irqrestore(&tsk->sighand->siglock, flags); key_put(keyring); } @@ -215,40 +209,35 @@ static int install_session_keyring(struct task_struct *tsk, unsigned long flags; struct key *old; char buf[20]; - - might_sleep(); + int ret; /* create an empty session keyring */ if (!keyring) { sprintf(buf, "_ses.%u", tsk->tgid); - 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); + keyring = keyring_alloc(buf, tsk->uid, tsk->gid, 1, NULL); + if (IS_ERR(keyring)) { + ret = PTR_ERR(keyring); + goto error; + } } else { atomic_inc(&keyring->usage); } /* install the keyring */ - spin_lock_irq(&tsk->sighand->siglock); - old = tsk->signal->session_keyring; + spin_lock_irqsave(&tsk->sighand->siglock, flags); + old = rcu_dereference(tsk->signal->session_keyring); rcu_assign_pointer(tsk->signal->session_keyring, keyring); - spin_unlock_irq(&tsk->sighand->siglock); + spin_unlock_irqrestore(&tsk->sighand->siglock, flags); - /* we're using RCU on the pointer, but there's no point synchronising - * on it if it didn't previously point to anything */ - if (old) { - synchronize_rcu(); - key_put(old); - } + ret = 0; - return 0; + /* we're using RCU on the pointer */ + synchronize_rcu(); + key_put(old); +error: + return ret; } /* end install_session_keyring() */ @@ -321,6 +310,7 @@ void exit_keys(struct task_struct *tsk) */ int exec_keys(struct task_struct *tsk) { + unsigned long flags; struct key *old; /* newly exec'd tasks don't get a thread keyring */ @@ -332,10 +322,10 @@ int exec_keys(struct task_struct *tsk) key_put(old); /* discard the process keyring from a newly exec'd task */ - spin_lock_irq(&tsk->sighand->siglock); + spin_lock_irqsave(&tsk->sighand->siglock, flags); old = tsk->signal->process_keyring; tsk->signal->process_keyring = NULL; - spin_unlock_irq(&tsk->sighand->siglock); + spin_unlock_irqrestore(&tsk->sighand->siglock, flags); key_put(old); @@ -400,8 +390,6 @@ 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 @@ -507,35 +495,27 @@ key_ref_t search_process_keyrings(struct key_type *type, */ if (context->request_key_auth && context == current && - type != &key_type_request_key_auth + type != &key_type_request_key_auth && + key_validate(context->request_key_auth) == 0 ) { - /* defend against the auth key being revoked */ - down_read(&context->request_key_auth->sem); - - if (key_validate(context->request_key_auth) == 0) { - rka = context->request_key_auth->payload.data; + rka = context->request_key_auth->payload.data; - key_ref = search_process_keyrings(type, description, - match, rka->context); + key_ref = search_process_keyrings(type, description, match, + rka->context); - up_read(&context->request_key_auth->sem); - - if (!IS_ERR(key_ref)) - goto found; + 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; - default: - err = key_ref; + switch (PTR_ERR(key_ref)) { + case -EAGAIN: /* no key */ + if (ret) break; - } - } else { - up_read(&context->request_key_auth->sem); + case -ENOKEY: /* negative key */ + ret = key_ref; + break; + default: + err = key_ref; + break; } } @@ -731,14 +711,13 @@ long join_session_keyring(const char *name) } /* allow the user to join or create a named keyring */ - mutex_lock(&key_session_mutex); + down(&key_session_sem); /* look for an existing keyring of this 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, tsk, - KEY_ALLOC_IN_QUOTA, NULL); + keyring = keyring_alloc(name, tsk->uid, tsk->gid, 0, NULL); if (IS_ERR(keyring)) { ret = PTR_ERR(keyring); goto error2; @@ -758,7 +737,7 @@ long join_session_keyring(const char *name) key_put(keyring); error2: - mutex_unlock(&key_session_mutex); + up(&key_session_sem); error: return ret; diff --git a/security/keys/request_key.c b/security/keys/request_key.c index f573ac189..f030a0ccb 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-6 Red Hat, Inc. All Rights Reserved. + * Copyright (C) 2004-5 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,8 +33,7 @@ DECLARE_WAIT_QUEUE_HEAD(request_key_conswq); */ static int call_sbin_request_key(struct key *key, struct key *authkey, - const char *op, - void *aux) + const char *op) { struct task_struct *tsk = current; key_serial_t prkey, sskey; @@ -49,8 +48,7 @@ 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, current, - KEY_ALLOC_QUOTA_OVERRUN, NULL); + keyring = keyring_alloc(desc, current->fsuid, current->fsgid, 1, NULL); if (IS_ERR(keyring)) { ret = PTR_ERR(keyring); goto error_alloc; @@ -127,9 +125,7 @@ error_alloc: */ static struct key *__request_key_construction(struct key_type *type, const char *description, - const char *callout_info, - void *aux, - unsigned long flags) + const char *callout_info) { request_key_actor_t actor; struct key_construction cons; @@ -137,12 +133,11 @@ static struct key *__request_key_construction(struct key_type *type, struct key *key, *authkey; int ret, negated; - kenter("%s,%s,%s,%lx", type->name, description, callout_info, flags); + kenter("%s,%s,%s", type->name, description, callout_info); /* create a key and add it to the queue */ key = key_alloc(type, description, - current->fsuid, current->fsgid, current, KEY_POS_ALL, - flags); + current->fsuid, current->fsgid, KEY_POS_ALL, 0); if (IS_ERR(key)) goto alloc_failed; @@ -166,7 +161,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", aux); + ret = actor(key, authkey, "create"); if (ret < 0) goto request_failed; @@ -260,18 +255,16 @@ 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, - unsigned long flags) + const char *callout_info) { struct key_construction *pcons; struct key *key, *ckey; DECLARE_WAITQUEUE(myself, current); - kenter("%s,%s,{%d},%s,%lx", - type->name, description, user->uid, callout_info, flags); + kenter("%s,%s,{%d},%s", + type->name, description, user->uid, callout_info); /* see if there's such a key under construction already */ down_write(&key_construction_sem); @@ -287,8 +280,7 @@ 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, aux, - flags); + key = __request_key_construction(type, description, callout_info); error: kleave(" = %p", key); return key; @@ -395,17 +387,14 @@ 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, - void *aux, - struct key *dest_keyring, - unsigned long flags) + struct key *dest_keyring) { struct key_user *user; struct key *key; key_ref_t key_ref; - kenter("%s,%s,%s,%p,%p,%lx", - type->name, description, callout_info, aux, - dest_keyring, flags); + kenter("%s,%s,%s,%p", + type->name, description, callout_info, dest_keyring); /* search all the process keyrings for a key */ key_ref = search_process_keyrings(type, description, type->match, @@ -438,8 +427,7 @@ 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, - callout_info, aux, - user, flags); + user, callout_info); if (key) break; @@ -495,28 +483,8 @@ 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, - NULL, KEY_ALLOC_IN_QUOTA); + return request_key_and_link(type, description, callout_info, NULL); } /* 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 cbf58a91b..cce6ba6b0 100644 --- a/security/keys/request_key_auth.c +++ b/security/keys/request_key_auth.c @@ -20,7 +20,6 @@ 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); @@ -32,7 +31,6 @@ 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, }; @@ -93,24 +91,6 @@ 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 @@ -121,11 +101,6 @@ 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); @@ -156,26 +131,14 @@ 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); @@ -185,9 +148,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, + current->fsuid, current->fsgid, KEY_POS_VIEW | KEY_POS_READ | KEY_POS_SEARCH | - KEY_USR_VIEW, KEY_ALLOC_NOT_IN_QUOTA); + KEY_USR_VIEW, 1); if (IS_ERR(authkey)) { ret = PTR_ERR(authkey); goto error_alloc; @@ -198,15 +161,9 @@ 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 5bbfdebb7..8e71895b9 100644 --- a/security/keys/user_defined.c +++ b/security/keys/user_defined.c @@ -28,7 +28,6 @@ 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, @@ -68,7 +67,6 @@ error: return ret; } /* end user_instantiate() */ - EXPORT_SYMBOL_GPL(user_instantiate); /*****************************************************************************/ @@ -143,28 +141,7 @@ EXPORT_SYMBOL_GPL(user_match); /*****************************************************************************/ /* - * 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 + * dispose of the data dangling from the corpse of a user */ void user_destroy(struct key *key) { diff --git a/security/root_plug.c b/security/root_plug.c index 38dd4f3e6..07651def2 100644 --- a/security/root_plug.c +++ b/security/root_plug.c @@ -22,6 +22,7 @@ * License. */ +#include #include #include #include diff --git a/security/seclvl.c b/security/seclvl.c index d5371b8da..8ebe647b5 100644 --- a/security/seclvl.c +++ b/security/seclvl.c @@ -8,7 +8,6 @@ * Copyright (c) 2001 WireX Communications, Inc * Copyright (c) 2001 Greg Kroah-Hartman * Copyright (c) 2002 International Business Machines - * Copyright (c) 2006 Davi E. M. Arnaut * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,6 +15,7 @@ * (at your option) any later version. */ +#include #include #include #include @@ -31,7 +31,6 @@ #include #include #include -#include #include #include @@ -195,27 +194,35 @@ static unsigned char hashedPassword[SHA1_DIGEST_SIZE]; * people... */ static int -plaintext_to_sha1(unsigned char *hash, const char *plaintext, unsigned int len) +plaintext_to_sha1(unsigned char *hash, const char *plaintext, int len) { + char *pgVirtAddr; struct crypto_tfm *tfm; - struct scatterlist sg; + struct scatterlist sg[1]; if (len > PAGE_SIZE) { seclvl_printk(0, KERN_ERR, "Plaintext password too large (%d " "characters). Largest possible is %lu " "bytes.\n", len, PAGE_SIZE); - return -EINVAL; + return -ENOMEM; } tfm = crypto_alloc_tfm("sha1", CRYPTO_TFM_REQ_MAY_SLEEP); if (tfm == NULL) { seclvl_printk(0, KERN_ERR, "Failed to load transform for SHA1\n"); - return -EINVAL; + return -ENOSYS; } - sg_init_one(&sg, (u8 *)plaintext, len); + // Just get a new page; don't play around with page boundaries + // and scatterlists. + pgVirtAddr = (char *)__get_free_page(GFP_KERNEL); + sg[0].page = virt_to_page(pgVirtAddr); + sg[0].offset = 0; + sg[0].length = len; + strncpy(pgVirtAddr, plaintext, len); crypto_digest_init(tfm); - crypto_digest_update(tfm, &sg, 1); + crypto_digest_update(tfm, sg, 1); crypto_digest_final(tfm, hash); crypto_free_tfm(tfm); + free_page((unsigned long)pgVirtAddr); return 0; } @@ -227,9 +234,11 @@ static ssize_t passwd_write_file(struct file * file, const char __user * buf, size_t count, loff_t *ppos) { - char *p; - int len; + int i; unsigned char tmp[SHA1_DIGEST_SIZE]; + char *page; + int rc; + int len; if (!*passwd && !*sha1_passwd) { seclvl_printk(0, KERN_ERR, "Attempt to password-unlock the " @@ -242,39 +251,38 @@ passwd_write_file(struct file * file, const char __user * buf, return -EINVAL; } - if (count >= PAGE_SIZE) + if (count < 0 || count >= PAGE_SIZE) return -EINVAL; if (*ppos != 0) return -EINVAL; - p = kmalloc(count, GFP_KERNEL); - if (!p) + page = (char *)get_zeroed_page(GFP_KERNEL); + if (!page) return -ENOMEM; len = -EFAULT; - if (copy_from_user(p, buf, count)) + if (copy_from_user(page, buf, count)) goto out; - len = count; + len = strlen(page); /* ``echo "secret" > seclvl/passwd'' includes a newline */ - if (p[len - 1] == '\n') + if (page[len - 1] == '\n') len--; /* Hash the password, then compare the hashed values */ - if ((len = plaintext_to_sha1(tmp, p, len))) { + if ((rc = plaintext_to_sha1(tmp, page, len))) { seclvl_printk(0, KERN_ERR, "Error hashing password: rc = " - "[%d]\n", len); - goto out; + "[%d]\n", rc); + return rc; + } + for (i = 0; i < SHA1_DIGEST_SIZE; i++) { + if (hashedPassword[i] != tmp[i]) + return -EPERM; } - - len = -EPERM; - if (memcmp(hashedPassword, tmp, SHA1_DIGEST_SIZE)) - goto out; - seclvl_printk(0, KERN_INFO, "Password accepted; seclvl reduced to 0.\n"); seclvl = 0; len = count; out: - kfree (p); + free_page((unsigned long)page); return len; } @@ -287,11 +295,13 @@ static struct file_operations passwd_file_ops = { */ static int seclvl_ptrace(struct task_struct *parent, struct task_struct *child) { - if (seclvl >= 0 && child->pid == 1) { - seclvl_printk(1, KERN_WARNING, "Attempt to ptrace " - "the init process dissallowed in " - "secure level %d\n", seclvl); - return -EPERM; + if (seclvl >= 0) { + if (child->pid == 1) { + seclvl_printk(1, KERN_WARNING, "Attempt to ptrace " + "the init process dissallowed in " + "secure level %d\n", seclvl); + return -EPERM; + } } return 0; } @@ -302,54 +312,55 @@ static int seclvl_ptrace(struct task_struct *parent, struct task_struct *child) */ static int seclvl_capable(struct task_struct *tsk, int cap) { - int rc = 0; - /* init can do anything it wants */ if (tsk->pid == 1) return 0; - if (seclvl > 0) { - rc = -EPERM; - - if (cap == CAP_LINUX_IMMUTABLE) + switch (seclvl) { + case 2: + /* fall through */ + case 1: + if (cap == CAP_LINUX_IMMUTABLE) { seclvl_printk(1, KERN_WARNING, "Attempt to modify " "the IMMUTABLE and/or APPEND extended " "attribute on a file with the IMMUTABLE " "and/or APPEND extended attribute set " "denied in seclvl [%d]\n", seclvl); - else if (cap == CAP_SYS_RAWIO) + return -EPERM; + } else if (cap == CAP_SYS_RAWIO) { // Somewhat broad... seclvl_printk(1, KERN_WARNING, "Attempt to perform " "raw I/O while in secure level [%d] " "denied\n", seclvl); - else if (cap == CAP_NET_ADMIN) + return -EPERM; + } else if (cap == CAP_NET_ADMIN) { seclvl_printk(1, KERN_WARNING, "Attempt to perform " "network administrative task while " "in secure level [%d] denied\n", seclvl); - else if (cap == CAP_SETUID) + return -EPERM; + } else if (cap == CAP_SETUID) { seclvl_printk(1, KERN_WARNING, "Attempt to setuid " "while in secure level [%d] denied\n", seclvl); - else if (cap == CAP_SETGID) + return -EPERM; + } else if (cap == CAP_SETGID) { seclvl_printk(1, KERN_WARNING, "Attempt to setgid " "while in secure level [%d] denied\n", seclvl); - else if (cap == CAP_SYS_MODULE) + } else if (cap == CAP_SYS_MODULE) { seclvl_printk(1, KERN_WARNING, "Attempt to perform " "a module operation while in secure " "level [%d] denied\n", seclvl); - else - rc = 0; - } - - if (!rc) { - if (!(cap_is_fs_cap(cap) ? tsk->fsuid == 0 : tsk->euid == 0)) - rc = -EPERM; + return -EPERM; + } + break; + default: + break; } - - if (rc) - seclvl_printk(1, KERN_WARNING, "Capability denied\n"); - - return rc; + /* from dummy.c */ + if (cap_is_fs_cap(cap) ? tsk->fsuid == 0 : tsk->euid == 0) + return 0; /* capability granted */ + seclvl_printk(1, KERN_WARNING, "Capability denied\n"); + return -EPERM; /* capability denied */ } /** @@ -457,9 +468,12 @@ static int seclvl_inode_setattr(struct dentry *dentry, struct iattr *iattr) static void seclvl_file_free_security(struct file *filp) { struct dentry *dentry = filp->f_dentry; + struct inode *inode = NULL; - if (dentry) - seclvl_bd_release(dentry->d_inode); + if (dentry) { + inode = dentry->d_inode; + seclvl_bd_release(inode); + } } /** @@ -467,7 +481,9 @@ static void seclvl_file_free_security(struct file *filp) */ static int seclvl_umount(struct vfsmount *mnt, int flags) { - if (current->pid != 1 && seclvl == 2) { + if (current->pid == 1) + return 0; + if (seclvl == 2) { seclvl_printk(1, KERN_WARNING, "Attempt to unmount in secure " "level %d\n", seclvl); return -EPERM; @@ -491,9 +507,8 @@ static struct security_operations seclvl_ops = { static int processPassword(void) { int rc = 0; + hashedPassword[0] = '\0'; if (*passwd) { - char *p; - if (*sha1_passwd) { seclvl_printk(0, KERN_ERR, "Error: Both " "passwd and sha1_passwd " @@ -501,16 +516,12 @@ static int processPassword(void) "exclusive.\n"); return -EINVAL; } - - p = kstrdup(passwd, GFP_KERNEL); - if (p == NULL) - return -ENOMEM; - - if ((rc = plaintext_to_sha1(hashedPassword, p, strlen(p)))) + if ((rc = plaintext_to_sha1(hashedPassword, passwd, + strlen(passwd)))) { seclvl_printk(0, KERN_ERR, "Error: SHA1 support not " "in kernel\n"); - - kfree (p); + return rc; + } /* All static data goes to the BSS, which zero's the * plaintext password out for us. */ } else if (*sha1_passwd) { // Base 16 @@ -533,7 +544,7 @@ static int processPassword(void) sha1_passwd[i + 2] = tmp; } } - return rc; + return 0; } /** @@ -543,46 +554,28 @@ struct dentry *dir_ino, *seclvl_ino, *passwd_ino; static int seclvlfs_register(void) { - int rc = 0; - dir_ino = securityfs_create_dir("seclvl", NULL); - - if (IS_ERR(dir_ino)) - return PTR_ERR(dir_ino); + if (!dir_ino) + return -EFAULT; seclvl_ino = securityfs_create_file("seclvl", S_IRUGO | S_IWUSR, dir_ino, &seclvl, &seclvl_file_ops); - if (IS_ERR(seclvl_ino)) { - rc = PTR_ERR(seclvl_ino); + if (!seclvl_ino) goto out_deldir; - } if (*passwd || *sha1_passwd) { passwd_ino = securityfs_create_file("passwd", S_IRUGO | S_IWUSR, dir_ino, NULL, &passwd_file_ops); - if (IS_ERR(passwd_ino)) { - rc = PTR_ERR(passwd_ino); + if (!passwd_ino) goto out_delf; - } } - return rc; - -out_delf: - securityfs_remove(seclvl_ino); + return 0; out_deldir: securityfs_remove(dir_ino); - - return rc; -} - -static void seclvlfs_unregister(void) -{ +out_delf: securityfs_remove(seclvl_ino); - if (*passwd || *sha1_passwd) - securityfs_remove(passwd_ino); - - securityfs_remove(dir_ino); + return -EFAULT; } /** @@ -591,8 +584,6 @@ static void seclvlfs_unregister(void) static int __init seclvl_init(void) { int rc = 0; - static char once; - if (verbosity < 0 || verbosity > 1) { printk(KERN_ERR "Error: bad verbosity [%d]; only 0 or 1 " "are valid values\n", verbosity); @@ -611,11 +602,6 @@ static int __init seclvl_init(void) "module parameter(s): rc = [%d]\n", rc); goto exit; } - - if ((rc = seclvlfs_register())) { - seclvl_printk(0, KERN_ERR, "Error registering with sysfs\n"); - goto exit; - } /* register ourselves with the security framework */ if (register_security(&seclvl_ops)) { seclvl_printk(0, KERN_ERR, @@ -627,24 +613,20 @@ static int __init seclvl_init(void) seclvl_printk(0, KERN_ERR, "seclvl: Failure " "registering with primary security " "module.\n"); - seclvlfs_unregister(); goto exit; } /* if primary module registered */ secondary = 1; } /* if we registered ourselves with the security framework */ - - seclvl_printk(0, KERN_INFO, "seclvl: Successfully initialized.\n"); - - if (once) { - once = 1; - seclvl_printk(0, KERN_INFO, "seclvl is going away. It has been " - "buggy for ages. Also, be warned that " - "Securelevels are useless."); + if ((rc = seclvlfs_register())) { + seclvl_printk(0, KERN_ERR, "Error registering with sysfs\n"); + goto exit; } + seclvl_printk(0, KERN_INFO, "seclvl: Successfully initialized.\n"); exit: - if (rc) + if (rc) { printk(KERN_ERR "seclvl: Error during initialization: rc = " "[%d]\n", rc); + } return rc; } @@ -653,14 +635,17 @@ static int __init seclvl_init(void) */ static void __exit seclvl_exit(void) { - seclvlfs_unregister(); - - if (secondary) + securityfs_remove(seclvl_ino); + if (*passwd || *sha1_passwd) + securityfs_remove(passwd_ino); + securityfs_remove(dir_ino); + if (secondary == 1) { mod_unreg_security(MY_NAME, &seclvl_ops); - else if (unregister_security(&seclvl_ops)) + } else if (unregister_security(&seclvl_ops)) { seclvl_printk(0, KERN_INFO, "seclvl: Failure unregistering with the " "kernel\n"); + } } module_init(seclvl_init); diff --git a/security/security.c b/security/security.c index ee4e0701b..c5c5793b1 100644 --- a/security/security.c +++ b/security/security.c @@ -12,6 +12,7 @@ */ #include +#include #include #include #include @@ -173,8 +174,34 @@ int mod_unreg_security(const char *name, struct security_operations *ops) return security_ops->unregister_security(name, ops); } +/** + * capable - calls the currently loaded security module's capable() function with the specified capability + * @cap: the requested capability level. + * + * This function calls the currently loaded security module's capable() + * function with a pointer to the current task and the specified @cap value. + * + * This allows the security module to implement the capable function call + * however it chooses to. + */ +int capable(int cap) +{ + if (vx_check_bit(VXC_CAP_MASK, cap) && !vx_mcaps(1L << cap)) + return 0; + if (security_ops->capable(current, cap)) { + /* capability denied */ + return 0; + } + + /* capability granted */ + current->flags |= PF_SUPERPRIV; + return 1; +} + + EXPORT_SYMBOL_GPL(register_security); EXPORT_SYMBOL_GPL(unregister_security); EXPORT_SYMBOL_GPL(mod_reg_security); EXPORT_SYMBOL_GPL(mod_unreg_security); +EXPORT_SYMBOL(capable); EXPORT_SYMBOL(security_ops); diff --git a/security/selinux/Kconfig b/security/selinux/Kconfig index 4e98f66b3..f636f53ca 100644 --- a/security/selinux/Kconfig +++ b/security/selinux/Kconfig @@ -1,7 +1,6 @@ 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). @@ -96,64 +95,3 @@ 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/Makefile b/security/selinux/Makefile index faf2e02e4..688c0a267 100644 --- a/security/selinux/Makefile +++ b/security/selinux/Makefile @@ -4,7 +4,7 @@ obj-$(CONFIG_SECURITY_SELINUX) := selinux.o ss/ -selinux-y := avc.o hooks.o selinuxfs.o netlink.o nlmsgtab.o netif.o exports.o +selinux-y := avc.o hooks.o selinuxfs.o netlink.o nlmsgtab.o netif.o selinux-$(CONFIG_SECURITY_NETWORK_XFRM) += xfrm.o diff --git a/security/selinux/avc.c b/security/selinux/avc.c index a300702da..ac5d69bb3 100644 --- a/security/selinux/avc.c +++ b/security/selinux/avc.c @@ -800,7 +800,7 @@ out: int avc_ss_reset(u32 seqno) { struct avc_callback_node *c; - int i, rc = 0, tmprc; + int i, rc = 0; unsigned long flag; struct avc_node *node; @@ -813,16 +813,15 @@ int avc_ss_reset(u32 seqno) for (c = avc_callbacks; c; c = c->next) { if (c->events & AVC_CALLBACK_RESET) { - tmprc = c->callback(AVC_CALLBACK_RESET, - 0, 0, 0, 0, NULL); - /* save the first error encountered for the return - value and continue processing the callbacks */ - if (!rc) - rc = tmprc; + rc = c->callback(AVC_CALLBACK_RESET, + 0, 0, 0, 0, NULL); + if (rc) + goto out; } } avc_latest_notif_update(seqno, 0); +out: return rc; } diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c index 0b32f3020..b65c201e9 100644 --- a/security/selinux/hooks.c +++ b/security/selinux/hooks.c @@ -18,6 +18,7 @@ * as published by the Free Software Foundation. */ +#include #include #include #include @@ -68,7 +69,6 @@ #include #include #include -#include #include "avc.h" #include "objsec.h" @@ -80,7 +80,6 @@ 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; @@ -102,8 +101,6 @@ static int __init selinux_enabled_setup(char *str) return 1; } __setup("selinux=", selinux_enabled_setup); -#else -int selinux_enabled = 1; #endif /* Original (dummy) security module. */ @@ -120,34 +117,6 @@ static struct security_operations *secondary_ops = NULL; static LIST_HEAD(superblock_security_head); static DEFINE_SPINLOCK(sb_security_lock); -static kmem_cache_t *sel_inode_cache; - -/* Return security context for a given sid or just the context - length if the buffer is null or length is 0 */ -static int selinux_getsecurity(u32 sid, void *buffer, size_t size) -{ - char *context; - unsigned len; - int rc; - - rc = security_sid_to_context(sid, &context, &len); - if (rc) - return rc; - - if (!buffer || !size) - goto getsecurity_exit; - - if (size < len) { - len = -ERANGE; - goto getsecurity_exit; - } - memcpy(buffer, context, len); - -getsecurity_exit: - kfree(context); - return len; -} - /* Allocate and free functions for each kind of security blob. */ static int task_alloc_security(struct task_struct *task) @@ -177,11 +146,10 @@ static int inode_alloc_security(struct inode *inode) struct task_security_struct *tsec = current->security; struct inode_security_struct *isec; - isec = kmem_cache_alloc(sel_inode_cache, SLAB_KERNEL); + isec = kzalloc(sizeof(struct inode_security_struct), GFP_KERNEL); if (!isec) return -ENOMEM; - memset(isec, 0, sizeof(*isec)); init_MUTEX(&isec->sem); INIT_LIST_HEAD(&isec->list); isec->inode = inode; @@ -204,7 +172,7 @@ static void inode_free_security(struct inode *inode) spin_unlock(&sbsec->isec_lock); inode->i_security = NULL; - kmem_cache_free(sel_inode_cache, isec); + kfree(isec); } static int file_alloc_security(struct file *file) @@ -246,7 +214,6 @@ 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; @@ -320,53 +287,19 @@ 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; @@ -409,7 +342,7 @@ static int try_context_mount(struct super_block *sb, void *data) switch (token) { case Opt_context: - if (seen & (Opt_context|Opt_defcontext)) { + if (seen) { rc = -EINVAL; printk(KERN_WARNING SEL_MOUNT_FAIL_MSG); goto out_free; @@ -425,13 +358,13 @@ static int try_context_mount(struct super_block *sb, void *data) break; case Opt_fscontext: - if (seen & Opt_fscontext) { + if (seen & (Opt_context|Opt_fscontext)) { rc = -EINVAL; printk(KERN_WARNING SEL_MOUNT_FAIL_MSG); goto out_free; } - fscontext = match_strdup(&args[0]); - if (!fscontext) { + context = match_strdup(&args[0]); + if (!context) { rc = -ENOMEM; goto out_free; } @@ -440,22 +373,6 @@ 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; @@ -492,28 +409,6 @@ 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) { @@ -523,38 +418,20 @@ static int try_context_mount(struct super_block *sb, void *data) goto out_free; } - 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); + rc = avc_has_perm(tsec->sid, sbsec->sid, SECCLASS_FILESYSTEM, + FILESYSTEM__RELABELFROM, NULL); + if (rc) goto out_free; - } - rc = may_context_mount_inode_relabel(sid, sbsec, tsec); + rc = avc_has_perm(tsec->sid, sid, SECCLASS_FILESYSTEM, + FILESYSTEM__RELABELTO, NULL); if (rc) goto out_free; - isec->sid = sid; - isec->initialized = 1; + sbsec->sid = sid; + + if (seen & Opt_context) + sbsec->behavior = SECURITY_FS_USE_MNTPOINT; } if (defcontext) { @@ -569,7 +446,13 @@ static int try_context_mount(struct super_block *sb, void *data) if (sid == sbsec->def_sid) goto out_free; - rc = may_context_mount_inode_relabel(sid, sbsec, tsec); + 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); if (rc) goto out_free; @@ -580,8 +463,6 @@ out_free: if (alloc) { kfree(context); kfree(defcontext); - kfree(fscontext); - kfree(rootcontext); } out: return rc; @@ -784,8 +665,6 @@ 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; @@ -963,11 +842,8 @@ 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 superblock SID. */ + /* Default to the fs SID. */ isec->sid = sbsec->sid; if (sbsec->proc) { @@ -1189,17 +1065,6 @@ 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 @@ -1622,10 +1487,8 @@ static int selinux_bprm_set_security(struct linux_binprm *bprm) /* Default to the current task SID. */ bsec->sid = tsec->sid; - /* Reset fs, key, and sock SIDs on execve. */ + /* Reset create SID on execve. */ tsec->create_sid = 0; - tsec->keycreate_sid = 0; - tsec->sockcreate_sid = 0; if (tsec->exec_sid) { newsid = tsec->exec_sid; @@ -1711,13 +1574,10 @@ static inline void flush_unauthorized_files(struct files_struct * files) { struct avc_audit_data ad; struct file *file, *devnull = NULL; - struct tty_struct *tty; + struct tty_struct *tty = current->signal->tty; struct fdtable *fdt; long j = -1; - int drop_tty = 0; - mutex_lock(&tty_mutex); - tty = get_current_tty(); if (tty) { file_list_lock(); file = list_entry(tty->tty_files.next, typeof(*file), f_u.fu_list); @@ -1730,16 +1590,13 @@ static inline void flush_unauthorized_files(struct files_struct * files) struct inode *inode = file->f_dentry->d_inode; if (inode_has_perm(current, inode, FILE__READ | FILE__WRITE, NULL)) { - drop_tty = 1; + /* Reset controlling tty. */ + current->signal->tty = NULL; + current->signal->tty_old_pgrp = 0; } } file_list_unlock(); - - /* Reset controlling tty. */ - if (drop_tty) - proc_set_tty(current, NULL); } - mutex_unlock(&tty_mutex); /* Revalidate access to inherited open files. */ @@ -1939,8 +1796,7 @@ 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("rootcontext=", sizeof("rootcontext=")-1, option, len)); + match_prefix("defcontext=", sizeof("defcontext=")-1, option, len)); } static inline void take_option(char **to, char *from, int *first, int len) @@ -2013,13 +1869,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 dentry *dentry) +static int selinux_sb_statfs(struct super_block *sb) { struct avc_audit_data ad; AVC_AUDIT_DATA_INIT(&ad,FS); - ad.u.fs.dentry = dentry->d_sb->s_root; - return superblock_has_perm(current, dentry->d_sb, FILESYSTEM__GETATTR, &ad); + ad.u.fs.dentry = sb->s_root; + return superblock_has_perm(current, sb, FILESYSTEM__GETATTR, &ad); } static int selinux_mount(char * dev_name, @@ -2073,6 +1929,7 @@ static int selinux_inode_init_security(struct inode *inode, struct inode *dir, struct task_security_struct *tsec; struct inode_security_struct *dsec; struct superblock_security_struct *sbsec; + struct inode_security_struct *isec; u32 newsid, clen; int rc; char *namep = NULL, *context; @@ -2080,6 +1937,7 @@ static int selinux_inode_init_security(struct inode *inode, struct inode *dir, tsec = current->security; dsec = dir->i_security; sbsec = dir->i_sb->s_security; + isec = inode->i_security; if (tsec->create_sid && sbsec->behavior != SECURITY_FS_USE_MNTPOINT) { newsid = tsec->create_sid; @@ -2099,7 +1957,7 @@ static int selinux_inode_init_security(struct inode *inode, struct inode *dir, inode_security_set_sid(inode, newsid); - if (!ss_initialized || sbsec->behavior == SECURITY_FS_USE_MNTPOINT) + if (sbsec->behavior == SECURITY_FS_USE_MNTPOINT) return -EOPNOTSUPP; if (name) { @@ -2351,11 +2209,6 @@ static int selinux_inode_removexattr (struct dentry *dentry, char *name) return -EACCES; } -static const char *selinux_inode_xattr_getsuffix(void) -{ - return XATTR_SELINUX_SUFFIX; -} - /* * Copy the in-core inode security context value to the user. If the * getxattr() prior to this succeeded, check to see if we need to @@ -2363,14 +2216,47 @@ static const char *selinux_inode_xattr_getsuffix(void) * * Permission check is handled by selinux_inode_getxattr hook. */ -static int selinux_inode_getsecurity(const struct inode *inode, const char *name, void *buffer, size_t size, int err) +static int selinux_inode_getsecurity(struct inode *inode, const char *name, void *buffer, size_t size, int err) { struct inode_security_struct *isec = inode->i_security; + char *context; + unsigned len; + int rc; - if (strcmp(name, XATTR_SELINUX_SUFFIX)) - return -EOPNOTSUPP; + if (strcmp(name, XATTR_SELINUX_SUFFIX)) { + rc = -EOPNOTSUPP; + goto out; + } - return selinux_getsecurity(isec->sid, buffer, size); + rc = security_sid_to_context(isec->sid, &context, &len); + if (rc) + goto out; + + /* Probe for required buffer size */ + if (!buffer || !size) { + rc = len; + goto out_free; + } + + if (size < len) { + rc = -ERANGE; + goto out_free; + } + + if (err > 0) { + if ((len == err) && !(memcmp(context, buffer, len))) { + /* Don't need to canonicalize value */ + rc = err; + goto out_free; + } + memset(buffer, 0, size); + } + memcpy(buffer, context, len); + rc = len; +out_free: + kfree(context); +out: + return rc; } static int selinux_inode_setsecurity(struct inode *inode, const char *name, @@ -2479,6 +2365,7 @@ static int selinux_file_ioctl(struct file *file, unsigned int cmd, static int file_map_prot_check(struct file *file, unsigned long prot, int shared) { +#ifndef CONFIG_PPC32 if ((prot & PROT_EXEC) && (!file || (!shared && (prot & PROT_WRITE)))) { /* * We are making executable an anonymous mapping or a @@ -2489,6 +2376,7 @@ static int file_map_prot_check(struct file *file, unsigned long prot, int shared if (rc) return rc; } +#endif if (file) { /* read access is always possible with a mapping */ @@ -2535,6 +2423,7 @@ static int selinux_file_mprotect(struct vm_area_struct *vma, if (selinux_checkreqprot) prot = reqprot; +#ifndef CONFIG_PPC32 if ((prot & PROT_EXEC) && !(vma->vm_flags & VM_EXEC)) { rc = 0; if (vma->vm_start >= vma->vm_mm->start_brk && @@ -2559,6 +2448,7 @@ static int selinux_file_mprotect(struct vm_area_struct *vma, if (rc) return rc; } +#endif return file_map_prot_check(vma->vm_file, prot, vma->vm_flags&VM_SHARED); } @@ -2680,11 +2570,9 @@ static int selinux_task_alloc_security(struct task_struct *tsk) tsec2->osid = tsec1->osid; tsec2->sid = tsec1->sid; - /* Retain the exec, fs, key, and sock SIDs across fork */ + /* Retain the exec and create SIDs across fork */ tsec2->exec_sid = tsec1->exec_sid; tsec2->create_sid = tsec1->create_sid; - tsec2->keycreate_sid = tsec1->keycreate_sid; - tsec2->sockcreate_sid = tsec1->sockcreate_sid; /* Retain ptracer SID across fork, if any. This will be reset by the ptrace hook upon any @@ -2736,11 +2624,6 @@ 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. */ @@ -2758,16 +2641,6 @@ 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; @@ -2797,19 +2670,12 @@ static int selinux_task_getscheduler(struct task_struct *p) return task_has_perm(current, p, PROCESS__GETSCHED); } -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) +static int selinux_task_kill(struct task_struct *p, struct siginfo *info, int sig) { u32 perm; int rc; - struct task_security_struct *tsec; - rc = secondary_ops->task_kill(p, info, sig, secid); + rc = secondary_ops->task_kill(p, info, sig); if (rc) return rc; @@ -2820,12 +2686,8 @@ static int selinux_task_kill(struct task_struct *p, struct siginfo *info, perm = PROCESS__SIGNULL; /* null signal; existence test */ else perm = signal_to_av(sig); - 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; + + return task_has_perm(current, p, perm); } static int selinux_task_prctl(int option, @@ -3050,14 +2912,12 @@ 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; - newsid = tsec->sockcreate_sid ? : tsec->sid; - err = avc_has_perm(tsec->sid, newsid, + err = avc_has_perm(tsec->sid, tsec->sid, socket_type_to_security_class(family, type, protocol), SOCKET__CREATE, NULL); @@ -3070,14 +2930,12 @@ 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 : newsid; + isec->sid = kern ? SECINITSID_KERNEL : tsec->sid; isec->initialized = 1; return; @@ -3355,17 +3213,47 @@ static int selinux_socket_unix_may_send(struct socket *sock, return 0; } -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) +static int selinux_socket_sock_rcv_skb(struct sock *sk, struct sk_buff *skb) { - int err = 0; + u16 family; + char *addrp; + int len, 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 == 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; - if (!skb->dev) + dev = skb->dev; + if (!dev) goto out; - err = sel_netif_sids(skb->dev, &if_sid, NULL); + err = sel_netif_sids(dev, &if_sid, NULL); if (err) goto out; @@ -3388,124 +3276,66 @@ static int selinux_sock_rcv_skb_compat(struct sock *sk, struct sk_buff *skb, break; } - err = avc_has_perm(sock_sid, if_sid, SECCLASS_NETIF, netif_perm, ad); + 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); 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); } -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; + if (!err) + err = selinux_xfrm_sock_rcv_skb(sock_sid, skb); - /* 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; } -static int selinux_socket_getpeersec_stream(struct socket *sock, char __user *optval, - int __user *optlen, unsigned len) +static int selinux_socket_getpeersec(struct socket *sock, char __user *optval, + int __user *optlen, unsigned len) { int err = 0; char *scontext; u32 scontext_len; struct sk_security_struct *ssec; struct inode_security_struct *isec; - u32 peer_sid = 0; isec = SOCK_INODE(sock)->i_security; - - /* if UNIX_STREAM check peer_sid, if TCP check dst for labelled sa */ - if (isec->sclass == SECCLASS_UNIX_STREAM_SOCKET) { - ssec = sock->sk->sk_security; - peer_sid = ssec->peer_sid; - } - else if (isec->sclass == SECCLASS_TCP_SOCKET) { - peer_sid = selinux_socket_getpeer_stream(sock->sk); - - if (peer_sid == SECSID_NULL) { - err = -ENOPROTOOPT; - goto out; - } - } - else { + if (isec->sclass != SECCLASS_UNIX_STREAM_SOCKET) { err = -ENOPROTOOPT; goto out; } - err = security_sid_to_context(peer_sid, &scontext, &scontext_len); - + ssec = sock->sk->sk_security; + + err = security_sid_to_context(ssec->peer_sid, &scontext, &scontext_len); if (err) goto out; @@ -3526,23 +3356,6 @@ out: return err; } -static int selinux_socket_getpeersec_dgram(struct socket *sock, struct sk_buff *skb, u32 *secid) -{ - u32 peer_secid = SECSID_NULL; - int err = 0; - - 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); - - if (peer_secid == SECSID_NULL) - err = -EINVAL; - *secid = peer_secid; - - return err; -} - static int selinux_sk_alloc_security(struct sock *sk, int family, gfp_t priority) { return sk_alloc_security(sk, family, priority); @@ -3609,18 +3422,42 @@ out: #ifdef CONFIG_NETFILTER -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) +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) { - int err; + char *addrp; + int len, err = NF_ACCEPT; 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; @@ -3640,88 +3477,55 @@ static int selinux_ip_postroute_last_compat(struct sock *sk, struct net_device * break; } - err = avc_has_perm(isec->sid, if_sid, SECCLASS_NETIF, netif_perm, ad); - if (err) + + 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) goto out; - err = security_node_sid(family, addrp, len, &node_sid); - if (err) + /* Fixme: this lookup is inefficient */ + err = security_node_sid(family, addrp, len, + &node_sid) ? NF_DROP : NF_ACCEPT; + if (err != NF_ACCEPT) goto out; - err = avc_has_perm(isec->sid, node_sid, SECCLASS_NODE, node_perm, ad); - if (err) + err = avc_has_perm(isec->sid, node_sid, SECCLASS_NODE, + node_perm, &ad) ? NF_DROP : NF_ACCEPT; + if (err != NF_ACCEPT) 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); - if (err) + ntohs(ad.u.net.dport), + &port_sid) ? NF_DROP : NF_ACCEPT; + if (err != NF_ACCEPT) goto out; err = avc_has_perm(isec->sid, port_sid, isec->sclass, - send_perm, ad); + send_perm, &ad) ? NF_DROP : NF_ACCEPT; } -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; - - sk = skb->sk; - if (!sk) - goto out; - 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) + if (err != NF_ACCEPT) goto out; err = selinux_xfrm_postroute_last(isec->sid, skb); + out: - return err ? NF_DROP : NF_ACCEPT; + return err; } static unsigned int selinux_ipv4_postroute_last(unsigned int hooknum, @@ -3750,32 +3554,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, int capability) +static int selinux_netlink_recv(struct sk_buff *skb) { - 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); + if (!cap_raised(NETLINK_CB(skb).eff_cap, CAP_NET_ADMIN)) + return -EPERM; + return 0; } static int ipc_alloc_security(struct task_struct *task, @@ -4259,7 +4063,8 @@ static int selinux_getprocattr(struct task_struct *p, char *name, void *value, size_t size) { struct task_security_struct *tsec; - u32 sid; + u32 sid, len; + char *context; int error; if (current != p) { @@ -4268,6 +4073,9 @@ static int selinux_getprocattr(struct task_struct *p, return error; } + if (!size) + return -ERANGE; + tsec = p->security; if (!strcmp(name, "current")) @@ -4278,17 +4086,22 @@ 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; if (!sid) return 0; - return selinux_getsecurity(sid, value, size); + error = security_sid_to_context(sid, &context, &len); + if (error) + return error; + if (len > size) { + kfree(context); + return -ERANGE; + } + memcpy(value, context, len); + kfree(context); + return len; } static int selinux_setprocattr(struct task_struct *p, @@ -4314,10 +4127,6 @@ 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 @@ -4347,13 +4156,6 @@ 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; @@ -4405,72 +4207,6 @@ 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, @@ -4523,7 +4259,6 @@ static struct security_operations selinux_ops = { .inode_getxattr = selinux_inode_getxattr, .inode_listxattr = selinux_inode_listxattr, .inode_removexattr = selinux_inode_removexattr, - .inode_xattr_getsuffix = selinux_inode_xattr_getsuffix, .inode_getsecurity = selinux_inode_getsecurity, .inode_setsecurity = selinux_inode_setsecurity, .inode_listsecurity = selinux_inode_listsecurity, @@ -4549,15 +4284,11 @@ 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, @@ -4596,9 +4327,6 @@ 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, @@ -4616,8 +4344,7 @@ static struct security_operations selinux_ops = { .socket_setsockopt = selinux_socket_setsockopt, .socket_shutdown = selinux_socket_shutdown, .socket_sock_rcv_skb = selinux_socket_sock_rcv_skb, - .socket_getpeersec_stream = selinux_socket_getpeersec_stream, - .socket_getpeersec_dgram = selinux_socket_getpeersec_dgram, + .socket_getpeersec = selinux_socket_getpeersec, .sk_alloc_security = selinux_sk_alloc_security, .sk_free_security = selinux_sk_free_security, .sk_getsid = selinux_sk_getsid_security, @@ -4626,18 +4353,10 @@ 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) @@ -4657,9 +4376,6 @@ static __init int selinux_init(void) tsec = current->security; tsec->osid = tsec->sid = SECINITSID_KERNEL; - sel_inode_cache = kmem_cache_create("selinux_inode_security", - sizeof(struct inode_security_struct), - 0, SLAB_PANIC, NULL, NULL); avc_init(); original_ops = secondary_ops = security_ops; @@ -4673,15 +4389,6 @@ 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; } @@ -4691,7 +4398,6 @@ void selinux_complete_init(void) /* Set up any superblocks initialized prior to the policy load. */ printk(KERN_INFO "SELinux: Setting up existing superblocks.\n"); - spin_lock(&sb_lock); spin_lock(&sb_security_lock); next_sb: if (!list_empty(&superblock_security_head)) { @@ -4700,20 +4406,19 @@ next_sb: struct superblock_security_struct, list); struct super_block *sb = sbsec->sb; + spin_lock(&sb_lock); sb->s_count++; - spin_unlock(&sb_security_lock); spin_unlock(&sb_lock); + spin_unlock(&sb_security_lock); down_read(&sb->s_umount); if (sb->s_root) superblock_doinit(sb, NULL); drop_super(sb); - spin_lock(&sb_lock); spin_lock(&sb_security_lock); list_del_init(&sbsec->list); goto next_sb; } spin_unlock(&sb_security_lock); - spin_unlock(&sb_lock); } /* SELinux requires early initialization in order to label @@ -4808,7 +4513,6 @@ int selinux_disable(void) printk(KERN_INFO "SELinux: Disabled at runtime.\n"); selinux_disabled = 1; - selinux_enabled = 0; /* Reset security_ops to the secondary module, dummy or capability. */ security_ops = secondary_ops; diff --git a/security/selinux/include/av_inherit.h b/security/selinux/include/av_inherit.h index a68fdd555..b0e6b1293 100644 --- a/security/selinux/include/av_inherit.h +++ b/security/selinux/include/av_inherit.h @@ -29,4 +29,3 @@ 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 7c9b58380..591e98d93 100644 --- a/security/selinux/include/av_perm_to_string.h +++ b/security/selinux/include/av_perm_to_string.h @@ -72,8 +72,6 @@ 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") @@ -241,13 +239,3 @@ 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 69fd4b482..d7f02edf3 100644 --- a/security/selinux/include/av_permissions.h +++ b/security/selinux/include/av_permissions.h @@ -467,8 +467,6 @@ #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 @@ -935,37 +933,3 @@ #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 24303b613..77b2c5996 100644 --- a/security/selinux/include/class_to_string.h +++ b/security/selinux/include/class_to_string.h @@ -58,6 +58,3 @@ 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 95887aed2..eb9f50823 100644 --- a/security/selinux/include/flask.h +++ b/security/selinux/include/flask.h @@ -60,9 +60,6 @@ #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 940178865..54c030778 100644 --- a/security/selinux/include/objsec.h +++ b/security/selinux/include/objsec.h @@ -32,8 +32,6 @@ struct task_security_struct { u32 sid; /* current SID */ u32 exec_sid; /* exec SID */ u32 create_sid; /* fscreate SID */ - u32 keycreate_sid; /* keycreate SID */ - u32 sockcreate_sid; /* fscreate SID */ u32 ptrace_sid; /* SID of ptrace parent */ }; @@ -57,9 +55,8 @@ 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 superblock */ + u32 sid; /* SID of file system */ 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 */ @@ -102,11 +99,6 @@ 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 c28b7934a..5f016c980 100644 --- a/security/selinux/include/security.h +++ b/security/selinux/include/security.h @@ -24,17 +24,17 @@ #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 -#ifdef CONFIG_SECURITY_SELINUX_POLICYDB_VERSION_MAX -#define POLICYDB_VERSION_MAX CONFIG_SECURITY_SELINUX_POLICYDB_VERSION_MAX_VALUE +#define POLICYDB_VERSION_MAX POLICYDB_VERSION_AVTAB + +#ifdef CONFIG_SECURITY_SELINUX_BOOTPARAM +extern int selinux_enabled; #else -#define POLICYDB_VERSION_MAX POLICYDB_VERSION_RANGETRANS +#define selinux_enabled 1 #endif -extern int selinux_enabled; extern int selinux_mls_enabled; int security_load_policy(void * data, size_t len); diff --git a/security/selinux/include/xfrm.h b/security/selinux/include/xfrm.h index c96498a10..8e87996c6 100644 --- a/security/selinux/include/xfrm.h +++ b/security/selinux/include/xfrm.h @@ -9,10 +9,8 @@ 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); /* @@ -41,8 +39,6 @@ static inline u32 selinux_no_sk_sid(struct flowi *fl) #ifdef CONFIG_SECURITY_NETWORK_XFRM int selinux_xfrm_sock_rcv_skb(u32 sid, struct sk_buff *skb); int selinux_xfrm_postroute_last(u32 isec_sid, struct sk_buff *skb); -u32 selinux_socket_getpeer_stream(struct sock *sk); -u32 selinux_socket_getpeer_dgram(struct sk_buff *skb); #else static inline int selinux_xfrm_sock_rcv_skb(u32 isec_sid, struct sk_buff *skb) { @@ -51,17 +47,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 0; -} - -static inline int selinux_socket_getpeer_stream(struct sock *sk) -{ - return SECSID_NULL; -} - -static inline int selinux_socket_getpeer_dgram(struct sk_buff *skb) -{ - return SECSID_NULL; + return NF_ACCEPT; } #endif diff --git a/security/selinux/nlmsgtab.c b/security/selinux/nlmsgtab.c index b8f4d25cf..69b9329b2 100644 --- a/security/selinux/nlmsgtab.c +++ b/security/selinux/nlmsgtab.c @@ -88,15 +88,8 @@ 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[] = @@ -106,9 +99,6 @@ 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 }, }; @@ -155,10 +145,8 @@ int selinux_nlmsg_lookup(u16 sclass, u16 nlmsg_type, u32 *perm) break; case SECCLASS_NETLINK_AUDIT_SOCKET: - 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)) { + if (nlmsg_type >= AUDIT_FIRST_USER_MSG && + nlmsg_type <= AUDIT_LAST_USER_MSG) { *perm = NETLINK_AUDIT_SOCKET__NLMSG_RELAY; } else { err = nlmsg_perm(nlmsg_type, perm, nlmsg_audit_perms, diff --git a/security/selinux/selinuxfs.c b/security/selinux/selinuxfs.c index bab7b386c..b5fa02d17 100644 --- a/security/selinux/selinuxfs.c +++ b/security/selinux/selinuxfs.c @@ -9,19 +9,18 @@ * the Free Software Foundation, version 2. */ +#include #include #include #include #include #include -#include #include #include #include #include #include #include -#include #include #include @@ -37,14 +36,6 @@ 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; @@ -52,15 +43,8 @@ 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); +static DECLARE_MUTEX(sel_sem); /* global data for booleans */ static struct dentry *bool_dir = NULL; @@ -99,7 +83,6 @@ 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 @@ -143,10 +126,6 @@ static ssize_t sel_write_enforce(struct file * file, const char __user * buf, length = task_has_security(current, SECURITY__SETENFORCE); if (length) goto out; - audit_log(current->audit_context, GFP_KERNEL, AUDIT_MAC_STATUS, - "enforcing=%d old_enforcing=%d auid=%u", new_value, - selinux_enforcing, - audit_get_loginuid(current->audit_context)); selinux_enforcing = new_value; if (selinux_enforcing) avc_ss_reset(0); @@ -197,9 +176,6 @@ static ssize_t sel_write_disable(struct file * file, const char __user * buf, length = selinux_disable(); if (length < 0) goto out; - audit_log(current->audit_context, GFP_KERNEL, AUDIT_MAC_STATUS, - "selinux=0 auid=%u", - audit_get_loginuid(current->audit_context)); } length = count; @@ -254,7 +230,7 @@ static ssize_t sel_write_load(struct file * file, const char __user * buf, ssize_t length; void *data = NULL; - mutex_lock(&sel_mutex); + down(&sel_sem); length = task_has_security(current, SECURITY__LOAD_POLICY); if (length) @@ -285,11 +261,8 @@ static ssize_t sel_write_load(struct file * file, const char __user * buf, length = ret; else length = count; - audit_log(current->audit_context, GFP_KERNEL, AUDIT_MAC_POLICY_LOAD, - "policy loaded auid=%u", - audit_get_loginuid(current->audit_context)); out: - mutex_unlock(&sel_mutex); + up(&sel_sem); vfree(data); return length; } @@ -379,55 +352,6 @@ 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 */ @@ -771,6 +695,7 @@ 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; } @@ -784,11 +709,12 @@ static ssize_t sel_read_bool(struct file *filep, char __user *buf, { char *page = NULL; ssize_t length; + ssize_t end; ssize_t ret; int cur_enforcing; struct inode *inode; - mutex_lock(&sel_mutex); + down(&sel_sem); ret = -EFAULT; @@ -814,9 +740,26 @@ static ssize_t sel_read_bool(struct file *filep, char __user *buf, length = scnprintf(page, PAGE_SIZE, "%d %d", cur_enforcing, bool_pending_values[inode->i_ino - BOOL_INO_OFFSET]); - ret = simple_read_from_buffer(buf, count, ppos, page, length); + if (length < 0) { + ret = length; + goto out; + } + + if (*ppos >= length) { + ret = 0; + goto out; + } + if (count + *ppos > length) + count = length - *ppos; + end = count + *ppos; + if (copy_to_user(buf, (char *) page + *ppos, count)) { + ret = -EFAULT; + goto out; + } + *ppos = end; + ret = count; out: - mutex_unlock(&sel_mutex); + up(&sel_sem); if (page) free_page((unsigned long)page); return ret; @@ -830,7 +773,7 @@ static ssize_t sel_write_bool(struct file *filep, const char __user *buf, int new_value; struct inode *inode; - mutex_lock(&sel_mutex); + down(&sel_sem); length = task_has_security(current, SECURITY__SETBOOL); if (length) @@ -869,7 +812,7 @@ static ssize_t sel_write_bool(struct file *filep, const char __user *buf, length = count; out: - mutex_unlock(&sel_mutex); + up(&sel_sem); if (page) free_page((unsigned long) page); return length; @@ -888,7 +831,7 @@ static ssize_t sel_commit_bools_write(struct file *filep, ssize_t length = -EFAULT; int new_value; - mutex_lock(&sel_mutex); + down(&sel_sem); length = task_has_security(current, SECURITY__SETBOOL); if (length) @@ -926,7 +869,7 @@ static ssize_t sel_commit_bools_write(struct file *filep, length = count; out: - mutex_unlock(&sel_mutex); + up(&sel_sem); if (page) free_page((unsigned long) page); return length; @@ -1044,7 +987,7 @@ out: return ret; err: kfree(values); - sel_remove_bools(dir); + d_genocide(dir); ret = -ENOMEM; goto out; } @@ -1225,38 +1168,37 @@ static int sel_make_avc_files(struct dentry *dir) dentry = d_alloc_name(dir, files[i].name); if (!dentry) { ret = -ENOMEM; - goto out; + goto err; } inode = sel_make_inode(dir->d_sb, S_IFREG|files[i].mode); if (!inode) { ret = -ENOMEM; - goto out; + goto err; } inode->i_fop = files[i].ops; d_add(dentry, inode); } out: return ret; +err: + d_genocide(dir); + goto out; } -static int sel_make_dir(struct inode *dir, struct dentry *dentry) +static int sel_make_dir(struct super_block *sb, struct dentry *dentry) { int ret = 0; struct inode *inode; - inode = sel_make_inode(dir->i_sb, S_IFDIR | S_IRUGO | S_IXUGO); + inode = sel_make_inode(sb, S_IFDIR | S_IRUGO | S_IXUGO); if (!inode) { ret = -ENOMEM; goto out; } inode->i_op = &simple_dir_inode_operations; inode->i_fop = &simple_dir_operations; - /* directory inodes start off with i_nlink == 2 (for "." entry) */ - inode->i_nlink++; d_add(dentry, inode); - /* bump link count on parent directory, too */ - dir->i_nlink++; out: return ret; } @@ -1265,7 +1207,7 @@ static int sel_fill_super(struct super_block * sb, void * data, int silent) { int ret; struct dentry *dentry; - struct inode *inode, *root_inode; + struct inode *inode; struct inode_security_struct *isec; static struct tree_descr selinux_files[] = { @@ -1282,38 +1224,34 @@ 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); if (ret) - goto err; - - root_inode = sb->s_root->d_inode; + return ret; dentry = d_alloc_name(sb->s_root, BOOL_DIR_NAME); - if (!dentry) { - ret = -ENOMEM; - goto err; - } - - ret = sel_make_dir(root_inode, dentry); - if (ret) - goto err; + if (!dentry) + return -ENOMEM; + inode = sel_make_inode(sb, S_IFDIR | S_IRUGO | S_IXUGO); + if (!inode) + goto out; + inode->i_op = &simple_dir_inode_operations; + inode->i_fop = &simple_dir_operations; + d_add(dentry, inode); bool_dir = dentry; + ret = sel_make_bools(); + if (ret) + goto out; dentry = d_alloc_name(sb->s_root, NULL_FILE_NAME); - if (!dentry) { - ret = -ENOMEM; - goto err; - } + if (!dentry) + return -ENOMEM; inode = sel_make_inode(sb, S_IFCHR | S_IRUGO | S_IWUGO); - if (!inode) { - ret = -ENOMEM; - goto err; - } + if (!inode) + goto out; isec = (struct inode_security_struct*)inode->i_security; isec->sid = SECINITSID_DEVNULL; isec->sclass = SECCLASS_CHR_FILE; @@ -1324,30 +1262,28 @@ static int sel_fill_super(struct super_block * sb, void * data, int silent) selinux_null = dentry; dentry = d_alloc_name(sb->s_root, "avc"); - if (!dentry) { - ret = -ENOMEM; - goto err; - } + if (!dentry) + return -ENOMEM; - ret = sel_make_dir(root_inode, dentry); + ret = sel_make_dir(sb, dentry); if (ret) - goto err; + goto out; ret = sel_make_avc_files(dentry); if (ret) - goto err; + goto out; + + return 0; out: - return ret; -err: + dput(dentry); printk(KERN_ERR "%s: failed while creating inodes\n", __FUNCTION__); - goto out; + return -ENOMEM; } -static int sel_get_sb(struct file_system_type *fs_type, - int flags, const char *dev_name, void *data, - struct vfsmount *mnt) +static struct super_block *sel_get_sb(struct file_system_type *fs_type, + int flags, const char *dev_name, void *data) { - return get_sb_single(fs_type, flags, data, sel_fill_super, mnt); + return get_sb_single(fs_type, flags, data, sel_fill_super); } static struct file_system_type sel_fs_type = { diff --git a/security/selinux/ss/mls.c b/security/selinux/ss/mls.c index df2540cc3..84047f69f 100644 --- a/security/selinux/ss/mls.c +++ b/security/selinux/ss/mls.c @@ -8,7 +8,7 @@ * * Support for enhanced MLS infrastructure. * - * Copyright (C) 2004-2006 Trusted Computer Solutions, Inc. + * Copyright (C) 2004-2005 Trusted Computer Solutions, Inc. */ #include @@ -384,34 +384,6 @@ out: return rc; } -/* - * Set the MLS fields in the security context structure - * `context' based on the string representation in - * the string `str'. This function will allocate temporary memory with the - * given constraints of gfp_mask. - */ -int mls_from_string(char *str, struct context *context, gfp_t gfp_mask) -{ - char *tmpstr, *freestr; - int rc; - - if (!selinux_mls_enabled) - return -EINVAL; - - /* we need freestr because mls_context_to_sid will change - the value of tmpstr */ - tmpstr = freestr = kstrdup(str, gfp_mask); - if (!tmpstr) { - rc = -ENOMEM; - } else { - rc = mls_context_to_sid(':', &tmpstr, context, - NULL, SECSID_NULL); - kfree(freestr); - } - - return rc; -} - /* * Copies the effective MLS range from `src' into `dst'. */ @@ -543,21 +515,22 @@ 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: - /* 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); + 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); + } } } /* Fallthrough */ diff --git a/security/selinux/ss/mls.h b/security/selinux/ss/mls.h index fbb42f07d..03de697c8 100644 --- a/security/selinux/ss/mls.h +++ b/security/selinux/ss/mls.h @@ -8,7 +8,7 @@ * * Support for enhanced MLS infrastructure. * - * Copyright (C) 2004-2006 Trusted Computer Solutions, Inc. + * Copyright (C) 2004-2005 Trusted Computer Solutions, Inc. */ #ifndef _SS_MLS_H_ @@ -27,8 +27,6 @@ int mls_context_to_sid(char oldc, struct sidtab *s, u32 def_sid); -int mls_from_string(char *str, struct context *context, gfp_t gfp_mask); - int mls_convert_context(struct policydb *oldp, struct policydb *newp, struct context *context); diff --git a/security/selinux/ss/policydb.c b/security/selinux/ss/policydb.c index b18895302..0111990ba 100644 --- a/security/selinux/ss/policydb.c +++ b/security/selinux/ss/policydb.c @@ -96,11 +96,6 @@ 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) @@ -649,18 +644,10 @@ void policydb_destroy(struct policydb *p) kfree(lra); for (rt = p->range_tr; rt; rt = rt -> next) { - if (lrt) { - ebitmap_destroy(&lrt->target_range.level[0].cat); - ebitmap_destroy(&lrt->target_range.level[1].cat); - kfree(lrt); - } - lrt = rt; - } - 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 (p->type_attr_map) { for (i = 0; i < p->p_types.nprim; i++) @@ -1834,7 +1821,6 @@ 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; @@ -1853,16 +1839,9 @@ int policydb_read(struct policydb *p, void *fp) rc = next_entry(buf, fp, (sizeof(u32) * 2)); if (rc < 0) goto bad; - 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); + rt->dom = le32_to_cpu(buf[0]); + rt->type = le32_to_cpu(buf[1]); + rc = mls_read_range_helper(&rt->range, fp); if (rc) goto bad; lrt = rt; diff --git a/security/selinux/ss/policydb.h b/security/selinux/ss/policydb.h index 8319d5ff5..b1340711f 100644 --- a/security/selinux/ss/policydb.h +++ b/security/selinux/ss/policydb.h @@ -106,10 +106,9 @@ struct cat_datum { }; struct range_trans { - u32 source_type; - u32 target_type; - u32 target_class; - struct mls_range target_range; + u32 dom; /* current process domain */ + u32 type; /* program executable type */ + struct mls_range range; /* new range */ struct range_trans *next; }; diff --git a/security/selinux/ss/services.c b/security/selinux/ss/services.c index 85e429884..6375dd578 100644 --- a/security/selinux/ss/services.c +++ b/security/selinux/ss/services.c @@ -7,13 +7,12 @@ * Updated: Trusted Computer Solutions, Inc. * * Support for enhanced MLS infrastructure. - * Support for context based audit filters. * * Updated: Frank Mayer and Karl MacMillan * * Added conditional policy language extensions * - * Copyright (C) 2004-2006 Trusted Computer Solutions, Inc. + * Copyright (C) 2004-2005 Trusted Computer Solutions, Inc. * Copyright (C) 2003 - 2004 Tresys Technology, LLC * Copyright (C) 2003 Red Hat, Inc., James Morris * This program is free software; you can redistribute it and/or modify @@ -28,8 +27,7 @@ #include #include #include -#include - +#include #include "flask.h" #include "avc.h" #include "avc_ss.h" @@ -50,9 +48,9 @@ static DEFINE_RWLOCK(policy_rwlock); #define POLICY_RDUNLOCK read_unlock(&policy_rwlock) #define POLICY_WRUNLOCK write_unlock_irq(&policy_rwlock) -static DEFINE_MUTEX(load_mutex); -#define LOAD_LOCK mutex_lock(&load_mutex) -#define LOAD_UNLOCK mutex_unlock(&load_mutex) +static DECLARE_MUTEX(load_sem); +#define LOAD_LOCK down(&load_sem) +#define LOAD_UNLOCK up(&load_sem) static struct sidtab sidtab; struct policydb policydb; @@ -833,8 +831,6 @@ static int security_compute_sid(u32 ssid, goto out; } - context_init(&newcontext); - POLICY_RDLOCK; scontext = sidtab_search(&sidtab, ssid); @@ -852,6 +848,8 @@ static int security_compute_sid(u32 ssid, goto out_unlock; } + context_init(&newcontext); + /* Set the user identity. */ switch (specified) { case AVTAB_TRANSITION: @@ -1764,22 +1762,19 @@ int security_set_bools(int len, int *values) goto out; } + printk(KERN_INFO "security: committed booleans { "); for (i = 0; i < len; i++) { - if (!!values[i] != policydb.bool_val_to_struct[i]->state) { - audit_log(current->audit_context, GFP_ATOMIC, - AUDIT_MAC_CONFIG_CHANGE, - "bool=%s val=%d old_val=%d auid=%u", - policydb.p_bool_val_to_name[i], - !!values[i], - policydb.bool_val_to_struct[i]->state, - audit_get_loginuid(current->audit_context)); - } if (values[i]) { policydb.bool_val_to_struct[i]->state = 1; } else { policydb.bool_val_to_struct[i]->state = 0; } + if (i != 0) + printk(", "); + printk("%s:%d", policydb.p_bool_val_to_name[i], + policydb.bool_val_to_struct[i]->state); } + printk(" }\n"); for (cur = policydb.cond_list; cur != NULL; cur = cur->next) { rc = evaluate_cond_node(&policydb, cur); @@ -1816,251 +1811,3 @@ out: POLICY_RDUNLOCK; return rc; } - -struct selinux_audit_rule { - u32 au_seqno; - struct context au_ctxt; -}; - -void selinux_audit_rule_free(struct selinux_audit_rule *rule) -{ - if (rule) { - context_destroy(&rule->au_ctxt); - kfree(rule); - } -} - -int selinux_audit_rule_init(u32 field, u32 op, char *rulestr, - struct selinux_audit_rule **rule) -{ - struct selinux_audit_rule *tmprule; - struct role_datum *roledatum; - struct type_datum *typedatum; - struct user_datum *userdatum; - int rc = 0; - - *rule = NULL; - - if (!ss_initialized) - return -ENOTSUPP; - - switch (field) { - 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_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; - break; - default: - /* only the above fields are valid */ - return -EINVAL; - } - - tmprule = kzalloc(sizeof(struct selinux_audit_rule), GFP_KERNEL); - if (!tmprule) - return -ENOMEM; - - context_init(&tmprule->au_ctxt); - - POLICY_RDLOCK; - - tmprule->au_seqno = latest_granting; - - switch (field) { - 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_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_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_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; - } - - POLICY_RDUNLOCK; - - if (rc) { - selinux_audit_rule_free(tmprule); - tmprule = NULL; - } - - *rule = tmprule; - - return rc; -} - -int selinux_audit_rule_match(u32 ctxid, u32 field, u32 op, - struct selinux_audit_rule *rule, - struct audit_context *actx) -{ - struct context *ctxt; - struct mls_level *level; - int match = 0; - - if (!rule) { - audit_log(actx, GFP_ATOMIC, AUDIT_SELINUX_ERR, - "selinux_audit_rule_match: missing rule\n"); - return -ENOENT; - } - - POLICY_RDLOCK; - - if (rule->au_seqno < latest_granting) { - audit_log(actx, GFP_ATOMIC, AUDIT_SELINUX_ERR, - "selinux_audit_rule_match: stale rule\n"); - match = -ESTALE; - goto out; - } - - ctxt = sidtab_search(&sidtab, ctxid); - if (!ctxt) { - audit_log(actx, GFP_ATOMIC, AUDIT_SELINUX_ERR, - "selinux_audit_rule_match: unrecognized SID %d\n", - ctxid); - match = -ENOENT; - goto out; - } - - /* a field/op pair that is not caught here will simply fall through - without a match */ - switch (field) { - case AUDIT_SUBJ_USER: - case AUDIT_OBJ_USER: - switch (op) { - case AUDIT_EQUAL: - match = (ctxt->user == rule->au_ctxt.user); - break; - case AUDIT_NOT_EQUAL: - match = (ctxt->user != rule->au_ctxt.user); - break; - } - break; - case AUDIT_SUBJ_ROLE: - case AUDIT_OBJ_ROLE: - switch (op) { - case AUDIT_EQUAL: - match = (ctxt->role == rule->au_ctxt.role); - break; - case AUDIT_NOT_EQUAL: - match = (ctxt->role != rule->au_ctxt.role); - break; - } - break; - case AUDIT_SUBJ_TYPE: - case AUDIT_OBJ_TYPE: - switch (op) { - case AUDIT_EQUAL: - match = (ctxt->type == rule->au_ctxt.type); - break; - case AUDIT_NOT_EQUAL: - match = (ctxt->type != rule->au_ctxt.type); - break; - } - break; - 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: - match = mls_level_eq(&rule->au_ctxt.range.level[0], - level); - break; - case AUDIT_NOT_EQUAL: - match = !mls_level_eq(&rule->au_ctxt.range.level[0], - level); - break; - case AUDIT_LESS_THAN: - match = (mls_level_dom(&rule->au_ctxt.range.level[0], - level) && - !mls_level_eq(&rule->au_ctxt.range.level[0], - level)); - break; - case AUDIT_LESS_THAN_OR_EQUAL: - match = mls_level_dom(&rule->au_ctxt.range.level[0], - level); - break; - case AUDIT_GREATER_THAN: - match = (mls_level_dom(level, - &rule->au_ctxt.range.level[0]) && - !mls_level_eq(level, - &rule->au_ctxt.range.level[0])); - break; - case AUDIT_GREATER_THAN_OR_EQUAL: - match = mls_level_dom(level, - &rule->au_ctxt.range.level[0]); - break; - } - } - -out: - POLICY_RDUNLOCK; - return match; -} - -static int (*aurule_callback)(void) = NULL; - -static int aurule_avc_callback(u32 event, u32 ssid, u32 tsid, - u16 class, u32 perms, u32 *retained) -{ - int err = 0; - - if (event == AVC_CALLBACK_RESET && aurule_callback) - err = aurule_callback(); - return err; -} - -static int __init aurule_init(void) -{ - int err; - - err = avc_add_callback(aurule_avc_callback, AVC_CALLBACK_RESET, - SECSID_NULL, SECSID_NULL, SECCLASS_NULL, 0); - if (err) - panic("avc_add_callback() failed, error %d\n", err); - - return err; -} -__initcall(aurule_init); - -void selinux_audit_set_callback(int (*callback)(void)) -{ - aurule_callback = callback; -} diff --git a/security/selinux/xfrm.c b/security/selinux/xfrm.c index 6c985ced8..b2af7ca49 100644 --- a/security/selinux/xfrm.c +++ b/security/selinux/xfrm.c @@ -26,6 +26,7 @@ * 2. Emulating a reasonable SO_PEERSEC across machines * 3. Testing addition of sk_policy's with security context via setsockopt */ +#include #include #include #include @@ -131,7 +132,10 @@ 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 context? + * Does the subject have permission to set security or permission to + * do the relabel? + * Must be permitted to relabel from default socket type (process type) + * to specified context */ rc = avc_has_perm(tsec->sid, ctx->ctx_sid, SECCLASS_ASSOCIATION, @@ -196,23 +200,6 @@ 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. @@ -237,91 +224,6 @@ void selinux_xfrm_state_free(struct xfrm_state *x) kfree(ctx); } -/* - * SELinux internal function to retrieve the context of a connected - * (sk->sk_state == TCP_ESTABLISHED) TCP socket based on its security - * association used to connect to the remote socket. - * - * Retrieve via getsockopt SO_PEERSEC. - */ -u32 selinux_socket_getpeer_stream(struct sock *sk) -{ - struct dst_entry *dst, *dst_test; - u32 peer_sid = SECSID_NULL; - - if (sk->sk_state != TCP_ESTABLISHED) - goto out; - - dst = sk_dst_get(sk); - if (!dst) - goto out; - - for (dst_test = dst; dst_test != 0; - dst_test = dst_test->child) { - struct xfrm_state *x = dst_test->xfrm; - - if (x && selinux_authorizable_xfrm(x)) { - struct xfrm_sec_ctx *ctx = x->security; - peer_sid = ctx->ctx_sid; - break; - } - } - dst_release(dst); - -out: - return peer_sid; -} - -/* - * SELinux internal function to retrieve the context of a UDP packet - * based on its security association used to connect to the remote socket. - * - * Retrieve via setsockopt IP_PASSSEC and recvmsg with control message - * type SCM_SECURITY. - */ -u32 selinux_socket_getpeer_dgram(struct sk_buff *skb) -{ - struct sec_path *sp; - - if (skb == NULL) - return SECSID_NULL; - - if (skb->sk->sk_protocol != IPPROTO_UDP) - return SECSID_NULL; - - sp = skb->sp; - if (sp) { - int i; - - for (i = sp->len-1; i >= 0; i--) { - struct xfrm_state *x = sp->xvec[i]; - if (selinux_authorizable_xfrm(x)) { - struct xfrm_sec_ctx *ctx = x->security; - return ctx->ctx_sid; - } - } - } - - 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 @@ -344,7 +246,7 @@ int selinux_xfrm_sock_rcv_skb(u32 isec_sid, struct sk_buff *skb) * Only need to verify the existence of an authorizable sp. */ for (i = 0; i < sp->len; i++) { - struct xfrm_state *x = sp->xvec[i]; + struct xfrm_state *x = sp->x[i].xvec; if (x && selinux_authorizable_xfrm(x)) goto accept; @@ -386,12 +288,18 @@ 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 out; + goto accept; } } rc = avc_has_perm(isec_sid, SECINITSID_UNLABELED, SECCLASS_ASSOCIATION, ASSOCIATION__SENDTO, NULL); -out: - return rc; + if (rc) + goto drop; + +accept: + return NF_ACCEPT; + +drop: + return NF_DROP; } diff --git a/sound/Kconfig b/sound/Kconfig index e0d791a98..b65ee4701 100644 --- a/sound/Kconfig +++ b/sound/Kconfig @@ -58,8 +58,6 @@ 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 1f60797af..f352bb235 100644 --- a/sound/Makefile +++ b/sound/Makefile @@ -5,7 +5,6 @@ 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 8435fdd1c..149feb410 100644 --- a/sound/arm/aaci.c +++ b/sound/arm/aaci.c @@ -73,7 +73,7 @@ static void aaci_ac97_write(struct snd_ac97 *ac97, unsigned short reg, unsigned if (ac97->num >= 4) return; - mutex_lock(&aaci->ac97_sem); + down(&aaci->ac97_sem); aaci_ac97_select_codec(aaci, ac97); @@ -91,7 +91,7 @@ static void aaci_ac97_write(struct snd_ac97 *ac97, unsigned short reg, unsigned v = readl(aaci->base + AACI_SLFR); } while (v & (SLFR_1TXB|SLFR_2TXB)); - mutex_unlock(&aaci->ac97_sem); + up(&aaci->ac97_sem); } /* @@ -105,7 +105,7 @@ static unsigned short aaci_ac97_read(struct snd_ac97 *ac97, unsigned short reg) if (ac97->num >= 4) return ~0; - mutex_lock(&aaci->ac97_sem); + down(&aaci->ac97_sem); aaci_ac97_select_codec(aaci, ac97); @@ -145,7 +145,7 @@ static unsigned short aaci_ac97_read(struct snd_ac97 *ac97, unsigned short reg) v = ~0; } - mutex_unlock(&aaci->ac97_sem); + up(&aaci->ac97_sem); return v; } @@ -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, IRQF_SHARED|IRQF_DISABLED, + ret = request_irq(aaci->dev->irq[0], aaci_irq, SA_SHIRQ|SA_INTERRUPT, DRIVER_NAME, aaci); if (ret) goto out; @@ -779,12 +779,11 @@ 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%016llx, irq %d", - card->shortname, (unsigned long long)dev->res.start, - dev->irq[0]); + "%s at 0x%08lx, irq %d", + card->shortname, dev->res.start, dev->irq[0]); aaci = card->private_data; - mutex_init(&aaci->ac97_sem); + init_MUTEX(&aaci->ac97_sem); spin_lock_init(&aaci->lock); aaci->card = card; aaci->dev = dev; diff --git a/sound/arm/aaci.h b/sound/arm/aaci.h index 062951906..83f73c250 100644 --- a/sound/arm/aaci.h +++ b/sound/arm/aaci.h @@ -227,7 +227,7 @@ struct aaci { unsigned int fifosize; /* AC'97 */ - struct mutex ac97_sem; + struct semaphore ac97_sem; ac97_bus_t *ac97_bus; u32 maincr; diff --git a/sound/arm/pxa2xx-ac97.c b/sound/arm/pxa2xx-ac97.c index 599aff829..3acbc6023 100644 --- a/sound/arm/pxa2xx-ac97.c +++ b/sound/arm/pxa2xx-ac97.c @@ -25,7 +25,7 @@ #include #include -#include +#include #include #include #include @@ -33,7 +33,7 @@ #include "pxa2xx-pcm.h" -static DEFINE_MUTEX(car_mutex); +static DECLARE_MUTEX(car_mutex); static DECLARE_WAIT_QUEUE_HEAD(gsr_wq); static volatile long gsr_bits; @@ -52,7 +52,7 @@ static unsigned short pxa2xx_ac97_read(struct snd_ac97 *ac97, unsigned short reg unsigned short val = -1; volatile u32 *reg_addr; - mutex_lock(&car_mutex); + down(&car_mutex); /* set up primary or secondary codec space */ reg_addr = (ac97->num & 1) ? &SAC_REG_BASE : &PAC_REG_BASE; @@ -79,7 +79,7 @@ static unsigned short pxa2xx_ac97_read(struct snd_ac97 *ac97, unsigned short reg /* but we've just started another cycle... */ wait_event_timeout(gsr_wq, (GSR | gsr_bits) & GSR_SDONE, 1); -out: mutex_unlock(&car_mutex); +out: up(&car_mutex); return val; } @@ -87,7 +87,7 @@ static void pxa2xx_ac97_write(struct snd_ac97 *ac97, unsigned short reg, unsigne { volatile u32 *reg_addr; - mutex_lock(&car_mutex); + down(&car_mutex); /* set up primary or secondary codec space */ reg_addr = (ac97->num & 1) ? &SAC_REG_BASE : &PAC_REG_BASE; @@ -101,7 +101,7 @@ static void pxa2xx_ac97_write(struct snd_ac97 *ac97, unsigned short reg, unsigne printk(KERN_ERR "%s: write error (ac97_reg=%d GSR=%#lx)\n", __FUNCTION__, reg, GSR | gsr_bits); - mutex_unlock(&car_mutex); + up(&car_mutex); } static void pxa2xx_ac97_reset(struct snd_ac97 *ac97) diff --git a/sound/arm/sa11xx-uda1341.c b/sound/arm/sa11xx-uda1341.c index c79a9afd0..13057d92f 100644 --- a/sound/arm/sa11xx-uda1341.c +++ b/sound/arm/sa11xx-uda1341.c @@ -59,6 +59,7 @@ * ***************************************************************************************************/ +#include #include #include #include @@ -111,7 +112,7 @@ MODULE_LICENSE("GPL"); MODULE_DESCRIPTION("SA1100/SA1111 + UDA1341TS driver for ALSA"); MODULE_SUPPORTED_DEVICE("{{UDA1341,iPAQ H3600 UDA1341TS}}"); -static char *id; /* ID for this card */ +static char *id = NULL; /* ID for this card */ module_param(id, charp, 0444); MODULE_PARM_DESC(id, "ID string for SA1100/SA1111 + UDA1341TS soundcard."); @@ -983,15 +984,11 @@ 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)) { - 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; + if (IS_ERR(device)) { + platform_driver_unregister(&sa11xx_uda1341_driver); + return PTR_ERR(device); + } + return 0; } static void __exit sa11xx_uda1341_exit(void) diff --git a/sound/core/Kconfig b/sound/core/Kconfig index b2927523d..f79755f77 100644 --- a/sound/core/Kconfig +++ b/sound/core/Kconfig @@ -73,15 +73,6 @@ config SND_PCM_OSS To compile this driver as a module, choose M here: the module will be called snd-pcm-oss. -config SND_PCM_OSS_PLUGINS - bool "OSS PCM (digital audio) API - Include plugin system" - depends on SND_PCM_OSS - default y - help - If you disable this option, the ALSA's OSS PCM API will not - support conversion of channels, formats and rates. It will - behave like most of new OSS/Free drivers in 2.4/2.6 kernels. - config SND_SEQUENCER_OSS bool "OSS Sequencer API" depends on SND && SND_SEQUENCER @@ -92,9 +83,8 @@ config SND_SEQUENCER_OSS Many programs still use the OSS API, so say Y. - If you choose M in "Sequencer support" (SND_SEQUENCER), - this will be compiled as a module. The module will be called - snd-seq-oss. + To compile this driver as a module, choose M here: the module + will be called snd-seq-oss. config SND_RTCTIMER tristate "RTC Timer support" @@ -122,8 +112,8 @@ config SND_SEQ_RTCTIMER_DEFAULT If in doubt, say Y. config SND_DYNAMIC_MINORS - bool "Dynamic device file minor numbers" - depends on SND + bool "Dynamic device file minor numbers (EXPERIMENTAL)" + depends on SND && EXPERIMENTAL help If you say Y here, the minor numbers of ALSA device files in /dev/snd/ are allocated dynamically. This allows you to have @@ -140,15 +130,6 @@ config SND_SUPPORT_OLD_API Say Y here to support the obsolete ALSA PCM API (ver.0.9.0 rc3 or older). -config SND_VERBOSE_PROCFS - bool "Verbose procfs contents" - depends on SND && PROC_FS - default y - help - Say Y here to include code for verbose procfs contents (provides - usefull information to developers when a problem occurs). On the - other side, it makes the ALSA subsystem larger. - config SND_VERBOSE_PRINTK bool "Verbose printk" depends on SND @@ -171,13 +152,3 @@ config SND_DEBUG_DETECT help Say Y here to enable extra-verbose log messages printed when detecting devices. - -config SND_PCM_XRUN_DEBUG - bool "Enable PCM ring buffer overrun/underrun debugging" - default n - depends on SND_DEBUG && SND_VERBOSE_PROCFS - help - Say Y to enable the PCM ring buffer overrun/underrun debugging. - It is usually not required, but if you have trouble with - sound clicking when system is loaded, it may help to determine - the process or driver which causes the scheduling gaps. diff --git a/sound/core/control.c b/sound/core/control.c index ac890d9c7..ebf68f126 100644 --- a/sound/core/control.c +++ b/sound/core/control.c @@ -176,8 +176,6 @@ 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 @@ -206,8 +204,6 @@ 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 @@ -246,8 +242,6 @@ 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 @@ -265,8 +259,6 @@ 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) { @@ -317,29 +309,28 @@ int snd_ctl_add(struct snd_card *card, struct snd_kcontrol *kcontrol) { struct snd_ctl_elem_id id; unsigned int idx; - int err = -EINVAL; + snd_assert(card != NULL, return -EINVAL); if (! kcontrol) - return err; - snd_assert(card != NULL, goto error); - snd_assert(kcontrol->info != NULL, goto error); + return -EINVAL; + snd_assert(kcontrol->info != NULL, return -EINVAL); id = kcontrol->id; down_write(&card->controls_rwsem); if (snd_ctl_find_id(card, &id)) { up_write(&card->controls_rwsem); + snd_ctl_free_one(kcontrol); snd_printd(KERN_ERR "control %i:%i:%i:%s:%i is already present\n", id.iface, id.device, id.subdevice, id.name, id.index); - err = -EBUSY; - goto error; + return -EBUSY; } if (snd_ctl_find_hole(card, kcontrol->count) < 0) { up_write(&card->controls_rwsem); - err = -ENOMEM; - goto error; + snd_ctl_free_one(kcontrol); + return -ENOMEM; } list_add_tail(&kcontrol->list, &card->controls); card->controls_count += kcontrol->count; @@ -349,14 +340,8 @@ int snd_ctl_add(struct snd_card *card, struct snd_kcontrol *kcontrol) for (idx = 0; idx < kcontrol->count; idx++, id.index++, id.numid++) snd_ctl_notify(card, SNDRV_CTL_EVENT_MASK_ADD, &id); return 0; - - error: - snd_ctl_free_one(kcontrol); - return err; } -EXPORT_SYMBOL(snd_ctl_add); - /** * snd_ctl_remove - remove the control from the card and release it * @card: the card instance @@ -383,8 +368,6 @@ 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 @@ -411,8 +394,6 @@ 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 @@ -475,8 +456,6 @@ 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 @@ -503,8 +482,6 @@ 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 @@ -545,8 +522,6 @@ 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) { @@ -683,11 +658,7 @@ static int snd_ctl_elem_info_user(struct snd_ctl_file *ctl, if (copy_from_user(&info, _info, sizeof(info))) return -EFAULT; - snd_power_lock(ctl->card); - result = snd_power_wait(ctl->card, SNDRV_CTL_POWER_D0); - if (result >= 0) - result = snd_ctl_elem_info(ctl, &info); - snd_power_unlock(ctl->card); + result = snd_ctl_elem_info(ctl, &info); if (result >= 0) if (copy_to_user(_info, &info, sizeof(info))) return -EFAULT; @@ -724,8 +695,6 @@ 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) { @@ -739,11 +708,7 @@ static int snd_ctl_elem_read_user(struct snd_card *card, kfree(control); return -EFAULT; } - snd_power_lock(card); - result = snd_power_wait(card, SNDRV_CTL_POWER_D0); - if (result >= 0) - result = snd_ctl_elem_read(card, control); - snd_power_unlock(card); + result = snd_ctl_elem_read(card, control); if (result >= 0) if (copy_to_user(_control, control, sizeof(*control))) result = -EFAULT; @@ -789,13 +754,10 @@ 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) { struct snd_ctl_elem_value *control; - struct snd_card *card; int result; control = kmalloc(sizeof(*control), GFP_KERNEL); @@ -805,12 +767,7 @@ static int snd_ctl_elem_write_user(struct snd_ctl_file *file, kfree(control); return -EFAULT; } - card = file->card; - snd_power_lock(card); - result = snd_power_wait(card, SNDRV_CTL_POWER_D0); - if (result >= 0) - result = snd_ctl_elem_write(card, file, control); - snd_power_unlock(card); + result = snd_ctl_elem_write(file->card, file, control); if (result >= 0) if (copy_to_user(_control, control, sizeof(*control))) result = -EFAULT; @@ -1224,15 +1181,11 @@ 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 /* @@ -1265,15 +1218,12 @@ 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/control_compat.c b/sound/core/control_compat.c index 3c0161bb5..a529b6297 100644 --- a/sound/core/control_compat.c +++ b/sound/core/control_compat.c @@ -107,13 +107,7 @@ static int snd_ctl_elem_info_compat(struct snd_ctl_file *ctl, */ if (get_user(data->value.enumerated.item, &data32->value.enumerated.item)) goto error; - - snd_power_lock(ctl->card); - err = snd_power_wait(ctl->card, SNDRV_CTL_POWER_D0); - if (err >= 0) - err = snd_ctl_elem_info(ctl, data); - snd_power_unlock(ctl->card); - + err = snd_ctl_elem_info(ctl, data); if (err < 0) goto error; /* restore info to 32bit */ @@ -292,14 +286,9 @@ static int snd_ctl_elem_read_user_compat(struct snd_card *card, if ((err = copy_ctl_value_from_user(card, data, data32, &type, &count)) < 0) goto error; - - snd_power_lock(card); - err = snd_power_wait(card, SNDRV_CTL_POWER_D0); - if (err >= 0) - err = snd_ctl_elem_read(card, data); - snd_power_unlock(card); - if (err >= 0) - err = copy_ctl_value_to_user(data32, data, type, count); + if ((err = snd_ctl_elem_read(card, data)) < 0) + goto error; + err = copy_ctl_value_to_user(data32, data, type, count); error: kfree(data); return err; @@ -309,23 +298,17 @@ static int snd_ctl_elem_write_user_compat(struct snd_ctl_file *file, struct snd_ctl_elem_value32 __user *data32) { struct snd_ctl_elem_value *data; - struct snd_card *card = file->card; int err, type, count; data = kzalloc(sizeof(*data), GFP_KERNEL); if (data == NULL) return -ENOMEM; - if ((err = copy_ctl_value_from_user(card, data, data32, &type, &count)) < 0) + if ((err = copy_ctl_value_from_user(file->card, data, data32, &type, &count)) < 0) goto error; - - snd_power_lock(card); - err = snd_power_wait(card, SNDRV_CTL_POWER_D0); - if (err >= 0) - err = snd_ctl_elem_write(card, file, data); - snd_power_unlock(card); - if (err >= 0) - err = copy_ctl_value_to_user(data32, data, type, count); + if ((err = snd_ctl_elem_write(file->card, file, data)) < 0) + goto error; + err = copy_ctl_value_to_user(data32, data, type, count); error: kfree(data); return err; diff --git a/sound/core/device.c b/sound/core/device.c index 6ce4da4a1..b1cf6ec56 100644 --- a/sound/core/device.c +++ b/sound/core/device.c @@ -63,8 +63,6 @@ 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 @@ -109,8 +107,6 @@ 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 @@ -186,8 +182,6 @@ 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 a562f96f3..618c43be0 100644 --- a/sound/core/hwdep.c +++ b/sound/core/hwdep.c @@ -25,7 +25,6 @@ #include #include #include -#include #include #include #include @@ -37,7 +36,7 @@ MODULE_DESCRIPTION("Hardware dependent layer"); MODULE_LICENSE("GPL"); static LIST_HEAD(snd_hwdep_devices); -static DEFINE_MUTEX(register_mutex); +static DECLARE_MUTEX(register_mutex); static int snd_hwdep_free(struct snd_hwdep *hwdep); static int snd_hwdep_dev_free(struct snd_device *device); @@ -112,7 +111,7 @@ static int snd_hwdep_open(struct inode *inode, struct file * file) init_waitqueue_entry(&wait, current); add_wait_queue(&hw->open_wait, &wait); - mutex_lock(&hw->open_mutex); + down(&hw->open_mutex); while (1) { if (hw->exclusive && hw->used > 0) { err = -EBUSY; @@ -129,9 +128,9 @@ static int snd_hwdep_open(struct inode *inode, struct file * file) } else break; set_current_state(TASK_INTERRUPTIBLE); - mutex_unlock(&hw->open_mutex); + up(&hw->open_mutex); schedule(); - mutex_lock(&hw->open_mutex); + down(&hw->open_mutex); if (signal_pending(current)) { err = -ERESTARTSYS; break; @@ -148,7 +147,7 @@ static int snd_hwdep_open(struct inode *inode, struct file * file) hw->ops.release(hw, file); } } - mutex_unlock(&hw->open_mutex); + up(&hw->open_mutex); if (err < 0) module_put(hw->card->module); return err; @@ -158,8 +157,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); + down(&hw->open_mutex); if (hw->ops.release) { err = hw->ops.release(hw, file); wake_up(&hw->open_wait); @@ -167,8 +165,8 @@ static int snd_hwdep_release(struct inode *inode, struct file * file) if (hw->used > 0) hw->used--; snd_card_file_remove(hw->card, file); - mutex_unlock(&hw->open_mutex); - module_put(mod); + up(&hw->open_mutex); + module_put(hw->card->module); return err; } @@ -274,7 +272,7 @@ static int snd_hwdep_control_ioctl(struct snd_card *card, if (get_user(device, (int __user *)arg)) return -EFAULT; - mutex_lock(®ister_mutex); + down(®ister_mutex); device = device < 0 ? 0 : device + 1; while (device < SNDRV_MINOR_HWDEPS) { if (snd_hwdep_search(card, device)) @@ -283,7 +281,7 @@ static int snd_hwdep_control_ioctl(struct snd_card *card, } if (device >= SNDRV_MINOR_HWDEPS) device = -1; - mutex_unlock(®ister_mutex); + up(®ister_mutex); if (put_user(device, (int __user *)arg)) return -EFAULT; return 0; @@ -296,13 +294,13 @@ static int snd_hwdep_control_ioctl(struct snd_card *card, if (get_user(device, &info->device)) return -EFAULT; - mutex_lock(®ister_mutex); + down(®ister_mutex); hwdep = snd_hwdep_search(card, device); if (hwdep) err = snd_hwdep_info(hwdep, info); else err = -ENXIO; - mutex_unlock(®ister_mutex); + up(®ister_mutex); return err; } } @@ -377,7 +375,7 @@ int snd_hwdep_new(struct snd_card *card, char *id, int device, return err; } init_waitqueue_head(&hwdep->open_wait); - mutex_init(&hwdep->open_mutex); + init_MUTEX(&hwdep->open_mutex); *rhwdep = hwdep; return 0; } @@ -403,9 +401,9 @@ static int snd_hwdep_dev_register(struct snd_device *device) int err; char name[32]; - mutex_lock(®ister_mutex); + down(®ister_mutex); if (snd_hwdep_search(hwdep->card, hwdep->device)) { - mutex_unlock(®ister_mutex); + up(®ister_mutex); return -EBUSY; } list_add_tail(&hwdep->list, &snd_hwdep_devices); @@ -416,7 +414,7 @@ static int snd_hwdep_dev_register(struct snd_device *device) snd_printk(KERN_ERR "unable to register hardware dependent device %i:%i\n", hwdep->card->number, hwdep->device); list_del(&hwdep->list); - mutex_unlock(®ister_mutex); + up(®ister_mutex); return err; } #ifdef CONFIG_SND_OSSEMUL @@ -436,7 +434,7 @@ static int snd_hwdep_dev_register(struct snd_device *device) } } #endif - mutex_unlock(®ister_mutex); + up(®ister_mutex); return 0; } @@ -445,9 +443,9 @@ static int snd_hwdep_dev_unregister(struct snd_device *device) struct snd_hwdep *hwdep = device->device_data; snd_assert(hwdep != NULL, return -ENXIO); - mutex_lock(®ister_mutex); + down(®ister_mutex); if (snd_hwdep_search(hwdep->card, hwdep->device) != hwdep) { - mutex_unlock(®ister_mutex); + up(®ister_mutex); return -EINVAL; } #ifdef CONFIG_SND_OSSEMUL @@ -456,7 +454,7 @@ static int snd_hwdep_dev_unregister(struct snd_device *device) #endif snd_unregister_device(SNDRV_DEVICE_TYPE_HWDEP, hwdep->card, hwdep->device); list_del(&hwdep->list); - mutex_unlock(®ister_mutex); + up(®ister_mutex); return snd_hwdep_free(hwdep); } @@ -471,13 +469,13 @@ static void snd_hwdep_proc_read(struct snd_info_entry *entry, struct list_head *p; struct snd_hwdep *hwdep; - mutex_lock(®ister_mutex); + down(®ister_mutex); list_for_each(p, &snd_hwdep_devices) { hwdep = list_entry(p, struct snd_hwdep, list); snd_iprintf(buffer, "%02i-%02i: %s\n", hwdep->card->number, hwdep->device, hwdep->name); } - mutex_unlock(®ister_mutex); + up(®ister_mutex); } static struct snd_info_entry *snd_hwdep_proc_entry; @@ -487,6 +485,7 @@ 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 57821ceb1..af123e3bd 100644 --- a/sound/core/info.c +++ b/sound/core/info.c @@ -21,6 +21,7 @@ #include #include +#include #include #include #include @@ -29,7 +30,7 @@ #include #include #include -#include +#include #include /* @@ -67,7 +68,7 @@ int snd_info_check_reserved_words(const char *str) return 1; } -static DEFINE_MUTEX(info_mutex); +static DECLARE_MUTEX(info_mutex); struct snd_info_private_data { struct snd_info_buffer *rbuffer; @@ -80,24 +81,6 @@ 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 @@ -111,46 +94,30 @@ 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); - 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; - } + res = vsnprintf(buffer->curr, len, fmt, args); va_end(args); - - if (err < 0) - return err; + if (res >= len) { + buffer->stop = 1; + return 0; + } buffer->curr += res; buffer->size += res; return res; } -EXPORT_SYMBOL(snd_iprintf); - /* */ -static struct proc_dir_entry *snd_proc_root; -struct snd_info_entry *snd_seq_root; -EXPORT_SYMBOL(snd_seq_root); - +static struct proc_dir_entry *snd_proc_root = NULL; +struct snd_info_entry *snd_seq_root = NULL; #ifdef CONFIG_SND_OSSEMUL -struct snd_info_entry *snd_oss_root; +struct snd_info_entry *snd_oss_root = NULL; #endif static inline void snd_info_entry_prepare(struct proc_dir_entry *de) @@ -253,7 +220,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; - ssize_t size = 0; + size_t size = 0; loff_t pos; data = file->private_data; @@ -269,20 +236,14 @@ static ssize_t snd_info_entry_write(struct file *file, const char __user *buffer buf = data->wbuffer; if (buf == NULL) return -EIO; - 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); + if (pos >= buf->len) + return -ENOMEM; + size = buf->len - pos; + size = min(count, size); + if (copy_from_user(buf->buffer + pos, buffer, size)) return -EFAULT; - } - buf->size = pos + count; - mutex_unlock(&entry->access); - size = count; + if ((long)buf->size < pos + size) + buf->size = pos + size; break; case SNDRV_INFO_CONTENT_DATA: if (entry->c.ops->write) @@ -304,11 +265,11 @@ static int snd_info_entry_open(struct inode *inode, struct file *file) struct proc_dir_entry *p; int mode, err; - mutex_lock(&info_mutex); + down(&info_mutex); p = PDE(inode); entry = p == NULL ? NULL : (struct snd_info_entry *)p->data; if (entry == NULL || entry->disconnected) { - mutex_unlock(&info_mutex); + up(&info_mutex); return -ENODEV; } if (!try_module_get(entry->module)) { @@ -317,14 +278,18 @@ 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_DATA && + if ((entry->content == SNDRV_INFO_CONTENT_TEXT && + !entry->c.text.read_size) || + (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_DATA && + if ((entry->content == SNDRV_INFO_CONTENT_TEXT && + !entry->c.text.write_size) || + (entry->content == SNDRV_INFO_CONTENT_DATA && entry->c.ops->write == NULL)) { err = -ENODEV; goto __error; @@ -340,23 +305,49 @@ 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) - goto __nomem; + 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; 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) - goto __nomem; + 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; 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 */ @@ -370,32 +361,21 @@ static int snd_info_entry_open(struct inode *inode, struct file *file) break; } file->private_data = data; - mutex_unlock(&info_mutex); + up(&info_mutex); if (entry->content == SNDRV_INFO_CONTENT_TEXT && (mode == O_RDONLY || mode == O_RDWR)) { if (entry->c.text.read) { - mutex_lock(&entry->access); + down(&entry->access); entry->c.text.read(entry, data->rbuffer); - mutex_unlock(&entry->access); + up(&entry->access); } } 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: - mutex_unlock(&info_mutex); + up(&info_mutex); return err; } @@ -410,11 +390,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 (data->rbuffer) { - kfree(data->rbuffer->buffer); + if (mode == O_RDONLY || mode == O_RDWR) { + vfree(data->rbuffer->buffer); kfree(data->rbuffer); } - if (data->wbuffer) { + if (mode == O_WRONLY || mode == O_RDWR) { if (entry->c.text.write) { entry->c.text.write(entry, data->wbuffer); if (data->wbuffer->error) { @@ -423,7 +403,7 @@ static int snd_info_entry_release(struct inode *inode, struct file *file) data->wbuffer->error); } } - kfree(data->wbuffer->buffer); + vfree(data->wbuffer->buffer); kfree(data->wbuffer); } break; @@ -683,29 +663,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->buffer[buffer->curr++]; + c = *buffer->curr++; if (c == '\n') { - if (buffer->curr >= buffer->size) + if ((buffer->curr - buffer->buffer) >= (long)buffer->size) { buffer->stop = 1; + } break; } *line++ = c; - if (buffer->curr >= buffer->size) { + if ((buffer->curr - buffer->buffer) >= (long)buffer->size) { buffer->stop = 1; break; } } while (c != '\n' && !buffer->stop) { - c = buffer->buffer[buffer->curr++]; - if (buffer->curr >= buffer->size) + c = *buffer->curr++; + if ((buffer->curr - buffer->buffer) >= (long)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 @@ -742,8 +722,6 @@ 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 @@ -769,7 +747,7 @@ static struct snd_info_entry *snd_info_create_entry(const char *name) } entry->mode = S_IFREG | S_IRUGO; entry->content = SNDRV_INFO_CONTENT_TEXT; - mutex_init(&entry->access); + init_MUTEX(&entry->access); return entry; } @@ -795,8 +773,6 @@ 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 @@ -820,8 +796,6 @@ 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; @@ -892,8 +866,6 @@ 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 @@ -910,8 +882,6 @@ 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 @@ -926,10 +896,10 @@ int snd_info_register(struct snd_info_entry * entry) snd_assert(entry != NULL, return -ENXIO); root = entry->parent == NULL ? snd_proc_root : entry->parent->p; - mutex_lock(&info_mutex); + down(&info_mutex); p = snd_create_proc_entry(entry->name, entry->mode, root); if (!p) { - mutex_unlock(&info_mutex); + up(&info_mutex); return -ENOMEM; } p->owner = entry->module; @@ -938,12 +908,10 @@ int snd_info_register(struct snd_info_entry * entry) p->size = entry->size; p->data = entry; entry->p = p; - mutex_unlock(&info_mutex); + up(&info_mutex); return 0; } -EXPORT_SYMBOL(snd_info_register); - /** * snd_info_unregister - de-register the info entry * @entry: the info entry @@ -961,20 +929,18 @@ int snd_info_unregister(struct snd_info_entry * entry) snd_assert(entry->p != NULL, return -ENXIO); root = entry->parent == NULL ? snd_proc_root : entry->parent->p; snd_assert(root, return -ENXIO); - mutex_lock(&info_mutex); + down(&info_mutex); snd_remove_proc_entry(root, entry->p); - mutex_unlock(&info_mutex); + up(&info_mutex); snd_info_free_entry(entry); return 0; } -EXPORT_SYMBOL(snd_info_unregister); - /* */ -static struct snd_info_entry *snd_info_version_entry; +static struct snd_info_entry *snd_info_version_entry = NULL; static void snd_info_version_read(struct snd_info_entry *entry, struct snd_info_buffer *buffer) { @@ -991,6 +957,7 @@ 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 bb2c40d0a..820f4772e 100644 --- a/sound/core/info_oss.c +++ b/sound/core/info_oss.c @@ -28,7 +28,6 @@ #include #include #include -#include #if defined(CONFIG_SND_OSSEMUL) && defined(CONFIG_PROC_FS) @@ -36,7 +35,7 @@ * OSS compatible part */ -static DEFINE_MUTEX(strings); +static DECLARE_MUTEX(strings); static char *snd_sndstat_strings[SNDRV_CARDS][SNDRV_OSS_INFO_DEV_COUNT]; static struct snd_info_entry *snd_sndstat_proc_entry; @@ -46,7 +45,7 @@ int snd_oss_info_register(int dev, int num, char *string) snd_assert(dev >= 0 && dev < SNDRV_OSS_INFO_DEV_COUNT, return -ENXIO); snd_assert(num >= 0 && num < SNDRV_CARDS, return -ENXIO); - mutex_lock(&strings); + down(&strings); if (string == NULL) { if ((x = snd_sndstat_strings[num][dev]) != NULL) { kfree(x); @@ -55,17 +54,15 @@ int snd_oss_info_register(int dev, int num, char *string) } else { x = kstrdup(string, GFP_KERNEL); if (x == NULL) { - mutex_unlock(&strings); + up(&strings); return -ENOMEM; } } snd_sndstat_strings[num][dev] = x; - mutex_unlock(&strings); + up(&strings); 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) @@ -74,7 +71,7 @@ static int snd_sndstat_show_strings(struct snd_info_buffer *buf, char *id, int d char *str; snd_iprintf(buf, "\n%s:", id); - mutex_lock(&strings); + down(&strings); for (idx = 0; idx < SNDRV_CARDS; idx++) { str = snd_sndstat_strings[idx][dev]; if (str) { @@ -85,7 +82,7 @@ static int snd_sndstat_show_strings(struct snd_info_buffer *buf, char *id, int d snd_iprintf(buf, "%i: %s\n", idx, str); } } - mutex_unlock(&strings); + up(&strings); if (ok < 0) snd_iprintf(buf, " NOT ENABLED IN CONFIG\n"); return ok; @@ -119,6 +116,7 @@ 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 4d9258884..758166886 100644 --- a/sound/core/init.c +++ b/sound/core/init.c @@ -38,15 +38,12 @@ struct snd_shutdown_f_ops { struct snd_shutdown_f_ops *next; }; -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); +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); #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 @@ -69,6 +66,7 @@ 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); @@ -112,7 +110,7 @@ struct snd_card *snd_card_new(int idx, const char *xid, strlcpy(card->id, xid, sizeof(card->id)); } err = 0; - mutex_lock(&snd_card_mutex); + write_lock(&snd_card_rwlock); if (idx < 0) { int idx2; for (idx2 = 0; idx2 < SNDRV_CARDS; idx2++) @@ -130,12 +128,12 @@ struct snd_card *snd_card_new(int idx, const char *xid, else err = -ENODEV; if (idx < 0 || err < 0) { - mutex_unlock(&snd_card_mutex); + write_unlock(&snd_card_rwlock); 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 */ - mutex_unlock(&snd_card_mutex); + write_unlock(&snd_card_rwlock); card->number = idx; card->module = module; INIT_LIST_HEAD(&card->devices); @@ -147,7 +145,7 @@ struct snd_card *snd_card_new(int idx, const char *xid, init_waitqueue_head(&card->shutdown_sleep); INIT_WORK(&card->free_workq, snd_card_free_thread, card); #ifdef CONFIG_PM - mutex_init(&card->power_lock); + init_MUTEX(&card->power_lock); init_waitqueue_head(&card->power_sleep); #endif /* the control interface cannot be accessed from the user space until */ @@ -171,57 +169,11 @@ 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; -} - -static ssize_t snd_disconnect_read(struct file *file, char __user *buf, - size_t count, loff_t *offset) -{ - return -ENODEV; -} - -static ssize_t snd_disconnect_write(struct file *file, const char __user *buf, - size_t count, loff_t *offset) -{ - return -ENODEV; -} - static unsigned int snd_disconnect_poll(struct file * file, poll_table * wait) { return POLLERR | POLLNVAL; } -static long snd_disconnect_ioctl(struct file *file, - unsigned int cmd, unsigned long arg) -{ - return -ENODEV; -} - -static int snd_disconnect_mmap(struct file *file, struct vm_area_struct *vma) -{ - return -ENODEV; -} - -static int snd_disconnect_fasync(int fd, struct file *file, int on) -{ - return -ENODEV; -} - /** * snd_card_disconnect - disconnect all APIs from the file-operations (user space) * @card: soundcard structure @@ -238,8 +190,7 @@ int snd_card_disconnect(struct snd_card *card) struct snd_monitor_file *mfile; struct file *file; struct snd_shutdown_f_ops *s_f_ops; - struct file_operations *f_ops; - const struct file_operations *old_f_ops; + struct file_operations *f_ops, *old_f_ops; int err; spin_lock(&card->files_lock); @@ -251,9 +202,9 @@ int snd_card_disconnect(struct snd_card *card) spin_unlock(&card->files_lock); /* phase 1: disable fops (user space) operations for ALSA API */ - mutex_lock(&snd_card_mutex); + write_lock(&snd_card_rwlock); snd_cards[card->number] = NULL; - mutex_unlock(&snd_card_mutex); + write_unlock(&snd_card_rwlock); /* phase 2: replace file->f_op with special dummy operations */ @@ -273,16 +224,7 @@ int snd_card_disconnect(struct snd_card *card) memset(f_ops, 0, sizeof(*f_ops)); f_ops->owner = file->f_op->owner; f_ops->release = file->f_op->release; - f_ops->llseek = snd_disconnect_llseek; - f_ops->read = snd_disconnect_read; - f_ops->write = snd_disconnect_write; f_ops->poll = snd_disconnect_poll; - f_ops->unlocked_ioctl = snd_disconnect_ioctl; -#ifdef CONFIG_COMPAT - f_ops->compat_ioctl = snd_disconnect_ioctl; -#endif - f_ops->mmap = snd_disconnect_mmap; - f_ops->fasync = snd_disconnect_fasync; s_f_ops->next = card->s_f_ops; card->s_f_ops = s_f_ops; @@ -313,8 +255,6 @@ 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 @@ -332,9 +272,9 @@ int snd_card_free(struct snd_card *card) if (card == NULL) return -EINVAL; - mutex_lock(&snd_card_mutex); + write_lock(&snd_card_rwlock); snd_cards[card->number] = NULL; - mutex_unlock(&snd_card_mutex); + write_unlock(&snd_card_rwlock); #ifdef CONFIG_PM wake_up(&card->power_sleep); @@ -370,15 +310,13 @@ int snd_card_free(struct snd_card *card) card->s_f_ops = s_f_ops->next; kfree(s_f_ops); } - mutex_lock(&snd_card_mutex); + write_lock(&snd_card_rwlock); snd_cards_lock &= ~(1 << card->number); - mutex_unlock(&snd_card_mutex); + write_unlock(&snd_card_rwlock); kfree(card); return 0; } -EXPORT_SYMBOL(snd_card_free); - static void snd_card_free_thread(void * __card) { struct snd_card *card = __card; @@ -424,8 +362,6 @@ 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; @@ -508,16 +444,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; - mutex_lock(&snd_card_mutex); + write_lock(&snd_card_rwlock); if (snd_cards[card->number]) { /* already registered */ - mutex_unlock(&snd_card_mutex); + write_unlock(&snd_card_rwlock); return 0; } if (card->id[0] == '\0') choose_default_id(card); snd_cards[card->number] = card; - mutex_unlock(&snd_card_mutex); + write_unlock(&snd_card_rwlock); init_info_for_card(card); #if defined(CONFIG_SND_MIXER_OSS) || defined(CONFIG_SND_MIXER_OSS_MODULE) if (snd_mixer_oss_notify_callback) @@ -526,10 +462,8 @@ 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; +static struct snd_info_entry *snd_card_info_entry = NULL; static void snd_card_info_read(struct snd_info_entry *entry, struct snd_info_buffer *buffer) @@ -538,7 +472,7 @@ static void snd_card_info_read(struct snd_info_entry *entry, struct snd_card *card; for (idx = count = 0; idx < SNDRV_CARDS; idx++) { - mutex_lock(&snd_card_mutex); + read_lock(&snd_card_rwlock); if ((card = snd_cards[idx]) != NULL) { count++; snd_iprintf(buffer, "%2i [%-15s]: %s - %s\n", @@ -549,7 +483,7 @@ static void snd_card_info_read(struct snd_info_entry *entry, snd_iprintf(buffer, " %s\n", card->longname); } - mutex_unlock(&snd_card_mutex); + read_unlock(&snd_card_rwlock); } if (!count) snd_iprintf(buffer, "--- no soundcards ---\n"); @@ -563,12 +497,12 @@ void snd_card_info_read_oss(struct snd_info_buffer *buffer) struct snd_card *card; for (idx = count = 0; idx < SNDRV_CARDS; idx++) { - mutex_lock(&snd_card_mutex); + read_lock(&snd_card_rwlock); if ((card = snd_cards[idx]) != NULL) { count++; snd_iprintf(buffer, "%s\n", card->longname); } - mutex_unlock(&snd_card_mutex); + read_unlock(&snd_card_rwlock); } if (!count) { snd_iprintf(buffer, "--- no soundcards ---\n"); @@ -586,11 +520,11 @@ static void snd_card_module_info_read(struct snd_info_entry *entry, struct snd_card *card; for (idx = 0; idx < SNDRV_CARDS; idx++) { - mutex_lock(&snd_card_mutex); + read_lock(&snd_card_rwlock); if ((card = snd_cards[idx]) != NULL) snd_iprintf(buffer, "%2i %s\n", idx, card->module->name); - mutex_unlock(&snd_card_mutex); + read_unlock(&snd_card_rwlock); } } #endif @@ -602,6 +536,7 @@ 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); @@ -612,6 +547,7 @@ 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); @@ -665,8 +601,6 @@ 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 @@ -699,8 +633,6 @@ 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 @@ -742,19 +674,18 @@ 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. * @card: soundcard structure * @power_state: expected power state + * @file: file structure for the O_NONBLOCK check (optional) * * Waits until the power-state is changed. * * Note: the power lock must be active before call. */ -int snd_power_wait(struct snd_card *card, unsigned int power_state) +int snd_power_wait(struct snd_card *card, unsigned int power_state, struct file *file) { wait_queue_t wait; int result = 0; @@ -771,6 +702,12 @@ int snd_power_wait(struct snd_card *card, unsigned int power_state) } if (snd_power_get_state(card) == power_state) break; +#if 0 /* block all devices */ + if (file && (file->f_flags & O_NONBLOCK)) { + result = -EAGAIN; + break; + } +#endif set_current_state(TASK_UNINTERRUPTIBLE); snd_power_unlock(card); schedule_timeout(30 * HZ); @@ -780,5 +717,4 @@ 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 d52398727..1a378951d 100644 --- a/sound/core/isadma.c +++ b/sound/core/isadma.c @@ -56,8 +56,6 @@ 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 @@ -74,8 +72,6 @@ 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 @@ -105,5 +101,3 @@ 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 bc0bd0910..19b3dcbb0 100644 --- a/sound/core/memalloc.c +++ b/sound/core/memalloc.c @@ -21,6 +21,7 @@ * */ +#include #include #include #include @@ -30,7 +31,7 @@ #include #include #include -#include +#include #include #ifdef CONFIG_SBUS #include @@ -53,7 +54,7 @@ int snd_free_sgbuf_pages(struct snd_dma_buffer *dmab); /* */ -static DEFINE_MUTEX(list_mutex); +static DECLARE_MUTEX(list_mutex); static LIST_HEAD(mem_list_head); /* buffer preservation list */ @@ -82,7 +83,7 @@ struct snd_mem_list { * Hacks */ -#if defined(__i386__) +#if defined(__i386__) || defined(__ppc__) || defined(__x86_64__) /* * A hack to allocate large buffers via dma_alloc_coherent() * @@ -140,6 +141,10 @@ static void *snd_dma_hack_alloc_coherent(struct device *dev, size_t size, #endif /* arch */ +#if ! defined(__arm__) +#define NEED_RESERVE_PAGES +#endif + /* * * Generic memory allocators @@ -158,6 +163,20 @@ static inline void dec_snd_pages(int order) snd_allocated_pages -= 1 << order; } +static void mark_pages(struct page *page, int order) +{ + struct page *last_page = page + (1 << order); + while (page < last_page) + SetPageReserved(page++); +} + +static void unmark_pages(struct page *page, int order) +{ + struct page *last_page = page + (1 << order); + while (page < last_page) + ClearPageReserved(page++); +} + /** * snd_malloc_pages - allocate pages with the given size * @size: the size to allocate in bytes @@ -176,8 +195,10 @@ void *snd_malloc_pages(size_t size, gfp_t gfp_flags) snd_assert(gfp_flags != 0, return NULL); gfp_flags |= __GFP_COMP; /* compound page lets parts be mapped */ pg = get_order(size); - if ((res = (void *) __get_free_pages(gfp_flags, pg)) != NULL) + if ((res = (void *) __get_free_pages(gfp_flags, pg)) != NULL) { + mark_pages(virt_to_page(res), pg); inc_snd_pages(pg); + } return res; } @@ -196,6 +217,7 @@ void snd_free_pages(void *ptr, size_t size) return; pg = get_order(size); dec_snd_pages(pg); + unmark_pages(virt_to_page(ptr), pg); free_pages((unsigned long) ptr, pg); } @@ -220,8 +242,12 @@ static void *snd_malloc_dev_pages(struct device *dev, size_t size, dma_addr_t *d | __GFP_NORETRY /* don't trigger OOM-killer */ | __GFP_NOWARN; /* no stack trace print - this call is non-critical */ res = dma_alloc_coherent(dev, PAGE_SIZE << pg, dma, gfp_flags); - if (res != NULL) + if (res != NULL) { +#ifdef NEED_RESERVE_PAGES + mark_pages(virt_to_page(res), pg); /* should be dma_to_page() */ +#endif inc_snd_pages(pg); + } return res; } @@ -236,6 +262,9 @@ static void snd_free_dev_pages(struct device *dev, size_t size, void *ptr, return; pg = get_order(size); dec_snd_pages(pg); +#ifdef NEED_RESERVE_PAGES + unmark_pages(virt_to_page(ptr), pg); /* should be dma_to_page() */ +#endif dma_free_coherent(dev, PAGE_SIZE << pg, ptr, dma); } @@ -411,7 +440,7 @@ size_t snd_dma_get_reserved_buf(struct snd_dma_buffer *dmab, unsigned int id) snd_assert(dmab, return 0); - mutex_lock(&list_mutex); + down(&list_mutex); list_for_each(p, &mem_list_head) { mem = list_entry(p, struct snd_mem_list, list); if (mem->id == id && @@ -423,11 +452,11 @@ size_t snd_dma_get_reserved_buf(struct snd_dma_buffer *dmab, unsigned int id) if (dmab->dev.dev == NULL) dmab->dev.dev = dev; kfree(mem); - mutex_unlock(&list_mutex); + up(&list_mutex); return dmab->bytes; } } - mutex_unlock(&list_mutex); + up(&list_mutex); return 0; } @@ -448,11 +477,11 @@ int snd_dma_reserve_buf(struct snd_dma_buffer *dmab, unsigned int id) mem = kmalloc(sizeof(*mem), GFP_KERNEL); if (! mem) return -ENOMEM; - mutex_lock(&list_mutex); + down(&list_mutex); mem->buffer = *dmab; mem->id = id; list_add_tail(&mem->list, &mem_list_head); - mutex_unlock(&list_mutex); + up(&list_mutex); return 0; } @@ -464,7 +493,7 @@ static void free_all_reserved_pages(void) struct list_head *p; struct snd_mem_list *mem; - mutex_lock(&list_mutex); + down(&list_mutex); while (! list_empty(&mem_list_head)) { p = mem_list_head.next; mem = list_entry(p, struct snd_mem_list, list); @@ -472,7 +501,7 @@ static void free_all_reserved_pages(void) snd_dma_free_pages(&mem->buffer); kfree(mem); } - mutex_unlock(&list_mutex); + up(&list_mutex); } @@ -493,7 +522,7 @@ static int snd_mem_proc_read(char *page, char **start, off_t off, int devno; static char *types[] = { "UNKNOWN", "CONT", "DEV", "DEV-SG", "SBUS" }; - mutex_lock(&list_mutex); + down(&list_mutex); len += snprintf(page + len, count - len, "pages : %li bytes (%li pages per %likB)\n", pages * PAGE_SIZE, pages, PAGE_SIZE / 1024); @@ -508,7 +537,7 @@ static int snd_mem_proc_read(char *page, char **start, off_t off, " addr = 0x%lx, size = %d bytes\n", (unsigned long)mem->buffer.addr, (int)mem->buffer.bytes); } - mutex_unlock(&list_mutex); + up(&list_mutex); return len; } diff --git a/sound/core/memory.c b/sound/core/memory.c index 93537ab7c..862d62d2e 100644 --- a/sound/core/memory.c +++ b/sound/core/memory.c @@ -20,7 +20,7 @@ * */ -#include +#include #include #include @@ -55,8 +55,6 @@ 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 @@ -87,5 +85,3 @@ 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 03fc711f4..b53e563c0 100644 --- a/sound/core/misc.c +++ b/sound/core/misc.c @@ -34,8 +34,6 @@ 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, ...) { @@ -53,8 +51,6 @@ 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) @@ -75,6 +71,4 @@ 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/copy.c b/sound/core/oss/copy.c index 6658facc5..d6a04c2d5 100644 --- a/sound/core/oss/copy.c +++ b/sound/core/oss/copy.c @@ -20,9 +20,6 @@ */ #include - -#ifdef CONFIG_SND_PCM_OSS_PLUGINS - #include #include #include @@ -88,5 +85,3 @@ int snd_pcm_plugin_build_copy(struct snd_pcm_substream *plug, *r_plugin = plugin; return 0; } - -#endif diff --git a/sound/core/oss/io.c b/sound/core/oss/io.c index b6e7ce30e..322702e05 100644 --- a/sound/core/oss/io.c +++ b/sound/core/oss/io.c @@ -20,9 +20,6 @@ */ #include - -#ifdef CONFIG_SND_PCM_OSS_PLUGINS - #include #include #include @@ -135,5 +132,3 @@ int snd_pcm_plugin_build_io(struct snd_pcm_substream *plug, *r_plugin = plugin; return 0; } - -#endif diff --git a/sound/core/oss/linear.c b/sound/core/oss/linear.c index 5b1bcdc64..8cbfa415c 100644 --- a/sound/core/oss/linear.c +++ b/sound/core/oss/linear.c @@ -21,9 +21,6 @@ */ #include - -#ifdef CONFIG_SND_PCM_OSS_PLUGINS - #include #include #include @@ -106,7 +103,7 @@ static snd_pcm_sframes_t linear_transfer(struct snd_pcm_plugin *plugin, return frames; } -static int conv_index(int src_format, int dst_format) +int conv_index(int src_format, int dst_format) { int src_endian, dst_endian, sign, src_width, dst_width; @@ -159,5 +156,3 @@ int snd_pcm_plugin_build_linear(struct snd_pcm_substream *plug, *r_plugin = plugin; return 0; } - -#endif diff --git a/sound/core/oss/mixer_oss.c b/sound/core/oss/mixer_oss.c index 75a9505c7..f08e65a2b 100644 --- a/sound/core/oss/mixer_oss.c +++ b/sound/core/oss/mixer_oss.c @@ -988,12 +988,13 @@ 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 = kzalloc(sizeof(*uinfo), GFP_KERNEL); + uinfo = kmalloc(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; @@ -1094,7 +1095,7 @@ static void snd_mixer_oss_proc_read(struct snd_info_entry *entry, struct snd_mixer_oss *mixer = entry->private_data; int i; - mutex_lock(&mixer->reg_mutex); + down(&mixer->reg_mutex); for (i = 0; i < SNDRV_OSS_MAX_MIXERS; i++) { struct slot *p; @@ -1109,7 +1110,7 @@ static void snd_mixer_oss_proc_read(struct snd_info_entry *entry, else snd_iprintf(buffer, "\"\" 0\n"); } - mutex_unlock(&mixer->reg_mutex); + up(&mixer->reg_mutex); } static void snd_mixer_oss_proc_write(struct snd_info_entry *entry, @@ -1133,9 +1134,9 @@ static void snd_mixer_oss_proc_write(struct snd_info_entry *entry, cptr = snd_info_get_str(str, cptr, sizeof(str)); if (! *str) { /* remove the entry */ - mutex_lock(&mixer->reg_mutex); + down(&mixer->reg_mutex); mixer_slot_clear(&mixer->slots[ch]); - mutex_unlock(&mixer->reg_mutex); + up(&mixer->reg_mutex); continue; } snd_info_get_str(idxstr, cptr, sizeof(idxstr)); @@ -1144,7 +1145,7 @@ static void snd_mixer_oss_proc_write(struct snd_info_entry *entry, snd_printk(KERN_ERR "mixer_oss: invalid index %d\n", idx); continue; } - mutex_lock(&mixer->reg_mutex); + down(&mixer->reg_mutex); slot = (struct slot *)mixer->slots[ch].private_data; if (slot && slot->assigned && slot->assigned->index == idx && ! strcmp(slot->assigned->name, str)) @@ -1167,7 +1168,7 @@ static void snd_mixer_oss_proc_write(struct snd_info_entry *entry, kfree(tbl); } __unlock: - mutex_unlock(&mixer->reg_mutex); + up(&mixer->reg_mutex); } } @@ -1181,7 +1182,9 @@ 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) { @@ -1285,7 +1288,7 @@ static int snd_mixer_oss_notify_handler(struct snd_card *card, int cmd) mixer = kcalloc(2, sizeof(*mixer), GFP_KERNEL); if (mixer == NULL) return -ENOMEM; - mutex_init(&mixer->reg_mutex); + init_MUTEX(&mixer->reg_mutex); sprintf(name, "mixer%i%i", card->number, 0); if ((err = snd_register_oss_device(SNDRV_OSS_DEVICE_TYPE_MIXER, card, 0, diff --git a/sound/core/oss/mulaw.c b/sound/core/oss/mulaw.c index 2eb18807e..14f5578ec 100644 --- a/sound/core/oss/mulaw.c +++ b/sound/core/oss/mulaw.c @@ -22,9 +22,6 @@ */ #include - -#ifdef CONFIG_SND_PCM_OSS_PLUGINS - #include #include #include @@ -265,25 +262,6 @@ static snd_pcm_sframes_t mulaw_transfer(struct snd_pcm_plugin *plugin, return frames; } -static int getput_index(int format) -{ - int sign, width, endian; - sign = !snd_pcm_format_signed(format); - width = snd_pcm_format_width(format) / 8 - 1; - if (width < 0 || width > 3) { - snd_printk(KERN_ERR "snd-pcm-oss: invalid format %d\n", format); - width = 0; - } -#ifdef SNDRV_LITTLE_ENDIAN - endian = snd_pcm_format_big_endian(format); -#else - endian = snd_pcm_format_little_endian(format); -#endif - if (endian < 0) - endian = 0; - return width * 4 + endian * 2 + sign; -} - int snd_pcm_plugin_build_mulaw(struct snd_pcm_substream *plug, struct snd_pcm_plugin_format *src_format, struct snd_pcm_plugin_format *dst_format, @@ -328,5 +306,3 @@ int snd_pcm_plugin_build_mulaw(struct snd_pcm_substream *plug, *r_plugin = plugin; return 0; } - -#endif diff --git a/sound/core/oss/pcm_oss.c b/sound/core/oss/pcm_oss.c index 48f7ed474..7fd072392 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]; +static int dsp_map[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS-1)] = 0}; static int adsp_map[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS-1)] = 1}; static int nonblock_open = 1; @@ -78,488 +78,6 @@ 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) { struct snd_pcm_runtime *runtime = substream->runtime; @@ -604,7 +122,6 @@ int snd_pcm_plugin_append(struct snd_pcm_plugin *plugin) } return 0; } -#endif /* CONFIG_SND_PCM_OSS_PLUGINS */ static long snd_pcm_oss_bytes(struct snd_pcm_substream *substream, long frames) { @@ -684,13 +201,14 @@ 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(&substream->mmap_count)) { + if (atomic_read(&runtime->mmap_count)) { if (oss_buffer_size > runtime->oss.mmap_bytes) oss_buffer_size = runtime->oss.mmap_bytes; } - if (substream->oss.setup.period_size > 16) - oss_period_size = substream->oss.setup.period_size; + if (substream->oss.setup && + substream->oss.setup->period_size > 16) + oss_period_size = substream->oss.setup->period_size; else if (runtime->oss.fragshift) { oss_period_size = 1 << runtime->oss.fragshift; if (oss_period_size > oss_buffer_size / 2) @@ -732,8 +250,10 @@ static int snd_pcm_oss_period_size(struct snd_pcm_substream *substream, oss_periods = oss_buffer_size / oss_period_size; - if (substream->oss.setup.periods > 1) - oss_periods = substream->oss.setup.periods; + if (substream->oss.setup) { + if (substream->oss.setup->periods > 1) + oss_periods = substream->oss.setup->periods; + } s = snd_pcm_hw_param_value_max(slave_params, SNDRV_PCM_HW_PARAM_PERIODS, NULL); if (runtime->oss.maxfrags && s > runtime->oss.maxfrags) @@ -819,16 +339,18 @@ static int snd_pcm_oss_change_params(struct snd_pcm_substream *substream) goto failure; } - if (atomic_read(&substream->mmap_count)) + if (atomic_read(&runtime->mmap_count)) { direct = 1; - else - direct = substream->oss.setup.direct; + } else { + struct snd_pcm_oss_setup *setup = substream->oss.setup; + direct = (setup != NULL && setup->direct); + } _snd_pcm_hw_params_any(sparams); _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(&substream->mmap_count)) + if (atomic_read(&runtime->mmap_count)) snd_mask_set(&mask, SNDRV_PCM_ACCESS_MMAP_INTERLEAVED); else { snd_mask_set(&mask, SNDRV_PCM_ACCESS_RW_INTERLEAVED); @@ -890,7 +412,6 @@ static int snd_pcm_oss_change_params(struct snd_pcm_substream *substream) oss_frame_size = snd_pcm_format_physical_width(params_format(params)) * params_channels(params) / 8; -#ifdef CONFIG_SND_PCM_OSS_PLUGINS snd_pcm_oss_plugin_clear(substream); if (!direct) { /* add necessary plugins */ @@ -920,7 +441,6 @@ static int snd_pcm_oss_change_params(struct snd_pcm_substream *substream) } } } -#endif err = snd_pcm_oss_period_size(substream, params, sparams); if (err < 0) @@ -947,8 +467,7 @@ static int snd_pcm_oss_change_params(struct snd_pcm_substream *substream) } else { sw_params->start_threshold = runtime->boundary; } - if (atomic_read(&substream->mmap_count) || - substream->stream == SNDRV_PCM_STREAM_CAPTURE) + if (atomic_read(&runtime->mmap_count) || substream->stream == SNDRV_PCM_STREAM_CAPTURE) sw_params->stop_threshold = runtime->boundary; else sw_params->stop_threshold = runtime->buffer_size; @@ -958,8 +477,8 @@ 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(&substream->mmap_count) || - substream->oss.setup.nosilence) { + if (atomic_read(&runtime->mmap_count) || + (substream->oss.setup && substream->oss.setup->nosilence)) { sw_params->silence_threshold = 0; sw_params->silence_size = 0; } else { @@ -979,13 +498,11 @@ static int snd_pcm_oss_change_params(struct snd_pcm_substream *substream) runtime->oss.periods = params_periods(sparams); oss_period_size = snd_pcm_plug_client_size(substream, params_period_size(sparams)); snd_assert(oss_period_size >= 0, err = -EINVAL; goto failure); -#ifdef CONFIG_SND_PCM_OSS_PLUGINS if (runtime->oss.plugin_first) { err = snd_pcm_plug_alloc(substream, oss_period_size); if (err < 0) goto failure; } -#endif oss_period_size *= oss_frame_size; oss_buffer_size = oss_period_size * runtime->oss.periods; @@ -1267,7 +784,6 @@ static ssize_t snd_pcm_oss_write2(struct snd_pcm_substream *substream, const cha { struct snd_pcm_runtime *runtime = substream->runtime; snd_pcm_sframes_t frames, frames1; -#ifdef CONFIG_SND_PCM_OSS_PLUGINS if (runtime->oss.plugin_first) { struct snd_pcm_plugin_channel *channels; size_t oss_frame_bytes = (runtime->oss.plugin_first->src_width * runtime->oss.plugin_first->src_format.channels) / 8; @@ -1284,9 +800,7 @@ static ssize_t snd_pcm_oss_write2(struct snd_pcm_substream *substream, const cha if (frames1 <= 0) return frames1; bytes = frames1 * oss_frame_bytes; - } else -#endif - { + } else { frames = bytes_to_frames(runtime, bytes); frames1 = snd_pcm_oss_write3(substream, buf, frames, in_kernel); if (frames1 <= 0) @@ -1302,7 +816,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(&substream->mmap_count)) + if (atomic_read(&runtime->mmap_count)) return -ENXIO; if ((tmp = snd_pcm_oss_make_ready(substream)) < 0) @@ -1320,7 +834,7 @@ static ssize_t snd_pcm_oss_write1(struct snd_pcm_substream *substream, const cha buf += tmp; bytes -= tmp; xfer += tmp; - if (substream->oss.setup.partialfrag || + if ((substream->oss.setup != NULL && substream->oss.setup->partialfrag) || runtime->oss.buffer_used == runtime->oss.period_bytes) { tmp = snd_pcm_oss_write2(substream, runtime->oss.buffer + runtime->oss.period_ptr, runtime->oss.buffer_used - runtime->oss.period_ptr, 1); @@ -1332,7 +846,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->f_flags & O_NONBLOCK) != 0) + else if ((substream->ffile->f_flags & O_NONBLOCK) != 0) return xfer > 0 ? xfer : -EAGAIN; } } else { @@ -1345,7 +859,7 @@ static ssize_t snd_pcm_oss_write1(struct snd_pcm_substream *substream, const cha buf += tmp; bytes -= tmp; xfer += tmp; - if ((substream->f_flags & O_NONBLOCK) != 0 && + if ((substream->ffile->f_flags & O_NONBLOCK) != 0 && tmp != runtime->oss.period_bytes) break; } @@ -1357,7 +871,6 @@ static ssize_t snd_pcm_oss_read2(struct snd_pcm_substream *substream, char *buf, { struct snd_pcm_runtime *runtime = substream->runtime; snd_pcm_sframes_t frames, frames1; -#ifdef CONFIG_SND_PCM_OSS_PLUGINS char __user *final_dst = (char __user *)buf; if (runtime->oss.plugin_first) { struct snd_pcm_plugin_channel *channels; @@ -1374,9 +887,7 @@ static ssize_t snd_pcm_oss_read2(struct snd_pcm_substream *substream, char *buf, bytes = frames1 * oss_frame_bytes; if (!in_kernel && copy_to_user(final_dst, buf, bytes)) return -EFAULT; - } else -#endif - { + } else { frames = bytes_to_frames(runtime, bytes); frames1 = snd_pcm_oss_read3(substream, buf, frames, in_kernel); if (frames1 <= 0) @@ -1392,7 +903,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(&substream->mmap_count)) + if (atomic_read(&runtime->mmap_count)) return -ENXIO; if ((tmp = snd_pcm_oss_make_ready(substream)) < 0) @@ -1436,12 +947,12 @@ static int snd_pcm_oss_reset(struct snd_pcm_oss_file *pcm_oss_file) substream = pcm_oss_file->streams[SNDRV_PCM_STREAM_PLAYBACK]; if (substream != NULL) { - snd_pcm_kernel_ioctl(substream, SNDRV_PCM_IOCTL_DROP, NULL); + snd_pcm_kernel_playback_ioctl(substream, SNDRV_PCM_IOCTL_DROP, NULL); substream->runtime->oss.prepare = 1; } substream = pcm_oss_file->streams[SNDRV_PCM_STREAM_CAPTURE]; if (substream != NULL) { - snd_pcm_kernel_ioctl(substream, SNDRV_PCM_IOCTL_DROP, NULL); + snd_pcm_kernel_capture_ioctl(substream, SNDRV_PCM_IOCTL_DROP, NULL); substream->runtime->oss.prepare = 1; } return 0; @@ -1456,7 +967,7 @@ static int snd_pcm_oss_post(struct snd_pcm_oss_file *pcm_oss_file) if (substream != NULL) { if ((err = snd_pcm_oss_make_ready(substream)) < 0) return err; - snd_pcm_kernel_ioctl(substream, SNDRV_PCM_IOCTL_START, NULL); + snd_pcm_kernel_playback_ioctl(substream, SNDRV_PCM_IOCTL_START, NULL); } /* note: all errors from the start action are ignored */ /* OSS apps do not know, how to handle them */ @@ -1469,13 +980,6 @@ 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); @@ -1529,7 +1033,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(&substream->mmap_count)) + if (atomic_read(&runtime->mmap_count)) goto __direct; if ((err = snd_pcm_oss_make_ready(substream)) < 0) return err; @@ -1590,10 +1094,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->f_flags; - substream->f_flags &= ~O_NONBLOCK; - err = snd_pcm_kernel_ioctl(substream, SNDRV_PCM_IOCTL_DRAIN, NULL); - substream->f_flags = saved_f_flags; + saved_f_flags = substream->ffile->f_flags; + substream->ffile->f_flags &= ~O_NONBLOCK; + err = snd_pcm_kernel_playback_ioctl(substream, SNDRV_PCM_IOCTL_DRAIN, NULL); + substream->ffile->f_flags = saved_f_flags; if (err < 0) return err; runtime->oss.prepare = 1; @@ -1604,7 +1108,7 @@ static int snd_pcm_oss_sync(struct snd_pcm_oss_file *pcm_oss_file) if ((err = snd_pcm_oss_make_ready(substream)) < 0) return err; runtime = substream->runtime; - err = snd_pcm_kernel_ioctl(substream, SNDRV_PCM_IOCTL_DROP, NULL); + err = snd_pcm_kernel_capture_ioctl(substream, SNDRV_PCM_IOCTL_DROP, NULL); if (err < 0) return err; runtime->oss.buffer_used = 0; @@ -1698,10 +1202,12 @@ 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->mmap_count)) + if (atomic_read(&substream->runtime->mmap_count)) { direct = 1; - else - direct = substream->oss.setup.direct; + } else { + struct snd_pcm_oss_setup *setup = substream->oss.setup; + direct = (setup != NULL && setup->direct); + } if (!direct) return AFMT_MU_LAW | AFMT_U8 | AFMT_S16_LE | AFMT_S16_BE | @@ -1731,8 +1237,6 @@ static int snd_pcm_oss_set_format(struct snd_pcm_oss_file *pcm_oss_file, int for if (format != AFMT_QUERY) { formats = snd_pcm_oss_get_formats(pcm_oss_file); - if (formats < 0) - return formats; if (!(formats & format)) format = AFMT_U8; for (idx = 1; idx >= 0; --idx) { @@ -1908,7 +1412,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->mmap_count)) + if (atomic_read(&psubstream->runtime->mmap_count)) snd_pcm_oss_simulate_fill(psubstream, runtime->hw_ptr_interrupt); runtime->oss.trigger = 1; runtime->start_threshold = 1; @@ -1921,7 +1425,7 @@ static int snd_pcm_oss_set_trigger(struct snd_pcm_oss_file *pcm_oss_file, int tr cmd = SNDRV_PCM_IOCTL_DROP; runtime->oss.prepare = 1; } - err = snd_pcm_kernel_ioctl(psubstream, cmd, NULL); + err = snd_pcm_kernel_playback_ioctl(psubstream, cmd, NULL); if (err < 0) return err; } @@ -1942,7 +1446,7 @@ static int snd_pcm_oss_set_trigger(struct snd_pcm_oss_file *pcm_oss_file, int tr cmd = SNDRV_PCM_IOCTL_DROP; runtime->oss.prepare = 1; } - err = snd_pcm_kernel_ioctl(csubstream, cmd, NULL); + err = snd_pcm_kernel_capture_ioctl(csubstream, cmd, NULL); if (err < 0) return err; } @@ -1979,7 +1483,7 @@ static int snd_pcm_oss_get_odelay(struct snd_pcm_oss_file *pcm_oss_file) runtime = substream->runtime; if (runtime->oss.params || runtime->oss.prepare) return 0; - err = snd_pcm_kernel_ioctl(substream, SNDRV_PCM_IOCTL_DELAY, &delay); + err = snd_pcm_kernel_playback_ioctl(substream, SNDRV_PCM_IOCTL_DELAY, &delay); if (err == -EPIPE) delay = 0; /* hack for broken OSS applications */ else if (err < 0) @@ -2026,7 +1530,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(&substream->mmap_count)) { + if (atomic_read(&runtime->mmap_count)) { snd_pcm_sframes_t n; n = (delay = runtime->hw_ptr_interrupt) - runtime->oss.prev_hw_ptr_interrupt; if (n < 0) @@ -2039,7 +1543,8 @@ static int snd_pcm_oss_get_ptr(struct snd_pcm_oss_file *pcm_oss_file, int stream } else { delay = snd_pcm_oss_bytes(substream, delay); if (stream == SNDRV_PCM_STREAM_PLAYBACK) { - if (substream->oss.setup.buggyptr) + struct snd_pcm_oss_setup *setup = substream->oss.setup; + if (setup && setup->buggyptr) info.blocks = (runtime->oss.buffer_bytes - delay - fixup) / runtime->oss.period_bytes; else info.blocks = (delay + fixup) / runtime->oss.period_bytes; @@ -2121,46 +1626,37 @@ static int snd_pcm_oss_get_mapbuf(struct snd_pcm_oss_file *pcm_oss_file, int str return -EINVAL; } -static const char *strip_task_path(const char *path) +static struct snd_pcm_oss_setup *snd_pcm_oss_look_for_setup(struct snd_pcm *pcm, int stream, const char *task_name) { - const char *ptr, *ptrl = NULL; - for (ptr = path; *ptr; ptr++) { + const char *ptr, *ptrl; + struct snd_pcm_oss_setup *setup; + + down(&pcm->streams[stream].oss.setup_mutex); + for (setup = pcm->streams[stream].oss.setup_list; setup; setup = setup->next) { + if (!strcmp(setup->task_name, task_name)) { + up(&pcm->streams[stream].oss.setup_mutex); + return setup; + } + } + ptr = ptrl = task_name; + while (*ptr) { if (*ptr == '/') ptrl = ptr + 1; + ptr++; } - return ptrl; -} - -static void snd_pcm_oss_look_for_setup(struct snd_pcm *pcm, int stream, - const char *task_name, - struct snd_pcm_oss_setup *rsetup) -{ - struct snd_pcm_oss_setup *setup; - - mutex_lock(&pcm->streams[stream].oss.setup_mutex); - do { - for (setup = pcm->streams[stream].oss.setup_list; setup; - setup = setup->next) { - if (!strcmp(setup->task_name, task_name)) - goto out; + if (ptrl == task_name) { + goto __not_found; + return NULL; + } + for (setup = pcm->streams[stream].oss.setup_list; setup; setup = setup->next) { + if (!strcmp(setup->task_name, ptrl)) { + up(&pcm->streams[stream].oss.setup_mutex); + return setup; } - } while ((task_name = strip_task_path(task_name)) != NULL); - out: - if (setup) - *rsetup = *setup; - mutex_unlock(&pcm->streams[stream].oss.setup_mutex); -} - -static void snd_pcm_oss_release_substream(struct snd_pcm_substream *substream) -{ - struct snd_pcm_runtime *runtime; - runtime = substream->runtime; - vfree(runtime->oss.buffer); - runtime->oss.buffer = NULL; -#ifdef CONFIG_SND_PCM_OSS_PLUGINS - snd_pcm_oss_plugin_clear(substream); -#endif - substream->oss.oss = 0; + } + __not_found: + up(&pcm->streams[stream].oss.setup_mutex); + return NULL; } static void snd_pcm_oss_init_substream(struct snd_pcm_substream *substream, @@ -2170,11 +1666,7 @@ static void snd_pcm_oss_init_substream(struct snd_pcm_substream *substream, struct snd_pcm_runtime *runtime; substream->oss.oss = 1; - substream->oss.setup = *setup; - if (setup->nonblock) - substream->f_flags |= O_NONBLOCK; - else if (setup->block) - substream->f_flags &= ~O_NONBLOCK; + substream->oss.setup = setup; runtime = substream->runtime; runtime->oss.params = 1; runtime->oss.trigger = 1; @@ -2193,7 +1685,16 @@ static void snd_pcm_oss_init_substream(struct snd_pcm_substream *substream, runtime->oss.fragshift = 0; runtime->oss.maxfrags = 0; runtime->oss.subdivision = 0; - substream->pcm_release = snd_pcm_oss_release_substream; +} + +static void snd_pcm_oss_release_substream(struct snd_pcm_substream *substream) +{ + struct snd_pcm_runtime *runtime; + runtime = substream->runtime; + vfree(runtime->oss.buffer); + snd_pcm_oss_plugin_clear(substream); + substream->oss.file = NULL; + substream->oss.oss = 0; } static int snd_pcm_oss_release_file(struct snd_pcm_oss_file *pcm_oss_file) @@ -2202,8 +1703,23 @@ static int snd_pcm_oss_release_file(struct snd_pcm_oss_file *pcm_oss_file) snd_assert(pcm_oss_file != NULL, return -ENXIO); for (cidx = 0; cidx < 2; ++cidx) { struct snd_pcm_substream *substream = pcm_oss_file->streams[cidx]; - if (substream) - snd_pcm_release_substream(substream); + struct snd_pcm_runtime *runtime; + if (substream == NULL) + continue; + runtime = substream->runtime; + + snd_pcm_stream_lock_irq(substream); + if (snd_pcm_running(substream)) + snd_pcm_stop(substream, SNDRV_PCM_STATE_SETUP); + snd_pcm_stream_unlock_irq(substream); + if (substream->ffile != NULL) { + if (substream->ops->hw_free != NULL) + substream->ops->hw_free(substream); + substream->ops->close(substream); + substream->ffile = NULL; + } + snd_pcm_oss_release_substream(substream); + snd_pcm_release_substream(substream); } kfree(pcm_oss_file); return 0; @@ -2213,11 +1729,12 @@ static int snd_pcm_oss_open_file(struct file *file, struct snd_pcm *pcm, struct snd_pcm_oss_file **rpcm_oss_file, int minor, - struct snd_pcm_oss_setup *setup) + struct snd_pcm_oss_setup *psetup, + struct snd_pcm_oss_setup *csetup) { - int idx, err; + int err = 0; struct snd_pcm_oss_file *pcm_oss_file; - struct snd_pcm_substream *substream; + struct snd_pcm_substream *psubstream = NULL, *csubstream = NULL; unsigned int f_mode = file->f_mode; snd_assert(rpcm_oss_file != NULL, return -EINVAL); @@ -2230,35 +1747,73 @@ static int snd_pcm_oss_open_file(struct file *file, if ((f_mode & (FMODE_WRITE|FMODE_READ)) == (FMODE_WRITE|FMODE_READ) && (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; - if (! pcm->streams[idx].substream_count) - continue; /* no matching substream */ - if (idx == SNDRV_PCM_STREAM_PLAYBACK) { - if (! (f_mode & FMODE_WRITE)) - continue; - } else { - if (! (f_mode & FMODE_READ)) - continue; - } - err = snd_pcm_open_substream(pcm, idx, file, &substream); - if (err < 0) { + if ((f_mode & FMODE_WRITE) && !(psetup && psetup->disable)) { + if ((err = snd_pcm_open_substream(pcm, SNDRV_PCM_STREAM_PLAYBACK, + &psubstream)) < 0) { snd_pcm_oss_release_file(pcm_oss_file); return err; } - - pcm_oss_file->streams[idx] = substream; - substream->file = pcm_oss_file; - snd_pcm_oss_init_substream(substream, &setup[idx], minor); + pcm_oss_file->streams[SNDRV_PCM_STREAM_PLAYBACK] = psubstream; + } + if ((f_mode & FMODE_READ) && !(csetup && csetup->disable)) { + if ((err = snd_pcm_open_substream(pcm, SNDRV_PCM_STREAM_CAPTURE, + &csubstream)) < 0) { + if (!(f_mode & FMODE_WRITE) || err != -ENODEV) { + snd_pcm_oss_release_file(pcm_oss_file); + return err; + } else { + csubstream = NULL; + } + } + pcm_oss_file->streams[SNDRV_PCM_STREAM_CAPTURE] = csubstream; } - if (!pcm_oss_file->streams[0] && !pcm_oss_file->streams[1]) { + if (psubstream == NULL && csubstream == NULL) { snd_pcm_oss_release_file(pcm_oss_file); return -EINVAL; } + if (psubstream != NULL) { + psubstream->oss.file = pcm_oss_file; + err = snd_pcm_hw_constraints_init(psubstream); + if (err < 0) { + snd_printd("snd_pcm_hw_constraint_init failed\n"); + snd_pcm_oss_release_file(pcm_oss_file); + return err; + } + if ((err = psubstream->ops->open(psubstream)) < 0) { + snd_pcm_oss_release_file(pcm_oss_file); + return err; + } + psubstream->ffile = file; + err = snd_pcm_hw_constraints_complete(psubstream); + if (err < 0) { + snd_printd("snd_pcm_hw_constraint_complete failed\n"); + snd_pcm_oss_release_file(pcm_oss_file); + return err; + } + snd_pcm_oss_init_substream(psubstream, psetup, minor); + } + if (csubstream != NULL) { + csubstream->oss.file = pcm_oss_file; + err = snd_pcm_hw_constraints_init(csubstream); + if (err < 0) { + snd_printd("snd_pcm_hw_constraint_init failed\n"); + snd_pcm_oss_release_file(pcm_oss_file); + return err; + } + if ((err = csubstream->ops->open(csubstream)) < 0) { + snd_pcm_oss_release_file(pcm_oss_file); + return err; + } + csubstream->ffile = file; + err = snd_pcm_hw_constraints_complete(csubstream); + if (err < 0) { + snd_printd("snd_pcm_hw_constraint_complete failed\n"); + snd_pcm_oss_release_file(pcm_oss_file); + return err; + } + snd_pcm_oss_init_substream(csubstream, csetup, minor); + } file->private_data = pcm_oss_file; *rpcm_oss_file = pcm_oss_file; @@ -2283,7 +1838,7 @@ static int snd_pcm_oss_open(struct inode *inode, struct file *file) char task_name[32]; struct snd_pcm *pcm; struct snd_pcm_oss_file *pcm_oss_file; - struct snd_pcm_oss_setup setup[2]; + struct snd_pcm_oss_setup *psetup = NULL, *csetup = NULL; int nonblock; wait_queue_t wait; @@ -2304,24 +1859,32 @@ static int snd_pcm_oss_open(struct inode *inode, struct file *file) err = -EFAULT; goto __error; } - memset(setup, 0, sizeof(setup)); if (file->f_mode & FMODE_WRITE) - snd_pcm_oss_look_for_setup(pcm, SNDRV_PCM_STREAM_PLAYBACK, - task_name, &setup[0]); + psetup = snd_pcm_oss_look_for_setup(pcm, SNDRV_PCM_STREAM_PLAYBACK, task_name); if (file->f_mode & FMODE_READ) - snd_pcm_oss_look_for_setup(pcm, SNDRV_PCM_STREAM_CAPTURE, - task_name, &setup[1]); + csetup = snd_pcm_oss_look_for_setup(pcm, SNDRV_PCM_STREAM_CAPTURE, task_name); nonblock = !!(file->f_flags & O_NONBLOCK); + if (psetup && !psetup->disable) { + if (psetup->nonblock) + nonblock = 1; + else if (psetup->block) + nonblock = 0; + } else if (csetup && !csetup->disable) { + if (csetup->nonblock) + nonblock = 1; + else if (csetup->block) + nonblock = 0; + } if (!nonblock) nonblock = nonblock_open; init_waitqueue_entry(&wait, current); add_wait_queue(&pcm->open_wait, &wait); - mutex_lock(&pcm->open_mutex); + down(&pcm->open_mutex); while (1) { err = snd_pcm_oss_open_file(file, pcm, &pcm_oss_file, - iminor(inode), setup); + iminor(inode), psetup, csetup); if (err >= 0) break; if (err == -EAGAIN) { @@ -2332,16 +1895,16 @@ static int snd_pcm_oss_open(struct inode *inode, struct file *file) } else break; set_current_state(TASK_INTERRUPTIBLE); - mutex_unlock(&pcm->open_mutex); + up(&pcm->open_mutex); schedule(); - mutex_lock(&pcm->open_mutex); + down(&pcm->open_mutex); if (signal_pending(current)) { err = -ERESTARTSYS; break; } } remove_wait_queue(&pcm->open_wait, &wait); - mutex_unlock(&pcm->open_mutex); + up(&pcm->open_mutex); if (err < 0) goto __error; return err; @@ -2367,9 +1930,9 @@ static int snd_pcm_oss_release(struct inode *inode, struct file *file) snd_assert(substream != NULL, return -ENXIO); pcm = substream->pcm; snd_pcm_oss_sync(pcm_oss_file); - mutex_lock(&pcm->open_mutex); + down(&pcm->open_mutex); snd_pcm_oss_release_file(pcm_oss_file); - mutex_unlock(&pcm->open_mutex); + up(&pcm->open_mutex); wake_up(&pcm->open_wait); module_put(pcm->card->module); snd_card_file_remove(pcm->card, file); @@ -2551,7 +2114,6 @@ 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 @@ -2573,7 +2135,6 @@ 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); @@ -2584,7 +2145,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(&substream->mmap_count)) + if (atomic_read(&runtime->mmap_count)) return runtime->oss.prev_hw_ptr_interrupt != runtime->hw_ptr_interrupt; else return snd_pcm_playback_avail(runtime) >= runtime->oss.period_frames; @@ -2593,7 +2154,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(&substream->mmap_count)) + if (atomic_read(&runtime->mmap_count)) return runtime->oss.prev_hw_ptr_interrupt != runtime->hw_ptr_interrupt; else return snd_pcm_capture_avail(runtime) >= runtime->oss.period_frames; @@ -2685,10 +2246,8 @@ static int snd_pcm_oss_mmap(struct file *file, struct vm_area_struct *area) if ((err = snd_pcm_oss_change_params(substream)) < 0) return err; } -#ifdef CONFIG_SND_PCM_OSS_PLUGINS if (runtime->oss.plugin_first != NULL) return -EIO; -#endif if (area->vm_pgoff != 0) return -EINVAL; @@ -2708,7 +2267,7 @@ static int snd_pcm_oss_mmap(struct file *file, struct vm_area_struct *area) return 0; } -#ifdef CONFIG_SND_VERBOSE_PROCFS +#ifdef CONFIG_PROC_FS /* * /proc interface */ @@ -2718,7 +2277,7 @@ static void snd_pcm_oss_proc_read(struct snd_info_entry *entry, { struct snd_pcm_str *pstr = entry->private_data; struct snd_pcm_oss_setup *setup = pstr->oss.setup_list; - mutex_lock(&pstr->oss.setup_mutex); + down(&pstr->oss.setup_mutex); while (setup) { snd_iprintf(buffer, "%s %u %u%s%s%s%s%s%s\n", setup->task_name, @@ -2732,13 +2291,18 @@ static void snd_pcm_oss_proc_read(struct snd_info_entry *entry, setup->nosilence ? " no-silence" : ""); setup = setup->next; } - mutex_unlock(&pstr->oss.setup_mutex); + up(&pstr->oss.setup_mutex); } static void snd_pcm_oss_proc_free_setup_list(struct snd_pcm_str * pstr) { + unsigned int idx; + struct snd_pcm_substream *substream; struct snd_pcm_oss_setup *setup, *setupn; + for (idx = 0, substream = pstr->substream; + idx < pstr->substream_count; idx++, substream = substream->next) + substream->oss.setup = NULL; for (setup = pstr->oss.setup_list, pstr->oss.setup_list = NULL; setup; setup = setupn) { setupn = setup->next; @@ -2757,12 +2321,12 @@ static void snd_pcm_oss_proc_write(struct snd_info_entry *entry, struct snd_pcm_oss_setup *setup, *setup1, template; while (!snd_info_get_line(buffer, line, sizeof(line))) { - mutex_lock(&pstr->oss.setup_mutex); + down(&pstr->oss.setup_mutex); memset(&template, 0, sizeof(template)); ptr = snd_info_get_str(task_name, line, sizeof(task_name)); if (!strcmp(task_name, "clear") || !strcmp(task_name, "erase")) { snd_pcm_oss_proc_free_setup_list(pstr); - mutex_unlock(&pstr->oss.setup_mutex); + up(&pstr->oss.setup_mutex); continue; } for (setup = pstr->oss.setup_list; setup; setup = setup->next) { @@ -2799,29 +2363,22 @@ static void snd_pcm_oss_proc_write(struct snd_info_entry *entry, } } while (*str); if (setup == NULL) { - setup = kmalloc(sizeof(*setup), GFP_KERNEL); - if (! setup) { - buffer->error = -ENOMEM; - mutex_lock(&pstr->oss.setup_mutex); - return; - } - if (pstr->oss.setup_list == NULL) - pstr->oss.setup_list = setup; - else { - for (setup1 = pstr->oss.setup_list; - setup1->next; setup1 = setup1->next); - setup1->next = setup; - } - template.task_name = kstrdup(task_name, GFP_KERNEL); - if (! template.task_name) { - kfree(setup); + setup = kmalloc(sizeof(struct snd_pcm_oss_setup), GFP_KERNEL); + if (setup) { + if (pstr->oss.setup_list == NULL) { + pstr->oss.setup_list = setup; + } else { + for (setup1 = pstr->oss.setup_list; setup1->next; setup1 = setup1->next); + setup1->next = setup; + } + template.task_name = kstrdup(task_name, GFP_KERNEL); + } else { buffer->error = -ENOMEM; - mutex_lock(&pstr->oss.setup_mutex); - return; } } - *setup = template; - mutex_unlock(&pstr->oss.setup_mutex); + if (setup) + *setup = template; + up(&pstr->oss.setup_mutex); } } @@ -2836,7 +2393,9 @@ 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) { @@ -2860,10 +2419,10 @@ static void snd_pcm_oss_proc_done(struct snd_pcm *pcm) } } } -#else /* !CONFIG_SND_VERBOSE_PROCFS */ +#else /* !CONFIG_PROC_FS */ #define snd_pcm_oss_proc_init(pcm) #define snd_pcm_oss_proc_done(pcm) -#endif /* CONFIG_SND_VERBOSE_PROCFS */ +#endif /* CONFIG_PROC_FS */ /* * ENTRY functions diff --git a/sound/core/oss/pcm_plugin.c b/sound/core/oss/pcm_plugin.c index 0e67dd280..7e8676880 100644 --- a/sound/core/oss/pcm_plugin.c +++ b/sound/core/oss/pcm_plugin.c @@ -25,9 +25,6 @@ #endif #include - -#ifdef CONFIG_SND_PCM_OSS_PLUGINS - #include #include #include @@ -39,6 +36,26 @@ #define snd_pcm_plug_first(plug) ((plug)->runtime->oss.plugin_first) #define snd_pcm_plug_last(plug) ((plug)->runtime->oss.plugin_last) +static int snd_pcm_plugin_src_channels_mask(struct snd_pcm_plugin *plugin, + unsigned long *dst_vmask, + unsigned long **src_vmask) +{ + unsigned long *vmask = plugin->src_vmask; + bitmap_copy(vmask, dst_vmask, plugin->src_format.channels); + *src_vmask = vmask; + return 0; +} + +static int snd_pcm_plugin_dst_channels_mask(struct snd_pcm_plugin *plugin, + unsigned long *src_vmask, + unsigned long **dst_vmask) +{ + unsigned long *vmask = plugin->dst_vmask; + bitmap_copy(vmask, src_vmask, plugin->dst_format.channels); + *dst_vmask = vmask; + return 0; +} + /* * because some cards might have rates "very close", we ignore * all "resampling" requests within +-5% @@ -176,7 +193,19 @@ int snd_pcm_plugin_build(struct snd_pcm_substream *plug, snd_pcm_plugin_free(plugin); return -ENOMEM; } + plugin->src_vmask = bitmap_alloc(src_format->channels); + if (plugin->src_vmask == NULL) { + snd_pcm_plugin_free(plugin); + return -ENOMEM; + } + plugin->dst_vmask = bitmap_alloc(dst_format->channels); + if (plugin->dst_vmask == NULL) { + snd_pcm_plugin_free(plugin); + return -ENOMEM; + } plugin->client_channels = snd_pcm_plugin_client_channels; + plugin->src_channels_mask = snd_pcm_plugin_src_channels_mask; + plugin->dst_channels_mask = snd_pcm_plugin_dst_channels_mask; *ret = plugin; return 0; } @@ -189,6 +218,8 @@ int snd_pcm_plugin_free(struct snd_pcm_plugin *plugin) plugin->private_free(plugin); kfree(plugin->buf_channels); vfree(plugin->buf); + kfree(plugin->src_vmask); + kfree(plugin->dst_vmask); kfree(plugin); return 0; } @@ -398,14 +429,24 @@ int snd_pcm_plug_format_plugins(struct snd_pcm_substream *plug, dstformat.channels); /* Format change (linearization) */ - if (! rate_match(srcformat.rate, dstformat.rate) && - ! snd_pcm_format_linear(srcformat.format)) { - if (srcformat.format != SNDRV_PCM_FORMAT_MU_LAW) + if ((srcformat.format != dstformat.format || + !rate_match(srcformat.rate, dstformat.rate) || + srcformat.channels != dstformat.channels) && + !snd_pcm_format_linear(srcformat.format)) { + if (snd_pcm_format_linear(dstformat.format)) + tmpformat.format = dstformat.format; + else + tmpformat.format = SNDRV_PCM_FORMAT_S16; + switch (srcformat.format) { + case SNDRV_PCM_FORMAT_MU_LAW: + err = snd_pcm_plugin_build_mulaw(plug, + &srcformat, &tmpformat, + &plugin); + break; + default: return -EINVAL; - tmpformat.format = SNDRV_PCM_FORMAT_S16; - err = snd_pcm_plugin_build_mulaw(plug, - &srcformat, &tmpformat, - &plugin); + } + pdprintf("format change: src=%i, dst=%i returns %i\n", srcformat.format, tmpformat.format, err); if (err < 0) return err; err = snd_pcm_plugin_append(plugin); @@ -419,11 +460,35 @@ int snd_pcm_plug_format_plugins(struct snd_pcm_substream *plug, /* channels reduction */ if (srcformat.channels > dstformat.channels) { + int sv = srcformat.channels; + int dv = dstformat.channels; + int *ttable = kcalloc(dv * sv, sizeof(*ttable), GFP_KERNEL); + if (ttable == NULL) + return -ENOMEM; +#if 1 + if (sv == 2 && dv == 1) { + ttable[0] = HALF; + ttable[1] = HALF; + } else +#endif + { + int v; + for (v = 0; v < dv; ++v) + ttable[v * sv + v] = FULL; + } tmpformat.channels = dstformat.channels; - err = snd_pcm_plugin_build_route(plug, &srcformat, &tmpformat, &plugin); + if (rate_match(srcformat.rate, dstformat.rate) && + snd_pcm_format_linear(dstformat.format)) + tmpformat.format = dstformat.format; + err = snd_pcm_plugin_build_route(plug, + &srcformat, &tmpformat, + ttable, &plugin); + kfree(ttable); pdprintf("channels reduction: src=%i, dst=%i returns %i\n", srcformat.channels, tmpformat.channels, err); - if (err < 0) + if (err < 0) { + snd_pcm_plugin_free(plugin); return err; + } err = snd_pcm_plugin_append(plugin); if (err < 0) { snd_pcm_plugin_free(plugin); @@ -435,29 +500,18 @@ int snd_pcm_plug_format_plugins(struct snd_pcm_substream *plug, /* rate resampling */ if (!rate_match(srcformat.rate, dstformat.rate)) { - if (srcformat.format != SNDRV_PCM_FORMAT_S16) { - /* convert to S16 for resampling */ - tmpformat.format = SNDRV_PCM_FORMAT_S16; - err = snd_pcm_plugin_build_linear(plug, - &srcformat, &tmpformat, - &plugin); - if (err < 0) - return err; - err = snd_pcm_plugin_append(plugin); - if (err < 0) { - snd_pcm_plugin_free(plugin); - return err; - } - srcformat = tmpformat; - src_access = dst_access; - } tmpformat.rate = dstformat.rate; + if (srcformat.channels == dstformat.channels && + snd_pcm_format_linear(dstformat.format)) + tmpformat.format = dstformat.format; err = snd_pcm_plugin_build_rate(plug, &srcformat, &tmpformat, &plugin); pdprintf("rate down resampling: src=%i, dst=%i returns %i\n", srcformat.rate, tmpformat.rate, err); - if (err < 0) + if (err < 0) { + snd_pcm_plugin_free(plugin); return err; + } err = snd_pcm_plugin_append(plugin); if (err < 0) { snd_pcm_plugin_free(plugin); @@ -467,11 +521,56 @@ int snd_pcm_plug_format_plugins(struct snd_pcm_substream *plug, src_access = dst_access; } + /* channels extension */ + if (srcformat.channels < dstformat.channels) { + int sv = srcformat.channels; + int dv = dstformat.channels; + int *ttable = kcalloc(dv * sv, sizeof(*ttable), GFP_KERNEL); + if (ttable == NULL) + return -ENOMEM; +#if 0 + { + int v; + for (v = 0; v < sv; ++v) + ttable[v * sv + v] = FULL; + } +#else + { + /* Playback is spreaded on all channels */ + int vd, vs; + for (vd = 0, vs = 0; vd < dv; ++vd) { + ttable[vd * sv + vs] = FULL; + vs++; + if (vs == sv) + vs = 0; + } + } +#endif + tmpformat.channels = dstformat.channels; + if (snd_pcm_format_linear(dstformat.format)) + tmpformat.format = dstformat.format; + err = snd_pcm_plugin_build_route(plug, + &srcformat, &tmpformat, + ttable, &plugin); + kfree(ttable); + pdprintf("channels extension: src=%i, dst=%i returns %i\n", srcformat.channels, tmpformat.channels, err); + if (err < 0) { + snd_pcm_plugin_free(plugin); + return err; + } + err = snd_pcm_plugin_append(plugin); + if (err < 0) { + snd_pcm_plugin_free(plugin); + return err; + } + srcformat = tmpformat; + src_access = dst_access; + } + /* format change */ if (srcformat.format != dstformat.format) { tmpformat.format = dstformat.format; - if (srcformat.format == SNDRV_PCM_FORMAT_MU_LAW || - tmpformat.format == SNDRV_PCM_FORMAT_MU_LAW) { + if (tmpformat.format == SNDRV_PCM_FORMAT_MU_LAW) { err = snd_pcm_plugin_build_mulaw(plug, &srcformat, &tmpformat, &plugin); @@ -496,22 +595,6 @@ int snd_pcm_plug_format_plugins(struct snd_pcm_substream *plug, src_access = dst_access; } - /* channels extension */ - if (srcformat.channels < dstformat.channels) { - tmpformat.channels = dstformat.channels; - err = snd_pcm_plugin_build_route(plug, &srcformat, &tmpformat, &plugin); - pdprintf("channels extension: src=%i, dst=%i returns %i\n", srcformat.channels, tmpformat.channels, err); - if (err < 0) - return err; - err = snd_pcm_plugin_append(plugin); - if (err < 0) { - snd_pcm_plugin_free(plugin); - return err; - } - srcformat = tmpformat; - src_access = dst_access; - } - /* de-interleave */ if (src_access != dst_access) { err = snd_pcm_plugin_build_copy(plug, @@ -567,6 +650,92 @@ snd_pcm_sframes_t snd_pcm_plug_client_channels_buf(struct snd_pcm_substream *plu return count; } +static int snd_pcm_plug_playback_channels_mask(struct snd_pcm_substream *plug, + unsigned long *client_vmask) +{ + struct snd_pcm_plugin *plugin = snd_pcm_plug_last(plug); + if (plugin == NULL) { + return 0; + } else { + int schannels = plugin->dst_format.channels; + DECLARE_BITMAP(bs, schannels); + unsigned long *srcmask; + unsigned long *dstmask = bs; + int err; + bitmap_fill(dstmask, schannels); + + while (1) { + err = plugin->src_channels_mask(plugin, dstmask, &srcmask); + if (err < 0) + return err; + dstmask = srcmask; + if (plugin->prev == NULL) + break; + plugin = plugin->prev; + } + bitmap_and(client_vmask, client_vmask, dstmask, plugin->src_format.channels); + return 0; + } +} + +static int snd_pcm_plug_playback_disable_useless_channels(struct snd_pcm_substream *plug, + struct snd_pcm_plugin_channel *src_channels) +{ + struct snd_pcm_plugin *plugin = snd_pcm_plug_first(plug); + unsigned int nchannels = plugin->src_format.channels; + DECLARE_BITMAP(bs, nchannels); + unsigned long *srcmask = bs; + int err; + unsigned int channel; + for (channel = 0; channel < nchannels; channel++) { + if (src_channels[channel].enabled) + set_bit(channel, srcmask); + else + clear_bit(channel, srcmask); + } + err = snd_pcm_plug_playback_channels_mask(plug, srcmask); + if (err < 0) + return err; + for (channel = 0; channel < nchannels; channel++) { + if (!test_bit(channel, srcmask)) + src_channels[channel].enabled = 0; + } + return 0; +} + +static int snd_pcm_plug_capture_disable_useless_channels(struct snd_pcm_substream *plug, + struct snd_pcm_plugin_channel *src_channels, + struct snd_pcm_plugin_channel *client_channels) +{ + struct snd_pcm_plugin *plugin = snd_pcm_plug_last(plug); + unsigned int nchannels = plugin->dst_format.channels; + DECLARE_BITMAP(bs, nchannels); + unsigned long *dstmask = bs; + unsigned long *srcmask; + int err; + unsigned int channel; + for (channel = 0; channel < nchannels; channel++) { + if (client_channels[channel].enabled) + set_bit(channel, dstmask); + else + clear_bit(channel, dstmask); + } + while (plugin) { + err = plugin->src_channels_mask(plugin, dstmask, &srcmask); + if (err < 0) + return err; + dstmask = srcmask; + plugin = plugin->prev; + } + plugin = snd_pcm_plug_first(plug); + nchannels = plugin->src_format.channels; + for (channel = 0; channel < nchannels; channel++) { + if (!test_bit(channel, dstmask)) + src_channels[channel].enabled = 0; + } + return 0; +} + snd_pcm_sframes_t snd_pcm_plug_write_transfer(struct snd_pcm_substream *plug, struct snd_pcm_plugin_channel *src_channels, snd_pcm_uframes_t size) { struct snd_pcm_plugin *plugin, *next; @@ -574,6 +743,9 @@ snd_pcm_sframes_t snd_pcm_plug_write_transfer(struct snd_pcm_substream *plug, st int err; snd_pcm_sframes_t frames = size; + if ((err = snd_pcm_plug_playback_disable_useless_channels(plug, src_channels)) < 0) + return err; + plugin = snd_pcm_plug_first(plug); while (plugin && frames > 0) { if ((next = plugin->next) != NULL) { @@ -618,6 +790,10 @@ snd_pcm_sframes_t snd_pcm_plug_read_transfer(struct snd_pcm_substream *plug, str return err; } frames = err; + if (!plugin->prev) { + if ((err = snd_pcm_plug_capture_disable_useless_channels(plug, dst_channels, dst_channels_final)) < 0) + return err; + } } else { dst_channels = dst_channels_final; } @@ -740,5 +916,3 @@ int snd_pcm_area_copy(const struct snd_pcm_channel_area *src_area, size_t src_of } return 0; } - -#endif diff --git a/sound/core/oss/pcm_plugin.h b/sound/core/oss/pcm_plugin.h index 3be91b3d5..29198da61 100644 --- a/sound/core/oss/pcm_plugin.h +++ b/sound/core/oss/pcm_plugin.h @@ -22,7 +22,12 @@ * */ -#ifdef CONFIG_SND_PCM_OSS_PLUGINS +#include + +static inline unsigned long *bitmap_alloc(unsigned int nbits) +{ + return kmalloc(BITS_TO_LONGS(nbits), GFP_KERNEL); +} #define snd_pcm_plug_stream(plug) ((plug)->stream) @@ -64,6 +69,12 @@ struct snd_pcm_plugin { snd_pcm_sframes_t (*client_channels)(struct snd_pcm_plugin *plugin, snd_pcm_uframes_t frames, struct snd_pcm_plugin_channel **channels); + int (*src_channels_mask)(struct snd_pcm_plugin *plugin, + unsigned long *dst_vmask, + unsigned long **src_vmask); + int (*dst_channels_mask)(struct snd_pcm_plugin *plugin, + unsigned long *src_vmask, + unsigned long **dst_vmask); snd_pcm_sframes_t (*transfer)(struct snd_pcm_plugin *plugin, const struct snd_pcm_plugin_channel *src_channels, struct snd_pcm_plugin_channel *dst_channels, @@ -79,6 +90,8 @@ struct snd_pcm_plugin { char *buf; snd_pcm_uframes_t buf_frames; struct snd_pcm_plugin_channel *buf_channels; + unsigned long *src_vmask; + unsigned long *dst_vmask; char extra_data[0]; }; @@ -115,6 +128,7 @@ int snd_pcm_plugin_build_rate(struct snd_pcm_substream *handle, int snd_pcm_plugin_build_route(struct snd_pcm_substream *handle, struct snd_pcm_plugin_format *src_format, struct snd_pcm_plugin_format *dst_format, + int *ttable, struct snd_pcm_plugin **r_plugin); int snd_pcm_plugin_build_copy(struct snd_pcm_substream *handle, struct snd_pcm_plugin_format *src_format, @@ -167,13 +181,15 @@ snd_pcm_sframes_t snd_pcm_oss_readv3(struct snd_pcm_substream *substream, void **bufs, snd_pcm_uframes_t frames, int in_kernel); -#else +#define ROUTE_PLUGIN_RESOLUTION 16 -static inline snd_pcm_sframes_t snd_pcm_plug_client_size(struct snd_pcm_substream *handle, snd_pcm_uframes_t drv_size) { return drv_size; } -static inline snd_pcm_sframes_t snd_pcm_plug_slave_size(struct snd_pcm_substream *handle, snd_pcm_uframes_t clt_size) { return clt_size; } -static inline int snd_pcm_plug_slave_format(int format, struct snd_mask *format_mask) { return format; } +int getput_index(int format); +int copy_index(int format); +int conv_index(int src_format, int dst_format); -#endif +void zero_channel(struct snd_pcm_plugin *plugin, + const struct snd_pcm_plugin_channel *dst_channel, + size_t samples); #ifdef PLUGIN_DEBUG #define pdprintf( fmt, args... ) printk( "plugin: " fmt, ##args) diff --git a/sound/core/oss/plugin_ops.h b/sound/core/oss/plugin_ops.h index 1f5bde463..0607e9566 100644 --- a/sound/core/oss/plugin_ops.h +++ b/sound/core/oss/plugin_ops.h @@ -362,6 +362,172 @@ put_s16_xx12_0029: as_u32(dst) = (u_int32_t)swab16(sample) ^ 0x80; goto PUT_S16_ } #endif +#if 0 +#ifdef GET32_LABELS +/* src_wid src_endswap unsigned */ +static void *get32_labels[4 * 2 * 2] = { + &&get32_xxx1_1000, /* 8h -> 32h */ + &&get32_xxx1_9000, /* 8h ^> 32h */ + &&get32_xxx1_1000, /* 8s -> 32h */ + &&get32_xxx1_9000, /* 8s ^> 32h */ + &&get32_xx12_1200, /* 16h -> 32h */ + &&get32_xx12_9200, /* 16h ^> 32h */ + &&get32_xx12_2100, /* 16s -> 32h */ + &&get32_xx12_A100, /* 16s ^> 32h */ + &&get32_x123_1230, /* 24h -> 32h */ + &&get32_x123_9230, /* 24h ^> 32h */ + &&get32_123x_3210, /* 24s -> 32h */ + &&get32_123x_B210, /* 24s ^> 32h */ + &&get32_1234_1234, /* 32h -> 32h */ + &&get32_1234_9234, /* 32h ^> 32h */ + &&get32_1234_4321, /* 32s -> 32h */ + &&get32_1234_C321, /* 32s ^> 32h */ +}; +#endif + +#ifdef GET32_END +while (0) { +get32_xxx1_1000: sample = (u_int32_t)as_u8(src) << 24; goto GET32_END; +get32_xxx1_9000: sample = (u_int32_t)(as_u8(src) ^ 0x80) << 24; goto GET32_END; +get32_xx12_1200: sample = (u_int32_t)as_u16(src) << 16; goto GET32_END; +get32_xx12_9200: sample = (u_int32_t)(as_u16(src) ^ 0x8000) << 16; goto GET32_END; +get32_xx12_2100: sample = (u_int32_t)swab16(as_u16(src)) << 16; goto GET32_END; +get32_xx12_A100: sample = (u_int32_t)swab16(as_u16(src) ^ 0x80) << 16; goto GET32_END; +get32_x123_1230: sample = as_u32(src) << 8; goto GET32_END; +get32_x123_9230: sample = (as_u32(src) << 8) ^ 0x80000000; goto GET32_END; +get32_123x_3210: sample = swab32(as_u32(src) >> 8); goto GET32_END; +get32_123x_B210: sample = swab32((as_u32(src) >> 8) ^ 0x80); goto GET32_END; +get32_1234_1234: sample = as_u32(src); goto GET32_END; +get32_1234_9234: sample = as_u32(src) ^ 0x80000000; goto GET32_END; +get32_1234_4321: sample = swab32(as_u32(src)); goto GET32_END; +get32_1234_C321: sample = swab32(as_u32(src) ^ 0x80); goto GET32_END; +} +#endif +#endif + +#ifdef PUT_U32_LABELS +/* dst_wid dst_endswap unsigned */ +static void *put_u32_labels[4 * 2 * 2] = { + &&put_u32_1234_xxx9, /* u32h -> s8h */ + &&put_u32_1234_xxx1, /* u32h -> u8h */ + &&put_u32_1234_xxx9, /* u32h -> s8s */ + &&put_u32_1234_xxx1, /* u32h -> u8s */ + &&put_u32_1234_xx92, /* u32h -> s16h */ + &&put_u32_1234_xx12, /* u32h -> u16h */ + &&put_u32_1234_xx29, /* u32h -> s16s */ + &&put_u32_1234_xx21, /* u32h -> u16s */ + &&put_u32_1234_x923, /* u32h -> s24h */ + &&put_u32_1234_x123, /* u32h -> u24h */ + &&put_u32_1234_329x, /* u32h -> s24s */ + &&put_u32_1234_321x, /* u32h -> u24s */ + &&put_u32_1234_9234, /* u32h -> s32h */ + &&put_u32_1234_1234, /* u32h -> u32h */ + &&put_u32_1234_4329, /* u32h -> s32s */ + &&put_u32_1234_4321, /* u32h -> u32s */ +}; +#endif + +#ifdef PUT_U32_END +while (0) { +put_u32_1234_xxx1: as_u8(dst) = sample >> 24; goto PUT_U32_END; +put_u32_1234_xxx9: as_u8(dst) = (sample >> 24) ^ 0x80; goto PUT_U32_END; +put_u32_1234_xx12: as_u16(dst) = sample >> 16; goto PUT_U32_END; +put_u32_1234_xx92: as_u16(dst) = (sample >> 16) ^ 0x8000; goto PUT_U32_END; +put_u32_1234_xx21: as_u16(dst) = swab16(sample >> 16); goto PUT_U32_END; +put_u32_1234_xx29: as_u16(dst) = swab16(sample >> 16) ^ 0x80; goto PUT_U32_END; +put_u32_1234_x123: as_u32(dst) = sample >> 8; goto PUT_U32_END; +put_u32_1234_x923: as_u32(dst) = (sample >> 8) ^ 0x800000; goto PUT_U32_END; +put_u32_1234_321x: as_u32(dst) = swab32(sample) << 8; goto PUT_U32_END; +put_u32_1234_329x: as_u32(dst) = (swab32(sample) ^ 0x80) << 8; goto PUT_U32_END; +put_u32_1234_1234: as_u32(dst) = sample; goto PUT_U32_END; +put_u32_1234_9234: as_u32(dst) = sample ^ 0x80000000; goto PUT_U32_END; +put_u32_1234_4321: as_u32(dst) = swab32(sample); goto PUT_U32_END; +put_u32_1234_4329: as_u32(dst) = swab32(sample) ^ 0x80; goto PUT_U32_END; +} +#endif + +#ifdef GET_U_LABELS +/* width endswap unsigned*/ +static void *get_u_labels[4 * 2 * 2] = { + &&get_u_s8, /* s8 -> u8 */ + &&get_u_u8, /* u8 -> u8 */ + &&get_u_s8, /* s8 -> u8 */ + &&get_u_u8, /* u8 -> u8 */ + &&get_u_s16h, /* s16h -> u16h */ + &&get_u_u16h, /* u16h -> u16h */ + &&get_u_s16s, /* s16s -> u16h */ + &&get_u_u16s, /* u16s -> u16h */ + &&get_u_s24h, /* s24h -> u32h */ + &&get_u_u24h, /* u24h -> u32h */ + &&get_u_s24s, /* s24s -> u32h */ + &&get_u_u24s, /* u24s -> u32h */ + &&get_u_s32h, /* s32h -> u32h */ + &&get_u_u32h, /* u32h -> u32h */ + &&get_u_s32s, /* s32s -> u32h */ + &&get_u_u32s, /* u32s -> u32h */ +}; +#endif + +#ifdef GET_U_END +while (0) { +get_u_s8: sample = as_u8(src) ^ 0x80; goto GET_U_END; +get_u_u8: sample = as_u8(src); goto GET_U_END; +get_u_s16h: sample = as_u16(src) ^ 0x8000; goto GET_U_END; +get_u_u16h: sample = as_u16(src); goto GET_U_END; +get_u_s16s: sample = swab16(as_u16(src) ^ 0x80); goto GET_U_END; +get_u_u16s: sample = swab16(as_u16(src)); goto GET_U_END; +get_u_s24h: sample = (as_u32(src) ^ 0x800000); goto GET_U_END; +get_u_u24h: sample = as_u32(src); goto GET_U_END; +get_u_s24s: sample = swab32(as_u32(src) ^ 0x800000); goto GET_U_END; +get_u_u24s: sample = swab32(as_u32(src)); goto GET_U_END; +get_u_s32h: sample = as_u32(src) ^ 0x80000000; goto GET_U_END; +get_u_u32h: sample = as_u32(src); goto GET_U_END; +get_u_s32s: sample = swab32(as_u32(src) ^ 0x80); goto GET_U_END; +get_u_u32s: sample = swab32(as_u32(src)); goto GET_U_END; +} +#endif + +#if 0 +#ifdef PUT_LABELS +/* width endswap unsigned */ +static void *put_labels[4 * 2 * 2] = { + &&put_s8, /* s8 -> s8 */ + &&put_u8, /* u8 -> s8 */ + &&put_s8, /* s8 -> s8 */ + &&put_u8, /* u8 -> s8 */ + &&put_s16h, /* s16h -> s16h */ + &&put_u16h, /* u16h -> s16h */ + &&put_s16s, /* s16s -> s16h */ + &&put_u16s, /* u16s -> s16h */ + &&put_s24h, /* s24h -> s32h */ + &&put_u24h, /* u24h -> s32h */ + &&put_s24s, /* s24s -> s32h */ + &&put_u24s, /* u24s -> s32h */ + &&put_s32h, /* s32h -> s32h */ + &&put_u32h, /* u32h -> s32h */ + &&put_s32s, /* s32s -> s32h */ + &&put_u32s, /* u32s -> s32h */ +}; +#endif + +#ifdef PUT_END +put_s8: as_s8(dst) = sample; goto PUT_END; +put_u8: as_u8(dst) = sample ^ 0x80; goto PUT_END; +put_s16h: as_s16(dst) = sample; goto PUT_END; +put_u16h: as_u16(dst) = sample ^ 0x8000; goto PUT_END; +put_s16s: as_s16(dst) = swab16(sample); goto PUT_END; +put_u16s: as_u16(dst) = swab16(sample ^ 0x80); goto PUT_END; +put_s24h: as_s24(dst) = sample & 0xffffff; goto PUT_END; +put_u24h: as_u24(dst) = sample ^ 0x80000000; goto PUT_END; +put_s24s: as_s24(dst) = swab32(sample & 0xffffff); goto PUT_END; +put_u24s: as_u24(dst) = swab32(sample ^ 0x80); goto PUT_END; +put_s32h: as_s32(dst) = sample; goto PUT_END; +put_u32h: as_u32(dst) = sample ^ 0x80000000; goto PUT_END; +put_s32s: as_s32(dst) = swab32(sample); goto PUT_END; +put_u32s: as_u32(dst) = swab32(sample ^ 0x80); goto PUT_END; +#endif +#endif + #undef as_u8 #undef as_u16 #undef as_u32 diff --git a/sound/core/oss/rate.c b/sound/core/oss/rate.c index 18d8a0f4e..4854cef6f 100644 --- a/sound/core/oss/rate.c +++ b/sound/core/oss/rate.c @@ -20,9 +20,6 @@ */ #include - -#ifdef CONFIG_SND_PCM_OSS_PLUGINS - #include #include #include @@ -50,6 +47,7 @@ struct rate_priv { unsigned int pitch; unsigned int pos; rate_f func; + int get, put; snd_pcm_sframes_t old_src_frames, old_dst_frames; struct rate_channel channels[0]; }; @@ -73,12 +71,21 @@ static void resample_expand(struct snd_pcm_plugin *plugin, unsigned int pos = 0; signed int val; signed short S1, S2; - signed short *src, *dst; + char *src, *dst; unsigned int channel; int src_step, dst_step; int src_frames1, dst_frames1; struct rate_priv *data = (struct rate_priv *)plugin->extra_data; struct rate_channel *rchannels = data->channels; + +#define GET_S16_LABELS +#define PUT_S16_LABELS +#include "plugin_ops.h" +#undef GET_S16_LABELS +#undef PUT_S16_LABELS + void *get = get_s16_labels[data->get]; + void *put = put_s16_labels[data->put]; + signed short sample = 0; for (channel = 0; channel < plugin->src_format.channels; channel++) { pos = data->pos; @@ -91,12 +98,10 @@ static void resample_expand(struct snd_pcm_plugin *plugin, continue; } dst_channels[channel].enabled = 1; - src = (signed short *)src_channels[channel].area.addr + - src_channels[channel].area.first / 8 / 2; - dst = (signed short *)dst_channels[channel].area.addr + - dst_channels[channel].area.first / 8 / 2; - src_step = src_channels[channel].area.step / 8 / 2; - dst_step = dst_channels[channel].area.step / 8 / 2; + src = (char *)src_channels[channel].area.addr + src_channels[channel].area.first / 8; + dst = (char *)dst_channels[channel].area.addr + dst_channels[channel].area.first / 8; + src_step = src_channels[channel].area.step / 8; + dst_step = dst_channels[channel].area.step / 8; src_frames1 = src_frames; dst_frames1 = dst_frames; while (dst_frames1-- > 0) { @@ -104,7 +109,12 @@ static void resample_expand(struct snd_pcm_plugin *plugin, pos &= R_MASK; S1 = S2; if (src_frames1-- > 0) { - S2 = *src; + goto *get; +#define GET_S16_END after_get +#include "plugin_ops.h" +#undef GET_S16_END + after_get: + S2 = sample; src += src_step; } } @@ -113,7 +123,12 @@ static void resample_expand(struct snd_pcm_plugin *plugin, val = -32768; else if (val > 32767) val = 32767; - *dst = val; + sample = val; + goto *put; +#define PUT_S16_END after_put +#include "plugin_ops.h" +#undef PUT_S16_END + after_put: dst += dst_step; pos += data->pitch; } @@ -132,12 +147,21 @@ static void resample_shrink(struct snd_pcm_plugin *plugin, unsigned int pos = 0; signed int val; signed short S1, S2; - signed short *src, *dst; + char *src, *dst; unsigned int channel; int src_step, dst_step; int src_frames1, dst_frames1; struct rate_priv *data = (struct rate_priv *)plugin->extra_data; struct rate_channel *rchannels = data->channels; + +#define GET_S16_LABELS +#define PUT_S16_LABELS +#include "plugin_ops.h" +#undef GET_S16_LABELS +#undef PUT_S16_LABELS + void *get = get_s16_labels[data->get]; + void *put = put_s16_labels[data->put]; + signed short sample = 0; for (channel = 0; channel < plugin->src_format.channels; ++channel) { pos = data->pos; @@ -150,18 +174,21 @@ static void resample_shrink(struct snd_pcm_plugin *plugin, continue; } dst_channels[channel].enabled = 1; - src = (signed short *)src_channels[channel].area.addr + - src_channels[channel].area.first / 8 / 2; - dst = (signed short *)dst_channels[channel].area.addr + - dst_channels[channel].area.first / 8 / 2; - src_step = src_channels[channel].area.step / 8 / 2; - dst_step = dst_channels[channel].area.step / 8 / 2; + src = (char *)src_channels[channel].area.addr + src_channels[channel].area.first / 8; + dst = (char *)dst_channels[channel].area.addr + dst_channels[channel].area.first / 8; + src_step = src_channels[channel].area.step / 8; + dst_step = dst_channels[channel].area.step / 8; src_frames1 = src_frames; dst_frames1 = dst_frames; while (dst_frames1 > 0) { S1 = S2; if (src_frames1-- > 0) { - S1 = *src; + goto *get; +#define GET_S16_END after_get +#include "plugin_ops.h" +#undef GET_S16_END + after_get: + S2 = sample; src += src_step; } if (pos & ~R_MASK) { @@ -171,7 +198,12 @@ static void resample_shrink(struct snd_pcm_plugin *plugin, val = -32768; else if (val > 32767) val = 32767; - *dst = val; + sample = val; + goto *put; +#define PUT_S16_END after_put +#include "plugin_ops.h" +#undef PUT_S16_END + after_put: dst += dst_step; dst_frames1--; } @@ -311,8 +343,8 @@ int snd_pcm_plugin_build_rate(struct snd_pcm_substream *plug, snd_assert(src_format->channels == dst_format->channels, return -ENXIO); snd_assert(src_format->channels > 0, return -ENXIO); - snd_assert(src_format->format == SNDRV_PCM_FORMAT_S16, return -ENXIO); - snd_assert(dst_format->format == SNDRV_PCM_FORMAT_S16, return -ENXIO); + snd_assert(snd_pcm_format_linear(src_format->format) != 0, return -ENXIO); + snd_assert(snd_pcm_format_linear(dst_format->format) != 0, return -ENXIO); snd_assert(src_format->rate != dst_format->rate, return -ENXIO); err = snd_pcm_plugin_build(plug, "rate conversion", @@ -323,6 +355,11 @@ int snd_pcm_plugin_build_rate(struct snd_pcm_substream *plug, if (err < 0) return err; data = (struct rate_priv *)plugin->extra_data; + data->get = getput_index(src_format->format); + snd_assert(data->get >= 0 && data->get < 4*2*2, return -EINVAL); + data->put = getput_index(dst_format->format); + snd_assert(data->put >= 0 && data->put < 4*2*2, return -EINVAL); + if (src_format->rate < dst_format->rate) { data->pitch = ((src_format->rate << SHIFT) + (dst_format->rate >> 1)) / dst_format->rate; data->func = resample_expand; @@ -340,5 +377,3 @@ int snd_pcm_plugin_build_rate(struct snd_pcm_substream *plug, *r_plugin = plugin; return 0; } - -#endif diff --git a/sound/core/oss/route.c b/sound/core/oss/route.c index 46917dc01..726c5caa3 100644 --- a/sound/core/oss/route.c +++ b/sound/core/oss/route.c @@ -1,5 +1,5 @@ /* - * Route Plug-In + * Attenuated route Plug-In * Copyright (c) 2000 by Abramo Bagnara * * @@ -20,93 +20,502 @@ */ #include - -#ifdef CONFIG_SND_PCM_OSS_PLUGINS - #include #include #include #include #include "pcm_plugin.h" -static void zero_areas(struct snd_pcm_plugin_channel *dvp, int ndsts, - snd_pcm_uframes_t frames, int format) +/* The best possible hack to support missing optimization in gcc 2.7.2.3 */ +#if ROUTE_PLUGIN_RESOLUTION & (ROUTE_PLUGIN_RESOLUTION - 1) != 0 +#define div(a) a /= ROUTE_PLUGIN_RESOLUTION +#elif ROUTE_PLUGIN_RESOLUTION == 16 +#define div(a) a >>= 4 +#else +#error "Add some code here" +#endif + +struct ttable_dst; + +typedef void (*route_channel_f)(struct snd_pcm_plugin *plugin, + const struct snd_pcm_plugin_channel *src_channels, + struct snd_pcm_plugin_channel *dst_channel, + struct ttable_dst *ttable, snd_pcm_uframes_t frames); + +struct ttable_src { + int channel; + int as_int; +}; + +struct ttable_dst { + int att; /* Attenuated */ + unsigned int nsrcs; + struct ttable_src *srcs; + route_channel_f func; +}; + +struct route_priv { + enum {R_UINT32=0, R_UINT64=1} sum_type; + int get, put; + int conv; + int src_sample_size; + struct ttable_dst ttable[0]; +}; + +union sum { + u_int32_t as_uint32; + u_int64_t as_uint64; +}; + + +static void route_to_channel_from_zero(struct snd_pcm_plugin *plugin, + const struct snd_pcm_plugin_channel *src_channels, + struct snd_pcm_plugin_channel *dst_channel, + struct ttable_dst *ttable, + snd_pcm_uframes_t frames) { - int dst = 0; - for (; dst < ndsts; ++dst) { - if (dvp->wanted) - snd_pcm_area_silence(&dvp->area, 0, frames, format); - dvp->enabled = 0; - dvp++; + if (dst_channel->wanted) + snd_pcm_area_silence(&dst_channel->area, 0, frames, plugin->dst_format.format); + dst_channel->enabled = 0; +} + +static void route_to_channel_from_one(struct snd_pcm_plugin *plugin, + const struct snd_pcm_plugin_channel *src_channels, + struct snd_pcm_plugin_channel *dst_channel, + struct ttable_dst *ttable, + snd_pcm_uframes_t frames) +{ +#define CONV_LABELS +#include "plugin_ops.h" +#undef CONV_LABELS + struct route_priv *data = (struct route_priv *)plugin->extra_data; + void *conv; + const struct snd_pcm_plugin_channel *src_channel = NULL; + unsigned int srcidx; + char *src, *dst; + int src_step, dst_step; + for (srcidx = 0; srcidx < ttable->nsrcs; ++srcidx) { + src_channel = &src_channels[ttable->srcs[srcidx].channel]; + if (src_channel->area.addr != NULL) + break; + } + if (srcidx == ttable->nsrcs) { + route_to_channel_from_zero(plugin, src_channels, dst_channel, ttable, frames); + return; + } + + dst_channel->enabled = 1; + conv = conv_labels[data->conv]; + src = src_channel->area.addr + src_channel->area.first / 8; + src_step = src_channel->area.step / 8; + dst = dst_channel->area.addr + dst_channel->area.first / 8; + dst_step = dst_channel->area.step / 8; + while (frames-- > 0) { + goto *conv; +#define CONV_END after +#include "plugin_ops.h" +#undef CONV_END + after: + src += src_step; + dst += dst_step; } } -static inline void copy_area(const struct snd_pcm_plugin_channel *src_channel, +static void route_to_channel(struct snd_pcm_plugin *plugin, + const struct snd_pcm_plugin_channel *src_channels, struct snd_pcm_plugin_channel *dst_channel, - snd_pcm_uframes_t frames, int format) + struct ttable_dst *ttable, snd_pcm_uframes_t frames) { +#define GET_U_LABELS +#define PUT_U32_LABELS +#include "plugin_ops.h" +#undef GET_U_LABELS +#undef PUT_U32_LABELS + static void *zero_labels[2] = { &&zero_int32, &&zero_int64 }; + /* sum_type att */ + static void *add_labels[2 * 2] = { &&add_int32_noatt, &&add_int32_att, + &&add_int64_noatt, &&add_int64_att, + }; + /* sum_type att shift */ + static void *norm_labels[2 * 2 * 4] = { NULL, + &&norm_int32_8_noatt, + &&norm_int32_16_noatt, + &&norm_int32_24_noatt, + NULL, + &&norm_int32_8_att, + &&norm_int32_16_att, + &&norm_int32_24_att, + &&norm_int64_0_noatt, + &&norm_int64_8_noatt, + &&norm_int64_16_noatt, + &&norm_int64_24_noatt, + &&norm_int64_0_att, + &&norm_int64_8_att, + &&norm_int64_16_att, + &&norm_int64_24_att, + }; + struct route_priv *data = (struct route_priv *)plugin->extra_data; + void *zero, *get, *add, *norm, *put_u32; + int nsrcs = ttable->nsrcs; + char *dst; + int dst_step; + char *srcs[nsrcs]; + int src_steps[nsrcs]; + struct ttable_src src_tt[nsrcs]; + u_int32_t sample = 0; + int srcidx, srcidx1 = 0; + for (srcidx = 0; srcidx < nsrcs; ++srcidx) { + const struct snd_pcm_plugin_channel *src_channel = &src_channels[ttable->srcs[srcidx].channel]; + if (!src_channel->enabled) + continue; + srcs[srcidx1] = src_channel->area.addr + src_channel->area.first / 8; + src_steps[srcidx1] = src_channel->area.step / 8; + src_tt[srcidx1] = ttable->srcs[srcidx]; + srcidx1++; + } + nsrcs = srcidx1; + if (nsrcs == 0) { + route_to_channel_from_zero(plugin, src_channels, dst_channel, ttable, frames); + return; + } else if (nsrcs == 1 && src_tt[0].as_int == ROUTE_PLUGIN_RESOLUTION) { + route_to_channel_from_one(plugin, src_channels, dst_channel, ttable, frames); + return; + } + dst_channel->enabled = 1; - snd_pcm_area_copy(&src_channel->area, 0, &dst_channel->area, 0, frames, format); + zero = zero_labels[data->sum_type]; + get = get_u_labels[data->get]; + add = add_labels[data->sum_type * 2 + ttable->att]; + norm = norm_labels[data->sum_type * 8 + ttable->att * 4 + 4 - data->src_sample_size]; + put_u32 = put_u32_labels[data->put]; + dst = dst_channel->area.addr + dst_channel->area.first / 8; + dst_step = dst_channel->area.step / 8; + + while (frames-- > 0) { + struct ttable_src *ttp = src_tt; + union sum sum; + + /* Zero sum */ + goto *zero; + zero_int32: + sum.as_uint32 = 0; + goto zero_end; + zero_int64: + sum.as_uint64 = 0; + goto zero_end; + zero_end: + for (srcidx = 0; srcidx < nsrcs; ++srcidx) { + char *src = srcs[srcidx]; + + /* Get sample */ + goto *get; +#define GET_U_END after_get +#include "plugin_ops.h" +#undef GET_U_END + after_get: + + /* Sum */ + goto *add; + add_int32_att: + sum.as_uint32 += sample * ttp->as_int; + goto after_sum; + add_int32_noatt: + if (ttp->as_int) + sum.as_uint32 += sample; + goto after_sum; + add_int64_att: + sum.as_uint64 += (u_int64_t) sample * ttp->as_int; + goto after_sum; + add_int64_noatt: + if (ttp->as_int) + sum.as_uint64 += sample; + goto after_sum; + after_sum: + srcs[srcidx] += src_steps[srcidx]; + ttp++; + } + + /* Normalization */ + goto *norm; + norm_int32_8_att: + sum.as_uint64 = sum.as_uint32; + norm_int64_8_att: + sum.as_uint64 <<= 8; + norm_int64_0_att: + div(sum.as_uint64); + goto norm_int; + + norm_int32_16_att: + sum.as_uint64 = sum.as_uint32; + norm_int64_16_att: + sum.as_uint64 <<= 16; + div(sum.as_uint64); + goto norm_int; + + norm_int32_24_att: + sum.as_uint64 = sum.as_uint32; + norm_int64_24_att: + sum.as_uint64 <<= 24; + div(sum.as_uint64); + goto norm_int; + + norm_int32_8_noatt: + sum.as_uint64 = sum.as_uint32; + norm_int64_8_noatt: + sum.as_uint64 <<= 8; + goto norm_int; + + norm_int32_16_noatt: + sum.as_uint64 = sum.as_uint32; + norm_int64_16_noatt: + sum.as_uint64 <<= 16; + goto norm_int; + + norm_int32_24_noatt: + sum.as_uint64 = sum.as_uint32; + norm_int64_24_noatt: + sum.as_uint64 <<= 24; + goto norm_int; + + norm_int64_0_noatt: + norm_int: + if (sum.as_uint64 > (u_int32_t)0xffffffff) + sample = (u_int32_t)0xffffffff; + else + sample = sum.as_uint64; + goto after_norm; + + after_norm: + + /* Put sample */ + goto *put_u32; +#define PUT_U32_END after_put_u32 +#include "plugin_ops.h" +#undef PUT_U32_END + after_put_u32: + + dst += dst_step; + } +} + +static int route_src_channels_mask(struct snd_pcm_plugin *plugin, + unsigned long *dst_vmask, + unsigned long **src_vmask) +{ + struct route_priv *data = (struct route_priv *)plugin->extra_data; + int schannels = plugin->src_format.channels; + int dchannels = plugin->dst_format.channels; + unsigned long *vmask = plugin->src_vmask; + int channel; + struct ttable_dst *dp = data->ttable; + bitmap_zero(vmask, schannels); + for (channel = 0; channel < dchannels; channel++, dp++) { + unsigned int src; + struct ttable_src *sp; + if (!test_bit(channel, dst_vmask)) + continue; + sp = dp->srcs; + for (src = 0; src < dp->nsrcs; src++, sp++) + set_bit(sp->channel, vmask); + } + *src_vmask = vmask; + return 0; +} + +static int route_dst_channels_mask(struct snd_pcm_plugin *plugin, + unsigned long *src_vmask, + unsigned long **dst_vmask) +{ + struct route_priv *data = (struct route_priv *)plugin->extra_data; + int dchannels = plugin->dst_format.channels; + unsigned long *vmask = plugin->dst_vmask; + int channel; + struct ttable_dst *dp = data->ttable; + bitmap_zero(vmask, dchannels); + for (channel = 0; channel < dchannels; channel++, dp++) { + unsigned int src; + struct ttable_src *sp; + sp = dp->srcs; + for (src = 0; src < dp->nsrcs; src++, sp++) { + if (test_bit(sp->channel, src_vmask)) { + set_bit(channel, vmask); + break; + } + } + } + *dst_vmask = vmask; + return 0; +} + +static void route_free(struct snd_pcm_plugin *plugin) +{ + struct route_priv *data = (struct route_priv *)plugin->extra_data; + unsigned int dst_channel; + for (dst_channel = 0; dst_channel < plugin->dst_format.channels; ++dst_channel) { + kfree(data->ttable[dst_channel].srcs); + } +} + +static int route_load_ttable(struct snd_pcm_plugin *plugin, + const int *src_ttable) +{ + struct route_priv *data; + unsigned int src_channel, dst_channel; + const int *sptr; + struct ttable_dst *dptr; + if (src_ttable == NULL) + return 0; + data = (struct route_priv *)plugin->extra_data; + dptr = data->ttable; + sptr = src_ttable; + plugin->private_free = route_free; + for (dst_channel = 0; dst_channel < plugin->dst_format.channels; ++dst_channel) { + int t = 0; + int att = 0; + int nsrcs = 0; + struct ttable_src srcs[plugin->src_format.channels]; + for (src_channel = 0; src_channel < plugin->src_format.channels; ++src_channel) { + snd_assert(*sptr >= 0 || *sptr <= FULL, return -ENXIO); + if (*sptr != 0) { + srcs[nsrcs].channel = src_channel; + srcs[nsrcs].as_int = *sptr; + if (*sptr != FULL) + att = 1; + t += *sptr; + nsrcs++; + } + sptr++; + } + dptr->att = att; + dptr->nsrcs = nsrcs; + if (nsrcs == 0) + dptr->func = route_to_channel_from_zero; + else if (nsrcs == 1 && !att) + dptr->func = route_to_channel_from_one; + else + dptr->func = route_to_channel; + if (nsrcs > 0) { + int srcidx; + dptr->srcs = kcalloc(nsrcs, sizeof(*srcs), GFP_KERNEL); + for(srcidx = 0; srcidx < nsrcs; srcidx++) + dptr->srcs[srcidx] = srcs[srcidx]; + } else + dptr->srcs = NULL; + dptr++; + } + return 0; } static snd_pcm_sframes_t route_transfer(struct snd_pcm_plugin *plugin, - const struct snd_pcm_plugin_channel *src_channels, - struct snd_pcm_plugin_channel *dst_channels, - snd_pcm_uframes_t frames) + const struct snd_pcm_plugin_channel *src_channels, + struct snd_pcm_plugin_channel *dst_channels, + snd_pcm_uframes_t frames) { - int nsrcs, ndsts, dst; + struct route_priv *data; + int src_nchannels, dst_nchannels; + int dst_channel; + struct ttable_dst *ttp; struct snd_pcm_plugin_channel *dvp; - int format; snd_assert(plugin != NULL && src_channels != NULL && dst_channels != NULL, return -ENXIO); if (frames == 0) return 0; + data = (struct route_priv *)plugin->extra_data; - nsrcs = plugin->src_format.channels; - ndsts = plugin->dst_format.channels; + src_nchannels = plugin->src_format.channels; + dst_nchannels = plugin->dst_format.channels; - format = plugin->dst_format.format; - dvp = dst_channels; - if (nsrcs <= 1) { - /* expand to all channels */ - for (dst = 0; dst < ndsts; ++dst) { - copy_area(src_channels, dvp, frames, format); - dvp++; +#ifdef CONFIG_SND_DEBUG + { + int src_channel; + for (src_channel = 0; src_channel < src_nchannels; ++src_channel) { + snd_assert(src_channels[src_channel].area.first % 8 == 0 || + src_channels[src_channel].area.step % 8 == 0, + return -ENXIO); + } + for (dst_channel = 0; dst_channel < dst_nchannels; ++dst_channel) { + snd_assert(dst_channels[dst_channel].area.first % 8 == 0 || + dst_channels[dst_channel].area.step % 8 == 0, + return -ENXIO); } - return frames; } +#endif - for (dst = 0; dst < ndsts && dst < nsrcs; ++dst) { - copy_area(src_channels, dvp, frames, format); + ttp = data->ttable; + dvp = dst_channels; + for (dst_channel = 0; dst_channel < dst_nchannels; ++dst_channel) { + ttp->func(plugin, src_channels, dvp, ttp, frames); dvp++; - src_channels++; + ttp++; } - if (dst < ndsts) - zero_areas(dvp, ndsts - dst, frames, format); return frames; } +int getput_index(int format) +{ + int sign, width, endian; + sign = !snd_pcm_format_signed(format); + width = snd_pcm_format_width(format) / 8 - 1; + if (width < 0 || width > 3) { + snd_printk(KERN_ERR "snd-pcm-oss: invalid format %d\n", format); + width = 0; + } +#ifdef SNDRV_LITTLE_ENDIAN + endian = snd_pcm_format_big_endian(format); +#else + endian = snd_pcm_format_little_endian(format); +#endif + if (endian < 0) + endian = 0; + return width * 4 + endian * 2 + sign; +} + int snd_pcm_plugin_build_route(struct snd_pcm_substream *plug, struct snd_pcm_plugin_format *src_format, struct snd_pcm_plugin_format *dst_format, + int *ttable, struct snd_pcm_plugin **r_plugin) { + struct route_priv *data; struct snd_pcm_plugin *plugin; int err; snd_assert(r_plugin != NULL, return -ENXIO); *r_plugin = NULL; snd_assert(src_format->rate == dst_format->rate, return -ENXIO); - snd_assert(src_format->format == dst_format->format, return -ENXIO); + snd_assert(snd_pcm_format_linear(src_format->format) != 0 && + snd_pcm_format_linear(dst_format->format) != 0, + return -ENXIO); - err = snd_pcm_plugin_build(plug, "route conversion", - src_format, dst_format, 0, &plugin); + err = snd_pcm_plugin_build(plug, "attenuated route conversion", + src_format, dst_format, + sizeof(struct route_priv) + + sizeof(data->ttable[0]) * dst_format->channels, + &plugin); if (err < 0) return err; + data = (struct route_priv *)plugin->extra_data; + + data->get = getput_index(src_format->format); + snd_assert(data->get >= 0 && data->get < 4*2*2, return -EINVAL); + data->put = getput_index(dst_format->format); + snd_assert(data->get >= 0 && data->get < 4*2*2, return -EINVAL); + data->conv = conv_index(src_format->format, dst_format->format); + + if (snd_pcm_format_width(src_format->format) == 32) + data->sum_type = R_UINT64; + else + data->sum_type = R_UINT32; + data->src_sample_size = snd_pcm_format_width(src_format->format) / 8; + + if ((err = route_load_ttable(plugin, ttable)) < 0) { + snd_pcm_plugin_free(plugin); + return err; + } plugin->transfer = route_transfer; + plugin->src_channels_mask = route_src_channels_mask; + plugin->dst_channels_mask = route_dst_channels_mask; *r_plugin = plugin; return 0; } - -#endif diff --git a/sound/core/pcm.c b/sound/core/pcm.c index 7581edd7b..28ca61eb0 100644 --- a/sound/core/pcm.c +++ b/sound/core/pcm.c @@ -23,7 +23,6 @@ #include #include #include -#include #include #include #include @@ -36,7 +35,7 @@ MODULE_LICENSE("GPL"); static LIST_HEAD(snd_pcm_devices); static LIST_HEAD(snd_pcm_notify_list); -static DEFINE_MUTEX(register_mutex); +static DECLARE_MUTEX(register_mutex); static int snd_pcm_free(struct snd_pcm *pcm); static int snd_pcm_dev_free(struct snd_device *device); @@ -68,7 +67,7 @@ static int snd_pcm_control_ioctl(struct snd_card *card, if (get_user(device, (int __user *)arg)) return -EFAULT; - mutex_lock(®ister_mutex); + down(®ister_mutex); device = device < 0 ? 0 : device + 1; while (device < SNDRV_PCM_DEVICES) { if (snd_pcm_search(card, device)) @@ -77,7 +76,7 @@ static int snd_pcm_control_ioctl(struct snd_card *card, } if (device == SNDRV_PCM_DEVICES) device = -1; - mutex_unlock(®ister_mutex); + up(®ister_mutex); if (put_user(device, (int __user *)arg)) return -EFAULT; return 0; @@ -101,7 +100,7 @@ static int snd_pcm_control_ioctl(struct snd_card *card, return -EINVAL; if (get_user(subdevice, &info->subdevice)) return -EFAULT; - mutex_lock(®ister_mutex); + down(®ister_mutex); pcm = snd_pcm_search(card, device); if (pcm == NULL) { err = -ENXIO; @@ -126,7 +125,7 @@ static int snd_pcm_control_ioctl(struct snd_card *card, } err = snd_pcm_info_user(substream, info); _error: - mutex_unlock(®ister_mutex); + up(®ister_mutex); return err; } case SNDRV_CTL_IOCTL_PCM_PREFER_SUBDEVICE: @@ -141,9 +140,6 @@ static int snd_pcm_control_ioctl(struct snd_card *card, } return -ENOIOCTLCMD; } - -#ifdef CONFIG_SND_VERBOSE_PROCFS - #define STATE(v) [SNDRV_PCM_STATE_##v] = #v #define STREAM(v) [SNDRV_PCM_STREAM_##v] = #v #define READY(v) [SNDRV_PCM_READY_##v] = #v @@ -196,11 +192,12 @@ static char *snd_pcm_format_names[] = { FORMAT(U18_3BE), }; -static const char *snd_pcm_format_name(snd_pcm_format_t format) +const char *snd_pcm_format_name(snd_pcm_format_t format) { return snd_pcm_format_names[format]; } +#ifdef CONFIG_PROC_FS static char *snd_pcm_stream_names[] = { STREAM(PLAYBACK), STREAM(CAPTURE), @@ -263,7 +260,6 @@ static const char *snd_pcm_state_name(snd_pcm_state_t state) #if defined(CONFIG_SND_PCM_OSS) || defined(CONFIG_SND_PCM_OSS_MODULE) #include - static const char *snd_pcm_oss_format_name(int format) { switch (format) { @@ -351,8 +347,10 @@ 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)); @@ -373,6 +371,7 @@ 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, @@ -384,8 +383,10 @@ 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)); @@ -398,6 +399,7 @@ 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, @@ -430,7 +432,7 @@ static void snd_pcm_substream_proc_status_read(struct snd_info_entry *entry, snd_iprintf(buffer, "appl_ptr : %ld\n", runtime->control->appl_ptr); } -#ifdef CONFIG_SND_PCM_XRUN_DEBUG +#ifdef CONFIG_SND_DEBUG static void snd_pcm_xrun_debug_read(struct snd_info_entry *entry, struct snd_info_buffer *buffer) { @@ -466,7 +468,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, snd_pcm_stream_proc_info_read); + snd_info_set_text_ops(entry, pstr, 256, snd_pcm_stream_proc_info_read); if (snd_info_register(entry) < 0) { snd_info_free_entry(entry); entry = NULL; @@ -474,10 +476,12 @@ static int snd_pcm_stream_proc_init(struct snd_pcm_str *pstr) } pstr->proc_info_entry = entry; -#ifdef CONFIG_SND_PCM_XRUN_DEBUG +#ifdef CONFIG_SND_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; @@ -493,7 +497,7 @@ static int snd_pcm_stream_proc_init(struct snd_pcm_str *pstr) static int snd_pcm_stream_proc_done(struct snd_pcm_str *pstr) { -#ifdef CONFIG_SND_PCM_XRUN_DEBUG +#ifdef CONFIG_SND_DEBUG if (pstr->proc_xrun_debug_entry) { snd_info_unregister(pstr->proc_xrun_debug_entry); pstr->proc_xrun_debug_entry = NULL; @@ -529,8 +533,7 @@ 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, - snd_pcm_substream_proc_info_read); + snd_info_set_text_ops(entry, substream, 256, snd_pcm_substream_proc_info_read); if (snd_info_register(entry) < 0) { snd_info_free_entry(entry); entry = NULL; @@ -539,8 +542,7 @@ 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, - snd_pcm_substream_proc_hw_params_read); + snd_info_set_text_ops(entry, substream, 256, snd_pcm_substream_proc_hw_params_read); if (snd_info_register(entry) < 0) { snd_info_free_entry(entry); entry = NULL; @@ -549,8 +551,7 @@ 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, - snd_pcm_substream_proc_sw_params_read); + snd_info_set_text_ops(entry, substream, 256, snd_pcm_substream_proc_sw_params_read); if (snd_info_register(entry) < 0) { snd_info_free_entry(entry); entry = NULL; @@ -559,8 +560,7 @@ 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, - snd_pcm_substream_proc_status_read); + snd_info_set_text_ops(entry, substream, 256, snd_pcm_substream_proc_status_read); if (snd_info_register(entry) < 0) { snd_info_free_entry(entry); entry = NULL; @@ -595,12 +595,12 @@ static int snd_pcm_substream_proc_done(struct snd_pcm_substream *substream) } return 0; } -#else /* !CONFIG_SND_VERBOSE_PROCFS */ +#else /* !CONFIG_PROC_FS */ static inline int snd_pcm_stream_proc_init(struct snd_pcm_str *pstr) { return 0; } static inline int snd_pcm_stream_proc_done(struct snd_pcm_str *pstr) { return 0; } static inline int snd_pcm_substream_proc_init(struct snd_pcm_substream *substream) { return 0; } static inline int snd_pcm_substream_proc_done(struct snd_pcm_substream *substream) { return 0; } -#endif /* CONFIG_SND_VERBOSE_PROCFS */ +#endif /* CONFIG_PROC_FS */ /** * snd_pcm_new_stream - create a new PCM stream @@ -622,7 +622,7 @@ int snd_pcm_new_stream(struct snd_pcm *pcm, int stream, int substream_count) struct snd_pcm_substream *substream, *prev; #if defined(CONFIG_SND_PCM_OSS) || defined(CONFIG_SND_PCM_OSS_MODULE) - mutex_init(&pstr->oss.setup_mutex); + init_MUTEX(&pstr->oss.setup_mutex); #endif pstr->stream = stream; pstr->pcm = pcm; @@ -662,14 +662,11 @@ 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 @@ -719,7 +716,7 @@ int snd_pcm_new(struct snd_card *card, char *id, int device, snd_pcm_free(pcm); return err; } - mutex_init(&pcm->open_mutex); + init_MUTEX(&pcm->open_mutex); init_waitqueue_head(&pcm->open_wait); if ((err = snd_device_new(card, SNDRV_DEV_PCM, pcm, &ops)) < 0) { snd_pcm_free(pcm); @@ -729,8 +726,6 @@ 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; @@ -778,9 +773,8 @@ static void snd_pcm_tick_timer_func(unsigned long data) snd_pcm_tick_elapsed(substream); } -int snd_pcm_attach_substream(struct snd_pcm *pcm, int stream, - struct file *file, - struct snd_pcm_substream **rsubstream) +int snd_pcm_open_substream(struct snd_pcm *pcm, int stream, + struct snd_pcm_substream **rsubstream) { struct snd_pcm_str * pstr; struct snd_pcm_substream *substream; @@ -795,7 +789,7 @@ int snd_pcm_attach_substream(struct snd_pcm *pcm, int stream, *rsubstream = NULL; snd_assert(pcm != NULL, return -ENXIO); pstr = &pcm->streams[stream]; - if (pstr->substream == NULL || pstr->substream_count == 0) + if (pstr->substream == NULL) return -ENODEV; card = pcm->card; @@ -809,6 +803,8 @@ int snd_pcm_attach_substream(struct snd_pcm *pcm, int stream, } up_read(&card->controls_rwsem); + if (pstr->substream_count == 0) + return -ENODEV; switch (stream) { case SNDRV_PCM_STREAM_PLAYBACK: if (pcm->info_flags & SNDRV_PCM_INFO_HALF_DUPLEX) { @@ -830,26 +826,6 @@ 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) @@ -885,6 +861,7 @@ 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; @@ -893,17 +870,15 @@ int snd_pcm_attach_substream(struct snd_pcm *pcm, int stream, substream->runtime = runtime; substream->private_data = pcm->private_data; - substream->ref_count = 1; - substream->f_flags = file->f_flags; pstr->substream_opened++; *rsubstream = substream; return 0; } -void snd_pcm_detach_substream(struct snd_pcm_substream *substream) +void snd_pcm_release_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) @@ -927,9 +902,9 @@ static int snd_pcm_dev_register(struct snd_device *device) struct snd_pcm *pcm = device->device_data; snd_assert(pcm != NULL && device != NULL, return -ENXIO); - mutex_lock(®ister_mutex); + down(®ister_mutex); if (snd_pcm_search(pcm->card, pcm->device)) { - mutex_unlock(®ister_mutex); + up(®ister_mutex); return -EBUSY; } list_add_tail(&pcm->list, &snd_pcm_devices); @@ -953,7 +928,7 @@ static int snd_pcm_dev_register(struct snd_device *device) pcm, str)) < 0) { list_del(&pcm->list); - mutex_unlock(®ister_mutex); + up(®ister_mutex); return err; } for (substream = pcm->streams[cidx].substream; substream; substream = substream->next) @@ -964,7 +939,7 @@ static int snd_pcm_dev_register(struct snd_device *device) notify = list_entry(list, struct snd_pcm_notify, list); notify->n_register(pcm); } - mutex_unlock(®ister_mutex); + up(®ister_mutex); return 0; } @@ -975,7 +950,7 @@ static int snd_pcm_dev_disconnect(struct snd_device *device) struct snd_pcm_substream *substream; int cidx; - mutex_lock(®ister_mutex); + down(®ister_mutex); list_del_init(&pcm->list); for (cidx = 0; cidx < 2; cidx++) for (substream = pcm->streams[cidx].substream; substream; substream = substream->next) @@ -986,7 +961,7 @@ static int snd_pcm_dev_disconnect(struct snd_device *device) notify = list_entry(list, struct snd_pcm_notify, list); notify->n_disconnect(pcm); } - mutex_unlock(®ister_mutex); + up(®ister_mutex); return 0; } @@ -998,7 +973,7 @@ static int snd_pcm_dev_unregister(struct snd_device *device) struct snd_pcm *pcm = device->device_data; snd_assert(pcm != NULL, return -ENXIO); - mutex_lock(®ister_mutex); + down(®ister_mutex); list_del(&pcm->list); for (cidx = 0; cidx < 2; cidx++) { devtype = -1; @@ -1019,7 +994,7 @@ static int snd_pcm_dev_unregister(struct snd_device *device) notify = list_entry(list, struct snd_pcm_notify, list); notify->n_unregister(pcm); } - mutex_unlock(®ister_mutex); + up(®ister_mutex); return snd_pcm_free(pcm); } @@ -1028,7 +1003,7 @@ int snd_pcm_notify(struct snd_pcm_notify *notify, int nfree) struct list_head *p; snd_assert(notify != NULL && notify->n_register != NULL && notify->n_unregister != NULL, return -EINVAL); - mutex_lock(®ister_mutex); + down(®ister_mutex); if (nfree) { list_del(¬ify->list); list_for_each(p, &snd_pcm_devices) @@ -1039,12 +1014,10 @@ int snd_pcm_notify(struct snd_pcm_notify *notify, int nfree) list_for_each(p, &snd_pcm_devices) notify->n_register(list_entry(p, struct snd_pcm, list)); } - mutex_unlock(®ister_mutex); + up(®ister_mutex); return 0; } -EXPORT_SYMBOL(snd_pcm_notify); - #ifdef CONFIG_PROC_FS /* * Info interface @@ -1056,7 +1029,7 @@ static void snd_pcm_proc_read(struct snd_info_entry *entry, struct list_head *p; struct snd_pcm *pcm; - mutex_lock(®ister_mutex); + down(®ister_mutex); list_for_each(p, &snd_pcm_devices) { pcm = list_entry(p, struct snd_pcm, list); snd_iprintf(buffer, "%02i-%02i: %s : %s", @@ -1069,17 +1042,18 @@ static void snd_pcm_proc_read(struct snd_info_entry *entry, pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream_count); snd_iprintf(buffer, "\n"); } - mutex_unlock(®ister_mutex); + up(®ister_mutex); } -static struct snd_info_entry *snd_pcm_proc_entry; +static struct snd_info_entry *snd_pcm_proc_entry = NULL; 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, snd_pcm_proc_read); + snd_info_set_text_ops(entry, NULL, SNDRV_CARDS * SNDRV_PCM_DEVICES * 128, + snd_pcm_proc_read); if (snd_info_register(entry) < 0) { snd_info_free_entry(entry); entry = NULL; @@ -1121,3 +1095,36 @@ 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); +EXPORT_SYMBOL(snd_pcm_format_name); + /* 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_playback_ioctl); +EXPORT_SYMBOL(snd_pcm_kernel_capture_ioctl); +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 2b8aab6fd..e5133033d 100644 --- a/sound/core/pcm_compat.c +++ b/sound/core/pcm_compat.c @@ -497,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(file, substream, cmd, argp); + return snd_pcm_playback_ioctl1(substream, cmd, argp); else - return snd_pcm_capture_ioctl1(file, substream, cmd, argp); + return snd_pcm_capture_ioctl1(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 0bb142a28..eeba2f060 100644 --- a/sound/core/pcm_lib.c +++ b/sound/core/pcm_lib.c @@ -130,7 +130,7 @@ void snd_pcm_playback_silence(struct snd_pcm_substream *substream, snd_pcm_ufram static void xrun(struct snd_pcm_substream *substream) { snd_pcm_stop(substream, SNDRV_PCM_STATE_XRUN); -#ifdef CONFIG_SND_PCM_XRUN_DEBUG +#ifdef CONFIG_SND_DEBUG if (substream->pstr->xrun_debug) { snd_printd(KERN_DEBUG "XRUN: pcmC%dD%d%c\n", substream->pcm->card->number, @@ -204,7 +204,7 @@ static inline int snd_pcm_update_hw_ptr_interrupt(struct snd_pcm_substream *subs delta = hw_ptr_interrupt - new_hw_ptr; if (delta > 0) { if ((snd_pcm_uframes_t)delta < runtime->buffer_size / 2) { -#ifdef CONFIG_SND_PCM_XRUN_DEBUG +#ifdef CONFIG_SND_DEBUG if (runtime->periods > 1 && substream->pstr->xrun_debug) { snd_printd(KERN_ERR "Unexpected hw_pointer value [1] (stream = %i, delta: -%ld, max jitter = %ld): wrong interrupt acknowledge?\n", substream->stream, (long) delta, runtime->buffer_size / 2); if (substream->pstr->xrun_debug > 1) @@ -249,7 +249,7 @@ int snd_pcm_update_hw_ptr(struct snd_pcm_substream *substream) delta = old_hw_ptr - new_hw_ptr; if (delta > 0) { if ((snd_pcm_uframes_t)delta < runtime->buffer_size / 2) { -#ifdef CONFIG_SND_PCM_XRUN_DEBUG +#ifdef CONFIG_SND_DEBUG if (runtime->periods > 2 && substream->pstr->xrun_debug) { snd_printd(KERN_ERR "Unexpected hw_pointer value [2] (stream = %i, delta: -%ld, max jitter = %ld): wrong interrupt acknowledge?\n", substream->stream, (long) delta, runtime->buffer_size / 2); if (substream->pstr->xrun_debug > 1) @@ -289,7 +289,6 @@ 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 @@ -307,12 +306,13 @@ 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,6 +369,56 @@ 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 @@ -383,7 +433,7 @@ static inline unsigned int muldiv32(unsigned int a, unsigned int b, int snd_interval_refine(struct snd_interval *i, const struct snd_interval *v) { int changed = 0; - snd_assert(!snd_interval_empty(i), return -EINVAL); + assert(!snd_interval_empty(i)); if (i->min < v->min) { i->min = v->min; i->openmin = v->openmin; @@ -422,11 +472,9 @@ 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) { - snd_assert(!snd_interval_empty(i), return -EINVAL); + assert(!snd_interval_empty(i)); if (snd_interval_single(i)) return 0; i->max = i->min; @@ -438,7 +486,7 @@ static int snd_interval_refine_first(struct snd_interval *i) static int snd_interval_refine_last(struct snd_interval *i) { - snd_assert(!snd_interval_empty(i), return -EINVAL); + assert(!snd_interval_empty(i)); if (snd_interval_single(i)) return 0; i->min = i->max; @@ -448,6 +496,16 @@ 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) { @@ -563,6 +621,7 @@ void snd_interval_mulkdiv(const struct snd_interval *a, unsigned int k, c->integer = 0; } +#undef assert /* ---- */ @@ -668,8 +727,6 @@ 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 @@ -820,8 +877,6 @@ 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; @@ -898,8 +953,6 @@ 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 @@ -954,8 +1007,6 @@ 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 @@ -977,8 +1028,6 @@ 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) { @@ -1006,8 +1055,6 @@ 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) { @@ -1040,8 +1087,6 @@ 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) { @@ -1073,8 +1118,6 @@ 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) { @@ -1106,8 +1149,6 @@ 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) { @@ -1132,8 +1173,6 @@ 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[] = { @@ -1161,7 +1200,11 @@ int snd_pcm_hw_constraint_pow2(struct snd_pcm_runtime *runtime, var, -1); } -EXPORT_SYMBOL(snd_pcm_hw_constraint_pow2); +/* 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 static void _snd_pcm_hw_param_any(struct snd_pcm_hw_params *params, snd_pcm_hw_param_t var) @@ -1181,6 +1224,18 @@ 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; @@ -1192,7 +1247,18 @@ void _snd_pcm_hw_params_any(struct snd_pcm_hw_params *params) params->info = ~0U; } -EXPORT_SYMBOL(_snd_pcm_hw_params_any); +#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 */ /** * snd_pcm_hw_param_value @@ -1203,8 +1269,8 @@ EXPORT_SYMBOL(_snd_pcm_hw_params_any); * Return the value for field PAR if it's fixed in configuration space * defined by PARAMS. Return -EINVAL otherwise */ -int snd_pcm_hw_param_value(const struct snd_pcm_hw_params *params, - snd_pcm_hw_param_t var, int *dir) +static 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); @@ -1222,10 +1288,61 @@ 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; } -EXPORT_SYMBOL(snd_pcm_hw_param_value); +/** + * 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; +} void _snd_pcm_hw_param_setempty(struct snd_pcm_hw_params *params, snd_pcm_hw_param_t var) @@ -1243,7 +1360,42 @@ void _snd_pcm_hw_param_setempty(struct snd_pcm_hw_params *params, } } -EXPORT_SYMBOL(_snd_pcm_hw_param_setempty); +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 */ static int _snd_pcm_hw_param_first(struct snd_pcm_hw_params *params, snd_pcm_hw_param_t var) @@ -1253,8 +1405,10 @@ 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 + else { + assert(0); return -EINVAL; + } if (changed) { params->cmask |= 1 << var; params->rmask |= 1 << var; @@ -1274,22 +1428,20 @@ static int _snd_pcm_hw_param_first(struct snd_pcm_hw_params *params, * values > minimum. Reduce configuration space accordingly. * Return the minimum. */ -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) +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 changed = _snd_pcm_hw_param_first(params, var); if (changed < 0) return changed; if (params->rmask) { int err = snd_pcm_hw_refine(pcm, params); - snd_assert(err >= 0, return err); + assert(err >= 0); } 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) { @@ -1298,8 +1450,10 @@ 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 + else { + assert(0); return -EINVAL; + } if (changed) { params->cmask |= 1 << var; params->rmask |= 1 << var; @@ -1319,21 +1473,381 @@ static int _snd_pcm_hw_param_last(struct snd_pcm_hw_params *params, * values < maximum. Reduce configuration space accordingly. * Return the maximum. */ -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) +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 changed = _snd_pcm_hw_param_last(params, var); if (changed < 0) return changed; if (params->rmask) { int err = snd_pcm_hw_refine(pcm, params); - snd_assert(err >= 0, return err); + assert(err >= 0); } return snd_pcm_hw_param_value(params, var, dir); } -EXPORT_SYMBOL(snd_pcm_hw_param_last); +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; +} /** * snd_pcm_hw_param_choose @@ -1345,32 +1859,39 @@ EXPORT_SYMBOL(snd_pcm_hw_param_last); * 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) -{ - 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; +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); - 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) { @@ -1446,8 +1967,6 @@ int snd_pcm_lib_ioctl(struct snd_pcm_substream *substream, return -ENXIO; } -EXPORT_SYMBOL(snd_pcm_lib_ioctl); - /* * Conditions */ @@ -1582,8 +2101,6 @@ 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, @@ -1782,7 +2299,19 @@ 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->f_flags & O_NONBLOCK); + snd_assert(substream->ffile != NULL, return -ENXIO); + nonblock = !!(substream->ffile->f_flags & O_NONBLOCK); +#if defined(CONFIG_SND_PCM_OSS) || defined(CONFIG_SND_PCM_OSS_MODULE) + if (substream->oss.oss) { + struct snd_pcm_oss_setup *setup = substream->oss.setup; + if (setup != NULL) { + if (setup->nonblock) + nonblock = 1; + else if (setup->block) + nonblock = 0; + } + } +#endif if (runtime->access != SNDRV_PCM_ACCESS_RW_INTERLEAVED && runtime->channels > 1) @@ -1791,8 +2320,6 @@ 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, @@ -1847,7 +2374,19 @@ 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->f_flags & O_NONBLOCK); + snd_assert(substream->ffile != NULL, return -ENXIO); + nonblock = !!(substream->ffile->f_flags & O_NONBLOCK); +#if defined(CONFIG_SND_PCM_OSS) || defined(CONFIG_SND_PCM_OSS_MODULE) + if (substream->oss.oss) { + struct snd_pcm_oss_setup *setup = substream->oss.setup; + if (setup != NULL) { + if (setup->nonblock) + nonblock = 1; + else if (setup->block) + nonblock = 0; + } + } +#endif if (runtime->access != SNDRV_PCM_ACCESS_RW_NONINTERLEAVED) return -EINVAL; @@ -1855,8 +2394,6 @@ 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, @@ -2059,14 +2596,24 @@ 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->f_flags & O_NONBLOCK); + snd_assert(substream->ffile != NULL, return -ENXIO); + nonblock = !!(substream->ffile->f_flags & O_NONBLOCK); +#if defined(CONFIG_SND_PCM_OSS) || defined(CONFIG_SND_PCM_OSS_MODULE) + if (substream->oss.oss) { + struct snd_pcm_oss_setup *setup = substream->oss.setup; + if (setup != NULL) { + if (setup->nonblock) + nonblock = 1; + else if (setup->block) + nonblock = 0; + } + } +#endif 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, @@ -2118,10 +2665,71 @@ 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->f_flags & O_NONBLOCK); + snd_assert(substream->ffile != NULL, return -ENXIO); + nonblock = !!(substream->ffile->f_flags & O_NONBLOCK); +#if defined(CONFIG_SND_PCM_OSS) || defined(CONFIG_SND_PCM_OSS_MODULE) + if (substream->oss.oss) { + struct snd_pcm_oss_setup *setup = substream->oss.setup; + if (setup != NULL) { + if (setup->nonblock) + nonblock = 1; + else if (setup->block) + nonblock = 0; + } + } +#endif + 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 067d2056d..a0119ae67 100644 --- a/sound/core/pcm_memory.c +++ b/sound/core/pcm_memory.c @@ -100,10 +100,8 @@ static void snd_pcm_lib_preallocate_dma_free(struct snd_pcm_substream *substream int snd_pcm_lib_preallocate_free(struct snd_pcm_substream *substream) { snd_pcm_lib_preallocate_dma_free(substream); -#ifdef CONFIG_SND_VERBOSE_PROCFS snd_info_unregister(substream->proc_prealloc_entry); substream->proc_prealloc_entry = NULL; -#endif return 0; } @@ -126,9 +124,7 @@ 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 +#ifdef CONFIG_PROC_FS /* * read callback for prealloc proc file * @@ -193,7 +189,9 @@ 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; @@ -205,9 +203,9 @@ static inline void preallocate_info_init(struct snd_pcm_substream *substream) substream->proc_prealloc_entry = entry; } -#else /* !CONFIG_SND_VERBOSE_PROCFS */ +#else /* !CONFIG_PROC_FS */ #define preallocate_info_init(s) -#endif /* CONFIG_SND_VERBOSE_PROCFS */ +#endif /* * pre-allocate the buffer and create a proc file for the substream @@ -253,8 +251,6 @@ 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 @@ -282,8 +278,6 @@ 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 @@ -302,8 +296,6 @@ 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 @@ -355,8 +347,6 @@ 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 @@ -382,5 +372,3 @@ 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 0019c59a7..593c77f4d 100644 --- a/sound/core/pcm_misc.c +++ b/sound/core/pcm_misc.c @@ -207,8 +207,6 @@ 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 @@ -226,8 +224,6 @@ 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 @@ -239,8 +235,6 @@ 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 @@ -258,8 +252,6 @@ 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 @@ -277,8 +269,6 @@ 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 @@ -296,8 +286,6 @@ 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 @@ -315,8 +303,6 @@ 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 @@ -332,8 +318,6 @@ 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 @@ -349,8 +333,6 @@ 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 @@ -420,8 +402,6 @@ 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}, @@ -452,8 +432,6 @@ 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 @@ -485,5 +463,3 @@ 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 439f04792..f3d5de7b5 100644 --- a/sound/core/pcm_native.c +++ b/sound/core/pcm_native.c @@ -71,10 +71,9 @@ static int snd_pcm_open(struct file *file, struct snd_pcm *pcm, int stream); */ DEFINE_RWLOCK(snd_pcm_link_rwlock); -EXPORT_SYMBOL(snd_pcm_link_rwlock); - static DECLARE_RWSEM(snd_pcm_link_rwsem); + static inline mm_segment_t snd_enter_user(void) { mm_segment_t fs = get_fs(); @@ -320,8 +319,6 @@ 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) { @@ -372,7 +369,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(&substream->mmap_count)) + if (atomic_read(&runtime->mmap_count)) return -EBADFD; params->rmask = ~0U; @@ -485,7 +482,7 @@ static int snd_pcm_hw_free(struct snd_pcm_substream *substream) return -EBADFD; } snd_pcm_stream_unlock_irq(substream); - if (atomic_read(&substream->mmap_count)) + if (atomic_read(&runtime->mmap_count)) return -EBADFD; if (substream->ops->hw_free) result = substream->ops->hw_free(substream); @@ -939,8 +936,6 @@ 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 @@ -1090,8 +1085,6 @@ int snd_pcm_suspend(struct snd_pcm_substream *substream) return err; } -EXPORT_SYMBOL(snd_pcm_suspend); - /** * snd_pcm_suspend_all * @pcm: the PCM instance @@ -1121,8 +1114,6 @@ 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) @@ -1179,7 +1170,7 @@ static int snd_pcm_resume(struct snd_pcm_substream *substream) int res; snd_power_lock(card); - if ((res = snd_power_wait(card, SNDRV_CTL_POWER_D0)) >= 0) + if ((res = snd_power_wait(card, SNDRV_CTL_POWER_D0, substream->ffile)) >= 0) res = snd_pcm_action_lock_irq(&snd_pcm_action_resume, substream, 0); snd_power_unlock(card); return res; @@ -1207,7 +1198,7 @@ static int snd_pcm_xrun(struct snd_pcm_substream *substream) snd_power_lock(card); if (runtime->status->state == SNDRV_PCM_STATE_SUSPENDED) { - result = snd_power_wait(card, SNDRV_CTL_POWER_D0); + result = snd_power_wait(card, SNDRV_CTL_POWER_D0, substream->ffile); if (result < 0) goto _unlock; } @@ -1284,16 +1275,13 @@ static int snd_pcm_reset(struct snd_pcm_substream *substream) /* * prepare ioctl */ -/* we use the second argument for updating f_flags */ -static int snd_pcm_pre_prepare(struct snd_pcm_substream *substream, - int f_flags) +static int snd_pcm_pre_prepare(struct snd_pcm_substream *substream, int state) { 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; } @@ -1322,26 +1310,17 @@ 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, - struct file *file) +int snd_pcm_prepare(struct snd_pcm_substream *substream) { 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, f_flags); + if ((res = snd_power_wait(card, SNDRV_CTL_POWER_D0, substream->ffile)) >= 0) + res = snd_pcm_action_nonatomic(&snd_pcm_action_prepare, substream, 0); snd_power_unlock(card); return res; } @@ -1352,7 +1331,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->f_flags & O_NONBLOCK) + if (substream->ffile->f_flags & O_NONBLOCK) return -EAGAIN; substream->runtime->trigger_master = substream; return 0; @@ -1431,7 +1410,7 @@ static int snd_pcm_drain(struct snd_pcm_substream *substream) snd_power_lock(card); if (runtime->status->state == SNDRV_PCM_STATE_SUSPENDED) { - result = snd_power_wait(card, SNDRV_CTL_POWER_D0); + result = snd_power_wait(card, SNDRV_CTL_POWER_D0, substream->ffile); if (result < 0) { snd_power_unlock(card); return result; @@ -1469,6 +1448,8 @@ 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 */ @@ -1552,7 +1533,7 @@ static int snd_pcm_drop(struct snd_pcm_substream *substream) snd_power_lock(card); if (runtime->status->state == SNDRV_PCM_STATE_SUSPENDED) { - result = snd_power_wait(card, SNDRV_CTL_POWER_D0); + result = snd_power_wait(card, SNDRV_CTL_POWER_D0, substream->ffile); if (result < 0) goto _unlock; } @@ -2014,111 +1995,81 @@ static void snd_pcm_remove_file(struct snd_pcm_str *str, } } -static void pcm_release_private(struct snd_pcm_substream *substream) +static int snd_pcm_release_file(struct snd_pcm_file * pcm_file) { - struct snd_pcm_file *pcm_file = substream->file; + struct snd_pcm_substream *substream; + struct snd_pcm_runtime *runtime; + struct snd_pcm_str * str; + snd_assert(pcm_file != NULL, return -ENXIO); + substream = pcm_file->substream; + snd_assert(substream != NULL, return -ENXIO); + runtime = substream->runtime; + str = substream->pstr; snd_pcm_unlink(substream); - snd_pcm_remove_file(substream->pstr, pcm_file); - kfree(pcm_file); -} - -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->ffile != NULL) { if (substream->ops->hw_free != NULL) substream->ops->hw_free(substream); substream->ops->close(substream); - substream->hw_opened = 0; - } - if (substream->pcm_release) { - substream->pcm_release(substream); - substream->pcm_release = NULL; + substream->ffile = NULL; } - snd_pcm_detach_substream(substream); + snd_pcm_remove_file(str, pcm_file); + snd_pcm_release_substream(substream); + kfree(pcm_file); + return 0; } -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) +static int snd_pcm_open_file(struct file *file, + struct snd_pcm *pcm, + int stream, + struct snd_pcm_file **rpcm_file) { + int err = 0; + struct snd_pcm_file *pcm_file; struct snd_pcm_substream *substream; - int err; + struct snd_pcm_str *str; - err = snd_pcm_attach_substream(pcm, stream, file, &substream); - if (err < 0) + snd_assert(rpcm_file != NULL, return -EINVAL); + *rpcm_file = NULL; + + pcm_file = kzalloc(sizeof(*pcm_file), GFP_KERNEL); + if (pcm_file == NULL) { + return -ENOMEM; + } + + if ((err = snd_pcm_open_substream(pcm, stream, &substream)) < 0) { + kfree(pcm_file); return err; - if (substream->ref_count > 1) { - *rsubstream = substream; - return 0; } + str = substream->pstr; + substream->file = pcm_file; substream->no_mmap_ctrl = 0; + + pcm_file->substream = substream; + + snd_pcm_add_file(str, pcm_file); + err = snd_pcm_hw_constraints_init(substream); if (err < 0) { snd_printd("snd_pcm_hw_constraints_init failed\n"); - goto error; + snd_pcm_release_file(pcm_file); + return err; } - if ((err = substream->ops->open(substream)) < 0) - goto error; - - substream->hw_opened = 1; + if ((err = substream->ops->open(substream)) < 0) { + snd_pcm_release_file(pcm_file); + return err; + } + substream->ffile = file; err = snd_pcm_hw_constraints_complete(substream); if (err < 0) { snd_printd("snd_pcm_hw_constraints_complete failed\n"); - goto error; - } - - *rsubstream = substream; - return 0; - - error: - snd_pcm_release_substream(substream); - return err; -} - -EXPORT_SYMBOL(snd_pcm_open_substream); - -static int snd_pcm_open_file(struct file *file, - struct snd_pcm *pcm, - int stream, - struct snd_pcm_file **rpcm_file) -{ - struct snd_pcm_file *pcm_file; - struct snd_pcm_substream *substream; - struct snd_pcm_str *str; - int err; - - snd_assert(rpcm_file != NULL, return -EINVAL); - *rpcm_file = NULL; - - err = snd_pcm_open_substream(pcm, stream, file, &substream); - if (err < 0) + snd_pcm_release_file(pcm_file); return err; - - 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); } + file->private_data = pcm_file; *rpcm_file = pcm_file; return 0; @@ -2161,7 +2112,7 @@ static int snd_pcm_open(struct file *file, struct snd_pcm *pcm, int stream) } init_waitqueue_entry(&wait, current); add_wait_queue(&pcm->open_wait, &wait); - mutex_lock(&pcm->open_mutex); + down(&pcm->open_mutex); while (1) { err = snd_pcm_open_file(file, pcm, stream, &pcm_file); if (err >= 0) @@ -2174,16 +2125,16 @@ static int snd_pcm_open(struct file *file, struct snd_pcm *pcm, int stream) } else break; set_current_state(TASK_INTERRUPTIBLE); - mutex_unlock(&pcm->open_mutex); + up(&pcm->open_mutex); schedule(); - mutex_lock(&pcm->open_mutex); + down(&pcm->open_mutex); if (signal_pending(current)) { err = -ERESTARTSYS; break; } } remove_wait_queue(&pcm->open_wait, &wait); - mutex_unlock(&pcm->open_mutex); + up(&pcm->open_mutex); if (err < 0) goto __error; return err; @@ -2205,11 +2156,13 @@ 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; + snd_pcm_drop(substream); fasync_helper(-1, file, 0, &substream->runtime->fasync); - mutex_lock(&pcm->open_mutex); - snd_pcm_release_substream(substream); - mutex_unlock(&pcm->open_mutex); + down(&pcm->open_mutex); + snd_pcm_release_file(pcm_file); + up(&pcm->open_mutex); wake_up(&pcm->open_wait); module_put(pcm->card->module); snd_card_file_remove(pcm->card, file); @@ -2527,8 +2480,12 @@ static int snd_pcm_sync_ptr(struct snd_pcm_substream *substream, return 0; } -static int snd_pcm_common_ioctl1(struct file *file, - struct snd_pcm_substream *substream, +static int snd_pcm_playback_ioctl1(struct snd_pcm_substream *substream, + unsigned int cmd, void __user *arg); +static int snd_pcm_capture_ioctl1(struct snd_pcm_substream *substream, + unsigned int cmd, void __user *arg); + +static int snd_pcm_common_ioctl1(struct snd_pcm_substream *substream, unsigned int cmd, void __user *arg) { snd_assert(substream != NULL, return -ENXIO); @@ -2553,7 +2510,7 @@ static int snd_pcm_common_ioctl1(struct file *file, case SNDRV_PCM_IOCTL_CHANNEL_INFO: return snd_pcm_channel_info_user(substream, arg); case SNDRV_PCM_IOCTL_PREPARE: - return snd_pcm_prepare(substream, file); + return snd_pcm_prepare(substream); case SNDRV_PCM_IOCTL_RESET: return snd_pcm_reset(substream); case SNDRV_PCM_IOCTL_START: @@ -2582,21 +2539,12 @@ static int snd_pcm_common_ioctl1(struct file *file, return snd_pcm_drain(substream); case SNDRV_PCM_IOCTL_DROP: return snd_pcm_drop(substream); - case SNDRV_PCM_IOCTL_PAUSE: - { - int res; - snd_pcm_stream_lock_irq(substream); - res = snd_pcm_pause(substream, (int)(unsigned long)arg); - snd_pcm_stream_unlock_irq(substream); - return res; - } } snd_printd("unknown ioctl = 0x%x\n", cmd); return -ENOTTY; } -static int snd_pcm_playback_ioctl1(struct file *file, - struct snd_pcm_substream *substream, +static int snd_pcm_playback_ioctl1(struct snd_pcm_substream *substream, unsigned int cmd, void __user *arg) { snd_assert(substream != NULL, return -ENXIO); @@ -2671,12 +2619,19 @@ static int snd_pcm_playback_ioctl1(struct file *file, __put_user(result, _frames); return result < 0 ? result : 0; } + case SNDRV_PCM_IOCTL_PAUSE: + { + int res; + snd_pcm_stream_lock_irq(substream); + res = snd_pcm_pause(substream, (int)(unsigned long)arg); + snd_pcm_stream_unlock_irq(substream); + return res; + } } - return snd_pcm_common_ioctl1(file, substream, cmd, arg); + return snd_pcm_common_ioctl1(substream, cmd, arg); } -static int snd_pcm_capture_ioctl1(struct file *file, - struct snd_pcm_substream *substream, +static int snd_pcm_capture_ioctl1(struct snd_pcm_substream *substream, unsigned int cmd, void __user *arg) { snd_assert(substream != NULL, return -ENXIO); @@ -2752,7 +2707,7 @@ static int snd_pcm_capture_ioctl1(struct file *file, return result < 0 ? result : 0; } } - return snd_pcm_common_ioctl1(file, substream, cmd, arg); + return snd_pcm_common_ioctl1(substream, cmd, arg); } static long snd_pcm_playback_ioctl(struct file *file, unsigned int cmd, @@ -2765,8 +2720,7 @@ static long snd_pcm_playback_ioctl(struct file *file, unsigned int cmd, if (((cmd >> 8) & 0xff) != 'A') return -ENOTTY; - return snd_pcm_playback_ioctl1(file, pcm_file->substream, cmd, - (void __user *)arg); + return snd_pcm_playback_ioctl1(pcm_file->substream, cmd, (void __user *)arg); } static long snd_pcm_capture_ioctl(struct file *file, unsigned int cmd, @@ -2779,36 +2733,46 @@ static long snd_pcm_capture_ioctl(struct file *file, unsigned int cmd, if (((cmd >> 8) & 0xff) != 'A') return -ENOTTY; - return snd_pcm_capture_ioctl1(file, pcm_file->substream, cmd, - (void __user *)arg); + return snd_pcm_capture_ioctl1(pcm_file->substream, cmd, (void __user *)arg); } -int snd_pcm_kernel_ioctl(struct snd_pcm_substream *substream, - unsigned int cmd, void *arg) +int snd_pcm_kernel_playback_ioctl(struct snd_pcm_substream *substream, + unsigned int cmd, void *arg) +{ + mm_segment_t fs; + int result; + + fs = snd_enter_user(); + result = snd_pcm_playback_ioctl1(substream, cmd, (void __user *)arg); + snd_leave_user(fs); + return result; +} + +int snd_pcm_kernel_capture_ioctl(struct snd_pcm_substream *substream, + unsigned int cmd, void *arg) { mm_segment_t fs; int result; fs = snd_enter_user(); + result = snd_pcm_capture_ioctl1(substream, cmd, (void __user *)arg); + snd_leave_user(fs); + return result; +} + +int snd_pcm_kernel_ioctl(struct snd_pcm_substream *substream, + unsigned int cmd, void *arg) +{ switch (substream->stream) { case SNDRV_PCM_STREAM_PLAYBACK: - result = snd_pcm_playback_ioctl1(NULL, substream, cmd, - (void __user *)arg); - break; + return snd_pcm_kernel_playback_ioctl(substream, cmd, arg); case SNDRV_PCM_STREAM_CAPTURE: - result = snd_pcm_capture_ioctl1(NULL, substream, cmd, - (void __user *)arg); - break; + return snd_pcm_kernel_capture_ioctl(substream, cmd, arg); default: - result = -EINVAL; - break; + return -EINVAL; } - snd_leave_user(fs); - 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) { @@ -3175,7 +3139,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->mmap_count); + atomic_inc(&substream->runtime->mmap_count); return 0; } @@ -3207,11 +3171,9 @@ 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->mmap_count); + atomic_inc(&substream->runtime->mmap_count); return 0; } - -EXPORT_SYMBOL(snd_pcm_lib_mmap_iomem); #endif /* SNDRV_PCM_INFO_MMAP */ /* @@ -3255,8 +3217,6 @@ 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 8c15c66eb..d4d124e21 100644 --- a/sound/core/rawmidi.c +++ b/sound/core/rawmidi.c @@ -28,7 +28,6 @@ #include #include #include -#include #include #include #include @@ -43,7 +42,7 @@ MODULE_DESCRIPTION("Midlevel RawMidi code for ALSA."); MODULE_LICENSE("GPL"); #ifdef CONFIG_SND_OSSEMUL -static int midi_map[SNDRV_CARDS]; +static int midi_map[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS-1)] = 0}; 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."); @@ -58,7 +57,7 @@ static int snd_rawmidi_dev_disconnect(struct snd_device *device); static int snd_rawmidi_dev_unregister(struct snd_device *device); static LIST_HEAD(snd_rawmidi_devices); -static DEFINE_MUTEX(register_mutex); +static DECLARE_MUTEX(register_mutex); static struct snd_rawmidi *snd_rawmidi_search(struct snd_card *card, int device) { @@ -238,9 +237,9 @@ int snd_rawmidi_kernel_open(struct snd_card *card, int device, int subdevice, if (rfile) rfile->input = rfile->output = NULL; - mutex_lock(®ister_mutex); + down(®ister_mutex); rmidi = snd_rawmidi_search(card, device); - mutex_unlock(®ister_mutex); + up(®ister_mutex); if (rmidi == NULL) { err = -ENODEV; goto __error1; @@ -250,7 +249,7 @@ int snd_rawmidi_kernel_open(struct snd_card *card, int device, int subdevice, goto __error1; } if (!(mode & SNDRV_RAWMIDI_LFLG_NOOPENLOCK)) - mutex_lock(&rmidi->open_mutex); + down(&rmidi->open_mutex); if (mode & SNDRV_RAWMIDI_LFLG_INPUT) { if (!(rmidi->info_flags & SNDRV_RAWMIDI_INFO_INPUT)) { err = -ENXIO; @@ -360,7 +359,7 @@ int snd_rawmidi_kernel_open(struct snd_card *card, int device, int subdevice, soutput = NULL; } if (!(mode & SNDRV_RAWMIDI_LFLG_NOOPENLOCK)) - mutex_unlock(&rmidi->open_mutex); + up(&rmidi->open_mutex); if (rfile) { rfile->rmidi = rmidi; rfile->input = sinput; @@ -375,7 +374,7 @@ int snd_rawmidi_kernel_open(struct snd_card *card, int device, int subdevice, snd_rawmidi_runtime_free(soutput); module_put(rmidi->card->module); if (!(mode & SNDRV_RAWMIDI_LFLG_NOOPENLOCK)) - mutex_unlock(&rmidi->open_mutex); + up(&rmidi->open_mutex); __error1: return err; } @@ -423,7 +422,7 @@ static int snd_rawmidi_open(struct inode *inode, struct file *file) } init_waitqueue_entry(&wait, current); add_wait_queue(&rmidi->open_wait, &wait); - mutex_lock(&rmidi->open_mutex); + down(&rmidi->open_mutex); while (1) { subdevice = -1; down_read(&card->controls_rwsem); @@ -447,9 +446,9 @@ static int snd_rawmidi_open(struct inode *inode, struct file *file) } else break; set_current_state(TASK_INTERRUPTIBLE); - mutex_unlock(&rmidi->open_mutex); + up(&rmidi->open_mutex); schedule(); - mutex_lock(&rmidi->open_mutex); + down(&rmidi->open_mutex); if (signal_pending(current)) { err = -ERESTARTSYS; break; @@ -468,7 +467,7 @@ static int snd_rawmidi_open(struct inode *inode, struct file *file) snd_card_file_remove(card, file); kfree(rawmidi_file); } - mutex_unlock(&rmidi->open_mutex); + up(&rmidi->open_mutex); return err; } @@ -481,7 +480,7 @@ int snd_rawmidi_kernel_release(struct snd_rawmidi_file * rfile) snd_assert(rfile != NULL, return -ENXIO); snd_assert(rfile->input != NULL || rfile->output != NULL, return -ENXIO); rmidi = rfile->rmidi; - mutex_lock(&rmidi->open_mutex); + down(&rmidi->open_mutex); if (rfile->input != NULL) { substream = rfile->input; rfile->input = NULL; @@ -515,7 +514,7 @@ int snd_rawmidi_kernel_release(struct snd_rawmidi_file * rfile) } rmidi->streams[SNDRV_RAWMIDI_STREAM_OUTPUT].substream_opened--; } - mutex_unlock(&rmidi->open_mutex); + up(&rmidi->open_mutex); module_put(rmidi->card->module); return 0; } @@ -577,9 +576,9 @@ int snd_rawmidi_info_select(struct snd_card *card, struct snd_rawmidi_info *info struct snd_rawmidi_substream *substream; struct list_head *list; - mutex_lock(®ister_mutex); + down(®ister_mutex); rmidi = snd_rawmidi_search(card, info->device); - mutex_unlock(®ister_mutex); + up(®ister_mutex); if (!rmidi) return -ENXIO; if (info->stream < 0 || info->stream > 1) @@ -631,8 +630,7 @@ int snd_rawmidi_output_params(struct snd_rawmidi_substream *substream, return -EINVAL; } if (params->buffer_size != runtime->buffer_size) { - newbuf = kmalloc(params->buffer_size, GFP_KERNEL); - if (!newbuf) + if ((newbuf = (char *) kmalloc(params->buffer_size, GFP_KERNEL)) == NULL) return -ENOMEM; kfree(runtime->buffer); runtime->buffer = newbuf; @@ -658,8 +656,7 @@ int snd_rawmidi_input_params(struct snd_rawmidi_substream *substream, return -EINVAL; } if (params->buffer_size != runtime->buffer_size) { - newbuf = kmalloc(params->buffer_size, GFP_KERNEL); - if (!newbuf) + if ((newbuf = (char *) kmalloc(params->buffer_size, GFP_KERNEL)) == NULL) return -ENOMEM; kfree(runtime->buffer); runtime->buffer = newbuf; @@ -821,7 +818,7 @@ static int snd_rawmidi_control_ioctl(struct snd_card *card, if (get_user(device, (int __user *)argp)) return -EFAULT; - mutex_lock(®ister_mutex); + down(®ister_mutex); device = device < 0 ? 0 : device + 1; while (device < SNDRV_RAWMIDI_DEVICES) { if (snd_rawmidi_search(card, device)) @@ -830,7 +827,7 @@ static int snd_rawmidi_control_ioctl(struct snd_card *card, } if (device == SNDRV_RAWMIDI_DEVICES) device = -1; - mutex_unlock(®ister_mutex); + up(®ister_mutex); if (put_user(device, (int __user *)argp)) return -EFAULT; return 0; @@ -1317,7 +1314,7 @@ static void snd_rawmidi_proc_info_read(struct snd_info_entry *entry, rmidi = entry->private_data; snd_iprintf(buffer, "%s\n\n", rmidi->name); - mutex_lock(&rmidi->open_mutex); + down(&rmidi->open_mutex); if (rmidi->info_flags & SNDRV_RAWMIDI_INFO_OUTPUT) { list_for_each(list, &rmidi->streams[SNDRV_RAWMIDI_STREAM_OUTPUT].substreams) { substream = list_entry(list, struct snd_rawmidi_substream, list); @@ -1358,7 +1355,7 @@ static void snd_rawmidi_proc_info_read(struct snd_info_entry *entry, } } } - mutex_unlock(&rmidi->open_mutex); + up(&rmidi->open_mutex); } /* @@ -1439,7 +1436,7 @@ int snd_rawmidi_new(struct snd_card *card, char *id, int device, } rmidi->card = card; rmidi->device = device; - mutex_init(&rmidi->open_mutex); + init_MUTEX(&rmidi->open_mutex); init_waitqueue_head(&rmidi->open_wait); if (id != NULL) strlcpy(rmidi->id, id, sizeof(rmidi->id)); @@ -1510,9 +1507,9 @@ static int snd_rawmidi_dev_register(struct snd_device *device) if (rmidi->device >= SNDRV_RAWMIDI_DEVICES) return -ENOMEM; - mutex_lock(®ister_mutex); + down(®ister_mutex); if (snd_rawmidi_search(rmidi->card, rmidi->device)) { - mutex_unlock(®ister_mutex); + up(®ister_mutex); return -EBUSY; } list_add_tail(&rmidi->list, &snd_rawmidi_devices); @@ -1522,14 +1519,14 @@ static int snd_rawmidi_dev_register(struct snd_device *device) &snd_rawmidi_f_ops, rmidi, name)) < 0) { snd_printk(KERN_ERR "unable to register rawmidi device %i:%i\n", rmidi->card->number, rmidi->device); list_del(&rmidi->list); - mutex_unlock(®ister_mutex); + up(®ister_mutex); return err; } if (rmidi->ops && rmidi->ops->dev_register && (err = rmidi->ops->dev_register(rmidi)) < 0) { snd_unregister_device(SNDRV_DEVICE_TYPE_RAWMIDI, rmidi->card, rmidi->device); list_del(&rmidi->list); - mutex_unlock(®ister_mutex); + up(®ister_mutex); return err; } #ifdef CONFIG_SND_OSSEMUL @@ -1556,11 +1553,12 @@ static int snd_rawmidi_dev_register(struct snd_device *device) } } #endif /* CONFIG_SND_OSSEMUL */ - mutex_unlock(®ister_mutex); + up(®ister_mutex); sprintf(name, "midi%d", rmidi->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); @@ -1585,9 +1583,9 @@ static int snd_rawmidi_dev_disconnect(struct snd_device *device) { struct snd_rawmidi *rmidi = device->device_data; - mutex_lock(®ister_mutex); + down(®ister_mutex); list_del_init(&rmidi->list); - mutex_unlock(®ister_mutex); + up(®ister_mutex); return 0; } @@ -1596,7 +1594,7 @@ static int snd_rawmidi_dev_unregister(struct snd_device *device) struct snd_rawmidi *rmidi = device->device_data; snd_assert(rmidi != NULL, return -ENXIO); - mutex_lock(®ister_mutex); + down(®ister_mutex); list_del(&rmidi->list); if (rmidi->proc_entry) { snd_info_unregister(rmidi->proc_entry); @@ -1618,7 +1616,7 @@ static int snd_rawmidi_dev_unregister(struct snd_device *device) if (rmidi->ops && rmidi->ops->dev_unregister) rmidi->ops->dev_unregister(rmidi); snd_unregister_device(SNDRV_DEVICE_TYPE_RAWMIDI, rmidi->card, rmidi->device); - mutex_unlock(®ister_mutex); + up(®ister_mutex); #if defined(CONFIG_SND_SEQUENCER) || (defined(MODULE) && defined(CONFIG_SND_SEQUENCER_MODULE)) if (rmidi->seq_dev) { snd_device_free(rmidi->card, rmidi->seq_dev); diff --git a/sound/core/seq/oss/seq_oss.c b/sound/core/seq/oss/seq_oss.c index e72341356..c98f0ba13 100644 --- a/sound/core/seq/oss/seq_oss.c +++ b/sound/core/seq/oss/seq_oss.c @@ -24,7 +24,6 @@ #include #include #include -#include #include #include #include @@ -125,7 +124,7 @@ module_exit(alsa_seq_oss_exit) * ALSA minor device interface */ -static DEFINE_MUTEX(register_mutex); +static DECLARE_MUTEX(register_mutex); static int odev_open(struct inode *inode, struct file *file) @@ -137,9 +136,9 @@ odev_open(struct inode *inode, struct file *file) else level = SNDRV_SEQ_OSS_MODE_SYNTH; - mutex_lock(®ister_mutex); + down(®ister_mutex); rc = snd_seq_oss_open(file, level); - mutex_unlock(®ister_mutex); + up(®ister_mutex); return rc; } @@ -154,9 +153,9 @@ odev_release(struct inode *inode, struct file *file) snd_seq_oss_drain_write(dp); - mutex_lock(®ister_mutex); + down(®ister_mutex); snd_seq_oss_release(dp); - mutex_unlock(®ister_mutex); + up(®ister_mutex); return 0; } @@ -225,13 +224,13 @@ register_device(void) { int rc; - mutex_lock(®ister_mutex); + down(®ister_mutex); if ((rc = snd_register_oss_device(SNDRV_OSS_DEVICE_TYPE_SEQUENCER, NULL, 0, &seq_oss_f_ops, NULL, SNDRV_SEQ_OSS_DEVNAME)) < 0) { snd_printk(KERN_ERR "can't register device seq\n"); - mutex_unlock(®ister_mutex); + up(®ister_mutex); return rc; } if ((rc = snd_register_oss_device(SNDRV_OSS_DEVICE_TYPE_MUSIC, @@ -240,24 +239,24 @@ register_device(void) SNDRV_SEQ_OSS_DEVNAME)) < 0) { snd_printk(KERN_ERR "can't register device music\n"); snd_unregister_oss_device(SNDRV_OSS_DEVICE_TYPE_SEQUENCER, NULL, 0); - mutex_unlock(®ister_mutex); + up(®ister_mutex); return rc; } debug_printk(("device registered\n")); - mutex_unlock(®ister_mutex); + up(®ister_mutex); return 0; } static void unregister_device(void) { - mutex_lock(®ister_mutex); + down(®ister_mutex); debug_printk(("device unregistered\n")); if (snd_unregister_oss_device(SNDRV_OSS_DEVICE_TYPE_MUSIC, NULL, 0) < 0) snd_printk(KERN_ERR "error unregister device music\n"); if (snd_unregister_oss_device(SNDRV_OSS_DEVICE_TYPE_SEQUENCER, NULL, 0) < 0) snd_printk(KERN_ERR "error unregister device seq\n"); - mutex_unlock(®ister_mutex); + up(®ister_mutex); } /* @@ -271,12 +270,12 @@ static struct snd_info_entry *info_entry; static void info_read(struct snd_info_entry *entry, struct snd_info_buffer *buf) { - mutex_lock(®ister_mutex); + down(®ister_mutex); snd_iprintf(buf, "OSS sequencer emulation version %s\n", SNDRV_SEQ_OSS_VERSION_STR); snd_seq_oss_system_info_read(buf); snd_seq_oss_synth_info_read(buf); snd_seq_oss_midi_info_read(buf); - mutex_unlock(®ister_mutex); + up(®ister_mutex); } @@ -291,6 +290,7 @@ 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 2f0d8773a..20f954bc7 100644 --- a/sound/core/seq/seq.c +++ b/sound/core/seq/seq.c @@ -129,3 +129,25 @@ 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 532a660df..fd2032eae 100644 --- a/sound/core/seq/seq_clientmgr.c +++ b/sound/core/seq/seq_clientmgr.c @@ -67,7 +67,7 @@ #define SNDRV_SEQ_LFLG_OPEN (SNDRV_SEQ_LFLG_INPUT|SNDRV_SEQ_LFLG_OUTPUT) static DEFINE_SPINLOCK(clients_lock); -static DEFINE_MUTEX(register_mutex); +static DECLARE_MUTEX(register_mutex); /* * client table @@ -237,7 +237,7 @@ static struct snd_seq_client *seq_create_client1(int client_index, int poolsize) client->type = NO_CLIENT; snd_use_lock_init(&client->use_lock); rwlock_init(&client->ports_lock); - mutex_init(&client->ports_mutex); + init_MUTEX(&client->ports_mutex); INIT_LIST_HEAD(&client->ports_list_head); /* find free slot in the client table */ @@ -290,7 +290,7 @@ static int seq_free_client1(struct snd_seq_client *client) static void seq_free_client(struct snd_seq_client * client) { - mutex_lock(®ister_mutex); + down(®ister_mutex); switch (client->type) { case NO_CLIENT: snd_printk(KERN_WARNING "Seq: Trying to free unused client %d\n", @@ -306,7 +306,7 @@ static void seq_free_client(struct snd_seq_client * client) snd_printk(KERN_ERR "Seq: Trying to free client %d with undefined type = %d\n", client->number, client->type); } - mutex_unlock(®ister_mutex); + up(®ister_mutex); snd_seq_system_client_ev_client_exit(client->number); } @@ -322,11 +322,11 @@ static int snd_seq_open(struct inode *inode, struct file *file) struct snd_seq_client *client; struct snd_seq_user_client *user; - if (mutex_lock_interruptible(®ister_mutex)) + if (down_interruptible(®ister_mutex)) return -ERESTARTSYS; client = seq_create_client1(-1, SNDRV_SEQ_DEFAULT_EVENTS); if (client == NULL) { - mutex_unlock(®ister_mutex); + up(®ister_mutex); return -ENOMEM; /* failure code */ } @@ -346,14 +346,14 @@ static int snd_seq_open(struct inode *inode, struct file *file) if (user->fifo == NULL) { seq_free_client1(client); kfree(client); - mutex_unlock(®ister_mutex); + up(®ister_mutex); return -ENOMEM; } } usage_alloc(&client_usage, 1); client->type = USER_CLIENT; - mutex_unlock(®ister_mutex); + up(®ister_mutex); c = client->number; file->private_data = client; @@ -1714,8 +1714,6 @@ 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) { @@ -1745,7 +1743,7 @@ static int snd_seq_ioctl_get_queue_timer(struct snd_seq_client *client, if (queue == NULL) return -EINVAL; - if (mutex_lock_interruptible(&queue->timer_mutex)) { + if (down_interruptible(&queue->timer_mutex)) { queuefree(queue); return -ERESTARTSYS; } @@ -1758,7 +1756,7 @@ static int snd_seq_ioctl_get_queue_timer(struct snd_seq_client *client, timer.u.alsa.id = tmr->alsa_id; timer.u.alsa.resolution = tmr->preferred_resolution; } - mutex_unlock(&queue->timer_mutex); + up(&queue->timer_mutex); queuefree(queue); if (copy_to_user(arg, &timer, sizeof(timer))) @@ -1787,7 +1785,7 @@ static int snd_seq_ioctl_set_queue_timer(struct snd_seq_client *client, q = queueptr(timer.queue); if (q == NULL) return -ENXIO; - if (mutex_lock_interruptible(&q->timer_mutex)) { + if (down_interruptible(&q->timer_mutex)) { queuefree(q); return -ERESTARTSYS; } @@ -1799,7 +1797,7 @@ static int snd_seq_ioctl_set_queue_timer(struct snd_seq_client *client, tmr->preferred_resolution = timer.u.alsa.resolution; } result = snd_seq_queue_timer_open(timer.queue); - mutex_unlock(&q->timer_mutex); + up(&q->timer_mutex); queuefree(q); } else { return -EPERM; @@ -1868,7 +1866,8 @@ static int snd_seq_ioctl_get_client_pool(struct snd_seq_client *client, info.output_pool = cptr->pool->size; info.output_room = cptr->pool->room; info.output_free = info.output_pool; - info.output_free = snd_seq_unused_cells(cptr->pool); + if (cptr->pool) + info.output_free = snd_seq_unused_cells(cptr->pool); if (cptr->type == USER_CLIENT) { info.input_pool = cptr->data.user.fifo_pool_size; info.input_free = info.input_pool; @@ -2231,7 +2230,7 @@ int snd_seq_create_kernel_client(struct snd_card *card, int client_index, if (card == NULL && client_index >= SNDRV_SEQ_GLOBAL_CLIENTS) return -EINVAL; - if (mutex_lock_interruptible(®ister_mutex)) + if (down_interruptible(®ister_mutex)) return -ERESTARTSYS; if (card) { @@ -2244,7 +2243,7 @@ int snd_seq_create_kernel_client(struct snd_card *card, int client_index, /* empty write queue as default */ client = seq_create_client1(client_index, 0); if (client == NULL) { - mutex_unlock(®ister_mutex); + up(®ister_mutex); return -EBUSY; /* failure code */ } usage_alloc(&client_usage, 1); @@ -2257,7 +2256,7 @@ int snd_seq_create_kernel_client(struct snd_card *card, int client_index, va_end(args); client->type = KERNEL_CLIENT; - mutex_unlock(®ister_mutex); + up(®ister_mutex); /* make others aware this new client */ snd_seq_system_client_ev_client_start(client->number); @@ -2266,8 +2265,6 @@ 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) { @@ -2284,7 +2281,6 @@ 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 @@ -2333,8 +2329,6 @@ 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) * @@ -2347,7 +2341,6 @@ 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 @@ -2384,7 +2377,6 @@ 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 @@ -2405,7 +2397,6 @@ 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) @@ -2423,8 +2414,6 @@ 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 @@ -2475,7 +2464,7 @@ static void snd_seq_info_dump_ports(struct snd_info_buffer *buffer, { struct list_head *l; - mutex_lock(&client->ports_mutex); + down(&client->ports_mutex); list_for_each(l, &client->ports_list_head) { struct snd_seq_client_port *p = list_entry(l, struct snd_seq_client_port, list); snd_iprintf(buffer, " Port %3d : \"%s\" (%c%c%c%c)\n", @@ -2487,7 +2476,7 @@ static void snd_seq_info_dump_ports(struct snd_info_buffer *buffer, snd_seq_info_dump_subscribers(buffer, &p->c_src, 1, " Connecting To: "); snd_seq_info_dump_subscribers(buffer, &p->c_dest, 0, " Connected From: "); } - mutex_unlock(&client->ports_mutex); + up(&client->ports_mutex); } @@ -2561,16 +2550,16 @@ int __init snd_sequencer_device_init(void) { int err; - if (mutex_lock_interruptible(®ister_mutex)) + if (down_interruptible(®ister_mutex)) return -ERESTARTSYS; if ((err = snd_register_device(SNDRV_DEVICE_TYPE_SEQUENCER, NULL, 0, &snd_seq_f_ops, NULL, "seq")) < 0) { - mutex_unlock(®ister_mutex); + up(®ister_mutex); return err; } - mutex_unlock(®ister_mutex); + up(®ister_mutex); return 0; } diff --git a/sound/core/seq/seq_clientmgr.h b/sound/core/seq/seq_clientmgr.h index 5e04e20e2..450091ca1 100644 --- a/sound/core/seq/seq_clientmgr.h +++ b/sound/core/seq/seq_clientmgr.h @@ -58,7 +58,7 @@ struct snd_seq_client { int num_ports; /* number of ports */ struct list_head ports_list_head; rwlock_t ports_lock; - struct mutex ports_mutex; + struct semaphore ports_mutex; int convert32; /* convert 32->64bit */ /* output pool */ diff --git a/sound/core/seq/seq_device.c b/sound/core/seq/seq_device.c index 102ff548c..9ece443fb 100644 --- a/sound/core/seq/seq_device.c +++ b/sound/core/seq/seq_device.c @@ -45,7 +45,6 @@ #include #include #include -#include MODULE_AUTHOR("Takashi Iwai "); MODULE_DESCRIPTION("ALSA sequencer device management"); @@ -70,7 +69,7 @@ struct ops_list { struct list_head dev_list; /* list of devices */ int num_devices; /* number of associated devices */ int num_init_devices; /* number of initialized devices */ - struct mutex reg_mutex; + struct semaphore reg_mutex; struct list_head list; /* next driver */ }; @@ -78,9 +77,9 @@ struct ops_list { static LIST_HEAD(opslist); static int num_ops; -static DEFINE_MUTEX(ops_mutex); +static DECLARE_MUTEX(ops_mutex); #ifdef CONFIG_PROC_FS -static struct snd_info_entry *info_entry; +static struct snd_info_entry *info_entry = NULL; #endif /* @@ -109,7 +108,7 @@ static void snd_seq_device_info(struct snd_info_entry *entry, { struct list_head *head; - mutex_lock(&ops_mutex); + down(&ops_mutex); list_for_each(head, &opslist) { struct ops_list *ops = list_entry(head, struct ops_list, list); snd_iprintf(buffer, "snd-%s%s%s%s,%d\n", @@ -119,7 +118,7 @@ static void snd_seq_device_info(struct snd_info_entry *entry, ops->driver & DRIVER_LOCKED ? ",locked" : "", ops->num_devices); } - mutex_unlock(&ops_mutex); + up(&ops_mutex); } #endif @@ -155,20 +154,20 @@ void snd_seq_device_load_drivers(void) if (! current->fs->root) return; - mutex_lock(&ops_mutex); + down(&ops_mutex); list_for_each(head, &opslist) { struct ops_list *ops = list_entry(head, struct ops_list, list); if (! (ops->driver & DRIVER_LOADED) && ! (ops->driver & DRIVER_REQUESTED)) { ops->used++; - mutex_unlock(&ops_mutex); + up(&ops_mutex); ops->driver |= DRIVER_REQUESTED; request_module("snd-%s", ops->id); - mutex_lock(&ops_mutex); + down(&ops_mutex); ops->used--; } } - mutex_unlock(&ops_mutex); + up(&ops_mutex); #endif } @@ -215,10 +214,10 @@ int snd_seq_device_new(struct snd_card *card, int device, char *id, int argsize, dev->status = SNDRV_SEQ_DEVICE_FREE; /* add this device to the list */ - mutex_lock(&ops->reg_mutex); + down(&ops->reg_mutex); list_add_tail(&dev->list, &ops->dev_list); ops->num_devices++; - mutex_unlock(&ops->reg_mutex); + up(&ops->reg_mutex); unlock_driver(ops); @@ -247,10 +246,10 @@ static int snd_seq_device_free(struct snd_seq_device *dev) return -ENXIO; /* remove the device from the list */ - mutex_lock(&ops->reg_mutex); + down(&ops->reg_mutex); list_del(&dev->list); ops->num_devices--; - mutex_unlock(&ops->reg_mutex); + up(&ops->reg_mutex); free_device(dev, ops); if (dev->private_free) @@ -345,7 +344,7 @@ int snd_seq_device_register_driver(char *id, struct snd_seq_dev_ops *entry, return -EBUSY; } - mutex_lock(&ops->reg_mutex); + down(&ops->reg_mutex); /* copy driver operators */ ops->ops = *entry; ops->driver |= DRIVER_LOADED; @@ -356,7 +355,7 @@ int snd_seq_device_register_driver(char *id, struct snd_seq_dev_ops *entry, struct snd_seq_device *dev = list_entry(head, struct snd_seq_device, list); init_device(dev, ops); } - mutex_unlock(&ops->reg_mutex); + up(&ops->reg_mutex); unlock_driver(ops); snd_seq_autoload_unlock(); @@ -372,29 +371,24 @@ static struct ops_list * create_driver(char *id) { struct ops_list *ops; - ops = kzalloc(sizeof(*ops), GFP_KERNEL); + ops = kmalloc(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); - + init_MUTEX(&ops->reg_mutex); ops->driver = DRIVER_EMPTY; INIT_LIST_HEAD(&ops->dev_list); /* lock this instance */ ops->used = 1; /* register driver entry */ - mutex_lock(&ops_mutex); + down(&ops_mutex); list_add_tail(&ops->list, &opslist); num_ops++; - mutex_unlock(&ops_mutex); + up(&ops_mutex); return ops; } @@ -420,7 +414,7 @@ int snd_seq_device_unregister_driver(char *id) } /* close and release all devices associated with this driver */ - mutex_lock(&ops->reg_mutex); + down(&ops->reg_mutex); ops->driver |= DRIVER_LOCKED; /* do not remove this driver recursively */ list_for_each(head, &ops->dev_list) { struct snd_seq_device *dev = list_entry(head, struct snd_seq_device, list); @@ -431,7 +425,7 @@ int snd_seq_device_unregister_driver(char *id) if (ops->num_init_devices > 0) snd_printk(KERN_ERR "free_driver: init_devices > 0!! (%d)\n", ops->num_init_devices); - mutex_unlock(&ops->reg_mutex); + up(&ops->reg_mutex); unlock_driver(ops); @@ -449,7 +443,7 @@ static void remove_drivers(void) { struct list_head *head; - mutex_lock(&ops_mutex); + down(&ops_mutex); head = opslist.next; while (head != &opslist) { struct ops_list *ops = list_entry(head, struct ops_list, list); @@ -462,7 +456,7 @@ static void remove_drivers(void) } else head = head->next; } - mutex_unlock(&ops_mutex); + up(&ops_mutex); } /* @@ -525,16 +519,16 @@ static struct ops_list * find_driver(char *id, int create_if_empty) { struct list_head *head; - mutex_lock(&ops_mutex); + down(&ops_mutex); list_for_each(head, &opslist) { struct ops_list *ops = list_entry(head, struct ops_list, list); if (strcmp(ops->id, id) == 0) { ops->used++; - mutex_unlock(&ops_mutex); + up(&ops_mutex); return ops; } } - mutex_unlock(&ops_mutex); + up(&ops_mutex); if (create_if_empty) return create_driver(id); return NULL; @@ -542,9 +536,9 @@ static struct ops_list * find_driver(char *id, int create_if_empty) static void unlock_driver(struct ops_list *ops) { - mutex_lock(&ops_mutex); + down(&ops_mutex); ops->used--; - mutex_unlock(&ops_mutex); + up(&ops_mutex); } @@ -560,6 +554,7 @@ 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 e55488d12..2a283a59e 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; +static int duplex = 0; module_param(ports, int, 0444); MODULE_PARM_DESC(ports, "number of ports to be created"); @@ -171,9 +171,7 @@ 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 - | SNDRV_SEQ_PORT_TYPE_SOFTWARE - | SNDRV_SEQ_PORT_TYPE_PORT; + pinfo.type = SNDRV_SEQ_PORT_TYPE_MIDI_GENERIC; 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 142e9e688..acce21afd 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, void (*read)(struct snd_info_entry *, - struct snd_info_buffer *)) +create_info_entry(char *name, int size, void (*read)(struct snd_info_entry *, + struct snd_info_buffer *)) { struct snd_info_entry *entry; @@ -43,6 +43,7 @@ create_info_entry(char *name, 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); @@ -54,11 +55,11 @@ create_info_entry(char *name, void (*read)(struct snd_info_entry *, /* create all our /proc entries */ int __init snd_seq_info_init(void) { - queues_entry = create_info_entry("queues", + queues_entry = create_info_entry("queues", 512 + (256 * SNDRV_SEQ_MAX_QUEUES), snd_seq_info_queues_read); - clients_entry = create_info_entry("clients", + clients_entry = create_info_entry("clients", 512 + (256 * SNDRV_SEQ_MAX_CLIENTS), snd_seq_info_clients_read); - timer_entry = create_info_entry("timer", snd_seq_info_timer_read); + timer_entry = create_info_entry("timer", 1024, snd_seq_info_timer_read); return 0; } diff --git a/sound/core/seq/seq_instr.c b/sound/core/seq/seq_instr.c index f30d171b6..487452063 100644 --- a/sound/core/seq/seq_instr.c +++ b/sound/core/seq/seq_instr.c @@ -36,7 +36,7 @@ static void snd_instr_lock_ops(struct snd_seq_kinstr_list *list) if (!(list->flags & SNDRV_SEQ_INSTR_FLG_DIRECT)) { spin_lock_irqsave(&list->ops_lock, list->ops_flags); } else { - mutex_lock(&list->ops_mutex); + down(&list->ops_mutex); } } @@ -45,7 +45,7 @@ static void snd_instr_unlock_ops(struct snd_seq_kinstr_list *list) if (!(list->flags & SNDRV_SEQ_INSTR_FLG_DIRECT)) { spin_unlock_irqrestore(&list->ops_lock, list->ops_flags); } else { - mutex_unlock(&list->ops_mutex); + up(&list->ops_mutex); } } @@ -82,7 +82,7 @@ struct snd_seq_kinstr_list *snd_seq_instr_list_new(void) return NULL; spin_lock_init(&list->lock); spin_lock_init(&list->ops_lock); - mutex_init(&list->ops_mutex); + init_MUTEX(&list->ops_mutex); list->owner = -1; return list; } diff --git a/sound/core/seq/seq_lock.c b/sound/core/seq/seq_lock.c index 1a34941d4..a837a94b2 100644 --- a/sound/core/seq/seq_lock.c +++ b/sound/core/seq/seq_lock.c @@ -44,6 +44,4 @@ 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 4bffe509f..40b4f679c 100644 --- a/sound/core/seq/seq_memory.c +++ b/sound/core/seq/seq_memory.c @@ -118,8 +118,6 @@ int snd_seq_dump_var_event(const struct snd_seq_event *event, return 0; } -EXPORT_SYMBOL(snd_seq_dump_var_event); - /* * exported: @@ -169,7 +167,6 @@ 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 63e91431a..39c60d9e1 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 contiguous block of memory, if we dynamicly +/* design note: the pool is a contigious 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 1daa5b069..ce0df8615 100644 --- a/sound/core/seq/seq_midi.c +++ b/sound/core/seq/seq_midi.c @@ -32,7 +32,7 @@ Possible options for midisynth module: #include #include #include -#include +#include #include #include #include @@ -70,7 +70,7 @@ struct seq_midisynth_client { }; static struct seq_midisynth_client *synths[SNDRV_CARDS]; -static DEFINE_MUTEX(register_mutex); +static DECLARE_MUTEX(register_mutex); /* handle rawmidi input event (MIDI v1.0 stream) */ static void snd_midi_input_event(struct snd_rawmidi_substream *substream) @@ -278,7 +278,6 @@ 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; @@ -309,23 +308,23 @@ snd_seq_midisynth_register_port(struct snd_seq_device *dev) if (ports > (256 / SNDRV_RAWMIDI_DEVICES)) ports = 256 / SNDRV_RAWMIDI_DEVICES; - mutex_lock(®ister_mutex); + down(®ister_mutex); client = synths[card->number]; if (client == NULL) { newclient = 1; client = kzalloc(sizeof(*client), GFP_KERNEL); if (client == NULL) { - mutex_unlock(®ister_mutex); + up(®ister_mutex); kfree(info); return -ENOMEM; } client->seq_client = snd_seq_create_kernel_client( - card, 0, "%s", card->shortname[0] ? - (const char *)card->shortname : "External MIDI"); + card, 0, "%s", info->name[0] ? + (const char *)info->name : "External MIDI"); if (client->seq_client < 0) { kfree(client); - mutex_unlock(®ister_mutex); + up(®ister_mutex); kfree(info); return -ENOMEM; } @@ -377,9 +376,7 @@ 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 - | SNDRV_SEQ_PORT_TYPE_HARDWARE - | SNDRV_SEQ_PORT_TYPE_PORT; + port->type = SNDRV_SEQ_PORT_TYPE_MIDI_GENERIC; port->midi_channels = 16; memset(&pcallbacks, 0, sizeof(pcallbacks)); pcallbacks.owner = THIS_MODULE; @@ -390,8 +387,6 @@ 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; @@ -402,7 +397,7 @@ snd_seq_midisynth_register_port(struct snd_seq_device *dev) client->num_ports++; if (newclient) synths[card->number] = client; - mutex_unlock(®ister_mutex); + up(®ister_mutex); kfree(info); kfree(port); return 0; /* success */ @@ -419,7 +414,7 @@ snd_seq_midisynth_register_port(struct snd_seq_device *dev) } kfree(info); kfree(port); - mutex_unlock(®ister_mutex); + up(®ister_mutex); return -ENOMEM; } @@ -432,10 +427,10 @@ snd_seq_midisynth_unregister_port(struct snd_seq_device *dev) struct snd_card *card = dev->card; int device = dev->device, p, ports; - mutex_lock(®ister_mutex); + down(®ister_mutex); client = synths[card->number]; if (client == NULL || client->ports[device] == NULL) { - mutex_unlock(®ister_mutex); + up(®ister_mutex); return -ENODEV; } ports = client->ports_per_device[device]; @@ -451,7 +446,7 @@ snd_seq_midisynth_unregister_port(struct snd_seq_device *dev) synths[card->number] = NULL; kfree(client); } - mutex_unlock(®ister_mutex); + up(®ister_mutex); return 0; } diff --git a/sound/core/seq/seq_ports.c b/sound/core/seq/seq_ports.c index 8c64b58ff..2b384fd79 100644 --- a/sound/core/seq/seq_ports.c +++ b/sound/core/seq/seq_ports.c @@ -159,7 +159,7 @@ struct snd_seq_client_port *snd_seq_create_port(struct snd_seq_client *client, port_subs_info_init(&new_port->c_dest); num = port >= 0 ? port : 0; - mutex_lock(&client->ports_mutex); + down(&client->ports_mutex); write_lock_irqsave(&client->ports_lock, flags); list_for_each(l, &client->ports_list_head) { struct snd_seq_client_port *p = list_entry(l, struct snd_seq_client_port, list); @@ -173,7 +173,7 @@ struct snd_seq_client_port *snd_seq_create_port(struct snd_seq_client *client, client->num_ports++; new_port->addr.port = num; /* store the port number in the port */ write_unlock_irqrestore(&client->ports_lock, flags); - mutex_unlock(&client->ports_mutex); + up(&client->ports_mutex); sprintf(new_port->name, "port-%d", num); return new_port; @@ -221,6 +221,7 @@ 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; @@ -258,6 +259,7 @@ static void clear_subscriber_list(struct snd_seq_client *client, snd_seq_client_unlock(c); } } + up_write(&grp->list_mutex); } /* delete port data */ @@ -290,7 +292,7 @@ int snd_seq_delete_port(struct snd_seq_client *client, int port) struct list_head *l; struct snd_seq_client_port *found = NULL; - mutex_lock(&client->ports_mutex); + down(&client->ports_mutex); write_lock_irqsave(&client->ports_lock, flags); list_for_each(l, &client->ports_list_head) { struct snd_seq_client_port *p = list_entry(l, struct snd_seq_client_port, list); @@ -303,7 +305,7 @@ int snd_seq_delete_port(struct snd_seq_client *client, int port) } } write_unlock_irqrestore(&client->ports_lock, flags); - mutex_unlock(&client->ports_mutex); + up(&client->ports_mutex); if (found) return port_delete(client, found); else @@ -319,11 +321,13 @@ int snd_seq_delete_all_ports(struct snd_seq_client *client) /* move the port list to deleted_list, and * clear the port list in the client data. */ - mutex_lock(&client->ports_mutex); + down(&client->ports_mutex); write_lock_irqsave(&client->ports_lock, flags); if (! list_empty(&client->ports_list_head)) { - list_add(&deleted_list, &client->ports_list_head); - list_del_init(&client->ports_list_head); + __list_add(&deleted_list, + client->ports_list_head.prev, + client->ports_list_head.next); + INIT_LIST_HEAD(&client->ports_list_head); } else { INIT_LIST_HEAD(&deleted_list); } @@ -337,7 +341,7 @@ int snd_seq_delete_all_ports(struct snd_seq_client *client) snd_seq_system_client_ev_port_exit(port->addr.client, port->addr.port); port_delete(client, port); } - mutex_unlock(&client->ports_mutex); + up(&client->ports_mutex); return 0; } @@ -514,7 +518,7 @@ int snd_seq_port_connect(struct snd_seq_client *connector, atomic_set(&subs->ref_count, 2); down_write(&src->list_mutex); - down_write_nested(&dest->list_mutex, SINGLE_DEPTH_NESTING); + down_write(&dest->list_mutex); exclusive = info->flags & SNDRV_SEQ_PORT_SUBS_EXCLUSIVE ? 1 : 0; err = -EBUSY; @@ -587,7 +591,7 @@ int snd_seq_port_disconnect(struct snd_seq_client *connector, unsigned long flags; down_write(&src->list_mutex); - down_write_nested(&dest->list_mutex, SINGLE_DEPTH_NESTING); + down_write(&dest->list_mutex); /* look for the connection */ list_for_each(p, &src->list_head) { @@ -673,7 +677,6 @@ int snd_seq_event_port_attach(int client, return ret; } -EXPORT_SYMBOL(snd_seq_event_port_attach); /* * Detach the driver from a port. @@ -693,5 +696,3 @@ 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_queue.c b/sound/core/seq/seq_queue.c index 9b87bb0c7..9cf20f045 100644 --- a/sound/core/seq/seq_queue.c +++ b/sound/core/seq/seq_queue.c @@ -119,7 +119,7 @@ static struct snd_seq_queue *queue_new(int owner, int locked) spin_lock_init(&q->owner_lock); spin_lock_init(&q->check_lock); - mutex_init(&q->timer_mutex); + init_MUTEX(&q->timer_mutex); snd_use_lock_init(&q->use_lock); q->queue = -1; @@ -516,7 +516,7 @@ int snd_seq_queue_use(int queueid, int client, int use) queue = queueptr(queueid); if (queue == NULL) return -EINVAL; - mutex_lock(&queue->timer_mutex); + down(&queue->timer_mutex); if (use) { if (!test_and_set_bit(client, queue->clients_bitmap)) queue->clients++; @@ -531,7 +531,7 @@ int snd_seq_queue_use(int queueid, int client, int use) } else { snd_seq_timer_close(queue); } - mutex_unlock(&queue->timer_mutex); + up(&queue->timer_mutex); queuefree(queue); return 0; } diff --git a/sound/core/seq/seq_queue.h b/sound/core/seq/seq_queue.h index 30c811147..888438599 100644 --- a/sound/core/seq/seq_queue.h +++ b/sound/core/seq/seq_queue.h @@ -54,7 +54,7 @@ struct snd_seq_queue { /* clients which uses this queue (bitmap) */ DECLARE_BITMAP(clients_bitmap, SNDRV_SEQ_MAX_CLIENTS); unsigned int clients; /* users of this queue */ - struct mutex timer_mutex; + struct semaphore timer_mutex; snd_use_lock_t use_lock; }; diff --git a/sound/core/seq/seq_virmidi.c b/sound/core/seq/seq_virmidi.c index 0cfa06c6b..14fd1a608 100644 --- a/sound/core/seq/seq_virmidi.c +++ b/sound/core/seq/seq_virmidi.c @@ -167,7 +167,7 @@ static void snd_virmidi_output_trigger(struct snd_rawmidi_substream *substream, return; /* ignored */ } if (vmidi->event.type != SNDRV_SEQ_EVENT_NONE) { - if (snd_seq_kernel_client_dispatch(vmidi->client, &vmidi->event, in_atomic(), 0) < 0) + if (snd_seq_kernel_client_dispatch(vmidi->client, &vmidi->event, 0, 0) < 0) return; vmidi->event.type = SNDRV_SEQ_EVENT_NONE; } @@ -186,7 +186,7 @@ static void snd_virmidi_output_trigger(struct snd_rawmidi_substream *substream, pbuf += res; count -= res; if (vmidi->event.type != SNDRV_SEQ_EVENT_NONE) { - if (snd_seq_kernel_client_dispatch(vmidi->client, &vmidi->event, in_atomic(), 0) < 0) + if (snd_seq_kernel_client_dispatch(vmidi->client, &vmidi->event, 0, 0) < 0) return; vmidi->event.type = SNDRV_SEQ_EVENT_NONE; } @@ -390,9 +390,7 @@ 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 - | SNDRV_SEQ_PORT_TYPE_SOFTWARE - | SNDRV_SEQ_PORT_TYPE_PORT; + pinfo->type = SNDRV_SEQ_PORT_TYPE_MIDI_GENERIC; 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 c30669f14..74745da9d 100644 --- a/sound/core/sgbuf.c +++ b/sound/core/sgbuf.c @@ -19,6 +19,7 @@ * */ +#include #include #include #include @@ -68,18 +69,21 @@ void *snd_malloc_sgbuf_pages(struct device *device, dmab->area = NULL; dmab->addr = 0; - dmab->private_data = sgbuf = kzalloc(sizeof(*sgbuf), GFP_KERNEL); + dmab->private_data = sgbuf = kmalloc(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 = kcalloc(sgbuf->tblsize, sizeof(*sgbuf->table), GFP_KERNEL); + sgbuf->table = kmalloc(sizeof(*sgbuf->table) * sgbuf->tblsize, GFP_KERNEL); if (! sgbuf->table) goto _failed; - sgbuf->page_table = kcalloc(sgbuf->tblsize, sizeof(*sgbuf->page_table), GFP_KERNEL); + memset(sgbuf->table, 0, sizeof(*sgbuf->table) * sgbuf->tblsize); + sgbuf->page_table = kmalloc(sizeof(*sgbuf->page_table) * sgbuf->tblsize, 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 7edd1fc58..5ac097605 100644 --- a/sound/core/sound.c +++ b/sound/core/sound.c @@ -32,15 +32,14 @@ #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,6 +48,10 @@ 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. @@ -56,10 +59,9 @@ 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); +static DECLARE_MUTEX(sound_mutex); extern struct class *sound_class; @@ -75,17 +77,20 @@ extern struct class *sound_class; */ void snd_request_card(int card) { + int locked; + if (! current->fs->root) return; - if (snd_card_locked(card)) + read_lock(&snd_card_rwlock); + locked = snd_cards_lock & (1 << card); + read_unlock(&snd_card_rwlock); + if (locked) 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; @@ -117,23 +122,21 @@ void *snd_lookup_minor_data(unsigned int minor, int type) if (minor >= ARRAY_SIZE(snd_minors)) return NULL; - mutex_lock(&sound_mutex); + down(&sound_mutex); mreg = snd_minors[minor]; if (mreg && mreg->type == type) private_data = mreg->private_data; else private_data = NULL; - mutex_unlock(&sound_mutex); + up(&sound_mutex); return private_data; } -EXPORT_SYMBOL(snd_lookup_minor_data); - static int snd_open(struct inode *inode, struct file *file) { unsigned int minor = iminor(inode); struct snd_minor *mptr = NULL; - const struct file_operations *old_fops; + struct file_operations *old_fops; int err = 0; if (minor >= ARRAY_SIZE(snd_minors)) @@ -236,7 +239,7 @@ static int snd_kernel_minor(int type, struct snd_card *card, int dev) * Retrurns zero if successful, or a negative error code on failure. */ int snd_register_device(int type, struct snd_card *card, int dev, - const struct file_operations *f_ops, void *private_data, + struct file_operations *f_ops, void *private_data, const char *name) { int minor; @@ -244,7 +247,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 *preg, GFP_KERNEL); + preg = kmalloc(sizeof(struct snd_minor) + strlen(name) + 1, GFP_KERNEL); if (preg == NULL) return -ENOMEM; preg->type = type; @@ -252,7 +255,8 @@ 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; - mutex_lock(&sound_mutex); + strcpy(preg->name, name); + down(&sound_mutex); #ifdef CONFIG_SND_DYNAMIC_MINORS minor = snd_find_free_minor(); #else @@ -261,21 +265,21 @@ int snd_register_device(int type, struct snd_card *card, int dev, minor = -EBUSY; #endif if (minor < 0) { - mutex_unlock(&sound_mutex); + up(&sound_mutex); kfree(preg); 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); - mutex_unlock(&sound_mutex); + up(&sound_mutex); 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 @@ -293,7 +297,7 @@ int snd_unregister_device(int type, struct snd_card *card, int dev) struct snd_minor *mptr; cardnum = card ? card->number : -1; - mutex_lock(&sound_mutex); + down(&sound_mutex); for (minor = 0; minor < ARRAY_SIZE(snd_minors); ++minor) if ((mptr = snd_minors[minor]) != NULL && mptr->type == type && @@ -301,26 +305,27 @@ int snd_unregister_device(int type, struct snd_card *card, int dev) mptr->device == dev) break; if (minor == ARRAY_SIZE(snd_minors)) { - mutex_unlock(&sound_mutex); + up(&sound_mutex); 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; - mutex_unlock(&sound_mutex); + up(&sound_mutex); kfree(mptr); return 0; } -EXPORT_SYMBOL(snd_unregister_device); - #ifdef CONFIG_PROC_FS /* * INFO PART */ -static struct snd_info_entry *snd_minor_info_entry; +static struct snd_info_entry *snd_minor_info_entry = NULL; static const char *snd_device_type_name(int type) { @@ -349,7 +354,7 @@ static void snd_minor_info_read(struct snd_info_entry *entry, struct snd_info_bu int minor; struct snd_minor *mptr; - mutex_lock(&sound_mutex); + down(&sound_mutex); for (minor = 0; minor < SNDRV_OS_MINORS; ++minor) { if (!(mptr = snd_minors[minor])) continue; @@ -366,7 +371,7 @@ static void snd_minor_info_read(struct snd_info_entry *entry, struct snd_info_bu snd_iprintf(buffer, "%3i: : %s\n", minor, snd_device_type_name(mptr->type)); } - mutex_unlock(&sound_mutex); + up(&sound_mutex); } int __init snd_minor_info_init(void) @@ -375,6 +380,7 @@ 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); @@ -399,17 +405,24 @@ 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 @@ -418,11 +431,105 @@ 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 74f0fe5a1..79752205c 100644 --- a/sound/core/sound_oss.c +++ b/sound/core/sound_oss.c @@ -34,12 +34,11 @@ #include #include #include -#include #define SNDRV_OSS_MINORS 128 static struct snd_minor *snd_oss_minors[SNDRV_OSS_MINORS]; -static DEFINE_MUTEX(sound_oss_mutex); +static DECLARE_MUTEX(sound_oss_mutex); void *snd_lookup_oss_minor_data(unsigned int minor, int type) { @@ -48,18 +47,16 @@ void *snd_lookup_oss_minor_data(unsigned int minor, int type) if (minor >= ARRAY_SIZE(snd_oss_minors)) return NULL; - mutex_lock(&sound_oss_mutex); + down(&sound_oss_mutex); mreg = snd_oss_minors[minor]; if (mreg && mreg->type == type) private_data = mreg->private_data; else private_data = NULL; - mutex_unlock(&sound_oss_mutex); + up(&sound_oss_mutex); 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; @@ -97,7 +94,7 @@ static int snd_oss_kernel_minor(int type, struct snd_card *card, int dev) } int snd_register_oss_device(int type, struct snd_card *card, int dev, - const struct file_operations *f_ops, void *private_data, + struct file_operations *f_ops, void *private_data, const char *name) { int minor = snd_oss_kernel_minor(type, card, dev); @@ -120,7 +117,7 @@ int snd_register_oss_device(int type, struct snd_card *card, int dev, preg->device = dev; preg->f_ops = f_ops; preg->private_data = private_data; - mutex_lock(&sound_oss_mutex); + down(&sound_oss_mutex); snd_oss_minors[minor] = preg; minor_unit = SNDRV_MINOR_OSS_DEVICE(minor); switch (minor_unit) { @@ -146,7 +143,7 @@ int snd_register_oss_device(int type, struct snd_card *card, int dev, goto __end; snd_oss_minors[track2] = preg; } - mutex_unlock(&sound_oss_mutex); + up(&sound_oss_mutex); return 0; __end: @@ -155,13 +152,11 @@ int snd_register_oss_device(int type, struct snd_card *card, int dev, if (register1 >= 0) unregister_sound_special(register1); snd_oss_minors[minor] = NULL; - mutex_unlock(&sound_oss_mutex); + up(&sound_oss_mutex); kfree(preg); 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); @@ -173,10 +168,10 @@ int snd_unregister_oss_device(int type, struct snd_card *card, int dev) return 0; if (minor < 0) return minor; - mutex_lock(&sound_oss_mutex); + down(&sound_oss_mutex); mptr = snd_oss_minors[minor]; if (mptr == NULL) { - mutex_unlock(&sound_oss_mutex); + up(&sound_oss_mutex); return -ENOENT; } unregister_sound_special(minor); @@ -196,20 +191,18 @@ int snd_unregister_oss_device(int type, struct snd_card *card, int dev) snd_oss_minors[track2] = NULL; } snd_oss_minors[minor] = NULL; - mutex_unlock(&sound_oss_mutex); + up(&sound_oss_mutex); kfree(mptr); return 0; } -EXPORT_SYMBOL(snd_unregister_oss_device); - /* * INFO PART */ #ifdef CONFIG_PROC_FS -static struct snd_info_entry *snd_minor_info_oss_entry; +static struct snd_info_entry *snd_minor_info_oss_entry = NULL; static const char *snd_oss_device_type_name(int type) { @@ -236,7 +229,7 @@ static void snd_minor_info_oss_read(struct snd_info_entry *entry, int minor; struct snd_minor *mptr; - mutex_lock(&sound_oss_mutex); + down(&sound_oss_mutex); for (minor = 0; minor < SNDRV_OSS_MINORS; ++minor) { if (!(mptr = snd_oss_minors[minor])) continue; @@ -248,7 +241,7 @@ static void snd_minor_info_oss_read(struct snd_info_entry *entry, snd_iprintf(buffer, "%3i: : %s\n", minor, snd_oss_device_type_name(mptr->type)); } - mutex_unlock(&sound_oss_mutex); + up(&sound_oss_mutex); } @@ -258,6 +251,7 @@ 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 0a984e881..c7670f5c4 100644 --- a/sound/core/timer.c +++ b/sound/core/timer.c @@ -25,7 +25,6 @@ #include #include #include -#include #include #include #include @@ -71,7 +70,7 @@ struct snd_timer_user { struct timespec tstamp; /* trigger tstamp */ wait_queue_head_t qchange_sleep; struct fasync_struct *fasync; - struct mutex tread_sem; + struct semaphore tread_sem; }; /* list of timers */ @@ -83,7 +82,7 @@ static LIST_HEAD(snd_timer_slave_list); /* lock for slave active lists */ static DEFINE_SPINLOCK(slave_active_lock); -static DEFINE_MUTEX(register_mutex); +static DECLARE_MUTEX(register_mutex); static int snd_timer_free(struct snd_timer *timer); static int snd_timer_dev_free(struct snd_device *device); @@ -253,10 +252,10 @@ int snd_timer_open(struct snd_timer_instance **ti, snd_printd("invalid slave class %i\n", tid->dev_sclass); return -EINVAL; } - mutex_lock(®ister_mutex); + down(®ister_mutex); timeri = snd_timer_instance_new(owner, NULL); if (!timeri) { - mutex_unlock(®ister_mutex); + up(®ister_mutex); return -ENOMEM; } timeri->slave_class = tid->dev_sclass; @@ -264,37 +263,37 @@ int snd_timer_open(struct snd_timer_instance **ti, timeri->flags |= SNDRV_TIMER_IFLG_SLAVE; list_add_tail(&timeri->open_list, &snd_timer_slave_list); snd_timer_check_slave(timeri); - mutex_unlock(®ister_mutex); + up(®ister_mutex); *ti = timeri; return 0; } /* open a master instance */ - mutex_lock(®ister_mutex); + down(®ister_mutex); timer = snd_timer_find(tid); #ifdef CONFIG_KMOD if (timer == NULL) { - mutex_unlock(®ister_mutex); + up(®ister_mutex); snd_timer_request(tid); - mutex_lock(®ister_mutex); + down(®ister_mutex); timer = snd_timer_find(tid); } #endif if (!timer) { - mutex_unlock(®ister_mutex); + up(®ister_mutex); return -ENODEV; } if (!list_empty(&timer->open_list_head)) { timeri = list_entry(timer->open_list_head.next, struct snd_timer_instance, open_list); if (timeri->flags & SNDRV_TIMER_IFLG_EXCLUSIVE) { - mutex_unlock(®ister_mutex); + up(®ister_mutex); return -EBUSY; } } timeri = snd_timer_instance_new(owner, timer); if (!timeri) { - mutex_unlock(®ister_mutex); + up(®ister_mutex); return -ENOMEM; } timeri->slave_class = tid->dev_sclass; @@ -303,7 +302,7 @@ int snd_timer_open(struct snd_timer_instance **ti, timer->hw.open(timer); list_add_tail(&timeri->open_list, &timer->open_list_head); snd_timer_check_master(timeri); - mutex_unlock(®ister_mutex); + up(®ister_mutex); *ti = timeri; return 0; } @@ -334,9 +333,9 @@ int snd_timer_close(struct snd_timer_instance *timeri) spin_lock_irq(&slave_active_lock); } spin_unlock_irq(&slave_active_lock); - mutex_lock(®ister_mutex); + down(®ister_mutex); list_del(&timeri->open_list); - mutex_unlock(®ister_mutex); + up(®ister_mutex); } else { timer = timeri->timer; /* wait, until the active callback is finished */ @@ -347,7 +346,7 @@ int snd_timer_close(struct snd_timer_instance *timeri) spin_lock_irq(&timer->lock); } spin_unlock_irq(&timer->lock); - mutex_lock(®ister_mutex); + down(®ister_mutex); list_del(&timeri->open_list); if (timer && list_empty(&timer->open_list_head) && timer->hw.close) @@ -363,7 +362,7 @@ int snd_timer_close(struct snd_timer_instance *timeri) slave->timer = NULL; spin_unlock_irq(&slave_active_lock); } - mutex_unlock(®ister_mutex); + up(®ister_mutex); } if (timeri->private_free) timeri->private_free(timeri); @@ -837,7 +836,7 @@ static int snd_timer_dev_register(struct snd_device *dev) !timer->hw.resolution && timer->hw.c_resolution == NULL) return -EINVAL; - mutex_lock(®ister_mutex); + down(®ister_mutex); list_for_each(p, &snd_timer_list) { timer1 = list_entry(p, struct snd_timer, device_list); if (timer1->tmr_class > timer->tmr_class) @@ -859,11 +858,11 @@ static int snd_timer_dev_register(struct snd_device *dev) if (timer1->tmr_subdevice < timer->tmr_subdevice) continue; /* conflicts.. */ - mutex_unlock(®ister_mutex); + up(®ister_mutex); return -EBUSY; } list_add_tail(&timer->device_list, p); - mutex_unlock(®ister_mutex); + up(®ister_mutex); return 0; } @@ -873,7 +872,7 @@ static int snd_timer_unregister(struct snd_timer *timer) struct snd_timer_instance *ti; snd_assert(timer != NULL, return -ENXIO); - mutex_lock(®ister_mutex); + down(®ister_mutex); if (! list_empty(&timer->open_list_head)) { snd_printk(KERN_WARNING "timer 0x%lx is busy?\n", (long)timer); list_for_each_safe(p, n, &timer->open_list_head) { @@ -883,7 +882,7 @@ static int snd_timer_unregister(struct snd_timer *timer) } } list_del(&timer->device_list); - mutex_unlock(®ister_mutex); + up(®ister_mutex); return snd_timer_free(timer); } @@ -1062,11 +1061,12 @@ 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; - mutex_lock(®ister_mutex); + down(®ister_mutex); list_for_each(p, &snd_timer_list) { timer = list_entry(p, struct snd_timer, device_list); switch (timer->tmr_class) { @@ -1095,6 +1095,7 @@ 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", @@ -1103,11 +1104,12 @@ 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); + up(®ister_mutex); } -static struct snd_info_entry *snd_timer_proc_entry; +static struct snd_info_entry *snd_timer_proc_entry = NULL; static void __init snd_timer_proc_init(void) { @@ -1115,6 +1117,7 @@ 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); @@ -1267,7 +1270,7 @@ static int snd_timer_user_open(struct inode *inode, struct file *file) return -ENOMEM; spin_lock_init(&tu->qlock); init_waitqueue_head(&tu->qchange_sleep); - mutex_init(&tu->tread_sem); + init_MUTEX(&tu->tread_sem); tu->ticks = 1; tu->queue_size = 128; tu->queue = kmalloc(tu->queue_size * sizeof(struct snd_timer_read), @@ -1323,7 +1326,7 @@ static int snd_timer_user_next_device(struct snd_timer_id __user *_tid) if (copy_from_user(&id, _tid, sizeof(id))) return -EFAULT; - mutex_lock(®ister_mutex); + down(®ister_mutex); if (id.dev_class < 0) { /* first item */ if (list_empty(&snd_timer_list)) snd_timer_user_zero_id(&id); @@ -1405,7 +1408,7 @@ static int snd_timer_user_next_device(struct snd_timer_id __user *_tid) snd_timer_user_zero_id(&id); } } - mutex_unlock(®ister_mutex); + up(®ister_mutex); if (copy_to_user(_tid, &id, sizeof(*_tid))) return -EFAULT; return 0; @@ -1430,7 +1433,7 @@ static int snd_timer_user_ginfo(struct file *file, tid = ginfo->tid; memset(ginfo, 0, sizeof(*ginfo)); ginfo->tid = tid; - mutex_lock(®ister_mutex); + down(®ister_mutex); t = snd_timer_find(&tid); if (t != NULL) { ginfo->card = t->card ? t->card->number : -1; @@ -1449,7 +1452,7 @@ static int snd_timer_user_ginfo(struct file *file, } else { err = -ENODEV; } - mutex_unlock(®ister_mutex); + up(®ister_mutex); if (err >= 0 && copy_to_user(_ginfo, ginfo, sizeof(*ginfo))) err = -EFAULT; kfree(ginfo); @@ -1465,7 +1468,7 @@ static int snd_timer_user_gparams(struct file *file, if (copy_from_user(&gparams, _gparams, sizeof(gparams))) return -EFAULT; - mutex_lock(®ister_mutex); + down(®ister_mutex); t = snd_timer_find(&gparams.tid); if (!t) { err = -ENODEV; @@ -1481,7 +1484,7 @@ static int snd_timer_user_gparams(struct file *file, } err = t->hw.set_period(t, gparams.period_num, gparams.period_den); _error: - mutex_unlock(®ister_mutex); + up(®ister_mutex); return err; } @@ -1498,7 +1501,7 @@ static int snd_timer_user_gstatus(struct file *file, tid = gstatus.tid; memset(&gstatus, 0, sizeof(gstatus)); gstatus.tid = tid; - mutex_lock(®ister_mutex); + down(®ister_mutex); t = snd_timer_find(&tid); if (t != NULL) { if (t->hw.c_resolution) @@ -1515,7 +1518,7 @@ static int snd_timer_user_gstatus(struct file *file, } else { err = -ENODEV; } - mutex_unlock(®ister_mutex); + up(®ister_mutex); if (err >= 0 && copy_to_user(_gstatus, &gstatus, sizeof(gstatus))) err = -EFAULT; return err; @@ -1530,7 +1533,7 @@ static int snd_timer_user_tselect(struct file *file, int err = 0; tu = file->private_data; - mutex_lock(&tu->tread_sem); + down(&tu->tread_sem); if (tu->timeri) { snd_timer_close(tu->timeri); tu->timeri = NULL; @@ -1574,7 +1577,7 @@ static int snd_timer_user_tselect(struct file *file, } __err: - mutex_unlock(&tu->tread_sem); + up(&tu->tread_sem); return err; } @@ -1795,17 +1798,17 @@ static long snd_timer_user_ioctl(struct file *file, unsigned int cmd, { int xarg; - mutex_lock(&tu->tread_sem); + down(&tu->tread_sem); if (tu->timeri) { /* too late */ - mutex_unlock(&tu->tread_sem); + up(&tu->tread_sem); return -EBUSY; } if (get_user(xarg, p)) { - mutex_unlock(&tu->tread_sem); + up(&tu->tread_sem); return -EFAULT; } tu->tread = xarg ? 1 : 0; - mutex_unlock(&tu->tread_sem); + up(&tu->tread_sem); return 0; } case SNDRV_TIMER_IOCTL_GINFO: diff --git a/sound/drivers/dummy.c b/sound/drivers/dummy.c index ffeafaf2e..14e1a671b 100644 --- a/sound/drivers/dummy.c +++ b/sound/drivers/dummy.c @@ -669,17 +669,13 @@ static int __init alsa_card_dummy_init(void) return err; cards = 0; - for (i = 0; i < SNDRV_CARDS; i++) { + for (i = 0; i < SNDRV_CARDS && enable[i]; i++) { struct platform_device *device; - if (! enable[i]) - continue; device = platform_device_register_simple(SND_DUMMY_DRIVER, i, NULL, 0); - if (IS_ERR(device)) - continue; - if (!platform_get_drvdata(device)) { - platform_device_unregister(device); - continue; + if (IS_ERR(device)) { + err = PTR_ERR(device); + goto errout; } devices[i] = device; cards++; @@ -688,10 +684,14 @@ static int __init alsa_card_dummy_init(void) #ifdef MODULE printk(KERN_ERR "Dummy soundcard not found or device busy\n"); #endif - snd_dummy_unregister_all(); - return -ENODEV; + err = -ENODEV; + goto errout; } return 0; + + errout: + snd_dummy_unregister_all(); + return err; } static void __exit alsa_card_dummy_exit(void) diff --git a/sound/drivers/mpu401/mpu401.c b/sound/drivers/mpu401/mpu401.c index 17cc105b2..915589a40 100644 --- a/sound/drivers/mpu401/mpu401.c +++ b/sound/drivers/mpu401/mpu401.c @@ -59,8 +59,7 @@ module_param_array(irq, int, NULL, 0444); MODULE_PARM_DESC(irq, "IRQ # for MPU-401 device."); static struct platform_device *platform_devices[SNDRV_CARDS]; -static int pnp_registered; -static unsigned int snd_mpu401_devices; +static int pnp_registered = 0; static int snd_mpu401_create(int dev, struct snd_card **rcard) { @@ -83,7 +82,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 ? IRQF_DISABLED : 0, NULL)) < 0) { + irq[dev], irq[dev] >= 0 ? SA_INTERRUPT : 0, NULL)) < 0) { printk(KERN_ERR "MPU401 not detected at 0x%lx\n", port[dev]); goto _err; } @@ -151,7 +150,7 @@ static struct pnp_device_id snd_mpu401_pnpids[] = { MODULE_DEVICE_TABLE(pnp, snd_mpu401_pnpids); -static int __devinit snd_mpu401_pnp(int dev, struct pnp_dev *device, +static int __init snd_mpu401_pnp(int dev, struct pnp_dev *device, const struct pnp_device_id *id) { if (!pnp_port_valid(device, 0) || @@ -160,9 +159,8 @@ 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 %llu, expected %d\n", - (unsigned long long)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); return -ENODEV; } port[dev] = pnp_port_start(device, 0); @@ -199,7 +197,6 @@ static int __devinit snd_mpu401_pnp_probe(struct pnp_dev *pnp_dev, } snd_card_set_dev(card, &pnp_dev->dev); pnp_set_drvdata(pnp_dev, card); - snd_mpu401_devices++; ++dev; return 0; } @@ -237,42 +234,44 @@ static void __init_or_module snd_mpu401_unregister_all(void) static int __init alsa_card_mpu401_init(void) { - int i, err; + int i, err, devices; if ((err = platform_driver_register(&snd_mpu401_driver)) < 0) return err; - for (i = 0; i < SNDRV_CARDS; i++) { + devices = 0; + for (i = 0; i < SNDRV_CARDS && enable[i]; i++) { struct platform_device *device; - if (! enable[i]) - continue; #ifdef CONFIG_PNP if (pnp[i]) continue; #endif device = platform_device_register_simple(SND_MPU401_DRIVER, i, NULL, 0); - if (IS_ERR(device)) - continue; - if (!platform_get_drvdata(device)) { - platform_device_unregister(device); - continue; + if (IS_ERR(device)) { + err = PTR_ERR(device); + goto errout; } platform_devices[i] = device; - snd_mpu401_devices++; + devices++; } - err = pnp_register_driver(&snd_mpu401_pnp_driver); - if (!err) + if ((err = pnp_register_driver(&snd_mpu401_pnp_driver)) >= 0) { pnp_registered = 1; + devices += err; + } - if (!snd_mpu401_devices) { + if (!devices) { #ifdef MODULE printk(KERN_ERR "MPU-401 device not found or device busy\n"); #endif - snd_mpu401_unregister_all(); - return -ENODEV; + err = -ENODEV; + goto errout; } return 0; + + errout: + snd_mpu401_unregister_all(); + return err; } static void __exit alsa_card_mpu401_exit(void) diff --git a/sound/drivers/mpu401/mpu401_uart.c b/sound/drivers/mpu401/mpu401_uart.c index 4bf07ca9b..8687ae3c6 100644 --- a/sound/drivers/mpu401/mpu401_uart.c +++ b/sound/drivers/mpu401/mpu401_uart.c @@ -58,26 +58,22 @@ 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); } @@ -90,13 +86,20 @@ 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(KERN_ERR "cmd: clear rx timeout (status = 0x%x)\n", - mpu->read(mpu, MPU401C(mpu))); + snd_printk("cmd: clear rx timeout (status = 0x%x)\n", mpu->read(mpu, MPU401C(mpu))); #endif } -static void uart_interrupt_tx(struct snd_mpu401 *mpu) +static void _snd_mpu401_uart_interrupt(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); @@ -105,22 +108,6 @@ static void uart_interrupt_tx(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 @@ -129,8 +116,7 @@ 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; @@ -140,29 +126,6 @@ irqreturn_t snd_mpu401_uart_interrupt(int irq, void *dev_id, 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 @@ -196,8 +159,7 @@ 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); } @@ -210,8 +172,7 @@ 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); } @@ -219,12 +180,10 @@ 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) +static void snd_mpu401_uart_cmd(struct snd_mpu401 * mpu, unsigned char cmd, int ack) { unsigned long flags; int timeout, ok; @@ -236,13 +195,11 @@ 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(KERN_ERR "cmd: tx timeout (status = 0x%x)\n", - mpu->read(mpu, MPU401C(mpu))); + snd_printk("cmd: tx timeout (status = 0x%x)\n", mpu->read(mpu, MPU401C(mpu))); #endif } mpu->write(mpu, cmd, MPU401C(mpu)); @@ -257,17 +214,13 @@ 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(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; + 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("cmd: 0x%x at 0x%lx (status = 0x%x, data = 0x%x)\n", cmd, mpu->port, mpu->read(mpu, MPU401C(mpu)), mpu->read(mpu, MPU401D(mpu))); } /* @@ -282,19 +235,12 @@ static int snd_mpu401_uart_input_open(struct snd_rawmidi_substream *substream) if (mpu->open_input && (err = mpu->open_input(mpu)) < 0) return err; if (! test_bit(MPU401_MODE_BIT_OUTPUT, &mpu->mode)) { - if (snd_mpu401_uart_cmd(mpu, MPU401_RESET, 1)) - goto error_out; - if (snd_mpu401_uart_cmd(mpu, MPU401_ENTER_UART, 1)) - goto error_out; + snd_mpu401_uart_cmd(mpu, MPU401_RESET, 1); + snd_mpu401_uart_cmd(mpu, MPU401_ENTER_UART, 1); } mpu->substream_input = substream; set_bit(MPU401_MODE_BIT_INPUT, &mpu->mode); return 0; - -error_out: - if (mpu->open_input && mpu->close_input) - mpu->close_input(mpu); - return -EIO; } static int snd_mpu401_uart_output_open(struct snd_rawmidi_substream *substream) @@ -306,60 +252,46 @@ static int snd_mpu401_uart_output_open(struct snd_rawmidi_substream *substream) if (mpu->open_output && (err = mpu->open_output(mpu)) < 0) return err; if (! test_bit(MPU401_MODE_BIT_INPUT, &mpu->mode)) { - if (snd_mpu401_uart_cmd(mpu, MPU401_RESET, 1)) - goto error_out; - if (snd_mpu401_uart_cmd(mpu, MPU401_ENTER_UART, 1)) - goto error_out; + snd_mpu401_uart_cmd(mpu, MPU401_RESET, 1); + snd_mpu401_uart_cmd(mpu, MPU401_ENTER_UART, 1); } mpu->substream_output = substream; set_bit(MPU401_MODE_BIT_OUTPUT, &mpu->mode); return 0; - -error_out: - if (mpu->open_output && mpu->close_output) - mpu->close_output(mpu); - return -EIO; } static int snd_mpu401_uart_input_close(struct snd_rawmidi_substream *substream) { struct snd_mpu401 *mpu; - int err = 0; mpu = substream->rmidi->private_data; clear_bit(MPU401_MODE_BIT_INPUT, &mpu->mode); mpu->substream_input = NULL; if (! test_bit(MPU401_MODE_BIT_OUTPUT, &mpu->mode)) - err = snd_mpu401_uart_cmd(mpu, MPU401_RESET, 0); + snd_mpu401_uart_cmd(mpu, MPU401_RESET, 0); if (mpu->close_input) mpu->close_input(mpu); - if (err) - return -EIO; return 0; } static int snd_mpu401_uart_output_close(struct snd_rawmidi_substream *substream) { struct snd_mpu401 *mpu; - int err = 0; mpu = substream->rmidi->private_data; clear_bit(MPU401_MODE_BIT_OUTPUT, &mpu->mode); mpu->substream_output = NULL; if (! test_bit(MPU401_MODE_BIT_INPUT, &mpu->mode)) - err = snd_mpu401_uart_cmd(mpu, MPU401_RESET, 0); + snd_mpu401_uart_cmd(mpu, MPU401_RESET, 0); if (mpu->close_output) mpu->close_output(mpu); - if (err) - return -EIO; return 0; } /* * 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; @@ -367,8 +299,7 @@ snd_mpu401_uart_input_trigger(struct snd_rawmidi_substream *substream, int up) 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)); @@ -385,7 +316,6 @@ snd_mpu401_uart_input_trigger(struct snd_rawmidi_substream *substream, int up) snd_mpu401_uart_remove_timer(mpu, 1); clear_bit(MPU401_MODE_BIT_INPUT_TRIGGER, &mpu->mode); } - } /* @@ -398,11 +328,13 @@ static void snd_mpu401_uart_input_read(struct snd_mpu401 * mpu) unsigned char byte; while (max-- > 0) { - if (! snd_mpu401_input_avail(mpu)) + 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 { 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); + } } } @@ -424,16 +356,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)) + if (snd_mpu401_output_ready(mpu)) { + mpu->write(mpu, byte, MPU401D(mpu)); + snd_rawmidi_transmit_ack(mpu->substream_output, 1); 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 */ @@ -444,8 +376,7 @@ 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; @@ -458,16 +389,14 @@ snd_mpu401_uart_output_trigger(struct snd_rawmidi_substream *substream, int up) * since the output timer might have been removed in * snd_mpu401_uart_output_write(). */ - if (! (mpu->info_flags & MPU401_INFO_TX_IRQ)) - snd_mpu401_uart_add_timer(mpu, 0); + 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 { - if (! (mpu->info_flags & MPU401_INFO_TX_IRQ)) - snd_mpu401_uart_remove_timer(mpu, 0); + snd_mpu401_uart_remove_timer(mpu, 0); clear_bit(MPU401_MODE_BIT_OUTPUT_TRIGGER, &mpu->mode); } } @@ -505,7 +434,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 - * @info_flags: bitflags MPU401_INFO_XXX + * @integrated: non-zero if the port was already reserved by the chip * @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 @@ -520,24 +449,17 @@ 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, - unsigned int info_flags, + unsigned long port, int integrated, 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 (! (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) + if ((err = snd_rawmidi_new(card, "MPU-401U", device, 1, 1, &rmidi)) < 0) return err; mpu = kzalloc(sizeof(*mpu), GFP_KERNEL); if (mpu == NULL) { @@ -551,23 +473,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 (! (info_flags & MPU401_INFO_INTEGRATED)) { + if (!integrated) { int res_size = hardware == MPU401_HW_PC98II ? 4 : 2; - 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); + 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); snd_device_free(card, rmidi); return -EBUSY; } } - if (info_flags & MPU401_INFO_MMIO) { + switch (hardware) { + case MPU401_HW_AUREAL: mpu->write = mpu401_write_mmio; mpu->read = mpu401_read_mmio; - } else { + break; + default: mpu->write = mpu401_write_port; mpu->read = mpu401_read_port; + break; } mpu->port = port; if (hardware == MPU401_HW_PC98II) @@ -575,40 +497,30 @@ 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); - 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; - } + 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; 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 e064d6c56..b7a0b4281 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, IRQF_DISABLED, "MOTU MTPAV", mcard)) { + if (request_irq(irq, snd_mtpav_irqh, SA_INTERRUPT, "MOTU MTPAV", mcard)) { snd_printk("MTVAP IRQ %d busy\n", irq); return -EBUSY; } @@ -770,15 +770,11 @@ 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)) { - 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; + if (IS_ERR(device)) { + platform_driver_unregister(&snd_mtpav_driver); + return PTR_ERR(device); + } + return 0; } 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 87fe376f3..1e0c76b9a 100644 --- a/sound/drivers/opl3/opl3_lib.c +++ b/sound/drivers/opl3/opl3_lib.c @@ -316,8 +316,6 @@ void snd_opl3_interrupt(struct snd_hwdep * hw) } } -EXPORT_SYMBOL(snd_opl3_interrupt); - /* */ @@ -360,7 +358,7 @@ int snd_opl3_new(struct snd_card *card, opl3->hardware = hardware; spin_lock_init(&opl3->reg_lock); spin_lock_init(&opl3->timer_lock); - mutex_init(&opl3->access_mutex); + init_MUTEX(&opl3->access_mutex); if ((err = snd_device_new(card, SNDRV_DEV_CODEC, opl3, &ops)) < 0) { snd_opl3_free(opl3); @@ -371,8 +369,6 @@ 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) { @@ -397,8 +393,6 @@ 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, @@ -457,8 +451,6 @@ 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; @@ -476,8 +468,6 @@ 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) @@ -536,8 +526,17 @@ 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 5fd3a4c95..fccf019a6 100644 --- a/sound/drivers/opl3/opl3_oss.c +++ b/sound/drivers/opl3/opl3_oss.c @@ -100,8 +100,7 @@ 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_HARDWARE | - SNDRV_SEQ_PORT_TYPE_SYNTHESIZER, + SNDRV_SEQ_PORT_TYPE_SYNTH, 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 96762c9d4..56b1d1a96 100644 --- a/sound/drivers/opl3/opl3_seq.c +++ b/sound/drivers/opl3/opl3_seq.c @@ -52,13 +52,13 @@ int snd_opl3_synth_setup(struct snd_opl3 * opl3) { int idx; - mutex_lock(&opl3->access_mutex); + down(&opl3->access_mutex); if (opl3->used) { - mutex_unlock(&opl3->access_mutex); + up(&opl3->access_mutex); return -EBUSY; } opl3->used++; - mutex_unlock(&opl3->access_mutex); + up(&opl3->access_mutex); snd_opl3_reset(opl3); @@ -91,9 +91,9 @@ void snd_opl3_synth_cleanup(struct snd_opl3 * opl3) spin_unlock_irqrestore(&opl3->sys_timer_lock, flags); snd_opl3_reset(opl3); - mutex_lock(&opl3->access_mutex); + down(&opl3->access_mutex); opl3->used--; - mutex_unlock(&opl3->access_mutex); + up(&opl3->access_mutex); } static int snd_opl3_synth_use(void *private_data, struct snd_seq_port_subscribe * info) @@ -203,9 +203,7 @@ 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_DIRECT_SAMPLE | - SNDRV_SEQ_PORT_TYPE_HARDWARE | - SNDRV_SEQ_PORT_TYPE_SYNTHESIZER, + SNDRV_SEQ_PORT_TYPE_SYNTH, 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 a4b3543a7..3534a0e33 100644 --- a/sound/drivers/opl3/opl3_synth.c +++ b/sound/drivers/opl3/opl3_synth.c @@ -58,8 +58,6 @@ char snd_opl3_regmap[MAX_OPL2_VOICES][4] = { 0x12, 0x15, 0x00, 0x00 } /* is selected (only left reg block) */ }; -EXPORT_SYMBOL(snd_opl3_regmap); - /* * prototypes */ @@ -78,13 +76,13 @@ int snd_opl3_open(struct snd_hwdep * hw, struct file *file) { struct snd_opl3 *opl3 = hw->private_data; - mutex_lock(&opl3->access_mutex); + down(&opl3->access_mutex); if (opl3->used) { - mutex_unlock(&opl3->access_mutex); + up(&opl3->access_mutex); return -EAGAIN; } opl3->used++; - mutex_unlock(&opl3->access_mutex); + up(&opl3->access_mutex); return 0; } @@ -181,9 +179,9 @@ int snd_opl3_release(struct snd_hwdep * hw, struct file *file) struct snd_opl3 *opl3 = hw->private_data; snd_opl3_reset(opl3); - mutex_lock(&opl3->access_mutex); + down(&opl3->access_mutex); opl3->used--; - mutex_unlock(&opl3->access_mutex); + up(&opl3->access_mutex); return 0; } @@ -230,7 +228,6 @@ 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) { @@ -448,4 +445,3 @@ 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 01997f24c..ddfc10d04 100644 --- a/sound/drivers/opl4/opl4_lib.c +++ b/sound/drivers/opl4/opl4_lib.c @@ -43,8 +43,6 @@ 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); @@ -54,8 +52,6 @@ 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; @@ -80,8 +76,6 @@ 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; @@ -106,8 +100,6 @@ 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); @@ -222,7 +214,7 @@ int snd_opl4_create(struct snd_card *card, opl4->fm_port = fm_port; opl4->pcm_port = pcm_port; spin_lock_init(&opl4->reg_lock); - mutex_init(&opl4->access_mutex); + init_MUTEX(&opl4->access_mutex); err = snd_opl4_detect(opl4); if (err < 0) { @@ -264,6 +256,10 @@ 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_local.h b/sound/drivers/opl4/opl4_local.h index 470e5a758..7e088a4a2 100644 --- a/sound/drivers/opl4/opl4_local.h +++ b/sound/drivers/opl4/opl4_local.h @@ -182,7 +182,7 @@ struct snd_opl4 { struct snd_info_entry *proc_entry; int memory_access; #endif - struct mutex access_mutex; + struct semaphore access_mutex; #if defined(CONFIG_SND_SEQUENCER) || defined(CONFIG_SND_SEQUENCER_MODULE) int used; diff --git a/sound/drivers/opl4/opl4_proc.c b/sound/drivers/opl4/opl4_proc.c index e552ec341..f4b4e74fc 100644 --- a/sound/drivers/opl4/opl4_proc.c +++ b/sound/drivers/opl4/opl4_proc.c @@ -28,13 +28,13 @@ static int snd_opl4_mem_proc_open(struct snd_info_entry *entry, { struct snd_opl4 *opl4 = entry->private_data; - mutex_lock(&opl4->access_mutex); + down(&opl4->access_mutex); if (opl4->memory_access) { - mutex_unlock(&opl4->access_mutex); + up(&opl4->access_mutex); return -EBUSY; } opl4->memory_access++; - mutex_unlock(&opl4->access_mutex); + up(&opl4->access_mutex); return 0; } @@ -43,9 +43,9 @@ static int snd_opl4_mem_proc_release(struct snd_info_entry *entry, { struct snd_opl4 *opl4 = entry->private_data; - mutex_lock(&opl4->access_mutex); + down(&opl4->access_mutex); opl4->memory_access--; - mutex_unlock(&opl4->access_mutex); + up(&opl4->access_mutex); return 0; } diff --git a/sound/drivers/opl4/opl4_seq.c b/sound/drivers/opl4/opl4_seq.c index 43d8a2bdd..e3480326e 100644 --- a/sound/drivers/opl4/opl4_seq.c +++ b/sound/drivers/opl4/opl4_seq.c @@ -62,10 +62,10 @@ static int snd_opl4_seq_use(void *private_data, struct snd_seq_port_subscribe *i struct snd_opl4 *opl4 = private_data; int err; - mutex_lock(&opl4->access_mutex); + down(&opl4->access_mutex); if (opl4->used) { - mutex_unlock(&opl4->access_mutex); + up(&opl4->access_mutex); return -EBUSY; } opl4->used++; @@ -73,12 +73,12 @@ static int snd_opl4_seq_use(void *private_data, struct snd_seq_port_subscribe *i if (info->sender.client != SNDRV_SEQ_CLIENT_SYSTEM) { err = snd_opl4_seq_use_inc(opl4); if (err < 0) { - mutex_unlock(&opl4->access_mutex); + up(&opl4->access_mutex); return err; } } - mutex_unlock(&opl4->access_mutex); + up(&opl4->access_mutex); snd_opl4_synth_reset(opl4); return 0; @@ -90,9 +90,9 @@ static int snd_opl4_seq_unuse(void *private_data, struct snd_seq_port_subscribe snd_opl4_synth_shutdown(opl4); - mutex_lock(&opl4->access_mutex); + down(&opl4->access_mutex); opl4->used--; - mutex_unlock(&opl4->access_mutex); + up(&opl4->access_mutex); if (info->sender.client != SNDRV_SEQ_CLIENT_SYSTEM) snd_opl4_seq_use_dec(opl4); @@ -164,9 +164,7 @@ 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_HARDWARE | - SNDRV_SEQ_PORT_TYPE_SYNTHESIZER, + SNDRV_SEQ_PORT_TYPE_MIDI_GM, 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 52afb4bd2..112ddf705 100644 --- a/sound/drivers/serial-u16550.c +++ b/sound/drivers/serial-u16550.c @@ -789,13 +789,12 @@ static int __init snd_uart16550_create(struct snd_card *card, if ((err = snd_uart16550_detect(uart)) <= 0) { printk(KERN_ERR "no UART detected at 0x%lx\n", iobase); - snd_uart16550_free(uart); return -ENODEV; } if (irq >= 0 && irq != SNDRV_AUTO_IRQ) { if (request_irq(irq, snd_uart16550_interrupt, - IRQF_DISABLED, "Serial MIDI", (void *) uart)) { + SA_INTERRUPT, "Serial MIDI", (void *) uart)) { snd_printk("irq %d busy. Using Polling.\n", irq); } else { uart->irq = irq; @@ -990,17 +989,13 @@ static int __init alsa_card_serial_init(void) return err; cards = 0; - for (i = 0; i < SNDRV_CARDS; i++) { + for (i = 0; i < SNDRV_CARDS && enable[i]; i++) { struct platform_device *device; - if (! enable[i]) - continue; device = platform_device_register_simple(SND_SERIAL_DRIVER, i, NULL, 0); - if (IS_ERR(device)) - continue; - if (!platform_get_drvdata(device)) { - platform_device_unregister(device); - continue; + if (IS_ERR(device)) { + err = PTR_ERR(device); + goto errout; } devices[i] = device; cards++; @@ -1009,10 +1004,14 @@ static int __init alsa_card_serial_init(void) #ifdef MODULE printk(KERN_ERR "serial midi soundcard not found or device busy\n"); #endif - snd_serial_unregister_all(); - return -ENODEV; + err = -ENODEV; + goto errout; } return 0; + + errout: + snd_serial_unregister_all(); + return err; } static void __exit alsa_card_serial_exit(void) diff --git a/sound/drivers/virmidi.c b/sound/drivers/virmidi.c index 59171f820..4258723de 100644 --- a/sound/drivers/virmidi.c +++ b/sound/drivers/virmidi.c @@ -163,17 +163,13 @@ static int __init alsa_card_virmidi_init(void) return err; cards = 0; - for (i = 0; i < SNDRV_CARDS; i++) { + for (i = 0; i < SNDRV_CARDS && enable[i]; i++) { struct platform_device *device; - if (! enable[i]) - continue; device = platform_device_register_simple(SND_VIRMIDI_DRIVER, i, NULL, 0); - if (IS_ERR(device)) - continue; - if (!platform_get_drvdata(device)) { - platform_device_unregister(device); - continue; + if (IS_ERR(device)) { + err = PTR_ERR(device); + goto errout; } devices[i] = device; cards++; @@ -182,10 +178,14 @@ static int __init alsa_card_virmidi_init(void) #ifdef MODULE printk(KERN_ERR "Card-VirMIDI soundcard not found or device busy\n"); #endif - snd_virmidi_unregister_all(); - return -ENODEV; + err = -ENODEV; + goto errout; } return 0; + + errout: + snd_virmidi_unregister_all(); + return err; } static void __exit alsa_card_virmidi_exit(void) diff --git a/sound/drivers/vx/vx_core.c b/sound/drivers/vx/vx_core.c index a60168268..43f615d7a 100644 --- a/sound/drivers/vx/vx_core.c +++ b/sound/drivers/vx/vx_core.c @@ -70,8 +70,6 @@ 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 @@ -467,8 +465,6 @@ 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 * @@ -549,7 +545,6 @@ irqreturn_t snd_vx_irq_handler(int irq, void *dev, struct pt_regs *regs) return IRQ_HANDLED; } -EXPORT_SYMBOL(snd_vx_irq_handler); /* */ @@ -640,7 +635,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, vx_proc_read); + snd_info_set_text_ops(entry, chip, 1024, vx_proc_read); } @@ -662,8 +657,6 @@ 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 */ @@ -712,8 +705,6 @@ 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 @@ -730,8 +721,6 @@ int snd_vx_suspend(struct vx_core *chip, pm_message_t state) return 0; } -EXPORT_SYMBOL(snd_vx_suspend); - /* * resume */ @@ -758,7 +747,6 @@ int snd_vx_resume(struct vx_core *chip) return 0; } -EXPORT_SYMBOL(snd_vx_resume); #endif /** @@ -790,7 +778,7 @@ struct vx_core *snd_vx_create(struct snd_card *card, struct snd_vx_hardware *hw, chip->type = hw->type; chip->ops = ops; tasklet_init(&chip->tq, vx_interrupt, (unsigned long)chip); - mutex_init(&chip->mixer_mutex); + init_MUTEX(&chip->mixer_mutex); chip->card = card; card->private_data = chip; @@ -802,8 +790,6 @@ struct vx_core *snd_vx_create(struct snd_card *card, struct snd_vx_hardware *hw, return chip; } -EXPORT_SYMBOL(snd_vx_create); - /* * module entries */ @@ -818,3 +804,19 @@ 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 e1920af45..d837783fb 100644 --- a/sound/drivers/vx/vx_hwdep.c +++ b/sound/drivers/vx/vx_hwdep.c @@ -250,6 +250,3 @@ 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_mixer.c b/sound/drivers/vx/vx_mixer.c index c1d7fcdd1..8ec2c605d 100644 --- a/sound/drivers/vx/vx_mixer.c +++ b/sound/drivers/vx/vx_mixer.c @@ -427,10 +427,10 @@ static int vx_output_level_get(struct snd_kcontrol *kcontrol, struct snd_ctl_ele { struct vx_core *chip = snd_kcontrol_chip(kcontrol); int codec = kcontrol->id.index; - mutex_lock(&chip->mixer_mutex); + down(&chip->mixer_mutex); ucontrol->value.integer.value[0] = chip->output_level[codec][0]; ucontrol->value.integer.value[1] = chip->output_level[codec][1]; - mutex_unlock(&chip->mixer_mutex); + up(&chip->mixer_mutex); return 0; } @@ -438,7 +438,7 @@ static int vx_output_level_put(struct snd_kcontrol *kcontrol, struct snd_ctl_ele { struct vx_core *chip = snd_kcontrol_chip(kcontrol); int codec = kcontrol->id.index; - mutex_lock(&chip->mixer_mutex); + down(&chip->mixer_mutex); if (ucontrol->value.integer.value[0] != chip->output_level[codec][0] || ucontrol->value.integer.value[1] != chip->output_level[codec][1]) { vx_set_analog_output_level(chip, codec, @@ -446,10 +446,10 @@ static int vx_output_level_put(struct snd_kcontrol *kcontrol, struct snd_ctl_ele ucontrol->value.integer.value[1]); chip->output_level[codec][0] = ucontrol->value.integer.value[0]; chip->output_level[codec][1] = ucontrol->value.integer.value[1]; - mutex_unlock(&chip->mixer_mutex); + up(&chip->mixer_mutex); return 1; } - mutex_unlock(&chip->mixer_mutex); + up(&chip->mixer_mutex); return 0; } @@ -502,14 +502,14 @@ static int vx_audio_src_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_v static int vx_audio_src_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { struct vx_core *chip = snd_kcontrol_chip(kcontrol); - mutex_lock(&chip->mixer_mutex); + down(&chip->mixer_mutex); if (chip->audio_source_target != ucontrol->value.enumerated.item[0]) { chip->audio_source_target = ucontrol->value.enumerated.item[0]; vx_sync_audio_source(chip); - mutex_unlock(&chip->mixer_mutex); + up(&chip->mixer_mutex); return 1; } - mutex_unlock(&chip->mixer_mutex); + up(&chip->mixer_mutex); return 0; } @@ -550,14 +550,14 @@ static int vx_clock_mode_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_ static int vx_clock_mode_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { struct vx_core *chip = snd_kcontrol_chip(kcontrol); - mutex_lock(&chip->mixer_mutex); + down(&chip->mixer_mutex); if (chip->clock_mode != ucontrol->value.enumerated.item[0]) { chip->clock_mode = ucontrol->value.enumerated.item[0]; vx_set_clock(chip, chip->freq); - mutex_unlock(&chip->mixer_mutex); + up(&chip->mixer_mutex); return 1; } - mutex_unlock(&chip->mixer_mutex); + up(&chip->mixer_mutex); return 0; } @@ -587,10 +587,10 @@ static int vx_audio_gain_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_ int audio = kcontrol->private_value & 0xff; int capture = (kcontrol->private_value >> 8) & 1; - mutex_lock(&chip->mixer_mutex); + down(&chip->mixer_mutex); ucontrol->value.integer.value[0] = chip->audio_gain[capture][audio]; ucontrol->value.integer.value[1] = chip->audio_gain[capture][audio+1]; - mutex_unlock(&chip->mixer_mutex); + up(&chip->mixer_mutex); return 0; } @@ -600,15 +600,15 @@ static int vx_audio_gain_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_ int audio = kcontrol->private_value & 0xff; int capture = (kcontrol->private_value >> 8) & 1; - mutex_lock(&chip->mixer_mutex); + down(&chip->mixer_mutex); if (ucontrol->value.integer.value[0] != chip->audio_gain[capture][audio] || ucontrol->value.integer.value[1] != chip->audio_gain[capture][audio+1]) { vx_set_audio_gain(chip, audio, capture, ucontrol->value.integer.value[0]); vx_set_audio_gain(chip, audio+1, capture, ucontrol->value.integer.value[1]); - mutex_unlock(&chip->mixer_mutex); + up(&chip->mixer_mutex); return 1; } - mutex_unlock(&chip->mixer_mutex); + up(&chip->mixer_mutex); return 0; } @@ -617,10 +617,10 @@ static int vx_audio_monitor_get(struct snd_kcontrol *kcontrol, struct snd_ctl_el struct vx_core *chip = snd_kcontrol_chip(kcontrol); int audio = kcontrol->private_value & 0xff; - mutex_lock(&chip->mixer_mutex); + down(&chip->mixer_mutex); ucontrol->value.integer.value[0] = chip->audio_monitor[audio]; ucontrol->value.integer.value[1] = chip->audio_monitor[audio+1]; - mutex_unlock(&chip->mixer_mutex); + up(&chip->mixer_mutex); return 0; } @@ -629,17 +629,17 @@ static int vx_audio_monitor_put(struct snd_kcontrol *kcontrol, struct snd_ctl_el struct vx_core *chip = snd_kcontrol_chip(kcontrol); int audio = kcontrol->private_value & 0xff; - mutex_lock(&chip->mixer_mutex); + down(&chip->mixer_mutex); if (ucontrol->value.integer.value[0] != chip->audio_monitor[audio] || ucontrol->value.integer.value[1] != chip->audio_monitor[audio+1]) { vx_set_monitor_level(chip, audio, ucontrol->value.integer.value[0], chip->audio_monitor_active[audio]); vx_set_monitor_level(chip, audio+1, ucontrol->value.integer.value[1], chip->audio_monitor_active[audio+1]); - mutex_unlock(&chip->mixer_mutex); + up(&chip->mixer_mutex); return 1; } - mutex_unlock(&chip->mixer_mutex); + up(&chip->mixer_mutex); return 0; } @@ -657,10 +657,10 @@ static int vx_audio_sw_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_va struct vx_core *chip = snd_kcontrol_chip(kcontrol); int audio = kcontrol->private_value & 0xff; - mutex_lock(&chip->mixer_mutex); + down(&chip->mixer_mutex); ucontrol->value.integer.value[0] = chip->audio_active[audio]; ucontrol->value.integer.value[1] = chip->audio_active[audio+1]; - mutex_unlock(&chip->mixer_mutex); + up(&chip->mixer_mutex); return 0; } @@ -669,15 +669,15 @@ static int vx_audio_sw_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_va struct vx_core *chip = snd_kcontrol_chip(kcontrol); int audio = kcontrol->private_value & 0xff; - mutex_lock(&chip->mixer_mutex); + down(&chip->mixer_mutex); if (ucontrol->value.integer.value[0] != chip->audio_active[audio] || ucontrol->value.integer.value[1] != chip->audio_active[audio+1]) { vx_set_audio_switch(chip, audio, ucontrol->value.integer.value[0]); vx_set_audio_switch(chip, audio+1, ucontrol->value.integer.value[1]); - mutex_unlock(&chip->mixer_mutex); + up(&chip->mixer_mutex); return 1; } - mutex_unlock(&chip->mixer_mutex); + up(&chip->mixer_mutex); return 0; } @@ -686,10 +686,10 @@ static int vx_monitor_sw_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_ struct vx_core *chip = snd_kcontrol_chip(kcontrol); int audio = kcontrol->private_value & 0xff; - mutex_lock(&chip->mixer_mutex); + down(&chip->mixer_mutex); ucontrol->value.integer.value[0] = chip->audio_monitor_active[audio]; ucontrol->value.integer.value[1] = chip->audio_monitor_active[audio+1]; - mutex_unlock(&chip->mixer_mutex); + up(&chip->mixer_mutex); return 0; } @@ -698,17 +698,17 @@ static int vx_monitor_sw_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_ struct vx_core *chip = snd_kcontrol_chip(kcontrol); int audio = kcontrol->private_value & 0xff; - mutex_lock(&chip->mixer_mutex); + down(&chip->mixer_mutex); if (ucontrol->value.integer.value[0] != chip->audio_monitor_active[audio] || ucontrol->value.integer.value[1] != chip->audio_monitor_active[audio+1]) { vx_set_monitor_level(chip, audio, chip->audio_monitor[audio], ucontrol->value.integer.value[0]); vx_set_monitor_level(chip, audio+1, chip->audio_monitor[audio+1], ucontrol->value.integer.value[1]); - mutex_unlock(&chip->mixer_mutex); + up(&chip->mixer_mutex); return 1; } - mutex_unlock(&chip->mixer_mutex); + up(&chip->mixer_mutex); return 0; } @@ -756,12 +756,12 @@ static int vx_iec958_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_valu { struct vx_core *chip = snd_kcontrol_chip(kcontrol); - mutex_lock(&chip->mixer_mutex); + down(&chip->mixer_mutex); ucontrol->value.iec958.status[0] = (chip->uer_bits >> 0) & 0xff; ucontrol->value.iec958.status[1] = (chip->uer_bits >> 8) & 0xff; ucontrol->value.iec958.status[2] = (chip->uer_bits >> 16) & 0xff; ucontrol->value.iec958.status[3] = (chip->uer_bits >> 24) & 0xff; - mutex_unlock(&chip->mixer_mutex); + up(&chip->mixer_mutex); return 0; } @@ -783,14 +783,14 @@ static int vx_iec958_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_valu (ucontrol->value.iec958.status[1] << 8) | (ucontrol->value.iec958.status[2] << 16) | (ucontrol->value.iec958.status[3] << 24); - mutex_lock(&chip->mixer_mutex); + down(&chip->mixer_mutex); if (chip->uer_bits != val) { chip->uer_bits = val; vx_set_iec958_status(chip, val); - mutex_unlock(&chip->mixer_mutex); + up(&chip->mixer_mutex); return 1; } - mutex_unlock(&chip->mixer_mutex); + up(&chip->mixer_mutex); return 0; } diff --git a/sound/drivers/vx/vx_pcm.c b/sound/drivers/vx/vx_pcm.c index 7e65a103f..464109e42 100644 --- a/sound/drivers/vx/vx_pcm.c +++ b/sound/drivers/vx/vx_pcm.c @@ -98,9 +98,10 @@ static int snd_pcm_alloc_vmalloc_buffer(struct snd_pcm_substream *subs, size_t s static int snd_pcm_free_vmalloc_buffer(struct snd_pcm_substream *subs) { struct snd_pcm_runtime *runtime = subs->runtime; - - vfree(runtime->dma_area); - runtime->dma_area = NULL; + if (runtime->dma_area) { + vfree(runtime->dma_area); + runtime->dma_area = NULL; + } return 0; } @@ -1252,14 +1253,13 @@ static int vx_init_audio_io(struct vx_core *chip) chip->audio_info = rmh.Stat[1]; /* allocate pipes */ - chip->playback_pipes = kcalloc(chip->audio_outs, sizeof(struct vx_pipe *), GFP_KERNEL); - if (!chip->playback_pipes) + chip->playback_pipes = kmalloc(sizeof(struct vx_pipe *) * chip->audio_outs, GFP_KERNEL); + chip->capture_pipes = kmalloc(sizeof(struct vx_pipe *) * chip->audio_ins, GFP_KERNEL); + if (! chip->playback_pipes || ! chip->capture_pipes) return -ENOMEM; - 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; diff --git a/sound/i2c/cs8427.c b/sound/i2c/cs8427.c index 64388cb8d..9deba80a5 100644 --- a/sound/i2c/cs8427.c +++ b/sound/i2c/cs8427.c @@ -76,28 +76,23 @@ 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; @@ -126,8 +121,7 @@ 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; @@ -140,11 +134,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; - err = snd_cs8427_reg_write(device, CS8427_REG_UDATABUF, - chip->regmap[CS8427_REG_UDATABUF]); - return err < 0 ? err : 0; + 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; } } data[0] = CS8427_REG_AUTOINC | CS8427_REG_CORU_DATABUF; @@ -167,32 +161,24 @@ 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 @@ -215,8 +201,7 @@ 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); @@ -227,8 +212,8 @@ int snd_cs8427_create(struct snd_i2c_bus *bus, device->private_free = snd_cs8427_free; snd_i2c_lock(bus); - err = snd_cs8427_reg_read(device, CS8427_REG_ID_AND_VER); - if (err != CS8427_VER8427A) { + if ((err = snd_cs8427_reg_read(device, CS8427_REG_ID_AND_VER)) != + CS8427_VER8427A) { snd_i2c_unlock(bus); snd_printk(KERN_ERR "unable to find CS8427 signature " "(expected 0x%x, read 0x%x),\n", @@ -237,8 +222,7 @@ int snd_cs8427_create(struct snd_i2c_bus *bus, return -EFAULT; } /* turn off run bit while making changes to configuration */ - err = snd_cs8427_reg_write(device, CS8427_REG_CLOCKSOURCE, 0x00); - if (err < 0) + if ((err = snd_cs8427_reg_write(device, CS8427_REG_CLOCKSOURCE, 0x00)) < 0) goto __fail; /* send initial values */ memcpy(chip->regmap + (initvals1[0] & 0x7f), initvals1 + 1, 6); @@ -298,8 +282,6 @@ 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 @@ -309,14 +291,11 @@ static void snd_cs8427_reset(struct snd_i2c_device *cs8427) { struct cs8427 *chip; unsigned long end_time; - int data, aes3input = 0; + int data; 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 */ - aes3input = 1; chip->regmap[CS8427_REG_CLOCKSOURCE] &= ~(CS8427_RUN | CS8427_RXDMASK); snd_cs8427_reg_write(cs8427, CS8427_REG_CLOCKSOURCE, chip->regmap[CS8427_REG_CLOCKSOURCE]); @@ -337,8 +316,7 @@ static void snd_cs8427_reset(struct snd_i2c_device *cs8427) } snd_i2c_lock(cs8427->bus); chip->regmap[CS8427_REG_CLOCKSOURCE] &= ~CS8427_RXDMASK; - if (aes3input) - chip->regmap[CS8427_REG_CLOCKSOURCE] |= CS8427_RXDAES3INPUT; + chip->regmap[CS8427_REG_CLOCKSOURCE] |= CS8427_RXDAES3INPUT; snd_cs8427_reg_write(cs8427, CS8427_REG_CLOCKSOURCE, chip->regmap[CS8427_REG_CLOCKSOURCE]); snd_i2c_unlock(cs8427->bus); @@ -386,15 +364,12 @@ 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; } - 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"); + 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"); snd_i2c_unlock(device->bus); return err < 0 ? err : -EIO; } @@ -402,8 +377,7 @@ 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; @@ -436,8 +410,7 @@ 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; @@ -466,8 +439,7 @@ 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, }, @@ -475,8 +447,7 @@ 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, }, @@ -496,8 +467,7 @@ 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, @@ -509,8 +479,7 @@ 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 }}; @@ -533,8 +502,7 @@ 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; } @@ -544,8 +512,6 @@ 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; @@ -553,17 +519,13 @@ 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; @@ -603,8 +565,6 @@ 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; @@ -616,3 +576,10 @@ 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 b60fb1892..c4e1f2c23 100644 --- a/sound/i2c/i2c.c +++ b/sound/i2c/i2c.c @@ -88,7 +88,7 @@ int snd_i2c_bus_create(struct snd_card *card, const char *name, bus = kzalloc(sizeof(*bus), GFP_KERNEL); if (bus == NULL) return -ENOMEM; - mutex_init(&bus->lock_mutex); + init_MUTEX(&bus->lock_mutex); INIT_LIST_HEAD(&bus->devices); INIT_LIST_HEAD(&bus->buses); bus->card = card; @@ -106,8 +106,6 @@ 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) { @@ -126,8 +124,6 @@ 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) @@ -138,29 +134,22 @@ 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 */ @@ -331,6 +320,12 @@ 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 b074fddde..746500e06 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, snd_uda1341_proc_read); + snd_info_set_text_ops(entry, clnt, 1024, snd_uda1341_proc_read); if (! snd_card_proc_new(card, "uda1341-regs", &entry)) - snd_info_set_text_ops(entry, clnt, snd_uda1341_proc_regs_read); + snd_info_set_text_ops(entry, clnt, 1024, snd_uda1341_proc_regs_read); } /* }}} */ diff --git a/sound/i2c/other/ak4xxx-adda.c b/sound/i2c/other/ak4xxx-adda.c index dc7cc2001..045e32a31 100644 --- a/sound/i2c/other/ak4xxx-adda.c +++ b/sound/i2c/other/ak4xxx-adda.c @@ -34,8 +34,7 @@ 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); @@ -53,67 +52,6 @@ void snd_akm4xxx_write(struct snd_akm4xxx *ak, int chip, unsigned char reg, 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 @@ -122,26 +60,52 @@ static void ak4381_reset(struct snd_akm4xxx *ak, int state) */ 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: - ak4524_reset(ak, state); + 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)); + } break; case SND_AK4529: /* FIXME: needed for ak4529? */ break; case SND_AK4355: case SND_AK4358: - ak4355_reset(ak, state); + 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 */ break; case SND_AK4381: - ak4381_reset(ak, state); + 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)); + } break; } } -EXPORT_SYMBOL(snd_akm4xxx_reset); - /* * initialize all the ak4xxx chips */ @@ -189,8 +153,7 @@ 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 */ @@ -206,8 +169,7 @@ 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 */ @@ -225,8 +187,7 @@ 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 */ @@ -278,15 +239,12 @@ 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, @@ -334,64 +292,6 @@ 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) { @@ -408,8 +308,7 @@ 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; } @@ -437,8 +336,7 @@ 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; } @@ -449,8 +347,7 @@ 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; } @@ -464,8 +361,7 @@ 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); @@ -481,86 +377,51 @@ 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; ) { + for (idx = 0; idx < ak->num_dacs; ++idx) { memset(ctl, 0, sizeof(*ctl)); - 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; - } + strcpy(ctl->id.name, "DAC Volume"); + ctl->id.index = idx + ak->idx_offset * 2; ctl->id.iface = SNDRV_CTL_ELEM_IFACE_MIXER; ctl->count = 1; - 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; - } + ctl->info = snd_akm4xxx_volume_info; + ctl->get = snd_akm4xxx_volume_get; + ctl->put = snd_akm4xxx_volume_put; switch (ak->type) { case SND_AK4524: - /* register 6 & 7 */ - ctl->private_value = - AK_COMPOSE(idx/2, (idx%2) + 6, 0, 127); + ctl->private_value = AK_COMPOSE(idx/2, (idx%2) + 6, 0, 127); /* register 6 & 7 */ break; case SND_AK4528: - /* register 4 & 5 */ - ctl->private_value = - AK_COMPOSE(idx/2, (idx%2) + 4, 0, 127); + ctl->private_value = AK_COMPOSE(idx/2, (idx%2) + 4, 0, 127); /* register 4 & 5 */ break; case SND_AK4529: { - /* 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; + 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; break; } case SND_AK4355: - /* register 4-9, chip #0 only */ - ctl->private_value = AK_COMPOSE(0, idx + 4, 0, 255); + ctl->private_value = AK_COMPOSE(0, idx + 4, 0, 255); /* register 4-9, chip #0 only */ break; case SND_AK4358: if (idx >= 6) - /* register 4-9, chip #0 only */ - ctl->private_value = - AK_COMPOSE(0, idx + 5, 0, 255); + ctl->private_value = AK_COMPOSE(0, idx + 5, 0, 255); /* register 4-9, chip #0 only */ else - /* register 4-9, chip #0 only */ - ctl->private_value = - AK_COMPOSE(0, idx + 4, 0, 255); + ctl->private_value = AK_COMPOSE(0, idx + 4, 0, 255); /* register 4-9, chip #0 only */ break; case SND_AK4381: - /* register 3 & 4 */ - ctl->private_value = - AK_COMPOSE(idx/2, (idx%2) + 3, 0, 255); + ctl->private_value = AK_COMPOSE(idx/2, (idx%2) + 3, 0, 255); /* register 3 & 4 */ break; default: err = -EINVAL; goto __error; } - ctl->private_data = ak; - err = snd_ctl_add(ak->card, - snd_ctl_new(ctl, SNDRV_CTL_ELEM_ACCESS_READ| - SNDRV_CTL_ELEM_ACCESS_WRITE)); - if (err < 0) + if ((err = snd_ctl_add(ak->card, snd_ctl_new(ctl, SNDRV_CTL_ELEM_ACCESS_READ|SNDRV_CTL_ELEM_ACCESS_WRITE))) < 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)); @@ -571,14 +432,9 @@ 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; - /* register 4 & 5 */ - ctl->private_value = - AK_COMPOSE(idx/2, (idx%2) + 4, 0, 127); + ctl->private_value = AK_COMPOSE(idx/2, (idx%2) + 4, 0, 127); /* register 4 & 5 */ ctl->private_data = ak; - err = snd_ctl_add(ak->card, - snd_ctl_new(ctl, SNDRV_CTL_ELEM_ACCESS_READ| - SNDRV_CTL_ELEM_ACCESS_WRITE)); - if (err < 0) + if ((err = snd_ctl_add(ak->card, snd_ctl_new(ctl, SNDRV_CTL_ELEM_ACCESS_READ|SNDRV_CTL_ELEM_ACCESS_WRITE))) < 0) goto __error; memset(ctl, 0, sizeof(*ctl)); @@ -589,13 +445,9 @@ 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; - /* register 4 & 5 */ - ctl->private_value = AK_COMPOSE(idx/2, (idx%2) + 4, 0, 0); + ctl->private_value = AK_COMPOSE(idx/2, (idx%2) + 4, 0, 0); /* register 4 & 5 */ ctl->private_data = ak; - err = snd_ctl_add(ak->card, - snd_ctl_new(ctl, SNDRV_CTL_ELEM_ACCESS_READ| - SNDRV_CTL_ELEM_ACCESS_WRITE)); - if (err < 0) + if ((err = snd_ctl_add(ak->card, snd_ctl_new(ctl, SNDRV_CTL_ELEM_ACCESS_READ|SNDRV_CTL_ELEM_ACCESS_WRITE))) < 0) goto __error; } if (ak->type == SND_AK4355 || ak->type == SND_AK4358) @@ -614,13 +466,11 @@ int snd_akm4xxx_build_controls(struct snd_akm4xxx *ak) switch (ak->type) { case SND_AK4524: case SND_AK4528: - /* register 3 */ - ctl->private_value = AK_COMPOSE(idx, 3, 0, 0); + ctl->private_value = AK_COMPOSE(idx, 3, 0, 0); /* register 3 */ break; case SND_AK4529: { int shift = idx == 3 ? 6 : (2 - idx) * 2; - /* register 8 with shift */ - ctl->private_value = AK_COMPOSE(0, 8, shift, 0); + ctl->private_value = AK_COMPOSE(0, 8, shift, 0); /* register 8 with shift */ break; } case SND_AK4355: @@ -632,10 +482,7 @@ int snd_akm4xxx_build_controls(struct snd_akm4xxx *ak) break; } ctl->private_data = ak; - err = snd_ctl_add(ak->card, - snd_ctl_new(ctl, SNDRV_CTL_ELEM_ACCESS_READ| - SNDRV_CTL_ELEM_ACCESS_WRITE)); - if (err < 0) + if ((err = snd_ctl_add(ak->card, snd_ctl_new(ctl, SNDRV_CTL_ELEM_ACCESS_READ|SNDRV_CTL_ELEM_ACCESS_WRITE))) < 0) goto __error; } err = 0; @@ -645,8 +492,6 @@ 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; @@ -658,3 +503,8 @@ 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/Kconfig b/sound/isa/Kconfig index 557c4de22..ff8fef932 100644 --- a/sound/isa/Kconfig +++ b/sound/isa/Kconfig @@ -11,15 +11,6 @@ config SND_CS4231_LIB tristate select SND_PCM -config SND_ADLIB - tristate "AdLib FM card" - select SND_OPL3_LIB - help - Say Y here to include support for AdLib FM cards. - - To compile this driver as a module, choose M here: the module - will be called snd-adlib. - config SND_AD1816A tristate "Analog Devices SoundPort AD1816A" depends on SND && PNP && ISA @@ -301,20 +292,6 @@ config SND_OPTI93X To compile this driver as a module, choose M here: the module will be called snd-opti93x. -config SND_MIRO - tristate "Miro miroSOUND PCM1pro/PCM12/PCM20radio driver" - depends on SND - select SND_OPL4_LIB - select SND_CS4231_LIB - select SND_MPU401_UART - select SND_PCM - help - Say 'Y' or 'M' to include support for Miro miroSOUND PCM1 pro, - miroSOUND PCM12 and miroSOUND PCM20 Radio soundcards. - - To compile this driver as a module, choose M here: the module - will be called snd-miro. - config SND_SB8 tristate "Sound Blaster 1.0/2.0/Pro (8-bit)" depends on SND diff --git a/sound/isa/Makefile b/sound/isa/Makefile index bb317ccc1..05724eb7b 100644 --- a/sound/isa/Makefile +++ b/sound/isa/Makefile @@ -3,7 +3,6 @@ # Copyright (c) 2001 by Jaroslav Kysela # -snd-adlib-objs := adlib.o snd-als100-objs := als100.o snd-azt2320-objs := azt2320.o snd-cmi8330-objs := cmi8330.o @@ -14,7 +13,6 @@ snd-sgalaxy-objs := sgalaxy.o snd-sscape-objs := sscape.o # Toplevel Module Dependency -obj-$(CONFIG_SND_ADLIB) += snd-adlib.o obj-$(CONFIG_SND_ALS100) += snd-als100.o obj-$(CONFIG_SND_AZT2320) += snd-azt2320.o obj-$(CONFIG_SND_CMI8330) += snd-cmi8330.o diff --git a/sound/isa/ad1816a/ad1816a.c b/sound/isa/ad1816a/ad1816a.c index b33a5fb59..7051f7798 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], IRQF_DISABLED, + mpu_port[dev], 0, mpu_irq[dev], SA_INTERRUPT, NULL) < 0) printk(KERN_ERR PFX "no MPU-401 device at 0x%lx.\n", mpu_port[dev]); } @@ -262,8 +262,6 @@ static int __devinit snd_card_ad1816a_probe(int dev, struct pnp_card_link *pcard return 0; } -static unsigned int __devinitdata ad1816a_devices; - static int __devinit snd_ad1816a_pnp_detect(struct pnp_card_link *card, const struct pnp_card_device_id *id) { @@ -277,7 +275,6 @@ static int __devinit snd_ad1816a_pnp_detect(struct pnp_card_link *card, if (res < 0) return res; dev++; - ad1816a_devices++; return 0; } return -ENODEV; @@ -300,13 +297,10 @@ static struct pnp_card_driver ad1816a_pnpc_driver = { static int __init alsa_card_ad1816a_init(void) { - int err; - - err = pnp_register_card_driver(&ad1816a_pnpc_driver); - if (err) - return err; + int cards; - if (!ad1816a_devices) { + cards = pnp_register_card_driver(&ad1816a_pnpc_driver); + if (cards <= 0) { pnp_unregister_card_driver(&ad1816a_pnpc_driver); #ifdef MODULE printk(KERN_ERR "no AD1816A based soundcards found.\n"); diff --git a/sound/isa/ad1816a/ad1816a_lib.c b/sound/isa/ad1816a/ad1816a_lib.c index 8fcf2c151..ac0d808ff 100644 --- a/sound/isa/ad1816a/ad1816a_lib.c +++ b/sound/isa/ad1816a/ad1816a_lib.c @@ -1,3 +1,4 @@ + /* ad1816a.c - lowlevel code for Analog Devices AD1816A chip. Copyright (C) 1999-2000 by Massimo Piccioni @@ -174,7 +175,7 @@ static void snd_ad1816a_close(struct snd_ad1816a *chip, unsigned int mode) static int snd_ad1816a_trigger(struct snd_ad1816a *chip, unsigned char what, - int channel, int cmd, int iscapture) + int channel, int cmd) { int error = 0; @@ -183,14 +184,10 @@ static int snd_ad1816a_trigger(struct snd_ad1816a *chip, unsigned char what, case SNDRV_PCM_TRIGGER_STOP: spin_lock(&chip->lock); cmd = (cmd == SNDRV_PCM_TRIGGER_START) ? 0xff: 0x00; - /* if (what & AD1816A_PLAYBACK_ENABLE) */ - /* That is not valid, because playback and capture enable - * are the same bit pattern, just to different addresses - */ - if (! iscapture) + if (what & AD1816A_PLAYBACK_ENABLE) snd_ad1816a_out_mask(chip, AD1816A_PLAYBACK_CONFIG, AD1816A_PLAYBACK_ENABLE, cmd); - else + if (what & AD1816A_CAPTURE_ENABLE) snd_ad1816a_out_mask(chip, AD1816A_CAPTURE_CONFIG, AD1816A_CAPTURE_ENABLE, cmd); spin_unlock(&chip->lock); @@ -207,14 +204,14 @@ static int snd_ad1816a_playback_trigger(struct snd_pcm_substream *substream, int { struct snd_ad1816a *chip = snd_pcm_substream_chip(substream); return snd_ad1816a_trigger(chip, AD1816A_PLAYBACK_ENABLE, - SNDRV_PCM_STREAM_PLAYBACK, cmd, 0); + SNDRV_PCM_STREAM_PLAYBACK, cmd); } static int snd_ad1816a_capture_trigger(struct snd_pcm_substream *substream, int cmd) { struct snd_ad1816a *chip = snd_pcm_substream_chip(substream); return snd_ad1816a_trigger(chip, AD1816A_CAPTURE_ENABLE, - SNDRV_PCM_STREAM_CAPTURE, cmd, 1); + SNDRV_PCM_STREAM_CAPTURE, cmd); } static int snd_ad1816a_hw_params(struct snd_pcm_substream *substream, @@ -599,7 +596,7 @@ int __devinit snd_ad1816a_create(struct snd_card *card, snd_ad1816a_free(chip); return -EBUSY; } - if (request_irq(irq, snd_ad1816a_interrupt, IRQF_DISABLED, "AD1816A", (void *) chip)) { + if (request_irq(irq, snd_ad1816a_interrupt, SA_INTERRUPT, "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.c b/sound/isa/ad1848/ad1848.c index 99908e441..e091bbeff 100644 --- a/sound/isa/ad1848/ad1848.c +++ b/sound/isa/ad1848/ad1848.c @@ -187,17 +187,13 @@ static int __init alsa_card_ad1848_init(void) return err; cards = 0; - for (i = 0; i < SNDRV_CARDS; i++) { + for (i = 0; i < SNDRV_CARDS && enable[i]; i++) { struct platform_device *device; - if (! enable[i]) - continue; device = platform_device_register_simple(SND_AD1848_DRIVER, i, NULL, 0); - if (IS_ERR(device)) - continue; - if (!platform_get_drvdata(device)) { - platform_device_unregister(device); - continue; + if (IS_ERR(device)) { + err = PTR_ERR(device); + goto errout; } devices[i] = device; cards++; @@ -206,10 +202,14 @@ static int __init alsa_card_ad1848_init(void) #ifdef MODULE printk(KERN_ERR "AD1848 soundcard not found or device busy\n"); #endif - snd_ad1848_unregister_all(); - return -ENODEV; + err = -ENODEV; + goto errout; } return 0; + + errout: + snd_ad1848_unregister_all(); + return err; } static void __exit alsa_card_ad1848_exit(void) diff --git a/sound/isa/ad1848/ad1848_lib.c b/sound/isa/ad1848/ad1848_lib.c index e711f87d5..ed7cdb028 100644 --- a/sound/isa/ad1848/ad1848_lib.c +++ b/sound/isa/ad1848/ad1848_lib.c @@ -387,9 +387,9 @@ static int snd_ad1848_open(struct snd_ad1848 *chip, unsigned int mode) { unsigned long flags; - mutex_lock(&chip->open_mutex); + down(&chip->open_mutex); if (chip->mode & AD1848_MODE_OPEN) { - mutex_unlock(&chip->open_mutex); + up(&chip->open_mutex); return -EAGAIN; } snd_ad1848_mce_down(chip); @@ -432,7 +432,7 @@ static int snd_ad1848_open(struct snd_ad1848 *chip, unsigned int mode) spin_unlock_irqrestore(&chip->reg_lock, flags); chip->mode = mode; - mutex_unlock(&chip->open_mutex); + up(&chip->open_mutex); return 0; } @@ -441,9 +441,9 @@ static void snd_ad1848_close(struct snd_ad1848 *chip) { unsigned long flags; - mutex_lock(&chip->open_mutex); + down(&chip->open_mutex); if (!chip->mode) { - mutex_unlock(&chip->open_mutex); + up(&chip->open_mutex); return; } /* disable IRQ */ @@ -471,7 +471,7 @@ static void snd_ad1848_close(struct snd_ad1848 *chip) spin_unlock_irqrestore(&chip->reg_lock, flags); chip->mode = 0; - mutex_unlock(&chip->open_mutex); + up(&chip->open_mutex); } /* @@ -889,7 +889,7 @@ int snd_ad1848_create(struct snd_card *card, if (chip == NULL) return -ENOMEM; spin_lock_init(&chip->reg_lock); - mutex_init(&chip->open_mutex); + init_MUTEX(&chip->open_mutex); chip->card = card; chip->port = port; chip->irq = -1; @@ -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, IRQF_DISABLED, "AD1848", (void *) chip)) { + if (request_irq(irq, snd_ad1848_interrupt, SA_INTERRUPT, "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 f2bcfb2cf..9b77c17b3 100644 --- a/sound/isa/als100.c +++ b/sound/isa/als100.c @@ -199,7 +199,7 @@ static int __devinit snd_card_als100_pnp(int dev, struct snd_card_als100 *acard, return 0; } -static int __devinit snd_card_als100_probe(int dev, +static int __init snd_card_als100_probe(int dev, struct pnp_card_link *pcard, const struct pnp_card_device_id *pid) { @@ -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], IRQF_DISABLED, + mpu_irq[dev], SA_INTERRUPT, NULL) < 0) snd_printk(KERN_ERR PFX "no MPU-401 device at 0x%lx\n", mpu_port[dev]); } @@ -281,8 +281,6 @@ static int __devinit snd_card_als100_probe(int dev, return 0; } -static unsigned int __devinitdata als100_devices; - static int __devinit snd_als100_pnp_detect(struct pnp_card_link *card, const struct pnp_card_device_id *id) { @@ -296,7 +294,6 @@ static int __devinit snd_als100_pnp_detect(struct pnp_card_link *card, if (res < 0) return res; dev++; - als100_devices++; return 0; } return -ENODEV; @@ -348,13 +345,10 @@ static struct pnp_card_driver als100_pnpc_driver = { static int __init alsa_card_als100_init(void) { - int err; - - err = pnp_register_card_driver(&als100_pnpc_driver); - if (err) - return err; + int cards; - if (!als100_devices) { + cards = pnp_register_card_driver(&als100_pnpc_driver); + if (cards <= 0) { pnp_unregister_card_driver(&als100_pnpc_driver); #ifdef MODULE snd_printk(KERN_ERR "no ALS100 based soundcards found\n"); diff --git a/sound/isa/azt2320.c b/sound/isa/azt2320.c index b615538a9..a530691bf 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], IRQF_DISABLED, + mpu_irq[dev], SA_INTERRUPT, NULL) < 0) snd_printk(KERN_ERR PFX "no MPU-401 device at 0x%lx\n", mpu_port[dev]); } @@ -310,8 +310,6 @@ static int __devinit snd_card_azt2320_probe(int dev, return 0; } -static unsigned int __devinitdata azt2320_devices; - static int __devinit snd_azt2320_pnp_detect(struct pnp_card_link *card, const struct pnp_card_device_id *id) { @@ -325,7 +323,6 @@ static int __devinit snd_azt2320_pnp_detect(struct pnp_card_link *card, if (res < 0) return res; dev++; - azt2320_devices++; return 0; } return -ENODEV; @@ -375,13 +372,10 @@ static struct pnp_card_driver azt2320_pnpc_driver = { static int __init alsa_card_azt2320_init(void) { - int err; - - err = pnp_register_card_driver(&azt2320_pnpc_driver); - if (err) - return err; + int cards; - if (!azt2320_devices) { + cards = pnp_register_card_driver(&azt2320_pnpc_driver); + if (cards <= 0) { pnp_unregister_card_driver(&azt2320_pnpc_driver); #ifdef MODULE snd_printk(KERN_ERR "no AZT2320 based soundcards found\n"); diff --git a/sound/isa/cmi8330.c b/sound/isa/cmi8330.c index 3c1e9fd56..fd9bb2575 100644 --- a/sound/isa/cmi8330.c +++ b/sound/isa/cmi8330.c @@ -175,7 +175,7 @@ MODULE_DEVICE_TABLE(pnp_card, snd_cmi8330_pnpids); #endif -static struct ad1848_mix_elem snd_cmi8330_controls[] __devinitdata = { +static struct ad1848_mix_elem snd_cmi8330_controls[] __initdata = { AD1848_DOUBLE("Master Playback Volume", 0, CMI8330_MASTVOL, CMI8330_MASTVOL, 4, 0, 15, 0), AD1848_SINGLE("Loud Playback Switch", 0, CMI8330_MUTEMUX, 6, 1, 1), AD1848_DOUBLE("PCM Playback Switch", 0, AD1848_LEFT_OUTPUT, AD1848_RIGHT_OUTPUT, 7, 7, 1, 1), @@ -204,7 +204,7 @@ AD1848_SINGLE(SNDRV_CTL_NAME_IEC958("Input ",PLAYBACK,SWITCH), 0, CMI8330_MUTEMU }; #ifdef ENABLE_SB_MIXER -static struct sbmix_elem cmi8330_sb_mixers[] __devinitdata = { +static struct sbmix_elem cmi8330_sb_mixers[] __initdata = { SB_DOUBLE("SB Master Playback Volume", SB_DSP4_MASTER_DEV, (SB_DSP4_MASTER_DEV + 1), 3, 3, 31), SB_DOUBLE("Tone Control - Bass", SB_DSP4_BASS_DEV, (SB_DSP4_BASS_DEV + 1), 4, 4, 15), SB_DOUBLE("Tone Control - Treble", SB_DSP4_TREBLE_DEV, (SB_DSP4_TREBLE_DEV + 1), 4, 4, 15), @@ -222,7 +222,7 @@ SB_DOUBLE("SB Playback Volume", SB_DSP4_OGAIN_DEV, (SB_DSP4_OGAIN_DEV + 1), 6, 6 SB_SINGLE("SB Mic Auto Gain", SB_DSP4_MIC_AGC, 0, 1), }; -static unsigned char cmi8330_sb_init_values[][2] __devinitdata = { +static unsigned char cmi8330_sb_init_values[][2] __initdata = { { SB_DSP4_MASTER_DEV + 0, 0 }, { SB_DSP4_MASTER_DEV + 1, 0 }, { SB_DSP4_PCM_DEV + 0, 0 }, @@ -545,7 +545,7 @@ static int __devinit snd_cmi8330_probe(struct snd_card *card, int dev) return snd_card_register(card); } -static int __devinit snd_cmi8330_nonpnp_probe(struct platform_device *pdev) +static int __init snd_cmi8330_nonpnp_probe(struct platform_device *pdev) { struct snd_card *card; int err; @@ -607,8 +607,6 @@ static struct platform_driver snd_cmi8330_driver = { #ifdef CONFIG_PNP -static unsigned int __devinitdata cmi8330_pnp_devices; - static int __devinit snd_cmi8330_pnp_detect(struct pnp_card_link *pcard, const struct pnp_card_device_id *pid) { @@ -638,7 +636,6 @@ static int __devinit snd_cmi8330_pnp_detect(struct pnp_card_link *pcard, } pnp_set_card_drvdata(pcard, card); dev++; - cmi8330_pnp_devices++; return 0; } @@ -693,17 +690,15 @@ static int __init alsa_card_cmi8330_init(void) if ((err = platform_driver_register(&snd_cmi8330_driver)) < 0) return err; - for (i = 0; i < SNDRV_CARDS; i++) { + for (i = 0; i < SNDRV_CARDS && enable[i]; i++) { struct platform_device *device; - if (! enable[i] || is_isapnp_selected(i)) + if (is_isapnp_selected(i)) continue; device = platform_device_register_simple(CMI8330_DRIVER, i, NULL, 0); - if (IS_ERR(device)) - continue; - if (!platform_get_drvdata(device)) { - platform_device_unregister(device); - continue; + if (IS_ERR(device)) { + err = PTR_ERR(device); + goto errout; } platform_devices[i] = device; cards++; @@ -711,9 +706,9 @@ static int __init alsa_card_cmi8330_init(void) #ifdef CONFIG_PNP err = pnp_register_card_driver(&cmi8330_pnpc_driver); - if (!err) { + if (err >= 0) { pnp_registered = 1; - cards += cmi8330_pnp_devices; + cards += err; } #endif @@ -721,10 +716,14 @@ static int __init alsa_card_cmi8330_init(void) #ifdef MODULE snd_printk(KERN_ERR "CMI8330 not found or device busy\n"); #endif - snd_cmi8330_unregister_all(); - return -ENODEV; + err = -ENODEV; + goto errout; } return 0; + + errout: + snd_cmi8330_unregister_all(); + return err; } static void __exit alsa_card_cmi8330_exit(void) diff --git a/sound/isa/cs423x/Makefile b/sound/isa/cs423x/Makefile index 2fb4f7409..d2afaea30 100644 --- a/sound/isa/cs423x/Makefile +++ b/sound/isa/cs423x/Makefile @@ -11,7 +11,6 @@ snd-cs4236-objs := cs4236.o # Toplevel Module Dependency obj-$(CONFIG_SND_AZT2320) += snd-cs4231-lib.o -obj-$(CONFIG_SND_MIRO) += snd-cs4231-lib.o obj-$(CONFIG_SND_OPL3SA2) += snd-cs4231-lib.o obj-$(CONFIG_SND_CS4231) += snd-cs4231.o snd-cs4231-lib.o obj-$(CONFIG_SND_CS4232) += snd-cs4232.o snd-cs4231-lib.o diff --git a/sound/isa/cs423x/cs4231.c b/sound/isa/cs423x/cs4231.c index 696a5c86b..ab67b5c25 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 ? IRQF_DISABLED : 0, + mpu_irq[dev] >= 0 ? SA_INTERRUPT : 0, NULL) < 0) printk(KERN_WARNING "cs4231: MPU401 not detected\n"); } @@ -203,17 +203,13 @@ static int __init alsa_card_cs4231_init(void) return err; cards = 0; - for (i = 0; i < SNDRV_CARDS; i++) { + for (i = 0; i < SNDRV_CARDS && enable[i]; i++) { struct platform_device *device; - if (! enable[i]) - continue; device = platform_device_register_simple(SND_CS4231_DRIVER, i, NULL, 0); - if (IS_ERR(device)) - continue; - if (!platform_get_drvdata(device)) { - platform_device_unregister(device); - continue; + if (IS_ERR(device)) { + err = PTR_ERR(device); + goto errout; } devices[i] = device; cards++; @@ -222,10 +218,14 @@ static int __init alsa_card_cs4231_init(void) #ifdef MODULE printk(KERN_ERR "CS4231 soundcard not found or device busy\n"); #endif - snd_cs4231_unregister_all(); - return -ENODEV; + err = -ENODEV; + goto errout; } return 0; + + errout: + snd_cs4231_unregister_all(); + return err; } static void __exit alsa_card_cs4231_exit(void) diff --git a/sound/isa/cs423x/cs4231_lib.c b/sound/isa/cs423x/cs4231_lib.c index fbb20176c..eab7eb59b 100644 --- a/sound/isa/cs423x/cs4231_lib.c +++ b/sound/isa/cs423x/cs4231_lib.c @@ -531,7 +531,7 @@ static void snd_cs4231_playback_format(struct snd_cs4231 *chip, unsigned long flags; int full_calib = 1; - mutex_lock(&chip->mce_mutex); + down(&chip->mce_mutex); snd_cs4231_calibrate_mute(chip, 1); if (chip->hardware == CS4231_HW_CS4231A || (chip->hardware & CS4231_HW_CS4232_MASK)) { @@ -560,7 +560,7 @@ static void snd_cs4231_playback_format(struct snd_cs4231 *chip, snd_cs4231_mce_down(chip); } snd_cs4231_calibrate_mute(chip, 0); - mutex_unlock(&chip->mce_mutex); + up(&chip->mce_mutex); } static void snd_cs4231_capture_format(struct snd_cs4231 *chip, @@ -570,7 +570,7 @@ static void snd_cs4231_capture_format(struct snd_cs4231 *chip, unsigned long flags; int full_calib = 1; - mutex_lock(&chip->mce_mutex); + down(&chip->mce_mutex); snd_cs4231_calibrate_mute(chip, 1); if (chip->hardware == CS4231_HW_CS4231A || (chip->hardware & CS4231_HW_CS4232_MASK)) { @@ -603,7 +603,7 @@ static void snd_cs4231_capture_format(struct snd_cs4231 *chip, snd_cs4231_mce_down(chip); } snd_cs4231_calibrate_mute(chip, 0); - mutex_unlock(&chip->mce_mutex); + up(&chip->mce_mutex); } /* @@ -709,15 +709,15 @@ static int snd_cs4231_open(struct snd_cs4231 *chip, unsigned int mode) { unsigned long flags; - mutex_lock(&chip->open_mutex); + down(&chip->open_mutex); if ((chip->mode & mode) || ((chip->mode & CS4231_MODE_OPEN) && chip->single_dma)) { - mutex_unlock(&chip->open_mutex); + up(&chip->open_mutex); return -EAGAIN; } if (chip->mode & CS4231_MODE_OPEN) { chip->mode |= mode; - mutex_unlock(&chip->open_mutex); + up(&chip->open_mutex); return 0; } /* ok. now enable and ack CODEC IRQ */ @@ -737,7 +737,7 @@ static int snd_cs4231_open(struct snd_cs4231 *chip, unsigned int mode) spin_unlock_irqrestore(&chip->reg_lock, flags); chip->mode = mode; - mutex_unlock(&chip->open_mutex); + up(&chip->open_mutex); return 0; } @@ -745,10 +745,10 @@ static void snd_cs4231_close(struct snd_cs4231 *chip, unsigned int mode) { unsigned long flags; - mutex_lock(&chip->open_mutex); + down(&chip->open_mutex); chip->mode &= ~mode; if (chip->mode & CS4231_MODE_OPEN) { - mutex_unlock(&chip->open_mutex); + up(&chip->open_mutex); return; } snd_cs4231_calibrate_mute(chip, 1); @@ -785,7 +785,7 @@ static void snd_cs4231_close(struct snd_cs4231 *chip, unsigned int mode) snd_cs4231_calibrate_mute(chip, 0); chip->mode = 0; - mutex_unlock(&chip->open_mutex); + up(&chip->open_mutex); } /* @@ -1408,8 +1408,8 @@ static int snd_cs4231_new(struct snd_card *card, chip->hwshare = hwshare; spin_lock_init(&chip->reg_lock); - mutex_init(&chip->mce_mutex); - mutex_init(&chip->open_mutex); + init_MUTEX(&chip->mce_mutex); + init_MUTEX(&chip->open_mutex); chip->card = card; chip->rate_constraint = snd_cs4231_xrate; chip->set_playback_format = snd_cs4231_playback_format; @@ -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, IRQF_DISABLED, "CS4231", (void *) chip)) { + if (!(hwshare & CS4231_HWSHARE_IRQ) && request_irq(irq, snd_cs4231_interrupt, SA_INTERRUPT, "CS4231", (void *) chip)) { snd_printk(KERN_ERR "cs4231: can't grab IRQ %d\n", irq); snd_cs4231_free(chip); return -EBUSY; @@ -1538,8 +1538,8 @@ int snd_cs4231_pcm(struct snd_cs4231 *chip, int device, struct snd_pcm **rpcm) return err; spin_lock_init(&chip->reg_lock); - mutex_init(&chip->mce_mutex); - mutex_init(&chip->open_mutex); + init_MUTEX(&chip->mce_mutex); + init_MUTEX(&chip->open_mutex); snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &snd_cs4231_playback_ops); snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &snd_cs4231_capture_ops); diff --git a/sound/isa/cs423x/cs4236.c b/sound/isa/cs423x/cs4236.c index 07ffd5c22..99a42138b 100644 --- a/sound/isa/cs423x/cs4236.c +++ b/sound/isa/cs423x/cs4236.c @@ -133,7 +133,6 @@ static int pnpc_registered; static int pnp_registered; #endif #endif /* CONFIG_PNP */ -static unsigned int snd_cs423x_devices; struct snd_card_cs4236 { struct snd_cs4231 *chip; @@ -535,7 +534,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 ? IRQF_DISABLED : 0, NULL) < 0) + mpu_irq[dev] >= 0 ? SA_INTERRUPT : 0, NULL) < 0) printk(KERN_WARNING IDENT ": MPU401 not detected\n"); } @@ -565,7 +564,7 @@ static int __init snd_cs423x_nonpnp_probe(struct platform_device *pdev) snd_card_free(card); return err; } - + platform_set_drvdata(pdev, card); return 0; } @@ -651,7 +650,6 @@ static int __devinit snd_cs4232_pnpbios_detect(struct pnp_dev *pdev, } pnp_set_drvdata(pdev, card); dev++; - snd_cs423x_devices++; return 0; } @@ -715,7 +713,6 @@ static int __devinit snd_cs423x_pnpc_detect(struct pnp_card_link *pcard, } pnp_set_card_drvdata(pcard, card); dev++; - snd_cs423x_devices++; return 0; } @@ -724,7 +721,7 @@ static void __devexit snd_cs423x_pnpc_remove(struct pnp_card_link * pcard) snd_card_free(pnp_get_card_drvdata(pcard)); pnp_set_card_drvdata(pcard, NULL); } - + #ifdef CONFIG_PM static int snd_cs423x_pnpc_suspend(struct pnp_card_link *pcard, pm_message_t state) { @@ -769,45 +766,51 @@ static void __init_or_module snd_cs423x_unregister_all(void) static int __init alsa_card_cs423x_init(void) { - int i, err; + int i, err, cards = 0; if ((err = platform_driver_register(&cs423x_nonpnp_driver)) < 0) return err; - for (i = 0; i < SNDRV_CARDS; i++) { + for (i = 0; i < SNDRV_CARDS && enable[i]; i++) { struct platform_device *device; - if (! enable[i] || is_isapnp_selected(i)) + if (is_isapnp_selected(i)) continue; device = platform_device_register_simple(CS423X_DRIVER, i, NULL, 0); - if (IS_ERR(device)) - continue; - if (!platform_get_drvdata(device)) { - platform_device_unregister(device); - continue; + if (IS_ERR(device)) { + err = PTR_ERR(device); + goto errout; } platform_devices[i] = device; - snd_cs423x_devices++; + cards++; } #ifdef CONFIG_PNP #ifdef CS4232 - err = pnp_register_driver(&cs4232_pnp_driver); - if (!err) + i = pnp_register_driver(&cs4232_pnp_driver); + if (i >= 0) { pnp_registered = 1; + cards += i; + } #endif - err = pnp_register_card_driver(&cs423x_pnpc_driver); - if (!err) + i = pnp_register_card_driver(&cs423x_pnpc_driver); + if (i >= 0) { pnpc_registered = 1; + cards += i; + } #endif /* CONFIG_PNP */ - if (!snd_cs423x_devices) { + if (!cards) { #ifdef MODULE printk(KERN_ERR IDENT " soundcard not found or device busy\n"); #endif - snd_cs423x_unregister_all(); - return -ENODEV; + err = -ENODEV; + goto errout; } return 0; + + errout: + snd_cs423x_unregister_all(); + return err; } static void __exit alsa_card_cs423x_exit(void) diff --git a/sound/isa/cs423x/cs4236_lib.c b/sound/isa/cs423x/cs4236_lib.c index 7a5a6c71f..e36981d64 100644 --- a/sound/isa/cs423x/cs4236_lib.c +++ b/sound/isa/cs423x/cs4236_lib.c @@ -644,7 +644,7 @@ static int snd_cs4236_put_master_digital(struct snd_kcontrol *kcontrol, struct s val2 = (chip->eimage[CS4236_REG(CS4236_RIGHT_MASTER)] & ~0x7f) | val2; change = val1 != chip->eimage[CS4236_REG(CS4236_LEFT_MASTER)] || val2 != chip->eimage[CS4236_REG(CS4236_RIGHT_MASTER)]; snd_cs4236_ext_out(chip, CS4236_LEFT_MASTER, val1); - snd_cs4236_ext_out(chip, CS4236_RIGHT_MASTER, val2); + snd_cs4236_ext_out(chip, CS4236_RIGHT_MASTER, val1); spin_unlock_irqrestore(&chip->reg_lock, flags); return change; } @@ -841,7 +841,7 @@ static int snd_cs4236_put_iec958_switch(struct snd_kcontrol *kcontrol, struct sn enable = ucontrol->value.integer.value[0] & 1; - mutex_lock(&chip->mce_mutex); + down(&chip->mce_mutex); snd_cs4231_mce_up(chip); spin_lock_irqsave(&chip->reg_lock, flags); val = (chip->image[CS4231_ALT_FEATURE_1] & ~0x0e) | (0<<2) | (enable << 1); @@ -854,7 +854,7 @@ static int snd_cs4236_put_iec958_switch(struct snd_kcontrol *kcontrol, struct sn snd_cs4236_ctrl_out(chip, 4, val); spin_unlock_irqrestore(&chip->reg_lock, flags); snd_cs4231_mce_down(chip); - mutex_unlock(&chip->mce_mutex); + up(&chip->mce_mutex); #if 0 printk("set valid: ALT = 0x%x, C3 = 0x%x, C4 = 0x%x, C5 = 0x%x, C6 = 0x%x, C8 = 0x%x\n", diff --git a/sound/isa/dt019x.c b/sound/isa/dt019x.c index c20a4b1b1..50e7bc5ef 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 ? IRQF_DISABLED : 0, + mpu_irq[dev] >= 0 ? SA_INTERRUPT : 0, NULL) < 0) snd_printk(KERN_ERR PFX "no MPU-401 device at 0x%lx ?\n", mpu_port[dev]); } @@ -272,8 +272,6 @@ static int __devinit snd_card_dt019x_probe(int dev, struct pnp_card_link *pcard, return 0; } -static unsigned int __devinitdata dt019x_devices; - static int __devinit snd_dt019x_pnp_probe(struct pnp_card_link *card, const struct pnp_card_device_id *pid) { @@ -287,7 +285,6 @@ static int __devinit snd_dt019x_pnp_probe(struct pnp_card_link *card, if (res < 0) return res; dev++; - dt019x_devices++; return 0; } return -ENODEV; @@ -339,13 +336,10 @@ static struct pnp_card_driver dt019x_pnpc_driver = { static int __init alsa_card_dt019x_init(void) { - int err; - - err = pnp_register_card_driver(&dt019x_pnpc_driver); - if (err) - return err; + int cards = 0; - if (!dt019x_devices) { + cards = pnp_register_card_driver(&dt019x_pnpc_driver); + if (cards <= 0) { pnp_unregister_card_driver(&dt019x_pnpc_driver); #ifdef MODULE snd_printk(KERN_ERR "no DT-019X / ALS-007 based soundcards found\n"); diff --git a/sound/isa/es1688/es1688.c b/sound/isa/es1688/es1688.c index 7f29f56e4..50d23cf3d 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, - IRQF_DISABLED, + SA_INTERRUPT, NULL)) < 0) goto _err; } @@ -207,17 +207,13 @@ static int __init alsa_card_es1688_init(void) return err; cards = 0; - for (i = 0; i < SNDRV_CARDS; i++) { + for (i = 0; i < SNDRV_CARDS && enable[i]; i++) { struct platform_device *device; - if (! enable[i]) - continue; device = platform_device_register_simple(ES1688_DRIVER, i, NULL, 0); - if (IS_ERR(device)) - continue; - if (!platform_get_drvdata(device)) { - platform_device_unregister(device); - continue; + if (IS_ERR(device)) { + err = PTR_ERR(device); + goto errout; } devices[i] = device; cards++; @@ -226,10 +222,14 @@ static int __init alsa_card_es1688_init(void) #ifdef MODULE printk(KERN_ERR "ESS AudioDrive ES1688 soundcard not found or device busy\n"); #endif - snd_es1688_unregister_all(); - return -ENODEV; + err = -ENODEV; + goto errout; } return 0; + + errout: + snd_es1688_unregister_all(); + return err; } static void __exit alsa_card_es1688_exit(void) diff --git a/sound/isa/es1688/es1688_lib.c b/sound/isa/es1688/es1688_lib.c index 7e985d3bc..702ad51ee 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, IRQF_DISABLED, "ES1688", (void *) chip)) { + if (request_irq(irq, snd_es1688_interrupt, SA_INTERRUPT, "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 34998de99..7a12848a7 100644 --- a/sound/isa/es18xx.c +++ b/sound/isa/es18xx.c @@ -49,10 +49,6 @@ * - contrarily to some pages in DS_1869.PDF the rates can be set * independently. * - * - Zoom Video is implemented by sharing the FM DAC, thus the user can - * have either FM playback or Video playback but not both simultaneously. - * The Video Playback Switch mixer control toggles this choice. - * * BUGS: * * - There is a major trouble I noted: @@ -67,16 +63,7 @@ * */ -/* - * ES1879 NOTES: - * - When Zoom Video is enabled (reg 0x71 bit 6 toggled on) the PCM playback - * seems to be effected (speaker_test plays a lower frequency). Can't find - * anything in the datasheet to account for this, so a Video Playback Switch - * control has been included to allow ZV to be enabled only when necessary. - * Then again on at least one test system the 0x71 bit 6 enable bit is not - * needed for ZV, so maybe the datasheet is entirely wrong here. - */ - + #include #include #include @@ -85,8 +72,6 @@ #include #include #include -#include - #include #include #include @@ -163,7 +148,7 @@ struct snd_audiodrive { #define ES18XX_DUPLEX_SAME 0x0010 /* Playback and record must share the same rate */ #define ES18XX_NEW_RATE 0x0020 /* More precise rate setting */ #define ES18XX_AUXB 0x0040 /* AuxB mixer control */ -#define ES18XX_HWV 0x0080 /* Has seperate hardware volume mixer controls*/ +#define ES18XX_HWV 0x0080 /* Has hardware volume */ #define ES18XX_MONO 0x0100 /* Mono_in mixer control */ #define ES18XX_I2S 0x0200 /* I2S mixer control */ #define ES18XX_MUTEREC 0x0400 /* Record source can be muted */ @@ -803,12 +788,9 @@ static irqreturn_t snd_es18xx_interrupt(int irq, void *dev_id, struct pt_regs *r /* Hardware volume */ if (status & HWV_IRQ) { - int split = 0; - if (chip->caps & ES18XX_HWV) { - split = snd_es18xx_mixer_read(chip, 0x64) & 0x80; - snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE, &chip->hw_switch->id); - snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE, &chip->hw_volume->id); - } + int split = snd_es18xx_mixer_read(chip, 0x64) & 0x80; + snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE, &chip->hw_switch->id); + snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE, &chip->hw_volume->id); if (!split) { snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE, &chip->master_switch->id); snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE, &chip->master_volume->id); @@ -957,118 +939,37 @@ static int snd_es18xx_capture_close(struct snd_pcm_substream *substream) * MIXER part */ -/* Record source mux routines: - * Depending on the chipset this mux switches between 4, 5, or 8 possible inputs. - * bit table for the 4/5 source mux: - * reg 1C: - * b2 b1 b0 muxSource - * x 0 x microphone - * 0 1 x CD - * 1 1 0 line - * 1 1 1 mixer - * if it's "mixer" and it's a 5 source mux chipset then reg 7A bit 3 determines - * either the play mixer or the capture mixer. - * - * "map4Source" translates from source number to reg bit pattern - * "invMap4Source" translates from reg bit pattern to source number - */ - static int snd_es18xx_info_mux(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo) { - static char *texts4Source[4] = { - "Mic", "CD", "Line", "Master" - }; - static char *texts5Source[5] = { - "Mic", "CD", "Line", "Master", "Mix" - }; - static char *texts8Source[8] = { + static char *texts[8] = { "Mic", "Mic Master", "CD", "AOUT", "Mic1", "Mix", "Line", "Master" }; - struct snd_es18xx *chip = snd_kcontrol_chip(kcontrol); uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; uinfo->count = 1; - switch (chip->version) { - case 0x1868: - case 0x1878: - uinfo->value.enumerated.items = 4; - if (uinfo->value.enumerated.item > 3) - uinfo->value.enumerated.item = 3; - strcpy(uinfo->value.enumerated.name, texts4Source[uinfo->value.enumerated.item]); - break; - case 0x1887: - case 0x1888: - uinfo->value.enumerated.items = 5; - if (uinfo->value.enumerated.item > 4) - uinfo->value.enumerated.item = 4; - strcpy(uinfo->value.enumerated.name, texts5Source[uinfo->value.enumerated.item]); - break; - case 0x1869: /* DS somewhat contradictory for 1869: could be be 5 or 8 */ - case 0x1879: - uinfo->value.enumerated.items = 8; - if (uinfo->value.enumerated.item > 7) - uinfo->value.enumerated.item = 7; - strcpy(uinfo->value.enumerated.name, texts8Source[uinfo->value.enumerated.item]); - break; - default: - return -EINVAL; - } + uinfo->value.enumerated.items = 8; + if (uinfo->value.enumerated.item > 7) + uinfo->value.enumerated.item = 7; + strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]); return 0; } static int snd_es18xx_get_mux(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - static unsigned char invMap4Source[8] = {0, 0, 1, 1, 0, 0, 2, 3}; struct snd_es18xx *chip = snd_kcontrol_chip(kcontrol); - int muxSource = snd_es18xx_mixer_read(chip, 0x1c) & 0x07; - if (!(chip->version == 0x1869 || chip->version == 0x1879)) { - muxSource = invMap4Source[muxSource]; - if (muxSource==3 && - (chip->version == 0x1887 || chip->version == 0x1888) && - (snd_es18xx_mixer_read(chip, 0x7a) & 0x08) - ) - muxSource = 4; - } - ucontrol->value.enumerated.item[0] = muxSource; + ucontrol->value.enumerated.item[0] = snd_es18xx_mixer_read(chip, 0x1c) & 0x07; return 0; } static int snd_es18xx_put_mux(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - static unsigned char map4Source[4] = {0, 2, 6, 7}; struct snd_es18xx *chip = snd_kcontrol_chip(kcontrol); unsigned char val = ucontrol->value.enumerated.item[0]; - unsigned char retVal = 0; - - switch (chip->version) { - /* 5 source chips */ - case 0x1887: - case 0x1888: - if (val > 4) - return -EINVAL; - if (val == 4) { - retVal = snd_es18xx_mixer_bits(chip, 0x7a, 0x08, 0x08) != 0x08; - val = 3; - } else - retVal = snd_es18xx_mixer_bits(chip, 0x7a, 0x08, 0x00) != 0x00; - /* 4 source chips */ - case 0x1868: - case 0x1878: - if (val > 3) - return -EINVAL; - val = map4Source[val]; - break; - /* 8 source chips */ - case 0x1869: - case 0x1879: - if (val > 7) - return -EINVAL; - break; - default: + + if (val > 7) return -EINVAL; - } - return (snd_es18xx_mixer_bits(chip, 0x1c, 0x07, val) != val) || retVal; + return snd_es18xx_mixer_bits(chip, 0x1c, 0x07, val) != val; } static int snd_es18xx_info_spatializer_enable(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo) @@ -1290,22 +1191,19 @@ static int snd_es18xx_put_double(struct snd_kcontrol *kcontrol, struct snd_ctl_e return change; } -/* Mixer controls - * These arrays contain setup data for mixer controls. - * - * The controls that are universal to all chipsets are fully initialized - * here. - */ static struct snd_kcontrol_new snd_es18xx_base_controls[] = { ES18XX_DOUBLE("Master Playback Volume", 0, 0x60, 0x62, 0, 0, 63, 0), ES18XX_DOUBLE("Master Playback Switch", 0, 0x60, 0x62, 6, 6, 1, 1), ES18XX_DOUBLE("Line Playback Volume", 0, 0x3e, 0x3e, 4, 0, 15, 0), ES18XX_DOUBLE("CD Playback Volume", 0, 0x38, 0x38, 4, 0, 15, 0), ES18XX_DOUBLE("FM Playback Volume", 0, 0x36, 0x36, 4, 0, 15, 0), +ES18XX_DOUBLE("Mono Playback Volume", 0, 0x6d, 0x6d, 4, 0, 15, 0), ES18XX_DOUBLE("Mic Playback Volume", 0, 0x1a, 0x1a, 4, 0, 15, 0), ES18XX_DOUBLE("Aux Playback Volume", 0, 0x3a, 0x3a, 4, 0, 15, 0), +ES18XX_SINGLE("PC Speaker Playback Volume", 0, 0x3c, 0, 7, 0), ES18XX_SINGLE("Record Monitor", 0, 0xa8, 3, 1, 0), ES18XX_DOUBLE("Capture Volume", 0, 0xb4, 0xb4, 4, 0, 15, 0), +ES18XX_SINGLE("Capture Switch", 0, 0x1c, 4, 1, 1), { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = "Capture Source", @@ -1315,37 +1213,19 @@ ES18XX_DOUBLE("Capture Volume", 0, 0xb4, 0xb4, 4, 0, 15, 0), } }; +static struct snd_kcontrol_new snd_es18xx_mono_in_control = +ES18XX_DOUBLE("Mono Input Playback Volume", 0, 0x6d, 0x6d, 4, 0, 15, 0); + static struct snd_kcontrol_new snd_es18xx_recmix_controls[] = { ES18XX_DOUBLE("PCM Capture Volume", 0, 0x69, 0x69, 4, 0, 15, 0), ES18XX_DOUBLE("Mic Capture Volume", 0, 0x68, 0x68, 4, 0, 15, 0), ES18XX_DOUBLE("Line Capture Volume", 0, 0x6e, 0x6e, 4, 0, 15, 0), ES18XX_DOUBLE("FM Capture Volume", 0, 0x6b, 0x6b, 4, 0, 15, 0), +ES18XX_DOUBLE("Mono Capture Volume", 0, 0x6f, 0x6f, 4, 0, 15, 0), ES18XX_DOUBLE("CD Capture Volume", 0, 0x6a, 0x6a, 4, 0, 15, 0), ES18XX_DOUBLE("Aux Capture Volume", 0, 0x6c, 0x6c, 4, 0, 15, 0) }; -/* - * The chipset specific mixer controls - */ -static struct snd_kcontrol_new snd_es18xx_opt_speaker = - ES18XX_SINGLE("PC Speaker Playback Volume", 0, 0x3c, 0, 7, 0); - -static struct snd_kcontrol_new snd_es18xx_opt_1869[] = { -ES18XX_SINGLE("Capture Switch", 0, 0x1c, 4, 1, 1), -ES18XX_SINGLE("Video Playback Switch", 0, 0x7f, 0, 1, 0), -ES18XX_DOUBLE("Mono Playback Volume", 0, 0x6d, 0x6d, 4, 0, 15, 0), -ES18XX_DOUBLE("Mono Capture Volume", 0, 0x6f, 0x6f, 4, 0, 15, 0) -}; - -static struct snd_kcontrol_new snd_es18xx_opt_1878 = - ES18XX_DOUBLE("Video Playback Volume", 0, 0x68, 0x68, 4, 0, 15, 0); - -static struct snd_kcontrol_new snd_es18xx_opt_1879[] = { -ES18XX_SINGLE("Video Playback Switch", 0, 0x71, 6, 1, 0), -ES18XX_DOUBLE("Video Playback Volume", 0, 0x6d, 0x6d, 4, 0, 15, 0), -ES18XX_DOUBLE("Video Capture Volume", 0, 0x6f, 0x6f, 4, 0, 15, 0) -}; - static struct snd_kcontrol_new snd_es18xx_pcm1_controls[] = { ES18XX_DOUBLE("PCM Playback Volume", 0, 0x14, 0x14, 4, 0, 15, 0), }; @@ -1390,6 +1270,7 @@ static struct snd_kcontrol_new snd_es18xx_hw_volume_controls[] = { ES18XX_SINGLE("Hardware Master Volume Split", 0, 0x64, 7, 1, 0), }; +#if 0 static int __devinit snd_es18xx_config_read(struct snd_es18xx *chip, unsigned char reg) { int data; @@ -1400,6 +1281,7 @@ static int __devinit snd_es18xx_config_read(struct snd_es18xx *chip, unsigned ch spin_unlock_irqrestore(&chip->ctrl_lock, flags); return data; } +#endif static void __devinit snd_es18xx_config_write(struct snd_es18xx *chip, unsigned char reg, unsigned char data) @@ -1545,17 +1427,6 @@ static int __devinit snd_es18xx_initialize(struct snd_es18xx *chip) snd_es18xx_mixer_write(chip, 0x58, 0x94); snd_es18xx_mixer_write(chip, 0x5a, 0x80); } - /* Flip the "enable I2S" bits for those chipsets that need it */ - switch (chip->version) { - case 0x1879: - //Leaving I2S enabled on the 1879 screws up the PCM playback (rate effected somehow) - //so a Switch control has been added to toggle this 0x71 bit on/off: - //snd_es18xx_mixer_bits(chip, 0x71, 0x40, 0x40); - /* Note: we fall through on purpose here. */ - case 0x1878: - snd_es18xx_config_write(chip, 0x29, snd_es18xx_config_read(chip, 0x29) | 0x40); - break; - } /* Mute input source */ if (chip->caps & ES18XX_MUTEREC) mask = 0x10; @@ -1605,14 +1476,11 @@ static int __devinit snd_es18xx_identify(struct snd_es18xx *chip) } outb(0x40, chip->port + 0x04); - udelay(10); hi = inb(chip->port + 0x05); - udelay(10); lo = inb(chip->port + 0x05); if (hi != lo) { chip->version = hi << 8 | lo; chip->ctrl_port = inb(chip->port + 0x05) << 8; - udelay(10); chip->ctrl_port += inb(chip->port + 0x05); if ((chip->res_ctrl_port = request_region(chip->ctrl_port, 8, "ES18xx - CTRL")) == NULL) { @@ -1651,22 +1519,22 @@ static int __devinit snd_es18xx_probe(struct snd_es18xx *chip) switch (chip->version) { case 0x1868: - chip->caps = ES18XX_DUPLEX_MONO | ES18XX_DUPLEX_SAME | ES18XX_CONTROL; + chip->caps = ES18XX_DUPLEX_MONO | ES18XX_DUPLEX_SAME | ES18XX_CONTROL | ES18XX_HWV; break; case 0x1869: chip->caps = ES18XX_PCM2 | ES18XX_SPATIALIZER | ES18XX_RECMIX | ES18XX_NEW_RATE | ES18XX_AUXB | ES18XX_MONO | ES18XX_MUTEREC | ES18XX_CONTROL | ES18XX_HWV; break; case 0x1878: - chip->caps = ES18XX_DUPLEX_MONO | ES18XX_DUPLEX_SAME | ES18XX_I2S | ES18XX_CONTROL; + chip->caps = ES18XX_DUPLEX_MONO | ES18XX_DUPLEX_SAME | ES18XX_I2S | ES18XX_CONTROL | ES18XX_HWV; break; case 0x1879: chip->caps = ES18XX_PCM2 | ES18XX_SPATIALIZER | ES18XX_RECMIX | ES18XX_NEW_RATE | ES18XX_AUXB | ES18XX_I2S | ES18XX_CONTROL | ES18XX_HWV; break; case 0x1887: - chip->caps = ES18XX_PCM2 | ES18XX_RECMIX | ES18XX_AUXB | ES18XX_DUPLEX_SAME; + chip->caps = ES18XX_PCM2 | ES18XX_RECMIX | ES18XX_AUXB | ES18XX_DUPLEX_SAME | ES18XX_HWV; break; case 0x1888: - chip->caps = ES18XX_PCM2 | ES18XX_RECMIX | ES18XX_AUXB | ES18XX_DUPLEX_SAME; + chip->caps = ES18XX_PCM2 | ES18XX_RECMIX | ES18XX_AUXB | ES18XX_DUPLEX_SAME | ES18XX_HWV; break; default: snd_printk(KERN_ERR "[0x%lx] unsupported chip ES%x\n", @@ -1837,7 +1705,7 @@ static int __devinit snd_es18xx_new_device(struct snd_card *card, return -EBUSY; } - if (request_irq(irq, snd_es18xx_interrupt, IRQF_DISABLED, "ES18xx", (void *) chip)) { + if (request_irq(irq, snd_es18xx_interrupt, SA_INTERRUPT, "ES18xx", (void *) chip)) { snd_es18xx_free(chip); snd_printk(KERN_ERR PFX "unable to grap IRQ %d\n", irq); return -EBUSY; @@ -1910,6 +1778,10 @@ static int __devinit snd_es18xx_mixer(struct snd_es18xx *chip) } } + if (chip->caps & ES18XX_MONO) { + if ((err = snd_ctl_add(card, snd_ctl_new1(&snd_es18xx_mono_in_control, chip))) < 0) + return err; + } if (chip->caps & ES18XX_RECMIX) { for (idx = 0; idx < ARRAY_SIZE(snd_es18xx_recmix_controls); idx++) { if ((err = snd_ctl_add(card, snd_ctl_new1(&snd_es18xx_recmix_controls[idx], chip))) < 0) @@ -1947,36 +1819,6 @@ static int __devinit snd_es18xx_mixer(struct snd_es18xx *chip) } } - /* finish initializing other chipset specific controls - */ - if (chip->version != 0x1868) { - err = snd_ctl_add(card, snd_ctl_new1(&snd_es18xx_opt_speaker, - chip)); - if (err < 0) - return err; - } - if (chip->version == 0x1869) { - for (idx = 0; idx < ARRAY_SIZE(snd_es18xx_opt_1869); idx++) { - err = snd_ctl_add(card, - snd_ctl_new1(&snd_es18xx_opt_1869[idx], - chip)); - if (err < 0) - return err; - } - } else if (chip->version == 0x1878) { - err = snd_ctl_add(card, snd_ctl_new1(&snd_es18xx_opt_1878, - chip)); - if (err < 0) - return err; - } else if (chip->version == 0x1879) { - for (idx = 0; idx < ARRAY_SIZE(snd_es18xx_opt_1879); idx++) { - err = snd_ctl_add(card, - snd_ctl_new1(&snd_es18xx_opt_1879[idx], - chip)); - if (err < 0) - return err; - } - } return 0; } @@ -2088,8 +1930,7 @@ static int __devinit snd_audiodrive_pnp(int dev, struct snd_audiodrive *acard, kfree(cfg); return -EAGAIN; } - snd_printdd("pnp: port=0x%llx\n", - (unsigned long long)pnp_port_start(acard->devc, 0)); + snd_printdd("pnp: port=0x%lx\n", pnp_port_start(acard->devc, 0)); /* PnP initialization */ pdev = acard->dev; pnp_init_resource_table(cfg); @@ -2207,7 +2048,7 @@ static int __devinit snd_audiodrive_probe(struct snd_card *card, int dev) return snd_card_register(card); } -static int __devinit snd_es18xx_nonpnp_probe1(int dev, struct platform_device *devptr) +static int __init snd_es18xx_nonpnp_probe1(int dev, struct platform_device *devptr) { struct snd_card *card; int err; @@ -2224,7 +2065,7 @@ static int __devinit snd_es18xx_nonpnp_probe1(int dev, struct platform_device *d return 0; } -static int __devinit snd_es18xx_nonpnp_probe(struct platform_device *pdev) +static int __init snd_es18xx_nonpnp_probe(struct platform_device *pdev) { int dev = pdev->id; int err; @@ -2300,8 +2141,6 @@ static struct platform_driver snd_es18xx_nonpnp_driver = { #ifdef CONFIG_PNP -static unsigned int __devinitdata es18xx_pnp_devices; - static int __devinit snd_audiodrive_pnp_detect(struct pnp_card_link *pcard, const struct pnp_card_device_id *pid) { @@ -2332,7 +2171,6 @@ static int __devinit snd_audiodrive_pnp_detect(struct pnp_card_link *pcard, pnp_set_card_drvdata(pcard, card); dev++; - es18xx_pnp_devices++; return 0; } @@ -2388,27 +2226,25 @@ static int __init alsa_card_es18xx_init(void) if ((err = platform_driver_register(&snd_es18xx_nonpnp_driver)) < 0) return err; - for (i = 0; i < SNDRV_CARDS; i++) { + for (i = 0; i < SNDRV_CARDS && enable[i]; i++) { struct platform_device *device; - if (! enable[i] || is_isapnp_selected(i)) + if (is_isapnp_selected(i)) continue; device = platform_device_register_simple(ES18XX_DRIVER, i, NULL, 0); - if (IS_ERR(device)) - continue; - if (!platform_get_drvdata(device)) { - platform_device_unregister(device); - continue; + if (IS_ERR(device)) { + err = PTR_ERR(device); + goto errout; } platform_devices[i] = device; cards++; } #ifdef CONFIG_PNP - err = pnp_register_card_driver(&es18xx_pnpc_driver); - if (!err) { + i = pnp_register_card_driver(&es18xx_pnpc_driver); + if (i >= 0) { pnp_registered = 1; - cards += es18xx_pnp_devices; + cards += i; } #endif @@ -2416,10 +2252,14 @@ static int __init alsa_card_es18xx_init(void) #ifdef MODULE snd_printk(KERN_ERR "ESS AudioDrive ES18xx soundcard not found or device busy\n"); #endif - snd_es18xx_unregister_all(); - return -ENODEV; + err = -ENODEV; + goto errout; } return 0; + + errout: + snd_es18xx_unregister_all(); + return err; } static void __exit alsa_card_es18xx_exit(void) diff --git a/sound/isa/gus/gus_dma.c b/sound/isa/gus/gus_dma.c index 44ee5d367..930f4bc56 100644 --- a/sound/isa/gus/gus_dma.c +++ b/sound/isa/gus/gus_dma.c @@ -149,10 +149,10 @@ static void snd_gf1_dma_interrupt(struct snd_gus_card * gus) int snd_gf1_dma_init(struct snd_gus_card * gus) { - mutex_lock(&gus->dma_mutex); + down(&gus->dma_mutex); gus->gf1.dma_shared++; if (gus->gf1.dma_shared > 1) { - mutex_unlock(&gus->dma_mutex); + up(&gus->dma_mutex); return 0; } gus->gf1.interrupt_handler_dma_write = snd_gf1_dma_interrupt; @@ -160,7 +160,7 @@ int snd_gf1_dma_init(struct snd_gus_card * gus) gus->gf1.dma_data_pcm_last = gus->gf1.dma_data_synth = gus->gf1.dma_data_synth_last = NULL; - mutex_unlock(&gus->dma_mutex); + up(&gus->dma_mutex); return 0; } @@ -168,7 +168,7 @@ int snd_gf1_dma_done(struct snd_gus_card * gus) { struct snd_gf1_dma_block *block; - mutex_lock(&gus->dma_mutex); + down(&gus->dma_mutex); gus->gf1.dma_shared--; if (!gus->gf1.dma_shared) { snd_dma_disable(gus->gf1.dma1); @@ -185,7 +185,7 @@ int snd_gf1_dma_done(struct snd_gus_card * gus) gus->gf1.dma_data_pcm_last = gus->gf1.dma_data_synth_last = NULL; } - mutex_unlock(&gus->dma_mutex); + up(&gus->dma_mutex); return 0; } diff --git a/sound/isa/gus/gus_irq.c b/sound/isa/gus/gus_irq.c index 42db37552..c19ba2910 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, snd_gus_irq_info_read); + snd_info_set_text_ops(entry, gus, 1024, snd_gus_irq_info_read); } #endif diff --git a/sound/isa/gus/gus_main.c b/sound/isa/gus/gus_main.c index b680fddf0..6d15b3d18 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, IRQF_DISABLED, "GUS GF1", (void *) gus)) { + if (irq >= 0 && request_irq(irq, snd_gus_interrupt, SA_INTERRUPT, "GUS GF1", (void *) gus)) { snd_printk(KERN_ERR "gus: can't grab irq %d\n", irq); snd_gus_free(gus); return -EBUSY; @@ -225,7 +225,7 @@ int snd_gus_create(struct snd_card *card, spin_lock_init(&gus->dma_lock); spin_lock_init(&gus->pcm_volume_level_lock); spin_lock_init(&gus->uart_cmd_lock); - mutex_init(&gus->dma_mutex); + init_MUTEX(&gus->dma_mutex); if ((err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, gus, &ops)) < 0) { snd_gus_free(gus); return err; diff --git a/sound/isa/gus/gus_mem.c b/sound/isa/gus/gus_mem.c index f50c276ca..e8bdb860a 100644 --- a/sound/isa/gus/gus_mem.c +++ b/sound/isa/gus/gus_mem.c @@ -34,9 +34,9 @@ static void snd_gf1_mem_info_read(struct snd_info_entry *entry, void snd_gf1_mem_lock(struct snd_gf1_mem * alloc, int xup) { if (!xup) { - mutex_lock(&alloc->memory_mutex); + down(&alloc->memory_mutex); } else { - mutex_unlock(&alloc->memory_mutex); + up(&alloc->memory_mutex); } } @@ -59,7 +59,7 @@ static struct snd_gf1_mem_block *snd_gf1_mem_xalloc(struct snd_gf1_mem * alloc, alloc->first = nblock; else nblock->prev->next = nblock; - mutex_unlock(&alloc->memory_mutex); + up(&alloc->memory_mutex); return NULL; } pblock = pblock->next; @@ -80,7 +80,7 @@ int snd_gf1_mem_xfree(struct snd_gf1_mem * alloc, struct snd_gf1_mem_block * blo { if (block->share) { /* ok.. shared block */ block->share--; - mutex_unlock(&alloc->memory_mutex); + up(&alloc->memory_mutex); return 0; } if (alloc->first == block) { @@ -244,7 +244,7 @@ int snd_gf1_mem_init(struct snd_gus_card * gus) #endif alloc = &gus->gf1.mem_alloc; - mutex_init(&alloc->memory_mutex); + init_MUTEX(&alloc->memory_mutex); alloc->first = alloc->last = NULL; if (!gus->gf1.memory) return 0; @@ -264,8 +264,10 @@ 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, snd_gf1_mem_info_read); + 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; + } #endif return 0; } @@ -297,7 +299,7 @@ static void snd_gf1_mem_info_read(struct snd_info_entry *entry, gus = entry->private_data; alloc = &gus->gf1.mem_alloc; - mutex_lock(&alloc->memory_mutex); + down(&alloc->memory_mutex); snd_iprintf(buffer, "8-bit banks : \n "); for (i = 0; i < 4; i++) snd_iprintf(buffer, "0x%06x (%04ik)%s", alloc->banks_8[i].address, alloc->banks_8[i].size >> 10, i + 1 < 4 ? "," : ""); @@ -341,7 +343,7 @@ static void snd_gf1_mem_info_read(struct snd_info_entry *entry, } snd_iprintf(buffer, " Total: memory = %i, used = %i, free = %i\n", total, used, total - used); - mutex_unlock(&alloc->memory_mutex); + up(&alloc->memory_mutex); #if 0 ultra_iprintf(buffer, " Verify: free = %i, max 8-bit block = %i, max 16-bit block = %i\n", ultra_memory_free_size(card, &card->gf1.mem_alloc), diff --git a/sound/isa/gus/gus_pcm.c b/sound/isa/gus/gus_pcm.c index c7f95e7aa..d0829393e 100644 --- a/sound/isa/gus/gus_pcm.c +++ b/sound/isa/gus/gus_pcm.c @@ -114,6 +114,8 @@ static void snd_gf1_pcm_trigger_up(struct snd_pcm_substream *substream) unsigned char pan; unsigned int voice; + if (substream == NULL) + return; spin_lock_irqsave(&pcmp->lock, flags); if (pcmp->flags & SNDRV_GF1_PCM_PFLG_ACTIVE) { spin_unlock_irqrestore(&pcmp->lock, flags); diff --git a/sound/isa/gus/gus_synth.c b/sound/isa/gus/gus_synth.c index 3e4d4d6ed..85a1b051f 100644 --- a/sound/isa/gus/gus_synth.c +++ b/sound/isa/gus/gus_synth.c @@ -55,9 +55,9 @@ static int snd_gus_synth_use(void *private_data, struct snd_seq_port_subscribe * if (info->voices > 32) return -EINVAL; - mutex_lock(&gus->register_mutex); + down(&gus->register_mutex); if (!snd_gus_use_inc(gus)) { - mutex_unlock(&gus->register_mutex); + up(&gus->register_mutex); return -EFAULT; } for (idx = 0; idx < info->voices; idx++) { @@ -65,12 +65,12 @@ static int snd_gus_synth_use(void *private_data, struct snd_seq_port_subscribe * if (voice == NULL) { snd_gus_synth_free_voices(gus, info->sender.client, info->sender.port); snd_gus_use_dec(gus); - mutex_unlock(&gus->register_mutex); + up(&gus->register_mutex); return -EBUSY; } voice->index = idx; } - mutex_unlock(&gus->register_mutex); + up(&gus->register_mutex); return 0; } @@ -79,10 +79,10 @@ static int snd_gus_synth_unuse(void *private_data, struct snd_seq_port_subscribe struct snd_gus_port * port = private_data; struct snd_gus_card * gus = port->gus; - mutex_lock(&gus->register_mutex); + down(&gus->register_mutex); snd_gus_synth_free_voices(gus, info->sender.client, info->sender.port); snd_gus_use_dec(gus); - mutex_unlock(&gus->register_mutex); + up(&gus->register_mutex); return 0; } @@ -194,9 +194,7 @@ 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_HARDWARE | - SNDRV_SEQ_PORT_TYPE_SYNTHESIZER, + SNDRV_SEQ_PORT_TYPE_SYNTH, 16, 0, name); if (p->chset->port < 0) { @@ -225,7 +223,7 @@ static int snd_gus_synth_new_device(struct snd_seq_device *dev) if (gus == NULL) return -EINVAL; - mutex_init(&gus->register_mutex); + init_MUTEX(&gus->register_mutex); gus->gf1.seq_client = -1; /* allocate new client */ diff --git a/sound/isa/gus/gusclassic.c b/sound/isa/gus/gusclassic.c index 37057a37d..91c219116 100644 --- a/sound/isa/gus/gusclassic.c +++ b/sound/isa/gus/gusclassic.c @@ -247,17 +247,13 @@ static int __init alsa_card_gusclassic_init(void) return err; cards = 0; - for (i = 0; i < SNDRV_CARDS; i++) { + for (i = 0; i < SNDRV_CARDS && enable[i]; i++) { struct platform_device *device; - if (! enable[i]) - continue; device = platform_device_register_simple(GUSCLASSIC_DRIVER, i, NULL, 0); - if (IS_ERR(device)) - continue; - if (!platform_get_drvdata(device)) { - platform_device_unregister(device); - continue; + if (IS_ERR(device)) { + err = PTR_ERR(device); + goto errout; } devices[i] = device; cards++; @@ -266,10 +262,14 @@ static int __init alsa_card_gusclassic_init(void) #ifdef MODULE printk(KERN_ERR "GUS Classic soundcard not found or device busy\n"); #endif - snd_gusclassic_unregister_all(); - return -ENODEV; + err = -ENODEV; + goto errout; } return 0; + + errout: + snd_gusclassic_unregister_all(); + return err; } static void __exit alsa_card_gusclassic_exit(void) diff --git a/sound/isa/gus/gusextreme.c b/sound/isa/gus/gusextreme.c index 532c56e35..239f16e6b 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."); -static struct platform_device *devices[SNDRV_CARDS]; +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, - IRQF_DISABLED, + SA_INTERRUPT, NULL)) < 0) goto out; @@ -357,17 +357,13 @@ static int __init alsa_card_gusextreme_init(void) return err; cards = 0; - for (i = 0; i < SNDRV_CARDS; i++) { + for (i = 0; i < SNDRV_CARDS && enable[i]; i++) { struct platform_device *device; - if (! enable[i]) - continue; device = platform_device_register_simple(GUSEXTREME_DRIVER, i, NULL, 0); - if (IS_ERR(device)) - continue; - if (!platform_get_drvdata(device)) { - platform_device_unregister(device); - continue; + if (IS_ERR(device)) { + err = PTR_ERR(device); + goto errout; } devices[i] = device; cards++; @@ -376,10 +372,14 @@ static int __init alsa_card_gusextreme_init(void) #ifdef MODULE printk(KERN_ERR "GUS Extreme soundcard not found or device busy\n"); #endif - snd_gusextreme_unregister_all(); - return -ENODEV; + err = -ENODEV; + goto errout; } return 0; + + errout: + snd_gusextreme_unregister_all(); + return err; } static void __exit alsa_card_gusextreme_exit(void) diff --git a/sound/isa/gus/gusmax.c b/sound/isa/gus/gusmax.c index ac11cae85..d4d2b2a51 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, IRQF_DISABLED, "GUS MAX", (void *)maxcard)) { + if (request_irq(xirq, snd_gusmax_interrupt, SA_INTERRUPT, "GUS MAX", (void *)maxcard)) { snd_printk(KERN_ERR PFX "unable to grab IRQ %d\n", xirq); err = -EBUSY; goto _err; @@ -384,17 +384,13 @@ static int __init alsa_card_gusmax_init(void) return err; cards = 0; - for (i = 0; i < SNDRV_CARDS; i++) { + for (i = 0; i < SNDRV_CARDS && enable[i]; i++) { struct platform_device *device; - if (! enable[i]) - continue; device = platform_device_register_simple(GUSMAX_DRIVER, i, NULL, 0); - if (IS_ERR(device)) - continue; - if (!platform_get_drvdata(device)) { - platform_device_unregister(device); - continue; + if (IS_ERR(device)) { + err = PTR_ERR(device); + goto errout; } devices[i] = device; cards++; @@ -403,10 +399,14 @@ static int __init alsa_card_gusmax_init(void) #ifdef MODULE printk(KERN_ERR "GUS MAX soundcard not found or device busy\n"); #endif - snd_gusmax_unregister_all(); - return -ENODEV; + err = -ENODEV; + goto errout; } return 0; + + errout: + snd_gusmax_unregister_all(); + return err; } static void __exit alsa_card_gusmax_exit(void) diff --git a/sound/isa/gus/interwave.c b/sound/isa/gus/interwave.c index ea69f2550..9838d992b 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]; +static int midi[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 0}; static int pcm_channels[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 2}; -static int effect[SNDRV_CARDS]; +static int effect[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 0}; #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%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: 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: 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, IRQF_DISABLED, + if (request_irq(xirq, snd_interwave_interrupt, SA_INTERRUPT, "InterWave", iwcard)) { snd_printk(KERN_ERR PFX "unable to grab IRQ %d\n", xirq); return -EBUSY; @@ -791,7 +791,7 @@ static int __devinit snd_interwave_probe(struct snd_card *card, int dev) return 0; } -static int __devinit snd_interwave_nonpnp_probe1(int dev, struct platform_device *devptr) +static int __init snd_interwave_nonpnp_probe1(int dev, struct platform_device *devptr) { struct snd_card *card; int err; @@ -809,7 +809,7 @@ static int __devinit snd_interwave_nonpnp_probe1(int dev, struct platform_device return 0; } -static int __devinit snd_interwave_nonpnp_probe(struct platform_device *pdev) +static int __init snd_interwave_nonpnp_probe(struct platform_device *pdev) { int dev = pdev->id; int err; @@ -867,7 +867,6 @@ static struct platform_driver snd_interwave_driver = { }; #ifdef CONFIG_PNP -static unsigned int __devinitdata interwave_pnp_devices; static int __devinit snd_interwave_pnp_detect(struct pnp_card_link *pcard, const struct pnp_card_device_id *pid) @@ -898,7 +897,6 @@ static int __devinit snd_interwave_pnp_detect(struct pnp_card_link *pcard, } pnp_set_card_drvdata(pcard, card); dev++; - interwave_pnp_devices++; return 0; } @@ -937,41 +935,41 @@ static int __init alsa_card_interwave_init(void) if ((err = platform_driver_register(&snd_interwave_driver)) < 0) return err; - for (i = 0; i < SNDRV_CARDS; i++) { + for (i = 0; i < SNDRV_CARDS && enable[i]; i++) { struct platform_device *device; - if (! enable[i]) - continue; #ifdef CONFIG_PNP if (isapnp[i]) continue; #endif device = platform_device_register_simple(INTERWAVE_DRIVER, i, NULL, 0); - if (IS_ERR(device)) - continue; - if (!platform_get_drvdata(device)) { - platform_device_unregister(device); - continue; + if (IS_ERR(device)) { + err = PTR_ERR(device); + goto errout; } platform_devices[i] = device; cards++; } /* ISA PnP cards */ - err = pnp_register_card_driver(&interwave_pnpc_driver); - if (!err) { + i = pnp_register_card_driver(&interwave_pnpc_driver); + if (i >= 0) { pnp_registered = 1; - cards += interwave_pnp_devices;; + cards += i; } if (!cards) { #ifdef MODULE printk(KERN_ERR "InterWave soundcard not found or device busy\n"); #endif - snd_interwave_unregister_all(); - return -ENODEV; + err = -ENODEV; + goto errout; } return 0; + + errout: + snd_interwave_unregister_all(); + return err; } static void __exit alsa_card_interwave_exit(void) diff --git a/sound/isa/opl3sa2.c b/sound/isa/opl3sa2.c index 4031b61b7..9d8431978 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,1,2,3 */ /*SL Added*/ +static int opl3sa3_ymode[SNDRV_CARDS] = { [0 ... (SNDRV_CARDS-1)] = 0 }; /* 0,1,2,3 */ /*SL Added*/ module_param_array(index, int, NULL, 0444); MODULE_PARM_DESC(index, "Index value for OPL3-SA soundcard."); @@ -95,7 +95,6 @@ static struct platform_device *platform_devices[SNDRV_CARDS]; static int pnp_registered; static int pnpc_registered; #endif -static unsigned int snd_opl3sa2_devices; /* control ports */ #define OPL3SA2_PM_CTRL 0x01 @@ -221,7 +220,7 @@ static void snd_opl3sa2_write(struct snd_opl3sa2 *chip, unsigned char reg, unsig spin_unlock_irqrestore(&chip->reg_lock, flags); } -static int __devinit snd_opl3sa2_detect(struct snd_opl3sa2 *chip) +static int __init snd_opl3sa2_detect(struct snd_opl3sa2 *chip) { struct snd_card *card; unsigned long port; @@ -489,7 +488,7 @@ static void snd_opl3sa2_master_free(struct snd_kcontrol *kcontrol) chip->master_volume = NULL; } -static int __devinit snd_opl3sa2_mixer(struct snd_opl3sa2 *chip) +static int __init snd_opl3sa2_mixer(struct snd_opl3sa2 *chip) { struct snd_card *card = chip->card; struct snd_ctl_elem_id id1, id2; @@ -583,8 +582,8 @@ static int snd_opl3sa2_resume(struct snd_card *card) #endif /* CONFIG_PM */ #ifdef CONFIG_PNP -static int __devinit snd_opl3sa2_pnp(int dev, struct snd_opl3sa2 *chip, - struct pnp_dev *pdev) +static int __init snd_opl3sa2_pnp(int dev, struct snd_opl3sa2 *chip, + struct pnp_dev *pdev) { struct pnp_resource_table * cfg; int err; @@ -683,7 +682,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, IRQF_DISABLED, "OPL3-SA2", chip)) { + if (request_irq(xirq, snd_opl3sa2_interrupt, SA_INTERRUPT, "OPL3-SA2", chip)) { snd_printk(KERN_ERR PFX "can't grab IRQ %d\n", xirq); return -ENODEV; } @@ -761,7 +760,6 @@ static int __devinit snd_opl3sa2_pnp_detect(struct pnp_dev *pdev, } pnp_set_drvdata(pdev, card); dev++; - snd_opl3sa2_devices++; return 0; } @@ -828,7 +826,6 @@ static int __devinit snd_opl3sa2_pnp_cdetect(struct pnp_card_link *pcard, } pnp_set_card_drvdata(pcard, card); dev++; - snd_opl3sa2_devices++; return 0; } @@ -862,7 +859,7 @@ static struct pnp_card_driver opl3sa2_pnpc_driver = { }; #endif /* CONFIG_PNP */ -static int __devinit snd_opl3sa2_nonpnp_probe(struct platform_device *pdev) +static int __init snd_opl3sa2_nonpnp_probe(struct platform_device *pdev) { struct snd_card *card; int err; @@ -947,48 +944,52 @@ static void __init_or_module snd_opl3sa2_unregister_all(void) static int __init alsa_card_opl3sa2_init(void) { - int i, err; + int i, err, cards = 0; if ((err = platform_driver_register(&snd_opl3sa2_nonpnp_driver)) < 0) return err; - for (i = 0; i < SNDRV_CARDS; i++) { + for (i = 0; i < SNDRV_CARDS && enable[i]; i++) { struct platform_device *device; - if (! enable[i]) - continue; #ifdef CONFIG_PNP if (isapnp[i]) continue; #endif device = platform_device_register_simple(OPL3SA2_DRIVER, i, NULL, 0); - if (IS_ERR(device)) - continue; - if (!platform_get_drvdata(device)) { - platform_device_unregister(device); - continue; + if (IS_ERR(device)) { + err = PTR_ERR(device); + goto errout; } platform_devices[i] = device; - snd_opl3sa2_devices++; + cards++; } #ifdef CONFIG_PNP err = pnp_register_driver(&opl3sa2_pnp_driver); - if (!err) + if (err >= 0) { pnp_registered = 1; + cards += err; + } err = pnp_register_card_driver(&opl3sa2_pnpc_driver); - if (!err) + if (err >= 0) { pnpc_registered = 1; + cards += err; + } #endif - if (!snd_opl3sa2_devices) { + if (!cards) { #ifdef MODULE snd_printk(KERN_ERR "Yamaha OPL3-SA soundcard not found or device busy\n"); #endif - snd_opl3sa2_unregister_all(); - return -ENODEV; + err = -ENODEV; + goto errout; } return 0; + + errout: + snd_opl3sa2_unregister_all(); + return err; } static void __exit alsa_card_opl3sa2_exit(void) diff --git a/sound/isa/opti9xx/Makefile b/sound/isa/opti9xx/Makefile index 0e41bfd5a..28c64070c 100644 --- a/sound/isa/opti9xx/Makefile +++ b/sound/isa/opti9xx/Makefile @@ -6,10 +6,8 @@ snd-opti92x-ad1848-objs := opti92x-ad1848.o snd-opti92x-cs4231-objs := opti92x-cs4231.o snd-opti93x-objs := opti93x.o -snd-miro-objs := miro.o # Toplevel Module Dependency obj-$(CONFIG_SND_OPTI92X_AD1848) += snd-opti92x-ad1848.o obj-$(CONFIG_SND_OPTI92X_CS4231) += snd-opti92x-cs4231.o obj-$(CONFIG_SND_OPTI93X) += snd-opti93x.o -obj-$(CONFIG_SND_MIRO) += snd-miro.o diff --git a/sound/isa/opti9xx/opti92x-ad1848.c b/sound/isa/opti9xx/opti92x-ad1848.c index 9d528ae00..65b28cbc0 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, IRQF_DISABLED, DRIVER_NAME" - WSS", codec)) { + if (request_irq(chip->irq, snd_opti93x_interrupt, SA_INTERRUPT, 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, IRQF_DISABLED, + chip->mpu_port, 0, chip->mpu_irq, SA_INTERRUPT, &rmidi))) snd_printk(KERN_WARNING "no MPU-401 device at 0x%lx?\n", chip->mpu_port); @@ -2099,11 +2099,8 @@ static int __init alsa_card_opti9xx_init(void) return error; device = platform_device_register_simple(DRIVER_NAME, -1, NULL, 0); if (!IS_ERR(device)) { - if (platform_get_drvdata(device)) { - snd_opti9xx_platform_device = device; - return 0; - } - platform_device_unregister(device); + snd_opti9xx_platform_device = device; + return 0; } platform_driver_unregister(&snd_opti9xx_driver); } diff --git a/sound/isa/sb/emu8000.c b/sound/isa/sb/emu8000.c index 658179e86..c0b8d61b7 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 __devinit +static void __init 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 __devinit +static void __init 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 __devinit +static int __init snd_emu8000_detect(struct snd_emu8000 *emu) { /* Initialise */ @@ -182,7 +182,7 @@ snd_emu8000_detect(struct snd_emu8000 *emu) /* * intiailize audio channels */ -static void __devinit +static void __init init_audio(struct snd_emu8000 *emu) { int ch; @@ -223,7 +223,7 @@ init_audio(struct snd_emu8000 *emu) /* * initialize DMA address */ -static void __devinit +static void __init 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 __devinit +static void __init 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 __devinit +static void __init 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 __devinit +static void __init 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 __devinit +static void __init 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 __devinit +static int __init 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 __devinit +int __init 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 1be16c970..80b1cf84a 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; +static int emu8000_reset_addr = 0; 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/es968.c b/sound/isa/sb/es968.c index d4d65b842..9da80bfa3 100644 --- a/sound/isa/sb/es968.c +++ b/sound/isa/sb/es968.c @@ -124,7 +124,7 @@ static int __devinit snd_card_es968_pnp(int dev, struct snd_card_es968 *acard, return 0; } -static int __devinit snd_card_es968_probe(int dev, +static int __init snd_card_es968_probe(int dev, struct pnp_card_link *pcard, const struct pnp_card_device_id *pid) { @@ -182,8 +182,6 @@ static int __devinit snd_card_es968_probe(int dev, return 0; } -static unsigned int __devinitdata es968_devices; - static int __devinit snd_es968_pnp_detect(struct pnp_card_link *card, const struct pnp_card_device_id *id) { @@ -197,7 +195,6 @@ static int __devinit snd_es968_pnp_detect(struct pnp_card_link *card, if (res < 0) return res; dev++; - es968_devices++; return 0; } return -ENODEV; @@ -249,11 +246,8 @@ static struct pnp_card_driver es968_pnpc_driver = { static int __init alsa_card_es968_init(void) { - int err = pnp_register_card_driver(&es968_pnpc_driver); - if (err) - return err; - - if (!es968_devices) { + int cards = pnp_register_card_driver(&es968_pnpc_driver); + if (cards <= 0) { pnp_unregister_card_driver(&es968_pnpc_driver); #ifdef MODULE snd_printk(KERN_ERR "no ES968 based soundcards found\n"); diff --git a/sound/isa/sb/sb16.c b/sound/isa/sb/sb16.c index d64e67f2b..0667bd14a 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]; +static int csp[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 0}; #endif #ifdef SNDRV_SBAWE_EMU8000 static int seq_ports[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 4}; @@ -327,8 +327,7 @@ 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%llx\n", - (unsigned long long)pnp_port_start(pdev, 0)); + snd_printdd("pnp SB16: wavetable port=0x%lx\n", pnp_port_start(pdev, 0)); } else { __wt_error: if (pdev) { @@ -370,7 +369,7 @@ static struct snd_card *snd_sb16_card_new(int dev) return card; } -static int __devinit snd_sb16_probe(struct snd_card *card, int dev) +static int __init snd_sb16_probe(struct snd_card *card, int dev) { int xirq, xdma8, xdma16; struct snd_sb *chip; @@ -519,7 +518,7 @@ static int snd_sb16_resume(struct snd_card *card) } #endif -static int __devinit snd_sb16_nonpnp_probe1(int dev, struct platform_device *devptr) +static int __init snd_sb16_nonpnp_probe1(int dev, struct platform_device *devptr) { struct snd_card_sb16 *acard; struct snd_card *card; @@ -549,7 +548,7 @@ static int __devinit snd_sb16_nonpnp_probe1(int dev, struct platform_device *dev } -static int __devinit snd_sb16_nonpnp_probe(struct platform_device *pdev) +static int __init snd_sb16_nonpnp_probe(struct platform_device *pdev) { int dev = pdev->id; int err; @@ -630,7 +629,6 @@ static struct platform_driver snd_sb16_nonpnp_driver = { #ifdef CONFIG_PNP -static unsigned int __devinitdata sb16_pnp_devices; static int __devinit snd_sb16_pnp_detect(struct pnp_card_link *pcard, const struct pnp_card_device_id *pid) @@ -653,7 +651,6 @@ static int __devinit snd_sb16_pnp_detect(struct pnp_card_link *pcard, } pnp_set_card_drvdata(pcard, card); dev++; - sb16_pnp_devices++; return 0; } @@ -715,27 +712,25 @@ static int __init alsa_card_sb16_init(void) if ((err = platform_driver_register(&snd_sb16_nonpnp_driver)) < 0) return err; - for (i = 0; i < SNDRV_CARDS; i++) { + for (i = 0; i < SNDRV_CARDS && enable[i]; i++) { struct platform_device *device; - if (! enable[i] || is_isapnp_selected(i)) + if (is_isapnp_selected(i)) continue; device = platform_device_register_simple(SND_SB16_DRIVER, i, NULL, 0); - if (IS_ERR(device)) - continue; - if (!platform_get_drvdata(device)) { - platform_device_unregister(device); - continue; + if (IS_ERR(device)) { + err = PTR_ERR(device); + goto errout; } platform_devices[i] = device; cards++; } #ifdef CONFIG_PNP /* PnP cards at last */ - err = pnp_register_card_driver(&sb16_pnpc_driver); - if (!err) { + i = pnp_register_card_driver(&sb16_pnpc_driver); + if (i >= 0) { pnp_registered = 1; - cards += sb16_pnp_devices; + cards += i; } #endif @@ -748,10 +743,14 @@ static int __init alsa_card_sb16_init(void) snd_printk(KERN_ERR "In case, if you have AWE card, try snd-sbawe module\n"); #endif #endif - snd_sb16_unregister_all(); - return -ENODEV; + err = -ENODEV; + goto errout; } return 0; + + errout: + snd_sb16_unregister_all(); + return err; } static void __exit alsa_card_sb16_exit(void) diff --git a/sound/isa/sb/sb16_csp.c b/sound/isa/sb/sb16_csp.c index fcd638090..9c2b5efba 100644 --- a/sound/isa/sb/sb16_csp.c +++ b/sound/isa/sb/sb16_csp.c @@ -138,7 +138,7 @@ int snd_sb_csp_new(struct snd_sb *chip, int device, struct snd_hwdep ** rhwdep) p->ops.csp_stop = snd_sb_csp_stop; p->ops.csp_qsound_transfer = snd_sb_csp_qsound_transfer; - mutex_init(&p->access_mutex); + init_MUTEX(&p->access_mutex); sprintf(hw->name, "CSP v%d.%d", (version >> 4), (version & 0x0f)); hw->iface = SNDRV_HWDEP_IFACE_SB16CSP; hw->private_data = p; @@ -265,13 +265,13 @@ static int snd_sb_csp_release(struct snd_hwdep * hw, struct file *file) */ static int snd_sb_csp_use(struct snd_sb_csp * p) { - mutex_lock(&p->access_mutex); + down(&p->access_mutex); if (p->used) { - mutex_unlock(&p->access_mutex); + up(&p->access_mutex); return -EAGAIN; } p->used++; - mutex_unlock(&p->access_mutex); + up(&p->access_mutex); return 0; @@ -282,9 +282,9 @@ static int snd_sb_csp_use(struct snd_sb_csp * p) */ static int snd_sb_csp_unuse(struct snd_sb_csp * p) { - mutex_lock(&p->access_mutex); + down(&p->access_mutex); p->used--; - mutex_unlock(&p->access_mutex); + up(&p->access_mutex); return 0; } @@ -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, info_read); + snd_info_set_text_ops(entry, p, 1024, info_read); return 0; } diff --git a/sound/isa/sb/sb8.c b/sound/isa/sb/sb8.c index 141400c01..60ee79cd1 100644 --- a/sound/isa/sb/sb8.c +++ b/sound/isa/sb/sb8.c @@ -258,17 +258,13 @@ static int __init alsa_card_sb8_init(void) return err; cards = 0; - for (i = 0; i < SNDRV_CARDS; i++) { + for (i = 0; i < SNDRV_CARDS && enable[i]; i++) { struct platform_device *device; - if (! enable[i]) - continue; device = platform_device_register_simple(SND_SB8_DRIVER, i, NULL, 0); - if (IS_ERR(device)) - continue; - if (!platform_get_drvdata(device)) { - platform_device_unregister(device); - continue; + if (IS_ERR(device)) { + err = PTR_ERR(device); + goto errout; } devices[i] = device; cards++; @@ -277,10 +273,14 @@ static int __init alsa_card_sb8_init(void) #ifdef MODULE snd_printk(KERN_ERR "Sound Blaster soundcard not found or device busy\n"); #endif - snd_sb8_unregister_all(); - return -ENODEV; + err = -ENODEV; + goto errout; } return 0; + + errout: + snd_sb8_unregister_all(); + return err; } static void __exit alsa_card_sb8_exit(void) diff --git a/sound/isa/sb/sb8_midi.c b/sound/isa/sb/sb8_midi.c index 0b67edd7a..c549aceea 100644 --- a/sound/isa/sb/sb8_midi.c +++ b/sound/isa/sb/sb8_midi.c @@ -32,22 +32,20 @@ #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) - return IRQ_NONE; - - rmidi = chip->rmidi; - if (!rmidi) { + if (chip == NULL || (rmidi = chip->rmidi) == NULL) { 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) { @@ -61,6 +59,10 @@ 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; @@ -250,6 +252,10 @@ 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 f17de2bdd..f343a8211 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 ? - IRQF_DISABLED | IRQF_SHARED : IRQF_DISABLED, + SA_INTERRUPT | SA_SHIRQ : SA_INTERRUPT, "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 8742fa517..0dbbb35b2 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, IRQF_DISABLED, "sgalaxy", NULL)) { + if (request_irq(irq, snd_sgalaxy_dummy_interrupt, SA_INTERRUPT, "sgalaxy", NULL)) { snd_printk(KERN_ERR "sgalaxy: can't grab irq %d\n", irq); return -EIO; } @@ -360,17 +360,13 @@ static int __init alsa_card_sgalaxy_init(void) return err; cards = 0; - for (i = 0; i < SNDRV_CARDS; i++) { + for (i = 0; i < SNDRV_CARDS && enable[i]; i++) { struct platform_device *device; - if (! enable[i]) - continue; device = platform_device_register_simple(SND_SGALAXY_DRIVER, i, NULL, 0); - if (IS_ERR(device)) - continue; - if (!platform_get_drvdata(device)) { - platform_device_unregister(device); - continue; + if (IS_ERR(device)) { + err = PTR_ERR(device); + goto errout; } devices[i] = device; cards++; @@ -379,10 +375,14 @@ static int __init alsa_card_sgalaxy_init(void) #ifdef MODULE snd_printk(KERN_ERR "Sound Galaxy soundcard not found or device busy\n"); #endif - snd_sgalaxy_unregister_all(); - return -ENODEV; + err = -ENODEV; + goto errout; } return 0; + + errout: + snd_sgalaxy_unregister_all(); + return err; } static void __exit alsa_card_sgalaxy_exit(void) diff --git a/sound/isa/sscape.c b/sound/isa/sscape.c index b1f25823c..29bba8cc3 100644 --- a/sound/isa/sscape.c +++ b/sound/isa/sscape.c @@ -897,10 +897,11 @@ 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_INFO_INTEGRATED, - irq, IRQF_DISABLED, + port, MPU401_SHARE_HARDWARE, + irq, SA_INTERRUPT, &rawmidi)) == 0) { struct snd_mpu401 *mpu = (struct snd_mpu401 *) rawmidi->private_data; mpu->open_input = mpu401_open; @@ -1254,7 +1255,7 @@ static int __devinit create_sscape(int dev, struct snd_card **rcardp) } -static int __devinit snd_sscape_probe(struct platform_device *pdev) +static int __init snd_sscape_probe(struct platform_device *pdev) { int dev = pdev->id; struct snd_card *card; @@ -1426,8 +1427,8 @@ static int __init sscape_manual_probe(void) dma[i] == SNDRV_AUTO_DMA) { printk(KERN_INFO "sscape: insufficient parameters, need IO, IRQ, MPU-IRQ and DMA\n"); - sscape_unregister_all(); - return -ENXIO; + ret = -ENXIO; + goto errout; } /* @@ -1435,15 +1436,17 @@ static int __init sscape_manual_probe(void) */ device = platform_device_register_simple(SSCAPE_DRIVER, i, NULL, 0); - if (IS_ERR(device)) - continue; - if (!platform_get_drvdata(device)) { - platform_device_unregister(device); - continue; + if (IS_ERR(device)) { + ret = PTR_ERR(device); + goto errout; } platform_devices[i] = device; } return 0; + + errout: + sscape_unregister_all(); + return ret; } static void sscape_exit(void) @@ -1466,7 +1469,7 @@ static int __init sscape_init(void) if (ret < 0) return ret; #ifdef CONFIG_PNP - if (pnp_register_card_driver(&sscape_pnpc_driver) == 0) + if (pnp_register_card_driver(&sscape_pnpc_driver) >= 0) pnp_registered = 1; #endif return 0; diff --git a/sound/isa/wavefront/wavefront.c b/sound/isa/wavefront/wavefront.c index a8f8d2fa9..fa3ab960d 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]; +static int use_cs4232_midi[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 0}; 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, - IRQF_DISABLED, "ICS2115", acard)) { + SA_INTERRUPT, "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], - IRQF_DISABLED, + SA_INTERRUPT, NULL)) < 0) { snd_printk (KERN_ERR "can't allocate CS4232 MPU-401 device\n"); return err; @@ -589,7 +589,7 @@ snd_wavefront_probe (struct snd_card *card, int dev) return snd_card_register(card); } -static int __devinit snd_wavefront_nonpnp_probe(struct platform_device *pdev) +static int __init snd_wavefront_nonpnp_probe(struct platform_device *pdev) { int dev = pdev->id; struct snd_card *card; @@ -637,7 +637,6 @@ static struct platform_driver snd_wavefront_driver = { #ifdef CONFIG_PNP -static unsigned int __devinitdata wavefront_pnp_devices; static int __devinit snd_wavefront_pnp_detect(struct pnp_card_link *pcard, const struct pnp_card_device_id *pid) @@ -671,7 +670,6 @@ static int __devinit snd_wavefront_pnp_detect(struct pnp_card_link *pcard, pnp_set_card_drvdata(pcard, card); dev++; - wavefront_pnp_devices++; return 0; } @@ -712,31 +710,27 @@ static int __init alsa_card_wavefront_init(void) if ((err = platform_driver_register(&snd_wavefront_driver)) < 0) return err; - for (i = 0; i < SNDRV_CARDS; i++) { + for (i = 0; i < SNDRV_CARDS && enable[i]; i++) { struct platform_device *device; - if (! enable[i]) - continue; #ifdef CONFIG_PNP if (isapnp[i]) continue; #endif device = platform_device_register_simple(WAVEFRONT_DRIVER, i, NULL, 0); - if (IS_ERR(device)) - continue; - if (!platform_get_drvdata(device)) { - platform_device_unregister(device); - continue; + if (IS_ERR(device)) { + err = PTR_ERR(device); + goto errout; } platform_devices[i] = device; cards++; } #ifdef CONFIG_PNP - err = pnp_register_card_driver(&wavefront_pnpc_driver); - if (!err) { + i = pnp_register_card_driver(&wavefront_pnpc_driver); + if (i >= 0) { pnp_registered = 1; - cards += wavefront_pnp_devices; + cards += i; } #endif @@ -744,10 +738,14 @@ static int __init alsa_card_wavefront_init(void) #ifdef MODULE printk (KERN_ERR "No WaveFront cards found or devices busy\n"); #endif - snd_wavefront_unregister_all(); - return -ENODEV; + err = -ENODEV; + goto errout; } return 0; + + errout: + snd_wavefront_unregister_all(); + return err; } static void __exit alsa_card_wavefront_exit(void) diff --git a/sound/isa/wavefront/wavefront_fx.c b/sound/isa/wavefront/wavefront_fx.c index 4f0846feb..180661c5f 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[] __devinitdata = { +static unsigned char page_zero[] __initdata = { 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[] __devinitdata = { 0x1d, 0x02, 0xdf }; -static unsigned char page_one[] __devinitdata = { +static unsigned char page_one[] __initdata = { 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[] __devinitdata = { 0x60, 0x00, 0x1b }; -static unsigned char page_two[] __devinitdata = { +static unsigned char page_two[] __initdata = { 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[] __devinitdata = { 0x46, 0x05, 0x46, 0x07, 0x46, 0x07, 0x44 }; -static unsigned char page_three[] __devinitdata = { +static unsigned char page_three[] __initdata = { 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[] __devinitdata = { 0x02, 0x00, 0x42, 0x00, 0xc0, 0x00, 0x40 }; -static unsigned char page_four[] __devinitdata = { +static unsigned char page_four[] __initdata = { 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[] __devinitdata = { 0x02, 0x62, 0x02, 0x20, 0x01, 0x21, 0x01 }; -static unsigned char page_six[] __devinitdata = { +static unsigned char page_six[] __initdata = { 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[] __devinitdata = { 0x80, 0x00, 0x7e, 0x80, 0x80 }; -static unsigned char page_seven[] __devinitdata = { +static unsigned char page_seven[] __initdata = { 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[] __devinitdata = { 0x00, 0x02, 0x00 }; -static unsigned char page_zero_v2[] __devinitdata = { +static unsigned char page_zero_v2[] __initdata = { 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[] __devinitdata = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; -static unsigned char page_one_v2[] __devinitdata = { +static unsigned char page_one_v2[] __initdata = { 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[] __devinitdata = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; -static unsigned char page_two_v2[] __devinitdata = { +static unsigned char page_two_v2[] __initdata = { 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[] __devinitdata = { +static unsigned char page_three_v2[] __initdata = { 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[] __devinitdata = { +static unsigned char page_four_v2[] __initdata = { 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[] __devinitdata = { 0x00, 0x00, 0x00, 0x00 }; -static unsigned char page_seven_v2[] __devinitdata = { +static unsigned char page_seven_v2[] __initdata = { 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[] __devinitdata = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; -static unsigned char mod_v2[] __devinitdata = { +static unsigned char mod_v2[] __initdata = { 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[] __devinitdata = { 0x02, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x05, 0x02, 0x01, 0x01, 0x06, 0x02, 0x01, 0x01, 0x07, 0x02, 0x01 }; -static unsigned char coefficients[] __devinitdata = { +static unsigned char coefficients[] __initdata = { 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[] __devinitdata = { 0x06, 0x6c, 0x4c, 0x6c, 0x06, 0x50, 0x52, 0xe2, 0x06, 0x42, 0x02, 0xba }; -static unsigned char coefficients2[] __devinitdata = { +static unsigned char coefficients2[] __initdata = { 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[] __devinitdata = { +static unsigned char coefficients3[] __initdata = { 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 __devinit +int __init 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 cb3460094..15888ba21 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 __devinit +int __init 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 bed329edb..68aa091e8 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 __devinit +static int __init snd_wavefront_interrupt_bits (int irq) { @@ -1766,7 +1766,7 @@ snd_wavefront_interrupt_bits (int irq) return bits; } -static void __devinit +static void __init 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 __devinit +static int __init wavefront_reset_to_cleanliness (snd_wavefront_t *dev) { @@ -1946,7 +1946,7 @@ wavefront_reset_to_cleanliness (snd_wavefront_t *dev) #include -static int __devinit +static int __init wavefront_download_firmware (snd_wavefront_t *dev, char *path) { @@ -2047,7 +2047,7 @@ wavefront_download_firmware (snd_wavefront_t *dev, char *path) } -static int __devinit +static int __init wavefront_do_reset (snd_wavefront_t *dev) { @@ -2136,7 +2136,7 @@ wavefront_do_reset (snd_wavefront_t *dev) return 1; } -int __devinit +int __init snd_wavefront_start (snd_wavefront_t *dev) { @@ -2178,7 +2178,7 @@ snd_wavefront_start (snd_wavefront_t *dev) return (0); } -int __devinit +int __init snd_wavefront_detect (snd_wavefront_card_t *card) { diff --git a/sound/mips/au1x00.c b/sound/mips/au1x00.c index c31b38659..6d8f8b3ea 100644 --- a/sound/mips/au1x00.c +++ b/sound/mips/au1x00.c @@ -43,7 +43,6 @@ #include #include #include -#include #include #include #include @@ -154,7 +153,6 @@ au1000_setup_dma_link(struct audio_stream *stream, unsigned int period_bytes, { struct snd_pcm_substream *substream = stream->substream; struct snd_pcm_runtime *runtime = substream->runtime; - struct au1000_period *pointer; unsigned long dma_start; int i; @@ -465,13 +463,13 @@ snd_au1000_pcm_new(struct snd_au1000 *au1000) flags = claim_dma_lock(); if ((au1000->stream[PLAYBACK]->dma = request_au1000_dma(DMA_ID_AC97C_TX, - "AC97 TX", au1000_dma_interrupt, IRQF_DISABLED, + "AC97 TX", au1000_dma_interrupt, SA_INTERRUPT, 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, IRQF_DISABLED, + "AC97 RX", au1000_dma_interrupt, SA_INTERRUPT, au1000->stream[CAPTURE])) < 0){ release_dma_lock(flags); return -EBUSY; @@ -561,13 +559,12 @@ snd_au1000_ac97_new(struct snd_au1000 *au1000) .read = snd_au1000_ac97_read, }; - if ((au1000->ac97_res_port = request_mem_region(CPHYSADDR(AC97C_CONFIG), - 0x100000, "Au1x00 AC97")) == NULL) { + if ((au1000->ac97_res_port = request_region(AC97C_CONFIG, + sizeof(struct au1000_ac97_reg), "Au1x00 AC97")) == NULL) { snd_printk(KERN_ERR "ALSA AC97: can't grap AC97 port\n"); return -EBUSY; } - au1000->ac97_ioport = (struct au1000_ac97_reg *) - KSEG1ADDR(au1000->ac97_res_port->start); + au1000->ac97_ioport = (struct au1000_ac97_reg *) au1000->ac97_res_port->start; spin_lock_init(&au1000->ac97_lock); @@ -613,17 +610,14 @@ snd_au1000_free(struct snd_card *card) release_and_free_resource(au1000->ac97_res_port); } - if (au1000->stream[PLAYBACK]) { - if (au1000->stream[PLAYBACK]->dma >= 0) - free_au1000_dma(au1000->stream[PLAYBACK]->dma); - kfree(au1000->stream[PLAYBACK]); - } + if (au1000->stream[PLAYBACK]->dma >= 0) + free_au1000_dma(au1000->stream[PLAYBACK]->dma); - if (au1000->stream[CAPTURE]) { - if (au1000->stream[CAPTURE]->dma >= 0) - free_au1000_dma(au1000->stream[CAPTURE]->dma); - kfree(au1000->stream[CAPTURE]); - } + if (au1000->stream[CAPTURE]->dma >= 0) + free_au1000_dma(au1000->stream[CAPTURE]->dma); + + kfree(au1000->stream[PLAYBACK]); + kfree(au1000->stream[CAPTURE]); } @@ -642,19 +636,15 @@ au1000_init(void) 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->card = card; + au1000->stream[PLAYBACK]->dma = -1; + au1000->stream[CAPTURE]->dma = -1; au1000->ac97_res_port = NULL; - if (au1000->stream[PLAYBACK]) - au1000->stream[PLAYBACK]->dma = -1; - if (au1000->stream[CAPTURE ]) - au1000->stream[CAPTURE ]->dma = -1; - + au1000->stream[PLAYBACK] = kmalloc(sizeof(struct audio_stream), GFP_KERNEL); + au1000->stream[CAPTURE] = kmalloc(sizeof(struct audio_stream), GFP_KERNEL); if (au1000->stream[PLAYBACK] == NULL || - au1000->stream[CAPTURE ] == NULL) { + au1000->stream[CAPTURE] == NULL) { snd_card_free(card); return -ENOMEM; } diff --git a/sound/oss/Kconfig b/sound/oss/Kconfig index 97e38b665..f69c6d5e3 100644 --- a/sound/oss/Kconfig +++ b/sound/oss/Kconfig @@ -5,23 +5,18 @@ # # Prompt user for primary drivers. -config OSS_OBSOLETE_DRIVER +config OBSOLETE_OSS_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. + have been removed in kernel 2.6.17. If unsure, say N. config SOUND_BT878 tristate "BT878 audio dma" - depends on SOUND_PRIME && PCI + depends on SOUND_PRIME && PCI && OBSOLETE_OSS_DRIVER ---help--- Audio DMA support for bt878 based grabber boards. As you might have already noticed, bt878 is listed with two functions in /proc/pci. @@ -35,9 +30,48 @@ config SOUND_BT878 To compile this driver as a module, choose M here: the module will be called btaudio. +config SOUND_CMPCI + tristate "C-Media PCI (CMI8338/8738)" + depends on SOUND_PRIME && PCI && OBSOLETE_OSS_DRIVER + help + Say Y or M if you have a PCI sound card using the CMI8338 + or the CMI8738 chipset. Data on these chips are available at + . + + A userspace utility to control some internal registers of these + chips is available at + . + +config SOUND_CMPCI_FM + bool "Enable legacy FM" + depends on SOUND_CMPCI && X86 + help + Say Y here to enable the legacy FM (frequency-modulation) synthesizer + support on a card using the CMI8338 or CMI8378 chipset. Even it is + enabled, you need to set fmio as proper value to enable it. + Say N here if you don't need this. + +config SOUND_CMPCI_MIDI + bool "Enable legacy MPU-401" + depends on SOUND_CMPCI && X86 + help + Say Y here to enable the legacy MPU401 MIDI synthesizer support on a + card using the CMI8338 or CMI8378 chipset. Even it is enabled, + you need to set mpuio as proper value to enable it. + Say N here if you don't need this. + +config SOUND_CMPCI_JOYSTICK + bool "Enable joystick" + depends on SOUND_CMPCI && X86 && (GAMEPORT=y || SOUND_CMPCI=GAMEPORT) + help + Say Y here in order to enable the joystick port on a sound card using + the CMI8338 or the CMI8738 chipset. You need to config the + gameport support and set joystick parameter as 1 to use it. + Say N here if you don't need this. + config SOUND_EMU10K1 tristate "Creative SBLive! (EMU10K1)" - depends on SOUND_PRIME && PCI && OSS_OBSOLETE_DRIVER + depends on SOUND_PRIME && PCI && OBSOLETE_OSS_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. @@ -45,7 +79,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 @@ -63,12 +97,19 @@ config MIDI_EMU10K1 config SOUND_FUSION tristate "Crystal SoundFusion (CS4280/461x)" - depends on SOUND_PRIME && PCI && OSS_OBSOLETE_DRIVER + depends on SOUND_PRIME && PCI help This module drives the Crystal SoundFusion devices (CS4280/46xx series) when wired as native sound drivers with AC97 codecs. If this driver does not work try the CS4232 driver. +config SOUND_CS4281 + tristate "Crystal Sound CS4281" + depends on SOUND_PRIME && PCI && OBSOLETE_OSS_DRIVER + help + Picture and feature list at + . + config SOUND_BCM_CS4297A tristate "Crystal Sound CS4297a (for Swarm)" depends on SOUND_PRIME && SIBYTE_SWARM @@ -79,9 +120,22 @@ config SOUND_BCM_CS4297A note that CONFIG_KGDB should not be enabled at the same time, since it also attempts to use this UART port. +config SOUND_ES1370 + tristate "Ensoniq AudioPCI (ES1370)" + depends on SOUND_PRIME && PCI && OBSOLETE_OSS_DRIVER + help + Say Y or M if you have a PCI sound card utilizing the Ensoniq + ES1370 chipset, such as Ensoniq's AudioPCI (non-97). To find + out if your sound card uses an ES1370 without removing your + computer's cover, use lspci -n and look for the PCI ID + 1274:5000. Since Ensoniq was bought by Creative Labs, + Sound Blaster 64/PCI models are either ES1370 or ES1371 based. + This driver differs slightly from OSS/Free, so PLEASE READ + . + config SOUND_ES1371 tristate "Creative Ensoniq AudioPCI 97 (ES1371)" - depends on SOUND_PRIME && PCI + depends on SOUND_PRIME && PCI && OBSOLETE_OSS_DRIVER help Say Y or M if you have a PCI sound card utilizing the Ensoniq ES1371 chipset, such as Ensoniq's AudioPCI97. To find out if @@ -92,6 +146,33 @@ config SOUND_ES1371 slightly from OSS/Free, so PLEASE READ . +config SOUND_ESSSOLO1 + tristate "ESS Technology Solo1" + depends on SOUND_PRIME && PCI && OBSOLETE_OSS_DRIVER + help + Say Y or M if you have a PCI sound card utilizing the ESS Technology + Solo1 chip. To find out if your sound card uses a + Solo1 chip without removing your computer's cover, use + lspci -n and look for the PCI ID 125D:1969. This driver + differs slightly from OSS/Free, so PLEASE READ + . + +config SOUND_MAESTRO + tristate "ESS Maestro, Maestro2, Maestro2E driver" + depends on SOUND_PRIME && PCI && OBSOLETE_OSS_DRIVER + help + Say Y or M if you have a sound system driven by ESS's Maestro line + of PCI sound chips. These include the Maestro 1, Maestro 2, and + Maestro 2E. See for more + details. + +config SOUND_MAESTRO3 + tristate "ESS Maestro3/Allegro driver (EXPERIMENTAL)" + depends on SOUND_PRIME && PCI && EXPERIMENTAL && OBSOLETE_OSS_DRIVER + help + Say Y or M if you have a sound system driven by ESS's Maestro 3 + PCI sound chip. + config SOUND_ICH tristate "Intel ICH (i8xx) audio support" depends on SOUND_PRIME && PCI @@ -99,6 +180,24 @@ config SOUND_ICH Support for integral audio in Intel's I/O Controller Hub (ICH) chipset, as used on the 810/820/840 motherboards. +config SOUND_HARMONY + tristate "PA Harmony audio driver" + depends on GSC_LASI && SOUND_PRIME && OBSOLETE_OSS_DRIVER + help + Say 'Y' or 'M' to include support for Harmony soundchip + on HP 712, 715/new and many other GSC based machines. + +config SOUND_SONICVIBES + tristate "S3 SonicVibes" + depends on SOUND_PRIME && PCI && OBSOLETE_OSS_DRIVER + help + Say Y or M if you have a PCI sound card utilizing the S3 + SonicVibes chipset. To find out if your sound card uses a + SonicVibes chip without removing your computer's cover, use + lspci -n and look for the PCI ID 5333:CA00. This driver + differs slightly from OSS/Free, so PLEASE READ + . + config SOUND_VWSND tristate "SGI Visual Workstation Sound" depends on SOUND_PRIME && X86_VISWS @@ -112,8 +211,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 or Indigo2 system and want to be able to - use its on-board A2 audio system. + 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. config SOUND_IT8172 tristate "IT8172G Sound" @@ -127,10 +226,13 @@ config SOUND_VRC5477 integrated, multi-function controller chip for MIPS CPUs. Works with the AC97 codec. +config SOUND_AU1000 + tristate "Au1000 Sound" + depends on SOUND_PRIME && (SOC_AU1000 || SOC_AU1100 || SOC_AU1500) && OBSOLETE_OSS_DRIVER + config SOUND_AU1550_AC97 - tristate "Au1550/Au1200 AC97 Sound" - select SND_AC97_CODEC - depends on SOUND_PRIME && (SOC_AU1550 || SOC_AU1200) + tristate "Au1550 AC97 Sound" + depends on SOUND_PRIME && SOC_AU1550 config SOUND_TRIDENT tristate "Trident 4DWave DX/NX, SiS 7018 or ALi 5451 PCI Audio Core" @@ -154,7 +256,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). @@ -400,7 +502,7 @@ config MSND_FIFOSIZE config SOUND_VIA82CXXX tristate "VIA 82C686 Audio Codec" - depends on SOUND_PRIME && PCI + depends on SOUND_PRIME && PCI && OBSOLETE_OSS_DRIVER help Say Y here to include support for the audio codec found on VIA 82Cxxx-based chips. Typically these are built into a motherboard. @@ -454,7 +556,7 @@ config SOUND_DMAP config SOUND_AD1816 tristate "AD1816(A) based cards (EXPERIMENTAL)" - depends on EXPERIMENTAL && SOUND_OSS && OSS_OBSOLETE_DRIVER + depends on EXPERIMENTAL && SOUND_OSS help Say M here if you have a sound card based on the Analog Devices AD1816(A) chip. @@ -464,21 +566,33 @@ config SOUND_AD1816 config SOUND_AD1889 tristate "AD1889 based cards (AD1819 codec) (EXPERIMENTAL)" - depends on EXPERIMENTAL && SOUND_OSS && PCI && OSS_OBSOLETE_DRIVER + depends on EXPERIMENTAL && SOUND_OSS && PCI help Say M here if you have a sound card based on the Analog Devices AD1889 chip. +config SOUND_SGALAXY + tristate "Aztech Sound Galaxy (non-PnP) cards" + depends on SOUND_OSS && OBSOLETE_OSS_DRIVER + help + This module initializes the older non Plug and Play sound galaxy + cards from Aztech. It supports the Waverider Pro 32 - 3D and the + Galaxy Washington 16. + + If you compile the driver into the kernel, you have to add + "sgalaxy=,,,," to the kernel command + line. + config SOUND_ADLIB tristate "Adlib Cards" - depends on SOUND_OSS && OSS_OBSOLETE_DRIVER + depends on SOUND_OSS 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 && OSS_OBSOLETE_DRIVER + depends on SOUND_OSS ---help--- ACI (Audio Command Interface) is a protocol used to communicate with the microcontroller on some sound cards produced by miro and @@ -495,7 +609,7 @@ config SOUND_ACI_MIXER config SOUND_CS4232 tristate "Crystal CS4232 based (PnP) cards" - depends on SOUND_OSS + depends on SOUND_OSS && OBSOLETE_OSS_DRIVER help Say Y here if you have a card based on the Crystal CS4232 chip set, which uses its own Plug and Play protocol. @@ -519,6 +633,29 @@ config SOUND_SSCAPE "sscape=,,,," to the kernel command line. +config SOUND_GUS + tristate "Gravis Ultrasound support" + depends on SOUND_OSS && OBSOLETE_OSS_DRIVER + help + Say Y here for any type of Gravis Ultrasound card, including the GUS + or GUS MAX. See also for more + information on configuring this card with modules. + + If you compile the driver into the kernel, you have to add + "gus=,,," to the kernel command line. + +config SOUND_GUS16 + bool "16 bit sampling option of GUS (_NOT_ GUS MAX)" + depends on SOUND_GUS + help + Support for Gravis Ulstrasound (GUS) cards (other than the GUS), + sampling at 16-bit width. + +config SOUND_GUSMAX + bool "GUS MAX support" + depends on SOUND_GUS + help + Support for Gravis Ulstrasound MAX. config SOUND_VMIDI tristate "Loopback MIDI device support" @@ -600,7 +737,7 @@ config SOUND_MPU401 config SOUND_NM256 tristate "NM256AV/NM256ZX audio support" - depends on SOUND_OSS && OSS_OBSOLETE_DRIVER + depends on SOUND_OSS && OBSOLETE_OSS_DRIVER help Say M here to include audio support for the NeoMagic 256AV/256ZX chipsets. These are the audio chipsets found in the Sony @@ -610,6 +747,35 @@ config SOUND_NM256 See for further information. +config SOUND_MAD16 + tristate "OPTi MAD16 and/or Mozart based cards" + depends on SOUND_OSS && OBSOLETE_OSS_DRIVER + ---help--- + Answer Y if your card has a Mozart (OAK OTI-601) or MAD16 (OPTi + 82C928 or 82C929 or 82C931) audio interface chip. These chips are + quite common so it's possible that many no-name cards have one of + them. In addition the MAD16 chip is used in some cards made by known + manufacturers such as Turtle Beach (Tropez), Reveal (some models) + and Diamond (latest ones). Note however that the Tropez sound cards + have their own driver; if you have one of those, say N here and Y or + M to "Full support for Turtle Beach WaveFront", below. + + If you compile the driver into the kernel, you have to add + "mad16=,,,,," to the + kernel command line. + + See also and + for more information on setting + these cards up as modules. + +config MAD16_OLDCARD + bool "Support MIDI in older MAD16 based cards (requires SB)" + depends on SOUND_MAD16 + help + Answer Y (or M) if you have an older card based on the C928 or + Mozart chipset and you want to have MIDI support. If you enable this + option you also need to enable support for Sound Blaster. + config SOUND_PAS tristate "ProAudioSpectrum 16 support" depends on SOUND_OSS @@ -702,9 +868,53 @@ config SOUND_SB You can say M here to compile this driver as a module; the module is called sb. +config SOUND_AWE32_SYNTH + tristate "AWE32 synth" + depends on SOUND_OSS && OBSOLETE_OSS_DRIVER + help + Say Y here if you have a Sound Blaster SB32, AWE32-PnP, SB AWE64 or + similar sound card. See , + and the Soundblaster-AWE + mini-HOWTO, available from + for more info. + +config SOUND_WAVEFRONT + tristate "Full support for Turtle Beach WaveFront (Tropez Plus, Tropez, Maui) synth/soundcards" + depends on SOUND_OSS && m && OBSOLETE_OSS_DRIVER + help + Answer Y or M if you have a Tropez Plus, Tropez or Maui sound card + and read the files and + . + +config SOUND_MAUI + tristate "Limited support for Turtle Beach Wave Front (Maui, Tropez) synthesizers" + depends on SOUND_OSS && OBSOLETE_OSS_DRIVER + help + Say Y here if you have a Turtle Beach Wave Front, Maui, or Tropez + sound card. + + If you compile the driver into the kernel, you have to add + "maui=," to the kernel command line. + +config MAUI_HAVE_BOOT + bool "Have OSWF.MOT firmware file" + depends on SOUND_MAUI=y && !STANDALONE + help + Turtle Beach Maui and Tropez sound cards have a microcontroller + which needs to be initialized prior to use. OSWF.MOT is a file + distributed with the card's DOS/Windows drivers. Answer Y if you + have this file. + +config MAUI_BOOT_FILE + string "Full pathname of OSWF.MOT firmware file" + depends on MAUI_HAVE_BOOT + default "/etc/sound/oswf.mot" + help + Enter the full pathname of your OSWF.MOT file, starting from /. + config SOUND_YM3812 tristate "Yamaha FM synthesizer (YM3812/OPL-3) support" - depends on SOUND_OSS + depends on SOUND_OSS && OBSOLETE_OSS_DRIVER ---help--- Answer Y if your card has a FM chip made by Yamaha (OPL2/OPL3/OPL4). Answering Y is usually a safe and recommended choice, however some @@ -718,9 +928,21 @@ config SOUND_YM3812 If unsure, say Y. +config SOUND_OPL3SA1 + tristate "Yamaha OPL3-SA1 audio controller" + depends on SOUND_OSS && OBSOLETE_OSS_DRIVER + help + Say Y or M if you have a Yamaha OPL3-SA1 sound chip, which is + usually built into motherboards. Read + for details. + + If you compile the driver into the kernel, you have to add + "opl3sa=,,,,," to the kernel + command line. + config SOUND_OPL3SA2 tristate "Yamaha OPL3-SA2 and SA3 based PnP cards" - depends on SOUND_OSS && OSS_OBSOLETE_DRIVER + depends on SOUND_OSS 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 @@ -732,6 +954,19 @@ config SOUND_OPL3SA2 "opl3sa2=,,,,," to the kernel command line. +config SOUND_YMFPCI + tristate "Yamaha YMF7xx PCI audio (native mode)" + depends on SOUND_OSS && PCI && OBSOLETE_OSS_DRIVER + help + Support for Yamaha cards including the YMF711, YMF715, YMF718, + YMF719, YMF724, Waveforce 192XG, and Waveforce 192 Digital. + +config SOUND_YMFPCI_LEGACY + bool "Yamaha PCI legacy ports support" + depends on SOUND_YMFPCI + help + Support for YMF7xx PCI cards emulating an MP401. + config SOUND_UART6850 tristate "6850 UART support" depends on SOUND_OSS @@ -852,7 +1087,7 @@ config SOUND_WAVEARTIST config SOUND_TVMIXER tristate "TV card (bt848) mixer support" - depends on SOUND_PRIME && I2C && VIDEO_V4L1 + depends on SOUND_PRIME && I2C help Support for audio mixer facilities on the BT848 TV frame-grabber card. @@ -861,11 +1096,35 @@ config SOUND_KAHLUA tristate "XpressAudio Sound Blaster emulation" depends on SOUND_SB +config SOUND_ALI5455 + tristate "ALi5455 audio support" + depends on SOUND_PRIME && PCI && OBSOLETE_OSS_DRIVER + +config SOUND_FORTE + tristate "ForteMedia FM801 driver" + depends on SOUND_PRIME && PCI && OBSOLETE_OSS_DRIVER + help + Say Y or M if you want driver support for the ForteMedia FM801 PCI + audio controller (Abit AU10, Genius Sound Maker, HP Workstation + zx2000, and others). + +config SOUND_RME96XX + tristate "RME Hammerfall (RME96XX) support" + depends on SOUND_PRIME && PCI && OBSOLETE_OSS_DRIVER + help + Say Y or M if you have a Hammerfall or Hammerfall light + multichannel card from RME. If you want to access advanced + features of the card, read . + +config SOUND_AD1980 + tristate "AD1980 front/back switch plugin" + depends on SOUND_PRIME && OBSOLETE_OSS_DRIVER + config SOUND_SH_DAC_AUDIO tristate "SuperH DAC audio support" 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/ac97_codec.c b/sound/oss/ac97_codec.c index 972327c97..fd25aca25 100644 --- a/sound/oss/ac97_codec.c +++ b/sound/oss/ac97_codec.c @@ -55,7 +55,7 @@ #include #include #include -#include +#include #define CODEC_ID_BUFSZ 14 @@ -304,7 +304,7 @@ static const unsigned int ac97_oss_rm[] = { static LIST_HEAD(codecs); static LIST_HEAD(codec_drivers); -static DEFINE_MUTEX(codec_mutex); +static DECLARE_MUTEX(codec_sem); /* reads the given OSS mixer from the ac97 the caller must have insured that the ac97 knows about that given mixer, and should be holding a spinlock for the card */ @@ -769,9 +769,9 @@ void ac97_release_codec(struct ac97_codec *codec) { /* Remove from the list first, we don't want to be "rediscovered" */ - mutex_lock(&codec_mutex); + down(&codec_sem); list_del(&codec->list); - mutex_unlock(&codec_mutex); + up(&codec_sem); /* * The driver needs to deal with internal * locking to avoid accidents here. @@ -889,7 +889,7 @@ int ac97_probe_codec(struct ac97_codec *codec) * callbacks. */ - mutex_lock(&codec_mutex); + down(&codec_sem); list_add(&codec->list, &codecs); list_for_each(l, &codec_drivers) { @@ -903,7 +903,7 @@ int ac97_probe_codec(struct ac97_codec *codec) } } - mutex_unlock(&codec_mutex); + up(&codec_sem); return 1; } @@ -1439,7 +1439,7 @@ int ac97_register_driver(struct ac97_driver *driver) struct list_head *l; struct ac97_codec *c; - mutex_lock(&codec_mutex); + down(&codec_sem); INIT_LIST_HEAD(&driver->list); list_add(&driver->list, &codec_drivers); @@ -1452,7 +1452,7 @@ int ac97_register_driver(struct ac97_driver *driver) continue; c->driver = driver; } - mutex_unlock(&codec_mutex); + up(&codec_sem); return 0; } @@ -1471,7 +1471,7 @@ void ac97_unregister_driver(struct ac97_driver *driver) struct list_head *l; struct ac97_codec *c; - mutex_lock(&codec_mutex); + down(&codec_sem); list_del_init(&driver->list); list_for_each(l, &codecs) @@ -1483,7 +1483,7 @@ void ac97_unregister_driver(struct ac97_driver *driver) } } - mutex_unlock(&codec_mutex); + up(&codec_sem); } EXPORT_SYMBOL_GPL(ac97_unregister_driver); @@ -1494,14 +1494,14 @@ static int swap_headphone(int remove_master) struct ac97_codec *c; if (remove_master) { - mutex_lock(&codec_mutex); + down(&codec_sem); list_for_each(l, &codecs) { c = list_entry(l, struct ac97_codec, list); if (supported_mixer(c, SOUND_MIXER_PHONEOUT)) c->supported_mixers &= ~SOUND_MASK_PHONEOUT; } - mutex_unlock(&codec_mutex); + up(&codec_sem); } else ac97_hw[SOUND_MIXER_PHONEOUT].offset = AC97_MASTER_VOL_STEREO; diff --git a/sound/oss/aci.c b/sound/oss/aci.c index 3bfac375d..3928c2802 100644 --- a/sound/oss/aci.c +++ b/sound/oss/aci.c @@ -56,8 +56,7 @@ #include #include #include -#include - +#include #include #include #include "sound_config.h" @@ -80,7 +79,7 @@ static int aci_micpreamp=3; /* microphone preamp-level that can't be * * checked with ACI versions prior to 0xb0 */ static int mixer_device; -static struct mutex aci_mutex; +static struct semaphore aci_sem; #ifdef MODULE static int reset; @@ -213,7 +212,7 @@ int aci_rw_cmd(int write1, int write2, int write3) int write[] = {write1, write2, write3}; int read = -EINTR, i; - if (mutex_lock_interruptible(&aci_mutex)) + if (down_interruptible(&aci_sem)) goto out; for (i=0; i<3; i++) { @@ -228,7 +227,7 @@ int aci_rw_cmd(int write1, int write2, int write3) } read = aci_rawread(); -out_up: mutex_unlock(&aci_mutex); +out_up: up(&aci_sem); out: return read; } @@ -604,7 +603,7 @@ static int __init attach_aci(void) char *boardname; int i, rc = -EBUSY; - mutex_init(&aci_mutex); + init_MUTEX(&aci_sem); outb(0xE3, 0xf8f); /* Write MAD16 password */ aci_port = (inb(0xf90) & 0x10) ? diff --git a/sound/oss/ad1816.c b/sound/oss/ad1816.c index 29057836c..95586de02 100644 --- a/sound/oss/ad1816.c +++ b/sound/oss/ad1816.c @@ -41,6 +41,7 @@ */ +#include #include #include #include diff --git a/sound/oss/ad1848.c b/sound/oss/ad1848.c index 3b45e11e5..49796be95 100644 --- a/sound/oss/ad1848.c +++ b/sound/oss/ad1848.c @@ -41,6 +41,7 @@ * Tested. Believed fully functional. */ +#include #include #include #include @@ -2025,8 +2026,7 @@ int ad1848_init (char *name, struct resource *ports, int irq, int dma_playback, if (irq > 0) { devc->dev_no = my_dev; - if (request_irq(devc->irq, adintr, 0, devc->name, - (void *)(long)my_dev) < 0) + if (request_irq(devc->irq, adintr, 0, devc->name, (void *)my_dev) < 0) { printk(KERN_WARNING "ad1848: Unable to allocate IRQ\n"); /* Don't free it either then.. */ @@ -2175,7 +2175,7 @@ void ad1848_unload(int io_base, int irq, int dma_playback, int dma_capture, int if (!share_dma) { if (devc->irq > 0) /* There is no point in freeing irq, if it wasn't allocated */ - free_irq(devc->irq, (void *)(long)devc->dev_no); + free_irq(devc->irq, (void *)devc->dev_no); sound_free_dma(dma_playback); @@ -2204,7 +2204,7 @@ irqreturn_t adintr(int irq, void *dev_id, struct pt_regs *dummy) unsigned char c930_stat = 0; int cnt = 0; - dev = (long)dev_id; + dev = (int)dev_id; devc = (ad1848_info *) audio_devs[dev]->devc; interrupt_again: /* Jump back here if int status doesn't reset */ @@ -2900,8 +2900,7 @@ static struct pnp_dev *activate_dev(char *devname, char *resname, struct pnp_dev return(dev); } -static struct pnp_dev __init *ad1848_init_generic(struct pnp_card *bus, - struct address_info *hw_config, int slot) +static struct pnp_dev *ad1848_init_generic(struct pnp_card *bus, struct address_info *hw_config, int slot) { /* Configure Audio device */ diff --git a/sound/oss/ad1889.c b/sound/oss/ad1889.c index f56f870b4..a0d73f343 100644 --- a/sound/oss/ad1889.c +++ b/sound/oss/ad1889.c @@ -26,6 +26,7 @@ * * $Id: ad1889.c,v 1.3 2002/10/19 21:31:44 grundler Exp $ */ +#include #include #include #include @@ -37,7 +38,6 @@ #include #include #include -#include #include #include @@ -74,7 +74,7 @@ static inline void ad1889_set_wav_rate(ad1889_dev_t *dev, int rate) DBG("Setting WAV rate to %d\n", rate); dev->state[AD_WAV_STATE].dmabuf.rate = rate; - AD1889_WRITEW(dev, AD_DS_WAS, rate); + AD1889_WRITEW(dev, AD_DSWAS, rate); /* Cycle the DAC to enable the new rate */ ac97_codec->codec_write(dev->ac97_codec, AC97_POWER_CONTROL, 0x0200); @@ -88,14 +88,14 @@ static inline void ad1889_set_wav_fmt(ad1889_dev_t *dev, int fmt) DBG("Setting WAV format to 0x%x\n", fmt); - tmp = AD1889_READW(ad1889_dev, AD_DS_WSMC); + tmp = AD1889_READW(ad1889_dev, AD_DSWSMC); if (fmt & AFMT_S16_LE) { //tmp |= 0x0100; /* set WA16 */ tmp |= 0x0300; /* set WA16 stereo */ } else if (fmt & AFMT_U8) { tmp &= ~0x0100; /* clear WA16 */ } - AD1889_WRITEW(ad1889_dev, AD_DS_WSMC, tmp); + AD1889_WRITEW(ad1889_dev, AD_DSWSMC, tmp); } static inline void ad1889_set_adc_fmt(ad1889_dev_t *dev, int fmt) @@ -104,13 +104,13 @@ static inline void ad1889_set_adc_fmt(ad1889_dev_t *dev, int fmt) DBG("Setting ADC format to 0x%x\n", fmt); - tmp = AD1889_READW(ad1889_dev, AD_DS_RAMC); + tmp = AD1889_READW(ad1889_dev, AD_DSRAMC); if (fmt & AFMT_S16_LE) { tmp |= 0x0100; /* set WA16 */ } else if (fmt & AFMT_U8) { tmp &= ~0x0100; /* clear WA16 */ } - AD1889_WRITEW(ad1889_dev, AD_DS_RAMC, tmp); + AD1889_WRITEW(ad1889_dev, AD_DSRAMC, tmp); } static void ad1889_start_wav(ad1889_state_t *state) @@ -144,21 +144,21 @@ static void ad1889_start_wav(ad1889_state_t *state) dmabuf->rd_ptr, dmabuf->dma_len); /* load up the current register set */ - AD1889_WRITEL(ad1889_dev, AD_DMA_WAVCC, cnt); - AD1889_WRITEL(ad1889_dev, AD_DMA_WAVICC, cnt); - AD1889_WRITEL(ad1889_dev, AD_DMA_WAVCA, dmabuf->dma_handle); + AD1889_WRITEL(ad1889_dev, AD_DMAWAVCC, cnt); + AD1889_WRITEL(ad1889_dev, AD_DMAWAVICC, cnt); + AD1889_WRITEL(ad1889_dev, AD_DMAWAVCA, dmabuf->dma_handle); /* TODO: for now we load the base registers with the same thing */ - AD1889_WRITEL(ad1889_dev, AD_DMA_WAVBC, cnt); - AD1889_WRITEL(ad1889_dev, AD_DMA_WAVIBC, cnt); - AD1889_WRITEL(ad1889_dev, AD_DMA_WAVBA, dmabuf->dma_handle); + AD1889_WRITEL(ad1889_dev, AD_DMAWAVBC, cnt); + AD1889_WRITEL(ad1889_dev, AD_DMAWAVIBC, cnt); + AD1889_WRITEL(ad1889_dev, AD_DMAWAVBA, dmabuf->dma_handle); /* and we're off to the races... */ - AD1889_WRITEL(ad1889_dev, AD_DMA_CHSS, 0x8); - tmp = AD1889_READW(ad1889_dev, AD_DS_WSMC); + AD1889_WRITEL(ad1889_dev, AD_DMACHSS, 0x8); + tmp = AD1889_READW(ad1889_dev, AD_DSWSMC); tmp |= 0x0400; /* set WAEN */ - AD1889_WRITEW(ad1889_dev, AD_DS_WSMC, tmp); - (void) AD1889_READW(ad1889_dev, AD_DS_WSMC); /* flush posted PCI write */ + AD1889_WRITEW(ad1889_dev, AD_DSWSMC, tmp); + (void) AD1889_READW(ad1889_dev, AD_DSWSMC); /* flush posted PCI write */ dmabuf->enable |= DAC_RUNNING; @@ -178,10 +178,10 @@ static void ad1889_stop_wav(ad1889_state_t *state) u16 tmp; unsigned long cnt = dmabuf->dma_len; - tmp = AD1889_READW(ad1889_dev, AD_DS_WSMC); + tmp = AD1889_READW(ad1889_dev, AD_DSWSMC); tmp &= ~0x0400; /* clear WAEN */ - AD1889_WRITEW(ad1889_dev, AD_DS_WSMC, tmp); - (void) AD1889_READW(ad1889_dev, AD_DS_WSMC); /* flush posted PCI write */ + AD1889_WRITEW(ad1889_dev, AD_DSWSMC, tmp); + (void) AD1889_READW(ad1889_dev, AD_DSWSMC); /* flush posted PCI write */ pci_unmap_single(ad1889_dev->pci, dmabuf->dma_handle, cnt, PCI_DMA_TODEVICE); @@ -210,7 +210,7 @@ static void ad1889_startstop_adc(ad1889_state_t *state, int start) spin_lock_irqsave(&state->card->lock, flags); - tmp = AD1889_READW(ad1889_dev, AD_DS_RAMC); + tmp = AD1889_READW(ad1889_dev, AD_DSRAMC); if (start) { state->dmabuf.enable |= ADC_RUNNING; tmp |= 0x0004; /* set ADEN */ @@ -218,7 +218,7 @@ static void ad1889_startstop_adc(ad1889_state_t *state, int start) state->dmabuf.enable &= ~ADC_RUNNING; tmp &= ~0x0004; /* clear ADEN */ } - AD1889_WRITEW(ad1889_dev, AD_DS_RAMC, tmp); + AD1889_WRITEW(ad1889_dev, AD_DSRAMC, tmp); spin_unlock_irqrestore(&state->card->lock, flags); } @@ -238,7 +238,7 @@ static ad1889_dev_t *ad1889_alloc_dev(struct pci_dev *pci) for (i = 0; i < AD_MAX_STATES; i++) { dev->state[i].card = dev; - mutex_init(&dev->state[i].mutex); + init_MUTEX(&dev->state[i].sem); init_waitqueue_head(&dev->state[i].dmabuf.wait); } @@ -300,53 +300,53 @@ static int ad1889_read_proc (char *page, char **start, off_t off, int len, i; ad1889_dev_t *dev = data; ad1889_reg_t regs[] = { - { "WSMC", AD_DS_WSMC, 16 }, - { "RAMC", AD_DS_RAMC, 16 }, - { "WADA", AD_DS_WADA, 16 }, - { "SYDA", AD_DS_SYDA, 16 }, - { "WAS", AD_DS_WAS, 16 }, - { "RES", AD_DS_RES, 16 }, - { "CCS", AD_DS_CCS, 16 }, - { "ADCBA", AD_DMA_ADCBA, 32 }, - { "ADCCA", AD_DMA_ADCCA, 32 }, - { "ADCBC", AD_DMA_ADCBC, 32 }, - { "ADCCC", AD_DMA_ADCCC, 32 }, - { "ADCIBC", AD_DMA_ADCIBC, 32 }, - { "ADCICC", AD_DMA_ADCICC, 32 }, - { "ADCCTRL", AD_DMA_ADCCTRL, 16 }, - { "WAVBA", AD_DMA_WAVBA, 32 }, - { "WAVCA", AD_DMA_WAVCA, 32 }, - { "WAVBC", AD_DMA_WAVBC, 32 }, - { "WAVCC", AD_DMA_WAVCC, 32 }, - { "WAVIBC", AD_DMA_WAVIBC, 32 }, - { "WAVICC", AD_DMA_WAVICC, 32 }, - { "WAVCTRL", AD_DMA_WAVCTRL, 16 }, - { "DISR", AD_DMA_DISR, 32 }, - { "CHSS", AD_DMA_CHSS, 32 }, - { "IPC", AD_GPIO_IPC, 16 }, - { "OP", AD_GPIO_OP, 16 }, - { "IP", AD_GPIO_IP, 16 }, - { "ACIC", AD_AC97_ACIC, 16 }, - { "AC97_RESET", AD_AC97_BASE + AC97_RESET, 16 }, - { "AC97_MASTER_VOL_STEREO", AD_AC97_BASE + AC97_MASTER_VOL_STEREO, 16 }, - { "AC97_HEADPHONE_VOL", AD_AC97_BASE + AC97_HEADPHONE_VOL, 16 }, - { "AC97_MASTER_VOL_MONO", AD_AC97_BASE + AC97_MASTER_VOL_MONO, 16 }, - { "AC97_MASTER_TONE", AD_AC97_BASE + AC97_MASTER_TONE, 16 }, - { "AC97_PCBEEP_VOL", AD_AC97_BASE + AC97_PCBEEP_VOL, 16 }, - { "AC97_PHONE_VOL", AD_AC97_BASE + AC97_PHONE_VOL, 16 }, - { "AC97_MIC_VOL", AD_AC97_BASE + AC97_MIC_VOL, 16 }, - { "AC97_LINEIN_VOL", AD_AC97_BASE + AC97_LINEIN_VOL, 16 }, - { "AC97_CD_VOL", AD_AC97_BASE + AC97_CD_VOL, 16 }, - { "AC97_VIDEO_VOL", AD_AC97_BASE + AC97_VIDEO_VOL, 16 }, - { "AC97_AUX_VOL", AD_AC97_BASE + AC97_AUX_VOL, 16 }, - { "AC97_PCMOUT_VOL", AD_AC97_BASE + AC97_PCMOUT_VOL, 16 }, - { "AC97_RECORD_SELECT", AD_AC97_BASE + AC97_RECORD_SELECT, 16 }, - { "AC97_RECORD_GAIN", AD_AC97_BASE + AC97_RECORD_GAIN, 16 }, - { "AC97_RECORD_GAIN_MIC", AD_AC97_BASE + AC97_RECORD_GAIN_MIC, 16 }, - { "AC97_GENERAL_PURPOSE", AD_AC97_BASE + AC97_GENERAL_PURPOSE, 16 }, - { "AC97_3D_CONTROL", AD_AC97_BASE + AC97_3D_CONTROL, 16 }, - { "AC97_MODEM_RATE", AD_AC97_BASE + AC97_MODEM_RATE, 16 }, - { "AC97_POWER_CONTROL", AD_AC97_BASE + AC97_POWER_CONTROL, 16 }, + { "WSMC", AD_DSWSMC, 16 }, + { "RAMC", AD_DSRAMC, 16 }, + { "WADA", AD_DSWADA, 16 }, + { "SYDA", AD_DSSYDA, 16 }, + { "WAS", AD_DSWAS, 16 }, + { "RES", AD_DSRES, 16 }, + { "CCS", AD_DSCCS, 16 }, + { "ADCBA", AD_DMAADCBA, 32 }, + { "ADCCA", AD_DMAADCCA, 32 }, + { "ADCBC", AD_DMAADCBC, 32 }, + { "ADCCC", AD_DMAADCCC, 32 }, + { "ADCIBC", AD_DMAADCIBC, 32 }, + { "ADCICC", AD_DMAADCICC, 32 }, + { "ADCCTRL", AD_DMAADCCTRL, 16 }, + { "WAVBA", AD_DMAWAVBA, 32 }, + { "WAVCA", AD_DMAWAVCA, 32 }, + { "WAVBC", AD_DMAWAVBC, 32 }, + { "WAVCC", AD_DMAWAVCC, 32 }, + { "WAVIBC", AD_DMAWAVIBC, 32 }, + { "WAVICC", AD_DMAWAVICC, 32 }, + { "WAVCTRL", AD_DMAWAVCTRL, 16 }, + { "DISR", AD_DMADISR, 32 }, + { "CHSS", AD_DMACHSS, 32 }, + { "IPC", AD_GPIOIPC, 16 }, + { "OP", AD_GPIOOP, 16 }, + { "IP", AD_GPIOIP, 16 }, + { "ACIC", AD_ACIC, 16 }, + { "AC97_RESET", 0x100 + AC97_RESET, 16 }, + { "AC97_MASTER_VOL_STEREO", 0x100 + AC97_MASTER_VOL_STEREO, 16 }, + { "AC97_HEADPHONE_VOL", 0x100 + AC97_HEADPHONE_VOL, 16 }, + { "AC97_MASTER_VOL_MONO", 0x100 + AC97_MASTER_VOL_MONO, 16 }, + { "AC97_MASTER_TONE", 0x100 + AC97_MASTER_TONE, 16 }, + { "AC97_PCBEEP_VOL", 0x100 + AC97_PCBEEP_VOL, 16 }, + { "AC97_PHONE_VOL", 0x100 + AC97_PHONE_VOL, 16 }, + { "AC97_MIC_VOL", 0x100 + AC97_MIC_VOL, 16 }, + { "AC97_LINEIN_VOL", 0x100 + AC97_LINEIN_VOL, 16 }, + { "AC97_CD_VOL", 0x100 + AC97_CD_VOL, 16 }, + { "AC97_VIDEO_VOL", 0x100 + AC97_VIDEO_VOL, 16 }, + { "AC97_AUX_VOL", 0x100 + AC97_AUX_VOL, 16 }, + { "AC97_PCMOUT_VOL", 0x100 + AC97_PCMOUT_VOL, 16 }, + { "AC97_RECORD_SELECT", 0x100 + AC97_RECORD_SELECT, 16 }, + { "AC97_RECORD_GAIN", 0x100 + AC97_RECORD_GAIN, 16 }, + { "AC97_RECORD_GAIN_MIC", 0x100 + AC97_RECORD_GAIN_MIC, 16 }, + { "AC97_GENERAL_PURPOSE", 0x100 + AC97_GENERAL_PURPOSE, 16 }, + { "AC97_3D_CONTROL", 0x100 + AC97_3D_CONTROL, 16 }, + { "AC97_MODEM_RATE", 0x100 + AC97_MODEM_RATE, 16 }, + { "AC97_POWER_CONTROL", 0x100 + AC97_POWER_CONTROL, 16 }, { NULL } }; @@ -399,9 +399,9 @@ static inline unsigned long ad1889_get_dma_addr(ad1889_state_t *state) } if (dmabuf->enable & DAC_RUNNING) - offset = le32_to_cpu(AD1889_READL(state->card, AD_DMA_WAVBA)); + offset = le32_to_cpu(AD1889_READL(state->card, AD_DMAWAVBA)); else - offset = le32_to_cpu(AD1889_READL(state->card, AD_DMA_ADCBA)); + offset = le32_to_cpu(AD1889_READL(state->card, AD_DMAADCBA)); return (unsigned long)bus_to_virt((unsigned long)offset) - (unsigned long)dmabuf->rawbuf; } @@ -461,7 +461,7 @@ static ssize_t ad1889_write(struct file *file, const char __user *buffer, size_t ssize_t ret = 0; DECLARE_WAITQUEUE(wait, current); - mutex_lock(&state->mutex); + down(&state->sem); #if 0 if (dmabuf->mapped) { ret = -ENXIO; @@ -546,7 +546,7 @@ static ssize_t ad1889_write(struct file *file, const char __user *buffer, size_t err2: remove_wait_queue(&state->dmabuf.wait, &wait); err1: - mutex_unlock(&state->mutex); + up(&state->sem); return ret; } @@ -638,9 +638,9 @@ static int ad1889_ioctl(struct inode *inode, struct file *file, unsigned int cmd if (val > 5400 && val < 48000) { if (file->f_mode & FMODE_WRITE) - AD1889_WRITEW(ad1889_dev, AD_DS_WAS, val); + AD1889_WRITEW(ad1889_dev, AD_DSWAS, val); if (file->f_mode & FMODE_READ) - AD1889_WRITEW(ad1889_dev, AD_DS_RES, val); + AD1889_WRITEW(ad1889_dev, AD_DSRES, val); } return 0; @@ -648,22 +648,22 @@ static int ad1889_ioctl(struct inode *inode, struct file *file, unsigned int cmd if (get_user(val, p)) return -EFAULT; if (file->f_mode & FMODE_READ) { - val = AD1889_READW(ad1889_dev, AD_DS_WSMC); + val = AD1889_READW(ad1889_dev, AD_DSWSMC); if (val) { val |= 0x0200; /* set WAST */ } else { val &= ~0x0200; /* clear WAST */ } - AD1889_WRITEW(ad1889_dev, AD_DS_WSMC, val); + AD1889_WRITEW(ad1889_dev, AD_DSWSMC, val); } if (file->f_mode & FMODE_WRITE) { - val = AD1889_READW(ad1889_dev, AD_DS_RAMC); + val = AD1889_READW(ad1889_dev, AD_DSRAMC); if (val) { val |= 0x0002; /* set ADST */ } else { val &= ~0x0002; /* clear ADST */ } - AD1889_WRITEW(ad1889_dev, AD_DS_RAMC, val); + AD1889_WRITEW(ad1889_dev, AD_DSRAMC, val); } return 0; @@ -738,7 +738,7 @@ static int ad1889_ioctl(struct inode *inode, struct file *file, unsigned int cmd break; case SOUND_PCM_READ_RATE: - return put_user(AD1889_READW(ad1889_dev, AD_DS_WAS), p); + return put_user(AD1889_READW(ad1889_dev, AD_DSWAS), p); case SOUND_PCM_READ_CHANNELS: case SOUND_PCM_READ_BITS: @@ -768,7 +768,7 @@ static int ad1889_open(struct inode *inode, struct file *file) ad1889_set_wav_rate(ad1889_dev, 48000); ad1889_set_wav_fmt(ad1889_dev, AFMT_S16_LE); - AD1889_WRITEW(ad1889_dev, AD_DS_WADA, 0x0404); /* attenuation */ + AD1889_WRITEW(ad1889_dev, AD_DSWADA, 0x0404); /* attenuation */ return nonseekable_open(inode, file); } @@ -825,15 +825,15 @@ static void ad1889_codec_write(struct ac97_codec *ac97, u8 reg, u16 val) { ad1889_dev_t *dev = ac97->private_data; - //DBG("Writing 0x%x to 0x%lx\n", val, dev->regbase + AD_AC97_BASE + reg); - AD1889_WRITEW(dev, AD_AC97_BASE + reg, val); + //DBG("Writing 0x%x to 0x%lx\n", val, dev->regbase + 0x100 + reg); + AD1889_WRITEW(dev, 0x100 + reg, val); } static u16 ad1889_codec_read(struct ac97_codec *ac97, u8 reg) { ad1889_dev_t *dev = ac97->private_data; - //DBG("Reading from 0x%lx\n", dev->regbase + AD_AC97_BASE + reg); - return AD1889_READW(dev, AD_AC97_BASE + reg); + //DBG("Reading from 0x%lx\n", dev->regbase + 0x100 + reg); + return AD1889_READW(dev, 0x100 + reg); } static int ad1889_ac97_init(ad1889_dev_t *dev, int id) @@ -882,24 +882,24 @@ static int ad1889_aclink_reset(struct pci_dev * pcidev) int retry = 200; ad1889_dev_t *dev = pci_get_drvdata(pcidev); - AD1889_WRITEW(dev, AD_DS_CCS, 0x8000); /* turn on clock */ - AD1889_READW(dev, AD_DS_CCS); + AD1889_WRITEW(dev, AD_DSCCS, 0x8000); /* turn on clock */ + AD1889_READW(dev, AD_DSCCS); WAIT_10MS(); - stat = AD1889_READW(dev, AD_AC97_ACIC); + stat = AD1889_READW(dev, AD_ACIC); stat |= 0x0002; /* Reset Disable */ - AD1889_WRITEW(dev, AD_AC97_ACIC, stat); - (void) AD1889_READW(dev, AD_AC97_ACIC); /* flush posted write */ + AD1889_WRITEW(dev, AD_ACIC, stat); + (void) AD1889_READW(dev, AD_ACIC); /* flush posted write */ udelay(10); - stat = AD1889_READW(dev, AD_AC97_ACIC); + stat = AD1889_READW(dev, AD_ACIC); stat |= 0x0001; /* Interface Enable */ - AD1889_WRITEW(dev, AD_AC97_ACIC, stat); + AD1889_WRITEW(dev, AD_ACIC, stat); do { - if (AD1889_READW(dev, AD_AC97_ACIC) & 0x8000) /* Ready */ + if (AD1889_READW(dev, AD_ACIC) & 0x8000) /* Ready */ break; WAIT_10MS(); retry--; @@ -907,16 +907,16 @@ static int ad1889_aclink_reset(struct pci_dev * pcidev) if (!retry) { printk(KERN_ERR "ad1889_aclink_reset: codec is not ready [0x%x]\n", - AD1889_READW(dev, AD_AC97_ACIC)); + AD1889_READW(dev, AD_ACIC)); return -EBUSY; } /* TODO reset AC97 codec */ /* TODO set wave/adc pci ctrl status */ - stat = AD1889_READW(dev, AD_AC97_ACIC); + stat = AD1889_READW(dev, AD_ACIC); stat |= 0x0004; /* Audio Stream Output Enable */ - AD1889_WRITEW(dev, AD_AC97_ACIC, stat); + AD1889_WRITEW(dev, AD_ACIC, stat); return 0; } @@ -934,10 +934,10 @@ static irqreturn_t ad1889_interrupt(int irq, void *dev_id, struct pt_regs *regs) u32 stat; ad1889_dev_t *dev = (ad1889_dev_t *)dev_id; - stat = AD1889_READL(dev, AD_DMA_DISR); + stat = AD1889_READL(dev, AD_DMADISR); /* clear ISR */ - AD1889_WRITEL(dev, AD_DMA_DISR, stat); + AD1889_WRITEL(dev, AD_DMADISR, stat); if (stat & 0x8) { /* WAVI */ DBG("WAV interrupt\n"); @@ -963,15 +963,15 @@ static void ad1889_initcfg(ad1889_dev_t *dev) u32 tmp32; /* make sure the interrupt bits are setup the way we want */ - tmp32 = AD1889_READL(dev, AD_DMA_WAVCTRL); + tmp32 = AD1889_READL(dev, AD_DMAWAVCTRL); tmp32 &= ~0xff; /* flat dma, no sg, mask out the intr bits */ tmp32 |= 0x6; /* intr on count, loop */ - AD1889_WRITEL(dev, AD_DMA_WAVCTRL, tmp32); + AD1889_WRITEL(dev, AD_DMAWAVCTRL, tmp32); /* unmute... */ - tmp16 = AD1889_READW(dev, AD_DS_WADA); + tmp16 = AD1889_READW(dev, AD_DSWADA); tmp16 &= ~0x8080; - AD1889_WRITEW(dev, AD_DS_WADA, tmp16); + AD1889_WRITEW(dev, AD_DSWADA, tmp16); } static int __devinit ad1889_probe(struct pci_dev *pcidev, const struct pci_device_id *ent) @@ -1004,13 +1004,13 @@ static int __devinit ad1889_probe(struct pci_dev *pcidev, const struct pci_devic goto out1; } - dev->regbase = ioremap_nocache(bar, AD_DS_IOMEMSIZE); + dev->regbase = ioremap_nocache(bar, AD_DSIOMEMSIZE); if (!dev->regbase) { printk(KERN_ERR DEVNAME ": unable to remap iomem\n"); goto out2; } - if (request_irq(pcidev->irq, ad1889_interrupt, IRQF_SHARED, DEVNAME, dev) != 0) { + if (request_irq(pcidev->irq, ad1889_interrupt, SA_SHIRQ, DEVNAME, dev) != 0) { printk(KERN_ERR DEVNAME ": unable to request interrupt\n"); goto out3; } diff --git a/sound/oss/ad1889.h b/sound/oss/ad1889.h index 099137659..e04affce1 100644 --- a/sound/oss/ad1889.h +++ b/sound/oss/ad1889.h @@ -1,58 +1,57 @@ #ifndef _AD1889_H_ #define _AD1889_H_ -#define AD_DS_WSMC 0x00 /* DMA input wave/syn mixer control */ -#define AD_DS_RAMC 0x02 /* DMA output resamp/ADC mixer control */ -#define AD_DS_WADA 0x04 /* DMA input wave attenuation */ -#define AD_DS_SYDA 0x06 /* DMA input syn attentuation */ -#define AD_DS_WAS 0x08 /* wave input sample rate */ -#define AD_DS_RES 0x0a /* resampler output sample rate */ -#define AD_DS_CCS 0x0c /* chip control/status */ - -#define AD_DMA_RESBA 0x40 /* RES base addr */ -#define AD_DMA_RESCA 0x44 /* RES current addr */ -#define AD_DMA_RESBC 0x48 /* RES base cnt */ -#define AD_DMA_RESCC 0x4c /* RES current count */ -#define AD_DMA_ADCBA 0x50 /* ADC */ -#define AD_DMA_ADCCA 0x54 -#define AD_DMA_ADCBC 0x58 -#define AD_DMA_ADCCC 0x5c -#define AD_DMA_SYNBA 0x60 /* SYN */ -#define AD_DMA_SYNCA 0x64 -#define AD_DMA_SYNBC 0x68 -#define AD_DMA_SYNCC 0x6c -#define AD_DMA_WAVBA 0x70 /* WAV */ -#define AD_DMA_WAVCA 0x74 -#define AD_DMA_WAVBC 0x78 -#define AD_DMA_WAVCC 0x7c -#define AD_DMA_RESICC 0x80 /* RES interrupt current count */ -#define AD_DMA_RESIBC 0x84 /* RES interrupt base count */ -#define AD_DMA_ADCICC 0x88 /* ADC interrupt current count */ -#define AD_DMA_ADCIBC 0x8c /* ADC interrupt base count */ -#define AD_DMA_SYNICC 0x90 /* SYN interrupt current count */ -#define AD_DMA_SYNIBC 0x94 /* SYN interrupt base count */ -#define AD_DMA_WAVICC 0x98 /* WAV interrupt current count */ -#define AD_DMA_WAVIBC 0x9c /* WAV interrupt base count */ -#define AD_DMA_RESCTRL 0xa0 /* RES PCI control/status */ -#define AD_DMA_ADCCTRL 0xa8 /* ADC PCI control/status */ -#define AD_DMA_SYNCTRL 0xb0 /* SYN PCI control/status */ -#define AD_DMA_WAVCTRL 0xb8 /* WAV PCI control/status */ -#define AD_DMA_DISR 0xc0 /* PCI DMA intr status */ -#define AD_DMA_CHSS 0xc4 /* PCI DMA channel stop status */ - -#define AD_GPIO_IPC 0xc8 /* IO port ctrl */ -#define AD_GPIO_OP 0xca /* IO output status */ -#define AD_GPIO_IP 0xcc /* IO input status */ +#define AD_DSWSMC 0x00 /* DMA input wave/syn mixer control */ +#define AD_DSRAMC 0x02 /* DMA output resamp/ADC mixer control */ +#define AD_DSWADA 0x04 /* DMA input wave attenuation */ +#define AD_DSSYDA 0x06 /* DMA input syn attentuation */ +#define AD_DSWAS 0x08 /* wave input sample rate */ +#define AD_DSRES 0x0a /* resampler output sample rate */ +#define AD_DSCCS 0x0c /* chip control/status */ + +#define AD_DMARESBA 0x40 /* RES base addr */ +#define AD_DMARESCA 0x44 /* RES current addr */ +#define AD_DMARESBC 0x48 /* RES base cnt */ +#define AD_DMARESCC 0x4c /* RES current count */ +#define AD_DMAADCBA 0x50 /* ADC */ +#define AD_DMAADCCA 0x54 +#define AD_DMAADCBC 0x58 +#define AD_DMAADCCC 0x5c +#define AD_DMASYNBA 0x60 /* SYN */ +#define AD_DMASYNCA 0x64 +#define AD_DMASYNBC 0x68 +#define AD_DMASYNCC 0x6c +#define AD_DMAWAVBA 0x70 /* WAV */ +#define AD_DMAWAVCA 0x74 +#define AD_DMAWAVBC 0x78 +#define AD_DMAWAVCC 0x7c +#define AD_DMARESICC 0x80 /* RES interrupt current count */ +#define AD_DMARESIBC 0x84 /* RES interrupt base count */ +#define AD_DMAADCICC 0x88 /* ADC interrupt current count */ +#define AD_DMAADCIBC 0x8c /* ADC interrupt base count */ +#define AD_DMASYNICC 0x90 /* SYN interrupt current count */ +#define AD_DMASYNIBC 0x94 /* SYN interrupt base count */ +#define AD_DMAWAVICC 0x98 /* WAV interrupt current count */ +#define AD_DMAWAVIBC 0x9c /* WAV interrupt base count */ +#define AD_DMARESCTRL 0xa0 /* RES PCI control/status */ +#define AD_DMAADCCTRL 0xa8 /* ADC PCI control/status */ +#define AD_DMASYNCTRL 0xb0 /* SYN PCI control/status */ +#define AD_DMAWAVCTRL 0xb8 /* WAV PCI control/status */ +#define AD_DMADISR 0xc0 /* PCI DMA intr status */ +#define AD_DMACHSS 0xc4 /* PCI DMA channel stop status */ + +#define AD_GPIOIPC 0xc8 /* IO port ctrl */ +#define AD_GPIOOP 0xca /* IO output status */ +#define AD_GPIOIP 0xcc /* IO input status */ /* AC97 registers, 0x100 - 0x17f; see ac97.h */ -#define AD_AC97_BASE 0x100 /* ac97 base register */ -#define AD_AC97_ACIC 0x180 /* AC Link interface ctrl */ +#define AD_ACIC 0x180 /* AC Link interface ctrl */ /* OPL3; BAR1 */ -#define AD_OPL_M0AS 0x00 /* Music0 address/status */ -#define AD_OPL_M0DATA 0x01 /* Music0 data */ -#define AD_OPL_M1A 0x02 /* Music1 address */ -#define AD_OPL_M1DATA 0x03 /* Music1 data */ +#define AD_OPLM0AS 0x00 /* Music0 address/status */ +#define AD_OPLM0DATA 0x01 /* Music0 data */ +#define AD_OPLM1A 0x02 /* Music1 address */ +#define AD_OPLM1DATA 0x03 /* Music1 data */ /* 0x04-0x0f reserved */ /* MIDI; BAR2 */ @@ -60,9 +59,9 @@ #define AD_MISC 0x01 /* MIDI status/cmd */ /* 0x02-0xff reserved */ -#define AD_DS_IOMEMSIZE 512 -#define AD_OPL_MEMSIZE 16 -#define AD_MIDI_MEMSIZE 16 +#define AD_DSIOMEMSIZE 512 +#define AD_OPLMEMSIZE 16 +#define AD_MIDIMEMSIZE 16 #define AD_WAV_STATE 0 #define AD_ADC_STATE 1 @@ -101,7 +100,7 @@ typedef struct ad1889_state { unsigned int subdivision; } dmabuf; - struct mutex mutex; + struct semaphore sem; } ad1889_state_t; typedef struct ad1889_dev { diff --git a/sound/oss/aedsp16.c b/sound/oss/aedsp16.c index 51e1fde62..b556263a5 100644 --- a/sound/oss/aedsp16.c +++ b/sound/oss/aedsp16.c @@ -23,6 +23,7 @@ * 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 70dcd703a..9c9e6c041 100644 --- a/sound/oss/ali5455.c +++ b/sound/oss/ali5455.c @@ -64,8 +64,6 @@ #include #include #include -#include - #include #ifndef PCI_DEVICE_ID_ALI_5455 @@ -236,7 +234,7 @@ struct ali_state { struct ali_card *card; /* Card info */ /* single open lock mechanism, only used for recording */ - struct mutex open_mutex; + struct semaphore open_sem; wait_queue_head_t open_wait; /* file mode */ @@ -2809,7 +2807,7 @@ found_virt: state->card = card; state->magic = ALI5455_STATE_MAGIC; init_waitqueue_head(&dmabuf->wait); - mutex_init(&state->open_mutex); + init_MUTEX(&state->open_sem); file->private_data = state; dmabuf->trigger = 0; /* allocate hardware channels */ @@ -3361,7 +3359,7 @@ static void __devinit ali_configure_clocking(void) state->card = card; state->magic = ALI5455_STATE_MAGIC; init_waitqueue_head(&dmabuf->wait); - mutex_init(&state->open_mutex); + init_MUTEX(&state->open_sem); dmabuf->fmt = ALI5455_FMT_STEREO | ALI5455_FMT_16BIT; dmabuf->trigger = PCM_ENABLE_OUTPUT; ali_set_dac_rate(state, 48000); @@ -3460,7 +3458,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, IRQF_SHARED, + if (request_irq(card->irq, &ali_interrupt, SA_SHIRQ, 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 e37962314..c407de86c 100644 --- a/sound/oss/au1000.c +++ b/sound/oss/au1000.c @@ -68,8 +68,6 @@ #include #include #include -#include - #include #include #include @@ -100,7 +98,7 @@ /* Boot options */ static int vra = 0; // 0 = no VRA, 1 = use VRA if codec supports it -module_param(vra, bool, 0); +MODULE_PARM(vra, "i"); MODULE_PARM_DESC(vra, "if 1 use VRA if codec supports it"); @@ -122,8 +120,8 @@ struct au1000_state { int no_vra; // do not use VRA spinlock_t lock; - struct mutex open_mutex; - struct mutex sem; + struct semaphore open_sem; + struct semaphore sem; mode_t open_mode; wait_queue_head_t open_wait; @@ -1108,7 +1106,7 @@ static ssize_t au1000_read(struct file *file, char *buffer, count *= db->cnt_factor; - mutex_lock(&s->sem); + down(&s->sem); add_wait_queue(&db->wait, &wait); while (count > 0) { @@ -1127,14 +1125,14 @@ static ssize_t au1000_read(struct file *file, char *buffer, ret = -EAGAIN; goto out; } - mutex_unlock(&s->sem); + up(&s->sem); schedule(); if (signal_pending(current)) { if (!ret) ret = -ERESTARTSYS; goto out2; } - mutex_lock(&s->sem); + down(&s->sem); } } while (avail <= 0); @@ -1161,7 +1159,7 @@ static ssize_t au1000_read(struct file *file, char *buffer, } // while (count > 0) out: - mutex_unlock(&s->sem); + up(&s->sem); out2: remove_wait_queue(&db->wait, &wait); set_current_state(TASK_RUNNING); @@ -1189,7 +1187,7 @@ static ssize_t au1000_write(struct file *file, const char *buffer, count *= db->cnt_factor; - mutex_lock(&s->sem); + down(&s->sem); add_wait_queue(&db->wait, &wait); while (count > 0) { @@ -1206,14 +1204,14 @@ static ssize_t au1000_write(struct file *file, const char *buffer, ret = -EAGAIN; goto out; } - mutex_unlock(&s->sem); + up(&s->sem); schedule(); if (signal_pending(current)) { if (!ret) ret = -ERESTARTSYS; goto out2; } - mutex_lock(&s->sem); + down(&s->sem); } } while (avail <= 0); @@ -1242,7 +1240,7 @@ static ssize_t au1000_write(struct file *file, const char *buffer, } // while (count > 0) out: - mutex_unlock(&s->sem); + up(&s->sem); out2: remove_wait_queue(&db->wait, &wait); set_current_state(TASK_RUNNING); @@ -1300,7 +1298,7 @@ static int au1000_mmap(struct file *file, struct vm_area_struct *vma) dbg("%s", __FUNCTION__); lock_kernel(); - mutex_lock(&s->sem); + down(&s->sem); if (vma->vm_flags & VM_WRITE) db = &s->dma_dac; else if (vma->vm_flags & VM_READ) @@ -1326,7 +1324,7 @@ static int au1000_mmap(struct file *file, struct vm_area_struct *vma) vma->vm_flags &= ~VM_IO; db->mapped = 1; out: - mutex_unlock(&s->sem); + up(&s->sem); unlock_kernel(); return ret; } @@ -1831,21 +1829,21 @@ static int au1000_open(struct inode *inode, struct file *file) file->private_data = s; /* wait for device to become free */ - mutex_lock(&s->open_mutex); + down(&s->open_sem); while (s->open_mode & file->f_mode) { if (file->f_flags & O_NONBLOCK) { - mutex_unlock(&s->open_mutex); + up(&s->open_sem); return -EBUSY; } add_wait_queue(&s->open_wait, &wait); __set_current_state(TASK_INTERRUPTIBLE); - mutex_unlock(&s->open_mutex); + up(&s->open_sem); schedule(); remove_wait_queue(&s->open_wait, &wait); set_current_state(TASK_RUNNING); if (signal_pending(current)) return -ERESTARTSYS; - mutex_lock(&s->open_mutex); + down(&s->open_sem); } stop_dac(s); @@ -1881,8 +1879,8 @@ static int au1000_open(struct inode *inode, struct file *file) } s->open_mode |= file->f_mode & (FMODE_READ | FMODE_WRITE); - mutex_unlock(&s->open_mutex); - mutex_init(&s->sem); + up(&s->open_sem); + init_MUTEX(&s->sem); return nonseekable_open(inode, file); } @@ -1898,7 +1896,7 @@ static int au1000_release(struct inode *inode, struct file *file) lock_kernel(); } - mutex_lock(&s->open_mutex); + down(&s->open_sem); if (file->f_mode & FMODE_WRITE) { stop_dac(s); dealloc_dmabuf(s, &s->dma_dac); @@ -1908,7 +1906,7 @@ static int au1000_release(struct inode *inode, struct file *file) dealloc_dmabuf(s, &s->dma_adc); } s->open_mode &= ((~file->f_mode) & (FMODE_READ|FMODE_WRITE)); - mutex_unlock(&s->open_mutex); + up(&s->open_sem); wake_up(&s->open_wait); unlock_kernel(); return 0; @@ -1998,7 +1996,7 @@ static int __devinit au1000_probe(void) init_waitqueue_head(&s->dma_adc.wait); init_waitqueue_head(&s->dma_dac.wait); init_waitqueue_head(&s->open_wait); - mutex_init(&s->open_mutex); + init_MUTEX(&s->open_sem); spin_lock_init(&s->lock); s->codec.private_data = s; s->codec.id = 0; @@ -2015,14 +2013,14 @@ static int __devinit au1000_probe(void) if ((s->dma_dac.dmanr = request_au1000_dma(DMA_ID_AC97C_TX, "audio DAC", dac_dma_interrupt, - IRQF_DISABLED, s)) < 0) { + SA_INTERRUPT, 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, - IRQF_DISABLED, s)) < 0) { + SA_INTERRUPT, 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 4cdb86252..bdee0502f 100644 --- a/sound/oss/au1550_ac97.c +++ b/sound/oss/au1550_ac97.c @@ -52,14 +52,12 @@ #include #include #include -#include - #include #include #include +#include #include #include -#include #undef OSS_DOCUMENTED_MIXER_SEMANTICS @@ -79,7 +77,7 @@ * 0 = no VRA, 1 = use VRA if codec supports it */ static int vra = 1; -module_param(vra, bool, 0); +MODULE_PARM(vra, "i"); MODULE_PARM_DESC(vra, "if 1 use VRA if codec supports it"); static struct au1550_state { @@ -92,8 +90,8 @@ static struct au1550_state { int no_vra; /* do not use VRA */ spinlock_t lock; - struct mutex open_mutex; - struct mutex sem; + struct semaphore open_sem; + struct semaphore sem; mode_t open_mode; wait_queue_head_t open_wait; @@ -213,8 +211,7 @@ rdcodec(struct ac97_codec *codec, u8 addr) } if (i == POLL_COUNT) { err("rdcodec: read poll expired!"); - data = 0; - goto out; + return 0; } /* wait for command done? @@ -227,8 +224,7 @@ rdcodec(struct ac97_codec *codec, u8 addr) } if (i == POLL_COUNT) { err("rdcodec: read cmdwait expired!"); - data = 0; - goto out; + return 0; } data = au_readl(PSC_AC97CDC) & 0xffff; @@ -239,7 +235,6 @@ 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; @@ -1049,7 +1044,7 @@ au1550_read(struct file *file, char *buffer, size_t count, loff_t *ppos) count *= db->cnt_factor; - mutex_lock(&s->sem); + down(&s->sem); add_wait_queue(&db->wait, &wait); while (count > 0) { @@ -1069,14 +1064,14 @@ au1550_read(struct file *file, char *buffer, size_t count, loff_t *ppos) ret = -EAGAIN; goto out; } - mutex_unlock(&s->sem); + up(&s->sem); schedule(); if (signal_pending(current)) { if (!ret) ret = -ERESTARTSYS; goto out2; } - mutex_lock(&s->sem); + down(&s->sem); } } while (avail <= 0); @@ -1104,7 +1099,7 @@ au1550_read(struct file *file, char *buffer, size_t count, loff_t *ppos) } /* while (count > 0) */ out: - mutex_unlock(&s->sem); + up(&s->sem); out2: remove_wait_queue(&db->wait, &wait); set_current_state(TASK_RUNNING); @@ -1130,7 +1125,7 @@ au1550_write(struct file *file, const char *buffer, size_t count, loff_t * ppos) count *= db->cnt_factor; - mutex_lock(&s->sem); + down(&s->sem); add_wait_queue(&db->wait, &wait); while (count > 0) { @@ -1148,14 +1143,14 @@ au1550_write(struct file *file, const char *buffer, size_t count, loff_t * ppos) ret = -EAGAIN; goto out; } - mutex_unlock(&s->sem); + up(&s->sem); schedule(); if (signal_pending(current)) { if (!ret) ret = -ERESTARTSYS; goto out2; } - mutex_lock(&s->sem); + down(&s->sem); } } while (avail <= 0); @@ -1201,7 +1196,7 @@ au1550_write(struct file *file, const char *buffer, size_t count, loff_t * ppos) } /* while (count > 0) */ out: - mutex_unlock(&s->sem); + up(&s->sem); out2: remove_wait_queue(&db->wait, &wait); set_current_state(TASK_RUNNING); @@ -1258,7 +1253,7 @@ au1550_mmap(struct file *file, struct vm_area_struct *vma) int ret = 0; lock_kernel(); - mutex_lock(&s->sem); + down(&s->sem); if (vma->vm_flags & VM_WRITE) db = &s->dma_dac; else if (vma->vm_flags & VM_READ) @@ -1284,7 +1279,7 @@ au1550_mmap(struct file *file, struct vm_area_struct *vma) vma->vm_flags &= ~VM_IO; db->mapped = 1; out: - mutex_unlock(&s->sem); + up(&s->sem); unlock_kernel(); return ret; } @@ -1795,21 +1790,21 @@ au1550_open(struct inode *inode, struct file *file) file->private_data = s; /* wait for device to become free */ - mutex_lock(&s->open_mutex); + down(&s->open_sem); while (s->open_mode & file->f_mode) { if (file->f_flags & O_NONBLOCK) { - mutex_unlock(&s->open_mutex); + up(&s->open_sem); return -EBUSY; } add_wait_queue(&s->open_wait, &wait); __set_current_state(TASK_INTERRUPTIBLE); - mutex_unlock(&s->open_mutex); + up(&s->open_sem); schedule(); remove_wait_queue(&s->open_wait, &wait); set_current_state(TASK_RUNNING); if (signal_pending(current)) return -ERESTARTSYS; - mutex_lock(&s->open_mutex); + down(&s->open_sem); } stop_dac(s); @@ -1845,8 +1840,8 @@ au1550_open(struct inode *inode, struct file *file) } s->open_mode |= file->f_mode & (FMODE_READ | FMODE_WRITE); - mutex_unlock(&s->open_mutex); - mutex_init(&s->sem); + up(&s->open_sem); + init_MUTEX(&s->sem); return 0; } @@ -1863,7 +1858,7 @@ au1550_release(struct inode *inode, struct file *file) lock_kernel(); } - mutex_lock(&s->open_mutex); + down(&s->open_sem); if (file->f_mode & FMODE_WRITE) { stop_dac(s); kfree(s->dma_dac.rawbuf); @@ -1875,7 +1870,7 @@ au1550_release(struct inode *inode, struct file *file) s->dma_adc.rawbuf = NULL; } s->open_mode &= ((~file->f_mode) & (FMODE_READ|FMODE_WRITE)); - mutex_unlock(&s->open_mutex); + up(&s->open_sem); wake_up(&s->open_wait); unlock_kernel(); return 0; @@ -1895,8 +1890,6 @@ 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) @@ -1909,7 +1902,7 @@ au1550_probe(void) init_waitqueue_head(&s->dma_adc.wait); init_waitqueue_head(&s->dma_dac.wait); init_waitqueue_head(&s->open_wait); - mutex_init(&s->open_mutex); + init_MUTEX(&s->open_sem); spin_lock_init(&s->lock); s->codec = ac97_alloc_codec(); diff --git a/sound/oss/awe_wave.c b/sound/oss/awe_wave.c index d1a0eb294..b3ea719d3 100644 --- a/sound/oss/awe_wave.c +++ b/sound/oss/awe_wave.c @@ -2944,7 +2944,7 @@ alloc_new_info(void) { awe_voice_list *newlist; - newlist = kmalloc(sizeof(*newlist), GFP_KERNEL); + newlist = (awe_voice_list *)kmalloc(sizeof(*newlist), GFP_KERNEL); if (newlist == NULL) { printk(KERN_ERR "AWE32: can't alloc info table\n"); return NULL; @@ -3547,10 +3547,8 @@ awe_load_guspatch(const char __user *addr, int offs, int size, int pmgr_flag) smp->checksum_flag = 0; smp->checksum = 0; - if ((rc = awe_write_wave_data(addr, sizeof_patch, smprec, -1)) < 0) { - kfree(vrec); + if ((rc = awe_write_wave_data(addr, sizeof_patch, smprec, -1)) < 0) return rc; - } sf->mem_ptr += rc; add_sf_sample(sf, smprec); diff --git a/sound/oss/btaudio.c b/sound/oss/btaudio.c index 324a81fd3..4007a5680 100644 --- a/sound/oss/btaudio.c +++ b/sound/oss/btaudio.c @@ -32,8 +32,6 @@ #include #include #include -#include - #include #include @@ -110,7 +108,7 @@ struct btaudio { /* locking */ int users; - struct mutex lock; + struct semaphore lock; /* risc instructions */ unsigned int risc_size; @@ -442,7 +440,7 @@ static struct file_operations btaudio_mixer_fops = { static int btaudio_dsp_open(struct inode *inode, struct file *file, struct btaudio *bta, int analog) { - mutex_lock(&bta->lock); + down(&bta->lock); if (bta->users) goto busy; bta->users++; @@ -454,11 +452,11 @@ static int btaudio_dsp_open(struct inode *inode, struct file *file, bta->read_count = 0; bta->sampleshift = 0; - mutex_unlock(&bta->lock); + up(&bta->lock); return 0; busy: - mutex_unlock(&bta->lock); + up(&bta->lock); return -EBUSY; } @@ -498,11 +496,11 @@ static int btaudio_dsp_release(struct inode *inode, struct file *file) { struct btaudio *bta = file->private_data; - mutex_lock(&bta->lock); + down(&bta->lock); if (bta->recording) stop_recording(bta); bta->users--; - mutex_unlock(&bta->lock); + up(&bta->lock); return 0; } @@ -515,7 +513,7 @@ static ssize_t btaudio_dsp_read(struct file *file, char __user *buffer, DECLARE_WAITQUEUE(wait, current); add_wait_queue(&bta->readq, &wait); - mutex_lock(&bta->lock); + down(&bta->lock); while (swcount > 0) { if (0 == bta->read_count) { if (!bta->recording) { @@ -530,10 +528,10 @@ static ssize_t btaudio_dsp_read(struct file *file, char __user *buffer, ret = -EAGAIN; break; } - mutex_unlock(&bta->lock); + up(&bta->lock); current->state = TASK_INTERRUPTIBLE; schedule(); - mutex_lock(&bta->lock); + down(&bta->lock); if(signal_pending(current)) { if (0 == ret) ret = -EINTR; @@ -606,7 +604,7 @@ static ssize_t btaudio_dsp_read(struct file *file, char __user *buffer, if (bta->read_offset == bta->buf_size) bta->read_offset = 0; } - mutex_unlock(&bta->lock); + up(&bta->lock); remove_wait_queue(&bta->readq, &wait); current->state = TASK_RUNNING; return ret; @@ -653,10 +651,10 @@ static int btaudio_dsp_ioctl(struct inode *inode, struct file *file, bta->decimation = 0; } if (bta->recording) { - mutex_lock(&bta->lock); + down(&bta->lock); stop_recording(bta); start_recording(bta); - mutex_unlock(&bta->lock); + up(&bta->lock); } /* fall through */ case SOUND_PCM_READ_RATE: @@ -718,10 +716,10 @@ static int btaudio_dsp_ioctl(struct inode *inode, struct file *file, else bta->bits = 16; if (bta->recording) { - mutex_lock(&bta->lock); + down(&bta->lock); stop_recording(bta); start_recording(bta); - mutex_unlock(&bta->lock); + up(&bta->lock); } } if (debug) @@ -738,9 +736,9 @@ static int btaudio_dsp_ioctl(struct inode *inode, struct file *file, case SNDCTL_DSP_RESET: if (bta->recording) { - mutex_lock(&bta->lock); + down(&bta->lock); stop_recording(bta); - mutex_unlock(&bta->lock); + up(&bta->lock); } return 0; case SNDCTL_DSP_GETBLKSIZE: @@ -943,7 +941,7 @@ static int __devinit btaudio_probe(struct pci_dev *pci_dev, if (rate) bta->rate = rate; - mutex_init(&bta->lock); + init_MUTEX(&bta->lock); init_waitqueue_head(&bta->readq); if (-1 != latency) { @@ -966,7 +964,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, IRQF_SHARED|IRQF_DISABLED, + if ((rc = request_irq(bta->irq, btaudio_irq, SA_SHIRQ|SA_INTERRUPT, "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 ea51aafaf..7cfbb08db 100644 --- a/sound/oss/cmpci.c +++ b/sound/oss/cmpci.c @@ -138,8 +138,6 @@ #endif #ifdef CONFIG_SOUND_CMPCI_JOYSTICK #include -#include - #endif /* --------------------------------------------------------------------- */ @@ -394,7 +392,7 @@ struct cm_state { unsigned char fmt, enable; spinlock_t lock; - struct mutex open_mutex; + struct semaphore open_sem; mode_t open_mode; wait_queue_head_t open_wait; @@ -1713,7 +1711,7 @@ static int mixer_ioctl(struct cm_state *s, unsigned int cmd, unsigned long arg) case SOUND_MIXER_RECSRC: /* Arg contains a bit for each recording source */ if (get_user(val, p)) return -EFAULT; - i = hweight32(val); + i = generic_hweight32(val); for (j = i = 0; i < SOUND_MIXER_NRDEVICES; i++) { if (!(val & (1 << i))) continue; @@ -2827,21 +2825,21 @@ static int cm_open(struct inode *inode, struct file *file) VALIDATE_STATE(s); file->private_data = s; /* wait for device to become free */ - mutex_lock(&s->open_mutex); + down(&s->open_sem); while (s->open_mode & file->f_mode) { if (file->f_flags & O_NONBLOCK) { - mutex_unlock(&s->open_mutex); + up(&s->open_sem); return -EBUSY; } add_wait_queue(&s->open_wait, &wait); __set_current_state(TASK_INTERRUPTIBLE); - mutex_unlock(&s->open_mutex); + up(&s->open_sem); schedule(); remove_wait_queue(&s->open_wait, &wait); set_current_state(TASK_RUNNING); if (signal_pending(current)) return -ERESTARTSYS; - mutex_lock(&s->open_mutex); + down(&s->open_sem); } if (file->f_mode & FMODE_READ) { s->status &= ~DO_BIGENDIAN_R; @@ -2869,7 +2867,7 @@ static int cm_open(struct inode *inode, struct file *file) } set_fmt(s, fmtm, fmts); s->open_mode |= file->f_mode & (FMODE_READ | FMODE_WRITE); - mutex_unlock(&s->open_mutex); + up(&s->open_sem); return nonseekable_open(inode, file); } @@ -2881,7 +2879,7 @@ static int cm_release(struct inode *inode, struct file *file) lock_kernel(); if (file->f_mode & FMODE_WRITE) drain_dac(s, file->f_flags & O_NONBLOCK); - mutex_lock(&s->open_mutex); + down(&s->open_sem); if (file->f_mode & FMODE_WRITE) { stop_dac(s); @@ -2905,7 +2903,7 @@ static int cm_release(struct inode *inode, struct file *file) s->status &= ~DO_BIGENDIAN_R; } s->open_mode &= ~(file->f_mode & (FMODE_READ|FMODE_WRITE)); - mutex_unlock(&s->open_mutex); + up(&s->open_sem); wake_up(&s->open_wait); unlock_kernel(); return 0; @@ -3082,7 +3080,7 @@ static int __devinit cm_probe(struct pci_dev *pcidev, const struct pci_device_id init_waitqueue_head(&s->dma_adc.wait); init_waitqueue_head(&s->dma_dac.wait); init_waitqueue_head(&s->open_wait); - mutex_init(&s->open_mutex); + init_MUTEX(&s->open_sem); spin_lock_init(&s->lock); s->magic = CM_MAGIC; s->dev = pcidev; @@ -3122,7 +3120,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, IRQF_SHARED, "cmpci", s))) { + if ((ret = request_irq(s->irq, cm_interrupt, SA_SHIRQ, "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 b6924c7f1..7c59e2d40 100644 --- a/sound/oss/cs4232.c +++ b/sound/oss/cs4232.c @@ -47,6 +47,7 @@ * Marcus Meissner Added ISA PnP support. */ +#include #include #include #include @@ -359,8 +360,6 @@ static int __initdata synthio = -1; static int __initdata synthirq = -1; static int __initdata isapnp = 1; -static unsigned int cs4232_devices; - MODULE_DESCRIPTION("CS4232 based soundcard driver"); MODULE_AUTHOR("Hannu Savolainen, Paul Barton-Davis"); MODULE_LICENSE("GPL"); @@ -404,7 +403,7 @@ static const struct pnp_device_id cs4232_pnp_table[] = { MODULE_DEVICE_TABLE(pnp, cs4232_pnp_table); -static int __init cs4232_pnp_probe(struct pnp_dev *dev, const struct pnp_device_id *dev_id) +static int cs4232_pnp_probe(struct pnp_dev *dev, const struct pnp_device_id *dev_id) { struct address_info *isapnpcfg; @@ -422,7 +421,6 @@ static int __init cs4232_pnp_probe(struct pnp_dev *dev, const struct pnp_device_ return -ENODEV; } pnp_set_drvdata(dev,isapnpcfg); - cs4232_devices++; return 0; } @@ -457,11 +455,10 @@ static int __init init_cs4232(void) #endif cfg.irq = -1; - if (isapnp) { - pnp_register_driver(&cs4232_driver); - if (cs4232_devices) - return 0; - } + if (isapnp && + (pnp_register_driver(&cs4232_driver) > 0) + ) + return 0; if(io==-1||irq==-1||dma==-1) { @@ -506,8 +503,7 @@ static int __init setup_cs4232(char *str) int ints[7]; /* If we have isapnp cards, no need for options */ - pnp_register_driver(&cs4232_driver); - if (cs4232_devices) + if (pnp_register_driver(&cs4232_driver) > 0) return 1; str = get_options(str, ARRAY_SIZE(ints), ints); diff --git a/sound/oss/cs4281/cs4281m.c b/sound/oss/cs4281/cs4281m.c index 0400a416d..0720365f6 100644 --- a/sound/oss/cs4281/cs4281m.c +++ b/sound/oss/cs4281/cs4281m.c @@ -245,9 +245,9 @@ struct cs4281_state { void *tmpbuff; // tmp buffer for sample conversions unsigned ena; spinlock_t lock; - struct mutex open_sem; - struct mutex open_sem_adc; - struct mutex open_sem_dac; + struct semaphore open_sem; + struct semaphore open_sem_adc; + struct semaphore open_sem_dac; mode_t open_mode; wait_queue_head_t open_wait; wait_queue_head_t open_wait_adc; @@ -3598,20 +3598,20 @@ static int cs4281_release(struct inode *inode, struct file *file) if (file->f_mode & FMODE_WRITE) { drain_dac(s, file->f_flags & O_NONBLOCK); - mutex_lock(&s->open_sem_dac); + down(&s->open_sem_dac); stop_dac(s); dealloc_dmabuf(s, &s->dma_dac); s->open_mode &= ~FMODE_WRITE; - mutex_unlock(&s->open_sem_dac); + up(&s->open_sem_dac); wake_up(&s->open_wait_dac); } if (file->f_mode & FMODE_READ) { drain_adc(s, file->f_flags & O_NONBLOCK); - mutex_lock(&s->open_sem_adc); + down(&s->open_sem_adc); stop_adc(s); dealloc_dmabuf(s, &s->dma_adc); s->open_mode &= ~FMODE_READ; - mutex_unlock(&s->open_sem_adc); + up(&s->open_sem_adc); wake_up(&s->open_wait_adc); } return 0; @@ -3651,33 +3651,33 @@ static int cs4281_open(struct inode *inode, struct file *file) return -ENODEV; } if (file->f_mode & FMODE_WRITE) { - mutex_lock(&s->open_sem_dac); + down(&s->open_sem_dac); while (s->open_mode & FMODE_WRITE) { if (file->f_flags & O_NONBLOCK) { - mutex_unlock(&s->open_sem_dac); + up(&s->open_sem_dac); return -EBUSY; } - mutex_unlock(&s->open_sem_dac); + up(&s->open_sem_dac); interruptible_sleep_on(&s->open_wait_dac); if (signal_pending(current)) return -ERESTARTSYS; - mutex_lock(&s->open_sem_dac); + down(&s->open_sem_dac); } } if (file->f_mode & FMODE_READ) { - mutex_lock(&s->open_sem_adc); + down(&s->open_sem_adc); while (s->open_mode & FMODE_READ) { if (file->f_flags & O_NONBLOCK) { - mutex_unlock(&s->open_sem_adc); + up(&s->open_sem_adc); return -EBUSY; } - mutex_unlock(&s->open_sem_adc); + up(&s->open_sem_adc); interruptible_sleep_on(&s->open_wait_adc); if (signal_pending(current)) return -ERESTARTSYS; - mutex_lock(&s->open_sem_adc); + down(&s->open_sem_adc); } } s->open_mode |= file->f_mode & (FMODE_READ | FMODE_WRITE); @@ -3691,7 +3691,7 @@ static int cs4281_open(struct inode *inode, struct file *file) s->ena &= ~FMODE_READ; s->dma_adc.ossfragshift = s->dma_adc.ossmaxfrags = s->dma_adc.subdivision = 0; - mutex_unlock(&s->open_sem_adc); + up(&s->open_sem_adc); if (prog_dmabuf_adc(s)) { CS_DBGOUT(CS_OPEN | CS_ERROR, 2, printk(KERN_ERR @@ -3711,7 +3711,7 @@ static int cs4281_open(struct inode *inode, struct file *file) s->ena &= ~FMODE_WRITE; s->dma_dac.ossfragshift = s->dma_dac.ossmaxfrags = s->dma_dac.subdivision = 0; - mutex_unlock(&s->open_sem_dac); + up(&s->open_sem_dac); if (prog_dmabuf_dac(s)) { CS_DBGOUT(CS_OPEN | CS_ERROR, 2, printk(KERN_ERR @@ -3978,17 +3978,17 @@ static int cs4281_midi_open(struct inode *inode, struct file *file) VALIDATE_STATE(s); file->private_data = s; // wait for device to become free - mutex_lock(&s->open_sem); + down(&s->open_sem); while (s->open_mode & (file->f_mode << FMODE_MIDI_SHIFT)) { if (file->f_flags & O_NONBLOCK) { - mutex_unlock(&s->open_sem); + up(&s->open_sem); return -EBUSY; } - mutex_unlock(&s->open_sem); + up(&s->open_sem); interruptible_sleep_on(&s->open_wait); if (signal_pending(current)) return -ERESTARTSYS; - mutex_lock(&s->open_sem); + down(&s->open_sem); } spin_lock_irqsave(&s->lock, flags); if (!(s->open_mode & (FMODE_MIDI_READ | FMODE_MIDI_WRITE))) { @@ -4018,7 +4018,7 @@ static int cs4281_midi_open(struct inode *inode, struct file *file) (file-> f_mode << FMODE_MIDI_SHIFT) & (FMODE_MIDI_READ | FMODE_MIDI_WRITE); - mutex_unlock(&s->open_sem); + up(&s->open_sem); return nonseekable_open(inode, file); } @@ -4057,7 +4057,7 @@ static int cs4281_midi_release(struct inode *inode, struct file *file) remove_wait_queue(&s->midi.owait, &wait); current->state = TASK_RUNNING; } - mutex_lock(&s->open_sem); + down(&s->open_sem); s->open_mode &= (~(file->f_mode << FMODE_MIDI_SHIFT)) & (FMODE_MIDI_READ | FMODE_MIDI_WRITE); @@ -4067,7 +4067,7 @@ static int cs4281_midi_release(struct inode *inode, struct file *file) del_timer(&s->midi.timer); } spin_unlock_irqrestore(&s->lock, flags); - mutex_unlock(&s->open_sem); + up(&s->open_sem); wake_up(&s->open_wait); return 0; } @@ -4300,9 +4300,9 @@ static int __devinit cs4281_probe(struct pci_dev *pcidev, init_waitqueue_head(&s->open_wait_dac); init_waitqueue_head(&s->midi.iwait); init_waitqueue_head(&s->midi.owait); - mutex_init(&s->open_sem); - mutex_init(&s->open_sem_adc); - mutex_init(&s->open_sem_dac); + init_MUTEX(&s->open_sem); + init_MUTEX(&s->open_sem_adc); + init_MUTEX(&s->open_sem_dac); spin_lock_init(&s->lock); s->pBA0phys = pci_resource_start(pcidev, 0); s->pBA1phys = pci_resource_start(pcidev, 1); @@ -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, IRQF_SHARED, "Crystal CS4281", s)) { + (s->irq, cs4281_interrupt, SA_SHIRQ, "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 5195bf933..58e25c82e 100644 --- a/sound/oss/cs46xx.c +++ b/sound/oss/cs46xx.c @@ -90,7 +90,6 @@ #include #include #include -#include #include #include @@ -147,7 +146,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 +174,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 +199,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 @@ -239,7 +238,7 @@ struct cs_state { struct cs_card *card; /* Card info */ /* single open lock mechanism, only used for recording */ - struct mutex open_mutex; + struct semaphore open_sem; wait_queue_head_t open_wait; /* file mode */ @@ -298,7 +297,7 @@ struct cs_state { unsigned subdivision; } dmabuf; /* Guard against mmap/write/read races */ - struct mutex sem; + struct semaphore sem; }; struct cs_card { @@ -319,7 +318,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 */ @@ -376,7 +375,7 @@ struct cs_card { unsigned char ibuf[CS_MIDIINBUF]; unsigned char obuf[CS_MIDIOUTBUF]; mode_t open_mode; - struct mutex open_mutex; + struct semaphore open_sem; } midi; struct cs46xx_pm pm; }; @@ -384,7 +383,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,7 +422,8 @@ 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; @@ -520,6 +520,7 @@ 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; @@ -541,8 +542,10 @@ 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; @@ -575,11 +578,14 @@ 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; } @@ -594,22 +600,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); } @@ -618,26 +624,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; } /* @@ -648,15 +654,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 @@ -673,12 +679,13 @@ 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 */ @@ -695,7 +702,9 @@ 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); @@ -747,6 +756,7 @@ 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)); @@ -759,7 +769,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; @@ -804,6 +814,7 @@ 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; @@ -879,7 +890,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; @@ -887,14 +898,16 @@ 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); @@ -905,6 +918,7 @@ 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 @@ -929,7 +943,8 @@ static void SetCaptureSPValues(struct cs_card *card) { unsigned i, offset; CS_DBGOUT(CS_FUNCTION, 8, printk("cs46xx: SetCaptureSPValues()+\n") ); - for (i = 0; i < sizeof(InitArray) / sizeof(struct InitStruct); i++) { + 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); /* @@ -978,11 +993,14 @@ 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; @@ -996,7 +1014,8 @@ 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; @@ -1129,13 +1148,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) { @@ -1161,7 +1180,8 @@ 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; @@ -1237,7 +1257,8 @@ 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. @@ -1291,7 +1312,9 @@ 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 */ @@ -1313,7 +1336,8 @@ 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)); @@ -1328,14 +1352,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; @@ -1343,17 +1367,18 @@ 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; @@ -1365,8 +1390,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); @@ -1390,7 +1415,9 @@ 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)); } @@ -1401,9 +1428,9 @@ static int prog_dmabuf(struct cs_state *state) { int ret; - mutex_lock(&state->sem); + down(&state->sem); ret = __prog_dmabuf(state); - mutex_unlock(&state->sem); + up(&state->sem); return ret; } @@ -1461,7 +1488,8 @@ 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. @@ -1485,7 +1513,8 @@ 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 */ @@ -1501,10 +1530,12 @@ 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); } @@ -1515,7 +1546,8 @@ 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) { @@ -1537,7 +1569,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; @@ -1545,10 +1577,13 @@ 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); @@ -1566,12 +1601,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); } } @@ -1625,7 +1660,8 @@ 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.. */ @@ -1634,14 +1670,15 @@ 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 */ @@ -1656,7 +1693,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 = file->private_data; + struct cs_card *card = (struct cs_card *)file->private_data; ssize_t ret; unsigned long flags; unsigned ptr; @@ -1699,7 +1736,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 = file->private_data; + struct cs_card *card = (struct cs_card *)file->private_data; ssize_t ret; unsigned long flags; unsigned ptr; @@ -1747,7 +1784,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 = file->private_data; + struct cs_card *card = (struct cs_card *)file->private_data; unsigned long flags; unsigned int mask = 0; @@ -1772,11 +1809,12 @@ 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; @@ -1784,7 +1822,8 @@ 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; @@ -1792,17 +1831,17 @@ static int cs_midi_open(struct inode *inode, struct file *file) file->private_data = card; /* wait for device to become free */ - mutex_lock(&card->midi.open_mutex); + down(&card->midi.open_sem); while (card->midi.open_mode & file->f_mode) { if (file->f_flags & O_NONBLOCK) { - mutex_unlock(&card->midi.open_mutex); + up(&card->midi.open_sem); return -EBUSY; } - mutex_unlock(&card->midi.open_mutex); + up(&card->midi.open_sem); interruptible_sleep_on(&card->midi.open_wait); if (signal_pending(current)) return -ERESTARTSYS; - mutex_lock(&card->midi.open_mutex); + down(&card->midi.open_sem); } spin_lock_irqsave(&card->midi.lock, flags); if (!(card->midi.open_mode & (FMODE_READ | FMODE_WRITE))) { @@ -1812,20 +1851,22 @@ 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); + up(&card->midi.open_sem); return 0; } static int cs_midi_release(struct inode *inode, struct file *file) { - struct cs_card *card = file->private_data; + struct cs_card *card = (struct cs_card *)file->private_data; DECLARE_WAITQUEUE(wait, current); unsigned long flags; unsigned count, tmo; @@ -1850,9 +1891,9 @@ static int cs_midi_release(struct inode *inode, struct file *file) remove_wait_queue(&card->midi.owait, &wait); current->state = TASK_RUNNING; } - mutex_lock(&card->midi.open_mutex); + down(&card->midi.open_sem); card->midi.open_mode &= (~(file->f_mode & (FMODE_READ | FMODE_WRITE))); - mutex_unlock(&card->midi.open_mutex); + up(&card->midi.open_sem); wake_up(&card->midi.open_wait); return 0; } @@ -1891,10 +1932,11 @@ 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 @@ -1904,29 +1946,34 @@ 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; @@ -1935,15 +1982,17 @@ 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; } } @@ -1970,15 +2019,20 @@ 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; } @@ -1987,16 +2041,17 @@ 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; } @@ -2004,7 +2059,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 = file->private_data; + struct cs_card *card = (struct cs_card *) file->private_data; struct cs_state *state; DECLARE_WAITQUEUE(wait, current); struct dmabuf *dmabuf; @@ -2012,12 +2067,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 = card->states[0]; - if (!state) + state = (struct cs_state *)card->states[0]; + if(!state) return -ENODEV; dmabuf = &state->dmabuf; @@ -2026,17 +2081,17 @@ static ssize_t cs_read(struct file *file, char __user *buffer, size_t count, lof if (!access_ok(VERIFY_WRITE, buffer, count)) return -EFAULT; - mutex_lock(&state->sem); + down(&state->sem); if (!dmabuf->ready && (ret = __prog_dmabuf(state))) goto out2; add_wait_queue(&state->dmabuf.wait, &wait); while (count > 0) { - while (!(card->pm.flags & CS46XX_PM_IDLE)) { + while(!(card->pm.flags & CS46XX_PM_IDLE)) + { schedule(); if (signal_pending(current)) { - if (!ret) - ret = -ERESTARTSYS; + if(!ret) ret = -ERESTARTSYS; goto out; } } @@ -2056,20 +2111,19 @@ 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); + up(&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) + down(&state->sem); + if (dmabuf->mapped) + { + if(!ret) ret = -ENXIO; goto out; } @@ -2080,12 +2134,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; @@ -2101,7 +2155,7 @@ static ssize_t cs_read(struct file *file, char __user *buffer, size_t count, lof out: remove_wait_queue(&state->dmabuf.wait, &wait); out2: - mutex_unlock(&state->sem); + up(&state->sem); set_current_state(TASK_RUNNING); CS_DBGOUT(CS_WAVE_READ | CS_FUNCTION, 4, printk("cs46xx: cs_read()- %zd\n",ret) ); @@ -2112,7 +2166,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 = file->private_data; + struct cs_card *card = (struct cs_card *) file->private_data; struct cs_state *state; DECLARE_WAITQUEUE(wait, current); struct dmabuf *dmabuf; @@ -2123,15 +2177,16 @@ 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 = card->states[1]; - if (!state) + state = (struct cs_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) { + down(&state->sem); + if (dmabuf->mapped) + { ret = -ENXIO; goto out; } @@ -2145,11 +2200,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; } } @@ -2160,7 +2215,8 @@ 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; @@ -2181,35 +2237,34 @@ 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); + up(&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) + down(&state->sem); + if (dmabuf->mapped) + { + if(!ret) ret = -ENXIO; goto out; } continue; } if (copy_from_user(dmabuf->rawbuf + swptr, buffer, cnt)) { - if (!ret) - ret = -EFAULT; + 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; @@ -2223,37 +2278,43 @@ static ssize_t cs_write(struct file *file, const char __user *buffer, size_t cou start_dac(state); } out: - mutex_unlock(&state->sem); + up(&state->sem); remove_wait_queue(&state->dmabuf.wait, &wait); set_current_state(TASK_RUNNING); CS_DBGOUT(CS_WAVE_WRITE | CS_FUNCTION, 2, - printk("cs46xx: cs_write()- ret=%zd\n", ret)); + printk("cs46xx: cs_write()- ret=%zd\n", ret) ); return ret; } static unsigned int cs_poll(struct file *file, struct poll_table_struct *wait) { - struct cs_card *card = file->private_data; + struct cs_card *card = (struct cs_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); } @@ -2263,7 +2324,8 @@ 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; @@ -2271,7 +2333,8 @@ 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) @@ -2300,7 +2363,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 = file->private_data; + struct cs_card *card = (struct cs_card *)file->private_data; struct cs_state *state; struct dmabuf *dmabuf; int ret = 0; @@ -2312,7 +2375,8 @@ 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) @@ -2320,7 +2384,8 @@ 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) @@ -2346,9 +2411,10 @@ static int cs_mmap(struct file *file, struct vm_area_struct *vma) goto out; } - mutex_lock(&state->sem); + down(&state->sem); dmabuf = &state->dmabuf; - if (cs4x_pgoff(vma) != 0) { + if (cs4x_pgoff(vma) != 0) + { ret = -EINVAL; goto out; } @@ -2356,13 +2422,15 @@ 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; } @@ -2370,30 +2438,31 @@ static int cs_mmap(struct file *file, struct vm_area_struct *vma) CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: cs_mmap()-\n") ); out: - mutex_unlock(&state->sem); + up(&state->sem); return ret; } static int cs_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) { - struct cs_card *card = file->private_data; + struct cs_card *card = (struct cs_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, ret; - int mapped = 0; + int val, valsave, mapped, ret; void __user *argp = (void __user *)arg; int __user *p = argp; - state = card->states[0]; - if (state) { + state = (struct cs_state *)card->states[0]; + if(state) + { dmabuf = &state->dmabuf; mapped = (file->f_mode & FMODE_READ) && dmabuf->mapped; } - state = card->states[1]; - if (state) { + state = (struct cs_state *)card->states[1]; + if(state) + { dmabuf = &state->dmabuf; mapped |= (file->f_mode & FMODE_WRITE) && dmabuf->mapped; } @@ -2402,14 +2471,17 @@ 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 = card->states[1]; - if (state) { + state = (struct cs_state *)card->states[1]; + if(state) + { dmabuf = &state->dmabuf; stop_dac(state); synchronize_irq(card->irq); @@ -2422,8 +2494,9 @@ static int cs_ioctl(struct inode *inode, struct file *file, unsigned int cmd, un } } if (file->f_mode & FMODE_READ) { - state = card->states[0]; - if (state) { + state = (struct cs_state *)card->states[0]; + if(state) + { dmabuf = &state->dmabuf; stop_adc(state); synchronize_irq(card->irq); @@ -2437,17 +2510,20 @@ 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 = card->states[0]; - if (state) { + state = (struct cs_state *)card->states[0]; + if(state) + { dmabuf = &state->dmabuf; stop_adc(state); dmabuf->ready = 0; @@ -2457,8 +2533,9 @@ static int cs_ioctl(struct inode *inode, struct file *file, unsigned int cmd, un } } if (file->f_mode & FMODE_WRITE) { - state = card->states[1]; - if (state) { + state = (struct cs_state *)card->states[1]; + if(state) + { dmabuf = &state->dmabuf; stop_dac(state); dmabuf->ready = 0; @@ -2475,17 +2552,19 @@ 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 = card->states[1]; - if (state) { + state = (struct cs_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; @@ -2497,13 +2576,14 @@ static int cs_ioctl(struct inode *inode, struct file *file, unsigned int cmd, un } } if (file->f_mode & FMODE_READ) { - state = card->states[0]; - if (state) { + state = (struct cs_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; @@ -2515,10 +2595,12 @@ 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 = card->states[1]; - if (state) { + state = (struct cs_state *)card->states[1]; + if(state) + { dmabuf = &state->dmabuf; if ((val = prog_dmabuf(state))) return val; @@ -2526,8 +2608,9 @@ static int cs_ioctl(struct inode *inode, struct file *file, unsigned int cmd, un } } if (file->f_mode & FMODE_READ) { - state = card->states[0]; - if (state) { + state = (struct cs_state *)card->states[0]; + if(state) + { dmabuf = &state->dmabuf; if ((val = prog_dmabuf(state))) return val; @@ -2536,8 +2619,10 @@ 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; @@ -2549,75 +2634,88 @@ 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 = card->states[1]; - if (state) { + state = (struct cs_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 = card->states[0]; - if (state) { + state = (struct cs_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 = card->states[1]; - if (state) + } + else + { + if(file->f_mode & FMODE_WRITE) + { + state = (struct cs_state *)card->states[1]; + if(state) dmabuf = &state->dmabuf; - } else if (file->f_mode & FMODE_READ) { - state = card->states[0]; - if (state) + } + else if(file->f_mode & FMODE_READ) + { + state = (struct cs_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 = card->states[1]; - if (state) { + state = (struct cs_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; @@ -2627,13 +2725,14 @@ static int cs_ioctl(struct inode *inode, struct file *file, unsigned int cmd, un } } if (file->f_mode & FMODE_READ) { - state = card->states[0]; - if (state) { + state = (struct cs_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; @@ -2645,16 +2744,19 @@ 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 = card->states[1]; - if (state) { + state = (struct cs_state *)card->states[1]; + if(state) + { dmabuf = &state->dmabuf; if (dmabuf->subdivision) return -EINVAL; @@ -2666,8 +2768,9 @@ static int cs_ioctl(struct inode *inode, struct file *file, unsigned int cmd, un } } if (file->f_mode & FMODE_READ) { - state = card->states[0]; - if (state) { + state = (struct cs_state *)card->states[0]; + if(state) + { dmabuf = &state->dmabuf; if (dmabuf->subdivision) return -EINVAL; @@ -2679,31 +2782,37 @@ 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 = card->states[1]; - if (state) { + state = (struct cs_state *)card->states[1]; + if(state) + { dmabuf = &state->dmabuf; dmabuf->ossfragshift = val & 0xffff; dmabuf->ossmaxfrags = (val >> 16) & 0xffff; } } if (file->f_mode & FMODE_READ) { - state = card->states[0]; - if (state) { + state = (struct cs_state *)card->states[0]; + if(state) + { dmabuf = &state->dmabuf; dmabuf->ossfragshift = val & 0xffff; dmabuf->ossmaxfrags = (val >> 16) & 0xffff; } } return 0; + case SNDCTL_DSP_GETOSPACE: if (!(file->f_mode & FMODE_WRITE)) return -EINVAL; - state = card->states[1]; - if (state) { + state = (struct cs_state *)card->states[1]; + if(state) + { dmabuf = &state->dmabuf; spin_lock_irqsave(&state->card->lock, flags); cs_update_ptr(card, CS_TRUE); @@ -2722,11 +2831,13 @@ 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 = card->states[0]; - if (state) { + state = (struct cs_state *)card->states[0]; + if(state) + { dmabuf = &state->dmabuf; spin_lock_irqsave(&state->card->lock, flags); cs_update_ptr(card, CS_TRUE); @@ -2738,39 +2849,48 @@ 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 = card->states[1]; - if (state) { + if (file->f_mode & FMODE_WRITE) + { + state = (struct cs_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 = card->states[0]; + if (file->f_mode & FMODE_READ) + { + if(state) + { + state = (struct cs_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 = card->states[0]; - if (state) { + state = (struct cs_state *)card->states[0]; + if(state) + { dmabuf = &state->dmabuf; if (val & PCM_ENABLE_INPUT) { if (!dmabuf->ready && (ret = prog_dmabuf(state))) @@ -2781,8 +2901,9 @@ static int cs_ioctl(struct inode *inode, struct file *file, unsigned int cmd, un } } if (file->f_mode & FMODE_WRITE) { - state = card->states[1]; - if (state) { + state = (struct cs_state *)card->states[1]; + if(state) + { dmabuf = &state->dmabuf; if (val & PCM_ENABLE_OUTPUT) { if (!dmabuf->ready && (ret = prog_dmabuf(state))) @@ -2793,11 +2914,13 @@ 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 = card->states[0]; - if (state) { + state = (struct cs_state *)card->states[0]; + if(state) + { dmabuf = &state->dmabuf; spin_lock_irqsave(&state->card->lock, flags); cs_update_ptr(card, CS_TRUE); @@ -2810,23 +2933,28 @@ 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 = card->states[1]; - if (state) { + state = (struct cs_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; @@ -2840,54 +2968,66 @@ 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 = card->states[1]; - if (state) { + state = (struct cs_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 = card->states[0]; + if(file->f_mode & FMODE_READ) + state = (struct cs_state *)card->states[0]; else - state = card->states[1]; - if (state) { + state = (struct cs_state *)card->states[1]; + if(state) + { dmabuf = &state->dmabuf; return put_user(dmabuf->rate, p); } return put_user(0, p); + + case SOUND_PCM_READ_CHANNELS: - if (file->f_mode & FMODE_READ) - state = card->states[0]; + if(file->f_mode & FMODE_READ) + state = (struct cs_state *)card->states[0]; else - state = card->states[1]; - if (state) { + state = (struct cs_state *)card->states[1]; + if(state) + { dmabuf = &state->dmabuf; return put_user((dmabuf->fmt & CS_FMT_STEREO) ? 2 : 1, p); } return put_user(0, p); + case SOUND_PCM_READ_BITS: - if (file->f_mode & FMODE_READ) - state = card->states[0]; + if(file->f_mode & FMODE_READ) + state = (struct cs_state *)card->states[0]; else - state = card->states[1]; - if (state) { + state = (struct cs_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: @@ -2916,15 +3056,18 @@ 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) & @@ -2939,21 +3082,25 @@ 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 */ @@ -2976,28 +3123,31 @@ 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. */ @@ -3011,19 +3161,20 @@ static void clkrun_hack(struct cs_card *card, int change) static int cs_open(struct inode *inode, struct file *file) { - struct cs_card *card = file->private_data; + struct cs_card *card = (struct cs_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)) @@ -3040,43 +3191,48 @@ 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] = + state = card->states[0] = (struct cs_state *) kmalloc(sizeof(struct cs_state), GFP_KERNEL); if (state == NULL) return -ENOMEM; memset(state, 0, sizeof(struct cs_state)); - mutex_init(&state->sem); + init_MUTEX(&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; } @@ -3085,10 +3241,10 @@ static int cs_open(struct inode *inode, struct file *file) state->virt = 0; state->magic = CS_STATE_MAGIC; init_waitqueue_head(&dmabuf->wait); - mutex_init(&state->open_mutex); + init_MUTEX(&state->open_sem); file->private_data = card; - mutex_lock(&state->open_mutex); + down(&state->open_sem); /* set default sample format. According to OSS Programmer's Guide /dev/dsp should be default to unsigned 8-bits, mono, with sample rate 8kHz and @@ -3104,45 +3260,50 @@ static int cs_open(struct inode *inode, struct file *file) cs_set_divisor(dmabuf); state->open_mode |= FMODE_READ; - mutex_unlock(&state->open_mutex); + up(&state->open_sem); } - 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] = + state = card->states[1] = (struct cs_state *) kmalloc(sizeof(struct cs_state), GFP_KERNEL); if (state == NULL) return -ENOMEM; memset(state, 0, sizeof(struct cs_state)); - mutex_init(&state->sem); + init_MUTEX(&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; } @@ -3151,10 +3312,10 @@ static int cs_open(struct inode *inode, struct file *file) state->virt = 1; state->magic = CS_STATE_MAGIC; init_waitqueue_head(&dmabuf->wait); - mutex_init(&state->open_mutex); + init_MUTEX(&state->open_sem); file->private_data = card; - mutex_lock(&state->open_mutex); + down(&state->open_sem); /* set default sample format. According to OSS Programmer's Guide /dev/dsp should be default to unsigned 8-bits, mono, with sample rate 8kHz and @@ -3170,46 +3331,51 @@ static int cs_open(struct inode *inode, struct file *file) cs_set_divisor(dmabuf); state->open_mode |= FMODE_WRITE; - mutex_unlock(&state->open_mutex); - if ((ret = prog_dmabuf(state))) + up(&state->open_sem); + 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 = file->private_data; + struct cs_card *card = (struct cs_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); /* stop DMA state machine and free DMA buffers/channels */ - mutex_lock(&state->open_mutex); + down(&state->open_sem); stop_dac(state); dealloc_dmabuf(state); state->card->free_pcm_channel(state->card, dmabuf->channel->num); free_page((unsigned long)state->dmabuf.pbuf); - /* we're covered by the open_mutex */ - mutex_unlock(&state->open_mutex); + /* we're covered by the open_sem */ + up(&state->open_sem); 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) ); } @@ -3217,27 +3383,31 @@ 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); + down(&state->open_sem); stop_adc(state); dealloc_dmabuf(state); state->card->free_pcm_channel(state->card, dmabuf->channel->num); free_page((unsigned long)state->dmabuf.pbuf); - /* we're covered by the open_mutex */ - mutex_unlock(&state->open_mutex); + /* we're covered by the open_sem */ + up(&state->open_sem); 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) ); } @@ -3245,11 +3415,12 @@ 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; } @@ -3302,18 +3473,21 @@ 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); } /* @@ -3347,10 +3521,11 @@ 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")); @@ -3390,13 +3565,16 @@ 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")); @@ -3406,27 +3584,30 @@ 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; @@ -3434,17 +3615,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, @@ -3452,19 +3633,20 @@ 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; @@ -3496,11 +3678,13 @@ 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; } @@ -3551,7 +3735,8 @@ 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; @@ -3561,8 +3746,10 @@ 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); @@ -3571,13 +3758,15 @@ 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")); } @@ -3645,7 +3834,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; @@ -3676,7 +3865,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; @@ -3695,7 +3884,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)); @@ -3733,9 +3922,12 @@ 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 @@ -3777,7 +3969,8 @@ 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)); } @@ -3804,23 +3997,25 @@ 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); } @@ -3828,41 +4023,46 @@ 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; } } @@ -3876,7 +4076,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; @@ -3891,13 +4091,15 @@ 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); @@ -3907,9 +4109,10 @@ 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; @@ -3922,60 +4125,76 @@ 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 = file->private_data; - struct cs_card *card = NULL; + struct ac97_codec *codec = (struct ac97_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); @@ -4012,7 +4231,8 @@ 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) ); @@ -4020,11 +4240,12 @@ 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; @@ -4063,23 +4284,27 @@ 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; i < FILL__COUNT; i++) { + 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 ); @@ -4259,14 +4491,16 @@ 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")); @@ -4274,13 +4508,15 @@ 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. */ @@ -4303,26 +4539,30 @@ 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. @@ -4346,14 +4586,16 @@ 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. */ @@ -4361,13 +4603,15 @@ 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. */ @@ -4390,7 +4634,8 @@ 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; @@ -4398,7 +4643,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)); @@ -4408,22 +4653,23 @@ 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")); @@ -4431,10 +4677,12 @@ 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 ); @@ -4460,14 +4708,16 @@ 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")); @@ -4475,10 +4725,12 @@ 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 ); @@ -4504,23 +4756,27 @@ 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 ); @@ -4547,14 +4803,16 @@ 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. */ @@ -4562,10 +4820,12 @@ 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 ); @@ -4591,7 +4851,8 @@ 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; @@ -4599,13 +4860,14 @@ 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; @@ -4702,7 +4964,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 @@ -4754,7 +5016,8 @@ 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. */ @@ -4769,7 +5032,9 @@ 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); @@ -4798,7 +5063,8 @@ 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. @@ -4814,7 +5080,9 @@ 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); @@ -4871,13 +5139,17 @@ 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); } @@ -4901,17 +5173,23 @@ 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; @@ -5031,13 +5309,14 @@ 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; } @@ -5138,11 +5424,13 @@ 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 @@ -5151,7 +5439,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); @@ -5172,12 +5460,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, IRQF_SHARED, "cs46xx", card)) { + if (request_irq(card->irq, &cs_interrupt, SA_SHIRQ, "cs46xx", card)) { printk(KERN_ERR "cs46xx: unable to allocate irq %d\n", card->irq); goto fail2; } @@ -5188,12 +5476,14 @@ 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++) @@ -5206,17 +5496,18 @@ 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; } init_waitqueue_head(&card->midi.open_wait); - mutex_init(&card->midi.open_mutex); + init_MUTEX(&card->midi.open_sem); init_waitqueue_head(&card->midi.iwait); init_waitqueue_head(&card->midi.owait); cs461x_pokeBA0(card, BA0_MIDCR, MIDCR_MRST); @@ -5226,7 +5517,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); @@ -5244,15 +5535,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 @@ -5306,8 +5597,9 @@ 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) ); } @@ -5341,7 +5633,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); @@ -5400,7 +5692,8 @@ 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 15ce7119c..baf4244a5 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; } -/* acquires lock */ +/* aquires 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); } -/* acquires lock */ +/* aquires 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 acquire dmap->lock */ +/* has to aquire 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 25dd5a318..a1b0b92af 100644 --- a/sound/oss/dmasound/dmasound.h +++ b/sound/oss/dmasound/dmasound.h @@ -13,6 +13,7 @@ #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 4359903f4..74f975676 100644 --- a/sound/oss/dmasound/dmasound_awacs.c +++ b/sound/oss/dmasound/dmasound_awacs.c @@ -67,6 +67,7 @@ #include #include +#include #include #include #include @@ -79,7 +80,7 @@ #include #include #include -#include +#include #ifdef CONFIG_ADB_CUDA #include #endif @@ -87,6 +88,8 @@ #include #endif +#include + #include #include #include @@ -127,7 +130,7 @@ static struct resource awacs_rsrc[3]; static char awacs_name[64]; static int awacs_revision; static int awacs_sleeping; -static DEFINE_MUTEX(dmasound_mutex); +static DECLARE_MUTEX(dmasound_sem); static int sound_device_id; /* exists after iMac revA */ static int hw_can_byteswap = 1 ; /* most pmac sound h/w can */ @@ -309,11 +312,11 @@ extern int daca_enter_sleep(void); extern int daca_leave_sleep(void); #define TRY_LOCK() \ - if ((rc = mutex_lock_interruptible(&dmasound_mutex)) != 0) \ + if ((rc = down_interruptible(&dmasound_sem)) != 0) \ return rc; -#define LOCK() mutex_lock(&dmasound_mutex); +#define LOCK() down(&dmasound_sem); -#define UNLOCK() mutex_unlock(&dmasound_mutex); +#define UNLOCK() up(&dmasound_sem); /* We use different versions that the ones provided in dmasound.h * @@ -374,7 +377,10 @@ setup_audio_gpio(const char *name, const char* compatible, int *gpio_addr, int* *gpio_pol = *pp; else *gpio_pol = 1; - return irq_of_parse_and_map(np, 0); + if (np->n_intrs > 0) + return np->intrs[0].line; + + return 0; } static inline void @@ -2794,7 +2800,7 @@ __init setup_beep(void) DBDMA_ALIGN(beep_dbdma_cmd_space); /* set up emergency dbdma cmd */ emergency_dbdma_cmd = beep_dbdma_cmd+1 ; - beep_buf = kmalloc(BEEP_BUFLEN * 4, GFP_KERNEL); + beep_buf = (short *) kmalloc(BEEP_BUFLEN * 4, GFP_KERNEL); if (beep_buf == NULL) { printk(KERN_ERR "dmasound_pmac: no memory for beep buffer\n"); kfree(beep_dbdma_cmd_space) ; @@ -2810,7 +2816,7 @@ int __init dmasound_awacs_init(void) struct device_node *io = NULL, *info = NULL; int vol, res; - if (!machine_is(powermac)) + if (_machine != _MACH_Pmac) return -ENODEV; awacs_subframe = 0; @@ -2861,13 +2867,14 @@ 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) { + if (of_get_address(io, 2, NULL, NULL) == NULL || io->n_intrs < 3) { /* 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) { + if (of_get_address(io, 2, NULL, NULL) == NULL || + io->n_intrs < 3) { printk("dmasound_pmac: can't use %s\n", io->full_name); return -ENODEV; @@ -2936,9 +2943,9 @@ printk("dmasound_pmac: couldn't find a Codec we can handle\n"); if (awacs_revision == AWACS_SCREAMER && awacs) awacs_recalibrate(); - 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); + awacs_irq = io->intrs[0].line; + awacs_tx_irq = io->intrs[1].line; + awacs_rx_irq = io->intrs[2].line; /* Hack for legacy crap that will be killed someday */ awacs_node = io; diff --git a/sound/oss/dmasound/dmasound_core.c b/sound/oss/dmasound/dmasound_core.c index 87bd3100a..c9302a1e5 100644 --- a/sound/oss/dmasound/dmasound_core.c +++ b/sound/oss/dmasound/dmasound_core.c @@ -195,18 +195,18 @@ */ int dmasound_catchRadius = 0; -module_param(dmasound_catchRadius, int, 0); +MODULE_PARM(dmasound_catchRadius, "i"); static unsigned int numWriteBufs = DEFAULT_N_BUFFERS; -module_param(numWriteBufs, int, 0); +MODULE_PARM(numWriteBufs, "i"); static unsigned int writeBufSize = DEFAULT_BUFF_SIZE ; /* in bytes */ -module_param(writeBufSize, int, 0); +MODULE_PARM(writeBufSize, "i"); #ifdef HAS_RECORD static unsigned int numReadBufs = DEFAULT_N_BUFFERS; -module_param(numReadBufs, int, 0); +MODULE_PARM(numReadBufs, "i"); static unsigned int readBufSize = DEFAULT_BUFF_SIZE; /* in bytes */ -module_param(readBufSize, int, 0); +MODULE_PARM(readBufSize, "i"); #endif MODULE_LICENSE("GPL"); diff --git a/sound/oss/dmasound/dmasound_paula.c b/sound/oss/dmasound/dmasound_paula.c index 68e1d8f6c..494070a3f 100644 --- a/sound/oss/dmasound/dmasound_paula.c +++ b/sound/oss/dmasound/dmasound_paula.c @@ -16,6 +16,7 @@ #include +#include #include #include #include diff --git a/sound/oss/emu10k1/hwaccess.h b/sound/oss/emu10k1/hwaccess.h index 85e27bda6..104223a19 100644 --- a/sound/oss/emu10k1/hwaccess.h +++ b/sound/oss/emu10k1/hwaccess.h @@ -181,7 +181,7 @@ struct emu10k1_card struct emu10k1_mpuout *mpuout; struct emu10k1_mpuin *mpuin; - struct mutex open_sem; + struct semaphore open_sem; mode_t open_mode; wait_queue_head_t open_wait; diff --git a/sound/oss/emu10k1/main.c b/sound/oss/emu10k1/main.c index c4ce94d6e..23241cbdd 100644 --- a/sound/oss/emu10k1/main.c +++ b/sound/oss/emu10k1/main.c @@ -94,7 +94,6 @@ #include #include #include -#include #include "hwaccess.h" #include "8010.h" @@ -120,7 +119,7 @@ /* the emu10k1 _seems_ to only supports 29 bit (512MiB) bit bus master */ -#define EMU10K1_DMA_MASK DMA_29BIT_MASK /* DMA buffer mask for pci_alloc_consist */ +#define EMU10K1_DMA_MASK 0x1fffffff /* DMA buffer mask for pci_alloc_consist */ #ifndef PCI_VENDOR_ID_CREATIVE #define PCI_VENDOR_ID_CREATIVE 0x1102 @@ -1301,7 +1300,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, IRQF_SHARED, card_names[pci_id->driver_data], card)) { + if (request_irq(card->irq, emu10k1_interrupt, SA_SHIRQ, card_names[pci_id->driver_data], card)) { printk(KERN_ERR "emu10k1: IRQ in use\n"); ret = -EBUSY; goto err_irq; @@ -1321,7 +1320,7 @@ static int __devinit emu10k1_probe(struct pci_dev *pci_dev, const struct pci_dev card->is_aps = (subsysvid == EMU_APS_SUBID); spin_lock_init(&card->lock); - mutex_init(&card->open_sem); + init_MUTEX(&card->open_sem); card->open_mode = 0; init_waitqueue_head(&card->open_wait); diff --git a/sound/oss/emu10k1/midi.c b/sound/oss/emu10k1/midi.c index 8ac77df86..b40b5f97a 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); +static DEFINE_SPINLOCK(midi_spinlock __attribute((unused))); static void init_midi_hdr(struct midi_hdr *midihdr) { @@ -65,8 +65,7 @@ static int midiin_add_buffer(struct emu10k1_mididevice *midi_dev, struct midi_hd init_midi_hdr(midihdr); - midihdr->data = kmalloc(MIDIIN_BUFLEN, GFP_KERNEL); - if (!midihdr->data) { + if ((midihdr->data = (u8 *) kmalloc(MIDIIN_BUFLEN, GFP_KERNEL)) == NULL) { ERROR(); kfree(midihdr); return -1; @@ -111,21 +110,21 @@ match: #endif /* Wait for device to become free */ - mutex_lock(&card->open_sem); + down(&card->open_sem); while (card->open_mode & (file->f_mode << FMODE_MIDI_SHIFT)) { if (file->f_flags & O_NONBLOCK) { - mutex_unlock(&card->open_sem); + up(&card->open_sem); return -EBUSY; } - mutex_unlock(&card->open_sem); + up(&card->open_sem); interruptible_sleep_on(&card->open_wait); if (signal_pending(current)) { return -ERESTARTSYS; } - mutex_lock(&card->open_sem); + down(&card->open_sem); } if ((midi_dev = (struct emu10k1_mididevice *) kmalloc(sizeof(*midi_dev), GFP_KERNEL)) == NULL) @@ -184,7 +183,7 @@ match: card->open_mode |= (file->f_mode << FMODE_MIDI_SHIFT) & (FMODE_MIDI_READ | FMODE_MIDI_WRITE); - mutex_unlock(&card->open_sem); + up(&card->open_sem); return nonseekable_open(inode, file); } @@ -235,9 +234,9 @@ static int emu10k1_midi_release(struct inode *inode, struct file *file) kfree(midi_dev); - mutex_lock(&card->open_sem); + down(&card->open_sem); card->open_mode &= ~((file->f_mode << FMODE_MIDI_SHIFT) & (FMODE_MIDI_READ | FMODE_MIDI_WRITE)); - mutex_unlock(&card->open_sem); + up(&card->open_sem); wake_up_interruptible(&card->open_wait); unlock_kernel(); @@ -335,8 +334,7 @@ static ssize_t emu10k1_midi_write(struct file *file, const char __user *buffer, midihdr->bytesrecorded = 0; midihdr->flags = 0; - midihdr->data = kmalloc(count, GFP_KERNEL); - if (!midihdr->data) { + if ((midihdr->data = (u8 *) kmalloc(count, GFP_KERNEL)) == NULL) { ERROR(); kfree(midihdr); return -EINVAL; @@ -547,8 +545,7 @@ int emu10k1_seq_midi_out(int dev, unsigned char midi_byte) midihdr->bytesrecorded = 0; midihdr->flags = 0; - midihdr->data = kmalloc(1, GFP_KERNEL); - if (!midihdr->data) { + if ((midihdr->data = (u8 *) kmalloc(1, GFP_KERNEL)) == NULL) { ERROR(); kfree(midihdr); return -EINVAL; diff --git a/sound/oss/es1370.c b/sound/oss/es1370.c index 13f483149..ae55c5366 100644 --- a/sound/oss/es1370.c +++ b/sound/oss/es1370.c @@ -157,7 +157,6 @@ #include #include #include -#include #include #include @@ -347,7 +346,7 @@ struct es1370_state { unsigned sctrl; spinlock_t lock; - struct mutex open_mutex; + struct semaphore open_sem; mode_t open_mode; wait_queue_head_t open_wait; @@ -394,7 +393,7 @@ struct es1370_state { struct gameport *gameport; #endif - struct mutex mutex; + struct semaphore sem; }; /* --------------------------------------------------------------------- */ @@ -1160,7 +1159,7 @@ static ssize_t es1370_read(struct file *file, char __user *buffer, size_t count, return -ENXIO; if (!access_ok(VERIFY_WRITE, buffer, count)) return -EFAULT; - mutex_lock(&s->mutex); + down(&s->sem); if (!s->dma_adc.ready && (ret = prog_dmabuf_adc(s))) goto out; @@ -1184,14 +1183,14 @@ static ssize_t es1370_read(struct file *file, char __user *buffer, size_t count, ret = -EAGAIN; goto out; } - mutex_unlock(&s->mutex); + up(&s->sem); schedule(); if (signal_pending(current)) { if (!ret) ret = -ERESTARTSYS; goto out; } - mutex_lock(&s->mutex); + down(&s->sem); if (s->dma_adc.mapped) { ret = -ENXIO; @@ -1216,7 +1215,7 @@ static ssize_t es1370_read(struct file *file, char __user *buffer, size_t count, start_adc(s); } out: - mutex_unlock(&s->mutex); + up(&s->sem); remove_wait_queue(&s->dma_adc.wait, &wait); set_current_state(TASK_RUNNING); return ret; @@ -1236,7 +1235,7 @@ static ssize_t es1370_write(struct file *file, const char __user *buffer, size_t return -ENXIO; if (!access_ok(VERIFY_READ, buffer, count)) return -EFAULT; - mutex_lock(&s->mutex); + down(&s->sem); if (!s->dma_dac2.ready && (ret = prog_dmabuf_dac2(s))) goto out; ret = 0; @@ -1264,14 +1263,14 @@ static ssize_t es1370_write(struct file *file, const char __user *buffer, size_t ret = -EAGAIN; goto out; } - mutex_unlock(&s->mutex); + up(&s->sem); schedule(); if (signal_pending(current)) { if (!ret) ret = -ERESTARTSYS; goto out; } - mutex_lock(&s->mutex); + down(&s->sem); if (s->dma_dac2.mapped) { ret = -ENXIO; @@ -1297,7 +1296,7 @@ static ssize_t es1370_write(struct file *file, const char __user *buffer, size_t start_dac2(s); } out: - mutex_unlock(&s->mutex); + up(&s->sem); remove_wait_queue(&s->dma_dac2.wait, &wait); set_current_state(TASK_RUNNING); return ret; @@ -1349,7 +1348,7 @@ static int es1370_mmap(struct file *file, struct vm_area_struct *vma) VALIDATE_STATE(s); lock_kernel(); - mutex_lock(&s->mutex); + down(&s->sem); if (vma->vm_flags & VM_WRITE) { if ((ret = prog_dmabuf_dac2(s)) != 0) { goto out; @@ -1381,7 +1380,7 @@ static int es1370_mmap(struct file *file, struct vm_area_struct *vma) } db->mapped = 1; out: - mutex_unlock(&s->mutex); + up(&s->sem); unlock_kernel(); return ret; } @@ -1753,21 +1752,21 @@ static int es1370_open(struct inode *inode, struct file *file) VALIDATE_STATE(s); file->private_data = s; /* wait for device to become free */ - mutex_lock(&s->open_mutex); + down(&s->open_sem); while (s->open_mode & file->f_mode) { if (file->f_flags & O_NONBLOCK) { - mutex_unlock(&s->open_mutex); + up(&s->open_sem); return -EBUSY; } add_wait_queue(&s->open_wait, &wait); __set_current_state(TASK_INTERRUPTIBLE); - mutex_unlock(&s->open_mutex); + up(&s->open_sem); schedule(); remove_wait_queue(&s->open_wait, &wait); set_current_state(TASK_RUNNING); if (signal_pending(current)) return -ERESTARTSYS; - mutex_lock(&s->open_mutex); + down(&s->open_sem); } spin_lock_irqsave(&s->lock, flags); if (!(s->open_mode & (FMODE_READ|FMODE_WRITE))) @@ -1794,8 +1793,8 @@ static int es1370_open(struct inode *inode, struct file *file) outl(s->ctrl, s->io+ES1370_REG_CONTROL); spin_unlock_irqrestore(&s->lock, flags); s->open_mode |= file->f_mode & (FMODE_READ | FMODE_WRITE); - mutex_unlock(&s->open_mutex); - mutex_init(&s->mutex); + up(&s->open_sem); + init_MUTEX(&s->sem); return nonseekable_open(inode, file); } @@ -1807,7 +1806,7 @@ static int es1370_release(struct inode *inode, struct file *file) lock_kernel(); if (file->f_mode & FMODE_WRITE) drain_dac2(s, file->f_flags & O_NONBLOCK); - mutex_lock(&s->open_mutex); + down(&s->open_sem); if (file->f_mode & FMODE_WRITE) { stop_dac2(s); synchronize_irq(s->irq); @@ -1819,7 +1818,7 @@ static int es1370_release(struct inode *inode, struct file *file) } s->open_mode &= ~(file->f_mode & (FMODE_READ|FMODE_WRITE)); wake_up(&s->open_wait); - mutex_unlock(&s->open_mutex); + up(&s->open_sem); unlock_kernel(); return 0; } @@ -2199,21 +2198,21 @@ static int es1370_open_dac(struct inode *inode, struct file *file) return -EINVAL; file->private_data = s; /* wait for device to become free */ - mutex_lock(&s->open_mutex); + down(&s->open_sem); while (s->open_mode & FMODE_DAC) { if (file->f_flags & O_NONBLOCK) { - mutex_unlock(&s->open_mutex); + up(&s->open_sem); return -EBUSY; } add_wait_queue(&s->open_wait, &wait); __set_current_state(TASK_INTERRUPTIBLE); - mutex_unlock(&s->open_mutex); + up(&s->open_sem); schedule(); remove_wait_queue(&s->open_wait, &wait); set_current_state(TASK_RUNNING); if (signal_pending(current)) return -ERESTARTSYS; - mutex_lock(&s->open_mutex); + down(&s->open_sem); } s->dma_dac1.ossfragshift = s->dma_dac1.ossmaxfrags = s->dma_dac1.subdivision = 0; s->dma_dac1.enabled = 1; @@ -2228,7 +2227,7 @@ static int es1370_open_dac(struct inode *inode, struct file *file) outl(s->ctrl, s->io+ES1370_REG_CONTROL); spin_unlock_irqrestore(&s->lock, flags); s->open_mode |= FMODE_DAC; - mutex_unlock(&s->open_mutex); + up(&s->open_sem); return nonseekable_open(inode, file); } @@ -2239,12 +2238,12 @@ static int es1370_release_dac(struct inode *inode, struct file *file) VALIDATE_STATE(s); lock_kernel(); drain_dac1(s, file->f_flags & O_NONBLOCK); - mutex_lock(&s->open_mutex); + down(&s->open_sem); stop_dac1(s); dealloc_dmabuf(s, &s->dma_dac1); s->open_mode &= ~FMODE_DAC; wake_up(&s->open_wait); - mutex_unlock(&s->open_mutex); + up(&s->open_sem); unlock_kernel(); return 0; } @@ -2431,21 +2430,21 @@ static int es1370_midi_open(struct inode *inode, struct file *file) VALIDATE_STATE(s); file->private_data = s; /* wait for device to become free */ - mutex_lock(&s->open_mutex); + down(&s->open_sem); while (s->open_mode & (file->f_mode << FMODE_MIDI_SHIFT)) { if (file->f_flags & O_NONBLOCK) { - mutex_unlock(&s->open_mutex); + up(&s->open_sem); return -EBUSY; } add_wait_queue(&s->open_wait, &wait); __set_current_state(TASK_INTERRUPTIBLE); - mutex_unlock(&s->open_mutex); + up(&s->open_sem); schedule(); remove_wait_queue(&s->open_wait, &wait); set_current_state(TASK_RUNNING); if (signal_pending(current)) return -ERESTARTSYS; - mutex_lock(&s->open_mutex); + down(&s->open_sem); } spin_lock_irqsave(&s->lock, flags); if (!(s->open_mode & (FMODE_MIDI_READ | FMODE_MIDI_WRITE))) { @@ -2466,7 +2465,7 @@ static int es1370_midi_open(struct inode *inode, struct file *file) es1370_handle_midi(s); spin_unlock_irqrestore(&s->lock, flags); s->open_mode |= (file->f_mode << FMODE_MIDI_SHIFT) & (FMODE_MIDI_READ | FMODE_MIDI_WRITE); - mutex_unlock(&s->open_mutex); + up(&s->open_sem); return nonseekable_open(inode, file); } @@ -2500,7 +2499,7 @@ static int es1370_midi_release(struct inode *inode, struct file *file) remove_wait_queue(&s->midi.owait, &wait); set_current_state(TASK_RUNNING); } - mutex_lock(&s->open_mutex); + down(&s->open_sem); s->open_mode &= ~((file->f_mode << FMODE_MIDI_SHIFT) & (FMODE_MIDI_READ|FMODE_MIDI_WRITE)); spin_lock_irqsave(&s->lock, flags); if (!(s->open_mode & (FMODE_MIDI_READ | FMODE_MIDI_WRITE))) { @@ -2509,7 +2508,7 @@ static int es1370_midi_release(struct inode *inode, struct file *file) } spin_unlock_irqrestore(&s->lock, flags); wake_up(&s->open_wait); - mutex_unlock(&s->open_mutex); + up(&s->open_sem); unlock_kernel(); return 0; } @@ -2639,7 +2638,7 @@ static int __devinit es1370_probe(struct pci_dev *pcidev, const struct pci_devic init_waitqueue_head(&s->open_wait); init_waitqueue_head(&s->midi.iwait); init_waitqueue_head(&s->midi.owait); - mutex_init(&s->open_mutex); + init_MUTEX(&s->open_sem); spin_lock_init(&s->lock); s->magic = ES1370_MAGIC; s->dev = pcidev; @@ -2650,7 +2649,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, IRQF_SHARED, "es1370",s))) { + if ((ret=request_irq(s->irq, es1370_interrupt, SA_SHIRQ, "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 a2ffe723d..5c697f162 100644 --- a/sound/oss/es1371.c +++ b/sound/oss/es1371.c @@ -129,7 +129,6 @@ #include #include #include -#include #include #include @@ -420,7 +419,7 @@ struct es1371_state { unsigned dac1rate, dac2rate, adcrate; spinlock_t lock; - struct mutex open_mutex; + struct semaphore open_sem; mode_t open_mode; wait_queue_head_t open_wait; @@ -463,7 +462,7 @@ struct es1371_state { struct gameport *gameport; #endif - struct mutex sem; + struct semaphore sem; }; /* --------------------------------------------------------------------- */ @@ -1347,7 +1346,7 @@ static ssize_t es1371_read(struct file *file, char __user *buffer, size_t count, return -ENXIO; if (!access_ok(VERIFY_WRITE, buffer, count)) return -EFAULT; - mutex_lock(&s->sem); + down(&s->sem); if (!s->dma_adc.ready && (ret = prog_dmabuf_adc(s))) goto out2; @@ -1371,14 +1370,14 @@ static ssize_t es1371_read(struct file *file, char __user *buffer, size_t count, ret = -EAGAIN; goto out; } - mutex_unlock(&s->sem); + up(&s->sem); schedule(); if (signal_pending(current)) { if (!ret) ret = -ERESTARTSYS; goto out2; } - mutex_lock(&s->sem); + down(&s->sem); if (s->dma_adc.mapped) { ret = -ENXIO; @@ -1403,7 +1402,7 @@ static ssize_t es1371_read(struct file *file, char __user *buffer, size_t count, start_adc(s); } out: - mutex_unlock(&s->sem); + up(&s->sem); out2: remove_wait_queue(&s->dma_adc.wait, &wait); set_current_state(TASK_RUNNING); @@ -1424,7 +1423,7 @@ static ssize_t es1371_write(struct file *file, const char __user *buffer, size_t return -ENXIO; if (!access_ok(VERIFY_READ, buffer, count)) return -EFAULT; - mutex_lock(&s->sem); + down(&s->sem); if (!s->dma_dac2.ready && (ret = prog_dmabuf_dac2(s))) goto out3; ret = 0; @@ -1452,14 +1451,14 @@ static ssize_t es1371_write(struct file *file, const char __user *buffer, size_t ret = -EAGAIN; goto out; } - mutex_unlock(&s->sem); + up(&s->sem); schedule(); if (signal_pending(current)) { if (!ret) ret = -ERESTARTSYS; goto out2; } - mutex_lock(&s->sem); + down(&s->sem); if (s->dma_dac2.mapped) { ret = -ENXIO; @@ -1485,7 +1484,7 @@ static ssize_t es1371_write(struct file *file, const char __user *buffer, size_t start_dac2(s); } out: - mutex_unlock(&s->sem); + up(&s->sem); out2: remove_wait_queue(&s->dma_dac2.wait, &wait); out3: @@ -1539,7 +1538,7 @@ static int es1371_mmap(struct file *file, struct vm_area_struct *vma) VALIDATE_STATE(s); lock_kernel(); - mutex_lock(&s->sem); + down(&s->sem); if (vma->vm_flags & VM_WRITE) { if ((ret = prog_dmabuf_dac2(s)) != 0) { @@ -1572,7 +1571,7 @@ static int es1371_mmap(struct file *file, struct vm_area_struct *vma) } db->mapped = 1; out: - mutex_unlock(&s->sem); + up(&s->sem); unlock_kernel(); return ret; } @@ -1939,21 +1938,21 @@ static int es1371_open(struct inode *inode, struct file *file) VALIDATE_STATE(s); file->private_data = s; /* wait for device to become free */ - mutex_lock(&s->open_mutex); + down(&s->open_sem); while (s->open_mode & file->f_mode) { if (file->f_flags & O_NONBLOCK) { - mutex_unlock(&s->open_mutex); + up(&s->open_sem); return -EBUSY; } add_wait_queue(&s->open_wait, &wait); __set_current_state(TASK_INTERRUPTIBLE); - mutex_unlock(&s->open_mutex); + up(&s->open_sem); schedule(); remove_wait_queue(&s->open_wait, &wait); set_current_state(TASK_RUNNING); if (signal_pending(current)) return -ERESTARTSYS; - mutex_lock(&s->open_mutex); + down(&s->open_sem); } if (file->f_mode & FMODE_READ) { s->dma_adc.ossfragshift = s->dma_adc.ossmaxfrags = s->dma_adc.subdivision = 0; @@ -1983,8 +1982,8 @@ static int es1371_open(struct inode *inode, struct file *file) outl(s->sctrl, s->io+ES1371_REG_SERIAL_CONTROL); spin_unlock_irqrestore(&s->lock, flags); s->open_mode |= file->f_mode & (FMODE_READ | FMODE_WRITE); - mutex_unlock(&s->open_mutex); - mutex_init(&s->sem); + up(&s->open_sem); + init_MUTEX(&s->sem); return nonseekable_open(inode, file); } @@ -1996,7 +1995,7 @@ static int es1371_release(struct inode *inode, struct file *file) lock_kernel(); if (file->f_mode & FMODE_WRITE) drain_dac2(s, file->f_flags & O_NONBLOCK); - mutex_lock(&s->open_mutex); + down(&s->open_sem); if (file->f_mode & FMODE_WRITE) { stop_dac2(s); dealloc_dmabuf(s, &s->dma_dac2); @@ -2006,7 +2005,7 @@ static int es1371_release(struct inode *inode, struct file *file) dealloc_dmabuf(s, &s->dma_adc); } s->open_mode &= ~(file->f_mode & (FMODE_READ|FMODE_WRITE)); - mutex_unlock(&s->open_mutex); + up(&s->open_sem); wake_up(&s->open_wait); unlock_kernel(); return 0; @@ -2378,21 +2377,21 @@ static int es1371_open_dac(struct inode *inode, struct file *file) return -EINVAL; file->private_data = s; /* wait for device to become free */ - mutex_lock(&s->open_mutex); + down(&s->open_sem); while (s->open_mode & FMODE_DAC) { if (file->f_flags & O_NONBLOCK) { - mutex_unlock(&s->open_mutex); + up(&s->open_sem); return -EBUSY; } add_wait_queue(&s->open_wait, &wait); __set_current_state(TASK_INTERRUPTIBLE); - mutex_unlock(&s->open_mutex); + up(&s->open_sem); schedule(); remove_wait_queue(&s->open_wait, &wait); set_current_state(TASK_RUNNING); if (signal_pending(current)) return -ERESTARTSYS; - mutex_lock(&s->open_mutex); + down(&s->open_sem); } s->dma_dac1.ossfragshift = s->dma_dac1.ossmaxfrags = s->dma_dac1.subdivision = 0; s->dma_dac1.enabled = 1; @@ -2406,7 +2405,7 @@ static int es1371_open_dac(struct inode *inode, struct file *file) outl(s->sctrl, s->io+ES1371_REG_SERIAL_CONTROL); spin_unlock_irqrestore(&s->lock, flags); s->open_mode |= FMODE_DAC; - mutex_unlock(&s->open_mutex); + up(&s->open_sem); return nonseekable_open(inode, file); } @@ -2417,11 +2416,11 @@ static int es1371_release_dac(struct inode *inode, struct file *file) VALIDATE_STATE(s); lock_kernel(); drain_dac1(s, file->f_flags & O_NONBLOCK); - mutex_lock(&s->open_mutex); + down(&s->open_sem); stop_dac1(s); dealloc_dmabuf(s, &s->dma_dac1); s->open_mode &= ~FMODE_DAC; - mutex_unlock(&s->open_mutex); + up(&s->open_sem); wake_up(&s->open_wait); unlock_kernel(); return 0; @@ -2609,21 +2608,21 @@ static int es1371_midi_open(struct inode *inode, struct file *file) VALIDATE_STATE(s); file->private_data = s; /* wait for device to become free */ - mutex_lock(&s->open_mutex); + down(&s->open_sem); while (s->open_mode & (file->f_mode << FMODE_MIDI_SHIFT)) { if (file->f_flags & O_NONBLOCK) { - mutex_unlock(&s->open_mutex); + up(&s->open_sem); return -EBUSY; } add_wait_queue(&s->open_wait, &wait); __set_current_state(TASK_INTERRUPTIBLE); - mutex_unlock(&s->open_mutex); + up(&s->open_sem); schedule(); remove_wait_queue(&s->open_wait, &wait); set_current_state(TASK_RUNNING); if (signal_pending(current)) return -ERESTARTSYS; - mutex_lock(&s->open_mutex); + down(&s->open_sem); } spin_lock_irqsave(&s->lock, flags); if (!(s->open_mode & (FMODE_MIDI_READ | FMODE_MIDI_WRITE))) { @@ -2644,7 +2643,7 @@ static int es1371_midi_open(struct inode *inode, struct file *file) es1371_handle_midi(s); spin_unlock_irqrestore(&s->lock, flags); s->open_mode |= (file->f_mode << FMODE_MIDI_SHIFT) & (FMODE_MIDI_READ | FMODE_MIDI_WRITE); - mutex_unlock(&s->open_mutex); + up(&s->open_sem); return nonseekable_open(inode, file); } @@ -2677,7 +2676,7 @@ static int es1371_midi_release(struct inode *inode, struct file *file) remove_wait_queue(&s->midi.owait, &wait); set_current_state(TASK_RUNNING); } - mutex_lock(&s->open_mutex); + down(&s->open_sem); s->open_mode &= ~((file->f_mode << FMODE_MIDI_SHIFT) & (FMODE_MIDI_READ|FMODE_MIDI_WRITE)); spin_lock_irqsave(&s->lock, flags); if (!(s->open_mode & (FMODE_MIDI_READ | FMODE_MIDI_WRITE))) { @@ -2685,7 +2684,7 @@ static int es1371_midi_release(struct inode *inode, struct file *file) outl(s->ctrl, s->io+ES1371_REG_CONTROL); } spin_unlock_irqrestore(&s->lock, flags); - mutex_unlock(&s->open_mutex); + up(&s->open_sem); wake_up(&s->open_wait); unlock_kernel(); return 0; @@ -2885,7 +2884,7 @@ static int __devinit es1371_probe(struct pci_dev *pcidev, const struct pci_devic init_waitqueue_head(&s->open_wait); init_waitqueue_head(&s->midi.iwait); init_waitqueue_head(&s->midi.owait); - mutex_init(&s->open_mutex); + init_MUTEX(&s->open_sem); spin_lock_init(&s->lock); s->magic = ES1371_MAGIC; s->dev = pcidev; @@ -2905,7 +2904,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, IRQF_SHARED, "es1371",s))) { + if ((res=request_irq(s->irq, es1371_interrupt, SA_SHIRQ, "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 82f40a0a5..849b59f67 100644 --- a/sound/oss/esssolo1.c +++ b/sound/oss/esssolo1.c @@ -105,8 +105,6 @@ #include #include #include -#include - #include #include @@ -193,7 +191,7 @@ struct solo1_state { unsigned ena; spinlock_t lock; - struct mutex open_mutex; + struct semaphore open_sem; mode_t open_mode; wait_queue_head_t open_wait; @@ -1583,7 +1581,7 @@ static int solo1_release(struct inode *inode, struct file *file) lock_kernel(); if (file->f_mode & FMODE_WRITE) drain_dac(s, file->f_flags & O_NONBLOCK); - mutex_lock(&s->open_mutex); + down(&s->open_sem); if (file->f_mode & FMODE_WRITE) { stop_dac(s); outb(0, s->iobase+6); /* disable DMA */ @@ -1597,7 +1595,7 @@ static int solo1_release(struct inode *inode, struct file *file) } s->open_mode &= ~(FMODE_READ | FMODE_WRITE); wake_up(&s->open_wait); - mutex_unlock(&s->open_mutex); + up(&s->open_sem); unlock_kernel(); return 0; } @@ -1626,21 +1624,21 @@ static int solo1_open(struct inode *inode, struct file *file) VALIDATE_STATE(s); file->private_data = s; /* wait for device to become free */ - mutex_lock(&s->open_mutex); + down(&s->open_sem); while (s->open_mode & (FMODE_READ | FMODE_WRITE)) { if (file->f_flags & O_NONBLOCK) { - mutex_unlock(&s->open_mutex); + up(&s->open_sem); return -EBUSY; } add_wait_queue(&s->open_wait, &wait); __set_current_state(TASK_INTERRUPTIBLE); - mutex_unlock(&s->open_mutex); + up(&s->open_sem); schedule(); remove_wait_queue(&s->open_wait, &wait); set_current_state(TASK_RUNNING); if (signal_pending(current)) return -ERESTARTSYS; - mutex_lock(&s->open_mutex); + down(&s->open_sem); } s->fmt = AFMT_U8; s->channels = 1; @@ -1652,7 +1650,7 @@ static int solo1_open(struct inode *inode, struct file *file) s->dma_dac.ossfragshift = s->dma_dac.ossmaxfrags = s->dma_dac.subdivision = 0; s->dma_dac.enabled = 1; s->open_mode |= file->f_mode & (FMODE_READ | FMODE_WRITE); - mutex_unlock(&s->open_mutex); + up(&s->open_sem); prog_codec(s); return nonseekable_open(inode, file); } @@ -1913,21 +1911,21 @@ static int solo1_midi_open(struct inode *inode, struct file *file) VALIDATE_STATE(s); file->private_data = s; /* wait for device to become free */ - mutex_lock(&s->open_mutex); + down(&s->open_sem); while (s->open_mode & (file->f_mode << FMODE_MIDI_SHIFT)) { if (file->f_flags & O_NONBLOCK) { - mutex_unlock(&s->open_mutex); + up(&s->open_sem); return -EBUSY; } add_wait_queue(&s->open_wait, &wait); __set_current_state(TASK_INTERRUPTIBLE); - mutex_unlock(&s->open_mutex); + up(&s->open_sem); schedule(); remove_wait_queue(&s->open_wait, &wait); set_current_state(TASK_RUNNING); if (signal_pending(current)) return -ERESTARTSYS; - mutex_lock(&s->open_mutex); + down(&s->open_sem); } spin_lock_irqsave(&s->lock, flags); if (!(s->open_mode & (FMODE_MIDI_READ | FMODE_MIDI_WRITE))) { @@ -1953,7 +1951,7 @@ static int solo1_midi_open(struct inode *inode, struct file *file) } spin_unlock_irqrestore(&s->lock, flags); s->open_mode |= (file->f_mode << FMODE_MIDI_SHIFT) & (FMODE_MIDI_READ | FMODE_MIDI_WRITE); - mutex_unlock(&s->open_mutex); + up(&s->open_sem); return nonseekable_open(inode, file); } @@ -1987,7 +1985,7 @@ static int solo1_midi_release(struct inode *inode, struct file *file) remove_wait_queue(&s->midi.owait, &wait); set_current_state(TASK_RUNNING); } - mutex_lock(&s->open_mutex); + down(&s->open_sem); s->open_mode &= ~((file->f_mode << FMODE_MIDI_SHIFT) & (FMODE_MIDI_READ|FMODE_MIDI_WRITE)); spin_lock_irqsave(&s->lock, flags); if (!(s->open_mode & (FMODE_MIDI_READ | FMODE_MIDI_WRITE))) { @@ -1996,7 +1994,7 @@ static int solo1_midi_release(struct inode *inode, struct file *file) } spin_unlock_irqrestore(&s->lock, flags); wake_up(&s->open_wait); - mutex_unlock(&s->open_mutex); + up(&s->open_sem); unlock_kernel(); return 0; } @@ -2134,24 +2132,24 @@ static int solo1_dmfm_open(struct inode *inode, struct file *file) VALIDATE_STATE(s); file->private_data = s; /* wait for device to become free */ - mutex_lock(&s->open_mutex); + down(&s->open_sem); while (s->open_mode & FMODE_DMFM) { if (file->f_flags & O_NONBLOCK) { - mutex_unlock(&s->open_mutex); + up(&s->open_sem); return -EBUSY; } add_wait_queue(&s->open_wait, &wait); __set_current_state(TASK_INTERRUPTIBLE); - mutex_unlock(&s->open_mutex); + up(&s->open_sem); schedule(); remove_wait_queue(&s->open_wait, &wait); set_current_state(TASK_RUNNING); if (signal_pending(current)) return -ERESTARTSYS; - mutex_lock(&s->open_mutex); + down(&s->open_sem); } if (!request_region(s->sbbase, FMSYNTH_EXTENT, "ESS Solo1")) { - mutex_unlock(&s->open_mutex); + up(&s->open_sem); printk(KERN_ERR "solo1: FM synth io ports in use, opl3 loaded?\n"); return -EBUSY; } @@ -2163,7 +2161,7 @@ static int solo1_dmfm_open(struct inode *inode, struct file *file) outb(5, s->sbbase+2); outb(1, s->sbbase+3); /* enable OPL3 */ s->open_mode |= FMODE_DMFM; - mutex_unlock(&s->open_mutex); + up(&s->open_sem); return nonseekable_open(inode, file); } @@ -2174,7 +2172,7 @@ static int solo1_dmfm_release(struct inode *inode, struct file *file) VALIDATE_STATE(s); lock_kernel(); - mutex_lock(&s->open_mutex); + down(&s->open_sem); s->open_mode &= ~FMODE_DMFM; for (regb = 0xb0; regb < 0xb9; regb++) { outb(regb, s->sbbase); @@ -2184,7 +2182,7 @@ static int solo1_dmfm_release(struct inode *inode, struct file *file) } release_region(s->sbbase, FMSYNTH_EXTENT); wake_up(&s->open_wait); - mutex_unlock(&s->open_mutex); + up(&s->open_sem); unlock_kernel(); return 0; } @@ -2348,7 +2346,7 @@ static int __devinit solo1_probe(struct pci_dev *pcidev, const struct pci_device /* Recording requires 24-bit DMA, so attempt to set dma mask * to 24 bits first, then 32 bits (playback only) if that fails. */ - if (pci_set_dma_mask(pcidev, DMA_24BIT_MASK) && + if (pci_set_dma_mask(pcidev, 0x00ffffff) && pci_set_dma_mask(pcidev, DMA_32BIT_MASK)) { printk(KERN_WARNING "solo1: architecture does not support 24bit or 32bit PCI busmaster DMA\n"); return -ENODEV; @@ -2364,7 +2362,7 @@ static int __devinit solo1_probe(struct pci_dev *pcidev, const struct pci_device init_waitqueue_head(&s->open_wait); init_waitqueue_head(&s->midi.iwait); init_waitqueue_head(&s->midi.owait); - mutex_init(&s->open_mutex); + init_MUTEX(&s->open_sem); spin_lock_init(&s->lock); s->magic = SOLO1_MAGIC; s->dev = pcidev; @@ -2392,7 +2390,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,IRQF_SHARED,"ESS Solo1",s))) { + if ((ret=request_irq(s->irq,solo1_interrupt,SA_SHIRQ,"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 ea1c0207a..8406bc90c 100644 --- a/sound/oss/forte.c +++ b/sound/oss/forte.c @@ -43,7 +43,6 @@ #include #include -#include #include #include @@ -186,7 +185,7 @@ struct forte_chip { unsigned long iobase; int irq; - struct mutex open_mutex; /* Device access */ + struct semaphore open_sem; /* Device access */ spinlock_t lock; /* State */ spinlock_t ac97_lock; @@ -1243,13 +1242,13 @@ forte_dsp_open (struct inode *inode, struct file *file) struct forte_chip *chip = forte; /* FIXME: HACK FROM HELL! */ if (file->f_flags & O_NONBLOCK) { - if (!mutex_trylock(&chip->open_mutex)) { + if (down_trylock (&chip->open_sem)) { DPRINTK ("%s: returning -EAGAIN\n", __FUNCTION__); return -EAGAIN; } } else { - if (mutex_lock_interruptible(&chip->open_mutex)) { + if (down_interruptible (&chip->open_sem)) { DPRINTK ("%s: returning -ERESTARTSYS\n", __FUNCTION__); return -ERESTARTSYS; } @@ -1303,7 +1302,7 @@ forte_dsp_release (struct inode *inode, struct file *file) spin_unlock_irq (&chip->lock); } - mutex_unlock(&chip->open_mutex); + up (&chip->open_sem); return ret; } @@ -2012,7 +2011,7 @@ forte_probe (struct pci_dev *pci_dev, const struct pci_device_id *pci_id) memset (chip, 0, sizeof (struct forte_chip)); chip->pci_dev = pci_dev; - mutex_init(&chip->open_mutex); + init_MUTEX(&chip->open_sem); spin_lock_init (&chip->lock); spin_lock_init (&chip->ac97_lock); @@ -2026,7 +2025,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, IRQF_SHARED, DRIVER_NAME, + if (request_irq (chip->irq, forte_interrupt, SA_SHIRQ, DRIVER_NAME, chip)) { printk (KERN_WARNING PFX "Unable to reserve IRQ"); ret = -EIO; @@ -2035,9 +2034,8 @@ 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%16llX IRQ %u\n", - chip->iobase, (unsigned long long)pci_resource_end (pci_dev, 0), - chip->irq); + 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); /* Power it up */ if ((ret = forte_chip_init (chip)) == 0) diff --git a/sound/oss/hal2.c b/sound/oss/hal2.c index 80ab402da..afe97c4ce 100644 --- a/sound/oss/hal2.c +++ b/sound/oss/hal2.c @@ -32,8 +32,6 @@ #include #include #include -#include - #include #include @@ -94,7 +92,7 @@ struct hal2_codec { wait_queue_head_t dma_wait; spinlock_t lock; - struct mutex sem; + struct semaphore sem; int usecount; /* recording and playback are * independent */ @@ -1180,7 +1178,7 @@ static ssize_t hal2_read(struct file *file, char *buffer, if (!count) return 0; - if (mutex_lock_interruptible(&adc->sem)) + if (down_interruptible(&adc->sem)) return -EINTR; if (file->f_flags & O_NONBLOCK) { err = hal2_get_buffer(hal2, buffer, count); @@ -1219,7 +1217,7 @@ static ssize_t hal2_read(struct file *file, char *buffer, } } while (count > 0 && err >= 0); } - mutex_unlock(&adc->sem); + up(&adc->sem); return err; } @@ -1234,7 +1232,7 @@ static ssize_t hal2_write(struct file *file, const char *buffer, if (!count) return 0; - if (mutex_lock_interruptible(&dac->sem)) + if (down_interruptible(&dac->sem)) return -EINTR; if (file->f_flags & O_NONBLOCK) { err = hal2_add_buffer(hal2, buf, count); @@ -1273,7 +1271,7 @@ static ssize_t hal2_write(struct file *file, const char *buffer, } } while (count > 0 && err >= 0); } - mutex_unlock(&dac->sem); + up(&dac->sem); return err; } @@ -1358,20 +1356,20 @@ static int hal2_release(struct inode *inode, struct file *file) if (file->f_mode & FMODE_READ) { struct hal2_codec *adc = &hal2->adc; - mutex_lock(&adc->sem); + down(&adc->sem); hal2_stop_adc(hal2); hal2_free_adc_dmabuf(adc); adc->usecount--; - mutex_unlock(&adc->sem); + up(&adc->sem); } if (file->f_mode & FMODE_WRITE) { struct hal2_codec *dac = &hal2->dac; - mutex_lock(&dac->sem); + down(&dac->sem); hal2_sync_dac(hal2); hal2_free_dac_dmabuf(dac); dac->usecount--; - mutex_unlock(&dac->sem); + up(&dac->sem); } return 0; @@ -1402,7 +1400,7 @@ static void hal2_init_codec(struct hal2_codec *codec, struct hpc3_regs *hpc3, codec->pbus.pbusnr = index; codec->pbus.pbus = &hpc3->pbdma[index]; init_waitqueue_head(&codec->dma_wait); - mutex_init(&codec->sem); + init_MUTEX(&codec->sem); spin_lock_init(&codec->lock); } @@ -1479,7 +1477,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, IRQF_SHARED, + if (request_irq(SGI_HPCDMA_IRQ, hal2_interrupt, SA_SHIRQ, 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 ddcddc234..abc242abd 100644 --- a/sound/oss/i810_audio.c +++ b/sound/oss/i810_audio.c @@ -100,8 +100,6 @@ #include #include #include -#include - #include #define DRIVER_VERSION "1.01" @@ -333,7 +331,7 @@ struct i810_state { struct i810_card *card; /* Card info */ /* single open lock mechanism, only used for recording */ - struct mutex open_mutex; + struct semaphore open_sem; wait_queue_head_t open_wait; /* file mode */ @@ -2599,7 +2597,7 @@ found_virt: state->card = card; state->magic = I810_STATE_MAGIC; init_waitqueue_head(&dmabuf->wait); - mutex_init(&state->open_mutex); + init_MUTEX(&state->open_sem); file->private_data = state; dmabuf->trigger = 0; @@ -3215,7 +3213,7 @@ static void __devinit i810_configure_clocking (void) state->card = card; state->magic = I810_STATE_MAGIC; init_waitqueue_head(&dmabuf->wait); - mutex_init(&state->open_mutex); + init_MUTEX(&state->open_sem); dmabuf->fmt = I810_FMT_STEREO | I810_FMT_16BIT; dmabuf->trigger = PCM_ENABLE_OUTPUT; i810_set_spdif_output(state, -1, 0); @@ -3413,7 +3411,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, IRQF_SHARED, + if (request_irq(card->irq, &i810_interrupt, SA_SHIRQ, 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 68aab3605..8fd2f9a9e 100644 --- a/sound/oss/ite8172.c +++ b/sound/oss/ite8172.c @@ -71,8 +71,6 @@ #include #include #include -#include - #include #include #include @@ -306,7 +304,7 @@ struct it8172_state { unsigned dacrate, adcrate; spinlock_t lock; - struct mutex open_mutex; + struct semaphore open_sem; mode_t open_mode; wait_queue_head_t open_wait; @@ -1803,21 +1801,21 @@ static int it8172_open(struct inode *inode, struct file *file) } file->private_data = s; /* wait for device to become free */ - mutex_lock(&s->open_mutex); + down(&s->open_sem); while (s->open_mode & file->f_mode) { if (file->f_flags & O_NONBLOCK) { - mutex_unlock(&s->open_mutex); + up(&s->open_sem); return -EBUSY; } add_wait_queue(&s->open_wait, &wait); __set_current_state(TASK_INTERRUPTIBLE); - mutex_unlock(&s->open_mutex); + up(&s->open_sem); schedule(); remove_wait_queue(&s->open_wait, &wait); set_current_state(TASK_RUNNING); if (signal_pending(current)) return -ERESTARTSYS; - mutex_lock(&s->open_mutex); + down(&s->open_sem); } spin_lock_irqsave(&s->lock, flags); @@ -1852,7 +1850,7 @@ static int it8172_open(struct inode *inode, struct file *file) spin_unlock_irqrestore(&s->lock, flags); s->open_mode |= (file->f_mode & (FMODE_READ | FMODE_WRITE)); - mutex_unlock(&s->open_mutex); + up(&s->open_sem); return nonseekable_open(inode, file); } @@ -1866,7 +1864,7 @@ static int it8172_release(struct inode *inode, struct file *file) lock_kernel(); if (file->f_mode & FMODE_WRITE) drain_dac(s, file->f_flags & O_NONBLOCK); - mutex_lock(&s->open_mutex); + down(&s->open_sem); if (file->f_mode & FMODE_WRITE) { stop_dac(s); dealloc_dmabuf(s, &s->dma_dac); @@ -1876,7 +1874,7 @@ static int it8172_release(struct inode *inode, struct file *file) dealloc_dmabuf(s, &s->dma_adc); } s->open_mode &= ((~file->f_mode) & (FMODE_READ|FMODE_WRITE)); - mutex_unlock(&s->open_mutex); + up(&s->open_sem); wake_up(&s->open_wait); unlock_kernel(); return 0; @@ -1968,9 +1966,9 @@ static int i2s_fmt[NR_DEVICE]; static unsigned int devindex; -module_param_array(spdif, int, NULL, 0); +MODULE_PARM(spdif, "1-" __MODULE_STRING(NR_DEVICE) "i"); MODULE_PARM_DESC(spdif, "if 1 the S/PDIF digital output is enabled"); -module_param_array(i2s_fmt, int, NULL, 0); +MODULE_PARM(i2s_fmt, "1-" __MODULE_STRING(NR_DEVICE) "i"); MODULE_PARM_DESC(i2s_fmt, "the format of I2S"); MODULE_AUTHOR("Monta Vista Software, stevel@mvista.com"); @@ -1999,7 +1997,7 @@ static int __devinit it8172_probe(struct pci_dev *pcidev, init_waitqueue_head(&s->dma_adc.wait); init_waitqueue_head(&s->dma_dac.wait); init_waitqueue_head(&s->open_wait); - mutex_init(&s->open_mutex); + init_MUTEX(&s->open_sem); spin_lock_init(&s->lock); s->dev = pcidev; s->io = pci_resource_start(pcidev, 0); @@ -2019,7 +2017,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, IRQF_DISABLED, + if (request_irq(s->irq, it8172_interrupt, SA_INTERRUPT, 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 12e7b3038..2835a7c03 100644 --- a/sound/oss/kahlua.c +++ b/sound/oss/kahlua.c @@ -27,6 +27,7 @@ * same manner. */ +#include #include #include #include diff --git a/sound/oss/maestro.c b/sound/oss/maestro.c index 1d98d100d..d4b569acf 100644 --- a/sound/oss/maestro.c +++ b/sound/oss/maestro.c @@ -223,8 +223,6 @@ #include #include #include -#include - #include #include @@ -399,7 +397,7 @@ struct ess_state { /* this locks around the oss state in the driver */ spinlock_t lock; /* only let 1 be opening at a time */ - struct mutex open_mutex; + struct semaphore open_sem; wait_queue_head_t open_wait; mode_t open_mode; @@ -3022,26 +3020,26 @@ ess_open(struct inode *inode, struct file *file) VALIDATE_STATE(s); file->private_data = s; /* wait for device to become free */ - mutex_lock(&s->open_mutex); + down(&s->open_sem); while (s->open_mode & file->f_mode) { if (file->f_flags & O_NONBLOCK) { - mutex_unlock(&s->open_mutex); + up(&s->open_sem); return -EWOULDBLOCK; } - mutex_unlock(&s->open_mutex); + up(&s->open_sem); interruptible_sleep_on(&s->open_wait); if (signal_pending(current)) return -ERESTARTSYS; - mutex_lock(&s->open_mutex); + down(&s->open_sem); } /* under semaphore.. */ if ((s->card->dmapages==NULL) && allocate_buffers(s)) { - mutex_unlock(&s->open_mutex); + up(&s->open_sem); return -ENOMEM; } - /* we're covered by the open_mutex */ + /* we're covered by the open_sem */ if( ! s->card->dsps_open ) { maestro_power(s->card,ACPI_D0); start_bob(s); @@ -3078,7 +3076,7 @@ ess_open(struct inode *inode, struct file *file) set_fmt(s, fmtm, fmts); s->open_mode |= file->f_mode & (FMODE_READ | FMODE_WRITE); - mutex_unlock(&s->open_mutex); + up(&s->open_sem); return nonseekable_open(inode, file); } @@ -3091,7 +3089,7 @@ ess_release(struct inode *inode, struct file *file) lock_kernel(); if (file->f_mode & FMODE_WRITE) drain_dac(s, file->f_flags & O_NONBLOCK); - mutex_lock(&s->open_mutex); + down(&s->open_sem); if (file->f_mode & FMODE_WRITE) { stop_dac(s); } @@ -3100,7 +3098,7 @@ ess_release(struct inode *inode, struct file *file) } s->open_mode &= (~file->f_mode) & (FMODE_READ|FMODE_WRITE); - /* we're covered by the open_mutex */ + /* we're covered by the open_sem */ M_printk("maestro: %d dsps now alive\n",s->card->dsps_open-1); if( --s->card->dsps_open <= 0) { s->card->dsps_open = 0; @@ -3108,7 +3106,7 @@ ess_release(struct inode *inode, struct file *file) free_buffers(s); maestro_power(s->card,ACPI_D2); } - mutex_unlock(&s->open_mutex); + up(&s->open_sem); wake_up(&s->open_wait); unlock_kernel(); return 0; @@ -3468,7 +3466,7 @@ maestro_probe(struct pci_dev *pcidev,const struct pci_device_id *pdid) init_waitqueue_head(&s->dma_dac.wait); init_waitqueue_head(&s->open_wait); spin_lock_init(&s->lock); - mutex_init(&s->open_mutex); + init_MUTEX(&s->open_sem); s->magic = ESS_STATE_MAGIC; s->apu[0] = 6*i; @@ -3545,7 +3543,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, IRQF_SHARED, card_names[card_type], card))) + if((ret=request_irq(card->irq, ess_interrupt, SA_SHIRQ, 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 5548e3cff..f3dec70fc 100644 --- a/sound/oss/maestro3.c +++ b/sound/oss/maestro3.c @@ -144,8 +144,6 @@ #include #include #include -#include - #include #include @@ -207,7 +205,7 @@ struct m3_state { when irqhandler uses s->lock and m3_assp_read uses card->lock ? */ - struct mutex open_mutex; + struct semaphore open_sem; wait_queue_head_t open_wait; mode_t open_mode; @@ -2015,17 +2013,17 @@ static int m3_open(struct inode *inode, struct file *file) file->private_data = s; /* wait for device to become free */ - mutex_lock(&s->open_mutex); + down(&s->open_sem); while (s->open_mode & file->f_mode) { if (file->f_flags & O_NONBLOCK) { - mutex_unlock(&s->open_mutex); + up(&s->open_sem); return -EWOULDBLOCK; } - mutex_unlock(&s->open_mutex); + up(&s->open_sem); interruptible_sleep_on(&s->open_wait); if (signal_pending(current)) return -ERESTARTSYS; - mutex_lock(&s->open_mutex); + down(&s->open_sem); } spin_lock_irqsave(&c->lock, flags); @@ -2049,7 +2047,7 @@ static int m3_open(struct inode *inode, struct file *file) set_fmt(s, fmtm, fmts); s->open_mode |= file->f_mode & (FMODE_READ | FMODE_WRITE); - mutex_unlock(&s->open_mutex); + up(&s->open_sem); spin_unlock_irqrestore(&c->lock, flags); return nonseekable_open(inode, file); } @@ -2064,7 +2062,7 @@ static int m3_release(struct inode *inode, struct file *file) if (file->f_mode & FMODE_WRITE) drain_dac(s, file->f_flags & O_NONBLOCK); - mutex_lock(&s->open_mutex); + down(&s->open_sem); spin_lock_irqsave(&card->lock, flags); if (file->f_mode & FMODE_WRITE) { @@ -2085,7 +2083,7 @@ static int m3_release(struct inode *inode, struct file *file) s->open_mode &= (~file->f_mode) & (FMODE_READ|FMODE_WRITE); spin_unlock_irqrestore(&card->lock, flags); - mutex_unlock(&s->open_mutex); + up(&s->open_sem); wake_up(&s->open_wait); return 0; @@ -2582,9 +2580,15 @@ static int alloc_dsp_suspendmem(struct m3_card *card) return 0; } +static void free_dsp_suspendmem(struct m3_card *card) +{ + if(card->suspend_mem) + vfree(card->suspend_mem); +} #else #define alloc_dsp_suspendmem(args...) 0 +#define free_dsp_suspendmem(args...) #endif /* @@ -2675,7 +2679,7 @@ static int __devinit m3_probe(struct pci_dev *pci_dev, const struct pci_device_i init_waitqueue_head(&s->dma_adc.wait); init_waitqueue_head(&s->dma_dac.wait); init_waitqueue_head(&s->open_wait); - mutex_init(&(s->open_mutex)); + init_MUTEX(&(s->open_sem)); s->magic = M3_STATE_MAGIC; m3_assp_client_init(s); @@ -2694,7 +2698,7 @@ static int __devinit m3_probe(struct pci_dev *pci_dev, const struct pci_device_i } } - if(request_irq(card->irq, m3_interrupt, IRQF_SHARED, card_names[card->card_type], card)) { + if(request_irq(card->irq, m3_interrupt, SA_SHIRQ, card_names[card->card_type], card)) { printk(KERN_ERR PFX "unable to allocate irq %d,\n", card->irq); @@ -2711,7 +2715,7 @@ out: if(ret) { if(card->iobase) release_region(pci_resource_start(pci_dev, 0), pci_resource_len(pci_dev, 0)); - vfree(card->suspend_mem); + free_dsp_suspendmem(card); if(card->ac97) { unregister_sound_mixer(card->ac97->dev_mixer); kfree(card->ac97); @@ -2754,7 +2758,7 @@ static void m3_remove(struct pci_dev *pci_dev) } release_region(card->iobase, 256); - vfree(card->suspend_mem); + free_dsp_suspendmem(card); kfree(card); } devs = NULL; diff --git a/sound/oss/msnd.c b/sound/oss/msnd.c index ba38d6200..a7ad2b0a2 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 msnd_register(multisound_dev_t *dev) +int __init msnd_register(multisound_dev_t *dev) { int i; @@ -95,8 +95,10 @@ void msnd_fifo_init(msnd_fifo *f) void msnd_fifo_free(msnd_fifo *f) { - vfree(f->data); - f->data = NULL; + if (f->data) { + vfree(f->data); + f->data = NULL; + } } int msnd_fifo_alloc(msnd_fifo *f, size_t n) diff --git a/sound/oss/msnd_classic.h b/sound/oss/msnd_classic.h index 7ffea5267..83c3c46ff 100644 --- a/sound/oss/msnd_classic.h +++ b/sound/oss/msnd_classic.h @@ -30,6 +30,7 @@ #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 6d7763dae..0c2db657b 100644 --- a/sound/oss/msnd_pinnacle.c +++ b/sound/oss/msnd_pinnacle.c @@ -39,6 +39,7 @@ ********************************************************************/ #include +#include #include #include #include diff --git a/sound/oss/msnd_pinnacle.h b/sound/oss/msnd_pinnacle.h index cce911487..e85aef4a5 100644 --- a/sound/oss/msnd_pinnacle.h +++ b/sound/oss/msnd_pinnacle.h @@ -30,6 +30,7 @@ #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 6f7f2f042..fbb9170e8 100644 --- a/sound/oss/nec_vrc5477.c +++ b/sound/oss/nec_vrc5477.c @@ -78,8 +78,6 @@ #include #include #include -#include - #include #include #include @@ -200,7 +198,7 @@ struct vrc5477_ac97_state { unsigned short extended_status; spinlock_t lock; - struct mutex open_mutex; + struct semaphore open_sem; mode_t open_mode; wait_queue_head_t open_wait; @@ -1619,22 +1617,22 @@ static int vrc5477_ac97_open(struct inode *inode, struct file *file) file->private_data = s; /* wait for device to become free */ - mutex_lock(&s->open_mutex); + down(&s->open_sem); while (s->open_mode & file->f_mode) { if (file->f_flags & O_NONBLOCK) { - mutex_unlock(&s->open_mutex); + up(&s->open_sem); return -EBUSY; } add_wait_queue(&s->open_wait, &wait); __set_current_state(TASK_INTERRUPTIBLE); - mutex_unlock(&s->open_mutex); + up(&s->open_sem); schedule(); remove_wait_queue(&s->open_wait, &wait); set_current_state(TASK_RUNNING); if (signal_pending(current)) return -ERESTARTSYS; - mutex_lock(&s->open_mutex); + down(&s->open_sem); } spin_lock_irqsave(&s->lock, flags); @@ -1661,7 +1659,7 @@ static int vrc5477_ac97_open(struct inode *inode, struct file *file) bailout: spin_unlock_irqrestore(&s->lock, flags); - mutex_unlock(&s->open_mutex); + up(&s->open_sem); return ret; } @@ -1673,7 +1671,7 @@ static int vrc5477_ac97_release(struct inode *inode, struct file *file) lock_kernel(); if (file->f_mode & FMODE_WRITE) drain_dac(s, file->f_flags & O_NONBLOCK); - mutex_lock(&s->open_mutex); + down(&s->open_sem); if (file->f_mode & FMODE_WRITE) { stop_dac(s); dealloc_dmabuf(s, &s->dma_dac); @@ -1683,7 +1681,7 @@ static int vrc5477_ac97_release(struct inode *inode, struct file *file) dealloc_dmabuf(s, &s->dma_adc); } s->open_mode &= (~file->f_mode) & (FMODE_READ|FMODE_WRITE); - mutex_unlock(&s->open_mutex); + up(&s->open_sem); wake_up(&s->open_wait); unlock_kernel(); return 0; @@ -1869,7 +1867,7 @@ static int __devinit vrc5477_ac97_probe(struct pci_dev *pcidev, init_waitqueue_head(&s->dma_adc.wait); init_waitqueue_head(&s->dma_dac.wait); init_waitqueue_head(&s->open_wait); - mutex_init(&s->open_mutex); + init_MUTEX(&s->open_sem); spin_lock_init(&s->lock); s->dev = pcidev; @@ -1909,7 +1907,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, IRQF_DISABLED, + if (request_irq(s->irq, vrc5477_ac97_interrupt, SA_INTERRUPT, 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 7760dddf2..7de079b20 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, IRQF_SHARED, + if (request_irq (card->irq, card->introutine, SA_SHIRQ, "NM256_audio", card) < 0) { printk (KERN_ERR "NM256: can't obtain IRQ %d\n", card->irq); return -1; @@ -960,7 +960,7 @@ static struct ac97_mixer_value_list mixer_defaults[] = { /* Installs the AC97 mixer into CARD. */ -static int __devinit +static int __init nm256_install_mixer (struct nm256_info *card) { int mixer; @@ -995,7 +995,7 @@ nm256_install_mixer (struct nm256_info *card) * RAM. */ -static void __devinit +static void __init nm256_peek_for_sig (struct nm256_info *card) { u32 port1offset @@ -1056,7 +1056,7 @@ nm256_install(struct pci_dev *pcidev, enum nm256rev rev, char *verstr) card->playing = 0; card->recording = 0; card->rev = rev; - spin_lock_init(&card->lock); + spin_lock_init(&card->lock); /* Init the memory port info. */ for (x = 0; x < 2; x++) { diff --git a/sound/oss/opl3sa2.c b/sound/oss/opl3sa2.c index aec05a2bf..0e161c6a0 100644 --- a/sound/oss/opl3sa2.c +++ b/sound/oss/opl3sa2.c @@ -64,6 +64,7 @@ * */ +#include #include #include #include diff --git a/sound/oss/pas2_card.c b/sound/oss/pas2_card.c index 97666007b..c9696dc9f 100644 --- a/sound/oss/pas2_card.c +++ b/sound/oss/pas2_card.c @@ -4,6 +4,7 @@ * 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 37ee234b5..a617ccb40 100644 --- a/sound/oss/pss.c +++ b/sound/oss/pss.c @@ -57,6 +57,7 @@ */ +#include #include #include #include diff --git a/sound/oss/rme96xx.c b/sound/oss/rme96xx.c index f17d25b6f..faa0b7919 100644 --- a/sound/oss/rme96xx.c +++ b/sound/oss/rme96xx.c @@ -58,7 +58,6 @@ TODO: #include #include #include -#include #include #include @@ -327,7 +326,7 @@ typedef struct _rme96xx_info { /* waiting and locking */ wait_queue_head_t wait; - struct mutex open_mutex; + struct semaphore open_sem; wait_queue_head_t open_wait; } dma[RME96xx_MAX_DEVS]; @@ -843,7 +842,7 @@ static void busmaster_free(void* ptr,int size) { static int rme96xx_dmabuf_init(rme96xx_info * s,struct dmabuf* dma,int ioffset,int ooffset) { - mutex_init(&dma->open_mutex); + init_MUTEX(&dma->open_sem); init_waitqueue_head(&dma->open_wait); init_waitqueue_head(&dma->wait); dma->s = s; @@ -994,7 +993,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, IRQF_SHARED, "rme96xx", s)) { + if (request_irq(s->irq, rme96xx_interrupt, SA_SHIRQ, "rme96xx", s)) { printk(KERN_ERR RME_MESS" irq %u in use\n", s->irq); goto err_irq; } @@ -1470,21 +1469,21 @@ static int rme96xx_open(struct inode *in, struct file *f) dma = &s->dma[devnum]; f->private_data = dma; /* wait for device to become free */ - mutex_lock(&dma->open_mutex); + down(&dma->open_sem); while (dma->open_mode & f->f_mode) { if (f->f_flags & O_NONBLOCK) { - mutex_unlock(&dma->open_mutex); + up(&dma->open_sem); return -EBUSY; } add_wait_queue(&dma->open_wait, &wait); __set_current_state(TASK_INTERRUPTIBLE); - mutex_unlock(&dma->open_mutex); + up(&dma->open_sem); schedule(); remove_wait_queue(&dma->open_wait, &wait); set_current_state(TASK_RUNNING); if (signal_pending(current)) return -ERESTARTSYS; - mutex_lock(&dma->open_mutex); + down(&dma->open_sem); } COMM ("hardware open") @@ -1493,7 +1492,7 @@ static int rme96xx_open(struct inode *in, struct file *f) dma->open_mode |= (f->f_mode & (FMODE_READ | FMODE_WRITE)); dma->opened = 1; - mutex_unlock(&dma->open_mutex); + up(&dma->open_sem); DBG(printk("device num %d open finished\n",devnum)); return 0; @@ -1525,7 +1524,7 @@ static int rme96xx_release(struct inode *in, struct file *file) } wake_up(&dma->open_wait); - mutex_unlock(&dma->open_mutex); + up(&dma->open_sem); return 0; } diff --git a/sound/oss/sb_card.c b/sound/oss/sb_card.c index 8666291c0..680b82e15 100644 --- a/sound/oss/sb_card.c +++ b/sound/oss/sb_card.c @@ -22,6 +22,7 @@ * 02-07-2003 Bug made it into first release. Take two. */ +#include #include #include #include @@ -51,7 +52,6 @@ static int __initdata sm_games = 0; /* Logitech soundman games? */ static struct sb_card_config *legacy = NULL; #ifdef CONFIG_PNP -static int pnp_registered; static int __initdata pnp = 1; /* static int __initdata uart401 = 0; @@ -133,7 +133,7 @@ static void sb_unload(struct sb_card_config *scc) } /* Register legacy card with OSS subsystem */ -static int __init sb_init_legacy(void) +static int sb_init_legacy(void) { struct sb_module_options sbmo = {0}; @@ -234,8 +234,6 @@ static void sb_dev2cfg(struct pnp_dev *dev, struct sb_card_config *scc) } } -static unsigned int sb_pnp_devices; - /* Probe callback function for the PnP API */ static int sb_pnp_probe(struct pnp_card_link *card, const struct pnp_card_device_id *card_id) { @@ -266,7 +264,6 @@ static int sb_pnp_probe(struct pnp_card_link *card, const struct pnp_card_device scc->conf.dma, scc->conf.dma2); pnp_set_card_drvdata(card, scc); - sb_pnp_devices++; return sb_register_oss(scc, &sbmo); } @@ -292,14 +289,6 @@ static struct pnp_card_driver sb_pnp_driver = { MODULE_DEVICE_TABLE(pnp_card, sb_pnp_card_table); #endif /* CONFIG_PNP */ -static void __init_or_module sb_unregister_all(void) -{ -#ifdef CONFIG_PNP - if (pnp_registered) - pnp_unregister_card_driver(&sb_pnp_driver); -#endif -} - static int __init sb_init(void) { int lres = 0; @@ -318,18 +307,17 @@ static int __init sb_init(void) #ifdef CONFIG_PNP if(pnp) { - int err = pnp_register_card_driver(&sb_pnp_driver); - if (!err) - pnp_registered = 1; - pres = sb_pnp_devices; + pres = pnp_register_card_driver(&sb_pnp_driver); } #endif printk(KERN_INFO "sb: Init: Done\n"); /* If either PnP or Legacy registered a card then return * success */ - if (pres == 0 && lres <= 0) { - sb_unregister_all(); + if (pres <= 0 && lres <= 0) { +#ifdef CONFIG_PNP + pnp_unregister_card_driver(&sb_pnp_driver); +#endif return -ENODEV; } return 0; @@ -345,10 +333,14 @@ static void __exit sb_exit(void) sb_unload(legacy); } - sb_unregister_all(); +#ifdef CONFIG_PNP + pnp_unregister_card_driver(&sb_pnp_driver); +#endif - vfree(smw_free); - smw_free = NULL; + if (smw_free) { + vfree(smw_free); + smw_free = NULL; + } } module_init(sb_init); diff --git a/sound/oss/sb_common.c b/sound/oss/sb_common.c index 35bab6e2f..5f955e3d2 100644 --- a/sound/oss/sb_common.c +++ b/sound/oss/sb_common.c @@ -26,6 +26,7 @@ * Chris Rankin */ +#include #include #include #include @@ -677,7 +678,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)?IRQF_SHARED:0; + int i=(devc->caps&SB_PCI_IRQ)?SA_SHIRQ: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 180e95c87..fae05fe3d 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. Interesting ones are 0x7f, 0x7d and 0x7a. They are - * related to the Audio 2 channel. I also was surprised about the consequences + * 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 * 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 - * 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. + * 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. * Well, the assumption about ES1869 was wrong: register 0x70 is very much - * like register 0xa1, except that bit 7 is always 1, whatever you want + * like register 0xa1, except that bit 7 is allways 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 operational, 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 operation, and uses the + * same dma as audio 1: your ess changes into a funny echo machine. * - * Received the news that ES1688 is detected as a ES1788. Did some thinking: + * Received the new 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. Its aim is to identify ES1887, but + * a (preliminary ??) datasheet on ES1887. It's 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 - * its recording level was loud, and it couldn't be changed. The fact that + * it's 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 - * its value was restored every time the chip was reset; this reset the + * it's 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 - * recording level can also be controlled by RECLEV as described above. + * recordig 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/sb_mixer.c b/sound/oss/sb_mixer.c index ccb21d48d..f56898c39 100644 --- a/sound/oss/sb_mixer.c +++ b/sound/oss/sb_mixer.c @@ -273,14 +273,14 @@ int sb_common_mixer_set(sb_devc * devc, int dev, int left, int right) int regoffs; unsigned char val; - if ((dev < 0) || (dev >= devc->iomap_sz)) - return -EINVAL; - regoffs = (*devc->iomap)[dev][LEFT_CHN].regno; if (regoffs == 0) return -EINVAL; + if ((dev < 0) || (dev >= devc->iomap_sz)) + return -EINVAL; + val = sb_getmixer(devc, regoffs); change_bits(devc, &val, dev, LEFT_CHN, left); diff --git a/sound/oss/sequencer.c b/sound/oss/sequencer.c index 6815c30e0..698614226 100644 --- a/sound/oss/sequencer.c +++ b/sound/oss/sequencer.c @@ -709,11 +709,11 @@ static void seq_local_event(unsigned char *event_rec) static void seq_sysex_message(unsigned char *event_rec) { - unsigned int dev = event_rec[1]; + int dev = event_rec[1]; int i, l = 0; unsigned char *buf = &event_rec[2]; - if (dev > max_synthdev) + if ((int) dev > max_synthdev) return; if (!(synth_open_mask & (1 << dev))) return; @@ -1671,7 +1671,14 @@ void sequencer_init(void) void sequencer_unload(void) { - vfree(queue); - vfree(iqueue); - queue = iqueue = NULL; + if(queue) + { + vfree(queue); + queue=NULL; + } + if(iqueue) + { + vfree(iqueue); + iqueue=NULL; + } } diff --git a/sound/oss/sh_dac_audio.c b/sound/oss/sh_dac_audio.c index 7b168d85f..8a9917c91 100644 --- a/sound/oss/sh_dac_audio.c +++ b/sound/oss/sh_dac_audio.c @@ -1,3 +1,4 @@ +#include #include #include #include @@ -288,7 +289,7 @@ static int __init dac_audio_init(void) in_use = 0; - data_buffer = kmalloc(BUFFER_SIZE, GFP_KERNEL); + data_buffer = (char *)kmalloc(BUFFER_SIZE, GFP_KERNEL); if (data_buffer == NULL) return -ENOMEM; @@ -297,7 +298,7 @@ static int __init dac_audio_init(void) dac_audio_set_rate(); retval = - request_irq(TIMER1_IRQ, timer1_interrupt, IRQF_DISABLED, MODNAME, 0); + request_irq(TIMER1_IRQ, timer1_interrupt, SA_INTERRUPT, 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 8ea532d40..71b05e2f6 100644 --- a/sound/oss/sonicvibes.c +++ b/sound/oss/sonicvibes.c @@ -116,9 +116,6 @@ #include #include #include -#include -#include - #include #include @@ -331,7 +328,7 @@ struct sv_state { unsigned char fmt, enable; spinlock_t lock; - struct mutex open_mutex; + struct semaphore open_sem; mode_t open_mode; wait_queue_head_t open_wait; @@ -408,6 +405,24 @@ static inline unsigned ld2(unsigned int x) return r; } +/* + * hweightN: returns the hamming weight (i.e. the number + * of bits set) of a N-bit word + */ + +#ifdef hweight32 +#undef hweight32 +#endif + +static inline unsigned int hweight32(unsigned int w) +{ + unsigned int res = (w & 0x55555555) + ((w >> 1) & 0x55555555); + res = (res & 0x33333333) + ((res >> 2) & 0x33333333); + res = (res & 0x0F0F0F0F) + ((res >> 4) & 0x0F0F0F0F); + res = (res & 0x00FF00FF) + ((res >> 8) & 0x00FF00FF); + return (res & 0x0000FFFF) + ((res >> 16) & 0x0000FFFF); +} + /* --------------------------------------------------------------------- */ /* @@ -1907,21 +1922,21 @@ static int sv_open(struct inode *inode, struct file *file) VALIDATE_STATE(s); file->private_data = s; /* wait for device to become free */ - mutex_lock(&s->open_mutex); + down(&s->open_sem); while (s->open_mode & file->f_mode) { if (file->f_flags & O_NONBLOCK) { - mutex_unlock(&s->open_mutex); + up(&s->open_sem); return -EBUSY; } add_wait_queue(&s->open_wait, &wait); __set_current_state(TASK_INTERRUPTIBLE); - mutex_unlock(&s->open_mutex); + up(&s->open_sem); schedule(); remove_wait_queue(&s->open_wait, &wait); set_current_state(TASK_RUNNING); if (signal_pending(current)) return -ERESTARTSYS; - mutex_lock(&s->open_mutex); + down(&s->open_sem); } if (file->f_mode & FMODE_READ) { fmtm &= ~((SV_CFMT_STEREO | SV_CFMT_16BIT) << SV_CFMT_CSHIFT); @@ -1941,7 +1956,7 @@ static int sv_open(struct inode *inode, struct file *file) } set_fmt(s, fmtm, fmts); s->open_mode |= file->f_mode & (FMODE_READ | FMODE_WRITE); - mutex_unlock(&s->open_mutex); + up(&s->open_sem); return nonseekable_open(inode, file); } @@ -1953,7 +1968,7 @@ static int sv_release(struct inode *inode, struct file *file) lock_kernel(); if (file->f_mode & FMODE_WRITE) drain_dac(s, file->f_flags & O_NONBLOCK); - mutex_lock(&s->open_mutex); + down(&s->open_sem); if (file->f_mode & FMODE_WRITE) { stop_dac(s); dealloc_dmabuf(s, &s->dma_dac); @@ -1964,7 +1979,7 @@ static int sv_release(struct inode *inode, struct file *file) } s->open_mode &= ~(file->f_mode & (FMODE_READ|FMODE_WRITE)); wake_up(&s->open_wait); - mutex_unlock(&s->open_mutex); + up(&s->open_sem); unlock_kernel(); return 0; } @@ -2152,21 +2167,21 @@ static int sv_midi_open(struct inode *inode, struct file *file) VALIDATE_STATE(s); file->private_data = s; /* wait for device to become free */ - mutex_lock(&s->open_mutex); + down(&s->open_sem); while (s->open_mode & (file->f_mode << FMODE_MIDI_SHIFT)) { if (file->f_flags & O_NONBLOCK) { - mutex_unlock(&s->open_mutex); + up(&s->open_sem); return -EBUSY; } add_wait_queue(&s->open_wait, &wait); __set_current_state(TASK_INTERRUPTIBLE); - mutex_unlock(&s->open_mutex); + up(&s->open_sem); schedule(); remove_wait_queue(&s->open_wait, &wait); set_current_state(TASK_RUNNING); if (signal_pending(current)) return -ERESTARTSYS; - mutex_lock(&s->open_mutex); + down(&s->open_sem); } spin_lock_irqsave(&s->lock, flags); if (!(s->open_mode & (FMODE_MIDI_READ | FMODE_MIDI_WRITE))) { @@ -2195,7 +2210,7 @@ static int sv_midi_open(struct inode *inode, struct file *file) } spin_unlock_irqrestore(&s->lock, flags); s->open_mode |= (file->f_mode << FMODE_MIDI_SHIFT) & (FMODE_MIDI_READ | FMODE_MIDI_WRITE); - mutex_unlock(&s->open_mutex); + up(&s->open_sem); return nonseekable_open(inode, file); } @@ -2233,7 +2248,7 @@ static int sv_midi_release(struct inode *inode, struct file *file) remove_wait_queue(&s->midi.owait, &wait); set_current_state(TASK_RUNNING); } - mutex_lock(&s->open_mutex); + down(&s->open_sem); s->open_mode &= ~((file->f_mode << FMODE_MIDI_SHIFT) & (FMODE_MIDI_READ|FMODE_MIDI_WRITE)); spin_lock_irqsave(&s->lock, flags); if (!(s->open_mode & (FMODE_MIDI_READ | FMODE_MIDI_WRITE))) { @@ -2242,7 +2257,7 @@ static int sv_midi_release(struct inode *inode, struct file *file) } spin_unlock_irqrestore(&s->lock, flags); wake_up(&s->open_wait); - mutex_unlock(&s->open_mutex); + up(&s->open_sem); unlock_kernel(); return 0; } @@ -2373,21 +2388,21 @@ static int sv_dmfm_open(struct inode *inode, struct file *file) VALIDATE_STATE(s); file->private_data = s; /* wait for device to become free */ - mutex_lock(&s->open_mutex); + down(&s->open_sem); while (s->open_mode & FMODE_DMFM) { if (file->f_flags & O_NONBLOCK) { - mutex_unlock(&s->open_mutex); + up(&s->open_sem); return -EBUSY; } add_wait_queue(&s->open_wait, &wait); __set_current_state(TASK_INTERRUPTIBLE); - mutex_unlock(&s->open_mutex); + up(&s->open_sem); schedule(); remove_wait_queue(&s->open_wait, &wait); set_current_state(TASK_RUNNING); if (signal_pending(current)) return -ERESTARTSYS; - mutex_lock(&s->open_mutex); + down(&s->open_sem); } /* init the stuff */ outb(1, s->iosynth); @@ -2397,7 +2412,7 @@ static int sv_dmfm_open(struct inode *inode, struct file *file) outb(5, s->iosynth+2); outb(1, s->iosynth+3); /* enable OPL3 */ s->open_mode |= FMODE_DMFM; - mutex_unlock(&s->open_mutex); + up(&s->open_sem); return nonseekable_open(inode, file); } @@ -2408,7 +2423,7 @@ static int sv_dmfm_release(struct inode *inode, struct file *file) VALIDATE_STATE(s); lock_kernel(); - mutex_lock(&s->open_mutex); + down(&s->open_sem); s->open_mode &= ~FMODE_DMFM; for (regb = 0xb0; regb < 0xb9; regb++) { outb(regb, s->iosynth); @@ -2417,7 +2432,7 @@ static int sv_dmfm_release(struct inode *inode, struct file *file) outb(0, s->iosynth+3); } wake_up(&s->open_wait); - mutex_unlock(&s->open_mutex); + up(&s->open_sem); unlock_kernel(); return 0; } @@ -2536,7 +2551,7 @@ static int __devinit sv_probe(struct pci_dev *pcidev, const struct pci_device_id return -ENODEV; if (pcidev->irq == 0) return -ENODEV; - if (pci_set_dma_mask(pcidev, DMA_24BIT_MASK)) { + if (pci_set_dma_mask(pcidev, 0x00ffffff)) { printk(KERN_WARNING "sonicvibes: architecture does not support 24bit PCI busmaster DMA\n"); return -ENODEV; } @@ -2567,7 +2582,7 @@ static int __devinit sv_probe(struct pci_dev *pcidev, const struct pci_device_id init_waitqueue_head(&s->open_wait); init_waitqueue_head(&s->midi.iwait); init_waitqueue_head(&s->midi.owait); - mutex_init(&s->open_mutex); + init_MUTEX(&s->open_sem); spin_lock_init(&s->lock); s->magic = SV_MAGIC; s->dev = pcidev; @@ -2632,7 +2647,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,IRQF_SHARED,"S3 SonicVibes",s))) { + if ((ret=request_irq(s->irq,sv_interrupt,SA_SHIRQ,"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 1a00a3210..9f912b8a2 100644 --- a/sound/oss/sound_config.h +++ b/sound/oss/sound_config.h @@ -14,6 +14,7 @@ #ifndef _SOUND_CONFIG_H_ #define _SOUND_CONFIG_H_ +#include #include #include diff --git a/sound/oss/soundcard.c b/sound/oss/soundcard.c index 0860d6789..d33bb464f 100644 --- a/sound/oss/soundcard.c +++ b/sound/oss/soundcard.c @@ -22,6 +22,7 @@ * Christoph Hellwig : Some cleanup work (2000/03/01) */ +#include #include "sound_config.h" #include @@ -37,6 +38,7 @@ #include #include #include +#include #include #include #include @@ -562,6 +564,9 @@ 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); @@ -569,10 +574,15 @@ static int __init oss_init(void) if (!dev_list[i].num) continue; - for (j = 1; j < *dev_list[i].num; j++) + 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); 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) @@ -586,11 +596,14 @@ 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++) + for (j = 1; j < *dev_list[i].num; j++) { + devfs_remove("sound/%s%d", dev_list[i].name, j); class_device_destroy(sound_class, MKDEV(SOUND_MAJOR, dev_list[i].minor + (j*0x10))); + } } unregister_sound_special(1); diff --git a/sound/oss/swarm_cs4297a.c b/sound/oss/swarm_cs4297a.c index eb5ea32fd..a1de9dcfb 100644 --- a/sound/oss/swarm_cs4297a.c +++ b/sound/oss/swarm_cs4297a.c @@ -76,7 +76,6 @@ #include #include #include -#include #include #include @@ -154,8 +153,8 @@ static void start_adc(struct cs4297a_state *s); #if CSDEBUG static unsigned long cs_debuglevel = 4; // levels range from 1-9 static unsigned long cs_debugmask = CS_INIT /*| CS_IOCTL*/; -module_param(cs_debuglevel, int, 0); -module_param(cs_debugmask, int, 0); +MODULE_PARM(cs_debuglevel, "i"); +MODULE_PARM(cs_debugmask, "i"); #endif #define CS_TRUE 1 #define CS_FALSE 0 @@ -292,9 +291,9 @@ struct cs4297a_state { unsigned conversion:1; // conversion from 16 to 8 bit in progress unsigned ena; spinlock_t lock; - struct mutex open_mutex; - struct mutex open_sem_adc; - struct mutex open_sem_dac; + struct semaphore open_sem; + struct semaphore open_sem_adc; + struct semaphore open_sem_dac; mode_t open_mode; wait_queue_head_t open_wait; wait_queue_head_t open_wait_adc; @@ -725,7 +724,7 @@ static int serdma_reg_access(struct cs4297a_state *s, u64 data) serdma_t *d = &s->dma_dac; u64 *data_p; unsigned swptr; - int flags; + unsigned long flags; serdma_descr_t *descr; if (s->reg_request) { @@ -2353,20 +2352,20 @@ static int cs4297a_release(struct inode *inode, struct file *file) if (file->f_mode & FMODE_WRITE) { drain_dac(s, file->f_flags & O_NONBLOCK); - mutex_lock(&s->open_sem_dac); + down(&s->open_sem_dac); stop_dac(s); dealloc_dmabuf(s, &s->dma_dac); s->open_mode &= ~FMODE_WRITE; - mutex_unlock(&s->open_sem_dac); + up(&s->open_sem_dac); wake_up(&s->open_wait_dac); } if (file->f_mode & FMODE_READ) { drain_adc(s, file->f_flags & O_NONBLOCK); - mutex_lock(&s->open_sem_adc); + down(&s->open_sem_adc); stop_adc(s); dealloc_dmabuf(s, &s->dma_adc); s->open_mode &= ~FMODE_READ; - mutex_unlock(&s->open_sem_adc); + up(&s->open_sem_adc); wake_up(&s->open_wait_adc); } return 0; @@ -2414,37 +2413,37 @@ static int cs4297a_open(struct inode *inode, struct file *file) ; } - mutex_lock(&s->open_sem_dac); + down(&s->open_sem_dac); while (s->open_mode & FMODE_WRITE) { if (file->f_flags & O_NONBLOCK) { - mutex_unlock(&s->open_sem_dac); + up(&s->open_sem_dac); return -EBUSY; } - mutex_unlock(&s->open_sem_dac); + up(&s->open_sem_dac); interruptible_sleep_on(&s->open_wait_dac); if (signal_pending(current)) { printk("open - sig pending\n"); return -ERESTARTSYS; } - mutex_lock(&s->open_sem_dac); + down(&s->open_sem_dac); } } if (file->f_mode & FMODE_READ) { - mutex_lock(&s->open_sem_adc); + down(&s->open_sem_adc); while (s->open_mode & FMODE_READ) { if (file->f_flags & O_NONBLOCK) { - mutex_unlock(&s->open_sem_adc); + up(&s->open_sem_adc); return -EBUSY; } - mutex_unlock(&s->open_sem_adc); + up(&s->open_sem_adc); interruptible_sleep_on(&s->open_wait_adc); if (signal_pending(current)) { printk("open - sig pending\n"); return -ERESTARTSYS; } - mutex_lock(&s->open_sem_adc); + down(&s->open_sem_adc); } } s->open_mode |= file->f_mode & (FMODE_READ | FMODE_WRITE); @@ -2457,7 +2456,7 @@ static int cs4297a_open(struct inode *inode, struct file *file) s->ena &= ~FMODE_READ; s->dma_adc.ossfragshift = s->dma_adc.ossmaxfrags = s->dma_adc.subdivision = 0; - mutex_unlock(&s->open_sem_adc); + up(&s->open_sem_adc); if (prog_dmabuf_adc(s)) { CS_DBGOUT(CS_OPEN | CS_ERROR, 2, printk(KERN_ERR @@ -2475,7 +2474,7 @@ static int cs4297a_open(struct inode *inode, struct file *file) s->ena &= ~FMODE_WRITE; s->dma_dac.ossfragshift = s->dma_dac.ossmaxfrags = s->dma_dac.subdivision = 0; - mutex_unlock(&s->open_sem_dac); + up(&s->open_sem_dac); if (prog_dmabuf_dac(s)) { CS_DBGOUT(CS_OPEN | CS_ERROR, 2, printk(KERN_ERR @@ -2632,8 +2631,8 @@ static int __init cs4297a_init(void) init_waitqueue_head(&s->open_wait); init_waitqueue_head(&s->open_wait_adc); init_waitqueue_head(&s->open_wait_dac); - mutex_init(&s->open_sem_adc); - mutex_init(&s->open_sem_dac); + init_MUTEX(&s->open_sem_adc); + init_MUTEX(&s->open_sem_dac); spin_lock_init(&s->lock); s->irq = K_INT_SER_1; diff --git a/sound/oss/trident.c b/sound/oss/trident.c index 2813e4c8e..a21c663e7 100644 --- a/sound/oss/trident.c +++ b/sound/oss/trident.c @@ -190,10 +190,11 @@ * * Lock order (high->low) * lock - hardware lock - * open_mutex - guard opens + * open_sem - guard opens * sem - guard dmabuf, write re-entry etc */ +#include #include #include #include @@ -215,8 +216,6 @@ #include #include #include -#include - #include #include #include @@ -350,7 +349,7 @@ struct trident_state { unsigned chans_num; unsigned long fmt_flag; /* Guard against mmap/write/read races */ - struct mutex sem; + struct semaphore sem; }; @@ -403,7 +402,7 @@ struct trident_card { struct trident_card *next; /* single open lock mechanism, only used for recording */ - struct mutex open_mutex; + struct semaphore open_sem; /* The trident has a certain amount of cross channel interaction so we use a single per card lock */ @@ -1882,7 +1881,7 @@ trident_read(struct file *file, char __user *buffer, size_t count, loff_t * ppos if (!access_ok(VERIFY_WRITE, buffer, count)) return -EFAULT; - mutex_lock(&state->sem); + down(&state->sem); if (!dmabuf->ready && (ret = prog_dmabuf_record(state))) goto out; @@ -1914,7 +1913,7 @@ trident_read(struct file *file, char __user *buffer, size_t count, loff_t * ppos goto out; } - mutex_unlock(&state->sem); + up(&state->sem); /* No matter how much space left in the buffer, */ /* we have to wait until CSO == ESO/2 or CSO == ESO */ /* when address engine interrupts */ @@ -1941,7 +1940,7 @@ trident_read(struct file *file, char __user *buffer, size_t count, loff_t * ppos ret = -ERESTARTSYS; goto out; } - mutex_lock(&state->sem); + down(&state->sem); if (dmabuf->mapped) { if (!ret) ret = -ENXIO; @@ -1969,7 +1968,7 @@ trident_read(struct file *file, char __user *buffer, size_t count, loff_t * ppos start_adc(state); } out: - mutex_unlock(&state->sem); + up(&state->sem); return ret; } @@ -1997,7 +1996,7 @@ trident_write(struct file *file, const char __user *buffer, size_t count, loff_t * Guard against an mmap or ioctl while writing */ - mutex_lock(&state->sem); + down(&state->sem); if (dmabuf->mapped) { ret = -ENXIO; @@ -2046,7 +2045,7 @@ trident_write(struct file *file, const char __user *buffer, size_t count, loff_t tmo = (dmabuf->dmasize * HZ) / (dmabuf->rate * 2); tmo >>= sample_shift[dmabuf->fmt]; unlock_set_fmt(state); - mutex_unlock(&state->sem); + up(&state->sem); /* There are two situations when sleep_on_timeout */ /* returns, one is when the interrupt is serviced */ @@ -2074,7 +2073,7 @@ trident_write(struct file *file, const char __user *buffer, size_t count, loff_t ret = -ERESTARTSYS; goto out_nolock; } - mutex_lock(&state->sem); + down(&state->sem); if (dmabuf->mapped) { if (!ret) ret = -ENXIO; @@ -2132,7 +2131,7 @@ trident_write(struct file *file, const char __user *buffer, size_t count, loff_t start_dac(state); } out: - mutex_unlock(&state->sem); + up(&state->sem); out_nolock: return ret; } @@ -2153,24 +2152,24 @@ trident_poll(struct file *file, struct poll_table_struct *wait) * prog_dmabuf events */ - mutex_lock(&state->sem); + down(&state->sem); if (file->f_mode & FMODE_WRITE) { if (!dmabuf->ready && prog_dmabuf_playback(state)) { - mutex_unlock(&state->sem); + up(&state->sem); return 0; } poll_wait(file, &dmabuf->wait, wait); } if (file->f_mode & FMODE_READ) { if (!dmabuf->ready && prog_dmabuf_record(state)) { - mutex_unlock(&state->sem); + up(&state->sem); return 0; } poll_wait(file, &dmabuf->wait, wait); } - mutex_unlock(&state->sem); + up(&state->sem); spin_lock_irqsave(&state->card->lock, flags); trident_update_ptr(state); @@ -2208,7 +2207,7 @@ trident_mmap(struct file *file, struct vm_area_struct *vma) * a read or write against an mmap. */ - mutex_lock(&state->sem); + down(&state->sem); if (vma->vm_flags & VM_WRITE) { if ((ret = prog_dmabuf_playback(state)) != 0) @@ -2233,7 +2232,7 @@ trident_mmap(struct file *file, struct vm_area_struct *vma) dmabuf->mapped = 1; ret = 0; out: - mutex_unlock(&state->sem); + up(&state->sem); return ret; } @@ -2430,15 +2429,15 @@ trident_ioctl(struct inode *inode, struct file *file, unlock_set_fmt(state); break; } - mutex_lock(&state->card->open_mutex); + down(&state->card->open_sem); ret = ali_allocate_other_states_resources(state, 6); if (ret < 0) { - mutex_unlock(&state->card->open_mutex); + up(&state->card->open_sem); unlock_set_fmt(state); break; } state->card->multi_channel_use_count++; - mutex_unlock(&state->card->open_mutex); + up(&state->card->open_sem); } else val = 2; /*yield to 2-channels */ } else @@ -2728,11 +2727,11 @@ trident_open(struct inode *inode, struct file *file) /* find an available virtual channel (instance of /dev/dsp) */ while (card != NULL) { - mutex_lock(&card->open_mutex); + down(&card->open_sem); if (file->f_mode & FMODE_READ) { /* Skip opens on cards that are in 6 channel mode */ if (card->multi_channel_use_count > 0) { - mutex_unlock(&card->open_mutex); + up(&card->open_sem); card = card->next; continue; } @@ -2741,16 +2740,16 @@ trident_open(struct inode *inode, struct file *file) if (card->states[i] == NULL) { state = card->states[i] = kmalloc(sizeof(*state), GFP_KERNEL); if (state == NULL) { - mutex_unlock(&card->open_mutex); + up(&card->open_sem); return -ENOMEM; } memset(state, 0, sizeof(*state)); - mutex_init(&state->sem); + init_MUTEX(&state->sem); dmabuf = &state->dmabuf; goto found_virt; } } - mutex_unlock(&card->open_mutex); + up(&card->open_sem); card = card->next; } /* no more virtual channel avaiable */ @@ -2817,7 +2816,7 @@ trident_open(struct inode *inode, struct file *file) } state->open_mode |= file->f_mode & (FMODE_READ | FMODE_WRITE); - mutex_unlock(&card->open_mutex); + up(&card->open_sem); pr_debug("trident: open virtual channel %d, hard channel %d\n", state->virt, dmabuf->channel->num); @@ -2846,7 +2845,7 @@ trident_release(struct inode *inode, struct file *file) state->virt, dmabuf->channel->num); /* stop DMA state machine and free DMA buffers/channels */ - mutex_lock(&card->open_mutex); + down(&card->open_sem); if (file->f_mode & FMODE_WRITE) { stop_dac(state); @@ -2879,8 +2878,8 @@ trident_release(struct inode *inode, struct file *file) card->states[state->virt] = NULL; kfree(state); - /* we're covered by the open_mutex */ - mutex_unlock(&card->open_mutex); + /* we're covered by the open_sem */ + up(&card->open_sem); return 0; } @@ -4406,7 +4405,7 @@ trident_probe(struct pci_dev *pci_dev, const struct pci_device_id *pci_id) card->banks[BANK_B].addresses = &bank_b_addrs; card->banks[BANK_B].bitmap = 0UL; - mutex_init(&card->open_mutex); + init_MUTEX(&card->open_sem); spin_lock_init(&card->lock); init_timer(&card->timer); @@ -4472,7 +4471,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, IRQF_SHARED, + if (request_irq(card->irq, &trident_interrupt, SA_SHIRQ, 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 08d8c94d0..83edda93f 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 @@ -38,8 +38,7 @@ #include #include #include -#include - +#include #include "sound_config.h" #include "dev_table.h" #include "mpu401.h" @@ -308,12 +307,12 @@ struct via_info { unsigned sixchannel: 1; /* 8233/35 with 6 channel support */ unsigned volume: 1; - unsigned locked_rate : 1; + int locked_rate : 1; int mixer_vol; /* 8233/35 volume - not yet implemented */ - struct mutex syscall_mutex; - struct mutex open_mutex; + struct semaphore syscall_sem; + struct semaphore open_sem; /* The 8233/8235 have 4 DX audio channels, two record and one six channel out. We bind ch_in to DX 1, ch_out to multichannel @@ -506,10 +505,10 @@ static inline int via_syscall_down (struct via_info *card, int nonblock) nonblock = 0; if (nonblock) { - if (!mutex_trylock(&card->syscall_mutex)) + if (down_trylock (&card->syscall_sem)) return -EAGAIN; } else { - if (mutex_lock_interruptible(&card->syscall_mutex)) + if (down_interruptible (&card->syscall_sem)) return -ERESTARTSYS; } @@ -1610,7 +1609,7 @@ static int via_mixer_ioctl (struct inode *inode, struct file *file, unsigned int #endif rc = codec->mixer_ioctl(codec, cmd, arg); - mutex_unlock(&card->syscall_mutex); + up (&card->syscall_sem); out: DPRINTK ("EXIT, returning %d\n", rc); @@ -2013,7 +2012,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, IRQF_SHARED, VIA_MODULE_NAME, card)) { + if (request_irq (card->pdev->irq, via_interrupt, SA_SHIRQ, 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 +2021,7 @@ static int via_interrupt_init (struct via_info *card) } else { - if (request_irq (card->pdev->irq, via_new_interrupt, IRQF_SHARED, VIA_MODULE_NAME, card)) { + if (request_irq (card->pdev->irq, via_new_interrupt, SA_SHIRQ, VIA_MODULE_NAME, card)) { printk (KERN_ERR PFX "unable to obtain IRQ %d, aborting\n", card->pdev->irq); DPRINTK ("EXIT, returning -EBUSY\n"); @@ -2229,7 +2228,7 @@ static int via_dsp_mmap(struct file *file, struct vm_area_struct *vma) if (wr) card->ch_out.is_mapped = 1; - mutex_unlock(&card->syscall_mutex); + up (&card->syscall_sem); rc = 0; out: @@ -2257,7 +2256,7 @@ handle_one_block: /* Thomas Sailer: * But also to ourselves, release semaphore if we do so */ if (need_resched()) { - mutex_unlock(&card->syscall_mutex); + up(&card->syscall_sem); schedule (); ret = via_syscall_down (card, nonblock); if (ret) @@ -2287,7 +2286,7 @@ handle_one_block: break; } - mutex_unlock(&card->syscall_mutex); + up(&card->syscall_sem); DPRINTK ("Sleeping on block %d\n", n); schedule(); @@ -2403,7 +2402,7 @@ static ssize_t via_dsp_read(struct file *file, char __user *buffer, size_t count rc = via_dsp_do_read (card, buffer, count, nonblock); out_up: - mutex_unlock(&card->syscall_mutex); + up (&card->syscall_sem); out: DPRINTK ("EXIT, returning %ld\n",(long) rc); return rc; @@ -2427,7 +2426,7 @@ handle_one_block: /* Thomas Sailer: * But also to ourselves, release semaphore if we do so */ if (need_resched()) { - mutex_unlock(&card->syscall_mutex); + up(&card->syscall_sem); schedule (); ret = via_syscall_down (card, nonblock); if (ret) @@ -2457,7 +2456,7 @@ handle_one_block: break; } - mutex_unlock(&card->syscall_mutex); + up(&card->syscall_sem); DPRINTK ("Sleeping on page %d, tmp==%d, ir==%d\n", n, tmp, chan->is_record); schedule(); @@ -2586,7 +2585,7 @@ static ssize_t via_dsp_write(struct file *file, const char __user *buffer, size_ rc = via_dsp_do_write (card, buffer, count, nonblock); out_up: - mutex_unlock(&card->syscall_mutex); + up (&card->syscall_sem); out: DPRINTK ("EXIT, returning %ld\n",(long) rc); return rc; @@ -2635,7 +2634,7 @@ static unsigned int via_dsp_poll(struct file *file, struct poll_table_struct *wa * Sleeps until all playback has been flushed to the audio * hardware. * - * Locking: inside card->syscall_mutex + * Locking: inside card->syscall_sem */ static int via_dsp_drain_playback (struct via_info *card, @@ -2693,7 +2692,7 @@ static int via_dsp_drain_playback (struct via_info *card, printk (KERN_ERR "sleeping but not active\n"); #endif - mutex_unlock(&card->syscall_mutex); + up(&card->syscall_sem); DPRINTK ("sleeping, nbufs=%d\n", atomic_read (&chan->n_frags)); schedule(); @@ -2749,7 +2748,7 @@ out: * * Handles SNDCTL_DSP_GETISPACE and SNDCTL_DSP_GETOSPACE. * - * Locking: inside card->syscall_mutex + * Locking: inside card->syscall_sem */ static int via_dsp_ioctl_space (struct via_info *card, @@ -2794,7 +2793,7 @@ static int via_dsp_ioctl_space (struct via_info *card, * * Handles SNDCTL_DSP_GETIPTR and SNDCTL_DSP_GETOPTR. * - * Locking: inside card->syscall_mutex + * Locking: inside card->syscall_sem */ static int via_dsp_ioctl_ptr (struct via_info *card, @@ -3222,7 +3221,7 @@ static int via_dsp_ioctl (struct inode *inode, struct file *file, break; } - mutex_unlock(&card->syscall_mutex); + up (&card->syscall_sem); DPRINTK ("EXIT, returning %d\n", rc); return rc; } @@ -3265,12 +3264,12 @@ static int via_dsp_open (struct inode *inode, struct file *file) match: if (nonblock) { - if (!mutex_trylock(&card->open_mutex)) { + if (down_trylock (&card->open_sem)) { DPRINTK ("EXIT, returning -EAGAIN\n"); return -EAGAIN; } } else { - if (mutex_lock_interruptible(&card->open_mutex)) { + if (down_interruptible (&card->open_sem)) { DPRINTK ("EXIT, returning -ERESTARTSYS\n"); return -ERESTARTSYS; } @@ -3356,8 +3355,8 @@ static int via_dsp_release(struct inode *inode, struct file *file) via_chan_buffer_free (card, &card->ch_in); } - mutex_unlock(&card->syscall_mutex); - mutex_unlock(&card->open_mutex); + up (&card->syscall_sem); + up (&card->open_sem); DPRINTK ("EXIT, returning 0\n"); return 0; @@ -3415,8 +3414,8 @@ static int __devinit via_init_one (struct pci_dev *pdev, const struct pci_device card->card_num = via_num_cards++; spin_lock_init (&card->lock); spin_lock_init (&card->ac97_lock); - mutex_init(&card->syscall_mutex); - mutex_init(&card->open_mutex); + init_MUTEX (&card->syscall_sem); + init_MUTEX (&card->open_sem); /* we must init these now, in case the intr handler needs them */ via_chan_init_defaults (card, &card->ch_out); @@ -3522,7 +3521,7 @@ err_out_have_mixer: err_out_kfree: #ifndef VIA_NDEBUG - memset (card, OSS_POISON_FREE, sizeof (*card)); /* poison memory */ + memset (card, 0xAB, sizeof (*card)); /* poison memory */ #endif kfree (card); @@ -3559,7 +3558,7 @@ static void __devexit via_remove_one (struct pci_dev *pdev) via_ac97_cleanup (card); #ifndef VIA_NDEBUG - memset (card, OSS_POISON_FREE, sizeof (*card)); /* poison memory */ + memset (card, 0xAB, sizeof (*card)); /* poison memory */ #endif kfree (card); diff --git a/sound/oss/vidc.c b/sound/oss/vidc.c index 8932d8940..00fe5cec9 100644 --- a/sound/oss/vidc.c +++ b/sound/oss/vidc.c @@ -17,6 +17,7 @@ * We currently support a mixer device, but it is currently non-functional. */ +#include #include #include #include diff --git a/sound/oss/vwsnd.c b/sound/oss/vwsnd.c index 5f140c758..265423054 100644 --- a/sound/oss/vwsnd.c +++ b/sound/oss/vwsnd.c @@ -94,7 +94,7 @@ * Open will block until the previous client has closed the * device, unless O_NONBLOCK is specified. * - * The semaphore devc->io_mutex serializes PCM I/O syscalls. This + * The semaphore devc->io_sema serializes PCM I/O syscalls. This * is unnecessary in Linux 2.2, because the kernel lock * serializes read, write, and ioctl globally, but it's there, * ready for the brave, new post-kernel-lock world. @@ -105,7 +105,7 @@ * area it owns and update its pointers. See pcm_output() and * pcm_input() for most of the gory stuff. * - * devc->mix_mutex serializes all mixer ioctls. This is also + * devc->mix_sema serializes all mixer ioctls. This is also * redundant because of the kernel lock. * * The lowest level lock is lith->lithium_lock. It is a @@ -148,8 +148,7 @@ #include #include #include -#include - +#include #include #include "sound_config.h" @@ -247,6 +246,27 @@ typedef struct lithium { spinlock_t lock; /* protects codec and UST/MSC access */ } lithium_t; +/* + * li_create initializes the lithium_t structure and sets up vm mappings + * to access the registers. + * Returns 0 on success, -errno on failure. + */ + +static int __init li_create(lithium_t *lith, unsigned long baseaddr) +{ + static void li_destroy(lithium_t *); + + spin_lock_init(&lith->lock); + lith->page0 = ioremap_nocache(baseaddr + LI_PAGE0_OFFSET, PAGE_SIZE); + lith->page1 = ioremap_nocache(baseaddr + LI_PAGE1_OFFSET, PAGE_SIZE); + lith->page2 = ioremap_nocache(baseaddr + LI_PAGE2_OFFSET, PAGE_SIZE); + if (!lith->page0 || !lith->page1 || !lith->page2) { + li_destroy(lith); + return -ENOMEM; + } + return 0; +} + /* * li_destroy destroys the lithium_t structure and vm mappings. */ @@ -267,25 +287,6 @@ static void li_destroy(lithium_t *lith) } } -/* - * li_create initializes the lithium_t structure and sets up vm mappings - * to access the registers. - * Returns 0 on success, -errno on failure. - */ - -static int __init li_create(lithium_t *lith, unsigned long baseaddr) -{ - spin_lock_init(&lith->lock); - lith->page0 = ioremap_nocache(baseaddr + LI_PAGE0_OFFSET, PAGE_SIZE); - lith->page1 = ioremap_nocache(baseaddr + LI_PAGE1_OFFSET, PAGE_SIZE); - lith->page2 = ioremap_nocache(baseaddr + LI_PAGE2_OFFSET, PAGE_SIZE); - if (!lith->page0 || !lith->page1 || !lith->page2) { - li_destroy(lith); - return -ENOMEM; - } - return 0; -} - /* * basic register accessors - read/write long/byte */ @@ -1446,11 +1447,11 @@ typedef enum vwsnd_port_flags { * * port->lock protects: hwstate, flags, swb_[iu]_avail. * - * devc->io_mutex protects: swstate, sw_*, swb_[iu]_idx. + * devc->io_sema protects: swstate, sw_*, swb_[iu]_idx. * * everything else is only written by open/release or * pcm_{setup,shutdown}(), which are serialized by a - * combination of devc->open_mutex and devc->io_mutex. + * combination of devc->open_sema and devc->io_sema. */ typedef struct vwsnd_port { @@ -1506,9 +1507,9 @@ typedef struct vwsnd_dev { int audio_minor; /* minor number of audio device */ int mixer_minor; /* minor number of mixer device */ - struct mutex open_mutex; - struct mutex io_mutex; - struct mutex mix_mutex; + struct semaphore open_sema; + struct semaphore io_sema; + struct semaphore mix_sema; mode_t open_mode; wait_queue_head_t open_wait; @@ -1632,7 +1633,7 @@ static __inline__ unsigned int swb_inc_i(vwsnd_port_t *port, int inc) * mode-setting ioctls have been done, but before the first I/O is * done. * - * Locking: called with devc->io_mutex held. + * Locking: called with devc->io_sema held. * * Returns 0 on success, -errno on failure. */ @@ -2318,9 +2319,9 @@ static ssize_t vwsnd_audio_read(struct file *file, vwsnd_dev_t *devc = file->private_data; ssize_t ret; - mutex_lock(&devc->io_mutex); + down(&devc->io_sema); ret = vwsnd_audio_do_read(file, buffer, count, ppos); - mutex_unlock(&devc->io_mutex); + up(&devc->io_sema); return ret; } @@ -2393,9 +2394,9 @@ static ssize_t vwsnd_audio_write(struct file *file, vwsnd_dev_t *devc = file->private_data; ssize_t ret; - mutex_lock(&devc->io_mutex); + down(&devc->io_sema); ret = vwsnd_audio_do_write(file, buffer, count, ppos); - mutex_unlock(&devc->io_mutex); + up(&devc->io_sema); return ret; } @@ -2890,9 +2891,9 @@ static int vwsnd_audio_ioctl(struct inode *inode, vwsnd_dev_t *devc = (vwsnd_dev_t *) file->private_data; int ret; - mutex_lock(&devc->io_mutex); + down(&devc->io_sema); ret = vwsnd_audio_do_ioctl(inode, file, cmd, arg); - mutex_unlock(&devc->io_mutex); + up(&devc->io_sema); return ret; } @@ -2928,9 +2929,9 @@ static int vwsnd_audio_open(struct inode *inode, struct file *file) return -ENODEV; } - mutex_lock(&devc->open_mutex); + down(&devc->open_sema); while (devc->open_mode & file->f_mode) { - mutex_unlock(&devc->open_mutex); + up(&devc->open_sema); if (file->f_flags & O_NONBLOCK) { DEC_USE_COUNT; return -EBUSY; @@ -2940,10 +2941,10 @@ static int vwsnd_audio_open(struct inode *inode, struct file *file) DEC_USE_COUNT; return -ERESTARTSYS; } - mutex_lock(&devc->open_mutex); + down(&devc->open_sema); } devc->open_mode |= file->f_mode & (FMODE_READ | FMODE_WRITE); - mutex_unlock(&devc->open_mutex); + up(&devc->open_sema); /* get default sample format from minor number. */ @@ -2959,7 +2960,7 @@ static int vwsnd_audio_open(struct inode *inode, struct file *file) /* Initialize vwsnd_ports. */ - mutex_lock(&devc->io_mutex); + down(&devc->io_sema); { if (file->f_mode & FMODE_READ) { devc->rport.swstate = SW_INITIAL; @@ -2986,7 +2987,7 @@ static int vwsnd_audio_open(struct inode *inode, struct file *file) devc->wport.frag_count = 0; } } - mutex_unlock(&devc->io_mutex); + up(&devc->io_sema); file->private_data = devc; DBGRV(); @@ -3004,7 +3005,7 @@ static int vwsnd_audio_release(struct inode *inode, struct file *file) int err = 0; lock_kernel(); - mutex_lock(&devc->io_mutex); + down(&devc->io_sema); { DBGEV("(inode=0x%p, file=0x%p)\n", inode, file); @@ -3021,13 +3022,13 @@ static int vwsnd_audio_release(struct inode *inode, struct file *file) if (wport) wport->swstate = SW_OFF; } - mutex_unlock(&devc->io_mutex); + up(&devc->io_sema); - mutex_lock(&devc->open_mutex); + down(&devc->open_sema); { devc->open_mode &= ~file->f_mode; } - mutex_unlock(&devc->open_mutex); + up(&devc->open_sema); wake_up(&devc->open_wait); DEC_USE_COUNT; DBGR(); @@ -3212,7 +3213,7 @@ static int vwsnd_mixer_ioctl(struct inode *ioctl, DBGEV("(devc=0x%p, cmd=0x%x, arg=0x%lx)\n", devc, cmd, arg); - mutex_lock(&devc->mix_mutex); + down(&devc->mix_sema); { if ((cmd & ~nrmask) == MIXER_READ(0)) retval = mixer_read_ioctl(devc, nr, (void __user *) arg); @@ -3221,7 +3222,7 @@ static int vwsnd_mixer_ioctl(struct inode *ioctl, else retval = -EINVAL; } - mutex_unlock(&devc->mix_mutex); + up(&devc->mix_sema); return retval; } @@ -3375,9 +3376,9 @@ static int __init attach_vwsnd(struct address_info *hw_config) /* Initialize as much of *devc as possible */ - mutex_init(&devc->open_mutex); - mutex_init(&devc->io_mutex); - mutex_init(&devc->mix_mutex); + init_MUTEX(&devc->open_sema); + init_MUTEX(&devc->io_sema); + init_MUTEX(&devc->mix_sema); devc->open_mode = 0; spin_lock_init(&devc->rport.lock); init_waitqueue_head(&devc->rport.queue); diff --git a/sound/oss/waveartist.c b/sound/oss/waveartist.c index 22d26624b..99d04ad3c 100644 --- a/sound/oss/waveartist.c +++ b/sound/oss/waveartist.c @@ -35,6 +35,7 @@ #include #include +#include #include #include #include @@ -2027,8 +2028,8 @@ __setup("waveartist=", setup_waveartist); #endif MODULE_DESCRIPTION("Rockwell WaveArtist RWA-010 sound driver"); -module_param(io, int, 0); /* IO base */ -module_param(irq, int, 0); /* IRQ */ -module_param(dma, int, 0); /* DMA */ -module_param(dma2, int, 0); /* DMA2 */ +MODULE_PARM(io, "i"); /* IO base */ +MODULE_PARM(irq, "i"); /* IRQ */ +MODULE_PARM(dma, "i"); /* DMA */ +MODULE_PARM(dma2, "i"); /* DMA2 */ MODULE_LICENSE("GPL"); diff --git a/sound/oss/wavfront.c b/sound/oss/wavfront.c index 1dec3958c..b1a4eeb9d 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, - IRQF_DISABLED|IRQF_SHARED, + SA_INTERRUPT|SA_SHIRQ, "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 3f3a39001..7b167b743 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, IRQF_DISABLED|IRQF_SHARED, + if (request_irq (phys_dev->irq, wf_mpuintr, SA_INTERRUPT|SA_SHIRQ, "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 6e22472df..f8bd72e46 100644 --- a/sound/oss/ymfpci.c +++ b/sound/oss/ymfpci.c @@ -1918,10 +1918,10 @@ static int ymf_open(struct inode *inode, struct file *file) if (unit == NULL) return -ENODEV; - mutex_lock(&unit->open_mutex); + down(&unit->open_sem); if ((state = ymf_state_alloc(unit)) == NULL) { - mutex_unlock(&unit->open_mutex); + up(&unit->open_sem); return -ENOMEM; } list_add_tail(&state->chain, &unit->states); @@ -1956,7 +1956,7 @@ static int ymf_open(struct inode *inode, struct file *file) ymfpci_writeb(unit, YDSXGR_TIMERCTRL, (YDSXGR_TIMERCTRL_TEN|YDSXGR_TIMERCTRL_TIEN)); #endif - mutex_unlock(&unit->open_mutex); + up(&unit->open_sem); return nonseekable_open(inode, file); @@ -1974,7 +1974,7 @@ out_nodma: list_del(&state->chain); kfree(state); - mutex_unlock(&unit->open_mutex); + up(&unit->open_sem); return err; } @@ -1987,7 +1987,7 @@ static int ymf_release(struct inode *inode, struct file *file) ymfpci_writeb(unit, YDSXGR_TIMERCTRL, 0); #endif - mutex_lock(&unit->open_mutex); + down(&unit->open_sem); /* * XXX Solve the case of O_NONBLOCK close - don't deallocate here. @@ -2004,7 +2004,7 @@ static int ymf_release(struct inode *inode, struct file *file) file->private_data = NULL; /* Can you tell I programmed Solaris */ kfree(state); - mutex_unlock(&unit->open_mutex); + up(&unit->open_sem); return 0; } @@ -2532,7 +2532,7 @@ static int __devinit ymf_probe_one(struct pci_dev *pcidev, const struct pci_devi spin_lock_init(&codec->reg_lock); spin_lock_init(&codec->voice_lock); spin_lock_init(&codec->ac97_lock); - mutex_init(&codec->open_mutex); + init_MUTEX(&codec->open_sem); INIT_LIST_HEAD(&codec->states); codec->pci = pcidev; @@ -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, IRQF_SHARED, "ymfpci", codec) != 0) { + if (request_irq(pcidev->irq, ymf_interrupt, SA_SHIRQ, "ymfpci", codec) != 0) { printk(KERN_ERR "ymfpci: unable to request IRQ %d\n", pcidev->irq); goto out_memfree; diff --git a/sound/oss/ymfpci.h b/sound/oss/ymfpci.h index ac1785f2b..f810a100c 100644 --- a/sound/oss/ymfpci.h +++ b/sound/oss/ymfpci.h @@ -22,7 +22,6 @@ * */ #include -#include /* * Direct registers @@ -280,7 +279,7 @@ struct ymf_unit { /* soundcore stuff */ int dev_audio; - struct mutex open_mutex; + struct semaphore open_sem; struct list_head ymf_devs; struct list_head states; /* List of states for this unit */ diff --git a/sound/pci/Kconfig b/sound/pci/Kconfig index e49c0fe21..9243318c8 100644 --- a/sound/pci/Kconfig +++ b/sound/pci/Kconfig @@ -15,18 +15,6 @@ config SND_AD1889 To compile this as a module, choose M here: the module 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+ - - To compile this driver as a module, choose M here: the module - will be called snd-als300 - config SND_ALS4000 tristate "Avance Logic ALS4000" depends on SND && ISA_DMA_API @@ -78,49 +66,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 +123,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 . @@ -207,28 +195,22 @@ config SND_CS46XX will be called snd-cs46xx. config SND_CS46XX_NEW_DSP - bool "Cirrus Logic (Sound Fusion) New DSP support" - depends on SND_CS46XX - default y + bool "Cirrus Logic (Sound Fusion) New DSP support (EXPERIMENTAL)" + depends on SND_CS46XX && EXPERIMENTAL 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/CS5536 Audio" + tristate "CS5535 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. 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. + various literature. To compile this driver as a module, choose M here: the module will be called snd-cs5535audio. @@ -468,13 +450,11 @@ 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_V4L1 + select VIDEO_DEV config SND_HDA_INTEL tristate "Intel HD Audio" @@ -561,8 +541,8 @@ config SND_INTEL8X0 will be called snd-intel8x0. config SND_INTEL8X0M - tristate "Intel/SiS/nVidia/AMD MC97 Modem" - depends on SND + tristate "Intel/SiS/nVidia/AMD MC97 Modem (EXPERIMENTAL)" + depends on SND && EXPERIMENTAL select SND_AC97_CODEC help Say Y here to include support for the integrated MC97 modem on @@ -625,19 +605,6 @@ config SND_PCXHR To compile this driver as a module, choose M here: the module will be called snd-pcxhr. -config SND_RIPTIDE - tristate "Conexant Riptide" - depends on SND - depends on FW_LOADER - select SND_OPL3_LIB - select SND_MPU401_UART - select SND_AC97_CODEC - help - Say 'Y' or 'M' to include support for Conexant Riptide chip. - - To compile this driver as a module, choose M here: the module - will be called snd-riptide - config SND_RME32 tristate "RME Digi32, 32/8, 32 PRO" depends on SND diff --git a/sound/pci/Makefile b/sound/pci/Makefile index e06736da9..63d325763 100644 --- a/sound/pci/Makefile +++ b/sound/pci/Makefile @@ -4,7 +4,6 @@ # snd-ad1889-objs := ad1889.o -snd-als300-objs := als300.o snd-als4000-objs := als4000.o snd-atiixp-objs := atiixp.o snd-atiixp-modem-objs := atiixp_modem.o @@ -28,7 +27,6 @@ snd-via82xx-modem-objs := via82xx_modem.o # Toplevel Module Dependency obj-$(CONFIG_SND_AD1889) += snd-ad1889.o -obj-$(CONFIG_SND_ALS300) += snd-als300.o obj-$(CONFIG_SND_ALS4000) += snd-als4000.o obj-$(CONFIG_SND_ATIIXP) += snd-atiixp.o obj-$(CONFIG_SND_ATIIXP_MODEM) += snd-atiixp-modem.o @@ -65,7 +63,6 @@ obj-$(CONFIG_SND) += \ mixart/ \ nm256/ \ pcxhr/ \ - riptide/ \ rme9652/ \ trident/ \ ymfpci/ \ diff --git a/sound/pci/ac97/ac97_codec.c b/sound/pci/ac97/ac97_codec.c index 51e83d7a8..3020ca2b6 100644 --- a/sound/pci/ac97/ac97_codec.c +++ b/sound/pci/ac97/ac97_codec.c @@ -28,7 +28,6 @@ #include #include #include -#include #include #include #include @@ -150,7 +149,7 @@ static const struct ac97_codec_id snd_ac97_codec_ids[] = { { 0x49544561, 0xffffffff, "IT2646E", patch_it2646, NULL }, { 0x4e534300, 0xffffffff, "LM4540,43,45,46,48", NULL, NULL }, // only guess --jk { 0x4e534331, 0xffffffff, "LM4549", NULL, NULL }, -{ 0x4e534350, 0xffffffff, "LM4550", patch_lm4550, NULL }, // volume wrap fix +{ 0x4e534350, 0xffffffff, "LM4550", NULL, NULL }, { 0x50534304, 0xffffffff, "UCB1400", NULL, NULL }, { 0x53494c20, 0xffffffe0, "Si3036,8", mpatch_si3036, mpatch_si3036, AC97_MODEM_PATCH }, { 0x54524102, 0xffffffff, "TR28022", NULL, NULL }, @@ -160,7 +159,6 @@ static const struct ac97_codec_id snd_ac97_codec_ids[] = { { 0x54584e20, 0xffffffff, "TLC320AD9xC", NULL, NULL }, { 0x56494161, 0xffffffff, "VIA1612A", NULL, NULL }, // modified ICE1232 with S/PDIF { 0x56494170, 0xffffffff, "VIA1617A", patch_vt1617a, NULL }, // modified VT1616 with S/PDIF -{ 0x56494182, 0xffffffff, "VIA1618", NULL, NULL }, { 0x57454301, 0xffffffff, "W83971D", NULL, NULL }, { 0x574d4c00, 0xffffffff, "WM9701A", NULL, NULL }, { 0x574d4C03, 0xffffffff, "WM9703,WM9707,WM9708,WM9717", patch_wolfson03, NULL}, @@ -193,6 +191,9 @@ static const struct ac97_codec_id snd_ac97_codec_ids[] = { static int snd_ac97_valid_reg(struct snd_ac97 *ac97, unsigned short reg) { + if (ac97->limited_regs && ! test_bit(reg, ac97->reg_accessed)) + return 0; + /* filter some registers for buggy codecs */ switch (ac97->id) { case AC97_ID_AK4540: @@ -253,8 +254,6 @@ 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 * @@ -283,8 +282,6 @@ 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 @@ -299,15 +296,13 @@ void snd_ac97_write_cache(struct snd_ac97 *ac97, unsigned short reg, unsigned sh { if (!snd_ac97_valid_reg(ac97, reg)) return; - mutex_lock(&ac97->reg_mutex); + down(&ac97->reg_mutex); ac97->regs[reg] = value; ac97->bus->ops->write(ac97, reg, value); set_bit(reg, ac97->reg_accessed); - mutex_unlock(&ac97->reg_mutex); + up(&ac97->reg_mutex); } -EXPORT_SYMBOL(snd_ac97_write_cache); - /** * snd_ac97_update - update the value on the given register * @ac97: the ac97 instance @@ -326,19 +321,17 @@ int snd_ac97_update(struct snd_ac97 *ac97, unsigned short reg, unsigned short va if (!snd_ac97_valid_reg(ac97, reg)) return -EINVAL; - mutex_lock(&ac97->reg_mutex); + down(&ac97->reg_mutex); change = ac97->regs[reg] != value; if (change) { ac97->regs[reg] = value; ac97->bus->ops->write(ac97, reg, value); } set_bit(reg, ac97->reg_accessed); - mutex_unlock(&ac97->reg_mutex); + up(&ac97->reg_mutex); return change; } -EXPORT_SYMBOL(snd_ac97_update); - /** * snd_ac97_update_bits - update the bits on the given register * @ac97: the ac97 instance @@ -358,14 +351,12 @@ int snd_ac97_update_bits(struct snd_ac97 *ac97, unsigned short reg, unsigned sho if (!snd_ac97_valid_reg(ac97, reg)) return -EINVAL; - mutex_lock(&ac97->reg_mutex); + down(&ac97->reg_mutex); change = snd_ac97_update_bits_nolock(ac97, reg, mask, value); - mutex_unlock(&ac97->reg_mutex); + up(&ac97->reg_mutex); 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) @@ -389,12 +380,12 @@ static int snd_ac97_ad18xx_update_pcm_bits(struct snd_ac97 *ac97, int codec, uns int change; unsigned short old, new, cfg; - mutex_lock(&ac97->page_mutex); + down(&ac97->page_mutex); old = ac97->spec.ad18xx.pcmreg[codec]; new = (old & ~mask) | value; change = old != new; if (change) { - mutex_lock(&ac97->reg_mutex); + down(&ac97->reg_mutex); cfg = snd_ac97_read_cache(ac97, AC97_AD_SERIAL_CFG); ac97->spec.ad18xx.pcmreg[codec] = new; /* select single codec */ @@ -406,9 +397,9 @@ static int snd_ac97_ad18xx_update_pcm_bits(struct snd_ac97 *ac97, int codec, uns /* select all codecs */ ac97->bus->ops->write(ac97, AC97_AD_SERIAL_CFG, cfg | 0x7000); - mutex_unlock(&ac97->reg_mutex); + up(&ac97->reg_mutex); } - mutex_unlock(&ac97->page_mutex); + up(&ac97->page_mutex); return change; } @@ -476,7 +467,7 @@ static int snd_ac97_page_save(struct snd_ac97 *ac97, int reg, struct snd_kcontro (ac97->ext_id & AC97_EI_REV_MASK) >= AC97_EI_REV_23 && (reg >= 0x60 && reg < 0x70)) { unsigned short page = (kcontrol->private_value >> 26) & 0x0f; - mutex_lock(&ac97->page_mutex); /* lock paging */ + down(&ac97->page_mutex); /* lock paging */ page_save = snd_ac97_read(ac97, AC97_INT_PAGING) & AC97_PAGE_MASK; snd_ac97_update_bits(ac97, AC97_INT_PAGING, AC97_PAGE_MASK, page); } @@ -487,7 +478,7 @@ static void snd_ac97_page_restore(struct snd_ac97 *ac97, int page_save) { if (page_save >= 0) { snd_ac97_update_bits(ac97, AC97_INT_PAGING, AC97_PAGE_MASK, page_save); - mutex_unlock(&ac97->page_mutex); /* unlock paging */ + up(&ac97->page_mutex); /* unlock paging */ } } @@ -683,12 +674,12 @@ static int snd_ac97_spdif_default_get(struct snd_kcontrol *kcontrol, struct snd_ { struct snd_ac97 *ac97 = snd_kcontrol_chip(kcontrol); - mutex_lock(&ac97->reg_mutex); + down(&ac97->reg_mutex); ucontrol->value.iec958.status[0] = ac97->spdif_status & 0xff; ucontrol->value.iec958.status[1] = (ac97->spdif_status >> 8) & 0xff; ucontrol->value.iec958.status[2] = (ac97->spdif_status >> 16) & 0xff; ucontrol->value.iec958.status[3] = (ac97->spdif_status >> 24) & 0xff; - mutex_unlock(&ac97->reg_mutex); + up(&ac97->reg_mutex); return 0; } @@ -727,7 +718,7 @@ static int snd_ac97_spdif_default_put(struct snd_kcontrol *kcontrol, struct snd_ } } - mutex_lock(&ac97->reg_mutex); + down(&ac97->reg_mutex); change = ac97->spdif_status != new; ac97->spdif_status = new; @@ -755,7 +746,7 @@ static int snd_ac97_spdif_default_put(struct snd_kcontrol *kcontrol, struct snd_ snd_ac97_update_bits_nolock(ac97, AC97_EXTENDED_STATUS, AC97_EA_SPDIF, AC97_EA_SPDIF); /* turn on again */ } } - mutex_unlock(&ac97->reg_mutex); + up(&ac97->reg_mutex); return change; } @@ -772,7 +763,7 @@ static int snd_ac97_put_spsa(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_ value = (ucontrol->value.integer.value[0] & mask); - mutex_lock(&ac97->reg_mutex); + down(&ac97->reg_mutex); mask <<= shift; value <<= shift; old = snd_ac97_read_cache(ac97, reg); @@ -786,7 +777,7 @@ static int snd_ac97_put_spsa(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_ if (extst & AC97_EA_SPDIF) snd_ac97_update_bits_nolock(ac97, AC97_EXTENDED_STATUS, AC97_EA_SPDIF, AC97_EA_SPDIF); /* turn on again */ } - mutex_unlock(&ac97->reg_mutex); + up(&ac97->reg_mutex); return change; } @@ -897,10 +888,10 @@ static int snd_ac97_ad18xx_pcm_get_volume(struct snd_kcontrol *kcontrol, struct struct snd_ac97 *ac97 = snd_kcontrol_chip(kcontrol); int codec = kcontrol->private_value & 3; - mutex_lock(&ac97->page_mutex); + down(&ac97->page_mutex); ucontrol->value.integer.value[0] = 31 - ((ac97->spec.ad18xx.pcmreg[codec] >> 0) & 31); ucontrol->value.integer.value[1] = 31 - ((ac97->spec.ad18xx.pcmreg[codec] >> 8) & 31); - mutex_unlock(&ac97->page_mutex); + up(&ac97->page_mutex); return 0; } @@ -1016,6 +1007,9 @@ static int snd_ac97_try_volume_mix(struct snd_ac97 * ac97, int reg) break; } + if (ac97->limited_regs && test_bit(reg, ac97->reg_accessed)) + return 1; /* allow without check */ + val = snd_ac97_read(ac97, reg); if (!(val & mask)) { /* nothing seems to be here - mute flag is not set */ @@ -1035,18 +1029,6 @@ static void check_volume_resolution(struct snd_ac97 *ac97, int reg, unsigned cha unsigned char max[3] = { 63, 31, 15 }; int i; - /* first look up the static resolution table */ - if (ac97->res_table) { - const struct snd_ac97_res_table *tbl; - for (tbl = ac97->res_table; tbl->reg; tbl++) { - if (tbl->reg == reg) { - *lo_max = tbl->bits & 0xff; - *hi_max = (tbl->bits >> 8) & 0xff; - return; - } - } - } - *lo_max = *hi_max = 0; for (i = 0 ; i < ARRAY_SIZE(cbit); i++) { unsigned short val; @@ -1236,8 +1218,7 @@ 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)) - && !(ac97->flags & AC97_AD_MULTI)) { + if (snd_ac97_try_volume_mix(ac97, AC97_CENTER_LFE_MASTER)) { 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) @@ -1249,8 +1230,7 @@ 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)) - && !(ac97->flags & AC97_AD_MULTI)) { + if (snd_ac97_try_volume_mix(ac97, AC97_CENTER_LFE_MASTER+1)) { 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) @@ -1262,8 +1242,7 @@ static int snd_ac97_mixer_build(struct snd_ac97 * ac97) } /* build surround controls */ - if ((snd_ac97_try_volume_mix(ac97, AC97_SURROUND_MASTER)) - && !(ac97->flags & AC97_AD_MULTI)) { + if (snd_ac97_try_volume_mix(ac97, AC97_SURROUND_MASTER)) { /* 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; @@ -1348,11 +1327,9 @@ static int snd_ac97_mixer_build(struct snd_ac97 * ac97) } /* build Aux controls */ - 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; - } + 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 */ @@ -1697,7 +1674,6 @@ 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 @@ -1790,8 +1766,6 @@ 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) { @@ -1879,10 +1853,11 @@ int snd_ac97_mixer(struct snd_ac97_bus *bus, struct snd_ac97_template *template, ac97->num = template->num; ac97->addr = template->addr; ac97->scaps = template->scaps; - ac97->res_table = template->res_table; + ac97->limited_regs = template->limited_regs; + memcpy(ac97->reg_accessed, template->reg_accessed, sizeof(ac97->reg_accessed)); bus->codec[ac97->num] = ac97; - mutex_init(&ac97->reg_mutex); - mutex_init(&ac97->page_mutex); + init_MUTEX(&ac97->reg_mutex); + init_MUTEX(&ac97->page_mutex); #ifdef CONFIG_PCI if (ac97->pci) { @@ -2135,7 +2110,6 @@ 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. @@ -2185,8 +2159,6 @@ void snd_ac97_suspend(struct snd_ac97 *ac97) snd_ac97_powerdown(ac97); } -EXPORT_SYMBOL(snd_ac97_suspend); - /* * restore ac97 status */ @@ -2288,8 +2260,6 @@ __reset_ready: snd_ac97_restore_iec958(ac97); } } - -EXPORT_SYMBOL(snd_ac97_resume); #endif @@ -2613,7 +2583,29 @@ 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 094cfc1f3..a444a78c7 100644 --- a/sound/pci/ac97/ac97_patch.c +++ b/sound/pci/ac97/ac97_patch.c @@ -27,8 +27,6 @@ #include #include #include -#include - #include #include #include @@ -57,12 +55,12 @@ static int ac97_update_bits_page(struct snd_ac97 *ac97, unsigned short reg, unsi unsigned short page_save; int ret; - mutex_lock(&ac97->page_mutex); + down(&ac97->page_mutex); page_save = snd_ac97_read(ac97, AC97_INT_PAGING) & AC97_PAGE_MASK; snd_ac97_update_bits(ac97, AC97_INT_PAGING, AC97_PAGE_MASK, page); ret = snd_ac97_update_bits(ac97, reg, mask, value); snd_ac97_update_bits(ac97, AC97_INT_PAGING, AC97_PAGE_MASK, page_save); - mutex_unlock(&ac97->page_mutex); /* unlock paging */ + up(&ac97->page_mutex); /* unlock paging */ return ret; } @@ -464,10 +462,6 @@ 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; } @@ -903,12 +897,12 @@ static int snd_ac97_stac9708_put_bias(struct snd_kcontrol *kcontrol, struct snd_ struct snd_ac97 *ac97 = snd_kcontrol_chip(kcontrol); int err; - mutex_lock(&ac97->page_mutex); + down(&ac97->page_mutex); snd_ac97_write(ac97, AC97_SIGMATEL_BIAS1, 0xabba); err = snd_ac97_update_bits(ac97, AC97_SIGMATEL_BIAS2, 0x0010, (ucontrol->value.integer.value[0] & 1) << 4); snd_ac97_write(ac97, AC97_SIGMATEL_BIAS1, 0); - mutex_unlock(&ac97->page_mutex); + up(&ac97->page_mutex); return err; } @@ -1371,13 +1365,6 @@ 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) @@ -1638,7 +1625,6 @@ 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 */ }; @@ -1824,8 +1810,6 @@ 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, @@ -1853,7 +1837,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 = ad1888_resume, + .resume = ad18xx_resume, #endif .update_jacks = ad1888_update_jacks, }; @@ -2062,10 +2046,7 @@ 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 && - /* ASUS A6KM requires EAPD */ - ! (ac97->subsystem_vendor == 0x1043 && - ac97->subsystem_device == 0x1103)) + if (ac97->spec.dev_flags) val |= 0x03; /* enable */ else val &= ~0x03; /* disable */ @@ -2842,33 +2823,3 @@ int mpatch_si3036(struct snd_ac97 * ac97) snd_ac97_write_cache(ac97, 0x68, 0); return 0; } - -/* - * LM 4550 Codec - * - * We use a static resolution table since LM4550 codec cannot be - * properly autoprobed to determine the resolution via - * check_volume_resolution(). - */ - -static struct snd_ac97_res_table lm4550_restbl[] = { - { AC97_MASTER, 0x1f1f }, - { AC97_HEADPHONE, 0x1f1f }, - { AC97_MASTER_MONO, 0x001f }, - { AC97_PC_BEEP, 0x001f }, /* LSB is ignored */ - { AC97_PHONE, 0x001f }, - { AC97_MIC, 0x001f }, - { AC97_LINE, 0x1f1f }, - { AC97_CD, 0x1f1f }, - { AC97_VIDEO, 0x1f1f }, - { AC97_AUX, 0x1f1f }, - { AC97_PCM, 0x1f1f }, - { AC97_REC_GAIN, 0x0f0f }, - { } /* terminator */ -}; - -int patch_lm4550(struct snd_ac97 *ac97) -{ - ac97->res_table = lm4550_restbl; - return 0; -} diff --git a/sound/pci/ac97/ac97_patch.h b/sound/pci/ac97/ac97_patch.h index adcaa0458..5060cb6f2 100644 --- a/sound/pci/ac97/ac97_patch.h +++ b/sound/pci/ac97/ac97_patch.h @@ -59,4 +59,3 @@ int patch_vt1616(struct snd_ac97 * ac97); int patch_vt1617a(struct snd_ac97 * ac97); int patch_it2646(struct snd_ac97 * ac97); int mpatch_si3036(struct snd_ac97 * ac97); -int patch_lm4550(struct snd_ac97 * ac97); diff --git a/sound/pci/ac97/ac97_pcm.c b/sound/pci/ac97/ac97_pcm.c index f684aa2c0..c3e590bf7 100644 --- a/sound/pci/ac97/ac97_pcm.c +++ b/sound/pci/ac97/ac97_pcm.c @@ -27,8 +27,6 @@ #include #include #include -#include - #include #include #include @@ -208,7 +206,7 @@ static int set_spdif_rate(struct snd_ac97 *ac97, unsigned short rate) mask = AC97_SC_SPSR_MASK; } - mutex_lock(&ac97->reg_mutex); + down(&ac97->reg_mutex); old = snd_ac97_read(ac97, reg) & mask; if (old != bits) { snd_ac97_update_bits_nolock(ac97, AC97_EXTENDED_STATUS, AC97_EA_SPDIF, 0); @@ -233,7 +231,7 @@ static int set_spdif_rate(struct snd_ac97 *ac97, unsigned short rate) ac97->spdif_status = sbits; } snd_ac97_update_bits_nolock(ac97, AC97_EXTENDED_STATUS, AC97_EA_SPDIF, AC97_EA_SPDIF); - mutex_unlock(&ac97->reg_mutex); + up(&ac97->reg_mutex); return 0; } @@ -317,8 +315,6 @@ 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)) @@ -552,8 +548,6 @@ 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 @@ -637,8 +631,6 @@ 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 @@ -664,8 +656,6 @@ 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) { @@ -717,5 +707,3 @@ 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 2118df50b..7134b3f55 100644 --- a/sound/pci/ac97/ac97_proc.c +++ b/sound/pci/ac97/ac97_proc.c @@ -24,8 +24,6 @@ #include #include -#include - #include #include #include @@ -340,7 +338,7 @@ static void snd_ac97_proc_read(struct snd_info_entry *entry, struct snd_info_buf { struct snd_ac97 *ac97 = entry->private_data; - mutex_lock(&ac97->page_mutex); + down(&ac97->page_mutex); if ((ac97->id & 0xffffff40) == AC97_ID_AD1881) { // Analog Devices AD1881/85/86 int idx; for (idx = 0; idx < 3; idx++) @@ -366,7 +364,7 @@ static void snd_ac97_proc_read(struct snd_info_entry *entry, struct snd_info_buf } else { snd_ac97_proc_read_main(ac97, buffer, 0); } - mutex_unlock(&ac97->page_mutex); + up(&ac97->page_mutex); } #ifdef CONFIG_SND_DEBUG @@ -376,7 +374,7 @@ static void snd_ac97_proc_regs_write(struct snd_info_entry *entry, struct snd_in struct snd_ac97 *ac97 = entry->private_data; char line[64]; unsigned int reg, val; - mutex_lock(&ac97->page_mutex); + down(&ac97->page_mutex); while (!snd_info_get_line(buffer, line, sizeof(line))) { if (sscanf(line, "%x %x", ®, &val) != 2) continue; @@ -384,7 +382,7 @@ static void snd_ac97_proc_regs_write(struct snd_info_entry *entry, struct snd_in if (reg < 0x80 && (reg & 1) == 0 && val <= 0xffff) snd_ac97_write_cache(ac97, reg, val); } - mutex_unlock(&ac97->page_mutex); + up(&ac97->page_mutex); } #endif @@ -403,7 +401,7 @@ static void snd_ac97_proc_regs_read(struct snd_info_entry *entry, { struct snd_ac97 *ac97 = entry->private_data; - mutex_lock(&ac97->page_mutex); + down(&ac97->page_mutex); if ((ac97->id & 0xffffff40) == AC97_ID_AD1881) { // Analog Devices AD1881/85/86 int idx; @@ -419,7 +417,7 @@ static void snd_ac97_proc_regs_read(struct snd_info_entry *entry, } else { snd_ac97_proc_regs_read_main(ac97, buffer, 0); } - mutex_unlock(&ac97->page_mutex); + up(&ac97->page_mutex); } void snd_ac97_proc_init(struct snd_ac97 * ac97) @@ -433,7 +431,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, snd_ac97_proc_read); + snd_info_set_text_ops(entry, ac97, 1024, snd_ac97_proc_read); if (snd_info_register(entry) < 0) { snd_info_free_entry(entry); entry = NULL; @@ -442,9 +440,10 @@ 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, snd_ac97_proc_regs_read); + snd_info_set_text_ops(entry, ac97, 1024, 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 94c26ec05..dcfb5036f 100644 --- a/sound/pci/ac97/ak4531_codec.c +++ b/sound/pci/ac97/ak4531_codec.c @@ -23,8 +23,6 @@ #include #include #include -#include - #include #include @@ -84,9 +82,9 @@ static int snd_ak4531_get_single(struct snd_kcontrol *kcontrol, struct snd_ctl_e int invert = (kcontrol->private_value >> 22) & 1; int val; - mutex_lock(&ak4531->reg_mutex); + down(&ak4531->reg_mutex); val = (ak4531->regs[reg] >> shift) & mask; - mutex_unlock(&ak4531->reg_mutex); + up(&ak4531->reg_mutex); if (invert) { val = mask - val; } @@ -109,11 +107,11 @@ static int snd_ak4531_put_single(struct snd_kcontrol *kcontrol, struct snd_ctl_e val = mask - val; } val <<= shift; - mutex_lock(&ak4531->reg_mutex); + down(&ak4531->reg_mutex); val = (ak4531->regs[reg] & ~(mask << shift)) | val; change = val != ak4531->regs[reg]; ak4531->write(ak4531, reg, ak4531->regs[reg] = val); - mutex_unlock(&ak4531->reg_mutex); + up(&ak4531->reg_mutex); return change; } @@ -145,10 +143,10 @@ static int snd_ak4531_get_double(struct snd_kcontrol *kcontrol, struct snd_ctl_e int invert = (kcontrol->private_value >> 22) & 1; int left, right; - mutex_lock(&ak4531->reg_mutex); + down(&ak4531->reg_mutex); left = (ak4531->regs[left_reg] >> left_shift) & mask; right = (ak4531->regs[right_reg] >> right_shift) & mask; - mutex_unlock(&ak4531->reg_mutex); + up(&ak4531->reg_mutex); if (invert) { left = mask - left; right = mask - right; @@ -178,7 +176,7 @@ static int snd_ak4531_put_double(struct snd_kcontrol *kcontrol, struct snd_ctl_e } left <<= left_shift; right <<= right_shift; - mutex_lock(&ak4531->reg_mutex); + down(&ak4531->reg_mutex); if (left_reg == right_reg) { left = (ak4531->regs[left_reg] & ~((mask << left_shift) | (mask << right_shift))) | left | right; change = left != ak4531->regs[left_reg]; @@ -190,7 +188,7 @@ static int snd_ak4531_put_double(struct snd_kcontrol *kcontrol, struct snd_ctl_e ak4531->write(ak4531, left_reg, ak4531->regs[left_reg] = left); ak4531->write(ak4531, right_reg, ak4531->regs[right_reg] = right); } - mutex_unlock(&ak4531->reg_mutex); + up(&ak4531->reg_mutex); return change; } @@ -217,12 +215,12 @@ static int snd_ak4531_get_input_sw(struct snd_kcontrol *kcontrol, struct snd_ctl int left_shift = (kcontrol->private_value >> 16) & 0x0f; int right_shift = (kcontrol->private_value >> 24) & 0x0f; - mutex_lock(&ak4531->reg_mutex); + down(&ak4531->reg_mutex); ucontrol->value.integer.value[0] = (ak4531->regs[reg1] >> left_shift) & 1; ucontrol->value.integer.value[1] = (ak4531->regs[reg2] >> left_shift) & 1; ucontrol->value.integer.value[2] = (ak4531->regs[reg1] >> right_shift) & 1; ucontrol->value.integer.value[3] = (ak4531->regs[reg2] >> right_shift) & 1; - mutex_unlock(&ak4531->reg_mutex); + up(&ak4531->reg_mutex); return 0; } @@ -236,7 +234,7 @@ static int snd_ak4531_put_input_sw(struct snd_kcontrol *kcontrol, struct snd_ctl int change; int val1, val2; - mutex_lock(&ak4531->reg_mutex); + down(&ak4531->reg_mutex); val1 = ak4531->regs[reg1] & ~((1 << left_shift) | (1 << right_shift)); val2 = ak4531->regs[reg2] & ~((1 << left_shift) | (1 << right_shift)); val1 |= (ucontrol->value.integer.value[0] & 1) << left_shift; @@ -246,7 +244,7 @@ static int snd_ak4531_put_input_sw(struct snd_kcontrol *kcontrol, struct snd_ctl change = val1 != ak4531->regs[reg1] || val2 != ak4531->regs[reg2]; ak4531->write(ak4531, reg1, ak4531->regs[reg1] = val1); ak4531->write(ak4531, reg2, ak4531->regs[reg2] = val2); - mutex_unlock(&ak4531->reg_mutex); + up(&ak4531->reg_mutex); return change; } @@ -368,7 +366,7 @@ int snd_ak4531_mixer(struct snd_card *card, struct snd_ak4531 *_ak4531, if (ak4531 == NULL) return -ENOMEM; *ak4531 = *_ak4531; - mutex_init(&ak4531->reg_mutex); + init_MUTEX(&ak4531->reg_mutex); if ((err = snd_component_add(card, "AK4531")) < 0) { snd_ak4531_free(ak4531); return err; @@ -453,7 +451,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, snd_ak4531_proc_read); + snd_info_set_text_ops(entry, ak4531, 1024, snd_ak4531_proc_read); } #endif diff --git a/sound/pci/ad1889.c b/sound/pci/ad1889.c index 0786d0eda..a208075cd 100644 --- a/sound/pci/ad1889.c +++ b/sound/pci/ad1889.c @@ -34,7 +34,6 @@ #include #include -#include #include #include #include @@ -241,14 +240,14 @@ ad1889_channel_reset(struct snd_ad1889 *chip, unsigned int channel) } } -static u16 +static inline 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 void +static inline void snd_ad1889_ac97_write(struct snd_ac97 *ac97, unsigned short reg, unsigned short val) { struct snd_ad1889 *chip = ac97->private_data; @@ -753,7 +752,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, snd_ad1889_proc_read); + snd_info_set_text_ops(entry, chip, 1024, snd_ad1889_proc_read); } static struct ac97_quirk ac97_quirks[] = { @@ -873,7 +872,7 @@ skip_hw: return 0; } -static int +static inline int snd_ad1889_dev_free(struct snd_device *device) { struct snd_ad1889 *chip = device->device_data; @@ -910,10 +909,10 @@ snd_ad1889_create(struct snd_card *card, if ((err = pci_enable_device(pci)) < 0) return err; - + /* check PCI availability (32bit DMA) */ - if (pci_set_dma_mask(pci, DMA_32BIT_MASK) < 0 || - pci_set_consistent_dma_mask(pci, DMA_32BIT_MASK) < 0) { + if (pci_set_dma_mask(pci, 0xffffffff) < 0 || + pci_set_consistent_dma_mask(pci, 0xffffffff) < 0) { printk(KERN_ERR PFX "error setting 32-bit DMA mask.\n"); pci_disable_device(pci); return -ENXIO; @@ -947,7 +946,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, - IRQF_DISABLED|IRQF_SHARED, card->driver, (void*)chip)) { + SA_INTERRUPT|SA_SHIRQ, card->driver, (void*)chip)) { printk(KERN_ERR PFX "cannot obtain IRQ %d\n", pci->irq); snd_ad1889_free(chip); return -EBUSY; diff --git a/sound/pci/ali5451/ali5451.c b/sound/pci/ali5451/ali5451.c index 74668398e..e264136e8 100644 --- a/sound/pci/ali5451/ali5451.c +++ b/sound/pci/ali5451/ali5451.c @@ -33,7 +33,6 @@ #include #include #include -#include #include #include #include @@ -49,7 +48,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; +static int spdif = 0; module_param(index, int, 0444); MODULE_PARM_DESC(index, "Index value for ALI M5451 PCI Audio."); @@ -2173,7 +2172,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, snd_ali_proc_read); + snd_info_set_text_ops(entry, codec, 1024, snd_ali_proc_read); } static int __devinit snd_ali_resources(struct snd_ali *codec) @@ -2185,7 +2184,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, IRQF_DISABLED|IRQF_SHARED, "ALI 5451", (void *)codec)) { + if (request_irq(codec->pci->irq, snd_ali_card_interrupt, SA_INTERRUPT|SA_SHIRQ, "ALI 5451", (void *)codec)) { snd_printk(KERN_ERR "Unable to request irq.\n"); return -EBUSY; } @@ -2221,8 +2220,8 @@ static int __devinit snd_ali_create(struct snd_card *card, if ((err = pci_enable_device(pci)) < 0) return err; /* check, if we can restrict PCI DMA transfers to 31 bits */ - if (pci_set_dma_mask(pci, DMA_31BIT_MASK) < 0 || - pci_set_consistent_dma_mask(pci, DMA_31BIT_MASK) < 0) { + if (pci_set_dma_mask(pci, 0x7fffffff) < 0 || + pci_set_consistent_dma_mask(pci, 0x7fffffff) < 0) { snd_printk(KERN_ERR "architecture does not support 31bit PCI busmaster DMA\n"); pci_disable_device(pci); return -ENXIO; diff --git a/sound/pci/als4000.c b/sound/pci/als4000.c index 9e596f750..7b2ff5f46 100644 --- a/sound/pci/als4000.c +++ b/sound/pci/als4000.c @@ -70,7 +70,6 @@ #include #include #include -#include #include #include #include @@ -689,8 +688,8 @@ static int __devinit snd_card_als4000_probe(struct pci_dev *pci, return err; } /* check, if we can restrict PCI DMA transfers to 24 bits */ - if (pci_set_dma_mask(pci, DMA_24BIT_MASK) < 0 || - pci_set_consistent_dma_mask(pci, DMA_24BIT_MASK) < 0) { + if (pci_set_dma_mask(pci, 0x00ffffff) < 0 || + pci_set_consistent_dma_mask(pci, 0x00ffffff) < 0) { snd_printk(KERN_ERR "architecture does not support 24bit PCI busmaster DMA\n"); pci_disable_device(pci); return -ENXIO; @@ -746,8 +745,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, MPU401_INFO_INTEGRATED, - pci->irq, 0, &chip->rmidi)) < 0) { + gcr+0x30, 1, 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 347e25ff0..b7217adaf 100644 --- a/sound/pci/atiixp.c +++ b/sound/pci/atiixp.c @@ -27,7 +27,6 @@ #include #include #include -#include #include #include #include @@ -278,7 +277,7 @@ struct atiixp { unsigned int codec_not_ready_bits; /* for codec detection */ int spdif_over_aclink; /* passed from the module option */ - struct mutex open_mutex; /* playback open mutex */ + struct semaphore open_mutex; /* playback open mutex */ }; @@ -1052,9 +1051,9 @@ static int snd_atiixp_playback_open(struct snd_pcm_substream *substream) struct atiixp *chip = snd_pcm_substream_chip(substream); int err; - mutex_lock(&chip->open_mutex); + down(&chip->open_mutex); err = snd_atiixp_pcm_open(substream, &chip->dmas[ATI_DMA_PLAYBACK], 0); - mutex_unlock(&chip->open_mutex); + up(&chip->open_mutex); if (err < 0) return err; substream->runtime->hw.channels_max = chip->max_channels; @@ -1069,9 +1068,9 @@ static int snd_atiixp_playback_close(struct snd_pcm_substream *substream) { struct atiixp *chip = snd_pcm_substream_chip(substream); int err; - mutex_lock(&chip->open_mutex); + down(&chip->open_mutex); err = snd_atiixp_pcm_close(substream, &chip->dmas[ATI_DMA_PLAYBACK]); - mutex_unlock(&chip->open_mutex); + up(&chip->open_mutex); return err; } @@ -1091,12 +1090,12 @@ static int snd_atiixp_spdif_open(struct snd_pcm_substream *substream) { struct atiixp *chip = snd_pcm_substream_chip(substream); int err; - mutex_lock(&chip->open_mutex); + down(&chip->open_mutex); if (chip->spdif_over_aclink) /* share DMA_PLAYBACK */ err = snd_atiixp_pcm_open(substream, &chip->dmas[ATI_DMA_PLAYBACK], 2); else err = snd_atiixp_pcm_open(substream, &chip->dmas[ATI_DMA_SPDIF], -1); - mutex_unlock(&chip->open_mutex); + up(&chip->open_mutex); return err; } @@ -1104,12 +1103,12 @@ static int snd_atiixp_spdif_close(struct snd_pcm_substream *substream) { struct atiixp *chip = snd_pcm_substream_chip(substream); int err; - mutex_lock(&chip->open_mutex); + down(&chip->open_mutex); if (chip->spdif_over_aclink) err = snd_atiixp_pcm_close(substream, &chip->dmas[ATI_DMA_PLAYBACK]); else err = snd_atiixp_pcm_close(substream, &chip->dmas[ATI_DMA_SPDIF]); - mutex_unlock(&chip->open_mutex); + up(&chip->open_mutex); return err; } @@ -1504,7 +1503,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, snd_atiixp_proc_read); + snd_info_set_text_ops(entry, chip, 1024, snd_atiixp_proc_read); } #else /* !CONFIG_PROC_FS */ #define snd_atiixp_proc_init(chip) @@ -1561,7 +1560,7 @@ static int __devinit snd_atiixp_create(struct snd_card *card, } spin_lock_init(&chip->reg_lock); - mutex_init(&chip->open_mutex); + init_MUTEX(&chip->open_mutex); chip->card = card; chip->pci = pci; chip->irq = -1; @@ -1578,7 +1577,7 @@ static int __devinit snd_atiixp_create(struct snd_card *card, return -EIO; } - if (request_irq(pci->irq, snd_atiixp_interrupt, IRQF_DISABLED|IRQF_SHARED, + if (request_irq(pci->irq, snd_atiixp_interrupt, SA_INTERRUPT|SA_SHIRQ, 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 a89d67c45..8d8fd5a4e 100644 --- a/sound/pci/atiixp_modem.c +++ b/sound/pci/atiixp_modem.c @@ -27,7 +27,6 @@ #include #include #include -#include #include #include #include @@ -256,7 +255,7 @@ struct atiixp_modem { unsigned int codec_not_ready_bits; /* for codec detection */ int spdif_over_aclink; /* passed from the module option */ - struct mutex open_mutex; /* playback open mutex */ + struct semaphore open_mutex; /* playback open mutex */ }; @@ -912,9 +911,9 @@ static int snd_atiixp_playback_open(struct snd_pcm_substream *substream) struct atiixp_modem *chip = snd_pcm_substream_chip(substream); int err; - mutex_lock(&chip->open_mutex); + down(&chip->open_mutex); err = snd_atiixp_pcm_open(substream, &chip->dmas[ATI_DMA_PLAYBACK], 0); - mutex_unlock(&chip->open_mutex); + up(&chip->open_mutex); if (err < 0) return err; return 0; @@ -924,9 +923,9 @@ static int snd_atiixp_playback_close(struct snd_pcm_substream *substream) { struct atiixp_modem *chip = snd_pcm_substream_chip(substream); int err; - mutex_lock(&chip->open_mutex); + down(&chip->open_mutex); err = snd_atiixp_pcm_close(substream, &chip->dmas[ATI_DMA_PLAYBACK]); - mutex_unlock(&chip->open_mutex); + up(&chip->open_mutex); return err; } @@ -1177,7 +1176,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, snd_atiixp_proc_read); + snd_info_set_text_ops(entry, chip, 1024, snd_atiixp_proc_read); } #else #define snd_atiixp_proc_init(chip) @@ -1234,7 +1233,7 @@ static int __devinit snd_atiixp_create(struct snd_card *card, } spin_lock_init(&chip->reg_lock); - mutex_init(&chip->open_mutex); + init_MUTEX(&chip->open_mutex); chip->card = card; chip->pci = pci; chip->irq = -1; @@ -1251,7 +1250,7 @@ static int __devinit snd_atiixp_create(struct snd_card *card, return -EIO; } - if (request_irq(pci->irq, snd_atiixp_interrupt, IRQF_DISABLED|IRQF_SHARED, + if (request_irq(pci->irq, snd_atiixp_interrupt, SA_INTERRUPT|SA_SHIRQ, 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/au88x0.c b/sound/pci/au88x0/au88x0.c index 6ed5ad59f..7d9184f73 100644 --- a/sound/pci/au88x0/au88x0.c +++ b/sound/pci/au88x0/au88x0.c @@ -128,7 +128,6 @@ 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); @@ -152,18 +151,14 @@ snd_vortex_create(struct snd_card *card, struct pci_dev *pci, vortex_t ** rchip) // check PCI availability (DMA). if ((err = pci_enable_device(pci)) < 0) return err; - if (pci_set_dma_mask(pci, DMA_32BIT_MASK) < 0 || - pci_set_consistent_dma_mask(pci, DMA_32BIT_MASK) < 0) { + if (pci_set_dma_mask(pci, DMA_32BIT_MASK)) { printk(KERN_ERR "error to set DMA mask\n"); - pci_disable_device(pci); return -ENXIO; } chip = kzalloc(sizeof(*chip), GFP_KERNEL); - if (chip == NULL) { - pci_disable_device(pci); + if (chip == NULL) return -ENOMEM; - } chip->card = card; @@ -198,7 +193,7 @@ snd_vortex_create(struct snd_card *card, struct pci_dev *pci, vortex_t ** rchip) } if ((err = request_irq(pci->irq, vortex_interrupt, - IRQF_DISABLED | IRQF_SHARED, CARD_NAME_SHORT, + SA_INTERRUPT | SA_SHIRQ, CARD_NAME_SHORT, chip)) != 0) { printk(KERN_ERR "cannot grab irq\n"); goto irq_out; @@ -213,8 +208,6 @@ snd_vortex_create(struct snd_card *card, struct pci_dev *pci, vortex_t ** rchip) goto alloc_out; } - snd_card_set_dev(card, &pci->dev); - *rchip = chip; return 0; @@ -262,13 +255,6 @@ 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) { @@ -331,6 +317,11 @@ 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 b1cfc3c79..c2ad2674b 100644 --- a/sound/pci/au88x0/au88x0.h +++ b/sound/pci/au88x0/au88x0.h @@ -19,6 +19,7 @@ #ifdef __KERNEL__ #include +#include #include #include #include @@ -38,8 +39,8 @@ #include "au88x0_wt.h" #endif -#define hwread(x,y) readl((x)+(y)) -#define hwwrite(x,y,z) writel((z),(x)+(y)) +#define hwread(x,y) readl((x)+((y)>>2)) +#define hwwrite(x,y,z) writel((z),(x)+((y)>>2)) /* Vortex MPU401 defines. */ #define MIDI_CLOCK_DIV 0x61 @@ -112,7 +113,7 @@ typedef struct { //int this_08; /* Still unknown */ int fifo_enabled; /* this_24 */ int fifo_status; /* this_1c */ - u32 dma_ctrl; /* this_78 (ADB), this_7c (WT) */ + int dma_ctrl; /* this_78 (ADB), this_7c (WT) */ int dma_unknown; /* this_74 (ADB), this_78 (WT). WDM: +8 */ int cfg0; int cfg1; @@ -177,7 +178,7 @@ struct snd_vortex { /* PCI hardware resources */ unsigned long io; - void __iomem *mmio; + unsigned long __iomem *mmio; unsigned int irq; spinlock_t lock; @@ -200,14 +201,14 @@ static void vortex_adbdma_setbuffers(vortex_t * vortex, int adbdma, int count); static void vortex_adbdma_setmode(vortex_t * vortex, int adbdma, int ie, int dir, int fmt, int d, - u32 offset); + unsigned long offset); static void vortex_adbdma_setstartbuffer(vortex_t * vortex, int adbdma, int sb); #ifndef CHIP_AU8810 static void vortex_wtdma_setbuffers(vortex_t * vortex, int wtdma, struct snd_sg_buf * sgbuf, int size, int count); static void vortex_wtdma_setmode(vortex_t * vortex, int wtdma, int ie, int fmt, int d, /*int e, */ - u32 offset); + unsigned long offset); static void vortex_wtdma_setstartbuffer(vortex_t * vortex, int wtdma, int sb); #endif @@ -270,21 +271,20 @@ static void vortex_mix_setvolumebyte(vortex_t * vortex, unsigned char mix, /* A3D functions. */ #ifndef CHIP_AU8820 -static void vortex_Vort3D_enable(vortex_t * v); -static void vortex_Vort3D_disable(vortex_t * v); +static void vortex_Vort3D(vortex_t * v, int en); static void vortex_Vort3D_connect(vortex_t * vortex, int en); static void vortex_Vort3D_InitializeSource(a3dsrc_t * a, int en); #endif /* Driver stuff. */ -static int vortex_gameport_register(vortex_t * card); +static int __devinit vortex_gameport_register(vortex_t * card); static void vortex_gameport_unregister(vortex_t * card); #ifndef CHIP_AU8820 -static int vortex_eq_init(vortex_t * vortex); -static int vortex_eq_free(vortex_t * vortex); +static int __devinit vortex_eq_init(vortex_t * vortex); +static int __devexit vortex_eq_free(vortex_t * vortex); #endif /* ALSA stuff. */ -static int snd_vortex_new_pcm(vortex_t * vortex, int idx, int nr); -static int snd_vortex_mixer(vortex_t * vortex); -static int snd_vortex_midi(vortex_t * vortex); +static int __devinit snd_vortex_new_pcm(vortex_t * vortex, int idx, int nr); +static int __devinit snd_vortex_mixer(vortex_t * vortex); +static int __devinit snd_vortex_midi(vortex_t * vortex); #endif diff --git a/sound/pci/au88x0/au88x0_a3d.c b/sound/pci/au88x0/au88x0_a3d.c index 649849e54..d215f393e 100644 --- a/sound/pci/au88x0/au88x0_a3d.c +++ b/sound/pci/au88x0/au88x0_a3d.c @@ -593,23 +593,24 @@ 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 __devinit vortex_Vort3D_enable(vortex_t * v) +static void vortex_Vort3D(vortex_t * v, int en) { int i; - - 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])); + 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); } /* Register ALSA controls */ - vortex_a3d_register_controls(v); -} - -static void vortex_Vort3D_disable(vortex_t * v) -{ - vortex_XtalkHw_Disable(v); - vortex_a3d_unregister_controls(v); + if (en) { + vortex_a3d_register_controls(v); + } else { + vortex_a3d_unregister_controls(v); + } } /* Make A3D subsystem connections. */ @@ -854,7 +855,7 @@ static struct snd_kcontrol_new vortex_a3d_kcontrol __devinitdata = { }; /* Control (un)registration. */ -static int __devinit vortex_a3d_register_controls(vortex_t * vortex) +static int 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 5299cce58..e3394fe63 100644 --- a/sound/pci/au88x0/au88x0_core.c +++ b/sound/pci/au88x0/au88x0_core.c @@ -376,7 +376,7 @@ vortex_mixer_delWTD(vortex_t * vortex, unsigned char mix, unsigned char ch) static void vortex_mixer_init(vortex_t * vortex) { - u32 addr; + unsigned long addr; int x; // FIXME: get rid of this crap. @@ -639,7 +639,7 @@ static void vortex_src_setupchannel(vortex_t * card, unsigned char src, static void vortex_srcblock_init(vortex_t * vortex) { - u32 addr; + unsigned long addr; int x; hwwrite(vortex->mmio, VORTEX_SRC_SOURCESIZE, 0x1ff); /* @@ -1035,7 +1035,7 @@ vortex_fifo_setwtctrl(vortex_t * vortex, int fifo, int ctrl, int priority, static void vortex_fifo_init(vortex_t * vortex) { int x; - u32 addr; + unsigned long addr; /* ADB DMA channels fifos. */ addr = VORTEX_FIFO_ADBCTRL + ((NR_ADB - 1) * 4); @@ -1054,7 +1054,7 @@ static void vortex_fifo_init(vortex_t * vortex) hwwrite(vortex->mmio, addr, FIFO_U0); if (hwread(vortex->mmio, addr) != FIFO_U0) printk(KERN_ERR - "bad wt fifo reset (0x%08x, 0x%08x)!\n", + "bad wt fifo reset (0x%08lx, 0x%08x)!\n", addr, hwread(vortex->mmio, addr)); vortex_fifo_clearwtdata(vortex, x, FIFO_SIZE); addr -= 4; @@ -1152,7 +1152,7 @@ vortex_adbdma_setbuffers(vortex_t * vortex, int adbdma, static void vortex_adbdma_setmode(vortex_t * vortex, int adbdma, int ie, int dir, - int fmt, int d, u32 offset) + int fmt, int d, unsigned long offset) { stream_t *dma = &vortex->dma_adb[adbdma]; @@ -1411,7 +1411,7 @@ vortex_wtdma_setbuffers(vortex_t * vortex, int wtdma, static void vortex_wtdma_setmode(vortex_t * vortex, int wtdma, int ie, int fmt, int d, - /*int e, */ u32 offset) + /*int e, */ unsigned long offset) { stream_t *dma = &vortex->dma_wt[wtdma]; @@ -2658,7 +2658,7 @@ static void vortex_spdif_init(vortex_t * vortex, int spdif_sr, int spdif_mode) /* Initialization */ -static int __devinit vortex_core_init(vortex_t * vortex) +static int vortex_core_init(vortex_t * vortex) { printk(KERN_INFO "Vortex: init.... "); @@ -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_enable(vortex); + vortex_Vort3D(vortex, 1); #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_disable(vortex); + vortex_Vort3D(vortex, 0); #endif //vortex_disable_timer_int(vortex); vortex_disable_int(vortex); diff --git a/sound/pci/au88x0/au88x0_eq.c b/sound/pci/au88x0/au88x0_eq.c index 0c86a31c4..c8280f82e 100644 --- a/sound/pci/au88x0/au88x0_eq.c +++ b/sound/pci/au88x0/au88x0_eq.c @@ -377,23 +377,23 @@ static void vortex_EqHw_GetLevels(vortex_t * vortex, u16 a[]) #endif /* Global Control */ -static void vortex_EqHw_SetControlReg(vortex_t * vortex, u32 reg) +static void vortex_EqHw_SetControlReg(vortex_t * vortex, unsigned long reg) { hwwrite(vortex->mmio, 0x2b440, reg); } -static void vortex_EqHw_SetSampleRate(vortex_t * vortex, u32 sr) +static void vortex_EqHw_SetSampleRate(vortex_t * vortex, int sr) { hwwrite(vortex->mmio, 0x2b440, ((sr & 0x1f) << 3) | 0xb800); } #if 0 -static void vortex_EqHw_GetControlReg(vortex_t * vortex, u32 *reg) +static void vortex_EqHw_GetControlReg(vortex_t * vortex, unsigned long *reg) { *reg = hwread(vortex->mmio, 0x2b440); } -static void vortex_EqHw_GetSampleRate(vortex_t * vortex, u32 *sr) +static void vortex_EqHw_GetSampleRate(vortex_t * vortex, int *sr) { *sr = (hwread(vortex->mmio, 0x2b440) >> 3) & 0x1f; } @@ -554,7 +554,7 @@ static void vortex_Eqlzr_SetRightGain(vortex_t * vortex, u16 index, u16 gain) #if 0 static int -vortex_Eqlzr_GetAllBands(vortex_t * vortex, u16 * gains, s32 *cnt) +vortex_Eqlzr_GetAllBands(vortex_t * vortex, u16 * gains, unsigned long *cnt) { eqlzr_t *eq = &(vortex->eq); int si = 0; @@ -586,7 +586,7 @@ static int vortex_Eqlzr_SetAllBandsFromActiveCoeffSet(vortex_t * vortex) } static int -vortex_Eqlzr_SetAllBands(vortex_t * vortex, u16 gains[], s32 count) +vortex_Eqlzr_SetAllBands(vortex_t * vortex, u16 gains[], unsigned long count) { eqlzr_t *eq = &(vortex->eq); int i; @@ -604,10 +604,11 @@ vortex_Eqlzr_SetAllBands(vortex_t * vortex, u16 gains[], s32 count) } static void -vortex_Eqlzr_SetA3dBypassGain(vortex_t * vortex, u32 a, u32 b) +vortex_Eqlzr_SetA3dBypassGain(vortex_t * vortex, unsigned long a, + unsigned long b) { eqlzr_t *eq = &(vortex->eq); - u32 eax, ebx; + int eax, ebx; eq->this58 = a; eq->this5c = b; @@ -623,7 +624,7 @@ vortex_Eqlzr_SetA3dBypassGain(vortex_t * vortex, u32 a, u32 b) static void vortex_Eqlzr_ProgramA3dBypassGain(vortex_t * vortex) { eqlzr_t *eq = &(vortex->eq); - u32 eax, ebx; + int eax, ebx; if (eq->this54) eax = eq->this0e; @@ -640,7 +641,7 @@ static void vortex_Eqlzr_ShutDownA3d(vortex_t * vortex) vortex_EqHw_ZeroA3DIO(vortex); } -static void vortex_Eqlzr_SetBypass(vortex_t * vortex, u32 bp) +static void vortex_Eqlzr_SetBypass(vortex_t * vortex, long bp) { eqlzr_t *eq = &(vortex->eq); @@ -650,8 +651,8 @@ static void vortex_Eqlzr_SetBypass(vortex_t * vortex, u32 bp) vortex_EqHw_SetBypassGain(vortex, eq->this08, eq->this08); } else { /* EQ disabled. */ - vortex_EqHw_SetLeftGainsTarget(vortex, eq->this14_array); - vortex_EqHw_SetRightGainsTarget(vortex, eq->this14_array); + vortex_EqHw_SetLeftGainsTarget(vortex, (u16 *) (eq->this14)); + vortex_EqHw_SetRightGainsTarget(vortex, (u16 *) (eq->this14)); vortex_EqHw_SetBypassGain(vortex, eq->this0c, eq->this0c); } vortex_Eqlzr_ProgramA3dBypassGain(vortex); @@ -705,7 +706,7 @@ static void vortex_Eqlzr_init(vortex_t * vortex) eq->this5c = 0xffff; /* Set gains. */ - memset(eq->this14_array, 0, sizeof(eq->this14_array)); + memset(eq->this14, 0, 2 * 10); /* Actual init. */ vortex_EqHw_ZeroState(vortex); @@ -791,7 +792,7 @@ snd_vortex_eq_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucon { vortex_t *vortex = snd_kcontrol_chip(kcontrol); int i = kcontrol->private_value; - u16 gainL = 0, gainR = 0; + u16 gainL, gainR; vortex_Eqlzr_GetLeftGain(vortex, i, &gainL); vortex_Eqlzr_GetRightGain(vortex, i, &gainR); @@ -805,7 +806,7 @@ snd_vortex_eq_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucon { vortex_t *vortex = snd_kcontrol_chip(kcontrol); int changed = 0, i = kcontrol->private_value; - u16 gainL = 0, gainR = 0; + u16 gainL, gainR; vortex_Eqlzr_GetLeftGain(vortex, i, &gainL); vortex_Eqlzr_GetRightGain(vortex, i, &gainR); @@ -885,7 +886,7 @@ static char *EqBandLabels[10] __devinitdata = { }; /* ALSA driver entry points. Init and exit. */ -static int __devinit vortex_eq_init(vortex_t * vortex) +static int vortex_eq_init(vortex_t * vortex) { struct snd_kcontrol *kcontrol; int err, i; diff --git a/sound/pci/au88x0/au88x0_eq.h b/sound/pci/au88x0/au88x0_eq.h index 474cd0046..e49bc625c 100644 --- a/sound/pci/au88x0/au88x0_eq.h +++ b/sound/pci/au88x0/au88x0_eq.h @@ -13,28 +13,31 @@ typedef struct { u16 LeftCoefs[50]; //0x4 u16 RightCoefs[50]; // 0x68 - u16 LeftGains[10]; //0xd0 - u16 RightGains[10]; //0xe4 + u16 LeftGains[20]; //0xd0 + u16 RightGains[20]; //0xe4 } auxxEqCoeffSet_t; typedef struct { - s32 this04; /* How many filters for each side (default = 10) */ - s32 this08; /* inited to cero. Stereo flag? */ + unsigned int *this00; /*CAsp4HwIO */ + long this04; /* How many filters for each side (default = 10) */ + long this08; /* inited to cero. Stereo flag? */ } eqhw_t; typedef struct { + unsigned int *this00; /*CAsp4Core */ eqhw_t this04; /* CHwEq */ - u16 this08; /* Bad codec flag ? SetBypassGain: bypass gain */ - u16 this0a; - u16 this0c; /* SetBypassGain: bypass gain when this28 is not set. */ - u16 this0e; + short this08; /* Bad codec flag ? SetBypassGain: bypass gain */ + short this0a; + short this0c; /* SetBypassGain: bypass gain when this28 is not set. */ + short this0e; - s32 this10; /* How many gains are used for each side (right or left). */ - u16 this14_array[10]; /* SetLeftGainsTarget: Left (and right?) EQ gains */ - s32 this28; /* flag related to EQ enabled or not. Gang flag ? */ - s32 this54; /* SetBypass */ - s32 this58; - s32 this5c; + long this10; /* How many gains are used for each side (right or left). */ + u16 this14[32]; /* SetLeftGainsTarget: Left (and right?) EQ gains */ + long this24; + long this28; /* flag related to EQ enabled or not. Gang flag ? */ + long this54; /* SetBypass */ + long this58; + long this5c; /*0x60 */ auxxEqCoeffSet_t coefset; /* 50 u16 word each channel. */ u16 this130[20]; /* Left and Right gains */ diff --git a/sound/pci/au88x0/au88x0_eqdata.c b/sound/pci/au88x0/au88x0_eqdata.c index ce8dca8ce..abf8d6ac4 100644 --- a/sound/pci/au88x0/au88x0_eqdata.c +++ b/sound/pci/au88x0/au88x0_eqdata.c @@ -104,11 +104,7 @@ static u16 asEqOutStateZeros[48] = { }; /*_rodataba0:*/ -static u16 eq_levels[64] = { - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +static long eq_levels[32] = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, diff --git a/sound/pci/au88x0/au88x0_mpu401.c b/sound/pci/au88x0/au88x0_mpu401.c index c75d368ea..82aec9112 100644 --- a/sound/pci/au88x0/au88x0_mpu401.c +++ b/sound/pci/au88x0/au88x0_mpu401.c @@ -70,6 +70,9 @@ 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); @@ -92,22 +95,18 @@ static int __devinit snd_vortex_midi(vortex_t * vortex) return temp; } #else - port = (unsigned long)(vortex->mmio + VORTEX_MIDI_DATA); + port = (unsigned long)(vortex->mmio + (VORTEX_MIDI_DATA >> 2)); if ((temp = snd_mpu401_uart_new(vortex->card, 0, MPU401_HW_AUREAL, port, - MPU401_INFO_INTEGRATED | MPU401_INFO_MMIO, - 0, 0, &rmidi)) != 0) { + 1, 0, 0, &rmidi)) != 0) { hwwrite(vortex->mmio, VORTEX_CTRL, (hwread(vortex->mmio, VORTEX_CTRL) & ~CTRL_MIDI_PORT) & ~CTRL_MIDI_EN); return temp; } mpu = rmidi->private_data; - mpu->cport = (unsigned long)(vortex->mmio + VORTEX_MIDI_CMD); + mpu->cport = (unsigned long)(vortex->mmio + (VORTEX_MIDI_CMD >> 2)); #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_pcm.c b/sound/pci/au88x0/au88x0_pcm.c index 7b5baa173..6a13ca1d5 100644 --- a/sound/pci/au88x0/au88x0_pcm.c +++ b/sound/pci/au88x0/au88x0_pcm.c @@ -506,7 +506,7 @@ static int __devinit snd_vortex_new_pcm(vortex_t * chip, int idx, int nr) int i; int err, nr_capt; - if ((chip == 0) || (idx < 0) || (idx >= VORTEX_PCM_LAST)) + if ((chip == 0) || (idx < 0) || (idx > VORTEX_PCM_LAST)) return -ENODEV; /* idx indicates which kind of PCM device. ADB, SPDIF, I2S and A3D share the diff --git a/sound/pci/au88x0/au88x0_synth.c b/sound/pci/au88x0/au88x0_synth.c index d3e662a12..65f375bad 100644 --- a/sound/pci/au88x0/au88x0_synth.c +++ b/sound/pci/au88x0/au88x0_synth.c @@ -32,7 +32,7 @@ static void vortex_connection_mixin_mix(vortex_t * vortex, int en, unsigned char mix, int a); static void vortex_fifo_wtinitialize(vortex_t * vortex, int fifo, int j); static int vortex_wt_SetReg(vortex_t * vortex, unsigned char reg, int wt, - u32 val); + unsigned long val); /* WT */ @@ -166,7 +166,7 @@ static int vortex_wt_GetReg(vortex_t * vortex, char reg, int wt) /* WT hardware abstraction layer generic register interface. */ static int vortex_wt_SetReg2(vortex_t * vortex, unsigned char reg, int wt, - u16 val) + unsigned short val) { /* int eax, edx; @@ -190,7 +190,7 @@ vortex_wt_SetReg2(vortex_t * vortex, unsigned char reg, int wt, #endif static int vortex_wt_SetReg(vortex_t * vortex, unsigned char reg, int wt, - u32 val) + unsigned long val) { int ecx; @@ -279,7 +279,7 @@ vortex_wt_SetReg(vortex_t * vortex, unsigned char reg, int wt, static void vortex_wt_init(vortex_t * vortex) { - u32 var4, var8, varc, var10 = 0, edi; + int var4, var8, varc, var10 = 0, edi; var10 &= 0xFFFFFFE3; var10 |= 0x22; @@ -353,7 +353,7 @@ static void vortex_wt_SetVolume(vortex_t * vortex, int wt, int vol[]) static void vortex_wt_SetFrequency(vortex_t * vortex, int wt, unsigned int sr) { wt_voice_t *voice = &(vortex->wt_voice[wt]); - u32 eax, edx; + long int eax, edx; //FIXME: 64 bit operation. eax = ((sr << 0xf) * 0x57619F1) & 0xffffffff; diff --git a/sound/pci/au88x0/au88x0_wt.h b/sound/pci/au88x0/au88x0_wt.h index 38d98f88a..d536c88b4 100644 --- a/sound/pci/au88x0/au88x0_wt.h +++ b/sound/pci/au88x0/au88x0_wt.h @@ -53,11 +53,11 @@ enum { #endif typedef struct { - u32 parm0; /* this_1E4 */ - u32 parm1; /* this_1E8 */ - u32 parm2; /* this_1EC */ - u32 parm3; /* this_1F0 */ - u32 this_1D0; + unsigned int parm0; /* this_1E4 */ + unsigned int parm1; /* this_1E8 */ + unsigned int parm2; /* this_1EC */ + unsigned int parm3; /* this_1F0 */ + unsigned int this_1D0; } wt_voice_t; #endif /* _AU88X0_WT_H */ diff --git a/sound/pci/au88x0/au88x0_xtalk.c b/sound/pci/au88x0/au88x0_xtalk.c index b4151e208..df915fa3f 100644 --- a/sound/pci/au88x0/au88x0_xtalk.c +++ b/sound/pci/au88x0/au88x0_xtalk.c @@ -66,20 +66,31 @@ static xtalk_gains_t const asXtalkGainsAllChan = { 0 //0x7FFF,0x7FFF,0x7FFF,0x7FFF,0x7fff,0x7FFF,0x7FFF,0x7FFF,0x7FFF,0x7fff }; -static xtalk_gains_t const asXtalkGainsZeros; +static xtalk_gains_t const asXtalkGainsZeros = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; -static xtalk_dline_t const alXtalkDlineZeros; +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 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; +static xtalk_instate_t const asXtalkInStateZeros = { 0, 0, 0, 0 }; static xtalk_instate_t const asXtalkInStateTest = { 0xFF80, 0x0080, 0xFFFF, 0x0001 }; -static xtalk_state_t const asXtalkOutStateZeros; - +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 short const sDiamondKLeftEq = 0x401d; static short const sDiamondKRightEq = 0x401d; static short const sDiamondKLeftXt = 0xF90E; @@ -151,7 +162,13 @@ static xtalk_coefs_t const asXtalkNarrowCoefsRightXt = { {0, 0, 0, 0, 0} }; -static xtalk_coefs_t const asXtalkCoefsZeros; +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 asXtalkCoefsPipe = { {0, 0, 0x0FA0, 0, 0}, {0, 0, 0x0FA0, 0, 0}, @@ -545,7 +562,7 @@ static void vortex_XtalkHw_SetDelay(vortex_t * vortex, unsigned short right, unsigned short left) { - u32 esp0 = 0; + int esp0 = 0; esp0 &= 0x1FFFFFFF; esp0 |= 0xA0000000; @@ -615,18 +632,18 @@ static void vortex_XtalkHw_GetRightDline(vortex_t * vortex, xtalk_dline_t dline) /* Control/Global stuff */ #if 0 -static void vortex_XtalkHw_SetControlReg(vortex_t * vortex, u32 ctrl) +static void vortex_XtalkHw_SetControlReg(vortex_t * vortex, unsigned long ctrl) { hwwrite(vortex->mmio, 0x24660, ctrl); } -static void vortex_XtalkHw_GetControlReg(vortex_t * vortex, u32 *ctrl) +static void vortex_XtalkHw_GetControlReg(vortex_t * vortex, unsigned long *ctrl) { *ctrl = hwread(vortex->mmio, 0x24660); } #endif -static void vortex_XtalkHw_SetSampleRate(vortex_t * vortex, u32 sr) +static void vortex_XtalkHw_SetSampleRate(vortex_t * vortex, int sr) { - u32 temp; + int temp; temp = (hwread(vortex->mmio, 0x24660) & 0x1FFFFFFF) | 0xC0000000; temp = (temp & 0xffffff07) | ((sr & 0x1f) << 3); @@ -634,7 +651,7 @@ static void vortex_XtalkHw_SetSampleRate(vortex_t * vortex, u32 sr) } #if 0 -static void vortex_XtalkHw_GetSampleRate(vortex_t * vortex, u32 *sr) +static void vortex_XtalkHw_GetSampleRate(vortex_t * vortex, int *sr) { *sr = (hwread(vortex->mmio, 0x24660) >> 3) & 0x1f; } @@ -642,7 +659,7 @@ static void vortex_XtalkHw_GetSampleRate(vortex_t * vortex, u32 *sr) #endif static void vortex_XtalkHw_Enable(vortex_t * vortex) { - u32 temp; + int temp; temp = (hwread(vortex->mmio, 0x24660) & 0x1FFFFFFF) | 0xC0000000; temp |= 1; @@ -652,7 +669,7 @@ static void vortex_XtalkHw_Enable(vortex_t * vortex) static void vortex_XtalkHw_Disable(vortex_t * vortex) { - u32 temp; + int temp; temp = (hwread(vortex->mmio, 0x24660) & 0x1FFFFFFF) | 0xC0000000; temp &= 0xfffffffe; diff --git a/sound/pci/au88x0/au88x0_xtalk.h b/sound/pci/au88x0/au88x0_xtalk.h index 7f4534b94..0b8d7b640 100644 --- a/sound/pci/au88x0/au88x0_xtalk.h +++ b/sound/pci/au88x0/au88x0_xtalk.h @@ -39,16 +39,16 @@ #define XT_SPEAKER1 3 #define XT_DIAMOND 4 -typedef u32 xtalk_dline_t[XTDLINE_SZ]; -typedef u16 xtalk_gains_t[XTGAINS_SZ]; -typedef u16 xtalk_instate_t[XTINST_SZ]; -typedef u16 xtalk_coefs_t[5][5]; -typedef u16 xtalk_state_t[5][4]; +typedef long xtalk_dline_t[XTDLINE_SZ]; +typedef short xtalk_gains_t[XTGAINS_SZ]; +typedef short xtalk_instate_t[XTINST_SZ]; +typedef short xtalk_coefs_t[5][5]; +typedef short xtalk_state_t[5][4]; static void vortex_XtalkHw_SetGains(vortex_t * vortex, xtalk_gains_t const gains); static void vortex_XtalkHw_SetGainsAllChan(vortex_t * vortex); -static void vortex_XtalkHw_SetSampleRate(vortex_t * vortex, u32 sr); +static void vortex_XtalkHw_SetSampleRate(vortex_t * vortex, int sr); static void vortex_XtalkHw_ProgramPipe(vortex_t * vortex); static void vortex_XtalkHw_ProgramPipe(vortex_t * vortex); static void vortex_XtalkHw_ProgramXtalkWide(vortex_t * vortex); diff --git a/sound/pci/azt3328.c b/sound/pci/azt3328.c index bac8e9cfd..e077eb3fb 100644 --- a/sound/pci/azt3328.c +++ b/sound/pci/azt3328.c @@ -33,21 +33,14 @@ * 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 SB PCI128 for 9 Euros) + * (and no, I did NOT go the easy way: to pick up a 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) - * 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. + * (really AC97 compliant?? I really doubt it when looking + * at the mixer register layout) * - builtin genuine OPL3 * - full duplex 16bit playback/record at independent sampling rate * - MPU401 (+ legacy address support) FIXME: how to enable legacy addr?? @@ -97,15 +90,10 @@ * * TODO * - test MPU401 MIDI playback etc. - * - 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... + * - 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. * - 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 @@ -116,7 +104,6 @@ #include #include #include -#include #include #include #include @@ -226,16 +213,6 @@ 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[] = { @@ -339,8 +316,10 @@ 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 @@ -350,7 +329,8 @@ 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 @@ -365,7 +345,8 @@ 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(); } @@ -532,18 +513,15 @@ snd_azf3328_info_mixer_enum(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo) { static const char * const texts1[] = { - "Mic1", "Mic2" + "ModemOut1", "ModemOut2" }; static const char * const texts2[] = { - "Mix", "Mic" + "MonoSelectSource1", "MonoSelectSource2" }; 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); @@ -552,19 +530,14 @@ 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) { - switch(reg.lchan_shift) { - case 8: /* modem out sel */ + if (reg.reg == IDX_MIXER_ADVCTL2) + { + if (reg.lchan_shift == 8) /* modem out sel */ strcpy(uinfo->value.enumerated.name, texts1[uinfo->value.enumerated.item]); - break; - case 9: /* mono sel source */ + else /* mono sel source */ strcpy(uinfo->value.enumerated.name, texts2[uinfo->value.enumerated.item]); - break; - case 15: /* PCM Out Path */ - strcpy(uinfo->value.enumerated.name, texts4[uinfo->value.enumerated.item]); - break; - } - } else + } + else strcpy(uinfo->value.enumerated.name, texts3[uinfo->value.enumerated.item] ); return 0; @@ -580,10 +553,12 @@ 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", @@ -603,13 +578,16 @@ 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); @@ -650,14 +628,13 @@ 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("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_ENUM("Modem Out Select", IDX_MIXER_ADVCTL2, 2, 8), + AZF3328_MIXER_ENUM("Mono Select Source", IDX_MIXER_ADVCTL2, 2, 9), 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 - Width", IDX_MIXER_ADVCTL1, 0x07, 1, 0), /* "3D Width" */ - AZF3328_MIXER_VOL_SPECIAL("3D Control - Depth", IDX_MIXER_ADVCTL1, 0x03, 8, 0), /* "Hifi 3D" */ + 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" */ #if MIXER_TESTING AZF3328_MIXER_SWITCH("0", IDX_MIXER_ADVCTL2, 0, 0), AZF3328_MIXER_SWITCH("1", IDX_MIXER_ADVCTL2, 1, 0), @@ -835,18 +812,22 @@ 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; @@ -979,13 +960,6 @@ 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"); @@ -1013,12 +987,6 @@ 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; @@ -1026,7 +994,6 @@ 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; } @@ -1100,13 +1067,6 @@ 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"); @@ -1127,12 +1087,6 @@ 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; @@ -1140,7 +1094,6 @@ 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; } @@ -1209,7 +1162,8 @@ 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); @@ -1219,43 +1173,50 @@ 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? @@ -1549,7 +1510,8 @@ 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) */ @@ -1707,8 +1669,8 @@ snd_azf3328_create(struct snd_card *card, chip->irq = -1; /* check if we can restrict PCI DMA transfers to 24 bits */ - if (pci_set_dma_mask(pci, DMA_24BIT_MASK) < 0 || - pci_set_consistent_dma_mask(pci, DMA_24BIT_MASK) < 0) { + if (pci_set_dma_mask(pci, 0x00ffffff) < 0 || + pci_set_consistent_dma_mask(pci, 0x00ffffff) < 0) { snd_printk(KERN_ERR "architecture does not support 24bit PCI busmaster DMA\n"); err = -ENXIO; goto out_err; @@ -1724,7 +1686,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, IRQF_DISABLED|IRQF_SHARED, card->shortname, (void *)chip)) { + if (request_irq(pci->irq, snd_azf3328_interrupt, SA_INTERRUPT|SA_SHIRQ, card->shortname, (void *)chip)) { snd_printk(KERN_ERR "unable to grab IRQ %d\n", pci->irq); err = -EBUSY; goto out_err; @@ -1803,11 +1765,9 @@ 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, MPU401_INFO_INTEGRATED, - pci->irq, 0, &chip->rmidi)) < 0) { + chip->mpu_port, 1, 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; } @@ -1830,8 +1790,6 @@ 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); @@ -1875,80 +1833,11 @@ 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 b4f3e3cd0..f489bdaf6 100644 --- a/sound/pci/azt3328.h +++ b/sound/pci/azt3328.h @@ -5,9 +5,6 @@ /*** 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, @@ -90,7 +87,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?? or external DAC via I2S?? (after playback, recording, ???, timer) **/ +/** hmm, what is this I/O area for? MPU401?? (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 */ @@ -110,8 +107,7 @@ #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 (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_6AH 0x6A /* this WORD can be set to have bits 0x0028 activated; actually inhibits PCM playback!!! maybe power management?? */ #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 */ @@ -119,25 +115,15 @@ /*** 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) - * UNFORTUNATELY azf3328 is NOT truly AC97 compliant: see main file intro */ -#define AZF_IO_SIZE_MIXER 0x40 -#define AZF_IO_SIZE_MIXER_PM 0x22 - + * generally spoken: AC97 register index = AZF3328 mixer reg index + 2 + * (in other words: AZF3328 NOT fully AC97 compliant) */ #define MIXER_VOLUME_RIGHT_MASK 0x001f #define MIXER_VOLUME_LEFT_MASK 0x1f00 #define MIXER_MUTE_MASK 0x8000 @@ -170,14 +156,14 @@ #define IDX_MIXER_ADVCTL1 0x1e /* unlisted bits are unmodifiable */ #define MIXER_ADVCTL1_3DWIDTH_MASK 0x000e - #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! */ + #define MIXER_ADVCTL1_HIFI3D_MASK 0x0300 +#define IDX_MIXER_ADVCTL2 0x20 /* resembles AC97_GENERAL_PURPOSE reg! */ /* unlisted bits are unmodifiable */ - #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 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 IDX_MIXER_SOMETHING30H 0x30 /* used, but unknown??? */ diff --git a/sound/pci/bt87x.c b/sound/pci/bt87x.c index 97a280a24..c840a4c08 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]; /* digital input rate */ +static int digital_rate[SNDRV_CARDS] = { [0 ... (SNDRV_CARDS-1)] = 0 }; /* 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, IRQF_DISABLED | IRQF_SHARED, + if (request_irq(pci->irq, snd_bt87x_interrupt, SA_INTERRUPT | SA_SHIRQ, "Bt87x audio", chip)) { snd_bt87x_free(chip); snd_printk(KERN_ERR "cannot grab irq\n"); @@ -781,10 +781,6 @@ static struct pci_device_id snd_bt87x_ids[] = { BT_DEVICE(PCI_DEVICE_ID_BROOKTREE_879, 0x0070, 0x13eb, 32000), /* Viewcast Osprey 200 */ BT_DEVICE(PCI_DEVICE_ID_BROOKTREE_878, 0x0070, 0xff01, 44100), - /* 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), { } @@ -797,15 +793,12 @@ static struct { unsigned short subvendor, subdevice; } blacklist[] __devinitdata = { {0x0071, 0x0101}, /* Nebula Electronics DigiTV */ - {0x11bd, 0x001c}, /* Pinnacle PCTV Sat */ {0x11bd, 0x0026}, /* Pinnacle PCTV SAT CI */ {0x1461, 0x0761}, /* AVermedia AverTV DVB-T */ {0x1461, 0x0771}, /* AVermedia DVB-T 771 */ {0x1822, 0x0001}, /* Twinhan VisionPlus DVB-T */ - {0x18ac, 0xd500}, /* DVICO FusionHDTV 5 Lite */ {0x18ac, 0xdb10}, /* DVICO FusionHDTV DVB-T Lite */ {0x270f, 0xfc00}, /* Chaintech Digitop DST-1000 DVB-S */ - {0x7063, 0x2000}, /* pcHDTV HD-2000 TV */ }; static struct pci_driver driver; @@ -823,13 +816,13 @@ static int __devinit snd_bt87x_detect_card(struct pci_dev *pci) for (i = 0; i < ARRAY_SIZE(blacklist); ++i) if (blacklist[i].subvendor == pci->subsystem_vendor && blacklist[i].subdevice == pci->subsystem_device) { - snd_printdd(KERN_INFO "card %#04x-%#04x:%#04x has no audio\n", - pci->device, pci->subsystem_vendor, pci->subsystem_device); + snd_printdd(KERN_INFO "card %#04x:%#04x has no audio\n", + pci->subsystem_vendor, pci->subsystem_device); return -EBUSY; } - snd_printk(KERN_INFO "unknown card %#04x-%#04x:%#04x, using default rate 32000\n", - pci->device, pci->subsystem_vendor, pci->subsystem_device); + snd_printk(KERN_INFO "unknown card %#04x:%#04x, using default rate 32000\n", + pci->subsystem_vendor, pci->subsystem_device); snd_printk(KERN_DEBUG "please mail id, board name, and, " "if it works, the correct digital_rate option to " "\n"); @@ -888,9 +881,8 @@ 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 %#llx, irq %i", - card->shortname, (unsigned long long)pci_resource_start(pci, 0), - chip->irq); + sprintf(card->longname, "%s at %#lx, irq %i", + card->shortname, pci_resource_start(pci, 0), chip->irq); strcpy(card->mixername, "Bt87x"); err = snd_card_register(card); @@ -914,7 +906,7 @@ static void __devexit snd_bt87x_remove(struct pci_dev *pci) /* default entries for all Bt87x cards - it's not exported */ /* driver_data is set to 0 to call detection */ -static struct pci_device_id snd_bt87x_default_ids[] __devinitdata = { +static struct pci_device_id snd_bt87x_default_ids[] = { BT_DEVICE(PCI_DEVICE_ID_BROOKTREE_878, PCI_ANY_ID, PCI_ANY_ID, 0), BT_DEVICE(PCI_DEVICE_ID_BROOKTREE_879, PCI_ANY_ID, PCI_ANY_ID, 0), { } diff --git a/sound/pci/ca0106/ca0106.h b/sound/pci/ca0106/ca0106.h index 9cb66c59f..c8131ea92 100644 --- a/sound/pci/ca0106/ca0106.h +++ b/sound/pci/ca0106/ca0106.h @@ -537,9 +537,9 @@ #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_PHONE 0x00000001 //Value to select TAD at ADC Mux (Not used) #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 */ @@ -604,8 +604,6 @@ struct snd_ca0106 { 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; diff --git a/sound/pci/ca0106/ca0106_main.c b/sound/pci/ca0106/ca0106_main.c index 12bbbb6af..9477838a9 100644 --- a/sound/pci/ca0106/ca0106_main.c +++ b/sound/pci/ca0106/ca0106_main.c @@ -186,8 +186,8 @@ static struct snd_ca0106_details ca0106_chip_details[] = { /* New Audigy SE. Has a different DAC. */ /* SB0570: * CTRL:CA0106-DAT - * ADC: WM8775EDS - * DAC: WM8768GEDS + * ADC: WM8768GEDS + * DAC: WM8775EDS */ { .serial = 0x100a1102, .name = "Audigy SE [SB0570]", @@ -195,14 +195,9 @@ static struct snd_ca0106_details ca0106_chip_details[] = { .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, + .gpio_type = 1, .i2c_adc = 1 } , /* Shuttle XPC SD31P which has an onboard Creative Labs * Sound Blaster Live! 24-bit EAX @@ -331,7 +326,6 @@ int snd_ca0106_spi_write(struct snd_ca0106 * emu, 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) @@ -346,7 +340,6 @@ int snd_ca0106_i2c_write(struct snd_ca0106 *emu, } 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); */ @@ -355,9 +348,8 @@ int snd_ca0106_i2c_write(struct snd_ca0106 *emu, 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 = 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 = tmp | (I2C_A_ADC_LAST|I2C_A_ADC_START|I2C_A_ADC_ADD); snd_ca0106_ptr_write(emu, I2C_A, 0, tmp); @@ -1189,7 +1181,7 @@ static unsigned int spi_dac_init[] = { 0x02ff, 0x0400, 0x0520, - 0x0620, /* Set 24 bit. Was 0x0600 */ + 0x0600, 0x08ff, 0x0aff, 0x0cff, @@ -1208,22 +1200,6 @@ static unsigned int spi_dac_init[] = { 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, struct snd_ca0106 **rchip) @@ -1268,7 +1244,7 @@ static int __devinit snd_ca0106_create(struct snd_card *card, } if (request_irq(pci->irq, snd_ca0106_interrupt, - IRQF_DISABLED|IRQF_SHARED, "snd_ca0106", + SA_INTERRUPT|SA_SHIRQ, "snd_ca0106", (void *)chip)) { snd_ca0106_free(chip); printk(KERN_ERR "cannot grab irq\n"); @@ -1385,12 +1361,7 @@ static int __devinit snd_ca0106_create(struct snd_card *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->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(0x005f5301, chip->port+GPIO); /* Analog */ - } else if (chip->details->gpio_type == 1) { /* The SB0410 and SB0413 use GPIO differently. */ + 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 */ @@ -1408,19 +1379,7 @@ static int __devinit snd_ca0106_create(struct snd_card *card, 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. */ + 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; diff --git a/sound/pci/ca0106/ca0106_mixer.c b/sound/pci/ca0106/ca0106_mixer.c index 146eed70d..06fe05567 100644 --- a/sound/pci/ca0106/ca0106_mixer.c +++ b/sound/pci/ca0106/ca0106_mixer.c @@ -171,76 +171,6 @@ static int snd_ca0106_capture_source_put(struct snd_kcontrol *kcontrol, return change; } -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) { @@ -277,16 +207,16 @@ static int snd_ca0106_capture_mic_line_in_put(struct snd_kcontrol *kcontrol, if (change) { emu->capture_mic_line_in = val; if (val) { - //snd_ca0106_i2c_write(emu, ADC_MUX, 0); /* Mute input */ + snd_ca0106_i2c_write(emu, ADC_MUX, ADC_MUX_PHONE); /* 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); + snd_ca0106_i2c_write(emu, ADC_MUX, ADC_MUX_MIC); } else { - //snd_ca0106_i2c_write(emu, ADC_MUX, 0); /* Mute input */ + snd_ca0106_i2c_write(emu, ADC_MUX, ADC_MUX_PHONE); /* Mute input */ tmp = inl(emu->port+GPIO) & ~0x400; outl(tmp, emu->port+GPIO); - //snd_ca0106_i2c_write(emu, ADC_MUX, ADC_MUX_LINEIN); + snd_ca0106_i2c_write(emu, ADC_MUX, ADC_MUX_LINEIN); } } return change; @@ -295,22 +225,12 @@ static int snd_ca0106_capture_mic_line_in_put(struct snd_kcontrol *kcontrol, static struct snd_kcontrol_new snd_ca0106_capture_mic_line_in __devinitdata = { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "Shared Mic/Line in Capture Switch", + .name = "Mic/Line in Capture", .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 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) { @@ -409,81 +329,15 @@ static int snd_ca0106_volume_put(struct snd_kcontrol *kcontrol, return 1; } -static int snd_ca0106_i2c_volume_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - 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_i2c_volume_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - 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 int snd_ca0106_i2c_volume_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_ca0106 *emu = snd_kcontrol_chip(kcontrol); - unsigned int ogain; - unsigned int ngain; - int source_id; - int change = 0; - - 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, \ + .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", @@ -507,11 +361,6 @@ static struct snd_kcontrol_new snd_ca0106_volume_ctls[] __devinitdata = { 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, @@ -529,18 +378,11 @@ static struct snd_kcontrol_new snd_ca0106_volume_ctls[] __devinitdata = { }, { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "Digital Capture Source", + .name = "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), @@ -635,10 +477,7 @@ int __devinit snd_ca0106_mixer(struct snd_ca0106 *emu) 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)); + err = snd_ctl_add(card, snd_ctl_new1(&snd_ca0106_capture_mic_line_in, emu)); if (err < 0) return err; } diff --git a/sound/pci/ca0106/ca0106_proc.c b/sound/pci/ca0106/ca0106_proc.c index 75ca421eb..63757273b 100644 --- a/sound/pci/ca0106/ca0106_proc.c +++ b/sound/pci/ca0106/ca0106_proc.c @@ -431,30 +431,33 @@ int __devinit snd_ca0106_proc_init(struct snd_ca0106 * emu) struct snd_info_entry *entry; if(! snd_card_proc_new(emu->card, "iec958", &entry)) - snd_info_set_text_ops(entry, emu, snd_ca0106_proc_iec958); + snd_info_set_text_ops(entry, emu, 1024, snd_ca0106_proc_iec958); if(! snd_card_proc_new(emu->card, "ca0106_reg32", &entry)) { - snd_info_set_text_ops(entry, emu, snd_ca0106_proc_reg_read32); + snd_info_set_text_ops(entry, emu, 1024, snd_ca0106_proc_reg_read32); + entry->c.text.write_size = 64; 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, snd_ca0106_proc_reg_read16); + snd_info_set_text_ops(entry, emu, 1024, snd_ca0106_proc_reg_read16); if(! snd_card_proc_new(emu->card, "ca0106_reg8", &entry)) - snd_info_set_text_ops(entry, emu, snd_ca0106_proc_reg_read8); + snd_info_set_text_ops(entry, emu, 1024, snd_ca0106_proc_reg_read8); if(! snd_card_proc_new(emu->card, "ca0106_regs1", &entry)) { - snd_info_set_text_ops(entry, emu, snd_ca0106_proc_reg_read1); + snd_info_set_text_ops(entry, emu, 1024, snd_ca0106_proc_reg_read1); + entry->c.text.write_size = 64; 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); + snd_info_set_text_ops(entry, emu, 1024, snd_ca0106_proc_i2c_write); + entry->c.text.write_size = 64; 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, snd_ca0106_proc_reg_read2); + snd_info_set_text_ops(entry, emu, 1024, snd_ca0106_proc_reg_read2); return 0; } diff --git a/sound/pci/cmipci.c b/sound/pci/cmipci.c index 876b64464..c03b0a0a3 100644 --- a/sound/pci/cmipci.c +++ b/sound/pci/cmipci.c @@ -29,7 +29,6 @@ #include #include #include -#include #include #include #include @@ -440,7 +439,7 @@ struct cmipci { struct snd_pcm_hardware *hw_info[3]; /* for playbacks */ int opened[2]; /* open mode */ - struct mutex open_mutex; + struct semaphore open_mutex; unsigned int mixer_insensitive: 1; struct snd_kcontrol *mixer_res_ctl[CM_SAVED_MIXERS]; @@ -642,14 +641,14 @@ static int snd_cmipci_playback2_hw_params(struct snd_pcm_substream *substream, { struct cmipci *cm = snd_pcm_substream_chip(substream); if (params_channels(hw_params) > 2) { - mutex_lock(&cm->open_mutex); + down(&cm->open_mutex); if (cm->opened[CM_CH_PLAY]) { - mutex_unlock(&cm->open_mutex); + up(&cm->open_mutex); return -EBUSY; } /* reserve the channel A */ cm->opened[CM_CH_PLAY] = CM_OPEN_PLAYBACK_MULTI; - mutex_unlock(&cm->open_mutex); + up(&cm->open_mutex); } return snd_pcm_lib_malloc_pages(substream, params_buffer_bytes(hw_params)); } @@ -1462,9 +1461,9 @@ static int open_device_check(struct cmipci *cm, int mode, struct snd_pcm_substre * pcm framework doesn't pass file pointer before actually opened, * we can't know whether blocking mode or not in open callback.. */ - mutex_lock(&cm->open_mutex); + down(&cm->open_mutex); if (cm->opened[ch]) { - mutex_unlock(&cm->open_mutex); + up(&cm->open_mutex); return -EBUSY; } cm->opened[ch] = mode; @@ -1476,7 +1475,7 @@ static int open_device_check(struct cmipci *cm, int mode, struct snd_pcm_substre snd_cmipci_clear_bit(cm, CM_REG_MISC_CTRL, CM_ENDBDAC); spin_unlock_irq(&cm->reg_lock); } - mutex_unlock(&cm->open_mutex); + up(&cm->open_mutex); return 0; } @@ -1484,7 +1483,7 @@ static void close_device_check(struct cmipci *cm, int mode) { int ch = mode & CM_OPEN_CH_MASK; - mutex_lock(&cm->open_mutex); + down(&cm->open_mutex); if (cm->opened[ch] == mode) { if (cm->channel[ch].substream) { snd_cmipci_ch_reset(cm, ch); @@ -1500,7 +1499,7 @@ static void close_device_check(struct cmipci *cm, int mode) spin_unlock_irq(&cm->reg_lock); } } - mutex_unlock(&cm->open_mutex); + up(&cm->open_mutex); } /* @@ -1547,7 +1546,7 @@ static int snd_cmipci_playback2_open(struct snd_pcm_substream *substream) if ((err = open_device_check(cm, CM_OPEN_PLAYBACK2, substream)) < 0) /* use channel B */ return err; runtime->hw = snd_cmipci_playback2; - mutex_lock(&cm->open_mutex); + down(&cm->open_mutex); if (! cm->opened[CM_CH_PLAY]) { if (cm->can_multi_ch) { runtime->hw.channels_max = cm->max_channels; @@ -1560,7 +1559,7 @@ static int snd_cmipci_playback2_open(struct snd_pcm_substream *substream) } snd_pcm_hw_constraint_minmax(runtime, SNDRV_PCM_HW_PARAM_BUFFER_SIZE, 0, 0x10000); } - mutex_unlock(&cm->open_mutex); + up(&cm->open_mutex); return 0; } @@ -2121,7 +2120,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 Playback Switch", CM_REG_EXTENT_IND, CM_REG_EXTENT_IND, 3, 3, 1, 0, 0), + CMIPCI_DOUBLE("PC Speaker Playnack 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,7 +2601,7 @@ 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, snd_cmipci_proc_read); + snd_info_set_text_ops(entry, cm, 1024, snd_cmipci_proc_read); } #else /* !CONFIG_PROC_FS */ static inline void snd_cmipci_proc_init(struct cmipci *cm) {} @@ -2845,7 +2844,7 @@ static int __devinit snd_cmipci_create(struct snd_card *card, struct pci_dev *pc } spin_lock_init(&cm->reg_lock); - mutex_init(&cm->open_mutex); + init_MUTEX(&cm->open_mutex); cm->device = pci->device; cm->card = card; cm->pci = pci; @@ -2862,7 +2861,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, - IRQF_DISABLED|IRQF_SHARED, card->driver, cm)) { + SA_INTERRUPT|SA_SHIRQ, card->driver, cm)) { snd_printk(KERN_ERR "unable to grab IRQ %d\n", pci->irq); snd_cmipci_free(cm); return -EBUSY; @@ -2932,7 +2931,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 && mpu_port[dev] == 1) + if (integrated_midi) iomidi = cm->iobase + CM_REG_MPU_PCI; else { iomidi = mpu_port[dev]; @@ -2981,9 +2980,7 @@ 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 ? - MPU401_INFO_INTEGRATED : 0), + iomidi, integrated_midi, 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 9631456ec..4f65ec56b 100644 --- a/sound/pci/cs4281.c +++ b/sound/pci/cs4281.c @@ -1046,7 +1046,7 @@ static int snd_cs4281_put_volume(struct snd_kcontrol *kcontrol, snd_cs4281_pokeBA0(chip, regL, volL); change = 1; } - if (ucontrol->value.integer.value[1] != volR) { + if (ucontrol->value.integer.value[0] != volL) { volR = CS_VOL_MASK - (ucontrol->value.integer.value[1] & CS_VOL_MASK); snd_cs4281_pokeBA0(chip, regR, volR); change = 1; @@ -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, snd_cs4281_proc_read); + snd_info_set_text_ops(entry, chip, 1024, 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,7 @@ 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); - 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) { - snd_cs4281_free(chip); - return -ENOMEM; - } - - if (request_irq(pci->irq, snd_cs4281_interrupt, IRQF_DISABLED|IRQF_SHARED, + 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); @@ -1394,6 +1387,13 @@ static int __devinit snd_cs4281_create(struct snd_card *card, } 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) { + snd_cs4281_free(chip); + return -ENOMEM; + } + tmp = snd_cs4281_chip_init(chip); if (tmp) { snd_cs4281_free(chip); @@ -1416,7 +1416,7 @@ static int __devinit snd_cs4281_create(struct snd_card *card, static int snd_cs4281_chip_init(struct cs4281 *chip) { unsigned int tmp; - unsigned long end_time; + int timeout; int retry_count = 2; /* Having EPPMC.FPDN=1 prevent proper chip initialisation */ @@ -1496,7 +1496,7 @@ static int snd_cs4281_chip_init(struct cs4281 *chip) /* * Wait for the DLL ready signal from the clock logic. */ - end_time = jiffies + HZ; + timeout = 100; do { /* * Read the AC97 status register to see if we've seen a CODEC @@ -1504,8 +1504,8 @@ static int snd_cs4281_chip_init(struct cs4281 *chip) */ if (snd_cs4281_peekBA0(chip, BA0_CLKCR1) & BA0_CLKCR1_DLLRDY) goto __ok0; - schedule_timeout_uninterruptible(1); - } while (time_after_eq(end_time, jiffies)); + msleep(1); + } while (timeout-- > 0); snd_printk(KERN_ERR "DLLRDY not seen\n"); return -EIO; @@ -1522,7 +1522,7 @@ static int snd_cs4281_chip_init(struct cs4281 *chip) /* * Wait for the codec ready signal from the AC97 codec. */ - end_time = jiffies + HZ; + timeout = 100; do { /* * Read the AC97 status register to see if we've seen a CODEC @@ -1530,20 +1530,20 @@ static int snd_cs4281_chip_init(struct cs4281 *chip) */ if (snd_cs4281_peekBA0(chip, BA0_ACSTS) & BA0_ACSTS_CRDY) goto __ok1; - schedule_timeout_uninterruptible(1); - } while (time_after_eq(end_time, jiffies)); + msleep(1); + } while (timeout-- > 0); snd_printk(KERN_ERR "never read codec ready from AC'97 (0x%x)\n", snd_cs4281_peekBA0(chip, BA0_ACSTS)); return -EIO; __ok1: if (chip->dual_codec) { - end_time = jiffies + HZ; + timeout = 100; do { if (snd_cs4281_peekBA0(chip, BA0_ACSTS2) & BA0_ACSTS_CRDY) goto __codec2_ok; - schedule_timeout_uninterruptible(1); - } while (time_after_eq(end_time, jiffies)); + msleep(1); + } while (timeout-- > 0); snd_printk(KERN_INFO "secondary codec doesn't respond. disable it...\n"); chip->dual_codec = 0; __codec2_ok: ; @@ -1561,7 +1561,7 @@ static int snd_cs4281_chip_init(struct cs4281 *chip) * the codec is pumping ADC data across the AC-link. */ - end_time = jiffies + HZ; + timeout = 100; do { /* * Read the input slot valid register and see if input slots 3 @@ -1569,8 +1569,8 @@ static int snd_cs4281_chip_init(struct cs4281 *chip) */ if ((snd_cs4281_peekBA0(chip, BA0_ACISV) & (BA0_ACISV_SLV(3) | BA0_ACISV_SLV(4))) == (BA0_ACISV_SLV(3) | BA0_ACISV_SLV(4))) goto __ok2; - schedule_timeout_uninterruptible(1); - } while (time_after_eq(end_time, jiffies)); + msleep(1); + } while (timeout-- > 0); if (--retry_count > 0) goto __retry; diff --git a/sound/pci/cs46xx/cs46xx.c b/sound/pci/cs46xx/cs46xx.c index 8b6cd144d..c590602e2 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]; -static int thinkpad[SNDRV_CARDS]; +static int external_amp[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 0}; +static int thinkpad[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 0}; static int mmap_valid[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 1}; module_param_array(index, int, NULL, 0444); diff --git a/sound/pci/cs46xx/cs46xx_lib.c b/sound/pci/cs46xx/cs46xx_lib.c index 485184718..8fb275d6e 100644 --- a/sound/pci/cs46xx/cs46xx_lib.c +++ b/sound/pci/cs46xx/cs46xx_lib.c @@ -53,8 +53,6 @@ #include #include #include -#include - #include #include @@ -911,22 +909,22 @@ static int snd_cs46xx_playback_hw_params(struct snd_pcm_substream *substream, #ifdef CONFIG_SND_CS46XX_NEW_DSP snd_assert (sample_rate != 0, return -ENXIO); - mutex_lock(&chip->spos_mutex); + down (&chip->spos_mutex); if (_cs46xx_adjust_sample_rate (chip,cpcm,sample_rate)) { - mutex_unlock(&chip->spos_mutex); + up (&chip->spos_mutex); return -ENXIO; } snd_assert (cpcm->pcm_channel != NULL); if (!cpcm->pcm_channel) { - mutex_unlock(&chip->spos_mutex); + up (&chip->spos_mutex); return -ENXIO; } if (cs46xx_dsp_pcm_channel_set_period (chip,cpcm->pcm_channel,period_size)) { - mutex_unlock(&chip->spos_mutex); + up (&chip->spos_mutex); return -EINVAL; } @@ -967,7 +965,7 @@ static int snd_cs46xx_playback_hw_params(struct snd_pcm_substream *substream, } if ((err = snd_pcm_lib_malloc_pages(substream, params_buffer_bytes(hw_params))) < 0) { #ifdef CONFIG_SND_CS46XX_NEW_DSP - mutex_unlock(&chip->spos_mutex); + up (&chip->spos_mutex); #endif return err; } @@ -991,7 +989,7 @@ static int snd_cs46xx_playback_hw_params(struct snd_pcm_substream *substream, } #ifdef CONFIG_SND_CS46XX_NEW_DSP - mutex_unlock(&chip->spos_mutex); + up (&chip->spos_mutex); #endif return 0; @@ -1321,7 +1319,7 @@ static int _cs46xx_playback_open_channel (struct snd_pcm_substream *substream,in cpcm->substream = substream; #ifdef CONFIG_SND_CS46XX_NEW_DSP - mutex_lock(&chip->spos_mutex); + down (&chip->spos_mutex); cpcm->pcm_channel = NULL; cpcm->pcm_channel_id = pcm_channel_id; @@ -1330,7 +1328,7 @@ static int _cs46xx_playback_open_channel (struct snd_pcm_substream *substream,in SNDRV_PCM_HW_PARAM_PERIOD_BYTES, &hw_constraints_period_sizes); - mutex_unlock(&chip->spos_mutex); + up (&chip->spos_mutex); #else chip->playback_pcm = cpcm; /* HACK */ #endif @@ -1369,9 +1367,9 @@ static int snd_cs46xx_playback_open_iec958(struct snd_pcm_substream *substream) snd_printdd("open raw iec958 channel\n"); - mutex_lock(&chip->spos_mutex); + down (&chip->spos_mutex); cs46xx_iec958_pre_open (chip); - mutex_unlock(&chip->spos_mutex); + up (&chip->spos_mutex); return _cs46xx_playback_open_channel(substream,DSP_IEC958_CHANNEL); } @@ -1387,9 +1385,9 @@ static int snd_cs46xx_playback_close_iec958(struct snd_pcm_substream *substream) err = snd_cs46xx_playback_close(substream); - mutex_lock(&chip->spos_mutex); + down (&chip->spos_mutex); cs46xx_iec958_post_close (chip); - mutex_unlock(&chip->spos_mutex); + up (&chip->spos_mutex); return err; } @@ -1430,12 +1428,12 @@ static int snd_cs46xx_playback_close(struct snd_pcm_substream *substream) if (!cpcm) return -ENXIO; #ifdef CONFIG_SND_CS46XX_NEW_DSP - mutex_lock(&chip->spos_mutex); + down (&chip->spos_mutex); if (cpcm->pcm_channel) { cs46xx_dsp_destroy_pcm_channel(chip,cpcm->pcm_channel); cpcm->pcm_channel = NULL; } - mutex_unlock(&chip->spos_mutex); + up (&chip->spos_mutex); #else chip->playback_pcm = NULL; #endif @@ -1850,7 +1848,7 @@ static int snd_cs46xx_iec958_put(struct snd_kcontrol *kcontrol, switch (kcontrol->private_value) { case CS46XX_MIXER_SPDIF_OUTPUT_ELEMENT: - mutex_lock(&chip->spos_mutex); + down (&chip->spos_mutex); change = (chip->dsp_spos_instance->spdif_status_out & DSP_SPDIF_STATUS_OUTPUT_ENABLED); if (ucontrol->value.integer.value[0] && !change) cs46xx_dsp_enable_spdif_out(chip); @@ -1858,7 +1856,7 @@ static int snd_cs46xx_iec958_put(struct snd_kcontrol *kcontrol, cs46xx_dsp_disable_spdif_out(chip); res = (change != (chip->dsp_spos_instance->spdif_status_out & DSP_SPDIF_STATUS_OUTPUT_ENABLED)); - mutex_unlock(&chip->spos_mutex); + up (&chip->spos_mutex); break; case CS46XX_MIXER_SPDIF_INPUT_ELEMENT: change = chip->dsp_spos_instance->spdif_status_in; @@ -1999,12 +1997,12 @@ static int snd_cs46xx_spdif_default_get(struct snd_kcontrol *kcontrol, struct snd_cs46xx *chip = snd_kcontrol_chip(kcontrol); struct dsp_spos_instance * ins = chip->dsp_spos_instance; - mutex_lock(&chip->spos_mutex); + down (&chip->spos_mutex); ucontrol->value.iec958.status[0] = _wrap_all_bits((ins->spdif_csuv_default >> 24) & 0xff); ucontrol->value.iec958.status[1] = _wrap_all_bits((ins->spdif_csuv_default >> 16) & 0xff); ucontrol->value.iec958.status[2] = 0; ucontrol->value.iec958.status[3] = _wrap_all_bits((ins->spdif_csuv_default) & 0xff); - mutex_unlock(&chip->spos_mutex); + up (&chip->spos_mutex); return 0; } @@ -2017,7 +2015,7 @@ static int snd_cs46xx_spdif_default_put(struct snd_kcontrol *kcontrol, unsigned int val; int change; - mutex_lock(&chip->spos_mutex); + down (&chip->spos_mutex); val = ((unsigned int)_wrap_all_bits(ucontrol->value.iec958.status[0]) << 24) | ((unsigned int)_wrap_all_bits(ucontrol->value.iec958.status[2]) << 16) | ((unsigned int)_wrap_all_bits(ucontrol->value.iec958.status[3])) | @@ -2031,7 +2029,7 @@ static int snd_cs46xx_spdif_default_put(struct snd_kcontrol *kcontrol, if ( !(ins->spdif_status_out & DSP_SPDIF_STATUS_PLAYBACK_OPEN) ) cs46xx_poke_via_dsp (chip,SP_SPDOUT_CSUV,val); - mutex_unlock(&chip->spos_mutex); + up (&chip->spos_mutex); return change; } @@ -2052,12 +2050,12 @@ static int snd_cs46xx_spdif_stream_get(struct snd_kcontrol *kcontrol, struct snd_cs46xx *chip = snd_kcontrol_chip(kcontrol); struct dsp_spos_instance * ins = chip->dsp_spos_instance; - mutex_lock(&chip->spos_mutex); + down (&chip->spos_mutex); ucontrol->value.iec958.status[0] = _wrap_all_bits((ins->spdif_csuv_stream >> 24) & 0xff); ucontrol->value.iec958.status[1] = _wrap_all_bits((ins->spdif_csuv_stream >> 16) & 0xff); ucontrol->value.iec958.status[2] = 0; ucontrol->value.iec958.status[3] = _wrap_all_bits((ins->spdif_csuv_stream) & 0xff); - mutex_unlock(&chip->spos_mutex); + up (&chip->spos_mutex); return 0; } @@ -2070,7 +2068,7 @@ static int snd_cs46xx_spdif_stream_put(struct snd_kcontrol *kcontrol, unsigned int val; int change; - mutex_lock(&chip->spos_mutex); + down (&chip->spos_mutex); val = ((unsigned int)_wrap_all_bits(ucontrol->value.iec958.status[0]) << 24) | ((unsigned int)_wrap_all_bits(ucontrol->value.iec958.status[1]) << 16) | ((unsigned int)_wrap_all_bits(ucontrol->value.iec958.status[3])) | @@ -2084,7 +2082,7 @@ static int snd_cs46xx_spdif_stream_put(struct snd_kcontrol *kcontrol, if ( ins->spdif_status_out & DSP_SPDIF_STATUS_PLAYBACK_OPEN ) cs46xx_poke_via_dsp (chip,SP_SPDOUT_CSUV,val); - mutex_unlock(&chip->spos_mutex); + up (&chip->spos_mutex); return change; } @@ -2317,7 +2315,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[] = { +static struct snd_kcontrol_new snd_hercules_controls[] __devinitdata = { { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = "Optical/Coaxial SPDIF Input Switch", @@ -2877,15 +2875,14 @@ 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); @@ -3458,9 +3455,6 @@ 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; @@ -3672,7 +3666,6 @@ 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); @@ -3726,7 +3719,6 @@ 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; } @@ -3763,7 +3755,7 @@ int __devinit snd_cs46xx_create(struct snd_card *card, } spin_lock_init(&chip->reg_lock); #ifdef CONFIG_SND_CS46XX_NEW_DSP - mutex_init(&chip->spos_mutex); + init_MUTEX(&chip->spos_mutex); #endif chip->card = card; chip->pci = pci; @@ -3858,7 +3850,7 @@ int __devinit snd_cs46xx_create(struct snd_card *card, } } - if (request_irq(pci->irq, snd_cs46xx_interrupt, IRQF_DISABLED|IRQF_SHARED, + if (request_irq(pci->irq, snd_cs46xx_interrupt, SA_INTERRUPT|SA_SHIRQ, "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 5c9711c02..81bcae073 100644 --- a/sound/pci/cs46xx/dsp_spos.c +++ b/sound/pci/cs46xx/dsp_spos.c @@ -28,8 +28,6 @@ #include #include #include -#include - #include #include #include @@ -293,7 +291,7 @@ void cs46xx_dsp_spos_destroy (struct snd_cs46xx * chip) snd_assert(ins != NULL, return); - mutex_lock(&chip->spos_mutex); + down(&chip->spos_mutex); for (i = 0; i < ins->nscb; ++i) { if (ins->scbs[i].deleted) continue; @@ -304,7 +302,7 @@ void cs46xx_dsp_spos_destroy (struct snd_cs46xx * chip) vfree(ins->symbol_table.symbols); kfree(ins->modules); kfree(ins); - mutex_unlock(&chip->spos_mutex); + up(&chip->spos_mutex); } int cs46xx_dsp_load_module (struct snd_cs46xx * chip, struct dsp_module_desc * module) @@ -503,7 +501,7 @@ static void cs46xx_dsp_proc_modules_read (struct snd_info_entry *entry, struct dsp_spos_instance * ins = chip->dsp_spos_instance; int i,j; - mutex_lock(&chip->spos_mutex); + down(&chip->spos_mutex); snd_iprintf(buffer, "MODULES:\n"); for ( i = 0; i < ins->nmodules; ++i ) { snd_iprintf(buffer, "\n%s:\n", ins->modules[i].module_name); @@ -516,7 +514,7 @@ static void cs46xx_dsp_proc_modules_read (struct snd_info_entry *entry, desc->segment_type,desc->offset, desc->size); } } - mutex_unlock(&chip->spos_mutex); + up(&chip->spos_mutex); } static void cs46xx_dsp_proc_task_tree_read (struct snd_info_entry *entry, @@ -527,7 +525,7 @@ static void cs46xx_dsp_proc_task_tree_read (struct snd_info_entry *entry, int i, j, col; void __iomem *dst = chip->region.idx[1].remap_addr + DSP_PARAMETER_BYTE_OFFSET; - mutex_lock(&chip->spos_mutex); + down(&chip->spos_mutex); snd_iprintf(buffer, "TASK TREES:\n"); for ( i = 0; i < ins->ntask; ++i) { snd_iprintf(buffer,"\n%04x %s:\n",ins->tasks[i].address,ins->tasks[i].task_name); @@ -544,7 +542,7 @@ static void cs46xx_dsp_proc_task_tree_read (struct snd_info_entry *entry, } snd_iprintf(buffer,"\n"); - mutex_unlock(&chip->spos_mutex); + up(&chip->spos_mutex); } static void cs46xx_dsp_proc_scb_read (struct snd_info_entry *entry, @@ -554,7 +552,7 @@ static void cs46xx_dsp_proc_scb_read (struct snd_info_entry *entry, struct dsp_spos_instance * ins = chip->dsp_spos_instance; int i; - mutex_lock(&chip->spos_mutex); + down(&chip->spos_mutex); snd_iprintf(buffer, "SCB's:\n"); for ( i = 0; i < ins->nscb; ++i) { if (ins->scbs[i].deleted) @@ -577,7 +575,7 @@ static void cs46xx_dsp_proc_scb_read (struct snd_info_entry *entry, } snd_iprintf(buffer,"\n"); - mutex_unlock(&chip->spos_mutex); + up(&chip->spos_mutex); } static void cs46xx_dsp_proc_parameter_dump_read (struct snd_info_entry *entry, @@ -767,6 +765,7 @@ 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); @@ -783,6 +782,7 @@ 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); @@ -795,6 +795,7 @@ 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); @@ -807,6 +808,7 @@ 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); @@ -819,6 +821,7 @@ 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); @@ -831,6 +834,7 @@ 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); @@ -843,6 +847,7 @@ 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); @@ -851,14 +856,14 @@ int cs46xx_dsp_proc_init (struct snd_card *card, struct snd_cs46xx *chip) } ins->proc_scb_info_entry = entry; - mutex_lock(&chip->spos_mutex); + down(&chip->spos_mutex); /* register/update SCB's entries on proc */ for (i = 0; i < ins->nscb; ++i) { if (ins->scbs[i].deleted) continue; cs46xx_dsp_proc_register_scb_desc (chip, (ins->scbs + i)); } - mutex_unlock(&chip->spos_mutex); + up(&chip->spos_mutex); return 0; } @@ -898,12 +903,12 @@ int cs46xx_dsp_proc_done (struct snd_cs46xx *chip) ins->proc_task_info_entry = NULL; } - mutex_lock(&chip->spos_mutex); + down(&chip->spos_mutex); for (i = 0; i < ins->nscb; ++i) { if (ins->scbs[i].deleted) continue; cs46xx_dsp_proc_free_scb_desc ( (ins->scbs + i) ); } - mutex_unlock(&chip->spos_mutex); + up(&chip->spos_mutex); if (ins->proc_dsp_dir) { snd_info_unregister (ins->proc_dsp_dir); @@ -1693,7 +1698,7 @@ int cs46xx_dsp_enable_spdif_in (struct snd_cs46xx *chip) snd_assert (ins->asynch_rx_scb == NULL,return -EINVAL); snd_assert (ins->spdif_in_src != NULL,return -EINVAL); - mutex_lock(&chip->spos_mutex); + down(&chip->spos_mutex); if ( ! (ins->spdif_status_out & DSP_SPDIF_STATUS_INPUT_CTRL_ENABLED) ) { /* time countdown enable */ @@ -1737,7 +1742,7 @@ int cs46xx_dsp_enable_spdif_in (struct snd_cs46xx *chip) /* monitor state */ ins->spdif_status_in = 1; - mutex_unlock(&chip->spos_mutex); + up(&chip->spos_mutex); return 0; } @@ -1749,7 +1754,7 @@ int cs46xx_dsp_disable_spdif_in (struct snd_cs46xx *chip) snd_assert (ins->asynch_rx_scb != NULL, return -EINVAL); snd_assert (ins->spdif_in_src != NULL,return -EINVAL); - mutex_lock(&chip->spos_mutex); + down(&chip->spos_mutex); /* Remove the asynchronous receiver SCB */ cs46xx_dsp_remove_scb (chip,ins->asynch_rx_scb); @@ -1759,7 +1764,7 @@ int cs46xx_dsp_disable_spdif_in (struct snd_cs46xx *chip) /* monitor state */ ins->spdif_status_in = 0; - mutex_unlock(&chip->spos_mutex); + up(&chip->spos_mutex); /* restore amplifier */ chip->active_ctrl(chip, -1); @@ -1775,10 +1780,10 @@ int cs46xx_dsp_enable_pcm_capture (struct snd_cs46xx *chip) snd_assert (ins->pcm_input == NULL,return -EINVAL); snd_assert (ins->ref_snoop_scb != NULL,return -EINVAL); - mutex_lock(&chip->spos_mutex); + down(&chip->spos_mutex); ins->pcm_input = cs46xx_add_record_source(chip,ins->ref_snoop_scb,PCMSERIALIN_PCM_SCB_ADDR, "PCMSerialInput_Wave"); - mutex_unlock(&chip->spos_mutex); + up(&chip->spos_mutex); return 0; } @@ -1789,10 +1794,10 @@ int cs46xx_dsp_disable_pcm_capture (struct snd_cs46xx *chip) snd_assert (ins->pcm_input != NULL,return -EINVAL); - mutex_lock(&chip->spos_mutex); + down(&chip->spos_mutex); cs46xx_dsp_remove_scb (chip,ins->pcm_input); ins->pcm_input = NULL; - mutex_unlock(&chip->spos_mutex); + up(&chip->spos_mutex); return 0; } @@ -1804,10 +1809,10 @@ int cs46xx_dsp_enable_adc_capture (struct snd_cs46xx *chip) snd_assert (ins->adc_input == NULL,return -EINVAL); snd_assert (ins->codec_in_scb != NULL,return -EINVAL); - mutex_lock(&chip->spos_mutex); + down(&chip->spos_mutex); ins->adc_input = cs46xx_add_record_source(chip,ins->codec_in_scb,PCMSERIALIN_SCB_ADDR, "PCMSerialInput_ADC"); - mutex_unlock(&chip->spos_mutex); + up(&chip->spos_mutex); return 0; } @@ -1818,10 +1823,10 @@ int cs46xx_dsp_disable_adc_capture (struct snd_cs46xx *chip) snd_assert (ins->adc_input != NULL,return -EINVAL); - mutex_lock(&chip->spos_mutex); + down(&chip->spos_mutex); cs46xx_dsp_remove_scb (chip,ins->adc_input); ins->adc_input = NULL; - mutex_unlock(&chip->spos_mutex); + up(&chip->spos_mutex); return 0; } @@ -1868,7 +1873,7 @@ int cs46xx_dsp_set_dac_volume (struct snd_cs46xx * chip, u16 left, u16 right) struct dsp_spos_instance * ins = chip->dsp_spos_instance; struct dsp_scb_descriptor * scb; - mutex_lock(&chip->spos_mutex); + down(&chip->spos_mutex); /* main output */ scb = ins->master_mix_scb->sub_list_ptr; @@ -1887,7 +1892,7 @@ int cs46xx_dsp_set_dac_volume (struct snd_cs46xx * chip, u16 left, u16 right) ins->dac_volume_left = left; ins->dac_volume_right = right; - mutex_unlock(&chip->spos_mutex); + up(&chip->spos_mutex); return 0; } @@ -1896,7 +1901,7 @@ int cs46xx_dsp_set_iec958_volume (struct snd_cs46xx * chip, u16 left, u16 right) { struct dsp_spos_instance * ins = chip->dsp_spos_instance; - mutex_lock(&chip->spos_mutex); + down(&chip->spos_mutex); if (ins->asynch_rx_scb != NULL) cs46xx_dsp_scb_set_volume (chip,ins->asynch_rx_scb, @@ -1905,7 +1910,7 @@ int cs46xx_dsp_set_iec958_volume (struct snd_cs46xx * chip, u16 left, u16 right) ins->spdif_input_volume_left = left; ins->spdif_input_volume_right = right; - mutex_unlock(&chip->spos_mutex); + up(&chip->spos_mutex); return 0; } diff --git a/sound/pci/cs46xx/dsp_spos_scb_lib.c b/sound/pci/cs46xx/dsp_spos_scb_lib.c index 232b33785..d4e0fb39b 100644 --- a/sound/pci/cs46xx/dsp_spos_scb_lib.c +++ b/sound/pci/cs46xx/dsp_spos_scb_lib.c @@ -28,8 +28,6 @@ #include #include #include -#include - #include #include #include @@ -79,7 +77,7 @@ static void cs46xx_dsp_proc_scb_info_read (struct snd_info_entry *entry, ins = chip->dsp_spos_instance; - mutex_lock(&chip->spos_mutex); + down(&chip->spos_mutex); snd_iprintf(buffer,"%04x %s:\n",scb->address,scb->scb_name); for (col = 0,j = 0;j < 0x10; j++,col++) { @@ -107,7 +105,7 @@ static void cs46xx_dsp_proc_scb_info_read (struct snd_info_entry *entry, scb->task_entry->address); snd_iprintf(buffer,"index [%d] ref_count [%d]\n",scb->index,scb->ref_count); - mutex_unlock(&chip->spos_mutex); + up(&chip->spos_mutex); } #endif @@ -180,7 +178,6 @@ 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 && @@ -195,9 +192,9 @@ void cs46xx_dsp_remove_scb (struct snd_cs46xx *chip, struct dsp_scb_descriptor * goto _end); #endif - spin_lock_irqsave(&scb->lock, flags); + spin_lock(&scb->lock); _dsp_unlink_scb (chip,scb); - spin_unlock_irqrestore(&scb->lock, flags); + spin_unlock(&scb->lock); cs46xx_dsp_proc_free_scb_desc(scb); snd_assert (scb->scb_symbol != NULL, return ); @@ -268,6 +265,7 @@ 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 2911a8adc..08d8ee654 100644 --- a/sound/pci/cs5535audio/Makefile +++ b/sound/pci/cs5535audio/Makefile @@ -4,9 +4,5 @@ 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 64c7826e8..02e372103 100644 --- a/sound/pci/cs5535audio/cs5535audio.c +++ b/sound/pci/cs5535audio/cs5535audio.c @@ -1,5 +1,5 @@ /* - * Driver for audio on multifunction CS5535/6 companion device + * Driver for audio on multifunction CS5535 companion device * Copyright (C) Jaya Kumar * * Based on Jaroslav Kysela and Takashi Iwai's examples. @@ -40,36 +40,16 @@ #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; -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) }, + { 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, }, {} }; @@ -82,7 +62,7 @@ static void wait_till_cmd_acked(struct cs5535audio *cs5535au, unsigned long time tmp = cs_readl(cs5535au, ACC_CODEC_CNTL); if (!(tmp & CMD_NEW)) break; - udelay(1); + msleep(10); } while (--timeout); if (!timeout) snd_printk(KERN_ERR "Failure writing to cs5535 codec\n"); @@ -100,18 +80,17 @@ static unsigned short snd_cs5535audio_codec_read(struct cs5535audio *cs5535au, regdata |= CMD_NEW; cs_writel(cs5535au, ACC_CODEC_CNTL, regdata); - wait_till_cmd_acked(cs5535au, 50); + wait_till_cmd_acked(cs5535au, 500); timeout = 50; do { val = cs_readl(cs5535au, ACC_CODEC_STATUS); if ((val & STS_NEW) && reg == (val >> 24)) break; - udelay(1); + msleep(10); } while (--timeout); if (!timeout) - snd_printk(KERN_ERR "Failure reading codec reg 0x%x," - "Last value=0x%x\n", reg, val); + snd_printk(KERN_ERR "Failure reading cs5535 codec\n"); return (unsigned short) val; } @@ -169,8 +148,6 @@ static int snd_cs5535audio_mixer(struct cs5535audio *cs5535au) return err; } - snd_ac97_tune_hardware(cs5535au->ac97, ac97_quirks, ac97_quirk); - return 0; } @@ -321,7 +298,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, - IRQF_DISABLED|IRQF_SHARED, "CS5535 Audio", cs5535au)) { + SA_INTERRUPT|SA_SHIRQ, "CS5535 Audio", cs5535au)) { snd_printk("unable to grab IRQ %d\n", pci->irq); err = -EBUSY; goto sndfail; @@ -370,8 +347,6 @@ 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; @@ -408,10 +383,6 @@ 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 4fd1f31a6..5e55a1a1e 100644 --- a/sound/pci/cs5535audio/cs5535audio.h +++ b/sound/pci/cs5535audio/cs5535audio.h @@ -74,8 +74,6 @@ #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 @@ -90,7 +88,6 @@ 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); }; @@ -106,14 +103,11 @@ 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; @@ -123,8 +117,6 @@ 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 5450a9e8f..60bb82b2f 100644 --- a/sound/pci/cs5535audio/cs5535audio_pcm.c +++ b/sound/pci/cs5535audio/cs5535audio_pcm.c @@ -43,8 +43,7 @@ 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_RESUME + SNDRV_PCM_INFO_SYNC_START ), .formats = ( SNDRV_PCM_FMTBIT_S16_LE @@ -143,7 +142,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 successfully told + /* the u32 cast is okay because in snd*create we succesfully 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; @@ -194,11 +193,6 @@ 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); @@ -225,11 +219,6 @@ 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); @@ -296,17 +285,9 @@ 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; @@ -394,7 +375,6 @@ 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, }; @@ -404,7 +384,6 @@ 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, }; @@ -434,7 +413,6 @@ 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/echoaudio/echoaudio.c b/sound/pci/echoaudio/echoaudio.c index c3dafa290..43b408ada 100644 --- a/sound/pci/echoaudio/echoaudio.c +++ b/sound/pci/echoaudio/echoaudio.c @@ -236,9 +236,9 @@ static int pcm_open(struct snd_pcm_substream *substream, chip = snd_pcm_substream_chip(substream); runtime = substream->runtime; - pipe = kzalloc(sizeof(struct audiopipe), GFP_KERNEL); - if (!pipe) + if (!(pipe = kmalloc(sizeof(struct audiopipe), GFP_KERNEL))) return -ENOMEM; + memset(pipe, 0, sizeof(struct audiopipe)); pipe->index = -1; /* Not configured yet */ /* Set up hw capabilities and contraints */ @@ -1951,7 +1951,7 @@ static __devinit int snd_echo_create(struct snd_card *card, chip->dsp_registers = (volatile u32 __iomem *) ioremap_nocache(chip->dsp_registers_phys, sz); - if (request_irq(pci->irq, snd_echo_interrupt, IRQF_DISABLED | IRQF_SHARED, + if (request_irq(pci->irq, snd_echo_interrupt, SA_INTERRUPT | SA_SHIRQ, ECHOCARD_NAME, (void *)chip)) { snd_echo_free(chip); snd_printk(KERN_ERR "cannot grab irq\n"); diff --git a/sound/pci/emu10k1/emu10k1.c b/sound/pci/emu10k1/emu10k1.c index 289bcd99c..2dfa932f7 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]; -static int extout[SNDRV_CARDS]; +static int extin[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 0}; +static int extout[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 0}; 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]; -static uint subsystem[SNDRV_CARDS]; /* Force card subsystem model */ +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 */ module_param_array(index, int, NULL, 0444); MODULE_PARM_DESC(index, "Index value for the EMU10K1 soundcard."); diff --git a/sound/pci/emu10k1/emu10k1_main.c b/sound/pci/emu10k1/emu10k1_main.c index bc1dfdc92..4faea3768 100644 --- a/sound/pci/emu10k1/emu10k1_main.c +++ b/sound/pci/emu10k1/emu10k1_main.c @@ -36,8 +36,6 @@ #include #include #include -#include - #include #include @@ -531,7 +529,7 @@ static void snd_emu10k1_ecard_setadcgain(struct snd_emu10k1 * emu, snd_emu10k1_ecard_write(emu, emu->ecard_ctrl); } -static int snd_emu10k1_ecard_init(struct snd_emu10k1 * emu) +static int __devinit snd_emu10k1_ecard_init(struct snd_emu10k1 * emu) { unsigned int hc_value; @@ -571,7 +569,7 @@ static int snd_emu10k1_ecard_init(struct snd_emu10k1 * emu) return 0; } -static int snd_emu10k1_cardbus_init(struct snd_emu10k1 * emu) +static int __devinit snd_emu10k1_cardbus_init(struct snd_emu10k1 * emu) { unsigned long special_port; unsigned int value; @@ -633,7 +631,7 @@ static int snd_emu1212m_fpga_netlist_write(struct snd_emu10k1 * emu, int reg, in return 0; } -static int snd_emu10k1_emu1212m_init(struct snd_emu10k1 * emu) +static int __devinit snd_emu10k1_emu1212m_init(struct snd_emu10k1 * emu) { unsigned int i; int tmp; @@ -791,59 +789,13 @@ 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: Tina2 + /* DSP: Tiny2 * DAC: Wolfson WM8768/WM8568 * ADC: Wolfson WM8775 * AC97: None @@ -881,11 +833,8 @@ static struct snd_emu_chip_details emu_chip_details[] = { .spdif_bug = 1, .ac97_chip = 1} , /* Tested by shane-alsa@cm.nu 5th Nov 2005 */ - /* The 0x20061102 does have SB0350 written on it - * Just like 0x20021102 - */ {.vendor = 0x1102, .device = 0x0004, .subsystem = 0x20061102, - .driver = "Audigy2", .name = "Audigy 2 [SB0350b]", + .driver = "Audigy2", .name = "Audigy 2 [2006]", .id = "Audigy2", .emu10k2_chip = 1, .ca0102_chip = 1, @@ -936,17 +885,6 @@ 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", @@ -1159,7 +1097,8 @@ int __devinit snd_emu10k1_create(struct snd_card *card, spin_lock_init(&emu->voice_lock); spin_lock_init(&emu->synth_lock); spin_lock_init(&emu->memblk_lock); - mutex_init(&emu->fx8010.lock); + init_MUTEX(&emu->ptb_lock); + init_MUTEX(&emu->fx8010.lock); INIT_LIST_HEAD(&emu->mapped_link_head); INIT_LIST_HEAD(&emu->mapped_order_link_head); emu->pci = pci; @@ -1244,7 +1183,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, IRQF_DISABLED|IRQF_SHARED, "EMU10K1", (void *)emu)) { + if (request_irq(pci->irq, snd_emu10k1_interrupt, SA_INTERRUPT|SA_SHIRQ, "EMU10K1", (void *)emu)) { err = -EBUSY; goto error; } @@ -1441,10 +1380,6 @@ 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); @@ -1474,3 +1409,16 @@ 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/emu10k1_synth.c b/sound/pci/emu10k1/emu10k1_synth.c index 204995a1d..1fa393f22 100644 --- a/sound/pci/emu10k1/emu10k1_synth.c +++ b/sound/pci/emu10k1/emu10k1_synth.c @@ -62,6 +62,7 @@ static int snd_emu10k1_synth_new_device(struct snd_seq_device *dev) if (snd_emux_register(emu, dev->card, arg->index, "Emu10k1") < 0) { snd_emux_free(emu); + emu->hw = NULL; return -ENOMEM; } diff --git a/sound/pci/emu10k1/emu10k1x.c b/sound/pci/emu10k1/emu10k1x.c index bda8bdf59..1107c8ec7 100644 --- a/sound/pci/emu10k1/emu10k1x.c +++ b/sound/pci/emu10k1/emu10k1x.c @@ -33,7 +33,6 @@ #include #include #include -#include #include #include #include @@ -894,24 +893,24 @@ static int __devinit snd_emu10k1x_create(struct snd_card *card, 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, DMA_28BIT_MASK) < 0 || - pci_set_consistent_dma_mask(pci, DMA_28BIT_MASK) < 0) { + if (pci_set_dma_mask(pci, 0x0fffffff) < 0 || + pci_set_consistent_dma_mask(pci, 0x0fffffff) < 0) { snd_printk(KERN_ERR "error to set 28bit mask DMA\n"); pci_disable_device(pci); return -ENXIO; } - + chip = kzalloc(sizeof(*chip), GFP_KERNEL); if (chip == NULL) { pci_disable_device(pci); return -ENOMEM; } - + chip->card = card; chip->pci = pci; chip->irq = -1; @@ -928,7 +927,7 @@ static int __devinit snd_emu10k1x_create(struct snd_card *card, } if (request_irq(pci->irq, snd_emu10k1x_interrupt, - IRQF_DISABLED|IRQF_SHARED, "EMU10K1X", + SA_INTERRUPT|SA_SHIRQ, "EMU10K1X", (void *)chip)) { snd_printk(KERN_ERR "emu10k1x: cannot grab irq %d\n", pci->irq); snd_emu10k1x_free(chip); @@ -1055,7 +1054,8 @@ static int __devinit snd_emu10k1x_proc_init(struct emu10k1x * emu) struct snd_info_entry *entry; if(! snd_card_proc_new(emu->card, "emu10k1x_regs", &entry)) { - snd_info_set_text_ops(entry, emu, snd_emu10k1x_proc_reg_read); + snd_info_set_text_ops(entry, emu, 1024, snd_emu10k1x_proc_reg_read); + entry->c.text.write_size = 64; entry->c.text.write = snd_emu10k1x_proc_reg_write; entry->mode |= S_IWUSR; entry->private_data = emu; @@ -1286,7 +1286,7 @@ static void snd_emu10k1x_midi_interrupt(struct emu10k1x *emu, unsigned int statu do_emu10k1x_midi_interrupt(emu, &emu->midi, status); } -static int snd_emu10k1x_midi_cmd(struct emu10k1x * emu, +static void snd_emu10k1x_midi_cmd(struct emu10k1x * emu, struct emu10k1x_midi *midi, unsigned char cmd, int ack) { unsigned long flags; @@ -1312,14 +1312,11 @@ static int snd_emu10k1x_midi_cmd(struct emu10k1x * emu, 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(struct snd_rawmidi_substream *substream) @@ -1335,17 +1332,12 @@ static int snd_emu10k1x_midi_input_open(struct snd_rawmidi_substream *substream) midi->substream_input = substream; if (!(midi->midi_mode & EMU10K1X_MIDI_MODE_OUTPUT)) { spin_unlock_irqrestore(&midi->open_lock, flags); - 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; + snd_emu10k1x_midi_cmd(emu, midi, MPU401_RESET, 1); + snd_emu10k1x_midi_cmd(emu, midi, MPU401_ENTER_UART, 1); } else { spin_unlock_irqrestore(&midi->open_lock, flags); } return 0; - -error_out: - return -EIO; } static int snd_emu10k1x_midi_output_open(struct snd_rawmidi_substream *substream) @@ -1361,17 +1353,12 @@ static int snd_emu10k1x_midi_output_open(struct snd_rawmidi_substream *substream midi->substream_output = substream; if (!(midi->midi_mode & EMU10K1X_MIDI_MODE_INPUT)) { spin_unlock_irqrestore(&midi->open_lock, flags); - 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; + snd_emu10k1x_midi_cmd(emu, midi, MPU401_RESET, 1); + snd_emu10k1x_midi_cmd(emu, midi, MPU401_ENTER_UART, 1); } else { spin_unlock_irqrestore(&midi->open_lock, flags); } return 0; - -error_out: - return -EIO; } static int snd_emu10k1x_midi_input_close(struct snd_rawmidi_substream *substream) @@ -1379,7 +1366,6 @@ static int snd_emu10k1x_midi_input_close(struct snd_rawmidi_substream *substream 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); @@ -1389,11 +1375,11 @@ static int snd_emu10k1x_midi_input_close(struct snd_rawmidi_substream *substream midi->substream_input = NULL; if (!(midi->midi_mode & EMU10K1X_MIDI_MODE_OUTPUT)) { spin_unlock_irqrestore(&midi->open_lock, flags); - err = snd_emu10k1x_midi_cmd(emu, midi, MPU401_RESET, 0); + snd_emu10k1x_midi_cmd(emu, midi, MPU401_RESET, 0); } else { spin_unlock_irqrestore(&midi->open_lock, flags); } - return err; + return 0; } static int snd_emu10k1x_midi_output_close(struct snd_rawmidi_substream *substream) @@ -1401,7 +1387,6 @@ static int snd_emu10k1x_midi_output_close(struct snd_rawmidi_substream *substrea 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,11 +1396,11 @@ static int snd_emu10k1x_midi_output_close(struct snd_rawmidi_substream *substrea midi->substream_output = NULL; if (!(midi->midi_mode & EMU10K1X_MIDI_MODE_INPUT)) { spin_unlock_irqrestore(&midi->open_lock, flags); - err = snd_emu10k1x_midi_cmd(emu, midi, MPU401_RESET, 0); + snd_emu10k1x_midi_cmd(emu, midi, MPU401_RESET, 0); } else { spin_unlock_irqrestore(&midi->open_lock, flags); } - return err; + return 0; } static void snd_emu10k1x_midi_input_trigger(struct snd_rawmidi_substream *substream, int up) diff --git a/sound/pci/emu10k1/emufx.c b/sound/pci/emu10k1/emufx.c index dfba00230..509837252 100644 --- a/sound/pci/emu10k1/emufx.c +++ b/sound/pci/emu10k1/emufx.c @@ -32,8 +32,6 @@ #include #include #include -#include - #include #include @@ -876,7 +874,7 @@ static int snd_emu10k1_icode_poke(struct snd_emu10k1 *emu, { int err = 0; - mutex_lock(&emu->fx8010.lock); + down(&emu->fx8010.lock); if ((err = snd_emu10k1_verify_controls(emu, icode)) < 0) goto __error; strlcpy(emu->fx8010.name, icode->name, sizeof(emu->fx8010.name)); @@ -899,7 +897,7 @@ static int snd_emu10k1_icode_poke(struct snd_emu10k1 *emu, else snd_emu10k1_ptr_write(emu, DBG, 0, emu->fx8010.dbg); __error: - mutex_unlock(&emu->fx8010.lock); + up(&emu->fx8010.lock); return err; } @@ -908,7 +906,7 @@ static int snd_emu10k1_icode_peek(struct snd_emu10k1 *emu, { int err; - mutex_lock(&emu->fx8010.lock); + down(&emu->fx8010.lock); strlcpy(icode->name, emu->fx8010.name, sizeof(icode->name)); /* ok, do the main job */ err = snd_emu10k1_gpr_peek(emu, icode); @@ -918,7 +916,7 @@ static int snd_emu10k1_icode_peek(struct snd_emu10k1 *emu, err = snd_emu10k1_code_peek(emu, icode); if (err >= 0) err = snd_emu10k1_list_controls(emu, icode); - mutex_unlock(&emu->fx8010.lock); + up(&emu->fx8010.lock); return err; } @@ -934,7 +932,7 @@ static int snd_emu10k1_ipcm_poke(struct snd_emu10k1 *emu, if (ipcm->channels > 32) return -EINVAL; pcm = &emu->fx8010.pcm[ipcm->substream]; - mutex_lock(&emu->fx8010.lock); + down(&emu->fx8010.lock); spin_lock_irq(&emu->reg_lock); if (pcm->opened) { err = -EBUSY; @@ -964,7 +962,7 @@ static int snd_emu10k1_ipcm_poke(struct snd_emu10k1 *emu, } __error: spin_unlock_irq(&emu->reg_lock); - mutex_unlock(&emu->fx8010.lock); + up(&emu->fx8010.lock); return err; } @@ -978,7 +976,7 @@ static int snd_emu10k1_ipcm_peek(struct snd_emu10k1 *emu, if (ipcm->substream >= EMU10K1_FX8010_PCM_COUNT) return -EINVAL; pcm = &emu->fx8010.pcm[ipcm->substream]; - mutex_lock(&emu->fx8010.lock); + down(&emu->fx8010.lock); spin_lock_irq(&emu->reg_lock); ipcm->channels = pcm->channels; ipcm->tram_start = pcm->tram_start; @@ -994,7 +992,7 @@ static int snd_emu10k1_ipcm_peek(struct snd_emu10k1 *emu, ipcm->res1 = ipcm->res2 = 0; ipcm->pad = 0; spin_unlock_irq(&emu->reg_lock); - mutex_unlock(&emu->fx8010.lock); + up(&emu->fx8010.lock); return err; } @@ -2310,9 +2308,9 @@ static int snd_emu10k1_fx8010_ioctl(struct snd_hwdep * hw, struct file *file, un return -EPERM; if (get_user(addr, (unsigned int __user *)argp)) return -EFAULT; - mutex_lock(&emu->fx8010.lock); + down(&emu->fx8010.lock); res = snd_emu10k1_fx8010_tram_setup(emu, addr); - mutex_unlock(&emu->fx8010.lock); + up(&emu->fx8010.lock); return res; case SNDRV_EMU10K1_IOCTL_STOP: if (!capable(CAP_SYS_ADMIN)) diff --git a/sound/pci/emu10k1/emumixer.c b/sound/pci/emu10k1/emumixer.c index c31f3d087..2a9d12d10 100644 --- a/sound/pci/emu10k1/emumixer.c +++ b/sound/pci/emu10k1/emumixer.c @@ -777,8 +777,6 @@ 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", @@ -806,47 +804,6 @@ 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; @@ -877,10 +834,7 @@ 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); - if (emu->card_capabilities->adc_1361t) - c = audigy_remove_ctls_1361t_adc; - else - c = audigy_remove_ctls; + c = audigy_remove_ctls; } else { /* * Credits for cards based on STAC9758: @@ -909,15 +863,11 @@ int __devinit snd_emu10k1_mixer(struct snd_emu10k1 *emu, } if (emu->audigy) - if (emu->card_capabilities->adc_1361t) - c = audigy_rename_ctls_1361t_adc; - else - c = audigy_rename_ctls; + 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 950c6bcd6..d96eb4551 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 int snd_emu10k1_midi_cmd(struct snd_emu10k1 * emu, struct snd_emu10k1_midi *midi, unsigned char cmd, int ack) +static void 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,14 +141,11 @@ static int snd_emu10k1_midi_cmd(struct snd_emu10k1 * emu, struct snd_emu10k1_mid 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) @@ -164,17 +161,12 @@ 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); - 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; + snd_emu10k1_midi_cmd(emu, midi, MPU401_RESET, 1); + snd_emu10k1_midi_cmd(emu, midi, MPU401_ENTER_UART, 1); } 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) @@ -190,17 +182,12 @@ 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); - 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; + snd_emu10k1_midi_cmd(emu, midi, MPU401_RESET, 1); + snd_emu10k1_midi_cmd(emu, midi, MPU401_ENTER_UART, 1); } 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) @@ -208,7 +195,6 @@ 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); @@ -218,11 +204,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); - err = snd_emu10k1_midi_cmd(emu, midi, MPU401_RESET, 0); + snd_emu10k1_midi_cmd(emu, midi, MPU401_RESET, 0); } else { spin_unlock_irqrestore(&midi->open_lock, flags); } - return err; + return 0; } static int snd_emu10k1_midi_output_close(struct snd_rawmidi_substream *substream) @@ -230,7 +216,6 @@ 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); @@ -240,11 +225,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); - err = snd_emu10k1_midi_cmd(emu, midi, MPU401_RESET, 0); + snd_emu10k1_midi_cmd(emu, midi, MPU401_RESET, 0); } else { spin_unlock_irqrestore(&midi->open_lock, flags); } - return err; + return 0; } 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 b939e03aa..90f1c5270 100644 --- a/sound/pci/emu10k1/emuproc.c +++ b/sound/pci/emu10k1/emuproc.c @@ -532,51 +532,57 @@ 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, snd_emu_proc_io_reg_read); + snd_info_set_text_ops(entry, emu, 1024, snd_emu_proc_io_reg_read); + entry->c.text.write_size = 64; 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, snd_emu_proc_ptr_reg_read00a); + snd_info_set_text_ops(entry, emu, 65536, snd_emu_proc_ptr_reg_read00a); + entry->c.text.write_size = 64; 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, snd_emu_proc_ptr_reg_read00b); + snd_info_set_text_ops(entry, emu, 65536, snd_emu_proc_ptr_reg_read00b); + entry->c.text.write_size = 64; 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, snd_emu_proc_ptr_reg_read20a); + snd_info_set_text_ops(entry, emu, 65536, snd_emu_proc_ptr_reg_read20a); + entry->c.text.write_size = 64; 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, snd_emu_proc_ptr_reg_read20b); + snd_info_set_text_ops(entry, emu, 65536, snd_emu_proc_ptr_reg_read20b); + entry->c.text.write_size = 64; 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, snd_emu_proc_ptr_reg_read20c); + snd_info_set_text_ops(entry, emu, 65536, snd_emu_proc_ptr_reg_read20c); + entry->c.text.write_size = 64; 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, snd_emu10k1_proc_read); + snd_info_set_text_ops(entry, emu, 2048, 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, snd_emu10k1_proc_spdif_read); + snd_info_set_text_ops(entry, emu, 2048, 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, snd_emu10k1_proc_rates_read); + snd_info_set_text_ops(entry, emu, 2048, snd_emu10k1_proc_rates_read); } if (! snd_card_proc_new(emu->card, "voices", &entry)) - snd_info_set_text_ops(entry, emu, snd_emu10k1_proc_voices_read); + snd_info_set_text_ops(entry, emu, 2048, snd_emu10k1_proc_voices_read); if (! snd_card_proc_new(emu->card, "fx8010_gpr", &entry)) { entry->content = SNDRV_INFO_CONTENT_DATA; @@ -610,6 +616,7 @@ 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 029e7856c..ef5304df8 100644 --- a/sound/pci/emu10k1/io.c +++ b/sound/pci/emu10k1/io.c @@ -62,8 +62,6 @@ 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; @@ -94,8 +92,6 @@ 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 1076af4c3..a8b31286b 100644 --- a/sound/pci/emu10k1/irq.c +++ b/sound/pci/emu10k1/irq.c @@ -37,13 +37,9 @@ irqreturn_t snd_emu10k1_interrupt(int irq, void *dev_id, struct pt_regs *regs) int handled = 0; while ((status = inl(emu->port + IPR)) != 0) { - //snd_printk(KERN_INFO "emu10k1 irq - status = 0x%x\n", status); + //printk("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 4fcaefe5a..68c795c03 100644 --- a/sound/pci/emu10k1/memory.c +++ b/sound/pci/emu10k1/memory.c @@ -24,8 +24,6 @@ #include #include #include -#include - #include #include @@ -287,8 +285,6 @@ 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 */ @@ -306,10 +302,10 @@ snd_emu10k1_alloc_pages(struct snd_emu10k1 *emu, struct snd_pcm_substream *subst hdr = emu->memhdr; snd_assert(hdr, return NULL); - mutex_lock(&hdr->block_mutex); + down(&hdr->block_mutex); blk = search_empty(emu, runtime->dma_bytes); if (blk == NULL) { - mutex_unlock(&hdr->block_mutex); + up(&hdr->block_mutex); return NULL; } /* fill buffer addresses but pointers are not stored so that @@ -322,14 +318,14 @@ snd_emu10k1_alloc_pages(struct snd_emu10k1 *emu, struct snd_pcm_substream *subst if (idx >= sgbuf->pages) { printk(KERN_ERR "emu: pages overflow! (%d-%d) for %d\n", blk->first_page, blk->last_page, sgbuf->pages); - mutex_unlock(&hdr->block_mutex); + up(&hdr->block_mutex); return NULL; } #endif addr = sgbuf->table[idx].addr; if (! is_valid_page(emu, addr)) { printk(KERN_ERR "emu: failure page = %d\n", idx); - mutex_unlock(&hdr->block_mutex); + up(&hdr->block_mutex); return NULL; } emu->page_addr_table[page] = addr; @@ -341,10 +337,10 @@ snd_emu10k1_alloc_pages(struct snd_emu10k1 *emu, struct snd_pcm_substream *subst err = snd_emu10k1_memblk_map(emu, blk); if (err < 0) { __snd_util_mem_free(hdr, (struct snd_util_memblk *)blk); - mutex_unlock(&hdr->block_mutex); + up(&hdr->block_mutex); return NULL; } - mutex_unlock(&hdr->block_mutex); + up(&hdr->block_mutex); return (struct snd_util_memblk *)blk; } @@ -373,23 +369,22 @@ snd_emu10k1_synth_alloc(struct snd_emu10k1 *hw, unsigned int size) struct snd_emu10k1_memblk *blk; struct snd_util_memhdr *hdr = hw->memhdr; - mutex_lock(&hdr->block_mutex); + down(&hdr->block_mutex); blk = (struct snd_emu10k1_memblk *)__snd_util_mem_alloc(hdr, size); if (blk == NULL) { - mutex_unlock(&hdr->block_mutex); + up(&hdr->block_mutex); return NULL; } if (synth_alloc_pages(hw, blk)) { __snd_util_mem_free(hdr, (struct snd_util_memblk *)blk); - mutex_unlock(&hdr->block_mutex); + up(&hdr->block_mutex); return NULL; } snd_emu10k1_memblk_map(hw, blk); - mutex_unlock(&hdr->block_mutex); + up(&hdr->block_mutex); return (struct snd_util_memblk *)blk; } -EXPORT_SYMBOL(snd_emu10k1_synth_alloc); /* * free a synth sample area @@ -401,18 +396,17 @@ snd_emu10k1_synth_free(struct snd_emu10k1 *emu, struct snd_util_memblk *memblk) struct snd_emu10k1_memblk *blk = (struct snd_emu10k1_memblk *)memblk; unsigned long flags; - mutex_lock(&hdr->block_mutex); + down(&hdr->block_mutex); spin_lock_irqsave(&emu->memblk_lock, flags); if (blk->mapped_page >= 0) unmap_memblk(emu, blk); spin_unlock_irqrestore(&emu->memblk_lock, flags); synth_free_pages(emu, blk); __snd_util_mem_free(hdr, memblk); - mutex_unlock(&hdr->block_mutex); + up(&hdr->block_mutex); return 0; } -EXPORT_SYMBOL(snd_emu10k1_synth_free); /* check new allocation range */ static void get_single_page_range(struct snd_util_memhdr *hdr, @@ -544,8 +538,6 @@ 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) */ @@ -574,5 +566,3 @@ 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 f2d8eb6c8..5c43abf03 100644 --- a/sound/pci/emu10k1/tina2.h +++ b/sound/pci/emu10k1/tina2.h @@ -1,7 +1,11 @@ /* * Copyright (c) by James Courtier-Dutton - * Driver tina2 chips - * Version: 0.1 + * 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 * * This 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 94eca82dd..56ffb7dc3 100644 --- a/sound/pci/emu10k1/voice.c +++ b/sound/pci/emu10k1/voice.c @@ -139,8 +139,6 @@ 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) { @@ -155,5 +153,3 @@ 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 a8a601fc7..55aaf1103 100644 --- a/sound/pci/ens1370.c +++ b/sound/pci/ens1370.c @@ -35,8 +35,6 @@ #include #include #include -#include - #include #include #include @@ -381,7 +379,7 @@ MODULE_PARM_DESC(lineio, "Line In to Rear Out (0 = auto, 1 = force)."); struct ensoniq { spinlock_t reg_lock; - struct mutex src_mutex; + struct semaphore src_mutex; int irq; @@ -611,7 +609,7 @@ static void snd_es1371_codec_write(struct snd_ac97 *ac97, struct ensoniq *ensoniq = ac97->private_data; unsigned int t, x; - mutex_lock(&ensoniq->src_mutex); + down(&ensoniq->src_mutex); for (t = 0; t < POLL_COUNT; t++) { if (!(inl(ES_REG(ensoniq, 1371_CODEC)) & ES_1371_CODEC_WIP)) { /* save the current state for latter */ @@ -636,11 +634,11 @@ static void snd_es1371_codec_write(struct snd_ac97 *ac97, /* restore SRC reg */ snd_es1371_wait_src_ready(ensoniq); outl(x, ES_REG(ensoniq, 1371_SMPRATE)); - mutex_unlock(&ensoniq->src_mutex); + up(&ensoniq->src_mutex); return; } } - mutex_unlock(&ensoniq->src_mutex); + up(&ensoniq->src_mutex); snd_printk(KERN_ERR "codec write timeout at 0x%lx [0x%x]\n", ES_REG(ensoniq, 1371_CODEC), inl(ES_REG(ensoniq, 1371_CODEC))); } @@ -652,7 +650,7 @@ static unsigned short snd_es1371_codec_read(struct snd_ac97 *ac97, unsigned int t, x, fail = 0; __again: - mutex_lock(&ensoniq->src_mutex); + down(&ensoniq->src_mutex); for (t = 0; t < POLL_COUNT; t++) { if (!(inl(ES_REG(ensoniq, 1371_CODEC)) & ES_1371_CODEC_WIP)) { /* save the current state for latter */ @@ -685,11 +683,11 @@ static unsigned short snd_es1371_codec_read(struct snd_ac97 *ac97, /* now wait for the stinkin' data (RDY) */ for (t = 0; t < POLL_COUNT; t++) { if ((x = inl(ES_REG(ensoniq, 1371_CODEC))) & ES_1371_CODEC_RDY) { - mutex_unlock(&ensoniq->src_mutex); + up(&ensoniq->src_mutex); return ES_1371_CODEC_READ(x); } } - mutex_unlock(&ensoniq->src_mutex); + up(&ensoniq->src_mutex); if (++fail > 10) { snd_printk(KERN_ERR "codec read timeout (final) " "at 0x%lx, reg = 0x%x [0x%x]\n", @@ -700,7 +698,7 @@ static unsigned short snd_es1371_codec_read(struct snd_ac97 *ac97, goto __again; } } - mutex_unlock(&ensoniq->src_mutex); + up(&ensoniq->src_mutex); snd_printk(KERN_ERR "es1371: codec read timeout at 0x%lx [0x%x]\n", ES_REG(ensoniq, 1371_CODEC), inl(ES_REG(ensoniq, 1371_CODEC))); return 0; @@ -719,7 +717,7 @@ static void snd_es1371_adc_rate(struct ensoniq * ensoniq, unsigned int rate) { unsigned int n, truncm, freq, result; - mutex_lock(&ensoniq->src_mutex); + down(&ensoniq->src_mutex); n = rate / 3000; if ((1 << n) & ((1 << 15) | (1 << 13) | (1 << 11) | (1 << 9))) n--; @@ -744,14 +742,14 @@ static void snd_es1371_adc_rate(struct ensoniq * ensoniq, unsigned int rate) snd_es1371_src_write(ensoniq, ES_SMPREG_ADC + ES_SMPREG_VFREQ_FRAC, freq & 0x7fff); snd_es1371_src_write(ensoniq, ES_SMPREG_VOL_ADC, n << 8); snd_es1371_src_write(ensoniq, ES_SMPREG_VOL_ADC + 1, n << 8); - mutex_unlock(&ensoniq->src_mutex); + up(&ensoniq->src_mutex); } static void snd_es1371_dac1_rate(struct ensoniq * ensoniq, unsigned int rate) { unsigned int freq, r; - mutex_lock(&ensoniq->src_mutex); + down(&ensoniq->src_mutex); freq = ((rate << 15) + 1500) / 3000; r = (snd_es1371_wait_src_ready(ensoniq) & (ES_1371_SRC_DISABLE | ES_1371_DIS_P2 | ES_1371_DIS_R1)) | @@ -765,14 +763,14 @@ static void snd_es1371_dac1_rate(struct ensoniq * ensoniq, unsigned int rate) r = (snd_es1371_wait_src_ready(ensoniq) & (ES_1371_SRC_DISABLE | ES_1371_DIS_P2 | ES_1371_DIS_R1)); outl(r, ES_REG(ensoniq, 1371_SMPRATE)); - mutex_unlock(&ensoniq->src_mutex); + up(&ensoniq->src_mutex); } static void snd_es1371_dac2_rate(struct ensoniq * ensoniq, unsigned int rate) { unsigned int freq, r; - mutex_lock(&ensoniq->src_mutex); + down(&ensoniq->src_mutex); freq = ((rate << 15) + 1500) / 3000; r = (snd_es1371_wait_src_ready(ensoniq) & (ES_1371_SRC_DISABLE | ES_1371_DIS_P1 | ES_1371_DIS_R1)) | @@ -787,7 +785,7 @@ static void snd_es1371_dac2_rate(struct ensoniq * ensoniq, unsigned int rate) r = (snd_es1371_wait_src_ready(ensoniq) & (ES_1371_SRC_DISABLE | ES_1371_DIS_P1 | ES_1371_DIS_R1)); outl(r, ES_REG(ensoniq, 1371_SMPRATE)); - mutex_unlock(&ensoniq->src_mutex); + up(&ensoniq->src_mutex); } #endif /* CHIP1371 */ @@ -1915,7 +1913,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, snd_ensoniq_proc_read); + snd_info_set_text_ops(entry, ensoniq, 1024, snd_ensoniq_proc_read); } /* @@ -2063,13 +2061,6 @@ static int snd_ensoniq_suspend(struct pci_dev *pci, pm_message_t state) #ifdef CHIP1371 snd_ac97_suspend(ensoniq->u.es1371.ac97); #else - /* try to reset AK4531 */ - outw(ES_1370_CODEC_WRITE(AK4531_RESET, 0x02), ES_REG(ensoniq, 1370_CODEC)); - inw(ES_REG(ensoniq, 1370_CODEC)); - udelay(100); - outw(ES_1370_CODEC_WRITE(AK4531_RESET, 0x03), ES_REG(ensoniq, 1370_CODEC)); - inw(ES_REG(ensoniq, 1370_CODEC)); - udelay(100); snd_ak4531_suspend(ensoniq->u.es1370.ak4531); #endif pci_set_power_state(pci, PCI_D3hot); @@ -2125,7 +2116,7 @@ static int __devinit snd_ensoniq_create(struct snd_card *card, return -ENOMEM; } spin_lock_init(&ensoniq->reg_lock); - mutex_init(&ensoniq->src_mutex); + init_MUTEX(&ensoniq->src_mutex); ensoniq->card = card; ensoniq->pci = pci; ensoniq->irq = -1; @@ -2135,7 +2126,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, IRQF_DISABLED|IRQF_SHARED, + if (request_irq(pci->irq, snd_audiopci_interrupt, SA_INTERRUPT|SA_SHIRQ, "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 cc0f34f68..0d556b09a 100644 --- a/sound/pci/es1938.c +++ b/sound/pci/es1938.c @@ -55,7 +55,6 @@ #include #include #include -#include #include #include #include @@ -1429,7 +1428,7 @@ static int es1938_resume(struct pci_dev *pci) pci_restore_state(pci); pci_enable_device(pci); request_irq(pci->irq, snd_es1938_interrupt, - IRQF_DISABLED|IRQF_SHARED, "ES1938", chip); + SA_INTERRUPT|SA_SHIRQ, "ES1938", chip); chip->irq = pci->irq; snd_es1938_chip_init(chip); @@ -1518,8 +1517,8 @@ static int __devinit snd_es1938_create(struct snd_card *card, if ((err = pci_enable_device(pci)) < 0) return err; /* check, if we can restrict PCI DMA transfers to 24 bits */ - if (pci_set_dma_mask(pci, DMA_24BIT_MASK) < 0 || - pci_set_consistent_dma_mask(pci, DMA_24BIT_MASK) < 0) { + if (pci_set_dma_mask(pci, 0x00ffffff) < 0 || + pci_set_consistent_dma_mask(pci, 0x00ffffff) < 0) { snd_printk(KERN_ERR "architecture does not support 24bit PCI busmaster DMA\n"); pci_disable_device(pci); return -ENXIO; @@ -1544,7 +1543,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, IRQF_DISABLED|IRQF_SHARED, + if (request_irq(pci->irq, snd_es1938_interrupt, SA_INTERRUPT|SA_SHIRQ, "ES1938", chip)) { snd_printk(KERN_ERR "unable to grab IRQ %d\n", pci->irq); snd_es1938_free(chip); @@ -1756,8 +1755,7 @@ static int __devinit snd_es1938_probe(struct pci_dev *pci, } } if (snd_mpu401_uart_new(card, 0, MPU401_HW_MPU401, - chip->mpu_port, MPU401_INFO_INTEGRATED, - chip->irq, 0, &chip->rmidi) < 0) { + chip->mpu_port, 1, 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 3c5ab7c2e..3747a436f 100644 --- a/sound/pci/es1968.c +++ b/sound/pci/es1968.c @@ -100,12 +100,9 @@ #include #include #include -#include #include #include #include -#include - #include #include #include @@ -132,7 +129,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]; +static int clock[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 0}; 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 @@ -572,7 +569,7 @@ struct es1968 { u16 maestro_map[32]; int bobclient; /* active timer instancs */ int bob_freq; /* timer frequency */ - struct mutex memory_mutex; /* memory lock */ + struct semaphore memory_mutex; /* memory lock */ /* APU states */ unsigned char apu[NR_APUS]; @@ -1359,13 +1356,13 @@ static int calc_available_memory_size(struct es1968 *chip) struct list_head *p; int max_size = 0; - mutex_lock(&chip->memory_mutex); + down(&chip->memory_mutex); list_for_each(p, &chip->buf_list) { struct esm_memory *buf = list_entry(p, struct esm_memory, list); if (buf->empty && buf->buf.bytes > max_size) max_size = buf->buf.bytes; } - mutex_unlock(&chip->memory_mutex); + up(&chip->memory_mutex); if (max_size >= 128*1024) max_size = 127*1024; return max_size; @@ -1378,20 +1375,20 @@ static struct esm_memory *snd_es1968_new_memory(struct es1968 *chip, int size) struct list_head *p; size = ((size + ESM_MEM_ALIGN - 1) / ESM_MEM_ALIGN) * ESM_MEM_ALIGN; - mutex_lock(&chip->memory_mutex); + down(&chip->memory_mutex); list_for_each(p, &chip->buf_list) { buf = list_entry(p, struct esm_memory, list); if (buf->empty && buf->buf.bytes >= size) goto __found; } - mutex_unlock(&chip->memory_mutex); + up(&chip->memory_mutex); return NULL; __found: if (buf->buf.bytes > size) { struct esm_memory *chunk = kmalloc(sizeof(*chunk), GFP_KERNEL); if (chunk == NULL) { - mutex_unlock(&chip->memory_mutex); + up(&chip->memory_mutex); return NULL; } chunk->buf = buf->buf; @@ -1403,7 +1400,7 @@ __found: list_add(&chunk->list, &buf->list); } buf->empty = 0; - mutex_unlock(&chip->memory_mutex); + up(&chip->memory_mutex); return buf; } @@ -1412,7 +1409,7 @@ static void snd_es1968_free_memory(struct es1968 *chip, struct esm_memory *buf) { struct esm_memory *chunk; - mutex_lock(&chip->memory_mutex); + down(&chip->memory_mutex); buf->empty = 1; if (buf->list.prev != &chip->buf_list) { chunk = list_entry(buf->list.prev, struct esm_memory, list); @@ -1431,7 +1428,7 @@ static void snd_es1968_free_memory(struct es1968 *chip, struct esm_memory *buf) kfree(chunk); } } - mutex_unlock(&chip->memory_mutex); + up(&chip->memory_mutex); } static void snd_es1968_free_dmabuf(struct es1968 *chip) @@ -2562,8 +2559,8 @@ static int __devinit snd_es1968_create(struct snd_card *card, if ((err = pci_enable_device(pci)) < 0) return err; /* check, if we can restrict PCI DMA transfers to 28 bits */ - if (pci_set_dma_mask(pci, DMA_28BIT_MASK) < 0 || - pci_set_consistent_dma_mask(pci, DMA_28BIT_MASK) < 0) { + if (pci_set_dma_mask(pci, 0x0fffffff) < 0 || + pci_set_consistent_dma_mask(pci, 0x0fffffff) < 0) { snd_printk(KERN_ERR "architecture does not support 28bit PCI busmaster DMA\n"); pci_disable_device(pci); return -ENXIO; @@ -2582,7 +2579,7 @@ static int __devinit snd_es1968_create(struct snd_card *card, INIT_LIST_HEAD(&chip->buf_list); INIT_LIST_HEAD(&chip->substream_list); spin_lock_init(&chip->ac97_lock); - mutex_init(&chip->memory_mutex); + init_MUTEX(&chip->memory_mutex); tasklet_init(&chip->hwvol_tq, es1968_update_hw_volume, (unsigned long)chip); chip->card = card; chip->pci = pci; @@ -2597,7 +2594,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, IRQF_DISABLED|IRQF_SHARED, + if (request_irq(pci->irq, snd_es1968_interrupt, SA_INTERRUPT|SA_SHIRQ, "ESS Maestro", (void*)chip)) { snd_printk(KERN_ERR "unable to grab IRQ %d\n", pci->irq); snd_es1968_free(chip); @@ -2727,8 +2724,7 @@ 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, - MPU401_INFO_INTEGRATED, + chip->io_port + ESM_MPU401_PORT, 1, 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 13868c985..712ba72c7 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]; +static int tea575x_tuner[SNDRV_CARDS] = { [0 ... (SNDRV_CARDS-1)] = 0 }; module_param_array(index, int, NULL, 0444); MODULE_PARM_DESC(index, "Index value for the FM801 soundcard."); @@ -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, IRQF_DISABLED|IRQF_SHARED, + if (request_irq(pci->irq, snd_fm801_interrupt, SA_INTERRUPT|SA_SHIRQ, "FM801", chip)) { snd_printk(KERN_ERR "unable to grab IRQ %d\n", chip->irq); snd_fm801_free(chip); @@ -1448,8 +1448,7 @@ 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), - MPU401_INFO_INTEGRATED, + FM801_REG(chip, MPU401_DATA), 1, 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 dbacba617..ddfb5ff7f 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 patch_sigmatel.o patch_si3054.o patch_atihdmi.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 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 23201f3ee..4a6dd97de 100644 --- a/sound/pci/hda/hda_codec.c +++ b/sound/pci/hda/hda_codec.c @@ -25,7 +25,6 @@ #include #include #include -#include #include #include "hda_codec.h" #include @@ -77,17 +76,15 @@ 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; - mutex_lock(&codec->bus->cmd_mutex); + down(&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; - mutex_unlock(&codec->bus->cmd_mutex); + up(&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 @@ -104,14 +101,12 @@ int snd_hda_codec_write(struct hda_codec *codec, hda_nid_t nid, int direct, unsigned int verb, unsigned int parm) { int err; - mutex_lock(&codec->bus->cmd_mutex); + down(&codec->bus->cmd_mutex); err = codec->bus->ops.command(codec, nid, direct, verb, parm); - mutex_unlock(&codec->bus->cmd_mutex); + up(&codec->bus->cmd_mutex); return err; } -EXPORT_SYMBOL(snd_hda_codec_write); - /** * snd_hda_sequence_write - sequence writes * @codec: the HDA codec @@ -126,8 +121,6 @@ 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 @@ -146,8 +139,6 @@ 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 @@ -264,8 +255,6 @@ 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 */ @@ -305,7 +294,7 @@ static int init_unsol_queue(struct hda_bus *bus) snd_printk(KERN_ERR "hda_codec: can't allocate unsolicited queue\n"); return -ENOMEM; } - unsol->workq = create_singlethread_workqueue("hda_codec"); + unsol->workq = create_workqueue("hda_codec"); if (! unsol->workq) { snd_printk(KERN_ERR "hda_codec: can't create workqueue\n"); kfree(unsol); @@ -382,7 +371,7 @@ int snd_hda_bus_new(struct snd_card *card, const struct hda_bus_template *temp, bus->modelname = temp->modelname; bus->ops = temp->ops; - mutex_init(&bus->cmd_mutex); + init_MUTEX(&bus->cmd_mutex); INIT_LIST_HEAD(&bus->codec_list); if ((err = snd_device_new(card, SNDRV_DEV_BUS, bus, &dev_ops)) < 0) { @@ -394,7 +383,6 @@ int snd_hda_bus_new(struct snd_card *card, const struct hda_bus_template *temp, return 0; } -EXPORT_SYMBOL(snd_hda_bus_new); /* * find a matching codec preset @@ -408,9 +396,7 @@ 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) && - (! preset->rev || - preset->rev == codec->revision_id)) + if (preset->id == (codec->vendor_id & mask)) return preset; } } @@ -537,19 +523,13 @@ int snd_hda_codec_new(struct hda_bus *bus, unsigned int codec_addr, codec->bus = bus; codec->addr = codec_addr; - mutex_init(&codec->spdif_mutex); + init_MUTEX(&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); @@ -600,8 +580,6 @@ 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 @@ -624,7 +602,6 @@ 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 @@ -745,8 +722,7 @@ static void put_vol_mute(struct hda_codec *codec, struct hda_amp_info *info, /* * 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) +static 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) @@ -757,8 +733,7 @@ int snd_hda_codec_amp_read(struct hda_codec *codec, hda_nid_t nid, int ch, /* * 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) +static 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)); @@ -906,12 +881,12 @@ int snd_hda_mixer_bind_switch_get(struct snd_kcontrol *kcontrol, struct snd_ctl_ unsigned long pval; int err; - mutex_lock(&codec->spdif_mutex); /* reuse spdif_mutex */ + down(&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); + up(&codec->spdif_mutex); return err; } @@ -921,7 +896,7 @@ int snd_hda_mixer_bind_switch_put(struct snd_kcontrol *kcontrol, struct snd_ctl_ unsigned long pval; int i, indices, err = 0, change = 0; - mutex_lock(&codec->spdif_mutex); /* reuse spdif_mutex */ + down(&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++) { @@ -932,7 +907,7 @@ int snd_hda_mixer_bind_switch_put(struct snd_kcontrol *kcontrol, struct snd_ctl_ change |= err; } kcontrol->private_value = pval; - mutex_unlock(&codec->spdif_mutex); + up(&codec->spdif_mutex); return err < 0 ? err : change; } @@ -1036,7 +1011,7 @@ static int snd_hda_spdif_default_put(struct snd_kcontrol *kcontrol, struct snd_c unsigned short val; int change; - mutex_lock(&codec->spdif_mutex); + down(&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) | @@ -1051,7 +1026,7 @@ static int snd_hda_spdif_default_put(struct snd_kcontrol *kcontrol, struct snd_c snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_DIGI_CONVERT_2, val >> 8); } - mutex_unlock(&codec->spdif_mutex); + up(&codec->spdif_mutex); return change; } @@ -1079,7 +1054,7 @@ static int snd_hda_spdif_out_switch_put(struct snd_kcontrol *kcontrol, struct sn unsigned short val; int change; - mutex_lock(&codec->spdif_mutex); + down(&codec->spdif_mutex); val = codec->spdif_ctls & ~1; if (ucontrol->value.integer.value[0]) val |= 1; @@ -1091,7 +1066,7 @@ static int snd_hda_spdif_out_switch_put(struct snd_kcontrol *kcontrol, struct sn AC_AMP_SET_RIGHT | AC_AMP_SET_LEFT | AC_AMP_SET_OUTPUT | ((val & 1) ? 0 : 0x80)); } - mutex_unlock(&codec->spdif_mutex); + up(&codec->spdif_mutex); return change; } @@ -1175,13 +1150,13 @@ static int snd_hda_spdif_in_switch_put(struct snd_kcontrol *kcontrol, struct snd unsigned int val = !!ucontrol->value.integer.value[0]; int change; - mutex_lock(&codec->spdif_mutex); + down(&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); } - mutex_unlock(&codec->spdif_mutex); + up(&codec->spdif_mutex); return change; } @@ -1310,7 +1285,6 @@ int snd_hda_build_controls(struct hda_bus *bus) return 0; } -EXPORT_SYMBOL(snd_hda_build_controls); /* * stream formats @@ -1399,8 +1373,6 @@ 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 @@ -1682,7 +1654,6 @@ 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 @@ -1853,13 +1824,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) { - mutex_lock(&codec->spdif_mutex); + down(&codec->spdif_mutex); if (mout->dig_out_used) { - mutex_unlock(&codec->spdif_mutex); + up(&codec->spdif_mutex); return -EBUSY; /* already being used */ } mout->dig_out_used = HDA_DIG_EXCLUSIVE; - mutex_unlock(&codec->spdif_mutex); + up(&codec->spdif_mutex); return 0; } @@ -1868,9 +1839,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) { - mutex_lock(&codec->spdif_mutex); + down(&codec->spdif_mutex); mout->dig_out_used = 0; - mutex_unlock(&codec->spdif_mutex); + up(&codec->spdif_mutex); return 0; } @@ -1898,7 +1869,7 @@ int snd_hda_multi_out_analog_prepare(struct hda_codec *codec, struct hda_multi_o int chs = substream->runtime->channels; int i; - mutex_lock(&codec->spdif_mutex); + down(&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) && @@ -1912,20 +1883,13 @@ 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); } } - mutex_unlock(&codec->spdif_mutex); + up(&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 (chs >= (i + 1) * 2) /* independent out */ @@ -1950,17 +1914,12 @@ 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); - 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); + down(&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; } - mutex_unlock(&codec->spdif_mutex); + up(&codec->spdif_mutex); return 0; } @@ -1976,29 +1935,13 @@ static int is_in_nid_list(hda_nid_t nid, hda_nid_t *list) 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. - */ +/* parse all pin widgets and store the useful pin nids to cfg */ 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)]; + short seq, sequences[4], assoc_line_out; memset(cfg, 0, sizeof(*cfg)); @@ -2040,10 +1983,7 @@ int snd_hda_parse_pin_def_config(struct hda_codec *codec, struct auto_pin_cfg *c 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++; + cfg->speaker_pin = nid; break; case AC_JACK_HP_OUT: cfg->hp_pin = nid; @@ -2108,46 +2048,6 @@ int snd_hda_parse_pin_def_config(struct hda_codec *codec, struct auto_pin_cfg *c 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; } @@ -2185,8 +2085,6 @@ int snd_hda_suspend(struct hda_bus *bus, pm_message_t state) return 0; } -EXPORT_SYMBOL(snd_hda_suspend); - /** * snd_hda_resume - resume the codecs * @bus: the HDA bus @@ -2209,8 +2107,6 @@ int snd_hda_resume(struct hda_bus *bus) return 0; } -EXPORT_SYMBOL(snd_hda_resume); - /** * snd_hda_resume_ctls - resume controls in the new control list * @codec: the HDA codec @@ -2270,6 +2166,25 @@ 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_codec.h b/sound/pci/hda/hda_codec.h index 40520e9d5..63e26c7a2 100644 --- a/sound/pci/hda/hda_codec.h +++ b/sound/pci/hda/hda_codec.h @@ -438,7 +438,7 @@ struct hda_bus { struct list_head codec_list; struct hda_codec *caddr_tbl[HDA_MAX_CODEC_ADDRESS + 1]; /* caddr -> codec */ - struct mutex cmd_mutex; + struct semaphore cmd_mutex; /* unsolicited event queue */ struct hda_bus_unsolicited *unsol; @@ -559,7 +559,7 @@ struct hda_codec { int amp_info_size; struct hda_amp_info *amp_info; - struct mutex spdif_mutex; + struct semaphore spdif_mutex; unsigned int spdif_status; /* IEC958 status bits */ unsigned short spdif_ctls; /* SPDIF control bits */ unsigned int spdif_in_enable; /* SPDIF input enable? */ diff --git a/sound/pci/hda/hda_generic.c b/sound/pci/hda/hda_generic.c index 85ad164ad..39edfcfd3 100644 --- a/sound/pci/hda/hda_generic.c +++ b/sound/pci/hda/hda_generic.c @@ -47,10 +47,10 @@ struct hda_gnode { /* patch-specific record */ struct hda_gspec { - struct hda_gnode *dac_node[2]; /* DAC node */ - struct hda_gnode *out_pin_node[2]; /* Output pin (Line-Out) node */ - struct hda_gnode *pcm_vol_node[2]; /* Node for PCM volume */ - unsigned int pcm_vol_index[2]; /* connection of PCM volume */ + struct hda_gnode *dac_node; /* DAC node */ + struct hda_gnode *out_pin_node; /* Output pin (Line-Out) node */ + struct hda_gnode *pcm_vol_node; /* Node for PCM volume */ + unsigned int pcm_vol_index; /* connection of PCM volume */ struct hda_gnode *adc_node; /* ADC node */ struct hda_gnode *cap_vol_node; /* Node for capture volume */ @@ -69,12 +69,8 @@ struct hda_gspec { /* * retrieve the default device type from the default config value */ -#define defcfg_type(node) (((node)->def_cfg & AC_DEFCFG_DEVICE) >> \ - AC_DEFCFG_DEVICE_SHIFT) -#define defcfg_location(node) (((node)->def_cfg & AC_DEFCFG_LOCATION) >> \ - AC_DEFCFG_LOCATION_SHIFT) -#define defcfg_port_conn(node) (((node)->def_cfg & AC_DEFCFG_PORT_CONN) >> \ - AC_DEFCFG_PORT_CONN_SHIFT) +#define defcfg_type(node) (((node)->def_cfg & AC_DEFCFG_DEVICE) >> AC_DEFCFG_DEVICE_SHIFT) +#define defcfg_location(node) (((node)->def_cfg & AC_DEFCFG_LOCATION) >> AC_DEFCFG_LOCATION_SHIFT) /* * destructor @@ -265,7 +261,7 @@ static void clear_check_flags(struct hda_gspec *spec) * returns 0 if not found, 1 if found, or a negative error code. */ static int parse_output_path(struct hda_codec *codec, struct hda_gspec *spec, - struct hda_gnode *node, int dac_idx) + struct hda_gnode *node) { int i, err; struct hda_gnode *child; @@ -280,14 +276,14 @@ static int parse_output_path(struct hda_codec *codec, struct hda_gspec *spec, return 0; } snd_printdd("AUD_OUT found %x\n", node->nid); - if (spec->dac_node[dac_idx]) { + if (spec->dac_node) { /* already DAC node is assigned, just unmute & connect */ - return node == spec->dac_node[dac_idx]; + return node == spec->dac_node; } - spec->dac_node[dac_idx] = node; + spec->dac_node = node; if (node->wid_caps & AC_WCAP_OUT_AMP) { - spec->pcm_vol_node[dac_idx] = node; - spec->pcm_vol_index[dac_idx] = 0; + spec->pcm_vol_node = node; + spec->pcm_vol_index = 0; } return 1; /* found */ } @@ -296,7 +292,7 @@ static int parse_output_path(struct hda_codec *codec, struct hda_gspec *spec, child = hda_get_node(spec, node->conn_list[i]); if (! child) continue; - err = parse_output_path(codec, spec, child, dac_idx); + err = parse_output_path(codec, spec, child); if (err < 0) return err; else if (err > 0) { @@ -307,13 +303,13 @@ static int parse_output_path(struct hda_codec *codec, struct hda_gspec *spec, select_input_connection(codec, node, i); unmute_input(codec, node, i); unmute_output(codec, node); - if (! spec->pcm_vol_node[dac_idx]) { + if (! spec->pcm_vol_node) { if (node->wid_caps & AC_WCAP_IN_AMP) { - spec->pcm_vol_node[dac_idx] = node; - spec->pcm_vol_index[dac_idx] = i; + spec->pcm_vol_node = node; + spec->pcm_vol_index = i; } else if (node->wid_caps & AC_WCAP_OUT_AMP) { - spec->pcm_vol_node[dac_idx] = node; - spec->pcm_vol_index[dac_idx] = 0; + spec->pcm_vol_node = node; + spec->pcm_vol_index = 0; } } return 1; @@ -343,8 +339,6 @@ static struct hda_gnode *parse_output_jack(struct hda_codec *codec, /* output capable? */ if (! (node->pin_caps & AC_PINCAP_OUT)) continue; - if (defcfg_port_conn(node) == AC_JACK_PORT_NONE) - continue; /* unconnected */ if (jack_type >= 0) { if (jack_type != defcfg_type(node)) continue; @@ -356,15 +350,10 @@ static struct hda_gnode *parse_output_jack(struct hda_codec *codec, continue; } clear_check_flags(spec); - err = parse_output_path(codec, spec, node, 0); + err = parse_output_path(codec, spec, node); if (err < 0) return NULL; - if (! err && spec->out_pin_node[0]) { - err = parse_output_path(codec, spec, node, 1); - if (err < 0) - return NULL; - } - if (err > 0) { + else if (err > 0) { /* unmute the PIN output */ unmute_output(codec, node); /* set PIN-Out enable */ @@ -392,28 +381,20 @@ static int parse_output(struct hda_codec *codec) /* first, look for the line-out pin */ node = parse_output_jack(codec, spec, AC_JACK_LINE_OUT); if (node) /* found, remember the PIN node */ - spec->out_pin_node[0] = node; - else { - /* if no line-out is found, try speaker out */ - node = parse_output_jack(codec, spec, AC_JACK_SPEAKER); - if (node) - spec->out_pin_node[0] = node; - } + spec->out_pin_node = node; /* look for the HP-out pin */ node = parse_output_jack(codec, spec, AC_JACK_HP_OUT); if (node) { - if (! spec->out_pin_node[0]) - spec->out_pin_node[0] = node; - else - spec->out_pin_node[1] = node; + if (! spec->out_pin_node) + spec->out_pin_node = node; } - if (! spec->out_pin_node[0]) { + if (! spec->out_pin_node) { /* no line-out or HP pins found, * then choose for the first output pin */ - spec->out_pin_node[0] = parse_output_jack(codec, spec, -1); - if (! spec->out_pin_node[0]) + spec->out_pin_node = parse_output_jack(codec, spec, -1); + if (! spec->out_pin_node) snd_printd("hda_generic: no proper output path found\n"); } @@ -524,9 +505,6 @@ static int parse_adc_sub_nodes(struct hda_codec *codec, struct hda_gspec *spec, if (! (node->pin_caps & AC_PINCAP_IN)) return 0; - if (defcfg_port_conn(node) == AC_JACK_PORT_NONE) - return 0; /* unconnected */ - if (node->wid_caps & AC_WCAP_DIGITAL) return 0; /* skip SPDIF */ @@ -725,16 +703,12 @@ static int check_existing_control(struct hda_codec *codec, const char *type, con static int build_output_controls(struct hda_codec *codec) { struct hda_gspec *spec = codec->spec; - static const char *types[2] = { "Master", "Headphone" }; - int i, err; + int err; - for (i = 0; i < 2 && spec->pcm_vol_node[i]; i++) { - err = create_mixer(codec, spec->pcm_vol_node[i], - spec->pcm_vol_index[i], - types[i], "Playback"); - if (err < 0) - return err; - } + err = create_mixer(codec, spec->pcm_vol_node, spec->pcm_vol_index, + "PCM", "Playback"); + if (err < 0) + return err; return 0; } @@ -831,7 +805,7 @@ static int build_loopback_controls(struct hda_codec *codec) int err; const char *type; - if (! spec->out_pin_node[0]) + if (! spec->out_pin_node) return 0; list_for_each(p, &spec->nid_list) { @@ -846,8 +820,7 @@ static int build_loopback_controls(struct hda_codec *codec) if (check_existing_control(codec, type, "Playback")) continue; clear_check_flags(spec); - err = parse_loopback_path(codec, spec, - spec->out_pin_node[0], + err = parse_loopback_path(codec, spec, spec->out_pin_node, node, type); if (err < 0) return err; @@ -882,37 +855,12 @@ static struct hda_pcm_stream generic_pcm_playback = { .channels_max = 2, }; -static int generic_pcm2_prepare(struct hda_pcm_stream *hinfo, - struct hda_codec *codec, - unsigned int stream_tag, - unsigned int format, - struct snd_pcm_substream *substream) -{ - struct hda_gspec *spec = codec->spec; - - snd_hda_codec_setup_stream(codec, hinfo->nid, stream_tag, 0, format); - snd_hda_codec_setup_stream(codec, spec->dac_node[1]->nid, - stream_tag, 0, format); - return 0; -} - -static int generic_pcm2_cleanup(struct hda_pcm_stream *hinfo, - struct hda_codec *codec, - struct snd_pcm_substream *substream) -{ - struct hda_gspec *spec = codec->spec; - - snd_hda_codec_setup_stream(codec, hinfo->nid, 0, 0, 0); - snd_hda_codec_setup_stream(codec, spec->dac_node[1]->nid, 0, 0, 0); - return 0; -} - static int build_generic_pcms(struct hda_codec *codec) { struct hda_gspec *spec = codec->spec; struct hda_pcm *info = &spec->pcm_rec; - if (! spec->dac_node[0] && ! spec->adc_node) { + if (! spec->dac_node && ! spec->adc_node) { snd_printd("hda_generic: no PCM found\n"); return 0; } @@ -921,13 +869,9 @@ static int build_generic_pcms(struct hda_codec *codec) codec->pcm_info = info; info->name = "HDA Generic"; - if (spec->dac_node[0]) { + if (spec->dac_node) { info->stream[0] = generic_pcm_playback; - info->stream[0].nid = spec->dac_node[0]->nid; - if (spec->dac_node[1]) { - info->stream[0].ops.prepare = generic_pcm2_prepare; - info->stream[0].ops.cleanup = generic_pcm2_cleanup; - } + info->stream[0].nid = spec->dac_node->nid; } if (spec->adc_node) { info->stream[1] = generic_pcm_playback; diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c index 79d63c99f..0ff38cbe7 100644 --- a/sound/pci/hda/hda_intel.c +++ b/sound/pci/hda/hda_intel.c @@ -43,7 +43,6 @@ #include #include #include -#include #include #include #include "hda_codec.h" @@ -54,7 +53,6 @@ static char *id = SNDRV_DEFAULT_STR1; static char *model; static int position_fix; static int probe_mask = -1; -static int single_cmd; module_param(index, int, 0444); MODULE_PARM_DESC(index, "Index value for Intel HD audio interface."); @@ -66,8 +64,6 @@ module_param(position_fix, int, 0444); MODULE_PARM_DESC(position_fix, "Fix DMA pointer (0 = auto, 1 = none, 2 = POSBUF, 3 = FIFO size)."); module_param(probe_mask, int, 0444); MODULE_PARM_DESC(probe_mask, "Bitmask to probe codecs (default = -1)."); -module_param(single_cmd, bool, 0444); -MODULE_PARM_DESC(single_cmd, "Use single command to communicate with codecs (for debugging only)."); /* just for backward compatibility */ @@ -81,8 +77,6 @@ MODULE_SUPPORTED_DEVICE("{{Intel, ICH6}," "{Intel, ESB2}," "{Intel, ICH8}," "{ATI, SB450}," - "{ATI, SB600}," - "{ATI, RS600}," "{VIA, VT8251}," "{VIA, VT8237A}," "{SiS, SIS966}," @@ -168,12 +162,6 @@ 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 @@ -246,6 +234,12 @@ enum { #define NVIDIA_HDA_TRANSREG_ADDR 0x4e #define NVIDIA_HDA_ENABLE_COHBITS 0x0f +/* + * Use CORB/RIRB for communication from/to codecs. + * This is the way recommended by Intel (see below). + */ +#define USE_CORB_RIRB + /* */ @@ -258,6 +252,7 @@ struct azx_dev { unsigned int fragsize; /* size of each period in bytes */ unsigned int frags; /* number for period in the play buffer */ unsigned int fifo_size; /* FIFO size */ + unsigned int last_pos; /* last updated period position */ void __iomem *sd_addr; /* stream descriptor pointer */ @@ -268,11 +263,10 @@ struct azx_dev { unsigned int format_val; /* format value to be set in the controller and the codec */ unsigned char stream_tag; /* assigned stream */ unsigned char index; /* stream index */ - /* for sanity check of position buffer */ - unsigned int period_intr; unsigned int opened: 1; unsigned int running: 1; + unsigned int period_updating: 1; }; /* CORB/RIRB */ @@ -306,7 +300,7 @@ struct azx { /* locks */ spinlock_t reg_lock; - struct mutex open_mutex; + struct semaphore open_mutex; /* streams (x num_streams) */ struct azx_dev *azx_dev; @@ -331,14 +325,12 @@ struct azx { /* flags */ int position_fix; unsigned int initialized: 1; - unsigned int single_cmd: 1; }; /* driver types */ enum { AZX_DRIVER_ICH, AZX_DRIVER_ATI, - AZX_DRIVER_ATIHDMI, AZX_DRIVER_VIA, AZX_DRIVER_SIS, AZX_DRIVER_ULI, @@ -348,7 +340,6 @@ 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", @@ -397,6 +388,7 @@ static char *driver_short_names[] __devinitdata = { * Interface for HD codec */ +#ifdef USE_CORB_RIRB /* * CORB / RIRB interface */ @@ -444,7 +436,11 @@ static void azx_init_cmd_io(struct azx *chip) /* set N=1, get RIRB response interrupt for new entry */ azx_writew(chip, RINTCNT, 1); /* enable rirb dma and response irq */ +#ifdef USE_CORB_RIRB azx_writeb(chip, RIRBCTL, ICH6_RBCTL_DMA_EN | ICH6_RBCTL_IRQ_EN); +#else + azx_writeb(chip, RIRBCTL, ICH6_RBCTL_DMA_EN); +#endif chip->rirb.rp = chip->rirb.cmds = 0; } @@ -456,8 +452,8 @@ static void azx_free_cmd_io(struct azx *chip) } /* send a command */ -static int azx_corb_send_cmd(struct hda_codec *codec, hda_nid_t nid, int direct, - unsigned int verb, unsigned int para) +static int azx_send_cmd(struct hda_codec *codec, hda_nid_t nid, int direct, + unsigned int verb, unsigned int para) { struct azx *chip = codec->bus->private_data; unsigned int wp; @@ -513,21 +509,18 @@ static void azx_update_rirb(struct azx *chip) } /* receive a response */ -static unsigned int azx_rirb_get_response(struct hda_codec *codec) +static unsigned int azx_get_response(struct hda_codec *codec) { struct azx *chip = codec->bus->private_data; int timeout = 50; while (chip->rirb.cmds) { if (! --timeout) { - snd_printk(KERN_ERR - "hda_intel: azx_get_response timeout, " - "switching to single_cmd mode...\n"); + if (printk_ratelimit()) + snd_printk(KERN_ERR + "azx_get_response timeout\n"); chip->rirb.rp = azx_readb(chip, RIRBWP); chip->rirb.cmds = 0; - /* switch to single_cmd mode */ - chip->single_cmd = 1; - azx_free_cmd_io(chip); return -1; } msleep(1); @@ -535,6 +528,7 @@ static unsigned int azx_rirb_get_response(struct hda_codec *codec) return chip->rirb.res; /* the last value */ } +#else /* * Use the single immediate command instead of CORB/RIRB for simplicity * @@ -545,10 +539,13 @@ static unsigned int azx_rirb_get_response(struct hda_codec *codec) * I left the codes, however, for debugging/testing purposes. */ +#define azx_alloc_cmd_io(chip) 0 +#define azx_init_cmd_io(chip) +#define azx_free_cmd_io(chip) + /* send a command */ -static int azx_single_send_cmd(struct hda_codec *codec, hda_nid_t nid, - int direct, unsigned int verb, - unsigned int para) +static int azx_send_cmd(struct hda_codec *codec, hda_nid_t nid, int direct, + unsigned int verb, unsigned int para) { struct azx *chip = codec->bus->private_data; u32 val; @@ -576,7 +573,7 @@ static int azx_single_send_cmd(struct hda_codec *codec, hda_nid_t nid, } /* receive a response */ -static unsigned int azx_single_get_response(struct hda_codec *codec) +static unsigned int azx_get_response(struct hda_codec *codec) { struct azx *chip = codec->bus->private_data; int timeout = 50; @@ -591,35 +588,9 @@ static unsigned int azx_single_get_response(struct hda_codec *codec) return (unsigned int)-1; } -/* - * The below are the main callbacks from hda_codec. - * - * They are just the skeleton to call sub-callbacks according to the - * current setting of chip->single_cmd. - */ - -/* send a command */ -static int azx_send_cmd(struct hda_codec *codec, hda_nid_t nid, - int direct, unsigned int verb, - unsigned int para) -{ - struct azx *chip = codec->bus->private_data; - if (chip->single_cmd) - return azx_single_send_cmd(codec, nid, direct, verb, para); - else - return azx_corb_send_cmd(codec, nid, direct, verb, para); -} - -/* get a response */ -static unsigned int azx_get_response(struct hda_codec *codec) -{ - struct azx *chip = codec->bus->private_data; - if (chip->single_cmd) - return azx_single_get_response(codec); - else - return azx_rirb_get_response(codec); -} +#define azx_update_rirb(chip) +#endif /* USE_CORB_RIRB */ /* reset codec link */ static int azx_reset(struct azx *chip) @@ -766,8 +737,7 @@ static void azx_init_chip(struct azx *chip) azx_int_enable(chip); /* initialize the codec command I/O */ - if (! chip->single_cmd) - azx_init_cmd_io(chip); + azx_init_cmd_io(chip); /* program the position buffer */ azx_writel(chip, DPLBASE, (u32)chip->posbuf.addr); @@ -814,10 +784,11 @@ static irqreturn_t azx_interrupt(int irq, void* dev_id, struct pt_regs *regs) if (status & azx_dev->sd_int_sta_mask) { azx_sd_writeb(azx_dev, SD_STS, SD_INT_MASK); if (azx_dev->substream && azx_dev->running) { - azx_dev->period_intr++; + azx_dev->period_updating = 1; spin_unlock(&chip->reg_lock); snd_pcm_period_elapsed(azx_dev->substream); spin_lock(&chip->reg_lock); + azx_dev->period_updating = 0; } } } @@ -825,7 +796,7 @@ static irqreturn_t azx_interrupt(int irq, void* dev_id, struct pt_regs *regs) /* clear rirb int */ status = azx_readb(chip, RIRBSTS); if (status & RIRB_INT_MASK) { - if (! chip->single_cmd && (status & RIRB_INT_RESPONSE)) + if (status & RIRB_INT_RESPONSE) azx_update_rirb(chip); azx_writeb(chip, RIRBSTS, RIRB_INT_MASK); } @@ -1031,10 +1002,10 @@ static int azx_pcm_open(struct snd_pcm_substream *substream) unsigned long flags; int err; - mutex_lock(&chip->open_mutex); + down(&chip->open_mutex); azx_dev = azx_assign_device(chip, substream->stream); if (azx_dev == NULL) { - mutex_unlock(&chip->open_mutex); + up(&chip->open_mutex); return -EBUSY; } runtime->hw = azx_pcm_hw; @@ -1046,7 +1017,7 @@ static int azx_pcm_open(struct snd_pcm_substream *substream) snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS); if ((err = hinfo->ops.open(hinfo, apcm->codec, substream)) < 0) { azx_release_device(azx_dev); - mutex_unlock(&chip->open_mutex); + up(&chip->open_mutex); return err; } spin_lock_irqsave(&chip->reg_lock, flags); @@ -1055,7 +1026,7 @@ static int azx_pcm_open(struct snd_pcm_substream *substream) spin_unlock_irqrestore(&chip->reg_lock, flags); runtime->private_data = azx_dev; - mutex_unlock(&chip->open_mutex); + up(&chip->open_mutex); return 0; } @@ -1067,14 +1038,14 @@ static int azx_pcm_close(struct snd_pcm_substream *substream) struct azx_dev *azx_dev = get_azx_dev(substream); unsigned long flags; - mutex_lock(&chip->open_mutex); + down(&chip->open_mutex); spin_lock_irqsave(&chip->reg_lock, flags); azx_dev->substream = NULL; azx_dev->running = 0; spin_unlock_irqrestore(&chip->reg_lock, flags); azx_release_device(azx_dev); hinfo->ops.close(hinfo, apcm->codec, substream); - mutex_unlock(&chip->open_mutex); + up(&chip->open_mutex); return 0; } @@ -1128,6 +1099,7 @@ static int azx_pcm_prepare(struct snd_pcm_substream *substream) azx_dev->fifo_size = azx_sd_readw(azx_dev, SD_FIFOSIZE) + 1; else azx_dev->fifo_size = 0; + azx_dev->last_pos = 0; return hinfo->ops.prepare(hinfo, apcm->codec, azx_dev->stream_tag, azx_dev->format_val, substream); @@ -1175,20 +1147,10 @@ static snd_pcm_uframes_t azx_pcm_pointer(struct snd_pcm_substream *substream) struct azx_dev *azx_dev = get_azx_dev(substream); unsigned int pos; - if (chip->position_fix == POS_FIX_POSBUF || - chip->position_fix == POS_FIX_AUTO) { + if (chip->position_fix == POS_FIX_POSBUF) { /* use the position buffer */ pos = *azx_dev->posbuf; - if (chip->position_fix == POS_FIX_AUTO && - azx_dev->period_intr == 1 && ! pos) { - printk(KERN_WARNING - "hda-intel: Invalid position buffer, " - "using LPIB read method instead.\n"); - chip->position_fix = POS_FIX_NONE; - goto read_lpib; - } } else { - read_lpib: /* read LPIB */ pos = azx_sd_readl(azx_dev, SD_LPIB); if (chip->position_fix == POS_FIX_FIFO) @@ -1453,14 +1415,13 @@ static int __devinit azx_create(struct snd_card *card, struct pci_dev *pci, } spin_lock_init(&chip->reg_lock); - mutex_init(&chip->open_mutex); + init_MUTEX(&chip->open_mutex); chip->card = card; chip->pci = pci; chip->irq = -1; chip->driver_type = driver_type; - chip->position_fix = position_fix; - chip->single_cmd = single_cmd; + chip->position_fix = position_fix ? position_fix : POS_FIX_POSBUF; #if BITS_PER_LONG != 64 /* Fix up base address on ULI M5461 */ @@ -1486,7 +1447,7 @@ static int __devinit azx_create(struct snd_card *card, struct pci_dev *pci, goto errout; } - if (request_irq(pci->irq, azx_interrupt, IRQF_DISABLED|IRQF_SHARED, + if (request_irq(pci->irq, azx_interrupt, SA_INTERRUPT|SA_SHIRQ, "HDA Intel", (void*)chip)) { snd_printk(KERN_ERR SFX "unable to grab IRQ %d\n", pci->irq); err = -EBUSY; @@ -1504,12 +1465,6 @@ 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; @@ -1537,9 +1492,8 @@ static int __devinit azx_create(struct snd_card *card, struct pci_dev *pci, goto errout; } /* allocate CORB/RIRB */ - if (! chip->single_cmd) - if ((err = azx_alloc_cmd_io(chip)) < 0) - goto errout; + if ((err = azx_alloc_cmd_io(chip)) < 0) + goto errout; /* initialize streams */ azx_init_stream(chip); @@ -1635,8 +1589,6 @@ static struct pci_device_id azx_ids[] = { { 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_local.h b/sound/pci/hda/hda_local.h index 14e8aa280..c82d2a72d 100644 --- a/sound/pci/hda/hda_local.h +++ b/sound/pci/hda/hda_local.h @@ -66,11 +66,6 @@ int snd_hda_mixer_amp_volume_put(struct snd_kcontrol *kcontrol, struct snd_ctl_e int snd_hda_mixer_amp_switch_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo); int snd_hda_mixer_amp_switch_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol); int snd_hda_mixer_amp_switch_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol); -/* lowlevel accessor with caching; use carefully */ -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_update(struct hda_codec *codec, hda_nid_t nid, int ch, - int direction, int idx, int mask, int val); /* mono switch binding multiple inputs */ #define HDA_BIND_MUTE_MONO(xname, nid, channel, indices, direction) \ @@ -135,7 +130,6 @@ struct hda_multi_out { int num_dacs; /* # of DACs, must be more than 1 */ hda_nid_t *dac_nids; /* DAC list */ hda_nid_t hp_nid; /* optional DAC for HP, 0 when not exists */ - hda_nid_t extra_out_nid[3]; /* optional DACs, 0 when not exists */ hda_nid_t dig_out_nid; /* digital out audio widget */ int max_channels; /* currently supported analog channels */ int dig_out_used; /* current usage of digital out (HDA_DIG_XXX) */ @@ -222,8 +216,7 @@ extern const char *auto_pin_cfg_labels[AUTO_PIN_LAST]; struct auto_pin_cfg { int line_outs; hda_nid_t line_out_pins[5]; /* sorted in the order of Front/Surr/CLFE/Side */ - int speaker_outs; - hda_nid_t speaker_pins[5]; + hda_nid_t speaker_pin; hda_nid_t hp_pin; hda_nid_t input_pins[AUTO_PIN_LAST]; hda_nid_t dig_out_pin; diff --git a/sound/pci/hda/hda_patch.h b/sound/pci/hda/hda_patch.h index 0b668793f..acaef3c81 100644 --- a/sound/pci/hda/hda_patch.h +++ b/sound/pci/hda/hda_patch.h @@ -12,8 +12,6 @@ extern struct hda_codec_preset snd_hda_preset_analog[]; 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, @@ -21,6 +19,5 @@ static const struct hda_codec_preset *hda_preset_tables[] = { 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 c2f0fe85b..ca514a6a5 100644 --- a/sound/pci/hda/hda_proc.c +++ b/sound/pci/hda/hda_proc.c @@ -182,10 +182,6 @@ static void print_pin_caps(struct snd_info_buffer *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] %s at %s %s\n", caps, @@ -322,7 +318,7 @@ int snd_hda_codec_proc_new(struct hda_codec *codec) if (err < 0) return err; - snd_info_set_text_ops(entry, codec, print_codec_info); + snd_info_set_text_ops(entry, codec, 32 * 1024, print_codec_info); return 0; } diff --git a/sound/pci/hda/patch_analog.c b/sound/pci/hda/patch_analog.c index 6823f2bc1..edb7b1b19 100644 --- a/sound/pci/hda/patch_analog.c +++ b/sound/pci/hda/patch_analog.c @@ -23,8 +23,6 @@ #include #include #include -#include - #include #include "hda_codec.h" #include "hda_local.h" @@ -44,7 +42,6 @@ struct ad198x_spec { * dig_out_nid and hp_nid are optional */ unsigned int cur_eapd; - unsigned int need_dac_fix; /* capture */ unsigned int num_adc_nids; @@ -63,7 +60,7 @@ struct ad198x_spec { /* PCM information */ struct hda_pcm pcm_rec[2]; /* used in alc_build_pcms() */ - struct mutex amp_mutex; /* PCM volume/mute control mutex */ + struct semaphore amp_mutex; /* PCM volume/mute control mutex */ unsigned int spdif_route; /* dynamic controls, init_verbs and input_mux */ @@ -311,7 +308,7 @@ static int ad198x_resume(struct hda_codec *codec) struct ad198x_spec *spec = codec->spec; int i; - codec->patch_ops.init(codec); + ad198x_init(codec); for (i = 0; i < spec->num_mixers; i++) snd_hda_resume_ctls(codec, spec->mixers[i]); if (spec->multiout.dig_out_nid) @@ -333,61 +330,6 @@ static struct hda_codec_ops ad198x_patch_ops = { }; -/* - * EAPD control - * the private value = nid | (invert << 8) - */ -static int ad198x_eapd_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN; - uinfo->count = 1; - uinfo->value.integer.min = 0; - uinfo->value.integer.max = 1; - return 0; -} - -static int ad198x_eapd_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct hda_codec *codec = snd_kcontrol_chip(kcontrol); - struct ad198x_spec *spec = codec->spec; - int invert = (kcontrol->private_value >> 8) & 1; - if (invert) - ucontrol->value.integer.value[0] = ! spec->cur_eapd; - else - ucontrol->value.integer.value[0] = spec->cur_eapd; - return 0; -} - -static int ad198x_eapd_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct hda_codec *codec = snd_kcontrol_chip(kcontrol); - struct ad198x_spec *spec = codec->spec; - int invert = (kcontrol->private_value >> 8) & 1; - hda_nid_t nid = kcontrol->private_value & 0xff; - unsigned int eapd; - eapd = ucontrol->value.integer.value[0]; - if (invert) - eapd = !eapd; - if (eapd == spec->cur_eapd && ! codec->in_resume) - return 0; - spec->cur_eapd = eapd; - snd_hda_codec_write(codec, nid, - 0, AC_VERB_SET_EAPD_BTLENABLE, - eapd ? 0x02 : 0x00); - return 1; -} - -static int ad198x_ch_mode_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo); -static int ad198x_ch_mode_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol); -static int ad198x_ch_mode_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol); - - /* * AD1986A specific */ @@ -402,7 +344,6 @@ static hda_nid_t ad1986a_dac_nids[3] = { AD1986A_FRONT_DAC, AD1986A_SURR_DAC, AD1986A_CLFE_DAC }; static hda_nid_t ad1986a_adc_nids[1] = { AD1986A_ADC }; -static hda_nid_t ad1986a_capsrc_nids[1] = { 0x12 }; static struct hda_input_mux ad1986a_capture_source = { .num_items = 7, @@ -430,9 +371,9 @@ static int ad1986a_pcm_amp_vol_get(struct snd_kcontrol *kcontrol, struct snd_ctl struct hda_codec *codec = snd_kcontrol_chip(kcontrol); struct ad198x_spec *ad = codec->spec; - mutex_lock(&ad->amp_mutex); + down(&ad->amp_mutex); snd_hda_mixer_amp_volume_get(kcontrol, ucontrol); - mutex_unlock(&ad->amp_mutex); + up(&ad->amp_mutex); return 0; } @@ -442,13 +383,13 @@ static int ad1986a_pcm_amp_vol_put(struct snd_kcontrol *kcontrol, struct snd_ctl struct ad198x_spec *ad = codec->spec; int i, change = 0; - mutex_lock(&ad->amp_mutex); + down(&ad->amp_mutex); for (i = 0; i < ARRAY_SIZE(ad1986a_dac_nids); i++) { kcontrol->private_value = HDA_COMPOSE_AMP_VAL(ad1986a_dac_nids[i], 3, 0, HDA_OUTPUT); change |= snd_hda_mixer_amp_volume_put(kcontrol, ucontrol); } kcontrol->private_value = HDA_COMPOSE_AMP_VAL(AD1986A_FRONT_DAC, 3, 0, HDA_OUTPUT); - mutex_unlock(&ad->amp_mutex); + up(&ad->amp_mutex); return change; } @@ -459,9 +400,9 @@ static int ad1986a_pcm_amp_sw_get(struct snd_kcontrol *kcontrol, struct snd_ctl_ struct hda_codec *codec = snd_kcontrol_chip(kcontrol); struct ad198x_spec *ad = codec->spec; - mutex_lock(&ad->amp_mutex); + down(&ad->amp_mutex); snd_hda_mixer_amp_switch_get(kcontrol, ucontrol); - mutex_unlock(&ad->amp_mutex); + up(&ad->amp_mutex); return 0; } @@ -471,13 +412,13 @@ static int ad1986a_pcm_amp_sw_put(struct snd_kcontrol *kcontrol, struct snd_ctl_ struct ad198x_spec *ad = codec->spec; int i, change = 0; - mutex_lock(&ad->amp_mutex); + down(&ad->amp_mutex); for (i = 0; i < ARRAY_SIZE(ad1986a_dac_nids); i++) { kcontrol->private_value = HDA_COMPOSE_AMP_VAL(ad1986a_dac_nids[i], 3, 0, HDA_OUTPUT); change |= snd_hda_mixer_amp_switch_put(kcontrol, ucontrol); } kcontrol->private_value = HDA_COMPOSE_AMP_VAL(AD1986A_FRONT_DAC, 3, 0, HDA_OUTPUT); - mutex_unlock(&ad->amp_mutex); + up(&ad->amp_mutex); return change; } @@ -536,143 +477,6 @@ static struct snd_kcontrol_new ad1986a_mixers[] = { { } /* end */ }; -/* additional mixers for 3stack mode */ -static struct snd_kcontrol_new ad1986a_3st_mixers[] = { - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "Channel Mode", - .info = ad198x_ch_mode_info, - .get = ad198x_ch_mode_get, - .put = ad198x_ch_mode_put, - }, - { } /* end */ -}; - -/* laptop model - 2ch only */ -static hda_nid_t ad1986a_laptop_dac_nids[1] = { AD1986A_FRONT_DAC }; - -static struct snd_kcontrol_new ad1986a_laptop_mixers[] = { - HDA_CODEC_VOLUME("PCM Playback Volume", 0x03, 0x0, HDA_OUTPUT), - HDA_CODEC_MUTE("PCM Playback Switch", 0x03, 0x0, HDA_OUTPUT), - HDA_CODEC_VOLUME("Master Playback Volume", 0x1b, 0x0, HDA_OUTPUT), - HDA_CODEC_MUTE("Master Playback Switch", 0x1b, 0x0, HDA_OUTPUT), - /* HDA_CODEC_VOLUME("Headphone Playback Volume", 0x1a, 0x0, HDA_OUTPUT), - HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x0, HDA_OUTPUT), */ - HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_OUTPUT), - HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_OUTPUT), - HDA_CODEC_VOLUME("Line Playback Volume", 0x17, 0x0, HDA_OUTPUT), - HDA_CODEC_MUTE("Line Playback Switch", 0x17, 0x0, HDA_OUTPUT), - HDA_CODEC_VOLUME("Aux Playback Volume", 0x16, 0x0, HDA_OUTPUT), - HDA_CODEC_MUTE("Aux Playback Switch", 0x16, 0x0, HDA_OUTPUT), - HDA_CODEC_VOLUME("Mic Playback Volume", 0x13, 0x0, HDA_OUTPUT), - HDA_CODEC_MUTE("Mic Playback Switch", 0x13, 0x0, HDA_OUTPUT), - /* HDA_CODEC_VOLUME("PC Speaker Playback Volume", 0x18, 0x0, HDA_OUTPUT), - HDA_CODEC_MUTE("PC Speaker Playback Switch", 0x18, 0x0, HDA_OUTPUT), - HDA_CODEC_VOLUME("Mono Playback Volume", 0x1e, 0x0, HDA_OUTPUT), - HDA_CODEC_MUTE("Mono Playback Switch", 0x1e, 0x0, HDA_OUTPUT), */ - HDA_CODEC_VOLUME("Capture Volume", 0x12, 0x0, HDA_OUTPUT), - HDA_CODEC_MUTE("Capture Switch", 0x12, 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, - }, - { } /* end */ -}; - -/* laptop-eapd model - 2ch only */ - -/* master controls both pins 0x1a and 0x1b */ -static int ad1986a_laptop_master_vol_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct hda_codec *codec = snd_kcontrol_chip(kcontrol); - long *valp = ucontrol->value.integer.value; - int change; - - change = snd_hda_codec_amp_update(codec, 0x1a, 0, HDA_OUTPUT, 0, - 0x7f, valp[0] & 0x7f); - change |= snd_hda_codec_amp_update(codec, 0x1a, 1, HDA_OUTPUT, 0, - 0x7f, valp[1] & 0x7f); - snd_hda_codec_amp_update(codec, 0x1b, 0, HDA_OUTPUT, 0, - 0x7f, valp[0] & 0x7f); - snd_hda_codec_amp_update(codec, 0x1b, 1, HDA_OUTPUT, 0, - 0x7f, valp[1] & 0x7f); - return change; -} - -static int ad1986a_laptop_master_sw_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct hda_codec *codec = snd_kcontrol_chip(kcontrol); - long *valp = ucontrol->value.integer.value; - int change; - - change = snd_hda_codec_amp_update(codec, 0x1a, 0, HDA_OUTPUT, 0, - 0x80, valp[0] ? 0 : 0x80); - change |= snd_hda_codec_amp_update(codec, 0x1a, 1, HDA_OUTPUT, 0, - 0x80, valp[1] ? 0 : 0x80); - snd_hda_codec_amp_update(codec, 0x1b, 0, HDA_OUTPUT, 0, - 0x80, valp[0] ? 0 : 0x80); - snd_hda_codec_amp_update(codec, 0x1b, 1, HDA_OUTPUT, 0, - 0x80, valp[1] ? 0 : 0x80); - return change; -} - -static struct hda_input_mux ad1986a_laptop_eapd_capture_source = { - .num_items = 3, - .items = { - { "Mic", 0x0 }, - { "Internal Mic", 0x4 }, - { "Mix", 0x5 }, - }, -}; - -static struct snd_kcontrol_new ad1986a_laptop_eapd_mixers[] = { - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "Master Playback Volume", - .info = snd_hda_mixer_amp_volume_info, - .get = snd_hda_mixer_amp_volume_get, - .put = ad1986a_laptop_master_vol_put, - .private_value = HDA_COMPOSE_AMP_VAL(0x1a, 3, 0, HDA_OUTPUT), - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "Master Playback Switch", - .info = snd_hda_mixer_amp_switch_info, - .get = snd_hda_mixer_amp_switch_get, - .put = ad1986a_laptop_master_sw_put, - .private_value = HDA_COMPOSE_AMP_VAL(0x1a, 3, 0, HDA_OUTPUT), - }, - HDA_CODEC_VOLUME("PCM Playback Volume", 0x03, 0x0, HDA_OUTPUT), - HDA_CODEC_MUTE("PCM Playback Switch", 0x03, 0x0, HDA_OUTPUT), - HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x17, 0x0, HDA_OUTPUT), - HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x17, 0x0, HDA_OUTPUT), - HDA_CODEC_VOLUME("Mic Playback Volume", 0x13, 0x0, HDA_OUTPUT), - HDA_CODEC_MUTE("Mic Playback Switch", 0x13, 0x0, HDA_OUTPUT), - HDA_CODEC_VOLUME("Capture Volume", 0x12, 0x0, HDA_OUTPUT), - HDA_CODEC_MUTE("Capture Switch", 0x12, 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, - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "External Amplifier", - .info = ad198x_eapd_info, - .get = ad198x_eapd_get, - .put = ad198x_eapd_put, - .private_value = 0x1b | (1 << 8), /* port-D, inversed */ - }, - { } /* end */ -}; - /* * initialization verbs */ @@ -731,103 +535,16 @@ static struct hda_verb ad1986a_init_verbs[] = { { } /* end */ }; -/* additional verbs for 3-stack model */ -static struct hda_verb ad1986a_3st_init_verbs[] = { - /* Mic and line-in selectors */ - {0x0f, AC_VERB_SET_CONNECT_SEL, 0x2}, - {0x10, AC_VERB_SET_CONNECT_SEL, 0x1}, - { } /* end */ -}; - -static struct hda_verb ad1986a_ch2_init[] = { - /* Surround out -> Line In */ - { 0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 }, - { 0x1c, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080}, - /* CLFE -> Mic in */ - { 0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 }, - { 0x1d, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080}, - { } /* end */ -}; - -static struct hda_verb ad1986a_ch4_init[] = { - /* Surround out -> Surround */ - { 0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 }, - { 0x1c, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000}, - /* CLFE -> Mic in */ - { 0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 }, - { 0x1d, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080}, - { } /* end */ -}; - -static struct hda_verb ad1986a_ch6_init[] = { - /* Surround out -> Surround out */ - { 0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 }, - { 0x1c, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000}, - /* CLFE -> CLFE */ - { 0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 }, - { 0x1d, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000}, - { } /* end */ -}; - -static struct hda_channel_mode ad1986a_modes[3] = { - { 2, ad1986a_ch2_init }, - { 4, ad1986a_ch4_init }, - { 6, ad1986a_ch6_init }, -}; - -/* eapd initialization */ -static struct hda_verb ad1986a_eapd_init_verbs[] = { - {0x1b, AC_VERB_SET_EAPD_BTLENABLE, 0x00}, - {} -}; - -/* models */ -enum { AD1986A_6STACK, AD1986A_3STACK, AD1986A_LAPTOP, AD1986A_LAPTOP_EAPD }; - -static struct hda_board_config ad1986a_cfg_tbl[] = { - { .modelname = "6stack", .config = AD1986A_6STACK }, - { .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 */ - { .pci_subvendor = 0x17c0, .pci_subdevice = 0x2017, - .config = AD1986A_LAPTOP }, /* Samsung M50 */ - { .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, - .config = AD1986A_LAPTOP_EAPD }, /* ASUS M9 */ - { .pci_subvendor = 0x1043, .pci_subdevice = 0x1213, - .config = AD1986A_LAPTOP_EAPD }, /* ASUS A6J */ - { .pci_subvendor = 0x1043, .pci_subdevice = 0x11f7, - .config = AD1986A_LAPTOP_EAPD }, /* ASUS U5A */ - { .pci_subvendor = 0x1043, .pci_subdevice = 0x1297, - .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 */ - {} -}; static int patch_ad1986a(struct hda_codec *codec) { struct ad198x_spec *spec; - int board_config; spec = kzalloc(sizeof(*spec), GFP_KERNEL); if (spec == NULL) return -ENOMEM; - mutex_init(&spec->amp_mutex); + init_MUTEX(&spec->amp_mutex); codec->spec = spec; spec->multiout.max_channels = 6; @@ -836,7 +553,7 @@ static int patch_ad1986a(struct hda_codec *codec) spec->multiout.dig_out_nid = AD1986A_SPDIF_OUT; spec->num_adc_nids = 1; spec->adc_nids = ad1986a_adc_nids; - spec->capsrc_nids = ad1986a_capsrc_nids; + spec->capsrc_nids = ad1986a_adc_nids; spec->input_mux = &ad1986a_capture_source; spec->num_mixers = 1; spec->mixers[0] = ad1986a_mixers; @@ -845,39 +562,6 @@ static int patch_ad1986a(struct hda_codec *codec) codec->patch_ops = ad198x_patch_ops; - /* override some parameters */ - board_config = snd_hda_check_board_config(codec, ad1986a_cfg_tbl); - switch (board_config) { - case AD1986A_3STACK: - spec->num_mixers = 2; - spec->mixers[1] = ad1986a_3st_mixers; - spec->num_init_verbs = 3; - spec->init_verbs[1] = ad1986a_3st_init_verbs; - spec->init_verbs[2] = ad1986a_ch2_init; - spec->channel_mode = ad1986a_modes; - spec->num_channel_mode = ARRAY_SIZE(ad1986a_modes); - spec->need_dac_fix = 1; - spec->multiout.max_channels = 2; - spec->multiout.num_dacs = 1; - break; - case AD1986A_LAPTOP: - spec->mixers[0] = ad1986a_laptop_mixers; - spec->multiout.max_channels = 2; - spec->multiout.num_dacs = 1; - spec->multiout.dac_nids = ad1986a_laptop_dac_nids; - break; - case AD1986A_LAPTOP_EAPD: - spec->mixers[0] = ad1986a_laptop_eapd_mixers; - spec->num_init_verbs = 2; - spec->init_verbs[1] = ad1986a_eapd_init_verbs; - spec->multiout.max_channels = 2; - spec->multiout.num_dacs = 1; - spec->multiout.dac_nids = ad1986a_laptop_dac_nids; - spec->multiout.dig_out_nid = 0; - spec->input_mux = &ad1986a_laptop_eapd_capture_source; - break; - } - return 0; } @@ -891,7 +575,6 @@ static int patch_ad1986a(struct hda_codec *codec) static hda_nid_t ad1983_dac_nids[1] = { AD1983_DAC }; static hda_nid_t ad1983_adc_nids[1] = { AD1983_ADC }; -static hda_nid_t ad1983_capsrc_nids[1] = { 0x15 }; static struct hda_input_mux ad1983_capture_source = { .num_items = 4, @@ -969,7 +652,7 @@ static struct snd_kcontrol_new ad1983_mixers[] = { }, { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,NONE) "Source", + .name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,NONE) "Route", .info = ad1983_spdif_route_info, .get = ad1983_spdif_route_get, .put = ad1983_spdif_route_put, @@ -1025,7 +708,7 @@ static int patch_ad1983(struct hda_codec *codec) if (spec == NULL) return -ENOMEM; - mutex_init(&spec->amp_mutex); + init_MUTEX(&spec->amp_mutex); codec->spec = spec; spec->multiout.max_channels = 2; @@ -1034,7 +717,7 @@ static int patch_ad1983(struct hda_codec *codec) spec->multiout.dig_out_nid = AD1983_SPDIF_OUT; spec->num_adc_nids = 1; spec->adc_nids = ad1983_adc_nids; - spec->capsrc_nids = ad1983_capsrc_nids; + spec->capsrc_nids = ad1983_adc_nids; spec->input_mux = &ad1983_capture_source; spec->num_mixers = 1; spec->mixers[0] = ad1983_mixers; @@ -1058,7 +741,6 @@ static int patch_ad1983(struct hda_codec *codec) static hda_nid_t ad1981_dac_nids[1] = { AD1981_DAC }; static hda_nid_t ad1981_adc_nids[1] = { AD1981_ADC }; -static hda_nid_t ad1981_capsrc_nids[1] = { 0x15 }; /* 0x0c, 0x09, 0x0e, 0x0f, 0x19, 0x05, 0x18, 0x17 */ static struct hda_input_mux ad1981_capture_source = { @@ -1109,7 +791,7 @@ static struct snd_kcontrol_new ad1981_mixers[] = { /* identical with AD1983 */ { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,NONE) "Source", + .name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,NONE) "Route", .info = ad1983_spdif_route_info, .get = ad1983_spdif_route_get, .put = ad1983_spdif_route_put, @@ -1164,245 +846,15 @@ static struct hda_verb ad1981_init_verbs[] = { { } /* end */ }; -/* - * Patch for HP nx6320 - * - * nx6320 uses EAPD in the reserve way - EAPD-on means the internal - * speaker output enabled _and_ mute-LED off. - */ - -#define AD1981_HP_EVENT 0x37 -#define AD1981_MIC_EVENT 0x38 - -static struct hda_verb ad1981_hp_init_verbs[] = { - {0x05, AC_VERB_SET_EAPD_BTLENABLE, 0x00 }, /* default off */ - /* pin sensing on HP and Mic jacks */ - {0x06, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | AD1981_HP_EVENT}, - {0x08, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | AD1981_MIC_EVENT}, - {} -}; - -/* turn on/off EAPD (+ mute HP) as a master switch */ -static int ad1981_hp_master_sw_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct hda_codec *codec = snd_kcontrol_chip(kcontrol); - struct ad198x_spec *spec = codec->spec; - - if (! ad198x_eapd_put(kcontrol, ucontrol)) - return 0; - - /* toggle HP mute appropriately */ - snd_hda_codec_amp_update(codec, 0x06, 0, HDA_OUTPUT, 0, - 0x80, spec->cur_eapd ? 0 : 0x80); - snd_hda_codec_amp_update(codec, 0x06, 1, HDA_OUTPUT, 0, - 0x80, spec->cur_eapd ? 0 : 0x80); - return 1; -} - -/* bind volumes of both NID 0x05 and 0x06 */ -static int ad1981_hp_master_vol_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct hda_codec *codec = snd_kcontrol_chip(kcontrol); - long *valp = ucontrol->value.integer.value; - int change; - - change = snd_hda_codec_amp_update(codec, 0x05, 0, HDA_OUTPUT, 0, - 0x7f, valp[0] & 0x7f); - change |= snd_hda_codec_amp_update(codec, 0x05, 1, HDA_OUTPUT, 0, - 0x7f, valp[1] & 0x7f); - snd_hda_codec_amp_update(codec, 0x06, 0, HDA_OUTPUT, 0, - 0x7f, valp[0] & 0x7f); - snd_hda_codec_amp_update(codec, 0x06, 1, HDA_OUTPUT, 0, - 0x7f, valp[1] & 0x7f); - return change; -} - -/* mute internal speaker if HP is plugged */ -static void ad1981_hp_automute(struct hda_codec *codec) -{ - unsigned int present; - - present = snd_hda_codec_read(codec, 0x06, 0, - AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; - snd_hda_codec_amp_update(codec, 0x05, 0, HDA_OUTPUT, 0, - 0x80, present ? 0x80 : 0); - snd_hda_codec_amp_update(codec, 0x05, 1, HDA_OUTPUT, 0, - 0x80, present ? 0x80 : 0); -} - -/* toggle input of built-in and mic jack appropriately */ -static void ad1981_hp_automic(struct hda_codec *codec) -{ - static struct hda_verb mic_jack_on[] = { - {0x1f, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080}, - {0x1e, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000}, - {} - }; - static struct hda_verb mic_jack_off[] = { - {0x1e, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080}, - {0x1f, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000}, - {} - }; - unsigned int present; - - present = snd_hda_codec_read(codec, 0x08, 0, - AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; - if (present) - snd_hda_sequence_write(codec, mic_jack_on); - else - snd_hda_sequence_write(codec, mic_jack_off); -} - -/* unsolicited event for HP jack sensing */ -static void ad1981_hp_unsol_event(struct hda_codec *codec, - unsigned int res) -{ - res >>= 26; - switch (res) { - case AD1981_HP_EVENT: - ad1981_hp_automute(codec); - break; - case AD1981_MIC_EVENT: - ad1981_hp_automic(codec); - break; - } -} - -static struct hda_input_mux ad1981_hp_capture_source = { - .num_items = 3, - .items = { - { "Mic", 0x0 }, - { "Docking-Station", 0x1 }, - { "Mix", 0x2 }, - }, -}; - -static struct snd_kcontrol_new ad1981_hp_mixers[] = { - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "Master Playback Volume", - .info = snd_hda_mixer_amp_volume_info, - .get = snd_hda_mixer_amp_volume_get, - .put = ad1981_hp_master_vol_put, - .private_value = HDA_COMPOSE_AMP_VAL(0x05, 3, 0, HDA_OUTPUT), - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "Master Playback Switch", - .info = ad198x_eapd_info, - .get = ad198x_eapd_get, - .put = ad1981_hp_master_sw_put, - .private_value = 0x05, - }, - HDA_CODEC_VOLUME("PCM Playback Volume", 0x11, 0x0, HDA_OUTPUT), - HDA_CODEC_MUTE("PCM Playback Switch", 0x11, 0x0, HDA_OUTPUT), -#if 0 - /* FIXME: analog mic/line loopback doesn't work with my tests... - * (although recording is OK) - */ - HDA_CODEC_VOLUME("Mic Playback Volume", 0x12, 0x0, HDA_OUTPUT), - HDA_CODEC_MUTE("Mic Playback Switch", 0x12, 0x0, HDA_OUTPUT), - HDA_CODEC_VOLUME("Docking-Station Playback Volume", 0x13, 0x0, HDA_OUTPUT), - HDA_CODEC_MUTE("Docking-Station Playback Switch", 0x13, 0x0, HDA_OUTPUT), - HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x1c, 0x0, HDA_OUTPUT), - HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x1c, 0x0, HDA_OUTPUT), - /* FIXME: does this laptop have analog CD connection? */ - HDA_CODEC_VOLUME("CD Playback Volume", 0x1d, 0x0, HDA_OUTPUT), - HDA_CODEC_MUTE("CD Playback Switch", 0x1d, 0x0, HDA_OUTPUT), -#endif - HDA_CODEC_VOLUME("Mic Boost", 0x08, 0x0, HDA_INPUT), - HDA_CODEC_VOLUME("Internal Mic Boost", 0x18, 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, - }, - { } /* end */ -}; - -/* initialize jack-sensing, too */ -static int ad1981_hp_init(struct hda_codec *codec) -{ - ad198x_init(codec); - ad1981_hp_automute(codec); - ad1981_hp_automic(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, 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 }, - {} -}; - static int patch_ad1981(struct hda_codec *codec) { struct ad198x_spec *spec; - int board_config; spec = kzalloc(sizeof(*spec), GFP_KERNEL); if (spec == NULL) return -ENOMEM; - mutex_init(&spec->amp_mutex); + init_MUTEX(&spec->amp_mutex); codec->spec = spec; spec->multiout.max_channels = 2; @@ -1411,7 +863,7 @@ static int patch_ad1981(struct hda_codec *codec) spec->multiout.dig_out_nid = AD1981_SPDIF_OUT; spec->num_adc_nids = 1; spec->adc_nids = ad1981_adc_nids; - spec->capsrc_nids = ad1981_capsrc_nids; + spec->capsrc_nids = ad1981_adc_nids; spec->input_mux = &ad1981_capture_source; spec->num_mixers = 1; spec->mixers[0] = ad1981_mixers; @@ -1421,25 +873,6 @@ static int patch_ad1981(struct hda_codec *codec) codec->patch_ops = ad198x_patch_ops; - /* override some parameters */ - board_config = snd_hda_check_board_config(codec, ad1981_cfg_tbl); - switch (board_config) { - case AD1981_HP: - spec->mixers[0] = ad1981_hp_mixers; - spec->num_init_verbs = 2; - spec->init_verbs[1] = ad1981_hp_init_verbs; - spec->multiout.dig_out_nid = 0; - spec->input_mux = &ad1981_hp_capture_source; - - 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; } @@ -1626,12 +1059,48 @@ static int ad198x_ch_mode_put(struct snd_kcontrol *kcontrol, { struct hda_codec *codec = snd_kcontrol_chip(kcontrol); struct ad198x_spec *spec = codec->spec; - if (spec->need_dac_fix) - spec->multiout.num_dacs = spec->multiout.max_channels / 2; return snd_hda_ch_mode_put(codec, ucontrol, spec->channel_mode, spec->num_channel_mode, &spec->multiout.max_channels); } +/* + * EAPD control + */ +static int ad1988_eapd_info(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_info *uinfo) +{ + uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN; + uinfo->count = 1; + uinfo->value.integer.min = 0; + uinfo->value.integer.max = 1; + return 0; +} + +static int ad1988_eapd_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct hda_codec *codec = snd_kcontrol_chip(kcontrol); + struct ad198x_spec *spec = codec->spec; + ucontrol->value.enumerated.item[0] = ! spec->cur_eapd; + return 0; +} + +static int ad1988_eapd_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct hda_codec *codec = snd_kcontrol_chip(kcontrol); + struct ad198x_spec *spec = codec->spec; + unsigned int eapd; + eapd = ! ucontrol->value.enumerated.item[0]; + if (eapd == spec->cur_eapd && ! codec->in_resume) + return 0; + spec->cur_eapd = eapd; + snd_hda_codec_write(codec, 0x12 /* port-D */, + 0, AC_VERB_SET_EAPD_BTLENABLE, + eapd ? 0x02 : 0x00); + return 0; +} + /* 6-stack mode */ static struct snd_kcontrol_new ad1988_6stack_mixers1[] = { HDA_CODEC_VOLUME("Front Playback Volume", 0x04, 0x0, HDA_OUTPUT), @@ -1758,10 +1227,9 @@ static struct snd_kcontrol_new ad1988_laptop_mixers[] = { { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = "External Amplifier", - .info = ad198x_eapd_info, - .get = ad198x_eapd_get, - .put = ad198x_eapd_put, - .private_value = 0x12 | (1 << 8), /* port-D, inversed */ + .info = ad1988_eapd_info, + .get = ad1988_eapd_get, + .put = ad1988_eapd_put, }, { } /* end */ @@ -2334,11 +1802,14 @@ static int ad1988_auto_create_extra_out(struct hda_codec *codec, hda_nid_t pin, idx = ad1988_pin_idx(pin); nid = ad1988_idx_to_dac(codec, idx); - /* specify the DAC as the extra output */ - if (! spec->multiout.hp_nid) + if (! spec->multiout.dac_nids[0]) { + /* use this as the primary output */ + spec->multiout.dac_nids[0] = nid; + if (! spec->multiout.num_dacs) + spec->multiout.num_dacs = 1; + } else + /* specify the DAC as the extra output */ spec->multiout.hp_nid = nid; - else - spec->multiout.extra_out_nid[0] = nid; /* control HP volume/switch on the output mixer amp */ sprintf(name, "%s Playback Volume", pfx); if ((err = add_control(spec, AD_CTL_WIDGET_VOL, name, @@ -2457,7 +1928,7 @@ static void ad1988_auto_init_extra_out(struct hda_codec *codec) struct ad198x_spec *spec = codec->spec; hda_nid_t pin; - pin = spec->autocfg.speaker_pins[0]; + pin = spec->autocfg.speaker_pin; if (pin) /* connect to front */ ad1988_auto_set_output_and_unmute(codec, pin, PIN_OUT, 0); pin = spec->autocfg.hp_pin; @@ -2506,13 +1977,13 @@ static int ad1988_parse_auto_config(struct hda_codec *codec) return err; if ((err = ad1988_auto_fill_dac_nids(codec, &spec->autocfg)) < 0) return err; - if (! spec->autocfg.line_outs) + if (! spec->autocfg.line_outs && ! spec->autocfg.speaker_pin && + ! spec->autocfg.hp_pin) return 0; /* can't find valid BIOS pin config */ if ((err = ad1988_auto_create_multi_out_ctls(spec, &spec->autocfg)) < 0 || - (err = ad1988_auto_create_extra_out(codec, - spec->autocfg.speaker_pins[0], + (err = ad1988_auto_create_extra_out(codec, spec->autocfg.speaker_pin, "Speaker")) < 0 || - (err = ad1988_auto_create_extra_out(codec, spec->autocfg.hp_pin, + (err = ad1988_auto_create_extra_out(codec, spec->autocfg.speaker_pin, "Headphone")) < 0 || (err = ad1988_auto_create_analog_input_ctls(spec, &spec->autocfg)) < 0) return err; @@ -2568,7 +2039,7 @@ static int patch_ad1988(struct hda_codec *codec) if (spec == NULL) return -ENOMEM; - mutex_init(&spec->amp_mutex); + init_MUTEX(&spec->amp_mutex); codec->spec = spec; if (is_rev2(codec)) @@ -2687,6 +2158,5 @@ struct hda_codec_preset snd_hda_preset_analog[] = { { .id = 0x11d41983, .name = "AD1983", .patch = patch_ad1983 }, { .id = 0x11d41986, .name = "AD1986A", .patch = patch_ad1986a }, { .id = 0x11d41988, .name = "AD1988", .patch = patch_ad1988 }, - { .id = 0x11d4198b, .name = "AD1988B", .patch = patch_ad1988 }, {} /* terminator */ }; diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 18d105263..bc1932ee6 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c @@ -6,7 +6,6 @@ * Copyright (c) 2004 Kailang Yang * PeiSen Hou * Takashi Iwai - * Jonathan Woithe * * This driver is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -51,8 +50,6 @@ enum { ALC880_UNIWILL_DIG, ALC880_CLEVO, ALC880_TCL_S700, - ALC880_LG, - ALC880_LG_LW, #ifdef CONFIG_SND_DEBUG ALC880_TEST, #endif @@ -66,10 +63,6 @@ enum { ALC260_HP, ALC260_HP_3013, ALC260_FUJITSU_S702X, - ALC260_ACER, -#ifdef CONFIG_SND_DEBUG - ALC260_TEST, -#endif ALC260_AUTO, ALC260_MODEL_LAST /* last tag */ }; @@ -77,8 +70,6 @@ enum { /* ALC262 models */ enum { ALC262_BASIC, - ALC262_FUJITSU, - ALC262_HP_BPC, ALC262_AUTO, ALC262_MODEL_LAST /* last tag */ }; @@ -86,7 +77,6 @@ enum { /* ALC861 models */ enum { ALC861_3ST, - ALC660_3ST, ALC861_3ST_DIG, ALC861_6ST_DIG, ALC861_AUTO, @@ -101,17 +91,6 @@ 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 @@ -121,8 +100,7 @@ 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; @@ -146,7 +124,6 @@ struct alc_spec { hda_nid_t dig_in_nid; /* digital-in NID; optional */ /* capture source */ - unsigned int num_mux_defs; const struct hda_input_mux *input_mux; unsigned int cur_mux[3]; @@ -155,7 +132,7 @@ struct alc_spec { int num_channel_mode; /* PCM information */ - struct hda_pcm pcm_rec[3]; /* used in alc_build_pcms() */ + struct hda_pcm pcm_rec[2]; /* used in alc_build_pcms() */ /* dynamic controls, init_verbs and input_mux */ struct auto_pin_cfg autocfg; @@ -163,23 +140,13 @@ struct alc_spec { struct snd_kcontrol_new *kctl_alloc; struct hda_input_mux private_imux; hda_nid_t private_dac_nids[5]; - - /* hooks */ - void (*init_hook)(struct hda_codec *codec); - void (*unsol_event)(struct hda_codec *codec, unsigned int res); - - /* for pin sensing */ - unsigned int sense_updated: 1; - unsigned int jack_present: 1; }; /* * 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; @@ -190,29 +157,21 @@ struct alc_config_preset { hda_nid_t dig_in_nid; unsigned int num_channel_mode; const struct hda_channel_mode *channel_mode; - unsigned int num_mux_defs; const struct hda_input_mux *input_mux; - void (*unsol_event)(struct hda_codec *, unsigned int); - void (*init_hook)(struct hda_codec *); }; /* * 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; - unsigned int mux_idx = snd_ctl_get_ioffidx(kcontrol, &uinfo->id); - if (mux_idx >= spec->num_mux_defs) - mux_idx = 0; - return snd_hda_input_mux_info(&spec->input_mux[mux_idx], uinfo); + return snd_hda_input_mux_info(spec->input_mux, 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; @@ -222,24 +181,20 @@ static int alc_mux_enum_get(struct snd_kcontrol *kcontrol, 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]); + return snd_hda_input_mux_put(codec, spec->input_mux, ucontrol, + 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; @@ -247,300 +202,84 @@ static int alc_ch_mode_info(struct snd_kcontrol *kcontrol, 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); -} - -/* - * Control the mode of pin widget settings via the mixer. "pc" is used - * instead of "%" to avoid consequences of accidently treating the % as - * being part of a format specifier. Maximum allowed length of a value is - * 63 characters plus NULL terminator. - * - * Note: some retasking pin complexes seem to ignore requests for input - * states other than HiZ (eg: PIN_VREFxx) and revert to HiZ if any of these - * are requested. Therefore order this list so that this behaviour will not - * cause problems when mixer clients move through the enum sequentially. - * NIDs 0x0f and 0x10 have been observed to have this behaviour as of - * March 2006. - */ -static char *alc_pin_mode_names[] = { - "Mic 50pc bias", "Mic 80pc bias", - "Line in", "Line out", "Headphone out", -}; -static unsigned char alc_pin_mode_values[] = { - PIN_VREF50, PIN_VREF80, PIN_IN, PIN_OUT, PIN_HP, -}; -/* The control can present all 5 options, or it can limit the options based - * in the pin being assumed to be exclusively an input or an output pin. In - * addition, "input" pins may or may not process the mic bias option - * depending on actual widget capability (NIDs 0x0f and 0x10 don't seem to - * accept requests for bias as of chip versions up to March 2006) and/or - * wiring in the computer. - */ -#define ALC_PIN_DIR_IN 0x00 -#define ALC_PIN_DIR_OUT 0x01 -#define ALC_PIN_DIR_INOUT 0x02 -#define ALC_PIN_DIR_IN_NOMICBIAS 0x03 -#define ALC_PIN_DIR_INOUT_NOMICBIAS 0x04 - -/* Info about the pin modes supported by the different pin direction modes. - * For each direction the minimum and maximum values are given. - */ -static signed char alc_pin_mode_dir_info[5][2] = { - { 0, 2 }, /* ALC_PIN_DIR_IN */ - { 3, 4 }, /* ALC_PIN_DIR_OUT */ - { 0, 4 }, /* ALC_PIN_DIR_INOUT */ - { 2, 2 }, /* ALC_PIN_DIR_IN_NOMICBIAS */ - { 2, 4 }, /* ALC_PIN_DIR_INOUT_NOMICBIAS */ -}; -#define alc_pin_mode_min(_dir) (alc_pin_mode_dir_info[_dir][0]) -#define alc_pin_mode_max(_dir) (alc_pin_mode_dir_info[_dir][1]) -#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) -{ - unsigned int item_num = uinfo->value.enumerated.item; - unsigned char dir = (kcontrol->private_value >> 16) & 0xff; - - uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; - uinfo->count = 1; - uinfo->value.enumerated.items = alc_pin_mode_n_items(dir); - - if (item_numalc_pin_mode_max(dir)) - item_num = alc_pin_mode_min(dir); - strcpy(uinfo->value.enumerated.name, alc_pin_mode_names[item_num]); - return 0; -} - -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); - - /* 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)) - i++; - *valp = i <= alc_pin_mode_max(dir) ? i: alc_pin_mode_min(dir); - return 0; + spec->num_channel_mode, &spec->multiout.max_channels); } -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); - - 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]); - - /* Also enable the retasking pin's input/output as required - * for the requested pin mode. Enum values of 2 or less are - * input modes. - * - * Dynamically switching the input/output buffers probably - * reduces noise slightly (particularly on input) so we'll - * do it. However, having both input and output buffers - * enabled simultaneously doesn't seem to be problematic if - * 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)); - } 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); - } - } - return change; -} -#define ALC_PIN_MODE(xname, nid, dir) \ - { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0, \ - .info = alc_pin_mode_info, \ - .get = alc_pin_mode_get, \ - .put = alc_pin_mode_put, \ - .private_value = nid | (dir<<16) } - -/* A switch control for ALC260 GPIO pins. Multiple GPIOs can be ganged - * together using a mask with more than one bit set. This control is - * currently used only by the ALC260 test model. At this stage they are not - * needed for any "production" models. +/* + * Control of pin widget settings via the mixer. Only boolean settings are + * supported, so VrefEn can't be controlled using these functions as they + * stand. */ -#ifdef CONFIG_SND_DEBUG -static int alc_gpio_data_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) +static int alc_pinctl_switch_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo) { uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN; uinfo->count = 1; uinfo->value.integer.min = 0; uinfo->value.integer.max = 1; return 0; -} -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); - - *valp = (val & mask) != 0; - return 0; } -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); - - /* Set/unset the masked GPIO bit(s) as needed */ - 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); - return change; -} -#define ALC_GPIO_DATA_SWITCH(xname, nid, mask) \ - { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0, \ - .info = alc_gpio_data_info, \ - .get = alc_gpio_data_get, \ - .put = alc_gpio_data_put, \ - .private_value = nid | (mask<<16) } -#endif /* CONFIG_SND_DEBUG */ - -/* A switch control to allow the enabling of the digital IO pins on the - * ALC260. This is incredibly simplistic; the intention of this control is - * to provide something in the test model allowing digital outputs to be - * identified if present. If models are found which can utilise these - * outputs a more complete mixer control can be devised for those models if - * necessary. - */ -#ifdef CONFIG_SND_DEBUG -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; - uinfo->value.integer.min = 0; - 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_pinctl_switch_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 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); - *valp = (val & mask) != 0; + *valp = 0; + if (snd_hda_codec_read(codec,nid,0,AC_VERB_GET_PIN_WIDGET_CONTROL,0x00) & mask) + *valp = 1; return 0; } -static int alc_spdif_ctrl_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) + +static int alc_pinctl_switch_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); - - /* Set/unset the masked control bit(s) as needed */ - 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); + long mask = (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); + int change = ((pinctl & mask)!=0) != *valp; + if (change) + snd_hda_codec_write(codec,nid,0,AC_VERB_SET_PIN_WIDGET_CONTROL, + *valp?(pinctl|mask):(pinctl&~mask)); return change; } -#define ALC_SPDIF_CTRL_SWITCH(xname, nid, mask) \ + +#define ALC_PINCTL_SWITCH(xname, nid, mask) \ { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0, \ - .info = alc_spdif_ctrl_info, \ - .get = alc_spdif_ctrl_get, \ - .put = alc_spdif_ctrl_put, \ - .private_value = nid | (mask<<16) } -#endif /* CONFIG_SND_DEBUG */ + .info = alc_pinctl_switch_info, \ + .get = alc_pinctl_switch_get, \ + .put = alc_pinctl_switch_put, \ + .private_value = (nid) | (mask<<16) } + /* * 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; @@ -552,25 +291,19 @@ static void setup_preset(struct alc_spec *spec, spec->multiout.dig_out_nid = preset->dig_out_nid; spec->multiout.hp_nid = preset->hp_nid; - spec->num_mux_defs = preset->num_mux_defs; - if (! spec->num_mux_defs) - spec->num_mux_defs = 1; spec->input_mux = preset->input_mux; spec->num_adc_nids = preset->num_adc_nids; spec->adc_nids = preset->adc_nids; spec->dig_in_nid = preset->dig_in_nid; - - spec->unsol_event = preset->unsol_event; - spec->init_hook = preset->init_hook; } /* * 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] = { @@ -714,8 +447,7 @@ 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 */ @@ -753,8 +485,7 @@ 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 */ @@ -865,8 +596,7 @@ 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] = { @@ -1021,8 +751,7 @@ 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; } @@ -1055,8 +784,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)}, @@ -1210,8 +939,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 */ @@ -1369,217 +1098,6 @@ static struct hda_verb alc880_pin_tcl_S700_init_verbs[] = { }; /* - * LG m1 express dual - * - * Pin assignment: - * Rear Line-In/Out (blue): 0x14 - * Build-in Mic-In: 0x15 - * Speaker-out: 0x17 - * HP-Out (green): 0x1b - * Mic-In/Out (red): 0x19 - * SPDIF-Out: 0x1e - */ - -/* To make 5.1 output working (green=Front, blue=Surr, red=CLFE) */ -static hda_nid_t alc880_lg_dac_nids[3] = { - 0x05, 0x02, 0x03 -}; - -/* seems analog CD is not working */ -static struct hda_input_mux alc880_lg_capture_source = { - .num_items = 3, - .items = { - { "Mic", 0x1 }, - { "Line", 0x5 }, - { "Internal Mic", 0x6 }, - }, -}; - -/* 2,4,6 channel modes */ -static struct hda_verb alc880_lg_ch2_init[] = { - /* set line-in and mic-in to input */ - { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN }, - { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, - { } -}; - -static struct hda_verb alc880_lg_ch4_init[] = { - /* set line-in to out and mic-in to input */ - { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP }, - { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, - { } -}; - -static struct hda_verb alc880_lg_ch6_init[] = { - /* set line-in and mic-in to output */ - { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP }, - { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP }, - { } -}; - -static struct hda_channel_mode alc880_lg_ch_modes[3] = { - { 2, alc880_lg_ch2_init }, - { 4, alc880_lg_ch4_init }, - { 6, alc880_lg_ch6_init }, -}; - -static struct snd_kcontrol_new alc880_lg_mixer[] = { - /* FIXME: it's not really "master" but front channels */ - HDA_CODEC_VOLUME("Master Playback Volume", 0x0f, 0x0, HDA_OUTPUT), - HDA_BIND_MUTE("Master Playback Switch", 0x0f, 2, HDA_INPUT), - HDA_CODEC_VOLUME("Surround Playback Volume", 0x0c, 0x0, HDA_OUTPUT), - HDA_BIND_MUTE("Surround Playback Switch", 0x0c, 2, HDA_INPUT), - HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0d, 1, 0x0, HDA_OUTPUT), - HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0d, 2, 0x0, HDA_OUTPUT), - HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0d, 1, 2, HDA_INPUT), - HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0d, 2, 2, HDA_INPUT), - HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), - HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), - HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x06, HDA_INPUT), - HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x06, HDA_INPUT), - HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x07, HDA_INPUT), - HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x07, HDA_INPUT), - { - .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 alc880_lg_init_verbs[] = { - /* set capture source to mic-in */ - {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, - {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, - {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, - /* mute all amp mixer inputs */ - {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(5)}, - {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(6)}, - {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(7)}, - /* line-in to input */ - {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, - {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, - /* built-in mic */ - {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, - {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, - /* speaker-out */ - {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, - {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, - /* mic-in to input */ - {0x11, AC_VERB_SET_CONNECT_SEL, 0x01}, - {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, - {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, - /* HP-out */ - {0x13, AC_VERB_SET_CONNECT_SEL, 0x03}, - {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, - {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, - /* jack sense */ - {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | 0x1}, - { } -}; - -/* toggle speaker-output according to the hp-jack state */ -static void alc880_lg_automute(struct hda_codec *codec) -{ - unsigned int present; - - present = snd_hda_codec_read(codec, 0x1b, 0, - AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; - snd_hda_codec_amp_update(codec, 0x17, 0, HDA_OUTPUT, 0, - 0x80, present ? 0x80 : 0); - snd_hda_codec_amp_update(codec, 0x17, 1, HDA_OUTPUT, 0, - 0x80, present ? 0x80 : 0); -} - -static void alc880_lg_unsol_event(struct hda_codec *codec, unsigned int res) -{ - /* Looks like the unsol event is incompatible with the standard - * definition. 4bit tag is placed at 28 bit! - */ - if ((res >> 28) == 0x01) - alc880_lg_automute(codec); -} - -/* - * LG LW20 - * - * Pin assignment: - * Speaker-out: 0x14 - * Mic-In: 0x18 - * Built-in Mic-In: 0x19 (?) - * HP-Out: 0x1b - * SPDIF-Out: 0x1e - */ - -/* seems analog CD is not working */ -static struct hda_input_mux alc880_lg_lw_capture_source = { - .num_items = 2, - .items = { - { "Mic", 0x0 }, - { "Internal Mic", 0x1 }, - }, -}; - -static struct snd_kcontrol_new alc880_lg_lw_mixer[] = { - HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT), - HDA_BIND_MUTE("Master Playback Switch", 0x0c, 2, 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("Internal Mic Playback Volume", 0x0b, 0x01, HDA_INPUT), - HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x01, HDA_INPUT), - { } /* end */ -}; - -static struct hda_verb alc880_lg_lw_init_verbs[] = { - /* set capture source to mic-in */ - {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, - {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, - {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, - {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(7)}, - /* speaker-out */ - {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, - {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, - /* HP-out */ - {0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, - {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, - {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, - /* mic-in to input */ - {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, - {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, - /* built-in mic */ - {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, - {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, - /* jack sense */ - {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | 0x1}, - { } -}; - -/* toggle speaker-output according to the hp-jack state */ -static void alc880_lg_lw_automute(struct hda_codec *codec) -{ - unsigned int present; - - present = snd_hda_codec_read(codec, 0x1b, 0, - AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; - snd_hda_codec_amp_update(codec, 0x14, 0, HDA_OUTPUT, 0, - 0x80, present ? 0x80 : 0); - snd_hda_codec_amp_update(codec, 0x14, 1, HDA_OUTPUT, 0, - 0x80, present ? 0x80 : 0); -} - -static void alc880_lg_lw_unsol_event(struct hda_codec *codec, unsigned int res) -{ - /* Looks like the unsol event is incompatible with the standard - * definition. 4bit tag is placed at 28 bit! - */ - if ((res >> 28) == 0x01) - alc880_lg_lw_automute(codec); -} - -/* - * Common callbacks */ static int alc_init(struct hda_codec *codec) @@ -1589,21 +1107,9 @@ static int alc_init(struct hda_codec *codec) for (i = 0; i < spec->num_init_verbs; i++) snd_hda_sequence_write(codec, spec->init_verbs[i]); - - if (spec->init_hook) - spec->init_hook(codec); - return 0; } -static void alc_unsol_event(struct hda_codec *codec, unsigned int res) -{ - struct alc_spec *spec = codec->spec; - - if (spec->unsol_event) - spec->unsol_event(codec, res); -} - #ifdef CONFIG_PM /* * resume @@ -1643,8 +1149,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, @@ -1696,8 +1202,7 @@ 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; } @@ -1745,13 +1250,6 @@ static struct hda_pcm_stream alc880_pcm_digital_capture = { /* NID is set in alc_build_pcms */ }; -/* Used by alc_build_pcms to flag that a PCM has no playback stream */ -static struct hda_pcm_stream alc_pcm_null_playback = { - .substreams = 0, - .channels_min = 0, - .channels_max = 0, -}; - static int alc_build_pcms(struct hda_codec *codec) { struct alc_spec *spec = codec->spec; @@ -1782,23 +1280,6 @@ static int alc_build_pcms(struct hda_codec *codec) } } - /* If the use of more than one ADC is requested for the current - * model, configure a second analog capture-only PCM. - */ - if (spec->num_adc_nids > 1) { - codec->num_pcms++; - info++; - info->name = spec->stream_name_analog; - /* No playback stream for second PCM */ - info->stream[SNDRV_PCM_STREAM_PLAYBACK] = alc_pcm_null_playback; - info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = 0; - if (spec->stream_analog_capture) { - snd_assert(spec->adc_nids, return -EINVAL); - info->stream[SNDRV_PCM_STREAM_CAPTURE] = *(spec->stream_analog_capture); - info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->adc_nids[1]; - } - } - if (spec->multiout.dig_out_nid || spec->dig_in_nid) { codec->num_pcms++; info++; @@ -1841,7 +1322,6 @@ static struct hda_codec_ops alc_patch_ops = { .build_pcms = alc_build_pcms, .init = alc_init, .free = alc_free, - .unsol_event = alc_unsol_event, #ifdef CONFIG_PM .resume = alc_resume, #endif @@ -1860,15 +1340,13 @@ static hda_nid_t alc880_test_dac_nids[4] = { }; static struct hda_input_mux alc880_test_capture_source = { - .num_items = 7, + .num_items = 5, .items = { { "In-1", 0x0 }, { "In-2", 0x1 }, { "In-3", 0x2 }, { "In-4", 0x3 }, { "CD", 0x4 }, - { "Front", 0x5 }, - { "Surround", 0x6 }, }, }; @@ -1879,8 +1357,7 @@ 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", @@ -1895,8 +1372,7 @@ static int alc_test_pin_ctl_info(struct snd_kcontrol *kcontrol, 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; @@ -1922,8 +1398,7 @@ static int alc_test_pin_ctl_get(struct snd_kcontrol *kcontrol, 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; @@ -1941,18 +1416,15 @@ static int alc_test_pin_ctl_put(struct snd_kcontrol *kcontrol, 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" @@ -1966,8 +1438,7 @@ static int alc_test_pin_src_info(struct snd_kcontrol *kcontrol, 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; @@ -1978,8 +1449,7 @@ static int alc_test_pin_src_get(struct snd_kcontrol *kcontrol, 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; @@ -2183,8 +1653,6 @@ static struct hda_board_config alc880_cfg_tbl[] = { { .pci_subvendor = 0x8086, .pci_subdevice = 0xa100, .config = ALC880_5ST_DIG }, { .pci_subvendor = 0x1565, .pci_subdevice = 0x8202, .config = ALC880_5ST_DIG }, { .pci_subvendor = 0x1019, .pci_subdevice = 0xa880, .config = ALC880_5ST_DIG }, - { .pci_subvendor = 0xa0a0, .pci_subdevice = 0x0560, - .config = ALC880_5ST_DIG }, /* Aopen i915GMm-HFS */ /* { .pci_subvendor = 0x1019, .pci_subdevice = 0xa884, .config = ALC880_5ST_DIG }, */ /* conflict with 6stack */ { .pci_subvendor = 0x1695, .pci_subdevice = 0x400d, .config = ALC880_5ST_DIG }, /* note subvendor = 0 below */ @@ -2212,8 +1680,6 @@ static struct hda_board_config alc880_cfg_tbl[] = { { .pci_subvendor = 0x1025, .pci_subdevice = 0x0078, .config = ALC880_6ST_DIG }, { .pci_subvendor = 0x1025, .pci_subdevice = 0x0087, .config = ALC880_6ST_DIG }, { .pci_subvendor = 0x1297, .pci_subdevice = 0xc790, .config = ALC880_6ST_DIG }, /* Shuttle ST20G5 */ - { .pci_subvendor = 0x1509, .pci_subdevice = 0x925d, .config = ALC880_6ST_DIG }, /* FIC P4M-915GD1 */ - { .pci_subvendor = 0x1695, .pci_subdevice = 0x4012, .config = ALC880_5ST_DIG }, /* Epox EP-5LDA+ GLi */ { .modelname = "asus", .config = ALC880_ASUS }, { .pci_subvendor = 0x1043, .pci_subdevice = 0x1964, .config = ALC880_ASUS_DIG }, @@ -2227,7 +1693,6 @@ static struct hda_board_config alc880_cfg_tbl[] = { { .pci_subvendor = 0x1043, .pci_subdevice = 0x1123, .config = ALC880_ASUS_DIG }, { .pci_subvendor = 0x1043, .pci_subdevice = 0x1143, .config = ALC880_ASUS }, { .pci_subvendor = 0x1043, .pci_subdevice = 0x10b3, .config = ALC880_ASUS_W1V }, - { .pci_subvendor = 0x1043, .pci_subdevice = 0x8181, .config = ALC880_ASUS_DIG }, /* ASUS P4GPL-X */ { .pci_subvendor = 0x1558, .pci_subdevice = 0x5401, .config = ALC880_ASUS_DIG2 }, { .modelname = "uniwill", .config = ALC880_UNIWILL_DIG }, @@ -2237,13 +1702,6 @@ static struct hda_board_config alc880_cfg_tbl[] = { { .pci_subvendor = 0x1734, .pci_subdevice = 0x107c, .config = ALC880_F1734 }, { .pci_subvendor = 0x1584, .pci_subdevice = 0x9054, .config = ALC880_F1734 }, - { .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 }, - #ifdef CONFIG_SND_DEBUG { .modelname = "test", .config = ALC880_TEST }, #endif @@ -2421,32 +1879,6 @@ static struct alc_config_preset alc880_presets[] = { .channel_mode = alc880_threestack_modes, .input_mux = &alc880_capture_source, }, - [ALC880_LG] = { - .mixers = { alc880_lg_mixer }, - .init_verbs = { alc880_volume_init_verbs, - alc880_lg_init_verbs }, - .num_dacs = ARRAY_SIZE(alc880_lg_dac_nids), - .dac_nids = alc880_lg_dac_nids, - .dig_out_nid = ALC880_DIGOUT_NID, - .num_channel_mode = ARRAY_SIZE(alc880_lg_ch_modes), - .channel_mode = alc880_lg_ch_modes, - .input_mux = &alc880_lg_capture_source, - .unsol_event = alc880_lg_unsol_event, - .init_hook = alc880_lg_automute, - }, - [ALC880_LG_LW] = { - .mixers = { alc880_lg_lw_mixer }, - .init_verbs = { alc880_volume_init_verbs, - alc880_lg_lw_init_verbs }, - .num_dacs = 1, - .dac_nids = alc880_dac_nids, - .dig_out_nid = ALC880_DIGOUT_NID, - .num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes), - .channel_mode = alc880_2_jack_modes, - .input_mux = &alc880_lg_lw_capture_source, - .unsol_event = alc880_lg_lw_unsol_event, - .init_hook = alc880_lg_lw_automute, - }, #ifdef CONFIG_SND_DEBUG [ALC880_TEST] = { .mixers = { alc880_test_mixer }, @@ -2611,11 +2043,14 @@ static int alc880_auto_create_extra_out(struct alc_spec *spec, hda_nid_t pin, if (alc880_is_fixed_pin(pin)) { nid = alc880_idx_to_dac(alc880_fixed_pin_idx(pin)); - /* specify the DAC as the extra output */ - if (! spec->multiout.hp_nid) + if (! spec->multiout.dac_nids[0]) { + /* use this as the primary output */ + spec->multiout.dac_nids[0] = nid; + if (! spec->multiout.num_dacs) + spec->multiout.num_dacs = 1; + } else + /* specify the DAC as the extra output */ spec->multiout.hp_nid = nid; - else - spec->multiout.extra_out_nid[0] = nid; /* control HP volume/switch on the output mixer amp */ nid = alc880_idx_to_mixer(alc880_fixed_pin_idx(pin)); sprintf(name, "%s Playback Volume", pfx); @@ -2628,6 +2063,12 @@ static int alc880_auto_create_extra_out(struct alc_spec *spec, hda_nid_t pin, return err; } else if (alc880_is_multi_pin(pin)) { /* set manual connection */ + if (! spec->multiout.dac_nids[0]) { + /* use this as the primary output */ + spec->multiout.dac_nids[0] = alc880_idx_to_dac(alc880_multi_pin_idx(pin)); + if (! spec->multiout.num_dacs) + spec->multiout.num_dacs = 1; + } /* we have only a switch on HP-out PIN */ sprintf(name, "%s Playback Switch", pfx); if ((err = add_control(spec, ALC_CTL_WIDGET_MUTE, name, @@ -2711,7 +2152,7 @@ static void alc880_auto_init_extra_out(struct hda_codec *codec) struct alc_spec *spec = codec->spec; hda_nid_t pin; - pin = spec->autocfg.speaker_pins[0]; + pin = spec->autocfg.speaker_pin; if (pin) /* connect to front */ alc880_auto_set_output_and_unmute(codec, pin, PIN_OUT, 0); pin = spec->autocfg.hp_pin; @@ -2747,15 +2188,15 @@ static int alc880_parse_auto_config(struct hda_codec *codec) if ((err = snd_hda_parse_pin_def_config(codec, &spec->autocfg, alc880_ignore)) < 0) return err; - if (! spec->autocfg.line_outs) + if (! spec->autocfg.line_outs && ! spec->autocfg.speaker_pin && + ! spec->autocfg.hp_pin) return 0; /* can't find valid BIOS pin config */ if ((err = alc880_auto_fill_dac_nids(spec, &spec->autocfg)) < 0 || (err = alc880_auto_create_multi_out_ctls(spec, &spec->autocfg)) < 0 || - (err = alc880_auto_create_extra_out(spec, - spec->autocfg.speaker_pins[0], + (err = alc880_auto_create_extra_out(spec, spec->autocfg.speaker_pin, "Speaker")) < 0 || - (err = alc880_auto_create_extra_out(spec, spec->autocfg.hp_pin, + (err = alc880_auto_create_extra_out(spec, spec->autocfg.speaker_pin, "Headphone")) < 0 || (err = alc880_auto_create_analog_input_ctls(spec, &spec->autocfg)) < 0) return err; @@ -2772,18 +2213,19 @@ static int alc880_parse_auto_config(struct hda_codec *codec) spec->init_verbs[spec->num_init_verbs++] = alc880_volume_init_verbs; - spec->num_mux_defs = 1; spec->input_mux = &spec->private_imux; return 1; } -/* additional initialization for auto-configuration model */ -static void alc880_auto_init(struct hda_codec *codec) +/* init callback for auto-configuration model -- overriding the default init */ +static int alc880_auto_init(struct hda_codec *codec) { + alc_init(codec); alc880_auto_init_multi_out(codec); alc880_auto_init_extra_out(codec); alc880_auto_init_analog_input(codec); + return 0; } /* @@ -2804,8 +2246,7 @@ 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; } @@ -2816,9 +2257,7 @@ 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; } } @@ -2853,7 +2292,7 @@ static int patch_alc880(struct hda_codec *codec) codec->patch_ops = alc_patch_ops; if (board_config == ALC880_AUTO) - spec->init_hook = alc880_auto_init; + codec->patch_ops.init = alc880_auto_init; return 0; } @@ -2883,14 +2322,6 @@ static hda_nid_t alc260_hp_adc_nids[2] = { 0x05, 0x04 }; -/* NIDs used when simultaneous access to both ADCs makes sense. Note that - * alc260_capture_mixer assumes ADC0 (nid 0x04) is the first ADC. - */ -static hda_nid_t alc260_dual_adc_nids[2] = { - /* ADC0, ADC1 */ - 0x04, 0x05 -}; - #define ALC260_DIGOUT_NID 0x03 #define ALC260_DIGIN_NID 0x06 @@ -2904,57 +2335,17 @@ static struct hda_input_mux alc260_capture_source = { }, }; -/* On Fujitsu S702x laptops capture only makes sense from Mic/LineIn jack, - * headphone jack and the internal CD lines since these are the only pins at - * which audio can appear. For flexibility, also allow the option of - * recording the mixer output on the second ADC (ADC0 doesn't have a - * connection to the mixer output). +/* On Fujitsu S702x laptops capture only makes sense from Mic/LineIn jack + * and the internal CD lines. */ -static struct hda_input_mux alc260_fujitsu_capture_sources[2] = { - { - .num_items = 3, - .items = { - { "Mic/Line", 0x0 }, - { "CD", 0x4 }, - { "Headphone", 0x2 }, - }, - }, - { - .num_items = 4, - .items = { - { "Mic/Line", 0x0 }, - { "CD", 0x4 }, - { "Headphone", 0x2 }, - { "Mixer", 0x5 }, - }, +static struct hda_input_mux alc260_fujitsu_capture_source = { + .num_items = 2, + .items = { + { "Mic/Line", 0x0 }, + { "CD", 0x4 }, }, - }; -/* Acer TravelMate(/Extensa/Aspire) notebooks have similar configuration to - * the Fujitsu S702x, but jacks are marked differently. - */ -static struct hda_input_mux alc260_acer_capture_sources[2] = { - { - .num_items = 4, - .items = { - { "Mic", 0x0 }, - { "Line", 0x2 }, - { "CD", 0x4 }, - { "Headphone", 0x5 }, - }, - }, - { - .num_items = 5, - .items = { - { "Mic", 0x0 }, - { "Line", 0x2 }, - { "CD", 0x4 }, - { "Headphone", 0x6 }, - { "Mixer", 0x5 }, - }, - }, -}; /* * This is just place-holder, so there's something for alc_build_pcms to look * at when it calculates the maximum number of channels. ALC260 has no mixer @@ -2972,7 +2363,6 @@ static struct hda_channel_mode alc260_modes[1] = { * HP: base_output + input + capture_alt * HP_3013: hp_3013 + input + capture * fujitsu: fujitsu + capture - * acer: acer + capture */ static struct snd_kcontrol_new alc260_base_output_mixer[] = { @@ -3015,18 +2405,14 @@ static struct snd_kcontrol_new alc260_hp_3013_mixer[] = { { } /* end */ }; -/* Fujitsu S702x series laptops. ALC260 pin usage: Mic/Line jack = 0x12, - * HP jack = 0x14, CD audio = 0x16, internal speaker = 0x10. - */ static struct snd_kcontrol_new alc260_fujitsu_mixer[] = { HDA_CODEC_VOLUME("Headphone Playback Volume", 0x08, 0x0, HDA_OUTPUT), HDA_BIND_MUTE("Headphone Playback Switch", 0x08, 2, HDA_INPUT), - ALC_PIN_MODE("Headphone Jack Mode", 0x14, ALC_PIN_DIR_INOUT), + ALC_PINCTL_SWITCH("Headphone Amp Switch", 0x14, PIN_HP_AMP), HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT), HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT), HDA_CODEC_VOLUME("Mic/Line Playback Volume", 0x07, 0x0, HDA_INPUT), HDA_CODEC_MUTE("Mic/Line Playback Switch", 0x07, 0x0, HDA_INPUT), - ALC_PIN_MODE("Mic/Line Jack Mode", 0x12, ALC_PIN_DIR_IN), HDA_CODEC_VOLUME("Beep Playback Volume", 0x07, 0x05, HDA_INPUT), HDA_CODEC_MUTE("Beep Playback Switch", 0x07, 0x05, HDA_INPUT), HDA_CODEC_VOLUME("Internal Speaker Playback Volume", 0x09, 0x0, HDA_OUTPUT), @@ -3034,41 +2420,6 @@ static struct snd_kcontrol_new alc260_fujitsu_mixer[] = { { } /* end */ }; -/* Mixer for Acer TravelMate(/Extensa/Aspire) notebooks. Note that current - * versions of the ALC260 don't act on requests to enable mic bias from NID - * 0x0f (used to drive the headphone jack in these laptops). The ALC260 - * datasheet doesn't mention this restriction. At this stage it's not clear - * whether this behaviour is intentional or is a hardware bug in chip - * revisions available in early 2006. Therefore for now allow the - * "Headphone Jack Mode" control to span all choices, but if it turns out - * that the lack of mic bias for this NID is intentional we could change the - * mode from ALC_PIN_DIR_INOUT to ALC_PIN_DIR_INOUT_NOMICBIAS. - * - * In addition, Acer TravelMate(/Extensa/Aspire) notebooks in early 2006 - * don't appear to make the mic bias available from the "line" jack, even - * though the NID used for this jack (0x14) can supply it. The theory is - * that perhaps Acer have included blocking capacitors between the ALC260 - * and the output jack. If this turns out to be the case for all such - * models the "Line Jack Mode" mode could be changed from ALC_PIN_DIR_INOUT - * to ALC_PIN_DIR_INOUT_NOMICBIAS. - */ -static struct snd_kcontrol_new alc260_acer_mixer[] = { - HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT), - HDA_BIND_MUTE("Master Playback Switch", 0x08, 2, HDA_INPUT), - ALC_PIN_MODE("Headphone Jack Mode", 0x0f, ALC_PIN_DIR_INOUT), - HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT), - HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT), - HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT), - HDA_CODEC_MUTE("Mic Playback Switch", 0x07, 0x0, HDA_INPUT), - ALC_PIN_MODE("Mic Jack Mode", 0x12, ALC_PIN_DIR_IN), - HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT), - HDA_CODEC_MUTE("Line Playback Switch", 0x07, 0x02, HDA_INPUT), - ALC_PIN_MODE("Line Jack Mode", 0x14, ALC_PIN_DIR_INOUT), - HDA_CODEC_VOLUME("Beep Playback Volume", 0x07, 0x05, HDA_INPUT), - HDA_CODEC_MUTE("Beep Playback Switch", 0x07, 0x05, HDA_INPUT), - { } /* end */ -}; - /* capture mixer elements */ static struct snd_kcontrol_new alc260_capture_mixer[] = { HDA_CODEC_VOLUME("Capture Volume", 0x04, 0x0, HDA_INPUT), @@ -3174,7 +2525,6 @@ 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}, @@ -3221,7 +2571,6 @@ 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 */ @@ -3271,8 +2620,7 @@ static struct hda_verb alc260_hp_3013_init_verbs[] = { }; /* Initialisation sequence for ALC260 as configured in Fujitsu S702x - * laptops. ALC260 pin usage: Mic/Line jack = 0x12, HP jack = 0x14, CD - * audio = 0x16, internal speaker = 0x10. + * laptops. */ static struct hda_verb alc260_fujitsu_init_verbs[] = { /* Disable all GPIOs */ @@ -3281,346 +2629,52 @@ static struct hda_verb alc260_fujitsu_init_verbs[] = { {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, /* Headphone/Line-out jack connects to Line1 pin; make it an output */ {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, - /* Mic/Line-in jack is connected to mic1 pin, so make it an input */ - {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, - /* Ensure all other unused pins are disabled and muted. */ - {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0}, - {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, + /* Mic/Line-in jack is connected to mic1 pin, so make it an input */ + {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, + /* Ensure all other unused pins are disabled and muted. + * Note: trying to set widget 0x15 to anything blocks all audio + * output for some reason, so just leave that at the default. + */ + {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0}, + {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0}, - {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, + {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0}, - {0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, - {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0}, - {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, - - /* Disable digital (SPDIF) pins */ - {0x03, AC_VERB_SET_DIGI_CONVERT_1, 0}, - {0x06, AC_VERB_SET_DIGI_CONVERT_1, 0}, - - /* Ensure Line1 pin widget takes its input from the OUT1 sum bus - * when acting as an output. - */ - {0x0d, AC_VERB_SET_CONNECT_SEL, 0}, - - /* Start with output sum widgets muted and their output gains at min */ - {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, - {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, - {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, - {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, - {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, - {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, - {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, - {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, - {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, - - /* Unmute HP pin widget amp left and right (no equiv mixer ctrl) */ - {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, - /* Unmute Line1 pin widget output buffer since it starts as an output. - * If the pin mode is changed by the user the pin mode control will - * take care of enabling the pin's input/output buffers as needed. - * Therefore there's no need to enable the input buffer at this - * stage. - */ - {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, - /* Unmute input buffer of pin widget used for Line-in (no equiv - * mixer ctrl) - */ - {0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, - - /* Mute capture amp left and right */ - {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, - /* Set ADC connection select to match default mixer setting - line - * in (on mic1 pin) - */ - {0x04, AC_VERB_SET_CONNECT_SEL, 0x00}, - - /* Do the same for the second ADC: mute capture input amp and - * set ADC connection to line in (on mic1 pin) - */ - {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, - {0x05, AC_VERB_SET_CONNECT_SEL, 0x00}, - - /* Mute all inputs to mixer widget (even unconnected ones) */ - {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */ - {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* mic2 pin */ - {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* line1 pin */ - {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* line2 pin */ - {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* CD pin */ - {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, /* Beep-gen pin */ - {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, /* Line-out pin */ - {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, /* HP-pin pin */ + {0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, + /* Disable digital (SPDIF) pins */ + {0x03, AC_VERB_SET_DIGI_CONVERT_1, 0}, + {0x06, AC_VERB_SET_DIGI_CONVERT_1, 0}, + + /* Start with mixer outputs muted */ + {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, + {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, + {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, + + /* Unmute HP pin widget amp left and right (no equiv mixer ctrl) */ + {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, + /* Unmute Line1 pin widget amp left and right (no equiv mixer ctrl) */ + {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, + /* Unmute pin widget used for Line-in (no equiv mixer ctrl) */ + {0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, + + /* Mute capture amp left and right */ + {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, + /* Set ADC connection select to line in (on mic1 pin) */ + {0x04, AC_VERB_SET_CONNECT_SEL, 0x00}, + + /* Mute all inputs to mixer widget (even unconnected ones) */ + {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */ + {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* mic2 pin */ + {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* line1 pin */ + {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* line2 pin */ + {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* CD pin */ + {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, /* Beep-gen pin */ + {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, /* Line-out pin */ + {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, /* HP-pin pin */ { } }; -/* Initialisation sequence for ALC260 as configured in Acer TravelMate and - * similar laptops (adapted from Fujitsu init verbs). - */ -static struct hda_verb alc260_acer_init_verbs[] = { - /* On TravelMate laptops, GPIO 0 enables the internal speaker and - * the headphone jack. Turn this on and rely on the standard mute - * methods whenever the user wants to turn these outputs off. - */ - {0x01, AC_VERB_SET_GPIO_MASK, 0x01}, - {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01}, - {0x01, AC_VERB_SET_GPIO_DATA, 0x01}, - /* Internal speaker/Headphone jack is connected to Line-out pin */ - {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, - /* Internal microphone/Mic jack is connected to Mic1 pin */ - {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50}, - /* Line In jack is connected to Line1 pin */ - {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, - /* Ensure all other unused pins are disabled and muted. */ - {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0}, - {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, - {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0}, - {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, - {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0}, - {0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, - {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0}, - {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, - /* Disable digital (SPDIF) pins */ - {0x03, AC_VERB_SET_DIGI_CONVERT_1, 0}, - {0x06, AC_VERB_SET_DIGI_CONVERT_1, 0}, - - /* Ensure Mic1 and Line1 pin widgets take input from the OUT1 sum - * bus when acting as outputs. - */ - {0x0b, AC_VERB_SET_CONNECT_SEL, 0}, - {0x0d, AC_VERB_SET_CONNECT_SEL, 0}, - - /* Start with output sum widgets muted and their output gains at min */ - {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, - {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, - {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, - {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, - {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, - {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, - {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, - {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, - {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, - - /* Unmute Line-out pin widget amp left and right (no equiv mixer ctrl) */ - {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, - /* Unmute Mic1 and Line1 pin widget input buffers since they start as - * inputs. If the pin mode is changed by the user the pin mode control - * will take care of enabling the pin's input/output buffers as needed. - * Therefore there's no need to enable the input buffer at this - * stage. - */ - {0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, - {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, - - /* Mute capture amp left and right */ - {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, - /* Set ADC connection select to match default mixer setting - mic - * (on mic1 pin) - */ - {0x04, AC_VERB_SET_CONNECT_SEL, 0x00}, - - /* Do similar with the second ADC: mute capture input amp and - * set ADC connection to mic to match ALSA's default state. - */ - {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, - {0x05, AC_VERB_SET_CONNECT_SEL, 0x00}, - - /* Mute all inputs to mixer widget (even unconnected ones) */ - {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */ - {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* mic2 pin */ - {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* line1 pin */ - {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* line2 pin */ - {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* CD pin */ - {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, /* Beep-gen pin */ - {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, /* Line-out pin */ - {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, /* HP-pin pin */ - - { } -}; - -/* Test configuration for debugging, modelled after the ALC880 test - * configuration. - */ -#ifdef CONFIG_SND_DEBUG -static hda_nid_t alc260_test_dac_nids[1] = { - 0x02, -}; -static hda_nid_t alc260_test_adc_nids[2] = { - 0x04, 0x05, -}; -/* For testing the ALC260, each input MUX needs its own definition since - * the signal assignments are different. This assumes that the first ADC - * is NID 0x04. - */ -static struct hda_input_mux alc260_test_capture_sources[2] = { - { - .num_items = 7, - .items = { - { "MIC1 pin", 0x0 }, - { "MIC2 pin", 0x1 }, - { "LINE1 pin", 0x2 }, - { "LINE2 pin", 0x3 }, - { "CD pin", 0x4 }, - { "LINE-OUT pin", 0x5 }, - { "HP-OUT pin", 0x6 }, - }, - }, - { - .num_items = 8, - .items = { - { "MIC1 pin", 0x0 }, - { "MIC2 pin", 0x1 }, - { "LINE1 pin", 0x2 }, - { "LINE2 pin", 0x3 }, - { "CD pin", 0x4 }, - { "Mixer", 0x5 }, - { "LINE-OUT pin", 0x6 }, - { "HP-OUT pin", 0x7 }, - }, - }, -}; -static struct snd_kcontrol_new alc260_test_mixer[] = { - /* Output driver widgets */ - HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x0a, 1, 0x0, HDA_OUTPUT), - HDA_BIND_MUTE_MONO("Mono Playback Switch", 0x0a, 1, 2, HDA_INPUT), - HDA_CODEC_VOLUME("LOUT2 Playback Volume", 0x09, 0x0, HDA_OUTPUT), - HDA_BIND_MUTE("LOUT2 Playback Switch", 0x09, 2, HDA_INPUT), - HDA_CODEC_VOLUME("LOUT1 Playback Volume", 0x08, 0x0, HDA_OUTPUT), - HDA_BIND_MUTE("LOUT1 Playback Switch", 0x08, 2, HDA_INPUT), - - /* Modes for retasking pin widgets - * Note: the ALC260 doesn't seem to act on requests to enable mic - * bias from NIDs 0x0f and 0x10. The ALC260 datasheet doesn't - * mention this restriction. At this stage it's not clear whether - * this behaviour is intentional or is a hardware bug in chip - * revisions available at least up until early 2006. Therefore for - * now allow the "HP-OUT" and "LINE-OUT" Mode controls to span all - * choices, but if it turns out that the lack of mic bias for these - * NIDs is intentional we could change their modes from - * ALC_PIN_DIR_INOUT to ALC_PIN_DIR_INOUT_NOMICBIAS. - */ - ALC_PIN_MODE("HP-OUT pin mode", 0x10, ALC_PIN_DIR_INOUT), - ALC_PIN_MODE("LINE-OUT pin mode", 0x0f, ALC_PIN_DIR_INOUT), - ALC_PIN_MODE("LINE2 pin mode", 0x15, ALC_PIN_DIR_INOUT), - ALC_PIN_MODE("LINE1 pin mode", 0x14, ALC_PIN_DIR_INOUT), - ALC_PIN_MODE("MIC2 pin mode", 0x13, ALC_PIN_DIR_INOUT), - ALC_PIN_MODE("MIC1 pin mode", 0x12, ALC_PIN_DIR_INOUT), - - /* Loopback mixer controls */ - HDA_CODEC_VOLUME("MIC1 Playback Volume", 0x07, 0x00, HDA_INPUT), - HDA_CODEC_MUTE("MIC1 Playback Switch", 0x07, 0x00, HDA_INPUT), - HDA_CODEC_VOLUME("MIC2 Playback Volume", 0x07, 0x01, HDA_INPUT), - HDA_CODEC_MUTE("MIC2 Playback Switch", 0x07, 0x01, HDA_INPUT), - HDA_CODEC_VOLUME("LINE1 Playback Volume", 0x07, 0x02, HDA_INPUT), - HDA_CODEC_MUTE("LINE1 Playback Switch", 0x07, 0x02, HDA_INPUT), - HDA_CODEC_VOLUME("LINE2 Playback Volume", 0x07, 0x03, HDA_INPUT), - HDA_CODEC_MUTE("LINE2 Playback Switch", 0x07, 0x03, HDA_INPUT), - HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT), - HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT), - HDA_CODEC_VOLUME("Beep Playback Volume", 0x07, 0x05, HDA_INPUT), - HDA_CODEC_MUTE("Beep Playback Switch", 0x07, 0x05, HDA_INPUT), - HDA_CODEC_VOLUME("LINE-OUT loopback Playback Volume", 0x07, 0x06, HDA_INPUT), - HDA_CODEC_MUTE("LINE-OUT loopback Playback Switch", 0x07, 0x06, HDA_INPUT), - HDA_CODEC_VOLUME("HP-OUT loopback Playback Volume", 0x07, 0x7, HDA_INPUT), - HDA_CODEC_MUTE("HP-OUT loopback Playback Switch", 0x07, 0x7, HDA_INPUT), - - /* Controls for GPIO pins, assuming they are configured as outputs */ - ALC_GPIO_DATA_SWITCH("GPIO pin 0", 0x01, 0x01), - ALC_GPIO_DATA_SWITCH("GPIO pin 1", 0x01, 0x02), - ALC_GPIO_DATA_SWITCH("GPIO pin 2", 0x01, 0x04), - ALC_GPIO_DATA_SWITCH("GPIO pin 3", 0x01, 0x08), - - /* Switches to allow the digital IO pins to be enabled. The datasheet - * is ambigious as to which NID is which; testing on laptops which - * make this output available should provide clarification. - */ - ALC_SPDIF_CTRL_SWITCH("SPDIF Playback Switch", 0x03, 0x01), - ALC_SPDIF_CTRL_SWITCH("SPDIF Capture Switch", 0x06, 0x01), - - { } /* end */ -}; -static struct hda_verb alc260_test_init_verbs[] = { - /* Enable all GPIOs as outputs with an initial value of 0 */ - {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x0f}, - {0x01, AC_VERB_SET_GPIO_DATA, 0x00}, - {0x01, AC_VERB_SET_GPIO_MASK, 0x0f}, - - /* Enable retasking pins as output, initially without power amp */ - {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, - {0x0f, 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}, - {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, - {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, - - /* Disable digital (SPDIF) pins initially, but users can enable - * them via a mixer switch. In the case of SPDIF-out, this initverb - * payload also sets the generation to 0, output to be in "consumer" - * PCM format, copyright asserted, no pre-emphasis and no validity - * control. - */ - {0x03, AC_VERB_SET_DIGI_CONVERT_1, 0}, - {0x06, AC_VERB_SET_DIGI_CONVERT_1, 0}, - - /* Ensure mic1, mic2, line1 and line2 pin widgets take input from the - * OUT1 sum bus when acting as an output. - */ - {0x0b, AC_VERB_SET_CONNECT_SEL, 0}, - {0x0c, AC_VERB_SET_CONNECT_SEL, 0}, - {0x0d, AC_VERB_SET_CONNECT_SEL, 0}, - {0x0e, AC_VERB_SET_CONNECT_SEL, 0}, - - /* Start with output sum widgets muted and their output gains at min */ - {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, - {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, - {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, - {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, - {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, - {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, - {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, - {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, - {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, - - /* Unmute retasking pin widget output buffers since the default - * state appears to be output. As the pin mode is changed by the - * user the pin mode control will take care of enabling the pin's - * input/output buffers as needed. - */ - {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, - {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, - {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, - {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, - {0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, - {0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, - /* Also unmute the mono-out pin widget */ - {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, - - /* Mute capture amp left and right */ - {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, - /* Set ADC connection select to match default mixer setting (mic1 - * pin) - */ - {0x04, AC_VERB_SET_CONNECT_SEL, 0x00}, - - /* Do the same for the second ADC: mute capture input amp and - * set ADC connection to mic1 pin - */ - {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, - {0x05, AC_VERB_SET_CONNECT_SEL, 0x00}, - - /* Mute all inputs to mixer widget (even unconnected ones) */ - {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */ - {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* mic2 pin */ - {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* line1 pin */ - {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* line2 pin */ - {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* CD pin */ - {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, /* Beep-gen pin */ - {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, /* Line-out pin */ - {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, /* HP-pin pin */ - - { } -}; -#endif - static struct hda_pcm_stream alc260_pcm_analog_playback = { .substreams = 1, .channels_min = 2, @@ -3690,7 +2744,7 @@ static int alc260_auto_create_multi_out_ctls(struct alc_spec *spec, return err; } - nid = cfg->speaker_pins[0]; + nid = cfg->speaker_pin; if (nid) { err = alc260_add_playback_controls(spec, nid, "Speaker"); if (err < 0) @@ -3763,7 +2817,7 @@ static void alc260_auto_init_multi_out(struct hda_codec *codec) if (nid) alc260_auto_set_output_and_unmute(codec, nid, PIN_OUT, 0); - nid = spec->autocfg.speaker_pins[0]; + nid = spec->autocfg.speaker_pin; if (nid) alc260_auto_set_output_and_unmute(codec, nid, PIN_OUT, 0); @@ -3859,7 +2913,6 @@ static int alc260_parse_auto_config(struct hda_codec *codec) spec->init_verbs[spec->num_init_verbs++] = alc260_volume_init_verbs; - spec->num_mux_defs = 1; spec->input_mux = &spec->private_imux; /* check whether NID 0x04 is valid */ @@ -3879,11 +2932,13 @@ static int alc260_parse_auto_config(struct hda_codec *codec) return 1; } -/* additional initialization for auto-configuration model */ -static void alc260_auto_init(struct hda_codec *codec) +/* init callback for auto-configuration model -- overriding the default init */ +static int alc260_auto_init(struct hda_codec *codec) { + alc_init(codec); alc260_auto_init_multi_out(codec); alc260_auto_init_analog_input(codec); + return 0; } /* @@ -3893,10 +2948,6 @@ 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 }, @@ -3909,11 +2960,6 @@ static struct hda_board_config alc260_cfg_tbl[] = { { .pci_subvendor = 0x103c, .pci_subdevice = 0x3016, .config = ALC260_HP }, { .modelname = "fujitsu", .config = ALC260_FUJITSU_S702X }, { .pci_subvendor = 0x10cf, .pci_subdevice = 0x1326, .config = ALC260_FUJITSU_S702X }, - { .modelname = "acer", .config = ALC260_ACER }, - { .pci_subvendor = 0x1025, .pci_subdevice = 0x008f, .config = ALC260_ACER }, -#ifdef CONFIG_SND_DEBUG - { .modelname = "test", .config = ALC260_TEST }, -#endif { .modelname = "auto", .config = ALC260_AUTO }, {} }; @@ -3937,7 +2983,7 @@ static struct alc_config_preset alc260_presets[] = { .mixers = { alc260_base_output_mixer, alc260_input_mixer, alc260_capture_alt_mixer }, - .init_verbs = { alc260_init_verbs }, + .init_verbs = { alc260_hp_init_verbs }, .num_dacs = ARRAY_SIZE(alc260_dac_nids), .dac_nids = alc260_dac_nids, .num_adc_nids = ARRAY_SIZE(alc260_hp_adc_nids), @@ -3965,41 +3011,12 @@ static struct alc_config_preset alc260_presets[] = { .init_verbs = { alc260_fujitsu_init_verbs }, .num_dacs = ARRAY_SIZE(alc260_dac_nids), .dac_nids = alc260_dac_nids, - .num_adc_nids = ARRAY_SIZE(alc260_dual_adc_nids), - .adc_nids = alc260_dual_adc_nids, - .num_channel_mode = ARRAY_SIZE(alc260_modes), - .channel_mode = alc260_modes, - .num_mux_defs = ARRAY_SIZE(alc260_fujitsu_capture_sources), - .input_mux = alc260_fujitsu_capture_sources, - }, - [ALC260_ACER] = { - .mixers = { alc260_acer_mixer, - alc260_capture_mixer }, - .init_verbs = { alc260_acer_init_verbs }, - .num_dacs = ARRAY_SIZE(alc260_dac_nids), - .dac_nids = alc260_dac_nids, - .num_adc_nids = ARRAY_SIZE(alc260_dual_adc_nids), - .adc_nids = alc260_dual_adc_nids, - .num_channel_mode = ARRAY_SIZE(alc260_modes), - .channel_mode = alc260_modes, - .num_mux_defs = ARRAY_SIZE(alc260_acer_capture_sources), - .input_mux = alc260_acer_capture_sources, - }, -#ifdef CONFIG_SND_DEBUG - [ALC260_TEST] = { - .mixers = { alc260_test_mixer, - alc260_capture_mixer }, - .init_verbs = { alc260_test_init_verbs }, - .num_dacs = ARRAY_SIZE(alc260_test_dac_nids), - .dac_nids = alc260_test_dac_nids, - .num_adc_nids = ARRAY_SIZE(alc260_test_adc_nids), - .adc_nids = alc260_test_adc_nids, + .num_adc_nids = ARRAY_SIZE(alc260_adc_nids), + .adc_nids = alc260_adc_nids, .num_channel_mode = ARRAY_SIZE(alc260_modes), .channel_mode = alc260_modes, - .num_mux_defs = ARRAY_SIZE(alc260_test_capture_sources), - .input_mux = alc260_test_capture_sources, + .input_mux = &alc260_fujitsu_capture_source, }, -#endif }; static int patch_alc260(struct hda_codec *codec) @@ -4015,8 +3032,7 @@ 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, " - "trying auto-probe from BIOS...\n"); + snd_printd(KERN_INFO "hda_codec: Unknown model for ALC260\n"); board_config = ALC260_AUTO; } @@ -4027,9 +3043,7 @@ 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; } } @@ -4047,7 +3061,7 @@ static int patch_alc260(struct hda_codec *codec) codec->patch_ops = alc_patch_ops; if (board_config == ALC260_AUTO) - spec->init_hook = alc260_auto_init; + codec->patch_ops.init = alc260_auto_init; return 0; } @@ -4092,6 +3106,7 @@ static struct hda_input_mux alc882_capture_source = { { "CD", 0x4 }, }, }; + #define alc882_mux_enum_info alc_mux_enum_info #define alc882_mux_enum_get alc_mux_enum_get @@ -4172,6 +3187,21 @@ 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 */ }; @@ -4391,12 +3421,9 @@ 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 to Intel*/ + { .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 */ { .modelname = "auto", .config = ALC882_AUTO }, {} }; @@ -4408,674 +3435,25 @@ 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, .input_mux = &alc882_capture_source, }, [ALC882_6ST_DIG] = { - .mixers = { alc882_base_mixer, alc882_chmode_mixer }, - .init_verbs = { alc882_init_verbs }, - .num_dacs = ARRAY_SIZE(alc882_dac_nids), - .dac_nids = alc882_dac_nids, - .dig_out_nid = ALC882_DIGOUT_NID, - .dig_in_nid = ALC882_DIGIN_NID, - .num_channel_mode = ARRAY_SIZE(alc882_sixstack_modes), - .channel_mode = alc882_sixstack_modes, - .input_mux = &alc882_capture_source, - }, -}; - - -/* - * BIOS auto configuration - */ -static void alc882_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 alc882_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) - alc882_auto_set_output_and_unmute(codec, nid, PIN_OUT, i); - } -} - -static void alc882_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 */ - alc882_auto_set_output_and_unmute(codec, pin, PIN_HP, 0); /* use dac 0 */ -} - -#define alc882_is_input_pin(nid) alc880_is_input_pin(nid) -#define ALC882_PIN_CD_NID ALC880_PIN_CD_NID - -static void alc882_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 (alc882_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 != ALC882_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 alc882_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] = alc882_auto_init_verbs; - return err; -} - -/* additional initialization for auto-configuration model */ -static void alc882_auto_init(struct hda_codec *codec) -{ - alc882_auto_init_multi_out(codec); - alc882_auto_init_hp_out(codec); - alc882_auto_init_analog_input(codec); -} - -static int patch_alc882(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, 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"); - board_config = ALC882_AUTO; - } - - if (board_config == ALC882_AUTO) { - /* automatic parse from the BIOS config */ - err = alc882_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 = ALC882_3ST_DIG; - } - } - - if (board_config != ALC882_AUTO) - setup_preset(spec, &alc882_presets[board_config]); - - spec->stream_name_analog = "ALC882 Analog"; - spec->stream_analog_playback = &alc882_pcm_analog_playback; - spec->stream_analog_capture = &alc882_pcm_analog_capture; - - spec->stream_name_digital = "ALC882 Digital"; - spec->stream_digital_playback = &alc882_pcm_digital_playback; - spec->stream_digital_capture = &alc882_pcm_digital_capture; - - if (! spec->adc_nids && spec->input_mux) { - /* check whether NID 0x07 is valid */ - unsigned int wcap = get_wcaps(codec, 0x07); - wcap = (wcap & AC_WCAP_TYPE) >> AC_WCAP_TYPE_SHIFT; /* get type */ - if (wcap != AC_WID_AUD_IN) { - spec->adc_nids = alc882_adc_nids_alt; - spec->num_adc_nids = ARRAY_SIZE(alc882_adc_nids_alt); - spec->mixers[spec->num_mixers] = alc882_capture_alt_mixer; - spec->num_mixers++; - } else { - spec->adc_nids = alc882_adc_nids; - spec->num_adc_nids = ARRAY_SIZE(alc882_adc_nids); - spec->mixers[spec->num_mixers] = alc882_capture_mixer; - spec->num_mixers++; - } - } - - codec->patch_ops = alc_patch_ops; - if (board_config == ALC882_AUTO) - spec->init_hook = alc882_auto_init; - - return 0; -} - -/* - * 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 - -static hda_nid_t alc883_dac_nids[4] = { - /* front, rear, clfe, rear_surr */ - 0x02, 0x04, 0x03, 0x05 -}; - -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 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 - -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; -} -/* - * 2ch mode - */ -static struct hda_channel_mode alc883_3ST_2ch_modes[1] = { - { 2, NULL } -}; - -/* - * 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 */ -}; - -/* - * 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 }, -}; - -/* - * 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 */ -}; - -/* - * 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_channel_mode alc883_sixstack_modes[2] = { - { 6, alc883_sixstack_ch6_init }, - { 8, alc883_sixstack_ch8_init }, -}; - -/* 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 */ -}; - -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, + .mixers = { alc882_base_mixer, alc882_chmode_mixer }, + .init_verbs = { alc882_init_verbs }, + .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, + .input_mux = &alc882_capture_source, }, }; @@ -5083,7 +3461,7 @@ static struct alc_config_preset alc883_presets[] = { /* * BIOS auto configuration */ -static void alc883_auto_set_output_and_unmute(struct hda_codec *codec, +static void alc882_auto_set_output_and_unmute(struct hda_codec *codec, hda_nid_t nid, int pin_type, int dac_idx) { @@ -5096,15 +3474,13 @@ static void alc883_auto_set_output_and_unmute(struct hda_codec *codec, 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_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) +static void alc882_auto_init_multi_out(struct hda_codec *codec) { struct alc_spec *spec = codec->spec; int i; @@ -5112,46 +3488,42 @@ static void alc883_auto_init_multi_out(struct hda_codec *codec) 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); + alc882_auto_set_output_and_unmute(codec, nid, PIN_OUT, i); } } -static void alc883_auto_init_hp_out(struct hda_codec *codec) +static void alc882_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); + alc882_auto_set_output_and_unmute(codec, pin, PIN_HP, 0); /* use dac 0 */ } -#define alc883_is_input_pin(nid) alc880_is_input_pin(nid) -#define ALC883_PIN_CD_NID ALC880_PIN_CD_NID +#define alc882_is_input_pin(nid) alc880_is_input_pin(nid) +#define ALC882_PIN_CD_NID ALC880_PIN_CD_NID -static void alc883_auto_init_analog_input(struct hda_codec *codec) +static void alc882_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, + if (alc882_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 != ALC882_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) +static int alc882_parse_auto_config(struct hda_codec *codec) { struct alc_spec *spec = codec->spec; int err = alc880_parse_auto_config(codec); @@ -5160,21 +3532,25 @@ static int alc883_parse_auto_config(struct hda_codec *codec) 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++; + spec->init_verbs[0] = alc882_auto_init_verbs; return err; } -/* additional initialization for auto-configuration model */ -static void alc883_auto_init(struct hda_codec *codec) +/* init callback for auto-configuration model -- overriding the default init */ +static int alc882_auto_init(struct hda_codec *codec) { - alc883_auto_init_multi_out(codec); - alc883_auto_init_hp_out(codec); - alc883_auto_init_analog_input(codec); + alc_init(codec); + alc882_auto_init_multi_out(codec); + alc882_auto_init_hp_out(codec); + alc882_auto_init_analog_input(codec); + return 0; } -static int patch_alc883(struct hda_codec *codec) +/* + * ALC882 Headphone poll in 3.5.1a or 3.5.2 + */ + +static int patch_alc882(struct hda_codec *codec) { struct alc_spec *spec; int err, board_config; @@ -5185,44 +3561,56 @@ static int patch_alc883(struct hda_codec *codec) 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; + 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"); + board_config = ALC882_AUTO; } - if (board_config == ALC883_AUTO) { + if (board_config == ALC882_AUTO) { /* automatic parse from the BIOS config */ - err = alc883_parse_auto_config(codec); + err = alc882_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; + printk(KERN_INFO "hda_codec: Cannot set up configuration from BIOS. Using base mode...\n"); + board_config = ALC882_3ST_DIG; } } - if (board_config != ALC883_AUTO) - setup_preset(spec, &alc883_presets[board_config]); + if (board_config != ALC882_AUTO) + setup_preset(spec, &alc882_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_analog = "ALC882 Analog"; + spec->stream_analog_playback = &alc882_pcm_analog_playback; + spec->stream_analog_capture = &alc882_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->stream_name_digital = "ALC882 Digital"; + spec->stream_digital_playback = &alc882_pcm_digital_playback; + spec->stream_digital_capture = &alc882_pcm_digital_capture; - spec->adc_nids = alc883_adc_nids; - spec->num_adc_nids = ARRAY_SIZE(alc883_adc_nids); + if (! spec->adc_nids && spec->input_mux) { + /* check whether NID 0x07 is valid */ + unsigned int wcap = get_wcaps(codec, 0x07); + wcap = (wcap & AC_WCAP_TYPE) >> AC_WCAP_TYPE_SHIFT; /* get type */ + if (wcap != AC_WID_AUD_IN) { + spec->adc_nids = alc882_adc_nids_alt; + spec->num_adc_nids = ARRAY_SIZE(alc882_adc_nids_alt); + spec->mixers[spec->num_mixers] = alc882_capture_alt_mixer; + spec->num_mixers++; + } else { + spec->adc_nids = alc882_adc_nids; + spec->num_adc_nids = ARRAY_SIZE(alc882_adc_nids); + spec->mixers[spec->num_mixers] = alc882_capture_mixer; + spec->num_mixers++; + } + } codec->patch_ops = alc_patch_ops; - if (board_config == ALC883_AUTO) - spec->init_hook = alc883_auto_init; + if (board_config == ALC882_AUTO) + codec->patch_ops.init = alc882_auto_init; return 0; } @@ -5258,31 +3646,19 @@ static struct snd_kcontrol_new alc262_base_mixer[] = { 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), + HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT), + HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT), + { + .iface = SNDRV_CTL_ELEM_IFACE_MIXER, + .name = "Capture Source", + .count = 1, + .info = alc882_mux_enum_info, + .get = alc882_mux_enum_get, + .put = alc882_mux_enum_put, + }, { } /* 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 @@ -5365,140 +3741,6 @@ static struct hda_verb alc262_init_verbs[] = { { } }; -/* - * 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; - - if (force || ! spec->sense_updated) { - unsigned int present; - /* need to execute and sync at first */ - snd_hda_codec_read(codec, 0x14, 0, AC_VERB_SET_PIN_SENSE, 0); - present = snd_hda_codec_read(codec, 0x14, 0, - AC_VERB_GET_PIN_SENSE, 0); - spec->jack_present = (present & 0x80000000) != 0; - spec->sense_updated = 1; - } - if (spec->jack_present) { - /* mute internal speaker */ - snd_hda_codec_amp_update(codec, 0x15, 0, HDA_OUTPUT, 0, - 0x80, 0x80); - snd_hda_codec_amp_update(codec, 0x15, 1, HDA_OUTPUT, 0, - 0x80, 0x80); - } else { - /* unmute internal speaker if necessary */ - mute = snd_hda_codec_amp_read(codec, 0x14, 0, HDA_OUTPUT, 0); - snd_hda_codec_amp_update(codec, 0x15, 0, HDA_OUTPUT, 0, - 0x80, mute & 0x80); - mute = snd_hda_codec_amp_read(codec, 0x14, 1, HDA_OUTPUT, 0); - snd_hda_codec_amp_update(codec, 0x15, 1, HDA_OUTPUT, 0, - 0x80, mute & 0x80); - } -} - -/* unsolicited event for HP jack sensing */ -static void alc262_fujitsu_unsol_event(struct hda_codec *codec, - unsigned int res) -{ - if ((res >> 26) != ALC_HP_EVENT) - return; - alc262_fujitsu_automute(codec, 1); -} - -/* bind volumes of both NID 0x0c and 0x0d */ -static int alc262_fujitsu_master_vol_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct hda_codec *codec = snd_kcontrol_chip(kcontrol); - long *valp = ucontrol->value.integer.value; - int change; - - change = snd_hda_codec_amp_update(codec, 0x0c, 0, HDA_OUTPUT, 0, - 0x7f, valp[0] & 0x7f); - change |= snd_hda_codec_amp_update(codec, 0x0c, 1, HDA_OUTPUT, 0, - 0x7f, valp[1] & 0x7f); - snd_hda_codec_amp_update(codec, 0x0d, 0, HDA_OUTPUT, 0, - 0x7f, valp[0] & 0x7f); - snd_hda_codec_amp_update(codec, 0x0d, 1, HDA_OUTPUT, 0, - 0x7f, valp[1] & 0x7f); - return change; -} - -/* bind hp and internal speaker mute (with plug check) */ -static int alc262_fujitsu_master_sw_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct hda_codec *codec = snd_kcontrol_chip(kcontrol); - long *valp = ucontrol->value.integer.value; - int change; - - change = snd_hda_codec_amp_update(codec, 0x14, 0, HDA_OUTPUT, 0, - 0x80, valp[0] ? 0 : 0x80); - change |= snd_hda_codec_amp_update(codec, 0x14, 1, HDA_OUTPUT, 0, - 0x80, valp[1] ? 0 : 0x80); - if (change || codec->in_resume) - alc262_fujitsu_automute(codec, codec->in_resume); - return change; -} - -static struct snd_kcontrol_new alc262_fujitsu_mixer[] = { - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "Master Playback Volume", - .info = snd_hda_mixer_amp_volume_info, - .get = snd_hda_mixer_amp_volume_get, - .put = alc262_fujitsu_master_vol_put, - .private_value = HDA_COMPOSE_AMP_VAL(0x0c, 3, 0, HDA_OUTPUT), - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "Master Playback Switch", - .info = snd_hda_mixer_amp_switch_info, - .get = snd_hda_mixer_amp_switch_get, - .put = alc262_fujitsu_master_sw_put, - .private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, 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("Mic Boost", 0x18, 0, HDA_INPUT), - HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), - HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), - { } /* end */ -}; - /* add playback controls from the parsed DAC table */ static int alc262_auto_create_multi_out_ctls(struct alc_spec *spec, const struct auto_pin_cfg *cfg) { @@ -5519,7 +3761,7 @@ static int alc262_auto_create_multi_out_ctls(struct alc_spec *spec, const struct return err; } - nid = cfg->speaker_pins[0]; + nid = cfg->speaker_pin; if (nid) { if (nid == 0x16) { if ((err = add_control(spec, ALC_CTL_WIDGET_VOL, "Speaker Playback Volume", @@ -5529,6 +3771,10 @@ static int alc262_auto_create_multi_out_ctls(struct alc_spec *spec, const struct HDA_COMPOSE_AMP_VAL(nid, 2, 0, HDA_OUTPUT))) < 0) return err; } else { + if (! cfg->line_out_pins[0]) + if ((err = add_control(spec, ALC_CTL_WIDGET_VOL, "Speaker Playback Volume", + HDA_COMPOSE_AMP_VAL(0x0c, 3, 0, HDA_OUTPUT))) < 0) + return err; if ((err = add_control(spec, ALC_CTL_WIDGET_MUTE, "Speaker Playback Switch", HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT))) < 0) return err; @@ -5545,6 +3791,10 @@ static int alc262_auto_create_multi_out_ctls(struct alc_spec *spec, const struct HDA_COMPOSE_AMP_VAL(nid, 2, 0, HDA_OUTPUT))) < 0) return err; } else { + if (! cfg->line_out_pins[0]) + if ((err = add_control(spec, ALC_CTL_WIDGET_VOL, "Headphone Playback Volume", + HDA_COMPOSE_AMP_VAL(0x0c, 3, 0, HDA_OUTPUT))) < 0) + return err; if ((err = add_control(spec, ALC_CTL_WIDGET_MUTE, "Headphone Playback Switch", HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT))) < 0) return err; @@ -5620,93 +3870,6 @@ 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 @@ -5725,7 +3888,8 @@ static int alc262_parse_auto_config(struct hda_codec *codec) if ((err = snd_hda_parse_pin_def_config(codec, &spec->autocfg, alc262_ignore)) < 0) return err; - if (! spec->autocfg.line_outs) + if (! spec->autocfg.line_outs && ! spec->autocfg.speaker_pin && + ! spec->autocfg.hp_pin) return 0; /* can't find valid BIOS pin config */ if ((err = alc262_auto_create_multi_out_ctls(spec, &spec->autocfg)) < 0 || (err = alc262_auto_create_analog_input_ctls(spec, &spec->autocfg)) < 0) @@ -5742,7 +3906,6 @@ static int alc262_parse_auto_config(struct hda_codec *codec) spec->mixers[spec->num_mixers++] = spec->kctl_alloc; spec->init_verbs[spec->num_init_verbs++] = alc262_volume_init_verbs; - spec->num_mux_defs = 1; spec->input_mux = &spec->private_imux; return 1; @@ -5754,11 +3917,13 @@ static int alc262_parse_auto_config(struct hda_codec *codec) /* init callback for auto-configuration model -- overriding the default init */ -static void alc262_auto_init(struct hda_codec *codec) +static int alc262_auto_init(struct hda_codec *codec) { + alc_init(codec); alc262_auto_init_multi_out(codec); alc262_auto_init_hp_out(codec); alc262_auto_init_analog_input(codec); + return 0; } /* @@ -5766,17 +3931,6 @@ 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 = 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 }, {} }; @@ -5792,28 +3946,6 @@ static struct alc_config_preset alc262_presets[] = { .channel_mode = alc262_modes, .input_mux = &alc262_capture_source, }, - [ALC262_FUJITSU] = { - .mixers = { alc262_fujitsu_mixer }, - .init_verbs = { alc262_init_verbs, alc262_fujitsu_unsol_verbs }, - .num_dacs = ARRAY_SIZE(alc262_dac_nids), - .dac_nids = alc262_dac_nids, - .hp_nid = 0x03, - .dig_out_nid = ALC262_DIGOUT_NID, - .num_channel_mode = ARRAY_SIZE(alc262_modes), - .channel_mode = alc262_modes, - .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) @@ -5839,10 +3971,8 @@ 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; } @@ -5853,9 +3983,7 @@ 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; } } @@ -5891,11 +4019,12 @@ static int patch_alc262(struct hda_codec *codec) codec->patch_ops = alc_patch_ops; if (board_config == ALC262_AUTO) - spec->init_hook = alc262_auto_init; - + codec->patch_ops.init = alc262_auto_init; + return 0; } + /* * ALC861 channel source setting (2/6 channel selection for 3-stack) */ @@ -5910,11 +4039,9 @@ 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 }, -#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 + { 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 { } /* end */ }; /* @@ -5928,13 +4055,11 @@ 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 }, -#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 + { 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 { } /* end */ }; @@ -6218,11 +4343,6 @@ 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, @@ -6431,7 +4551,8 @@ static int alc861_parse_auto_config(struct hda_codec *codec) if ((err = snd_hda_parse_pin_def_config(codec, &spec->autocfg, alc861_ignore)) < 0) return err; - if (! spec->autocfg.line_outs) + if (! spec->autocfg.line_outs && ! spec->autocfg.speaker_pin && + ! spec->autocfg.hp_pin) return 0; /* can't find valid BIOS pin config */ if ((err = alc861_auto_fill_dac_nids(spec, &spec->autocfg)) < 0 || @@ -6450,7 +4571,6 @@ static int alc861_parse_auto_config(struct hda_codec *codec) spec->init_verbs[spec->num_init_verbs++] = alc861_auto_init_verbs; - spec->num_mux_defs = 1; spec->input_mux = &spec->private_imux; spec->adc_nids = alc861_adc_nids; @@ -6461,12 +4581,15 @@ static int alc861_parse_auto_config(struct hda_codec *codec) return 1; } -/* additional initialization for auto-configuration model */ -static void alc861_auto_init(struct hda_codec *codec) +/* init callback for auto-configuration model -- overriding the default init */ +static int alc861_auto_init(struct hda_codec *codec) { + alc_init(codec); alc861_auto_init_multi_out(codec); alc861_auto_init_hp_out(codec); alc861_auto_init_analog_input(codec); + + return 0; } @@ -6475,10 +4598,7 @@ 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 = 0x1043, .pci_subdevice = 0x81e7, - .config = ALC660_3ST }, + { .pci_subvendor = 0x8086, .pci_subdevice = 0xd600, .config = ALC861_3ST }, { .modelname = "3stack-dig", .config = ALC861_3ST_DIG }, { .modelname = "6stack-dig", .config = ALC861_6ST_DIG }, { .modelname = "auto", .config = ALC861_AUTO }, @@ -6521,17 +4641,6 @@ 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, - }, }; @@ -6548,10 +4657,8 @@ 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; } @@ -6562,9 +4669,7 @@ 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; } } @@ -6582,7 +4687,7 @@ static int patch_alc861(struct hda_codec *codec) codec->patch_ops = alc_patch_ops; if (board_config == ALC861_AUTO) - spec->init_hook = alc861_auto_init; + codec->patch_ops.init = alc861_auto_init; return 0; } @@ -6595,12 +4700,8 @@ 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_alc883 }, + { .id = 0x10ec0883, .name = "ALC883", .patch = patch_alc882 }, { .id = 0x10ec0885, .name = "ALC885", .patch = patch_alc882 }, - { .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 }, + { .id = 0x10ec0861, .name = "ALC861", .patch = patch_alc861 }, {} /* terminator */ }; diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c index ea99083a1..35c2823a0 100644 --- a/sound/pci/hda/patch_sigmatel.c +++ b/sound/pci/hda/patch_sigmatel.c @@ -41,10 +41,6 @@ #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]; @@ -55,8 +51,6 @@ struct sigmatel_spec { unsigned int line_switch: 1; 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; @@ -110,24 +104,10 @@ 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 }; @@ -190,24 +170,6 @@ 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}, @@ -247,21 +209,6 @@ 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, @@ -341,18 +288,10 @@ static unsigned int d945gtp5_pin_configs[10] = { 0x02a19320, 0x40000100, }; -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 unsigned int *stac922x_brd_tbl[] = { + ref922x_pin_configs, + d945gtp3_pin_configs, + d945gtp5_pin_configs, }; static struct hda_board_config stac922x_cfg_tbl[] = { @@ -364,15 +303,6 @@ static struct hda_board_config stac922x_cfg_tbl[] = { .pci_subdevice = 0x0101, .config = STAC_D945GTP3 }, /* Intel D945GTP - 3 Stack */ { .pci_subvendor = PCI_VENDOR_ID_INTEL, - .pci_subdevice = 0x0202, - .config = STAC_D945GTP3 }, /* Intel D945GNT - 3 Stack, 9221 A1 */ - { .pci_subvendor = PCI_VENDOR_ID_INTEL, - .pci_subdevice = 0x0b0b, - .config = STAC_D945GTP3 }, /* Intel D945PSN - 3 Stack, 9221 A1 */ - { .pci_subvendor = PCI_VENDOR_ID_INTEL, - .pci_subdevice = 0x0707, - .config = STAC_D945GTP5 }, /* Intel D945PSV - 5 Stack */ - { .pci_subvendor = PCI_VENDOR_ID_INTEL, .pci_subdevice = 0x0404, .config = STAC_D945GTP5 }, /* Intel D945GTP - 5 Stack */ { .pci_subvendor = PCI_VENDOR_ID_INTEL, @@ -384,15 +314,6 @@ 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 */ }; @@ -606,22 +527,6 @@ static int stac92xx_build_pcms(struct hda_codec *codec) return 0; } -static unsigned int stac92xx_get_vref(struct hda_codec *codec, hda_nid_t nid) -{ - unsigned int pincap = snd_hda_param_read(codec, nid, - AC_PAR_PIN_CAP); - pincap = (pincap & AC_PINCAP_VREF) >> AC_PINCAP_VREF_SHIFT; - if (pincap & AC_PINCAP_VREF_100) - return AC_PINCTL_VREF_100; - if (pincap & AC_PINCAP_VREF_80) - return AC_PINCTL_VREF_80; - if (pincap & AC_PINCAP_VREF_50) - return AC_PINCTL_VREF_50; - if (pincap & AC_PINCAP_VREF_GRD) - return AC_PINCTL_VREF_GRD; - return 0; -} - static void stac92xx_auto_set_pinctl(struct hda_codec *codec, hda_nid_t nid, int pin_type) { @@ -659,12 +564,9 @@ static int stac92xx_io_switch_put(struct snd_kcontrol *kcontrol, struct snd_ctl_ if (val) stac92xx_auto_set_pinctl(codec, nid, AC_PINCTL_OUT_EN); - else { - unsigned int pinctl = AC_PINCTL_IN_EN; - if (io_idx) /* set VREF for mic */ - pinctl |= stac92xx_get_vref(codec, nid); - stac92xx_auto_set_pinctl(codec, nid, pinctl); - } + else + stac92xx_auto_set_pinctl(codec, nid, AC_PINCTL_IN_EN); + return 1; } @@ -776,8 +678,7 @@ 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; @@ -790,19 +691,22 @@ static int stac92xx_auto_fill_dac_nids(struct hda_codec *codec, AC_VERB_GET_CONNECT_LIST, 0) & 0xff; } - spec->multiout.num_dacs = cfg->line_outs; + if (cfg->line_outs) + spec->multiout.num_dacs = cfg->line_outs; + else if (cfg->hp_pin) { + spec->multiout.dac_nids[0] = snd_hda_codec_read(codec, cfg->hp_pin, 0, + AC_VERB_GET_CONNECT_LIST, 0) & 0xff; + spec->multiout.num_dacs = 1; + } return 0; } /* 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; @@ -863,7 +767,10 @@ static int stac92xx_auto_create_hp_ctls(struct hda_codec *codec, struct auto_pin wid_caps = get_wcaps(codec, pin); if (wid_caps & AC_WCAP_UNSOL_CAP) - spec->hp_detect = 1; + /* Enable unsolicited responses on the HP widget */ + snd_hda_codec_write(codec, pin, 0, + AC_VERB_SET_UNSOLICITED_ENABLE, + STAC_UNSOL_ENABLE); nid = snd_hda_codec_read(codec, pin, 0, AC_VERB_GET_CONNECT_LIST, 0) & 0xff; for (i = 0; i < cfg->line_outs; i++) { @@ -897,6 +804,9 @@ static int stac92xx_auto_create_analog_input_ctls(struct hda_codec *codec, const for (i = 0; i < AUTO_PIN_LAST; i++) { int index = -1; if (cfg->input_pins[i]) { + /* Enable active pin widget as an input */ + stac92xx_auto_set_pinctl(codec, cfg->input_pins[i], AC_PINCTL_IN_EN); + imux->items[imux->num_items].label = auto_pin_cfg_labels[i]; for (j=0; jnum_muxes; j++) { @@ -914,19 +824,6 @@ 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; } @@ -958,14 +855,14 @@ static int stac92xx_parse_auto_config(struct hda_codec *codec, hda_nid_t dig_out if ((err = snd_hda_parse_pin_def_config(codec, &spec->autocfg, NULL)) < 0) return err; - if (! spec->autocfg.line_outs) + if (! spec->autocfg.line_outs && ! spec->autocfg.hp_pin) return 0; /* can't find valid pin config */ - + stac92xx_auto_init_multi_out(codec); + stac92xx_auto_init_hp_out(codec); if ((err = stac92xx_add_dyn_out_pins(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_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 || @@ -976,10 +873,14 @@ static int stac92xx_parse_auto_config(struct hda_codec *codec, hda_nid_t dig_out if (spec->multiout.max_channels > 2) spec->surr_switch = 1; - if (spec->autocfg.dig_out_pin) + if (spec->autocfg.dig_out_pin) { spec->multiout.dig_out_nid = dig_out; - if (spec->autocfg.dig_in_pin) + stac92xx_auto_set_pinctl(codec, spec->autocfg.dig_out_pin, AC_PINCTL_OUT_EN); + } + if (spec->autocfg.dig_in_pin) { spec->dig_in_nid = dig_in; + stac92xx_auto_set_pinctl(codec, spec->autocfg.dig_in_pin, AC_PINCTL_IN_EN); + } if (spec->kctl_alloc) spec->mixers[spec->num_mixers++] = spec->kctl_alloc; @@ -989,24 +890,6 @@ static int stac92xx_parse_auto_config(struct hda_codec *codec, hda_nid_t dig_out return 1; } -/* add playback controls for HP output */ -static int stac9200_auto_create_hp_ctls(struct hda_codec *codec, - struct auto_pin_cfg *cfg) -{ - struct sigmatel_spec *spec = codec->spec; - hda_nid_t pin = cfg->hp_pin; - unsigned int wid_caps; - - if (! pin) - return 0; - - wid_caps = get_wcaps(codec, pin); - if (wid_caps & AC_WCAP_UNSOL_CAP) - spec->hp_detect = 1; - - return 0; -} - static int stac9200_parse_auto_config(struct hda_codec *codec) { struct sigmatel_spec *spec = codec->spec; @@ -1018,13 +901,14 @@ static int stac9200_parse_auto_config(struct hda_codec *codec) if ((err = stac92xx_auto_create_analog_input_ctls(codec, &spec->autocfg)) < 0) return err; - if ((err = stac9200_auto_create_hp_ctls(codec, &spec->autocfg)) < 0) - return err; - - if (spec->autocfg.dig_out_pin) + if (spec->autocfg.dig_out_pin) { spec->multiout.dig_out_nid = 0x05; - if (spec->autocfg.dig_in_pin) + stac92xx_auto_set_pinctl(codec, spec->autocfg.dig_out_pin, AC_PINCTL_OUT_EN); + } + if (spec->autocfg.dig_in_pin) { spec->dig_in_nid = 0x04; + stac92xx_auto_set_pinctl(codec, spec->autocfg.dig_in_pin, AC_PINCTL_IN_EN); + } if (spec->kctl_alloc) spec->mixers[spec->num_mixers++] = spec->kctl_alloc; @@ -1034,86 +918,12 @@ 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; - struct auto_pin_cfg *cfg = &spec->autocfg; - int i; snd_hda_sequence_write(codec, spec->init); - /* set up pins */ - if (spec->hp_detect) { - /* Enable unsolicited responses on the HP widget */ - snd_hda_codec_write(codec, cfg->hp_pin, 0, - AC_VERB_SET_UNSOLICITED_ENABLE, - STAC_UNSOL_ENABLE); - /* fake event to set up pins */ - codec->patch_ops.unsol_event(codec, STAC_HP_EVENT << 26); - } else { - stac92xx_auto_init_multi_out(codec); - stac92xx_auto_init_hp_out(codec); - } - for (i = 0; i < AUTO_PIN_LAST; i++) { - hda_nid_t nid = cfg->input_pins[i]; - if (nid) { - unsigned int pinctl = AC_PINCTL_IN_EN; - if (i == AUTO_PIN_MIC || i == AUTO_PIN_FRONT_MIC) - pinctl |= stac92xx_get_vref(codec, nid); - stac92xx_auto_set_pinctl(codec, nid, pinctl); - } - } - if (cfg->dig_out_pin) - stac92xx_auto_set_pinctl(codec, cfg->dig_out_pin, - AC_PINCTL_OUT_EN); - if (cfg->dig_in_pin) - 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; } @@ -1263,9 +1073,8 @@ 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 if (stac922x_brd_tbl[spec->board_config] != NULL) { + snd_printdd(KERN_INFO "hda_codec: Unknown model for STAC922x, using BIOS defaults\n"); + else { spec->num_pins = 10; spec->pin_nids = stac922x_pin_nids; spec->pin_configs = stac922x_brd_tbl[spec->board_config]; @@ -1280,25 +1089,6 @@ 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) { @@ -1306,9 +1096,6 @@ 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; @@ -1354,166 +1141,6 @@ static int patch_stac927x(struct hda_codec *codec) return 0; } -/* - * STAC 7661(?) hack - */ - -/* static config for Sony VAIO FE550G */ -static hda_nid_t vaio_dacs[] = { 0x2 }; -#define VAIO_HP_DAC 0x5 -static hda_nid_t vaio_adcs[] = { 0x8 /*,0x6*/ }; -static hda_nid_t vaio_mux_nids[] = { 0x15 }; - -static struct hda_input_mux vaio_mux = { - .num_items = 2, - .items = { - /* { "HP", 0x0 }, */ - { "Line", 0x1 }, - { "Mic", 0x2 }, - { "PCM", 0x3 }, - } -}; - -static struct hda_verb vaio_init[] = { - {0x0a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP }, /* HP <- 0x2 */ - {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, /* Speaker <- 0x5 */ - {0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, /* Mic? (<- 0x2) */ - {0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN }, /* CD */ - {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, /* Mic? */ - {0x15, AC_VERB_SET_CONNECT_SEL, 0x2}, /* mic-sel: 0a,0d,14,02 */ - {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, /* HP */ - {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, /* Speaker */ - {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* capture sw/vol -> 0x8 */ - {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, /* CD-in -> 0x6 */ - {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Mic-in -> 0x9 */ - {} -}; - -/* bind volumes of both NID 0x02 and 0x05 */ -static int vaio_master_vol_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct hda_codec *codec = snd_kcontrol_chip(kcontrol); - long *valp = ucontrol->value.integer.value; - int change; - - change = snd_hda_codec_amp_update(codec, 0x02, 0, HDA_OUTPUT, 0, - 0x7f, valp[0] & 0x7f); - change |= snd_hda_codec_amp_update(codec, 0x02, 1, HDA_OUTPUT, 0, - 0x7f, valp[1] & 0x7f); - snd_hda_codec_amp_update(codec, 0x05, 0, HDA_OUTPUT, 0, - 0x7f, valp[0] & 0x7f); - snd_hda_codec_amp_update(codec, 0x05, 1, HDA_OUTPUT, 0, - 0x7f, valp[1] & 0x7f); - return change; -} - -/* bind volumes of both NID 0x02 and 0x05 */ -static int vaio_master_sw_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct hda_codec *codec = snd_kcontrol_chip(kcontrol); - long *valp = ucontrol->value.integer.value; - int change; - - change = snd_hda_codec_amp_update(codec, 0x02, 0, HDA_OUTPUT, 0, - 0x80, (valp[0] ? 0 : 0x80)); - change |= snd_hda_codec_amp_update(codec, 0x02, 1, HDA_OUTPUT, 0, - 0x80, (valp[1] ? 0 : 0x80)); - snd_hda_codec_amp_update(codec, 0x05, 0, HDA_OUTPUT, 0, - 0x80, (valp[0] ? 0 : 0x80)); - snd_hda_codec_amp_update(codec, 0x05, 1, HDA_OUTPUT, 0, - 0x80, (valp[1] ? 0 : 0x80)); - return change; -} - -static struct snd_kcontrol_new vaio_mixer[] = { - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "Master Playback Volume", - .info = snd_hda_mixer_amp_volume_info, - .get = snd_hda_mixer_amp_volume_get, - .put = vaio_master_vol_put, - .private_value = HDA_COMPOSE_AMP_VAL(0x02, 3, 0, HDA_OUTPUT), - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "Master Playback Switch", - .info = snd_hda_mixer_amp_switch_info, - .get = snd_hda_mixer_amp_switch_get, - .put = vaio_master_sw_put, - .private_value = HDA_COMPOSE_AMP_VAL(0x02, 3, 0, HDA_OUTPUT), - }, - /* HDA_CODEC_VOLUME("CD Capture Volume", 0x07, 0, HDA_INPUT), */ - HDA_CODEC_VOLUME("Capture Volume", 0x09, 0, HDA_INPUT), - HDA_CODEC_MUTE("Capture Switch", 0x09, 0, HDA_INPUT), - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "Capture Source", - .count = 1, - .info = stac92xx_mux_enum_info, - .get = stac92xx_mux_enum_get, - .put = stac92xx_mux_enum_put, - }, - {} -}; - -static struct hda_codec_ops stac7661_patch_ops = { - .build_controls = stac92xx_build_controls, - .build_pcms = stac92xx_build_pcms, - .init = stac92xx_init, - .free = stac92xx_free, -#ifdef CONFIG_PM - .resume = stac92xx_resume, -#endif -}; - -enum { STAC7661_VAIO }; - -static struct hda_board_config stac7661_cfg_tbl[] = { - { .modelname = "vaio", .config = STAC7661_VAIO }, - { .pci_subvendor = 0x104d, .pci_subdevice = 0x81e6, - .config = STAC7661_VAIO }, - { .pci_subvendor = 0x104d, .pci_subdevice = 0x81ef, - .config = STAC7661_VAIO }, - {} -}; - -static int patch_stac7661(struct hda_codec *codec) -{ - struct sigmatel_spec *spec; - int board_config; - - board_config = snd_hda_check_board_config(codec, stac7661_cfg_tbl); - if (board_config < 0) - /* unknown config, let generic-parser do its job... */ - return snd_hda_parse_generic_codec(codec); - - spec = kzalloc(sizeof(*spec), GFP_KERNEL); - if (spec == NULL) - return -ENOMEM; - - codec->spec = spec; - switch (board_config) { - case STAC7661_VAIO: - spec->mixer = vaio_mixer; - spec->init = vaio_init; - spec->multiout.max_channels = 2; - spec->multiout.num_dacs = ARRAY_SIZE(vaio_dacs); - spec->multiout.dac_nids = vaio_dacs; - spec->multiout.hp_nid = VAIO_HP_DAC; - spec->num_adcs = ARRAY_SIZE(vaio_adcs); - spec->adc_nids = vaio_adcs; - spec->input_mux = &vaio_mux; - spec->mux_nids = vaio_mux_nids; - break; - } - - codec->patch_ops = stac7661_patch_ops; - return 0; -} - - /* * patch entries */ @@ -1525,12 +1152,6 @@ 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 }, @@ -1541,6 +1162,5 @@ struct hda_codec_preset snd_hda_preset_sigmatel[] = { { .id = 0x83847627, .name = "STAC9271D", .patch = patch_stac927x }, { .id = 0x83847628, .name = "STAC9274X5NH", .patch = patch_stac927x }, { .id = 0x83847629, .name = "STAC9274D5NH", .patch = patch_stac927x }, - { .id = 0x83847661, .name = "STAC7661", .patch = patch_stac7661 }, {} /* terminator */ }; diff --git a/sound/pci/ice1712/aureon.c b/sound/pci/ice1712/aureon.c index 9492f3d24..8809812a1 100644 --- a/sound/pci/ice1712/aureon.c +++ b/sound/pci/ice1712/aureon.c @@ -53,8 +53,6 @@ #include #include #include -#include - #include #include "ice1712.h" @@ -87,151 +85,7 @@ #define CS8415_C_BUFFER 0x20 #define CS8415_ID 0x7F -/* PCA9554 registers */ -#define PCA9554_DEV 0x40 /* I2C device address */ -#define PCA9554_IN 0x00 /* input port */ -#define PCA9554_OUT 0x01 /* output port */ -#define PCA9554_INVERT 0x02 /* input invert */ -#define PCA9554_DIR 0x03 /* port directions */ - -/* - * Aureon Universe additional controls using PCA9554 - */ - -/* - * Send data to pca9554 - */ -static void aureon_pca9554_write(struct snd_ice1712 *ice, unsigned char reg, - unsigned char data) -{ - unsigned int tmp; - int i, j; - unsigned char dev = PCA9554_DEV; /* ID 0100000, write */ - unsigned char val = 0; - - tmp = snd_ice1712_gpio_read(ice); - - snd_ice1712_gpio_set_mask(ice, ~(AUREON_SPI_MOSI|AUREON_SPI_CLK| - AUREON_WM_RW|AUREON_WM_CS| - AUREON_CS8415_CS)); - tmp |= AUREON_WM_RW; - tmp |= AUREON_CS8415_CS | AUREON_WM_CS; /* disable SPI devices */ - - tmp &= ~AUREON_SPI_MOSI; - tmp &= ~AUREON_SPI_CLK; - snd_ice1712_gpio_write(ice, tmp); - udelay(50); - - /* - * send i2c stop condition and start condition - * to obtain sane state - */ - tmp |= AUREON_SPI_CLK; - snd_ice1712_gpio_write(ice, tmp); - udelay(50); - tmp |= AUREON_SPI_MOSI; - snd_ice1712_gpio_write(ice, tmp); - udelay(100); - tmp &= ~AUREON_SPI_MOSI; - snd_ice1712_gpio_write(ice, tmp); - udelay(50); - tmp &= ~AUREON_SPI_CLK; - snd_ice1712_gpio_write(ice, tmp); - udelay(100); - /* - * send device address, command and value, - * skipping ack cycles inbetween - */ - for (j = 0; j < 3; j++) { - switch(j) { - case 0: val = dev; break; - case 1: val = reg; break; - case 2: val = data; break; - } - for (i = 7; i >= 0; i--) { - tmp &= ~AUREON_SPI_CLK; - snd_ice1712_gpio_write(ice, tmp); - udelay(40); - if (val & (1 << i)) - tmp |= AUREON_SPI_MOSI; - else - tmp &= ~AUREON_SPI_MOSI; - snd_ice1712_gpio_write(ice, tmp); - udelay(40); - tmp |= AUREON_SPI_CLK; - snd_ice1712_gpio_write(ice, tmp); - udelay(40); - } - tmp &= ~AUREON_SPI_CLK; - snd_ice1712_gpio_write(ice, tmp); - udelay(40); - tmp |= AUREON_SPI_CLK; - snd_ice1712_gpio_write(ice, tmp); - udelay(40); - tmp &= ~AUREON_SPI_CLK; - snd_ice1712_gpio_write(ice, tmp); - udelay(40); - } - tmp &= ~AUREON_SPI_CLK; - snd_ice1712_gpio_write(ice, tmp); - udelay(40); - tmp &= ~AUREON_SPI_MOSI; - snd_ice1712_gpio_write(ice, tmp); - udelay(40); - tmp |= AUREON_SPI_CLK; - snd_ice1712_gpio_write(ice, tmp); - udelay(50); - tmp |= AUREON_SPI_MOSI; - snd_ice1712_gpio_write(ice, tmp); - udelay(100); -} - -static int aureon_universe_inmux_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - char *texts[3] = {"Internal Aux", "Wavetable", "Rear Line-In"}; - - uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; - uinfo->count = 1; - uinfo->value.enumerated.items = 3; - if(uinfo->value.enumerated.item >= uinfo->value.enumerated.items) - uinfo->value.enumerated.item = uinfo->value.enumerated.items - 1; - strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]); - return 0; -} - -static int aureon_universe_inmux_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); - ucontrol->value.integer.value[0] = ice->spec.aureon.pca9554_out; - return 0; -} - -static int aureon_universe_inmux_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); - unsigned char oval, nval; - int change; - - snd_ice1712_save_gpio_status(ice); - - oval = ice->spec.aureon.pca9554_out; - nval = ucontrol->value.integer.value[0]; - if ((change = (oval != nval))) { - aureon_pca9554_write(ice, PCA9554_OUT, nval); - ice->spec.aureon.pca9554_out = nval; - } - snd_ice1712_restore_gpio_status(ice); - - return change; -} - - -static void aureon_ac97_write(struct snd_ice1712 *ice, unsigned short reg, - unsigned short val) -{ +static void aureon_ac97_write(struct snd_ice1712 *ice, unsigned short reg, unsigned short val) { unsigned int tmp; /* Send address to XILINX chip */ @@ -290,8 +144,7 @@ static unsigned short aureon_ac97_read(struct snd_ice1712 *ice, unsigned short r /* * Initialize STAC9744 chip */ -static int aureon_ac97_init (struct snd_ice1712 *ice) -{ +static int aureon_ac97_init (struct snd_ice1712 *ice) { int i; static unsigned short ac97_defaults[] = { 0x00, 0x9640, @@ -357,14 +210,14 @@ static int aureon_ac97_vol_get(struct snd_kcontrol *kcontrol, struct snd_ctl_ele struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); unsigned short vol; - mutex_lock(&ice->gpio_mutex); + down(&ice->gpio_mutex); vol = aureon_ac97_read(ice, kcontrol->private_value & 0x7F); ucontrol->value.integer.value[0] = 0x1F - (vol & 0x1F); if (kcontrol->private_value & AUREON_AC97_STEREO) ucontrol->value.integer.value[1] = 0x1F - ((vol >> 8) & 0x1F); - mutex_unlock(&ice->gpio_mutex); + up(&ice->gpio_mutex); return 0; } @@ -399,11 +252,11 @@ static int aureon_ac97_mute_get(struct snd_kcontrol *kcontrol, struct snd_ctl_el { struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); - mutex_lock(&ice->gpio_mutex); + down(&ice->gpio_mutex); ucontrol->value.integer.value[0] = aureon_ac97_read(ice, kcontrol->private_value & 0x7F) & 0x8000 ? 0 : 1; - mutex_unlock(&ice->gpio_mutex); + up(&ice->gpio_mutex); return 0; } @@ -435,11 +288,11 @@ static int aureon_ac97_micboost_get(struct snd_kcontrol *kcontrol, struct snd_ct { struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); - mutex_lock(&ice->gpio_mutex); + down(&ice->gpio_mutex); ucontrol->value.integer.value[0] = aureon_ac97_read(ice, AC97_MIC) & 0x0020 ? 0 : 1; - mutex_unlock(&ice->gpio_mutex); + up(&ice->gpio_mutex); return 0; } @@ -469,48 +322,36 @@ static void aureon_spi_write(struct snd_ice1712 *ice, unsigned int cs, unsigned { unsigned int tmp; int i; - unsigned int mosi, clk; tmp = snd_ice1712_gpio_read(ice); - if (ice->eeprom.subvendor == VT1724_SUBDEVICE_PRODIGY71LT) { - snd_ice1712_gpio_set_mask(ice, ~(PRODIGY_SPI_MOSI|PRODIGY_SPI_CLK|PRODIGY_WM_CS)); - mosi = PRODIGY_SPI_MOSI; - clk = PRODIGY_SPI_CLK; - } - else { - snd_ice1712_gpio_set_mask(ice, ~(AUREON_WM_RW|AUREON_SPI_MOSI|AUREON_SPI_CLK| - AUREON_WM_CS|AUREON_CS8415_CS)); - mosi = AUREON_SPI_MOSI; - clk = AUREON_SPI_CLK; - - tmp |= AUREON_WM_RW; - } - + snd_ice1712_gpio_set_mask(ice, ~(AUREON_WM_RW|AUREON_SPI_MOSI|AUREON_SPI_CLK| + AUREON_WM_CS|AUREON_CS8415_CS)); + tmp |= AUREON_WM_RW; tmp &= ~cs; snd_ice1712_gpio_write(ice, tmp); udelay(1); for (i = bits - 1; i >= 0; i--) { - tmp &= ~clk; + tmp &= ~AUREON_SPI_CLK; snd_ice1712_gpio_write(ice, tmp); udelay(1); if (data & (1 << i)) - tmp |= mosi; + tmp |= AUREON_SPI_MOSI; else - tmp &= ~mosi; + tmp &= ~AUREON_SPI_MOSI; snd_ice1712_gpio_write(ice, tmp); udelay(1); - tmp |= clk; + tmp |= AUREON_SPI_CLK; snd_ice1712_gpio_write(ice, tmp); udelay(1); } - tmp &= ~clk; + tmp &= ~AUREON_SPI_CLK; tmp |= cs; snd_ice1712_gpio_write(ice, tmp); udelay(1); - tmp |= clk; + tmp |= AUREON_SPI_CLK; snd_ice1712_gpio_write(ice, tmp); udelay(1); } @@ -599,9 +440,7 @@ static unsigned short wm_get(struct snd_ice1712 *ice, int reg) */ static void wm_put_nocache(struct snd_ice1712 *ice, int reg, unsigned short val) { - aureon_spi_write(ice, - (ice->eeprom.subvendor == VT1724_SUBDEVICE_PRODIGY71LT ? PRODIGY_WM_CS : AUREON_WM_CS), - (reg << 9) | (val & 0x1ff), 16); + aureon_spi_write(ice, AUREON_WM_CS, (reg << 9) | (val & 0x1ff), 16); } /* @@ -635,11 +474,11 @@ static int aureon_ac97_mmute_get(struct snd_kcontrol *kcontrol, struct snd_ctl_e { struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); - mutex_lock(&ice->gpio_mutex); + down(&ice->gpio_mutex); ucontrol->value.integer.value[0] = (wm_get(ice, WM_OUT_MUX1) >> 1) & 0x01; - mutex_unlock(&ice->gpio_mutex); + up(&ice->gpio_mutex); return 0; } @@ -704,9 +543,9 @@ static int wm_pcm_mute_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_va { struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); - mutex_lock(&ice->gpio_mutex); + down(&ice->gpio_mutex); ucontrol->value.integer.value[0] = (wm_get(ice, WM_MUTE) & 0x10) ? 0 : 1; - mutex_unlock(&ice->gpio_mutex); + up(&ice->gpio_mutex); return 0; } @@ -929,11 +768,11 @@ static int wm_pcm_vol_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_val struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); unsigned short val; - mutex_lock(&ice->gpio_mutex); + down(&ice->gpio_mutex); val = wm_get(ice, WM_DAC_DIG_MASTER_ATTEN) & 0xff; val = val > PCM_MIN ? (val - PCM_MIN) : 0; ucontrol->value.integer.value[0] = val; - mutex_unlock(&ice->gpio_mutex); + up(&ice->gpio_mutex); return 0; } @@ -974,12 +813,12 @@ static int wm_adc_mute_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_va unsigned short val; int i; - mutex_lock(&ice->gpio_mutex); + down(&ice->gpio_mutex); for (i = 0; i < 2; i++) { val = wm_get(ice, WM_ADC_GAIN + i); ucontrol->value.integer.value[i] = ~val>>5 & 0x1; } - mutex_unlock(&ice->gpio_mutex); + up(&ice->gpio_mutex); return 0; } @@ -1021,13 +860,13 @@ static int wm_adc_vol_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_val int i, idx; unsigned short vol; - mutex_lock(&ice->gpio_mutex); + down(&ice->gpio_mutex); for (i = 0; i < 2; i++) { idx = WM_ADC_GAIN + i; vol = wm_get(ice, idx) & 0x1f; ucontrol->value.integer.value[i] = vol; } - mutex_unlock(&ice->gpio_mutex); + up(&ice->gpio_mutex); return 0; } @@ -1098,11 +937,11 @@ static int wm_adc_mux_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_val struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); unsigned short val; - mutex_lock(&ice->gpio_mutex); + down(&ice->gpio_mutex); val = wm_get(ice, WM_ADC_MUX); - ucontrol->value.enumerated.item[0] = val & 7; - ucontrol->value.enumerated.item[1] = (val >> 4) & 7; - mutex_unlock(&ice->gpio_mutex); + ucontrol->value.integer.value[0] = val & 7; + ucontrol->value.integer.value[1] = (val >> 4) & 7; + up(&ice->gpio_mutex); return 0; } @@ -1115,8 +954,8 @@ static int wm_adc_mux_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_val snd_ice1712_save_gpio_status(ice); oval = wm_get(ice, WM_ADC_MUX); nval = oval & ~0x77; - nval |= ucontrol->value.enumerated.item[0] & 7; - nval |= (ucontrol->value.enumerated.item[1] & 7) << 4; + nval |= ucontrol->value.integer.value[0] & 7; + nval |= (ucontrol->value.integer.value[1] & 7) << 4; change = (oval != nval); if (change) wm_put(ice, WM_ADC_MUX, nval); @@ -1156,7 +995,7 @@ static int aureon_cs8415_mux_get(struct snd_kcontrol *kcontrol, struct snd_ctl_e //snd_ice1712_save_gpio_status(ice); //val = aureon_cs8415_get(ice, CS8415_CTRL2); - ucontrol->value.enumerated.item[0] = ice->spec.aureon.cs8415_mux; + ucontrol->value.integer.value[0] = ice->spec.aureon.cs8415_mux; //snd_ice1712_restore_gpio_status(ice); return 0; } @@ -1170,12 +1009,12 @@ static int aureon_cs8415_mux_put(struct snd_kcontrol *kcontrol, struct snd_ctl_e snd_ice1712_save_gpio_status(ice); oval = aureon_cs8415_get(ice, CS8415_CTRL2); nval = oval & ~0x07; - nval |= ucontrol->value.enumerated.item[0] & 7; + nval |= ucontrol->value.integer.value[0] & 7; change = (oval != nval); if (change) aureon_cs8415_put(ice, CS8415_CTRL2, nval); snd_ice1712_restore_gpio_status(ice); - ice->spec.aureon.cs8415_mux = ucontrol->value.enumerated.item[0]; + ice->spec.aureon.cs8415_mux = ucontrol->value.integer.value[0]; return change; } @@ -1281,15 +1120,9 @@ static int aureon_set_headphone_amp(struct snd_ice1712 *ice, int enable) tmp2 = tmp = snd_ice1712_gpio_read(ice); if (enable) - if (ice->eeprom.subvendor != VT1724_SUBDEVICE_PRODIGY71LT) - tmp |= AUREON_HP_SEL; - else - tmp |= PRODIGY_HP_SEL; + tmp |= AUREON_HP_SEL; else - if (ice->eeprom.subvendor != VT1724_SUBDEVICE_PRODIGY71LT) - tmp &= ~ AUREON_HP_SEL; - else - tmp &= ~ PRODIGY_HP_SEL; + tmp &= ~ AUREON_HP_SEL; if (tmp != tmp2) { snd_ice1712_gpio_write(ice, tmp); return 1; @@ -1749,15 +1582,7 @@ static struct snd_kcontrol_new universe_ac97_controls[] __devinitdata = { .get = aureon_ac97_vol_get, .put = aureon_ac97_vol_put, .private_value = AC97_VIDEO|AUREON_AC97_STEREO - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "Aux Source", - .info = aureon_universe_inmux_info, - .get = aureon_universe_inmux_get, - .put = aureon_universe_inmux_put - } - + } }; @@ -1834,7 +1659,7 @@ static int __devinit aureon_add_controls(struct snd_ice1712 *ice) return err; } } - else if (ice->eeprom.subvendor != VT1724_SUBDEVICE_PRODIGY71LT) { + else { for (i = 0; i < ARRAY_SIZE(ac97_controls); i++) { err = snd_ctl_add(ice->card, snd_ctl_new1(&ac97_controls[i], ice)); if (err < 0) @@ -1842,7 +1667,7 @@ static int __devinit aureon_add_controls(struct snd_ice1712 *ice) } } - if (ice->eeprom.subvendor != VT1724_SUBDEVICE_PRODIGY71LT) { + { unsigned char id; snd_ice1712_save_gpio_status(ice); id = aureon_cs8415_get(ice, CS8415_ID); @@ -1997,8 +1822,7 @@ static int __devinit aureon_init(struct snd_ice1712 *ice) udelay(1); /* initialize WM8770 codec */ - if (ice->eeprom.subvendor == VT1724_SUBDEVICE_PRODIGY71 || - ice->eeprom.subvendor == VT1724_SUBDEVICE_PRODIGY71LT) + if (ice->eeprom.subvendor == VT1724_SUBDEVICE_PRODIGY71) p = wm_inits_prodigy; else p = wm_inits_aureon; @@ -2006,19 +1830,13 @@ static int __devinit aureon_init(struct snd_ice1712 *ice) wm_put(ice, p[0], p[1]); /* initialize CS8415A codec */ - if (ice->eeprom.subvendor != VT1724_SUBDEVICE_PRODIGY71LT) { - for (p = cs_inits; *p != (unsigned short)-1; p++) - aureon_spi_write(ice, AUREON_CS8415_CS, *p | 0x200000, 24); - ice->spec.aureon.cs8415_mux = 1; + for (p = cs_inits; *p != (unsigned short)-1; p++) + aureon_spi_write(ice, AUREON_CS8415_CS, *p | 0x200000, 24); + ice->spec.aureon.cs8415_mux = 1; - aureon_set_headphone_amp(ice, 1); - } + aureon_set_headphone_amp(ice, 1); snd_ice1712_restore_gpio_status(ice); - - /* initialize PCA9554 pin directions & set default input*/ - aureon_pca9554_write(ice, PCA9554_DIR, 0x00); - aureon_pca9554_write(ice, PCA9554_OUT, 0x00); /* internal AUX */ ice->spec.aureon.master[0] = WM_VOL_MUTE; ice->spec.aureon.master[1] = WM_VOL_MUTE; @@ -2084,23 +1902,6 @@ static unsigned char prodigy71_eeprom[] __devinitdata = { 0x00, /* GPIO_STATE2 */ }; -static unsigned char prodigy71lt_eeprom[] __devinitdata = { - 0x4b, /* SYSCINF: clock 512, spdif-in/ADC, 4DACs */ - 0x80, /* ACLINK: I2S */ - 0xfc, /* I2S: vol, 96k, 24bit, 192k */ - 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 */ -}; - - /* entry point */ struct snd_ice1712_card_info snd_vt1724_aureon_cards[] __devinitdata = { { @@ -2131,7 +1932,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 = "Aureon71Univ", /* keep in 15 letters */ + .driver = "Aureon71Universe", }, { .subvendor = VT1724_SUBDEVICE_PRODIGY71, @@ -2143,15 +1944,5 @@ struct snd_ice1712_card_info snd_vt1724_aureon_cards[] __devinitdata = { .eeprom_data = prodigy71_eeprom, .driver = "Prodigy71", /* should be identical with Aureon71 */ }, - { - .subvendor = VT1724_SUBDEVICE_PRODIGY71LT, - .name = "Audiotrak Prodigy 7.1 LT", - .model = "prodigy71lt", - .chip_init = aureon_init, - .build_controls = aureon_add_controls, - .eeprom_size = sizeof(prodigy71lt_eeprom), - .eeprom_data = prodigy71lt_eeprom, - .driver = "Prodigy71LT", - }, { } /* terminator */ }; diff --git a/sound/pci/ice1712/aureon.h b/sound/pci/ice1712/aureon.h index 3b7bea656..95d515f36 100644 --- a/sound/pci/ice1712/aureon.h +++ b/sound/pci/ice1712/aureon.h @@ -27,14 +27,12 @@ #define AUREON_DEVICE_DESC "{Terratec,Aureon 5.1 Sky},"\ "{Terratec,Aureon 7.1 Space},"\ "{Terratec,Aureon 7.1 Universe}," \ - "{AudioTrak,Prodigy 7.1}," \ - "{AudioTrak,Prodigy 7.1 LT}," + "{AudioTrak,Prodigy 7.1}," #define VT1724_SUBDEVICE_AUREON51_SKY 0x3b154711 /* Aureon 5.1 Sky */ #define VT1724_SUBDEVICE_AUREON71_SPACE 0x3b154511 /* Aureon 7.1 Space */ #define VT1724_SUBDEVICE_AUREON71_UNIVERSE 0x3b155311 /* Aureon 7.1 Universe */ #define VT1724_SUBDEVICE_PRODIGY71 0x33495345 /* PRODIGY 7.1 */ -#define VT1724_SUBDEVICE_PRODIGY71LT 0x32315441 /* PRODIGY 7.1 LT */ extern struct snd_ice1712_card_info snd_vt1724_aureon_cards[]; @@ -55,9 +53,4 @@ extern struct snd_ice1712_card_info snd_vt1724_aureon_cards[]; #define AUREON_AC97_DATA_HIGH (1 << 8) #define AUREON_AC97_DATA_MASK 0xFF -#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/delta.c b/sound/pci/ice1712/delta.c index af659800c..9a51d34e6 100644 --- a/sound/pci/ice1712/delta.c +++ b/sound/pci/ice1712/delta.c @@ -28,8 +28,6 @@ #include #include #include -#include - #include #include #include @@ -132,13 +130,13 @@ static int ap_cs8427_sendbytes(struct snd_i2c_device *device, unsigned char *byt int res = count; unsigned char tmp; - mutex_lock(&ice->gpio_mutex); + down(&ice->gpio_mutex); tmp = ap_cs8427_codec_select(ice); ap_cs8427_write_byte(ice, (device->addr << 1) | 0, tmp); /* address + write mode */ while (count-- > 0) ap_cs8427_write_byte(ice, *bytes++, tmp); ap_cs8427_codec_deassert(ice, tmp); - mutex_unlock(&ice->gpio_mutex); + up(&ice->gpio_mutex); return res; } @@ -149,13 +147,13 @@ static int ap_cs8427_readbytes(struct snd_i2c_device *device, unsigned char *byt int res = count; unsigned char tmp; - mutex_lock(&ice->gpio_mutex); + down(&ice->gpio_mutex); tmp = ap_cs8427_codec_select(ice); ap_cs8427_write_byte(ice, (device->addr << 1) | 1, tmp); /* address + read mode */ while (count-- > 0) *bytes++ = ap_cs8427_read_byte(ice, tmp); ap_cs8427_codec_deassert(ice, tmp); - mutex_unlock(&ice->gpio_mutex); + up(&ice->gpio_mutex); return res; } @@ -182,7 +180,7 @@ static void snd_ice1712_delta_cs8403_spdif_write(struct snd_ice1712 *ice, unsign /* send byte to transmitter */ mask1 = ICE1712_DELTA_SPDIF_OUT_STAT_CLOCK; mask2 = ICE1712_DELTA_SPDIF_OUT_STAT_DATA; - mutex_lock(&ice->gpio_mutex); + down(&ice->gpio_mutex); tmp = snd_ice1712_read(ice, ICE1712_IREG_GPIO_DATA); for (idx = 7; idx >= 0; idx--) { tmp &= ~(mask1 | mask2); @@ -196,7 +194,7 @@ static void snd_ice1712_delta_cs8403_spdif_write(struct snd_ice1712 *ice, unsign } tmp &= ~mask1; snd_ice1712_write(ice, ICE1712_IREG_GPIO_DATA, tmp); - mutex_unlock(&ice->gpio_mutex); + up(&ice->gpio_mutex); } @@ -298,14 +296,14 @@ static void delta_1010_set_rate_val(struct snd_ice1712 *ice, unsigned int rate) if (rate == 0) /* no hint - S/PDIF input is master, simply return */ return; - mutex_lock(&ice->gpio_mutex); + down(&ice->gpio_mutex); tmp = snd_ice1712_read(ice, ICE1712_IREG_GPIO_DATA); tmp2 = tmp & ~ICE1712_DELTA_DFS; if (rate > 48000) tmp2 |= ICE1712_DELTA_DFS; if (tmp != tmp2) snd_ice1712_write(ice, ICE1712_IREG_GPIO_DATA, tmp2); - mutex_unlock(&ice->gpio_mutex); + up(&ice->gpio_mutex); } /* @@ -320,9 +318,9 @@ static void delta_ak4524_set_rate_val(struct snd_akm4xxx *ak, unsigned int rate) return; /* check before reset ak4524 to avoid unnecessary clicks */ - mutex_lock(&ice->gpio_mutex); + down(&ice->gpio_mutex); tmp = snd_ice1712_read(ice, ICE1712_IREG_GPIO_DATA); - mutex_unlock(&ice->gpio_mutex); + up(&ice->gpio_mutex); tmp2 = tmp & ~ICE1712_DELTA_DFS; if (rate > 48000) tmp2 |= ICE1712_DELTA_DFS; @@ -331,12 +329,12 @@ static void delta_ak4524_set_rate_val(struct snd_akm4xxx *ak, unsigned int rate) /* do it again */ snd_akm4xxx_reset(ak, 1); - mutex_lock(&ice->gpio_mutex); + down(&ice->gpio_mutex); tmp = snd_ice1712_read(ice, ICE1712_IREG_GPIO_DATA) & ~ICE1712_DELTA_DFS; if (rate > 48000) tmp |= ICE1712_DELTA_DFS; snd_ice1712_write(ice, ICE1712_IREG_GPIO_DATA, tmp); - mutex_unlock(&ice->gpio_mutex); + up(&ice->gpio_mutex); snd_akm4xxx_reset(ak, 0); } @@ -393,37 +391,6 @@ static void delta_setup_spdif(struct snd_ice1712 *ice, int rate) snd_ice1712_delta_cs8403_spdif_write(ice, tmp); } -static int snd_ice1712_delta1010lt_wordclock_status_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN; - uinfo->count = 1; - uinfo->value.integer.min = 0; - uinfo->value.integer.max = 1; - return 0; -} - -static int snd_ice1712_delta1010lt_wordclock_status_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - char reg = 0x10; // cs8427 receiver error register - struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); - - if (snd_i2c_sendbytes(ice->cs8427, ®, 1) != 1) - snd_printk(KERN_ERR "unable to send register 0x%x byte to CS8427\n", reg); - snd_i2c_readbytes(ice->cs8427, ®, 1); - ucontrol->value.integer.value[0] = (reg ? 1 : 0); - return 0; -} - -static struct snd_kcontrol_new snd_ice1712_delta1010lt_wordclock_status __devinitdata = -{ - .access = (SNDRV_CTL_ELEM_ACCESS_READ), - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "Word Clock Status", - .info = snd_ice1712_delta1010lt_wordclock_status_info, - .get = snd_ice1712_delta1010lt_wordclock_status_get, -}; /* * initialize the chips on M-Audio cards @@ -653,7 +620,7 @@ static int __devinit snd_ice1712_delta_init(struct snd_ice1712 *ice) static struct snd_kcontrol_new snd_ice1712_delta1010_wordclock_select __devinitdata = ICE1712_GPIO(SNDRV_CTL_ELEM_IFACE_MIXER, "Word Clock Sync", 0, ICE1712_DELTA_WORD_CLOCK_SELECT, 1, 0); static struct snd_kcontrol_new snd_ice1712_delta1010lt_wordclock_select __devinitdata = -ICE1712_GPIO(SNDRV_CTL_ELEM_IFACE_MIXER, "Word Clock Sync", 0, ICE1712_DELTA_1010LT_WORDCLOCK, 0, 0); +ICE1712_GPIO(SNDRV_CTL_ELEM_IFACE_MIXER, "Word Clock Sync", 0, ICE1712_DELTA_1010LT_WORDCLOCK, 1, 0); static struct snd_kcontrol_new snd_ice1712_delta1010_wordclock_status __devinitdata = ICE1712_GPIO(SNDRV_CTL_ELEM_IFACE_MIXER, "Word Clock Status", 0, ICE1712_DELTA_WORD_CLOCK_STATUS, 1, SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE); static struct snd_kcontrol_new snd_ice1712_deltadio2496_spdif_in_select __devinitdata = @@ -684,9 +651,6 @@ static int __devinit snd_ice1712_delta_add_controls(struct snd_ice1712 *ice) break; case ICE1712_SUBDEVICE_DELTA1010LT: err = snd_ctl_add(ice->card, snd_ctl_new1(&snd_ice1712_delta1010lt_wordclock_select, ice)); - if (err < 0) - return err; - err = snd_ctl_add(ice->card, snd_ctl_new1(&snd_ice1712_delta1010lt_wordclock_status, ice)); if (err < 0) return err; break; diff --git a/sound/pci/ice1712/ews.c b/sound/pci/ice1712/ews.c index b135389fe..2c529e741 100644 --- a/sound/pci/ice1712/ews.c +++ b/sound/pci/ice1712/ews.c @@ -1031,9 +1031,6 @@ 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/hoontech.c b/sound/pci/ice1712/hoontech.c index 3f27d04e7..3f2f91853 100644 --- a/sound/pci/ice1712/hoontech.c +++ b/sound/pci/ice1712/hoontech.c @@ -27,8 +27,6 @@ #include #include #include -#include - #include #include "ice1712.h" @@ -50,31 +48,31 @@ static void __devinit snd_ice1712_stdsp24_gpio_write(struct snd_ice1712 *ice, un static void __devinit snd_ice1712_stdsp24_darear(struct snd_ice1712 *ice, int activate) { - mutex_lock(&ice->gpio_mutex); + down(&ice->gpio_mutex); ICE1712_STDSP24_0_DAREAR(ice->spec.hoontech.boxbits, activate); snd_ice1712_stdsp24_gpio_write(ice, ice->spec.hoontech.boxbits[0]); - mutex_unlock(&ice->gpio_mutex); + up(&ice->gpio_mutex); } static void __devinit snd_ice1712_stdsp24_mute(struct snd_ice1712 *ice, int activate) { - mutex_lock(&ice->gpio_mutex); + down(&ice->gpio_mutex); ICE1712_STDSP24_3_MUTE(ice->spec.hoontech.boxbits, activate); snd_ice1712_stdsp24_gpio_write(ice, ice->spec.hoontech.boxbits[3]); - mutex_unlock(&ice->gpio_mutex); + up(&ice->gpio_mutex); } static void __devinit snd_ice1712_stdsp24_insel(struct snd_ice1712 *ice, int activate) { - mutex_lock(&ice->gpio_mutex); + down(&ice->gpio_mutex); ICE1712_STDSP24_3_INSEL(ice->spec.hoontech.boxbits, activate); snd_ice1712_stdsp24_gpio_write(ice, ice->spec.hoontech.boxbits[3]); - mutex_unlock(&ice->gpio_mutex); + up(&ice->gpio_mutex); } static void __devinit snd_ice1712_stdsp24_box_channel(struct snd_ice1712 *ice, int box, int chn, int activate) { - mutex_lock(&ice->gpio_mutex); + down(&ice->gpio_mutex); /* select box */ ICE1712_STDSP24_0_BOX(ice->spec.hoontech.boxbits, box); @@ -117,12 +115,12 @@ static void __devinit snd_ice1712_stdsp24_box_channel(struct snd_ice1712 *ice, i ICE1712_STDSP24_2_MIDI1(ice->spec.hoontech.boxbits, 0); snd_ice1712_stdsp24_gpio_write(ice, ice->spec.hoontech.boxbits[2]); - mutex_unlock(&ice->gpio_mutex); + up(&ice->gpio_mutex); } static void __devinit snd_ice1712_stdsp24_box_midi(struct snd_ice1712 *ice, int box, int master) { - mutex_lock(&ice->gpio_mutex); + down(&ice->gpio_mutex); /* select box */ ICE1712_STDSP24_0_BOX(ice->spec.hoontech.boxbits, box); @@ -143,15 +141,15 @@ static void __devinit snd_ice1712_stdsp24_box_midi(struct snd_ice1712 *ice, int ICE1712_STDSP24_2_MIDIIN(ice->spec.hoontech.boxbits, 1); snd_ice1712_stdsp24_gpio_write(ice, ice->spec.hoontech.boxbits[2]); - mutex_unlock(&ice->gpio_mutex); + up(&ice->gpio_mutex); } static void __devinit snd_ice1712_stdsp24_midi2(struct snd_ice1712 *ice, int activate) { - mutex_lock(&ice->gpio_mutex); + down(&ice->gpio_mutex); ICE1712_STDSP24_3_MIDI2(ice->spec.hoontech.boxbits, activate); snd_ice1712_stdsp24_gpio_write(ice, ice->spec.hoontech.boxbits[3]); - mutex_unlock(&ice->gpio_mutex); + up(&ice->gpio_mutex); } static int __devinit snd_ice1712_hoontech_init(struct snd_ice1712 *ice) diff --git a/sound/pci/ice1712/ice1712.c b/sound/pci/ice1712/ice1712.c index bf20858d9..ef6f18558 100644 --- a/sound/pci/ice1712/ice1712.c +++ b/sound/pci/ice1712/ice1712.c @@ -53,14 +53,12 @@ #include #include #include -#include #include #include -#include - #include #include #include +#include #include #include @@ -84,11 +82,10 @@ MODULE_SUPPORTED_DEVICE("{" 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 enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP; /* Enable this card */ static char *model[SNDRV_CARDS]; -static int omni[SNDRV_CARDS]; /* Delta44 & 66 Omni I/O support */ +static int omni[SNDRV_CARDS]; /* Delta44 & 66 Omni I/O support */ static int cs8427_timeout[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS-1)] = 500}; /* CS8427 S/PDIF transciever reset timeout value in msec */ -static int dxr_enable[SNDRV_CARDS]; /* DXR enable for DMX6FIRE */ module_param_array(index, int, NULL, 0444); MODULE_PARM_DESC(index, "Index value for ICE1712 soundcard."); @@ -102,8 +99,6 @@ module_param_array(cs8427_timeout, int, NULL, 0444); MODULE_PARM_DESC(cs8427_timeout, "Define reset timeout for cs8427 chip in msec resolution."); module_param_array(model, charp, NULL, 0444); MODULE_PARM_DESC(model, "Use the given board model."); -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[] = { @@ -321,6 +316,7 @@ static void snd_ice1712_set_gpio_data(struct snd_ice1712 *ice, unsigned int val) inb(ICEREG(ice, DATA)); /* dummy read for pci-posting */ } + /* * * CS8427 interface @@ -400,20 +396,6 @@ int __devinit snd_ice1712_init_cs8427(struct snd_ice1712 *ice, int addr) return 0; } -static void snd_ice1712_set_input_clock_source(struct snd_ice1712 *ice, int spdif_is_master) -{ - /* change CS8427 clock source too */ - if (ice->cs8427) - snd_ice1712_cs8427_set_input_clock(ice, spdif_is_master); - /* notify ak4524 chip as well */ - if (spdif_is_master) { - unsigned int i; - for (i = 0; i < ice->akm_codecs; i++) { - if (ice->akm[i].ops.set_rate_val) - ice->akm[i].ops.set_rate_val(&ice->akm[i], 0); - } - } -} /* * Interrupt handler @@ -1585,9 +1567,6 @@ static void snd_ice1712_proc_read(struct snd_info_entry *entry, snd_iprintf(buffer, " CAPTURE : 0x%08x\n", inl(ICEMT(ice, ROUTE_CAPTURE))); snd_iprintf(buffer, " SPDOUT : 0x%04x\n", (unsigned)inw(ICEMT(ice, ROUTE_SPDOUT))); snd_iprintf(buffer, " RATE : 0x%02x\n", (unsigned)inb(ICEMT(ice, RATE))); - snd_iprintf(buffer, " GPIO_DATA : 0x%02x\n", (unsigned)snd_ice1712_get_gpio_data(ice)); - snd_iprintf(buffer, " GPIO_WRITE_MASK : 0x%02x\n", (unsigned)snd_ice1712_read(ice, ICE1712_IREG_GPIO_WRITE_MASK)); - snd_iprintf(buffer, " GPIO_DIRECTION : 0x%02x\n", (unsigned)snd_ice1712_read(ice, ICE1712_IREG_GPIO_DIRECTION)); } static void __devinit snd_ice1712_proc_init(struct snd_ice1712 * ice) @@ -1595,7 +1574,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, snd_ice1712_proc_read); + snd_info_set_text_ops(entry, ice, 1024, snd_ice1712_proc_read); } /* @@ -1877,8 +1856,20 @@ static int snd_ice1712_pro_internal_clock_put(struct snd_kcontrol *kcontrol, spin_unlock_irq(&ice->reg_lock); if ((oval & ICE1712_SPDIF_MASTER) != - (inb(ICEMT(ice, RATE)) & ICE1712_SPDIF_MASTER)) - snd_ice1712_set_input_clock_source(ice, is_spdif_master(ice)); + (inb(ICEMT(ice, RATE)) & ICE1712_SPDIF_MASTER)) { + /* change CS8427 clock source too */ + if (ice->cs8427) { + snd_ice1712_cs8427_set_input_clock(ice, is_spdif_master(ice)); + } + /* notify ak4524 chip as well */ + if (is_spdif_master(ice)) { + unsigned int i; + for (i = 0; i < ice->akm_codecs; i++) { + if (ice->akm[i].ops.set_rate_val) + ice->akm[i].ops.set_rate_val(&ice->akm[i], 0); + } + } + } return change; } @@ -2397,13 +2388,6 @@ 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) - /* 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]); @@ -2540,7 +2524,6 @@ static int __devinit snd_ice1712_create(struct snd_card *card, const char *modelname, int omni, int cs8427_timeout, - int dxr_enable, struct snd_ice1712 ** r_ice1712) { struct snd_ice1712 *ice; @@ -2555,8 +2538,8 @@ static int __devinit snd_ice1712_create(struct snd_card *card, if ((err = pci_enable_device(pci)) < 0) return err; /* check, if we can restrict PCI DMA transfers to 28 bits */ - if (pci_set_dma_mask(pci, DMA_28BIT_MASK) < 0 || - pci_set_consistent_dma_mask(pci, DMA_28BIT_MASK) < 0) { + if (pci_set_dma_mask(pci, 0x0fffffff) < 0 || + pci_set_consistent_dma_mask(pci, 0x0fffffff) < 0) { snd_printk(KERN_ERR "architecture does not support 28bit PCI busmaster DMA\n"); pci_disable_device(pci); return -ENXIO; @@ -2573,11 +2556,10 @@ static int __devinit snd_ice1712_create(struct snd_card *card, else if (cs8427_timeout > 1000) cs8427_timeout = 1000; ice->cs8427_timeout = cs8427_timeout; - ice->dxr_enable = dxr_enable; spin_lock_init(&ice->reg_lock); - mutex_init(&ice->gpio_mutex); - mutex_init(&ice->i2c_mutex); - mutex_init(&ice->open_mutex); + init_MUTEX(&ice->gpio_mutex); + init_MUTEX(&ice->i2c_mutex); + init_MUTEX(&ice->open_mutex); ice->gpio.set_mask = snd_ice1712_set_gpio_mask; ice->gpio.set_dir = snd_ice1712_set_gpio_dir; ice->gpio.set_data = snd_ice1712_set_gpio_data; @@ -2606,7 +2588,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, IRQF_DISABLED|IRQF_SHARED, + if (request_irq(pci->irq, snd_ice1712_interrupt, SA_INTERRUPT|SA_SHIRQ, "ICE1712", ice)) { snd_printk(KERN_ERR "unable to grab IRQ %d\n", pci->irq); snd_ice1712_free(ice); @@ -2676,8 +2658,7 @@ static int __devinit snd_ice1712_probe(struct pci_dev *pci, strcpy(card->shortname, "ICEnsemble ICE1712"); if ((err = snd_ice1712_create(card, pci, model[dev], omni[dev], - cs8427_timeout[dev], dxr_enable[dev], - &ice)) < 0) { + cs8427_timeout[dev], &ice)) < 0) { snd_card_free(card); return err; } @@ -2737,42 +2718,23 @@ 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), - (c->mpu401_1_info_flags | - MPU401_INFO_INTEGRATED), + ICEREG(ice, MPU1_CTRL), 1, ice->irq, 0, &ice->rmidi[0])) < 0) { snd_card_free(card); return err; } - 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 (ice->eeprom.data[ICE_EEP1_CODEC] & ICE1712_CFG_2xMPU401) if ((err = snd_mpu401_uart_new(card, 1, MPU401_HW_ICE1712, - ICEREG(ice, MPU2_CTRL), - (c->mpu401_2_info_flags | - MPU401_INFO_INTEGRATED), + ICEREG(ice, MPU2_CTRL), 1, 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); - sprintf(card->longname, "%s at 0x%lx, irq %i", card->shortname, ice->port, ice->irq); diff --git a/sound/pci/ice1712/ice1712.h b/sound/pci/ice1712/ice1712.h index ce27eac40..ce96b3bb6 100644 --- a/sound/pci/ice1712/ice1712.h +++ b/sound/pci/ice1712/ice1712.h @@ -29,7 +29,6 @@ #include #include #include -#include /* @@ -326,7 +325,6 @@ struct snd_ice1712 { unsigned int pro_volumes[20]; unsigned int omni: 1; /* Delta Omni I/O */ - unsigned int dxr_enable: 1; /* Terratec DXR enable for DMX6FIRE */ unsigned int vt1724: 1; unsigned int vt1720: 1; unsigned int has_spdif: 1; /* VT1720/4 - has SPDIF I/O */ @@ -336,7 +334,7 @@ struct snd_ice1712 { unsigned int num_total_adcs; /* total ADCs */ unsigned int cur_rate; /* current rate */ - struct mutex open_mutex; + struct semaphore open_mutex; struct snd_pcm_substream *pcm_reserved[4]; struct snd_pcm_hw_constraint_list *hw_rates; /* card-specific rate constraints */ @@ -344,7 +342,7 @@ struct snd_ice1712 { struct snd_akm4xxx *akm; struct snd_ice1712_spdif spdif; - struct mutex i2c_mutex; /* I2C mutex for ICE1724 registers */ + struct semaphore i2c_mutex; /* I2C mutex for ICE1724 registers */ struct snd_i2c_bus *i2c; /* I2C bus */ struct snd_i2c_device *cs8427; /* CS8427 I2C device */ unsigned int cs8427_timeout; /* CS8427 reset timeout in HZ/100 */ @@ -362,7 +360,7 @@ struct snd_ice1712 { void (*set_pro_rate)(struct snd_ice1712 *ice, unsigned int rate); void (*i2s_mclk_changed)(struct snd_ice1712 *ice); } gpio; - struct mutex gpio_mutex; + struct semaphore gpio_mutex; /* other board-specific data */ union { @@ -374,7 +372,6 @@ struct snd_ice1712 { unsigned int cs8415_mux; unsigned short master[2]; unsigned short vol[8]; - unsigned char pca9554_out; } aureon; /* AC97 register cache for Phase28 */ struct phase28_spec { @@ -426,7 +423,7 @@ static inline unsigned int snd_ice1712_gpio_read(struct snd_ice1712 *ice) */ static inline void snd_ice1712_save_gpio_status(struct snd_ice1712 *ice) { - mutex_lock(&ice->gpio_mutex); + down(&ice->gpio_mutex); ice->gpio.saved[0] = ice->gpio.direction; ice->gpio.saved[1] = ice->gpio.write_mask; } @@ -437,7 +434,7 @@ static inline void snd_ice1712_restore_gpio_status(struct snd_ice1712 *ice) ice->gpio.set_mask(ice, ice->gpio.saved[1]); ice->gpio.direction = ice->gpio.saved[0]; ice->gpio.write_mask = ice->gpio.saved[1]; - mutex_unlock(&ice->gpio_mutex); + up(&ice->gpio_mutex); } /* for bit controls */ @@ -496,10 +493,6 @@ 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 71d6aedc0..71f08c036 100644 --- a/sound/pci/ice1712/ice1724.c +++ b/sound/pci/ice1712/ice1724.c @@ -30,7 +30,6 @@ #include #include #include -#include #include #include #include @@ -488,7 +487,7 @@ static int snd_vt1724_pcm_hw_params(struct snd_pcm_substream *substream, int i, chs; chs = params_channels(hw_params); - mutex_lock(&ice->open_mutex); + down(&ice->open_mutex); /* mark surround channels */ if (substream == ice->playback_pro_substream) { /* PDMA0 can be multi-channel up to 8 */ @@ -496,7 +495,7 @@ static int snd_vt1724_pcm_hw_params(struct snd_pcm_substream *substream, for (i = 0; i < chs; i++) { if (ice->pcm_reserved[i] && ice->pcm_reserved[i] != substream) { - mutex_unlock(&ice->open_mutex); + up(&ice->open_mutex); return -EBUSY; } ice->pcm_reserved[i] = substream; @@ -511,7 +510,7 @@ static int snd_vt1724_pcm_hw_params(struct snd_pcm_substream *substream, if (ice->playback_con_substream_ds[i] == substream) { if (ice->pcm_reserved[i] && ice->pcm_reserved[i] != substream) { - mutex_unlock(&ice->open_mutex); + up(&ice->open_mutex); return -EBUSY; } ice->pcm_reserved[i] = substream; @@ -519,7 +518,7 @@ static int snd_vt1724_pcm_hw_params(struct snd_pcm_substream *substream, } } } - mutex_unlock(&ice->open_mutex); + up(&ice->open_mutex); snd_vt1724_set_pro_rate(ice, params_rate(hw_params), 0); return snd_pcm_lib_malloc_pages(substream, params_buffer_bytes(hw_params)); } @@ -529,12 +528,12 @@ static int snd_vt1724_pcm_hw_free(struct snd_pcm_substream *substream) struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); int i; - mutex_lock(&ice->open_mutex); + down(&ice->open_mutex); /* unmark surround channels */ for (i = 0; i < 3; i++) if (ice->pcm_reserved[i] == substream) ice->pcm_reserved[i] = NULL; - mutex_unlock(&ice->open_mutex); + up(&ice->open_mutex); return snd_pcm_lib_free_pages(substream); } @@ -779,7 +778,7 @@ static int snd_vt1724_playback_pro_open(struct snd_pcm_substream *substream) snd_pcm_set_sync(substream); snd_pcm_hw_constraint_msbits(runtime, 0, 32, 24); set_rate_constraints(ice, substream); - mutex_lock(&ice->open_mutex); + down(&ice->open_mutex); /* calculate the currently available channels */ for (chs = 0; chs < 3; chs++) { if (ice->pcm_reserved[chs]) @@ -789,7 +788,7 @@ static int snd_vt1724_playback_pro_open(struct snd_pcm_substream *substream) runtime->hw.channels_max = chs; if (chs > 2) /* channels must be even */ snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS, 2); - mutex_unlock(&ice->open_mutex); + up(&ice->open_mutex); snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_PERIOD_BYTES, VT1724_BUFFER_ALIGN); snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_BUFFER_BYTES, @@ -1129,13 +1128,13 @@ static int snd_vt1724_playback_indep_open(struct snd_pcm_substream *substream) struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); struct snd_pcm_runtime *runtime = substream->runtime; - mutex_lock(&ice->open_mutex); + down(&ice->open_mutex); /* already used by PDMA0? */ if (ice->pcm_reserved[substream->number]) { - mutex_unlock(&ice->open_mutex); + up(&ice->open_mutex); return -EBUSY; /* FIXME: should handle blocking mode properly */ } - mutex_unlock(&ice->open_mutex); + up(&ice->open_mutex); runtime->private_data = &vt1724_playback_dma_regs[substream->number]; ice->playback_con_substream_ds[substream->number] = substream; runtime->hw = snd_vt1724_2ch_stereo; @@ -1293,7 +1292,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, snd_vt1724_proc_read); + snd_info_set_text_ops(entry, ice, 1024, snd_vt1724_proc_read); } /* @@ -1979,12 +1978,12 @@ unsigned char snd_vt1724_read_i2c(struct snd_ice1712 *ice, { unsigned char val; - mutex_lock(&ice->i2c_mutex); + down(&ice->i2c_mutex); outb(addr, ICEREG1724(ice, I2C_BYTE_ADDR)); outb(dev & ~VT1724_I2C_WRITE, ICEREG1724(ice, I2C_DEV_ADDR)); wait_i2c_busy(ice); val = inb(ICEREG1724(ice, I2C_DATA)); - mutex_unlock(&ice->i2c_mutex); + up(&ice->i2c_mutex); //printk("i2c_read: [0x%x,0x%x] = 0x%x\n", dev, addr, val); return val; } @@ -1992,14 +1991,14 @@ unsigned char snd_vt1724_read_i2c(struct snd_ice1712 *ice, void snd_vt1724_write_i2c(struct snd_ice1712 *ice, unsigned char dev, unsigned char addr, unsigned char data) { - mutex_lock(&ice->i2c_mutex); + down(&ice->i2c_mutex); wait_i2c_busy(ice); //printk("i2c_write: [0x%x,0x%x] = 0x%x\n", dev, addr, data); outb(addr, ICEREG1724(ice, I2C_BYTE_ADDR)); outb(data, ICEREG1724(ice, I2C_DATA)); outb(dev | VT1724_I2C_WRITE, ICEREG1724(ice, I2C_DEV_ADDR)); wait_i2c_busy(ice); - mutex_unlock(&ice->i2c_mutex); + up(&ice->i2c_mutex); } static int __devinit snd_vt1724_read_eeprom(struct snd_ice1712 *ice, @@ -2230,9 +2229,9 @@ static int __devinit snd_vt1724_create(struct snd_card *card, } ice->vt1724 = 1; spin_lock_init(&ice->reg_lock); - mutex_init(&ice->gpio_mutex); - mutex_init(&ice->open_mutex); - mutex_init(&ice->i2c_mutex); + init_MUTEX(&ice->gpio_mutex); + init_MUTEX(&ice->open_mutex); + init_MUTEX(&ice->i2c_mutex); ice->gpio.set_mask = snd_vt1724_set_gpio_mask; ice->gpio.set_dir = snd_vt1724_set_gpio_dir; ice->gpio.set_data = snd_vt1724_set_gpio_data; @@ -2253,7 +2252,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, - IRQF_DISABLED|IRQF_SHARED, "ICE1724", ice)) { + SA_INTERRUPT|SA_SHIRQ, "ICE1724", ice)) { snd_printk(KERN_ERR "unable to grab IRQ %d\n", pci->irq); snd_vt1724_free(ice); return -EIO; @@ -2388,8 +2387,7 @@ 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), - MPU401_INFO_INTEGRATED, + ICEREG1724(ice, MPU_CTRL), 1, ice->irq, 0, &ice->rmidi[0])) < 0) { snd_card_free(card); diff --git a/sound/pci/ice1712/phase.c b/sound/pci/ice1712/phase.c index 502da1c8b..ec3757834 100644 --- a/sound/pci/ice1712/phase.c +++ b/sound/pci/ice1712/phase.c @@ -39,8 +39,6 @@ #include #include #include -#include - #include #include "ice1712.h" @@ -275,9 +273,9 @@ static int wm_pcm_mute_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_va { struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); - mutex_lock(&ice->gpio_mutex); + down(&ice->gpio_mutex); ucontrol->value.integer.value[0] = (wm_get(ice, WM_MUTE) & 0x10) ? 0 : 1; - mutex_unlock(&ice->gpio_mutex); + up(&ice->gpio_mutex); return 0; } @@ -586,11 +584,11 @@ static int wm_pcm_vol_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_val struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); unsigned short val; - mutex_lock(&ice->gpio_mutex); + down(&ice->gpio_mutex); val = wm_get(ice, WM_DAC_DIG_MASTER_ATTEN) & 0xff; val = val > PCM_MIN ? (val - PCM_MIN) : 0; ucontrol->value.integer.value[0] = val; - mutex_unlock(&ice->gpio_mutex); + up(&ice->gpio_mutex); return 0; } diff --git a/sound/pci/ice1712/pontis.c b/sound/pci/ice1712/pontis.c index 0efcad926..0dccd7707 100644 --- a/sound/pci/ice1712/pontis.c +++ b/sound/pci/ice1712/pontis.c @@ -27,8 +27,6 @@ #include #include #include -#include - #include #include @@ -126,13 +124,13 @@ static int wm_dac_vol_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_val unsigned short val; int i; - mutex_lock(&ice->gpio_mutex); + down(&ice->gpio_mutex); for (i = 0; i < 2; i++) { val = wm_get(ice, WM_DAC_ATTEN_L + i) & 0xff; val = val > DAC_MIN ? (val - DAC_MIN) : 0; ucontrol->value.integer.value[i] = val; } - mutex_unlock(&ice->gpio_mutex); + up(&ice->gpio_mutex); return 0; } @@ -142,7 +140,7 @@ static int wm_dac_vol_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_val unsigned short oval, nval; int i, idx, change = 0; - mutex_lock(&ice->gpio_mutex); + down(&ice->gpio_mutex); for (i = 0; i < 2; i++) { nval = ucontrol->value.integer.value[i]; nval = (nval ? (nval + DAC_MIN) : 0) & 0xff; @@ -154,7 +152,7 @@ static int wm_dac_vol_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_val change = 1; } } - mutex_unlock(&ice->gpio_mutex); + up(&ice->gpio_mutex); return change; } @@ -181,13 +179,13 @@ static int wm_adc_vol_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_val unsigned short val; int i; - mutex_lock(&ice->gpio_mutex); + down(&ice->gpio_mutex); for (i = 0; i < 2; i++) { val = wm_get(ice, WM_ADC_ATTEN_L + i) & 0xff; val = val > ADC_MIN ? (val - ADC_MIN) : 0; ucontrol->value.integer.value[i] = val; } - mutex_unlock(&ice->gpio_mutex); + up(&ice->gpio_mutex); return 0; } @@ -197,7 +195,7 @@ static int wm_adc_vol_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_val unsigned short ovol, nvol; int i, idx, change = 0; - mutex_lock(&ice->gpio_mutex); + down(&ice->gpio_mutex); for (i = 0; i < 2; i++) { nvol = ucontrol->value.integer.value[i]; nvol = nvol ? (nvol + ADC_MIN) : 0; @@ -208,7 +206,7 @@ static int wm_adc_vol_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_val change = 1; } } - mutex_unlock(&ice->gpio_mutex); + up(&ice->gpio_mutex); return change; } @@ -229,9 +227,9 @@ static int wm_adc_mux_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_val struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); int bit = kcontrol->private_value; - mutex_lock(&ice->gpio_mutex); + down(&ice->gpio_mutex); ucontrol->value.integer.value[0] = (wm_get(ice, WM_ADC_MUX) & (1 << bit)) ? 1 : 0; - mutex_unlock(&ice->gpio_mutex); + up(&ice->gpio_mutex); return 0; } @@ -242,7 +240,7 @@ static int wm_adc_mux_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_val unsigned short oval, nval; int change; - mutex_lock(&ice->gpio_mutex); + down(&ice->gpio_mutex); nval = oval = wm_get(ice, WM_ADC_MUX); if (ucontrol->value.integer.value[0]) nval |= (1 << bit); @@ -252,7 +250,7 @@ static int wm_adc_mux_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_val if (change) { wm_put(ice, WM_ADC_MUX, nval); } - mutex_unlock(&ice->gpio_mutex); + up(&ice->gpio_mutex); return 0; } @@ -272,9 +270,9 @@ static int wm_bypass_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_valu { struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); - mutex_lock(&ice->gpio_mutex); + down(&ice->gpio_mutex); ucontrol->value.integer.value[0] = (wm_get(ice, WM_OUT_MUX) & 0x04) ? 1 : 0; - mutex_unlock(&ice->gpio_mutex); + up(&ice->gpio_mutex); return 0; } @@ -284,7 +282,7 @@ static int wm_bypass_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_valu unsigned short val, oval; int change = 0; - mutex_lock(&ice->gpio_mutex); + down(&ice->gpio_mutex); val = oval = wm_get(ice, WM_OUT_MUX); if (ucontrol->value.integer.value[0]) val |= 0x04; @@ -294,7 +292,7 @@ static int wm_bypass_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_valu wm_put(ice, WM_OUT_MUX, val); change = 1; } - mutex_unlock(&ice->gpio_mutex); + up(&ice->gpio_mutex); return change; } @@ -314,9 +312,9 @@ static int wm_chswap_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_valu { struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); - mutex_lock(&ice->gpio_mutex); + down(&ice->gpio_mutex); ucontrol->value.integer.value[0] = (wm_get(ice, WM_DAC_CTRL1) & 0xf0) != 0x90; - mutex_unlock(&ice->gpio_mutex); + up(&ice->gpio_mutex); return 0; } @@ -326,7 +324,7 @@ static int wm_chswap_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_valu unsigned short val, oval; int change = 0; - mutex_lock(&ice->gpio_mutex); + down(&ice->gpio_mutex); oval = wm_get(ice, WM_DAC_CTRL1); val = oval & 0x0f; if (ucontrol->value.integer.value[0]) @@ -338,7 +336,7 @@ static int wm_chswap_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_valu wm_put_nocache(ice, WM_DAC_CTRL1, val); change = 1; } - mutex_unlock(&ice->gpio_mutex); + up(&ice->gpio_mutex); return change; } @@ -451,9 +449,9 @@ static int cs_source_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_valu { struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); - mutex_lock(&ice->gpio_mutex); + down(&ice->gpio_mutex); ucontrol->value.enumerated.item[0] = ice->gpio.saved[0]; - mutex_unlock(&ice->gpio_mutex); + up(&ice->gpio_mutex); return 0; } @@ -463,14 +461,14 @@ static int cs_source_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_valu unsigned char val; int change = 0; - mutex_lock(&ice->gpio_mutex); + down(&ice->gpio_mutex); if (ucontrol->value.enumerated.item[0] != ice->gpio.saved[0]) { ice->gpio.saved[0] = ucontrol->value.enumerated.item[0] & 3; val = 0x80 | (ice->gpio.saved[0] << 3); spi_write(ice, CS_DEV, 0x04, val); change = 1; } - mutex_unlock(&ice->gpio_mutex); + up(&ice->gpio_mutex); return 0; } @@ -490,10 +488,10 @@ static int pontis_gpio_mask_info(struct snd_kcontrol *kcontrol, struct snd_ctl_e static int pontis_gpio_mask_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); - mutex_lock(&ice->gpio_mutex); + down(&ice->gpio_mutex); /* 4-7 reserved */ ucontrol->value.integer.value[0] = (~ice->gpio.write_mask & 0xffff) | 0x00f0; - mutex_unlock(&ice->gpio_mutex); + up(&ice->gpio_mutex); return 0; } @@ -502,22 +500,22 @@ static int pontis_gpio_mask_put(struct snd_kcontrol *kcontrol, struct snd_ctl_el struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); unsigned int val; int changed; - mutex_lock(&ice->gpio_mutex); + down(&ice->gpio_mutex); /* 4-7 reserved */ val = (~ucontrol->value.integer.value[0] & 0xffff) | 0x00f0; changed = val != ice->gpio.write_mask; ice->gpio.write_mask = val; - mutex_unlock(&ice->gpio_mutex); + up(&ice->gpio_mutex); return changed; } static int pontis_gpio_dir_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); - mutex_lock(&ice->gpio_mutex); + down(&ice->gpio_mutex); /* 4-7 reserved */ ucontrol->value.integer.value[0] = ice->gpio.direction & 0xff0f; - mutex_unlock(&ice->gpio_mutex); + up(&ice->gpio_mutex); return 0; } @@ -526,23 +524,23 @@ static int pontis_gpio_dir_put(struct snd_kcontrol *kcontrol, struct snd_ctl_ele struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); unsigned int val; int changed; - mutex_lock(&ice->gpio_mutex); + down(&ice->gpio_mutex); /* 4-7 reserved */ val = ucontrol->value.integer.value[0] & 0xff0f; changed = (val != ice->gpio.direction); ice->gpio.direction = val; - mutex_unlock(&ice->gpio_mutex); + up(&ice->gpio_mutex); return changed; } static int pontis_gpio_data_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); - mutex_lock(&ice->gpio_mutex); + down(&ice->gpio_mutex); snd_ice1712_gpio_set_dir(ice, ice->gpio.direction); snd_ice1712_gpio_set_mask(ice, ice->gpio.write_mask); ucontrol->value.integer.value[0] = snd_ice1712_gpio_read(ice) & 0xffff; - mutex_unlock(&ice->gpio_mutex); + up(&ice->gpio_mutex); return 0; } @@ -551,7 +549,7 @@ static int pontis_gpio_data_put(struct snd_kcontrol *kcontrol, struct snd_ctl_el struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); unsigned int val, nval; int changed = 0; - mutex_lock(&ice->gpio_mutex); + down(&ice->gpio_mutex); snd_ice1712_gpio_set_dir(ice, ice->gpio.direction); snd_ice1712_gpio_set_mask(ice, ice->gpio.write_mask); val = snd_ice1712_gpio_read(ice) & 0xffff; @@ -560,7 +558,7 @@ static int pontis_gpio_data_put(struct snd_kcontrol *kcontrol, struct snd_ctl_el snd_ice1712_gpio_write(ice, nval); changed = 1; } - mutex_unlock(&ice->gpio_mutex); + up(&ice->gpio_mutex); return changed; } @@ -653,14 +651,14 @@ static void wm_proc_regs_write(struct snd_info_entry *entry, struct snd_info_buf struct snd_ice1712 *ice = (struct snd_ice1712 *)entry->private_data; char line[64]; unsigned int reg, val; - mutex_lock(&ice->gpio_mutex); + down(&ice->gpio_mutex); while (!snd_info_get_line(buffer, line, sizeof(line))) { if (sscanf(line, "%x %x", ®, &val) != 2) continue; if (reg <= 0x17 && val <= 0xffff) wm_put(ice, reg, val); } - mutex_unlock(&ice->gpio_mutex); + up(&ice->gpio_mutex); } static void wm_proc_regs_read(struct snd_info_entry *entry, struct snd_info_buffer *buffer) @@ -668,20 +666,21 @@ static void wm_proc_regs_read(struct snd_info_entry *entry, struct snd_info_buff struct snd_ice1712 *ice = (struct snd_ice1712 *)entry->private_data; int reg, val; - mutex_lock(&ice->gpio_mutex); + down(&ice->gpio_mutex); for (reg = 0; reg <= 0x17; reg++) { val = wm_get(ice, reg); snd_iprintf(buffer, "%02x = %04x\n", reg, val); } - mutex_unlock(&ice->gpio_mutex); + up(&ice->gpio_mutex); } 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, wm_proc_regs_read); + snd_info_set_text_ops(entry, ice, 1024, wm_proc_regs_read); entry->mode |= S_IWUSR; + entry->c.text.write_size = 1024; entry->c.text.write = wm_proc_regs_write; } } @@ -691,21 +690,22 @@ static void cs_proc_regs_read(struct snd_info_entry *entry, struct snd_info_buff struct snd_ice1712 *ice = (struct snd_ice1712 *)entry->private_data; int reg, val; - mutex_lock(&ice->gpio_mutex); + down(&ice->gpio_mutex); for (reg = 0; reg <= 0x26; reg++) { val = spi_read(ice, CS_DEV, reg); snd_iprintf(buffer, "%02x = %02x\n", reg, val); } val = spi_read(ice, CS_DEV, 0x7f); snd_iprintf(buffer, "%02x = %02x\n", 0x7f, val); - mutex_unlock(&ice->gpio_mutex); + up(&ice->gpio_mutex); } 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, cs_proc_regs_read); + if (! snd_card_proc_new(ice->card, "cs_codec", &entry)) { + snd_info_set_text_ops(entry, ice, 1024, cs_proc_regs_read); + } } diff --git a/sound/pci/ice1712/revo.c b/sound/pci/ice1712/revo.c index fec9440cb..b5754b32b 100644 --- a/sound/pci/ice1712/revo.c +++ b/sound/pci/ice1712/revo.c @@ -87,25 +87,12 @@ 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 = { @@ -126,9 +113,7 @@ 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 = { @@ -148,9 +133,7 @@ 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 6874263f1..174237f4a 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; +static int ac97_clock = 0; static char *ac97_quirk; static int buggy_semaphore; static int buggy_irq = -1; /* auto-check */ @@ -178,8 +178,6 @@ DEFINE_REGSET(SP, 0x60); /* SPDIF out */ #define ICH_SAMPLE_CAP 0x00c00000 /* ICH4: sample capability bits (RO) */ #define ICH_SAMPLE_16_20 0x00400000 /* ICH4: 16- and 20-bit samples */ #define ICH_MULTICHAN_CAP 0x00300000 /* ICH4: multi-channel capability bits (RO) */ -#define ICH_SIS_TRI 0x00080000 /* SIS: tertiary resume irq */ -#define ICH_SIS_TCR 0x00040000 /* SIS: tertiary codec ready */ #define ICH_MD3 0x00020000 /* modem power down semaphore */ #define ICH_AD3 0x00010000 /* audio power down semaphore */ #define ICH_RCS 0x00008000 /* read completion status */ @@ -400,10 +398,6 @@ struct intel8x0 { struct snd_ac97_bus *ac97_bus; struct snd_ac97 *ac97[3]; unsigned int ac97_sdin[3]; - unsigned int max_codecs, ncodecs; - unsigned int *codec_bit; - unsigned int codec_isr_bits; - unsigned int codec_ready_bits; spinlock_t reg_lock; @@ -522,6 +516,18 @@ static void iaputword(struct intel8x0 *chip, u32 offset, u16 val) * access to AC97 codec via normal i/o (for ICH and SIS7012) */ +/* return the GLOB_STA bit for the corresponding codec */ +static unsigned int get_ich_codec_bit(struct intel8x0 *chip, unsigned int codec) +{ + static unsigned int codec_bit[3] = { + ICH_PCR, ICH_SCR, ICH_TCR + }; + snd_assert(codec < 3, return ICH_PCR); + if (chip->device_type == DEVICE_INTEL_ICH4) + codec = chip->ac97_sdin[codec]; + return codec_bit[codec]; +} + static int snd_intel8x0_codec_semaphore(struct intel8x0 *chip, unsigned int codec) { int time; @@ -531,9 +537,9 @@ static int snd_intel8x0_codec_semaphore(struct intel8x0 *chip, unsigned int code if (chip->in_sdin_init) { /* we don't know the ready bit assignment at the moment */ /* so we check any */ - codec = chip->codec_isr_bits; + codec = ICH_PCR | ICH_SCR | ICH_TCR; } else { - codec = chip->codec_bit[chip->ac97_sdin[codec]]; + codec = get_ich_codec_bit(chip, codec); } /* codec ready ? */ @@ -590,7 +596,7 @@ static unsigned short snd_intel8x0_codec_read(struct snd_ac97 *ac97, if ((tmp = igetdword(chip, ICHREG(GLOB_STA))) & ICH_RCS) { /* reset RCS and preserve other R/WC bits */ iputdword(chip, ICHREG(GLOB_STA), tmp & - ~(chip->codec_ready_bits | ICH_GSCI)); + ~(ICH_SRI|ICH_PRI|ICH_TRI|ICH_GSCI)); if (! chip->in_ac97_init) snd_printk(KERN_ERR "codec_read %d: read timeout for register 0x%x\n", ac97->num, reg); res = 0xffff; @@ -599,8 +605,7 @@ static unsigned short snd_intel8x0_codec_read(struct snd_ac97 *ac97, return res; } -static void __devinit snd_intel8x0_codec_read_test(struct intel8x0 *chip, - unsigned int codec) +static void snd_intel8x0_codec_read_test(struct intel8x0 *chip, unsigned int codec) { unsigned int tmp; @@ -609,7 +614,7 @@ static void __devinit snd_intel8x0_codec_read_test(struct intel8x0 *chip, if ((tmp = igetdword(chip, ICHREG(GLOB_STA))) & ICH_RCS) { /* reset RCS and preserve other R/WC bits */ iputdword(chip, ICHREG(GLOB_STA), tmp & - ~(chip->codec_ready_bits | ICH_GSCI)); + ~(ICH_SRI|ICH_PRI|ICH_TRI|ICH_GSCI)); } } } @@ -1293,7 +1298,6 @@ static int snd_intel8x0_ali_ac97spdifout_close(struct snd_pcm_substream *substre return 0; } -#if 0 // NYI static int snd_intel8x0_ali_spdifin_open(struct snd_pcm_substream *substream) { struct intel8x0 *chip = snd_pcm_substream_chip(substream); @@ -1309,6 +1313,7 @@ static int snd_intel8x0_ali_spdifin_close(struct snd_pcm_substream *substream) return 0; } +#if 0 // NYI static int snd_intel8x0_ali_spdifout_open(struct snd_pcm_substream *substream) { struct intel8x0 *chip = snd_pcm_substream_chip(substream); @@ -1435,7 +1440,6 @@ static struct snd_pcm_ops snd_intel8x0_ali_ac97spdifout_ops = { .pointer = snd_intel8x0_pcm_pointer, }; -#if 0 // NYI static struct snd_pcm_ops snd_intel8x0_ali_spdifin_ops = { .open = snd_intel8x0_ali_spdifin_open, .close = snd_intel8x0_ali_spdifin_close, @@ -1447,6 +1451,7 @@ static struct snd_pcm_ops snd_intel8x0_ali_spdifin_ops = { .pointer = snd_intel8x0_pcm_pointer, }; +#if 0 // NYI static struct snd_pcm_ops snd_intel8x0_ali_spdifout_ops = { .open = snd_intel8x0_ali_spdifout_open, .close = snd_intel8x0_ali_spdifout_close, @@ -1582,7 +1587,7 @@ static struct ich_pcm_table ali_pcms[] __devinitdata = { { .suffix = "IEC958", .playback_ops = &snd_intel8x0_ali_ac97spdifout_ops, - /* .capture_ops = &snd_intel8x0_ali_spdifin_ops, */ + .capture_ops = &snd_intel8x0_ali_spdifin_ops, .prealloc_size = 64 * 1024, .prealloc_max_size = 128 * 1024, .ac97_idx = ALID_AC97SPDIFOUT, @@ -1805,12 +1810,6 @@ 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, @@ -1955,12 +1954,6 @@ 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, @@ -2085,24 +2078,23 @@ static int __devinit snd_intel8x0_mixer(struct intel8x0 *chip, int ac97_clock, if (chip->device_type != DEVICE_ALI) { glob_sta = igetdword(chip, ICHREG(GLOB_STA)); ops = &standard_bus_ops; - chip->in_sdin_init = 1; - codecs = 0; - for (i = 0; i < chip->max_codecs; i++) { - if (! (glob_sta & chip->codec_bit[i])) - continue; - if (chip->device_type == DEVICE_INTEL_ICH4) { - snd_intel8x0_codec_read_test(chip, codecs); - chip->ac97_sdin[codecs] = - igetbyte(chip, ICHREG(SDM)) & ICH_LDI_MASK; - snd_assert(chip->ac97_sdin[codecs] < 3, - chip->ac97_sdin[codecs] = 0); - } else - chip->ac97_sdin[codecs] = i; - codecs++; + if (chip->device_type == DEVICE_INTEL_ICH4) { + codecs = 0; + if (glob_sta & ICH_PCR) + codecs++; + if (glob_sta & ICH_SCR) + codecs++; + if (glob_sta & ICH_TCR) + codecs++; + chip->in_sdin_init = 1; + for (i = 0; i < codecs; i++) { + snd_intel8x0_codec_read_test(chip, i); + chip->ac97_sdin[i] = igetbyte(chip, ICHREG(SDM)) & ICH_LDI_MASK; + } + chip->in_sdin_init = 0; + } else { + codecs = glob_sta & ICH_SCR ? 2 : 1; } - chip->in_sdin_init = 0; - if (! codecs) - codecs = 1; } else { ops = &ali_bus_ops; codecs = 1; @@ -2128,7 +2120,6 @@ static int __devinit snd_intel8x0_mixer(struct intel8x0 *chip, int ac97_clock, else pbus->dra = 1; chip->ac97_bus = pbus; - chip->ncodecs = codecs; ac97.pci = chip->pci; for (i = 0; i < codecs; i++) { @@ -2273,7 +2264,7 @@ static int snd_intel8x0_ich_chip_init(struct intel8x0 *chip, int probing) end_time = jiffies + HZ; do { status = igetdword(chip, ICHREG(GLOB_STA)) & - chip->codec_isr_bits; + (ICH_PCR | ICH_SCR | ICH_TCR); if (status) break; schedule_timeout_uninterruptible(1); @@ -2285,27 +2276,32 @@ static int snd_intel8x0_ich_chip_init(struct intel8x0 *chip, int probing) return -EIO; } + if (chip->device_type == DEVICE_INTEL_ICH4) + /* ICH4 can have three codecs */ + nstatus = ICH_PCR | ICH_SCR | ICH_TCR; + else + /* others up to two codecs */ + nstatus = ICH_PCR | ICH_SCR; + /* wait for other codecs ready status. */ end_time = jiffies + HZ / 4; - while (status != chip->codec_isr_bits && - time_after_eq(end_time, jiffies)) { + while (status != nstatus && time_after_eq(end_time, jiffies)) { schedule_timeout_uninterruptible(1); - status |= igetdword(chip, ICHREG(GLOB_STA)) & - chip->codec_isr_bits; + status |= igetdword(chip, ICHREG(GLOB_STA)) & nstatus; } } else { /* resume phase */ int i; status = 0; - for (i = 0; i < chip->ncodecs; i++) + for (i = 0; i < 3; i++) if (chip->ac97[i]) - status |= chip->codec_bit[chip->ac97_sdin[i]]; + status |= get_ich_codec_bit(chip, i); /* wait until all the probed codecs are ready */ end_time = jiffies + HZ; do { nstatus = igetdword(chip, ICHREG(GLOB_STA)) & - chip->codec_isr_bits; + (ICH_PCR | ICH_SCR | ICH_TCR); if (status == nstatus) break; schedule_timeout_uninterruptible(1); @@ -2363,7 +2359,7 @@ static int snd_intel8x0_ali_chip_init(struct intel8x0 *chip, int probing) static int snd_intel8x0_chip_init(struct intel8x0 *chip, int probing) { - unsigned int i, timeout; + unsigned int i; int err; if (chip->device_type != DEVICE_ALI) { @@ -2381,15 +2377,6 @@ static int snd_intel8x0_chip_init(struct intel8x0 *chip, int probing) /* reset channels */ for (i = 0; i < chip->bdbars_count; i++) iputbyte(chip, ICH_REG_OFF_CR + chip->ichd[i].reg_offset, ICH_RESETREGS); - for (i = 0; i < chip->bdbars_count; i++) { - timeout = 100000; - while (--timeout != 0) { - if ((igetbyte(chip, ICH_REG_OFF_CR + chip->ichd[i].reg_offset) & ICH_RESETREGS) == 0) - break; - } - if (timeout == 0) - printk(KERN_ERR "intel8x0: reset of registers failed?\n"); - } /* initialize Buffer Descriptor Lists */ for (i = 0; i < chip->bdbars_count; i++) iputdword(chip, ICH_REG_OFF_BDBAR + chip->ichd[i].reg_offset, @@ -2460,7 +2447,7 @@ static int intel8x0_suspend(struct pci_dev *pci, pm_message_t state) } } } - for (i = 0; i < chip->ncodecs; i++) + for (i = 0; i < 3; i++) snd_ac97_suspend(chip->ac97[i]); if (chip->device_type == DEVICE_INTEL_ICH4) chip->sdm_saved = igetbyte(chip, ICHREG(SDM)); @@ -2481,7 +2468,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, IRQF_DISABLED|IRQF_SHARED, + request_irq(pci->irq, snd_intel8x0_interrupt, SA_INTERRUPT|SA_SHIRQ, card->shortname, chip); chip->irq = pci->irq; synchronize_irq(chip->irq); @@ -2501,7 +2488,7 @@ static int intel8x0_resume(struct pci_dev *pci) if (chip->fix_nocache) fill_nocache(chip->bdbars.area, chip->bdbars.bytes, 1); - for (i = 0; i < chip->ncodecs; i++) + for (i = 0; i < 3; i++) snd_ac97_resume(chip->ac97[i]); /* refill nocache */ @@ -2632,20 +2619,12 @@ static void snd_intel8x0_proc_read(struct snd_info_entry * entry, snd_iprintf(buffer, "Global status : 0x%08x\n", tmp); if (chip->device_type == DEVICE_INTEL_ICH4) snd_iprintf(buffer, "SDM : 0x%08x\n", igetdword(chip, ICHREG(SDM))); - snd_iprintf(buffer, "AC'97 codecs ready :"); - if (tmp & chip->codec_isr_bits) { - int i; - static const char *codecs[3] = { - "primary", "secondary", "tertiary" - }; - for (i = 0; i < chip->max_codecs; i++) - if (tmp & chip->codec_bit[i]) - snd_iprintf(buffer, " %s", codecs[i]); - } else - snd_iprintf(buffer, " none"); - snd_iprintf(buffer, "\n"); - if (chip->device_type == DEVICE_INTEL_ICH4 || - chip->device_type == DEVICE_SIS) + snd_iprintf(buffer, "AC'97 codecs ready :%s%s%s%s\n", + tmp & ICH_PCR ? " primary" : "", + tmp & ICH_SCR ? " secondary" : "", + tmp & ICH_TCR ? " tertiary" : "", + (tmp & (ICH_PCR | ICH_SCR | ICH_TCR)) == 0 ? " none" : ""); + if (chip->device_type == DEVICE_INTEL_ICH4) snd_iprintf(buffer, "AC'97 codecs SDIN : %i %i %i\n", chip->ac97_sdin[0], chip->ac97_sdin[1], @@ -2657,7 +2636,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, snd_intel8x0_proc_read); + snd_info_set_text_ops(entry, chip, 1024, snd_intel8x0_proc_read); } #else #define snd_intel8x0_proc_init(x) @@ -2674,13 +2653,6 @@ struct ich_reg_info { unsigned int offset; }; -static unsigned int ich_codec_bits[3] = { - ICH_PCR, ICH_SCR, ICH_TCR -}; -static unsigned int sis_codec_bits[3] = { - ICH_PCR, ICH_SCR, ICH_SIS_TCR -}; - static int __devinit snd_intel8x0_create(struct snd_card *card, struct pci_dev *pci, unsigned long device_type, @@ -2854,7 +2826,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, - IRQF_DISABLED|IRQF_SHARED, card->shortname, chip)) { + SA_INTERRUPT|SA_SHIRQ, card->shortname, chip)) { snd_printk(KERN_ERR "unable to grab IRQ %d\n", pci->irq); snd_intel8x0_free(chip); return -EBUSY; @@ -2863,29 +2835,6 @@ static int __devinit snd_intel8x0_create(struct snd_card *card, pci_set_master(pci); synchronize_irq(chip->irq); - switch(chip->device_type) { - case DEVICE_INTEL_ICH4: - /* ICH4 can have three codecs */ - chip->max_codecs = 3; - chip->codec_bit = ich_codec_bits; - chip->codec_ready_bits = ICH_PRI | ICH_SRI | ICH_TRI; - break; - case DEVICE_SIS: - /* recent SIS7012 can have three codecs */ - chip->max_codecs = 3; - chip->codec_bit = sis_codec_bits; - chip->codec_ready_bits = ICH_PRI | ICH_SRI | ICH_SIS_TRI; - break; - default: - /* others up to two codecs */ - chip->max_codecs = 2; - chip->codec_bit = ich_codec_bits; - chip->codec_ready_bits = ICH_PRI | ICH_SRI; - break; - } - for (i = 0; i < chip->max_codecs; i++) - chip->codec_isr_bits |= chip->codec_bit[i]; - if ((err = snd_intel8x0_chip_init(chip, 1)) < 0) { snd_intel8x0_free(chip); return err; diff --git a/sound/pci/intel8x0m.c b/sound/pci/intel8x0m.c index 91850281f..47e26aaa9 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; +static int ac97_clock = 0; module_param(index, int, 0444); MODULE_PARM_DESC(index, "Index value for Intel i8x0 modemcard."); @@ -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, snd_intel8x0m_proc_read); + snd_info_set_text_ops(entry, chip, 1024, 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, IRQF_DISABLED|IRQF_SHARED, + if (request_irq(pci->irq, snd_intel8x0_interrupt, SA_INTERRUPT|SA_SHIRQ, 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 cfea51f44..4eddb512c 100644 --- a/sound/pci/korg1212/korg1212.c +++ b/sound/pci/korg1212/korg1212.c @@ -27,7 +27,6 @@ #include #include #include -#include #include #include @@ -326,7 +325,7 @@ struct snd_korg1212 { int irq; spinlock_t lock; - struct mutex open_mutex; + struct semaphore open_mutex; struct timer_list timer; /* timer callback for checking ack of stop request */ int stop_pending_cnt; /* counter for stop pending check */ @@ -668,13 +667,13 @@ static int snd_korg1212_OpenCard(struct snd_korg1212 * korg1212) { K1212_DEBUG_PRINTK("K1212_DEBUG: OpenCard [%s] %d\n", stateName[korg1212->cardState], korg1212->opencnt); - mutex_lock(&korg1212->open_mutex); + down(&korg1212->open_mutex); if (korg1212->opencnt++ == 0) { snd_korg1212_TurnOffIdleMonitor(korg1212); snd_korg1212_setCardState(korg1212, K1212_STATE_OPEN); } - mutex_unlock(&korg1212->open_mutex); + up(&korg1212->open_mutex); return 1; } @@ -683,9 +682,9 @@ static int snd_korg1212_CloseCard(struct snd_korg1212 * korg1212) K1212_DEBUG_PRINTK("K1212_DEBUG: CloseCard [%s] %d\n", stateName[korg1212->cardState], korg1212->opencnt); - mutex_lock(&korg1212->open_mutex); + down(&korg1212->open_mutex); if (--(korg1212->opencnt)) { - mutex_unlock(&korg1212->open_mutex); + up(&korg1212->open_mutex); return 0; } @@ -696,7 +695,7 @@ static int snd_korg1212_CloseCard(struct snd_korg1212 * korg1212) K1212_DEBUG_PRINTK("K1212_DEBUG: CloseCard - RC = %d [%s]\n", rc, stateName[korg1212->cardState]); if (rc != K1212_CMDRET_Success) { - mutex_unlock(&korg1212->open_mutex); + up(&korg1212->open_mutex); return 0; } } else if (korg1212->cardState > K1212_STATE_SETUP) { @@ -708,7 +707,7 @@ static int snd_korg1212_CloseCard(struct snd_korg1212 * korg1212) snd_korg1212_setCardState(korg1212, K1212_STATE_READY); } - mutex_unlock(&korg1212->open_mutex); + up(&korg1212->open_mutex); return 0; } @@ -2085,7 +2084,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, snd_korg1212_proc_read); + snd_info_set_text_ops(entry, korg1212, 1024, snd_korg1212_proc_read); } static int @@ -2180,7 +2179,7 @@ static int __devinit snd_korg1212_create(struct snd_card *card, struct pci_dev * init_waitqueue_head(&korg1212->wait); spin_lock_init(&korg1212->lock); - mutex_init(&korg1212->open_mutex); + init_MUTEX(&korg1212->open_mutex); init_timer(&korg1212->timer); korg1212->timer.function = snd_korg1212_timer_func; korg1212->timer.data = (unsigned long)korg1212; @@ -2237,7 +2236,7 @@ static int __devinit snd_korg1212_create(struct snd_card *card, struct pci_dev * } err = request_irq(pci->irq, snd_korg1212_interrupt, - IRQF_DISABLED|IRQF_SHARED, + SA_INTERRUPT|SA_SHIRQ, "korg1212", korg1212); if (err) { diff --git a/sound/pci/maestro3.c b/sound/pci/maestro3.c index 45214b3b8..d3ef0cc6c 100644 --- a/sound/pci/maestro3.c +++ b/sound/pci/maestro3.c @@ -37,7 +37,6 @@ #include #include #include -#include #include #include #include @@ -830,8 +829,8 @@ struct snd_m3 { struct snd_pcm *pcm; struct pci_dev *pci; - const struct m3_quirk *quirk; - const struct m3_hv_quirk *hv_quirk; + struct m3_quirk *quirk; + struct m3_hv_quirk *hv_quirk; int dacs_active; int timer_users; @@ -891,7 +890,7 @@ static struct pci_device_id snd_m3_ids[] = { MODULE_DEVICE_TABLE(pci, snd_m3_ids); -static const struct m3_quirk m3_quirk_list[] = { +static struct m3_quirk m3_quirk_list[] = { /* panasonic CF-28 "toughbook" */ { .name = "Panasonic CF-28", @@ -949,7 +948,7 @@ static const struct m3_quirk m3_quirk_list[] = { }; /* These values came from the Windows driver. */ -static const struct m3_hv_quirk m3_hv_quirk_list[] = { +static struct m3_hv_quirk m3_hv_quirk_list[] = { /* Allegro chips */ { 0x125D, 0x1988, 0x0E11, 0x002E, HV_CTRL_ENABLE | HV_BUTTON_FROM_GD, 0 }, { 0x125D, 0x1988, 0x0E11, 0x0094, HV_CTRL_ENABLE | HV_BUTTON_FROM_GD, 0 }, @@ -1360,7 +1359,7 @@ static void snd_m3_pcm_setup2(struct snd_m3 *chip, struct m3_dma *s, } -static const struct play_vals { +static struct play_vals { u16 addr, val; } pv[] = { {CDATA_LEFT_VOLUME, ARB_VOLUME}, @@ -1427,7 +1426,7 @@ snd_m3_playback_setup(struct snd_m3 *chip, struct m3_dma *s, /* * Native record driver */ -static const struct rec_vals { +static struct rec_vals { u16 addr, val; } rv[] = { {CDATA_LEFT_VOLUME, ARB_VOLUME}, @@ -1597,26 +1596,12 @@ static void snd_m3_update_ptr(struct snd_m3 *chip, struct m3_dma *s) if (! s->running) return; - hwptr = snd_m3_get_pointer(chip, s, subs); - - /* try to avoid expensive modulo divisions */ - if (hwptr >= s->dma_size) - hwptr %= s->dma_size; - - diff = s->dma_size + hwptr - s->hwptr; - if (diff >= s->dma_size) - diff %= s->dma_size; - + hwptr = snd_m3_get_pointer(chip, s, subs) % s->dma_size; + diff = (s->dma_size + hwptr - s->hwptr) % s->dma_size; s->hwptr = hwptr; s->count += diff; - if (s->count >= (signed)s->period_size) { - - if (s->count < 2 * (signed)s->period_size) - s->count -= (signed)s->period_size; - else - s->count %= s->period_size; - + s->count %= s->period_size; spin_unlock(&chip->reg_lock); snd_pcm_period_elapsed(subs); spin_lock(&chip->reg_lock); @@ -1955,7 +1940,6 @@ static int snd_m3_ac97_wait(struct snd_m3 *chip) do { if (! (snd_m3_inb(chip, 0x30) & 1)) return 0; - cpu_relax(); } while (i-- > 0); snd_printk(KERN_ERR "ac97 serial bus busy\n"); @@ -1967,18 +1951,16 @@ snd_m3_ac97_read(struct snd_ac97 *ac97, unsigned short reg) { struct snd_m3 *chip = ac97->private_data; unsigned long flags; - unsigned short data = 0xffff; + unsigned short data; if (snd_m3_ac97_wait(chip)) - goto fail; + return 0xffff; spin_lock_irqsave(&chip->ac97_lock, flags); snd_m3_outb(chip, 0x80 | (reg & 0x7f), CODEC_COMMAND); if (snd_m3_ac97_wait(chip)) - goto fail_unlock; + return 0xffff; data = snd_m3_inw(chip, CODEC_DATA); -fail_unlock: spin_unlock_irqrestore(&chip->ac97_lock, flags); -fail: return data; } @@ -2137,7 +2119,7 @@ static int __devinit snd_m3_mixer(struct snd_m3 *chip) * DSP Code images */ -static const u16 assp_kernel_image[] = { +static u16 assp_kernel_image[] __devinitdata = { 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 +2206,7 @@ static const u16 assp_kernel_image[] = { * Mini sample rate converter code image * that is to be loaded at 0x400 on the DSP. */ -static const u16 assp_minisrc_image[] = { +static u16 assp_minisrc_image[] __devinitdata = { 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 +2249,12 @@ static const u16 assp_minisrc_image[] = { */ #define MINISRC_LPF_LEN 10 -static const u16 minisrc_lpf[MINISRC_LPF_LEN] = { +static u16 minisrc_lpf[MINISRC_LPF_LEN] __devinitdata = { 0X0743, 0X1104, 0X0A4C, 0XF88D, 0X242C, 0X1023, 0X1AA9, 0X0B60, 0XEFDD, 0X186F }; -static void snd_m3_assp_init(struct snd_m3 *chip) +static void __devinit snd_m3_assp_init(struct snd_m3 *chip) { unsigned int i; @@ -2374,7 +2356,7 @@ static int __devinit snd_m3_assp_client_init(struct snd_m3 *chip, struct m3_dma */ /* - * align instance address to 256 bytes so that its + * align instance address to 256 bytes so that it's * shifted list address is aligned. * list address = (mem address >> 1) >> 7; */ @@ -2663,8 +2645,8 @@ snd_m3_create(struct snd_card *card, struct pci_dev *pci, { struct snd_m3 *chip; int i, err; - const struct m3_quirk *quirk; - const struct m3_hv_quirk *hv_quirk; + struct m3_quirk *quirk; + struct m3_hv_quirk *hv_quirk; static struct snd_device_ops ops = { .dev_free = snd_m3_dev_free, }; @@ -2675,8 +2657,8 @@ snd_m3_create(struct snd_card *card, struct pci_dev *pci, return -EIO; /* check, if we can restrict PCI DMA transfers to 28 bits */ - if (pci_set_dma_mask(pci, DMA_28BIT_MASK) < 0 || - pci_set_consistent_dma_mask(pci, DMA_28BIT_MASK) < 0) { + if (pci_set_dma_mask(pci, 0x0fffffff) < 0 || + pci_set_consistent_dma_mask(pci, 0x0fffffff) < 0) { snd_printk(KERN_ERR "architecture does not support 28bit PCI busmaster DMA\n"); pci_disable_device(pci); return -ENXIO; @@ -2760,7 +2742,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, IRQF_DISABLED|IRQF_SHARED, + if (request_irq(pci->irq, snd_m3_interrupt, SA_INTERRUPT|SA_SHIRQ, card->driver, chip)) { snd_printk(KERN_ERR "unable to grab IRQ %d\n", pci->irq); snd_m3_free(chip); @@ -2859,13 +2841,12 @@ 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 */ + /* TODO enable midi irq and i/o */ err = snd_mpu401_uart_new(chip->card, 0, MPU401_HW_MPU401, - chip->iobase + MPU401_DATA_PORT, - MPU401_INFO_INTEGRATED, + chip->iobase + MPU401_DATA_PORT, 1, chip->irq, 0, &chip->rmidi); if (err < 0) - printk(KERN_WARNING "maestro3: no MIDI support.\n"); + printk(KERN_WARNING "maestro3: no midi support.\n"); #endif pci_set_drvdata(pci, card); diff --git a/sound/pci/mixart/mixart.c b/sound/pci/mixart/mixart.c index cc43ecd67..b218e1d20 100644 --- a/sound/pci/mixart/mixart.c +++ b/sound/pci/mixart/mixart.c @@ -25,10 +25,7 @@ #include #include #include -#include #include -#include - #include #include #include @@ -592,7 +589,7 @@ static int snd_mixart_hw_params(struct snd_pcm_substream *subs, /* set up format for the stream */ format = params_format(hw); - mutex_lock(&mgr->setup_mutex); + down(&mgr->setup_mutex); /* update the stream levels */ if( stream->pcm_number <= MIXART_PCM_DIGITAL ) { @@ -631,7 +628,7 @@ static int snd_mixart_hw_params(struct snd_pcm_substream *subs, bufferinfo[i].available_length, subs->number); } - mutex_unlock(&mgr->setup_mutex); + up(&mgr->setup_mutex); return err; } @@ -703,7 +700,7 @@ static int snd_mixart_playback_open(struct snd_pcm_substream *subs) int err = 0; int pcm_number; - mutex_lock(&mgr->setup_mutex); + down(&mgr->setup_mutex); if ( pcm == chip->pcm ) { pcm_number = MIXART_PCM_ANALOG; @@ -761,7 +758,7 @@ static int snd_mixart_playback_open(struct snd_pcm_substream *subs) } _exit_open: - mutex_unlock(&mgr->setup_mutex); + up(&mgr->setup_mutex); return err; } @@ -778,7 +775,7 @@ static int snd_mixart_capture_open(struct snd_pcm_substream *subs) int err = 0; int pcm_number; - mutex_lock(&mgr->setup_mutex); + down(&mgr->setup_mutex); if ( pcm == chip->pcm ) { pcm_number = MIXART_PCM_ANALOG; @@ -839,7 +836,7 @@ static int snd_mixart_capture_open(struct snd_pcm_substream *subs) } _exit_open: - mutex_unlock(&mgr->setup_mutex); + up(&mgr->setup_mutex); return err; } @@ -852,7 +849,7 @@ static int snd_mixart_close(struct snd_pcm_substream *subs) struct mixart_mgr *mgr = chip->mgr; struct mixart_stream *stream = subs->runtime->private_data; - mutex_lock(&mgr->setup_mutex); + down(&mgr->setup_mutex); snd_printdd("snd_mixart_close C%d/P%d/Sub%d\n", chip->chip_idx, stream->pcm_number, subs->number); @@ -871,7 +868,7 @@ static int snd_mixart_close(struct snd_pcm_substream *subs) stream->status = MIXART_STREAM_STATUS_FREE; stream->substream = NULL; - mutex_unlock(&mgr->setup_mutex); + up(&mgr->setup_mutex); return 0; } @@ -1244,6 +1241,7 @@ 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; } @@ -1290,7 +1288,7 @@ static int __devinit snd_mixart_probe(struct pci_dev *pci, pci_set_master(pci); /* check if we can restrict PCI DMA transfers to 32 bits */ - if (pci_set_dma_mask(pci, DMA_32BIT_MASK) < 0) { + if (pci_set_dma_mask(pci, 0xffffffff) < 0) { snd_printk(KERN_ERR "architecture does not support 32bit PCI busmaster DMA\n"); pci_disable_device(pci); return -ENXIO; @@ -1319,7 +1317,7 @@ static int __devinit snd_mixart_probe(struct pci_dev *pci, pci_resource_len(pci, i)); } - if (request_irq(pci->irq, snd_mixart_interrupt, IRQF_DISABLED|IRQF_SHARED, CARD_NAME, (void *)mgr)) { + if (request_irq(pci->irq, snd_mixart_interrupt, SA_INTERRUPT|SA_SHIRQ, CARD_NAME, (void *)mgr)) { snd_printk(KERN_ERR "unable to grab IRQ %d\n", pci->irq); snd_mixart_free(mgr); return -EBUSY; @@ -1337,12 +1335,12 @@ static int __devinit snd_mixart_probe(struct pci_dev *pci, mgr->msg_fifo_writeptr = 0; spin_lock_init(&mgr->msg_lock); - mutex_init(&mgr->msg_mutex); + init_MUTEX(&mgr->msg_mutex); init_waitqueue_head(&mgr->msg_sleep); atomic_set(&mgr->msg_processed, 0); /* init setup mutex*/ - mutex_init(&mgr->setup_mutex); + init_MUTEX(&mgr->setup_mutex); /* init message taslket */ tasklet_init(&mgr->msg_taskq, snd_mixart_msg_tasklet, (unsigned long) mgr); diff --git a/sound/pci/mixart/mixart.h b/sound/pci/mixart/mixart.h index 561634d5c..3e84863ca 100644 --- a/sound/pci/mixart/mixart.h +++ b/sound/pci/mixart/mixart.h @@ -24,7 +24,6 @@ #define __SOUND_MIXART_H #include -#include #include #define MIXART_DRIVER_VERSION 0x000100 /* 0.1.0 */ @@ -93,9 +92,9 @@ struct mixart_mgr { spinlock_t lock; /* interrupt spinlock */ spinlock_t msg_lock; /* mailbox spinlock */ - struct mutex msg_mutex; /* mutex for blocking_requests */ + struct semaphore msg_mutex; /* mutex for blocking_requests */ - struct mutex setup_mutex; /* mutex used in hw_params, open and close */ + struct semaphore setup_mutex; /* mutex used in hw_params, open and close */ /* hardware interface */ unsigned int dsp_loaded; /* bit flags of loaded dsp indices */ @@ -108,7 +107,7 @@ struct mixart_mgr { int sample_rate; int ref_count_rate; - struct mutex mixer_mutex; /* mutex for mixer */ + struct semaphore mixer_mutex; /* mutex for mixer */ }; diff --git a/sound/pci/mixart/mixart_core.c b/sound/pci/mixart/mixart_core.c index 406ac3a9d..07c707d7e 100644 --- a/sound/pci/mixart/mixart_core.c +++ b/sound/pci/mixart/mixart_core.c @@ -22,8 +22,6 @@ #include #include -#include - #include #include #include "mixart.h" @@ -241,7 +239,7 @@ int snd_mixart_send_msg(struct mixart_mgr *mgr, struct mixart_msg *request, int wait_queue_t wait; long timeout; - mutex_lock(&mgr->msg_mutex); + down(&mgr->msg_mutex); init_waitqueue_entry(&wait, current); @@ -250,7 +248,7 @@ int snd_mixart_send_msg(struct mixart_mgr *mgr, struct mixart_msg *request, int err = send_msg(mgr, request, max_resp_size, 1, &msg_frame); /* send and mark the answer pending */ if (err) { spin_unlock_irq(&mgr->msg_lock); - mutex_unlock(&mgr->msg_mutex); + up(&mgr->msg_mutex); return err; } @@ -262,7 +260,7 @@ int snd_mixart_send_msg(struct mixart_mgr *mgr, struct mixart_msg *request, int if (! timeout) { /* error - no ack */ - mutex_unlock(&mgr->msg_mutex); + up(&mgr->msg_mutex); snd_printk(KERN_ERR "error: no reponse on msg %x\n", msg_frame); return -EIO; } @@ -278,7 +276,7 @@ int snd_mixart_send_msg(struct mixart_mgr *mgr, struct mixart_msg *request, int if( request->message_id != resp.message_id ) snd_printk(KERN_ERR "REPONSE ERROR!\n"); - mutex_unlock(&mgr->msg_mutex); + up(&mgr->msg_mutex); return err; } @@ -294,7 +292,7 @@ int snd_mixart_send_msg_wait_notif(struct mixart_mgr *mgr, snd_assert((notif_event & MSG_TYPE_MASK) == MSG_TYPE_NOTIFY, return -EINVAL); snd_assert((notif_event & MSG_CANCEL_NOTIFY_MASK) == 0, return -EINVAL); - mutex_lock(&mgr->msg_mutex); + down(&mgr->msg_mutex); init_waitqueue_entry(&wait, current); @@ -303,7 +301,7 @@ int snd_mixart_send_msg_wait_notif(struct mixart_mgr *mgr, err = send_msg(mgr, request, MSG_DEFAULT_SIZE, 1, ¬if_event); /* send and mark the notification event pending */ if(err) { spin_unlock_irq(&mgr->msg_lock); - mutex_unlock(&mgr->msg_mutex); + up(&mgr->msg_mutex); return err; } @@ -315,12 +313,12 @@ int snd_mixart_send_msg_wait_notif(struct mixart_mgr *mgr, if (! timeout) { /* error - no ack */ - mutex_unlock(&mgr->msg_mutex); + up(&mgr->msg_mutex); snd_printk(KERN_ERR "error: notification %x not received\n", notif_event); return -EIO; } - mutex_unlock(&mgr->msg_mutex); + up(&mgr->msg_mutex); return 0; } diff --git a/sound/pci/mixart/mixart_mixer.c b/sound/pci/mixart/mixart_mixer.c index ed47b732c..36a7e9ddf 100644 --- a/sound/pci/mixart/mixart_mixer.c +++ b/sound/pci/mixart/mixart_mixer.c @@ -24,8 +24,6 @@ #include #include #include -#include - #include #include "mixart.h" #include "mixart_core.h" @@ -355,7 +353,7 @@ static int mixart_analog_vol_info(struct snd_kcontrol *kcontrol, struct snd_ctl_ static int mixart_analog_vol_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { struct snd_mixart *chip = snd_kcontrol_chip(kcontrol); - mutex_lock(&chip->mgr->mixer_mutex); + down(&chip->mgr->mixer_mutex); if(kcontrol->private_value == 0) { /* playback */ ucontrol->value.integer.value[0] = chip->analog_playback_volume[0]; ucontrol->value.integer.value[1] = chip->analog_playback_volume[1]; @@ -363,7 +361,7 @@ static int mixart_analog_vol_get(struct snd_kcontrol *kcontrol, struct snd_ctl_e ucontrol->value.integer.value[0] = chip->analog_capture_volume[0]; ucontrol->value.integer.value[1] = chip->analog_capture_volume[1]; } - mutex_unlock(&chip->mgr->mixer_mutex); + up(&chip->mgr->mixer_mutex); return 0; } @@ -373,7 +371,7 @@ static int mixart_analog_vol_put(struct snd_kcontrol *kcontrol, struct snd_ctl_e int changed = 0; int is_capture, i; - mutex_lock(&chip->mgr->mixer_mutex); + down(&chip->mgr->mixer_mutex); is_capture = (kcontrol->private_value != 0); for(i=0; i<2; i++) { int new_volume = ucontrol->value.integer.value[i]; @@ -384,7 +382,7 @@ static int mixart_analog_vol_put(struct snd_kcontrol *kcontrol, struct snd_ctl_e } } if(changed) mixart_update_analog_audio_level(chip, is_capture); - mutex_unlock(&chip->mgr->mixer_mutex); + up(&chip->mgr->mixer_mutex); return changed; } @@ -410,10 +408,10 @@ static int mixart_audio_sw_get(struct snd_kcontrol *kcontrol, struct snd_ctl_ele { struct snd_mixart *chip = snd_kcontrol_chip(kcontrol); - mutex_lock(&chip->mgr->mixer_mutex); + down(&chip->mgr->mixer_mutex); ucontrol->value.integer.value[0] = chip->analog_playback_active[0]; ucontrol->value.integer.value[1] = chip->analog_playback_active[1]; - mutex_unlock(&chip->mgr->mixer_mutex); + up(&chip->mgr->mixer_mutex); return 0; } @@ -421,7 +419,7 @@ static int mixart_audio_sw_put(struct snd_kcontrol *kcontrol, struct snd_ctl_ele { struct snd_mixart *chip = snd_kcontrol_chip(kcontrol); int i, changed = 0; - mutex_lock(&chip->mgr->mixer_mutex); + down(&chip->mgr->mixer_mutex); for(i=0; i<2; i++) { if(chip->analog_playback_active[i] != ucontrol->value.integer.value[i]) { chip->analog_playback_active[i] = ucontrol->value.integer.value[i]; @@ -429,7 +427,7 @@ static int mixart_audio_sw_put(struct snd_kcontrol *kcontrol, struct snd_ctl_ele } } if(changed) mixart_update_analog_audio_level(chip, 0); /* update playback levels */ - mutex_unlock(&chip->mgr->mixer_mutex); + up(&chip->mgr->mixer_mutex); return changed; } @@ -819,7 +817,7 @@ static int mixart_pcm_vol_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem int *stored_volume; int is_capture = kcontrol->private_value & MIXART_VOL_REC_MASK; int is_aes = kcontrol->private_value & MIXART_VOL_AES_MASK; - mutex_lock(&chip->mgr->mixer_mutex); + down(&chip->mgr->mixer_mutex); if(is_capture) { if(is_aes) stored_volume = chip->digital_capture_volume[1]; /* AES capture */ else stored_volume = chip->digital_capture_volume[0]; /* analog capture */ @@ -830,7 +828,7 @@ static int mixart_pcm_vol_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem } ucontrol->value.integer.value[0] = stored_volume[0]; ucontrol->value.integer.value[1] = stored_volume[1]; - mutex_unlock(&chip->mgr->mixer_mutex); + up(&chip->mgr->mixer_mutex); return 0; } @@ -843,7 +841,7 @@ static int mixart_pcm_vol_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem int is_aes = kcontrol->private_value & MIXART_VOL_AES_MASK; int* stored_volume; int i; - mutex_lock(&chip->mgr->mixer_mutex); + down(&chip->mgr->mixer_mutex); if(is_capture) { if(is_aes) stored_volume = chip->digital_capture_volume[1]; /* AES capture */ else stored_volume = chip->digital_capture_volume[0]; /* analog capture */ @@ -862,7 +860,7 @@ static int mixart_pcm_vol_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem if(is_capture) mixart_update_capture_stream_level(chip, is_aes); else mixart_update_playback_stream_level(chip, is_aes, idx); } - mutex_unlock(&chip->mgr->mixer_mutex); + up(&chip->mgr->mixer_mutex); return changed; } @@ -882,12 +880,12 @@ static int mixart_pcm_sw_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_ struct snd_mixart *chip = snd_kcontrol_chip(kcontrol); int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id); /* index */ snd_assert ( idx < MIXART_PLAYBACK_STREAMS ); - mutex_lock(&chip->mgr->mixer_mutex); + down(&chip->mgr->mixer_mutex); if(kcontrol->private_value & MIXART_VOL_AES_MASK) /* AES playback */ idx += MIXART_PLAYBACK_STREAMS; ucontrol->value.integer.value[0] = chip->digital_playback_active[idx][0]; ucontrol->value.integer.value[1] = chip->digital_playback_active[idx][1]; - mutex_unlock(&chip->mgr->mixer_mutex); + up(&chip->mgr->mixer_mutex); return 0; } @@ -899,7 +897,7 @@ static int mixart_pcm_sw_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_ int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id); /* index */ int i, j; snd_assert ( idx < MIXART_PLAYBACK_STREAMS ); - mutex_lock(&chip->mgr->mixer_mutex); + down(&chip->mgr->mixer_mutex); j = idx; if(is_aes) j += MIXART_PLAYBACK_STREAMS; for(i=0; i<2; i++) { @@ -909,7 +907,7 @@ static int mixart_pcm_sw_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_ } } if(changed) mixart_update_playback_stream_level(chip, is_aes, idx); - mutex_unlock(&chip->mgr->mixer_mutex); + up(&chip->mgr->mixer_mutex); return changed; } @@ -958,10 +956,10 @@ static int mixart_update_monitoring(struct snd_mixart* chip, int channel) static int mixart_monitor_vol_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { struct snd_mixart *chip = snd_kcontrol_chip(kcontrol); - mutex_lock(&chip->mgr->mixer_mutex); + down(&chip->mgr->mixer_mutex); ucontrol->value.integer.value[0] = chip->monitoring_volume[0]; ucontrol->value.integer.value[1] = chip->monitoring_volume[1]; - mutex_unlock(&chip->mgr->mixer_mutex); + up(&chip->mgr->mixer_mutex); return 0; } @@ -970,7 +968,7 @@ static int mixart_monitor_vol_put(struct snd_kcontrol *kcontrol, struct snd_ctl_ struct snd_mixart *chip = snd_kcontrol_chip(kcontrol); int changed = 0; int i; - mutex_lock(&chip->mgr->mixer_mutex); + down(&chip->mgr->mixer_mutex); for(i=0; i<2; i++) { if(chip->monitoring_volume[i] != ucontrol->value.integer.value[i]) { chip->monitoring_volume[i] = ucontrol->value.integer.value[i]; @@ -978,7 +976,7 @@ static int mixart_monitor_vol_put(struct snd_kcontrol *kcontrol, struct snd_ctl_ changed = 1; } } - mutex_unlock(&chip->mgr->mixer_mutex); + up(&chip->mgr->mixer_mutex); return changed; } @@ -997,10 +995,10 @@ static struct snd_kcontrol_new mixart_control_monitor_vol = { static int mixart_monitor_sw_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { struct snd_mixart *chip = snd_kcontrol_chip(kcontrol); - mutex_lock(&chip->mgr->mixer_mutex); + down(&chip->mgr->mixer_mutex); ucontrol->value.integer.value[0] = chip->monitoring_active[0]; ucontrol->value.integer.value[1] = chip->monitoring_active[1]; - mutex_unlock(&chip->mgr->mixer_mutex); + up(&chip->mgr->mixer_mutex); return 0; } @@ -1009,7 +1007,7 @@ static int mixart_monitor_sw_put(struct snd_kcontrol *kcontrol, struct snd_ctl_e struct snd_mixart *chip = snd_kcontrol_chip(kcontrol); int changed = 0; int i; - mutex_lock(&chip->mgr->mixer_mutex); + down(&chip->mgr->mixer_mutex); for(i=0; i<2; i++) { if(chip->monitoring_active[i] != ucontrol->value.integer.value[i]) { chip->monitoring_active[i] = ucontrol->value.integer.value[i]; @@ -1031,7 +1029,7 @@ static int mixart_monitor_sw_put(struct snd_kcontrol *kcontrol, struct snd_ctl_e } } - mutex_unlock(&chip->mgr->mixer_mutex); + up(&chip->mgr->mixer_mutex); return (changed != 0); } @@ -1061,7 +1059,7 @@ int snd_mixart_create_mixer(struct mixart_mgr *mgr) struct snd_mixart *chip; int err, i; - mutex_init(&mgr->mixer_mutex); /* can be in another place */ + init_MUTEX(&mgr->mixer_mutex); /* can be in another place */ for(i=0; inum_cards; i++) { struct snd_kcontrol_new temp; diff --git a/sound/pci/nm256/nm256.c b/sound/pci/nm256/nm256.c index 101eee0aa..0d0ff54f0 100644 --- a/sound/pci/nm256/nm256.c +++ b/sound/pci/nm256/nm256.c @@ -32,8 +32,6 @@ #include #include #include -#include - #include #include #include @@ -228,7 +226,6 @@ struct nm256 { unsigned int use_cache: 1; /* use one big coef. table */ unsigned int reset_workaround: 1; /* Workaround for some laptops to avoid freeze */ unsigned int reset_workaround_2: 1; /* Extended workaround for some other laptops to avoid freeze */ - unsigned int in_resume: 1; int mixer_base; /* register offset of ac97 mixer */ int mixer_status_offset; /* offset of mixer status reg. */ @@ -238,12 +235,11 @@ struct nm256 { int irq_acks; irqreturn_t (*interrupt)(int, void *, struct pt_regs *); int badintrcount; /* counter to check bogus interrupts */ - struct mutex irq_mutex; + struct semaphore irq_mutex; struct nm256_stream streams[2]; struct snd_ac97 *ac97; - unsigned short *ac97_regs; /* register caches, only for valid regs */ struct snd_pcm *pcm; @@ -463,32 +459,32 @@ snd_nm256_set_format(struct nm256 *chip, struct nm256_stream *s, /* acquire interrupt */ static int snd_nm256_acquire_irq(struct nm256 *chip) { - mutex_lock(&chip->irq_mutex); + down(&chip->irq_mutex); if (chip->irq < 0) { - if (request_irq(chip->pci->irq, chip->interrupt, IRQF_DISABLED|IRQF_SHARED, + if (request_irq(chip->pci->irq, chip->interrupt, SA_INTERRUPT|SA_SHIRQ, chip->card->driver, chip)) { snd_printk(KERN_ERR "unable to grab IRQ %d\n", chip->pci->irq); - mutex_unlock(&chip->irq_mutex); + up(&chip->irq_mutex); return -EBUSY; } chip->irq = chip->pci->irq; } chip->irq_acks++; - mutex_unlock(&chip->irq_mutex); + up(&chip->irq_mutex); return 0; } /* release interrupt */ static void snd_nm256_release_irq(struct nm256 *chip) { - mutex_lock(&chip->irq_mutex); + down(&chip->irq_mutex); if (chip->irq_acks > 0) chip->irq_acks--; if (chip->irq_acks == 0 && chip->irq >= 0) { free_irq(chip->irq, chip); chip->irq = -1; } - mutex_unlock(&chip->irq_mutex); + up(&chip->irq_mutex); } /* @@ -1155,63 +1151,23 @@ snd_nm256_ac97_ready(struct nm256 *chip) return 0; } -/* - * Initial register values to be written to the AC97 mixer. - * While most of these are identical to the reset values, we do this - * so that we have most of the register contents cached--this avoids - * reading from the mixer directly (which seems to be problematic, - * probably due to ignorance). - */ - -struct initialValues { - unsigned short reg; - unsigned short value; -}; - -static struct initialValues nm256_ac97_init_val[] = -{ - { AC97_MASTER, 0x8000 }, - { AC97_HEADPHONE, 0x8000 }, - { AC97_MASTER_MONO, 0x8000 }, - { AC97_PC_BEEP, 0x8000 }, - { AC97_PHONE, 0x8008 }, - { AC97_MIC, 0x8000 }, - { AC97_LINE, 0x8808 }, - { AC97_CD, 0x8808 }, - { AC97_VIDEO, 0x8808 }, - { AC97_AUX, 0x8808 }, - { AC97_PCM, 0x8808 }, - { AC97_REC_SEL, 0x0000 }, - { AC97_REC_GAIN, 0x0B0B }, - { AC97_GENERAL_PURPOSE, 0x0000 }, - { AC97_3D_CONTROL, 0x8000 }, - { AC97_VENDOR_ID1, 0x8384 }, - { AC97_VENDOR_ID2, 0x7609 }, -}; - -static int nm256_ac97_idx(unsigned short reg) -{ - int i; - for (i = 0; i < ARRAY_SIZE(nm256_ac97_init_val); i++) - if (nm256_ac97_init_val[i].reg == reg) - return i; - return -1; -} - /* - * some nm256 easily crash when reading from mixer registers - * thus we're treating it as a write-only mixer and cache the - * written values */ static unsigned short snd_nm256_ac97_read(struct snd_ac97 *ac97, unsigned short reg) { struct nm256 *chip = ac97->private_data; - int idx = nm256_ac97_idx(reg); + int res; - if (idx < 0) + if (reg >= 128) return 0; - return chip->ac97_regs[idx]; + + if (! snd_nm256_ac97_ready(chip)) + return 0; + res = snd_nm256_readw(chip, chip->mixer_base + reg); + /* Magic delay. Bleah yucky. */ + msleep(1); + return res; } /* @@ -1222,12 +1178,8 @@ snd_nm256_ac97_write(struct snd_ac97 *ac97, { struct nm256 *chip = ac97->private_data; int tries = 2; - int idx = nm256_ac97_idx(reg); u32 base; - if (idx < 0) - return; - base = chip->mixer_base; snd_nm256_ac97_ready(chip); @@ -1236,32 +1188,12 @@ snd_nm256_ac97_write(struct snd_ac97 *ac97, while (tries-- > 0) { snd_nm256_writew(chip, base + reg, val); msleep(1); /* a little delay here seems better.. */ - if (snd_nm256_ac97_ready(chip)) { - /* successful write: set cache */ - chip->ac97_regs[idx] = val; + if (snd_nm256_ac97_ready(chip)) return; - } } snd_printd("nm256: ac97 codec not ready..\n"); } -/* static resolution table */ -static struct snd_ac97_res_table nm256_res_table[] = { - { AC97_MASTER, 0x1f1f }, - { AC97_HEADPHONE, 0x1f1f }, - { AC97_MASTER_MONO, 0x001f }, - { AC97_PC_BEEP, 0x001f }, - { AC97_PHONE, 0x001f }, - { AC97_MIC, 0x001f }, - { AC97_LINE, 0x1f1f }, - { AC97_CD, 0x1f1f }, - { AC97_VIDEO, 0x1f1f }, - { AC97_AUX, 0x1f1f }, - { AC97_PCM, 0x1f1f }, - { AC97_REC_GAIN, 0x0f0f }, - { } /* terminator */ -}; - /* initialize the ac97 into a known state */ static void snd_nm256_ac97_reset(struct snd_ac97 *ac97) @@ -1279,16 +1211,6 @@ snd_nm256_ac97_reset(struct snd_ac97 *ac97) snd_nm256_writeb(chip, 0x6cc, 0x80); snd_nm256_writeb(chip, 0x6cc, 0x0); } - if (! chip->in_resume) { - int i; - for (i = 0; i < ARRAY_SIZE(nm256_ac97_init_val); i++) { - /* preload the cache, so as to avoid even a single - * read of the mixer regs - */ - snd_nm256_ac97_write(ac97, nm256_ac97_init_val[i].reg, - nm256_ac97_init_val[i].value); - } - } } /* create an ac97 mixer interface */ @@ -1297,25 +1219,32 @@ snd_nm256_mixer(struct nm256 *chip) { struct snd_ac97_bus *pbus; struct snd_ac97_template ac97; - int err; + int i, err; static struct snd_ac97_bus_ops ops = { .reset = snd_nm256_ac97_reset, .write = snd_nm256_ac97_write, .read = snd_nm256_ac97_read, }; - - chip->ac97_regs = kcalloc(sizeof(short), - ARRAY_SIZE(nm256_ac97_init_val), GFP_KERNEL); - if (! chip->ac97_regs) - return -ENOMEM; + /* looks like nm256 hangs up when unexpected registers are touched... */ + static int mixer_regs[] = { + AC97_MASTER, AC97_HEADPHONE, AC97_MASTER_MONO, + AC97_PC_BEEP, AC97_PHONE, AC97_MIC, AC97_LINE, AC97_CD, + AC97_VIDEO, AC97_AUX, AC97_PCM, AC97_REC_SEL, + AC97_REC_GAIN, AC97_GENERAL_PURPOSE, AC97_3D_CONTROL, + /*AC97_EXTENDED_ID,*/ + AC97_VENDOR_ID1, AC97_VENDOR_ID2, + -1 + }; if ((err = snd_ac97_bus(chip->card, 0, &ops, NULL, &pbus)) < 0) return err; memset(&ac97, 0, sizeof(ac97)); ac97.scaps = AC97_SCAP_AUDIO; /* we support audio! */ + ac97.limited_regs = 1; + for (i = 0; mixer_regs[i] >= 0; i++) + set_bit(mixer_regs[i], ac97.reg_accessed); ac97.private_data = chip; - ac97.res_table = nm256_res_table; pbus->no_vra = 1; err = snd_ac97_mixer(pbus, &ac97, &chip->ac97); if (err < 0) @@ -1400,7 +1329,6 @@ static int nm256_resume(struct pci_dev *pci) int i; /* Perform a full reset on the hardware */ - chip->in_resume = 1; pci_restore_state(pci); pci_enable_device(pci); snd_nm256_init_chip(chip); @@ -1418,7 +1346,6 @@ static int nm256_resume(struct pci_dev *pci) } snd_power_change_state(card, SNDRV_CTL_POWER_D0); - chip->in_resume = 0; return 0; } #endif /* CONFIG_PM */ @@ -1443,7 +1370,6 @@ static int snd_nm256_free(struct nm256 *chip) free_irq(chip->irq, chip); pci_disable_device(chip->pci); - kfree(chip->ac97_regs); kfree(chip); return 0; } @@ -1481,7 +1407,7 @@ snd_nm256_create(struct snd_card *card, struct pci_dev *pci, chip->use_cache = use_cache; spin_lock_init(&chip->reg_lock); chip->irq = -1; - mutex_init(&chip->irq_mutex); + init_MUTEX(&chip->irq_mutex); /* store buffer sizes in bytes */ chip->streams[SNDRV_PCM_STREAM_PLAYBACK].bufsize = playback_bufsize * 1024; diff --git a/sound/pci/pcxhr/pcxhr.c b/sound/pci/pcxhr/pcxhr.c index 533c672ae..b2cba75b6 100644 --- a/sound/pci/pcxhr/pcxhr.c +++ b/sound/pci/pcxhr/pcxhr.c @@ -26,11 +26,8 @@ #include #include #include -#include #include #include -#include - #include #include #include @@ -521,7 +518,7 @@ static void pcxhr_trigger_tasklet(unsigned long arg) struct timeval my_tv1, my_tv2; do_gettimeofday(&my_tv1); #endif - mutex_lock(&mgr->setup_mutex); + down(&mgr->setup_mutex); /* check the pipes concerned and build pipe_array */ for (i = 0; i < mgr->num_cards; i++) { @@ -540,7 +537,7 @@ static void pcxhr_trigger_tasklet(unsigned long arg) } } if (capture_mask == 0 && playback_mask == 0) { - mutex_unlock(&mgr->setup_mutex); + up(&mgr->setup_mutex); snd_printk(KERN_ERR "pcxhr_trigger_tasklet : no pipes\n"); return; } @@ -551,7 +548,7 @@ static void pcxhr_trigger_tasklet(unsigned long arg) /* synchronous stop of all the pipes concerned */ err = pcxhr_set_pipe_state(mgr, playback_mask, capture_mask, 0); if (err) { - mutex_unlock(&mgr->setup_mutex); + up(&mgr->setup_mutex); snd_printk(KERN_ERR "pcxhr_trigger_tasklet : error stop pipes (P%x C%x)\n", playback_mask, capture_mask); return; @@ -595,7 +592,7 @@ static void pcxhr_trigger_tasklet(unsigned long arg) /* synchronous start of all the pipes concerned */ err = pcxhr_set_pipe_state(mgr, playback_mask, capture_mask, 1); if (err) { - mutex_unlock(&mgr->setup_mutex); + up(&mgr->setup_mutex); snd_printk(KERN_ERR "pcxhr_trigger_tasklet : error start pipes (P%x C%x)\n", playback_mask, capture_mask); return; @@ -622,7 +619,7 @@ static void pcxhr_trigger_tasklet(unsigned long arg) } spin_unlock_irqrestore(&mgr->lock, flags); - mutex_unlock(&mgr->setup_mutex); + up(&mgr->setup_mutex); #ifdef CONFIG_SND_DEBUG_DETECT do_gettimeofday(&my_tv2); @@ -731,7 +728,7 @@ static int pcxhr_prepare(struct snd_pcm_substream *subs) } */ - mutex_lock(&mgr->setup_mutex); + down(&mgr->setup_mutex); do { /* if the stream was stopped before, format and buffer were reset */ @@ -758,7 +755,7 @@ static int pcxhr_prepare(struct snd_pcm_substream *subs) } } while(0); /* do only once (so we can use break instead of goto) */ - mutex_unlock(&mgr->setup_mutex); + up(&mgr->setup_mutex); return err; } @@ -783,7 +780,7 @@ static int pcxhr_hw_params(struct snd_pcm_substream *subs, /* set up format for the stream */ format = params_format(hw); - mutex_lock(&mgr->setup_mutex); + down(&mgr->setup_mutex); stream->channels = channels; stream->format = format; @@ -792,7 +789,7 @@ static int pcxhr_hw_params(struct snd_pcm_substream *subs, /* err = pcxhr_set_format(stream); if(err) { - mutex_unlock(&mgr->setup_mutex); + up(&mgr->setup_mutex); return err; } */ @@ -804,7 +801,7 @@ static int pcxhr_hw_params(struct snd_pcm_substream *subs, err = pcxhr_update_r_buffer(stream); } */ - mutex_unlock(&mgr->setup_mutex); + up(&mgr->setup_mutex); return err; } @@ -850,7 +847,7 @@ static int pcxhr_open(struct snd_pcm_substream *subs) struct pcxhr_stream *stream; int is_capture; - mutex_lock(&mgr->setup_mutex); + down(&mgr->setup_mutex); /* copy the struct snd_pcm_hardware struct */ runtime->hw = pcxhr_caps; @@ -874,7 +871,7 @@ static int pcxhr_open(struct snd_pcm_substream *subs) /* streams in use */ snd_printk(KERN_ERR "pcxhr_open chip%d subs%d in use\n", chip->chip_idx, subs->number); - mutex_unlock(&mgr->setup_mutex); + up(&mgr->setup_mutex); return -EBUSY; } @@ -890,7 +887,7 @@ static int pcxhr_open(struct snd_pcm_substream *subs) &external_rate) || external_rate == 0) { /* cannot detect the external clock rate */ - mutex_unlock(&mgr->setup_mutex); + up(&mgr->setup_mutex); return -EBUSY; } runtime->hw.rate_min = runtime->hw.rate_max = external_rate; @@ -908,7 +905,7 @@ static int pcxhr_open(struct snd_pcm_substream *subs) mgr->ref_count_rate++; - mutex_unlock(&mgr->setup_mutex); + up(&mgr->setup_mutex); return 0; } @@ -919,7 +916,7 @@ static int pcxhr_close(struct snd_pcm_substream *subs) struct pcxhr_mgr *mgr = chip->mgr; struct pcxhr_stream *stream = subs->runtime->private_data; - mutex_lock(&mgr->setup_mutex); + down(&mgr->setup_mutex); snd_printdd("pcxhr_close chip%d subs%d\n", chip->chip_idx, subs->number); @@ -932,7 +929,7 @@ static int pcxhr_close(struct snd_pcm_substream *subs) stream->status = PCXHR_STREAM_STATUS_FREE; stream->substream = NULL; - mutex_unlock(&mgr->setup_mutex); + up(&mgr->setup_mutex); return 0; } @@ -1150,9 +1147,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, pcxhr_proc_info); + snd_info_set_text_ops(entry, chip, 1024, pcxhr_proc_info); if (! snd_card_proc_new(chip->card, "sync", &entry)) - snd_info_set_text_ops(entry, chip, pcxhr_proc_sync); + snd_info_set_text_ops(entry, chip, 1024, pcxhr_proc_sync); } /* end of proc interface */ @@ -1218,7 +1215,7 @@ static int __devinit pcxhr_probe(struct pci_dev *pci, const struct pci_device_id pci_set_master(pci); /* check if we can restrict PCI DMA transfers to 32 bits */ - if (pci_set_dma_mask(pci, DMA_32BIT_MASK) < 0) { + if (pci_set_dma_mask(pci, 0xffffffff) < 0) { snd_printk(KERN_ERR "architecture does not support 32bit PCI busmaster DMA\n"); pci_disable_device(pci); return -ENXIO; @@ -1250,7 +1247,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, IRQF_DISABLED|IRQF_SHARED, + if (request_irq(pci->irq, pcxhr_interrupt, SA_INTERRUPT|SA_SHIRQ, card_name, mgr)) { snd_printk(KERN_ERR "unable to grab IRQ %d\n", pci->irq); pcxhr_free(mgr); @@ -1267,7 +1264,7 @@ static int __devinit pcxhr_probe(struct pci_dev *pci, const struct pci_device_id spin_lock_init(&mgr->msg_lock); /* init setup mutex*/ - mutex_init(&mgr->setup_mutex); + init_MUTEX(&mgr->setup_mutex); /* init taslket */ tasklet_init(&mgr->msg_taskq, pcxhr_msg_tasklet, (unsigned long) mgr); diff --git a/sound/pci/pcxhr/pcxhr.h b/sound/pci/pcxhr/pcxhr.h index 652064787..049f2b3f2 100644 --- a/sound/pci/pcxhr/pcxhr.h +++ b/sound/pci/pcxhr/pcxhr.h @@ -24,7 +24,6 @@ #define __SOUND_PCXHR_H #include -#include #include #define PCXHR_DRIVER_VERSION 0x000804 /* 0.8.4 */ @@ -77,8 +76,8 @@ struct pcxhr_mgr { spinlock_t lock; /* interrupt spinlock */ spinlock_t msg_lock; /* message spinlock */ - struct mutex setup_mutex; /* mutex used in hw_params, open and close */ - struct mutex mixer_mutex; /* mutex for mixer */ + struct semaphore setup_mutex; /* mutex used in hw_params, open and close */ + struct semaphore mixer_mutex; /* mutex for mixer */ /* hardware interface */ unsigned int dsp_loaded; /* bit flags of loaded dsp indices */ diff --git a/sound/pci/pcxhr/pcxhr_core.c b/sound/pci/pcxhr/pcxhr_core.c index c40f59062..fa0d27e2c 100644 --- a/sound/pci/pcxhr/pcxhr_core.c +++ b/sound/pci/pcxhr/pcxhr_core.c @@ -274,9 +274,12 @@ int pcxhr_load_xilinx_binary(struct pcxhr_mgr *mgr, const struct firmware *xilin /* test first xilinx */ chipsc = PCXHR_INPL(mgr, PCXHR_PLX_CHIPSC); - /* REV01 cards do not support the PCXHR_CHIPSC_GPI_USERI bit anymore */ - /* this bit will always be 1; no possibility to test presence of first xilinx */ - if(second) { + if (!second) { + if (chipsc & PCXHR_CHIPSC_GPI_USERI) { + snd_printdd("no need to load first xilinx\n"); + return 0; /* first xilinx is already present and cannot be reset */ + } + } else { if ((chipsc & PCXHR_CHIPSC_GPI_USERI) == 0) { snd_printk(KERN_ERR "error loading first xilinx\n"); return -EINVAL; @@ -1173,7 +1176,7 @@ irqreturn_t pcxhr_interrupt(int irq, void *dev_id, struct pt_regs *regs) mgr->dsp_time_last = dsp_time_new; if (timer_toggle == mgr->timer_toggle) - snd_printdd("ERROR TIMER TOGGLE\n"); + snd_printk(KERN_ERR "ERROR TIMER TOGGLE\n"); mgr->timer_toggle = timer_toggle; reg &= ~PCXHR_IRQ_TIMER; diff --git a/sound/pci/pcxhr/pcxhr_hwdep.c b/sound/pci/pcxhr/pcxhr_hwdep.c index 369c19fea..03517c10e 100644 --- a/sound/pci/pcxhr/pcxhr_hwdep.c +++ b/sound/pci/pcxhr/pcxhr_hwdep.c @@ -385,8 +385,8 @@ static int pcxhr_hwdep_dsp_load(struct snd_hwdep *hw, fw.size = dsp->length; fw.data = vmalloc(fw.size); if (! fw.data) { - snd_printk(KERN_ERR "pcxhr: cannot allocate dsp image (%lu bytes)\n", - (unsigned long)fw.size); + snd_printk(KERN_ERR "pcxhr: cannot allocate dsp image (%d bytes)\n", + fw.size); return -ENOMEM; } if (copy_from_user(fw.data, dsp->image, dsp->length)) { diff --git a/sound/pci/pcxhr/pcxhr_mixer.c b/sound/pci/pcxhr/pcxhr_mixer.c index 94e63a1e9..760e733ac 100644 --- a/sound/pci/pcxhr/pcxhr_mixer.c +++ b/sound/pci/pcxhr/pcxhr_mixer.c @@ -25,7 +25,6 @@ #include #include #include -#include #include #include "pcxhr.h" #include "pcxhr_hwdep.h" @@ -93,7 +92,7 @@ static int pcxhr_analog_vol_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { struct snd_pcxhr *chip = snd_kcontrol_chip(kcontrol); - mutex_lock(&chip->mgr->mixer_mutex); + down(&chip->mgr->mixer_mutex); if (kcontrol->private_value == 0) { /* playback */ ucontrol->value.integer.value[0] = chip->analog_playback_volume[0]; ucontrol->value.integer.value[1] = chip->analog_playback_volume[1]; @@ -101,7 +100,7 @@ static int pcxhr_analog_vol_get(struct snd_kcontrol *kcontrol, ucontrol->value.integer.value[0] = chip->analog_capture_volume[0]; ucontrol->value.integer.value[1] = chip->analog_capture_volume[1]; } - mutex_unlock(&chip->mgr->mixer_mutex); + up(&chip->mgr->mixer_mutex); return 0; } @@ -112,7 +111,7 @@ static int pcxhr_analog_vol_put(struct snd_kcontrol *kcontrol, int changed = 0; int is_capture, i; - mutex_lock(&chip->mgr->mixer_mutex); + down(&chip->mgr->mixer_mutex); is_capture = (kcontrol->private_value != 0); for (i = 0; i < 2; i++) { int new_volume = ucontrol->value.integer.value[i]; @@ -124,7 +123,7 @@ static int pcxhr_analog_vol_put(struct snd_kcontrol *kcontrol, pcxhr_update_analog_audio_level(chip, is_capture, i); } } - mutex_unlock(&chip->mgr->mixer_mutex); + up(&chip->mgr->mixer_mutex); return changed; } @@ -151,10 +150,10 @@ static int pcxhr_audio_sw_get(struct snd_kcontrol *kcontrol, { struct snd_pcxhr *chip = snd_kcontrol_chip(kcontrol); - mutex_lock(&chip->mgr->mixer_mutex); + down(&chip->mgr->mixer_mutex); ucontrol->value.integer.value[0] = chip->analog_playback_active[0]; ucontrol->value.integer.value[1] = chip->analog_playback_active[1]; - mutex_unlock(&chip->mgr->mixer_mutex); + up(&chip->mgr->mixer_mutex); return 0; } @@ -163,7 +162,7 @@ static int pcxhr_audio_sw_put(struct snd_kcontrol *kcontrol, { struct snd_pcxhr *chip = snd_kcontrol_chip(kcontrol); int i, changed = 0; - mutex_lock(&chip->mgr->mixer_mutex); + down(&chip->mgr->mixer_mutex); for(i = 0; i < 2; i++) { if (chip->analog_playback_active[i] != ucontrol->value.integer.value[i]) { chip->analog_playback_active[i] = ucontrol->value.integer.value[i]; @@ -171,7 +170,7 @@ static int pcxhr_audio_sw_put(struct snd_kcontrol *kcontrol, pcxhr_update_analog_audio_level(chip, 0, i); /* update playback levels */ } } - mutex_unlock(&chip->mgr->mixer_mutex); + up(&chip->mgr->mixer_mutex); return changed; } @@ -300,14 +299,14 @@ static int pcxhr_pcm_vol_get(struct snd_kcontrol *kcontrol, int *stored_volume; int is_capture = kcontrol->private_value; - mutex_lock(&chip->mgr->mixer_mutex); + down(&chip->mgr->mixer_mutex); if (is_capture) stored_volume = chip->digital_capture_volume; /* digital capture */ else stored_volume = chip->digital_playback_volume[idx]; /* digital playback */ ucontrol->value.integer.value[0] = stored_volume[0]; ucontrol->value.integer.value[1] = stored_volume[1]; - mutex_unlock(&chip->mgr->mixer_mutex); + up(&chip->mgr->mixer_mutex); return 0; } @@ -321,7 +320,7 @@ static int pcxhr_pcm_vol_put(struct snd_kcontrol *kcontrol, int *stored_volume; int i; - mutex_lock(&chip->mgr->mixer_mutex); + down(&chip->mgr->mixer_mutex); if (is_capture) stored_volume = chip->digital_capture_volume; /* digital capture */ else @@ -336,7 +335,7 @@ static int pcxhr_pcm_vol_put(struct snd_kcontrol *kcontrol, } if (! is_capture && changed) pcxhr_update_playback_stream_level(chip, idx); /* update playback volume */ - mutex_unlock(&chip->mgr->mixer_mutex); + up(&chip->mgr->mixer_mutex); return changed; } @@ -357,10 +356,10 @@ static int pcxhr_pcm_sw_get(struct snd_kcontrol *kcontrol, struct snd_pcxhr *chip = snd_kcontrol_chip(kcontrol); int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id); /* index */ - mutex_lock(&chip->mgr->mixer_mutex); + down(&chip->mgr->mixer_mutex); ucontrol->value.integer.value[0] = chip->digital_playback_active[idx][0]; ucontrol->value.integer.value[1] = chip->digital_playback_active[idx][1]; - mutex_unlock(&chip->mgr->mixer_mutex); + up(&chip->mgr->mixer_mutex); return 0; } @@ -371,7 +370,7 @@ static int pcxhr_pcm_sw_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_v int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id); /* index */ int i, j; - mutex_lock(&chip->mgr->mixer_mutex); + down(&chip->mgr->mixer_mutex); j = idx; for (i = 0; i < 2; i++) { if (chip->digital_playback_active[j][i] != ucontrol->value.integer.value[i]) { @@ -381,7 +380,7 @@ static int pcxhr_pcm_sw_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_v } if (changed) pcxhr_update_playback_stream_level(chip, idx); - mutex_unlock(&chip->mgr->mixer_mutex); + up(&chip->mgr->mixer_mutex); return changed; } @@ -403,10 +402,10 @@ static int pcxhr_monitor_vol_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { struct snd_pcxhr *chip = snd_kcontrol_chip(kcontrol); - mutex_lock(&chip->mgr->mixer_mutex); + down(&chip->mgr->mixer_mutex); ucontrol->value.integer.value[0] = chip->monitoring_volume[0]; ucontrol->value.integer.value[1] = chip->monitoring_volume[1]; - mutex_unlock(&chip->mgr->mixer_mutex); + up(&chip->mgr->mixer_mutex); return 0; } @@ -417,7 +416,7 @@ static int pcxhr_monitor_vol_put(struct snd_kcontrol *kcontrol, int changed = 0; int i; - mutex_lock(&chip->mgr->mixer_mutex); + down(&chip->mgr->mixer_mutex); for (i = 0; i < 2; i++) { if (chip->monitoring_volume[i] != ucontrol->value.integer.value[i]) { chip->monitoring_volume[i] = ucontrol->value.integer.value[i]; @@ -427,7 +426,7 @@ static int pcxhr_monitor_vol_put(struct snd_kcontrol *kcontrol, changed = 1; } } - mutex_unlock(&chip->mgr->mixer_mutex); + up(&chip->mgr->mixer_mutex); return changed; } @@ -447,10 +446,10 @@ static int pcxhr_monitor_sw_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { struct snd_pcxhr *chip = snd_kcontrol_chip(kcontrol); - mutex_lock(&chip->mgr->mixer_mutex); + down(&chip->mgr->mixer_mutex); ucontrol->value.integer.value[0] = chip->monitoring_active[0]; ucontrol->value.integer.value[1] = chip->monitoring_active[1]; - mutex_unlock(&chip->mgr->mixer_mutex); + up(&chip->mgr->mixer_mutex); return 0; } @@ -461,7 +460,7 @@ static int pcxhr_monitor_sw_put(struct snd_kcontrol *kcontrol, int changed = 0; int i; - mutex_lock(&chip->mgr->mixer_mutex); + down(&chip->mgr->mixer_mutex); for (i = 0; i < 2; i++) { if (chip->monitoring_active[i] != ucontrol->value.integer.value[i]) { chip->monitoring_active[i] = ucontrol->value.integer.value[i]; @@ -475,7 +474,7 @@ static int pcxhr_monitor_sw_put(struct snd_kcontrol *kcontrol, /* update right monitoring volume and mute */ pcxhr_update_audio_pipe_level(chip, 0, 1); - mutex_unlock(&chip->mgr->mixer_mutex); + up(&chip->mgr->mixer_mutex); return (changed != 0); } @@ -572,13 +571,13 @@ static int pcxhr_audio_src_put(struct snd_kcontrol *kcontrol, struct snd_pcxhr *chip = snd_kcontrol_chip(kcontrol); int ret = 0; - mutex_lock(&chip->mgr->mixer_mutex); + down(&chip->mgr->mixer_mutex); if (chip->audio_capture_source != ucontrol->value.enumerated.item[0]) { chip->audio_capture_source = ucontrol->value.enumerated.item[0]; pcxhr_set_audio_source(chip); ret = 1; } - mutex_unlock(&chip->mgr->mixer_mutex); + up(&chip->mgr->mixer_mutex); return ret; } @@ -637,9 +636,9 @@ static int pcxhr_clock_type_put(struct snd_kcontrol *kcontrol, struct pcxhr_mgr *mgr = snd_kcontrol_chip(kcontrol); int rate, ret = 0; - mutex_lock(&mgr->mixer_mutex); + down(&mgr->mixer_mutex); if (mgr->use_clock_type != ucontrol->value.enumerated.item[0]) { - mutex_lock(&mgr->setup_mutex); + down(&mgr->setup_mutex); mgr->use_clock_type = ucontrol->value.enumerated.item[0]; if (mgr->use_clock_type) pcxhr_get_external_clock(mgr, mgr->use_clock_type, &rate); @@ -650,10 +649,10 @@ static int pcxhr_clock_type_put(struct snd_kcontrol *kcontrol, if (mgr->sample_rate) mgr->sample_rate = rate; } - mutex_unlock(&mgr->setup_mutex); + up(&mgr->setup_mutex); ret = 1; /* return 1 even if the set was not done. ok ? */ } - mutex_unlock(&mgr->mixer_mutex); + up(&mgr->mixer_mutex); return ret; } @@ -686,7 +685,7 @@ static int pcxhr_clock_rate_get(struct snd_kcontrol *kcontrol, struct pcxhr_mgr *mgr = snd_kcontrol_chip(kcontrol); int i, err, rate; - mutex_lock(&mgr->mixer_mutex); + down(&mgr->mixer_mutex); for(i = 0; i < 3 + mgr->capture_chips; i++) { if (i == PCXHR_CLOCK_TYPE_INTERNAL) rate = mgr->sample_rate_real; @@ -697,7 +696,7 @@ static int pcxhr_clock_rate_get(struct snd_kcontrol *kcontrol, } ucontrol->value.integer.value[i] = rate; } - mutex_unlock(&mgr->mixer_mutex); + up(&mgr->mixer_mutex); return 0; } @@ -766,7 +765,7 @@ static int pcxhr_iec958_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_v unsigned char aes_bits; int i, err; - mutex_lock(&chip->mgr->mixer_mutex); + down(&chip->mgr->mixer_mutex); for(i = 0; i < 5; i++) { if (kcontrol->private_value == 0) /* playback */ aes_bits = chip->aes_bits[i]; @@ -777,7 +776,7 @@ static int pcxhr_iec958_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_v } ucontrol->value.iec958.status[i] = aes_bits; } - mutex_unlock(&chip->mgr->mixer_mutex); + up(&chip->mgr->mixer_mutex); return 0; } @@ -829,14 +828,14 @@ static int pcxhr_iec958_put(struct snd_kcontrol *kcontrol, int i, changed = 0; /* playback */ - mutex_lock(&chip->mgr->mixer_mutex); + down(&chip->mgr->mixer_mutex); for (i = 0; i < 5; i++) { if (ucontrol->value.iec958.status[i] != chip->aes_bits[i]) { pcxhr_iec958_update_byte(chip, i, ucontrol->value.iec958.status[i]); changed = 1; } } - mutex_unlock(&chip->mgr->mixer_mutex); + up(&chip->mgr->mixer_mutex); return changed; } @@ -917,7 +916,7 @@ int pcxhr_create_mixer(struct pcxhr_mgr *mgr) struct snd_pcxhr *chip; int err, i; - mutex_init(&mgr->mixer_mutex); /* can be in another place */ + init_MUTEX(&mgr->mixer_mutex); /* can be in another place */ for (i = 0; i < mgr->num_cards; i++) { struct snd_kcontrol_new temp; diff --git a/sound/pci/rme32.c b/sound/pci/rme32.c index 2a7149924..0cbef5fe6 100644 --- a/sound/pci/rme32.c +++ b/sound/pci/rme32.c @@ -313,7 +313,7 @@ static int snd_rme32_capture_copy(struct snd_pcm_substream *substream, int chann } /* - * SPDIF I/O capabilities (half-duplex mode) + * SPDIF I/O capabilites (half-duplex mode) */ static struct snd_pcm_hardware snd_rme32_spdif_info = { .info = (SNDRV_PCM_INFO_MMAP_IOMEM | @@ -339,7 +339,7 @@ static struct snd_pcm_hardware snd_rme32_spdif_info = { }; /* - * ADAT I/O capabilities (half-duplex mode) + * ADAT I/O capabilites (half-duplex mode) */ static struct snd_pcm_hardware snd_rme32_adat_info = { @@ -364,7 +364,7 @@ static struct snd_pcm_hardware snd_rme32_adat_info = }; /* - * SPDIF I/O capabilities (full-duplex mode) + * SPDIF I/O capabilites (full-duplex mode) */ static struct snd_pcm_hardware snd_rme32_spdif_fd_info = { .info = (SNDRV_PCM_INFO_MMAP | @@ -390,7 +390,7 @@ static struct snd_pcm_hardware snd_rme32_spdif_fd_info = { }; /* - * ADAT I/O capabilities (full-duplex mode) + * ADAT I/O capabilites (full-duplex mode) */ static struct snd_pcm_hardware snd_rme32_adat_fd_info = { @@ -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, snd_rme32_proc_read); + snd_info_set_text_ops(entry, rme32, 1024, snd_rme32_proc_read); } /* diff --git a/sound/pci/rme96.c b/sound/pci/rme96.c index f8de7c997..0e694b011 100644 --- a/sound/pci/rme96.c +++ b/sound/pci/rme96.c @@ -359,7 +359,7 @@ snd_rme96_capture_copy(struct snd_pcm_substream *substream, } /* - * Digital output capabilities (S/PDIF) + * Digital output capabilites (S/PDIF) */ static struct snd_pcm_hardware snd_rme96_playback_spdif_info = { @@ -388,7 +388,7 @@ static struct snd_pcm_hardware snd_rme96_playback_spdif_info = }; /* - * Digital input capabilities (S/PDIF) + * Digital input capabilites (S/PDIF) */ static struct snd_pcm_hardware snd_rme96_capture_spdif_info = { @@ -417,7 +417,7 @@ static struct snd_pcm_hardware snd_rme96_capture_spdif_info = }; /* - * Digital output capabilities (ADAT) + * Digital output capabilites (ADAT) */ static struct snd_pcm_hardware snd_rme96_playback_adat_info = { @@ -442,7 +442,7 @@ static struct snd_pcm_hardware snd_rme96_playback_adat_info = }; /* - * Digital input capabilities (ADAT) + * Digital input capabilites (ADAT) */ static struct snd_pcm_hardware snd_rme96_capture_adat_info = { @@ -1151,25 +1151,6 @@ 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) { @@ -1199,7 +1180,8 @@ snd_rme96_playback_spdif_open(struct snd_pcm_substream *substream) runtime->hw.rate_min = rate; runtime->hw.rate_max = rate; } - rme96_set_buffer_size_constraint(rme96, runtime); + 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->wcreg_spdif_stream = rme96->wcreg_spdif; rme96->spdif_ctl->vd[0].access &= ~SNDRV_CTL_ELEM_ACCESS_INACTIVE; @@ -1237,7 +1219,9 @@ snd_rme96_capture_spdif_open(struct snd_pcm_substream *substream) rme96->capture_substream = substream; spin_unlock_irq(&rme96->lock); - rme96_set_buffer_size_constraint(rme96, runtime); + 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); + return 0; } @@ -1270,7 +1254,8 @@ snd_rme96_playback_adat_open(struct snd_pcm_substream *substream) runtime->hw.rate_min = rate; runtime->hw.rate_max = rate; } - rme96_set_buffer_size_constraint(rme96, runtime); + 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); return 0; } @@ -1306,7 +1291,8 @@ snd_rme96_capture_adat_open(struct snd_pcm_substream *substream) rme96->capture_substream = substream; spin_unlock_irq(&rme96->lock); - rme96_set_buffer_size_constraint(rme96, runtime); + 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); return 0; } @@ -1583,17 +1569,17 @@ snd_rme96_create(struct rme96 *rme96) return err; rme96->port = pci_resource_start(rme96->pci, 0); - 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)) { + 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; + } + /* read the card's revision number */ pci_read_config_byte(pci, 8, &rme96->rev); @@ -1819,7 +1805,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, snd_rme96_proc_read); + snd_info_set_text_ops(entry, rme96, 1024, snd_rme96_proc_read); } /* diff --git a/sound/pci/rme9652/hdsp.c b/sound/pci/rme9652/hdsp.c index e5a52da77..05a2320d9 100644 --- a/sound/pci/rme9652/hdsp.c +++ b/sound/pci/rme9652/hdsp.c @@ -389,7 +389,7 @@ MODULE_SUPPORTED_DEVICE("{{RME Hammerfall-DSP}," /* use hotplug firmeare loader? */ #if defined(CONFIG_FW_LOADER) || defined(CONFIG_FW_LOADER_MODULE) -#if !defined(HDSP_USE_HWDEP_LOADER) && !defined(CONFIG_SND_HDSP) +#ifndef HDSP_USE_HWDEP_LOADER #define HDSP_FW_LOADER #endif #endif @@ -1356,7 +1356,7 @@ static struct snd_rawmidi_ops snd_hdsp_midi_input = .trigger = snd_hdsp_midi_input_trigger, }; -static int snd_hdsp_create_midi (struct snd_card *card, struct hdsp *hdsp, int id) +static int __devinit 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, snd_hdsp_proc_read); + snd_info_set_text_ops(entry, hdsp, 1024, 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, IRQF_DISABLED|IRQF_SHARED, "hdsp", (void *)hdsp)) { + if (request_irq(pci->irq, snd_hdsp_interrupt, SA_INTERRUPT|SA_SHIRQ, "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 7d03ae066..980b9cd68 100644 --- a/sound/pci/rme9652/hdspm.c +++ b/sound/pci/rme9652/hdspm.c @@ -426,7 +426,7 @@ static char channel_map_madi_qs[HDSPM_MAX_CHANNELS] = { }; -static struct pci_device_id snd_hdspm_ids[] __devinitdata = { +static struct pci_device_id snd_hdspm_ids[] = { { .vendor = PCI_VENDOR_ID_XILINX, .device = PCI_DEVICE_ID_XILINX_HAMMERFALL_DSP_MADI, @@ -2256,7 +2256,7 @@ static int snd_hdspm_create_controls(struct snd_card *card, struct hdspm * hdspm } /* Channel playback mixer as default control - Note: the whole matrix would be 128*HDSPM_MIXER_CHANNELS Faders, thats too big for any alsamixer + Note: the whole matrix would be 128*HDSPM_MIXER_CHANNELS Faders, thats to big for any alsamixer they are accesible via special IOCTL on hwdep and the mixer 2dimensional mixer control */ @@ -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, + snd_info_set_text_ops(entry, hdspm, 1024, 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, - IRQF_DISABLED | IRQF_SHARED, "hdspm", + SA_INTERRUPT | SA_SHIRQ, "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 fc15f61ad..a687eb632 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]; /* Enable precise pointer */ +static int precise_ptr[SNDRV_CARDS] = { [0 ... (SNDRV_CARDS-1)] = 0 }; /* Enable precise pointer */ module_param_array(index, int, NULL, 0444); MODULE_PARM_DESC(index, "Index value for RME Digi9652 (Hammerfall) soundcard."); @@ -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, snd_rme9652_proc_read); + snd_info_set_text_ops(entry, rme9652, 1024, 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, IRQF_DISABLED|IRQF_SHARED, "rme9652", (void *)rme9652)) { + if (request_irq(pci->irq, snd_rme9652_interrupt, SA_INTERRUPT|SA_SHIRQ, "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 e5d4def1a..7bbea3738 100644 --- a/sound/pci/sonicvibes.c +++ b/sound/pci/sonicvibes.c @@ -30,7 +30,6 @@ #include #include #include -#include #include #include @@ -54,8 +53,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]; -static int mge[SNDRV_CARDS]; +static int reverb[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 0}; +static int mge[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 0}; static unsigned int dmaio = 0x7a00; /* DDMA i/o address */ module_param_array(index, int, NULL, 0444); @@ -1144,7 +1143,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, snd_sonicvibes_proc_read); + snd_info_set_text_ops(entry, sonic, 1024, snd_sonicvibes_proc_read); } /* @@ -1228,8 +1227,8 @@ static int __devinit snd_sonicvibes_create(struct snd_card *card, if ((err = pci_enable_device(pci)) < 0) return err; /* check, if we can restrict PCI DMA transfers to 24 bits */ - if (pci_set_dma_mask(pci, DMA_24BIT_MASK) < 0 || - pci_set_consistent_dma_mask(pci, DMA_24BIT_MASK) < 0) { + if (pci_set_dma_mask(pci, 0x00ffffff) < 0 || + pci_set_consistent_dma_mask(pci, 0x00ffffff) < 0) { snd_printk(KERN_ERR "architecture does not support 24bit PCI busmaster DMA\n"); pci_disable_device(pci); return -ENXIO; @@ -1257,7 +1256,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, IRQF_DISABLED|IRQF_SHARED, "S3 SonicVibes", (void *)sonic)) { + if (request_irq(pci->irq, snd_sonicvibes_interrupt, SA_INTERRUPT|SA_SHIRQ, "S3 SonicVibes", (void *)sonic)) { snd_printk(KERN_ERR "unable to grab IRQ %d\n", pci->irq); snd_sonicvibes_free(sonic); return -EBUSY; @@ -1441,10 +1440,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%llx, irq %i", + sprintf(card->longname, "%s rev %i at 0x%lx, irq %i", card->shortname, sonic->revision, - (unsigned long long)pci_resource_start(pci, 1), + pci_resource_start(pci, 1), sonic->irq); if ((err = snd_sonicvibes_pcm(sonic, 0, NULL)) < 0) { @@ -1456,7 +1455,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, MPU401_INFO_INTEGRATED, + sonic->midi_port, 1, 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 9145f7c57..b45380450 100644 --- a/sound/pci/trident/trident.c +++ b/sound/pci/trident/trident.c @@ -148,8 +148,7 @@ 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, - MPU401_INFO_INTEGRATED, + trident->midi_port, 1, 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 4930cc6b0..83b7d8aba 100644 --- a/sound/pci/trident/trident_main.c +++ b/sound/pci/trident/trident_main.c @@ -35,7 +35,6 @@ #include #include #include -#include #include #include @@ -306,8 +305,6 @@ 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) @@ -330,8 +327,6 @@ 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) @@ -506,8 +501,6 @@ void snd_trident_write_voice_regs(struct snd_trident * trident, #endif } -EXPORT_SYMBOL(snd_trident_write_voice_regs); - /*--------------------------------------------------------------------------- snd_trident_write_cso_reg @@ -3338,7 +3331,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, snd_trident_proc_read); + snd_info_set_text_ops(entry, trident, 1024, snd_trident_proc_read); } static int snd_trident_dev_free(struct snd_device *device) @@ -3561,8 +3554,8 @@ int __devinit snd_trident_create(struct snd_card *card, if ((err = pci_enable_device(pci)) < 0) return err; /* check, if we can restrict PCI DMA transfers to 30 bits */ - if (pci_set_dma_mask(pci, DMA_30BIT_MASK) < 0 || - pci_set_consistent_dma_mask(pci, DMA_30BIT_MASK) < 0) { + if (pci_set_dma_mask(pci, 0x3fffffff) < 0 || + pci_set_consistent_dma_mask(pci, 0x3fffffff) < 0) { snd_printk(KERN_ERR "architecture does not support 30bit PCI busmaster DMA\n"); pci_disable_device(pci); return -ENXIO; @@ -3599,7 +3592,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, IRQF_DISABLED|IRQF_SHARED, + if (request_irq(pci->irq, snd_trident_interrupt, SA_INTERRUPT|SA_SHIRQ, "Trident Audio", trident)) { snd_printk(KERN_ERR "unable to grab IRQ %d\n", pci->irq); snd_trident_free(trident); @@ -3890,8 +3883,6 @@ 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; @@ -3920,8 +3911,6 @@ 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 }; @@ -4003,3 +3992,13 @@ 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 aff3f8741..cf09ea997 100644 --- a/sound/pci/trident/trident_memory.c +++ b/sound/pci/trident/trident_memory.c @@ -27,8 +27,6 @@ #include #include #include -#include - #include #include @@ -203,16 +201,16 @@ snd_trident_alloc_sg_pages(struct snd_trident *trident, - mutex_lock(&hdr->block_mutex); + down(&hdr->block_mutex); blk = search_empty(hdr, runtime->dma_bytes); if (blk == NULL) { - mutex_unlock(&hdr->block_mutex); + up(&hdr->block_mutex); return NULL; } if (lastpg(blk) - firstpg(blk) >= sgbuf->pages) { snd_printk(KERN_ERR "page calculation doesn't match: allocated pages = %d, trident = %d/%d\n", sgbuf->pages, firstpg(blk), lastpg(blk)); __snd_util_mem_free(hdr, blk); - mutex_unlock(&hdr->block_mutex); + up(&hdr->block_mutex); return NULL; } @@ -223,12 +221,12 @@ snd_trident_alloc_sg_pages(struct snd_trident *trident, unsigned long ptr = (unsigned long)sgbuf->table[idx].buf; if (! is_valid_page(addr)) { __snd_util_mem_free(hdr, blk); - mutex_unlock(&hdr->block_mutex); + up(&hdr->block_mutex); return NULL; } set_tlb_bus(trident, page, ptr, addr); } - mutex_unlock(&hdr->block_mutex); + up(&hdr->block_mutex); return blk; } @@ -250,10 +248,10 @@ snd_trident_alloc_cont_pages(struct snd_trident *trident, hdr = trident->tlb.memhdr; snd_assert(hdr != NULL, return NULL); - mutex_lock(&hdr->block_mutex); + down(&hdr->block_mutex); blk = search_empty(hdr, runtime->dma_bytes); if (blk == NULL) { - mutex_unlock(&hdr->block_mutex); + up(&hdr->block_mutex); return NULL; } @@ -264,12 +262,12 @@ snd_trident_alloc_cont_pages(struct snd_trident *trident, ptr += SNDRV_TRIDENT_PAGE_SIZE, addr += SNDRV_TRIDENT_PAGE_SIZE) { if (! is_valid_page(addr)) { __snd_util_mem_free(hdr, blk); - mutex_unlock(&hdr->block_mutex); + up(&hdr->block_mutex); return NULL; } set_tlb_bus(trident, page, ptr, addr); } - mutex_unlock(&hdr->block_mutex); + up(&hdr->block_mutex); return blk; } @@ -302,13 +300,13 @@ int snd_trident_free_pages(struct snd_trident *trident, snd_assert(blk != NULL, return -EINVAL); hdr = trident->tlb.memhdr; - mutex_lock(&hdr->block_mutex); + down(&hdr->block_mutex); /* reset TLB entries */ for (page = firstpg(blk); page <= lastpg(blk); page++) set_silent_tlb(trident, page); /* free memory block */ __snd_util_mem_free(hdr, blk); - mutex_unlock(&hdr->block_mutex); + up(&hdr->block_mutex); return 0; } @@ -334,22 +332,21 @@ snd_trident_synth_alloc(struct snd_trident *hw, unsigned int size) struct snd_util_memblk *blk; struct snd_util_memhdr *hdr = hw->tlb.memhdr; - mutex_lock(&hdr->block_mutex); + down(&hdr->block_mutex); blk = __snd_util_mem_alloc(hdr, size); if (blk == NULL) { - mutex_unlock(&hdr->block_mutex); + up(&hdr->block_mutex); return NULL; } if (synth_alloc_pages(hw, blk)) { __snd_util_mem_free(hdr, blk); - mutex_unlock(&hdr->block_mutex); + up(&hdr->block_mutex); return NULL; } - mutex_unlock(&hdr->block_mutex); + up(&hdr->block_mutex); return blk; } -EXPORT_SYMBOL(snd_trident_synth_alloc); /* * free a synth sample area @@ -359,14 +356,13 @@ snd_trident_synth_free(struct snd_trident *hw, struct snd_util_memblk *blk) { struct snd_util_memhdr *hdr = hw->tlb.memhdr; - mutex_lock(&hdr->block_mutex); + down(&hdr->block_mutex); synth_free_pages(hw, blk); __snd_util_mem_free(hdr, blk); - mutex_unlock(&hdr->block_mutex); + up(&hdr->block_mutex); return 0; } -EXPORT_SYMBOL(snd_trident_synth_free); /* * reset TLB entry and free kernel page @@ -488,4 +484,3 @@ 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 9b7dee847..cc7af8bc5 100644 --- a/sound/pci/trident/trident_synth.c +++ b/sound/pci/trident/trident_synth.c @@ -914,9 +914,7 @@ 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_HARDWARE | - SNDRV_SEQ_PORT_TYPE_SYNTHESIZER, + SNDRV_SEQ_PORT_TYPE_SYNTH, 16, 0, name); if (p->chset->port < 0) { diff --git a/sound/pci/via82xx.c b/sound/pci/via82xx.c index 08da9234e..423741371 100644 --- a/sound/pci/via82xx.c +++ b/sound/pci/via82xx.c @@ -123,7 +123,6 @@ module_param(enable, bool, 0444); #define VIA_REV_8233A 0x40 /* 1 rec, 1 multi-pb, spdf */ #define VIA_REV_8235 0x50 /* 2 rec, 4 pb, 1 multi-pb, spdif */ #define VIA_REV_8237 0x60 -#define VIA_REV_8251 0x70 /* * Direct registers @@ -863,11 +862,6 @@ static snd_pcm_uframes_t snd_via8233_pcm_pointer(struct snd_pcm_substream *subst if (!status) status = inb(VIADEV_REG(viadev, OFFSET_STATUS)); - /* An apparent bug in the 8251 is worked around by sending a - * REG_CTRL_START. */ - if (chip->revision == VIA_REV_8251 && (status & VIA_REG_STAT_EOL)) - snd_via82xx_pcm_trigger(substream, SNDRV_PCM_TRIGGER_START); - if (!(status & VIA_REG_STAT_ACTIVE)) { res = 0; goto unlock; @@ -1775,12 +1769,6 @@ 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 */ }; @@ -1979,7 +1967,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, MPU401_INFO_INTEGRATED, + mpu_port, 1, chip->irq, 0, &chip->rmidi) < 0) { printk(KERN_WARNING "unable to initialize MPU-401" " at 0x%lx, skipping\n", mpu_port); @@ -2021,7 +2009,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, snd_via82xx_proc_read); + snd_info_set_text_ops(entry, chip, 1024, snd_via82xx_proc_read); } /* @@ -2281,7 +2269,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, - IRQF_DISABLED|IRQF_SHARED, + SA_INTERRUPT|SA_SHIRQ, card->driver, chip)) { snd_printk(KERN_ERR "unable to grab IRQ %d\n", pci->irq); snd_via82xx_free(chip); @@ -2325,7 +2313,6 @@ static struct via823x_info via823x_cards[] __devinitdata = { { VIA_REV_8233A, "VIA 8233A", TYPE_VIA8233A }, { VIA_REV_8235, "VIA 8235", TYPE_VIA8233 }, { VIA_REV_8237, "VIA 8237", TYPE_VIA8233 }, - { VIA_REV_8251, "VIA 8251", TYPE_VIA8233 }, }; /* @@ -2338,7 +2325,7 @@ struct dxs_whitelist { short action; /* new dxs_support value */ }; -static int __devinit check_dxs_list(struct pci_dev *pci, int revision) +static int __devinit check_dxs_list(struct pci_dev *pci) { static struct dxs_whitelist whitelist[] = { { .subvendor = 0x1005, .subdevice = 0x4710, .action = VIA_DXS_ENABLE }, /* Avance Logic Mobo */ @@ -2346,7 +2333,6 @@ static int __devinit check_dxs_list(struct pci_dev *pci, int revision) { .subvendor = 0x1019, .subdevice = 0x0a81, .action = VIA_DXS_NO_VRA }, /* ECS K7VTA3 v8.0 */ { .subvendor = 0x1019, .subdevice = 0x0a85, .action = VIA_DXS_NO_VRA }, /* ECS L7VMM2 */ { .subvendor = 0x1019, .subdevice = 0xa101, .action = VIA_DXS_SRC }, - { .subvendor = 0x1019, .subdevice = 0xaa01, .action = VIA_DXS_SRC }, /* ECS K8T890-A */ { .subvendor = 0x1025, .subdevice = 0x0033, .action = VIA_DXS_NO_VRA }, /* Acer Inspire 1353LM */ { .subvendor = 0x1025, .subdevice = 0x0046, .action = VIA_DXS_SRC }, /* Acer Aspire 1524 WLMi */ { .subvendor = 0x1043, .subdevice = 0x8095, .action = VIA_DXS_NO_VRA }, /* ASUS A7V8X (FIXME: possibly VIA_DXS_ENABLE?)*/ @@ -2355,7 +2341,6 @@ static int __devinit check_dxs_list(struct pci_dev *pci, int revision) { .subvendor = 0x1043, .subdevice = 0x810d, .action = VIA_DXS_SRC }, /* ASUS */ { .subvendor = 0x1043, .subdevice = 0x812a, .action = VIA_DXS_SRC }, /* ASUS A8V Deluxe */ { .subvendor = 0x1043, .subdevice = 0x8174, .action = VIA_DXS_SRC }, /* ASUS */ - { .subvendor = 0x1043, .subdevice = 0x81b9, .action = VIA_DXS_SRC }, /* ASUS A8V-MX */ { .subvendor = 0x1071, .subdevice = 0x8375, .action = VIA_DXS_NO_VRA }, /* Vobis/Yakumo/Mitac notebook */ { .subvendor = 0x1071, .subdevice = 0x8399, .action = VIA_DXS_NO_VRA }, /* Umax AB 595T (VIA K8N800A - VT8237) */ { .subvendor = 0x10cf, .subdevice = 0x118e, .action = VIA_DXS_ENABLE }, /* FSC laptop */ @@ -2371,7 +2356,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_SRC }, /* MSI K8T Neo2-FI */ + { .subvendor = 0x1462, .subdevice = 0x7023, .action = VIA_DXS_NO_VRA }, /* 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 */ @@ -2388,13 +2373,10 @@ static int __devinit check_dxs_list(struct pci_dev *pci, int revision) { .subvendor = 0x161f, .subdevice = 0x2032, .action = VIA_DXS_48K }, /* m680x machines */ { .subvendor = 0x1631, .subdevice = 0xe004, .action = VIA_DXS_ENABLE }, /* Easy Note 3174, Packard Bell */ { .subvendor = 0x1695, .subdevice = 0x3005, .action = VIA_DXS_ENABLE }, /* EPoX EP-8K9A */ - { .subvendor = 0x1695, .subdevice = 0x300c, .action = VIA_DXS_SRC }, /* EPoX EP-8KRAI */ { .subvendor = 0x1695, .subdevice = 0x300e, .action = VIA_DXS_SRC }, /* EPoX 9HEAI */ { .subvendor = 0x16f3, .subdevice = 0x6405, .action = VIA_DXS_SRC }, /* Jetway K8M8MS */ - { .subvendor = 0x1734, .subdevice = 0x1078, .action = VIA_DXS_SRC }, /* FSC Amilo L7300 */ { .subvendor = 0x1734, .subdevice = 0x1093, .action = VIA_DXS_SRC }, /* FSC */ { .subvendor = 0x1849, .subdevice = 0x3059, .action = VIA_DXS_NO_VRA }, /* ASRock K7VM2 */ - { .subvendor = 0x1849, .subdevice = 0x9739, .action = VIA_DXS_SRC }, /* ASRock mobo(?) */ { .subvendor = 0x1849, .subdevice = 0x9761, .action = VIA_DXS_SRC }, /* ASRock mobo(?) */ { .subvendor = 0x1919, .subdevice = 0x200a, .action = VIA_DXS_NO_VRA }, /* Soltek SL-K8Tpro-939 */ { .subvendor = 0x4005, .subdevice = 0x4710, .action = VIA_DXS_SRC }, /* MSI K7T266 Pro2 (MS-6380 V2.0) BIOS 3.7 */ @@ -2419,10 +2401,6 @@ static int __devinit check_dxs_list(struct pci_dev *pci, int revision) } } - /* for newer revision, default to DXS_SRC */ - if (revision >= VIA_REV_8235) - return VIA_DXS_SRC; - /* * not detected, try 48k rate only to be sure. */ @@ -2467,7 +2445,7 @@ static int __devinit snd_via82xx_probe(struct pci_dev *pci, } if (chip_type != TYPE_VIA8233A) { if (dxs_support == VIA_DXS_AUTO) - dxs_support = check_dxs_list(pci, revision); + dxs_support = check_dxs_list(pci); /* force to use VIA8233 or 8233A model according to * dxs_support module option */ diff --git a/sound/pci/via82xx_modem.c b/sound/pci/via82xx_modem.c index 016f9dac2..22ce4d309 100644 --- a/sound/pci/via82xx_modem.c +++ b/sound/pci/via82xx_modem.c @@ -929,7 +929,7 @@ static void __devinit snd_via82xx_proc_init(struct via82xx_modem *chip) struct snd_info_entry *entry; if (! snd_card_proc_new(chip->card, "via82xx", &entry)) - snd_info_set_text_ops(entry, chip, snd_via82xx_proc_read); + snd_info_set_text_ops(entry, chip, 1024, snd_via82xx_proc_read); } /* @@ -1118,7 +1118,7 @@ static int __devinit snd_via82xx_create(struct snd_card *card, return err; } chip->port = pci_resource_start(pci, 0); - if (request_irq(pci->irq, snd_via82xx_interrupt, IRQF_DISABLED|IRQF_SHARED, + if (request_irq(pci->irq, snd_via82xx_interrupt, SA_INTERRUPT|SA_SHIRQ, card->driver, chip)) { snd_printk(KERN_ERR "unable to grab IRQ %d\n", pci->irq); snd_via82xx_free(chip); diff --git a/sound/pci/vx222/vx222.c b/sound/pci/vx222/vx222.c index 9c03c6b4e..c816ddf1b 100644 --- a/sound/pci/vx222/vx222.c +++ b/sound/pci/vx222/vx222.c @@ -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, IRQF_DISABLED|IRQF_SHARED, + if (request_irq(pci->irq, snd_vx_irq_handler, SA_INTERRUPT|SA_SHIRQ, 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/vx222/vx222_ops.c b/sound/pci/vx222/vx222_ops.c index 9b6d345b8..c705af409 100644 --- a/sound/pci/vx222/vx222_ops.c +++ b/sound/pci/vx222/vx222_ops.c @@ -24,8 +24,6 @@ #include #include #include -#include - #include #include #include @@ -863,10 +861,10 @@ static int vx_input_level_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem { struct vx_core *_chip = snd_kcontrol_chip(kcontrol); struct snd_vx222 *chip = (struct snd_vx222 *)_chip; - mutex_lock(&_chip->mixer_mutex); + down(&_chip->mixer_mutex); ucontrol->value.integer.value[0] = chip->input_level[0]; ucontrol->value.integer.value[1] = chip->input_level[1]; - mutex_unlock(&_chip->mixer_mutex); + up(&_chip->mixer_mutex); return 0; } @@ -874,16 +872,16 @@ static int vx_input_level_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem { struct vx_core *_chip = snd_kcontrol_chip(kcontrol); struct snd_vx222 *chip = (struct snd_vx222 *)_chip; - mutex_lock(&_chip->mixer_mutex); + down(&_chip->mixer_mutex); if (chip->input_level[0] != ucontrol->value.integer.value[0] || chip->input_level[1] != ucontrol->value.integer.value[1]) { chip->input_level[0] = ucontrol->value.integer.value[0]; chip->input_level[1] = ucontrol->value.integer.value[1]; vx2_set_input_level(chip); - mutex_unlock(&_chip->mixer_mutex); + up(&_chip->mixer_mutex); return 1; } - mutex_unlock(&_chip->mixer_mutex); + up(&_chip->mixer_mutex); return 0; } @@ -909,14 +907,14 @@ static int vx_mic_level_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_v { struct vx_core *_chip = snd_kcontrol_chip(kcontrol); struct snd_vx222 *chip = (struct snd_vx222 *)_chip; - mutex_lock(&_chip->mixer_mutex); + down(&_chip->mixer_mutex); if (chip->mic_level != ucontrol->value.integer.value[0]) { chip->mic_level = ucontrol->value.integer.value[0]; vx2_set_input_level(chip); - mutex_unlock(&_chip->mixer_mutex); + up(&_chip->mixer_mutex); return 1; } - mutex_unlock(&_chip->mixer_mutex); + up(&_chip->mixer_mutex); return 0; } diff --git a/sound/pci/ymfpci/ymfpci.c b/sound/pci/ymfpci/ymfpci.c index 186453f7a..dab9b8310 100644 --- a/sound/pci/ymfpci/ymfpci.c +++ b/sound/pci/ymfpci/ymfpci.c @@ -49,7 +49,6 @@ static long mpu_port[SNDRV_CARDS]; static long joystick_port[SNDRV_CARDS]; #endif static int rear_switch[SNDRV_CARDS]; -static int rear_swap[SNDRV_CARDS] = { [0 ... (SNDRV_CARDS-1)] = 1 }; module_param_array(index, int, NULL, 0444); MODULE_PARM_DESC(index, "Index value for the Yamaha DS-1 PCI soundcard."); @@ -67,8 +66,6 @@ MODULE_PARM_DESC(joystick_port, "Joystick port address"); #endif module_param_array(rear_switch, bool, NULL, 0444); 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[] = { { 0x1073, 0x0004, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* YMF724 */ @@ -298,7 +295,7 @@ static int __devinit snd_card_ymfpci_probe(struct pci_dev *pci, snd_card_free(card); return err; } - if ((err = snd_ymfpci_mixer(chip, rear_switch[dev], rear_swap[dev])) < 0) { + if ((err = snd_ymfpci_mixer(chip, rear_switch[dev])) < 0) { snd_card_free(card); return err; } @@ -308,8 +305,7 @@ 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], - MPU401_INFO_INTEGRATED, + mpu_port[dev], 1, 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 a55b5fd7d..a1aa74b79 100644 --- a/sound/pci/ymfpci/ymfpci_main.c +++ b/sound/pci/ymfpci/ymfpci_main.c @@ -536,30 +536,15 @@ static void snd_ymfpci_pcm_init_voice(struct snd_ymfpci_pcm *ypcm, unsigned int } } if (ypcm->output_rear) { - if (!ypcm->swap_rear) { - if (use_left) { - bank->eff2_gain = - bank->eff2_gain_end = vol_left; - } - if (use_right) { - bank->eff3_gain = - bank->eff3_gain_end = vol_right; - } - } else { - /* The SPDIF out channels seem to be swapped, so we have - * to swap them here, too. The rear analog out channels - * will be wrong, but otherwise AC3 would not work. - */ - if (use_left) { - bank->eff3_gain = - bank->eff3_gain_end = vol_left; - } - if (use_right) { - bank->eff2_gain = - bank->eff2_gain_end = vol_right; - } - } - } + if (use_left) { + bank->eff2_gain = + bank->eff2_gain_end = vol_left; + } + if (use_right) { + bank->eff3_gain = + bank->eff3_gain_end = vol_right; + } + } } } @@ -909,7 +894,6 @@ static int snd_ymfpci_playback_open(struct snd_pcm_substream *substream) ypcm = runtime->private_data; ypcm->output_front = 1; ypcm->output_rear = chip->mode_dup4ch ? 1 : 0; - ypcm->swap_rear = chip->rear_swap; spin_lock_irq(&chip->reg_lock); if (ypcm->output_rear) { ymfpci_open_extension(chip); @@ -1750,7 +1734,7 @@ static void snd_ymfpci_mixer_free_ac97(struct snd_ac97 *ac97) chip->ac97 = NULL; } -int __devinit snd_ymfpci_mixer(struct snd_ymfpci *chip, int rear_switch, int rear_swap) +int __devinit snd_ymfpci_mixer(struct snd_ymfpci *chip, int rear_switch) { struct snd_ac97_template ac97; struct snd_kcontrol *kctl; @@ -1762,7 +1746,6 @@ int __devinit snd_ymfpci_mixer(struct snd_ymfpci *chip, int rear_switch, int rea .read = snd_ymfpci_codec_read, }; - chip->rear_swap = rear_swap; if ((err = snd_ac97_bus(chip->card, 0, &ops, chip, &chip->ac97_bus)) < 0) return err; chip->ac97_bus->private_free = snd_ymfpci_mixer_free_ac97_bus; @@ -1919,7 +1902,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, snd_ymfpci_proc_read); + snd_info_set_text_ops(entry, chip, 1024, snd_ymfpci_proc_read); return 0; } @@ -2288,7 +2271,7 @@ int __devinit snd_ymfpci_create(struct snd_card *card, snd_ymfpci_free(chip); return -EBUSY; } - if (request_irq(pci->irq, snd_ymfpci_interrupt, IRQF_DISABLED|IRQF_SHARED, "YMFPCI", (void *) chip)) { + if (request_irq(pci->irq, snd_ymfpci_interrupt, SA_INTERRUPT|SA_SHIRQ, "YMFPCI", (void *) chip)) { snd_printk(KERN_ERR "unable to grab IRQ %d\n", pci->irq); snd_ymfpci_free(chip); return -EBUSY; @@ -2310,7 +2293,6 @@ int __devinit snd_ymfpci_create(struct snd_card *card, return -EIO; } - chip->rear_swap = 1; if ((err = snd_ymfpci_ac3_init(chip)) < 0) { snd_ymfpci_free(chip); return err; diff --git a/sound/pcmcia/Kconfig b/sound/pcmcia/Kconfig index c9fa1a2bc..5d1b0b762 100644 --- a/sound/pcmcia/Kconfig +++ b/sound/pcmcia/Kconfig @@ -5,7 +5,7 @@ menu "PCMCIA devices" config SND_VXPOCKET tristate "Digigram VXpocket" - depends on SND && PCMCIA + depends on SND && PCMCIA && ISA select SND_VX_LIB help Say Y here to include support for Digigram VXpocket and @@ -16,7 +16,7 @@ config SND_VXPOCKET config SND_PDAUDIOCF tristate "Sound Core PDAudioCF" - depends on SND && PCMCIA + depends on SND && PCMCIA && ISA select SND_PCM help Say Y here to include support for Sound Core PDAudioCF diff --git a/sound/pcmcia/pdaudiocf/pdaudiocf.c b/sound/pcmcia/pdaudiocf/pdaudiocf.c index 1c09e5f49..77caf43a3 100644 --- a/sound/pcmcia/pdaudiocf/pdaudiocf.c +++ b/sound/pcmcia/pdaudiocf/pdaudiocf.c @@ -57,12 +57,18 @@ static struct snd_card *card_list[SNDRV_CARDS]; /* * prototypes */ -static int pdacf_config(struct pcmcia_device *link); +static void pdacf_config(dev_link_t *link); static void snd_pdacf_detach(struct pcmcia_device *p_dev); -static void pdacf_release(struct pcmcia_device *link) +static void pdacf_release(dev_link_t *link) { - pcmcia_disable_device(link); + if (link->state & DEV_CONFIG) { + /* release cs resources */ + pcmcia_release_configuration(link->handle); + pcmcia_release_io(link->handle, &link->io); + pcmcia_release_irq(link->handle, &link->irq); + link->state &= ~DEV_CONFIG; + } } /* @@ -70,7 +76,7 @@ static void pdacf_release(struct pcmcia_device *link) */ static int snd_pdacf_free(struct snd_pdacf *pdacf) { - struct pcmcia_device *link = pdacf->p_dev; + dev_link_t *link = &pdacf->link; pdacf_release(link); @@ -90,9 +96,10 @@ static int snd_pdacf_dev_free(struct snd_device *device) /* * snd_pdacf_attach - attach callback for cs */ -static int snd_pdacf_probe(struct pcmcia_device *link) +static int snd_pdacf_attach(struct pcmcia_device *p_dev) { int i; + dev_link_t *link; /* Info for cardmgr */ struct snd_pdacf *pdacf; struct snd_card *card; static struct snd_device_ops ops = { @@ -132,7 +139,7 @@ static int snd_pdacf_probe(struct pcmcia_device *link) pdacf->index = i; card_list[i] = card; - pdacf->p_dev = link; + link = &pdacf->link; link->priv = pdacf; link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO; @@ -149,7 +156,13 @@ static int snd_pdacf_probe(struct pcmcia_device *link) link->conf.ConfigIndex = 1; link->conf.Present = PRESENT_OPTION; - return pdacf_config(link); + /* Chain drivers */ + link->next = NULL; + + link->handle = p_dev; + pdacf_config(link); + + return 0; } @@ -196,8 +209,9 @@ static int snd_pdacf_assign_resources(struct snd_pdacf *pdacf, int port, int irq /* * snd_pdacf_detach - detach callback for cs */ -static void snd_pdacf_detach(struct pcmcia_device *link) +static void snd_pdacf_detach(struct pcmcia_device *p_dev) { + dev_link_t *link = dev_to_instance(p_dev); struct snd_pdacf *chip = link->priv; snd_printdd(KERN_DEBUG "pdacf_detach called\n"); @@ -216,11 +230,13 @@ static void snd_pdacf_detach(struct pcmcia_device *link) #define CS_CHECK(fn, ret) \ do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0) -static int pdacf_config(struct pcmcia_device *link) +static void pdacf_config(dev_link_t *link) { + client_handle_t handle = link->handle; struct snd_pdacf *pdacf = link->priv; tuple_t tuple; cisparse_t *parse = NULL; + config_info_t conf; u_short buf[32]; int last_fn, last_ret; @@ -228,7 +244,7 @@ static int pdacf_config(struct pcmcia_device *link) parse = kmalloc(sizeof(*parse), GFP_KERNEL); if (! parse) { snd_printk(KERN_ERR "pdacf_config: cannot allocate\n"); - return -ENOMEM; + return; } tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY; tuple.Attributes = 0; @@ -236,53 +252,71 @@ static int pdacf_config(struct pcmcia_device *link) tuple.TupleDataMax = sizeof(buf); tuple.TupleOffset = 0; tuple.DesiredTuple = CISTPL_CONFIG; - 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)); + CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple)); + CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple)); + CS_CHECK(ParseTuple, pcmcia_parse_tuple(handle, &tuple, parse)); link->conf.ConfigBase = parse->config.base; link->conf.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)); + CS_CHECK(GetConfigurationInfo, pcmcia_get_configuration_info(handle, &conf)); + link->conf.Vcc = conf.Vcc; - kfree(parse); + /* Configure card */ + link->state |= DEV_CONFIG; + + CS_CHECK(RequestIO, pcmcia_request_io(handle, &link->io)); + CS_CHECK(RequestIRQ, pcmcia_request_irq(link->handle, &link->irq)); + CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link->handle, &link->conf)); if (snd_pdacf_assign_resources(pdacf, link->io.BasePort1, link->irq.AssignedIRQ) < 0) goto failed; - link->dev_node = &pdacf->node; - return 0; + link->dev = &pdacf->node; + link->state &= ~DEV_CONFIG_PENDING; + return; cs_failed: - kfree(parse); - cs_error(link, last_fn, last_ret); + cs_error(link->handle, last_fn, last_ret); failed: - pcmcia_disable_device(link); - return -ENODEV; + pcmcia_release_configuration(link->handle); + pcmcia_release_io(link->handle, &link->io); + pcmcia_release_irq(link->handle, &link->irq); } #ifdef CONFIG_PM -static int pdacf_suspend(struct pcmcia_device *link) +static int pdacf_suspend(struct pcmcia_device *dev) { + dev_link_t *link = dev_to_instance(dev); struct snd_pdacf *chip = link->priv; snd_printdd(KERN_DEBUG "SUSPEND\n"); + link->state |= DEV_SUSPEND; if (chip) { snd_printdd(KERN_DEBUG "snd_pdacf_suspend calling\n"); snd_pdacf_suspend(chip, PMSG_SUSPEND); } + snd_printdd(KERN_DEBUG "RESET_PHYSICAL\n"); + if (link->state & DEV_CONFIG) + pcmcia_release_configuration(link->handle); + return 0; } -static int pdacf_resume(struct pcmcia_device *link) +static int pdacf_resume(struct pcmcia_device *dev) { + dev_link_t *link = dev_to_instance(dev); struct snd_pdacf *chip = link->priv; snd_printdd(KERN_DEBUG "RESUME\n"); - if (pcmcia_dev_present(link)) { + link->state &= ~DEV_SUSPEND; + + snd_printdd(KERN_DEBUG "CARD_RESET\n"); + if (DEV_OK(link)) { + snd_printdd(KERN_DEBUG "requestconfig...\n"); + pcmcia_request_configuration(link->handle, &link->conf); if (chip) { snd_printdd(KERN_DEBUG "calling snd_pdacf_resume\n"); snd_pdacf_resume(chip); @@ -309,7 +343,7 @@ static struct pcmcia_driver pdacf_cs_driver = { .drv = { .name = "snd-pdaudiocf", }, - .probe = snd_pdacf_probe, + .probe = snd_pdacf_attach, .remove = snd_pdacf_detach, .id_table = snd_pdacf_ids, #ifdef CONFIG_PM diff --git a/sound/pcmcia/pdaudiocf/pdaudiocf.h b/sound/pcmcia/pdaudiocf/pdaudiocf.h index 9a14a4f64..2744f189a 100644 --- a/sound/pcmcia/pdaudiocf/pdaudiocf.h +++ b/sound/pcmcia/pdaudiocf/pdaudiocf.h @@ -116,7 +116,7 @@ struct snd_pdacf { void *pcm_area; /* pcmcia stuff */ - struct pcmcia_device *p_dev; + dev_link_t link; dev_node_t node; }; diff --git a/sound/pcmcia/pdaudiocf/pdaudiocf_core.c b/sound/pcmcia/pdaudiocf/pdaudiocf_core.c index 1dfe29b86..bd0d70ff3 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, pdacf_proc_read); + snd_info_set_text_ops(entry, chip, 1024, pdacf_proc_read); } struct snd_pdacf *snd_pdacf_create(struct snd_card *card) diff --git a/sound/pcmcia/pdaudiocf/pdaudiocf_pcm.c b/sound/pcmcia/pdaudiocf/pdaudiocf_pcm.c index 7f2a4de1d..962e6d525 100644 --- a/sound/pcmcia/pdaudiocf/pdaudiocf_pcm.c +++ b/sound/pcmcia/pdaudiocf/pdaudiocf_pcm.c @@ -66,9 +66,10 @@ static int snd_pcm_alloc_vmalloc_buffer(struct snd_pcm_substream *subs, size_t s static int snd_pcm_free_vmalloc_buffer(struct snd_pcm_substream *subs) { struct snd_pcm_runtime *runtime = subs->runtime; - - vfree(runtime->dma_area); - runtime->dma_area = NULL; + if (runtime->dma_area) { + vfree(runtime->dma_area); + runtime->dma_area = NULL; + } return 0; } diff --git a/sound/pcmcia/vx/vxp_mixer.c b/sound/pcmcia/vx/vxp_mixer.c index e237f6c20..9450149b9 100644 --- a/sound/pcmcia/vx/vxp_mixer.c +++ b/sound/pcmcia/vx/vxp_mixer.c @@ -52,14 +52,14 @@ static int vx_mic_level_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_v { struct vx_core *_chip = snd_kcontrol_chip(kcontrol); struct snd_vxpocket *chip = (struct snd_vxpocket *)_chip; - mutex_lock(&_chip->mixer_mutex); + down(&_chip->mixer_mutex); if (chip->mic_level != ucontrol->value.integer.value[0]) { vx_set_mic_level(_chip, ucontrol->value.integer.value[0]); chip->mic_level = ucontrol->value.integer.value[0]; - mutex_unlock(&_chip->mixer_mutex); + up(&_chip->mixer_mutex); return 1; } - mutex_unlock(&_chip->mixer_mutex); + up(&_chip->mixer_mutex); return 0; } @@ -95,14 +95,14 @@ static int vx_mic_boost_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_v { struct vx_core *_chip = snd_kcontrol_chip(kcontrol); struct snd_vxpocket *chip = (struct snd_vxpocket *)_chip; - mutex_lock(&_chip->mixer_mutex); + down(&_chip->mixer_mutex); if (chip->mic_level != ucontrol->value.integer.value[0]) { vx_set_mic_boost(_chip, ucontrol->value.integer.value[0]); chip->mic_level = ucontrol->value.integer.value[0]; - mutex_unlock(&_chip->mixer_mutex); + up(&_chip->mixer_mutex); return 1; } - mutex_unlock(&_chip->mixer_mutex); + up(&_chip->mixer_mutex); return 0; } diff --git a/sound/pcmcia/vx/vxp_ops.c b/sound/pcmcia/vx/vxp_ops.c index 1ee0918c3..7f82f619f 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%Zx\n", c, fw->size); + snd_printdd(KERN_DEBUG "xilinx: dsp size received 0x%x, orig 0x%x\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 cafe6640c..66900d20a 100644 --- a/sound/pcmcia/vx/vxpocket.c +++ b/sound/pcmcia/vx/vxpocket.c @@ -59,9 +59,15 @@ static unsigned int card_alloc; /* */ -static void vxpocket_release(struct pcmcia_device *link) +static void vxpocket_release(dev_link_t *link) { - pcmcia_disable_device(link); + if (link->state & DEV_CONFIG) { + /* release cs resources */ + pcmcia_release_configuration(link->handle); + pcmcia_release_io(link->handle, &link->io); + pcmcia_release_irq(link->handle, &link->irq); + link->state &= ~DEV_CONFIG; + } } /* @@ -126,9 +132,9 @@ static struct snd_vx_hardware vxp440_hw = { /* * create vxpocket instance */ -static struct snd_vxpocket *snd_vxpocket_new(struct snd_card *card, int ibl, - struct pcmcia_device *link) +static struct snd_vxpocket *snd_vxpocket_new(struct snd_card *card, int ibl) { + dev_link_t *link; /* Info for cardmgr */ struct vx_core *chip; struct snd_vxpocket *vxp; static struct snd_device_ops ops = { @@ -148,7 +154,7 @@ static struct snd_vxpocket *snd_vxpocket_new(struct snd_card *card, int ibl, vxp = (struct snd_vxpocket *)chip; - vxp->p_dev = link; + link = &vxp->link; link->priv = chip; link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO; @@ -161,6 +167,7 @@ static struct snd_vxpocket *snd_vxpocket_new(struct snd_card *card, int ibl, link->irq.Instance = chip; link->conf.Attributes = CONF_ENABLE_IRQ; + link->conf.Vcc = 50; link->conf.IntType = INT_MEMORY_AND_IO; link->conf.ConfigIndex = 1; link->conf.Present = PRESENT_OPTION; @@ -208,8 +215,9 @@ static int snd_vxpocket_assign_resources(struct vx_core *chip, int port, int irq #define CS_CHECK(fn, ret) \ do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0) -static int vxpocket_config(struct pcmcia_device *link) +static void vxpocket_config(dev_link_t *link) { + client_handle_t handle = link->handle; struct vx_core *chip = link->priv; struct snd_vxpocket *vxp = (struct snd_vxpocket *)chip; tuple_t tuple; @@ -221,24 +229,24 @@ static int vxpocket_config(struct pcmcia_device *link) parse = kmalloc(sizeof(*parse), GFP_KERNEL); if (! parse) { snd_printk(KERN_ERR "vx: cannot allocate\n"); - return -ENOMEM; + return; } tuple.Attributes = 0; tuple.TupleData = (cisdata_t *)buf; tuple.TupleDataMax = sizeof(buf); tuple.TupleOffset = 0; tuple.DesiredTuple = CISTPL_CONFIG; - 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)); + CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple)); + CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple)); + CS_CHECK(ParseTuple, pcmcia_parse_tuple(handle, &tuple, parse)); link->conf.ConfigBase = parse->config.base; link->conf.Present = parse->config.rmask[0]; /* redefine hardware record according to the VERSION1 string */ tuple.DesiredTuple = CISTPL_VERS_1; - 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)); + 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)); if (! strcmp(parse->version_1.str + parse->version_1.ofs[1], "VX-POCKET")) { snd_printdd("VX-pocket is detected\n"); } else { @@ -249,50 +257,67 @@ static int vxpocket_config(struct pcmcia_device *link) strcpy(chip->card->driver, vxp440_hw.name); } - 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)); + /* Configure card */ + link->state |= DEV_CONFIG; + + CS_CHECK(RequestIO, pcmcia_request_io(handle, &link->io)); + CS_CHECK(RequestIRQ, pcmcia_request_irq(link->handle, &link->irq)); + CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link->handle, &link->conf)); - chip->dev = &handle_to_dev(link); + chip->dev = &handle_to_dev(link->handle); snd_card_set_dev(chip->card, chip->dev); if (snd_vxpocket_assign_resources(chip, link->io.BasePort1, link->irq.AssignedIRQ) < 0) goto failed; - link->dev_node = &vxp->node; + link->dev = &vxp->node; + link->state &= ~DEV_CONFIG_PENDING; kfree(parse); - return 0; + return; cs_failed: - cs_error(link, last_fn, last_ret); + cs_error(link->handle, last_fn, last_ret); failed: - pcmcia_disable_device(link); + pcmcia_release_configuration(link->handle); + pcmcia_release_io(link->handle, &link->io); + pcmcia_release_irq(link->handle, &link->irq); + link->state &= ~DEV_CONFIG; kfree(parse); - return -ENODEV; } #ifdef CONFIG_PM -static int vxp_suspend(struct pcmcia_device *link) +static int vxp_suspend(struct pcmcia_device *dev) { + dev_link_t *link = dev_to_instance(dev); struct vx_core *chip = link->priv; snd_printdd(KERN_DEBUG "SUSPEND\n"); + link->state |= DEV_SUSPEND; if (chip) { snd_printdd(KERN_DEBUG "snd_vx_suspend calling\n"); snd_vx_suspend(chip, PMSG_SUSPEND); } + snd_printdd(KERN_DEBUG "RESET_PHYSICAL\n"); + if (link->state & DEV_CONFIG) + pcmcia_release_configuration(link->handle); return 0; } -static int vxp_resume(struct pcmcia_device *link) +static int vxp_resume(struct pcmcia_device *dev) { + dev_link_t *link = dev_to_instance(dev); struct vx_core *chip = link->priv; snd_printdd(KERN_DEBUG "RESUME\n"); - if (pcmcia_dev_present(link)) { + link->state &= ~DEV_SUSPEND; + + snd_printdd(KERN_DEBUG "CARD_RESET\n"); + if (DEV_OK(link)) { //struct snd_vxpocket *vxp = (struct snd_vxpocket *)chip; + snd_printdd(KERN_DEBUG "requestconfig...\n"); + pcmcia_request_configuration(link->handle, &link->conf); if (chip) { snd_printdd(KERN_DEBUG "calling snd_vx_resume\n"); snd_vx_resume(chip); @@ -308,7 +333,7 @@ static int vxp_resume(struct pcmcia_device *link) /* */ -static int vxpocket_probe(struct pcmcia_device *p_dev) +static int vxpocket_attach(struct pcmcia_device *p_dev) { struct snd_card *card; struct snd_vxpocket *vxp; @@ -333,7 +358,7 @@ static int vxpocket_probe(struct pcmcia_device *p_dev) return -ENOMEM; } - vxp = snd_vxpocket_new(card, ibl[i], p_dev); + vxp = snd_vxpocket_new(card, ibl[i]); if (! vxp) { snd_card_free(card); return -ENODEV; @@ -343,13 +368,20 @@ static int vxpocket_probe(struct pcmcia_device *p_dev) vxp->index = i; card_alloc |= 1 << i; - vxp->p_dev = p_dev; + /* Chain drivers */ + vxp->link.next = NULL; - return vxpocket_config(p_dev); + vxp->link.handle = p_dev; + vxp->link.state |= DEV_PRESENT | DEV_CONFIG_PENDING; + p_dev->instance = &vxp->link; + vxpocket_config(&vxp->link); + + return 0; } -static void vxpocket_detach(struct pcmcia_device *link) +static void vxpocket_detach(struct pcmcia_device *p_dev) { + dev_link_t *link = dev_to_instance(p_dev); struct snd_vxpocket *vxp; struct vx_core *chip; @@ -381,7 +413,7 @@ static struct pcmcia_driver vxp_cs_driver = { .drv = { .name = "snd-vxpocket", }, - .probe = vxpocket_probe, + .probe = vxpocket_attach, .remove = vxpocket_detach, .id_table = vxp_ids, #ifdef CONFIG_PM diff --git a/sound/pcmcia/vx/vxpocket.h b/sound/pcmcia/vx/vxpocket.h index 27ea00229..67efae3f6 100644 --- a/sound/pcmcia/vx/vxpocket.h +++ b/sound/pcmcia/vx/vxpocket.h @@ -42,7 +42,7 @@ struct snd_vxpocket { int index; /* card index */ /* pcmcia stuff */ - struct pcmcia_device *p_dev; + dev_link_t link; dev_node_t node; }; diff --git a/sound/ppc/Makefile b/sound/ppc/Makefile index 4d95c652c..d6ba99590 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 keywest.o beep.o +snd-powermac-objs := powermac.o pmac.o awacs.o burgundy.o daca.o tumbler.o toonie.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 05dabe454..82d791be7 100644 --- a/sound/ppc/awacs.c +++ b/sound/ppc/awacs.c @@ -801,10 +801,11 @@ 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 = kzalloc(sizeof(*amp), GFP_KERNEL); + struct awacs_amp *amp = kmalloc(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 57202b0f0..b96cd947d 100644 --- a/sound/ppc/daca.c +++ b/sound/ppc/daca.c @@ -22,6 +22,7 @@ #include #include #include +#include #include #include #include @@ -258,9 +259,10 @@ int __init snd_pmac_daca_init(struct snd_pmac *chip) request_module("i2c-powermac"); #endif /* CONFIG_KMOD */ - mix = kzalloc(sizeof(*mix), GFP_KERNEL); + mix = kmalloc(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 272ae38e9..6058c2dd1 100644 --- a/sound/ppc/keywest.c +++ b/sound/ppc/keywest.c @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include "pmac.h" @@ -64,10 +65,11 @@ static int keywest_attach_adapter(struct i2c_adapter *adapter) if (strncmp(i2c_device_name(adapter), "mac-io", 6)) return 0; /* ignored */ - new_client = kzalloc(sizeof(struct i2c_client), GFP_KERNEL); + new_client = kmalloc(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; @@ -117,9 +119,6 @@ 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 641430631..aa5717010 100644 --- a/sound/ppc/pmac.c +++ b/sound/ppc/pmac.c @@ -867,7 +867,9 @@ static int __init snd_pmac_detect(struct snd_pmac *chip) unsigned int *prop, l; struct macio_chip* macio; - if (!machine_is(powermac)) + u32 layout_id = 0; + + if (_machine != _MACH_Pmac) return -ENODEV; chip->subframe = 0; @@ -927,14 +929,8 @@ 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) { - /* 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; - } + if (prop) + layout_id = *prop; /* This should be verified on older screamers */ if (device_is_compatible(sound, "screamer")) { chip->model = PMAC_SCREAMER; @@ -967,6 +963,38 @@ 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; @@ -1120,7 +1148,6 @@ 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, @@ -1154,6 +1181,10 @@ 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])) { @@ -1167,10 +1198,9 @@ 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%016llx:%016llx)\n", - i, rnames[i], - (unsigned long long)chip->rsrc[i].start, - (unsigned long long)chip->rsrc[i].end); + " %d (%s: 0x%08lx:%08lx)\n", + i, rnames[i], chip->rsrc[i].start, + chip->rsrc[i].end); err = -ENODEV; goto __error; } @@ -1182,6 +1212,10 @@ 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])) { @@ -1195,10 +1229,9 @@ 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%016llx:%016llx)\n", - i, rnames[i], - (unsigned long long)chip->rsrc[i].start, - (unsigned long long)chip->rsrc[i].end); + " %d (%s: 0x%08lx:%08lx)\n", + i, rnames[i], chip->rsrc[i].start, + chip->rsrc[i].end); err = -ENODEV; goto __error; } @@ -1213,30 +1246,28 @@ 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) { - irq = irq_of_parse_and_map(np, 0); - if (request_irq(irq, snd_pmac_ctrl_intr, 0, + if (request_irq(np->intrs[0].line, snd_pmac_ctrl_intr, 0, "PMac", (void*)chip)) { - snd_printk(KERN_ERR "pmac: unable to grab IRQ %d\n", - irq); + snd_printk(KERN_ERR "pmac: unable to grab IRQ %d\n", np->intrs[0].line); err = -EBUSY; goto __error; } - chip->irq = irq; + chip->irq = np->intrs[0].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); + 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); err = -EBUSY; goto __error; } - 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); + 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); err = -EBUSY; goto __error; } - chip->rx_irq = irq; + chip->rx_irq = np->intrs[2].line; snd_pmac_sound_feature(chip, 1); diff --git a/sound/ppc/pmac.h b/sound/ppc/pmac.h index 8394e66ce..3a9bd4dbb 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_SNAPPER, PMAC_TOONIE }; struct snd_pmac { @@ -188,6 +188,7 @@ 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 2264574fa..f4902a219 100644 --- a/sound/ppc/powermac.c +++ b/sound/ppc/powermac.c @@ -94,6 +94,13 @@ 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"; @@ -181,14 +188,17 @@ 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) { - if (!IS_ERR(device)) - platform_device_unregister(device); + platform_device_unregister(device); platform_driver_unregister(&snd_pmac_driver); } diff --git a/sound/ppc/toonie.c b/sound/ppc/toonie.c index 1ac7c8552..053b8f24e 100644 --- a/sound/ppc/toonie.c +++ b/sound/ppc/toonie.c @@ -22,6 +22,7 @@ #include #include #include +#include #include #include #include @@ -117,7 +118,7 @@ static int toonie_get_mute_switch(struct snd_kcontrol *kcontrol, gp = &mix->amp_mute_gpio; break; default: - return -EINVAL; + return -EINVAL;; } ucontrol->value.integer.value[0] = !check_audio_gpio(gp); return 0; @@ -145,7 +146,7 @@ static int toonie_put_mute_switch(struct snd_kcontrol *kcontrol, gp = &mix->amp_mute_gpio; break; default: - return -EINVAL; + return -EINVAL;; } val = ! check_audio_gpio(gp); if (val != ucontrol->value.integer.value[0]) { @@ -335,7 +336,7 @@ static void toonie_cleanup(struct snd_pmac *chip) chip->mixer_data = NULL; } -int __init snd_pmac_toonie_init(struct snd_pmac *chip) +int snd_pmac_toonie_init(struct snd_pmac *chip) { struct pmac_toonie *mix; diff --git a/sound/ppc/tumbler.c b/sound/ppc/tumbler.c index 84f6b19c0..39d4cde78 100644 --- a/sound/ppc/tumbler.c +++ b/sound/ppc/tumbler.c @@ -28,6 +28,7 @@ #include #include #include +#include #include #include #include @@ -1121,7 +1122,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 irq_of_parse_and_map(node, 0); + return (node->n_intrs > 0) ? node->intrs[0].line : 0; } /* reset audio */ @@ -1264,16 +1265,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 <= NO_IRQ) + if (irq < 0) irq = tumbler_find_device("headphone-detect", NULL, &mix->hp_detect, 1); - if (irq <= NO_IRQ) + if (irq < 0) 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 <= NO_IRQ) + if (irq < 0) irq = tumbler_find_device("line-output-detect", NULL, &mix->line_detect, 1); mix->lineout_irq = irq; @@ -1316,9 +1317,10 @@ int __init snd_pmac_tumbler_init(struct snd_pmac *chip) request_module("i2c-powermac"); #endif /* CONFIG_KMOD */ - mix = kzalloc(sizeof(*mix), GFP_KERNEL); + mix = kmalloc(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 62d4d0c81..394b53e20 100644 --- a/sound/sound_core.c +++ b/sound/sound_core.c @@ -34,6 +34,7 @@ * locking at some point in 2.3.x. */ +#include #include #include #include @@ -43,6 +44,7 @@ #include #include #include +#include #include #define SOUND_STEP 16 @@ -51,7 +53,7 @@ struct sound_unit { int unit_minor; - const struct file_operations *unit_fops; + struct file_operations *unit_fops; struct sound_unit *next; char name[32]; }; @@ -71,7 +73,7 @@ EXPORT_SYMBOL(sound_class); * join into it. Called with the lock asserted */ -static int __sound_insert_unit(struct sound_unit * s, struct sound_unit **list, const struct file_operations *fops, int index, int low, int top) +static int __sound_insert_unit(struct sound_unit * s, struct sound_unit **list, struct file_operations *fops, int index, int low, int top) { int n=low; @@ -151,7 +153,7 @@ static DEFINE_SPINLOCK(sound_loader_lock); * list. Acquires locks as needed */ -static int sound_insert_unit(struct sound_unit **list, const struct file_operations *fops, int index, int low, int top, const char *name, umode_t mode, struct device *dev) +static int sound_insert_unit(struct sound_unit **list, struct file_operations *fops, int index, int low, int top, const char *name, umode_t mode, struct device *dev) { struct sound_unit *s = kmalloc(sizeof(*s), GFP_KERNEL); int r; @@ -170,6 +172,8 @@ 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; @@ -193,6 +197,7 @@ 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); } @@ -232,7 +237,7 @@ static struct sound_unit *chains[SOUND_STEP]; * a negative error code is returned. */ -int register_sound_special_device(const struct file_operations *fops, int unit, +int register_sound_special_device(struct file_operations *fops, int unit, struct device *dev) { const int chain = unit % SOUND_STEP; @@ -296,7 +301,7 @@ int register_sound_special_device(const struct file_operations *fops, int unit, EXPORT_SYMBOL(register_sound_special_device); -int register_sound_special(const struct file_operations *fops, int unit) +int register_sound_special(struct file_operations *fops, int unit) { return register_sound_special_device(fops, unit, NULL); } @@ -313,7 +318,7 @@ EXPORT_SYMBOL(register_sound_special); * number is returned, on failure a negative error code is returned. */ -int register_sound_mixer(const struct file_operations *fops, int dev) +int register_sound_mixer(struct file_operations *fops, int dev) { return sound_insert_unit(&chains[0], fops, dev, 0, 128, "mixer", S_IRUSR | S_IWUSR, NULL); @@ -331,7 +336,7 @@ EXPORT_SYMBOL(register_sound_mixer); * number is returned, on failure a negative error code is returned. */ -int register_sound_midi(const struct file_operations *fops, int dev) +int register_sound_midi(struct file_operations *fops, int dev) { return sound_insert_unit(&chains[2], fops, dev, 2, 130, "midi", S_IRUSR | S_IWUSR, NULL); @@ -357,7 +362,7 @@ EXPORT_SYMBOL(register_sound_midi); * and will always allocate them as a matching pair - eg dsp3/audio3 */ -int register_sound_dsp(const struct file_operations *fops, int dev) +int register_sound_dsp(struct file_operations *fops, int dev) { return sound_insert_unit(&chains[3], fops, dev, 3, 131, "dsp", S_IWUSR | S_IRUSR, NULL); @@ -376,7 +381,7 @@ EXPORT_SYMBOL(register_sound_dsp); */ -int register_sound_synth(const struct file_operations *fops, int dev) +int register_sound_synth(struct file_operations *fops, int dev) { return sound_insert_unit(&chains[9], fops, dev, 9, 137, "synth", S_IRUSR | S_IWUSR, NULL); @@ -496,7 +501,7 @@ int soundcore_open(struct inode *inode, struct file *file) int chain; int unit = iminor(inode); struct sound_unit *s; - const struct file_operations *new_fops = NULL; + struct file_operations *new_fops = NULL; chain=unit&0x0F; if(chain==4 || chain==5) /* dsp/audio/dsp16 */ @@ -535,7 +540,7 @@ int soundcore_open(struct inode *inode, struct file *file) * switching ->f_op in the first place. */ int err = 0; - const struct file_operations *old_fops = file->f_op; + struct file_operations *old_fops = file->f_op; file->f_op = new_fops; spin_unlock(&sound_loader_lock); if(file->f_op->open) @@ -565,6 +570,7 @@ 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); } @@ -574,6 +580,7 @@ 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 2bd8e40b8..55493340f 100644 --- a/sound/sparc/amd7930.c +++ b/sound/sparc/amd7930.c @@ -46,7 +46,6 @@ #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 */ @@ -336,6 +335,7 @@ struct snd_amd7930 { int pgain; int mgain; + struct sbus_dev *sdev; unsigned int irq; unsigned int regs_size; struct snd_amd7930 *next; @@ -946,9 +946,11 @@ 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, - int irq, int dev, + struct linux_prom_irqs *irq_prop, + int dev, struct snd_amd7930 **ramd) { unsigned long flags; @@ -962,6 +964,7 @@ 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"); @@ -972,14 +975,15 @@ static int __init snd_amd7930_create(struct snd_card *card, amd7930_idle(amd); - 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); + 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)); snd_amd7930_free(amd); return -EBUSY; } - amd->irq = irq; + amd->irq = irq_prop->pri; amd7930_enable_ints(amd); @@ -1013,35 +1017,60 @@ static int __init snd_amd7930_create(struct snd_card *card, return 0; } -static int __init amd7930_attach_common(struct resource *rp, int irq) +static int __init amd7930_attach(int prom_node, struct sbus_dev *sdev) { - static int dev_num; + static int dev; + struct linux_prom_registers reg_prop; + struct linux_prom_irqs irq_prop; + struct resource res, *rp; struct snd_card *card; struct snd_amd7930 *amd; int err; - if (dev_num >= SNDRV_CARDS) + if (dev >= SNDRV_CARDS) return -ENODEV; - if (!enable[dev_num]) { - dev_num++; + if (!enable[dev]) { + dev++; return -ENOENT; } - card = snd_card_new(index[dev_num], id[dev_num], THIS_MODULE, 0); + 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); if (card == NULL) return -ENOMEM; strcpy(card->driver, "AMD7930"); strcpy(card->shortname, "Sun AMD7930"); - sprintf(card->longname, "%s at 0x%02lx:0x%08Lx, irq %d", + sprintf(card->longname, "%s at 0x%02lx:0x%08lx, irq %s", card->shortname, rp->flags & 0xffL, - (unsigned long long)rp->start, - irq); + rp->start, + __irq_itoa(irq_prop.pri)); - if ((err = snd_amd7930_create(card, rp, - (rp->end - rp->start) + 1, - irq, dev_num, &amd)) < 0) + if ((err = snd_amd7930_create(card, sdev, rp, reg_prop.reg_size, + &irq_prop, dev, &amd)) < 0) goto out_err; if ((err = snd_amd7930_pcm(amd)) < 0) @@ -1056,8 +1085,7 @@ static int __init amd7930_attach_common(struct resource *rp, int irq) amd->next = amd7930_list; amd7930_list = amd; - dev_num++; - + dev++; return 0; out_err: @@ -1065,71 +1093,29 @@ out_err: return err; } -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_dev *sdev = to_sbus_device(&dev->dev); - - 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; + struct sbus_bus *sbus; + struct sbus_dev *sdev; + int node, found; + + found = 0; /* Try to find the sun4c "audio" node first. */ - dp = of_find_node_by_path("/"); - dp = dp->child; - while (dp) { - if (!strcmp(dp->name, "audio")) - amd7930_obio_attach(dp); + node = prom_getchild(prom_root_node); + node = prom_searchsiblings(node, "audio"); + if (node && amd7930_attach(node, NULL) == 0) + found++; - dp = dp->sibling; + /* 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++; + } } - /* Probe each SBUS for amd7930 chips. */ - return of_register_driver(&amd7930_sbus_driver, &sbus_bus_type); + return (found > 0) ? 0 : -EIO; } static void __exit amd7930_exit(void) @@ -1145,8 +1131,6 @@ 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 9a06c3bd6..e581a0235 100644 --- a/sound/sparc/cs4231.c +++ b/sound/sparc/cs4231.c @@ -8,6 +8,7 @@ * Copyright (c) by Jaroslav Kysela */ +#include #include #include #include @@ -114,8 +115,8 @@ struct snd_cs4231 { unsigned char image[32]; /* registers image */ int mce_bit; int calibrate_mute; - struct mutex mce_mutex; - struct mutex open_mutex; + struct semaphore mce_mutex; + struct semaphore open_mutex; union { #ifdef SBUS_SUPPORT @@ -610,7 +611,8 @@ static void snd_cs4231_advance_dma(struct cs4231_dma_control *dma_cont, unsigned int period_size = snd_pcm_lib_period_bytes(substream); unsigned int offset = period_size * (*periods_sent); - BUG_ON(period_size >= (1 << 24)); + if (period_size >= (1 << 24)) + BUG(); if (dma_cont->request(dma_cont, runtime->dma_addr + offset, period_size)) return; @@ -773,7 +775,7 @@ static void snd_cs4231_playback_format(struct snd_cs4231 *chip, struct snd_pcm_h { unsigned long flags; - mutex_lock(&chip->mce_mutex); + down(&chip->mce_mutex); snd_cs4231_calibrate_mute(chip, 1); snd_cs4231_mce_up(chip); @@ -788,7 +790,7 @@ static void snd_cs4231_playback_format(struct snd_cs4231 *chip, struct snd_pcm_h snd_cs4231_mce_down(chip); snd_cs4231_calibrate_mute(chip, 0); - mutex_unlock(&chip->mce_mutex); + up(&chip->mce_mutex); } static void snd_cs4231_capture_format(struct snd_cs4231 *chip, struct snd_pcm_hw_params *params, @@ -796,7 +798,7 @@ static void snd_cs4231_capture_format(struct snd_cs4231 *chip, struct snd_pcm_hw { unsigned long flags; - mutex_lock(&chip->mce_mutex); + down(&chip->mce_mutex); snd_cs4231_calibrate_mute(chip, 1); snd_cs4231_mce_up(chip); @@ -817,7 +819,7 @@ static void snd_cs4231_capture_format(struct snd_cs4231 *chip, struct snd_pcm_hw snd_cs4231_mce_down(chip); snd_cs4231_calibrate_mute(chip, 0); - mutex_unlock(&chip->mce_mutex); + up(&chip->mce_mutex); } /* @@ -931,14 +933,14 @@ static int snd_cs4231_open(struct snd_cs4231 *chip, unsigned int mode) { unsigned long flags; - mutex_lock(&chip->open_mutex); + down(&chip->open_mutex); if ((chip->mode & mode)) { - mutex_unlock(&chip->open_mutex); + up(&chip->open_mutex); return -EAGAIN; } if (chip->mode & CS4231_MODE_OPEN) { chip->mode |= mode; - mutex_unlock(&chip->open_mutex); + up(&chip->open_mutex); return 0; } /* ok. now enable and ack CODEC IRQ */ @@ -958,7 +960,7 @@ static int snd_cs4231_open(struct snd_cs4231 *chip, unsigned int mode) spin_unlock_irqrestore(&chip->lock, flags); chip->mode = mode; - mutex_unlock(&chip->open_mutex); + up(&chip->open_mutex); return 0; } @@ -966,10 +968,10 @@ static void snd_cs4231_close(struct snd_cs4231 *chip, unsigned int mode) { unsigned long flags; - mutex_lock(&chip->open_mutex); + down(&chip->open_mutex); chip->mode &= ~mode; if (chip->mode & CS4231_MODE_OPEN) { - mutex_unlock(&chip->open_mutex); + up(&chip->open_mutex); return; } snd_cs4231_calibrate_mute(chip, 1); @@ -1006,7 +1008,7 @@ static void snd_cs4231_close(struct snd_cs4231 *chip, unsigned int mode) snd_cs4231_calibrate_mute(chip, 0); chip->mode = 0; - mutex_unlock(&chip->open_mutex); + up(&chip->open_mutex); } /* @@ -1077,7 +1079,8 @@ static int snd_cs4231_playback_prepare(struct snd_pcm_substream *substream) chip->image[CS4231_IFACE_CTRL] &= ~(CS4231_PLAYBACK_ENABLE | CS4231_PLAYBACK_PIO); - BUG_ON(runtime->period_size > 0xffff + 1); + if (runtime->period_size > 0xffff + 1) + BUG(); chip->p_periods_sent = 0; spin_unlock_irqrestore(&chip->lock, flags); @@ -1268,7 +1271,7 @@ static struct snd_pcm_hardware snd_cs4231_playback = .channels_min = 1, .channels_max = 2, .buffer_bytes_max = (32*1024), - .period_bytes_min = 4096, + .period_bytes_min = 64, .period_bytes_max = (32*1024), .periods_min = 1, .periods_max = 1024, @@ -1288,7 +1291,7 @@ static struct snd_pcm_hardware snd_cs4231_capture = .channels_min = 1, .channels_max = 2, .buffer_bytes_max = (32*1024), - .period_bytes_min = 4096, + .period_bytes_min = 64, .period_bytes_max = (32*1024), .periods_min = 1, .periods_max = 1024, @@ -1796,7 +1799,7 @@ static irqreturn_t snd_cs4231_sbus_interrupt(int irq, void *dev_id, struct pt_re snd_cs4231_outm(chip, CS4231_IRQ_STATUS, ~CS4231_ALL_IRQS | ~status, 0); spin_unlock_irqrestore(&chip->lock, flags); - return 0; + return IRQ_HANDLED; } /* @@ -1821,7 +1824,6 @@ static int sbus_dma_request(struct cs4231_dma_control *dma_cont, dma_addr_t bus_ if (!(csr & test)) goto out; err = -EBUSY; - csr = sbus_readl(base->regs + APCCSR); test = APC_XINT_CNVA; if ( base->dir == APC_PLAY ) test = APC_XINT_PNVA; @@ -1862,17 +1864,16 @@ static void sbus_dma_enable(struct cs4231_dma_control *dma_cont, int on) spin_lock_irqsave(&base->lock, flags); if (!on) { - if (base->dir == APC_PLAY) { - sbus_writel(0, base->regs + base->dir + APCNVA); - sbus_writel(1, base->regs + base->dir + APCC); - } - else - { - sbus_writel(0, base->regs + base->dir + APCNC); - sbus_writel(0, base->regs + base->dir + APCVA); - } + sbus_writel(0, base->regs + base->dir + APCNC); + sbus_writel(0, base->regs + base->dir + APCNVA); + sbus_writel(0, base->regs + base->dir + APCC); + sbus_writel(0, base->regs + base->dir + APCVA); + + /* ACK any APC interrupts. */ + csr = sbus_readl(base->regs + APCCSR); + sbus_writel(csr, base->regs + APCCSR); } - udelay(600); + udelay(1000); csr = sbus_readl(base->regs + APCCSR); shift = 0; if ( base->dir == APC_PLAY ) @@ -1966,8 +1967,8 @@ static int __init snd_cs4231_sbus_create(struct snd_card *card, spin_lock_init(&chip->lock); spin_lock_init(&chip->c_dma.sbus_info.lock); spin_lock_init(&chip->p_dma.sbus_info.lock); - mutex_init(&chip->mce_mutex); - mutex_init(&chip->open_mutex); + init_MUTEX(&chip->mce_mutex); + init_MUTEX(&chip->open_mutex); chip->card = card; chip->dev_u.sdev = sdev; chip->regs_size = sdev->reg_addrs[0].reg_size; @@ -2001,9 +2002,10 @@ 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, - IRQF_SHARED, "cs4231", chip)) { - snd_printdd("cs4231-%d: Unable to grab SBUS IRQ %d\n", - dev, sdev->irqs[0]); + SA_SHIRQ, "cs4231", chip)) { + snd_printdd("cs4231-%d: Unable to grab SBUS IRQ %s\n", + dev, + __irq_itoa(sdev->irqs[0])); snd_cs4231_sbus_free(chip); return -EBUSY; } @@ -2036,11 +2038,11 @@ static int __init cs4231_sbus_attach(struct sbus_dev *sdev) if (err) return err; - sprintf(card->longname, "%s at 0x%02lx:0x%016Lx, irq %d", + sprintf(card->longname, "%s at 0x%02lx:0x%08lx, irq %s", card->shortname, rp->flags & 0xffL, - (unsigned long long)rp->start, - sdev->irqs[0]); + rp->start, + __irq_itoa(sdev->irqs[0])); if ((err = snd_cs4231_sbus_create(card, sdev, dev, &cp)) < 0) { snd_card_free(card); @@ -2153,8 +2155,8 @@ static int __init snd_cs4231_ebus_create(struct snd_card *card, spin_lock_init(&chip->lock); spin_lock_init(&chip->c_dma.ebus_info.lock); spin_lock_init(&chip->p_dma.ebus_info.lock); - mutex_init(&chip->mce_mutex); - mutex_init(&chip->open_mutex); + init_MUTEX(&chip->mce_mutex); + init_MUTEX(&chip->open_mutex); chip->flags |= CS4231_FLAG_EBUS; chip->card = card; chip->dev_u.pdev = edev->bus->self; @@ -2242,10 +2244,10 @@ static int __init cs4231_ebus_attach(struct linux_ebus_device *edev) if (err) return err; - sprintf(card->longname, "%s at 0x%lx, irq %d", + sprintf(card->longname, "%s at 0x%lx, irq %s", card->shortname, edev->resource[0].start, - edev->irqs[0]); + __irq_itoa(edev->irqs[0])); if ((err = snd_cs4231_ebus_create(card, edev, dev, &chip)) < 0) { snd_card_free(card); @@ -2283,14 +2285,15 @@ static int __init cs4231_init(void) for_each_ebusdev(edev, ebus) { int match = 0; - if (!strcmp(edev->prom_node->name, "SUNW,CS4231")) { + if (!strcmp(edev->prom_name, "SUNW,CS4231")) { match = 1; - } else if (!strcmp(edev->prom_node->name, "audio")) { - char *compat; + } else if (!strcmp(edev->prom_name, "audio")) { + char compat[16]; - compat = of_get_property(edev->prom_node, - "compatible", NULL); - if (compat && !strcmp(compat, "SUNW,CS4231")) + prom_getstring(edev->prom_node, "compatible", + compat, sizeof(compat)); + compat[15] = '\0'; + if (!strcmp(compat, "SUNW,CS4231")) match = 1; } diff --git a/sound/sparc/dbri.c b/sound/sparc/dbri.c index f3ae6e236..2164b7d29 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 specific stuff + * cs4215_* CS4215 codec specfic 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; +static int dbri_debug = 0; 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; /* All DBRI devices */ +static struct snd_dbri *dbri_list = NULL; /* 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, dbri_regs_read); + snd_info_set_text_ops(entry, dbri, 1024, dbri_regs_read); #ifdef DBRI_DEBUG if (! snd_card_proc_new(dbri->card, "debug", &entry)) { - snd_info_set_text_ops(entry, dbri, dbri_debug_read); + snd_info_set_text_ops(entry, dbri, 4096, 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, IRQF_SHARED, + err = request_irq(dbri->irq, snd_dbri_interrupt, SA_SHIRQ, "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%016Lx, irq %d", + sprintf(card->longname, "%s at 0x%02lx:0x%08lx, irq %s", card->shortname, - rp->flags & 0xffL, (unsigned long long)rp->start, irq.pri); + rp->flags & 0xffL, rp->start, __irq_itoa(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 573e3701c..7c8e328fa 100644 --- a/sound/synth/emux/emux.c +++ b/sound/synth/emux/emux.c @@ -45,7 +45,7 @@ int snd_emux_new(struct snd_emux **remu) return -ENOMEM; spin_lock_init(&emu->voice_lock); - mutex_init(&emu->register_mutex); + init_MUTEX(&emu->register_mutex); emu->client = -1; #ifdef CONFIG_SND_SEQUENCER_OSS @@ -63,7 +63,6 @@ int snd_emux_new(struct snd_emux **remu) return 0; } -EXPORT_SYMBOL(snd_emux_new); /* */ @@ -137,7 +136,6 @@ int snd_emux_register(struct snd_emux *emu, struct snd_card *card, int index, ch return 0; } -EXPORT_SYMBOL(snd_emux_register); /* */ @@ -173,8 +171,18 @@ 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_oss.c b/sound/synth/emux/emux_oss.c index 343681672..dfbfcfbe5 100644 --- a/sound/synth/emux/emux_oss.c +++ b/sound/synth/emux/emux_oss.c @@ -117,10 +117,10 @@ snd_emux_open_seq_oss(struct snd_seq_oss_arg *arg, void *closure) emu = closure; snd_assert(arg != NULL && emu != NULL, return -ENXIO); - mutex_lock(&emu->register_mutex); + down(&emu->register_mutex); if (!snd_emux_inc_count(emu)) { - mutex_unlock(&emu->register_mutex); + up(&emu->register_mutex); return -EFAULT; } @@ -134,7 +134,7 @@ snd_emux_open_seq_oss(struct snd_seq_oss_arg *arg, void *closure) if (p == NULL) { snd_printk("can't create port\n"); snd_emux_dec_count(emu); - mutex_unlock(&emu->register_mutex); + up(&emu->register_mutex); return -ENOMEM; } @@ -148,7 +148,7 @@ snd_emux_open_seq_oss(struct snd_seq_oss_arg *arg, void *closure) snd_emux_reset_port(p); - mutex_unlock(&emu->register_mutex); + up(&emu->register_mutex); return 0; } @@ -191,13 +191,13 @@ snd_emux_close_seq_oss(struct snd_seq_oss_arg *arg) emu = p->emu; snd_assert(emu != NULL, return -ENXIO); - mutex_lock(&emu->register_mutex); + down(&emu->register_mutex); snd_emux_sounds_off_all(p); snd_soundfont_close_check(emu->sflist, SF_CLIENT_NO(p->chset.port)); snd_seq_event_port_detach(p->chset.client, p->chset.port); snd_emux_dec_count(emu); - mutex_unlock(&emu->register_mutex); + up(&emu->register_mutex); return 0; } diff --git a/sound/synth/emux/emux_proc.c b/sound/synth/emux/emux_proc.c index 58b9601f3..a70a179f6 100644 --- a/sound/synth/emux/emux_proc.c +++ b/sound/synth/emux/emux_proc.c @@ -37,7 +37,7 @@ snd_emux_proc_info_read(struct snd_info_entry *entry, int i; emu = entry->private_data; - mutex_lock(&emu->register_mutex); + down(&emu->register_mutex); if (emu->name) snd_iprintf(buf, "Device: %s\n", emu->name); snd_iprintf(buf, "Ports: %d\n", emu->num_ports); @@ -56,13 +56,13 @@ snd_emux_proc_info_read(struct snd_info_entry *entry, snd_iprintf(buf, "Memory Size: 0\n"); } if (emu->sflist) { - mutex_lock(&emu->sflist->presets_mutex); + down(&emu->sflist->presets_mutex); snd_iprintf(buf, "SoundFonts: %d\n", emu->sflist->fonts_size); snd_iprintf(buf, "Instruments: %d\n", emu->sflist->zone_counter); snd_iprintf(buf, "Samples: %d\n", emu->sflist->sample_counter); snd_iprintf(buf, "Locked Instruments: %d\n", emu->sflist->zone_locked); snd_iprintf(buf, "Locked Samples: %d\n", emu->sflist->sample_locked); - mutex_unlock(&emu->sflist->presets_mutex); + up(&emu->sflist->presets_mutex); } #if 0 /* debug */ if (emu->voices[0].state != SNDRV_EMUX_ST_OFF && emu->voices[0].ch >= 0) { @@ -103,7 +103,7 @@ snd_emux_proc_info_read(struct snd_info_entry *entry, snd_iprintf(buf, "sample_mode=%x, rate=%x\n", vp->reg.sample_mode, vp->reg.rate_offset); } #endif - mutex_unlock(&emu->register_mutex); + up(&emu->register_mutex); } @@ -119,6 +119,7 @@ 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 d176cc017..1a973d7a9 100644 --- a/sound/synth/emux/emux_seq.c +++ b/sound/synth/emux/emux_seq.c @@ -55,8 +55,7 @@ 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_HARDWARE |\ - SNDRV_SEQ_PORT_TYPE_SYNTHESIZER) + SNDRV_SEQ_PORT_TYPE_DIRECT_SAMPLE) /* * Initialise the EMUX Synth by creating a client and registering @@ -124,12 +123,12 @@ snd_emux_detach_seq(struct snd_emux *emu) if (emu->voices) snd_emux_terminate_all(emu); - mutex_lock(&emu->register_mutex); + down(&emu->register_mutex); if (emu->client >= 0) { snd_seq_delete_kernel_client(emu->client); emu->client = -1; } - mutex_unlock(&emu->register_mutex); + up(&emu->register_mutex); } @@ -312,10 +311,10 @@ snd_emux_use(void *private_data, struct snd_seq_port_subscribe *info) emu = p->emu; snd_assert(emu != NULL, return -EINVAL); - mutex_lock(&emu->register_mutex); + down(&emu->register_mutex); snd_emux_init_port(p); snd_emux_inc_count(emu); - mutex_unlock(&emu->register_mutex); + up(&emu->register_mutex); return 0; } @@ -333,10 +332,10 @@ snd_emux_unuse(void *private_data, struct snd_seq_port_subscribe *info) emu = p->emu; snd_assert(emu != NULL, return -EINVAL); - mutex_lock(&emu->register_mutex); + down(&emu->register_mutex); snd_emux_sounds_off_all(p); snd_emux_dec_count(emu); - mutex_unlock(&emu->register_mutex); + up(&emu->register_mutex); return 0; } diff --git a/sound/synth/emux/emux_synth.c b/sound/synth/emux/emux_synth.c index 3733118d3..24705d15e 100644 --- a/sound/synth/emux/emux_synth.c +++ b/sound/synth/emux/emux_synth.c @@ -434,7 +434,6 @@ 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 @@ -952,8 +951,6 @@ 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) @@ -968,5 +965,3 @@ 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 455e53593..4c5754d4a 100644 --- a/sound/synth/emux/soundfont.c +++ b/sound/synth/emux/soundfont.c @@ -79,7 +79,7 @@ static void lock_preset(struct snd_sf_list *sflist) { unsigned long flags; - mutex_lock(&sflist->presets_mutex); + down(&sflist->presets_mutex); spin_lock_irqsave(&sflist->lock, flags); sflist->presets_locked = 1; spin_unlock_irqrestore(&sflist->lock, flags); @@ -96,7 +96,7 @@ unlock_preset(struct snd_sf_list *sflist) spin_lock_irqsave(&sflist->lock, flags); sflist->presets_locked = 0; spin_unlock_irqrestore(&sflist->lock, flags); - mutex_unlock(&sflist->presets_mutex); + up(&sflist->presets_mutex); } @@ -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,9 +810,6 @@ 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 */ @@ -1393,7 +1390,7 @@ snd_sf_new(struct snd_sf_callback *callback, struct snd_util_memhdr *hdr) if ((sflist = kzalloc(sizeof(*sflist), GFP_KERNEL)) == NULL) return NULL; - mutex_init(&sflist->presets_mutex); + init_MUTEX(&sflist->presets_mutex); spin_lock_init(&sflist->lock); sflist->memhdr = hdr; @@ -1488,3 +1485,4 @@ snd_soundfont_remove_unlocked(struct snd_sf_list *sflist) unlock_preset(sflist); return 0; } + diff --git a/sound/synth/util_mem.c b/sound/synth/util_mem.c index 1d9b11f34..217e8e552 100644 --- a/sound/synth/util_mem.c +++ b/sound/synth/util_mem.c @@ -18,7 +18,6 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -#include #include #include #include @@ -43,7 +42,7 @@ snd_util_memhdr_new(int memsize) if (hdr == NULL) return NULL; hdr->size = memsize; - mutex_init(&hdr->block_mutex); + init_MUTEX(&hdr->block_mutex); INIT_LIST_HEAD(&hdr->block); return hdr; @@ -137,9 +136,9 @@ struct snd_util_memblk * snd_util_mem_alloc(struct snd_util_memhdr *hdr, int size) { struct snd_util_memblk *blk; - mutex_lock(&hdr->block_mutex); + down(&hdr->block_mutex); blk = __snd_util_mem_alloc(hdr, size); - mutex_unlock(&hdr->block_mutex); + up(&hdr->block_mutex); return blk; } @@ -164,9 +163,9 @@ int snd_util_mem_free(struct snd_util_memhdr *hdr, struct snd_util_memblk *blk) { snd_assert(hdr && blk, return -EINVAL); - mutex_lock(&hdr->block_mutex); + down(&hdr->block_mutex); __snd_util_mem_free(hdr, blk); - mutex_unlock(&hdr->block_mutex); + up(&hdr->block_mutex); return 0; } @@ -176,9 +175,9 @@ int snd_util_mem_free(struct snd_util_memhdr *hdr, struct snd_util_memblk *blk) int snd_util_mem_avail(struct snd_util_memhdr *hdr) { unsigned int size; - mutex_lock(&hdr->block_mutex); + down(&hdr->block_mutex); size = hdr->size - hdr->used; - mutex_unlock(&hdr->block_mutex); + up(&hdr->block_mutex); return size; } diff --git a/sound/usb/usbaudio.c b/sound/usb/usbaudio.c index 1b7f499c5..d5013383f 100644 --- a/sound/usb/usbaudio.c +++ b/sound/usb/usbaudio.c @@ -47,7 +47,6 @@ #include #include #include -#include #include #include #include @@ -70,7 +69,6 @@ static int vid[SNDRV_CARDS] = { [0 ... (SNDRV_CARDS-1)] = -1 }; /* Vendor ID for static int pid[SNDRV_CARDS] = { [0 ... (SNDRV_CARDS-1)] = -1 }; /* Product ID for this card */ static int nrpacks = 4; /* max. number of packets per urb */ static int async_unlink = 1; -static int device_setup[SNDRV_CARDS]; /* device parameter for this card*/ module_param_array(index, int, NULL, 0444); MODULE_PARM_DESC(index, "Index value for the USB audio adapter."); @@ -86,8 +84,6 @@ module_param(nrpacks, int, 0644); MODULE_PARM_DESC(nrpacks, "Max. number of packets per URB."); module_param(async_unlink, bool, 0444); MODULE_PARM_DESC(async_unlink, "Use async unlink mode."); -module_param_array(device_setup, int, NULL, 0444); -MODULE_PARM_DESC(device_setup, "Specific device setup (if needed)."); /* @@ -206,7 +202,7 @@ struct snd_usb_stream { * the all interfaces on the same card as one sound device. */ -static DEFINE_MUTEX(register_mutex); +static DECLARE_MUTEX(register_mutex); static struct snd_usb_audio *usb_chip[SNDRV_CARDS]; @@ -479,18 +475,6 @@ static int retire_playback_sync_urb_hs(struct snd_usb_substream *subs, return 0; } -/* determine the number of frames in the next packet */ -static int snd_usb_audio_next_packet_size(struct snd_usb_substream *subs) -{ - if (subs->fill_max) - return subs->maxframesize; - else { - subs->phase = (subs->phase & 0xffff) - + (subs->freqm << subs->datainterval); - return min(subs->phase >> 16, subs->maxframesize); - } -} - /* * Prepare urb for streaming before playback starts. * @@ -508,7 +492,16 @@ static int prepare_startup_playback_urb(struct snd_usb_substream *subs, urb->dev = ctx->subs->dev; urb->number_of_packets = subs->packs_per_ms; for (i = 0; i < subs->packs_per_ms; ++i) { - counts = snd_usb_audio_next_packet_size(subs); + /* calculate the size of a packet */ + if (subs->fill_max) + counts = subs->maxframesize; /* fixed */ + else { + subs->phase = (subs->phase & 0xffff) + + (subs->freqm << subs->datainterval); + counts = subs->phase >> 16; + if (counts > subs->maxframesize) + counts = subs->maxframesize; + } urb->iso_frame_desc[i].offset = offs * stride; urb->iso_frame_desc[i].length = counts * stride; offs += counts; @@ -545,7 +538,16 @@ static int prepare_playback_urb(struct snd_usb_substream *subs, urb->number_of_packets = 0; spin_lock_irqsave(&subs->lock, flags); for (i = 0; i < ctx->packets; i++) { - counts = snd_usb_audio_next_packet_size(subs); + /* calculate the size of a packet */ + if (subs->fill_max) + counts = subs->maxframesize; /* fixed */ + else { + subs->phase = (subs->phase & 0xffff) + + (subs->freqm << subs->datainterval); + counts = subs->phase >> 16; + if (counts > subs->maxframesize) + counts = subs->maxframesize; + } /* set up descriptor */ urb->iso_frame_desc[i].offset = offs * stride; urb->iso_frame_desc[i].length = counts * stride; @@ -723,9 +725,10 @@ static int snd_pcm_alloc_vmalloc_buffer(struct snd_pcm_substream *subs, size_t s static int snd_pcm_free_vmalloc_buffer(struct snd_pcm_substream *subs) { struct snd_pcm_runtime *runtime = subs->runtime; - - vfree(runtime->dma_area); - runtime->dma_area = NULL; + if (runtime->dma_area) { + vfree(runtime->dma_area); + runtime->dma_area = NULL; + } return 0; } @@ -776,35 +779,6 @@ static int deactivate_urbs(struct snd_usb_substream *subs, int force, int can_sl } -static const char *usb_error_string(int err) -{ - switch (err) { - case -ENODEV: - return "no device"; - case -ENOENT: - return "endpoint not enabled"; - case -EPIPE: - return "endpoint stalled"; - case -ENOSPC: - return "not enough bandwidth"; - case -ESHUTDOWN: - return "device disabled"; - case -EHOSTUNREACH: - return "device suspended"; -#ifndef CONFIG_USB_EHCI_SPLIT_ISO - case -ENOSYS: - return "enable CONFIG_USB_EHCI_SPLIT_ISO to play through a hub"; -#endif - case -EINVAL: - case -EAGAIN: - case -EFBIG: - case -EMSGSIZE: - return "internal error"; - default: - return "unknown error"; - } -} - /* * set up and start data/sync urbs */ @@ -837,22 +811,16 @@ static int start_urbs(struct snd_usb_substream *subs, struct snd_pcm_runtime *ru subs->unlink_mask = 0; subs->running = 1; for (i = 0; i < subs->nurbs; i++) { - err = usb_submit_urb(subs->dataurb[i].urb, GFP_ATOMIC); - if (err < 0) { - snd_printk(KERN_ERR "cannot submit datapipe " - "for urb %d, error %d: %s\n", - i, err, usb_error_string(err)); + if ((err = usb_submit_urb(subs->dataurb[i].urb, GFP_ATOMIC)) < 0) { + snd_printk(KERN_ERR "cannot submit datapipe for urb %d, err = %d\n", i, err); goto __error; } set_bit(i, &subs->active_mask); } if (subs->syncpipe) { for (i = 0; i < SYNC_URBS; i++) { - err = usb_submit_urb(subs->syncurb[i].urb, GFP_ATOMIC); - if (err < 0) { - snd_printk(KERN_ERR "cannot submit syncpipe " - "for urb %d, error %d: %s\n", - i, err, usb_error_string(err)); + if ((err = usb_submit_urb(subs->syncurb[i].urb, GFP_ATOMIC)) < 0) { + snd_printk(KERN_ERR "cannot submit syncpipe for urb %d, err = %d\n", i, err); goto __error; } set_bit(i + 16, &subs->active_mask); @@ -1422,8 +1390,8 @@ static int snd_usb_hw_params(struct snd_pcm_substream *substream, channels = params_channels(hw_params); fmt = find_format(subs, format, rate, channels); if (! fmt) { - snd_printd(KERN_DEBUG "cannot set format: format = 0x%x, rate = %d, channels = %d\n", - format, rate, channels); + snd_printd(KERN_DEBUG "cannot set format: format = %s, rate = %d, channels = %d\n", + snd_pcm_format_name(format), rate, channels); return -EINVAL; } @@ -2049,8 +2017,6 @@ static struct usb_driver usb_audio_driver = { }; -#if defined(CONFIG_PROCFS) && defined(CONFIG_SND_VERBOSE_PROCFS) - /* * proc interface for list the supported pcm formats */ @@ -2066,7 +2032,7 @@ static void proc_dump_substream_formats(struct snd_usb_substream *subs, struct s fp = list_entry(p, struct audioformat, list); snd_iprintf(buffer, " Interface %d\n", fp->iface); snd_iprintf(buffer, " Altset %d\n", fp->altsetting); - snd_iprintf(buffer, " Format: 0x%x\n", fp->format); + snd_iprintf(buffer, " Format: %s\n", snd_pcm_format_name(fp->format)); snd_iprintf(buffer, " Channels: %d\n", fp->channels); snd_iprintf(buffer, " Endpoint: %d %s (%s)\n", fp->endpoint & USB_ENDPOINT_NUMBER_MASK, @@ -2138,16 +2104,9 @@ 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, proc_pcm_format_read); -} - -#else - -static inline void proc_pcm_format_add(struct snd_usb_stream *stream) -{ + snd_info_set_text_ops(entry, stream, 1024, proc_pcm_format_read); } -#endif /* * initialize the substream instance. @@ -2260,9 +2219,10 @@ static int add_audio_endpoint(struct snd_usb_audio *chip, int stream, struct aud } /* create a new pcm */ - as = kzalloc(sizeof(*as), GFP_KERNEL); + as = kmalloc(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; @@ -2549,8 +2509,6 @@ static int parse_audio_format(struct snd_usb_audio *chip, struct audioformat *fp return 0; } -static int audiophile_skip_setting_quirk(struct snd_usb_audio *chip, - int iface, int altno); static int parse_audio_endpoints(struct snd_usb_audio *chip, int iface_no) { struct usb_device *dev; @@ -2585,12 +2543,6 @@ static int parse_audio_endpoints(struct snd_usb_audio *chip, int iface_no) stream = (get_endpoint(alts, 0)->bEndpointAddress & USB_DIR_IN) ? SNDRV_PCM_STREAM_CAPTURE : SNDRV_PCM_STREAM_PLAYBACK; altno = altsd->bAlternateSetting; - - /* audiophile usb: skip altsets incompatible with device_setup - */ - if (chip->usb_id == USB_ID(0x0763, 0x2003) && - audiophile_skip_setting_quirk(chip, iface_no, altno)) - continue; /* get audio formats */ fmt = snd_usb_find_csint_desc(alts->extra, alts->extralen, NULL, AS_GENERAL); @@ -2626,18 +2578,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_WARNING "%d:%u:%d : no or invalid" - " class specific endpoint descriptor\n", + snd_printk(KERN_ERR "%d:%u:%d : no or invalid class specific endpoint descriptor\n", dev->devnum, iface_no, altno); - csep = NULL; + continue; } - fp = kzalloc(sizeof(*fp), GFP_KERNEL); + fp = kmalloc(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; @@ -2647,7 +2599,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 ? csep[3] : 0; + fp->attributes = csep[3]; /* some quirks for attributes here */ @@ -2685,7 +2637,7 @@ static int parse_audio_endpoints(struct snd_usb_audio *chip, int iface_no) continue; } - snd_printdd(KERN_INFO "%d:%u:%d: add audio endpoint 0x%x\n", dev->devnum, iface_no, altno, fp->endpoint); + snd_printdd(KERN_INFO "%d:%u:%d: add audio endpoint 0x%x\n", dev->devnum, iface_no, i, fp->endpoint); err = add_audio_endpoint(chip, stream, fp); if (err < 0) { kfree(fp->rate_table); @@ -2979,7 +2931,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] != USB_DT_CS_INTERFACE || + if (alts->extralen != 11 || alts->extra[1] != CS_AUDIO_INTERFACE || altsd->bNumEndpoints != 1) return -ENXIO; @@ -3093,71 +3045,6 @@ 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 - */ -#define AUDIOPHILE_SET 0x01 /* if set, parse device_setup */ -#define AUDIOPHILE_SET_DTS 0x02 /* if set, enable DTS Digital Output */ -#define AUDIOPHILE_SET_96K 0x04 /* 48-96KHz rate if set, 8-48KHz otherwise */ -#define AUDIOPHILE_SET_24B 0x08 /* 24bits sample if set, 16bits otherwise */ -#define AUDIOPHILE_SET_DI 0x10 /* if set, enable Digital Input */ -#define AUDIOPHILE_SET_MASK 0x1F /* bit mask for setup value */ -#define AUDIOPHILE_SET_24B_48K_DI 0x19 /* value for 24bits+48KHz+Digital Input */ -#define AUDIOPHILE_SET_24B_48K_NOTDI 0x09 /* value for 24bits+48KHz+No Digital Input */ -#define AUDIOPHILE_SET_16B_48K_DI 0x11 /* value for 16bits+48KHz+Digital Input */ -#define AUDIOPHILE_SET_16B_48K_NOTDI 0x01 /* value for 16bits+48KHz+No Digital Input */ - -static int audiophile_skip_setting_quirk(struct snd_usb_audio *chip, - int iface, int altno) -{ - if (device_setup[chip->index] & AUDIOPHILE_SET) { - if ((device_setup[chip->index] & AUDIOPHILE_SET_DTS) - && altno != 6) - return 1; /* skip this altsetting */ - if ((device_setup[chip->index] & AUDIOPHILE_SET_96K) - && altno != 1) - return 1; /* skip this altsetting */ - if ((device_setup[chip->index] & AUDIOPHILE_SET_MASK) == - AUDIOPHILE_SET_24B_48K_DI && altno != 2) - return 1; /* skip this altsetting */ - if ((device_setup[chip->index] & AUDIOPHILE_SET_MASK) == - AUDIOPHILE_SET_24B_48K_NOTDI && altno != 3) - return 1; /* skip this altsetting */ - if ((device_setup[chip->index] & AUDIOPHILE_SET_MASK) == - AUDIOPHILE_SET_16B_48K_DI && altno != 4) - return 1; /* skip this altsetting */ - if ((device_setup[chip->index] & AUDIOPHILE_SET_MASK) == - AUDIOPHILE_SET_16B_48K_NOTDI && altno != 5) - return 1; /* skip this altsetting */ - } - return 0; /* keep this altsetting */ -} /* * audio-interface quirks @@ -3183,7 +3070,7 @@ static int snd_usb_create_quirk(struct snd_usb_audio *chip, [QUIRK_MIDI_NOVATION] = snd_usb_create_midi_interface, [QUIRK_MIDI_RAW] = snd_usb_create_midi_interface, [QUIRK_MIDI_EMAGIC] = snd_usb_create_midi_interface, - [QUIRK_MIDI_CME] = snd_usb_create_midi_interface, + [QUIRK_MIDI_MIDITECH] = snd_usb_create_midi_interface, [QUIRK_AUDIO_STANDARD_INTERFACE] = create_standard_audio_quirk, [QUIRK_AUDIO_FIXED_ENDPOINT] = create_fixed_stream_quirk, [QUIRK_AUDIO_EDIROL_UA700_UA25] = create_ua700_ua25_quirk, @@ -3222,9 +3109,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, proc_audio_usbbus_read); + snd_info_set_text_ops(entry, chip, 1024, proc_audio_usbbus_read); if (! snd_card_proc_new(chip->card, "usbid", &entry)) - snd_info_set_text_ops(entry, chip, proc_audio_usbid_read); + snd_info_set_text_ops(entry, chip, 1024, proc_audio_usbid_read); } /* @@ -3389,19 +3276,13 @@ 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 */ /* check whether it's already registered */ chip = NULL; - mutex_lock(®ister_mutex); + down(®ister_mutex); for (i = 0; i < SNDRV_CARDS; i++) { if (usb_chip[i] && usb_chip[i]->dev == dev) { if (usb_chip[i]->shutdown) { @@ -3454,13 +3335,13 @@ static void *snd_usb_audio_probe(struct usb_device *dev, usb_chip[chip->index] = chip; chip->num_interfaces++; - mutex_unlock(®ister_mutex); + up(®ister_mutex); return chip; __error: if (chip && !chip->num_interfaces) snd_card_free(chip->card); - mutex_unlock(®ister_mutex); + up(®ister_mutex); __err_val: return NULL; } @@ -3480,7 +3361,7 @@ static void snd_usb_audio_disconnect(struct usb_device *dev, void *ptr) chip = ptr; card = chip->card; - mutex_lock(®ister_mutex); + down(®ister_mutex); chip->shutdown = 1; chip->num_interfaces--; if (chip->num_interfaces <= 0) { @@ -3498,10 +3379,10 @@ static void snd_usb_audio_disconnect(struct usb_device *dev, void *ptr) snd_usb_mixer_disconnect(p); } usb_chip[chip->index] = NULL; - mutex_unlock(®ister_mutex); + up(®ister_mutex); snd_card_free(card); } else { - mutex_unlock(®ister_mutex); + up(®ister_mutex); } } diff --git a/sound/usb/usbaudio.h b/sound/usb/usbaudio.h index 0f4b2b854..ecd724bfe 100644 --- a/sound/usb/usbaudio.h +++ b/sound/usb/usbaudio.h @@ -30,6 +30,13 @@ #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 @@ -154,7 +161,7 @@ enum quirk_type { QUIRK_MIDI_NOVATION, QUIRK_MIDI_RAW, QUIRK_MIDI_EMAGIC, - QUIRK_MIDI_CME, + QUIRK_MIDI_MIDITECH, QUIRK_AUDIO_STANDARD_INTERFACE, QUIRK_AUDIO_FIXED_ENDPOINT, QUIRK_AUDIO_EDIROL_UA700_UA25, @@ -202,7 +209,7 @@ struct snd_usb_midi_endpoint_info { /* for QUIRK_MIDI_EMAGIC, data points to a snd_usb_midi_endpoint_info * structure (out_cables and in_cables only) */ -/* for QUIRK_MIDI_CME, data is NULL */ +/* for QUIRK_MIDI_MIDITECH, data is NULL */ /* */ diff --git a/sound/usb/usbmidi.c b/sound/usb/usbmidi.c index 5105b6b05..f15b021c3 100644 --- a/sound/usb/usbmidi.c +++ b/sound/usb/usbmidi.c @@ -48,7 +48,6 @@ #include #include #include -#include #include "usbaudio.h" @@ -872,10 +871,10 @@ static int snd_usbmidi_in_endpoint_create(struct snd_usb_midi* umidi, static unsigned int snd_usbmidi_count_bits(unsigned int x) { - unsigned int bits; + unsigned int bits = 0; - for (bits = 0; x; ++bits) - x &= x - 1; + for (; x; x >>= 1) + bits += x & 1; return bits; } @@ -1011,157 +1010,95 @@ 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 port_info { +static struct { u32 id; - 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) + int port; + const char *name_format; +} snd_usbmidi_port_names[] = { /* Roland UA-100 */ - CONTROL_PORT(0x0582, 0x0000, 2, "%s Control"), + { USB_ID(0x0582, 0x0000), 2, "%s Control" }, /* Roland SC-8850 */ - 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"), + { 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" }, /* Roland U-8 */ - EXTERNAL_PORT(0x0582, 0x0004, 0, "%s MIDI"), - CONTROL_PORT(0x0582, 0x0004, 1, "%s Control"), + { USB_ID(0x0582, 0x0004), 0, "%s MIDI" }, + { USB_ID(0x0582, 0x0004), 1, "%s Control" }, /* Roland SC-8820 */ - 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"), + { USB_ID(0x0582, 0x0007), 0, "%s Part A" }, + { USB_ID(0x0582, 0x0007), 1, "%s Part B" }, + { USB_ID(0x0582, 0x0007), 2, "%s MIDI" }, /* Roland SK-500 */ - 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"), + { USB_ID(0x0582, 0x000b), 0, "%s Part A" }, + { USB_ID(0x0582, 0x000b), 1, "%s Part B" }, + { USB_ID(0x0582, 0x000b), 2, "%s MIDI" }, /* Roland SC-D70 */ - 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"), + { USB_ID(0x0582, 0x000c), 0, "%s Part A" }, + { USB_ID(0x0582, 0x000c), 1, "%s Part B" }, + { USB_ID(0x0582, 0x000c), 2, "%s MIDI" }, /* Edirol UM-880 */ - CONTROL_PORT(0x0582, 0x0014, 8, "%s Control"), + { USB_ID(0x0582, 0x0014), 8, "%s Control" }, /* Edirol SD-90 */ - 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"), + { 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" }, /* Edirol UM-550 */ - CONTROL_PORT(0x0582, 0x0023, 5, "%s Control"), + { USB_ID(0x0582, 0x0023), 5, "%s Control" }, /* Edirol SD-20 */ - 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"), + { USB_ID(0x0582, 0x0027), 0, "%s Part A" }, + { USB_ID(0x0582, 0x0027), 1, "%s Part B" }, + { USB_ID(0x0582, 0x0027), 2, "%s MIDI" }, /* Edirol SD-80 */ - 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"), + { 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" }, /* Edirol UA-700 */ - EXTERNAL_PORT(0x0582, 0x002b, 0, "%s MIDI"), - CONTROL_PORT(0x0582, 0x002b, 1, "%s Control"), + { USB_ID(0x0582, 0x002b), 0, "%s MIDI" }, + { USB_ID(0x0582, 0x002b), 1, "%s Control" }, /* Roland VariOS */ - EXTERNAL_PORT(0x0582, 0x002f, 0, "%s MIDI"), - EXTERNAL_PORT(0x0582, 0x002f, 1, "%s External MIDI"), - EXTERNAL_PORT(0x0582, 0x002f, 2, "%s Sync"), + { USB_ID(0x0582, 0x002f), 0, "%s MIDI" }, + { USB_ID(0x0582, 0x002f), 1, "%s External MIDI" }, + { USB_ID(0x0582, 0x002f), 2, "%s Sync" }, /* Edirol PCR */ - EXTERNAL_PORT(0x0582, 0x0033, 0, "%s MIDI"), - EXTERNAL_PORT(0x0582, 0x0033, 1, "%s 1"), - EXTERNAL_PORT(0x0582, 0x0033, 2, "%s 2"), + { USB_ID(0x0582, 0x0033), 0, "%s MIDI" }, + { USB_ID(0x0582, 0x0033), 1, "%s 1" }, + { USB_ID(0x0582, 0x0033), 2, "%s 2" }, /* BOSS GS-10 */ - EXTERNAL_PORT(0x0582, 0x003b, 0, "%s MIDI"), - CONTROL_PORT(0x0582, 0x003b, 1, "%s Control"), + { USB_ID(0x0582, 0x003b), 0, "%s MIDI" }, + { USB_ID(0x0582, 0x003b), 1, "%s Control" }, /* Edirol UA-1000 */ - EXTERNAL_PORT(0x0582, 0x0044, 0, "%s MIDI"), - CONTROL_PORT(0x0582, 0x0044, 1, "%s Control"), + { USB_ID(0x0582, 0x0044), 0, "%s MIDI" }, + { USB_ID(0x0582, 0x0044), 1, "%s Control" }, /* Edirol UR-80 */ - EXTERNAL_PORT(0x0582, 0x0048, 0, "%s MIDI"), - EXTERNAL_PORT(0x0582, 0x0048, 1, "%s 1"), - EXTERNAL_PORT(0x0582, 0x0048, 2, "%s 2"), + { USB_ID(0x0582, 0x0048), 0, "%s MIDI" }, + { USB_ID(0x0582, 0x0048), 1, "%s 1" }, + { USB_ID(0x0582, 0x0048), 2, "%s 2" }, /* Edirol PCR-A */ - EXTERNAL_PORT(0x0582, 0x004d, 0, "%s MIDI"), - EXTERNAL_PORT(0x0582, 0x004d, 1, "%s 1"), - EXTERNAL_PORT(0x0582, 0x004d, 2, "%s 2"), - /* Edirol UM-3EX */ - CONTROL_PORT(0x0582, 0x009a, 3, "%s Control"), + { USB_ID(0x0582, 0x004d), 0, "%s MIDI" }, + { USB_ID(0x0582, 0x004d), 1, "%s 1" }, + { USB_ID(0x0582, 0x004d), 2, "%s 2" }, /* M-Audio MidiSport 8x8 */ - CONTROL_PORT(0x0763, 0x1031, 8, "%s Control"), - CONTROL_PORT(0x0763, 0x1033, 8, "%s Control"), + { USB_ID(0x0763, 0x1031), 8, "%s Control" }, + { USB_ID(0x0763, 0x1033), 8, "%s Control" }, /* MOTU Fastlane */ - EXTERNAL_PORT(0x07fd, 0x0001, 0, "%s MIDI A"), - EXTERNAL_PORT(0x07fd, 0x0001, 1, "%s MIDI B"), + { USB_ID(0x07fd, 0x0001), 0, "%s MIDI A" }, + { USB_ID(0x07fd, 0x0001), 1, "%s MIDI B" }, /* Emagic Unitor8/AMT8/MT4 */ - EXTERNAL_PORT(0x086a, 0x0001, 8, "%s Broadcast"), - EXTERNAL_PORT(0x086a, 0x0002, 8, "%s Broadcast"), - EXTERNAL_PORT(0x086a, 0x0003, 4, "%s Broadcast"), + { USB_ID(0x086a, 0x0001), 8, "%s Broadcast" }, + { USB_ID(0x086a, 0x0002), 8, "%s Broadcast" }, + { USB_ID(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) { - struct port_info *port_info; + int i; const char *name_format; struct snd_rawmidi_substream *substream = snd_usbmidi_find_substream(umidi, stream, number); @@ -1171,8 +1108,14 @@ static void snd_usbmidi_init_substream(struct snd_usb_midi* umidi, } /* TODO: read port name from jack descriptor */ - port_info = find_port_info(umidi, number); - name_format = port_info ? port_info->name : "%s MIDI %d"; + 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; + } + } snprintf(substream->name, sizeof(substream->name), name_format, umidi->chip->card->shortname, number + 1); @@ -1413,7 +1356,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] == USB_DT_CS_INTERFACE) { + if (cs_desc[1] == CS_AUDIO_INTERFACE) { if (cs_desc[2] == MIDI_IN_JACK) endpoint->in_cables = (endpoint->in_cables << 1) | 1; else if (cs_desc[2] == MIDI_OUT_JACK) @@ -1512,10 +1455,6 @@ 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) { @@ -1531,7 +1470,6 @@ 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); @@ -1636,7 +1574,7 @@ int snd_usb_create_midi_interface(struct snd_usb_audio* chip, sizeof(struct snd_usb_midi_endpoint_info)); err = snd_usbmidi_detect_endpoints(umidi, &endpoints[0], 1); break; - case QUIRK_MIDI_CME: + case QUIRK_MIDI_MIDITECH: err = snd_usbmidi_detect_per_port_endpoints(umidi, endpoints); break; default: diff --git a/sound/usb/usbmixer.c b/sound/usb/usbmixer.c index 491e975a0..0bfea7237 100644 --- a/sound/usb/usbmixer.c +++ b/sound/usb/usbmixer.c @@ -46,27 +46,6 @@ /* 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; @@ -76,7 +55,11 @@ struct usb_mixer_interface { struct usb_mixer_elem_info **id_elems; /* array[256], indexed by unit id */ /* Sound Blaster remote control stuff */ - const struct rc_config *rc_cfg; + enum { + RC_NONE, + RC_EXTIGY, + RC_AUDIGY2NX, + } rc_type; unsigned long rc_hwdep_open; u32 rc_code; wait_queue_head_t rc_waitq; @@ -323,8 +306,8 @@ static int get_relative_value(struct usb_mixer_elem_info *cval, int val) cval->res = 1; if (val < cval->min) return 0; - else if (val >= cval->max) - return (cval->max - cval->min + cval->res - 1) / cval->res; + else if (val > cval->max) + return (cval->max - cval->min) / cval->res; else return (val - cval->min) / cval->res; } @@ -687,36 +670,6 @@ static int get_min_max(struct usb_mixer_elem_info *cval, int default_min) } if (cval->res == 0) cval->res = 1; - - /* Additional checks for the proper resolution - * - * Some devices report smaller resolutions than actually - * reacting. They don't return errors but simply clip - * to the lower aligned value. - */ - if (cval->min + cval->res < cval->max) { - int last_valid_res = cval->res; - int saved, test, check; - get_cur_mix_value(cval, minchn, &saved); - for (;;) { - test = saved; - if (test < cval->max) - test += cval->res; - else - test -= cval->res; - if (test < cval->min || test > cval->max || - set_cur_mix_value(cval, minchn, test) || - get_cur_mix_value(cval, minchn, &check)) { - cval->res = last_valid_res; - break; - } - if (test == check) - break; - cval->res *= 2; - } - set_cur_mix_value(cval, minchn, saved); - } - cval->initialized = 1; } return 0; @@ -742,8 +695,7 @@ static int mixer_ctl_feature_info(struct snd_kcontrol *kcontrol, struct snd_ctl_ if (! cval->initialized) get_min_max(cval, 0); uinfo->value.integer.min = 0; - uinfo->value.integer.max = - (cval->max - cval->min + cval->res - 1) / cval->res; + uinfo->value.integer.max = (cval->max - cval->min) / cval->res; } return 0; } @@ -1516,7 +1468,6 @@ static int parse_audio_selector_unit(struct mixer_build *state, int unitid, unsi kctl = snd_ctl_new1(&mixer_selectunit_ctl, cval); if (! kctl) { snd_printk(KERN_ERR "cannot malloc kcontrol\n"); - kfree(namelist); kfree(cval); return -ENOMEM; } @@ -1664,7 +1615,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_cfg) + if (mixer->rc_type == RC_NONE) return; /* unit ids specific to Extigy/Audigy 2 NX: */ switch (unitid) { @@ -1749,19 +1700,20 @@ static void snd_usb_soundblaster_remote_complete(struct urb *urb, struct pt_regs *regs) { struct usb_mixer_interface *mixer = urb->context; - const struct rc_config *rc = mixer->rc_cfg; + /* + * 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; u32 code; - if (urb->status < 0 || urb->actual_length < rc->packet_length) + if (urb->status < 0 || urb->actual_length <= offset) return; - - code = mixer->rc_buffer[rc->offset]; - if (rc->length == 2) - code |= mixer->rc_buffer[rc->offset + 1] << 8; - + code = mixer->rc_buffer[offset]; /* the Mute button actually changes the mixer control */ - if (code == rc->mute_code) - snd_usb_mixer_notify_id(mixer, rc->mute_mixer_id); + if (code == 13) + snd_usb_mixer_notify_id(mixer, 18); mixer->rc_code = code; wmb(); wake_up(&mixer->rc_waitq); @@ -1817,17 +1769,21 @@ 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, i; + int err, len; - 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)) + 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: 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) @@ -2010,7 +1966,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, + snd_info_set_text_ops(entry, mixer, 1024, snd_audigy2nx_proc_read); } diff --git a/sound/usb/usbmixer_maps.c b/sound/usb/usbmixer_maps.c index 37accb686..c1264434e 100644 --- a/sound/usb/usbmixer_maps.c +++ b/sound/usb/usbmixer_maps.c @@ -195,22 +195,6 @@ static struct usbmix_name_map linex_map[] = { { 0 } /* terminator */ }; -static struct usbmix_name_map maya44_map[] = { - /* 1: IT line */ - { 2, "Line Playback" }, /* FU */ - /* 3: IT line */ - { 4, "Line Playback" }, /* FU */ - /* 5: IT pcm playback */ - /* 6: MU */ - { 7, "Master Playback" }, /* FU */ - /* 8: OT speaker */ - /* 9: IT line */ - { 10, "Line Capture" }, /* FU */ - /* 11: MU */ - /* 12: OT pcm capture */ - { } -}; - /* Section "justlink_map" below added by James Courtier-Dutton * sourced from Maplin Electronics (http://www.maplin.co.uk), part number A56AK * Part has 2 connectors that act as a single output. (TOSLINK Optical for digital out, and 3.5mm Jack for Analogue out.) @@ -268,10 +252,6 @@ static struct usbmix_ctl_map usbmix_ctl_maps[] = { .map = linex_map, .ignore_ctl_error = 1, }, - { - .id = USB_ID(0x0a92, 0x0091), - .map = maya44_map, - }, { .id = USB_ID(0x0c45, 0x1158), .map = justlink_map, diff --git a/sound/usb/usbquirks.h b/sound/usb/usbquirks.h index 9351846d7..6190ada00 100644 --- a/sound/usb/usbquirks.h +++ b/sound/usb/usbquirks.h @@ -82,7 +82,6 @@ YAMAHA_DEVICE(0x1012, "TYROS"), YAMAHA_DEVICE(0x1013, "PF-500"), YAMAHA_DEVICE(0x1014, "S90"), YAMAHA_DEVICE(0x1015, "MOTIF-R"), -YAMAHA_DEVICE(0x1016, "MDP-5"), YAMAHA_DEVICE(0x1017, "CVP-204"), YAMAHA_DEVICE(0x1018, "CVP-206"), YAMAHA_DEVICE(0x1019, "CVP-208"), @@ -91,7 +90,6 @@ YAMAHA_DEVICE(0x101b, "PSR-1100"), YAMAHA_DEVICE(0x101c, "PSR-2100"), YAMAHA_DEVICE(0x101d, "CLP-175"), YAMAHA_DEVICE(0x101e, "PSR-K1"), -YAMAHA_DEVICE(0x101f, "EZ-J24"), YAMAHA_DEVICE(0x1020, "EZ-250i"), YAMAHA_DEVICE(0x1021, "MOTIF ES 6"), YAMAHA_DEVICE(0x1022, "MOTIF ES 7"), @@ -296,8 +294,7 @@ YAMAHA_DEVICE(0x7010, "UB99"), } }, { - /* Has ID 0x0099 when not in "Advanced Driver" mode. - * The UM-2EX has only one input, but we cannot detect this. */ + /* a later revision uses ID 0x0099 */ USB_DEVICE(0x0582, 0x0005), .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { .vendor_name = "EDIROL", @@ -388,7 +385,7 @@ YAMAHA_DEVICE(0x7010, "UB99"), } }, { - /* has ID 0x009d when not in "Advanced Driver" mode */ + /* a later revision uses ID 0x009d */ USB_DEVICE(0x0582, 0x0009), .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { .vendor_name = "EDIROL", @@ -1093,53 +1090,6 @@ YAMAHA_DEVICE(0x7010, "UB99"), } } }, - /* TODO: add Edirol UA-101 support */ -{ - /* has ID 0x0081 when not in "Advanced Driver" mode */ - USB_DEVICE(0x0582, 0x0080), - .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { - .vendor_name = "Roland", - .product_name = "G-70", - .ifnum = 0, - .type = QUIRK_MIDI_FIXED_ENDPOINT, - .data = & (const struct snd_usb_midi_endpoint_info) { - .out_cables = 0x0001, - .in_cables = 0x0001 - } - } -}, - /* TODO: add Roland V-SYNTH XT support */ - /* TODO: add BOSS GT-PRO support */ -{ - /* has ID 0x008c when not in "Advanced Driver" mode */ - USB_DEVICE(0x0582, 0x008b), - .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { - .vendor_name = "EDIROL", - .product_name = "PC-50", - .ifnum = 0, - .type = QUIRK_MIDI_FIXED_ENDPOINT, - .data = & (const struct snd_usb_midi_endpoint_info) { - .out_cables = 0x0001, - .in_cables = 0x0001 - } - } -}, - /* TODO: add Edirol PC-80 support */ - /* TODO: add Edirol UA-1EX support */ -{ - USB_DEVICE(0x0582, 0x009a), - .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { - .vendor_name = "EDIROL", - .product_name = "UM-3EX", - .ifnum = 0, - .type = QUIRK_MIDI_FIXED_ENDPOINT, - .data = & (const struct snd_usb_midi_endpoint_info) { - .out_cables = 0x000f, - .in_cables = 0x000f - } - } -}, - /* TODO: add Edirol MD-P1 support */ /* Guillemot devices */ { @@ -1161,6 +1111,15 @@ YAMAHA_DEVICE(0x7010, "UB99"), } } }, + /* TODO: add Edirol UA-101 support */ + /* TODO: add Roland G-70 support */ + /* TODO: add Roland V-SYNTH XT support */ + /* TODO: add BOSS GT-PRO support */ + /* TODO: add Edirol PC-50 support */ + /* TODO: add Edirol PC-80 support */ + /* TODO: add Edirol UA-1EX support */ + /* TODO: add Edirol UM-3 support */ + /* TODO: add Edirol MD-P1 support */ /* Midiman/M-Audio devices */ { @@ -1408,27 +1367,6 @@ YAMAHA_DEVICE(0x7010, "UB99"), } }, -/* Casio devices */ -{ - USB_DEVICE(0x07cf, 0x6801), - .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { - .vendor_name = "Casio", - .product_name = "PL-40R", - .ifnum = 0, - .type = QUIRK_MIDI_YAMAHA - } -}, -{ - /* this ID is used by several devices without a product ID */ - USB_DEVICE(0x07cf, 0x6802), - .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { - .vendor_name = "Casio", - .product_name = "Keyboard", - .ifnum = 0, - .type = QUIRK_MIDI_YAMAHA - } -}, - /* Mark of the Unicorn devices */ { /* thanks to Robert A. Lerche */ @@ -1530,24 +1468,6 @@ YAMAHA_DEVICE(0x7010, "UB99"), .type = QUIRK_MIDI_STANDARD_INTERFACE } }, -{ - USB_DEVICE_VENDOR_SPEC(0x0ccd, 0x0014), - .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { - .vendor_name = "TerraTec", - .product_name = "PHASE 26", - .ifnum = 3, - .type = QUIRK_MIDI_STANDARD_INTERFACE - } -}, -{ - USB_DEVICE(0x0ccd, 0x0035), - .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { - .vendor_name = "Miditech", - .product_name = "Play'n Roll", - .ifnum = 0, - .type = QUIRK_MIDI_CME - } -}, /* Novation EMS devices */ { @@ -1578,24 +1498,22 @@ YAMAHA_DEVICE(0x7010, "UB99"), } }, -/* Miditech devices */ { USB_DEVICE(0x4752, 0x0011), .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { .vendor_name = "Miditech", .product_name = "Midistart-2", .ifnum = 0, - .type = QUIRK_MIDI_CME + .type = QUIRK_MIDI_MIDITECH } }, - -/* Central Music devices */ { - /* this ID used by both Miditech MidiStudio-2 and CME UF-x */ USB_DEVICE(0x7104, 0x2202), .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { + .vendor_name = "Miditech", + .product_name = "MidiStudio-2", .ifnum = 0, - .type = QUIRK_MIDI_CME + .type = QUIRK_MIDI_MIDITECH } }, diff --git a/sound/usb/usx2y/usbusx2y.c b/sound/usb/usx2y/usbusx2y.c index cfec38d78..e0abb56bb 100644 --- a/sound/usb/usx2y/usbusx2y.c +++ b/sound/usb/usx2y/usbusx2y.c @@ -351,7 +351,7 @@ static struct snd_card *usX2Y_create_card(struct usb_device *device) usX2Y(card)->chip.dev = device; usX2Y(card)->chip.card = card; init_waitqueue_head(&usX2Y(card)->prepare_wait_queue); - mutex_init(&usX2Y(card)->prepare_mutex); + init_MUTEX (&usX2Y(card)->prepare_mutex); INIT_LIST_HEAD(&usX2Y(card)->chip.midi_list); strcpy(card->driver, "USB "NAME_ALLCAPS""); sprintf(card->shortname, "TASCAM "NAME_ALLCAPS""); diff --git a/sound/usb/usx2y/usbusx2y.h b/sound/usb/usx2y/usbusx2y.h index 456b5fdbc..435c1feda 100644 --- a/sound/usb/usx2y/usbusx2y.h +++ b/sound/usb/usx2y/usbusx2y.h @@ -34,7 +34,7 @@ struct usX2Ydev { unsigned int rate, format; int chip_status; - struct mutex prepare_mutex; + struct semaphore prepare_mutex; struct us428ctls_sharedmem *us428ctls_sharedmem; int wait_iso_frame; wait_queue_head_t us428ctls_wait_queue_head; diff --git a/sound/usb/usx2y/usbusx2yaudio.c b/sound/usb/usx2y/usbusx2yaudio.c index 8d2f26db5..a6bbc7a63 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(urb->start_frame == usX2Y->wait_iso_frame)) + if (likely((0xFFFF & urb->start_frame) == usX2Y->wait_iso_frame)) subs->completed_urb = urb; else { usX2Y_error_sequence(usX2Y, subs, urb); @@ -335,9 +335,13 @@ 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)) - usX2Y->wait_iso_frame += nr_of_packs(); - else { + 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 { snd_printdd("\n"); usX2Y_clients_stop(usX2Y); } @@ -491,6 +495,7 @@ 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); @@ -511,9 +516,10 @@ 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 (i == 0) + } else { + if (0 > usX2Y->wait_iso_frame) usX2Y->wait_iso_frame = urb->start_frame; + } urb->transfer_flags = 0; } else { atomic_set(&subs->state, state_STARTING1); @@ -805,7 +811,7 @@ static int snd_usX2Y_pcm_hw_free(struct snd_pcm_substream *substream) { struct snd_pcm_runtime *runtime = substream->runtime; struct snd_usX2Y_substream *subs = runtime->private_data; - mutex_lock(&subs->usX2Y->prepare_mutex); + down(&subs->usX2Y->prepare_mutex); snd_printdd("snd_usX2Y_hw_free(%p)\n", substream); if (SNDRV_PCM_STREAM_PLAYBACK == substream->stream) { @@ -826,7 +832,7 @@ static int snd_usX2Y_pcm_hw_free(struct snd_pcm_substream *substream) usX2Y_urbs_release(subs); } } - mutex_unlock(&subs->usX2Y->prepare_mutex); + up(&subs->usX2Y->prepare_mutex); return snd_pcm_lib_free_pages(substream); } /* @@ -843,7 +849,7 @@ static int snd_usX2Y_pcm_prepare(struct snd_pcm_substream *substream) int err = 0; snd_printdd("snd_usX2Y_pcm_prepare(%p)\n", substream); - mutex_lock(&usX2Y->prepare_mutex); + down(&usX2Y->prepare_mutex); usX2Y_subs_prepare(subs); // Start hardware streams // SyncStream first.... @@ -863,7 +869,7 @@ static int snd_usX2Y_pcm_prepare(struct snd_pcm_substream *substream) err = usX2Y_urbs_start(subs); up_prepare_mutex: - mutex_unlock(&usX2Y->prepare_mutex); + up(&usX2Y->prepare_mutex); return err; } diff --git a/sound/usb/usx2y/usx2yhwdeppcm.c b/sound/usb/usx2y/usx2yhwdeppcm.c index 3bda17de2..796a7dcef 100644 --- a/sound/usb/usx2y/usx2yhwdeppcm.c +++ b/sound/usb/usx2y/usx2yhwdeppcm.c @@ -243,7 +243,7 @@ static void i_usX2Y_usbpcm_urb_complete(struct urb *urb, struct pt_regs *regs) usX2Y_error_urb_status(usX2Y, subs, urb); return; } - if (likely(urb->start_frame == usX2Y->wait_iso_frame)) + if (likely((0xFFFF & urb->start_frame) == usX2Y->wait_iso_frame)) subs->completed_urb = urb; else { usX2Y_error_sequence(usX2Y, subs, urb); @@ -256,9 +256,13 @@ 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)) - usX2Y->wait_iso_frame += nr_of_packs(); - else { + 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 { snd_printdd("\n"); usX2Y_clients_stop(usX2Y); } @@ -362,7 +366,7 @@ static int snd_usX2Y_usbpcm_hw_free(struct snd_pcm_substream *substream) 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]; - mutex_lock(&subs->usX2Y->prepare_mutex); + down(&subs->usX2Y->prepare_mutex); snd_printdd("snd_usX2Y_usbpcm_hw_free(%p)\n", substream); if (SNDRV_PCM_STREAM_PLAYBACK == substream->stream) { @@ -391,7 +395,7 @@ static int snd_usX2Y_usbpcm_hw_free(struct snd_pcm_substream *substream) usX2Y_usbpcm_urbs_release(cap_subs2); } } - mutex_unlock(&subs->usX2Y->prepare_mutex); + up(&subs->usX2Y->prepare_mutex); return snd_pcm_lib_free_pages(substream); } @@ -400,7 +404,7 @@ static void usX2Y_usbpcm_subs_startup(struct snd_usX2Y_substream *subs) struct usX2Ydev * usX2Y = subs->usX2Y; usX2Y->prepare_subs = subs; subs->urb[0]->start_frame = -1; - smp_wmb(); // Make sure above modifications are seen by i_usX2Y_subs_startup() + smp_wmb(); // Make shure above modifications are seen by i_usX2Y_subs_startup() usX2Y_urbs_set_complete(usX2Y, i_usX2Y_usbpcm_subs_startup); } @@ -429,6 +433,7 @@ static int usX2Y_usbpcm_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_usbpcm_subs_startup(subs); @@ -454,7 +459,7 @@ static int usX2Y_usbpcm_urbs_start(struct snd_usX2Y_substream *subs) goto cleanup; } else { snd_printdd("%i\n", urb->start_frame); - if (u == 0) + if (0 > usX2Y->wait_iso_frame) usX2Y->wait_iso_frame = urb->start_frame; } urb->transfer_flags = 0; @@ -498,7 +503,7 @@ static int snd_usX2Y_usbpcm_prepare(struct snd_pcm_substream *substream) memset(usX2Y->hwdep_pcm_shm, 0, sizeof(struct snd_usX2Y_hwdep_pcm_shm)); } - mutex_lock(&usX2Y->prepare_mutex); + down(&usX2Y->prepare_mutex); usX2Y_subs_prepare(subs); // Start hardware streams // SyncStream first.... @@ -539,7 +544,7 @@ static int snd_usX2Y_usbpcm_prepare(struct snd_pcm_substream *substream) usX2Y->hwdep_pcm_shm->capture_iso_start = -1; up_prepare_mutex: - mutex_unlock(&usX2Y->prepare_mutex); + up(&usX2Y->prepare_mutex); return err; } @@ -616,7 +621,7 @@ static int usX2Y_pcms_lock_check(struct snd_card *card) if (dev->type != SNDRV_DEV_PCM) continue; pcm = dev->device_data; - mutex_lock(&pcm->open_mutex); + down(&pcm->open_mutex); } list_for_each(list, &card->devices) { int s; @@ -627,7 +632,7 @@ static int usX2Y_pcms_lock_check(struct snd_card *card) for (s = 0; s < 2; ++s) { struct snd_pcm_substream *substream; substream = pcm->streams[s].substream; - if (substream && SUBSTREAM_BUSY(substream)) + if (substream && substream->ffile != NULL) err = -EBUSY; } } @@ -645,7 +650,7 @@ static void usX2Y_pcms_unlock(struct snd_card *card) if (dev->type != SNDRV_DEV_PCM) continue; pcm = dev->device_data; - mutex_unlock(&pcm->open_mutex); + up(&pcm->open_mutex); } } diff --git a/usr/Makefile b/usr/Makefile index 5b31c0b61..e2129cb57 100644 --- a/usr/Makefile +++ b/usr/Makefile @@ -1,50 +1,65 @@ -# -# kbuild file for usr/ - including initramfs image -# -klibcdirs:; - -# Generate builtin.o based on initramfs_data.o obj-y := initramfs_data.o +hostprogs-y := gen_init_cpio + +clean-files := initramfs_data.cpio.gz initramfs_list + # initramfs_data.o contains the initramfs_data.cpio.gz image. # The image is included using .incbin, a dependency which is not # tracked automatically. $(obj)/initramfs_data.o: $(obj)/initramfs_data.cpio.gz FORCE -##### -# Generate the initramfs cpio archive - -hostprogs-y := gen_init_cpio -initramfs := $(CONFIG_SHELL) $(srctree)/scripts/gen_initramfs_list.sh -ramfs-input := $(if $(filter-out "",$(CONFIG_INITRAMFS_SOURCE)), \ - $(CONFIG_INITRAMFS_SOURCE),-d) -ramfs-args := \ - $(if $(CONFIG_INITRAMFS_ROOT_UID), -u $(CONFIG_INITRAMFS_ROOT_UID)) \ - $(if $(CONFIG_INITRAMFS_ROOT_GID), -g $(CONFIG_INITRAMFS_ROOT_GID)) - -# .initramfs_data.cpio.gz.d is used to identify all files included -# in initramfs and to detect if any files are added/removed. -# Removed files are identified by directory timestamp being updated -# The dependency list is generated by gen_initramfs.sh -l -ifneq ($(wildcard $(obj)/.initramfs_data.cpio.gz.d),) - include $(obj)/.initramfs_data.cpio.gz.d +ifdef CONFIG_INITRAMFS_ROOT_UID +gen_initramfs_args += -u $(CONFIG_INITRAMFS_ROOT_UID) +endif + +ifdef CONFIG_INITRAMFS_ROOT_GID +gen_initramfs_args += -g $(CONFIG_INITRAMFS_ROOT_GID) +endif + +# The $(shell echo $(CONFIG_INITRAMFS_SOURCE)) is to remove the +# gratuitous begin and end quotes from the Kconfig string type. +# Internal, escaped quotes in the Kconfig string will loose the +# escape and become active quotes. +quotefixed_initramfs_source := $(shell echo $(CONFIG_INITRAMFS_SOURCE)) + +filechk_initramfs_list = $(CONFIG_SHELL) \ + $(srctree)/scripts/gen_initramfs_list.sh $(gen_initramfs_args) $(quotefixed_initramfs_source) + +$(obj)/initramfs_list: $(obj)/Makefile FORCE + $(call filechk,initramfs_list) + +quiet_cmd_cpio = CPIO $@ + cmd_cpio = ./$< $(obj)/initramfs_list > $@ + + +# Check if the INITRAMFS_SOURCE is a cpio archive +ifneq (,$(findstring .cpio,$(quotefixed_initramfs_source))) + +# INITRAMFS_SOURCE has a cpio archive - verify that it's a single file +ifneq (1,$(words $(quotefixed_initramfs_source))) +$(error Only a single file may be specified in CONFIG_INITRAMFS_SOURCE (="$(quotefixed_initramfs_source)") when a cpio archive is directly specified.) +endif +# Now use the cpio archive directly +initramfs_data_cpio = $(quotefixed_initramfs_source) +targets += $(quotefixed_initramfs_source) + +else + +# INITRAMFS_SOURCE is not a cpio archive - create one +$(obj)/initramfs_data.cpio: $(obj)/gen_init_cpio \ + $(initramfs-y) $(obj)/initramfs_list FORCE + $(call if_changed,cpio) + +targets += initramfs_data.cpio +initramfs_data_cpio = $(obj)/initramfs_data.cpio + endif -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) There are changes in which files are included (added or deleted) -# 3) If gen_init_cpio are newer than initramfs_data.cpio.gz -# 4) arguments to gen_initramfs.sh changes -$(obj)/initramfs_data.cpio.gz: $(obj)/gen_init_cpio $(deps_initramfs) klibcdirs - $(Q)$(initramfs) -l $(ramfs-input) > $(obj)/.initramfs_data.cpio.gz.d - $(call if_changed,initfs) + +$(obj)/initramfs_data.cpio.gz: $(initramfs_data_cpio) FORCE + $(call if_changed,gzip) + +targets += initramfs_data.cpio.gz diff --git a/usr/gen_init_cpio.c b/usr/gen_init_cpio.c index 83acd6cc0..33dbcbf77 100644 --- a/usr/gen_init_cpio.c +++ b/usr/gen_init_cpio.c @@ -471,7 +471,6 @@ int main (int argc, char *argv[]) "ERROR: incorrect format, could not locate file type line %d: '%s'\n", line_nr, line); ec = -1; - break; } if ('\n' == *type) { @@ -507,8 +506,7 @@ int main (int argc, char *argv[]) line_nr, line); } } - if (ec == 0) - cpio_trailer(); + cpio_trailer(); exit(ec); } -- 2.47.0

parallel, serial */ unsigned int num_serial = dev->subsystem_device & 0xf; @@ -593,8 +594,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) >> - (board->reg_shift + 3); + maxnr = (pci_resource_len(priv->dev, bar) - board->first_offset) / + (8 << board->reg_shift); if (board->flags & FL_REGION_SZ_CAP && idx >= maxnr) return 1; @@ -621,7 +622,7 @@ pci_default_setup(struct serial_private *priv, struct pciserial_board *board, */ static struct pci_serial_quirk pci_serial_quirks[] = { /* - * AFAVLAB cards - these may be called via parport_serial + * AFAVLAB cards. * It is not clear whether this applies to all products. */ { @@ -753,7 +754,7 @@ static struct pci_serial_quirk pci_serial_quirks[] = { .exit = __devexit_p(sbs_exit), }, /* - * SIIG cards - these may be called via parport_serial + * SIIG cards. */ { .vendor = PCI_VENDOR_ID_SIIG, @@ -810,7 +811,7 @@ static struct pci_serial_quirk pci_serial_quirks[] = { .setup = pci_default_setup, }, /* - * Netmos cards - these may be called via parport_serial + * Netmos cards */ { .vendor = PCI_VENDOR_ID_NETMOS, @@ -935,7 +936,6 @@ 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,12 +1243,6 @@ 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, @@ -2345,13 +2339,6 @@ 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 632f62d6e..b79ed0665 100644 --- a/drivers/serial/8250_pnp.c +++ b/drivers/serial/8250_pnp.c @@ -323,10 +323,8 @@ static const struct pnp_device_id pnp_dev_table[] = { { "USR9180", 0 }, /* U.S. Robotics 56K Voice INT PnP*/ { "USR9190", 0 }, - /* Wacom tablets */ - { "WACF004", 0 }, + /* HP Compaq Tablet PC tc1100 Wacom tablet */ { "WACF005", 0 }, - { "WACF006", 0 }, /* Rockwell's (PORALiNK) 33600 INT PNP */ { "WCI0003", 0 }, /* Unkown PnP modems */ @@ -431,8 +429,6 @@ 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 48f0eef5f..74efa366e 100644 --- a/drivers/serial/Kconfig +++ b/drivers/serial/Kconfig @@ -11,7 +11,6 @@ menu "Serial drivers" config SERIAL_8250 tristate "8250/16550 and compatible serial support" depends on (BROKEN || !SPARC) - depends on !XEN_DISABLE_SERIAL select SERIAL_CORE ---help--- This selects whether you want to include the driver for the standard @@ -64,33 +63,6 @@ config SERIAL_8250_CONSOLE If unsure, say N. -config SERIAL_8250_GSC - tristate - depends on SERIAL_8250 && GSC - default SERIAL_8250 - -config SERIAL_8250_PCI - tristate "8250/16550 PCI device support" if EMBEDDED - depends on SERIAL_8250 && PCI - default SERIAL_8250 - help - This builds standard PCI serial support. You may be able to - disable this feature if you only need legacy serial support. - Saves about 9K. - -config SERIAL_8250_PNP - tristate "8250/16550 PNP device support" if EMBEDDED - depends on SERIAL_8250 && PNP - default SERIAL_8250 - help - This builds standard PNP serial support. You may be able to - disable this feature if you only need legacy serial support. - -config SERIAL_8250_HP300 - tristate - depends on SERIAL_8250 && HP300 - default SERIAL_8250 - config SERIAL_8250_CS tristate "8250/16550 PCMCIA device support" depends on PCMCIA && SERIAL_8250 @@ -105,6 +77,14 @@ config SERIAL_8250_CS If unsure, say N. +config SERIAL_8250_ACPI + bool "8250/16550 device discovery via ACPI namespace" + default y if IA64 + depends on ACPI && SERIAL_8250 + ---help--- + If you wish to enable serial port discovery via the ACPI + namespace, say Y here. If unsure, say N. + config SERIAL_8250_NR_UARTS int "Maximum number of 8250/16550 serial ports" depends on SERIAL_8250 @@ -301,22 +281,21 @@ config SERIAL_AMBA_PL011_CONSOLE kernel at boot time.) config SERIAL_AT91 - bool "AT91RM9200 / AT91SAM9261 serial port support" - depends on ARM && (ARCH_AT91RM9200 || ARCH_AT91SAM9261) + bool "AT91RM9200 serial port support" + depends on ARM && ARCH_AT91RM9200 select SERIAL_CORE help - This enables the driver for the on-chip UARTs of the Atmel - AT91RM9200 and AT91SAM926 processor. + This enables the driver for the on-chip UARTs of the AT91RM9200 + processor. config SERIAL_AT91_CONSOLE - bool "Support for console on AT91RM9200 / AT91SAM9261 serial port" + bool "Support for console on AT91RM9200 serial port" depends on SERIAL_AT91=y select SERIAL_CORE_CONSOLE help - 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). + 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). config SERIAL_AT91_TTYAT bool "Install as device ttyAT0-4 instead of ttyS0-4" @@ -355,24 +334,21 @@ config SERIAL_CLPS711X_CONSOLE kernel at boot time.) config SERIAL_S3C2410 - tristate "Samsung S3C2410/S3C2440/S3C2442/S3C2412 Serial port support" + tristate "Samsung S3C2410 Serial port support" depends on ARM && ARCH_S3C2410 select SERIAL_CORE help - Support for the on-chip UARTs on the Samsung S3C24XX series CPUs, + Support for the on-chip UARTs on the Samsung S3C2410X CPU, 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 S3C24XX on-board serial ports for use as + Allow selection of the S3C2410 on-board serial ports for use as an virtual console. Even if you say Y here, the currently visible virtual console @@ -606,13 +582,6 @@ config SERIAL_SUNSAB_CONSOLE on your Sparc system as the console, you can do so by answering Y to this option. -config SERIAL_SUNHV - bool "Sun4v Hypervisor Console support" - depends on SPARC64 - help - This driver supports the console device found on SUN4V Sparc - systems. Say Y if you want to be able to use this device. - config SERIAL_IP22_ZILOG tristate "IP22 Zilog8530 serial support" depends on SGI_IP22 @@ -652,6 +621,22 @@ config SERIAL_SH_SCI_CONSOLE depends on SERIAL_SH_SCI=y select SERIAL_CORE_CONSOLE +config SERIAL_AU1X00 + bool "Enable Au1x00 UART Support" + depends on MIPS && SOC_AU1X00 + select SERIAL_CORE + help + If you have an Alchemy AU1X00 processor (MIPS based) and you want + to use serial ports, say Y. Otherwise, say N. + +config SERIAL_AU1X00_CONSOLE + bool "Enable Au1x00 serial console" + depends on SERIAL_AU1X00 + select SERIAL_CORE_CONSOLE + help + If you have an Alchemy AU1X00 processor (MIPS based) and you want + to use a console on a serial port, say Y. Otherwise, say N. + config SERIAL_CORE tristate @@ -875,7 +860,7 @@ config SERIAL_M32R_PLDSIO config SERIAL_TXX9 bool "TMPTX39XX/49XX SIO support" - depends HAS_TXX9_SERIAL + depends HAS_TXX9_SERIAL && BROKEN select SERIAL_CORE default y @@ -941,23 +926,4 @@ 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 927faee03..eaf8e01db 100644 --- a/drivers/serial/Makefile +++ b/drivers/serial/Makefile @@ -4,13 +4,16 @@ # $Id: Makefile,v 1.8 2002/07/21 21:32:30 rmk Exp $ # +serial-8250-y := +serial-8250-$(CONFIG_SERIAL_8250_ACPI) += 8250_acpi.o +serial-8250-$(CONFIG_PNP) += 8250_pnp.o +serial-8250-$(CONFIG_GSC) += 8250_gsc.o +serial-8250-$(CONFIG_PCI) += 8250_pci.o +serial-8250-$(CONFIG_HP300) += 8250_hp300.o + obj-$(CONFIG_SERIAL_CORE) += serial_core.o obj-$(CONFIG_SERIAL_21285) += 21285.o -obj-$(CONFIG_SERIAL_8250) += 8250.o -obj-$(CONFIG_SERIAL_8250_PNP) += 8250_pnp.o -obj-$(CONFIG_SERIAL_8250_GSC) += 8250_gsc.o -obj-$(CONFIG_SERIAL_8250_PCI) += 8250_pci.o -obj-$(CONFIG_SERIAL_8250_HP300) += 8250_hp300.o +obj-$(CONFIG_SERIAL_8250) += 8250.o $(serial-8250-y) obj-$(CONFIG_SERIAL_8250_CS) += serial_cs.o obj-$(CONFIG_SERIAL_8250_ACORN) += 8250_acorn.o obj-$(CONFIG_SERIAL_8250_CONSOLE) += 8250_early.o @@ -27,7 +30,6 @@ obj-$(CONFIG_SERIAL_PXA) += pxa.o obj-$(CONFIG_SERIAL_SA1100) += sa1100.o obj-$(CONFIG_SERIAL_S3C2410) += s3c2410.o obj-$(CONFIG_SERIAL_SUNCORE) += suncore.o -obj-$(CONFIG_SERIAL_SUNHV) += sunhv.o obj-$(CONFIG_SERIAL_SUNZILOG) += sunzilog.o obj-$(CONFIG_SERIAL_IP22_ZILOG) += ip22zilog.o obj-$(CONFIG_SERIAL_SUNSU) += sunsu.o @@ -39,6 +41,7 @@ obj-$(CONFIG_SERIAL_COLDFIRE) += mcfserial.o obj-$(CONFIG_V850E_UART) += v850e_uart.o obj-$(CONFIG_SERIAL_PMACZILOG) += pmac_zilog.o obj-$(CONFIG_SERIAL_LH7A40X) += serial_lh7a40x.o +obj-$(CONFIG_SERIAL_AU1X00) += au1x00_uart.o obj-$(CONFIG_SERIAL_DZ) += dz.o obj-$(CONFIG_SERIAL_SH_SCI) += sh-sci.o obj-$(CONFIG_SERIAL_SGI_L1_CONSOLE) += sn_console.o @@ -55,4 +58,3 @@ 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 7311d8487..321a3b3a5 100644 --- a/drivers/serial/amba-pl010.c +++ b/drivers/serial/amba-pl010.c @@ -31,6 +31,7 @@ * 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 @@ -50,8 +51,10 @@ #include #include +#include +#include -#define UART_NR 8 +#define UART_NR 2 #define SERIAL_AMBA_MAJOR 204 #define SERIAL_AMBA_MINOR 16 @@ -59,19 +62,47 @@ #define AMBA_ISR_PASS_LIMIT 256 +/* + * Access macros for the AMBA UARTs + */ +#define UART_GET_INT_STATUS(p) readb((p)->membase + UART010_IIR) +#define UART_PUT_ICR(p, c) writel((c), (p)->membase + UART010_ICR) +#define UART_GET_FR(p) readb((p)->membase + UART01x_FR) +#define UART_GET_CHAR(p) readb((p)->membase + UART01x_DR) +#define UART_PUT_CHAR(p, c) writel((c), (p)->membase + UART01x_DR) +#define UART_GET_RSR(p) readb((p)->membase + UART01x_RSR) +#define UART_GET_CR(p) readb((p)->membase + UART010_CR) +#define UART_PUT_CR(p,c) writel((c), (p)->membase + UART010_CR) +#define UART_GET_LCRL(p) readb((p)->membase + UART010_LCRL) +#define UART_PUT_LCRL(p,c) writel((c), (p)->membase + UART010_LCRL) +#define UART_GET_LCRM(p) readb((p)->membase + UART010_LCRM) +#define UART_PUT_LCRM(p,c) writel((c), (p)->membase + UART010_LCRM) +#define UART_GET_LCRH(p) readb((p)->membase + UART010_LCRH) +#define UART_PUT_LCRH(p,c) writel((c), (p)->membase + UART010_LCRH) #define UART_RX_DATA(s) (((s) & UART01x_FR_RXFE) == 0) #define UART_TX_READY(s) (((s) & UART01x_FR_TXFF) == 0) +#define UART_TX_EMPTY(p) ((UART_GET_FR(p) & UART01x_FR_TMSK) == 0) -#define UART_DUMMY_RSR_RX 256 +#define UART_DUMMY_RSR_RX /*256*/0 #define UART_PORT_SIZE 64 +/* + * On the Integrator platform, the port RTS and DTR are provided by + * bits in the following SC_CTRLS register bits: + * RTS DTR + * UART0 7 6 + * UART1 5 4 + */ +#define SC_CTRLC (IO_ADDRESS(INTEGRATOR_SC_BASE) + INTEGRATOR_SC_CTRLC_OFFSET) +#define SC_CTRLS (IO_ADDRESS(INTEGRATOR_SC_BASE) + INTEGRATOR_SC_CTRLS_OFFSET) + /* * We wrap our port structure around the generic uart_port. */ struct uart_amba_port { struct uart_port port; - struct amba_device *dev; - struct amba_pl010_data *data; + unsigned int dtr_mask; + unsigned int rts_mask; unsigned int old_status; }; @@ -79,36 +110,36 @@ static void pl010_stop_tx(struct uart_port *port) { unsigned int cr; - cr = readb(port->membase + UART010_CR); + cr = UART_GET_CR(port); cr &= ~UART010_CR_TIE; - writel(cr, port->membase + UART010_CR); + UART_PUT_CR(port, cr); } static void pl010_start_tx(struct uart_port *port) { unsigned int cr; - cr = readb(port->membase + UART010_CR); + cr = UART_GET_CR(port); cr |= UART010_CR_TIE; - writel(cr, port->membase + UART010_CR); + UART_PUT_CR(port, cr); } static void pl010_stop_rx(struct uart_port *port) { unsigned int cr; - cr = readb(port->membase + UART010_CR); + cr = UART_GET_CR(port); cr &= ~(UART010_CR_RIE | UART010_CR_RTIE); - writel(cr, port->membase + UART010_CR); + UART_PUT_CR(port, cr); } static void pl010_enable_ms(struct uart_port *port) { unsigned int cr; - cr = readb(port->membase + UART010_CR); + cr = UART_GET_CR(port); cr |= UART010_CR_MSIE; - writel(cr, port->membase + UART010_CR); + UART_PUT_CR(port, cr); } static void @@ -121,9 +152,9 @@ pl010_rx_chars(struct uart_port *port) struct tty_struct *tty = port->info->tty; unsigned int status, ch, flag, rsr, max_count = 256; - status = readb(port->membase + UART01x_FR); + status = UART_GET_FR(port); while (UART_RX_DATA(status) && max_count--) { - ch = readb(port->membase + UART01x_DR); + ch = UART_GET_CHAR(port); flag = TTY_NORMAL; port->icount.rx++; @@ -132,7 +163,7 @@ pl010_rx_chars(struct uart_port *port) * Note that the error handling code is * out of the main execution path */ - rsr = readb(port->membase + UART01x_RSR) | UART_DUMMY_RSR_RX; + rsr = UART_GET_RSR(port) | UART_DUMMY_RSR_RX; if (unlikely(rsr & UART01x_RSR_ANY)) { if (rsr & UART01x_RSR_BE) { rsr &= ~(UART01x_RSR_FE | UART01x_RSR_PE); @@ -162,7 +193,7 @@ pl010_rx_chars(struct uart_port *port) uart_insert_char(port, rsr, UART01x_RSR_OE, ch, flag); ignore_char: - status = readb(port->membase + UART01x_FR); + status = UART_GET_FR(port); } tty_flip_buffer_push(tty); return; @@ -174,7 +205,7 @@ static void pl010_tx_chars(struct uart_port *port) int count; if (port->x_char) { - writel(port->x_char, port->membase + UART01x_DR); + UART_PUT_CHAR(port, port->x_char); port->icount.tx++; port->x_char = 0; return; @@ -186,7 +217,7 @@ static void pl010_tx_chars(struct uart_port *port) count = port->fifosize >> 1; do { - writel(xmit->buf[xmit->tail], port->membase + UART01x_DR); + UART_PUT_CHAR(port, xmit->buf[xmit->tail]); xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1); port->icount.tx++; if (uart_circ_empty(xmit)) @@ -205,9 +236,9 @@ static void pl010_modem_status(struct uart_port *port) struct uart_amba_port *uap = (struct uart_amba_port *)port; unsigned int status, delta; - writel(0, uap->port.membase + UART010_ICR); + UART_PUT_ICR(&uap->port, 0); - status = readb(uap->port.membase + UART01x_FR) & UART01x_FR_MODEM_ANY; + status = UART_GET_FR(&uap->port) & UART01x_FR_MODEM_ANY; delta = status ^ uap->old_status; uap->old_status = status; @@ -235,7 +266,7 @@ static irqreturn_t pl010_int(int irq, void *dev_id, struct pt_regs *regs) spin_lock(&port->lock); - status = readb(port->membase + UART010_IIR); + status = UART_GET_INT_STATUS(port); if (status) { do { if (status & (UART010_IIR_RTIS | UART010_IIR_RIS)) @@ -252,7 +283,7 @@ static irqreturn_t pl010_int(int irq, void *dev_id, struct pt_regs *regs) if (pass_counter-- == 0) break; - status = readb(port->membase + UART010_IIR); + status = UART_GET_INT_STATUS(port); } while (status & (UART010_IIR_RTIS | UART010_IIR_RIS | UART010_IIR_TIS)); handled = 1; @@ -265,7 +296,7 @@ static irqreturn_t pl010_int(int irq, void *dev_id, struct pt_regs *regs) static unsigned int pl010_tx_empty(struct uart_port *port) { - return readb(port->membase + UART01x_FR) & UART01x_FR_BUSY ? 0 : TIOCSER_TEMT; + return UART_GET_FR(port) & UART01x_FR_BUSY ? 0 : TIOCSER_TEMT; } static unsigned int pl010_get_mctrl(struct uart_port *port) @@ -273,7 +304,7 @@ static unsigned int pl010_get_mctrl(struct uart_port *port) unsigned int result = 0; unsigned int status; - status = readb(port->membase + UART01x_FR); + status = UART_GET_FR(port); if (status & UART01x_FR_DCD) result |= TIOCM_CAR; if (status & UART01x_FR_DSR) @@ -287,9 +318,20 @@ static unsigned int pl010_get_mctrl(struct uart_port *port) static void pl010_set_mctrl(struct uart_port *port, unsigned int mctrl) { struct uart_amba_port *uap = (struct uart_amba_port *)port; + unsigned int ctrls = 0, ctrlc = 0; + + if (mctrl & TIOCM_RTS) + ctrlc |= uap->rts_mask; + else + ctrls |= uap->rts_mask; - if (uap->data) - uap->data->set_mctrl(uap->dev, uap->port.membase, mctrl); + if (mctrl & TIOCM_DTR) + ctrlc |= uap->dtr_mask; + else + ctrls |= uap->dtr_mask; + + __raw_writel(ctrls, SC_CTRLS); + __raw_writel(ctrlc, SC_CTRLC); } static void pl010_break_ctl(struct uart_port *port, int break_state) @@ -298,12 +340,12 @@ static void pl010_break_ctl(struct uart_port *port, int break_state) unsigned int lcr_h; spin_lock_irqsave(&port->lock, flags); - lcr_h = readb(port->membase + UART010_LCRH); + lcr_h = UART_GET_LCRH(port); if (break_state == -1) lcr_h |= UART01x_LCRH_BRK; else lcr_h &= ~UART01x_LCRH_BRK; - writel(lcr_h, port->membase + UART010_LCRH); + UART_PUT_LCRH(port, lcr_h); spin_unlock_irqrestore(&port->lock, flags); } @@ -322,13 +364,13 @@ static int pl010_startup(struct uart_port *port) /* * initialise the old status of the modem signals */ - uap->old_status = readb(port->membase + UART01x_FR) & UART01x_FR_MODEM_ANY; + uap->old_status = UART_GET_FR(port) & UART01x_FR_MODEM_ANY; /* * Finally, enable interrupts */ - writel(UART01x_CR_UARTEN | UART010_CR_RIE | UART010_CR_RTIE, - port->membase + UART010_CR); + UART_PUT_CR(port, UART01x_CR_UARTEN | UART010_CR_RIE | + UART010_CR_RTIE); return 0; } @@ -343,12 +385,11 @@ static void pl010_shutdown(struct uart_port *port) /* * disable all interrupts, disable the port */ - writel(0, port->membase + UART010_CR); + UART_PUT_CR(port, 0); /* disable break condition and fifos */ - writel(readb(port->membase + UART010_LCRH) & - ~(UART01x_LCRH_BRK | UART01x_LCRH_FEN), - port->membase + UART010_LCRH); + UART_PUT_LCRH(port, UART_GET_LCRH(port) & + ~(UART01x_LCRH_BRK | UART01x_LCRH_FEN)); } static void @@ -425,25 +466,25 @@ pl010_set_termios(struct uart_port *port, struct termios *termios, port->ignore_status_mask |= UART_DUMMY_RSR_RX; /* first, disable everything */ - old_cr = readb(port->membase + UART010_CR) & ~UART010_CR_MSIE; + old_cr = UART_GET_CR(port) & ~UART010_CR_MSIE; if (UART_ENABLE_MS(port, termios->c_cflag)) old_cr |= UART010_CR_MSIE; - writel(0, port->membase + UART010_CR); + UART_PUT_CR(port, 0); /* Set baud rate */ quot -= 1; - writel((quot & 0xf00) >> 8, port->membase + UART010_LCRM); - writel(quot & 0xff, port->membase + UART010_LCRL); + UART_PUT_LCRM(port, ((quot & 0xf00) >> 8)); + UART_PUT_LCRL(port, (quot & 0xff)); /* * ----------v----------v----------v----------v----- * NOTE: MUST BE WRITTEN AFTER UARTLCR_M & UARTLCR_L * ----------^----------^----------^----------^----- */ - writel(lcr_h, port->membase + UART010_LCRH); - writel(old_cr, port->membase + UART010_CR); + UART_PUT_LCRH(port, lcr_h); + UART_PUT_CR(port, old_cr); spin_unlock_irqrestore(&port->lock, flags); } @@ -515,53 +556,87 @@ static struct uart_ops amba_pl010_pops = { .verify_port = pl010_verify_port, }; -static struct uart_amba_port *amba_ports[UART_NR]; +static struct uart_amba_port amba_ports[UART_NR] = { + { + .port = { + .membase = (void *)IO_ADDRESS(INTEGRATOR_UART0_BASE), + .mapbase = INTEGRATOR_UART0_BASE, + .iotype = UPIO_MEM, + .irq = IRQ_UARTINT0, + .uartclk = 14745600, + .fifosize = 16, + .ops = &amba_pl010_pops, + .flags = UPF_BOOT_AUTOCONF, + .line = 0, + }, + .dtr_mask = 1 << 5, + .rts_mask = 1 << 4, + }, + { + .port = { + .membase = (void *)IO_ADDRESS(INTEGRATOR_UART1_BASE), + .mapbase = INTEGRATOR_UART1_BASE, + .iotype = UPIO_MEM, + .irq = IRQ_UARTINT1, + .uartclk = 14745600, + .fifosize = 16, + .ops = &amba_pl010_pops, + .flags = UPF_BOOT_AUTOCONF, + .line = 1, + }, + .dtr_mask = 1 << 7, + .rts_mask = 1 << 6, + } +}; #ifdef CONFIG_SERIAL_AMBA_PL010_CONSOLE -static void pl010_console_putchar(struct uart_port *port, int ch) -{ - unsigned int status; - - do { - status = readb(port->membase + UART01x_FR); - barrier(); - } while (!UART_TX_READY(status)); - writel(ch, port->membase + UART01x_DR); -} - static void pl010_console_write(struct console *co, const char *s, unsigned int count) { - struct uart_port *port = &amba_ports[co->index]->port; + struct uart_port *port = &amba_ports[co->index].port; unsigned int status, old_cr; + int i; /* * First save the CR then disable the interrupts */ - old_cr = readb(port->membase + UART010_CR); - writel(UART01x_CR_UARTEN, port->membase + UART010_CR); + old_cr = UART_GET_CR(port); + UART_PUT_CR(port, UART01x_CR_UARTEN); - uart_console_write(port, s, count, pl010_console_putchar); + /* + * Now, do each character + */ + for (i = 0; i < count; i++) { + do { + status = UART_GET_FR(port); + } while (!UART_TX_READY(status)); + UART_PUT_CHAR(port, s[i]); + if (s[i] == '\n') { + do { + status = UART_GET_FR(port); + } while (!UART_TX_READY(status)); + UART_PUT_CHAR(port, '\r'); + } + } /* * Finally, wait for transmitter to become empty * and restore the TCR */ do { - status = readb(port->membase + UART01x_FR); - barrier(); + status = UART_GET_FR(port); } while (status & UART01x_FR_BUSY); - writel(old_cr, port->membase + UART010_CR); + UART_PUT_CR(port, old_cr); } static void __init pl010_console_get_options(struct uart_port *port, int *baud, int *parity, int *bits) { - if (readb(port->membase + UART010_CR) & UART01x_CR_UARTEN) { + if (UART_GET_CR(port) & UART01x_CR_UARTEN) { unsigned int lcr_h, quot; - lcr_h = readb(port->membase + UART010_LCRH); + lcr_h = UART_GET_LCRH(port); *parity = 'n'; if (lcr_h & UART01x_LCRH_PEN) { @@ -576,7 +651,7 @@ pl010_console_get_options(struct uart_port *port, int *baud, else *bits = 8; - quot = readb(port->membase + UART010_LCRL) | readb(port->membase + UART010_LCRM) << 8; + quot = UART_GET_LCRL(port) | UART_GET_LCRM(port) << 8; *baud = port->uartclk / (16 * (quot + 1)); } } @@ -596,7 +671,7 @@ static int __init pl010_console_setup(struct console *co, char *options) */ if (co->index >= UART_NR) co->index = 0; - port = &amba_ports[co->index]->port; + port = &amba_ports[co->index].port; if (options) uart_parse_options(options, &baud, &parity, &bits, &flow); @@ -617,6 +692,24 @@ static struct console amba_console = { .data = &amba_reg, }; +static int __init amba_console_init(void) +{ + /* + * All port initializations are done statically + */ + register_console(&amba_console); + return 0; +} +console_initcall(amba_console_init); + +static int __init amba_late_console_init(void) +{ + if (!(amba_console.flags & CON_ENABLED)) + register_console(&amba_console); + return 0; +} +late_initcall(amba_late_console_init); + #define AMBA_CONSOLE &amba_console #else #define AMBA_CONSOLE NULL @@ -634,75 +727,29 @@ static struct uart_driver amba_reg = { static int pl010_probe(struct amba_device *dev, void *id) { - struct uart_amba_port *port; - void __iomem *base; - int i, ret; - - for (i = 0; i < ARRAY_SIZE(amba_ports); i++) - if (amba_ports[i] == NULL) - break; - - if (i == ARRAY_SIZE(amba_ports)) { - ret = -EBUSY; - goto out; - } - - port = kzalloc(sizeof(struct uart_amba_port), GFP_KERNEL); - if (!port) { - ret = -ENOMEM; - goto out; - } + int i; - base = ioremap(dev->res.start, PAGE_SIZE); - if (!base) { - ret = -ENOMEM; - goto free; - } + for (i = 0; i < UART_NR; i++) { + if (amba_ports[i].port.mapbase != dev->res.start) + continue; - port->port.dev = &dev->dev; - port->port.mapbase = dev->res.start; - port->port.membase = base; - port->port.iotype = UPIO_MEM; - port->port.irq = dev->irq[0]; - port->port.uartclk = 14745600; - port->port.fifosize = 16; - port->port.ops = &amba_pl010_pops; - port->port.flags = UPF_BOOT_AUTOCONF; - port->port.line = i; - port->dev = dev; - port->data = dev->dev.platform_data; - - amba_ports[i] = port; - - amba_set_drvdata(dev, port); - ret = uart_add_one_port(&amba_reg, &port->port); - if (ret) { - amba_set_drvdata(dev, NULL); - amba_ports[i] = NULL; - iounmap(base); - free: - kfree(port); + amba_ports[i].port.dev = &dev->dev; + uart_add_one_port(&amba_reg, &amba_ports[i].port); + amba_set_drvdata(dev, &amba_ports[i]); + break; } - out: - return ret; + return 0; } static int pl010_remove(struct amba_device *dev) { - struct uart_amba_port *port = amba_get_drvdata(dev); - int i; - - amba_set_drvdata(dev, NULL); - - uart_remove_one_port(&amba_reg, &port->port); + struct uart_amba_port *uap = amba_get_drvdata(dev); - for (i = 0; i < ARRAY_SIZE(amba_ports); i++) - if (amba_ports[i] == port) - amba_ports[i] = NULL; + if (uap) + uart_remove_one_port(&amba_reg, &uap->port); - iounmap(port->port.membase); - kfree(port); + amba_set_drvdata(dev, NULL); return 0; } diff --git a/drivers/serial/amba-pl011.c b/drivers/serial/amba-pl011.c index a8d7124e8..034a029e3 100644 --- a/drivers/serial/amba-pl011.c +++ b/drivers/serial/amba-pl011.c @@ -31,6 +31,7 @@ * 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 @@ -586,12 +587,14 @@ static struct uart_amba_port *amba_ports[UART_NR]; #ifdef CONFIG_SERIAL_AMBA_PL011_CONSOLE -static void pl011_console_putchar(struct uart_port *port, int ch) +static inline void +pl011_console_write_char(struct uart_amba_port *uap, char ch) { - struct uart_amba_port *uap = (struct uart_amba_port *)port; + unsigned int status; - while (readw(uap->port.membase + UART01x_FR) & UART01x_FR_TXFF) - barrier(); + do { + status = readw(uap->port.membase + UART01x_FR); + } while (status & UART01x_FR_TXFF); writew(ch, uap->port.membase + UART01x_DR); } @@ -600,6 +603,7 @@ pl011_console_write(struct console *co, const char *s, unsigned int count) { struct uart_amba_port *uap = amba_ports[co->index]; unsigned int status, old_cr, new_cr; + int i; clk_enable(uap->clk); @@ -611,7 +615,14 @@ pl011_console_write(struct console *co, const char *s, unsigned int count) new_cr |= UART01x_CR_UARTEN | UART011_CR_TXE; writew(new_cr, uap->port.membase + UART011_CR); - uart_console_write(&uap->port, s, count, pl011_console_putchar); + /* + * Now, do each character + */ + for (i = 0; i < count; i++) { + pl011_console_write_char(uap, s[i]); + if (s[i] == '\n') + pl011_console_write_char(uap, '\r'); + } /* * Finally, wait for transmitter to become empty diff --git a/drivers/serial/at91_serial.c b/drivers/serial/at91_serial.c index 54c6b2adf..2113feb75 100644 --- a/drivers/serial/at91_serial.c +++ b/drivers/serial/at91_serial.c @@ -2,6 +2,7 @@ * 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. @@ -22,26 +23,24 @@ * 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 @@ -68,6 +67,7 @@ #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,33 +87,16 @@ /* 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 @@ -132,19 +115,16 @@ 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; - 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); - } + /* + * 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 (mctrl & TIOCM_RTS) @@ -157,15 +137,7 @@ static void at91_set_mctrl(struct uart_port *port, u_int mctrl) else control |= AT91_US_DTRDIS; - 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); + UART_PUT_CR(port,control); } /* @@ -197,9 +169,8 @@ 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; } /* @@ -207,8 +178,7 @@ static void at91_stop_tx(struct uart_port *port) */ static void at91_start_tx(struct uart_port *port) { - struct at91_uart_port *at91_port = (struct at91_uart_port *) port; - + port->read_status_mask |= AT91_US_TXRDY; UART_PUT_IER(port, AT91_US_TXRDY); } @@ -217,8 +187,6 @@ 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); } @@ -227,6 +195,7 @@ 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); } @@ -249,8 +218,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); - while (status & AT91_US_RXRDY) { + status = UART_GET_CSR(port) & port->read_status_mask; + while (status & (AT91_US_RXRDY)) { ch = UART_GET_CHAR(port); port->icount.rx++; @@ -261,38 +230,40 @@ 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 | AT91_US_RXBRK))) { + if (unlikely(status & (AT91_US_PARE | AT91_US_FRAME | AT91_US_OVRE))) { UART_PUT_CR(port, AT91_US_RSTSTA); /* clear error */ - 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) + 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++; - status &= port->read_status_mask; - - if (status & AT91_US_RXBRK) - flg = TTY_BREAK; - else if (status & AT91_US_PARE) + 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; - uart_insert_char(port, status, AT91_US_OVRE, ch, flg); + tty_insert_flip_char(tty, ch, flg); ignore_char: - status = UART_GET_CSR(port); + status = UART_GET_CSR(port) & port->read_status_mask; } tty_flip_buffer_push(tty); @@ -337,35 +308,40 @@ 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 & 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; + 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); + } - status = UART_GET_CSR(port); - pending = status & UART_GET_IMR(port); + // 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); } return IRQ_HANDLED; } @@ -375,7 +351,6 @@ 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; /* @@ -388,7 +363,7 @@ static int at91_startup(struct uart_port *port) /* * Allocate the IRQ */ - retval = request_irq(port->irq, at91_interrupt, IRQF_SHARED, "at91_serial", port); + retval = request_irq(port->irq, at91_interrupt, SA_SHIRQ, "at91_serial", port); if (retval) { printk("at91_serial: at91_startup - Can't get irq\n"); return retval; @@ -406,14 +381,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); /* enable receive only */ - + UART_PUT_IER(port, AT91_US_RXRDY); /* do receive only */ return 0; } @@ -422,8 +397,6 @@ 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. */ @@ -448,22 +421,21 @@ 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. */ - clk_enable(at91_port->clk); + at91_sys_write(AT91_PMC_PCER, 1 << port->irq); break; case 3: /* * Disable the peripheral clock for this serial port. * This is called on uart_close() or a suspend event. */ - clk_disable(at91_port->clk); + if (port->irq != AT91_ID_SYS) /* is this a shared clock? */ + at91_sys_write(AT91_PMC_PCDR, 1 << port->irq); break; default: printk(KERN_ERR "at91_serial: unknown pm %d\n", state); @@ -522,9 +494,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; @@ -580,7 +552,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_AT91) ? "AT91_SERIAL" : NULL; + return (port->type == PORT_AT91RM9200) ? "AT91_SERIAL" : NULL; } /* @@ -588,15 +560,8 @@ static const char *at91_type(struct uart_port *port) */ static void at91_release_port(struct uart_port *port) { - 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; - } + release_mem_region(port->mapbase, + (port->mapbase == AT91_VA_BASE_DBGU) ? 512 : SZ_16K); } /* @@ -604,21 +569,10 @@ static void at91_release_port(struct uart_port *port) */ static int at91_request_port(struct uart_port *port) { - struct platform_device *pdev = to_platform_device(port->dev); - int size = pdev->resource[0].end - pdev->resource[0].start + 1; + return request_mem_region(port->mapbase, + (port->mapbase == AT91_VA_BASE_DBGU) ? 512 : SZ_16K, + "at91_serial") != NULL ? 0 : -EBUSY; - 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; } /* @@ -627,7 +581,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_AT91; + port->type = PORT_AT91RM9200; at91_request_port(port); } } @@ -638,7 +592,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_AT91) + if (ser->type != PORT_UNKNOWN && ser->type != PORT_AT91RM9200) ret = -EINVAL; if (port->irq != ser->irq) ret = -EINVAL; @@ -670,47 +624,33 @@ 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, }; -/* - * 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 struct uart_port at91_ports[AT91_NR_UART]; + +void __init at91_init_ports(void) { - 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; - } + static int first = 1; + int 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); - } + if (!first) + return; + first = 0; + + 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; + } } -/* - * Register board-specific modem-control line handlers. - */ -void __init at91_register_uart_fns(struct at91_port_fns *fns) +void __init at91_register_uart_fns(struct at91rm9200_port_fns *fns) { if (fns->enable_ms) at91_pops.enable_ms = fns->enable_ms; @@ -724,22 +664,61 @@ void __init at91_register_uart_fns(struct at91_port_fns *fns) at91_pops.set_wake = fns->set_wake; } - -#ifdef CONFIG_SERIAL_AT91_CONSOLE -static void at91_console_putchar(struct uart_port *port, int ch) +/* + * Setup ports. + */ +void __init at91_register_uart(int idx, int port) { - while (!(UART_GET_CSR(port) & AT91_US_TXRDY)) - barrier(); - UART_PUT_CHAR(port, ch); + 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 + /* * Interrupts are disabled on entering */ static void at91_console_write(struct console *co, const char *s, u_int count) { - struct uart_port *port = &at91_ports[co->index].uart; - unsigned int status, imr; + struct uart_port *port = at91_ports + co->index; + unsigned int status, i, imr; /* * First, save IMR and then disable interrupts @@ -747,7 +726,21 @@ static void at91_console_write(struct console *co, const char *s, u_int count) imr = UART_GET_IMR(port); /* get interrupt mask */ UART_PUT_IDR(port, AT91_US_RXRDY | AT91_US_TXRDY); - uart_console_write(port, s, count, at91_console_putchar); + /* + * Now, do each character + */ + for (i = 0; i < count; i++) { + do { + status = UART_GET_CSR(port); + } while (!(status & AT91_US_TXRDY)); + UART_PUT_CHAR(port, s[i]); + if (s[i] == '\n') { + do { + status = UART_GET_CSR(port); + } while (!(status & AT91_US_TXRDY)); + UART_PUT_CHAR(port, '\r'); + } + } /* * Finally, wait for transmitter to become empty @@ -793,15 +786,23 @@ 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 = &at91_ports[co->index].uart; + struct uart_port *port; int baud = 115200; int bits = 8; int parity = 'n'; int flow = 'n'; - if (port->membase == 0) /* Port not initialized yet - delay setup */ - return -ENODEV; + /* + * 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); + /* + * 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); @@ -828,147 +829,58 @@ static struct console at91_console = { #define AT91_CONSOLE_DEVICE &at91_console -/* - * Early console initialization (before VM subsystem initialized). - */ -static int __init at91_console_init(void) +static int __init at91_console_init(void) { - 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_init_ports(); + 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_serial", + .driver_name = AT91_DEVICENAME, .dev_name = AT91_DEVICENAME, + .devfs_name = AT91_DEVICENAME, .major = SERIAL_AT91_MAJOR, .minor = MINOR_START, .nr = AT91_NR_UART, .cons = AT91_CONSOLE_DEVICE, }; -#ifdef CONFIG_PM -static int at91_serial_suspend(struct platform_device *pdev, pm_message_t state) -{ - 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; - } - - return 0; -} - -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; - - 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 int __devinit at91_serial_probe(struct platform_device *pdev) -{ - struct at91_uart_port *port; - int ret; - - 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; + int ret, i; + + at91_init_ports(); ret = uart_register_driver(&at91_uart); if (ret) return ret; - ret = platform_driver_register(&at91_serial_driver); - if (ret) - uart_unregister_driver(&at91_uart); + for (i = 0; i < AT91_NR_UART; i++) { + if (at91_serial_map[i] >= 0) + uart_add_one_port(&at91_uart, &at91_ports[i]); + } - return ret; + return 0; } static void __exit at91_serial_exit(void) { - platform_driver_unregister(&at91_serial_driver); + int i; + + for (i = 0; i < AT91_NR_UART; i++) { + if (at91_serial_map[i] >= 0) + uart_remove_one_port(&at91_uart, &at91_ports[i]); + } + uart_unregister_driver(&at91_uart); } diff --git a/drivers/serial/au1x00_uart.c b/drivers/serial/au1x00_uart.c index b6d3d5034..344022fe5 100644 --- a/drivers/serial/au1x00_uart.c +++ b/drivers/serial/au1x00_uart.c @@ -200,7 +200,7 @@ static void autoconfig(struct uart_8250_port *up, unsigned int probeflags) DEBUG_AUTOCONF("type=%s\n", uart_config[up->port.type].name); } -static void serial8250_stop_tx(struct uart_port *port, unsigned int tty_stop) +static void serial8250_stop_tx(struct uart_port *port) { struct uart_8250_port *up = (struct uart_8250_port *)port; @@ -210,7 +210,7 @@ static void serial8250_stop_tx(struct uart_port *port, unsigned int tty_stop) } } -static void serial8250_start_tx(struct uart_port *port, unsigned int tty_start) +static void serial8250_start_tx(struct uart_port *port) { struct uart_8250_port *up = (struct uart_8250_port *)port; @@ -241,18 +241,12 @@ static _INLINE_ void receive_chars(struct uart_8250_port *up, int *status, struct pt_regs *regs) { struct tty_struct *tty = up->port.info->tty; - unsigned char ch; + unsigned char ch, flag; int max_count = 256; do { - if (unlikely(tty->flip.count >= TTY_FLIPBUF_SIZE)) { - tty->flip.work.func((void *)tty); - if (tty->flip.count >= TTY_FLIPBUF_SIZE) - return; // if TTY_DONT_FLIP is set - } ch = serial_inp(up, UART_RX); - *tty->flip.char_buf_ptr = ch; - *tty->flip.flag_buf_ptr = TTY_NORMAL; + flag = TTY_NORMAL; up->port.icount.rx++; if (unlikely(*status & (UART_LSR_BI | UART_LSR_PE | @@ -292,30 +286,23 @@ receive_chars(struct uart_8250_port *up, int *status, struct pt_regs *regs) #endif if (*status & UART_LSR_BI) { DEBUG_INTR("handling break...."); - *tty->flip.flag_buf_ptr = TTY_BREAK; + flag = TTY_BREAK; } else if (*status & UART_LSR_PE) - *tty->flip.flag_buf_ptr = TTY_PARITY; + flag = TTY_PARITY; else if (*status & UART_LSR_FE) - *tty->flip.flag_buf_ptr = TTY_FRAME; + flag = TTY_FRAME; } if (uart_handle_sysrq_char(&up->port, ch, regs)) goto ignore_char; - if ((*status & up->port.ignore_status_mask) == 0) { - tty->flip.flag_buf_ptr++; - tty->flip.char_buf_ptr++; - tty->flip.count++; - } - if ((*status & UART_LSR_OE) && - tty->flip.count < TTY_FLIPBUF_SIZE) { + if ((*status & up->port.ignore_status_mask) == 0) + tty_insert_flip_char(tty, ch, flag); + if (*status & UART_LSR_OE) /* * Overrun is special, since it's reported * immediately, and doesn't affect the current * character. */ - *tty->flip.flag_buf_ptr = TTY_OVERRUN; - tty->flip.flag_buf_ptr++; - tty->flip.char_buf_ptr++; - tty->flip.count++; + tty_insert_flip_char(tty, 0, TTY_OVERRUN); } ignore_char: *status = serial_inp(up, UART_LSR); @@ -337,7 +324,7 @@ static _INLINE_ void transmit_chars(struct uart_8250_port *up) return; } if (uart_circ_empty(xmit) || uart_tx_stopped(&up->port)) { - serial8250_stop_tx(&up->port, 0); + serial8250_stop_tx(&up->port); return; } @@ -356,7 +343,7 @@ static _INLINE_ void transmit_chars(struct uart_8250_port *up) DEBUG_INTR("THRE..."); if (uart_circ_empty(xmit)) - serial8250_stop_tx(&up->port, 0); + serial8250_stop_tx(&up->port); } static _INLINE_ void check_modem_status(struct uart_8250_port *up) @@ -556,13 +543,10 @@ static unsigned int serial8250_tx_empty(struct uart_port *port) static unsigned int serial8250_get_mctrl(struct uart_port *port) { struct uart_8250_port *up = (struct uart_8250_port *)port; - unsigned long flags; unsigned char status; unsigned int ret; - spin_lock_irqsave(&up->port.lock, flags); status = serial_in(up, UART_MSR); - spin_unlock_irqrestore(&up->port.lock, flags); ret = 0; if (status & UART_MSR_DCD) @@ -773,22 +757,22 @@ serial8250_set_termios(struct uart_port *port, struct termios *termios, switch (termios->c_cflag & CSIZE) { case CS5: - cval = 0x00; + cval = UART_LCR_WLEN5; break; case CS6: - cval = 0x01; + cval = UART_LCR_WLEN6; break; case CS7: - cval = 0x02; + cval = UART_LCR_WLEN7; break; default: case CS8: - cval = 0x03; + cval = UART_LCR_WLEN8; break; } if (termios->c_cflag & CSTOPB) - cval |= 0x04; + cval |= UART_LCR_STOP; if (termios->c_cflag & PARENB) cval |= UART_LCR_PARITY; if (!(termios->c_cflag & PARODD)) @@ -908,7 +892,7 @@ serial8250_request_std_resource(struct uart_8250_port *up, struct resource **res int ret = 0; switch (up->port.iotype) { - case SERIAL_IO_MEM: + case UPIO_MEM: if (up->port.mapbase) { *res = request_mem_region(up->port.mapbase, size, "serial"); if (!*res) @@ -916,8 +900,8 @@ serial8250_request_std_resource(struct uart_8250_port *up, struct resource **res } break; - case SERIAL_IO_HUB6: - case SERIAL_IO_PORT: + case UPIO_HUB6: + case UPIO_PORT: *res = request_region(up->port.iobase, size, "serial"); if (!*res) ret = -EBUSY; @@ -935,7 +919,7 @@ static void serial8250_release_port(struct uart_port *port) size <<= up->port.regshift; switch (up->port.iotype) { - case SERIAL_IO_MEM: + case UPIO_MEM: if (up->port.mapbase) { /* * Unmap the area. @@ -951,8 +935,8 @@ static void serial8250_release_port(struct uart_port *port) } break; - case SERIAL_IO_HUB6: - case SERIAL_IO_PORT: + case UPIO_HUB6: + case UPIO_PORT: start = up->port.iobase; if (size) diff --git a/drivers/serial/clps711x.c b/drivers/serial/clps711x.c index f27d852ce..ce7b2e4ec 100644 --- a/drivers/serial/clps711x.c +++ b/drivers/serial/clps711x.c @@ -25,6 +25,7 @@ * $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 @@ -423,13 +424,6 @@ static struct uart_port clps711x_ports[UART_NR] = { }; #ifdef CONFIG_SERIAL_CLPS711X_CONSOLE -static void clps711xuart_console_putchar(struct uart_port *port, int ch) -{ - while (clps_readl(SYSFLG(port)) & SYSFLG_UTXFF) - barrier(); - clps_writel(ch, UARTDR(port)); -} - /* * Print a string to the serial port trying not to disturb * any possible real use of the port... @@ -444,6 +438,7 @@ clps711xuart_console_write(struct console *co, const char *s, { struct uart_port *port = clps711x_ports + co->index; unsigned int status, syscon; + int i; /* * Ensure that the port is enabled. @@ -451,7 +446,21 @@ clps711xuart_console_write(struct console *co, const char *s, syscon = clps_readl(SYSCON(port)); clps_writel(syscon | SYSCON_UARTEN, SYSCON(port)); - uart_console_write(port, s, count, clps711xuart_console_putchar); + /* + * Now, do each character + */ + for (i = 0; i < count; i++) { + do { + status = clps_readl(SYSFLG(port)); + } while (status & SYSFLG_UTXFF); + clps_writel(s[i], UARTDR(port)); + if (s[i] == '\n') { + do { + status = clps_readl(SYSFLG(port)); + } while (status & SYSFLG_UTXFF); + clps_writel('\r', UARTDR(port)); + } + } /* * Finally, wait for transmitter to become empty diff --git a/drivers/serial/cpm_uart/cpm_uart.h b/drivers/serial/cpm_uart/cpm_uart.h index a8f894c78..73c8a088c 100644 --- a/drivers/serial/cpm_uart/cpm_uart.h +++ b/drivers/serial/cpm_uart/cpm_uart.h @@ -5,19 +5,11 @@ * * 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" @@ -34,14 +26,14 @@ #define FLAG_SMC 0x00000002 #define FLAG_CONSOLE 0x00000001 -#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_SMC1 0 +#define UART_SMC2 1 +#define UART_SCC1 2 +#define UART_SCC2 3 +#define UART_SCC3 4 +#define UART_SCC4 5 -#define UART_NR fs_uart_nr +#define UART_NR 6 #define RX_NUM_FIFO 4 #define RX_BUF_SIZE 32 @@ -72,7 +64,6 @@ struct uart_cpm_port { uint dp_addr; void *mem_addr; dma_addr_t dma_addr; - u32 mem_size; /* helpers */ int baud; int bits; @@ -99,38 +90,4 @@ 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 90ff96e33..b7bf4c698 100644 --- a/drivers/serial/cpm_uart/cpm_uart_core.c +++ b/drivers/serial/cpm_uart/cpm_uart_core.c @@ -12,8 +12,7 @@ * * Copyright (C) 2004 Freescale Semiconductor, Inc. * (C) 2004 Intracom, S.A. - * (C) 2005-2006 MontaVista Software, Inc. - * Vitaly Bordug + * (C) 2005 MontaVista Software, Inc. by 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 @@ -31,6 +30,7 @@ * */ +#include #include #include #include @@ -41,7 +41,6 @@ #include #include #include -#include #include #include @@ -61,7 +60,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 = 0; +int cpm_uart_nr; /**************************************************************/ @@ -72,51 +71,18 @@ 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) +static inline unsigned long cpu2cpm_addr(void *addr) { - 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 + if ((unsigned long)addr >= CPM_ADDR) + return (unsigned long)addr; + return virt_to_bus(addr); } -/* Get UART number by its id */ -static int cpm_uart_id2nr(int id) +static inline void *cpm2cpu_addr(unsigned long addr) { - int i; - if (id < UART_NR) { - for (i=0; i= CPM_ADDR) + return (void *)addr; + return bus_to_virt(addr); } /* @@ -292,7 +258,7 @@ static void cpm_uart_int_rx(struct uart_port *port, struct pt_regs *regs) } /* get pointer */ - cp = cpm2cpu_addr(bdp->cbd_bufaddr, pinfo); + cp = cpm2cpu_addr(bdp->cbd_bufaddr); /* loop through the buffer */ while (i-- > 0) { @@ -472,11 +438,7 @@ static void cpm_uart_shutdown(struct uart_port *port) } /* Shut them really down and reinit buffer descriptors */ - 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_line_cr_cmd(line, CPM_CR_STOP_TX); cpm_uart_initbd(pinfo); } } @@ -639,7 +601,7 @@ static int cpm_uart_tx_pump(struct uart_port *port) /* Pick next descriptor and fill from buffer */ bdp = pinfo->tx_cur; - p = cpm2cpu_addr(bdp->cbd_bufaddr, pinfo); + p = cpm2cpu_addr(bdp->cbd_bufaddr); *p++ = port->x_char; bdp->cbd_datlen = 1; @@ -666,7 +628,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 = cpm2cpu_addr(bdp->cbd_bufaddr, pinfo); + p = cpm2cpu_addr(bdp->cbd_bufaddr); while (count < pinfo->tx_fifosize) { *p++ = xmit->buf[xmit->tail]; xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1); @@ -715,12 +677,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 = cpu2cpm_addr(mem_addr, pinfo); + bdp->cbd_bufaddr = cpu2cpm_addr(mem_addr); bdp->cbd_sc = BD_SC_EMPTY | BD_SC_INTRPT; mem_addr += pinfo->rx_fifosize; } - bdp->cbd_bufaddr = cpu2cpm_addr(mem_addr, pinfo); + bdp->cbd_bufaddr = cpu2cpm_addr(mem_addr); bdp->cbd_sc = BD_SC_WRAP | BD_SC_EMPTY | BD_SC_INTRPT; /* Set the physical address of the host memory @@ -730,12 +692,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 = cpu2cpm_addr(mem_addr, pinfo); + bdp->cbd_bufaddr = cpu2cpm_addr(mem_addr); bdp->cbd_sc = BD_SC_INTRPT; mem_addr += pinfo->tx_fifosize; } - bdp->cbd_bufaddr = cpu2cpm_addr(mem_addr, pinfo); + bdp->cbd_bufaddr = cpu2cpm_addr(mem_addr); bdp->cbd_sc = BD_SC_WRAP | BD_SC_INTRPT; } @@ -867,6 +829,14 @@ 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); @@ -1018,58 +988,6 @@ struct uart_cpm_port cpm_uart_ports[UART_NR] = { }, }; -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 @@ -1109,7 +1027,7 @@ 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. */ - cp = cpm2cpu_addr(bdp->cbd_bufaddr, pinfo); + cp = cpm2cpu_addr(bdp->cbd_bufaddr); *cp = *s; @@ -1126,7 +1044,7 @@ static void cpm_uart_console_write(struct console *co, const char *s, while ((bdp->cbd_sc & BD_SC_READY) != 0) ; - cp = cpm2cpu_addr(bdp->cbd_bufaddr, pinfo); + cp = cpm2cpu_addr(bdp->cbd_bufaddr); *cp = 13; bdp->cbd_datlen = 1; @@ -1149,7 +1067,9 @@ 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; @@ -1160,29 +1080,9 @@ 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; @@ -1197,6 +1097,14 @@ 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); @@ -1235,8 +1143,11 @@ static struct console cpm_scc_uart_console = { int __init cpm_uart_console_init(void) { - register_console(&cpm_scc_uart_console); - return 0; + int ret = cpm_uart_init_portdesc(); + + if (!ret) + register_console(&cpm_scc_uart_console); + return ret; } console_initcall(cpm_uart_console_init); @@ -1254,129 +1165,44 @@ static struct uart_driver cpm_reg = { .minor = SERIAL_CPM_MINOR, .cons = CPM_UART_CONSOLE, }; -static int cpm_uart_drv_probe(struct device *dev) -{ - struct platform_device *pdev = to_platform_device(dev); - struct fs_uart_platform_info *pdata; - int ret = -ENODEV; - - if(!pdev) { - printk(KERN_ERR"CPM UART: platform data missing!\n"); - return ret; - } - - pdata = pdev->dev.platform_data; - pr_debug("cpm_uart_drv_probe: Adding CPM UART %d\n", cpm_uart_id2nr(pdata->fs_no)); - - if ((ret = cpm_uart_drv_get_platform_data(pdev, 0))) - return ret; - - if (pdata->init_ioports) - pdata->init_ioports(); - - ret = uart_add_one_port(&cpm_reg, &cpm_uart_ports[pdata->fs_no].port); - - return ret; -} - -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) +static int __init cpm_uart_init(void) { - 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; -} - + int ret, i; -static int cpm_uart_init(void) { + printk(KERN_INFO "Serial: CPM driver $Revision: 0.01 $\n"); - 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; + ret = cpm_uart_init_portdesc(); + if (ret) + return ret; #endif - cpm_reg.nr = cpm_uart_nr; - ret = uart_register_driver(&cpm_reg); + 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); - } + 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); } + return ret; } static void __exit cpm_uart_exit(void) { - driver_unregister(&cpm_scc_uart_driver); - driver_unregister(&cpm_smc_uart_driver); + int i; + + 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); + } + 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 95afc3729..d789ee55c 100644 --- a/drivers/serial/cpm_uart/cpm_uart_cpm1.c +++ b/drivers/serial/cpm_uart/cpm_uart_cpm1.c @@ -8,8 +8,6 @@ * * 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 @@ -27,6 +25,7 @@ * */ +#include #include #include #include @@ -82,11 +81,58 @@ void cpm_line_cr_cmd(int line, int cmd) void smc1_lineif(struct uart_cpm_port *pinfo) { + volatile cpm8xx_t *cp = cpmp; + + (void)cp; /* fix warning */ +#if defined (CONFIG_MPC885ADS) + /* Enable SMC1 transceivers */ + { + cp->cp_pepar |= 0x000000c0; + cp->cp_pedir &= ~0x000000c0; + cp->cp_peso &= ~0x00000040; + cp->cp_peso |= 0x00000080; + } +#elif defined (CONFIG_MPC86XADS) + 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; + } +#endif pinfo->brg = 1; } void smc2_lineif(struct uart_cpm_port *pinfo) { + volatile cpm8xx_t *cp = cpmp; + + (void)cp; /* fix warning */ +#if defined (CONFIG_MPC885ADS) + cp->cp_pepar |= 0x00000c00; + cp->cp_pedir &= ~0x00000c00; + cp->cp_peso &= ~0x00000400; + cp->cp_peso |= 0x00000800; +#elif defined (CONFIG_MPC86XADS) + unsigned int iobits = 0x00000c00; + + 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; + } + +#endif + pinfo->brg = 2; } @@ -145,7 +191,7 @@ int cpm_uart_allocbuf(struct uart_cpm_port *pinfo, unsigned int is_con) /* 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; + dma_addr = 0; } else mem_addr = dma_alloc_coherent(NULL, memsz, &dma_addr, GFP_KERNEL); @@ -158,9 +204,8 @@ int cpm_uart_allocbuf(struct uart_cpm_port *pinfo, unsigned int is_con) } pinfo->dp_addr = dp_offset; - pinfo->mem_addr = mem_addr; /* virtual address*/ - pinfo->dma_addr = dma_addr; /* physical address*/ - pinfo->mem_size = memsz; + pinfo->mem_addr = mem_addr; + pinfo->dma_addr = dma_addr; 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 ef3bb476c..fd9e53ed3 100644 --- a/drivers/serial/cpm_uart/cpm_uart_cpm2.c +++ b/drivers/serial/cpm_uart/cpm_uart_cpm2.c @@ -8,8 +8,6 @@ * * 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 @@ -27,6 +25,7 @@ * */ +#include #include #include #include @@ -143,12 +142,21 @@ void scc2_lineif(struct uart_cpm_port *pinfo) * be supported in a sane fashion. */ #ifndef CONFIG_STX_GP3 +#ifdef CONFIG_MPC8560_ADS + volatile iop_cpm2_t *io = &cpm2_immr->im_ioport; + io->iop_ppard |= 0x00000018; + io->iop_psord &= ~0x00000008; /* Rx */ + io->iop_psord &= ~0x00000010; /* Tx */ + io->iop_pdird &= ~0x00000008; /* Rx */ + io->iop_pdird |= 0x00000010; /* Tx */ +#else 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 #endif cpm2_immr->im_cpmux.cmx_scr &= 0xff00ffff; cpm2_immr->im_cpmux.cmx_scr |= 0x00090000; @@ -210,10 +218,8 @@ 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); @@ -228,7 +234,6 @@ 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 diff --git a/drivers/serial/crisv10.c b/drivers/serial/crisv10.c index cabd048c8..be12623d8 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 IRQF_SHARED when request_irq() for ser2 and ser3 (shared with) par0 and par1. + * Use SA_SHIRQ 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,6 +425,7 @@ static char *serial_version = "$Revision: 1.25 $"; +#include #include #include #include @@ -480,6 +481,8 @@ static char *serial_version = "$Revision: 1.25 $"; #include "serial_compat.h" #endif +#define _INLINE_ inline + struct tty_driver *serial_driver; /* serial subtype definitions */ @@ -588,6 +591,8 @@ static void rs_throttle(struct tty_struct * tty); static void rs_wait_until_sent(struct tty_struct *tty, int timeout); static int rs_write(struct tty_struct * tty, int from_user, const unsigned char *buf, int count); +extern _INLINE_ int rs_raw_write(struct tty_struct * tty, int from_user, + const unsigned char *buf, int count); #ifdef CONFIG_ETRAX_RS485 static int e100_write_rs485(struct tty_struct * tty, int from_user, const unsigned char *buf, int count); @@ -1533,7 +1538,8 @@ e100_enable_rxdma_irq(struct e100_serial *info) /* the tx DMA uses only dma_descr interrupt */ -static void e100_disable_txdma_irq(struct e100_serial *info) +static _INLINE_ void +e100_disable_txdma_irq(struct e100_serial *info) { #ifdef SERIAL_DEBUG_INTR printk("txdma_irq(%d): 0\n",info->line); @@ -1542,7 +1548,8 @@ static void e100_disable_txdma_irq(struct e100_serial *info) *R_IRQ_MASK2_CLR = info->irq; } -static void e100_enable_txdma_irq(struct e100_serial *info) +static _INLINE_ void +e100_enable_txdma_irq(struct e100_serial *info) { #ifdef SERIAL_DEBUG_INTR printk("txdma_irq(%d): 1\n",info->line); @@ -1551,7 +1558,8 @@ static void e100_enable_txdma_irq(struct e100_serial *info) *R_IRQ_MASK2_SET = info->irq; } -static void e100_disable_txdma_channel(struct e100_serial *info) +static _INLINE_ void +e100_disable_txdma_channel(struct e100_serial *info) { unsigned long flags; @@ -1591,7 +1599,8 @@ static void e100_disable_txdma_channel(struct e100_serial *info) } -static void e100_enable_txdma_channel(struct e100_serial *info) +static _INLINE_ void +e100_enable_txdma_channel(struct e100_serial *info) { unsigned long flags; @@ -1616,7 +1625,8 @@ static void e100_enable_txdma_channel(struct e100_serial *info) restore_flags(flags); } -static void e100_disable_rxdma_channel(struct e100_serial *info) +static _INLINE_ void +e100_disable_rxdma_channel(struct e100_serial *info) { unsigned long flags; @@ -1655,7 +1665,8 @@ static void e100_disable_rxdma_channel(struct e100_serial *info) } -static void e100_enable_rxdma_channel(struct e100_serial *info) +static _INLINE_ void +e100_enable_rxdma_channel(struct e100_serial *info) { unsigned long flags; @@ -1902,7 +1913,9 @@ rs_start(struct tty_struct *tty) * This routine is used by the interrupt handler to schedule * processing in the software interrupt portion of the driver. */ -static void rs_sched_event(struct e100_serial *info, int event) +static _INLINE_ void +rs_sched_event(struct e100_serial *info, + int event) { if (info->event & (1 << event)) return; @@ -2142,9 +2155,8 @@ add_char_and_flag(struct e100_serial *info, unsigned char data, unsigned char fl return 1; } -static unsigned int handle_descr_data(struct e100_serial *info, - struct etrax_dma_descr *descr, - unsigned int recvl) +extern _INLINE_ unsigned int +handle_descr_data(struct e100_serial *info, struct etrax_dma_descr *descr, unsigned int recvl) { struct etrax_recv_buffer *buffer = phys_to_virt(descr->buf) - sizeof *buffer; @@ -2170,7 +2182,8 @@ static unsigned int handle_descr_data(struct e100_serial *info, return recvl; } -static unsigned int handle_all_descr_data(struct e100_serial *info) +static _INLINE_ unsigned int +handle_all_descr_data(struct e100_serial *info) { struct etrax_dma_descr *descr; unsigned int recvl; @@ -2217,7 +2230,8 @@ static unsigned int handle_all_descr_data(struct e100_serial *info) return ret; } -static void receive_chars_dma(struct e100_serial *info) +static _INLINE_ void +receive_chars_dma(struct e100_serial *info) { struct tty_struct *tty; unsigned char rstat; @@ -2278,7 +2292,8 @@ static void receive_chars_dma(struct e100_serial *info) *info->icmdadr = IO_STATE(R_DMA_CH6_CMD, cmd, restart); } -static int start_recv_dma(struct e100_serial *info) +static _INLINE_ int +start_recv_dma(struct e100_serial *info) { struct etrax_dma_descr *descr = info->rec_descr; struct etrax_recv_buffer *buffer; @@ -2333,6 +2348,11 @@ start_receive(struct e100_serial *info) } +static _INLINE_ void +status_handle(struct e100_serial *info, unsigned short status) +{ +} + /* the bits in the MASK2 register are laid out like this: DMAI_EOP DMAI_DESCR DMAO_EOP DMAO_DESCR where I is the input channel and O is the output channel for the port. @@ -2434,7 +2454,8 @@ rec_interrupt(int irq, void *dev_id, struct pt_regs * regs) return IRQ_RETVAL(handled); } /* rec_interrupt */ -static int force_eop_if_needed(struct e100_serial *info) +static _INLINE_ int +force_eop_if_needed(struct e100_serial *info) { /* We check data_avail bit to determine if data has * arrived since last time @@ -2478,7 +2499,8 @@ static int force_eop_if_needed(struct e100_serial *info) return 1; } -static void flush_to_flip_buffer(struct e100_serial *info) +extern _INLINE_ void +flush_to_flip_buffer(struct e100_serial *info) { struct tty_struct *tty; struct etrax_recv_buffer *buffer; @@ -2572,6 +2594,12 @@ 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)); @@ -2583,7 +2611,8 @@ static void flush_to_flip_buffer(struct e100_serial *info) tty_flip_buffer_push(tty); } -static void check_flush_timeout(struct e100_serial *info) +static _INLINE_ void +check_flush_timeout(struct e100_serial *info) { /* Flip what we've got (if we can) */ flush_to_flip_buffer(info); @@ -2712,7 +2741,7 @@ TODO: The break will be delayed until an F or V character is received. */ -static +extern _INLINE_ struct e100_serial * handle_ser_rx_interrupt_no_dma(struct e100_serial *info) { unsigned long data_read; @@ -2846,7 +2875,8 @@ more_data: return info; } -static struct e100_serial* handle_ser_rx_interrupt(struct e100_serial *info) +extern _INLINE_ +struct e100_serial* handle_ser_rx_interrupt(struct e100_serial *info) { unsigned char rstat; @@ -2965,7 +2995,7 @@ static struct e100_serial* handle_ser_rx_interrupt(struct e100_serial *info) return info; } /* handle_ser_rx_interrupt */ -static void handle_ser_tx_interrupt(struct e100_serial *info) +extern _INLINE_ void handle_ser_tx_interrupt(struct e100_serial *info) { unsigned long flags; @@ -3591,8 +3621,9 @@ rs_flush_chars(struct tty_struct *tty) restore_flags(flags); } -static int rs_raw_write(struct tty_struct * tty, int from_user, - const unsigned char *buf, int count) +extern _INLINE_ int +rs_raw_write(struct tty_struct * tty, int from_user, + const unsigned char *buf, int count) { int c, ret = 0; struct e100_serial *info = (struct e100_serial *)tty->driver_data; @@ -4679,7 +4710,7 @@ rs_open(struct tty_struct *tty, struct file * filp) * /proc fs routines.... */ -static int line_info(char *buf, struct e100_serial *info) +extern _INLINE_ int line_info(char *buf, struct e100_serial *info) { char stat_buf[30]; int ret; @@ -4877,7 +4908,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_DYNAMIC_DEV; + driver->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_NO_DEVFS; driver->termios = serial_termios; driver->termios_locked = serial_termios_locked; @@ -4942,55 +4973,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, IRQF_SHARED | IRQF_DISABLED, "serial ", NULL)) + if (request_irq(SERIAL_IRQ_NBR, ser_interrupt, SA_SHIRQ | SA_INTERRUPT, "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, IRQF_DISABLED, "serial 0 dma tr", NULL)) + if (request_irq(SER0_DMA_TX_IRQ_NBR, tr_interrupt, SA_INTERRUPT, "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, IRQF_DISABLED, "serial 0 dma rec", NULL)) + if (request_irq(SER0_DMA_RX_IRQ_NBR, rec_interrupt, SA_INTERRUPT, "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, IRQF_DISABLED, "serial 1 dma tr", NULL)) + if (request_irq(SER1_DMA_TX_IRQ_NBR, tr_interrupt, SA_INTERRUPT, "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, IRQF_DISABLED, "serial 1 dma rec", NULL)) + if (request_irq(SER1_DMA_RX_IRQ_NBR, rec_interrupt, SA_INTERRUPT, "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, IRQF_SHARED | IRQF_DISABLED, "serial 2 dma tr", NULL)) + if (request_irq(SER2_DMA_TX_IRQ_NBR, tr_interrupt, SA_SHIRQ | SA_INTERRUPT, "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, IRQF_SHARED | IRQF_DISABLED, "serial 2 dma rec", NULL)) + if (request_irq(SER2_DMA_RX_IRQ_NBR, rec_interrupt, SA_SHIRQ | SA_INTERRUPT, "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, IRQF_SHARED | IRQF_DISABLED, "serial 3 dma tr", NULL)) + if (request_irq(SER3_DMA_TX_IRQ_NBR, tr_interrupt, SA_SHIRQ | SA_INTERRUPT, "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, IRQF_SHARED | IRQF_DISABLED, "serial 3 dma rec", NULL)) + if (request_irq(SER3_DMA_RX_IRQ_NBR, rec_interrupt, SA_SHIRQ | SA_INTERRUPT, "serial 3 dma rec", NULL)) panic("irq21"); #endif #endif #ifdef CONFIG_ETRAX_SERIAL_FLUSH_DMA_FAST - if (request_irq(TIMER1_IRQ_NBR, timeout_interrupt, IRQF_SHARED | IRQF_DISABLED, + if (request_irq(TIMER1_IRQ_NBR, timeout_interrupt, SA_SHIRQ | SA_INTERRUPT, "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 f30b93d6e..1800c0e75 100644 --- a/drivers/serial/crisv10.h +++ b/drivers/serial/crisv10.h @@ -7,6 +7,7 @@ #ifndef _ETRAX_SERIAL_H #define _ETRAX_SERIAL_H +#include #include #include diff --git a/drivers/serial/dz.c b/drivers/serial/dz.c index 8a98aae80..ba5541de6 100644 --- a/drivers/serial/dz.c +++ b/drivers/serial/dz.c @@ -26,6 +26,7 @@ #undef DEBUG_DZ +#include #include #include #include @@ -673,12 +674,11 @@ static void dz_reset(struct dz_port *dport) } #ifdef CONFIG_SERIAL_DZ_CONSOLE -static void dz_console_putchar(struct uart_port *uport, int ch) +static void dz_console_put_char(struct dz_port *dport, unsigned char ch) { - struct dz_port *dport = (struct dz_port *)uport; unsigned long flags; int loops = 2500; - unsigned short tmp = (unsigned char)ch; + unsigned short tmp = ch; /* this code sends stuff out to serial device - spinning its wheels and waiting. */ @@ -694,7 +694,6 @@ static void dz_console_putchar(struct uart_port *uport, int ch) spin_unlock_irqrestore(&dport->port.lock, flags); } - /* * ------------------------------------------------------------------- * dz_console_print () @@ -711,7 +710,11 @@ static void dz_console_print(struct console *cons, #ifdef DEBUG_DZ prom_printf((char *) str); #endif - uart_console_write(&dport->port, str, count, dz_console_putchar); + while (count--) { + if (*str == '\n') + dz_console_put_char(dport, '\r'); + dz_console_put_char(dport, *str++); + } } static int __init dz_console_setup(struct console *co, char *options) @@ -767,7 +770,11 @@ 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, @@ -797,7 +804,7 @@ int __init dz_init(void) restore_flags(flags); if (request_irq(dz_ports[0].port.irq, dz_interrupt, - IRQF_DISABLED, "DZ", &dz_ports[0])) + SA_INTERRUPT, "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 a3c00a252..144a7a352 100644 --- a/drivers/serial/icom.c +++ b/drivers/serial/icom.c @@ -24,6 +24,7 @@ */ #define SERIAL_DO_RESTART #include +#include #include #include #include @@ -1563,7 +1564,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, - IRQF_DISABLED | IRQF_SHARED, ICOM_DRIVER_NAME, + SA_INTERRUPT | SA_SHIRQ, ICOM_DRIVER_NAME, (void *) icom_adapter))) { goto probe_exit2; } diff --git a/drivers/serial/imx.c b/drivers/serial/imx.c index 4a142d6b8..4d53fb5ca 100644 --- a/drivers/serial/imx.c +++ b/drivers/serial/imx.c @@ -25,6 +25,7 @@ * [29-Mar-2005] Mike Lee * Added hardware handshake */ +#include #if defined(CONFIG_SERIAL_IMX_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ) #define SUPPORT_SYSRQ @@ -44,7 +45,6 @@ #include #include #include -#include /* We've been assigned a range on the "Low-density serial ports" major */ #define SERIAL_IMX_MAJOR 204 @@ -73,8 +73,7 @@ struct imx_port { struct uart_port port; struct timer_list timer; unsigned int old_status; - int txirq,rxirq,rtsirq; - int have_rtscts:1; + int txirq,rxirq,rtsirq; }; /* @@ -404,7 +403,7 @@ static int imx_startup(struct uart_port *port) if (retval) goto error_out2; retval = request_irq(sport->rtsirq, imx_rtsint, - IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING, + SA_TRIGGER_FALLING | SA_TRIGGER_RISING, DRIVER_NAME, sport); if (retval) goto error_out3; @@ -492,12 +491,8 @@ imx_set_termios(struct uart_port *port, struct termios *termios, ucr2 = UCR2_SRST | UCR2_IRTS; if (termios->c_cflag & CRTSCTS) { - if( sport->have_rtscts ) { - ucr2 &= ~UCR2_IRTS; - ucr2 |= UCR2_CTSC; - } else { - termios->c_cflag &= ~CRTSCTS; - } + ucr2 &= ~UCR2_IRTS; + ucr2 |= UCR2_CTSC; } if (termios->c_cflag & CSTOPB) @@ -724,16 +719,30 @@ static void __init imx_init_ports(void) imx_ports[i].timer.function = imx_timeout; imx_ports[i].timer.data = (unsigned long)&imx_ports[i]; } + + imx_gpio_mode(PC9_PF_UART1_CTS); + imx_gpio_mode(PC10_PF_UART1_RTS); + imx_gpio_mode(PC11_PF_UART1_TXD); + imx_gpio_mode(PC12_PF_UART1_RXD); + imx_gpio_mode(PB28_PF_UART2_CTS); + imx_gpio_mode(PB29_PF_UART2_RTS); + + imx_gpio_mode(PB30_PF_UART2_TXD); + imx_gpio_mode(PB31_PF_UART2_RXD); + +#if 0 /* We don't need these, on the mx1 the _modem_ side of the uart + * is implemented. + */ + imx_gpio_mode(PD7_AF_UART2_DTR); + imx_gpio_mode(PD8_AF_UART2_DCD); + imx_gpio_mode(PD9_AF_UART2_RI); + imx_gpio_mode(PD10_AF_UART2_DSR); +#endif + + } #ifdef CONFIG_SERIAL_IMX_CONSOLE -static void imx_console_putchar(struct uart_port *port, int ch) -{ - struct imx_port *sport = (struct imx_port *)port; - while ((UTS((u32)sport->port.membase) & UTS_TXFULL)) - barrier(); - URTX0((u32)sport->port.membase) = ch; -} /* * Interrupts are disabled on entering @@ -742,7 +751,7 @@ static void imx_console_write(struct console *co, const char *s, unsigned int count) { struct imx_port *sport = &imx_ports[co->index]; - unsigned int old_ucr1, old_ucr2; + unsigned int old_ucr1, old_ucr2, i; /* * First, save UCR1/2 and then disable interrupts @@ -755,7 +764,22 @@ imx_console_write(struct console *co, const char *s, unsigned int count) & ~(UCR1_TXMPTYEN | UCR1_RRDYEN | UCR1_RTSDEN); UCR2((u32)sport->port.membase) = old_ucr2 | UCR2_TXEN; - uart_console_write(&sport->port, s, count, imx_console_putchar); + /* + * Now, do each character + */ + for (i = 0; i < count; i++) { + + while ((UTS((u32)sport->port.membase) & UTS_TXFULL)) + barrier(); + + URTX0((u32)sport->port.membase) = s[i]; + + if (s[i] == '\n') { + while ((UTS((u32)sport->port.membase) & UTS_TXFULL)) + barrier(); + URTX0((u32)sport->port.membase) = '\r'; + } + } /* * Finally, wait for transmitter to become empty @@ -887,6 +911,7 @@ 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), @@ -915,14 +940,7 @@ static int serial_imx_resume(struct platform_device *dev) static int serial_imx_probe(struct platform_device *dev) { - struct imxuart_platform_data *pdata; - imx_ports[dev->id].port.dev = &dev->dev; - - pdata = (struct imxuart_platform_data *)dev->dev.platform_data; - if(pdata && (pdata->flags & IMXUART_HAVE_RTSCTS)) - imx_ports[dev->id].have_rtscts = 1; - uart_add_one_port(&imx_reg, &imx_ports[dev->id].port); platform_set_drvdata(dev, &imx_ports[dev->id]); return 0; diff --git a/drivers/serial/ioc4_serial.c b/drivers/serial/ioc4_serial.c index 576ca1eaa..a37579ce6 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-2006 Silicon Graphics, Inc. All Rights Reserved. + * Copyright (C) 2003-2005 Silicon Graphics, Inc. All Rights Reserved. */ @@ -323,12 +323,9 @@ static unsigned int Num_of_ioc4_cards; #define IOC4_FIFO_CHARS 255 /* Device name we're using */ -#define DEVICE_NAME_RS232 "ttyIOC" -#define DEVICE_NAME_RS422 "ttyAIOC" -#define DEVICE_MAJOR 204 -#define DEVICE_MINOR_RS232 50 -#define DEVICE_MINOR_RS422 84 - +#define DEVICE_NAME "ttyIOC" +#define DEVICE_MAJOR 204 +#define DEVICE_MINOR 50 /* register offsets */ #define IOC4_SERIAL_OFFSET 0x300 @@ -344,8 +341,10 @@ static unsigned int Num_of_ioc4_cards; #define MAX_BAUD_SUPPORTED 115200 /* protocol types supported */ -#define PROTO_RS232 3 -#define PROTO_RS422 7 +enum sio_proto { + PROTO_RS232, + PROTO_RS422 +}; /* Notification types */ #define N_DATA_READY 0x01 @@ -396,17 +395,11 @@ static unsigned int Num_of_ioc4_cards; /* * 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 - 1 for rs232, 1 for rs422 */ - struct uart_port icp_uart_port[UART_PORT_COUNT]; + /* uart ports are allocated here */ + struct uart_port icp_uart_port; /* Handy reference material */ struct ioc4_port *icp_port; } ic_port[IOC4_NUM_SERIAL_PORTS]; @@ -450,9 +443,7 @@ struct ioc4_soft { /* Local port info for each IOC4 serial ports */ struct ioc4_port { - struct uart_port *ip_port; /* current active port ptr */ - /* Ptrs for all ports */ - struct uart_port *ip_all_ports[UART_PORT_COUNT]; + struct uart_port *ip_port; /* Back ptrs for this port */ struct ioc4_control *ip_control; struct pci_dev *ip_pdev; @@ -511,9 +502,6 @@ 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 @@ -635,23 +623,6 @@ 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 @@ -737,33 +708,19 @@ 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, int set) +static struct ioc4_port *get_ioc4_port(struct uart_port *the_port) { 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; + int ii; if (control) { - for ( port_num = 0; port_num < IOC4_NUM_SERIAL_PORTS; - port_num++ ) { - port = control->ic_port[port_num].icp_port; - if (!port) + for ( ii = 0; ii < IOC4_NUM_SERIAL_PORTS; ii++ ) { + if (!control->ic_port[ii].icp_port) continue; - 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; - } - } + if (the_port == control->ic_port[ii].icp_port->ip_port) + return control->ic_port[ii].icp_port; } } return NULL; @@ -989,7 +946,6 @@ 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; @@ -997,7 +953,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 *intr_info; + struct ioc4_intr_info *ii; soft = arg; for (intr_type = 0; intr_type < IOC4_NUM_INTR_TYPES; intr_type++) { @@ -1010,13 +966,13 @@ 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++) { - intr_info = &soft->is_intr_type[intr_type].is_intr_info[xx]; - if ((this_mir = this_ir & intr_info->sd_bits)) { + ii = &soft->is_intr_type[intr_type].is_intr_info[xx]; + if ((this_mir = this_ir & ii->sd_bits)) { /* Disable owned interrupts, call handler */ handled++; - write_ireg(soft, intr_info->sd_bits, IOC4_W_IEC, + write_ireg(soft, ii->sd_bits, IOC4_W_IEC, intr_type); - intr_info->sd_intr(intr_info->sd_info, this_mir); + ii->sd_intr(ii->sd_info, this_mir); this_ir &= ~this_mir; } } @@ -1024,6 +980,7 @@ static irqreturn_t ioc4_intr(int irq, void *arg, struct pt_regs *regs) #ifdef DEBUG_INTERRUPTS { struct ioc4_misc_regs __iomem *mem = soft->is_ioc4_misc_addr; + spinlock_t *lp = &soft->is_ir_lock; unsigned long flag; spin_lock_irqsave(&soft->is_ir_lock, flag); @@ -1220,7 +1177,7 @@ static inline int local_open(struct ioc4_port *port) { int spiniter = 0; - port->ip_flags = PORT_ACTIVE; + port->ip_flags = 0; /* Pause the DMA interface if necessary */ if (port->ip_sscr & IOC4_SSCR_DMA_EN) { @@ -1230,7 +1187,6 @@ 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; } } @@ -1550,13 +1506,14 @@ 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, +static inline int set_mcr(struct uart_port *the_port, int set, int mask1, int mask2) { - struct ioc4_port *port = get_ioc4_port(the_port, 0); + struct ioc4_port *port = get_ioc4_port(the_port); uint32_t shadow; int spiniter = 0; char mcr; @@ -1579,9 +1536,13 @@ static inline int set_mcr(struct uart_port *the_port, mcr = (shadow & 0xff000000) >> 24; /* Set new value */ - mcr |= mask1; - shadow |= mask2; - + if (set) { + mcr |= mask1; + shadow |= mask2; + } else { + mcr &= ~mask1; + shadow &= ~mask2; + } writeb(mcr, &port->ip_uart_regs->i4u_mcr); writel(shadow, &port->ip_serial_regs->shadow); @@ -1597,7 +1558,7 @@ static inline int set_mcr(struct uart_port *the_port, * @port: port to use * @proto: protocol to use */ -static int ioc4_set_proto(struct ioc4_port *port, int proto) +static int ioc4_set_proto(struct ioc4_port *port, enum sio_proto proto) { struct hooks *hooks = port->ip_hooks; @@ -1628,7 +1589,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, 0); + struct ioc4_port *port = get_ioc4_port(the_port); struct uart_info *info; if (!the_port) @@ -1684,7 +1645,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, 0); + struct ioc4_port *port = get_ioc4_port(the_port); int baud, bits; unsigned cflag; int new_parity = 0, new_parity_enable = 0, new_stop = 0, new_data = 8; @@ -1791,7 +1752,7 @@ static inline int ic4_startup_local(struct uart_port *the_port) if (!the_port) return -1; - port = get_ioc4_port(the_port, 0); + port = get_ioc4_port(the_port); if (!port) return -1; @@ -1799,9 +1760,6 @@ static inline int ic4_startup_local(struct uart_port *the_port) 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); @@ -1810,17 +1768,17 @@ static inline int ic4_startup_local(struct uart_port *the_port) /* * ioc4_cb_output_lowat - called when the output low water mark is hit - * @the_port: port to output + * @port: port to output */ -static void ioc4_cb_output_lowat(struct uart_port *the_port) +static void ioc4_cb_output_lowat(struct ioc4_port *port) { unsigned long pflags; /* ip_lock is set on the call here */ - if (the_port) { - spin_lock_irqsave(&the_port->lock, pflags); - transmit_chars(the_port); - spin_unlock_irqrestore(&the_port->lock, pflags); + if (port->ip_port) { + spin_lock_irqsave(&port->ip_port->lock, pflags); + transmit_chars(port->ip_port); + spin_unlock_irqrestore(&port->ip_port->lock, pflags); } } @@ -1965,7 +1923,7 @@ static void handle_intr(void *arg, uint32_t sio_ir) &port->ip_mem->sio_ir.raw); if (port->ip_notify & N_OUTPUT_LOWAT) - ioc4_cb_output_lowat(port->ip_port); + ioc4_cb_output_lowat(port); } /* Handle tx_mt. Must come after tx_explicit. */ @@ -1978,7 +1936,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->ip_port); + ioc4_cb_output_lowat(port); /* We need to reload the sio_ir since the lowat * call may have caused another write to occur, @@ -2065,7 +2023,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, 0); + struct ioc4_port *port = get_ioc4_port(the_port); struct ring *inring; struct ring_entry *entry; struct hooks *hooks = port->ip_hooks; @@ -2377,27 +2335,17 @@ static void receive_chars(struct uart_port *the_port) */ static const char *ic4_type(struct uart_port *the_port) { - if (the_port->mapbase == PROTO_RS232) - return "SGI IOC4 Serial [rs232]"; - else - return "SGI IOC4 Serial [rs422]"; + return "SGI IOC4 Serial"; } /** - * ic4_tx_empty - Is the transmitter empty? - * @port: Port to operate on + * 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) * */ static unsigned int ic4_tx_empty(struct uart_port *the_port) { - 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; + return 1; } /** @@ -2407,10 +2355,6 @@ static unsigned int ic4_tx_empty(struct uart_port *the_port) */ 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,12 +2377,11 @@ static void ic4_shutdown(struct uart_port *the_port) struct ioc4_port *port; struct uart_info *info; - port = get_ioc4_port(the_port, 0); + port = get_ioc4_port(the_port); if (!port) return; info = the_port->info; - port->ip_port = NULL; wake_up_interruptible(&info->delta_msr_wait); @@ -2447,7 +2390,6 @@ static void ic4_shutdown(struct uart_port *the_port) spin_lock_irqsave(&the_port->lock, port_flags); set_notification(port, N_ALL, 0); - port->ip_flags = PORT_INACTIVE; spin_unlock_irqrestore(&the_port->lock, port_flags); } @@ -2460,11 +2402,6 @@ 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; @@ -2477,7 +2414,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, mcr, IOC4_SHADOW_DTR); + set_mcr(the_port, 1, mcr, IOC4_SHADOW_DTR); } /** @@ -2487,11 +2424,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, 0); + struct ioc4_port *port = get_ioc4_port(the_port); uint32_t shadow; unsigned int ret = 0; - if (!port_is_active(port, the_port)) + if (!port) return 0; shadow = readl(&port->ip_serial_regs->shadow); @@ -2511,9 +2448,9 @@ static unsigned int ic4_get_mctrl(struct uart_port *the_port) */ static void ic4_start_tx(struct uart_port *the_port) { - struct ioc4_port *port = get_ioc4_port(the_port, 0); + struct ioc4_port *port = get_ioc4_port(the_port); - if (port_is_active(port, the_port)) { + if (port) { set_notification(port, N_OUTPUT_LOWAT, 1); enable_intrs(port, port->ip_hooks->intr_tx_mt); } @@ -2530,7 +2467,7 @@ static void ic4_break_ctl(struct uart_port *the_port, int break_state) } /** - * ic4_startup - Start up the serial port + * ic4_startup - Start up the serial port - always return 0 (We're always on) * @port: Port to operate on * */ @@ -2542,16 +2479,17 @@ 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, 1); - if (!port) + } + port = get_ioc4_port(the_port); + if (!port) { return -ENODEV; + } info = the_port->info; control = port->ip_control; if (!control) { - port->ip_port = NULL; return -ENODEV; } @@ -2613,107 +2551,28 @@ static struct uart_ops ioc4_ops = { * Boot-time initialization code */ -static struct uart_driver ioc4_uart_rs232 = { +static struct uart_driver ioc4_uart = { .owner = THIS_MODULE, - .driver_name = "ioc4_serial_rs232", - .dev_name = DEVICE_NAME_RS232, + .driver_name = "ioc4_serial", + .dev_name = DEVICE_NAME, .major = DEVICE_MAJOR, - .minor = DEVICE_MINOR_RS232, + .minor = DEVICE_MINOR, .nr = IOC4_NUM_CARDS * IOC4_NUM_SERIAL_PORTS, }; -static struct uart_driver ioc4_uart_rs422 = { - .owner = THIS_MODULE, - .driver_name = "ioc4_serial_rs422", - .dev_name = DEVICE_NAME_RS422, - .major = DEVICE_MAJOR, - .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_rs232 - register with serial core + * ioc4_serial_core_attach - 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, int port_type) +ioc4_serial_core_attach(struct pci_dev *pdev) { struct ioc4_port *port; struct uart_port *the_port; 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; - + int ii; DPRINT_CONFIG(("%s: attach pdev 0x%p - control 0x%p\n", __FUNCTION__, pdev, (void *)control)); @@ -2721,36 +2580,28 @@ ioc4_serial_core_attach(struct pci_dev *pdev, int port_type) 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 (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; + 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; - DPRINT_CONFIG(("%s: attach the_port 0x%p / port 0x%p : type %s\n", + DPRINT_CONFIG(("%s: attach the_port 0x%p / port 0x%p\n", __FUNCTION__, (void *)the_port, - (void *)port, - port_type == PROTO_RS232 ? "rs232" : "rs422")); + (void *)port)); /* membase, iobase and mapbase just need to be non-0 */ the_port->membase = (unsigned char __iomem *)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->iobase = (pdev->bus->number << 16) | ii; + the_port->line = (Num_of_ioc4_cards << 2) | ii; + the_port->mapbase = 1; the_port->type = PORT_16550A; the_port->fifosize = IOC4_FIFO_CHARS; the_port->ops = &ioc4_ops; the_port->irq = control->ic_irq; the_port->dev = &pdev->dev; spin_lock_init(&the_port->lock); - if (uart_add_one_port(u_driver, the_port) < 0) { + if (uart_add_one_port(&ioc4_uart, the_port) < 0) { printk(KERN_WARNING "%s: unable to add port %d bus %d\n", __FUNCTION__, the_port->line, pdev->bus->number); @@ -2759,6 +2610,8 @@ ioc4_serial_core_attach(struct pci_dev *pdev, int port_type) ("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; } @@ -2778,14 +2631,7 @@ ioc4_serial_attach_one(struct ioc4_driver_data *idd) int ret = 0; - DPRINT_CONFIG(("%s (0x%p, 0x%p)\n", __FUNCTION__, idd->idd_pdev, - idd->idd_pci_id)); - - /* 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; + DPRINT_CONFIG(("%s (0x%p, 0x%p)\n", __FUNCTION__, idd->idd_pdev, idd->idd_pci_id)); /* request serial registers */ tmp_addr1 = idd->idd_bar0 + IOC4_SERIAL_OFFSET; @@ -2807,11 +2653,11 @@ ioc4_serial_attach_one(struct ioc4_driver_data *idd) goto out2; } DPRINT_CONFIG(("%s : mem 0x%p, serial 0x%p\n", - __FUNCTION__, (void *)idd->idd_misc_regs, - (void *)serial)); + __FUNCTION__, (void *)idd->idd_misc_regs, (void *)serial)); /* Get memory for the new card */ - control = kmalloc(sizeof(struct ioc4_control), GFP_KERNEL); + control = kmalloc(sizeof(struct ioc4_control) * IOC4_NUM_SERIAL_PORTS, + GFP_KERNEL); if (!control) { printk(KERN_WARNING "ioc4_attach_one" @@ -2855,8 +2701,8 @@ ioc4_serial_attach_one(struct ioc4_driver_data *idd) control->ic_soft = soft; /* Hook up interrupt handler */ - if (!request_irq(idd->idd_pdev->irq, ioc4_intr, IRQF_SHARED, - "sgi-ioc4serial", soft)) { + if (!request_irq(idd->idd_pdev->irq, ioc4_intr, SA_SHIRQ, + "sgi-ioc4serial", (void *)soft)) { control->ic_irq = idd->idd_pdev->irq; } else { printk(KERN_WARNING @@ -2867,21 +2713,16 @@ ioc4_serial_attach_one(struct ioc4_driver_data *idd) if (ret) goto out4; - /* register port with the serial core - 1 rs232, 1 rs422 */ + /* register port with the serial core */ - if ((ret = ioc4_serial_core_attach(idd->idd_pdev, PROTO_RS232))) + if ((ret = ioc4_serial_core_attach(idd->idd_pdev))) 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: @@ -2894,6 +2735,52 @@ out1: } +/** + * ioc4_serial_remove_one - detach function + * + * @idd: IOC4 master module data for this IOC4 + */ + +int ioc4_serial_remove_one(struct ioc4_driver_data *idd) +{ + int ii; + struct ioc4_control *control; + struct uart_port *the_port; + struct ioc4_port *port; + struct ioc4_soft *soft; + + control = idd->idd_serial_data; + + 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); + idd->idd_serial_data = NULL; + + return 0; +} + static struct ioc4_submodule ioc4_serial_submodule = { .is_name = "IOC4_serial", .is_owner = THIS_MODULE, @@ -2909,15 +2796,9 @@ int ioc4_serial_init(void) int ret; /* register with serial core */ - if ((ret = uart_register_driver(&ioc4_uart_rs232)) < 0) { - printk(KERN_WARNING - "%s: Couldn't register rs232 IOC4 serial driver\n", - __FUNCTION__); - return ret; - } - if ((ret = uart_register_driver(&ioc4_uart_rs422)) < 0) { + if ((ret = uart_register_driver(&ioc4_uart)) < 0) { printk(KERN_WARNING - "%s: Couldn't register rs422 IOC4 serial driver\n", + "%s: Couldn't register IOC4 serial driver\n", __FUNCTION__); return ret; } @@ -2929,8 +2810,7 @@ int ioc4_serial_init(void) 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); + uart_unregister_driver(&ioc4_uart); } module_init(ioc4_serial_init); diff --git a/drivers/serial/ip22zilog.c b/drivers/serial/ip22zilog.c index 5ff269fb6..193722d68 100644 --- a/drivers/serial/ip22zilog.c +++ b/drivers/serial/ip22zilog.c @@ -12,6 +12,7 @@ * Copyright (C) 2002 Ralf Baechle (ralf@linux-mips.org) * Copyright (C) 2002 David S. Miller (davem@redhat.com) */ +#include #include #include #include @@ -966,9 +967,8 @@ static struct zilog_layout * __init get_zs(int chip) #define ZS_PUT_CHAR_MAX_DELAY 2000 /* 10 ms */ #ifdef CONFIG_SERIAL_IP22_ZILOG_CONSOLE -static void ip22zilog_put_char(struct uart_port *port, int ch) +static void ip22zilog_put_char(struct zilog_channel *channel, unsigned char ch) { - struct zilog_channel *channel = ZILOG_CHANNEL_FROM_PORT(port); int loops = ZS_PUT_CHAR_MAX_DELAY; /* This is a timed polling loop so do not switch the explicit @@ -992,10 +992,16 @@ static void ip22zilog_console_write(struct console *con, const char *s, unsigned int count) { struct uart_ip22zilog_port *up = &ip22zilog_port_table[con->index]; + struct zilog_channel *channel = ZILOG_CHANNEL_FROM_PORT(&up->port); unsigned long flags; + int i; spin_lock_irqsave(&up->port.lock, flags); - uart_console_write(&up->port, s, count, ip22zilog_put_char); + for (i = 0; i < count; i++, s++) { + ip22zilog_put_char(channel, *s); + if (*s == 10) + ip22zilog_put_char(channel, 13); + } udelay(2); spin_unlock_irqrestore(&up->port.lock, flags); } @@ -1084,6 +1090,7 @@ 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, @@ -1143,8 +1150,9 @@ 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 |= IP22ZILOG_FLAG_IS_CHANNEL_A; + up[(chip * 2) + 1].flags = 0; } } diff --git a/drivers/serial/jsm/jsm.h b/drivers/serial/jsm/jsm.h index 043f50b1d..dfc1e86d3 100644 --- a/drivers/serial/jsm/jsm.h +++ b/drivers/serial/jsm/jsm.h @@ -20,7 +20,7 @@ * * Contact Information: * Scott H Kilau - * Wendy Xiong + * Wendy Xiong * ***********************************************************************/ diff --git a/drivers/serial/jsm/jsm_driver.c b/drivers/serial/jsm/jsm_driver.c index 244f63be3..b1b66e71d 100644 --- a/drivers/serial/jsm/jsm_driver.c +++ b/drivers/serial/jsm/jsm_driver.c @@ -20,7 +20,7 @@ * * Contact Information: * Scott H Kilau - * Wendy Xiong + * Wendy Xiong * * ***********************************************************************/ @@ -121,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, - IRQF_DISABLED|IRQF_SHARED, "JSM", brd); + SA_INTERRUPT|SA_SHIRQ, "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_neo.c b/drivers/serial/jsm/jsm_neo.c index a5fc589d6..87e4e2cf8 100644 --- a/drivers/serial/jsm/jsm_neo.c +++ b/drivers/serial/jsm/jsm_neo.c @@ -20,7 +20,7 @@ * * Contact Information: * Scott H Kilau - * Wendy Xiong + * Wendy Xiong * ***********************************************************************/ #include /* For udelay */ diff --git a/drivers/serial/jsm/jsm_tty.c b/drivers/serial/jsm/jsm_tty.c index f8262e6ad..4d48b625c 100644 --- a/drivers/serial/jsm/jsm_tty.c +++ b/drivers/serial/jsm/jsm_tty.c @@ -142,14 +142,12 @@ 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); - termios = port->info->tty->termios; - if (ch == termios->c_cc[VSTART]) + if (ch == port->info->tty->termios->c_cc[VSTART]) channel->ch_bd->bd_ops->send_start_character(channel); - if (ch == termios->c_cc[VSTOP]) + if (ch == port->info->tty->termios->c_cc[VSTOP]) channel->ch_bd->bd_ops->send_stop_character(channel); spin_unlock_irqrestore(&port->lock, lock_flags); } @@ -180,7 +178,6 @@ 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; @@ -242,13 +239,12 @@ static int jsm_tty_open(struct uart_port *port) channel->ch_cached_lsr = 0; channel->ch_stops_sent = 0; - 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]; + 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]; /* Tell UART to init itself */ brd->bd_ops->uart_init(channel); @@ -588,6 +584,13 @@ void jsm_input(struct jsm_channel *ch) len = min(len, (N_TTY_BUF_SIZE - 1) - tp->read_cnt); ld = tty_ldisc_ref(tp); + /* + * If the DONT_FLIP flag is on, don't flush our buffer, and act + * like the ld doesn't have any space to put the data right now. + */ + if (test_bit(TTY_DONT_FLIP, &tp->flags)) + len = 0; + /* * If we were unable to get a reference to the ld, * don't flush our buffer, and act like the ld doesn't @@ -781,7 +784,6 @@ 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 */ @@ -807,7 +809,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)) { - bd_ops->disable_receiver(ch); + ch->ch_bd->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", @@ -817,7 +819,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) { - bd_ops->send_stop_character(ch); + ch->ch_bd->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); @@ -844,7 +846,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) { - bd_ops->enable_receiver(ch); + ch->ch_bd->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", @@ -854,7 +856,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; - bd_ops->send_start_character(ch); + ch->ch_bd->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 e7fe4bb46..242a04104 100644 --- a/drivers/serial/m32r_sio.c +++ b/drivers/serial/m32r_sio.c @@ -25,6 +25,7 @@ * 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 @@ -247,17 +248,17 @@ static void sio_error(int *status) #endif /* CONFIG_SERIAL_M32R_PLDSIO */ -static unsigned int sio_in(struct uart_sio_port *up, int offset) +static _INLINE_ unsigned int sio_in(struct uart_sio_port *up, int offset) { return __sio_in(up->port.iobase + offset); } -static void sio_out(struct uart_sio_port *up, int offset, int value) +static _INLINE_ void sio_out(struct uart_sio_port *up, int offset, int value) { __sio_out(value, up->port.iobase + offset); } -static unsigned int serial_in(struct uart_sio_port *up, int offset) +static _INLINE_ unsigned int serial_in(struct uart_sio_port *up, int offset) { if (!offset) return 0; @@ -265,7 +266,8 @@ static unsigned int serial_in(struct uart_sio_port *up, int offset) return __sio_in(offset); } -static void serial_out(struct uart_sio_port *up, int offset, int value) +static _INLINE_ void +serial_out(struct uart_sio_port *up, int offset, int value) { if (!offset) return; @@ -324,8 +326,8 @@ static void m32r_sio_enable_ms(struct uart_port *port) serial_out(up, UART_IER, up->ier); } -static void receive_chars(struct uart_sio_port *up, int *status, - struct pt_regs *regs) +static _INLINE_ void receive_chars(struct uart_sio_port *up, int *status, + struct pt_regs *regs) { struct tty_struct *tty = up->port.info->tty; unsigned char ch; @@ -398,7 +400,7 @@ static void receive_chars(struct uart_sio_port *up, int *status, tty_flip_buffer_push(tty); } -static void transmit_chars(struct uart_sio_port *up) +static _INLINE_ void transmit_chars(struct uart_sio_port *up) { struct circ_buf *xmit = &up->port.info->xmit; int count; @@ -542,7 +544,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 ? IRQF_SHARED : 0; + int ret, irq_flags = up->port.flags & UPF_SHARE_IRQ ? SA_SHIRQ : 0; spin_lock_irq(&i->lock); @@ -1037,14 +1039,6 @@ static inline void wait_for_xmitr(struct uart_sio_port *up) } } -static void m32r_sio_console_putchar(struct uart_port *port, int ch) -{ - struct uart_sio_port *up = (struct uart_sio_port *)port; - - wait_for_xmitr(up); - sio_out(up, SIOTXB, ch); -} - /* * Print a string to the serial port trying not to disturb * any possible real use of the port... @@ -1056,6 +1050,7 @@ static void m32r_sio_console_write(struct console *co, const char *s, { struct uart_sio_port *up = &m32r_sio_ports[co->index]; unsigned int ier; + int i; /* * First save the UER then disable the interrupts @@ -1063,7 +1058,23 @@ static void m32r_sio_console_write(struct console *co, const char *s, ier = sio_in(up, SIOTRCR); sio_out(up, SIOTRCR, 0); - uart_console_write(&up->port, s, count, m32r_sio_console_putchar); + /* + * 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, SIOTXB, *s); + + if (*s == 10) { + wait_for_xmitr(up); + sio_out(up, SIOTXB, 13); + } + } /* * Finally, wait for transmitter to become empty @@ -1130,6 +1141,7 @@ 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 849f1b2c2..7c3ec24f7 100644 --- a/drivers/serial/m32r_sio.h +++ b/drivers/serial/m32r_sio.h @@ -15,6 +15,7 @@ * (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 467147379..9c8645294 100644 --- a/drivers/serial/m32r_sio_reg.h +++ b/drivers/serial/m32r_sio_reg.h @@ -15,6 +15,7 @@ #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 832abd3c4..8cbbb954d 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) || defined(CONFIG_M5329EVB) +#elif defined(CONFIG_MOD5272) || defined(CONFIG_M5208EVB) #define CONSOLE_BAUD_RATE 115200 #define DEFAULT_CBAUD B115200 #elif defined(CONFIG_ARNEWSH) || defined(CONFIG_FREESCALE) || \ - defined(CONFIG_senTec) || defined(CONFIG_SNEHA) || defined(CONFIG_AVNET) + defined(CONFIG_senTec) || defined(CONFIG_SNEHA) #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_M532x) + defined(CONFIG_M520x) #define IRQBASE (MCFINT_VECBASE+MCFINT_UART0) #else #define IRQBASE 73 @@ -1545,28 +1545,6 @@ 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; @@ -1596,7 +1574,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, IRQF_DISABLED, + if (request_irq(info->irq, mcfrs_interrupt, SA_INTERRUPT, "ColdFire UART", NULL)) { printk("MCFRS: Unable to attach ColdFire UART %d interrupt " "vector=%d\n", info->line, info->irq); @@ -1713,6 +1691,7 @@ 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 56420e2cb..a2b28e862 100644 --- a/drivers/serial/mcfserial.h +++ b/drivers/serial/mcfserial.h @@ -14,6 +14,7 @@ #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 7708e5dd3..61dd17d7b 100644 --- a/drivers/serial/mpc52xx_uart.c +++ b/drivers/serial/mpc52xx_uart.c @@ -40,10 +40,11 @@ * 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 + * are parsing the kernel args console=ttyPSC?, we wouldn't know wich PSC it * will be mapped to. */ +#include #include #include #include @@ -190,7 +191,7 @@ mpc52xx_uart_startup(struct uart_port *port) /* Request IRQ */ ret = request_irq(port->irq, mpc52xx_uart_int, - IRQF_DISABLED | IRQF_SAMPLE_RANDOM, "mpc52xx_psc_uart", port); + SA_INTERRUPT | SA_SAMPLE_RANDOM, "mpc52xx_psc_uart", port); if (ret) return ret; @@ -602,14 +603,15 @@ mpc52xx_console_write(struct console *co, const char *s, unsigned int count) udelay(1); /* Write all the chars */ - for (i = 0; i < count; i++, s++) { - /* Line return handling */ - if (*s == '\n') - out_8(&psc->mpc52xx_psc_buffer_8, '\r'); - + for ( i=0 ; impc52xx_psc_buffer_8, *s); + /* Line return handling */ + if ( *s++ == '\n' ) + out_8(&psc->mpc52xx_psc_buffer_8, '\r'); + /* Wait the TX buffer to be empty */ j = 20000; /* Maximum wait */ while (!(in_be16(&psc->mpc52xx_psc_status) & @@ -692,6 +694,7 @@ static struct uart_driver mpc52xx_uart_driver = { .owner = THIS_MODULE, .driver_name = "mpc52xx_psc_uart", .dev_name = "ttyPSC", + .devfs_name = "ttyPSC", .major = SERIAL_PSC_MAJOR, .minor = SERIAL_PSC_MINOR, .nr = MPC52xx_PSC_MAXNUM, @@ -726,7 +729,8 @@ mpc52xx_uart_probe(struct platform_device *dev) spin_lock_init(&port->lock); port->uartclk = __res.bi_ipbfreq / 2; /* Look at CTLR doc */ - port->fifosize = 512; + port->fifosize = 255; /* Should be 512 ! But it can't be */ + /* stored in a unsigned char */ port->iotype = UPIO_MEM; port->flags = UPF_BOOT_AUTOCONF | ( uart_console(port) ? 0 : UPF_IOREMAP ); diff --git a/drivers/serial/mpsc.c b/drivers/serial/mpsc.c index 63d2a66e5..0ca83ac31 100644 --- a/drivers/serial/mpsc.c +++ b/drivers/serial/mpsc.c @@ -1,4 +1,6 @@ /* + * drivers/serial/mpsc.c + * * Generic driver for the MPSC (UART mode) on Marvell parts (e.g., GT64240, * GT64260, MV64340, MV64360, GT96100, ... ). * @@ -50,262 +52,9 @@ * 4) AFAICT, hardware flow control isn't supported by the controller --MAG. */ - -#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 +#include "mpsc.h" /* * Define how this driver is known to the outside (we've been assigned a @@ -314,6 +63,7 @@ struct mpsc_port_info *mpsc_device_remove(int index); #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" @@ -1412,10 +1162,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 = IRQF_SHARED; + flag = SA_SHIRQ; 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); @@ -1861,6 +1611,7 @@ static struct platform_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, diff --git a/drivers/serial/mux.c b/drivers/serial/mux.c index 4a1c9983f..868eaf4a1 100644 --- a/drivers/serial/mux.c +++ b/drivers/serial/mux.c @@ -16,6 +16,7 @@ ** */ +#include #include #include #include @@ -50,7 +51,7 @@ #define MUX_BREAK(status) ((status & 0xF000) == 0x2000) #define MUX_NR 256 -static unsigned int port_cnt __read_mostly; +static unsigned int port_cnt = 0; static struct uart_port mux_ports[MUX_NR]; static struct uart_driver mux_driver = { @@ -460,7 +461,7 @@ static int __init mux_probe(struct parisc_device *dev) port->iobase = 0; port->mapbase = dev->hpa.start + MUX_OFFSET + (i * MUX_LINE_OFFSET); - port->membase = ioremap_nocache(port->mapbase, MUX_LINE_OFFSET); + port->membase = ioremap(port->mapbase, MUX_LINE_OFFSET); port->iotype = UPIO_MEM; port->type = PORT_MUX; port->irq = NO_IRQ; diff --git a/drivers/serial/pmac_zilog.c b/drivers/serial/pmac_zilog.c index bfd2a2275..9b7ed58cb 100644 --- a/drivers/serial/pmac_zilog.c +++ b/drivers/serial/pmac_zilog.c @@ -42,6 +42,7 @@ #undef DEBUG_HARD #undef USE_CTRL_O_SYSRQ +#include #include #include @@ -100,6 +101,7 @@ 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, }; @@ -934,7 +936,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, IRQF_SHARED, "PowerMac Zilog", uap)) { + if (request_irq(uap->port.irq, pmz_interrupt, SA_SHIRQ, "PowerMac Zilog", uap)) { dev_err(&uap->dev->ofdev.dev, "Unable to register zs interrupt handler.\n"); pmz_set_scc_power(uap, 0); @@ -1443,8 +1445,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 = irq_of_parse_and_map(np, 1); - uap->rx_dma_irq = irq_of_parse_and_map(np, 2); + uap->tx_dma_irq = np->intrs[1].line; + uap->rx_dma_irq = np->intrs[2].line; } no_dma: @@ -1491,7 +1493,7 @@ no_dma: * Init remaining bits of "port" structure */ uap->port.iotype = UPIO_MEM; - uap->port.irq = irq_of_parse_and_map(np, 0); + uap->port.irq = np->intrs[0].line; uap->port.uartclk = ZS_CLOCK; uap->port.fifosize = 1; uap->port.ops = &pmz_pops; @@ -1914,16 +1916,6 @@ static void __exit exit_pmz(void) #ifdef CONFIG_SERIAL_PMACZILOG_CONSOLE -static void pmz_console_putchar(struct uart_port *port, int ch) -{ - struct uart_pmac_port *uap = (struct uart_pmac_port *)port; - - /* Wait for the transmit buffer to empty. */ - while ((read_zsreg(uap, R0) & Tx_BUF_EMP) == 0) - udelay(5); - write_zsdata(uap, ch); -} - /* * Print a string to the serial port trying not to disturb * any possible real use of the port... @@ -1932,6 +1924,7 @@ static void pmz_console_write(struct console *con, const char *s, unsigned int c { struct uart_pmac_port *uap = &pmz_ports[con->index]; unsigned long flags; + int i; if (ZS_IS_ASLEEP(uap)) return; @@ -1941,7 +1934,17 @@ static void pmz_console_write(struct console *con, const char *s, unsigned int c write_zsreg(uap, R1, uap->curregs[1] & ~TxINT_ENAB); write_zsreg(uap, R5, uap->curregs[5] | TxENABLE | RTS | DTR); - uart_console_write(&uap->port, s, count, pmz_console_putchar); + for (i = 0; i < count; i++) { + /* Wait for the transmit buffer to empty. */ + while ((read_zsreg(uap, R0) & Tx_BUF_EMP) == 0) + udelay(5); + write_zsdata(uap, s[i]); + if (s[i] == 10) { + while ((read_zsreg(uap, R0) & Tx_BUF_EMP) == 0) + udelay(5); + write_zsdata(uap, R13); + } + } /* Restore the values in the registers. */ write_zsreg(uap, R1, uap->curregs[1]); diff --git a/drivers/serial/pxa.c b/drivers/serial/pxa.c index a720953a4..10535f003 100644 --- a/drivers/serial/pxa.c +++ b/drivers/serial/pxa.c @@ -24,6 +24,7 @@ * with the serial core maintainer satisfaction to appear soon. */ +#include #if defined(CONFIG_SERIAL_PXA_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ) #define SUPPORT_SYSRQ @@ -268,6 +269,7 @@ 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; @@ -389,7 +391,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 occurring imminently + * are set via set_termios(), which will be occuring imminently * anyway, so we don't enable them here. */ up->ier = UART_IER_RLSI | UART_IER_RDI | UART_IER_RTOIE | UART_IER_UUE; @@ -617,14 +619,6 @@ static inline void wait_for_xmitr(struct uart_pxa_port *up) } } -static void serial_pxa_console_putchar(struct uart_port *port, int ch) -{ - struct uart_pxa_port *up = (struct uart_pxa_port *)port; - - wait_for_xmitr(up); - serial_out(up, UART_TX, ch); -} - /* * Print a string to the serial port trying not to disturb * any possible real use of the port... @@ -636,6 +630,7 @@ serial_pxa_console_write(struct console *co, const char *s, unsigned int count) { struct uart_pxa_port *up = &serial_pxa_ports[co->index]; unsigned int ier; + int i; /* * First save the IER then disable the interrupts @@ -643,7 +638,22 @@ serial_pxa_console_write(struct console *co, const char *s, unsigned int count) ier = serial_in(up, UART_IER); serial_out(up, UART_IER, UART_IER_UUE); - uart_console_write(&up->port, s, count, serial_pxa_console_putchar); + /* + * 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... + */ + serial_out(up, UART_TX, *s); + if (*s == 10) { + wait_for_xmitr(up); + serial_out(up, UART_TX, 13); + } + } /* * Finally, wait for transmitter to become empty @@ -779,6 +789,7 @@ 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 95738a19c..7410e093a 100644 --- a/drivers/serial/s3c2410.c +++ b/drivers/serial/s3c2410.c @@ -55,6 +55,7 @@ * BJD, 04-Nov-2004 */ +#include #if defined(CONFIG_SERIAL_S3C2410_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ) #define SUPPORT_SYSRQ @@ -148,6 +149,7 @@ 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 @@ -870,8 +872,6 @@ 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,6 +950,7 @@ 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, }; @@ -1065,8 +1066,6 @@ static int s3c24xx_serial_init_port(struct s3c24xx_uart_port *ourport, port->mapbase = res->start; port->membase = S3C24XX_VA_UART + (res->start - S3C24XX_PA_UART); port->irq = platform_get_irq(platdev, 0); - if (port->irq < 0) - port->irq = 0; ourport->clk = clk_get(&platdev->dev, "uart"); @@ -1364,7 +1363,7 @@ static inline void s3c2410_serial_exit(void) #endif /* CONFIG_CPU_S3C2410 */ -#if defined(CONFIG_CPU_S3C2440) || defined(CONFIG_CPU_S3C2442) +#ifdef CONFIG_CPU_S3C2440 static int s3c2440_serial_setsource(struct uart_port *port, struct s3c24xx_uart_clksrc *clk) @@ -1527,141 +1526,6 @@ 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) @@ -1676,7 +1540,6 @@ static int __init s3c24xx_serial_modinit(void) s3c2400_serial_init(); s3c2410_serial_init(); - s3c2412_serial_init(); s3c2440_serial_init(); return 0; @@ -1686,7 +1549,6 @@ 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); @@ -1721,20 +1583,26 @@ s3c24xx_serial_console_txrdy(struct uart_port *port, unsigned int ufcon) return (utrstat & S3C2410_UTRSTAT_TXE) ? 1 : 0; } -static void -s3c24xx_serial_console_putchar(struct uart_port *port, int ch) -{ - unsigned int ufcon = rd_regl(cons_uart, S3C2410_UFCON); - while (!s3c24xx_serial_console_txrdy(port, ufcon)) - barrier(); - wr_regb(cons_uart, S3C2410_UTXH, ch); -} - static void s3c24xx_serial_console_write(struct console *co, const char *s, unsigned int count) { - uart_console_write(cons_uart, s, count, s3c24xx_serial_console_putchar); + int i; + unsigned int ufcon = rd_regl(cons_uart, S3C2410_UFCON); + + for (i = 0; i < count; i++) { + while (!s3c24xx_serial_console_txrdy(cons_uart, ufcon)) + barrier(); + + wr_regb(cons_uart, S3C2410_UTXH, s[i]); + + if (s[i] == '\n') { + while (!s3c24xx_serial_console_txrdy(cons_uart, ufcon)) + barrier(); + + wr_regb(cons_uart, S3C2410_UTXH, '\r'); + } + } } static void __init @@ -1909,8 +1777,6 @@ 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; @@ -1934,4 +1800,4 @@ console_initcall(s3c24xx_serial_initconsole); MODULE_LICENSE("GPL"); MODULE_AUTHOR("Ben Dooks "); -MODULE_DESCRIPTION("Samsung S3C2410/S3C2440/S3C2412 Serial port driver"); +MODULE_DESCRIPTION("Samsung S3C2410/S3C2440 Serial port driver"); diff --git a/drivers/serial/sa1100.c b/drivers/serial/sa1100.c index db3486d33..2c00b8625 100644 --- a/drivers/serial/sa1100.c +++ b/drivers/serial/sa1100.c @@ -24,6 +24,7 @@ * $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 @@ -688,14 +689,6 @@ void __init sa1100_register_uart(int idx, int port) #ifdef CONFIG_SERIAL_SA1100_CONSOLE -static void sa1100_console_putchar(struct uart_port *port, int ch) -{ - struct sa1100_port *sport = (struct sa1100_port *)port; - - while (!(UART_GET_UTSR1(sport) & UTSR1_TNF)) - barrier(); - UART_PUT_CHAR(sport, ch); -} /* * Interrupts are disabled on entering @@ -704,7 +697,7 @@ static void sa1100_console_write(struct console *co, const char *s, unsigned int count) { struct sa1100_port *sport = &sa1100_ports[co->index]; - unsigned int old_utcr3, status; + unsigned int old_utcr3, status, i; /* * First, save UTCR3 and then disable interrupts @@ -713,7 +706,21 @@ sa1100_console_write(struct console *co, const char *s, unsigned int count) UART_PUT_UTCR3(sport, (old_utcr3 & ~(UTCR3_RIE | UTCR3_TIE)) | UTCR3_TXE); - uart_console_write(&sport->port, s, count, sa1100_console_putchar); + /* + * Now, do each character + */ + for (i = 0; i < count; i++) { + do { + status = UART_GET_UTSR1(sport); + } while (!(status & UTSR1_TNF)); + UART_PUT_CHAR(sport, s[i]); + if (s[i] == '\n') { + do { + status = UART_GET_UTSR1(sport); + } while (!(status & UTSR1_TNF)); + UART_PUT_CHAR(sport, '\r'); + } + } /* * Finally, wait for transmitter to become empty @@ -815,6 +822,7 @@ 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 c59dcb7a8..cc1faa31d 100644 --- a/drivers/serial/serial_core.c +++ b/drivers/serial/serial_core.c @@ -22,6 +22,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +#include #include #include #include @@ -49,12 +50,6 @@ */ 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)) @@ -696,8 +691,7 @@ 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 && - new_serial.xmit_fifo_size != port->fifosize) || + (new_serial.xmit_fifo_size != port->fifosize) || (((new_flags ^ old_flags) & ~UPF_USR_MASK) != 0)) goto exit; port->flags = ((port->flags & ~UPF_USR_MASK) | @@ -802,8 +796,7 @@ 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; - if (new_serial.xmit_fifo_size) - port->fifosize = 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; @@ -1507,18 +1500,20 @@ uart_block_til_ready(struct file *filp, struct uart_state *state) static struct uart_state *uart_get(struct uart_driver *drv, int line) { struct uart_state *state; - int ret = 0; + mutex_lock(&port_mutex); state = drv->state + line; if (mutex_lock_interruptible(&state->mutex)) { - ret = -ERESTARTSYS; - goto err; + state = ERR_PTR(-ERESTARTSYS); + goto out; } state->count++; - if (!state->port || state->port->flags & UPF_DEAD) { - ret = -ENXIO; - goto err_unlock; + if (!state->port) { + state->count--; + mutex_unlock(&state->mutex); + state = ERR_PTR(-ENXIO); + goto out; } if (!state->info) { @@ -1536,17 +1531,15 @@ static struct uart_state *uart_get(struct uart_driver *drv, int line) tasklet_init(&state->info->tlet, uart_tasklet_action, (unsigned long)state); } else { - ret = -ENOMEM; - goto err_unlock; + state->count--; + mutex_unlock(&state->mutex); + state = ERR_PTR(-ENOMEM); } } - return state; - err_unlock: - state->count--; - mutex_unlock(&state->mutex); - err: - return ERR_PTR(ret); + out: + mutex_unlock(&port_mutex); + return state; } /* @@ -1761,27 +1754,6 @@ static int uart_read_proc(char *page, char **start, off_t off, #endif #ifdef CONFIG_SERIAL_CORE_CONSOLE -/* - * uart_console_write - write a console message to a serial port - * @port: the port to write the message - * @s: array of characters - * @count: number of characters in string to write - * @write: function to write character to port - */ -void uart_console_write(struct uart_port *port, const char *s, - unsigned int count, - void (*putchar)(struct uart_port *, int)) -{ - unsigned int i; - - for (i = 0; i < count; i++, s++) { - if (*s == '\n') - putchar(port, '\r'); - putchar(port, *s); - } -} -EXPORT_SYMBOL_GPL(uart_console_write); - /* * Check whether an invalid uart number has been specified, and * if so, search for the first available port that does have @@ -1873,7 +1845,6 @@ 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)); @@ -1915,12 +1886,9 @@ uart_set_options(struct uart_port *port, struct console *co, static void uart_change_pm(struct uart_state *state, int pm_state) { struct uart_port *port = state->port; - - if (state->pm_state != pm_state) { - if (port->ops->pm) - port->ops->pm(port, pm_state, state->pm_state); - state->pm_state = pm_state; - } + if (port->ops->pm) + port->ops->pm(port, pm_state, state->pm_state); + state->pm_state = pm_state; } int uart_suspend_port(struct uart_driver *drv, struct uart_port *port) @@ -1932,9 +1900,6 @@ 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); @@ -1994,7 +1959,7 @@ int uart_resume_port(struct uart_driver *drv, struct uart_port *port) console_start(port->cons); } - if (state->info && state->info->flags & UIF_SUSPENDED) { + if (state->info && state->info->flags & UIF_INITIALIZED) { const struct uart_ops *ops = port->ops; int ret; @@ -2006,17 +1971,15 @@ 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); @@ -2041,7 +2004,6 @@ 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; @@ -2102,6 +2064,45 @@ uart_configure_port(struct uart_driver *drv, struct uart_state *state, } } +/* + * This reverses the effects of uart_configure_port, hanging up the + * port before removal. + */ +static void +uart_unconfigure_port(struct uart_driver *drv, struct uart_state *state) +{ + struct uart_port *port = state->port; + struct uart_info *info = state->info; + + if (info && info->tty) + tty_vhangup(info->tty); + + mutex_lock(&state->mutex); + + state->info = NULL; + + /* + * Free the port IO and memory resources, if any. + */ + if (port->type != PORT_UNKNOWN) + port->ops->release_port(port); + + /* + * Indicate that there isn't a port here anymore. + */ + port->type = PORT_UNKNOWN; + + /* + * Kill the tasklet, and free resources. + */ + if (info) { + tasklet_kill(&info->tlet); + kfree(info); + } + + mutex_unlock(&state->mutex); +} + static struct tty_operations uart_ops = { .open = uart_open, .close = uart_close, @@ -2167,6 +2168,7 @@ 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; @@ -2174,7 +2176,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_DYNAMIC_DEV; + normal->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_NO_DEVFS; normal->driver_state = drv; tty_set_operations(normal, &uart_ops); @@ -2247,7 +2249,6 @@ int uart_add_one_port(struct uart_driver *drv, struct uart_port *port) state = drv->state + port->line; mutex_lock(&port_mutex); - mutex_lock(&state->mutex); if (state->port) { ret = -EINVAL; goto out; @@ -2262,10 +2263,8 @@ 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); @@ -2284,13 +2283,7 @@ int uart_add_one_port(struct uart_driver *drv, struct uart_port *port) port->cons && !(port->cons->flags & CON_ENABLED)) register_console(port->cons); - /* - * Ensure UPF_DEAD is not set. - */ - port->flags &= ~UPF_DEAD; - out: - mutex_unlock(&state->mutex); mutex_unlock(&port_mutex); return ret; @@ -2308,7 +2301,6 @@ int uart_add_one_port(struct uart_driver *drv, struct uart_port *port) int uart_remove_one_port(struct uart_driver *drv, struct uart_port *port) { struct uart_state *state = drv->state + port->line; - struct uart_info *info; BUG_ON(in_interrupt()); @@ -2319,48 +2311,11 @@ int uart_remove_one_port(struct uart_driver *drv, struct uart_port *port) mutex_lock(&port_mutex); /* - * Mark the port "dead" - this prevents any opens from - * succeeding while we shut down the port. - */ - mutex_lock(&state->mutex); - port->flags |= UPF_DEAD; - mutex_unlock(&state->mutex); - - /* - * Remove the devices from the tty layer + * Remove the devices from devfs */ tty_unregister_device(drv->tty_driver, port->line); - info = state->info; - if (info && info->tty) - tty_vhangup(info->tty); - - /* - * All users of this port should now be disconnected from - * this driver, and the port shut down. We should be the - * only thread fiddling with this port from now on. - */ - state->info = NULL; - - /* - * Free the port IO and memory resources, if any. - */ - if (port->type != PORT_UNKNOWN) - port->ops->release_port(port); - - /* - * Indicate that there isn't a port here anymore. - */ - port->type = PORT_UNKNOWN; - - /* - * Kill the tasklet, and free resources. - */ - if (info) { - tasklet_kill(&info->tlet); - kfree(info); - } - + uart_unconfigure_port(drv, state); state->port = NULL; mutex_unlock(&port_mutex); @@ -2382,9 +2337,6 @@ 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 06a246ae5..c30333694 100644 --- a/drivers/serial/serial_cs.c +++ b/drivers/serial/serial_cs.c @@ -41,7 +41,6 @@ #include #include #include -#include #include #include #include @@ -98,13 +97,11 @@ static const struct multi_id multi_id[] = { #define MULTI_COUNT (sizeof(multi_id)/sizeof(struct multi_id)) struct serial_info { - struct pcmcia_device *p_dev; + dev_link_t link; int ndev; int multi; int slave; int manfid; - int prodid; - int c950ctrl; dev_node_t node[4]; int line[4]; }; @@ -116,36 +113,9 @@ struct serial_cfg_mem { }; -static int serial_config(struct pcmcia_device * link); +static void serial_config(dev_link_t * link); -static void wakeup_card(struct serial_info *info) -{ - int ctrl = info->c950ctrl; - - if (info->manfid == MANFID_OXSEMI) { - outb(12, ctrl + 1); - } else if (info->manfid == MANFID_POSSIO && info->prodid == PRODID_POSSIO_GCC) { - /* request_region? oxsemi branch does no request_region too... */ - /* This sequence is needed to properly initialize MC45 attached to OXCF950. - * I tried decreasing these msleep()s, but it worked properly (survived - * 1000 stop/start operations) with these timeouts (or bigger). */ - outb(0xA, ctrl + 1); - msleep(100); - outb(0xE, ctrl + 1); - msleep(300); - outb(0xC, ctrl + 1); - msleep(100); - outb(0xE, ctrl + 1); - msleep(200); - outb(0xF, ctrl + 1); - msleep(100); - outb(0xE, ctrl + 1); - msleep(100); - outb(0xC, ctrl + 1); - } -} - /*====================================================================== After a card is removed, serial_remove() will unregister @@ -153,44 +123,68 @@ static void wakeup_card(struct serial_info *info) ======================================================================*/ -static void serial_remove(struct pcmcia_device *link) +static void serial_remove(dev_link_t *link) { struct serial_info *info = link->priv; int i; + link->state &= ~DEV_PRESENT; + DEBUG(0, "serial_release(0x%p)\n", link); /* * Recheck to see if the device is still configured. */ - for (i = 0; i < info->ndev; i++) - serial8250_unregister_port(info->line[i]); + if (info->link.state & DEV_CONFIG) { + for (i = 0; i < info->ndev; i++) + serial8250_unregister_port(info->line[i]); - info->p_dev->dev_node = NULL; + info->link.dev = NULL; + + if (!info->slave) { + pcmcia_release_configuration(info->link.handle); + pcmcia_release_io(info->link.handle, &info->link.io); + pcmcia_release_irq(info->link.handle, &info->link.irq); + } - if (!info->slave) - pcmcia_disable_device(link); + info->link.state &= ~DEV_CONFIG; + } } -static int serial_suspend(struct pcmcia_device *link) +static int serial_suspend(struct pcmcia_device *dev) { - struct serial_info *info = link->priv; - int i; + dev_link_t *link = dev_to_instance(dev); + link->state |= DEV_SUSPEND; + + if (link->state & DEV_CONFIG) { + struct serial_info *info = link->priv; + int i; - for (i = 0; i < info->ndev; i++) - serial8250_suspend_port(info->line[i]); + for (i = 0; i < info->ndev; i++) + serial8250_suspend_port(info->line[i]); + + if (!info->slave) + pcmcia_release_configuration(link->handle); + } return 0; } -static int serial_resume(struct pcmcia_device *link) +static int serial_resume(struct pcmcia_device *dev) { - struct serial_info *info = link->priv; - int i; + dev_link_t *link = dev_to_instance(dev); + link->state &= ~DEV_SUSPEND; - for (i = 0; i < info->ndev; i++) - serial8250_resume_port(info->line[i]); - wakeup_card(info); + if (DEV_OK(link)) { + struct serial_info *info = link->priv; + int i; + + if (!info->slave) + pcmcia_request_configuration(link->handle, &link->conf); + + for (i = 0; i < info->ndev; i++) + serial8250_resume_port(info->line[i]); + } return 0; } @@ -203,9 +197,10 @@ static int serial_resume(struct pcmcia_device *link) ======================================================================*/ -static int serial_probe(struct pcmcia_device *link) +static int serial_probe(struct pcmcia_device *p_dev) { struct serial_info *info; + dev_link_t *link; DEBUG(0, "serial_attach()\n"); @@ -214,7 +209,7 @@ static int serial_probe(struct pcmcia_device *link) if (!info) return -ENOMEM; memset(info, 0, sizeof (*info)); - info->p_dev = link; + link = &info->link; link->priv = info; link->io.Attributes1 = IO_DATA_PATH_WIDTH_8; @@ -228,7 +223,12 @@ static int serial_probe(struct pcmcia_device *link) } link->conf.IntType = INT_MEMORY_AND_IO; - return serial_config(link); + link->handle = p_dev; + p_dev->instance = link; + link->state |= DEV_PRESENT | DEV_CONFIG_PENDING; + serial_config(link); + + return 0; } /*====================================================================== @@ -240,8 +240,9 @@ static int serial_probe(struct pcmcia_device *link) ======================================================================*/ -static void serial_detach(struct pcmcia_device *link) +static void serial_detach(struct pcmcia_device *p_dev) { + dev_link_t *link = dev_to_instance(p_dev); struct serial_info *info = link->priv; DEBUG(0, "serial_detach(0x%p)\n", link); @@ -262,7 +263,7 @@ static void serial_detach(struct pcmcia_device *link) /*====================================================================*/ -static int setup_serial(struct pcmcia_device *handle, struct serial_info * info, +static int setup_serial(client_handle_t handle, struct serial_info * info, kio_addr_t iobase, int irq) { struct uart_port port; @@ -297,7 +298,7 @@ static int setup_serial(struct pcmcia_device *handle, struct serial_info * info, /*====================================================================*/ static int -first_tuple(struct pcmcia_device *handle, tuple_t * tuple, cisparse_t * parse) +first_tuple(client_handle_t handle, tuple_t * tuple, cisparse_t * parse) { int i; i = pcmcia_get_first_tuple(handle, tuple); @@ -310,7 +311,7 @@ first_tuple(struct pcmcia_device *handle, tuple_t * tuple, cisparse_t * parse) } static int -next_tuple(struct pcmcia_device *handle, tuple_t * tuple, cisparse_t * parse) +next_tuple(client_handle_t handle, tuple_t * tuple, cisparse_t * parse) { int i; i = pcmcia_get_next_tuple(handle, tuple); @@ -324,10 +325,11 @@ next_tuple(struct pcmcia_device *handle, tuple_t * tuple, cisparse_t * parse) /*====================================================================*/ -static int simple_config(struct pcmcia_device *link) +static int simple_config(dev_link_t *link) { static const kio_addr_t base[5] = { 0x3f8, 0x2f8, 0x3e8, 0x2e8, 0x0 }; static const int size_table[2] = { 8, 16 }; + client_handle_t handle = link->handle; struct serial_info *info = link->priv; struct serial_cfg_mem *cfg_mem; tuple_t *tuple; @@ -348,7 +350,7 @@ static int simple_config(struct pcmcia_device *link) buf = cfg_mem->buf; /* If the card is already configured, look up the port and irq */ - i = pcmcia_get_configuration_info(link, &config); + i = pcmcia_get_configuration_info(handle, &config); if ((i == CS_SUCCESS) && (config.Attributes & CONF_VALID_CLIENT)) { kio_addr_t port = 0; if ((config.BasePort2 != 0) && (config.NumPorts2 == 8)) { @@ -361,9 +363,10 @@ static int simple_config(struct pcmcia_device *link) } if (info->slave) { kfree(cfg_mem); - return setup_serial(link, info, port, config.AssignedIRQ); + return setup_serial(handle, info, port, config.AssignedIRQ); } } + link->conf.Vcc = config.Vcc; /* First pass: look for a config entry that looks normal. */ tuple->TupleData = (cisdata_t *) buf; @@ -374,12 +377,12 @@ static int simple_config(struct pcmcia_device *link) /* Two tries: without IO aliases, then with aliases */ for (s = 0; s < 2; s++) { for (try = 0; try < 2; try++) { - i = first_tuple(link, tuple, parse); + i = first_tuple(handle, tuple, parse); while (i != CS_NO_MORE_ITEMS) { if (i != CS_SUCCESS) goto next_entry; if (cf->vpp1.present & (1 << CISTPL_POWER_VNOM)) - link->conf.Vpp = + link->conf.Vpp1 = link->conf.Vpp2 = cf->vpp1.param[CISTPL_POWER_VNOM] / 10000; if ((cf->io.nwin > 0) && (cf->io.win[0].len == size_table[s]) && (cf->io.win[0].base != 0)) { @@ -387,19 +390,19 @@ static int simple_config(struct pcmcia_device *link) link->io.BasePort1 = cf->io.win[0].base; link->io.IOAddrLines = (try == 0) ? 16 : cf->io.flags & CISTPL_IO_LINES_MASK; - i = pcmcia_request_io(link, &link->io); + i = pcmcia_request_io(link->handle, &link->io); if (i == CS_SUCCESS) goto found_port; } next_entry: - i = next_tuple(link, tuple, parse); + i = next_tuple(handle, tuple, parse); } } } /* Second pass: try to find an entry that isn't picky about its base address, then try to grab any standard serial port address, and finally try to get any free port. */ - i = first_tuple(link, tuple, parse); + i = first_tuple(handle, tuple, parse); while (i != CS_NO_MORE_ITEMS) { if ((i == CS_SUCCESS) && (cf->io.nwin > 0) && ((cf->io.flags & CISTPL_IO_LINES_MASK) <= 3)) { @@ -407,48 +410,50 @@ next_entry: for (j = 0; j < 5; j++) { link->io.BasePort1 = base[j]; link->io.IOAddrLines = base[j] ? 16 : 3; - i = pcmcia_request_io(link, &link->io); + i = pcmcia_request_io(link->handle, &link->io); if (i == CS_SUCCESS) goto found_port; } } - i = next_tuple(link, tuple, parse); + i = next_tuple(handle, tuple, parse); } found_port: if (i != CS_SUCCESS) { printk(KERN_NOTICE "serial_cs: no usable port range found, giving up\n"); - cs_error(link, RequestIO, i); + cs_error(link->handle, RequestIO, i); kfree(cfg_mem); return -1; } - i = pcmcia_request_irq(link, &link->irq); + i = pcmcia_request_irq(link->handle, &link->irq); if (i != CS_SUCCESS) { - cs_error(link, RequestIRQ, i); + cs_error(link->handle, RequestIRQ, i); link->irq.AssignedIRQ = 0; } if (info->multi && (info->manfid == MANFID_3COM)) link->conf.ConfigIndex &= ~(0x08); - i = pcmcia_request_configuration(link, &link->conf); + i = pcmcia_request_configuration(link->handle, &link->conf); if (i != CS_SUCCESS) { - cs_error(link, RequestConfiguration, i); + cs_error(link->handle, RequestConfiguration, i); kfree(cfg_mem); return -1; } kfree(cfg_mem); - return setup_serial(link, info, link->io.BasePort1, link->irq.AssignedIRQ); + return setup_serial(handle, info, link->io.BasePort1, link->irq.AssignedIRQ); } -static int multi_config(struct pcmcia_device * link) +static int multi_config(dev_link_t * link) { + client_handle_t handle = link->handle; struct serial_info *info = link->priv; struct serial_cfg_mem *cfg_mem; tuple_t *tuple; u_char *buf; cisparse_t *parse; cistpl_cftable_entry_t *cf; + config_info_t config; int i, rc, base2 = 0; cfg_mem = kmalloc(sizeof(struct serial_cfg_mem), GFP_KERNEL); @@ -459,6 +464,14 @@ static int multi_config(struct pcmcia_device * link) cf = &parse->cftable_entry; buf = cfg_mem->buf; + i = pcmcia_get_configuration_info(handle, &config); + if (i != CS_SUCCESS) { + cs_error(handle, GetConfigurationInfo, i); + rc = -1; + goto free_cfg_mem; + } + link->conf.Vcc = config.Vcc; + tuple->TupleData = (cisdata_t *) buf; tuple->TupleOffset = 0; tuple->TupleDataMax = 255; @@ -467,7 +480,7 @@ static int multi_config(struct pcmcia_device * link) /* First, look for a generic full-sized window */ link->io.NumPorts1 = info->multi * 8; - i = first_tuple(link, tuple, parse); + i = first_tuple(handle, tuple, parse); while (i != CS_NO_MORE_ITEMS) { /* The quad port cards have bad CIS's, so just look for a window larger than 8 ports and assume it will be right */ @@ -477,19 +490,19 @@ static int multi_config(struct pcmcia_device * link) link->io.BasePort1 = cf->io.win[0].base; link->io.IOAddrLines = cf->io.flags & CISTPL_IO_LINES_MASK; - i = pcmcia_request_io(link, &link->io); + i = pcmcia_request_io(link->handle, &link->io); base2 = link->io.BasePort1 + 8; if (i == CS_SUCCESS) break; } - i = next_tuple(link, tuple, parse); + i = next_tuple(handle, tuple, parse); } /* If that didn't work, look for two windows */ if (i != CS_SUCCESS) { link->io.NumPorts1 = link->io.NumPorts2 = 8; info->multi = 2; - i = first_tuple(link, tuple, parse); + i = first_tuple(handle, tuple, parse); while (i != CS_NO_MORE_ITEMS) { if ((i == CS_SUCCESS) && (cf->io.nwin == 2)) { link->conf.ConfigIndex = cf->index; @@ -497,26 +510,26 @@ static int multi_config(struct pcmcia_device * link) link->io.BasePort2 = cf->io.win[1].base; link->io.IOAddrLines = cf->io.flags & CISTPL_IO_LINES_MASK; - i = pcmcia_request_io(link, &link->io); + i = pcmcia_request_io(link->handle, &link->io); base2 = link->io.BasePort2; if (i == CS_SUCCESS) break; } - i = next_tuple(link, tuple, parse); + i = next_tuple(handle, tuple, parse); } } if (i != CS_SUCCESS) { - cs_error(link, RequestIO, i); + cs_error(link->handle, RequestIO, i); rc = -1; goto free_cfg_mem; } - i = pcmcia_request_irq(link, &link->irq); + i = pcmcia_request_irq(link->handle, &link->irq); if (i != CS_SUCCESS) { printk(KERN_NOTICE "serial_cs: no usable port range found, giving up\n"); - cs_error(link, RequestIRQ, i); + cs_error(link->handle, RequestIRQ, i); link->irq.AssignedIRQ = 0; } /* Socket Dual IO: this enables irq's for second port */ @@ -524,43 +537,35 @@ static int multi_config(struct pcmcia_device * link) link->conf.Present |= PRESENT_EXT_STATUS; link->conf.ExtStatus = ESR_REQ_ATTN_ENA; } - i = pcmcia_request_configuration(link, &link->conf); + i = pcmcia_request_configuration(link->handle, &link->conf); if (i != CS_SUCCESS) { - cs_error(link, RequestConfiguration, i); + cs_error(link->handle, RequestConfiguration, i); rc = -1; goto free_cfg_mem; } /* The Oxford Semiconductor OXCF950 cards are in fact single-port: - * 8 registers are for the UART, the others are extra registers. - * Siemen's MC45 PCMCIA (Possio's GCC) is OXCF950 based too. - */ - if (info->manfid == MANFID_OXSEMI || (info->manfid == MANFID_POSSIO && - info->prodid == PRODID_POSSIO_GCC)) { - int err; - + 8 registers are for the UART, the others are extra registers */ + if (info->manfid == MANFID_OXSEMI) { if (cf->index == 1 || cf->index == 3) { - err = setup_serial(link, info, base2, - link->irq.AssignedIRQ); - base2 = link->io.BasePort1; + setup_serial(handle, info, base2, link->irq.AssignedIRQ); + outb(12, link->io.BasePort1 + 1); } else { - err = setup_serial(link, info, link->io.BasePort1, - link->irq.AssignedIRQ); + setup_serial(handle, info, link->io.BasePort1, link->irq.AssignedIRQ); + outb(12, base2 + 1); } - info->c950ctrl = base2; - wakeup_card(info); rc = 0; goto free_cfg_mem; } - setup_serial(link, info, link->io.BasePort1, link->irq.AssignedIRQ); + setup_serial(handle, info, link->io.BasePort1, link->irq.AssignedIRQ); /* The Nokia cards are not really multiport cards */ if (info->manfid == MANFID_NOKIA) { rc = 0; goto free_cfg_mem; } for (i = 0; i < info->multi - 1; i++) - setup_serial(link, info, base2 + (8 * i), + setup_serial(handle, info, base2 + (8 * i), link->irq.AssignedIRQ); rc = 0; free_cfg_mem: @@ -576,8 +581,9 @@ free_cfg_mem: ======================================================================*/ -static int serial_config(struct pcmcia_device * link) +void serial_config(dev_link_t * link) { + client_handle_t handle = link->handle; struct serial_info *info = link->priv; struct serial_cfg_mem *cfg_mem; tuple_t *tuple; @@ -603,7 +609,7 @@ static int serial_config(struct pcmcia_device * link) tuple->Attributes = 0; /* Get configuration register information */ tuple->DesiredTuple = CISTPL_CONFIG; - last_ret = first_tuple(link, tuple, parse); + last_ret = first_tuple(handle, tuple, parse); if (last_ret != CS_SUCCESS) { last_fn = ParseTuple; goto cs_failed; @@ -611,16 +617,18 @@ static int serial_config(struct pcmcia_device * link) link->conf.ConfigBase = parse->config.base; link->conf.Present = parse->config.rmask[0]; + /* Configure card */ + link->state |= DEV_CONFIG; + /* Is this a compliant multifunction card? */ tuple->DesiredTuple = CISTPL_LONGLINK_MFC; tuple->Attributes = TUPLE_RETURN_COMMON | TUPLE_RETURN_LINK; - info->multi = (first_tuple(link, tuple, parse) == CS_SUCCESS); + info->multi = (first_tuple(handle, tuple, parse) == CS_SUCCESS); /* Is this a multiport card? */ tuple->DesiredTuple = CISTPL_MANFID; - if (first_tuple(link, tuple, parse) == CS_SUCCESS) { + if (first_tuple(handle, tuple, parse) == CS_SUCCESS) { info->manfid = parse->manfid.manf; - info->prodid = le16_to_cpu(buf[1]); for (i = 0; i < MULTI_COUNT; i++) if ((info->manfid == multi_id[i].manfid) && (parse->manfid.card == multi_id[i].prodid)) @@ -633,11 +641,11 @@ static int serial_config(struct pcmcia_device * link) multifunction cards that ask for appropriate IO port ranges */ tuple->DesiredTuple = CISTPL_FUNCID; if ((info->multi == 0) && - ((first_tuple(link, tuple, parse) != CS_SUCCESS) || + ((first_tuple(handle, tuple, parse) != CS_SUCCESS) || (parse->funcid.func == CISTPL_FUNCID_MULTI) || (parse->funcid.func == CISTPL_FUNCID_SERIAL))) { tuple->DesiredTuple = CISTPL_CFTABLE_ENTRY; - if (first_tuple(link, tuple, parse) == CS_SUCCESS) { + if (first_tuple(handle, tuple, parse) == CS_SUCCESS) { if ((cf->io.nwin == 1) && (cf->io.win[0].len % 8 == 0)) info->multi = cf->io.win[0].len >> 3; if ((cf->io.nwin == 2) && (cf->io.win[0].len == 8) && @@ -656,30 +664,31 @@ static int serial_config(struct pcmcia_device * link) if (info->manfid == MANFID_IBM) { conf_reg_t reg = { 0, CS_READ, 0x800, 0 }; - last_ret = pcmcia_access_configuration_register(link, ®); + last_ret = pcmcia_access_configuration_register(link->handle, ®); if (last_ret) { last_fn = AccessConfigurationRegister; goto cs_failed; } reg.Action = CS_WRITE; reg.Value = reg.Value | 1; - last_ret = pcmcia_access_configuration_register(link, ®); + last_ret = pcmcia_access_configuration_register(link->handle, ®); if (last_ret) { last_fn = AccessConfigurationRegister; goto cs_failed; } } - link->dev_node = &info->node[0]; + link->dev = &info->node[0]; + link->state &= ~DEV_CONFIG_PENDING; kfree(cfg_mem); - return 0; + return; cs_failed: - cs_error(link, last_fn, last_ret); + cs_error(link->handle, last_fn, last_ret); failed: serial_remove(link); + link->state &= ~DEV_CONFIG_PENDING; kfree(cfg_mem); - return -ENODEV; } static struct pcmcia_device_id serial_ids[] = { @@ -730,7 +739,6 @@ static struct pcmcia_device_id serial_ids[] = { PCMCIA_MFC_DEVICE_PROD_ID1(1, "Motorola MARQUIS", 0xf03e4e77), PCMCIA_MFC_DEVICE_PROD_ID2(1, "FAX/Modem/Ethernet Combo Card ", 0x1ed59302), PCMCIA_DEVICE_MANF_CARD(0x0089, 0x0301), - PCMCIA_DEVICE_MANF_CARD(0x00a4, 0x0276), PCMCIA_DEVICE_MANF_CARD(0x0101, 0x0039), PCMCIA_DEVICE_MANF_CARD(0x0104, 0x0006), PCMCIA_DEVICE_MANF_CARD(0x0105, 0x410a), @@ -749,7 +757,6 @@ static struct pcmcia_device_id serial_ids[] = { PCMCIA_DEVICE_PROD_ID14("MEGAHERTZ", "PCMCIA MODEM", 0xf510db04, 0xbd6c43ef), PCMCIA_DEVICE_PROD_ID124("TOSHIBA", "T144PF", "PCMCIA MODEM", 0xb4585a1a, 0x7271409c, 0xbd6c43ef), PCMCIA_DEVICE_PROD_ID123("FUJITSU", "FC14F ", "MBH10213", 0x6ee5a3d8, 0x30ead12b, 0xb00f05a0), - PCMCIA_DEVICE_PROD_ID123("Novatel Wireless", "Merlin UMTS Modem", "U630", 0x32607776, 0xd9e73b13, 0xe87332e), PCMCIA_DEVICE_PROD_ID13("MEGAHERTZ", "V.34 PCMCIA MODEM", 0xf510db04, 0xbb2cce4a), PCMCIA_DEVICE_PROD_ID12("Brain Boxes", "Bluetooth PC Card", 0xee138382, 0xd4ce9b02), PCMCIA_DEVICE_PROD_ID12("CIRRUS LOGIC", "FAX MODEM", 0xe625f451, 0xcecd6dfa), @@ -784,7 +791,6 @@ 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 23ddedbae..04186eaae 100644 --- a/drivers/serial/serial_lh7a40x.c +++ b/drivers/serial/serial_lh7a40x.c @@ -27,6 +27,7 @@ * */ +#include #if defined(CONFIG_SERIAL_LH7A40X_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ) #define SUPPORT_SYSRQ @@ -144,15 +145,14 @@ lh7a40xuart_rx_chars (struct uart_port* port) { struct tty_struct* tty = port->info->tty; int cbRxMax = 256; /* (Gross) limit on receive */ - unsigned int data; /* Received data and status */ - unsigned int flag; + unsigned int data, flag;/* Received data and status */ while (!(UR (port, UART_R_STATUS) & nRxRdy) && --cbRxMax) { data = UR (port, UART_R_DATA); flag = TTY_NORMAL; ++port->icount.rx; - if (unlikely(data & RxError)) { + if (unlikely(data & RxError)) { /* Quick check, short-circuit */ if (data & RxBreak) { data &= ~(RxFramingError | RxParityError); ++port->icount.brk; @@ -303,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); @@ -543,12 +543,6 @@ 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, @@ -562,7 +556,16 @@ 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 */ - uart_console_write(port, s, count, lh7a40xuart_console_putchar); + 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'; + } + } /* Wait until all characters are sent */ while (UR (port, UART_R_STATUS) & TxBusy) @@ -662,13 +665,9 @@ static int __init lh7a40xuart_init(void) if (ret == 0) { int 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; + for (i = 0; i < DEV_NR; i++) 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 b361669f8..ee98a867b 100644 --- a/drivers/serial/serial_txx9.c +++ b/drivers/serial/serial_txx9.c @@ -33,11 +33,8 @@ * 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 @@ -60,7 +57,7 @@ #include #include -static char *serial_version = "1.06"; +static char *serial_version = "1.04"; static char *serial_name = "TX39/49 Serial driver"; #define PASS_LIMIT 256 @@ -68,10 +65,12 @@ 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 @@ -95,8 +94,6 @@ static char *serial_name = "TX39/49 Serial driver"; #define UART_NR 4 #endif -#define HIGH_BITS_OFFSET ((sizeof(long)-sizeof(int))*8) - struct uart_txx9_port { struct uart_port port; @@ -213,7 +210,7 @@ static inline unsigned int sio_in(struct uart_txx9_port *up, int offset) { switch (up->port.iotype) { default: - return __raw_readl(up->port.membase + offset); + return *(volatile u32 *)(up->port.membase + offset); case UPIO_PORT: return inl(up->port.iobase + offset); } @@ -224,7 +221,7 @@ sio_out(struct uart_txx9_port *up, int offset, int value) { switch (up->port.iotype) { default: - __raw_writel(value, up->port.membase + offset); + *(volatile u32 *)(up->port.membase + offset) = value; break; case UPIO_PORT: outl(value, up->port.iobase + offset); @@ -262,19 +259,34 @@ sio_quot_set(struct uart_txx9_port *up, int quot) 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) { 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) @@ -290,16 +302,12 @@ 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 { 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))) { /* @@ -320,17 +328,8 @@ 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. @@ -350,7 +349,6 @@ 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); @@ -452,11 +450,14 @@ 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) @@ -480,7 +481,7 @@ static int serial_txx9_startup(struct uart_port *port) /* * Clear the FIFO buffers and disable them. - * (they will be reenabled in set_termios()) + * (they will be reeanbled in set_termios()) */ sio_set(up, TXX9_SIFCR, TXX9_SIFCR_TFRST | TXX9_SIFCR_RFRST | TXX9_SIFCR_FRSTE); @@ -495,7 +496,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, - IRQF_SHARED, "serial_txx9", up); + SA_SHIRQ, "serial_txx9", up); if (retval) return retval; @@ -783,14 +784,8 @@ 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) { - 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) + if (ser->irq < 0 || + ser->baud_base < 9600 || ser->type != PORT_TXX9) return -EINVAL; return 0; } @@ -832,8 +827,7 @@ static void __init serial_txx9_register_ports(struct uart_driver *drv) up->port.line = i; up->port.ops = &serial_txx9_pops; - if (up->port.iobase || up->port.mapbase) - uart_add_one_port(drv, &up->port); + uart_add_one_port(drv, &up->port); } } @@ -860,14 +854,6 @@ 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... @@ -879,6 +865,7 @@ 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 @@ -892,7 +879,22 @@ 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); - uart_console_write(&up->port, s, count, serial_txx9_console_putchar); + /* + * 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); + } + } /* * Finally, wait for transmitter to become empty @@ -924,6 +926,11 @@ 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. @@ -968,6 +975,7 @@ console_initcall(serial_txx9_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, @@ -1033,10 +1041,11 @@ static int __devinit serial_txx9_register_port(struct uart_port *port) mutex_lock(&serial_txx9_mutex); for (i = 0; i < UART_NR; i++) { uart = &serial_txx9_ports[i]; - if (!(uart->port.iobase || uart->port.mapbase)) + if (uart->port.type == PORT_UNKNOWN) break; } if (i < UART_NR) { + uart_remove_one_port(&serial_txx9_reg, &uart->port); uart->port.iobase = port->iobase; uart->port.membase = port->membase; uart->port.irq = port->irq; @@ -1071,8 +1080,9 @@ static void __devexit serial_txx9_unregister_port(int line) uart->port.type = PORT_UNKNOWN; uart->port.iobase = 0; uart->port.mapbase = 0; - uart->port.membase = NULL; + uart->port.membase = 0; uart->port.dev = NULL; + uart_add_one_port(&serial_txx9_reg, &uart->port); mutex_unlock(&serial_txx9_mutex); } @@ -1188,11 +1198,8 @@ 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++) { - 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); - } + for (i = 0; i < UART_NR; i++) + uart_remove_one_port(&serial_txx9_reg, &serial_txx9_ports[i].port); uart_unregister_driver(&serial_txx9_reg); } diff --git a/drivers/serial/sh-sci.c b/drivers/serial/sh-sci.c index cbede06ca..44f6bf79b 100644 --- a/drivers/serial/sh-sci.c +++ b/drivers/serial/sh-sci.c @@ -20,6 +20,7 @@ #undef DEBUG +#include #include #include #include @@ -841,7 +842,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, IRQF_DISABLED, + if (request_irq(port->irqs[0], sci_mpxed_interrupt, SA_INTERRUPT, "sci", port)) { printk(KERN_ERR "sci: Cannot allocate irq.\n"); return -ENODEV; @@ -850,7 +851,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], IRQF_DISABLED, + if (request_irq(port->irqs[i], handlers[i], SA_INTERRUPT, desc[i], port)) { printk(KERN_ERR "sci: Cannot allocate irq.\n"); return -ENODEV; @@ -1579,7 +1580,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_data.module_clock * 16; + port->uartclk = current_cpu_info.module_clock * 16; #else { struct clk *clk = clk_get("module_clk"); @@ -1698,6 +1699,9 @@ 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, @@ -1720,7 +1724,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_data.module_clock * 16; + sciport->port.uartclk = current_cpu_info.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 ab320fa32..1f14bb438 100644 --- a/drivers/serial/sh-sci.h +++ b/drivers/serial/sh-sci.h @@ -10,6 +10,7 @@ * 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 2f148e5b9..60ea4a3f0 100644 --- a/drivers/serial/sn_console.c +++ b/drivers/serial/sn_console.c @@ -37,6 +37,7 @@ * http://oss.sgi.com/projects/GenInfo/NoticeExplan */ +#include #include #include #include @@ -648,7 +649,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, - IRQF_DISABLED | IRQF_SHARED, + SA_INTERRUPT | SA_SHIRQ, "SAL console driver", port) >= 0) { return SGI_UART_VECTOR; } diff --git a/drivers/serial/suncore.c b/drivers/serial/suncore.c index e35d9ab35..fa4ae9424 100644 --- a/drivers/serial/suncore.c +++ b/drivers/serial/suncore.c @@ -10,6 +10,7 @@ * Copyright (C) 2002 David S. Miller (davem@redhat.com) */ +#include #include #include #include diff --git a/drivers/serial/sunsab.c b/drivers/serial/sunsab.c index cfe20f730..85664228a 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, 2006 David S. Miller (davem@davemloft.net) + * Copyright (C) 2002 David S. Miller (davem@redhat.com) * * Rewrote buffer handling to use CIRC(Circular Buffer) macros. * Maxim Krasnyanskiy @@ -12,9 +12,10 @@ * Theodore Ts'o , 2001-Oct-12 * * Ported to new 2.5.x UART layer. - * David S. Miller + * David S. Miller */ +#include #include #include #include @@ -36,8 +37,8 @@ #include #include -#include -#include +#include +#include #if defined(CONFIG_SERIAL_SUNZILOG_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ) #define SUPPORT_SYSRQ @@ -850,6 +851,7 @@ 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, }; @@ -859,9 +861,8 @@ static int num_channels; #ifdef CONFIG_SERIAL_SUNSAB_CONSOLE -static void sunsab_console_putchar(struct uart_port *port, int c) +static __inline__ void sunsab_console_putchar(struct uart_sunsab_port *up, char c) { - struct uart_sunsab_port *up = (struct uart_sunsab_port *)port; unsigned long flags; spin_lock_irqsave(&up->port.lock, flags); @@ -875,8 +876,13 @@ static void sunsab_console_putchar(struct uart_port *port, int c) static void sunsab_console_write(struct console *con, const char *s, unsigned n) { struct uart_sunsab_port *up = &sunsab_ports[con->index]; + int i; - uart_console_write(&up->port, s, n, sunsab_console_putchar); + for (i = 0; i < n; i++) { + if (*s == '\n') + sunsab_console_putchar(up, '\r'); + sunsab_console_putchar(up, *s++); + } sunsab_tec_wait(up); } @@ -886,15 +892,6 @@ 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); @@ -958,13 +955,14 @@ static struct console sunsab_console = { .index = -1, .data = &sunsab_reg, }; +#define SUNSAB_CONSOLE (&sunsab_console) -static inline struct console *SUNSAB_CONSOLE(void) +static void __init sunsab_console_init(void) { int i; if (con_is_present()) - return NULL; + return; for (i = 0; i < num_channels; i++) { int this_minor = sunsab_reg.minor + i; @@ -973,200 +971,208 @@ static inline struct console *SUNSAB_CONSOLE(void) break; } if (i == num_channels) - return NULL; + return; sunsab_console.index = i; - - return &sunsab_console; + register_console(&sunsab_console); } #else -#define SUNSAB_CONSOLE() (NULL) +#define SUNSAB_CONSOLE (NULL) #define sunsab_console_init() do { } while (0) #endif -static int __devinit sunsab_init_one(struct uart_sunsab_port *up, - struct of_device *op, - unsigned long offset, - int line) +static void __init for_each_sab_edev(void (*callback)(struct linux_ebus_device *, void *), void *arg) { - 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; - - up->port.irq = op->irqs[0]; + 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.fifosize = SAB82532_XMIT_FIFO_SIZE; - up->port.iotype = UPIO_MEM; +static void __init sab_count_callback(struct linux_ebus_device *edev, void *arg) +{ + int *count_p = arg; - writeb(SAB82532_IPC_IC_ACT_LOW, &up->regs->w.ipc); + (*count_p)++; +} - up->port.ops = &sunsab_pops; - up->port.type = PORT_SUNSAB; - up->port.uartclk = SAB_BASE_BAUD; +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; - 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); + /* 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->tec_timeout = SAB82532_MAX_TEC_TIMEOUT; - up->cec_timeout = SAB82532_MAX_CEC_TIMEOUT; + 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; - if (!(up->port.line & 0x01)) { - int err; + writeb(SAB82532_IPC_IC_ACT_LOW, &up->regs->w.ipc); - 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; - } + offset -= sizeof(union sab82532_async_regs); } - - return 0; + + (*instance_p)++; } -static int __devinit sab_probe(struct of_device *op, const struct of_device_id *match) +static int __init probe_for_sabs(void) { - 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; - } + int this_sab = 0; - uart_add_one_port(&sunsab_reg, &up[0].port); - uart_add_one_port(&sunsab_reg, &up[1].port); + /* Find device instances. */ + for_each_sab_edev(&sab_count_callback, &this_sab); + if (!this_sab) + return -ENODEV; - dev_set_drvdata(&op->dev, &up[0]); + /* Allocate tables. */ + sunsab_ports = kmalloc(sizeof(struct uart_sunsab_port) * this_sab * 2, + GFP_KERNEL); + if (!sunsab_ports) + return -ENOMEM; - inst++; + num_channels = this_sab * 2; + this_sab = 0; + for_each_sab_edev(&sab_attach_callback, &this_sab); return 0; } -static void __devexit sab_remove_one(struct uart_sunsab_port *up) +static void __init sunsab_init_hw(void) { - 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 __devexit sab_remove(struct of_device *op) -{ - struct uart_sunsab_port *up = dev_get_drvdata(&op->dev); + int i; - sab_remove_one(&up[0]); - sab_remove_one(&up[1]); + 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); - dev_set_drvdata(&op->dev, NULL); + up->tec_timeout = SAB82532_MAX_TEC_TIMEOUT; + up->cec_timeout = SAB82532_MAX_CEC_TIMEOUT; - return 0; + 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; + } + } + } } -static struct of_device_id sab_match[] = { - { - .name = "se", - }, - { - .name = "serial", - .compatible = "sab82532", - }, - {}, -}; -MODULE_DEVICE_TABLE(of, sab_match); - -static struct of_platform_driver sab_driver = { - .name = "sab", - .match_table = sab_match, - .probe = sab_probe, - .remove = __devexit_p(sab_remove), -}; - 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; - } + int ret = probe_for_sabs(); + int i; - if (num_channels) { - sunsab_ports = kzalloc(sizeof(struct uart_sunsab_port) * - num_channels, GFP_KERNEL); - if (!sunsab_ports) - return -ENOMEM; + if (ret < 0) + return ret; - sunsab_reg.minor = sunserial_current_minor; - sunsab_reg.nr = num_channels; + sunsab_init_hw(); - err = uart_register_driver(&sunsab_reg); - if (err) { - kfree(sunsab_ports); - sunsab_ports = NULL; + sunsab_reg.minor = sunserial_current_minor; + sunsab_reg.nr = num_channels; + sunsab_reg.cons = SUNSAB_CONSOLE; - return err; + ret = uart_register_driver(&sunsab_reg); + if (ret < 0) { + int i; + + for (i = 0; i < num_channels; i++) { + struct uart_sunsab_port *up = &sunsab_ports[i]; + + if (!(up->port.line & 0x01)) + free_irq(up->port.irq, up); + iounmap(up->regs); } + kfree(sunsab_ports); + sunsab_ports = NULL; + + return ret; + } + + sunserial_current_minor += num_channels; + + sunsab_console_init(); + + for (i = 0; i < num_channels; i++) { + struct uart_sunsab_port *up = &sunsab_ports[i]; - sunsab_reg.tty_driver->name_base = sunsab_reg.minor - 64; - sunsab_reg.cons = SUNSAB_CONSOLE(); - sunserial_current_minor += num_channels; + uart_add_one_port(&sunsab_reg, &up->port); } - return of_register_driver(&sab_driver, &of_bus_type); + return 0; } static void __exit sunsab_exit(void) { - of_unregister_driver(&sab_driver); - if (num_channels) { - sunserial_current_minor -= num_channels; - uart_unregister_driver(&sunsab_reg); + 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); } + 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 d3a5aeee7..4e453fa96 100644 --- a/drivers/serial/sunsu.c +++ b/drivers/serial/sunsu.c @@ -12,9 +12,10 @@ * Theodore Ts'o , 2001-Oct-12 * * Converted to new 2.5.x UART layer. - * David S. Miller (davem@davemloft.net), 2002-Jul-29 + * David S. Miller (davem@redhat.com), 2002-Jul-29 */ +#include #include #include #include @@ -39,8 +40,11 @@ #include #include -#include -#include +#include +#include +#ifdef CONFIG_SPARC64 +#include +#endif #if defined(CONFIG_SERIAL_SUNSU_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ) #define SUPPORT_SYSRQ @@ -90,15 +94,17 @@ struct uart_sunsu_port { /* Probing information. */ enum su_type su_type; unsigned int type_probed; /* XXX Stupid */ - unsigned long reg_size; + int port_node; #ifdef CONFIG_SERIO - struct serio serio; + struct serio *serio; int serio_open; #endif }; -static unsigned int serial_in(struct uart_sunsu_port *up, int offset) +#define _INLINE_ + +static _INLINE_ unsigned int serial_in(struct uart_sunsu_port *up, int offset) { offset <<= up->port.regshift; @@ -115,7 +121,8 @@ static unsigned int serial_in(struct uart_sunsu_port *up, int offset) } } -static void serial_out(struct uart_sunsu_port *up, int offset, int value) +static _INLINE_ void +serial_out(struct uart_sunsu_port *up, int offset, int value) { #ifndef CONFIG_SPARC64 /* @@ -309,7 +316,7 @@ static void sunsu_enable_ms(struct uart_port *port) spin_unlock_irqrestore(&up->port.lock, flags); } -static struct tty_struct * +static _INLINE_ struct tty_struct * receive_chars(struct uart_sunsu_port *up, unsigned char *status, struct pt_regs *regs) { struct tty_struct *tty = up->port.info->tty; @@ -388,7 +395,7 @@ receive_chars(struct uart_sunsu_port *up, unsigned char *status, struct pt_regs return tty; } -static void transmit_chars(struct uart_sunsu_port *up) +static _INLINE_ void transmit_chars(struct uart_sunsu_port *up) { struct circ_buf *xmit = &up->port.info->xmit; int count; @@ -424,7 +431,7 @@ static void transmit_chars(struct uart_sunsu_port *up) __stop_tx(up); } -static void check_modem_status(struct uart_sunsu_port *up) +static _INLINE_ void check_modem_status(struct uart_sunsu_port *up) { int status; @@ -505,7 +512,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); @@ -519,7 +526,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; }; @@ -637,7 +644,7 @@ static int sunsu_startup(struct uart_port *port) /* * Clear the FIFO buffers and disable them. - * (they will be reenabled in set_termios()) + * (they will be reeanbled in set_termios()) */ if (uart_config[up->port.type].flags & UART_CLEAR_FIFO) { serial_outp(up, UART_FCR, UART_FCR_ENABLE_FIFO); @@ -667,10 +674,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, - IRQF_SHARED, su_typev[up->su_type], up); + SA_SHIRQ, su_typev[up->su_type], up); } else { retval = request_irq(up->port.irq, sunsu_serial_interrupt, - IRQF_SHARED, su_typev[up->su_type], up); + SA_SHIRQ, su_typev[up->su_type], up); } if (retval) { printk("su: Cannot register IRQ %d\n", up->port.irq); @@ -1027,14 +1034,99 @@ 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->su_type == SU_PORT_NONE) + if (!up->port_node || !up->su_type) 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)) { @@ -1176,17 +1268,22 @@ 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) +static int __init sunsu_kbd_ms_init(struct uart_sunsu_port *up, int channel) { int quot, baud; #ifdef CONFIG_SERIO struct serio *serio; #endif + 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; @@ -1198,36 +1295,41 @@ static int __init sunsu_kbd_ms_init(struct uart_sunsu_port *up) sunsu_autoconfig(up); if (up->port.type == PORT_UNKNOWN) - return -ENODEV; + return -1; - 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); + 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)); #ifdef CONFIG_SERIO - serio = &up->serio; - serio->port_data = up; + up->serio = serio = kmalloc(sizeof(struct serio), GFP_KERNEL); + if (serio) { + memset(serio, 0, sizeof(*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 { - 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->port_data = up; - serio->write = sunsu_serio_write; - serio->open = sunsu_serio_open; - serio->close = sunsu_serio_close; - serio->dev.parent = up->port.dev; + 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->write = sunsu_serio_write; + serio->open = sunsu_serio_open; + serio->close = sunsu_serio_close; - serio_register_port(serio); + serio_register_port(serio); + } else { + printk(KERN_WARNING "su%d: not enough memory for serio port\n", + channel); + } #endif sunsu_change_speed(&up->port, up->cflag, 0, quot); @@ -1274,14 +1376,6 @@ static __inline__ void wait_for_xmitr(struct uart_sunsu_port *up) } } -static void sunsu_console_putchar(struct uart_port *port, int ch) -{ - struct uart_sunsu_port *up = (struct uart_sunsu_port *)port; - - wait_for_xmitr(up); - serial_out(up, UART_TX, ch); -} - /* * Print a string to the serial port trying not to disturb * any possible real use of the port... @@ -1291,6 +1385,7 @@ static void sunsu_console_write(struct console *co, const char *s, { struct uart_sunsu_port *up = &sunsu_ports[co->index]; unsigned int ier; + int i; /* * First save the UER then disable the interrupts @@ -1298,7 +1393,22 @@ static void sunsu_console_write(struct console *co, const char *s, ier = serial_in(up, UART_IER); serial_out(up, UART_IER, 0); - uart_console_write(&up->port, s, count, sunsu_console_putchar); + /* + * 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... + */ + serial_out(up, UART_TX, *s); + if (*s == 10) { + wait_for_xmitr(up); + serial_out(up, UART_TX, 13); + } + } /* * Finally, wait for transmitter to become empty @@ -1354,229 +1464,276 @@ static struct console sunsu_cons = { .index = -1, .data = &sunsu_reg, }; +#define SUNSU_CONSOLE (&sunsu_cons) /* * Register console. */ -static inline struct console *SUNSU_CONSOLE(int num_uart) +static int __init sunsu_serial_console_init(void) { int i; if (con_is_present()) - return NULL; + return 0; - for (i = 0; i < num_uart; i++) { + for (i = 0; i < UART_NR; i++) { int this_minor = sunsu_reg.minor + i; if ((this_minor - 64) == (serial_console - 1)) break; } - if (i == num_uart) - return NULL; + if (i == UART_NR) + return 0; + if (sunsu_ports[i].port_node == 0) + return 0; sunsu_cons.index = i; - - return &sunsu_cons; + register_console(&sunsu_cons); + return 0; } #else -#define SUNSU_CONSOLE(num_uart) (NULL) +#define SUNSU_CONSOLE (NULL) #define sunsu_serial_console_init() do { } while (0) #endif -static enum su_type __devinit su_get_type(struct device_node *dp) +static int __init sunsu_serial_init(void) { - struct device_node *ap = of_find_node_by_path("/aliases"); + int instance, ret, i; - if (ap) { - char *keyb = of_get_property(ap, "keyboard", NULL); - char *ms = of_get_property(ap, "mouse", NULL); + /* How many instances do we need? */ + instance = 0; + for (i = 0; i < UART_NR; i++) { + struct uart_sunsu_port *up = &sunsu_ports[i]; - 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; - } - } + if (up->su_type == SU_PORT_MS || + up->su_type == SU_PORT_KBD) + continue; - return SU_PORT_PORT; -} + up->port.flags |= UPF_BOOT_AUTOCONF; + up->port.type = PORT_UNKNOWN; + up->port.uartclk = (SU_BASE_BAUD * 16); -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_autoconfig(up); + if (up->port.type == PORT_UNKNOWN) + continue; - up->port.line = inst; - - spin_lock_init(&up->port.lock); + up->port.line = instance++; + up->port.ops = &sunsu_pops; + } - up->su_type = type; + sunsu_reg.minor = sunserial_current_minor; + 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.nr = instance; + sunsu_reg.cons = SUNSU_CONSOLE; - up->port.irq = op->irqs[0]; + ret = uart_register_driver(&sunsu_reg); + if (ret < 0) + return ret; - up->port.dev = &op->dev; + sunsu_serial_console_init(); + for (i = 0; i < UART_NR; i++) { + struct uart_sunsu_port *up = &sunsu_ports[i]; - up->port.type = PORT_UNKNOWN; - up->port.uartclk = (SU_BASE_BAUD * 16); + /* Do not register Keyboard/Mouse lines with UART + * layer. + */ + if (up->su_type == SU_PORT_MS || + up->su_type == SU_PORT_KBD) + 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); + if (up->port.type == PORT_UNKNOWN) + continue; - return 0; + uart_add_one_port(&sunsu_reg, &up->port); } - up->port.flags |= UPF_BOOT_AUTOCONF; - - sunsu_autoconfig(up); + return 0; +} - err = -ENODEV; - if (up->port.type == PORT_UNKNOWN) - goto out_unmap; +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; + } - up->port.ops = &sunsu_pops; + return 0; +} - err = uart_add_one_port(&sunsu_reg, &up->port); - if (err) - goto out_unmap; +#define SU_PROPSIZE 128 - dev_set_drvdata(&op->dev, up); +/* + * 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]; +}; - inst++; +/* + * 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; - return 0; + if (t->devices >= UART_NR) + return; -out_unmap: - of_iounmap(up->port.membase, up->reg_size); - return err; + 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)); + } + } } -static int __devexit su_remove(struct of_device *dev) +static int __init sunsu_probe(void) { - struct uart_sunsu_port *up = dev_get_drvdata(&dev->dev);; + int node; + int len; + struct su_probe_scan scan; - 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); - } - - dev_set_drvdata(&dev->dev, NULL); + /* + * First, we scan the tree. + */ + scan.devices = 0; + scan.msx = -1; + scan.kbx = -1; + scan.kbnode = 0; + scan.msnode = 0; - return 0; -} + /* + * 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); + } -static struct of_device_id su_match[] = { - { - .name = "su", - }, - { - .name = "su_pnp", - }, - { - .name = "serial", - .compatible = "su", - }, - {}, -}; -MODULE_DEVICE_TABLE(of, su_match); + len = prom_getproperty(node, "mouse", scan.prop, SU_PROPSIZE); + if (len > 0) { + scan.prop[len] = 0; + scan.msnode = prom_finddevice(scan.prop); + } + } -static struct of_platform_driver su_driver = { - .name = "su", - .match_table = su_match, - .probe = su_probe, - .remove = __devexit_p(su_remove), -}; + su_probe_any(&scan, prom_getchild(prom_root_node)); -static int num_uart; + /* + * 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 int __init sunsu_init(void) -{ - struct device_node *dp; - int err; + sunsu_ports[1].su_type = SU_PORT_KBD; + sunsu_ports[1].port_node = scan.kbnode; + sunsu_kbd_ms_init(&sunsu_ports[1], 1); - 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++; - } + return 0; } - 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); + if (scan.msx != -1 || scan.kbx != -1) { + printk("sunsu_probe: cannot match keyboard and mouse, confused\n"); + return -ENODEV; } - err = of_register_driver(&su_driver, &of_bus_type); - if (err && num_uart) - uart_unregister_driver(&sunsu_reg); + if (scan.devices == 0) + return -ENODEV; - return err; + /* + * Console must be initiated after the generic initialization. + */ + sunsu_serial_init(); + + return 0; } static void __exit sunsu_exit(void) { - if (num_uart) + 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) uart_unregister_driver(&sunsu_reg); } -module_init(sunsu_init); +module_init(sunsu_probe); 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 d34f336d5..5cc4d4c29 100644 --- a/drivers/serial/sunzilog.c +++ b/drivers/serial/sunzilog.c @@ -1,4 +1,5 @@ -/* sunzilog.c: Zilog serial driver for Sparc systems. +/* + * sunzilog.c * * Driver for Zilog serial chips found on Sun workstations and * servers. This driver could actually be made more generic. @@ -9,9 +10,10 @@ * C. Dost, Pete Zaitcev, Ted Ts'o and Alex Buell for their * work there. * - * Copyright (C) 2002, 2006 David S. Miller (davem@davemloft.net) + * Copyright (C) 2002 David S. Miller (davem@redhat.com) */ +#include #include #include #include @@ -36,8 +38,10 @@ #include #include -#include -#include +#ifdef CONFIG_SPARC64 +#include +#endif +#include #if defined(CONFIG_SERIAL_SUNZILOG_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ) #define SUPPORT_SYSRQ @@ -61,13 +65,16 @@ #define ZSDELAY() #define ZSDELAY_LONG() #define ZS_WSYNC(__channel) \ - readb(&((__channel)->control)) + sbus_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. */ @@ -100,7 +107,7 @@ struct uart_sunzilog_port { unsigned char prev_status; #ifdef CONFIG_SERIO - struct serio serio; + struct serio *serio; int serio_open; #endif }; @@ -131,9 +138,9 @@ static unsigned char read_zsreg(struct zilog_channel __iomem *channel, { unsigned char retval; - writeb(reg, &channel->control); + sbus_writeb(reg, &channel->control); ZSDELAY(); - retval = readb(&channel->control); + retval = sbus_readb(&channel->control); ZSDELAY(); return retval; @@ -142,9 +149,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) { - writeb(reg, &channel->control); + sbus_writeb(reg, &channel->control); ZSDELAY(); - writeb(value, &channel->control); + sbus_writeb(value, &channel->control); ZSDELAY(); } @@ -155,17 +162,17 @@ static void sunzilog_clear_fifo(struct zilog_channel __iomem *channel) for (i = 0; i < 32; i++) { unsigned char regval; - regval = readb(&channel->control); + regval = sbus_readb(&channel->control); ZSDELAY(); if (regval & Rx_CH_AV) break; regval = read_zsreg(channel, R1); - readb(&channel->data); + sbus_readb(&channel->data); ZSDELAY(); if (regval & (PAR_ERR | Rx_OVR | CRC_ERR)) { - writeb(ERR_RES, &channel->control); + sbus_writeb(ERR_RES, &channel->control); ZSDELAY(); ZS_WSYNC(channel); } @@ -187,7 +194,7 @@ static void __load_zsregs(struct zilog_channel __iomem *channel, unsigned char * udelay(100); } - writeb(ERR_RES, &channel->control); + sbus_writeb(ERR_RES, &channel->control); ZSDELAY(); ZS_WSYNC(channel); @@ -284,7 +291,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); @@ -299,7 +306,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; }; @@ -323,12 +330,12 @@ sunzilog_receive_chars(struct uart_sunzilog_port *up, r1 = read_zsreg(channel, R1); if (r1 & (PAR_ERR | Rx_OVR | CRC_ERR)) { - writeb(ERR_RES, &channel->control); + sbus_writeb(ERR_RES, &channel->control); ZSDELAY(); ZS_WSYNC(channel); } - ch = readb(&channel->control); + ch = sbus_readb(&channel->control); ZSDELAY(); /* This funny hack depends upon BRK_ABRT not interfering @@ -340,7 +347,7 @@ sunzilog_receive_chars(struct uart_sunzilog_port *up, if (!(ch & Rx_CH_AV)) break; - ch = readb(&channel->data); + ch = sbus_readb(&channel->data); ZSDELAY(); ch &= up->parity_mask; @@ -399,10 +406,10 @@ static void sunzilog_status_handle(struct uart_sunzilog_port *up, { unsigned char status; - status = readb(&channel->control); + status = sbus_readb(&channel->control); ZSDELAY(); - writeb(RES_EXT_INT, &channel->control); + sbus_writeb(RES_EXT_INT, &channel->control); ZSDELAY(); ZS_WSYNC(channel); @@ -414,7 +421,7 @@ static void sunzilog_status_handle(struct uart_sunzilog_port *up, * confusing the PROM. */ while (1) { - status = readb(&channel->control); + status = sbus_readb(&channel->control); ZSDELAY(); if (!(status & BRK_ABRT)) break; @@ -451,7 +458,7 @@ static void sunzilog_transmit_chars(struct uart_sunzilog_port *up, struct circ_buf *xmit; if (ZS_IS_CONS(up)) { - unsigned char status = readb(&channel->control); + unsigned char status = sbus_readb(&channel->control); ZSDELAY(); /* TX still busy? Just wait for the next TX done interrupt. @@ -480,7 +487,7 @@ static void sunzilog_transmit_chars(struct uart_sunzilog_port *up, if (up->port.x_char) { up->flags |= SUNZILOG_FLAG_TX_ACTIVE; - writeb(up->port.x_char, &channel->data); + sbus_writeb(up->port.x_char, &channel->data); ZSDELAY(); ZS_WSYNC(channel); @@ -499,7 +506,7 @@ static void sunzilog_transmit_chars(struct uart_sunzilog_port *up, goto ack_tx_int; up->flags |= SUNZILOG_FLAG_TX_ACTIVE; - writeb(xmit->buf[xmit->tail], &channel->data); + sbus_writeb(xmit->buf[xmit->tail], &channel->data); ZSDELAY(); ZS_WSYNC(channel); @@ -512,7 +519,7 @@ static void sunzilog_transmit_chars(struct uart_sunzilog_port *up, return; ack_tx_int: - writeb(RES_Tx_P, &channel->control); + sbus_writeb(RES_Tx_P, &channel->control); ZSDELAY(); ZS_WSYNC(channel); } @@ -533,7 +540,7 @@ static irqreturn_t sunzilog_interrupt(int irq, void *dev_id, struct pt_regs *reg /* Channel A */ tty = NULL; if (r3 & (CHAEXT | CHATxIP | CHARxIP)) { - writeb(RES_H_IUS, &channel->control); + sbus_writeb(RES_H_IUS, &channel->control); ZSDELAY(); ZS_WSYNC(channel); @@ -556,7 +563,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)) { - writeb(RES_H_IUS, &channel->control); + sbus_writeb(RES_H_IUS, &channel->control); ZSDELAY(); ZS_WSYNC(channel); @@ -587,7 +594,7 @@ static __inline__ unsigned char sunzilog_read_channel_status(struct uart_port *p unsigned char status; channel = ZILOG_CHANNEL_FROM_PORT(port); - status = readb(&channel->control); + status = sbus_readb(&channel->control); ZSDELAY(); return status; @@ -675,7 +682,7 @@ static void sunzilog_start_tx(struct uart_port *port) up->flags |= SUNZILOG_FLAG_TX_ACTIVE; up->flags &= ~SUNZILOG_FLAG_TX_STOPPED; - status = readb(&channel->control); + status = sbus_readb(&channel->control); ZSDELAY(); /* TX busy? Just wait for the TX done interrupt. */ @@ -686,7 +693,7 @@ static void sunzilog_start_tx(struct uart_port *port) * IRQ sending engine. */ if (port->x_char) { - writeb(port->x_char, &channel->data); + sbus_writeb(port->x_char, &channel->data); ZSDELAY(); ZS_WSYNC(channel); @@ -695,7 +702,7 @@ static void sunzilog_start_tx(struct uart_port *port) } else { struct circ_buf *xmit = &port->info->xmit; - writeb(xmit->buf[xmit->tail], &channel->data); + sbus_writeb(xmit->buf[xmit->tail], &channel->data); ZSDELAY(); ZS_WSYNC(channel); @@ -772,7 +779,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 = readb(&channel->control); + up->prev_status = sbus_readb(&channel->control); /* Enable receiver and transmitter. */ up->curregs[R3] |= RxENAB; @@ -956,7 +963,7 @@ sunzilog_set_termios(struct uart_port *port, struct termios *termios, static const char *sunzilog_type(struct uart_port *port) { - return "zs"; + return "SunZilog"; } /* We do not request/release mappings of the registers here, this @@ -1005,69 +1012,255 @@ 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 int __init sunzilog_alloc_tables(void) +static void * __init alloc_one_table(unsigned long size) { - struct uart_sunzilog_port *up; - unsigned long size; - int i; + void *ret; - size = NUM_CHANNELS * sizeof(struct uart_sunzilog_port); - sunzilog_port_table = kzalloc(size, GFP_KERNEL); - if (!sunzilog_port_table) - return -ENOMEM; + ret = kmalloc(size, GFP_KERNEL); + if (ret != NULL) + memset(ret, 0, size); - for (i = 0; i < NUM_CHANNELS; i++) { - up = &sunzilog_port_table[i]; + return ret; +} - spin_lock_init(&up->port.lock); +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(); + } +} - if (i == 0) - sunzilog_irq_chain = up; +#ifdef CONFIG_SPARC64 - if (i < NUM_CHANNELS - 1) - up->next = up + 1; - else - up->next = NULL; +/* 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) +{ + 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; - 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; + 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 0; + 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(); + } + + 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"); + + } else { + zsnode = node; + +#if 0 /* XXX When was this used? */ + if (prom_getintdefault(zsnode, "slave", -1) != chipid) { + zsnode = prom_getsibling(zsnode); + continue; + } +#endif + + /* + * "address" is only present on ports that OBP opened + * (from Mitch Bradley's "Hitchhiker's Guide to OBP"). + * We do not use it. + */ + + 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 (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(); + } + + return (struct zilog_layout __iomem *) mapped_addr; } +#endif /* !(CONFIG_SPARC64) */ -static void sunzilog_free_tables(void) +/* Get the address of the registers for SunZilog instance CHIP. */ +static struct zilog_layout __iomem * __init get_zs(int chip, int node) { - kfree(sunzilog_port_table); - sunzilog_irq_chain = NULL; - kfree(sunzilog_chip_regs); + 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 } #define ZS_PUT_CHAR_MAX_DELAY 2000 /* 10 ms */ -static void sunzilog_putchar(struct uart_port *port, int ch) +static void sunzilog_put_char(struct zilog_channel __iomem *channel, unsigned char ch) { - struct zilog_channel *channel = ZILOG_CHANNEL_FROM_PORT(port); int loops = ZS_PUT_CHAR_MAX_DELAY; /* This is a timed polling loop so do not switch the explicit * udelay with ZSDELAY as that is a NOP on some platforms. -DaveM */ do { - unsigned char val = readb(&channel->control); + unsigned char val = sbus_readb(&channel->control); if (val & Tx_BUF_EMP) { ZSDELAY(); break; @@ -1075,7 +1268,7 @@ static void sunzilog_putchar(struct uart_port *port, int ch) udelay(5); } while (--loops); - writeb(ch, &channel->data); + sbus_writeb(ch, &channel->data); ZSDELAY(); ZS_WSYNC(channel); } @@ -1091,7 +1284,7 @@ static int sunzilog_serio_write(struct serio *serio, unsigned char ch) spin_lock_irqsave(&sunzilog_serio_lock, flags); - sunzilog_putchar(&up->port, ch); + sunzilog_put_char(ZILOG_CHANNEL_FROM_PORT(&up->port), ch); spin_unlock_irqrestore(&sunzilog_serio_lock, flags); @@ -1132,10 +1325,16 @@ static void sunzilog_console_write(struct console *con, const char *s, unsigned int count) { struct uart_sunzilog_port *up = &sunzilog_port_table[con->index]; + struct zilog_channel *channel = ZILOG_CHANNEL_FROM_PORT(&up->port); unsigned long flags; + int i; spin_lock_irqsave(&up->port.lock, flags); - uart_console_write(&up->port, s, count, sunzilog_putchar); + for (i = 0; i < count; i++, s++) { + sunzilog_put_char(channel, *s); + if (*s == 10) + sunzilog_put_char(channel, 13); + } udelay(2); spin_unlock_irqrestore(&up->port.lock, flags); } @@ -1146,9 +1345,6 @@ 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); @@ -1194,13 +1390,14 @@ static struct console sunzilog_console = { .index = -1, .data = &sunzilog_reg, }; +#define SUNZILOG_CONSOLE (&sunzilog_console) -static inline struct console *SUNZILOG_CONSOLE(void) +static int __init sunzilog_console_init(void) { int i; if (con_is_present()) - return NULL; + return 0; for (i = 0; i < NUM_CHANNELS; i++) { int this_minor = sunzilog_reg.minor + i; @@ -1209,29 +1406,125 @@ static inline struct console *SUNZILOG_CONSOLE(void) break; } if (i == NUM_CHANNELS) - return NULL; + return 0; sunzilog_console.index = i; sunzilog_port_table[i].flags |= SUNZILOG_FLAG_IS_CONS; - - return &sunzilog_console; + register_console(&sunzilog_console); + return 0; } - #else -#define SUNZILOG_CONSOLE() (NULL) +#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 (up->flags & SUNZILOG_FLAG_CONS_KEYB) { + if (channel == KEYBOARD_LINE) { + 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); @@ -1241,290 +1534,217 @@ 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) +static void __init sunzilog_register_serio(struct uart_sunzilog_port *up, int channel) { - struct serio *serio = &up->serio; + struct serio *serio; - serio->port_data = up; + up->serio = serio = kmalloc(sizeof(struct serio), GFP_KERNEL); + if (serio) { + memset(serio, 0, sizeof(*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 { - 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->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)); - serio->write = sunzilog_serio_write; - serio->open = sunzilog_serio_open; - serio->close = sunzilog_serio_close; - serio->dev.parent = up->port.dev; + serio->write = sunzilog_serio_write; + serio->open = sunzilog_serio_open; + serio->close = sunzilog_serio_close; - serio_register_port(serio); + serio_register_port(serio); + } else { + printk(KERN_WARNING "zs%d: not enough memory for serio port\n", + channel); + } } #endif -static void __init sunzilog_init_hw(struct uart_sunzilog_port *up) +static void __init sunzilog_init_hw(void) { - struct zilog_channel __iomem *channel; - unsigned long flags; - int baud, brg; + int i; - channel = ZILOG_CHANNEL_FROM_PORT(&up->port); + 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; - 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); - } + spin_lock_irqsave(&up->port.lock, flags); - 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]); - } + if (ZS_IS_CHANNEL_A(up)) { + write_zsreg(channel, R9, FHWRES); + ZSDELAY_LONG(); + (void) read_zsreg(channel, R0); + } - spin_unlock_irqrestore(&up->port.lock, flags); + 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]); + } + + spin_unlock_irqrestore(&up->port.lock, flags); #ifdef CONFIG_SERIO - if (up->flags & (SUNZILOG_FLAG_CONS_KEYB | - SUNZILOG_FLAG_CONS_MOUSE)) - sunzilog_register_serio(up); + if (i == KEYBOARD_LINE || i == MOUSE_LINE) + sunzilog_register_serio(up, i); #endif + } } -static int zilog_irq = -1; +static struct zilog_layout __iomem * __init get_zs(int chip, int node); -static int __devinit zs_probe(struct of_device *op, const struct of_device_id *match) +static void __init sunzilog_scan_probe(struct zs_probe_scan *t, int node) { - static int inst; - struct uart_sunzilog_port *up; - struct zilog_layout __iomem *rp; - int keyboard_mouse; - int err; + sunzilog_chip_regs[t->devices] = get_zs(t->devices, node); + t->devices++; +} - 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]); - } +static int __init sunzilog_ports_init(void) +{ + struct zs_probe_scan scan; + int ret; + int uart_count; + int i; - dev_set_drvdata(&op->dev, &up[0]); + printk(KERN_DEBUG "SunZilog: %d chips.\n", NUM_SUNZILOG); - inst++; + scan.scanner = sunzilog_scan_probe; + scan.depth = 0; + scan.devices = 0; + sunzilog_scan(&scan, prom_getchild(prom_root_node)); - return 0; -} + sunzilog_prepare(); -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); -} + 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(); + } -static int __devexit zs_remove(struct of_device *dev) -{ - struct uart_sunzilog_port *up = dev_get_drvdata(&dev->dev); - struct zilog_layout __iomem *regs; + sunzilog_init_hw(); - zs_remove_one(&up[0]); - zs_remove_one(&up[1]); + /* 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]; - regs = sunzilog_chip_regs[up[0].port.line / 2]; - of_iounmap(regs, sizeof(struct zilog_layout)); + if (ZS_IS_KEYB(up) || ZS_IS_MOUSE(up)) + continue; - dev_set_drvdata(&dev->dev, NULL); + uart_count++; + } + + sunzilog_reg.nr = uart_count; + sunzilog_reg.cons = SUNZILOG_CONSOLE; - return 0; -} + sunzilog_reg.minor = sunserial_current_minor; + sunserial_current_minor += uart_count; -static struct of_device_id zs_match[] = { - { - .name = "zs", - }, - {}, -}; -MODULE_DEVICE_TABLE(of, zs_match); + ret = uart_register_driver(&sunzilog_reg); + if (ret == 0) { + sunzilog_console_init(); + for (i = 0; i < NUM_CHANNELS; i++) { + struct uart_sunzilog_port *up = &sunzilog_port_table[i]; -static struct of_platform_driver zs_driver = { - .name = "zs", - .match_table = zs_match, - .probe = zs_probe, - .remove = __devexit_p(zs_remove), -}; + if (ZS_IS_KEYB(up) || ZS_IS_MOUSE(up)) + continue; -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++; + if (uart_add_one_port(&sunzilog_reg, &up->port)) { + printk(KERN_ERR + "SunZilog: failed to add port zs%d\n", i); + } + } } - uart_count = 0; - if (NUM_SUNZILOG) { - int uart_count; + return ret; +} - err = sunzilog_alloc_tables(); - if (err) - goto out; +static void __init sunzilog_scan_count(struct zs_probe_scan *t, int node) +{ + t->devices++; +} - uart_count = (NUM_SUNZILOG * 2) - (2 * num_keybms); +static int __init sunzilog_ports_count(void) +{ + struct zs_probe_scan scan; - sunzilog_reg.nr = uart_count; - sunzilog_reg.minor = sunserial_current_minor; - err = uart_register_driver(&sunzilog_reg); - if (err) - goto out_free_tables; + /* Sun4 Zilog setup is hard coded, no probing to do. */ + if (sparc_cpu_model == sun4) + return 2; - sunzilog_reg.tty_driver->name_base = sunzilog_reg.minor - 64; - sunzilog_reg.cons = SUNZILOG_CONSOLE(); + scan.scanner = sunzilog_scan_count; + scan.depth = 0; + scan.devices = 0; - sunserial_current_minor += uart_count; - } + sunzilog_scan(&scan, prom_getchild(prom_root_node)); - err = of_register_driver(&zs_driver, &of_bus_type); - if (err) - goto out_unregister_uart; + return scan.devices; +} - if (zilog_irq != -1) { - err = request_irq(zilog_irq, sunzilog_interrupt, IRQF_SHARED, - "zs", sunzilog_irq_chain); - if (err) - goto out_unregister_driver; - } +static int __init sunzilog_init(void) +{ -out: - return err; + NUM_SUNZILOG = sunzilog_ports_count(); + if (NUM_SUNZILOG == 0) + return -ENODEV; -out_unregister_driver: - of_unregister_driver(&zs_driver); + sunzilog_alloc_tables(); -out_unregister_uart: - if (NUM_SUNZILOG) { - uart_unregister_driver(&sunzilog_reg); - sunzilog_reg.cons = NULL; - } + sunzilog_ports_init(); -out_free_tables: - sunzilog_free_tables(); - goto out; + return 0; } static void __exit sunzilog_exit(void) { - of_unregister_driver(&zs_driver); + int i; - if (zilog_irq != -1) { - free_irq(zilog_irq, sunzilog_irq_chain); - zilog_irq = -1; - } + for (i = 0; i < NUM_CHANNELS; i++) { + struct uart_sunzilog_port *up = &sunzilog_port_table[i]; - if (NUM_SUNZILOG) { - uart_unregister_driver(&sunzilog_reg); - sunzilog_free_tables(); + 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); } + + uart_unregister_driver(&sunzilog_reg); } module_init(sunzilog_init); @@ -1532,5 +1752,4 @@ 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 f802867c9..df705fda4 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, - IRQF_DISABLED, "v850e_uart", port); + SA_INTERRUPT, "v850e_uart", port); if (err) return err; /* Alloc TX irq. */ err = request_irq (V850E_UART_TX_IRQ (port->line), v850e_uart_tx_irq, - IRQF_DISABLED, "v850e_uart", port); + SA_INTERRUPT, "v850e_uart", port); if (err) { free_irq (V850E_UART_RX_IRQ (port->line), port); return err; @@ -468,6 +468,7 @@ 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 6c8b0ea83..d61494d18 100644 --- a/drivers/serial/vr41xx_siu.c +++ b/drivers/serial/vr41xx_siu.c @@ -19,6 +19,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +#include #if defined(CONFIG_SERIAL_VR41XX_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ) #define SUPPORT_SYSRQ @@ -38,7 +39,6 @@ #include #include -#include #include #include @@ -821,23 +821,25 @@ 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); - uart_console_write(port, s, count, siu_console_putchar); + 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'); + } + } wait_for_xmitr(port); siu_write(port, UART_IER, ier); @@ -911,12 +913,13 @@ 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 __devinit siu_probe(struct platform_device *dev) +static int siu_probe(struct platform_device *dev) { struct uart_port *port; int num, i, retval; @@ -950,7 +953,7 @@ static int __devinit siu_probe(struct platform_device *dev) return 0; } -static int __devexit siu_remove(struct platform_device *dev) +static int siu_remove(struct platform_device *dev) { struct uart_port *port; int i; @@ -1003,28 +1006,21 @@ static struct platform_device *siu_platform_device; static struct platform_driver siu_device_driver = { .probe = siu_probe, - .remove = __devexit_p(siu_remove), + .remove = siu_remove, .suspend = siu_suspend, .resume = siu_resume, .driver = { .name = "SIU", - .owner = THIS_MODULE, }, }; -static int __init vr41xx_siu_init(void) +static int __devinit vr41xx_siu_init(void) { int retval; - siu_platform_device = platform_device_alloc("SIU", -1); - if (!siu_platform_device) - return -ENOMEM; - - retval = platform_device_add(siu_platform_device); - if (retval < 0) { - platform_device_put(siu_platform_device); - return retval; - } + siu_platform_device = platform_device_register_simple("SIU", -1, NULL, 0); + if (IS_ERR(siu_platform_device)) + return PTR_ERR(siu_platform_device); retval = platform_driver_register(&siu_device_driver); if (retval < 0) @@ -1033,9 +1029,10 @@ static int __init vr41xx_siu_init(void) return retval; } -static void __exit vr41xx_siu_exit(void) +static void __devexit vr41xx_siu_exit(void) { 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 6c7e0352d..4bd05a007 100644 --- a/drivers/sn/ioc3.c +++ b/drivers/sn/ioc3.c @@ -7,10 +7,10 @@ * Pat Gefre - IOC3 serial port IRQ demuxer */ +#include #include #include #include -#include #include #include #include @@ -25,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 DEFINE_RWLOCK(ioc3_submodules_lock); +static rwlock_t ioc3_submodules_lock = RW_LOCK_UNLOCKED; /* NIC probing code */ @@ -619,9 +619,9 @@ static int ioc3_probe(struct pci_dev *pdev, const struct pci_device_id *pci_id) pci_set_master(pdev); #ifdef USE_64BIT_DMA - ret = pci_set_dma_mask(pdev, DMA_64BIT_MASK); + ret = pci_set_dma_mask(pdev, 0xffffffffffffffffULL); if (!ret) { - ret = pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK); + ret = pci_set_consistent_dma_mask(pdev, 0xffffffffffffffffULL); if (ret < 0) { printk(KERN_WARNING "%s: Unable to obtain 64 bit DMA " "for consistent allocations\n", @@ -706,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, IRQF_SHARED, + if (!request_irq(pdev->irq, ioc3_intr_eth, SA_SHIRQ, "ioc3-eth", (void *)idd)) { idd->irq_eth = pdev->irq; } else { @@ -714,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, IRQF_SHARED, + if (!request_irq(pdev->irq+2, ioc3_intr_io, SA_SHIRQ, "ioc3-io", (void *)idd)) { idd->irq_io = pdev->irq+2; } else { @@ -723,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, IRQF_SHARED, + if (!request_irq(pdev->irq, ioc3_intr_io, SA_SHIRQ, "ioc3", (void *)idd)) { idd->irq_io = pdev->irq; } else { diff --git a/drivers/sn/ioc4.c b/drivers/sn/ioc4.c index 8562821e6..771e86810 100644 --- a/drivers/sn/ioc4.c +++ b/drivers/sn/ioc4.c @@ -31,7 +31,7 @@ #include #include #include -#include +#include #include #include #include @@ -54,10 +54,11 @@ * Submodule management * ************************/ -static DEFINE_MUTEX(ioc4_mutex); - static LIST_HEAD(ioc4_devices); +static DECLARE_RWSEM(ioc4_devices_rwsem); + static LIST_HEAD(ioc4_submodules); +static DECLARE_RWSEM(ioc4_submodules_rwsem); /* Register an IOC4 submodule */ int @@ -65,13 +66,15 @@ ioc4_register_submodule(struct ioc4_submodule *is) { struct ioc4_driver_data *idd; - mutex_lock(&ioc4_mutex); + down_write(&ioc4_submodules_rwsem); list_add(&is->is_list, &ioc4_submodules); + up_write(&ioc4_submodules_rwsem); /* Initialize submodule for each IOC4 */ if (!is->is_probe) - goto out; + return 0; + down_read(&ioc4_devices_rwsem); list_for_each_entry(idd, &ioc4_devices, idd_list) { if (is->is_probe(idd)) { printk(KERN_WARNING @@ -81,8 +84,8 @@ ioc4_register_submodule(struct ioc4_submodule *is) pci_name(idd->idd_pdev)); } } - out: - mutex_unlock(&ioc4_mutex); + up_read(&ioc4_devices_rwsem); + return 0; } @@ -92,13 +95,15 @@ ioc4_unregister_submodule(struct ioc4_submodule *is) { struct ioc4_driver_data *idd; - mutex_lock(&ioc4_mutex); + down_write(&ioc4_submodules_rwsem); list_del(&is->is_list); + up_write(&ioc4_submodules_rwsem); /* Remove submodule for each IOC4 */ if (!is->is_remove) - goto out; + return; + down_read(&ioc4_devices_rwsem); list_for_each_entry(idd, &ioc4_devices, idd_list) { if (is->is_remove(idd)) { printk(KERN_WARNING @@ -108,8 +113,7 @@ ioc4_unregister_submodule(struct ioc4_submodule *is) pci_name(idd->idd_pdev)); } } - out: - mutex_unlock(&ioc4_mutex); + up_read(&ioc4_devices_rwsem); } /********************* @@ -160,6 +164,9 @@ ioc4_clock_calibrate(struct ioc4_driver_data *idd) writel(0, &idd->idd_misc_regs->int_out.raw); mmiowb(); + printk(KERN_INFO + "%s: Calibrating PCI bus speed " + "for pci_dev %s ... ", __FUNCTION__, pci_name(idd->idd_pdev)); /* Set up square wave */ int_out.raw = 0; int_out.fields.count = IOC4_CALIBRATE_COUNT; @@ -203,16 +210,11 @@ ioc4_clock_calibrate(struct ioc4_driver_data *idd) /* 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), + printk("failed. Assuming PCI clock ticks are %d ns.\n", 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), + printk("succeeded. PCI clock ticks are %ld ns.\n", period / IOC4_EXTINT_COUNT_DIVISOR); } @@ -224,51 +226,6 @@ ioc4_clock_calibrate(struct ioc4_driver_data *idd) 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) @@ -333,13 +290,6 @@ ioc4_probe(struct pci_dev *pdev, const struct pci_device_id *pci_id) /* 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, @@ -362,11 +312,12 @@ ioc4_probe(struct pci_dev *pdev, const struct pci_device_id *pci_id) /* Track PCI-device specific data */ idd->idd_serial_data = NULL; pci_set_drvdata(idd->idd_pdev, idd); - - mutex_lock(&ioc4_mutex); + down_write(&ioc4_devices_rwsem); list_add_tail(&idd->idd_list, &ioc4_devices); + up_write(&ioc4_devices_rwsem); /* Add this IOC4 to all submodules */ + down_read(&ioc4_submodules_rwsem); list_for_each_entry(is, &ioc4_submodules, is_list) { if (is->is_probe && is->is_probe(idd)) { printk(KERN_WARNING @@ -376,7 +327,7 @@ ioc4_probe(struct pci_dev *pdev, const struct pci_device_id *pci_id) pci_name(idd->idd_pdev)); } } - mutex_unlock(&ioc4_mutex); + up_read(&ioc4_submodules_rwsem); return 0; @@ -400,7 +351,7 @@ ioc4_remove(struct pci_dev *pdev) idd = pci_get_drvdata(pdev); /* Remove this IOC4 from all submodules */ - mutex_lock(&ioc4_mutex); + down_read(&ioc4_submodules_rwsem); list_for_each_entry(is, &ioc4_submodules, is_list) { if (is->is_remove && is->is_remove(idd)) { printk(KERN_WARNING @@ -410,7 +361,7 @@ ioc4_remove(struct pci_dev *pdev) pci_name(idd->idd_pdev)); } } - mutex_unlock(&ioc4_mutex); + up_read(&ioc4_submodules_rwsem); /* Release resources */ iounmap(idd->idd_misc_regs); @@ -426,9 +377,9 @@ ioc4_remove(struct pci_dev *pdev) pci_disable_device(pdev); /* Remove and free driver data */ - mutex_lock(&ioc4_mutex); + down_write(&ioc4_devices_rwsem); list_del(&idd->idd_list); - mutex_unlock(&ioc4_mutex); + up_write(&ioc4_devices_rwsem); kfree(idd); } @@ -438,7 +389,7 @@ static struct pci_device_id ioc4_id_table[] = { {0} }; -static struct pci_driver ioc4_driver = { +static struct pci_driver __devinitdata ioc4_driver = { .name = "IOC4", .id_table = ioc4_id_table, .probe = ioc4_probe, diff --git a/drivers/spi/Kconfig b/drivers/spi/Kconfig index 23334c8bc..7a75faeb0 100644 --- a/drivers/spi/Kconfig +++ b/drivers/spi/Kconfig @@ -75,45 +75,11 @@ config SPI_BUTTERFLY inexpensive battery powered microcontroller evaluation board. This same cable can be used to flash new firmware. -config SPI_MPC83xx - tristate "Freescale MPC83xx SPI controller" - depends on SPI_MASTER && PPC_83xx && EXPERIMENTAL - select SPI_BITBANG - help - This enables using the Freescale MPC83xx SPI controller in master - mode. - - Note, this driver uniquely supports the SPI controller on the MPC83xx - family of PowerPC processors. The MPC83xx uses a simple set of shift - registers for data (opposed to the CPM based descriptor model). - -config SPI_PXA2XX - tristate "PXA2xx SSP SPI master" - depends on SPI_MASTER && ARCH_PXA && EXPERIMENTAL - help - This enables using a PXA2xx SSP port as a SPI master controller. - The driver can be configured to use any SSP port and additional - documentation can be found a Documentation/spi/pxa2xx. - -config SPI_S3C24XX_GPIO - tristate "Samsung S3C24XX series SPI by GPIO" - depends on SPI_MASTER && ARCH_S3C2410 && SPI_BITBANG && EXPERIMENTAL - help - SPI driver for Samsung S3C24XX series ARM SoCs using - GPIO lines to provide the SPI bus. This can be used where - the inbuilt hardware cannot provide the transfer mode, or - where the board is using non hardware connected pins. # # Add new SPI master controllers in alphabetical order above this line # -config SPI_S3C24XX - tristate "Samsung S3C24XX series SPI" - depends on SPI_MASTER && ARCH_S3C2410 && EXPERIMENTAL - help - SPI driver for Samsung S3C24XX series ARM SoCs - # # There are lots of SPI device types, with sensors and memory # being probably the most widely used ones. diff --git a/drivers/spi/Makefile b/drivers/spi/Makefile index 8f4cb6799..c2c87e845 100644 --- a/drivers/spi/Makefile +++ b/drivers/spi/Makefile @@ -13,10 +13,6 @@ obj-$(CONFIG_SPI_MASTER) += spi.o # SPI master controller drivers (bus) obj-$(CONFIG_SPI_BITBANG) += spi_bitbang.o obj-$(CONFIG_SPI_BUTTERFLY) += spi_butterfly.o -obj-$(CONFIG_SPI_PXA2XX) += pxa2xx_spi.o -obj-$(CONFIG_SPI_MPC83xx) += spi_mpc83xx.o -obj-$(CONFIG_SPI_S3C24XX_GPIO) += spi_s3c24xx_gpio.o -obj-$(CONFIG_SPI_S3C24XX) += spi_s3c24xx.o # ... add above this line ... # SPI protocol drivers (device/link on bus) diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c index 146298ad7..94f5e8ed8 100644 --- a/drivers/spi/spi.c +++ b/drivers/spi/spi.c @@ -210,7 +210,6 @@ 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; @@ -339,18 +338,18 @@ static struct class spi_master_class = { * spi_alloc_master - allocate SPI master controller * @dev: the controller, possibly using the platform_bus * @size: how much driver-private data to preallocate; the pointer to this - * memory is in the class_data field of the returned class_device, + * memory is in the class_data field of the returned class_device, * accessible with spi_master_get_devdata(). * * This call is used only by SPI master controller drivers, which are the * only ones directly touching chip registers. It's how they allocate - * an spi_master structure, prior to calling spi_register_master(). + * an spi_master structure, prior to calling spi_add_master(). * * This must be called from context that can sleep. It returns the SPI * master structure on success, else NULL. * * The caller is responsible for assigning the bus number and initializing - * the master's methods before calling spi_register_master(); and (after errors + * the master's methods before calling spi_add_master(); and (after errors * adding the device) calling spi_master_put() to prevent a memory leak. */ struct spi_master * __init_or_module @@ -396,7 +395,7 @@ EXPORT_SYMBOL_GPL(spi_alloc_master); int __init_or_module spi_register_master(struct spi_master *master) { - static atomic_t dyn_bus_id = ATOMIC_INIT((1<<16) - 1); + static atomic_t dyn_bus_id = ATOMIC_INIT(0); struct device *dev = master->cdev.dev; int status = -ENODEV; int dynamic = 0; @@ -405,7 +404,7 @@ spi_register_master(struct spi_master *master) return -ENODEV; /* convention: dynamically assigned bus IDs count down from the max */ - if (master->bus_num < 0) { + if (master->bus_num == 0) { master->bus_num = atomic_dec_return(&dyn_bus_id); dynamic = 1; } @@ -510,7 +509,7 @@ static void spi_complete(void *arg) */ int spi_sync(struct spi_device *spi, struct spi_message *message) { - DECLARE_COMPLETION_ONSTACK(done); + DECLARE_COMPLETION(done); int status; message->complete = spi_complete; @@ -523,8 +522,7 @@ int spi_sync(struct spi_device *spi, struct spi_message *message) } EXPORT_SYMBOL_GPL(spi_sync); -/* portable code must never pass more than 32 bytes */ -#define SPI_BUFSIZ max(32,SMP_CACHE_BYTES) +#define SPI_BUFSIZ (SMP_CACHE_BYTES) static u8 *buf; diff --git a/drivers/spi/spi_bitbang.c b/drivers/spi/spi_bitbang.c index a23862ef7..f037e5593 100644 --- a/drivers/spi/spi_bitbang.c +++ b/drivers/spi/spi_bitbang.c @@ -16,6 +16,7 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +#include #include #include #include @@ -137,45 +138,6 @@ static unsigned bitbang_txrx_32( return t->len - count; } -int spi_bitbang_setup_transfer(struct spi_device *spi, struct spi_transfer *t) -{ - struct spi_bitbang_cs *cs = spi->controller_state; - u8 bits_per_word; - u32 hz; - - if (t) { - bits_per_word = t->bits_per_word; - hz = t->speed_hz; - } else { - bits_per_word = 0; - hz = 0; - } - - /* spi_transfer level calls that work per-word */ - if (!bits_per_word) - bits_per_word = spi->bits_per_word; - if (bits_per_word <= 8) - cs->txrx_bufs = bitbang_txrx_8; - else if (bits_per_word <= 16) - cs->txrx_bufs = bitbang_txrx_16; - else if (bits_per_word <= 32) - cs->txrx_bufs = bitbang_txrx_32; - else - return -EINVAL; - - /* nsecs = (clock period)/2 */ - if (!hz) - hz = spi->max_speed_hz; - if (hz) { - cs->nsecs = (1000000000/2) / hz; - if (cs->nsecs > (MAX_UDELAY_MS * 1000 * 1000)) - return -EINVAL; - } - - return 0; -} -EXPORT_SYMBOL_GPL(spi_bitbang_setup_transfer); - /** * spi_bitbang_setup - default setup for per-word I/O loops */ @@ -183,16 +145,8 @@ int spi_bitbang_setup(struct spi_device *spi) { struct spi_bitbang_cs *cs = spi->controller_state; struct spi_bitbang *bitbang; - int retval; - bitbang = spi_master_get_devdata(spi->master); - - /* REVISIT: some systems will want to support devices using lsb-first - * bit encodings on the wire. In pure software that would be trivial, - * just bitbang_txrx_le_cphaX() routines shifting the other way, and - * some hardware controllers also have this support. - */ - if ((spi->mode & SPI_LSB_FIRST) != 0) + if (!spi->max_speed_hz) return -EINVAL; if (!cs) { @@ -201,20 +155,32 @@ int spi_bitbang_setup(struct spi_device *spi) return -ENOMEM; spi->controller_state = cs; } + bitbang = spi_master_get_devdata(spi->master); if (!spi->bits_per_word) spi->bits_per_word = 8; + /* spi_transfer level calls that work per-word */ + if (spi->bits_per_word <= 8) + cs->txrx_bufs = bitbang_txrx_8; + else if (spi->bits_per_word <= 16) + cs->txrx_bufs = bitbang_txrx_16; + else if (spi->bits_per_word <= 32) + cs->txrx_bufs = bitbang_txrx_32; + else + return -EINVAL; + /* per-word shift register access, in hardware or bitbanging */ cs->txrx_word = bitbang->txrx_word[spi->mode & (SPI_CPOL|SPI_CPHA)]; if (!cs->txrx_word) return -EINVAL; - retval = spi_bitbang_setup_transfer(spi, NULL); - if (retval < 0) - return retval; + /* nsecs = (clock period)/2 */ + cs->nsecs = (1000000000/2) / (spi->max_speed_hz); + if (cs->nsecs > MAX_UDELAY_MS * 1000) + return -EINVAL; - dev_dbg(&spi->dev, "%s, mode %d, %u bits/w, %u nsec/bit\n", + dev_dbg(&spi->dev, "%s, mode %d, %u bits/w, %u nsec\n", __FUNCTION__, spi->mode & (SPI_CPOL | SPI_CPHA), spi->bits_per_word, 2 * cs->nsecs); @@ -280,8 +246,6 @@ static void bitbang_work(void *_bitbang) unsigned tmp; unsigned cs_change; int status; - int (*setup_transfer)(struct spi_device *, - struct spi_transfer *); m = container_of(bitbang->queue.next, struct spi_message, queue); @@ -298,7 +262,6 @@ static void bitbang_work(void *_bitbang) tmp = 0; cs_change = 1; status = 0; - setup_transfer = NULL; list_for_each_entry (t, &m->transfers, transfer_list) { if (bitbang->shutdown) { @@ -306,20 +269,6 @@ static void bitbang_work(void *_bitbang) break; } - /* override or restore speed and wordsize */ - if (t->speed_hz || t->bits_per_word) { - setup_transfer = bitbang->setup_transfer; - if (!setup_transfer) { - status = -ENOPROTOOPT; - break; - } - } - if (setup_transfer) { - status = setup_transfer(spi, t); - if (status < 0) - break; - } - /* set up default clock polarity, and activate chip; * this implicitly updates clock and spi modes as * previously recorded for this device via setup(). @@ -376,10 +325,6 @@ static void bitbang_work(void *_bitbang) m->status = status; m->complete(m->context); - /* restore speed and wordsize */ - if (setup_transfer) - setup_transfer(spi, NULL); - /* normally deactivate chipselect ... unless no error and * cs_change has hinted that the next message will probably * be for this chip too. @@ -403,7 +348,6 @@ int spi_bitbang_transfer(struct spi_device *spi, struct spi_message *m) { struct spi_bitbang *bitbang; unsigned long flags; - int status = 0; m->actual_length = 0; m->status = -EINPROGRESS; @@ -413,15 +357,11 @@ int spi_bitbang_transfer(struct spi_device *spi, struct spi_message *m) return -ESHUTDOWN; spin_lock_irqsave(&bitbang->lock, flags); - if (!spi->max_speed_hz) - status = -ENETDOWN; - else { - list_add_tail(&m->queue, &bitbang->queue); - queue_work(bitbang->workqueue, &bitbang->work); - } + list_add_tail(&m->queue, &bitbang->queue); + queue_work(bitbang->workqueue, &bitbang->work); spin_unlock_irqrestore(&bitbang->lock, flags); - return status; + return 0; } EXPORT_SYMBOL_GPL(spi_bitbang_transfer); @@ -466,9 +406,6 @@ int spi_bitbang_start(struct spi_bitbang *bitbang) bitbang->use_dma = 0; bitbang->txrx_bufs = spi_bitbang_bufs; if (!bitbang->master->setup) { - if (!bitbang->setup_transfer) - bitbang->setup_transfer = - spi_bitbang_setup_transfer; bitbang->master->setup = spi_bitbang_setup; bitbang->master->cleanup = spi_bitbang_cleanup; } diff --git a/drivers/spi/spi_butterfly.c b/drivers/spi/spi_butterfly.c index 39d9b20f2..ff9e5faa4 100644 --- a/drivers/spi/spi_butterfly.c +++ b/drivers/spi/spi_butterfly.c @@ -17,6 +17,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +#include #include #include #include @@ -320,7 +321,6 @@ static void butterfly_attach(struct parport *p) * (firmware resets at45, acts as spi slave) or neither (we ignore * both, AVR uses AT45). Here we expect firmware for the first option. */ - pp->info[0].max_speed_hz = 15 * 1000 * 1000; strcpy(pp->info[0].modalias, "mtd_dataflash"); pp->info[0].platform_data = &flash; diff --git a/drivers/tc/lk201.c b/drivers/tc/lk201.c index 757dec9c7..cf10d5cdf 100644 --- a/drivers/tc/lk201.c +++ b/drivers/tc/lk201.c @@ -8,6 +8,7 @@ * 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 5e8a27620..6756d0fab 100644 --- a/drivers/tc/zs.c +++ b/drivers/tc/zs.c @@ -39,6 +39,7 @@ * is shared with DSRS(DTE) at pin 23. */ +#include #include #include #include @@ -185,6 +186,8 @@ static struct tty_driver *serial_driver; #define RS_STROBE_TIME 10 #define RS_ISR_PASS_LIMIT 256 +#define _INLINE_ inline + static void probe_sccs(void); static void change_speed(struct dec_serial *info); static void rs_wait_until_sent(struct tty_struct *tty, int timeout); @@ -341,13 +344,14 @@ static inline void rs_recv_clear(struct dec_zschannel *zsc) * This routine is used by the interrupt handler to schedule * processing in the software interrupt portion of the driver. */ -static void rs_sched_event(struct dec_serial *info, int event) +static _INLINE_ void rs_sched_event(struct dec_serial *info, int event) { info->event |= 1 << event; tasklet_schedule(&info->tlet); } -static void receive_chars(struct dec_serial *info, struct pt_regs *regs) +static _INLINE_ void receive_chars(struct dec_serial *info, + struct pt_regs *regs) { struct tty_struct *tty = info->tty; unsigned char ch, stat, flag; @@ -437,7 +441,7 @@ static void transmit_chars(struct dec_serial *info) rs_sched_event(info, RS_EVENT_WRITE_WAKEUP); } -static void status_handle(struct dec_serial *info) +static _INLINE_ void status_handle(struct dec_serial *info) { unsigned char stat; @@ -1744,6 +1748,7 @@ 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; @@ -1752,7 +1757,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_DYNAMIC_DEV; + serial_driver->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_NO_DEVFS; tty_set_operations(serial_driver, &serial_ops); if (tty_register_driver(serial_driver)) @@ -1791,7 +1796,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, IRQF_SHARED, + if (request_irq(zs_soft[channel].irq, rs_interrupt, SA_SHIRQ, "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 f6b2948ab..5578a9dd0 100644 --- a/drivers/telephony/ixj.c +++ b/drivers/telephony/ixj.c @@ -5712,7 +5712,7 @@ static int ixj_daa_write(IXJ *j) return 1; } -static int ixj_set_tone_off(unsigned short arg, IXJ *j) +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/ixj.h b/drivers/telephony/ixj.h index fbea4541c..8d69bcdc2 100644 --- a/drivers/telephony/ixj.h +++ b/drivers/telephony/ixj.h @@ -1295,7 +1295,7 @@ typedef struct { Proc_Info_Type Info_write; unsigned short frame_count; unsigned int filter_hist[4]; - unsigned char filter_en[4]; + unsigned char filter_en[6]; unsigned short proc_load; unsigned long framesread; unsigned long frameswritten; diff --git a/drivers/telephony/ixj_pcmcia.c b/drivers/telephony/ixj_pcmcia.c index dda0ca45d..d3a7b0c3d 100644 --- a/drivers/telephony/ixj_pcmcia.c +++ b/drivers/telephony/ixj_pcmcia.c @@ -35,52 +35,73 @@ typedef struct ixj_info_t { } ixj_info_t; static void ixj_detach(struct pcmcia_device *p_dev); -static int ixj_config(struct pcmcia_device * link); -static void ixj_cs_release(struct pcmcia_device * link); +static void ixj_config(dev_link_t * link); +static void ixj_cs_release(dev_link_t * link); -static int ixj_probe(struct pcmcia_device *p_dev) +static int ixj_attach(struct pcmcia_device *p_dev) { + dev_link_t *link; + DEBUG(0, "ixj_attach()\n"); /* Create new ixj device */ - p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_8; - p_dev->io.Attributes2 = IO_DATA_PATH_WIDTH_8; - p_dev->io.IOAddrLines = 3; - p_dev->conf.IntType = INT_MEMORY_AND_IO; - p_dev->priv = kmalloc(sizeof(struct ixj_info_t), GFP_KERNEL); - if (!p_dev->priv) { + link = kmalloc(sizeof(struct dev_link_t), GFP_KERNEL); + if (!link) + return -ENOMEM; + memset(link, 0, sizeof(struct dev_link_t)); + link->io.Attributes1 = IO_DATA_PATH_WIDTH_8; + link->io.Attributes2 = IO_DATA_PATH_WIDTH_8; + link->io.IOAddrLines = 3; + link->conf.Vcc = 50; + link->conf.IntType = INT_MEMORY_AND_IO; + link->priv = kmalloc(sizeof(struct ixj_info_t), GFP_KERNEL); + if (!link->priv) { + kfree(link); return -ENOMEM; } - memset(p_dev->priv, 0, sizeof(struct ixj_info_t)); + memset(link->priv, 0, sizeof(struct ixj_info_t)); + + link->handle = p_dev; + p_dev->instance = link; - return ixj_config(p_dev); + link->state |= DEV_PRESENT | DEV_CONFIG_PENDING; + ixj_config(link); + + return 0; } -static void ixj_detach(struct pcmcia_device *link) +static void ixj_detach(struct pcmcia_device *p_dev) { + dev_link_t *link = dev_to_instance(p_dev); + DEBUG(0, "ixj_detach(0x%p)\n", link); - ixj_cs_release(link); + link->state &= ~DEV_RELEASE_PENDING; + if (link->state & DEV_CONFIG) + ixj_cs_release(link); kfree(link->priv); + kfree(link); } #define CS_CHECK(fn, ret) \ do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0) -static void ixj_get_serial(struct pcmcia_device * link, IXJ * j) +static void ixj_get_serial(dev_link_t * link, IXJ * j) { + client_handle_t handle; tuple_t tuple; u_short buf[128]; char *str; int last_ret, last_fn, i, place; + handle = link->handle; DEBUG(0, "ixj_get_serial(0x%p)\n", link); tuple.TupleData = (cisdata_t *) buf; tuple.TupleOffset = 0; tuple.TupleDataMax = 80; tuple.Attributes = 0; tuple.DesiredTuple = CISTPL_VERS_1; - CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(link, &tuple)); - CS_CHECK(GetTupleData, pcmcia_get_tuple_data(link, &tuple)); + CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple)); + CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple)); str = (char *) buf; printk("PCMCIA Version %d.%d\n", str[0], str[1]); str += 2; @@ -128,19 +149,22 @@ static void ixj_get_serial(struct pcmcia_device * link, IXJ * j) return; } -static int ixj_config(struct pcmcia_device * link) +static void ixj_config(dev_link_t * link) { IXJ *j; + client_handle_t handle; ixj_info_t *info; tuple_t tuple; u_short buf[128]; cisparse_t parse; + config_info_t conf; cistpl_cftable_entry_t *cfg = &parse.cftable_entry; cistpl_cftable_entry_t dflt = { 0 }; int last_ret, last_fn; + handle = link->handle; info = link->priv; DEBUG(0, "ixj_config(0x%p)\n", link); tuple.TupleData = (cisdata_t *) buf; @@ -148,17 +172,19 @@ static int ixj_config(struct pcmcia_device * link) tuple.TupleDataMax = 255; tuple.Attributes = 0; tuple.DesiredTuple = CISTPL_CONFIG; - 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)); + CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple)); + CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple)); + CS_CHECK(ParseTuple, pcmcia_parse_tuple(handle, &tuple, &parse)); link->conf.ConfigBase = parse.config.base; link->conf.Present = parse.config.rmask[0]; + link->state |= DEV_CONFIG; + CS_CHECK(GetConfigurationInfo, pcmcia_get_configuration_info(handle, &conf)); tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY; tuple.Attributes = 0; - CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(link, &tuple)); + CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple)); while (1) { - if (pcmcia_get_tuple_data(link, &tuple) != 0 || - pcmcia_parse_tuple(link, &tuple, &parse) != 0) + if (pcmcia_get_tuple_data(handle, &tuple) != 0 || + pcmcia_parse_tuple(handle, &tuple, &parse) != 0) goto next_entry; if ((cfg->io.nwin > 0) || (dflt.io.nwin > 0)) { cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt.io; @@ -169,7 +195,7 @@ static int ixj_config(struct pcmcia_device * link) link->io.BasePort2 = io->win[1].base; link->io.NumPorts2 = io->win[1].len; } - if (pcmcia_request_io(link, &link->io) != 0) + if (pcmcia_request_io(link->handle, &link->io) != 0) goto next_entry; /* If we've got this far, we're done */ break; @@ -177,10 +203,10 @@ static int ixj_config(struct pcmcia_device * link) next_entry: if (cfg->flags & CISTPL_CFTABLE_DEFAULT) dflt = *cfg; - CS_CHECK(GetNextTuple, pcmcia_get_next_tuple(link, &tuple)); + CS_CHECK(GetNextTuple, pcmcia_get_next_tuple(handle, &tuple)); } - CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link, &link->conf)); + CS_CHECK(RequestConfiguration, pcmcia_request_configuration(handle, &link->conf)); /* * Register the card with the core. @@ -189,21 +215,46 @@ static int ixj_config(struct pcmcia_device * link) info->ndev = 1; info->node.major = PHONE_MAJOR; - link->dev_node = &info->node; + link->dev = &info->node; ixj_get_serial(link, j); - return 0; + link->state &= ~DEV_CONFIG_PENDING; + return; cs_failed: - cs_error(link, last_fn, last_ret); + cs_error(link->handle, last_fn, last_ret); ixj_cs_release(link); - return -ENODEV; } -static void ixj_cs_release(struct pcmcia_device *link) +static void ixj_cs_release(dev_link_t *link) { ixj_info_t *info = link->priv; DEBUG(0, "ixj_cs_release(0x%p)\n", link); info->ndev = 0; - pcmcia_disable_device(link); + link->dev = NULL; + pcmcia_release_configuration(link->handle); + pcmcia_release_io(link->handle, &link->io); + link->state &= ~DEV_CONFIG; +} + +static int ixj_suspend(struct pcmcia_device *dev) +{ + dev_link_t *link = dev_to_instance(dev); + + link->state |= DEV_SUSPEND; + if (link->state & DEV_CONFIG) + pcmcia_release_configuration(link->handle); + + return 0; +} + +static int ixj_resume(struct pcmcia_device *dev) +{ + dev_link_t *link = dev_to_instance(dev); + + link->state &= ~DEV_SUSPEND; + if (DEV_OK(link)) + pcmcia_request_configuration(link->handle, &link->conf); + + return 0; } static struct pcmcia_device_id ixj_ids[] = { @@ -217,9 +268,11 @@ static struct pcmcia_driver ixj_driver = { .drv = { .name = "ixj_cs", }, - .probe = ixj_probe, + .probe = ixj_attach, .remove = ixj_detach, .id_table = ixj_ids, + .suspend = ixj_suspend, + .resume = ixj_resume, }; static int __init ixj_pcmcia_init(void) diff --git a/drivers/telephony/phonedev.c b/drivers/telephony/phonedev.c index e41f49afd..3c987f49f 100644 --- a/drivers/telephony/phonedev.c +++ b/drivers/telephony/phonedev.c @@ -28,7 +28,7 @@ #include #include -#include +#include #define PHONE_NUM_DEVICES 256 @@ -37,7 +37,7 @@ */ static struct phone_device *phone_device[PHONE_NUM_DEVICES]; -static DEFINE_MUTEX(phone_lock); +static DECLARE_MUTEX(phone_lock); /* * Open a phone device. @@ -48,19 +48,19 @@ static int phone_open(struct inode *inode, struct file *file) unsigned int minor = iminor(inode); int err = 0; struct phone_device *p; - const struct file_operations *old_fops, *new_fops = NULL; + struct file_operations *old_fops, *new_fops = NULL; if (minor >= PHONE_NUM_DEVICES) return -ENODEV; - mutex_lock(&phone_lock); + down(&phone_lock); p = phone_device[minor]; if (p) new_fops = fops_get(p->f_op); if (!new_fops) { - mutex_unlock(&phone_lock); + up(&phone_lock); request_module("char-major-%d-%d", PHONE_MAJOR, minor); - mutex_lock(&phone_lock); + down(&phone_lock); p = phone_device[minor]; if (p == NULL || (new_fops = fops_get(p->f_op)) == NULL) { @@ -78,7 +78,7 @@ static int phone_open(struct inode *inode, struct file *file) } fops_put(old_fops); end: - mutex_unlock(&phone_lock); + up(&phone_lock); return err; } @@ -100,16 +100,18 @@ int phone_register_device(struct phone_device *p, int unit) end = unit + 1; /* enter the loop at least one time */ } - mutex_lock(&phone_lock); + down(&phone_lock); for (i = base; i < end; i++) { if (phone_device[i] == NULL) { phone_device[i] = p; p->minor = i; - mutex_unlock(&phone_lock); + devfs_mk_cdev(MKDEV(PHONE_MAJOR,i), + S_IFCHR|S_IRUSR|S_IWUSR, "phone/%d", i); + up(&phone_lock); return 0; } } - mutex_unlock(&phone_lock); + up(&phone_lock); return -ENFILE; } @@ -119,11 +121,12 @@ int phone_register_device(struct phone_device *p, int unit) void phone_unregister_device(struct phone_device *pfd) { - mutex_lock(&phone_lock); + down(&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); + up(&phone_lock); } diff --git a/drivers/usb/Kconfig b/drivers/usb/Kconfig index 005043197..85dacc925 100644 --- a/drivers/usb/Kconfig +++ b/drivers/usb/Kconfig @@ -10,7 +10,6 @@ menu "USB support" config USB_ARCH_HAS_HCD boolean default y if USB_ARCH_HAS_OHCI - default y if USB_ARCH_HAS_EHCI default y if ARM # SL-811 default PCI @@ -23,8 +22,6 @@ config USB_ARCH_HAS_OHCI default y if ARCH_LH7A404 default y if ARCH_S3C2410 default y if PXA27x - default y if ARCH_EP93XX - default y if (ARCH_AT91RM9200 || ARCH_AT91SAM9261) # PPC: default y if STB03xxx default y if PPC_MPC52xx @@ -33,13 +30,6 @@ config USB_ARCH_HAS_OHCI # more: default PCI -# some non-PCI hcds implement EHCI -config USB_ARCH_HAS_EHCI - boolean - default y if PPC_83xx - default y if SOC_AU1200 - default PCI - # ARM SA1111 chips have a non-PCI based "OHCI-compatible" USB host interface. config USB tristate "Support for Host-side USB" @@ -88,6 +78,8 @@ source "drivers/usb/input/Kconfig" source "drivers/usb/image/Kconfig" +source "drivers/usb/media/Kconfig" + source "drivers/usb/net/Kconfig" source "drivers/usb/mon/Kconfig" diff --git a/drivers/usb/Makefile b/drivers/usb/Makefile index 4710eb02e..36e476dd9 100644 --- a/drivers/usb/Makefile +++ b/drivers/usb/Makefile @@ -15,9 +15,10 @@ obj-$(CONFIG_USB_OHCI_HCD) += host/ obj-$(CONFIG_USB_UHCI_HCD) += host/ obj-$(CONFIG_USB_SL811_HCD) += host/ obj-$(CONFIG_ETRAX_USB_HOST) += host/ -obj-$(CONFIG_USB_OHCI_AT91) += host/ obj-$(CONFIG_USB_ACM) += class/ +obj-$(CONFIG_USB_AUDIO) += class/ +obj-$(CONFIG_USB_MIDI) += class/ obj-$(CONFIG_USB_PRINTER) += class/ obj-$(CONFIG_USB_STORAGE) += storage/ @@ -35,6 +36,19 @@ obj-$(CONFIG_USB_WACOM) += input/ obj-$(CONFIG_USB_ACECAD) += input/ obj-$(CONFIG_USB_XPAD) += input/ +obj-$(CONFIG_USB_DABUSB) += media/ +obj-$(CONFIG_USB_DSBR) += media/ +obj-$(CONFIG_USB_ET61X251) += media/ +obj-$(CONFIG_USB_IBMCAM) += media/ +obj-$(CONFIG_USB_KONICAWC) += media/ +obj-$(CONFIG_USB_OV511) += media/ +obj-$(CONFIG_USB_PWC) += media/ +obj-$(CONFIG_USB_SE401) += media/ +obj-$(CONFIG_USB_SN9C102) += media/ +obj-$(CONFIG_USB_STV680) += media/ +obj-$(CONFIG_USB_VICAM) += media/ +obj-$(CONFIG_USB_W9968CF) += media/ + obj-$(CONFIG_USB_CATC) += net/ obj-$(CONFIG_USB_KAWETH) += net/ obj-$(CONFIG_USB_PEGASUS) += net/ @@ -48,7 +62,6 @@ 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/ @@ -62,7 +75,6 @@ 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/speedtch.c b/drivers/usb/atm/speedtch.c index 956b7a1e8..7860c8a58 100644 --- a/drivers/usb/atm/speedtch.c +++ b/drivers/usb/atm/speedtch.c @@ -69,7 +69,7 @@ static const char speedtch_driver_name[] = "speedtch"; #define RESUBMIT_DELAY 1000 /* milliseconds */ #define DEFAULT_BULK_ALTSETTING 1 -#define DEFAULT_ISOC_ALTSETTING 3 +#define DEFAULT_ISOC_ALTSETTING 2 #define DEFAULT_DL_512_FIRST 0 #define DEFAULT_ENABLE_ISOC 0 #define DEFAULT_SW_BUFFERING 0 diff --git a/drivers/usb/atm/ueagle-atm.c b/drivers/usb/atm/ueagle-atm.c index b38990adf..830d2c982 100644 --- a/drivers/usb/atm/ueagle-atm.c +++ b/drivers/usb/atm/ueagle-atm.c @@ -68,7 +68,7 @@ #include "usbatm.h" -#define EAGLEUSBVERSION "ueagle 1.3" +#define EAGLEUSBVERSION "ueagle 1.2" /* @@ -243,7 +243,7 @@ enum { #define BULK_TIMEOUT 300 #define CTRL_TIMEOUT 1000 -#define ACK_TIMEOUT msecs_to_jiffies(3000) +#define ACK_TIMEOUT msecs_to_jiffies(1500) #define UEA_INTR_IFACE_NO 0 #define UEA_US_IFACE_NO 1 @@ -314,10 +314,6 @@ struct cmv { ((d) & 0xff) << 16 | \ ((a) & 0xff) << 8 | \ ((b) & 0xff)) -#define GETSA1(a) ((a >> 8) & 0xff) -#define GETSA2(a) (a & 0xff) -#define GETSA3(a) ((a >> 24) & 0xff) -#define GETSA4(a) ((a >> 16) & 0xff) #define SA_CNTL MAKESA('C', 'N', 'T', 'L') #define SA_DIAG MAKESA('D', 'I', 'A', 'G') @@ -732,12 +728,11 @@ bad2: uea_err(INS_TO_USBDEV(sc), "sending DSP block %u failed\n", i); return; bad1: - uea_err(INS_TO_USBDEV(sc), "invalid DSP page %u requested\n", pageno); + uea_err(INS_TO_USBDEV(sc), "invalid DSP page %u requested\n",pageno); } static inline void wake_up_cmv_ack(struct uea_softc *sc) { - BUG_ON(sc->cmv_ack); sc->cmv_ack = 1; wake_up(&sc->cmv_ack_wait); } @@ -748,9 +743,6 @@ static inline int wait_cmv_ack(struct uea_softc *sc) sc->cmv_ack, ACK_TIMEOUT); sc->cmv_ack = 0; - uea_dbg(INS_TO_USBDEV(sc), "wait_event_timeout : %d ms\n", - jiffies_to_msecs(ret)); - if (ret < 0) return ret; @@ -799,12 +791,6 @@ static int uea_cmv(struct uea_softc *sc, struct cmv cmv; int ret; - uea_enters(INS_TO_USBDEV(sc)); - uea_vdbg(INS_TO_USBDEV(sc), "Function : %d-%d, Address : %c%c%c%c, " - "offset : 0x%04x, data : 0x%08x\n", - FUNCTION_TYPE(function), FUNCTION_SUBTYPE(function), - GETSA1(address), GETSA2(address), GETSA3(address), - GETSA4(address), offset, data); /* we send a request, but we expect a reply */ sc->cmv_function = function | 0x2; sc->cmv_idx++; @@ -822,9 +808,7 @@ static int uea_cmv(struct uea_softc *sc, ret = uea_request(sc, UEA_SET_BLOCK, UEA_MPTX_START, CMV_SIZE, &cmv); if (ret < 0) return ret; - ret = wait_cmv_ack(sc); - uea_leaves(INS_TO_USBDEV(sc)); - return ret; + return wait_cmv_ack(sc); } static inline int uea_read_cmv(struct uea_softc *sc, @@ -938,7 +922,7 @@ static int uea_stat(struct uea_softc *sc) * we check the status again in order to detect the failure earlier */ if (sc->stats.phy.flags) { - uea_dbg(INS_TO_USBDEV(sc), "Stat flag = 0x%x\n", + uea_dbg(INS_TO_USBDEV(sc), "Stat flag = %d\n", sc->stats.phy.flags); return 0; } @@ -1079,13 +1063,7 @@ static int uea_start_reset(struct uea_softc *sc) uea_enters(INS_TO_USBDEV(sc)); uea_info(INS_TO_USBDEV(sc), "(re)booting started\n"); - /* mask interrupt */ sc->booting = 1; - /* We need to set this here because, a ack timeout could have occured, - * but before we start the reboot, the ack occurs and set this to 1. - * So we will failed to wait Ready CMV. - */ - sc->cmv_ack = 0; UPDATE_ATM_STAT(signal, ATM_PHY_SIG_LOST); /* reset statistics */ @@ -1111,7 +1089,6 @@ static int uea_start_reset(struct uea_softc *sc) msleep(1000); sc->cmv_function = MAKEFUNCTION(ADSLDIRECTIVE, MODEMREADY); - /* demask interrupt */ sc->booting = 0; /* start loading DSP */ @@ -1124,8 +1101,6 @@ static int uea_start_reset(struct uea_softc *sc) if (ret < 0) return ret; - uea_vdbg(INS_TO_USBDEV(sc), "Ready CMV received\n"); - /* Enter in R-IDLE (cmv) until instructed otherwise */ ret = uea_write_cmv(sc, SA_CNTL, 0, 1); if (ret < 0) @@ -1146,7 +1121,6 @@ static int uea_start_reset(struct uea_softc *sc) } /* Enter in R-ACT-REQ */ ret = uea_write_cmv(sc, SA_CNTL, 0, 2); - uea_vdbg(INS_TO_USBDEV(sc), "Entering in R-ACT-REQ state\n"); out: release_firmware(cmvs_fw); sc->reset = 0; @@ -1261,7 +1235,6 @@ static void uea_dispatch_cmv(struct uea_softc *sc, struct cmv* cmv) if (cmv->bFunction == MAKEFUNCTION(ADSLDIRECTIVE, MODEMREADY)) { wake_up_cmv_ack(sc); - uea_leaves(INS_TO_USBDEV(sc)); return; } @@ -1276,7 +1249,6 @@ static void uea_dispatch_cmv(struct uea_softc *sc, struct cmv* cmv) sc->data = sc->data << 16 | sc->data >> 16; wake_up_cmv_ack(sc); - uea_leaves(INS_TO_USBDEV(sc)); return; bad2: @@ -1284,14 +1256,12 @@ bad2: "Function : %d, Subfunction : %d\n", FUNCTION_TYPE(cmv->bFunction), FUNCTION_SUBTYPE(cmv->bFunction)); - uea_leaves(INS_TO_USBDEV(sc)); return; bad1: uea_err(INS_TO_USBDEV(sc), "invalid cmv received, " "wPreamble %d, bDirection %d\n", le16_to_cpu(cmv->wPreamble), cmv->bDirection); - uea_leaves(INS_TO_USBDEV(sc)); } /* @@ -1376,7 +1346,7 @@ static int uea_boot(struct uea_softc *sc) if (ret < 0) { uea_err(INS_TO_USBDEV(sc), "urb submition failed with error %d\n", ret); - goto err; + goto err1; } sc->kthread = kthread_run(uea_kthread, sc, "ueagle-atm"); @@ -1390,10 +1360,10 @@ static int uea_boot(struct uea_softc *sc) err2: usb_kill_urb(sc->urb_int); +err1: + kfree(intr); err: usb_free_urb(sc->urb_int); - sc->urb_int = NULL; - kfree(intr); uea_leaves(INS_TO_USBDEV(sc)); return -ENOMEM; } @@ -1538,7 +1508,7 @@ static ssize_t read_##name(struct device *dev, \ int ret = -ENODEV; \ struct uea_softc *sc; \ \ - mutex_lock(&uea_mutex); \ + mutex_lock(&uea_mutex); \ sc = dev_to_uea(dev); \ if (!sc) \ goto out; \ @@ -1546,7 +1516,7 @@ static ssize_t read_##name(struct device *dev, \ if (reset) \ sc->stats.phy.name = 0; \ out: \ - mutex_unlock(&uea_mutex); \ + mutex_unlock(&uea_mutex); \ return ret; \ } \ \ @@ -1673,7 +1643,7 @@ static int uea_bind(struct usbatm_data *usbatm, struct usb_interface *intf, sc = kzalloc(sizeof(struct uea_softc), GFP_KERNEL); if (!sc) { - uea_err(usb, "uea_init: not enough memory !\n"); + uea_err(INS_TO_USBDEV(sc), "uea_init: not enough memory !\n"); return -ENOMEM; } diff --git a/drivers/usb/atm/usbatm.c b/drivers/usb/atm/usbatm.c index a38701c74..c1211fc03 100644 --- a/drivers/usb/atm/usbatm.c +++ b/drivers/usb/atm/usbatm.c @@ -99,11 +99,11 @@ static const char usbatm_driver_name[] = "usbatm"; #define UDSL_MAX_RCV_URBS 16 #define UDSL_MAX_SND_URBS 16 -#define UDSL_MAX_BUF_SIZE 65536 +#define UDSL_MAX_BUF_SIZE 64 * 1024 /* bytes */ #define UDSL_DEFAULT_RCV_URBS 4 #define UDSL_DEFAULT_SND_URBS 4 -#define UDSL_DEFAULT_RCV_BUF_SIZE 3392 /* 64 * ATM_CELL_SIZE */ -#define UDSL_DEFAULT_SND_BUF_SIZE 3392 /* 64 * ATM_CELL_SIZE */ +#define UDSL_DEFAULT_RCV_BUF_SIZE 64 * ATM_CELL_SIZE /* bytes */ +#define UDSL_DEFAULT_SND_BUF_SIZE 64 * ATM_CELL_SIZE /* bytes */ #define ATM_CELL_HEADER (ATM_CELL_SIZE - ATM_CELL_PAYLOAD) @@ -135,7 +135,7 @@ MODULE_PARM_DESC(rcv_buf_bytes, module_param(snd_buf_bytes, uint, S_IRUGO); MODULE_PARM_DESC(snd_buf_bytes, "Size of the buffers used for transmission, in bytes (range: 1-" - __MODULE_STRING(UDSL_MAX_BUF_SIZE) ", default: " + __MODULE_STRING(UDSL_MAX_SND_BUF_SIZE) ", default: " __MODULE_STRING(UDSL_DEFAULT_SND_BUF_SIZE) ")"); @@ -1039,7 +1039,7 @@ static void usbatm_tasklet_schedule(unsigned long data) tasklet_schedule((struct tasklet_struct *) data); } -static void usbatm_init_channel(struct usbatm_channel *channel) +static inline 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 70125c6d3..42d6823b8 100644 --- a/drivers/usb/atm/xusbatm.c +++ b/drivers/usb/atm/xusbatm.c @@ -20,6 +20,7 @@ ******************************************************************************/ #include +#include /* FIXME: required by linux/etherdevice.h */ #include /* for random_ether_addr() */ #include "usbatm.h" diff --git a/drivers/usb/class/Kconfig b/drivers/usb/class/Kconfig index 3a9102d25..ef105a92a 100644 --- a/drivers/usb/class/Kconfig +++ b/drivers/usb/class/Kconfig @@ -4,6 +4,53 @@ comment "USB Device Class drivers" depends on USB +config OBSOLETE_OSS_USB_DRIVER + bool "Obsolete OSS USB drivers" + depends on USB && SOUND + help + This option enables support for the obsolete USB Audio and Midi + 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 of missing support in the ALSA drivers. + + If unsure, say N. + +config USB_AUDIO + tristate "USB Audio support" + depends on USB && SOUND && OBSOLETE_OSS_USB_DRIVER + help + Say Y here if you want to connect USB audio equipment such as + speakers to your computer's USB port. You only need this if you use + the OSS sound driver; ALSA has its own option for usb audio support. + + To compile this driver as a module, choose M here: the + module will be called audio. + +config USB_MIDI + tristate "USB MIDI support" + depends on USB && SOUND && OBSOLETE_OSS_USB_DRIVER + ---help--- + Say Y here if you want to connect a USB MIDI device to your + computer's USB port. You only need this if you use the OSS + sound system; USB MIDI devices are supported by ALSA's USB + audio driver. This driver is for devices that comply with + 'Universal Serial Bus Device Class Definition for MIDI Device'. + + The following devices are known to work: + * Steinberg USB2MIDI + * Roland MPU64 + * Roland PC-300 + * Roland SC8850 + * Roland UM-1 + * Roland UM-2 + * Roland UA-100 + * Yamaha MU1000 + + To compile this driver as a module, choose M here: the + module will be called usb-midi. + config USB_ACM tristate "USB Modem (CDC ACM) support" depends on USB diff --git a/drivers/usb/class/Makefile b/drivers/usb/class/Makefile index cc391e6c2..229471247 100644 --- a/drivers/usb/class/Makefile +++ b/drivers/usb/class/Makefile @@ -4,4 +4,6 @@ # obj-$(CONFIG_USB_ACM) += cdc-acm.o +obj-$(CONFIG_USB_AUDIO) += audio.o +obj-$(CONFIG_USB_MIDI) += usb-midi.o obj-$(CONFIG_USB_PRINTER) += usblp.o diff --git a/drivers/usb/class/audio.c b/drivers/usb/class/audio.c index f8f21567c..3ad9ee8b8 100644 --- a/drivers/usb/class/audio.c +++ b/drivers/usb/class/audio.c @@ -631,8 +631,10 @@ static void usbin_stop(struct usb_audiodev *as) i = u->flags; spin_unlock_irqrestore(&as->lock, flags); while (i & (FLG_URB0RUNNING|FLG_URB1RUNNING|FLG_SYNC0RUNNING|FLG_SYNC1RUNNING)) { - set_current_state(notkilled ? TASK_INTERRUPTIBLE : TASK_UNINTERRUPTIBLE); - schedule_timeout(1); + if (notkilled) + schedule_timeout_interruptible(1); + else + schedule_timeout_uninterruptible(1); spin_lock_irqsave(&as->lock, flags); i = u->flags; spin_unlock_irqrestore(&as->lock, flags); @@ -1102,8 +1104,10 @@ static void usbout_stop(struct usb_audiodev *as) i = u->flags; spin_unlock_irqrestore(&as->lock, flags); while (i & (FLG_URB0RUNNING|FLG_URB1RUNNING|FLG_SYNC0RUNNING|FLG_SYNC1RUNNING)) { - set_current_state(notkilled ? TASK_INTERRUPTIBLE : TASK_UNINTERRUPTIBLE); - schedule_timeout(1); + if (notkilled) + schedule_timeout_interruptible(1); + else + schedule_timeout_uninterruptible(1); spin_lock_irqsave(&as->lock, flags); i = u->flags; spin_unlock_irqrestore(&as->lock, flags); @@ -2728,7 +2732,6 @@ static struct usb_device_id usb_audio_ids [] = { MODULE_DEVICE_TABLE (usb, usb_audio_ids); static struct usb_driver usb_audio_driver = { - .owner = THIS_MODULE, .name = "audio", .probe = usb_audio_probe, .disconnect = usb_audio_disconnect, diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c index ca90326f2..97bdeb1c2 100644 --- a/drivers/usb/class/cdc-acm.c +++ b/drivers/usb/class/cdc-acm.c @@ -60,10 +60,9 @@ #include #include #include -#include #include #include -#include +#include #include #include #include @@ -81,7 +80,7 @@ static struct usb_driver acm_driver; static struct tty_driver *acm_tty_driver; static struct acm *acm_table[ACM_TTY_MINORS]; -static DEFINE_MUTEX(open_mutex); +static DECLARE_MUTEX(open_sem); #define ACM_READY(acm) (acm && acm->dev && acm->used) @@ -127,8 +126,8 @@ static int acm_wb_alloc(struct acm *acm) wb->use = 1; return wbn; } - wbn = (wbn + 1) % ACM_NW; - if (++i >= ACM_NW) + wbn = (wbn + 1) % ACM_NWB; + if (++i >= ACM_NWB) return -1; } } @@ -142,9 +141,10 @@ static int acm_wb_is_avail(struct acm *acm) { int i, n; - n = ACM_NW; - for (i = 0; i < ACM_NW; i++) { - n -= acm->wb[i].use; + n = 0; + for (i = 0; i < ACM_NWB; i++) { + if (!acm->wb[i].use) + n++; } return n; } @@ -166,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_NW; + acm->write_current = (wbn + 1) % ACM_NWB; spin_unlock_irqrestore(&acm->write_lock, flags); } @@ -290,32 +290,22 @@ 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; - int status = urb->status; - dbg("Entering acm_read_bulk with status %d", urb->status); + dbg("Entering acm_read_bulk with status %d\n", urb->status); if (!ACM_READY(acm)) return; - if (status) - dev_dbg(&acm->data->dev, "bulk rx status %d", status); + if (urb->status) + dev_dbg(&acm->data->dev, "bulk rx status %d\n", urb->status); buf = rcv->buffer; buf->size = urb->actual_length; - 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 */ - } + spin_lock(&acm->read_lock); + list_add_tail(&rcv->list, &acm->spare_read_urbs); + list_add_tail(&buf->list, &acm->filled_read_bufs); + spin_unlock(&acm->read_lock); + tasklet_schedule(&acm->urb_task); } @@ -343,7 +333,7 @@ next_buffer: list_del(&buf->list); spin_unlock(&acm->read_lock); - dbg("acm_rx_tasklet: procesing buf 0x%p, size = %d", buf, buf->size); + dbg("acm_rx_tasklet: procesing buf 0x%p, size = %d\n", buf, buf->size); tty_buffer_request_room(tty, buf->size); if (!acm->throttle) @@ -394,7 +384,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", rcv->urb, rcv, buf); + dbg("acm_rx_tasklet: sending urb 0x%p, rcv 0x%p, buf 0x%p\n", rcv->urb, rcv, buf); /* This shouldn't kill the driver as unsuccessful URBs are returned to the free-urbs-pool and resubmited ASAP */ @@ -413,7 +403,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", urb->status); + dbg("Entering acm_write_bulk with status %d\n", urb->status); acm_write_done(acm); acm_write_start(acm); @@ -424,7 +414,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."); + dbg("Entering acm_softint.\n"); if (!ACM_READY(acm)) return; @@ -440,9 +430,9 @@ 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."); - - mutex_lock(&open_mutex); + dbg("Entering acm_tty_open.\n"); + + down(&open_sem); acm = acm_table[tty->index]; if (!acm || !acm->dev) @@ -473,10 +463,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->rx_buflimit; i++) { + for (i = 0; i < ACM_NRU; i++) { list_add(&(acm->ru[i].list), &acm->spare_read_urbs); } - for (i = 0; i < acm->rx_buflimit; i++) { + for (i = 0; i < ACM_NRB; i++) { list_add(&(acm->rb[i].list), &acm->spare_read_bufs); } @@ -484,28 +474,27 @@ static int acm_tty_open(struct tty_struct *tty, struct file *filp) done: err_out: - mutex_unlock(&open_mutex); + up(&open_sem); return rv; full_bailout: usb_kill_urb(acm->ctrlurb); bail_out: acm->used--; - mutex_unlock(&open_mutex); + up(&open_sem); return -EIO; } static void acm_tty_unregister(struct acm *acm) { - int i,nr; + int i; - 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 < nr; i++) + for (i = 0; i < ACM_NRU; i++) usb_free_urb(acm->ru[i].urb); kfree(acm); } @@ -513,24 +502,23 @@ 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,nr; + int i; if (!acm || !acm->used) return; - nr = acm->rx_buflimit; - mutex_lock(&open_mutex); + down(&open_sem); 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 < nr; i++) + for (i = 0; i < ACM_NRU; i++) usb_kill_urb(acm->ru[i].urb); } else acm_tty_unregister(acm); } - mutex_unlock(&open_mutex); + up(&open_sem); } static int acm_tty_write(struct tty_struct *tty, const unsigned char *buf, int count) @@ -541,7 +529,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,", count); + dbg("Entering acm_tty_write to write %d bytes,\n", count); if (!ACM_READY(acm)) return -EINVAL; @@ -587,7 +575,7 @@ static int acm_tty_chars_in_buffer(struct tty_struct *tty) /* * This is inaccurate (overcounts), but it works. */ - return (ACM_NW - acm_wb_is_avail(acm)) * acm->writesize; + return (ACM_NWB - acm_wb_is_avail(acm)) * acm->writesize; } static void acm_tty_throttle(struct tty_struct *tty) @@ -723,7 +711,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_NW; i++, wb++) { + for (wb = &acm->wb[0], i = 0; i < ACM_NWB; i++, wb++) { usb_buffer_free(acm->dev, acm->writesize, wb->buf, wb->dmah); } } @@ -734,7 +722,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_NW; i++, wb++) { + for (wb = &acm->wb[0], i = 0; i < ACM_NWB; i++, wb++) { wb->buf = usb_buffer_alloc(acm->dev, acm->writesize, GFP_KERNEL, &wb->dmah); if (!wb->buf) { @@ -771,14 +759,10 @@ 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; - /* normal quirks */ - quirks = (unsigned long)id->driver_info; - num_rx_buf = (quirks == SINGLE_RX_URB) ? 1 : ACM_NR; - /* handle quirks deadly to normal probing*/ + quirks = (unsigned long)id->driver_info; if (quirks == NO_UNION_NORMAL) { data_interface = usb_ifnum_to_if(usb_dev, 1); control_interface = usb_ifnum_to_if(usb_dev, 0); @@ -793,7 +777,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"); + dev_dbg(&intf->dev,"Seeking extra descriptors on endpoint\n"); buflen = intf->cur_altsetting->endpoint->extralen; buffer = intf->cur_altsetting->endpoint->extra; } else { @@ -842,24 +826,24 @@ next_desc: if (!union_header) { if (call_interface_num > 0) { - dev_dbg(&intf->dev,"No union descriptor, using call management descriptor"); + dev_dbg(&intf->dev,"No union descriptor, using call management descriptor\n"); 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"); + dev_dbg(&intf->dev,"No union descriptor, giving up\n"); 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"); + dev_dbg(&intf->dev,"no interfaces\n"); return -ENODEV; } } if (data_interface_num != call_interface_num) - dev_dbg(&intf->dev,"Seperate call control interface. That is not fully supported."); + dev_dbg(&intf->dev,"Seperate call control interface. That is not fully supported.\n"); skip_normal_probe: @@ -867,7 +851,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."); + dev_dbg(&intf->dev,"Your device has switched interfaces.\n"); t = control_interface; control_interface = data_interface; @@ -878,7 +862,7 @@ skip_normal_probe: } if (usb_interface_claimed(data_interface)) { /* valid in this context */ - dev_dbg(&intf->dev,"The data interface isn't available"); + dev_dbg(&intf->dev,"The data interface isn't available\n"); return -EBUSY; } @@ -895,7 +879,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"); + dev_dbg(&intf->dev,"The data interface has switched endpoints\n"); t = epread; epread = epwrite; @@ -910,12 +894,12 @@ skip_normal_probe: } if (!(acm = kzalloc(sizeof(struct acm), GFP_KERNEL))) { - dev_dbg(&intf->dev, "out of memory (acm kzalloc)"); + dev_dbg(&intf->dev, "out of memory (acm kzalloc)\n"); goto alloc_fail; } ctrlsize = le16_to_cpu(epctrl->wMaxPacketSize); - readsize = le16_to_cpu(epread->wMaxPacketSize)* ( quirks == SINGLE_RX_URB ? 1 : 2); + readsize = le16_to_cpu(epread->wMaxPacketSize)*2; acm->writesize = le16_to_cpu(epwrite->wMaxPacketSize); acm->control = control_interface; acm->data = data_interface; @@ -924,7 +908,6 @@ 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); @@ -936,43 +919,44 @@ 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)"); + dev_dbg(&intf->dev, "out of memory (ctrl buffer alloc)\n"); goto alloc_fail2; } acm->ctrl_buffer = buf; if (acm_write_buffers_alloc(acm) < 0) { - dev_dbg(&intf->dev, "out of memory (write buffer alloc)"); + dev_dbg(&intf->dev, "out of memory (write buffer alloc)\n"); goto alloc_fail4; } acm->ctrlurb = usb_alloc_urb(0, GFP_KERNEL); if (!acm->ctrlurb) { - dev_dbg(&intf->dev, "out of memory (ctrlurb kmalloc)"); + dev_dbg(&intf->dev, "out of memory (ctrlurb kmalloc)\n"); goto alloc_fail5; } - for (i = 0; i < num_rx_buf; i++) { + for (i = 0; i < ACM_NRU; i++) { struct acm_ru *rcv = &(acm->ru[i]); if (!(rcv->urb = usb_alloc_urb(0, GFP_KERNEL))) { - dev_dbg(&intf->dev, "out of memory (read urbs usb_alloc_urb)"); + dev_dbg(&intf->dev, "out of memory (read urbs usb_alloc_urb)\n"); goto alloc_fail7; } rcv->urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; rcv->instance = acm; } - for (i = 0; i < num_rx_buf; i++) { + for (i = 0; i < ACM_NRB; i++) { struct acm_rb *buf = &(acm->rb[i]); + // Using usb_buffer_alloc instead of kmalloc as Oliver suggested if (!(buf->base = usb_buffer_alloc(acm->dev, readsize, GFP_KERNEL, &buf->dma))) { - dev_dbg(&intf->dev, "out of memory (read bufs usb_buffer_alloc)"); + dev_dbg(&intf->dev, "out of memory (read bufs usb_buffer_alloc)\n"); goto alloc_fail7; } } acm->writeurb = usb_alloc_urb(0, GFP_KERNEL); if (!acm->writeurb) { - dev_dbg(&intf->dev, "out of memory (writeurb kmalloc)"); + dev_dbg(&intf->dev, "out of memory (writeurb kmalloc)\n"); goto alloc_fail7; } @@ -1003,9 +987,9 @@ skip_normal_probe: return 0; alloc_fail7: - for (i = 0; i < num_rx_buf; i++) + for (i = 0; i < ACM_NRB; i++) usb_buffer_free(usb_dev, acm->readsize, acm->rb[i].base, acm->rb[i].dma); - for (i = 0; i < num_rx_buf; i++) + for (i = 0; i < ACM_NRU; i++) usb_free_urb(acm->ru[i].urb); usb_free_urb(acm->ctrlurb); alloc_fail5: @@ -1029,9 +1013,9 @@ static void acm_disconnect(struct usb_interface *intf) return; } - mutex_lock(&open_mutex); + down(&open_sem); if (!usb_get_intfdata(intf)) { - mutex_unlock(&open_mutex); + up(&open_sem); return; } acm->dev = NULL; @@ -1042,7 +1026,7 @@ static void acm_disconnect(struct usb_interface *intf) usb_kill_urb(acm->ctrlurb); usb_kill_urb(acm->writeurb); - for (i = 0; i < acm->rx_buflimit; i++) + for (i = 0; i < ACM_NRU; i++) usb_kill_urb(acm->ru[i].urb); INIT_LIST_HEAD(&acm->filled_read_bufs); @@ -1054,18 +1038,18 @@ 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->rx_buflimit; i++) + for (i = 0; i < ACM_NRB; i++) usb_buffer_free(usb_dev, acm->readsize, acm->rb[i].base, acm->rb[i].dma); usb_driver_release_interface(&acm_driver, intf == acm->control ? acm->data : intf); if (!acm->used) { acm_tty_unregister(acm); - mutex_unlock(&open_mutex); + up(&open_sem); return; } - mutex_unlock(&open_mutex); + up(&open_sem); if (acm->tty) tty_hangup(acm->tty); @@ -1083,12 +1067,6 @@ 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) }, @@ -1148,11 +1126,12 @@ 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_DYNAMIC_DEV; + acm_tty_driver->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_NO_DEVFS, 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 1bcaea32c..fd2aaccdc 100644 --- a/drivers/usb/class/cdc-acm.h +++ b/drivers/usb/class/cdc-acm.h @@ -56,11 +56,11 @@ * 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. + * when processing onlcr, so we only need 2 buffers. */ -#define ACM_NW 2 -#define ACM_NR 16 +#define ACM_NWB 2 +#define ACM_NRU 16 +#define ACM_NRB 16 struct acm_wb { unsigned char *buf; @@ -91,10 +91,9 @@ struct acm { 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; + struct acm_wb wb[ACM_NWB]; + struct acm_ru ru[ACM_NRU]; + struct acm_rb rb[ACM_NRB]; int rx_endpoint; spinlock_t read_lock; struct list_head spare_read_urbs; @@ -123,4 +122,3 @@ struct acm { /* constants describing various quirks and errors */ #define NO_UNION_NORMAL 1 -#define SINGLE_RX_URB 2 diff --git a/drivers/usb/class/usb-midi.c b/drivers/usb/class/usb-midi.c index 5f8af35e7..f13f004d3 100644 --- a/drivers/usb/class/usb-midi.c +++ b/drivers/usb/class/usb-midi.c @@ -2027,7 +2027,6 @@ static struct usb_device_id id_table[] = { }; static struct usb_driver usb_midi_driver = { - .owner = THIS_MODULE, .name = "midi", .probe = usb_midi_probe, .disconnect = usb_midi_disconnect, diff --git a/drivers/usb/class/usblp.c b/drivers/usb/class/usblp.c index acc7cd8ec..cc03f6875 100644 --- a/drivers/usb/class/usblp.c +++ b/drivers/usb/class/usblp.c @@ -55,7 +55,6 @@ #include #include #include -#include #undef DEBUG #include @@ -224,7 +223,7 @@ static int usblp_cache_device_id_string(struct usblp *usblp); /* forward reference to make our lives easier */ static struct usb_driver usblp_driver; -static DEFINE_MUTEX(usblp_mutex); /* locks the existence of usblp's */ +static DECLARE_MUTEX(usblp_sem); /* locks the existence of usblp's */ /* * Functions for usblp control messages. @@ -352,7 +351,7 @@ static int usblp_open(struct inode *inode, struct file *file) if (minor < 0) return -ENODEV; - mutex_lock (&usblp_mutex); + down (&usblp_sem); retval = -ENODEV; intf = usb_find_interface(&usblp_driver, minor); @@ -400,7 +399,7 @@ static int usblp_open(struct inode *inode, struct file *file) } } out: - mutex_unlock (&usblp_mutex); + up (&usblp_sem); return retval; } @@ -426,13 +425,13 @@ static int usblp_release(struct inode *inode, struct file *file) { struct usblp *usblp = file->private_data; - mutex_lock (&usblp_mutex); + down (&usblp_sem); usblp->used = 0; if (usblp->present) { usblp_unlink_urbs(usblp); } else /* finish cleanup from disconnect */ usblp_cleanup (usblp); - mutex_unlock (&usblp_mutex); + up (&usblp_sem); return 0; } @@ -1154,7 +1153,7 @@ static void usblp_disconnect(struct usb_interface *intf) device_remove_file(&intf->dev, &dev_attr_ieee1284_id); - mutex_lock (&usblp_mutex); + down (&usblp_sem); down (&usblp->sem); usblp->present = 0; usb_set_intfdata (intf, NULL); @@ -1168,7 +1167,7 @@ static void usblp_disconnect(struct usb_interface *intf) if (!usblp->used) usblp_cleanup (usblp); - mutex_unlock (&usblp_mutex); + up (&usblp_sem); } static struct usb_device_id usblp_ids [] = { diff --git a/drivers/usb/core/Kconfig b/drivers/usb/core/Kconfig index 6e3b5358a..ff03184da 100644 --- a/drivers/usb/core/Kconfig +++ b/drivers/usb/core/Kconfig @@ -31,6 +31,9 @@ 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 @@ -96,11 +99,4 @@ config USB_OTG_WHITELIST normal Linux-USB hosts do (other than the warning), and is convenient for many stages of product development. -config USB_OTG_BLACKLIST_HUB - bool "Disable external hubs" - depends on USB_OTG - help - If you say Y here, then Linux will refuse to enumerate - external hubs. OTG hosts are allowed to reduce hardware - and software costs by not supporting external hubs. diff --git a/drivers/usb/core/Makefile b/drivers/usb/core/Makefile index ec510922a..28329ddf1 100644 --- a/drivers/usb/core/Makefile +++ b/drivers/usb/core/Makefile @@ -3,8 +3,7 @@ # usbcore-objs := usb.o hub.o hcd.o urb.o message.o driver.o \ - config.o file.o buffer.o sysfs.o endpoint.o \ - devio.o notify.o + config.o file.o buffer.o sysfs.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 f4f4ef0f3..ad742cec9 100644 --- a/drivers/usb/core/buffer.c +++ b/drivers/usb/core/buffer.c @@ -5,6 +5,7 @@ * 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 4c9e63e66..a9d89c78c 100644 --- a/drivers/usb/core/config.c +++ b/drivers/usb/core/config.c @@ -1,3 +1,4 @@ +#include #include #include #include diff --git a/drivers/usb/core/devices.c b/drivers/usb/core/devices.c index c0f37343a..2684e15b8 100644 --- a/drivers/usb/core/devices.c +++ b/drivers/usb/core/devices.c @@ -57,7 +57,6 @@ #include #include #include -#include #include #include "usb.h" @@ -571,7 +570,7 @@ static ssize_t usb_device_read(struct file *file, char __user *buf, size_t nbyte if (!access_ok(VERIFY_WRITE, buf, nbytes)) return -EFAULT; - mutex_lock(&usb_bus_list_lock); + down (&usb_bus_list_lock); /* print devices for all busses */ list_for_each_entry(bus, &usb_bus_list, bus_list) { /* recurse through all children of the root hub */ @@ -581,12 +580,12 @@ static ssize_t usb_device_read(struct file *file, char __user *buf, size_t nbyte ret = usb_device_dump(&buf, &nbytes, &skip_bytes, ppos, bus->root_hub, bus, 0, 0, 0); usb_unlock_device(bus->root_hub); if (ret < 0) { - mutex_unlock(&usb_bus_list_lock); + up(&usb_bus_list_lock); return ret; } total_written += ret; } - mutex_unlock(&usb_bus_list_lock); + up (&usb_bus_list_lock); return total_written; } diff --git a/drivers/usb/core/devio.c b/drivers/usb/core/devio.c index d8b047623..2b68998fe 100644 --- a/drivers/usb/core/devio.c +++ b/drivers/usb/core/devio.c @@ -47,7 +47,6 @@ #include #include #include -#include #include #include #include @@ -59,9 +58,6 @@ #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; @@ -72,7 +68,6 @@ struct async { void __user *userbuffer; void __user *userurb; struct urb *urb; - u32 secid; }; static int usbfs_snoop = 0; @@ -139,21 +134,26 @@ static ssize_t usbdev_read(struct file *file, char __user *buf, size_t nbytes, l } if (pos < sizeof(struct usb_device_descriptor)) { - struct usb_device_descriptor temp_desc ; /* 18 bytes - fits on the stack */ - - memcpy(&temp_desc, &dev->descriptor, sizeof(dev->descriptor)); - le16_to_cpus(&temp_desc.bcdUSB); - le16_to_cpus(&temp_desc.idVendor); - le16_to_cpus(&temp_desc.idProduct); - le16_to_cpus(&temp_desc.bcdDevice); + struct usb_device_descriptor *desc = kmalloc(sizeof(*desc), GFP_KERNEL); + if (!desc) { + ret = -ENOMEM; + goto err; + } + memcpy(desc, &dev->descriptor, sizeof(dev->descriptor)); + le16_to_cpus(&desc->bcdUSB); + le16_to_cpus(&desc->idVendor); + le16_to_cpus(&desc->idProduct); + le16_to_cpus(&desc->bcdDevice); len = sizeof(struct usb_device_descriptor) - pos; if (len > nbytes) len = nbytes; - if (copy_to_user(buf, ((char *)&temp_desc) + pos, len)) { + if (copy_to_user(buf, ((char *)desc) + pos, len)) { + kfree(desc); ret = -EFAULT; goto err; } + kfree(desc); *ppos += len; buf += len; @@ -317,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->secid); + as->euid); } snoop(&urb->dev->dev, "urb complete\n"); snoop_urb(urb, as->userurb); @@ -498,8 +498,7 @@ static int check_ctrlrecip(struct dev_state *ps, unsigned int requesttype, unsig { int ret = 0; - if (ps->dev->state != USB_STATE_ADDRESS - && ps->dev->state != USB_STATE_CONFIGURED) + if (ps->dev->state != USB_STATE_CONFIGURED) return -EHOSTUNREACH; if (USB_TYPE_VENDOR == (USB_TYPE_MASK & requesttype)) return 0; @@ -544,19 +543,21 @@ static int usbdev_open(struct inode *inode, struct file *file) struct dev_state *ps; int ret; - /* Protect against simultaneous removal or release */ - mutex_lock(&usbfs_mutex); - + /* + * no locking necessary here, as chrdev_open has the kernel lock + * (still acquire the kernel lock for safety) + */ ret = -ENOMEM; if (!(ps = kmalloc(sizeof(struct dev_state), GFP_KERNEL))) - goto out; + goto out_nolock; + 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->i_private; + dev = inode->u.generic_ip; if (!dev) { kfree(ps); goto out; @@ -575,13 +576,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: - mutex_unlock(&usbfs_mutex); - return ret; + unlock_kernel(); + out_nolock: + return ret; } static int usbdev_release(struct inode *inode, struct file *file) @@ -591,12 +592,7 @@ 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)) @@ -605,8 +601,9 @@ 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) @@ -830,7 +827,8 @@ static int proc_connectinfo(struct dev_state *ps, void __user *arg) static int proc_resetdevice(struct dev_state *ps) { - return usb_reset_composite_device(ps->dev, NULL); + return usb_reset_device(ps->dev); + } static int proc_setintf(struct dev_state *ps, void __user *arg) @@ -929,8 +927,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 8 byte setup plus an arbitrary data stage */ - if (uurb->buffer_length < 8 || uurb->buffer_length > (8 + MAX_USBFS_BUFFER_SIZE)) + /* min 8 byte setup packet, max arbitrary */ + if (uurb->buffer_length < 8 || uurb->buffer_length > PAGE_SIZE) return -EINVAL; if (!(dr = kmalloc(sizeof(struct usb_ctrlrequest), GFP_KERNEL))) return -ENOMEM; @@ -988,8 +986,7 @@ 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++) { - /* arbitrary limit, sufficient for USB 2.0 high-bandwidth iso */ - if (isopkt[u].length > 8192) { + if (isopkt[u].length > 1023) { kfree(isopkt); return -EINVAL; } @@ -1060,7 +1057,6 @@ 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 ec8906501..dce9d987f 100644 --- a/drivers/usb/core/driver.c +++ b/drivers/usb/core/driver.c @@ -21,6 +21,7 @@ * */ +#include #include #include #include "hcd.h" @@ -377,7 +378,7 @@ const struct usb_device_id *usb_match_id(struct usb_interface *interface, return NULL; } -EXPORT_SYMBOL_GPL_FUTURE(usb_match_id); +EXPORT_SYMBOL(usb_match_id); int usb_device_match(struct device *dev, struct device_driver *drv) { @@ -445,7 +446,7 @@ int usb_register_driver(struct usb_driver *new_driver, struct module *owner) return retval; } -EXPORT_SYMBOL_GPL_FUTURE(usb_register_driver); +EXPORT_SYMBOL(usb_register_driver); /** * usb_deregister - unregister a USB driver @@ -468,4 +469,4 @@ void usb_deregister(struct usb_driver *driver) usbfs_update_special(); } -EXPORT_SYMBOL_GPL_FUTURE(usb_deregister); +EXPORT_SYMBOL(usb_deregister); diff --git a/drivers/usb/core/file.c b/drivers/usb/core/file.c index 8de4f8c99..37b13368c 100644 --- a/drivers/usb/core/file.c +++ b/drivers/usb/core/file.c @@ -15,6 +15,7 @@ * */ +#include #include #include #include @@ -23,15 +24,15 @@ #include "usb.h" #define MAX_USB_MINORS 256 -static const struct file_operations *usb_minors[MAX_USB_MINORS]; +static struct file_operations *usb_minors[MAX_USB_MINORS]; static DEFINE_SPINLOCK(minor_lock); static int usb_open(struct inode * inode, struct file * file) { int minor = iminor(inode); - const struct file_operations *c; + struct file_operations *c; int err = -ENODEV; - const struct file_operations *old_fops, *new_fops = NULL; + struct file_operations *old_fops, *new_fops = NULL; spin_lock (&minor_lock); c = usb_minors[minor]; @@ -60,66 +61,33 @@ static struct file_operations usb_fops = { .open = usb_open, }; -static struct usb_class { - struct kref kref; - struct class *class; -} *usb_class; - -static int init_usb_class(void) -{ - int result = 0; - - 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; - } - - 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"); - kfree(usb_class); - usb_class = NULL; - } - -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); -} +static struct class *usb_class; int usb_major_init(void) { int error; error = register_chrdev(USB_MAJOR, "usb", &usb_fops); - if (error) + if (error) { err("unable to get major %d for usb devices", USB_MAJOR); + goto out; + } + usb_class = class_create(THIS_MODULE, "usb"); + if (IS_ERR(usb_class)) { + error = PTR_ERR(usb_class); + err("class_create failed for usb devices"); + unregister_chrdev(USB_MAJOR, "usb"); + goto out; + } + +out: return error; } void usb_major_cleanup(void) { + class_destroy(usb_class); unregister_chrdev(USB_MAJOR, "usb"); } @@ -178,10 +146,6 @@ int usb_register_dev(struct usb_interface *intf, } spin_unlock (&minor_lock); - if (retval) - goto exit; - - retval = init_usb_class(); if (retval) goto exit; @@ -194,7 +158,7 @@ int usb_register_dev(struct usb_interface *intf, ++temp; else temp = name; - intf->class_dev = class_device_create(usb_class->class, NULL, + intf->class_dev = class_device_create(usb_class, NULL, MKDEV(USB_MAJOR, minor), &intf->dev, "%s", temp); if (IS_ERR(intf->class_dev)) { @@ -242,10 +206,9 @@ 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->class, MKDEV(USB_MAJOR, intf->minor)); + class_device_destroy(usb_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 5078fb337..29b5b2a6e 100644 --- a/drivers/usb/core/hcd-pci.c +++ b/drivers/usb/core/hcd-pci.c @@ -16,6 +16,7 @@ * Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +#include #include #include #include @@ -125,7 +126,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, IRQF_SHARED); + retval = usb_add_hcd (hcd, dev->irq, SA_SHIRQ); if (retval != 0) goto err4; return retval; @@ -212,9 +213,11 @@ int usb_hcd_pci_suspend (struct pci_dev *dev, pm_message_t message) if (hcd->driver->suspend) { retval = hcd->driver->suspend(hcd, message); - suspend_report_result(hcd->driver->suspend, retval); - if (retval) + if (retval) { + dev_dbg (&dev->dev, "PCI pre-suspend fail, %d\n", + retval); goto done; + } } synchronize_irq(dev->irq); @@ -260,21 +263,15 @@ int usb_hcd_pci_suspend (struct pci_dev *dev, pm_message_t message) * some device state (e.g. as part of clock reinit). */ retval = pci_set_power_state (dev, PCI_D3hot); - suspend_report_result(pci_set_power_state, retval); if (retval == 0) { - int wake = device_can_wakeup(&hcd->self.root_hub->dev); - - wake = wake && device_may_wakeup(hcd->self.controller); - - dev_dbg (hcd->self.controller, "--> PCI D3%s\n", - wake ? "/wakeup" : ""); + dev_dbg (hcd->self.controller, "--> PCI D3\n"); /* Ignore these return values. We rely on pci code to * reject requests the hardware can't implement, rather * than coding the same thing. */ - (void) pci_enable_wake (dev, PCI_D3hot, wake); - (void) pci_enable_wake (dev, PCI_D3cold, wake); + (void) pci_enable_wake (dev, PCI_D3hot, hcd->remote_wakeup); + (void) pci_enable_wake (dev, PCI_D3cold, hcd->remote_wakeup); } else { dev_dbg (&dev->dev, "PCI D3 suspend fail, %d\n", retval); @@ -294,7 +291,7 @@ done: #ifdef CONFIG_PPC_PMAC /* Disable ASIC clocks for USB */ - if (machine_is(powermac)) { + if (_machine == _MACH_Pmac) { struct device_node *of_node; of_node = pci_device_to_OF_node (dev); @@ -329,7 +326,7 @@ int usb_hcd_pci_resume (struct pci_dev *dev) #ifdef CONFIG_PPC_PMAC /* Reenable ASIC clocks for USB */ - if (machine_is(powermac)) { + if (_machine == _MACH_Pmac) { struct device_node *of_node; of_node = pci_device_to_OF_node (dev); diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c index fb4d058bb..9e82afc33 100644 --- a/drivers/usb/core/hcd.c +++ b/drivers/usb/core/hcd.c @@ -22,6 +22,7 @@ * Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +#include #include #include #include @@ -33,7 +34,6 @@ #include #include #include -#include #include #include @@ -93,7 +93,7 @@ struct usb_busmap { static struct usb_busmap busmap; /* used when updating list of hcds */ -DEFINE_MUTEX(usb_bus_list_lock); /* exported only for usbfs */ +DECLARE_MUTEX (usb_bus_list_lock); /* exported only for usbfs */ EXPORT_SYMBOL_GPL (usb_bus_list_lock); /* used for controlling access to virtual root hubs */ @@ -344,7 +344,8 @@ static int rh_call_control (struct usb_hcd *hcd, struct urb *urb) struct usb_ctrlrequest *cmd; u16 typeReq, wValue, wIndex, wLength; u8 *ubuf = urb->transfer_buffer; - u8 tbuf [sizeof (struct usb_hub_descriptor)]; + u8 tbuf [sizeof (struct usb_hub_descriptor)] + __attribute__((aligned(4))); const u8 *bufp = tbuf; int len = 0; int patch_wakeup = 0; @@ -366,39 +367,21 @@ static int rh_call_control (struct usb_hcd *hcd, struct urb *urb) /* DEVICE REQUESTS */ - /* The root hub's remote wakeup enable bit is implemented using - * driver model wakeup flags. If this system supports wakeup - * through USB, userspace may change the default "allow wakeup" - * policy through sysfs or these calls. - * - * Most root hubs support wakeup from downstream devices, for - * runtime power management (disabling USB clocks and reducing - * VBUS power usage). However, not all of them do so; silicon, - * board, and BIOS bugs here are not uncommon, so these can't - * be treated quite like external hubs. - * - * Likewise, not all root hubs will pass wakeup events upstream, - * to wake up the whole system. So don't assume root hub and - * controller capabilities are identical. - */ - case DeviceRequest | USB_REQ_GET_STATUS: - tbuf [0] = (device_may_wakeup(&hcd->self.root_hub->dev) - << USB_DEVICE_REMOTE_WAKEUP) + tbuf [0] = (hcd->remote_wakeup << USB_DEVICE_REMOTE_WAKEUP) | (1 << USB_DEVICE_SELF_POWERED); tbuf [1] = 0; len = 2; break; case DeviceOutRequest | USB_REQ_CLEAR_FEATURE: if (wValue == USB_DEVICE_REMOTE_WAKEUP) - device_set_wakeup_enable(&hcd->self.root_hub->dev, 0); + hcd->remote_wakeup = 0; else goto error; break; case DeviceOutRequest | USB_REQ_SET_FEATURE: - if (device_can_wakeup(&hcd->self.root_hub->dev) - && wValue == USB_DEVICE_REMOTE_WAKEUP) - device_set_wakeup_enable(&hcd->self.root_hub->dev, 1); + if (hcd->can_wakeup && wValue == USB_DEVICE_REMOTE_WAKEUP) + hcd->remote_wakeup = 1; else goto error; break; @@ -427,7 +410,7 @@ static int rh_call_control (struct usb_hcd *hcd, struct urb *urb) bufp = fs_rh_config_descriptor; len = sizeof fs_rh_config_descriptor; } - if (device_can_wakeup(&hcd->self.root_hub->dev)) + if (hcd->can_wakeup) patch_wakeup = 1; break; case USB_DT_STRING << 8: @@ -779,14 +762,14 @@ static int usb_register_bus(struct usb_bus *bus) { int busnum; - mutex_lock(&usb_bus_list_lock); + down (&usb_bus_list_lock); busnum = find_next_zero_bit (busmap.busmap, USB_MAXBUS, 1); if (busnum < USB_MAXBUS) { set_bit (busnum, busmap.busmap); bus->busnum = busnum; } else { printk (KERN_ERR "%s: too many buses\n", usbcore_name); - mutex_unlock(&usb_bus_list_lock); + up(&usb_bus_list_lock); return -E2BIG; } @@ -794,7 +777,7 @@ static int usb_register_bus(struct usb_bus *bus) bus->controller, "usb_host%d", busnum); if (IS_ERR(bus->class_dev)) { clear_bit(busnum, busmap.busmap); - mutex_unlock(&usb_bus_list_lock); + up(&usb_bus_list_lock); return PTR_ERR(bus->class_dev); } @@ -802,7 +785,7 @@ static int usb_register_bus(struct usb_bus *bus) /* Add it to the local list of buses */ list_add (&bus->bus_list, &usb_bus_list); - mutex_unlock(&usb_bus_list_lock); + up (&usb_bus_list_lock); usb_notify_add_bus(bus); @@ -827,9 +810,9 @@ static void usb_deregister_bus (struct usb_bus *bus) * controller code, as well as having it call this when cleaning * itself up */ - mutex_lock(&usb_bus_list_lock); + down (&usb_bus_list_lock); list_del (&bus->bus_list); - mutex_unlock(&usb_bus_list_lock); + up (&usb_bus_list_lock); usb_notify_remove_bus(bus); @@ -840,17 +823,18 @@ static void usb_deregister_bus (struct usb_bus *bus) /** * register_root_hub - called by usb_add_hcd() to register a root hub + * @usb_dev: the usb root hub device to be registered. * @hcd: host controller for this root hub * * This function registers the root hub with the USB subsystem. It sets up - * the device properly in the device tree and then calls usb_new_device() - * to register the usb device. It also assigns the root hub's USB address - * (always 1). + * the device properly in the device tree and stores the root_hub pointer + * in the bus structure, then calls usb_new_device() to register the usb + * device. It also assigns the root hub's USB address (always 1). */ -static int register_root_hub(struct usb_hcd *hcd) +static int register_root_hub (struct usb_device *usb_dev, + struct usb_hcd *hcd) { struct device *parent_dev = hcd->self.controller; - struct usb_device *usb_dev = hcd->self.root_hub; const int devnum = 1; int retval; @@ -861,12 +845,14 @@ static int register_root_hub(struct usb_hcd *hcd) set_bit (devnum, usb_dev->bus->devmap.devicemap); usb_set_device_state(usb_dev, USB_STATE_ADDRESS); - mutex_lock(&usb_bus_list_lock); + down (&usb_bus_list_lock); + usb_dev->bus->root_hub = usb_dev; usb_dev->ep0.desc.wMaxPacketSize = __constant_cpu_to_le16(64); retval = usb_get_device_descriptor(usb_dev, USB_DT_DEVICE_SIZE); if (retval != sizeof usb_dev->descriptor) { - mutex_unlock(&usb_bus_list_lock); + usb_dev->bus->root_hub = NULL; + up (&usb_bus_list_lock); dev_dbg (parent_dev, "can't read %s device descriptor %d\n", usb_dev->dev.bus_id, retval); return (retval < 0) ? retval : -EMSGSIZE; @@ -874,10 +860,11 @@ static int register_root_hub(struct usb_hcd *hcd) retval = usb_new_device (usb_dev); if (retval) { + usb_dev->bus->root_hub = NULL; dev_err (parent_dev, "can't register root hub for %s, %d\n", usb_dev->dev.bus_id, retval); } - mutex_unlock(&usb_bus_list_lock); + up (&usb_bus_list_lock); if (retval == 0) { spin_lock_irq (&hcd_root_hub_lock); @@ -1104,6 +1091,7 @@ static void urb_unlink (struct urb *urb) spin_lock_irqsave (&hcd_data_lock, flags); list_del_init (&urb->urb_list); spin_unlock_irqrestore (&hcd_data_lock, flags); + usb_put_dev (urb->dev); } @@ -1143,6 +1131,7 @@ static int hcd_submit_urb (struct urb *urb, gfp_t mem_flags) case HC_STATE_RUNNING: case HC_STATE_RESUMING: doit: + usb_get_dev (urb->dev); list_add_tail (&urb->urb_list, &ep->urb_list); status = 0; break; @@ -1783,10 +1772,12 @@ int usb_add_hcd(struct usb_hcd *hcd, set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); - /* HC is in reset state, but accessible. Now do the one-time init, - * bottom up so that hcds can customize the root hubs before khubd - * starts talking to them. (Note, bus id is assigned early too.) - */ + /* till now HC has been in an indeterminate state ... */ + if (hcd->driver->reset && (retval = hcd->driver->reset(hcd)) < 0) { + dev_err(hcd->self.controller, "can't reset\n"); + return retval; + } + if ((retval = hcd_buffer_create(hcd)) != 0) { dev_dbg(hcd->self.controller, "pool alloc failed\n"); return retval; @@ -1795,46 +1786,25 @@ int usb_add_hcd(struct usb_hcd *hcd, if ((retval = usb_register_bus(&hcd->self)) < 0) goto err_register_bus; - if ((rhdev = usb_alloc_dev(NULL, &hcd->self, 0)) == NULL) { - dev_err(hcd->self.controller, "unable to allocate root hub\n"); - retval = -ENOMEM; - goto err_allocate_root_hub; - } - rhdev->speed = (hcd->driver->flags & HCD_USB2) ? USB_SPEED_HIGH : - USB_SPEED_FULL; - hcd->self.root_hub = rhdev; - - /* wakeup flag init defaults to "everything works" for root hubs, - * but drivers can override it in reset() if needed, along with - * recording the overall controller's system wakeup capability. - */ - device_init_wakeup(&rhdev->dev, 1); - - /* "reset" is misnamed; its role is now one-time init. the controller - * should already have been reset (and boot firmware kicked off etc). - */ - if (hcd->driver->reset && (retval = hcd->driver->reset(hcd)) < 0) { - dev_err(hcd->self.controller, "can't setup\n"); - goto err_hcd_driver_setup; - } + if (hcd->driver->irq) { + char buf[8], *bufp = buf; - /* NOTE: root hub and controller capabilities may not be the same */ - if (device_can_wakeup(hcd->self.controller) - && device_can_wakeup(&hcd->self.root_hub->dev)) - dev_dbg(hcd->self.controller, "supports USB remote wakeup\n"); +#ifdef __sparc__ + bufp = __irq_itoa(irqnum); +#else + sprintf(buf, "%d", irqnum); +#endif - /* enable irqs just before we start the controller */ - if (hcd->driver->irq) { 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 %d failed\n", irqnum); + "request interrupt %s failed\n", bufp); goto err_request_irq; } hcd->irq = irqnum; - dev_info(hcd->self.controller, "irq %d, %s 0x%08llx\n", irqnum, + dev_info(hcd->self.controller, "irq %s, %s 0x%08llx\n", bufp, (hcd->driver->flags & HCD_MEMORY) ? "io mem" : "io base", (unsigned long long)hcd->rsrc_start); @@ -1847,32 +1817,56 @@ int usb_add_hcd(struct usb_hcd *hcd, (unsigned long long)hcd->rsrc_start); } + /* Allocate the root hub before calling hcd->driver->start(), + * but don't register it until afterward so that the hardware + * is running. + */ + if ((rhdev = usb_alloc_dev(NULL, &hcd->self, 0)) == NULL) { + dev_err(hcd->self.controller, "unable to allocate root hub\n"); + retval = -ENOMEM; + goto err_allocate_root_hub; + } + + /* Although in principle hcd->driver->start() might need to use rhdev, + * none of the current drivers do. + */ if ((retval = hcd->driver->start(hcd)) < 0) { dev_err(hcd->self.controller, "startup error %d\n", retval); goto err_hcd_driver_start; } - /* starting here, usbcore will pay attention to this root hub */ + /* hcd->driver->start() reported can_wakeup, probably with + * assistance from board's boot firmware. + * NOTE: normal devices won't enable wakeup by default. + */ + if (hcd->can_wakeup) + dev_dbg(hcd->self.controller, "supports USB remote wakeup\n"); + hcd->remote_wakeup = hcd->can_wakeup; + + rhdev->speed = (hcd->driver->flags & HCD_USB2) ? USB_SPEED_HIGH : + USB_SPEED_FULL; rhdev->bus_mA = min(500u, hcd->power_budget); - if ((retval = register_root_hub(hcd)) != 0) + if ((retval = register_root_hub(rhdev, hcd)) != 0) goto err_register_root_hub; if (hcd->uses_new_polling && hcd->poll_rh) usb_hcd_poll_rh_status(hcd); return retval; -err_register_root_hub: + err_register_root_hub: hcd->driver->stop(hcd); -err_hcd_driver_start: + + err_hcd_driver_start: + usb_put_dev(rhdev); + + err_allocate_root_hub: if (hcd->irq >= 0) free_irq(irqnum, hcd); -err_request_irq: -err_hcd_driver_setup: - hcd->self.root_hub = NULL; - usb_put_dev(rhdev); -err_allocate_root_hub: + + err_request_irq: usb_deregister_bus(&hcd->self); -err_register_bus: + + err_register_bus: hcd_buffer_destroy(hcd); return retval; } @@ -1898,9 +1892,9 @@ void usb_remove_hcd(struct usb_hcd *hcd) hcd->rh_registered = 0; spin_unlock_irq (&hcd_root_hub_lock); - mutex_lock(&usb_bus_list_lock); + down(&usb_bus_list_lock); usb_disconnect(&hcd->self.root_hub); - mutex_unlock(&usb_bus_list_lock); + up(&usb_bus_list_lock); hcd->poll_rh = 0; del_timer_sync(&hcd->rh_timer); diff --git a/drivers/usb/core/hcd.h b/drivers/usb/core/hcd.h index 7022aafb2..591b5aad1 100644 --- a/drivers/usb/core/hcd.h +++ b/drivers/usb/core/hcd.h @@ -78,6 +78,8 @@ struct usb_hcd { /* usb_bus.hcpriv points to this */ #define HCD_FLAG_HW_ACCESSIBLE 0x00000001 #define HCD_FLAG_SAW_IRQ 0x00000002 + unsigned can_wakeup:1; /* hw supports wakeup? */ + unsigned remote_wakeup:1;/* sw should use wakeup? */ unsigned rh_registered:1;/* is root hub registered? */ /* The next flag is a stopgap, to be removed when all the HCDs @@ -362,7 +364,7 @@ extern void usb_set_device_state(struct usb_device *udev, /* exported only within usbcore */ extern struct list_head usb_bus_list; -extern struct mutex usb_bus_list_lock; +extern struct semaphore usb_bus_list_lock; extern wait_queue_head_t usb_kill_urb_queue; extern struct usb_bus *usb_bus_get (struct usb_bus *bus); diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index 26c8cb5f3..650d5ee58 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c @@ -8,6 +8,7 @@ * */ +#include #include #include #include @@ -21,7 +22,6 @@ #include #include #include -#include #include #include @@ -431,22 +431,15 @@ 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); - - /* 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) + u16 wHubCharacteristics = le16_to_cpu(hub->descriptor->wHubCharacteristics); + + /* if hub supports power switching, enable power on each port */ + if ((wHubCharacteristics & HUB_CHAR_LPSM) < 2) { dev_dbg(hub->intfdev, "enabling power on all ports\n"); - 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); + 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)); @@ -524,16 +517,15 @@ 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_interface *intf) +static void hub_pre_reset(struct usb_hub *hub, int disable_ports) { - 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 (hub->error == 0) + if (disable_ports) hub_port_disable(hub, port1, 0); } } @@ -541,10 +533,8 @@ static void hub_pre_reset(struct usb_interface *intf) } /* caller has locked the hub device */ -static void hub_post_reset(struct usb_interface *intf) +static void hub_post_reset(struct usb_hub *hub) { - struct usb_hub *hub = usb_get_intfdata(intf); - hub_activate(hub); hub_power_on(hub); } @@ -804,16 +794,15 @@ 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; @@ -846,13 +835,6 @@ static int hub_probe(struct usb_interface *intf, const struct usb_device_id *id) desc = intf->cur_altsetting; hdev = interface_to_usbdev(intf); -#ifdef CONFIG_USB_OTG_BLACKLIST_HUB - if (hdev->parent) { - dev_warn(&intf->dev, "ignoring external hub\n"); - return -ENODEV; - } -#endif - /* Some hubs have a subclass of 1, which AFAICT according to the */ /* specs is not defined, but it works */ if ((desc->desc.bInterfaceSubClass != 0) && @@ -1023,22 +1005,17 @@ void usb_set_device_state(struct usb_device *udev, ; /* do nothing */ else if (new_state != USB_STATE_NOTATTACHED) { udev->state = new_state; - - /* root hub wakeup capabilities are managed out-of-band - * and may involve silicon errata ... ignore them here. - */ - if (udev->parent) { - if (new_state == USB_STATE_CONFIGURED) - device_init_wakeup(&udev->dev, - (udev->actconfig->desc.bmAttributes - & USB_CONFIG_ATT_WAKEUP)); - else if (new_state != USB_STATE_SUSPENDED) - device_init_wakeup(&udev->dev, 0); - } + if (new_state == USB_STATE_CONFIGURED) + device_init_wakeup(&udev->dev, + (udev->actconfig->desc.bmAttributes + & USB_CONFIG_ATT_WAKEUP)); + else if (new_state != USB_STATE_SUSPENDED) + device_init_wakeup(&udev->dev, 0); } else recursively_mark_NOTATTACHED(udev); spin_unlock_irqrestore(&device_state_lock, flags); } +EXPORT_SYMBOL(usb_set_device_state); #ifdef CONFIG_PM @@ -1178,19 +1155,25 @@ static inline const char *plural(int n) static int choose_configuration(struct usb_device *udev) { int i; + u16 devstatus; + int bus_powered; int num_configs; - int insufficient_power = 0; struct usb_host_config *c, *best; + /* If this fails, assume the device is bus-powered */ + devstatus = 0; + usb_get_status(udev, USB_RECIP_DEVICE, 0, &devstatus); + le16_to_cpus(&devstatus); + bus_powered = ((devstatus & (1 << USB_DEVICE_SELF_POWERED)) == 0); + dev_dbg(&udev->dev, "device is %s-powered\n", + bus_powered ? "bus" : "self"); + best = NULL; c = udev->config; num_configs = udev->descriptor.bNumConfigurations; for (i = 0; i < num_configs; (i++, c++)) { - struct usb_interface_descriptor *desc = NULL; - - /* It's possible that a config has no interfaces! */ - if (c->desc.bNumInterfaces > 0) - desc = &c->intf_cache[0]->altsetting->desc; + struct usb_interface_descriptor *desc = + &c->intf_cache[0]->altsetting->desc; /* * HP's USB bus-powered keyboard has only one configuration @@ -1198,19 +1181,6 @@ static int choose_configuration(struct usb_device *udev) * similar errors in their descriptors. If the next test * were allowed to execute, such configurations would always * be rejected and the devices would not work as expected. - * In the meantime, we run the risk of selecting a config - * that requires external power at a time when that power - * isn't available. It seems to be the lesser of two evils. - * - * Bugzilla #6448 reports a device that appears to crash - * when it receives a GET_DEVICE_STATUS request! We don't - * have any other way to tell whether a device is self-powered, - * but since we don't use that information anywhere but here, - * the call has been removed. - * - * Maybe the GET_DEVICE_STATUS call and the test below can - * be reinstated when device firmwares become more reliable. - * Don't hold your breath. */ #if 0 /* Rule out self-powered configs for a bus-powered device */ @@ -1232,19 +1202,16 @@ 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) { - insufficient_power++; + if (c->desc.bMaxPower * 2 > udev->bus_mA) continue; - } /* If the first config's first interface is COMM/2/0xff * (MSFT RNDIS), rule it out unless Linux has host-side * RNDIS support. */ - if (i == 0 && desc - && desc->bInterfaceClass == USB_CLASS_COMM + if (i == 0 && desc->bInterfaceClass == USB_CLASS_COMM && desc->bInterfaceSubClass == 2 && desc->bInterfaceProtocol == 0xff) { -#ifndef CONFIG_USB_NET_RNDIS_HOST +#ifndef CONFIG_USB_NET_RNDIS continue; #else best = c; @@ -1257,8 +1224,8 @@ static int choose_configuration(struct usb_device *udev) * than a vendor-specific driver. */ else if (udev->descriptor.bDeviceClass != USB_CLASS_VENDOR_SPEC && - (!desc || desc->bInterfaceClass != - USB_CLASS_VENDOR_SPEC)) { + desc->bInterfaceClass != + USB_CLASS_VENDOR_SPEC) { best = c; break; } @@ -1269,11 +1236,6 @@ 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, @@ -1790,10 +1752,7 @@ 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 >= 0) - status = (status == 2 ? 0 : -ENODEV); - - if (status) + if (status < 2) dev_dbg(&udev->dev, "gone after usb resume? status %d\n", status); @@ -1882,12 +1841,7 @@ 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) @@ -1922,18 +1876,18 @@ int usb_resume_device(struct usb_device *udev) if (udev->state == USB_STATE_NOTATTACHED) return -ENODEV; +#ifdef CONFIG_USB_SUSPEND /* selective resume of one downstream hub-to-device port */ if (udev->parent) { -#ifdef CONFIG_USB_SUSPEND if (udev->state == USB_STATE_SUSPENDED) { // NOTE swsusp may bork us, device state being wrong... // NOTE this fails if parent is also suspended... status = hub_port_resume(hdev_to_hub(udev->parent), udev->portnum, udev); } else -#endif status = 0; } else +#endif status = finish_device_resume(udev); if (status < 0) dev_dbg(&udev->dev, "can't resume, status %d\n", @@ -2208,7 +2162,7 @@ static int hub_port_init (struct usb_hub *hub, struct usb_device *udev, int port1, int retry_counter) { - static DEFINE_MUTEX(usb_address0_mutex); + static DECLARE_MUTEX(usb_address0_sem); struct usb_device *hdev = hub->hdev; int i, j, retval; @@ -2229,7 +2183,7 @@ hub_port_init (struct usb_hub *hub, struct usb_device *udev, int port1, if (oldspeed == USB_SPEED_LOW) delay = HUB_LONG_RESET_TIME; - mutex_lock(&usb_address0_mutex); + down(&usb_address0_sem); /* Reset the device; full speed may morph to high speed */ retval = hub_port_reset(hub, port1, udev, delay); @@ -2427,7 +2381,7 @@ hub_port_init (struct usb_hub *hub, struct usb_device *udev, int port1, fail: if (retval) hub_port_disable(hub, port1, 0); - mutex_unlock(&usb_address0_mutex); + up(&usb_address0_sem); return retval; } @@ -2758,8 +2712,7 @@ static void hub_events(void) /* If the hub has died, clean up after it */ if (hdev->state == USB_STATE_NOTATTACHED) { - hub->error = -ENODEV; - hub_pre_reset(intf); + hub_pre_reset(hub, 0); goto loop; } @@ -2771,7 +2724,7 @@ static void hub_events(void) dev_dbg (hub_dev, "resetting for error %d\n", hub->error); - ret = usb_reset_composite_device(hdev, intf); + ret = usb_reset_device(hdev); if (ret) { dev_dbg (hub_dev, "error resetting hub: %d\n", ret); @@ -2940,8 +2893,6 @@ 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, }; @@ -3021,9 +2972,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 use this routine to reset a composite device - * (one with multiple interfaces owned by separate drivers)! - * Use usb_reset_composite_device() instead. + * 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. * * Do a port reset, reassign the device's address, and establish its * former operating configuration. If the reset fails, or the device's @@ -3047,6 +2998,7 @@ 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; @@ -3064,6 +3016,14 @@ 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->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) { @@ -3122,87 +3082,11 @@ 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 58b4b1012..3cf945cc5 100644 --- a/drivers/usb/core/inode.c +++ b/drivers/usb/core/inode.c @@ -27,6 +27,7 @@ /*****************************************************************************/ +#include #include #include #include @@ -200,7 +201,7 @@ static void update_sb(struct super_block *sb) if (!root) return; - mutex_lock_nested(&root->d_inode->i_mutex, I_MUTEX_PARENT); + mutex_lock(&root->d_inode->i_mutex); list_for_each_entry(bus, &root->d_subdirs, d_u.d_child) { if (bus->d_inode) { @@ -249,6 +250,7 @@ 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) { @@ -401,8 +403,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->i_private) - file->private_data = inode->i_private; + if (inode->u.generic_ip) + file->private_data = inode->u.generic_ip; return 0; } @@ -508,7 +510,7 @@ static struct dentry *fs_create_file (const char *name, mode_t mode, } else { if (dentry->d_inode) { if (data) - dentry->d_inode->i_private = data; + dentry->d_inode->u.generic_ip = data; if (fops) dentry->d_inode->i_fop = fops; dentry->d_inode->i_uid = uid; @@ -526,7 +528,7 @@ static void fs_remove_file (struct dentry *dentry) if (!parent || !parent->d_inode) return; - mutex_lock_nested(&parent->d_inode->i_mutex, I_MUTEX_PARENT); + mutex_lock(&parent->d_inode->i_mutex); if (usbfs_positive(dentry)) { if (dentry->d_inode) { if (S_ISDIR(dentry->d_inode->i_mode)) @@ -541,10 +543,10 @@ static void fs_remove_file (struct dentry *dentry) /* --------------------------------------------------------------------- */ -static int usb_get_sb(struct file_system_type *fs_type, - int flags, const char *dev_name, void *data, struct vfsmount *mnt) +static struct super_block *usb_get_sb(struct file_system_type *fs_type, + int flags, const char *dev_name, void *data) { - return get_sb_single(fs_type, flags, data, usbfs_fill_super, mnt); + return get_sb_single(fs_type, flags, data, usbfs_fill_super); } static struct file_system_type usb_fs_type = { @@ -567,7 +569,7 @@ static int create_special_files (void) ignore_mount = 1; /* create the devices special file */ - retval = simple_pin_fs(&usb_fs_type, &usbfs_mount, &usbfs_mount_count); + retval = simple_pin_fs("usbfs", &usbfs_mount, &usbfs_mount_count); if (retval) { err ("Unable to get usbfs mount"); goto exit; @@ -694,11 +696,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 = ds->discsignr; + sinfo.si_signo = SIGPIPE; 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, ds->secid); + kill_proc_info_as_uid(ds->discsignr, &sinfo, ds->disc_pid, ds->disc_uid, ds->disc_euid); } } } diff --git a/drivers/usb/core/message.c b/drivers/usb/core/message.c index 4cc8d3e67..96cabeb7a 100644 --- a/drivers/usb/core/message.c +++ b/drivers/usb/core/message.c @@ -2,6 +2,7 @@ * message.c - synchronous message handling */ +#include #include /* for scatterlist macros */ #include #include @@ -156,37 +157,6 @@ 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 @@ -661,8 +631,8 @@ int usb_get_descriptor(struct usb_device *dev, unsigned char type, unsigned char * Returns the number of bytes received on success, or else the status code * returned by the underlying usb_control_msg() call. */ -static int usb_get_string(struct usb_device *dev, unsigned short langid, - unsigned char index, void *buf, int size) +int usb_get_string(struct usb_device *dev, unsigned short langid, + unsigned char index, void *buf, int size) { int i; int result; @@ -1410,12 +1380,6 @@ free_interfaces: return ret; } } - - i = dev->bus_mA - cp->desc.bMaxPower * 2; - if (i < 0) - dev_warn(&dev->dev, "new config #%d exceeds power " - "limit by %dmA\n", - configuration, -i); } /* if it's already configured, clear out old state first. @@ -1424,85 +1388,92 @@ free_interfaces: 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 " + "limit by %dmA\n", + configuration, -i); + } + if ((ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), USB_REQ_SET_CONFIGURATION, 0, configuration, 0, - NULL, 0, USB_CTRL_SET_TIMEOUT)) < 0) { - - /* All the old state is gone, so what else can we do? - * The device is probably useless now anyway. - */ - cp = NULL; - } + NULL, 0, USB_CTRL_SET_TIMEOUT)) < 0) + goto free_interfaces; dev->actconfig = cp; - if (!cp) { + if (!cp) usb_set_device_state(dev, USB_STATE_ADDRESS); - 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); + else { + usb_set_device_state(dev, USB_STATE_CONFIGURED); - 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. + /* Initialize the new interface structures and the + * hc/hcd/usbcore interface/endpoint state. */ - 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); + 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); - if (cp->string == NULL) - cp->string = usb_cache_string(dev, cp->desc.iConfiguration); + 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; + /* 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); } - usb_create_sysfs_intf_files (intf); } return 0; @@ -1519,6 +1490,7 @@ EXPORT_SYMBOL(usb_sg_wait); // synchronous control message convenience routines EXPORT_SYMBOL(usb_get_descriptor); EXPORT_SYMBOL(usb_get_status); +EXPORT_SYMBOL(usb_get_string); EXPORT_SYMBOL(usb_string); // synchronous calls that also maintain usbcore state diff --git a/drivers/usb/core/notify.c b/drivers/usb/core/notify.c index 6b36897ca..fbbebab52 100644 --- a/drivers/usb/core/notify.c +++ b/drivers/usb/core/notify.c @@ -9,13 +9,63 @@ */ +#include #include #include #include -#include #include "usb.h" -static BLOCKING_NOTIFIER_HEAD(usb_notifier_list); + +static struct notifier_block *usb_notifier_list; +static DECLARE_MUTEX(usb_notifier_lock); + +static void usb_notifier_chain_register(struct notifier_block **list, + struct notifier_block *n) +{ + down(&usb_notifier_lock); + while (*list) { + if (n->priority > (*list)->priority) + break; + list = &((*list)->next); + } + n->next = *list; + *list = n; + up(&usb_notifier_lock); +} + +static void usb_notifier_chain_unregister(struct notifier_block **nl, + struct notifier_block *n) +{ + down(&usb_notifier_lock); + while ((*nl)!=NULL) { + if ((*nl)==n) { + *nl = n->next; + goto exit; + } + nl=&((*nl)->next); + } +exit: + up(&usb_notifier_lock); +} + +static int usb_notifier_call_chain(struct notifier_block **n, + unsigned long val, void *v) +{ + int ret=NOTIFY_DONE; + struct notifier_block *nb = *n; + + down(&usb_notifier_lock); + while (nb) { + ret = nb->notifier_call(nb,val,v); + if (ret&NOTIFY_STOP_MASK) { + goto exit; + } + nb = nb->next; + } +exit: + up(&usb_notifier_lock); + return ret; +} /** * usb_register_notify - register a notifier callback whenever a usb change happens @@ -25,7 +75,7 @@ static BLOCKING_NOTIFIER_HEAD(usb_notifier_list); */ void usb_register_notify(struct notifier_block *nb) { - blocking_notifier_chain_register(&usb_notifier_list, nb); + usb_notifier_chain_register(&usb_notifier_list, nb); } EXPORT_SYMBOL_GPL(usb_register_notify); @@ -38,31 +88,27 @@ EXPORT_SYMBOL_GPL(usb_register_notify); */ void usb_unregister_notify(struct notifier_block *nb) { - blocking_notifier_chain_unregister(&usb_notifier_list, nb); + usb_notifier_chain_unregister(&usb_notifier_list, nb); } EXPORT_SYMBOL_GPL(usb_unregister_notify); void usb_notify_add_device(struct usb_device *udev) { - blocking_notifier_call_chain(&usb_notifier_list, USB_DEVICE_ADD, udev); + usb_notifier_call_chain(&usb_notifier_list, USB_DEVICE_ADD, 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); + usb_notifier_call_chain(&usb_notifier_list, USB_DEVICE_REMOVE, udev); } void usb_notify_add_bus(struct usb_bus *ubus) { - blocking_notifier_call_chain(&usb_notifier_list, USB_BUS_ADD, ubus); + usb_notifier_call_chain(&usb_notifier_list, USB_BUS_ADD, ubus); } void usb_notify_remove_bus(struct usb_bus *ubus) { - blocking_notifier_call_chain(&usb_notifier_list, USB_BUS_REMOVE, ubus); + usb_notifier_call_chain(&usb_notifier_list, USB_BUS_REMOVE, ubus); } diff --git a/drivers/usb/core/sysfs.c b/drivers/usb/core/sysfs.c index dec973aff..71d881327 100644 --- a/drivers/usb/core/sysfs.c +++ b/drivers/usb/core/sysfs.c @@ -10,10 +10,208 @@ */ +#include #include #include #include "usb.h" +/* endpoint stuff */ +struct ep_object { + struct usb_endpoint_descriptor *desc; + struct usb_device *udev; + struct kobject kobj; +}; +#define to_ep_object(_kobj) \ + container_of(_kobj, struct ep_object, kobj) + +struct ep_attribute { + struct attribute attr; + ssize_t (*show)(struct usb_device *, + struct usb_endpoint_descriptor *, char *); +}; +#define to_ep_attribute(_attr) \ + container_of(_attr, struct ep_attribute, attr) + +#define EP_ATTR(_name) \ +struct ep_attribute ep_##_name = { \ + .attr = {.name = #_name, .owner = THIS_MODULE, \ + .mode = S_IRUGO}, \ + .show = show_ep_##_name} + +#define usb_ep_attr(field, format_string) \ +static ssize_t show_ep_##field(struct usb_device *udev, \ + struct usb_endpoint_descriptor *desc, \ + char *buf) \ +{ \ + return sprintf(buf, format_string, desc->field); \ +} \ +static EP_ATTR(field); + +usb_ep_attr(bLength, "%02x\n") +usb_ep_attr(bEndpointAddress, "%02x\n") +usb_ep_attr(bmAttributes, "%02x\n") +usb_ep_attr(bInterval, "%02x\n") + +static ssize_t show_ep_wMaxPacketSize(struct usb_device *udev, + struct usb_endpoint_descriptor *desc, char *buf) +{ + return sprintf(buf, "%04x\n", + le16_to_cpu(desc->wMaxPacketSize) & 0x07ff); +} +static EP_ATTR(wMaxPacketSize); + +static ssize_t show_ep_type(struct usb_device *udev, + struct usb_endpoint_descriptor *desc, char *buf) +{ + char *type = "unknown"; + + switch (desc->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) { + case USB_ENDPOINT_XFER_CONTROL: + type = "Control"; + break; + case USB_ENDPOINT_XFER_ISOC: + type = "Isoc"; + break; + case USB_ENDPOINT_XFER_BULK: + type = "Bulk"; + break; + case USB_ENDPOINT_XFER_INT: + type = "Interrupt"; + break; + } + return sprintf(buf, "%s\n", type); +} +static EP_ATTR(type); + +static ssize_t show_ep_interval(struct usb_device *udev, + struct usb_endpoint_descriptor *desc, char *buf) +{ + char unit; + unsigned interval = 0; + unsigned in; + + in = (desc->bEndpointAddress & USB_DIR_IN); + + switch (desc->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) { + case USB_ENDPOINT_XFER_CONTROL: + if (udev->speed == USB_SPEED_HIGH) /* uframes per NAK */ + interval = desc->bInterval; + break; + case USB_ENDPOINT_XFER_ISOC: + interval = 1 << (desc->bInterval - 1); + break; + case USB_ENDPOINT_XFER_BULK: + if (udev->speed == USB_SPEED_HIGH && !in) /* uframes per NAK */ + interval = desc->bInterval; + break; + case USB_ENDPOINT_XFER_INT: + if (udev->speed == USB_SPEED_HIGH) + interval = 1 << (desc->bInterval - 1); + else + interval = desc->bInterval; + break; + } + interval *= (udev->speed == USB_SPEED_HIGH) ? 125 : 1000; + if (interval % 1000) + unit = 'u'; + else { + unit = 'm'; + interval /= 1000; + } + + return sprintf(buf, "%d%cs\n", interval, unit); +} +static EP_ATTR(interval); + +static ssize_t show_ep_direction(struct usb_device *udev, + struct usb_endpoint_descriptor *desc, char *buf) +{ + char *direction; + + if ((desc->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == + USB_ENDPOINT_XFER_CONTROL) + direction = "both"; + else if (desc->bEndpointAddress & USB_DIR_IN) + direction = "in"; + else + direction = "out"; + return sprintf(buf, "%s\n", direction); +} +static EP_ATTR(direction); + +static struct attribute *ep_attrs[] = { + &ep_bLength.attr, + &ep_bEndpointAddress.attr, + &ep_bmAttributes.attr, + &ep_bInterval.attr, + &ep_wMaxPacketSize.attr, + &ep_type.attr, + &ep_interval.attr, + &ep_direction.attr, + NULL, +}; + +static void ep_object_release(struct kobject *kobj) +{ + kfree(to_ep_object(kobj)); +} + +static ssize_t ep_object_show(struct kobject *kobj, struct attribute *attr, + char *buf) +{ + struct ep_object *ep_obj = to_ep_object(kobj); + struct ep_attribute *ep_attr = to_ep_attribute(attr); + + return (ep_attr->show)(ep_obj->udev, ep_obj->desc, buf); +} + +static struct sysfs_ops ep_object_sysfs_ops = { + .show = ep_object_show, +}; + +static struct kobj_type ep_object_ktype = { + .release = ep_object_release, + .sysfs_ops = &ep_object_sysfs_ops, + .default_attrs = ep_attrs, +}; + +static void usb_create_ep_files(struct kobject *parent, + struct usb_host_endpoint *endpoint, + struct usb_device *udev) +{ + struct ep_object *ep_obj; + struct kobject *kobj; + + ep_obj = kzalloc(sizeof(struct ep_object), GFP_KERNEL); + if (!ep_obj) + return; + + ep_obj->desc = &endpoint->desc; + ep_obj->udev = udev; + + kobj = &ep_obj->kobj; + kobject_set_name(kobj, "ep_%02x", endpoint->desc.bEndpointAddress); + kobj->parent = parent; + kobj->ktype = &ep_object_ktype; + + /* Don't use kobject_register, because it generates a hotplug event */ + kobject_init(kobj); + if (kobject_add(kobj) == 0) + endpoint->kobj = kobj; + else + kobject_put(kobj); +} + +static void usb_remove_ep_files(struct usb_host_endpoint *endpoint) +{ + + if (endpoint->kobj) { + kobject_del(endpoint->kobj); + kobject_put(endpoint->kobj); + endpoint->kobj = NULL; + } +} + /* Active configuration fields */ #define usb_actconfig_show(field, multiplier, format_string) \ static ssize_t show_##field (struct device *dev, \ @@ -222,7 +420,7 @@ 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); + usb_create_ep_files(&dev->kobj, &udev->ep0, udev); } void usb_remove_sysfs_dev_files (struct usb_device *udev) @@ -326,7 +524,7 @@ static inline void usb_create_intf_ep_files(struct usb_interface *intf, iface_desc = intf->cur_altsetting; for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) - usb_create_ep_files(&intf->dev, &iface_desc->endpoint[i], + usb_create_ep_files(&intf->dev.kobj, &iface_desc->endpoint[i], udev); } diff --git a/drivers/usb/core/urb.c b/drivers/usb/core/urb.c index 986498837..dad4d8fd8 100644 --- a/drivers/usb/core/urb.c +++ b/drivers/usb/core/urb.c @@ -1,3 +1,4 @@ +#include #include #include #include diff --git a/drivers/usb/core/usb.c b/drivers/usb/core/usb.c index 184c24660..13d1d367f 100644 --- a/drivers/usb/core/usb.c +++ b/drivers/usb/core/usb.c @@ -21,6 +21,7 @@ * are evil. */ +#include #include #include #include @@ -32,7 +33,6 @@ #include #include #include -#include #include #include @@ -639,7 +639,7 @@ struct usb_device *usb_find_device(u16 vendor_id, u16 product_id) struct usb_bus *bus; struct usb_device *dev = NULL; - mutex_lock(&usb_bus_list_lock); + down(&usb_bus_list_lock); for (buslist = usb_bus_list.next; buslist != &usb_bus_list; buslist = buslist->next) { @@ -653,7 +653,7 @@ struct usb_device *usb_find_device(u16 vendor_id, u16 product_id) goto exit; } exit: - mutex_unlock(&usb_bus_list_lock); + up(&usb_bus_list_lock); return dev; } @@ -990,8 +990,6 @@ 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; } @@ -1195,6 +1193,7 @@ EXPORT_SYMBOL(usb_disabled); EXPORT_SYMBOL_GPL(usb_get_intf); EXPORT_SYMBOL_GPL(usb_put_intf); +EXPORT_SYMBOL(usb_alloc_dev); EXPORT_SYMBOL(usb_put_dev); EXPORT_SYMBOL(usb_get_dev); EXPORT_SYMBOL(usb_hub_tt_clear_buffer); @@ -1208,7 +1207,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_disconnect); EXPORT_SYMBOL(__usb_get_extra_descriptor); diff --git a/drivers/usb/core/usb.h b/drivers/usb/core/usb.h index 1217fbbe5..4647e1ebc 100644 --- a/drivers/usb/core/usb.h +++ b/drivers/usb/core/usb.h @@ -4,9 +4,6 @@ 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, @@ -59,7 +56,6 @@ 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; @@ -81,7 +77,6 @@ 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 1a32d9677..ff075a53c 100644 --- a/drivers/usb/gadget/Kconfig +++ b/drivers/usb/gadget/Kconfig @@ -69,11 +69,11 @@ choice often need board-specific hooks. config USB_GADGET_NET2280 - boolean "NetChip 228x" + boolean "NetChip 2280" depends on PCI select USB_GADGET_DUALSPEED help - NetChip 2280 / 2282 is a PCI based USB peripheral controller which + NetChip 2280 is a PCI based USB peripheral controller which supports both full and high speed USB 2.0 data transfers. It has six configurable endpoints, as well as endpoint zero @@ -187,27 +187,10 @@ config USB_OTG Select this only if your OMAP board has a Mini-AB connector. -config USB_GADGET_AT91 - boolean "AT91 USB Device Port" - depends on ARCH_AT91RM9200 - select USB_GADGET_SELECTED - help - Many Atmel AT91 processors (such as the AT91RM2000) have a - full speed USB Device Port with support for five configurable - endpoints (plus endpoint zero). - - Say "y" to link the driver statically, or "m" to build a - dynamically linked module called "at91_udc" and force all - gadget drivers to also be dynamically linked. - -config USB_AT91 - tristate - depends on USB_GADGET_AT91 - default USB_GADGET config USB_GADGET_DUMMY_HCD boolean "Dummy HCD (DEVELOPMENT)" - depends on (USB=y || (USB=m && USB_GADGET=m)) && EXPERIMENTAL + depends on USB && EXPERIMENTAL select USB_GADGET_DUALSPEED help This host controller driver emulates USB, looping all data transfer diff --git a/drivers/usb/gadget/Makefile b/drivers/usb/gadget/Makefile index 5a28e6139..d5fd04d88 100644 --- a/drivers/usb/gadget/Makefile +++ b/drivers/usb/gadget/Makefile @@ -7,7 +7,6 @@ obj-$(CONFIG_USB_PXA2XX) += pxa2xx_udc.o obj-$(CONFIG_USB_GOKU) += goku_udc.o obj-$(CONFIG_USB_OMAP) += omap_udc.o obj-$(CONFIG_USB_LH7A40X) += lh7a40x_udc.o -obj-$(CONFIG_USB_AT91) += at91_udc.o # # USB gadget drivers diff --git a/drivers/usb/gadget/dummy_hcd.c b/drivers/usb/gadget/dummy_hcd.c index 7d1c22c34..9734cb76d 100644 --- a/drivers/usb/gadget/dummy_hcd.c +++ b/drivers/usb/gadget/dummy_hcd.c @@ -36,6 +36,7 @@ #define DEBUG +#include #include #include #include @@ -477,9 +478,10 @@ dummy_alloc_request (struct usb_ep *_ep, gfp_t mem_flags) return NULL; ep = usb_ep_to_dummy_ep (_ep); - req = kzalloc(sizeof(*req), mem_flags); + req = kmalloc (sizeof *req, mem_flags); if (!req) return NULL; + memset (req, 0, sizeof *req); INIT_LIST_HEAD (&req->queue); return &req->req; } @@ -609,8 +611,7 @@ static int dummy_dequeue (struct usb_ep *_ep, struct usb_request *_req) if (!dum->driver) return -ESHUTDOWN; - local_irq_save (flags); - spin_lock (&dum->lock); + spin_lock_irqsave (&dum->lock, flags); list_for_each_entry (req, &ep->queue, queue) { if (&req->req == _req) { list_del_init (&req->queue); @@ -619,7 +620,7 @@ static int dummy_dequeue (struct usb_ep *_ep, struct usb_request *_req) break; } } - spin_unlock (&dum->lock); + spin_unlock_irqrestore (&dum->lock, flags); if (retval == 0) { dev_dbg (udc_dev(dum), @@ -627,7 +628,6 @@ 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 53d584589..f7c6d758e 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 __devinitdata unsigned epnum; +static __initdata unsigned epnum; // #define MANY_ENDPOINTS #ifdef MANY_ENDPOINTS /* more than 15 configurable endpoints */ -static __devinitdata unsigned in_epnum; +static __initdata unsigned in_epnum; #endif @@ -59,7 +59,7 @@ static __devinitdata 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 __devinit +static int __init 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 * __devinit +static struct usb_ep * __init 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 * __devinit usb_ep_autoconfig ( +struct usb_ep * __init usb_ep_autoconfig ( struct usb_gadget *gadget, struct usb_endpoint_descriptor *desc ) @@ -276,7 +276,7 @@ struct usb_ep * __devinit 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 * __devinit usb_ep_autoconfig ( * state such as ep->driver_data and the record of assigned endpoints * used by usb_ep_autoconfig(). */ -void __devinit usb_ep_autoconfig_reset (struct usb_gadget *gadget) +void __init 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 fed484da5..afc84cfb6 100644 --- a/drivers/usb/gadget/ether.c +++ b/drivers/usb/gadget/ether.c @@ -23,6 +23,7 @@ // #define DEBUG 1 // #define VERBOSE +#include #include #include #include @@ -48,7 +49,7 @@ #include #include -#include +#include #include #include @@ -100,9 +101,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) /*-------------------------------------------------------------------------*/ @@ -117,8 +118,6 @@ 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; @@ -183,37 +182,33 @@ struct eth_dev { * parameters are in UTF-8 (superset of ASCII's 7 bit characters). */ -static ushort idVendor; +static ushort __initdata idVendor; module_param(idVendor, ushort, S_IRUGO); MODULE_PARM_DESC(idVendor, "USB Vendor ID"); -static ushort idProduct; +static ushort __initdata idProduct; module_param(idProduct, ushort, S_IRUGO); MODULE_PARM_DESC(idProduct, "USB Product ID"); -static ushort bcdDevice; +static ushort __initdata bcdDevice; module_param(bcdDevice, ushort, S_IRUGO); MODULE_PARM_DESC(bcdDevice, "USB Device version (BCD)"); -static char *iManufacturer; +static char *__initdata iManufacturer; module_param(iManufacturer, charp, S_IRUGO); MODULE_PARM_DESC(iManufacturer, "USB Manufacturer string"); -static char *iProduct; +static char *__initdata iProduct; module_param(iProduct, charp, S_IRUGO); MODULE_PARM_DESC(iProduct, "USB Product string"); -static char *iSerialNumber; -module_param(iSerialNumber, charp, S_IRUGO); -MODULE_PARM_DESC(iSerialNumber, "SerialNumber"); - /* initial value, changed by "ifconfig usb0 hw ether xx:xx:xx:xx:xx:xx" */ -static char *dev_addr; +static char *__initdata dev_addr; module_param(dev_addr, charp, S_IRUGO); MODULE_PARM_DESC(dev_addr, "Device Ethernet Address"); /* this address is invisible to ifconfig */ -static char *host_addr; +static char *__initdata host_addr; module_param(host_addr, charp, S_IRUGO); MODULE_PARM_DESC(host_addr, "Host Ethernet Address"); @@ -258,14 +253,6 @@ MODULE_PARM_DESC(host_addr, "Host Ethernet Address"); #define DEV_CONFIG_CDC #endif -#ifdef CONFIG_USB_GADGET_MUSBHSFC -#define DEV_CONFIG_CDC -#endif - -#ifdef CONFIG_USB_GADGET_MUSB_HDRC -#define DEV_CONFIG_CDC -#endif - /* For CDC-incapable hardware, choose the simple cdc subset. * Anything that talks bulk (without notable bugs) can do this. @@ -319,7 +306,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 @@ -408,7 +395,6 @@ static inline int BITRATE(struct usb_gadget *g) #define STRING_CDC 7 #define STRING_SUBSET 8 #define STRING_RNDIS 9 -#define STRING_SERIALNUMBER 10 /* holds our biggest descriptor (or RNDIS response) */ #define USB_BUFSIZ 256 @@ -467,7 +453,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, @@ -512,7 +498,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, @@ -546,20 +532,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 @@ -596,7 +582,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 */ @@ -876,7 +862,6 @@ static inline void __init hs_subset_descriptors(void) static char manufacturer [50]; static char product_desc [40] = DRIVER_DESC; -static char serial_number [20]; #ifdef DEV_CONFIG_CDC /* address that the host will use ... usually assigned at random */ @@ -887,7 +872,6 @@ static char ethaddr [2 * ETH_ALEN + 1]; static struct usb_string strings [] = { { STRING_MANUFACTURER, manufacturer, }, { STRING_PRODUCT, product_desc, }, - { STRING_SERIALNUMBER, serial_number, }, { STRING_DATA, "Ethernet Data", }, #ifdef DEV_CONFIG_CDC { STRING_CDC, "CDC Ethernet", }, @@ -979,7 +963,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; } @@ -1003,15 +987,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->out_ep->name, result); + DEBUG (dev, "enable %s --> %d\n", + dev->in_ep->name, result); goto done; } } @@ -1068,31 +1052,21 @@ 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) { @@ -1155,7 +1129,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; @@ -1217,7 +1191,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 @@ -1279,7 +1253,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); @@ -1483,7 +1457,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. */ @@ -1500,7 +1474,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 @@ -1575,8 +1549,7 @@ static int eth_change_mtu (struct net_device *net, int new_mtu) { struct eth_dev *dev = netdev_priv(net); - if (dev->rndis) - return -EBUSY; + // FIXME if rndis, don't change while link's live if (new_mtu <= ETH_HLEN || new_mtu > ETH_FRAME_LEN) return -ERANGE; @@ -1652,7 +1625,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. @@ -1671,9 +1644,9 @@ enomem: if (retval) { DEBUG (dev, "rx submit --> %d\n", retval); dev_kfree_skb_any (skb); - spin_lock(&dev->req_lock); + spin_lock (&dev->lock); list_add (&req->list, &dev->rx_reqs); - spin_unlock(&dev->req_lock); + spin_unlock (&dev->lock); } return retval; } @@ -1731,7 +1704,7 @@ quiesce: case -EOVERFLOW: dev->stats.rx_over_errors++; // FALLTHROUGH - + default: dev->stats.rx_errors++; DEBUG (dev, "rx status %d\n", status); @@ -1742,9 +1715,8 @@ quiesce: dev_kfree_skb_any (skb); if (!netif_running (dev->net)) { clean: - spin_lock(&dev->req_lock); + /* nobody reading rx_reqs, so no dev->lock */ list_add (&req->list, &dev->rx_reqs); - spin_unlock(&dev->req_lock); req = NULL; } if (req) @@ -1795,18 +1767,15 @@ 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; - goto done; + return 0; fail: DEBUG (dev, "can't alloc requests\n"); -done: - spin_unlock(&dev->req_lock); return status; } @@ -1816,21 +1785,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->req_lock, flags); + spin_lock_irqsave (&dev->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->req_lock, flags); + spin_unlock_irqrestore (&dev->lock, flags); if (rx_submit (dev, req, gfp_flags) < 0) { defer_kevent (dev, WORK_RX_MEMORY); return; } - spin_lock_irqsave(&dev->req_lock, flags); + spin_lock_irqsave (&dev->lock, flags); } - spin_unlock_irqrestore(&dev->req_lock, flags); + spin_unlock_irqrestore (&dev->lock, flags); } static void eth_work (void *_dev) @@ -1864,9 +1833,9 @@ static void tx_complete (struct usb_ep *ep, struct usb_request *req) } dev->stats.tx_packets++; - spin_lock(&dev->req_lock); + spin_lock (&dev->lock); list_add (&req->list, &dev->tx_reqs); - spin_unlock(&dev->req_lock); + spin_unlock (&dev->lock); dev_kfree_skb_any (skb); atomic_dec (&dev->tx_qlen); @@ -1912,12 +1881,12 @@ static int eth_start_xmit (struct sk_buff *skb, struct net_device *net) /* ignores USB_CDC_PACKET_TYPE_DIRECTED */ } - spin_lock_irqsave(&dev->req_lock, flags); + spin_lock_irqsave (&dev->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->req_lock, flags); + spin_unlock_irqrestore (&dev->lock, flags); /* no buffer copies needed, unless the network stack did it * or the hardware can't use skb buffers. @@ -1930,7 +1899,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); @@ -1971,11 +1940,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->req_lock, flags); + spin_lock_irqsave (&dev->lock, flags); if (list_empty (&dev->tx_reqs)) netif_start_queue (net); list_add (&req->list, &dev->tx_reqs); - spin_unlock_irqrestore(&dev->req_lock, flags); + spin_unlock_irqrestore (&dev->lock, flags); } return 0; } @@ -2016,7 +1985,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"); @@ -2036,16 +2005,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; } @@ -2062,7 +2031,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)) { @@ -2091,7 +2060,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 ); @@ -2110,7 +2079,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); @@ -2147,7 +2116,7 @@ eth_req_free (struct usb_ep *ep, struct usb_request *req) } -static void /* __init_or_exit */ +static void eth_unbind (struct usb_gadget *gadget) { struct eth_dev *dev = get_gadget_data (gadget); @@ -2174,7 +2143,7 @@ eth_unbind (struct usb_gadget *gadget) set_gadget_data (gadget, NULL); } -static u8 __devinit nibble (unsigned char c) +static u8 __init nibble (unsigned char c) { if (likely (isdigit (c))) return c - '0'; @@ -2184,7 +2153,7 @@ static u8 __devinit nibble (unsigned char c) return 0; } -static int __devinit get_ether_addr(const char *str, u8 *dev_addr) +static void __init get_ether_addr (const char *str, u8 *dev_addr) { if (str) { unsigned i; @@ -2199,13 +2168,12 @@ static int __devinit get_ether_addr(const char *str, u8 *dev_addr) dev_addr [i] = num; } if (is_valid_ether_addr (dev_addr)) - return 0; + return; } random_ether_addr(dev_addr); - return 1; } -static int __devinit +static int __init eth_bind (struct usb_gadget *gadget) { struct eth_dev *dev; @@ -2300,10 +2268,6 @@ eth_bind (struct usb_gadget *gadget) strlcpy (manufacturer, iManufacturer, sizeof manufacturer); if (iProduct) strlcpy (product_desc, iProduct, sizeof product_desc); - if (iSerialNumber) { - device_desc.iSerialNumber = STRING_SERIALNUMBER, - strlcpy(serial_number, iSerialNumber, sizeof serial_number); - } /* all we really need is bulk IN/OUT */ usb_ep_autoconfig_reset (gadget); @@ -2316,7 +2280,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; @@ -2353,9 +2317,6 @@ autoconf_fail: hs_subset_descriptors(); } - device_desc.bMaxPacketSize0 = gadget->ep0->maxpacket; - usb_gadget_set_selfpowered (gadget); - /* For now RNDIS is always a second config */ if (rndis) device_desc.bNumConfigurations = 2; @@ -2379,6 +2340,9 @@ autoconf_fail: #endif #endif /* DUALSPEED */ + device_desc.bMaxPacketSize0 = gadget->ep0->maxpacket; + usb_gadget_set_selfpowered (gadget); + if (gadget->is_otg) { otg_descriptor.bmAttributes |= USB_OTG_HNP, eth_config.bmAttributes |= USB_CONFIG_ATT_WAKEUP; @@ -2389,12 +2353,11 @@ 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); @@ -2414,13 +2377,9 @@ autoconf_fail: * The host side address is used with CDC and RNDIS, and commonly * ends up in a persistent config database. */ - if (get_ether_addr(dev_addr, net->dev_addr)) - dev_warn(&gadget->dev, - "using random %s ethernet address\n", "self"); + get_ether_addr(dev_addr, net->dev_addr); if (cdc || rndis) { - if (get_ether_addr(host_addr, dev->host_mac)) - dev_warn(&gadget->dev, - "using random %s ethernet address\n", "host"); + get_ether_addr(host_addr, dev->host_mac); #ifdef DEV_CONFIG_CDC snprintf (ethaddr, sizeof ethaddr, "%02X%02X%02X%02X%02X%02X", dev->host_mac [0], dev->host_mac [1], @@ -2470,7 +2429,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" @@ -2478,8 +2437,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; @@ -2504,7 +2463,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: @@ -2512,7 +2471,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, @@ -2572,7 +2531,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 8d7f1e84c..de59c5889 100644 --- a/drivers/usb/gadget/file_storage.c +++ b/drivers/usb/gadget/file_storage.c @@ -71,12 +71,6 @@ * requirement amounts to two 16K buffers, size configurable by a parameter. * Support is included for both full-speed and high-speed operation. * - * Note that the driver is slightly non-portable in that it assumes a - * single memory/DMA buffer will be useable for bulk-in, bulk-out, and - * interrupt-in endpoints. With most device controllers this isn't an - * issue, but there may be some with hardware restrictions that prevent - * a buffer from being used by more than one endpoint. - * * Module options: * * file=filename[,filename...] @@ -114,14 +108,6 @@ * setting are not allowed when the medium is loaded. * * This gadget driver is heavily based on "Gadget Zero" by David Brownell. - * The driver's SCSI command interface was based on the "Information - * technology - Small Computer System Interface - 2" document from - * X3T9.2 Project 375D, Revision 10L, 7-SEP-93, available at - * . The single exception - * is opcode 0x23 (READ FORMAT CAPACITIES), which was based on the - * "Universal Serial Bus Mass Storage Class UFI Command Specification" - * document, Revision 1.0, December 14, 1998, available at - * . */ @@ -221,6 +207,7 @@ #undef VERBOSE #undef DUMP_MSGS +#include #include #include @@ -347,9 +334,11 @@ MODULE_LICENSE("Dual BSD/GPL"); #define MAX_LUNS 8 + /* Arggh! There should be a module_param_array_named macro! */ +static char *file[MAX_LUNS]; +static int ro[MAX_LUNS]; + static struct { - char *file[MAX_LUNS]; - int ro[MAX_LUNS]; int num_filenames; int num_ros; unsigned int nluns; @@ -381,11 +370,10 @@ static struct { }; -module_param_array_named(file, mod_data.file, charp, &mod_data.num_filenames, - S_IRUGO); +module_param_array(file, charp, &mod_data.num_filenames, S_IRUGO); MODULE_PARM_DESC(file, "names of backing files or devices"); -module_param_array_named(ro, mod_data.ro, bool, &mod_data.num_ros, S_IRUGO); +module_param_array(ro, bool, &mod_data.num_ros, S_IRUGO); MODULE_PARM_DESC(ro, "true to force read-only"); module_param_named(luns, mod_data.nluns, uint, S_IRUGO); @@ -1807,7 +1795,6 @@ static int do_write(struct fsg_dev *fsg) * the bulk-out maxpacket size */ bh->outreq->length = bh->bulk_out_intended_length = amount; - bh->outreq->short_not_ok = 1; start_transfer(fsg, fsg->bulk_out, bh->outreq, &bh->outreq_busy, &bh->state); fsg->next_buffhd_to_fill = bh->next; @@ -1905,6 +1892,7 @@ 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) @@ -1912,6 +1900,7 @@ 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; @@ -2409,7 +2398,6 @@ static int throw_away_data(struct fsg_dev *fsg) * the bulk-out maxpacket size */ bh->outreq->length = bh->bulk_out_intended_length = amount; - bh->outreq->short_not_ok = 1; start_transfer(fsg, fsg->bulk_out, bh->outreq, &bh->outreq_busy, &bh->state); fsg->next_buffhd_to_fill = bh->next; @@ -3041,7 +3029,6 @@ static int get_next_command(struct fsg_dev *fsg) /* Queue a request to read a Bulk-only CBW */ set_bulk_out_req_length(fsg, bh, USB_BULK_CB_WRAP_LEN); - bh->outreq->short_not_ok = 1; start_transfer(fsg, fsg->bulk_out, bh->outreq, &bh->outreq_busy, &bh->state); @@ -3691,7 +3678,7 @@ static void lun_release(struct device *dev) kref_put(&fsg->ref, fsg_release); } -static void /* __init_or_exit */ fsg_unbind(struct usb_gadget *gadget) +static void fsg_unbind(struct usb_gadget *gadget) { struct fsg_dev *fsg = get_gadget_data(gadget); int i; @@ -3872,7 +3859,7 @@ static int __init fsg_bind(struct usb_gadget *gadget) for (i = 0; i < fsg->nluns; ++i) { curlun = &fsg->luns[i]; - curlun->ro = mod_data.ro[i]; + curlun->ro = ro[i]; curlun->dev.parent = &gadget->dev; curlun->dev.driver = &fsg_driver.driver; dev_set_drvdata(&curlun->dev, fsg); @@ -3889,9 +3876,8 @@ static int __init fsg_bind(struct usb_gadget *gadget) kref_get(&fsg->ref); } - if (mod_data.file[i] && *mod_data.file[i]) { - if ((rc = open_backing_file(curlun, - mod_data.file[i])) != 0) + if (file[i] && *file[i]) { + if ((rc = open_backing_file(curlun, file[i])) != 0) goto out; } else if (!mod_data.removable) { ERROR(fsg, "no file given for LUN%d\n", i); @@ -3967,9 +3953,6 @@ static int __init fsg_bind(struct usb_gadget *gadget) for (i = 0; i < NUM_BUFFERS; ++i) { struct fsg_buffhd *bh = &fsg->buffhds[i]; - /* Allocate for the bulk-in endpoint. We assume that - * the buffer will also work with the bulk-out (and - * interrupt-in) endpoint. */ bh->buf = usb_ep_alloc_buffer(fsg->bulk_in, mod_data.buflen, &bh->dma, GFP_KERNEL); if (!bh->buf) @@ -4081,7 +4064,7 @@ static struct usb_gadget_driver fsg_driver = { #endif .function = (char *) longname, .bind = fsg_bind, - .unbind = __exit_p(fsg_unbind), + .unbind = fsg_unbind, .disconnect = fsg_disconnect, .setup = fsg_setup, .suspend = fsg_suspend, diff --git a/drivers/usb/gadget/gadget_chips.h b/drivers/usb/gadget/gadget_chips.h index aa80f0910..8cbae21d8 100644 --- a/drivers/usb/gadget/gadget_chips.h +++ b/drivers/usb/gadget/gadget_chips.h @@ -3,9 +3,9 @@ * gadget drivers or other code that needs to deal with them, and which * autoconfigures instead of using early binding to the hardware. * - * This SHOULD eventually work like the ARM mach_is_*() stuff, driven by + * This could eventually work like the ARM mach_is_*() stuff, driven by * some config file that gets updated as new hardware is supported. - * (And avoiding all runtime comparisons in typical one-choice configs!) + * (And avoiding the runtime comparisons in typical one-choice cases.) * * NOTE: some of these controller drivers may not be available yet. */ @@ -93,26 +93,6 @@ #define gadget_is_imx(g) 0 #endif -/* Mentor high speed function controller */ -#ifdef CONFIG_USB_GADGET_MUSBHSFC -#define gadget_is_musbhsfc(g) !strcmp("musbhsfc_udc", (g)->name) -#else -#define gadget_is_musbhsfc(g) 0 -#endif - -/* Mentor high speed "dual role" controller, in peripheral role */ -#ifdef CONFIG_USB_GADGET_MUSB_HDRC -#define gadget_is_musbhdrc(g) !strcmp("musb_hdrc", (g)->name) -#else -#define gadget_is_musbhdrc(g) 0 -#endif - -#ifdef CONFIG_USB_GADGET_MPC8272 -#define gadget_is_mpc8272(g) !strcmp("mpc8272_udc", (g)->name) -#else -#define gadget_is_mpc8272(g) 0 -#endif - // CONFIG_USB_GADGET_SX2 // CONFIG_USB_GADGET_AU1X00 // ... @@ -163,11 +143,5 @@ static inline int usb_gadget_controller_number(struct usb_gadget *gadget) return 0x13; else if (gadget_is_imx(gadget)) return 0x14; - else if (gadget_is_musbhsfc(gadget)) - return 0x15; - else if (gadget_is_musbhdrc(gadget)) - return 0x16; - else if (gadget_is_mpc8272(gadget)) - return 0x17; return -ENOENT; } diff --git a/drivers/usb/gadget/goku_udc.c b/drivers/usb/gadget/goku_udc.c index 7cf2999e8..b0f3cd63e 100644 --- a/drivers/usb/gadget/goku_udc.c +++ b/drivers/usb/gadget/goku_udc.c @@ -24,6 +24,7 @@ // #define VERBOSE /* extra debug messages (success too) */ // #define USB_TRACE /* packet-level success messages */ +#include #include #include #include @@ -274,10 +275,11 @@ goku_alloc_request(struct usb_ep *_ep, gfp_t gfp_flags) if (!_ep) return NULL; - req = kzalloc(sizeof *req, gfp_flags); + req = kmalloc(sizeof *req, gfp_flags); if (!req) return NULL; + memset(req, 0, sizeof *req); req->req.dma = DMA_ADDR_INVALID; INIT_LIST_HEAD(&req->queue); return &req->req; @@ -1849,6 +1851,7 @@ 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. @@ -1911,14 +1914,20 @@ 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()); - INFO(dev, "irq %d, pci mem %p\n", pdev->irq, base); +#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); /* init to known state, then setup irqs */ udc_reset(dev); udc_reinit (dev); - if (request_irq(pdev->irq, goku_irq, IRQF_SHARED/*|IRQF_SAMPLE_RANDOM*/, + if (request_irq(pdev->irq, goku_irq, SA_SHIRQ/*|SA_SAMPLE_RANDOM*/, driver_name, dev) != 0) { - DBG(dev, "request interrupt %d failed\n", pdev->irq); + DBG(dev, "request interrupt %s failed\n", bufp); retval = -EBUSY; goto done; } diff --git a/drivers/usb/gadget/inode.c b/drivers/usb/gadget/inode.c index 084fe6236..0aab7d24c 100644 --- a/drivers/usb/gadget/inode.c +++ b/drivers/usb/gadget/inode.c @@ -170,9 +170,10 @@ static struct dev_data *dev_new (void) { struct dev_data *dev; - dev = kzalloc(sizeof(*dev), GFP_KERNEL); + dev = kmalloc (sizeof *dev, GFP_KERNEL); if (!dev) return NULL; + memset (dev, 0, sizeof *dev); dev->state = STATE_DEV_DISABLED; atomic_set (&dev->count, 1); spin_lock_init (&dev->lock); @@ -342,7 +343,7 @@ fail: static ssize_t ep_io (struct ep_data *epdata, void *buf, unsigned len) { - DECLARE_COMPLETION_ONSTACK (done); + DECLARE_COMPLETION (done); int value; spin_lock_irq (&epdata->dev->lock); @@ -528,7 +529,7 @@ struct kiocb_priv { struct usb_request *req; struct ep_data *epdata; void *buf; - char __user *ubuf; /* NULL for writes */ + char __user *ubuf; unsigned actual; }; @@ -566,6 +567,7 @@ static ssize_t ep_aio_read_retry(struct kiocb *iocb) status = priv->actual; kfree(priv->buf); kfree(priv); + aio_put_req(iocb); return status; } @@ -579,8 +581,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 (priv->ubuf == NULL - || unlikely(req->actual == 0) + if (NULL == iocb->ki_retry + || unlikely(0 == req->actual) || unlikely(kiocbIsCancelled(iocb))) { kfree(req->buf); kfree(priv); @@ -617,7 +619,7 @@ ep_aio_rwtail( char __user *ubuf ) { - struct kiocb_priv *priv; + struct kiocb_priv *priv = (void *) &iocb->private; struct usb_request *req; ssize_t value; @@ -669,7 +671,7 @@ fail: kfree(priv); put_ep(epdata); } else - value = (ubuf ? -EIOCBRETRY : -EIOCBQUEUED); + value = -EIOCBQUEUED; return value; } @@ -809,7 +811,7 @@ ep_config (struct file *fd, const char __user *buf, size_t len, loff_t *ptr) if (value == 0) data->state = STATE_EP_ENABLED; break; -#ifdef CONFIG_USB_GADGET_DUALSPEED +#ifdef HIGHSPEED case USB_SPEED_HIGH: /* fails if caller didn't provide that descriptor... */ value = usb_ep_enable (ep, &data->hs_desc); @@ -844,7 +846,7 @@ fail1: static int ep_open (struct inode *inode, struct file *fd) { - struct ep_data *data = inode->i_private; + struct ep_data *data = inode->u.generic_ip; int value = -EBUSY; if (down_interruptible (&data->lock) != 0) @@ -981,7 +983,7 @@ ep0_read (struct file *fd, char __user *buf, size_t len, loff_t *ptr) /* assume that was SET_CONFIGURATION */ if (dev->current_config) { unsigned power; -#ifdef CONFIG_USB_GADGET_DUALSPEED +#ifdef HIGHSPEED if (dev->gadget->speed == USB_SPEED_HIGH) power = dev->hs_config->bMaxPower; else @@ -1038,7 +1040,7 @@ scan: /* ep0 can't deliver events when STATE_SETUP */ for (i = 0; i < n; i++) { if (dev->event [i].type == GADGETFS_SETUP) { - len = i + 1; + len = n = i + 1; len *= sizeof (struct usb_gadgetfs_event); n = 0; break; @@ -1261,7 +1263,7 @@ static struct file_operations ep0_io_operations = { * Unrecognized ep0 requests may be handled in user space. */ -#ifdef CONFIG_USB_GADGET_DUALSPEED +#ifdef HIGHSPEED static void make_qualifier (struct dev_data *dev) { struct usb_qualifier_descriptor qual; @@ -1290,7 +1292,7 @@ static int config_buf (struct dev_data *dev, u8 type, unsigned index) { int len; -#ifdef CONFIG_USB_GADGET_DUALSPEED +#ifdef HIGHSPEED int hs; #endif @@ -1298,7 +1300,7 @@ config_buf (struct dev_data *dev, u8 type, unsigned index) if (index > 0) return -EINVAL; -#ifdef CONFIG_USB_GADGET_DUALSPEED +#ifdef HIGHSPEED hs = (dev->gadget->speed == USB_SPEED_HIGH); if (type == USB_DT_OTHER_SPEED_CONFIG) hs = !hs; @@ -1334,12 +1336,12 @@ gadgetfs_setup (struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl) dev->state = STATE_CONNECTED; dev->dev->bMaxPacketSize0 = gadget->ep0->maxpacket; -#ifdef CONFIG_USB_GADGET_DUALSPEED +#ifdef HIGHSPEED if (gadget->speed == USB_SPEED_HIGH && dev->hs_config == 0) { ERROR (dev, "no high speed config??\n"); return -EINVAL; } -#endif /* CONFIG_USB_GADGET_DUALSPEED */ +#endif /* HIGHSPEED */ INFO (dev, "connected\n"); event = next_event (dev, GADGETFS_CONNECT); @@ -1351,11 +1353,11 @@ gadgetfs_setup (struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl) /* ... down_trylock (&data->lock) ... */ if (data->state != STATE_EP_DEFER_ENABLE) continue; -#ifdef CONFIG_USB_GADGET_DUALSPEED +#ifdef HIGHSPEED if (gadget->speed == USB_SPEED_HIGH) value = usb_ep_enable (ep, &data->hs_desc); else -#endif /* CONFIG_USB_GADGET_DUALSPEED */ +#endif /* HIGHSPEED */ value = usb_ep_enable (ep, &data->desc); if (value) { ERROR (dev, "deferred %s enable --> %d\n", @@ -1390,7 +1392,7 @@ gadgetfs_setup (struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl) value = min (w_length, (u16) sizeof *dev->dev); req->buf = dev->dev; break; -#ifdef CONFIG_USB_GADGET_DUALSPEED +#ifdef HIGHSPEED case USB_DT_DEVICE_QUALIFIER: if (!dev->hs_config) break; @@ -1427,7 +1429,7 @@ gadgetfs_setup (struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl) // user mode expected to disable endpoints } else { u8 config, power; -#ifdef CONFIG_USB_GADGET_DUALSPEED +#ifdef HIGHSPEED if (gadget->speed == USB_SPEED_HIGH) { config = dev->hs_config->bConfigurationValue; power = dev->hs_config->bMaxPower; @@ -1580,19 +1582,20 @@ restart: static struct inode * gadgetfs_create_file (struct super_block *sb, char const *name, - void *data, const struct file_operations *fops, + void *data, struct file_operations *fops, struct dentry **dentry_p); 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); + data = kmalloc (sizeof *data, GFP_KERNEL); if (!data) - goto enomem0; + goto enomem; + memset (data, 0, sizeof data); data->state = STATE_EP_DISABLED; init_MUTEX (&data->lock); init_waitqueue_head (&data->wait); @@ -1607,23 +1610,20 @@ static int activate_ep_files (struct dev_data *dev) data->req = usb_ep_alloc_request (ep, GFP_KERNEL); if (!data->req) - goto enomem1; + goto enomem; data->inode = gadgetfs_create_file (dev->sb, data->name, data, &ep_config_operations, &data->dentry); - if (!data->inode) - goto enomem2; + if (!data->inode) { + kfree (data); + goto enomem; + } list_add_tail (&data->epfiles, &dev->epfiles); } return 0; -enomem2: - usb_ep_free_request (ep, data->req); -enomem1: - put_dev (dev); - kfree (data); -enomem0: +enomem: DBG (dev, "%s enomem\n", __FUNCTION__); destroy_ep_files (dev); return -ENOMEM; @@ -1730,7 +1730,7 @@ gadgetfs_suspend (struct usb_gadget *gadget) } static struct usb_gadget_driver gadgetfs_driver = { -#ifdef CONFIG_USB_GADGET_DUALSPEED +#ifdef HIGHSPEED .speed = USB_SPEED_HIGH, #else .speed = USB_SPEED_FULL, @@ -1794,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 as configuration notifications. More complex drivers will handle + * such configuration notifications. More complex drivers will handle * some control requests in user space. */ @@ -1909,7 +1909,7 @@ fail: static int dev_open (struct inode *inode, struct file *fd) { - struct dev_data *dev = inode->i_private; + struct dev_data *dev = inode->u.generic_ip; int value = -EBUSY; if (dev->state == STATE_DEV_DISABLED) { @@ -1957,7 +1957,7 @@ module_param (default_perm, uint, 0644); static struct inode * gadgetfs_make_inode (struct super_block *sb, - void *data, const struct file_operations *fops, + void *data, struct file_operations *fops, int mode) { struct inode *inode = new_inode (sb); @@ -1966,10 +1966,11 @@ 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->i_private = data; + inode->u.generic_ip = data; inode->i_fop = fops; } return inode; @@ -1980,7 +1981,7 @@ gadgetfs_make_inode (struct super_block *sb, */ static struct inode * gadgetfs_create_file (struct super_block *sb, char const *name, - void *data, const struct file_operations *fops, + void *data, struct file_operations *fops, struct dentry **dentry_p) { struct dentry *dentry; @@ -2033,10 +2034,12 @@ gadgetfs_fill_super (struct super_block *sb, void *opts, int silent) NULL, &simple_dir_operations, S_IFDIR | S_IRUGO | S_IXUGO); if (!inode) - goto enomem0; + return -ENOMEM; inode->i_op = &simple_dir_inode_operations; - if (!(d = d_alloc_root (inode))) - goto enomem1; + if (!(d = d_alloc_root (inode))) { + iput (inode); + return -ENOMEM; + } sb->s_root = d; /* the ep0 file is named after the controller we expect; @@ -2044,36 +2047,29 @@ gadgetfs_fill_super (struct super_block *sb, void *opts, int silent) */ dev = dev_new (); if (!dev) - goto enomem2; + return -ENOMEM; dev->sb = sb; - if (!gadgetfs_create_file (sb, CHIP, + if (!(inode = gadgetfs_create_file (sb, CHIP, dev, &dev_init_operations, - &dev->dentry)) - goto enomem3; + &dev->dentry))) { + put_dev(dev); + return -ENOMEM; + } /* 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 int +static struct super_block * gadgetfs_get_sb (struct file_system_type *t, int flags, - const char *path, void *opts, struct vfsmount *mnt) + const char *path, void *opts) { - return get_sb_single (t, flags, opts, gadgetfs_fill_super, mnt); + return get_sb_single (t, flags, opts, gadgetfs_fill_super); } static void diff --git a/drivers/usb/gadget/lh7a40x_udc.c b/drivers/usb/gadget/lh7a40x_udc.c index 36db72579..1a362c5e7 100644 --- a/drivers/usb/gadget/lh7a40x_udc.c +++ b/drivers/usb/gadget/lh7a40x_udc.c @@ -1114,10 +1114,11 @@ static struct usb_request *lh7a40x_alloc_request(struct usb_ep *ep, DEBUG("%s, %p\n", __FUNCTION__, ep); - req = kzalloc(sizeof(*req), gfp_flags); + req = kmalloc(sizeof *req, gfp_flags); if (!req) return 0; + memset(req, 0, sizeof *req); INIT_LIST_HEAD(&req->queue); return &req->req; @@ -2107,7 +2108,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, IRQF_DISABLED, driver_name, + request_irq(IRQ_USBINTR, lh7a40x_udc_irq, SA_INTERRUPT, driver_name, dev); if (retval != 0) { DEBUG(KERN_ERR "%s: can't get irq %i, err %d\n", driver_name, @@ -2143,7 +2144,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 e3bb78524..9b2e6f7cb 100644 --- a/drivers/usb/gadget/lh7a40x_udc.h +++ b/drivers/usb/gadget/lh7a40x_udc.h @@ -24,6 +24,7 @@ #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 09243239d..67b13ab2f 100644 --- a/drivers/usb/gadget/net2280.c +++ b/drivers/usb/gadget/net2280.c @@ -26,8 +26,6 @@ * Copyright (C) 2003 David Brownell * Copyright (C) 2003-2005 PLX Technology, Inc. * - * Modified Seth Levy 2005 PLX Technology, Inc. to provide compatibility with 2282 chip - * * This 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 @@ -46,6 +44,7 @@ #undef DEBUG /* messages on error and most fault paths */ #undef VERBOSE /* extra debug messages (success too) */ +#include #include #include #include @@ -72,8 +71,8 @@ #include -#define DRIVER_DESC "PLX NET228x USB Peripheral Controller" -#define DRIVER_VERSION "2005 Sept 27" +#define DRIVER_DESC "PLX NET2280 USB Peripheral Controller" +#define DRIVER_VERSION "2005 Feb 03" #define DMA_ADDR_INVALID (~(dma_addr_t)0) #define EP_DONTUSE 13 /* nonzero */ @@ -119,7 +118,7 @@ module_param (fifo_mode, ushort, 0644); /* enable_suspend -- When enabled, the driver will respond to * USB suspend requests by powering down the NET2280. Otherwise, * USB suspend requests will be ignored. This is acceptible for - * self-powered devices + * self-powered devices, and helps avoid some quirks. */ static int enable_suspend = 0; @@ -224,11 +223,6 @@ net2280_enable (struct usb_ep *_ep, const struct usb_endpoint_descriptor *desc) ep->is_in = (tmp & USB_DIR_IN) != 0; if (!ep->is_in) writel ((1 << SET_NAK_OUT_PACKETS), &ep->regs->ep_rsp); - else if (dev->pdev->device != 0x2280) { - /* Added for 2282, Don't use nak packets on an in endpoint, this was ignored on 2280 */ - writel ((1 << CLEAR_NAK_OUT_PACKETS) - | (1 << CLEAR_NAK_OUT_PACKETS_MODE), &ep->regs->ep_rsp); - } writel (tmp, &ep->regs->ep_cfg); @@ -238,9 +232,8 @@ net2280_enable (struct usb_ep *_ep, const struct usb_endpoint_descriptor *desc) writel (tmp, &dev->regs->pciirqenb0); tmp = (1 << DATA_PACKET_RECEIVED_INTERRUPT_ENABLE) - | (1 << DATA_PACKET_TRANSMITTED_INTERRUPT_ENABLE); - if (dev->pdev->device == 0x2280) - tmp |= readl (&ep->regs->ep_irqenb); + | (1 << DATA_PACKET_TRANSMITTED_INTERRUPT_ENABLE) + | readl (&ep->regs->ep_irqenb); writel (tmp, &ep->regs->ep_irqenb); } else { /* dma, per-request */ tmp = (1 << (8 + ep->num)); /* completion */ @@ -321,18 +314,10 @@ static void ep_reset (struct net2280_regs __iomem *regs, struct net2280_ep *ep) /* init to our chosen defaults, notably so that we NAK OUT * packets until the driver queues a read (+note erratum 0112) */ - if (!ep->is_in || ep->dev->pdev->device == 0x2280) { - tmp = (1 << SET_NAK_OUT_PACKETS_MODE) + tmp = (1 << SET_NAK_OUT_PACKETS_MODE) | (1 << SET_NAK_OUT_PACKETS) | (1 << CLEAR_EP_HIDE_STATUS_PHASE) | (1 << CLEAR_INTERRUPT_MODE); - } else { - /* added for 2282 */ - tmp = (1 << CLEAR_NAK_OUT_PACKETS_MODE) - | (1 << CLEAR_NAK_OUT_PACKETS) - | (1 << CLEAR_EP_HIDE_STATUS_PHASE) - | (1 << CLEAR_INTERRUPT_MODE); - } if (ep->num != 0) { tmp |= (1 << CLEAR_ENDPOINT_TOGGLE) @@ -341,18 +326,14 @@ static void ep_reset (struct net2280_regs __iomem *regs, struct net2280_ep *ep) writel (tmp, &ep->regs->ep_rsp); /* scrub most status bits, and flush any fifo state */ - if (ep->dev->pdev->device == 0x2280) - tmp = (1 << FIFO_OVERFLOW) - | (1 << FIFO_UNDERFLOW); - else - tmp = 0; - - writel (tmp | (1 << TIMEOUT) + writel ( (1 << TIMEOUT) | (1 << USB_STALL_SENT) | (1 << USB_IN_NAK_SENT) | (1 << USB_IN_ACK_RCVD) | (1 << USB_OUT_PING_NAK_SENT) | (1 << USB_OUT_ACK_SENT) + | (1 << FIFO_OVERFLOW) + | (1 << FIFO_UNDERFLOW) | (1 << FIFO_FLUSH) | (1 << SHORT_PACKET_OUT_DONE_INTERRUPT) | (1 << SHORT_PACKET_TRANSFERRED_INTERRUPT) @@ -405,10 +386,11 @@ net2280_alloc_request (struct usb_ep *_ep, gfp_t gfp_flags) return NULL; ep = container_of (_ep, struct net2280_ep, ep); - req = kzalloc(sizeof(*req), gfp_flags); + req = kmalloc (sizeof *req, gfp_flags); if (!req) return NULL; + memset (req, 0, sizeof *req); req->req.dma = DMA_ADDR_INVALID; INIT_LIST_HEAD (&req->queue); @@ -737,7 +719,7 @@ fill_dma_desc (struct net2280_ep *ep, struct net2280_request *req, int valid) */ if (ep->is_in) dmacount |= (1 << DMA_DIRECTION); - if ((!ep->is_in && (dmacount % ep->ep.maxpacket) != 0) || ep->dev->pdev->device != 0x2280) + else if ((dmacount % ep->ep.maxpacket) != 0) dmacount |= (1 << END_OF_CHAIN); req->valid = valid; @@ -779,12 +761,9 @@ static inline void stop_dma (struct net2280_dma_regs __iomem *dma) static void start_queue (struct net2280_ep *ep, u32 dmactl, u32 td_dma) { struct net2280_dma_regs __iomem *dma = ep->dma; - unsigned int tmp = (1 << VALID_BIT) | (ep->is_in << DMA_DIRECTION); - - if (ep->dev->pdev->device != 0x2280) - tmp |= (1 << END_OF_CHAIN); - writel (tmp, &dma->dmacount); + writel ((1 << VALID_BIT) | (ep->is_in << DMA_DIRECTION), + &dma->dmacount); writel (readl (&dma->dmastat), &dma->dmastat); writel (td_dma, &dma->dmadesc); @@ -2132,11 +2111,7 @@ static void handle_ep_small (struct net2280_ep *ep) VDEBUG (ep->dev, "%s ack ep_stat %08x, req %p\n", ep->ep.name, t, req ? &req->req : 0); #endif - if (!ep->is_in || ep->dev->pdev->device == 0x2280) - writel (t & ~(1 << NAK_OUT_PACKETS), &ep->regs->ep_stat); - else - /* Added for 2282 */ - writel (t, &ep->regs->ep_stat); + writel (t & ~(1 << NAK_OUT_PACKETS), &ep->regs->ep_stat); /* for ep0, monitor token irqs to catch data stage length errors * and to synchronize on status. @@ -2165,7 +2140,7 @@ static void handle_ep_small (struct net2280_ep *ep) ep->stopped = 1; set_halt (ep); mode = 2; - } else if (!req && !ep->stopped) + } else if (!req && ep->stopped) write_fifo (ep, NULL); } } else { @@ -2240,8 +2215,7 @@ static void handle_ep_small (struct net2280_ep *ep) if (likely (req)) { req->td->dmacount = 0; t = readl (&ep->regs->ep_avail); - dma_done (ep, req, count, - (ep->out_overflow || t) ? -EOVERFLOW : 0); + dma_done (ep, req, count, t); } /* also flush to prevent erratum 0106 trouble */ @@ -2279,7 +2253,9 @@ static void handle_ep_small (struct net2280_ep *ep) /* if we wrote it all, we're usually done */ if (req->req.actual == req->req.length) { if (ep->num == 0) { - /* send zlps until the status stage */ + /* wait for control status */ + if (mode != 2) + req = NULL; } else if (!req->req.zero || len != ep->ep.maxpacket) mode = 2; } @@ -2362,7 +2338,7 @@ static void handle_stat0_irqs (struct net2280 *dev, u32 stat) u32 raw [2]; struct usb_ctrlrequest r; } u; - int tmp; + int tmp = 0; struct net2280_request *req; if (dev->gadget.speed == USB_SPEED_UNKNOWN) { @@ -2389,19 +2365,14 @@ static void handle_stat0_irqs (struct net2280 *dev, u32 stat) } ep->stopped = 0; dev->protocol_stall = 0; - - if (ep->dev->pdev->device == 0x2280) - tmp = (1 << FIFO_OVERFLOW) - | (1 << FIFO_UNDERFLOW); - else - tmp = 0; - - writel (tmp | (1 << TIMEOUT) + writel ( (1 << TIMEOUT) | (1 << USB_STALL_SENT) | (1 << USB_IN_NAK_SENT) | (1 << USB_IN_ACK_RCVD) | (1 << USB_OUT_PING_NAK_SENT) | (1 << USB_OUT_ACK_SENT) + | (1 << FIFO_OVERFLOW) + | (1 << FIFO_UNDERFLOW) | (1 << SHORT_PACKET_OUT_DONE_INTERRUPT) | (1 << SHORT_PACKET_TRANSFERRED_INTERRUPT) | (1 << DATA_PACKET_RECEIVED_INTERRUPT) @@ -2415,8 +2386,6 @@ static void handle_stat0_irqs (struct net2280 *dev, u32 stat) cpu_to_le32s (&u.raw [0]); cpu_to_le32s (&u.raw [1]); - tmp = 0; - #define w_value le16_to_cpup (&u.r.wValue) #define w_index le16_to_cpup (&u.r.wIndex) #define w_length le16_to_cpup (&u.r.wLength) @@ -2626,17 +2595,10 @@ static void handle_stat1_irqs (struct net2280 *dev, u32 stat) writel (stat, &dev->regs->irqstat1); /* some status we can just ignore */ - if (dev->pdev->device == 0x2280) - stat &= ~((1 << CONTROL_STATUS_INTERRUPT) - | (1 << SUSPEND_REQUEST_INTERRUPT) - | (1 << RESUME_INTERRUPT) - | (1 << SOF_INTERRUPT)); - else - stat &= ~((1 << CONTROL_STATUS_INTERRUPT) - | (1 << RESUME_INTERRUPT) - | (1 << SOF_DOWN_INTERRUPT) - | (1 << SOF_INTERRUPT)); - + stat &= ~((1 << CONTROL_STATUS_INTERRUPT) + | (1 << SUSPEND_REQUEST_INTERRUPT) + | (1 << RESUME_INTERRUPT) + | (1 << SOF_INTERRUPT)); if (!stat) return; // DEBUG (dev, "irqstat1 %08x\n", stat); @@ -2741,10 +2703,6 @@ static irqreturn_t net2280_irq (int irq, void *_dev, struct pt_regs * r) { struct net2280 *dev = _dev; - /* shared interrupt, not ours */ - if (!(readl(&dev->regs->irqstat0) & (1 << INTA_ASSERTED))) - return IRQ_NONE; - spin_lock (&dev->lock); /* handle disconnect, dma, and more */ @@ -2821,6 +2779,7 @@ 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. @@ -2831,13 +2790,13 @@ static int net2280_probe (struct pci_dev *pdev, const struct pci_device_id *id) } /* alloc, and start init */ - dev = kzalloc (sizeof *dev, SLAB_KERNEL); + dev = kmalloc (sizeof *dev, SLAB_KERNEL); if (dev == NULL){ retval = -ENOMEM; goto done; } - pci_set_drvdata (pdev, dev); + memset (dev, 0, sizeof *dev); spin_lock_init (&dev->lock); dev->pdev = pdev; dev->gadget.ops = &net2280_ops; @@ -2894,10 +2853,15 @@ static int net2280_probe (struct pci_dev *pdev, const struct pci_device_id *id) retval = -ENODEV; goto done; } - - if (request_irq (pdev->irq, net2280_irq, IRQF_SHARED, driver_name, dev) +#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) != 0) { - ERROR (dev, "request interrupt %d failed\n", pdev->irq); + ERROR (dev, "request interrupt %s failed\n", bufp); retval = -EBUSY; goto done; } @@ -2945,9 +2909,10 @@ static int net2280_probe (struct pci_dev *pdev, const struct pci_device_id *id) dev->chiprev = get_idx_reg (dev->regs, REG_CHIPREV) & 0xffff; /* done */ + pci_set_drvdata (pdev, dev); INFO (dev, "%s\n", driver_desc); - INFO (dev, "irq %d, pci mem %p, chip rev %04x\n", - pdev->irq, base, dev->chiprev); + INFO (dev, "irq %s, pci mem %p, chip rev %04x\n", + bufp, base, dev->chiprev); INFO (dev, "version: " DRIVER_VERSION "; dma %s\n", use_dma ? (use_dma_chaining ? "chaining" : "enabled") @@ -2965,22 +2930,6 @@ 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); -} - /*-------------------------------------------------------------------------*/ @@ -2991,13 +2940,6 @@ static struct pci_device_id pci_ids [] = { { .device = 0x2280, .subvendor = PCI_ANY_ID, .subdevice = PCI_ANY_ID, -}, { - .class = ((PCI_CLASS_SERIAL_USB << 8) | 0xfe), - .class_mask = ~0, - .vendor = 0x17cc, - .device = 0x2282, - .subvendor = PCI_ANY_ID, - .subdevice = PCI_ANY_ID, }, { /* end: all zeroes */ } }; @@ -3010,7 +2952,6 @@ 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/net2280.h b/drivers/usb/gadget/net2280.h index 957d6df34..fff4509cf 100644 --- a/drivers/usb/gadget/net2280.h +++ b/drivers/usb/gadget/net2280.h @@ -22,7 +22,420 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -#include +/*-------------------------------------------------------------------------*/ + +/* NET2280 MEMORY MAPPED REGISTERS + * + * The register layout came from the chip documentation, and the bit + * number definitions were extracted from chip specification. + * + * Use the shift operator ('<<') to build bit masks, with readl/writel + * to access the registers through PCI. + */ + +/* main registers, BAR0 + 0x0000 */ +struct net2280_regs { + // offset 0x0000 + u32 devinit; +#define LOCAL_CLOCK_FREQUENCY 8 +#define FORCE_PCI_RESET 7 +#define PCI_ID 6 +#define PCI_ENABLE 5 +#define FIFO_SOFT_RESET 4 +#define CFG_SOFT_RESET 3 +#define PCI_SOFT_RESET 2 +#define USB_SOFT_RESET 1 +#define M8051_RESET 0 + u32 eectl; +#define EEPROM_ADDRESS_WIDTH 23 +#define EEPROM_CHIP_SELECT_ACTIVE 22 +#define EEPROM_PRESENT 21 +#define EEPROM_VALID 20 +#define EEPROM_BUSY 19 +#define EEPROM_CHIP_SELECT_ENABLE 18 +#define EEPROM_BYTE_READ_START 17 +#define EEPROM_BYTE_WRITE_START 16 +#define EEPROM_READ_DATA 8 +#define EEPROM_WRITE_DATA 0 + u32 eeclkfreq; + u32 _unused0; + // offset 0x0010 + + u32 pciirqenb0; /* interrupt PCI master ... */ +#define SETUP_PACKET_INTERRUPT_ENABLE 7 +#define ENDPOINT_F_INTERRUPT_ENABLE 6 +#define ENDPOINT_E_INTERRUPT_ENABLE 5 +#define ENDPOINT_D_INTERRUPT_ENABLE 4 +#define ENDPOINT_C_INTERRUPT_ENABLE 3 +#define ENDPOINT_B_INTERRUPT_ENABLE 2 +#define ENDPOINT_A_INTERRUPT_ENABLE 1 +#define ENDPOINT_0_INTERRUPT_ENABLE 0 + u32 pciirqenb1; +#define PCI_INTERRUPT_ENABLE 31 +#define POWER_STATE_CHANGE_INTERRUPT_ENABLE 27 +#define PCI_ARBITER_TIMEOUT_INTERRUPT_ENABLE 26 +#define PCI_PARITY_ERROR_INTERRUPT_ENABLE 25 +#define PCI_MASTER_ABORT_RECEIVED_INTERRUPT_ENABLE 20 +#define PCI_TARGET_ABORT_RECEIVED_INTERRUPT_ENABLE 19 +#define PCI_TARGET_ABORT_ASSERTED_INTERRUPT_ENABLE 18 +#define PCI_RETRY_ABORT_INTERRUPT_ENABLE 17 +#define PCI_MASTER_CYCLE_DONE_INTERRUPT_ENABLE 16 +#define GPIO_INTERRUPT_ENABLE 13 +#define DMA_D_INTERRUPT_ENABLE 12 +#define DMA_C_INTERRUPT_ENABLE 11 +#define DMA_B_INTERRUPT_ENABLE 10 +#define DMA_A_INTERRUPT_ENABLE 9 +#define EEPROM_DONE_INTERRUPT_ENABLE 8 +#define VBUS_INTERRUPT_ENABLE 7 +#define CONTROL_STATUS_INTERRUPT_ENABLE 6 +#define ROOT_PORT_RESET_INTERRUPT_ENABLE 4 +#define SUSPEND_REQUEST_INTERRUPT_ENABLE 3 +#define SUSPEND_REQUEST_CHANGE_INTERRUPT_ENABLE 2 +#define RESUME_INTERRUPT_ENABLE 1 +#define SOF_INTERRUPT_ENABLE 0 + u32 cpu_irqenb0; /* ... or onboard 8051 */ +#define SETUP_PACKET_INTERRUPT_ENABLE 7 +#define ENDPOINT_F_INTERRUPT_ENABLE 6 +#define ENDPOINT_E_INTERRUPT_ENABLE 5 +#define ENDPOINT_D_INTERRUPT_ENABLE 4 +#define ENDPOINT_C_INTERRUPT_ENABLE 3 +#define ENDPOINT_B_INTERRUPT_ENABLE 2 +#define ENDPOINT_A_INTERRUPT_ENABLE 1 +#define ENDPOINT_0_INTERRUPT_ENABLE 0 + u32 cpu_irqenb1; +#define CPU_INTERRUPT_ENABLE 31 +#define POWER_STATE_CHANGE_INTERRUPT_ENABLE 27 +#define PCI_ARBITER_TIMEOUT_INTERRUPT_ENABLE 26 +#define PCI_PARITY_ERROR_INTERRUPT_ENABLE 25 +#define PCI_INTA_INTERRUPT_ENABLE 24 +#define PCI_PME_INTERRUPT_ENABLE 23 +#define PCI_SERR_INTERRUPT_ENABLE 22 +#define PCI_PERR_INTERRUPT_ENABLE 21 +#define PCI_MASTER_ABORT_RECEIVED_INTERRUPT_ENABLE 20 +#define PCI_TARGET_ABORT_RECEIVED_INTERRUPT_ENABLE 19 +#define PCI_RETRY_ABORT_INTERRUPT_ENABLE 17 +#define PCI_MASTER_CYCLE_DONE_INTERRUPT_ENABLE 16 +#define GPIO_INTERRUPT_ENABLE 13 +#define DMA_D_INTERRUPT_ENABLE 12 +#define DMA_C_INTERRUPT_ENABLE 11 +#define DMA_B_INTERRUPT_ENABLE 10 +#define DMA_A_INTERRUPT_ENABLE 9 +#define EEPROM_DONE_INTERRUPT_ENABLE 8 +#define VBUS_INTERRUPT_ENABLE 7 +#define CONTROL_STATUS_INTERRUPT_ENABLE 6 +#define ROOT_PORT_RESET_INTERRUPT_ENABLE 4 +#define SUSPEND_REQUEST_INTERRUPT_ENABLE 3 +#define SUSPEND_REQUEST_CHANGE_INTERRUPT_ENABLE 2 +#define RESUME_INTERRUPT_ENABLE 1 +#define SOF_INTERRUPT_ENABLE 0 + + // offset 0x0020 + u32 _unused1; + u32 usbirqenb1; +#define USB_INTERRUPT_ENABLE 31 +#define POWER_STATE_CHANGE_INTERRUPT_ENABLE 27 +#define PCI_ARBITER_TIMEOUT_INTERRUPT_ENABLE 26 +#define PCI_PARITY_ERROR_INTERRUPT_ENABLE 25 +#define PCI_INTA_INTERRUPT_ENABLE 24 +#define PCI_PME_INTERRUPT_ENABLE 23 +#define PCI_SERR_INTERRUPT_ENABLE 22 +#define PCI_PERR_INTERRUPT_ENABLE 21 +#define PCI_MASTER_ABORT_RECEIVED_INTERRUPT_ENABLE 20 +#define PCI_TARGET_ABORT_RECEIVED_INTERRUPT_ENABLE 19 +#define PCI_RETRY_ABORT_INTERRUPT_ENABLE 17 +#define PCI_MASTER_CYCLE_DONE_INTERRUPT_ENABLE 16 +#define GPIO_INTERRUPT_ENABLE 13 +#define DMA_D_INTERRUPT_ENABLE 12 +#define DMA_C_INTERRUPT_ENABLE 11 +#define DMA_B_INTERRUPT_ENABLE 10 +#define DMA_A_INTERRUPT_ENABLE 9 +#define EEPROM_DONE_INTERRUPT_ENABLE 8 +#define VBUS_INTERRUPT_ENABLE 7 +#define CONTROL_STATUS_INTERRUPT_ENABLE 6 +#define ROOT_PORT_RESET_INTERRUPT_ENABLE 4 +#define SUSPEND_REQUEST_INTERRUPT_ENABLE 3 +#define SUSPEND_REQUEST_CHANGE_INTERRUPT_ENABLE 2 +#define RESUME_INTERRUPT_ENABLE 1 +#define SOF_INTERRUPT_ENABLE 0 + u32 irqstat0; +#define INTA_ASSERTED 12 +#define SETUP_PACKET_INTERRUPT 7 +#define ENDPOINT_F_INTERRUPT 6 +#define ENDPOINT_E_INTERRUPT 5 +#define ENDPOINT_D_INTERRUPT 4 +#define ENDPOINT_C_INTERRUPT 3 +#define ENDPOINT_B_INTERRUPT 2 +#define ENDPOINT_A_INTERRUPT 1 +#define ENDPOINT_0_INTERRUPT 0 + u32 irqstat1; +#define POWER_STATE_CHANGE_INTERRUPT 27 +#define PCI_ARBITER_TIMEOUT_INTERRUPT 26 +#define PCI_PARITY_ERROR_INTERRUPT 25 +#define PCI_INTA_INTERRUPT 24 +#define PCI_PME_INTERRUPT 23 +#define PCI_SERR_INTERRUPT 22 +#define PCI_PERR_INTERRUPT 21 +#define PCI_MASTER_ABORT_RECEIVED_INTERRUPT 20 +#define PCI_TARGET_ABORT_RECEIVED_INTERRUPT 19 +#define PCI_RETRY_ABORT_INTERRUPT 17 +#define PCI_MASTER_CYCLE_DONE_INTERRUPT 16 +#define GPIO_INTERRUPT 13 +#define DMA_D_INTERRUPT 12 +#define DMA_C_INTERRUPT 11 +#define DMA_B_INTERRUPT 10 +#define DMA_A_INTERRUPT 9 +#define EEPROM_DONE_INTERRUPT 8 +#define VBUS_INTERRUPT 7 +#define CONTROL_STATUS_INTERRUPT 6 +#define ROOT_PORT_RESET_INTERRUPT 4 +#define SUSPEND_REQUEST_INTERRUPT 3 +#define SUSPEND_REQUEST_CHANGE_INTERRUPT 2 +#define RESUME_INTERRUPT 1 +#define SOF_INTERRUPT 0 + // offset 0x0030 + u32 idxaddr; + u32 idxdata; + u32 fifoctl; +#define PCI_BASE2_RANGE 16 +#define IGNORE_FIFO_AVAILABILITY 3 +#define PCI_BASE2_SELECT 2 +#define FIFO_CONFIGURATION_SELECT 0 + u32 _unused2; + // offset 0x0040 + u32 memaddr; +#define START 28 +#define DIRECTION 27 +#define FIFO_DIAGNOSTIC_SELECT 24 +#define MEMORY_ADDRESS 0 + u32 memdata0; + u32 memdata1; + u32 _unused3; + // offset 0x0050 + u32 gpioctl; +#define GPIO3_LED_SELECT 12 +#define GPIO3_INTERRUPT_ENABLE 11 +#define GPIO2_INTERRUPT_ENABLE 10 +#define GPIO1_INTERRUPT_ENABLE 9 +#define GPIO0_INTERRUPT_ENABLE 8 +#define GPIO3_OUTPUT_ENABLE 7 +#define GPIO2_OUTPUT_ENABLE 6 +#define GPIO1_OUTPUT_ENABLE 5 +#define GPIO0_OUTPUT_ENABLE 4 +#define GPIO3_DATA 3 +#define GPIO2_DATA 2 +#define GPIO1_DATA 1 +#define GPIO0_DATA 0 + u32 gpiostat; +#define GPIO3_INTERRUPT 3 +#define GPIO2_INTERRUPT 2 +#define GPIO1_INTERRUPT 1 +#define GPIO0_INTERRUPT 0 +} __attribute__ ((packed)); + +/* usb control, BAR0 + 0x0080 */ +struct net2280_usb_regs { + // offset 0x0080 + u32 stdrsp; +#define STALL_UNSUPPORTED_REQUESTS 31 +#define SET_TEST_MODE 16 +#define GET_OTHER_SPEED_CONFIGURATION 15 +#define GET_DEVICE_QUALIFIER 14 +#define SET_ADDRESS 13 +#define ENDPOINT_SET_CLEAR_HALT 12 +#define DEVICE_SET_CLEAR_DEVICE_REMOTE_WAKEUP 11 +#define GET_STRING_DESCRIPTOR_2 10 +#define GET_STRING_DESCRIPTOR_1 9 +#define GET_STRING_DESCRIPTOR_0 8 +#define GET_SET_INTERFACE 6 +#define GET_SET_CONFIGURATION 5 +#define GET_CONFIGURATION_DESCRIPTOR 4 +#define GET_DEVICE_DESCRIPTOR 3 +#define GET_ENDPOINT_STATUS 2 +#define GET_INTERFACE_STATUS 1 +#define GET_DEVICE_STATUS 0 + u32 prodvendid; +#define PRODUCT_ID 16 +#define VENDOR_ID 0 + u32 relnum; + u32 usbctl; +#define SERIAL_NUMBER_INDEX 16 +#define PRODUCT_ID_STRING_ENABLE 13 +#define VENDOR_ID_STRING_ENABLE 12 +#define USB_ROOT_PORT_WAKEUP_ENABLE 11 +#define VBUS_PIN 10 +#define TIMED_DISCONNECT 9 +#define SUSPEND_IMMEDIATELY 7 +#define SELF_POWERED_USB_DEVICE 6 +#define REMOTE_WAKEUP_SUPPORT 5 +#define PME_POLARITY 4 +#define USB_DETECT_ENABLE 3 +#define PME_WAKEUP_ENABLE 2 +#define DEVICE_REMOTE_WAKEUP_ENABLE 1 +#define SELF_POWERED_STATUS 0 + // offset 0x0090 + u32 usbstat; +#define HIGH_SPEED 7 +#define FULL_SPEED 6 +#define GENERATE_RESUME 5 +#define GENERATE_DEVICE_REMOTE_WAKEUP 4 + u32 xcvrdiag; +#define FORCE_HIGH_SPEED_MODE 31 +#define FORCE_FULL_SPEED_MODE 30 +#define USB_TEST_MODE 24 +#define LINE_STATE 16 +#define TRANSCEIVER_OPERATION_MODE 2 +#define TRANSCEIVER_SELECT 1 +#define TERMINATION_SELECT 0 + u32 setup0123; + u32 setup4567; + // offset 0x0090 + u32 _unused0; + u32 ouraddr; +#define FORCE_IMMEDIATE 7 +#define OUR_USB_ADDRESS 0 + u32 ourconfig; +} __attribute__ ((packed)); + +/* pci control, BAR0 + 0x0100 */ +struct net2280_pci_regs { + // offset 0x0100 + u32 pcimstctl; +#define PCI_ARBITER_PARK_SELECT 13 +#define PCI_MULTI LEVEL_ARBITER 12 +#define PCI_RETRY_ABORT_ENABLE 11 +#define DMA_MEMORY_WRITE_AND_INVALIDATE_ENABLE 10 +#define DMA_READ_MULTIPLE_ENABLE 9 +#define DMA_READ_LINE_ENABLE 8 +#define PCI_MASTER_COMMAND_SELECT 6 +#define MEM_READ_OR_WRITE 0 +#define IO_READ_OR_WRITE 1 +#define CFG_READ_OR_WRITE 2 +#define PCI_MASTER_START 5 +#define PCI_MASTER_READ_WRITE 4 +#define PCI_MASTER_WRITE 0 +#define PCI_MASTER_READ 1 +#define PCI_MASTER_BYTE_WRITE_ENABLES 0 + u32 pcimstaddr; + u32 pcimstdata; + u32 pcimststat; +#define PCI_ARBITER_CLEAR 2 +#define PCI_EXTERNAL_ARBITER 1 +#define PCI_HOST_MODE 0 +} __attribute__ ((packed)); + +/* dma control, BAR0 + 0x0180 ... array of four structs like this, + * for channels 0..3. see also struct net2280_dma: descriptor + * that can be loaded into some of these registers. + */ +struct net2280_dma_regs { /* [11.7] */ + // offset 0x0180, 0x01a0, 0x01c0, 0x01e0, + u32 dmactl; +#define DMA_SCATTER_GATHER_DONE_INTERRUPT_ENABLE 25 +#define DMA_CLEAR_COUNT_ENABLE 21 +#define DESCRIPTOR_POLLING_RATE 19 +#define POLL_CONTINUOUS 0 +#define POLL_1_USEC 1 +#define POLL_100_USEC 2 +#define POLL_1_MSEC 3 +#define DMA_VALID_BIT_POLLING_ENABLE 18 +#define DMA_VALID_BIT_ENABLE 17 +#define DMA_SCATTER_GATHER_ENABLE 16 +#define DMA_OUT_AUTO_START_ENABLE 4 +#define DMA_PREEMPT_ENABLE 3 +#define DMA_FIFO_VALIDATE 2 +#define DMA_ENABLE 1 +#define DMA_ADDRESS_HOLD 0 + u32 dmastat; +#define DMA_SCATTER_GATHER_DONE_INTERRUPT 25 +#define DMA_TRANSACTION_DONE_INTERRUPT 24 +#define DMA_ABORT 1 +#define DMA_START 0 + u32 _unused0 [2]; + // offset 0x0190, 0x01b0, 0x01d0, 0x01f0, + u32 dmacount; +#define VALID_BIT 31 +#define DMA_DIRECTION 30 +#define DMA_DONE_INTERRUPT_ENABLE 29 +#define END_OF_CHAIN 28 +#define DMA_BYTE_COUNT_MASK ((1<<24)-1) +#define DMA_BYTE_COUNT 0 + u32 dmaaddr; + u32 dmadesc; + u32 _unused1; +} __attribute__ ((packed)); + +/* dedicated endpoint registers, BAR0 + 0x0200 */ + +struct net2280_dep_regs { /* [11.8] */ + // offset 0x0200, 0x0210, 0x220, 0x230, 0x240 + u32 dep_cfg; + // offset 0x0204, 0x0214, 0x224, 0x234, 0x244 + u32 dep_rsp; + u32 _unused [2]; +} __attribute__ ((packed)); + +/* configurable endpoint registers, BAR0 + 0x0300 ... array of seven structs + * like this, for ep0 then the configurable endpoints A..F + * ep0 reserved for control; E and F have only 64 bytes of fifo + */ +struct net2280_ep_regs { /* [11.9] */ + // offset 0x0300, 0x0320, 0x0340, 0x0360, 0x0380, 0x03a0, 0x03c0 + u32 ep_cfg; +#define ENDPOINT_BYTE_COUNT 16 +#define ENDPOINT_ENABLE 10 +#define ENDPOINT_TYPE 8 +#define ENDPOINT_DIRECTION 7 +#define ENDPOINT_NUMBER 0 + u32 ep_rsp; +#define SET_NAK_OUT_PACKETS 15 +#define SET_EP_HIDE_STATUS_PHASE 14 +#define SET_EP_FORCE_CRC_ERROR 13 +#define SET_INTERRUPT_MODE 12 +#define SET_CONTROL_STATUS_PHASE_HANDSHAKE 11 +#define SET_NAK_OUT_PACKETS_MODE 10 +#define SET_ENDPOINT_TOGGLE 9 +#define SET_ENDPOINT_HALT 8 +#define CLEAR_NAK_OUT_PACKETS 7 +#define CLEAR_EP_HIDE_STATUS_PHASE 6 +#define CLEAR_EP_FORCE_CRC_ERROR 5 +#define CLEAR_INTERRUPT_MODE 4 +#define CLEAR_CONTROL_STATUS_PHASE_HANDSHAKE 3 +#define CLEAR_NAK_OUT_PACKETS_MODE 2 +#define CLEAR_ENDPOINT_TOGGLE 1 +#define CLEAR_ENDPOINT_HALT 0 + u32 ep_irqenb; +#define SHORT_PACKET_OUT_DONE_INTERRUPT_ENABLE 6 +#define SHORT_PACKET_TRANSFERRED_INTERRUPT_ENABLE 5 +#define DATA_PACKET_RECEIVED_INTERRUPT_ENABLE 3 +#define DATA_PACKET_TRANSMITTED_INTERRUPT_ENABLE 2 +#define DATA_OUT_PING_TOKEN_INTERRUPT_ENABLE 1 +#define DATA_IN_TOKEN_INTERRUPT_ENABLE 0 + u32 ep_stat; +#define FIFO_VALID_COUNT 24 +#define HIGH_BANDWIDTH_OUT_TRANSACTION_PID 22 +#define TIMEOUT 21 +#define USB_STALL_SENT 20 +#define USB_IN_NAK_SENT 19 +#define USB_IN_ACK_RCVD 18 +#define USB_OUT_PING_NAK_SENT 17 +#define USB_OUT_ACK_SENT 16 +#define FIFO_OVERFLOW 13 +#define FIFO_UNDERFLOW 12 +#define FIFO_FULL 11 +#define FIFO_EMPTY 10 +#define FIFO_FLUSH 9 +#define SHORT_PACKET_OUT_DONE_INTERRUPT 6 +#define SHORT_PACKET_TRANSFERRED_INTERRUPT 5 +#define NAK_OUT_PACKETS 4 +#define DATA_PACKET_RECEIVED_INTERRUPT 3 +#define DATA_PACKET_TRANSMITTED_INTERRUPT 2 +#define DATA_OUT_PING_TOKEN_INTERRUPT 1 +#define DATA_IN_TOKEN_INTERRUPT 0 + // offset 0x0310, 0x0330, 0x0350, 0x0370, 0x0390, 0x03b0, 0x03d0 + u32 ep_avail; + u32 ep_data; + u32 _unused0 [2]; +} __attribute__ ((packed)); /*-------------------------------------------------------------------------*/ diff --git a/drivers/usb/gadget/omap_udc.c b/drivers/usb/gadget/omap_udc.c index 65d749a2b..a8972d7c9 100644 --- a/drivers/usb/gadget/omap_udc.c +++ b/drivers/usb/gadget/omap_udc.c @@ -22,6 +22,7 @@ #undef DEBUG #undef VERBOSE +#include #include #include #include @@ -272,8 +273,9 @@ omap_alloc_request(struct usb_ep *ep, gfp_t gfp_flags) { struct omap_req *req; - req = kzalloc(sizeof(*req), gfp_flags); + req = kmalloc(sizeof *req, gfp_flags); if (req) { + memset (req, 0, sizeof *req); req->req.dma = DMA_ADDR_INVALID; INIT_LIST_HEAD (&req->queue); } @@ -772,7 +774,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 & OMAP1_DMA_TOUT_IRQ ... */ + /* if ch_status & OMAP_DMA_TOUT_IRQ ... */ ERR("%s dma error, lch %d status %02x\n", ep->ep.name, lch, ch_status); /* complete current transfer ... */ @@ -2584,10 +2586,11 @@ omap_udc_setup(struct platform_device *odev, struct otg_transceiver *xceiv) /* UDC_PULLUP_EN gates the chip clock */ // OTG_SYSCON_1_REG |= DEV_IDLE_EN; - udc = kzalloc(sizeof(*udc), SLAB_KERNEL); + udc = kmalloc (sizeof *udc, SLAB_KERNEL); if (!udc) return -ENOMEM; + memset(udc, 0, sizeof *udc); spin_lock_init (&udc->lock); udc->gadget.ops = &omap_gadget_ops; @@ -2818,7 +2821,7 @@ bad_on_1710: /* USB general purpose IRQ: ep0, state changes, dma, etc */ status = request_irq(pdev->resource[1].start, omap_udc_irq, - IRQF_SAMPLE_RANDOM, driver_name, udc); + SA_SAMPLE_RANDOM, driver_name, udc); if (status != 0) { ERR( "can't get irq %ld, err %d\n", pdev->resource[1].start, status); @@ -2827,7 +2830,7 @@ bad_on_1710: /* USB "non-iso" IRQ (PIO for all but ep0) */ status = request_irq(pdev->resource[2].start, omap_udc_pio_irq, - IRQF_SAMPLE_RANDOM, "omap_udc pio", udc); + SA_SAMPLE_RANDOM, "omap_udc pio", udc); if (status != 0) { ERR( "can't get irq %ld, err %d\n", pdev->resource[2].start, status); @@ -2835,7 +2838,7 @@ bad_on_1710: } #ifdef USE_ISO status = request_irq(pdev->resource[3].start, omap_udc_iso_irq, - IRQF_DISABLED, "omap_udc iso", udc); + SA_INTERRUPT, "omap_udc iso", udc); if (status != 0) { ERR("can't get irq %ld, err %d\n", pdev->resource[3].start, status); @@ -2869,7 +2872,7 @@ cleanup0: static int __exit omap_udc_remove(struct platform_device *pdev) { - DECLARE_COMPLETION_ONSTACK(done); + DECLARE_COMPLETION(done); if (!udc) return -ENODEV; diff --git a/drivers/usb/gadget/pxa2xx_udc.c b/drivers/usb/gadget/pxa2xx_udc.c index fff027d30..bb028c5b8 100644 --- a/drivers/usb/gadget/pxa2xx_udc.c +++ b/drivers/usb/gadget/pxa2xx_udc.c @@ -27,6 +27,7 @@ #undef DEBUG // #define VERBOSE DBG_VERBOSE +#include #include #include #include @@ -52,9 +53,7 @@ #include #include #include -#ifdef CONFIG_ARCH_PXA #include -#endif #include #include @@ -336,10 +335,11 @@ pxa2xx_ep_alloc_request (struct usb_ep *_ep, gfp_t gfp_flags) { struct pxa2xx_request *req; - req = kzalloc(sizeof(*req), gfp_flags); + req = kmalloc (sizeof *req, gfp_flags); if (!req) return NULL; + memset (req, 0, sizeof *req); INIT_LIST_HEAD (&req->queue); return &req->req; } @@ -546,7 +546,6 @@ 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 @@ -566,7 +565,6 @@ 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"); @@ -1588,7 +1586,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 @@ -2430,7 +2428,6 @@ 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 @@ -2467,8 +2464,6 @@ 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 @@ -2521,7 +2516,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, - IRQF_DISABLED, driver_name, dev); + SA_INTERRUPT, driver_name, dev); if (retval != 0) { printk(KERN_ERR "%s: can't get irq %i, err %d\n", driver_name, IRQ_USB, retval); @@ -2533,7 +2528,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, - IRQF_DISABLED | IRQF_SAMPLE_RANDOM, + SA_INTERRUPT | SA_SAMPLE_RANDOM, driver_name, dev); if (retval != 0) { printk(KERN_ERR "%s: can't get irq %i, err %d\n", @@ -2544,7 +2539,7 @@ lubbock_fail0: } retval = request_irq(LUBBOCK_USB_IRQ, lubbock_vbus_irq, - IRQF_DISABLED | IRQF_SAMPLE_RANDOM, + SA_INTERRUPT | SA_SAMPLE_RANDOM, driver_name, dev); if (retval != 0) { printk(KERN_ERR "%s: can't get irq %i, err %d\n", @@ -2581,12 +2576,10 @@ 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 408c3380d..6d6eaad73 100644 --- a/drivers/usb/gadget/rndis.c +++ b/drivers/usb/gadget/rndis.c @@ -1,28 +1,29 @@ -/* +/* * 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 @@ -81,7 +82,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, @@ -102,7 +103,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, @@ -126,14 +127,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, @@ -171,8 +172,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; @@ -210,27 +211,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__); @@ -238,7 +239,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__); @@ -248,7 +249,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) @@ -271,7 +272,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__); @@ -281,7 +282,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__); @@ -289,7 +290,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__); @@ -355,7 +356,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; @@ -368,13 +369,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) @@ -385,7 +386,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) @@ -396,7 +397,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__); @@ -410,7 +411,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 @@ -418,7 +419,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] @@ -427,14 +428,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] @@ -443,7 +444,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) { @@ -452,7 +453,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) { @@ -461,7 +462,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) { @@ -470,7 +471,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) { @@ -479,19 +480,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) { @@ -500,7 +501,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) { @@ -509,7 +510,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) { @@ -518,7 +519,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) { @@ -527,7 +528,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) { @@ -536,7 +537,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); @@ -557,7 +558,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__); @@ -569,7 +570,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__); @@ -577,7 +578,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__); @@ -585,7 +586,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; @@ -601,56 +602,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 @@ -675,23 +676,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) @@ -744,9 +745,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; @@ -795,29 +796,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); @@ -836,11 +837,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; } @@ -848,10 +849,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 @@ -863,10 +864,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, @@ -880,10 +881,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; } @@ -892,7 +893,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; @@ -905,27 +906,26 @@ 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 __devinit rndis_init (void) +int __init rndis_init (void) { u8 i; @@ -1408,7 +1408,7 @@ int __devinit 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 __devinit 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 4c3c7259f..95b4c6326 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 __devinit rndis_init (void); +int __init 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 e762aa19a..ba9acd531 100644 --- a/drivers/usb/gadget/serial.c +++ b/drivers/usb/gadget/serial.c @@ -17,6 +17,7 @@ * */ +#include #include #include #include @@ -44,16 +45,88 @@ #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.2" -#define GS_VERSION_NUM 0x0202 +#define GS_VERSION_STR "v2.0" +#define GS_VERSION_NUM 0x0200 #define GS_LONG_NAME "Gadget Serial" #define GS_SHORT_NAME "g_serial" @@ -296,7 +369,7 @@ static struct usb_gadget_driver gs_gadget_driver = { #endif /* CONFIG_USB_GADGET_DUALSPEED */ .function = GS_LONG_NAME, .bind = gs_bind, - .unbind = __exit_p(gs_unbind), + .unbind = gs_unbind, .setup = gs_setup, .disconnect = gs_disconnect, .driver = { @@ -587,11 +660,12 @@ 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_DYNAMIC_DEV; + gs_tty_driver->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_NO_DEVFS; 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); @@ -769,19 +843,9 @@ 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; @@ -795,7 +859,7 @@ static void gs_close(struct tty_struct *tty, struct file *file) sem = &gs_open_close_sem[port->port_num]; down(sem); - spin_lock_irq(&port->port_lock); + spin_lock_irqsave(&port->port_lock, flags); if (port->port_open_count == 0) { printk(KERN_ERR @@ -823,11 +887,12 @@ static void gs_close(struct tty_struct *tty, struct file *file) /* wait for write buffer to drain, or */ /* at most GS_CLOSE_TIMEOUT seconds */ if (gs_buf_data_avail(port->port_write_buf) > 0) { - spin_unlock_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); + spin_unlock_irqrestore(&port->port_lock, flags); + wait_cond_interruptible_timeout(port->port_write_wait, + port->port_dev == NULL + || gs_buf_data_avail(port->port_write_buf) == 0, + &port->port_lock, flags, GS_CLOSE_TIMEOUT * HZ); + spin_lock_irqsave(&port->port_lock, flags); } /* free disconnected port on final close */ @@ -847,7 +912,7 @@ static void gs_close(struct tty_struct *tty, struct file *file) port->port_num, tty, file); exit: - spin_unlock_irq(&port->port_lock); + spin_unlock_irqrestore(&port->port_lock, flags); up(sem); } @@ -1348,7 +1413,7 @@ requeue: * Called on module load. Allocates and initializes the device * structure and a control request. */ -static int __init gs_bind(struct usb_gadget *gadget) +static int gs_bind(struct usb_gadget *gadget) { int ret; struct usb_ep *ep; @@ -1473,7 +1538,7 @@ autoconf_fail: * Called on module unload. Frees the control request and device * structure. */ -static void /* __init_or_exit */ gs_unbind(struct usb_gadget *gadget) +static void gs_unbind(struct usb_gadget *gadget) { struct gs_dev *dev = get_gadget_data(gadget); @@ -2113,9 +2178,10 @@ static int gs_alloc_ports(struct gs_dev *dev, gfp_t kmalloc_flags) return -EIO; for (i=0; iport_dev = dev; port->port_num = i; port->port_line_coding.dwDTERate = cpu_to_le32(GS_DEFAULT_DTE_RATE); diff --git a/drivers/usb/gadget/zero.c b/drivers/usb/gadget/zero.c index b7018ee48..ae7a1c0f5 100644 --- a/drivers/usb/gadget/zero.c +++ b/drivers/usb/gadget/zero.c @@ -62,6 +62,7 @@ #define DEBUG 1 // #define VERBOSE +#include #include #include #include @@ -571,10 +572,9 @@ static void source_sink_complete (struct usb_ep *ep, struct usb_request *req) switch (status) { case 0: /* normal completion? */ - if (ep == dev->out_ep) { + if (ep == dev->out_ep) check_read_data (dev, ep, req); - memset (req->buf, 0x55, req->length); - } else + else reinit_write_data (dev, ep, req); break; @@ -626,8 +626,6 @@ source_sink_start_ep (struct usb_ep *ep, gfp_t gfp_flags) if (strcmp (ep->name, EP_IN_NAME) == 0) reinit_write_data (ep->driver_data, ep, req); - else - memset (req->buf, 0x55, req->length); status = usb_ep_queue (ep, req, gfp_flags); if (status) { @@ -1121,7 +1119,7 @@ zero_autoresume (unsigned long _dev) /*-------------------------------------------------------------------------*/ -static void /* __init_or_exit */ +static void zero_unbind (struct usb_gadget *gadget) { struct zero_dev *dev = get_gadget_data (gadget); @@ -1138,7 +1136,7 @@ zero_unbind (struct usb_gadget *gadget) set_gadget_data (gadget, NULL); } -static int __init +static int zero_bind (struct usb_gadget *gadget) { struct zero_dev *dev; @@ -1190,9 +1188,10 @@ autoconf_fail: /* ok, we made sense of the hardware ... */ - dev = kzalloc(sizeof(*dev), SLAB_KERNEL); + dev = kmalloc (sizeof *dev, SLAB_KERNEL); if (!dev) return -ENOMEM; + memset (dev, 0, sizeof *dev); spin_lock_init (&dev->lock); dev->gadget = gadget; set_gadget_data (gadget, dev); @@ -1225,6 +1224,12 @@ autoconf_fail: loopback_config.bmAttributes |= USB_CONFIG_ATT_WAKEUP; } + if (gadget->is_otg) { + otg_descriptor.bmAttributes |= USB_OTG_HNP, + source_sink_config.bmAttributes |= USB_CONFIG_ATT_WAKEUP; + loopback_config.bmAttributes |= USB_CONFIG_ATT_WAKEUP; + } + usb_gadget_set_selfpowered (gadget); init_timer (&dev->resume); @@ -1289,7 +1294,7 @@ static struct usb_gadget_driver zero_driver = { #endif .function = (char *) longname, .bind = zero_bind, - .unbind = __exit_p(zero_unbind), + .unbind = zero_unbind, .setup = zero_setup, .disconnect = zero_disconnect, diff --git a/drivers/usb/host/Kconfig b/drivers/usb/host/Kconfig index b93d71d28..be3fd9bce 100644 --- a/drivers/usb/host/Kconfig +++ b/drivers/usb/host/Kconfig @@ -6,7 +6,7 @@ comment "USB Host Controller Drivers" config USB_EHCI_HCD tristate "EHCI HCD (USB 2.0) support" - depends on USB && USB_ARCH_HAS_EHCI + depends on USB && PCI ---help--- The Enhanced Host Controller Interface (EHCI) is standard for USB 2.0 "high speed" (480 Mbit/sec, 60 Mbyte/sec) host controller hardware. @@ -47,29 +47,12 @@ 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 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. + This supports the EHCI implementation from TransDimension Inc. 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. @@ -144,6 +127,7 @@ 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 @@ -156,6 +140,7 @@ 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-hcd.c b/drivers/usb/host/ehci-hcd.c index d63177a8e..9dd3d14c6 100644 --- a/drivers/usb/host/ehci-hcd.c +++ b/drivers/usb/host/ehci-hcd.c @@ -16,6 +16,7 @@ * Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +#include #include #include #include @@ -625,11 +626,10 @@ static irqreturn_t ehci_irq (struct usb_hcd *hcd, struct pt_regs *regs) writel (status | CMD_RUN, &ehci->regs->command); while (i--) { - int pstatus = readl (&ehci->regs->port_status [i]); - - if (pstatus & PORT_OWNER) + status = readl (&ehci->regs->port_status [i]); + if (status & PORT_OWNER) continue; - if (!(pstatus & PORT_RESUME) + if (!(status & PORT_RESUME) || ehci->reset_done [i] != 0) continue; @@ -889,59 +889,8 @@ MODULE_LICENSE ("GPL"); #ifdef CONFIG_PCI #include "ehci-pci.c" -#define PCI_DRIVER ehci_pci_driver -#endif - -#ifdef CONFIG_MPC834x -#include "ehci-fsl.c" -#define PLATFORM_DRIVER ehci_fsl_driver #endif -#ifdef CONFIG_SOC_AU1200 -#include "ehci-au1xxx.c" -#define PLATFORM_DRIVER ehci_hcd_au1xxx_driver -#endif - -#if !defined(PCI_DRIVER) && !defined(PLATFORM_DRIVER) +#if !defined(CONFIG_PCI) #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-hub.c b/drivers/usb/host/ehci-hub.c index d03e3cad5..69b0b9be7 100644 --- a/drivers/usb/host/ehci-hub.c +++ b/drivers/usb/host/ehci-hub.c @@ -359,8 +359,6 @@ static int ehci_hub_control ( case USB_PORT_FEAT_SUSPEND: if (temp & PORT_RESET) goto error; - if (ehci->no_selective_suspend) - break; if (temp & PORT_SUSPEND) { if ((temp & PORT_PE) == 0) goto error; @@ -516,8 +514,6 @@ static int ehci_hub_control ( temp &= ~PORT_RWC_BITS; switch (wValue) { case USB_PORT_FEAT_SUSPEND: - if (ehci->no_selective_suspend) - break; if ((temp & PORT_PE) == 0 || (temp & PORT_RESET) != 0) goto error; diff --git a/drivers/usb/host/ehci-mem.c b/drivers/usb/host/ehci-mem.c index 766061e02..91c2ab43c 100644 --- a/drivers/usb/host/ehci-mem.c +++ b/drivers/usb/host/ehci-mem.c @@ -75,6 +75,7 @@ static void qh_destroy (struct kref *kref) } if (qh->dummy) ehci_qtd_free (ehci, qh->dummy); + usb_put_dev (qh->dev); dma_pool_free (ehci->qh_pool, qh, qh->qh_dma); } @@ -220,9 +221,13 @@ static int ehci_mem_init (struct ehci_hcd *ehci, gfp_t flags) ehci->periodic [i] = EHCI_LIST_END; /* software shadow of hardware table */ - ehci->pshadow = kcalloc(ehci->periodic_size, sizeof(void *), flags); - if (ehci->pshadow != NULL) - return 0; + ehci->pshadow = kmalloc (ehci->periodic_size * sizeof (void *), flags); + if (ehci->pshadow == NULL) { + goto fail; + } + memset (ehci->pshadow, 0, ehci->periodic_size * sizeof (void *)); + + return 0; fail: ehci_dbg (ehci, "couldn't init memory\n"); diff --git a/drivers/usb/host/ehci-pci.c b/drivers/usb/host/ehci-pci.c index cadffacd9..3a6687df5 100644 --- a/drivers/usb/host/ehci-pci.c +++ b/drivers/usb/host/ehci-pci.c @@ -76,30 +76,6 @@ 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); @@ -112,6 +88,8 @@ 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) { @@ -128,14 +106,19 @@ static int ehci_pci_setup(struct usb_hcd *hcd) } break; case PCI_VENDOR_ID_NVIDIA: - switch (pdev->device) { - /* Some NForce2 chips have problems with selective suspend; - * fixed in newer silicon. + /* 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 0x0068: - pci_read_config_dword(pdev, PCI_REVISION_ID, &temp); - if ((temp & 0xff) < 0xa4) - ehci->no_selective_suspend = 1; + 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; @@ -180,21 +163,6 @@ static int ehci_pci_setup(struct usb_hcd *hcd) device_init_wakeup(&pdev->dev, 1); } -#ifdef CONFIG_USB_SUSPEND - /* REVISIT: the controller works fine for wakeup iff the root hub - * itself is "globally" suspended, but usbcore currently doesn't - * understand such things. - * - * System suspend currently expects to be able to suspend the entire - * device tree, device-at-a-time. If we failed selective suspend - * reports, system suspend would fail; so the root hub code must claim - * success. That's lying to usbcore, and it matters for for runtime - * PM scenarios with selective suspend and remote wakeup... - */ - if (ehci->no_selective_suspend && device_can_wakeup(&pdev->dev)) - ehci_warn(ehci, "selective suspend/wakeup unavailable\n"); -#endif - retval = ehci_pci_reinit(ehci, pdev); done: return retval; @@ -359,7 +327,7 @@ static const struct hc_driver ehci_pci_hc_driver = { /* PCI driver selection metadata; PCI hotplugging uses this */ static const struct pci_device_id pci_ids [] = { { /* handle any USB 2.0 EHCI controller */ - PCI_DEVICE_CLASS(PCI_CLASS_SERIAL_USB_EHCI, ~0), + PCI_DEVICE_CLASS(((PCI_CLASS_SERIAL_USB << 8) | 0x20), ~0), .driver_data = (unsigned long) &ehci_pci_hc_driver, }, { /* end: all zeroes */ } @@ -379,3 +347,23 @@ 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-q.c b/drivers/usb/host/ehci-q.c index e469221e7..9b13bf2fa 100644 --- a/drivers/usb/host/ehci-q.c +++ b/drivers/usb/host/ehci-q.c @@ -702,7 +702,7 @@ qh_make ( } /* support for tt scheduling, and access to toggles */ - qh->dev = urb->dev; + qh->dev = usb_get_dev (urb->dev); /* using TT? */ switch (urb->dev->speed) { @@ -721,14 +721,7 @@ qh_make ( info1 |= maxp << 16; info2 |= (EHCI_TUNE_MULT_TT << 30); - - /* Some Freescale processors have an erratum in which the - * port number in the queue head was 0..N-1 instead of 1..N. - */ - if (ehci_has_fsl_portno_bug(ehci)) - info2 |= (urb->dev->ttport-1) << 23; - else - info2 |= urb->dev->ttport << 23; + info2 |= urb->dev->ttport << 23; /* set the address of the TT; for TDI's integrated * root hub tt, leave it zeroed. @@ -1022,14 +1015,12 @@ static void start_unlink_async (struct ehci_hcd *ehci, struct ehci_qh *qh) /* stop async schedule right now? */ if (unlikely (qh == ehci->async)) { /* can't get here without STS_ASS set */ - if (ehci_to_hcd(ehci)->state != HC_STATE_HALT - && !ehci->reclaim) { - /* ... and CMD_IAAD clear */ + if (ehci_to_hcd(ehci)->state != HC_STATE_HALT) { writel (cmd & ~CMD_ASE, &ehci->regs->command); wmb (); // handshake later, if we need to - timer_action_done (ehci, TIMER_ASYNC_OFF); } + timer_action_done (ehci, TIMER_ASYNC_OFF); return; } diff --git a/drivers/usb/host/ehci-sched.c b/drivers/usb/host/ehci-sched.c index 4859900bd..88419c682 100644 --- a/drivers/usb/host/ehci-sched.c +++ b/drivers/usb/host/ehci-sched.c @@ -163,190 +163,6 @@ 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. @@ -421,8 +237,6 @@ static int tt_no_collision ( return 1; } -#endif /* CONFIG_USB_EHCI_TT_NEWSCHED */ - /*-------------------------------------------------------------------------*/ static int enable_periodic (struct ehci_hcd *ehci) @@ -667,7 +481,7 @@ static int check_intr_schedule ( ) { int retval = -ENOSPC; - u8 mask = 0; + u8 mask; if (qh->c_usecs && uframe >= 6) /* FSTN territory? */ goto done; @@ -680,24 +494,6 @@ 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. @@ -718,7 +514,6 @@ static int check_intr_schedule ( goto done; retval = 0; } -#endif done: return retval; } @@ -1069,8 +864,9 @@ iso_sched_alloc (unsigned packets, gfp_t mem_flags) int size = sizeof *iso_sched; size += packets * sizeof (struct ehci_iso_packet); - iso_sched = kzalloc(size, mem_flags); + iso_sched = kmalloc (size, mem_flags); if (likely (iso_sched != NULL)) { + memset(iso_sched, 0, size); INIT_LIST_HEAD (&iso_sched->td_list); } return iso_sched; @@ -1252,21 +1048,12 @@ 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; @@ -1612,7 +1399,7 @@ itd_complete ( */ /* give urb back to the driver ... can be out-of-order */ - dev = urb->dev; + dev = usb_get_dev (urb->dev); ehci_urb_done (ehci, urb, regs); urb = NULL; @@ -1631,6 +1418,7 @@ itd_complete ( (stream->bEndpointAddress & USB_DIR_IN) ? "in" : "out"); } iso_stream_put (ehci, stream); + usb_put_dev (dev); return 1; } @@ -1977,7 +1765,7 @@ sitd_complete ( */ /* give urb back to the driver */ - dev = urb->dev; + dev = usb_get_dev (urb->dev); ehci_urb_done (ehci, urb, regs); urb = NULL; @@ -1996,6 +1784,7 @@ sitd_complete ( (stream->bEndpointAddress & USB_DIR_IN) ? "in" : "out"); } iso_stream_put (ehci, stream); + usb_put_dev (dev); return 1; } diff --git a/drivers/usb/host/ehci.h b/drivers/usb/host/ehci.h index 679c1cdcc..18e257c2b 100644 --- a/drivers/usb/host/ehci.h +++ b/drivers/usb/host/ehci.h @@ -88,12 +88,7 @@ struct ehci_hcd { /* one per controller */ unsigned long next_statechange; u32 command; - /* SILICON QUIRKS */ unsigned is_tdi_rh_tt:1; /* TDI roothub with TT */ - unsigned no_selective_suspend:1; - unsigned has_fsl_port_bug:1; /* FreeScale */ - - u8 sbrn; /* packed release number */ /* irq statistics */ #ifdef EHCI_STATS @@ -102,6 +97,7 @@ struct ehci_hcd { /* one per controller */ #else # define COUNT(x) do {} while (0) #endif + u8 sbrn; /* packed release number */ }; /* convert between an HCD pointer and the corresponding EHCI_HCD */ @@ -640,18 +636,6 @@ ehci_port_speed(struct ehci_hcd *ehci, unsigned int portsc) #define ehci_port_speed(ehci, portsc) (1<has_fsl_port_bug) -#else -#define ehci_has_fsl_portno_bug(e) (0) -#endif - - /*-------------------------------------------------------------------------*/ #ifndef DEBUG diff --git a/drivers/usb/host/hc_crisv10.c b/drivers/usb/host/hc_crisv10.c index 61e571782..641268d7e 100644 --- a/drivers/usb/host/hc_crisv10.c +++ b/drivers/usb/host/hc_crisv10.c @@ -4,6 +4,7 @@ * Copyright (c) 2002, 2003 Axis Communications AB. */ +#include #include #include #include @@ -410,7 +411,8 @@ 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_move_tail(&urb_entry->list, &urb_list[epid]); + list_del(&urb_entry->list); + list_add_tail(&urb_entry->list, &urb_list[epid]); } /* Get the next urb in the list. */ @@ -2135,9 +2137,10 @@ static int etrax_usb_submit_bulk_urb(struct urb *urb) urb->status = -EINPROGRESS; /* Setup the hcpriv data. */ - urb_priv = kzalloc(sizeof(etrax_urb_priv_t), KMALLOC_FLAG); + urb_priv = kmalloc(sizeof(etrax_urb_priv_t), KMALLOC_FLAG); assert(urb_priv != NULL); /* This sets rx_offset to 0. */ + memset(urb_priv, 0, sizeof(etrax_urb_priv_t)); urb_priv->urb_state = NOT_STARTED; urb->hcpriv = urb_priv; @@ -2472,9 +2475,10 @@ static int etrax_usb_submit_ctrl_urb(struct urb *urb) urb->status = -EINPROGRESS; /* Setup the hcpriv data. */ - urb_priv = kzalloc(sizeof(etrax_urb_priv_t), KMALLOC_FLAG); + urb_priv = kmalloc(sizeof(etrax_urb_priv_t), KMALLOC_FLAG); assert(urb_priv != NULL); /* This sets rx_offset to 0. */ + memset(urb_priv, 0, sizeof(etrax_urb_priv_t)); urb_priv->urb_state = NOT_STARTED; urb->hcpriv = urb_priv; @@ -2763,8 +2767,9 @@ static void etrax_usb_add_to_intr_sb_list(struct urb *urb, int epid) maxlen = usb_maxpacket(urb->dev, urb->pipe, usb_pipeout(urb->pipe)); interval = urb->interval; - urb_priv = kzalloc(sizeof(etrax_urb_priv_t), KMALLOC_FLAG); + urb_priv = kmalloc(sizeof(etrax_urb_priv_t), KMALLOC_FLAG); assert(urb_priv != NULL); + memset(urb_priv, 0, sizeof(etrax_urb_priv_t)); urb->hcpriv = urb_priv; first_ep = &TxIntrEPList[0]; @@ -2992,8 +2997,9 @@ static void etrax_usb_add_to_isoc_sb_list(struct urb *urb, int epid) prev_sb_desc = next_sb_desc = temp_sb_desc = NULL; - urb_priv = kzalloc(sizeof(etrax_urb_priv_t), GFP_ATOMIC); + urb_priv = kmalloc(sizeof(etrax_urb_priv_t), GFP_ATOMIC); assert(urb_priv != NULL); + memset(urb_priv, 0, sizeof(etrax_urb_priv_t)); urb->hcpriv = urb_priv; urb_priv->epid = epid; diff --git a/drivers/usb/host/isp116x-hcd.c b/drivers/usb/host/isp116x-hcd.c index 8c6b38a0b..972ce0488 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 @@ -724,7 +724,7 @@ static int isp116x_urb_enqueue(struct usb_hcd *hcd, ep = hep->hcpriv; else { INIT_LIST_HEAD(&ep->schedule); - ep->udev = udev; + ep->udev = usb_get_dev(udev); ep->epnum = epnum; ep->maxpacket = usb_maxpacket(udev, urb->pipe, is_out); usb_settoggle(udev, epnum, is_out, 0); @@ -781,7 +781,7 @@ static int isp116x_urb_enqueue(struct usb_hcd *hcd, if (ep->branch < PERIODIC_SIZE) break; - ep->branch = ret = balance(isp116x, ep->period, ep->load); + ret = ep->branch = balance(isp116x, ep->period, ep->load); if (ret < 0) goto fail; ret = 0; @@ -891,6 +891,7 @@ static void isp116x_endpoint_disable(struct usb_hcd *hcd, if (!list_empty(&hep->urb_list)) WARN("ep %p not empty?\n", ep); + usb_put_dev(ep->udev); kfree(ep); hep->hcpriv = NULL; } @@ -1204,7 +1205,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->i_private); + return single_open(file, isp116x_show_dbg, inode->u.generic_ip); } static struct file_operations isp116x_debug_fops = { @@ -1552,7 +1553,7 @@ static struct hc_driver isp116x_hc_driver = { /*----------------------------------------------------------------*/ -static int isp116x_remove(struct platform_device *pdev) +static int __init_or_module isp116x_remove(struct platform_device *pdev) { struct usb_hcd *hcd = platform_get_drvdata(pdev); struct isp116x *isp116x; @@ -1653,7 +1654,7 @@ static int __init isp116x_probe(struct platform_device *pdev) goto err6; } - ret = usb_add_hcd(hcd, irq, IRQF_DISABLED); + ret = usb_add_hcd(hcd, irq, SA_INTERRUPT); if (ret) goto err6; diff --git a/drivers/usb/host/ohci-au1xxx.c b/drivers/usb/host/ohci-au1xxx.c index f7a975d5d..db280ca7b 100644 --- a/drivers/usb/host/ohci-au1xxx.c +++ b/drivers/usb/host/ohci-au1xxx.c @@ -23,8 +23,6 @@ #include -#ifndef CONFIG_SOC_AU1200 - #define USBH_ENABLE_BE (1<<0) #define USBH_ENABLE_C (1<<1) #define USBH_ENABLE_E (1<<2) @@ -39,98 +37,37 @@ #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_ohc(struct platform_device *dev) +static void au1xxx_start_hc(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_ohc(struct platform_device *dev) +static void au1xxx_stop_hc(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(~USBH_ENABLE_CE & au_readl(USB_HOST_CONFIG), USB_HOST_CONFIG); - au_readl(USB_HOST_CONFIG); -#endif /* Au1200 */ } @@ -141,7 +78,7 @@ static void au1xxx_stop_ohc(struct platform_device *dev) /** - * usb_ohci_au1xxx_probe - initialize Au1xxx-based HCDs + * usb_hcd_au1xxx_probe - initialize Au1xxx-based HCDs * Context: !in_interrupt() * * Allocates basic resources for this USB host controller, and @@ -149,25 +86,14 @@ static void au1xxx_stop_ohc(struct platform_device *dev) * through the hotplug entry's driver_data. * */ -static int usb_ohci_au1xxx_probe(const struct hc_driver *driver, +int usb_hcd_au1xxx_probe (const struct hc_driver *driver, struct platform_device *dev) { int retval; struct usb_hcd *hcd; -#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"); + if(dev->resource[1].flags != IORESOURCE_IRQ) { + pr_debug ("resource[1] is not IORESOURCE_IRQ"); return -ENOMEM; } @@ -178,26 +104,26 @@ static int usb_ohci_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\n"); + pr_debug("request_mem_region failed"); retval = -EBUSY; goto err1; } hcd->regs = ioremap(hcd->rsrc_start, hcd->rsrc_len); if (!hcd->regs) { - pr_debug("ioremap failed\n"); + pr_debug("ioremap failed"); retval = -ENOMEM; goto err2; } - au1xxx_start_ohc(dev); + au1xxx_start_hc(dev); ohci_hcd_init(hcd_to_ohci(hcd)); - retval = usb_add_hcd(hcd, dev->resource[1].start, IRQF_DISABLED | IRQF_SHARED); + retval = usb_add_hcd(hcd, dev->resource[1].start, SA_INTERRUPT); if (retval == 0) return retval; - au1xxx_stop_ohc(dev); + au1xxx_stop_hc(dev); iounmap(hcd->regs); err2: release_mem_region(hcd->rsrc_start, hcd->rsrc_len); @@ -220,10 +146,10 @@ static int usb_ohci_au1xxx_probe(const struct hc_driver *driver, * context, normally "rmmod", "apmd", or something similar. * */ -static void usb_ohci_au1xxx_remove(struct usb_hcd *hcd, struct platform_device *dev) +void usb_hcd_au1xxx_remove (struct usb_hcd *hcd, struct platform_device *dev) { usb_remove_hcd(hcd); - au1xxx_stop_ohc(dev); + au1xxx_stop_hc(dev); iounmap(hcd->regs); release_mem_region(hcd->rsrc_start, hcd->rsrc_len); usb_put_hcd(hcd); @@ -309,7 +235,7 @@ static int ohci_hcd_au1xxx_drv_probe(struct platform_device *pdev) if (usb_disabled()) return -ENODEV; - ret = usb_ohci_au1xxx_probe(&ohci_au1xxx_hc_driver, pdev); + ret = usb_hcd_au1xxx_probe(&ohci_au1xxx_hc_driver, pdev); return ret; } @@ -317,7 +243,7 @@ static int ohci_hcd_au1xxx_drv_remove(struct platform_device *pdev) { struct usb_hcd *hcd = platform_get_drvdata(pdev); - usb_ohci_au1xxx_remove(hcd, pdev); + usb_hcd_au1xxx_remove(hcd, pdev); return 0; } /*TBD*/ diff --git a/drivers/usb/host/ohci-hcd.c b/drivers/usb/host/ohci-hcd.c index 94d8cf4b3..a4b12404a 100644 --- a/drivers/usb/host/ohci-hcd.c +++ b/drivers/usb/host/ohci-hcd.c @@ -74,6 +74,7 @@ * This file is licenced under the GPL. */ +#include #include #include #include @@ -442,16 +443,11 @@ ohci_reboot (struct notifier_block *block, unsigned long code, void *null) static int ohci_init (struct ohci_hcd *ohci) { int ret; - struct usb_hcd *hcd = ohci_to_hcd(ohci); disable (ohci); - ohci->regs = hcd->regs; + ohci->regs = ohci_to_hcd(ohci)->regs; ohci->next_statechange = jiffies; - /* REVISIT this BIOS handshake is now moved into PCI "quirks", and - * was never needed for most non-PCI systems ... remove the code? - */ - #ifndef IR_DISABLE /* SMM owns the HC? not for long! */ if (!no_handshake && ohci_readl (ohci, @@ -482,10 +478,8 @@ static int ohci_init (struct ohci_hcd *ohci) /* Disable HC interrupts */ ohci_writel (ohci, OHCI_INTR_MIE, &ohci->regs->intrdisable); - - /* flush the writes, and save key bits like RWC */ - if (ohci_readl (ohci, &ohci->regs->control) & OHCI_CTRL_RWC) - ohci->hc_control |= OHCI_CTRL_RWC; + // flush the writes + (void) ohci_readl (ohci, &ohci->regs->control); /* Read the number of ports unless overridden */ if (ohci->num_ports == 0) @@ -494,19 +488,16 @@ static int ohci_init (struct ohci_hcd *ohci) if (ohci->hcca) return 0; - ohci->hcca = dma_alloc_coherent (hcd->self.controller, + ohci->hcca = dma_alloc_coherent (ohci_to_hcd(ohci)->self.controller, sizeof *ohci->hcca, &ohci->hcca_dma, 0); if (!ohci->hcca) return -ENOMEM; if ((ret = ohci_mem_init (ohci)) < 0) - ohci_stop (hcd); - else { - register_reboot_notifier (&ohci->reboot_notifier); - create_debug_files (ohci); - } + ohci_stop (ohci_to_hcd(ohci)); return ret; + } /*-------------------------------------------------------------------------*/ @@ -519,7 +510,6 @@ static int ohci_run (struct ohci_hcd *ohci) { u32 mask, temp; int first = ohci->fminterval == 0; - struct usb_hcd *hcd = ohci_to_hcd(ohci); disable (ohci); @@ -535,17 +525,18 @@ static int ohci_run (struct ohci_hcd *ohci) /* also: power/overcurrent flags in roothub.a */ } - /* Reset USB nearly "by the book". RemoteWakeupConnected was - * saved if boot firmware (BIOS/SMM/...) told us it's connected, - * or if bus glue did the same (e.g. for PCI add-in cards with - * PCI PM support). + /* Reset USB nearly "by the book". RemoteWakeupConnected + * saved if boot firmware (BIOS/SMM/...) told us it's connected + * (for OHCI integrated on mainboard, it normally is) */ + ohci->hc_control = ohci_readl (ohci, &ohci->regs->control); ohci_dbg (ohci, "resetting from state '%s', control = 0x%x\n", hcfs2string (ohci->hc_control & OHCI_CTRL_HCFS), - ohci_readl (ohci, &ohci->regs->control)); - if ((ohci->hc_control & OHCI_CTRL_RWC) != 0 - && !device_may_wakeup(hcd->self.controller)) - device_init_wakeup(hcd->self.controller, 1); + ohci->hc_control); + + if (ohci->hc_control & OHCI_CTRL_RWC + && !(ohci->flags & OHCI_QUIRK_AMD756)) + ohci_to_hcd(ohci)->can_wakeup = 1; switch (ohci->hc_control & OHCI_CTRL_HCFS) { case OHCI_USB_OPER: @@ -641,7 +632,7 @@ retry: ohci->hc_control &= OHCI_CTRL_RWC; ohci->hc_control |= OHCI_CONTROL_INIT | OHCI_USB_OPER; ohci_writel (ohci, ohci->hc_control, &ohci->regs->control); - hcd->state = HC_STATE_RUNNING; + ohci_to_hcd(ohci)->state = HC_STATE_RUNNING; /* wake on ConnectStatusChange, matching external hubs */ ohci_writel (ohci, RH_HS_DRWE, &ohci->regs->roothub.status); @@ -676,10 +667,15 @@ retry: // POTPGT delay is bits 24-31, in 2 ms units. mdelay ((temp >> 23) & 0x1fe); - hcd->state = HC_STATE_RUNNING; + ohci_to_hcd(ohci)->state = HC_STATE_RUNNING; ohci_dump (ohci, 1); + if (ohci_to_hcd(ohci)->self.root_hub == NULL) { + register_reboot_notifier (&ohci->reboot_notifier); + create_debug_files (ohci); + } + return 0; } @@ -862,7 +858,7 @@ static int ohci_restart (struct ohci_hcd *ohci) i = ohci->num_ports; while (i--) ohci_writel (ohci, RH_PS_PSS, - &ohci->regs->roothub.portstatus [i]); + &ohci->regs->roothub.portstatus [temp]); ohci_dbg (ohci, "restart complete\n"); } return 0; @@ -901,10 +897,6 @@ 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 @@ -913,21 +905,14 @@ MODULE_LICENSE ("GPL"); #include "ohci-ppc-soc.c" #endif -#if defined(CONFIG_ARCH_AT91RM9200) || defined(CONFIG_ARCH_AT91SAM9261) -#include "ohci-at91.c" -#endif - #if !(defined(CONFIG_PCI) \ || defined(CONFIG_SA1111) \ || defined(CONFIG_ARCH_S3C2410) \ || 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 5b0a23fd7..4b2226d77 100644 --- a/drivers/usb/host/ohci-hub.c +++ b/drivers/usb/host/ohci-hub.c @@ -107,7 +107,7 @@ static int ohci_bus_suspend (struct usb_hcd *hcd) &ohci->regs->intrstatus); /* maybe resume can wake root hub */ - if (device_may_wakeup(&ohci_to_hcd(ohci)->self.root_hub->dev)) + if (hcd->remote_wakeup) ohci->hc_control |= OHCI_CTRL_RWE; else ohci->hc_control &= ~OHCI_CTRL_RWE; @@ -246,9 +246,9 @@ static int ohci_bus_resume (struct usb_hcd *hcd) (void) ohci_readl (ohci, &ohci->regs->control); msleep (3); - temp = ohci->hc_control; - temp &= OHCI_CTRL_RWC; - temp |= OHCI_CONTROL_INIT | OHCI_USB_OPER; + temp = OHCI_CONTROL_INIT | OHCI_USB_OPER; + if (hcd->can_wakeup) + temp |= OHCI_CTRL_RWC; ohci->hc_control = temp; ohci_writel (ohci, temp, &ohci->regs->control); (void) ohci_readl (ohci, &ohci->regs->control); @@ -302,7 +302,7 @@ ohci_hub_status_data (struct usb_hcd *hcd, char *buf) { struct ohci_hcd *ohci = hcd_to_ohci (hcd); int i, changed = 0, length = 1; - int can_suspend = device_may_wakeup(&hcd->self.root_hub->dev); + int can_suspend = hcd->can_wakeup; unsigned long flags; spin_lock_irqsave (&ohci->lock, flags); @@ -354,7 +354,7 @@ ohci_hub_status_data (struct usb_hcd *hcd, char *buf) */ if (!(status & RH_PS_CCS)) continue; - if ((status & RH_PS_PSS) && can_suspend) + if ((status & RH_PS_PSS) && hcd->remote_wakeup) continue; can_suspend = 0; } @@ -581,14 +581,14 @@ static int ohci_hub_control ( break; case GetHubStatus: temp = roothub_status (ohci) & ~(RH_HS_CRWE | RH_HS_DRWE); - put_unaligned(cpu_to_le32 (temp), (__le32 *) buf); + *(__le32 *) buf = cpu_to_le32 (temp); break; case GetPortStatus: if (!wIndex || wIndex > ports) goto error; wIndex--; temp = roothub_portstatus (ohci, wIndex); - put_unaligned(cpu_to_le32 (temp), (__le32 *) buf); + *(__le32 *) buf = cpu_to_le32 (temp); #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 5602da9bd..0020ed7a3 100644 --- a/drivers/usb/host/ohci-lh7a404.c +++ b/drivers/usb/host/ohci-lh7a404.c @@ -100,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, IRQF_DISABLED); + retval = usb_add_hcd(hcd, dev->resource[1].start, SA_INTERRUPT); if (retval == 0) return retval; diff --git a/drivers/usb/host/ohci-omap.c b/drivers/usb/host/ohci-omap.c index c4c4babd4..3785b3f7d 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 /* IRQF_DISABLED */ +#include /* SA_INTERRUPT */ #include #include #include @@ -286,7 +286,7 @@ void usb_hcd_omap_remove (struct usb_hcd *, struct platform_device *); int usb_hcd_omap_probe (const struct hc_driver *driver, struct platform_device *pdev) { - int retval, irq; + int retval; struct usb_hcd *hcd = 0; struct ohci_hcd *ohci; @@ -329,12 +329,7 @@ int usb_hcd_omap_probe (const struct hc_driver *driver, if (retval < 0) goto err2; - irq = platform_get_irq(pdev, 0); - if (irq < 0) { - retval = -ENXIO; - goto err2; - } - retval = usb_add_hcd(hcd, irq, IRQF_DISABLED); + retval = usb_add_hcd(hcd, platform_get_irq(pdev, 0), SA_INTERRUPT); if (retval == 0) return retval; diff --git a/drivers/usb/host/ohci-pci.c b/drivers/usb/host/ohci-pci.c index b268537e3..1b09dde06 100644 --- a/drivers/usb/host/ohci-pci.c +++ b/drivers/usb/host/ohci-pci.c @@ -35,10 +35,7 @@ ohci_pci_start (struct usb_hcd *hcd) struct ohci_hcd *ohci = hcd_to_ohci (hcd); int ret; - /* REVISIT this whole block should move to reset(), which handles - * all the other one-time init. - */ - if (hcd->self.controller) { + if(hcd->self.controller && hcd->self.controller->bus == &pci_bus_type) { struct pci_dev *pdev = to_pci_dev(hcd->self.controller); /* AMD 756, for most chips (early revs), corrupts register @@ -48,8 +45,7 @@ ohci_pci_start (struct usb_hcd *hcd) && pdev->device == 0x740c) { ohci->flags = OHCI_QUIRK_AMD756; ohci_dbg (ohci, "AMD756 erratum 4 workaround\n"); - /* also erratum 10 (suspend/resume issues) */ - device_init_wakeup(&hcd->self.root_hub->dev, 0); + // also somewhat erratum 10 (suspend/resume issues) } /* FIXME for some of the early AMD 760 southbridges, OHCI @@ -92,13 +88,6 @@ ohci_pci_start (struct usb_hcd *hcd) ohci_dbg (ohci, "enabled Compaq ZFMicro chipset quirk\n"); } - - /* RWC may not be set for add-in PCI cards, since boot - * firmware probably ignored them. This transfers PCI - * PM wakeup capabilities (once the PCI layer is fixed). - */ - if (device_may_wakeup(&pdev->dev)) - ohci->hc_control |= OHCI_CTRL_RWC; } /* NOTE: there may have already been a first reset, to @@ -206,7 +195,7 @@ static const struct hc_driver ohci_pci_hc_driver = { static const struct pci_device_id pci_ids [] = { { /* handle any USB OHCI controller */ - PCI_DEVICE_CLASS(PCI_CLASS_SERIAL_USB_OHCI, ~0), + PCI_DEVICE_CLASS((PCI_CLASS_SERIAL_USB << 8) | 0x10, ~0), .driver_data = (unsigned long) &ohci_pci_hc_driver, }, { /* end: all zeroes */ } }; diff --git a/drivers/usb/host/ohci-ppc-soc.c b/drivers/usb/host/ohci-ppc-soc.c index 9fe56ff16..b2a8dfa48 100644 --- a/drivers/usb/host/ohci-ppc-soc.c +++ b/drivers/usb/host/ohci-ppc-soc.c @@ -75,7 +75,7 @@ static int usb_hcd_ppc_soc_probe(const struct hc_driver *driver, ohci->flags |= OHCI_BIG_ENDIAN; ohci_hcd_init(ohci); - retval = usb_add_hcd(hcd, irq, IRQF_DISABLED); + retval = usb_add_hcd(hcd, irq, SA_INTERRUPT); if (retval == 0) return retval; diff --git a/drivers/usb/host/ohci-pxa27x.c b/drivers/usb/host/ohci-pxa27x.c index 6f559e102..acde8868d 100644 --- a/drivers/usb/host/ohci-pxa27x.c +++ b/drivers/usb/host/ohci-pxa27x.c @@ -185,12 +185,9 @@ int usb_hcd_pxa27x_probe (const struct hc_driver *driver, struct platform_device /* Select Power Management Mode */ pxa27x_ohci_select_pmm(inf->port_mode); - if (inf->power_budget) - hcd->power_budget = inf->power_budget; - ohci_hcd_init(hcd_to_ohci(hcd)); - retval = usb_add_hcd(hcd, pdev->resource[1].start, IRQF_DISABLED); + retval = usb_add_hcd(hcd, pdev->resource[1].start, SA_INTERRUPT); if (retval == 0) return retval; diff --git a/drivers/usb/host/ohci-s3c2410.c b/drivers/usb/host/ohci-s3c2410.c index d2fc6969a..372527a83 100644 --- a/drivers/usb/host/ohci-s3c2410.c +++ b/drivers/usb/host/ohci-s3c2410.c @@ -30,7 +30,6 @@ /* clock device associated with the hcd */ static struct clk *clk; -static struct clk *usb_clk; /* forward definitions */ @@ -38,7 +37,7 @@ static void s3c2410_hcd_oc(struct s3c2410_hcd_info *info, int port_oc); /* conversion functions */ -static struct s3c2410_hcd_info *to_s3c2410_info(struct usb_hcd *hcd) +struct s3c2410_hcd_info *to_s3c2410_info(struct usb_hcd *hcd) { return hcd->self.controller->platform_data; } @@ -48,10 +47,6 @@ static void s3c2410_start_hc(struct platform_device *dev, struct usb_hcd *hcd) struct s3c2410_hcd_info *info = dev->dev.platform_data; dev_dbg(&dev->dev, "s3c2410_start_hc:\n"); - - clk_enable(usb_clk); - mdelay(2); /* let the bus clock stabilise */ - clk_enable(clk); if (info != NULL) { @@ -80,7 +75,6 @@ static void s3c2410_stop_hc(struct platform_device *dev) } clk_disable(clk); - clk_disable(usb_clk); } /* ohci_s3c2410_hub_status_data @@ -164,7 +158,7 @@ static int ohci_s3c2410_hub_control ( "s3c2410_hub_control(%p,0x%04x,0x%04x,0x%04x,%p,%04x)\n", hcd, typeReq, wValue, wIndex, buf, wLength); - /* if we are only an humble host without any special capabilities + /* if we are only an humble host without any special capabilites * process the request straight away and exit */ if (info == NULL) { @@ -322,8 +316,7 @@ static void s3c2410_hcd_oc(struct s3c2410_hcd_info *info, int port_oc) * */ -static void -usb_hcd_s3c2410_remove (struct usb_hcd *hcd, struct platform_device *dev) +void usb_hcd_s3c2410_remove (struct usb_hcd *hcd, struct platform_device *dev) { usb_remove_hcd(hcd); s3c2410_stop_hc(dev); @@ -341,8 +334,8 @@ usb_hcd_s3c2410_remove (struct usb_hcd *hcd, struct platform_device *dev) * through the hotplug entry's driver_data. * */ -static int usb_hcd_s3c2410_probe (const struct hc_driver *driver, - struct platform_device *dev) +int usb_hcd_s3c2410_probe (const struct hc_driver *driver, + struct platform_device *dev) { struct usb_hcd *hcd = NULL; int retval; @@ -360,21 +353,14 @@ static int usb_hcd_s3c2410_probe (const struct hc_driver *driver, if (!request_mem_region(hcd->rsrc_start, hcd->rsrc_len, hcd_name)) { dev_err(&dev->dev, "request_mem_region failed"); retval = -EBUSY; - goto err_put; + goto err0; } - clk = clk_get(&dev->dev, "usb-host"); + clk = clk_get(NULL, "usb-host"); if (IS_ERR(clk)) { dev_err(&dev->dev, "cannot get usb-host clock\n"); retval = -ENOENT; - goto err_mem; - } - - usb_clk = clk_get(&dev->dev, "upll"); - if (IS_ERR(usb_clk)) { - dev_err(&dev->dev, "cannot get usb-host clock\n"); - retval = -ENOENT; - goto err_clk; + goto err1; } s3c2410_start_hc(dev, hcd); @@ -383,29 +369,26 @@ static int usb_hcd_s3c2410_probe (const struct hc_driver *driver, if (!hcd->regs) { dev_err(&dev->dev, "ioremap failed\n"); retval = -ENOMEM; - goto err_ioremap; + goto err2; } ohci_hcd_init(hcd_to_ohci(hcd)); - retval = usb_add_hcd(hcd, dev->resource[1].start, IRQF_DISABLED); + retval = usb_add_hcd(hcd, dev->resource[1].start, SA_INTERRUPT); if (retval != 0) - goto err_ioremap; + goto err2; return 0; - err_ioremap: + err2: s3c2410_stop_hc(dev); iounmap(hcd->regs); - clk_put(usb_clk); - - err_clk: clk_put(clk); - err_mem: + err1: release_mem_region(hcd->rsrc_start, hcd->rsrc_len); - err_put: + err0: usb_put_hcd(hcd); return retval; } diff --git a/drivers/usb/host/ohci-sa1111.c b/drivers/usb/host/ohci-sa1111.c index ce3de106c..fb3221ebb 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], IRQF_DISABLED); + retval = usb_add_hcd(hcd, dev->irq[1], SA_INTERRUPT); if (retval == 0) return retval; diff --git a/drivers/usb/host/pci-quirks.c b/drivers/usb/host/pci-quirks.c index 208616509..9e81c2631 100644 --- a/drivers/usb/host/pci-quirks.c +++ b/drivers/usb/host/pci-quirks.c @@ -8,13 +8,13 @@ * (and others) */ +#include #include #include #include #include #include #include -#include "pci-quirks.h" #define UHCI_USBLEGSUP 0xc0 /* legacy support */ @@ -167,6 +167,8 @@ 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; @@ -177,10 +179,9 @@ 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__ -{ - u32 control = readl(base + OHCI_CONTROL); + control = readl(base + OHCI_CONTROL); if (control & OHCI_CTRL_IR) { - int wait_time = 500; /* arbitrary; 5 seconds */ + wait_time = 500; /* arbitrary; 5 seconds */ writel(OHCI_INTR_OC, base + OHCI_INTRENABLE); writel(OHCI_OCR, base + OHCI_CMDSTATUS); while (wait_time > 0 && @@ -197,7 +198,6 @@ 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 fa34092bb..517360b77 100644 --- a/drivers/usb/host/sl811-hcd.c +++ b/drivers/usb/host/sl811-hcd.c @@ -31,6 +31,7 @@ #undef VERBOSE #undef PACKET_TRACE +#include #include #include #include @@ -45,7 +46,7 @@ #include #include #include -#include +#include #include #include @@ -852,7 +853,7 @@ static int sl811h_urb_enqueue( } else { INIT_LIST_HEAD(&ep->schedule); - ep->udev = udev; + ep->udev = usb_get_dev(udev); ep->epnum = epnum; ep->maxpacket = usb_maxpacket(udev, urb->pipe, is_out); ep->defctrl = SL11H_HCTLMASK_ARM | SL11H_HCTLMASK_ENABLE; @@ -1051,6 +1052,7 @@ sl811h_endpoint_disable(struct usb_hcd *hcd, struct usb_host_endpoint *hep) if (!list_empty(&hep->urb_list)) WARN("ep %p not empty?\n", ep); + usb_put_dev(ep->udev); kfree(ep); hep->hcpriv = NULL; } @@ -1683,13 +1685,9 @@ sl811h_probe(struct platform_device *dev) if (!addr || !data) return -ENODEV; ioaddr = 1; - /* - * 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; + + addr_reg = (void __iomem *) addr->start; + data_reg = (void __iomem *) data->start; } else { addr_reg = ioremap(addr->start, 1); if (addr_reg == NULL) { @@ -1749,7 +1747,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, IRQF_DISABLED | IRQF_SHARED); + retval = usb_add_hcd(hcd, irq, SA_INTERRUPT | SA_SHIRQ); if (retval != 0) goto err6; diff --git a/drivers/usb/host/sl811_cs.c b/drivers/usb/host/sl811_cs.c index 54f554e0f..134d20001 100644 --- a/drivers/usb/host/sl811_cs.c +++ b/drivers/usb/host/sl811_cs.c @@ -27,7 +27,7 @@ #include #include -#include +#include MODULE_AUTHOR("Botond Botyanszki"); MODULE_DESCRIPTION("REX-CFU1U PCMCIA driver for 2.6"); @@ -67,11 +67,11 @@ module_param(pc_debug, int, 0644); static const char driver_name[DEV_NAME_LEN] = "sl811_cs"; typedef struct local_info_t { - struct pcmcia_device *p_dev; + dev_link_t link; dev_node_t node; } local_info_t; -static void sl811_cs_release(struct pcmcia_device * link); +static void sl811_cs_release(dev_link_t * link); /*====================================================================*/ @@ -138,27 +138,41 @@ static int sl811_hc_init(struct device *parent, ioaddr_t base_addr, int irq) /*====================================================================*/ -static void sl811_cs_detach(struct pcmcia_device *link) +static void sl811_cs_detach(struct pcmcia_device *p_dev) { + dev_link_t *link = dev_to_instance(p_dev); + DBG(0, "sl811_cs_detach(0x%p)\n", link); - sl811_cs_release(link); + link->state &= ~DEV_PRESENT; + if (link->state & DEV_CONFIG) + sl811_cs_release(link); /* This points to the parent local_info_t struct */ kfree(link->priv); } -static void sl811_cs_release(struct pcmcia_device * link) +static void sl811_cs_release(dev_link_t * link) { + DBG(0, "sl811_cs_release(0x%p)\n", link); - pcmcia_disable_device(link); + /* Unlink the device chain */ + link->dev = NULL; + platform_device_unregister(&platform_dev); + pcmcia_release_configuration(link->handle); + if (link->io.NumPorts1) + pcmcia_release_io(link->handle, &link->io); + if (link->irq.AssignedIRQ) + pcmcia_release_irq(link->handle, &link->irq); + link->state &= ~DEV_CONFIG; } -static int sl811_cs_config(struct pcmcia_device *link) +static void sl811_cs_config(dev_link_t *link) { - struct device *parent = &handle_to_dev(link); + client_handle_t handle = link->handle; + struct device *parent = &handle_to_dev(handle); local_info_t *dev = link->priv; tuple_t tuple; cisparse_t parse; @@ -174,23 +188,27 @@ static int sl811_cs_config(struct pcmcia_device *link) tuple.TupleData = buf; tuple.TupleDataMax = sizeof(buf); tuple.TupleOffset = 0; - 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)); + CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple)); + CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple)); + CS_CHECK(ParseTuple, pcmcia_parse_tuple(handle, &tuple, &parse)); link->conf.ConfigBase = parse.config.base; link->conf.Present = parse.config.rmask[0]; + /* Configure card */ + link->state |= DEV_CONFIG; + /* Look up the current Vcc */ CS_CHECK(GetConfigurationInfo, - pcmcia_get_configuration_info(link, &conf)); + pcmcia_get_configuration_info(handle, &conf)); + link->conf.Vcc = conf.Vcc; tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY; - CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(link, &tuple)); + CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple)); while (1) { cistpl_cftable_entry_t *cfg = &(parse.cftable_entry); - if (pcmcia_get_tuple_data(link, &tuple) != 0 - || pcmcia_parse_tuple(link, &tuple, &parse) + if (pcmcia_get_tuple_data(handle, &tuple) != 0 + || pcmcia_parse_tuple(handle, &tuple, &parse) != 0) goto next_entry; @@ -216,10 +234,10 @@ static int sl811_cs_config(struct pcmcia_device *link) } if (cfg->vpp1.present & (1<conf.Vpp = + link->conf.Vpp1 = link->conf.Vpp2 = cfg->vpp1.param[CISTPL_POWER_VNOM]/10000; else if (dflt.vpp1.present & (1<conf.Vpp = + link->conf.Vpp1 = link->conf.Vpp2 = dflt.vpp1.param[CISTPL_POWER_VNOM]/10000; /* we need an interrupt */ @@ -236,14 +254,15 @@ static int sl811_cs_config(struct pcmcia_device *link) link->io.BasePort1 = io->win[0].base; link->io.NumPorts1 = io->win[0].len; - if (pcmcia_request_io(link, &link->io) != 0) + if (pcmcia_request_io(link->handle, &link->io) != 0) goto next_entry; } break; next_entry: - pcmcia_disable_device(link); - last_ret = pcmcia_get_next_tuple(link, &tuple); + if (link->io.NumPorts1) + pcmcia_release_io(link->handle, &link->io); + last_ret = pcmcia_get_next_tuple(handle, &tuple); } /* require an IRQ and two registers */ @@ -251,46 +270,71 @@ next_entry: goto cs_failed; if (link->conf.Attributes & CONF_ENABLE_IRQ) CS_CHECK(RequestIRQ, - pcmcia_request_irq(link, &link->irq)); + pcmcia_request_irq(link->handle, &link->irq)); else goto cs_failed; CS_CHECK(RequestConfiguration, - pcmcia_request_configuration(link, &link->conf)); + pcmcia_request_configuration(link->handle, &link->conf)); sprintf(dev->node.dev_name, driver_name); dev->node.major = dev->node.minor = 0; - link->dev_node = &dev->node; + link->dev = &dev->node; - 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(KERN_INFO "%s: index 0x%02x: Vcc %d.%d", + dev->node.dev_name, link->conf.ConfigIndex, + link->conf.Vcc/10, link->conf.Vcc%10); + if (link->conf.Vpp1) + printk(", Vpp %d.%d", link->conf.Vpp1/10, link->conf.Vpp1%10); printk(", irq %d", link->irq.AssignedIRQ); printk(", io 0x%04x-0x%04x", link->io.BasePort1, link->io.BasePort1+link->io.NumPorts1-1); printk("\n"); + link->state &= ~DEV_CONFIG_PENDING; + if (sl811_hc_init(parent, link->io.BasePort1, link->irq.AssignedIRQ) < 0) { cs_failed: printk("sl811_cs_config failed\n"); - cs_error(link, last_fn, last_ret); + cs_error(link->handle, last_fn, last_ret); sl811_cs_release(link); - return -ENODEV; + link->state &= ~DEV_CONFIG_PENDING; } +} + +static int sl811_suspend(struct pcmcia_device *dev) +{ + dev_link_t *link = dev_to_instance(dev); + + link->state |= DEV_SUSPEND; + if (link->state & DEV_CONFIG) + pcmcia_release_configuration(link->handle); + + return 0; +} + +static int sl811_resume(struct pcmcia_device *dev) +{ + dev_link_t *link = dev_to_instance(dev); + + link->state &= ~DEV_SUSPEND; + if (link->state & DEV_CONFIG) + pcmcia_request_configuration(link->handle, &link->conf); + return 0; } -static int sl811_cs_probe(struct pcmcia_device *link) +static int sl811_cs_attach(struct pcmcia_device *p_dev) { local_info_t *local; + dev_link_t *link; local = kmalloc(sizeof(local_info_t), GFP_KERNEL); if (!local) return -ENOMEM; memset(local, 0, sizeof(local_info_t)); - local->p_dev = link; + link = &local->link; link->priv = local; /* Initialize */ @@ -299,9 +343,16 @@ static int sl811_cs_probe(struct pcmcia_device *link) link->irq.Handler = NULL; link->conf.Attributes = 0; + link->conf.Vcc = 33; link->conf.IntType = INT_MEMORY_AND_IO; - return sl811_cs_config(link); + link->handle = p_dev; + p_dev->instance = link; + + link->state |= DEV_PRESENT | DEV_CONFIG_PENDING; + sl811_cs_config(link); + + return 0; } static struct pcmcia_device_id sl811_ids[] = { @@ -315,9 +366,11 @@ static struct pcmcia_driver sl811_cs_driver = { .drv = { .name = (char *)driver_name, }, - .probe = sl811_cs_probe, + .probe = sl811_cs_attach, .remove = sl811_cs_detach, .id_table = sl811_ids, + .suspend = sl811_suspend, + .resume = sl811_resume, }; /*====================================================================*/ diff --git a/drivers/usb/host/uhci-debug.c b/drivers/usb/host/uhci-debug.c index d1372cb27..583295308 100644 --- a/drivers/usb/host/uhci-debug.c +++ b/drivers/usb/host/uhci-debug.c @@ -9,6 +9,7 @@ * (C) Copyright 1999-2001 Johannes Erdfelt */ +#include #include #include #include @@ -16,13 +17,10 @@ #include "uhci-hcd.h" -#define uhci_debug_operations (* (struct file_operations *) NULL) -static struct dentry *uhci_debugfs_root; - -#ifdef DEBUG +static struct dentry *uhci_debugfs_root = NULL; /* Handle REALLY large printks so we don't overflow buffers */ -static void lprintk(char *buf) +static inline void lprintk(char *buf) { char *p; @@ -92,85 +90,21 @@ static int uhci_show_td(struct uhci_td *td, char *buf, int len, int space) return out - buf; } -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; - - out += sprintf(out, "urb_priv [%p] ", urbp); - out += sprintf(out, "urb [%p] ", urbp->urb); - out += sprintf(out, "qh [%p] ", urbp->qh); - out += sprintf(out, "Dev=%d ", usb_pipedevice(urbp->urb->pipe)); - out += sprintf(out, "EP=%x(%s) ", usb_pipeendpoint(urbp->urb->pipe), - (usb_pipein(urbp->urb->pipe) ? "IN" : "OUT")); - - switch (usb_pipetype(urbp->urb->pipe)) { - 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%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); - out += sprintf(out, "\n"); - - i = nactive = ninactive = 0; - list_for_each_entry(td, &urbp->td_list, list) { - 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 { - if (td_status(td) & TD_CTRL_ACTIVE) - ++nactive; - else - ++ninactive; - } - } - if (nactive + ninactive > 0) - out += sprintf(out, "%*s[skipped %d inactive and %d active " - "TDs]\n", - space, "", ninactive, nactive); - - return out - buf; -} - static int uhci_show_qh(struct uhci_qh *qh, char *buf, int len, int space) { char *out = buf; - int i, nurbs; + struct urb_priv *urbp; + struct list_head *head, *tmp; + struct uhci_td *td; + int i = 0, checked = 0, prevactive = 0; __le32 element = qh_element(qh); - char *qtype; /* Try to make sure there's enough memory */ - if (len < 80 * 7) + if (len < 80 * 6) return 0; - 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); + out += sprintf(out, "%*s[%p] link (%08x) element (%08x)\n", space, "", + qh, le32_to_cpu(qh->link), le32_to_cpu(element)); if (element & UHCI_PTR_QH) out += sprintf(out, "%*s Element points to QH (bug?)\n", space, ""); @@ -184,40 +118,86 @@ static int uhci_show_qh(struct uhci_qh *qh, char *buf, int len, int space) if (!(element & ~(UHCI_PTR_QH | UHCI_PTR_DEPTH))) out += sprintf(out, "%*s Element is NULL (bug?)\n", space, ""); - if (list_empty(&qh->queue)) { - out += sprintf(out, "%*s queue is empty\n", space, ""); - } else { - struct urb_priv *urbp = list_entry(qh->queue.next, - struct urb_priv, node); - struct uhci_td *td = list_entry(urbp->td_list.next, - struct uhci_td, list); - - if (cpu_to_le32(td->dma_handle) != (element & ~UHCI_PTR_BITS)) - out += sprintf(out, "%*s Element != First TD\n", - space, ""); - i = nurbs = 0; - list_for_each_entry(urbp, &qh->queue, node) { - if (++i <= 10) - out += uhci_show_urbp(urbp, out, - len - (out - buf), space + 2); - else - ++nurbs; + if (!qh->urbp) { + out += sprintf(out, "%*s urbp == NULL\n", space, ""); + goto out; + } + + urbp = qh->urbp; + + head = &urbp->td_list; + tmp = head->next; + + td = list_entry(tmp, struct uhci_td, list); + + if (cpu_to_le32(td->dma_handle) != (element & ~UHCI_PTR_BITS)) + out += sprintf(out, "%*s Element != First TD\n", space, ""); + + while (tmp != head) { + struct uhci_td *td = list_entry(tmp, struct uhci_td, list); + + tmp = tmp->next; + + out += sprintf(out, "%*s%d: ", space + 2, "", i++); + out += uhci_show_td(td, out, len - (out - buf), 0); + + if (i > 10 && !checked && prevactive && tmp != head && + debug <= 2) { + struct list_head *ntmp = tmp; + struct uhci_td *ntd = td; + int active = 1, ni = i; + + checked = 1; + + while (ntmp != head && ntmp->next != head && active) { + ntd = list_entry(ntmp, struct uhci_td, list); + + ntmp = ntmp->next; + + active = td_status(ntd) & TD_CTRL_ACTIVE; + + ni++; + } + + if (active && ni > i) { + out += sprintf(out, "%*s[skipped %d active TDs]\n", space, "", ni - i); + tmp = ntmp; + td = ntd; + i = ni; + } } - if (nurbs > 0) - out += sprintf(out, "%*s Skipped %d URBs\n", - space, "", nurbs); + + prevactive = td_status(td) & TD_CTRL_ACTIVE; } - if (qh->udev) { - out += sprintf(out, "%*s Dummy TD\n", space, ""); - out += uhci_show_td(qh->dummy_td, out, len - (out - buf), 0); + if (list_empty(&urbp->queue_list) || urbp->queued) + goto out; + + out += sprintf(out, "%*sQueued QHs:\n", -space, "--"); + + head = &urbp->queue_list; + tmp = head->next; + + while (tmp != head) { + struct urb_priv *nurbp = list_entry(tmp, struct urb_priv, + queue_list); + tmp = tmp->next; + + out += uhci_show_qh(nurbp->qh, out, len - (out - buf), space); } +out: return out - buf; } +#define show_frame_num() \ + if (!shown) { \ + shown = 1; \ + out += sprintf(out, "- Frame %d\n", i); \ + } + +#ifdef CONFIG_PROC_FS static const char * const qh_names[] = { - "skel_unlink_qh", "skel_iso_qh", "skel_int128_qh", "skel_int64_qh", "skel_int32_qh", "skel_int16_qh", "skel_int8_qh", "skel_int4_qh", @@ -226,6 +206,12 @@ static const char * const qh_names[] = { "skel_bulk_qh", "skel_term_qh" }; +#define show_qh_name() \ + if (!shown) { \ + shown = 1; \ + out += sprintf(out, "- %s\n", qh_names[i]); \ + } + static int uhci_show_sc(int port, unsigned short status, char *buf, int len) { char *out = buf; @@ -278,8 +264,7 @@ 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 FSBR: %d\n", - rh_state, uhci->fsbr_is_on); + out += sprintf(out, "Root-hub state: %s\n", rh_state); return out - buf; } @@ -293,7 +278,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 * 9) + if (len < 80 * 6) return 0; usbcmd = inw(io_addr + 0); @@ -332,37 +317,143 @@ 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; +} + +static int uhci_show_urbp(struct uhci_hcd *uhci, struct urb_priv *urbp, char *buf, int len) +{ + struct list_head *tmp; + char *out = buf; + int count = 0; + + if (len < 200) + return 0; + + out += sprintf(out, "urb_priv [%p] ", urbp); + out += sprintf(out, "urb [%p] ", urbp->urb); + out += sprintf(out, "qh [%p] ", urbp->qh); + out += sprintf(out, "Dev=%d ", usb_pipedevice(urbp->urb->pipe)); + out += sprintf(out, "EP=%x(%s) ", usb_pipeendpoint(urbp->urb->pipe), (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; + } + + out += sprintf(out, "%s", (urbp->fsbr ? "FSBR " : "")); + out += sprintf(out, "%s", (urbp->fsbr_timeout ? "FSBR_TO " : "")); + + if (urbp->urb->status != -EINPROGRESS) + out += sprintf(out, "Status=%d ", urbp->urb->status); + //out += sprintf(out, "FSBRtime=%lx ",urbp->fsbrtime); + + count = 0; + list_for_each(tmp, &urbp->td_list) + count++; + out += sprintf(out, "TDs=%d ",count); + + if (urbp->queued) + out += sprintf(out, "queued\n"); + else { + count = 0; + list_for_each(tmp, &urbp->queue_list) + count++; + out += sprintf(out, "queued URBs=%d\n", count); + } + + return out - buf; +} + +static int uhci_show_lists(struct uhci_hcd *uhci, char *buf, int len) +{ + char *out = buf; + struct list_head *head, *tmp; + int count; + + out += sprintf(out, "Main list URBs:"); + if (list_empty(&uhci->urb_list)) + out += sprintf(out, " Empty\n"); + else { + out += sprintf(out, "\n"); + count = 0; + head = &uhci->urb_list; + tmp = head->next; + while (tmp != head) { + struct urb_priv *urbp = list_entry(tmp, struct urb_priv, urb_list); + + out += sprintf(out, " %d: ", ++count); + out += uhci_show_urbp(uhci, urbp, out, len - (out - buf)); + tmp = tmp->next; + } + } + + out += sprintf(out, "Remove list URBs:"); + if (list_empty(&uhci->urb_remove_list)) + out += sprintf(out, " Empty\n"); + else { + out += sprintf(out, "\n"); + count = 0; + head = &uhci->urb_remove_list; + tmp = head->next; + while (tmp != head) { + struct urb_priv *urbp = list_entry(tmp, struct urb_priv, urb_list); + + out += sprintf(out, " %d: ", ++count); + out += uhci_show_urbp(uhci, urbp, out, len - (out - buf)); + tmp = tmp->next; + } + } + + out += sprintf(out, "Complete list URBs:"); + if (list_empty(&uhci->complete_list)) + out += sprintf(out, " Empty\n"); + else { + out += sprintf(out, "\n"); + count = 0; + head = &uhci->complete_list; + tmp = head->next; + while (tmp != head) { + struct urb_priv *urbp = list_entry(tmp, struct urb_priv, urb_list); + + out += sprintf(out, " %d: ", ++count); + out += uhci_show_urbp(uhci, urbp, out, len - (out - buf)); + tmp = tmp->next; + } + } return out - buf; } static int uhci_sprint_schedule(struct uhci_hcd *uhci, char *buf, int len) { + unsigned long flags; char *out = buf; int i, j; struct uhci_qh *qh; struct uhci_td *td; struct list_head *tmp, *head; + spin_lock_irqsave(&uhci->lock, flags); + out += uhci_show_root_hub_state(uhci, out, len - (out - buf)); out += sprintf(out, "HC status\n"); out += uhci_show_status(uhci, out, len - (out - buf)); - if (debug <= 1) - return out - buf; out += sprintf(out, "Frame List\n"); for (i = 0; i < UHCI_NUMFRAMES; ++i) { + int shown = 0; td = uhci->frame_cpu[i]; if (!td) continue; - out += sprintf(out, "- Frame %d\n", i); \ - if (td->dma_handle != (dma_addr_t)uhci->frame[i]) + if (td->dma_handle != (dma_addr_t)uhci->frame[i]) { + show_frame_num(); out += sprintf(out, " frame list does not match td->dma_handle!\n"); + } + show_frame_num(); head = &td->fl_list; tmp = head; @@ -376,11 +467,14 @@ static int uhci_sprint_schedule(struct uhci_hcd *uhci, char *buf, int len) out += sprintf(out, "Skeleton QHs\n"); for (i = 0; i < UHCI_NUM_SKELQH; ++i) { - int cnt = 0; + int shown = 0; qh = uhci->skelqh[i]; - out += sprintf(out, "- %s\n", qh_names[i]); \ - out += uhci_show_qh(qh, out, len - (out - buf), 4); + + if (debug > 1) { + show_qh_name(); + out += uhci_show_qh(qh, out, len - (out - buf), 4); + } /* Last QH is the Terminating QH, it's different */ if (i == UHCI_NUM_SKELQH - 1) { @@ -393,45 +487,60 @@ static int uhci_sprint_schedule(struct uhci_hcd *uhci, char *buf, int len) continue; } - j = (i < 9) ? 9 : i+1; /* Next skeleton */ - head = &qh->node; + j = (i < 7) ? 7 : i+1; /* Next skeleton */ + if (list_empty(&qh->list)) { + if (i < UHCI_NUM_SKELQH - 1) { + if (qh->link != + (cpu_to_le32(uhci->skelqh[j]->dma_handle) | UHCI_PTR_QH)) { + show_qh_name(); + out += sprintf(out, " skeleton QH not linked to next skeleton QH!\n"); + } + } + + continue; + } + + show_qh_name(); + + head = &qh->list; tmp = head->next; while (tmp != head) { - qh = list_entry(tmp, struct uhci_qh, node); + qh = list_entry(tmp, struct uhci_qh, list); + tmp = tmp->next; - if (++cnt <= 10) - out += uhci_show_qh(qh, out, - len - (out - buf), 4); + + out += uhci_show_qh(qh, out, len - (out - buf), 4); } - if ((cnt -= 10) > 0) - out += sprintf(out, " Skipped %d QHs\n", cnt); - if (i > 1 && i < UHCI_NUM_SKELQH - 1) { + if (i < UHCI_NUM_SKELQH - 1) { if (qh->link != (cpu_to_le32(uhci->skelqh[j]->dma_handle) | UHCI_PTR_QH)) out += sprintf(out, " last QH not linked to next skeleton!\n"); } } + if (debug > 2) + out += uhci_show_lists(uhci, out, len - (out - buf)); + + spin_unlock_irqrestore(&uhci->lock, flags); + return out - buf; } -#ifdef CONFIG_DEBUG_FS - #define MAX_OUTPUT (64 * 1024) struct uhci_debug { int size; char *data; + struct uhci_hcd *uhci; }; static int uhci_debug_open(struct inode *inode, struct file *file) { - struct uhci_hcd *uhci = inode->i_private; + struct uhci_hcd *uhci = inode->u.generic_ip; struct uhci_debug *up; int ret = -ENOMEM; - unsigned long flags; lock_kernel(); up = kmalloc(sizeof(*up), GFP_KERNEL); @@ -444,11 +553,7 @@ static int uhci_debug_open(struct inode *inode, struct file *file) goto out; } - up->size = 0; - spin_lock_irqsave(&uhci->lock, flags); - if (uhci->is_initialized) - up->size = uhci_sprint_schedule(uhci, up->data, MAX_OUTPUT); - spin_unlock_irqrestore(&uhci->lock, flags); + up->size = uhci_sprint_schedule(uhci, up->data, MAX_OUTPUT); file->private_data = up; @@ -499,32 +604,15 @@ static int uhci_debug_release(struct inode *inode, struct file *file) return 0; } -#undef uhci_debug_operations static struct file_operations uhci_debug_operations = { - .owner = THIS_MODULE, .open = uhci_debug_open, .llseek = uhci_debug_lseek, .read = uhci_debug_read, .release = uhci_debug_release, }; -#endif /* CONFIG_DEBUG_FS */ - -#else /* DEBUG */ - -static inline void lprintk(char *buf) -{} - -static inline int uhci_show_qh(struct uhci_qh *qh, char *buf, - int len, int space) -{ - return 0; -} +#else /* CONFIG_DEBUG_FS */ -static inline int uhci_sprint_schedule(struct uhci_hcd *uhci, - char *buf, int len) -{ - return 0; -} +#define uhci_debug_operations (* (struct file_operations *) NULL) #endif diff --git a/drivers/usb/host/uhci-hcd.c b/drivers/usb/host/uhci-hcd.c index 4151f6186..dfe121d35 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-2006 Alan Stern, stern@rowland.harvard.edu + * (C) Copyright 2004-2005 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,6 +22,7 @@ * */ +#include #include #include #include @@ -30,6 +31,7 @@ #include #include #include +#include #include #include #include @@ -48,12 +50,11 @@ #include "../core/hcd.h" #include "uhci-hcd.h" -#include "pci-quirks.h" /* * Version Information */ -#define DRIVER_VERSION "v3.0" +#define DRIVER_VERSION "v2.3" #define DRIVER_AUTHOR "Linus 'Frodo Rabbit' Torvalds, Johannes Erdfelt, \ Randy Dunlap, Georg Acher, Deti Fliegl, Thomas Sailer, Roman Weissgaerber, \ Alan Stern" @@ -67,16 +68,12 @@ Alan Stern" * debug = 3, show all TDs in URBs when dumping */ #ifdef DEBUG -#define DEBUG_CONFIGURED 1 static int debug = 1; -module_param(debug, int, S_IRUGO | S_IWUSR); -MODULE_PARM_DESC(debug, "Debug level"); - #else -#define DEBUG_CONFIGURED 0 -#define debug 0 +static int debug = 0; #endif - +module_param(debug, int, S_IRUGO | S_IWUSR); +MODULE_PARM_DESC(debug, "Debug level"); static char *errbuf; #define ERRBUF_LEN (32 * 1024) @@ -86,10 +83,22 @@ 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" +extern void uhci_reset_hc(struct pci_dev *pdev, unsigned long base); +extern int uhci_check_and_reset_hc(struct pci_dev *pdev, unsigned long base); + /* * Finish up a host controller reset and update the recorded state. */ @@ -104,34 +113,28 @@ static void finish_reset(struct uhci_hcd *uhci) for (port = 0; port < uhci->rh_numports; ++port) outw(0, uhci->io_addr + USBPORTSC1 + (port * 2)); - uhci->port_c_suspend = uhci->resuming_ports = 0; + uhci->port_c_suspend = uhci->suspended_ports = + uhci->resuming_ports = 0; uhci->rh_state = UHCI_RH_RESET; 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 uhci_hc_died(struct uhci_hcd *uhci) +static void 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->dead = 1; - - /* The current frame may already be partway finished */ - ++uhci->frame_number; + uhci->hc_inaccessible = 1; } /* - * 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. + * Initialize a controller that was newly discovered or has just been + * resumed. In either case we can't be sure of its previous state. */ static void check_and_reset_hc(struct uhci_hcd *uhci) { @@ -151,8 +154,7 @@ 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_MAX_SOF_NUMBER, - uhci->io_addr + USBFRNUM); + outw(uhci->frame_number, uhci->io_addr + USBFRNUM); /* Mark controller as not halted before we enable interrupts */ uhci_to_hcd(uhci)->state = HC_STATE_SUSPENDED; @@ -204,8 +206,7 @@ __acquires(uhci->lock) int int_enable; auto_stop = (new_state == UHCI_RH_AUTO_STOPPED); - dev_dbg(&uhci_to_hcd(uhci)->self.root_hub->dev, - "%s%s\n", __FUNCTION__, + dev_dbg(uhci_dev(uhci), "%s%s\n", __FUNCTION__, (auto_stop ? " (auto-stop)" : "")); /* If we get a suspend request when we're already auto-stopped @@ -239,27 +240,27 @@ __acquires(uhci->lock) spin_unlock_irq(&uhci->lock); msleep(1); spin_lock_irq(&uhci->lock); - if (uhci->dead) + if (uhci->hc_inaccessible) /* Died */ return; } if (!(inw(uhci->io_addr + USBSTS) & USBSTS_HCH)) - dev_warn(&uhci_to_hcd(uhci)->self.root_hub->dev, - "Controller not stopped yet!\n"); + dev_warn(uhci_dev(uhci), "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. @@ -276,8 +277,7 @@ static void wakeup_rh(struct uhci_hcd *uhci) __releases(uhci->lock) __acquires(uhci->lock) { - dev_dbg(&uhci_to_hcd(uhci)->self.root_hub->dev, - "%s%s\n", __FUNCTION__, + dev_dbg(uhci_dev(uhci), "%s%s\n", __FUNCTION__, uhci->rh_state == UHCI_RH_AUTO_STOPPED ? " (auto-start)" : ""); @@ -292,7 +292,7 @@ __acquires(uhci->lock) spin_unlock_irq(&uhci->lock); msleep(20); spin_lock_irq(&uhci->lock); - if (uhci->dead) + if (uhci->hc_inaccessible) /* Died */ return; /* End Global Resume and wait for EOP to be sent */ @@ -338,13 +338,7 @@ static irqreturn_t uhci_irq(struct usb_hcd *hcd, struct pt_regs *regs) dev_err(uhci_dev(uhci), "host controller halted, " "very bad!\n"); - if (debug > 1 && errbuf) { - /* Print the schedule for debugging */ - uhci_sprint_schedule(uhci, - errbuf, ERRBUF_LEN); - lprintk(errbuf); - } - uhci_hc_died(uhci); + hc_died(uhci); /* Force a callback in case there are * pending unlinks */ @@ -367,21 +361,12 @@ 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. 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. + * is runnning */ static void uhci_get_current_frame_number(struct uhci_hcd *uhci) { - if (!uhci->is_stopped) { - unsigned delta; - - delta = (inw(uhci->io_addr + USBFRNUM) - uhci->frame_number) & - (UHCI_NUMFRAMES - 1); - uhci->frame_number += delta; - } + if (!uhci->is_stopped) + uhci->frame_number = inw(uhci->io_addr + USBFRNUM); } /* @@ -391,14 +376,6 @@ static void release_uhci(struct uhci_hcd *uhci) { int i; - if (DEBUG_CONFIGURED) { - spin_lock_irq(&uhci->lock); - uhci->is_initialized = 0; - spin_unlock_irq(&uhci->lock); - - debugfs_remove(uhci->dentry); - } - for (i = 0; i < UHCI_NUM_SKELQH; i++) uhci_free_qh(uhci, uhci->skelqh[i]); @@ -413,9 +390,11 @@ static void release_uhci(struct uhci_hcd *uhci) dma_free_coherent(uhci_dev(uhci), UHCI_NUMFRAMES * sizeof(*uhci->frame), uhci->frame, uhci->frame_dma_handle); + + debugfs_remove(uhci->dentry); } -static int uhci_init(struct usb_hcd *hcd) +static int uhci_reset(struct usb_hcd *hcd) { struct uhci_hcd *uhci = hcd_to_uhci(hcd); unsigned io_size = (unsigned) hcd->rsrc_len; @@ -467,7 +446,7 @@ static void uhci_shutdown(struct pci_dev *pdev) { struct usb_hcd *hcd = (struct usb_hcd *) pci_get_drvdata(pdev); - uhci_hc_died(hcd_to_uhci(hcd)); + hc_died(hcd_to_uhci(hcd)); } /* @@ -495,24 +474,32 @@ static int uhci_start(struct usb_hcd *hcd) hcd->uses_new_polling = 1; + dentry = debugfs_create_file(hcd->self.bus_name, + S_IFREG|S_IRUGO|S_IWUSR, uhci_debugfs_root, uhci, + &uhci_debug_operations); + if (!dentry) { + dev_err(uhci_dev(uhci), + "couldn't create uhci debugfs entry\n"); + retval = -ENOMEM; + goto err_create_debug_entry; + } + uhci->dentry = dentry; + + uhci->fsbr = 0; + uhci->fsbrtimeout = 0; + spin_lock_init(&uhci->lock); - setup_timer(&uhci->fsbr_timer, uhci_fsbr_timeout, - (unsigned long) uhci); - INIT_LIST_HEAD(&uhci->idle_qh_list); - init_waitqueue_head(&uhci->waitqh); + INIT_LIST_HEAD(&uhci->qh_remove_list); - if (DEBUG_CONFIGURED) { - dentry = debugfs_create_file(hcd->self.bus_name, - S_IFREG|S_IRUGO|S_IWUSR, uhci_debugfs_root, - uhci, &uhci_debug_operations); - if (!dentry) { - dev_err(uhci_dev(uhci), "couldn't create uhci " - "debugfs entry\n"); - retval = -ENOMEM; - goto err_create_debug_entry; - } - uhci->dentry = dentry; - } + INIT_LIST_HEAD(&uhci->td_remove_list); + + INIT_LIST_HEAD(&uhci->urb_remove_list); + + INIT_LIST_HEAD(&uhci->urb_list); + + INIT_LIST_HEAD(&uhci->complete_list); + + init_waitqueue_head(&uhci->waitqh); uhci->frame = dma_alloc_coherent(uhci_dev(uhci), UHCI_NUMFRAMES * sizeof(*uhci->frame), @@ -553,7 +540,7 @@ static int uhci_start(struct usb_hcd *hcd) } for (i = 0; i < UHCI_NUM_SKELQH; i++) { - uhci->skelqh[i] = uhci_alloc_qh(uhci, NULL, NULL); + uhci->skelqh[i] = uhci_alloc_qh(uhci); if (!uhci->skelqh[i]) { dev_err(uhci_dev(uhci), "unable to allocate QH\n"); goto err_alloc_skelqh; @@ -570,17 +557,13 @@ static int uhci_start(struct usb_hcd *hcd) uhci->skel_int16_qh->link = uhci->skel_int8_qh->link = uhci->skel_int4_qh->link = - uhci->skel_int2_qh->link = UHCI_PTR_QH | - cpu_to_le32(uhci->skel_int1_qh->dma_handle); - - uhci->skel_int1_qh->link = UHCI_PTR_QH | - cpu_to_le32(uhci->skel_ls_control_qh->dma_handle); - uhci->skel_ls_control_qh->link = UHCI_PTR_QH | - cpu_to_le32(uhci->skel_fs_control_qh->dma_handle); - uhci->skel_fs_control_qh->link = UHCI_PTR_QH | - cpu_to_le32(uhci->skel_bulk_qh->dma_handle); - uhci->skel_bulk_qh->link = UHCI_PTR_QH | - cpu_to_le32(uhci->skel_term_qh->dma_handle); + uhci->skel_int2_qh->link = + cpu_to_le32(uhci->skel_int1_qh->dma_handle) | UHCI_PTR_QH; + uhci->skel_int1_qh->link = cpu_to_le32(uhci->skel_ls_control_qh->dma_handle) | UHCI_PTR_QH; + + uhci->skel_ls_control_qh->link = cpu_to_le32(uhci->skel_fs_control_qh->dma_handle) | UHCI_PTR_QH; + uhci->skel_fs_control_qh->link = cpu_to_le32(uhci->skel_bulk_qh->dma_handle) | UHCI_PTR_QH; + uhci->skel_bulk_qh->link = cpu_to_le32(uhci->skel_term_qh->dma_handle) | UHCI_PTR_QH; /* This dummy TD is to work around a bug in Intel PIIX controllers */ uhci_fill_td(uhci->term_td, 0, uhci_explen(0) | @@ -606,15 +589,15 @@ static int uhci_start(struct usb_hcd *hcd) /* * ffs (Find First bit Set) does exactly what we need: - * 1,3,5,... => ffs = 0 => use skel_int2_qh = skelqh[8], - * 2,6,10,... => ffs = 1 => use skel_int4_qh = skelqh[7], etc. - * ffs >= 7 => not on any high-period queue, so use - * skel_int1_qh = skelqh[9]. + * 1,3,5,... => ffs = 0 => use skel_int2_qh = skelqh[6], + * 2,6,10,... => ffs = 1 => use skel_int4_qh = skelqh[5], etc. + * ffs > 6 => not on any high-period queue, so use + * skel_int1_qh = skelqh[7]. * Add UHCI_NUMFRAMES to insure at least one bit is set. */ - irq = 8 - (int) __ffs(i + UHCI_NUMFRAMES); - if (irq <= 1) - irq = 9; + irq = 6 - (int) __ffs(i + UHCI_NUMFRAMES); + if (irq < 0) + irq = 7; /* Only place we don't use the frame list routines */ uhci->frame[i] = UHCI_PTR_QH | @@ -628,7 +611,6 @@ static int uhci_start(struct usb_hcd *hcd) mb(); configure_hc(uhci); - uhci->is_initialized = 1; start_rh(uhci); return 0; @@ -669,12 +651,11 @@ static void uhci_stop(struct usb_hcd *hcd) struct uhci_hcd *uhci = hcd_to_uhci(hcd); spin_lock_irq(&uhci->lock); - if (test_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags) && !uhci->dead) - uhci_hc_died(uhci); + if (!uhci->hc_inaccessible) + hc_died(uhci); uhci_scan_schedule(uhci, NULL); spin_unlock_irq(&uhci->lock); - del_timer_sync(&uhci->fsbr_timer); release_uhci(uhci); } @@ -682,15 +663,12 @@ 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 (!test_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags)) - rc = -ESHUTDOWN; - else if (!uhci->dead) + if (!uhci->hc_inaccessible) /* Not dead */ suspend_rh(uhci, UHCI_RH_SUSPENDED); spin_unlock_irq(&uhci->lock); - return rc; + return 0; } static int uhci_rh_resume(struct usb_hcd *hcd) @@ -699,10 +677,13 @@ static int uhci_rh_resume(struct usb_hcd *hcd) int rc = 0; spin_lock_irq(&uhci->lock); - 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) + 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 wakeup_rh(uhci); spin_unlock_irq(&uhci->lock); return rc; @@ -716,8 +697,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 (!test_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags) || uhci->dead) - goto done_okay; /* Already suspended or dead */ + if (uhci->hc_inaccessible) /* Dead or already suspended */ + goto done; if (uhci->rh_state > UHCI_RH_SUSPENDED) { dev_warn(uhci_dev(uhci), "Root hub isn't suspended!\n"); @@ -730,12 +711,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; @@ -748,22 +729,24 @@ 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. + * even if the controller was dead. It might not even be dead + * any more, if the firmware or quirks code has reset it. */ set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); mb(); + if (uhci->rh_state == UHCI_RH_RESET) /* Dead */ + return 0; spin_lock_irq(&uhci->lock); /* FIXME: Disable non-PME# remote wakeup? */ - /* The firmware or a boot kernel may have changed the controller - * settings during a system wakeup. Check it and reconfigure - * to avoid problems. + uhci->hc_inaccessible = 0; + + /* The BIOS 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) { @@ -784,44 +767,30 @@ static int uhci_resume(struct usb_hcd *hcd) } #endif -/* Wait until a particular device/endpoint's QH is idle, and free it */ +/* Wait until all the URBs for a particular device/endpoint are gone */ static void uhci_hcd_endpoint_disable(struct usb_hcd *hcd, - struct usb_host_endpoint *hep) + struct usb_host_endpoint *ep) { struct uhci_hcd *uhci = hcd_to_uhci(hcd); - struct uhci_qh *qh; - spin_lock_irq(&uhci->lock); - qh = (struct uhci_qh *) hep->hcpriv; - if (qh == NULL) - goto done; - - while (qh->state != QH_STATE_IDLE) { - ++uhci->num_waiting; - spin_unlock_irq(&uhci->lock); - wait_event_interruptible(uhci->waitqh, - qh->state == QH_STATE_IDLE); - spin_lock_irq(&uhci->lock); - --uhci->num_waiting; - } - - uhci_free_qh(uhci, qh); -done: - spin_unlock_irq(&uhci->lock); + wait_event_interruptible(uhci->waitqh, list_empty(&ep->urb_list)); } static int uhci_hcd_get_frame_number(struct usb_hcd *hcd) { struct uhci_hcd *uhci = hcd_to_uhci(hcd); - unsigned frame_number; - unsigned delta; + unsigned long flags; + int is_stopped; + int frame_number; /* Minimize latency by avoiding the spinlock */ - frame_number = uhci->frame_number; - barrier(); - delta = (inw(uhci->io_addr + USBFRNUM) - frame_number) & - (UHCI_NUMFRAMES - 1); - return frame_number + delta; + 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; } static const char hcd_name[] = "uhci_hcd"; @@ -836,7 +805,7 @@ static const struct hc_driver uhci_driver = { .flags = HCD_USB11, /* Basic lifecycle operations */ - .reset = uhci_init, + .reset = uhci_reset, .start = uhci_start, #ifdef CONFIG_PM .suspend = uhci_suspend, @@ -858,7 +827,7 @@ static const struct hc_driver uhci_driver = { static const struct pci_device_id uhci_pci_ids[] = { { /* handle any USB UHCI controller */ - PCI_DEVICE_CLASS(PCI_CLASS_SERIAL_USB_UHCI, ~0), + PCI_DEVICE_CLASS(((PCI_CLASS_SERIAL_USB << 8) | 0x00), ~0), .driver_data = (unsigned long) &uhci_driver, }, { /* end: all zeroes */ } }; @@ -888,15 +857,16 @@ static int __init uhci_hcd_init(void) if (usb_disabled()) return -ENODEV; - if (DEBUG_CONFIGURED) { + if (debug) { errbuf = kmalloc(ERRBUF_LEN, GFP_KERNEL); if (!errbuf) goto errbuf_failed; - uhci_debugfs_root = debugfs_create_dir("uhci", NULL); - if (!uhci_debugfs_root) - goto debug_failed; } + uhci_debugfs_root = debugfs_create_dir("uhci", NULL); + if (!uhci_debugfs_root) + goto debug_failed; + uhci_up_cachep = kmem_cache_create("uhci_urb_priv", sizeof(struct urb_priv), 0, 0, NULL, NULL); if (!uhci_up_cachep) diff --git a/drivers/usb/host/uhci-hcd.h b/drivers/usb/host/uhci-hcd.h index 108e3de2d..8b4b887a7 100644 --- a/drivers/usb/host/uhci-hcd.h +++ b/drivers/usb/host/uhci-hcd.h @@ -28,9 +28,8 @@ #define USBSTS_USBINT 0x0001 /* Interrupt due to IOC */ #define USBSTS_ERROR 0x0002 /* Interrupt due to error */ #define USBSTS_RD 0x0004 /* Resume Detect */ -#define USBSTS_HSE 0x0008 /* Host System Error: PCI problems */ -#define USBSTS_HCPE 0x0010 /* Host Controller Process Error: - * the schedule is buggy */ +#define USBSTS_HSE 0x0008 /* Host System Error - basically PCI problems */ +#define USBSTS_HCPE 0x0010 /* Host Controller Process Error - the scripts were buggy */ #define USBSTS_HCH 0x0020 /* HC Halted */ /* Interrupt enable register */ @@ -48,8 +47,7 @@ /* USB port status and control registers */ #define USBPORTSC1 16 #define USBPORTSC2 18 -#define USBPORTSC_CCS 0x0001 /* Current Connect Status - * ("device present") */ +#define USBPORTSC_CCS 0x0001 /* Current Connect Status ("device present") */ #define USBPORTSC_CSC 0x0002 /* Connect Status Change */ #define USBPORTSC_PE 0x0004 /* Port Enable */ #define USBPORTSC_PEC 0x0008 /* Port Enable Change */ @@ -73,23 +71,15 @@ #define USBLEGSUP_RWC 0x8f00 /* the R/WC bits */ #define USBLEGSUP_RO 0x5040 /* R/O and reserved bits */ -#define UHCI_PTR_BITS __constant_cpu_to_le32(0x000F) -#define UHCI_PTR_TERM __constant_cpu_to_le32(0x0001) -#define UHCI_PTR_QH __constant_cpu_to_le32(0x0002) -#define UHCI_PTR_DEPTH __constant_cpu_to_le32(0x0004) -#define UHCI_PTR_BREADTH __constant_cpu_to_le32(0x0000) +#define UHCI_PTR_BITS cpu_to_le32(0x000F) +#define UHCI_PTR_TERM cpu_to_le32(0x0001) +#define UHCI_PTR_QH cpu_to_le32(0x0002) +#define UHCI_PTR_DEPTH cpu_to_le32(0x0004) +#define UHCI_PTR_BREADTH cpu_to_le32(0x0000) #define UHCI_NUMFRAMES 1024 /* in the frame list [array] */ #define UHCI_MAX_SOF_NUMBER 2047 /* in an SOF packet */ -#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) +#define CAN_SCHEDULE_FRAMES 1000 /* how far future frames can be scheduled */ /* @@ -97,69 +87,38 @@ */ /* - * One role of a QH is to hold a queue of TDs for some endpoint. One QH goes - * with each endpoint, and qh->element (updated by the HC) is either: - * - the next unprocessed TD in the endpoint's queue, or - * - UHCI_PTR_TERM (when there's no more traffic for this endpoint). + * One role of a QH is to hold a queue of TDs for some endpoint. Each QH is + * used with one URB, and qh->element (updated by the HC) is either: + * - the next unprocessed TD for the URB, or + * - UHCI_PTR_TERM (when there's no more traffic for this endpoint), or + * - the QH for the next URB queued to the same endpoint. * * The other role of a QH is to serve as a "skeleton" framelist entry, so we * can easily splice a QH for some endpoint into the schedule at the right * place. Then qh->element is UHCI_PTR_TERM. * - * In the schedule, qh->link maintains a list of QHs seen by the HC: + * In the frame list, qh->link maintains a list of QHs seen by the HC: * skel1 --> ep1-qh --> ep2-qh --> ... --> skel2 --> ... - * - * qh->node is the software equivalent of qh->link. The differences - * are that the software list is doubly-linked and QHs in the UNLINKING - * state are on the software list but not the hardware schedule. - * - * For bookkeeping purposes we maintain QHs even for Isochronous endpoints, - * but they never get added to the hardware schedule. */ -#define QH_STATE_IDLE 1 /* QH is not being used */ -#define QH_STATE_UNLINKING 2 /* QH has been removed from the - * schedule but the hardware may - * still be using it */ -#define QH_STATE_ACTIVE 3 /* QH is on the schedule */ - struct uhci_qh { /* Hardware fields */ - __le32 link; /* Next QH in the schedule */ - __le32 element; /* Queue element (TD) pointer */ + __le32 link; /* Next queue */ + __le32 element; /* Queue element pointer */ /* Software fields */ - 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 error/unlink */ - unsigned int wait_expired:1; /* QH_WAIT_TIMEOUT has expired */ + struct urb_priv *urbp; + + struct list_head list; + struct list_head remove_list; } __attribute__((aligned(16))); /* * We need a special accessor for the element pointer because it is * subject to asynchronous updates by the controller. */ -static inline __le32 qh_element(struct uhci_qh *qh) { +static __le32 inline qh_element(struct uhci_qh *qh) { __le32 element = qh->element; barrier(); @@ -190,13 +149,11 @@ static inline __le32 qh_element(struct uhci_qh *qh) { #define TD_CTRL_ACTLEN_MASK 0x7FF /* actual length, encoded as n - 1 */ #define TD_CTRL_ANY_ERROR (TD_CTRL_STALLED | TD_CTRL_DBUFERR | \ - TD_CTRL_BABBLE | TD_CTRL_CRCTIME | \ - TD_CTRL_BITSTUFF) + TD_CTRL_BABBLE | TD_CTRL_CRCTIME | TD_CTRL_BITSTUFF) #define uhci_maxerr(err) ((err) << TD_CTRL_C_ERR_SHIFT) #define uhci_status_bits(ctrl_sts) ((ctrl_sts) & 0xF60000) -#define uhci_actual_length(ctrl_sts) (((ctrl_sts) + 1) & \ - TD_CTRL_ACTLEN_MASK) /* 1-based */ +#define uhci_actual_length(ctrl_sts) (((ctrl_sts) + 1) & TD_CTRL_ACTLEN_MASK) /* 1-based */ /* * for TD : (a.k.a. Token) @@ -206,7 +163,7 @@ static inline __le32 qh_element(struct uhci_qh *qh) { #define TD_TOKEN_TOGGLE_SHIFT 19 #define TD_TOKEN_TOGGLE (1 << 19) #define TD_TOKEN_EXPLEN_SHIFT 21 -#define TD_TOKEN_EXPLEN_MASK 0x7FF /* expected length, encoded as n-1 */ +#define TD_TOKEN_EXPLEN_MASK 0x7FF /* expected length, encoded as n - 1 */ #define TD_TOKEN_PID_MASK 0xFF #define uhci_explen(len) ((((len) - 1) & TD_TOKEN_EXPLEN_MASK) << \ @@ -230,7 +187,7 @@ static inline __le32 qh_element(struct uhci_qh *qh) { * sw space after the TD entry. * * td->link points to either another TD (not necessarily for the same urb or - * even the same endpoint), or nothing (PTR_TERM), or a QH. + * even the same endpoint), or nothing (PTR_TERM), or a QH (for queued urbs). */ struct uhci_td { /* Hardware fields */ @@ -243,6 +200,7 @@ 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; @@ -252,7 +210,7 @@ struct uhci_td { * We need a special accessor for the control/status word because it is * subject to asynchronous updates by the controller. */ -static inline u32 td_status(struct uhci_td *td) { +static u32 inline td_status(struct uhci_td *td) { __le32 status = td->status; barrier(); @@ -265,14 +223,17 @@ static inline u32 td_status(struct uhci_td *td) { */ /* - * The UHCI driver uses QHs with Interrupt, Control and Bulk URBs for - * automatic queuing. To make it easy to insert entries into the schedule, - * we have a skeleton of QHs for each predefined Interrupt latency, - * low-speed control, full-speed control, bulk, and terminating QH - * (see explanation for the terminating QH below). + * The UHCI driver places Interrupt, Control and Bulk into QHs both + * to group together TDs for one transfer, and also to facilitate queuing + * of URBs. To make it easy to insert entries into the schedule, we have + * a skeleton of QHs for each predefined Interrupt latency, low-speed + * control, full-speed control and terminating QH (see explanation for + * the terminating QH below). * * When we want to add a new QH, we add it to the end of the list for the - * skeleton QH. For instance, the schedule list can look like this: + * skeleton QH. + * + * For instance, the queue can look like this: * * skel int128 QH * dev 1 interrupt QH @@ -295,34 +256,59 @@ static inline u32 td_status(struct uhci_td *td) { * - To loop back to the full-speed control queue for full-speed bandwidth * reclamation. * - * There's a special skeleton QH for Isochronous QHs. It never appears - * on the schedule, and Isochronous TDs go on the schedule before the - * the skeleton QHs. The hardware accesses them directly rather than - * through their QH, which is used only for bookkeeping purposes. - * While the UHCI spec doesn't forbid the use of QHs for Isochronous, - * it doesn't use them either. And the spec says that queues never - * advance on an error completion status, which makes them totally - * unsuitable for Isochronous transfers. + * Isochronous transfers are stored before the start of the skeleton + * schedule and don't use QHs. While the UHCI spec doesn't forbid the + * use of QHs for Isochronous, it doesn't use them either. And the spec + * says that queues never advance on an error completion status, which + * makes them totally unsuitable for Isochronous transfers. */ -#define UHCI_NUM_SKELQH 14 -#define skel_unlink_qh skelqh[0] -#define skel_iso_qh skelqh[1] -#define skel_int128_qh skelqh[2] -#define skel_int64_qh skelqh[3] -#define skel_int32_qh skelqh[4] -#define skel_int16_qh skelqh[5] -#define skel_int8_qh skelqh[6] -#define skel_int4_qh skelqh[7] -#define skel_int2_qh skelqh[8] -#define skel_int1_qh skelqh[9] -#define skel_ls_control_qh skelqh[10] -#define skel_fs_control_qh skelqh[11] -#define skel_bulk_qh skelqh[12] -#define skel_term_qh skelqh[13] - -/* Find the skelqh entry corresponding to an interval exponent */ -#define UHCI_SKEL_INDEX(exponent) (9 - exponent) +#define UHCI_NUM_SKELQH 12 +#define skel_int128_qh skelqh[0] +#define skel_int64_qh skelqh[1] +#define skel_int32_qh skelqh[2] +#define skel_int16_qh skelqh[3] +#define skel_int8_qh skelqh[4] +#define skel_int4_qh skelqh[5] +#define skel_int2_qh skelqh[6] +#define skel_int1_qh skelqh[7] +#define skel_ls_control_qh skelqh[8] +#define skel_fs_control_qh skelqh[9] +#define skel_bulk_qh skelqh[10] +#define skel_term_qh skelqh[11] + +/* + * 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 7; /* int1 for 0-1 ms */ + return 6; /* int2 for 2-3 ms */ + } + if (interval < 8) + return 5; /* int4 for 4-7 ms */ + return 4; /* int8 for 8-15 ms */ + } + if (interval < 64) { + if (interval < 32) + return 3; /* int16 for 16-31 ms */ + return 2; /* int32 for 32-63 ms */ + } + if (interval < 128) + return 1; /* int64 for 64-127 ms */ + return 0; /* int128 for 128-255 ms (Max.) */ +} /* @@ -374,13 +360,15 @@ struct uhci_hcd { struct uhci_td *term_td; /* Terminating TD, see UHCI bug */ struct uhci_qh *skelqh[UHCI_NUM_SKELQH]; /* Skeleton QHs */ - struct uhci_qh *next_qh; /* Next QH to scan */ spinlock_t lock; - dma_addr_t frame_dma_handle; /* Hardware frame list */ + dma_addr_t frame_dma_handle; /* Hardware frame list */ __le32 *frame; - void **frame_cpu; /* CPU's frame list */ + 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 */ @@ -388,32 +376,40 @@ struct uhci_hcd { 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 dead:1; /* Controller has died */ + unsigned int hc_inaccessible:1; /* HC is suspended or dead */ 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 suspended_ports; unsigned long resuming_ports; unsigned long ports_timeout; /* Time to stop signalling */ - struct list_head idle_qh_list; /* Where the idle QHs live */ + /* Main list of URBs currently controlled by this HC */ + struct list_head urb_list; + + /* List of QHs that are done, but waiting to be unlinked (race) */ + struct list_head qh_remove_list; + unsigned int qh_remove_age; /* Age in frames */ + + /* List of TDs that are done, but waiting to be freed (race) */ + struct list_head td_remove_list; + unsigned int td_remove_age; /* Age in frames */ + + /* List of asynchronously unlinked URBs */ + struct list_head urb_remove_list; + unsigned int urb_remove_age; /* Age in frames */ + + /* List of URBs awaiting completion callback */ + struct list_head complete_list; int rh_numports; /* Number of root-hub ports */ wait_queue_head_t waitqh; /* endpoint_disable waiters */ - int num_waiting; /* Number of waiters */ }; /* Convert between a usb_hcd pointer and the corresponding uhci_hcd */ @@ -428,22 +424,28 @@ 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 */ struct urb_priv { - struct list_head node; /* Node in the QH's urbp list */ + struct list_head urb_list; struct urb *urb; struct uhci_qh *qh; /* QH for this URB */ struct list_head td_list; - unsigned fsbr:1; /* URB wants FSBR */ + unsigned fsbr : 1; /* URB turned on FSBR */ + unsigned fsbr_timeout : 1; /* URB timed out on FSBR */ + unsigned queued : 1; /* QH was queued (not linked in) */ + unsigned short_control_packet : 1; /* If we get a short packet during */ + /* a control transfer, retrigger */ + /* the status phase */ + + unsigned long fsbrtime; /* In jiffies */ + + struct list_head queue_list; }; diff --git a/drivers/usb/host/uhci-hub.c b/drivers/usb/host/uhci-hub.c index c545ef92f..152971d16 100644 --- a/drivers/usb/host/uhci-hub.c +++ b/drivers/usb/host/uhci-hub.c @@ -85,10 +85,11 @@ static void uhci_finish_suspend(struct uhci_hcd *uhci, int port, { int status; - if (inw(port_addr) & (USBPORTSC_SUSP | USBPORTSC_RD)) { + if (test_bit(port, &uhci->suspended_ports)) { CLR_RH_PORTSTAT(USBPORTSC_SUSP | USBPORTSC_RD); - if (test_bit(port, &uhci->resuming_ports)) - set_bit(port, &uhci->port_c_suspend); + clear_bit(port, &uhci->suspended_ports); + clear_bit(port, &uhci->resuming_ports); + set_bit(port, &uhci->port_c_suspend); /* The controller won't actually turn off the RD bit until * it has had a chance to send a low-speed EOP sequence, @@ -96,7 +97,6 @@ static void uhci_finish_suspend(struct uhci_hcd *uhci, int port, * slightly longer for good luck. */ udelay(4); } - clear_bit(port, &uhci->resuming_ports); } /* Wait for the UHCI controller in HP's iLO2 server management chip. @@ -171,8 +171,9 @@ static int uhci_hub_status_data(struct usb_hcd *hcd, char *buf) spin_lock_irqsave(&uhci->lock, flags); uhci_scan_schedule(uhci, NULL); - if (!test_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags) || uhci->dead) + if (uhci->hc_inaccessible) goto done; + check_fsbr(uhci); uhci_check_ports(uhci); status = get_hub_status_data(uhci, buf); @@ -227,7 +228,7 @@ static int uhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, u16 wPortChange, wPortStatus; unsigned long flags; - if (!test_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags) || uhci->dead) + if (uhci->hc_inaccessible) return -ETIMEDOUT; spin_lock_irqsave(&uhci->lock, flags); @@ -264,6 +265,8 @@ static int uhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, wPortChange |= USB_PORT_STAT_C_SUSPEND; lstatus |= 1; } + if (test_bit(port, &uhci->suspended_ports)) + lstatus |= 2; if (test_bit(port, &uhci->resuming_ports)) lstatus |= 4; @@ -306,6 +309,7 @@ static int uhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, switch (wValue) { case USB_PORT_FEAT_SUSPEND: + set_bit(port, &uhci->suspended_ports); SET_RH_PORTSTAT(USBPORTSC_SUSP); OK(0); case USB_PORT_FEAT_RESET: @@ -339,11 +343,8 @@ static int uhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, CLR_RH_PORTSTAT(USBPORTSC_PEC); OK(0); case USB_PORT_FEAT_SUSPEND: - if (!(inw(port_addr) & USBPORTSC_SUSP)) { - - /* Make certain the port isn't suspended */ - uhci_finish_suspend(uhci, port, port_addr); - } else if (!test_and_set_bit(port, + if (test_bit(port, &uhci->suspended_ports) && + !test_and_set_bit(port, &uhci->resuming_ports)) { SET_RH_PORTSTAT(USBPORTSC_RD); diff --git a/drivers/usb/host/uhci-q.c b/drivers/usb/host/uhci-q.c index 431e8f31f..782398045 100644 --- a/drivers/usb/host/uhci-q.c +++ b/drivers/usb/host/uhci-q.c @@ -13,9 +13,14 @@ * (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-2006 Alan Stern, stern@rowland.harvard.edu + * (C) Copyright 2004 Alan Stern, stern@rowland.harvard.edu */ +static int uhci_urb_dequeue(struct usb_hcd *hcd, struct urb *urb); +static void uhci_unlink_generic(struct uhci_hcd *uhci, struct urb *urb); +static void uhci_remove_pending_urbps(struct uhci_hcd *uhci); +static void uhci_free_pending_qhs(struct uhci_hcd *uhci); +static void uhci_free_pending_tds(struct uhci_hcd *uhci); /* * Technically, updating td->status here is a race, but it's not really a @@ -25,7 +30,7 @@ * games with the FSBR code to make sure we get the correct order in all * the cases. I don't think it's worth the effort */ -static void uhci_set_next_interrupt(struct uhci_hcd *uhci) +static inline void uhci_set_next_interrupt(struct uhci_hcd *uhci) { if (uhci->is_stopped) mod_timer(&uhci_to_hcd(uhci)->rh_timer, jiffies); @@ -37,60 +42,12 @@ 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) +static inline void uhci_moveto_complete(struct uhci_hcd *uhci, + struct urb_priv *urbp) { - 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); + list_move_tail(&urbp->urb_list, &uhci->complete_list); } - static struct uhci_td *uhci_alloc_td(struct uhci_hcd *uhci) { dma_addr_t dma_handle; @@ -101,24 +58,19 @@ static struct uhci_td *uhci_alloc_td(struct uhci_hcd *uhci) return NULL; td->dma_handle = dma_handle; + + td->link = UHCI_PTR_TERM; + td->buffer = 0; + td->frame = -1; INIT_LIST_HEAD(&td->list); + INIT_LIST_HEAD(&td->remove_list); INIT_LIST_HEAD(&td->fl_list); return td; } -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->fl_list)) - dev_warn(uhci_dev(uhci), "td %p still in fl_list!\n", td); - - dma_pool_free(uhci->td_pool, td, td->dma_handle); -} - static inline void uhci_fill_td(struct uhci_td *td, u32 status, u32 token, u32 buffer) { @@ -127,21 +79,10 @@ 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 */ -static inline void uhci_insert_td_in_frame_list(struct uhci_hcd *uhci, - struct uhci_td *td, unsigned framenum) +static void uhci_insert_td_frame_list(struct uhci_hcd *uhci, struct uhci_td *td, unsigned framenum) { framenum &= (UHCI_NUMFRAMES - 1); @@ -167,7 +108,7 @@ static inline void uhci_insert_td_in_frame_list(struct uhci_hcd *uhci, } } -static inline void uhci_remove_td_from_frame_list(struct uhci_hcd *uhci, +static inline void uhci_remove_td_frame_list(struct uhci_hcd *uhci, struct uhci_td *td) { /* If it's not inserted, don't remove it */ @@ -198,38 +139,48 @@ 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) +static void unlink_isochronous_tds(struct uhci_hcd *uhci, struct urb *urb) { - 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; + struct urb_priv *urbp = (struct urb_priv *) urb->hcpriv; + struct uhci_td *td; - while (!list_empty(&ftd->fl_list)) - list_del_init(ftd->fl_list.prev); - } + list_for_each_entry(td, &urbp->td_list, list) + uhci_remove_td_frame_list(uhci, td); + wmb(); } /* - * Remove all the TDs for an Isochronous URB from the frame list + * Inserts a td list into qh. */ -static void uhci_unlink_isochronous_tds(struct uhci_hcd *uhci, struct urb *urb) +static void uhci_insert_tds_in_qh(struct uhci_qh *qh, struct urb *urb, __le32 breadth) { - struct urb_priv *urbp = (struct urb_priv *) urb->hcpriv; + struct urb_priv *urbp = (struct urb_priv *)urb->hcpriv; struct uhci_td *td; + __le32 *plink; - list_for_each_entry(td, &urbp->td_list, list) - uhci_remove_td_from_frame_list(uhci, td); + /* Ordering isn't important here yet since the QH hasn't been */ + /* inserted into the schedule yet */ + plink = &qh->element; + list_for_each_entry(td, &urbp->td_list, list) { + *plink = cpu_to_le32(td->dma_handle) | breadth; + plink = &td->link; + } + *plink = UHCI_PTR_TERM; +} + +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); + + dma_pool_free(uhci->td_pool, td, td->dma_handle); } -static struct uhci_qh *uhci_alloc_qh(struct uhci_hcd *uhci, - struct usb_device *udev, struct usb_host_endpoint *hep) +static struct uhci_qh *uhci_alloc_qh(struct uhci_hcd *uhci) { dma_addr_t dma_handle; struct uhci_qh *qh; @@ -238,263 +189,261 @@ 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; qh->link = UHCI_PTR_TERM; - INIT_LIST_HEAD(&qh->queue); - INIT_LIST_HEAD(&qh->node); + qh->urbp = NULL; + + INIT_LIST_HEAD(&qh->list); + INIT_LIST_HEAD(&qh->remove_list); - if (udev) { /* Normal QH */ - qh->dummy_td = uhci_alloc_td(uhci); - if (!qh->dummy_td) { - dma_pool_free(uhci->qh_pool, qh, dma_handle); - return NULL; - } - qh->state = QH_STATE_IDLE; - 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->type = -1; - } return qh; } static void uhci_free_qh(struct uhci_hcd *uhci, struct uhci_qh *qh) { - WARN_ON(qh->state != QH_STATE_IDLE && qh->udev); - if (!list_empty(&qh->queue)) + if (!list_empty(&qh->list)) dev_warn(uhci_dev(uhci), "qh %p list not empty!\n", qh); + if (!list_empty(&qh->remove_list)) + dev_warn(uhci_dev(uhci), "qh %p still in remove_list!\n", qh); - list_del(&qh->node); - if (qh->udev) { - qh->hep->hcpriv = NULL; - uhci_free_td(uhci, qh->dummy_td); - } dma_pool_free(uhci->qh_pool, qh, qh->dma_handle); } /* - * 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). + * Append this urb's qh after the last qh in skelqh->list * - * Returns 0 if the URB should not yet be given back, 1 otherwise. + * Note that urb_priv.queue_list doesn't have a separate queue head; + * it's a ring with every element "live". */ -static int uhci_cleanup_queue(struct uhci_hcd *uhci, struct uhci_qh *qh, - struct urb *urb) +static void uhci_insert_qh(struct uhci_hcd *uhci, struct uhci_qh *skelqh, struct urb *urb) { - 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; + struct urb_priv *urbp = (struct urb_priv *)urb->hcpriv; + struct urb_priv *turbp; + struct uhci_qh *lqh; + + /* Grab the last QH */ + lqh = list_entry(skelqh->list.prev, struct uhci_qh, list); + + /* Point to the next skelqh */ + urbp->qh->link = lqh->link; + wmb(); /* Ordering is important */ + + /* + * Patch QHs for previous endpoint's queued URBs? HC goes + * here next, not to the next skelqh it now points to. + * + * lqh --> td ... --> qh ... --> td --> qh ... --> td + * | | | + * v v v + * +<----------------+-----------------+ + * v + * newqh --> td ... --> td + * | + * v + * ... + * + * The HC could see (and use!) any of these as we write them. + */ + lqh->link = cpu_to_le32(urbp->qh->dma_handle) | UHCI_PTR_QH; + if (lqh->urbp) { + list_for_each_entry(turbp, &lqh->urbp->queue_list, queue_list) + turbp->qh->link = lqh->link; } - /* 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; + list_add_tail(&urbp->qh->list, &skelqh->list); +} - 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; +/* + * Start removal of QH from schedule; it finishes next frame. + * TDs should be unlinked before this is called. + */ +static void uhci_remove_qh(struct uhci_hcd *uhci, struct uhci_qh *qh) +{ + struct uhci_qh *pqh; + __le32 newlink; + + if (!qh) + return; + + /* + * Only go through the hoops if it's actually linked in + */ + if (!list_empty(&qh->list)) { + + /* If our queue is nonempty, make the next URB the head */ + if (!list_empty(&qh->urbp->queue_list)) { + struct urb_priv *nurbp; + + nurbp = list_entry(qh->urbp->queue_list.next, + struct urb_priv, queue_list); + nurbp->queued = 0; + list_add(&nurbp->qh->list, &qh->list); + newlink = cpu_to_le32(nurbp->qh->dma_handle) | UHCI_PTR_QH; + } else + newlink = qh->link; + + /* Fix up the previous QH's queue to link to either + * the new head of this queue or the start of the + * next endpoint's queue. */ + pqh = list_entry(qh->list.prev, struct uhci_qh, list); + pqh->link = newlink; + if (pqh->urbp) { + struct urb_priv *turbp; + + list_for_each_entry(turbp, &pqh->urbp->queue_list, + queue_list) + turbp->qh->link = newlink; + } + wmb(); + + /* Leave qh->link in case the HC is on the QH now, it will */ + /* continue the rest of the schedule */ + qh->element = UHCI_PTR_TERM; + + list_del_init(&qh->list); } - /* 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) - goto done; - qh->element = UHCI_PTR_TERM; + list_del_init(&qh->urbp->queue_list); + qh->urbp = NULL; - /* Control pipes have to worry about toggles */ - if (qh->type == USB_ENDPOINT_XFER_CONTROL) - goto done; + uhci_get_current_frame_number(uhci); + if (uhci->frame_number + uhci->is_stopped != uhci->qh_remove_age) { + uhci_free_pending_qhs(uhci); + uhci->qh_remove_age = uhci->frame_number; + } - /* 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)); + /* Check to see if the remove list is empty. Set the IOC bit */ + /* to force an interrupt so we can remove the QH */ + if (list_empty(&uhci->qh_remove_list)) + uhci_set_next_interrupt(uhci); -done: - return ret; + list_add(&qh->remove_list, &uhci->qh_remove_list); } -/* - * Fix up the data toggles for URBs in a queue, when one of them - * terminates early (short transfer, error, or dequeued). - */ -static void uhci_fixup_toggles(struct uhci_qh *qh, int skip_first) +static int uhci_fixup_toggle(struct urb *urb, unsigned int toggle) { - struct urb_priv *urbp = NULL; + struct urb_priv *urbp = (struct urb_priv *)urb->hcpriv; struct uhci_td *td; - unsigned int toggle = qh->initial_toggle; - unsigned int pipe; - - /* Fixups for a short transfer start with the second URB in the - * queue (the short URB is the first). */ - if (skip_first) - urbp = list_entry(qh->queue.next, struct urb_priv, node); - - /* When starting with the first URB, if the QH element pointer is - * still valid then we know the URB's toggles are okay. */ - else if (qh_element(qh) != UHCI_PTR_TERM) - toggle = 2; - - /* Fix up the toggle for the URBs in the queue. Normally this - * loop won't run more than once: When an error or short transfer - * occurs, the queue usually gets emptied. */ - urbp = list_prepare_entry(urbp, &qh->queue, node); - list_for_each_entry_continue(urbp, &qh->queue, node) { - - /* If the first TD has the right toggle value, we don't - * need to change any toggles in this URB */ - td = list_entry(urbp->td_list.next, struct uhci_td, list); - if (toggle > 1 || uhci_toggle(td_token(td)) == toggle) { - td = list_entry(urbp->td_list.prev, struct uhci_td, - list); - toggle = uhci_toggle(td_token(td)) ^ 1; - - /* Otherwise all the toggles in the URB have to be switched */ - } else { - list_for_each_entry(td, &urbp->td_list, list) { - td->token ^= __constant_cpu_to_le32( - TD_TOKEN_TOGGLE); - toggle ^= 1; - } - } + + list_for_each_entry(td, &urbp->td_list, list) { + if (toggle) + td->token |= cpu_to_le32(TD_TOKEN_TOGGLE); + else + td->token &= ~cpu_to_le32(TD_TOKEN_TOGGLE); + + toggle ^= 1; } - wmb(); - pipe = list_entry(qh->queue.next, struct urb_priv, node)->urb->pipe; - usb_settoggle(qh->udev, usb_pipeendpoint(pipe), - usb_pipeout(pipe), toggle); - qh->needs_fixup = 0; + return toggle; } -/* - * Put a QH on the schedule in both hardware and software - */ -static void uhci_activate_qh(struct uhci_hcd *uhci, struct uhci_qh *qh) +/* This function will append one URB's QH to another URB's QH. This is for */ +/* queuing interrupt, control or bulk transfers */ +static void uhci_append_queued_urb(struct uhci_hcd *uhci, struct urb *eurb, struct urb *urb) { - struct uhci_qh *pqh; + struct urb_priv *eurbp, *urbp, *furbp, *lurbp; + struct uhci_td *lltd; - WARN_ON(list_empty(&qh->queue)); - - /* Set the element pointer if it isn't set already. - * This isn't needed for Isochronous queues, but it doesn't hurt. */ - if (qh_element(qh) == UHCI_PTR_TERM) { - struct urb_priv *urbp = list_entry(qh->queue.next, - struct urb_priv, node); - struct uhci_td *td = list_entry(urbp->td_list.next, - struct uhci_td, list); + eurbp = eurb->hcpriv; + urbp = urb->hcpriv; - qh->element = cpu_to_le32(td->dma_handle); + /* Find the first URB in the queue */ + furbp = eurbp; + if (eurbp->queued) { + list_for_each_entry(furbp, &eurbp->queue_list, queue_list) + if (!furbp->queued) + break; } - /* Treat the queue as if it has just advanced */ - qh->wait_expired = 0; - qh->advance_jiffies = jiffies; + lurbp = list_entry(furbp->queue_list.prev, struct urb_priv, queue_list); - if (qh->state == QH_STATE_ACTIVE) - return; - qh->state = QH_STATE_ACTIVE; - - /* Move the QH from its old list to the end of the appropriate - * skeleton's list */ - if (qh == uhci->next_qh) - uhci->next_qh = list_entry(qh->node.next, struct uhci_qh, - node); - list_move_tail(&qh->node, &qh->skel->node); - - /* Link it into the schedule */ - pqh = list_entry(qh->node.prev, struct uhci_qh, node); - qh->link = pqh->link; - wmb(); - pqh->link = UHCI_PTR_QH | cpu_to_le32(qh->dma_handle); + lltd = list_entry(lurbp->td_list.prev, struct uhci_td, list); + + /* Control transfers always start with toggle 0 */ + if (!usb_pipecontrol(urb->pipe)) + usb_settoggle(urb->dev, usb_pipeendpoint(urb->pipe), + usb_pipeout(urb->pipe), + uhci_fixup_toggle(urb, + uhci_toggle(td_token(lltd)) ^ 1)); + + /* All qhs in the queue need to link to the next queue */ + urbp->qh->link = eurbp->qh->link; + + wmb(); /* Make sure we flush everything */ + + lltd->link = cpu_to_le32(urbp->qh->dma_handle) | UHCI_PTR_QH; + + list_add_tail(&urbp->queue_list, &furbp->queue_list); + + urbp->queued = 1; } -/* - * Take a QH off the hardware schedule - */ -static void uhci_unlink_qh(struct uhci_hcd *uhci, struct uhci_qh *qh) +static void uhci_delete_queued_urb(struct uhci_hcd *uhci, struct urb *urb) { - struct uhci_qh *pqh; + struct urb_priv *urbp, *nurbp, *purbp, *turbp; + struct uhci_td *pltd; + unsigned int toggle; + + urbp = urb->hcpriv; - if (qh->state == QH_STATE_UNLINKING) + if (list_empty(&urbp->queue_list)) return; - WARN_ON(qh->state != QH_STATE_ACTIVE || !qh->udev); - qh->state = QH_STATE_UNLINKING; - /* Unlink the QH from the schedule and record when we did it */ - pqh = list_entry(qh->node.prev, struct uhci_qh, node); - pqh->link = qh->link; - mb(); + nurbp = list_entry(urbp->queue_list.next, struct urb_priv, queue_list); - uhci_get_current_frame_number(uhci); - qh->unlink_frame = uhci->frame_number; + /* + * Fix up the toggle for the following URBs in the queue. + * Only needed for bulk and interrupt: control and isochronous + * endpoints don't propagate toggles between messages. + */ + if (usb_pipebulk(urb->pipe) || usb_pipeint(urb->pipe)) { + if (!urbp->queued) + /* We just set the toggle in uhci_unlink_generic */ + toggle = usb_gettoggle(urb->dev, + usb_pipeendpoint(urb->pipe), + usb_pipeout(urb->pipe)); + else { + /* If we're in the middle of the queue, grab the */ + /* toggle from the TD previous to us */ + purbp = list_entry(urbp->queue_list.prev, + struct urb_priv, queue_list); + pltd = list_entry(purbp->td_list.prev, + struct uhci_td, list); + toggle = uhci_toggle(td_token(pltd)) ^ 1; + } - /* Force an interrupt so we know when the QH is fully unlinked */ - if (list_empty(&uhci->skel_unlink_qh->node)) - uhci_set_next_interrupt(uhci); + list_for_each_entry(turbp, &urbp->queue_list, queue_list) { + if (!turbp->queued) + break; + toggle = uhci_fixup_toggle(turbp->urb, toggle); + } - /* Move the QH from its old list to the end of the unlinking list */ - if (qh == uhci->next_qh) - uhci->next_qh = list_entry(qh->node.next, struct uhci_qh, - node); - list_move_tail(&qh->node, &uhci->skel_unlink_qh->node); -} + usb_settoggle(urb->dev, usb_pipeendpoint(urb->pipe), + usb_pipeout(urb->pipe), toggle); + } -/* - * When we and the controller are through with a QH, it becomes IDLE. - * This happens when a QH has been off the schedule (on the unlinking - * list) for more than one frame, or when an error occurs while adding - * the first URB onto a new QH. - */ -static void uhci_make_qh_idle(struct uhci_hcd *uhci, struct uhci_qh *qh) -{ - WARN_ON(qh->state == QH_STATE_ACTIVE); - - if (qh == uhci->next_qh) - uhci->next_qh = list_entry(qh->node.next, struct uhci_qh, - node); - 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 (urbp->queued) { + /* We're somewhere in the middle (or end). The case where + * we're at the head is handled in uhci_remove_qh(). */ + purbp = list_entry(urbp->queue_list.prev, struct urb_priv, + queue_list); + + pltd = list_entry(purbp->td_list.prev, struct uhci_td, list); + if (nurbp->queued) + pltd->link = cpu_to_le32(nurbp->qh->dma_handle) | UHCI_PTR_QH; + else + /* The next URB happens to be the beginning, so */ + /* we're the last, end the chain */ + pltd->link = UHCI_PTR_TERM; } - /* If anyone is waiting for a QH to become idle, wake them up */ - if (uhci->num_waiting) - wake_up_all(&uhci->waitqh); + /* urbp->queue_list is handled in uhci_remove_qh() */ } -static inline struct urb_priv *uhci_alloc_urb_priv(struct uhci_hcd *uhci, - struct urb *urb) +static struct urb_priv *uhci_alloc_urb_priv(struct uhci_hcd *uhci, struct urb *urb) { struct urb_priv *urbp; @@ -504,33 +453,90 @@ static inline struct urb_priv *uhci_alloc_urb_priv(struct uhci_hcd *uhci, memset((void *)urbp, 0, sizeof(*urbp)); + urbp->fsbrtime = jiffies; urbp->urb = urb; - urb->hcpriv = urbp; - INIT_LIST_HEAD(&urbp->node); INIT_LIST_HEAD(&urbp->td_list); + INIT_LIST_HEAD(&urbp->queue_list); + INIT_LIST_HEAD(&urbp->urb_list); + + list_add_tail(&urbp->urb_list, &uhci->urb_list); + + urb->hcpriv = urbp; return urbp; } -static void uhci_free_urb_priv(struct uhci_hcd *uhci, - struct urb_priv *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_destroy_urb_priv(struct uhci_hcd *uhci, struct urb *urb) { struct uhci_td *td, *tmp; + struct urb_priv *urbp; + + urbp = (struct urb_priv *)urb->hcpriv; + if (!urbp) + return; - if (!list_empty(&urbp->node)) - dev_warn(uhci_dev(uhci), "urb %p still on QH's list!\n", - urbp->urb); + if (!list_empty(&urbp->urb_list)) + dev_warn(uhci_dev(uhci), "urb %p still on uhci->urb_list " + "or uhci->remove_list!\n", 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_urbp(td); - uhci_free_td(uhci, td); + uhci_remove_td_from_urb(td); + list_add(&td->remove_list, &uhci->td_remove_list); } - urbp->urb->hcpriv = NULL; + 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 * @@ -557,40 +563,41 @@ 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; } /* * Control transfers */ -static int uhci_submit_control(struct uhci_hcd *uhci, struct urb *urb, - struct uhci_qh *qh) +static int uhci_submit_control(struct uhci_hcd *uhci, struct urb *urb, struct urb *eurb) { + struct urb_priv *urbp = (struct urb_priv *)urb->hcpriv; struct uhci_td *td; + struct uhci_qh *qh, *skelqh; unsigned long destination, status; - int maxsze = le16_to_cpu(qh->hep->desc.wMaxPacketSize); + int maxsze = usb_maxpacket(urb->dev, urb->pipe, usb_pipeout(urb->pipe)); 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; - /* 3 errors, dummy TD remains inactive */ - status = uhci_maxerr(3); + /* 3 errors */ + status = TD_CTRL_ACTIVE | uhci_maxerr(3); if (urb->dev->speed == USB_SPEED_LOW) status |= TD_CTRL_LS; /* * Build the TD for the control request setup packet */ - td = qh->dummy_td; - uhci_add_td_to_urbp(td, urbp); + td = uhci_alloc_td(uhci); + if (!td) + return -ENOMEM; + + uhci_add_td_to_urb(urb, td); uhci_fill_td(td, status, destination | uhci_explen(8), - urb->setup_dma); - plink = &td->link; - status |= TD_CTRL_ACTIVE; + urb->setup_dma); /* * If direction is "send", change the packet ID from SETUP (0x2D) @@ -608,20 +615,21 @@ static int uhci_submit_control(struct uhci_hcd *uhci, struct urb *urb, * Build the DATA TDs */ while (len > 0) { - int pktsze = min(len, maxsze); + int pktsze = len; + + if (pktsze > maxsze) + pktsze = maxsze; td = uhci_alloc_td(uhci); if (!td) - goto nomem; - *plink = cpu_to_le32(td->dma_handle); + return -ENOMEM; /* Alternate Data0/1 (start with Data1) */ destination ^= TD_TOKEN_TOGGLE; - uhci_add_td_to_urbp(td, urbp); + uhci_add_td_to_urb(urb, td); uhci_fill_td(td, status, destination | uhci_explen(pktsze), - data); - plink = &td->link; + data); data += pktsze; len -= pktsze; @@ -632,8 +640,7 @@ static int uhci_submit_control(struct uhci_hcd *uhci, struct urb *urb, */ td = uhci_alloc_td(uhci); if (!td) - goto nomem; - *plink = cpu_to_le32(td->dma_handle); + return -ENOMEM; /* * It's IN if the pipe is an output pipe or we're not expecting @@ -649,23 +656,18 @@ static int uhci_submit_control(struct uhci_hcd *uhci, struct urb *urb, status &= ~TD_CTRL_SPD; - uhci_add_td_to_urbp(td, urbp); + uhci_add_td_to_urb(urb, td); uhci_fill_td(td, status | TD_CTRL_IOC, - destination | uhci_explen(0), 0); - plink = &td->link; + destination | uhci_explen(0), 0); - /* - * Build the new dummy TD and activate the old one - */ - td = uhci_alloc_td(uhci); - if (!td) - goto nomem; - *plink = cpu_to_le32(td->dma_handle); + qh = uhci_alloc_qh(uhci); + if (!qh) + return -ENOMEM; - uhci_fill_td(td, 0, USB_PID_OUT | uhci_explen(0), 0); - wmb(); - qh->dummy_td->status |= __constant_cpu_to_le32(TD_CTRL_ACTIVE); - qh->dummy_td = td; + urbp->qh = qh; + qh->urbp = urbp; + + uhci_insert_tds_in_qh(qh, urb, UHCI_PTR_BREADTH); /* Low-speed transfers get a different queue, and won't hog the bus. * Also, some devices enumerate better without FSBR; the easiest way @@ -673,824 +675,816 @@ static int uhci_submit_control(struct uhci_hcd *uhci, struct urb *urb, * isn't in the CONFIGURED state. */ if (urb->dev->speed == USB_SPEED_LOW || urb->dev->state != USB_STATE_CONFIGURED) - qh->skel = uhci->skel_ls_control_qh; + skelqh = uhci->skel_ls_control_qh; else { - qh->skel = uhci->skel_fs_control_qh; - uhci_add_fsbr(uhci, urb); + skelqh = uhci->skel_fs_control_qh; + uhci_inc_fsbr(uhci, urb); } - urb->actual_length = -8; /* Account for the SETUP packet */ - return 0; + if (eurb) + uhci_append_queued_urb(uhci, eurb, urb); + else + uhci_insert_qh(uhci, skelqh, urb); -nomem: - /* Remove the dummy TD from the td_list so it doesn't get freed */ - uhci_remove_td_from_urbp(qh->dummy_td); - return -ENOMEM; + return -EINPROGRESS; } /* - * Common submit for bulk and interrupt + * 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 uhci_submit_common(struct uhci_hcd *uhci, struct urb *urb, - struct uhci_qh *qh) +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; - unsigned long destination, status; - int maxsze = le16_to_cpu(qh->hep->desc.wMaxPacketSize); - int len = urb->transfer_buffer_length; - dma_addr_t data = urb->transfer_dma; - __le32 *plink; + + urbp->short_control_packet = 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; - unsigned int toggle; + struct uhci_td *td; + unsigned int status; + int ret = 0; - if (len < 0) + if (list_empty(&urbp->td_list)) return -EINVAL; - /* The "pipe" thing contains the destination in bits 8--18 */ - destination = (urb->pipe & PIPE_DEVEP_MASK) | usb_packetid(urb->pipe); - toggle = usb_gettoggle(urb->dev, usb_pipeendpoint(urb->pipe), - usb_pipeout(urb->pipe)); + head = &urbp->td_list; - /* 3 errors, dummy TD remains inactive */ - status = uhci_maxerr(3); - if (urb->dev->speed == USB_SPEED_LOW) - status |= TD_CTRL_LS; - if (usb_pipein(urb->pipe)) - status |= TD_CTRL_SPD; + if (urbp->short_control_packet) { + tmp = head->prev; + goto status_stage; + } - /* - * Build the DATA TDs - */ - plink = NULL; - td = qh->dummy_td; - do { /* Allow zero length packets */ - int pktsze = maxsze; + tmp = head->next; + td = list_entry(tmp, struct uhci_td, list); - if (len <= pktsze) { /* The last packet */ - pktsze = len; - if (!(urb->transfer_flags & URB_SHORT_NOT_OK)) - status &= ~TD_CTRL_SPD; - } + /* 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 (plink) { - td = uhci_alloc_td(uhci); - if (!td) - goto nomem; - *plink = cpu_to_le32(td->dma_handle); - } - uhci_add_td_to_urbp(td, urbp); - uhci_fill_td(td, status, - destination | uhci_explen(pktsze) | - (toggle << TD_TOKEN_TOGGLE_SHIFT), - data); - plink = &td->link; - status |= TD_CTRL_ACTIVE; + if (status) + goto td_error; - data += pktsze; - len -= maxsze; - toggle ^= 1; - } while (len > 0); + urb->actual_length = 0; - /* - * URB_ZERO_PACKET means adding a 0-length packet, if direction - * is OUT and the transfer_length was an exact multiple of maxsze, - * hence (len = transfer_length - N * maxsze) == 0 - * however, if transfer_length == 0, the zero packet was already - * prepared above. - */ - if ((urb->transfer_flags & URB_ZERO_PACKET) && - usb_pipeout(urb->pipe) && len == 0 && - urb->transfer_buffer_length > 0) { - td = uhci_alloc_td(uhci); - if (!td) - goto nomem; - *plink = cpu_to_le32(td->dma_handle); - - uhci_add_td_to_urbp(td, urbp); - uhci_fill_td(td, status, - destination | uhci_explen(0) | - (toggle << TD_TOKEN_TOGGLE_SHIFT), - data); - plink = &td->link; + /* The rest of the TDs (but the last) are data */ + tmp = tmp->next; + while (tmp != head && tmp->next != head) { + unsigned int ctrlstat; - toggle ^= 1; - } + td = list_entry(tmp, struct uhci_td, list); + tmp = tmp->next; - /* Set the interrupt-on-completion flag on the last packet. - * A more-or-less typical 4 KB URB (= size of one memory page) - * will require about 3 ms to transfer; that's a little on the - * fast side but not enough to justify delaying an interrupt - * more than 2 or 3 URBs, so we will ignore the URB_NO_INTERRUPT - * flag setting. */ - td->status |= __constant_cpu_to_le32(TD_CTRL_IOC); + ctrlstat = td_status(td); + status = uhci_status_bits(ctrlstat); + if (status & TD_CTRL_ACTIVE) + return -EINPROGRESS; - /* - * Build the new dummy TD and activate the old one - */ - td = uhci_alloc_td(uhci); - if (!td) - goto nomem; - *plink = cpu_to_le32(td->dma_handle); + urb->actual_length += uhci_actual_length(ctrlstat); - uhci_fill_td(td, 0, USB_PID_OUT | uhci_explen(0), 0); - wmb(); - qh->dummy_td->status |= __constant_cpu_to_le32(TD_CTRL_ACTIVE); - qh->dummy_td = td; - qh->period = urb->interval; + if (status) + goto td_error; - usb_settoggle(urb->dev, usb_pipeendpoint(urb->pipe), - usb_pipeout(urb->pipe), toggle); - return 0; + /* 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; + } -nomem: - /* Remove the dummy TD from the td_list so it doesn't get freed */ - uhci_remove_td_from_urbp(qh->dummy_td); - return -ENOMEM; -} + if (uhci_packetid(td_token(td)) == USB_PID_IN) + return usb_control_retrigger_status(uhci, urb); + else + return 0; + } + } -static inline int uhci_submit_bulk(struct uhci_hcd *uhci, struct urb *urb, - struct uhci_qh *qh) -{ - int ret; +status_stage: + td = list_entry(tmp, struct uhci_td, list); - /* Can't have low-speed bulk transfers */ - if (urb->dev->speed == USB_SPEED_LOW) - return -EINVAL; + /* Control status stage */ + status = td_status(td); - qh->skel = uhci->skel_bulk_qh; - ret = uhci_submit_common(uhci, urb, qh); - if (ret == 0) - uhci_add_fsbr(uhci, urb); - return ret; -} +#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 -static int uhci_submit_interrupt(struct uhci_hcd *uhci, struct urb *urb, - struct uhci_qh *qh) -{ - int exponent; + status = uhci_status_bits(status); + if (status & TD_CTRL_ACTIVE) + return -EINPROGRESS; - /* 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. - */ + if (status) + goto td_error; - /* 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; + 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); - 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 */ + lprintk(errbuf); + } + } - return uhci_submit_common(uhci, urb, qh); + return ret; } /* - * Fix up the data structures following a short transfer + * Common submit for bulk and interrupt */ -static int uhci_fixup_short_transfer(struct uhci_hcd *uhci, - struct uhci_qh *qh, struct urb_priv *urbp) +static int uhci_submit_common(struct uhci_hcd *uhci, struct urb *urb, struct urb *eurb, struct uhci_qh *skelqh) { struct uhci_td *td; - struct list_head *tmp; - int ret; + struct uhci_qh *qh; + unsigned long destination, status; + int maxsze = usb_maxpacket(urb->dev, urb->pipe, usb_pipeout(urb->pipe)); + int len = urb->transfer_buffer_length; + struct urb_priv *urbp = (struct urb_priv *)urb->hcpriv; + dma_addr_t data = urb->transfer_dma; - td = list_entry(urbp->td_list.prev, struct uhci_td, list); - if (qh->type == USB_ENDPOINT_XFER_CONTROL) { + if (len < 0) + return -EINVAL; - /* 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; + /* The "pipe" thing contains the destination in bits 8--18 */ + destination = (urb->pipe & PIPE_DEVEP_MASK) | usb_packetid(urb->pipe); - } else { + status = uhci_maxerr(3) | TD_CTRL_ACTIVE; + if (urb->dev->speed == USB_SPEED_LOW) + status |= TD_CTRL_LS; + if (usb_pipein(urb->pipe)) + status |= TD_CTRL_SPD; - /* 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); + /* + * Build the DATA TDs + */ + do { /* Allow zero length packets */ + int pktsze = maxsze; - if (list_empty(&urbp->td_list)) - td = qh->post_td; - qh->element = td->link; - tmp = urbp->td_list.prev; - ret = 0; - } + if (pktsze >= len) { + pktsze = len; + if (!(urb->transfer_flags & URB_SHORT_NOT_OK)) + status &= ~TD_CTRL_SPD; + } - /* 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; + td = uhci_alloc_td(uhci); + if (!td) + return -ENOMEM; - uhci_remove_td_from_urbp(td); - uhci_free_td(uhci, td); + uhci_add_td_to_urb(urb, td); + uhci_fill_td(td, status, destination | uhci_explen(pktsze) | + (usb_gettoggle(urb->dev, usb_pipeendpoint(urb->pipe), + usb_pipeout(urb->pipe)) << TD_TOKEN_TOGGLE_SHIFT), + data); + + data += pktsze; + len -= maxsze; + + usb_dotoggle(urb->dev, usb_pipeendpoint(urb->pipe), + usb_pipeout(urb->pipe)); + } while (len > 0); + + /* + * URB_ZERO_PACKET means adding a 0-length packet, if direction + * is OUT and the transfer_length was an exact multiple of maxsze, + * hence (len = transfer_length - N * maxsze) == 0 + * however, if transfer_length == 0, the zero packet was already + * prepared above. + */ + if (usb_pipeout(urb->pipe) && (urb->transfer_flags & URB_ZERO_PACKET) && + !len && urb->transfer_buffer_length) { + td = uhci_alloc_td(uhci); + if (!td) + return -ENOMEM; + + uhci_add_td_to_urb(urb, td); + uhci_fill_td(td, status, destination | uhci_explen(0) | + (usb_gettoggle(urb->dev, usb_pipeendpoint(urb->pipe), + usb_pipeout(urb->pipe)) << TD_TOKEN_TOGGLE_SHIFT), + data); + + usb_dotoggle(urb->dev, usb_pipeendpoint(urb->pipe), + usb_pipeout(urb->pipe)); } - return ret; + + /* Set the interrupt-on-completion flag on the last packet. + * A more-or-less typical 4 KB URB (= size of one memory page) + * will require about 3 ms to transfer; that's a little on the + * fast side but not enough to justify delaying an interrupt + * more than 2 or 3 URBs, so we will ignore the URB_NO_INTERRUPT + * flag setting. */ + td->status |= cpu_to_le32(TD_CTRL_IOC); + + qh = uhci_alloc_qh(uhci); + if (!qh) + return -ENOMEM; + + urbp->qh = qh; + qh->urbp = urbp; + + /* Always breadth first */ + uhci_insert_tds_in_qh(qh, urb, UHCI_PTR_BREADTH); + + if (eurb) + uhci_append_queued_urb(uhci, eurb, urb); + else + uhci_insert_qh(uhci, skelqh, urb); + + return -EINPROGRESS; } /* - * Common result for control, bulk, and interrupt + * Common result for bulk and interrupt */ static int uhci_result_common(struct uhci_hcd *uhci, struct urb *urb) { struct urb_priv *urbp = urb->hcpriv; - struct uhci_qh *qh = urbp->qh; - struct uhci_td *td, *tmp; - unsigned status; + struct uhci_td *td; + unsigned int status = 0; int ret = 0; - list_for_each_entry_safe(td, tmp, &urbp->td_list, list) { - unsigned int ctrlstat; - int len; + urb->actual_length = 0; + + list_for_each_entry(td, &urbp->td_list, list) { + unsigned int ctrlstat = td_status(td); - ctrlstat = td_status(td); status = uhci_status_bits(ctrlstat); if (status & TD_CTRL_ACTIVE) return -EINPROGRESS; - len = uhci_actual_length(ctrlstat); - urb->actual_length += len; - - 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); - } - } + urb->actual_length += uhci_actual_length(ctrlstat); - } else if (len < uhci_expected_length(td_token(td))) { + if (status) + goto td_error; - /* We received a short packet */ - if (urb->transfer_flags & URB_SHORT_NOT_OK) + if (uhci_actual_length(ctrlstat) < + uhci_expected_length(td_token(td))) { + if (urb->transfer_flags & URB_SHORT_NOT_OK) { ret = -EREMOTEIO; - - /* Fixup needed only if this isn't the URB's last TD */ - else if (&td->list != urbp->td_list.prev) - ret = 1; + goto err; + } else + return 0; } + } + + return 0; - uhci_remove_td_from_urbp(td); - if (qh->post_td) - uhci_free_td(uhci, qh->post_td); - qh->post_td = td; +td_error: + ret = uhci_map_status(status, uhci_packetout(td_token(td))); - if (ret != 0) - goto err; +err: + /* + * Enable this chunk of code if you want to see some more debugging. + * But be careful, it has the tendancy to starve out khubd and prevent + * disconnects from happening successfully if you have a slow debug + * log interface (like a serial console. + */ +#if 0 + 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); + } } +#endif return ret; +} -err: - if (ret < 0) { - /* In case a control transfer gets an error - * during the setup stage */ - urb->actual_length = max(urb->actual_length, 0); +static inline int uhci_submit_bulk(struct uhci_hcd *uhci, struct urb *urb, struct urb *eurb) +{ + int ret; - /* 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); + /* Can't have low-speed bulk transfers */ + if (urb->dev->speed == USB_SPEED_LOW) + return -EINVAL; + + ret = uhci_submit_common(uhci, urb, eurb, uhci->skel_bulk_qh); + if (ret == -EINPROGRESS) + uhci_inc_fsbr(uhci, urb); - } 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 urb *eurb) +{ + /* USB 1.1 interrupt transfers only involve one packet per interval; + * that's the uhci_submit_common() "breadth first" policy. Drivers + * can submit urbs of any length, but longer ones might need many + * intervals to complete. + */ + return uhci_submit_common(uhci, urb, eurb, uhci->skelqh[__interval_to_skel(urb->interval)]); +} + /* * Isochronous transfers */ -static int uhci_submit_isochronous(struct uhci_hcd *uhci, struct urb *urb, - struct uhci_qh *qh) +static int isochronous_find_limits(struct uhci_hcd *uhci, struct urb *urb, unsigned int *start, unsigned int *end) { - struct uhci_td *td = NULL; /* Since urb->number_of_packets > 0 */ - int i, frame; - unsigned long destination, status; - struct urb_priv *urbp = (struct urb_priv *) urb->hcpriv; + struct urb *last_urb = NULL; + struct urb_priv *up; + int ret = 0; - /* Values must not be too big (could overflow below) */ - if (urb->interval >= UHCI_NUMFRAMES || - urb->number_of_packets >= UHCI_NUMFRAMES) - return -EFBIG; + list_for_each_entry(up, &uhci->urb_list, urb_list) { + struct urb *u = up->urb; - /* 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; - } else { - i = urb->start_frame - uhci->last_iso_frame; - if (i <= 0 || i >= UHCI_NUMFRAMES) - return -EINVAL; + /* look for pending URBs with identical pipe handle */ + if ((urb->pipe == u->pipe) && (urb->dev == u->dev) && + (u->status == -EINPROGRESS) && (u != urb)) { + if (!last_urb) + *start = u->start_frame; + last_urb = u; } - } else if (qh->period != urb->interval) { - return -EINVAL; /* Can't change the period */ + } - } else { /* Pick up where the last URB leaves off */ - if (list_empty(&qh->queue)) { - frame = qh->iso_frame; - } else { - struct urb *lurb; + if (last_urb) { + *end = (last_urb->start_frame + last_urb->number_of_packets * + last_urb->interval) & (UHCI_NUMFRAMES-1); + ret = 0; + } else + ret = -1; /* no previous urb found */ - lurb = list_entry(qh->queue.prev, - struct urb_priv, node)->urb; - frame = lurb->start_frame + - lurb->number_of_packets * - lurb->interval; - } - if (urb->transfer_flags & URB_ISO_ASAP) - urb->start_frame = frame; - else if (urb->start_frame != frame) - return -EINVAL; - } + return ret; +} - /* 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)) +static int isochronous_find_start(struct uhci_hcd *uhci, struct urb *urb) +{ + int limits; + unsigned int start = 0, end = 0; + + if (urb->number_of_packets > 900) /* 900? Why? */ return -EFBIG; + limits = isochronous_find_limits(uhci, urb, &start, &end); + + if (urb->transfer_flags & URB_ISO_ASAP) { + if (limits) { + uhci_get_current_frame_number(uhci); + urb->start_frame = (uhci->frame_number + 10) + & (UHCI_NUMFRAMES - 1); + } else + urb->start_frame = end; + } else { + urb->start_frame &= (UHCI_NUMFRAMES - 1); + /* FIXME: Sanity check */ + } + + return 0; +} + +/* + * Isochronous transfers + */ +static int uhci_submit_isochronous(struct uhci_hcd *uhci, struct urb *urb) +{ + struct uhci_td *td; + int i, ret, frame; + int status, destination; + struct urb_priv *urbp = (struct urb_priv *) urb->hcpriv; + status = TD_CTRL_ACTIVE | TD_CTRL_IOS; destination = (urb->pipe & PIPE_DEVEP_MASK) | usb_packetid(urb->pipe); + ret = isochronous_find_start(uhci, urb); + if (ret) + return ret; + for (i = 0; i < urb->number_of_packets; i++) { td = uhci_alloc_td(uhci); if (!td) return -ENOMEM; - uhci_add_td_to_urbp(td, urbp); - uhci_fill_td(td, status, destination | - uhci_explen(urb->iso_frame_desc[i].length), - urb->transfer_dma + - urb->iso_frame_desc[i].offset); - } - - /* Set the interrupt-on-completion flag on the last packet. */ - td->status |= __constant_cpu_to_le32(TD_CTRL_IOC); + uhci_add_td_to_urb(urb, td); + uhci_fill_td(td, status, destination | uhci_explen(urb->iso_frame_desc[i].length), + urb->transfer_dma + urb->iso_frame_desc[i].offset); - qh->skel = uhci->skel_iso_qh; - qh->period = urb->interval; + if (i + 1 >= urb->number_of_packets) + td->status |= cpu_to_le32(TD_CTRL_IOC); + } - /* 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 += 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; + uhci_insert_td_frame_list(uhci, td, frame); + frame += urb->interval; } - return 0; + return -EINPROGRESS; } static int uhci_result_isochronous(struct uhci_hcd *uhci, struct urb *urb) { - struct uhci_td *td, *tmp; - struct urb_priv *urbp = urb->hcpriv; - struct uhci_qh *qh = urbp->qh; + struct uhci_td *td; + struct urb_priv *urbp = (struct urb_priv *)urb->hcpriv; + int status; + int i, ret = 0; - list_for_each_entry_safe(td, tmp, &urbp->td_list, list) { - unsigned int ctrlstat; - int status; + urb->actual_length = urb->error_count = 0; + + i = 0; + list_for_each_entry(td, &urbp->td_list, list) { int actlength; + unsigned int ctrlstat = td_status(td); - if (uhci_frame_before_eq(uhci->cur_iso_frame, qh->iso_frame)) + if (ctrlstat & TD_CTRL_ACTIVE) return -EINPROGRESS; - 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; - } + actlength = uhci_actual_length(ctrlstat); + urb->iso_frame_desc[i].actual_length = actlength; + urb->actual_length += actlength; + status = uhci_map_status(uhci_status_bits(ctrlstat), + usb_pipeout(urb->pipe)); + urb->iso_frame_desc[i].status = status; if (status) { urb->error_count++; - qh->iso_status = status; + ret = status; } - uhci_remove_td_from_urbp(td); - uhci_free_td(uhci, td); - qh->iso_frame += qh->period; - ++qh->iso_packet_desc; + i++; } - return qh->iso_status; + unlink_isochronous_tds(uhci, urb); + + return ret; +} + +static struct urb *uhci_find_urb_ep(struct uhci_hcd *uhci, struct urb *urb) +{ + struct urb_priv *up; + + /* We don't match Isoc transfers since they are special */ + if (usb_pipeisoc(urb->pipe)) + return NULL; + + list_for_each_entry(up, &uhci->urb_list, urb_list) { + struct urb *u = up->urb; + + if (u->dev == urb->dev && u->status == -EINPROGRESS) { + /* For control, ignore the direction */ + if (usb_pipecontrol(urb->pipe) && + (u->pipe & ~USB_DIR_IN) == (urb->pipe & ~USB_DIR_IN)) + return u; + else if (u->pipe == urb->pipe) + return u; + } + } + + return NULL; } static int uhci_urb_enqueue(struct usb_hcd *hcd, - struct usb_host_endpoint *hep, + struct usb_host_endpoint *ep, struct urb *urb, gfp_t mem_flags) { int ret; struct uhci_hcd *uhci = hcd_to_uhci(hcd); unsigned long flags; - struct urb_priv *urbp; - struct uhci_qh *qh; + struct urb *eurb; int bustime; spin_lock_irqsave(&uhci->lock, flags); ret = urb->status; if (ret != -EINPROGRESS) /* URB already unlinked! */ - goto done; + goto out; - ret = -ENOMEM; - urbp = uhci_alloc_urb_priv(uhci, urb); - if (!urbp) - goto done; + eurb = uhci_find_urb_ep(uhci, urb); - if (hep->hcpriv) - qh = (struct uhci_qh *) hep->hcpriv; - else { - qh = uhci_alloc_qh(uhci, urb->dev, hep); - if (!qh) - goto err_no_qh; + if (!uhci_alloc_urb_priv(uhci, urb)) { + ret = -ENOMEM; + goto out; } - urbp->qh = qh; - switch (qh->type) { - case USB_ENDPOINT_XFER_CONTROL: - ret = uhci_submit_control(uhci, urb, qh); - break; - case USB_ENDPOINT_XFER_BULK: - ret = uhci_submit_bulk(uhci, urb, qh); + switch (usb_pipetype(urb->pipe)) { + case PIPE_CONTROL: + ret = uhci_submit_control(uhci, urb, eurb); break; - case USB_ENDPOINT_XFER_INT: - if (list_empty(&qh->queue)) { + case PIPE_INTERRUPT: + if (!eurb) { bustime = usb_check_bandwidth(urb->dev, urb); if (bustime < 0) ret = bustime; else { - ret = uhci_submit_interrupt(uhci, urb, qh); - if (ret == 0) + ret = uhci_submit_interrupt(uhci, urb, eurb); + if (ret == -EINPROGRESS) usb_claim_bandwidth(urb->dev, urb, bustime, 0); } } else { /* inherit from parent */ - struct urb_priv *eurbp; - - eurbp = list_entry(qh->queue.prev, struct urb_priv, - node); - urb->bandwidth = eurbp->urb->bandwidth; - ret = uhci_submit_interrupt(uhci, urb, qh); + urb->bandwidth = eurb->bandwidth; + ret = uhci_submit_interrupt(uhci, urb, eurb); } break; - case USB_ENDPOINT_XFER_ISOC: - urb->error_count = 0; + case PIPE_BULK: + ret = uhci_submit_bulk(uhci, urb, eurb); + break; + case PIPE_ISOCHRONOUS: bustime = usb_check_bandwidth(urb->dev, urb); if (bustime < 0) { ret = bustime; break; } - ret = uhci_submit_isochronous(uhci, urb, qh); - if (ret == 0) + ret = uhci_submit_isochronous(uhci, urb); + if (ret == -EINPROGRESS) usb_claim_bandwidth(urb->dev, urb, bustime, 1); break; } - if (ret != 0) - goto err_submit_failed; - - /* Add this URB to the QH */ - urbp->qh = qh; - list_add_tail(&urbp->node, &qh->queue); - - /* 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. 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: - if (qh->state == QH_STATE_IDLE) - uhci_make_qh_idle(uhci, qh); /* Reclaim unused QH */ + if (ret != -EINPROGRESS) { + /* Submit failed, so delete it from the urb_list */ + struct urb_priv *urbp = urb->hcpriv; -err_no_qh: - uhci_free_urb_priv(uhci, urbp); + list_del_init(&urbp->urb_list); + uhci_destroy_urb_priv(uhci, urb); + } else + ret = 0; -done: +out: spin_unlock_irqrestore(&uhci->lock, flags); return ret; } -static int uhci_urb_dequeue(struct usb_hcd *hcd, struct urb *urb) +/* + * Return the result of a transfer + */ +static void uhci_transfer_result(struct uhci_hcd *uhci, struct urb *urb) { - struct uhci_hcd *uhci = hcd_to_uhci(hcd); - unsigned long flags; + int ret = -EINPROGRESS; 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; + spin_lock(&urb->lock); - /* Remove Isochronous TDs from the frame list ASAP */ - if (qh->type == USB_ENDPOINT_XFER_ISOC) { - uhci_unlink_isochronous_tds(uhci, urb); - mb(); + urbp = (struct urb_priv *)urb->hcpriv; - /* 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); + if (urb->status != -EINPROGRESS) /* URB already dequeued */ + goto out; -done: - spin_unlock_irqrestore(&uhci->lock, flags); - return 0; -} - -/* - * Finish unlinking an URB and give it back - */ -static void uhci_giveback_urb(struct uhci_hcd *uhci, struct uhci_qh *qh, - struct urb *urb, struct pt_regs *regs) -__releases(uhci->lock) -__acquires(uhci->lock) -{ - struct urb_priv *urbp = (struct urb_priv *) urb->hcpriv; - - /* 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, - * this is a perfect time for a toggle fixup. */ - list_del_init(&urbp->node); - if (list_empty(&qh->queue) && qh->needs_fixup) { - usb_settoggle(urb->dev, usb_pipeendpoint(urb->pipe), - usb_pipeout(urb->pipe), qh->initial_toggle); - qh->needs_fixup = 0; + switch (usb_pipetype(urb->pipe)) { + case PIPE_CONTROL: + ret = uhci_result_control(uhci, urb); + break; + case PIPE_BULK: + case PIPE_INTERRUPT: + ret = uhci_result_common(uhci, urb); + break; + case PIPE_ISOCHRONOUS: + ret = uhci_result_isochronous(uhci, urb); + break; } - uhci_free_urb_priv(uhci, urbp); + if (ret == -EINPROGRESS) + goto out; + urb->status = ret; - switch (qh->type) { - case USB_ENDPOINT_XFER_ISOC: + switch (usb_pipetype(urb->pipe)) { + case PIPE_CONTROL: + case PIPE_BULK: + case PIPE_ISOCHRONOUS: /* Release bandwidth for Interrupt or Isoc. transfers */ if (urb->bandwidth) usb_release_bandwidth(urb->dev, urb, 1); + uhci_unlink_generic(uhci, urb); break; - case USB_ENDPOINT_XFER_INT: + case PIPE_INTERRUPT: /* 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) + if (list_empty(&urbp->queue_list) && urb->bandwidth) usb_release_bandwidth(urb->dev, urb, 0); else /* bandwidth was passed on to queued URB, */ /* so don't let usb_unlink_urb() release it */ urb->bandwidth = 0; + uhci_unlink_generic(uhci, urb); break; + default: + dev_info(uhci_dev(uhci), "%s: unknown pipe type %d " + "for urb %p\n", + __FUNCTION__, usb_pipetype(urb->pipe), urb); } - spin_unlock(&uhci->lock); - usb_hcd_giveback_urb(uhci_to_hcd(uhci), urb, regs); - spin_lock(&uhci->lock); + /* Move it from uhci->urb_list to uhci->complete_list */ + uhci_moveto_complete(uhci, urbp); - /* If the queue is now empty, we can unlink the QH and give up its - * reserved bandwidth. */ - if (list_empty(&qh->queue)) { - uhci_unlink_qh(uhci, qh); +out: + spin_unlock(&urb->lock); +} + +static void uhci_unlink_generic(struct uhci_hcd *uhci, struct urb *urb) +{ + struct list_head *head; + struct uhci_td *td; + struct urb_priv *urbp = (struct urb_priv *)urb->hcpriv; + int prevactive = 0; + + uhci_dec_fsbr(uhci, urb); /* Safe since it checks */ - /* Bandwidth stuff not yet implemented */ - qh->period = 0; + /* + * Now we need to find out what the last successful toggle was + * so we can update the local data toggle for the next transfer + * + * There are 2 ways the last successful completed TD is found: + * + * 1) The TD is NOT active and the actual length < expected length + * 2) The TD is NOT active and it's the last TD in the chain + * + * and a third way the first uncompleted TD is found: + * + * 3) The TD is active and the previous TD is NOT active + * + * Control and Isochronous ignore the toggle, so this is safe + * for all types + * + * FIXME: The toggle fixups won't be 100% reliable until we + * change over to using a single queue for each endpoint and + * stop the queue before unlinking. + */ + head = &urbp->td_list; + list_for_each_entry(td, head, list) { + unsigned int ctrlstat = td_status(td); + + if (!(ctrlstat & TD_CTRL_ACTIVE) && + (uhci_actual_length(ctrlstat) < + uhci_expected_length(td_token(td)) || + td->list.next == head)) + usb_settoggle(urb->dev, uhci_endpoint(td_token(td)), + uhci_packetout(td_token(td)), + uhci_toggle(td_token(td)) ^ 1); + else if ((ctrlstat & TD_CTRL_ACTIVE) && !prevactive) + usb_settoggle(urb->dev, uhci_endpoint(td_token(td)), + uhci_packetout(td_token(td)), + uhci_toggle(td_token(td))); + + prevactive = ctrlstat & TD_CTRL_ACTIVE; } -} -/* - * Scan the URBs in a QH's queue - */ -#define QH_FINISHED_UNLINKING(qh) \ - (qh->state == QH_STATE_UNLINKING && \ - uhci->frame_number + uhci->is_stopped != qh->unlink_frame) + uhci_delete_queued_urb(uhci, urb); + + /* The interrupt loop will reclaim the QHs */ + uhci_remove_qh(uhci, urbp->qh); + urbp->qh = NULL; +} -static void uhci_scan_qh(struct uhci_hcd *uhci, struct uhci_qh *qh, - struct pt_regs *regs) +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 urb *urb; - int status; - while (!list_empty(&qh->queue)) { - urbp = list_entry(qh->queue.next, struct urb_priv, node); - urb = urbp->urb; + spin_lock_irqsave(&uhci->lock, flags); + urbp = urb->hcpriv; + if (!urbp) /* URB was never linked! */ + goto done; + list_del_init(&urbp->urb_list); - if (qh->type == USB_ENDPOINT_XFER_ISOC) - status = uhci_result_isochronous(uhci, urb); - else - status = uhci_result_common(uhci, urb); - if (status == -EINPROGRESS) - break; + if (usb_pipetype(urb->pipe) == PIPE_ISOCHRONOUS) + unlink_isochronous_tds(uhci, urb); + uhci_unlink_generic(uhci, urb); - spin_lock(&urb->lock); - if (urb->status == -EINPROGRESS) /* Not dequeued */ - urb->status = status; - else - 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) { - if (QH_FINISHED_UNLINKING(qh)) - qh->is_stopped = 1; - else if (!qh->is_stopped) - return; - } - - uhci_giveback_urb(uhci, qh, urb, regs); - if (status < 0 && qh->type != USB_ENDPOINT_XFER_ISOC) - break; + uhci_get_current_frame_number(uhci); + if (uhci->frame_number + uhci->is_stopped != uhci->urb_remove_age) { + uhci_remove_pending_urbps(uhci); + uhci->urb_remove_age = uhci->frame_number; } - /* If the QH is neither stopped nor finished unlinking (normal case), - * our work here is done. */ - if (QH_FINISHED_UNLINKING(qh)) - qh->is_stopped = 1; - else if (!qh->is_stopped) - return; + /* If we're the first, set the next interrupt bit */ + if (list_empty(&uhci->urb_remove_list)) + uhci_set_next_interrupt(uhci); + list_add_tail(&urbp->urb_list, &uhci->urb_remove_list); - /* Otherwise give back each of the dequeued URBs */ -restart: - list_for_each_entry(urbp, &qh->queue, node) { - urb = urbp->urb; - if (urb->status != -EINPROGRESS) { - - /* 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; - } - } - qh->is_stopped = 0; - - /* There are no more dequeued URBs. If there are still URBs on the - * queue, the QH can now be re-activated. */ - 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); +done: + spin_unlock_irqrestore(&uhci->lock, flags); + return 0; +} - td->status |= __cpu_to_le32(TD_CTRL_IOC); - } +static int uhci_fsbr_timeout(struct uhci_hcd *uhci, struct urb *urb) +{ + struct urb_priv *urbp = (struct urb_priv *)urb->hcpriv; + struct list_head *head; + struct uhci_td *td; + int count = 0; + + uhci_dec_fsbr(uhci, urb); + + urbp->fsbr_timeout = 1; + + /* + * Ideally we would want to fix qh->element as well, but it's + * read/write by the HC, so that can introduce a race. It's not + * really worth the hassle + */ - uhci_activate_qh(uhci, qh); + head = &urbp->td_list; + list_for_each_entry(td, head, list) { + /* + * Make sure we don't do the last one (since it'll have the + * TERM bit set) as well as we skip every so many TDs to + * make sure it doesn't hog the bandwidth + */ + if (td->list.next != head && (count % DEPTH_INTERVAL) == + (DEPTH_INTERVAL - 1)) + td->link |= UHCI_PTR_DEPTH; + + count++; } - /* The queue is empty. The QH can become idle if it is fully - * unlinked. */ - else if (QH_FINISHED_UNLINKING(qh)) - uhci_make_qh_idle(uhci, qh); + return 0; } -/* - * 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) +static void uhci_free_pending_qhs(struct uhci_hcd *uhci) { - struct urb_priv *urbp = NULL; - struct uhci_td *td; - int ret = 1; - unsigned status; + struct uhci_qh *qh, *tmp; - if (qh->type == USB_ENDPOINT_XFER_ISOC) - goto done; + list_for_each_entry_safe(qh, tmp, &uhci->qh_remove_list, remove_list) { + list_del_init(&qh->remove_list); - /* 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; + uhci_free_qh(uhci, qh); + } +} - } 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; +static void uhci_free_pending_tds(struct uhci_hcd *uhci) +{ + struct uhci_td *td, *tmp; + + list_for_each_entry_safe(td, tmp, &uhci->td_remove_list, remove_list) { + list_del_init(&td->remove_list); + + uhci_free_td(uhci, td); } +} - /* The queue hasn't advanced; check for timeout */ - if (qh->wait_expired) - goto done; +static void +uhci_finish_urb(struct usb_hcd *hcd, struct urb *urb, struct pt_regs *regs) +__releases(uhci->lock) +__acquires(uhci->lock) +{ + struct uhci_hcd *uhci = hcd_to_uhci(hcd); - if (time_after(jiffies, qh->advance_jiffies + QH_WAIT_TIMEOUT)) { + uhci_destroy_urb_priv(uhci, urb); - /* 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; - } + spin_unlock(&uhci->lock); + usb_hcd_giveback_urb(hcd, urb, regs); + spin_lock(&uhci->lock); +} - qh->wait_expired = 1; +static void uhci_finish_completion(struct uhci_hcd *uhci, struct pt_regs *regs) +{ + struct urb_priv *urbp, *tmp; - /* 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); + list_for_each_entry_safe(urbp, tmp, &uhci->complete_list, urb_list) { + struct urb *urb = urbp->urb; - } else { - /* Unmoving but not-yet-expired queues keep FSBR alive */ - if (urbp) - uhci_urbp_wants_fsbr(uhci, urbp); + list_del_init(&urbp->urb_list); + uhci_finish_urb(uhci_to_hcd(uhci), urb, regs); } +} -done: - return ret; +static void uhci_remove_pending_urbps(struct uhci_hcd *uhci) +{ + + /* Splice the urb_remove_list onto the end of the complete_list */ + list_splice_init(&uhci->urb_remove_list, uhci->complete_list.prev); } -/* - * Process events in the schedule, but only in one thread at a time - */ +/* Process events in the schedule, but only in one thread at a time */ static void uhci_scan_schedule(struct uhci_hcd *uhci, struct pt_regs *regs) { - int i; - struct uhci_qh *qh; + struct urb_priv *urbp, *tmp; /* Don't allow re-entrant calls */ if (uhci->scan_in_progress) { @@ -1498,45 +1492,70 @@ 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); - 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) { - uhci->next_qh = list_entry(uhci->skelqh[i]->node.next, - struct uhci_qh, node); - while ((qh = uhci->next_qh) != uhci->skelqh[i]) { - uhci->next_qh = list_entry(qh->node.next, - struct uhci_qh, node); - - 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)); - } - } - } + + if (uhci->frame_number + uhci->is_stopped != uhci->qh_remove_age) + uhci_free_pending_qhs(uhci); + if (uhci->frame_number + uhci->is_stopped != uhci->td_remove_age) + uhci_free_pending_tds(uhci); + if (uhci->frame_number + uhci->is_stopped != uhci->urb_remove_age) + uhci_remove_pending_urbps(uhci); + + /* Walk the list of pending URBs to see which ones completed + * (must be _safe because uhci_transfer_result() dequeues URBs) */ + list_for_each_entry_safe(urbp, tmp, &uhci->urb_list, urb_list) { + struct urb *urb = urbp->urb; + + /* Checks the status and does all of the magic necessary */ + uhci_transfer_result(uhci, urb); + } + uhci_finish_completion(uhci, regs); + + /* If the controller is stopped, we can finish these off right now */ + if (uhci->is_stopped) { + uhci_free_pending_qhs(uhci); + uhci_free_pending_tds(uhci); + uhci_remove_pending_urbps(uhci); } - uhci->last_iso_frame = uhci->cur_iso_frame; if (uhci->need_rescan) goto rescan; uhci->scan_in_progress = 0; - 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->skel_unlink_qh->node)) + if (list_empty(&uhci->urb_remove_list) && + list_empty(&uhci->td_remove_list) && + list_empty(&uhci->qh_remove_list)) uhci_clear_next_interrupt(uhci); else uhci_set_next_interrupt(uhci); + + /* Wake up anyone waiting for an URB to complete */ + wake_up_all(&uhci->waitqh); +} + +static void check_fsbr(struct uhci_hcd *uhci) +{ + struct urb_priv *up; + + list_for_each_entry(up, &uhci->urb_list, urb_list) { + struct urb *u = up->urb; + + spin_lock(&u->lock); + + /* Check if the FSBR timed out */ + if (up->fsbr && !up->fsbr_timeout && time_after_eq(jiffies, up->fsbrtime + IDLE_TIMEOUT)) + uhci_fsbr_timeout(uhci, u); + + spin_unlock(&u->lock); + } + + /* 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/mdc800.c b/drivers/usb/image/mdc800.c index 08daf400f..049871145 100644 --- a/drivers/usb/image/mdc800.c +++ b/drivers/usb/image/mdc800.c @@ -96,7 +96,6 @@ #include #include #include -#include #include #include @@ -170,7 +169,7 @@ struct mdc800_data int out_count; // Bytes in the buffer int open; // Camera device open ? - struct mutex io_lock; // IO -lock + struct semaphore io_lock; // IO -lock char in [8]; // Command Input Buffer int in_count; @@ -498,7 +497,7 @@ static int mdc800_usb_probe (struct usb_interface *intf, info ("Found Mustek MDC800 on USB."); - mutex_lock(&mdc800->io_lock); + down (&mdc800->io_lock); retval = usb_register_dev(intf, &mdc800_class); if (retval) { @@ -543,7 +542,7 @@ static int mdc800_usb_probe (struct usb_interface *intf, mdc800->state=READY; - mutex_unlock(&mdc800->io_lock); + up (&mdc800->io_lock); usb_set_intfdata(intf, mdc800); return 0; @@ -621,7 +620,7 @@ static int mdc800_device_open (struct inode* inode, struct file *file) int retval=0; int errn=0; - mutex_lock(&mdc800->io_lock); + down (&mdc800->io_lock); if (mdc800->state == NOT_CONNECTED) { @@ -657,7 +656,7 @@ static int mdc800_device_open (struct inode* inode, struct file *file) dbg ("Mustek MDC800 device opened."); error_out: - mutex_unlock(&mdc800->io_lock); + up (&mdc800->io_lock); return errn; } @@ -670,7 +669,7 @@ static int mdc800_device_release (struct inode* inode, struct file *file) int retval=0; dbg ("Mustek MDC800 device closed."); - mutex_lock(&mdc800->io_lock); + down (&mdc800->io_lock); if (mdc800->open && (mdc800->state != NOT_CONNECTED)) { usb_kill_urb(mdc800->irq_urb); @@ -683,7 +682,7 @@ static int mdc800_device_release (struct inode* inode, struct file *file) retval=-EIO; } - mutex_unlock(&mdc800->io_lock); + up(&mdc800->io_lock); return retval; } @@ -696,21 +695,21 @@ static ssize_t mdc800_device_read (struct file *file, char __user *buf, size_t l size_t left=len, sts=len; /* single transfer size */ char __user *ptr = buf; - mutex_lock(&mdc800->io_lock); + down (&mdc800->io_lock); if (mdc800->state == NOT_CONNECTED) { - mutex_unlock(&mdc800->io_lock); + up (&mdc800->io_lock); return -EBUSY; } if (mdc800->state == WORKING) { warn ("Illegal State \"working\" reached during read ?!"); - mutex_unlock(&mdc800->io_lock); + up (&mdc800->io_lock); return -EBUSY; } if (!mdc800->open) { - mutex_unlock(&mdc800->io_lock); + up (&mdc800->io_lock); return -EBUSY; } @@ -718,7 +717,7 @@ static ssize_t mdc800_device_read (struct file *file, char __user *buf, size_t l { if (signal_pending (current)) { - mutex_unlock(&mdc800->io_lock); + up (&mdc800->io_lock); return -EINTR; } @@ -737,7 +736,7 @@ static ssize_t mdc800_device_read (struct file *file, char __user *buf, size_t l if (usb_submit_urb (mdc800->download_urb, GFP_KERNEL)) { err ("Can't submit download urb (status=%i)",mdc800->download_urb->status); - mutex_unlock(&mdc800->io_lock); + up (&mdc800->io_lock); return len-left; } wait_event_timeout(mdc800->download_wait, mdc800->downloaded, @@ -746,14 +745,14 @@ static ssize_t mdc800_device_read (struct file *file, char __user *buf, size_t l if (mdc800->download_urb->status != 0) { err ("request download-bytes fails (status=%i)",mdc800->download_urb->status); - mutex_unlock(&mdc800->io_lock); + up (&mdc800->io_lock); return len-left; } } else { /* No more bytes -> that's an error*/ - mutex_unlock(&mdc800->io_lock); + up (&mdc800->io_lock); return -EIO; } } @@ -762,7 +761,7 @@ static ssize_t mdc800_device_read (struct file *file, char __user *buf, size_t l /* Copy Bytes */ if (copy_to_user(ptr, &mdc800->out [mdc800->out_ptr], sts)) { - mutex_unlock(&mdc800->io_lock); + up(&mdc800->io_lock); return -EFAULT; } ptr+=sts; @@ -771,7 +770,7 @@ static ssize_t mdc800_device_read (struct file *file, char __user *buf, size_t l } } - mutex_unlock(&mdc800->io_lock); + up (&mdc800->io_lock); return len-left; } @@ -786,15 +785,15 @@ static ssize_t mdc800_device_write (struct file *file, const char __user *buf, s { size_t i=0; - mutex_lock(&mdc800->io_lock); + down (&mdc800->io_lock); if (mdc800->state != READY) { - mutex_unlock(&mdc800->io_lock); + up (&mdc800->io_lock); return -EBUSY; } if (!mdc800->open ) { - mutex_unlock(&mdc800->io_lock); + up (&mdc800->io_lock); return -EBUSY; } @@ -803,13 +802,13 @@ static ssize_t mdc800_device_write (struct file *file, const char __user *buf, s unsigned char c; if (signal_pending (current)) { - mutex_unlock(&mdc800->io_lock); + up (&mdc800->io_lock); return -EINTR; } if(get_user(c, buf+i)) { - mutex_unlock(&mdc800->io_lock); + up(&mdc800->io_lock); return -EFAULT; } @@ -830,7 +829,7 @@ static ssize_t mdc800_device_write (struct file *file, const char __user *buf, s } else { - mutex_unlock(&mdc800->io_lock); + up (&mdc800->io_lock); return -EIO; } @@ -842,7 +841,7 @@ static ssize_t mdc800_device_write (struct file *file, const char __user *buf, s if (mdc800_usb_waitForIRQ (0,TO_GET_READY)) { err ("Camera didn't get ready.\n"); - mutex_unlock(&mdc800->io_lock); + up (&mdc800->io_lock); return -EIO; } @@ -854,7 +853,7 @@ static ssize_t mdc800_device_write (struct file *file, const char __user *buf, s if (usb_submit_urb (mdc800->write_urb, GFP_KERNEL)) { err ("submitting write urb fails (status=%i)", mdc800->write_urb->status); - mutex_unlock(&mdc800->io_lock); + up (&mdc800->io_lock); return -EIO; } wait_event_timeout(mdc800->write_wait, mdc800->written, TO_WRITE_GET_READY*HZ/1000); @@ -862,7 +861,7 @@ static ssize_t mdc800_device_write (struct file *file, const char __user *buf, s if (mdc800->state == WORKING) { usb_kill_urb(mdc800->write_urb); - mutex_unlock(&mdc800->io_lock); + up (&mdc800->io_lock); return -EIO; } @@ -874,7 +873,7 @@ static ssize_t mdc800_device_write (struct file *file, const char __user *buf, s { err ("call 0x07 before 0x05,0x3e"); mdc800->state=READY; - mutex_unlock(&mdc800->io_lock); + up (&mdc800->io_lock); return -EIO; } mdc800->pic_len=-1; @@ -893,7 +892,7 @@ static ssize_t mdc800_device_write (struct file *file, const char __user *buf, s if (mdc800_usb_waitForIRQ (1,TO_READ_FROM_IRQ)) { err ("requesting answer from irq fails"); - mutex_unlock(&mdc800->io_lock); + up (&mdc800->io_lock); return -EIO; } @@ -921,7 +920,7 @@ static ssize_t mdc800_device_write (struct file *file, const char __user *buf, s if (mdc800_usb_waitForIRQ (0,TO_DEFAULT_COMMAND)) { err ("Command Timeout."); - mutex_unlock(&mdc800->io_lock); + up (&mdc800->io_lock); return -EIO; } } @@ -931,7 +930,7 @@ static ssize_t mdc800_device_write (struct file *file, const char __user *buf, s } i++; } - mutex_unlock(&mdc800->io_lock); + up (&mdc800->io_lock); return i; } @@ -979,13 +978,15 @@ static int __init usb_mdc800_init (void) { int retval = -ENODEV; /* Allocate Memory */ - mdc800=kzalloc (sizeof (struct mdc800_data), GFP_KERNEL); + mdc800=kmalloc (sizeof (struct mdc800_data), GFP_KERNEL); if (!mdc800) goto cleanup_on_fail; + memset(mdc800, 0, sizeof(struct mdc800_data)); mdc800->dev = NULL; + mdc800->open=0; mdc800->state=NOT_CONNECTED; - mutex_init (&mdc800->io_lock); + init_MUTEX (&mdc800->io_lock); init_waitqueue_head (&mdc800->irq_wait); init_waitqueue_head (&mdc800->write_wait); diff --git a/drivers/usb/image/microtek.c b/drivers/usb/image/microtek.c index b2bafc37c..28538db9e 100644 --- a/drivers/usb/image/microtek.c +++ b/drivers/usb/image/microtek.c @@ -360,7 +360,7 @@ static int mts_scsi_host_reset (Scsi_Cmnd *srb) rc = usb_lock_device_for_reset(desc->usb_dev, desc->usb_intf); if (rc < 0) return FAILED; - result = usb_reset_device(desc->usb_dev); + result = usb_reset_device(desc->usb_dev);; if (rc) usb_unlock_device(desc->usb_dev); return result ? FAILED : SUCCESS; @@ -513,7 +513,7 @@ static void mts_do_sg (struct urb* transfer, struct pt_regs *regs) mts_transfer_cleanup(transfer); } - sg = context->srb->request_buffer; + sg = context->srb->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->request_bufflen ){ + if ( !srb->bufflen ){ desc->context.data = NULL; desc->context.data_length = 0; return; } else { - desc->context.data = srb->request_buffer; - desc->context.data_length = srb->request_bufflen; + desc->context.data = srb->buffer; + desc->context.data_length = srb->bufflen; MTS_DEBUG("length = %d or %d\n", srb->request_bufflen, srb->bufflen); } } else { MTS_DEBUG("Using scatter/gather\n"); - sg = srb->request_buffer; + sg = srb->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/Kconfig b/drivers/usb/input/Kconfig index 650103bc9..5246b3530 100644 --- a/drivers/usb/input/Kconfig +++ b/drivers/usb/input/Kconfig @@ -200,41 +200,45 @@ config USB_POWERMATE To compile this driver as a module, choose M here: the module will be called powermate. -config USB_TOUCHSCREEN - tristate "USB Touchscreen Driver" +config USB_MTOUCH + tristate "MicroTouch USB Touchscreen Driver" depends on USB && INPUT ---help--- - USB Touchscreen driver for: - - eGalax Touchkit USB - - PanJit TouchSet USB - - 3M MicroTouch USB - - ITM + Say Y here if you want to use a MicroTouch (Now 3M) USB + Touchscreen controller. - Have a look at for - a usage description and the required user-space stuff. + See for additional information. To compile this driver as a module, choose M here: the - module will be called usbtouchscreen. + module will be called mtouchusb. -config USB_TOUCHSCREEN_EGALAX - default y - bool "eGalax device support" if EMBEDDED - depends on USB_TOUCHSCREEN +config USB_ITMTOUCH + tristate "ITM Touch USB Touchscreen Driver" + depends on USB && INPUT + ---help--- + Say Y here if you want to use a ITM Touch USB + Touchscreen controller. -config USB_TOUCHSCREEN_PANJIT - default y - bool "PanJit device support" if EMBEDDED - depends on USB_TOUCHSCREEN + This touchscreen is used in LG 1510SF monitors. -config USB_TOUCHSCREEN_3M - default y - bool "3M/Microtouch device support" if EMBEDDED - depends on USB_TOUCHSCREEN + To compile this driver as a module, choose M here: the + module will be called itmtouch. -config USB_TOUCHSCREEN_ITM - default y - bool "ITM device support" if EMBEDDED - depends on USB_TOUCHSCREEN +config USB_EGALAX + tristate "eGalax TouchKit USB Touchscreen Driver" + depends on USB && INPUT + ---help--- + Say Y here if you want to use a eGalax TouchKit USB + Touchscreen controller. + + The driver has been tested on a Xenarc 700TSV monitor + with eGalax touchscreen. + + Have a look at for + a usage description and the required user-space stuff. + + To compile this driver as a module, choose M here: the + module will be called touchkitusb. config USB_YEALINK tristate "Yealink usb-p1k voip phone" diff --git a/drivers/usb/input/Makefile b/drivers/usb/input/Makefile index 764114529..d512d9f48 100644 --- a/drivers/usb/input/Makefile +++ b/drivers/usb/input/Makefile @@ -37,7 +37,6 @@ obj-$(CONFIG_USB_MOUSE) += usbmouse.o obj-$(CONFIG_USB_MTOUCH) += mtouchusb.o obj-$(CONFIG_USB_ITMTOUCH) += itmtouch.o obj-$(CONFIG_USB_EGALAX) += touchkitusb.o -obj-$(CONFIG_USB_TOUCHSCREEN) += usbtouchscreen.o obj-$(CONFIG_USB_POWERMATE) += powermate.o obj-$(CONFIG_USB_WACOM) += wacom.o obj-$(CONFIG_USB_ACECAD) += acecad.o diff --git a/drivers/usb/input/acecad.c b/drivers/usb/input/acecad.c index 18c10e150..df29b8078 100644 --- a/drivers/usb/input/acecad.c +++ b/drivers/usb/input/acecad.c @@ -27,9 +27,11 @@ #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 b138dae2b..a6693b0d1 100644 --- a/drivers/usb/input/aiptek.c +++ b/drivers/usb/input/aiptek.c @@ -73,9 +73,11 @@ #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 044faa07e..c222ed13d 100644 --- a/drivers/usb/input/appletouch.c +++ b/drivers/usb/input/appletouch.c @@ -1,5 +1,5 @@ /* - * Apple USB Touchpad (for post-February 2005 PowerBooks and MacBooks) driver + * Apple USB Touchpad (for post-February 2005 PowerBooks) driver * * Copyright (C) 2001-2004 Greg Kroah-Hartman (greg@kroah.com) * Copyright (C) 2005 Johannes Berg (johannes@sipsolutions.net) @@ -7,7 +7,6 @@ * 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. * @@ -27,12 +26,15 @@ * */ +#include #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 @@ -42,11 +44,6 @@ #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 | \ USB_DEVICE_ID_MATCH_INT_CLASS | \ @@ -68,10 +65,6 @@ static struct usb_device_id atp_table [] = { { 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 */ { } }; @@ -108,13 +101,6 @@ 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]; @@ -161,22 +147,13 @@ 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); + int16_t 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) { @@ -242,33 +219,12 @@ static void atp_complete(struct urb* urb, struct pt_regs* regs) /* drop incomplete datasets */ 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); + dprintk("appletouch: incomplete data package.\n"); goto exit; } /* reorder the sensors values */ - 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)) { + if (atp_is_geyser_2(dev)) { memset(dev->xy_cur, 0, sizeof(dev->xy_cur)); /* @@ -311,9 +267,6 @@ static void atp_complete(struct urb* urb, struct pt_regs* regs) 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; @@ -461,50 +414,7 @@ static int atp_probe(struct usb_interface *iface, const struct usb_device_id *id 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->datalen = (atp_is_geyser_2(dev)?64:81); dev->urb = usb_alloc_urb(0, GFP_KERNEL); if (!dev->urb) { @@ -537,15 +447,7 @@ static int atp_probe(struct usb_interface *iface, const struct usb_device_id *id 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)) { + if (atp_is_geyser_2(dev)) { /* * Oct 2005 15" PowerBooks have 15 X sensors, 17" are detected * later. @@ -597,9 +499,9 @@ static void atp_disconnect(struct usb_interface *iface) if (dev) { usb_kill_urb(dev->urb); input_unregister_device(dev->input); + usb_free_urb(dev->urb); 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"); diff --git a/drivers/usb/input/ati_remote.c b/drivers/usb/input/ati_remote.c index 3719fcb04..cea6d4bfa 100644 --- a/drivers/usb/input/ati_remote.c +++ b/drivers/usb/input/ati_remote.c @@ -85,13 +85,16 @@ * */ +#include #include #include #include #include #include #include -#include +#include +#include +#include #include #include @@ -111,28 +114,14 @@ #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, 0644); +module_param(channel_mask, ulong, 0444); MODULE_PARM_DESC(channel_mask, "Bitmask of remote control channels to ignore"); static int debug; -module_param(debug, int, 0644); +module_param(debug, int, 0444); 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) @@ -157,6 +146,21 @@ 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) + +static DECLARE_MUTEX(disconnect_sem); + struct ati_remote { struct input_dev *idev; struct usb_device *udev; @@ -413,43 +417,6 @@ 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 */ @@ -503,9 +470,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 + msecs_to_jiffies(repeat_filter))) { + if ((ati_remote->old_data[0] == data[1]) && + (ati_remote->old_data[1] == data[2]) && + time_before(jiffies, ati_remote->old_jiffies + FILTER_TIME)) { ati_remote->repeat_count++; } else { ati_remote->repeat_count = 0; @@ -515,61 +482,75 @@ 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); - } 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. - */ - 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); + return; + } - ati_remote->old_jiffies = jiffies; - ati_remote->old_data[0] = data[1]; - ati_remote->old_data[1] = data[2]; + /* + * 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); + + ati_remote->old_jiffies = jiffies; + ati_remote->old_data[0] = data[1]; + ati_remote->old_data[1] = data[2]; } /* @@ -645,7 +626,7 @@ static void ati_remote_free_buffers(struct ati_remote *ati_remote) if (ati_remote->outbuf) usb_buffer_free(ati_remote->udev, DATA_BUFSIZE, - ati_remote->inbuf, ati_remote->outbuf_dma); + ati_remote->outbuf, ati_remote->outbuf_dma); } static void ati_remote_input_init(struct ati_remote *ati_remote) diff --git a/drivers/usb/input/ati_remote2.c b/drivers/usb/input/ati_remote2.c index ea71de81c..ab1a1ae24 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 ed3d2da0c..b44d398de 100644 --- a/drivers/usb/input/fixp-arith.h +++ b/drivers/usb/input/fixp-arith.h @@ -2,6 +2,8 @@ #define _FIXP_ARITH_H /* + * $$ + * * Simplistic fixed-point arithmetics. * Hmm, I'm probably duplicating some code :( * @@ -29,20 +31,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 19aaf5681..1db813d3c 100644 --- a/drivers/usb/input/hid-core.c +++ b/drivers/usb/input/hid-core.c @@ -66,8 +66,9 @@ static struct hid_report *hid_register_report(struct hid_device *device, unsigne if (report_enum->report_id_hash[id]) return report_enum->report_id_hash[id]; - if (!(report = kzalloc(sizeof(struct hid_report), GFP_KERNEL))) + if (!(report = kmalloc(sizeof(struct hid_report), GFP_KERNEL))) return NULL; + memset(report, 0, sizeof(struct hid_report)); if (id != 0) report_enum->numbered = 1; @@ -96,9 +97,12 @@ static struct hid_field *hid_register_field(struct hid_report *report, unsigned return NULL; } - if (!(field = kzalloc(sizeof(struct hid_field) + usages * sizeof(struct hid_usage) + if (!(field = kmalloc(sizeof(struct hid_field) + usages * sizeof(struct hid_usage) + values * sizeof(unsigned), GFP_KERNEL))) return NULL; + memset(field, 0, sizeof(struct hid_field) + usages * sizeof(struct hid_usage) + + values * sizeof(unsigned)); + field->index = report->maxfield++; report->field[field->index] = field; field->usage = (struct hid_usage *)(field + 1); @@ -647,14 +651,17 @@ static struct hid_device *hid_parse_report(__u8 *start, unsigned size) hid_parser_reserved }; - if (!(device = kzalloc(sizeof(struct hid_device), GFP_KERNEL))) + if (!(device = kmalloc(sizeof(struct hid_device), GFP_KERNEL))) return NULL; + memset(device, 0, sizeof(struct hid_device)); - if (!(device->collection = kzalloc(sizeof(struct hid_collection) * + if (!(device->collection = kmalloc(sizeof(struct hid_collection) * HID_DEFAULT_NUM_COLLECTIONS, GFP_KERNEL))) { kfree(device); return NULL; } + memset(device->collection, 0, sizeof(struct hid_collection) * + HID_DEFAULT_NUM_COLLECTIONS); device->collection_size = HID_DEFAULT_NUM_COLLECTIONS; for (i = 0; i < HID_REPORT_TYPES; i++) @@ -668,12 +675,13 @@ static struct hid_device *hid_parse_report(__u8 *start, unsigned size) memcpy(device->rdesc, start, size); device->rsize = size; - if (!(parser = kzalloc(sizeof(struct hid_parser), GFP_KERNEL))) { + if (!(parser = kmalloc(sizeof(struct hid_parser), GFP_KERNEL))) { kfree(device->rdesc); kfree(device->collection); kfree(device); return NULL; } + memset(parser, 0, sizeof(struct hid_parser)); parser->device = device; end = start + size; @@ -902,106 +910,6 @@ static int hid_input_report(int type, struct urb *urb, int interrupt, struct pt_ return 0; } -/* - * Input submission and I/O error handler. - */ - -static void hid_io_error(struct hid_device *hid); - -/* Start up the input URB */ -static int hid_start_in(struct hid_device *hid) -{ - unsigned long flags; - int rc = 0; - - spin_lock_irqsave(&hid->inlock, flags); - if (hid->open > 0 && !test_bit(HID_SUSPENDED, &hid->iofl) && - !test_and_set_bit(HID_IN_RUNNING, &hid->iofl)) { - rc = usb_submit_urb(hid->urbin, GFP_ATOMIC); - if (rc != 0) - clear_bit(HID_IN_RUNNING, &hid->iofl); - } - spin_unlock_irqrestore(&hid->inlock, flags); - return rc; -} - -/* I/O retry timer routine */ -static void hid_retry_timeout(unsigned long _hid) -{ - struct hid_device *hid = (struct hid_device *) _hid; - - dev_dbg(&hid->intf->dev, "retrying intr urb\n"); - if (hid_start_in(hid)) - hid_io_error(hid); -} - -/* Workqueue routine to reset the device */ -static void hid_reset(void *_hid) -{ - struct hid_device *hid = (struct hid_device *) _hid; - int rc_lock, rc; - - 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_composite_device(hid->dev, hid->intf); - if (rc_lock) - usb_unlock_device(hid->dev); - } - clear_bit(HID_RESET_PENDING, &hid->iofl); - - switch (rc) { - case 0: - if (!test_bit(HID_IN_RUNNING, &hid->iofl)) - hid_io_error(hid); - 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 */ -static void hid_io_error(struct hid_device *hid) -{ - unsigned long flags; - - spin_lock_irqsave(&hid->inlock, flags); - - /* Stop when disconnected */ - if (usb_get_intfdata(hid->intf) == NULL) - goto done; - - /* When an error occurs, retry at increasing intervals */ - if (hid->retry_delay == 0) { - hid->retry_delay = 13; /* Then 26, 52, 104, 104, ... */ - hid->stop_retry = jiffies + msecs_to_jiffies(1000); - } else if (hid->retry_delay < 100) - hid->retry_delay *= 2; - - if (time_after(jiffies, hid->stop_retry)) { - - /* Retries failed, so do a port reset */ - if (!test_and_set_bit(HID_RESET_PENDING, &hid->iofl)) { - if (schedule_work(&hid->reset_work)) - goto done; - clear_bit(HID_RESET_PENDING, &hid->iofl); - } - } - - mod_timer(&hid->io_retry, - jiffies + msecs_to_jiffies(hid->retry_delay)); -done: - spin_unlock_irqrestore(&hid->inlock, flags); -} - /* * Input interrupt completion handler. */ @@ -1013,35 +921,25 @@ static void hid_irq_in(struct urb *urb, struct pt_regs *regs) switch (urb->status) { case 0: /* success */ - hid->retry_delay = 0; hid_input_report(HID_INPUT_REPORT, urb, 1, regs); break; case -ECONNRESET: /* unlink */ case -ENOENT: + case -EPERM: case -ESHUTDOWN: /* unplug */ - clear_bit(HID_IN_RUNNING, &hid->iofl); + case -EILSEQ: /* unplug timeout on uhci */ return; - case -EILSEQ: /* protocol error or unplug */ - case -EPROTO: /* protocol error or unplug */ case -ETIMEDOUT: /* NAK */ - clear_bit(HID_IN_RUNNING, &hid->iofl); - hid_io_error(hid); - return; + break; default: /* error */ warn("input irq status %d received", urb->status); } status = usb_submit_urb(urb, SLAB_ATOMIC); - if (status) { - clear_bit(HID_IN_RUNNING, &hid->iofl); - if (status != -EPERM) { - err("can't resubmit intr, %s-%s/input%d, status %d", - hid->dev->bus->bus_name, - hid->dev->devpath, - hid->ifnum, status); - hid_io_error(hid); - } - } + if (status) + err("can't resubmit intr, %s-%s/input%d, status %d", + hid->dev->bus->bus_name, hid->dev->devpath, + hid->ifnum, status); } /* @@ -1203,9 +1101,8 @@ static void hid_irq_out(struct urb *urb, struct pt_regs *regs) case 0: /* success */ break; case -ESHUTDOWN: /* unplug */ + case -EILSEQ: /* unplug timeout on uhci */ unplug = 1; - case -EILSEQ: /* protocol error or unplug */ - case -EPROTO: /* protocol error or unplug */ case -ECONNRESET: /* unlink */ case -ENOENT: break; @@ -1222,7 +1119,7 @@ static void hid_irq_out(struct urb *urb, struct pt_regs *regs) if (hid->outhead != hid->outtail) { if (hid_submit_out(hid)) { - clear_bit(HID_OUT_RUNNING, &hid->iofl); + clear_bit(HID_OUT_RUNNING, &hid->iofl);; wake_up(&hid->wait); } spin_unlock_irqrestore(&hid->outlock, flags); @@ -1252,9 +1149,8 @@ static void hid_ctrl(struct urb *urb, struct pt_regs *regs) hid_input_report(hid->ctrl[hid->ctrltail].report->type, urb, 0, regs); break; case -ESHUTDOWN: /* unplug */ + case -EILSEQ: /* unplug timectrl on uhci */ unplug = 1; - case -EILSEQ: /* protocol error or unplug */ - case -EPROTO: /* protocol error or unplug */ case -ECONNRESET: /* unlink */ case -ENOENT: case -EPIPE: /* report not available */ @@ -1367,9 +1263,14 @@ static int hid_get_class_descriptor(struct usb_device *dev, int ifnum, int hid_open(struct hid_device *hid) { - ++hid->open; - if (hid_start_in(hid)) - hid_io_error(hid); + if (hid->open++) + return 0; + + hid->urbin->dev = hid->dev; + + if (usb_submit_urb(hid->urbin, GFP_KERNEL)) + return -EIO; + return 0; } @@ -1379,8 +1280,6 @@ void hid_close(struct hid_device *hid) usb_kill_urb(hid->urbin); } -#define USB_VENDOR_ID_PANJIT 0x134c - /* * Initialize all reports */ @@ -1411,54 +1310,17 @@ 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 @@ -1502,6 +1364,9 @@ 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 @@ -1544,9 +1409,6 @@ 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 @@ -1561,6 +1423,12 @@ 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 @@ -1584,13 +1452,17 @@ 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_MIGHTYMOUSE 0x0304 +#define USB_DEVICE_ID_APPLE_POWERMOUSE 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_YEALINK 0x6993 #define USB_DEVICE_ID_YEALINK_P1K_P4K_B2K 0xb001 + /* * Alphabetically sorted blacklist by quirk type. */ @@ -1620,56 +1492,12 @@ static const struct hid_blacklist { { USB_VENDOR_ID_ESSENTIAL_REALITY, USB_DEVICE_ID_ESSENTIAL_REALITY_P5, HID_QUIRK_IGNORE }, { USB_VENDOR_ID_GLAB, USB_DEVICE_ID_4_PHIDGETSERVO_30, HID_QUIRK_IGNORE }, { USB_VENDOR_ID_GLAB, USB_DEVICE_ID_1_PHIDGETSERVO_30, HID_QUIRK_IGNORE }, + { USB_VENDOR_ID_YEALINK, USB_DEVICE_ID_YEALINK_P1K_P4K_B2K, HID_QUIRK_IGNORE }, { USB_VENDOR_ID_GLAB, USB_DEVICE_ID_8_8_8_IF_KIT, HID_QUIRK_IGNORE }, { USB_VENDOR_ID_GLAB, USB_DEVICE_ID_0_0_4_IF_KIT, HID_QUIRK_IGNORE }, { 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 }, @@ -1699,9 +1527,48 @@ 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 + 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_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 }, @@ -1711,10 +1578,13 @@ 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_HP, USB_DEVICE_ID_HP_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_WISEGROUP_LTD, USB_DEVICE_ID_SMARTJOY_DUAL_PLUS, HID_QUIRK_NOGET | HID_QUIRK_MULTI_INPUT }, - { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MIGHTYMOUSE, HID_QUIRK_MIGHTYMOUSE | HID_QUIRK_INVERT_HWHEEL }, + { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_POWERMOUSE, HID_QUIRK_2WHEEL_POWERMOUSE }, { 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 }, @@ -1734,19 +1604,11 @@ static const struct hid_blacklist { { USB_VENDOR_ID_APPLE, 0x020E, HID_QUIRK_POWERBOOK_HAS_FN }, { USB_VENDOR_ID_APPLE, 0x020F, HID_QUIRK_POWERBOOK_HAS_FN }, { USB_VENDOR_ID_APPLE, 0x0214, HID_QUIRK_POWERBOOK_HAS_FN }, - { USB_VENDOR_ID_APPLE, 0x0215, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_POWERBOOK_ISO_KEYBOARD}, + { 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 | HID_QUIRK_POWERBOOK_ISO_KEYBOARD}, - { 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 }, - { USB_VENDOR_ID_PANJIT, 0x0001, HID_QUIRK_IGNORE }, - { USB_VENDOR_ID_PANJIT, 0x0002, HID_QUIRK_IGNORE }, - { USB_VENDOR_ID_PANJIT, 0x0003, HID_QUIRK_IGNORE }, - { USB_VENDOR_ID_PANJIT, 0x0004, HID_QUIRK_IGNORE }, - { 0, 0 } }; @@ -1817,23 +1679,11 @@ 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; @@ -1949,10 +1799,6 @@ static struct hid_device *usb_hid_configure(struct usb_interface *intf) init_waitqueue_head(&hid->wait); - INIT_WORK(&hid->reset_work, hid_reset, hid); - setup_timer(&hid->io_retry, hid_retry_timeout, (unsigned long) hid); - - spin_lock_init(&hid->inlock); spin_lock_init(&hid->outlock); spin_lock_init(&hid->ctrllock); @@ -2021,16 +1867,11 @@ static void hid_disconnect(struct usb_interface *intf) if (!hid) return; - spin_lock_irq(&hid->inlock); /* Sync with error handler */ usb_set_intfdata(intf, NULL); - spin_unlock_irq(&hid->inlock); usb_kill_urb(hid->urbin); usb_kill_urb(hid->urbout); usb_kill_urb(hid->urbctrl); - del_timer_sync(&hid->io_retry); - flush_scheduled_work(); - if (hid->claimed & HID_CLAIMED_INPUT) hidinput_disconnect(hid); if (hid->claimed & HID_CLAIMED_HIDDEV) @@ -2105,10 +1946,6 @@ static int hid_suspend(struct usb_interface *intf, pm_message_t message) { struct hid_device *hid = usb_get_intfdata (intf); - spin_lock_irq(&hid->inlock); /* Sync with error handler */ - set_bit(HID_SUSPENDED, &hid->iofl); - spin_unlock_irq(&hid->inlock); - del_timer(&hid->io_retry); usb_kill_urb(hid->urbin); dev_dbg(&intf->dev, "suspend\n"); return 0; @@ -2119,30 +1956,14 @@ static int hid_resume(struct usb_interface *intf) struct hid_device *hid = usb_get_intfdata (intf); int status; - clear_bit(HID_SUSPENDED, &hid->iofl); - hid->retry_delay = 0; - status = hid_start_in(hid); + if (hid->open) + status = usb_submit_urb(hid->urbin, GFP_NOIO); + else + status = 0; 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 }, @@ -2157,8 +1978,6 @@ 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 f04d6d75c..702c48c2f 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] = "Hangeul", [KEY_HANJA] = "Hanja", + [KEY_HANGUEL] = "Hanguel", [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-ff.c b/drivers/usb/input/hid-ff.c index d5c91ee67..72e698658 100644 --- a/drivers/usb/input/hid-ff.c +++ b/drivers/usb/input/hid-ff.c @@ -34,6 +34,12 @@ #include "hid.h" +/* Drivers' initializing functions */ +extern int hid_lgff_init(struct hid_device* hid); +extern int hid_lg3d_init(struct hid_device* hid); +extern int hid_pid_init(struct hid_device* hid); +extern int hid_tmff_init(struct hid_device* hid); + /* * This table contains pointers to initializers. To add support for new * devices, you need to add the USB vendor and product ids here. diff --git a/drivers/usb/input/hid-input.c b/drivers/usb/input/hid-input.c index 2ae4fb9a7..cb0d80f49 100644 --- a/drivers/usb/input/hid-input.c +++ b/drivers/usb/input/hid-input.c @@ -29,7 +29,9 @@ #include #include #include -#include +#include +#include +#include #undef DEBUG @@ -123,12 +125,6 @@ static struct hidinput_key_translation powerbook_numlock_keys[] = { { } }; -static struct hidinput_key_translation powerbook_iso_keyboard[] = { - { KEY_GRAVE, KEY_102ND }, - { KEY_102ND, KEY_GRAVE }, - { } -}; - static int usbhid_pb_fnmode = 1; module_param_named(pb_fnmode, usbhid_pb_fnmode, int, 0644); MODULE_PARM_DESC(pb_fnmode, @@ -203,14 +199,6 @@ static int hidinput_pb_event(struct hid_device *hid, struct input_dev *input, } } - if (hid->quirks & HID_QUIRK_POWERBOOK_ISO_KEYBOARD) { - trans = find_translation(powerbook_iso_keyboard, usage->code); - if (trans) { - input_event(input, usage->type, trans->to, value); - return 1; - } - } - return 0; } @@ -226,9 +214,6 @@ static void hidinput_pb_setup(struct input_dev *input) for (trans = powerbook_numlock_keys; trans->from; trans++) set_bit(trans->to, input->keybit); - - for (trans = powerbook_iso_keyboard; trans->from; trans++) - set_bit(trans->to, input->keybit); } #else static inline int hidinput_pb_event(struct hid_device *hid, struct input_dev *input, @@ -525,7 +510,7 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel case 0x025: map_key_clear(KEY_TV); break; case 0x026: map_key_clear(KEY_MENU); break; case 0x031: map_key_clear(KEY_AUDIO); break; - case 0x032: map_key_clear(KEY_TEXT); break; + case 0x032: map_key_clear(KEY_SUBTITLE); break; case 0x033: map_key_clear(KEY_LAST); break; case 0x047: map_key_clear(KEY_MP3); break; case 0x048: map_key_clear(KEY_DVD); break; @@ -582,23 +567,6 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel break; } - 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)) - set_bit(REL_HWHEEL, bit); - - if (((device->quirks & HID_QUIRK_2WHEEL_MOUSE_HACK_5) && (usage->hid == 0x00090005)) - || ((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)) @@ -607,6 +575,16 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel 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_2WHEEL_MOUSE_HACK_7 | HID_QUIRK_2WHEEL_MOUSE_HACK_5)) && + (usage->type == EV_REL) && (usage->code == REL_WHEEL)) + set_bit(REL_HWHEEL, bit); + + if (((device->quirks & HID_QUIRK_2WHEEL_MOUSE_HACK_5) && (usage->hid == 0x00090005)) + || ((device->quirks & HID_QUIRK_2WHEEL_MOUSE_HACK_7) && (usage->hid == 0x00090007))) + goto ignore; if (usage->type == EV_ABS) { @@ -624,8 +602,7 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel } - if (usage->type == EV_ABS && - (usage->hat_min < usage->hat_max || usage->hat_dir)) { + if (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); @@ -670,11 +647,6 @@ 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-lgff.c b/drivers/usb/input/hid-lgff.c index f07d44357..f82c9c9e5 100644 --- a/drivers/usb/input/hid-lgff.c +++ b/drivers/usb/input/hid-lgff.c @@ -154,9 +154,10 @@ int hid_lgff_init(struct hid_device* hid) return -1; } - private = kzalloc(sizeof(struct lgff_device), GFP_KERNEL); + private = kmalloc(sizeof(struct lgff_device), GFP_KERNEL); if (!private) return -1; + memset(private, 0, sizeof(struct lgff_device)); hid->ff_private = private; /* Input init */ @@ -227,12 +228,13 @@ static struct hid_report* hid_lgff_duplicate_report(struct hid_report* report) } *ret->field[0] = *report->field[0]; - ret->field[0]->value = kzalloc(sizeof(s32[8]), GFP_KERNEL); + ret->field[0]->value = kmalloc(sizeof(s32[8]), GFP_KERNEL); if (!ret->field[0]->value) { kfree(ret->field[0]); kfree(ret); return NULL; } + memset(ret->field[0]->value, 0, sizeof(s32[8])); return ret; } diff --git a/drivers/usb/input/hid-tmff.c b/drivers/usb/input/hid-tmff.c index 534425c69..023fd5ac3 100644 --- a/drivers/usb/input/hid-tmff.c +++ b/drivers/usb/input/hid-tmff.c @@ -113,10 +113,11 @@ int hid_tmff_init(struct hid_device *hid) struct hid_input *hidinput = list_entry(hid->inputs.next, struct hid_input, list); struct input_dev *input_dev = hidinput->input; - private = kzalloc(sizeof(struct tmff_device), GFP_KERNEL); + private = kmalloc(sizeof(struct tmff_device), GFP_KERNEL); if (!private) return -ENOMEM; + memset(private, 0, sizeof(struct tmff_device)); hid->ff_private = private; /* Find the report to use */ diff --git a/drivers/usb/input/hid.h b/drivers/usb/input/hid.h index aa85d0b08..8b0d4346c 100644 --- a/drivers/usb/input/hid.h +++ b/drivers/usb/input/hid.h @@ -31,8 +31,6 @@ #include #include #include -#include -#include /* * USB HID (Human Interface Device) interface class code @@ -40,14 +38,6 @@ #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 */ @@ -255,12 +245,10 @@ 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_MIGHTYMOUSE 0x00000400 +#define HID_QUIRK_2WHEEL_POWERMOUSE 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 -#define HID_QUIRK_POWERBOOK_ISO_KEYBOARD 0x00010000 /* * This is the global environment of the parser. This information is @@ -382,9 +370,6 @@ struct hid_control_fifo { #define HID_CTRL_RUNNING 1 #define HID_OUT_RUNNING 2 -#define HID_IN_RUNNING 3 -#define HID_RESET_PENDING 4 -#define HID_SUSPENDED 5 struct hid_input { struct list_head list; @@ -408,17 +393,12 @@ struct hid_device { /* device report descriptor */ int ifnum; /* USB interface number */ unsigned long iofl; /* I/O flags (CTRL_RUNNING, OUT_RUNNING) */ - struct timer_list io_retry; /* Retry timer */ - unsigned long stop_retry; /* Time to give up, in jiffies */ - unsigned int retry_delay; /* Delay length in ms */ - struct work_struct reset_work; /* Task context for resets */ unsigned int bufsize; /* URB buffer size */ struct urb *urbin; /* Input URB */ char *inbuf; /* Input buffer */ dma_addr_t inbuf_dma; /* Input buffer dma */ - spinlock_t inlock; /* Input fifo spinlock */ struct urb *urbctrl; /* Control URB */ struct usb_ctrlrequest *cr; /* Control request struct */ @@ -543,8 +523,3 @@ static inline int hid_ff_event(struct hid_device *hid, struct input_dev *input, return hid->ff_event(hid, input, type, code, value); return -ENOSYS; } - -int hid_lgff_init(struct hid_device* hid); -int hid_tmff_init(struct hid_device* hid); -int hid_pid_init(struct hid_device* hid); - diff --git a/drivers/usb/input/hiddev.c b/drivers/usb/input/hiddev.c index f6b839c25..925f5aba0 100644 --- a/drivers/usb/input/hiddev.c +++ b/drivers/usb/input/hiddev.c @@ -25,6 +25,7 @@ * e-mail - mail your message to Paul Stewart */ +#include #include #include #include @@ -49,7 +50,7 @@ struct hiddev { int open; wait_queue_head_t wait; struct hid_device *hid; - struct list_head list; + struct hiddev_list *list; }; struct hiddev_list { @@ -59,7 +60,7 @@ struct hiddev_list { unsigned flags; struct fasync_struct *fasync; struct hiddev *hiddev; - struct list_head node; + struct hiddev_list *next; }; static struct hiddev *hiddev_table[HIDDEV_MINORS]; @@ -73,15 +74,12 @@ static struct hiddev *hiddev_table[HIDDEV_MINORS]; static struct hid_report * hiddev_lookup_report(struct hid_device *hid, struct hiddev_report_info *rinfo) { - unsigned int flags = rinfo->report_id & ~HID_REPORT_ID_MASK; - unsigned int rid = rinfo->report_id & HID_REPORT_ID_MASK; + unsigned flags = 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); @@ -91,25 +89,21 @@ hiddev_lookup_report(struct hid_device *hid, struct hiddev_report_info *rinfo) break; case HID_REPORT_ID_FIRST: - if (list_empty(&report_enum->report_list)) - return NULL; - list = report_enum->report_list.next; - report = list_entry(list, struct hid_report, list); - rinfo->report_id = report->id; + if (list == &report_enum->report_list) + return NULL; + rinfo->report_id = ((struct hid_report *) list)->id; break; case HID_REPORT_ID_NEXT: - report = report_enum->report_id_hash[rid]; - if (!report) + list = (struct list_head *) + report_enum->report_id_hash[rinfo->report_id & HID_REPORT_ID_MASK]; + if (list == NULL) return NULL; - - list = report->list.next; + list = list->next; if (list == &report_enum->report_list) return NULL; - - report = list_entry(list, struct hid_report, list); - rinfo->report_id = report->id; + rinfo->report_id = ((struct hid_report *) list)->id; break; default: @@ -132,13 +126,12 @@ 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++) { @@ -150,7 +143,6 @@ hiddev_lookup_usage(struct hid_device *hid, struct hiddev_usage_ref *uref) } } } - } return NULL; } @@ -159,9 +151,9 @@ static void hiddev_send_event(struct hid_device *hid, struct hiddev_usage_ref *uref) { struct hiddev *hiddev = hid->hiddev; - struct hiddev_list *list; + struct hiddev_list *list = hiddev->list; - list_for_each_entry(list, &hiddev->list, node) { + while (list) { if (uref->field_index != HID_FIELD_INDEX_NONE || (list->flags & HIDDEV_FLAG_REPORT) != 0) { list->buffer[list->head] = *uref; @@ -169,6 +161,8 @@ 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); @@ -187,7 +181,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); @@ -207,7 +201,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; @@ -220,9 +214,7 @@ 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; } @@ -233,9 +225,14 @@ 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); - list_del(&list->node); + + while (*listptr && (*listptr != list)) + listptr = &((*listptr)->next); + *listptr = (*listptr)->next; if (!--list->hiddev->open) { if (list->hiddev->exist) @@ -252,8 +249,7 @@ 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,11 +257,14 @@ static int hiddev_open(struct inode *inode, struct file *file) if (i >= HIDDEV_MINORS || !hiddev_table[i]) return -ENODEV; - if (!(list = kzalloc(sizeof(struct hiddev_list), GFP_KERNEL))) + if (!(list = kmalloc(sizeof(struct hiddev_list), GFP_KERNEL))) return -ENOMEM; + memset(list, 0, sizeof(struct hiddev_list)); list->hiddev = hiddev_table[i]; - list_add_tail(&list->node, &hiddev_table[i]->list); + list->next = hiddev_table[i]->list; + hiddev_table[i]->list = list; + file->private_data = list; if (!list->hiddev->open++) @@ -319,7 +318,6 @@ static ssize_t hiddev_read(struct file * file, char __user * buffer, size_t coun } schedule(); - set_current_state(TASK_INTERRUPTIBLE); } set_current_state(TASK_RUNNING); @@ -365,7 +363,6 @@ 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; @@ -386,7 +383,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; @@ -757,8 +754,9 @@ int hiddev_connect(struct hid_device *hid) if (i == hid->maxcollection && (hid->quirks & HID_QUIRK_HIDDEV) == 0) return -1; - if (!(hiddev = kzalloc(sizeof(struct hiddev), GFP_KERNEL))) + if (!(hiddev = kmalloc(sizeof(struct hiddev), GFP_KERNEL))) return -1; + memset(hiddev, 0, sizeof(struct hiddev)); retval = usb_register_dev(hid->intf, &hiddev_class); if (retval) { @@ -768,15 +766,15 @@ int hiddev_connect(struct hid_device *hid) } init_waitqueue_head(&hiddev->wait); - INIT_LIST_HEAD(&hiddev->list); + + hiddev_table[hid->intf->minor - HIDDEV_MINOR_BASE] = hiddev; + 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 86acb5f19..7618ae5c1 100644 --- a/drivers/usb/input/itmtouch.c +++ b/drivers/usb/input/itmtouch.c @@ -39,11 +39,14 @@ * *****************************************************************************/ +#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 604ade356..f6d5cead5 100644 --- a/drivers/usb/input/kbtab.c +++ b/drivers/usb/input/kbtab.c @@ -1,9 +1,12 @@ #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 4723b310f..b4a051b54 100644 --- a/drivers/usb/input/keyspan_remote.c +++ b/drivers/usb/input/keyspan_remote.c @@ -11,13 +11,16 @@ * 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 " @@ -294,8 +297,6 @@ static void keyspan_check_data(struct usb_keyspan *remote, struct pt_regs *regs) remote->data.bits_left -= 6; } else { err("%s - Error in message, invalid toggle.\n", __FUNCTION__); - remote->stage = 0; - return; } keyspan_load_tester(remote, 5); diff --git a/drivers/usb/input/mtouchusb.c b/drivers/usb/input/mtouchusb.c index a9ccda881..f018953a5 100644 --- a/drivers/usb/input/mtouchusb.c +++ b/drivers/usb/input/mtouchusb.c @@ -39,11 +39,14 @@ * *****************************************************************************/ +#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 299ec95b8..d9d9f656b 100644 --- a/drivers/usb/input/pid.c +++ b/drivers/usb/input/pid.c @@ -24,6 +24,7 @@ * 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 b3c0d0c3e..fdf0f7880 100644 --- a/drivers/usb/input/powermate.c +++ b/drivers/usb/input/powermate.c @@ -30,10 +30,12 @@ #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 0149043ff..697c5e573 100644 --- a/drivers/usb/input/touchkitusb.c +++ b/drivers/usb/input/touchkitusb.c @@ -24,11 +24,14 @@ //#define DEBUG +#include #include #include +#include #include #include -#include +#include +#include #define TOUCHKIT_MIN_XC 0x0 #define TOUCHKIT_MAX_XC 0x07ff diff --git a/drivers/usb/input/usbkbd.c b/drivers/usb/input/usbkbd.c index 5067a6ae6..2f3edc26c 100644 --- a/drivers/usb/input/usbkbd.c +++ b/drivers/usb/input/usbkbd.c @@ -29,8 +29,10 @@ #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 446935b67..af526135d 100644 --- a/drivers/usb/input/usbmouse.c +++ b/drivers/usb/input/usbmouse.c @@ -28,9 +28,11 @@ #include #include +#include #include #include -#include +#include +#include /* * Version Information diff --git a/drivers/usb/input/wacom.c b/drivers/usb/input/wacom.c index 369461a70..d3e15df9e 100644 --- a/drivers/usb/input/wacom.c +++ b/drivers/usb/input/wacom.c @@ -9,7 +9,7 @@ * Copyright (c) 2000 Daniel Egger * Copyright (c) 2001 Frederic Lepied * Copyright (c) 2004 Panagiotis Issaris - * Copyright (c) 2002-2006 Ping Cheng + * Copyright (c) 2002-2005 Ping Cheng * * ChangeLog: * v0.1 (vp) - Initial release @@ -56,8 +56,6 @@ * - Merged wacom_intuos3_irq into wacom_intuos_irq * v1.44 (pc) - Added support for Graphire4, Cintiq 710, Intuos3 6x11, etc. * - Report Device IDs - * v1.45 (pc) - Added support for DTF 521, Intuos3 12x12 and 12x19 - * - Minor data report fix */ /* @@ -69,15 +67,18 @@ #include #include +#include #include #include -#include +#include +#include #include +#include /* * Version Information */ -#define DRIVER_VERSION "v1.45" +#define DRIVER_VERSION "v1.44" #define DRIVER_AUTHOR "Vojtech Pavlik " #define DRIVER_DESC "USB Wacom Graphire and Wacom Intuos tablet driver" #define DRIVER_LICENSE "GPL" @@ -98,8 +99,6 @@ enum { PL, INTUOS, INTUOS3, - INTUOS312, - INTUOS319, CINTIQ, MAX_TYPE }; @@ -128,19 +127,7 @@ struct wacom { char phys[32]; }; -#define USB_REQ_GET_REPORT 0x01 #define USB_REQ_SET_REPORT 0x09 - -static int usb_get_report(struct usb_interface *intf, unsigned char type, - unsigned char id, void *buf, int size) -{ - return usb_control_msg(interface_to_usbdev(intf), - usb_rcvctrlpipe(interface_to_usbdev(intf), 0), - USB_REQ_GET_REPORT, USB_TYPE_CLASS | USB_RECIP_INTERFACE, - (type << 8) + id, intf->altsetting[0].desc.bInterfaceNumber, - buf, size, 100); -} - static int usb_set_report(struct usb_interface *intf, unsigned char type, unsigned char id, void *buf, int size) { @@ -219,8 +206,7 @@ static void wacom_pl_irq(struct urb *urb, struct pt_regs *regs) wacom->tool[1] = BTN_TOOL_PEN; id = STYLUS_DEVICE_ID; } - input_report_key(dev, wacom->tool[1], prox); /* report in proximity for tool */ - input_report_abs(dev, ABS_MISC, id); /* report tool id */ + input_report_key(dev, wacom->tool[1], id); /* report in proximity for tool */ input_report_abs(dev, ABS_X, data[3] | (data[2] << 7) | ((data[1] & 0x03) << 14)); input_report_abs(dev, ABS_Y, data[6] | (data[5] << 7) | ((data[4] & 0x03) << 14)); input_report_abs(dev, ABS_PRESSURE, pressure); @@ -253,7 +239,7 @@ static void wacom_ptu_irq(struct urb *urb, struct pt_regs *regs) struct wacom *wacom = urb->context; unsigned char *data = wacom->data; struct input_dev *dev = wacom->dev; - int retval, id; + int retval; switch (urb->status) { case 0: @@ -277,15 +263,12 @@ static void wacom_ptu_irq(struct urb *urb, struct pt_regs *regs) input_regs(dev, regs); if (data[1] & 0x04) { - input_report_key(dev, BTN_TOOL_RUBBER, data[1] & 0x20); + input_report_key(dev, BTN_TOOL_RUBBER, (data[1] & 0x20) ? ERASER_DEVICE_ID : 0); input_report_key(dev, BTN_TOUCH, data[1] & 0x08); - id = ERASER_DEVICE_ID; } else { - input_report_key(dev, BTN_TOOL_PEN, data[1] & 0x20); + input_report_key(dev, BTN_TOOL_PEN, (data[1] & 0x20) ? STYLUS_DEVICE_ID : 0); input_report_key(dev, BTN_TOUCH, data[1] & 0x01); - id = STYLUS_DEVICE_ID; } - input_report_abs(dev, ABS_MISC, id); /* report tool id */ input_report_abs(dev, ABS_X, le16_to_cpu(*(__le16 *) &data[2])); input_report_abs(dev, ABS_Y, le16_to_cpu(*(__le16 *) &data[4])); input_report_abs(dev, ABS_PRESSURE, le16_to_cpu(*(__le16 *) &data[6])); @@ -329,8 +312,7 @@ static void wacom_penpartner_irq(struct urb *urb, struct pt_regs *regs) } input_regs(dev, regs); - input_report_key(dev, BTN_TOOL_PEN, 1); - input_report_abs(dev, ABS_MISC, STYLUS_DEVICE_ID); /* report tool id */ + input_report_key(dev, BTN_TOOL_PEN, STYLUS_DEVICE_ID); input_report_abs(dev, ABS_X, le16_to_cpu(*(__le16 *) &data[1])); input_report_abs(dev, ABS_Y, le16_to_cpu(*(__le16 *) &data[3])); input_report_abs(dev, ABS_PRESSURE, (signed char)data[6] + 127); @@ -368,8 +350,6 @@ static void wacom_graphire_irq(struct urb *urb, struct pt_regs *regs) goto exit; } - if (data[0] == 99) return; /* for Volito tablets */ - if (data[0] != 2) { dbg("wacom_graphire_irq: received unknown report #%d", data[0]); goto exit; @@ -394,10 +374,10 @@ static void wacom_graphire_irq(struct urb *urb, struct pt_regs *regs) case 2: /* Mouse with wheel */ input_report_key(dev, BTN_MIDDLE, data[1] & 0x04); if (wacom->features->type == WACOM_G4) { - rw = data[7] & 0x04 ? (data[7] & 0x03)-4 : (data[7] & 0x03); - input_report_rel(dev, REL_WHEEL, -rw); + rw = data[7] & 0x04 ? -(data[7] & 0x03) : (data[7] & 0x03); + input_report_rel(dev, REL_WHEEL, rw); } else - input_report_rel(dev, REL_WHEEL, -(signed char) data[6]); + input_report_rel(dev, REL_WHEEL, (signed char) data[6]); /* fall through */ case 3: /* Mouse without wheel */ @@ -426,27 +406,39 @@ static void wacom_graphire_irq(struct urb *urb, struct pt_regs *regs) } } - if (data[1] & 0x10) - input_report_abs(dev, ABS_MISC, id); /* report tool id */ - else - input_report_abs(dev, ABS_MISC, 0); /* reset tool id */ - input_report_key(dev, wacom->tool[0], data[1] & 0x10); + input_report_key(dev, wacom->tool[0], (data[1] & 0x10) ? id : 0); input_sync(dev); /* send pad data */ if (wacom->features->type == WACOM_G4) { - if ((wacom->serial[1] & 0xc0) != (data[7] & 0xf8)) { - wacom->id[1] = 1; - wacom->serial[1] = (data[7] & 0xf8); + /* fist time sending pad data */ + if (wacom->tool[1] != BTN_TOOL_FINGER) { + wacom->id[1] = 0; + wacom->serial[1] = (data[7] & 0x38) >> 2; + } + if (data[7] & 0xf8) { input_report_key(dev, BTN_0, (data[7] & 0x40)); input_report_key(dev, BTN_4, (data[7] & 0x80)); - rw = ((data[7] & 0x18) >> 3) - ((data[7] & 0x20) >> 3); + if (((data[7] & 0x38) >> 2) == (wacom->serial[1] & 0x0e)) + /* alter REL_WHEEL value so X apps can get it */ + wacom->serial[1] += (wacom->serial[1] & 0x01) ? -1 : 1; + else + wacom->serial[1] = (data[7] & 0x38 ) >> 2; + + /* don't alter the value when there is no wheel event */ + if (wacom->serial[1] == 1) + wacom->serial[1] = 0; + rw = wacom->serial[1]; + rw = (rw & 0x08) ? -(rw & 0x07) : (rw & 0x07); input_report_rel(dev, REL_WHEEL, rw); - input_report_key(dev, BTN_TOOL_FINGER, 0xf0); + wacom->tool[1] = BTN_TOOL_FINGER; + wacom->id[1] = data[7] & 0xf8; + input_report_key(dev, wacom->tool[1], 0xf0); input_event(dev, EV_MSC, MSC_SERIAL, 0xf0); } else if (wacom->id[1]) { wacom->id[1] = 0; - input_report_key(dev, BTN_TOOL_FINGER, 0); + wacom->serial[1] = 0; + input_report_key(dev, wacom->tool[1], 0); input_event(dev, EV_MSC, MSC_SERIAL, 0xf0); } input_sync(dev); @@ -524,31 +516,21 @@ static int wacom_intuos_inout(struct urb *urb) default: /* Unknown tool */ wacom->tool[idx] = BTN_TOOL_PEN; } - if(!((wacom->tool[idx] == BTN_TOOL_LENS) && - ((wacom->features->type == INTUOS312) - || (wacom->features->type == INTUOS319)))) { - input_report_abs(dev, ABS_MISC, wacom->id[idx]); /* report tool id */ - input_report_key(dev, wacom->tool[idx], 1); - input_event(dev, EV_MSC, MSC_SERIAL, wacom->serial[idx]); - input_sync(dev); - } + input_report_key(dev, wacom->tool[idx], wacom->id[idx]); + input_event(dev, EV_MSC, MSC_SERIAL, wacom->serial[idx]); + input_sync(dev); return 1; } /* Exit report */ if ((data[1] & 0xfe) == 0x80) { input_report_key(dev, wacom->tool[idx], 0); - input_report_abs(dev, ABS_MISC, 0); /* reset tool id */ input_event(dev, EV_MSC, MSC_SERIAL, wacom->serial[idx]); input_sync(dev); return 1; } - if((wacom->tool[idx] == BTN_TOOL_LENS) && ((wacom->features->type == INTUOS312) - || (wacom->features->type == INTUOS319))) - return 1; - else - return 0; + return 0; } static void wacom_intuos_general(struct urb *urb) @@ -618,9 +600,10 @@ static void wacom_intuos_irq(struct urb *urb, struct pt_regs *regs) /* pad packets. Works as a second tool and is always in prox */ if (data[0] == 12) { /* initiate the pad as a device */ - if (wacom->tool[1] != BTN_TOOL_FINGER) + if (wacom->tool[1] != BTN_TOOL_FINGER) { wacom->tool[1] = BTN_TOOL_FINGER; - + input_report_key(dev, wacom->tool[1], 1); + } input_report_key(dev, BTN_0, (data[5] & 0x01)); input_report_key(dev, BTN_1, (data[5] & 0x02)); input_report_key(dev, BTN_2, (data[5] & 0x04)); @@ -631,11 +614,6 @@ static void wacom_intuos_irq(struct urb *urb, struct pt_regs *regs) input_report_key(dev, BTN_7, (data[6] & 0x08)); input_report_abs(dev, ABS_RX, ((data[1] & 0x1f) << 8) | data[2]); input_report_abs(dev, ABS_RY, ((data[3] & 0x1f) << 8) | data[4]); - - if((data[5] & 0x0f) | (data[6] & 0x0f) | (data[1] & 0x1f) | data[2]) - input_report_key(dev, wacom->tool[1], 1); - else - input_report_key(dev, wacom->tool[1], 0); input_event(dev, EV_MSC, MSC_SERIAL, 0xffffffff); input_sync(dev); goto exit; @@ -698,8 +676,8 @@ static void wacom_intuos_irq(struct urb *urb, struct pt_regs *regs) input_report_key(dev, BTN_LEFT, data[8] & 0x04); input_report_key(dev, BTN_MIDDLE, data[8] & 0x08); input_report_key(dev, BTN_RIGHT, data[8] & 0x10); - input_report_rel(dev, REL_WHEEL, (data[8] & 0x01) - - ((data[8] & 0x02) >> 1)); + input_report_rel(dev, REL_WHEEL, ((data[8] & 0x02) >> 1) + - (data[8] & 0x01)); /* I3 2D mouse side buttons */ if (wacom->features->type == INTUOS3) { @@ -717,8 +695,7 @@ static void wacom_intuos_irq(struct urb *urb, struct pt_regs *regs) } } - input_report_abs(dev, ABS_MISC, wacom->id[idx]); /* report tool id */ - input_report_key(dev, wacom->tool[idx], 1); + input_report_key(dev, wacom->tool[idx], wacom->id[idx]); input_event(dev, EV_MSC, MSC_SERIAL, wacom->serial[idx]); input_sync(dev); @@ -756,8 +733,7 @@ static struct wacom_features wacom_features[] = { { "Wacom PL800", 8, 7220, 5780, 511, 32, PL, wacom_pl_irq }, { "Wacom PL700", 8, 6758, 5406, 511, 32, PL, wacom_pl_irq }, { "Wacom PL510", 8, 6282, 4762, 511, 32, PL, wacom_pl_irq }, - { "Wacom DTU710", 8, 34080, 27660, 511, 32, PL, wacom_pl_irq }, - { "Wacom DTF521", 8, 6282, 4762, 511, 32, PL, wacom_pl_irq }, + { "Wacom PL710", 8, 34080, 27660, 511, 32, PL, wacom_pl_irq }, { "Wacom DTF720", 8, 6858, 5506, 511, 32, PL, wacom_pl_irq }, { "Wacom Cintiq Partner",8, 20480, 15360, 511, 32, PL, wacom_ptu_irq }, { "Wacom Intuos2 4x5", 10, 12700, 10600, 1023, 15, INTUOS, wacom_intuos_irq }, @@ -768,8 +744,6 @@ static struct wacom_features wacom_features[] = { { "Wacom Intuos3 4x5", 10, 25400, 20320, 1023, 15, INTUOS3, wacom_intuos_irq }, { "Wacom Intuos3 6x8", 10, 40640, 30480, 1023, 15, INTUOS3, wacom_intuos_irq }, { "Wacom Intuos3 9x12", 10, 60960, 45720, 1023, 15, INTUOS3, wacom_intuos_irq }, - { "Wacom Intuos3 12x12", 10, 60960, 60960, 1023, 15, INTUOS312, wacom_intuos_irq }, - { "Wacom Intuos3 12x19", 10, 97536, 60960, 1023, 15, INTUOS319, wacom_intuos_irq }, { "Wacom Intuos3 6x11", 10, 54204, 31750, 1023, 15, INTUOS3, wacom_intuos_irq }, { "Wacom Cintiq 21UX", 10, 87200, 65600, 1023, 15, CINTIQ, wacom_intuos_irq }, { "Wacom Intuos2 6x8", 10, 20320, 16240, 1023, 15, INTUOS, wacom_intuos_irq }, @@ -805,7 +779,6 @@ static struct usb_device_id wacom_ids[] = { { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x38) }, { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x39) }, { USB_DEVICE(USB_VENDOR_ID_WACOM, 0xC0) }, - { USB_DEVICE(USB_VENDOR_ID_WACOM, 0xC3) }, { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x03) }, { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x41) }, { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x42) }, @@ -815,8 +788,6 @@ static struct usb_device_id wacom_ids[] = { { USB_DEVICE(USB_VENDOR_ID_WACOM, 0xB0) }, { USB_DEVICE(USB_VENDOR_ID_WACOM, 0xB1) }, { USB_DEVICE(USB_VENDOR_ID_WACOM, 0xB2) }, - { USB_DEVICE(USB_VENDOR_ID_WACOM, 0xB3) }, - { USB_DEVICE(USB_VENDOR_ID_WACOM, 0xB4) }, { USB_DEVICE(USB_VENDOR_ID_WACOM, 0xB5) }, { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x3F) }, { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x47) }, @@ -849,7 +820,7 @@ static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *i struct usb_endpoint_descriptor *endpoint; struct wacom *wacom; struct input_dev *input_dev; - char rep_data[2], limit = 0; + char rep_data[2] = {0x02, 0x02}; wacom = kzalloc(sizeof(struct wacom), GFP_KERNEL); input_dev = input_allocate_device(); @@ -886,7 +857,6 @@ static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *i input_set_abs_params(input_dev, ABS_X, 0, wacom->features->x_max, 4, 0); input_set_abs_params(input_dev, ABS_Y, 0, wacom->features->y_max, 4, 0); input_set_abs_params(input_dev, ABS_PRESSURE, 0, wacom->features->pressure_max, 0, 0); - input_dev->absbit[LONG(ABS_MISC)] |= BIT(ABS_MISC); switch (wacom->features->type) { case WACOM_G4: @@ -905,8 +875,6 @@ static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *i break; case INTUOS3: - case INTUOS312: - case INTUOS319: case CINTIQ: input_dev->keybit[LONG(BTN_DIGI)] |= BIT(BTN_TOOL_FINGER); input_dev->keybit[LONG(BTN_LEFT)] |= BIT(BTN_0) | BIT(BTN_1) | BIT(BTN_2) | BIT(BTN_3) | BIT(BTN_4) | BIT(BTN_5) | BIT(BTN_6) | BIT(BTN_7); @@ -948,13 +916,10 @@ static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *i input_register_device(wacom->dev); - /* Ask the tablet to report tablet data. Repeat until it succeeds */ - do { - rep_data[0] = 2; - rep_data[1] = 2; - usb_set_report(intf, 3, 2, rep_data, 2); - usb_get_report(intf, 3, 2, rep_data, 2); - } while (rep_data[1] != 2 && limit++ < 5); + /* ask the tablet to report tablet data */ + usb_set_report(intf, 3, 2, rep_data, 2); + /* repeat once (not sure why the first call often fails) */ + usb_set_report(intf, 3, 2, rep_data, 2); usb_set_intfdata(intf, wacom); return 0; diff --git a/drivers/usb/input/xpad.c b/drivers/usb/input/xpad.c index 9889b1cda..e278489a8 100644 --- a/drivers/usb/input/xpad.c +++ b/drivers/usb/input/xpad.c @@ -54,12 +54,15 @@ * 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 7b45fd3de..b1d4fd662 100644 --- a/drivers/usb/input/yealink.c +++ b/drivers/usb/input/yealink.c @@ -46,12 +46,15 @@ * 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" diff --git a/drivers/usb/media/Kconfig b/drivers/usb/media/Kconfig index 21232ee29..0d3d2cc5d 100644 --- a/drivers/usb/media/Kconfig +++ b/drivers/usb/media/Kconfig @@ -53,6 +53,21 @@ config USB_DSBR To compile this driver as a module, choose M here: the module will be called dsbr100. +config USB_ET61X251 + tristate "USB ET61X[12]51 PC Camera Controller support" + depends on USB && VIDEO_DEV + ---help--- + Say Y here if you want support for cameras based on Etoms ET61X151 + or ET61X251 PC Camera Controllers. + + See for more informations. + + This driver uses the Video For Linux API. You must say Y or M to + "Video For Linux" to use this driver. + + To compile this driver as a module, choose M here: the + module will be called et61x251. + config USB_IBMCAM tristate "USB IBM (Xirlink) C-it Camera support" depends on USB && VIDEO_DEV @@ -209,5 +224,3 @@ config USB_PWC To compile this driver as a module, choose M here: the module will be called pwc. - - diff --git a/drivers/usb/media/Makefile b/drivers/usb/media/Makefile index 2b76df700..3957aa1be 100644 --- a/drivers/usb/media/Makefile +++ b/drivers/usb/media/Makefile @@ -2,10 +2,12 @@ # Makefile for USB Media drivers # -sn9c102-objs := sn9c102_core.o sn9c102_hv7131d.o sn9c102_mi0343.o sn9c102_pas106b.o sn9c102_pas202bcb.o sn9c102_tas5110c1b.o sn9c102_tas5130d1b.o +sn9c102-objs := sn9c102_core.o sn9c102_hv7131d.o sn9c102_mi0343.o sn9c102_ov7630.o sn9c102_pas106b.o sn9c102_pas202bcb.o sn9c102_tas5110c1b.o sn9c102_tas5130d1b.o +et61x251-objs := et61x251_core.o et61x251_tas5130d1b.o obj-$(CONFIG_USB_DABUSB) += dabusb.o obj-$(CONFIG_USB_DSBR) += dsbr100.o +obj-$(CONFIG_USB_ET61X251) += et61x251.o obj-$(CONFIG_USB_IBMCAM) += ibmcam.o usbvideo.o ultracam.o obj-$(CONFIG_USB_KONICAWC) += konicawc.o usbvideo.o obj-$(CONFIG_USB_OV511) += ov511.o diff --git a/drivers/usb/media/dabusb.c b/drivers/usb/media/dabusb.c index 6ca2fae99..18d8eaf40 100644 --- a/drivers/usb/media/dabusb.c +++ b/drivers/usb/media/dabusb.c @@ -707,9 +707,8 @@ static struct file_operations dabusb_fops = }; static struct usb_class_driver dabusb_class = { - .name = "usb/dabusb%d", + .name = "dabusb%d", .fops = &dabusb_fops, - .mode = S_IFCHR | S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP, .minor_base = DABUSB_MINOR, }; @@ -813,7 +812,6 @@ static struct usb_device_id dabusb_ids [] = { MODULE_DEVICE_TABLE (usb, dabusb_ids); static struct usb_driver dabusb_driver = { - .owner = THIS_MODULE, .name = "dabusb", .probe = dabusb_probe, .disconnect = dabusb_disconnect, diff --git a/drivers/usb/media/dsbr100.c b/drivers/usb/media/dsbr100.c index 7503f5b96..25646804d 100644 --- a/drivers/usb/media/dsbr100.c +++ b/drivers/usb/media/dsbr100.c @@ -127,6 +127,7 @@ static struct file_operations usb_dsbr100_fops = { .open = usb_dsbr100_open, .release = usb_dsbr100_close, .ioctl = usb_dsbr100_ioctl, + .compat_ioctl = v4l_compat_ioctl32, .llseek = no_llseek, }; @@ -150,7 +151,6 @@ MODULE_DEVICE_TABLE (usb, usb_dsbr100_device_table); /* USB subsystem interface */ static struct usb_driver usb_dsbr100_driver = { - .owner = THIS_MODULE, .name = "dsbr100", .probe = usb_dsbr100_probe, .disconnect = usb_dsbr100_disconnect, diff --git a/drivers/usb/media/ibmcam.c b/drivers/usb/media/ibmcam.c index ba41fc7b9..a42c22294 100644 --- a/drivers/usb/media/ibmcam.c +++ b/drivers/usb/media/ibmcam.c @@ -3457,7 +3457,7 @@ static void ibmcam_model3_setup_after_video_if(struct uvd *uvd) if(init_model3_input) { if (debug > 0) info("Setting input to RCA."); - for (i=0; i < (sizeof(initData)/sizeof(initData[0])); i++) { + for (i=0; i < ARRAY_SIZE(initData); i++) { ibmcam_veio(uvd, initData[i].req, initData[i].value, initData[i].index); } } diff --git a/drivers/usb/media/konicawc.c b/drivers/usb/media/konicawc.c index 08521a2b4..e2ede5835 100644 --- a/drivers/usb/media/konicawc.c +++ b/drivers/usb/media/konicawc.c @@ -16,6 +16,7 @@ #include #include #include +#include #include "usbvideo.h" @@ -76,14 +77,14 @@ static int saturation = MAX_SATURATION/2; static int sharpness = MAX_SHARPNESS/2; static int whitebal = 3*(MAX_WHITEBAL/4); -static int spd_to_iface[] = { 1, 0, 3, 2, 4, 5, 6 }; +static const int spd_to_iface[] = { 1, 0, 3, 2, 4, 5, 6 }; /* These FPS speeds are from the windows config box. They are * indexed on size (0-2) and speed (0-6). Divide by 3 to get the * real fps. */ -static int spd_to_fps[][7] = { { 24, 40, 48, 60, 72, 80, 100 }, +static const int spd_to_fps[][7] = { { 24, 40, 48, 60, 72, 80, 100 }, { 24, 40, 48, 60, 72, 80, 100 }, { 18, 30, 36, 45, 54, 60, 75 }, { 6, 10, 12, 15, 18, 21, 25 } }; @@ -94,7 +95,7 @@ struct cam_size { u8 cmd; }; -static struct cam_size camera_sizes[] = { { 160, 120, 0x7 }, +static const struct cam_size camera_sizes[] = { { 160, 120, 0x7 }, { 160, 136, 0xa }, { 176, 144, 0x4 }, { 320, 240, 0x5 } }; @@ -118,7 +119,7 @@ struct konicawc { int yplanesz; /* Number of bytes in the Y plane */ unsigned int buttonsts:1; #ifdef CONFIG_INPUT - struct input_dev input; + struct input_dev *input; char input_physname[64]; #endif }; @@ -217,6 +218,57 @@ static void konicawc_adjust_picture(struct uvd *uvd) konicawc_camera_on(uvd); } +#ifdef CONFIG_INPUT + +static void konicawc_register_input(struct konicawc *cam, struct usb_device *dev) +{ + struct input_dev *input_dev; + + usb_make_path(dev, cam->input_physname, sizeof(cam->input_physname)); + strncat(cam->input_physname, "/input0", sizeof(cam->input_physname)); + + cam->input = input_dev = input_allocate_device(); + if (!input_dev) { + warn("Not enough memory for camera's input device\n"); + return; + } + + input_dev->name = "Konicawc snapshot button"; + input_dev->phys = cam->input_physname; + usb_to_input_id(dev, &input_dev->id); + input_dev->cdev.dev = &dev->dev; + + input_dev->evbit[0] = BIT(EV_KEY); + input_dev->keybit[LONG(BTN_0)] = BIT(BTN_0); + + input_dev->private = cam; + + input_register_device(cam->input); +} + +static void konicawc_unregister_input(struct konicawc *cam) +{ + if (cam->input) { + input_unregister_device(cam->input); + cam->input = NULL; + } +} + +static void konicawc_report_buttonstat(struct konicawc *cam) +{ + if (cam->input) { + input_report_key(cam->input, BTN_0, cam->buttonsts); + input_sync(cam->input); + } +} + +#else + +static inline void konicawc_register_input(struct konicawc *cam, struct usb_device *dev) { } +static inline void konicawc_unregister_input(struct konicawc *cam) { } +static inline void konicawc_report_buttonstat(struct konicawc *cam) { } + +#endif /* CONFIG_INPUT */ static int konicawc_compress_iso(struct uvd *uvd, struct urb *dataurb, struct urb *stsurb) { @@ -272,10 +324,7 @@ static int konicawc_compress_iso(struct uvd *uvd, struct urb *dataurb, struct ur if(button != cam->buttonsts) { DEBUG(2, "button: %sclicked", button ? "" : "un"); cam->buttonsts = button; -#ifdef CONFIG_INPUT - input_report_key(&cam->input, BTN_0, cam->buttonsts); - input_sync(&cam->input); -#endif + konicawc_report_buttonstat(cam); } if(sts == 0x01) { /* drop frame */ @@ -644,9 +693,9 @@ static int konicawc_set_video_mode(struct uvd *uvd, struct video_window *vw) RingQueue_Flush(&uvd->dp); cam->lastframe = -2; if(uvd->curframe != -1) { - uvd->frame[uvd->curframe].curline = 0; - uvd->frame[uvd->curframe].seqRead_Length = 0; - uvd->frame[uvd->curframe].seqRead_Index = 0; + uvd->frame[uvd->curframe].curline = 0; + uvd->frame[uvd->curframe].seqRead_Length = 0; + uvd->frame[uvd->curframe].seqRead_Index = 0; } konicawc_start_data(uvd); @@ -717,7 +766,6 @@ static void konicawc_configure_video(struct uvd *uvd) DEBUG(1, "setting initial values"); } - static int konicawc_probe(struct usb_interface *intf, const struct usb_device_id *devid) { struct usb_device *dev = interface_to_usbdev(intf); @@ -838,24 +886,8 @@ static int konicawc_probe(struct usb_interface *intf, const struct usb_device_id err("usbvideo_RegisterVideoDevice() failed."); uvd = NULL; } -#ifdef CONFIG_INPUT - /* Register input device for button */ - memset(&cam->input, 0, sizeof(struct input_dev)); - cam->input.name = "Konicawc snapshot button"; - cam->input.private = cam; - cam->input.evbit[0] = BIT(EV_KEY); - cam->input.keybit[LONG(BTN_0)] = BIT(BTN_0); - cam->input.id.bustype = BUS_USB; - cam->input.id.vendor = le16_to_cpu(dev->descriptor.idVendor); - cam->input.id.product = le16_to_cpu(dev->descriptor.idProduct); - cam->input.id.version = le16_to_cpu(dev->descriptor.bcdDevice); - input_register_device(&cam->input); - - usb_make_path(dev, cam->input_physname, 56); - strcat(cam->input_physname, "/input0"); - cam->input.phys = cam->input_physname; - info("konicawc: %s on %s\n", cam->input.name, cam->input.phys); -#endif + + konicawc_register_input(cam, dev); } if (uvd) { @@ -871,10 +903,9 @@ static void konicawc_free_uvd(struct uvd *uvd) int i; struct konicawc *cam = (struct konicawc *)uvd->user_data; -#ifdef CONFIG_INPUT - input_unregister_device(&cam->input); -#endif - for (i=0; i < USBVIDEO_NUMSBUF; i++) { + konicawc_unregister_input(cam); + + for (i = 0; i < USBVIDEO_NUMSBUF; i++) { usb_free_urb(cam->sts_urb[i]); cam->sts_urb[i] = NULL; } diff --git a/drivers/usb/media/ov511.c b/drivers/usb/media/ov511.c index 036c485d1..51e9cc06f 100644 --- a/drivers/usb/media/ov511.c +++ b/drivers/usb/media/ov511.c @@ -204,21 +204,9 @@ MODULE_LICENSE("GPL"); static struct usb_driver ov511_driver; -static struct ov51x_decomp_ops *ov511_decomp_ops; -static struct ov51x_decomp_ops *ov511_mmx_decomp_ops; -static struct ov51x_decomp_ops *ov518_decomp_ops; -static struct ov51x_decomp_ops *ov518_mmx_decomp_ops; - /* Number of times to retry a failed I2C transaction. Increase this if you * are getting "Failed to read sensor ID..." */ -static int i2c_detect_tries = 5; - -/* MMX support is present in kernel and CPU. Checked upon decomp module load. */ -#if defined(__i386__) || defined(__x86_64__) -#define ov51x_mmx_available (cpu_has_mmx) -#else -#define ov51x_mmx_available (0) -#endif +static const int i2c_detect_tries = 5; static struct usb_device_id device_table [] = { { USB_DEVICE(VEND_OMNIVISION, PROD_OV511) }, @@ -3012,93 +3000,18 @@ yuv420raw_to_yuv420p(struct ov511_frame *frame, * **********************************************************************/ -/* Chooses a decompression module, locks it, and sets ov->decomp_ops - * accordingly. Returns -ENXIO if decompressor is not available, otherwise - * returns 0 if no other error. - */ static int request_decompressor(struct usb_ov511 *ov) { - if (!ov) - return -ENODEV; - - if (ov->decomp_ops) { - err("ERROR: Decompressor already requested!"); - return -EINVAL; - } - - lock_kernel(); - - /* Try to get MMX, and fall back on no-MMX if necessary */ - if (ov->bclass == BCL_OV511) { - if (ov511_mmx_decomp_ops) { - PDEBUG(3, "Using OV511 MMX decompressor"); - ov->decomp_ops = ov511_mmx_decomp_ops; - } else if (ov511_decomp_ops) { - PDEBUG(3, "Using OV511 decompressor"); - ov->decomp_ops = ov511_decomp_ops; - } else { - err("No decompressor available"); - } - } else if (ov->bclass == BCL_OV518) { - if (ov518_mmx_decomp_ops) { - PDEBUG(3, "Using OV518 MMX decompressor"); - ov->decomp_ops = ov518_mmx_decomp_ops; - } else if (ov518_decomp_ops) { - PDEBUG(3, "Using OV518 decompressor"); - ov->decomp_ops = ov518_decomp_ops; - } else { - err("No decompressor available"); - } + if (ov->bclass == BCL_OV511 || ov->bclass == BCL_OV518) { + err("No decompressor available"); } else { err("Unknown bridge"); } - if (!ov->decomp_ops) - goto nosys; - - if (!ov->decomp_ops->owner) { - ov->decomp_ops = NULL; - goto nosys; - } - - if (!try_module_get(ov->decomp_ops->owner)) - goto nosys; - - unlock_kernel(); - return 0; - - nosys: - unlock_kernel(); return -ENOSYS; } -/* Unlocks decompression module and nulls ov->decomp_ops. Safe to call even - * if ov->decomp_ops is NULL. - */ -static void -release_decompressor(struct usb_ov511 *ov) -{ - int released = 0; /* Did we actually do anything? */ - - if (!ov) - return; - - lock_kernel(); - - if (ov->decomp_ops) { - module_put(ov->decomp_ops->owner); - released = 1; - } - - ov->decomp_ops = NULL; - - unlock_kernel(); - - if (released) - PDEBUG(3, "Decompressor released"); -} - static void decompress(struct usb_ov511 *ov, struct ov511_frame *frame, unsigned char *pIn0, unsigned char *pOut0) @@ -3107,31 +3020,6 @@ decompress(struct usb_ov511 *ov, struct ov511_frame *frame, if (request_decompressor(ov)) return; - PDEBUG(4, "Decompressing %d bytes", frame->bytes_recvd); - - if (frame->format == VIDEO_PALETTE_GREY - && ov->decomp_ops->decomp_400) { - int ret = ov->decomp_ops->decomp_400( - pIn0, - pOut0, - frame->compbuf, - frame->rawwidth, - frame->rawheight, - frame->bytes_recvd); - PDEBUG(4, "DEBUG: decomp_400 returned %d", ret); - } else if (frame->format != VIDEO_PALETTE_GREY - && ov->decomp_ops->decomp_420) { - int ret = ov->decomp_ops->decomp_420( - pIn0, - pOut0, - frame->compbuf, - frame->rawwidth, - frame->rawheight, - frame->bytes_recvd); - PDEBUG(4, "DEBUG: decomp_420 returned %d", ret); - } else { - err("Decompressor does not support this format"); - } } /********************************************************************** @@ -4087,8 +3975,6 @@ ov51x_v4l1_close(struct inode *inode, struct file *file) ov->user--; ov51x_stop_isoc(ov); - release_decompressor(ov); - if (ov->led_policy == LED_AUTO) ov51x_led_control(ov, 0); @@ -4774,6 +4660,7 @@ static struct file_operations ov511_fops = { .read = ov51x_v4l1_read, .mmap = ov51x_v4l1_mmap, .ioctl = ov51x_v4l1_ioctl, + .compat_ioctl = v4l_compat_ioctl32, .llseek = no_llseek, }; @@ -6008,7 +5895,6 @@ ov51x_disconnect(struct usb_interface *intf) } static struct usb_driver ov511_driver = { - .owner = THIS_MODULE, .name = "ov511", .id_table = device_table, .probe = ov51x_probe, @@ -6021,82 +5907,6 @@ static struct usb_driver ov511_driver = { * ***************************************************************************/ -/* Returns 0 for success */ -int -ov511_register_decomp_module(int ver, struct ov51x_decomp_ops *ops, int ov518, - int mmx) -{ - if (ver != DECOMP_INTERFACE_VER) { - err("Decompression module has incompatible"); - err("interface version %d", ver); - err("Interface version %d is required", DECOMP_INTERFACE_VER); - return -EINVAL; - } - - if (!ops) - return -EFAULT; - - if (mmx && !ov51x_mmx_available) { - err("MMX not available on this system or kernel"); - return -EINVAL; - } - - lock_kernel(); - - if (ov518) { - if (mmx) { - if (ov518_mmx_decomp_ops) - goto err_in_use; - else - ov518_mmx_decomp_ops = ops; - } else { - if (ov518_decomp_ops) - goto err_in_use; - else - ov518_decomp_ops = ops; - } - } else { - if (mmx) { - if (ov511_mmx_decomp_ops) - goto err_in_use; - else - ov511_mmx_decomp_ops = ops; - } else { - if (ov511_decomp_ops) - goto err_in_use; - else - ov511_decomp_ops = ops; - } - } - - unlock_kernel(); - return 0; - -err_in_use: - unlock_kernel(); - return -EBUSY; -} - -void -ov511_deregister_decomp_module(int ov518, int mmx) -{ - lock_kernel(); - - if (ov518) { - if (mmx) - ov518_mmx_decomp_ops = NULL; - else - ov518_decomp_ops = NULL; - } else { - if (mmx) - ov511_mmx_decomp_ops = NULL; - else - ov511_decomp_ops = NULL; - } - - unlock_kernel(); -} - static int __init usb_ov511_init(void) { @@ -6123,5 +5933,3 @@ usb_ov511_exit(void) module_init(usb_ov511_init); module_exit(usb_ov511_exit); -EXPORT_SYMBOL(ov511_register_decomp_module); -EXPORT_SYMBOL(ov511_deregister_decomp_module); diff --git a/drivers/usb/media/pwc/pwc-ctrl.c b/drivers/usb/media/pwc/pwc-ctrl.c index 530991909..3ebb6e9cd 100644 --- a/drivers/usb/media/pwc/pwc-ctrl.c +++ b/drivers/usb/media/pwc/pwc-ctrl.c @@ -109,7 +109,7 @@ #define PT_RESET_CONTROL_FORMATTER 0x02 #define PT_STATUS_FORMATTER 0x03 -static char *size2name[PSZ_MAX] = +static const char *size2name[PSZ_MAX] = { "subQCIF", "QSIF", @@ -1152,45 +1152,6 @@ int pwc_get_cmos_sensor(struct pwc_device *pdev, int *sensor) /* End of Add-Ons */ /* ************************************************* */ -/* Linux 2.5.something and 2.6 pass direct pointers to arguments of - ioctl() calls. With 2.4, you have to do tedious copy_from_user() - and copy_to_user() calls. With these macros we circumvent this, - and let me maintain only one source file. The functionality is - exactly the same otherwise. - */ - -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 0) - -/* define local variable for arg */ -#define ARG_DEF(ARG_type, ARG_name)\ - ARG_type *ARG_name = arg; -/* copy arg to local variable */ -#define ARG_IN(ARG_name) /* nothing */ -/* argument itself (referenced) */ -#define ARGR(ARG_name) (*ARG_name) -/* argument address */ -#define ARGA(ARG_name) ARG_name -/* copy local variable to arg */ -#define ARG_OUT(ARG_name) /* nothing */ - -#else - -#define ARG_DEF(ARG_type, ARG_name)\ - ARG_type ARG_name; -#define ARG_IN(ARG_name)\ - if (copy_from_user(&ARG_name, arg, sizeof(ARG_name))) {\ - ret = -EFAULT;\ - break;\ - } -#define ARGR(ARG_name) ARG_name -#define ARGA(ARG_name) &ARG_name -#define ARG_OUT(ARG_name)\ - if (copy_to_user(arg, &ARG_name, sizeof(ARG_name))) {\ - ret = -EFAULT;\ - break;\ - } - -#endif int pwc_ioctl(struct pwc_device *pdev, unsigned int cmd, void *arg) { @@ -1220,243 +1181,206 @@ int pwc_ioctl(struct pwc_device *pdev, unsigned int cmd, void *arg) case VIDIOCPWCSCQUAL: { - ARG_DEF(int, qual) + int *qual = arg; - ARG_IN(qual) - if (ARGR(qual) < 0 || ARGR(qual) > 3) + if (*qual < 0 || *qual > 3) ret = -EINVAL; else - ret = pwc_try_video_mode(pdev, pdev->view.x, pdev->view.y, pdev->vframes, ARGR(qual), pdev->vsnapshot); + ret = pwc_try_video_mode(pdev, pdev->view.x, pdev->view.y, pdev->vframes, *qual, pdev->vsnapshot); if (ret >= 0) - pdev->vcompression = ARGR(qual); + pdev->vcompression = *qual; break; } case VIDIOCPWCGCQUAL: { - ARG_DEF(int, qual) - - ARGR(qual) = pdev->vcompression; - ARG_OUT(qual) + int *qual = arg; + *qual = pdev->vcompression; break; } case VIDIOCPWCPROBE: { - ARG_DEF(struct pwc_probe, probe) - - strcpy(ARGR(probe).name, pdev->vdev->name); - ARGR(probe).type = pdev->type; - ARG_OUT(probe) + struct pwc_probe *probe = arg; + strcpy(probe->name, pdev->vdev->name); + probe->type = pdev->type; break; } case VIDIOCPWCGSERIAL: { - ARG_DEF(struct pwc_serial, serial) - - strcpy(ARGR(serial).serial, pdev->serial); - ARG_OUT(serial) + struct pwc_serial *serial = arg; + strcpy(serial->serial, pdev->serial); break; } case VIDIOCPWCSAGC: { - ARG_DEF(int, agc) - - ARG_IN(agc) - if (pwc_set_agc(pdev, ARGR(agc) < 0 ? 1 : 0, ARGR(agc))) + int *agc = arg; + if (pwc_set_agc(pdev, *agc < 0 ? 1 : 0, *agc)) ret = -EINVAL; break; } case VIDIOCPWCGAGC: { - ARG_DEF(int, agc) + int *agc = arg; - if (pwc_get_agc(pdev, ARGA(agc))) + if (pwc_get_agc(pdev, agc)) ret = -EINVAL; - ARG_OUT(agc) break; } case VIDIOCPWCSSHUTTER: { - ARG_DEF(int, shutter_speed) - - ARG_IN(shutter_speed) - ret = pwc_set_shutter_speed(pdev, ARGR(shutter_speed) < 0 ? 1 : 0, ARGR(shutter_speed)); + int *shutter_speed = arg; + ret = pwc_set_shutter_speed(pdev, *shutter_speed < 0 ? 1 : 0, *shutter_speed); break; } case VIDIOCPWCSAWB: { - ARG_DEF(struct pwc_whitebalance, wb) + struct pwc_whitebalance *wb = arg; - ARG_IN(wb) - ret = pwc_set_awb(pdev, ARGR(wb).mode); - if (ret >= 0 && ARGR(wb).mode == PWC_WB_MANUAL) { - pwc_set_red_gain(pdev, ARGR(wb).manual_red); - pwc_set_blue_gain(pdev, ARGR(wb).manual_blue); + ret = pwc_set_awb(pdev, wb->mode); + if (ret >= 0 && wb->mode == PWC_WB_MANUAL) { + pwc_set_red_gain(pdev, wb->manual_red); + pwc_set_blue_gain(pdev, wb->manual_blue); } break; } case VIDIOCPWCGAWB: { - ARG_DEF(struct pwc_whitebalance, wb) + struct pwc_whitebalance *wb = arg; - memset(ARGA(wb), 0, sizeof(struct pwc_whitebalance)); - ARGR(wb).mode = pwc_get_awb(pdev); - if (ARGR(wb).mode < 0) + memset(wb, 0, sizeof(struct pwc_whitebalance)); + wb->mode = pwc_get_awb(pdev); + if (wb->mode < 0) ret = -EINVAL; else { - if (ARGR(wb).mode == PWC_WB_MANUAL) { - ret = pwc_get_red_gain(pdev, &ARGR(wb).manual_red); + if (wb->mode == PWC_WB_MANUAL) { + ret = pwc_get_red_gain(pdev, &wb->manual_red); if (ret < 0) break; - ret = pwc_get_blue_gain(pdev, &ARGR(wb).manual_blue); + ret = pwc_get_blue_gain(pdev, &wb->manual_blue); if (ret < 0) break; } - if (ARGR(wb).mode == PWC_WB_AUTO) { - ret = pwc_read_red_gain(pdev, &ARGR(wb).read_red); + if (wb->mode == PWC_WB_AUTO) { + ret = pwc_read_red_gain(pdev, &wb->read_red); if (ret < 0) break; - ret =pwc_read_blue_gain(pdev, &ARGR(wb).read_blue); + ret = pwc_read_blue_gain(pdev, &wb->read_blue); if (ret < 0) break; } } - ARG_OUT(wb) break; } case VIDIOCPWCSAWBSPEED: { - ARG_DEF(struct pwc_wb_speed, wbs) + struct pwc_wb_speed *wbs = arg; - if (ARGR(wbs).control_speed > 0) { - ret = pwc_set_wb_speed(pdev, ARGR(wbs).control_speed); + if (wbs->control_speed > 0) { + ret = pwc_set_wb_speed(pdev, wbs->control_speed); } - if (ARGR(wbs).control_delay > 0) { - ret = pwc_set_wb_delay(pdev, ARGR(wbs).control_delay); + if (wbs->control_delay > 0) { + ret = pwc_set_wb_delay(pdev, wbs->control_delay); } break; } case VIDIOCPWCGAWBSPEED: { - ARG_DEF(struct pwc_wb_speed, wbs) + struct pwc_wb_speed *wbs = arg; - ret = pwc_get_wb_speed(pdev, &ARGR(wbs).control_speed); + ret = pwc_get_wb_speed(pdev, &wbs->control_speed); if (ret < 0) break; - ret = pwc_get_wb_delay(pdev, &ARGR(wbs).control_delay); + ret = pwc_get_wb_delay(pdev, &wbs->control_delay); if (ret < 0) break; - ARG_OUT(wbs) break; } case VIDIOCPWCSLED: { - ARG_DEF(struct pwc_leds, leds) - - ARG_IN(leds) - ret = pwc_set_leds(pdev, ARGR(leds).led_on, ARGR(leds).led_off); + struct pwc_leds *leds = arg; + ret = pwc_set_leds(pdev, leds->led_on, leds->led_off); break; } case VIDIOCPWCGLED: { - ARG_DEF(struct pwc_leds, leds) - - ret = pwc_get_leds(pdev, &ARGR(leds).led_on, &ARGR(leds).led_off); - ARG_OUT(leds) + struct pwc_leds *leds = arg; + ret = pwc_get_leds(pdev, &leds->led_on, &leds->led_off); break; } case VIDIOCPWCSCONTOUR: { - ARG_DEF(int, contour) - - ARG_IN(contour) - ret = pwc_set_contour(pdev, ARGR(contour)); + int *contour = arg; + ret = pwc_set_contour(pdev, *contour); break; } case VIDIOCPWCGCONTOUR: { - ARG_DEF(int, contour) - - ret = pwc_get_contour(pdev, ARGA(contour)); - ARG_OUT(contour) + int *contour = arg; + ret = pwc_get_contour(pdev, contour); break; } case VIDIOCPWCSBACKLIGHT: { - ARG_DEF(int, backlight) - - ARG_IN(backlight) - ret = pwc_set_backlight(pdev, ARGR(backlight)); + int *backlight = arg; + ret = pwc_set_backlight(pdev, *backlight); break; } case VIDIOCPWCGBACKLIGHT: { - ARG_DEF(int, backlight) - - ret = pwc_get_backlight(pdev, ARGA(backlight)); - ARG_OUT(backlight) + int *backlight = arg; + ret = pwc_get_backlight(pdev, backlight); break; } case VIDIOCPWCSFLICKER: { - ARG_DEF(int, flicker) - - ARG_IN(flicker) - ret = pwc_set_flicker(pdev, ARGR(flicker)); + int *flicker = arg; + ret = pwc_set_flicker(pdev, *flicker); break; } case VIDIOCPWCGFLICKER: { - ARG_DEF(int, flicker) - - ret = pwc_get_flicker(pdev, ARGA(flicker)); - ARG_OUT(flicker) + int *flicker = arg; + ret = pwc_get_flicker(pdev, flicker); break; } case VIDIOCPWCSDYNNOISE: { - ARG_DEF(int, dynnoise) - - ARG_IN(dynnoise) - ret = pwc_set_dynamic_noise(pdev, ARGR(dynnoise)); + int *dynnoise = arg; + ret = pwc_set_dynamic_noise(pdev, *dynnoise); break; } case VIDIOCPWCGDYNNOISE: { - ARG_DEF(int, dynnoise) - - ret = pwc_get_dynamic_noise(pdev, ARGA(dynnoise)); - ARG_OUT(dynnoise); + int *dynnoise = arg; + ret = pwc_get_dynamic_noise(pdev, dynnoise); break; } case VIDIOCPWCGREALSIZE: { - ARG_DEF(struct pwc_imagesize, size) - - ARGR(size).width = pdev->image.x; - ARGR(size).height = pdev->image.y; - ARG_OUT(size) + struct pwc_imagesize *size = arg; + size->width = pdev->image.x; + size->height = pdev->image.y; break; } @@ -1464,10 +1388,9 @@ int pwc_ioctl(struct pwc_device *pdev, unsigned int cmd, void *arg) { if (pdev->features & FEATURE_MOTOR_PANTILT) { - ARG_DEF(int, flags) + int *flags = arg; - ARG_IN(flags) - ret = pwc_mpt_reset(pdev, ARGR(flags)); + ret = pwc_mpt_reset(pdev, *flags); if (ret >= 0) { pdev->pan_angle = 0; @@ -1485,10 +1408,8 @@ int pwc_ioctl(struct pwc_device *pdev, unsigned int cmd, void *arg) { if (pdev->features & FEATURE_MOTOR_PANTILT) { - ARG_DEF(struct pwc_mpt_range, range) - - ARGR(range) = pdev->angle_range; - ARG_OUT(range) + struct pwc_mpt_range *range = arg; + *range = pdev->angle_range; } else { @@ -1503,21 +1424,19 @@ int pwc_ioctl(struct pwc_device *pdev, unsigned int cmd, void *arg) if (pdev->features & FEATURE_MOTOR_PANTILT) { - ARG_DEF(struct pwc_mpt_angles, angles) - - ARG_IN(angles) + struct pwc_mpt_angles *angles = arg; /* The camera can only set relative angles, so do some calculations when getting an absolute angle . */ - if (ARGR(angles).absolute) + if (angles->absolute) { - new_pan = ARGR(angles).pan; - new_tilt = ARGR(angles).tilt; + new_pan = angles->pan; + new_tilt = angles->tilt; } else { - new_pan = pdev->pan_angle + ARGR(angles).pan; - new_tilt = pdev->tilt_angle + ARGR(angles).tilt; + new_pan = pdev->pan_angle + angles->pan; + new_tilt = pdev->tilt_angle + angles->tilt; } /* check absolute ranges */ if (new_pan < pdev->angle_range.pan_min || @@ -1560,12 +1479,11 @@ int pwc_ioctl(struct pwc_device *pdev, unsigned int cmd, void *arg) if (pdev->features & FEATURE_MOTOR_PANTILT) { - ARG_DEF(struct pwc_mpt_angles, angles) + struct pwc_mpt_angles *angles = arg; - ARGR(angles).absolute = 1; - ARGR(angles).pan = pdev->pan_angle; - ARGR(angles).tilt = pdev->tilt_angle; - ARG_OUT(angles) + angles->absolute = 1; + angles->pan = pdev->pan_angle; + angles->tilt = pdev->tilt_angle; } else { @@ -1578,10 +1496,8 @@ int pwc_ioctl(struct pwc_device *pdev, unsigned int cmd, void *arg) { if (pdev->features & FEATURE_MOTOR_PANTILT) { - ARG_DEF(struct pwc_mpt_status, status) - - ret = pwc_mpt_get_status(pdev, ARGA(status)); - ARG_OUT(status) + struct pwc_mpt_status *status = arg; + ret = pwc_mpt_get_status(pdev, status); } else { @@ -1592,24 +1508,22 @@ int pwc_ioctl(struct pwc_device *pdev, unsigned int cmd, void *arg) case VIDIOCPWCGVIDCMD: { - ARG_DEF(struct pwc_video_command, cmd); + struct pwc_video_command *cmd = arg; - ARGR(cmd).type = pdev->type; - ARGR(cmd).release = pdev->release; - ARGR(cmd).command_len = pdev->cmd_len; - memcpy(&ARGR(cmd).command_buf, pdev->cmd_buf, pdev->cmd_len); - ARGR(cmd).bandlength = pdev->vbandlength; - ARGR(cmd).frame_size = pdev->frame_size; - ARG_OUT(cmd) + cmd->type = pdev->type; + cmd->release = pdev->release; + cmd->command_len = pdev->cmd_len; + memcpy(&cmd->command_buf, pdev->cmd_buf, pdev->cmd_len); + cmd->bandlength = pdev->vbandlength; + cmd->frame_size = pdev->frame_size; break; } /* case VIDIOCPWCGVIDTABLE: { - ARG_DEF(struct pwc_table_init_buffer, table); - ARGR(table).len = pdev->cmd_len; - memcpy(&ARGR(table).buffer, pdev->decompress_data, pdev->decompressor->table_size); - ARG_OUT(table) + struct pwc_table_init_buffer *table = arg; + table->len = pdev->cmd_len; + memcpy(&table->buffer, pdev->decompress_data, pdev->decompressor->table_size); break; } */ diff --git a/drivers/usb/media/pwc/pwc-if.c b/drivers/usb/media/pwc/pwc-if.c index b77e65c03..4f9b0dc6f 100644 --- a/drivers/usb/media/pwc/pwc-if.c +++ b/drivers/usb/media/pwc/pwc-if.c @@ -62,6 +62,7 @@ #include #include #include +#include #include #include "pwc.h" @@ -110,7 +111,6 @@ static int usb_pwc_probe(struct usb_interface *intf, const struct usb_device_id static void usb_pwc_disconnect(struct usb_interface *intf); static struct usb_driver pwc_driver = { - .owner = THIS_MODULE, .name = "Philips webcam", /* name */ .id_table = pwc_device_table, .probe = usb_pwc_probe, /* probe() */ @@ -154,6 +154,7 @@ static struct file_operations pwc_fops = { .poll = pwc_video_poll, .mmap = pwc_video_mmap, .ioctl = pwc_video_ioctl, + .compat_ioctl = v4l_compat_ioctl32, .llseek = no_llseek, }; static struct video_device pwc_template = { diff --git a/drivers/usb/media/pwc/pwc-uncompress.c b/drivers/usb/media/pwc/pwc-uncompress.c index bc3b1635e..ef4204eab 100644 --- a/drivers/usb/media/pwc/pwc-uncompress.c +++ b/drivers/usb/media/pwc/pwc-uncompress.c @@ -118,9 +118,9 @@ int pwc_decompress(struct pwc_device *pdev) return -ENXIO; /* No such device or address: missing decompressor */ } +#if 0 switch (pdev->type) { -#if 0 case 675: case 680: case 690: @@ -128,18 +128,17 @@ int pwc_decompress(struct pwc_device *pdev) case 730: case 740: case 750: - pwc_dec23_decompress(&pdev->image, &pdev->view, &pdev->offset, - yuv, image, - flags, + pwc_dec23_decompress(&pdev->image, &pdev->view, + &pdev->offset, yuv, image, flags, pdev->decompress_data, pdev->vbandlength); break; case 645: case 646: /* TODO & FIXME */ -#endif - return -ENXIO; /* No such device or address: missing decompressor */ + return -ENXIO; /* Missing decompressor */ break; } +#endif } return 0; } diff --git a/drivers/usb/media/pwc/pwc.h b/drivers/usb/media/pwc/pwc.h index 267869dab..6dd76bb3d 100644 --- a/drivers/usb/media/pwc/pwc.h +++ b/drivers/usb/media/pwc/pwc.h @@ -25,8 +25,6 @@ #ifndef PWC_H #define PWC_H -#include - #include #include #include diff --git a/drivers/usb/media/se401.c b/drivers/usb/media/se401.c index f69e443cd..2ba562285 100644 --- a/drivers/usb/media/se401.c +++ b/drivers/usb/media/se401.c @@ -1193,6 +1193,7 @@ static struct file_operations se401_fops = { .read = se401_read, .mmap = se401_mmap, .ioctl = se401_ioctl, + .compat_ioctl = v4l_compat_ioctl32, .llseek = no_llseek, }; static struct video_device se401_template = { @@ -1401,7 +1402,6 @@ static void se401_disconnect(struct usb_interface *intf) } static struct usb_driver se401_driver = { - .owner = THIS_MODULE, .name = "se401", .id_table = device_table, .probe = se401_probe, diff --git a/drivers/usb/media/sn9c102.h b/drivers/usb/media/sn9c102.h index 8b8a4c874..17d60c1ee 100644 --- a/drivers/usb/media/sn9c102.h +++ b/drivers/usb/media/sn9c102.h @@ -1,7 +1,7 @@ /*************************************************************************** * V4L2 driver for SN9C10x PC Camera Controllers * * * - * Copyright (C) 2004-2005 by Luca Risolia * + * Copyright (C) 2004-2006 by Luca Risolia * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * @@ -23,7 +23,8 @@ #include #include -#include +#include +#include #include #include #include @@ -52,13 +53,6 @@ /*****************************************************************************/ -#define SN9C102_MODULE_NAME "V4L2 driver for SN9C10x PC Camera Controllers" -#define SN9C102_MODULE_AUTHOR "(C) 2004-2005 Luca Risolia" -#define SN9C102_AUTHOR_EMAIL "" -#define SN9C102_MODULE_LICENSE "GPL" -#define SN9C102_MODULE_VERSION "1:1.24" -#define SN9C102_MODULE_VERSION_CODE KERNEL_VERSION(1, 0, 24) - enum sn9c102_bridge { BRIDGE_SN9C101 = 0x01, BRIDGE_SN9C102 = 0x02, @@ -102,12 +96,13 @@ enum sn9c102_stream_state { STREAM_ON, }; +typedef char sn9c103_sof_header_t[18]; typedef char sn9c102_sof_header_t[12]; typedef char sn9c102_eof_header_t[4]; struct sn9c102_sysfs_attr { u8 reg, i2c_reg; - sn9c102_sof_header_t frame_header; + sn9c103_sof_header_t frame_header; }; struct sn9c102_module_param { @@ -118,8 +113,6 @@ static DECLARE_MUTEX(sn9c102_sysfs_lock); static DECLARE_RWSEM(sn9c102_disconnect); struct sn9c102_device { - struct device dev; - struct video_device* v4ldev; enum sn9c102_bridge bridge; @@ -140,8 +133,8 @@ struct sn9c102_device { struct v4l2_jpegcompression compression; struct sn9c102_sysfs_attr sysfs; - sn9c102_sof_header_t sof_header; - u16 reg[32]; + sn9c103_sof_header_t sof_header; + u16 reg[63]; struct sn9c102_module_param module_param; @@ -160,7 +153,6 @@ sn9c102_attach_sensor(struct sn9c102_device* cam, struct sn9c102_sensor* sensor) { cam->sensor = sensor; - cam->sensor->dev = &cam->dev; cam->sensor->usbdev = cam->usbdev; } @@ -170,19 +162,24 @@ sn9c102_attach_sensor(struct sn9c102_device* cam, #undef KDBG #ifdef SN9C102_DEBUG # define DBG(level, fmt, args...) \ -{ \ +do { \ if (debug >= (level)) { \ if ((level) == 1) \ - dev_err(&cam->dev, fmt "\n", ## args); \ + dev_err(&cam->usbdev->dev, fmt "\n", ## args); \ else if ((level) == 2) \ - dev_info(&cam->dev, fmt "\n", ## args); \ + dev_info(&cam->usbdev->dev, fmt "\n", ## args); \ else if ((level) >= 3) \ - dev_info(&cam->dev, "[%s:%d] " fmt "\n", \ + dev_info(&cam->usbdev->dev, "[%s:%d] " fmt "\n", \ __FUNCTION__, __LINE__ , ## args); \ } \ -} +} while (0) +# define V4LDBG(level, name, cmd) \ +do { \ + if (debug >= (level)) \ + v4l_print_ioctl(name, cmd); \ +} while (0) # define KDBG(level, fmt, args...) \ -{ \ +do { \ if (debug >= (level)) { \ if ((level) == 1 || (level) == 2) \ pr_info("sn9c102: " fmt "\n", ## args); \ @@ -190,17 +187,18 @@ sn9c102_attach_sensor(struct sn9c102_device* cam, pr_debug("sn9c102: [%s:%d] " fmt "\n", __FUNCTION__, \ __LINE__ , ## args); \ } \ -} +} while (0) #else -# define KDBG(level, fmt, args...) do {;} while(0); -# define DBG(level, fmt, args...) do {;} while(0); +# define DBG(level, fmt, args...) do {;} while(0) +# define V4LDBG(level, name, cmd) do {;} while(0) +# define KDBG(level, fmt, args...) do {;} while(0) #endif #undef PDBG #define PDBG(fmt, args...) \ -dev_info(&cam->dev, "[%s:%d] " fmt "\n", __FUNCTION__, __LINE__ , ## args); +dev_info(&cam->dev, "[%s:%d] " fmt "\n", __FUNCTION__, __LINE__ , ## args) #undef PDBGG -#define PDBGG(fmt, args...) do {;} while(0); /* placeholder */ +#define PDBGG(fmt, args...) do {;} while(0) /* placeholder */ #endif /* _SN9C102_H_ */ diff --git a/drivers/usb/media/sn9c102_core.c b/drivers/usb/media/sn9c102_core.c index 31d57400d..c81397e47 100644 --- a/drivers/usb/media/sn9c102_core.c +++ b/drivers/usb/media/sn9c102_core.c @@ -1,7 +1,7 @@ /*************************************************************************** * V4L2 driver for SN9C10x PC Camera Controllers * * * - * Copyright (C) 2004-2005 by Luca Risolia * + * Copyright (C) 2004-2006 by Luca Risolia * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * @@ -45,6 +45,15 @@ /*****************************************************************************/ +#define SN9C102_MODULE_NAME "V4L2 driver for SN9C10x PC Camera Controllers" +#define SN9C102_MODULE_AUTHOR "(C) 2004-2006 Luca Risolia" +#define SN9C102_AUTHOR_EMAIL "" +#define SN9C102_MODULE_LICENSE "GPL" +#define SN9C102_MODULE_VERSION "1:1.26" +#define SN9C102_MODULE_VERSION_CODE KERNEL_VERSION(1, 0, 26) + +/*****************************************************************************/ + MODULE_DEVICE_TABLE(usb, sn9c102_id_table); MODULE_AUTHOR(SN9C102_MODULE_AUTHOR " " SN9C102_AUTHOR_EMAIL); @@ -70,10 +79,10 @@ static short force_munmap[] = {[0 ... SN9C102_MAX_DEVICES-1] = SN9C102_FORCE_MUNMAP}; module_param_array(force_munmap, bool, NULL, 0444); MODULE_PARM_DESC(force_munmap, - "\n<0|1[,...]> Force the application to unmap previously " - "\nmapped buffer memory before calling any VIDIOC_S_CROP or " - "\nVIDIOC_S_FMT ioctl's. Not all the applications support " - "\nthis feature. This parameter is specific for each " + "\n<0|1[,...]> Force the application to unmap previously" + "\nmapped buffer memory before calling any VIDIOC_S_CROP or" + "\nVIDIOC_S_FMT ioctl's. Not all the applications support" + "\nthis feature. This parameter is specific for each" "\ndetected camera." "\n 0 = do not force memory unmapping" "\n 1 = force memory unmapping (save memory)" @@ -102,6 +111,9 @@ static sn9c102_sof_header_t sn9c102_sof_header[] = { {0xff, 0xff, 0x00, 0xc4, 0xc4, 0x96, 0x01}, }; +static sn9c103_sof_header_t sn9c103_sof_header[] = { + {0xff, 0xff, 0x00, 0xc4, 0xc4, 0x96, 0x20}, +}; static sn9c102_eof_header_t sn9c102_eof_header[] = { {0x00, 0x00, 0x00, 0x00}, @@ -112,50 +124,6 @@ static sn9c102_eof_header_t sn9c102_eof_header[] = { /*****************************************************************************/ -static void* rvmalloc(size_t size) -{ - void* mem; - unsigned long adr; - - size = PAGE_ALIGN(size); - - mem = vmalloc_32((unsigned long)size); - if (!mem) - return NULL; - - memset(mem, 0, size); - - adr = (unsigned long)mem; - while (size > 0) { - SetPageReserved(vmalloc_to_page((void *)adr)); - adr += PAGE_SIZE; - size -= PAGE_SIZE; - } - - return mem; -} - - -static void rvfree(void* mem, size_t size) -{ - unsigned long adr; - - if (!mem) - return; - - size = PAGE_ALIGN(size); - - adr = (unsigned long)mem; - while (size > 0) { - ClearPageReserved(vmalloc_to_page((void *)adr)); - adr += PAGE_SIZE; - size -= PAGE_SIZE; - } - - vfree(mem); -} - - static u32 sn9c102_request_buffers(struct sn9c102_device* cam, u32 count, enum sn9c102_io_method io) @@ -174,7 +142,7 @@ sn9c102_request_buffers(struct sn9c102_device* cam, u32 count, cam->nbuffers = count; while (cam->nbuffers > 0) { - if ((buff = rvmalloc(cam->nbuffers * PAGE_ALIGN(imagesize)))) + if ((buff = vmalloc_32(cam->nbuffers * PAGE_ALIGN(imagesize)))) break; cam->nbuffers--; } @@ -198,10 +166,10 @@ sn9c102_request_buffers(struct sn9c102_device* cam, u32 count, static void sn9c102_release_buffers(struct sn9c102_device* cam) { if (cam->nbuffers) { - rvfree(cam->frame[0].bufmem, - cam->nbuffers * cam->frame[0].buf.length); + vfree(cam->frame[0].bufmem); cam->nbuffers = 0; } + cam->frame_current = NULL; } @@ -219,6 +187,19 @@ static void sn9c102_empty_framequeues(struct sn9c102_device* cam) } +static void sn9c102_requeue_outqueue(struct sn9c102_device* cam) +{ + struct sn9c102_frame_t *i; + + list_for_each_entry(i, &cam->outqueue, frame) { + i->state = F_QUEUED; + list_add(&i->frame, &cam->inqueue); + } + + INIT_LIST_HEAD(&cam->outqueue); +} + + static void sn9c102_queue_unusedframes(struct sn9c102_device* cam) { unsigned long lock_flags; @@ -235,19 +216,46 @@ static void sn9c102_queue_unusedframes(struct sn9c102_device* cam) /*****************************************************************************/ +int sn9c102_write_regs(struct sn9c102_device* cam, u8* buff, u16 index) +{ + struct usb_device* udev = cam->usbdev; + int i, res; + + if (index + sizeof(buff) >= ARRAY_SIZE(cam->reg)) + return -1; + + res = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), 0x08, 0x41, + index, 0, buff, sizeof(buff), + SN9C102_CTRL_TIMEOUT*sizeof(buff)); + if (res < 0) { + DBG(3, "Failed to write registers (index 0x%02X, error %d)", + index, res); + return -1; + } + + for (i = 0; i < sizeof(buff); i++) + cam->reg[index+i] = buff[i]; + + return 0; +} + + int sn9c102_write_reg(struct sn9c102_device* cam, u8 value, u16 index) { struct usb_device* udev = cam->usbdev; u8* buff = cam->control_buffer; int res; + if (index >= ARRAY_SIZE(cam->reg)) + return -1; + *buff = value; res = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), 0x08, 0x41, index, 0, buff, 1, SN9C102_CTRL_TIMEOUT); if (res < 0) { DBG(3, "Failed to write a register (value 0x%02X, index " - "0x%02X, error %d)", value, index, res) + "0x%02X, error %d)", value, index, res); return -1; } @@ -268,7 +276,7 @@ static int sn9c102_read_reg(struct sn9c102_device* cam, u16 index) index, 0, buff, 1, SN9C102_CTRL_TIMEOUT); if (res < 0) DBG(3, "Failed to read a register (index 0x%02X, error %d)", - index, res) + index, res); return (res >= 0) ? (int)(*buff) : -1; } @@ -276,8 +284,8 @@ static int sn9c102_read_reg(struct sn9c102_device* cam, u16 index) int sn9c102_pread_reg(struct sn9c102_device* cam, u16 index) { - if (index > 0x1f) - return -EINVAL; + if (index >= ARRAY_SIZE(cam->reg)) + return -1; return cam->reg[index]; } @@ -367,10 +375,10 @@ sn9c102_i2c_try_raw_read(struct sn9c102_device* cam, err += sn9c102_i2c_detect_read_error(cam, sensor); PDBGG("I2C read: address 0x%02X, first read byte: 0x%02X", data1, - data[4]) + data[4]); if (err) { - DBG(3, "I2C read failed for %s image sensor", sensor->name) + DBG(3, "I2C read failed for %s image sensor", sensor->name); return -1; } @@ -410,11 +418,11 @@ sn9c102_i2c_try_raw_write(struct sn9c102_device* cam, err += sn9c102_i2c_detect_write_error(cam, sensor); if (err) - DBG(3, "I2C write failed for %s image sensor", sensor->name) + DBG(3, "I2C write failed for %s image sensor", sensor->name); PDBGG("I2C raw write: %u bytes, data0 = 0x%02X, data1 = 0x%02X, " "data2 = 0x%02X, data3 = 0x%02X, data4 = 0x%02X, data5 = 0x%02X", - n, data0, data1, data2, data3, data4, data5) + n, data0, data1, data2, data3, data4, data5); return err ? -1 : 0; } @@ -429,7 +437,7 @@ sn9c102_i2c_try_read(struct sn9c102_device* cam, } -static int +int sn9c102_i2c_try_write(struct sn9c102_device* cam, struct sn9c102_sensor* sensor, u8 address, u8 value) { @@ -461,13 +469,27 @@ int sn9c102_i2c_write(struct sn9c102_device* cam, u8 address, u8 value) static void* sn9c102_find_sof_header(struct sn9c102_device* cam, void* mem, size_t len) { - size_t soflen = sizeof(sn9c102_sof_header_t), i; - u8 j, n = sizeof(sn9c102_sof_header) / soflen; + size_t soflen = 0, i; + u8 j, n = 0; + + switch (cam->bridge) { + case BRIDGE_SN9C101: + case BRIDGE_SN9C102: + soflen = sizeof(sn9c102_sof_header_t); + n = sizeof(sn9c102_sof_header) / soflen; + break; + case BRIDGE_SN9C103: + soflen = sizeof(sn9c103_sof_header_t); + n = sizeof(sn9c103_sof_header) / soflen; + } - for (i = 0; (len >= soflen) && (i <= len - soflen); i++) + for (i = 0; (len >= soflen) && (i <= len - soflen); i++) for (j = 0; j < n; j++) - /* It's enough to compare 7 bytes */ - if (!memcmp(mem + i, sn9c102_sof_header[j], 7)) { + /* The invariable part of the header is 6 bytes long */ + if ((cam->bridge != BRIDGE_SN9C103 && + !memcmp(mem + i, sn9c102_sof_header[j], 6)) || + (cam->bridge == BRIDGE_SN9C103 && + !memcmp(mem + i, sn9c103_sof_header[j], 6))) { memcpy(cam->sof_header, mem + i, soflen); /* Skip the header */ return mem + i + soflen; @@ -499,8 +521,7 @@ static void sn9c102_urb_complete(struct urb *urb, struct pt_regs* regs) { struct sn9c102_device* cam = urb->context; struct sn9c102_frame_t** f; - size_t imagesize; - unsigned long lock_flags; + size_t imagesize, soflen; u8 i; int err = 0; @@ -513,7 +534,7 @@ static void sn9c102_urb_complete(struct urb *urb, struct pt_regs* regs) cam->stream = STREAM_OFF; if ((*f)) (*f)->state = F_QUEUED; - DBG(3, "Stream interrupted") + DBG(3, "Stream interrupted"); wake_up_interruptible(&cam->wait_stream); } @@ -536,6 +557,10 @@ static void sn9c102_urb_complete(struct urb *urb, struct pt_regs* regs) cam->sensor->pix_format.height * cam->sensor->pix_format.priv) / 8; + soflen = (cam->bridge) == BRIDGE_SN9C103 ? + sizeof(sn9c103_sof_header_t) : + sizeof(sn9c102_sof_header_t); + for (i = 0; i < urb->number_of_packets; i++) { unsigned int img, len, status; void *pos, *sof, *eof; @@ -545,19 +570,12 @@ static void sn9c102_urb_complete(struct urb *urb, struct pt_regs* regs) pos = urb->iso_frame_desc[i].offset + urb->transfer_buffer; if (status) { - DBG(3, "Error in isochronous frame") + DBG(3, "Error in isochronous frame"); (*f)->state = F_ERROR; continue; } - PDBGG("Isochrnous frame: length %u, #%u i", len, i) - - /* - NOTE: It is probably correct to assume that SOF and EOF - headers do not occur between two consecutive packets, - but who knows..Whatever is the truth, this assumption - doesn't introduce bugs. - */ + PDBGG("Isochrnous frame: length %u, #%u i", len, i); redo: sof = sn9c102_find_sof_header(cam, pos, len); @@ -575,10 +593,10 @@ end_of_frame: imagesize; img = imagesize - (*f)->buf.bytesused; DBG(3, "Expected EOF not found: " - "video frame cut") + "video frame cut"); if (eof) DBG(3, "Exceeded limit: +%u " - "bytes", (unsigned)(b)) + "bytes", (unsigned)(b)); } memcpy((*f)->bufmem + (*f)->buf.bytesused, pos, @@ -595,8 +613,7 @@ end_of_frame: u32 b = (*f)->buf.bytesused; (*f)->state = F_DONE; (*f)->buf.sequence= ++cam->frame_count; - spin_lock_irqsave(&cam->queue_lock, - lock_flags); + spin_lock(&cam->queue_lock); list_move_tail(&(*f)->frame, &cam->outqueue); if (!list_empty(&cam->inqueue)) @@ -606,13 +623,11 @@ end_of_frame: frame ); else (*f) = NULL; - spin_unlock_irqrestore(&cam->queue_lock - , lock_flags); + spin_unlock(&cam->queue_lock); memcpy(cam->sysfs.frame_header, - cam->sof_header, - sizeof(sn9c102_sof_header_t)); - DBG(3, "Video frame captured: " - "%lu bytes", (unsigned long)(b)) + cam->sof_header, soflen); + DBG(3, "Video frame captured: %lu " + "bytes", (unsigned long)(b)); if (!(*f)) goto resubmit_urb; @@ -621,18 +636,19 @@ end_of_frame: (*f)->state = F_ERROR; DBG(3, "Not expected EOF after %lu " "bytes of image data", - (unsigned long)((*f)->buf.bytesused)) + (unsigned long) + ((*f)->buf.bytesused)); } if (sof) /* (1) */ goto start_of_frame; } else if (eof) { - DBG(3, "EOF without SOF") + DBG(3, "EOF without SOF"); continue; } else { - PDBGG("Ignoring pointless isochronous frame") + PDBGG("Ignoring pointless isochronous frame"); continue; } @@ -642,7 +658,7 @@ start_of_frame: (*f)->buf.bytesused = 0; len -= (sof - pos); pos = sof; - DBG(3, "SOF detected: new video frame") + DBG(3, "SOF detected: new video frame"); if (len) goto redo; @@ -653,12 +669,13 @@ start_of_frame: else { if (cam->sensor->pix_format.pixelformat == V4L2_PIX_FMT_SN9C10X) { - eof = sof-sizeof(sn9c102_sof_header_t); + eof = sof - soflen; goto end_of_frame; } else { DBG(3, "SOF before expected EOF after " "%lu bytes of image data", - (unsigned long)((*f)->buf.bytesused)) + (unsigned long) + ((*f)->buf.bytesused)); goto start_of_frame; } } @@ -670,7 +687,7 @@ resubmit_urb: err = usb_submit_urb(urb, GFP_ATOMIC); if (err < 0 && err != -EPERM) { cam->state |= DEV_MISCONFIGURED; - DBG(1, "usb_submit_urb() failed") + DBG(1, "usb_submit_urb() failed"); } wake_up_interruptible(&cam->wait_frame); @@ -681,18 +698,22 @@ static int sn9c102_start_transfer(struct sn9c102_device* cam) { struct usb_device *udev = cam->usbdev; struct urb* urb; - const unsigned int wMaxPacketSize[] = {0, 128, 256, 384, 512, - 680, 800, 900, 1023}; - const unsigned int psz = wMaxPacketSize[SN9C102_ALTERNATE_SETTING]; + const unsigned int sn9c102_wMaxPacketSize[] = {0, 128, 256, 384, 512, + 680, 800, 900, 1023}; + const unsigned int sn9c103_wMaxPacketSize[] = {0, 128, 256, 384, 512, + 680, 800, 900, 1003}; + const unsigned int psz = (cam->bridge == BRIDGE_SN9C103) ? + sn9c103_wMaxPacketSize[SN9C102_ALTERNATE_SETTING] : + sn9c102_wMaxPacketSize[SN9C102_ALTERNATE_SETTING]; s8 i, j; int err = 0; for (i = 0; i < SN9C102_URBS; i++) { - cam->transfer_buffer[i] = kmalloc(SN9C102_ISO_PACKETS * psz, + cam->transfer_buffer[i] = kzalloc(SN9C102_ISO_PACKETS * psz, GFP_KERNEL); if (!cam->transfer_buffer[i]) { err = -ENOMEM; - DBG(1, "Not enough memory") + DBG(1, "Not enough memory"); goto free_buffers; } } @@ -702,7 +723,7 @@ static int sn9c102_start_transfer(struct sn9c102_device* cam) cam->urb[i] = urb; if (!urb) { err = -ENOMEM; - DBG(1, "usb_alloc_urb() failed") + DBG(1, "usb_alloc_urb() failed"); goto free_urbs; } urb->dev = udev; @@ -725,14 +746,14 @@ static int sn9c102_start_transfer(struct sn9c102_device* cam) err = sn9c102_write_reg(cam, cam->reg[0x01] | 0x04, 0x01); if (err) { err = -EIO; - DBG(1, "I/O hardware error") + DBG(1, "I/O hardware error"); goto free_urbs; } } err = usb_set_interface(udev, 0, SN9C102_ALTERNATE_SETTING); if (err) { - DBG(1, "usb_set_interface() failed") + DBG(1, "usb_set_interface() failed"); goto free_urbs; } @@ -743,7 +764,7 @@ static int sn9c102_start_transfer(struct sn9c102_device* cam) if (err) { for (j = i-1; j >= 0; j--) usb_kill_urb(cam->urb[j]); - DBG(1, "usb_submit_urb() failed, error %d", err) + DBG(1, "usb_submit_urb() failed, error %d", err); goto free_urbs; } } @@ -779,7 +800,7 @@ static int sn9c102_stop_transfer(struct sn9c102_device* cam) err = usb_set_interface(udev, 0, 0); /* 0 Mb/s */ if (err) - DBG(3, "usb_set_interface() failed") + DBG(3, "usb_set_interface() failed"); return err; } @@ -799,7 +820,7 @@ static int sn9c102_stream_interrupt(struct sn9c102_device* cam) else if (err) { cam->state |= DEV_MISCONFIGURED; DBG(1, "The camera is misconfigured. To use it, close and " - "open /dev/video%d again.", cam->v4ldev->minor) + "open /dev/video%d again.", cam->v4ldev->minor); return err; } @@ -808,6 +829,7 @@ static int sn9c102_stream_interrupt(struct sn9c102_device* cam) /*****************************************************************************/ +#ifdef CONFIG_VIDEO_ADV_DEBUG static u8 sn9c102_strtou8(const char* buff, size_t len, ssize_t* count) { char str[5]; @@ -885,8 +907,8 @@ sn9c102_store_reg(struct class_device* cd, const char* buf, size_t len) cam->sysfs.reg = index; - DBG(2, "Moved SN9C10X register index to 0x%02X", cam->sysfs.reg) - DBG(3, "Written bytes: %zd", count) + DBG(2, "Moved SN9C10X register index to 0x%02X", cam->sysfs.reg); + DBG(3, "Written bytes: %zd", count); up(&sn9c102_sysfs_lock); @@ -916,7 +938,7 @@ static ssize_t sn9c102_show_val(struct class_device* cd, char* buf) count = sprintf(buf, "%d\n", val); - DBG(3, "Read bytes: %zd", count) + DBG(3, "Read bytes: %zd", count); up(&sn9c102_sysfs_lock); @@ -954,8 +976,8 @@ sn9c102_store_val(struct class_device* cd, const char* buf, size_t len) } DBG(2, "Written SN9C10X reg. 0x%02X, val. 0x%02X", - cam->sysfs.reg, value) - DBG(3, "Written bytes: %zd", count) + cam->sysfs.reg, value); + DBG(3, "Written bytes: %zd", count); up(&sn9c102_sysfs_lock); @@ -979,7 +1001,7 @@ static ssize_t sn9c102_show_i2c_reg(struct class_device* cd, char* buf) count = sprintf(buf, "%u\n", cam->sysfs.i2c_reg); - DBG(3, "Read bytes: %zd", count) + DBG(3, "Read bytes: %zd", count); up(&sn9c102_sysfs_lock); @@ -1011,8 +1033,8 @@ sn9c102_store_i2c_reg(struct class_device* cd, const char* buf, size_t len) cam->sysfs.i2c_reg = index; - DBG(2, "Moved sensor register index to 0x%02X", cam->sysfs.i2c_reg) - DBG(3, "Written bytes: %zd", count) + DBG(2, "Moved sensor register index to 0x%02X", cam->sysfs.i2c_reg); + DBG(3, "Written bytes: %zd", count); up(&sn9c102_sysfs_lock); @@ -1047,7 +1069,7 @@ static ssize_t sn9c102_show_i2c_val(struct class_device* cd, char* buf) count = sprintf(buf, "%d\n", val); - DBG(3, "Read bytes: %zd", count) + DBG(3, "Read bytes: %zd", count); up(&sn9c102_sysfs_lock); @@ -1090,8 +1112,8 @@ sn9c102_store_i2c_val(struct class_device* cd, const char* buf, size_t len) } DBG(2, "Written sensor reg. 0x%02X, val. 0x%02X", - cam->sysfs.i2c_reg, value) - DBG(3, "Written bytes: %zd", count) + cam->sysfs.i2c_reg, value); + DBG(3, "Written bytes: %zd", count); up(&sn9c102_sysfs_lock); @@ -1193,7 +1215,7 @@ static ssize_t sn9c102_show_frame_header(struct class_device* cd, char* buf) count = sizeof(cam->sysfs.frame_header); memcpy(buf, cam->sysfs.frame_header, count); - DBG(3, "Frame header, read bytes: %zd", count) + DBG(3, "Frame header, read bytes: %zd", count); return count; } @@ -1227,11 +1249,12 @@ static void sn9c102_create_sysfs(struct sn9c102_device* cam) video_device_create_file(v4ldev, &class_device_attr_blue); video_device_create_file(v4ldev, &class_device_attr_red); } - if (cam->sensor->sysfs_ops) { + if (cam->sensor && cam->sensor->sysfs_ops) { video_device_create_file(v4ldev, &class_device_attr_i2c_reg); video_device_create_file(v4ldev, &class_device_attr_i2c_val); } } +#endif /* CONFIG_VIDEO_ADV_DEBUG */ /*****************************************************************************/ @@ -1281,7 +1304,7 @@ static int sn9c102_set_scale(struct sn9c102_device* cam, u8 scale) if (err) return -EIO; - PDBGG("Scaling factor: %u", scale) + PDBGG("Scaling factor: %u", scale); return 0; } @@ -1304,7 +1327,7 @@ static int sn9c102_set_crop(struct sn9c102_device* cam, struct v4l2_rect* rect) return -EIO; PDBGG("h_start, v_start, h_size, v_size, ho_size, vo_size " - "%u %u %u %u", h_start, v_start, h_size, v_size) + "%u %u %u %u", h_start, v_start, h_size, v_size); return 0; } @@ -1316,7 +1339,7 @@ static int sn9c102_init(struct sn9c102_device* cam) struct v4l2_control ctrl; struct v4l2_queryctrl *qctrl; struct v4l2_rect* rect; - u8 i = 0, n = 0; + u8 i = 0; int err = 0; if (!(cam->state & DEV_INITIALIZED)) { @@ -1336,7 +1359,7 @@ static int sn9c102_init(struct sn9c102_device* cam) if (s->init) { err = s->init(cam); if (err) { - DBG(3, "Sensor initialization failed") + DBG(3, "Sensor initialization failed"); return err; } } @@ -1352,32 +1375,31 @@ static int sn9c102_init(struct sn9c102_device* cam) return err; if (s->pix_format.pixelformat == V4L2_PIX_FMT_SN9C10X) - DBG(3, "Compressed video format is active, quality %d", - cam->compression.quality) + DBG(3, "Compressed video format is active, quality %d", + cam->compression.quality); else - DBG(3, "Uncompressed video format is active") + DBG(3, "Uncompressed video format is active"); if (s->set_crop) if ((err = s->set_crop(cam, rect))) { - DBG(3, "set_crop() failed") + DBG(3, "set_crop() failed"); return err; } if (s->set_ctrl) { - n = sizeof(s->qctrl) / sizeof(s->qctrl[0]); - for (i = 0; i < n; i++) - if (s->qctrl[i].id != 0 && + for (i = 0; i < ARRAY_SIZE(s->qctrl); i++) + if (s->qctrl[i].id != 0 && !(s->qctrl[i].flags & V4L2_CTRL_FLAG_DISABLED)) { ctrl.id = s->qctrl[i].id; ctrl.value = qctrl[i].default_value; err = s->set_ctrl(cam, &ctrl); if (err) { DBG(3, "Set %s control failed", - s->qctrl[i].name) + s->qctrl[i].name); return err; } DBG(3, "Image sensor supports '%s' control", - s->qctrl[i].name) + s->qctrl[i].name); } } @@ -1388,12 +1410,12 @@ static int sn9c102_init(struct sn9c102_device* cam) init_waitqueue_head(&cam->wait_stream); cam->nreadbuffers = 2; memcpy(s->_qctrl, s->qctrl, sizeof(s->qctrl)); - memcpy(&(s->_rect), &(s->cropcap.defrect), + memcpy(&(s->_rect), &(s->cropcap.defrect), sizeof(struct v4l2_rect)); cam->state |= DEV_INITIALIZED; } - DBG(2, "Initialization succeeded") + DBG(2, "Initialization succeeded"); return 0; } @@ -1402,7 +1424,7 @@ static void sn9c102_release_resources(struct sn9c102_device* cam) { down(&sn9c102_sysfs_lock); - DBG(2, "V4L2 device /dev/video%d deregistered", cam->v4ldev->minor) + DBG(2, "V4L2 device /dev/video%d deregistered", cam->v4ldev->minor); video_set_drvdata(cam->v4ldev, NULL); video_unregister_device(cam->v4ldev); @@ -1433,7 +1455,7 @@ static int sn9c102_open(struct inode* inode, struct file* filp) } if (cam->users) { - DBG(2, "Device /dev/video%d is busy...", cam->v4ldev->minor) + DBG(2, "Device /dev/video%d is busy...", cam->v4ldev->minor); if ((filp->f_flags & O_NONBLOCK) || (filp->f_flags & O_NDELAY)) { err = -EWOULDBLOCK; @@ -1459,7 +1481,7 @@ static int sn9c102_open(struct inode* inode, struct file* filp) err = sn9c102_init(cam); if (err) { DBG(1, "Initialization failed again. " - "I will retry on next open().") + "I will retry on next open()."); goto out; } cam->state &= ~DEV_MISCONFIGURED; @@ -1476,7 +1498,7 @@ static int sn9c102_open(struct inode* inode, struct file* filp) cam->frame_count = 0; sn9c102_empty_framequeues(cam); - DBG(3, "Video device /dev/video%d is open", cam->v4ldev->minor) + DBG(3, "Video device /dev/video%d is open", cam->v4ldev->minor); out: up(&cam->dev_sem); @@ -1505,7 +1527,7 @@ static int sn9c102_release(struct inode* inode, struct file* filp) cam->users--; wake_up_interruptible_nr(&cam->open, 1); - DBG(3, "Video device /dev/video%d closed", cam->v4ldev->minor) + DBG(3, "Video device /dev/video%d closed", cam->v4ldev->minor); up(&cam->dev_sem); @@ -1525,32 +1547,38 @@ sn9c102_read(struct file* filp, char __user * buf, size_t count, loff_t* f_pos) return -ERESTARTSYS; if (cam->state & DEV_DISCONNECTED) { - DBG(1, "Device not present") + DBG(1, "Device not present"); up(&cam->fileop_sem); return -ENODEV; } if (cam->state & DEV_MISCONFIGURED) { - DBG(1, "The camera is misconfigured. Close and open it again.") + DBG(1, "The camera is misconfigured. Close and open it " + "again."); up(&cam->fileop_sem); return -EIO; } if (cam->io == IO_MMAP) { DBG(3, "Close and open the device again to choose " - "the read method") + "the read method"); up(&cam->fileop_sem); return -EINVAL; } if (cam->io == IO_NONE) { if (!sn9c102_request_buffers(cam,cam->nreadbuffers, IO_READ)) { - DBG(1, "read() failed, not enough memory") + DBG(1, "read() failed, not enough memory"); up(&cam->fileop_sem); return -ENOMEM; } cam->io = IO_READ; cam->stream = STREAM_ON; + } + + if (list_empty(&cam->inqueue)) { + if (!list_empty(&cam->outqueue)) + sn9c102_empty_framequeues(cam); sn9c102_queue_unusedframes(cam); } @@ -1585,6 +1613,16 @@ sn9c102_read(struct file* filp, char __user * buf, size_t count, loff_t* f_pos) f = list_entry(cam->outqueue.prev, struct sn9c102_frame_t, frame); + if (count > f->buf.bytesused) + count = f->buf.bytesused; + + if (copy_to_user(buf, f->bufmem, count)) { + err = -EFAULT; + goto exit; + } + *f_pos += count; + +exit: spin_lock_irqsave(&cam->queue_lock, lock_flags); list_for_each_entry(i, &cam->outqueue, frame) i->state = F_UNUSED; @@ -1593,16 +1631,8 @@ sn9c102_read(struct file* filp, char __user * buf, size_t count, loff_t* f_pos) sn9c102_queue_unusedframes(cam); - if (count > f->buf.bytesused) - count = f->buf.bytesused; - - if (copy_to_user(buf, f->bufmem, count)) { - up(&cam->fileop_sem); - return -EFAULT; - } - *f_pos += count; - - PDBGG("Frame #%lu, bytes read: %zu", (unsigned long)f->buf.index,count) + PDBGG("Frame #%lu, bytes read: %zu", + (unsigned long)f->buf.index, count); up(&cam->fileop_sem); @@ -1613,33 +1643,42 @@ sn9c102_read(struct file* filp, char __user * buf, size_t count, loff_t* f_pos) static unsigned int sn9c102_poll(struct file *filp, poll_table *wait) { struct sn9c102_device* cam = video_get_drvdata(video_devdata(filp)); + struct sn9c102_frame_t* f; + unsigned long lock_flags; unsigned int mask = 0; if (down_interruptible(&cam->fileop_sem)) return POLLERR; if (cam->state & DEV_DISCONNECTED) { - DBG(1, "Device not present") + DBG(1, "Device not present"); goto error; } if (cam->state & DEV_MISCONFIGURED) { - DBG(1, "The camera is misconfigured. Close and open it again.") + DBG(1, "The camera is misconfigured. Close and open it " + "again."); goto error; } if (cam->io == IO_NONE) { if (!sn9c102_request_buffers(cam, cam->nreadbuffers, IO_READ)) { - DBG(1, "poll() failed, not enough memory") + DBG(1, "poll() failed, not enough memory"); goto error; } cam->io = IO_READ; cam->stream = STREAM_ON; } - if (cam->io == IO_READ) + if (cam->io == IO_READ) { + spin_lock_irqsave(&cam->queue_lock, lock_flags); + list_for_each_entry(f, &cam->outqueue, frame) + f->state = F_UNUSED; + INIT_LIST_HEAD(&cam->outqueue); + spin_unlock_irqrestore(&cam->queue_lock, lock_flags); sn9c102_queue_unusedframes(cam); + } poll_wait(filp, &cam->wait_frame, wait); @@ -1681,22 +1720,22 @@ static int sn9c102_mmap(struct file* filp, struct vm_area_struct *vma) { struct sn9c102_device* cam = video_get_drvdata(video_devdata(filp)); unsigned long size = vma->vm_end - vma->vm_start, - start = vma->vm_start, - pos, - page; + start = vma->vm_start; + void *pos; u32 i; if (down_interruptible(&cam->fileop_sem)) return -ERESTARTSYS; if (cam->state & DEV_DISCONNECTED) { - DBG(1, "Device not present") + DBG(1, "Device not present"); up(&cam->fileop_sem); return -ENODEV; } if (cam->state & DEV_MISCONFIGURED) { - DBG(1, "The camera is misconfigured. Close and open it again.") + DBG(1, "The camera is misconfigured. Close and open it " + "again."); up(&cam->fileop_sem); return -EIO; } @@ -1716,15 +1755,12 @@ static int sn9c102_mmap(struct file* filp, struct vm_area_struct *vma) return -EINVAL; } - /* VM_IO is eventually going to replace PageReserved altogether */ vma->vm_flags |= VM_IO; - vma->vm_flags |= VM_RESERVED; /* avoid to swap out this VMA */ + vma->vm_flags |= VM_RESERVED; - pos = (unsigned long)cam->frame[i].bufmem; + pos = cam->frame[i].bufmem; while (size > 0) { /* size is page-aligned */ - page = vmalloc_to_pfn((void *)pos); - if (remap_pfn_range(vma, start, page, PAGE_SIZE, - vma->vm_page_prot)) { + if (vm_insert_page(vma, start, vmalloc_to_page(pos))) { up(&cam->fileop_sem); return -EAGAIN; } @@ -1743,740 +1779,861 @@ static int sn9c102_mmap(struct file* filp, struct vm_area_struct *vma) return 0; } +/*****************************************************************************/ -static int sn9c102_ioctl_v4l2(struct inode* inode, struct file* filp, - unsigned int cmd, void __user * arg) +static int +sn9c102_vidioc_querycap(struct sn9c102_device* cam, void __user * arg) { - struct sn9c102_device* cam = video_get_drvdata(video_devdata(filp)); + struct v4l2_capability cap = { + .driver = "sn9c102", + .version = SN9C102_MODULE_VERSION_CODE, + .capabilities = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_READWRITE | + V4L2_CAP_STREAMING, + }; + + strlcpy(cap.card, cam->v4ldev->name, sizeof(cap.card)); + if (usb_make_path(cam->usbdev, cap.bus_info, sizeof(cap.bus_info)) < 0) + strlcpy(cap.bus_info, cam->usbdev->dev.bus_id, + sizeof(cap.bus_info)); + + if (copy_to_user(arg, &cap, sizeof(cap))) + return -EFAULT; - switch (cmd) { + return 0; +} - case VIDIOC_QUERYCAP: - { - struct v4l2_capability cap = { - .driver = "sn9c102", - .version = SN9C102_MODULE_VERSION_CODE, - .capabilities = V4L2_CAP_VIDEO_CAPTURE | - V4L2_CAP_READWRITE | - V4L2_CAP_STREAMING, - }; - - strlcpy(cap.card, cam->v4ldev->name, sizeof(cap.card)); - if (usb_make_path(cam->usbdev, cap.bus_info, - sizeof(cap.bus_info)) < 0) - strlcpy(cap.bus_info, cam->dev.bus_id, - sizeof(cap.bus_info)); - - if (copy_to_user(arg, &cap, sizeof(cap))) - return -EFAULT; - return 0; - } +static int +sn9c102_vidioc_enuminput(struct sn9c102_device* cam, void __user * arg) +{ + struct v4l2_input i; - case VIDIOC_ENUMINPUT: - { - struct v4l2_input i; + if (copy_from_user(&i, arg, sizeof(i))) + return -EFAULT; - if (copy_from_user(&i, arg, sizeof(i))) - return -EFAULT; + if (i.index) + return -EINVAL; - if (i.index) - return -EINVAL; + memset(&i, 0, sizeof(i)); + strcpy(i.name, "Camera"); - memset(&i, 0, sizeof(i)); - strcpy(i.name, "USB"); + if (copy_to_user(arg, &i, sizeof(i))) + return -EFAULT; - if (copy_to_user(arg, &i, sizeof(i))) - return -EFAULT; + return 0; +} - return 0; - } - case VIDIOC_G_INPUT: - case VIDIOC_S_INPUT: - { - int index; +static int +sn9c102_vidioc_gs_input(struct sn9c102_device* cam, void __user * arg) +{ + int index; - if (copy_from_user(&index, arg, sizeof(index))) - return -EFAULT; + if (copy_from_user(&index, arg, sizeof(index))) + return -EFAULT; - if (index != 0) - return -EINVAL; + if (index != 0) + return -EINVAL; - return 0; - } + return 0; +} - case VIDIOC_QUERYCTRL: - { - struct sn9c102_sensor* s = cam->sensor; - struct v4l2_queryctrl qc; - u8 i, n; - if (copy_from_user(&qc, arg, sizeof(qc))) - return -EFAULT; +static int +sn9c102_vidioc_query_ctrl(struct sn9c102_device* cam, void __user * arg) +{ + struct sn9c102_sensor* s = cam->sensor; + struct v4l2_queryctrl qc; + u8 i; - n = sizeof(s->qctrl) / sizeof(s->qctrl[0]); - for (i = 0; i < n; i++) - if (qc.id && qc.id == s->qctrl[i].id) { - memcpy(&qc, &(s->qctrl[i]), sizeof(qc)); - if (copy_to_user(arg, &qc, sizeof(qc))) - return -EFAULT; - return 0; - } + if (copy_from_user(&qc, arg, sizeof(qc))) + return -EFAULT; - return -EINVAL; - } + for (i = 0; i < ARRAY_SIZE(s->qctrl); i++) + if (qc.id && qc.id == s->qctrl[i].id) { + memcpy(&qc, &(s->qctrl[i]), sizeof(qc)); + if (copy_to_user(arg, &qc, sizeof(qc))) + return -EFAULT; + return 0; + } - case VIDIOC_G_CTRL: - { - struct sn9c102_sensor* s = cam->sensor; - struct v4l2_control ctrl; - int err = 0; + return -EINVAL; +} - if (!s->get_ctrl) - return -EINVAL; - if (copy_from_user(&ctrl, arg, sizeof(ctrl))) - return -EFAULT; +static int +sn9c102_vidioc_g_ctrl(struct sn9c102_device* cam, void __user * arg) +{ + struct sn9c102_sensor* s = cam->sensor; + struct v4l2_control ctrl; + int err = 0; + u8 i; + + if (!s->get_ctrl && !s->set_ctrl) + return -EINVAL; + + if (copy_from_user(&ctrl, arg, sizeof(ctrl))) + return -EFAULT; + if (!s->get_ctrl) { + for (i = 0; i < ARRAY_SIZE(s->qctrl); i++) + if (ctrl.id && ctrl.id == s->qctrl[i].id) { + ctrl.value = s->_qctrl[i].default_value; + goto exit; + } + return -EINVAL; + } else err = s->get_ctrl(cam, &ctrl); - if (copy_to_user(arg, &ctrl, sizeof(ctrl))) - return -EFAULT; +exit: + if (copy_to_user(arg, &ctrl, sizeof(ctrl))) + return -EFAULT; - return err; - } + return err; +} - case VIDIOC_S_CTRL_OLD: - case VIDIOC_S_CTRL: - { - struct sn9c102_sensor* s = cam->sensor; - struct v4l2_control ctrl; - u8 i, n; - int err = 0; - if (!s->set_ctrl) - return -EINVAL; +static int +sn9c102_vidioc_s_ctrl(struct sn9c102_device* cam, void __user * arg) +{ + struct sn9c102_sensor* s = cam->sensor; + struct v4l2_control ctrl; + u8 i; + int err = 0; - if (copy_from_user(&ctrl, arg, sizeof(ctrl))) - return -EFAULT; + if (!s->set_ctrl) + return -EINVAL; - n = sizeof(s->qctrl) / sizeof(s->qctrl[0]); - for (i = 0; i < n; i++) - if (ctrl.id == s->qctrl[i].id) { - if (ctrl.value < s->qctrl[i].minimum || - ctrl.value > s->qctrl[i].maximum) - return -ERANGE; - ctrl.value -= ctrl.value % s->qctrl[i].step; - break; - } + if (copy_from_user(&ctrl, arg, sizeof(ctrl))) + return -EFAULT; - if ((err = s->set_ctrl(cam, &ctrl))) - return err; + for (i = 0; i < ARRAY_SIZE(s->qctrl); i++) + if (ctrl.id == s->qctrl[i].id) { + if (ctrl.value < s->qctrl[i].minimum || + ctrl.value > s->qctrl[i].maximum) + return -ERANGE; + ctrl.value -= ctrl.value % s->qctrl[i].step; + break; + } - s->_qctrl[i].default_value = ctrl.value; + if ((err = s->set_ctrl(cam, &ctrl))) + return err; - PDBGG("VIDIOC_S_CTRL: id %lu, value %lu", - (unsigned long)ctrl.id, (unsigned long)ctrl.value) + s->_qctrl[i].default_value = ctrl.value; - return 0; - } + PDBGG("VIDIOC_S_CTRL: id %lu, value %lu", + (unsigned long)ctrl.id, (unsigned long)ctrl.value); - case VIDIOC_CROPCAP: - { - struct v4l2_cropcap* cc = &(cam->sensor->cropcap); + return 0; +} - cc->type = V4L2_BUF_TYPE_VIDEO_CAPTURE; - cc->pixelaspect.numerator = 1; - cc->pixelaspect.denominator = 1; - if (copy_to_user(arg, cc, sizeof(*cc))) - return -EFAULT; +static int +sn9c102_vidioc_cropcap(struct sn9c102_device* cam, void __user * arg) +{ + struct v4l2_cropcap* cc = &(cam->sensor->cropcap); - return 0; - } + cc->type = V4L2_BUF_TYPE_VIDEO_CAPTURE; + cc->pixelaspect.numerator = 1; + cc->pixelaspect.denominator = 1; - case VIDIOC_G_CROP: - { - struct sn9c102_sensor* s = cam->sensor; - struct v4l2_crop crop = { - .type = V4L2_BUF_TYPE_VIDEO_CAPTURE, - }; + if (copy_to_user(arg, cc, sizeof(*cc))) + return -EFAULT; + + return 0; +} - memcpy(&(crop.c), &(s->_rect), sizeof(struct v4l2_rect)); - if (copy_to_user(arg, &crop, sizeof(crop))) - return -EFAULT; +static int +sn9c102_vidioc_g_crop(struct sn9c102_device* cam, void __user * arg) +{ + struct sn9c102_sensor* s = cam->sensor; + struct v4l2_crop crop = { + .type = V4L2_BUF_TYPE_VIDEO_CAPTURE, + }; - return 0; - } + memcpy(&(crop.c), &(s->_rect), sizeof(struct v4l2_rect)); - case VIDIOC_S_CROP: - { - struct sn9c102_sensor* s = cam->sensor; - struct v4l2_crop crop; - struct v4l2_rect* rect; - struct v4l2_rect* bounds = &(s->cropcap.bounds); - struct v4l2_pix_format* pix_format = &(s->pix_format); - u8 scale; - const enum sn9c102_stream_state stream = cam->stream; - const u32 nbuffers = cam->nbuffers; - u32 i; - int err = 0; - - if (copy_from_user(&crop, arg, sizeof(crop))) - return -EFAULT; + if (copy_to_user(arg, &crop, sizeof(crop))) + return -EFAULT; - rect = &(crop.c); + return 0; +} - if (crop.type != V4L2_BUF_TYPE_VIDEO_CAPTURE) - return -EINVAL; - if (cam->module_param.force_munmap) - for (i = 0; i < cam->nbuffers; i++) - if (cam->frame[i].vma_use_count) { - DBG(3, "VIDIOC_S_CROP failed. " - "Unmap the buffers first.") - return -EINVAL; - } +static int +sn9c102_vidioc_s_crop(struct sn9c102_device* cam, void __user * arg) +{ + struct sn9c102_sensor* s = cam->sensor; + struct v4l2_crop crop; + struct v4l2_rect* rect; + struct v4l2_rect* bounds = &(s->cropcap.bounds); + struct v4l2_pix_format* pix_format = &(s->pix_format); + u8 scale; + const enum sn9c102_stream_state stream = cam->stream; + const u32 nbuffers = cam->nbuffers; + u32 i; + int err = 0; - /* Preserve R,G or B origin */ - rect->left = (s->_rect.left & 1L) ? - rect->left | 1L : rect->left & ~1L; - rect->top = (s->_rect.top & 1L) ? - rect->top | 1L : rect->top & ~1L; - - if (rect->width < 16) - rect->width = 16; - if (rect->height < 16) - rect->height = 16; - if (rect->width > bounds->width) - rect->width = bounds->width; - if (rect->height > bounds->height) - rect->height = bounds->height; - if (rect->left < bounds->left) - rect->left = bounds->left; - if (rect->top < bounds->top) - rect->top = bounds->top; - if (rect->left + rect->width > bounds->left + bounds->width) - rect->left = bounds->left+bounds->width - rect->width; - if (rect->top + rect->height > bounds->top + bounds->height) - rect->top = bounds->top+bounds->height - rect->height; - - rect->width &= ~15L; - rect->height &= ~15L; - - if (SN9C102_PRESERVE_IMGSCALE) { - /* Calculate the actual scaling factor */ - u32 a, b; - a = rect->width * rect->height; - b = pix_format->width * pix_format->height; - scale = b ? (u8)((a / b) < 4 ? 1 : - ((a / b) < 16 ? 2 : 4)) : 1; - } else - scale = 1; - - if (cam->stream == STREAM_ON) - if ((err = sn9c102_stream_interrupt(cam))) - return err; - - if (copy_to_user(arg, &crop, sizeof(crop))) { - cam->stream = stream; - return -EFAULT; - } + if (copy_from_user(&crop, arg, sizeof(crop))) + return -EFAULT; - if (cam->module_param.force_munmap || cam->io == IO_READ) - sn9c102_release_buffers(cam); + rect = &(crop.c); - err = sn9c102_set_crop(cam, rect); - if (s->set_crop) - err += s->set_crop(cam, rect); - err += sn9c102_set_scale(cam, scale); + if (crop.type != V4L2_BUF_TYPE_VIDEO_CAPTURE) + return -EINVAL; - if (err) { /* atomic, no rollback in ioctl() */ - cam->state |= DEV_MISCONFIGURED; - DBG(1, "VIDIOC_S_CROP failed because of hardware " - "problems. To use the camera, close and open " - "/dev/video%d again.", cam->v4ldev->minor) - return -EIO; - } + if (cam->module_param.force_munmap) + for (i = 0; i < cam->nbuffers; i++) + if (cam->frame[i].vma_use_count) { + DBG(3, "VIDIOC_S_CROP failed. " + "Unmap the buffers first."); + return -EINVAL; + } - s->pix_format.width = rect->width/scale; - s->pix_format.height = rect->height/scale; - memcpy(&(s->_rect), rect, sizeof(*rect)); - - if ((cam->module_param.force_munmap || cam->io == IO_READ) && - nbuffers != sn9c102_request_buffers(cam, nbuffers, - cam->io)) { - cam->state |= DEV_MISCONFIGURED; - DBG(1, "VIDIOC_S_CROP failed because of not enough " - "memory. To use the camera, close and open " - "/dev/video%d again.", cam->v4ldev->minor) - return -ENOMEM; - } + /* Preserve R,G or B origin */ + rect->left = (s->_rect.left & 1L) ? rect->left | 1L : rect->left & ~1L; + rect->top = (s->_rect.top & 1L) ? rect->top | 1L : rect->top & ~1L; + + if (rect->width < 16) + rect->width = 16; + if (rect->height < 16) + rect->height = 16; + if (rect->width > bounds->width) + rect->width = bounds->width; + if (rect->height > bounds->height) + rect->height = bounds->height; + if (rect->left < bounds->left) + rect->left = bounds->left; + if (rect->top < bounds->top) + rect->top = bounds->top; + if (rect->left + rect->width > bounds->left + bounds->width) + rect->left = bounds->left+bounds->width - rect->width; + if (rect->top + rect->height > bounds->top + bounds->height) + rect->top = bounds->top+bounds->height - rect->height; + + rect->width &= ~15L; + rect->height &= ~15L; + + if (SN9C102_PRESERVE_IMGSCALE) { + /* Calculate the actual scaling factor */ + u32 a, b; + a = rect->width * rect->height; + b = pix_format->width * pix_format->height; + scale = b ? (u8)((a / b) < 4 ? 1 : ((a / b) < 16 ? 2 : 4)) : 1; + } else + scale = 1; + + if (cam->stream == STREAM_ON) + if ((err = sn9c102_stream_interrupt(cam))) + return err; + if (copy_to_user(arg, &crop, sizeof(crop))) { cam->stream = stream; - - return 0; + return -EFAULT; } - case VIDIOC_ENUM_FMT: - { - struct v4l2_fmtdesc fmtd; - - if (copy_from_user(&fmtd, arg, sizeof(fmtd))) - return -EFAULT; + if (cam->module_param.force_munmap || cam->io == IO_READ) + sn9c102_release_buffers(cam); - if (fmtd.index == 0) { - strcpy(fmtd.description, "bayer rgb"); - fmtd.pixelformat = V4L2_PIX_FMT_SBGGR8; - } else if (fmtd.index == 1) { - strcpy(fmtd.description, "compressed"); - fmtd.pixelformat = V4L2_PIX_FMT_SN9C10X; - fmtd.flags = V4L2_FMT_FLAG_COMPRESSED; - } else - return -EINVAL; + err = sn9c102_set_crop(cam, rect); + if (s->set_crop) + err += s->set_crop(cam, rect); + err += sn9c102_set_scale(cam, scale); - fmtd.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; - memset(&fmtd.reserved, 0, sizeof(fmtd.reserved)); + if (err) { /* atomic, no rollback in ioctl() */ + cam->state |= DEV_MISCONFIGURED; + DBG(1, "VIDIOC_S_CROP failed because of hardware problems. To " + "use the camera, close and open /dev/video%d again.", + cam->v4ldev->minor); + return -EIO; + } - if (copy_to_user(arg, &fmtd, sizeof(fmtd))) - return -EFAULT; + s->pix_format.width = rect->width/scale; + s->pix_format.height = rect->height/scale; + memcpy(&(s->_rect), rect, sizeof(*rect)); - return 0; + if ((cam->module_param.force_munmap || cam->io == IO_READ) && + nbuffers != sn9c102_request_buffers(cam, nbuffers, cam->io)) { + cam->state |= DEV_MISCONFIGURED; + DBG(1, "VIDIOC_S_CROP failed because of not enough memory. To " + "use the camera, close and open /dev/video%d again.", + cam->v4ldev->minor); + return -ENOMEM; } - case VIDIOC_G_FMT: - { - struct v4l2_format format; - struct v4l2_pix_format* pfmt = &(cam->sensor->pix_format); + if (cam->io == IO_READ) + sn9c102_empty_framequeues(cam); + else if (cam->module_param.force_munmap) + sn9c102_requeue_outqueue(cam); - if (copy_from_user(&format, arg, sizeof(format))) - return -EFAULT; + cam->stream = stream; - if (format.type != V4L2_BUF_TYPE_VIDEO_CAPTURE) - return -EINVAL; + return 0; +} - pfmt->bytesperline = (pfmt->pixelformat==V4L2_PIX_FMT_SN9C10X) - ? 0 : (pfmt->width * pfmt->priv) / 8; - pfmt->sizeimage = pfmt->height * ((pfmt->width*pfmt->priv)/8); - pfmt->field = V4L2_FIELD_NONE; - memcpy(&(format.fmt.pix), pfmt, sizeof(*pfmt)); - if (copy_to_user(arg, &format, sizeof(format))) - return -EFAULT; +static int +sn9c102_vidioc_enum_fmt(struct sn9c102_device* cam, void __user * arg) +{ + struct v4l2_fmtdesc fmtd; - return 0; - } + if (copy_from_user(&fmtd, arg, sizeof(fmtd))) + return -EFAULT; - case VIDIOC_TRY_FMT: - case VIDIOC_S_FMT: - { - struct sn9c102_sensor* s = cam->sensor; - struct v4l2_format format; - struct v4l2_pix_format* pix; - struct v4l2_pix_format* pfmt = &(s->pix_format); - struct v4l2_rect* bounds = &(s->cropcap.bounds); - struct v4l2_rect rect; - u8 scale; - const enum sn9c102_stream_state stream = cam->stream; - const u32 nbuffers = cam->nbuffers; - u32 i; - int err = 0; - - if (copy_from_user(&format, arg, sizeof(format))) - return -EFAULT; + if (fmtd.index == 0) { + strcpy(fmtd.description, "bayer rgb"); + fmtd.pixelformat = V4L2_PIX_FMT_SBGGR8; + } else if (fmtd.index == 1) { + strcpy(fmtd.description, "compressed"); + fmtd.pixelformat = V4L2_PIX_FMT_SN9C10X; + fmtd.flags = V4L2_FMT_FLAG_COMPRESSED; + } else + return -EINVAL; - pix = &(format.fmt.pix); + fmtd.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; + memset(&fmtd.reserved, 0, sizeof(fmtd.reserved)); - if (format.type != V4L2_BUF_TYPE_VIDEO_CAPTURE) - return -EINVAL; + if (copy_to_user(arg, &fmtd, sizeof(fmtd))) + return -EFAULT; - memcpy(&rect, &(s->_rect), sizeof(rect)); + return 0; +} - { /* calculate the actual scaling factor */ - u32 a, b; - a = rect.width * rect.height; - b = pix->width * pix->height; - scale = b ? (u8)((a / b) < 4 ? 1 : - ((a / b) < 16 ? 2 : 4)) : 1; - } - rect.width = scale * pix->width; - rect.height = scale * pix->height; - - if (rect.width < 16) - rect.width = 16; - if (rect.height < 16) - rect.height = 16; - if (rect.width > bounds->left + bounds->width - rect.left) - rect.width = bounds->left + bounds->width - rect.left; - if (rect.height > bounds->top + bounds->height - rect.top) - rect.height = bounds->top + bounds->height - rect.top; - - rect.width &= ~15L; - rect.height &= ~15L; - - { /* adjust the scaling factor */ - u32 a, b; - a = rect.width * rect.height; - b = pix->width * pix->height; - scale = b ? (u8)((a / b) < 4 ? 1 : - ((a / b) < 16 ? 2 : 4)) : 1; - } +static int +sn9c102_vidioc_g_fmt(struct sn9c102_device* cam, void __user * arg) +{ + struct v4l2_format format; + struct v4l2_pix_format* pfmt = &(cam->sensor->pix_format); - pix->width = rect.width / scale; - pix->height = rect.height / scale; - - if (pix->pixelformat != V4L2_PIX_FMT_SN9C10X && - pix->pixelformat != V4L2_PIX_FMT_SBGGR8) - pix->pixelformat = pfmt->pixelformat; - pix->priv = pfmt->priv; /* bpp */ - pix->colorspace = pfmt->colorspace; - pix->bytesperline = (pix->pixelformat == V4L2_PIX_FMT_SN9C10X) - ? 0 : (pix->width * pix->priv) / 8; - pix->sizeimage = pix->height * ((pix->width * pix->priv) / 8); - pix->field = V4L2_FIELD_NONE; - - if (cmd == VIDIOC_TRY_FMT) { - if (copy_to_user(arg, &format, sizeof(format))) - return -EFAULT; - return 0; - } + if (copy_from_user(&format, arg, sizeof(format))) + return -EFAULT; - if (cam->module_param.force_munmap) - for (i = 0; i < cam->nbuffers; i++) - if (cam->frame[i].vma_use_count) { - DBG(3, "VIDIOC_S_FMT failed. " - "Unmap the buffers first.") - return -EINVAL; - } + if (format.type != V4L2_BUF_TYPE_VIDEO_CAPTURE) + return -EINVAL; - if (cam->stream == STREAM_ON) - if ((err = sn9c102_stream_interrupt(cam))) - return err; + pfmt->bytesperline = (pfmt->pixelformat==V4L2_PIX_FMT_SN9C10X) + ? 0 : (pfmt->width * pfmt->priv) / 8; + pfmt->sizeimage = pfmt->height * ((pfmt->width*pfmt->priv)/8); + pfmt->field = V4L2_FIELD_NONE; + memcpy(&(format.fmt.pix), pfmt, sizeof(*pfmt)); - if (copy_to_user(arg, &format, sizeof(format))) { - cam->stream = stream; - return -EFAULT; - } + if (copy_to_user(arg, &format, sizeof(format))) + return -EFAULT; - if (cam->module_param.force_munmap || cam->io == IO_READ) - sn9c102_release_buffers(cam); - - err += sn9c102_set_pix_format(cam, pix); - err += sn9c102_set_crop(cam, &rect); - if (s->set_pix_format) - err += s->set_pix_format(cam, pix); - if (s->set_crop) - err += s->set_crop(cam, &rect); - err += sn9c102_set_scale(cam, scale); - - if (err) { /* atomic, no rollback in ioctl() */ - cam->state |= DEV_MISCONFIGURED; - DBG(1, "VIDIOC_S_FMT failed because of hardware " - "problems. To use the camera, close and open " - "/dev/video%d again.", cam->v4ldev->minor) - return -EIO; - } + return 0; +} - memcpy(pfmt, pix, sizeof(*pix)); - memcpy(&(s->_rect), &rect, sizeof(rect)); - if ((cam->module_param.force_munmap || cam->io == IO_READ) && - nbuffers != sn9c102_request_buffers(cam, nbuffers, - cam->io)) { - cam->state |= DEV_MISCONFIGURED; - DBG(1, "VIDIOC_S_FMT failed because of not enough " - "memory. To use the camera, close and open " - "/dev/video%d again.", cam->v4ldev->minor) - return -ENOMEM; - } +static int +sn9c102_vidioc_try_s_fmt(struct sn9c102_device* cam, unsigned int cmd, + void __user * arg) +{ + struct sn9c102_sensor* s = cam->sensor; + struct v4l2_format format; + struct v4l2_pix_format* pix; + struct v4l2_pix_format* pfmt = &(s->pix_format); + struct v4l2_rect* bounds = &(s->cropcap.bounds); + struct v4l2_rect rect; + u8 scale; + const enum sn9c102_stream_state stream = cam->stream; + const u32 nbuffers = cam->nbuffers; + u32 i; + int err = 0; - cam->stream = stream; + if (copy_from_user(&format, arg, sizeof(format))) + return -EFAULT; - return 0; - } + pix = &(format.fmt.pix); - case VIDIOC_G_JPEGCOMP: - { - if (copy_to_user(arg, &cam->compression, - sizeof(cam->compression))) - return -EFAULT; + if (format.type != V4L2_BUF_TYPE_VIDEO_CAPTURE) + return -EINVAL; - return 0; - } + memcpy(&rect, &(s->_rect), sizeof(rect)); - case VIDIOC_S_JPEGCOMP: - { - struct v4l2_jpegcompression jc; - const enum sn9c102_stream_state stream = cam->stream; - int err = 0; + { /* calculate the actual scaling factor */ + u32 a, b; + a = rect.width * rect.height; + b = pix->width * pix->height; + scale = b ? (u8)((a / b) < 4 ? 1 : ((a / b) < 16 ? 2 : 4)) : 1; + } - if (copy_from_user(&jc, arg, sizeof(jc))) - return -EFAULT; + rect.width = scale * pix->width; + rect.height = scale * pix->height; - if (jc.quality != 0 && jc.quality != 1) - return -EINVAL; + if (rect.width < 16) + rect.width = 16; + if (rect.height < 16) + rect.height = 16; + if (rect.width > bounds->left + bounds->width - rect.left) + rect.width = bounds->left + bounds->width - rect.left; + if (rect.height > bounds->top + bounds->height - rect.top) + rect.height = bounds->top + bounds->height - rect.top; - if (cam->stream == STREAM_ON) - if ((err = sn9c102_stream_interrupt(cam))) - return err; + rect.width &= ~15L; + rect.height &= ~15L; - err += sn9c102_set_compression(cam, &jc); - if (err) { /* atomic, no rollback in ioctl() */ - cam->state |= DEV_MISCONFIGURED; - DBG(1, "VIDIOC_S_JPEGCOMP failed because of hardware " - "problems. To use the camera, close and open " - "/dev/video%d again.", cam->v4ldev->minor) - return -EIO; - } + { /* adjust the scaling factor */ + u32 a, b; + a = rect.width * rect.height; + b = pix->width * pix->height; + scale = b ? (u8)((a / b) < 4 ? 1 : ((a / b) < 16 ? 2 : 4)) : 1; + } - cam->compression.quality = jc.quality; + pix->width = rect.width / scale; + pix->height = rect.height / scale; - cam->stream = stream; + if (pix->pixelformat != V4L2_PIX_FMT_SN9C10X && + pix->pixelformat != V4L2_PIX_FMT_SBGGR8) + pix->pixelformat = pfmt->pixelformat; + pix->priv = pfmt->priv; /* bpp */ + pix->colorspace = pfmt->colorspace; + pix->bytesperline = (pix->pixelformat == V4L2_PIX_FMT_SN9C10X) + ? 0 : (pix->width * pix->priv) / 8; + pix->sizeimage = pix->height * ((pix->width * pix->priv) / 8); + pix->field = V4L2_FIELD_NONE; + if (cmd == VIDIOC_TRY_FMT) { + if (copy_to_user(arg, &format, sizeof(format))) + return -EFAULT; return 0; } - case VIDIOC_REQBUFS: - { - struct v4l2_requestbuffers rb; - u32 i; - int err; - - if (copy_from_user(&rb, arg, sizeof(rb))) - return -EFAULT; - - if (rb.type != V4L2_BUF_TYPE_VIDEO_CAPTURE || - rb.memory != V4L2_MEMORY_MMAP) - return -EINVAL; - - if (cam->io == IO_READ) { - DBG(3, "Close and open the device again to choose " - "the mmap I/O method") - return -EINVAL; - } - + if (cam->module_param.force_munmap) for (i = 0; i < cam->nbuffers; i++) if (cam->frame[i].vma_use_count) { - DBG(3, "VIDIOC_REQBUFS failed. " - "Previous buffers are still mapped.") + DBG(3, "VIDIOC_S_FMT failed. Unmap the " + "buffers first."); return -EINVAL; } - if (cam->stream == STREAM_ON) - if ((err = sn9c102_stream_interrupt(cam))) - return err; + if (cam->stream == STREAM_ON) + if ((err = sn9c102_stream_interrupt(cam))) + return err; - sn9c102_empty_framequeues(cam); + if (copy_to_user(arg, &format, sizeof(format))) { + cam->stream = stream; + return -EFAULT; + } + if (cam->module_param.force_munmap || cam->io == IO_READ) sn9c102_release_buffers(cam); - if (rb.count) - rb.count = sn9c102_request_buffers(cam, rb.count, - IO_MMAP); - if (copy_to_user(arg, &rb, sizeof(rb))) { - sn9c102_release_buffers(cam); - cam->io = IO_NONE; - return -EFAULT; - } + err += sn9c102_set_pix_format(cam, pix); + err += sn9c102_set_crop(cam, &rect); + if (s->set_pix_format) + err += s->set_pix_format(cam, pix); + if (s->set_crop) + err += s->set_crop(cam, &rect); + err += sn9c102_set_scale(cam, scale); + + if (err) { /* atomic, no rollback in ioctl() */ + cam->state |= DEV_MISCONFIGURED; + DBG(1, "VIDIOC_S_FMT failed because of hardware problems. To " + "use the camera, close and open /dev/video%d again.", + cam->v4ldev->minor); + return -EIO; + } - cam->io = rb.count ? IO_MMAP : IO_NONE; + memcpy(pfmt, pix, sizeof(*pix)); + memcpy(&(s->_rect), &rect, sizeof(rect)); - return 0; + if ((cam->module_param.force_munmap || cam->io == IO_READ) && + nbuffers != sn9c102_request_buffers(cam, nbuffers, cam->io)) { + cam->state |= DEV_MISCONFIGURED; + DBG(1, "VIDIOC_S_FMT failed because of not enough memory. To " + "use the camera, close and open /dev/video%d again.", + cam->v4ldev->minor); + return -ENOMEM; } - case VIDIOC_QUERYBUF: - { - struct v4l2_buffer b; + if (cam->io == IO_READ) + sn9c102_empty_framequeues(cam); + else if (cam->module_param.force_munmap) + sn9c102_requeue_outqueue(cam); - if (copy_from_user(&b, arg, sizeof(b))) - return -EFAULT; + cam->stream = stream; - if (b.type != V4L2_BUF_TYPE_VIDEO_CAPTURE || - b.index >= cam->nbuffers || cam->io != IO_MMAP) - return -EINVAL; + return 0; +} - memcpy(&b, &cam->frame[b.index].buf, sizeof(b)); - if (cam->frame[b.index].vma_use_count) - b.flags |= V4L2_BUF_FLAG_MAPPED; +static int +sn9c102_vidioc_g_jpegcomp(struct sn9c102_device* cam, void __user * arg) +{ + if (copy_to_user(arg, &cam->compression, + sizeof(cam->compression))) + return -EFAULT; - if (cam->frame[b.index].state == F_DONE) - b.flags |= V4L2_BUF_FLAG_DONE; - else if (cam->frame[b.index].state != F_UNUSED) - b.flags |= V4L2_BUF_FLAG_QUEUED; + return 0; +} - if (copy_to_user(arg, &b, sizeof(b))) - return -EFAULT; - return 0; +static int +sn9c102_vidioc_s_jpegcomp(struct sn9c102_device* cam, void __user * arg) +{ + struct v4l2_jpegcompression jc; + const enum sn9c102_stream_state stream = cam->stream; + int err = 0; + + if (copy_from_user(&jc, arg, sizeof(jc))) + return -EFAULT; + + if (jc.quality != 0 && jc.quality != 1) + return -EINVAL; + + if (cam->stream == STREAM_ON) + if ((err = sn9c102_stream_interrupt(cam))) + return err; + + err += sn9c102_set_compression(cam, &jc); + if (err) { /* atomic, no rollback in ioctl() */ + cam->state |= DEV_MISCONFIGURED; + DBG(1, "VIDIOC_S_JPEGCOMP failed because of hardware " + "problems. To use the camera, close and open " + "/dev/video%d again.", cam->v4ldev->minor); + return -EIO; } - case VIDIOC_QBUF: - { - struct v4l2_buffer b; - unsigned long lock_flags; + cam->compression.quality = jc.quality; - if (copy_from_user(&b, arg, sizeof(b))) - return -EFAULT; + cam->stream = stream; - if (b.type != V4L2_BUF_TYPE_VIDEO_CAPTURE || - b.index >= cam->nbuffers || cam->io != IO_MMAP) - return -EINVAL; + return 0; +} + + +static int +sn9c102_vidioc_reqbufs(struct sn9c102_device* cam, void __user * arg) +{ + struct v4l2_requestbuffers rb; + u32 i; + int err; + + if (copy_from_user(&rb, arg, sizeof(rb))) + return -EFAULT; + + if (rb.type != V4L2_BUF_TYPE_VIDEO_CAPTURE || + rb.memory != V4L2_MEMORY_MMAP) + return -EINVAL; - if (cam->frame[b.index].state != F_UNUSED) + if (cam->io == IO_READ) { + DBG(3, "Close and open the device again to choose the mmap " + "I/O method"); + return -EINVAL; + } + + for (i = 0; i < cam->nbuffers; i++) + if (cam->frame[i].vma_use_count) { + DBG(3, "VIDIOC_REQBUFS failed. Previous buffers are " + "still mapped."); return -EINVAL; + } - cam->frame[b.index].state = F_QUEUED; + if (cam->stream == STREAM_ON) + if ((err = sn9c102_stream_interrupt(cam))) + return err; - spin_lock_irqsave(&cam->queue_lock, lock_flags); - list_add_tail(&cam->frame[b.index].frame, &cam->inqueue); - spin_unlock_irqrestore(&cam->queue_lock, lock_flags); + sn9c102_empty_framequeues(cam); - PDBGG("Frame #%lu queued", (unsigned long)b.index) + sn9c102_release_buffers(cam); + if (rb.count) + rb.count = sn9c102_request_buffers(cam, rb.count, IO_MMAP); - return 0; + if (copy_to_user(arg, &rb, sizeof(rb))) { + sn9c102_release_buffers(cam); + cam->io = IO_NONE; + return -EFAULT; } - case VIDIOC_DQBUF: - { - struct v4l2_buffer b; - struct sn9c102_frame_t *f; - unsigned long lock_flags; - int err = 0; + cam->io = rb.count ? IO_MMAP : IO_NONE; - if (copy_from_user(&b, arg, sizeof(b))) - return -EFAULT; + return 0; +} - if (b.type != V4L2_BUF_TYPE_VIDEO_CAPTURE || cam->io!= IO_MMAP) - return -EINVAL; - if (list_empty(&cam->outqueue)) { - if (cam->stream == STREAM_OFF) - return -EINVAL; - if (filp->f_flags & O_NONBLOCK) - return -EAGAIN; - err = wait_event_interruptible - ( cam->wait_frame, - (!list_empty(&cam->outqueue)) || - (cam->state & DEV_DISCONNECTED) || - (cam->state & DEV_MISCONFIGURED) ); - if (err) - return err; - if (cam->state & DEV_DISCONNECTED) - return -ENODEV; - if (cam->state & DEV_MISCONFIGURED) - return -EIO; - } +static int +sn9c102_vidioc_querybuf(struct sn9c102_device* cam, void __user * arg) +{ + struct v4l2_buffer b; - spin_lock_irqsave(&cam->queue_lock, lock_flags); - f = list_entry(cam->outqueue.next, struct sn9c102_frame_t, - frame); - list_del(cam->outqueue.next); - spin_unlock_irqrestore(&cam->queue_lock, lock_flags); + if (copy_from_user(&b, arg, sizeof(b))) + return -EFAULT; - f->state = F_UNUSED; + if (b.type != V4L2_BUF_TYPE_VIDEO_CAPTURE || + b.index >= cam->nbuffers || cam->io != IO_MMAP) + return -EINVAL; - memcpy(&b, &f->buf, sizeof(b)); - if (f->vma_use_count) - b.flags |= V4L2_BUF_FLAG_MAPPED; + memcpy(&b, &cam->frame[b.index].buf, sizeof(b)); - if (copy_to_user(arg, &b, sizeof(b))) - return -EFAULT; + if (cam->frame[b.index].vma_use_count) + b.flags |= V4L2_BUF_FLAG_MAPPED; - PDBGG("Frame #%lu dequeued", (unsigned long)f->buf.index) + if (cam->frame[b.index].state == F_DONE) + b.flags |= V4L2_BUF_FLAG_DONE; + else if (cam->frame[b.index].state != F_UNUSED) + b.flags |= V4L2_BUF_FLAG_QUEUED; - return 0; - } + if (copy_to_user(arg, &b, sizeof(b))) + return -EFAULT; - case VIDIOC_STREAMON: - { - int type; + return 0; +} - if (copy_from_user(&type, arg, sizeof(type))) - return -EFAULT; - if (type != V4L2_BUF_TYPE_VIDEO_CAPTURE || cam->io != IO_MMAP) - return -EINVAL; +static int +sn9c102_vidioc_qbuf(struct sn9c102_device* cam, void __user * arg) +{ + struct v4l2_buffer b; + unsigned long lock_flags; - if (list_empty(&cam->inqueue)) - return -EINVAL; + if (copy_from_user(&b, arg, sizeof(b))) + return -EFAULT; - cam->stream = STREAM_ON; + if (b.type != V4L2_BUF_TYPE_VIDEO_CAPTURE || + b.index >= cam->nbuffers || cam->io != IO_MMAP) + return -EINVAL; - DBG(3, "Stream on") + if (cam->frame[b.index].state != F_UNUSED) + return -EINVAL; - return 0; - } + cam->frame[b.index].state = F_QUEUED; - case VIDIOC_STREAMOFF: - { - int type, err; + spin_lock_irqsave(&cam->queue_lock, lock_flags); + list_add_tail(&cam->frame[b.index].frame, &cam->inqueue); + spin_unlock_irqrestore(&cam->queue_lock, lock_flags); - if (copy_from_user(&type, arg, sizeof(type))) - return -EFAULT; + PDBGG("Frame #%lu queued", (unsigned long)b.index); - if (type != V4L2_BUF_TYPE_VIDEO_CAPTURE || cam->io != IO_MMAP) - return -EINVAL; + return 0; +} - if (cam->stream == STREAM_ON) - if ((err = sn9c102_stream_interrupt(cam))) - return err; - sn9c102_empty_framequeues(cam); +static int +sn9c102_vidioc_dqbuf(struct sn9c102_device* cam, struct file* filp, + void __user * arg) +{ + struct v4l2_buffer b; + struct sn9c102_frame_t *f; + unsigned long lock_flags; + int err = 0; - DBG(3, "Stream off") + if (copy_from_user(&b, arg, sizeof(b))) + return -EFAULT; - return 0; + if (b.type != V4L2_BUF_TYPE_VIDEO_CAPTURE || cam->io != IO_MMAP) + return -EINVAL; + + if (list_empty(&cam->outqueue)) { + if (cam->stream == STREAM_OFF) + return -EINVAL; + if (filp->f_flags & O_NONBLOCK) + return -EAGAIN; + err = wait_event_interruptible + ( cam->wait_frame, + (!list_empty(&cam->outqueue)) || + (cam->state & DEV_DISCONNECTED) || + (cam->state & DEV_MISCONFIGURED) ); + if (err) + return err; + if (cam->state & DEV_DISCONNECTED) + return -ENODEV; + if (cam->state & DEV_MISCONFIGURED) + return -EIO; } - case VIDIOC_G_PARM: - { - struct v4l2_streamparm sp; + spin_lock_irqsave(&cam->queue_lock, lock_flags); + f = list_entry(cam->outqueue.next, struct sn9c102_frame_t, frame); + list_del(cam->outqueue.next); + spin_unlock_irqrestore(&cam->queue_lock, lock_flags); - if (copy_from_user(&sp, arg, sizeof(sp))) - return -EFAULT; + f->state = F_UNUSED; - if (sp.type != V4L2_BUF_TYPE_VIDEO_CAPTURE) - return -EINVAL; + memcpy(&b, &f->buf, sizeof(b)); + if (f->vma_use_count) + b.flags |= V4L2_BUF_FLAG_MAPPED; + + if (copy_to_user(arg, &b, sizeof(b))) + return -EFAULT; + + PDBGG("Frame #%lu dequeued", (unsigned long)f->buf.index); + + return 0; +} + + +static int +sn9c102_vidioc_streamon(struct sn9c102_device* cam, void __user * arg) +{ + int type; + + if (copy_from_user(&type, arg, sizeof(type))) + return -EFAULT; + + if (type != V4L2_BUF_TYPE_VIDEO_CAPTURE || cam->io != IO_MMAP) + return -EINVAL; + + if (list_empty(&cam->inqueue)) + return -EINVAL; + + cam->stream = STREAM_ON; + + DBG(3, "Stream on"); + + return 0; +} + + +static int +sn9c102_vidioc_streamoff(struct sn9c102_device* cam, void __user * arg) +{ + int type, err; + + if (copy_from_user(&type, arg, sizeof(type))) + return -EFAULT; + + if (type != V4L2_BUF_TYPE_VIDEO_CAPTURE || cam->io != IO_MMAP) + return -EINVAL; + + if (cam->stream == STREAM_ON) + if ((err = sn9c102_stream_interrupt(cam))) + return err; + + sn9c102_empty_framequeues(cam); + + DBG(3, "Stream off"); + + return 0; +} + + +static int +sn9c102_vidioc_g_parm(struct sn9c102_device* cam, void __user * arg) +{ + struct v4l2_streamparm sp; + + if (copy_from_user(&sp, arg, sizeof(sp))) + return -EFAULT; + + if (sp.type != V4L2_BUF_TYPE_VIDEO_CAPTURE) + return -EINVAL; + + sp.parm.capture.extendedmode = 0; + sp.parm.capture.readbuffers = cam->nreadbuffers; + + if (copy_to_user(arg, &sp, sizeof(sp))) + return -EFAULT; + + return 0; +} + + +static int +sn9c102_vidioc_s_parm(struct sn9c102_device* cam, void __user * arg) +{ + struct v4l2_streamparm sp; + + if (copy_from_user(&sp, arg, sizeof(sp))) + return -EFAULT; + + if (sp.type != V4L2_BUF_TYPE_VIDEO_CAPTURE) + return -EINVAL; - sp.parm.capture.extendedmode = 0; + sp.parm.capture.extendedmode = 0; + + if (sp.parm.capture.readbuffers == 0) sp.parm.capture.readbuffers = cam->nreadbuffers; - if (copy_to_user(arg, &sp, sizeof(sp))) - return -EFAULT; + if (sp.parm.capture.readbuffers > SN9C102_MAX_FRAMES) + sp.parm.capture.readbuffers = SN9C102_MAX_FRAMES; - return 0; - } + if (copy_to_user(arg, &sp, sizeof(sp))) + return -EFAULT; - case VIDIOC_S_PARM_OLD: - case VIDIOC_S_PARM: - { - struct v4l2_streamparm sp; + cam->nreadbuffers = sp.parm.capture.readbuffers; - if (copy_from_user(&sp, arg, sizeof(sp))) - return -EFAULT; + return 0; +} - if (sp.type != V4L2_BUF_TYPE_VIDEO_CAPTURE) - return -EINVAL; - sp.parm.capture.extendedmode = 0; +static int sn9c102_ioctl_v4l2(struct inode* inode, struct file* filp, + unsigned int cmd, void __user * arg) +{ + struct sn9c102_device* cam = video_get_drvdata(video_devdata(filp)); + + switch (cmd) { - if (sp.parm.capture.readbuffers == 0) - sp.parm.capture.readbuffers = cam->nreadbuffers; + case VIDIOC_QUERYCAP: + return sn9c102_vidioc_querycap(cam, arg); - if (sp.parm.capture.readbuffers > SN9C102_MAX_FRAMES) - sp.parm.capture.readbuffers = SN9C102_MAX_FRAMES; + case VIDIOC_ENUMINPUT: + return sn9c102_vidioc_enuminput(cam, arg); - if (copy_to_user(arg, &sp, sizeof(sp))) - return -EFAULT; + case VIDIOC_G_INPUT: + case VIDIOC_S_INPUT: + return sn9c102_vidioc_gs_input(cam, arg); - cam->nreadbuffers = sp.parm.capture.readbuffers; + case VIDIOC_QUERYCTRL: + return sn9c102_vidioc_query_ctrl(cam, arg); - return 0; - } + case VIDIOC_G_CTRL: + return sn9c102_vidioc_g_ctrl(cam, arg); + + case VIDIOC_S_CTRL_OLD: + case VIDIOC_S_CTRL: + return sn9c102_vidioc_s_ctrl(cam, arg); + + case VIDIOC_CROPCAP_OLD: + case VIDIOC_CROPCAP: + return sn9c102_vidioc_cropcap(cam, arg); + + case VIDIOC_G_CROP: + return sn9c102_vidioc_g_crop(cam, arg); + + case VIDIOC_S_CROP: + return sn9c102_vidioc_s_crop(cam, arg); + + case VIDIOC_ENUM_FMT: + return sn9c102_vidioc_enum_fmt(cam, arg); + + case VIDIOC_G_FMT: + return sn9c102_vidioc_g_fmt(cam, arg); + + case VIDIOC_TRY_FMT: + case VIDIOC_S_FMT: + return sn9c102_vidioc_try_s_fmt(cam, cmd, arg); + + case VIDIOC_G_JPEGCOMP: + return sn9c102_vidioc_g_jpegcomp(cam, arg); + + case VIDIOC_S_JPEGCOMP: + return sn9c102_vidioc_s_jpegcomp(cam, arg); + + case VIDIOC_REQBUFS: + return sn9c102_vidioc_reqbufs(cam, arg); + + case VIDIOC_QUERYBUF: + return sn9c102_vidioc_querybuf(cam, arg); + + case VIDIOC_QBUF: + return sn9c102_vidioc_qbuf(cam, arg); + + case VIDIOC_DQBUF: + return sn9c102_vidioc_dqbuf(cam, filp, arg); + + case VIDIOC_STREAMON: + return sn9c102_vidioc_streamon(cam, arg); + + case VIDIOC_STREAMOFF: + return sn9c102_vidioc_streamoff(cam, arg); + + case VIDIOC_G_PARM: + return sn9c102_vidioc_g_parm(cam, arg); + + case VIDIOC_S_PARM_OLD: + case VIDIOC_S_PARM: + return sn9c102_vidioc_s_parm(cam, arg); case VIDIOC_G_STD: case VIDIOC_S_STD: @@ -2502,17 +2659,20 @@ static int sn9c102_ioctl(struct inode* inode, struct file* filp, return -ERESTARTSYS; if (cam->state & DEV_DISCONNECTED) { - DBG(1, "Device not present") + DBG(1, "Device not present"); up(&cam->fileop_sem); return -ENODEV; } if (cam->state & DEV_MISCONFIGURED) { - DBG(1, "The camera is misconfigured. Close and open it again.") + DBG(1, "The camera is misconfigured. Close and open it " + "again."); up(&cam->fileop_sem); return -EIO; } + V4LDBG(3, "sn9c102", cmd); + err = sn9c102_ioctl_v4l2(inode, filp, cmd, (void __user *)arg); up(&cam->fileop_sem); @@ -2520,9 +2680,10 @@ static int sn9c102_ioctl(struct inode* inode, struct file* filp, return err; } +/*****************************************************************************/ static struct file_operations sn9c102_fops = { - .owner = THIS_MODULE, + .owner = THIS_MODULE, .open = sn9c102_open, .release = sn9c102_release, .ioctl = sn9c102_ioctl, @@ -2541,36 +2702,22 @@ sn9c102_usb_probe(struct usb_interface* intf, const struct usb_device_id* id) struct usb_device *udev = interface_to_usbdev(intf); struct sn9c102_device* cam; static unsigned int dev_nr = 0; - unsigned int i, n; + unsigned int i; int err = 0, r; - n = sizeof(sn9c102_id_table)/sizeof(sn9c102_id_table[0]); - for (i = 0; i < n-1; i++) - if (le16_to_cpu(udev->descriptor.idVendor) == - sn9c102_id_table[i].idVendor && - le16_to_cpu(udev->descriptor.idProduct) == - sn9c102_id_table[i].idProduct) - break; - if (i == n-1) - return -ENODEV; - - if (!(cam = kmalloc(sizeof(struct sn9c102_device), GFP_KERNEL))) + if (!(cam = kzalloc(sizeof(struct sn9c102_device), GFP_KERNEL))) return -ENOMEM; - memset(cam, 0, sizeof(*cam)); cam->usbdev = udev; - memcpy(&cam->dev, &udev->dev, sizeof(struct device)); - - if (!(cam->control_buffer = kmalloc(8, GFP_KERNEL))) { - DBG(1, "kmalloc() failed") + if (!(cam->control_buffer = kzalloc(8, GFP_KERNEL))) { + DBG(1, "kmalloc() failed"); err = -ENOMEM; goto fail; } - memset(cam->control_buffer, 0, 8); if (!(cam->v4ldev = video_device_alloc())) { - DBG(1, "video_device_alloc() failed") + DBG(1, "video_device_alloc() failed"); err = -ENOMEM; goto fail; } @@ -2580,25 +2727,22 @@ sn9c102_usb_probe(struct usb_interface* intf, const struct usb_device_id* id) r = sn9c102_read_reg(cam, 0x00); if (r < 0 || r != 0x10) { DBG(1, "Sorry, this is not a SN9C10x based camera " - "(vid/pid 0x%04X/0x%04X)", - sn9c102_id_table[i].idVendor,sn9c102_id_table[i].idProduct) + "(vid/pid 0x%04X/0x%04X)", id->idVendor, id->idProduct); err = -ENODEV; goto fail; } - cam->bridge = (sn9c102_id_table[i].idProduct & 0xffc0) == 0x6080 ? + cam->bridge = (id->idProduct & 0xffc0) == 0x6080 ? BRIDGE_SN9C103 : BRIDGE_SN9C102; switch (cam->bridge) { case BRIDGE_SN9C101: case BRIDGE_SN9C102: DBG(2, "SN9C10[12] PC Camera Controller detected " - "(vid/pid 0x%04X/0x%04X)", sn9c102_id_table[i].idVendor, - sn9c102_id_table[i].idProduct) + "(vid/pid 0x%04X/0x%04X)", id->idVendor, id->idProduct); break; case BRIDGE_SN9C103: DBG(2, "SN9C103 PC Camera Controller detected " - "(vid/pid 0x%04X/0x%04X)", sn9c102_id_table[i].idVendor, - sn9c102_id_table[i].idProduct) + "(vid/pid 0x%04X/0x%04X)", id->idVendor, id->idProduct); break; } @@ -2609,24 +2753,24 @@ sn9c102_usb_probe(struct usb_interface* intf, const struct usb_device_id* id) } if (!err && cam->sensor) { - DBG(2, "%s image sensor detected", cam->sensor->name) + DBG(2, "%s image sensor detected", cam->sensor->name); DBG(3, "Support for %s maintained by %s", - cam->sensor->name, cam->sensor->maintainer) + cam->sensor->name, cam->sensor->maintainer); } else { - DBG(1, "No supported image sensor detected") + DBG(1, "No supported image sensor detected"); err = -ENODEV; goto fail; } if (sn9c102_init(cam)) { - DBG(1, "Initialization failed. I will retry on open().") + DBG(1, "Initialization failed. I will retry on open()."); cam->state |= DEV_MISCONFIGURED; } strcpy(cam->v4ldev->name, "SN9C10x PC Camera"); cam->v4ldev->owner = THIS_MODULE; cam->v4ldev->type = VID_TYPE_CAPTURE | VID_TYPE_SCALES; - cam->v4ldev->hardware = VID_HARDWARE_SN9C102; + cam->v4ldev->hardware = 0; cam->v4ldev->fops = &sn9c102_fops; cam->v4ldev->minor = video_nr[dev_nr]; cam->v4ldev->release = video_device_release; @@ -2637,23 +2781,25 @@ sn9c102_usb_probe(struct usb_interface* intf, const struct usb_device_id* id) err = video_register_device(cam->v4ldev, VFL_TYPE_GRABBER, video_nr[dev_nr]); if (err) { - DBG(1, "V4L2 device registration failed") + DBG(1, "V4L2 device registration failed"); if (err == -ENFILE && video_nr[dev_nr] == -1) - DBG(1, "Free /dev/videoX node not found") + DBG(1, "Free /dev/videoX node not found"); video_nr[dev_nr] = -1; dev_nr = (dev_nr < SN9C102_MAX_DEVICES-1) ? dev_nr+1 : 0; up(&cam->dev_sem); goto fail; } - DBG(2, "V4L2 device registered as /dev/video%d", cam->v4ldev->minor) + DBG(2, "V4L2 device registered as /dev/video%d", cam->v4ldev->minor); cam->module_param.force_munmap = force_munmap[dev_nr]; dev_nr = (dev_nr < SN9C102_MAX_DEVICES-1) ? dev_nr+1 : 0; +#ifdef CONFIG_VIDEO_ADV_DEBUG sn9c102_create_sysfs(cam); - DBG(2, "Optional device control through 'sysfs' interface ready") + DBG(2, "Optional device control through 'sysfs' interface ready"); +#endif usb_set_intfdata(intf, cam); @@ -2683,14 +2829,14 @@ static void sn9c102_usb_disconnect(struct usb_interface* intf) down(&cam->dev_sem); - DBG(2, "Disconnecting %s...", cam->v4ldev->name) + DBG(2, "Disconnecting %s...", cam->v4ldev->name); wake_up_interruptible_all(&cam->open); if (cam->users) { DBG(2, "Device /dev/video%d is open! Deregistration and " "memory deallocation are deferred on close.", - cam->v4ldev->minor) + cam->v4ldev->minor); cam->state |= DEV_MISCONFIGURED; sn9c102_stop_transfer(cam); cam->state |= DEV_DISCONNECTED; @@ -2711,7 +2857,6 @@ static void sn9c102_usb_disconnect(struct usb_interface* intf) static struct usb_driver sn9c102_usb_driver = { - .owner = THIS_MODULE, .name = "sn9c102", .id_table = sn9c102_id_table, .probe = sn9c102_usb_probe, @@ -2724,11 +2869,11 @@ static int __init sn9c102_module_init(void) { int err = 0; - KDBG(2, SN9C102_MODULE_NAME " v" SN9C102_MODULE_VERSION) - KDBG(3, SN9C102_MODULE_AUTHOR) + KDBG(2, SN9C102_MODULE_NAME " v" SN9C102_MODULE_VERSION); + KDBG(3, SN9C102_MODULE_AUTHOR); if ((err = usb_register(&sn9c102_usb_driver))) - KDBG(1, "usb_register() failed") + KDBG(1, "usb_register() failed"); return err; } diff --git a/drivers/usb/media/sn9c102_hv7131d.c b/drivers/usb/media/sn9c102_hv7131d.c index 18070d533..46c12ec3c 100644 --- a/drivers/usb/media/sn9c102_hv7131d.c +++ b/drivers/usb/media/sn9c102_hv7131d.c @@ -2,7 +2,7 @@ * Plug-in for HV7131D image sensor connected to the SN9C10x PC Camera * * Controllers * * * - * Copyright (C) 2004-2005 by Luca Risolia * + * Copyright (C) 2004-2006 by Luca Risolia * * * * This 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/usb/media/sn9c102_mi0343.c b/drivers/usb/media/sn9c102_mi0343.c index 86676abf3..d9aa7a610 100644 --- a/drivers/usb/media/sn9c102_mi0343.c +++ b/drivers/usb/media/sn9c102_mi0343.c @@ -2,7 +2,7 @@ * Plug-in for MI-0343 image sensor connected to the SN9C10x PC Camera * * Controllers * * * - * Copyright (C) 2004-2005 by Luca Risolia * + * Copyright (C) 2004-2006 by Luca Risolia * * * * This 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/usb/media/sn9c102_pas106b.c b/drivers/usb/media/sn9c102_pas106b.c index 48e3ec39d..b1dee78ab 100644 --- a/drivers/usb/media/sn9c102_pas106b.c +++ b/drivers/usb/media/sn9c102_pas106b.c @@ -2,7 +2,7 @@ * Plug-in for PAS106B image sensor connected to the SN9C10x PC Camera * * Controllers * * * - * Copyright (C) 2004-2005 by Luca Risolia * + * Copyright (C) 2004-2006 by Luca Risolia * * * * This 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/usb/media/sn9c102_sensor.h b/drivers/usb/media/sn9c102_sensor.h index 6a7adebcb..7d953b24f 100644 --- a/drivers/usb/media/sn9c102_sensor.h +++ b/drivers/usb/media/sn9c102_sensor.h @@ -1,7 +1,7 @@ /*************************************************************************** * API for image sensors connected to the SN9C10x PC Camera Controllers * * * - * Copyright (C) 2004-2005 by Luca Risolia * + * Copyright (C) 2004-2006 by Luca Risolia * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * @@ -64,6 +64,7 @@ struct sn9c102_sensor; */ extern int sn9c102_probe_hv7131d(struct sn9c102_device* cam); extern int sn9c102_probe_mi0343(struct sn9c102_device* cam); +extern int sn9c102_probe_ov7630(struct sn9c102_device* cam); extern int sn9c102_probe_pas106b(struct sn9c102_device* cam); extern int sn9c102_probe_pas202bcb(struct sn9c102_device* cam); extern int sn9c102_probe_tas5110c1b(struct sn9c102_device* cam); @@ -80,6 +81,7 @@ static int (*sn9c102_sensor_table[])(struct sn9c102_device*) = { \ &sn9c102_probe_pas106b, /* strong detection based on SENSOR ids */ \ &sn9c102_probe_pas202bcb, /* strong detection based on SENSOR ids */ \ &sn9c102_probe_hv7131d, /* strong detection based on SENSOR ids */ \ + &sn9c102_probe_ov7630, /* detection mostly based on USB pid/vid */ \ &sn9c102_probe_tas5110c1b, /* detection based on USB pid/vid */ \ &sn9c102_probe_tas5130d1b, /* detection based on USB pid/vid */ \ NULL, \ @@ -90,7 +92,18 @@ extern void sn9c102_attach_sensor(struct sn9c102_device* cam, struct sn9c102_sensor* sensor); -/* Each SN9C10X camera has proper PID/VID identifiers. Add them here in case.*/ +/* + Each SN9C10x camera has proper PID/VID identifiers. + SN9C103 supports multiple interfaces, but we only handle the video class + interface. +*/ +#define SN9C102_USB_DEVICE(vend, prod, intclass) \ + .match_flags = USB_DEVICE_ID_MATCH_DEVICE | \ + USB_DEVICE_ID_MATCH_INT_CLASS, \ + .idVendor = (vend), \ + .idProduct = (prod), \ + .bInterfaceClass = (intclass) + #define SN9C102_ID_TABLE \ static const struct usb_device_id sn9c102_id_table[] = { \ { USB_DEVICE(0x0c45, 0x6001), }, /* TAS5110C1B */ \ @@ -103,34 +116,36 @@ static const struct usb_device_id sn9c102_id_table[] = { \ { USB_DEVICE(0x0c45, 0x6029), }, /* PAS106B */ \ { USB_DEVICE(0x0c45, 0x602a), }, /* HV7131D */ \ { USB_DEVICE(0x0c45, 0x602b), }, /* MI-0343 */ \ - { USB_DEVICE(0x0c45, 0x602c), }, /* OV7620 */ \ + { USB_DEVICE(0x0c45, 0x602c), }, /* OV7630 */ \ + { USB_DEVICE(0x0c45, 0x602d), }, \ + { USB_DEVICE(0x0c45, 0x602e), }, /* OV7630 */ \ { USB_DEVICE(0x0c45, 0x6030), }, /* MI03x */ \ - { USB_DEVICE(0x0c45, 0x6080), }, \ - { USB_DEVICE(0x0c45, 0x6082), }, /* MI0343 and MI0360 */ \ - { USB_DEVICE(0x0c45, 0x6083), }, /* HV7131[D|E1] */ \ - { USB_DEVICE(0x0c45, 0x6088), }, \ - { USB_DEVICE(0x0c45, 0x608a), }, \ - { USB_DEVICE(0x0c45, 0x608b), }, \ - { USB_DEVICE(0x0c45, 0x608c), }, /* HV7131x */ \ - { USB_DEVICE(0x0c45, 0x608e), }, /* CIS-VF10 */ \ - { USB_DEVICE(0x0c45, 0x608f), }, /* OV7630 */ \ - { USB_DEVICE(0x0c45, 0x60a0), }, \ - { USB_DEVICE(0x0c45, 0x60a2), }, \ - { USB_DEVICE(0x0c45, 0x60a3), }, \ - { USB_DEVICE(0x0c45, 0x60a8), }, /* PAS106B */ \ - { USB_DEVICE(0x0c45, 0x60aa), }, /* TAS5130D1B */ \ - { USB_DEVICE(0x0c45, 0x60ab), }, /* TAS5110C1B */ \ - { USB_DEVICE(0x0c45, 0x60ac), }, \ - { USB_DEVICE(0x0c45, 0x60ae), }, \ - { USB_DEVICE(0x0c45, 0x60af), }, /* PAS202BCB */ \ - { USB_DEVICE(0x0c45, 0x60b0), }, \ - { USB_DEVICE(0x0c45, 0x60b2), }, \ - { USB_DEVICE(0x0c45, 0x60b3), }, \ - { USB_DEVICE(0x0c45, 0x60b8), }, \ - { USB_DEVICE(0x0c45, 0x60ba), }, \ - { USB_DEVICE(0x0c45, 0x60bb), }, \ - { USB_DEVICE(0x0c45, 0x60bc), }, \ - { USB_DEVICE(0x0c45, 0x60be), }, \ + { SN9C102_USB_DEVICE(0x0c45, 0x6080, 0xff), }, \ + { SN9C102_USB_DEVICE(0x0c45, 0x6082, 0xff), }, /* MI0343 & MI0360 */ \ + { SN9C102_USB_DEVICE(0x0c45, 0x6083, 0xff), }, /* HV7131[D|E1] */ \ + { SN9C102_USB_DEVICE(0x0c45, 0x6088, 0xff), }, \ + { SN9C102_USB_DEVICE(0x0c45, 0x608a, 0xff), }, \ + { SN9C102_USB_DEVICE(0x0c45, 0x608b, 0xff), }, \ + { SN9C102_USB_DEVICE(0x0c45, 0x608c, 0xff), }, /* HV7131x */ \ + { SN9C102_USB_DEVICE(0x0c45, 0x608e, 0xff), }, /* CIS-VF10 */ \ + { SN9C102_USB_DEVICE(0x0c45, 0x608f, 0xff), }, /* OV7630 */ \ + { SN9C102_USB_DEVICE(0x0c45, 0x60a0, 0xff), }, \ + { SN9C102_USB_DEVICE(0x0c45, 0x60a2, 0xff), }, \ + { SN9C102_USB_DEVICE(0x0c45, 0x60a3, 0xff), }, \ + { SN9C102_USB_DEVICE(0x0c45, 0x60a8, 0xff), }, /* PAS106B */ \ + { SN9C102_USB_DEVICE(0x0c45, 0x60aa, 0xff), }, /* TAS5130D1B */ \ + { SN9C102_USB_DEVICE(0x0c45, 0x60ab, 0xff), }, /* TAS5110C1B */ \ + { SN9C102_USB_DEVICE(0x0c45, 0x60ac, 0xff), }, \ + { SN9C102_USB_DEVICE(0x0c45, 0x60ae, 0xff), }, \ + { SN9C102_USB_DEVICE(0x0c45, 0x60af, 0xff), }, /* PAS202BCB */ \ + { SN9C102_USB_DEVICE(0x0c45, 0x60b0, 0xff), }, /* OV7630 (?) */ \ + { SN9C102_USB_DEVICE(0x0c45, 0x60b2, 0xff), }, \ + { SN9C102_USB_DEVICE(0x0c45, 0x60b3, 0xff), }, \ + { SN9C102_USB_DEVICE(0x0c45, 0x60b8, 0xff), }, \ + { SN9C102_USB_DEVICE(0x0c45, 0x60ba, 0xff), }, \ + { SN9C102_USB_DEVICE(0x0c45, 0x60bb, 0xff), }, \ + { SN9C102_USB_DEVICE(0x0c45, 0x60bc, 0xff), }, \ + { SN9C102_USB_DEVICE(0x0c45, 0x60be, 0xff), }, \ { } \ }; @@ -145,6 +160,8 @@ static const struct usb_device_id sn9c102_id_table[] = { \ */ /* The "try" I2C I/O versions are used when probing the sensor */ +extern int sn9c102_i2c_try_write(struct sn9c102_device*,struct sn9c102_sensor*, + u8 address, u8 value); extern int sn9c102_i2c_try_read(struct sn9c102_device*,struct sn9c102_sensor*, u8 address); @@ -172,16 +189,18 @@ extern int sn9c102_i2c_write(struct sn9c102_device*, u8 address, u8 value); extern int sn9c102_i2c_read(struct sn9c102_device*, u8 address); /* I/O on registers in the bridge. Could be used by the sensor methods too */ +extern int sn9c102_write_regs(struct sn9c102_device*, u8* buff, u16 index); extern int sn9c102_write_reg(struct sn9c102_device*, u8 value, u16 index); extern int sn9c102_pread_reg(struct sn9c102_device*, u16 index); /* NOTE: there are no exported debugging functions. To uniform the output you must use the dev_info()/dev_warn()/dev_err() macros defined in device.h, - already included here, the argument being the struct device 'dev' of the - sensor structure. Do NOT use these macros before the sensor is attached or - the kernel will crash! However, you should not need to notify the user about - common errors or other messages, since this is done by the master module. + already included here, the argument being the struct device '&usbdev->dev' + of the sensor structure. Do NOT use these macros before the sensor is + attached or the kernel will crash! However, you should not need to notify + the user about common errors or other messages, since this is done by the + master module. */ /*****************************************************************************/ @@ -201,6 +220,8 @@ enum sn9c102_i2c_interface { SN9C102_I2C_3WIRES, }; +#define SN9C102_MAX_CTRLS V4L2_CID_LASTP1-V4L2_CID_BASE+10 + struct sn9c102_sensor { char name[32], /* sensor name */ maintainer[64]; /* name of the mantainer */ @@ -243,7 +264,7 @@ struct sn9c102_sensor { sensor according to the default configuration structures below. */ - struct v4l2_queryctrl qctrl[V4L2_CID_LASTP1-V4L2_CID_BASE]; + struct v4l2_queryctrl qctrl[SN9C102_MAX_CTRLS]; /* Optional list of default controls, defined as indicated in the V4L2 API. Menu type controls are not handled by this interface. @@ -338,13 +359,6 @@ struct sn9c102_sensor { error code without rolling back. */ - const struct device* dev; - /* - This is the argument for dev_err(), dev_info() and dev_warn(). It - is used for debugging purposes. You must not access the struct - before the sensor is attached. - */ - const struct usb_device* usbdev; /* Points to the usb_device struct after the sensor is attached. @@ -356,7 +370,7 @@ struct sn9c102_sensor { core module to store successfully updated values of the above settings, for rollbacks..etc..in case of errors during atomic I/O */ - struct v4l2_queryctrl _qctrl[V4L2_CID_LASTP1-V4L2_CID_BASE]; + struct v4l2_queryctrl _qctrl[SN9C102_MAX_CTRLS]; struct v4l2_rect _rect; }; @@ -367,5 +381,8 @@ struct sn9c102_sensor { #define SN9C102_V4L2_CID_GREEN_BALANCE V4L2_CID_PRIVATE_BASE + 1 #define SN9C102_V4L2_CID_RESET_LEVEL V4L2_CID_PRIVATE_BASE + 2 #define SN9C102_V4L2_CID_PIXEL_BIAS_VOLTAGE V4L2_CID_PRIVATE_BASE + 3 +#define SN9C102_V4L2_CID_GAMMA V4L2_CID_PRIVATE_BASE + 4 +#define SN9C102_V4L2_CID_BAND_FILTER V4L2_CID_PRIVATE_BASE + 5 +#define SN9C102_V4L2_CID_BRIGHT_LEVEL V4L2_CID_PRIVATE_BASE + 6 #endif /* _SN9C102_SENSOR_H_ */ diff --git a/drivers/usb/media/sn9c102_tas5110c1b.c b/drivers/usb/media/sn9c102_tas5110c1b.c index 690d62192..32ddf236c 100644 --- a/drivers/usb/media/sn9c102_tas5110c1b.c +++ b/drivers/usb/media/sn9c102_tas5110c1b.c @@ -2,7 +2,7 @@ * Plug-in for TAS5110C1B image sensor connected to the SN9C10x PC Camera * * Controllers * * * - * Copyright (C) 2004-2005 by Luca Risolia * + * Copyright (C) 2004-2006 by Luca Risolia * * * * This 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,8 +24,6 @@ static struct sn9c102_sensor tas5110c1b; -static struct v4l2_control tas5110c1b_gain; - static int tas5110c1b_init(struct sn9c102_device* cam) { @@ -46,21 +44,6 @@ static int tas5110c1b_init(struct sn9c102_device* cam) } -static int tas5110c1b_get_ctrl(struct sn9c102_device* cam, - struct v4l2_control* ctrl) -{ - switch (ctrl->id) { - case V4L2_CID_GAIN: - ctrl->value = tas5110c1b_gain.value; - break; - default: - return -EINVAL; - } - - return 0; -} - - static int tas5110c1b_set_ctrl(struct sn9c102_device* cam, const struct v4l2_control* ctrl) { @@ -68,8 +51,7 @@ static int tas5110c1b_set_ctrl(struct sn9c102_device* cam, switch (ctrl->id) { case V4L2_CID_GAIN: - if (!(err += sn9c102_i2c_write(cam, 0x20, 0xf6 - ctrl->value))) - tas5110c1b_gain.value = ctrl->value; + err += sn9c102_i2c_write(cam, 0x20, 0xf6 - ctrl->value); break; default: return -EINVAL; @@ -147,7 +129,6 @@ static struct sn9c102_sensor tas5110c1b = { .height = 288, }, }, - .get_ctrl = &tas5110c1b_get_ctrl, .set_crop = &tas5110c1b_set_crop, .pix_format = { .width = 352, diff --git a/drivers/usb/media/sn9c102_tas5130d1b.c b/drivers/usb/media/sn9c102_tas5130d1b.c index b378e941b..a0728f0ae 100644 --- a/drivers/usb/media/sn9c102_tas5130d1b.c +++ b/drivers/usb/media/sn9c102_tas5130d1b.c @@ -2,7 +2,7 @@ * Plug-in for TAS5130D1B image sensor connected to the SN9C10x PC Camera * * Controllers * * * - * Copyright (C) 2004-2005 by Luca Risolia * + * Copyright (C) 2004-2006 by Luca Risolia * * * * This 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,8 +24,6 @@ static struct sn9c102_sensor tas5130d1b; -static struct v4l2_control tas5130d1b_gain, tas5130d1b_exposure; - static int tas5130d1b_init(struct sn9c102_device* cam) { @@ -44,24 +42,6 @@ static int tas5130d1b_init(struct sn9c102_device* cam) } -static int tas5130d1b_get_ctrl(struct sn9c102_device* cam, - struct v4l2_control* ctrl) -{ - switch (ctrl->id) { - case V4L2_CID_GAIN: - ctrl->value = tas5130d1b_gain.value; - break; - case V4L2_CID_EXPOSURE: - ctrl->value = tas5130d1b_exposure.value; - break; - default: - return -EINVAL; - } - - return 0; -} - - static int tas5130d1b_set_ctrl(struct sn9c102_device* cam, const struct v4l2_control* ctrl) { @@ -69,12 +49,10 @@ static int tas5130d1b_set_ctrl(struct sn9c102_device* cam, switch (ctrl->id) { case V4L2_CID_GAIN: - if (!(err += sn9c102_i2c_write(cam, 0x20, 0xf6 - ctrl->value))) - tas5130d1b_gain.value = ctrl->value; + err += sn9c102_i2c_write(cam, 0x20, 0xf6 - ctrl->value); break; case V4L2_CID_EXPOSURE: - if (!(err += sn9c102_i2c_write(cam, 0x40, 0x47 - ctrl->value))) - tas5130d1b_exposure.value = ctrl->value; + err += sn9c102_i2c_write(cam, 0x40, 0x47 - ctrl->value); break; default: return -EINVAL; @@ -147,7 +125,6 @@ static struct sn9c102_sensor tas5130d1b = { .flags = 0, }, }, - .get_ctrl = &tas5130d1b_get_ctrl, .set_ctrl = &tas5130d1b_set_ctrl, .cropcap = { .bounds = { diff --git a/drivers/usb/media/stv680.c b/drivers/usb/media/stv680.c index ae455c8e3..b497a6a0a 100644 --- a/drivers/usb/media/stv680.c +++ b/drivers/usb/media/stv680.c @@ -260,7 +260,7 @@ static int stv_stop_video (struct usb_stv *dev) PDEBUG (0, "STV(i): Camera set to original resolution"); } /* origMode */ - kfree (buf); + kfree(buf); return i; } @@ -276,7 +276,7 @@ static int stv_set_video_mode (struct usb_stv *dev) } if ((i = stv_set_config (dev, 1, 0, 0)) < 0) { - kfree (buf); + kfree(buf); return i; } @@ -301,13 +301,13 @@ static int stv_set_video_mode (struct usb_stv *dev) goto exit; error: - kfree (buf); + kfree(buf); if (stop_video == 1) stv_stop_video (dev); return -1; exit: - kfree (buf); + kfree(buf); return 0; } @@ -327,7 +327,7 @@ static int stv_init (struct usb_stv *stv680) /* set config 1, interface 0, alternate 0 */ if ((i = stv_set_config (stv680, 1, 0, 0)) < 0) { - kfree (buffer); + kfree(buffer); PDEBUG (0, "STV(e): set config 1,0,0 failed"); return -1; } @@ -435,11 +435,11 @@ static int stv_init (struct usb_stv *stv680) error: i = stv_sndctrl (0, stv680, 0x80, 0, buffer, 0x02); /* Get Last Error */ PDEBUG (1, "STV(i): last error: %i, command = 0x%x", buffer[0], buffer[1]); - kfree (buffer); + kfree(buffer); return -1; exit: - kfree (buffer); + kfree(buffer); /* video = 320x240, 352x288 */ if (stv680->CIF == 1) { @@ -708,10 +708,10 @@ static int stv680_stop_stream (struct usb_stv *stv680) usb_kill_urb (stv680->urb[i]); usb_free_urb (stv680->urb[i]); stv680->urb[i] = NULL; - kfree (stv680->sbuf[i].data); + kfree(stv680->sbuf[i].data); } for (i = 0; i < STV680_NUMSCRATCH; i++) { - kfree (stv680->scratch[i].data); + kfree(stv680->scratch[i].data); stv680->scratch[i].data = NULL; } @@ -1068,7 +1068,7 @@ static int stv_close (struct inode *inode, struct file *file) stv680->user = 0; if (stv680->removed) { - kfree (stv680); + kfree(stv680); stv680 = NULL; PDEBUG (0, "STV(i): device unregistered"); } @@ -1343,6 +1343,7 @@ static struct file_operations stv680_fops = { .read = stv680_read, .mmap = stv680_mmap, .ioctl = stv680_ioctl, + .compat_ioctl = v4l_compat_ioctl32, .llseek = no_llseek, }; static struct video_device stv680_template = { @@ -1375,9 +1376,13 @@ static int stv680_probe (struct usb_interface *intf, const struct usb_device_id (le16_to_cpu(dev->descriptor.idProduct) == USB_PENCAM_PRODUCT_ID)) { camera_name = "STV0680"; PDEBUG (0, "STV(i): STV0680 camera found."); + } else if ((le16_to_cpu(dev->descriptor.idVendor) == USB_CREATIVEGOMINI_VENDOR_ID) && + (le16_to_cpu(dev->descriptor.idProduct) == USB_CREATIVEGOMINI_PRODUCT_ID)) { + camera_name = "Creative WebCam Go Mini"; + PDEBUG (0, "STV(i): Creative WebCam Go Mini found."); } else { - PDEBUG (0, "STV(e): Vendor/Product ID do not match STV0680 values."); - PDEBUG (0, "STV(e): Check that the STV0680 camera is connected to the computer."); + PDEBUG (0, "STV(e): Vendor/Product ID do not match STV0680 or Creative WebCam Go Mini values."); + PDEBUG (0, "STV(e): Check that the STV0680 or Creative WebCam Go Mini camera is connected to the computer."); retval = -ENODEV; goto error; } @@ -1441,14 +1446,14 @@ static inline void usb_stv680_remove_disconnected (struct usb_stv *stv680) usb_kill_urb (stv680->urb[i]); usb_free_urb (stv680->urb[i]); stv680->urb[i] = NULL; - kfree (stv680->sbuf[i].data); + kfree(stv680->sbuf[i].data); } for (i = 0; i < STV680_NUMSCRATCH; i++) - kfree (stv680->scratch[i].data); + kfree(stv680->scratch[i].data); PDEBUG (0, "STV(i): %s disconnected", stv680->camera_name); /* Free the memory */ - kfree (stv680); + kfree(stv680); } static void stv680_disconnect (struct usb_interface *intf) @@ -1473,7 +1478,6 @@ static void stv680_disconnect (struct usb_interface *intf) } static struct usb_driver stv680_driver = { - .owner = THIS_MODULE, .name = "stv680", .probe = stv680_probe, .disconnect = stv680_disconnect, diff --git a/drivers/usb/media/stv680.h b/drivers/usb/media/stv680.h index 7e0e314dc..b0551cdb2 100644 --- a/drivers/usb/media/stv680.h +++ b/drivers/usb/media/stv680.h @@ -41,12 +41,17 @@ #define USB_PENCAM_VENDOR_ID 0x0553 #define USB_PENCAM_PRODUCT_ID 0x0202 + +#define USB_CREATIVEGOMINI_VENDOR_ID 0x041e +#define USB_CREATIVEGOMINI_PRODUCT_ID 0x4007 + #define PENCAM_TIMEOUT 1000 /* fmt 4 */ #define STV_VIDEO_PALETTE VIDEO_PALETTE_RGB24 static struct usb_device_id device_table[] = { {USB_DEVICE (USB_PENCAM_VENDOR_ID, USB_PENCAM_PRODUCT_ID)}, + {USB_DEVICE (USB_CREATIVEGOMINI_VENDOR_ID, USB_CREATIVEGOMINI_PRODUCT_ID)}, {} }; MODULE_DEVICE_TABLE (usb, device_table); @@ -146,7 +151,7 @@ struct usb_stv { }; -static unsigned char red[256] = { +static const unsigned char red[256] = { 0, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 25, 30, 35, 38, 42, 44, 47, 50, 53, 54, 57, 59, 61, 63, 65, 67, 69, @@ -171,7 +176,7 @@ static unsigned char red[256] = { 220, 220, 221, 221 }; -static unsigned char green[256] = { +static const unsigned char green[256] = { 0, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 28, 34, 39, 43, 47, 50, 53, 56, 59, 61, 64, 66, 68, 71, 73, 75, 77, @@ -196,7 +201,7 @@ static unsigned char green[256] = { 245, 245, 246, 246 }; -static unsigned char blue[256] = { +static const unsigned char blue[256] = { 0, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 30, 37, 42, 47, 51, 55, 58, 61, 64, 67, 70, 72, 74, 78, 80, 82, 84, diff --git a/drivers/usb/media/usbvideo.c b/drivers/usb/media/usbvideo.c index 24efb2196..63a72e550 100644 --- a/drivers/usb/media/usbvideo.c +++ b/drivers/usb/media/usbvideo.c @@ -725,7 +725,7 @@ int usbvideo_register( /* Allocate user_data separately because of kmalloc's limits */ if (num_extra > 0) { up->user_size = num_cams * num_extra; - up->user_data = (char *) kmalloc(up->user_size, GFP_KERNEL); + up->user_data = kmalloc(up->user_size, GFP_KERNEL); if (up->user_data == NULL) { err("%s: Failed to allocate user_data (%d. bytes)", __FUNCTION__, up->user_size); @@ -953,9 +953,10 @@ static struct file_operations usbvideo_fops = { .read = usbvideo_v4l_read, .mmap = usbvideo_v4l_mmap, .ioctl = usbvideo_v4l_ioctl, + .compat_ioctl = v4l_compat_ioctl32, .llseek = no_llseek, }; -static struct video_device usbvideo_template = { +static const struct video_device usbvideo_template = { .owner = THIS_MODULE, .type = VID_TYPE_CAPTURE, .hardware = VID_HARDWARE_CPIA, diff --git a/drivers/usb/media/vicam.c b/drivers/usb/media/vicam.c index 4a5857c53..5df144073 100644 --- a/drivers/usb/media/vicam.c +++ b/drivers/usb/media/vicam.c @@ -1148,7 +1148,7 @@ vicam_write_proc_gain(struct file *file, const char *buffer, static void vicam_create_proc_root(void) { - vicam_proc_root = create_proc_entry("video/vicam", S_IFDIR, 0); + vicam_proc_root = proc_mkdir("video/vicam", NULL); if (vicam_proc_root) vicam_proc_root->owner = THIS_MODULE; @@ -1181,7 +1181,7 @@ vicam_create_proc_entry(struct vicam_camera *cam) sprintf(name, "video%d", cam->vdev.minor); - cam->proc_dir = create_proc_entry(name, S_IFDIR, vicam_proc_root); + cam->proc_dir = proc_mkdir(name, vicam_proc_root); if ( !cam->proc_dir ) return; // FIXME: We should probably return an error here @@ -1236,6 +1236,7 @@ static struct file_operations vicam_fops = { .read = vicam_read, .mmap = vicam_mmap, .ioctl = vicam_ioctl, + .compat_ioctl = v4l_compat_ioctl32, .llseek = no_llseek, }; @@ -1257,7 +1258,6 @@ static struct usb_device_id vicam_table[] = { MODULE_DEVICE_TABLE(usb, vicam_table); static struct usb_driver vicam_driver = { - .owner = THIS_MODULE, .name = "vicam", .probe = vicam_probe, .disconnect = vicam_disconnect, diff --git a/drivers/usb/media/w9968cf.c b/drivers/usb/media/w9968cf.c index ca9f3a306..9937fc64c 100644 --- a/drivers/usb/media/w9968cf.c +++ b/drivers/usb/media/w9968cf.c @@ -25,7 +25,6 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * ***************************************************************************/ -#include #include #include #include @@ -63,7 +62,6 @@ MODULE_LICENSE(W9968CF_MODULE_LICENSE); MODULE_SUPPORTED_DEVICE("Video"); static int ovmod_load = W9968CF_OVMOD_LOAD; -static int vppmod_load = W9968CF_VPPMOD_LOAD; static unsigned short simcams = W9968CF_SIMCAMS; static short video_nr[]={[0 ... W9968CF_MAX_DEVICES-1] = -1}; /*-1=first free*/ static unsigned int packet_size[] = {[0 ... W9968CF_MAX_DEVICES-1] = @@ -108,7 +106,6 @@ static unsigned int param_nv[24]; /* number of values per parameter */ #ifdef CONFIG_KMOD module_param(ovmod_load, bool, 0644); -module_param(vppmod_load, bool, 0444); #endif module_param(simcams, ushort, 0644); module_param_array(video_nr, short, ¶m_nv[0], 0444); @@ -151,18 +148,6 @@ MODULE_PARM_DESC(ovmod_load, "\ninto memory." "\nDefault value is "__MODULE_STRING(W9968CF_OVMOD_LOAD)"." "\n"); -MODULE_PARM_DESC(vppmod_load, - "\n<0|1> Automatic 'w9968cf-vpp' module loading." - "\n0 disabled, 1 enabled." - "\nIf enabled, every time an application attempts to open a" - "\ncamera, 'insmod' searches for the video post-processing" - "\nmodule in the system and loads it automatically (if" - "\npresent). The optional 'w9968cf-vpp' module adds extra" - "\n image manipulation functions to the 'w9968cf' module,like" - "\nsoftware up-scaling,colour conversions and video decoding" - "\nfor very high frame rates." - "\nDefault value is "__MODULE_STRING(W9968CF_VPPMOD_LOAD)"." - "\n"); #endif MODULE_PARM_DESC(simcams, "\n Number of cameras allowed to stream simultaneously." @@ -493,10 +478,6 @@ static void w9968cf_push_frame(struct w9968cf_device*, u8 f_num); static void w9968cf_pop_frame(struct w9968cf_device*,struct w9968cf_frame_t**); static void w9968cf_release_resources(struct w9968cf_device*); -/* Intermodule communication */ -static int w9968cf_vppmod_detect(struct w9968cf_device*); -static void w9968cf_vppmod_release(struct w9968cf_device*); - /**************************************************************************** @@ -1523,7 +1504,6 @@ static u32 w9968cf_i2c_func(struct i2c_adapter* adap) static int w9968cf_i2c_attach_inform(struct i2c_client* client) { struct w9968cf_device* cam = i2c_get_adapdata(client->adapter); - const char* clientname = i2c_clientname(client); int id = client->driver->id, err = 0; if (id == I2C_DRIVERID_OVCAMCHIP) { @@ -1535,12 +1515,12 @@ static int w9968cf_i2c_attach_inform(struct i2c_client* client) } } else { DBG(4, "Rejected client [%s] with driver [%s]", - clientname, client->driver->name) + client->name, client->driver->driver.name) return -EINVAL; } DBG(5, "I2C attach client [%s] with driver [%s]", - clientname, client->driver->name) + client->name, client->driver->driver.name) return 0; } @@ -1549,12 +1529,11 @@ static int w9968cf_i2c_attach_inform(struct i2c_client* client) static int w9968cf_i2c_detach_inform(struct i2c_client* client) { struct w9968cf_device* cam = i2c_get_adapdata(client->adapter); - const char* clientname = i2c_clientname(client); if (cam->sensor_client == client) cam->sensor_client = NULL; - DBG(5, "I2C detach client [%s]", clientname) + DBG(5, "I2C detach client [%s]", client->name) return 0; } @@ -1573,15 +1552,13 @@ static int w9968cf_i2c_init(struct w9968cf_device* cam) int err = 0; static struct i2c_algorithm algo = { - .name = "W996[87]CF algorithm", - .id = I2C_ALGO_SMBUS, .smbus_xfer = w9968cf_i2c_smbus_xfer, .algo_control = w9968cf_i2c_control, .functionality = w9968cf_i2c_func, }; static struct i2c_adapter adap = { - .id = I2C_ALGO_SMBUS | I2C_HW_SMBUS_W9968CF, + .id = I2C_HW_SMBUS_W9968CF, .class = I2C_CLASS_CAM_DIGITAL, .owner = THIS_MODULE, .client_register = w9968cf_i2c_attach_inform, @@ -2742,9 +2719,7 @@ static int w9968cf_open(struct inode* inode, struct file* filp) cam->streaming = 0; cam->misconfigured = 0; - if (!w9968cf_vpp) - if ((err = w9968cf_vppmod_detect(cam))) - goto out; + w9968cf_adjust_configuration(cam); if ((err = w9968cf_allocate_memory(cam))) goto deallocate_memory; @@ -2771,7 +2746,6 @@ static int w9968cf_open(struct inode* inode, struct file* filp) deallocate_memory: w9968cf_deallocate_memory(cam); -out: DBG(2, "Failed to open the video device") up(&cam->dev_sem); up_read(&w9968cf_disconnect); @@ -2789,8 +2763,6 @@ static int w9968cf_release(struct inode* inode, struct file* filp) w9968cf_stop_transfer(cam); - w9968cf_vppmod_release(cam); - if (cam->disconnected) { w9968cf_release_resources(cam); up(&cam->dev_sem); @@ -2963,7 +2935,7 @@ static int w9968cf_v4l_ioctl(struct inode* inode, struct file* filp, }; #define V4L1_IOCTL(cmd) \ - ((_IOC_NR((cmd)) < sizeof(v4l1_ioctls)/sizeof(char*)) ? \ + ((_IOC_NR((cmd)) < ARRAY_SIZE(v4l1_ioctls)) ? \ v4l1_ioctls[_IOC_NR((cmd))] : "?") cam = (struct w9968cf_device*)video_get_drvdata(video_devdata(filp)); @@ -3495,6 +3467,7 @@ static struct file_operations w9968cf_fops = { .release = w9968cf_release, .read = w9968cf_read, .ioctl = w9968cf_ioctl, + .compat_ioctl = v4l_compat_ioctl32, .mmap = w9968cf_mmap, .llseek = no_llseek, }; @@ -3559,7 +3532,7 @@ w9968cf_usb_probe(struct usb_interface* intf, const struct usb_device_id* id) /* Allocate 2 bytes of memory for camera control USB transfers */ - if (!(cam->control_buffer = (u16*)kmalloc(2, GFP_KERNEL))) { + if (!(cam->control_buffer = kmalloc(2, GFP_KERNEL))) { DBG(1,"Couldn't allocate memory for camera control transfers") err = -ENOMEM; goto fail; @@ -3567,7 +3540,7 @@ w9968cf_usb_probe(struct usb_interface* intf, const struct usb_device_id* id) memset(cam->control_buffer, 0, 2); /* Allocate 8 bytes of memory for USB data transfers to the FSB */ - if (!(cam->data_buffer = (u16*)kmalloc(8, GFP_KERNEL))) { + if (!(cam->data_buffer = kmalloc(8, GFP_KERNEL))) { DBG(1, "Couldn't allocate memory for data " "transfers to the FSB") err = -ENOMEM; @@ -3673,7 +3646,6 @@ static void w9968cf_usb_disconnect(struct usb_interface* intf) static struct usb_driver w9968cf_usb_driver = { - .owner = THIS_MODULE, .name = "w9968cf", .id_table = winbond_id_table, .probe = w9968cf_usb_probe, @@ -3686,106 +3658,6 @@ static struct usb_driver w9968cf_usb_driver = { * Module init, exit and intermodule communication * ****************************************************************************/ -static int w9968cf_vppmod_detect(struct w9968cf_device* cam) -{ - if (!w9968cf_vpp) - if (vppmod_load) - request_module("w9968cf-vpp"); - - down(&w9968cf_vppmod_lock); - - if (!w9968cf_vpp) { - DBG(4, "Video post-processing module not detected") - w9968cf_adjust_configuration(cam); - goto out; - } - - if (!try_module_get(w9968cf_vpp->owner)) { - DBG(1, "Couldn't increment the reference count of " - "the video post-processing module") - up(&w9968cf_vppmod_lock); - return -ENOSYS; - } - - w9968cf_vpp->busy++; - - DBG(5, "Video post-processing module detected") - -out: - up(&w9968cf_vppmod_lock); - return 0; -} - - -static void w9968cf_vppmod_release(struct w9968cf_device* cam) -{ - down(&w9968cf_vppmod_lock); - - if (w9968cf_vpp && w9968cf_vpp->busy) { - module_put(w9968cf_vpp->owner); - w9968cf_vpp->busy--; - wake_up(&w9968cf_vppmod_wait); - DBG(5, "Video post-processing module released") - } - - up(&w9968cf_vppmod_lock); -} - - -int w9968cf_vppmod_register(struct w9968cf_vpp_t* vpp) -{ - down(&w9968cf_vppmod_lock); - - if (w9968cf_vpp) { - KDBG(1, "Video post-processing module already registered") - up(&w9968cf_vppmod_lock); - return -EINVAL; - } - - w9968cf_vpp = vpp; - w9968cf_vpp->busy = 0; - - KDBG(2, "Video post-processing module registered") - up(&w9968cf_vppmod_lock); - return 0; -} - - -int w9968cf_vppmod_deregister(struct w9968cf_vpp_t* vpp) -{ - down(&w9968cf_vppmod_lock); - - if (!w9968cf_vpp) { - up(&w9968cf_vppmod_lock); - return -EINVAL; - } - - if (w9968cf_vpp != vpp) { - KDBG(1, "Only the owner can unregister the video " - "post-processing module") - up(&w9968cf_vppmod_lock); - return -EINVAL; - } - - if (w9968cf_vpp->busy) { - KDBG(2, "Video post-processing module busy. Wait for it to be " - "released...") - up(&w9968cf_vppmod_lock); - wait_event(w9968cf_vppmod_wait, !w9968cf_vpp->busy); - w9968cf_vpp = NULL; - goto out; - } - - w9968cf_vpp = NULL; - - up(&w9968cf_vppmod_lock); - -out: - KDBG(2, "Video post-processing module unregistered") - return 0; -} - - static int __init w9968cf_module_init(void) { int err; @@ -3815,6 +3687,3 @@ static void __exit w9968cf_module_exit(void) module_init(w9968cf_module_init); module_exit(w9968cf_module_exit); - -EXPORT_SYMBOL(w9968cf_vppmod_register); -EXPORT_SYMBOL(w9968cf_vppmod_deregister); diff --git a/drivers/usb/media/w9968cf.h b/drivers/usb/media/w9968cf.h index 8acbfe205..47a6ff794 100644 --- a/drivers/usb/media/w9968cf.h +++ b/drivers/usb/media/w9968cf.h @@ -195,7 +195,6 @@ enum w9968cf_vpp_flag { }; static struct w9968cf_vpp_t* w9968cf_vpp; -static DECLARE_MUTEX(w9968cf_vppmod_lock); static DECLARE_WAIT_QUEUE_HEAD(w9968cf_vppmod_wait); static LIST_HEAD(w9968cf_dev_list); /* head of V4L registered cameras list */ diff --git a/drivers/usb/media/w9968cf_vpp.h b/drivers/usb/media/w9968cf_vpp.h index 3f5317dc4..f3b91b782 100644 --- a/drivers/usb/media/w9968cf_vpp.h +++ b/drivers/usb/media/w9968cf_vpp.h @@ -37,7 +37,4 @@ struct w9968cf_vpp_t { u8 busy; /* read-only flag: module is/is not in use */ }; -extern int w9968cf_vppmod_register(struct w9968cf_vpp_t*); -extern int w9968cf_vppmod_deregister(struct w9968cf_vpp_t*); - #endif /* _W9968CF_VPP_H_ */ diff --git a/drivers/usb/misc/Kconfig b/drivers/usb/misc/Kconfig index 88928a4be..8ba6a701e 100644 --- a/drivers/usb/misc/Kconfig +++ b/drivers/usb/misc/Kconfig @@ -88,20 +88,6 @@ 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 @@ -151,15 +137,6 @@ 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 2927260c5..6c693bc68 100644 --- a/drivers/usb/misc/Makefile +++ b/drivers/usb/misc/Makefile @@ -4,7 +4,6 @@ # 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 @@ -18,7 +17,6 @@ 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/auerswald.c b/drivers/usb/misc/auerswald.c index 1fef36e71..ad2f4cccd 100644 --- a/drivers/usb/misc/auerswald.c +++ b/drivers/usb/misc/auerswald.c @@ -570,9 +570,10 @@ static int auerchain_setup (pauerchain_t acp, unsigned int numElements) /* fill the list of free elements */ for (;numElements; numElements--) { - acep = kzalloc(sizeof(auerchainelement_t), GFP_KERNEL); + acep = (pauerchainelement_t) kmalloc (sizeof (auerchainelement_t), GFP_KERNEL); if (!acep) goto ac_fail; + memset (acep, 0, sizeof (auerchainelement_t)); INIT_LIST_HEAD (&acep->list); list_add_tail (&acep->list, &acp->free_list); } @@ -760,9 +761,10 @@ static int auerbuf_setup (pauerbufctl_t bcp, unsigned int numElements, unsigned /* fill the list of free elements */ for (;numElements; numElements--) { - bep = kzalloc(sizeof(auerbuf_t), GFP_KERNEL); + bep = (pauerbuf_t) kmalloc (sizeof (auerbuf_t), GFP_KERNEL); if (!bep) goto bl_fail; + memset (bep, 0, sizeof (auerbuf_t)); bep->list = bcp; INIT_LIST_HEAD (&bep->buff_list); bep->bufp = kmalloc (bufsize, GFP_KERNEL); diff --git a/drivers/usb/misc/cytherm.c b/drivers/usb/misc/cytherm.c index b20bec445..6671317b4 100644 --- a/drivers/usb/misc/cytherm.c +++ b/drivers/usb/misc/cytherm.c @@ -14,6 +14,7 @@ */ +#include #include #include #include @@ -350,11 +351,12 @@ static int cytherm_probe(struct usb_interface *interface, struct usb_cytherm *dev = NULL; int retval = -ENOMEM; - dev = kzalloc (sizeof(struct usb_cytherm), GFP_KERNEL); + dev = kmalloc (sizeof(struct usb_cytherm), GFP_KERNEL); if (dev == NULL) { dev_err (&interface->dev, "Out of memory\n"); goto error; } + memset (dev, 0x00, sizeof (*dev)); dev->udev = usb_get_dev(udev); diff --git a/drivers/usb/misc/emi26.c b/drivers/usb/misc/emi26.c index 1fd9cb85f..3824df330 100644 --- a/drivers/usb/misc/emi26.c +++ b/drivers/usb/misc/emi26.c @@ -15,7 +15,6 @@ #include #include #include -#include #define MAX_INTEL_HEX_RECORD_LENGTH 16 typedef struct _INTEL_HEX_RECORD @@ -115,7 +114,6 @@ static int emi26_load_firmware (struct usb_device *dev) /* De-assert reset (let the CPU run) */ err = emi26_set_reset(dev,0); - msleep(250); /* let device settle */ /* 2. We upload the FPGA firmware into the EMI * Note: collect up to 1023 (yes!) bytes and send them with @@ -152,7 +150,6 @@ static int emi26_load_firmware (struct usb_device *dev) goto wraperr; } } - msleep(250); /* let device settle */ /* De-assert reset (let the CPU run) */ err = emi26_set_reset(dev,0); @@ -195,7 +192,6 @@ static int emi26_load_firmware (struct usb_device *dev) err("%s - error loading firmware: error = %d", __FUNCTION__, err); goto wraperr; } - msleep(250); /* let device settle */ /* return 1 to fail the driver inialization * and give real driver change to load */ diff --git a/drivers/usb/misc/emi62.c b/drivers/usb/misc/emi62.c index fe351371f..52fea2e08 100644 --- a/drivers/usb/misc/emi62.c +++ b/drivers/usb/misc/emi62.c @@ -15,7 +15,6 @@ #include #include #include -#include #define MAX_INTEL_HEX_RECORD_LENGTH 16 typedef struct _INTEL_HEX_RECORD @@ -124,7 +123,6 @@ static int emi62_load_firmware (struct usb_device *dev) /* De-assert reset (let the CPU run) */ err = emi62_set_reset(dev,0); - msleep(250); /* let device settle */ /* 2. We upload the FPGA firmware into the EMI * Note: collect up to 1023 (yes!) bytes and send them with @@ -168,7 +166,6 @@ static int emi62_load_firmware (struct usb_device *dev) err("%s - error loading firmware: error = %d", __FUNCTION__, err); goto wraperr; } - msleep(250); /* let device settle */ /* 4. We put the part of the firmware that lies in the external RAM into the EZ-USB */ @@ -231,7 +228,6 @@ static int emi62_load_firmware (struct usb_device *dev) err("%s - error loading firmware: error = %d", __FUNCTION__, err); goto wraperr; } - msleep(250); /* let device settle */ kfree(buf); diff --git a/drivers/usb/misc/idmouse.c b/drivers/usb/misc/idmouse.c index fcd69c52a..d8cde1017 100644 --- a/drivers/usb/misc/idmouse.c +++ b/drivers/usb/misc/idmouse.c @@ -16,6 +16,7 @@ */ +#include #include #include #include @@ -24,7 +25,6 @@ #include #include #include -#include #include #include @@ -121,7 +121,7 @@ static struct usb_driver idmouse_driver = { }; /* prevent races between open() and disconnect() */ -static DEFINE_MUTEX(disconnect_mutex); +static DECLARE_MUTEX(disconnect_sem); static int idmouse_create_image(struct usb_idmouse *dev) { @@ -213,18 +213,18 @@ static int idmouse_open(struct inode *inode, struct file *file) int result = 0; /* prevent disconnects */ - mutex_lock(&disconnect_mutex); + down(&disconnect_sem); /* get the interface from minor number and driver information */ interface = usb_find_interface (&idmouse_driver, iminor (inode)); if (!interface) { - mutex_unlock(&disconnect_mutex); + up(&disconnect_sem); return -ENODEV; } /* get the device information block from the interface */ dev = usb_get_intfdata(interface); if (!dev) { - mutex_unlock(&disconnect_mutex); + up(&disconnect_sem); return -ENODEV; } @@ -258,7 +258,7 @@ error: up(&dev->sem); /* unlock the disconnect semaphore */ - mutex_unlock(&disconnect_mutex); + up(&disconnect_sem); return result; } @@ -267,12 +267,12 @@ static int idmouse_release(struct inode *inode, struct file *file) struct usb_idmouse *dev; /* prevent a race condition with open() */ - mutex_lock(&disconnect_mutex); + down(&disconnect_sem); dev = (struct usb_idmouse *) file->private_data; if (dev == NULL) { - mutex_unlock(&disconnect_mutex); + up(&disconnect_sem); return -ENODEV; } @@ -282,7 +282,7 @@ static int idmouse_release(struct inode *inode, struct file *file) /* are we really open? */ if (dev->open <= 0) { up(&dev->sem); - mutex_unlock(&disconnect_mutex); + up(&disconnect_sem); return -ENODEV; } @@ -292,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); - mutex_unlock(&disconnect_mutex); + up(&disconnect_sem); return 0; } up(&dev->sem); - mutex_unlock(&disconnect_mutex); + up(&disconnect_sem); return 0; } @@ -340,9 +340,10 @@ static int idmouse_probe(struct usb_interface *interface, return -ENODEV; /* allocate memory for our device state and initialize it */ - dev = kzalloc(sizeof(*dev), GFP_KERNEL); + dev = kmalloc(sizeof(*dev), GFP_KERNEL); if (dev == NULL) return -ENOMEM; + memset(dev, 0x00, sizeof(*dev)); init_MUTEX(&dev->sem); dev->udev = udev; @@ -399,7 +400,7 @@ static void idmouse_disconnect(struct usb_interface *interface) struct usb_idmouse *dev; /* prevent races with open() */ - mutex_lock(&disconnect_mutex); + down(&disconnect_sem); /* get device structure */ dev = usb_get_intfdata(interface); @@ -421,7 +422,7 @@ static void idmouse_disconnect(struct usb_interface *interface) if (!dev->open) idmouse_delete(dev); - mutex_unlock(&disconnect_mutex); + up(&disconnect_sem); info("%s disconnected", DRIVER_DESC); } diff --git a/drivers/usb/misc/ldusb.c b/drivers/usb/misc/ldusb.c index f30ab1fbb..e2d119862 100644 --- a/drivers/usb/misc/ldusb.c +++ b/drivers/usb/misc/ldusb.c @@ -27,12 +27,12 @@ * V0.13 (mh) Added support for LD X-Ray and Machine Test System */ +#include #include #include #include #include #include -#include #include #include @@ -172,7 +172,7 @@ struct ld_usb { }; /* prevent races between open() and disconnect() */ -static DEFINE_MUTEX(disconnect_mutex); +static DECLARE_MUTEX(disconnect_sem); static struct usb_driver ld_usb_driver; @@ -293,7 +293,7 @@ static int ld_usb_open(struct inode *inode, struct file *file) nonseekable_open(inode, file); subminor = iminor(inode); - mutex_lock(&disconnect_mutex); + down(&disconnect_sem); interface = usb_find_interface(&ld_usb_driver, subminor); @@ -355,7 +355,7 @@ unlock_exit: up(&dev->sem); unlock_disconnect_exit: - mutex_unlock(&disconnect_mutex); + up(&disconnect_sem); return retval; } @@ -626,11 +626,12 @@ static int ld_usb_probe(struct usb_interface *intf, const struct usb_device_id * /* allocate memory for our device state and intialize it */ - dev = kzalloc(sizeof(*dev), GFP_KERNEL); + dev = kmalloc(sizeof(*dev), GFP_KERNEL); if (dev == NULL) { dev_err(&intf->dev, "Out of memory\n"); goto exit; } + memset(dev, 0x00, sizeof(*dev)); init_MUTEX(&dev->sem); dev->intf = intf; init_waitqueue_head(&dev->read_wait); @@ -740,7 +741,7 @@ static void ld_usb_disconnect(struct usb_interface *intf) struct ld_usb *dev; int minor; - mutex_lock(&disconnect_mutex); + down(&disconnect_sem); dev = usb_get_intfdata(intf); usb_set_intfdata(intf, NULL); @@ -761,7 +762,7 @@ static void ld_usb_disconnect(struct usb_interface *intf) up(&dev->sem); } - mutex_unlock(&disconnect_mutex); + up(&disconnect_sem); dev_info(&intf->dev, "LD USB Device #%d now disconnected\n", (minor - USB_LD_MINOR_BASE)); diff --git a/drivers/usb/misc/legousbtower.c b/drivers/usb/misc/legousbtower.c index 7699d970e..1336745b8 100644 --- a/drivers/usb/misc/legousbtower.c +++ b/drivers/usb/misc/legousbtower.c @@ -75,6 +75,7 @@ * - move reset into open to clean out spurious data */ +#include #include #include #include @@ -82,7 +83,6 @@ #include #include #include -#include #include #include #include @@ -256,7 +256,7 @@ static void tower_disconnect (struct usb_interface *interface); /* prevent races between open() and disconnect */ -static DEFINE_MUTEX (disconnect_mutex); +static DECLARE_MUTEX (disconnect_sem); /* file operations needed when we register this driver */ static struct file_operations tower_fops = { @@ -349,7 +349,7 @@ static int tower_open (struct inode *inode, struct file *file) nonseekable_open(inode, file); subminor = iminor(inode); - mutex_lock (&disconnect_mutex); + down (&disconnect_sem); interface = usb_find_interface (&tower_driver, subminor); @@ -427,7 +427,7 @@ unlock_exit: up (&dev->sem); unlock_disconnect_exit: - mutex_unlock (&disconnect_mutex); + up (&disconnect_sem); dbg(2, "%s: leave, return value %d ", __FUNCTION__, retval); @@ -1005,7 +1005,7 @@ static void tower_disconnect (struct usb_interface *interface) dbg(2, "%s: enter", __FUNCTION__); - mutex_lock (&disconnect_mutex); + down (&disconnect_sem); dev = usb_get_intfdata (interface); usb_set_intfdata (interface, NULL); @@ -1027,7 +1027,7 @@ static void tower_disconnect (struct usb_interface *interface) up (&dev->sem); } - mutex_unlock (&disconnect_mutex); + up (&disconnect_sem); info("LEGO USB Tower #%d now disconnected", (minor - LEGO_USB_TOWER_MINOR_BASE)); diff --git a/drivers/usb/misc/phidgetkit.c b/drivers/usb/misc/phidgetkit.c index bfbbbfbb9..605a3c87e 100644 --- a/drivers/usb/misc/phidgetkit.c +++ b/drivers/usb/misc/phidgetkit.c @@ -1,8 +1,7 @@ /* * USB PhidgetInterfaceKit driver 1.0 * - * Copyright (C) 2004, 2006 Sean Young - * Copyright (C) 2005 Daniel Saakes + * Copyright (C) 2004 Sean Young * Copyright (C) 2004 Greg Kroah-Hartman * * This program is free software; you can redistribute it and/or modify @@ -13,6 +12,7 @@ * This is a driver for the USB PhidgetInterfaceKit. */ +#include #include #include #include @@ -25,7 +25,6 @@ #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 @@ -33,9 +32,7 @@ #define USB_VENDOR_ID_WISEGROUP 0x0925 #define USB_DEVICE_ID_INTERFACEKIT884 0x8201 -#define MAX_INTERFACES 16 - -#define URB_INT_SIZE 8 +#define MAX_INTERFACES 8 struct driver_interfacekit { int sensors; @@ -55,24 +52,19 @@ 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 interfacekit { +struct phidget_interfacekit { struct usb_device *udev; struct usb_interface *intf; struct driver_interfacekit *ifkit; - unsigned long outputs; - u8 inputs[MAX_INTERFACES]; - u16 sensors[MAX_INTERFACES]; + int outputs[MAX_INTERFACES]; + int inputs[MAX_INTERFACES]; + int 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[] = { @@ -84,33 +76,34 @@ 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 interfacekit *kit, int output_num, int enable) +static int change_outputs(struct phidget_interfacekit *kit, int output_num, int enable) { - u8 *buffer; + unsigned char *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); + buffer = kmalloc(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); - dev_dbg(&kit->udev->dev, "sending data: 0x%04x\n", (u16)kit->outputs); + kit->outputs[output_num] = enable; + memset(buffer, 0, 4); + 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]); retval = usb_control_msg(kit->udev, usb_sndctrlpipe(kit->udev, 0), @@ -124,10 +117,10 @@ static int change_outputs(struct interfacekit *kit, int output_num, int enable) return retval < 0 ? retval : 0; } -static int change_string(struct interfacekit *kit, const char *display, unsigned char row) +static int change_string(struct phidget_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; @@ -183,7 +176,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 interfacekit *kit = usb_get_intfdata(intf); \ + struct phidget_interfacekit *kit = usb_get_intfdata(intf); \ change_string(kit, buf, number - 1); \ return count; \ } \ @@ -194,12 +187,12 @@ 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 interfacekit *kit = usb_get_intfdata(intf); + struct phidget_interfacekit *kit = usb_get_intfdata(intf); int enabled; unsigned char *buffer; int retval = -ENOMEM; - buffer = kzalloc(8, GFP_KERNEL); + buffer = kmalloc(8, GFP_KERNEL); if (!buffer) { dev_err(&kit->udev->dev, "%s - out of memory\n", __FUNCTION__); goto exit; @@ -209,6 +202,7 @@ static ssize_t set_backlight(struct device *dev, struct device_attribute *attr, retval = -EINVAL; goto exit; } + memset(buffer, 0x00, 8); if (enabled) buffer[0] = 0x01; buffer[7] = 0x11; @@ -228,7 +222,7 @@ exit: } static DEVICE_ATTR(backlight, S_IWUGO, NULL, set_backlight); -static void remove_lcd_files(struct interfacekit *kit) +static void remove_lcd_files(struct phidget_interfacekit *kit) { if (kit->lcd_files_on) { dev_dbg(&kit->udev->dev, "Removing lcd files\n"); @@ -241,7 +235,7 @@ static void remove_lcd_files(struct 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 interfacekit *kit = usb_get_intfdata(intf); + struct phidget_interfacekit *kit = usb_get_intfdata(intf); int enable; if (kit->ifkit->has_lcd == 0) @@ -271,10 +265,10 @@ static DEVICE_ATTR(lcd, S_IWUGO, NULL, enable_lcd_files); static void interfacekit_irq(struct urb *urb, struct pt_regs *regs) { - struct interfacekit *kit = urb->context; + struct phidget_interfacekit *kit = urb->context; unsigned char *buffer = kit->data; - int i, level, sensor; int status; + int n; switch (urb->status) { case 0: /* success */ @@ -288,63 +282,22 @@ static void interfacekit_irq(struct urb *urb, struct pt_regs *regs) goto resubmit; } - /* 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); - } - } + for (n=0; n<8; n++) { + kit->inputs[n] = buffer[1] & (1 << n) ? 1 : 0; } - 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); - } - } - } - - /* 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 (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; } - if (kit->input_events || kit->sensor_events) - schedule_work(&kit->do_notify); - resubmit: status = usb_submit_urb(urb, SLAB_ATOMIC); if (status) @@ -353,40 +306,20 @@ 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 interfacekit *kit = usb_get_intfdata(intf); \ + struct phidget_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); \ + retval = change_outputs(kit, value - 1, enabled ? 1 : 0); \ \ return retval ? retval : count; \ } \ @@ -394,9 +327,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 interfacekit *kit = usb_get_intfdata(intf); \ + struct phidget_interfacekit *kit = usb_get_intfdata(intf); \ \ - return sprintf(buf, "%d\n", !!test_bit(value - 1, &kit->outputs));\ + return sprintf(buf, "%d\n", kit->outputs[value - 1]); \ } \ static DEVICE_ATTR(output##value, S_IWUGO | S_IRUGO, \ show_output##value, set_output##value); @@ -407,23 +340,15 @@ show_set_output(4); show_set_output(5); show_set_output(6); show_set_output(7); -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); +show_set_output(8); /* should be MAX_INTERFACES - 1 */ #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 interfacekit *kit = usb_get_intfdata(intf); \ + struct phidget_interfacekit *kit = usb_get_intfdata(intf); \ \ - return sprintf(buf, "%d\n", (int)kit->inputs[value - 1]); \ + return sprintf(buf, "%d\n", kit->inputs[value - 1]); \ } \ static DEVICE_ATTR(input##value, S_IRUGO, show_input##value, NULL); @@ -434,23 +359,15 @@ show_input(4); show_input(5); show_input(6); show_input(7); -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); +show_input(8); /* should be MAX_INTERFACES - 1 */ #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 interfacekit *kit = usb_get_intfdata(intf); \ + struct phidget_interfacekit *kit = usb_get_intfdata(intf); \ \ - return sprintf(buf, "%d\n", (int)kit->sensors[value - 1]); \ + return sprintf(buf, "%d\n", kit->sensors[value - 1]); \ } \ static DEVICE_ATTR(sensor##value, S_IRUGO, show_sensor##value, NULL); @@ -461,16 +378,16 @@ show_sensor(4); show_sensor(5); show_sensor(6); show_sensor(7); -show_sensor(8); +show_sensor(8); /* should be MAX_INTERFACES - 1 */ 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 interfacekit *kit; + struct phidget_interfacekit *kit; struct driver_interfacekit *ifkit; - int pipe, maxp, rc = -ENOMEM; + int pipe, maxp; ifkit = (struct driver_interfacekit *)id->driver_info; if (!ifkit) @@ -489,24 +406,31 @@ static int interfacekit_probe(struct usb_interface *intf, const struct usb_devic pipe = usb_rcvintpipe(dev, endpoint->bEndpointAddress); maxp = usb_maxpacket(dev, pipe, usb_pipeout(pipe)); - kit = kzalloc(sizeof(*kit), GFP_KERNEL); - if (!kit) - goto out; - + kit = kmalloc(sizeof(*kit), GFP_KERNEL); + if (kit == NULL) { + dev_err(&intf->dev, "%s - out of memory\n", __FUNCTION__); + return -ENOMEM; + } + memset(kit, 0, sizeof(*kit)); kit->ifkit = ifkit; - kit->data = usb_buffer_alloc(dev, URB_INT_SIZE, SLAB_ATOMIC, &kit->data_dma); - if (!kit->data) - goto out; + + kit->data = usb_buffer_alloc(dev, 8, SLAB_ATOMIC, &kit->data_dma); + if (!kit->data) { + kfree(kit); + return -ENOMEM; + } kit->irq = usb_alloc_urb(0, GFP_KERNEL); - if (!kit->irq) - goto out; + if (!kit->irq) { + usb_buffer_free(dev, 8, kit->data, kit->data_dma); + kfree(kit); + return -ENOMEM; + } 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 > URB_INT_SIZE ? URB_INT_SIZE : maxp, + (maxp > 8 ? 8 : maxp), interfacekit_irq, kit, endpoint->bInterval); kit->irq->transfer_dma = kit->data_dma; kit->irq->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; @@ -514,8 +438,7 @@ 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)) { - rc = -EIO; - goto out; + return -EIO; } if (ifkit->outputs >= 4) { @@ -524,22 +447,12 @@ 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); @@ -547,22 +460,12 @@ 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); @@ -575,8 +478,9 @@ 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); @@ -585,56 +489,29 @@ 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 interfacekit *kit; + struct phidget_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); @@ -642,22 +519,12 @@ 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); @@ -670,15 +537,19 @@ 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 c0df79c96..b3418d2bc 100644 --- a/drivers/usb/misc/phidgetservo.c +++ b/drivers/usb/misc/phidgetservo.c @@ -25,6 +25,7 @@ * */ +#include #include #include #include @@ -251,11 +252,12 @@ 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 = kzalloc(sizeof (struct phidget_servo), GFP_KERNEL); + dev = kmalloc(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; diff --git a/drivers/usb/misc/sisusbvga/sisusb.c b/drivers/usb/misc/sisusbvga/sisusb.c index a1d78ca68..3260d5954 100644 --- a/drivers/usb/misc/sisusbvga/sisusb.c +++ b/drivers/usb/misc/sisusbvga/sisusb.c @@ -36,7 +36,7 @@ * */ -#include +#include #include #include #include @@ -52,7 +52,6 @@ #include #include "sisusb.h" -#include "sisusb_init.h" #ifdef INCL_SISUSB_CON #include @@ -63,6 +62,36 @@ /* Forward declarations / clean-up routines */ #ifdef INCL_SISUSB_CON +int sisusb_setreg(struct sisusb_usb_data *sisusb, int port, u8 data); +int sisusb_getreg(struct sisusb_usb_data *sisusb, int port, u8 *data); +int sisusb_setidxreg(struct sisusb_usb_data *sisusb, int port, u8 index, u8 data); +int sisusb_getidxreg(struct sisusb_usb_data *sisusb, int port, u8 index, u8 *data); +int sisusb_setidxregandor(struct sisusb_usb_data *sisusb, int port, u8 idx, u8 myand, u8 myor); +int sisusb_setidxregor(struct sisusb_usb_data *sisusb, int port, u8 index, u8 myor); +int sisusb_setidxregand(struct sisusb_usb_data *sisusb, int port, u8 idx, u8 myand); + +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_writew(struct sisusb_usb_data *sisusb, u32 adr, u16 data); +int sisusb_readw(struct sisusb_usb_data *sisusb, u32 adr, u16 *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); + +extern int SiSUSBSetMode(struct SiS_Private *SiS_Pr, unsigned short ModeNo); +extern int SiSUSBSetVESAMode(struct SiS_Private *SiS_Pr, unsigned short VModeNo); + +extern void sisusb_init_concode(void); +extern int sisusb_console_init(struct sisusb_usb_data *sisusb, int first, int last); +extern void sisusb_console_exit(struct sisusb_usb_data *sisusb); + +extern void sisusb_set_cursor(struct sisusb_usb_data *sisusb, unsigned int location); + +extern 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); + static int sisusb_first_vc = 0; static int sisusb_last_vc = 0; module_param_named(first, sisusb_first_vc, int, 0); @@ -73,7 +102,7 @@ MODULE_PARM_DESC(last, "Number of last console to take over (1 - MAX_NR_CONSOLES static struct usb_driver sisusb_driver; -DEFINE_MUTEX(disconnect_mutex); +DECLARE_MUTEX(disconnect_sem); static void sisusb_free_buffers(struct sisusb_usb_data *sisusb) @@ -1330,6 +1359,9 @@ sisusb_getreg(struct sisusb_usb_data *sisusb, int port, u8 *data) } #endif +#ifndef INCL_SISUSB_CON +static +#endif int sisusb_setidxreg(struct sisusb_usb_data *sisusb, int port, u8 index, u8 data) { @@ -1339,6 +1371,9 @@ sisusb_setidxreg(struct sisusb_usb_data *sisusb, int port, u8 index, u8 data) return ret; } +#ifndef INCL_SISUSB_CON +static +#endif int sisusb_getidxreg(struct sisusb_usb_data *sisusb, int port, u8 index, u8 *data) { @@ -1348,6 +1383,9 @@ sisusb_getidxreg(struct sisusb_usb_data *sisusb, int port, u8 index, u8 *data) return ret; } +#ifndef INCL_SISUSB_CON +static +#endif int sisusb_setidxregandor(struct sisusb_usb_data *sisusb, int port, u8 idx, u8 myand, u8 myor) @@ -1377,12 +1415,18 @@ sisusb_setidxregmask(struct sisusb_usb_data *sisusb, int port, u8 idx, return ret; } +#ifndef INCL_SISUSB_CON +static +#endif int sisusb_setidxregor(struct sisusb_usb_data *sisusb, int port, u8 index, u8 myor) { return(sisusb_setidxregandor(sisusb, port, index, 0xff, myor)); } +#ifndef INCL_SISUSB_CON +static +#endif int sisusb_setidxregand(struct sisusb_usb_data *sisusb, int port, u8 idx, u8 myand) { @@ -1404,8 +1448,6 @@ 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) { @@ -1418,8 +1460,6 @@ 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) @@ -2512,39 +2552,39 @@ sisusb_open(struct inode *inode, struct file *file) struct usb_interface *interface; int subminor = iminor(inode); - mutex_lock(&disconnect_mutex); + down(&disconnect_sem); if (!(interface = usb_find_interface(&sisusb_driver, subminor))) { printk(KERN_ERR "sisusb[%d]: Failed to find interface\n", subminor); - mutex_unlock(&disconnect_mutex); + up(&disconnect_sem); return -ENODEV; } if (!(sisusb = usb_get_intfdata(interface))) { - mutex_unlock(&disconnect_mutex); + up(&disconnect_sem); return -ENODEV; } - mutex_lock(&sisusb->lock); + down(&sisusb->lock); if (!sisusb->present || !sisusb->ready) { - mutex_unlock(&sisusb->lock); - mutex_unlock(&disconnect_mutex); + up(&sisusb->lock); + up(&disconnect_sem); return -ENODEV; } if (sisusb->isopen) { - mutex_unlock(&sisusb->lock); - mutex_unlock(&disconnect_mutex); + up(&sisusb->lock); + up(&disconnect_sem); return -EBUSY; } if (!sisusb->devinit) { if (sisusb->sisusb_dev->speed == USB_SPEED_HIGH) { if (sisusb_init_gfxdevice(sisusb, 0)) { - mutex_unlock(&sisusb->lock); - mutex_unlock(&disconnect_mutex); + up(&sisusb->lock); + up(&disconnect_sem); printk(KERN_ERR "sisusbvga[%d]: Failed to initialize " "device\n", @@ -2552,8 +2592,8 @@ sisusb_open(struct inode *inode, struct file *file) return -EIO; } } else { - mutex_unlock(&sisusb->lock); - mutex_unlock(&disconnect_mutex); + up(&sisusb->lock); + up(&disconnect_sem); printk(KERN_ERR "sisusbvga[%d]: Device not attached to " "USB 2.0 hub\n", @@ -2569,9 +2609,9 @@ sisusb_open(struct inode *inode, struct file *file) file->private_data = sisusb; - mutex_unlock(&sisusb->lock); + up(&sisusb->lock); - mutex_unlock(&disconnect_mutex); + up(&disconnect_sem); return 0; } @@ -2602,14 +2642,14 @@ sisusb_release(struct inode *inode, struct file *file) struct sisusb_usb_data *sisusb; int myminor; - mutex_lock(&disconnect_mutex); + down(&disconnect_sem); if (!(sisusb = (struct sisusb_usb_data *)file->private_data)) { - mutex_unlock(&disconnect_mutex); + up(&disconnect_sem); return -ENODEV; } - mutex_lock(&sisusb->lock); + down(&sisusb->lock); if (sisusb->present) { /* Wait for all URBs to finish if device still present */ @@ -2622,12 +2662,12 @@ sisusb_release(struct inode *inode, struct file *file) sisusb->isopen = 0; file->private_data = NULL; - mutex_unlock(&sisusb->lock); + up(&sisusb->lock); /* decrement the usage count on our device */ kref_put(&sisusb->kref, sisusb_delete); - mutex_unlock(&disconnect_mutex); + up(&disconnect_sem); return 0; } @@ -2645,11 +2685,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; - mutex_lock(&sisusb->lock); + down(&sisusb->lock); /* Sanity check */ if (!sisusb->present || !sisusb->ready || !sisusb->sisusb_dev) { - mutex_unlock(&sisusb->lock); + up(&sisusb->lock); return -ENODEV; } @@ -2744,7 +2784,7 @@ sisusb_read(struct file *file, char __user *buffer, size_t count, loff_t *ppos) (*ppos) <= SISUSB_PCI_PSEUDO_PCIBASE + 0x5c) { if (count != 4) { - mutex_unlock(&sisusb->lock); + up(&sisusb->lock); return -EINVAL; } @@ -2768,7 +2808,7 @@ sisusb_read(struct file *file, char __user *buffer, size_t count, loff_t *ppos) (*ppos) += bytes_read; - mutex_unlock(&sisusb->lock); + up(&sisusb->lock); return errno ? errno : bytes_read; } @@ -2787,11 +2827,11 @@ sisusb_write(struct file *file, const char __user *buffer, size_t count, if (!(sisusb = (struct sisusb_usb_data *)file->private_data)) return -ENODEV; - mutex_lock(&sisusb->lock); + down(&sisusb->lock); /* Sanity check */ if (!sisusb->present || !sisusb->ready || !sisusb->sisusb_dev) { - mutex_unlock(&sisusb->lock); + up(&sisusb->lock); return -ENODEV; } @@ -2890,7 +2930,7 @@ sisusb_write(struct file *file, const char __user *buffer, size_t count, (*ppos) <= SISUSB_PCI_PSEUDO_PCIBASE + SISUSB_PCI_PCONFSIZE) { if (count != 4) { - mutex_unlock(&sisusb->lock); + up(&sisusb->lock); return -EINVAL; } @@ -2916,7 +2956,7 @@ sisusb_write(struct file *file, const char __user *buffer, size_t count, (*ppos) += bytes_written; - mutex_unlock(&sisusb->lock); + up(&sisusb->lock); return errno ? errno : bytes_written; } @@ -2930,11 +2970,11 @@ sisusb_lseek(struct file *file, loff_t offset, int orig) if (!(sisusb = (struct sisusb_usb_data *)file->private_data)) return -ENODEV; - mutex_lock(&sisusb->lock); + down(&sisusb->lock); /* Sanity check */ if (!sisusb->present || !sisusb->ready || !sisusb->sisusb_dev) { - mutex_unlock(&sisusb->lock); + up(&sisusb->lock); return -ENODEV; } @@ -2954,7 +2994,7 @@ sisusb_lseek(struct file *file, loff_t offset, int orig) ret = -EINVAL; } - mutex_unlock(&sisusb->lock); + up(&sisusb->lock); return ret; } @@ -3096,7 +3136,7 @@ sisusb_ioctl(struct inode *inode, struct file *file, unsigned int cmd, if (!(sisusb = (struct sisusb_usb_data *)file->private_data)) return -ENODEV; - mutex_lock(&sisusb->lock); + down(&sisusb->lock); /* Sanity check */ if (!sisusb->present || !sisusb->ready || !sisusb->sisusb_dev) { @@ -3148,12 +3188,12 @@ sisusb_ioctl(struct inode *inode, struct file *file, unsigned int cmd, break; default: - retval = -ENOTTY; + retval = -EINVAL; break; } err_out: - mutex_unlock(&sisusb->lock); + up(&sisusb->lock); return retval; } @@ -3211,14 +3251,15 @@ static int sisusb_probe(struct usb_interface *intf, dev->devnum); /* Allocate memory for our private */ - if (!(sisusb = kzalloc(sizeof(*sisusb), GFP_KERNEL))) { + if (!(sisusb = kmalloc(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); - mutex_init(&(sisusb->lock)); + init_MUTEX(&(sisusb->lock)); /* Register device */ if ((retval = usb_register_dev(intf, &usb_sisusb_class))) { @@ -3389,9 +3430,9 @@ static void sisusb_disconnect(struct usb_interface *intf) * protect all other routines from the disconnect * case, not the other way round. */ - mutex_lock(&disconnect_mutex); + down(&disconnect_sem); - mutex_lock(&sisusb->lock); + down(&sisusb->lock); /* Wait for all URBs to complete and kill them in case (MUST do) */ if (!sisusb_wait_all_out_complete(sisusb)) @@ -3422,20 +3463,18 @@ static void sisusb_disconnect(struct usb_interface *intf) sisusb->present = 0; sisusb->ready = 0; - mutex_unlock(&sisusb->lock); + up(&sisusb->lock); /* decrement our usage count */ kref_put(&sisusb->kref, sisusb_delete); - mutex_unlock(&disconnect_mutex); + up(&disconnect_sem); 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) }, { } diff --git a/drivers/usb/misc/sisusbvga/sisusb.h b/drivers/usb/misc/sisusbvga/sisusb.h index 8e1120a64..1d7a77cc7 100644 --- a/drivers/usb/misc/sisusbvga/sisusb.h +++ b/drivers/usb/misc/sisusbvga/sisusb.h @@ -37,18 +37,24 @@ #ifndef _SISUSB_H_ #define _SISUSB_H_ +#include #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 +#endif /* For older kernels, support for text consoles is by default * off. To ensable text console support, change the following: */ #if 0 +#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,13) #define CONFIG_USB_SISUSBVGA_CON #endif +#endif /* Version Information */ @@ -62,9 +68,11 @@ #define INCL_SISUSB_CON 1 #endif +#ifdef INCL_SISUSB_CON #include #include #include "sisusb_struct.h" +#endif /* USB related */ @@ -116,7 +124,7 @@ struct sisusb_usb_data { struct usb_interface *interface; struct kref kref; wait_queue_head_t wait_q; /* for syncind and timeouts */ - struct mutex lock; /* general race avoidance */ + struct semaphore lock; /* general race avoidance */ unsigned int ifnum; /* interface number of the USB device */ int minor; /* minor (for logging clarity) */ int isopen; /* !=0 if open */ diff --git a/drivers/usb/misc/sisusbvga/sisusb_con.c b/drivers/usb/misc/sisusbvga/sisusb_con.c index bf26c3c56..be5c1a25a 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,9 +69,27 @@ #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)) @@ -84,6 +102,8 @@ 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) { @@ -174,11 +194,11 @@ sisusb_get_sisusb_lock_and_check(unsigned short console) if (!(sisusb = sisusb_get_sisusb(console))) return NULL; - mutex_lock(&sisusb->lock); + down(&sisusb->lock); if (!sisusb_sisusb_valid(sisusb) || !sisusb->havethisconsole[console]) { - mutex_unlock(&sisusb->lock); + up(&sisusb->lock); return NULL; } @@ -216,18 +236,18 @@ sisusbcon_init(struct vc_data *c, int init) * are set up/restored. */ - mutex_lock(&disconnect_mutex); + down(&disconnect_sem); if (!(sisusb = sisusb_get_sisusb(c->vc_num))) { - mutex_unlock(&disconnect_mutex); + up(&disconnect_sem); return; } - mutex_lock(&sisusb->lock); + down(&sisusb->lock); if (!sisusb_sisusb_valid(sisusb)) { - mutex_unlock(&sisusb->lock); - mutex_unlock(&disconnect_mutex); + up(&sisusb->lock); + up(&disconnect_sem); return; } @@ -264,9 +284,9 @@ sisusbcon_init(struct vc_data *c, int init) if (!*c->vc_uni_pagedir_loc) con_set_default_unimap(c); - mutex_unlock(&sisusb->lock); + up(&sisusb->lock); - mutex_unlock(&disconnect_mutex); + up(&disconnect_sem); if (init) { c->vc_cols = cols; @@ -286,14 +306,14 @@ sisusbcon_deinit(struct vc_data *c) * and others, ie not under our control. */ - mutex_lock(&disconnect_mutex); + down(&disconnect_sem); if (!(sisusb = sisusb_get_sisusb(c->vc_num))) { - mutex_unlock(&disconnect_mutex); + up(&disconnect_sem); return; } - mutex_lock(&sisusb->lock); + down(&sisusb->lock); /* Clear ourselves in mysisusbs */ mysisusbs[c->vc_num] = NULL; @@ -312,12 +332,12 @@ sisusbcon_deinit(struct vc_data *c) } } - mutex_unlock(&sisusb->lock); + up(&sisusb->lock); /* decrement the usage count on our sisusb */ kref_put(&sisusb->kref, sisusb_delete); - mutex_unlock(&disconnect_mutex); + up(&disconnect_sem); } /* interface routine */ @@ -397,7 +417,7 @@ sisusbcon_putc(struct vc_data *c, int ch, int y, int x) #endif if (sisusb_is_inactive(c, sisusb)) { - mutex_unlock(&sisusb->lock); + up(&sisusb->lock); return; } @@ -405,7 +425,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); - mutex_unlock(&sisusb->lock); + up(&sisusb->lock); } /* Interface routine */ @@ -433,14 +453,14 @@ sisusbcon_putcs(struct vc_data *c, const unsigned short *s, sisusbcon_writew(sisusbcon_readw(s++), dest++); if (sisusb_is_inactive(c, sisusb)) { - mutex_unlock(&sisusb->lock); + up(&sisusb->lock); return; } sisusb_copy_memory(sisusb, (char *)SISUSB_VADDR(x, y), (u32)SISUSB_HADDR(x, y), count * 2, &written); - mutex_unlock(&sisusb->lock); + up(&sisusb->lock); } /* Interface routine */ @@ -484,7 +504,7 @@ sisusbcon_clear(struct vc_data *c, int y, int x, int height, int width) } if (sisusb_is_inactive(c, sisusb)) { - mutex_unlock(&sisusb->lock); + up(&sisusb->lock); return; } @@ -494,7 +514,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); - mutex_unlock(&sisusb->lock); + up(&sisusb->lock); } /* Interface routine */ @@ -556,7 +576,7 @@ sisusbcon_bmove(struct vc_data *c, int sy, int sx, #endif if (sisusb_is_inactive(c, sisusb)) { - mutex_unlock(&sisusb->lock); + up(&sisusb->lock); return; } @@ -566,7 +586,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); - mutex_unlock(&sisusb->lock); + up(&sisusb->lock); } /* interface routine */ @@ -589,7 +609,7 @@ sisusbcon_switch(struct vc_data *c) /* Don't write to screen if in gfx mode */ if (sisusb_is_inactive(c, sisusb)) { - mutex_unlock(&sisusb->lock); + up(&sisusb->lock); return 0; } @@ -598,7 +618,7 @@ sisusbcon_switch(struct vc_data *c) * as origin. */ if (c->vc_origin == (unsigned long)c->vc_screenbuf) { - mutex_unlock(&sisusb->lock); + up(&sisusb->lock); printk(KERN_DEBUG "sisusb: ASSERT ORIGIN != SCREENBUF!\n"); return 0; } @@ -615,7 +635,7 @@ sisusbcon_switch(struct vc_data *c) (u32)SISUSB_HADDR(0, 0), length, &written); - mutex_unlock(&sisusb->lock); + up(&sisusb->lock); return 0; } @@ -637,7 +657,7 @@ sisusbcon_save_screen(struct vc_data *c) /* sisusb->lock is down */ if (sisusb_is_inactive(c, sisusb)) { - mutex_unlock(&sisusb->lock); + up(&sisusb->lock); return; } @@ -649,7 +669,7 @@ sisusbcon_save_screen(struct vc_data *c) sisusbcon_memcpyw((u16 *)c->vc_screenbuf, (u16 *)c->vc_origin, length); - mutex_unlock(&sisusb->lock); + up(&sisusb->lock); } /* interface routine */ @@ -670,7 +690,7 @@ sisusbcon_set_palette(struct vc_data *c, unsigned char *table) /* sisusb->lock is down */ if (sisusb_is_inactive(c, sisusb)) { - mutex_unlock(&sisusb->lock); + up(&sisusb->lock); return -EINVAL; } @@ -685,7 +705,7 @@ sisusbcon_set_palette(struct vc_data *c, unsigned char *table) break; } - mutex_unlock(&sisusb->lock); + up(&sisusb->lock); return 0; } @@ -708,7 +728,7 @@ sisusbcon_blank(struct vc_data *c, int blank, int mode_switch) sisusb->is_gfx = blank ? 1 : 0; if (sisusb_is_inactive(c, sisusb)) { - mutex_unlock(&sisusb->lock); + up(&sisusb->lock); return 0; } @@ -757,7 +777,7 @@ sisusbcon_blank(struct vc_data *c, int blank, int mode_switch) cr63 = 0x40; break; default: - mutex_unlock(&sisusb->lock); + up(&sisusb->lock); return -EINVAL; } @@ -768,7 +788,7 @@ sisusbcon_blank(struct vc_data *c, int blank, int mode_switch) } - mutex_unlock(&sisusb->lock); + up(&sisusb->lock); return ret; } @@ -789,7 +809,7 @@ sisusbcon_scrolldelta(struct vc_data *c, int lines) /* sisusb->lock is down */ if (sisusb_is_inactive(c, sisusb)) { - mutex_unlock(&sisusb->lock); + up(&sisusb->lock); return 0; } @@ -829,7 +849,7 @@ sisusbcon_scrolldelta(struct vc_data *c, int lines) sisusbcon_set_start_address(sisusb, c); - mutex_unlock(&sisusb->lock); + up(&sisusb->lock); return 1; } @@ -847,7 +867,7 @@ sisusbcon_cursor(struct vc_data *c, int mode) /* sisusb->lock is down */ if (sisusb_is_inactive(c, sisusb)) { - mutex_unlock(&sisusb->lock); + up(&sisusb->lock); return; } @@ -859,7 +879,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; - mutex_unlock(&sisusb->lock); + up(&sisusb->lock); return; } @@ -899,7 +919,7 @@ sisusbcon_cursor(struct vc_data *c, int mode) sisusb->sisusb_cursor_size_to = to; } - mutex_unlock(&sisusb->lock); + up(&sisusb->lock); } static int @@ -941,7 +961,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); - mutex_unlock(&sisusb->lock); + up(&sisusb->lock); return 1; } @@ -974,7 +994,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)) { - mutex_unlock(&sisusb->lock); + up(&sisusb->lock); return 0; } @@ -1064,7 +1084,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; - mutex_unlock(&sisusb->lock); + up(&sisusb->lock); return 1; } @@ -1086,7 +1106,7 @@ sisusbcon_set_origin(struct vc_data *c) /* sisusb->lock is down */ if (sisusb_is_inactive(c, sisusb) || sisusb->con_blanked) { - mutex_unlock(&sisusb->lock); + up(&sisusb->lock); return 0; } @@ -1096,7 +1116,7 @@ sisusbcon_set_origin(struct vc_data *c) sisusb->con_rolled_over = 0; - mutex_unlock(&sisusb->lock); + up(&sisusb->lock); return 1; } @@ -1113,7 +1133,7 @@ sisusbcon_resize(struct vc_data *c, unsigned int newcols, unsigned int newrows) fh = sisusb->current_font_height; - mutex_unlock(&sisusb->lock); + up(&sisusb->lock); /* We are quite unflexible as regards resizing. The vt code * handles sizes where the line length isn't equal the pitch @@ -1147,7 +1167,7 @@ sisusbcon_do_font_op(struct sisusb_usb_data *sisusb, int set, int slot, if ((slot != 0 && slot != 2) || !fh) { if (uplock) - mutex_unlock(&sisusb->lock); + up(&sisusb->lock); return -EINVAL; } @@ -1307,7 +1327,7 @@ sisusbcon_do_font_op(struct sisusb_usb_data *sisusb, int set, int slot, } if (uplock) - mutex_unlock(&sisusb->lock); + up(&sisusb->lock); if (dorecalc && c) { int i, rows = c->vc_scan_lines / fh; @@ -1331,7 +1351,7 @@ sisusbcon_do_font_op(struct sisusb_usb_data *sisusb, int set, int slot, font_op_error: if (uplock) - mutex_unlock(&sisusb->lock); + up(&sisusb->lock); return -EIO; } @@ -1397,19 +1417,19 @@ sisusbcon_font_get(struct vc_data *c, struct console_font *font) font->charcount = 256; if (!font->data) { - mutex_unlock(&sisusb->lock); + up(&sisusb->lock); return 0; } if (!sisusb->font_backup) { - mutex_unlock(&sisusb->lock); + up(&sisusb->lock); return -ENODEV; } /* Copy 256 chars only, like vgacon */ memcpy(font->data, sisusb->font_backup, 256 * 32); - mutex_unlock(&sisusb->lock); + up(&sisusb->lock); return 0; } @@ -1466,7 +1486,7 @@ static int sisusbdummycon_dummy(void) #define SISUSBCONDUMMY (void *)sisusbdummycon_dummy -static const struct consw sisusb_dummy_con = { +const struct consw sisusb_dummy_con = { .owner = THIS_MODULE, .con_startup = sisusbdummycon_startup, .con_init = sisusbdummycon_init, @@ -1492,14 +1512,14 @@ sisusb_console_init(struct sisusb_usb_data *sisusb, int first, int last) { int i, ret, minor = sisusb->minor; - mutex_lock(&disconnect_mutex); + down(&disconnect_sem); - mutex_lock(&sisusb->lock); + down(&sisusb->lock); /* Erm.. that should not happen */ if (sisusb->haveconsole || !sisusb->SiS_Pr) { - mutex_unlock(&sisusb->lock); - mutex_unlock(&disconnect_mutex); + up(&sisusb->lock); + up(&disconnect_sem); return 1; } @@ -1509,15 +1529,15 @@ sisusb_console_init(struct sisusb_usb_data *sisusb, int first, int last) if (first > last || first > MAX_NR_CONSOLES || last > MAX_NR_CONSOLES) { - mutex_unlock(&sisusb->lock); - mutex_unlock(&disconnect_mutex); + up(&sisusb->lock); + up(&disconnect_sem); return 1; } /* If gfxcore not initialized or no consoles given, quit graciously */ if (!sisusb->gfxinit || first < 1 || last < 1) { - mutex_unlock(&sisusb->lock); - mutex_unlock(&disconnect_mutex); + up(&sisusb->lock); + up(&disconnect_sem); return 0; } @@ -1527,8 +1547,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)) { - mutex_unlock(&sisusb->lock); - mutex_unlock(&disconnect_mutex); + up(&sisusb->lock); + up(&disconnect_sem); printk(KERN_ERR "sisusbvga[%d]: Failed to set up text mode\n", minor); @@ -1551,16 +1571,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))) { - mutex_unlock(&sisusb->lock); - mutex_unlock(&disconnect_mutex); + up(&sisusb->lock); + up(&disconnect_sem); printk(KERN_ERR "sisusbvga[%d]: Failed to allocate screen buffer\n", minor); return 1; } - mutex_unlock(&sisusb->lock); - mutex_unlock(&disconnect_mutex); + up(&sisusb->lock); + up(&disconnect_sem); /* 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 9b30f8962..044fa4482 100644 --- a/drivers/usb/misc/sisusbvga/sisusb_init.c +++ b/drivers/usb/misc/sisusbvga/sisusb_init.c @@ -36,6 +36,7 @@ * */ +#include #include #include #include @@ -73,7 +74,6 @@ SiSUSB_InitPtr(struct SiS_Private *SiS_Pr) /* HELPER: Get ModeID */ /*********************************************/ -#if 0 unsigned short SiSUSB_GetModeID(int HDisplay, int VDisplay, int Depth) { @@ -157,7 +157,6 @@ SiSUSB_GetModeID(int HDisplay, int VDisplay, int Depth) return ModeIndex; } -#endif /* 0 */ /*********************************************/ /* HELPER: SetReg, GetReg */ @@ -234,7 +233,7 @@ SiS_DisplayOn(struct SiS_Private *SiS_Pr) /* HELPER: Init Port Addresses */ /*********************************************/ -static void +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 f05f83268..5b1157783 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 const struct SiS_VCLKData SiSUSB_VCLKData[] = +static struct SiS_VCLKData SiSUSB_VCLKData[] = { { 0x1b,0xe1, 25}, /* 0x00 */ { 0x4e,0xe4, 28}, /* 0x01 */ @@ -808,8 +808,8 @@ static const struct SiS_VCLKData SiSUSB_VCLKData[] = { 0x2b,0xc2, 35} /* 0x71 768@576@60 */ }; -extern struct mutex disconnect_mutex; - +void SiSUSBRegInit(struct SiS_Private *SiS_Pr, unsigned long BaseAddr); +unsigned short SiSUSB_GetModeID(int HDisplay, int VDisplay, int Depth); int SiSUSBSetMode(struct SiS_Private *SiS_Pr, unsigned short ModeNo); int SiSUSBSetVESAMode(struct SiS_Private *SiS_Pr, unsigned short VModeNo); @@ -826,19 +826,5 @@ 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 f325ecb29..94edd4726 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; - const struct SiS_VCLKData *SiS_VCLKData; + 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 e095772dd..cc3dae3f3 100644 --- a/drivers/usb/misc/usblcd.c +++ b/drivers/usb/misc/usblcd.c @@ -200,8 +200,10 @@ 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) - return -ENOMEM; + if (!urb) { + retval = -ENOMEM; + goto error; + } buf = usb_buffer_alloc(dev->udev, count, GFP_KERNEL, &urb->transfer_dma); if (!buf) { @@ -268,11 +270,12 @@ static int lcd_probe(struct usb_interface *interface, const struct usb_device_id int retval = -ENOMEM; /* allocate memory for our device state and initialize it */ - dev = kzalloc(sizeof(*dev), GFP_KERNEL); + dev = kmalloc(sizeof(*dev), GFP_KERNEL); if (dev == NULL) { err("Out of memory"); goto error; } + memset(dev, 0x00, sizeof(*dev)); kref_init(&dev->kref); dev->udev = usb_get_dev(interface_to_usbdev(interface)); diff --git a/drivers/usb/misc/usbled.c b/drivers/usb/misc/usbled.c index 0c5ee0ad6..877b081a3 100644 --- a/drivers/usb/misc/usbled.c +++ b/drivers/usb/misc/usbled.c @@ -9,6 +9,7 @@ * */ +#include #include #include #include @@ -105,11 +106,12 @@ static int led_probe(struct usb_interface *interface, const struct usb_device_id struct usb_led *dev = NULL; int retval = -ENOMEM; - dev = kzalloc(sizeof(struct usb_led), GFP_KERNEL); + dev = kmalloc(sizeof(struct usb_led), GFP_KERNEL); if (dev == NULL) { dev_err(&interface->dev, "Out of memory\n"); goto error; } + memset (dev, 0x00, sizeof (*dev)); dev->udev = usb_get_dev(udev); diff --git a/drivers/usb/misc/usbtest.c b/drivers/usb/misc/usbtest.c index 983e104dd..84fa1728f 100644 --- a/drivers/usb/misc/usbtest.c +++ b/drivers/usb/misc/usbtest.c @@ -1,3 +1,4 @@ +#include #include #include #include @@ -380,27 +381,17 @@ alloc_sglist (int nents, int max, int vary) for (i = 0; i < nents; i++) { char *buf; - unsigned j; - buf = kzalloc (size, SLAB_KERNEL); + buf = kmalloc (size, SLAB_KERNEL); if (!buf) { free_sglist (sg, i); return NULL; } + memset (buf, 0, size); /* kmalloc pages are always physically contiguous! */ sg_init_one(&sg[i], buf, size); - switch (pattern) { - case 0: - /* already zeroed */ - break; - case 1: - for (j = 0; j < size; j++) - *buf++ = (u8) (j % 63); - break; - } - if (vary) { size += vary; size %= max; @@ -435,8 +426,6 @@ static int perform_sglist ( usb_sg_wait (req); retval = req->status; - /* FIXME check resulting data pattern */ - /* FIXME if endpoint halted, clear halt (and log) */ } @@ -801,9 +790,7 @@ 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: @@ -855,9 +842,10 @@ test_ctrl_queue (struct usbtest_dev *dev, struct usbtest_param *param) * as with bulk/intr sglists, sglen is the queue depth; it also * controls which subtests run (more tests than sglen) or rerun. */ - urb = kcalloc(param->sglen, sizeof(struct urb *), SLAB_KERNEL); + urb = kmalloc (param->sglen * sizeof (struct urb *), SLAB_KERNEL); if (!urb) return -ENOMEM; + memset (urb, 0, param->sglen * sizeof (struct urb *)); for (i = 0; i < param->sglen; i++) { int pipe = usb_rcvctrlpipe (udev, 0); unsigned len; @@ -1242,12 +1230,11 @@ done: static int ctrl_out (struct usbtest_dev *dev, unsigned count, unsigned length, unsigned vary) { - unsigned i, j, len; - int retval; + unsigned i, j, len, retval; u8 *buf; char *what = "?"; struct usb_device *udev; - + if (length < 1 || length > 0xffff || vary >= length) return -EINVAL; @@ -1337,9 +1324,7 @@ 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; }; @@ -1350,14 +1335,10 @@ 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) - && !ctx->submit_error) { + if (urb->status == 0 && ctx->count > (ctx->pending - 1)) { int status = usb_submit_urb (urb, GFP_ATOMIC); switch (status) { case 0: @@ -1368,8 +1349,6 @@ 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; } } @@ -1379,8 +1358,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 out of %lu\n", - ctx->errors, ctx->packet_count); + "iso test, %lu errors\n", + ctx->errors); complete (&ctx->done); } done: @@ -1441,14 +1420,15 @@ test_iso_queue (struct usbtest_dev *dev, struct usbtest_param *param, struct usb_device *udev; unsigned i; unsigned long packets = 0; - int status = 0; + int status; 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); @@ -1480,7 +1460,6 @@ 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); @@ -1491,26 +1470,12 @@ 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); - - /* - * 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; + return 0; fail: for (i = 0; i < param->sglen; i++) { @@ -1900,9 +1865,10 @@ usbtest_probe (struct usb_interface *intf, const struct usb_device_id *id) } #endif - dev = kzalloc(sizeof(*dev), SLAB_KERNEL); + dev = kmalloc (sizeof *dev, SLAB_KERNEL); if (!dev) return -ENOMEM; + memset (dev, 0, sizeof *dev); info = (struct usbtest_info *) id->driver_info; dev->info = info; init_MUTEX (&dev->sem); diff --git a/drivers/usb/mon/mon_dma.c b/drivers/usb/mon/mon_dma.c index ddcfc01e7..0a1367b76 100644 --- a/drivers/usb/mon/mon_dma.c +++ b/drivers/usb/mon/mon_dma.c @@ -13,10 +13,7 @@ #include /* Only needed for declarations in usb_mon.h */ #include "usb_mon.h" -/* - * PC-compatibles, are, fortunately, sufficiently cache-coherent for this. - */ -#if defined(__i386__) || defined(__x86_64__) /* CONFIG_ARCH_I386 doesn't exit */ +#ifdef __i386__ /* CONFIG_ARCH_I386 does not 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 275a66f83..c34944c75 100644 --- a/drivers/usb/mon/mon_main.c +++ b/drivers/usb/mon/mon_main.c @@ -12,7 +12,6 @@ #include #include #include -#include #include "usb_mon.h" #include "../core/hcd.h" @@ -24,7 +23,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); -DEFINE_MUTEX(mon_lock); +DECLARE_MUTEX(mon_lock); static struct dentry *mon_dir; /* /dbg/usbmon */ static LIST_HEAD(mon_buses); /* All buses we know: struct mon_bus */ @@ -97,7 +96,6 @@ 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); @@ -114,32 +112,20 @@ out_unlocked: /* */ -static void mon_submit_error(struct usb_bus *ubus, struct urb *urb, int error) +static void mon_submit_error(struct usb_bus *ubus, struct urb *urb, int err) { 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; - 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); - } + /* + * XXX Capture the error code and the 'E' event. + */ - spin_unlock_irqrestore(&mbus->lock, flags); return; -out_locked: - spin_unlock_irqrestore(&mbus->lock, flags); out_unlocked: return; } @@ -165,7 +151,6 @@ 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); @@ -177,6 +162,7 @@ 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) { @@ -210,14 +196,14 @@ static void mon_bus_remove(struct usb_bus *ubus) { struct mon_bus *mbus = ubus->mon_bus; - mutex_lock(&mon_lock); + down(&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); - mutex_unlock(&mon_lock); + up(&mon_lock); } static int mon_notify(struct notifier_block *self, unsigned long action, @@ -290,8 +276,9 @@ static void mon_bus_init(struct dentry *mondir, struct usb_bus *ubus) char name[NAMESZ]; int rc; - if ((mbus = kzalloc(sizeof(struct mon_bus), GFP_KERNEL)) == NULL) + if ((mbus = kmalloc(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); @@ -320,9 +307,9 @@ static void mon_bus_init(struct dentry *mondir, struct usb_bus *ubus) goto err_create_s; mbus->dent_s = d; - mutex_lock(&mon_lock); + down(&mon_lock); list_add_tail(&mbus->bus_link, &mon_buses); - mutex_unlock(&mon_lock); + up(&mon_lock); return; err_create_s: @@ -360,11 +347,11 @@ static int __init mon_init(void) usb_register_notify(&mon_nb); - mutex_lock(&usb_bus_list_lock); + down(&usb_bus_list_lock); list_for_each_entry (ubus, &usb_bus_list, bus_list) { mon_bus_init(mondir, ubus); } - mutex_unlock(&usb_bus_list_lock); + up(&usb_bus_list_lock); return 0; } @@ -376,7 +363,7 @@ static void __exit mon_exit(void) usb_unregister_notify(&mon_nb); usb_mon_deregister(); - mutex_lock(&mon_lock); + down(&mon_lock); while (!list_empty(&mon_buses)) { p = mon_buses.next; mbus = list_entry(p, struct mon_bus, bus_link); @@ -400,7 +387,7 @@ static void __exit mon_exit(void) mon_dissolve(mbus, mbus->u_bus); kref_put(&mbus->ref, mon_bus_drop); } - mutex_unlock(&mon_lock); + up(&mon_lock); debugfs_remove(mon_dir); } diff --git a/drivers/usb/mon/mon_stat.c b/drivers/usb/mon/mon_stat.c index 86ad2b381..6e4b165d0 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->i_private; + mbus = inode->u.generic_ip; sp->slen = snprintf(sp->str, STAT_BUF_SIZE, - "nreaders %d events %u text_lost %u\n", - mbus->nreaders, mbus->cnt_events, mbus->cnt_text_lost); + "nreaders %d text_lost %u\n", + mbus->nreaders, 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 2fd39b4fa..611612146 100644 --- a/drivers/usb/mon/mon_text.c +++ b/drivers/usb/mon/mon_text.c @@ -8,7 +8,6 @@ #include #include #include -#include #include #include "usb_mon.h" @@ -26,13 +25,10 @@ /* * 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 (2*PAGE_SIZE / sizeof(struct mon_event_text)) +#define EVENT_MAX 25 -#define PRINTF_DFL 160 +#define PRINTF_DFL 130 struct mon_event_text { struct list_head e_link; @@ -58,12 +54,13 @@ struct mon_reader_text { wait_queue_head_t wait; int printf_size; char *printf_buf; - struct mutex printf_lock; + struct semaphore 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 @@ -113,7 +110,7 @@ static inline char mon_text_get_data(struct mon_event_text *ep, struct urb *urb, * number of corner cases, but it seems that the following is * more or less safe. * - * We do not even try to look at transfer_buffer, because it can + * We do not even try to look transfer_buffer, because it can * contain non-NULL garbage in case the upper level promised to * set DMA for the HCD. */ @@ -181,32 +178,6 @@ 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. */ @@ -237,18 +208,19 @@ static int mon_text_open(struct inode *inode, struct file *file) struct mon_reader_text *rp; int rc; - mutex_lock(&mon_lock); - mbus = inode->i_private; + down(&mon_lock); + mbus = inode->u.generic_ip; ubus = mbus->u_bus; - rp = kzalloc(sizeof(struct mon_reader_text), GFP_KERNEL); + rp = kmalloc(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); - mutex_init(&rp->printf_lock); + init_MUTEX(&rp->printf_lock); rp->printf_size = PRINTF_DFL; rp->printf_buf = kmalloc(rp->printf_size, GFP_KERNEL); @@ -260,14 +232,13 @@ 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, NULL); + mon_text_ctor, mon_text_dtor); if (rp->e_slab == NULL) { rc = -ENOMEM; goto err_slab; @@ -276,7 +247,7 @@ static int mon_text_open(struct inode *inode, struct file *file) mon_reader_add(mbus, &rp->r); file->private_data = rp; - mutex_unlock(&mon_lock); + up(&mon_lock); return 0; // err_busy: @@ -286,7 +257,7 @@ err_slab: err_alloc_pr: kfree(rp); err_alloc: - mutex_unlock(&mon_lock); + up(&mon_lock); return rc; } @@ -330,7 +301,7 @@ static ssize_t mon_text_read(struct file *file, char __user *buf, set_current_state(TASK_RUNNING); remove_wait_queue(&rp->wait, &waita); - mutex_lock(&rp->printf_lock); + down(&rp->printf_lock); cnt = 0; pbuf = rp->printf_buf; limit = rp->printf_size; @@ -387,7 +358,7 @@ static ssize_t mon_text_read(struct file *file, char __user *buf, if (copy_to_user(buf, rp->printf_buf, cnt)) cnt = -EFAULT; - mutex_unlock(&rp->printf_lock); + up(&rp->printf_lock); kmem_cache_free(rp->e_slab, ep); return cnt; } @@ -400,12 +371,12 @@ static int mon_text_release(struct inode *inode, struct file *file) struct list_head *p; struct mon_event_text *ep; - mutex_lock(&mon_lock); - mbus = inode->i_private; + down(&mon_lock); + mbus = inode->u.generic_ip; if (mbus->nreaders <= 0) { printk(KERN_ERR TAG ": consistency error on close\n"); - mutex_unlock(&mon_lock); + up(&mon_lock); return 0; } mon_reader_del(mbus, &rp->r); @@ -431,7 +402,7 @@ static int mon_text_release(struct inode *inode, struct file *file) kfree(rp->printf_buf); kfree(rp); - mutex_unlock(&mon_lock); + up(&mon_lock); return 0; } @@ -458,3 +429,7 @@ 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 33678c24e..4be0f9346 100644 --- a/drivers/usb/mon/usb_mon.h +++ b/drivers/usb/mon/usb_mon.h @@ -27,7 +27,6 @@ struct mon_bus { struct kref ref; /* Under mon_lock */ /* Stats */ - unsigned int cnt_events; unsigned int cnt_text_lost; }; @@ -40,7 +39,6 @@ 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); }; @@ -51,7 +49,7 @@ void mon_reader_del(struct mon_bus *mbus, struct mon_reader *r); */ extern char mon_dmapeek(unsigned char *dst, dma_addr_t dma_addr, int len); -extern struct mutex mon_lock; +extern struct semaphore 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 054059632..6c94f59db 100644 --- a/drivers/usb/net/Kconfig +++ b/drivers/usb/net/Kconfig @@ -84,6 +84,7 @@ config USB_PEGASUS config USB_RTL8150 tristate "USB RTL8150 based ethernet device support (EXPERIMENTAL)" depends on EXPERIMENTAL + select MII help Say Y here if you have RTL8150 based usb-ethernet adapter. Send me any comments you may have. @@ -301,4 +302,21 @@ 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 160f19dbd..a21e6eaab 100644 --- a/drivers/usb/net/Makefile +++ b/drivers/usb/net/Makefile @@ -15,6 +15,7 @@ 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 214ce21c1..309497061 100644 --- a/drivers/usb/net/asix.c +++ b/drivers/usb/net/asix.c @@ -1,8 +1,7 @@ /* * ASIX AX8817X based USB 2.0 Ethernet Devices - * Copyright (C) 2003-2006 David Hollis + * Copyright (C) 2003-2005 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 @@ -23,6 +22,7 @@ // #define DEBUG // error path messages, extra info // #define VERBOSE // more; success messages +#include #include #include #include @@ -37,8 +37,6 @@ #include "usbnet.h" -#define DRIVER_VERSION "14-Jun-2006" -static const char driver_name [] = "asix"; /* ASIX AX8817X based USB 2.0 Ethernet Devices */ @@ -50,25 +48,23 @@ static const char driver_name [] = "asix"; #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 AX88172_CMD_READ_NODE_ID 0x17 +#define AX_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 @@ -76,15 +72,15 @@ static const char driver_name [] = "asix"; #define AX_MONITOR_HSFS 0x10 /* AX88172 Medium Status Register values */ -#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_MEDIUM_FULL_DUPLEX 0x02 +#define AX_MEDIUM_TX_ABORT_ALLOW 0x04 +#define AX_MEDIUM_FLOW_CONTROL_EN 0x10 #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 @@ -98,78 +94,23 @@ static const char driver_name [] = "asix"; #define AX88772_IPG1_DEFAULT 0x0c #define AX88772_IPG2_DEFAULT 0x12 -/* 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 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 \ - (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 + (AX88772_MEDIUM_FULL_DUPLEX | AX88772_MEDIUM_RX_FC_ENABLE | \ + AX88772_MEDIUM_TX_FC_ENABLE | AX88772_MEDIUM_100MB | \ + AX88772_MEDIUM_RESERVED | AX88772_MEDIUM_RX_ENABLE ) + +#define AX_EEPROM_MAGIC 0xdeadbeef /* This structure cannot exceed sizeof(unsigned long [5]) AKA 20 bytes */ -struct asix_data { +struct ax8817x_data { u8 multi_filter[AX_MCAST_FILTER_SIZE]; - u8 phymode; - u8 ledmode; - u8 eeprom_len; }; struct ax88172_int_data { @@ -180,11 +121,9 @@ struct ax88172_int_data { u16 res3; } __attribute__ ((packed)); -static int asix_read_cmd(struct usbnet *dev, u8 cmd, u16 value, u16 index, +static int ax8817x_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), @@ -197,11 +136,9 @@ static int asix_read_cmd(struct usbnet *dev, u8 cmd, u16 value, u16 index, USB_CTRL_GET_TIMEOUT); } -static int asix_write_cmd(struct usbnet *dev, u8 cmd, u16 value, u16 index, +static int ax8817x_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), @@ -214,30 +151,48 @@ static int asix_write_cmd(struct usbnet *dev, u8 cmd, u16 value, u16 index, USB_CTRL_SET_TIMEOUT); } -static void asix_async_cmd_callback(struct urb *urb, struct pt_regs *regs) +static void ax8817x_async_cmd_callback(struct urb *urb, struct pt_regs *regs) { struct usb_ctrlrequest *req = (struct usb_ctrlrequest *)urb->context; if (urb->status < 0) - printk(KERN_DEBUG "asix_async_cmd_callback() failed with %d", + printk(KERN_DEBUG "ax8817x_async_cmd_callback() failed with %d", urb->status); kfree(req); usb_free_urb(urb); } +static void ax8817x_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, "ax8817x - Link Status is: %d", link); + } +} + static void -asix_write_cmd_async(struct usbnet *dev, u8 cmd, u16 value, u16 index, +ax8817x_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!"); + devdbg(dev, "Error allocating URB in write_cmd_async!"); return; } @@ -249,14 +204,14 @@ asix_write_cmd_async(struct usbnet *dev, u8 cmd, u16 value, u16 index, req->bRequestType = USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE; req->bRequest = cmd; - req->wValue = value; - req->wIndex = index; - req->wLength = size; + req->wValue = cpu_to_le16(value); + req->wIndex = cpu_to_le16(index); + req->wLength = cpu_to_le16(size); usb_fill_control_urb(urb, dev->udev, usb_sndctrlpipe(dev->udev, 0), (void *)req, data, size, - asix_async_cmd_callback, req); + ax8817x_async_cmd_callback, req); if((status = usb_submit_urb(urb, GFP_ATOMIC)) < 0) { deverr(dev, "Error submitting the control message: status=%d", @@ -266,272 +221,17 @@ asix_write_cmd_async(struct usbnet *dev, u8 cmd, u16 value, u16 index, } } -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) - deverr(dev, "Failed to enable software MII access"); - return ret; -} - -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) - deverr(dev, "Failed to enable hardware MII access"); - return ret; -} - -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) { - 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); -out1: - return ret; -} - -static int asix_sw_reset(struct usbnet *dev, u8 flags) -{ - int ret; - - ret = asix_write_cmd(dev, AX_CMD_SW_RESET, flags, 0, 0, NULL); - if (ret < 0) - 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; -} - -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) - deverr(dev, "Failed to write RX_CTL mode to 0x%04x: %02x", - mode, ret); - - return ret; -} - -static u16 asix_read_medium_status(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_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 int asix_write_medium_mode(struct usbnet *dev, u16 mode) -{ - int ret; - - 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); - - return ret; -} - -static int asix_write_gpio(struct usbnet *dev, u16 value, int sleep) -{ - int ret; - - 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 (sleep) - msleep(sleep); - - return ret; -} - -/* - * AX88772 & AX88178 have a 16-bit RX_CTL value - */ -static void asix_set_multicast(struct net_device *net) +static void ax8817x_set_multicast(struct net_device *net) { struct usbnet *dev = netdev_priv(net); - struct asix_data *data = (struct asix_data *)&dev->data; - u16 rx_ctl = AX_DEFAULT_RX_CTL; + struct ax8817x_data *data = (struct ax8817x_data *)&dev->data; + u8 rx_ctl = 0x8c; if (net->flags & IFF_PROMISC) { - rx_ctl |= AX_RX_CTL_PRO; + rx_ctl |= 0x01; } else if (net->flags & IFF_ALLMULTI || net->mc_count > AX_MAX_MCAST) { - rx_ctl |= AX_RX_CTL_AMALL; + rx_ctl |= 0x02; } else if (net->mc_count == 0) { /* just broadcast and directed */ } else { @@ -555,71 +255,80 @@ static void asix_set_multicast(struct net_device *net) mc_list = mc_list->next; } - asix_write_cmd_async(dev, AX_CMD_WRITE_MULTI_FILTER, 0, 0, + ax8817x_write_cmd_async(dev, AX_CMD_WRITE_MULTI_FILTER, 0, 0, AX_MCAST_FILTER_SIZE, data->multi_filter); - rx_ctl |= AX_RX_CTL_AM; + rx_ctl |= 0x10; } - asix_write_cmd_async(dev, AX_CMD_WRITE_RX_CTL, rx_ctl, 0, 0, NULL); + ax8817x_write_cmd_async(dev, AX_CMD_WRITE_RX_CTL, rx_ctl, 0, 0, NULL); } -static int asix_mdio_read(struct net_device *netdev, int phy_id, int loc) +static int ax8817x_mdio_read(struct net_device *netdev, int phy_id, int loc) { struct usbnet *dev = netdev_priv(netdev); u16 res; + u8 buf[1]; - asix_set_sw_mii(dev); - asix_read_cmd(dev, AX_CMD_READ_MII_REG, phy_id, + ax8817x_write_cmd(dev, AX_CMD_SET_SW_MII, 0, 0, 0, &buf); + ax8817x_read_cmd(dev, AX_CMD_READ_MII_REG, phy_id, (__u16)loc, 2, (u16 *)&res); - asix_set_hw_mii(dev); + ax8817x_write_cmd(dev, AX_CMD_SET_HW_MII, 0, 0, 0, &buf); - devdbg(dev, "asix_mdio_read() phy_id=0x%02x, loc=0x%02x, returns=0x%04x", phy_id, loc, le16_to_cpu(res & 0xffff)); + return res & 0xffff; +} - return le16_to_cpu(res & 0xffff); +/* same as above, but converts resulting value to cpu byte order */ +static int ax8817x_mdio_read_le(struct net_device *netdev, int phy_id, int loc) +{ + return le16_to_cpu(ax8817x_mdio_read(netdev,phy_id, loc)); } static void -asix_mdio_write(struct net_device *netdev, int phy_id, int loc, int val) +ax8817x_mdio_write(struct net_device *netdev, int phy_id, int loc, int val) { struct usbnet *dev = netdev_priv(netdev); - u16 res = cpu_to_le16(val); + u16 res = val; + u8 buf[1]; - 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, + ax8817x_write_cmd(dev, AX_CMD_SET_SW_MII, 0, 0, 0, &buf); + ax8817x_write_cmd(dev, AX_CMD_WRITE_MII_REG, phy_id, (__u16)loc, 2, (u16 *)&res); - asix_set_hw_mii(dev); + ax8817x_write_cmd(dev, AX_CMD_SET_HW_MII, 0, 0, 0, &buf); } -/* Get the PHY Identifier from the PHYSID1 & PHYSID2 MII registers */ -static u32 asix_get_phyid(struct usbnet *dev) +/* same as above, but converts new value to le16 byte order before writing */ +static void +ax8817x_mdio_write_le(struct net_device *netdev, int phy_id, int loc, int val) { - int phy_reg; - u32 phy_id; - - phy_reg = asix_mdio_read(dev->net, dev->mii.phy_id, MII_PHYSID1); - if (phy_reg < 0) - return 0; - - phy_id = (phy_reg & 0xffff) << 16; + ax8817x_mdio_write( netdev, phy_id, loc, cpu_to_le16(val) ); +} - phy_reg = asix_mdio_read(dev->net, dev->mii.phy_id, MII_PHYSID2); - if (phy_reg < 0) - return 0; +static int ax88172_link_reset(struct usbnet *dev) +{ + u16 lpa; + u16 adv; + u16 res; + u8 mode; - phy_id |= (phy_reg & 0xffff); + mode = AX_MEDIUM_TX_ABORT_ALLOW | AX_MEDIUM_FLOW_CONTROL_EN; + lpa = ax8817x_mdio_read_le(dev->net, dev->mii.phy_id, MII_LPA); + adv = ax8817x_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; + ax8817x_write_cmd(dev, AX_CMD_WRITE_MEDIUM_MODE, mode, 0, 0, NULL); - return phy_id; + return 0; } static void -asix_get_wol(struct net_device *net, struct ethtool_wolinfo *wolinfo) +ax8817x_get_wol(struct net_device *net, struct ethtool_wolinfo *wolinfo) { struct usbnet *dev = netdev_priv(net); u8 opt; - if (asix_read_cmd(dev, AX_CMD_READ_MONITOR_MODE, 0, 0, 1, &opt) < 0) { + if (ax8817x_read_cmd(dev, AX_CMD_READ_MONITOR_MODE, 0, 0, 1, &opt) < 0) { wolinfo->supported = 0; wolinfo->wolopts = 0; return; @@ -635,7 +344,7 @@ asix_get_wol(struct net_device *net, struct ethtool_wolinfo *wolinfo) } static int -asix_set_wol(struct net_device *net, struct ethtool_wolinfo *wolinfo) +ax8817x_set_wol(struct net_device *net, struct ethtool_wolinfo *wolinfo) { struct usbnet *dev = netdev_priv(net); u8 opt = 0; @@ -648,22 +357,19 @@ asix_set_wol(struct net_device *net, struct ethtool_wolinfo *wolinfo) if (opt != 0) opt |= AX_MONITOR_MODE; - if (asix_write_cmd(dev, AX_CMD_WRITE_MONITOR_MODE, + if (ax8817x_write_cmd(dev, AX_CMD_WRITE_MONITOR_MODE, opt, 0, 0, &buf) < 0) return -EINVAL; return 0; } -static int asix_get_eeprom_len(struct net_device *net) +static int ax8817x_get_eeprom_len(struct net_device *net) { - struct usbnet *dev = netdev_priv(net); - struct asix_data *data = (struct asix_data *)&dev->data; - - return data->eeprom_len; + return AX_EEPROM_LEN; } -static int asix_get_eeprom(struct net_device *net, +static int ax8817x_get_eeprom(struct net_device *net, struct ethtool_eeprom *eeprom, u8 *data) { struct usbnet *dev = netdev_priv(net); @@ -680,154 +386,64 @@ static int asix_get_eeprom(struct net_device *net, /* ax8817x returns 2 bytes from eeprom on read */ for (i=0; i < eeprom->len / 2; i++) { - if (asix_read_cmd(dev, AX_CMD_READ_EEPROM, + if (ax8817x_read_cmd(dev, AX_CMD_READ_EEPROM, eeprom->offset + i, 0, 2, &ebuf[i]) < 0) - return -EINVAL; - } - return 0; -} - -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); - 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) -{ - struct usbnet *dev = netdev_priv(net); - - return mii_ethtool_gset(&dev->mii,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 res; -} - -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, - .get_eeprom_len = asix_get_eeprom_len, - .get_eeprom = asix_get_eeprom, - .get_settings = asix_get_settings, - .set_settings = asix_set_settings, -}; - -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; - - 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; + return -EINVAL; } + return 0; +} - asix_write_cmd_async(dev, AX_CMD_WRITE_RX_CTL, rx_ctl, 0, 0, NULL); +static void ax8817x_get_drvinfo (struct net_device *net, + struct ethtool_drvinfo *info) +{ + /* Inherit standard device info */ + usbnet_get_drvinfo(net, info); + info->eedump_len = 0x3e; } -static int ax88172_link_reset(struct usbnet *dev) +static int ax8817x_get_settings(struct net_device *net, struct ethtool_cmd *cmd) { - u8 mode; - struct ethtool_cmd ecmd; + struct usbnet *dev = netdev_priv(net); + + return mii_ethtool_gset(&dev->mii,cmd); +} - mii_check_media(&dev->mii, 1, 1); - mii_ethtool_gset(&dev->mii, &ecmd); - mode = AX88172_MEDIUM_DEFAULT; +static int ax8817x_set_settings(struct net_device *net, struct ethtool_cmd *cmd) +{ + struct usbnet *dev = netdev_priv(net); - if (ecmd.duplex != DUPLEX_FULL) - mode |= ~AX88172_MEDIUM_FD; + return mii_ethtool_sset(&dev->mii,cmd); +} - devdbg(dev, "ax88172_link_reset() speed: %d duplex: %d setting mode to 0x%04x", ecmd.speed, ecmd.duplex, mode); +/* 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 ax8817x_ethtool_ops = { + .get_drvinfo = ax8817x_get_drvinfo, + .get_link = ethtool_op_get_link, + .get_msglevel = usbnet_get_msglevel, + .set_msglevel = usbnet_set_msglevel, + .get_wol = ax8817x_get_wol, + .set_wol = ax8817x_set_wol, + .get_eeprom_len = ax8817x_get_eeprom_len, + .get_eeprom = ax8817x_get_eeprom, + .get_settings = ax8817x_get_settings, + .set_settings = ax8817x_set_settings, +}; - asix_write_medium_mode(dev, mode); +static int ax8817x_ioctl (struct net_device *net, struct ifreq *rq, int cmd) +{ + struct usbnet *dev = netdev_priv(net); - return 0; + return generic_mii_ioctl(&dev->mii, if_mii(rq), cmd, NULL); } -static int ax88172_bind(struct usbnet *dev, struct usb_interface *intf) +static int ax8817x_bind(struct usbnet *dev, struct usb_interface *intf) { int ret = 0; 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); @@ -839,39 +455,55 @@ static int ax88172_bind(struct usbnet *dev, struct usb_interface *intf) /* Toggle the GPIOs in a manufacturer/model specific way */ for (i = 2; i >= 0; i--) { - if ((ret = asix_write_cmd(dev, AX_CMD_WRITE_GPIOS, + if ((ret = ax8817x_write_cmd(dev, AX_CMD_WRITE_GPIOS, (gpio_bits >> (i * 8)) & 0xff, 0, 0, buf)) < 0) goto out2; msleep(5); } - if ((ret = asix_write_rx_ctl(dev, 0x80)) < 0) + if ((ret = ax8817x_write_cmd(dev, AX_CMD_WRITE_RX_CTL, + 0x80, 0, 0, buf)) < 0) { + dbg("send AX_CMD_WRITE_RX_CTL failed: %d", ret); goto out2; + } /* Get the MAC address */ memset(buf, 0, ETH_ALEN); - if ((ret = asix_read_cmd(dev, AX88172_CMD_READ_NODE_ID, + if ((ret = ax8817x_read_cmd(dev, AX_CMD_READ_NODE_ID, 0, 0, 6, buf)) < 0) { dbg("read AX_CMD_READ_NODE_ID failed: %d", ret); goto out2; } memcpy(dev->net->dev_addr, buf, ETH_ALEN); + /* Get the PHY id */ + if ((ret = ax8817x_read_cmd(dev, AX_CMD_READ_PHY_ID, + 0, 0, 2, buf)) < 0) { + dbg("error on read AX_CMD_READ_PHY_ID: %02x", ret); + goto out2; + } else if (ret < 2) { + /* this should always return 2 bytes */ + dbg("AX_CMD_READ_PHY_ID returned less than 2 bytes: ret=%02x", + ret); + ret = -EIO; + 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.mdio_read = ax8817x_mdio_read; + dev->mii.mdio_write = ax8817x_mdio_write; dev->mii.phy_id_mask = 0x3f; dev->mii.reg_num_mask = 0x1f; - dev->mii.phy_id = asix_get_phy_addr(dev); - dev->net->do_ioctl = asix_ioctl; + dev->mii.phy_id = *((u8 *)buf + 1); + dev->net->do_ioctl = ax8817x_ioctl; - dev->net->set_multicast_list = ax88172_set_multicast; - dev->net->ethtool_ops = &ax88172_ethtool_ops; + dev->net->set_multicast_list = ax8817x_set_multicast; + dev->net->ethtool_ops = &ax8817x_ethtool_ops; - asix_mdio_write(dev->net, dev->mii.phy_id, MII_BMCR, BMCR_RESET); - asix_mdio_write(dev->net, dev->mii.phy_id, MII_ADVERTISE, + ax8817x_mdio_write_le(dev->net, dev->mii.phy_id, MII_BMCR, BMCR_RESET); + ax8817x_mdio_write_le(dev->net, dev->mii.phy_id, MII_ADVERTISE, ADVERTISE_ALL | ADVERTISE_CSMA | ADVERTISE_PAUSE_CAP); mii_nway_restart(&dev->mii); @@ -883,50 +515,22 @@ out1: } static struct ethtool_ops ax88772_ethtool_ops = { - .get_drvinfo = asix_get_drvinfo, - .get_link = asix_get_link, - .nway_reset = asix_nway_reset, + .get_drvinfo = ax8817x_get_drvinfo, + .get_link = ethtool_op_get_link, .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, + .get_wol = ax8817x_get_wol, + .set_wol = ax8817x_set_wol, + .get_eeprom_len = ax8817x_get_eeprom_len, + .get_eeprom = ax8817x_get_eeprom, + .get_settings = ax8817x_get_settings, + .set_settings = ax8817x_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); @@ -937,94 +541,138 @@ static int ax88772_bind(struct usbnet *dev, struct usb_interface *intf) goto out1; } - if ((ret = asix_write_gpio(dev, - AX_GPIO_RSE | AX_GPIO_GPO_2 | AX_GPIO_GPO2EN, 5)) < 0) + if ((ret = ax8817x_write_cmd(dev, AX_CMD_WRITE_GPIOS, + 0x00B0, 0, 0, buf)) < 0) goto out2; - if ((ret = asix_write_cmd(dev, AX_CMD_SW_PHY_SELECT, - 0x0000, 0, 0, buf)) < 0) { + msleep(5); + if ((ret = ax8817x_write_cmd(dev, AX_CMD_SW_PHY_SELECT, + 0x0001, 0, 0, buf)) < 0) { dbg("Select PHY #1 failed: %d", ret); goto out2; } - if ((ret = asix_sw_reset(dev, AX_SWRESET_IPPD)) < 0) + if ((ret = ax8817x_write_cmd(dev, AX_CMD_SW_RESET, AX_SWRESET_IPPD, + 0, 0, buf)) < 0) { + dbg("Failed to power down internal PHY: %d", ret); goto out2; + } msleep(150); - if ((ret = asix_sw_reset(dev, AX_SWRESET_CLEAR)) < 0) + if ((ret = ax8817x_write_cmd(dev, AX_CMD_SW_RESET, AX_SWRESET_CLEAR, + 0, 0, buf)) < 0) { + dbg("Failed to perform software reset: %d", ret); goto out2; + } msleep(150); - if ((ret = asix_sw_reset(dev, AX_SWRESET_IPRL | AX_SWRESET_PRL)) < 0) + if ((ret = ax8817x_write_cmd(dev, AX_CMD_SW_RESET, + AX_SWRESET_IPRL | AX_SWRESET_PRL, + 0, 0, buf)) < 0) { + dbg("Failed to set Internal/External PHY reset control: %d", + ret); goto out2; + } msleep(150); - 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) + if ((ret = ax8817x_write_cmd(dev, AX_CMD_WRITE_RX_CTL, + 0x0000, 0, 0, buf)) < 0) { + dbg("Failed to reset RX_CTL: %d", ret); 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, AX_CMD_READ_NODE_ID, + if ((ret = ax8817x_read_cmd(dev, AX88772_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 = ax8817x_write_cmd(dev, AX_CMD_SET_SW_MII, + 0, 0, 0, buf)) < 0) { + dbg("Enabling software MII failed: %d", ret); + goto out2; + } + + if (((ret = ax8817x_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 = 0x1f; - dev->mii.reg_num_mask = 0x1f; - dev->net->do_ioctl = asix_ioctl; - dev->mii.phy_id = asix_get_phy_addr(dev); - - phyid = asix_get_phyid(dev); - dbg("PHYID=0x%08x", phyid); + dev->mii.mdio_read = ax8817x_mdio_read; + dev->mii.mdio_write = ax8817x_mdio_write; + dev->mii.phy_id_mask = 0xff; + dev->mii.reg_num_mask = 0xff; + dev->net->do_ioctl = ax8817x_ioctl; - if ((ret = asix_sw_reset(dev, AX_SWRESET_PRL)) < 0) + /* Get the PHY id */ + if ((ret = ax8817x_read_cmd(dev, AX_CMD_READ_PHY_ID, + 0, 0, 2, buf)) < 0) { + dbg("Error reading PHY ID: %02x", ret); goto out2; + } else if (ret < 2) { + /* this should always return 2 bytes */ + dbg("AX_CMD_READ_PHY_ID returned less than 2 bytes: ret=%02x", + ret); + ret = -EIO; + goto out2; + } + dev->mii.phy_id = *((u8 *)buf + 1); + if ((ret = ax8817x_write_cmd(dev, AX_CMD_SW_RESET, AX_SWRESET_PRL, + 0, 0, buf)) < 0) { + dbg("Set external PHY reset pin level: %d", ret); + goto out2; + } msleep(150); - - if ((ret = asix_sw_reset(dev, AX_SWRESET_IPRL | AX_SWRESET_PRL)) < 0) + if ((ret = ax8817x_write_cmd(dev, AX_CMD_SW_RESET, + AX_SWRESET_IPRL | AX_SWRESET_PRL, + 0, 0, buf)) < 0) { + dbg("Set Internal/External PHY reset control: %d", ret); goto out2; - + } msleep(150); - dev->net->set_multicast_list = asix_set_multicast; + + dev->net->set_multicast_list = ax8817x_set_multicast; dev->net->ethtool_ops = &ax88772_ethtool_ops; - asix_mdio_write(dev->net, dev->mii.phy_id, MII_BMCR, BMCR_RESET); - asix_mdio_write(dev->net, dev->mii.phy_id, MII_ADVERTISE, + ax8817x_mdio_write_le(dev->net, dev->mii.phy_id, MII_BMCR, BMCR_RESET); + ax8817x_mdio_write_le(dev->net, dev->mii.phy_id, MII_ADVERTISE, ADVERTISE_ALL | ADVERTISE_CSMA); mii_nway_restart(&dev->mii); - if ((ret = asix_write_medium_mode(dev, AX88772_MEDIUM_DEFAULT)) < 0) + if ((ret = ax8817x_write_cmd(dev, AX_CMD_WRITE_MEDIUM_MODE, + AX88772_MEDIUM_DEFAULT, 0, 0, buf)) < 0) { + dbg("Write medium mode register: %d", ret); goto out2; + } - if ((ret = asix_write_cmd(dev, AX_CMD_WRITE_IPG0, + if ((ret = ax8817x_write_cmd(dev, AX_CMD_WRITE_IPG0, AX88772_IPG0_DEFAULT | AX88772_IPG1_DEFAULT, AX88772_IPG2_DEFAULT, 0, buf)) < 0) { dbg("Write IPG,IPG1,IPG2 failed: %d", ret); goto out2; } + if ((ret = + ax8817x_write_cmd(dev, AX_CMD_SET_HW_MII, 0, 0, 0, &buf)) < 0) { + dbg("Failed to set hardware MII: %02x", ret); + goto out2; + } /* Set RX_CTL to default values with 2k buffer, and enable cactus */ - if ((ret = asix_write_rx_ctl(dev, AX_DEFAULT_RX_CTL)) < 0) + if ((ret = + ax8817x_write_cmd(dev, AX_CMD_WRITE_RX_CTL, 0x0088, 0, 0, + buf)) < 0) { + dbg("Reset RX_CTL failed: %d", ret); 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); @@ -1043,291 +691,126 @@ out1: return ret; } -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) +static int ax88772_rx_fixup(struct usbnet *dev, struct sk_buff *skb) { - struct asix_data *data = (struct asix_data *)&dev->data; - u16 reg; - - devdbg(dev,"marvell_phy_init()"); - - reg = asix_mdio_read(dev->net, dev->mii.phy_id, MII_MARVELL_STATUS); - devdbg(dev,"MII_MARVELL_STATUS = 0x%04x", reg); - - asix_mdio_write(dev->net, dev->mii.phy_id, MII_MARVELL_CTRL, - MARVELL_CTRL_RXDELAY | MARVELL_CTRL_TXDELAY); - - 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); - - reg &= 0xf8ff; - reg |= (1 + 0x0100); - asix_mdio_write(dev->net, dev->mii.phy_id, - MII_MARVELL_LED_CTRL, reg); + u8 *head; + u32 header; + char *packet; + struct sk_buff *ax_skb; + u16 size; - 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); - return 0; -} + skb_pull(skb, 4); -static int marvell_led_status(struct usbnet *dev, u16 speed) -{ - u16 reg = asix_mdio_read(dev->net, dev->mii.phy_id, MARVELL_LED_MANUAL); + 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); - devdbg(dev, "marvell_led_status() read 0x%04x", reg); + 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; + } - /* Clear out the center LED bits - 0x03F0 */ - reg &= 0xfc0f; + skb_pull(skb, (size + 1) & 0xfffe); - switch (speed) { - case SPEED_1000: - reg |= 0x03e0; - break; - case SPEED_100: - reg |= 0x03b0; + if (skb->len == 0) break; - default: - reg |= 0x02f0; - } - - 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; + head = (u8 *) skb->data; + memcpy(&header, head, sizeof(header)); + le32_to_cpus(&header); + packet = head + sizeof(header); + skb_pull(skb, 4); } - 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 int ax88178_change_mtu(struct net_device *net, int new_mtu) -{ - struct usbnet *dev = netdev_priv(net); - int ll_mtu = new_mtu + net->hard_header_len + 4; - - devdbg(dev, "ax88178_change_mtu() new_mtu=%d", new_mtu); - - 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; + if (skb->len < 0) { + devdbg(dev,"invalid rx length %d", skb->len); + return 0; + } + return 1; } -static int ax88178_bind(struct usbnet *dev, struct usb_interface *intf) +static struct sk_buff *ax88772_tx_fixup(struct usbnet *dev, struct sk_buff *skb, + gfp_t flags) { - 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); + int padlen; + int headroom = skb_headroom(skb); + int tailroom = skb_tailroom(skb); + u32 packet_len; + u32 padbytes = 0xffff0000; - if (eeprom == 0xffff) { - data->phymode = PHY_MODE_MARVELL; - data->ledmode = 0; - gpio0 = 1; - } else { - data->phymode = eeprom & 7; - data->ledmode = eeprom >> 8; - gpio0 = (eeprom & 0x80) ? 0 : 1; - } - dbg("GPIO0: %d, PhyMode: %d", gpio0, data->phymode); + padlen = ((skb->len + 4) % 512) ? 0 : 4; - 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); + 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 { - 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); + struct sk_buff *skb2; + skb2 = skb_copy_expand(skb, 4, padlen, flags); + dev_kfree_skb_any(skb); + skb = skb2; + if (!skb) + return NULL; } - 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; - } - memcpy(dev->net->dev_addr, buf, ETH_ALEN); + skb_push(skb, 4); + packet_len = (((skb->len - 4) ^ 0x0000ffff) << 16) + (skb->len - 4); + memcpy(skb->data, &packet_len, sizeof(packet_len)); - /* 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; - - phyid = asix_get_phyid(dev); - dbg("PHYID=0x%08x", phyid); - - if (data->phymode == PHY_MODE_MARVELL) { - marvell_phy_init(dev); - msleep(60); + if ((skb->len % 512) == 0) { + memcpy( skb->tail, &padbytes, sizeof(padbytes)); + skb_put(skb, sizeof(padbytes)); } + return skb; +} - 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; +static int ax88772_link_reset(struct usbnet *dev) +{ + u16 lpa; + u16 adv; + u16 res; + u16 mode; - kfree(buf); + mode = AX88772_MEDIUM_DEFAULT; + lpa = ax8817x_mdio_read_le(dev->net, dev->mii.phy_id, MII_LPA); + adv = ax8817x_mdio_read_le(dev->net, dev->mii.phy_id, MII_ADVERTISE); + res = mii_nway_result(lpa|adv); - /* 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; - } + if ((res & LPA_DUPLEX) == 0) + mode &= ~AX88772_MEDIUM_FULL_DUPLEX; + if ((res & LPA_100) == 0) + mode &= ~AX88772_MEDIUM_100MB; + ax8817x_write_cmd(dev, AX_CMD_WRITE_MEDIUM_MODE, mode, 0, 0, NULL); return 0; - -out2: - kfree(buf); -out1: - return ret; } static const struct driver_info ax8817x_info = { .description = "ASIX AX8817x USB 2.0 Ethernet", - .bind = ax88172_bind, - .status = asix_status, + .bind = ax8817x_bind, + .status = ax8817x_status, .link_reset = ax88172_link_reset, .reset = ax88172_link_reset, .flags = FLAG_ETHER, @@ -1336,8 +819,8 @@ static const struct driver_info ax8817x_info = { static const struct driver_info dlink_dub_e100_info = { .description = "DLink DUB-E100 USB Ethernet", - .bind = ax88172_bind, - .status = asix_status, + .bind = ax8817x_bind, + .status = ax8817x_status, .link_reset = ax88172_link_reset, .reset = ax88172_link_reset, .flags = FLAG_ETHER, @@ -1346,8 +829,8 @@ static const struct driver_info dlink_dub_e100_info = { static const struct driver_info netgear_fa120_info = { .description = "Netgear FA-120 USB Ethernet", - .bind = ax88172_bind, - .status = asix_status, + .bind = ax8817x_bind, + .status = ax8817x_status, .link_reset = ax88172_link_reset, .reset = ax88172_link_reset, .flags = FLAG_ETHER, @@ -1356,8 +839,8 @@ static const struct driver_info netgear_fa120_info = { static const struct driver_info hawking_uf200_info = { .description = "Hawking UF200 USB Ethernet", - .bind = ax88172_bind, - .status = asix_status, + .bind = ax8817x_bind, + .status = ax8817x_status, .link_reset = ax88172_link_reset, .reset = ax88172_link_reset, .flags = FLAG_ETHER, @@ -1367,23 +850,13 @@ static const struct driver_info hawking_uf200_info = { static const struct driver_info ax88772_info = { .description = "ASIX AX88772 USB 2.0 Ethernet", .bind = ax88772_bind, - .status = asix_status, + .status = ax8817x_status, .link_reset = ax88772_link_reset, .reset = ax88772_link_reset, .flags = FLAG_ETHER | FLAG_FRAMING_AX, - .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, + .rx_fixup = ax88772_rx_fixup, + .tx_fixup = ax88772_tx_fixup, + .data = 0x00130103, }; static const struct usb_device_id products [] = { @@ -1439,10 +912,6 @@ 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), @@ -1451,18 +920,6 @@ 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 82ce0358d..63f1f3ba8 100644 --- a/drivers/usb/net/cdc_ether.c +++ b/drivers/usb/net/cdc_ether.c @@ -20,6 +20,7 @@ // #define DEBUG // error path messages, extra info // #define VERBOSE // more; success messages +#include #include #include #include @@ -30,7 +31,7 @@ #include #include #include -#include +#include #include "usbnet.h" @@ -454,18 +455,6 @@ 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 e2fae8585..ec801e8bb 100644 --- a/drivers/usb/net/cdc_subset.c +++ b/drivers/usb/net/cdc_subset.c @@ -17,6 +17,7 @@ * 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 3155f25f1..faf1e86be 100644 --- a/drivers/usb/net/gl620a.c +++ b/drivers/usb/net/gl620a.c @@ -21,6 +21,7 @@ // #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 a9b6eeac3..78e6a43b1 100644 --- a/drivers/usb/net/net1080.c +++ b/drivers/usb/net/net1080.c @@ -20,6 +20,7 @@ // #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 ab21f960d..156a2f1cb 100644 --- a/drivers/usb/net/pegasus.c +++ b/drivers/usb/net/pegasus.c @@ -163,8 +163,6 @@ 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); @@ -219,8 +217,6 @@ 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); @@ -266,14 +262,12 @@ static int set_register(pegasus_t * pegasus, __u16 indx, __u8 data) usb_fill_control_urb(pegasus->ctrl_urb, pegasus->usb, usb_sndctrlpipe(pegasus->usb, 0), (char *) &pegasus->dr, - tmp, 1, ctrl_callback, pegasus); + &tmp, 1, ctrl_callback, pegasus); add_wait_queue(&pegasus->ctrl_wait, &wait); 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); @@ -304,13 +298,10 @@ 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 == -ENODEV) - netif_device_detach(pegasus->net); + if ((ret = usb_submit_urb(pegasus->ctrl_urb, GFP_ATOMIC))) if (netif_msg_drv(pegasus)) dev_err(&pegasus->intf->dev, "%s, status %d\n", __FUNCTION__, ret); - } return ret; } @@ -327,8 +318,6 @@ static int read_mii_word(pegasus_t * pegasus, __u8 phy, __u8 indx, __u16 * regd) set_register(pegasus, PhyCtrl, (indx | PHY_READ)); for (i = 0; i < REG_TIMEOUT; i++) { ret = get_registers(pegasus, PhyCtrl, 1, data); - if (ret == -ESHUTDOWN) - goto fail; if (data[0] & PHY_DONE) break; } @@ -337,7 +326,6 @@ static int read_mii_word(pegasus_t * pegasus, __u8 phy, __u8 indx, __u16 * regd) *regd = le16_to_cpu(regdi); return ret; } -fail: if (netif_msg_drv(pegasus)) dev_warn(&pegasus->intf->dev, "fail %s\n", __FUNCTION__); @@ -366,15 +354,12 @@ static int write_mii_word(pegasus_t * pegasus, __u8 phy, __u8 indx, __u16 regd) set_register(pegasus, PhyCtrl, (indx | PHY_WRITE)); for (i = 0; i < REG_TIMEOUT; i++) { ret = get_registers(pegasus, PhyCtrl, 1, data); - if (ret == -ESHUTDOWN) - goto fail; if (data[0] & PHY_DONE) break; } if (i < REG_TIMEOUT) return ret; -fail: if (netif_msg_drv(pegasus)) dev_warn(&pegasus->intf->dev, "fail %s\n", __FUNCTION__); return -ETIMEDOUT; @@ -402,8 +387,6 @@ static int read_eprom_word(pegasus_t * pegasus, __u8 index, __u16 * retdata) ret = get_registers(pegasus, EpromCtrl, 1, &tmp); if (tmp & EPROM_DONE) break; - if (ret == -ESHUTDOWN) - goto fail; } if (i < REG_TIMEOUT) { ret = get_registers(pegasus, EpromData, 2, &retdatai); @@ -411,7 +394,6 @@ static int read_eprom_word(pegasus_t * pegasus, __u8 index, __u16 * retdata) return ret; } -fail: if (netif_msg_drv(pegasus)) dev_warn(&pegasus->intf->dev, "fail %s\n", __FUNCTION__); return -ETIMEDOUT; @@ -451,15 +433,12 @@ static int write_eprom_word(pegasus_t * pegasus, __u8 index, __u16 data) for (i = 0; i < REG_TIMEOUT; i++) { ret = get_registers(pegasus, EpromCtrl, 1, &tmp); - if (ret == -ESHUTDOWN) - goto fail; if (tmp & EPROM_DONE) break; } disable_eprom_write(pegasus); if (i < REG_TIMEOUT) return ret; -fail: if (netif_msg_drv(pegasus)) dev_warn(&pegasus->intf->dev, "fail %s\n", __FUNCTION__); return -ETIMEDOUT; @@ -545,7 +524,6 @@ static int enable_net_traffic(struct net_device *dev, struct usb_device *usb) ret = set_registers(pegasus, EthCtrl0, 3, data); if (usb_dev_id[pegasus->dev_index].vendor == VENDOR_LINKSYS || - usb_dev_id[pegasus->dev_index].vendor == VENDOR_LINKSYS2 || usb_dev_id[pegasus->dev_index].vendor == VENDOR_DLINK) { u16 auxmode; read_mii_word(pegasus, 0, 0x1b, &auxmode); @@ -701,10 +679,7 @@ goon: usb_rcvbulkpipe(pegasus->usb, 1), pegasus->rx_skb->data, PEGASUS_MTU + 8, read_bulk_callback, pegasus); - rx_status = usb_submit_urb(pegasus->rx_urb, GFP_ATOMIC); - if (rx_status == -ENODEV) - netif_device_detach(pegasus->net); - else if (rx_status) { + if (usb_submit_urb(pegasus->rx_urb, GFP_ATOMIC)) { pegasus->flags |= PEGASUS_RX_URB_FAIL; goto tl_sched; } else { @@ -721,7 +696,6 @@ static void rx_fixup(unsigned long data) { pegasus_t *pegasus; unsigned long flags; - int status; pegasus = (pegasus_t *) data; if (pegasus->flags & PEGASUS_UNPLUG) @@ -747,10 +721,7 @@ static void rx_fixup(unsigned long data) pegasus->rx_skb->data, PEGASUS_MTU + 8, read_bulk_callback, pegasus); try_again: - status = usb_submit_urb(pegasus->rx_urb, GFP_ATOMIC); - if (status == -ENODEV) - netif_device_detach(pegasus->net); - else if (status) { + if (usb_submit_urb(pegasus->rx_urb, GFP_ATOMIC)) { pegasus->flags |= PEGASUS_RX_URB_FAIL; tasklet_schedule(&pegasus->rx_tl); } else { @@ -852,8 +823,6 @@ 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); @@ -892,7 +861,6 @@ 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++; @@ -1018,8 +986,6 @@ 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; @@ -1030,8 +996,6 @@ 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); @@ -1413,8 +1377,9 @@ static int pegasus_suspend (struct usb_interface *intf, pm_message_t message) struct pegasus *pegasus = usb_get_intfdata(intf); netif_device_detach (pegasus->net); - cancel_delayed_work(&pegasus->carrier_check); if (netif_running(pegasus->net)) { + cancel_delayed_work(&pegasus->carrier_check); + usb_kill_urb(pegasus->rx_urb); usb_kill_urb(pegasus->intr_urb); } @@ -1434,9 +1399,10 @@ static int pegasus_resume (struct usb_interface *intf) pegasus->intr_urb->status = 0; pegasus->intr_urb->actual_length = 0; intr_callback(pegasus->intr_urb, NULL); + + queue_delayed_work(pegasus_workqueue, &pegasus->carrier_check, + CARRIER_CHECK_DELAY); } - queue_delayed_work(pegasus_workqueue, &pegasus->carrier_check, - CARRIER_CHECK_DELAY); return 0; } diff --git a/drivers/usb/net/pegasus.h b/drivers/usb/net/pegasus.h index 006438069..9fbd59b55 100644 --- a/drivers/usb/net/pegasus.h +++ b/drivers/usb/net/pegasus.h @@ -25,6 +25,7 @@ #define PHY_READ 0x40 #define PHY_WRITE 0x20 #define DEFAULT_GPIO_RESET 0x24 +#define LINKSYS_GPIO_RESET 0x24 #define DEFAULT_GPIO_SET 0x26 #define PEGASUS_PRESENT 0x00000001 @@ -131,7 +132,6 @@ 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 @@ -140,7 +140,6 @@ struct usb_eth_dev { #define VENDOR_KINGSTON 0x0951 #define VENDOR_LANEED 0x056e #define VENDOR_LINKSYS 0x066b -#define VENDOR_LINKSYS2 0x077b #define VENDOR_MELCO 0x0411 #define VENDOR_MICROSOFT 0x045e #define VENDOR_MOBILITY 0x1342 @@ -219,23 +218,21 @@ PEGASUS_DEV( "Corega FEter USB-TX", VENDOR_COREGA, 0x0004, PEGASUS_DEV( "Corega FEter USB-TXS", VENDOR_COREGA, 0x000d, DEFAULT_GPIO_RESET | PEGASUS_II ) PEGASUS_DEV( "D-Link DSB-650TX", VENDOR_DLINK, 0x4001, - DEFAULT_GPIO_RESET ) + LINKSYS_GPIO_RESET ) PEGASUS_DEV( "D-Link DSB-650TX", VENDOR_DLINK, 0x4002, - DEFAULT_GPIO_RESET ) + LINKSYS_GPIO_RESET ) PEGASUS_DEV( "D-Link DSB-650TX", VENDOR_DLINK, 0x4102, - DEFAULT_GPIO_RESET | PEGASUS_II ) + LINKSYS_GPIO_RESET | PEGASUS_II ) PEGASUS_DEV( "D-Link DSB-650TX", VENDOR_DLINK, 0x400b, - DEFAULT_GPIO_RESET | PEGASUS_II ) + LINKSYS_GPIO_RESET | PEGASUS_II ) PEGASUS_DEV( "D-Link DSB-650TX", VENDOR_DLINK, 0x200c, - DEFAULT_GPIO_RESET | PEGASUS_II ) + LINKSYS_GPIO_RESET | PEGASUS_II ) PEGASUS_DEV( "D-Link DSB-650TX(PNA)", VENDOR_DLINK, 0x4003, DEFAULT_GPIO_RESET | HAS_HOME_PNA ) 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, @@ -263,19 +260,17 @@ PEGASUS_DEV( "LANEED USB Ethernet LD-USB/T", VENDOR_LANEED, 0xabc1, PEGASUS_DEV( "LANEED USB Ethernet LD-USB/TX", VENDOR_LANEED, 0x200c, DEFAULT_GPIO_RESET | PEGASUS_II ) PEGASUS_DEV( "Linksys USB10TX", VENDOR_LINKSYS, 0x2202, - DEFAULT_GPIO_RESET ) + LINKSYS_GPIO_RESET ) PEGASUS_DEV( "Linksys USB100TX", VENDOR_LINKSYS, 0x2203, - DEFAULT_GPIO_RESET ) + LINKSYS_GPIO_RESET ) PEGASUS_DEV( "Linksys USB100TX", VENDOR_LINKSYS, 0x2204, - DEFAULT_GPIO_RESET | HAS_HOME_PNA ) + LINKSYS_GPIO_RESET | HAS_HOME_PNA ) PEGASUS_DEV( "Linksys USB10T Ethernet Adapter", VENDOR_LINKSYS, 0x2206, - DEFAULT_GPIO_RESET | PEGASUS_II) -PEGASUS_DEV( "Linksys USBVPN1", VENDOR_LINKSYS2, 0x08b4, - DEFAULT_GPIO_RESET ) + LINKSYS_GPIO_RESET | PEGASUS_II) PEGASUS_DEV( "Linksys USB USB100TX", VENDOR_LINKSYS, 0x400b, - DEFAULT_GPIO_RESET | PEGASUS_II ) + LINKSYS_GPIO_RESET | PEGASUS_II ) PEGASUS_DEV( "Linksys USB10TX", VENDOR_LINKSYS, 0x200c, - DEFAULT_GPIO_RESET | PEGASUS_II ) + LINKSYS_GPIO_RESET | PEGASUS_II ) PEGASUS_DEV( "MELCO/BUFFALO LUA-TX", VENDOR_MELCO, 0x0001, DEFAULT_GPIO_RESET ) PEGASUS_DEV( "MELCO/BUFFALO LUA-TX", VENDOR_MELCO, 0x0005, diff --git a/drivers/usb/net/plusb.c b/drivers/usb/net/plusb.c index 5d17cdfc7..4fe863389 100644 --- a/drivers/usb/net/plusb.c +++ b/drivers/usb/net/plusb.c @@ -20,6 +20,7 @@ // #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 c2a28d88e..49991ac1b 100644 --- a/drivers/usb/net/rndis_host.c +++ b/drivers/usb/net/rndis_host.c @@ -20,6 +20,7 @@ // #define DEBUG // error path messages, extra info // #define VERBOSE // more; success messages +#include #include #include #include @@ -29,7 +30,7 @@ #include #include #include -#include +#include #include "usbnet.h" @@ -38,20 +39,6 @@ * RNDIS is NDIS remoted over USB. It's a MSFT variant of CDC ACM ... of * course ACM was intended for modems, not Ethernet links! USB's standard * for Ethernet links is "CDC Ethernet", which is significantly simpler. - * - * NOTE that Microsoft's "RNDIS 1.0" specification is incomplete. Issues - * include: - * - Power management in particular relies on information that's scattered - * through other documentation, and which is incomplete or incorrect even - * there. - * - There are various undocumented protocol requirements, such as the - * need to send unused garbage in control-OUT messages. - * - In some cases, MS-Windows will emit undocumented requests; this - * matters more to peripheral implementations than host ones. - * - * For these reasons and others, ** USE OF RNDIS IS STRONGLY DISCOURAGED ** in - * favor of such non-proprietary alternatives as CDC Ethernet or the newer (and - * currently rare) "Ethernet Emulation Model" (EEM). */ /* @@ -85,17 +72,17 @@ struct rndis_msg_hdr { */ #define RNDIS_MSG_PACKET ccpu2(0x00000001) /* 1-N packets */ #define RNDIS_MSG_INIT ccpu2(0x00000002) -#define RNDIS_MSG_INIT_C (RNDIS_MSG_INIT|RNDIS_MSG_COMPLETION) +#define RNDIS_MSG_INIT_C (RNDIS_MSG_INIT|RNDIS_MSG_COMPLETION) #define RNDIS_MSG_HALT ccpu2(0x00000003) #define RNDIS_MSG_QUERY ccpu2(0x00000004) -#define RNDIS_MSG_QUERY_C (RNDIS_MSG_QUERY|RNDIS_MSG_COMPLETION) +#define RNDIS_MSG_QUERY_C (RNDIS_MSG_QUERY|RNDIS_MSG_COMPLETION) #define RNDIS_MSG_SET ccpu2(0x00000005) -#define RNDIS_MSG_SET_C (RNDIS_MSG_SET|RNDIS_MSG_COMPLETION) +#define RNDIS_MSG_SET_C (RNDIS_MSG_SET|RNDIS_MSG_COMPLETION) #define RNDIS_MSG_RESET ccpu2(0x00000006) -#define RNDIS_MSG_RESET_C (RNDIS_MSG_RESET|RNDIS_MSG_COMPLETION) +#define RNDIS_MSG_RESET_C (RNDIS_MSG_RESET|RNDIS_MSG_COMPLETION) #define RNDIS_MSG_INDICATE ccpu2(0x00000007) #define RNDIS_MSG_KEEPALIVE ccpu2(0x00000008) -#define RNDIS_MSG_KEEPALIVE_C (RNDIS_MSG_KEEPALIVE|RNDIS_MSG_COMPLETION) +#define RNDIS_MSG_KEEPALIVE_C (RNDIS_MSG_KEEPALIVE|RNDIS_MSG_COMPLETION) /* codes for "status" field of completion messages */ #define RNDIS_STATUS_SUCCESS ccpu2(0x00000000) @@ -609,13 +596,13 @@ static struct usb_driver rndis_driver = { static int __init rndis_init(void) { - return usb_register(&rndis_driver); + return usb_register(&rndis_driver); } module_init(rndis_init); static void __exit rndis_exit(void) { - usb_deregister(&rndis_driver); + usb_deregister(&rndis_driver); } module_exit(rndis_exit); diff --git a/drivers/usb/net/rtl8150.c b/drivers/usb/net/rtl8150.c index a72685b96..8ca52be23 100644 --- a/drivers/usb/net/rtl8150.c +++ b/drivers/usb/net/rtl8150.c @@ -6,6 +6,7 @@ * version 2 as published by the Free Software Foundation. */ +#include #include #include #include @@ -128,13 +129,11 @@ #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 @@ -144,7 +143,6 @@ 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)}, {} }; @@ -175,8 +173,6 @@ 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"; @@ -185,8 +181,6 @@ static struct usb_driver rtl8150_driver = { .probe = rtl8150_probe, .disconnect = rtl8150_disconnect, .id_table = rtl8150_table, - .suspend = rtl8150_suspend, - .resume = rtl8150_resume }; /* @@ -242,11 +236,9 @@ 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 == -ENODEV) - netif_device_detach(dev->netdev); + if ((ret = usb_submit_urb(dev->ctrl_urb, GFP_ATOMIC))) err("control request submission failed: %d", ret); - } else + else set_bit(RX_REG_SET, &dev->flags); return ret; @@ -422,7 +414,6 @@ 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) @@ -472,10 +463,7 @@ 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); - status = usb_submit_urb(dev->rx_urb, GFP_ATOMIC); - if (status == -ENODEV) - netif_device_detach(dev->netdev); - else if (status) { + if (usb_submit_urb(dev->rx_urb, GFP_ATOMIC)) { set_bit(RX_URB_FAIL, &dev->flags); goto resched; } else { @@ -491,7 +479,6 @@ static void rx_fixup(unsigned long data) { rtl8150_t *dev; struct sk_buff *skb; - int status; dev = (rtl8150_t *)data; @@ -510,13 +497,10 @@ 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: - status = usb_submit_urb(dev->rx_urb, GFP_ATOMIC); - if (status == -ENODEV) { - netif_device_detach(dev->netdev); - } else if (status) { + if (usb_submit_urb(dev->rx_urb, GFP_ATOMIC)) { set_bit(RX_URB_FAIL, &dev->flags); goto tlsched; - } else { + } else { clear_bit(RX_URB_FAIL, &dev->flags); } @@ -588,43 +572,12 @@ static void intr_callback(struct urb *urb, struct pt_regs *regs) resubmit: status = usb_submit_urb (urb, SLAB_ATOMIC); - if (status == -ENODEV) - netif_device_detach(dev->netdev); - else if (status) + 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; -} /* ** @@ -735,14 +688,9 @@ 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))) { - /* 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); - } + 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; @@ -779,25 +727,16 @@ 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 == -ENODEV) - netif_device_detach(dev->netdev); + if ((res = usb_submit_urb(dev->rx_urb, GFP_KERNEL))) 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 == -ENODEV) - netif_device_detach(dev->netdev); + if ((res = usb_submit_urb(dev->intr_urb, GFP_KERNEL))) warn("%s: intr_urb submit failed: %d", __FUNCTION__, res); - usb_kill_urb(dev->rx_urb); - return res; - } + netif_start_queue(netdev); enable_net_traffic(dev); set_carrier(netdev); - netif_start_queue(netdev); return res; } @@ -941,6 +880,7 @@ static int rtl8150_probe(struct usb_interface *intf, } fill_skb_pool(dev); set_ethernet_addr(dev); + info("%s: rtl8150 is detected", netdev->name); usb_set_intfdata(intf, dev); SET_NETDEV_DEV(netdev, &intf->dev); @@ -948,9 +888,6 @@ static int rtl8150_probe(struct usb_interface *intf, err("couldn't register the device"); goto out2; } - - info("%s: rtl8150 is detected", netdev->name); - return 0; out2: @@ -972,7 +909,6 @@ 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 179b820fc..362d6907c 100644 --- a/drivers/usb/net/usbnet.c +++ b/drivers/usb/net/usbnet.c @@ -33,6 +33,7 @@ // #define DEBUG // error path messages, extra info // #define VERBOSE // more; success messages +#include #include #include #include @@ -521,18 +522,6 @@ 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 c0746f045..89fc4958e 100644 --- a/drivers/usb/net/usbnet.h +++ b/drivers/usb/net/usbnet.h @@ -166,7 +166,6 @@ 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 144566bda..9c5ab2513 100644 --- a/drivers/usb/net/zaurus.c +++ b/drivers/usb/net/zaurus.c @@ -20,6 +20,7 @@ // #define DEBUG // error path messages, extra info // #define VERBOSE // more; success messages +#include #include #include #include @@ -29,7 +30,7 @@ #include #include #include -#include +#include #include "usbnet.h" @@ -108,7 +109,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) @@ -118,7 +119,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) @@ -128,7 +129,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) @@ -216,7 +217,7 @@ static int blan_mdlm_bind(struct usbnet *dev, struct usb_interface *intf) * with devices that use it and those that don't. */ if ((detail->bDetailData[1] & ~0x02) != 0x01) { - /* bmDataCapabilities == 0 would be fine too, + /* bmDataCapabilites == 0 would be fine too, * but framing is minidriver-coupled for now. */ bad_detail: @@ -227,11 +228,6 @@ 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: @@ -262,7 +258,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, }; @@ -371,13 +367,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 index 9b1e4ed1d..f3a8e2807 100644 --- a/drivers/usb/net/zd1201.c +++ b/drivers/usb/net/zd1201.c @@ -621,9 +621,10 @@ static int zd1201_drvr_start(struct zd1201 *zd) __le16 zdmax; unsigned char *buffer; - buffer = kzalloc(ZD1201_RXSIZE, GFP_KERNEL); + 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, @@ -1736,7 +1737,6 @@ static const struct iw_handler_def zd1201_iw_handlers = { .standard = (iw_handler *)zd1201_iw_handler, .private = (iw_handler *)zd1201_private_handler, .private_args = (struct iw_priv_args *) zd1201_private_args, - .get_wireless_stats = zd1201_get_wireless_stats, }; static int zd1201_probe(struct usb_interface *interface, @@ -1750,9 +1750,11 @@ static int zd1201_probe(struct usb_interface *interface, usb = interface_to_usbdev(interface); - zd = kzalloc(sizeof(struct zd1201), GFP_KERNEL); - if (!zd) + 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; @@ -1797,6 +1799,7 @@ static int zd1201_probe(struct usb_interface *interface, 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; diff --git a/drivers/usb/serial/Kconfig b/drivers/usb/serial/Kconfig index f5b9438c9..be5dc8083 100644 --- a/drivers/usb/serial/Kconfig +++ b/drivers/usb/serial/Kconfig @@ -62,15 +62,14 @@ config USB_SERIAL_AIRPRIME To compile this driver as a module, choose M here: the module will be called airprime. -config USB_SERIAL_ARK3116 - tristate "USB ARK Micro 3116 USB Serial Driver (EXPERIMENTAL)" - depends on USB_SERIAL && EXPERIMENTAL +config USB_SERIAL_ANYDATA + tristate "USB AnyData CDMA Wireless Driver" + depends on USB_SERIAL help - Say Y here if you want to use a ARK Micro 3116 USB to Serial - device. + 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 ark3116 + module will be called anydata. config USB_SERIAL_BELKIN tristate "USB Belkin and Peracom Single Port Serial Driver" @@ -159,15 +158,6 @@ config USB_SERIAL_FTDI_SIO To compile this driver as a module, choose M here: the module will be called ftdi_sio. -config USB_SERIAL_FUNSOFT - tristate "USB Fundamental Software Dongle Driver" - depends on USB_SERIAL - ---help--- - Say Y here if you want to use the Fundamental Software dongle. - - To compile this driver as a module, choose M here: the - module will be called funsoft. - config USB_SERIAL_VISOR tristate "USB Handspring Visor / Palm m50x / Sony Clie Driver" depends on USB_SERIAL @@ -408,18 +398,11 @@ 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, Belkin F5U109, and Belkin F5U409 devices. + BAY devices. To compile this driver as a module, choose M here: the module will be called mct_u232. -config USB_SERIAL_NAVMAN - tristate "USB Navman GPS device" - depends on USB_SERIAL - help - To compile this driver as a module, choose M here: the - module will be called navman. - config USB_SERIAL_PL2303 tristate "USB Prolific 2303 Single Port Serial Driver" depends on USB_SERIAL @@ -447,17 +430,6 @@ 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 @@ -493,25 +465,16 @@ config USB_SERIAL_XIRCOM module will be called keyspan_pda. config USB_SERIAL_OPTION - tristate "USB driver for GSM and CDMA modems" - depends on USB_SERIAL + tristate "USB Option PCMCIA serial driver" + depends on USB_SERIAL && USB_OHCI_HCD && PCCARD help - 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. + Say Y here if you want to use an Option card. This is a + GSM card, controlled by three serial ports which are connected + via an OHCI adapter located on a PC card. To compile this driver as a module, choose M here: the module will be called option. - 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 8efed2ce1..f0b04420c 100644 --- a/drivers/usb/serial/Makefile +++ b/drivers/usb/serial/Makefile @@ -12,7 +12,7 @@ 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_ARK3116) += ark3116.o +obj-$(CONFIG_USB_SERIAL_ANYDATA) += anydata.o obj-$(CONFIG_USB_SERIAL_BELKIN) += belkin_sa.o obj-$(CONFIG_USB_SERIAL_CP2101) += cp2101.o obj-$(CONFIG_USB_SERIAL_CYBERJACK) += cyberjack.o @@ -22,7 +22,6 @@ obj-$(CONFIG_USB_SERIAL_EDGEPORT) += io_edgeport.o obj-$(CONFIG_USB_SERIAL_EDGEPORT_TI) += io_ti.o obj-$(CONFIG_USB_SERIAL_EMPEG) += empeg.o obj-$(CONFIG_USB_SERIAL_FTDI_SIO) += ftdi_sio.o -obj-$(CONFIG_USB_SERIAL_FUNSOFT) += funsoft.o obj-$(CONFIG_USB_SERIAL_GARMIN) += garmin_gps.o obj-$(CONFIG_USB_SERIAL_HP4X) += hp4x.o obj-$(CONFIG_USB_SERIAL_IPAQ) += ipaq.o @@ -33,12 +32,10 @@ obj-$(CONFIG_USB_SERIAL_KEYSPAN_PDA) += keyspan_pda.o obj-$(CONFIG_USB_SERIAL_KLSI) += kl5kusb105.o obj-$(CONFIG_USB_SERIAL_KOBIL_SCT) += kobil_sct.o obj-$(CONFIG_USB_SERIAL_MCT_U232) += mct_u232.o -obj-$(CONFIG_USB_SERIAL_NAVMAN) += navman.o obj-$(CONFIG_USB_SERIAL_OMNINET) += omninet.o obj-$(CONFIG_USB_SERIAL_OPTION) += option.o obj-$(CONFIG_USB_SERIAL_PL2303) += pl2303.o obj-$(CONFIG_USB_SERIAL_SAFE) += safe_serial.o -obj-$(CONFIG_USB_SERIAL_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 62082532a..dbf1f0630 100644 --- a/drivers/usb/serial/airprime.c +++ b/drivers/usb/serial/airprime.c @@ -13,14 +13,11 @@ #include #include #include -#include +#include "usb-serial.h" static struct usb_device_id id_table [] = { - { 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); diff --git a/drivers/usb/serial/belkin_sa.c b/drivers/usb/serial/belkin_sa.c index 70ece9e01..4144777ea 100644 --- a/drivers/usb/serial/belkin_sa.c +++ b/drivers/usb/serial/belkin_sa.c @@ -63,6 +63,7 @@ * UsbSnoop on Windows2000 and from examining the other USB drivers. */ +#include #include #include #include @@ -74,7 +75,7 @@ #include #include #include -#include +#include "usb-serial.h" #include "belkin_sa.h" static int debug; diff --git a/drivers/usb/serial/bus.c b/drivers/usb/serial/bus.c index 6542f2204..e9f9f4baf 100644 --- a/drivers/usb/serial/bus.c +++ b/drivers/usb/serial/bus.c @@ -8,12 +8,13 @@ * 2 as published by the Free Software Foundation. */ +#include #include #include #include #include #include -#include +#include "usb-serial.h" 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 3a9073dbf..8023bb727 100644 --- a/drivers/usb/serial/console.c +++ b/drivers/usb/serial/console.c @@ -11,16 +11,18 @@ * */ +#include #include #include #include #include #include #include -#include static int debug; +#include "usb-serial.h" + struct usbcons_info { int magic; int break_flag; @@ -200,7 +202,7 @@ static void usb_console_write(struct console *co, const char *buf, unsigned coun struct usb_serial *serial; int retval = -ENODEV; - if (!port || port->serial->dev->state == USB_STATE_NOTATTACHED) + if (!port) return; serial = port->serial; @@ -211,38 +213,17 @@ static void usb_console_write(struct console *co, const char *buf, unsigned coun if (!port->open_count) { dbg ("%s - port not opened", __FUNCTION__); - return; + goto exit; } - 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; - } + /* 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); } static struct console usbcons = { @@ -253,14 +234,6 @@ 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; @@ -286,11 +259,6 @@ void usb_serial_console_init (int serial_debug, int minor) void usb_serial_console_exit (void) { - if (usbcons_info.port) { - unregister_console(&usbcons); - if (usbcons_info.port->open_count) - usbcons_info.port->open_count--; - usbcons_info.port = NULL; - } + unregister_console(&usbcons); } diff --git a/drivers/usb/serial/cp2101.c b/drivers/usb/serial/cp2101.c index 486c7411b..dc7a06950 100644 --- a/drivers/usb/serial/cp2101.c +++ b/drivers/usb/serial/cp2101.c @@ -17,6 +17,7 @@ * */ +#include #include #include #include @@ -26,12 +27,12 @@ #include #include #include -#include +#include "usb-serial.h" /* * Version Information */ -#define DRIVER_VERSION "v0.07" +#define DRIVER_VERSION "v0.06" #define DRIVER_DESC "Silicon Labs CP2101/CP2102 RS232 serial adaptor driver" /* @@ -57,8 +58,6 @@ static struct usb_device_id id_table [] = { { 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 */ @@ -170,7 +169,9 @@ 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 = kcalloc(length, sizeof(u32), GFP_KERNEL); + buf = kmalloc (length * sizeof(u32), GFP_KERNEL); + memset(buf, 0, length * sizeof(u32)); + if (!buf) { dev_err(&port->dev, "%s - out of memory.\n", __FUNCTION__); return -ENOMEM; diff --git a/drivers/usb/serial/cyberjack.c b/drivers/usb/serial/cyberjack.c index d954ec34b..2357b1d10 100644 --- a/drivers/usb/serial/cyberjack.c +++ b/drivers/usb/serial/cyberjack.c @@ -28,6 +28,7 @@ */ +#include #include #include #include @@ -39,7 +40,7 @@ #include #include #include -#include +#include "usb-serial.h" #define CYBERJACK_LOCAL_BUF_SIZE 32 @@ -214,14 +215,14 @@ static int cyberjack_write (struct usb_serial_port *port, const unsigned char *b return (0); } - spin_lock_bh(&port->lock); + spin_lock(&port->lock); if (port->write_urb_busy) { - spin_unlock_bh(&port->lock); + spin_unlock(&port->lock); dbg("%s - already writing", __FUNCTION__); return 0; } port->write_urb_busy = 1; - spin_unlock_bh(&port->lock); + spin_unlock(&port->lock); spin_lock_irqsave(&priv->lock, flags); @@ -468,7 +469,7 @@ static void cyberjack_write_bulk_callback (struct urb *urb, struct pt_regs *regs exit: spin_unlock(&priv->lock); - usb_serial_port_softint(port); + schedule_work(&port->work); } static int __init cyberjack_init (void) diff --git a/drivers/usb/serial/cypress_m8.c b/drivers/usb/serial/cypress_m8.c index ee70fddca..68067fe11 100644 --- a/drivers/usb/serial/cypress_m8.c +++ b/drivers/usb/serial/cypress_m8.c @@ -48,6 +48,7 @@ /* Code originates and was built up from ftdi_sio, belkin, pl2303 and others. */ +#include #include #include #include @@ -59,11 +60,11 @@ #include #include #include -#include #include #include #include +#include "usb-serial.h" #include "cypress_m8.h" @@ -97,16 +98,10 @@ static struct usb_device_id id_table_cyphidcomrs232 [] = { { } /* Terminating entry */ }; -static struct usb_device_id id_table_nokiaca42v2 [] = { - { USB_DEVICE(VENDOR_ID_DAZZLE, PRODUCT_ID_CA42) }, - { } /* Terminating entry */ -}; - static struct usb_device_id id_table_combined [] = { { USB_DEVICE(VENDOR_ID_DELORME, PRODUCT_ID_EARTHMATEUSB) }, { USB_DEVICE(VENDOR_ID_DELORME, PRODUCT_ID_EARTHMATEUSB_LT20) }, { USB_DEVICE(VENDOR_ID_CYPRESS, PRODUCT_ID_CYPHIDCOM) }, - { USB_DEVICE(VENDOR_ID_DAZZLE, PRODUCT_ID_CA42) }, { } /* Terminating entry */ }; @@ -154,7 +149,6 @@ struct cypress_buf { /* function prototypes for the Cypress USB to serial device */ static int cypress_earthmate_startup (struct usb_serial *serial); static int cypress_hidcom_startup (struct usb_serial *serial); -static int cypress_ca42v2_startup (struct usb_serial *serial); static void cypress_shutdown (struct usb_serial *serial); static int cypress_open (struct usb_serial_port *port, struct file *filp); static void cypress_close (struct usb_serial_port *port, struct file *filp); @@ -241,34 +235,6 @@ static struct usb_serial_driver cypress_hidcom_device = { .write_int_callback = cypress_write_int_callback, }; -static struct usb_serial_driver cypress_ca42v2_device = { - .driver = { - .owner = THIS_MODULE, - .name = "nokiaca42v2", - }, - .description = "Nokia CA-42 V2 Adapter", - .id_table = id_table_nokiaca42v2, - .num_interrupt_in = 1, - .num_interrupt_out = 1, - .num_bulk_in = NUM_DONT_CARE, - .num_bulk_out = NUM_DONT_CARE, - .num_ports = 1, - .attach = cypress_ca42v2_startup, - .shutdown = cypress_shutdown, - .open = cypress_open, - .close = cypress_close, - .write = cypress_write, - .write_room = cypress_write_room, - .ioctl = cypress_ioctl, - .set_termios = cypress_set_termios, - .tiocmget = cypress_tiocmget, - .tiocmset = cypress_tiocmset, - .chars_in_buffer = cypress_chars_in_buffer, - .throttle = cypress_throttle, - .unthrottle = cypress_unthrottle, - .read_int_callback = cypress_read_int_callback, - .write_int_callback = cypress_write_int_callback, -}; /***************************************************************************** * Cypress serial helper functions @@ -320,12 +286,6 @@ static int cypress_serial_control (struct usb_serial_port *port, unsigned baud_m __FUNCTION__); new_baudrate = priv->baud_rate; } - } else if (priv->chiptype == CT_CA42V2) { - if ( (new_baudrate = mask_to_rate(baud_mask)) == -1) { - err("%s - failed setting baud rate, unsupported speed", - __FUNCTION__); - new_baudrate = priv->baud_rate; - } } else if (priv->chiptype == CT_GENERIC) { if ( (new_baudrate = mask_to_rate(baud_mask)) == -1) { err("%s - failed setting baud rate, unsupported speed", @@ -475,10 +435,11 @@ static int generic_startup (struct usb_serial *serial) dbg("%s - port %d", __FUNCTION__, serial->port[0]->number); - priv = kzalloc(sizeof (struct cypress_private), GFP_KERNEL); + priv = kmalloc(sizeof (struct cypress_private), GFP_KERNEL); if (!priv) return -ENOMEM; + memset(priv, 0x00, sizeof (struct cypress_private)); spin_lock_init(&priv->lock); priv->buf = cypress_buf_alloc(CYPRESS_BUF_SIZE); if (priv->buf == NULL) { @@ -539,25 +500,6 @@ static int cypress_hidcom_startup (struct usb_serial *serial) } /* cypress_hidcom_startup */ -static int cypress_ca42v2_startup (struct usb_serial *serial) -{ - struct cypress_private *priv; - - dbg("%s", __FUNCTION__); - - if (generic_startup(serial)) { - dbg("%s - Failed setting up port %d", __FUNCTION__, - serial->port[0]->number); - return 1; - } - - priv = usb_get_serial_port_data(serial->port[0]); - priv->chiptype = CT_CA42V2; - - return 0; -} /* cypress_ca42v2_startup */ - - static void cypress_shutdown (struct usb_serial *serial) { struct cypress_private *priv; @@ -823,7 +765,7 @@ send: priv->bytes_out += count; /* do not count the line control and size bytes */ spin_unlock_irqrestore(&priv->lock, flags); - usb_serial_port_softint(port); + schedule_work(&port->work); } /* cypress_send */ @@ -1002,10 +944,6 @@ static void cypress_set_termios (struct usb_serial_port *port, *(tty->termios) = tty_std_termios; tty->termios->c_cflag = B9600 | CS8 | CREAD | HUPCL | CLOCAL; - } else if (priv->chiptype == CT_CA42V2) { - *(tty->termios) = tty_std_termios; - tty->termios->c_cflag = B9600 | CS8 | CREAD | HUPCL | - CLOCAL; } priv->termios_initialized = 1; } @@ -1604,9 +1542,6 @@ static int __init cypress_init(void) retval = usb_serial_register(&cypress_hidcom_device); if (retval) goto failed_hidcom_register; - retval = usb_serial_register(&cypress_ca42v2_device); - if (retval) - goto failed_ca42v2_register; retval = usb_register(&cypress_driver); if (retval) goto failed_usb_register; @@ -1615,8 +1550,6 @@ static int __init cypress_init(void) return 0; failed_usb_register: usb_deregister(&cypress_driver); -failed_ca42v2_register: - usb_serial_deregister(&cypress_ca42v2_device); failed_hidcom_register: usb_serial_deregister(&cypress_hidcom_device); failed_em_register: @@ -1633,7 +1566,6 @@ static void __exit cypress_exit (void) usb_deregister (&cypress_driver); usb_serial_deregister (&cypress_earthmate_device); usb_serial_deregister (&cypress_hidcom_device); - usb_serial_deregister (&cypress_ca42v2_device); } diff --git a/drivers/usb/serial/cypress_m8.h b/drivers/usb/serial/cypress_m8.h index e1c7c27e1..1fa119efe 100644 --- a/drivers/usb/serial/cypress_m8.h +++ b/drivers/usb/serial/cypress_m8.h @@ -18,10 +18,6 @@ /* Cypress HID->COM RS232 Adapter */ #define VENDOR_ID_CYPRESS 0x04b4 #define PRODUCT_ID_CYPHIDCOM 0x5500 - -/* Nokia CA-42 USB to serial cable */ -#define VENDOR_ID_DAZZLE 0x07d0 -#define PRODUCT_ID_CA42 0x4101 /* End of device listing */ /* Used for setting / requesting serial line settings */ @@ -38,7 +34,6 @@ #define CT_EARTHMATE 0x01 #define CT_CYPHIDCOM 0x02 -#define CT_CA42V2 0x03 #define CT_GENERIC 0x0F /* End of chiptype definitions */ diff --git a/drivers/usb/serial/digi_acceleport.c b/drivers/usb/serial/digi_acceleport.c index 9b225183f..b3f776a90 100644 --- a/drivers/usb/serial/digi_acceleport.c +++ b/drivers/usb/serial/digi_acceleport.c @@ -233,6 +233,7 @@ * $Id: digi_acceleport.c,v 1.80.1.2 2000/11/02 05:45:08 root Exp $ */ +#include #include #include #include @@ -246,7 +247,7 @@ #include #include #include -#include +#include "usb-serial.h" /* Defines */ diff --git a/drivers/usb/serial/empeg.c b/drivers/usb/serial/empeg.c index daafe405d..63f7c78a1 100644 --- a/drivers/usb/serial/empeg.c +++ b/drivers/usb/serial/empeg.c @@ -51,6 +51,7 @@ * */ +#include #include #include #include @@ -62,7 +63,7 @@ #include #include #include -#include +#include "usb-serial.h" static int debug; @@ -334,7 +335,7 @@ static void empeg_write_bulk_callback (struct urb *urb, struct pt_regs *regs) return; } - usb_serial_port_softint(port); + schedule_work(&port->work); } diff --git a/drivers/usb/serial/ezusb.c b/drivers/usb/serial/ezusb.c index 5169c2d15..1e419c8d7 100644 --- a/drivers/usb/serial/ezusb.c +++ b/drivers/usb/serial/ezusb.c @@ -8,6 +8,7 @@ * 2 as published by the Free Software Foundation. */ +#include #include #include #include @@ -15,7 +16,7 @@ #include #include #include -#include +#include "usb-serial.h" /* 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 c6115aa1b..b64b9d354 100644 --- a/drivers/usb/serial/ftdi_sio.c +++ b/drivers/usb/serial/ftdi_sio.c @@ -245,6 +245,7 @@ /* 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 @@ -257,7 +258,7 @@ #include #include #include -#include +#include "usb-serial.h" #include "ftdi_sio.h" /* @@ -306,16 +307,11 @@ 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) }, { USB_DEVICE(FTDI_VID, FTDI_SIO_PID) }, { 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) }, @@ -339,7 +335,6 @@ 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) }, @@ -494,19 +489,9 @@ static struct usb_device_id id_table_combined [] = { { USB_DEVICE(KOBIL_VID, KOBIL_CONV_KAAN_PID) }, { USB_DEVICE(POSIFLEX_VID, POSIFLEX_PP7000_PID) }, { USB_DEVICE(FTDI_VID, FTDI_TTUSB_PID) }, - { USB_DEVICE(FTDI_VID, FTDI_ECLO_COM_1WIRE_PID) }, { USB_DEVICE(FTDI_VID, FTDI_WESTREX_MODEL_777_PID) }, { USB_DEVICE(FTDI_VID, FTDI_WESTREX_MODEL_8900F_PID) }, { USB_DEVICE(FTDI_VID, FTDI_PCDJ_DAC2_PID) }, - { USB_DEVICE(FTDI_VID, FTDI_RRCIRKITS_LOCOBUFFER_PID) }, - { USB_DEVICE(FTDI_VID, FTDI_ASK_RDR400_PID) }, - { 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 */ }; @@ -555,7 +540,6 @@ 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) */ @@ -563,7 +547,6 @@ 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; }; @@ -1165,11 +1148,12 @@ static int ftdi_sio_attach (struct usb_serial *serial) dbg("%s",__FUNCTION__); - priv = kzalloc(sizeof(struct ftdi_private), GFP_KERNEL); + priv = kmalloc(sizeof(struct ftdi_private), GFP_KERNEL); if (!priv){ err("%s- kmalloc(%Zd) failed.", __FUNCTION__, sizeof(struct ftdi_private)); return -ENOMEM; } + memset(priv, 0, sizeof(*priv)); spin_lock_init(&priv->rx_lock); spin_lock_init(&priv->tx_lock); @@ -1278,6 +1262,7 @@ 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; @@ -1287,15 +1272,8 @@ 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); - if (port->tty) - port->tty->low_latency = (priv->flags & ASYNC_LOW_LATENCY) ? 1 : 0; + 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 */ @@ -1309,8 +1287,7 @@ 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 */ - if (port->tty) - ftdi_set_termios(port, NULL); + ftdi_set_termios(port, &tmp_termios); /* FIXME: Flow control might be enabled, so it should be checked - we have no control of defaults! */ @@ -1481,7 +1458,6 @@ 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); } @@ -1531,7 +1507,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); - usb_serial_port_softint(port); + schedule_work(&port->work); } /* ftdi_write_bulk_callback */ @@ -1584,8 +1560,6 @@ 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__, @@ -1620,13 +1594,6 @@ 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 */ @@ -1951,7 +1918,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 || (old_termios->c_cflag & CBAUD) == B0) { + if ((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 77299996f..bdef3b8c7 100644 --- a/drivers/usb/serial/ftdi_sio.h +++ b/drivers/usb/serial/ftdi_sio.h @@ -32,19 +32,6 @@ #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 */ @@ -52,9 +39,6 @@ /* www.thoughttechnology.com/ TT-USB provide with procomp use ftdi_sio */ #define FTDI_TTUSB_PID 0xFF20 /* Product Id */ -/* iPlus device */ -#define FTDI_IPLUS_PID 0xD070 /* Product Id */ - /* www.crystalfontz.com devices - thanx for providing free devices for evaluation ! */ /* they use the ftdi chipset for the USB interface and the vendor id is the same */ #define FTDI_XF_632_PID 0xFC08 /* 632: 16x2 Character Display */ @@ -161,18 +145,6 @@ #define KOBIL_CONV_B1_PID 0x2020 /* KOBIL Konverter for B1 */ #define KOBIL_CONV_KAAN_PID 0x2021 /* KOBIL_Konverter for KAAN */ -/* - * Icom ID-1 digital transceiver - */ - -#define ICOM_ID1_VID 0x0C26 -#define ICOM_ID1_PID 0x0004 - -/* - * ASK.fr devices - */ -#define FTDI_ASK_RDR400_PID 0xC991 /* ASK RDR 400 series card reader */ - /* * DSS-20 Sync Station for Sony Ericsson P800 */ @@ -188,10 +160,6 @@ /* 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). @@ -424,54 +392,6 @@ #define FTDI_WESTREX_MODEL_777_PID 0xDC00 /* Model 777 */ #define FTDI_WESTREX_MODEL_8900F_PID 0xDC01 /* Model 8900F */ -/* - * RR-CirKits LocoBuffer USB (http://www.rr-cirkits.com) - */ -#define FTDI_RRCIRKITS_LOCOBUFFER_PID 0xc7d0 /* LocoBuffer USB */ - -/* - * Eclo (http://www.eclo.pt/) product IDs. - * PID 0xEA90 submitted by Martin Grill. - */ -#define FTDI_ECLO_COM_1WIRE_PID 0xEA90 /* COM to 1-Wire USB adaptor */ - -/* - * Papouch products (http://www.papouch.com/) - * Submitted by Folkert van Heusden - */ - -#define PAPOUCH_VID 0x5050 /* Vendor ID */ -#define PAPOUCH_TMU_PID 0x0400 /* TMU USB Thermometer */ - -/* - * ACG Identification Technologies GmbH products (http://www.acg.de/). - * Submitted by anton -at- goto10 -dot- org. - */ -#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/garmin_gps.c b/drivers/usb/serial/garmin_gps.c index 727852634..d6f55e9dc 100644 --- a/drivers/usb/serial/garmin_gps.c +++ b/drivers/usb/serial/garmin_gps.c @@ -23,6 +23,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111 USA */ +#include #include #include #include @@ -35,7 +36,6 @@ #include #include #include -#include /* the mode to be set when the port ist opened */ static int initial_mode = 1; @@ -43,6 +43,8 @@ static int initial_mode = 1; /* debug flag */ static int debug = 0; +#include "usb-serial.h" + #define GARMIN_VENDOR_ID 0x091E /* @@ -1010,7 +1012,7 @@ static void garmin_write_bulk_callback (struct urb *urb, struct pt_regs *regs) garmin_data_p->flags |= CLEAR_HALT_REQUIRED; } - usb_serial_port_softint(port); + schedule_work(&port->work); } @@ -1420,11 +1422,12 @@ static int garmin_attach (struct usb_serial *serial) dbg("%s", __FUNCTION__); - garmin_data_p = kzalloc(sizeof(struct garmin_data), GFP_KERNEL); + garmin_data_p = kmalloc (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); diff --git a/drivers/usb/serial/generic.c b/drivers/usb/serial/generic.c index 21cbaa0fb..476cda107 100644 --- a/drivers/usb/serial/generic.c +++ b/drivers/usb/serial/generic.c @@ -9,6 +9,7 @@ * */ +#include #include #include #include @@ -17,8 +18,8 @@ #include #include #include -#include #include +#include "usb-serial.h" static int debug; @@ -137,7 +138,6 @@ int usb_serial_generic_open (struct usb_serial_port *port, struct file *filp) return result; } -EXPORT_SYMBOL_GPL(usb_serial_generic_open); static void generic_cleanup (struct usb_serial_port *port) { @@ -175,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_bh(&port->lock); + spin_lock(&port->lock); if (port->write_urb_busy) { - spin_unlock_bh(&port->lock); + spin_unlock(&port->lock); dbg("%s - already writing", __FUNCTION__); return 0; } port->write_urb_busy = 1; - spin_unlock_bh(&port->lock); + spin_unlock(&port->lock); count = (count > port->bulk_out_size) ? port->bulk_out_size : count; @@ -285,7 +285,6 @@ 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,7 +298,9 @@ void usb_serial_generic_write_bulk_callback (struct urb *urb, struct pt_regs *re return; } - usb_serial_port_softint(port); + usb_serial_port_softint((void *)port); + + schedule_work(&port->work); } EXPORT_SYMBOL_GPL(usb_serial_generic_write_bulk_callback); diff --git a/drivers/usb/serial/hp4x.c b/drivers/usb/serial/hp4x.c index ebcac701b..e9719da2a 100644 --- a/drivers/usb/serial/hp4x.c +++ b/drivers/usb/serial/hp4x.c @@ -12,12 +12,13 @@ * See Documentation/usb/usb-serial.txt for more information on using this driver */ +#include #include #include #include #include #include -#include +#include "usb-serial.h" /* * Version Information diff --git a/drivers/usb/serial/io_edgeport.c b/drivers/usb/serial/io_edgeport.c index c49976c3a..3f29e6b0f 100644 --- a/drivers/usb/serial/io_edgeport.c +++ b/drivers/usb/serial/io_edgeport.c @@ -29,6 +29,7 @@ * */ +#include #include #include #include @@ -44,7 +45,7 @@ #include #include #include -#include +#include "usb-serial.h" #include "io_edgeport.h" #include "io_ionsp.h" /* info for the iosp messages */ #include "io_16654.h" /* 16654 UART defines */ @@ -141,7 +142,7 @@ struct edgeport_port { /* This structure holds all of the individual device information */ struct edgeport_serial { - char name[MAX_NAME_LEN+2]; /* string name of this device */ + char name[MAX_NAME_LEN+1]; /* string name of this device */ struct edge_manuf_descriptor manuf_descriptor; /* the manufacturer descriptor */ struct edge_boot_descriptor boot_descriptor; /* the boot firmware descriptor */ @@ -269,7 +270,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, int buflen, __le16 *unicode, int unicode_size); +static void unicode_to_ascii (char *string, __le16 *unicode, int unicode_size); // ************************************************************************ @@ -372,7 +373,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, int buflen) +static int get_string (struct usb_device *dev, int Id, char *string) { struct usb_string_descriptor StringDesc; struct usb_string_descriptor *pStringDesc; @@ -394,7 +395,7 @@ static int get_string (struct usb_device *dev, int Id, char *string, int buflen) return 0; } - unicode_to_ascii(string, buflen, pStringDesc->wData, pStringDesc->bLength/2); + unicode_to_ascii(string, pStringDesc->wData, pStringDesc->bLength/2-1); kfree(pStringDesc); return strlen(string); @@ -2563,20 +2564,16 @@ 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, int buflen, __le16 *unicode, int unicode_size) +static void unicode_to_ascii (char *string, __le16 *unicode, int unicode_size) { int i; - if (buflen <= 0) /* never happens, but... */ + if (unicode_size <= 0) return; - --buflen; /* space for nul */ - for (i = 0; i < unicode_size; i++) { - if (i >= buflen) - break; + for (i = 0; i < unicode_size; ++i) string[i] = (char)(le16_to_cpu(unicode[i])); - } - string[i] = 0x00; + string[unicode_size] = 0x00; } @@ -2606,17 +2603,11 @@ 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, sizeof(string), - edge_serial->manuf_descriptor.SerialNumber, - edge_serial->manuf_descriptor.SerNumLength/2); + unicode_to_ascii (string, edge_serial->manuf_descriptor.SerialNumber, edge_serial->manuf_descriptor.SerNumLength/2-1); dbg(" SerialNumber: %s", string); - unicode_to_ascii(string, sizeof(string), - edge_serial->manuf_descriptor.AssemblyNumber, - edge_serial->manuf_descriptor.AssemblyNumLength/2); + unicode_to_ascii (string, edge_serial->manuf_descriptor.AssemblyNumber, edge_serial->manuf_descriptor.AssemblyNumLength/2-1); dbg(" AssemblyNumber: %s", string); - unicode_to_ascii(string, sizeof(string), - edge_serial->manuf_descriptor.OemAssyNumber, - edge_serial->manuf_descriptor.OemAssyNumLength/2); + unicode_to_ascii (string, edge_serial->manuf_descriptor.OemAssyNumber, edge_serial->manuf_descriptor.OemAssyNumLength/2-1); dbg(" OemAssyNumber: %s", string); dbg(" UartType: %d", edge_serial->manuf_descriptor.UartType); dbg(" IonPid: %d", edge_serial->manuf_descriptor.IonPid); @@ -2729,26 +2720,27 @@ static int edge_startup (struct usb_serial *serial) struct edgeport_serial *edge_serial; struct edgeport_port *edge_port; struct usb_device *dev; - int i, j; + int i; dev = serial->dev; /* create our private serial structure */ - edge_serial = kzalloc(sizeof(struct edgeport_serial), GFP_KERNEL); + edge_serial = kmalloc (sizeof(struct edgeport_serial), GFP_KERNEL); if (edge_serial == NULL) { dev_err(&serial->dev->dev, "%s - Out of memory\n", __FUNCTION__); return -ENOMEM; } + memset (edge_serial, 0, sizeof(struct edgeport_serial)); spin_lock_init(&edge_serial->es_lock); edge_serial->serial = serial; usb_set_serial_data(serial, edge_serial); /* get the name for the device from the device */ - 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); + 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]); dev_info(&serial->dev->dev, "%s detected\n", edge_serial->name); @@ -2793,10 +2785,6 @@ 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 17c5b1d23..afc0f34b3 100644 --- a/drivers/usb/serial/io_ti.c +++ b/drivers/usb/serial/io_ti.c @@ -24,6 +24,7 @@ * */ +#include #include #include #include @@ -39,8 +40,8 @@ #include #include #include -#include +#include "usb-serial.h" #include "io_16654.h" #include "io_usbvend.h" #include "io_ti.h" @@ -2726,11 +2727,12 @@ static int edge_startup (struct usb_serial *serial) dev = serial->dev; /* create our private serial structure */ - edge_serial = kzalloc(sizeof(struct edgeport_serial), GFP_KERNEL); + edge_serial = kmalloc (sizeof(struct edgeport_serial), GFP_KERNEL); if (edge_serial == NULL) { dev_err(&serial->dev->dev, "%s - Out of memory\n", __FUNCTION__); return -ENOMEM; } + memset (edge_serial, 0, sizeof(struct edgeport_serial)); sema_init(&edge_serial->es_sem, 1); edge_serial->serial = serial; usb_set_serial_data(serial, edge_serial); @@ -2743,11 +2745,12 @@ static int edge_startup (struct usb_serial *serial) /* set up our port private structures */ for (i = 0; i < serial->num_ports; ++i) { - edge_port = kzalloc(sizeof(struct edgeport_port), GFP_KERNEL); + edge_port = kmalloc (sizeof(struct edgeport_port), GFP_KERNEL); if (edge_port == NULL) { dev_err(&serial->dev->dev, "%s - Out of memory\n", __FUNCTION__); goto cleanup; } + memset (edge_port, 0, sizeof(struct edgeport_port)); spin_lock_init(&edge_port->ep_lock); edge_port->ep_out_buf = edge_buf_alloc(EDGE_OUT_BUF_SIZE); if (edge_port->ep_out_buf == NULL) { diff --git a/drivers/usb/serial/ipaq.c b/drivers/usb/serial/ipaq.c index 9840bade7..9a5c97989 100644 --- a/drivers/usb/serial/ipaq.c +++ b/drivers/usb/serial/ipaq.c @@ -44,6 +44,7 @@ * Thanks to info from Heath Robinson and Arieh Davidoff. */ +#include #include #include #include @@ -55,7 +56,7 @@ #include #include #include -#include +#include "usb-serial.h" #include "ipaq.h" #define KP_RETRIES 100 @@ -70,8 +71,6 @@ 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); @@ -250,9 +249,6 @@ 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 */ @@ -587,7 +583,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 = connect_retries; + int retries = KP_RETRIES; dbg("%s - port %d", __FUNCTION__, port->number); @@ -651,12 +647,16 @@ 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,14 +671,8 @@ 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; @@ -861,7 +855,6 @@ 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); @@ -877,7 +870,7 @@ static void ipaq_write_bulk_callback(struct urb *urb, struct pt_regs *regs) spin_unlock_irqrestore(&write_list_lock, flags); } - usb_serial_port_softint(port); + schedule_work(&port->work); } static int ipaq_write_room(struct usb_serial_port *port) @@ -974,9 +967,3 @@ 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 812bc213a..e760a7024 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,12 +373,10 @@ 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); - usb_serial_port_softint(port); + schedule_work(&port->work); } static int ipw_write(struct usb_serial_port *port, const unsigned char *buf, int count) @@ -394,14 +392,14 @@ static int ipw_write(struct usb_serial_port *port, const unsigned char *buf, int return 0; } - spin_lock_bh(&port->lock); + spin_lock(&port->lock); if (port->write_urb_busy) { - spin_unlock_bh(&port->lock); + spin_unlock(&port->lock); dbg("%s - already writing", __FUNCTION__); return 0; } port->write_urb_busy = 1; - spin_unlock_bh(&port->lock); + spin_unlock(&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 1b348df38..a59010421 100644 --- a/drivers/usb/serial/ir-usb.c +++ b/drivers/usb/serial/ir-usb.c @@ -46,6 +46,7 @@ * initial version released. */ +#include #include #include #include @@ -57,7 +58,7 @@ #include #include #include -#include +#include "usb-serial.h" /* * Version Information @@ -183,9 +184,10 @@ static struct irda_class_desc *irda_usb_find_class_desc(struct usb_device *dev, struct irda_class_desc *desc; int ret; - desc = kzalloc(sizeof (struct irda_class_desc), GFP_KERNEL); + desc = kmalloc(sizeof (struct irda_class_desc), GFP_KERNEL); if (desc == NULL) return NULL; + memset(desc, 0, sizeof(struct irda_class_desc)); ret = usb_control_msg(dev, usb_rcvctrlpipe(dev,0), IU_REQ_GET_CLASS_DESC, @@ -342,14 +344,14 @@ static int ir_write (struct usb_serial_port *port, const unsigned char *buf, int if (count == 0) return 0; - spin_lock_bh(&port->lock); + spin_lock(&port->lock); if (port->write_urb_busy) { - spin_unlock_bh(&port->lock); + spin_unlock(&port->lock); dbg("%s - already writing", __FUNCTION__); return 0; } port->write_urb_busy = 1; - spin_unlock_bh(&port->lock); + spin_unlock(&port->lock); transfer_buffer = port->write_urb->transfer_buffer; transfer_size = min(count, port->bulk_out_size - 1); @@ -407,7 +409,7 @@ static void ir_write_bulk_callback (struct urb *urb, struct pt_regs *regs) urb->actual_length, urb->transfer_buffer); - usb_serial_port_softint(port); + schedule_work(&port->work); } static void ir_read_bulk_callback (struct urb *urb, struct pt_regs *regs) @@ -452,7 +454,8 @@ static void ir_read_bulk_callback (struct urb *urb, struct pt_regs *regs) tty = port->tty; /* - * FIXME: must not do this in IRQ context + * FIXME: must not do this in IRQ context, + * must honour TTY_DONT_FLIP */ tty->ldisc.receive_buf( tty, diff --git a/drivers/usb/serial/keyspan.c b/drivers/usb/serial/keyspan.c index 015ad6cc1..3b958e60f 100644 --- a/drivers/usb/serial/keyspan.c +++ b/drivers/usb/serial/keyspan.c @@ -95,6 +95,7 @@ */ +#include #include #include #include @@ -107,7 +108,7 @@ #include #include #include -#include +#include "usb-serial.h" #include "keyspan.h" static int debug; @@ -480,7 +481,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) - usb_serial_port_softint(port); + schedule_work(&port->work); } static void usa26_inack_callback(struct urb *urb, struct pt_regs *regs) @@ -2249,11 +2250,12 @@ static int keyspan_startup (struct usb_serial *serial) } /* Setup private data for serial driver */ - s_priv = kzalloc(sizeof(struct keyspan_serial_private), GFP_KERNEL); + s_priv = kmalloc(sizeof(struct keyspan_serial_private), GFP_KERNEL); if (!s_priv) { dbg("%s - kmalloc for keyspan_serial_private failed.", __FUNCTION__); return -ENOMEM; } + memset(s_priv, 0, sizeof(struct keyspan_serial_private)); s_priv->device_details = d_details; usb_set_serial_data(serial, s_priv); @@ -2261,11 +2263,12 @@ static int keyspan_startup (struct usb_serial *serial) /* Now setup per port private data */ for (i = 0; i < serial->num_ports; i++) { port = serial->port[i]; - p_priv = kzalloc(sizeof(struct keyspan_port_private), GFP_KERNEL); + p_priv = kmalloc(sizeof(struct keyspan_port_private), GFP_KERNEL); if (!p_priv) { dbg("%s - kmalloc for keyspan_port_private (%d) failed!.", __FUNCTION__, i); return (1); } + memset(p_priv, 0, sizeof(struct keyspan_port_private)); p_priv->device_details = d_details; usb_set_serial_port_data(port, p_priv); } diff --git a/drivers/usb/serial/keyspan_pda.c b/drivers/usb/serial/keyspan_pda.c index 59e777f1e..b0441c35f 100644 --- a/drivers/usb/serial/keyspan_pda.c +++ b/drivers/usb/serial/keyspan_pda.c @@ -66,6 +66,7 @@ */ +#include #include #include #include @@ -78,7 +79,6 @@ #include #include #include -#include static int debug; @@ -108,6 +108,8 @@ struct ezusb_hex_record { #include "xircom_pgs_fw.h" #endif +#include "usb-serial.h" + /* * Version Information */ @@ -518,13 +520,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_bh(&port->lock); + spin_lock(&port->lock); if (port->write_urb_busy || priv->tx_throttled) { - spin_unlock_bh(&port->lock); + spin_unlock(&port->lock); return 0; } port->write_urb_busy = 1; - spin_unlock_bh(&port->lock); + spin_unlock(&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 2a2f3e2da..78335a5f7 100644 --- a/drivers/usb/serial/kl5kusb105.c +++ b/drivers/usb/serial/kl5kusb105.c @@ -45,6 +45,7 @@ */ +#include #include #include #include @@ -55,7 +56,7 @@ #include #include #include -#include +#include "usb-serial.h" #include "kl5kusb105.h" static int debug; @@ -568,7 +569,8 @@ static void klsi_105_write_bulk_callback ( struct urb *urb, struct pt_regs *regs return; } - usb_serial_port_softint(port); + /* from generic_write_bulk_callback */ + schedule_work(&port->work); } /* klsi_105_write_bulk_completion_callback */ diff --git a/drivers/usb/serial/kobil_sct.c b/drivers/usb/serial/kobil_sct.c index d50dce034..b8b213185 100644 --- a/drivers/usb/serial/kobil_sct.c +++ b/drivers/usb/serial/kobil_sct.c @@ -35,6 +35,7 @@ */ +#include #include #include #include @@ -46,8 +47,8 @@ #include #include #include -#include #include +#include "usb-serial.h" #include "kobil_sct.h" static int debug; @@ -254,9 +255,11 @@ static int kobil_open (struct usb_serial_port *port, struct file *filp) } // allocate memory for transfer buffer - transfer_buffer = kzalloc(transfer_buffer_length, GFP_KERNEL); + transfer_buffer = (unsigned char *) kmalloc(transfer_buffer_length, GFP_KERNEL); if (! transfer_buffer) { return -ENOMEM; + } else { + memset(transfer_buffer, 0, transfer_buffer_length); } // allocate write_urb @@ -380,10 +383,11 @@ static void kobil_read_int_callback( struct urb *purb, struct pt_regs *regs) // BEGIN DEBUG /* - dbg_data = kzalloc((3 * purb->actual_length + 10) * sizeof(char), GFP_KERNEL); + dbg_data = (unsigned char *) kmalloc((3 * purb->actual_length + 10) * sizeof(char), GFP_KERNEL); if (! dbg_data) { return; } + memset(dbg_data, 0, (3 * purb->actual_length + 10)); for (i = 0; i < purb->actual_length; i++) { sprintf(dbg_data +3*i, "%02X ", data[i]); } @@ -514,10 +518,11 @@ static int kobil_tiocmget(struct usb_serial_port *port, struct file *file) } // allocate memory for transfer buffer - transfer_buffer = kzalloc(transfer_buffer_length, GFP_KERNEL); + transfer_buffer = (unsigned char *) kmalloc(transfer_buffer_length, GFP_KERNEL); if (!transfer_buffer) { return -ENOMEM; } + memset(transfer_buffer, 0, transfer_buffer_length); result = usb_control_msg( port->serial->dev, usb_rcvctrlpipe(port->serial->dev, 0 ), @@ -559,10 +564,11 @@ static int kobil_tiocmset(struct usb_serial_port *port, struct file *file, } // allocate memory for transfer buffer - transfer_buffer = kzalloc(transfer_buffer_length, GFP_KERNEL); + transfer_buffer = (unsigned char *) kmalloc(transfer_buffer_length, GFP_KERNEL); if (! transfer_buffer) { return -ENOMEM; } + memset(transfer_buffer, 0, transfer_buffer_length); if (set & TIOCM_RTS) rts = 1; @@ -649,10 +655,11 @@ static int kobil_ioctl(struct usb_serial_port *port, struct file *file, (struct termios __user *)arg)) return -EFAULT; - settings = kzalloc(50, GFP_KERNEL); + settings = (unsigned char *) kmalloc(50, GFP_KERNEL); if (! settings) { return -ENOBUFS; } + memset(settings, 0, 50); switch (priv->internal_termios.c_cflag & CBAUD) { case B1200: diff --git a/drivers/usb/serial/mct_u232.c b/drivers/usb/serial/mct_u232.c index f4d4305c2..b6d6cab9c 100644 --- a/drivers/usb/serial/mct_u232.c +++ b/drivers/usb/serial/mct_u232.c @@ -64,6 +64,7 @@ * (via linux-usb-devel). */ +#include #include #include #include @@ -75,7 +76,7 @@ #include #include #include -#include +#include "usb-serial.h" #include "mct_u232.h" /* @@ -347,9 +348,10 @@ static int mct_u232_startup (struct usb_serial *serial) struct mct_u232_private *priv; struct usb_serial_port *port, *rport; - priv = kzalloc(sizeof(struct mct_u232_private), GFP_KERNEL); + priv = kmalloc(sizeof(struct mct_u232_private), GFP_KERNEL); if (!priv) return -ENOMEM; + memset(priv, 0, sizeof(struct mct_u232_private)); spin_lock_init(&priv->lock); usb_set_serial_port_data(serial->port[0], priv); diff --git a/drivers/usb/serial/omninet.c b/drivers/usb/serial/omninet.c index a764ff4e3..762d8ff9a 100644 --- a/drivers/usb/serial/omninet.c +++ b/drivers/usb/serial/omninet.c @@ -35,6 +35,7 @@ * */ +#include #include #include #include @@ -46,7 +47,7 @@ #include #include #include -#include +#include "usb-serial.h" static int debug; @@ -203,7 +204,7 @@ static void omninet_read_bulk_callback (struct urb *urb, struct pt_regs *regs) int i; int result; - dbg("%s - port %d", __FUNCTION__, port->number); +// dbg("omninet_read_bulk_callback"); if (urb->status) { dbg("%s - nonzero read bulk status received: %d", __FUNCTION__, urb->status); @@ -249,21 +250,21 @@ static int omninet_write (struct usb_serial_port *port, const unsigned char *buf int result; - dbg("%s - port %d", __FUNCTION__, port->number); +// dbg("omninet_write port %d", port->number); if (count == 0) { dbg("%s - write request of 0 bytes", __FUNCTION__); return (0); } - spin_lock_bh(&wport->lock); - if (wport->write_urb_busy) { - spin_unlock_bh(&wport->lock); + spin_lock(&port->lock); + if (port->write_urb_busy) { + spin_unlock(&port->lock); dbg("%s - already writing", __FUNCTION__); return 0; } - wport->write_urb_busy = 1; - spin_unlock_bh(&wport->lock); + port->write_urb_busy = 1; + spin_unlock(&port->lock); count = (count > OMNINET_BULKOUTSIZE) ? OMNINET_BULKOUTSIZE : count; @@ -282,7 +283,7 @@ static int omninet_write (struct usb_serial_port *port, const unsigned char *buf wport->write_urb->dev = serial->dev; result = usb_submit_urb(wport->write_urb, GFP_ATOMIC); if (result) { - wport->write_urb_busy = 0; + port->write_urb_busy = 0; err("%s - failed submitting write urb, error %d", __FUNCTION__, result); } else result = count; @@ -301,7 +302,7 @@ static int omninet_write_room (struct usb_serial_port *port) if (wport->write_urb_busy) room = wport->bulk_out_size - OMNINET_HEADERLEN; - dbg("%s - returns %d", __FUNCTION__, room); +// dbg("omninet_write_room returns %d", room); return (room); } @@ -311,7 +312,7 @@ static void omninet_write_bulk_callback (struct urb *urb, struct pt_regs *regs) /* struct omninet_header *header = (struct omninet_header *) urb->transfer_buffer; */ struct usb_serial_port *port = (struct usb_serial_port *) urb->context; - dbg("%s - port %0x\n", __FUNCTION__, port->number); +// dbg("omninet_write_bulk_callback, port %0x\n", port); port->write_urb_busy = 0; if (urb->status) { @@ -319,7 +320,9 @@ static void omninet_write_bulk_callback (struct urb *urb, struct pt_regs *regs) return; } - usb_serial_port_softint(port); + schedule_work(&port->work); + +// dbg("omninet_write_bulk_callback, tty %0x\n", tty); } diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c index c856e6f40..fd8a50e08 100644 --- a/drivers/usb/serial/option.c +++ b/drivers/usb/serial/option.c @@ -1,5 +1,5 @@ /* - USB Driver for GSM modems + Option Card (PCMCIA to) USB to Serial Driver Copyright (C) 2005 Matthias Urlichs @@ -9,29 +9,35 @@ Portions copied from the Keyspan driver by Hugh Blemings - History: see the git log. + History: + + 2005-05-19 v0.1 Initial version, based on incomplete docs + and analysis of misbehavior with 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 + 2005-05-24 v0.4 option_write() sometimes deadlocked under heavy load + removed some dead code + added sponsor notice + coding style clean-up + 2005-06-20 v0.4.1 add missing braces :-/ + killed end-of-line whitespace + 2005-07-15 v0.4.2 rename WLAN product to FUSION, add FUSION2 + 2005-09-10 v0.4.3 added HUAWEI E600 card and Audiovox AirCard + 2005-09-20 v0.4.4 increased recv buffer size: the card sometimes + wants to send >2000 bytes. 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.7.1" +#define DRIVER_VERSION "v0.4" #define DRIVER_AUTHOR "Matthias Urlichs " -#define DRIVER_DESC "USB Driver for GSM modems" +#define DRIVER_DESC "Option Card (PC-Card to) USB to Serial Driver" +#include #include #include #include @@ -39,7 +45,7 @@ #include #include #include -#include +#include "usb-serial.h" /* Function prototypes */ static int option_open(struct usb_serial_port *port, struct file *filp); @@ -67,45 +73,22 @@ static int option_tiocmset(struct usb_serial_port *port, struct file *file, static int option_send_setup(struct usb_serial_port *port); /* Vendor and product IDs */ -#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 +#define OPTION_VENDOR_ID 0x0AF0 +#define HUAWEI_VENDOR_ID 0x12D1 +#define AUDIOVOX_VENDOR_ID 0x0F3D -static struct usb_device_id option_ids[] = { - { 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 */ -}; +#define OPTION_PRODUCT_OLD 0x5000 +#define OPTION_PRODUCT_FUSION 0x6000 +#define OPTION_PRODUCT_FUSION2 0x6300 +#define HUAWEI_PRODUCT_E600 0x1001 +#define AUDIOVOX_PRODUCT_AIRCARD 0x0112 -static struct usb_device_id option_ids1[] = { +static struct usb_device_id option_ids[] = { { 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 */ }; @@ -119,21 +102,20 @@ static struct usb_driver option_driver = { .no_dynamic_id = 1, }; -/* The card has three separate interfaces, which the serial driver +/* The card has three separate interfaces, wich the serial driver * recognizes separately, thus num_port=1. */ - -static struct usb_serial_driver option_1port_device = { +static struct usb_serial_driver option_3port_device = { .driver = { .owner = THIS_MODULE, - .name = "option1", + .name = "option", }, - .description = "GSM modem (1-port)", - .id_table = option_ids1, + .description = "Option 3G data card", + .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, + .num_ports = 1, /* 3, but the card reports its ports separately */ .open = option_open, .close = option_close, .write = option_write, @@ -187,9 +169,9 @@ struct option_port_private { static int __init option_init(void) { int retval; - retval = usb_serial_register(&option_1port_device); + retval = usb_serial_register(&option_3port_device); if (retval) - goto failed_1port_device_register; + goto failed_3port_device_register; retval = usb_register(&option_driver); if (retval) goto failed_driver_register; @@ -199,15 +181,15 @@ static int __init option_init(void) return 0; failed_driver_register: - usb_serial_deregister (&option_1port_device); -failed_1port_device_register: + usb_serial_deregister (&option_3port_device); +failed_3port_device_register: return retval; } static void __exit option_exit(void) { usb_deregister (&option_driver); - usb_serial_deregister (&option_1port_device); + usb_serial_deregister (&option_3port_device); } module_init(option_init); @@ -382,7 +364,8 @@ static void option_outdat_callback(struct urb *urb, struct pt_regs *regs) port = (struct usb_serial_port *) urb->context; - usb_serial_port_softint(port); + if (port->open_count) + schedule_work(&port->work); } static void option_instat_callback(struct urb *urb, struct pt_regs *regs) @@ -589,29 +572,27 @@ static struct urb *option_setup_urb(struct usb_serial *serial, int endpoint, /* Setup urbs */ static void option_setup_urbs(struct usb_serial *serial) { - int i,j; + int j; struct usb_serial_port *port; struct option_port_private *portdata; dbg("%s", __FUNCTION__); - for (i = 0; i < serial->num_ports; i++) { - port = serial->port[i]; - portdata = usb_get_serial_port_data(port); + port = serial->port[0]; + portdata = usb_get_serial_port_data(port); /* Do indat endpoints first */ - for (j = 0; j < N_IN_URB; ++j) { - portdata->in_urbs[j] = option_setup_urb (serial, - port->bulk_in_endpointAddress, USB_DIR_IN, port, - portdata->in_buffer[j], IN_BUFLEN, option_indat_callback); - } + 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); } } @@ -650,12 +631,13 @@ static int option_startup(struct usb_serial *serial) /* Now setup per port private data */ for (i = 0; i < serial->num_ports; i++) { port = serial->port[i]; - portdata = kzalloc(sizeof(*portdata), GFP_KERNEL); + portdata = kmalloc(sizeof(*portdata), GFP_KERNEL); if (!portdata) { dbg("%s: kmalloc for option_port_private (%d) failed!.", __FUNCTION__, i); return (1); } + memset(portdata, 0, sizeof(struct option_port_private)); usb_set_serial_port_data(port, portdata); diff --git a/drivers/usb/serial/pl2303.c b/drivers/usb/serial/pl2303.c index 65e4d0469..37c81c08f 100644 --- a/drivers/usb/serial/pl2303.c +++ b/drivers/usb/serial/pl2303.c @@ -14,6 +14,7 @@ * */ +#include #include #include #include @@ -27,7 +28,7 @@ #include #include #include -#include +#include "usb-serial.h" #include "pl2303.h" /* @@ -52,7 +53,6 @@ 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) }, @@ -61,7 +61,6 @@ static struct usb_device_id id_table [] = { { USB_DEVICE(ELCOM_VENDOR_ID, ELCOM_PRODUCT_ID) }, { USB_DEVICE(ELCOM_VENDOR_ID, ELCOM_PRODUCT_ID_UCSGT) }, { USB_DEVICE(ITEGNO_VENDOR_ID, ITEGNO_PRODUCT_ID) }, - { USB_DEVICE(ITEGNO_VENDOR_ID, ITEGNO_PRODUCT_ID_2080) }, { USB_DEVICE(MA620_VENDOR_ID, MA620_PRODUCT_ID) }, { USB_DEVICE(RATOC_VENDOR_ID, RATOC_PRODUCT_ID) }, { USB_DEVICE(TRIPP_VENDOR_ID, TRIPP_PRODUCT_ID) }, @@ -78,9 +77,6 @@ static struct usb_device_id id_table [] = { { USB_DEVICE(CA_42_CA42_VENDOR_ID, CA_42_CA42_PRODUCT_ID) }, { 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(DATAPILOT_U2_VENDOR_ID, DATAPILOT_U2_PRODUCT_ID) }, - { USB_DEVICE(BELKIN_VENDOR_ID, BELKIN_PRODUCT_ID) }, { } /* Terminating entry */ }; @@ -222,9 +218,10 @@ static int pl2303_startup (struct usb_serial *serial) dbg("device type: %d", type); for (i = 0; i < serial->num_ports; ++i) { - priv = kzalloc(sizeof(struct pl2303_private), GFP_KERNEL); + priv = kmalloc (sizeof (struct pl2303_private), GFP_KERNEL); if (!priv) goto cleanup; + memset (priv, 0x00, sizeof (struct pl2303_private)); spin_lock_init(&priv->lock); priv->buf = pl2303_buf_alloc(PL2303_BUF_SIZE); if (priv->buf == NULL) { @@ -315,7 +312,7 @@ static void pl2303_send(struct usb_serial_port *port) // TODO: reschedule pl2303_send } - usb_serial_port_softint(port); + schedule_work(&port->work); } static int pl2303_write_room(struct usb_serial_port *port) @@ -386,11 +383,12 @@ static void pl2303_set_termios (struct usb_serial_port *port, struct termios *ol } } - buf = kzalloc (7, GFP_KERNEL); + buf = kmalloc (7, GFP_KERNEL); if (!buf) { dev_err(&port->dev, "%s - out of memory.\n", __FUNCTION__); return; } + memset (buf, 0x00, 0x07); i = usb_control_msg (serial->dev, usb_rcvctrlpipe (serial->dev, 0), GET_LINE_REQUEST, GET_LINE_REQUEST_TYPE, @@ -601,7 +599,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); @@ -830,7 +828,6 @@ static void pl2303_update_line_status(struct usb_serial_port *port, spin_lock_irqsave(&priv->lock, flags); priv->line_status = data[status_idx]; spin_unlock_irqrestore(&priv->lock, flags); - wake_up_interruptible (&priv->delta_msr_wait); exit: return; diff --git a/drivers/usb/serial/pl2303.h b/drivers/usb/serial/pl2303.h index 55195e76e..9bc475516 100644 --- a/drivers/usb/serial/pl2303.h +++ b/drivers/usb/serial/pl2303.h @@ -10,7 +10,6 @@ #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 @@ -27,7 +26,6 @@ #define ITEGNO_VENDOR_ID 0x0eba #define ITEGNO_PRODUCT_ID 0x1080 -#define ITEGNO_PRODUCT_ID_2080 0x2080 #define MA620_VENDOR_ID 0x0df7 #define MA620_PRODUCT_ID 0x0620 @@ -77,15 +75,3 @@ /* Leadtek GPS 9531 (ID 0413:2101) */ #define LEADTEK_VENDOR_ID 0x0413 #define LEADTEK_9531_PRODUCT_ID 0x2101 - -/* USB GSM cable from Speed Dragon Multimedia, Ltd */ -#define SPEEDDRAGON_VENDOR_ID 0x0e55 -#define SPEEDDRAGON_PRODUCT_ID 0x110b - -/* 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 1e07dfad6..f0215f850 100644 --- a/drivers/usb/serial/safe_serial.c +++ b/drivers/usb/serial/safe_serial.c @@ -60,6 +60,7 @@ */ +#include #include #include #include @@ -71,7 +72,7 @@ #include #include #include -#include +#include "usb-serial.h" #ifndef CONFIG_USB_SAFE_PADDED @@ -298,14 +299,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_bh(&port->lock); + spin_lock(&port->lock); if (port->write_urb_busy) { - spin_unlock_bh(&port->lock); + spin_unlock(&port->lock); dbg("%s - already writing", __FUNCTION__); return 0; } port->write_urb_busy = 1; - spin_unlock_bh(&port->lock); + spin_unlock(&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 ac9b8ee52..c18db3257 100644 --- a/drivers/usb/serial/ti_usb_3410_5052.c +++ b/drivers/usb/serial/ti_usb_3410_5052.c @@ -68,6 +68,7 @@ * fi */ +#include #include #include #include @@ -83,8 +84,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 */ @@ -415,11 +416,12 @@ static int ti_startup(struct usb_serial *serial) dev->actconfig->desc.bConfigurationValue); /* create device structure */ - tdev = kzalloc(sizeof(struct ti_device), GFP_KERNEL); + tdev = kmalloc(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); diff --git a/drivers/usb/serial/usb-serial.c b/drivers/usb/serial/usb-serial.c index e06a41bd0..b5c96e74a 100644 --- a/drivers/usb/serial/usb-serial.c +++ b/drivers/usb/serial/usb-serial.c @@ -16,6 +16,7 @@ * */ +#include #include #include #include @@ -26,12 +27,12 @@ #include #include #include -#include #include #include #include +#include #include -#include +#include "usb-serial.h" #include "pl2303.h" /* @@ -40,8 +41,6 @@ #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", @@ -148,7 +147,18 @@ static void destroy_serial(struct kref *kref) port = serial->port[i]; if (!port) continue; - port_free(port); + 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); } } @@ -158,11 +168,6 @@ 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 *****************************************************************************/ @@ -184,31 +189,27 @@ static int serial_open (struct tty_struct *tty, struct file * filp) portNumber = tty->index - serial->minor; port = serial->port[portNumber]; - if (!port) { - retval = -ENODEV; - goto bailout_kref_put; - } + if (!port) + return -ENODEV; - if (mutex_lock_interruptible(&port->mutex)) { - retval = -ERESTARTSYS; - goto bailout_kref_put; - } + if (down_interruptible(&port->sem)) + return -ERESTARTSYS; ++port->open_count; - /* 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) { + /* set up our port structure making the tty driver + * remember our port object, and us it */ + tty->driver_data = port; + port->tty = tty; + /* lock this module before we call it * this may fail, which means we must bail out, * safe because we are called with BKL held */ if (!try_module_get(serial->type->driver.owner)) { retval = -ENODEV; - goto bailout_mutex_unlock; + goto bailout_kref_put; } /* only call the device specific open if this @@ -218,18 +219,15 @@ static int serial_open (struct tty_struct *tty, struct file * filp) goto bailout_module_put; } - mutex_unlock(&port->mutex); + up(&port->sem); return 0; 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: - usb_serial_put(serial); + kref_put(&serial->kref, destroy_serial); + port->open_count = 0; + up(&port->sem); return retval; } @@ -242,10 +240,10 @@ static void serial_close(struct tty_struct *tty, struct file * filp) dbg("%s - port %d", __FUNCTION__, port->number); - mutex_lock(&port->mutex); + down(&port->sem); if (port->open_count == 0) { - mutex_unlock(&port->mutex); + up(&port->sem); return; } @@ -264,8 +262,8 @@ static void serial_close(struct tty_struct *tty, struct file * filp) module_put(port->serial->type->driver.owner); } - mutex_unlock(&port->mutex); - usb_serial_put(port->serial); + up(&port->sem); + kref_put(&port->serial->kref, destroy_serial); } static int serial_write (struct tty_struct * tty, const unsigned char *buf, int count) @@ -273,7 +271,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 || port->serial->dev->state == USB_STATE_NOTATTACHED) + if (!port) goto exit; dbg("%s - port %d, %d byte(s)", __FUNCTION__, port->number, count); @@ -293,7 +291,7 @@ exit: static int serial_write_room (struct tty_struct *tty) { struct usb_serial_port *port = tty->driver_data; - int retval = -ENODEV; + int retval = -EINVAL; if (!port) goto exit; @@ -315,7 +313,7 @@ exit: static int serial_chars_in_buffer (struct tty_struct *tty) { struct usb_serial_port *port = tty->driver_data; - int retval = -ENODEV; + int retval = -EINVAL; if (!port) goto exit; @@ -464,15 +462,13 @@ 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)) { - usb_serial_put(serial); + if ((length + begin) > (off + count)) goto done; - } if ((length + begin) < off) { begin += length; length = 0; } - usb_serial_put(serial); + kref_put(&serial->kref, destroy_serial); } *eof = 1; done: @@ -487,18 +483,19 @@ static int serial_tiocmget (struct tty_struct *tty, struct file *file) struct usb_serial_port *port = tty->driver_data; if (!port) - return -ENODEV; + goto exit; dbg("%s - port %d", __FUNCTION__, port->number); if (!port->open_count) { dbg("%s - port not open", __FUNCTION__); - return -ENODEV; + goto exit; } if (port->serial->type->tiocmget) return port->serial->type->tiocmget(port, file); +exit: return -EINVAL; } @@ -508,32 +505,23 @@ static int serial_tiocmset (struct tty_struct *tty, struct file *file, struct usb_serial_port *port = tty->driver_data; if (!port) - return -ENODEV; + goto exit; dbg("%s - port %d", __FUNCTION__, port->number); if (!port->open_count) { dbg("%s - port not open", __FUNCTION__); - return -ENODEV; + goto exit; } if (port->serial->type->tiocmset) return port->serial->type->tiocmset(port, file, set, clear); +exit: return -EINVAL; } -/* - * 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) +void usb_serial_port_softint(void *private) { struct usb_serial_port *port = private; struct tty_struct *tty; @@ -555,11 +543,6 @@ 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); @@ -572,7 +555,6 @@ static void port_free(struct usb_serial_port *port) kfree(port->bulk_out_buffer); kfree(port->interrupt_in_buffer); kfree(port->interrupt_out_buffer); - flush_scheduled_work(); /* port->work */ kfree(port); } @@ -582,11 +564,12 @@ static struct usb_serial * create_serial (struct usb_device *dev, { struct usb_serial *serial; - serial = kzalloc(sizeof(*serial), GFP_KERNEL); + serial = kmalloc (sizeof (*serial), GFP_KERNEL); if (!serial) { dev_err(&dev->dev, "%s - out of memory\n", __FUNCTION__); return NULL; } + memset (serial, 0, sizeof(*serial)); serial->dev = usb_get_dev(dev); serial->type = driver; serial->interface = interface; @@ -795,14 +778,15 @@ int usb_serial_probe(struct usb_interface *interface, serial->num_port_pointers = max_endpoints; dbg("%s - setting up %d port structures for this device", __FUNCTION__, max_endpoints); for (i = 0; i < max_endpoints; ++i) { - port = kzalloc(sizeof(struct usb_serial_port), GFP_KERNEL); + port = kmalloc(sizeof(struct usb_serial_port), GFP_KERNEL); if (!port) goto probe_error; + memset(port, 0x00, sizeof(struct usb_serial_port)); port->number = i + serial->minor; port->serial = serial; spin_lock_init(&port->lock); - mutex_init(&port->mutex); - INIT_WORK(&port->work, usb_serial_port_work, port); + sema_init(&port->sem, 1); + INIT_WORK(&port->work, usb_serial_port_softint, port); serial->port[i] = port; } @@ -998,7 +982,6 @@ 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); @@ -1010,7 +993,7 @@ void usb_serial_disconnect(struct usb_interface *interface) } /* let the last holder of this object * cause it to be cleaned up */ - usb_serial_put(serial); + kref_put(&serial->kref, destroy_serial); } dev_info(dev, "device disconnected\n"); } @@ -1055,12 +1038,13 @@ 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_DYNAMIC_DEV; + usb_serial_tty_driver->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_NO_DEVFS; 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 index dc89d8710..d7d27c338 100644 --- a/drivers/usb/serial/usb-serial.h +++ b/drivers/usb/serial/usb-serial.h @@ -16,7 +16,7 @@ #include #include -#include +#include #define SERIAL_TTY_MAJOR 188 /* Nice legal number now */ #define SERIAL_TTY_MINORS 255 /* loads of devices :) */ @@ -31,7 +31,7 @@ * @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() + * @sem: semaphore used to synchronize serial_open() and serial_close() * access for this port. * @number: the number of the port (the minor number). * @interrupt_in_buffer: pointer to the interrupt in buffer for this port. @@ -63,7 +63,7 @@ struct usb_serial_port { struct usb_serial * serial; struct tty_struct * tty; spinlock_t lock; - struct mutex mutex; + struct semaphore sem; unsigned char number; unsigned char * interrupt_in_buffer; diff --git a/drivers/usb/serial/visor.c b/drivers/usb/serial/visor.c index 88949f788..11a48d874 100644 --- a/drivers/usb/serial/visor.c +++ b/drivers/usb/serial/visor.c @@ -13,6 +13,7 @@ * */ +#include #include #include #include @@ -25,7 +26,7 @@ #include #include #include -#include +#include "usb-serial.h" #include "visor.h" /* @@ -302,6 +303,7 @@ 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); @@ -434,25 +436,13 @@ 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, unless we don't. + * layer that we have lots of free space */ - - 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; } @@ -490,7 +480,7 @@ static void visor_write_bulk_callback (struct urb *urb, struct pt_regs *regs) --priv->outstanding_urbs; spin_unlock_irqrestore(&priv->lock, flags); - usb_serial_port_softint(port); + schedule_work(&port->work); } @@ -769,22 +759,16 @@ 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) { - while (i-- != 0) { - priv = usb_get_serial_port_data(ports[i]); - usb_set_serial_port_data(ports[i], NULL); - kfree(priv); - } + priv = kmalloc (sizeof(*priv), GFP_KERNEL); + if (!priv) return -ENOMEM; - } + memset (priv, 0x00, sizeof(*priv)); spin_lock_init(&priv->lock); - usb_set_serial_port_data(ports[i], priv); + usb_set_serial_port_data(serial->port[i], priv); } return 0; } @@ -894,18 +878,7 @@ 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 6e6c7934b..f494b67a8 100644 --- a/drivers/usb/serial/whiteheat.c +++ b/drivers/usb/serial/whiteheat.c @@ -65,6 +65,7 @@ * */ +#include #include #include #include @@ -79,7 +80,7 @@ #include #include #include -#include +#include "usb-serial.h" #include "whiteheat_fw.h" /* firmware for the ConnectTech WhiteHEAT device */ #include "whiteheat.h" /* WhiteHEAT specific commands */ @@ -507,7 +508,6 @@ no_firmware: err("%s: Unable to retrieve firmware version, try replugging\n", serial->type->description); err("%s: If the firmware is not running (status led not blinking)\n", serial->type->description); err("%s: please contact support@connecttech.com\n", serial->type->description); - kfree(result); return -ENODEV; no_command_private: @@ -685,16 +685,19 @@ 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_move(tmp, &info->rx_urbs_free); + 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_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_move(tmp, &info->tx_urbs_free); + list_del(tmp); + list_add(tmp, &info->tx_urbs_free); } spin_unlock_irqrestore(&info->lock, flags); @@ -1076,7 +1079,8 @@ static void whiteheat_write_callback(struct urb *urb, struct pt_regs *regs) err("%s - Not my urb!", __FUNCTION__); return; } - list_move(&wrap->list, &info->tx_urbs_free); + list_del(&wrap->list); + list_add(&wrap->list, &info->tx_urbs_free); spin_unlock(&info->lock); if (urb->status) { @@ -1084,7 +1088,9 @@ static void whiteheat_write_callback(struct urb *urb, struct pt_regs *regs) return; } - usb_serial_port_softint(port); + usb_serial_port_softint((void *)port); + + schedule_work(&port->work); } @@ -1366,7 +1372,8 @@ 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_move(tmp, &info->rx_urbs_free); + list_del(tmp); + list_add(tmp, &info->rx_urbs_free); } break; } diff --git a/drivers/usb/storage/datafab.c b/drivers/usb/storage/datafab.c index 01d8971ad..54e3e6c7e 100644 --- a/drivers/usb/storage/datafab.c +++ b/drivers/usb/storage/datafab.c @@ -512,12 +512,13 @@ int datafab_transport(struct scsi_cmnd * srb, struct us_data *us) }; if (!us->extra) { - us->extra = kzalloc(sizeof(struct datafab_info), GFP_NOIO); + us->extra = kmalloc(sizeof(struct datafab_info), GFP_NOIO); if (!us->extra) { US_DEBUGP("datafab_transport: Gah! " "Can't allocate storage for Datafab info struct!\n"); return USB_STOR_TRANSPORT_ERROR; } + memset(us->extra, 0, sizeof(struct datafab_info)); us->extra_destructor = datafab_info_destructor; ((struct datafab_info *)us->extra)->lun = -1; } diff --git a/drivers/usb/storage/debug.h b/drivers/usb/storage/debug.h index 77e244a8c..cd2096acc 100644 --- a/drivers/usb/storage/debug.h +++ b/drivers/usb/storage/debug.h @@ -44,6 +44,7 @@ #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 1628cb258..92b69e4c8 100644 --- a/drivers/usb/storage/dpcm.c +++ b/drivers/usb/storage/dpcm.c @@ -29,6 +29,7 @@ * 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 88aa59ab7..30e96050f 100644 --- a/drivers/usb/storage/freecom.c +++ b/drivers/usb/storage/freecom.c @@ -28,6 +28,7 @@ * (http://www.freecom.de/) */ +#include #include #include diff --git a/drivers/usb/storage/initializers.h b/drivers/usb/storage/initializers.h index 927f77810..f9907a5cf 100644 --- a/drivers/usb/storage/initializers.h +++ b/drivers/usb/storage/initializers.h @@ -37,6 +37,7 @@ * 675 Mass Ave, Cambridge, MA 02139, USA. */ +#include #include "usb.h" #include "transport.h" diff --git a/drivers/usb/storage/isd200.c b/drivers/usb/storage/isd200.c index 6831dca93..ecb328aa9 100644 --- a/drivers/usb/storage/isd200.c +++ b/drivers/usb/storage/isd200.c @@ -1361,19 +1361,21 @@ static int isd200_init_info(struct us_data *us) struct isd200_info *info; info = (struct isd200_info *) - kzalloc(sizeof(struct isd200_info), GFP_KERNEL); + kmalloc(sizeof(struct isd200_info), GFP_KERNEL); if (!info) retStatus = ISD200_ERROR; else { + memset(info, 0, sizeof(struct isd200_info)); info->id = (struct hd_driveid *) - kzalloc(sizeof(struct hd_driveid), GFP_KERNEL); + kmalloc(sizeof(struct hd_driveid), GFP_KERNEL); info->RegsBuf = (unsigned char *) kmalloc(sizeof(info->ATARegs), GFP_KERNEL); if (!info->id || !info->RegsBuf) { isd200_free_info_ptrs(info); kfree(info); retStatus = ISD200_ERROR; - } + } else + memset(info->id, 0, sizeof(struct hd_driveid)); } if (retStatus == ISD200_GOOD) { @@ -1382,7 +1384,7 @@ static int isd200_init_info(struct us_data *us) } else US_DEBUGP("ERROR - kmalloc failure\n"); - return retStatus; + return(retStatus); } /************************************************************************** diff --git a/drivers/usb/storage/jumpshot.c b/drivers/usb/storage/jumpshot.c index 5031aa98f..aff9d51c3 100644 --- a/drivers/usb/storage/jumpshot.c +++ b/drivers/usb/storage/jumpshot.c @@ -441,11 +441,12 @@ int jumpshot_transport(struct scsi_cmnd * srb, struct us_data *us) }; if (!us->extra) { - us->extra = kzalloc(sizeof(struct jumpshot_info), GFP_NOIO); + us->extra = kmalloc(sizeof(struct jumpshot_info), GFP_NOIO); if (!us->extra) { US_DEBUGP("jumpshot_transport: Gah! Can't allocate storage for jumpshot info struct!\n"); return USB_STOR_TRANSPORT_ERROR; } + memset(us->extra, 0, sizeof(struct jumpshot_info)); us->extra_destructor = jumpshot_info_destructor; } diff --git a/drivers/usb/storage/libusual.c b/drivers/usb/storage/libusual.c index 38faca734..b1ec4a718 100644 --- a/drivers/usb/storage/libusual.c +++ b/drivers/usb/storage/libusual.c @@ -5,7 +5,6 @@ */ #include #include -#include #include #include #include @@ -14,7 +13,6 @@ */ #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; @@ -35,12 +33,8 @@ 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. */ @@ -117,44 +111,18 @@ 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) { @@ -218,14 +186,10 @@ 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: " - "request for %s succeeded, but module is not present\n", + "modprobe 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); @@ -239,27 +203,9 @@ 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) @@ -275,9 +221,6 @@ 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 313920d98..55ee2d36d 100644 --- a/drivers/usb/storage/onetouch.c +++ b/drivers/usb/storage/onetouch.c @@ -28,13 +28,15 @@ * */ +#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 a4b7df9ff..4ef552702 100644 --- a/drivers/usb/storage/scsiglue.c +++ b/drivers/usb/storage/scsiglue.c @@ -47,7 +47,6 @@ #include #include -#include #include #include @@ -112,11 +111,13 @@ static int slave_configure(struct scsi_device *sdev) if (sdev->scsi_level < SCSI_2) sdev->scsi_level = sdev->sdev_target->scsi_level = SCSI_2; - /* 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) && + /* 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 && sdev->request_queue->max_sectors > 64) blk_queue_max_sectors(sdev->request_queue, 64); @@ -270,9 +271,9 @@ static int device_reset(struct scsi_cmnd *srb) US_DEBUGP("%s called\n", __FUNCTION__); /* lock the device pointers and do the reset */ - mutex_lock(&(us->dev_mutex)); + down(&(us->dev_semaphore)); result = us->transport_reset(us); - mutex_unlock(&us->dev_mutex); + up(&(us->dev_semaphore)); return result < 0 ? FAILED : SUCCESS; } @@ -284,7 +285,11 @@ static int bus_reset(struct scsi_cmnd *srb) int result; US_DEBUGP("%s called\n", __FUNCTION__); + + down(&(us->dev_semaphore)); result = usb_stor_port_reset(us); + up(&(us->dev_semaphore)); + return result < 0 ? FAILED : SUCCESS; } diff --git a/drivers/usb/storage/sddr55.c b/drivers/usb/storage/sddr55.c index 0b1b5b59c..8451779f4 100644 --- a/drivers/usb/storage/sddr55.c +++ b/drivers/usb/storage/sddr55.c @@ -751,10 +751,11 @@ int sddr55_transport(struct scsi_cmnd *srb, struct us_data *us) struct sddr55_card_info *info; if (!us->extra) { - us->extra = kzalloc( + us->extra = kmalloc( sizeof(struct sddr55_card_info), GFP_NOIO); if (!us->extra) return USB_STOR_TRANSPORT_ERROR; + memset(us->extra, 0, sizeof(struct sddr55_card_info)); us->extra_destructor = sddr55_card_info_destructor; } diff --git a/drivers/usb/storage/shuttle_usbat.c b/drivers/usb/storage/shuttle_usbat.c index 8fcec01dc..fea176d7e 100644 --- a/drivers/usb/storage/shuttle_usbat.c +++ b/drivers/usb/storage/shuttle_usbat.c @@ -131,30 +131,28 @@ 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, - int use_sg) + unsigned char *data, + unsigned int len) { if (len == 0) return USB_STOR_XFER_GOOD; US_DEBUGP("usbat_bulk_read: len = %d\n", len); - return usb_stor_bulk_transfer_sg(us, us->recv_bulk_pipe, data, len, use_sg, NULL); + return usb_stor_bulk_transfer_buf(us, us->recv_bulk_pipe, data, len, NULL); } /* * Convenience function to perform a bulk write */ static int usbat_bulk_write(struct us_data *us, - unsigned char *data, - unsigned int len, - int use_sg) + unsigned char *data, + unsigned int len) { if (len == 0) return USB_STOR_XFER_GOOD; US_DEBUGP("usbat_bulk_write: len = %d\n", len); - return usb_stor_bulk_transfer_sg(us, us->send_bulk_pipe, data, len, use_sg, NULL); + return usb_stor_bulk_transfer_buf(us, us->send_bulk_pipe, data, len, NULL); } /* @@ -319,8 +317,7 @@ 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, - int use_sg) + unsigned short len) { int result; unsigned char *command = us->iobuf; @@ -341,7 +338,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, use_sg); + result = usbat_bulk_read(us, content, len); return (result == USB_STOR_XFER_GOOD ? USB_STOR_TRANSPORT_GOOD : USB_STOR_TRANSPORT_ERROR); } @@ -353,8 +350,7 @@ static int usbat_write_block(struct us_data *us, unsigned char access, unsigned char *content, unsigned short len, - int minutes, - int use_sg) + int minutes) { int result; unsigned char *command = us->iobuf; @@ -376,7 +372,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, use_sg); + result = usbat_bulk_write(us, content, len); if (result != USB_STOR_XFER_GOOD) return USB_STOR_TRANSPORT_ERROR; @@ -469,7 +465,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, 0); + result = usbat_bulk_write(us, data, num_registers*2); if (result != USB_STOR_XFER_GOOD) return USB_STOR_TRANSPORT_ERROR; @@ -587,7 +583,7 @@ static int usbat_multiple_write(struct us_data *us, } /* Send the data */ - result = usbat_bulk_write(us, data, num_registers*2, 0); + result = usbat_bulk_write(us, data, num_registers*2); if (result != USB_STOR_XFER_GOOD) return USB_STOR_TRANSPORT_ERROR; @@ -610,9 +606,8 @@ 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, - int use_sg) + unsigned char *buffer, + int len) { int result; unsigned char *command = us->iobuf; @@ -632,7 +627,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, use_sg); + result = usbat_bulk_read(us, buffer, len); if (result != USB_STOR_XFER_GOOD) return USB_STOR_TRANSPORT_FAILED; @@ -653,8 +648,7 @@ static int usbat_read_blocks(struct us_data *us, */ static int usbat_write_blocks(struct us_data *us, unsigned char *buffer, - int len, - int use_sg) + int len) { int result; unsigned char *command = us->iobuf; @@ -674,7 +668,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, use_sg); + result = usbat_bulk_write(us, buffer, len); if (result != USB_STOR_XFER_GOOD) return USB_STOR_TRANSPORT_FAILED; @@ -893,28 +887,22 @@ 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, - int devicetype) + struct usbat_info *info) { + int rc; - if (!info->devicetype) - info->devicetype = devicetype; - - if (!info->devicetype) - usbat_identify_device(us, info); - - switch (info->devicetype) { - default: - return USB_STOR_TRANSPORT_ERROR; + 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; + } + } - case USBAT_DEV_HP8200: + if (usbat_get_device_type(us) == USBAT_DEV_HP8200) us->transport = usbat_hp8200e_transport; - break; - - case USBAT_DEV_FLASH: + else if (usbat_get_device_type(us) == USBAT_DEV_FLASH) us->transport = usbat_flash_transport; - break; - } return 0; } @@ -959,7 +947,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, 0); + rc = usbat_read_block(us, reply, 512); if (rc != USB_STOR_TRANSPORT_GOOD) goto leave; @@ -1043,7 +1031,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, 0); + result = usbat_read_blocks(us, buffer, len); if (result != USB_STOR_TRANSPORT_GOOD) goto leave; @@ -1137,7 +1125,7 @@ static int usbat_flash_write_data(struct us_data *us, goto leave; /* Write the data */ - result = usbat_write_blocks(us, buffer, len, 0); + result = usbat_write_blocks(us, buffer, len); if (result != USB_STOR_TRANSPORT_GOOD) goto leave; @@ -1322,7 +1310,7 @@ static int usbat_select_and_test_registers(struct us_data *us) /* * Initialize the USBAT processor and the storage device */ -static int init_usbat(struct us_data *us, int devicetype) +int init_usbat(struct us_data *us) { int rc; struct usbat_info *info; @@ -1330,11 +1318,12 @@ static int init_usbat(struct us_data *us, int devicetype) unsigned char subcountL = USBAT_ATA_LBA_ME; unsigned char *status = us->iobuf; - us->extra = kzalloc(sizeof(struct usbat_info), GFP_NOIO); + us->extra = kmalloc(sizeof(struct usbat_info), GFP_NOIO); if (!us->extra) { US_DEBUGP("init_usbat: Gah! Can't allocate storage for usbat info struct!\n"); return 1; } + memset(us->extra, 0, sizeof(struct usbat_info)); info = (struct usbat_info *) (us->extra); /* Enable peripheral control signals */ @@ -1404,7 +1393,7 @@ static int init_usbat(struct us_data *us, int devicetype) US_DEBUGP("INIT 9\n"); /* At this point, we need to detect which device we are using */ - if (usbat_set_transport(us, info, devicetype)) + if (usbat_set_transport(us, info)) return USB_STOR_TRANSPORT_ERROR; US_DEBUGP("INIT 10\n"); @@ -1515,10 +1504,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), 0) != - USB_STOR_TRANSPORT_GOOD)) { + srb->cmnd[0]==GPCMD_BLANK ? 75 : 10)) != + USB_STOR_TRANSPORT_GOOD) { return result; } @@ -1545,7 +1534,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, srb->use_sg); + result = usbat_read_block(us, srb->request_buffer, len); /* Debug-print the first 32 bytes of the transfer */ @@ -1707,22 +1696,6 @@ 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. @@ -1736,8 +1709,9 @@ 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, 0)) + if (usbat_set_transport(us, info)) 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 3ddf143a1..25e7d8b34 100644 --- a/drivers/usb/storage/shuttle_usbat.h +++ b/drivers/usb/storage/shuttle_usbat.h @@ -106,9 +106,7 @@ #define USBAT_FEAT_ET2 0x01 extern int usbat_transport(struct scsi_cmnd *srb, 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); +extern int init_usbat(struct us_data *us); struct usbat_info { int devicetype; diff --git a/drivers/usb/storage/transport.c b/drivers/usb/storage/transport.c index d6acc92a4..7ca896a34 100644 --- a/drivers/usb/storage/transport.c +++ b/drivers/usb/storage/transport.c @@ -45,6 +45,7 @@ * 675 Mass Ave, Cambridge, MA 02139, USA. */ +#include #include #include #include @@ -114,6 +115,19 @@ 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 * @@ -124,7 +138,7 @@ static void usb_stor_blocking_completion(struct urb *urb, struct pt_regs *regs) static int usb_stor_msg_common(struct us_data *us, int timeout) { struct completion urb_done; - long timeleft; + struct timer_list to_timer; int status; /* don't submit URBs during abort/disconnect processing */ @@ -171,17 +185,22 @@ 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 */ - timeleft = wait_for_completion_interruptible_timeout( - &urb_done, timeout ? : MAX_SCHEDULE_TIMEOUT); - + wait_for_completion(&urb_done); 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); - } + + /* clean up the timeout timer */ + if (timeout > 0) + del_timer_sync(&to_timer); /* return the URB status */ return us->current_urb->status; @@ -702,19 +721,16 @@ void usb_stor_invoke_transport(struct scsi_cmnd *srb, struct us_data *us) * device reset. */ Handle_Errors: - /* Set the RESETTING bit, and clear the ABORTING bit so that - * the reset may proceed. */ + /* 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. */ 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); @@ -1198,30 +1214,31 @@ int usb_stor_Bulk_reset(struct us_data *us) 0, us->ifnum, NULL, 0); } -/* Issue a USB port reset to the device. The caller must not hold - * us->dev_mutex. - */ +/* 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. */ int usb_stor_port_reset(struct us_data *us) { - int result, rc_lock; + int result, rc; - 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_composite_device( - us->pusb_dev, us->pusb_intf); - US_DEBUGP("usb_reset_composite_device returns %d\n", + 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); + } 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); } - 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 b130e170b..31ca92056 100644 --- a/drivers/usb/storage/unusual_devs.h +++ b/drivers/usb/storage/unusual_devs.h @@ -31,6 +31,7 @@ * 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. @@ -61,13 +62,6 @@ UNUSUAL_DEV( 0x03ee, 0x6901, 0x0000, 0x0100, US_SC_DEVICE, US_PR_DEVICE, NULL, US_FL_SINGLE_LUN ), -/* Reported by Rodolfo Quesada */ -UNUSUAL_DEV( 0x03ee, 0x6906, 0x0003, 0x0003, - "VIA Technologies Inc.", - "Mitsumi multi cardreader", - US_SC_DEVICE, US_PR_DEVICE, NULL, - US_FL_IGNORE_RESIDUE ), - UNUSUAL_DEV( 0x03f0, 0x0107, 0x0200, 0x0200, "HP", "CD-Writer+", @@ -77,12 +71,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_cd, 0), + US_SC_8070, US_PR_USBAT, init_usbat, 0), UNUSUAL_DEV( 0x03f0, 0x0307, 0x0001, 0x0001, "HP", "CD-Writer+ CD-4e", - US_SC_8070, US_PR_USBAT, init_usbat_cd, 0), + US_SC_8070, US_PR_USBAT, init_usbat, 0), #endif /* Reported by Sebastian Kapfer @@ -112,19 +106,6 @@ 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 ), - /* Reported by Christian Leber */ UNUSUAL_DEV( 0x0419, 0xaaf5, 0x0100, 0x0100, "TrekStor", @@ -139,42 +120,6 @@ UNUSUAL_DEV( 0x0419, 0xaaf6, 0x0100, 0x0100, US_SC_DEVICE, US_PR_DEVICE, NULL, US_FL_IGNORE_RESIDUE ), -/* Reported by Pete Zaitcev , bz#176584 */ -UNUSUAL_DEV( 0x0420, 0x0001, 0x0100, 0x0100, - "GENERIC", "MP3 PLAYER", /* MyMusix PD-205 on the outside. */ - 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", @@ -241,6 +186,16 @@ 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, @@ -248,14 +203,6 @@ 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", @@ -263,12 +210,13 @@ UNUSUAL_DEV( 0x04b0, 0x0405, 0x0100, 0x0100, US_SC_DEVICE, US_PR_DEVICE, NULL, US_FL_FIX_CAPACITY), -/* Reported by Jamie Kitson */ -UNUSUAL_DEV( 0x04b0, 0x040d, 0x0100, 0x0100, +/* Patch for Nikon coolpix 2000 + * Submitted by Fabien Cosse */ +UNUSUAL_DEV( 0x04b0, 0x0301, 0x0010, 0x0010, "NIKON", - "NIKON DSC D70s", - US_SC_DEVICE, US_PR_DEVICE, NULL, - US_FL_FIX_CAPACITY), + "NIKON DSC E2000", + US_SC_DEVICE, US_PR_DEVICE,NULL, + US_FL_NOT_LOCKABLE ), /* BENQ DC5330 * Reported by Manuel Fombuena and @@ -432,7 +380,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_flash, + US_SC_SCSI, US_PR_USBAT, init_usbat, US_FL_SINGLE_LUN), #endif @@ -450,7 +398,7 @@ UNUSUAL_DEV( 0x050d, 0x0115, 0x0133, 0x0133, UNUSUAL_DEV( 0x0525, 0xa140, 0x0100, 0x0100, "Iomega", "USB Clik! 40", - US_SC_8070, US_PR_DEVICE, NULL, + US_SC_8070, US_PR_BULK, NULL, US_FL_FIX_INQUIRY ), /* Yakumo Mega Image 37 @@ -498,11 +446,10 @@ 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 ), -/* Submitted by Lars Jacob - * This entry is needed because the device reports Sub=ff */ -UNUSUAL_DEV( 0x054c, 0x0010, 0x0500, 0x0610, +/* This entry is needed because the device reports Sub=ff */ +UNUSUAL_DEV( 0x054c, 0x0010, 0x0500, 0x0600, "Sony", - "DSC-T1/T5/H5", + "DSC-T1/T5", US_SC_8070, US_PR_DEVICE, NULL, US_FL_SINGLE_LUN ), @@ -589,13 +536,6 @@ 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", @@ -631,6 +571,18 @@ 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. @@ -729,22 +681,18 @@ 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_MAX_SECTORS_64 ), + US_FL_GO_SLOW ), 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_MAX_SECTORS_64 ), + US_FL_GO_SLOW ), /* Reported by Hanno Boeck * Taken from the Lycoris Kernel */ @@ -812,31 +760,17 @@ UNUSUAL_DEV( 0x069b, 0x3004, 0x0001, 0x0001, US_SC_DEVICE, US_PR_DEVICE, NULL, US_FL_FIX_CAPACITY ), -/* Reported by Olivier Blondeau */ -UNUSUAL_DEV( 0x0727, 0x0306, 0x0100, 0x0100, - "ATMEL", - "SND1 Storage", - US_SC_DEVICE, US_PR_DEVICE, NULL, - US_FL_IGNORE_RESIDUE), - -/* Submitted by Roman Hodek */ -UNUSUAL_DEV( 0x0781, 0x0001, 0x0200, 0x0200, +UNUSUAL_DEV( 0x0781, 0x0001, 0x0200, 0x0200, "Sandisk", "ImageMate SDDR-05a", US_SC_SCSI, US_PR_CB, NULL, US_FL_SINGLE_LUN ), -UNUSUAL_DEV( 0x0781, 0x0002, 0x0009, 0x0009, - "SanDisk Corporation", - "ImageMate CompactFlash USB", - US_SC_DEVICE, US_PR_DEVICE, NULL, - US_FL_FIX_CAPACITY ), - #ifdef CONFIG_USB_STORAGE_USBAT UNUSUAL_DEV( 0x0781, 0x0005, 0x0005, 0x0005, "Sandisk", "ImageMate SDDR-05b", - US_SC_SCSI, US_PR_USBAT, init_usbat_flash, + US_SC_SCSI, US_PR_USBAT, init_usbat, US_FL_SINGLE_LUN ), #endif @@ -1098,15 +1032,7 @@ 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", @@ -1147,16 +1073,6 @@ UNUSUAL_DEV( 0x0c0b, 0xa109, 0x0000, 0xffff, 0), #endif -/* - * Pete Zaitcev , bz#164688. - * The device blatantly ignores LUN and returns 1 in GetMaxLUN. - */ -UNUSUAL_DEV( 0x0c45, 0x1060, 0x0100, 0x0100, - "Unknown", - "Unknown", - US_SC_DEVICE, US_PR_DEVICE, NULL, - US_FL_SINGLE_LUN ), - /* Submitted by Joris Struyve */ UNUSUAL_DEV( 0x0d96, 0x410a, 0x0001, 0xffff, "Medion", @@ -1229,24 +1145,6 @@ 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", @@ -1254,18 +1152,11 @@ 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, 0x0110, 0x0110, +UNUSUAL_DEV( 0x1019, 0x0c55, 0x0000, 0x9999, "Desknote", "UCR-61S2B", US_SC_DEVICE, US_PR_DEVICE, usb_stor_ucr61s2b_init, @@ -1285,15 +1176,6 @@ 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 8d7bdcb59..dbcf23980 100644 --- a/drivers/usb/storage/usb.c +++ b/drivers/usb/storage/usb.c @@ -47,6 +47,7 @@ * 675 Mass Ave, Cambridge, MA 02139, USA. */ +#include #include #include #include @@ -54,8 +55,6 @@ #include #include #include -#include -#include #include #include @@ -189,7 +188,7 @@ static int storage_suspend(struct usb_interface *iface, pm_message_t message) struct us_data *us = usb_get_intfdata(iface); /* Wait until no command is running */ - mutex_lock(&us->dev_mutex); + down(&us->dev_semaphore); US_DEBUGP("%s\n", __FUNCTION__); if (us->suspend_resume_hook) @@ -199,7 +198,7 @@ static int storage_suspend(struct usb_interface *iface, pm_message_t message) /* When runtime PM is working, we'll set a flag to indicate * whether we should autoresume when a SCSI request arrives. */ - mutex_unlock(&us->dev_mutex); + up(&us->dev_semaphore); return 0; } @@ -207,50 +206,19 @@ static int storage_resume(struct usb_interface *iface) { struct us_data *us = usb_get_intfdata(iface); - mutex_lock(&us->dev_mutex); + down(&us->dev_semaphore); US_DEBUGP("%s\n", __FUNCTION__); if (us->suspend_resume_hook) (us->suspend_resume_hook)(us, US_RESUME); iface->dev.power.power_state.event = PM_EVENT_ON; - mutex_unlock(&us->dev_mutex); + up(&us->dev_semaphore); return 0; } #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, @@ -308,12 +276,12 @@ static int usb_stor_control_thread(void * __us) US_DEBUGP("*** thread awakened.\n"); /* lock the device pointers */ - mutex_lock(&(us->dev_mutex)); + down(&(us->dev_semaphore)); /* if the device has disconnected, we are free to exit */ if (test_bit(US_FLIDX_DISCONNECTING, &us->flags)) { US_DEBUGP("-- exiting\n"); - mutex_unlock(&us->dev_mutex); + up(&(us->dev_semaphore)); break; } @@ -374,12 +342,8 @@ 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 */ - else if (us->srb->result != DID_ABORT << 16) { + 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); @@ -406,7 +370,7 @@ SkipForAbort: scsi_unlock(host); /* unlock the device pointers */ - mutex_unlock(&us->dev_mutex); + up(&(us->dev_semaphore)); } /* for (;;) */ scsi_host_put(host); @@ -483,7 +447,7 @@ static struct us_unusual_dev *find_unusual(const struct usb_device_id *id) } /* Get the unusual_devs entries and the string descriptors */ -static int get_device_info(struct us_data *us, const struct usb_device_id *id) +static void get_device_info(struct us_data *us, const struct usb_device_id *id) { struct usb_device *dev = us->pusb_dev; struct usb_interface_descriptor *idesc = @@ -500,11 +464,6 @@ static int 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 @@ -534,8 +493,7 @@ static int 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 (kernel" - " %s)\n" + " has %s in unusual_devs.h\n" " Please send a copy of this message to " "\n", le16_to_cpu(ddesc->idVendor), @@ -543,11 +501,8 @@ static int get_device_info(struct us_data *us, const struct usb_device_id *id) le16_to_cpu(ddesc->bcdDevice), idesc->bInterfaceSubClass, idesc->bInterfaceProtocol, - msgs[msg], - UTS_RELEASE); + msgs[msg]); } - - return 0; } /* Get the transport settings */ @@ -637,15 +592,6 @@ static int get_transport(struct us_data *us) break; #endif -#ifdef CONFIG_USB_STORAGE_ALAUDA - case US_PR_ALAUDA: - us->transport_name = "Alauda Control/Bulk"; - us->transport = alauda_transport; - us->transport_reset = usb_stor_Bulk_reset; - us->max_lun = 1; - break; -#endif - default: return -EIO; } @@ -701,6 +647,15 @@ static int get_protocol(struct us_data *us) break; #endif +#ifdef CONFIG_USB_STORAGE_ALAUDA + case US_PR_ALAUDA: + us->transport_name = "Alauda Control/Bulk"; + us->transport = alauda_transport; + us->transport_reset = usb_stor_Bulk_reset; + us->max_lun = 1; + break; +#endif + default: return -EIO; } @@ -850,34 +805,32 @@ 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 */ + down(&us->dev_semaphore); + up(&us->dev_semaphore); + /* 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(host); + scsi_lock(us_to_host(us)); us->srb->scsi_done(us->srb); us->srb = NULL; - scsi_unlock(host); + scsi_unlock(us_to_host(us)); } - mutex_unlock(&us->dev_mutex); /* Now we own no commands so it's safe to remove the SCSI host */ - scsi_remove_host(host); + scsi_remove_host(us_to_host(us)); } /* Second stage of disconnect processing: deallocate all resources */ @@ -917,9 +870,9 @@ retry: /* For bulk-only devices, determine the max LUN value */ if (us->protocol == US_PR_BULK && !(us->flags & US_FL_SINGLE_LUN)) { - mutex_lock(&us->dev_mutex); + down(&us->dev_semaphore); us->max_lun = usb_stor_Bulk_max_lun(us); - mutex_unlock(&us->dev_mutex); + up(&us->dev_semaphore); } scsi_scan_host(us_to_host(us)); printk(KERN_DEBUG "usb-storage: device scan complete\n"); @@ -959,7 +912,7 @@ static int storage_probe(struct usb_interface *intf, us = host_to_us(host); memset(us, 0, sizeof(struct us_data)); - mutex_init(&(us->dev_mutex)); + init_MUTEX(&(us->dev_semaphore)); init_MUTEX_LOCKED(&(us->sema)); init_completion(&(us->notify)); init_waitqueue_head(&us->delay_wait); @@ -976,9 +929,7 @@ static int storage_probe(struct usb_interface *intf, * of the match from the usb_device_id table, so we can find the * corresponding entry in the private table. */ - result = get_device_info(us, id); - if (result) - goto BadDevice; + get_device_info(us, id); /* Get the transport, protocol, and pipe settings */ result = get_transport(us); @@ -1050,8 +1001,6 @@ 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 21f3ddbc9..7259fd1f6 100644 --- a/drivers/usb/storage/usb.h +++ b/drivers/usb/storage/usb.h @@ -49,7 +49,6 @@ #include #include #include -#include #include struct us_data; @@ -104,9 +103,9 @@ typedef void (*pm_hook)(struct us_data *, int); /* power management hook */ struct us_data { /* The device we're working with * It's important to note: - * (o) you must hold dev_mutex to change pusb_dev + * (o) you must hold dev_semaphore to change pusb_dev */ - struct mutex dev_mutex; /* protect pusb_dev */ + struct semaphore dev_semaphore; /* protect pusb_dev */ struct usb_device *pusb_dev; /* this usb_device */ struct usb_interface *pusb_intf; /* this interface */ struct us_unusual_dev *unusual_dev; /* device-filter entry */ @@ -160,10 +159,10 @@ struct us_data { }; /* Convert between us_data and the corresponding Scsi_Host */ -static inline struct Scsi_Host *us_to_host(struct us_data *us) { +static struct Scsi_Host inline *us_to_host(struct us_data *us) { return container_of((void *) us, struct Scsi_Host, hostdata); } -static inline struct us_data *host_to_us(struct Scsi_Host *host) { +static struct us_data inline *host_to_us(struct Scsi_Host *host) { return (struct us_data *) host->hostdata; } @@ -176,4 +175,8 @@ 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 b36203979..4de9fb56e 100644 --- a/drivers/usb/usb-skeleton.c +++ b/drivers/usb/usb-skeleton.c @@ -13,6 +13,7 @@ * */ +#include #include #include #include diff --git a/drivers/video/68328fb.c b/drivers/video/68328fb.c index 0dda73da8..78488bb41 100644 --- a/drivers/video/68328fb.c +++ b/drivers/video/68328fb.c @@ -32,6 +32,7 @@ #include #include #include +#include #include #include #include diff --git a/drivers/video/Kconfig b/drivers/video/Kconfig index 702eb933c..f5079c78b 100644 --- a/drivers/video/Kconfig +++ b/drivers/video/Kconfig @@ -4,21 +4,6 @@ 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--- @@ -85,13 +70,6 @@ config FB_MACMODES depends on FB default n -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" depends on FB @@ -173,69 +151,6 @@ 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) @@ -422,7 +337,7 @@ config FB_OF config FB_CONTROL bool "Apple \"control\" display support" - depends on (FB = y) && PPC_PMAC && PPC32 + depends on (FB = y) && PPC_PMAC select FB_CFB_FILLRECT select FB_CFB_COPYAREA select FB_CFB_IMAGEBLIT @@ -433,7 +348,7 @@ config FB_CONTROL config FB_PLATINUM bool "Apple \"platinum\" display support" - depends on (FB = y) && PPC_PMAC && PPC32 + depends on (FB = y) && PPC_PMAC select FB_CFB_FILLRECT select FB_CFB_COPYAREA select FB_CFB_IMAGEBLIT @@ -444,7 +359,7 @@ config FB_PLATINUM config FB_VALKYRIE bool "Apple \"valkyrie\" display support" - depends on (FB = y) && (MAC || (PPC_PMAC && PPC32)) + depends on (FB = y) && (MAC || PPC_PMAC) select FB_CFB_FILLRECT select FB_CFB_COPYAREA select FB_CFB_IMAGEBLIT @@ -455,7 +370,7 @@ config FB_VALKYRIE config FB_CT65550 bool "Chips 65550 display support" - depends on (FB = y) && PPC32 + depends on (FB = y) && PPC select FB_CFB_FILLRECT select FB_CFB_COPYAREA select FB_CFB_IMAGEBLIT @@ -469,8 +384,6 @@ config FB_ASILIANT select FB_CFB_FILLRECT select FB_CFB_COPYAREA select FB_CFB_IMAGEBLIT - help - This is the frame buffer device driver for the Asiliant 69030 chipset config FB_IMSTT bool "IMS Twin Turbo display support" @@ -552,14 +465,10 @@ config FB_VESA You will get a boot time penguin logo at no additional cost. Please read . If unsure, say 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 VIDEO_SELECT + bool + depends on FB_VESA + default y config FB_HGA tristate "Hercules mono graphics support" @@ -583,6 +492,12 @@ config FB_HGA_ACCEL This will compile the Hercules mono graphics with acceleration functions. + +config VIDEO_SELECT + bool + depends on (FB = y) && X86 + default y + config FB_SGIVW tristate "SGI Visual Workstation framebuffer support" depends on FB && X86_VISWS @@ -721,14 +636,6 @@ 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 @@ -767,14 +674,6 @@ 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 @@ -826,7 +725,7 @@ config FB_I810_I2C config FB_INTEL tristate "Intel 830M/845G/852GM/855GM/865G support (EXPERIMENTAL)" - depends on FB && EXPERIMENTAL && PCI && X86 + depends on FB && EXPERIMENTAL && PCI && X86_32 select AGP select AGP_INTEL select FB_MODE_HELPERS @@ -989,6 +888,20 @@ config FB_MATROX_MULTIHEAD There is no need for enabling 'Matrox multihead support' if you have only one Matrox card in the box. +config FB_RADEON_OLD + tristate "ATI Radeon display support (Old driver)" + depends on FB && PCI + select FB_CFB_FILLRECT + select FB_CFB_COPYAREA + select FB_CFB_IMAGEBLIT + select FB_MACMODES if PPC + help + Choose this option if you want to use an ATI Radeon graphics card as + a framebuffer device. There are both PCI and AGP versions. You + don't need to choose this to run the Radeon in plain VGA mode. + There is a product page at + . + config FB_RADEON tristate "ATI Radeon display support" depends on FB && PCI @@ -1013,7 +926,6 @@ 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 @@ -1021,14 +933,6 @@ 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 @@ -1053,17 +957,9 @@ 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 + depends on FB select FB_CFB_FILLRECT select FB_CFB_COPYAREA select FB_CFB_IMAGEBLIT @@ -1103,14 +999,6 @@ 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 @@ -1316,17 +1204,6 @@ config FB_AU1100 bool "Au1100 LCD Driver" depends on (FB = y) && EXPERIMENTAL && PCI && MIPS && MIPS_PB1100=y -config FB_AU1200 - bool "Au1200 LCD Driver" - depends on FB && MIPS && SOC_AU1200 - select FB_CFB_FILLRECT - select FB_CFB_COPYAREA - select FB_CFB_IMAGEBLIT - help - This is the framebuffer driver for the AMD Au1200 SOC. It can drive - various panels and CRTs by passing in kernel cmd line option - au1200fb:panel=. - source "drivers/video/geode/Kconfig" config FB_FFB @@ -1510,26 +1387,6 @@ 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 @@ -1569,21 +1426,6 @@ 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 @@ -1612,7 +1454,7 @@ if FB || SGI_NEWPORT_CONSOLE source "drivers/video/logo/Kconfig" endif -if SYSFS +if FB && SYSFS source "drivers/video/backlight/Kconfig" endif diff --git a/drivers/video/Makefile b/drivers/video/Makefile index 481c6c969..aa434e725 100644 --- a/drivers/video/Makefile +++ b/drivers/video/Makefile @@ -4,16 +4,15 @@ # Each configuration option enables a list of files. -obj-y += fb_notify.o +obj-$(CONFIG_VT) += console/ +obj-$(CONFIG_LOGO) += logo/ +obj-$(CONFIG_SYSFS) += backlight/ + 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 @@ -39,8 +38,8 @@ 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_RADEON_OLD) += radeonfb.o obj-$(CONFIG_FB_NEOMAGIC) += neofb.o vgastate.o obj-$(CONFIG_FB_VIRGE) += virgefb.o obj-$(CONFIG_FB_3DFX) += tdfxfb.o @@ -87,7 +86,6 @@ obj-$(CONFIG_FB_ASILIANT) += asiliantfb.o obj-$(CONFIG_FB_PXA) += pxafb.o obj-$(CONFIG_FB_W100) += w100fb.o obj-$(CONFIG_FB_AU1100) += au1100fb.o -obj-$(CONFIG_FB_AU1200) += au1200fb.o obj-$(CONFIG_FB_PMAG_AA) += pmag-aa-fb.o obj-$(CONFIG_FB_PMAG_BA) += pmag-ba-fb.o obj-$(CONFIG_FB_PMAGB_B) += pmagb-b-fb.o @@ -96,12 +94,9 @@ 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 afd146f5f..455fda990 100644 --- a/drivers/video/S3triofb.c +++ b/drivers/video/S3triofb.c @@ -23,11 +23,13 @@ */ +#include #include #include #include #include #include +#include #include #include #include diff --git a/drivers/video/acornfb.c b/drivers/video/acornfb.c index 61a8bf159..b05827352 100644 --- a/drivers/video/acornfb.c +++ b/drivers/video/acornfb.c @@ -17,6 +17,7 @@ * - Blanking 8bpp displays with VIDC */ +#include #include #include #include @@ -1268,7 +1269,7 @@ free_unused_pages(unsigned int virtual_start, unsigned int virtual_end) */ page = virt_to_page(virtual_start); ClearPageReserved(page); - init_page_count(page); + set_page_count(page, 1); free_page(virtual_start); virtual_start += PAGE_SIZE; @@ -1307,7 +1308,7 @@ static int __init acornfb_probe(struct platform_device *dev) /* * Try to select a suitable default mode */ - for (i = 0; i < ARRAY_SIZE(modedb); i++) { + for (i = 0; i < sizeof(modedb) / sizeof(*modedb); i++) { unsigned long hs; hs = modedb[i].refresh * @@ -1379,7 +1380,7 @@ static int __init acornfb_probe(struct platform_device *dev) */ free_unused_pages(PAGE_OFFSET + size, PAGE_OFFSET + MAX_SIZE); #endif - + fb_info.fix.smem_len = size; current_par.palette_size = VIDC_PALETTE_SIZE; @@ -1390,7 +1391,7 @@ static int __init acornfb_probe(struct platform_device *dev) */ do { rc = fb_find_mode(&fb_info.var, &fb_info, NULL, modedb, - ARRAY_SIZE(modedb), + sizeof(modedb) / sizeof(*modedb), &acornfb_default_mode, DEFAULT_BPP); /* * If we found an exact match, all ok. @@ -1407,7 +1408,7 @@ static int __init acornfb_probe(struct platform_device *dev) break; rc = fb_find_mode(&fb_info.var, &fb_info, NULL, modedb, - ARRAY_SIZE(modedb), + sizeof(modedb) / sizeof(*modedb), &acornfb_default_mode, DEFAULT_BPP); if (rc) break; diff --git a/drivers/video/amifb.c b/drivers/video/amifb.c index f1ba54f4f..3033c72de 100644 --- a/drivers/video/amifb.c +++ b/drivers/video/amifb.c @@ -45,8 +45,10 @@ #include #include #include +#include #include #include +#include #include #include #include diff --git a/drivers/video/arcfb.c b/drivers/video/arcfb.c index 70dd8115a..466042808 100644 --- a/drivers/video/arcfb.c +++ b/drivers/video/arcfb.c @@ -39,6 +39,7 @@ #include #include #include +#include #include #include #include @@ -560,7 +561,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, IRQF_SHARED, + if (request_irq(par->irq, &arcfb_interrupt, SA_SHIRQ, "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 1fd22f460..c924d81f7 100644 --- a/drivers/video/asiliantfb.c +++ b/drivers/video/asiliantfb.c @@ -29,11 +29,13 @@ * more details. */ +#include #include #include #include #include #include +#include #include #include #include @@ -351,6 +353,8 @@ 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 */ @@ -456,22 +460,22 @@ static void __devinit chips_hw_init(struct fb_info *p) { int i; - for (i = 0; i < ARRAY_SIZE(chips_init_xr); ++i) + for (i = 0; i < N_ELTS(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 < ARRAY_SIZE(chips_init_sr); ++i) + for (i = 0; i < N_ELTS(chips_init_sr); ++i) write_sr(chips_init_sr[i].addr, chips_init_sr[i].data); - for (i = 0; i < ARRAY_SIZE(chips_init_gr); ++i) + for (i = 0; i < N_ELTS(chips_init_gr); ++i) write_gr(chips_init_gr[i].addr, chips_init_gr[i].data); - for (i = 0; i < ARRAY_SIZE(chips_init_ar); ++i) + for (i = 0; i < N_ELTS(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 < ARRAY_SIZE(chips_init_cr); ++i) + for (i = 0; i < N_ELTS(chips_init_cr); ++i) write_cr(chips_init_cr[i].addr, chips_init_cr[i].data); - for (i = 0; i < ARRAY_SIZE(chips_init_fr); ++i) + for (i = 0; i < N_ELTS(chips_init_fr); ++i) write_fr(chips_init_fr[i].addr, chips_init_fr[i].data); } diff --git a/drivers/video/atafb.c b/drivers/video/atafb.c index 5831893bf..e69ab65f7 100644 --- a/drivers/video/atafb.c +++ b/drivers/video/atafb.c @@ -53,6 +53,7 @@ #include #include #include +#include #include #include #include diff --git a/drivers/video/aty/Makefile b/drivers/video/aty/Makefile index a6cc0e9ec..18521397a 100644 --- a/drivers/video/aty/Makefile +++ b/drivers/video/aty/Makefile @@ -10,6 +10,5 @@ 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 276a21530..620c9a934 100644 --- a/drivers/video/aty/aty128fb.c +++ b/drivers/video/aty/aty128fb.c @@ -46,12 +46,14 @@ */ +#include #include #include #include #include #include #include +#include #include #include #include @@ -62,11 +64,9 @@ #include #include #include -#include #include #ifdef CONFIG_PPC_PMAC -#include #include #include #include @@ -98,7 +98,7 @@ #ifndef CONFIG_PPC_PMAC /* default mode */ -static struct fb_var_screeninfo default_var __devinitdata = { +static struct fb_var_screeninfo default_var __initdata = { /* 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}, @@ -121,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 __devinitdata = { +static struct fb_videomode defaultmode __initdata = { .refresh = 60, .xres = 640, .yres = 480, @@ -333,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 __devinitdata = { +static struct fb_fix_screeninfo aty128fb_fix __initdata = { .id = "ATY Rage128", .type = FB_TYPE_PACKED_PIXELS, .visual = FB_VISUAL_PSEUDOCOLOR, @@ -343,15 +343,15 @@ static struct fb_fix_screeninfo aty128fb_fix __devinitdata = { .accel = FB_ACCEL_ATI_RAGE128, }; -static char *mode_option __devinitdata = NULL; +static char *mode_option __initdata = NULL; #ifdef CONFIG_PPC_PMAC -static int default_vmode __devinitdata = VMODE_1024_768_60; -static int default_cmode __devinitdata = CMODE_8; +static int default_vmode __initdata = VMODE_1024_768_60; +static int default_cmode __initdata = CMODE_8; #endif -static int default_crt_on __devinitdata = 0; -static int default_lcd_on __devinitdata = 1; +static int default_crt_on __initdata = 0; +static int default_lcd_on __initdata = 1; #ifdef CONFIG_MTRR static int mtrr = 1; @@ -443,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 __devinit aty128_get_pllinfo(struct aty128fb_par *par, +static void __init aty128_get_pllinfo(struct aty128fb_par *par, void __iomem *bios); -static void __devinit __iomem *aty128_map_ROM(struct pci_dev *pdev, const struct aty128fb_par *par); +static void __init __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); @@ -456,10 +456,6 @@ 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)) @@ -483,6 +479,16 @@ 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 @@ -575,7 +581,7 @@ static void aty_pll_writeupdate(const struct aty128fb_par *par) /* write to the scratch register to test r/w functionality */ -static int __devinit register_test(const struct aty128fb_par *par) +static int __init register_test(const struct aty128fb_par *par) { u32 val; int flag = 0; @@ -774,7 +780,7 @@ static u32 depth_to_dst(u32 depth) #ifndef __sparc__ -static void __iomem * __devinit aty128_map_ROM(const struct aty128fb_par *par, struct pci_dev *dev) +static void __iomem * __init aty128_map_ROM(const struct aty128fb_par *par, struct pci_dev *dev) { u16 dptr; u8 rom_type; @@ -858,7 +864,7 @@ static void __iomem * __devinit aty128_map_ROM(const struct aty128fb_par *par, s return NULL; } -static void __devinit aty128_get_pllinfo(struct aty128fb_par *par, unsigned char __iomem *bios) +static void __init aty128_get_pllinfo(struct aty128fb_par *par, unsigned char __iomem *bios) { unsigned int bios_hdr; unsigned int bios_pll; @@ -905,7 +911,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 __devinit aty128_timings(struct aty128fb_par *par) +static void __init aty128_timings(struct aty128fb_par *par) { #ifdef CONFIG_PPC_OF /* instead of a table lookup, assume OF has properly @@ -1251,21 +1257,19 @@ 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_FB_ATY128_BACKLIGHT - aty128_bl_set_power(info, FB_BLANK_UNBLANK); +#ifdef CONFIG_PMAC_BACKLIGHT + aty128_set_backlight_enable(get_backlight_enable(), + get_backlight_level(), par); #endif } else { -#ifdef CONFIG_FB_ATY128_BACKLIGHT - aty128_bl_set_power(info, FB_BLANK_POWERDOWN); +#ifdef CONFIG_PMAC_BACKLIGHT + aty128_set_backlight_enable(0, 0, par); #endif reg = aty_ld_le32(LVDS_GEN_CNTL); reg |= LVDS_DISPLAY_DIS; @@ -1633,7 +1637,7 @@ static int aty128fb_sync(struct fb_info *info) } #ifndef MODULE -static int __devinit aty128fb_setup(char *options) +static int __init aty128fb_setup(char *options) { char *this_opt; @@ -1686,211 +1690,6 @@ static int __devinit 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 @@ -1908,7 +1707,7 @@ static void aty128_early_resume(void *data) } #endif /* CONFIG_PPC_PMAC */ -static int __devinit aty128_init(struct pci_dev *pdev, const struct pci_device_id *ent) +static int __init 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; @@ -1917,15 +1716,18 @@ static int __devinit aty128_init(struct pci_dev *pdev, const struct pci_device_i 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; strcpy(video_card, "Rage128 XX "); video_card[8] = ent->device >> 8; video_card[9] = ent->device & 0xFF; - + /* range check to make sure */ - if (ent->driver_data < ARRAY_SIZE(r128_family)) + if (ent->driver_data < (sizeof(r128_family)/sizeof(char *))) strncat(video_card, r128_family[ent->driver_data], sizeof(video_card)); printk(KERN_INFO "aty128fb: %s [chip rev 0x%x] ", video_card, chip_rev); @@ -1946,7 +1748,7 @@ static int __devinit aty128_init(struct pci_dev *pdev, const struct pci_device_i var = default_var; #ifdef CONFIG_PPC_PMAC - if (machine_is(powermac)) { + if (_machine == _MACH_Pmac) { /* Indicate sleep capability */ if (par->chip_gen == rage_M3) { pmac_call_feature(PMAC_FTR_DEVICE_CAN_WAKE, NULL, 0, 1); @@ -2029,18 +1831,20 @@ static int __devinit aty128_init(struct pci_dev *pdev, const struct pci_device_i 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); @@ -2049,7 +1853,7 @@ static int __devinit aty128_init(struct pci_dev *pdev, const struct pci_device_i #ifdef CONFIG_PCI /* register a card ++ajoshi */ -static int __devinit aty128_probe(struct pci_dev *pdev, const struct pci_device_id *ent) +static int __init aty128_probe(struct pci_dev *pdev, const struct pci_device_id *ent) { unsigned long fb_addr, reg_addr; struct aty128fb_par *par; @@ -2090,6 +1894,7 @@ static int __devinit aty128_probe(struct pci_dev *pdev, const struct pci_device_ par = info->par; info->pseudo_palette = par->pseudo_palette; + info->fix = aty128fb_fix; /* Virtualize mmio region */ info->fix.mmio_start = reg_addr; @@ -2175,10 +1980,6 @@ 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) @@ -2209,10 +2010,10 @@ static int aty128fb_blank(int blank, struct fb_info *fb) if (par->lock_blank || par->asleep) return 0; -#ifdef CONFIG_FB_ATY128_BACKLIGHT - if (machine_is(powermac) && blank) - aty128_bl_set_power(fb, FB_BLANK_POWERDOWN); -#endif +#ifdef CONFIG_PMAC_BACKLIGHT + if ((_machine == _MACH_Pmac) && blank) + set_backlight_enable(0); +#endif /* CONFIG_PMAC_BACKLIGHT */ if (blank & FB_BLANK_VSYNC_SUSPEND) state |= 2; @@ -2227,12 +2028,10 @@ 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_FB_ATY128_BACKLIGHT - if (machine_is(powermac) && !blank) - aty128_bl_set_power(fb, FB_BLANK_UNBLANK); -#endif - +#ifdef CONFIG_PMAC_BACKLIGHT + if ((_machine == _MACH_Pmac) && !blank) + set_backlight_enable(1); +#endif /* CONFIG_PMAC_BACKLIGHT */ return 0; } @@ -2338,6 +2137,73 @@ 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 @@ -2561,7 +2427,7 @@ static int aty128_pci_resume(struct pci_dev *pdev) } -static int __devinit aty128fb_init(void) +static int __init aty128fb_init(void) { #ifndef MODULE char *option = NULL; diff --git a/drivers/video/aty/atyfb.h b/drivers/video/aty/atyfb.h index 55fb8b044..e9b7a64c1 100644 --- a/drivers/video/aty/atyfb.h +++ b/drivers/video/aty/atyfb.h @@ -2,6 +2,7 @@ * ATI Frame Buffer Device Driver Core Definitions */ +#include #include #include /* @@ -150,7 +151,6 @@ 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 19a71f045..485be386a 100644 --- a/drivers/video/aty/atyfb_base.c +++ b/drivers/video/aty/atyfb_base.c @@ -49,6 +49,7 @@ ******************************************************************************/ +#include #include #include #include @@ -65,7 +66,6 @@ #include #include #include -#include #include #include @@ -75,7 +75,6 @@ #include "ati_ids.h" #ifdef __powerpc__ -#include #include #include "../macmodes.h" #endif @@ -315,12 +314,12 @@ static int vram; static int pll; static int mclk; static int xclk; -static int comp_sync __devinitdata = -1; +static int comp_sync __initdata = -1; static char *mode; #ifdef CONFIG_PPC -static int default_vmode __devinitdata = VMODE_CHOOSE; -static int default_cmode __devinitdata = CMODE_CHOOSE; +static int default_vmode __initdata = VMODE_CHOOSE; +static int default_cmode __initdata = CMODE_CHOOSE; module_param_named(vmode, default_vmode, int, 0); MODULE_PARM_DESC(vmode, "int: video mode for mac"); @@ -329,10 +328,10 @@ MODULE_PARM_DESC(cmode, "int: color mode for mac"); #endif #ifdef CONFIG_ATARI -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, }; +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, }; #endif /* top -> down is an evolution of mach64 chipset, any corrections? */ @@ -435,7 +434,7 @@ static int __devinit correct_chipset(struct atyfb_par *par) const char *name; int i; - for (i = ARRAY_SIZE(aty_chips) - 1; i >= 0; i--) + for (i = sizeof(aty_chips) / sizeof(*aty_chips) - 1; i >= 0; i--) if (par->pci_id == aty_chips[i].pci_id) break; @@ -582,7 +581,7 @@ static u32 atyfb_get_pixclock(struct fb_var_screeninfo *var, struct atyfb_par *p * Apple monitor sense */ -static int __devinit read_aty_sense(const struct atyfb_par *par) +static int __init read_aty_sense(const struct atyfb_par *par) { int sense, i; @@ -1280,14 +1279,6 @@ 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); @@ -1567,7 +1558,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, IRQF_SHARED, "atyfb", par)) { + if (request_irq(par->irq, aty_irq, SA_SHIRQ, "atyfb", par)) { clear_bit(0, &par->irq_flags); return -EINVAL; } @@ -2123,171 +2114,47 @@ static int atyfb_pci_resume(struct pci_dev *pdev) #endif /* defined(CONFIG_PM) && defined(CONFIG_PCI) */ -/* Backlight */ -#ifdef CONFIG_FB_ATY_BACKLIGHT -#define MAX_LEVEL 0xFF - -static struct backlight_properties aty_bl_data; - -/* 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; +#ifdef CONFIG_PMAC_BACKLIGHT - if (atylevel < 0) - atylevel = 0; - else if (atylevel > MAX_LEVEL) - atylevel = MAX_LEVEL; + /* + * LCD backlight control + */ - return atylevel; -} +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_update_status(struct backlight_device *bd) +static int aty_set_backlight_enable(int on, int level, void *data) { - struct atyfb_par *par = class_get_devdata(&bd->class_dev); + struct fb_info *info = (struct fb_info *) data; + struct atyfb_par *par = (struct atyfb_par *) info->par; 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 (level > 0) { + if (on && level > BACKLIGHT_OFF) { reg &= ~BIAS_MOD_LEVEL_MASK; - reg |= (aty_bl_get_level_brightness(par, level) << BIAS_MOD_LEVEL_SHIFT); + reg |= (backlight_conv[level] << BIAS_MOD_LEVEL_SHIFT); } else { reg &= ~BIAS_MOD_LEVEL_MASK; - reg |= (aty_bl_get_level_brightness(par, 0) << BIAS_MOD_LEVEL_SHIFT); + reg |= (backlight_conv[0] << BIAS_MOD_LEVEL_SHIFT); } aty_st_lcd(LCD_MISC_CNTL, reg, par); - return 0; } -static int aty_bl_update_status(struct backlight_device *bd) -{ - 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 int aty_bl_get_brightness(struct backlight_device *bd) +static int aty_set_backlight_level(int level, void *data) { - return bd->props->brightness; + return aty_set_backlight_enable(1, level, data); } -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), +static struct backlight_controller aty_backlight_controller = { + aty_set_backlight_enable, + aty_set_backlight_level }; +#endif /* CONFIG_PMAC_BACKLIGHT */ -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) +static void __init aty_calc_mem_refresh(struct atyfb_par *par, int xclk) { const int ragepro_tbl[] = { 44, 50, 55, 66, 75, 80, 100 @@ -2301,10 +2168,10 @@ static void __devinit aty_calc_mem_refresh(struct atyfb_par *par, int xclk) if (IS_XL(par->pci_id) || IS_MOBILITY(par->pci_id)) { refresh_tbl = ragexl_tbl; - size = ARRAY_SIZE(ragexl_tbl); + size = sizeof(ragexl_tbl)/sizeof(int); } else { refresh_tbl = ragepro_tbl; - size = ARRAY_SIZE(ragepro_tbl); + size = sizeof(ragepro_tbl)/sizeof(int); } for (i=0; i < size; i++) { @@ -2347,7 +2214,7 @@ static int __devinit atyfb_get_timings_from_lcd(struct atyfb_par *par, } #endif /* defined(__i386__) && defined(CONFIG_FB_ATY_GENERIC_LCD) */ -static int __devinit aty_init(struct fb_info *info, const char *name) +static int __init aty_init(struct fb_info *info, const char *name) { struct atyfb_par *par = (struct atyfb_par *) info->par; const char *ramname = NULL, *xtal; @@ -2428,16 +2295,9 @@ static int __devinit 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; break; @@ -2447,7 +2307,9 @@ static int __devinit aty_init(struct fb_info *info, const char *name) case CLK_ATT20C408: par->pll_ops = &aty_pll_att20c408; break; -#endif + case CLK_IBMRGB514: + par->pll_ops = &aty_pll_ibm514; + break; default: PRINTKI("aty_init: CLK type not implemented yet!"); par->pll_ops = &aty_pll_unsupported; @@ -2641,28 +2503,20 @@ static int __devinit aty_init(struct fb_info *info, const char *name) info->fbops = &atyfb_ops; info->pseudo_palette = pseudo_palette; - info->flags = FBINFO_DEFAULT | - FBINFO_HWACCEL_IMAGEBLIT | - FBINFO_HWACCEL_FILLRECT | - FBINFO_HWACCEL_COPYAREA | - FBINFO_HWACCEL_YPAN; + info->flags = FBINFO_FLAG_DEFAULT; #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 -#endif - if (M64_HAS(MOBIL_BUS)) { -#ifdef CONFIG_FB_ATY_BACKLIGHT - aty_bl_init (par); -#endif - } + } else if (M64_HAS(MOBIL_BUS)) + register_backlight_controller(&aty_backlight_controller, info, "ati"); +#endif /* CONFIG_PMAC_BACKLIGHT */ memset(&var, 0, sizeof(var)); #ifdef CONFIG_PPC - if (machine_is(powermac)) { + if (_machine == _MACH_Pmac) { /* * FIXME: The NVRAM stuff should be put in a Mac-specific file, as it * applies to all Mac video cards @@ -2774,7 +2628,7 @@ aty_init_exit: } #ifdef CONFIG_ATARI -static int __devinit store_video_par(char *video_str, unsigned char m64_num) +static int __init store_video_par(char *video_str, unsigned char m64_num) { char *p; unsigned long vmembase, size, guiregbase; @@ -2816,9 +2670,9 @@ static int atyfb_blank(int blank, struct fb_info *info) if (par->lock_blank || par->asleep) return 0; -#ifdef CONFIG_FB_ATY_BACKLIGHT - if (machine_is(powermac) && blank > FB_BLANK_NORMAL) - aty_bl_set_power(info, FB_BLANK_POWERDOWN); +#ifdef CONFIG_PMAC_BACKLIGHT + if ((_machine == _MACH_Pmac) && blank > FB_BLANK_NORMAL) + set_backlight_enable(0); #elif defined(CONFIG_FB_ATY_GENERIC_LCD) if (par->lcd_table && blank > FB_BLANK_NORMAL && (aty_ld_lcd(LCD_GEN_CNTL, par) & LCD_ON)) { @@ -2848,9 +2702,9 @@ static int atyfb_blank(int blank, struct fb_info *info) } aty_st_le32(CRTC_GEN_CNTL, gen_cntl, par); -#ifdef CONFIG_FB_ATY_BACKLIGHT - if (machine_is(powermac) && blank <= FB_BLANK_NORMAL) - aty_bl_set_power(info, FB_BLANK_UNBLANK); +#ifdef CONFIG_PMAC_BACKLIGHT + if ((_machine == _MACH_Pmac) && blank <= FB_BLANK_NORMAL) + set_backlight_enable(1); #elif defined(CONFIG_FB_ATY_GENERIC_LCD) if (par->lcd_table && blank <= FB_BLANK_NORMAL && (aty_ld_lcd(LCD_GEN_CNTL, par) & LCD_ON)) { @@ -3109,7 +2963,7 @@ static int __devinit atyfb_setup_sparc(struct pci_dev *pdev, } pcp = pdev->sysdata; - if (node == pcp->prom_node->node) { + if (node == pcp->prom_node) { struct fb_var_screeninfo *var = &default_var; unsigned int N, P, Q, M, T, R; u32 v_total, h_total; @@ -3543,7 +3397,7 @@ static int __devinit atyfb_pci_probe(struct pci_dev *pdev, const struct pci_devi struct atyfb_par *par; int i, rc = -ENOMEM; - for (i = ARRAY_SIZE(aty_chips) - 1; i >= 0; i--) + for (i = sizeof(aty_chips) / sizeof(*aty_chips) - 1; i >= 0; i--) if (pdev->device == aty_chips[i].pci_id) break; @@ -3583,7 +3437,6 @@ 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__ @@ -3715,11 +3568,6 @@ 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 @@ -3789,7 +3637,7 @@ static struct pci_driver atyfb_driver = { #endif /* CONFIG_PCI */ #ifndef MODULE -static int __devinit atyfb_setup(char *options) +static int __init atyfb_setup(char *options) { char *this_opt; @@ -3861,7 +3709,7 @@ static int __devinit atyfb_setup(char *options) } #endif /* MODULE */ -static int __devinit atyfb_init(void) +static int __init atyfb_init(void) { #ifndef MODULE char *option = NULL; @@ -3871,9 +3719,7 @@ static int __devinit atyfb_init(void) atyfb_setup(option); #endif -#ifdef CONFIG_PCI pci_register_driver(&atyfb_driver); -#endif #ifdef CONFIG_ATARI atyfb_atari_probe(); #endif @@ -3882,9 +3728,7 @@ static int __devinit 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 1490e5e1c..c98f4a442 100644 --- a/drivers/video/aty/mach64_accel.c +++ b/drivers/video/aty/mach64_accel.c @@ -200,6 +200,8 @@ 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; } @@ -246,6 +248,8 @@ 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; } @@ -284,10 +288,14 @@ 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; @@ -417,6 +425,8 @@ 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 2a7f381c3..ad8b7496f 100644 --- a/drivers/video/aty/mach64_cursor.c +++ b/drivers/video/aty/mach64_cursor.c @@ -66,6 +66,11 @@ 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; @@ -125,13 +130,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] & 0xff) << 24) | - ((info->cmap.green[fg_idx] & 0xff) << 16) | - ((info->cmap.blue[fg_idx] & 0xff) << 8) | 0xff; + fg = (info->cmap.red[fg_idx] << 24) | + (info->cmap.green[fg_idx] << 16) | + (info->cmap.blue[fg_idx] << 8) | 15; - bg = ((info->cmap.red[bg_idx] & 0xff) << 24) | - ((info->cmap.green[bg_idx] & 0xff) << 16) | - ((info->cmap.blue[bg_idx] & 0xff) << 8); + bg = (info->cmap.red[bg_idx] << 24) | + (info->cmap.green[bg_idx] << 16) | + (info->cmap.blue[bg_idx] << 8); wait_for_fifo(2, par); aty_st_le32(CUR_CLR0, bg, par); @@ -161,17 +166,19 @@ 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_bits_lookup[(b ^ m) >> 4], dst++); + fb_writeb(cursor_mask_lookup[m >> 4 ] | + cursor_bits_lookup[(b ^ m) >> 4], dst++); // Lower 4 bits of mask - fb_writeb(cursor_bits_lookup[(b ^ m) & 0x0f], - dst++); + fb_writeb(cursor_mask_lookup[m & 0x0f ] | + cursor_bits_lookup[(b ^ m) & 0x0f], dst++); break; case ROP_COPY: // Upper 4 bits of mask data - fb_writeb(cursor_bits_lookup[(b & m) >> 4], dst++); + fb_writeb(cursor_mask_lookup[m >> 4 ] | + cursor_bits_lookup[(b & m) >> 4], dst++); // Lower 4 bits of mask - fb_writeb(cursor_bits_lookup[(b & m) & 0x0f], - dst++); + fb_writeb(cursor_mask_lookup[m & 0x0f ] | + cursor_bits_lookup[(b & m) & 0x0f], dst++); break; } } @@ -187,7 +194,7 @@ static int atyfb_cursor(struct fb_info *info, struct fb_cursor *cursor) return 0; } -int __devinit aty_init_cursor(struct fb_info *info) +int __init aty_init_cursor(struct fb_info *info) { unsigned long addr; diff --git a/drivers/video/aty/mach64_gx.c b/drivers/video/aty/mach64_gx.c index 2045639cb..01fdff794 100644 --- a/drivers/video/aty/mach64_gx.c +++ b/drivers/video/aty/mach64_gx.c @@ -149,7 +149,8 @@ static int aty_var_to_pll_514(const struct fb_info *info, u32 vclk_per, }; int i; - for (i = 0; i < ARRAY_SIZE(RGB514_clocks); i++) + for (i = 0; i < sizeof(RGB514_clocks) / sizeof(*RGB514_clocks); + i++) if (vclk_per <= RGB514_clocks[i].limit) { pll->ibm514.m = RGB514_clocks[i].m; pll->ibm514.n = RGB514_clocks[i].n; diff --git a/drivers/video/aty/radeon_base.c b/drivers/video/aty/radeon_base.c index 8e3400d5d..c9f0c5a07 100644 --- a/drivers/video/aty/radeon_base.c +++ b/drivers/video/aty/radeon_base.c @@ -52,12 +52,14 @@ #define RADEON_VERSION "0.2.0" +#include #include #include #include #include #include #include +#include #include #include #include @@ -76,6 +78,10 @@ #include #include "../macmodes.h" +#ifdef CONFIG_PMAC_BACKLIGHT +#include +#endif + #ifdef CONFIG_BOOTX_TEXT #include #endif @@ -266,13 +272,25 @@ static int force_measure_pll = 0; #ifdef CONFIG_MTRR static int nomtrr = 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) @@ -1049,7 +1067,7 @@ static int radeon_setcolreg (unsigned regno, unsigned red, unsigned green, if (regno > 255) - return -EINVAL; + return 1; red >>= 8; green >>= 8; @@ -1068,9 +1086,9 @@ static int radeon_setcolreg (unsigned regno, unsigned red, unsigned green, pindex = regno * 8; if (rinfo->depth == 16 && regno > 63) - return -EINVAL; + return 1; if (rinfo->depth == 15 && regno > 31) - return -EINVAL; + return 1; /* For 565, the green component is mixed one order * below @@ -1895,6 +1913,116 @@ 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, @@ -2137,7 +2265,7 @@ static struct bin_attribute edid2_attr = { }; -static int __devinit radeonfb_pci_register (struct pci_dev *pdev, +static int radeonfb_pci_register (struct pci_dev *pdev, const struct pci_device_id *ent) { struct fb_info *info; @@ -2329,9 +2457,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, ignore_devlist, force_sleep); + radeonfb_pm_init(rinfo, rinfo->is_mobility ? 1 : -1); } else - radeonfb_pm_init(rinfo, default_dynclk, ignore_devlist, force_sleep); + radeonfb_pm_init(rinfo, default_dynclk); pci_set_drvdata(pdev, info); @@ -2349,7 +2477,14 @@ static int __devinit radeonfb_pci_register (struct pci_dev *pdev, MTRR_TYPE_WRCOMB, 1); #endif - radeonfb_bl_init(rinfo); +#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 printk ("radeonfb (%s): %s\n", pci_name(rinfo->pdev), rinfo->name); @@ -2379,6 +2514,7 @@ err_release_pci0: err_release_fb: framebuffer_release(info); err_disable: + pci_disable_device(pdev); err_out: return ret; } @@ -2392,8 +2528,7 @@ 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) @@ -2435,6 +2570,7 @@ static void __devexit radeonfb_pci_unregister (struct pci_dev *pdev) #endif fb_dealloc_cmap(&info->cmap); framebuffer_release(info); + pci_disable_device(pdev); } @@ -2479,12 +2615,6 @@ static int __init radeonfb_setup (char *options) force_measure_pll = 1; } 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)) { - force_sleep = 1; - } else if (!strncmp(this_opt, "ignore_devlist", 14)) { - ignore_devlist = 1; -#endif } else mode_option = this_opt; } @@ -2540,9 +2670,3 @@ module_param(panel_yres, int, 0); 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(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 9aaca58c0..a9d0414e4 100644 --- a/drivers/video/aty/radeon_i2c.c +++ b/drivers/video/aty/radeon_i2c.c @@ -1,3 +1,4 @@ +#include #include #include #include diff --git a/drivers/video/aty/radeon_pm.c b/drivers/video/aty/radeon_pm.c index f31e606a2..1f8d805c6 100644 --- a/drivers/video/aty/radeon_pm.c +++ b/drivers/video/aty/radeon_pm.c @@ -20,106 +20,13 @@ #include #ifdef CONFIG_PPC_PMAC -#include +#include #include #include #endif #include "ati_ids.h" -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! - */ - -#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 */ -}; - -#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) { u32 tmp; @@ -945,26 +852,18 @@ static void radeon_pm_setup_for_suspend(struct radeonfb_info *rinfo) /* because both INPLL and OUTPLL take the same lock, that's why. */ tmp = INPLL( pllMCLK_MISC) | MCLK_MISC__EN_MCLK_TRISTATE_IN_SUSPEND; OUTPLL( pllMCLK_MISC, tmp); + + /* AGP PLL control */ + if (rinfo->family <= CHIP_FAMILY_RV280) { + OUTREG(BUS_CNTL1, INREG(BUS_CNTL1) | BUS_CNTL1__AGPCLK_VALID); - /* BUS_CNTL1__MOBILE_PLATORM_SEL setting is northbridge chipset - * and radeon chip dependent. Thus we only enable it on Mac for - * now (until we get more info on how to compute the correct - * value for various X86 bridges). - */ -#ifdef CONFIG_PPC_PMAC - if (machine_is(powermac)) { - /* 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<pll.ref_div); + OUTPLL(pllPPLL_REF_DIV, rinfo->pll.ref_div);; OUTPLL(pllPPLL_DIV_0, rinfo->save_regs[92]); mdelay(40); @@ -2814,7 +2713,7 @@ static void radeonfb_early_resume(void *data) #endif /* CONFIG_PM */ -void radeonfb_pm_init(struct radeonfb_info *rinfo, int dynclk, int ignore_devlist, int force_sleep) +void radeonfb_pm_init(struct radeonfb_info *rinfo, int dynclk) { /* Find PM registers in config space if any*/ rinfo->pm_reg = pci_find_capability(rinfo->pdev, PCI_CAP_ID_PM); @@ -2830,14 +2729,23 @@ void radeonfb_pm_init(struct radeonfb_info *rinfo, int dynclk, int ignore_devlis } #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 */ - if (machine_is(powermac) && rinfo->of_node) { + /* 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 == _MACH_Pmac && rinfo->of_node) { if (rinfo->is_mobility && rinfo->pm_reg && rinfo->family <= CHIP_FAMILY_RV250) rinfo->pm_mode |= radeon_pm_d2; @@ -2882,18 +2790,6 @@ void radeonfb_pm_init(struct radeonfb_info *rinfo, int dynclk, int ignore_devlis } #endif /* defined(CONFIG_PPC_PMAC) */ #endif /* defined(CONFIG_PM) */ - - if (ignore_devlist) - printk(KERN_DEBUG - "radeonfb: skipping test for device workarounds\n"); - else - radeon_apply_workarounds(rinfo); - - if (force_sleep) { - printk(KERN_DEBUG - "radeonfb: forcefully enabling D2 sleep mode\n"); - rinfo->pm_mode |= radeon_pm_d2; - } } void radeonfb_pm_exit(struct radeonfb_info *rinfo) diff --git a/drivers/video/aty/radeonfb.h b/drivers/video/aty/radeonfb.h index d5ff224a6..217e00ab4 100644 --- a/drivers/video/aty/radeonfb.h +++ b/drivers/video/aty/radeonfb.h @@ -1,6 +1,7 @@ #ifndef __RADEONFB_H__ #define __RADEONFB_H__ +#include #include #include #include @@ -273,8 +274,6 @@ 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; @@ -340,7 +339,7 @@ struct radeonfb_info { int dynclk; int no_schedule; enum radeon_pm_mode pm_mode; - reinit_function_ptr reinit_func; + void (*reinit_func)(struct radeonfb_info *rinfo); /* Lock on register access */ spinlock_t reg_lock; @@ -383,7 +382,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 mechanism. At this point, interrupts are off + * on some machines that support that mecanism. At this point, interrupts are off * and scheduling is not permitted */ static inline void _radeon_msleep(struct radeonfb_info *rinfo, unsigned long ms) @@ -602,7 +601,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, int ignore_devlist, int force_sleep); +extern void radeonfb_pm_init(struct radeonfb_info *rinfo, int dynclk); extern void radeonfb_pm_exit(struct radeonfb_info *rinfo); /* Monitor probe functions */ @@ -626,13 +625,4 @@ 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 f25d5d648..3d04b2def 100644 --- a/drivers/video/au1100fb.c +++ b/drivers/video/au1100fb.c @@ -7,8 +7,6 @@ * Karl Lessard * * - * PM support added by Rodolfo Giometti - * * Copyright 2002 MontaVista Software * Author: MontaVista Software, Inc. * ppopov@mvista.com or source@mvista.com @@ -40,6 +38,7 @@ * with this program; if not, write to the Free Software Foundation, Inc., * 675 Mass Ave, Cambridge, MA 02139, USA. */ +#include #include #include #include @@ -156,7 +155,7 @@ int au1100fb_setmode(struct au1100fb_device *fbdev) info->fix.visual = FB_VISUAL_TRUECOLOR; info->fix.line_length = info->var.xres_virtual << 1; /* depth=16 */ - } + } } else { /* mono */ info->fix.visual = FB_VISUAL_MONO10; @@ -164,16 +163,20 @@ int au1100fb_setmode(struct au1100fb_device *fbdev) } info->screen_size = info->fix.line_length * info->var.yres_virtual; - info->var.rotate = ((fbdev->panel->control_base&LCD_CONTROL_SM_MASK) \ - >> LCD_CONTROL_SM_BIT) * 90; /* Determine BPP mode and format */ - fbdev->regs->lcd_control = fbdev->panel->control_base; + fbdev->regs->lcd_control = fbdev->panel->control_base | + ((info->var.rotate/90) << LCD_CONTROL_SM_BIT); + + fbdev->regs->lcd_intenable = 0; + fbdev->regs->lcd_intstatus = 0; + fbdev->regs->lcd_horztiming = fbdev->panel->horztiming; + fbdev->regs->lcd_verttiming = fbdev->panel->verttiming; + fbdev->regs->lcd_clkcontrol = fbdev->panel->clkcontrol_base; - fbdev->regs->lcd_intenable = 0; - fbdev->regs->lcd_intstatus = 0; + fbdev->regs->lcd_dmaaddr0 = LCD_DMA_SA_N(fbdev->fb_phys); if (panel_is_dual(fbdev->panel)) { @@ -202,8 +205,6 @@ int au1100fb_setmode(struct au1100fb_device *fbdev) /* Resume controller */ fbdev->regs->lcd_control |= LCD_CONTROL_GO; - mdelay(10); - au1100fb_fb_blank(VESA_NO_BLANKING, info); return 0; } @@ -213,13 +214,10 @@ int au1100fb_setmode(struct au1100fb_device *fbdev) */ int au1100fb_fb_setcolreg(unsigned regno, unsigned red, unsigned green, unsigned blue, unsigned transp, struct fb_info *fbi) { - struct au1100fb_device *fbdev; - u32 *palette; + struct au1100fb_device *fbdev = to_au1100fb_device(fbi); + u32 *palette = fbdev->regs->lcd_pallettebase; u32 value; - fbdev = to_au1100fb_device(fbi); - palette = fbdev->regs->lcd_pallettebase; - if (regno > (AU1100_LCD_NBR_PALETTE_ENTRIES - 1)) return -EINVAL; @@ -318,11 +316,9 @@ int au1100fb_fb_blank(int blank_mode, struct fb_info *fbi) */ int au1100fb_fb_pan_display(struct fb_var_screeninfo *var, struct fb_info *fbi) { - struct au1100fb_device *fbdev; + struct au1100fb_device *fbdev = to_au1100fb_device(fbi); int dy; - fbdev = to_au1100fb_device(fbi); - print_dbg("fb_pan_display %p %p", var, fbi); if (!var || !fbdev) { @@ -386,12 +382,10 @@ void au1100fb_fb_rotate(struct fb_info *fbi, int angle) */ int au1100fb_fb_mmap(struct fb_info *fbi, struct vm_area_struct *vma) { - struct au1100fb_device *fbdev; + struct au1100fb_device *fbdev = to_au1100fb_device(fbi); unsigned int len; unsigned long start=0, off; - fbdev = to_au1100fb_device(fbi); - if (vma->vm_pgoff > (~0UL >> PAGE_SHIFT)) { return -EINVAL; } @@ -473,7 +467,7 @@ int au1100fb_drv_probe(struct device *dev) if (!request_mem_region(au1100fb_fix.mmio_start, au1100fb_fix.mmio_len, DRIVER_NAME)) { - print_err("fail to lock memory region at 0x%08lx", + print_err("fail to lock memory region at 0x%08x", au1100fb_fix.mmio_start); return -EBUSY; } @@ -601,52 +595,17 @@ int au1100fb_drv_remove(struct device *dev) return 0; } -#ifdef CONFIG_PM -static u32 sys_clksrc; -static struct au1100fb_regs fbregs; - -int au1100fb_drv_suspend(struct device *dev, pm_message_t state) +int au1100fb_drv_suspend(struct device *dev, u32 state, u32 level) { - struct au1100fb_device *fbdev = dev_get_drvdata(dev); - - if (!fbdev) - return 0; - - /* Save the clock source state */ - sys_clksrc = au_readl(SYS_CLKSRC); - - /* Blank the LCD */ - au1100fb_fb_blank(VESA_POWERDOWN, &fbdev->info); - - /* Stop LCD clocking */ - au_writel(sys_clksrc & ~SYS_CS_ML_MASK, SYS_CLKSRC); - - memcpy(&fbregs, fbdev->regs, sizeof(struct au1100fb_regs)); - + /* TODO */ return 0; } -int au1100fb_drv_resume(struct device *dev) +int au1100fb_drv_resume(struct device *dev, u32 level) { - struct au1100fb_device *fbdev = dev_get_drvdata(dev); - - if (!fbdev) - return 0; - - memcpy(fbdev->regs, &fbregs, sizeof(struct au1100fb_regs)); - - /* Restart LCD clocking */ - au_writel(sys_clksrc, SYS_CLKSRC); - - /* Unblank the LCD */ - au1100fb_fb_blank(VESA_NO_BLANKING, &fbdev->info); - + /* TODO */ return 0; } -#else -#define au1100fb_drv_suspend NULL -#define au1100fb_drv_resume NULL -#endif static struct device_driver au1100fb_driver = { .name = "au1100-lcd", @@ -740,7 +699,8 @@ void __exit au1100fb_cleanup(void) { driver_unregister(&au1100fb_driver); - kfree(drv_info.opt_mode); + if (drv_info.opt_mode) + kfree(drv_info.opt_mode); } module_init(au1100fb_init); diff --git a/drivers/video/backlight/Kconfig b/drivers/video/backlight/Kconfig index 02f15297a..9d996f2c1 100644 --- a/drivers/video/backlight/Kconfig +++ b/drivers/video/backlight/Kconfig @@ -43,21 +43,13 @@ config LCD_DEVICE default y config BACKLIGHT_CORGI - tristate "Sharp Corgi Backlight Driver (SL Series)" + tristate "Sharp Corgi Backlight Driver (SL-C7xx Series)" depends on BACKLIGHT_DEVICE && PXA_SHARPSL default y help - If you have a Sharp Zaurus SL-C7xx, SL-Cxx00 or SL-6000x say y to enable the + If you have a Sharp Zaurus SL-C7xx, say y to enable the backlight driver. -config BACKLIGHT_LOCOMO - tristate "Sharp LOCOMO LCD/Backlight Driver" - depends on BACKLIGHT_DEVICE && SHARP_LOCOMO - default y - help - If you have a Sharp Zaurus SL-5500 (Collie) or SL-5600 (Poodle) say y to - enable the LCD/backlight driver. - config BACKLIGHT_HP680 tristate "HP Jornada 680 Backlight Driver" depends on BACKLIGHT_DEVICE && SH_HP6XX diff --git a/drivers/video/backlight/Makefile b/drivers/video/backlight/Makefile index 65e5553fc..744210c38 100644 --- a/drivers/video/backlight/Makefile +++ b/drivers/video/backlight/Makefile @@ -4,4 +4,4 @@ obj-$(CONFIG_LCD_CLASS_DEVICE) += lcd.o obj-$(CONFIG_BACKLIGHT_CLASS_DEVICE) += backlight.o obj-$(CONFIG_BACKLIGHT_CORGI) += corgi_bl.o obj-$(CONFIG_BACKLIGHT_HP680) += hp680_bl.o -obj-$(CONFIG_BACKLIGHT_LOCOMO) += locomolcd.o +obj-$(CONFIG_SHARP_LOCOMO) += locomolcd.o diff --git a/drivers/video/backlight/backlight.c b/drivers/video/backlight/backlight.c index 27597c576..151fda8dd 100644 --- a/drivers/video/backlight/backlight.c +++ b/drivers/video/backlight/backlight.c @@ -16,12 +16,14 @@ static ssize_t backlight_show_power(struct class_device *cdev, char *buf) { - int rc = -ENXIO; + int rc; struct backlight_device *bd = to_backlight_device(cdev); down(&bd->sem); - if (likely(bd->props)) - rc = sprintf(buf, "%d\n", bd->props->power); + if (likely(bd->props && bd->props->get_power)) + rc = sprintf(buf, "%d\n", bd->props->get_power(bd)); + else + rc = -ENXIO; up(&bd->sem); return rc; @@ -29,25 +31,21 @@ static ssize_t backlight_show_power(struct class_device *cdev, char *buf) static ssize_t backlight_store_power(struct class_device *cdev, const char *buf, size_t count) { - int rc = -ENXIO; + int rc, power; char *endp; struct backlight_device *bd = to_backlight_device(cdev); - int power = simple_strtoul(buf, &endp, 0); - size_t size = endp - buf; - if (*endp && isspace(*endp)) - size++; - if (size != count) + power = simple_strtoul(buf, &endp, 0); + if (*endp && !isspace(*endp)) return -EINVAL; down(&bd->sem); - if (likely(bd->props)) { + if (likely(bd->props && bd->props->set_power)) { pr_debug("backlight: set power to %d\n", power); - bd->props->power = power; - if (likely(bd->props->update_status)) - bd->props->update_status(bd); + bd->props->set_power(bd, power); rc = count; - } + } else + rc = -ENXIO; up(&bd->sem); return rc; @@ -55,12 +53,14 @@ static ssize_t backlight_store_power(struct class_device *cdev, const char *buf, static ssize_t backlight_show_brightness(struct class_device *cdev, char *buf) { - int rc = -ENXIO; + int rc; struct backlight_device *bd = to_backlight_device(cdev); down(&bd->sem); - if (likely(bd->props)) - rc = sprintf(buf, "%d\n", bd->props->brightness); + if (likely(bd->props && bd->props->get_brightness)) + rc = sprintf(buf, "%d\n", bd->props->get_brightness(bd)); + else + rc = -ENXIO; up(&bd->sem); return rc; @@ -68,30 +68,21 @@ static ssize_t backlight_show_brightness(struct class_device *cdev, char *buf) static ssize_t backlight_store_brightness(struct class_device *cdev, const char *buf, size_t count) { - int rc = -ENXIO; + int rc, brightness; char *endp; struct backlight_device *bd = to_backlight_device(cdev); - int brightness = simple_strtoul(buf, &endp, 0); - size_t size = endp - buf; - if (*endp && isspace(*endp)) - size++; - if (size != count) + brightness = simple_strtoul(buf, &endp, 0); + if (*endp && !isspace(*endp)) return -EINVAL; down(&bd->sem); - if (likely(bd->props)) { - if (brightness > bd->props->max_brightness) - rc = -EINVAL; - else { - pr_debug("backlight: set brightness to %d\n", - brightness); - bd->props->brightness = brightness; - if (likely(bd->props->update_status)) - bd->props->update_status(bd); - rc = count; - } - } + if (likely(bd->props && bd->props->set_brightness)) { + pr_debug("backlight: set brightness to %d\n", brightness); + bd->props->set_brightness(bd, brightness); + rc = count; + } else + rc = -ENXIO; up(&bd->sem); return rc; @@ -99,26 +90,14 @@ static ssize_t backlight_store_brightness(struct class_device *cdev, const char static ssize_t backlight_show_max_brightness(struct class_device *cdev, char *buf) { - int rc = -ENXIO; + int rc; struct backlight_device *bd = to_backlight_device(cdev); down(&bd->sem); if (likely(bd->props)) rc = sprintf(buf, "%d\n", bd->props->max_brightness); - up(&bd->sem); - - return rc; -} - -static ssize_t backlight_show_actual_brightness(struct class_device *cdev, - char *buf) -{ - int rc = -ENXIO; - struct backlight_device *bd = to_backlight_device(cdev); - - down(&bd->sem); - if (likely(bd->props && bd->props->get_brightness)) - rc = sprintf(buf, "%d\n", bd->props->get_brightness(bd)); + else + rc = -ENXIO; up(&bd->sem); return rc; @@ -144,10 +123,7 @@ static struct class backlight_class = { static struct class_device_attribute bl_class_device_attributes[] = { DECLARE_ATTR(power, 0644, backlight_show_power, backlight_store_power), - DECLARE_ATTR(brightness, 0644, backlight_show_brightness, - backlight_store_brightness), - DECLARE_ATTR(actual_brightness, 0444, backlight_show_actual_brightness, - NULL), + DECLARE_ATTR(brightness, 0644, backlight_show_brightness, backlight_store_brightness), DECLARE_ATTR(max_brightness, 0444, backlight_show_max_brightness, NULL), }; @@ -168,12 +144,8 @@ static int fb_notifier_callback(struct notifier_block *self, bd = container_of(self, struct backlight_device, fb_notif); down(&bd->sem); if (bd->props) - if (!bd->props->check_fb || - bd->props->check_fb(evdata->info)) { - bd->props->fb_blank = *(int *)evdata->data; - if (likely(bd->props && bd->props->update_status)) - bd->props->update_status(bd); - } + if (!bd->props->check_fb || bd->props->check_fb(evdata->info)) + bd->props->set_power(bd, *(int *)evdata->data); up(&bd->sem); return 0; } @@ -259,12 +231,6 @@ void backlight_device_unregister(struct backlight_device *bd) &bl_class_device_attributes[i]); down(&bd->sem); - if (likely(bd->props && bd->props->update_status)) { - bd->props->brightness = 0; - bd->props->power = 0; - bd->props->update_status(bd); - } - bd->props = NULL; up(&bd->sem); diff --git a/drivers/video/backlight/corgi_bl.c b/drivers/video/backlight/corgi_bl.c index 2ebbfd951..d0aaf450e 100644 --- a/drivers/video/backlight/corgi_bl.c +++ b/drivers/video/backlight/corgi_bl.c @@ -1,7 +1,7 @@ /* - * Backlight Driver for Sharp Zaurus Handhelds (various models) + * Backlight Driver for Sharp Corgi * - * Copyright (c) 2004-2006 Richard Purdie + * Copyright (c) 2004-2005 Richard Purdie * * Based on Sharp's 2.4 Backlight Driver * @@ -15,63 +15,80 @@ #include #include #include -#include +#include #include #include + #include #include -static int corgibl_intensity; -static DEFINE_MUTEX(bl_mutex); -static struct backlight_properties corgibl_data; -static struct backlight_device *corgi_backlight_device; -static struct corgibl_machinfo *bl_machinfo; +#define CORGI_DEFAULT_INTENSITY 0x1f +#define CORGI_LIMIT_MASK 0x0b -static unsigned long corgibl_flags; -#define CORGIBL_SUSPENDED 0x01 -#define CORGIBL_BATTLOW 0x02 +static int corgibl_powermode = FB_BLANK_UNBLANK; +static int current_intensity = 0; +static int corgibl_limit = 0; +static void (*corgibl_mach_set_intensity)(int intensity); +static spinlock_t bl_lock = SPIN_LOCK_UNLOCKED; +static struct backlight_properties corgibl_data; -static int corgibl_send_intensity(struct backlight_device *bd) +static void corgibl_send_intensity(int intensity) { + unsigned long flags; void (*corgi_kick_batt)(void); - int intensity = bd->props->brightness; - if (bd->props->power != FB_BLANK_UNBLANK) - intensity = 0; - if (bd->props->fb_blank != FB_BLANK_UNBLANK) - intensity = 0; - if (corgibl_flags & CORGIBL_SUSPENDED) + if (corgibl_powermode != FB_BLANK_UNBLANK) { intensity = 0; - if (corgibl_flags & CORGIBL_BATTLOW) - intensity &= bl_machinfo->limit_mask; + } else { + if (corgibl_limit) + intensity &= CORGI_LIMIT_MASK; + } - mutex_lock(&bl_mutex); - bl_machinfo->set_bl_intensity(intensity); - mutex_unlock(&bl_mutex); + spin_lock_irqsave(&bl_lock, flags); - corgibl_intensity = intensity; + corgibl_mach_set_intensity(intensity); + + spin_unlock_irqrestore(&bl_lock, flags); corgi_kick_batt = symbol_get(sharpsl_battery_kick); if (corgi_kick_batt) { corgi_kick_batt(); symbol_put(sharpsl_battery_kick); } +} - return 0; +static void corgibl_blank(int blank) +{ + switch(blank) { + + case FB_BLANK_NORMAL: + case FB_BLANK_VSYNC_SUSPEND: + case FB_BLANK_HSYNC_SUSPEND: + case FB_BLANK_POWERDOWN: + if (corgibl_powermode == FB_BLANK_UNBLANK) { + corgibl_send_intensity(0); + corgibl_powermode = blank; + } + break; + case FB_BLANK_UNBLANK: + if (corgibl_powermode != FB_BLANK_UNBLANK) { + corgibl_powermode = blank; + corgibl_send_intensity(current_intensity); + } + break; + } } #ifdef CONFIG_PM static int corgibl_suspend(struct platform_device *dev, pm_message_t state) { - corgibl_flags |= CORGIBL_SUSPENDED; - corgibl_send_intensity(corgi_backlight_device); + corgibl_blank(FB_BLANK_POWERDOWN); return 0; } static int corgibl_resume(struct platform_device *dev) { - corgibl_flags &= ~CORGIBL_SUSPENDED; - corgibl_send_intensity(corgi_backlight_device); + corgibl_blank(FB_BLANK_UNBLANK); return 0; } #else @@ -79,55 +96,68 @@ static int corgibl_resume(struct platform_device *dev) #define corgibl_resume NULL #endif -static int corgibl_get_intensity(struct backlight_device *bd) + +static int corgibl_set_power(struct backlight_device *bd, int state) { - return corgibl_intensity; + corgibl_blank(state); + return 0; +} + +static int corgibl_get_power(struct backlight_device *bd) +{ + return corgibl_powermode; } -static int corgibl_set_intensity(struct backlight_device *bd) +static int corgibl_set_intensity(struct backlight_device *bd, int intensity) { - corgibl_send_intensity(corgi_backlight_device); + if (intensity > corgibl_data.max_brightness) + intensity = corgibl_data.max_brightness; + corgibl_send_intensity(intensity); + current_intensity=intensity; return 0; } +static int corgibl_get_intensity(struct backlight_device *bd) +{ + return current_intensity; +} + /* * Called when the battery is low to limit the backlight intensity. * If limit==0 clear any limit, otherwise limit the intensity */ void corgibl_limit_intensity(int limit) { - if (limit) - corgibl_flags |= CORGIBL_BATTLOW; - else - corgibl_flags &= ~CORGIBL_BATTLOW; - corgibl_send_intensity(corgi_backlight_device); + corgibl_limit = (limit ? 1 : 0); + corgibl_send_intensity(current_intensity); } EXPORT_SYMBOL(corgibl_limit_intensity); static struct backlight_properties corgibl_data = { - .owner = THIS_MODULE, + .owner = THIS_MODULE, + .get_power = corgibl_get_power, + .set_power = corgibl_set_power, .get_brightness = corgibl_get_intensity, - .update_status = corgibl_set_intensity, + .set_brightness = corgibl_set_intensity, }; +static struct backlight_device *corgi_backlight_device; + static int __init corgibl_probe(struct platform_device *pdev) { struct corgibl_machinfo *machinfo = pdev->dev.platform_data; - bl_machinfo = machinfo; corgibl_data.max_brightness = machinfo->max_intensity; - if (!machinfo->limit_mask) - machinfo->limit_mask = -1; + corgibl_mach_set_intensity = machinfo->set_bl_intensity; corgi_backlight_device = backlight_device_register ("corgi-bl", NULL, &corgibl_data); if (IS_ERR (corgi_backlight_device)) return PTR_ERR (corgi_backlight_device); - corgibl_data.power = FB_BLANK_UNBLANK; - corgibl_data.brightness = machinfo->default_intensity; - corgibl_send_intensity(corgi_backlight_device); + corgibl_set_intensity(NULL, CORGI_DEFAULT_INTENSITY); + corgibl_limit_intensity(0); printk("Corgi Backlight Driver Initialized.\n"); return 0; @@ -137,6 +167,8 @@ static int corgibl_remove(struct platform_device *dev) { backlight_device_unregister(corgi_backlight_device); + corgibl_set_intensity(NULL, 0); + printk("Corgi Backlight Driver Unloaded\n"); return 0; } diff --git a/drivers/video/backlight/hp680_bl.c b/drivers/video/backlight/hp680_bl.c index ffc72ae3a..95da4c9ed 100644 --- a/drivers/video/backlight/hp680_bl.c +++ b/drivers/video/backlight/hp680_bl.c @@ -13,7 +13,7 @@ #include #include #include -#include +#include #include #include #include @@ -25,58 +25,66 @@ #define HP680_MAX_INTENSITY 255 #define HP680_DEFAULT_INTENSITY 10 -static int hp680bl_suspended; +static int hp680bl_powermode = FB_BLANK_UNBLANK; static int current_intensity = 0; -static DEFINE_SPINLOCK(bl_lock); -static struct backlight_device *hp680_backlight_device; +static spinlock_t bl_lock = SPIN_LOCK_UNLOCKED; -static void hp680bl_send_intensity(struct backlight_device *bd) +static void hp680bl_send_intensity(int intensity) { unsigned long flags; - u16 v; - int intensity = bd->props->brightness; - if (bd->props->power != FB_BLANK_UNBLANK) - intensity = 0; - if (bd->props->fb_blank != FB_BLANK_UNBLANK) - intensity = 0; - if (hp680bl_suspended) + if (hp680bl_powermode != FB_BLANK_UNBLANK) intensity = 0; spin_lock_irqsave(&bl_lock, flags); - if (intensity && current_intensity == 0) { - sh_dac_enable(DAC_LCD_BRIGHTNESS); - v = inw(HD64461_GPBDR); - v &= ~HD64461_GPBDR_LCDOFF; - outw(v, HD64461_GPBDR); - sh_dac_output(255-(u8)intensity, DAC_LCD_BRIGHTNESS); - } else if (intensity == 0 && current_intensity != 0) { - sh_dac_output(255-(u8)intensity, DAC_LCD_BRIGHTNESS); - sh_dac_disable(DAC_LCD_BRIGHTNESS); - v = inw(HD64461_GPBDR); - v |= HD64461_GPBDR_LCDOFF; - outw(v, HD64461_GPBDR); - } else if (intensity) { - sh_dac_output(255-(u8)intensity, DAC_LCD_BRIGHTNESS); - } + sh_dac_output(255-(u8)intensity, DAC_LCD_BRIGHTNESS); spin_unlock_irqrestore(&bl_lock, flags); - - current_intensity = intensity; } +static void hp680bl_blank(int blank) +{ + u16 v; + + switch(blank) { + + case FB_BLANK_NORMAL: + case FB_BLANK_VSYNC_SUSPEND: + case FB_BLANK_HSYNC_SUSPEND: + case FB_BLANK_POWERDOWN: + if (hp680bl_powermode == FB_BLANK_UNBLANK) { + hp680bl_send_intensity(0); + hp680bl_powermode = blank; + sh_dac_disable(DAC_LCD_BRIGHTNESS); + v = inw(HD64461_GPBDR); + v |= HD64461_GPBDR_LCDOFF; + outw(v, HD64461_GPBDR); + } + break; + case FB_BLANK_UNBLANK: + if (hp680bl_powermode != FB_BLANK_UNBLANK) { + sh_dac_enable(DAC_LCD_BRIGHTNESS); + v = inw(HD64461_GPBDR); + v &= ~HD64461_GPBDR_LCDOFF; + outw(v, HD64461_GPBDR); + hp680bl_powermode = blank; + hp680bl_send_intensity(current_intensity); + } + break; + } +} #ifdef CONFIG_PM -static int hp680bl_suspend(struct platform_device *dev, pm_message_t state) +static int hp680bl_suspend(struct device *dev, pm_message_t state, u32 level) { - hp680bl_suspended = 1; - hp680bl_send_intensity(hp680_backlight_device); + if (level == SUSPEND_POWER_DOWN) + hp680bl_blank(FB_BLANK_POWERDOWN); return 0; } -static int hp680bl_resume(struct platform_device *dev) +static int hp680bl_resume(struct device *dev, u32 level) { - hp680bl_suspended = 0; - hp680bl_send_intensity(hp680_backlight_device); + if (level == RESUME_POWER_ON) + hp680bl_blank(FB_BLANK_UNBLANK); return 0; } #else @@ -84,9 +92,24 @@ static int hp680bl_resume(struct platform_device *dev) #define hp680bl_resume NULL #endif -static int hp680bl_set_intensity(struct backlight_device *bd) + +static int hp680bl_set_power(struct backlight_device *bd, int state) { - hp680bl_send_intensity(bd); + hp680bl_blank(state); + return 0; +} + +static int hp680bl_get_power(struct backlight_device *bd) +{ + return hp680bl_powermode; +} + +static int hp680bl_set_intensity(struct backlight_device *bd, int intensity) +{ + if (intensity > HP680_MAX_INTENSITY) + intensity = HP680_MAX_INTENSITY; + hp680bl_send_intensity(intensity); + current_intensity = intensity; return 0; } @@ -97,67 +120,65 @@ static int hp680bl_get_intensity(struct backlight_device *bd) static struct backlight_properties hp680bl_data = { .owner = THIS_MODULE, + .get_power = hp680bl_get_power, + .set_power = hp680bl_set_power, .max_brightness = HP680_MAX_INTENSITY, .get_brightness = hp680bl_get_intensity, - .update_status = hp680bl_set_intensity, + .set_brightness = hp680bl_set_intensity, }; -static int __init hp680bl_probe(struct platform_device *dev) +static struct backlight_device *hp680_backlight_device; + +static int __init hp680bl_probe(struct device *dev) { hp680_backlight_device = backlight_device_register ("hp680-bl", NULL, &hp680bl_data); if (IS_ERR (hp680_backlight_device)) return PTR_ERR (hp680_backlight_device); - hp680_backlight_device->props->brightness = HP680_DEFAULT_INTENSITY; - hp680bl_send_intensity(hp680_backlight_device); + hp680bl_set_intensity(NULL, HP680_DEFAULT_INTENSITY); return 0; } -static int hp680bl_remove(struct platform_device *dev) +static int hp680bl_remove(struct device *dev) { backlight_device_unregister(hp680_backlight_device); return 0; } -static struct platform_driver hp680bl_driver = { +static struct device_driver hp680bl_driver = { + .name = "hp680-bl", + .bus = &platform_bus_type, .probe = hp680bl_probe, .remove = hp680bl_remove, .suspend = hp680bl_suspend, .resume = hp680bl_resume, - .driver = { - .name = "hp680-bl", - }, }; -static struct platform_device *hp680bl_device; +static struct platform_device hp680bl_device = { + .name = "hp680-bl", + .id = -1, +}; static int __init hp680bl_init(void) { int ret; - ret = platform_driver_register(&hp680bl_driver); + ret=driver_register(&hp680bl_driver); if (!ret) { - hp680bl_device = platform_device_alloc("hp680-bl", -1); - if (!hp680bl_device) - return -ENOMEM; - - ret = platform_device_add(hp680bl_device); - - if (ret) { - platform_device_put(hp680bl_device); - platform_driver_unregister(&hp680bl_driver); - } + ret = platform_device_register(&hp680bl_device); + if (ret) + driver_unregister(&hp680bl_driver); } return ret; } static void __exit hp680bl_exit(void) { - platform_device_unregister(hp680bl_device); - platform_driver_unregister(&hp680bl_driver); + platform_device_unregister(&hp680bl_device); + driver_unregister(&hp680bl_driver); } module_init(hp680bl_init); diff --git a/drivers/video/backlight/lcd.c b/drivers/video/backlight/lcd.c index bc8ab005a..86908a60c 100644 --- a/drivers/video/backlight/lcd.c +++ b/drivers/video/backlight/lcd.c @@ -31,15 +31,12 @@ static ssize_t lcd_show_power(struct class_device *cdev, char *buf) static ssize_t lcd_store_power(struct class_device *cdev, const char *buf, size_t count) { - int rc = -ENXIO; + int rc, power; char *endp; struct lcd_device *ld = to_lcd_device(cdev); - int power = simple_strtoul(buf, &endp, 0); - size_t size = endp - buf; - if (*endp && isspace(*endp)) - size++; - if (size != count) + power = simple_strtoul(buf, &endp, 0); + if (*endp && !isspace(*endp)) return -EINVAL; down(&ld->sem); @@ -47,7 +44,8 @@ static ssize_t lcd_store_power(struct class_device *cdev, const char *buf, size_ pr_debug("lcd: set power to %d\n", power); ld->props->set_power(ld, power); rc = count; - } + } else + rc = -ENXIO; up(&ld->sem); return rc; @@ -55,12 +53,14 @@ static ssize_t lcd_store_power(struct class_device *cdev, const char *buf, size_ static ssize_t lcd_show_contrast(struct class_device *cdev, char *buf) { - int rc = -ENXIO; + int rc; struct lcd_device *ld = to_lcd_device(cdev); down(&ld->sem); if (likely(ld->props && ld->props->get_contrast)) rc = sprintf(buf, "%d\n", ld->props->get_contrast(ld)); + else + rc = -ENXIO; up(&ld->sem); return rc; @@ -68,15 +68,12 @@ static ssize_t lcd_show_contrast(struct class_device *cdev, char *buf) static ssize_t lcd_store_contrast(struct class_device *cdev, const char *buf, size_t count) { - int rc = -ENXIO; + int rc, contrast; char *endp; struct lcd_device *ld = to_lcd_device(cdev); - int contrast = simple_strtoul(buf, &endp, 0); - size_t size = endp - buf; - if (*endp && isspace(*endp)) - size++; - if (size != count) + contrast = simple_strtoul(buf, &endp, 0); + if (*endp && !isspace(*endp)) return -EINVAL; down(&ld->sem); @@ -84,7 +81,8 @@ static ssize_t lcd_store_contrast(struct class_device *cdev, const char *buf, si pr_debug("lcd: set contrast to %d\n", contrast); ld->props->set_contrast(ld, contrast); rc = count; - } + } else + rc = -ENXIO; up(&ld->sem); return rc; @@ -92,12 +90,14 @@ static ssize_t lcd_store_contrast(struct class_device *cdev, const char *buf, si static ssize_t lcd_show_max_contrast(struct class_device *cdev, char *buf) { - int rc = -ENXIO; + int rc; struct lcd_device *ld = to_lcd_device(cdev); down(&ld->sem); if (likely(ld->props)) rc = sprintf(buf, "%d\n", ld->props->max_contrast); + else + rc = -ENXIO; up(&ld->sem); return rc; diff --git a/drivers/video/backlight/locomolcd.c b/drivers/video/backlight/locomolcd.c index caf1eca19..ada6e75eb 100644 --- a/drivers/video/backlight/locomolcd.c +++ b/drivers/video/backlight/locomolcd.c @@ -11,25 +11,25 @@ */ /* LCD power functions */ +#include #include #include #include #include #include -#include -#include #include #include -#include -#include -#include "../../../arch/arm/mach-sa1100/generic.h" +#ifdef CONFIG_SA1100_COLLIE +#include +#else +#include +#endif + +extern void (*sa1100fb_lcd_power)(int on); -static struct backlight_device *locomolcd_bl_device; static struct locomo_dev *locomolcd_dev; -static unsigned long locomolcd_flags; -#define LOCOMOLCD_SUSPENDED 0x01 static void locomolcd_on(int comadj) { @@ -82,7 +82,7 @@ static void locomolcd_off(int comadj) void locomolcd_power(int on) { - int comadj = sharpsl_param.comadj; + int comadj = 118; unsigned long flags; local_irq_save(flags); @@ -93,10 +93,11 @@ void locomolcd_power(int on) } /* read comadj */ - if (comadj == -1 && machine_is_collie()) - comadj = 128; - if (comadj == -1 && machine_is_poodle()) - comadj = 118; +#ifdef CONFIG_MACH_POODLE + comadj = 118; +#else + comadj = 128; +#endif if (on) locomolcd_on(comadj); @@ -107,100 +108,26 @@ void locomolcd_power(int on) } EXPORT_SYMBOL(locomolcd_power); - -static int current_intensity; - -static int locomolcd_set_intensity(struct backlight_device *bd) -{ - int intensity = bd->props->brightness; - - if (bd->props->power != FB_BLANK_UNBLANK) - intensity = 0; - if (bd->props->fb_blank != FB_BLANK_UNBLANK) - intensity = 0; - if (locomolcd_flags & LOCOMOLCD_SUSPENDED) - intensity = 0; - - switch (intensity) { - /* AC and non-AC are handled differently, but produce same results in sharp code? */ - case 0: locomo_frontlight_set(locomolcd_dev, 0, 0, 161); break; - case 1: locomo_frontlight_set(locomolcd_dev, 117, 0, 161); break; - case 2: locomo_frontlight_set(locomolcd_dev, 163, 0, 148); break; - case 3: locomo_frontlight_set(locomolcd_dev, 194, 0, 161); break; - case 4: locomo_frontlight_set(locomolcd_dev, 194, 1, 161); break; - - default: - return -ENODEV; - } - current_intensity = intensity; - return 0; -} - -static int locomolcd_get_intensity(struct backlight_device *bd) -{ - return current_intensity; -} - -static struct backlight_properties locomobl_data = { - .owner = THIS_MODULE, - .get_brightness = locomolcd_get_intensity, - .update_status = locomolcd_set_intensity, - .max_brightness = 4, -}; - -#ifdef CONFIG_PM -static int locomolcd_suspend(struct locomo_dev *dev, pm_message_t state) -{ - locomolcd_flags |= LOCOMOLCD_SUSPENDED; - locomolcd_set_intensity(locomolcd_bl_device); - return 0; -} - -static int locomolcd_resume(struct locomo_dev *dev) -{ - locomolcd_flags &= ~LOCOMOLCD_SUSPENDED; - locomolcd_set_intensity(locomolcd_bl_device); - return 0; -} -#else -#define locomolcd_suspend NULL -#define locomolcd_resume NULL -#endif - -static int locomolcd_probe(struct locomo_dev *dev) +static int poodle_lcd_probe(struct locomo_dev *dev) { unsigned long flags; local_irq_save(flags); locomolcd_dev = dev; - locomo_gpio_set_dir(dev, LOCOMO_GPIO_FL_VR, 0); - /* the poodle_lcd_power function is called for the first time * from fs_initcall, which is before locomo is activated. * We need to recall poodle_lcd_power here*/ - if (machine_is_poodle()) - locomolcd_power(1); - +#ifdef CONFIG_MACH_POODLE + locomolcd_power(1); +#endif local_irq_restore(flags); - - locomolcd_bl_device = backlight_device_register("locomo-bl", NULL, &locomobl_data); - - if (IS_ERR (locomolcd_bl_device)) - return PTR_ERR (locomolcd_bl_device); - - /* Set up frontlight so that screen is readable */ - locomobl_data.brightness = 2; - locomolcd_set_intensity(locomolcd_bl_device); - return 0; } -static int locomolcd_remove(struct locomo_dev *dev) +static int poodle_lcd_remove(struct locomo_dev *dev) { unsigned long flags; - - backlight_device_unregister(locomolcd_bl_device); local_irq_save(flags); locomolcd_dev = NULL; local_irq_restore(flags); @@ -212,33 +139,19 @@ static struct locomo_driver poodle_lcd_driver = { .name = "locomo-backlight", }, .devid = LOCOMO_DEVID_BACKLIGHT, - .probe = locomolcd_probe, - .remove = locomolcd_remove, - .suspend = locomolcd_suspend, - .resume = locomolcd_resume, + .probe = poodle_lcd_probe, + .remove = poodle_lcd_remove, }; - -static int __init locomolcd_init(void) +static int __init poodle_lcd_init(void) { int ret = locomo_driver_register(&poodle_lcd_driver); - if (ret) - return ret; + if (ret) return ret; #ifdef CONFIG_SA1100_COLLIE sa1100fb_lcd_power = locomolcd_power; #endif return 0; } +device_initcall(poodle_lcd_init); -static void __exit locomolcd_exit(void) -{ - locomo_driver_unregister(&poodle_lcd_driver); -} - -module_init(locomolcd_init); -module_exit(locomolcd_exit); - -MODULE_AUTHOR("John Lenz , Pavel Machek "); -MODULE_DESCRIPTION("Collie LCD driver"); -MODULE_LICENSE("GPL"); diff --git a/drivers/video/bw2.c b/drivers/video/bw2.c index c66e3d52c..c029db464 100644 --- a/drivers/video/bw2.c +++ b/drivers/video/bw2.c @@ -1,6 +1,6 @@ /* bw2.c: BWTWO frame buffer driver * - * Copyright (C) 2003, 2006 David S. Miller (davem@davemloft.net) + * Copyright (C) 2003 David S. Miller (davem@redhat.com) * Copyright (C) 1996,1998 Jakub Jelinek (jj@ultra.linux.cz) * Copyright (C) 1996 Miguel de Icaza (miguel@nuclecu.unam.mx) * Copyright (C) 1997 Eddie C. Dost (ecd@skynet.be) @@ -19,11 +19,14 @@ #include #include +#include #include -#include -#include #include +#ifdef CONFIG_SPARC32 +#include +#endif + #include "sbuslib.h" /* @@ -56,30 +59,30 @@ static struct fb_ops bw2_ops = { #define BWTWO_REGISTER_OFFSET 0x400000 struct bt_regs { - u32 addr; - u32 color_map; - u32 control; - u32 cursor; + volatile u32 addr; + volatile u32 color_map; + volatile u32 control; + volatile u32 cursor; }; struct bw2_regs { struct bt_regs cmap; - u8 control; - u8 status; - u8 cursor_start; - u8 cursor_end; - u8 h_blank_start; - u8 h_blank_end; - u8 h_sync_start; - u8 h_sync_end; - u8 comp_sync_end; - u8 v_blank_start_high; - u8 v_blank_start_low; - u8 v_blank_end; - u8 v_sync_start; - u8 v_sync_end; - u8 xfer_holdoff_start; - u8 xfer_holdoff_end; + volatile u8 control; + volatile u8 status; + volatile u8 cursor_start; + volatile u8 cursor_end; + volatile u8 h_blank_start; + volatile u8 h_blank_end; + volatile u8 h_sync_start; + volatile u8 h_sync_end; + volatile u8 comp_sync_end; + volatile u8 v_blank_start_high; + volatile u8 v_blank_start_low; + volatile u8 v_blank_end; + volatile u8 v_sync_start; + volatile u8 v_sync_end; + volatile u8 xfer_holdoff_start; + volatile u8 xfer_holdoff_end; }; /* Status Register Constants */ @@ -114,8 +117,9 @@ struct bw2_par { #define BW2_FLAG_BLANKED 0x00000001 unsigned long physbase; - unsigned long which_io; unsigned long fbsize; + + struct sbus_dev *sdev; }; /** @@ -170,7 +174,9 @@ static int bw2_mmap(struct fb_info *info, struct vm_area_struct *vma) return sbusfb_mmap_helper(bw2_mmap_map, par->physbase, par->fbsize, - par->which_io, + (par->sdev ? + par->sdev->reg_addrs[0].which_io : + 0), vma); } @@ -282,124 +288,140 @@ static void bw2_do_default_mode(struct bw2_par *par, struct fb_info *info, struct all_info { struct fb_info info; struct bw2_par par; + struct list_head list; }; +static LIST_HEAD(bw2_list); -static int __devinit bw2_init_one(struct of_device *op) +static void bw2_init_one(struct sbus_dev *sdev) { - struct device_node *dp = op->node; struct all_info *all; - int linebytes, err; - - all = kzalloc(sizeof(*all), GFP_KERNEL); - if (!all) - return -ENOMEM; - - spin_lock_init(&all->par.lock); + struct resource *resp; +#ifdef CONFIG_SUN4 + struct resource res; +#endif + int linebytes; - all->par.physbase = op->resource[0].start; - all->par.which_io = op->resource[0].flags & IORESOURCE_BITS; + all = kmalloc(sizeof(*all), GFP_KERNEL); + if (!all) { + printk(KERN_ERR "bw2: Cannot allocate memory.\n"); + return; + } + memset(all, 0, sizeof(*all)); - sbusfb_fill_var(&all->info.var, dp->node, 1); - linebytes = of_getintprop_default(dp, "linebytes", - all->info.var.xres); + INIT_LIST_HEAD(&all->list); + spin_lock_init(&all->par.lock); + all->par.sdev = sdev; + +#ifdef CONFIG_SUN4 + if (!sdev) { + all->par.physbase = sun4_bwtwo_physaddr; + res.start = sun4_bwtwo_physaddr; + res.end = res.start + BWTWO_REGISTER_OFFSET + sizeof(struct bw2_regs) - 1; + res.flags = IORESOURCE_IO; + resp = &res; + all->info.var.xres = all->info.var.xres_virtual = 1152; + all->info.var.yres = all->info.var.yres_virtual = 900; + all->info.var.bits_per_pixel = 1; + linebytes = 1152 / 8; + } else +#else + { + if (!sdev) + BUG(); + all->par.physbase = sdev->reg_addrs[0].phys_addr; + resp = &sdev->resource[0]; + sbusfb_fill_var(&all->info.var, (sdev ? sdev->prom_node : 0), 1); + linebytes = prom_getintdefault(sdev->prom_node, "linebytes", + all->info.var.xres); + } +#endif all->info.var.red.length = all->info.var.green.length = all->info.var.blue.length = all->info.var.bits_per_pixel; all->info.var.red.offset = all->info.var.green.offset = all->info.var.blue.offset = 0; - all->par.regs = of_ioremap(&op->resource[0], BWTWO_REGISTER_OFFSET, - sizeof(struct bw2_regs), "bw2 regs"); + all->par.regs = sbus_ioremap(resp, BWTWO_REGISTER_OFFSET, + sizeof(struct bw2_regs), "bw2 regs"); - if (!of_find_property(dp, "width", NULL)) + if (sdev && !prom_getbool(sdev->prom_node, "width")) bw2_do_default_mode(&all->par, &all->info, &linebytes); all->par.fbsize = PAGE_ALIGN(linebytes * all->info.var.yres); all->info.flags = FBINFO_DEFAULT; all->info.fbops = &bw2_ops; - - all->info.screen_base = - sbus_ioremap(&op->resource[0], 0, all->par.fbsize, "bw2 ram"); +#if defined(CONFIG_SPARC32) + if (sdev) + all->info.screen_base = (char __iomem *) + prom_getintdefault(sdev->prom_node, "address", 0); +#endif + if (!all->info.screen_base) + all->info.screen_base = + sbus_ioremap(resp, 0, all->par.fbsize, "bw2 ram"); all->info.par = &all->par; bw2_blank(0, &all->info); bw2_init_fix(&all->info, linebytes); - err= register_framebuffer(&all->info); - if (err < 0) { - of_iounmap(all->par.regs, sizeof(struct bw2_regs)); - of_iounmap(all->info.screen_base, all->par.fbsize); + if (register_framebuffer(&all->info) < 0) { + printk(KERN_ERR "bw2: Could not register framebuffer.\n"); kfree(all); - return err; + return; } - dev_set_drvdata(&op->dev, all); - - printk("%s: bwtwo at %lx:%lx\n", - dp->full_name, - all->par.which_io, all->par.physbase); - - return 0; -} - -static int __devinit bw2_probe(struct of_device *dev, const struct of_device_id *match) -{ - struct of_device *op = to_of_device(&dev->dev); + list_add(&all->list, &bw2_list); - return bw2_init_one(op); + printk("bw2: bwtwo at %lx:%lx\n", + (long) (sdev ? sdev->reg_addrs[0].which_io : 0), + (long) all->par.physbase); } -static int __devexit bw2_remove(struct of_device *dev) +int __init bw2_init(void) { - struct all_info *all = dev_get_drvdata(&dev->dev); + struct sbus_bus *sbus; + struct sbus_dev *sdev; - unregister_framebuffer(&all->info); - - of_iounmap(all->par.regs, sizeof(struct bw2_regs)); - of_iounmap(all->info.screen_base, all->par.fbsize); - - kfree(all); + if (fb_get_options("bw2fb", NULL)) + return -ENODEV; - dev_set_drvdata(&dev->dev, NULL); +#ifdef CONFIG_SUN4 + bw2_init_one(NULL); +#endif + for_all_sbusdev(sdev, sbus) { + if (!strcmp(sdev->prom_name, "bwtwo")) + bw2_init_one(sdev); + } return 0; } -static struct of_device_id bw2_match[] = { - { - .name = "bwtwo", - }, - {}, -}; -MODULE_DEVICE_TABLE(of, bw2_match); - -static struct of_platform_driver bw2_driver = { - .name = "bw2", - .match_table = bw2_match, - .probe = bw2_probe, - .remove = __devexit_p(bw2_remove), -}; - -static int __init bw2_init(void) +void __exit bw2_exit(void) { - if (fb_get_options("bw2fb", NULL)) - return -ENODEV; + struct list_head *pos, *tmp; - return of_register_driver(&bw2_driver, &of_bus_type); + list_for_each_safe(pos, tmp, &bw2_list) { + struct all_info *all = list_entry(pos, typeof(*all), list); + + unregister_framebuffer(&all->info); + kfree(all); + } } -static void __exit bw2_exit(void) +int __init +bw2_setup(char *arg) { - return of_unregister_driver(&bw2_driver); + /* No cmdline options yet... */ + return 0; } - module_init(bw2_init); + +#ifdef MODULE module_exit(bw2_exit); +#endif MODULE_DESCRIPTION("framebuffer driver for BWTWO chipsets"); -MODULE_AUTHOR("David S. Miller "); -MODULE_VERSION("2.0"); +MODULE_AUTHOR("David S. Miller "); MODULE_LICENSE("GPL"); diff --git a/drivers/video/cfbcopyarea.c b/drivers/video/cfbcopyarea.c index 6faea4034..74415325b 100644 --- a/drivers/video/cfbcopyarea.c +++ b/drivers/video/cfbcopyarea.c @@ -24,6 +24,7 @@ +#include #include #include #include diff --git a/drivers/video/cfbfillrect.c b/drivers/video/cfbfillrect.c index f00b50aab..e5ff62e9c 100644 --- a/drivers/video/cfbfillrect.c +++ b/drivers/video/cfbfillrect.c @@ -17,6 +17,7 @@ * the native cpu endians. I also need to deal with MSB position in the word. * */ +#include #include #include #include diff --git a/drivers/video/cfbimgblt.c b/drivers/video/cfbimgblt.c index 51d35386a..8ba6152db 100644 --- a/drivers/video/cfbimgblt.c +++ b/drivers/video/cfbimgblt.c @@ -29,6 +29,7 @@ * Also need to add code to deal with cards endians that are different than * the native cpu endians. I also need to deal with MSB position in the word. */ +#include #include #include #include @@ -229,7 +230,6 @@ static inline void fast_imageblit(const struct fb_image *image, struct fb_info * tab = cfb_tab16; break; case 32: - default: tab = cfb_tab32; break; } diff --git a/drivers/video/cg14.c b/drivers/video/cg14.c index 7f926c619..63b6c79c8 100644 --- a/drivers/video/cg14.c +++ b/drivers/video/cg14.c @@ -1,6 +1,6 @@ /* cg14.c: CGFOURTEEN frame buffer driver * - * Copyright (C) 2003, 2006 David S. Miller (davem@davemloft.net) + * Copyright (C) 2003 David S. Miller (davem@redhat.com) * Copyright (C) 1996,1998 Jakub Jelinek (jj@ultra.linux.cz) * Copyright (C) 1995 Miguel de Icaza (miguel@nuclecu.unam.mx) * @@ -18,8 +18,8 @@ #include #include -#include -#include +#include +#include #include #include "sbuslib.h" @@ -99,73 +99,73 @@ static struct fb_ops cg14_ops = { #define CG14_MCR_PIXMODE_32 3 struct cg14_regs{ - u8 mcr; /* Master Control Reg */ - u8 ppr; /* Packed Pixel Reg */ - u8 tms[2]; /* Test Mode Status Regs */ - u8 msr; /* Master Status Reg */ - u8 fsr; /* Fault Status Reg */ - u8 rev; /* Revision & Impl */ - u8 ccr; /* Clock Control Reg */ - u32 tmr; /* Test Mode Read Back */ - u8 mod; /* Monitor Operation Data Reg */ - u8 acr; /* Aux Control */ + volatile u8 mcr; /* Master Control Reg */ + volatile u8 ppr; /* Packed Pixel Reg */ + volatile u8 tms[2]; /* Test Mode Status Regs */ + volatile u8 msr; /* Master Status Reg */ + volatile u8 fsr; /* Fault Status Reg */ + volatile u8 rev; /* Revision & Impl */ + volatile u8 ccr; /* Clock Control Reg */ + volatile u32 tmr; /* Test Mode Read Back */ + volatile u8 mod; /* Monitor Operation Data Reg */ + volatile u8 acr; /* Aux Control */ u8 xxx0[6]; - u16 hct; /* Hor Counter */ - u16 vct; /* Vert Counter */ - u16 hbs; /* Hor Blank Start */ - u16 hbc; /* Hor Blank Clear */ - u16 hss; /* Hor Sync Start */ - u16 hsc; /* Hor Sync Clear */ - u16 csc; /* Composite Sync Clear */ - u16 vbs; /* Vert Blank Start */ - u16 vbc; /* Vert Blank Clear */ - u16 vss; /* Vert Sync Start */ - u16 vsc; /* Vert Sync Clear */ - u16 xcs; - u16 xcc; - u16 fsa; /* Fault Status Address */ - u16 adr; /* Address Registers */ + volatile u16 hct; /* Hor Counter */ + volatile u16 vct; /* Vert Counter */ + volatile u16 hbs; /* Hor Blank Start */ + volatile u16 hbc; /* Hor Blank Clear */ + volatile u16 hss; /* Hor Sync Start */ + volatile u16 hsc; /* Hor Sync Clear */ + volatile u16 csc; /* Composite Sync Clear */ + volatile u16 vbs; /* Vert Blank Start */ + volatile u16 vbc; /* Vert Blank Clear */ + volatile u16 vss; /* Vert Sync Start */ + volatile u16 vsc; /* Vert Sync Clear */ + volatile u16 xcs; + volatile u16 xcc; + volatile u16 fsa; /* Fault Status Address */ + volatile u16 adr; /* Address Registers */ u8 xxx1[0xce]; - u8 pcg[0x100]; /* Pixel Clock Generator */ - u32 vbr; /* Frame Base Row */ - u32 vmcr; /* VBC Master Control */ - u32 vcr; /* VBC refresh */ - u32 vca; /* VBC Config */ + volatile u8 pcg[0x100]; /* Pixel Clock Generator */ + volatile u32 vbr; /* Frame Base Row */ + volatile u32 vmcr; /* VBC Master Control */ + volatile u32 vcr; /* VBC refresh */ + volatile u32 vca; /* VBC Config */ }; #define CG14_CCR_ENABLE 0x04 #define CG14_CCR_SELECT 0x02 /* HW/Full screen */ struct cg14_cursor { - u32 cpl0[32]; /* Enable plane 0 */ - u32 cpl1[32]; /* Color selection plane */ - u8 ccr; /* Cursor Control Reg */ + volatile u32 cpl0[32]; /* Enable plane 0 */ + volatile u32 cpl1[32]; /* Color selection plane */ + volatile u8 ccr; /* Cursor Control Reg */ u8 xxx0[3]; - u16 cursx; /* Cursor x,y position */ - u16 cursy; /* Cursor x,y position */ - u32 color0; - u32 color1; + volatile u16 cursx; /* Cursor x,y position */ + volatile u16 cursy; /* Cursor x,y position */ + volatile u32 color0; + volatile u32 color1; u32 xxx1[0x1bc]; - u32 cpl0i[32]; /* Enable plane 0 autoinc */ - u32 cpl1i[32]; /* Color selection autoinc */ + volatile u32 cpl0i[32]; /* Enable plane 0 autoinc */ + volatile u32 cpl1i[32]; /* Color selection autoinc */ }; struct cg14_dac { - u8 addr; /* Address Register */ + volatile u8 addr; /* Address Register */ u8 xxx0[255]; - u8 glut; /* Gamma table */ + volatile u8 glut; /* Gamma table */ u8 xxx1[255]; - u8 select; /* Register Select */ + volatile u8 select; /* Register Select */ u8 xxx2[255]; - u8 mode; /* Mode Register */ + volatile u8 mode; /* Mode Register */ }; struct cg14_xlut{ - u8 x_xlut [256]; - u8 x_xlutd [256]; + volatile u8 x_xlut [256]; + volatile u8 x_xlutd [256]; u8 xxx0[0x600]; - u8 x_xlut_inc [256]; - u8 x_xlutd_inc [256]; + volatile u8 x_xlut_inc [256]; + volatile u8 x_xlutd_inc [256]; }; /* Color look up table (clut) */ @@ -204,6 +204,7 @@ struct cg14_par { int mode; int ramsize; + struct sbus_dev *sdev; }; static void __cg14_reset(struct cg14_par *par) @@ -354,9 +355,14 @@ static int cg14_ioctl(struct fb_info *info, unsigned int cmd, unsigned long arg) * Initialisation */ -static void cg14_init_fix(struct fb_info *info, int linebytes, struct device_node *dp) +static void cg14_init_fix(struct fb_info *info, int linebytes) { - const char *name = dp->name; + struct cg14_par *par = (struct cg14_par *)info->par; + const char *name; + + name = "cgfourteen"; + if (par->sdev) + name = par->sdev->prom_name; strlcpy(info->fix.id, name, sizeof(info->fix.id)); @@ -450,81 +456,98 @@ static struct sbus_mmap_map __cg14_mmap_map[CG14_MMAP_ENTRIES] __initdata = { struct all_info { struct fb_info info; struct cg14_par par; + struct list_head list; }; +static LIST_HEAD(cg14_list); -static void cg14_unmap_regs(struct all_info *all) -{ - if (all->par.regs) - of_iounmap(all->par.regs, sizeof(struct cg14_regs)); - if (all->par.clut) - of_iounmap(all->par.clut, sizeof(struct cg14_clut)); - if (all->par.cursor) - of_iounmap(all->par.cursor, sizeof(struct cg14_cursor)); - if (all->info.screen_base) - of_iounmap(all->info.screen_base, all->par.fbsize); -} - -static int __devinit cg14_init_one(struct of_device *op) +static void cg14_init_one(struct sbus_dev *sdev, int node, int parent_node) { - struct device_node *dp = op->node; struct all_info *all; - int is_8mb, linebytes, i, err; + unsigned long phys, rphys; + u32 bases[6]; + int is_8mb, linebytes, i; + + if (!sdev) { + if (prom_getproperty(node, "address", + (char *) &bases[0], sizeof(bases)) <= 0 + || !bases[0]) { + printk(KERN_ERR "cg14: Device is not mapped.\n"); + return; + } + if (__get_iospace(bases[0]) != __get_iospace(bases[1])) { + printk(KERN_ERR "cg14: I/O spaces don't match.\n"); + return; + } + } + + all = kmalloc(sizeof(*all), GFP_KERNEL); + if (!all) { + printk(KERN_ERR "cg14: Cannot allocate memory.\n"); + return; + } + memset(all, 0, sizeof(*all)); - all = kzalloc(sizeof(*all), GFP_KERNEL); - if (!all) - return -ENOMEM; + INIT_LIST_HEAD(&all->list); spin_lock_init(&all->par.lock); - sbusfb_fill_var(&all->info.var, dp->node, 8); + sbusfb_fill_var(&all->info.var, node, 8); all->info.var.red.length = 8; all->info.var.green.length = 8; all->info.var.blue.length = 8; - linebytes = of_getintprop_default(dp, "linebytes", - all->info.var.xres); + linebytes = prom_getintdefault(node, "linebytes", + all->info.var.xres); all->par.fbsize = PAGE_ALIGN(linebytes * all->info.var.yres); - if (!strcmp(dp->parent->name, "sbus") || - !strcmp(dp->parent->name, "sbi")) { - all->par.physbase = op->resource[0].start; - all->par.iospace = op->resource[0].flags & IORESOURCE_BITS; + all->par.sdev = sdev; + if (sdev) { + rphys = sdev->reg_addrs[0].phys_addr; + all->par.physbase = phys = sdev->reg_addrs[1].phys_addr; + all->par.iospace = sdev->reg_addrs[0].which_io; + + all->par.regs = sbus_ioremap(&sdev->resource[0], 0, + sizeof(struct cg14_regs), + "cg14 regs"); + all->par.clut = sbus_ioremap(&sdev->resource[0], CG14_CLUT1, + sizeof(struct cg14_clut), + "cg14 clut"); + all->par.cursor = sbus_ioremap(&sdev->resource[0], CG14_CURSORREGS, + sizeof(struct cg14_cursor), + "cg14 cursor"); + all->info.screen_base = sbus_ioremap(&sdev->resource[1], 0, + all->par.fbsize, "cg14 ram"); } else { - all->par.physbase = op->resource[1].start; - all->par.iospace = op->resource[0].flags & IORESOURCE_BITS; + rphys = __get_phys(bases[0]); + all->par.physbase = phys = __get_phys(bases[1]); + all->par.iospace = __get_iospace(bases[0]); + all->par.regs = (struct cg14_regs __iomem *)(unsigned long)bases[0]; + all->par.clut = (struct cg14_clut __iomem *)((unsigned long)bases[0] + + CG14_CLUT1); + all->par.cursor = + (struct cg14_cursor __iomem *)((unsigned long)bases[0] + + CG14_CURSORREGS); + + all->info.screen_base = (char __iomem *)(unsigned long)bases[1]; } - all->par.regs = of_ioremap(&op->resource[0], 0, - sizeof(struct cg14_regs), "cg14 regs"); - all->par.clut = of_ioremap(&op->resource[0], CG14_CLUT1, - sizeof(struct cg14_clut), "cg14 clut"); - all->par.cursor = of_ioremap(&op->resource[0], CG14_CURSORREGS, - sizeof(struct cg14_cursor), "cg14 cursor"); + prom_getproperty(node, "reg", (char *) &bases[0], sizeof(bases)); + is_8mb = (bases[5] == 0x800000); - all->info.screen_base = of_ioremap(&op->resource[1], 0, - all->par.fbsize, "cg14 ram"); + if (sizeof(all->par.mmap_map) != sizeof(__cg14_mmap_map)) { + extern void __cg14_mmap_sized_wrongly(void); - if (!all->par.regs || !all->par.clut || !all->par.cursor || - !all->info.screen_base) - cg14_unmap_regs(all); - - is_8mb = (((op->resource[1].end - op->resource[1].start) + 1) == - (8 * 1024 * 1024)); - - BUILD_BUG_ON(sizeof(all->par.mmap_map) != sizeof(__cg14_mmap_map)); + __cg14_mmap_sized_wrongly(); + } - memcpy(&all->par.mmap_map, &__cg14_mmap_map, - sizeof(all->par.mmap_map)); - + memcpy(&all->par.mmap_map, &__cg14_mmap_map, sizeof(all->par.mmap_map)); for (i = 0; i < CG14_MMAP_ENTRIES; i++) { struct sbus_mmap_map *map = &all->par.mmap_map[i]; if (!map->size) break; if (map->poff & 0x80000000) - map->poff = (map->poff & 0x7fffffff) + - (op->resource[0].start - - op->resource[1].start); + map->poff = (map->poff & 0x7fffffff) + rphys - phys; if (is_8mb && map->size >= 0x100000 && map->size <= 0x400000) @@ -541,87 +564,84 @@ static int __devinit cg14_init_one(struct of_device *op) __cg14_reset(&all->par); if (fb_alloc_cmap(&all->info.cmap, 256, 0)) { - cg14_unmap_regs(all); + printk(KERN_ERR "cg14: Could not allocate color map.\n"); kfree(all); - return -ENOMEM; + return; } fb_set_cmap(&all->info.cmap, &all->info); - cg14_init_fix(&all->info, linebytes, dp); + cg14_init_fix(&all->info, linebytes); - err = register_framebuffer(&all->info); - if (err < 0) { + if (register_framebuffer(&all->info) < 0) { + printk(KERN_ERR "cg14: Could not register framebuffer.\n"); fb_dealloc_cmap(&all->info.cmap); - cg14_unmap_regs(all); kfree(all); - return err; + return; } - dev_set_drvdata(&op->dev, all); - - printk("%s: cgfourteen at %lx:%lx, %dMB\n", - dp->full_name, - all->par.iospace, all->par.physbase, - all->par.ramsize >> 20); - - return 0; -} + list_add(&all->list, &cg14_list); -static int __devinit cg14_probe(struct of_device *dev, const struct of_device_id *match) -{ - struct of_device *op = to_of_device(&dev->dev); + printk("cg14: cgfourteen at %lx:%lx, %dMB\n", + all->par.iospace, all->par.physbase, all->par.ramsize >> 20); - return cg14_init_one(op); } -static int __devexit cg14_remove(struct of_device *dev) +int __init cg14_init(void) { - struct all_info *all = dev_get_drvdata(&dev->dev); - - unregister_framebuffer(&all->info); - fb_dealloc_cmap(&all->info.cmap); - - cg14_unmap_regs(all); + struct sbus_bus *sbus; + struct sbus_dev *sdev; - kfree(all); + if (fb_get_options("cg14fb", NULL)) + return -ENODEV; - dev_set_drvdata(&dev->dev, NULL); +#ifdef CONFIG_SPARC32 + { + int root, node; + + root = prom_getchild(prom_root_node); + root = prom_searchsiblings(root, "obio"); + if (root) { + node = prom_searchsiblings(prom_getchild(root), + "cgfourteen"); + if (node) + cg14_init_one(NULL, node, root); + } + } +#endif + for_all_sbusdev(sdev, sbus) { + if (!strcmp(sdev->prom_name, "cgfourteen")) + cg14_init_one(sdev, sdev->prom_node, sbus->prom_node); + } return 0; } -static struct of_device_id cg14_match[] = { - { - .name = "cgfourteen", - }, - {}, -}; -MODULE_DEVICE_TABLE(of, cg14_match); - -static struct of_platform_driver cg14_driver = { - .name = "cg14", - .match_table = cg14_match, - .probe = cg14_probe, - .remove = __devexit_p(cg14_remove), -}; - -int __init cg14_init(void) +void __exit cg14_exit(void) { - if (fb_get_options("cg14fb", NULL)) - return -ENODEV; + struct list_head *pos, *tmp; - return of_register_driver(&cg14_driver, &of_bus_type); + list_for_each_safe(pos, tmp, &cg14_list) { + struct all_info *all = list_entry(pos, typeof(*all), list); + + unregister_framebuffer(&all->info); + fb_dealloc_cmap(&all->info.cmap); + kfree(all); + } } -void __exit cg14_exit(void) +int __init +cg14_setup(char *arg) { - of_unregister_driver(&cg14_driver); + /* No cmdline options yet... */ + return 0; } module_init(cg14_init); + +#ifdef MODULE module_exit(cg14_exit); +#endif MODULE_DESCRIPTION("framebuffer driver for CGfourteen chipsets"); -MODULE_AUTHOR("David S. Miller "); -MODULE_VERSION("2.0"); +MODULE_AUTHOR("David S. Miller "); MODULE_LICENSE("GPL"); diff --git a/drivers/video/cg3.c b/drivers/video/cg3.c index 9c8c753ef..3de6e1b5a 100644 --- a/drivers/video/cg3.c +++ b/drivers/video/cg3.c @@ -1,6 +1,6 @@ /* cg3.c: CGTHREE frame buffer driver * - * Copyright (C) 2003, 2006 David S. Miller (davem@davemloft.net) + * Copyright (C) 2003 David S. Miller (davem@redhat.com) * Copyright (C) 1996,1998 Jakub Jelinek (jj@ultra.linux.cz) * Copyright (C) 1996 Miguel de Icaza (miguel@nuclecu.unam.mx) * Copyright (C) 1997 Eddie C. Dost (ecd@skynet.be) @@ -19,9 +19,8 @@ #include #include +#include #include -#include -#include #include #include "sbuslib.h" @@ -81,30 +80,30 @@ enum cg3_type { }; struct bt_regs { - u32 addr; - u32 color_map; - u32 control; - u32 cursor; + volatile u32 addr; + volatile u32 color_map; + volatile u32 control; + volatile u32 cursor; }; struct cg3_regs { struct bt_regs cmap; - u8 control; - u8 status; - u8 cursor_start; - u8 cursor_end; - u8 h_blank_start; - u8 h_blank_end; - u8 h_sync_start; - u8 h_sync_end; - u8 comp_sync_end; - u8 v_blank_start_high; - u8 v_blank_start_low; - u8 v_blank_end; - u8 v_sync_start; - u8 v_sync_end; - u8 xfer_holdoff_start; - u8 xfer_holdoff_end; + volatile u8 control; + volatile u8 status; + volatile u8 cursor_start; + volatile u8 cursor_end; + volatile u8 h_blank_start; + volatile u8 h_blank_end; + volatile u8 h_sync_start; + volatile u8 h_sync_end; + volatile u8 comp_sync_end; + volatile u8 v_blank_start_high; + volatile u8 v_blank_start_low; + volatile u8 v_blank_end; + volatile u8 v_sync_start; + volatile u8 v_sync_end; + volatile u8 xfer_holdoff_start; + volatile u8 xfer_holdoff_end; }; /* Offset of interesting structures in the OBIO space */ @@ -121,8 +120,9 @@ struct cg3_par { #define CG3_FLAG_RDI 0x00000002 unsigned long physbase; - unsigned long which_io; unsigned long fbsize; + + struct sbus_dev *sdev; }; /** @@ -235,7 +235,7 @@ static int cg3_mmap(struct fb_info *info, struct vm_area_struct *vma) return sbusfb_mmap_helper(cg3_mmap_map, par->physbase, par->fbsize, - par->which_io, + par->sdev->reg_addrs[0].which_io, vma); } @@ -252,9 +252,11 @@ static int cg3_ioctl(struct fb_info *info, unsigned int cmd, unsigned long arg) */ static void -cg3_init_fix(struct fb_info *info, int linebytes, struct device_node *dp) +cg3_init_fix(struct fb_info *info, int linebytes) { - strlcpy(info->fix.id, dp->name, sizeof(info->fix.id)); + struct cg3_par *par = (struct cg3_par *)info->par; + + strlcpy(info->fix.id, par->sdev->prom_name, sizeof(info->fix.id)); info->fix.type = FB_TYPE_PACKED_PIXELS; info->fix.visual = FB_VISUAL_PSEUDOCOLOR; @@ -265,15 +267,16 @@ cg3_init_fix(struct fb_info *info, int linebytes, struct device_node *dp) } static void cg3_rdi_maybe_fixup_var(struct fb_var_screeninfo *var, - struct device_node *dp) + struct sbus_dev *sdev) { - char *params; + char buffer[40]; char *p; int ww, hh; - params = of_get_property(dp, "params", NULL); - if (params) { - ww = simple_strtoul(params, &p, 10); + *buffer = 0; + prom_getstring(sdev->prom_node, "params", buffer, sizeof(buffer)); + if (*buffer) { + ww = simple_strtoul(buffer, &p, 10); if (ww && *p == 'x') { hh = simple_strtoul(p + 1, &p, 10); if (hh && *p == '-') { @@ -345,11 +348,11 @@ static void cg3_do_default_mode(struct cg3_par *par) sbus_writeb(p[1], regp); } for (p = cg3_dacvals; *p; p += 2) { - u8 __iomem *regp; + volatile u8 __iomem *regp; - regp = (u8 __iomem *)&par->regs->cmap.addr; + regp = (volatile u8 __iomem *)&par->regs->cmap.addr; sbus_writeb(p[0], regp); - regp = (u8 __iomem *)&par->regs->cmap.control; + regp = (volatile u8 __iomem *)&par->regs->cmap.control; sbus_writeb(p[1], regp); } } @@ -357,137 +360,129 @@ static void cg3_do_default_mode(struct cg3_par *par) struct all_info { struct fb_info info; struct cg3_par par; + struct list_head list; }; +static LIST_HEAD(cg3_list); -static int __devinit cg3_init_one(struct of_device *op) +static void cg3_init_one(struct sbus_dev *sdev) { - struct device_node *dp = op->node; struct all_info *all; - int linebytes, err; + int linebytes; + + all = kmalloc(sizeof(*all), GFP_KERNEL); + if (!all) { + printk(KERN_ERR "cg3: Cannot allocate memory.\n"); + return; + } + memset(all, 0, sizeof(*all)); - all = kzalloc(sizeof(*all), GFP_KERNEL); - if (!all) - return -ENOMEM; + INIT_LIST_HEAD(&all->list); spin_lock_init(&all->par.lock); + all->par.sdev = sdev; - all->par.physbase = op->resource[0].start; - all->par.which_io = op->resource[0].flags & IORESOURCE_BITS; + all->par.physbase = sdev->reg_addrs[0].phys_addr; - sbusfb_fill_var(&all->info.var, dp->node, 8); + sbusfb_fill_var(&all->info.var, sdev->prom_node, 8); all->info.var.red.length = 8; all->info.var.green.length = 8; all->info.var.blue.length = 8; - if (!strcmp(dp->name, "cgRDI")) + if (!strcmp(sdev->prom_name, "cgRDI")) all->par.flags |= CG3_FLAG_RDI; if (all->par.flags & CG3_FLAG_RDI) - cg3_rdi_maybe_fixup_var(&all->info.var, dp); + cg3_rdi_maybe_fixup_var(&all->info.var, sdev); - linebytes = of_getintprop_default(dp, "linebytes", - all->info.var.xres); + linebytes = prom_getintdefault(sdev->prom_node, "linebytes", + all->info.var.xres); all->par.fbsize = PAGE_ALIGN(linebytes * all->info.var.yres); - all->par.regs = of_ioremap(&op->resource[0], CG3_REGS_OFFSET, - sizeof(struct cg3_regs), "cg3 regs"); + all->par.regs = sbus_ioremap(&sdev->resource[0], CG3_REGS_OFFSET, + sizeof(struct cg3_regs), "cg3 regs"); all->info.flags = FBINFO_DEFAULT; all->info.fbops = &cg3_ops; - all->info.screen_base = - of_ioremap(&op->resource[0], CG3_RAM_OFFSET, - all->par.fbsize, "cg3 ram"); +#ifdef CONFIG_SPARC32 + all->info.screen_base = (char __iomem *) + prom_getintdefault(sdev->prom_node, "address", 0); +#endif + if (!all->info.screen_base) + all->info.screen_base = + sbus_ioremap(&sdev->resource[0], CG3_RAM_OFFSET, + all->par.fbsize, "cg3 ram"); all->info.par = &all->par; cg3_blank(0, &all->info); - if (!of_find_property(dp, "width", NULL)) + if (!prom_getbool(sdev->prom_node, "width")) cg3_do_default_mode(&all->par); if (fb_alloc_cmap(&all->info.cmap, 256, 0)) { - of_iounmap(all->par.regs, sizeof(struct cg3_regs)); - of_iounmap(all->info.screen_base, all->par.fbsize); + printk(KERN_ERR "cg3: Could not allocate color map.\n"); kfree(all); - return -ENOMEM; + return; } fb_set_cmap(&all->info.cmap, &all->info); - cg3_init_fix(&all->info, linebytes, dp); + cg3_init_fix(&all->info, linebytes); - err = register_framebuffer(&all->info); - if (err < 0) { + if (register_framebuffer(&all->info) < 0) { + printk(KERN_ERR "cg3: Could not register framebuffer.\n"); fb_dealloc_cmap(&all->info.cmap); - of_iounmap(all->par.regs, sizeof(struct cg3_regs)); - of_iounmap(all->info.screen_base, all->par.fbsize); kfree(all); - return err; + return; } - dev_set_drvdata(&op->dev, all); - - printk("%s: cg3 at %lx:%lx\n", - dp->full_name, all->par.which_io, all->par.physbase); + list_add(&all->list, &cg3_list); - return 0; + printk("cg3: %s at %lx:%lx\n", + sdev->prom_name, + (long) sdev->reg_addrs[0].which_io, + (long) sdev->reg_addrs[0].phys_addr); } -static int __devinit cg3_probe(struct of_device *dev, const struct of_device_id *match) +int __init cg3_init(void) { - struct of_device *op = to_of_device(&dev->dev); + struct sbus_bus *sbus; + struct sbus_dev *sdev; - return cg3_init_one(op); -} - -static int __devexit cg3_remove(struct of_device *dev) -{ - struct all_info *all = dev_get_drvdata(&dev->dev); - - unregister_framebuffer(&all->info); - fb_dealloc_cmap(&all->info.cmap); - - of_iounmap(all->par.regs, sizeof(struct cg3_regs)); - of_iounmap(all->info.screen_base, all->par.fbsize); - - kfree(all); + if (fb_get_options("cg3fb", NULL)) + return -ENODEV; - dev_set_drvdata(&dev->dev, NULL); + for_all_sbusdev(sdev, sbus) { + if (!strcmp(sdev->prom_name, "cgthree") || + !strcmp(sdev->prom_name, "cgRDI")) + cg3_init_one(sdev); + } return 0; } -static struct of_device_id cg3_match[] = { - { - .name = "cgthree", - }, - { - .name = "cgRDI", - }, - {}, -}; -MODULE_DEVICE_TABLE(of, cg3_match); - -static struct of_platform_driver cg3_driver = { - .name = "cg3", - .match_table = cg3_match, - .probe = cg3_probe, - .remove = __devexit_p(cg3_remove), -}; - -static int __init cg3_init(void) +void __exit cg3_exit(void) { - if (fb_get_options("cg3fb", NULL)) - return -ENODEV; + struct list_head *pos, *tmp; + + list_for_each_safe(pos, tmp, &cg3_list) { + struct all_info *all = list_entry(pos, typeof(*all), list); - return of_register_driver(&cg3_driver, &of_bus_type); + unregister_framebuffer(&all->info); + fb_dealloc_cmap(&all->info.cmap); + kfree(all); + } } -static void __exit cg3_exit(void) +int __init +cg3_setup(char *arg) { - of_unregister_driver(&cg3_driver); + /* No cmdline options yet... */ + return 0; } module_init(cg3_init); + +#ifdef MODULE module_exit(cg3_exit); +#endif MODULE_DESCRIPTION("framebuffer driver for CGthree chipsets"); -MODULE_AUTHOR("David S. Miller "); -MODULE_VERSION("2.0"); +MODULE_AUTHOR("David S. Miller "); MODULE_LICENSE("GPL"); diff --git a/drivers/video/cg6.c b/drivers/video/cg6.c index 64146be2e..7aab91ead 100644 --- a/drivers/video/cg6.c +++ b/drivers/video/cg6.c @@ -1,6 +1,6 @@ /* cg6.c: CGSIX (GX, GXplus, TGX) frame buffer driver * - * Copyright (C) 2003, 2006 David S. Miller (davem@davemloft.net) + * Copyright (C) 2003 David S. Miller (davem@redhat.com) * Copyright (C) 1996,1998 Jakub Jelinek (jj@ultra.linux.cz) * Copyright (C) 1996 Miguel de Icaza (miguel@nuclecu.unam.mx) * Copyright (C) 1996 Eddie C. Dost (ecd@skynet.be) @@ -19,8 +19,8 @@ #include #include -#include -#include +#include +#include #include #include "sbuslib.h" @@ -164,89 +164,89 @@ static struct fb_ops cg6_ops = { /* The contents are unknown */ struct cg6_tec { - int tec_matrix; - int tec_clip; - int tec_vdc; + volatile int tec_matrix; + volatile int tec_clip; + volatile int tec_vdc; }; struct cg6_thc { - u32 thc_pad0[512]; - u32 thc_hs; /* hsync timing */ - u32 thc_hsdvs; - u32 thc_hd; - u32 thc_vs; /* vsync timing */ - u32 thc_vd; - u32 thc_refresh; - u32 thc_misc; - u32 thc_pad1[56]; - u32 thc_cursxy; /* cursor x,y position (16 bits each) */ - u32 thc_cursmask[32]; /* cursor mask bits */ - u32 thc_cursbits[32]; /* what to show where mask enabled */ + uint thc_pad0[512]; + volatile uint thc_hs; /* hsync timing */ + volatile uint thc_hsdvs; + volatile uint thc_hd; + volatile uint thc_vs; /* vsync timing */ + volatile uint thc_vd; + volatile uint thc_refresh; + volatile uint thc_misc; + uint thc_pad1[56]; + volatile uint thc_cursxy; /* cursor x,y position (16 bits each) */ + volatile uint thc_cursmask[32]; /* cursor mask bits */ + volatile uint thc_cursbits[32]; /* what to show where mask enabled */ }; struct cg6_fbc { - u32 xxx0[1]; - u32 mode; - u32 clip; - u32 xxx1[1]; - u32 s; - u32 draw; - u32 blit; - u32 font; - u32 xxx2[24]; - u32 x0, y0, z0, color0; - u32 x1, y1, z1, color1; - u32 x2, y2, z2, color2; - u32 x3, y3, z3, color3; - u32 offx, offy; - u32 xxx3[2]; - u32 incx, incy; - u32 xxx4[2]; - u32 clipminx, clipminy; - u32 xxx5[2]; - u32 clipmaxx, clipmaxy; - u32 xxx6[2]; - u32 fg; - u32 bg; - u32 alu; - u32 pm; - u32 pixelm; - u32 xxx7[2]; - u32 patalign; - u32 pattern[8]; - u32 xxx8[432]; - u32 apointx, apointy, apointz; - u32 xxx9[1]; - u32 rpointx, rpointy, rpointz; - u32 xxx10[5]; - u32 pointr, pointg, pointb, pointa; - u32 alinex, aliney, alinez; - u32 xxx11[1]; - u32 rlinex, rliney, rlinez; - u32 xxx12[5]; - u32 liner, lineg, lineb, linea; - u32 atrix, atriy, atriz; - u32 xxx13[1]; - u32 rtrix, rtriy, rtriz; - u32 xxx14[5]; - u32 trir, trig, trib, tria; - u32 aquadx, aquady, aquadz; - u32 xxx15[1]; - u32 rquadx, rquady, rquadz; - u32 xxx16[5]; - u32 quadr, quadg, quadb, quada; - u32 arectx, arecty, arectz; - u32 xxx17[1]; - u32 rrectx, rrecty, rrectz; - u32 xxx18[5]; - u32 rectr, rectg, rectb, recta; + u32 xxx0[1]; + volatile u32 mode; + volatile u32 clip; + u32 xxx1[1]; + volatile u32 s; + volatile u32 draw; + volatile u32 blit; + volatile u32 font; + u32 xxx2[24]; + volatile u32 x0, y0, z0, color0; + volatile u32 x1, y1, z1, color1; + volatile u32 x2, y2, z2, color2; + volatile u32 x3, y3, z3, color3; + volatile u32 offx, offy; + u32 xxx3[2]; + volatile u32 incx, incy; + u32 xxx4[2]; + volatile u32 clipminx, clipminy; + u32 xxx5[2]; + volatile u32 clipmaxx, clipmaxy; + u32 xxx6[2]; + volatile u32 fg; + volatile u32 bg; + volatile u32 alu; + volatile u32 pm; + volatile u32 pixelm; + u32 xxx7[2]; + volatile u32 patalign; + volatile u32 pattern[8]; + u32 xxx8[432]; + volatile u32 apointx, apointy, apointz; + u32 xxx9[1]; + volatile u32 rpointx, rpointy, rpointz; + u32 xxx10[5]; + volatile u32 pointr, pointg, pointb, pointa; + volatile u32 alinex, aliney, alinez; + u32 xxx11[1]; + volatile u32 rlinex, rliney, rlinez; + u32 xxx12[5]; + volatile u32 liner, lineg, lineb, linea; + volatile u32 atrix, atriy, atriz; + u32 xxx13[1]; + volatile u32 rtrix, rtriy, rtriz; + u32 xxx14[5]; + volatile u32 trir, trig, trib, tria; + volatile u32 aquadx, aquady, aquadz; + u32 xxx15[1]; + volatile u32 rquadx, rquady, rquadz; + u32 xxx16[5]; + volatile u32 quadr, quadg, quadb, quada; + volatile u32 arectx, arecty, arectz; + u32 xxx17[1]; + volatile u32 rrectx, rrecty, rrectz; + u32 xxx18[5]; + volatile u32 rectr, rectg, rectb, recta; }; struct bt_regs { - u32 addr; - u32 color_map; - u32 control; - u32 cursor; + volatile u32 addr; + volatile u32 color_map; + volatile u32 control; + volatile u32 cursor; }; struct cg6_par { @@ -255,14 +255,15 @@ struct cg6_par { struct cg6_fbc __iomem *fbc; struct cg6_thc __iomem *thc; struct cg6_tec __iomem *tec; - u32 __iomem *fhc; + volatile u32 __iomem *fhc; u32 flags; #define CG6_FLAG_BLANKED 0x00000001 unsigned long physbase; - unsigned long which_io; unsigned long fbsize; + + struct sbus_dev *sdev; }; static int cg6_sync(struct fb_info *info) @@ -528,7 +529,8 @@ static int cg6_mmap(struct fb_info *info, struct vm_area_struct *vma) return sbusfb_mmap_helper(cg6_mmap_map, par->physbase, par->fbsize, - par->which_io, vma); + par->sdev->reg_addrs[0].which_io, + vma); } static int cg6_ioctl(struct fb_info *info, unsigned int cmd, unsigned long arg) @@ -656,75 +658,62 @@ static void cg6_chip_init(struct fb_info *info) struct all_info { struct fb_info info; struct cg6_par par; + struct list_head list; }; +static LIST_HEAD(cg6_list); -static void cg6_unmap_regs(struct all_info *all) -{ - if (all->par.fbc) - of_iounmap(all->par.fbc, 4096); - if (all->par.tec) - of_iounmap(all->par.tec, sizeof(struct cg6_tec)); - if (all->par.thc) - of_iounmap(all->par.thc, sizeof(struct cg6_thc)); - if (all->par.bt) - of_iounmap(all->par.bt, sizeof(struct bt_regs)); - if (all->par.fhc) - of_iounmap(all->par.fhc, sizeof(u32)); - - if (all->info.screen_base) - of_iounmap(all->info.screen_base, all->par.fbsize); -} - -static int __devinit cg6_init_one(struct of_device *op) +static void cg6_init_one(struct sbus_dev *sdev) { - struct device_node *dp = op->node; struct all_info *all; - int linebytes, err; + int linebytes; - all = kzalloc(sizeof(*all), GFP_KERNEL); - if (!all) - return -ENOMEM; + all = kmalloc(sizeof(*all), GFP_KERNEL); + if (!all) { + printk(KERN_ERR "cg6: Cannot allocate memory.\n"); + return; + } + memset(all, 0, sizeof(*all)); + + INIT_LIST_HEAD(&all->list); spin_lock_init(&all->par.lock); + all->par.sdev = sdev; - all->par.physbase = op->resource[0].start; - all->par.which_io = op->resource[0].flags & IORESOURCE_BITS; + all->par.physbase = sdev->reg_addrs[0].phys_addr; - sbusfb_fill_var(&all->info.var, dp->node, 8); + sbusfb_fill_var(&all->info.var, sdev->prom_node, 8); all->info.var.red.length = 8; all->info.var.green.length = 8; all->info.var.blue.length = 8; - linebytes = of_getintprop_default(dp, "linebytes", - all->info.var.xres); + linebytes = prom_getintdefault(sdev->prom_node, "linebytes", + all->info.var.xres); all->par.fbsize = PAGE_ALIGN(linebytes * all->info.var.yres); - if (of_find_property(dp, "dblbuf", NULL)) + if (prom_getbool(sdev->prom_node, "dblbuf")) all->par.fbsize *= 4; - all->par.fbc = of_ioremap(&op->resource[0], CG6_FBC_OFFSET, - 4096, "cgsix fbc"); - all->par.tec = of_ioremap(&op->resource[0], CG6_TEC_OFFSET, - sizeof(struct cg6_tec), "cgsix tec"); - all->par.thc = of_ioremap(&op->resource[0], CG6_THC_OFFSET, - sizeof(struct cg6_thc), "cgsix thc"); - all->par.bt = of_ioremap(&op->resource[0], CG6_BROOKTREE_OFFSET, - sizeof(struct bt_regs), "cgsix dac"); - all->par.fhc = of_ioremap(&op->resource[0], CG6_FHC_OFFSET, - sizeof(u32), "cgsix fhc"); + all->par.fbc = sbus_ioremap(&sdev->resource[0], CG6_FBC_OFFSET, + 4096, "cgsix fbc"); + all->par.tec = sbus_ioremap(&sdev->resource[0], CG6_TEC_OFFSET, + sizeof(struct cg6_tec), "cgsix tec"); + all->par.thc = sbus_ioremap(&sdev->resource[0], CG6_THC_OFFSET, + sizeof(struct cg6_thc), "cgsix thc"); + all->par.bt = sbus_ioremap(&sdev->resource[0], CG6_BROOKTREE_OFFSET, + sizeof(struct bt_regs), "cgsix dac"); + all->par.fhc = sbus_ioremap(&sdev->resource[0], CG6_FHC_OFFSET, + sizeof(u32), "cgsix fhc"); all->info.flags = FBINFO_DEFAULT | FBINFO_HWACCEL_IMAGEBLIT | FBINFO_HWACCEL_COPYAREA | FBINFO_HWACCEL_FILLRECT; all->info.fbops = &cg6_ops; - - all->info.screen_base = of_ioremap(&op->resource[0], CG6_RAM_OFFSET, - all->par.fbsize, "cgsix ram"); - if (!all->par.fbc || !all->par.tec || !all->par.thc || - !all->par.bt || !all->par.fhc || !all->info.screen_base) { - cg6_unmap_regs(all); - kfree(all); - return -ENOMEM; - } - +#ifdef CONFIG_SPARC32 + all->info.screen_base = (char __iomem *) + prom_getintdefault(sdev->prom_node, "address", 0); +#endif + if (!all->info.screen_base) + all->info.screen_base = + sbus_ioremap(&sdev->resource[0], CG6_RAM_OFFSET, + all->par.fbsize, "cgsix ram"); all->info.par = &all->par; all->info.var.accel_flags = FB_ACCELF_TEXT; @@ -734,90 +723,72 @@ static int __devinit cg6_init_one(struct of_device *op) cg6_blank(0, &all->info); if (fb_alloc_cmap(&all->info.cmap, 256, 0)) { - cg6_unmap_regs(all); + printk(KERN_ERR "cg6: Could not allocate color map.\n"); kfree(all); - return -ENOMEM; + return; } fb_set_cmap(&all->info.cmap, &all->info); cg6_init_fix(&all->info, linebytes); - err = register_framebuffer(&all->info); - if (err < 0) { - cg6_unmap_regs(all); + if (register_framebuffer(&all->info) < 0) { + printk(KERN_ERR "cg6: Could not register framebuffer.\n"); fb_dealloc_cmap(&all->info.cmap); kfree(all); - return err; + return; } - dev_set_drvdata(&op->dev, all); + list_add(&all->list, &cg6_list); - printk("%s: CGsix [%s] at %lx:%lx\n", - dp->full_name, + printk("cg6: CGsix [%s] at %lx:%lx\n", all->info.fix.id, - all->par.which_io, all->par.physbase); - - return 0; + (long) sdev->reg_addrs[0].which_io, + (long) sdev->reg_addrs[0].phys_addr); } -static int __devinit cg6_probe(struct of_device *dev, const struct of_device_id *match) +int __init cg6_init(void) { - struct of_device *op = to_of_device(&dev->dev); - - return cg6_init_one(op); -} - -static int __devexit cg6_remove(struct of_device *dev) -{ - struct all_info *all = dev_get_drvdata(&dev->dev); - - unregister_framebuffer(&all->info); - fb_dealloc_cmap(&all->info.cmap); + struct sbus_bus *sbus; + struct sbus_dev *sdev; - cg6_unmap_regs(all); - - kfree(all); + if (fb_get_options("cg6fb", NULL)) + return -ENODEV; - dev_set_drvdata(&dev->dev, NULL); + for_all_sbusdev(sdev, sbus) { + if (!strcmp(sdev->prom_name, "cgsix") || + !strcmp(sdev->prom_name, "cgthree+")) + cg6_init_one(sdev); + } return 0; } -static struct of_device_id cg6_match[] = { - { - .name = "cgsix", - }, - { - .name = "cgthree+", - }, - {}, -}; -MODULE_DEVICE_TABLE(of, cg6_match); - -static struct of_platform_driver cg6_driver = { - .name = "cg6", - .match_table = cg6_match, - .probe = cg6_probe, - .remove = __devexit_p(cg6_remove), -}; - -static int __init cg6_init(void) +void __exit cg6_exit(void) { - if (fb_get_options("cg6fb", NULL)) - return -ENODEV; + struct list_head *pos, *tmp; - return of_register_driver(&cg6_driver, &of_bus_type); + list_for_each_safe(pos, tmp, &cg6_list) { + struct all_info *all = list_entry(pos, typeof(*all), list); + + unregister_framebuffer(&all->info); + fb_dealloc_cmap(&all->info.cmap); + kfree(all); + } } -static void __exit cg6_exit(void) +int __init +cg6_setup(char *arg) { - of_unregister_driver(&cg6_driver); + /* No cmdline options yet... */ + return 0; } module_init(cg6_init); + +#ifdef MODULE module_exit(cg6_exit); +#endif MODULE_DESCRIPTION("framebuffer driver for CGsix chipsets"); -MODULE_AUTHOR("David S. Miller "); -MODULE_VERSION("2.0"); +MODULE_AUTHOR("David S. Miller "); MODULE_LICENSE("GPL"); diff --git a/drivers/video/chipsfb.c b/drivers/video/chipsfb.c index 73cb426bf..bc061d4ec 100644 --- a/drivers/video/chipsfb.c +++ b/drivers/video/chipsfb.c @@ -14,11 +14,13 @@ * more details. */ +#include #include #include #include #include #include +#include #include #include #include @@ -146,23 +148,9 @@ static int chipsfb_set_par(struct fb_info *info) static int chipsfb_blank(int blank, struct fb_info *info) { #ifdef CONFIG_PMAC_BACKLIGHT - mutex_lock(&pmac_backlight_mutex); - - if (pmac_backlight) { - /* used to disable backlight only for blank > 1, but it seems - * useful at blank = 1 too (saves battery, extends backlight - * life) - */ - down(&pmac_backlight->sem); - if (blank) - pmac_backlight->props->power = FB_BLANK_POWERDOWN; - else - pmac_backlight->props->power = FB_BLANK_UNBLANK; - pmac_backlight->props->update_status(pmac_backlight); - up(&pmac_backlight->sem); - } - - mutex_unlock(&pmac_backlight_mutex); + // used to disable backlight only for blank > 1, but it seems + // useful at blank = 1 too (saves battery, extends backlight life) + set_backlight_enable(!blank); #endif /* CONFIG_PMAC_BACKLIGHT */ return 1; /* get fb_blank to set the colormap to all black */ @@ -190,6 +178,8 @@ 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 }, { 0x01, 0x01 }, @@ -297,18 +287,18 @@ static void __init chips_hw_init(void) { int i; - for (i = 0; i < ARRAY_SIZE(chips_init_xr); ++i) + for (i = 0; i < N_ELTS(chips_init_xr); ++i) write_xr(chips_init_xr[i].addr, chips_init_xr[i].data); outb(0x29, 0x3c2); /* set misc output reg */ - for (i = 0; i < ARRAY_SIZE(chips_init_sr); ++i) + for (i = 0; i < N_ELTS(chips_init_sr); ++i) write_sr(chips_init_sr[i].addr, chips_init_sr[i].data); - for (i = 0; i < ARRAY_SIZE(chips_init_gr); ++i) + for (i = 0; i < N_ELTS(chips_init_gr); ++i) write_gr(chips_init_gr[i].addr, chips_init_gr[i].data); - for (i = 0; i < ARRAY_SIZE(chips_init_ar); ++i) + for (i = 0; i < N_ELTS(chips_init_ar); ++i) write_ar(chips_init_ar[i].addr, chips_init_ar[i].data); - for (i = 0; i < ARRAY_SIZE(chips_init_cr); ++i) + for (i = 0; i < N_ELTS(chips_init_cr); ++i) write_cr(chips_init_cr[i].addr, chips_init_cr[i].data); - for (i = 0; i < ARRAY_SIZE(chips_init_fr); ++i) + for (i = 0; i < N_ELTS(chips_init_fr); ++i) write_fr(chips_init_fr[i].addr, chips_init_fr[i].data); } @@ -413,14 +403,7 @@ chipsfb_pci_init(struct pci_dev *dp, const struct pci_device_id *ent) #ifdef CONFIG_PMAC_BACKLIGHT /* turn on the backlight */ - mutex_lock(&pmac_backlight_mutex); - if (pmac_backlight) { - down(&pmac_backlight->sem); - pmac_backlight->props->power = FB_BLANK_UNBLANK; - pmac_backlight->props->update_status(pmac_backlight); - up(&pmac_backlight->sem); - } - mutex_unlock(&pmac_backlight_mutex); + set_backlight_enable(1); #endif /* CONFIG_PMAC_BACKLIGHT */ #ifdef CONFIG_PPC diff --git a/drivers/video/cirrusfb.c b/drivers/video/cirrusfb.c index daf43f535..e0dbdfc0c 100644 --- a/drivers/video/cirrusfb.c +++ b/drivers/video/cirrusfb.c @@ -36,11 +36,13 @@ #define CIRRUSFB_VERSION "2.0-pre2" +#include #include #include #include #include #include +#include #include #include #include @@ -58,8 +60,8 @@ #include #endif #ifdef CONFIG_PPC_PREP -#include -#define isPReP (machine_is(prep)) +#include +#define isPReP (_machine == _MACH_prep) #else #define isPReP 0 #endif @@ -2225,6 +2227,7 @@ static void cirrusfb_pci_unmap (struct cirrusfb_info *cinfo) release_region(0x3C0, 32); pci_release_regions(pdev); framebuffer_release(cinfo->info); + pci_disable_device(pdev); } #endif /* CONFIG_PCI */ @@ -2455,6 +2458,7 @@ err_release_regions: err_release_fb: framebuffer_release(info); err_disable: + pci_disable_device(pdev); err_out: return ret; } @@ -2618,7 +2622,7 @@ static int __init cirrusfb_init(void) #endif #ifdef CONFIG_ZORRO - error |= zorro_register_driver(&cirrusfb_zorro_driver); + error |= zorro_module_init(&cirrusfb_zorro_driver); #endif #ifdef CONFIG_PCI error |= pci_register_driver(&cirrusfb_pci_driver); diff --git a/drivers/video/console/Kconfig b/drivers/video/console/Kconfig index 4444bef68..6ee449858 100644 --- a/drivers/video/console/Kconfig +++ b/drivers/video/console/Kconfig @@ -26,30 +26,6 @@ config VGA_CONSOLE # fi # fi -config VGACON_SOFT_SCROLLBACK - bool "Enable Scrollback Buffer in System RAM" - depends on VGA_CONSOLE - default n - help - The scrollback buffer of the standard VGA console is located in - the VGA RAM. The size of this RAM is fixed and is quite small. - If you require a larger scrollback buffer, this can be placed in - System RAM which is dynamically allocated during intialization. - Placing the scrollback buffer in System RAM will slightly slow - down the console. - - If you want this feature, say 'Y' here and enter the amount of - RAM to allocate for this buffer. If unsure, say 'N'. - -config VGACON_SOFT_SCROLLBACK_SIZE - int "Scrollback Buffer Size (in KB)" - depends on VGACON_SOFT_SCROLLBACK - default "64" - help - Enter the amount of System RAM to allocate for the scrollback - buffer. Each 64KB will give you approximately 16 80x25 - screenfuls of scrollback buffer - config VIDEO_SELECT bool "Video mode selection support" depends on X86 && VGA_CONSOLE diff --git a/drivers/video/console/bitblit.c b/drivers/video/console/bitblit.c index 308850df1..eea422eb1 100644 --- a/drivers/video/console/bitblit.c +++ b/drivers/video/console/bitblit.c @@ -10,6 +10,7 @@ * more details. */ +#include #include #include #include diff --git a/drivers/video/console/dummycon.c b/drivers/video/console/dummycon.c index d9315d994..1ecda91e5 100644 --- a/drivers/video/console/dummycon.c +++ b/drivers/video/console/dummycon.c @@ -7,9 +7,9 @@ #include #include +#include #include #include -#include #include #include @@ -22,6 +22,7 @@ #define DUMMY_ROWS ORIG_VIDEO_LINES #elif defined(__hppa__) /* set by Kconfig. Use 80x25 for 640x480 and 160x64 for 1280x1024 */ +#include #define DUMMY_COLUMNS CONFIG_DUMMY_CONSOLE_COLUMNS #define DUMMY_ROWS CONFIG_DUMMY_CONSOLE_ROWS #else diff --git a/drivers/video/console/fbcon.c b/drivers/video/console/fbcon.c index 6165fd966..041d06987 100644 --- a/drivers/video/console/fbcon.c +++ b/drivers/video/console/fbcon.c @@ -58,12 +58,14 @@ #undef FBCONDEBUG +#include #include #include #include #include #include #include /* MSch: for IRQ probe */ +#include #include #include #include @@ -123,8 +125,6 @@ static int softback_lines; static int first_fb_vc; static int last_fb_vc = MAX_NR_CONSOLES - 1; static int fbcon_is_default = 1; -static int fbcon_has_exited; - /* font data */ static char fontname[40]; @@ -140,6 +140,7 @@ static const struct consw fb_con; #define advance_row(p, delta) (unsigned short *)((unsigned long)(p) + (delta) * vc->vc_size_row) +static void fbcon_free_font(struct display *); static int fbcon_set_origin(struct vc_data *); #define CURSOR_DRAW_DELAY (1) @@ -193,9 +194,6 @@ static void fbcon_redraw_move(struct vc_data *vc, struct display *p, int line, int count, int dy); static void fbcon_modechanged(struct fb_info *info); static void fbcon_set_all_vcs(struct fb_info *info); -static void fbcon_start(void); -static void fbcon_exit(void); -static struct class_device *fbcon_class_device; #ifdef CONFIG_MAC /* @@ -254,7 +252,7 @@ static void fbcon_rotate_all(struct fb_info *info, u32 rotate) if (!ops || ops->currcon < 0 || rotate > 3) return; - for (i = first_fb_vc; i <= last_fb_vc; i++) { + for (i = 0; i < MAX_NR_CONSOLES; i++) { vc = vc_cons[i].d; if (!vc || vc->vc_mode != KD_TEXT || registered_fb[con2fb_map[i]] != info) @@ -391,18 +389,15 @@ static void fb_flashcursor(void *private) int c; int mode; - acquire_console_sem(); - if (ops && ops->currcon != -1) + if (ops->currcon != -1) vc = vc_cons[ops->currcon].d; if (!vc || !CON_IS_VISIBLE(vc) || fbcon_is_inactive(vc, info) || registered_fb[con2fb_map[vc->vc_num]] != info || - vc_cons[ops->currcon].d->vc_deccm != 1) { - release_console_sem(); + vc_cons[ops->currcon].d->vc_deccm != 1) return; - } - + acquire_console_sem(); p = &fb_display[vc->vc_num]; c = scr_readw((u16 *) vc->vc_pos); mode = (!ops->cursor_flash || ops->cursor_state.enable) ? @@ -471,7 +466,7 @@ static int __init fb_console_setup(char *this_opt) int i, j; if (!this_opt || !*this_opt) - return 1; + return 0; while ((options = strsep(&this_opt, ",")) != NULL) { if (!strncmp(options, "font:", 5)) @@ -486,10 +481,10 @@ static int __init fb_console_setup(char *this_opt) options++; } if (*options != ',') - return 1; + return 0; options++; } else - return 1; + return 0; } if (!strncmp(options, "map:", 4)) { @@ -501,7 +496,7 @@ static int __init fb_console_setup(char *this_opt) con2fb_map_boot[i] = (options[j++]-'0') % FB_MAX; } - return 1; + return 0; } if (!strncmp(options, "vc:", 3)) { @@ -523,7 +518,7 @@ static int __init fb_console_setup(char *this_opt) rotate = 0; } } - return 1; + return 0; } __setup("fbcon=", fb_console_setup); @@ -533,7 +528,7 @@ static int search_fb_in_map(int idx) { int i, retval = 0; - for (i = first_fb_vc; i <= last_fb_vc; i++) { + for (i = 0; i < MAX_NR_CONSOLES; i++) { if (con2fb_map[i] == idx) retval = 1; } @@ -544,7 +539,7 @@ static int search_for_mapped_con(void) { int i, retval = 0; - for (i = first_fb_vc; i <= last_fb_vc; i++) { + for (i = 0; i < MAX_NR_CONSOLES; i++) { if (con2fb_map[i] != -1) retval = 1; } @@ -566,7 +561,6 @@ static int fbcon_takeover(int show_logo) err = take_over_console(&fb_con, first_fb_vc, last_fb_vc, fbcon_is_default); - if (err) { for (i = first_fb_vc; i <= last_fb_vc; i++) { con2fb_map[i] = -1; @@ -801,8 +795,8 @@ static int set_con2fb_map(int unit, int newidx, int user) if (oldidx == newidx) return 0; - if (!info || fbcon_has_exited) - return -EINVAL; + if (!info) + err = -EINVAL; if (!err && !search_for_mapped_con()) { info_idx = newidx; @@ -838,9 +832,6 @@ static int set_con2fb_map(int unit, int newidx, int user) con2fb_init_display(vc, info, unit, show_logo); } - if (!search_fb_in_map(info_idx)) - info_idx = newidx; - release_console_sem(); return err; } @@ -1043,7 +1034,6 @@ static const char *fbcon_startup(void) #endif /* CONFIG_MAC */ fbcon_add_cursor_timer(info); - fbcon_has_exited = 0; return display_desc; } @@ -1071,36 +1061,17 @@ static void fbcon_init(struct vc_data *vc, int init) /* If we are not the first console on this fb, copy the font from that console */ - t = &fb_display[fg_console]; - if (!p->fontdata) { - if (t->fontdata) { - struct vc_data *fvc = vc_cons[fg_console].d; - - vc->vc_font.data = (void *)(p->fontdata = - fvc->vc_font.data); - vc->vc_font.width = fvc->vc_font.width; - vc->vc_font.height = fvc->vc_font.height; - p->userfont = t->userfont; - - if (p->userfont) - REFCOUNT(p->fontdata)++; - } else { - const struct font_desc *font = NULL; - - if (!fontname[0] || !(font = find_font(fontname))) - font = get_default_font(info->var.xres, - info->var.yres); - vc->vc_font.width = font->width; - vc->vc_font.height = font->height; - vc->vc_font.data = (void *)(p->fontdata = font->data); - vc->vc_font.charcount = 256; /* FIXME Need to - support more fonts */ - } + t = &fb_display[svc->vc_num]; + if (!vc->vc_font.data) { + vc->vc_font.data = (void *)(p->fontdata = t->fontdata); + vc->vc_font.width = (*default_mode)->vc_font.width; + vc->vc_font.height = (*default_mode)->vc_font.height; + p->userfont = t->userfont; + if (p->userfont) + REFCOUNT(p->fontdata)++; } - if (p->userfont) charcnt = FNTCHARCNT(p->fontdata); - vc->vc_can_do_color = (fb_get_color_depth(&info->var, &info->fix)!=1); vc->vc_complement_mask = vc->vc_can_do_color ? 0x7700 : 0x0800; if (charcnt == 256) { @@ -1171,50 +1142,15 @@ static void fbcon_init(struct vc_data *vc, int init) set_blitting_type(vc, info); } - ops->p = &fb_display[fg_console]; -} - -static void fbcon_free_font(struct display *p) -{ - if (p->userfont && p->fontdata && (--REFCOUNT(p->fontdata) == 0)) - kfree(p->fontdata - FONT_EXTRA_WORDS * sizeof(int)); - p->fontdata = NULL; - p->userfont = 0; } static void fbcon_deinit(struct vc_data *vc) { struct display *p = &fb_display[vc->vc_num]; - struct fb_info *info; - struct fbcon_ops *ops; - int idx; + if (info_idx != -1) + return; fbcon_free_font(p); - idx = con2fb_map[vc->vc_num]; - - if (idx == -1) - goto finished; - - info = registered_fb[idx]; - - if (!info) - goto finished; - - ops = info->fbcon_par; - - if (!ops) - goto finished; - - if (CON_IS_VISIBLE(vc)) - fbcon_del_cursor_timer(info); - - ops->flags &= ~FBCON_FLAGS_INIT; -finished: - - if (!con_is_bound(&fb_con)) - fbcon_exit(); - - return; } /* ====================================================================== */ @@ -1808,7 +1744,7 @@ static int fbcon_scroll(struct vc_data *vc, int t, int b, int dir, fbcon_redraw_move(vc, p, 0, t, count); ypan_up_redraw(vc, t, count); if (vc->vc_rows - b > 0) - fbcon_redraw_move(vc, p, b, + fbcon_redraw_move(vc, p, b - count, vc->vc_rows - b, b); } else fbcon_redraw_move(vc, p, t + count, b - t - count, t); @@ -2162,11 +2098,12 @@ static int fbcon_switch(struct vc_data *vc) if (info->fbops->fb_set_par) info->fbops->fb_set_par(info); - if (old_info != info) + if (old_info != info) { fbcon_del_cursor_timer(old_info); + fbcon_add_cursor_timer(info); + } } - fbcon_add_cursor_timer(info); set_blitting_type(vc, info); ops->cursor_reset = 1; @@ -2284,6 +2221,14 @@ static int fbcon_blank(struct vc_data *vc, int blank, int mode_switch) return 0; } +static void fbcon_free_font(struct display *p) +{ + if (p->userfont && p->fontdata && (--REFCOUNT(p->fontdata) == 0)) + kfree(p->fontdata - FONT_EXTRA_WORDS * sizeof(int)); + p->fontdata = NULL; + p->userfont = 0; +} + static int fbcon_get_font(struct vc_data *vc, struct console_font *font) { u8 *fontdata = vc->vc_font.data; @@ -2497,7 +2442,7 @@ static int fbcon_set_font(struct vc_data *vc, struct console_font *font, unsigne FNTSUM(new_data) = csum; /* Check if the same font is on some other console already */ - for (i = first_fb_vc; i <= last_fb_vc; i++) { + for (i = 0; i < MAX_NR_CONSOLES; i++) { struct vc_data *tmp = vc_cons[i].d; if (fb_display[i].userfont && @@ -2685,7 +2630,7 @@ static int fbcon_scrolldelta(struct vc_data *vc, int lines) scr_memcpyw((u16 *) q, (u16 *) p, vc->vc_size_row); } - softback_in = softback_curr = p; + softback_in = p; update_region(vc, vc->vc_origin, logo_lines * vc->vc_cols); } @@ -2822,7 +2767,7 @@ static void fbcon_set_all_vcs(struct fb_info *info) if (!ops || ops->currcon < 0) return; - for (i = first_fb_vc; i <= last_fb_vc; i++) { + for (i = 0; i < MAX_NR_CONSOLES; i++) { vc = vc_cons[i].d; if (!vc || vc->vc_mode != KD_TEXT || registered_fb[con2fb_map[i]] != info) @@ -2884,57 +2829,22 @@ static int fbcon_mode_deleted(struct fb_info *info, return found; } -static int fbcon_fb_unregistered(int idx) -{ - int i; - - for (i = first_fb_vc; i <= last_fb_vc; i++) { - if (con2fb_map[i] == idx) - con2fb_map[i] = -1; - } - - if (idx == info_idx) { - info_idx = -1; - - for (i = 0; i < FB_MAX; i++) { - if (registered_fb[i] != NULL) { - info_idx = i; - break; - } - } - } - - if (info_idx != -1) { - for (i = first_fb_vc; i <= last_fb_vc; i++) { - if (con2fb_map[i] == -1) - con2fb_map[i] = info_idx; - } - } - - if (!num_registered_fb) - unregister_con_driver(&fb_con); - - return 0; -} - static int fbcon_fb_registered(int idx) { int ret = 0, i; if (info_idx == -1) { - for (i = first_fb_vc; i <= last_fb_vc; i++) { + for (i = 0; i < MAX_NR_CONSOLES; i++) { if (con2fb_map_boot[i] == idx) { info_idx = idx; break; } } - if (info_idx != -1) ret = fbcon_takeover(1); } else { - for (i = first_fb_vc; i <= last_fb_vc; i++) { - if (con2fb_map_boot[i] == idx && - con2fb_map[i] == -1) + for (i = 0; i < MAX_NR_CONSOLES; i++) { + if (con2fb_map_boot[i] == idx) set_con2fb_map(i, idx, 0); } } @@ -2971,7 +2881,7 @@ static void fbcon_new_modelist(struct fb_info *info) struct fb_var_screeninfo var; struct fb_videomode *mode; - for (i = first_fb_vc; i <= last_fb_vc; i++) { + for (i = 0; i < MAX_NR_CONSOLES; i++) { if (registered_fb[con2fb_map[i]] != info) continue; if (!fb_display[i].mode) @@ -2999,14 +2909,6 @@ static int fbcon_event_notify(struct notifier_block *self, struct fb_con2fbmap *con2fb; int ret = 0; - /* - * ignore all events except driver registration and deregistration - * if fbcon is not active - */ - if (fbcon_has_exited && !(action == FB_EVENT_FB_REGISTERED || - action == FB_EVENT_FB_UNREGISTERED)) - goto done; - switch(action) { case FB_EVENT_SUSPEND: fbcon_suspended(info); @@ -3027,9 +2929,6 @@ static int fbcon_event_notify(struct notifier_block *self, case FB_EVENT_FB_REGISTERED: ret = fbcon_fb_registered(info->node); break; - case FB_EVENT_FB_UNREGISTERED: - ret = fbcon_fb_unregistered(info->node); - break; case FB_EVENT_SET_CONSOLE_MAP: con2fb = event->data; ret = set_con2fb_map(con2fb->console - 1, @@ -3045,9 +2944,16 @@ static int fbcon_event_notify(struct notifier_block *self, case FB_EVENT_NEW_MODELIST: fbcon_new_modelist(info); break; + case FB_EVENT_SET_CON_ROTATE: + fbcon_rotate(info, *(int *)event->data); + break; + case FB_EVENT_GET_CON_ROTATE: + ret = fbcon_get_rotate(info); + break; + case FB_EVENT_SET_CON_ROTATE_ALL: + fbcon_rotate_all(info, *(int *)event->data); } -done: return ret; } @@ -3085,184 +2991,27 @@ static struct notifier_block fbcon_event_notifier = { .notifier_call = fbcon_event_notify, }; -static ssize_t store_rotate(struct class_device *class_device, - const char *buf, size_t count) -{ - struct fb_info *info; - int rotate, idx; - char **last = NULL; - - if (fbcon_has_exited) - return count; - - acquire_console_sem(); - idx = con2fb_map[fg_console]; - - if (idx == -1 || registered_fb[idx] == NULL) - goto err; - - info = registered_fb[idx]; - rotate = simple_strtoul(buf, last, 0); - fbcon_rotate(info, rotate); -err: - release_console_sem(); - return count; -} - -static ssize_t store_rotate_all(struct class_device *class_device, - const char *buf, size_t count) -{ - struct fb_info *info; - int rotate, idx; - char **last = NULL; - - if (fbcon_has_exited) - return count; - - acquire_console_sem(); - idx = con2fb_map[fg_console]; - - if (idx == -1 || registered_fb[idx] == NULL) - goto err; - - info = registered_fb[idx]; - rotate = simple_strtoul(buf, last, 0); - fbcon_rotate_all(info, rotate); -err: - release_console_sem(); - return count; -} - -static ssize_t show_rotate(struct class_device *class_device, char *buf) +static int __init fb_console_init(void) { - struct fb_info *info; - int rotate = 0, idx; - - if (fbcon_has_exited) - return 0; + int i; acquire_console_sem(); - idx = con2fb_map[fg_console]; - - if (idx == -1 || registered_fb[idx] == NULL) - goto err; - - info = registered_fb[idx]; - rotate = fbcon_get_rotate(info); -err: + fb_register_client(&fbcon_event_notifier); release_console_sem(); - return snprintf(buf, PAGE_SIZE, "%d\n", rotate); -} - -static struct class_device_attribute class_device_attrs[] = { - __ATTR(rotate, S_IRUGO|S_IWUSR, show_rotate, store_rotate), - __ATTR(rotate_all, S_IWUSR, NULL, store_rotate_all), -}; - -static int fbcon_init_class_device(void) -{ - int i; - for (i = 0; i < ARRAY_SIZE(class_device_attrs); i++) - class_device_create_file(fbcon_class_device, - &class_device_attrs[i]); - return 0; -} + for (i = 0; i < MAX_NR_CONSOLES; i++) + con2fb_map[i] = -1; -static void fbcon_start(void) -{ if (num_registered_fb) { - int i; - - acquire_console_sem(); - for (i = 0; i < FB_MAX; i++) { if (registered_fb[i] != NULL) { info_idx = i; break; } } - - release_console_sem(); fbcon_takeover(0); } -} - -static void fbcon_exit(void) -{ - struct fb_info *info; - int i, j, mapped; - - if (fbcon_has_exited) - return; - -#ifdef CONFIG_ATARI - free_irq(IRQ_AUTO_4, fbcon_vbl_handler); -#endif -#ifdef CONFIG_MAC - if (MACH_IS_MAC && vbl_detected) - free_irq(IRQ_MAC_VBL, fbcon_vbl_handler); -#endif - - kfree((void *)softback_buf); - softback_buf = 0UL; - - for (i = 0; i < FB_MAX; i++) { - mapped = 0; - info = registered_fb[i]; - - if (info == NULL) - continue; - - for (j = first_fb_vc; j <= last_fb_vc; j++) { - if (con2fb_map[j] == i) - mapped = 1; - } - - if (mapped) { - if (info->fbops->fb_release) - info->fbops->fb_release(info, 0); - module_put(info->fbops->owner); - - if (info->fbcon_par) { - struct fbcon_ops *ops = info->fbcon_par; - - fbcon_del_cursor_timer(info); - kfree(ops->cursor_src); - kfree(info->fbcon_par); - info->fbcon_par = NULL; - } - - if (info->queue.func == fb_flashcursor) - info->queue.func = NULL; - } - } - - fbcon_has_exited = 1; -} -static int __init fb_console_init(void) -{ - int i; - - acquire_console_sem(); - fb_register_client(&fbcon_event_notifier); - fbcon_class_device = - class_device_create(fb_class, NULL, MKDEV(0, 0), NULL, "fbcon"); - - if (IS_ERR(fbcon_class_device)) { - printk(KERN_WARNING "Unable to create class_device " - "for fbcon; errno = %ld\n", - PTR_ERR(fbcon_class_device)); - fbcon_class_device = NULL; - } else - fbcon_init_class_device(); - - for (i = 0; i < MAX_NR_CONSOLES; i++) - con2fb_map[i] = -1; - - release_console_sem(); - fbcon_start(); return 0; } @@ -3270,24 +3019,12 @@ module_init(fb_console_init); #ifdef MODULE -static void __exit fbcon_deinit_class_device(void) -{ - int i; - - for (i = 0; i < ARRAY_SIZE(class_device_attrs); i++) - class_device_remove_file(fbcon_class_device, - &class_device_attrs[i]); -} - static void __exit fb_console_exit(void) { acquire_console_sem(); fb_unregister_client(&fbcon_event_notifier); - fbcon_deinit_class_device(); - class_device_destroy(fb_class, MKDEV(0, 0)); - fbcon_exit(); release_console_sem(); - unregister_con_driver(&fb_con); + give_up_console(&fb_con); } module_exit(fb_console_exit); diff --git a/drivers/video/console/fbcon.h b/drivers/video/console/fbcon.h index b9386d168..c38c3d8e7 100644 --- a/drivers/video/console/fbcon.h +++ b/drivers/video/console/fbcon.h @@ -11,6 +11,7 @@ #ifndef _VIDEO_FBCON_H #define _VIDEO_FBCON_H +#include #include #include #include @@ -80,8 +81,6 @@ struct fbcon_ops { char *cursor_data; u8 *fontbuffer; u8 *fontdata; - u8 *cursor_src; - u32 cursor_size; u32 fd_size; }; /* @@ -176,7 +175,6 @@ extern void fbcon_set_tileops(struct vc_data *vc, struct fb_info *info); #endif extern void fbcon_set_bitops(struct fbcon_ops *ops); extern int soft_cursor(struct fb_info *info, struct fb_cursor *cursor); -extern struct class *fb_class; #define FBCON_ATTRIBUTE_UNDERLINE 1 #define FBCON_ATTRIBUTE_REVERSE 2 diff --git a/drivers/video/console/fbcon_ccw.c b/drivers/video/console/fbcon_ccw.c index 4481c80b8..990289a69 100644 --- a/drivers/video/console/fbcon_ccw.c +++ b/drivers/video/console/fbcon_ccw.c @@ -8,6 +8,7 @@ * more details. */ +#include #include #include #include diff --git a/drivers/video/console/fbcon_cw.c b/drivers/video/console/fbcon_cw.c index 7f92c06af..d44c5fa51 100644 --- a/drivers/video/console/fbcon_cw.c +++ b/drivers/video/console/fbcon_cw.c @@ -8,6 +8,7 @@ * more details. */ +#include #include #include #include diff --git a/drivers/video/console/fbcon_rotate.c b/drivers/video/console/fbcon_rotate.c index 00884e013..2dc091fbd 100644 --- a/drivers/video/console/fbcon_rotate.c +++ b/drivers/video/console/fbcon_rotate.c @@ -8,6 +8,7 @@ * more details. */ +#include #include #include #include diff --git a/drivers/video/console/fbcon_ud.c b/drivers/video/console/fbcon_ud.c index ab91005e6..f56ed068a 100644 --- a/drivers/video/console/fbcon_ud.c +++ b/drivers/video/console/fbcon_ud.c @@ -8,6 +8,7 @@ * more details. */ +#include #include #include #include diff --git a/drivers/video/console/font_acorn_8x8.c b/drivers/video/console/font_acorn_8x8.c index 40f3d4eeb..2d2e39632 100644 --- a/drivers/video/console/font_acorn_8x8.c +++ b/drivers/video/console/font_acorn_8x8.c @@ -1,5 +1,6 @@ /* Acorn-like font definition, with PC graphics characters */ +#include #include static const unsigned char acorndata_8x8[] = { diff --git a/drivers/video/console/fonts.c b/drivers/video/console/fonts.c index c960728b7..4fd07d9ec 100644 --- a/drivers/video/console/fonts.c +++ b/drivers/video/console/fonts.c @@ -12,6 +12,7 @@ * for more details. */ +#include #include #include #include @@ -65,7 +66,7 @@ static const struct font_desc *fonts[] = { #endif }; -#define num_fonts ARRAY_SIZE(fonts) +#define num_fonts (sizeof(fonts)/sizeof(*fonts)) #ifdef NO_FONTS #error No fonts configured. diff --git a/drivers/video/console/mdacon.c b/drivers/video/console/mdacon.c index eb4d03fa5..989e4d49e 100644 --- a/drivers/video/console/mdacon.c +++ b/drivers/video/console/mdacon.c @@ -31,6 +31,7 @@ #include #include #include +#include #include #include #include @@ -197,7 +198,7 @@ static int __init mdacon_setup(char *str) __setup("mdacon=", mdacon_setup); #endif -static int mda_detect(void) +static int __init mda_detect(void) { int count=0; u16 *p, p_save; @@ -282,7 +283,7 @@ static int mda_detect(void) return 1; } -static void mda_initialize(void) +static void __init mda_initialize(void) { write_mda_b(97, 0x00); /* horizontal total */ write_mda_b(80, 0x01); /* horizontal displayed */ @@ -307,13 +308,13 @@ static void mda_initialize(void) outb_p(0x00, mda_gfx_port); } -static const char *mdacon_startup(void) +static const char __init *mdacon_startup(void) { mda_num_columns = 80; mda_num_lines = 25; + mda_vram_base = VGA_MAP_MEM(0xb0000); mda_vram_len = 0x01000; - mda_vram_base = VGA_MAP_MEM(0xb0000, mda_vram_len); mda_index_port = 0x3b4; mda_value_port = 0x3b5; diff --git a/drivers/video/console/newport_con.c b/drivers/video/console/newport_con.c index 7fa1afeae..762c7a593 100644 --- a/drivers/video/console/newport_con.c +++ b/drivers/video/console/newport_con.c @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -50,7 +51,6 @@ static int topscan; static int xcurs_correction = 29; static int newport_xsize; static int newport_ysize; -static int newport_has_init; static int newport_set_def_font(int unit, struct console_font *op); @@ -149,7 +149,7 @@ static inline void newport_clear_lines(int ystart, int yend, int ci) newport_clear_screen(0, ystart, 1280 + 63, yend, ci); } -static void newport_reset(void) +void newport_reset(void) { unsigned short treg; int i; @@ -193,7 +193,7 @@ static void newport_reset(void) * calculate the actual screen size by reading * the video timing out of the VC2 */ -static void newport_get_screensize(void) +void newport_get_screensize(void) { int i, cols; unsigned short ventry, treg; @@ -283,15 +283,6 @@ static void newport_get_revisions(void) xcurs_correction = 21; } -static void newport_exit(void) -{ - int i; - - /* free memory used by user font */ - for (i = 0; i < MAX_NR_CONSOLES; i++) - newport_set_def_font(i, NULL); -} - /* Can't be __init, take_over_console may call it later */ static const char *newport_startup(void) { @@ -299,10 +290,8 @@ static const char *newport_startup(void) if (!sgi_gfxaddr) return NULL; - - if (!npregs) - npregs = (struct newport_regs *)/* ioremap cannot fail */ - ioremap(sgi_gfxaddr, sizeof(struct newport_regs)); + npregs = (struct newport_regs *) /* ioremap cannot fail */ + ioremap(sgi_gfxaddr, sizeof(struct newport_regs)); npregs->cset.config = NPORT_CFG_GD0; if (newport_wait(npregs)) @@ -318,11 +307,11 @@ static const char *newport_startup(void) newport_reset(); newport_get_revisions(); newport_get_screensize(); - newport_has_init = 1; return "SGI Newport"; out_unmap: + iounmap((void *)npregs); return NULL; } @@ -335,10 +324,11 @@ static void newport_init(struct vc_data *vc, int init) static void newport_deinit(struct vc_data *c) { - if (!con_is_bound(&newport_con) && newport_has_init) { - newport_exit(); - newport_has_init = 0; - } + int i; + + /* free memory used by user font */ + for (i = 0; i < MAX_NR_CONSOLES; i++) + newport_set_def_font(i, NULL); } static void newport_clear(struct vc_data *vc, int sy, int sx, int height, @@ -738,23 +728,16 @@ const struct consw newport_con = { #ifdef MODULE static int __init newport_console_init(void) { - - if (!sgi_gfxaddr) - return NULL; - - if (!npregs) - npregs = (struct newport_regs *)/* ioremap cannot fail */ - ioremap(sgi_gfxaddr, sizeof(struct newport_regs)); - return take_over_console(&newport_con, 0, MAX_NR_CONSOLES - 1, 1); } -module_init(newport_console_init); static void __exit newport_console_exit(void) { give_up_console(&newport_con); iounmap((void *)npregs); } + +module_init(newport_console_init); module_exit(newport_console_exit); #endif diff --git a/drivers/video/console/promcon.c b/drivers/video/console/promcon.c index b78eac634..04f42fcaa 100644 --- a/drivers/video/console/promcon.c +++ b/drivers/video/console/promcon.c @@ -5,11 +5,13 @@ * Copyright (C) 1998 Jakub Jelinek (jj@ultra.linux.cz) */ +#include #include #include #include #include #include +#include #include #include #include @@ -107,7 +109,7 @@ promcon_end(struct vc_data *conp, char *b) return b - p; } -const char *promcon_startup(void) +const char __init *promcon_startup(void) { const char *display_desc = "PROM"; int node; @@ -131,7 +133,7 @@ const char *promcon_startup(void) return display_desc; } -static void +static void __init promcon_init_unimap(struct vc_data *conp) { mm_segment_t old_fs = get_fs(); diff --git a/drivers/video/console/softcursor.c b/drivers/video/console/softcursor.c index 7d07d8383..3957fc752 100644 --- a/drivers/video/console/softcursor.c +++ b/drivers/video/console/softcursor.c @@ -10,6 +10,7 @@ #include #include +#include #include #include @@ -20,12 +21,11 @@ int soft_cursor(struct fb_info *info, struct fb_cursor *cursor) { - struct fbcon_ops *ops = info->fbcon_par; unsigned int scan_align = info->pixmap.scan_align - 1; unsigned int buf_align = info->pixmap.buf_align - 1; unsigned int i, size, dsize, s_pitch, d_pitch; struct fb_image *image; - u8 *dst; + u8 *dst, *src; if (info->state != FBINFO_STATE_RUNNING) return 0; @@ -33,19 +33,11 @@ int soft_cursor(struct fb_info *info, struct fb_cursor *cursor) s_pitch = (cursor->image.width + 7) >> 3; dsize = s_pitch * cursor->image.height; - if (dsize + sizeof(struct fb_image) != ops->cursor_size) { - if (ops->cursor_src != NULL) - kfree(ops->cursor_src); - ops->cursor_size = dsize + sizeof(struct fb_image); + src = kmalloc(dsize + sizeof(struct fb_image), GFP_ATOMIC); + if (!src) + return -ENOMEM; - ops->cursor_src = kmalloc(ops->cursor_size, GFP_ATOMIC); - if (!ops->cursor_src) { - ops->cursor_size = 0; - return -ENOMEM; - } - } - - image = (struct fb_image *) (ops->cursor_src + dsize); + image = (struct fb_image *) (src + dsize); *image = cursor->image; d_pitch = (s_pitch + scan_align) & ~scan_align; @@ -57,23 +49,21 @@ int soft_cursor(struct fb_info *info, struct fb_cursor *cursor) switch (cursor->rop) { case ROP_XOR: for (i = 0; i < dsize; i++) - ops->cursor_src[i] = image->data[i] ^ - cursor->mask[i]; + src[i] = image->data[i] ^ cursor->mask[i]; break; case ROP_COPY: default: for (i = 0; i < dsize; i++) - ops->cursor_src[i] = image->data[i] & - cursor->mask[i]; + src[i] = image->data[i] & cursor->mask[i]; break; } } else - memcpy(ops->cursor_src, image->data, dsize); + memcpy(src, image->data, dsize); - fb_pad_aligned_buffer(dst, d_pitch, ops->cursor_src, s_pitch, - image->height); + fb_pad_aligned_buffer(dst, d_pitch, src, s_pitch, image->height); image->data = dst; info->fbops->fb_imageblit(info, image); + kfree(src); return 0; } diff --git a/drivers/video/console/sticon.c b/drivers/video/console/sticon.c index 45586aaab..fd5940f41 100644 --- a/drivers/video/console/sticon.c +++ b/drivers/video/console/sticon.c @@ -37,6 +37,7 @@ #include #include +#include #include #include #include @@ -74,7 +75,7 @@ static inline void cursor_undrawn(void) cursor_drawn = 0; } -static const char *sticon_startup(void) +static const char *__init sticon_startup(void) { return "STI console"; } diff --git a/drivers/video/console/sticore.c b/drivers/video/console/sticore.c index 88e7038ea..0339f5640 100644 --- a/drivers/video/console/sticore.c +++ b/drivers/video/console/sticore.c @@ -13,6 +13,7 @@ * */ +#include #include #include #include @@ -274,7 +275,7 @@ static int __init sti_setup(char *str) if (str) strlcpy (default_sti_path, str, sizeof (default_sti_path)); - return 1; + return 0; } /* Assuming the machine has multiple STI consoles (=graphic cards) which @@ -320,7 +321,7 @@ static int __init sti_font_setup(char *str) i++; } - return 1; + return 0; } /* The optional linux kernel parameter "sti_font" defines which font @@ -372,7 +373,7 @@ sti_dump_globcfg(struct sti_glob_cfg *glob_cfg, unsigned int sti_mem_request) glob_cfg->save_addr)); /* dump extended cfg */ - cfg = PTR_STI((unsigned long)glob_cfg->ext_ptr); + cfg = PTR_STI(glob_cfg->ext_ptr); DPRINTK(( KERN_INFO "monitor %d\n" "in friendly mode: %d\n" @@ -452,11 +453,25 @@ sti_init_glob_cfg(struct sti_struct *sti, sti->regions_phys[i] = REGION_OFFSET_TO_PHYS(sti->regions[i], newhpa); + /* remap virtually */ + /* FIXME: add BTLB support if btlb==1 */ len = sti->regions[i].region_desc.length * 4096; + +/* XXX: Enabling IOREMAP debugging causes a crash, so we must be passing + * a virtual address to something expecting a physical address that doesn't + * go through a readX macro */ +#if 0 + if (len) + glob_cfg->region_ptrs[i] = (unsigned long) ( + sti->regions[i].region_desc.cache ? + ioremap(sti->regions_phys[i], len) : + ioremap_nocache(sti->regions_phys[i], len) ); +#else if (len) glob_cfg->region_ptrs[i] = sti->regions_phys[i]; +#endif - DPRINTK(("region #%d: phys %08lx, region_ptr %08x, len=%lukB, " + DPRINTK(("region #%d: phys %08lx, virt %08x, len=%lukB, " "btlb=%d, sysonly=%d, cache=%d, last=%d\n", i, sti->regions_phys[i], glob_cfg->region_ptrs[i], len/1024, diff --git a/drivers/video/console/tileblit.c b/drivers/video/console/tileblit.c index d981fe4d8..153352ca9 100644 --- a/drivers/video/console/tileblit.c +++ b/drivers/video/console/tileblit.c @@ -8,6 +8,7 @@ * more details. */ +#include #include #include #include diff --git a/drivers/video/console/vgacon.c b/drivers/video/console/vgacon.c index 0a2c10a1a..5a8697853 100644 --- a/drivers/video/console/vgacon.c +++ b/drivers/video/console/vgacon.c @@ -33,11 +33,13 @@ * more details. */ +#include #include #include #include #include #include +#include #include #include #include @@ -47,7 +49,6 @@ #include #include #include -#include #include #include ", 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 */ @@ -1266,30 +818,42 @@ ConfigMainWindow::ConfigMainWindow(void) QWidget *d = configApp->desktop(); - width = configSettings->readNumEntry("/window width", d->width() - 64); - height = configSettings->readNumEntry("/window height", d->height() - 64); + 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); resize(width, height); - x = configSettings->readNumEntry("/window x", 0, &ok); + x = configSettings->readNumEntry("/kconfig/qconf/window x", 0, &ok); if (ok) - y = configSettings->readNumEntry("/window y", 0, &ok); + y = configSettings->readNumEntry("/kconfig/qconf/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, "menu"); + menuView = new ConfigView(split1, this, configSettings); menuList = menuView->list; split2 = new QSplitter(split1); split2->setOrientation(QSplitter::Vertical); // create config tree - configView = new ConfigView(split2, "config"); + configView = new ConfigView(split2, this, configSettings); configList = configView->list; - helpText = new ConfigInfoView(split2, "help"); + helpText = new QTextView(split2); helpText->setTextFormat(Qt::RichText); setTabOrder(configList, helpText); @@ -1309,8 +873,6 @@ 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); @@ -1320,29 +882,24 @@ ConfigMainWindow::ConfigMainWindow(void) QAction *showNameAction = new QAction(NULL, "Show Name", 0, this); showNameAction->setToggleAction(TRUE); - connect(showNameAction, SIGNAL(toggled(bool)), configView, SLOT(setShowName(bool))); - connect(configView, SIGNAL(showNameChanged(bool)), showNameAction, SLOT(setOn(bool))); - showNameAction->setOn(configView->showName()); + showNameAction->setOn(configList->showName); + connect(showNameAction, SIGNAL(toggled(bool)), SLOT(setShowName(bool))); 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); - connect(showDebugAction, SIGNAL(toggled(bool)), helpText, SLOT(setShowDebug(bool))); - connect(helpText, SIGNAL(showDebugChanged(bool)), showDebugAction, SLOT(setOn(bool))); - showDebugAction->setOn(helpText->showDebug()); + showDebugAction->setOn(showDebug); + connect(showDebugAction, SIGNAL(toggled(bool)), SLOT(setShowDebug(bool))); QAction *showIntroAction = new QAction(NULL, "Introduction", 0, this); connect(showIntroAction, SIGNAL(activated()), SLOT(showIntro())); @@ -1366,8 +923,6 @@ ConfigMainWindow::ConfigMainWindow(void) saveAction->addTo(config); saveAsAction->addTo(config); config->insertSeparator(); - searchAction->addTo(config); - config->insertSeparator(); quitAction->addTo(config); // create options menu @@ -1387,27 +942,20 @@ 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(struct menu *)), - helpText, SLOT(setInfo(struct menu *))); - connect(menuList, SIGNAL(gotFocus(struct menu *)), - helpText, SLOT(setInfo(struct menu *))); - connect(menuList, SIGNAL(gotFocus(struct menu *)), + connect(configList, SIGNAL(gotFocus(void)), + SLOT(listFocusChanged(void))); + connect(menuList, SIGNAL(gotFocus(void)), SLOT(listFocusChanged(void))); - connect(helpText, SIGNAL(menuSelected(struct menu *)), - SLOT(setMenuLink(struct menu *))); - QString listMode = configSettings->readEntry("/listMode", "symbol"); +#if QT_VERSION >= 300 + QString listMode = configSettings->readEntry("/kconfig/qconf/listMode", "symbol"); if (listMode == "single") showSingleView(); else if (listMode == "full") @@ -1416,13 +964,162 @@ ConfigMainWindow::ConfigMainWindow(void) showSplitView(); // UI setup done, restore splitter positions - QValueList sizes = configSettings->readSizes("/split1", &ok); + QValueList sizes = configSettings->readSizes("/kconfig/qconf/split1", &ok); if (ok) split1->setSizes(sizes); - sizes = configSettings->readSizes("/split2", &ok); + sizes = configSettings->readSizes("/kconfig/qconf/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) @@ -1450,73 +1147,21 @@ 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::setMenuLink(struct menu *menu) +void ConfigMainWindow::listFocusChanged(void) { - 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); + if (menuList->hasFocus()) { + if (menuList->mode == menuMode) configList->clearSelection(); - 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; + setHelp(menuList->selectedItem()); + } else if (configList->hasFocus()) { + setHelp(configList->selectedItem()); } - - 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) @@ -1578,6 +1223,53 @@ 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 @@ -1632,10 +1324,17 @@ void ConfigMainWindow::showAbout(void) void ConfigMainWindow::saveSettings(void) { - configSettings->writeEntry("/window x", pos().x()); - configSettings->writeEntry("/window y", pos().y()); - configSettings->writeEntry("/window width", size().width()); - configSettings->writeEntry("/window height", size().height()); +#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); QString entry; switch(configList->mode) { @@ -1651,10 +1350,13 @@ void ConfigMainWindow::saveSettings(void) entry = "full"; break; } - configSettings->writeEntry("/listMode", entry); + configSettings->writeEntry("/kconfig/qconf/listMode", entry); - configSettings->writeSizes("/split1", split1->sizes()); - configSettings->writeSizes("/split2", split2->sizes()); + configSettings->writeSizes("/kconfig/qconf/split1", split1->sizes()); + configSettings->writeSizes("/kconfig/qconf/split2", split2->sizes()); + + delete configSettings; +#endif } void fixup_rootmenu(struct menu *menu) @@ -1712,19 +1414,13 @@ int main(int ac, char** av) conf_read(NULL); //zconfdump(stdout); - configSettings = new ConfigSettings(); - configSettings->beginGroup("/kconfig/qconf"); v = new ConfigMainWindow(); //zconfdump(stdout); - configApp->setMainWidget(v); + v->show(); 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 6a9e3b14c..e52f3e90b 100644 --- a/scripts/kconfig/qconf.h +++ b/scripts/kconfig/qconf.h @@ -7,25 +7,9 @@ #if QT_VERSION >= 300 #include #else -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; } -}; +class QSettings { }; #endif -class ConfigView; class ConfigList; class ConfigItem; class ConfigLineEdit; @@ -34,38 +18,64 @@ 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, listMode + singleMode, menuMode, symbolMode, fullMode }; class ConfigList : public QListView { Q_OBJECT typedef class QListView Parent; public: - ConfigList(ConfigView* p, const char *name = 0); + ConfigList(ConfigView* p, ConfigMainWindow* cview, ConfigSettings *configSettings); 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); @@ -73,12 +83,10 @@ 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(struct menu *); + void gotFocus(void); public: void updateListAll(void) @@ -129,7 +137,6 @@ public: struct menu *rootEntry; QColorGroup disabledColorGroup; QColorGroup inactivedColorGroup; - QPopupMenu* headerPopup; private: int colMap[colNr]; @@ -201,7 +208,9 @@ class ConfigLineEdit : public QLineEdit { Q_OBJECT typedef class QLineEdit Parent; public: - ConfigLineEdit(ConfigView* parent); + ConfigLineEdit(ConfigView* parent) + : Parent(parent) + { } ConfigView* parent(void) const { return (ConfigView*)Parent::parent(); @@ -213,104 +222,26 @@ 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); @@ -318,14 +249,15 @@ public slots: protected: void closeEvent(QCloseEvent *e); - ConfigSearchWindow *searchWindow; ConfigView *menuView; ConfigList *menuList; ConfigView *configView; ConfigList *configList; - ConfigInfoView *helpText; + QTextView *helpText; QToolBar *toolBar; QAction *backAction; QSplitter* split1; QSplitter* split2; + + bool showDebug; }; diff --git a/scripts/kconfig/symbol.c b/scripts/kconfig/symbol.c index ee225ced2..3d7877afc 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_CONST|SYMBOL_VALID, + .flags = SYMBOL_YES|SYMBOL_VALID, }, symbol_mod = { .name = "m", .curr = { "m", mod }, - .flags = SYMBOL_CONST|SYMBOL_VALID, + .flags = SYMBOL_MOD|SYMBOL_VALID, }, symbol_no = { .name = "n", .curr = { "n", no }, - .flags = SYMBOL_CONST|SYMBOL_VALID, + .flags = SYMBOL_NO|SYMBOL_VALID, }, symbol_empty = { .name = "", .curr = { "", no }, @@ -31,7 +31,6 @@ struct symbol symbol_yes = { }; int sym_change_count; -struct symbol *sym_defconfig_list; struct symbol *modules_sym; tristate modules_val; @@ -228,7 +227,7 @@ static struct symbol *sym_calc_choice(struct symbol *sym) struct expr *e; /* is the user choice visible? */ - def_sym = sym->def[S_DEF_USER].val; + def_sym = sym->user.val; if (def_sym) { sym_calc_visibility(def_sym); if (def_sym->visible != no) @@ -307,7 +306,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->def[S_DEF_USER].tri; + newval.tri = sym->user.tri; else if (!sym_is_choice(sym)) { prop = sym_get_default_prop(sym); if (prop) @@ -330,7 +329,7 @@ void sym_calc_value(struct symbol *sym) if (sym->visible != no) { sym->flags |= SYMBOL_WRITE; if (sym_has_value(sym)) { - newval.val = sym->def[S_DEF_USER].val; + newval.val = sym->user.val; break; } } @@ -353,13 +352,10 @@ 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) { - sym_set_all_changed(); - modules_val = modules_sym->curr.tri; - } - } + if (modules_sym == sym) + modules_val = modules_sym->curr.tri; if (sym_is_choice(sym)) { int flags = sym->flags & (SYMBOL_CHANGED | SYMBOL_WRITE); @@ -430,8 +426,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_DEF_USER)) { - sym->flags |= SYMBOL_DEF_USER; + if (sym->flags & SYMBOL_NEW) { + sym->flags &= ~SYMBOL_NEW; sym_set_changed(sym); } /* @@ -443,18 +439,21 @@ bool sym_set_tristate_value(struct symbol *sym, tristate val) struct property *prop; struct expr *e; - cs->def[S_DEF_USER].val = sym; - cs->flags |= SYMBOL_DEF_USER; + cs->user.val = sym; + cs->flags &= ~SYMBOL_NEW; 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_DEF_USER; + e->right.sym->flags &= ~SYMBOL_NEW; } } - sym->def[S_DEF_USER].tri = val; - if (oldval != val) + sym->user.tri = val; + if (oldval != val) { sym_clear_all_valid(); + if (sym == modules_sym) + sym_set_all_changed(); + } return true; } @@ -592,20 +591,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_DEF_USER)) { - sym->flags |= SYMBOL_DEF_USER; + if (sym->flags & SYMBOL_NEW) { + sym->flags &= ~SYMBOL_NEW; sym_set_changed(sym); } - oldval = sym->def[S_DEF_USER].val; + oldval = sym->user.val; size = strlen(newval) + 1; if (sym->type == S_HEX && (newval[0] != '0' || (newval[1] != 'x' && newval[1] != 'X'))) { size += 2; - sym->def[S_DEF_USER].val = val = malloc(size); + sym->user.val = val = malloc(size); *val++ = '0'; *val++ = 'x'; } else if (!oldval || strcmp(oldval, newval)) - sym->def[S_DEF_USER].val = val = malloc(size); + sym->user.val = val = malloc(size); else return true; @@ -680,6 +679,7 @@ 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 e3f28b9d5..656d2c87d 100644 --- a/scripts/kconfig/util.c +++ b/scripts/kconfig/util.c @@ -44,9 +44,7 @@ int file_write_dep(const char *name) else fprintf(out, "\t%s\n", file->name); } - fprintf(out, "\ninclude/config/auto.conf: \\\n" - "\t$(deps_config)\n\n" - "$(deps_config): ;\n"); + fprintf(out, "\n.config include/linux/autoconf.h: $(deps_config)\n\n$(deps_config):\n"); fclose(out); rename("..config.tmp", name); return 0; diff --git a/scripts/kconfig/zconf.gperf b/scripts/kconfig/zconf.gperf index 9b44c80dd..b03220600 100644 --- a/scripts/kconfig/zconf.gperf +++ b/scripts/kconfig/zconf.gperf @@ -39,8 +39,5 @@ 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 47c8b5bab..345f0fc07 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, 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, 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, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, @@ -88,75 +88,69 @@ kconf_id_hash (register const char *str, register unsigned int len) struct kconf_id_strings_t { - 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_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_str10[sizeof("range")]; - 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_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_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_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")]; + char kconf_id_strings_str41[sizeof("choice")]; + char kconf_id_strings_str46[sizeof("prompt")]; }; static struct kconf_id_strings_t kconf_id_strings_contents = { - "on", + "if", + "int", + "help", + "endif", + "select", + "endmenu", + "tristate", + "endchoice", + "range", "string", "default", "def_bool", - "range", + "menu", "def_boolean", "def_tristate", + "mainmenu", + "menuconfig", + "config", + "on", "hex", - "defconfig_list", - "option", - "if", + "source", + "depends", "optional", - "endif", - "choice", - "endmenu", + "enable", + "comment", "requires", - "endchoice", - "config", - "modules", - "int", - "menu", - "prompt", - "depends", - "tristate", "bool", - "menuconfig", - "select", "boolean", - "help", - "source", - "comment", - "mainmenu", - "enable" + "choice", + "prompt" }; #define kconf_id_strings ((const char *) &kconf_id_strings_contents) #ifdef __GNUC__ @@ -167,9 +161,9 @@ kconf_id_lookup (register const char *str, register unsigned int len) { enum { - TOTAL_KEYWORDS = 33, + TOTAL_KEYWORDS = 30, MIN_WORD_LENGTH = 2, - MAX_WORD_LENGTH = 14, + MAX_WORD_LENGTH = 12, MIN_HASH_VALUE = 2, MAX_HASH_VALUE = 46 }; @@ -177,48 +171,43 @@ 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_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_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_str10, T_RANGE, 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_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}, + {(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}, {-1}, - {(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}, + {(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}, {-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_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_str34, T_TYPE, TF_COMMAND, S_BOOLEAN}, - {(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}, - {(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} + {(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} }; 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 2fb0a4fc6..ea7755da8 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.1. */ +/* A Bison parser, made by GNU Bison 2.0. */ /* Skeleton parser for Yacc-like parsing with Bison, - Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. + Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004 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., 51 Franklin Street, Fifth Floor, - Boston, MA 02110-1301, USA. */ + Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, 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,9 +36,6 @@ /* Identify Bison output. */ #define YYBISON 1 -/* Bison version. */ -#define YYBISON_VERSION "2.1" - /* Skeleton name. */ #define YYSKELETON_NAME "yacc.c" @@ -85,21 +82,19 @@ T_DEFAULT = 276, T_SELECT = 277, T_RANGE = 278, - 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 + 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 }; #endif -/* Tokens. */ #define T_MAINMENU 258 #define T_MENU 259 #define T_ENDMENU 260 @@ -121,18 +116,17 @@ #define T_DEFAULT 276 #define T_SELECT 277 #define T_RANGE 278 -#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 +#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 @@ -193,11 +187,6 @@ 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 { @@ -208,7 +197,7 @@ typedef union YYSTYPE { struct menu *menu; struct kconf_id *id; } YYSTYPE; -/* Line 196 of yacc.c. */ +/* Line 190 of yacc.c. */ # define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 @@ -220,36 +209,17 @@ typedef union YYSTYPE { /* Copy the second part of user declarations. */ -/* Line 219 of yacc.c. */ +/* Line 213 of yacc.c. */ -#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 +#if ! defined (yyoverflow) || YYERROR_VERBOSE -#ifndef YY_ -# if YYENABLE_NLS -# if ENABLE_NLS -# include /* INFRINGES ON USER NAME SPACE */ -# define YY_(msgid) dgettext ("bison-runtime", msgid) -# endif +# ifndef YYFREE +# define YYFREE free # endif -# ifndef YY_ -# define YY_(msgid) msgid +# ifndef YYMALLOC +# define YYMALLOC malloc # endif -#endif - -#if ! defined (yyoverflow) || YYERROR_VERBOSE /* The parser invokes alloca or malloc; define the necessary symbols. */ @@ -259,10 +229,6 @@ 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 @@ -270,39 +236,13 @@ typedef union YYSTYPE { # ifdef YYSTACK_ALLOC /* Pacify GCC's `empty if-body' warning. */ # define YYSTACK_FREE(Ptr) do { /* empty */; } while (0) -# 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 +# if defined (__STDC__) || defined (__cplusplus) +# include /* INFRINGES ON USER NAME SPACE */ +# define YYSIZE_T size_t +# endif # 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 */ @@ -337,7 +277,7 @@ union yyalloc # define YYCOPY(To, From, Count) \ do \ { \ - YYSIZE_T yyi; \ + register YYSIZE_T yyi; \ for (yyi = 0; yyi < (Count); yyi++) \ (To)[yyi] = (From)[yyi]; \ } \ @@ -372,22 +312,22 @@ union yyalloc /* YYFINAL -- State number of the termination state. */ #define YYFINAL 3 /* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 275 +#define YYLAST 264 /* YYNTOKENS -- Number of terminals. */ -#define YYNTOKENS 36 +#define YYNTOKENS 35 /* YYNNTS -- Number of nonterminals. */ -#define YYNNTS 45 +#define YYNNTS 42 /* YYNRULES -- Number of rules. */ -#define YYNRULES 110 +#define YYNRULES 104 /* YYNRULES -- Number of states. */ -#define YYNSTATES 183 +#define YYNSTATES 175 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ #define YYUNDEFTOK 2 -#define YYMAXUTOK 290 +#define YYMAXUTOK 289 -#define YYTRANSLATE(YYX) \ +#define YYTRANSLATE(YYX) \ ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) /* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ @@ -421,8 +361,7 @@ 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, - 35 + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34 }; #if YYDEBUG @@ -433,75 +372,72 @@ 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, 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 + 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 }; /* YYRHS -- A `-1'-separated list of the rules' RHS. */ static const yysigned_char yyrhs[] = { - 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, + 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, -1, 20, -1, 22, -1, 18, -1, 23, -1, 21, - -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 + -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 }; /* YYRLINE[YYN] -- source line where rule number YYN was defined. */ static const unsigned short int yyrline[] = { - 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 + 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 }; #endif -#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE -/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. +#if YYDEBUG || YYERROR_VERBOSE +/* YYTNME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. First, the terminals, then, starting at YYNTOKENS, nonterminals. */ static const char *const yytname[] = { @@ -509,18 +445,17 @@ 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_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", + "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", "menuconfig_entry_start", "menuconfig_stmt", "config_option_list", - "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 + "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 }; #endif @@ -532,25 +467,24 @@ 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, 290 + 285, 286, 287, 288, 289 }; # endif /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ static const unsigned char yyr1[] = { - 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 + 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 }; /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ @@ -559,15 +493,14 @@ 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, 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 + 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 }; /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state @@ -578,164 +511,175 @@ 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, 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 + 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 }; /* YYDEFGOTO[NTERM-NUM]. */ static const short int yydefgoto[] = { - -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 + -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 }; /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing STATE-NUM. */ -#define YYPACT_NINF -135 +#define YYPACT_NINF -78 static const short int yypact[] = { - -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 + -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 }; /* YYPGOTO[NTERM-NUM]. */ static const short int yypgoto[] = { - -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 + -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 }; /* 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 -82 +#define YYTABLE_NINF -76 static const short int yytable[] = { - 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 + 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 }; static const short int yycheck[] = { - 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 + 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 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing symbol of state STATE-NUM. */ static const unsigned char yystos[] = { - 0, 37, 38, 0, 1, 3, 4, 5, 6, 7, + 0, 36, 37, 0, 1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 14, 15, 16, 18, 19, 20, - 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 + 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 }; +#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) @@ -765,8 +709,8 @@ do \ goto yybackup; \ } \ else \ - { \ - yyerror (YY_("syntax error: cannot back up")); \ + { \ + yyerror ("syntax error: cannot back up");\ YYERROR; \ } \ while (0) @@ -845,7 +789,7 @@ do { \ if (yydebug) \ { \ YYFPRINTF (stderr, "%s ", Title); \ - yysymprint (stderr, \ + yysymprint (stderr, \ Type, Value); \ YYFPRINTF (stderr, "\n"); \ } \ @@ -893,13 +837,13 @@ yy_reduce_print (yyrule) #endif { int yyi; - unsigned long int yylno = yyrline[yyrule]; - YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu), ", + unsigned int yylno = yyrline[yyrule]; + YYFPRINTF (stderr, "Reducing stack by rule %d (line %u), ", 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) \ @@ -928,7 +872,7 @@ int yydebug; if the built-in stack extension method is used). Do not make this value too large; the results are undefined if - YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) + SIZE_MAX < YYSTACK_BYTES (YYMAXDEPTH) evaluated with infinite-precision integer arithmetic. */ #ifndef YYMAXDEPTH @@ -952,7 +896,7 @@ yystrlen (yystr) const char *yystr; # endif { - const char *yys = yystr; + register const char *yys = yystr; while (*yys++ != '\0') continue; @@ -977,8 +921,8 @@ yystpcpy (yydest, yysrc) const char *yysrc; # endif { - char *yyd = yydest; - const char *yys = yysrc; + register char *yyd = yydest; + register const char *yys = yysrc; while ((*yyd++ = *yys++) != '\0') continue; @@ -988,55 +932,7 @@ yystpcpy (yydest, yysrc) # endif # endif -# 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 */ +#endif /* !YYERROR_VERBOSE */ @@ -1102,7 +998,7 @@ yydestruct (yymsg, yytype, yyvaluep) switch (yytype) { - case 52: /* "choice_entry" */ + case 48: /* choice_entry */ { fprintf(stderr, "%s:%d: missing end statement for this entry\n", @@ -1112,7 +1008,7 @@ yydestruct (yymsg, yytype, yyvaluep) }; break; - case 58: /* "if_entry" */ + case 54: /* if_entry */ { fprintf(stderr, "%s:%d: missing end statement for this entry\n", @@ -1122,7 +1018,7 @@ yydestruct (yymsg, yytype, yyvaluep) }; break; - case 63: /* "menu_entry" */ + case 59: /* menu_entry */ { fprintf(stderr, "%s:%d: missing end statement for this entry\n", @@ -1186,13 +1082,13 @@ yyparse (void) #else int yyparse () - ; + #endif #endif { - int yystate; - int yyn; + register int yystate; + register int yyn; int yyresult; /* Number of tokens to shift before error messages enabled. */ int yyerrstatus; @@ -1210,12 +1106,12 @@ yyparse () /* The state stack. */ short int yyssa[YYINITDEPTH]; short int *yyss = yyssa; - short int *yyssp; + register short int *yyssp; /* The semantic value stack. */ YYSTYPE yyvsa[YYINITDEPTH]; YYSTYPE *yyvs = yyvsa; - YYSTYPE *yyvsp; + register YYSTYPE *yyvsp; @@ -1247,6 +1143,9 @@ yyparse () yyssp = yyss; yyvsp = yyvs; + + yyvsp[0] = yylval; + goto yysetstate; /*------------------------------------------------------------. @@ -1279,7 +1178,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 (YY_("memory exhausted"), + yyoverflow ("parser stack overflow", &yyss1, yysize * sizeof (*yyssp), &yyvs1, yysize * sizeof (*yyvsp), @@ -1290,11 +1189,11 @@ yyparse () } #else /* no yyoverflow */ # ifndef YYSTACK_RELOCATE - goto yyexhaustedlab; + goto yyoverflowlab; # else /* Extend the stack our own way. */ if (YYMAXDEPTH <= yystacksize) - goto yyexhaustedlab; + goto yyoverflowlab; yystacksize *= 2; if (YYMAXDEPTH < yystacksize) yystacksize = YYMAXDEPTH; @@ -1304,7 +1203,7 @@ yyparse () union yyalloc *yyptr = (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); if (! yyptr) - goto yyexhaustedlab; + goto yyoverflowlab; YYSTACK_RELOCATE (yyss); YYSTACK_RELOCATE (yyvs); @@ -1504,7 +1403,7 @@ yyreduce: ;} break; - case 38: + case 37: { menu_set_type((yyvsp[-2].id)->stype); @@ -1514,7 +1413,7 @@ yyreduce: ;} break; - case 39: + case 38: { menu_add_prompt(P_PROMPT, (yyvsp[-2].string), (yyvsp[-1].expr)); @@ -1522,7 +1421,7 @@ yyreduce: ;} break; - case 40: + case 39: { menu_add_expr(P_DEFAULT, (yyvsp[-2].expr), (yyvsp[-1].expr)); @@ -1534,7 +1433,7 @@ yyreduce: ;} break; - case 41: + case 40: { menu_add_symbol(P_SELECT, sym_lookup((yyvsp[-2].string), 0), (yyvsp[-1].expr)); @@ -1542,7 +1441,7 @@ yyreduce: ;} break; - case 42: + case 41: { menu_add_expr(P_RANGE, expr_alloc_comp(E_RANGE,(yyvsp[-3].symbol), (yyvsp[-2].symbol)), (yyvsp[-1].expr)); @@ -1550,29 +1449,7 @@ yyreduce: ;} break; - 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: + case 42: { struct symbol *sym = sym_lookup(NULL, 0); @@ -1583,14 +1460,14 @@ yyreduce: ;} break; - case 49: + case 43: { (yyval.menu) = menu_add_menu(); ;} break; - case 50: + case 44: { if (zconf_endtoken((yyvsp[0].id), T_CHOICE, T_ENDCHOICE)) { @@ -1600,7 +1477,7 @@ yyreduce: ;} break; - case 58: + case 52: { menu_add_prompt(P_PROMPT, (yyvsp[-2].string), (yyvsp[-1].expr)); @@ -1608,7 +1485,7 @@ yyreduce: ;} break; - case 59: + case 53: { if ((yyvsp[-2].id)->stype == S_BOOLEAN || (yyvsp[-2].id)->stype == S_TRISTATE) { @@ -1621,7 +1498,7 @@ yyreduce: ;} break; - case 60: + case 54: { current_entry->sym->flags |= SYMBOL_OPTIONAL; @@ -1629,7 +1506,7 @@ yyreduce: ;} break; - case 61: + case 55: { if ((yyvsp[-3].id)->stype == S_UNKNOWN) { @@ -1641,7 +1518,7 @@ yyreduce: ;} break; - case 64: + case 58: { printd(DEBUG_PARSE, "%s:%d:if\n", zconf_curname(), zconf_lineno()); @@ -1651,7 +1528,7 @@ yyreduce: ;} break; - case 65: + case 59: { if (zconf_endtoken((yyvsp[0].id), T_IF, T_ENDIF)) { @@ -1661,7 +1538,7 @@ yyreduce: ;} break; - case 71: + case 65: { menu_add_entry(NULL); @@ -1670,14 +1547,14 @@ yyreduce: ;} break; - case 72: + case 66: { (yyval.menu) = menu_add_menu(); ;} break; - case 73: + case 67: { if (zconf_endtoken((yyvsp[0].id), T_MENU, T_ENDMENU)) { @@ -1687,7 +1564,7 @@ yyreduce: ;} break; - case 79: + case 73: { printd(DEBUG_PARSE, "%s:%d:source %s\n", zconf_curname(), zconf_lineno(), (yyvsp[-1].string)); @@ -1695,7 +1572,7 @@ yyreduce: ;} break; - case 80: + case 74: { menu_add_entry(NULL); @@ -1704,14 +1581,14 @@ yyreduce: ;} break; - case 81: + case 75: { menu_end_entry(); ;} break; - case 82: + case 76: { printd(DEBUG_PARSE, "%s:%d:help\n", zconf_curname(), zconf_lineno()); @@ -1719,14 +1596,14 @@ yyreduce: ;} break; - case 83: + case 77: { current_entry->sym->help = (yyvsp[0].string); ;} break; - case 88: + case 82: { menu_add_dep((yyvsp[-1].expr)); @@ -1734,7 +1611,7 @@ yyreduce: ;} break; - case 89: + case 83: { menu_add_dep((yyvsp[-1].expr)); @@ -1742,7 +1619,7 @@ yyreduce: ;} break; - case 90: + case 84: { menu_add_dep((yyvsp[-1].expr)); @@ -1750,88 +1627,87 @@ yyreduce: ;} break; - case 92: + case 86: { menu_add_prompt(P_PROMPT, (yyvsp[-1].string), (yyvsp[0].expr)); ;} break; - case 95: + case 89: { (yyval.id) = (yyvsp[-1].id); ;} break; - case 96: + case 90: { (yyval.id) = (yyvsp[-1].id); ;} break; - case 97: + case 91: { (yyval.id) = (yyvsp[-1].id); ;} break; - case 100: + case 94: { (yyval.expr) = NULL; ;} break; - case 101: + case 95: { (yyval.expr) = (yyvsp[0].expr); ;} break; - case 102: + case 96: { (yyval.expr) = expr_alloc_symbol((yyvsp[0].symbol)); ;} break; - case 103: + case 97: { (yyval.expr) = expr_alloc_comp(E_EQUAL, (yyvsp[-2].symbol), (yyvsp[0].symbol)); ;} break; - case 104: + case 98: { (yyval.expr) = expr_alloc_comp(E_UNEQUAL, (yyvsp[-2].symbol), (yyvsp[0].symbol)); ;} break; - case 105: + case 99: { (yyval.expr) = (yyvsp[-1].expr); ;} break; - case 106: + case 100: { (yyval.expr) = expr_alloc_one(E_NOT, (yyvsp[0].expr)); ;} break; - case 107: + case 101: { (yyval.expr) = expr_alloc_two(E_OR, (yyvsp[-2].expr), (yyvsp[0].expr)); ;} break; - case 108: + case 102: { (yyval.expr) = expr_alloc_two(E_AND, (yyvsp[-2].expr), (yyvsp[0].expr)); ;} break; - case 109: + case 103: { (yyval.symbol) = sym_lookup((yyvsp[0].string), 0); free((yyvsp[0].string)); ;} break; - case 110: + case 104: { (yyval.symbol) = sym_lookup((yyvsp[0].string), 1); free((yyvsp[0].string)); ;} break; - default: break; } -/* Line 1126 of yacc.c. */ +/* Line 1037 of yacc.c. */ yyvsp -= yylen; @@ -1871,36 +1747,12 @@ yyerrlab: if (YYPACT_NINF < yyn && yyn < YYLAST) { + YYSIZE_T yysize = 0; int yytype = YYTRANSLATE (yychar); - 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]; + const char* yyprefix; + char *yymsg; 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; @@ -1908,68 +1760,48 @@ yyerrlab: /* Stay within bounds of both yycheck and yytname. */ int yychecklim = YYLAST - yyn; int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; - int yycount = 1; - - yyarg[0] = yytname[yytype]; - yyfmt = yystpcpy (yyformat, yyunexpected); + int yycount = 0; + yyprefix = ", expecting "; for (yyx = yyxbegin; yyx < yyxend; ++yyx) if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) { - if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) + yysize += yystrlen (yyprefix) + yystrlen (yytname [yyx]); + yycount += 1; + if (yycount == 5) { - yycount = 1; - yysize = yysize0; - yyformat[sizeof yyunexpected - 1] = '\0'; + yysize = 0; break; } - yyarg[yycount++] = yytname[yyx]; - yysize1 = yysize + yytnamerr (0, yytname[yyx]); - yysize_overflow |= yysize1 < yysize; - yysize = yysize1; - yyfmt = yystpcpy (yyfmt, yyprefix); - yyprefix = yyor; } - - 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) + yysize += (sizeof ("syntax error, unexpected ") + + yystrlen (yytname[yytype])); + yymsg = (char *) YYSTACK_ALLOC (yysize); + if (yymsg != 0) { - /* 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)) + char *yyp = yystpcpy (yymsg, "syntax error, unexpected "); + yyp = yystpcpy (yyp, yytname[yytype]); + + if (yycount < 5) { - if (*yyp == '%' && yyf[1] == 's' && yyi < yycount) - { - yyp += yytnamerr (yyp, yyarg[yyi++]); - yyf += 2; - } - else - { - 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 "; + } } yyerror (yymsg); YYSTACK_FREE (yymsg); } else - { - yyerror (YY_("syntax error")); - goto yyexhaustedlab; - } + yyerror ("syntax error; also virtual memory exhausted"); } else #endif /* YYERROR_VERBOSE */ - yyerror (YY_("syntax error")); + yyerror ("syntax error"); } @@ -1981,9 +1813,18 @@ yyerrlab: if (yychar <= YYEOF) { - /* Return failure if at end of input. */ + /* If at end of input, pop the error token, + then the rest of the stack, then return failure. */ if (yychar == YYEOF) - YYABORT; + for (;;) + { + + YYPOPSTACK; + if (yyssp == yyss) + YYABORT; + yydestruct ("Error: popping", + yystos[*yyssp], yyvsp); + } } else { @@ -2002,11 +1843,12 @@ yyerrlab: `---------------------------------------------------*/ yyerrorlab: - /* Pacify compilers like GCC when the user code never invokes - YYERROR and the label yyerrorlab therefore never appears in user - code. */ +#ifdef __GNUC__ + /* Pacify 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; @@ -2069,29 +1911,23 @@ yyacceptlab: | yyabortlab -- YYABORT comes here. | `-----------------------------------*/ yyabortlab: + yydestruct ("Error: discarding lookahead", + yytoken, &yylval); + yychar = YYEMPTY; yyresult = 1; goto yyreturn; #ifndef yyoverflow -/*-------------------------------------------------. -| yyexhaustedlab -- memory exhaustion comes here. | -`-------------------------------------------------*/ -yyexhaustedlab: - yyerror (YY_("memory exhausted")); +/*----------------------------------------------. +| yyoverflowlab -- parser overflow comes here. | +`----------------------------------------------*/ +yyoverflowlab: + yyerror ("parser stack overflow"); 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); @@ -2112,9 +1948,7 @@ void conf_parse(const char *name) sym_init(); menu_init(); - modules_sym = sym_lookup(NULL, 0); - modules_sym->type = S_BOOLEAN; - modules_sym->flags |= SYMBOL_AUTO; + modules_sym = sym_lookup("MODULES", 0); rootmenu.prompt = menu_add_prompt(P_MENU, "Linux Kernel Configuration", NULL); #if YYDEBUG @@ -2124,12 +1958,6 @@ 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 ab44feb3c..1f61fba6a 100644 --- a/scripts/kconfig/zconf.y +++ b/scripts/kconfig/zconf.y @@ -71,7 +71,6 @@ 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 @@ -92,7 +91,6 @@ static struct menu *current_menu, *current_entry; %type end %type option_name %type